ZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmctZm9ybWF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZWI3NzMKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEsNCBAQAorQmFzZWRPblN0eWxlOiBHb29nbGUKK1NvcnRJbmNsdWRlczogZmFsc2UKKyMgRG8gbm90IHJlZm9ybWF0IHRoZSBEb3h5Z2VuLXN0eWxlIGNvbW1lbnRzIGluIHRoZSBjb2RlCitDb21tZW50UHJhZ21hcyA6ICJeICogXFxcXCIKZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmluZGV4IDEzZjg3YzguLjUwY2MwOTIgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQuYnAKKysrIGIvQW5kcm9pZC5icApAQCAtMTEsMTYgKzExLDIyIEBACiAgICAgICAgICJsaWJNcGVnVFBFbmMvc3JjLyouY3BwIiwKICAgICAgICAgImxpYlNCUmRlYy9zcmMvKi5jcHAiLAogICAgICAgICAibGliU0JSZW5jL3NyYy8qLmNwcCIsCisgICAgICAgICJsaWJBcml0aENvZGluZy9zcmMvKi5jcHAiLAorICAgICAgICAibGliRFJDZGVjL3NyYy8qLmNwcCIsCisgICAgICAgICJsaWJTQUNkZWMvc3JjLyouY3BwIiwKKyAgICAgICAgImxpYlNBQ2VuYy9zcmMvKi5jcHAiLAogICAgIF0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1Xbm8tY29uc3RhbnQtY29udmVyc2lvbiIsCi0gICAgICAgICItV25vLXNlcXVlbmNlLXBvaW50IiwKLSAgICAgICAgIi1Xbm8tZXh0cmEiLAorICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKICAgICAgICAgIi1Xbm8tI3dhcm5pbmdzIiwKLSAgICAgICAgIi1Xbm8tY29uc3RhbnQtbG9naWNhbC1vcGVyYW5kIiwKKyAgICAgICAgIi1XdW5pbml0aWFsaXplZCIsCiAgICAgICAgICItV25vLXNlbGYtYXNzaWduIiwKICAgICBdLAorICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOlsidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyJdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJsaWJBQUNkZWMvaW5jbHVkZSIsCiAgICAgICAgICJsaWJBQUNlbmMvaW5jbHVkZSIsCkBAIC0zMSw1ICszNyw5IEBACiAgICAgICAgICJsaWJNcGVnVFBFbmMvaW5jbHVkZSIsCiAgICAgICAgICJsaWJTQlJkZWMvaW5jbHVkZSIsCiAgICAgICAgICJsaWJTQlJlbmMvaW5jbHVkZSIsCisgICAgICAgICJsaWJBcml0aENvZGluZy9pbmNsdWRlIiwKKyAgICAgICAgImxpYkRSQ2RlYy9pbmNsdWRlIiwKKyAgICAgICAgImxpYlNBQ2RlYy9pbmNsdWRlIiwKKyAgICAgICAgImxpYlNBQ2VuYy9pbmNsdWRlIiwKICAgICBdLAogfQpkaWZmIC0tZ2l0IGEvTk9USUNFIGIvTk9USUNFCmluZGV4IGIzNDg4Y2MuLjA1YjMyYmQgMTAwNjQ0Ci0tLSBhL05PVElDRQorKysgYi9OT1RJQ0UKQEAgLTEsNzIgKzEsODQgQEAKIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi3CqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEyIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKLTEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9hYWNEZWNvZGVyLnBkZiBiL2RvY3VtZW50YXRpb24vYWFjRGVjb2Rlci5wZGYKaW5kZXggNDU4ZmRhMS4uMWRlYzMzNCAxMDA2NDQKLS0tIGEvZG9jdW1lbnRhdGlvbi9hYWNEZWNvZGVyLnBkZgorKysgYi9kb2N1bWVudGF0aW9uL2FhY0RlY29kZXIucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vYWFjRW5jb2Rlci5wZGYgYi9kb2N1bWVudGF0aW9uL2FhY0VuY29kZXIucGRmCmluZGV4IGVmYjE4NTguLmU0MzhlMjcgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vYWFjRW5jb2Rlci5wZGYKKysrIGIvZG9jdW1lbnRhdGlvbi9hYWNFbmNvZGVyLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvaW5jbHVkZS9hYWNkZWNvZGVyX2xpYi5oIGIvbGliQUFDZGVjL2luY2x1ZGUvYWFjZGVjb2Rlcl9saWIuaAppbmRleCA3YWI2MGYxLi4zYTliOTEwIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvaW5jbHVkZS9hYWNkZWNvZGVyX2xpYi5oCisrKyBiL2xpYkFBQ2RlYy9pbmNsdWRlL2FhY2RlY29kZXJfbGliLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTMgKzkwLDE4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBQUNERUNPREVSX0xJQl9ICisjZGVmaW5lIEFBQ0RFQ09ERVJfTElCX0gKIAogLyoqCiAgKiBcZmlsZSAgIGFhY2RlY29kZXJfbGliLmgKQEAgLTk0LDE2NiArMTEwLDI2MSBAQAogCiBccGFnZSBJTlRSTyBJbnRyb2R1Y3Rpb24KIAorCiBcc2VjdGlvbiBTQ09QRSBTY29wZQogCi1UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgaGlnaC1sZXZlbCBpbnRlcmZhY2UgYW5kIHVzYWdlIG9mIHRoZSBJU08vTVBFRy0yLzQgQUFDIERlY29kZXIKLWxpYnJhcnkgZGV2ZWxvcGVkIGJ5IHRoZSBGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyAoSUlTKS4KLURlcGVuZGluZyBvbiB0aGUgbGlicmFyeSBjb25maWd1cmF0aW9uLCBpdCBpbXBsZW1lbnRzIGRlY29kaW5nIG9mIEFBQy1MQyAoTG93LUNvbXBsZXhpdHkpLAotSEUtQUFDIChIaWdoLUVmZmljaWVuY3kgQUFDLCB2MSBhbmQgdjIpLCBBQUMtTEQgKExvdy1EZWxheSkgYW5kIEFBQy1FTEQgKEVuaGFuY2VkIExvdy1EZWxheSkuCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgaGlnaC1sZXZlbCBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgYW5kIHVzYWdlIG9mIHRoZQorSVNPL01QRUctMi80IEFBQyBEZWNvZGVyIGxpYnJhcnkgZGV2ZWxvcGVkIGJ5IHRoZSBGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IKK0ludGVncmF0ZWQgQ2lyY3VpdHMgKElJUykuIERlcGVuZGluZyBvbiB0aGUgbGlicmFyeSBjb25maWd1cmF0aW9uLCBkZWNvZGluZyBvZgorQUFDLUxDIChMb3ctQ29tcGxleGl0eSksIEhFLUFBQyAoSGlnaC1FZmZpY2llbmN5IEFBQyB2MSBhbmQgdjIpLCBBQUMtTEQKKyhMb3ctRGVsYXkpIGFuZCBBQUMtRUxEIChFbmhhbmNlZCBMb3ctRGVsYXkpIGlzIGltcGxlbWVudGVkLgogCi1BbGwgcmVmZXJlbmNlcyB0byBTQlIgKFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24pIGFyZSBvbmx5IGFwcGxpY2FibGUgdG8gSEUtQUFDIGFuZCBBQUMtRUxECi12ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS4gQWxsIHJlZmVyZW5jZXMgdG8gUFMgKFBhcmFtZXRyaWMgU3RlcmVvKSBhcmUgb25seSBhcHBsaWNhYmxlIHRvCi1IRS1BQUMgdjIgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkuCitBbGwgcmVmZXJlbmNlcyB0byBTQlIgKFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24pIGFyZSBvbmx5IGFwcGxpY2FibGUgdG8gSEUtQUFDCithbmQgQUFDLUVMRCBjb25maWd1cmF0aW9ucyBvZiB0aGUgRkRLIGxpYnJhcnkuIEFsbCByZWZlcmVuY2VzIHRvIFBTIChQYXJhbWV0cmljCitTdGVyZW8pIGFyZSBvbmx5IGFwcGxpY2FibGUgdG8gSEUtQUFDIHYyIGRlY29kZXIgY29uZmlndXJhdGlvbiBvZiB0aGUgbGlicmFyeS4KIAogXHNlY3Rpb24gRGVjb2RlckJhc2ljcyBEZWNvZGVyIEJhc2ljcwogCi1UaGlzIGRvY3VtZW50IGNhbiBvbmx5IGdpdmUgYSByb3VnaCBvdmVydmlldyBhYm91dCB0aGUgSVNPL01QRUctMiBhbmQgSVNPL01QRUctNCBBQUMgYXVkaW8KLWNvZGluZyBzdGFuZGFyZC4gVG8gdW5kZXJzdGFuZCBhbGwgdGhlIHRlcm1zIGluIHRoaXMgZG9jdW1lbnQsIHlvdSBhcmUgZW5jb3VyYWdlZCB0byByZWFkCi10aGUgZm9sbG93aW5nIGRvY3VtZW50cy4KK1RoaXMgZG9jdW1lbnQgY2FuIG9ubHkgZ2l2ZSBhIHJvdWdoIG92ZXJ2aWV3IGFib3V0IHRoZSBJU08vTVBFRy0yLCBJU08vTVBFRy00CitBQUMgYXVkaW8gYW5kIE1QRUctRCBVU0FDIGNvZGluZyBzdGFuZGFyZHMuIFRvIHVuZGVyc3RhbmQgYWxsIGRldGFpbHMgcmVmZXJlbmNlZAoraW4gdGhpcyBkb2N1bWVudCwgeW91IGFyZSBlbmNvdXJhZ2VkIHRvIHJlYWQgdGhlIGZvbGxvd2luZyBkb2N1bWVudHMuCiAKLS0gSVNPL0lFQyAxMzgxOC03IChNUEVHLTIgQUFDKSwgd2hpY2ggZGVmaW5lcyB0aGUgc3ludGF4IG9mIE1QRUctMiBBQUMgYXVkaW8gYml0c3RyZWFtcy4KLS0gSVNPL0lFQyAxNDQ5Ni0zIChNUEVHLTQgQUFDLCBzdWJwYXJ0IDEgYW5kIDQpLCB3aGljaCBkZWZpbmVzIHRoZSBzeW50YXggb2YgTVBFRy00IEFBQyBhdWRpbyBiaXRzdHJlYW1zLgotLSBMdXR6a3ksIFNjaHVsbGVyLCBHYXllciwgS3ImYXVtbDttZXIsIFdhYm5paywgIkEgZ3VpZGVsaW5lIHRvIGF1ZGlvIGNvZGVjIGRlbGF5IiwgMTE2dGggQUVTIENvbnZlbnRpb24sIE1heSA4LCAyMDA0CistIElTTy9JRUMgMTM4MTgtNyAoTVBFRy0yIEFBQykgU3RhbmRhcmQsIGRlZmluZXMgdGhlIHN5bnRheCBvZiBNUEVHLTIgQUFDIGF1ZGlvCitiaXRzdHJlYW1zLgorLSBJU08vSUVDIDE0NDk2LTMgKE1QRUctNCBBQUMsIHN1YnBhcnQgMSBhbmQgNCkgU3RhbmRhcmQsIGRlZmluZXMgdGhlIHN5bnRheCBvZgorTVBFRy00IEFBQyBhdWRpbyBiaXRzdHJlYW1zLgorLSBJU08vSUVDIDIzMDAzLTMgKE1QRUctRCBVU0FDKSwgZGVmaW5lcyBNUEVHLUQgVVNBQyB1bmlmaWVkIHNwZWVjaCBhbmQgYXVkaW8KK2NvZGVjLgorLSBMdXR6a3ksIFNjaHVsbGVyLCBHYXllciwgS3ImYXVtbDttZXIsIFdhYm5paywgIkEgZ3VpZGVsaW5lIHRvIGF1ZGlvIGNvZGVjCitkZWxheSIsIDExNnRoIEFFUyBDb252ZW50aW9uLCBNYXkgOCwgMjAwNAogCi1NUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyBpcyBiYXNlZCBvbiBhIHRpbWUtdG8tZnJlcXVlbmN5IG1hcHBpbmcgb2YgdGhlIHNpZ25hbC4gVGhlIHNpZ25hbAotaXMgcGFydGl0aW9uZWQgaW50byBvdmVybGFwcGluZyBwb3J0aW9ucyBhbmQgdHJhbnNmb3JtZWQgaW50byBmcmVxdWVuY3kgZG9tYWluLiBUaGUgc3BlY3RyYWwKLWNvbXBvbmVudHMgYXJlIHRoZW4gcXVhbnRpemVkIGFuZCBjb2RlZC5cbgotQW4gTVBFRzIgb3IgTVBFRzQgQUFDIGF1ZGlvIGJpdHN0cmVhbSBpcyBjb21wb3NlZCBvZiBmcmFtZXMuIENvbnRyYXJ5IHRvIE1QRUctMS8yIExheWVyLTMgKG1wMyksCi10aGUgbGVuZ3RoIG9mIGluZGl2aWR1YWwgZnJhbWVzIGlzIG5vdCByZXN0cmljdGVkIHRvIGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzLCBidXQgY2FuIHRha2Ugb24KLWFueSBsZW5ndGggYmV0d2VlbiAxIGFuZCA3NjggYnl0ZXMuCitJbiBzaG9ydCwgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgaXMgYmFzZWQgb24gYSB0aW1lLXRvLWZyZXF1ZW5jeSBtYXBwaW5nIG9mCit0aGUgc2lnbmFsLiBUaGUgc2lnbmFsIGlzIHBhcnRpdGlvbmVkIGludG8gb3ZlcmxhcHBpbmcgdGltZSBwb3J0aW9ucyBhbmQKK3RyYW5zZm9ybWVkIGludG8gZnJlcXVlbmN5IGRvbWFpbi4gVGhlIHNwZWN0cmFsIGNvbXBvbmVudHMgYXJlIHRoZW4gcXVhbnRpemVkCithbmQgY29kZWQgdXNpbmcgYSBoaWdobHkgZWZmaWNpZW50IGNvZGluZyBzY2hlbWUuXG4gRW5jb2RlZCBNUEVHLTIgYW5kIE1QRUctNAorQUFDIGF1ZGlvIGJpdHN0cmVhbXMgYXJlIGNvbXBvc2VkIG9mIGZyYW1lcy4gQ29udHJhcnkgdG8gTVBFRy0xLzIgTGF5ZXItMyAobXAzKSwKK3RoZSBsZW5ndGggb2YgaW5kaXZpZHVhbCBmcmFtZXMgaXMgbm90IHJlc3RyaWN0ZWQgdG8gYSBmaXhlZCBudW1iZXIgb2YgYnl0ZXMsCitidXQgY2FuIHRha2UgYW55IGxlbmd0aCBiZXR3ZWVuIDEgYW5kIDc2OCBieXRlcy4KKworSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIG1lbnRpb25lZCBmcmVxdWVuY3kgZG9tYWluIGNvZGluZyBtb2RlLCBNUEVHLUQgVVNBQworYWxzbyBlbXBsb3lzIGEgdGltZSBkb21haW4gQWxnZWJyYWljIENvZGUtRXhjaXRlZCBMaW5lYXIgUHJlZGljdGlvbiAoQUNFTFApCitzcGVlY2ggY29kZXIgY29yZS4gVGhpcyBvcGVyYXRpbmcgbW9kZSBpcyBzZWxlY3RlZCBieSB0aGUgZW5jb2RlciBpbiBvcmRlciB0bworYWNoaWV2ZSB0aGUgb3B0aW11bSBhdWRpbyBxdWFsaXR5IGZvciBkaWZmZXJlbnQgY29udGVudCB0eXBlLiBTZXZlcmFsCitlbmhhbmNlbWVudHMgYWxsb3cgYWNoaWV2aW5nIGhpZ2hlciBxdWFsaXR5IGF0IGxvd2VyIGJpdCByYXRlcyBjb21wYXJlZCB0bworTVBFRy00IEhFLUFBQy4KIAogCiBccGFnZSBMSUJVU0UgTGlicmFyeSBVc2FnZQogCisKIFxzZWN0aW9uIEludGVyZmFjZURlc2NyaXRwaW9uIEFQSSBEZXNjcmlwdGlvbgogCi1BbGwgQVBJIGhlYWRlciBmaWxlcyBhcmUgbG9jYXRlZCBpbiB0aGUgZm9sZGVyIC9pbmNsdWRlIG9mIHRoZSByZWxlYXNlIHBhY2thZ2UuIFRoZXkgYXJlIGRlc2NyaWJlZCBpbgotZGV0YWlsIGluIHRoaXMgZG9jdW1lbnQuIEFsbCBoZWFkZXIgZmlsZXMgYXJlIHByb3ZpZGVkIGZvciB1c2FnZSBpbiBDL0MrKyBwcm9ncmFtcy4gVGhlIEFBQyBkZWNvZGVyIGxpYnJhcnkKLUFQSSBmdW5jdGlvbnMgYXJlIGxvY2F0ZWQgYXQgYWFjZGVjb2Rlcl9saWIuaC4KK0FsbCBBUEkgaGVhZGVyIGZpbGVzIGFyZSBsb2NhdGVkIGluIHRoZSBmb2xkZXIgL2luY2x1ZGUgb2YgdGhlIHJlbGVhc2UgcGFja2FnZS4KK1RoZSBjb250ZW50cyBvZiBlYWNoIGZpbGUgaXMgZGVzY3JpYmVkIGluIGRldGFpbCBpbiB0aGlzIGRvY3VtZW50LiBBbGwgaGVhZGVyCitmaWxlcyBhcmUgcHJvdmlkZWQgZm9yIHVzYWdlIGluIHNwZWNpZmljIEMvQysrIHByb2dyYW1zLiBUaGUgbWFpbiBBQUMgZGVjb2RlcgorbGlicmFyeSBBUEkgZnVuY3Rpb25zIGFyZSBsb2NhdGVkIGluIGFhY2RlY29kZXJfbGliLmggaGVhZGVyIGZpbGUuCiAKLUluIGJpbmFyeSByZWxlYXNlcyB0aGUgZGVjb2RlciBjb3JlIHJlc2lkZXMgaW4gc3RhdGljYWxseSBsaW5rYWJsZSBsaWJyYXJpZXMgY2FsbGVkIGZvciBleGFtcGxlIGxpYkFBQ2RlYy5hLAotKExpbnV4KSBvciBGREtfYWFjRGVjX2xpYiAoTWljcm9zb2Z0IFZpc3VhbCBDKyspLgorSW4gYmluYXJ5IHJlbGVhc2VzIHRoZSBkZWNvZGVyIGNvcmUgcmVzaWRlcyBpbiBzdGF0aWNhbGx5IGxpbmthYmxlIGxpYnJhcmllcywKK2ZvciBleGFtcGxlIGxpYkFBQ2RlYy5hLgorCiAKIFxzZWN0aW9uIENhbGxpbmdfU2VxdWVuY2UgQ2FsbGluZyBTZXF1ZW5jZQogCi1Gb3IgZGVjb2Rpbmcgb2YgSVNPL01QRUctMi80IEFBQyBvciBIRS1BQUMgdjIgYml0c3RyZWFtcyB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIGlzIG1hbmRhdG9yeS4gSW5wdXQgcmVhZAotYW5kIG91dHB1dCB3cml0ZSBmdW5jdGlvbnMgYXMgd2VsbCBhcyB0aGUgY29ycmVzcG9uZGluZyBvcGVuIGFuZCBjbG9zZSBmdW5jdGlvbnMgYXJlIGxlZnQgb3V0LCBzaW5jZSB0aGV5Ci1tYXkgYmUgaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkgYWNjb3JkaW5nIHRvIHRoZSB1c2VyJ3Mgc3BlY2lmaWMgcmVxdWlyZW1lbnRzLiBUaGUgZXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBpbgotbWFpbi5jcHAgdXNlcyBmaWxlLWJhc2VkIGlucHV0L291dHB1dCwgYW5kIGluIHN1Y2ggY2FzZSBjYWxsIG1wZWdGaWxlUmVhZF9PcGVuKCkgdG8gb3BlbiBhbiBpbnB1dCBmaWxlIGFuZAotdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcmVxdWlyZWQgc3RydWN0dXJlcywgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG1wZWdGaWxlUmVhZF9DbG9zZSgpIHRvIGNsb3NlIG9wZW5lZAotZmlsZXMgYW5kIHRvIGRlLWFsbG9jYXRlIGFzc29jaWF0ZWQgc3RydWN0dXJlcy4gbXBlZ0ZpbGVSZWFkX09wZW4oKSB0cmllcyB0byBkZXRlY3QgdGhlIGJpdHN0cmVhbSBmb3JtYXQgYW5kCi1pbiBjYXNlIG9mIE1QRUctNCBmaWxlIGZvcm1hdCBvciBSYXcgUGFja2V0cyBmaWxlIGZvcm1hdCAoYSBGcmF1bmhvZmVyIElJUyBwcm9wcmlldGFyeSBmb3JtYXQpIHJlYWRzIHRoZSBBdWRpbwotU3BlY2lmaWMgQ29uZmlnIGRhdGEgKEFTQykuIEFuIHVuc3VjY2Vzc2Z1bCBhdHRlbXB0IHRvIHJlY29nbml6ZSB0aGUgYml0c3RyZWFtIGZvcm1hdCByZXF1aXJlcyB0aGUgdXNlciB0bwotcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uIG1hbnVhbGx5LiBGb3IgYW55IG90aGVyIGJpdHN0cmVhbSBmb3JtYXRzIHRoYXQgYXJlIHVzdWFsbHkgYXBwbGljYWJsZSBpbiBzdHJlYW1pbmcKLWFwcGxpY2F0aW9ucywgdGhlIGRlY29kZXIgaXRzZWxmIHdpbGwgdHJ5IHRvIHN5bmNocm9uaXplIGFuZCBwYXJzZSB0aGUgZ2l2ZW4gYml0c3RyZWFtIGZyYWdtZW50IHVzaW5nIHRoZQotRkRLIHRyYW5zcG9ydCBsaWJyYXJ5LiBIZW5jZSwgZm9yIHN0cmVhbWluZyBhcHBsaWNhdGlvbnMgKHdpdGhvdXQgZmlsZSBhY2Nlc3MpIHRoaXMgc3RlcCBpcyBub3QgbmVjZXNzYXJ5LgorVGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBpcyBuZWNlc3NhcnkgZm9yIHByb3BlciBkZWNvZGluZyBvZiBJU08vTVBFRy0yLzQgQUFDLAorSEUtQUFDIHYyLCBvciBNUEVHLUQgVVNBQyBiaXRzdHJlYW1zLiBJbiB0aGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uLCBpbnB1dCBzdHJlYW0KK3JlYWQgYW5kIG91dHB1dCB3cml0ZSBmdW5jdGlvbiBkZXRhaWxzIGFyZSBsZWZ0IG91dCwgc2luY2UgdGhleSBtYXkgYmUKK2ltcGxlbWVudGVkIGluIGEgdmFyaWV0eSBvZiBjb25maWd1cmF0aW9ucyBkZXBlbmRpbmcgb24gdGhlIHVzZXIncyBzcGVjaWZpYworcmVxdWlyZW1lbnRzLiBUaGUgZXhhbXBsZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGZpbGUtYmFzZWQgaW5wdXQvb3V0cHV0LCBhbmQgaW4KK3N1Y2ggY2FzZSBvbmUgbWF5IGNhbGwgbXBlZ0ZpbGVSZWFkX09wZW4oKSB0byBvcGVuIGFuIGlucHV0IGZpbGUgYW5kIHRvIGFsbG9jYXRlCittZW1vcnkgZm9yIHRoZSByZXF1aXJlZCBzdHJ1Y3R1cmVzLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbXBlZ0ZpbGVSZWFkX0Nsb3NlKCkKK3RvIGNsb3NlIG9wZW5lZCBmaWxlcyBhbmQgdG8gZGUtYWxsb2NhdGUgYXNzb2NpYXRlZCBzdHJ1Y3R1cmVzLgorbXBlZ0ZpbGVSZWFkX09wZW4oKSB3aWxsIGF0dGVtcHQgdG8gZGV0ZWN0IHRoZSBiaXRzdHJlYW0gZm9ybWF0IGFuZCBpbiBjYXNlIG9mCitNUEVHLTQgZmlsZSBmb3JtYXQgb3IgUmF3IFBhY2tldHMgZmlsZSBmb3JtYXQgKGEgcHJvcHJpZXRhcnkgRnJhdW5ob2ZlciBJSVMgZmlsZQorZm9ybWF0IHN1aXRhYmxlIG9ubHkgZm9yIHRlc3RpbmcpIGl0IHdpbGwgcmVhZCB0aGUgQXVkaW8gU3BlY2lmaWMgQ29uZmlnIGRhdGEKKyhBU0MpLiBBbiB1bnN1Y2Nlc3NmdWwgYXR0ZW1wdCB0byByZWNvZ25pemUgdGhlIGJpdHN0cmVhbSBmb3JtYXQgcmVxdWlyZXMgdGhlCit1c2VyIHRvIHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbiBtYW51YWxseS4gRm9yIGFueSBvdGhlciBiaXRzdHJlYW0gZm9ybWF0cyB0aGF0CithcmUgdXN1YWxseSBhcHBsaWNhYmxlIGluIHN0cmVhbWluZyBhcHBsaWNhdGlvbnMsIHRoZSBkZWNvZGVyIGl0c2VsZiB3aWxsIHRyeSB0bworc3luY2hyb25pemUgYW5kIHBhcnNlIHRoZSBnaXZlbiBiaXRzdHJlYW0gZnJhZ21lbnQgdXNpbmcgdGhlIEZESyB0cmFuc3BvcnQKK2xpYnJhcnkuIEhlbmNlLCBmb3Igc3RyZWFtaW5nIGFwcGxpY2F0aW9ucyAod2l0aG91dCBmaWxlIGFjY2VzcykgdGhpcyBzdGVwIGlzCitub3QgbmVjZXNzYXJ5LgogCi0tIyBDYWxsIGFhY0RlY29kZXJfT3BlbigpIHRvIG9wZW4gYW5kIHJldHJpZXZlIGEgaGFuZGxlIHRvIGEgbmV3IEFBQyBkZWNvZGVyIGluc3RhbmNlLgotXGRvbnRpbmNsdWRlIG1haW4uY3BwCi1cc2tpcGxpbmUgYWFjRGVjb2Rlcl9PcGVuCi0tIyBJZiBvdXQtb2YtYmFuZCBjb25maWcgZGF0YSAoQXVkaW8gU3BlY2lmaWMgQ29uZmlnIChBU0MpIG9yIFN0cmVhbSBNdXggQ29uZmlnIChTTUMpKSBpcyBhdmFpbGFibGUsIGNhbGwKLWFhY0RlY29kZXJfQ29uZmlnUmF3KCkgdG8gcGFzcyBpdCB0byB0aGUgZGVjb2RlciBhbmQgYmVmb3JlIHRoZSBkZWNvZGluZyBwcm9jZXNzIHN0YXJ0cy4gSWYgdGhpcyBkYXRhIGlzCi1ub3QgYXZhaWxhYmxlIGluIGFkdmFuY2UsIHRoZSBkZWNvZGVyIHdpbGwgZ2V0IGl0IGZyb20gdGhlIGJpdHN0cmVhbSAgYW5kIGNvbmZpZ3VyZSBpdHNlbGYgd2hpbGUgZGVjb2RpbmcKLXdpdGggYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpLgorCistIyBDYWxsIGFhY0RlY29kZXJfT3BlbigpIHRvIG9wZW4gYW5kIHJldHJpZXZlIGEgaGFuZGxlIHRvIGEgbmV3IEFBQyBkZWNvZGVyCitpbnN0YW5jZS4gXGNvZGUgYWFjRGVjb2RlckluZm8gPSBhYWNEZWNvZGVyX09wZW4odHJhbnNwb3J0VHlwZSwgbnJPZkxheWVycyk7CitcZW5kY29kZQorLSMgSWYgb3V0LW9mLWJhbmQgY29uZmlnIGRhdGEgKEF1ZGlvIFNwZWNpZmljIENvbmZpZyAoQVNDKSBvciBTdHJlYW0gTXV4IENvbmZpZworKFNNQykpIGlzIGF2YWlsYWJsZSwgY2FsbCBhYWNEZWNvZGVyX0NvbmZpZ1JhdygpIHRvIHBhc3MgdGhpcyBkYXRhIHRvIHRoZQorZGVjb2RlciBiZWZvcmUgYmVnaW5uaW5nIHRoZSBkZWNvZGluZyBwcm9jZXNzLiBJZiB0aGlzIGRhdGEgaXMgbm90IGF2YWlsYWJsZSBpbgorYWR2YW5jZSwgdGhlIGRlY29kZXIgd2lsbCBjb25maWd1cmUgaXRzZWxmIHdoaWxlIGRlY29kaW5nLCBkdXJpbmcgdGhlCithYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkgZnVuY3Rpb24gY2FsbC4KIC0jIEJlZ2luIGRlY29kaW5nIGxvb3AuCi1cc2tpcGxpbmUgZG8gewotLSMgUmVhZCBkYXRhIGZyb20gYml0c3RyZWFtIGZpbGUgb3Igc3RyZWFtIGludG8gYSBjbGllbnQtc3VwcGxpZWQgaW5wdXQgYnVmZmVyICgiaW5CdWZmZXIiIGluIG1haW4uY3BwKS4KLUlmIGl0IGlzIHZlcnkgc21hbGwgbGlrZSBqdXN0IDQsIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKSB3aWxsCi1yZXBlYXRlZGx5IHJldHVybiA6OkFBQ19ERUNfTk9UX0VOT1VHSF9CSVRTIHVudGlsIGVub3VnaCBiaXRzIHdlcmUgZmVkIGJ5IGFhY0RlY29kZXJfRmlsbCgpLiBPbmx5IHJlYWQgZGF0YQotd2hlbiB0aGlzIGJ1ZmZlciBoYXMgY29tcGxldGVseSBiZWVuIHByb2Nlc3NlZCBhbmQgaXMgdGhlbiBlbXB0eS4gRm9yIGZpbGUtYmFzZWQgaW5wdXQgZXhlY3V0ZQotbXBlZ0ZpbGVSZWFkX1JlYWQoKSBvciBhbnkgb3RoZXIgaW1wbGVtZW50YXRpb24gd2l0aCBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkuCi0tIyBDYWxsIGFhY0RlY29kZXJfRmlsbCgpIHRvIGZpbGwgdGhlIGRlY29kZXIncyBpbnRlcm5hbCBiaXRzdHJlYW0gaW5wdXQgYnVmZmVyIHdpdGggdGhlIGNsaWVudC1zdXBwbGllZAotZXh0ZXJuYWwgYml0c3RyZWFtIGlucHV0IGJ1ZmZlci4KLVxza2lwbGluZSBhYWNEZWNvZGVyX0ZpbGwKLS0jIENhbGwgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpIHdoaWNoIHdyaXRlcyBkZWNvZGVkIFBDTSBhdWRpbyBkYXRhIHRvIGEgY2xpZW50LXN1cHBsaWVkIGJ1ZmZlci4gSXQgaXMgdGhlCi1jbGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhbGxvY2F0ZSBhIGJ1ZmZlciB3aGljaCBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGlzIG91dHB1dCBkYXRhLgotXHNraXBsaW5lIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUKLUlmIHRoZSBiaXRzdHJlYW0ncyBjb25maWd1cmF0aW9uIChudW1iZXIgb2YgY2hhbm5lbHMsIHNhbXBsZSByYXRlLCBmcmFtZSBzaXplKSBpcyBub3Qga25vd24gaW4gYWR2YW5jZSwgeW91IG1heQotY2FsbCBhYWNEZWNvZGVyX0dldFN0cmVhbUluZm8oKSB0byByZXRyaWV2ZSBhIHN0cnVjdHVyZSBjb250YWluaW5nIHRoaXMgaW5mb3JtYXRpb24gYW5kIHRoZW4gaW5pdGlhbGl6ZSBhbiBhdWRpbwotb3V0cHV0IGRldmljZS4gSW4gdGhlIGV4YW1wbGUgbWFpbi5jcHAsIGlmIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgb3IgdGhlIHNhbXBsZSByYXRlIGhhcyBjaGFuZ2VkIHNpbmNlIHByb2dyYW0KLXN0YXJ0IG9yIHNpbmNlIHRoZSBwcmV2aW91c2x5IGRlY29kZWQgZnJhbWUsIHRoZSBhdWRpbyBvdXRwdXQgZGV2aWNlIHdpbGwgYmUgcmUtaW5pdGlhbGl6ZWQuIElmIFdBVkUgZmlsZSBvdXRwdXQKLWlzIGNob3NlbiwgYSBuZXcgV0FWRSBmaWxlIGZvciBlYWNoIG5ldyBjb25maWd1cmF0aW9uIHdpbGwgYmUgY3JlYXRlZC4KLVxza2lwbGluZSBhYWNEZWNvZGVyX0dldFN0cmVhbUluZm8KLS0jIFJlcGVhdCBzdGVwcyA1IHRvIDcgdW50aWwgbm8gZGF0YSB0byBkZWNvZGUgaXMgYXZhaWxhYmxlIGFueW1vcmUsIG9yIGlmIGFuIGVycm9yIG9jY3VyZWQuCi1cc2tpcGxpbmUgfSB3aGlsZQotLSMgQ2FsbCBhYWNEZWNvZGVyX0Nsb3NlKCkgdG8gZGUtYWxsb2NhdGUgYWxsIEFBQyBkZWNvZGVyIGFuZCB0cmFuc3BvcnQgbGF5ZXIgc3RydWN0dXJlcy4KLVxza2lwbGluZSBhYWNEZWNvZGVyX0Nsb3NlCitcY29kZQorZG8geworXGVuZGNvZGUKKy0jIFJlYWQgZGF0YSBmcm9tIGJpdHN0cmVhbSBmaWxlIG9yIHN0cmVhbSBidWZmZXIgaW4gdG8gdGhlIGRyaXZlciBwcm9ncmFtCit3b3JraW5nIG1lbW9yeSAoYSBjbGllbnQtc3VwcGxpZWQgaW5wdXQgYnVmZmVyICJpbkJ1ZmZlciIgaW4gZnJhbWV3b3JrKS4gVGhpcworYnVmZmVyIHdpbGwgYmUgdXNlZCB0byBsb2FkIEFBQyBiaXRzdHJlYW0gZGF0YSB0byB0aGUgZGVjb2Rlci4gIE9ubHkgd2hlbiBhbGwKK2RhdGEgaW4gdGhpcyBidWZmZXIgaGFzIGJlZW4gcHJvY2Vzc2VkIHdpbGwgdGhlIGRlY29kZXIgc2lnbmFsIGFuIGVtcHR5IGJ1ZmZlci4KK0ZvciBmaWxlLWJhc2VkIGlucHV0LCB5b3UgbWF5IGludm9rZSBtcGVnRmlsZVJlYWRfUmVhZCgpIHRvIGFjcXVpcmUgbmV3CitiaXRzdHJlYW0gZGF0YS4KKy0jIENhbGwgYWFjRGVjb2Rlcl9GaWxsKCkgdG8gZmlsbCB0aGUgZGVjb2RlcidzIGludGVybmFsIGJpdHN0cmVhbSBpbnB1dCBidWZmZXIKK3dpdGggdGhlIGNsaWVudC1zdXBwbGllZCBiaXRzdHJlYW0gaW5wdXQgYnVmZmVyLiBOb3RlLCBpZiB0aGUgZGF0YSBsb2FkZWQgaW4gdG8KK3RoZSBpbnRlcm5hbCBidWZmZXIgaXMgbm90IHN1ZmZpY2llbnQgdG8gZGVjb2RlIGEgZnJhbWUsCithYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkgd2lsbCByZXR1cm4gOjpBQUNfREVDX05PVF9FTk9VR0hfQklUUyB1bnRpbCBhCitzdWZmaWNpZW50IGFtb3VudCBvZiBkYXRhIGlzIGxvYWRlZCBpbiB0byB0aGUgaW50ZXJuYWwgYnVmZmVyLiBGb3Igc3RyZWFtaW5nCitmb3JtYXRzIChBRFRTLCBMT0FTKSwgaXQgaXMgYWNjZXB0YWJsZSB0byBsb2FkIG1vcmUgdGhhbiBvbmUgZnJhbWUgdG8gdGhlCitkZWNvZGVyLiBIb3dldmVyLCBmb3IgUkFXIGZpbGUgZm9ybWF0IChGcmF1bmhvZmVyIElJUyBwcm9wcmlldGFyeSBmb3JtYXQpLCBvbmx5CitvbmUgZnJhbWUgbWF5IGJlIGxvYWRlZCB0byB0aGUgZGVjb2RlciBwZXIgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpIGNhbGwuIEZvcgorbGVhc3QgYW1vdW50IG9mIGNvbW11bmljYXRpb24gZGVsYXksIGZpbGwgYW5kIGRlY29kZSBzaG91bGQgYmUgcGVyZm9ybWVkIG9uIGEKK2ZyYW1lIGJ5IGZyYW1lIGJhc2lzLiBcY29kZSBFcnJvclN0YXR1cyA9IGFhY0RlY29kZXJfRmlsbChhYWNEZWNvZGVySW5mbywKK2luQnVmZmVyLCBieXRlc1JlYWQsIGJ5dGVzVmFsaWQpOyBcZW5kY29kZQorLSMgQ2FsbCBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkuIFRoaXMgZnVuY3Rpb24gZGVjb2RlcyBvbmUgZnJhbWUgYW5kIHdyaXRlcworZGVjb2RlZCBQQ00gYXVkaW8gZGF0YSB0byBhIGNsaWVudC1zdXBwbGllZCBidWZmZXIuIEl0IGlzIHRoZSBjbGllbnQncworcmVzcG9uc2liaWxpdHkgdG8gYWxsb2NhdGUgYSBidWZmZXIgd2hpY2ggaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIGRlY29kZWQKK291dHB1dCBkYXRhLiBcY29kZSBFcnJvclN0YXR1cyA9IGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoYWFjRGVjb2RlckluZm8sCitUaW1lRGF0YSwgT1VUX0JVRl9TSVpFLCBmbGFncyk7IFxlbmRjb2RlIElmIHRoZSBiaXRzdHJlYW0gY29uZmlndXJhdGlvbiAobnVtYmVyCitvZiBjaGFubmVscywgc2FtcGxlIHJhdGUsIGZyYW1lIHNpemUpIGlzIG5vdCBrbm93biBhIHByaW9yaSwgeW91IG1heSBjYWxsCithYWNEZWNvZGVyX0dldFN0cmVhbUluZm8oKSB0byByZXRyaWV2ZSBhIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoaXMKK2luZm9ybWF0aW9uLiBZb3UgbWF5IHVzZSB0aGlzIGRhdGEgdG8gaW5pdGlhbGl6ZSBhbiBhdWRpbyBvdXRwdXQgZGV2aWNlLiBJbiB0aGUKK2V4YW1wbGUgcHJvZ3JhbSwgaWYgdGhlIG51bWJlciBvZiBjaGFubmVscyBvciB0aGUgc2FtcGxlIHJhdGUgaGFzIGNoYW5nZWQgc2luY2UKK3Byb2dyYW0gc3RhcnQgb3IgdGhlIHByZXZpb3VzbHkgZGVjb2RlZCBmcmFtZSwgdGhlIGF1ZGlvIG91dHB1dCBkZXZpY2UgaXMgdGhlbgorcmUtaW5pdGlhbGl6ZWQuIElmIFdBVkUgZmlsZSBvdXRwdXQgaXMgY2hvc2VuLCBhIG5ldyBXQVZFIGZpbGUgZm9yIGVhY2ggbmV3CitzdHJlYW0gY29uZmlndXJhdGlvbiBpcyBiZSBjcmVhdGVkLiBcY29kZSBwX3NpID0KK2FhY0RlY29kZXJfR2V0U3RyZWFtSW5mbyhhYWNEZWNvZGVySW5mbyk7IFxlbmRjb2RlCistIyBSZXBlYXQgc3RlcHMgNSB0byA3IHVudGlsIG5vIGRhdGEgaXMgYXZhaWxhYmxlIHRvIGRlY29kZSBhbnkgbW9yZSwgb3IgaW4gY2FzZQorb2YgZXJyb3IuIFxjb2RlIH0gd2hpbGUgKGJ5dGVzUmVhZFswXSA+IDAgfHwgZG9GbHVzaCB8fCBkb0JzRmx1c2ggfHwKK2ZvcmNlQ29udGludWUpOyBcZW5kY29kZQorLSMgQ2FsbCBhYWNEZWNvZGVyX0Nsb3NlKCkgdG8gZGUtYWxsb2NhdGUgYWxsIEFBQyBkZWNvZGVyIGFuZCB0cmFuc3BvcnQgbGF5ZXIKK3N0cnVjdHVyZXMuIFxjb2RlIGFhY0RlY29kZXJfQ2xvc2UoYWFjRGVjb2RlckluZm8pOyBcZW5kY29kZQorCitcaW1hZ2UgbGF0ZXggZGVjb2RlLnBuZyAiRGVjb2RlIGNhbGxpbmcgc2VxdWVuY2UiIHdpZHRoPTExY20KKworXGltYWdlIGxhdGV4IGNoYW5nZV9zb3VyY2UucG5nICJDaGFuZ2UgZGF0YSBzb3VyY2Ugc2VxdWVuY2UiIHdpZHRoIDVjbQorCitcaW1hZ2UgbGF0ZXggY29uY2VhbC5wbmcgIkVycm9yIGNvbmNlYWxtZW50IHNlcXVlbmNlIiB3aWR0aD0xNGNtCisKK1xzdWJzZWN0aW9uIEVycm9yX0NvbmNlYWxtZW50X1NlcXVlbmNlIEVycm9yIENvbmNlYWxtZW50IFNlcXVlbmNlCisKK1RoZXJlIGFyZSBkaWZmZXJlbnQgc3RyYXRlZ2llcyB0byBoYW5kbGUgYml0IHN0cmVhbSBlcnJvcnMuIERlcGVuZGluZyBvbiB0aGUKK3N5c3RlbSBwcm9wZXJ0aWVzIHRoZSBwcm9kdWN0IGRlc2lnbmVyIG1pZ2h0IGNob29zZSB0byB0YWtlIGRpZmZlcmVudCBhY3Rpb25zIGluCitjYXNlIGEgYml0IGVycm9yIG9jY3Vycy4gSW4gbWFueSBjYXNlcyB0aGUgZGVjb2RlciBtaWdodCBiZSBhYmxlIHRvIGRvCityZWFzb25hYmxlIGVycm9yIGNvbmNlYWxtZW50IHdpdGhvdXQgdGhlIG5lZWQgb2YgYW55IGFkZGl0aW9uYWwgYWN0aW9ucyBmcm9tIHRoZQorc3lzdGVtLiBCdXQgaW4gc29tZSBjYXNlcyBpdHMgbm90IGV2ZW4gcG9zc2libGUgdG8ga25vdyBob3cgbWFueSBkZWNvZGVkIFBDTQorb3V0cHV0IHNhbXBsZXMgYXJlIHJlcXVpcmVkIHRvIGZpbGwgdGhlIGdhcCBkdWUgdG8gdGhlIGRhdGEgZXJyb3IsIHRoZW4gdGhlCitzb2Z0d2FyZSBzdXJyb3VuZGluZyB0aGUgZGVjb2RlciBtdXN0IGRlYWwgd2l0aCB0aGUgc2l0dWF0aW9uLiBUaGUgbW9zdCBzaW1wbGUKK3dheSB3b3VsZCBiZSB0byBqdXN0IHN0b3AgYXVkaW8gcGxheWJhY2sgYW5kIHJlc3VtZSBvbmNlIGVub3VnaCBiaXQgc3RyZWFtIGRhdGEKK2FuZC9vciBidWZmZXJlZCBvdXRwdXQgc2FtcGxlcyBhcmUgYXZhaWxhYmxlLiBNb3JlIHNvcGhpc3RpY2F0ZWQgZGVzaWducyBtaWdodAorYWxzbyBiZSBhYmxlIHRvIGRlYWwgd2l0aCBzZW5kZXIvcmVjZWl2ZXIgY2xvY2sgZHJpZnRzIG9yIGRhdGEgZHJvcCBvdXRzIGJ5Cit1c2luZyBhIGNsb3NlZCBsb29wIGNvbnRyb2wgb2YgRklGTyBmdWxuZXNzIGxldmVscy4gVGhlIGNob3NlbiBzdHJhdGVneSBkZXBlbmRzCitvbiB0aGUgZmluYWwgcHJvZHVjdCByZXF1aXJlbWVudHMuCisKK1RoZSBlcnJvciBjb25jZWFsbWVudCBzZXF1ZW5jZSBkaWFncmFtIGlsbHVzdHJhdGVzIHRoZSBnZW5lcmFsIGV4ZWN1dGlvbiBwYXRocworZm9yIGVycm9yIGhhbmRsaW5nLgorCitUaGUgbWFjcm8gSVNfT1VUUFVUX1ZBTElEKGVycikgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgaWYgdGhlIGF1ZGlvIG91dHB1dAorYnVmZmVyIGNvbnRhaW5zIHZhbGlkIGF1ZGlvIGVpdGhlciBmcm9tIGVycm9yIGZyZWUgYml0IHN0cmVhbSBkYXRhIG9yIHN1Y2Nlc3NmdWwKK2Vycm9yIGNvbmNlYWxtZW50LiBJbiBjYXNlIHRoZSByZXN1bHQgaXMgZmFsc2UsIHRoZSBkZWNvZGVyIG91dHB1dCBidWZmZXIgZG9lcworbm90IGNvbnRhaW4gbWVhbmluZ2Z1bCBhdWRpbyBzYW1wbGVzIGFuZCBzaG91bGQgbm90IGJlIHBhc3NlZCB0byBhbnkgb3V0cHV0IGFzCitpdCBpcy4gTW9zdCBsaWtlbHkgaW4gY2FzZSB0aGF0IGEgY29udGludW91cyBhdWRpbyBvdXRwdXQgUENNIHN0cmVhbSBpcworcmVxdWlyZWQsIHRoZSBvdXRwdXQgYnVmZmVyIG11c3QgYmUgZmlsbGVkIHdpdGggYXVkaW8gZGF0YSBmcm9tIHRoZSBjYWxsaW5nCitmcmFtZXdvcmsuIFRoaXMgbWlnaHQgYmUgZS5nLiBhbiBhcHByb3ByaWF0ZSBudW1iZXIgb2Ygc2FtcGxlcyBhbGwgemVyby4KKworSWYgZXJyb3IgY29kZSA6OkFBQ19ERUNfVFJBTlNQT1JUX1NZTkNfRVJST1IgaXMgcmV0dXJuZWQgYnkgdGhlIGRlY29kZXIsIHVuZGVyCitzb21lIHBhcnRpY3VsYXIgY29uZGl0aW9ucyBpdCBpcyBwb3NzaWJsZSB0byBlc3RpbWF0ZSBsb3N0IGZyYW1lcyBkdWUgdG8gdGhlIGJpdAorc3RyZWFtIGVycm9yLiBJbiB0aGF0IGNhc2UgdGhlIGJpdCBzdHJlYW0gaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIGNvbnN0YW50CitiaXRyYXRlLCBhbmQgY29tcGF0aWJsZSB0cmFuc3BvcnQgdHlwZS4gQXVkaW8gc2FtcGxlcyBmb3IgdGhlIGxvc3QgZnJhbWVzIGNhbiBiZQorb2J0YWluZWQgYnkgY2FsbGluZyBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkgd2l0aCBmbGFnIDo6QUFDREVDX0NPTkNFQUwgc2V0CituLXRpbWVzIHdoZXJlIG4gaXMgdGhlIGNvdW50IG9mIGxvc3QgZnJhbWVzLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBkZWNvZGVyIGhhcyB0bworaGF2ZSBlbmNvdW50ZXJlZCB2YWxpZCBjb25maWd1cmF0aW9uIGRhdGEgYXQgbGVhc3Qgb25jZSB0byBiZSBhYmxlIHRvIGdlbmVyYXRlCitjb25jZWFsZWQgZGF0YSwgYmVjYXVzZSBhdCB0aGUgbWluaW11bSB0aGUgc2FtcGxpbmcgcmF0ZSwgZnJhbWUgc2l6ZSBhbmQgYW1vdW50CitvZiBhdWRpbyBjaGFubmVscyBuZWVkcyB0byBiZSBrbm93bi4KKworSWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGdldCBhbiBlc3RpbWF0aW9uIG9mIGxvc3QgZnJhbWVzIHRoZW4gYSBjb25zdGFudAorZnVsbG5lc3Mgb2YgdGhlIGF1ZGlvIG91dHB1dCBidWZmZXIgY2FuIGJlIGFjaGlldmVkIGJ5IGltcGxlbWVudGluZyBkaWZmZXJlbnQKK0ZJRk8gY29udHJvbCB0ZWNobmlxdWVzIGUuZy4ganVzdCBzdG9wIHRha2luZyBvZiBzYW1wbGVzIGZyb20gdGhlIGJ1ZmZlciB0bworYXZvaWQgdW5kZXJmbG93IG9yIHN0b3AgZmlsbGluZyBuZXcgZGF0YSB0byB0aGUgYnVmZmVyIHRvIGF2b2lkIG92ZXJmbG93LiBCdXQKK3RoaXMgdGVjaG5pcXVlcyBhcmUgb3V0IG9mIHNjb3BlIG9mIHRoaXMgZG9jdW1lbnQuCisKK0ZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgZXJyb3IgY29kZSBwbGVhc2UgcmVmZXIgYWxzbyB0bworOjpBQUNfREVDT0RFUl9FUlJPUi4KIAogXHNlY3Rpb24gQnVmZmVyU3lzdGVtIEJ1ZmZlciBTeXN0ZW0KIAotVGhlcmUgYXJlIHRocmVlIG1haW4gYnVmZmVycyBpbiBhbiBBQUMgZGVjb2RlciBhcHBsaWNhdGlvbi4gT25lIGV4dGVybmFsIGlucHV0IGJ1ZmZlciB0byBob2xkIGJpdHN0cmVhbQotZGF0YSBmcm9tIGZpbGUgSS9PIG9yIGVsc2V3aGVyZSwgb25lIGRlY29kZXItaW50ZXJuYWwgaW5wdXQgYnVmZmVyLCBhbmQgb25lIHRvIGhvbGQgdGhlIGRlY29kZWQgb3V0cHV0Ci1QQ00gc2FtcGxlIGRhdGEsIHdoZXJlYXMgdGhpcyBvdXRwdXQgYnVmZmVyIG1heSBvdmVybGFwIHdpdGggdGhlIGV4dGVybmFsIGlucHV0IGJ1ZmZlci4KK1RoZXJlIGFyZSB0aHJlZSBtYWluIGJ1ZmZlcnMgaW4gYW4gQUFDIGRlY29kZXIgYXBwbGljYXRpb24uIE9uZSBleHRlcm5hbCBpbnB1dAorYnVmZmVyIHRvIGhvbGQgYml0c3RyZWFtIGRhdGEgZnJvbSBmaWxlIEkvTyBvciBlbHNld2hlcmUsIG9uZSBkZWNvZGVyLWludGVybmFsCitpbnB1dCBidWZmZXIsIGFuZCBvbmUgdG8gaG9sZCB0aGUgZGVjb2RlZCBvdXRwdXQgUENNIHNhbXBsZSBkYXRhLiBJbiByZXNvdXJjZQorbGltaXRlZCBhcHBsaWNhdGlvbnMsIHRoZSBvdXRwdXQgYnVmZmVyIG1heSBiZSByZXVzZWQgYXMgYW4gZXh0ZXJuYWwgaW5wdXQKK2J1ZmZlciBwcmlvciB0byB0aGUgc3Vic2VxdWVuY2UgYWFjRGVjb2Rlcl9GaWxsKCkgZnVuY3Rpb24gY2FsbC4KIAotVGhlIGV4dGVybmFsIGlucHV0IGJ1ZmZlciBpcyBzZXQgaW4gdGhlIGV4YW1wbGUgZnJhbWV3b3JrIG1haW4uY3BwIGFuZCBpdHMgc2l6ZSBpcyBkZWZpbmVkIGJ5IDo6SU5fQlVGX1NJWkUuCi1Zb3UgbWF5IGZyZWVseSBjaG9vc2UgZGlmZmVyZW50IHNpemVzIGhlcmUuIFRvIGZlZWQgdGhlIGRhdGEgdG8gdGhlIGRlY29kZXItaW50ZXJuYWwgaW5wdXQgYnVmZmVyLCB1c2UgdGhlCi1mdW5jdGlvbiBhYWNEZWNvZGVyX0ZpbGwoKS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGltcG9ydGFudCBpbmZvcm1hdGlvbiBhYm91dCBob3cgbWFueSBieXRlcyBpbiB0aGUKLWV4dGVybmFsIGlucHV0IGJ1ZmZlciBoYXZlIG5vdCB5ZXQgYmVlbiBjb3BpZWQgaW50byB0aGUgaW50ZXJuYWwgaW5wdXQgYnVmZmVyICh2YXJpYWJsZSBieXRlc1ZhbGlkKS4KLU9uY2UgdGhlIGV4dGVybmFsIGJ1ZmZlciBoYXMgYmVlbiBmdWxseSBjb3BpZWQsIGl0IGNhbiBiZSByZS1maWxsZWQgYWdhaW4uCi1JbiBjYXNlIHlvdSB3YW50IHRvIHJlLWZpbGwgaXQgd2hlbiB0aGVyZSBhcmUgc3RpbGwgdW5wcm9jZXNzZWQgYnl0ZXMgKGJ5dGVzVmFsaWQgaXMgdW5lcXVhbCAwKSwgeW91Ci13b3VsZCBoYXZlIHRvIGFkZGl0aW9uYWxseSBwZXJmb3JtIGEgbWVtY3B5KCksIHNvIHRoYXQganVzdCBtZWFucyB1bm5lY2Vzc2FyeSBjb21wdXRhdGlvbmFsIG92ZXJoZWFkCi1hbmQgdGhlcmVmb3JlIHdlIHJlY29tbWVuZCB0byByZS1maWxsIHRoZSBidWZmZXIgb25seSB3aGVuIGJ5dGVzVmFsaWQgaXMgMC4KK1RoZSBleHRlcm5hbCBpbnB1dCBidWZmZXIgaXMgc2V0IGluIHRoZSBleGFtcGxlIHByb2dyYW0gYW5kIGl0cyBzaXplIGlzIGRlZmluZWQKK2J5IDo6SU5fQlVGX1NJWkUuIFlvdSBtYXkgZnJlZWx5IGNob29zZSBkaWZmZXJlbnQgYnVmZmVyIHNpemVzLiBUbyBmZWVkIHRoZSBkYXRhCit0byB0aGUgZGVjb2Rlci1pbnRlcm5hbCBpbnB1dCBidWZmZXIsIHVzZSB0aGUgZnVuY3Rpb24gYWFjRGVjb2Rlcl9GaWxsKCkuIFRoaXMKK2Z1bmN0aW9uIHJldHVybnMgaW1wb3J0YW50IGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorZXh0ZXJuYWwgaW5wdXQgYnVmZmVyIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gY29waWVkIGludG8gdGhlIGludGVybmFsIGlucHV0CitidWZmZXIgKHZhcmlhYmxlIGJ5dGVzVmFsaWQpLiBPbmNlIHRoZSBleHRlcm5hbCBidWZmZXIgaGFzIGJlZW4gZnVsbHkgY29waWVkLCBpdAorY2FuIGJlIGNvbXBsZXRlbHkgcmUtZmlsbGVkIGFnYWluLiBJbiBjYXNlIHlvdSB3aXNoIHRvIHJlZmlsbCB0aGUgYnVmZmVyIHdoaWxlCit0aGVyZSBhcmUgdW5wcm9jZXNzZWQgYnl0ZXMgKGJ5dGVzVmFsaWQgaXMgdW5lcXVhbCAwKSwgeW91IHNob3VsZCBwcmVzZXJ2ZSB0aGUKK3VuY29uc3VtZWQgZGF0YS4gSG93ZXZlciwgd2UgcmVjb21tZW5kIHRvIHJlZmlsbCB0aGUgYnVmZmVyIG9ubHkgd2hlbiBieXRlc1ZhbGlkCityZXR1cm5zIDAuCiAKLVxpbWFnZSBsYXRleCBkZWNfYnVmZmVyLnBuZyAiTGlmZWN5Y2xlIG9mIHRoZSBleHRlcm5hbCBpbnB1dCBidWZmZXIiIHdpZHRoPTljbQorVGhlIGJ5dGVzVmFsaWQgcGFyYW1ldGVyIGlzIGFuIGlucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyIHRvIHRoZSBGREsgZGVjb2Rlci4gQXMKK2FuIGlucHV0LCBpdCBzaWduYWxzIGhvdyBtYW55IHZhbGlkIGJ5dGVzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGV4dGVybmFsIGJ1ZmZlci4KK0FmdGVyIGNvbnN1bXB0aW9uIG9mIHRoZSBleHRlcm5hbCBidWZmZXIgdXNpbmcgYWFjRGVjb2Rlcl9GaWxsKCkgZnVuY3Rpb24sIHRoZQorYnl0ZXNWYWxpZCBwYXJhbWV0ZXIgaW5kaWNhdGVzIGlmIGFueSBvZiB0aGUgYnl0ZXMgaW4gdGhlIGV4dGVybmFsIGJ1ZmZlciB3ZXJlCitub3QgY29uc3VtZWQuCiAKLVRoZSBzaXplIG9mIHRoZSBkZWNvZGVyLWludGVybmFsIGlucHV0IGJ1ZmZlciBpcyBzZXQgaW4gdHBkZWNfbGliLmggKHNlZSBkZWZpbmUgOjpUUkFOU1BPUlRERUNfSU5CVUZfU0laRSkuCi1Zb3UgbWF5IGNob29zZSBhIHNtYWxsZXIgc2l6ZSB1bmRlciB0aGUgZm9sbG93aW5nIGNvbnNpZGVyYXRpb25zOgotCi0tIGVhY2ggaW5wdXQgY2hhbm5lbCByZXF1aXJlcyA3NjggYnl0ZXMKLS0gdGhlIHdob2xlIGJ1ZmZlciBtdXN0IGJlIG9mIHNpemUgMl5uCi0KLVNvIGZvciBleGFtcGxlIGEgc3RlcmVvIGRlY29kZXI6Ci0KLVxmWwotVFJBTlNQT1JUREVDXF9JTkJVRlxfU0laRSA9IDIgKiA3NjggPSAxNTM2ID0+IDIwNDgKLVxmXQotCi10cGRlY19saWIuaCBhbmQgVFJBTlNQT1JUREVDX0lOQlVGX1NJWkUgYXJlIG5vdCBwYXJ0IG9mIHRoZSBkZWNvZGVyJ3MgbGlicmFyeSBpbnRlcmZhY2UuIFRoZXJlZm9yZQotb25seSBzb3VyY2UtY29kZSBjbGllbnRzIG1heSBjaGFuZ2UgdGhpcyBzZXR0aW5nLiBJZiB5b3UgcmVjZWl2ZWQgYSBsaWJyYXJ5IHJlbGVhc2UsIHBsZWFzZSBhc2sgdXMgYW5kCi13ZSBjYW4gY2hhbmdlIHRoaXMgaW4gb3JkZXIgdG8gbWVldCB5b3VyIG1lbW9yeSByZXF1aXJlbWVudHMuCitcaW1hZ2UgbGF0ZXggZGVjX2J1ZmZlci5wbmcgIkxpZmUgY3ljbGUgb2YgdGhlIGV4dGVybmFsIGlucHV0IGJ1ZmZlciIgd2lkdGg9OWNtCiAKIFxwYWdlIE91dHB1dEZvcm1hdCBEZWNvZGVyIGF1ZGlvIG91dHB1dAogCiBcc2VjdGlvbiBPdXRwdXRGb3JtYXRPYnRhaW5pbmcgT2J0YWluaW5nIGNoYW5uZWwgbWFwcGluZyBpbmZvcm1hdGlvbgogCi1UaGUgZGVjb2RlZCBhdWRpbyBvdXRwdXQgZm9ybWF0IGlzIGluZGljYXRlZCBieSBhIHNldCBvZiB2YXJpYWJsZXMgb2YgdGhlIENTdHJlYW1JbmZvIHN0cnVjdHVyZS4KLVdoaWxlIHRoZSBtZW1iZXJzIHNhbXBsZVJhdGUsIGZyYW1lU2l6ZSBhbmQgbnVtQ2hhbm5lbHMgbWlnaHQgYmUgcXVpdGUgc2VsZiBleHBsYWluaW5nLAotcENoYW5uZWxUeXBlIGFuZCBwQ2hhbm5lbEluZGljZXMgbWlnaHQgcmVxdWlyZSBzb21lIG1vcmUgZGV0YWlsZWQgZXhwbGFuYXRpb24uCitUaGUgZGVjb2RlZCBhdWRpbyBvdXRwdXQgZm9ybWF0IGlzIGluZGljYXRlZCBieSBhIHNldCBvZiB2YXJpYWJsZXMgb2YgdGhlCitDU3RyZWFtSW5mbyBzdHJ1Y3R1cmUuIFdoaWxlIHRoZSBzdHJ1Y3QgbWVtYmVycyBzYW1wbGVSYXRlLCBmcmFtZVNpemUgYW5kCitudW1DaGFubmVscyBtaWdodCBiZSBzZWxmIGV4cGxhbmF0b3J5LCBwQ2hhbm5lbFR5cGUgYW5kIHBDaGFubmVsSW5kaWNlcyByZXF1aXJlCitzb21lIGZ1cnRoZXIgZXhwbGFuYXRpb24uCiAKLVRoZXNlIHR3byBhcnJheXMgaW5kaWNhdGUgd2hhdCBpcyBlYWNoIG91dHB1dCBjaGFubmVsIHN1cHBvc2VkIHRvIGJlLiBCb3RoIGFycmF5IGhhdmUKLUNTdHJlYW1JbmZvOjpudW1DaGFubmVscyBjZWxscy4gRWFjaCBjZWxsIG9mIHBDaGFubmVsVHlwZSBpbmRpY2F0ZXMgdGhlIGNoYW5uZWwgdHlwZSwgZGVzY3JpYmVkIGluCi10aGUgZW51bSA6OkFVRElPX0NIQU5ORUxfVFlQRSBkZWZpbmVkIGluIEZES19hdWRpby5oLiBUaGUgY2VsbHMgb2YgcENoYW5uZWxJbmRpY2VzIGluZGljYXRlIHRoZSBzdWIgaW5kZXgKLWFtb25nIHRoZSBjaGFubmVscyBzdGFydGluZyB3aXRoIDAgYW1vbmcgYWxsIGNoYW5uZWxzIG9mIHRoZSBzYW1lIGF1ZGlvIGNoYW5uZWwgdHlwZS4KK1RoZXNlIHR3byBhcnJheXMgaW5kaWNhdGUgdGhlIGNvbmZpZ3VyYXRpb24gb2YgY2hhbm5lbCBkYXRhIHdpdGhpbiB0aGUgb3V0cHV0CitidWZmZXIuIEJvdGggYXJyYXlzIGhhdmUgQ1N0cmVhbUluZm86Om51bUNoYW5uZWxzIG51bWJlciBvZiBjZWxscy4gRWFjaCBjZWxsIG9mCitwQ2hhbm5lbFR5cGUgaW5kaWNhdGVzIHRoZSBjaGFubmVsIHR5cGUsIHdoaWNoIGlzIGRlc2NyaWJlZCBpbiB0aGUgZW51bQorOjpBVURJT19DSEFOTkVMX1RZUEUgKGRlZmluZWQgaW4gRkRLX2F1ZGlvLmgpLiBUaGUgY2VsbHMgb2YgcENoYW5uZWxJbmRpY2VzCitpbmRpY2F0ZSB0aGUgc3ViIGluZGV4IGFtb25nIHRoZSBjaGFubmVscyBzdGFydGluZyB3aXRoIDAgYW1vbmcgY2hhbm5lbHMgb2YgdGhlCitzYW1lIGF1ZGlvIGNoYW5uZWwgdHlwZS4KIAotVGhlIGluZGV4aW5nIHNjaGVtZSBpcyB0aGUgc2FtZSBhcyBmb3IgTVBFRy0yLzQuIFRodXMgaW5kaWNlcyBhcmUgY291bnRlZCB1cHdhcmRzIHN0YXJ0aW5nIGZyb20gdGhlIGZyb250Ci1kaXJlY3Rpb24gKHRodXMgYSBjZW50ZXIgY2hhbm5lbCBpZiBhbnksIHdpbGwgYWx3YXlzIGJlIGluZGV4IDApLiBUaGVuIHRoZSBpbmRpY2VzIGNvdW50IHVwLCBzdGFydGluZyBhbHdheXMKLXdpdGggdGhlIGxlZnQgc2lkZSwgcGFpcndpc2UgZnJvbSBmcm9udCB0b3dhcmQgYmFjay4gRm9yIGRldGFpbGVkIGV4cGxhbmF0aW9uLCBwbGVhc2UgcmVmZXIgdG8KLUlTTy9JRUMgMTM4MTgtNzoyMDA1KEUpLCBjaGFwdGVyIDguNS4zLjIuCitUaGUgaW5kZXhpbmcgc2NoZW1lIGlzIHN0cnVjdHVyZWQgYXMgZGVmaW5lZCBpbiBNUEVHLTIvNCBTdGFuZGFyZHMuIEluZGljZXMKK3N0YXJ0IGZyb20gdGhlIGZyb250IGRpcmVjdGlvbiAoYSBjZW50ZXIgY2hhbm5lbCBpZiBhdmFpbGFibGUsIHdpbGwgYWx3YXlzIGJlCitpbmRleCAwKSBhbmQgaW5jcmVtZW50LCBzdGFydGluZyB3aXRoIHRoZSBsZWZ0IHNpZGUsIHBhaXJ3aXNlIChlLmcuIEwsIFIpIGFuZAorZnJvbSBmcm9udCB0byBiYWNrIChGcm9udCBMLCBGcm9udCBSLCBTdXJyb3VuZCBMLCBTdXJyb3VuZCBSKS4gRm9yIGRldGFpbGVkCitleHBsYW5hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIElTTy9JRUMgMTM4MTgtNzoyMDA1KEUpLCBjaGFwdGVyIDguNS4zLjIuCiAKLUluIGNhc2UgYSBQcm9ncmFtIENvbmZpZyBpcyBpbmNsdWRlZCBpbiB0aGUgYXVkaW8gY29uZmlndXJhdGlvbiwgdGhlIGNoYW5uZWwgbWFwcGluZyBkZXNjcmliZWQgd2l0aGluCi1pdCB3aWxsIGJlIGFkb3B0ZWQuCitJbiBjYXNlIGEgUHJvZ3JhbSBDb25maWcgaXMgaW5jbHVkZWQgaW4gdGhlIGF1ZGlvIGNvbmZpZ3VyYXRpb24sIHRoZSBjaGFubmVsCittYXBwaW5nIGRlc2NyaWJlZCB3aXRoaW4gaXQgd2lsbCBiZSBhZG9wdGVkLgogCi1JbiBjYXNlIG9mIE1QRUctRCBTdXJyb3VuZCB0aGUgY2hhbm5lbCBtYXBwaW5nIHdpbGwgZm9sbG93IHRoZSBzYW1lIGNyaXRlcmlhIGRlc2NyaWJlZCBpbiBJU08vSUVDIDEzODE4LTc6MjAwNShFKSwKLWJ1dCBhZGRpbmcgY29ycmVzcG9uZGluZyB0b3AgY2hhbm5lbHMgdG8gdGhlIGNoYW5uZWwgdHlwZXMgZnJvbnQsIHNpZGUgYW5kIGJhY2ssIGluIG9yZGVyIHRvIGF2b2lkIGFueQotbG9zcyBvZiBpbmZvcm1hdGlvbi4KK0luIGNhc2Ugb2YgTVBFRy1EIFN1cnJvdW5kIHRoZSBjaGFubmVsIG1hcHBpbmcgd2lsbCBmb2xsb3cgdGhlIHNhbWUgY3JpdGVyaWEKK2Rlc2NyaWJlZCBpbiBJU08vSUVDIDEzODE4LTc6MjAwNShFKSwgYnV0IGFkZGluZyBjb3JyZXNwb25kaW5nIHRvcCBjaGFubmVscyAoaWYKK2F2YWlsYWJsZSkgdG8gdGhlIGNoYW5uZWwgdHlwZXMgaW4gb3JkZXIgdG8gYXZvaWQgYW1iaWd1aXR5LiBUaGUgZXhhbXBsZXMgYmVsb3cKK2V4cGxhaW4gdGhlc2UgYXNwZWN0cyBpbiBkZXRhaWwuCiAKIFxzZWN0aW9uIE91dHB1dEZvcm1hdENoYW5nZSBDaGFuZ2luZyB0aGUgYXVkaW8gb3V0cHV0IGZvcm1hdAogCi1UaGUgY2hhbm5lbCBpbnRlcmxlYXZpbmcgc2NoZW1lIGFuZCB0aGUgYWN0dWFsIGNoYW5uZWwgb3JkZXIgY2FuIGJlIGNoYW5nZWQgYXQgcnVudGltZSB0aHJvdWdoIHRoZQotcGFyYW1ldGVycyA6OkFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEIGFuZCA6OkFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORy4gU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aG9zZQotcGFyYW1ldGVycyBhbmQgdGhlIGRlY29kZXIgbGlicmFyeSBmdW5jdGlvbiBhYWNEZWNvZGVyX1NldFBhcmFtKCkgZm9yIG1vcmUgZGV0YWlsLgorRm9yIE1QRUctNCBhdWRpbyB0aGUgY2hhbm5lbCBvcmRlciBjYW4gYmUgY2hhbmdlZCBhdCBydW50aW1lIHRocm91Z2ggdGhlCitwYXJhbWV0ZXIKKzo6QUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HLiBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRob3NlCitwYXJhbWV0ZXJzIGFuZCB0aGUgZGVjb2RlciBsaWJyYXJ5IGZ1bmN0aW9uIGFhY0RlY29kZXJfU2V0UGFyYW0oKSBmb3IgbW9yZQorZGV0YWlsLgogCiBcc2VjdGlvbiBPdXRwdXRGb3JtYXRFeGFtcGxlIENoYW5uZWwgbWFwcGluZyBleGFtcGxlcwogCi1UaGUgZm9sbG93aW5nIGV4YW1wbGVzIGlsbHVzdHJhdGUgdGhlIGxvY2F0aW9uIG9mIGluZGl2aWR1YWwgYXVkaW8gc2FtcGxlcyBpbiB0aGUgYXVkaW8gYnVmZmVyIHRoYXQKLWlzIHBhc3NlZCB0byBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkgYW5kIHRoZSBleHBlY3RlZCBkYXRhIGluIHRoZSBDU3RyZWFtSW5mbyBzdHJ1Y3R1cmUgd2hpY2ggY2FuIGJlIG9idGFpbmVkCi1ieSBjYWxsaW5nIGFhY0RlY29kZXJfR2V0U3RyZWFtSW5mbygpLgorVGhlIGZvbGxvd2luZyBleGFtcGxlcyBpbGx1c3RyYXRlIHRoZSBsb2NhdGlvbiBvZiBpbmRpdmlkdWFsIGF1ZGlvIHNhbXBsZXMgaW4KK3RoZSBhdWRpbyBidWZmZXIgdGhhdCBpcyBwYXNzZWQgdG8gYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpIGFuZCB0aGUgZXhwZWN0ZWQKK2RhdGEgaW4gdGhlIENTdHJlYW1JbmZvIHN0cnVjdHVyZSB3aGljaCBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZworYWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvKCkuCiAKIFxzdWJzZWN0aW9uIEV4YW1wbGVzU3RlcmVvIFN0ZXJlbwogCi1JbiBjYXNlIG9mIDo6QUFDX1BDTV9PVVRQVVRfSU5URVJMRUFWRUQgc2V0IHRvIDAgYW5kIDo6QUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HIHNldCB0byAxLAotYSBBQUMtTEMgYml0IHN0cmVhbSB3aGljaCBoYXMgY2hhbm5lbENvbmZpZ3VyYXRpb24gPSAyIGluIGl0cyBhdWRpbyBzcGVjaWZpYyBjb25maWcgd291bGQgbGVhZAotdG8gdGhlIGZvbGxvd2luZyB2YWx1ZXMgaW4gQ1N0cmVhbUluZm86CitJbiBjYXNlIG9mIDo6QUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HIHNldCB0byAxLAorYSBBQUMtTEMgYml0IHN0cmVhbSB3aGljaCBoYXMgY2hhbm5lbENvbmZpZ3VyYXRpb24gPSAyIGluIGl0cyBhdWRpbyBzcGVjaWZpYworY29uZmlnIHdvdWxkIGxlYWQgdG8gdGhlIGZvbGxvd2luZyB2YWx1ZXMgaW4gQ1N0cmVhbUluZm86CiAKIENTdHJlYW1JbmZvOjpudW1DaGFubmVscyA9IDIKIApAQCAtMjYxLDggKzM3Miw3IEBACiAKIENTdHJlYW1JbmZvOjpwQ2hhbm5lbEluZGljZXMgPSB7IDAsIDEgfQogCi1TaW5jZSA6OkFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEIGlzIHNldCB0byAwLCB0aGUgYXVkaW8gY2hhbm5lbHMgd2lsbCBiZSBsb2NhdGVkIGFzIGNvbnRpZ3VvdXMgYmxvY2tzCi1pbiB0aGUgb3V0cHV0IGJ1ZmZlciBhcyBmb2xsb3dzOgorVGhlIG91dHB1dCBidWZmZXIgd2lsbCBiZSBmb3JtYXR0ZWQgYXMgZm9sbG93czoKIAogXHZlcmJhdGltCiAgIDxsZWZ0IHNhbXBsZSAwPiAgPGxlZnQgc2FtcGxlIDE+ICA8bGVmdCBzYW1wbGUgMj4gIC4uLiA8bGVmdCBzYW1wbGUgTj4KQEAgLTI3MywyNSArMzgzLDI3IEBACiAKIFxzdWJzZWN0aW9uIEV4YW1wbGVzU3Vycm91bmQgU3Vycm91bmQgNS4xCiAKLUluIGNhc2Ugb2YgOjpBQUNfUENNX09VVFBVVF9JTlRFUkxFQVZFRCBzZXQgdG8gMSBhbmQgOjpBQUNfUENNX09VVFBVVF9DSEFOTkVMX01BUFBJTkcgc2V0IHRvIDEsCi1hIEFBQy1MQyBiaXQgc3RyZWFtIHdoaWNoIGhhcyBjaGFubmVsQ29uZmlndXJhdGlvbiA9IDYgaW4gaXRzIGF1ZGlvIHNwZWNpZmljIGNvbmZpZywgd291bGQgbGVhZAotdG8gdGhlIGZvbGxvd2luZyB2YWx1ZXMgaW4gQ1N0cmVhbUluZm86CitJbiBjYXNlIG9mIDo6QUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HIHNldCB0byAxLAorYSBBQUMtTEMgYml0IHN0cmVhbSB3aGljaCBoYXMgY2hhbm5lbENvbmZpZ3VyYXRpb24gPSA2IGluIGl0cyBhdWRpbyBzcGVjaWZpYworY29uZmlnLCB3b3VsZCBsZWFkIHRvIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGluIENTdHJlYW1JbmZvOgogCiBDU3RyZWFtSW5mbzo6bnVtQ2hhbm5lbHMgPSA2CiAKLUNTdHJlYW1JbmZvOjpwQ2hhbm5lbFR5cGUgPSB7IDo6QUNUX0ZST05ULCA6OkFDVF9GUk9OVCwgOjpBQ1RfRlJPTlQsIDo6QUNUX0xGRSwgOjpBQ1RfQkFDSywgOjpBQ1RfQkFDSyB9CitDU3RyZWFtSW5mbzo6cENoYW5uZWxUeXBlID0geyA6OkFDVF9GUk9OVCwgOjpBQ1RfRlJPTlQsIDo6QUNUX0ZST05ULCA6OkFDVF9MRkUsCis6OkFDVF9CQUNLLCA6OkFDVF9CQUNLIH0KIAogQ1N0cmVhbUluZm86OnBDaGFubmVsSW5kaWNlcyA9IHsgMSwgMiwgMCwgMCwgMCwgMSB9CiAKLVNpbmNlIDo6QUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HIGlzIDEsIFdBViBmaWxlIGNoYW5uZWwgb3JkZXJpbmcgd2lsbCBiZSB1c2VkLiBGb3IgYSA1LjEgY2hhbm5lbAotc2NoZW1lLCB0aHVzIHRoZSBjaGFubmVscyB3b3VsZCBiZTogZnJvbnQgbGVmdCwgZnJvbnQgcmlnaHQsIGNlbnRlciwgTEZFLCBzdXJyb3VuZCBsZWZ0LCBzdXJyb3VuZCByaWdodC4KLVRodXMgdGhlIHRoaXJkIGNoYW5uZWwgaXMgdGhlIGNlbnRlciBjaGFubmVsLCByZWNlaXZpbmcgdGhlIGluZGV4IDAuIFRoZSBvdGhlciBmcm9udCBjaGFubmVscyBhcmUKLWZyb250IGxlZnQsIGZyb250IHJpZ2h0IGJlaW5nIHBsYWNlZCBhcyBmaXJzdCBhbmQgc2Vjb25kIGNoYW5uZWxzIHdpdGggaW5kaWNlcyAxIGFuZCAyIGNvcnJlc3BvbmRpbmdseS4KLVRoZXJlIGlzIG9ubHkgb25lIExGRSwgcGxhY2VkIGFzIHRoZSBmb3VydGggY2hhbm5lbCBhbmQgaW5kZXggMC4gRmluYWxseSBib3RoIHN1cnJvdW5kCi1jaGFubmVscyBnZXQgdGhlIHR5cGUgZGVmaW5pdGlvbiBBQ1RfQkFDSywgYW5kIHRoZSBpbmRpY2VzIDAgYW5kIDEuCitTaW5jZSA6OkFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORyBpcyAxLCBXQVYgZmlsZSBjaGFubmVsIG9yZGVyaW5nIHdpbGwgYmUKK3VzZWQuIEZvciBhIDUuMSBjaGFubmVsIHNjaGVtZSwgdGh1cyB0aGUgY2hhbm5lbHMgd291bGQgYmU6IGZyb250IGxlZnQsIGZyb250CityaWdodCwgY2VudGVyLCBMRkUsIHN1cnJvdW5kIGxlZnQsIHN1cnJvdW5kIHJpZ2h0LiBUaHVzIHRoZSB0aGlyZCBjaGFubmVsIGlzIHRoZQorY2VudGVyIGNoYW5uZWwsIHJlY2VpdmluZyB0aGUgaW5kZXggMC4gVGhlIG90aGVyIGZyb250IGNoYW5uZWxzIGFyZSBmcm9udCBsZWZ0LAorZnJvbnQgcmlnaHQgYmVpbmcgcGxhY2VkIGFzIGZpcnN0IGFuZCBzZWNvbmQgY2hhbm5lbHMgd2l0aCBpbmRpY2VzIDEgYW5kIDIKK2NvcnJlc3BvbmRpbmdseS4gVGhlcmUgaXMgb25seSBvbmUgTEZFLCBwbGFjZWQgYXMgdGhlIGZvdXJ0aCBjaGFubmVsIGFuZCBpbmRleAorMC4gRmluYWxseSBib3RoIHN1cnJvdW5kIGNoYW5uZWxzIGdldCB0aGUgdHlwZSBkZWZpbml0aW9uIEFDVF9CQUNLLCBhbmQgdGhlCitpbmRpY2VzIDAgYW5kIDEuCiAKLVNpbmNlIDo6QUFDX1BDTV9PVVRQVVRfSU5URVJMRUFWRUQgaXMgc2V0IHRvIDEsIHRoZSBhdWRpbyBjaGFubmVscyB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgb3V0cHV0IGJ1ZmZlcgotYXMgZm9sbG93czoKK1RoZSBvdXRwdXQgYnVmZmVyIHdpbGwgYmUgZm9ybWF0dGVkIGFzIGZvbGxvd3M6CiAKIFx2ZXJiYXRpbQogPGZyb250IGxlZnQgc2FtcGxlIDA+IDxmcm9udCByaWdodCBzYW1wbGUgMD4KQEAgLTMxMywxMyArNDI1LDE0IEBACiAKIFxzdWJzZWN0aW9uIEV4YW1wbGVzQXJpYiBBUklCIGNvZGluZyBtb2RlIDIvMQogCi1JbiBjYXNlIG9mIDo6QUFDX1BDTV9PVVRQVVRfSU5URVJMRUFWRUQgc2V0IHRvIDEgYW5kIDo6QUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HIHNldCB0byAxLAotaW4gY2FzZSBvZiBhIEFSSUIgYml0IHN0cmVhbSB1c2luZyBjb2RpbmcgbW9kZSAyLzEgYXMgZGVzY3JpYmVkIGluIEFSSUIgU1RELUIzMiBQYXJ0IDIgVmVyc2lvbiAyLjEtRTEsIHBhZ2UgNjEsCi13b3VsZCBsZWFkIHRvIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGluIENTdHJlYW1JbmZvOgorSW4gY2FzZSBvZiA6OkFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORyBzZXQgdG8gMSwKK2luIGNhc2Ugb2YgYSBBUklCIGJpdCBzdHJlYW0gdXNpbmcgY29kaW5nIG1vZGUgMi8xIGFzIGRlc2NyaWJlZCBpbiBBUklCIFNURC1CMzIKK1BhcnQgMiBWZXJzaW9uIDIuMS1FMSwgcGFnZSA2MSwgd291bGQgbGVhZCB0byB0aGUgZm9sbG93aW5nIHZhbHVlcyBpbgorQ1N0cmVhbUluZm86CiAKIENTdHJlYW1JbmZvOjpudW1DaGFubmVscyA9IDMKIAotQ1N0cmVhbUluZm86OnBDaGFubmVsVHlwZSA9IHsgOjpBQ1RfRlJPTlQsIDo6QUNUX0ZST05ULDo6IEFDVF9CQUNLIH0KK0NTdHJlYW1JbmZvOjpwQ2hhbm5lbFR5cGUgPSB7IDo6QUNUX0ZST05ULCA6OkFDVF9GUk9OVCwgOjpBQ1RfQkFDSyB9CiAKIENTdHJlYW1JbmZvOjpwQ2hhbm5lbEluZGljZXMgPSB7IDAsIDEsIDAgfQogCkBAIC0zNDAsMjYwICs0NTMsNDUxIEBACiAKICovCiAKLSNpZm5kZWYgQUFDREVDT0RFUl9MSUJfSAotI2RlZmluZSBBQUNERUNPREVSX0xJQl9ICi0KICNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKICNpbmNsdWRlICJGREtfYXVkaW8uaCIKIAogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCi0KIC8qKgogICogXGJyaWVmICBBQUMgZGVjb2RlciBlcnJvciBjb2Rlcy4KICAqLwogdHlwZWRlZiBlbnVtIHsKLSAgQUFDX0RFQ19PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAsICAvKiE8IE5vIGVycm9yIG9jY3VyZWQuIE91dHB1dCBidWZmZXIgaXMgdmFsaWQgYW5kIGVycm9yIGZyZWUuICovCi0gIEFBQ19ERUNfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgICAgID0gMHgwMDAyLCAgLyohPCBIZWFwIHJldHVybmVkIE5VTEwgcG9pbnRlci4gT3V0cHV0IGJ1ZmZlciBpcyBpbnZhbGlkLiAqLwotICBBQUNfREVDX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNSwgIC8qITwgRXJyb3IgY29uZGl0aW9uIGlzIG9mIHVua25vd24gcmVhc29uLCBvciBmcm9tIGEgYW5vdGhlciBtb2R1bGUuIE91dHB1dCBidWZmZXIgaXMgaW52YWxpZC4gKi8KKyAgQUFDX0RFQ19PSyA9CisgICAgICAweDAwMDAsIC8qITwgTm8gZXJyb3Igb2NjdXJyZWQuIE91dHB1dCBidWZmZXIgaXMgdmFsaWQgYW5kIGVycm9yIGZyZWUuICovCisgIEFBQ19ERUNfT1VUX09GX01FTU9SWSA9CisgICAgICAweDAwMDIsIC8qITwgSGVhcCByZXR1cm5lZCBOVUxMIHBvaW50ZXIuIE91dHB1dCBidWZmZXIgaXMgaW52YWxpZC4gKi8KKyAgQUFDX0RFQ19VTktOT1dOID0KKyAgICAgIDB4MDAwNSwgLyohPCBFcnJvciBjb25kaXRpb24gaXMgb2YgdW5rbm93biByZWFzb24sIG9yIGZyb20gYSBhbm90aGVyCisgICAgICAgICAgICAgICAgIG1vZHVsZS4gT3V0cHV0IGJ1ZmZlciBpcyBpbnZhbGlkLiAqLwogCiAgIC8qIFN5bmNocm9uaXphdGlvbiBlcnJvcnMuIE91dHB1dCBidWZmZXIgaXMgaW52YWxpZC4gKi8KLSAgYWFjX2RlY19zeW5jX2Vycm9yX3N0YXJ0ICAgICAgICAgICAgICAgPSAweDEwMDAsCi0gIEFBQ19ERUNfVFJBTlNQT1JUX1NZTkNfRVJST1IgICAgICAgICAgID0gMHgxMDAxLCAgLyohPCBUaGUgdHJhbnNwb3J0IGRlY29kZXIgaGFkIHN5bmNyb25pc2F0aW9uIHByb2JsZW1zLiBEbyBub3QgZXhpdCBkZWNvZGluZy4gSnVzdCBmZWVkIG5ldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtIGRhdGEuICovCi0gIEFBQ19ERUNfTk9UX0VOT1VHSF9CSVRTICAgICAgICAgICAgICAgID0gMHgxMDAyLCAgLyohPCBUaGUgaW5wdXQgYnVmZmVyIHJhbiBvdXQgb2YgYml0cy4gKi8KLSAgYWFjX2RlY19zeW5jX2Vycm9yX2VuZCAgICAgICAgICAgICAgICAgPSAweDFGRkYsCisgIGFhY19kZWNfc3luY19lcnJvcl9zdGFydCA9IDB4MTAwMCwKKyAgQUFDX0RFQ19UUkFOU1BPUlRfU1lOQ19FUlJPUiA9IDB4MTAwMSwgLyohPCBUaGUgdHJhbnNwb3J0IGRlY29kZXIgaGFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXphdGlvbiBwcm9ibGVtcy4gRG8gbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgZGVjb2RpbmcuIEp1c3QgZmVlZCBuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0gZGF0YS4gKi8KKyAgQUFDX0RFQ19OT1RfRU5PVUdIX0JJVFMgPSAweDEwMDIsIC8qITwgVGhlIGlucHV0IGJ1ZmZlciByYW4gb3V0IG9mIGJpdHMuICovCisgIGFhY19kZWNfc3luY19lcnJvcl9lbmQgPSAweDFGRkYsCiAKICAgLyogSW5pdGlhbGl6YXRpb24gZXJyb3JzLiBPdXRwdXQgYnVmZmVyIGlzIGludmFsaWQuICovCi0gIGFhY19kZWNfaW5pdF9lcnJvcl9zdGFydCAgICAgICAgICAgICAgID0gMHgyMDAwLAotICBBQUNfREVDX0lOVkFMSURfSEFORExFICAgICAgICAgICAgICAgICA9IDB4MjAwMSwgIC8qITwgVGhlIGhhbmRsZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIGNhbGwgd2FzIGludmFsaWQgKE5VTEwpLiAqLwotICBBQUNfREVDX1VOU1VQUE9SVEVEX0FPVCAgICAgICAgICAgICAgICA9IDB4MjAwMiwgIC8qITwgVGhlIEFPVCBmb3VuZCBpbiB0aGUgY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiAqLwotICBBQUNfREVDX1VOU1VQUE9SVEVEX0ZPUk1BVCAgICAgICAgICAgICA9IDB4MjAwMywgIC8qITwgVGhlIGJpdHN0cmVhbSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4gICovCi0gIEFBQ19ERUNfVU5TVVBQT1JURURfRVJfRk9STUFUICAgICAgICAgID0gMHgyMDA0LCAgLyohPCBUaGUgZXJyb3IgcmVzaWxpZW5jZSB0b29sIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAqLwotICBBQUNfREVDX1VOU1VQUE9SVEVEX0VQQ09ORklHICAgICAgICAgICA9IDB4MjAwNSwgIC8qITwgVGhlIGVycm9yIHByb3RlY3Rpb24gZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuICovCi0gIEFBQ19ERUNfVU5TVVBQT1JURURfTVVMVElMQVlFUiAgICAgICAgID0gMHgyMDA2LCAgLyohPCBNb3JlIHRoYW4gb25lIGxheWVyIGZvciBBQUMgc2NhbGFibGUgaXMgbm90IHN1cHBvcnRlZC4gKi8KLSAgQUFDX0RFQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHICAgICAgPSAweDIwMDcsICAvKiE8IFRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKGVpdGhlciBudW1iZXIgb3IgYXJyYW5nZW1lbnQpIGlzIG5vdCBzdXBwb3J0ZWQuICovCi0gIEFBQ19ERUNfVU5TVVBQT1JURURfU0FNUExJTkdSQVRFICAgICAgID0gMHgyMDA4LCAgLyohPCBUaGUgc2FtcGxlIHJhdGUgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICovCi0gIEFBQ19ERUNfSU5WQUxJRF9TQlJfQ09ORklHICAgICAgICAgICAgID0gMHgyMDA5LCAgLyohPCBUaGUgU0JSIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4gKi8KLSAgQUFDX0RFQ19TRVRfUEFSQU1fRkFJTCAgICAgICAgICAgICAgICAgPSAweDIwMEEsICAvKiE8IFRoZSBwYXJhbWV0ZXIgY291bGQgbm90IGJlIHNldC4gRWl0aGVyIHRoZSB2YWx1ZSB3YXMgb3V0IG9mIHJhbmdlIG9yIHRoZSBwYXJhbWV0ZXIgZG9lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGV4aXN0LiAqLwotICBBQUNfREVDX05FRURfVE9fUkVTVEFSVCAgICAgICAgICAgICAgICA9IDB4MjAwQiwgIC8qITwgVGhlIGRlY29kZXIgbmVlZHMgdG8gYmUgcmVzdGFydGVkLCBzaW5jZSB0aGUgcmVxdWllcmVkIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGNhbm5vdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiAqLwotICBBQUNfREVDX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMICAgICAgICA9IDB4MjAwQywgIC8qITwgVGhlIHByb3ZpZGVkIG91dHB1dCBidWZmZXIgaXMgdG9vIHNtYWxsLiAqLwotICBhYWNfZGVjX2luaXRfZXJyb3JfZW5kICAgICAgICAgICAgICAgICA9IDB4MkZGRiwKKyAgYWFjX2RlY19pbml0X2Vycm9yX3N0YXJ0ID0gMHgyMDAwLAorICBBQUNfREVDX0lOVkFMSURfSEFORExFID0KKyAgICAgIDB4MjAwMSwgLyohPCBUaGUgaGFuZGxlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gY2FsbCB3YXMgaW52YWxpZCAoTlVMTCkuICovCisgIEFBQ19ERUNfVU5TVVBQT1JURURfQU9UID0KKyAgICAgIDB4MjAwMiwgLyohPCBUaGUgQU9UIGZvdW5kIGluIHRoZSBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICovCisgIEFBQ19ERUNfVU5TVVBQT1JURURfRk9STUFUID0KKyAgICAgIDB4MjAwMywgLyohPCBUaGUgYml0c3RyZWFtIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAgKi8KKyAgQUFDX0RFQ19VTlNVUFBPUlRFRF9FUl9GT1JNQVQgPQorICAgICAgMHgyMDA0LCAvKiE8IFRoZSBlcnJvciByZXNpbGllbmNlIHRvb2wgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuICovCisgIEFBQ19ERUNfVU5TVVBQT1JURURfRVBDT05GSUcgPQorICAgICAgMHgyMDA1LCAvKiE8IFRoZSBlcnJvciBwcm90ZWN0aW9uIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAqLworICBBQUNfREVDX1VOU1VQUE9SVEVEX01VTFRJTEFZRVIgPQorICAgICAgMHgyMDA2LCAvKiE8IE1vcmUgdGhhbiBvbmUgbGF5ZXIgZm9yIEFBQyBzY2FsYWJsZSBpcyBub3Qgc3VwcG9ydGVkLiAqLworICBBQUNfREVDX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUcgPQorICAgICAgMHgyMDA3LCAvKiE8IFRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKGVpdGhlciBudW1iZXIgb3IgYXJyYW5nZW1lbnQpIGlzCisgICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQuICovCisgIEFBQ19ERUNfVU5TVVBQT1JURURfU0FNUExJTkdSQVRFID0gMHgyMDA4LCAvKiE8IFRoZSBzYW1wbGUgcmF0ZSBzcGVjaWZpZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkLiAqLworICBBQUNfREVDX0lOVkFMSURfU0JSX0NPTkZJRyA9CisgICAgICAweDIwMDksIC8qITwgVGhlIFNCUiBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICovCisgIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUwgPSAweDIwMEEsICAvKiE8IFRoZSBwYXJhbWV0ZXIgY291bGQgbm90IGJlIHNldC4gRWl0aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmFsdWUgd2FzIG91dCBvZiByYW5nZSBvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBkb2VzICBub3QgZXhpc3QuICovCisgIEFBQ19ERUNfTkVFRF9UT19SRVNUQVJUID0gMHgyMDBCLCAvKiE8IFRoZSBkZWNvZGVyIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmNlIHRoZSByZXF1aXJlZCBjb25maWd1cmF0aW9uIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fubm90IGJlIHBlcmZvcm1lZC4gKi8KKyAgQUFDX0RFQ19PVVRQVVRfQlVGRkVSX1RPT19TTUFMTCA9CisgICAgICAweDIwMEMsIC8qITwgVGhlIHByb3ZpZGVkIG91dHB1dCBidWZmZXIgaXMgdG9vIHNtYWxsLiAqLworICBhYWNfZGVjX2luaXRfZXJyb3JfZW5kID0gMHgyRkZGLAogCiAgIC8qIERlY29kZSBlcnJvcnMuIE91dHB1dCBidWZmZXIgaXMgdmFsaWQgYnV0IGNvbmNlYWxlZC4gKi8KLSAgYWFjX2RlY19kZWNvZGVfZXJyb3Jfc3RhcnQgICAgICAgICAgICAgPSAweDQwMDAsCi0gIEFBQ19ERUNfVFJBTlNQT1JUX0VSUk9SICAgICAgICAgICAgICAgID0gMHg0MDAxLCAgLyohPCBUaGUgdHJhbnNwb3J0IGRlY29kZXIgZW5jb3VudGVyZWQgYW4gdW5leHBlY3RlZCBlcnJvci4gKi8KLSAgQUFDX0RFQ19QQVJTRV9FUlJPUiAgICAgICAgICAgICAgICAgICAgPSAweDQwMDIsICAvKiE8IEVycm9yIHdoaWxlIHBhcnNpbmcgdGhlIGJpdHN0cmVhbS4gTW9zdCBwcm9iYWJseSBpdCBpcyBjb3JydXB0ZWQsIG9yIHRoZSBzeXN0ZW0gY3Jhc2hlZC4gKi8KLSAgQUFDX0RFQ19VTlNVUFBPUlRFRF9FWFRFTlNJT05fUEFZTE9BRCAgPSAweDQwMDMsICAvKiE8IEVycm9yIHdoaWxlIHBhcnNpbmcgdGhlIGV4dGVuc2lvbiBwYXlsb2FkIG9mIHRoZSBiaXRzdHJlYW0uIFRoZSBleHRlbnNpb24gcGF5bG9hZCB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCBpcyBub3Qgc3VwcG9ydGVkLiAqLwotICBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUiAgICAgICAgICAgICA9IDB4NDAwNCwgIC8qITwgVGhlIHBhcnNlZCBiaXRzdHJlYW0gdmFsdWUgaXMgb3V0IG9mIHJhbmdlLiBNb3N0IHByb2JhYmx5IHRoZSBiaXRzdHJlYW0gaXMgY29ycnVwdCwgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzeXN0ZW0gY3Jhc2hlZC4gKi8KLSAgQUFDX0RFQ19DUkNfRVJST1IgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDUsICAvKiE8IFRoZSBlbWJlZGRlZCBDUkMgZGlkIG5vdCBtYXRjaC4gKi8KLSAgQUFDX0RFQ19JTlZBTElEX0NPREVfQk9PSyAgICAgICAgICAgICAgPSAweDQwMDYsICAvKiE8IEFuIGludmFsaWQgY29kZWJvb2sgd2FzIHNpZ25hbGxlZC4gTW9zdCBwcm9iYWJseSB0aGUgYml0c3RyZWFtIGlzIGNvcnJ1cHQsIG9yIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyYXNoZWQuICovCi0gIEFBQ19ERUNfVU5TVVBQT1JURURfUFJFRElDVElPTiAgICAgICAgID0gMHg0MDA3LCAgLyohPCBQcmVkaWN0b3IgZm91bmQsIGJ1dCBub3Qgc3VwcG9ydGVkIGluIHRoZSBBQUMgTG93IENvbXBsZXhpdHkgcHJvZmlsZS4gTW9zdCBwcm9iYWJseSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbSBpcyBjb3JydXB0LCBvciBoYXMgYSB3cm9uZyBmb3JtYXQuICovCi0gIEFBQ19ERUNfVU5TVVBQT1JURURfQ0NFICAgICAgICAgICAgICAgID0gMHg0MDA4LCAgLyohPCBBIENDRSBlbGVtZW50IHdhcyBmb3VuZCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiBNb3N0IHByb2JhYmx5IHRoZSBiaXRzdHJlYW0gaXMgY29ycnVwdCwgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBhIHdyb25nIGZvcm1hdC4gKi8KLSAgQUFDX0RFQ19VTlNVUFBPUlRFRF9MRkUgICAgICAgICAgICAgICAgPSAweDQwMDksICAvKiE8IEEgTEZFIGVsZW1lbnQgd2FzIGZvdW5kIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQuIE1vc3QgcHJvYmFibHkgdGhlIGJpdHN0cmVhbSBpcyBjb3JydXB0LCBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGEgd3JvbmcgZm9ybWF0LiAqLwotICBBQUNfREVDX1VOU1VQUE9SVEVEX0dBSU5fQ09OVFJPTF9EQVRBICA9IDB4NDAwQSwgIC8qITwgR2FpbiBjb250cm9sIGRhdGEgZm91bmQgYnV0IG5vdCBzdXBwb3J0ZWQuIE1vc3QgcHJvYmFibHkgdGhlIGJpdHN0cmVhbSBpcyBjb3JydXB0LCBvciBoYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgd3JvbmcgZm9ybWF0LiAqLwotICBBQUNfREVDX1VOU1VQUE9SVEVEX1NCQSAgICAgICAgICAgICAgICA9IDB4NDAwQiwgIC8qITwgU0JBIGZvdW5kLCBidXQgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgaW4gdGhlIEJTQUMgcHJvZmlsZS4gKi8KLSAgQUFDX0RFQ19UTlNfUkVBRF9FUlJPUiAgICAgICAgICAgICAgICAgPSAweDQwMEMsICAvKiE8IEVycm9yIHdoaWxlIHJlYWRpbmcgVE5TIGRhdGEuIE1vc3QgcHJvYmFibHkgdGhlIGJpdHN0cmVhbSBpcyBjb3JydXB0IG9yIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyYXNoZWQuICovCi0gIEFBQ19ERUNfUlZMQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgID0gMHg0MDBELCAgLyohPCBFcnJvciB3aGlsZSBkZWNvZGluZyBlcnJvciByZXNpbGxpZW50IGRhdGEuICovCi0gIGFhY19kZWNfZGVjb2RlX2Vycm9yX2VuZCAgICAgICAgICAgICAgID0gMHg0RkZGLAotCisgIGFhY19kZWNfZGVjb2RlX2Vycm9yX3N0YXJ0ID0gMHg0MDAwLAorICBBQUNfREVDX1RSQU5TUE9SVF9FUlJPUiA9CisgICAgICAweDQwMDEsIC8qITwgVGhlIHRyYW5zcG9ydCBkZWNvZGVyIGVuY291bnRlcmVkIGFuIHVuZXhwZWN0ZWQgZXJyb3IuICovCisgIEFBQ19ERUNfUEFSU0VfRVJST1IgPSAweDQwMDIsIC8qITwgRXJyb3Igd2hpbGUgcGFyc2luZyB0aGUgYml0c3RyZWFtLiBNb3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JhYmx5IGl0IGlzIGNvcnJ1cHRlZCwgb3IgdGhlIHN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmFzaGVkLiAqLworICBBQUNfREVDX1VOU1VQUE9SVEVEX0VYVEVOU0lPTl9QQVlMT0FEID0KKyAgICAgIDB4NDAwMywgLyohPCBFcnJvciB3aGlsZSBwYXJzaW5nIHRoZSBleHRlbnNpb24gcGF5bG9hZCBvZiB0aGUgYml0c3RyZWFtLgorICAgICAgICAgICAgICAgICBUaGUgZXh0ZW5zaW9uIHBheWxvYWQgdHlwZSBmb3VuZCBpcyBub3Qgc3VwcG9ydGVkLiAqLworICBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUiA9IDB4NDAwNCwgLyohPCBUaGUgcGFyc2VkIGJpdHN0cmVhbSB2YWx1ZSBpcyBvdXQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLiBNb3N0IHByb2JhYmx5IHRoZSBiaXRzdHJlYW0gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJ1cHQsIG9yIHRoZSBzeXN0ZW0gY3Jhc2hlZC4gKi8KKyAgQUFDX0RFQ19DUkNfRVJST1IgPSAweDQwMDUsICAgICAgICAgIC8qITwgVGhlIGVtYmVkZGVkIENSQyBkaWQgbm90IG1hdGNoLiAqLworICBBQUNfREVDX0lOVkFMSURfQ09ERV9CT09LID0gMHg0MDA2LCAgLyohPCBBbiBpbnZhbGlkIGNvZGVib29rIHdhcyBzaWduYWxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vc3QgcHJvYmFibHkgdGhlIGJpdHN0cmVhbSBpcyBjb3JydXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdGhlIHN5c3RlbSAgY3Jhc2hlZC4gKi8KKyAgQUFDX0RFQ19VTlNVUFBPUlRFRF9QUkVESUNUSU9OID0KKyAgICAgIDB4NDAwNywgLyohPCBQcmVkaWN0b3IgZm91bmQsIGJ1dCBub3Qgc3VwcG9ydGVkIGluIHRoZSBBQUMgTG93IENvbXBsZXhpdHkKKyAgICAgICAgICAgICAgICAgcHJvZmlsZS4gTW9zdCBwcm9iYWJseSB0aGUgYml0c3RyZWFtIGlzIGNvcnJ1cHQsIG9yIGhhcyBhIHdyb25nCisgICAgICAgICAgICAgICAgIGZvcm1hdC4gKi8KKyAgQUFDX0RFQ19VTlNVUFBPUlRFRF9DQ0UgPSAweDQwMDgsIC8qITwgQSBDQ0UgZWxlbWVudCB3YXMgZm91bmQgd2hpY2ggaXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuIE1vc3QgcHJvYmFibHkgdGhlIGJpdHN0cmVhbSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycnVwdCwgb3IgaGFzIGEgd3JvbmcgZm9ybWF0LiAqLworICBBQUNfREVDX1VOU1VQUE9SVEVEX0xGRSA9IDB4NDAwOSwgLyohPCBBIExGRSBlbGVtZW50IHdhcyBmb3VuZCB3aGljaCBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZC4gTW9zdCBwcm9iYWJseSB0aGUgYml0c3RyZWFtIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JydXB0LCBvciBoYXMgYSB3cm9uZyBmb3JtYXQuICovCisgIEFBQ19ERUNfVU5TVVBQT1JURURfR0FJTl9DT05UUk9MX0RBVEEgPQorICAgICAgMHg0MDBBLCAvKiE8IEdhaW4gY29udHJvbCBkYXRhIGZvdW5kIGJ1dCBub3Qgc3VwcG9ydGVkLiBNb3N0IHByb2JhYmx5IHRoZQorICAgICAgICAgICAgICAgICBiaXRzdHJlYW0gaXMgY29ycnVwdCwgb3IgaGFzIGEgd3JvbmcgZm9ybWF0LiAqLworICBBQUNfREVDX1VOU1VQUE9SVEVEX1NCQSA9CisgICAgICAweDQwMEIsIC8qITwgU0JBIGZvdW5kLCBidXQgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgaW4gdGhlIEJTQUMgcHJvZmlsZS4KKyAgICAgICAgICAgICAgICovCisgIEFBQ19ERUNfVE5TX1JFQURfRVJST1IgPSAweDQwMEMsIC8qITwgRXJyb3Igd2hpbGUgcmVhZGluZyBUTlMgZGF0YS4gTW9zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iYWJseSB0aGUgYml0c3RyZWFtIGlzIGNvcnJ1cHQgb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbSBjcmFzaGVkLiAqLworICBBQUNfREVDX1JWTENfRVJST1IgPQorICAgICAgMHg0MDBELCAvKiE8IEVycm9yIHdoaWxlIGRlY29kaW5nIGVycm9yIHJlc2lsaWVudCBkYXRhLiAqLworICBhYWNfZGVjX2RlY29kZV9lcnJvcl9lbmQgPSAweDRGRkYsCiAgIC8qIEFuY2lsbGFyeSBkYXRhIGVycm9ycy4gT3V0cHV0IGJ1ZmZlciBpcyB2YWxpZC4gKi8KLSAgYWFjX2RlY19hbmNfZGF0YV9lcnJvcl9zdGFydCAgICAgICAgICAgPSAweDgwMDAsCi0gIEFBQ19ERUNfQU5DX0RBVEFfRVJST1IgICAgICAgICAgICAgICAgID0gMHg4MDAxLCAgLyohPCBOb24gc2V2ZXJlIGVycm9yIGNvbmNlcm5pbmcgdGhlIGFuY2lsbGFyeSBkYXRhIGhhbmRsaW5nLiAqLwotICBBQUNfREVDX1RPT19TTUFMTF9BTkNfQlVGRkVSICAgICAgICAgICA9IDB4ODAwMiwgIC8qITwgVGhlIHJlZ2lzdGVyZWQgYW5jaWxsYXJ5IGRhdGEgYnVmZmVyIGlzIHRvbyBzbWFsbCB0byByZWNlaXZlIHRoZSBwYXJzZWQgZGF0YS4gKi8KLSAgQUFDX0RFQ19UT09fTUFOWV9BTkNfRUxFTUVOVFMgICAgICAgICAgPSAweDgwMDMsICAvKiE8IE1vcmUgdGhhbiB0aGUgYWxsb3dlZCBudW1iZXIgb2YgYW5jaWxsYXJ5IGRhdGEgZWxlbWVudHMgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gYnVmZmVyLiAqLwotICBhYWNfZGVjX2FuY19kYXRhX2Vycm9yX2VuZCAgICAgICAgICAgICA9IDB4OEZGRgotCisgIGFhY19kZWNfYW5jX2RhdGFfZXJyb3Jfc3RhcnQgPSAweDgwMDAsCisgIEFBQ19ERUNfQU5DX0RBVEFfRVJST1IgPQorICAgICAgMHg4MDAxLCAvKiE8IE5vbiBzZXZlcmUgZXJyb3IgY29uY2VybmluZyB0aGUgYW5jaWxsYXJ5IGRhdGEgaGFuZGxpbmcuICovCisgIEFBQ19ERUNfVE9PX1NNQUxMX0FOQ19CVUZGRVIgPSAweDgwMDIsICAvKiE8IFRoZSByZWdpc3RlcmVkIGFuY2lsbGFyeSBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgaXMgdG9vIHNtYWxsIHRvIHJlY2VpdmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgZGF0YS4gKi8KKyAgQUFDX0RFQ19UT09fTUFOWV9BTkNfRUxFTUVOVFMgPSAweDgwMDMsIC8qITwgTW9yZSB0aGFuIHRoZSBhbGxvd2VkIG51bWJlciBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaWxsYXJ5IGRhdGEgZWxlbWVudHMgc2hvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuIHRvIGJ1ZmZlci4gKi8KKyAgYWFjX2RlY19hbmNfZGF0YV9lcnJvcl9lbmQgPSAweDhGRkYKIAogfSBBQUNfREVDT0RFUl9FUlJPUjsKIAorLyoqIE1hY3JvIHRvIGlkZW50aWZ5IGluaXRpYWxpemF0aW9uIGVycm9ycy4gT3V0cHV0IGJ1ZmZlciBpcyBpbnZhbGlkLiAqLworI2RlZmluZSBJU19JTklUX0VSUk9SKGVycikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoZXJyKSA+PSBhYWNfZGVjX2luaXRfZXJyb3Jfc3RhcnQpICYmICgoZXJyKSA8PSBhYWNfZGVjX2luaXRfZXJyb3JfZW5kKSkgXAorICAgICAgID8gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogMCkKKy8qKiBNYWNybyB0byBpZGVudGlmeSBkZWNvZGUgZXJyb3JzLiBPdXRwdXQgYnVmZmVyIGlzIHZhbGlkIGJ1dCBjb25jZWFsZWQuICovCisjZGVmaW5lIElTX0RFQ09ERV9FUlJPUihlcnIpICAgICAgICAgICAgICAgICBcCisgICgoKChlcnIpID49IGFhY19kZWNfZGVjb2RlX2Vycm9yX3N0YXJ0KSAmJiBcCisgICAgKChlcnIpIDw9IGFhY19kZWNfZGVjb2RlX2Vycm9yX2VuZCkpICAgICBcCisgICAgICAgPyAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiAwKQorLyoqCisgKiBNYWNybyB0byBpZGVudGlmeSBpZiB0aGUgYXVkaW8gb3V0cHV0IGJ1ZmZlciBjb250YWlucyB2YWxpZCBzYW1wbGVzIGFmdGVyCisgKiBjYWxsaW5nIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKS4gT3V0cHV0IGJ1ZmZlciBpcyB2YWxpZCBidXQgY2FuIGJlCisgKiBjb25jZWFsZWQuCisgKi8KKyNkZWZpbmUgSVNfT1VUUFVUX1ZBTElEKGVycikgKCgoZXJyKSA9PSBBQUNfREVDX09LKSB8fCBJU19ERUNPREVfRVJST1IoZXJyKSkKIAotLyoqIE1hY3JvIHRvIGlkZW50aWZ5IGluaXRpYWxpemF0aW9uIGVycm9ycy4gKi8KLSNkZWZpbmUgSVNfSU5JVF9FUlJPUihlcnIpICAgKCAoKChlcnIpPj1hYWNfZGVjX2luaXRfZXJyb3Jfc3RhcnQpICAgJiYgKChlcnIpPD1hYWNfZGVjX2luaXRfZXJyb3JfZW5kKSkgICA/IDEgOiAwKQotLyoqIE1hY3JvIHRvIGlkZW50aWZ5IGRlY29kZSBlcnJvcnMuICovCi0jZGVmaW5lIElTX0RFQ09ERV9FUlJPUihlcnIpICggKCgoZXJyKT49YWFjX2RlY19kZWNvZGVfZXJyb3Jfc3RhcnQpICYmICgoZXJyKTw9YWFjX2RlY19kZWNvZGVfZXJyb3JfZW5kKSkgPyAxIDogMCkKLS8qKiBNYWNybyB0byBpZGVudGlmeSBpZiB0aGUgYXVkaW8gb3V0cHV0IGJ1ZmZlciBjb250YWlucyB2YWxpZCBzYW1wbGVzIGFmdGVyIGNhbGxpbmcgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpLiAqLwotI2RlZmluZSBJU19PVVRQVVRfVkFMSUQoZXJyKSAoICgoZXJyKSA9PSBBQUNfREVDX09LKSB8fCBJU19ERUNPREVfRVJST1IoZXJyKSApCisvKiEgXGVudW0gIEFBQ19NRF9QUk9GSUxFCisgKiAgXGJyaWVmIFRoZSBhdmFpbGFibGUgbWV0YWRhdGEgcHJvZmlsZXMgd2hpY2ggYXJlIG1vc3RseSByZWxhdGVkIHRvIGRvd25taXhpbmcuIFRoZSB2YWx1ZXMgZGVmaW5lIHRoZSBhcmd1bWVudHMKKyAqICAgICAgICAgZm9yIHRoZSB1c2Ugd2l0aCBwYXJhbWV0ZXIgOjpBQUNfTUVUQURBVEFfUFJPRklMRS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgQUFDX01EX1BST0ZJTEVfTVBFR19TVEFOREFSRCA9CisgICAgICAwLCAvKiE8IFRoZSBzdGFuZGFyZCBwcm9maWxlIGNyZWF0ZXMgYSBtaXhkb3duIHNpZ25hbCBiYXNlZCBvbiB0aGUKKyAgICAgICAgICAgIGFkdmFuY2VkIGRvd25taXggbWV0YWRhdGEgKGZyb20gYSBEU0UpLiBUaGUgZXF1YXRpb25zIGFuZCBkZWZhdWx0CisgICAgICAgICAgICB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gSVNPL0lFQyAxNDQ5NjozIEFtbWVuZG1lbnQgNC4gQW55IG90aGVyCisgICAgICAgICAgICAobGVnYWN5KSBkb3dubWl4IG1ldGFkYXRhIHdpbGwgYmUgaWdub3JlZC4gTm8gb3RoZXIgcGFyYW1ldGVyIHdpbGwKKyAgICAgICAgICAgIGJlIG1vZGlmaWVkLiAgICAgICAgICovCisgIEFBQ19NRF9QUk9GSUxFX01QRUdfTEVHQUNZID0KKyAgICAgIDEsIC8qITwgVGhpcyBwcm9maWxlIGJlaGF2ZXMgaWRlbnRpY2FsIHRvIHRoZSBzdGFuZGFyZCBwcm9maWxlIGlmIGFkdmFuY2VkCisgICAgICAgICAgICAgIGRvd25taXggbWV0YWRhdGEgKGZyb20gYSBEU0UpIGlzIGF2YWlsYWJsZS4gSWYgbm90LCB0aGUKKyAgICAgICAgICAgIG1hdHJpeF9taXhkb3duIGluZm9ybWF0aW9uIGVtYmVkZGVkIGluIHRoZSBwcm9ncmFtIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIGVsZW1lbnQgKFBDRSkgd2lsbCBiZSBhcHBsaWVkLiBJZiBuZWl0aGVyIGlzIHRoZSBjYXNlLCB0aGUgbW9kdWxlCisgICAgICAgICAgICBjcmVhdGVzIGEgbWl4ZG93biB1c2luZyB0aGUgZGVmYXVsdCBjb2VmZmljaWVudHMgYXMgZGVmaW5lZCBpbgorICAgICAgICAgICAgSVNPL0lFQyAxNDQ5NjozIEFNRCA0LiBUaGUgcHJvZmlsZSBjYW4gYmUgdXNlZCB0byBzdXBwb3J0IGxlZ2FjeQorICAgICAgICAgICAgZGlnaXRhbCBUViAoZS5nLiBEVkIpIHN0cmVhbXMuICAgICAgICAgICAqLworICBBQUNfTURfUFJPRklMRV9NUEVHX0xFR0FDWV9QUklPID0KKyAgICAgIDIsIC8qITwgU2ltaWxhciB0byB0aGUgOjpBQUNfTURfUFJPRklMRV9NUEVHX0xFR0FDWSBwcm9maWxlIGJ1dCBpZiBib3RoCisgICAgICAgICAgICB0aGUgYWR2YW5jZWQgKElTTy9JRUMgMTQ0OTY6MyBBTUQgNCkgYW5kIHRoZSBsZWdhY3kgKFBDRSkgTVBFRworICAgICAgICAgICAgZG93bm1peCBtZXRhZGF0YSBhcmUgYXZhaWxhYmxlIHRoZSBsYXR0ZXIgd2lsbCBiZSBhcHBsaWVkLgorICAgICAgICAgICovCisgIEFBQ19NRF9QUk9GSUxFX0FSSUJfSkFQQU4gPQorICAgICAgMyAvKiE8IERvd25taXggY3JlYXRpb24gYXMgZGVzY3JpYmVkIGluIEFCTlQgTkJSIDE1NjAyLTIuIEJ1dCBpZiBhZHZhbmNlZAorICAgICAgICAgICAgIGRvd25taXggbWV0YWRhdGEgKElTTy9JRUMgMTQ0OTY6MyBBTUQgNCkgaXMgYXZhaWxhYmxlIGl0IHdpbGwgYmUKKyAgICAgICAgICAgICBwcmVmZXJyZWQgYmVjYXVzZSBvZiB0aGUgaGlnaGVyIHJlc29sdXRpb25zLiBJbiBhZGRpdGlvbiB0aGUKKyAgICAgICAgICAgbWV0YWRhdGEgZXhwaXJ5IHRpbWUgd2lsbCBiZSBzZXQgdG8gdGhlIHZhbHVlIGRlZmluZWQgaW4gdGhlIEFSSUIKKyAgICAgICAgICAgc3RhbmRhcmQgKHNlZSA6OkFBQ19NRVRBREFUQV9FWFBJUllfVElNRSkuCisgICAgICAgICAqLworfSBBQUNfTURfUFJPRklMRTsKKworLyohIFxlbnVtICBBQUNfRFJDX0RFRkFVTFRfUFJFU0VOVEFUSU9OX01PREVfT1BUSU9OUworICogIFxicmllZiBPcHRpb25zIGZvciBoYW5kbGluZyBvZiBEUkMgcGFyYW1ldGVycywgaWYgcHJlc2VudGF0aW9uIG1vZGUgaXMgbm90IGluZGljYXRlZCBpbiBiaXRzdHJlYW0KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgQUFDX0RSQ19QQVJBTUVURVJfSEFORExJTkdfRElTQUJMRUQgPSAtMSwgLyohPCBEUkMgcGFyYW1ldGVyIGhhbmRsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkLCBhbGwgcGFyYW1ldGVycyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGllZCBhcyByZXF1ZXN0ZWQuICovCisgIEFBQ19EUkNfUEFSQU1FVEVSX0hBTkRMSU5HX0VOQUJMRUQgPQorICAgICAgMCwgLyohPCBBcHBseSBjaGFuZ2VzIHRvIHJlcXVlc3RlZCBEUkMgcGFyYW1ldGVycyB0byBwcmV2ZW50IGNsaXBwaW5nLiAqLworICBBQUNfRFJDX1BSRVNFTlRBVElPTl9NT0RFXzFfREVGQVVMVCA9CisgICAgICAxLCAvKiE8IFVzZSBEUkMgcHJlc2VudGF0aW9uIG1vZGUgMSBhcyBkZWZhdWx0IChlLmcuIGZvciBOb3JkaWcpICovCisgIEFBQ19EUkNfUFJFU0VOVEFUSU9OX01PREVfMl9ERUZBVUxUID0KKyAgICAgIDIgLyohPCBVc2UgRFJDIHByZXNlbnRhdGlvbiBtb2RlIDIgYXMgZGVmYXVsdCAoZS5nLiBmb3IgRFRHIERCb29rKSAqLworfSBBQUNfRFJDX0RFRkFVTFRfUFJFU0VOVEFUSU9OX01PREVfT1BUSU9OUzsKIAogLyoqCiAgKiBcYnJpZWYgQUFDIGRlY29kZXIgc2V0dGluZyBwYXJhbWV0ZXJzCiAgKi8KLXR5cGVkZWYgZW51bQotewotICBBQUNfUENNX09VVFBVVF9JTlRFUkxFQVZFRCAgICAgICAgICAgICAgPSAweDAwMDAsICAvKiE8IFBDTSBvdXRwdXQgbW9kZSAoMTogaW50ZXJsZWF2ZWQgKGRlZmF1bHQpOyAwOiBub3QgaW50ZXJsZWF2ZWQpLiAqLwotICBBQUNfUENNX0RVQUxfQ0hBTk5FTF9PVVRQVVRfTU9ERSAgICAgICAgPSAweDAwMDIsICAvKiE8IERlZmluZXMgaG93IHRoZSBkZWNvZGVyIHByb2Nlc3NlcyB0d28gY2hhbm5lbCBzaWduYWxzOiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IExlYXZlIGJvdGggc2lnbmFscyBhcyB0aGV5IGFyZSAoZGVmYXVsdCkuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogQ3JlYXRlIGEgZHVhbCBtb25vIG91dHB1dCBzaWduYWwgZnJvbSBjaGFubmVsIDEuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogQ3JlYXRlIGEgZHVhbCBtb25vIG91dHB1dCBzaWduYWwgZnJvbSBjaGFubmVsIDIuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzogQ3JlYXRlIGEgZHVhbCBtb25vIG91dHB1dCBzaWduYWwgYnkgbWl4aW5nIGJvdGggY2hhbm5lbHMgKEwnID0gUicgPSAwLjUqQ2gxICsgMC41KkNoMikuICovCi0gIEFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORyAgICAgICAgICA9IDB4MDAwMywgIC8qITwgT3V0cHV0IGJ1ZmZlciBjaGFubmVsIG9yZGVyaW5nLiAwOiBNUEVHIFBDRSBzdHlsZSBvcmRlciwgMTogV0FWIGZpbGUgY2hhbm5lbCBvcmRlciAoZGVmYXVsdCkuICovCi0gIEFBQ19QQ01fTElNSVRFUl9FTkFCTEUgICAgICAgICAgICAgICAgICA9IDB4MDAwNCwgIC8qITwgRW5hYmxlIHNpZ25hbCBsZXZlbCBsaW1pdGluZy4gXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTogQXV0by1jb25maWcuIEVuYWJsZSBsaW1pdGVyIGZvciBhbGwgbm9uLWxvd2RlbGF5IGNvbmZpZ3VyYXRpb25zIGJ5IGRlZmF1bHQuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IERpc2FibGUgbGltaXRlciBpbiBnZW5lcmFsLiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBFbmFibGUgbGltaXRlciBhbHdheXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdG8gY2FsbCB0aGUgZGVjb2RlciB3aXRoIGEgQUFDREVDX0NMUkhJU1QgZmxhZyB0byByZXNldCBhbGwgc3RhdGVzIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGltaXRlciBzd2l0Y2ggaXMgY2hhbmdlZCBleHBsaWNpdGx5LiAqLwotICBBQUNfUENNX0xJTUlURVJfQVRUQUNLX1RJTUUgICAgICAgICAgICAgPSAweDAwMDUsICAvKiE8IFNpZ25hbCBsZXZlbCBsaW1pdGluZyBhdHRhY2sgdGltZSBpbiBtcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGNvbmZndXJhdGlvbiBpcyAxNSBtcy4gQWRqdXN0YWJsZSByYW5nZSBmcm9tIDEgbXMgdG8gMTUgbXMuICovCi0gIEFBQ19QQ01fTElNSVRFUl9SRUxFQVNfVElNRSAgICAgICAgICAgICA9IDB4MDAwNiwgIC8qITwgU2lnbmFsIGxldmVsIGxpbWl0aW5nIHJlbGVhc2UgdGltZSBpbiBtcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgNTAgbXMuIEFkanVzdGFibGUgdGltZSBtdXN0IGJlIGxhcmdlciB0aGFuIDAgbXMuICovCi0gIEFBQ19QQ01fTUlOX09VVFBVVF9DSEFOTkVMUyAgICAgICAgICAgICA9IDB4MDAxMSwgIC8qITwgTWluaW11bSBudW1iZXIgb2YgUENNIG91dHB1dCBjaGFubmVscy4gSWYgaGlnaGVyIHRoYW4gdGhlIG51bWJlciBvZiBlbmNvZGVkIGF1ZGlvIGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgc2ltcGxlIGNoYW5uZWwgZXh0ZW5zaW9uIGlzIGFwcGxpZWQuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIDA6IERpc2FibGUgY2hhbm5lbCBleHRlbnN0aW9uIGZlYXR1cmUuIFRoZSBkZWNvZGVyIG91dHB1dCBjb250YWlucyB0aGUgc2FtZSBudW1iZXIgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgYXMgdGhlIGVuY29kZWQgYml0c3RyZWFtLiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiAgICBUaGlzIHZhbHVlIGlzIGN1cnJlbnRseSBuZWVkZWQgb25seSB0b2dldGhlciB3aXRoIHRoZSBtaXgtZG93biBmZWF0dXJlLiBTZWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpBQUNfUENNX01BWF9PVVRQVVRfQ0hBTk5FTFMgYW5kIG5vdGUgMiBiZWxvdy4gXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogICAgRW5jb2RlZCBtb25vIHNpZ25hbHMgd2lsbCBiZSBkdXBsaWNhdGVkIHRvIGFjaGlldmUgYSAyLzAvMC4wIGNoYW5uZWwgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY6ICAgIFRoZSBkZWNvZGVyIHRyeXMgdG8gcmVvcmRlciBlbmNvZGVkIHNpZ25hbHMgd2l0aCBsZXNzIHRoYW4gc2l4IGNoYW5uZWxzIHRvIGFjaGlldmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAzLzAvMi4xIGNoYW5uZWwgb3V0cHV0IHNpZ25hbC4gTWlzc2luZyBjaGFubmVscyB3aWxsIGJlIGZpbGxlZCB3aXRoIGEgemVybyBzaWduYWwuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHJlb3JkZXJpbmcgaXMgbm90IHBvc3NpYmxlIHRoZSBlbXB0eSBjaGFubmVscyB3aWxsIHNpbXBseSBiZSBhcHBlbmRlZC4gT25seQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgaWYgaW5zdGFuY2UgaXMgY29uZmlndXJlZCB0byBzdXBwb3J0IG11bHRpY2hhbm5lbCBvdXRwdXQuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg6ICAgIFRoZSBkZWNvZGVyIHRyeXMgdG8gcmVvcmRlciBlbmNvZGVkIHNpZ25hbHMgd2l0aCBsZXNzIHRoYW4gZWlnaHQgY2hhbm5lbHMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNoaWV2ZSBhIDMvMC80LjEgY2hhbm5lbCBvdXRwdXQgc2lnbmFsLiBNaXNzaW5nIGNoYW5uZWxzIHdpbGwgYmUgZmlsbGVkIHdpdGggYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvIHNpZ25hbC4gSWYgcmVvcmRlcmluZyBpcyBub3QgcG9zc2libGUgdGhlIGVtcHR5IGNoYW5uZWxzIHdpbGwgc2ltcGx5IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZGVkLiBPbmx5IGF2YWlsYWJsZSBpZiBpbnN0YW5jZSBpcyBjb25maWd1cmVkIHRvIHN1cHBvcnQgbXVsdGljaGFubmVsIG91dHB1dC5cbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLiBUaGUgY2hhbm5lbCBzaWduYWxsaW5nIChDU3RyZWFtSW5mbzo6cENoYW5uZWxUeXBlIGFuZCBDU3RyZWFtSW5mbzo6cENoYW5uZWxJbmRpY2VzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBub3QgYmUgbW9kaWZpZWQuIEFkZGVkIGVtcHR5IGNoYW5uZWxzIHdpbGwgYmUgc2lnbmFsbGVkIHdpdGggY2hhbm5lbCB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX1RZUEU6OkFDVF9OT05FLiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4gSWYgdGhlIHBhcmFtZXRlciB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhhdCBvZiA6OkFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUyBib3RoIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZS4gXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuIFRoaXMgcGFyYW1ldGVyIGRvZXMgbm90IGFmZmVjdCBNUEVHIFN1cnJvdW5kIHByb2Nlc3NpbmcuICovCi0gIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUyAgICAgICAgICAgICA9IDB4MDAxMiwgIC8qITwgTWF4aW11bSBudW1iZXIgb2YgUENNIG91dHB1dCBjaGFubmVscy4gSWYgbG93ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGVuY29kZWQgYXVkaW8gY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peGluZyBpcyBhcHBsaWVkIGFjY29yZGluZ2x5LiBJZiBkZWRpY2F0ZWQgbWV0YWRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSBzdHJlYW0gaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQgdG8gYWNoaWV2ZSBiZXR0ZXIgbWl4aW5nIHJlc3VsdHMuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIDA6IERpc2FibGUgZG93bm1peGluZyBmZWF0dXJlLiBUaGUgZGVjb2RlciBvdXRwdXQgY29udGFpbnMgdGhlIHNhbWUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHRoZSBlbmNvZGVkIGJpdHN0cmVhbS4gXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogICAgQWxsIGVuY29kZWQgYXVkaW8gY29uZmlndXJhdGlvbnMgd2l0aCBtb3JlIHRoYW4gb25lIGNoYW5uZWwgd2lsbCBiZSBtaXhlZCBkb3duIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBtb25vIG91dHB1dCBzaWduYWwuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6ICAgIFRoZSBkZWNvZGVyIHBlcmZvcm1zIGEgc3RlcmVvIG1peC1kb3duIGlmIHRoZSBudW1iZXIgZW5jb2RlZCBhdWRpbyBjaGFubmVscyBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gdHdvLiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2OiAgICBJZiB0aGUgbnVtYmVyIG9mIGVuY29kZWQgYXVkaW8gY2hhbm5lbHMgaXMgZ3JlYXRlciB0aGFuIHNpeCB0aGUgZGVjb2RlciBwZXJmb3JtcyBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC1kb3duIHRvIG1lZXQgdGhlIHRhcmdldCBvdXRwdXQgY29uZmlndXJhdGlvbiBvZiAzLzAvMi4xIGNoYW5uZWxzLiBPbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBpZiBpbnN0YW5jZSBpcyBjb25maWd1cmVkIHRvIHN1cHBvcnQgbXVsdGljaGFubmVsIG91dHB1dC4gXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODogICAgVGhpcyB2YWx1ZSBpcyBjdXJyZW50bHkgbmVlZGVkIG9ubHkgdG9nZXRoZXIgd2l0aCB0aGUgY2hhbm5lbCBleHRlbnNpb24gZmVhdHVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIDo6QUFDX1BDTV9NSU5fT1VUUFVUX0NIQU5ORUxTIGFuZCBub3RlIDIgYmVsb3cuIE9ubHkgYXZhaWxhYmxlIGlmIGluc3RhbmNlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBtdWx0aWNoYW5uZWwgb3V0cHV0LiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLiBEb3duLW1peGluZyBvZiBhbnkgc2V2ZW4gb3IgZWlnaHQgY2hhbm5lbCBjb25maWd1cmF0aW9uIG5vdCBkZWZpbmVkIGluIElTTy9JRUMgMTQ0OTYtMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERBTSA0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBzb2Z0d2FyZSB2ZXJzaW9uLiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4gSWYgdGhlIHBhcmFtZXRlciB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gemVybyBidXQgc21hbGxlciB0aGFuIDo6QUFDX1BDTV9NSU5fT1VUUFVUX0NIQU5ORUxTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3RoIHdpbGwgYmUgc2V0IHRvIHNhbWUgdmFsdWUuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLiBUaGUgb3BlcmF0aW5nIG1vZGUgb2YgdGhlIE1QRUcgU3Vycm91bmQgbW9kdWxlIHdpbGwgYmUgc2V0IGFjY29yZGluZ2x5LiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC4gU2V0dGluZyB0aGlzIHBhcmFtIHdpdGggYW55IHZhbHVlIHdpbGwgZGlzYWJsZSB0aGUgYmluYXVyYWwgcHJvY2Vzc2luZyBvZiB0aGUgTVBFRwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vycm91bmQgbW9kdWxlICg6OkFBQ19NUEVHU19CSU5BVVJBTF9FTkFCTEU9MCkuICovCit0eXBlZGVmIGVudW0geworICBBQUNfUENNX0RVQUxfQ0hBTk5FTF9PVVRQVVRfTU9ERSA9CisgICAgICAweDAwMDIsIC8qITwgRGVmaW5lcyBob3cgdGhlIGRlY29kZXIgcHJvY2Vzc2VzIHR3byBjaGFubmVsIHNpZ25hbHM6IFxuCisgICAgICAgICAgICAgICAgICAgMDogTGVhdmUgYm90aCBzaWduYWxzIGFzIHRoZXkgYXJlIChkZWZhdWx0KS4gXG4KKyAgICAgICAgICAgICAgICAgICAxOiBDcmVhdGUgYSBkdWFsIG1vbm8gb3V0cHV0IHNpZ25hbCBmcm9tIGNoYW5uZWwgMS4gXG4KKyAgICAgICAgICAgICAgICAgICAyOiBDcmVhdGUgYSBkdWFsIG1vbm8gb3V0cHV0IHNpZ25hbCBmcm9tIGNoYW5uZWwgMi4gXG4KKyAgICAgICAgICAgICAgICAgICAzOiBDcmVhdGUgYSBkdWFsIG1vbm8gb3V0cHV0IHNpZ25hbCBieSBtaXhpbmcgYm90aCBjaGFubmVscworICAgICAgICAgICAgICAgICAoTCcgPSBSJyA9IDAuNSpDaDEgKyAwLjUqQ2gyKS4gKi8KKyAgQUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HID0KKyAgICAgIDB4MDAwMywgLyohPCBPdXRwdXQgYnVmZmVyIGNoYW5uZWwgb3JkZXJpbmcuIDA6IE1QRUcgUENFIHN0eWxlIG9yZGVyLCAxOgorICAgICAgICAgICAgICAgICBXQVYgZmlsZSBjaGFubmVsIG9yZGVyIChkZWZhdWx0KS4gKi8KKyAgQUFDX1BDTV9MSU1JVEVSX0VOQUJMRSA9CisgICAgICAweDAwMDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgc2lnbmFsIGxldmVsIGxpbWl0aW5nLiBcbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE6IEF1dG8tY29uZmlnLiBFbmFibGUgbGltaXRlciBmb3IgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLWxvd2RlbGF5IGNvbmZpZ3VyYXRpb25zIGJ5IGRlZmF1bHQuIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogRGlzYWJsZSBsaW1pdGVyIGluIGdlbmVyYWwuIFxuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogRW5hYmxlIGxpbWl0ZXIgYWx3YXlzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdG8gY2FsbCB0aGUgZGVjb2RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBBQUNERUNfQ0xSSElTVCBmbGFnIHRvIHJlc2V0IGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlcyB3aGVuICAgICAgdGhlIGxpbWl0ZXIgc3dpdGNoIGlzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsaWNpdGx5LiAqLworICBBQUNfUENNX0xJTUlURVJfQVRUQUNLX1RJTUUgPSAweDAwMDUsIC8qITwgU2lnbmFsIGxldmVsIGxpbWl0aW5nIGF0dGFjayB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gbXMuIERlZmF1bHQgY29uZmlndXJhdGlvbiBpcyAxNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zLiBBZGp1c3RhYmxlIHJhbmdlIGZyb20gMSBtcyB0byAxNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zLiAqLworICBBQUNfUENNX0xJTUlURVJfUkVMRUFTX1RJTUUgPSAweDAwMDYsIC8qITwgU2lnbmFsIGxldmVsIGxpbWl0aW5nIHJlbGVhc2UgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1zLiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgNTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcy4gQWRqdXN0YWJsZSB0aW1lIG11c3QgYmUgbGFyZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhbiAwIG1zLiAqLworICBBQUNfUENNX01JTl9PVVRQVVRfQ0hBTk5FTFMgPQorICAgICAgMHgwMDExLCAvKiE8IE1pbmltdW0gbnVtYmVyIG9mIFBDTSBvdXRwdXQgY2hhbm5lbHMuIElmIGhpZ2hlciB0aGFuIHRoZQorICAgICAgICAgICAgICAgICBudW1iZXIgb2YgZW5jb2RlZCBhdWRpbyBjaGFubmVscywgYSBzaW1wbGUgY2hhbm5lbCBleHRlbnNpb24gaXMKKyAgICAgICAgICAgICAgICAgYXBwbGllZCAoc2VlIG5vdGUgNCBmb3IgZXhjZXB0aW9ucykuIFxuIC0xLCAwOiBEaXNhYmxlIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uIGZlYXR1cmUuIFRoZSBkZWNvZGVyIG91dHB1dCBjb250YWlucyB0aGUgc2FtZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgb2YgY2hhbm5lbHMgYXMgdGhlIGVuY29kZWQgYml0c3RyZWFtLiBcbiAxOiAgICBUaGlzIHZhbHVlIGlzCisgICAgICAgICAgICAgICAgIGN1cnJlbnRseSBuZWVkZWQgb25seSB0b2dldGhlciB3aXRoIHRoZSBtaXgtZG93biBmZWF0dXJlLiBTZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOjpBQUNfUENNX01BWF9PVVRQVVRfQ0hBTk5FTFMgYW5kIG5vdGUgMiBiZWxvdy4gXG4KKyAgICAgICAgICAgICAgICAgICAgMjogICAgRW5jb2RlZCBtb25vIHNpZ25hbHMgd2lsbCBiZSBkdXBsaWNhdGVkIHRvIGFjaGlldmUgYQorICAgICAgICAgICAgICAgICAyLzAvMC4wIGNoYW5uZWwgb3V0cHV0IGNvbmZpZ3VyYXRpb24uIFxuIDY6ICAgIFRoZSBkZWNvZGVyCisgICAgICAgICAgICAgICAgIHRyaWVzIHRvIHJlb3JkZXIgZW5jb2RlZCBzaWduYWxzIHdpdGggbGVzcyB0aGFuIHNpeCBjaGFubmVscyB0bworICAgICAgICAgICAgICAgICBhY2hpZXZlIGEgMy8wLzIuMSBjaGFubmVsIG91dHB1dCBzaWduYWwuIE1pc3NpbmcgY2hhbm5lbHMgd2lsbAorICAgICAgICAgICAgICAgICBiZSBmaWxsZWQgd2l0aCBhIHplcm8gc2lnbmFsLiBJZiByZW9yZGVyaW5nIGlzIG5vdCBwb3NzaWJsZSB0aGUKKyAgICAgICAgICAgICAgICAgZW1wdHkgY2hhbm5lbHMgd2lsbCBzaW1wbHkgYmUgYXBwZW5kZWQuIE9ubHkgYXZhaWxhYmxlIGlmCisgICAgICAgICAgICAgICAgIGluc3RhbmNlIGlzIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBtdWx0aWNoYW5uZWwgb3V0cHV0LiBcbiA4OgorICAgICAgICAgICAgICAgICBUaGUgZGVjb2RlciB0cmllcyB0byByZW9yZGVyIGVuY29kZWQgc2lnbmFscyB3aXRoIGxlc3MgdGhhbgorICAgICAgICAgICAgICAgICBlaWdodCBjaGFubmVscyB0byBhY2hpZXZlIGEgMy8wLzQuMSBjaGFubmVsIG91dHB1dCBzaWduYWwuCisgICAgICAgICAgICAgICAgIE1pc3NpbmcgY2hhbm5lbHMgd2lsbCBiZSBmaWxsZWQgd2l0aCBhIHplcm8gc2lnbmFsLiBJZgorICAgICAgICAgICAgICAgICByZW9yZGVyaW5nIGlzIG5vdCBwb3NzaWJsZSB0aGUgZW1wdHkgY2hhbm5lbHMgd2lsbCBzaW1wbHkgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kZWQuIE9ubHkgYXZhaWxhYmxlIGlmIGluc3RhbmNlIGlzIGNvbmZpZ3VyZWQgdG8KKyAgICAgICAgICAgICAgICAgc3VwcG9ydCBtdWx0aWNoYW5uZWwgb3V0cHV0LlxuIE5PVEU6IFxuCisgICAgICAgICAgICAgICAgICAgICAxLiBUaGUgY2hhbm5lbCBzaWduYWxpbmcgKENTdHJlYW1JbmZvOjpwQ2hhbm5lbFR5cGUgYW5kCisgICAgICAgICAgICAgICAgIENTdHJlYW1JbmZvOjpwQ2hhbm5lbEluZGljZXMpIHdpbGwgbm90IGJlIG1vZGlmaWVkLiBBZGRlZCBlbXB0eQorICAgICAgICAgICAgICAgICBjaGFubmVscyB3aWxsIGJlIHNpZ25hbGVkIHdpdGggY2hhbm5lbCB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX1RZUEU6OkFDVF9OT05FLiBcbgorICAgICAgICAgICAgICAgICAgICAgMi4gSWYgdGhlIHBhcmFtZXRlciB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhhdCBvZgorICAgICAgICAgICAgICAgICA6OkFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUyBib3RoIHdpbGwgYmUgc2V0IHRvIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgIHZhbHVlLiBcbgorICAgICAgICAgICAgICAgICAgICAgMy4gVGhpcyBwYXJhbWV0ZXIgZG9lcyBub3QgYWZmZWN0IE1QRUcgU3Vycm91bmQgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgICAgICAgXG4KKyAgICAgICAgICAgICAgICAgICAgIDQuIFRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgaWdub3JlZCBpZiB0aGUgbnVtYmVyIG9mIGVuY29kZWQKKyAgICAgICAgICAgICAgICAgYXVkaW8gY2hhbm5lbHMgaXMgZ3JlYXRlciB0aGFuIDguICovCisgIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUyA9CisgICAgICAweDAwMTIsIC8qITwgTWF4aW11bSBudW1iZXIgb2YgUENNIG91dHB1dCBjaGFubmVscy4gSWYgbG93ZXIgdGhhbiB0aGUKKyAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGVuY29kZWQgYXVkaW8gY2hhbm5lbHMsIGRvd25taXhpbmcgaXMgYXBwbGllZAorICAgICAgICAgICAgICAgICBhY2NvcmRpbmdseSAoc2VlIG5vdGUgNSBmb3IgZXhjZXB0aW9ucykuIElmIGRlZGljYXRlZCBtZXRhZGF0YQorICAgICAgICAgICAgICAgICBpcyBhdmFpbGFibGUgaW4gdGhlIHN0cmVhbSBpdCB3aWxsIGJlIHVzZWQgdG8gYWNoaWV2ZSBiZXR0ZXIKKyAgICAgICAgICAgICAgICAgbWl4aW5nIHJlc3VsdHMuIFxuIC0xLCAwOiBEaXNhYmxlIGRvd25taXhpbmcgZmVhdHVyZS4gVGhlCisgICAgICAgICAgICAgICAgIGRlY29kZXIgb3V0cHV0IGNvbnRhaW5zIHRoZSBzYW1lIG51bWJlciBvZiBjaGFubmVscyBhcyB0aGUKKyAgICAgICAgICAgICAgICAgZW5jb2RlZCBiaXRzdHJlYW0uIFxuIDE6ICAgIEFsbCBlbmNvZGVkIGF1ZGlvIGNvbmZpZ3VyYXRpb25zCisgICAgICAgICAgICAgICAgIHdpdGggbW9yZSB0aGFuIG9uZSBjaGFubmVsIHdpbGwgYmUgbWl4ZWQgZG93biB0byBvbmUgbW9ubworICAgICAgICAgICAgICAgICBvdXRwdXQgc2lnbmFsLiBcbiAyOiAgICBUaGUgZGVjb2RlciBwZXJmb3JtcyBhIHN0ZXJlbyBtaXgtZG93bgorICAgICAgICAgICAgICAgICBpZiB0aGUgbnVtYmVyIGVuY29kZWQgYXVkaW8gY2hhbm5lbHMgaXMgZ3JlYXRlciB0aGFuIHR3by4gXG4gNjoKKyAgICAgICAgICAgICAgICAgSWYgdGhlIG51bWJlciBvZiBlbmNvZGVkIGF1ZGlvIGNoYW5uZWxzIGlzIGdyZWF0ZXIgdGhhbiBzaXggdGhlCisgICAgICAgICAgICAgICAgIGRlY29kZXIgcGVyZm9ybXMgYSBtaXgtZG93biB0byBtZWV0IHRoZSB0YXJnZXQgb3V0cHV0CisgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gb2YgMy8wLzIuMSBjaGFubmVscy4gT25seSBhdmFpbGFibGUgaWYgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgaXMgY29uZmlndXJlZCB0byBzdXBwb3J0IG11bHRpY2hhbm5lbCBvdXRwdXQuIFxuIDg6ICAgIFRoaXMKKyAgICAgICAgICAgICAgICAgdmFsdWUgaXMgY3VycmVudGx5IG5lZWRlZCBvbmx5IHRvZ2V0aGVyIHdpdGggdGhlIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uIGZlYXR1cmUuIFNlZSA6OkFBQ19QQ01fTUlOX09VVFBVVF9DSEFOTkVMUyBhbmQgbm90ZSAyCisgICAgICAgICAgICAgICAgIGJlbG93LiBPbmx5IGF2YWlsYWJsZSBpZiBpbnN0YW5jZSBpcyBjb25maWd1cmVkIHRvIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgbXVsdGljaGFubmVsIG91dHB1dC4gXG4gTk9URTogXG4KKyAgICAgICAgICAgICAgICAgICAgIDEuIERvd24tbWl4aW5nIG9mIGFueSBzZXZlbiBvciBlaWdodCBjaGFubmVsIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgbm90IGRlZmluZWQgaW4gSVNPL0lFQyAxNDQ5Ni0zIFBEQU0gNCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMKKyAgICAgICAgICAgICAgICAgc29mdHdhcmUgdmVyc2lvbi4gXG4KKyAgICAgICAgICAgICAgICAgICAgIDIuIElmIHRoZSBwYXJhbWV0ZXIgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHplcm8gYnV0IHNtYWxsZXIKKyAgICAgICAgICAgICAgICAgdGhhbiA6OkFBQ19QQ01fTUlOX09VVFBVVF9DSEFOTkVMUyBib3RoIHdpbGwgYmUgc2V0IHRvIHNhbWUKKyAgICAgICAgICAgICAgICAgdmFsdWUuIFxuCisgICAgICAgICAgICAgICAgICAgICAzLiBUaGUgb3BlcmF0aW5nIG1vZGUgb2YgdGhlIE1QRUcgU3Vycm91bmQgbW9kdWxlIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgc2V0IGFjY29yZGluZ2x5LiBcbgorICAgICAgICAgICAgICAgICAgICAgNC4gU2V0dGluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueSB2YWx1ZSB3aWxsIGRpc2FibGUgdGhlCisgICAgICAgICAgICAgICAgIGJpbmF1cmFsIHByb2Nlc3Npbmcgb2YgdGhlIE1QRUcgU3Vycm91bmQgbW9kdWxlCisgICAgICAgICAgICAgICAgICAgICA1LiBUaGlzIHBhcmFtZXRlciB3aWxsIGJlIGlnbm9yZWQgaWYgdGhlIG51bWJlciBvZiBlbmNvZGVkCisgICAgICAgICAgICAgICAgIGF1ZGlvIGNoYW5uZWxzIGlzIGdyZWF0ZXIgdGhhbiA4LiAqLworICBBQUNfTUVUQURBVEFfUFJPRklMRSA9CisgICAgICAweDAwMjAsIC8qITwgU2VlIDo6QUFDX01EX1BST0ZJTEUgZm9yIGFsbCBhdmFpbGFibGUgdmFsdWVzLiAqLworICBBQUNfTUVUQURBVEFfRVhQSVJZX1RJTUUgPSAweDAwMjEsIC8qITwgRGVmaW5lcyB0aGUgdGltZSBpbiBtcyBhZnRlciB3aGljaCBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGFzc29jaWF0ZWQgbWV0YS1kYXRhIChEUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peCBjb2VmZmljaWVudHMsIC4uLikgd2lsbCBiZSByZXNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGRlZmF1bHQgaWYgbm8gdXBkYXRlIGhhcyBiZWVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQuIE5lZ2F0aXZlIHZhbHVlcyBkaXNhYmxlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuICovCiAKLSAgQUFDX0NPTkNFQUxfTUVUSE9EICAgICAgICAgICAgICAgICAgICAgID0gMHgwMTAwLCAgLyohPCBFcnJvciBjb25jZWFsbWVudDogUHJvY2Vzc2luZyBtZXRob2QuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogU3BlY3RyYWwgbXV0aW5nLiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IE5vaXNlIHN1YnN0aXR1dGlvbiAoc2VlIDo6Q09OQ0VBTF9OT0lTRSkuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogRW5lcmd5IGludGVycG9sYXRpb24gKGFkZHMgYWRkaXRpb25hbCBzaWduYWwgZGVsYXkgb2Ygb25lIGZyYW1lLCBzZWUgOjpDT05DRUFMX0lOVEVSKS4gXG4gKi8KLQotICBBQUNfRFJDX0JPT1NUX0ZBQ1RPUiAgICAgICAgICAgICAgICAgICAgPSAweDAyMDAsICAvKiE8IER5bmFtaWMgUmFuZ2UgQ29udHJvbDogU2NhbGluZyBmYWN0b3IgZm9yIGJvb3N0aW5nIGdhaW4gdmFsdWVzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZXMgaG93IHRoZSBib29zdGluZyBEUkMgZmFjdG9ycyAoY29udmV5ZWQgaW4gdGhlIGJpdHN0cmVhbSkgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQgc2lnbmFsLiBUaGUgdmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCAoZG9uJ3QgYXBwbHkgYm9vc3QgZmFjdG9ycykgdG8gMTI3IChmdWxseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5IGFsbCBib29zdGluZyBmYWN0b3JzKS4gKi8KLSAgQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IgICAgICAgICAgICAgID0gMHgwMjAxLCAgLyohPCBEeW5hbWljIFJhbmdlIENvbnRyb2w6IFNjYWxpbmcgZmFjdG9yIGZvciBhdHRlbnVhdGluZyBnYWluIHZhbHVlcy4gU2FtZSBhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ19EUkNfQk9PU1RfRkFDVE9SIGJ1dCBmb3IgYXR0ZW51YXRpbmcgRFJDIGZhY3RvcnMuICovCi0gIEFBQ19EUkNfUkVGRVJFTkNFX0xFVkVMICAgICAgICAgICAgICAgICA9IDB4MDIwMiwgIC8qITwgRHluYW1pYyBSYW5nZSBDb250cm9sOiBUYXJnZXQgcmVmZXJlbmNlIGxldmVsLiBEZWZpbmVzIHRoZSBsZXZlbCBiZWxvdyBmdWxsLXNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHF1YW50aXplZCBpbiBzdGVwcyBvZiAwLjI1ZEIpIHRvIHdoaWNoIHRoZSBvdXRwdXQgYXVkaW8gc2lnbmFsIHdpbGwgYmUgbm9ybWFsaXplZCB0byBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBEUkMgbW9kdWxlLiBUaGUgdmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCAoZnVsbC1zY2FsZSkgdG8gMTI3ICgzMS43NSBkQiBiZWxvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGwtc2NhbGUpLiBUaGUgdmFsdWUgc21hbGxlciB0aGFuIDAgc3dpdGNoZXMgb2ZmIG5vcm1hbGl6YXRpb24uICovCi0gIEFBQ19EUkNfSEVBVllfQ09NUFJFU1NJT04gICAgICAgICAgICAgICA9IDB4MDIwMywgIC8qITwgRHluYW1pYyBSYW5nZSBDb250cm9sOiBFbi0vRGlzYWJsZSBEVkIgc3BlY2lmaWMgaGVhdnkgY29tcHJlc3Npb24gKGFrYSBSRiBtb2RlKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gMSwgdGhlIGRlY29kZXIgd2lsbCBhcHBseSB0aGUgY29tcHJlc3Npb24gdmFsdWVzIGZyb20gdGhlIERWQiBzcGVjaWZpYyBhbmNpbGxhcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGZpZWxkLiBBdCB0aGUgc2FtZSB0aW1lIHRoZSBNUEVHLTQgRHluYW1pYyBSYW5nZSBDb250cm9sIHRvb2wgd2lsbCBiZSBkaXNhYmxlZC4gQnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGhlYXZ5IGNvbXByZXNzaW9uIGlzIGRpc2FibGVkLiAqLwotCi0gIEFBQ19RTUZfTE9XUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDMwMCwgIC8qITwgUXVhZHJhdHVyZSBNaXJyb3IgRmlsdGVyIChRTUYpIEJhbmsgcHJvY2Vzc2luZyBtb2RlLiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOiBVc2UgaW50ZXJuYWwgZGVmYXVsdC4gSW1wbGllcyBNUEVHIFN1cnJvdW5kIHBhcnRpYWxseSBjb21wbGV4IGFjY29yZGluZ2x5LiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBVc2UgY29tcGxleCBRTUYgZGF0YSBtb2RlLiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBVc2UgcmVhbCAobG93IHBvd2VyKSBRTUYgZGF0YSBtb2RlLiBcbiAqLwotCi0gIEFBQ19NUEVHU19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMCwgIC8qITwgTVBFRyBTdXJyb3VuZDogQWxsb3cvRGlzYWJsZSBkZWNvZGluZyBvZiBNUFMgY29udGVudC4gQXZhaWxhYmxlIG9ubHkgZm9yIGRlY29kZXJzIHdpdGggTVBFRwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cnJvdW5kIHN1cHBvcnQuICovCi0KLSAgQUFDX1RQREVDX0NMRUFSX0JVRkZFUiAgICAgICAgICAgICAgICAgID0gMHgwNjAzICAgLyohPCBDbGVhciBpbnRlcm5hbCBiaXQgc3RyZWFtIGJ1ZmZlciBvZiB0cmFuc3BvcnQgbGF5ZXJzLiBUaGUgZGVjb2RlciB3aWxsIHN0YXJ0IGRlY29kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgbmV3IGRhdGEgcGFzc2VkIGFmdGVyIHRoaXMgZXZlbnQgYW5kIGFueSBwcmV2aW91cyBkYXRhIGlzIGRpc2NhcmRlZC4gKi8KKyAgQUFDX0NPTkNFQUxfTUVUSE9EID0gMHgwMTAwLCAvKiE8IEVycm9yIGNvbmNlYWxtZW50OiBQcm9jZXNzaW5nIG1ldGhvZC4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IFNwZWN0cmFsIG11dGluZy4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IE5vaXNlIHN1YnN0aXR1dGlvbiAoc2VlIDo6Q09OQ0VBTF9OT0lTRSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gMjogRW5lcmd5IGludGVycG9sYXRpb24gKGFkZHMgYWRkaXRpb25hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCBkZWxheSBvZiBvbmUgZnJhbWUsIHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6Q09OQ0VBTF9JTlRFUi4gb25seSBzb21lIEFPVHMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkKS4gXG4gKi8KKyAgQUFDX0RSQ19CT09TVF9GQUNUT1IgPQorICAgICAgMHgwMjAwLCAvKiE8IER5bmFtaWMgUmFuZ2UgQ29udHJvbDogU2NhbGluZyBmYWN0b3IgZm9yIGJvb3N0aW5nIGdhaW4KKyAgICAgICAgICAgICAgICAgdmFsdWVzLiBEZWZpbmVzIGhvdyB0aGUgYm9vc3RpbmcgRFJDIGZhY3RvcnMgKGNvbnZleWVkIGluIHRoZQorICAgICAgICAgICAgICAgICBiaXRzdHJlYW0pIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZGVjb2RlZCBzaWduYWwuIFRoZSB2YWxpZAorICAgICAgICAgICAgICAgICB2YWx1ZXMgcmFuZ2UgZnJvbSAwIChkb24ndCBhcHBseSBib29zdCBmYWN0b3JzKSB0byAxMjcgKGZ1bGx5CisgICAgICAgICAgICAgICAgICAgYXBwbHkgYm9vc3QgZmFjdG9ycykuIERlZmF1bHQgdmFsdWUgaXMgMC4gKi8KKyAgQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IgPQorICAgICAgMHgwMjAxLCAvKiE8IER5bmFtaWMgUmFuZ2UgQ29udHJvbDogU2NhbGluZyBmYWN0b3IgZm9yIGF0dGVudWF0aW5nIGdhaW4KKyAgICAgICAgICAgICAgICAgdmFsdWVzLiBTYW1lIGFzCisgICAgICAgICAgICAgICAgICAgOjpBQUNfRFJDX0JPT1NUX0ZBQ1RPUiBidXQgZm9yIGF0dGVudWF0aW5nIERSQyBmYWN0b3JzLiAqLworICBBQUNfRFJDX1JFRkVSRU5DRV9MRVZFTCA9CisgICAgICAweDAyMDIsIC8qITwgRHluYW1pYyBSYW5nZSBDb250cm9sIChEUkMpOiBUYXJnZXQgcmVmZXJlbmNlIGxldmVsLiBEZWZpbmVzCisgICAgICAgICAgICAgICAgIHRoZSBsZXZlbCBiZWxvdyBmdWxsLXNjYWxlIChxdWFudGl6ZWQgaW4gc3RlcHMgb2YgMC4yNWRCKSB0bworICAgICAgICAgICAgICAgICB3aGljaCB0aGUgb3V0cHV0IGF1ZGlvIHNpZ25hbCB3aWxsIGJlIG5vcm1hbGl6ZWQgdG8gYnkgdGhlIERSQworICAgICAgICAgICAgICAgICBtb2R1bGUuIFRoZSBwYXJhbWV0ZXIgY29udHJvbHMgbG91ZG5lc3Mgbm9ybWFsaXphdGlvbiBmb3IgYm90aAorICAgICAgICAgICAgICAgICBNUEVHLTQgRFJDIGFuZCBNUEVHLUQgRFJDLiBUaGUgdmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gNDAgKC0xMAorICAgICAgICAgICAgICAgICBkQkZTKSB0byAxMjcgKC0zMS43NSBkQkZTKS4gQW55IHZhbHVlIHNtYWxsZXIgdGhhbiAwIHN3aXRjaGVzCisgICAgICAgICAgICAgICAgIG9mZiBsb3VkbmVzcyBub3JtYWxpemF0aW9uIGFuZCBNUEVHLTQgRFJDLiBCeSBkZWZhdWx0LCBsb3VkbmVzcworICAgICAgICAgICAgICAgICBub3JtYWxpemF0aW9uIGFuZCBNUEVHLTQgRFJDIGlzIHN3aXRjaGVkIG9mZi4gKi8KKyAgQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiA9CisgICAgICAweDAyMDMsIC8qITwgRHluYW1pYyBSYW5nZSBDb250cm9sOiBFbi0vRGlzYWJsZSBEVkIgc3BlY2lmaWMgaGVhdnkKKyAgICAgICAgICAgICAgICAgY29tcHJlc3Npb24gKGFrYSBSRiBtb2RlKS4gSWYgc2V0IHRvIDEsIHRoZSBkZWNvZGVyIHdpbGwgYXBwbHkKKyAgICAgICAgICAgICAgICAgdGhlIGNvbXByZXNzaW9uIHZhbHVlcyBmcm9tIHRoZSBEVkIgc3BlY2lmaWMgYW5jaWxsYXJ5IGRhdGEKKyAgICAgICAgICAgICAgICAgZmllbGQuIEF0IHRoZSBzYW1lIHRpbWUgdGhlIE1QRUctNCBEeW5hbWljIFJhbmdlIENvbnRyb2wgdG9vbAorICAgICAgICAgICAgICAgICB3aWxsIGJlIGRpc2FibGVkLiBCeSBkZWZhdWx0LCBoZWF2eSBjb21wcmVzc2lvbiBpcyBkaXNhYmxlZC4gKi8KKyAgQUFDX0RSQ19ERUZBVUxUX1BSRVNFTlRBVElPTl9NT0RFID0KKyAgICAgIDB4MDIwNCwgLyohPCBEeW5hbWljIFJhbmdlIENvbnRyb2w6IERlZmF1bHQgcHJlc2VudGF0aW9uIG1vZGUgKERSQworICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgaGFuZGxpbmcpLiBcbiBEZWZpbmVzIHRoZSBoYW5kbGluZyBvZiB0aGUgRFJDCisgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgYm9vc3QgZmFjdG9yLCBhdHRlbnVhdGlvbiBmYWN0b3IgYW5kIGhlYXZ5CisgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uLCBpZiBubyBwcmVzZW50YXRpb24gbW9kZSBpcyBpbmRpY2F0ZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgIGJpdHN0cmVhbS5cbiBGb3Igb3B0aW9ucywgc2VlCisgICAgICAgICAgICAgICAgIDo6QUFDX0RSQ19ERUZBVUxUX1BSRVNFTlRBVElPTl9NT0RFX09QVElPTlMuXG4gRGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgOjpBQUNfRFJDX1BBUkFNRVRFUl9IQU5ETElOR19ESVNBQkxFRCAqLworICBBQUNfRFJDX0VOQ19UQVJHRVRfTEVWRUwgPQorICAgICAgMHgwMjA1LCAvKiE8IER5bmFtaWMgUmFuZ2UgQ29udHJvbDogRW5jb2RlciB0YXJnZXQgbGV2ZWwgZm9yIGxpZ2h0IChpLmUuCisgICAgICAgICAgICAgICAgIG5vdCBoZWF2eSkgY29tcHJlc3Npb24uXG4gSWYga25vd24sIHRoaXMgZGVjbGFyZXMgdGhlIHRhcmdldAorICAgICAgICAgICAgICAgICByZWZlcmVuY2UgbGV2ZWwgdGhhdCB3YXMgYXNzdW1lZCBhdCB0aGUgZW5jb2RlciBmb3IgY2FsY3VsYXRpb24KKyAgICAgICAgICAgICAgICAgICBvZiBsaW1pdGluZyBnYWlucy4gVGhlIHZhbGlkIHZhbHVlcyByYW5nZSBmcm9tIDAgKGZ1bGwtc2NhbGUpCisgICAgICAgICAgICAgICAgIHRvIDEyNyAoMzEuNzUgZEIgYmVsb3cgZnVsbC1zY2FsZSkuIFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgb25seQorICAgICAgICAgICAgICAgICB3aXRoIDo6QUFDX0RSQ19QQVJBTUVURVJfSEFORExJTkdfRU5BQkxFRCBhbmQgaWdub3JlZAorICAgICAgICAgICAgICAgICBvdGhlcndpc2UuXG4gRGVmYXVsdDogMTI3ICh3b3JzdC1jYXNlIGFzc3VtcHRpb24pLlxuICovCisgIEFBQ19RTUZfTE9XUE9XRVIgPSAweDAzMDAsIC8qITwgUXVhZHJhdHVyZSBNaXJyb3IgRmlsdGVyIChRTUYpIEJhbmsgcHJvY2Vzc2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLiBcbiAtMTogVXNlIGludGVybmFsIGRlZmF1bHQuIEltcGxpZXMgTVBFRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJyb3VuZCBwYXJ0aWFsbHkgY29tcGxleCBhY2NvcmRpbmdseS4gXG4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIGNvbXBsZXggUU1GIGRhdGEgbW9kZS4gXG4gMTogVXNlIHJlYWwgKGxvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3dlcikgUU1GIGRhdGEgbW9kZS4gXG4gKi8KKyAgQUFDX1RQREVDX0NMRUFSX0JVRkZFUiA9CisgICAgICAweDA2MDMsIC8qITwgQ2xlYXIgaW50ZXJuYWwgYml0IHN0cmVhbSBidWZmZXIgb2YgdHJhbnNwb3J0IGxheWVycy4gVGhlCisgICAgICAgICAgICAgICAgIGRlY29kZXIgd2lsbCBzdGFydCBkZWNvZGluZyBhdCBuZXcgZGF0YSBwYXNzZWQgYWZ0ZXIgdGhpcyBldmVudAorICAgICAgICAgICAgICAgICBhbmQgYW55IHByZXZpb3VzIGRhdGEgaXMgZGlzY2FyZGVkLiAqLworICBBQUNfVU5JRFJDX1NFVF9FRkZFQ1QgPSAweDA5MDMgLyohPCAgTVBFRy1EIERSQzogUmVxdWVzdCBhIERSQyBlZmZlY3QgdHlwZSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbiBvZiBhIERSQyBzZXQuXG4gU3VwcG9ydGVkIGluZGljZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZTpcbiAtMTogRFJDIG9mZi4gQ29tcGxldGVseSBkaXNhYmxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFRy1EIERSQy5cbiAwOiBOb25lIChkZWZhdWx0KS4gRGlzYWJsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUctRCBEUkMsIGJ1dCBhdXRvbWF0aWNhbGx5IGVuYWJsZXMgRFJDIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcnkgdG8gcHJldmVudCBjbGlwcGluZy5cbiAxOiBMYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWdodFxuIDI6IE5vaXN5IGVudmlyb25tZW50XG4gMzogTGltaXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2sgcmFuZ2VcbiA0OiBMb3cgcGxheWJhY2sgbGV2ZWxcbiA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhbG9nIGVuaGFuY2VtZW50XG4gNjogR2VuZXJhbCBjb21wcmVzc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgZm9yIGdlbmVyYWxseSBlbmFibGluZyBNUEVHLUQgRFJDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IHBhcnRpY3VsYXIgcmVxdWVzdC5cbiAqLwogCiB9IEFBQ0RFQ19QQVJBTTsKIAogLyoqCi0gKiBcYnJpZWYgVGhpcyBzdHJ1Y3R1cmUgZ2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnRseSBkZWNvZGVkIGF1ZGlvIGRhdGEuCi0gKiAgICAgICAgQWxsIGZpZWxkcyBhcmUgcmVhZC1vbmx5LgorICogXGJyaWVmIFRoaXMgc3RydWN0dXJlIGdpdmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50bHkgZGVjb2RlZCBhdWRpbworICogZGF0YS4gQWxsIGZpZWxkcyBhcmUgcmVhZC1vbmx5LgogICovCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBUaGVzZSBmaXZlIG1lbWJlcnMgYXJlIHRoZSBvbmx5IHJlYWxseSByZWxldmFudCBvbmVzIGZvciB0aGUgdXNlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBJTlQgICAgICAgICAgICAgICBzYW1wbGVSYXRlOyAgICAgICAgICAvKiE8IFRoZSBzYW1wbGVyYXRlIGluIEh6IG9mIHRoZSBmdWxseSBkZWNvZGVkIFBDTSBhdWRpbyBzaWduYWwgKGFmdGVyIFNCUiBwcm9jZXNzaW5nKS4gICAqLwotICBJTlQgICAgICAgICAgICAgICBmcmFtZVNpemU7ICAgICAgICAgICAvKiE8IFRoZSBmcmFtZSBzaXplIG9mIHRoZSBkZWNvZGVkIFBDTSBhdWRpbyBzaWduYWwuIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNCBvciA5NjAgZm9yIEFBQy1MQyBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNDggb3IgMTkyMCBmb3IgSEUtQUFDICh2MikgXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIgb3IgNDgwIGZvciBBQUMtTEQgYW5kIEFBQy1FTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgSU5UICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHM7ICAgICAgICAgLyohPCBUaGUgbnVtYmVyIG9mIG91dHB1dCBhdWRpbyBjaGFubmVscyBpbiB0aGUgZGVjb2RlZCBhbmQgaW50ZXJsZWF2ZWQgUENNIGF1ZGlvIHNpZ25hbC4gKi8KLSAgQVVESU9fQ0hBTk5FTF9UWVBFICpwQ2hhbm5lbFR5cGU7ICAgICAgLyohPCBBdWRpbyBjaGFubmVsIHR5cGUgb2YgZWFjaCBvdXRwdXQgYXVkaW8gY2hhbm5lbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgVUNIQVIgICAgICAgICAgICAgKnBDaGFubmVsSW5kaWNlczsgICAgLyohPCBBdWRpbyBjaGFubmVsIGluZGV4IGZvciBlYWNoIG91dHB1dCBhdWRpbyBjaGFubmVsLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgSVNPL0lFQyAxMzgxOC03OjIwMDUoRSksIDguNS4zLjIgRXhwbGljaXQgY2hhbm5lbCBtYXBwaW5nIHVzaW5nIGEgcHJvZ3JhbV9jb25maWdfZWxlbWVudCgpICovCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIFRoZXNlIGZpdmUgbWVtYmVycyBhcmUgdGhlIG9ubHkgcmVhbGx5IHJlbGV2YW50IG9uZXMgZm9yIHRoZSB1c2VyLiAqLworICBJTlQgc2FtcGxlUmF0ZTsgLyohPCBUaGUgc2FtcGxlIHJhdGUgaW4gSHogb2YgdGhlIGRlY29kZWQgUENNIGF1ZGlvIHNpZ25hbC4gKi8KKyAgSU5UIGZyYW1lU2l6ZTsgIC8qITwgVGhlIGZyYW1lIHNpemUgb2YgdGhlIGRlY29kZWQgUENNIGF1ZGlvIHNpZ25hbC4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgVHlwaWNhbGx5IHRoaXMgaXM6IFxuCisgICAgICAgICAgICAgICAgICAgICAgIDEwMjQgb3IgOTYwIGZvciBBQUMtTEMgXG4KKyAgICAgICAgICAgICAgICAgICAgICAgMjA0OCBvciAxOTIwIGZvciBIRS1BQUMgKHYyKSBcbgorICAgICAgICAgICAgICAgICAgICAgICA1MTIgb3IgNDgwIGZvciBBQUMtTEQgYW5kIEFBQy1FTEQgXG4KKyAgICAgICAgICAgICAgICAgICAgICAgNzY4LCAxMDI0LCAyMDQ4IG9yIDQwOTYgZm9yIFVTQUMgICovCisgIElOVCBudW1DaGFubmVsczsgLyohPCBUaGUgbnVtYmVyIG9mIG91dHB1dCBhdWRpbyBjaGFubmVscyBiZWZvcmUgdGhlIHJlbmRlcmluZworICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSwgaS5lLiB0aGUgb3JpZ2luYWwgY2hhbm5lbCBjb25maWd1cmF0aW9uLiAqLworICBBVURJT19DSEFOTkVMX1RZUEUKKyAgKnBDaGFubmVsVHlwZTsgLyohPCBBdWRpbyBjaGFubmVsIHR5cGUgb2YgZWFjaCBvdXRwdXQgYXVkaW8gY2hhbm5lbC4gKi8KKyAgVUNIQVIgKnBDaGFubmVsSW5kaWNlczsgLyohPCBBdWRpbyBjaGFubmVsIGluZGV4IGZvciBlYWNoIG91dHB1dCBhdWRpbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLiBTZWUgSVNPL0lFQyAxMzgxOC03OjIwMDUoRSksIDguNS4zLjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbGljaXQgY2hhbm5lbCBtYXBwaW5nIHVzaW5nIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbV9jb25maWdfZWxlbWVudCgpICovCiAgIC8qIERlY29kZXIgaW50ZXJuYWwgbWVtYmVycy4gKi8KLSAgSU5UICAgICAgICAgICAgICAgYWFjU2FtcGxlUmF0ZTsgICAgICAgLyohPCBTYW1wbGluZyByYXRlIGluIEh6IHdpdGhvdXQgU0JSIChmcm9tIGNvbmZpZ3VyYXRpb24gaW5mbykuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgSU5UICAgICAgICAgICAgICAgcHJvZmlsZTsgICAgICAgICAgICAgLyohPCBNUEVHLTIgcHJvZmlsZSAoZnJvbSBmaWxlIGhlYWRlcikgKC0xOiBub3QgYXBwbGljYWJsZSAoZS4gZy4gTVBFRy00KSkuICAgICAgICAgICAgICAgKi8KLSAgQVVESU9fT0JKRUNUX1RZUEUgYW90OyAgICAgICAgICAgICAgICAgLyohPCBBdWRpbyBPYmplY3QgVHlwZSAoZnJvbSBBU0MpOiBpcyBzZXQgdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGZvciBNUEVHLTIgYml0c3RyZWFtcyAoZS4gZy4gMiBmb3IgQUFDLUxDKS4gKi8KLSAgSU5UICAgICAgICAgICAgICAgY2hhbm5lbENvbmZpZzsgICAgICAgLyohPCBDaGFubmVsIGNvbmZpZ3VyYXRpb24gKDA6IFBDRSBkZWZpbmVkLCAxOiBtb25vLCAyOiBzdGVyZW8sIC4uLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgSU5UICAgICAgICAgICAgICAgYml0UmF0ZTsgICAgICAgICAgICAgLyohPCBJbnN0YW50YW5lb3VzIGJpdCByYXRlLiAgICAgICAgICAgICAgICAgICAqLwotICBJTlQgICAgICAgICAgICAgICBhYWNTYW1wbGVzUGVyRnJhbWU7ICAvKiE8IFNhbXBsZXMgcGVyIGZyYW1lIGZvciB0aGUgQUFDIGNvcmUgKGZyb20gQVNDKS4gXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0IG9yIDk2MCBmb3IgQUFDLUxDIFxuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyIG9yIDQ4MCBmb3IgQUFDLUxEIGFuZCBBQUMtRUxEICAgICAgICAgKi8KLSAgSU5UICAgICAgICAgICAgICAgYWFjTnVtQ2hhbm5lbHM7ICAgICAgLyohPCBUaGUgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIGFmdGVyIEFBQyBjb3JlIHByb2Nlc3NpbmcgKGJlZm9yZSBQUyBvciBNUFMgcHJvY2Vzc2luZykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FVVElPTjogVGhpcyBhcmUgbm90IHRoZSBmaW5hbCBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzISAqLwotICBBVURJT19PQkpFQ1RfVFlQRSBleHRBb3Q7ICAgICAgICAgICAgICAvKiE8IEV4dGVuc2lvbiBBdWRpbyBPYmplY3QgVHlwZSAoZnJvbSBBU0MpICAgKi8KLSAgSU5UICAgICAgICAgICAgICAgZXh0U2FtcGxpbmdSYXRlOyAgICAgLyohPCBFeHRlbnNpb24gc2FtcGxpbmcgcmF0ZSBpbiBIeiAoZnJvbSBBU0MpICovCisgIElOVCBhYWNTYW1wbGVSYXRlOyAvKiE8IFNhbXBsaW5nIHJhdGUgaW4gSHogd2l0aG91dCBTQlIgKGZyb20gY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgaW5mbykgZGl2aWRlZCBieSBhIChFTEQpIGRvd25zY2FsZSBmYWN0b3IgaWYgcHJlc2VudC4gKi8KKyAgSU5UIHByb2ZpbGU7IC8qITwgTVBFRy0yIHByb2ZpbGUgKGZyb20gZmlsZSBoZWFkZXIpICgtMTogbm90IGFwcGxpY2FibGUgKGUuIGcuCisgICAgICAgICAgICAgICAgICBNUEVHLTQpKS4gICAgICAgICAgICAgICAqLworICBBVURJT19PQkpFQ1RfVFlQRQorICBhb3Q7IC8qITwgQXVkaW8gT2JqZWN0IFR5cGUgKGZyb20gQVNDKTogaXMgc2V0IHRvIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZQorICAgICAgICAgIGZvciBNUEVHLTIgYml0c3RyZWFtcyAoZS4gZy4gMiBmb3IgQUFDLUxDKS4gKi8KKyAgSU5UIGNoYW5uZWxDb25maWc7IC8qITwgQ2hhbm5lbCBjb25maWd1cmF0aW9uICgwOiBQQ0UgZGVmaW5lZCwgMTogbW9ubywgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXJlbywgLi4uICAgICAgICAgICAgICAgICAgICAgICAqLworICBJTlQgYml0UmF0ZTsgICAgICAgLyohPCBJbnN0YW50YW5lb3VzIGJpdCByYXRlLiAgICAgICAgICAgICAgICAgICAqLworICBJTlQgYWFjU2FtcGxlc1BlckZyYW1lOyAgIC8qITwgU2FtcGxlcyBwZXIgZnJhbWUgZm9yIHRoZSBBQUMgY29yZSAoZnJvbSBBU0MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2aWRlZCBieSBhIChFTEQpIGRvd25zY2FsZSBmYWN0b3IgaWYgcHJlc2VudC4gXG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGljYWxseSB0aGlzIGlzICh3aXRoIGEgZG93bnNjYWxlIGZhY3RvciBvZiAxKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgIDEwMjQgb3IgOTYwIGZvciBBQUMtTEMgXG4gICA1MTIgb3IgNDgwIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQy1MRCAgIGFuZCBBQUMtRUxEICAgICAgICAgKi8KKyAgSU5UIGFhY051bUNoYW5uZWxzOyAgICAgICAvKiE8IFRoZSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgYWZ0ZXIgQUFDIGNvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIChiZWZvcmUgUFMgb3IgTVBTIHByb2Nlc3NpbmcpLiAgICAgICBDQVVUSU9OOiBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIG5vdCB0aGUgZmluYWwgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyEgKi8KKyAgQVVESU9fT0JKRUNUX1RZUEUgZXh0QW90OyAvKiE8IEV4dGVuc2lvbiBBdWRpbyBPYmplY3QgVHlwZSAoZnJvbSBBU0MpICAgKi8KKyAgSU5UIGV4dFNhbXBsaW5nUmF0ZTsgLyohPCBFeHRlbnNpb24gc2FtcGxpbmcgcmF0ZSBpbiBIeiAoZnJvbSBBU0MpIGRpdmlkZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYSAoRUxEKSBkb3duc2NhbGUgZmFjdG9yIGlmIHByZXNlbnQuICovCiAKLSAgVUlOVCAgICAgICAgICAgICAgb3V0cHV0RGVsYXk7ICAgICAgICAgLyohPCBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgdGhlIG91dHB1dCBpcyBhZGRpdGlvbmFsbHkgZGVsYXllZCBieSB0aGUgZGVjb2Rlci4gKi8KKyAgVUlOVCBvdXRwdXREZWxheTsgLyohPCBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgdGhlIG91dHB1dCBpcyBhZGRpdGlvbmFsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgZGVsYXllZCBieS50aGUgZGVjb2Rlci4gKi8KKyAgVUlOVCBmbGFnczsgLyohPCBDb3B5IG9mIGludGVybmFsIGZsYWdzLiBPbmx5IHRvIGJlIHdyaXR0ZW4gYnkgdGhlIGRlY29kZXIsCisgICAgICAgICAgICAgICAgIGFuZCBvbmx5IHRvIGJlIHJlYWQgZXh0ZXJuYWxseS4gKi8KIAotICBVSU5UICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgICAgICAvKiE8IENvcHkgb2YgaW50ZXJuYWwgZmxhZ3MuIE9ubHkgdG8gYmUgd3JpdHRlbiBieSB0aGUgZGVjb2RlciwgYW5kIG9ubHkgdG8gYmUgcmVhZCBleHRlcm5hbGx5LiAqLwotCi0gIFNDSEFSICAgICAgICAgICAgIGVwQ29uZmlnOyAgICAgICAgICAgIC8qITwgZXBDb25maWcgbGV2ZWwgKGZyb20gQVNDKTogb25seSBsZXZlbCAwIHN1cHBvcnRlZCwgLTEgbWVhbnMgbm8gRVIgKGUuIGcuIEFPVD0yLCBNUEVHLTIgQUFDLCBldGMuKSAgKi8KLQorICBTQ0hBUiBlcENvbmZpZzsgLyohPCBlcENvbmZpZyBsZXZlbCAoZnJvbSBBU0MpOiBvbmx5IGxldmVsIDAgc3VwcG9ydGVkLCAtMQorICAgICAgICAgICAgICAgICAgICAgbWVhbnMgbm8gRVIgKGUuIGcuIEFPVD0yLCBNUEVHLTIgQUFDLCBldGMuKSAgKi8KICAgLyogU3RhdGlzdGljcyAqLwotICBJTlQgICAgICAgICAgICAgICBudW1Mb3N0QWNjZXNzVW5pdHM7ICAvKiE8IFRoaXMgaW50ZWdlciB3aWxsIHJlZmxlY3QgdGhlIGVzdGltYXRlZCBhbW91bnQgb2YgbG9zdCBhY2Nlc3MgdW5pdHMgaW4gY2FzZSBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIEFBQ19ERUNfVFJBTlNQT1JUX1NZTkNfRVJST1IuIEl0IHdpbGwgYmUgPCAwIGlmIHRoZSBlc3RpbWF0aW9uIGZhaWxlZC4gKi8KKyAgSU5UIG51bUxvc3RBY2Nlc3NVbml0czsgLyohPCBUaGlzIGludGVnZXIgd2lsbCByZWZsZWN0IHRoZSBlc3RpbWF0ZWQgYW1vdW50IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvc3QgYWNjZXNzIHVuaXRzIGluIGNhc2UgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBBQUNfREVDX1RSQU5TUE9SVF9TWU5DX0VSUk9SLiBJdCB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwgMCBpZiB0aGUgZXN0aW1hdGlvbiBmYWlsZWQuICovCiAKLSAgVUlOVCAgICAgICAgICAgICAgbnVtVG90YWxCeXRlczsgICAgICAgLyohPCBUaGlzIGlzIHRoZSBudW1iZXIgb2YgdG90YWwgYnl0ZXMgdGhhdCBoYXZlIHBhc3NlZCB0aHJvdWdoIHRoZSBkZWNvZGVyLiAqLwotICBVSU5UICAgICAgICAgICAgICBudW1CYWRCeXRlczsgICAgICAgICAvKiE8IFRoaXMgaXMgdGhlIG51bWJlciBvZiB0b3RhbCBieXRlcyB0aGF0IHdlcmUgY29uc2lkZXJlZCB3aXRoIGVycm9ycyBmcm9tIG51bVRvdGFsQnl0ZXMuICovCi0gIFVJTlQgICAgICAgICAgICAgIG51bVRvdGFsQWNjZXNzVW5pdHM7IC8qITwgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRvdGFsIGFjY2VzcyB1bml0cyB0aGF0IGhhdmUgcGFzc2VkIHRocm91Z2ggdGhlIGRlY29kZXIuICovCi0gIFVJTlQgICAgICAgICAgICAgIG51bUJhZEFjY2Vzc1VuaXRzOyAgIC8qITwgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRvdGFsIGFjY2VzcyB1bml0cyB0aGF0IHdlcmUgY29uc2lkZXJlZCB3aXRoIGVycm9ycyBmcm9tIG51bVRvdGFsQnl0ZXMuICovCisgIElOVDY0IG51bVRvdGFsQnl0ZXM7IC8qITwgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRvdGFsIGJ5dGVzIHRoYXQgaGF2ZSBwYXNzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3VnaCB0aGUgZGVjb2Rlci4gKi8KKyAgSU5UNjQKKyAgbnVtQmFkQnl0ZXM7IC8qITwgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRvdGFsIGJ5dGVzIHRoYXQgd2VyZSBjb25zaWRlcmVkCisgICAgICAgICAgICAgICAgICB3aXRoIGVycm9ycyBmcm9tIG51bVRvdGFsQnl0ZXMuICovCisgIElOVDY0CisgIG51bVRvdGFsQWNjZXNzVW5pdHM7ICAgICAvKiE8IFRoaXMgaXMgdGhlIG51bWJlciBvZiB0b3RhbCBhY2Nlc3MgdW5pdHMgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBwYXNzZWQgdGhyb3VnaCB0aGUgZGVjb2Rlci4gKi8KKyAgSU5UNjQgbnVtQmFkQWNjZXNzVW5pdHM7IC8qITwgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRvdGFsIGFjY2VzcyB1bml0cyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZXJlIGNvbnNpZGVyZWQgd2l0aCBlcnJvcnMgZnJvbSBudW1Ub3RhbEJ5dGVzLiAqLwogCiAgIC8qIE1ldGFkYXRhICovCi0gIFNDSEFSICAgICAgICAgICAgIGRyY1Byb2dSZWZMZXY7ICAgICAgIC8qITwgRFJDIHByb2dyYW0gcmVmZXJlbmNlIGxldmVsLiBEZWZpbmVzIHRoZSByZWZlcmVuY2UgbGV2ZWwgYmVsb3cgZnVsbC1zY2FsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBxdWFudGl6ZWQgaW4gc3RlcHMgb2YgMC4yNWRCLiBUaGUgdmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCAoMCBkQkZTKSB0byAxMjcgKC0zMS43NSBkQkZTKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyB1c2VkIHRvIHJlZmxlY3QgdGhlIGF2ZXJhZ2UgbG91ZG5lc3Mgb2YgdGhlIGF1ZGlvIGluIExLRlMgYWNjb3JpbmcgdG8gSVRVLVIgQlMgMTc3MC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBubyBsZXZlbCBoYXMgYmVlbiBmb3VuZCBpbiB0aGUgYml0c3RyZWFtIHRoZSB2YWx1ZSBpcyAtMS4gKi8KLSAgU0NIQVIgICAgICAgICAgICAgZHJjUHJlc01vZGU7ICAgICAgICAgLyohPCBEUkMgcHJlc2VudGF0aW9uIG1vZGUuIEFjY29yZGluZyB0byBFVFNJIFRTIDEwMSAxNTQsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHdoZXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWdodCAoTVBFRy00IER5bmFtaWMgUmFuZ2UgQ29udHJvbCB0b29sKSBvciBoZWF2eSBjb21wcmVzc2lvbiAoRFZCIGhlYXZ5IGNvbXByZXNzaW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgcmFuZ2UgY29udHJvbCBzaGFsbCB0YWtlIHByaW9yaXR5IG9uIHRoZSBvdXRwdXRzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBkZXRhaWxzLCBzZWUgRVRTSSBUUyAxMDEgMTU0LCB0YWJsZSBDLjMzLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBcbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOiBObyBjb3JyZXNwb25kaW5nIG1ldGFkYXRhIGZvdW5kIGluIHRoZSBiaXRzdHJlYW0gXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogRFJDIHByZXNlbnRhdGlvbiBtb2RlIG5vdCBpbmRpY2F0ZWQgXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogRFJDIHByZXNlbnRhdGlvbiBtb2RlIDEgXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogRFJDIHByZXNlbnRhdGlvbiBtb2RlIDIgXG4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzogUmVzZXJ2ZWQgKi8KKyAgU0NIQVIgZHJjUHJvZ1JlZkxldjsgLyohPCBEUkMgcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwuIERlZmluZXMgdGhlIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCBiZWxvdyBmdWxsLXNjYWxlLiBJdCBpcyBxdWFudGl6ZWQgaW4gc3RlcHMgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNWRCLiBUaGUgdmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCAoMCBkQkZTKSB0byAxMjcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zMS43NSBkQkZTKS4gSXQgaXMgdXNlZCB0byByZWZsZWN0IHRoZSBhdmVyYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvdWRuZXNzIG9mIHRoZSBhdWRpbyBpbiBMS0ZTIGFjY29yZGluZyB0byBJVFUtUiBCUworICAgICAgICAgICAgICAgICAgICAgICAgICAxNzcwLiBJZiBubyBsZXZlbCBoYXMgYmVlbiBmb3VuZCBpbiB0aGUgYml0c3RyZWFtIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpcyAtMS4gKi8KKyAgU0NIQVIKKyAgZHJjUHJlc01vZGU7IC8qITwgRFJDIHByZXNlbnRhdGlvbiBtb2RlLiBBY2NvcmRpbmcgdG8gRVRTSSBUUyAxMDEgMTU0LAorICAgICAgICAgICAgICAgICAgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgd2hldGhlciAgIGxpZ2h0IChNUEVHLTQgRHluYW1pYyBSYW5nZQorICAgICAgICAgICAgICAgICAgQ29udHJvbCB0b29sKSBvciBoZWF2eSBjb21wcmVzc2lvbiAoRFZCIGhlYXZ5CisgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbikgICBkeW5hbWljIHJhbmdlIGNvbnRyb2wgc2hhbGwgdGFrZSBwcmlvcml0eQorICAgICAgICAgICAgICAgICAgb24gdGhlIG91dHB1dHMuICAgRm9yIGRldGFpbHMsIHNlZSBFVFNJIFRTIDEwMSAxNTQsIHRhYmxlCisgICAgICAgICAgICAgICAgICBDLjMzLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBcbiAgIC0xOiBObyBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAgICAgICBtZXRhZGF0YSBmb3VuZCBpbiB0aGUgYml0c3RyZWFtIFxuICAgMDogRFJDIHByZXNlbnRhdGlvbgorICAgICAgICAgICAgICAgICAgbW9kZSBub3QgaW5kaWNhdGVkIFxuICAgMTogRFJDIHByZXNlbnRhdGlvbiBtb2RlIDEgXG4gICAyOgorICAgICAgICAgICAgICAgICAgRFJDIHByZXNlbnRhdGlvbiBtb2RlIDIgXG4gICAzOiBSZXNlcnZlZCAqLwogCiB9IENTdHJlYW1JbmZvOwogCi0KLXR5cGVkZWYgc3RydWN0IEFBQ19ERUNPREVSX0lOU1RBTkNFICpIQU5ETEVfQUFDREVDT0RFUjsgIC8qITwgUG9pbnRlciB0byBhIEFBQyBkZWNvZGVyIGluc3RhbmNlLiAqLwordHlwZWRlZiBzdHJ1Y3QgQUFDX0RFQ09ERVJfSU5TVEFOQ0UKKyAgICAqSEFORExFX0FBQ0RFQ09ERVI7IC8qITwgUG9pbnRlciB0byBhIEFBQyBkZWNvZGVyIGluc3RhbmNlLiAqLwogCiAjaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKK2V4dGVybiAiQyIgewogI2VuZGlmCiAKIC8qKgpAQCAtNjA0LDI1ICs5MDgsMjMgQEAKICAqIFxwYXJhbSBzaXplICAgIFNpemUgb2YgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGJ1ZmZlci4KICAqIFxyZXR1cm4gICAgICAgIEVycm9yIGNvZGUuCiAgKi8KLUxJTktTUEVDX0ggQUFDX0RFQ09ERVJfRVJST1IKLWFhY0RlY29kZXJfQW5jRGF0YUluaXQgKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzaXplICk7CitMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfQW5jRGF0YUluaXQoSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqYnVmZmVyLCBpbnQgc2l6ZSk7CiAKIC8qKgogICogXGJyaWVmIEdldCBvbmUgYW5jaWxsYXJ5IGRhdGEgZWxlbWVudC4KICAqCiAgKiBccGFyYW0gc2VsZiAgIEFBQyBkZWNvZGVyIGhhbmRsZS4KICAqIFxwYXJhbSBpbmRleCAgSW5kZXggb2YgdGhlIGFuY2lsbGFyeSBkYXRhIGVsZW1lbnQgdG8gZ2V0LgotICogXHBhcmFtIHB0ciAgICBQb2ludGVyIHRvIGEgYnVmZmVyIHJlY2VpdmluZyBhIHBvaW50ZXIgdG8gdGhlIHJlcXVlc3RlZCBhbmNpbGxhcnkgZGF0YSBlbGVtZW50LgotICogXHBhcmFtIHNpemUgICBQb2ludGVyIHRvIGEgYnVmZmVyIHJlY2VpdmluZyB0aGUgbGVuZ3RoIG9mIHRoZSByZXF1ZXN0ZWQgYW5jaWxsYXJ5IGRhdGEgZWxlbWVudC4KKyAqIFxwYXJhbSBwdHIgICAgUG9pbnRlciB0byBhIGJ1ZmZlciByZWNlaXZpbmcgYSBwb2ludGVyIHRvIHRoZSByZXF1ZXN0ZWQKKyAqIGFuY2lsbGFyeSBkYXRhIGVsZW1lbnQuCisgKiBccGFyYW0gc2l6ZSAgIFBvaW50ZXIgdG8gYSBidWZmZXIgcmVjZWl2aW5nIHRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3RlZAorICogYW5jaWxsYXJ5IGRhdGEgZWxlbWVudC4KICAqIFxyZXR1cm4gICAgICAgRXJyb3IgY29kZS4KICAqLwotTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUgotYWFjRGVjb2Rlcl9BbmNEYXRhR2V0ICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICoqcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqc2l6ZSApOworTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX0FuY0RhdGFHZXQoSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgVUNIQVIgKipwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNpemUpOwogCiAvKioKICAqIFxicmllZiBTZXQgb25lIHNpbmdsZSBkZWNvZGVyIHBhcmFtZXRlci4KQEAgLTYzMiwxMDYgKzkzNCwxMzMgQEAKICAqIFxwYXJhbSB2YWx1ZSAgUGFyYW1ldGVyIHZhbHVlLgogICogXHJldHVybiAgICAgICBFcnJvciBjb2RlLgogICovCi1MSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SCi1hYWNEZWNvZGVyX1NldFBhcmFtICggY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFDREVDX1BBUkFNICAgICAgIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICB2YWx1ZSApOwotCitMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfU2V0UGFyYW0oY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBQUNERUNfUEFSQU0gcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHZhbHVlKTsKIAogLyoqCi0gKiBcYnJpZWYgICAgICAgICAgICAgIEdldCBmcmVlIGJ5dGVzIGluc2lkZSBkZWNvZGVyIGludGVybmFsIGJ1ZmZlcgotICogXHBhcmFtIHNlbGYgICAgSGFuZGxlIG9mIEFBQyBkZWNvZGVyIGluc3RhbmNlCi0gKiBccGFyYW0gcEZyZWVCeXRlcyBQb2ludGVyIHRvIHZhcmlhYmxlIHJlY2V2aW5nIGFtb3VudCBvZiBmcmVlIGJ5dGVzIGluc2lkZSBkZWNvZGVyIGludGVybmFsIGJ1ZmZlcgotICogXHJldHVybiAgICAgICAgICAgICBFcnJvciBjb2RlCisgKiBcYnJpZWYgICAgICAgICAgICAgIEdldCBmcmVlIGJ5dGVzIGluc2lkZSBkZWNvZGVyIGludGVybmFsIGJ1ZmZlci4KKyAqIFxwYXJhbSBzZWxmICAgICAgICAgSGFuZGxlIG9mIEFBQyBkZWNvZGVyIGluc3RhbmNlLgorICogXHBhcmFtIHBGcmVlQnl0ZXMgICBQb2ludGVyIHRvIHZhcmlhYmxlIHJlY2VpdmluZyBhbW91bnQgb2YgZnJlZSBieXRlcyBpbnNpZGUKKyAqIGRlY29kZXIgaW50ZXJuYWwgYnVmZmVyLgorICogXHJldHVybiAgICAgICAgICAgICBFcnJvciBjb2RlLgogICovCiBMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SCi1hYWNEZWNvZGVyX0dldEZyZWVCeXRlcyAoIGNvbnN0IEhBTkRMRV9BQUNERUNPREVSICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpwRnJlZUJ5dGVzKTsKK2FhY0RlY29kZXJfR2V0RnJlZUJ5dGVzKGNvbnN0IEhBTkRMRV9BQUNERUNPREVSIHNlbGYsIFVJTlQgKnBGcmVlQnl0ZXMpOwogCiAvKioKLSAqIFxicmllZiAgICAgICAgICAgICAgIE9wZW4gYW4gQUFDIGRlY29kZXIgaW5zdGFuY2UKLSAqIFxwYXJhbSB0cmFuc3BvcnRGbXQgIFRoZSB0cmFuc3BvcnQgdHlwZSB0byBiZSB1c2VkCi0gKiBccmV0dXJuICAgICAgICAgICAgICBBQUMgZGVjb2RlciBoYW5kbGUKKyAqIFxicmllZiAgICAgICAgICAgICAgIE9wZW4gYW4gQUFDIGRlY29kZXIgaW5zdGFuY2UuCisgKiBccGFyYW0gdHJhbnNwb3J0Rm10ICBUaGUgdHJhbnNwb3J0IHR5cGUgdG8gYmUgdXNlZC4KKyAqIFxwYXJhbSBuck9mTGF5ZXJzICAgIE51bWJlciBvZiB0cmFuc3BvcnQgbGF5ZXJzLgorICogXHJldHVybiAgICAgICAgICAgICAgQUFDIGRlY29kZXIgaGFuZGxlLgogICovCi1MSU5LU1BFQ19IIEhBTkRMRV9BQUNERUNPREVSCi1hYWNEZWNvZGVyX09wZW4gKCBUUkFOU1BPUlRfVFlQRSB0cmFuc3BvcnRGbXQsIFVJTlQgbnJPZkxheWVycyApOworTElOS1NQRUNfSCBIQU5ETEVfQUFDREVDT0RFUiBhYWNEZWNvZGVyX09wZW4oVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0Rm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBuck9mTGF5ZXJzKTsKIAogLyoqCi0gKiBcYnJpZWYgRXhwbGljaXRseSBjb25maWd1cmUgdGhlIGRlY29kZXIgYnkgcGFzc2luZyBhIHJhdyBBdWRpb1NwZWNpZmljQ29uZmlnIChBU0MpIG9yIGEgU3RyZWFtTXV4Q29uZmlnIChTTUMpLAotICogIGNvbnRhaW5lZCBpbiBhIGJpbmFyeSBidWZmZXIuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIE1QRUctNCBhbmQgUmF3IFBhY2tldHMgZmlsZSBmb3JtYXQgYml0c3RyZWFtcwotICogIGFzIHdlbGwgYXMgZm9yIExBVE0gYml0c3RyZWFtcyB3aXRoIG5vIGluLWJhbmQgU01DLiBJZiB0aGUgdHJhbnNwb3J0IGZvcm1hdCBpcyBMQVRNIHdpdGggb3Igd2l0aG91dAotICogIExPQVMsIGNvbmZpZ3VyYXRpb24gaXMgYXNzdW1lZCB0byBiZSBhbiBTTUMsIGZvciBhbGwgb3RoZXIgZmlsZSBmb3JtYXRzIGFuIEFTQy4KKyAqIFxicmllZiBFeHBsaWNpdGx5IGNvbmZpZ3VyZSB0aGUgZGVjb2RlciBieSBwYXNzaW5nIGEgcmF3IEF1ZGlvU3BlY2lmaWNDb25maWcKKyAqIChBU0MpIG9yIGEgU3RyZWFtTXV4Q29uZmlnIChTTUMpLCBjb250YWluZWQgaW4gYSBiaW5hcnkgYnVmZmVyLiBUaGlzIGlzCisgKiByZXF1aXJlZCBmb3IgTVBFRy00IGFuZCBSYXcgUGFja2V0cyBmaWxlIGZvcm1hdCBiaXRzdHJlYW1zIGFzIHdlbGwgYXMgZm9yCisgKiBMQVRNIGJpdHN0cmVhbXMgd2l0aCBubyBpbi1iYW5kIFNNQy4gSWYgdGhlIHRyYW5zcG9ydCBmb3JtYXQgaXMgTEFUTSB3aXRoIG9yCisgKiB3aXRob3V0IExPQVMsIGNvbmZpZ3VyYXRpb24gaXMgYXNzdW1lZCB0byBiZSBhbiBTTUMsIGZvciBhbGwgb3RoZXIgZmlsZQorICogZm9ybWF0cyBhbiBBU0MuCiAgKgogICogXHBhcmFtIHNlbGYgICAgQUFDIGRlY29kZXIgaGFuZGxlLgotICogXHBhcmFtIGNvbmYgICAgUG9pbnRlciB0byBhbiB1bnNpZ25lZCBjaGFyIGJ1ZmZlciBjb250YWluaW5nIHRoZSBiaW5hcnkgY29uZmlndXJhdGlvbiBidWZmZXIgKGVpdGhlciBBU0Mgb3IgU01DKS4KKyAqIFxwYXJhbSBjb25mICAgIFBvaW50ZXIgdG8gYW4gdW5zaWduZWQgY2hhciBidWZmZXIgY29udGFpbmluZyB0aGUgYmluYXJ5CisgKiBjb25maWd1cmF0aW9uIGJ1ZmZlciAoZWl0aGVyIEFTQyBvciBTTUMpLgogICogXHBhcmFtIGxlbmd0aCAgTGVuZ3RoIG9mIHRoZSBjb25maWd1cmF0aW9uIGJ1ZmZlciBpbiBieXRlcy4KICAqIFxyZXR1cm4gICAgICAgIEVycm9yIGNvZGUuCiAgKi8KLUxJTktTUEVDX0ggQUFDX0RFQ09ERVJfRVJST1IKLWFhY0RlY29kZXJfQ29uZmlnUmF3ICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAqY29uZltdLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICBsZW5ndGhbXSApOwotCitMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfQ29uZmlnUmF3KEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpjb25mW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGVuZ3RoW10pOwogCiAvKioKLSAqIFxicmllZiBGaWxsIEFBQyBkZWNvZGVyJ3MgaW50ZXJuYWwgaW5wdXQgYnVmZmVyIHdpdGggYml0c3RyZWFtIGRhdGEgZnJvbSB0aGUgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLgotICogIFRoZSBmdW5jdGlvbiBvbmx5IGNvcGllcyBzdWNoIGRhdGEgYXMgbG9uZyBhcyB0aGUgZGVjb2Rlci1pbnRlcm5hbCBpbnB1dCBidWZmZXIgaXMgbm90IGZ1bGwuCi0gKiAgU28gaXQgZ3JhYnMgd2hhdGV2ZXIgaXQgY2FuIGZyb20gcEJ1ZmZlciBhbmQgcmV0dXJucyBpbmZvcm1hdGlvbiAoYnl0ZXNWYWxpZCkgc28gdGhhdCBhdCBhCi0gKiAgc3Vic2VxdWVudCBjYWxsIG9mICVhYWNEZWNvZGVyX0ZpbGwoKSwgdGhlIHJpZ2h0IHBvc2l0aW9uIGluIHBCdWZmZXIgY2FuIGJlIGRldGVybWluZWQgdG8KLSAqICBncmFiIHRoZSBuZXh0IGRhdGEuCisgKiBcYnJpZWYgU3VibWl0IHJhdyBJU08gYmFzZSBtZWRpYSBmaWxlIGZvcm1hdCBib3hlcyB0byBkZWNvZGVyIGZvciBwYXJzaW5nCisgKiAob25seSBzb21lIGJveCB0eXBlcyBhcmUgcmVjb2duaXplZCkuCisgKgorICogXHBhcmFtIHNlbGYgICAgQUFDIGRlY29kZXIgaGFuZGxlLgorICogXHBhcmFtIGJ1ZmZlciAgUG9pbnRlciB0byBhbiB1bnNpZ25lZCBjaGFyIGJ1ZmZlciBjb250YWluaW5nIHRoZSBiaW5hcnkgYm94CisgKiBkYXRhIChpbmNsdWRpbmcgc2l6ZSBhbmQgdHlwZSwgY2FuIGJlIGEgc2VxdWVuY2Ugb2YgbXVsdGlwbGUgYm94ZXMpLgorICogXHBhcmFtIGxlbmd0aCAgTGVuZ3RoIG9mIHRoZSBkYXRhIGluIGJ5dGVzLgorICogXHJldHVybiAgICAgICAgRXJyb3IgY29kZS4KKyAqLworTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX1Jhd0lTT0JNRkZEYXRhKEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGxlbmd0aCk7CisKKy8qKgorICogXGJyaWVmIEZpbGwgQUFDIGRlY29kZXIncyBpbnRlcm5hbCBpbnB1dCBidWZmZXIgd2l0aCBiaXRzdHJlYW0gZGF0YSBmcm9tIHRoZQorICogZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLiBUaGUgZnVuY3Rpb24gb25seSBjb3BpZXMgc3VjaCBkYXRhIGFzIGxvbmcgYXMgdGhlCisgKiBkZWNvZGVyLWludGVybmFsIGlucHV0IGJ1ZmZlciBpcyBub3QgZnVsbC4gU28gaXQgZ3JhYnMgd2hhdGV2ZXIgaXQgY2FuIGZyb20KKyAqIHBCdWZmZXIgYW5kIHJldHVybnMgaW5mb3JtYXRpb24gKGJ5dGVzVmFsaWQpIHNvIHRoYXQgYXQgYSBzdWJzZXF1ZW50IGNhbGwgb2YKKyAqICVhYWNEZWNvZGVyX0ZpbGwoKSwgdGhlIHJpZ2h0IHBvc2l0aW9uIGluIHBCdWZmZXIgY2FuIGJlIGRldGVybWluZWQgdG8gZ3JhYgorICogdGhlIG5leHQgZGF0YS4KICAqCiAgKiBccGFyYW0gc2VsZiAgICAgICAgQUFDIGRlY29kZXIgaGFuZGxlLgogICogXHBhcmFtIHBCdWZmZXIgICAgIFBvaW50ZXIgdG8gZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLgotICogXHBhcmFtIGJ1ZmZlclNpemUgIFNpemUgb2YgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLiBUaGlzIGFyZ3VtZW50IGlzIHJlcXVpcmVkIGJlY2F1c2UgZGVjb2Rlci1pbnRlcm5hbGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgd2UgbmVlZCB0aGUgaW5mb3JtYXRpb24gdG8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgdG8gcEJ1ZmZlciwgd2hlcmUgdGhlIG5leHQKLSAqICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgZGF0YSBpcywgd2hpY2ggaXMgdGhlbiBmZWQgaW50byB0aGUgZGVjb2Rlci1pbnRlcm5hbCBidWZmZXIgKGFzIG11Y2gKLSAqICAgICAgICAgICAgICAgICAgICBhcyBwb3NzaWJsZSkuIE91ciBleGFtcGxlIGZyYW1ld29yayBpbXBsZW1lbnRhdGlvbiBmaWxscyB0aGUgYnVmZmVyIGF0IHBCdWZmZXIKLSAqICAgICAgICAgICAgICAgICAgICBhZ2Fpbiwgb25jZSBpdCBjb250YWlucyBubyBhdmFpbGFibGUgdmFsaWQgYnl0ZXMgYW55bW9yZSAobWVhbmluZyBieXRlc1ZhbGlkIGVxdWFsIDApLgotICogXHBhcmFtIGJ5dGVzVmFsaWQgIE51bWJlciBvZiBiaXRzdHJlYW0gYnl0ZXMgaW4gdGhlIGV4dGVybmFsIGJpdHN0cmVhbSBidWZmZXIgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbgotICogICAgICAgICAgICAgICAgICAgIGNvcGllZCBpbnRvIHRoZSBkZWNvZGVyJ3MgaW50ZXJuYWwgYml0c3RyZWFtIGJ1ZmZlciBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIGlzIHVwZGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBhbW91bnQgb2YgbmV3bHkgY29waWVkIGJ5dGVzLgorICogXHBhcmFtIGJ1ZmZlclNpemUgIFNpemUgb2YgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLiBUaGlzIGFyZ3VtZW50IGlzIHJlcXVpcmVkCisgKiBiZWNhdXNlIGRlY29kZXItaW50ZXJuYWxseSB3ZSBuZWVkIHRoZSBpbmZvcm1hdGlvbiB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCB0bworICogcEJ1ZmZlciwgd2hlcmUgdGhlIG5leHQgYXZhaWxhYmxlIGRhdGEgaXMsIHdoaWNoIGlzIHRoZW4KKyAqIGZlZCBpbnRvIHRoZSBkZWNvZGVyLWludGVybmFsIGJ1ZmZlciAoYXMgbXVjaCBhcworICogcG9zc2libGUpLiBPdXIgZXhhbXBsZSBmcmFtZXdvcmsgaW1wbGVtZW50YXRpb24gZmlsbHMgdGhlCisgKiBidWZmZXIgYXQgcEJ1ZmZlciBhZ2Fpbiwgb25jZSBpdCBjb250YWlucyBubyBhdmFpbGFibGUgdmFsaWQgYnl0ZXMgYW55bW9yZQorICogKG1lYW5pbmcgYnl0ZXNWYWxpZCBlcXVhbCAwKS4KKyAqIFxwYXJhbSBieXRlc1ZhbGlkICBOdW1iZXIgb2YgYml0c3RyZWFtIGJ5dGVzIGluIHRoZSBleHRlcm5hbCBiaXRzdHJlYW0gYnVmZmVyCisgKiB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGNvcGllZCBpbnRvIHRoZSBkZWNvZGVyJ3MgaW50ZXJuYWwgYml0c3RyZWFtIGJ1ZmZlciBieQorICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBUaGUgdmFsdWUgaXMgdXBkYXRlZCBhY2NvcmRpbmcgdG8KKyAqIHRoZSBhbW91bnQgb2YgbmV3bHkgY29waWVkIGJ5dGVzLgogICogXHJldHVybiAgICAgICAgICAgIEVycm9yIGNvZGUuCiAgKi8KLUxJTktTUEVDX0ggQUFDX0RFQ09ERVJfRVJST1IKLWFhY0RlY29kZXJfRmlsbCAoIEhBTkRMRV9BQUNERUNPREVSICBzZWxmLAotICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgKnBCdWZmZXJbXSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICBidWZmZXJTaXplW10sCi0gICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAqYnl0ZXNWYWxpZCApOworTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX0ZpbGwoSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwQnVmZmVyW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGJ1ZmZlclNpemVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKmJ5dGVzVmFsaWQpOwogCi0jZGVmaW5lIEFBQ0RFQ19DT05DRUFMICAxIC8qITwgRmxhZyBmb3IgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpOiBUcmlnZ2VyIHRoZSBidWlsdC1pbiBlcnJvciBjb25jZWFsbWVudCBtb2R1bGUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZ2VuZXJhdGUgYSBzdWJzdGl0dXRlIHNpZ25hbCBmb3Igb25lIGxvc3QgZnJhbWUuIE5ldyBpbnB1dCBkYXRhIHdpbGwgbm90IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zaWRlcmVkLiAqLwotI2RlZmluZSBBQUNERUNfRkxVU0ggICAgMiAvKiE8IEZsYWcgZm9yIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKTogRmx1c2ggYWxsIGZpbHRlcmJhbmtzIHRvIGdldCBhbGwgZGVsYXllZCBhdWRpbyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IGhhdmluZyBuZXcgaW5wdXQgZGF0YS4gVGh1cyBuZXcgaW5wdXQgZGF0YSB3aWxsIG5vdCBiZSBjb25zaWRlcmVkLiovCi0jZGVmaW5lIEFBQ0RFQ19JTlRSICAgICA0IC8qITwgRmxhZyBmb3IgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpOiBTaWduYWwgYW4gaW5wdXQgYml0IHN0cmVhbSBkYXRhIGRpc2NvbnRpbnVpdHkuIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3luYyBhbnkgaW50ZXJuYWxzIGFzIG5lY2Vzc2FyeS4gKi8KLSNkZWZpbmUgQUFDREVDX0NMUkhJU1QgIDggLyohPCBGbGFnIGZvciBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCk6IENsZWFyIGFsbCBzaWduYWwgZGVsYXkgbGluZXMgYW5kIGhpc3RvcnkgYnVmZmVycy5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVVUSU9OOiBUaGlzIGNhbiBjYXVzZSBkaXNjb250aW51aXRpZXMgaW4gdGhlIG91dHB1dCBzaWduYWwuICovCisjZGVmaW5lIEFBQ0RFQ19DT05DRUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDEgLyohPCBGbGFnIGZvciBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKCk6IFRyaWdnZXIgdGhlIGJ1aWx0LWluIGVycm9yICAgICAgICBcCisgICAgICAgY29uY2VhbG1lbnQgbW9kdWxlIHRvIGdlbmVyYXRlIGEgc3Vic3RpdHV0ZSBzaWduYWwgZm9yIG9uZSBsb3N0IGZyYW1lLiBcCisgICAgICAgTmV3IGlucHV0IGRhdGEgd2lsbCBub3QgYmUgY29uc2lkZXJlZC4gKi8KKyNkZWZpbmUgQUFDREVDX0ZMVVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAyIC8qITwgRmxhZyBmb3IgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpOiBGbHVzaCBhbGwgZmlsdGVyYmFua3MgdG8gZ2V0IGFsbCBcCisgICAgICAgZGVsYXllZCBhdWRpbyB3aXRob3V0IGhhdmluZyBuZXcgaW5wdXQgZGF0YS4gVGh1cyBuZXcgaW5wdXQgZGF0YSB3aWxsIFwKKyAgICAgICBub3QgYmUgY29uc2lkZXJlZC4qLworI2RlZmluZSBBQUNERUNfSU5UUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgNCAvKiE8IEZsYWcgZm9yIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoKTogU2lnbmFsIGFuIGlucHV0IGJpdCBzdHJlYW0gZGF0YSBcCisgICAgICAgZGlzY29udGludWl0eS4gUmVzeW5jIGFueSBpbnRlcm5hbHMgYXMgbmVjZXNzYXJ5LiAqLworI2RlZmluZSBBQUNERUNfQ0xSSElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA4IC8qITwgRmxhZyBmb3IgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpOiBDbGVhciBhbGwgc2lnbmFsIGRlbGF5IGxpbmVzIGFuZCAgXAorICAgICAgIGhpc3RvcnkgYnVmZmVycy4gQ0FVVElPTjogVGhpcyBjYW4gY2F1c2UgZGlzY29udGludWl0aWVzIGluIHRoZSBvdXRwdXQgXAorICAgICAgIHNpZ25hbC4gKi8KIAogLyoqCi0gKiBcYnJpZWYgICAgICAgICAgICBEZWNvZGUgb25lIGF1ZGlvIGZyYW1lCisgKiBcYnJpZWYgICAgICAgICAgICAgICBEZWNvZGUgb25lIGF1ZGlvIGZyYW1lCiAgKgotICogXHBhcmFtIHNlbGYgICAgICAgQUFDIGRlY29kZXIgaGFuZGxlLgotICogXHBhcmFtIHBUaW1lRGF0YSAgUG9pbnRlciB0byBleHRlcm5hbCBvdXRwdXQgYnVmZmVyIHdoZXJlIHRoZSBkZWNvZGVkIFBDTSBzYW1wbGVzIHdpbGwgYmUgc3RvcmVkIGludG8uCi0gKiBccGFyYW0gZmxhZ3MgICAgICBCaXQgZmllbGQgd2l0aCBmbGFncyBmb3IgdGhlIGRlY29kZXI6IFxuCi0gKiAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBBQUNERUNfQ09OQ0VBTCkgPT0gMTogRG8gY29uY2VhbG1lbnQuIFxuCi0gKiAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBBQUNERUNfRkxVU0gpID09IDI6IERpc2NhcmQgaW5wdXQgZGF0YS4gRmx1c2ggZmlsdGVyIGJhbmtzIChvdXRwdXQgZGVsYXllZCBhdWRpbykuIFxuCi0gKiAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBBQUNERUNfSU5UUikgPT0gNDogSW5wdXQgZGF0YSBpcyBkaXNjb250aW51b3VzLiBSZXN5bmNocm9uaXplIGFueSBpbnRlcm5hbHMgYXMgbmVjZXNzYXJ5LgotICogXHJldHVybiAgICAgICAgICAgRXJyb3IgY29kZS4KKyAqIFxwYXJhbSBzZWxmICAgICAgICAgIEFBQyBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBwVGltZURhdGEgICAgIFBvaW50ZXIgdG8gZXh0ZXJuYWwgb3V0cHV0IGJ1ZmZlciB3aGVyZSB0aGUgZGVjb2RlZCBQQ00KKyAqIHNhbXBsZXMgd2lsbCBiZSBzdG9yZWQgaW50by4KKyAqIFxwYXJhbSB0aW1lRGF0YVNpemUgIFNpemUgb2YgZXh0ZXJuYWwgb3V0cHV0IGJ1ZmZlci4KKyAqIFxwYXJhbSBmbGFncyAgICAgICAgIEJpdCBmaWVsZCB3aXRoIGZsYWdzIGZvciB0aGUgZGVjb2RlcjogXG4KKyAqICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSA9PSAxOiBEbyBjb25jZWFsbWVudC4gXG4KKyAqICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEFBQ0RFQ19GTFVTSCkgPT0gMjogRGlzY2FyZCBpbnB1dCBkYXRhLiBGbHVzaAorICogZmlsdGVyIGJhbmtzIChvdXRwdXQgZGVsYXllZCBhdWRpbykuIFxuIChmbGFncyAmIEFBQ0RFQ19JTlRSKSA9PSA0OiBJbnB1dAorICogZGF0YSBpcyBkaXNjb250aW51b3VzLiBSZXN5bmNocm9uaXplIGFueSBpbnRlcm5hbHMgYXMKKyAqIG5lY2Vzc2FyeS4gXG4gKGZsYWdzICYgQUFDREVDX0NMUkhJU1QpID09IDg6IENsZWFyIGFsbCBzaWduYWwgZGVsYXkgbGluZXMgYW5kCisgKiBoaXN0b3J5IGJ1ZmZlcnMuCisgKiBccmV0dXJuICAgICAgICAgICAgICBFcnJvciBjb2RlLgogICovCi1MSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SCi1hYWNEZWNvZGVyX0RlY29kZUZyYW1lICggSEFORExFX0FBQ0RFQ09ERVIgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgICAgICAgICAgKnBUaW1lRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgdGltZURhdGFTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICBmbGFncyApOworTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqcFRpbWVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB0aW1lRGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncyk7CiAKIC8qKgogICogXGJyaWVmICAgICAgIERlLWFsbG9jYXRlIGFsbCByZXNvdXJjZXMgb2YgYW4gQUFDIGRlY29kZXIgaW5zdGFuY2UuCiAgKgogICogXHBhcmFtIHNlbGYgIEFBQyBkZWNvZGVyIGhhbmRsZS4KLSAqIFxyZXR1cm4gICAgICB2b2lkCisgKiBccmV0dXJuICAgICAgdm9pZC4KICAqLwotTElOS1NQRUNfSCB2b2lkIGFhY0RlY29kZXJfQ2xvc2UgKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmICk7CitMSU5LU1BFQ19IIHZvaWQgYWFjRGVjb2Rlcl9DbG9zZShIQU5ETEVfQUFDREVDT0RFUiBzZWxmKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICAgR2V0IENTdHJlYW1JbmZvIGhhbmRsZSBmcm9tIGRlY29kZXIuCkBAIC03MzksMTYgKzEwNjgsMTUgQEAKICAqIFxwYXJhbSBzZWxmICBBQUMgZGVjb2RlciBoYW5kbGUuCiAgKiBccmV0dXJuICAgICAgUmVmZXJlbmNlIHRvIHJlcXVlc3RlZCBDU3RyZWFtSW5mby4KICAqLwotTElOS1NQRUNfSCBDU3RyZWFtSW5mbyogYWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmICk7CitMSU5LU1BFQ19IIENTdHJlYW1JbmZvICphYWNEZWNvZGVyX0dldFN0cmVhbUluZm8oSEFORExFX0FBQ0RFQ09ERVIgc2VsZik7CiAKIC8qKgogICogXGJyaWVmICAgICAgIEdldCBkZWNvZGVyIGxpYnJhcnkgaW5mby4KICAqCiAgKiBccGFyYW0gaW5mbyAgUG9pbnRlciB0byBhbiBhbGxvY2F0ZWQgTElCX0lORk8gc3RydWN0dXJlLgotICogXHJldHVybiAgICAgIDAgb24gc3VjY2VzcworICogXHJldHVybiAgICAgIDAgb24gc3VjY2Vzcy4KICAqLwotTElOS1NQRUNfSCBJTlQgYWFjRGVjb2Rlcl9HZXRMaWJJbmZvKCBMSUJfSU5GTyAqaW5mbyApOwotCitMSU5LU1BFQ19IIElOVCBhYWNEZWNvZGVyX0dldExpYkluZm8oTElCX0lORk8gKmluZm8pOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvRkRLX2RlbGF5LmNwcCBiL2xpYkFBQ2RlYy9zcmMvRkRLX2RlbGF5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWIxYTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliQUFDZGVjL3NyYy9GREtfZGVsYXkuY3BwCkBAIC0wLDAgKzEsMTczIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXR0aGlhcyBIaWxkZW5icmFuZAorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkZES19kZWxheS5oIgorCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKworI2RlZmluZSBNQVhfRlJBTUVfTEVOR1RIICgxMDI0KQorCitJTlQgRkRLX0RlbGF5X0NyZWF0ZShGREtfU2lnbmFsRGVsYXkqIGRhdGEsIGNvbnN0IFVTSE9SVCBkZWxheSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIG51bV9jaGFubmVscykgeworICBGREtfQVNTRVJUKGRhdGEgIT0gTlVMTCk7CisgIEZES19BU1NFUlQobnVtX2NoYW5uZWxzID4gMCk7CisKKyAgaWYgKGRlbGF5ID4gMCkgeworICAgIGRhdGEtPmRlbGF5X2xpbmUgPQorICAgICAgICAoSU5UX1BDTSopRkRLY2FsbG9jKG51bV9jaGFubmVscyAqIGRlbGF5LCBzaXplb2YoSU5UX1BDTSkpOworICAgIGlmIChkYXRhLT5kZWxheV9saW5lID09IE5VTEwpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZGF0YS0+ZGVsYXlfbGluZSA9IE5VTEw7CisgIH0KKyAgZGF0YS0+bnVtX2NoYW5uZWxzID0gbnVtX2NoYW5uZWxzOworICBkYXRhLT5kZWxheSA9IGRlbGF5OworCisgIHJldHVybiAwOworfQorCit2b2lkIEZES19EZWxheV9BcHBseShGREtfU2lnbmFsRGVsYXkqIGRhdGEsIEZJWFBfUENNKiB0aW1lX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZnJhbWVfbGVuZ3RoLCBjb25zdCBVQ0hBUiBjaGFubmVsKSB7CisgIEZES19BU1NFUlQoZGF0YSAhPSBOVUxMKTsKKworICBpZiAoZGF0YS0+ZGVsYXkgPiAwKSB7CisgICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHRtcCwgRklYUF9QQ00sIE1BWF9GUkFNRV9MRU5HVEgpCisgICAgRkRLX0FTU0VSVChmcmFtZV9sZW5ndGggPD0gTUFYX0ZSQU1FX0xFTkdUSCk7CisgICAgRkRLX0FTU0VSVChjaGFubmVsIDwgZGF0YS0+bnVtX2NoYW5uZWxzKTsKKyAgICBGREtfQVNTRVJUKHRpbWVfYnVmZmVyICE9IE5VTEwpOworICAgIGlmIChmcmFtZV9sZW5ndGggPj0gZGF0YS0+ZGVsYXkpIHsKKyAgICAgIEZES21lbWNweSh0bXAsICZ0aW1lX2J1ZmZlcltmcmFtZV9sZW5ndGggLSBkYXRhLT5kZWxheV0sCisgICAgICAgICAgICAgICAgZGF0YS0+ZGVsYXkgKiBzaXplb2YoRklYUF9QQ00pKTsKKyAgICAgIEZES21lbW1vdmUoJnRpbWVfYnVmZmVyW2RhdGEtPmRlbGF5XSwgJnRpbWVfYnVmZmVyWzBdLAorICAgICAgICAgICAgICAgICAoZnJhbWVfbGVuZ3RoIC0gZGF0YS0+ZGVsYXkpICogc2l6ZW9mKEZJWFBfUENNKSk7CisgICAgICBGREttZW1jcHkoJnRpbWVfYnVmZmVyWzBdLCAmZGF0YS0+ZGVsYXlfbGluZVtjaGFubmVsICogZGF0YS0+ZGVsYXldLAorICAgICAgICAgICAgICAgIGRhdGEtPmRlbGF5ICogc2l6ZW9mKEZJWFBfUENNKSk7CisgICAgICBGREttZW1jcHkoJmRhdGEtPmRlbGF5X2xpbmVbY2hhbm5lbCAqIGRhdGEtPmRlbGF5XSwgdG1wLAorICAgICAgICAgICAgICAgIGRhdGEtPmRlbGF5ICogc2l6ZW9mKEZJWFBfUENNKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZES21lbWNweSh0bXAsICZ0aW1lX2J1ZmZlclswXSwgZnJhbWVfbGVuZ3RoICogc2l6ZW9mKEZJWFBfUENNKSk7CisgICAgICBGREttZW1jcHkoJnRpbWVfYnVmZmVyWzBdLCAmZGF0YS0+ZGVsYXlfbGluZVtjaGFubmVsICogZGF0YS0+ZGVsYXldLAorICAgICAgICAgICAgICAgIGZyYW1lX2xlbmd0aCAqIHNpemVvZihGSVhQX1BDTSkpOworICAgICAgRkRLbWVtY3B5KCZkYXRhLT5kZWxheV9saW5lW2NoYW5uZWwgKiBkYXRhLT5kZWxheV0sCisgICAgICAgICAgICAgICAgJmRhdGEtPmRlbGF5X2xpbmVbY2hhbm5lbCAqIGRhdGEtPmRlbGF5ICsgZnJhbWVfbGVuZ3RoXSwKKyAgICAgICAgICAgICAgICAoZGF0YS0+ZGVsYXkgLSBmcmFtZV9sZW5ndGgpICogc2l6ZW9mKEZJWFBfUENNKSk7CisgICAgICBGREttZW1jcHkoJmRhdGEtPmRlbGF5X2xpbmVbY2hhbm5lbCAqIGRhdGEtPmRlbGF5ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YS0+ZGVsYXkgLSBmcmFtZV9sZW5ndGgpXSwKKyAgICAgICAgICAgICAgICB0bXAsIGZyYW1lX2xlbmd0aCAqIHNpemVvZihGSVhQX1BDTSkpOworICAgIH0KKyAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHRtcCwgRklYUF9QQ00sIE1BWF9GUkFNRV9MRU5HVEgpCisgIH0KKworICByZXR1cm47Cit9CisKK3ZvaWQgRkRLX0RlbGF5X0Rlc3Ryb3koRkRLX1NpZ25hbERlbGF5KiBkYXRhKSB7CisgIGlmIChkYXRhLT5kZWxheV9saW5lICE9IE5VTEwpIHsKKyAgICBGREtmcmVlKGRhdGEtPmRlbGF5X2xpbmUpOworICB9CisgIGRhdGEtPmRlbGF5X2xpbmUgPSBOVUxMOworICBkYXRhLT5kZWxheSA9IDA7CisgIGRhdGEtPm51bV9jaGFubmVscyA9IDA7CisKKyAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9GREtfZGVsYXkuaCBiL2xpYkFBQ2RlYy9zcmMvRkRLX2RlbGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg5YzNhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYkFBQ2RlYy9zcmMvRkRLX2RlbGF5LmgKQEAgLTAsMCArMSwxNTIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hdHRoaWFzIEhpbGRlbmJyYW5kCisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZES19ERUxBWV9ICisjZGVmaW5lIEZES19ERUxBWV9ICisKKyNpbmNsdWRlICJhYWNfcm9tLmgiCisKKy8qKgorICogU3RydWN0dXJlIHJlcHJlc2VudGluZyBvbmUgZGVsYXkgZWxlbWVudCBmb3IgbXVsdGlwbGUgY2hhbm5lbHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UX1BDTSogZGVsYXlfbGluZTsgLyohPCBQb2ludGVyIHdoaWNoIHN0b3JlcyBhbGxvY2F0ZWQgZGVsYXkgbGluZS4gKi8KKyAgVVNIT1JUIGRlbGF5OyAgICAgICAgLyohPCBEZWxheSByZXF1aXJlZCBpbiBzYW1wbGVzIChwZXIgY2hhbm5lbCkuICovCisgIFVDSEFSIG51bV9jaGFubmVsczsgIC8qITwgTnVtYmVyIG9mIGNoYW5uZWxzIHRvIGRlbGF5LiAqLworfSBGREtfU2lnbmFsRGVsYXk7CisKKy8qKgorICogXGJyaWVmIENyZWF0ZSBkZWxheSBlbGVtZW50IGZvciBtdWx0aXBsZSBjaGFubmVscyB3aXRoIGZpeGVkIGRlbGF5IHZhbHVlLgorICoKKyAqIFxwYXJhbSBkYXRhIFBvaW50ZXIgZGVsYXkgZWxlbWVudCBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gZGVsYXkgUmVxdWlyZWQgZGVsYXkgdmFsdWUgaW4gc2FtcGxlcyBwZXIgY2hhbm5lbC4KKyAqIFxwYXJhbSBudW1fY2hhbm5lbHMgUmVxdWlyZWQgbnVtYmVyIG9mIGNoYW5uZWxzLgorICoKKyAqIFxyZXR1cm4gLTEgb24gb3V0IG9mIG1lbW9yeSwgZWxzZSAwCisgKi8KK0lOVCBGREtfRGVsYXlfQ3JlYXRlKEZES19TaWduYWxEZWxheSogZGF0YSwgY29uc3QgVVNIT1JUIGRlbGF5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgbnVtX2NoYW5uZWxzKTsKKworLyoqCisgKiBcYnJpZWYgQXBwbHkgZGVsYXkgdG8gb25lIGNoYW5uZWwgKG5vbi1pbnRlcmxlYXZlZCBzdG9yYWdlIGFzc3VtZWQpLgorICoKKyAqIFxwYXJhbSBkYXRhIFBvaW50ZXIgZGVsYXkgZWxlbWVudCBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gdGltZV9idWZmZXIgUG9pbnRlciB0byBzaWduYWwgdG8gZGVsYXkuCisgKiBccGFyYW0gZnJhbWVfbGVuZ3RoIEZyYW1lIGxlbmd0aCBvZiBpbnB1dC9vdXRwdXQgc2lnbmFsIChuZWVkcyB0byBiZSA+PQorICogZGVsYXkpLgorICogXHBhcmFtIGNoYW5uZWwgSW5kZXggb2YgY3VycmVudCBjaGFubmVsICgwIDw9IGNoYW5uZWwgPCBudW1fY2hhbm5lbHMpLgorICoKKyAqIFxyZXR1cm4gdm9pZAorICovCit2b2lkIEZES19EZWxheV9BcHBseShGREtfU2lnbmFsRGVsYXkqIGRhdGEsIEZJWFBfUENNKiB0aW1lX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZnJhbWVfbGVuZ3RoLCBjb25zdCBVQ0hBUiBjaGFubmVsKTsKKworLyoqCisgKiBcYnJpZWYgRGVzdHJveSBkZWxheSBlbGVtZW50LgorICoKKyAqIFxwYXJhbSBkYXRhIFBvaW50ZXIgZGVsYXkgZWxlbWVudCBzdHJ1Y3R1cmUuCisgKgorICogXHJldHVybiB2b2lkCisgKi8KK3ZvaWQgRkRLX0RlbGF5X0Rlc3Ryb3koRkRLX1NpZ25hbERlbGF5KiBkYXRhKTsKKworI2VuZGlmIC8qICNpZm5kZWYgRkRLX0RFTEFZX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvYWFjX3JhbS5jcHAgYi9saWJBQUNkZWMvc3JjL2FhY19yYW0uY3BwCmluZGV4IDFmZjI4OWIuLmUxMzE2N2QgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvYWFjX3JhbS5jcHAKKysrIGIvbGliQUFDZGVjL3NyYy9hYWNfcmFtLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxMyArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEF1dGhvcihzKTogSm9zZWYgSG9lcGZsCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiYWFjX3JhbS5oIgogI2luY2x1ZGUgImFhY19yb20uaCIKQEAgLTkzLDEwICsxMDYsMTcgQEAKICNkZWZpbmUgV09SS0JVRkZFUjFfVEFHIDAKICNkZWZpbmUgV09SS0JVRkZFUjJfVEFHIDEKIAotLyohIFRoZSBzdHJ1Y3R1cmUgQUFDX0RFQ09ERVJfSU5TVEFOQ0UgaXMgdGhlIHRvcCBsZXZlbCBzdHJ1Y3R1cmUgaG9sZGluZyBhbGwgZGVjb2RlciBjb25maWd1cmF0aW9ucywKLSAgICBoYW5kbGVzIGFuZCBzdHJ1Y3RzLgorI2RlZmluZSBXT1JLQlVGRkVSM19UQUcgNAorI2RlZmluZSBXT1JLQlVGRkVSNF9UQUcgNQorCisjZGVmaW5lIFdPUktCVUZGRVI1X1RBRyA2CisKKyNkZWZpbmUgV09SS0JVRkZFUjZfVEFHIDcKKworLyohIFRoZSBzdHJ1Y3R1cmUgQUFDX0RFQ09ERVJfSU5TVEFOQ0UgaXMgdGhlIHRvcCBsZXZlbCBzdHJ1Y3R1cmUgaG9sZGluZyBhbGwKKyAgIGRlY29kZXIgY29uZmlndXJhdGlvbnMsIGhhbmRsZXMgYW5kIHN0cnVjdHMuCiAgKi8KLUNfQUxMT0NfTUVNKEFhY0RlY29kZXIsIEFBQ19ERUNPREVSX0lOU1RBTkNFLCAxKQorQ19BTExPQ19NRU0oQWFjRGVjb2Rlciwgc3RydWN0IEFBQ19ERUNPREVSX0lOU1RBTkNFLCAxKQogCiAvKiEKICAgXG5hbWUgU3RhdGljQWFjRGF0YQpAQCAtMTA1LDIxICsxMjUsMzYgQEAKICovCiAvKiBAeyAqLwogCi0vKiEgVGhlIHN0cnVjdHVyZSBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvIGNvbnRhaW5zIHRoZSBzdGF0aWMgc2lkZWluZm8gd2hpY2ggaXMgbmVlZGVkCi0gICAgZm9yIHRoZSBkZWNvZGluZyBvZiBvbmUgYWFjIGNoYW5uZWwuIDxicj4KLSAgICBEaW1lbnNpb246ICNBYWNEZWNvZGVyQ2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyohIFRoZSBzdHJ1Y3R1cmUgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyBjb250YWlucyB0aGUgc3RhdGljIHNpZGVpbmZvCisgICB3aGljaCBpcyBuZWVkZWQgZm9yIHRoZSBkZWNvZGluZyBvZiBvbmUgYWFjIGNoYW5uZWwuIDxicj4gRGltZW5zaW9uOgorICAgI0FhY0RlY29kZXJDaGFubmVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiBDX0FMTE9DX01FTTIoQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLCBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLCAxLCAoOCkpCiAKLS8qISBUaGUgc3RydWN0dXJlIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gY29udGFpbnMgdGhlIGR5bmFtaWMgc2lkZWluZm8gd2hpY2ggaXMgbmVlZGVkCi0gICAgZm9yIHRoZSBkZWNvZGluZyBvZiBvbmUgYWFjIGNoYW5uZWwuIDxicj4KLSAgICBEaW1lbnNpb246ICNBYWNEZWNvZGVyQ2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyohIFRoZSBzdHJ1Y3R1cmUgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyBjb250YWlucyB0aGUgZHluYW1pYyBzaWRlaW5mbyB3aGljaCBpcworICAgbmVlZGVkIGZvciB0aGUgZGVjb2Rpbmcgb2Ygb25lIGFhYyBjaGFubmVsLiA8YnI+IERpbWVuc2lvbjoKKyAgICNBYWNEZWNvZGVyQ2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogQ19BQUxMT0NfTUVNMihBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIDEsICg4KSkKIAogLyohIE92ZXJsYXAgYnVmZmVyICovCi1DX0FMTE9DX01FTTIoT3ZlcmxhcEJ1ZmZlciwgRklYUF9EQkwsIE92ZXJsYXBCdWZmZXJTaXplLCAoOCkpCitDX0FBTExPQ19NRU0yKE92ZXJsYXBCdWZmZXIsIEZJWFBfREJMLCBPdmVybGFwQnVmZmVyU2l6ZSwgKDgpKQogCiBDX0FMTE9DX01FTShEcmNJbmZvLCBDRHJjSW5mbywgMSkKIAorLyohIFRoZSBzdHJ1Y3R1cmUgQ3BlUGVyc2lzdGVudERhdGEgaG9sZHMgdGhlIHBlcnNpc3RlbnQgZGF0YSBzaGFyZWQgYnkgYm90aAorICAgY2hhbm5lbHMgb2YgYSBDUEUuIDxicj4gSXQgbmVlZHMgdG8gYmUgYWxsb2NhdGVkIGZvciBlYWNoIENQRS4gPGJyPgorICAgIERpbWVuc2lvbjogMSAqLworQ19BTExPQ19NRU0oQ3BlUGVyc2lzdGVudERhdGEsIENwZVBlcnNpc3RlbnREYXRhLCAxKQorCisvKiEgVGhlIHN0cnVjdHVyZSBDQ3BseFByZWRpY3Rpb25EYXRhIGhvbGRzIGRhdGEgZm9yIGNvbXBsZXggc3RlcmVvIHByZWRpY3Rpb24uCisgICA8YnI+IERpbWVuc2lvbjogMQorICovCitDX0FMTE9DX01FTShDcGx4UHJlZGljdGlvbkRhdGEsIENDcGx4UHJlZGljdGlvbkRhdGEsIDEpCisKKy8qISBUaGUgYnVmZmVyIGhvbGRzIHRpbWUgc2FtcGxlcyBmb3IgdGhlIGNyb3NzZmFkZSBpbiBjYXNlIG9mIGFuIFVTQUMgREFTSCBJUEYKKyAgIGNvbmZpZyBjaGFuZ2UgRGltZW5zaW9uOiAoOCkKKyAqLworQ19BTExPQ19NRU0yKFRpbWVEYXRhRmx1c2gsIElOVF9QQ00sIFRJTUVfREFUQV9GTFVTSF9TSVpFLCAoOCkpCisKIC8qIEB9ICovCiAKIC8qIQpAQCAtMTI4LDE1ICsxNjMsMjMgQEAKICAgRHluYW1pYyBtZW1vcnkgYXJlYXMsIG1pZ2h0IGJlIHJldXNlZCBpbiBvdGhlciBhbGdvcml0aG0gc2VjdGlvbnMsCiAgIGUuZy4gdGhlIHNiciBkZWNvZGVyCiAqLwotQ19BTExPQ19NRU1fT1ZFUkxBWShXb3JrQnVmZmVyQ29yZTIsIEZJWFBfREJMLCAoKDgpKjEwMjQpLCBTRUNUX0RBVEFfTDIsIFdPUktCVUZGRVIyX1RBRykKIAorLyogVGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gdG8gbWFrZSB1c2Ugb2YgdGhlIFdvcmtCdWZmZXJDb3JlWzMvNF0gZm9yIGRlY29kZXIKKyAqIGNvbmZpZ3VyYXRpb25zIHdpdGggbW9yZSB0aGFuIDIgY2hhbm5lbHMgKi8KK0NfQUxMT0NfTUVNX09WRVJMQVkoV29ya0J1ZmZlckNvcmUyLCBGSVhQX0RCTCwgKCg4KSAqIDEwMjQpLCBTRUNUX0RBVEFfTDIsCisgICAgICAgICAgICAgICAgICAgIFdPUktCVUZGRVIyX1RBRykKIAotQ19BTExPQ19NRU1fT1ZFUkxBWShXb3JrQnVmZmVyQ29yZTEsIENXb3JrQnVmZmVyQ29yZTEsIDEsIFNFQ1RfREFUQV9MMSwgV09SS0JVRkZFUjFfVEFHKQorQ19BTExPQ19NRU1fT1ZFUkxBWShXb3JrQnVmZmVyQ29yZTMsIEZJWFBfREJMLCBXQl9TRUNUSU9OX1NJWkUsIFNFQ1RfREFUQV9MMiwKKyAgICAgICAgICAgICAgICAgICAgV09SS0JVRkZFUjNfVEFHKQorQ19BQUxMT0NfTUVNKFdvcmtCdWZmZXJDb3JlNCwgRklYUF9EQkwsIFdCX1NFQ1RJT05fU0laRSkKK0NfQUxMT0NfTUVNX09WRVJMQVkoV29ya0J1ZmZlckNvcmU2LCBTQ0hBUiwKKyAgICAgICAgICAgICAgICAgICAgZk1heCgoSU5UKShzaXplb2YoRklYUF9EQkwpICogV0JfU0VDVElPTl9TSVpFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UKXNpemVvZihDQWFjRGVjb2RlckNvbW1vbkRhdGEpKSwKKyAgICAgICAgICAgICAgICAgICAgU0VDVF9EQVRBX0wyLCBXT1JLQlVGRkVSNl9UQUcpCiAKLS8qIEB7ICovCitDX0FMTE9DX01FTV9PVkVSTEFZKFdvcmtCdWZmZXJDb3JlMSwgQ1dvcmtCdWZmZXJDb3JlMSwgMSwgU0VDVF9EQVRBX0wxLAorICAgICAgICAgICAgICAgICAgICBXT1JLQlVGRkVSMV9UQUcpCiAKLQotLyogQH0gKi8KLQotCi0KKy8qIGRvdWJsZSBidWZmZXIgc2l6ZSBuZWVkZWQgZm9yIGRlLS9pbnRlcmxlYXZpbmcgKi8KK0NfQUxMT0NfTUVNX09WRVJMQVkoV29ya0J1ZmZlckNvcmU1LCBQQ01fREVDLCAoOCkgKiAoMTAyNCAqIDQpICogMiwKKyAgICAgICAgICAgICAgICAgICAgU0VDVF9EQVRBX0VYVEVSTiwgV09SS0JVRkZFUjVfVEFHKQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNfcmFtLmggYi9saWJBQUNkZWMvc3JjL2FhY19yYW0uaAppbmRleCA0NTI3ZTI3Li5hODYxZTI1IDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY19yYW0uaAorKysgYi9saWJBQUNkZWMvc3JjL2FhY19yYW0uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKwogICAgRGVzY3JpcHRpb246CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgQUFDX1JBTV9ICiAjZGVmaW5lIEFBQ19SQU1fSApAQCAtOTcsMTMgKzEwOSwxNSBAQAogCiAjaW5jbHVkZSAiY2hhbm5lbC5oIgogCisjaW5jbHVkZSAiYWNfYXJpdGhfY29kZXIuaCIKKwogI2luY2x1ZGUgImFhY2RlY19oY3JfdHlwZXMuaCIKICNpbmNsdWRlICJhYWNkZWNfaGNyLmgiCiAKIC8qIEVuZCBvZiBmb3JtYWwgZml4LmggKi8KIAotI2RlZmluZSBNQVhfU1lOQ0hTICAgICAgICAxMAotI2RlZmluZSBTQU1QTF9GUkVRUyAgICAgICAxMgorI2RlZmluZSBNQVhfU1lOQ0hTIDEwCisjZGVmaW5lIFNBTVBMX0ZSRVFTIDEyCiAKIEhfQUxMT0NfTUVNKEFhY0RlY29kZXIsIEFBQ19ERUNPREVSX0lOU1RBTkNFKQogCkBAIC0xMTMsOCArMTI3LDIxIEBACiBIX0FMTE9DX01FTShBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8pCiBIX0FMTE9DX01FTShPdmVybGFwQnVmZmVyLCBGSVhQX0RCTCkKIAorSF9BTExPQ19NRU0oQ3BlUGVyc2lzdGVudERhdGEsIENwZVBlcnNpc3RlbnREYXRhKQorSF9BTExPQ19NRU0oQ3BseFByZWRpY3Rpb25EYXRhLCBDQ3BseFByZWRpY3Rpb25EYXRhKQorSF9BTExPQ19NRU0oU3BlY3RyYWxDb2VmZnMsIEZJWFBfREJMKQorSF9BTExPQ19NRU0oU3BlY1NjYWxlLCBTSE9SVCkKKworSF9BTExPQ19NRU0oVGltZURhdGFGbHVzaCwgSU5UX1BDTSkKKwogSF9BTExPQ19NRU1fT1ZFUkxBWShXb3JrQnVmZmVyQ29yZTEsIENXb3JrQnVmZmVyQ29yZTEpCiBIX0FMTE9DX01FTV9PVkVSTEFZKFdvcmtCdWZmZXJDb3JlMiwgRklYUF9EQkwpCiAKK0hfQUxMT0NfTUVNX09WRVJMQVkoV29ya0J1ZmZlckNvcmUzLCBGSVhQX0RCTCkKK0hfQUxMT0NfTUVNKFdvcmtCdWZmZXJDb3JlNCwgRklYUF9EQkwpCisKK0hfQUxMT0NfTUVNX09WRVJMQVkoV29ya0J1ZmZlckNvcmU1LCBQQ01fREVDKQorCitIX0FMTE9DX01FTV9PVkVSTEFZKFdvcmtCdWZmZXJDb3JlNiwgU0NIQVIpCiAKICNlbmRpZiAvKiAjaWZuZGVmIEFBQ19SQU1fSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNfcm9tLmNwcCBiL2xpYkFBQ2RlYy9zcmMvYWFjX3JvbS5jcHAKaW5kZXggZjNjOWI1YS4uY2JkZmZjNCAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9hYWNfcm9tLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL2FhY19yb20uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQwNCArOTAsNDMzIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsLCBUb2JpYXMgQ2hhbHVwa2EKKwogICAgRGVzY3JpcHRpb246IERlZmluaXRpb24gb2YgY29uc3RhbnQgdGFibGVzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJhYWNfcm9tLmgiCiAKLQogLyogUHJlc2NhbGUgSW52ZXJzZVF1YW50VGFibGUgYnkgNCB0byBzYXZlCiAgICByZWR1bmRhbnQgc2hpZnRzIGluIGludmVycyBxdWFudGl6YXRpb24KICAqLwotI2RlZmluZSBTQ0xfVEFCKGEpIChhPj40KQotY29uc3QgRklYUF9EQkwgSW52ZXJzZVF1YW50VGFibGUgW0lOVl9RVUFOVF9UQUJMRVNJWkUgKyAxXSA9Ci17Ci0gIFNDTF9UQUIoMHgzMkNCRkQ0MCksIFNDTF9UQUIoMHgzMzBGQzM0MCksIFNDTF9UQUIoMHgzMzUzOUZDMCksIFNDTF9UQUIoMHgzMzk3OTI4MCksIFNDTF9UQUIoMHgzM0RCOUJDMCksIFNDTF9UQUIoMHgzNDFGQkI4MCksIFNDTF9UQUIoMHgzNDYzRjE4MCksIFNDTF9UQUIoMHgzNEE4M0RDMCksCi0gIFNDTF9UQUIoMHgzNEVDQTAwMCksIFNDTF9UQUIoMHgzNTMxMTg4MCksIFNDTF9UQUIoMHgzNTc1QTcwMCksIFNDTF9UQUIoMHgzNUJBNEI4MCksIFNDTF9UQUIoMHgzNUZGMDYwMCksIFNDTF9UQUIoMHgzNjQzRDY4MCksIFNDTF9UQUIoMHgzNjg4QkNDMCksIFNDTF9UQUIoMHgzNkNEQjg4MCksCi0gIFNDTF9UQUIoMHgzNzEyQ0E0MCksIFNDTF9UQUIoMHgzNzU3RjFDMCksIFNDTF9UQUIoMHgzNzlEMkYwMCksIFNDTF9UQUIoMHgzN0UyODE4MCksIFNDTF9UQUIoMHgzODI3RTlDMCksIFNDTF9UQUIoMHgzODZENjc0MCksIFNDTF9UQUIoMHgzOEIyRkE0MCksIFNDTF9UQUIoMHgzOEY4QTJDMCksCi0gIFNDTF9UQUIoMHgzOTNFNjA4MCksIFNDTF9UQUIoMHgzOTg0MzM4MCksIFNDTF9UQUIoMHgzOUNBMUJDMCksIFNDTF9UQUIoMHgzQTEwMTk0MCksIFNDTF9UQUIoMHgzQTU2MkJDMCksIFNDTF9UQUIoMHgzQTlDNTM0MCksIFNDTF9UQUIoMHgzQUUyOEZDMCksIFNDTF9UQUIoMHgzQjI4RTE4MCksCi0gIFNDTF9UQUIoMHgzQjZGNDgwMCksIFNDTF9UQUIoMHgzQkI1QzM0MCksIFNDTF9UQUIoMHgzQkZDNTM4MCksIFNDTF9UQUIoMHgzQzQyRjg4MCksIFNDTF9UQUIoMHgzQzg5QjIwMCksIFNDTF9UQUIoMHgzQ0QwODA4MCksIFNDTF9UQUIoMHgzRDE3NjM0MCksIFNDTF9UQUIoMHgzRDVFNUIwMCksCi0gIFNDTF9UQUIoMHgzREE1NjcwMCksIFNDTF9UQUIoMHgzREVDODdDMCksIFNDTF9UQUIoMHgzRTMzQkNDMCksIFNDTF9UQUIoMHgzRTdCMDY0MCksIFNDTF9UQUIoMHgzRUMyNjQwMCksIFNDTF9UQUIoMHgzRjA5RDY0MCksIFNDTF9UQUIoMHgzRjUxNUM4MCksIFNDTF9UQUIoMHgzRjk4Rjc0MCksCi0gIFNDTF9UQUIoMHgzRkUwQTYwMCksIFNDTF9UQUIoMHg0MDI4NjkwMCksIFNDTF9UQUIoMHg0MDcwNDAwMCksIFNDTF9UQUIoMHg0MEI4MkIwMCksIFNDTF9UQUIoMHg0MTAwMkEwMCksIFNDTF9UQUIoMHg0MTQ4M0QwMCksIFNDTF9UQUIoMHg0MTkwNjQwMCksIFNDTF9UQUIoMHg0MUQ4OUYwMCksCi0gIFNDTF9UQUIoMHg0MjIwRUQ4MCksIFNDTF9UQUIoMHg0MjY5NTAwMCksIFNDTF9UQUIoMHg0MkIxQzYwMCksIFNDTF9UQUIoMHg0MkZBNTAwMCksIFNDTF9UQUIoMHg0MzQyRUQ4MCksIFNDTF9UQUIoMHg0MzhCOUU4MCksIFNDTF9UQUIoMHg0M0Q0NjM4MCksIFNDTF9UQUIoMHg0NDFEM0I4MCksCi0gIFNDTF9UQUIoMHg0NDY2Mjc4MCksIFNDTF9UQUIoMHg0NEFGMjY4MCksIFNDTF9UQUIoMHg0NEY4MzkwMCksIFNDTF9UQUIoMHg0NTQxNUYwMCksIFNDTF9UQUIoMHg0NThBOTg4MCksIFNDTF9UQUIoMHg0NUQzRTUwMCksIFNDTF9UQUIoMHg0NjFENDUwMCksIFNDTF9UQUIoMHg0NjY2QjgwMCksCi0gIFNDTF9UQUIoMHg0NkIwM0U4MCksIFNDTF9UQUIoMHg0NkY5RDgwMCksIFNDTF9UQUIoMHg0NzQzODQ4MCksIFNDTF9UQUIoMHg0NzhENDQwMCksIFNDTF9UQUIoMHg0N0Q3MTY4MCksIFNDTF9UQUIoMHg0ODIwRkMwMCksIFNDTF9UQUIoMHg0ODZBRjUwMCksIFNDTF9UQUIoMHg0OEI1MDAwMCksCi0gIFNDTF9UQUIoMHg0OEZGMUU4MCksIFNDTF9UQUIoMHg0OTQ5NEY4MCksIFNDTF9UQUIoMHg0OTkzOTM4MCksIFNDTF9UQUIoMHg0OURERUE4MCksIFNDTF9UQUIoMHg0QTI4NTQwMCksIFNDTF9UQUIoMHg0QTcyRDAwMCksIFNDTF9UQUIoMHg0QUJENUU4MCksIFNDTF9UQUIoMHg0QjA4MDAwMCksCi0gIFNDTF9UQUIoMHg0QjUyQjQwMCksIFNDTF9UQUIoMHg0QjlEN0E4MCksIFNDTF9UQUIoMHg0QkU4NTM4MCksIFNDTF9UQUIoMHg0QzMzM0YwMCksIFNDTF9UQUIoMHg0QzdFM0QwMCksIFNDTF9UQUIoMHg0Q0M5NEQwMCksIFNDTF9UQUIoMHg0RDE0NkY4MCksIFNDTF9UQUIoMHg0RDVGQTUwMCksCi0gIFNDTF9UQUIoMHg0REFBRUMwMCksIFNDTF9UQUIoMHg0REY2NDU4MCksIFNDTF9UQUIoMHg0RTQxQjE4MCksIFNDTF9UQUIoMHg0RThEMkYwMCksIFNDTF9UQUIoMHg0RUQ4QkY4MCksIFNDTF9UQUIoMHg0RjI0NjE4MCksIFNDTF9UQUIoMHg0RjcwMTYwMCksIFNDTF9UQUIoMHg0RkJCREMwMCksCi0gIFNDTF9UQUIoMHg1MDA3QjQ4MCksIFNDTF9UQUIoMHg1MDUzOUYwMCksIFNDTF9UQUIoMHg1MDlGOUI4MCksIFNDTF9UQUIoMHg1MEVCQTk4MCksIFNDTF9UQUIoMHg1MTM3Qzk4MCksIFNDTF9UQUIoMHg1MTgzRkI4MCksIFNDTF9UQUIoMHg1MUQwM0Y4MCksIFNDTF9UQUIoMHg1MjFDOTUwMCksCi0gIFNDTF9UQUIoMHg1MjY4RkM4MCksIFNDTF9UQUIoMHg1MkI1NzU4MCksIFNDTF9UQUIoMHg1MzAyMDAwMCksIFNDTF9UQUIoMHg1MzRFOUM4MCksIFNDTF9UQUIoMHg1MzlCNEE4MCksIFNDTF9UQUIoMHg1M0U4MEE4MCksIFNDTF9UQUIoMHg1NDM0REI4MCksIFNDTF9UQUIoMHg1NDgxQkU4MCksCi0gIFNDTF9UQUIoMHg1NENFQjI4MCksIFNDTF9UQUIoMHg1NTFCQjg4MCksIFNDTF9UQUIoMHg1NTY4Q0Y4MCksIFNDTF9UQUIoMHg1NUI1RjgwMCksIFNDTF9UQUIoMHg1NjAzMzIwMCksIFNDTF9UQUIoMHg1NjUwN0Q4MCksIFNDTF9UQUIoMHg1NjlEREEwMCksIFNDTF9UQUIoMHg1NkVCNDgwMCksCi0gIFNDTF9UQUIoMHg1NzM4QzcwMCksIFNDTF9UQUIoMHg1Nzg2NTc4MCksIFNDTF9UQUIoMHg1N0QzRjkwMCksIFNDTF9UQUIoMHg1ODIxQUMwMCksIFNDTF9UQUIoMHg1ODZGNzAwMCksIFNDTF9UQUIoMHg1OEJENDUwMCksIFNDTF9UQUIoMHg1OTBCMkIwMCksIFNDTF9UQUIoMHg1OTU5MjIwMCksCi0gIFNDTF9UQUIoMHg1OUE3MkE4MCksIFNDTF9UQUIoMHg1OUY1NDM4MCksIFNDTF9UQUIoMHg1QTQzNkQ4MCksIFNDTF9UQUIoMHg1QTkxQTkwMCksIFNDTF9UQUIoMHg1QURGRjUwMCksIFNDTF9UQUIoMHg1QjJFNTE4MCksIFNDTF9UQUIoMHg1QjdDQkY4MCksIFNDTF9UQUIoMHg1QkNCM0UwMCksCi0gIFNDTF9UQUIoMHg1QzE5Q0QwMCksIFNDTF9UQUIoMHg1QzY4NkQ4MCksIFNDTF9UQUIoMHg1Q0I3MUUwMCksIFNDTF9UQUIoMHg1RDA1REY4MCksIFNDTF9UQUIoMHg1RDU0QjIwMCksIFNDTF9UQUIoMHg1REEzOTUwMCksIFNDTF9UQUIoMHg1REYyODg4MCksIFNDTF9UQUIoMHg1RTQxOEM4MCksCi0gIFNDTF9UQUIoMHg1RTkwQTEwMCksIFNDTF9UQUIoMHg1RURGQzY4MCksIFNDTF9UQUIoMHg1RjJFRkMwMCksIFNDTF9UQUIoMHg1RjdFNDI4MCksIFNDTF9UQUIoMHg1RkNEOTkwMCksIFNDTF9UQUIoMHg2MDFEMDA4MCksIFNDTF9UQUIoMHg2MDZDNzgwMCksIFNDTF9UQUIoMHg2MEJDMDAwMCksCi0gIFNDTF9UQUIoMHg2MTBCOTgwMCksIFNDTF9UQUIoMHg2MTVCNDEwMCksIFNDTF9UQUIoMHg2MUFBRjk4MCksIFNDTF9UQUIoMHg2MUZBQzMwMCksIFNDTF9UQUIoMHg2MjRBOUM4MCksIFNDTF9UQUIoMHg2MjlBODYwMCksIFNDTF9UQUIoMHg2MkVBODAwMCksIFNDTF9UQUIoMHg2MzNBOEEwMCksCi0gIFNDTF9UQUIoMHg2MzhBQTQ4MCksIFNDTF9UQUIoMHg2M0RBQ0YwMCksIFNDTF9UQUIoMHg2NDJCMDk4MCksIFNDTF9UQUIoMHg2NDdCNTQwMCksIFNDTF9UQUIoMHg2NENCQUU4MCksIFNDTF9UQUIoMHg2NTFDMTkwMCksIFNDTF9UQUIoMHg2NTZDOTQwMCksIFNDTF9UQUIoMHg2NUJEMUU4MCksCi0gIFNDTF9UQUIoMHg2NjBEQjkwMCksIFNDTF9UQUIoMHg2NjVFNjM4MCksIFNDTF9UQUIoMHg2NkFGMUUwMCksIFNDTF9UQUIoMHg2NkZGRTg4MCksIFNDTF9UQUIoMHg2NzUwQzI4MCksIFNDTF9UQUIoMHg2N0ExQUM4MCksIFNDTF9UQUIoMHg2N0YyQTYwMCksIFNDTF9UQUIoMHg2ODQzQjAwMCksCi0gIFNDTF9UQUIoMHg2ODk0QzkwMCksIFNDTF9UQUIoMHg2OEU1RjIwMCksIFNDTF9UQUIoMHg2OTM3MkIwMCksIFNDTF9UQUIoMHg2OTg4NzM4MCksIFNDTF9UQUIoMHg2OUQ5Q0I4MCksIFNDTF9UQUIoMHg2QTJCMzMwMCksIFNDTF9UQUIoMHg2QTdDQUE4MCksIFNDTF9UQUIoMHg2QUNFMzE4MCksCi0gIFNDTF9UQUIoMHg2QjFGQzgwMCksIFNDTF9UQUIoMHg2QjcxNkUwMCksIFNDTF9UQUIoMHg2QkMzMjQwMCksIFNDTF9UQUIoMHg2QzE0RTkwMCksIFNDTF9UQUIoMHg2QzY2QkQ4MCksIFNDTF9UQUIoMHg2Q0I4QTE4MCksIFNDTF9UQUIoMHg2RDBBOTUwMCksIFNDTF9UQUIoMHg2RDVDOTgwMCksCi0gIFNDTF9UQUIoMHg2REFFQUEwMCksIFNDTF9UQUIoMHg2RTAwQ0I4MCksIFNDTF9UQUIoMHg2RTUyRkM4MCksIFNDTF9UQUIoMHg2RUE1M0QwMCksIFNDTF9UQUIoMHg2RUY3OEM4MCksIFNDTF9UQUIoMHg2RjQ5RUI4MCksIFNDTF9UQUIoMHg2RjlDNTk4MCksIFNDTF9UQUIoMHg2RkVFRDcwMCksCi0gIFNDTF9UQUIoMHg3MDQxNjM4MCksIFNDTF9UQUIoMHg3MDkzRkYwMCksIFNDTF9UQUIoMHg3MEU2QUEwMCksIFNDTF9UQUIoMHg3MTM5NjQwMCksIFNDTF9UQUIoMHg3MThDMkQwMCksIFNDTF9UQUIoMHg3MURGMDU4MCksIFNDTF9UQUIoMHg3MjMxRUQwMCksIFNDTF9UQUIoMHg3Mjg0RTMwMCksCi0gIFNDTF9UQUIoMHg3MkQ3RTg4MCksIFNDTF9UQUIoMHg3MzJBRkQwMCksIFNDTF9UQUIoMHg3MzdFMjA4MCksIFNDTF9UQUIoMHg3M0QxNTMwMCksIFNDTF9UQUIoMHg3NDI0OTQ4MCksIFNDTF9UQUIoMHg3NDc3RTQ4MCksIFNDTF9UQUIoMHg3NENCNDQwMCksIFNDTF9UQUIoMHg3NTFFQjIwMCksCi0gIFNDTF9UQUIoMHg3NTcyMkYwMCksIFNDTF9UQUIoMHg3NUM1QkIwMCksIFNDTF9UQUIoMHg3NjE5NTU4MCksIFNDTF9UQUIoMHg3NjZDRkYwMCksIFNDTF9UQUIoMHg3NkMwQjcwMCksIFNDTF9UQUIoMHg3NzE0N0UwMCksIFNDTF9UQUIoMHg3NzY4NTQwMCksIFNDTF9UQUIoMHg3N0JDMzg4MCksCi0gIFNDTF9UQUIoMHg3ODEwMkI4MCksIFNDTF9UQUIoMHg3ODY0MkQ4MCksIFNDTF9UQUIoMHg3OEI4M0UwMCksIFNDTF9UQUIoMHg3OTBDNUQwMCksIFNDTF9UQUIoMHg3OTYwOEIwMCksIFNDTF9UQUIoMHg3OUI0Qzc4MCksIFNDTF9UQUIoMHg3QTA5MTI4MCksIFNDTF9UQUIoMHg3QTVENkMwMCksCi0gIFNDTF9UQUIoMHg3QUIxRDQwMCksIFNDTF9UQUIoMHg3QjA2NEE4MCksIFNDTF9UQUIoMHg3QjVBQ0Y4MCksIFNDTF9UQUIoMHg3QkFGNjM4MCksIFNDTF9UQUIoMHg3QzA0MDU4MCksIFNDTF9UQUIoMHg3QzU4QjYwMCksIFNDTF9UQUIoMHg3Q0FENzUwMCksIFNDTF9UQUIoMHg3RDAyNDIwMCksCi0gIFNDTF9UQUIoMHg3RDU3MUUwMCksIFNDTF9UQUIoMHg3REFDMDgwMCksIFNDTF9UQUIoMHg3RTAxMDA4MCksIFNDTF9UQUIoMHg3RTU2MDc4MCksIFNDTF9UQUIoMHg3RUFCMUM4MCksIFNDTF9UQUIoMHg3RjAwNDAwMCksIFNDTF9UQUIoMHg3RjU1NzIwMCksIFNDTF9UQUIoMHg3RkFBQjIwMCksCi0gIFNDTF9UQUIoMHg3RkZGRkZGRikKLX0gOworI2RlZmluZSBTQ0xfVEFCKGEpIChhID4+IDQpCitjb25zdCBGSVhQX0RCTCBJbnZlcnNlUXVhbnRUYWJsZVtJTlZfUVVBTlRfVEFCTEVTSVpFICsgMV0gPSB7CisgICAgU0NMX1RBQigweDMyQ0JGRDQwKSwgU0NMX1RBQigweDMzMEZDMzQwKSwgU0NMX1RBQigweDMzNTM5RkMwKSwKKyAgICBTQ0xfVEFCKDB4MzM5NzkyODApLCBTQ0xfVEFCKDB4MzNEQjlCQzApLCBTQ0xfVEFCKDB4MzQxRkJCODApLAorICAgIFNDTF9UQUIoMHgzNDYzRjE4MCksIFNDTF9UQUIoMHgzNEE4M0RDMCksIFNDTF9UQUIoMHgzNEVDQTAwMCksCisgICAgU0NMX1RBQigweDM1MzExODgwKSwgU0NMX1RBQigweDM1NzVBNzAwKSwgU0NMX1RBQigweDM1QkE0QjgwKSwKKyAgICBTQ0xfVEFCKDB4MzVGRjA2MDApLCBTQ0xfVEFCKDB4MzY0M0Q2ODApLCBTQ0xfVEFCKDB4MzY4OEJDQzApLAorICAgIFNDTF9UQUIoMHgzNkNEQjg4MCksIFNDTF9UQUIoMHgzNzEyQ0E0MCksIFNDTF9UQUIoMHgzNzU3RjFDMCksCisgICAgU0NMX1RBQigweDM3OUQyRjAwKSwgU0NMX1RBQigweDM3RTI4MTgwKSwgU0NMX1RBQigweDM4MjdFOUMwKSwKKyAgICBTQ0xfVEFCKDB4Mzg2RDY3NDApLCBTQ0xfVEFCKDB4MzhCMkZBNDApLCBTQ0xfVEFCKDB4MzhGOEEyQzApLAorICAgIFNDTF9UQUIoMHgzOTNFNjA4MCksIFNDTF9UQUIoMHgzOTg0MzM4MCksIFNDTF9UQUIoMHgzOUNBMUJDMCksCisgICAgU0NMX1RBQigweDNBMTAxOTQwKSwgU0NMX1RBQigweDNBNTYyQkMwKSwgU0NMX1RBQigweDNBOUM1MzQwKSwKKyAgICBTQ0xfVEFCKDB4M0FFMjhGQzApLCBTQ0xfVEFCKDB4M0IyOEUxODApLCBTQ0xfVEFCKDB4M0I2RjQ4MDApLAorICAgIFNDTF9UQUIoMHgzQkI1QzM0MCksIFNDTF9UQUIoMHgzQkZDNTM4MCksIFNDTF9UQUIoMHgzQzQyRjg4MCksCisgICAgU0NMX1RBQigweDNDODlCMjAwKSwgU0NMX1RBQigweDNDRDA4MDgwKSwgU0NMX1RBQigweDNEMTc2MzQwKSwKKyAgICBTQ0xfVEFCKDB4M0Q1RTVCMDApLCBTQ0xfVEFCKDB4M0RBNTY3MDApLCBTQ0xfVEFCKDB4M0RFQzg3QzApLAorICAgIFNDTF9UQUIoMHgzRTMzQkNDMCksIFNDTF9UQUIoMHgzRTdCMDY0MCksIFNDTF9UQUIoMHgzRUMyNjQwMCksCisgICAgU0NMX1RBQigweDNGMDlENjQwKSwgU0NMX1RBQigweDNGNTE1QzgwKSwgU0NMX1RBQigweDNGOThGNzQwKSwKKyAgICBTQ0xfVEFCKDB4M0ZFMEE2MDApLCBTQ0xfVEFCKDB4NDAyODY5MDApLCBTQ0xfVEFCKDB4NDA3MDQwMDApLAorICAgIFNDTF9UQUIoMHg0MEI4MkIwMCksIFNDTF9UQUIoMHg0MTAwMkEwMCksIFNDTF9UQUIoMHg0MTQ4M0QwMCksCisgICAgU0NMX1RBQigweDQxOTA2NDAwKSwgU0NMX1RBQigweDQxRDg5RjAwKSwgU0NMX1RBQigweDQyMjBFRDgwKSwKKyAgICBTQ0xfVEFCKDB4NDI2OTUwMDApLCBTQ0xfVEFCKDB4NDJCMUM2MDApLCBTQ0xfVEFCKDB4NDJGQTUwMDApLAorICAgIFNDTF9UQUIoMHg0MzQyRUQ4MCksIFNDTF9UQUIoMHg0MzhCOUU4MCksIFNDTF9UQUIoMHg0M0Q0NjM4MCksCisgICAgU0NMX1RBQigweDQ0MUQzQjgwKSwgU0NMX1RBQigweDQ0NjYyNzgwKSwgU0NMX1RBQigweDQ0QUYyNjgwKSwKKyAgICBTQ0xfVEFCKDB4NDRGODM5MDApLCBTQ0xfVEFCKDB4NDU0MTVGMDApLCBTQ0xfVEFCKDB4NDU4QTk4ODApLAorICAgIFNDTF9UQUIoMHg0NUQzRTUwMCksIFNDTF9UQUIoMHg0NjFENDUwMCksIFNDTF9UQUIoMHg0NjY2QjgwMCksCisgICAgU0NMX1RBQigweDQ2QjAzRTgwKSwgU0NMX1RBQigweDQ2RjlEODAwKSwgU0NMX1RBQigweDQ3NDM4NDgwKSwKKyAgICBTQ0xfVEFCKDB4NDc4RDQ0MDApLCBTQ0xfVEFCKDB4NDdENzE2ODApLCBTQ0xfVEFCKDB4NDgyMEZDMDApLAorICAgIFNDTF9UQUIoMHg0ODZBRjUwMCksIFNDTF9UQUIoMHg0OEI1MDAwMCksIFNDTF9UQUIoMHg0OEZGMUU4MCksCisgICAgU0NMX1RBQigweDQ5NDk0RjgwKSwgU0NMX1RBQigweDQ5OTM5MzgwKSwgU0NMX1RBQigweDQ5RERFQTgwKSwKKyAgICBTQ0xfVEFCKDB4NEEyODU0MDApLCBTQ0xfVEFCKDB4NEE3MkQwMDApLCBTQ0xfVEFCKDB4NEFCRDVFODApLAorICAgIFNDTF9UQUIoMHg0QjA4MDAwMCksIFNDTF9UQUIoMHg0QjUyQjQwMCksIFNDTF9UQUIoMHg0QjlEN0E4MCksCisgICAgU0NMX1RBQigweDRCRTg1MzgwKSwgU0NMX1RBQigweDRDMzMzRjAwKSwgU0NMX1RBQigweDRDN0UzRDAwKSwKKyAgICBTQ0xfVEFCKDB4NENDOTREMDApLCBTQ0xfVEFCKDB4NEQxNDZGODApLCBTQ0xfVEFCKDB4NEQ1RkE1MDApLAorICAgIFNDTF9UQUIoMHg0REFBRUMwMCksIFNDTF9UQUIoMHg0REY2NDU4MCksIFNDTF9UQUIoMHg0RTQxQjE4MCksCisgICAgU0NMX1RBQigweDRFOEQyRjAwKSwgU0NMX1RBQigweDRFRDhCRjgwKSwgU0NMX1RBQigweDRGMjQ2MTgwKSwKKyAgICBTQ0xfVEFCKDB4NEY3MDE2MDApLCBTQ0xfVEFCKDB4NEZCQkRDMDApLCBTQ0xfVEFCKDB4NTAwN0I0ODApLAorICAgIFNDTF9UQUIoMHg1MDUzOUYwMCksIFNDTF9UQUIoMHg1MDlGOUI4MCksIFNDTF9UQUIoMHg1MEVCQTk4MCksCisgICAgU0NMX1RBQigweDUxMzdDOTgwKSwgU0NMX1RBQigweDUxODNGQjgwKSwgU0NMX1RBQigweDUxRDAzRjgwKSwKKyAgICBTQ0xfVEFCKDB4NTIxQzk1MDApLCBTQ0xfVEFCKDB4NTI2OEZDODApLCBTQ0xfVEFCKDB4NTJCNTc1ODApLAorICAgIFNDTF9UQUIoMHg1MzAyMDAwMCksIFNDTF9UQUIoMHg1MzRFOUM4MCksIFNDTF9UQUIoMHg1MzlCNEE4MCksCisgICAgU0NMX1RBQigweDUzRTgwQTgwKSwgU0NMX1RBQigweDU0MzREQjgwKSwgU0NMX1RBQigweDU0ODFCRTgwKSwKKyAgICBTQ0xfVEFCKDB4NTRDRUIyODApLCBTQ0xfVEFCKDB4NTUxQkI4ODApLCBTQ0xfVEFCKDB4NTU2OENGODApLAorICAgIFNDTF9UQUIoMHg1NUI1RjgwMCksIFNDTF9UQUIoMHg1NjAzMzIwMCksIFNDTF9UQUIoMHg1NjUwN0Q4MCksCisgICAgU0NMX1RBQigweDU2OUREQTAwKSwgU0NMX1RBQigweDU2RUI0ODAwKSwgU0NMX1RBQigweDU3MzhDNzAwKSwKKyAgICBTQ0xfVEFCKDB4NTc4NjU3ODApLCBTQ0xfVEFCKDB4NTdEM0Y5MDApLCBTQ0xfVEFCKDB4NTgyMUFDMDApLAorICAgIFNDTF9UQUIoMHg1ODZGNzAwMCksIFNDTF9UQUIoMHg1OEJENDUwMCksIFNDTF9UQUIoMHg1OTBCMkIwMCksCisgICAgU0NMX1RBQigweDU5NTkyMjAwKSwgU0NMX1RBQigweDU5QTcyQTgwKSwgU0NMX1RBQigweDU5RjU0MzgwKSwKKyAgICBTQ0xfVEFCKDB4NUE0MzZEODApLCBTQ0xfVEFCKDB4NUE5MUE5MDApLCBTQ0xfVEFCKDB4NUFERkY1MDApLAorICAgIFNDTF9UQUIoMHg1QjJFNTE4MCksIFNDTF9UQUIoMHg1QjdDQkY4MCksIFNDTF9UQUIoMHg1QkNCM0UwMCksCisgICAgU0NMX1RBQigweDVDMTlDRDAwKSwgU0NMX1RBQigweDVDNjg2RDgwKSwgU0NMX1RBQigweDVDQjcxRTAwKSwKKyAgICBTQ0xfVEFCKDB4NUQwNURGODApLCBTQ0xfVEFCKDB4NUQ1NEIyMDApLCBTQ0xfVEFCKDB4NURBMzk1MDApLAorICAgIFNDTF9UQUIoMHg1REYyODg4MCksIFNDTF9UQUIoMHg1RTQxOEM4MCksIFNDTF9UQUIoMHg1RTkwQTEwMCksCisgICAgU0NMX1RBQigweDVFREZDNjgwKSwgU0NMX1RBQigweDVGMkVGQzAwKSwgU0NMX1RBQigweDVGN0U0MjgwKSwKKyAgICBTQ0xfVEFCKDB4NUZDRDk5MDApLCBTQ0xfVEFCKDB4NjAxRDAwODApLCBTQ0xfVEFCKDB4NjA2Qzc4MDApLAorICAgIFNDTF9UQUIoMHg2MEJDMDAwMCksIFNDTF9UQUIoMHg2MTBCOTgwMCksIFNDTF9UQUIoMHg2MTVCNDEwMCksCisgICAgU0NMX1RBQigweDYxQUFGOTgwKSwgU0NMX1RBQigweDYxRkFDMzAwKSwgU0NMX1RBQigweDYyNEE5QzgwKSwKKyAgICBTQ0xfVEFCKDB4NjI5QTg2MDApLCBTQ0xfVEFCKDB4NjJFQTgwMDApLCBTQ0xfVEFCKDB4NjMzQThBMDApLAorICAgIFNDTF9UQUIoMHg2MzhBQTQ4MCksIFNDTF9UQUIoMHg2M0RBQ0YwMCksIFNDTF9UQUIoMHg2NDJCMDk4MCksCisgICAgU0NMX1RBQigweDY0N0I1NDAwKSwgU0NMX1RBQigweDY0Q0JBRTgwKSwgU0NMX1RBQigweDY1MUMxOTAwKSwKKyAgICBTQ0xfVEFCKDB4NjU2Qzk0MDApLCBTQ0xfVEFCKDB4NjVCRDFFODApLCBTQ0xfVEFCKDB4NjYwREI5MDApLAorICAgIFNDTF9UQUIoMHg2NjVFNjM4MCksIFNDTF9UQUIoMHg2NkFGMUUwMCksIFNDTF9UQUIoMHg2NkZGRTg4MCksCisgICAgU0NMX1RBQigweDY3NTBDMjgwKSwgU0NMX1RBQigweDY3QTFBQzgwKSwgU0NMX1RBQigweDY3RjJBNjAwKSwKKyAgICBTQ0xfVEFCKDB4Njg0M0IwMDApLCBTQ0xfVEFCKDB4Njg5NEM5MDApLCBTQ0xfVEFCKDB4NjhFNUYyMDApLAorICAgIFNDTF9UQUIoMHg2OTM3MkIwMCksIFNDTF9UQUIoMHg2OTg4NzM4MCksIFNDTF9UQUIoMHg2OUQ5Q0I4MCksCisgICAgU0NMX1RBQigweDZBMkIzMzAwKSwgU0NMX1RBQigweDZBN0NBQTgwKSwgU0NMX1RBQigweDZBQ0UzMTgwKSwKKyAgICBTQ0xfVEFCKDB4NkIxRkM4MDApLCBTQ0xfVEFCKDB4NkI3MTZFMDApLCBTQ0xfVEFCKDB4NkJDMzI0MDApLAorICAgIFNDTF9UQUIoMHg2QzE0RTkwMCksIFNDTF9UQUIoMHg2QzY2QkQ4MCksIFNDTF9UQUIoMHg2Q0I4QTE4MCksCisgICAgU0NMX1RBQigweDZEMEE5NTAwKSwgU0NMX1RBQigweDZENUM5ODAwKSwgU0NMX1RBQigweDZEQUVBQTAwKSwKKyAgICBTQ0xfVEFCKDB4NkUwMENCODApLCBTQ0xfVEFCKDB4NkU1MkZDODApLCBTQ0xfVEFCKDB4NkVBNTNEMDApLAorICAgIFNDTF9UQUIoMHg2RUY3OEM4MCksIFNDTF9UQUIoMHg2RjQ5RUI4MCksIFNDTF9UQUIoMHg2RjlDNTk4MCksCisgICAgU0NMX1RBQigweDZGRUVENzAwKSwgU0NMX1RBQigweDcwNDE2MzgwKSwgU0NMX1RBQigweDcwOTNGRjAwKSwKKyAgICBTQ0xfVEFCKDB4NzBFNkFBMDApLCBTQ0xfVEFCKDB4NzEzOTY0MDApLCBTQ0xfVEFCKDB4NzE4QzJEMDApLAorICAgIFNDTF9UQUIoMHg3MURGMDU4MCksIFNDTF9UQUIoMHg3MjMxRUQwMCksIFNDTF9UQUIoMHg3Mjg0RTMwMCksCisgICAgU0NMX1RBQigweDcyRDdFODgwKSwgU0NMX1RBQigweDczMkFGRDAwKSwgU0NMX1RBQigweDczN0UyMDgwKSwKKyAgICBTQ0xfVEFCKDB4NzNEMTUzMDApLCBTQ0xfVEFCKDB4NzQyNDk0ODApLCBTQ0xfVEFCKDB4NzQ3N0U0ODApLAorICAgIFNDTF9UQUIoMHg3NENCNDQwMCksIFNDTF9UQUIoMHg3NTFFQjIwMCksIFNDTF9UQUIoMHg3NTcyMkYwMCksCisgICAgU0NMX1RBQigweDc1QzVCQjAwKSwgU0NMX1RBQigweDc2MTk1NTgwKSwgU0NMX1RBQigweDc2NkNGRjAwKSwKKyAgICBTQ0xfVEFCKDB4NzZDMEI3MDApLCBTQ0xfVEFCKDB4NzcxNDdFMDApLCBTQ0xfVEFCKDB4Nzc2ODU0MDApLAorICAgIFNDTF9UQUIoMHg3N0JDMzg4MCksIFNDTF9UQUIoMHg3ODEwMkI4MCksIFNDTF9UQUIoMHg3ODY0MkQ4MCksCisgICAgU0NMX1RBQigweDc4QjgzRTAwKSwgU0NMX1RBQigweDc5MEM1RDAwKSwgU0NMX1RBQigweDc5NjA4QjAwKSwKKyAgICBTQ0xfVEFCKDB4NzlCNEM3ODApLCBTQ0xfVEFCKDB4N0EwOTEyODApLCBTQ0xfVEFCKDB4N0E1RDZDMDApLAorICAgIFNDTF9UQUIoMHg3QUIxRDQwMCksIFNDTF9UQUIoMHg3QjA2NEE4MCksIFNDTF9UQUIoMHg3QjVBQ0Y4MCksCisgICAgU0NMX1RBQigweDdCQUY2MzgwKSwgU0NMX1RBQigweDdDMDQwNTgwKSwgU0NMX1RBQigweDdDNThCNjAwKSwKKyAgICBTQ0xfVEFCKDB4N0NBRDc1MDApLCBTQ0xfVEFCKDB4N0QwMjQyMDApLCBTQ0xfVEFCKDB4N0Q1NzFFMDApLAorICAgIFNDTF9UQUIoMHg3REFDMDgwMCksIFNDTF9UQUIoMHg3RTAxMDA4MCksIFNDTF9UQUIoMHg3RTU2MDc4MCksCisgICAgU0NMX1RBQigweDdFQUIxQzgwKSwgU0NMX1RBQigweDdGMDA0MDAwKSwgU0NMX1RBQigweDdGNTU3MjAwKSwKKyAgICBTQ0xfVEFCKDB4N0ZBQUIyMDApLCBTQ0xfVEFCKDB4N0ZGRkZGRkYpfTsKIAogLyoqCi0gKiBcYnJpZWYgVGFibGUgcmVwcmVzZW50aW5nIHNjYWxlIGZhY3RvciBnYWlucy4gR2l2ZW4gYSBzY2FsZSBmYWN0b3Igc2YsIGFuZCBhIHZhbHVlIHBTcGVjW2ldIHRoZQotICogZ2FpbiBpcyBnaXZlbiBieTogTWFudGlzc2FUYWJsZVtzZiAlIDRdW21zYl0gPSAyXihzZiAlIDQpIC8gKDE8PEV4cG9uZW50VGFibGVbc2YgJSA0XVttc2JdCi0gKiBUaGUgc2Vjb25kIGRpbWVuc2lvbiAibXNiIiByZXByZXNlbnRzIHRoZSB1cHBlciBzY2FsZSBmYWN0b3IgYml0IGNvdW50IGZsb29yKGxvZzIoc2NhbGVmYWN0b3IgPj4gMikpCi0gKiBUaGUgY29ycmVzcG9uZGluZyBleHBvbmVudHMgZm9yIHRoZSB2YWx1ZXMgaW4gdGhpcyB0YWJsZXMgYXJlIHN0b3JlZCBpbiBFeHBvbmVudFRhYmxlW3NmICUgNF1bbXNiXSBiZWxvdy4KKyAqIFxicmllZiBUYWJsZSByZXByZXNlbnRpbmcgc2NhbGUgZmFjdG9yIGdhaW5zLiBHaXZlbiBhIHNjYWxlIGZhY3RvciBzZiwgYW5kIGEKKyAqIHZhbHVlIHBTcGVjW2ldIHRoZSBnYWluIGlzIGdpdmVuIGJ5OiBNYW50aXNzYVRhYmxlW3NmICUgNF1bbXNiXSA9IDJeKHNmICUgNCkKKyAqIC8gKDE8PEV4cG9uZW50VGFibGVbc2YgJSA0XVttc2JdIFRoZSBzZWNvbmQgZGltZW5zaW9uICJtc2IiIHJlcHJlc2VudHMgdGhlCisgKiB1cHBlciBzY2FsZSBmYWN0b3IgYml0IGNvdW50IGZsb29yKGxvZzIoc2NhbGVmYWN0b3IgPj4gMikpIFRoZSBjb3JyZXNwb25kaW5nCisgKiBleHBvbmVudHMgZm9yIHRoZSB2YWx1ZXMgaW4gdGhpcyB0YWJsZXMgYXJlIHN0b3JlZCBpbiBFeHBvbmVudFRhYmxlW3NmICUKKyAqIDRdW21zYl0gYmVsb3cuCiAgKi8KLWNvbnN0IEZJWFBfREJMIE1hbnRpc3NhVGFibGUgWzRdWzE0XSA9Ci17Ci0gIHsKLSAgICAweDQwMDAwMDAwLCAweDUwQTI4QzAwLCAweDY1OTdGQTgwLCAweDQwMDAwMDAwLCAweDUwQTI4QzAwLCAweDY1OTdGQTgwLCAweDQwMDAwMDAwLCAweDUwQTI4QzAwLAotICAgIDB4NjU5N0ZBODAsIDB4NDAwMDAwMDAsIDB4NTBBMjhDMDAsIDB4NjU5N0ZBODAsIDB4NDAwMDAwMDAsIDB4NTBBMjhDMDAKLSAgfSwKLSAgewotICAgIDB4NEMxQkY4MDAsIDB4NUZFNDQzODAsIDB4NzhEMERGODAsIDB4NEMxQkY4MDAsIDB4NUZFNDQzODAsIDB4NzhEMERGODAsIDB4NEMxQkY4MDAsIDB4NUZFNDQzODAsCi0gICAgMHg3OEQwREY4MCwgMHg0QzFCRjgwMCwgMHg1RkU0NDM4MCwgMHg3OEQwREY4MCwgMHg0QzFCRjgwMCwgMHg1RkU0NDM4MAotICB9LAotICB7Ci0gICAgMHg1QTgyNzk4MCwgMHg3MjA4RjgwMCwgMHg0N0Q2NkIwMCwgMHg1QTgyNzk4MCwgMHg3MjA4RjgwMCwgMHg0N0Q2NkIwMCwgMHg1QTgyNzk4MCwgMHg3MjA4RjgwMCwKLSAgICAweDQ3RDY2QjAwLCAweDVBODI3OTgwLCAweDcyMDhGODAwLCAweDQ3RDY2QjAwLCAweDVBODI3OTgwLCAweDcyMDhGODAwCi0gIH0sCi0gIHsKLSAgICAweDZCQTI3RTgwLCAweDQzQ0UzRTgwLCAweDU1NkUwNDAwLCAweDZCQTI3RTgwLCAweDQzQ0UzRTgwLCAweDU1NkUwNDAwLCAweDZCQTI3RTgwLCAweDQzQ0UzRTgwLAotICAgIDB4NTU2RTA0MDAsIDB4NkJBMjdFODAsIDB4NDNDRTNFODAsIDB4NTU2RTA0MDAsIDB4NkJBMjdFODAsIDB4NDNDRTNFODAKLSAgfQotfSA7Citjb25zdCBGSVhQX0RCTCBNYW50aXNzYVRhYmxlWzRdWzE0XSA9IHsKKyAgICB7MHg0MDAwMDAwMCwgMHg1MEEyOEMwMCwgMHg2NTk3RkE4MCwgMHg0MDAwMDAwMCwgMHg1MEEyOEMwMCwgMHg2NTk3RkE4MCwKKyAgICAgMHg0MDAwMDAwMCwgMHg1MEEyOEMwMCwgMHg2NTk3RkE4MCwgMHg0MDAwMDAwMCwgMHg1MEEyOEMwMCwgMHg2NTk3RkE4MCwKKyAgICAgMHg0MDAwMDAwMCwgMHg1MEEyOEMwMH0sCisgICAgezB4NEMxQkY4MDAsIDB4NUZFNDQzODAsIDB4NzhEMERGODAsIDB4NEMxQkY4MDAsIDB4NUZFNDQzODAsIDB4NzhEMERGODAsCisgICAgIDB4NEMxQkY4MDAsIDB4NUZFNDQzODAsIDB4NzhEMERGODAsIDB4NEMxQkY4MDAsIDB4NUZFNDQzODAsIDB4NzhEMERGODAsCisgICAgIDB4NEMxQkY4MDAsIDB4NUZFNDQzODB9LAorICAgIHsweDVBODI3OTgwLCAweDcyMDhGODAwLCAweDQ3RDY2QjAwLCAweDVBODI3OTgwLCAweDcyMDhGODAwLCAweDQ3RDY2QjAwLAorICAgICAweDVBODI3OTgwLCAweDcyMDhGODAwLCAweDQ3RDY2QjAwLCAweDVBODI3OTgwLCAweDcyMDhGODAwLCAweDQ3RDY2QjAwLAorICAgICAweDVBODI3OTgwLCAweDcyMDhGODAwfSwKKyAgICB7MHg2QkEyN0U4MCwgMHg0M0NFM0U4MCwgMHg1NTZFMDQwMCwgMHg2QkEyN0U4MCwgMHg0M0NFM0U4MCwgMHg1NTZFMDQwMCwKKyAgICAgMHg2QkEyN0U4MCwgMHg0M0NFM0U4MCwgMHg1NTZFMDQwMCwgMHg2QkEyN0U4MCwgMHg0M0NFM0U4MCwgMHg1NTZFMDQwMCwKKyAgICAgMHg2QkEyN0U4MCwgMHg0M0NFM0U4MH19OwogCi1jb25zdCBTQ0hBUiBFeHBvbmVudFRhYmxlIFs0XVsxNF0gPQotewotICB7IDEsIDIsIDMsIDUsIDYsIDcsIDksIDEwLCAxMSwgMTMsIDE0LCAxNSwgMTcsIDE4IH0sCi0gIHsgMSwgMiwgMywgNSwgNiwgNywgOSwgMTAsIDExLCAxMywgMTQsIDE1LCAxNywgMTggfSwKLSAgeyAxLCAyLCA0LCA1LCA2LCA4LCA5LCAxMCwgMTIsIDEzLCAxNCwgMTYsIDE3LCAxOCB9LAotICB7IDEsIDMsIDQsIDUsIDcsIDgsIDksIDExLCAxMiwgMTMsIDE1LCAxNiwgMTcsIDE5IH0KLX0gOwotCitjb25zdCBTQ0hBUiBFeHBvbmVudFRhYmxlWzRdWzE0XSA9IHsKKyAgICB7MSwgMiwgMywgNSwgNiwgNywgOSwgMTAsIDExLCAxMywgMTQsIDE1LCAxNywgMTh9LAorICAgIHsxLCAyLCAzLCA1LCA2LCA3LCA5LCAxMCwgMTEsIDEzLCAxNCwgMTUsIDE3LCAxOH0sCisgICAgezEsIDIsIDQsIDUsIDYsIDgsIDksIDEwLCAxMiwgMTMsIDE0LCAxNiwgMTcsIDE4fSwKKyAgICB7MSwgMywgNCwgNSwgNywgOCwgOSwgMTEsIDEyLCAxMywgMTUsIDE2LCAxNywgMTl9fTsKIAogLyogNDEgc2NmYmFuZHMgKi8KLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfOTZfMTAyNFs0Ml0gPQotewotICAgICAwLCAgICA0LCAgICA4LCAgIDEyLCAgIDE2LCAgIDIwLCAgIDI0LCAgIDI4LCAgIDMyLCAgIDM2LCAgIDQwLCAgIDQ0LAotICAgIDQ4LCAgIDUyLCAgIDU2LCAgIDY0LCAgIDcyLCAgIDgwLCAgIDg4LCAgIDk2LCAgMTA4LCAgMTIwLCAgMTMyLCAgMTQ0LAotICAgMTU2LCAgMTcyLCAgMTg4LCAgMjEyLCAgMjQwLCAgMjc2LCAgMzIwLCAgMzg0LCAgNDQ4LCAgNTEyLCAgNTc2LCAgNjQwLAotICAgNzA0LCAgNzY4LCAgODMyLCAgODk2LCAgOTYwLCAxMDI0Ci19Oworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl85Nl8xMDI0WzQyXSA9IHsKKyAgICAwLCAgIDQsICAgOCwgICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDQsICA0OCwgIDUyLAorICAgIDU2LCAgNjQsICA3MiwgIDgwLCAgODgsICA5NiwgIDEwOCwgMTIwLCAxMzIsIDE0NCwgMTU2LCAxNzIsIDE4OCwgMjEyLAorICAgIDI0MCwgMjc2LCAzMjAsIDM4NCwgNDQ4LCA1MTIsIDU3NiwgNjQwLCA3MDQsIDc2OCwgODMyLCA4OTYsIDk2MCwgMTAyNH07CiAvKiAxMiBzY2ZiYW5kcyAqLwotc3RhdGljIGNvbnN0IFNIT1JUIHNmYl85Nl8xMjhbMTNdID0KLXsKLSAgICAgMCwgICAgNCwgICAgOCwgICAxMiwgICAxNiwgICAyMCwgICAyNCwgICAzMiwgICA0MCwgICA0OCwgICAgNjQsICA5MiwKLSAgIDEyOAotfTsKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfOTZfMTI4WzEzXSA9IHswLCAgNCwgIDgsICAxMiwgMTYsIDIwLCAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwgNDAsIDQ4LCA2NCwgOTIsIDEyOH07CiAKIC8qIDQ3IHNjZmJhbmRzKi8KLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfNjRfMTAyNFs0OF0gPQotewotICAgICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDQsICA0OCwgIDUyLAotICAgIDU2LCAgNjQsICA3MiwgIDgwLCAgODgsIDEwMCwgMTEyLCAgMTI0LCAxNDAsIDE1NiwgMTcyLCAxOTIsIDIxNiwgMjQwLAotICAgMjY4LCAzMDQsIDM0NCwgMzg0LCA0MjQsIDQ2NCwgNTA0LCAgNTQ0LCA1ODQsIDYyNCwgNjY0LCA3MDQsIDc0NCwgNzg0LAotICAgODI0LCA4NjQsIDkwNCwgOTQ0LCA5ODQsMTAyNAotfTsKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfNjRfMTAyNFs0OF0gPSB7CisgICAgMCwgICA0LCAgIDgsICAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ0LAorICAgIDQ4LCAgNTIsICA1NiwgIDY0LCAgNzIsICA4MCwgIDg4LCAgMTAwLCAxMTIsIDEyNCwgMTQwLCAxNTYsCisgICAgMTcyLCAxOTIsIDIxNiwgMjQwLCAyNjgsIDMwNCwgMzQ0LCAzODQsIDQyNCwgNDY0LCA1MDQsIDU0NCwKKyAgICA1ODQsIDYyNCwgNjY0LCA3MDQsIDc0NCwgNzg0LCA4MjQsIDg2NCwgOTA0LCA5NDQsIDk4NCwgMTAyNH07CiAKIC8qIDEyIHNjZmJhbmRzICovCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzY0XzEyOFsxM10gPQotewotICAgICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LAotICAgIDMyLCAgNDAsICA0OCwgIDY0LCAgOTIsIDEyOAotfTsKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfNjRfMTI4WzEzXSA9IHswLCAgNCwgIDgsICAxMiwgMTYsIDIwLCAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwgNDAsIDQ4LCA2NCwgOTIsIDEyOH07CiAKIC8qIDQ5IHNjZmJhbmRzICovCiBzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzQ4XzEwMjRbNTBdID0gewotICAgICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDgsICA1NiwgIDY0LAotICAgIDcyLCAgODAsICA4OCwgIDk2LCAxMDgsIDEyMCwgMTMyLCAgMTQ0LCAxNjAsIDE3NiwgMTk2LCAyMTYsIDI0MCwgMjY0LAotICAgMjkyLCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCwgNDgwLCAgNTEyLCA1NDQsIDU3NiwgNjA4LCA2NDAsIDY3MiwgNzA0LAotICAgNzM2LCA3NjgsIDgwMCwgODMyLCA4NjQsIDg5NiwgOTI4LCAxMDI0Ci19OworICAgIDAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0OCwgIDU2LAorICAgIDY0LCAgNzIsICA4MCwgIDg4LCAgOTYsICAxMDgsIDEyMCwgMTMyLCAxNDQsIDE2MCwgMTc2LCAxOTYsIDIxNiwKKyAgICAyNDAsIDI2NCwgMjkyLCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCwgNDgwLCA1MTIsIDU0NCwgNTc2LCA2MDgsCisgICAgNjQwLCA2NzIsIDcwNCwgNzM2LCA3NjgsIDgwMCwgODMyLCA4NjQsIDg5NiwgOTI4LCAxMDI0fTsKIC8qIDE0IHNjZmJhbmRzICovCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzQ4XzEyOFsxNV0gPQotewotICAgICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI4LCAgIDM2LCAgNDQsICA1NiwgIDY4LCAgODAsICA5NiwgMTEyLAotICAgMTI4Ci19Oworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl80OF8xMjhbMTVdID0gezAsICA0LCAgOCwgIDEyLCAxNiwgMjAsICAyOCwgMzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQsIDU2LCA2OCwgODAsIDk2LCAxMTIsIDEyOH07CiAKIC8qIDUxIHNjZmJhbmRzICovCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzMyXzEwMjRbNTJdID0KLXsKLSAgICAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ4LCAgNTYsICA2NCwKLSAgICA3MiwgIDgwLCAgODgsICA5NiwgMTA4LCAxMjAsIDEzMiwgIDE0NCwgMTYwLCAxNzYsIDE5NiwgMjE2LCAyNDAsIDI2NCwKLSAgIDI5MiwgMzIwLCAzNTIsIDM4NCwgNDE2LCA0NDgsIDQ4MCwgIDUxMiwgNTQ0LCA1NzYsIDYwOCwgNjQwLCA2NzIsIDcwNCwKLSAgIDczNiwgNzY4LCA4MDAsIDgzMiwgODY0LCA4OTYsIDkyOCwgIDk2MCwgOTkyLDEwMjQKLX07CitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzMyXzEwMjRbNTJdID0geworICAgIDAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0OCwgIDU2LAorICAgIDY0LCAgNzIsICA4MCwgIDg4LCAgOTYsICAxMDgsIDEyMCwgMTMyLCAxNDQsIDE2MCwgMTc2LCAxOTYsIDIxNiwKKyAgICAyNDAsIDI2NCwgMjkyLCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCwgNDgwLCA1MTIsIDU0NCwgNTc2LCA2MDgsCisgICAgNjQwLCA2NzIsIDcwNCwgNzM2LCA3NjgsIDgwMCwgODMyLCA4NjQsIDg5NiwgOTI4LCA5NjAsIDk5MiwgMTAyNH07CiAKIC8qIDQ3IHNjZmJhbmRzICovCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzI0XzEwMjRbNDhdID0KLXsKLSAgICAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ0LCAgNTIsICA2MCwKLSAgICA2OCwgIDc2LCAgODQsICA5MiwgMTAwLCAxMDgsIDExNiwgIDEyNCwgMTM2LCAxNDgsIDE2MCwgMTcyLCAxODgsIDIwNCwKLSAgIDIyMCwgMjQwLCAyNjAsIDI4NCwgMzA4LCAzMzYsIDM2NCwgICAzOTYsIDQzMiwgNDY4LCA1MDgsIDU1MiwgNjAwLCA2NTIsCi0gICA3MDQsIDc2OCwgODMyLCA4OTYsIDk2MCwxMDI0Ci19Oworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8yNF8xMDI0WzQ4XSA9IHsKKyAgICAwLCAgIDQsICAgOCwgICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDQsCisgICAgNTIsICA2MCwgIDY4LCAgNzYsICA4NCwgIDkyLCAgMTAwLCAxMDgsIDExNiwgMTI0LCAxMzYsIDE0OCwKKyAgICAxNjAsIDE3MiwgMTg4LCAyMDQsIDIyMCwgMjQwLCAyNjAsIDI4NCwgMzA4LCAzMzYsIDM2NCwgMzk2LAorICAgIDQzMiwgNDY4LCA1MDgsIDU1MiwgNjAwLCA2NTIsIDcwNCwgNzY4LCA4MzIsIDg5NiwgOTYwLCAxMDI0fTsKIAogLyogMTUgc2NmYmFuZHMgKi8KLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfMjRfMTI4WzE2XSA9Ci17Ci0gICAgIDAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAgMjgsICAzNiwgIDQ0LCAgNTIsICA2NCwgIDc2LCAgOTIsCi0gICAxMDgsIDEyOAotfTsKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfMjRfMTI4WzE2XSA9IHswLCAgNCwgIDgsICAxMiwgMTYsIDIwLCAyNCwgIDI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2LCA0NCwgNTIsIDY0LCA3NiwgOTIsIDEwOCwgMTI4fTsKIAogLyogNDMgc2NmYmFuZHMgKi8KLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfMTZfMTAyNFs0NF0gPQotewotICAgICAwLCAgIDgsICAxNiwgIDI0LCAgMzIsICA0MCwgIDQ4LCAgIDU2LCAgNjQsICA3MiwgIDgwLCAgODgsIDEwMCwgMTEyLAotICAgMTI0LCAxMzYsIDE0OCwgMTYwLCAxNzIsIDE4NCwgMTk2LCAgMjEyLCAyMjgsIDI0NCwgMjYwLCAyODAsIDMwMCwgMzIwLAotICAgMzQ0LCAzNjgsIDM5NiwgNDI0LCA0NTYsIDQ5MiwgNTMyLCAgNTcyLCA2MTYsIDY2NCwgNzE2LCA3NzIsIDgzMiwgODk2LAotICAgOTYwLDEwMjQKLX07CitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzE2XzEwMjRbNDRdID0geworICAgIDAsICAgOCwgICAxNiwgIDI0LCAgMzIsICA0MCwgIDQ4LCAgNTYsICA2NCwgIDcyLCAgODAsICA4OCwgIDEwMCwgMTEyLCAxMjQsCisgICAgMTM2LCAxNDgsIDE2MCwgMTcyLCAxODQsIDE5NiwgMjEyLCAyMjgsIDI0NCwgMjYwLCAyODAsIDMwMCwgMzIwLCAzNDQsIDM2OCwKKyAgICAzOTYsIDQyNCwgNDU2LCA0OTIsIDUzMiwgNTcyLCA2MTYsIDY2NCwgNzE2LCA3NzIsIDgzMiwgODk2LCA5NjAsIDEwMjR9OwogCiAvKiAxNSBzY2ZiYW5kcyAqLwotc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8xNl8xMjhbMTZdID0KLXsKLSAgICAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgICAyOCwgIDMyLCAgNDAsICA0OCwgIDYwLCAgNzIsICA4OCwKLSAgIDEwOCwgMTI4Ci19Oworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8xNl8xMjhbMTZdID0gezAsICA0LCAgOCwgIDEyLCAxNiwgMjAsIDI0LCAgMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIsIDQwLCA0OCwgNjAsIDcyLCA4OCwgMTA4LCAxMjh9OwogCiAvKiA0MCBzY2ZiYW5kcyAqLwotc3RhdGljIGNvbnN0IFNIT1JUIHNmYl84XzEwMjRbNDFdID0KLXsKLSAgICAgMCwgIDEyLCAgMjQsICAzNiwgIDQ4LCAgNjAsICA3MiwgICA4NCwgIDk2LCAxMDgsIDEyMCwgMTMyLCAxNDQsIDE1NiwKLSAgIDE3MiwgMTg4LCAyMDQsIDIyMCwgMjM2LCAyNTIsIDI2OCwgIDI4OCwgMzA4LCAzMjgsIDM0OCwgMzcyLCAzOTYsIDQyMCwKLSAgIDQ0OCwgNDc2LCA1MDgsIDU0NCwgNTgwLCA2MjAsIDY2NCwgIDcxMiwgNzY0LCA4MjAsIDg4MCwgOTQ0LDEwMjQKLX07CitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzhfMTAyNFs0MV0gPSB7CisgICAgMCwgICAxMiwgIDI0LCAgMzYsICA0OCwgIDYwLCAgNzIsICA4NCwgIDk2LCAgMTA4LCAxMjAsIDEzMiwgMTQ0LCAxNTYsCisgICAgMTcyLCAxODgsIDIwNCwgMjIwLCAyMzYsIDI1MiwgMjY4LCAyODgsIDMwOCwgMzI4LCAzNDgsIDM3MiwgMzk2LCA0MjAsCisgICAgNDQ4LCA0NzYsIDUwOCwgNTQ0LCA1ODAsIDYyMCwgNjY0LCA3MTIsIDc2NCwgODIwLCA4ODAsIDk0NCwgMTAyNH07CiAKIC8qIDE1IHNjZmJhbmRzICovCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzhfMTI4WzE2XSA9Ci17Ci0gICAgIDAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAgMjgsICAzNiwgIDQ0LCAgNTIsICA2MCwgIDcyLCAgODgsCi0gICAxMDgsIDEyOAotfTsKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfOF8xMjhbMTZdID0gezAsICA0LCAgOCwgIDEyLCAxNiwgMjAsIDI0LCAgMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNiwgNDQsIDUyLCA2MCwgNzIsIDg4LCAxMDgsIDEyOH07CiAKK3N0YXRpYyBjb25zdCBTSE9SVAorICAgIHNmYl85Nl85NjBbNDJdID0gezAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsCisgICAgICAgICAgICAgICAgICAgICAgNDQsICA0OCwgIDUyLCAgNTYsICA2NCwgIDcyLCAgODAsICA4OCwgIDk2LCAgMTA4LCAxMjAsCisgICAgICAgICAgICAgICAgICAgICAgMTMyLCAxNDQsIDE1NiwgMTcyLCAxODgsIDIxMiwgMjQwLCAyNzYsIDMyMCwgMzg0LCA0NDgsCisgICAgICAgICAgICAgICAgICAgICAgNTEyLCA1NzYsIDY0MCwgNzA0LCA3NjgsIDgzMiwgODk2LCA5NjB9OyAvKiA0MCBzY2ZiYW5kcyAqLwogCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzk2Xzk2MFs0Ml0gPQotewotICAwLCAgICAgIDQsICAgICAgOCwgICAgICAxMiwgICAgIDE2LCAgICAgMjAsICAgICAyNCwgICAgIDI4LCAgICAgMzIsICAgICAzNiwKLSAgNDAsICAgICA0NCwgICAgIDQ4LCAgICAgNTIsICAgICA1NiwgICAgIDY0LCAgICAgNzIsICAgICA4MCwgICAgIDg4LCAgICAgOTYsCi0gIDEwOCwgICAgMTIwLCAgICAxMzIsICAgIDE0NCwgICAgMTU2LCAgICAxNzIsICAgIDE4OCwgICAgMjEyLCAgICAyNDAsICAgIDI3NiwKLSAgMzIwLCAgICAzODQsICAgIDQ0OCwgICAgNTEyLCAgICA1NzYsICAgIDY0MCwgICAgNzA0LCAgICA3NjgsICAgIDgzMiwgICAgODk2LAotICA5NjAKLX07ICAgLyogNDAgc2NmYmFuZHMgKi8KK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfOTZfMTIwWzEzXSA9IHswLCAgNCwgIDgsICAxMiwgMTYsIDIwLCAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwgNDAsIDQ4LCA2NCwgOTIsIDEyMH07IC8qIDEyIHNjZmJhbmRzICovCiAKLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfOTZfMTIwWzEzXSA9Ci17Ci0gIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMzIsICAgICA0MCwgICAgIDQ4LAotICA2NCwgICAgIDkyLCAgICAgMTIwCi19OyAgIC8qIDEyIHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzY0Xzk2MFs0N10gPSB7CisgICAgMCwgICA0LCAgIDgsICAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ0LAorICAgIDQ4LCAgNTIsICA1NiwgIDY0LCAgNzIsICA4MCwgIDg4LCAgMTAwLCAxMTIsIDEyNCwgMTQwLCAxNTYsCisgICAgMTcyLCAxOTIsIDIxNiwgMjQwLCAyNjgsIDMwNCwgMzQ0LCAzODQsIDQyNCwgNDY0LCA1MDQsIDU0NCwKKyAgICA1ODQsIDYyNCwgNjY0LCA3MDQsIDc0NCwgNzg0LCA4MjQsIDg2NCwgOTA0LCA5NDQsIDk2MH07IC8qIDQ2IHNjZmJhbmRzICovCiAKLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfNjRfOTYwWzQ3XSA9Ci17Ci0gIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMjgsICAgICAzMiwgICAgIDM2LAotICA0MCwgICAgIDQ0LCAgICAgNDgsICAgICA1MiwgICAgIDU2LCAgICAgNjQsICAgICA3MiwgICAgIDgwLCAgICAgODgsICAgICAxMDAsCi0gIDExMiwgICAgMTI0LCAgICAxNDAsICAgIDE1NiwgICAgMTcyLCAgICAxOTIsICAgIDIxNiwgICAgMjQwLCAgICAyNjgsICAgIDMwNCwKLSAgMzQ0LCAgICAzODQsICAgIDQyNCwgICAgNDY0LCAgICA1MDQsICAgIDU0NCwgICAgNTg0LCAgICA2MjQsICAgIDY2NCwgICAgNzA0LAotICA3NDQsICAgIDc4NCwgICAgODI0LCAgICA4NjQsICAgIDkwNCwgICAgOTQ0LCAgICA5NjAKLX07ICAgLyogNDYgc2NmYmFuZHMgKi8KK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfNjRfMTIwWzEzXSA9IHswLCAgNCwgIDgsICAxMiwgMTYsIDIwLCAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwgNDAsIDQ4LCA2NCwgOTIsIDEyMH07IC8qIDEyIHNjZmJhbmRzICovCiAKLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfNjRfMTIwWzEzXSA9Ci17Ci0gIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMzIsICAgICA0MCwgICAgIDQ4LAotICA2NCwgICAgIDkyLCAgICAgMTIwCi19OyAgIC8qIDEyIHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzQ4Xzk2MFs1MF0gPSB7CisgICAgMCwgICA0LCAgIDgsICAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ4LCAgNTYsCisgICAgNjQsICA3MiwgIDgwLCAgODgsICA5NiwgIDEwOCwgMTIwLCAxMzIsIDE0NCwgMTYwLCAxNzYsIDE5NiwgMjE2LAorICAgIDI0MCwgMjY0LCAyOTIsIDMyMCwgMzUyLCAzODQsIDQxNiwgNDQ4LCA0ODAsIDUxMiwgNTQ0LCA1NzYsIDYwOCwKKyAgICA2NDAsIDY3MiwgNzA0LCA3MzYsIDc2OCwgODAwLCA4MzIsIDg2NCwgODk2LCA5MjgsIDk2MH07IC8qIDQ5IHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzQ4XzEyMFsxNV0gPSB7CisgICAgMCwgIDQsICA4LCAgMTIsIDE2LCAyMCwgIDI4LCAzNiwKKyAgICA0NCwgNTYsIDY4LCA4MCwgOTYsIDExMiwgMTIwfTsgLyogMTQgc2NmYmFuZHMgKi8KIAotc3RhdGljIGNvbnN0IFNIT1JUIHNmYl80OF85NjBbNTBdID0KLXsKLSAgMCwgICAgICA0LCAgICAgIDgsICAgICAgMTIsICAgICAxNiwgICAgIDIwLCAgICAgMjQsICAgICAyOCwgICAgIDMyLCAgICAgMzYsCi0gIDQwLCAgICAgNDgsICAgICA1NiwgICAgIDY0LCAgICAgNzIsICAgICA4MCwgICAgIDg4LCAgICAgOTYsICAgICAxMDgsICAgIDEyMCwKLSAgMTMyLCAgICAxNDQsICAgIDE2MCwgICAgMTc2LCAgICAxOTYsICAgIDIxNiwgICAgMjQwLCAgICAyNjQsICAgIDI5MiwgICAgMzIwLAotICAzNTIsICAgIDM4NCwgICAgNDE2LCAgICA0NDgsICAgIDQ4MCwgICAgNTEyLCAgICA1NDQsICAgIDU3NiwgICAgNjA4LCAgICA2NDAsCi0gIDY3MiwgICAgNzA0LCAgICA3MzYsICAgIDc2OCwgICAgODAwLCAgICA4MzIsICAgIDg2NCwgICAgODk2LCAgICA5MjgsICAgIDk2MAotfTsgICAvKiA0OSBzY2ZiYW5kcyAqLwotc3RhdGljIGNvbnN0IFNIT1JUIHNmYl80OF8xMjBbMTVdID0KLXsKLSAgMCwgICAgICA0LCAgICAgIDgsICAgICAgMTIsICAgICAxNiwgICAgIDIwLCAgICAgMjgsICAgICAzNiwgICAgIDQ0LCAgICAgNTYsCi0gIDY4LCAgICAgODAsICAgICA5NiwgICAgIDExMiwgICAgMTIwCi19OyAgIC8qIDE0IHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzMyXzk2MFs1MF0gPSB7CisgICAgMCwgICA0LCAgIDgsICAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ4LCAgNTYsCisgICAgNjQsICA3MiwgIDgwLCAgODgsICA5NiwgIDEwOCwgMTIwLCAxMzIsIDE0NCwgMTYwLCAxNzYsIDE5NiwgMjE2LAorICAgIDI0MCwgMjY0LCAyOTIsIDMyMCwgMzUyLCAzODQsIDQxNiwgNDQ4LCA0ODAsIDUxMiwgNTQ0LCA1NzYsIDYwOCwKKyAgICA2NDAsIDY3MiwgNzA0LCA3MzYsIDc2OCwgODAwLCA4MzIsIDg2NCwgODk2LCA5MjgsIDk2MH07IC8qIDQ5IHNjZmJhbmRzICovCiAKLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfMzJfOTYwWzUwXSA9Ci17Ci0gIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMjgsICAgICAzMiwgICAgIDM2LAotICA0MCwgICAgIDQ4LCAgICAgNTYsICAgICA2NCwgICAgIDcyLCAgICAgODAsICAgICA4OCwgICAgIDk2LCAgICAgMTA4LCAgICAxMjAsCi0gIDEzMiwgICAgMTQ0LCAgICAxNjAsICAgIDE3NiwgICAgMTk2LCAgICAyMTYsICAgIDI0MCwgICAgMjY0LCAgICAyOTIsICAgIDMyMCwKLSAgMzUyLCAgICAzODQsICAgIDQxNiwgICAgNDQ4LCAgICA0ODAsICAgIDUxMiwgICAgNTQ0LCAgICA1NzYsICAgIDYwOCwgICAgNjQwLAotICA2NzIsICAgIDcwNCwgICAgNzM2LCAgICA3NjgsICAgIDgwMCwgICAgODMyLCAgICA4NjQsICAgIDg5NiwgICAgOTI4LCAgICA5NjAKLX07ICAgLyogNDkgc2NmYmFuZHMgKi8KK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfMjRfOTYwWzQ3XSA9IHsKKyAgICAwLCAgIDQsICAgOCwgICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDQsCisgICAgNTIsICA2MCwgIDY4LCAgNzYsICA4NCwgIDkyLCAgMTAwLCAxMDgsIDExNiwgMTI0LCAxMzYsIDE0OCwKKyAgICAxNjAsIDE3MiwgMTg4LCAyMDQsIDIyMCwgMjQwLCAyNjAsIDI4NCwgMzA4LCAzMzYsIDM2NCwgMzk2LAorICAgIDQzMiwgNDY4LCA1MDgsIDU1MiwgNjAwLCA2NTIsIDcwNCwgNzY4LCA4MzIsIDg5NiwgOTYwfTsgLyogNDYgc2NmYmFuZHMgKi8KIAotc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8yNF85NjBbNDddID0KLXsKLSAgMCwgICAgICA0LCAgICAgIDgsICAgICAgMTIsICAgICAxNiwgICAgIDIwLCAgICAgMjQsICAgICAyOCwgICAgIDMyLCAgICAgMzYsCi0gIDQwLCAgICAgNDQsICAgICA1MiwgICAgIDYwLCAgICAgNjgsICAgICA3NiwgICAgIDg0LCAgICAgOTIsICAgICAxMDAsICAgIDEwOCwKLSAgMTE2LCAgICAxMjQsICAgIDEzNiwgICAgMTQ4LCAgICAxNjAsICAgIDE3MiwgICAgMTg4LCAgICAyMDQsICAgIDIyMCwgICAgMjQwLAotICAyNjAsICAgIDI4NCwgICAgMzA4LCAgICAzMzYsICAgIDM2NCwgICAgMzk2LCAgICA0MzIsICAgIDQ2OCwgICAgNTA4LCAgICA1NTIsCi0gIDYwMCwgICAgNjUyLCAgICA3MDQsICAgIDc2OCwgICAgODMyLCAgICA4OTYsICAgIDk2MAotfTsgICAvKiA0NiBzY2ZiYW5kcyAqLworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8yNF8xMjBbMTZdID0geworICAgIDAsICA0LCAgOCwgIDEyLCAxNiwgMjAsIDI0LCAgMjgsCisgICAgMzYsIDQ0LCA1MiwgNjQsIDc2LCA5MiwgMTA4LCAxMjB9OyAvKiAxNSBzY2ZiYW5kcyAqLwogCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzI0XzEyMFsxNl0gPQotewotICAwLCAgICAgIDQsICAgICAgOCwgICAgICAxMiwgICAgIDE2LCAgICAgMjAsICAgICAyNCwgICAgIDI4LCAgICAgMzYsICAgICA0NCwKLSAgNTIsICAgICA2NCwgICAgIDc2LCAgICAgOTIsICAgICAxMDgsICAgIDEyMAotfTsgICAvKiAxNSBzY2ZiYW5kcyAqLworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8xNl85NjBbNDNdID0gezAsICAgOCwgICAxNiwgIDI0LCAgMzIsICA0MCwgIDQ4LCAgNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQsICA3MiwgIDgwLCAgODgsICAxMDAsIDExMiwgMTI0LCAxMzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ4LCAxNjAsIDE3MiwgMTg0LCAxOTYsIDIxMiwgMjI4LCAyNDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYwLCAyODAsIDMwMCwgMzIwLCAzNDQsIDM2OCwgMzk2LCA0MjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDU2LCA0OTIsIDUzMiwgNTcyLCA2MTYsIDY2NCwgNzE2LCA3NzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODMyLCA4OTYsIDk2MH07IC8qIDQyIHNjZmJhbmRzICovCiAKLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfMTZfOTYwWzQzXSA9Ci17Ci0gIDAsICAgICAgOCwgICAgICAxNiwgICAgIDI0LCAgICAgMzIsICAgICA0MCwgICAgIDQ4LCAgICAgNTYsICAgICA2NCwgICAgIDcyLAotICA4MCwgICAgIDg4LCAgICAgMTAwLCAgICAxMTIsICAgIDEyNCwgICAgMTM2LCAgICAxNDgsICAgIDE2MCwgICAgMTcyLCAgICAxODQsCi0gIDE5NiwgICAgMjEyLCAgICAyMjgsICAgIDI0NCwgICAgMjYwLCAgICAyODAsICAgIDMwMCwgICAgMzIwLCAgICAzNDQsICAgIDM2OCwKLSAgMzk2LCAgICA0MjQsICAgIDQ1NiwgICAgNDkyLCAgICA1MzIsICAgIDU3MiwgICAgNjE2LCAgICA2NjQsICAgIDcxNiwgICAgNzcyLAotICA4MzIsICAgIDg5NiwgICAgOTYwCi19OyAgIC8qIDQyIHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzE2XzEyMFsxNl0gPSB7CisgICAgMCwgIDQsICA4LCAgMTIsIDE2LCAyMCwgMjQsICAyOCwKKyAgICAzMiwgNDAsIDQ4LCA2MCwgNzIsIDg4LCAxMDgsIDEyMH07IC8qIDE1IHNjZmJhbmRzICovCiAKLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfMTZfMTIwWzE2XSA9Ci17Ci0gIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMjgsICAgICAzMiwgICAgIDQwLAotICA0OCwgICAgIDYwLCAgICAgNzIsICAgICA4OCwgICAgIDEwOCwgICAgMTIwCi19OyAgIC8qIDE1IHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzhfOTYwWzQxXSA9IHswLCAgIDEyLCAgMjQsICAzNiwgIDQ4LCAgNjAsICA3MiwgIDg0LCAgOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDgsIDEyMCwgMTMyLCAxNDQsIDE1NiwgMTcyLCAxODgsIDIwNCwgMjIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM2LCAyNTIsIDI2OCwgMjg4LCAzMDgsIDMyOCwgMzQ4LCAzNzIsIDM5NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyMCwgNDQ4LCA0NzYsIDUwOCwgNTQ0LCA1ODAsIDYyMCwgNjY0LCA3MTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NjQsIDgyMCwgODgwLCA5NDQsIDk2MH07IC8qIDQwIHNjZmJhbmRzICovCiAKLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfOF85NjBbNDFdID0KLXsKLSAgMCwgICAgICAxMiwgICAgIDI0LCAgICAgMzYsICAgICA0OCwgICAgIDYwLCAgICAgNzIsICAgICA4NCwgICAgIDk2LCAgICAgMTA4LAotICAxMjAsICAgIDEzMiwgICAgMTQ0LCAgICAxNTYsICAgIDE3MiwgICAgMTg4LCAgICAyMDQsICAgIDIyMCwgICAgMjM2LCAgICAyNTIsCi0gIDI2OCwgICAgMjg4LCAgICAzMDgsICAgIDMyOCwgICAgMzQ4LCAgICAzNzIsICAgIDM5NiwgICAgNDIwLCAgICA0NDgsICAgIDQ3NiwKLSAgNTA4LCAgICA1NDQsICAgIDU4MCwgICAgNjIwLCAgICA2NjQsICAgIDcxMiwgICAgNzY0LCAgICA4MjAsICAgIDg4MCwgICAgOTQ0LAotICA5NjAKLX07ICAgLyogNDAgc2NmYmFuZHMgKi8KK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfOF8xMjBbMTZdID0geworICAgIDAsICA0LCAgOCwgIDEyLCAxNiwgMjAsIDI0LCAgMjgsCisgICAgMzYsIDQ0LCA1MiwgNjAsIDcyLCA4OCwgMTA4LCAxMjB9OyAvKiAxNSBzY2ZiYW5kcyAqLwogCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzhfMTIwWzE2XSA9Ci17Ci0gIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMjgsICAgICAzNiwgICAgIDQ0LAotICA1MiwgICAgIDYwLCAgICAgNzIsICAgICA4OCwgICAgIDEwOCwgICAgMTIwCi19OyAgIC8qIDE1IHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQKKyAgICBzZmJfOTZfNzY4W10gPSB7MCwgICA0LCAgIDgsICAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDMyLCAgMzYsCisgICAgICAgICAgICAgICAgICAgIDQwLCAgNDQsICA0OCwgIDUyLCAgNTYsICA2NCwgIDcyLCAgODAsICA4OCwgIDk2LAorICAgICAgICAgICAgICAgICAgICAxMDgsIDEyMCwgMTMyLCAxNDQsIDE1NiwgMTcyLCAxODgsIDIxMiwgMjQwLCAyNzYsCisgICAgICAgICAgICAgICAgICAgIDMyMCwgMzg0LCA0NDgsIDUxMiwgNTc2LCA2NDAsIDcwNCwgNzY4fTsgLyogMzcgc2NmYmFuZHMgKi8KK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfOTZfOTZbXSA9IHswLCAgNCwgIDgsICAxMiwgMTYsIDIwLCAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwgNDAsIDQ4LCA2NCwgOTIsIDk2fTsgLyogMTIgc2NmYmFuZHMgKi8KIAorc3RhdGljIGNvbnN0IFNIT1JUIHNmYl82NF83NjhbXSA9CisgICAgeworICAgICAgICAwLCAgIDQsICAgOCwgICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLAorICAgICAgICA0NCwgIDQ4LCAgNTIsICA1NiwgIDY0LCAgNzIsICA4MCwgIDg4LCAgMTAwLCAxMTIsIDEyNCwKKyAgICAgICAgMTQwLCAxNTYsIDE3MiwgMTkyLCAyMTYsIDI0MCwgMjY4LCAzMDQsIDM0NCwgMzg0LCA0MjQsCisgICAgICAgIDQ2NCwgNTA0LCA1NDQsIDU4NCwgNjI0LCA2NjQsIDcwNCwgNzQ0LCA3Njh9OyAvKiA0MSBzY2ZiYW5kcyAqLwogCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzY0Xzk2W10gPSB7MCwgIDQsICA4LCAgMTIsIDE2LCAyMCwgMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIsIDQwLCA0OCwgNjQsIDkyLCA5Nn07IC8qIDEyIHNjZmJhbmRzICovCiAKK3N0YXRpYyBjb25zdCBTSE9SVAorICAgIHNmYl80OF83NjhbXSA9IHswLCAgIDQsICAgOCwgICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDgsCisgICAgICAgICAgICAgICAgICAgIDU2LCAgNjQsICA3MiwgIDgwLCAgODgsICA5NiwgIDEwOCwgMTIwLCAxMzIsIDE0NCwgMTYwLCAxNzYsCisgICAgICAgICAgICAgICAgICAgIDE5NiwgMjE2LCAyNDAsIDI2NCwgMjkyLCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCwgNDgwLCA1MTIsCisgICAgICAgICAgICAgICAgICAgIDU0NCwgNTc2LCA2MDgsIDY0MCwgNjcyLCA3MDQsIDczNiwgNzY4fTsgLyogNDMgc2NmYmFuZHMgKi8KIAotc3RhdGljIGNvbnN0IFNIT1JUIHNmYl80OF81MTJbMzddID0KLXsKLSAgMCwgICAgICA0LCAgICAgIDgsICAgICAgMTIsICAgICAxNiwgICAgIDIwLCAgICAgMjQsICAgICAyOCwgICAgIDMyLCAgICAgMzYsCi0gIDQwLCAgICAgNDQsICAgICA0OCwgICAgIDUyLCAgICAgNTYsICAgICA2MCwgICAgIDY4LCAgICAgNzYsICAgICA4NCwgICAgIDkyLAotICAxMDAsICAgIDExMiwgICAgMTI0LCAgICAxMzYsICAgIDE0OCwgICAgMTY0LCAgICAxODQsICAgIDIwOCwgICAgMjM2LCAgICAyNjgsCi0gIDMwMCwgICAgMzMyLCAgICAzNjQsICAgIDM5NiwgICAgNDI4LCAgICA0NjAsICAgIDUxMgotfTsgICAvKiAzNiBzY2ZiYW5kcyAqLwotc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8zMl81MTJbMzhdID0KLXsKLSAgMCwgICAgICA0LCAgICAgIDgsICAgICAgMTIsICAgICAxNiwgICAgIDIwLCAgICAgMjQsICAgICAyOCwgICAgIDMyLCAgICAgMzYsCi0gIDQwLCAgICAgNDQsICAgICA0OCwgICAgIDUyLCAgICAgNTYsICAgICA2NCwgICAgIDcyLCAgICAgODAsICAgICA4OCwgICAgIDk2LAotICAxMDgsICAgIDEyMCwgICAgMTMyLCAgICAxNDQsICAgIDE2MCwgICAgMTc2LCAgICAxOTIsICAgIDIxMiwgICAgMjM2LCAgICAyNjAsCi0gIDI4OCwgICAgMzIwLCAgICAzNTIsICAgIDM4NCwgICAgNDE2LCAgICA0NDgsICAgIDQ4MCwgICAgNTEyCi19OyAgIC8qIDM3IHNjZmJhbmRzICovCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzI0XzUxMlszMl0gPQotewotICAwLCAgICAgIDQsICAgICAgOCwgICAgICAxMiwgICAgIDE2LCAgICAgMjAsICAgICAyNCwgICAgIDI4LCAgICAgMzIsICAgICAzNiwKLSAgNDAsICAgICA0NCwgICAgIDUyLCAgICAgNjAsICAgICA2OCwgICAgIDgwLCAgICAgOTIsICAgICAxMDQsICAgIDEyMCwgICAgMTQwLAotICAxNjQsICAgIDE5MiwgICAgMjI0LCAgICAyNTYsICAgIDI4OCwgICAgMzIwLCAgICAzNTIsICAgIDM4NCwgICAgNDE2LCAgICA0NDgsCi0gIDQ4MCwgICAgNTEyCi19OyAgIC8qIDMxIHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzQ4Xzk2W10gPSB7MCwgIDQsICA4LCAgMTIsIDE2LCAyMCwgMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzYsIDQ0LCA1NiwgNjgsIDgwLCA5Nn07IC8qIDEyIHNjZmJhbmRzICovCiAKLXN0YXRpYyBjb25zdCBTSE9SVCBzZmJfNDhfNDgwWzM2XSA9Ci17Ci0gIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMjgsICAgICAzMiwgICAgIDM2LAotICA0MCwgICAgIDQ0LCAgICAgNDgsICAgICA1MiwgICAgIDU2LCAgICAgNjQsICAgICA3MiwgICAgIDgwLCAgICAgODgsICAgICA5NiwKLSAgMTA4LCAgICAxMjAsICAgIDEzMiwgICAgMTQ0LCAgICAxNTYsICAgIDE3MiwgICAgMTg4LCAgICAyMTIsICAgIDI0MCwgICAgMjcyLAotICAzMDQsICAgIDMzNiwgICAgMzY4LCAgICA0MDAsICAgIDQzMiwgICAgNDgwCi19OyAgIC8qIDM1IHNjZmJhbmRzICovCi1zdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzMyXzQ4MFszOF0gPQotewotICAwLCAgICAgIDQsICAgICAgOCwgICAgICAxMiwgICAgIDE2LCAgICAgMjAsICAgICAyNCwgICAgIDI4LCAgICAgMzIsICAgICAzNiwKLSAgNDAsICAgICA0NCwgICAgIDQ4LCAgICAgNTIsICAgICA1NiwgICAgIDYwLCAgICAgNjQsICAgICA3MiwgICAgIDgwLCAgICAgODgsCi0gIDk2LCAgICAgMTA0LCAgICAxMTIsICAgIDEyNCwgICAgMTM2LCAgICAxNDgsICAgIDE2NCwgICAgMTgwLCAgICAyMDAsICAgIDIyNCwKLSAgMjU2LCAgICAyODgsICAgIDMyMCwgICAgMzUyLCAgICAzODQsICAgIDQxNiwgICAgNDQ4LCAgICA0ODAKLX07ICAgLyogMzcgc2NmYmFuZHMgKi8KK3N0YXRpYyBjb25zdCBTSE9SVAorICAgIHNmYl8zMl83NjhbXSA9IHswLCAgIDQsICAgOCwgICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDgsCisgICAgICAgICAgICAgICAgICAgIDU2LCAgNjQsICA3MiwgIDgwLCAgODgsICA5NiwgIDEwOCwgMTIwLCAxMzIsIDE0NCwgMTYwLCAxNzYsCisgICAgICAgICAgICAgICAgICAgIDE5NiwgMjE2LCAyNDAsIDI2NCwgMjkyLCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCwgNDgwLCA1MTIsCisgICAgICAgICAgICAgICAgICAgIDU0NCwgNTc2LCA2MDgsIDY0MCwgNjcyLCA3MDQsIDczNiwgNzY4fTsgLyogNDMgc2NmYmFuZHMgKi8KKworc3RhdGljIGNvbnN0IFNIT1JUCisgICAgc2ZiXzI0Xzc2OFtdID0gezAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0NCwKKyAgICAgICAgICAgICAgICAgICAgNTIsICA2MCwgIDY4LCAgNzYsICA4NCwgIDkyLCAgMTAwLCAxMDgsIDExNiwgMTI0LCAxMzYsIDE0OCwKKyAgICAgICAgICAgICAgICAgICAgMTYwLCAxNzIsIDE4OCwgMjA0LCAyMjAsIDI0MCwgMjYwLCAyODQsIDMwOCwgMzM2LCAzNjQsIDM5NiwKKyAgICAgICAgICAgICAgICAgICAgNDMyLCA0NjgsIDUwOCwgNTUyLCA2MDAsIDY1MiwgNzA0LCA3Njh9OyAvKiA0MyBzY2ZiYW5kcyAqLworCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzI0Xzk2W10gPSB7MCwgIDQsICA4LCAgMTIsIDE2LCAyMCwgMjQsIDI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2LCA0NCwgNTIsIDY0LCA3NiwgOTIsIDk2fTsgLyogMTQgc2NmYmFuZHMgKi8KKworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8xNl83NjhbXSA9IHswLCAgIDgsICAgMTYsICAyNCwgIDMyLCAgNDAsICA0OCwgIDU2LCAgNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLCAgODAsICA4OCwgIDEwMCwgMTEyLCAxMjQsIDEzNiwgMTQ4LCAxNjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3MiwgMTg0LCAxOTYsIDIxMiwgMjI4LCAyNDQsIDI2MCwgMjgwLCAzMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMCwgMzQ0LCAzNjgsIDM5NiwgNDI0LCA0NTYsIDQ5MiwgNTMyLCA1NzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYxNiwgNjY0LCA3MTYsIDc2OH07IC8qIDM5IHNjZmJhbmRzICovCisKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfMTZfOTZbXSA9IHswLCAgNCwgIDgsICAxMiwgMTYsIDIwLCAyNCwgMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIsIDQwLCA0OCwgNjAsIDcyLCA4OCwgOTZ9OyAvKiAxNCBzY2ZiYW5kcyAqLworCitzdGF0aWMgY29uc3QgU0hPUlQKKyAgICBzZmJfOF83NjhbXSA9IHswLCAgIDEyLCAgMjQsICAzNiwgIDQ4LCAgNjAsICA3MiwgIDg0LCAgOTYsICAxMDgsCisgICAgICAgICAgICAgICAgICAgMTIwLCAxMzIsIDE0NCwgMTU2LCAxNzIsIDE4OCwgMjA0LCAyMjAsIDIzNiwgMjUyLAorICAgICAgICAgICAgICAgICAgIDI2OCwgMjg4LCAzMDgsIDMyOCwgMzQ4LCAzNzIsIDM5NiwgNDIwLCA0NDgsIDQ3NiwKKyAgICAgICAgICAgICAgICAgICA1MDgsIDU0NCwgNTgwLCA2MjAsIDY2NCwgNzEyLCA3NjQsIDc2OH07IC8qIDM3IHNjZmJhbmRzICovCisKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfOF85NltdID0gezAsICA0LCAgOCwgIDEyLCAxNiwgMjAsIDI0LCAyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2LCA0NCwgNTIsIDYwLCA3MiwgODgsIDk2fTsgLyogMTQgc2NmYmFuZHMgKi8KKworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl80OF81MTJbMzddID0geworICAgIDAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0NCwgIDQ4LAorICAgIDUyLCAgNTYsICA2MCwgIDY4LCAgNzYsICA4NCwgIDkyLCAgMTAwLCAxMTIsIDEyNCwgMTM2LCAxNDgsIDE2NCwKKyAgICAxODQsIDIwOCwgMjM2LCAyNjgsIDMwMCwgMzMyLCAzNjQsIDM5NiwgNDI4LCA0NjAsIDUxMn07IC8qIDM2IHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQKKyAgICBzZmJfMzJfNTEyWzM4XSA9IHswLCAgIDQsICAgOCwgICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwKKyAgICAgICAgICAgICAgICAgICAgICA0MCwgIDQ0LCAgNDgsICA1MiwgIDU2LCAgNjQsICA3MiwgIDgwLCAgODgsICA5NiwKKyAgICAgICAgICAgICAgICAgICAgICAxMDgsIDEyMCwgMTMyLCAxNDQsIDE2MCwgMTc2LCAxOTIsIDIxMiwgMjM2LCAyNjAsCisgICAgICAgICAgICAgICAgICAgICAgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCwgNDgwLCA1MTJ9OyAvKiAzNyBzY2ZiYW5kcyAqLworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl8yNF81MTJbMzJdID0geworICAgIDAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsCisgICAgNDQsICA1MiwgIDYwLCAgNjgsICA4MCwgIDkyLCAgMTA0LCAxMjAsIDE0MCwgMTY0LCAxOTIsCisgICAgMjI0LCAyNTYsIDI4OCwgMzIwLCAzNTIsIDM4NCwgNDE2LCA0NDgsIDQ4MCwgNTEyfTsgLyogMzEgc2NmYmFuZHMgKi8KKworc3RhdGljIGNvbnN0IFNIT1JUIHNmYl80OF80ODBbMzZdID0geworICAgIDAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0NCwgIDQ4LAorICAgIDUyLCAgNTYsICA2NCwgIDcyLCAgODAsICA4OCwgIDk2LCAgMTA4LCAxMjAsIDEzMiwgMTQ0LCAxNTYsIDE3MiwKKyAgICAxODgsIDIxMiwgMjQwLCAyNzIsIDMwNCwgMzM2LCAzNjgsIDQwMCwgNDMyLCA0ODB9OyAvKiAzNSBzY2ZiYW5kcyAqLworc3RhdGljIGNvbnN0IFNIT1JUCisgICAgc2ZiXzMyXzQ4MFszOF0gPSB7MCwgICA0LCAgIDgsICAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDMyLCAgMzYsCisgICAgICAgICAgICAgICAgICAgICAgNDAsICA0NCwgIDQ4LCAgNTIsICA1NiwgIDYwLCAgNjQsICA3MiwgIDgwLCAgODgsCisgICAgICAgICAgICAgICAgICAgICAgOTYsICAxMDQsIDExMiwgMTI0LCAxMzYsIDE0OCwgMTY0LCAxODAsIDIwMCwgMjI0LAorICAgICAgICAgICAgICAgICAgICAgIDI1NiwgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCwgNDgwfTsgLyogMzcgc2NmYmFuZHMgKi8KIHN0YXRpYyBjb25zdCBTSE9SVCBzZmJfMjRfNDgwWzMxXSA9Ci17Ci0gIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMjgsICAgICAzMiwgICAgIDM2LAotICA0MCwgICAgIDQ0LCAgICAgNTIsICAgICA2MCwgICAgIDY4LCAgICAgODAsICAgICA5MiwgICAgIDEwNCwgICAgMTIwLCAgICAxNDAsCi0gIDE2NCwgICAgMTkyLCAgICAyMjQsICAgIDI1NiwgICAgMjg4LCAgICAzMjAsICAgIDM1MiwgICAgMzg0LCAgICA0MTYsICAgIDQ0OCwKLSAgNDgwCi19OyAgIC8qIDMwIHNjZmJhbmRzICovCisgICAgezAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsCisgICAgIDQ0LCAgNTIsICA2MCwgIDY4LCAgODAsICA5MiwgIDEwNCwgMTIwLCAxNDAsIDE2NCwgMTkyLAorICAgICAyMjQsIDI1NiwgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCwgNDgwfTsgLyogMzAgc2NmYmFuZHMgKi8KIAotY29uc3QgU0ZCX0lORk8gc2ZiT2Zmc2V0VGFibGVzWzVdWzE2XSA9Ci17Ci0gIHsKLSAgICB7IHNmYl85Nl8xMDI0LCBzZmJfOTZfMTI4LCA0MSwgMTIgfSwKLSAgICB7IHNmYl85Nl8xMDI0LCBzZmJfOTZfMTI4LCA0MSwgMTIgfSwKLSAgICB7IHNmYl82NF8xMDI0LCBzZmJfNjRfMTI4LCA0NywgMTIgfSwKLSAgICB7IHNmYl80OF8xMDI0LCBzZmJfNDhfMTI4LCA0OSwgMTQgfSwKLSAgICB7IHNmYl80OF8xMDI0LCBzZmJfNDhfMTI4LCA0OSwgMTQgfSwKLSAgICB7IHNmYl8zMl8xMDI0LCBzZmJfNDhfMTI4LCA1MSwgMTQgfSwKLSAgICB7IHNmYl8yNF8xMDI0LCBzZmJfMjRfMTI4LCA0NywgMTUgfSwKLSAgICB7IHNmYl8yNF8xMDI0LCBzZmJfMjRfMTI4LCA0NywgMTUgfSwKLSAgICB7IHNmYl8xNl8xMDI0LCBzZmJfMTZfMTI4LCA0MywgMTUgfSwKLSAgICB7IHNmYl8xNl8xMDI0LCBzZmJfMTZfMTI4LCA0MywgMTUgfSwKLSAgICB7IHNmYl8xNl8xMDI0LCBzZmJfMTZfMTI4LCA0MywgMTUgfSwKLSAgICB7IHNmYl84XzEwMjQsIHNmYl84XzEyOCwgNDAsIDE1IH0sCi0gICAgeyBzZmJfOF8xMDI0LCBzZmJfOF8xMjgsIDQwLCAxNSB9LAotICB9LCB7Ci0gICAgeyBzZmJfOTZfOTYwLCBzZmJfOTZfMTIwLCA0MCwgMTIgfSwKLSAgICB7IHNmYl85Nl85NjAsIHNmYl85Nl8xMjAsIDQwLCAxMiB9LAotICAgIHsgc2ZiXzY0Xzk2MCwgc2ZiXzY0XzEyMCwgNDYsIDEyIH0sCi0gICAgeyBzZmJfNDhfOTYwLCBzZmJfNDhfMTIwLCA0OSwgMTQgfSwKLSAgICB7IHNmYl80OF85NjAsIHNmYl80OF8xMjAsIDQ5LCAxNCB9LAotICAgIHsgc2ZiXzMyXzk2MCwgc2ZiXzQ4XzEyMCwgNDksIDE0IH0sCi0gICAgeyBzZmJfMjRfOTYwLCBzZmJfMjRfMTIwLCA0NiwgMTUgfSwKLSAgICB7IHNmYl8yNF85NjAsIHNmYl8yNF8xMjAsIDQ2LCAxNSB9LAotICAgIHsgc2ZiXzE2Xzk2MCwgc2ZiXzE2XzEyMCwgNDIsIDE1IH0sCi0gICAgeyBzZmJfMTZfOTYwLCBzZmJfMTZfMTIwLCA0MiwgMTUgfSwKLSAgICB7IHNmYl8xNl85NjAsIHNmYl8xNl8xMjAsIDQyLCAxNSB9LAotICAgIHsgc2ZiXzhfOTYwLCBzZmJfOF8xMjAsIDQwLCAxNSB9LAotICAgIHsgc2ZiXzhfOTYwLCBzZmJfOF8xMjAsIDQwLCAxNSB9LAotICB9LCB7Ci0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCi0gIH0sIHsKLSAgICB7IHNmYl80OF81MTIsICBOVUxMLCAzNiwgMCB9LAotICAgIHsgc2ZiXzQ4XzUxMiwgIE5VTEwsIDM2LCAwIH0sCi0gICAgeyBzZmJfNDhfNTEyLCAgTlVMTCwgMzYsIDAgfSwKLSAgICB7IHNmYl80OF81MTIsICBOVUxMLCAzNiwgMCB9LAotICAgIHsgc2ZiXzQ4XzUxMiwgTlVMTCwgMzYsIDB9LAotICAgIHsgc2ZiXzMyXzUxMiwgTlVMTCwgMzcsIDAgfSwKLSAgICB7IHNmYl8yNF81MTIsIE5VTEwsIDMxLCAwIH0sCi0gICAgeyBzZmJfMjRfNTEyLCBOVUxMLCAzMSwgMCB9LAotICAgIHsgc2ZiXzI0XzUxMiwgTlVMTCwgMzEsIDAgfSwKLSAgICB7IHNmYl8yNF81MTIsIE5VTEwsIDMxLCAwIH0sCi0gICAgeyBzZmJfMjRfNTEyLCBOVUxMLCAzMSwgMCB9LAotICAgIHsgc2ZiXzI0XzUxMiwgTlVMTCwgMzEsIDAgfSwKLSAgICB7IHNmYl8yNF81MTIsIE5VTEwsIDMxLCAwIH0sCi0gIH0sIHsKLSAgICB7IHNmYl80OF80ODAsIE5VTEwsIDM1LCAwIH0sCi0gICAgeyBzZmJfNDhfNDgwLCBOVUxMLCAzNSwgMCB9LAotICAgIHsgc2ZiXzQ4XzQ4MCwgTlVMTCwgMzUsIDAgfSwKLSAgICB7IHNmYl80OF80ODAsIE5VTEwsIDM1LCAwIH0sCi0gICAgeyBzZmJfNDhfNDgwLCBOVUxMLCAzNSwgMCB9LAotICAgIHsgc2ZiXzMyXzQ4MCwgTlVMTCwgMzcsIDAgfSwKLSAgICB7IHNmYl8yNF80ODAsIE5VTEwsIDMwLCAwIH0sCi0gICAgeyBzZmJfMjRfNDgwLCBOVUxMLCAzMCwgMCB9LAotICAgIHsgc2ZiXzI0XzQ4MCwgTlVMTCwgMzAsIDAgfSwKLSAgICB7IHNmYl8yNF80ODAsIE5VTEwsIDMwLCAwIH0sCi0gICAgeyBzZmJfMjRfNDgwLCBOVUxMLCAzMCwgMCB9LAotICAgIHsgc2ZiXzI0XzQ4MCwgTlVMTCwgMzAsIDAgfSwKLSAgICB7IHNmYl8yNF80ODAsIE5VTEwsIDMwLCAwIH0sCi0gIH0KLX07Ci0KK2NvbnN0IFNGQl9JTkZPIHNmYk9mZnNldFRhYmxlc1s1XVsxNl0gPSB7eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl85Nl8xMDI0LCBzZmJfOTZfMTI4LCA0MSwgMTJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl85Nl8xMDI0LCBzZmJfOTZfMTI4LCA0MSwgMTJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl82NF8xMDI0LCBzZmJfNjRfMTI4LCA0NywgMTJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl80OF8xMDI0LCBzZmJfNDhfMTI4LCA0OSwgMTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl80OF8xMDI0LCBzZmJfNDhfMTI4LCA0OSwgMTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8zMl8xMDI0LCBzZmJfNDhfMTI4LCA1MSwgMTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8yNF8xMDI0LCBzZmJfMjRfMTI4LCA0NywgMTV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8yNF8xMDI0LCBzZmJfMjRfMTI4LCA0NywgMTV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8xNl8xMDI0LCBzZmJfMTZfMTI4LCA0MywgMTV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8xNl8xMDI0LCBzZmJfMTZfMTI4LCA0MywgMTV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8xNl8xMDI0LCBzZmJfMTZfMTI4LCA0MywgMTV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl84XzEwMjQsIHNmYl84XzEyOCwgNDAsIDE1fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfOF8xMDI0LCBzZmJfOF8xMjgsIDQwLCAxNX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfOTZfOTYwLCBzZmJfOTZfMTIwLCA0MCwgMTJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl85Nl85NjAsIHNmYl85Nl8xMjAsIDQwLCAxMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzY0Xzk2MCwgc2ZiXzY0XzEyMCwgNDYsIDEyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfNDhfOTYwLCBzZmJfNDhfMTIwLCA0OSwgMTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl80OF85NjAsIHNmYl80OF8xMjAsIDQ5LCAxNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzMyXzk2MCwgc2ZiXzQ4XzEyMCwgNDksIDE0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfMjRfOTYwLCBzZmJfMjRfMTIwLCA0NiwgMTV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8yNF85NjAsIHNmYl8yNF8xMjAsIDQ2LCAxNX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzE2Xzk2MCwgc2ZiXzE2XzEyMCwgNDIsIDE1fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfMTZfOTYwLCBzZmJfMTZfMTIwLCA0MiwgMTV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8xNl85NjAsIHNmYl8xNl8xMjAsIDQyLCAxNX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzhfOTYwLCBzZmJfOF8xMjAsIDQwLCAxNX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzhfOTYwLCBzZmJfOF8xMjAsIDQwLCAxNX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfOTZfNzY4LCBzZmJfOTZfOTYsIDM3LCAxMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzk2Xzc2OCwgc2ZiXzk2Xzk2LCAzNywgMTJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl82NF83NjgsIHNmYl82NF85NiwgNDEsIDEyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfNDhfNzY4LCBzZmJfNDhfOTYsIDQzLCAxMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzQ4Xzc2OCwgc2ZiXzQ4Xzk2LCA0MywgMTJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8zMl83NjgsIHNmYl80OF85NiwgNDMsIDEyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfMjRfNzY4LCBzZmJfMjRfOTYsIDQzLCAxNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzI0Xzc2OCwgc2ZiXzI0Xzk2LCA0MywgMTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8xNl83NjgsIHNmYl8xNl85NiwgMzksIDE0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfMTZfNzY4LCBzZmJfMTZfOTYsIDM5LCAxNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzE2Xzc2OCwgc2ZiXzE2Xzk2LCAzOSwgMTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl84Xzc2OCwgc2ZiXzhfOTYsIDM3LCAxNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzhfNzY4LCBzZmJfOF85NiwgMzcsIDE0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl80OF81MTIsIE5VTEwsIDM2LCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfNDhfNTEyLCBOVUxMLCAzNiwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzQ4XzUxMiwgTlVMTCwgMzYsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl80OF81MTIsIE5VTEwsIDM2LCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfNDhfNTEyLCBOVUxMLCAzNiwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzMyXzUxMiwgTlVMTCwgMzcsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8yNF81MTIsIE5VTEwsIDMxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfMjRfNTEyLCBOVUxMLCAzMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzI0XzUxMiwgTlVMTCwgMzEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8yNF81MTIsIE5VTEwsIDMxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfMjRfNTEyLCBOVUxMLCAzMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzI0XzUxMiwgTlVMTCwgMzEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8yNF81MTIsIE5VTEwsIDMxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl80OF80ODAsIE5VTEwsIDM1LCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfNDhfNDgwLCBOVUxMLCAzNSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzQ4XzQ4MCwgTlVMTCwgMzUsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl80OF80ODAsIE5VTEwsIDM1LCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfNDhfNDgwLCBOVUxMLCAzNSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzMyXzQ4MCwgTlVMTCwgMzcsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8yNF80ODAsIE5VTEwsIDMwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfMjRfNDgwLCBOVUxMLCAzMCwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzI0XzQ4MCwgTlVMTCwgMzAsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8yNF80ODAsIE5VTEwsIDMwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZmJfMjRfNDgwLCBOVUxMLCAzMCwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2ZiXzI0XzQ4MCwgTlVMTCwgMzAsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NmYl8yNF80ODAsIE5VTEwsIDMwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX07CiAKIC8qIyBkb24ndCB1c2UgMSBiaXQgaHVmbWFuIHRhYmxlcyAqLwogLyoKQEAgLTQ4NywxNDUxICs1MjcsMjkwMiBAQAogICBCaXQgMi4uOTogID0gVkFMVUUvUkVGIFRhYmxlcyAxLi4xMCxTQ0wKICAgQml0IDIuLjExOiA9IFZBTFVFL1JFRiBUYWJsZSAxMQogKi8KLSAgY29uc3QgVVNIT1JUIEh1ZmZtYW5Db2RlQm9va18xWzUxXVs0XSA9Ci17Ci0gIHsweDAxNTcsMHgwMTU3LDB4MDAwNCwweDAwMTh9LCB7MHgwMDA4LDB4MDAwYywweDAwMTAsMHgwMDE0fSwgezB4MDE1YiwweDAxNWIsMHgwMTUzLDB4MDE1M30sIHsweDAwNTcsMHgwMDU3LDB4MDE2NywweDAxNjd9LAotICB7MHgwMjU3LDB4MDI1NywweDAxMTcsMHgwMTE3fSwgezB4MDE5NywweDAxOTcsMHgwMTQ3LDB4MDE0N30sIHsweDAwMWMsMHgwMDMwLDB4MDA0NCwweDAwNTh9LCB7MHgwMDIwLDB4MDAyNCwweDAwMjgsMHgwMDJjfSwKLSAgezB4MDE0YiwweDAxNGIsMHgwMTYzLDB4MDE2M30sIHsweDAyMTcsMHgwMjE3LDB4MDEyNywweDAxMjd9LCB7MHgwMTg3LDB4MDE4NywweDAwOTcsMHgwMDk3fSwgezB4MDE2YiwweDAxNmIsMHgwMDE3LDB4MDAxN30sCi0gIHsweDAwMzQsMHgwMDM4LDB4MDAzYywweDAwNDB9LCB7MHgwMTQzLDB4MDE0MywweDAxMDcsMHgwMTA3fSwgezB4MDExYiwweDAxMWIsMHgwMDY3LDB4MDA2N30sIHsweDAxOTMsMHgwMTkzLDB4MDI5NywweDAyOTd9LAotICB7MHgwMTliLDB4MDE5YiwweDAyNDcsMHgwMjQ3fSwgezB4MDA0OCwweDAwNGMsMHgwMDUwLDB4MDA1NH0sIHsweDAxYTcsMHgwMWE3LDB4MDI2NywweDAyNjd9LCB7MHgwMTEzLDB4MDExMywweDAyNWIsMHgwMjVifSwKLSAgezB4MDA1MywweDAwNTMsMHgwMDViLDB4MDA1Yn0sIHsweDAyNTMsMHgwMjUzLDB4MDA0NywweDAwNDd9LCB7MHgwMDVjLDB4MDA3MCwweDAwODQsMHgwMDk4fSwgezB4MDA2MCwweDAwNjQsMHgwMDY4LDB4MDA2Y30sCi0gIHsweDAxMmIsMHgwMTJiLDB4MDEyMywweDAxMjN9LCB7MHgwMThiLDB4MDE4YiwweDAwYTcsMHgwMGE3fSwgezB4MDIyNywweDAyMjcsMHgwMjg3LDB4MDI4N30sIHsweDAwODcsMHgwMDg3LDB4MDEwYiwweDAxMGJ9LAotICB7MHgwMDc0LDB4MDA3OCwweDAwN2MsMHgwMDgwfSwgezB4MDIxYiwweDAyMWIsMHgwMDI3LDB4MDAyN30sIHsweDAxYTMsMHgwMWEzLDB4MDA5MywweDAwOTN9LCB7MHgwMTgzLDB4MDE4MywweDAyMDcsMHgwMjA3fSwKLSAgezB4MDI0YiwweDAyNGIsMHgwMDRiLDB4MDA0Yn0sIHsweDAwODgsMHgwMDhjLDB4MDA5MCwweDAwOTR9LCB7MHgwMDYzLDB4MDA2MywweDAxMDMsMHgwMTAzfSwgezB4MDAwNywweDAwMDcsMHgwMmE3LDB4MDJhN30sCi0gIHsweDAwOWIsMHgwMDliLDB4MDI2YiwweDAyNmJ9LCB7MHgwMjYzLDB4MDI2MywweDAxYWIsMHgwMWFifSwgezB4MDA5YywweDAwYTAsMHgwMGE0LDB4MDBiOH0sIHsweDAyNDEsMHgwMDExLDB4MDA2OSwweDAwMTl9LAotICB7MHgwMjExLDB4MDA0MSwweDAyOTEsMHgwMjk5fSwgezB4MDBhOCwweDAwYWMsMHgwMGIwLDB4MDBiNH0sIHsweDAwOGIsMHgwMDhiLDB4MDIyMywweDAyMjN9LCB7MHgwMGEzLDB4MDBhMywweDAyMGIsMHgwMjBifSwKLSAgezB4MDJhYiwweDAyYWIsMHgwMjgzLDB4MDI4M30sIHsweDAwMmIsMHgwMDJiLDB4MDA4MywweDAwODN9LCB7MHgwMGJjLDB4MDBjMCwweDAwYzQsMHgwMGM4fSwgezB4MDAwMywweDAwMDMsMHgwMjJiLDB4MDIyYn0sCi0gIHsweDAyOGIsMHgwMjhiLDB4MDJhMywweDAyYTN9LCB7MHgwMDIzLDB4MDAyMywweDAyMDMsMHgwMjAzfSwgezB4MDAwYiwweDAwMGIsMHgwMGFiLDB4MDBhYn0KLX07Citjb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rXzFbNTFdWzRdID0geworICAgIHsweDAxNTcsIDB4MDE1NywgMHgwMDA0LCAweDAwMTh9LCB7MHgwMDA4LCAweDAwMGMsIDB4MDAxMCwgMHgwMDE0fSwKKyAgICB7MHgwMTViLCAweDAxNWIsIDB4MDE1MywgMHgwMTUzfSwgezB4MDA1NywgMHgwMDU3LCAweDAxNjcsIDB4MDE2N30sCisgICAgezB4MDI1NywgMHgwMjU3LCAweDAxMTcsIDB4MDExN30sIHsweDAxOTcsIDB4MDE5NywgMHgwMTQ3LCAweDAxNDd9LAorICAgIHsweDAwMWMsIDB4MDAzMCwgMHgwMDQ0LCAweDAwNTh9LCB7MHgwMDIwLCAweDAwMjQsIDB4MDAyOCwgMHgwMDJjfSwKKyAgICB7MHgwMTRiLCAweDAxNGIsIDB4MDE2MywgMHgwMTYzfSwgezB4MDIxNywgMHgwMjE3LCAweDAxMjcsIDB4MDEyN30sCisgICAgezB4MDE4NywgMHgwMTg3LCAweDAwOTcsIDB4MDA5N30sIHsweDAxNmIsIDB4MDE2YiwgMHgwMDE3LCAweDAwMTd9LAorICAgIHsweDAwMzQsIDB4MDAzOCwgMHgwMDNjLCAweDAwNDB9LCB7MHgwMTQzLCAweDAxNDMsIDB4MDEwNywgMHgwMTA3fSwKKyAgICB7MHgwMTFiLCAweDAxMWIsIDB4MDA2NywgMHgwMDY3fSwgezB4MDE5MywgMHgwMTkzLCAweDAyOTcsIDB4MDI5N30sCisgICAgezB4MDE5YiwgMHgwMTliLCAweDAyNDcsIDB4MDI0N30sIHsweDAwNDgsIDB4MDA0YywgMHgwMDUwLCAweDAwNTR9LAorICAgIHsweDAxYTcsIDB4MDFhNywgMHgwMjY3LCAweDAyNjd9LCB7MHgwMTEzLCAweDAxMTMsIDB4MDI1YiwgMHgwMjVifSwKKyAgICB7MHgwMDUzLCAweDAwNTMsIDB4MDA1YiwgMHgwMDVifSwgezB4MDI1MywgMHgwMjUzLCAweDAwNDcsIDB4MDA0N30sCisgICAgezB4MDA1YywgMHgwMDcwLCAweDAwODQsIDB4MDA5OH0sIHsweDAwNjAsIDB4MDA2NCwgMHgwMDY4LCAweDAwNmN9LAorICAgIHsweDAxMmIsIDB4MDEyYiwgMHgwMTIzLCAweDAxMjN9LCB7MHgwMThiLCAweDAxOGIsIDB4MDBhNywgMHgwMGE3fSwKKyAgICB7MHgwMjI3LCAweDAyMjcsIDB4MDI4NywgMHgwMjg3fSwgezB4MDA4NywgMHgwMDg3LCAweDAxMGIsIDB4MDEwYn0sCisgICAgezB4MDA3NCwgMHgwMDc4LCAweDAwN2MsIDB4MDA4MH0sIHsweDAyMWIsIDB4MDIxYiwgMHgwMDI3LCAweDAwMjd9LAorICAgIHsweDAxYTMsIDB4MDFhMywgMHgwMDkzLCAweDAwOTN9LCB7MHgwMTgzLCAweDAxODMsIDB4MDIwNywgMHgwMjA3fSwKKyAgICB7MHgwMjRiLCAweDAyNGIsIDB4MDA0YiwgMHgwMDRifSwgezB4MDA4OCwgMHgwMDhjLCAweDAwOTAsIDB4MDA5NH0sCisgICAgezB4MDA2MywgMHgwMDYzLCAweDAxMDMsIDB4MDEwM30sIHsweDAwMDcsIDB4MDAwNywgMHgwMmE3LCAweDAyYTd9LAorICAgIHsweDAwOWIsIDB4MDA5YiwgMHgwMjZiLCAweDAyNmJ9LCB7MHgwMjYzLCAweDAyNjMsIDB4MDFhYiwgMHgwMWFifSwKKyAgICB7MHgwMDljLCAweDAwYTAsIDB4MDBhNCwgMHgwMGI4fSwgezB4MDI0MSwgMHgwMDExLCAweDAwNjksIDB4MDAxOX0sCisgICAgezB4MDIxMSwgMHgwMDQxLCAweDAyOTEsIDB4MDI5OX0sIHsweDAwYTgsIDB4MDBhYywgMHgwMGIwLCAweDAwYjR9LAorICAgIHsweDAwOGIsIDB4MDA4YiwgMHgwMjIzLCAweDAyMjN9LCB7MHgwMGEzLCAweDAwYTMsIDB4MDIwYiwgMHgwMjBifSwKKyAgICB7MHgwMmFiLCAweDAyYWIsIDB4MDI4MywgMHgwMjgzfSwgezB4MDAyYiwgMHgwMDJiLCAweDAwODMsIDB4MDA4M30sCisgICAgezB4MDBiYywgMHgwMGMwLCAweDAwYzQsIDB4MDBjOH0sIHsweDAwMDMsIDB4MDAwMywgMHgwMjJiLCAweDAyMmJ9LAorICAgIHsweDAyOGIsIDB4MDI4YiwgMHgwMmEzLCAweDAyYTN9LCB7MHgwMDIzLCAweDAwMjMsIDB4MDIwMywgMHgwMjAzfSwKKyAgICB7MHgwMDBiLCAweDAwMGIsIDB4MDBhYiwgMHgwMGFifX07CiAKLWNvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfMlszOV1bNF0gPQotewotICB7MHgwMDA0LDB4MDAwYywweDAwMjAsMHgwMDM0fSwgezB4MDE1NywweDAxNTcsMHgwMTU5LDB4MDAwOH0sIHsweDAxNTMsMHgwMTUzLDB4MDI1NywweDAyNTd9LCB7MHgwMDEwLDB4MDAxNCwweDAwMTgsMHgwMDFjfSwKLSAgezB4MDExNywweDAxMTcsMHgwMDU3LDB4MDA1N30sIHsweDAxNDcsMHgwMTQ3LDB4MDE5NywweDAxOTd9LCB7MHgwMTY3LDB4MDE2NywweDAxODUsMHgwMTYxfSwgezB4MDEyNSwweDAwOTUsMHgwMDY1LDB4MDIxNX0sCi0gIHsweDAwMjQsMHgwMDI4LDB4MDAyYywweDAwMzB9LCB7MHgwMDUxLDB4MDE0OSwweDAxMTksMHgwMTQxfSwgezB4MDAxNSwweDAxOTksMHgwMjU5LDB4MDI0NX0sIHsweDAxOTEsMHgwMjY1LDB4MDEwNSwweDAyNTF9LAotICB7MHgwMDQ1LDB4MDExMSwweDAxNjksMHgwMWE1fSwgezB4MDAzOCwweDAwNDQsMHgwMDU4LDB4MDA2Y30sIHsweDAyOTUsMHgwMDU5LDB4MDAzYywweDAwNDB9LCB7MHgwMjI3LDB4MDIyNywweDAyMWIsMHgwMjFifSwKLSAgezB4MDEyMywweDAxMjMsMHgwMDg3LDB4MDA4N30sIHsweDAwNDgsMHgwMDRjLDB4MDA1MCwweDAwNTR9LCB7MHgwMThiLDB4MDE4YiwweDAwNmIsMHgwMDZifSwgezB4MDI5YiwweDAyOWIsMHgwMWEzLDB4MDFhM30sCi0gIHsweDAyMDcsMHgwMjA3LDB4MDFhYiwweDAxYWJ9LCB7MHgwMDkzLDB4MDA5MywweDAxMDMsMHgwMTAzfSwgezB4MDA1YywweDAwNjAsMHgwMDY0LDB4MDA2OH0sIHsweDAyMTMsMHgwMjEzLDB4MDEwYiwweDAxMGJ9LAotICB7MHgwMTJiLDB4MDEyYiwweDAyNDksMHgwMDYxfSwgezB4MDE4MSwweDAyOTEsMHgwMjQxLDB4MDA0MX0sIHsweDAwMDUsMHgwMDk5LDB4MDAxOSwweDAwMjV9LCB7MHgwMDcwLDB4MDA3NCwweDAwNzgsMHgwMDg4fSwKLSAgezB4MDJhNSwweDAyNjEsMHgwMDExLDB4MDBhNX0sIHsweDAwNDksMHgwMjg1LDB4MDI2OSwweDAwODl9LCB7MHgwMjIxLDB4MDA3YywweDAwODAsMHgwMDg0fSwgezB4MDIwYiwweDAyMGIsMHgwMDAzLDB4MDAwM30sCi0gIHsweDAwYTMsMHgwMGEzLDB4MDJhMywweDAyYTN9LCB7MHgwMmFiLDB4MDJhYiwweDAwODMsMHgwMDgzfSwgezB4MDA4YywweDAwOTAsMHgwMDk0LDB4MDA5OH0sIHsweDAyOGIsMHgwMjhiLDB4MDAyMywweDAwMjN9LAotICB7MHgwMjgzLDB4MDI4MywweDAwMmIsMHgwMDJifSwgezB4MDAwYiwweDAwMGIsMHgwMjAzLDB4MDIwM30sIHsweDAyMmIsMHgwMjJiLDB4MDBhYiwweDAwYWJ9Ci19OworY29uc3QgVVNIT1JUIEh1ZmZtYW5Db2RlQm9va18yWzM5XVs0XSA9IHsKKyAgICB7MHgwMDA0LCAweDAwMGMsIDB4MDAyMCwgMHgwMDM0fSwgezB4MDE1NywgMHgwMTU3LCAweDAxNTksIDB4MDAwOH0sCisgICAgezB4MDE1MywgMHgwMTUzLCAweDAyNTcsIDB4MDI1N30sIHsweDAwMTAsIDB4MDAxNCwgMHgwMDE4LCAweDAwMWN9LAorICAgIHsweDAxMTcsIDB4MDExNywgMHgwMDU3LCAweDAwNTd9LCB7MHgwMTQ3LCAweDAxNDcsIDB4MDE5NywgMHgwMTk3fSwKKyAgICB7MHgwMTY3LCAweDAxNjcsIDB4MDE4NSwgMHgwMTYxfSwgezB4MDEyNSwgMHgwMDk1LCAweDAwNjUsIDB4MDIxNX0sCisgICAgezB4MDAyNCwgMHgwMDI4LCAweDAwMmMsIDB4MDAzMH0sIHsweDAwNTEsIDB4MDE0OSwgMHgwMTE5LCAweDAxNDF9LAorICAgIHsweDAwMTUsIDB4MDE5OSwgMHgwMjU5LCAweDAyNDV9LCB7MHgwMTkxLCAweDAyNjUsIDB4MDEwNSwgMHgwMjUxfSwKKyAgICB7MHgwMDQ1LCAweDAxMTEsIDB4MDE2OSwgMHgwMWE1fSwgezB4MDAzOCwgMHgwMDQ0LCAweDAwNTgsIDB4MDA2Y30sCisgICAgezB4MDI5NSwgMHgwMDU5LCAweDAwM2MsIDB4MDA0MH0sIHsweDAyMjcsIDB4MDIyNywgMHgwMjFiLCAweDAyMWJ9LAorICAgIHsweDAxMjMsIDB4MDEyMywgMHgwMDg3LCAweDAwODd9LCB7MHgwMDQ4LCAweDAwNGMsIDB4MDA1MCwgMHgwMDU0fSwKKyAgICB7MHgwMThiLCAweDAxOGIsIDB4MDA2YiwgMHgwMDZifSwgezB4MDI5YiwgMHgwMjliLCAweDAxYTMsIDB4MDFhM30sCisgICAgezB4MDIwNywgMHgwMjA3LCAweDAxYWIsIDB4MDFhYn0sIHsweDAwOTMsIDB4MDA5MywgMHgwMTAzLCAweDAxMDN9LAorICAgIHsweDAwNWMsIDB4MDA2MCwgMHgwMDY0LCAweDAwNjh9LCB7MHgwMjEzLCAweDAyMTMsIDB4MDEwYiwgMHgwMTBifSwKKyAgICB7MHgwMTJiLCAweDAxMmIsIDB4MDI0OSwgMHgwMDYxfSwgezB4MDE4MSwgMHgwMjkxLCAweDAyNDEsIDB4MDA0MX0sCisgICAgezB4MDAwNSwgMHgwMDk5LCAweDAwMTksIDB4MDAyNX0sIHsweDAwNzAsIDB4MDA3NCwgMHgwMDc4LCAweDAwODh9LAorICAgIHsweDAyYTUsIDB4MDI2MSwgMHgwMDExLCAweDAwYTV9LCB7MHgwMDQ5LCAweDAyODUsIDB4MDI2OSwgMHgwMDg5fSwKKyAgICB7MHgwMjIxLCAweDAwN2MsIDB4MDA4MCwgMHgwMDg0fSwgezB4MDIwYiwgMHgwMjBiLCAweDAwMDMsIDB4MDAwM30sCisgICAgezB4MDBhMywgMHgwMGEzLCAweDAyYTMsIDB4MDJhM30sIHsweDAyYWIsIDB4MDJhYiwgMHgwMDgzLCAweDAwODN9LAorICAgIHsweDAwOGMsIDB4MDA5MCwgMHgwMDk0LCAweDAwOTh9LCB7MHgwMjhiLCAweDAyOGIsIDB4MDAyMywgMHgwMDIzfSwKKyAgICB7MHgwMjgzLCAweDAyODMsIDB4MDAyYiwgMHgwMDJifSwgezB4MDAwYiwgMHgwMDBiLCAweDAyMDMsIDB4MDIwM30sCisgICAgezB4MDIyYiwgMHgwMjJiLCAweDAwYWIsIDB4MDBhYn19OwogCi1jb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rXzNbMzldWzRdID0KLXsKLSAgezB4MDAwMywweDAwMDMsMHgwMDA0LDB4MDAwOH0sIHsweDAwMDUsMHgwMTAxLDB4MDAxMSwweDAwNDF9LCB7MHgwMDBjLDB4MDAxMCwweDAwMTQsMHgwMDIwfSwgezB4MDAxNywweDAwMTcsMHgwMTQzLDB4MDE0M30sCi0gIHsweDAwNTEsMHgwMTExLDB4MDA0NSwweDAxNTF9LCB7MHgwMTA1LDB4MDA1NSwweDAwMTgsMHgwMDFjfSwgezB4MDE1NywweDAxNTcsMHgwMTQ3LDB4MDE0N30sIHsweDAxMTcsMHgwMTE3LDB4MDAwOSwweDAyMDF9LAotICB7MHgwMDI0LDB4MDAyYywweDAwNDAsMHgwMDU0fSwgezB4MDI0MSwweDAwMTksMHgwMDY1LDB4MDAyOH0sIHsweDAxODMsMHgwMTgzLDB4MDE5MywweDAxOTN9LCB7MHgwMDMwLDB4MDAzNCwweDAwMzgsMHgwMDNjfSwKLSAgezB4MDAyNywweDAwMjcsMHgwMjUzLDB4MDI1M30sIHsweDAwNWIsMHgwMDViLDB4MDA4MywweDAwODN9LCB7MHgwMDYzLDB4MDA2MywweDAwOTMsMHgwMDkzfSwgezB4MDAyMywweDAwMjMsMHgwMjEzLDB4MDIxM30sCi0gIHsweDAwNDQsMHgwMDQ4LDB4MDA0YywweDAwNTB9LCB7MHgwMDRiLDB4MDA0YiwweDAxNjcsMHgwMTY3fSwgezB4MDE2MywweDAxNjMsMHgwMDk3LDB4MDA5N30sIHsweDAxOTcsMHgwMTk3LDB4MDEyNSwweDAwODV9LAotICB7MHgwMTg1LDB4MDEyMSwweDAxNTksMHgwMjU1fSwgezB4MDA1OCwweDAwNWMsMHgwMDYwLDB4MDA3MH0sIHsweDAxMTksMHgwMjQ1LDB4MDI4MSwweDAyOTF9LCB7MHgwMDY5LDB4MDBhNSwweDAyMDUsMHgwMTA5fSwKLSAgezB4MDFhMSwweDAwNjQsMHgwMDY4LDB4MDA2Y30sIHsweDAwMmIsMHgwMDJiLDB4MDFhNywweDAxYTd9LCB7MHgwMjE3LDB4MDIxNywweDAxNGIsMHgwMTRifSwgezB4MDI5NywweDAyOTcsMHgwMTZiLDB4MDE2Yn0sCi0gIHsweDAwNzQsMHgwMDc4LDB4MDA3YywweDAwODB9LCB7MHgwMGEzLDB4MDBhMywweDAyNjMsMHgwMjYzfSwgezB4MDI4NSwweDAxMjksMHgwMDk5LDB4MDBhOX0sIHsweDAyYTEsMHgwMWE5LDB4MDE5OSwweDAyNjV9LAotICB7MHgwMmE1LDB4MDA4NCwweDAwODgsMHgwMDhjfSwgezB4MDIyMywweDAyMjMsMHgwMDhiLDB4MDA4Yn0sIHsweDAyMjcsMHgwMjI3LDB4MDE4OSwweDAyNTl9LCB7MHgwMjE5LDB4MDA5MCwweDAwOTQsMHgwMDk4fSwKLSAgezB4MDJhYiwweDAyYWIsMHgwMjZiLDB4MDI2Yn0sIHsweDAyOWIsMHgwMjliLDB4MDI0YiwweDAyNGJ9LCB7MHgwMjBiLDB4MDIwYiwweDAyMjksMHgwMjg5fQotfTsKK2NvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfM1szOV1bNF0gPSB7CisgICAgezB4MDAwMywgMHgwMDAzLCAweDAwMDQsIDB4MDAwOH0sIHsweDAwMDUsIDB4MDEwMSwgMHgwMDExLCAweDAwNDF9LAorICAgIHsweDAwMGMsIDB4MDAxMCwgMHgwMDE0LCAweDAwMjB9LCB7MHgwMDE3LCAweDAwMTcsIDB4MDE0MywgMHgwMTQzfSwKKyAgICB7MHgwMDUxLCAweDAxMTEsIDB4MDA0NSwgMHgwMTUxfSwgezB4MDEwNSwgMHgwMDU1LCAweDAwMTgsIDB4MDAxY30sCisgICAgezB4MDE1NywgMHgwMTU3LCAweDAxNDcsIDB4MDE0N30sIHsweDAxMTcsIDB4MDExNywgMHgwMDA5LCAweDAyMDF9LAorICAgIHsweDAwMjQsIDB4MDAyYywgMHgwMDQwLCAweDAwNTR9LCB7MHgwMjQxLCAweDAwMTksIDB4MDA2NSwgMHgwMDI4fSwKKyAgICB7MHgwMTgzLCAweDAxODMsIDB4MDE5MywgMHgwMTkzfSwgezB4MDAzMCwgMHgwMDM0LCAweDAwMzgsIDB4MDAzY30sCisgICAgezB4MDAyNywgMHgwMDI3LCAweDAyNTMsIDB4MDI1M30sIHsweDAwNWIsIDB4MDA1YiwgMHgwMDgzLCAweDAwODN9LAorICAgIHsweDAwNjMsIDB4MDA2MywgMHgwMDkzLCAweDAwOTN9LCB7MHgwMDIzLCAweDAwMjMsIDB4MDIxMywgMHgwMjEzfSwKKyAgICB7MHgwMDQ0LCAweDAwNDgsIDB4MDA0YywgMHgwMDUwfSwgezB4MDA0YiwgMHgwMDRiLCAweDAxNjcsIDB4MDE2N30sCisgICAgezB4MDE2MywgMHgwMTYzLCAweDAwOTcsIDB4MDA5N30sIHsweDAxOTcsIDB4MDE5NywgMHgwMTI1LCAweDAwODV9LAorICAgIHsweDAxODUsIDB4MDEyMSwgMHgwMTU5LCAweDAyNTV9LCB7MHgwMDU4LCAweDAwNWMsIDB4MDA2MCwgMHgwMDcwfSwKKyAgICB7MHgwMTE5LCAweDAyNDUsIDB4MDI4MSwgMHgwMjkxfSwgezB4MDA2OSwgMHgwMGE1LCAweDAyMDUsIDB4MDEwOX0sCisgICAgezB4MDFhMSwgMHgwMDY0LCAweDAwNjgsIDB4MDA2Y30sIHsweDAwMmIsIDB4MDAyYiwgMHgwMWE3LCAweDAxYTd9LAorICAgIHsweDAyMTcsIDB4MDIxNywgMHgwMTRiLCAweDAxNGJ9LCB7MHgwMjk3LCAweDAyOTcsIDB4MDE2YiwgMHgwMTZifSwKKyAgICB7MHgwMDc0LCAweDAwNzgsIDB4MDA3YywgMHgwMDgwfSwgezB4MDBhMywgMHgwMGEzLCAweDAyNjMsIDB4MDI2M30sCisgICAgezB4MDI4NSwgMHgwMTI5LCAweDAwOTksIDB4MDBhOX0sIHsweDAyYTEsIDB4MDFhOSwgMHgwMTk5LCAweDAyNjV9LAorICAgIHsweDAyYTUsIDB4MDA4NCwgMHgwMDg4LCAweDAwOGN9LCB7MHgwMjIzLCAweDAyMjMsIDB4MDA4YiwgMHgwMDhifSwKKyAgICB7MHgwMjI3LCAweDAyMjcsIDB4MDE4OSwgMHgwMjU5fSwgezB4MDIxOSwgMHgwMDkwLCAweDAwOTQsIDB4MDA5OH0sCisgICAgezB4MDJhYiwgMHgwMmFiLCAweDAyNmIsIDB4MDI2Yn0sIHsweDAyOWIsIDB4MDI5YiwgMHgwMjRiLCAweDAyNGJ9LAorICAgIHsweDAyMGIsIDB4MDIwYiwgMHgwMjI5LCAweDAyODl9fTsKIAotY29uc3QgVVNIT1JUIEh1ZmZtYW5Db2RlQm9va180WzM4XVs0XSA9Ci17Ci0gIHsweDAwMDQsMHgwMDA4LDB4MDAwYywweDAwMTh9LCB7MHgwMTU1LDB4MDE1MSwweDAxMTUsMHgwMDU1fSwgezB4MDE0NSwweDAwMDUsMHgwMDE1LDB4MDAwMX0sIHsweDAxNDEsMHgwMDQ1LDB4MDAxMCwweDAwMTR9LAotICB7MHgwMTA3LDB4MDEwNywweDAwNTMsMHgwMDUzfSwgezB4MDEwMywweDAxMDMsMHgwMTEzLDB4MDExM30sIHsweDAwMWMsMHgwMDIwLDB4MDAzNCwweDAwNDh9LCB7MHgwMDQzLDB4MDA0MywweDAwMTMsMHgwMDEzfSwKLSAgezB4MDAyNCwweDAwMjgsMHgwMDJjLDB4MDAzMH0sIHsweDAxNWIsMHgwMTViLDB4MDE5NywweDAxOTd9LCB7MHgwMTY3LDB4MDE2NywweDAyNTcsMHgwMjU3fSwgezB4MDA1YiwweDAwNWIsMHgwMTFiLDB4MDExYn0sCi0gIHsweDAwNjcsMHgwMDY3LDB4MDE0YiwweDAxNGJ9LCB7MHgwMDM4LDB4MDAzYywweDAwNDAsMHgwMDQ0fSwgezB4MDE5MywweDAxOTMsMHgwMjUxLDB4MDA5NX0sIHsweDAxNjEsMHgwMjQ1LDB4MDEyNSwweDAyMTV9LAotICB7MHgwMTg1LDB4MDAxOSwweDAwNDksMHgwMDI1fSwgezB4MDEwOSwweDAyMTEsMHgwMDYxLDB4MDI0MX0sIHsweDAwNGMsMHgwMDUwLDB4MDA1OCwweDAwNmN9LCB7MHgwMDkxLDB4MDEyMSwweDAyMDUsMHgwMTgxfSwKLSAgezB4MDA4NSwweDAwMDksMHgwMjAxLDB4MDA1NH0sIHsweDAwMjMsMHgwMDIzLDB4MDA4MywweDAwODN9LCB7MHgwMDVjLDB4MDA2MCwweDAwNjQsMHgwMDY4fSwgezB4MDFhNywweDAxYTcsMHgwMTZiLDB4MDE2Yn0sCi0gIHsweDAxOWIsMHgwMTliLDB4MDI5NywweDAyOTd9LCB7MHgwMjY3LDB4MDI2NywweDAyNWIsMHgwMjVifSwgezB4MDBhNSwweDAwNjksMHgwMDk5LDB4MDFhMX0sIHsweDAwNzAsMHgwMDc0LDB4MDA3OCwweDAwODR9LAotICB7MHgwMjkxLDB4MDEyOSwweDAyNjEsMHgwMTg5fSwgezB4MDI4NSwweDAxYTksMHgwMjI1LDB4MDI0OX0sIHsweDAyMTksMHgwMmE1LDB4MDA3YywweDAwODB9LCB7MHgwMjliLDB4MDI5YiwweDAyNmIsMHgwMjZifSwKLSAgezB4MDBhMywweDAwYTMsMHgwMDJiLDB4MDAyYn0sIHsweDAwODgsMHgwMDhjLDB4MDA5MCwweDAwOTR9LCB7MHgwMjgzLDB4MDI4MywweDAwOGIsMHgwMDhifSwgezB4MDIyMywweDAyMjMsMHgwMjBiLDB4MDIwYn0sCi0gIHsweDAyYWIsMHgwMmFiLDB4MDJhMywweDAyYTN9LCB7MHgwMGFiLDB4MDBhYiwweDAyMjksMHgwMjg5fQotfTsKK2NvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfNFszOF1bNF0gPSB7CisgICAgezB4MDAwNCwgMHgwMDA4LCAweDAwMGMsIDB4MDAxOH0sIHsweDAxNTUsIDB4MDE1MSwgMHgwMTE1LCAweDAwNTV9LAorICAgIHsweDAxNDUsIDB4MDAwNSwgMHgwMDE1LCAweDAwMDF9LCB7MHgwMTQxLCAweDAwNDUsIDB4MDAxMCwgMHgwMDE0fSwKKyAgICB7MHgwMTA3LCAweDAxMDcsIDB4MDA1MywgMHgwMDUzfSwgezB4MDEwMywgMHgwMTAzLCAweDAxMTMsIDB4MDExM30sCisgICAgezB4MDAxYywgMHgwMDIwLCAweDAwMzQsIDB4MDA0OH0sIHsweDAwNDMsIDB4MDA0MywgMHgwMDEzLCAweDAwMTN9LAorICAgIHsweDAwMjQsIDB4MDAyOCwgMHgwMDJjLCAweDAwMzB9LCB7MHgwMTViLCAweDAxNWIsIDB4MDE5NywgMHgwMTk3fSwKKyAgICB7MHgwMTY3LCAweDAxNjcsIDB4MDI1NywgMHgwMjU3fSwgezB4MDA1YiwgMHgwMDViLCAweDAxMWIsIDB4MDExYn0sCisgICAgezB4MDA2NywgMHgwMDY3LCAweDAxNGIsIDB4MDE0Yn0sIHsweDAwMzgsIDB4MDAzYywgMHgwMDQwLCAweDAwNDR9LAorICAgIHsweDAxOTMsIDB4MDE5MywgMHgwMjUxLCAweDAwOTV9LCB7MHgwMTYxLCAweDAyNDUsIDB4MDEyNSwgMHgwMjE1fSwKKyAgICB7MHgwMTg1LCAweDAwMTksIDB4MDA0OSwgMHgwMDI1fSwgezB4MDEwOSwgMHgwMjExLCAweDAwNjEsIDB4MDI0MX0sCisgICAgezB4MDA0YywgMHgwMDUwLCAweDAwNTgsIDB4MDA2Y30sIHsweDAwOTEsIDB4MDEyMSwgMHgwMjA1LCAweDAxODF9LAorICAgIHsweDAwODUsIDB4MDAwOSwgMHgwMjAxLCAweDAwNTR9LCB7MHgwMDIzLCAweDAwMjMsIDB4MDA4MywgMHgwMDgzfSwKKyAgICB7MHgwMDVjLCAweDAwNjAsIDB4MDA2NCwgMHgwMDY4fSwgezB4MDFhNywgMHgwMWE3LCAweDAxNmIsIDB4MDE2Yn0sCisgICAgezB4MDE5YiwgMHgwMTliLCAweDAyOTcsIDB4MDI5N30sIHsweDAyNjcsIDB4MDI2NywgMHgwMjViLCAweDAyNWJ9LAorICAgIHsweDAwYTUsIDB4MDA2OSwgMHgwMDk5LCAweDAxYTF9LCB7MHgwMDcwLCAweDAwNzQsIDB4MDA3OCwgMHgwMDg0fSwKKyAgICB7MHgwMjkxLCAweDAxMjksIDB4MDI2MSwgMHgwMTg5fSwgezB4MDI4NSwgMHgwMWE5LCAweDAyMjUsIDB4MDI0OX0sCisgICAgezB4MDIxOSwgMHgwMmE1LCAweDAwN2MsIDB4MDA4MH0sIHsweDAyOWIsIDB4MDI5YiwgMHgwMjZiLCAweDAyNmJ9LAorICAgIHsweDAwYTMsIDB4MDBhMywgMHgwMDJiLCAweDAwMmJ9LCB7MHgwMDg4LCAweDAwOGMsIDB4MDA5MCwgMHgwMDk0fSwKKyAgICB7MHgwMjgzLCAweDAyODMsIDB4MDA4YiwgMHgwMDhifSwgezB4MDIyMywgMHgwMjIzLCAweDAyMGIsIDB4MDIwYn0sCisgICAgezB4MDJhYiwgMHgwMmFiLCAweDAyYTMsIDB4MDJhM30sIHsweDAwYWIsIDB4MDBhYiwgMHgwMjI5LCAweDAyODl9fTsKIAotY29uc3QgVVNIT1JUIEh1ZmZtYW5Db2RlQm9va181WzQxXVs0XSA9Ci17Ci0gIHsweDAxMTMsMHgwMTEzLDB4MDAwNCwweDAwMDh9LCB7MHgwMTBkLDB4MDExNSwweDAxNTEsMHgwMGQxfSwgezB4MDAwYywweDAwMTAsMHgwMDE0LDB4MDAyOH0sIHsweDAwZDcsMHgwMGQ3LDB4MDE0ZiwweDAxNGZ9LAotICB7MHgwMGNmLDB4MDBjZiwweDAxNTcsMHgwMTU3fSwgezB4MDAxOCwweDAwMWMsMHgwMDIwLDB4MDAyNH0sIHsweDAxMGIsMHgwMTBiLDB4MDE5MywweDAxOTN9LCB7MHgwMTFiLDB4MDExYiwweDAwOTMsMHgwMDkzfSwKLSAgezB4MDBjOSwweDAxNTksMHgwMDhkLDB4MDE5NX0sIHsweDAxNDksMHgwMGQ5LDB4MDE4ZCwweDAwOTV9LCB7MHgwMDJjLDB4MDAzMCwweDAwNDQsMHgwMDU4fSwgezB4MDEwNSwweDAxMWQsMHgwMDUxLDB4MDFkMX0sCi0gIHsweDAwMzQsMHgwMDM4LDB4MDAzYywweDAwNDB9LCB7MHgwMGM3LDB4MDBjNywweDAxZDcsMHgwMWQ3fSwgezB4MDE1ZiwweDAxNWYsMHgwMDRmLDB4MDA0Zn0sIHsweDAxNDcsMHgwMTQ3LDB4MDBkZiwweDAwZGZ9LAotICB7MHgwMDU3LDB4MDA1NywweDAxY2YsMHgwMWNmfSwgezB4MDA0OCwweDAwNGMsMHgwMDUwLDB4MDA1NH0sIHsweDAxOGIsMHgwMThiLDB4MDE5YiwweDAxOWJ9LCB7MHgwMDhiLDB4MDA4YiwweDAwOWIsMHgwMDlifSwKLSAgezB4MDA4NSwweDAwOWQsMHgwMWM5LDB4MDA1OX0sIHsweDAxOWQsMHgwMWQ5LDB4MDE4NSwweDAwNDl9LCB7MHgwMDVjLDB4MDA2MCwweDAwNzQsMHgwMDg4fSwgezB4MDAxMSwweDAxMDEsMHgwMTYxLDB4MDEyMX0sCi0gIHsweDAwNjQsMHgwMDY4LDB4MDA2YywweDAwNzB9LCB7MHgwMGMzLDB4MDBjMywweDAyMTMsMHgwMjEzfSwgezB4MDBlMywweDAwZTMsMHgwMDBmLDB4MDAwZn0sIHsweDAyMTcsMHgwMjE3LDB4MDIwZiwweDAyMGZ9LAotICB7MHgwMTQzLDB4MDE0MywweDAwMTcsMHgwMDE3fSwgezB4MDA3OCwweDAwN2MsMHgwMDgwLDB4MDA4NH0sIHsweDAwNWYsMHgwMDVmLDB4MDA0NywweDAwNDd9LCB7MHgwMWM3LDB4MDFjNywweDAyMGIsMHgwMjBifSwKLSAgezB4MDA4MywweDAwODMsMHgwMWEzLDB4MDFhM30sIHsweDAwMWIsMHgwMDFiLDB4MDIxYiwweDAyMWJ9LCB7MHgwMDhjLDB4MDA5MCwweDAwOTQsMHgwMDk4fSwgezB4MDFkZiwweDAxZGYsMHgwMTgzLDB4MDE4M30sCi0gIHsweDAwMDksMHgwMGExLDB4MDAxZCwweDAwNDF9LCB7MHgwMWMxLDB4MDIxZCwweDAyMDUsMHgwMWUxfSwgezB4MDA2MSwweDAwMDUsMHgwMDljLDB4MDBhMH0sIHsweDAwMjMsMHgwMDIzLDB4MDIwMywweDAyMDN9LAotICB7MHgwMjIzLDB4MDIyMywweDAwMDMsMHgwMDAzfQotfTsKK2NvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfNVs0MV1bNF0gPSB7CisgICAgezB4MDExMywgMHgwMTEzLCAweDAwMDQsIDB4MDAwOH0sIHsweDAxMGQsIDB4MDExNSwgMHgwMTUxLCAweDAwZDF9LAorICAgIHsweDAwMGMsIDB4MDAxMCwgMHgwMDE0LCAweDAwMjh9LCB7MHgwMGQ3LCAweDAwZDcsIDB4MDE0ZiwgMHgwMTRmfSwKKyAgICB7MHgwMGNmLCAweDAwY2YsIDB4MDE1NywgMHgwMTU3fSwgezB4MDAxOCwgMHgwMDFjLCAweDAwMjAsIDB4MDAyNH0sCisgICAgezB4MDEwYiwgMHgwMTBiLCAweDAxOTMsIDB4MDE5M30sIHsweDAxMWIsIDB4MDExYiwgMHgwMDkzLCAweDAwOTN9LAorICAgIHsweDAwYzksIDB4MDE1OSwgMHgwMDhkLCAweDAxOTV9LCB7MHgwMTQ5LCAweDAwZDksIDB4MDE4ZCwgMHgwMDk1fSwKKyAgICB7MHgwMDJjLCAweDAwMzAsIDB4MDA0NCwgMHgwMDU4fSwgezB4MDEwNSwgMHgwMTFkLCAweDAwNTEsIDB4MDFkMX0sCisgICAgezB4MDAzNCwgMHgwMDM4LCAweDAwM2MsIDB4MDA0MH0sIHsweDAwYzcsIDB4MDBjNywgMHgwMWQ3LCAweDAxZDd9LAorICAgIHsweDAxNWYsIDB4MDE1ZiwgMHgwMDRmLCAweDAwNGZ9LCB7MHgwMTQ3LCAweDAxNDcsIDB4MDBkZiwgMHgwMGRmfSwKKyAgICB7MHgwMDU3LCAweDAwNTcsIDB4MDFjZiwgMHgwMWNmfSwgezB4MDA0OCwgMHgwMDRjLCAweDAwNTAsIDB4MDA1NH0sCisgICAgezB4MDE4YiwgMHgwMThiLCAweDAxOWIsIDB4MDE5Yn0sIHsweDAwOGIsIDB4MDA4YiwgMHgwMDliLCAweDAwOWJ9LAorICAgIHsweDAwODUsIDB4MDA5ZCwgMHgwMWM5LCAweDAwNTl9LCB7MHgwMTlkLCAweDAxZDksIDB4MDE4NSwgMHgwMDQ5fSwKKyAgICB7MHgwMDVjLCAweDAwNjAsIDB4MDA3NCwgMHgwMDg4fSwgezB4MDAxMSwgMHgwMTAxLCAweDAxNjEsIDB4MDEyMX0sCisgICAgezB4MDA2NCwgMHgwMDY4LCAweDAwNmMsIDB4MDA3MH0sIHsweDAwYzMsIDB4MDBjMywgMHgwMjEzLCAweDAyMTN9LAorICAgIHsweDAwZTMsIDB4MDBlMywgMHgwMDBmLCAweDAwMGZ9LCB7MHgwMjE3LCAweDAyMTcsIDB4MDIwZiwgMHgwMjBmfSwKKyAgICB7MHgwMTQzLCAweDAxNDMsIDB4MDAxNywgMHgwMDE3fSwgezB4MDA3OCwgMHgwMDdjLCAweDAwODAsIDB4MDA4NH0sCisgICAgezB4MDA1ZiwgMHgwMDVmLCAweDAwNDcsIDB4MDA0N30sIHsweDAxYzcsIDB4MDFjNywgMHgwMjBiLCAweDAyMGJ9LAorICAgIHsweDAwODMsIDB4MDA4MywgMHgwMWEzLCAweDAxYTN9LCB7MHgwMDFiLCAweDAwMWIsIDB4MDIxYiwgMHgwMjFifSwKKyAgICB7MHgwMDhjLCAweDAwOTAsIDB4MDA5NCwgMHgwMDk4fSwgezB4MDFkZiwgMHgwMWRmLCAweDAxODMsIDB4MDE4M30sCisgICAgezB4MDAwOSwgMHgwMGExLCAweDAwMWQsIDB4MDA0MX0sIHsweDAxYzEsIDB4MDIxZCwgMHgwMjA1LCAweDAxZTF9LAorICAgIHsweDAwNjEsIDB4MDAwNSwgMHgwMDljLCAweDAwYTB9LCB7MHgwMDIzLCAweDAwMjMsIDB4MDIwMywgMHgwMjAzfSwKKyAgICB7MHgwMjIzLCAweDAyMjMsIDB4MDAwMywgMHgwMDAzfX07CiAKLWNvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfNls0MF1bNF0gPQotewotICB7MHgwMDA0LDB4MDAwOCwweDAwMGMsMHgwMDFjfSwgezB4MDExMSwweDAxMTUsMHgwMGQxLDB4MDE1MX0sIHsweDAxMGQsMHgwMTU1LDB4MDE0ZCwweDAwZDV9LCB7MHgwMGNkLDB4MDAxMCwweDAwMTQsMHgwMDE4fSwKLSAgezB4MDBkOSwweDAxNTksMHgwMTQ5LDB4MDBjOX0sIHsweDAxMDksMHgwMThkLDB4MDExOSwweDAwOTV9LCB7MHgwMTk1LDB4MDA5MSwweDAwOGQsMHgwMTkxfSwgezB4MDAyMCwweDAwMjQsMHgwMDM4LDB4MDA0Y30sCi0gIHsweDAwOTksMHgwMTg5LDB4MDA4OSwweDAxOTl9LCB7MHgwMDI4LDB4MDAyYywweDAwMzAsMHgwMDM0fSwgezB4MDE0NywweDAxNDcsMHgwMTVmLDB4MDE1Zn0sIHsweDAwZGYsMHgwMGRmLDB4MDFjZiwweDAxY2Z9LAotICB7MHgwMGM3LDB4MDBjNywweDAxZDcsMHgwMWQ3fSwgezB4MDA1NywweDAwNTcsMHgwMDRmLDB4MDA0Zn0sIHsweDAwM2MsMHgwMDQwLDB4MDA0NCwweDAwNDh9LCB7MHgwMTFmLDB4MDExZiwweDAxMDcsMHgwMTA3fSwKLSAgezB4MDA1MywweDAwNTMsMHgwMWQzLDB4MDFkM30sIHsweDAxOWYsMHgwMTlmLDB4MDA4NSwweDAxYzl9LCB7MHgwMWQ5LDB4MDA5ZCwweDAwNTksMHgwMDQ5fSwgezB4MDA1MCwweDAwNWMsMHgwMDcwLDB4MDA4NH0sCi0gIHsweDAxODUsMHgwMWRkLDB4MDA1NCwweDAwNTh9LCB7MHgwMDVmLDB4MDA1ZiwweDAwNDcsMHgwMDQ3fSwgezB4MDFjNywweDAxYzcsMHgwMDE3LDB4MDAxN30sIHsweDAwNjAsMHgwMDY0LDB4MDA2OCwweDAwNmN9LAotICB7MHgwMDBmLDB4MDAwZiwweDAxNjMsMHgwMTYzfSwgezB4MDE0MywweDAxNDMsMHgwMGMzLDB4MDBjM30sIHsweDAyMTcsMHgwMjE3LDB4MDBlMywweDAwZTN9LCB7MHgwMjBmLDB4MDIwZiwweDAwMTMsMHgwMDEzfSwKLSAgezB4MDA3NCwweDAwNzgsMHgwMDdjLDB4MDA4MH0sIHsweDAxODMsMHgwMTgzLDB4MDA4MywweDAwODN9LCB7MHgwMjFiLDB4MDIxYiwweDAwMGIsMHgwMDBifSwgezB4MDEwMywweDAxMDMsMHgwMWEzLDB4MDFhM30sCi0gIHsweDAwYTMsMHgwMGEzLDB4MDIwYiwweDAyMGJ9LCB7MHgwMDg4LDB4MDA4YywweDAwOTAsMHgwMDk0fSwgezB4MDEyMywweDAxMjMsMHgwMDFiLDB4MDAxYn0sIHsweDAyMTMsMHgwMjEzLDB4MDAwNSwweDAyMDV9LAotICB7MHgwMDFkLDB4MDA2MSwweDAyMWQsMHgwMWUxfSwgezB4MDFjMSwweDAwNDEsMHgwMDk4LDB4MDA5Y30sIHsweDAyMjMsMHgwMjIzLDB4MDIwMywweDAyMDN9LCB7MHgwMDAzLDB4MDAwMywweDAwMjMsMHgwMDIzfQotfTsKK2NvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfNls0MF1bNF0gPSB7CisgICAgezB4MDAwNCwgMHgwMDA4LCAweDAwMGMsIDB4MDAxY30sIHsweDAxMTEsIDB4MDExNSwgMHgwMGQxLCAweDAxNTF9LAorICAgIHsweDAxMGQsIDB4MDE1NSwgMHgwMTRkLCAweDAwZDV9LCB7MHgwMGNkLCAweDAwMTAsIDB4MDAxNCwgMHgwMDE4fSwKKyAgICB7MHgwMGQ5LCAweDAxNTksIDB4MDE0OSwgMHgwMGM5fSwgezB4MDEwOSwgMHgwMThkLCAweDAxMTksIDB4MDA5NX0sCisgICAgezB4MDE5NSwgMHgwMDkxLCAweDAwOGQsIDB4MDE5MX0sIHsweDAwMjAsIDB4MDAyNCwgMHgwMDM4LCAweDAwNGN9LAorICAgIHsweDAwOTksIDB4MDE4OSwgMHgwMDg5LCAweDAxOTl9LCB7MHgwMDI4LCAweDAwMmMsIDB4MDAzMCwgMHgwMDM0fSwKKyAgICB7MHgwMTQ3LCAweDAxNDcsIDB4MDE1ZiwgMHgwMTVmfSwgezB4MDBkZiwgMHgwMGRmLCAweDAxY2YsIDB4MDFjZn0sCisgICAgezB4MDBjNywgMHgwMGM3LCAweDAxZDcsIDB4MDFkN30sIHsweDAwNTcsIDB4MDA1NywgMHgwMDRmLCAweDAwNGZ9LAorICAgIHsweDAwM2MsIDB4MDA0MCwgMHgwMDQ0LCAweDAwNDh9LCB7MHgwMTFmLCAweDAxMWYsIDB4MDEwNywgMHgwMTA3fSwKKyAgICB7MHgwMDUzLCAweDAwNTMsIDB4MDFkMywgMHgwMWQzfSwgezB4MDE5ZiwgMHgwMTlmLCAweDAwODUsIDB4MDFjOX0sCisgICAgezB4MDFkOSwgMHgwMDlkLCAweDAwNTksIDB4MDA0OX0sIHsweDAwNTAsIDB4MDA1YywgMHgwMDcwLCAweDAwODR9LAorICAgIHsweDAxODUsIDB4MDFkZCwgMHgwMDU0LCAweDAwNTh9LCB7MHgwMDVmLCAweDAwNWYsIDB4MDA0NywgMHgwMDQ3fSwKKyAgICB7MHgwMWM3LCAweDAxYzcsIDB4MDAxNywgMHgwMDE3fSwgezB4MDA2MCwgMHgwMDY0LCAweDAwNjgsIDB4MDA2Y30sCisgICAgezB4MDAwZiwgMHgwMDBmLCAweDAxNjMsIDB4MDE2M30sIHsweDAxNDMsIDB4MDE0MywgMHgwMGMzLCAweDAwYzN9LAorICAgIHsweDAyMTcsIDB4MDIxNywgMHgwMGUzLCAweDAwZTN9LCB7MHgwMjBmLCAweDAyMGYsIDB4MDAxMywgMHgwMDEzfSwKKyAgICB7MHgwMDc0LCAweDAwNzgsIDB4MDA3YywgMHgwMDgwfSwgezB4MDE4MywgMHgwMTgzLCAweDAwODMsIDB4MDA4M30sCisgICAgezB4MDIxYiwgMHgwMjFiLCAweDAwMGIsIDB4MDAwYn0sIHsweDAxMDMsIDB4MDEwMywgMHgwMWEzLCAweDAxYTN9LAorICAgIHsweDAwYTMsIDB4MDBhMywgMHgwMjBiLCAweDAyMGJ9LCB7MHgwMDg4LCAweDAwOGMsIDB4MDA5MCwgMHgwMDk0fSwKKyAgICB7MHgwMTIzLCAweDAxMjMsIDB4MDAxYiwgMHgwMDFifSwgezB4MDIxMywgMHgwMjEzLCAweDAwMDUsIDB4MDIwNX0sCisgICAgezB4MDAxZCwgMHgwMDYxLCAweDAyMWQsIDB4MDFlMX0sIHsweDAxYzEsIDB4MDA0MSwgMHgwMDk4LCAweDAwOWN9LAorICAgIHsweDAyMjMsIDB4MDIyMywgMHgwMjAzLCAweDAyMDN9LCB7MHgwMDAzLCAweDAwMDMsIDB4MDAyMywgMHgwMDIzfX07CiAKLWNvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfN1szMV1bNF0gPQotewotICB7MHgwMDAzLDB4MDAwMywweDAwMDQsMHgwMDA4fSwgezB4MDAwNywweDAwMDcsMHgwMDQzLDB4MDA0M30sIHsweDAwNDUsMHgwMDBjLDB4MDAxMCwweDAwMjR9LCB7MHgwMDQ5LDB4MDA4NSwweDAwMDksMHgwMDgxfSwKLSAgezB4MDAxNCwweDAwMTgsMHgwMDFjLDB4MDAyMH0sIHsweDAwNGYsMHgwMDRmLDB4MDBjNywweDAwYzd9LCB7MHgwMDhiLDB4MDA4YiwweDAwMGYsMHgwMDBmfSwgezB4MDBjMywweDAwYzMsMHgwMGM5LDB4MDA4ZH0sCi0gIHsweDAxMDUsMHgwMDUxLDB4MDE0NSwweDAwNTV9LCB7MHgwMDI4LDB4MDAyYywweDAwNDAsMHgwMDU0fSwgezB4MDBjZCwweDAxMDksMHgwMTAxLDB4MDAxMX0sIHsweDAwMzAsMHgwMDM0LDB4MDAzOCwweDAwM2N9LAotICB7MHgwMDkzLDB4MDA5MywweDAxNGIsMHgwMTRifSwgezB4MDA5NywweDAwOTcsMHgwMTQzLDB4MDE0M30sIHsweDAwNWIsMHgwMDViLDB4MDAxNywweDAwMTd9LCB7MHgwMTg3LDB4MDE4NywweDAwZDMsMHgwMGQzfSwKLSAgezB4MDA0NCwweDAwNDgsMHgwMDRjLDB4MDA1MH0sIHsweDAxNGYsMHgwMTRmLDB4MDEwZiwweDAxMGZ9LCB7MHgwMGQ3LDB4MDBkNywweDAxOGIsMHgwMThifSwgezB4MDA5YiwweDAwOWIsMHgwMWM3LDB4MDFjN30sCi0gIHsweDAxOGQsMHgwMTgxLDB4MDAxOSwweDAxMTF9LCB7MHgwMDU4LDB4MDA1YywweDAwNjAsMHgwMDY4fSwgezB4MDA1ZCwweDAxNTEsMHgwMDlkLDB4MDExNX0sIHsweDAwZDksMHgwMWM5LDB4MDBkZCwweDAxMTl9LAotICB7MHgwMTU1LDB4MDE5MSwweDAxY2QsMHgwMDY0fSwgezB4MDAxZiwweDAwMWYsMHgwMWMzLDB4MDFjM30sIHsweDAwNmMsMHgwMDcwLDB4MDA3NCwweDAwNzh9LCB7MHgwMTViLDB4MDE1YiwweDAxOTcsMHgwMTk3fSwKLSAgezB4MDExZiwweDAxMWYsMHgwMWQzLDB4MDFkM30sIHsweDAxZDcsMHgwMWQ3LDB4MDE1ZiwweDAxNWZ9LCB7MHgwMTlkLDB4MDE5OSwweDAxZDksMHgwMWRkfQotfTsKK2NvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfN1szMV1bNF0gPSB7CisgICAgezB4MDAwMywgMHgwMDAzLCAweDAwMDQsIDB4MDAwOH0sIHsweDAwMDcsIDB4MDAwNywgMHgwMDQzLCAweDAwNDN9LAorICAgIHsweDAwNDUsIDB4MDAwYywgMHgwMDEwLCAweDAwMjR9LCB7MHgwMDQ5LCAweDAwODUsIDB4MDAwOSwgMHgwMDgxfSwKKyAgICB7MHgwMDE0LCAweDAwMTgsIDB4MDAxYywgMHgwMDIwfSwgezB4MDA0ZiwgMHgwMDRmLCAweDAwYzcsIDB4MDBjN30sCisgICAgezB4MDA4YiwgMHgwMDhiLCAweDAwMGYsIDB4MDAwZn0sIHsweDAwYzMsIDB4MDBjMywgMHgwMGM5LCAweDAwOGR9LAorICAgIHsweDAxMDUsIDB4MDA1MSwgMHgwMTQ1LCAweDAwNTV9LCB7MHgwMDI4LCAweDAwMmMsIDB4MDA0MCwgMHgwMDU0fSwKKyAgICB7MHgwMGNkLCAweDAxMDksIDB4MDEwMSwgMHgwMDExfSwgezB4MDAzMCwgMHgwMDM0LCAweDAwMzgsIDB4MDAzY30sCisgICAgezB4MDA5MywgMHgwMDkzLCAweDAxNGIsIDB4MDE0Yn0sIHsweDAwOTcsIDB4MDA5NywgMHgwMTQzLCAweDAxNDN9LAorICAgIHsweDAwNWIsIDB4MDA1YiwgMHgwMDE3LCAweDAwMTd9LCB7MHgwMTg3LCAweDAxODcsIDB4MDBkMywgMHgwMGQzfSwKKyAgICB7MHgwMDQ0LCAweDAwNDgsIDB4MDA0YywgMHgwMDUwfSwgezB4MDE0ZiwgMHgwMTRmLCAweDAxMGYsIDB4MDEwZn0sCisgICAgezB4MDBkNywgMHgwMGQ3LCAweDAxOGIsIDB4MDE4Yn0sIHsweDAwOWIsIDB4MDA5YiwgMHgwMWM3LCAweDAxYzd9LAorICAgIHsweDAxOGQsIDB4MDE4MSwgMHgwMDE5LCAweDAxMTF9LCB7MHgwMDU4LCAweDAwNWMsIDB4MDA2MCwgMHgwMDY4fSwKKyAgICB7MHgwMDVkLCAweDAxNTEsIDB4MDA5ZCwgMHgwMTE1fSwgezB4MDBkOSwgMHgwMWM5LCAweDAwZGQsIDB4MDExOX0sCisgICAgezB4MDE1NSwgMHgwMTkxLCAweDAxY2QsIDB4MDA2NH0sIHsweDAwMWYsIDB4MDAxZiwgMHgwMWMzLCAweDAxYzN9LAorICAgIHsweDAwNmMsIDB4MDA3MCwgMHgwMDc0LCAweDAwNzh9LCB7MHgwMTViLCAweDAxNWIsIDB4MDE5NywgMHgwMTk3fSwKKyAgICB7MHgwMTFmLCAweDAxMWYsIDB4MDFkMywgMHgwMWQzfSwgezB4MDFkNywgMHgwMWQ3LCAweDAxNWYsIDB4MDE1Zn0sCisgICAgezB4MDE5ZCwgMHgwMTk5LCAweDAxZDksIDB4MDFkZH19OwogCi1jb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rXzhbMzFdWzRdID0KLXsKLSAgezB4MDAwNCwweDAwMDgsMHgwMDEwLDB4MDAyNH0sIHsweDAwNDcsMHgwMDQ3LDB4MDA0OSwweDAwMDV9LCB7MHgwMDg1LDB4MDA0MSwweDAwODksMHgwMDBjfSwgezB4MDAwMywweDAwMDMsMHgwMDBiLDB4MDAwYn0sCi0gIHsweDAwMTQsMHgwMDE4LDB4MDAxYywweDAwMjB9LCB7MHgwMDgzLDB4MDA4MywweDAwNGYsMHgwMDRmfSwgezB4MDBjNywweDAwYzcsMHgwMDhmLDB4MDA4Zn0sIHsweDAwY2IsMHgwMGNiLDB4MDBjZCwweDAwNTF9LAotICB7MHgwMTA1LDB4MDA5MSwweDAxMDksMHgwMDBkfSwgezB4MDAyOCwweDAwMmMsMHgwMDQwLDB4MDA1NH0sIHsweDAwYzEsMHgwMGQxLDB4MDEwZCwweDAwOTV9LCB7MHgwMDMwLDB4MDAzNCwweDAwMzgsMHgwMDNjfSwKLSAgezB4MDA1NywweDAwNTcsMHgwMTRiLDB4MDE0Yn0sIHsweDAxNDcsMHgwMTQ3LDB4MDBkNywweDAwZDd9LCB7MHgwMTRmLDB4MDE0ZiwweDAxMTMsMHgwMTEzfSwgezB4MDExNywweDAxMTcsMHgwMTAzLDB4MDEwM30sCi0gIHsweDAwNDQsMHgwMDQ4LDB4MDA0YywweDAwNTB9LCB7MHgwMTUzLDB4MDE1MywweDAwMTMsMHgwMDEzfSwgezB4MDE4YiwweDAxOGIsMHgwMDliLDB4MDA5Yn0sIHsweDAwNWIsMHgwMDViLDB4MDE4NywweDAxODd9LAotICB7MHgwMThkLDB4MDBkOSwweDAxNTUsMHgwMDE1fSwgezB4MDA1OCwweDAwNWMsMHgwMDYwLDB4MDA2OH0sIHsweDAxMTksMHgwMTQxLDB4MDE5MSwweDAwNWR9LCB7MHgwMDlkLDB4MDFjOSwweDAxNTksMHgwMGRkfSwKLSAgezB4MDFjNSwweDAxOTUsMHgwMWNkLDB4MDA2NH0sIHsweDAxOWIsMHgwMTliLDB4MDExZiwweDAxMWZ9LCB7MHgwMDZjLDB4MDA3MCwweDAwNzQsMHgwMDc4fSwgezB4MDAxYiwweDAwMWIsMHgwMWQzLDB4MDFkM30sCi0gIHsweDAxODMsMHgwMTgzLDB4MDE1ZiwweDAxNWZ9LCB7MHgwMTlmLDB4MDE5ZiwweDAxZGIsMHgwMWRifSwgezB4MDFkNSwweDAwMWQsMHgwMWMxLDB4MDFkZH0KLX07Citjb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rXzhbMzFdWzRdID0geworICAgIHsweDAwMDQsIDB4MDAwOCwgMHgwMDEwLCAweDAwMjR9LCB7MHgwMDQ3LCAweDAwNDcsIDB4MDA0OSwgMHgwMDA1fSwKKyAgICB7MHgwMDg1LCAweDAwNDEsIDB4MDA4OSwgMHgwMDBjfSwgezB4MDAwMywgMHgwMDAzLCAweDAwMGIsIDB4MDAwYn0sCisgICAgezB4MDAxNCwgMHgwMDE4LCAweDAwMWMsIDB4MDAyMH0sIHsweDAwODMsIDB4MDA4MywgMHgwMDRmLCAweDAwNGZ9LAorICAgIHsweDAwYzcsIDB4MDBjNywgMHgwMDhmLCAweDAwOGZ9LCB7MHgwMGNiLCAweDAwY2IsIDB4MDBjZCwgMHgwMDUxfSwKKyAgICB7MHgwMTA1LCAweDAwOTEsIDB4MDEwOSwgMHgwMDBkfSwgezB4MDAyOCwgMHgwMDJjLCAweDAwNDAsIDB4MDA1NH0sCisgICAgezB4MDBjMSwgMHgwMGQxLCAweDAxMGQsIDB4MDA5NX0sIHsweDAwMzAsIDB4MDAzNCwgMHgwMDM4LCAweDAwM2N9LAorICAgIHsweDAwNTcsIDB4MDA1NywgMHgwMTRiLCAweDAxNGJ9LCB7MHgwMTQ3LCAweDAxNDcsIDB4MDBkNywgMHgwMGQ3fSwKKyAgICB7MHgwMTRmLCAweDAxNGYsIDB4MDExMywgMHgwMTEzfSwgezB4MDExNywgMHgwMTE3LCAweDAxMDMsIDB4MDEwM30sCisgICAgezB4MDA0NCwgMHgwMDQ4LCAweDAwNGMsIDB4MDA1MH0sIHsweDAxNTMsIDB4MDE1MywgMHgwMDEzLCAweDAwMTN9LAorICAgIHsweDAxOGIsIDB4MDE4YiwgMHgwMDliLCAweDAwOWJ9LCB7MHgwMDViLCAweDAwNWIsIDB4MDE4NywgMHgwMTg3fSwKKyAgICB7MHgwMThkLCAweDAwZDksIDB4MDE1NSwgMHgwMDE1fSwgezB4MDA1OCwgMHgwMDVjLCAweDAwNjAsIDB4MDA2OH0sCisgICAgezB4MDExOSwgMHgwMTQxLCAweDAxOTEsIDB4MDA1ZH0sIHsweDAwOWQsIDB4MDFjOSwgMHgwMTU5LCAweDAwZGR9LAorICAgIHsweDAxYzUsIDB4MDE5NSwgMHgwMWNkLCAweDAwNjR9LCB7MHgwMTliLCAweDAxOWIsIDB4MDExZiwgMHgwMTFmfSwKKyAgICB7MHgwMDZjLCAweDAwNzAsIDB4MDA3NCwgMHgwMDc4fSwgezB4MDAxYiwgMHgwMDFiLCAweDAxZDMsIDB4MDFkM30sCisgICAgezB4MDE4MywgMHgwMTgzLCAweDAxNWYsIDB4MDE1Zn0sIHsweDAxOWYsIDB4MDE5ZiwgMHgwMWRiLCAweDAxZGJ9LAorICAgIHsweDAxZDUsIDB4MDAxZCwgMHgwMWMxLCAweDAxZGR9fTsKIAotY29uc3QgVVNIT1JUIEh1ZmZtYW5Db2RlQm9va185Wzg0XVs0XSA9Ci17Ci0gIHsweDAwMDMsMHgwMDAzLDB4MDAwNCwweDAwMDh9LCB7MHgwMDA3LDB4MDAwNywweDAwNDMsMHgwMDQzfSwgezB4MDA0NSwweDAwMGMsMHgwMDEwLDB4MDAyY30sIHsweDAwNDksMHgwMDg1LDB4MDAwOSwweDAwODF9LAotICB7MHgwMDE0LDB4MDAxOCwweDAwMWMsMHgwMDIwfSwgezB4MDA0ZiwweDAwNGYsMHgwMDhiLDB4MDA4Yn0sIHsweDAwYzcsMHgwMGM3LDB4MDAwZCwweDAwYzF9LCB7MHgwMGM5LDB4MDA4ZCwweDAxMDUsMHgwMDUxfSwKLSAgezB4MDEwOSwweDAxNDUsMHgwMDI0LDB4MDAyOH0sIHsweDAwOTMsMHgwMDkzLDB4MDBjZiwweDAwY2Z9LCB7MHgwMTAzLDB4MDEwMywweDAwMTMsMHgwMDEzfSwgezB4MDAzMCwweDAwNDQsMHgwMDU4LDB4MDBhNH0sCi0gIHsweDAwMzQsMHgwMDM4LDB4MDAzYywweDAwNDB9LCB7MHgwMDU3LDB4MDA1NywweDAxNGIsMHgwMTRifSwgezB4MDE4NywweDAxODcsMHgwMTBmLDB4MDEwZn0sIHsweDAwOTcsMHgwMDk3LDB4MDA1YiwweDAwNWJ9LAotICB7MHgwMGQzLDB4MDBkMywweDAxNDEsMHgwMTg5fSwgezB4MDA0OCwweDAwNGMsMHgwMDUwLDB4MDA1NH0sIHsweDAwMTUsMHgwMWM1LDB4MDE0ZCwweDAyMDV9LCB7MHgwMDYxLDB4MDExMSwweDAwZDUsMHgwMDk5fSwKLSAgezB4MDA1ZCwweDAxODEsMHgwMGExLDB4MDIwOX0sIHsweDAxOGQsMHgwMWM5LDB4MDE1MSwweDAwNjV9LCB7MHgwMDVjLDB4MDA2OCwweDAwN2MsMHgwMDkwfSwgezB4MDI0NSwweDAwOWQsMHgwMDYwLDB4MDA2NH0sCi0gIHsweDAwMWIsMHgwMDFiLDB4MDExNywweDAxMTd9LCB7MHgwMGRiLDB4MDBkYiwweDAwZTMsMHgwMGUzfSwgezB4MDA2YywweDAwNzAsMHgwMDc0LDB4MDA3OH0sIHsweDAxYzMsMHgwMWMzLDB4MDBhNywweDAwYTd9LAotICB7MHgwMjBmLDB4MDIwZiwweDAxOTMsMHgwMTkzfSwgezB4MDFjZiwweDAxY2YsMHgwMjAzLDB4MDIwM30sIHsweDAwNmIsMHgwMDZiLDB4MDExYiwweDAxMWJ9LCB7MHgwMDgwLDB4MDA4NCwweDAwODgsMHgwMDhjfSwKLSAgezB4MDI0YiwweDAyNGIsMHgwMTU3LDB4MDE1N30sIHsweDAwMjMsMHgwMDIzLDB4MDAxZiwweDAwMWZ9LCB7MHgwMGRmLDB4MDBkZiwweDAwYWIsMHgwMGFifSwgezB4MDBlNywweDAwZTcsMHgwMTIzLDB4MDEyM30sCi0gIHsweDAwOTQsMHgwMDk4LDB4MDA5YywweDAwYTB9LCB7MHgwMjg3LDB4MDI4NywweDAxMWYsMHgwMTFmfSwgezB4MDE1YiwweDAxNWIsMHgwMTk3LDB4MDE5N30sIHsweDAyMTMsMHgwMjEzLDB4MDFkMywweDAxZDN9LAotICB7MHgwMjRmLDB4MDI0ZiwweDAwNmYsMHgwMDZmfSwgezB4MDBhOCwweDAwYmMsMHgwMGQwLDB4MDBmNH0sIHsweDAwYWMsMHgwMGIwLDB4MDBiNCwweDAwYjh9LCB7MHgwMjE3LDB4MDIxNywweDAwMjcsMHgwMDI3fSwKLSAgezB4MDE2MywweDAxNjMsMHgwMGU5LDB4MDI4OX0sIHsweDAyNDEsMHgwMGFkLDB4MDEyNSwweDAxOTl9LCB7MHgwMDcxLDB4MDI1MSwweDAxYTEsMHgwMmM1fSwgezB4MDBjMCwweDAwYzQsMHgwMGM4LDB4MDBjY30sCi0gIHsweDAxNjUsMHgwMTI5LDB4MDFkNSwweDAxNWR9LCB7MHgwMmM5LDB4MDMwNSwweDAwYjEsMHgwMGVkfSwgezB4MDI4ZCwweDAyNTUsMHgwMWQ5LDB4MDFlMX0sIHsweDAxMmQsMHgwMjgxLDB4MDE5ZCwweDAwZjF9LAotICB7MHgwMGQ0LDB4MDBkOCwweDAwZGMsMHgwMGUwfSwgezB4MDAyOSwweDAxNjksMHgwMjkxLDB4MDIxOX0sIHsweDAzMDksMHgwMWE1LDB4MDFlNSwweDAyZDF9LCB7MHgwMDJkLDB4MDI1OSwweDAyY2QsMHgwMjk1fSwKLSAgezB4MDBlNCwweDAwZTgsMHgwMGVjLDB4MDBmMH0sIHsweDAyMjMsMHgwMjIzLDB4MDIxZiwweDAyMWZ9LCB7MHgwMTczLDB4MDE3MywweDAzMGYsMHgwMzBmfSwgezB4MDE2ZiwweDAxNmYsMHgwMWRmLDB4MDFkZn0sCi0gIHsweDAxMzMsMHgwMTMzLDB4MDFhZiwweDAxYWZ9LCB7MHgwMGY4LDB4MDEwYywweDAxMjAsMHgwMTM0fSwgezB4MDBmYywweDAxMDAsMHgwMTA0LDB4MDEwOH0sIHsweDAxYWIsMHgwMWFiLDB4MDMxMywweDAzMTN9LAotICB7MHgwMjVmLDB4MDI1ZiwweDAyZDcsMHgwMmQ3fSwgezB4MDJjMywweDAyYzMsMHgwMWIzLDB4MDFiM30sIHsweDAyOWIsMHgwMjliLDB4MDAzMywweDAwMzN9LCB7MHgwMTEwLDB4MDExNCwweDAxMTgsMHgwMTFjfSwKLSAgezB4MDFlYiwweDAxZWIsMHgwMzE3LDB4MDMxN30sIHsweDAyOWYsMHgwMjlmLDB4MDIyNywweDAyMjd9LCB7MHgwMzAzLDB4MDMwMywweDAxZWYsMHgwMWVmfSwgezB4MDI2MywweDAyNjMsMHgwMjY3LDB4MDI2N30sCi0gIHsweDAxMjQsMHgwMTI4LDB4MDEyYywweDAxMzB9LCB7MHgwMjJiLDB4MDIyYiwweDAyZGYsMHgwMmRmfSwgezB4MDFmMywweDAxZjMsMHgwMmRiLDB4MDJkYn0sIHsweDAyZTMsMHgwMmUzLDB4MDIyZiwweDAyMmZ9LAotICB7MHgwMzFmLDB4MDMxZiwweDAzMWIsMHgwMzFifSwgezB4MDEzOCwweDAxM2MsMHgwMTQwLDB4MDE0NH0sIHsweDAyYTEsMHgwMjY5LDB4MDMyMSwweDAyYTV9LCB7MHgwMmU1LDB4MDMyNSwweDAyZTksMHgwMjcxfSwKLSAgezB4MDJhOSwweDAyNmQsMHgwMjMxLDB4MDJhZH0sIHsweDAyYjEsMHgwMmYxLDB4MDE0OCwweDAxNGN9LCB7MHgwMzJiLDB4MDMyYiwweDAyZWYsMHgwMmVmfSwgezB4MDMyZiwweDAzMmYsMHgwMzMzLDB4MDMzM30KLX07Citjb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rXzlbODRdWzRdID0geworICAgIHsweDAwMDMsIDB4MDAwMywgMHgwMDA0LCAweDAwMDh9LCB7MHgwMDA3LCAweDAwMDcsIDB4MDA0MywgMHgwMDQzfSwKKyAgICB7MHgwMDQ1LCAweDAwMGMsIDB4MDAxMCwgMHgwMDJjfSwgezB4MDA0OSwgMHgwMDg1LCAweDAwMDksIDB4MDA4MX0sCisgICAgezB4MDAxNCwgMHgwMDE4LCAweDAwMWMsIDB4MDAyMH0sIHsweDAwNGYsIDB4MDA0ZiwgMHgwMDhiLCAweDAwOGJ9LAorICAgIHsweDAwYzcsIDB4MDBjNywgMHgwMDBkLCAweDAwYzF9LCB7MHgwMGM5LCAweDAwOGQsIDB4MDEwNSwgMHgwMDUxfSwKKyAgICB7MHgwMTA5LCAweDAxNDUsIDB4MDAyNCwgMHgwMDI4fSwgezB4MDA5MywgMHgwMDkzLCAweDAwY2YsIDB4MDBjZn0sCisgICAgezB4MDEwMywgMHgwMTAzLCAweDAwMTMsIDB4MDAxM30sIHsweDAwMzAsIDB4MDA0NCwgMHgwMDU4LCAweDAwYTR9LAorICAgIHsweDAwMzQsIDB4MDAzOCwgMHgwMDNjLCAweDAwNDB9LCB7MHgwMDU3LCAweDAwNTcsIDB4MDE0YiwgMHgwMTRifSwKKyAgICB7MHgwMTg3LCAweDAxODcsIDB4MDEwZiwgMHgwMTBmfSwgezB4MDA5NywgMHgwMDk3LCAweDAwNWIsIDB4MDA1Yn0sCisgICAgezB4MDBkMywgMHgwMGQzLCAweDAxNDEsIDB4MDE4OX0sIHsweDAwNDgsIDB4MDA0YywgMHgwMDUwLCAweDAwNTR9LAorICAgIHsweDAwMTUsIDB4MDFjNSwgMHgwMTRkLCAweDAyMDV9LCB7MHgwMDYxLCAweDAxMTEsIDB4MDBkNSwgMHgwMDk5fSwKKyAgICB7MHgwMDVkLCAweDAxODEsIDB4MDBhMSwgMHgwMjA5fSwgezB4MDE4ZCwgMHgwMWM5LCAweDAxNTEsIDB4MDA2NX0sCisgICAgezB4MDA1YywgMHgwMDY4LCAweDAwN2MsIDB4MDA5MH0sIHsweDAyNDUsIDB4MDA5ZCwgMHgwMDYwLCAweDAwNjR9LAorICAgIHsweDAwMWIsIDB4MDAxYiwgMHgwMTE3LCAweDAxMTd9LCB7MHgwMGRiLCAweDAwZGIsIDB4MDBlMywgMHgwMGUzfSwKKyAgICB7MHgwMDZjLCAweDAwNzAsIDB4MDA3NCwgMHgwMDc4fSwgezB4MDFjMywgMHgwMWMzLCAweDAwYTcsIDB4MDBhN30sCisgICAgezB4MDIwZiwgMHgwMjBmLCAweDAxOTMsIDB4MDE5M30sIHsweDAxY2YsIDB4MDFjZiwgMHgwMjAzLCAweDAyMDN9LAorICAgIHsweDAwNmIsIDB4MDA2YiwgMHgwMTFiLCAweDAxMWJ9LCB7MHgwMDgwLCAweDAwODQsIDB4MDA4OCwgMHgwMDhjfSwKKyAgICB7MHgwMjRiLCAweDAyNGIsIDB4MDE1NywgMHgwMTU3fSwgezB4MDAyMywgMHgwMDIzLCAweDAwMWYsIDB4MDAxZn0sCisgICAgezB4MDBkZiwgMHgwMGRmLCAweDAwYWIsIDB4MDBhYn0sIHsweDAwZTcsIDB4MDBlNywgMHgwMTIzLCAweDAxMjN9LAorICAgIHsweDAwOTQsIDB4MDA5OCwgMHgwMDljLCAweDAwYTB9LCB7MHgwMjg3LCAweDAyODcsIDB4MDExZiwgMHgwMTFmfSwKKyAgICB7MHgwMTViLCAweDAxNWIsIDB4MDE5NywgMHgwMTk3fSwgezB4MDIxMywgMHgwMjEzLCAweDAxZDMsIDB4MDFkM30sCisgICAgezB4MDI0ZiwgMHgwMjRmLCAweDAwNmYsIDB4MDA2Zn0sIHsweDAwYTgsIDB4MDBiYywgMHgwMGQwLCAweDAwZjR9LAorICAgIHsweDAwYWMsIDB4MDBiMCwgMHgwMGI0LCAweDAwYjh9LCB7MHgwMjE3LCAweDAyMTcsIDB4MDAyNywgMHgwMDI3fSwKKyAgICB7MHgwMTYzLCAweDAxNjMsIDB4MDBlOSwgMHgwMjg5fSwgezB4MDI0MSwgMHgwMGFkLCAweDAxMjUsIDB4MDE5OX0sCisgICAgezB4MDA3MSwgMHgwMjUxLCAweDAxYTEsIDB4MDJjNX0sIHsweDAwYzAsIDB4MDBjNCwgMHgwMGM4LCAweDAwY2N9LAorICAgIHsweDAxNjUsIDB4MDEyOSwgMHgwMWQ1LCAweDAxNWR9LCB7MHgwMmM5LCAweDAzMDUsIDB4MDBiMSwgMHgwMGVkfSwKKyAgICB7MHgwMjhkLCAweDAyNTUsIDB4MDFkOSwgMHgwMWUxfSwgezB4MDEyZCwgMHgwMjgxLCAweDAxOWQsIDB4MDBmMX0sCisgICAgezB4MDBkNCwgMHgwMGQ4LCAweDAwZGMsIDB4MDBlMH0sIHsweDAwMjksIDB4MDE2OSwgMHgwMjkxLCAweDAyMTl9LAorICAgIHsweDAzMDksIDB4MDFhNSwgMHgwMWU1LCAweDAyZDF9LCB7MHgwMDJkLCAweDAyNTksIDB4MDJjZCwgMHgwMjk1fSwKKyAgICB7MHgwMGU0LCAweDAwZTgsIDB4MDBlYywgMHgwMGYwfSwgezB4MDIyMywgMHgwMjIzLCAweDAyMWYsIDB4MDIxZn0sCisgICAgezB4MDE3MywgMHgwMTczLCAweDAzMGYsIDB4MDMwZn0sIHsweDAxNmYsIDB4MDE2ZiwgMHgwMWRmLCAweDAxZGZ9LAorICAgIHsweDAxMzMsIDB4MDEzMywgMHgwMWFmLCAweDAxYWZ9LCB7MHgwMGY4LCAweDAxMGMsIDB4MDEyMCwgMHgwMTM0fSwKKyAgICB7MHgwMGZjLCAweDAxMDAsIDB4MDEwNCwgMHgwMTA4fSwgezB4MDFhYiwgMHgwMWFiLCAweDAzMTMsIDB4MDMxM30sCisgICAgezB4MDI1ZiwgMHgwMjVmLCAweDAyZDcsIDB4MDJkN30sIHsweDAyYzMsIDB4MDJjMywgMHgwMWIzLCAweDAxYjN9LAorICAgIHsweDAyOWIsIDB4MDI5YiwgMHgwMDMzLCAweDAwMzN9LCB7MHgwMTEwLCAweDAxMTQsIDB4MDExOCwgMHgwMTFjfSwKKyAgICB7MHgwMWViLCAweDAxZWIsIDB4MDMxNywgMHgwMzE3fSwgezB4MDI5ZiwgMHgwMjlmLCAweDAyMjcsIDB4MDIyN30sCisgICAgezB4MDMwMywgMHgwMzAzLCAweDAxZWYsIDB4MDFlZn0sIHsweDAyNjMsIDB4MDI2MywgMHgwMjY3LCAweDAyNjd9LAorICAgIHsweDAxMjQsIDB4MDEyOCwgMHgwMTJjLCAweDAxMzB9LCB7MHgwMjJiLCAweDAyMmIsIDB4MDJkZiwgMHgwMmRmfSwKKyAgICB7MHgwMWYzLCAweDAxZjMsIDB4MDJkYiwgMHgwMmRifSwgezB4MDJlMywgMHgwMmUzLCAweDAyMmYsIDB4MDIyZn0sCisgICAgezB4MDMxZiwgMHgwMzFmLCAweDAzMWIsIDB4MDMxYn0sIHsweDAxMzgsIDB4MDEzYywgMHgwMTQwLCAweDAxNDR9LAorICAgIHsweDAyYTEsIDB4MDI2OSwgMHgwMzIxLCAweDAyYTV9LCB7MHgwMmU1LCAweDAzMjUsIDB4MDJlOSwgMHgwMjcxfSwKKyAgICB7MHgwMmE5LCAweDAyNmQsIDB4MDIzMSwgMHgwMmFkfSwgezB4MDJiMSwgMHgwMmYxLCAweDAxNDgsIDB4MDE0Y30sCisgICAgezB4MDMyYiwgMHgwMzJiLCAweDAyZWYsIDB4MDJlZn0sIHsweDAzMmYsIDB4MDMyZiwgMHgwMzMzLCAweDAzMzN9fTsKIAotY29uc3QgVVNIT1JUIEh1ZmZtYW5Db2RlQm9va18xMFs4Ml1bNF0gPQotewotICB7MHgwMDA0LDB4MDAwYywweDAwMjAsMHgwMDRjfSwgezB4MDA0NSwweDAwODUsMHgwMDQ5LDB4MDAwOH0sIHsweDAwOGIsMHgwMDhiLDB4MDAwNywweDAwMDd9LCB7MHgwMDEwLDB4MDAxNCwweDAwMTgsMHgwMDFjfSwKLSAgezB4MDA0MywweDAwNDMsMHgwMGM3LDB4MDBjN30sIHsweDAwOGYsMHgwMDhmLDB4MDA0ZiwweDAwNGZ9LCB7MHgwMGNiLDB4MDBjYiwweDAwY2YsMHgwMGNmfSwgezB4MDAwOSwweDAwODEsMHgwMTA5LDB4MDA5MX0sCi0gIHsweDAwMjQsMHgwMDI4LDB4MDAyYywweDAwMzh9LCB7MHgwMTA1LDB4MDA1MSwweDAwMDEsMHgwMGQxfSwgezB4MDEwZCwweDAwMGQsMHgwMGMxLDB4MDExMX0sIHsweDAxNDksMHgwMDk1LDB4MDAzMCwweDAwMzR9LAotICB7MHgwMTQ3LDB4MDE0NywweDAwNTcsMHgwMDU3fSwgezB4MDBkNywweDAwZDcsMHgwMTRmLDB4MDE0Zn0sIHsweDAwM2MsMHgwMDQwLDB4MDA0NCwweDAwNDh9LCB7MHgwMTE3LDB4MDExNywweDAxNTMsMHgwMTUzfSwKLSAgezB4MDA5YiwweDAwOWIsMHgwMThiLDB4MDE4Yn0sIHsweDAwZGIsMHgwMGRiLDB4MDAxMywweDAwMTN9LCB7MHgwMDViLDB4MDA1YiwweDAxMDMsMHgwMTAzfSwgezB4MDA1MCwweDAwNjQsMHgwMDc4LDB4MDBjMH0sCi0gIHsweDAwNTQsMHgwMDU4LDB4MDA1YywweDAwNjB9LCB7MHgwMTg3LDB4MDE4NywweDAxOGYsMHgwMThmfSwgezB4MDE1NywweDAxNTcsMHgwMTFiLDB4MDExYn0sIHsweDAxOTMsMHgwMTkzLDB4MDE1OSwweDAwOWR9LAotICB7MHgwMWNkLDB4MDFjOSwweDAxOTUsMHgwMGExfSwgezB4MDA2OCwweDAwNmMsMHgwMDcwLDB4MDA3NH0sIHsweDAwZGQsMHgwMDE1LDB4MDA1ZCwweDAxNDF9LCB7MHgwMDYxLDB4MDFjNSwweDAwZTEsMHgwMTFkfSwKLSAgezB4MDFkMSwweDAyMDksMHgwMTk5LDB4MDE1ZH0sIHsweDAyMDUsMHgwMjBkLDB4MDEyMSwweDAyMTF9LCB7MHgwMDdjLDB4MDA4NCwweDAwOTgsMHgwMGFjfSwgezB4MDFkNSwweDAxNjEsMHgwMjE1LDB4MDA4MH0sCi0gIHsweDAxOWYsMHgwMTlmLDB4MDFkYiwweDAxZGJ9LCB7MHgwMDg4LDB4MDA4YywweDAwOTAsMHgwMDk0fSwgezB4MDBhNywweDAwYTcsMHgwMDFiLDB4MDAxYn0sIHsweDAyMWIsMHgwMjFiLDB4MDBlNywweDAwZTd9LAotICB7MHgwMjRmLDB4MDI0ZiwweDAwNjcsMHgwMDY3fSwgezB4MDI0YiwweDAyNGIsMHgwMTgzLDB4MDE4M30sIHsweDAwOWMsMHgwMGEwLDB4MDBhNCwweDAwYTh9LCB7MHgwMWEzLDB4MDFhMywweDAxMjcsMHgwMTI3fSwKLSAgezB4MDI1MywweDAyNTMsMHgwMGFiLDB4MDBhYn0sIHsweDAyNDcsMHgwMjQ3LDB4MDFkZiwweDAxZGZ9LCB7MHgwMWUzLDB4MDFlMywweDAxNjcsMHgwMTY3fSwgezB4MDBiMCwweDAwYjQsMHgwMGI4LDB4MDBiY30sCi0gIHsweDAyMWYsMHgwMjFmLDB4MDBlYiwweDAwZWJ9LCB7MHgwMjU3LDB4MDI1NywweDAxMmIsMHgwMTJifSwgezB4MDI4YiwweDAyOGIsMHgwMDZiLDB4MDA2Yn0sIHsweDAyOGYsMHgwMjhmLDB4MDFhNywweDAxYTd9LAotICB7MHgwMGM0LDB4MDBkOCwweDAwZWMsMHgwMTAwfSwgezB4MDBjOCwweDAwY2MsMHgwMGQwLDB4MDBkNH0sIHsweDAyNWIsMHgwMjViLDB4MDAyMywweDAwMjN9LCB7MHgwMjkzLDB4MDI5MywweDAwMWYsMHgwMDFmfSwKLSAgezB4MDBhZiwweDAwYWYsMHgwMjVkLDB4MDBlZH0sIHsweDAxYTksMHgwMjg1LDB4MDA2ZCwweDAxZTV9LCB7MHgwMGRjLDB4MDBlMCwweDAwZTQsMHgwMGU4fSwgezB4MDFjMSwweDAyMjEsMHgwMTY5LDB4MDJjZH0sCi0gIHsweDAyOTUsMHgwMjYxLDB4MDE2ZCwweDAyMDF9LCB7MHgwMTJkLDB4MDJjOSwweDAyOWQsMHgwMjk5fSwgezB4MDFlOSwweDAyZDEsMHgwMmM1LDB4MDBiMX0sIHsweDAwZjAsMHgwMGY0LDB4MDBmOCwweDAwZmN9LAotICB7MHgwMjI1LDB4MDBmMSwweDAxYWQsMHgwMmQ1fSwgezB4MDEzMSwweDAxZWQsMHgwMTcxLDB4MDMwZH0sIHsweDAyZDksMHgwMDI1LDB4MDIyOSwweDAwMjl9LCB7MHgwMDcxLDB4MDI0MSwweDAzMTEsMHgwMjY1fSwKLSAgezB4MDEwNCwweDAxMGMsMHgwMTIwLDB4MDEzNH0sIHsweDAxYjEsMHgwMzA5LDB4MDJhMSwweDAxMDh9LCB7MHgwMmE3LDB4MDJhNywweDAzMDcsMHgwMzA3fSwgezB4MDExMCwweDAxMTQsMHgwMTE4LDB4MDExY30sCi0gIHsweDAyMmYsMHgwMjJmLDB4MDFmMywweDAxZjN9LCB7MHgwMmRmLDB4MDJkZiwweDAzMTcsMHgwMzE3fSwgezB4MDMxYiwweDAzMWIsMHgwMjZiLDB4MDI2Yn0sIHsweDAyZTMsMHgwMmUzLDB4MDIzMywweDAyMzN9LAotICB7MHgwMTI0LDB4MDEyOCwweDAxMmMsMHgwMTMwfSwgezB4MDI4MywweDAyODMsMHgwMzFmLDB4MDMxZn0sIHsweDAwMmYsMHgwMDJmLDB4MDJhYiwweDAyYWJ9LCB7MHgwMjZmLDB4MDI2ZiwweDAyYWYsMHgwMmFmfSwKLSAgezB4MDJjMywweDAyYzMsMHgwMmVmLDB4MDJlZn0sIHsweDAxMzgsMHgwMTNjLDB4MDE0MCwweDAxNDR9LCB7MHgwMmU3LDB4MDJlNywweDAyZWIsMHgwMmVifSwgezB4MDAzMywweDAwMzMsMHgwMzIzLDB4MDMyM30sCi0gIHsweDAyNzEsMHgwMzI5LDB4MDMyNSwweDAzMmR9LCB7MHgwMmYxLDB4MDMwMSwweDAyYjEsMHgwMzMxfQotfTsKK2NvbnN0IFVTSE9SVCBIdWZmbWFuQ29kZUJvb2tfMTBbODJdWzRdID0geworICAgIHsweDAwMDQsIDB4MDAwYywgMHgwMDIwLCAweDAwNGN9LCB7MHgwMDQ1LCAweDAwODUsIDB4MDA0OSwgMHgwMDA4fSwKKyAgICB7MHgwMDhiLCAweDAwOGIsIDB4MDAwNywgMHgwMDA3fSwgezB4MDAxMCwgMHgwMDE0LCAweDAwMTgsIDB4MDAxY30sCisgICAgezB4MDA0MywgMHgwMDQzLCAweDAwYzcsIDB4MDBjN30sIHsweDAwOGYsIDB4MDA4ZiwgMHgwMDRmLCAweDAwNGZ9LAorICAgIHsweDAwY2IsIDB4MDBjYiwgMHgwMGNmLCAweDAwY2Z9LCB7MHgwMDA5LCAweDAwODEsIDB4MDEwOSwgMHgwMDkxfSwKKyAgICB7MHgwMDI0LCAweDAwMjgsIDB4MDAyYywgMHgwMDM4fSwgezB4MDEwNSwgMHgwMDUxLCAweDAwMDEsIDB4MDBkMX0sCisgICAgezB4MDEwZCwgMHgwMDBkLCAweDAwYzEsIDB4MDExMX0sIHsweDAxNDksIDB4MDA5NSwgMHgwMDMwLCAweDAwMzR9LAorICAgIHsweDAxNDcsIDB4MDE0NywgMHgwMDU3LCAweDAwNTd9LCB7MHgwMGQ3LCAweDAwZDcsIDB4MDE0ZiwgMHgwMTRmfSwKKyAgICB7MHgwMDNjLCAweDAwNDAsIDB4MDA0NCwgMHgwMDQ4fSwgezB4MDExNywgMHgwMTE3LCAweDAxNTMsIDB4MDE1M30sCisgICAgezB4MDA5YiwgMHgwMDliLCAweDAxOGIsIDB4MDE4Yn0sIHsweDAwZGIsIDB4MDBkYiwgMHgwMDEzLCAweDAwMTN9LAorICAgIHsweDAwNWIsIDB4MDA1YiwgMHgwMTAzLCAweDAxMDN9LCB7MHgwMDUwLCAweDAwNjQsIDB4MDA3OCwgMHgwMGMwfSwKKyAgICB7MHgwMDU0LCAweDAwNTgsIDB4MDA1YywgMHgwMDYwfSwgezB4MDE4NywgMHgwMTg3LCAweDAxOGYsIDB4MDE4Zn0sCisgICAgezB4MDE1NywgMHgwMTU3LCAweDAxMWIsIDB4MDExYn0sIHsweDAxOTMsIDB4MDE5MywgMHgwMTU5LCAweDAwOWR9LAorICAgIHsweDAxY2QsIDB4MDFjOSwgMHgwMTk1LCAweDAwYTF9LCB7MHgwMDY4LCAweDAwNmMsIDB4MDA3MCwgMHgwMDc0fSwKKyAgICB7MHgwMGRkLCAweDAwMTUsIDB4MDA1ZCwgMHgwMTQxfSwgezB4MDA2MSwgMHgwMWM1LCAweDAwZTEsIDB4MDExZH0sCisgICAgezB4MDFkMSwgMHgwMjA5LCAweDAxOTksIDB4MDE1ZH0sIHsweDAyMDUsIDB4MDIwZCwgMHgwMTIxLCAweDAyMTF9LAorICAgIHsweDAwN2MsIDB4MDA4NCwgMHgwMDk4LCAweDAwYWN9LCB7MHgwMWQ1LCAweDAxNjEsIDB4MDIxNSwgMHgwMDgwfSwKKyAgICB7MHgwMTlmLCAweDAxOWYsIDB4MDFkYiwgMHgwMWRifSwgezB4MDA4OCwgMHgwMDhjLCAweDAwOTAsIDB4MDA5NH0sCisgICAgezB4MDBhNywgMHgwMGE3LCAweDAwMWIsIDB4MDAxYn0sIHsweDAyMWIsIDB4MDIxYiwgMHgwMGU3LCAweDAwZTd9LAorICAgIHsweDAyNGYsIDB4MDI0ZiwgMHgwMDY3LCAweDAwNjd9LCB7MHgwMjRiLCAweDAyNGIsIDB4MDE4MywgMHgwMTgzfSwKKyAgICB7MHgwMDljLCAweDAwYTAsIDB4MDBhNCwgMHgwMGE4fSwgezB4MDFhMywgMHgwMWEzLCAweDAxMjcsIDB4MDEyN30sCisgICAgezB4MDI1MywgMHgwMjUzLCAweDAwYWIsIDB4MDBhYn0sIHsweDAyNDcsIDB4MDI0NywgMHgwMWRmLCAweDAxZGZ9LAorICAgIHsweDAxZTMsIDB4MDFlMywgMHgwMTY3LCAweDAxNjd9LCB7MHgwMGIwLCAweDAwYjQsIDB4MDBiOCwgMHgwMGJjfSwKKyAgICB7MHgwMjFmLCAweDAyMWYsIDB4MDBlYiwgMHgwMGVifSwgezB4MDI1NywgMHgwMjU3LCAweDAxMmIsIDB4MDEyYn0sCisgICAgezB4MDI4YiwgMHgwMjhiLCAweDAwNmIsIDB4MDA2Yn0sIHsweDAyOGYsIDB4MDI4ZiwgMHgwMWE3LCAweDAxYTd9LAorICAgIHsweDAwYzQsIDB4MDBkOCwgMHgwMGVjLCAweDAxMDB9LCB7MHgwMGM4LCAweDAwY2MsIDB4MDBkMCwgMHgwMGQ0fSwKKyAgICB7MHgwMjViLCAweDAyNWIsIDB4MDAyMywgMHgwMDIzfSwgezB4MDI5MywgMHgwMjkzLCAweDAwMWYsIDB4MDAxZn0sCisgICAgezB4MDBhZiwgMHgwMGFmLCAweDAyNWQsIDB4MDBlZH0sIHsweDAxYTksIDB4MDI4NSwgMHgwMDZkLCAweDAxZTV9LAorICAgIHsweDAwZGMsIDB4MDBlMCwgMHgwMGU0LCAweDAwZTh9LCB7MHgwMWMxLCAweDAyMjEsIDB4MDE2OSwgMHgwMmNkfSwKKyAgICB7MHgwMjk1LCAweDAyNjEsIDB4MDE2ZCwgMHgwMjAxfSwgezB4MDEyZCwgMHgwMmM5LCAweDAyOWQsIDB4MDI5OX0sCisgICAgezB4MDFlOSwgMHgwMmQxLCAweDAyYzUsIDB4MDBiMX0sIHsweDAwZjAsIDB4MDBmNCwgMHgwMGY4LCAweDAwZmN9LAorICAgIHsweDAyMjUsIDB4MDBmMSwgMHgwMWFkLCAweDAyZDV9LCB7MHgwMTMxLCAweDAxZWQsIDB4MDE3MSwgMHgwMzBkfSwKKyAgICB7MHgwMmQ5LCAweDAwMjUsIDB4MDIyOSwgMHgwMDI5fSwgezB4MDA3MSwgMHgwMjQxLCAweDAzMTEsIDB4MDI2NX0sCisgICAgezB4MDEwNCwgMHgwMTBjLCAweDAxMjAsIDB4MDEzNH0sIHsweDAxYjEsIDB4MDMwOSwgMHgwMmExLCAweDAxMDh9LAorICAgIHsweDAyYTcsIDB4MDJhNywgMHgwMzA3LCAweDAzMDd9LCB7MHgwMTEwLCAweDAxMTQsIDB4MDExOCwgMHgwMTFjfSwKKyAgICB7MHgwMjJmLCAweDAyMmYsIDB4MDFmMywgMHgwMWYzfSwgezB4MDJkZiwgMHgwMmRmLCAweDAzMTcsIDB4MDMxN30sCisgICAgezB4MDMxYiwgMHgwMzFiLCAweDAyNmIsIDB4MDI2Yn0sIHsweDAyZTMsIDB4MDJlMywgMHgwMjMzLCAweDAyMzN9LAorICAgIHsweDAxMjQsIDB4MDEyOCwgMHgwMTJjLCAweDAxMzB9LCB7MHgwMjgzLCAweDAyODMsIDB4MDMxZiwgMHgwMzFmfSwKKyAgICB7MHgwMDJmLCAweDAwMmYsIDB4MDJhYiwgMHgwMmFifSwgezB4MDI2ZiwgMHgwMjZmLCAweDAyYWYsIDB4MDJhZn0sCisgICAgezB4MDJjMywgMHgwMmMzLCAweDAyZWYsIDB4MDJlZn0sIHsweDAxMzgsIDB4MDEzYywgMHgwMTQwLCAweDAxNDR9LAorICAgIHsweDAyZTcsIDB4MDJlNywgMHgwMmViLCAweDAyZWJ9LCB7MHgwMDMzLCAweDAwMzMsIDB4MDMyMywgMHgwMzIzfSwKKyAgICB7MHgwMjcxLCAweDAzMjksIDB4MDMyNSwgMHgwMzJkfSwgezB4MDJmMSwgMHgwMzAxLCAweDAyYjEsIDB4MDMzMX19OwogCi1jb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rXzExWzE1Ml1bNF0gPQotewotICB7MHgwMDA0LDB4MDAxMCwweDAwMzgsMHgwMDhjfSwgezB4MDAwMSwweDAwODUsMHgwMDA4LDB4MDAwY30sIHsweDA4NDMsMHgwODQzLDB4MDAwNywweDAwMDd9LCB7MHgwMDgzLDB4MDA4MywweDAwOGIsMHgwMDhifSwKLSAgezB4MDAxNCwweDAwMTgsMHgwMDFjLDB4MDAyNH0sIHsweDAxMDcsMHgwMTA3LDB4MDEwYiwweDAxMGJ9LCB7MHgwMTg1LDB4MDA4ZCwweDAxMGQsMHgwMDA5fSwgezB4MDE4OSwweDAxMDEsMHgwMThkLDB4MDAyMH0sCi0gIHsweDAwOTMsMHgwMDkzLDB4MDIwNywweDAyMDd9LCB7MHgwMDI4LDB4MDAyYywweDAwMzAsMHgwMDM0fSwgezB4MDExMywweDAxMTMsMHgwMjBiLDB4MDIwYn0sIHsweDAxOTMsMHgwMTkzLDB4MDIwZiwweDAyMGZ9LAotICB7MHgwMDBmLDB4MDAwZiwweDAxODMsMHgwMTgzfSwgezB4MDA5NywweDAwOTcsMHgwMTE3LDB4MDExN30sIHsweDAwM2MsMHgwMDUwLDB4MDA2NCwweDAwNzh9LCB7MHgwMDQwLDB4MDA0NCwweDAwNDgsMHgwMDRjfSwKLSAgezB4MDI4YiwweDAyOGIsMHgwMjEzLDB4MDIxM30sIHsweDAyODcsMHgwMjg3LDB4MDE5NywweDAxOTd9LCB7MHgwMjhmLDB4MDI4ZiwweDAyMTcsMHgwMjE3fSwgezB4MDI5MSwweDAxMTksMHgwMzA5LDB4MDA5OX0sCi0gIHsweDAwNTQsMHgwMDU4LDB4MDA1YywweDAwNjB9LCB7MHgwMTk5LDB4MDMwZCwweDAzMDUsMHgwODExfSwgezB4MDgwZCwweDAyYzEsMHgwMWMxLDB4MDI0MX0sIHsweDAyMTksMHgwMzQxLDB4MDAxMSwweDAzMTF9LAotICB7MHgwMjAxLDB4MDgwOSwweDAyOTUsMHgwODE1fSwgezB4MDA2OCwweDAwNmMsMHgwMDcwLDB4MDA3NH0sIHsweDAzYzEsMHgwMTQxLDB4MDQ0MSwweDAzODl9LCB7MHgwMTFkLDB4MDM4ZCwweDAyOTksMHgwMzE1fSwKLSAgezB4MDgxOSwweDA1NDEsMHgwMTlkLDB4MDA5ZH0sIHsweDA0YzEsMHgwODFkLDB4MDgwNSwweDAzODV9LCB7MHgwMDdjLDB4MDA4MCwweDAwODQsMHgwMDg4fSwgezB4MDM5MSwweDA1YzEsMHgwMjFkLDB4MDY0MX0sCi0gIHsweDA4MjEsMHgwMGMxLDB4MDMxOSwweDA4MjV9LCB7MHgwNDA5LDB4MDM5NSwweDA4MjksMHgwNmMxfSwgezB4MDFhMSwweDAxMjEsMHgwNDBkLDB4MDAxNX0sIHsweDAwOTAsMHgwMGM4LDB4MDExYywweDAxNzB9LAotICB7MHgwMDk0LDB4MDA5OCwweDAwYTAsMHgwMGI0fSwgezB4MDc0MSwweDA4MmQsMHgwMjlkLDB4MDQxMX0sIHsweDAzOTksMHgwMzFkLDB4MDI4MSwweDAwOWN9LCB7MHgwMjIzLDB4MDIyMywweDA3YzMsMHgwN2MzfSwKLSAgezB4MDBhNCwweDAwYTgsMHgwMGFjLDB4MDBiMH0sIHsweDA4MzMsMHgwODMzLDB4MDQwNywweDA0MDd9LCB7MHgwMGEzLDB4MDBhMywweDA4M2IsMHgwODNifSwgezB4MDQxNywweDA0MTcsMHgwODM3LDB4MDgzN30sCi0gIHsweDA0OGYsMHgwNDhmLDB4MDJhMywweDAyYTN9LCB7MHgwMGI4LDB4MDBiYywweDAwYzAsMHgwMGM0fSwgezB4MDM5ZiwweDAzOWYsMHgwNDhiLDB4MDQ4Yn0sIHsweDAzMjMsMHgwMzIzLDB4MDEyNywweDAxMjd9LAotICB7MHgwMWE3LDB4MDFhNywweDA4M2YsMHgwODNmfSwgezB4MDQ5MywweDA0OTMsMHgwNDFiLDB4MDQxYn0sIHsweDAwY2MsMHgwMGUwLDB4MDBmNCwweDAxMDh9LCB7MHgwMGQwLDB4MDBkNCwweDAwZDgsMHgwMGRjfSwKLSAgezB4MDAxYiwweDAwMWIsMHgwMjI3LDB4MDIyN30sIHsweDA0OTcsMHgwNDk3LDB4MDNhMywweDAzYTN9LCB7MHgwNDFmLDB4MDQxZiwweDA0ODcsMHgwNDg3fSwgezB4MDFhYiwweDAxYWIsMHgwMzAzLDB4MDMwM30sCi0gIHsweDAwZTQsMHgwMGU4LDB4MDBlYywweDAwZjB9LCB7MHgwMTJiLDB4MDEyYiwweDAwYTcsMHgwMGE3fSwgezB4MDJhNywweDAyYTcsMHgwNTEzLDB4MDUxM30sIHsweDA1MGIsMHgwNTBiLDB4MDMyNywweDAzMjd9LAotICB7MHgwNTBmLDB4MDUwZiwweDA0OWIsMHgwNDlifSwgezB4MDBmOCwweDAwZmMsMHgwMTAwLDB4MDEwNH0sIHsweDAyMmIsMHgwMjJiLDB4MDQyMywweDA0MjN9LCB7MHgwMmFiLDB4MDJhYiwweDAzYTcsMHgwM2E3fSwKLSAgezB4MDFhZiwweDAxYWYsMHgwNTA3LDB4MDUwN30sIHsweDAwMWYsMHgwMDFmLDB4MDMyYiwweDAzMmJ9LCB7MHgwMTBjLDB4MDExMCwweDAxMTQsMHgwMTE4fSwgezB4MDQ5ZiwweDA0OWYsMHgwNThmLDB4MDU4Zn0sCi0gIHsweDA1MTcsMHgwNTE3LDB4MDBhYiwweDAwYWJ9LCB7MHgwNTkzLDB4MDU5MywweDAxMmYsMHgwMTJmfSwgezB4MDEzNywweDAxMzcsMHgwNTFiLDB4MDUxYn0sIHsweDAxMjAsMHgwMTM0LDB4MDE0OCwweDAxNWN9LAotICB7MHgwMTI0LDB4MDEyOCwweDAxMmMsMHgwMTMwfSwgezB4MDFiNywweDAxYjcsMHgwNThiLDB4MDU4Yn0sIHsweDAwNDMsMHgwMDQzLDB4MDU5NywweDA1OTd9LCB7MHgwMmFmLDB4MDJhZiwweDAyMmQsMHgwNDI1fSwKLSAgezB4MDUxZCwweDA0YTEsMHgwODAxLDB4MDY5MX0sIHsweDAxMzgsMHgwMTNjLDB4MDE0MCwweDAxNDR9LCB7MHgwMzgxLDB4MDY4ZCwweDAzMmQsMHgwMGI1fSwgezB4MDIzNSwweDAxYjEsMHgwNjg5LDB4MDJiNX0sCi0gIHsweDA1MjEsMHgwNTk5LDB4MDQyOSwweDAzYTl9LCB7MHgwMTM5LDB4MDIzMSwweDA1ODUsMHgwNjExfSwgezB4MDE0YywweDAxNTAsMHgwMTU0LDB4MDE1OH0sIHsweDAwYWQsMHgwNjBkLDB4MDY4NSwweDAxMzF9LAotICB7MHgwNTlkLDB4MDcwZCwweDA2MTUsMHgwNjk1fSwgezB4MDIzOSwweDA3MTEsMHgwM2FkLDB4MDFiOX0sIHsweDAyYjEsMHgwMzM1LDB4MDMzMSwweDAwMjF9LCB7MHgwMTYwLDB4MDE2NCwweDAxNjgsMHgwMTZjfSwKLSAgezB4MDQyZCwweDA2MDksMHgwNGE1LDB4MDJiOX0sIHsweDA2OTksMHgwNTI5LDB4MDEzZCwweDA1YTF9LCB7MHgwNTI1LDB4MDMzOSwweDA0YTksMHgwNzE1fSwgezB4MDRhZCwweDAwYjksMHgwNzA5LDB4MDYxOX0sCi0gIHsweDAxNzQsMHgwMTg4LDB4MDE5YywweDAxY2N9LCB7MHgwMTc4LDB4MDE3YywweDAxODAsMHgwMTg0fSwgezB4MDYwNSwweDA0MzUsMHgwNDAxLDB4MDNiNX0sIHsweDA2MWQsMHgwM2IxLDB4MDY5ZCwweDAxYmR9LAotICB7MHgwMGIxLDB4MDcxOSwweDA3ODksMHgwMmJkfSwgezB4MDIzZCwweDA3MDUsMHgwNWE1LDB4MDc5MX0sIHsweDAxOGMsMHgwMTkwLDB4MDE5NCwweDAxOTh9LCB7MHgwM2I5LDB4MDZhMSwweDA0YjUsMHgwNjIxfSwKLSAgezB4MDc5NSwweDA3OGQsMHgwNWE5LDB4MDUyZH0sIHsweDA0MzEsMHgwMzNkLDB4MDNiZCwweDA3MjF9LCB7MHgwMGJkLDB4MDcxZCwweDAwMjUsMHgwNDgxfSwgezB4MDFhMCwweDAxYTQsMHgwMWE4LDB4MDFiOH0sCi0gIHsweDA2YTUsMHgwNjI1LDB4MDRiMSwweDA0Mzl9LCB7MHgwNmE5LDB4MDRiOSwweDA1MzEsMHgwNzk5fSwgezB4MDc5ZCwweDAxYWMsMHgwMWIwLDB4MDFiNH0sIHsweDA3MjcsMHgwNzI3LDB4MDQzZiwweDA0M2Z9LAotICB7MHgwNWFmLDB4MDVhZiwweDA3MmYsMHgwNzJmfSwgezB4MDc4NywweDA3ODcsMHgwNjJiLDB4MDYyYn0sIHsweDAxYmMsMHgwMWMwLDB4MDFjNCwweDAxYzh9LCB7MHgwNzJiLDB4MDcyYiwweDA1YjcsMHgwNWI3fSwKLSAgezB4MDUzNywweDA1MzcsMHgwNmFmLDB4MDZhZn0sIHsweDA2MmYsMHgwNjJmLDB4MDdhMywweDA3YTN9LCB7MHgwNWJiLDB4MDViYiwweDA2MzcsMHgwNjM3fSwgezB4MDFkMCwweDAxZTQsMHgwMWY4LDB4MDIwY30sCi0gIHsweDAxZDQsMHgwMWQ4LDB4MDFkYywweDAxZTB9LCB7MHgwNmIzLDB4MDZiMywweDA0YmYsMHgwNGJmfSwgezB4MDUzYiwweDA1M2IsMHgwMDJiLDB4MDAyYn0sIHsweDA1YjMsMHgwNWIzLDB4MDdhNywweDA3YTd9LAotICB7MHgwNTAzLDB4MDUwMywweDA2MzMsMHgwNjMzfSwgezB4MDFlOCwweDAxZWMsMHgwMWYwLDB4MDFmNH0sIHsweDAwMmYsMHgwMDJmLDB4MDczMywweDA3MzN9LCB7MHgwN2FiLDB4MDdhYiwweDA2YjcsMHgwNmI3fSwKLSAgezB4MDY4MywweDA2ODMsMHgwNjNiLDB4MDYzYn0sIHsweDA1M2YsMHgwNTNmLDB4MDViZiwweDA1YmZ9LCB7MHgwMWZjLDB4MDIwMCwweDAyMDQsMHgwMjA4fSwgezB4MDdhZiwweDA3YWYsMHgwNmJiLDB4MDZiYn0sCi0gIHsweDAwMzcsMHgwMDM3LDB4MDU4MywweDA1ODN9LCB7MHgwNzM3LDB4MDczNywweDA2M2YsMHgwNjNmfSwgezB4MDZiZiwweDA2YmYsMHgwN2IzLDB4MDdiM30sIHsweDAyMTAsMHgwMjE0LDB4MDIxOCwweDAyMWN9LAotICB7MHgwMDNiLDB4MDAzYiwweDA3M2IsMHgwNzNifSwgezB4MDdiNywweDA3YjcsMHgwMDMzLDB4MDAzM30sIHsweDA3YmIsMHgwN2JiLDB4MDcwMSwweDA2MDF9LCB7MHgwNzNkLDB4MDAzZCwweDA3ODEsMHgwN2JkfSwKLSAgezB4MDExOCwweDAxMTcsMHgwMTAwLDB4MDEwOX0sIHsweDA1YTUsMHgwNWExLDB4MDViNywweDA1MTN9LCB7MHgwOGY5LDB4MDhmZiwweDA4MjEsMHgwOGZmfSwgezB4MDg0ZiwweDA4ZmYsMHgwOGJjLDB4MDhmZn0sCi0gIHsweDA4MTUsMHgwOGZmLDB4MDgzNywweDA4ZmZ9LCB7MHgwODBkLDB4MDhmZiwweDA4NWYsMHgwOGZmfSwgezB4MDg0YSwweDA4ZmYsMHgwODdkLDB4MDhmZn0sIHsweDA4ZmYsMHgwOGZmLDB4MDhhOCwweDA4ZmZ9LAotICB7MHgwODE1LDB4MDhmZiwweDA4M2YsMHgwOGZmfSwgezB4MDgzMCwweDA4ZmYsMHgwODk0LDB4MDhmZn0sIHsweDA4ZDQsMHgwOGZmLDB4MDgyNSwweDA4ZmZ9LCB7MHgwOGVmLDB4MDhmZiwweDA4M2YsMHgwOGZmfSwKLSAgezB4MDgwOSwweDA4ZmYsMHgwOGZjLDB4MDhmZn0sIHsweDA4NDIsMHgwOGZmLDB4MDhiMywweDA4ZmZ9LCB7MHgwNzBkLDB4MDdhOSwweDA2MGUsMHgwNmUyfSwgezB4MDZjNywweDA2ZDAsMHgwNGIyLDB4MDQwN30KLX07Citjb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rXzExWzE1Ml1bNF0gPSB7CisgICAgezB4MDAwNCwgMHgwMDEwLCAweDAwMzgsIDB4MDA4Y30sIHsweDAwMDEsIDB4MDA4NSwgMHgwMDA4LCAweDAwMGN9LAorICAgIHsweDA4NDMsIDB4MDg0MywgMHgwMDA3LCAweDAwMDd9LCB7MHgwMDgzLCAweDAwODMsIDB4MDA4YiwgMHgwMDhifSwKKyAgICB7MHgwMDE0LCAweDAwMTgsIDB4MDAxYywgMHgwMDI0fSwgezB4MDEwNywgMHgwMTA3LCAweDAxMGIsIDB4MDEwYn0sCisgICAgezB4MDE4NSwgMHgwMDhkLCAweDAxMGQsIDB4MDAwOX0sIHsweDAxODksIDB4MDEwMSwgMHgwMThkLCAweDAwMjB9LAorICAgIHsweDAwOTMsIDB4MDA5MywgMHgwMjA3LCAweDAyMDd9LCB7MHgwMDI4LCAweDAwMmMsIDB4MDAzMCwgMHgwMDM0fSwKKyAgICB7MHgwMTEzLCAweDAxMTMsIDB4MDIwYiwgMHgwMjBifSwgezB4MDE5MywgMHgwMTkzLCAweDAyMGYsIDB4MDIwZn0sCisgICAgezB4MDAwZiwgMHgwMDBmLCAweDAxODMsIDB4MDE4M30sIHsweDAwOTcsIDB4MDA5NywgMHgwMTE3LCAweDAxMTd9LAorICAgIHsweDAwM2MsIDB4MDA1MCwgMHgwMDY0LCAweDAwNzh9LCB7MHgwMDQwLCAweDAwNDQsIDB4MDA0OCwgMHgwMDRjfSwKKyAgICB7MHgwMjhiLCAweDAyOGIsIDB4MDIxMywgMHgwMjEzfSwgezB4MDI4NywgMHgwMjg3LCAweDAxOTcsIDB4MDE5N30sCisgICAgezB4MDI4ZiwgMHgwMjhmLCAweDAyMTcsIDB4MDIxN30sIHsweDAyOTEsIDB4MDExOSwgMHgwMzA5LCAweDAwOTl9LAorICAgIHsweDAwNTQsIDB4MDA1OCwgMHgwMDVjLCAweDAwNjB9LCB7MHgwMTk5LCAweDAzMGQsIDB4MDMwNSwgMHgwODExfSwKKyAgICB7MHgwODBkLCAweDAyYzEsIDB4MDFjMSwgMHgwMjQxfSwgezB4MDIxOSwgMHgwMzQxLCAweDAwMTEsIDB4MDMxMX0sCisgICAgezB4MDIwMSwgMHgwODA5LCAweDAyOTUsIDB4MDgxNX0sIHsweDAwNjgsIDB4MDA2YywgMHgwMDcwLCAweDAwNzR9LAorICAgIHsweDAzYzEsIDB4MDE0MSwgMHgwNDQxLCAweDAzODl9LCB7MHgwMTFkLCAweDAzOGQsIDB4MDI5OSwgMHgwMzE1fSwKKyAgICB7MHgwODE5LCAweDA1NDEsIDB4MDE5ZCwgMHgwMDlkfSwgezB4MDRjMSwgMHgwODFkLCAweDA4MDUsIDB4MDM4NX0sCisgICAgezB4MDA3YywgMHgwMDgwLCAweDAwODQsIDB4MDA4OH0sIHsweDAzOTEsIDB4MDVjMSwgMHgwMjFkLCAweDA2NDF9LAorICAgIHsweDA4MjEsIDB4MDBjMSwgMHgwMzE5LCAweDA4MjV9LCB7MHgwNDA5LCAweDAzOTUsIDB4MDgyOSwgMHgwNmMxfSwKKyAgICB7MHgwMWExLCAweDAxMjEsIDB4MDQwZCwgMHgwMDE1fSwgezB4MDA5MCwgMHgwMGM4LCAweDAxMWMsIDB4MDE3MH0sCisgICAgezB4MDA5NCwgMHgwMDk4LCAweDAwYTAsIDB4MDBiNH0sIHsweDA3NDEsIDB4MDgyZCwgMHgwMjlkLCAweDA0MTF9LAorICAgIHsweDAzOTksIDB4MDMxZCwgMHgwMjgxLCAweDAwOWN9LCB7MHgwMjIzLCAweDAyMjMsIDB4MDdjMywgMHgwN2MzfSwKKyAgICB7MHgwMGE0LCAweDAwYTgsIDB4MDBhYywgMHgwMGIwfSwgezB4MDgzMywgMHgwODMzLCAweDA0MDcsIDB4MDQwN30sCisgICAgezB4MDBhMywgMHgwMGEzLCAweDA4M2IsIDB4MDgzYn0sIHsweDA0MTcsIDB4MDQxNywgMHgwODM3LCAweDA4Mzd9LAorICAgIHsweDA0OGYsIDB4MDQ4ZiwgMHgwMmEzLCAweDAyYTN9LCB7MHgwMGI4LCAweDAwYmMsIDB4MDBjMCwgMHgwMGM0fSwKKyAgICB7MHgwMzlmLCAweDAzOWYsIDB4MDQ4YiwgMHgwNDhifSwgezB4MDMyMywgMHgwMzIzLCAweDAxMjcsIDB4MDEyN30sCisgICAgezB4MDFhNywgMHgwMWE3LCAweDA4M2YsIDB4MDgzZn0sIHsweDA0OTMsIDB4MDQ5MywgMHgwNDFiLCAweDA0MWJ9LAorICAgIHsweDAwY2MsIDB4MDBlMCwgMHgwMGY0LCAweDAxMDh9LCB7MHgwMGQwLCAweDAwZDQsIDB4MDBkOCwgMHgwMGRjfSwKKyAgICB7MHgwMDFiLCAweDAwMWIsIDB4MDIyNywgMHgwMjI3fSwgezB4MDQ5NywgMHgwNDk3LCAweDAzYTMsIDB4MDNhM30sCisgICAgezB4MDQxZiwgMHgwNDFmLCAweDA0ODcsIDB4MDQ4N30sIHsweDAxYWIsIDB4MDFhYiwgMHgwMzAzLCAweDAzMDN9LAorICAgIHsweDAwZTQsIDB4MDBlOCwgMHgwMGVjLCAweDAwZjB9LCB7MHgwMTJiLCAweDAxMmIsIDB4MDBhNywgMHgwMGE3fSwKKyAgICB7MHgwMmE3LCAweDAyYTcsIDB4MDUxMywgMHgwNTEzfSwgezB4MDUwYiwgMHgwNTBiLCAweDAzMjcsIDB4MDMyN30sCisgICAgezB4MDUwZiwgMHgwNTBmLCAweDA0OWIsIDB4MDQ5Yn0sIHsweDAwZjgsIDB4MDBmYywgMHgwMTAwLCAweDAxMDR9LAorICAgIHsweDAyMmIsIDB4MDIyYiwgMHgwNDIzLCAweDA0MjN9LCB7MHgwMmFiLCAweDAyYWIsIDB4MDNhNywgMHgwM2E3fSwKKyAgICB7MHgwMWFmLCAweDAxYWYsIDB4MDUwNywgMHgwNTA3fSwgezB4MDAxZiwgMHgwMDFmLCAweDAzMmIsIDB4MDMyYn0sCisgICAgezB4MDEwYywgMHgwMTEwLCAweDAxMTQsIDB4MDExOH0sIHsweDA0OWYsIDB4MDQ5ZiwgMHgwNThmLCAweDA1OGZ9LAorICAgIHsweDA1MTcsIDB4MDUxNywgMHgwMGFiLCAweDAwYWJ9LCB7MHgwNTkzLCAweDA1OTMsIDB4MDEyZiwgMHgwMTJmfSwKKyAgICB7MHgwMTM3LCAweDAxMzcsIDB4MDUxYiwgMHgwNTFifSwgezB4MDEyMCwgMHgwMTM0LCAweDAxNDgsIDB4MDE1Y30sCisgICAgezB4MDEyNCwgMHgwMTI4LCAweDAxMmMsIDB4MDEzMH0sIHsweDAxYjcsIDB4MDFiNywgMHgwNThiLCAweDA1OGJ9LAorICAgIHsweDAwNDMsIDB4MDA0MywgMHgwNTk3LCAweDA1OTd9LCB7MHgwMmFmLCAweDAyYWYsIDB4MDIyZCwgMHgwNDI1fSwKKyAgICB7MHgwNTFkLCAweDA0YTEsIDB4MDgwMSwgMHgwNjkxfSwgezB4MDEzOCwgMHgwMTNjLCAweDAxNDAsIDB4MDE0NH0sCisgICAgezB4MDM4MSwgMHgwNjhkLCAweDAzMmQsIDB4MDBiNX0sIHsweDAyMzUsIDB4MDFiMSwgMHgwNjg5LCAweDAyYjV9LAorICAgIHsweDA1MjEsIDB4MDU5OSwgMHgwNDI5LCAweDAzYTl9LCB7MHgwMTM5LCAweDAyMzEsIDB4MDU4NSwgMHgwNjExfSwKKyAgICB7MHgwMTRjLCAweDAxNTAsIDB4MDE1NCwgMHgwMTU4fSwgezB4MDBhZCwgMHgwNjBkLCAweDA2ODUsIDB4MDEzMX0sCisgICAgezB4MDU5ZCwgMHgwNzBkLCAweDA2MTUsIDB4MDY5NX0sIHsweDAyMzksIDB4MDcxMSwgMHgwM2FkLCAweDAxYjl9LAorICAgIHsweDAyYjEsIDB4MDMzNSwgMHgwMzMxLCAweDAwMjF9LCB7MHgwMTYwLCAweDAxNjQsIDB4MDE2OCwgMHgwMTZjfSwKKyAgICB7MHgwNDJkLCAweDA2MDksIDB4MDRhNSwgMHgwMmI5fSwgezB4MDY5OSwgMHgwNTI5LCAweDAxM2QsIDB4MDVhMX0sCisgICAgezB4MDUyNSwgMHgwMzM5LCAweDA0YTksIDB4MDcxNX0sIHsweDA0YWQsIDB4MDBiOSwgMHgwNzA5LCAweDA2MTl9LAorICAgIHsweDAxNzQsIDB4MDE4OCwgMHgwMTljLCAweDAxY2N9LCB7MHgwMTc4LCAweDAxN2MsIDB4MDE4MCwgMHgwMTg0fSwKKyAgICB7MHgwNjA1LCAweDA0MzUsIDB4MDQwMSwgMHgwM2I1fSwgezB4MDYxZCwgMHgwM2IxLCAweDA2OWQsIDB4MDFiZH0sCisgICAgezB4MDBiMSwgMHgwNzE5LCAweDA3ODksIDB4MDJiZH0sIHsweDAyM2QsIDB4MDcwNSwgMHgwNWE1LCAweDA3OTF9LAorICAgIHsweDAxOGMsIDB4MDE5MCwgMHgwMTk0LCAweDAxOTh9LCB7MHgwM2I5LCAweDA2YTEsIDB4MDRiNSwgMHgwNjIxfSwKKyAgICB7MHgwNzk1LCAweDA3OGQsIDB4MDVhOSwgMHgwNTJkfSwgezB4MDQzMSwgMHgwMzNkLCAweDAzYmQsIDB4MDcyMX0sCisgICAgezB4MDBiZCwgMHgwNzFkLCAweDAwMjUsIDB4MDQ4MX0sIHsweDAxYTAsIDB4MDFhNCwgMHgwMWE4LCAweDAxYjh9LAorICAgIHsweDA2YTUsIDB4MDYyNSwgMHgwNGIxLCAweDA0Mzl9LCB7MHgwNmE5LCAweDA0YjksIDB4MDUzMSwgMHgwNzk5fSwKKyAgICB7MHgwNzlkLCAweDAxYWMsIDB4MDFiMCwgMHgwMWI0fSwgezB4MDcyNywgMHgwNzI3LCAweDA0M2YsIDB4MDQzZn0sCisgICAgezB4MDVhZiwgMHgwNWFmLCAweDA3MmYsIDB4MDcyZn0sIHsweDA3ODcsIDB4MDc4NywgMHgwNjJiLCAweDA2MmJ9LAorICAgIHsweDAxYmMsIDB4MDFjMCwgMHgwMWM0LCAweDAxYzh9LCB7MHgwNzJiLCAweDA3MmIsIDB4MDViNywgMHgwNWI3fSwKKyAgICB7MHgwNTM3LCAweDA1MzcsIDB4MDZhZiwgMHgwNmFmfSwgezB4MDYyZiwgMHgwNjJmLCAweDA3YTMsIDB4MDdhM30sCisgICAgezB4MDViYiwgMHgwNWJiLCAweDA2MzcsIDB4MDYzN30sIHsweDAxZDAsIDB4MDFlNCwgMHgwMWY4LCAweDAyMGN9LAorICAgIHsweDAxZDQsIDB4MDFkOCwgMHgwMWRjLCAweDAxZTB9LCB7MHgwNmIzLCAweDA2YjMsIDB4MDRiZiwgMHgwNGJmfSwKKyAgICB7MHgwNTNiLCAweDA1M2IsIDB4MDAyYiwgMHgwMDJifSwgezB4MDViMywgMHgwNWIzLCAweDA3YTcsIDB4MDdhN30sCisgICAgezB4MDUwMywgMHgwNTAzLCAweDA2MzMsIDB4MDYzM30sIHsweDAxZTgsIDB4MDFlYywgMHgwMWYwLCAweDAxZjR9LAorICAgIHsweDAwMmYsIDB4MDAyZiwgMHgwNzMzLCAweDA3MzN9LCB7MHgwN2FiLCAweDA3YWIsIDB4MDZiNywgMHgwNmI3fSwKKyAgICB7MHgwNjgzLCAweDA2ODMsIDB4MDYzYiwgMHgwNjNifSwgezB4MDUzZiwgMHgwNTNmLCAweDA1YmYsIDB4MDViZn0sCisgICAgezB4MDFmYywgMHgwMjAwLCAweDAyMDQsIDB4MDIwOH0sIHsweDA3YWYsIDB4MDdhZiwgMHgwNmJiLCAweDA2YmJ9LAorICAgIHsweDAwMzcsIDB4MDAzNywgMHgwNTgzLCAweDA1ODN9LCB7MHgwNzM3LCAweDA3MzcsIDB4MDYzZiwgMHgwNjNmfSwKKyAgICB7MHgwNmJmLCAweDA2YmYsIDB4MDdiMywgMHgwN2IzfSwgezB4MDIxMCwgMHgwMjE0LCAweDAyMTgsIDB4MDIxY30sCisgICAgezB4MDAzYiwgMHgwMDNiLCAweDA3M2IsIDB4MDczYn0sIHsweDA3YjcsIDB4MDdiNywgMHgwMDMzLCAweDAwMzN9LAorICAgIHsweDA3YmIsIDB4MDdiYiwgMHgwNzAxLCAweDA2MDF9LCB7MHgwNzNkLCAweDAwM2QsIDB4MDc4MSwgMHgwN2JkfSwKKyAgICB7MHgwMTE4LCAweDAxMTcsIDB4MDEwMCwgMHgwMTA5fSwgezB4MDVhNSwgMHgwNWExLCAweDA1YjcsIDB4MDUxM30sCisgICAgezB4MDhmOSwgMHgwOGZmLCAweDA4MjEsIDB4MDhmZn0sIHsweDA4NGYsIDB4MDhmZiwgMHgwOGJjLCAweDA4ZmZ9LAorICAgIHsweDA4MTUsIDB4MDhmZiwgMHgwODM3LCAweDA4ZmZ9LCB7MHgwODBkLCAweDA4ZmYsIDB4MDg1ZiwgMHgwOGZmfSwKKyAgICB7MHgwODRhLCAweDA4ZmYsIDB4MDg3ZCwgMHgwOGZmfSwgezB4MDhmZiwgMHgwOGZmLCAweDA4YTgsIDB4MDhmZn0sCisgICAgezB4MDgxNSwgMHgwOGZmLCAweDA4M2YsIDB4MDhmZn0sIHsweDA4MzAsIDB4MDhmZiwgMHgwODk0LCAweDA4ZmZ9LAorICAgIHsweDA4ZDQsIDB4MDhmZiwgMHgwODI1LCAweDA4ZmZ9LCB7MHgwOGVmLCAweDA4ZmYsIDB4MDgzZiwgMHgwOGZmfSwKKyAgICB7MHgwODA5LCAweDA4ZmYsIDB4MDhmYywgMHgwOGZmfSwgezB4MDg0MiwgMHgwOGZmLCAweDA4YjMsIDB4MDhmZn0sCisgICAgezB4MDcwZCwgMHgwN2E5LCAweDA2MGUsIDB4MDZlMn0sIHsweDA2YzcsIDB4MDZkMCwgMHgwNGIyLCAweDA0MDd9fTsKIAotCi1jb25zdCBVU0hPUlQgSHVmZm1hbkNvZGVCb29rX1NDTFs2NV1bNF0gPQotewotICB7MHgwMGYzLDB4MDBmMywweDAwMDQsMHgwMDA4fSwgezB4MDBlZiwweDAwZWYsMHgwMGY1LDB4MDBlOX0sIHsweDAwZjksMHgwMDBjLDB4MDAxMCwweDAwMTR9LCB7MHgwMGU3LDB4MDBlNywweDAwZmYsMHgwMGZmfSwKLSAgezB4MDBlMSwweDAxMDEsMHgwMGRkLDB4MDEwNX0sIHsweDAwMTgsMHgwMDFjLDB4MDAyMCwweDAwMjh9LCB7MHgwMTBiLDB4MDEwYiwweDAwZGIsMHgwMGRifSwgezB4MDEwZiwweDAxMGYsMHgwMGQ1LDB4MDExMX0sCi0gIHsweDAwZDEsMHgwMTE1LDB4MDBjZCwweDAwMjR9LCB7MHgwMTFiLDB4MDExYiwweDAwY2IsMHgwMGNifSwgezB4MDAyYywweDAwMzAsMHgwMDM0LDB4MDA0MH0sIHsweDAwYzcsMHgwMGM3LDB4MDExZiwweDAxMWZ9LAotICB7MHgwMTIxLDB4MDBjMSwweDAxMjUsMHgwMGJkfSwgezB4MDEyOSwweDAwYjksMHgwMDM4LDB4MDAzY30sIHsweDAxMzMsMHgwMTMzLDB4MDEyZiwweDAxMmZ9LCB7MHgwMTM3LDB4MDEzNywweDAxM2IsMHgwMTNifSwKLSAgezB4MDA0NCwweDAwNDgsMHgwMDRjLDB4MDA1OH0sIHsweDAwYjcsMHgwMGI3LDB4MDBhZiwweDAwYWZ9LCB7MHgwMGIxLDB4MDEzZCwweDAwYTksMHgwMGE1fSwgezB4MDE0MSwweDAwYTEsMHgwMDUwLDB4MDA1NH0sCi0gIHsweDAxNDcsMHgwMTQ3LDB4MDA5ZiwweDAwOWZ9LCB7MHgwMTRiLDB4MDE0YiwweDAwOWIsMHgwMDlifSwgezB4MDA1YywweDAwNjAsMHgwMDY0LDB4MDA3MH0sIHsweDAxNGYsMHgwMTRmLDB4MDA5NSwweDAwOGR9LAotICB7MHgwMTU1LDB4MDA4NSwweDAwOTEsMHgwMDg5fSwgezB4MDE1MSwweDAwODEsMHgwMDY4LDB4MDA2Y30sIHsweDAxNWYsMHgwMTVmLDB4MDE2NywweDAxNjd9LCB7MHgwMDdiLDB4MDA3YiwweDAwN2YsMHgwMDdmfSwKLSAgezB4MDA3NCwweDAwNzgsMHgwMDgwLDB4MDBiMH0sIHsweDAxNTksMHgwMDc1LDB4MDA2OSwweDAwNmR9LCB7MHgwMDcxLDB4MDA2MSwweDAxNjEsMHgwMDdjfSwgezB4MDA2NywweDAwNjcsMHgwMDViLDB4MDA1Yn0sCi0gIHsweDAwODQsMHgwMDg4LDB4MDA4YywweDAwOWN9LCB7MHgwMDVmLDB4MDA1ZiwweDAxNjksMHgwMDU1fSwgezB4MDA0ZCwweDAwMGQsMHgwMDA1LDB4MDAwOX0sIHsweDAwMDEsMHgwMDkwLDB4MDA5NCwweDAwOTh9LAotICB7MHgwMThiLDB4MDE4YiwweDAxOGYsMHgwMThmfSwgezB4MDE5MywweDAxOTMsMHgwMTk3LDB4MDE5N30sIHsweDAxOWIsMHgwMTliLDB4MDFkNywweDAxZDd9LCB7MHgwMGEwLDB4MDBhNCwweDAwYTgsMHgwMGFjfSwKLSAgezB4MDE4NywweDAxODcsMHgwMTZmLDB4MDE2Zn0sIHsweDAxNzMsMHgwMTczLDB4MDE3NywweDAxNzd9LCB7MHgwMTdiLDB4MDE3YiwweDAxN2YsMHgwMTdmfSwgezB4MDE4MywweDAxODMsMHgwMWEzLDB4MDFhM30sCi0gIHsweDAwYjQsMHgwMGM4LDB4MDBkYywweDAwZjB9LCB7MHgwMGI4LDB4MDBiYywweDAwYzAsMHgwMGM0fSwgezB4MDFiZiwweDAxYmYsMHgwMWMzLDB4MDFjM30sIHsweDAxYzcsMHgwMWM3LDB4MDFjYiwweDAxY2J9LAotICB7MHgwMWNmLDB4MDFjZiwweDAxZDMsMHgwMWQzfSwgezB4MDFiYiwweDAxYmIsMHgwMWE3LDB4MDFhN30sIHsweDAwY2MsMHgwMGQwLDB4MDBkNCwweDAwZDh9LCB7MHgwMWFiLDB4MDFhYiwweDAxYWYsMHgwMWFmfSwKLSAgezB4MDFiMywweDAxYjMsMHgwMWI3LDB4MDFiN30sIHsweDAxZGIsMHgwMWRiLDB4MDAxYiwweDAwMWJ9LCB7MHgwMDIzLDB4MDAyMywweDAwMjcsMHgwMDI3fSwgezB4MDBlMCwweDAwZTQsMHgwMGU4LDB4MDBlY30sCi0gIHsweDAwMmIsMHgwMDJiLDB4MDAxNywweDAwMTd9LCB7MHgwMTlmLDB4MDE5ZiwweDAxZTMsMHgwMWUzfSwgezB4MDFkZiwweDAxZGYsMHgwMDEzLDB4MDAxM30sIHsweDAwMWYsMHgwMDFmLDB4MDAzZiwweDAwM2Z9LAotICB7MHgwMGY0LDB4MDBmOCwweDAwZmMsMHgwMTAwfSwgezB4MDA0MywweDAwNDMsMHgwMDRiLDB4MDA0Yn0sIHsweDAwNTMsMHgwMDUzLDB4MDA0NywweDAwNDd9LCB7MHgwMDJmLDB4MDAyZiwweDAwMzMsMHgwMDMzfSwKLSAgezB4MDAzYiwweDAwM2IsMHgwMDM3LDB4MDAzN30KLX07Ci0KLQorY29uc3QgVVNIT1JUIEh1ZmZtYW5Db2RlQm9va19TQ0xbNjVdWzRdID0geworICAgIHsweDAwZjMsIDB4MDBmMywgMHgwMDA0LCAweDAwMDh9LCB7MHgwMGVmLCAweDAwZWYsIDB4MDBmNSwgMHgwMGU5fSwKKyAgICB7MHgwMGY5LCAweDAwMGMsIDB4MDAxMCwgMHgwMDE0fSwgezB4MDBlNywgMHgwMGU3LCAweDAwZmYsIDB4MDBmZn0sCisgICAgezB4MDBlMSwgMHgwMTAxLCAweDAwZGQsIDB4MDEwNX0sIHsweDAwMTgsIDB4MDAxYywgMHgwMDIwLCAweDAwMjh9LAorICAgIHsweDAxMGIsIDB4MDEwYiwgMHgwMGRiLCAweDAwZGJ9LCB7MHgwMTBmLCAweDAxMGYsIDB4MDBkNSwgMHgwMTExfSwKKyAgICB7MHgwMGQxLCAweDAxMTUsIDB4MDBjZCwgMHgwMDI0fSwgezB4MDExYiwgMHgwMTFiLCAweDAwY2IsIDB4MDBjYn0sCisgICAgezB4MDAyYywgMHgwMDMwLCAweDAwMzQsIDB4MDA0MH0sIHsweDAwYzcsIDB4MDBjNywgMHgwMTFmLCAweDAxMWZ9LAorICAgIHsweDAxMjEsIDB4MDBjMSwgMHgwMTI1LCAweDAwYmR9LCB7MHgwMTI5LCAweDAwYjksIDB4MDAzOCwgMHgwMDNjfSwKKyAgICB7MHgwMTMzLCAweDAxMzMsIDB4MDEyZiwgMHgwMTJmfSwgezB4MDEzNywgMHgwMTM3LCAweDAxM2IsIDB4MDEzYn0sCisgICAgezB4MDA0NCwgMHgwMDQ4LCAweDAwNGMsIDB4MDA1OH0sIHsweDAwYjcsIDB4MDBiNywgMHgwMGFmLCAweDAwYWZ9LAorICAgIHsweDAwYjEsIDB4MDEzZCwgMHgwMGE5LCAweDAwYTV9LCB7MHgwMTQxLCAweDAwYTEsIDB4MDA1MCwgMHgwMDU0fSwKKyAgICB7MHgwMTQ3LCAweDAxNDcsIDB4MDA5ZiwgMHgwMDlmfSwgezB4MDE0YiwgMHgwMTRiLCAweDAwOWIsIDB4MDA5Yn0sCisgICAgezB4MDA1YywgMHgwMDYwLCAweDAwNjQsIDB4MDA3MH0sIHsweDAxNGYsIDB4MDE0ZiwgMHgwMDk1LCAweDAwOGR9LAorICAgIHsweDAxNTUsIDB4MDA4NSwgMHgwMDkxLCAweDAwODl9LCB7MHgwMTUxLCAweDAwODEsIDB4MDA2OCwgMHgwMDZjfSwKKyAgICB7MHgwMTVmLCAweDAxNWYsIDB4MDE2NywgMHgwMTY3fSwgezB4MDA3YiwgMHgwMDdiLCAweDAwN2YsIDB4MDA3Zn0sCisgICAgezB4MDA3NCwgMHgwMDc4LCAweDAwODAsIDB4MDBiMH0sIHsweDAxNTksIDB4MDA3NSwgMHgwMDY5LCAweDAwNmR9LAorICAgIHsweDAwNzEsIDB4MDA2MSwgMHgwMTYxLCAweDAwN2N9LCB7MHgwMDY3LCAweDAwNjcsIDB4MDA1YiwgMHgwMDVifSwKKyAgICB7MHgwMDg0LCAweDAwODgsIDB4MDA4YywgMHgwMDljfSwgezB4MDA1ZiwgMHgwMDVmLCAweDAxNjksIDB4MDA1NX0sCisgICAgezB4MDA0ZCwgMHgwMDBkLCAweDAwMDUsIDB4MDAwOX0sIHsweDAwMDEsIDB4MDA5MCwgMHgwMDk0LCAweDAwOTh9LAorICAgIHsweDAxOGIsIDB4MDE4YiwgMHgwMThmLCAweDAxOGZ9LCB7MHgwMTkzLCAweDAxOTMsIDB4MDE5NywgMHgwMTk3fSwKKyAgICB7MHgwMTliLCAweDAxOWIsIDB4MDFkNywgMHgwMWQ3fSwgezB4MDBhMCwgMHgwMGE0LCAweDAwYTgsIDB4MDBhY30sCisgICAgezB4MDE4NywgMHgwMTg3LCAweDAxNmYsIDB4MDE2Zn0sIHsweDAxNzMsIDB4MDE3MywgMHgwMTc3LCAweDAxNzd9LAorICAgIHsweDAxN2IsIDB4MDE3YiwgMHgwMTdmLCAweDAxN2Z9LCB7MHgwMTgzLCAweDAxODMsIDB4MDFhMywgMHgwMWEzfSwKKyAgICB7MHgwMGI0LCAweDAwYzgsIDB4MDBkYywgMHgwMGYwfSwgezB4MDBiOCwgMHgwMGJjLCAweDAwYzAsIDB4MDBjNH0sCisgICAgezB4MDFiZiwgMHgwMWJmLCAweDAxYzMsIDB4MDFjM30sIHsweDAxYzcsIDB4MDFjNywgMHgwMWNiLCAweDAxY2J9LAorICAgIHsweDAxY2YsIDB4MDFjZiwgMHgwMWQzLCAweDAxZDN9LCB7MHgwMWJiLCAweDAxYmIsIDB4MDFhNywgMHgwMWE3fSwKKyAgICB7MHgwMGNjLCAweDAwZDAsIDB4MDBkNCwgMHgwMGQ4fSwgezB4MDFhYiwgMHgwMWFiLCAweDAxYWYsIDB4MDFhZn0sCisgICAgezB4MDFiMywgMHgwMWIzLCAweDAxYjcsIDB4MDFiN30sIHsweDAxZGIsIDB4MDFkYiwgMHgwMDFiLCAweDAwMWJ9LAorICAgIHsweDAwMjMsIDB4MDAyMywgMHgwMDI3LCAweDAwMjd9LCB7MHgwMGUwLCAweDAwZTQsIDB4MDBlOCwgMHgwMGVjfSwKKyAgICB7MHgwMDJiLCAweDAwMmIsIDB4MDAxNywgMHgwMDE3fSwgezB4MDE5ZiwgMHgwMTlmLCAweDAxZTMsIDB4MDFlM30sCisgICAgezB4MDFkZiwgMHgwMWRmLCAweDAwMTMsIDB4MDAxM30sIHsweDAwMWYsIDB4MDAxZiwgMHgwMDNmLCAweDAwM2Z9LAorICAgIHsweDAwZjQsIDB4MDBmOCwgMHgwMGZjLCAweDAxMDB9LCB7MHgwMDQzLCAweDAwNDMsIDB4MDA0YiwgMHgwMDRifSwKKyAgICB7MHgwMDUzLCAweDAwNTMsIDB4MDA0NywgMHgwMDQ3fSwgezB4MDAyZiwgMHgwMDJmLCAweDAwMzMsIDB4MDAzM30sCisgICAgezB4MDAzYiwgMHgwMDNiLCAweDAwMzcsIDB4MDAzN319OwogCiAvKiAuQ29kZUJvb2sgPSBIdWZmbWFuQ29kZUJvb2tfeCwgLkRpbWVuc2lvbiA9IDQsIC5udW1CaXRzID0gMiwgLk9mZnNldCA9ICAwICAqLwogY29uc3QgQ29kZUJvb2tEZXNjcmlwdGlvbiBBQUNjb2RlQm9va0Rlc2NyaXB0aW9uVGFibGVbMTNdID0gewotICB7IE5VTEwsIDAsIDAsICAwIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzEsICA0LCAyLCAxIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzIsICA0LCAyLCAxIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzMsICA0LCAyLCAwIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzQsICA0LCAyLCAwIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzUsICAyLCA0LCA0IH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzYsICAyLCA0LCA0IH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzcsICAyLCA0LCAwIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzgsICAyLCA0LCAwIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzksICAyLCA0LCAwIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzEwLCAyLCA0LCAwIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rXzExLCAyLCA1LCAwIH0sCi0gIHsgSHVmZm1hbkNvZGVCb29rX1NDTCwgMSwgOCwgNjAgfQotfTsKKyAgICB7TlVMTCwgMCwgMCwgMH0sCisgICAge0h1ZmZtYW5Db2RlQm9va18xLCA0LCAyLCAxfSwKKyAgICB7SHVmZm1hbkNvZGVCb29rXzIsIDQsIDIsIDF9LAorICAgIHtIdWZmbWFuQ29kZUJvb2tfMywgNCwgMiwgMH0sCisgICAge0h1ZmZtYW5Db2RlQm9va180LCA0LCAyLCAwfSwKKyAgICB7SHVmZm1hbkNvZGVCb29rXzUsIDIsIDQsIDR9LAorICAgIHtIdWZmbWFuQ29kZUJvb2tfNiwgMiwgNCwgNH0sCisgICAge0h1ZmZtYW5Db2RlQm9va183LCAyLCA0LCAwfSwKKyAgICB7SHVmZm1hbkNvZGVCb29rXzgsIDIsIDQsIDB9LAorICAgIHtIdWZmbWFuQ29kZUJvb2tfOSwgMiwgNCwgMH0sCisgICAge0h1ZmZtYW5Db2RlQm9va18xMCwgMiwgNCwgMH0sCisgICAge0h1ZmZtYW5Db2RlQm9va18xMSwgMiwgNSwgMH0sCisgICAge0h1ZmZtYW5Db2RlQm9va19TQ0wsIDEsIDgsIDYwfX07CiAKLWNvbnN0IENvZGVCb29rRGVzY3JpcHRpb24gQUFDY29kZUJvb2tEZXNjcmlwdGlvblNDTCA9IHsgSHVmZm1hbkNvZGVCb29rX1NDTCwgMSwgOCwgNjAgfTsKK2NvbnN0IENvZGVCb29rRGVzY3JpcHRpb24gQUFDY29kZUJvb2tEZXNjcmlwdGlvblNDTCA9IHtIdWZmbWFuQ29kZUJvb2tfU0NMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsIDYwfTsKIAotCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogIFRhYmxlOiBIdWZmVHJlZTQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YSAoQ29kZWJvb2sgMSkuICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlICogNCkgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisvKiAgVGFibGU6IEh1ZmZUcmVlNDEgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEKKyAqIChDb2RlYm9vayAxKS4gICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIzIGFuZCAxMSBub3QgdXNlZCAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlKSBvciAoaW5kZXggdmFsdWUgKgorICogNCkgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGlucHV0OiAgICAgICAgICBjb2Rld29yZCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAvKiBIdWZmVHJlZSAqLwotY29uc3QgVUlOVCBhSHVmZlRyZWU0MVs4MF0gPSB7MHg0YTAwMDEsMHgwMjYwMDIsMHgwMTMwMDMsMHgwMjEwMDQsMHgwMWMwMDUsMHgwMGIwMDYsMHgwMTAwMDcsMHgwMTkwMDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwOTAwZSwweDAwYTAzYSwweDQwMDUyOCwweDAwYzAzNywweDAwZDAzYiwweDQ1NDQwNCwweDAwZjA0YywweDQ0ODQwOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE3MDExLDB4MDEyMDJlLDB4NDJjNDBjLDB4MDM0MDE0LDB4MDE1MDJjLDB4MDE2MDQ5LDB4NDEwNDcwLDB4MDE4MDRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MTQ0MjQsMHgwMzIwMWEsMHgwMjAwMWIsMHg1MjA0MTgsMHgwMmYwMWQsMHgwMmEwMWUsMHgwMWYwNGQsMHg0MWM0NzQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU0MDQyMCwweDAyMjAyNCwweDA0YTAyMywweDQyODUxMCwweDAyNTAyOSwweDQzMDUwOCwweDAyNzAzYywweDAyODA0NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTBjNDM0LDB4NDM4NDc4LDB4MDQ4MDJiLDB4NDY0NDNjLDB4MDJkMDNlLDB4NDQwNGIwLDB4NDQ0NTFjLDB4MDMwMDNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMzEwNGIsMHg1MjQ0NGMsMHgwMzMwMzksMHg0ZjA0NTAsMHgwMzUwNDEsMHgwMzYwNDYsMHg0ZTg0NTgsMHgwNGYwMzgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ1YzUzYywweDQ2MDRlMCwweDRmODQ2OCwweDQ2YzRkNCwweDA0NTAzZCwweDRhYzQ3YywweDUxODQ4MCwweDA0MzA0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDg0NGRjLDB4MDQyMDQ0LDB4NDg4NGE4LDB4NGJjNDhjLDB4NTMwNDkwLDB4NGE0NDk0LDB4NDk4NGI4LDB4NDljNGM0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDQ0YjQsMHg1MDA0YzAsMHg0ZDA0YzgsMHg0ZjQ0Y2MsMHg0ZDg1MzgsMHg0ZWM0ZTQsMHg1MmM0ZmMsMHg1MTQ1MzR9OworY29uc3QgVUlOVCBhSHVmZlRyZWU0MVs4MF0gPSB7CisgICAgMHg0YTAwMDEsIDB4MDI2MDAyLCAweDAxMzAwMywgMHgwMjEwMDQsIDB4MDFjMDA1LCAweDAwYjAwNiwgMHgwMTAwMDcsCisgICAgMHgwMTkwMDgsIDB4MDA5MDBlLCAweDAwYTAzYSwgMHg0MDA1MjgsIDB4MDBjMDM3LCAweDAwZDAzYiwgMHg0NTQ0MDQsCisgICAgMHgwMGYwNGMsIDB4NDQ4NDA4LCAweDAxNzAxMSwgMHgwMTIwMmUsIDB4NDJjNDBjLCAweDAzNDAxNCwgMHgwMTUwMmMsCisgICAgMHgwMTYwNDksIDB4NDEwNDcwLCAweDAxODA0ZSwgMHg0MTQ0MjQsIDB4MDMyMDFhLCAweDAyMDAxYiwgMHg1MjA0MTgsCisgICAgMHgwMmYwMWQsIDB4MDJhMDFlLCAweDAxZjA0ZCwgMHg0MWM0NzQsIDB4NTQwNDIwLCAweDAyMjAyNCwgMHgwNGEwMjMsCisgICAgMHg0Mjg1MTAsIDB4MDI1MDI5LCAweDQzMDUwOCwgMHgwMjcwM2MsIDB4MDI4MDQ3LCAweDUwYzQzNCwgMHg0Mzg0NzgsCisgICAgMHgwNDgwMmIsIDB4NDY0NDNjLCAweDAyZDAzZSwgMHg0NDA0YjAsIDB4NDQ0NTFjLCAweDAzMDAzZiwgMHgwMzEwNGIsCisgICAgMHg1MjQ0NGMsIDB4MDMzMDM5LCAweDRmMDQ1MCwgMHgwMzUwNDEsIDB4MDM2MDQ2LCAweDRlODQ1OCwgMHgwNGYwMzgsCisgICAgMHg0NWM1M2MsIDB4NDYwNGUwLCAweDRmODQ2OCwgMHg0NmM0ZDQsIDB4MDQ1MDNkLCAweDRhYzQ3YywgMHg1MTg0ODAsCisgICAgMHgwNDMwNDAsIDB4NDg0NGRjLCAweDA0MjA0NCwgMHg0ODg0YTgsIDB4NGJjNDhjLCAweDUzMDQ5MCwgMHg0YTQ0OTQsCisgICAgMHg0OTg0YjgsIDB4NDljNGM0LCAweDUwNDRiNCwgMHg1MDA0YzAsIDB4NGQwNGM4LCAweDRmNDRjYywgMHg0ZDg1MzgsCisgICAgMHg0ZWM0ZTQsIDB4NTJjNGZjLCAweDUxNDUzNH07CiAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogIFRhYmxlOiBIdWZmVHJlZTQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YSAoQ29kZWJvb2sgMikuICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlICogNCkgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWNvbnN0IFVJTlQgYUh1ZmZUcmVlNDJbODBdID0gezB4MDI2MDAxLDB4MDE0MDAyLDB4MDA5MDAzLDB4MDEwMDA0LDB4MDFkMDA1LDB4MDA2MDBkLDB4MDA3MDE4LDB4NDUwMDA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZTA0MDAsMHgwMmUwMGEsMHgwMzkwMGIsMHgwM2QwMGMsMHg0M2M0MDQsMHgwMWIwMGUsMHgwMGYwNGYsMHg0ZDg0MDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMzAxMSwweDAxMjAzYiwweDAxYTAxMywweDQxNDQwYywweDAxNTAyMCwweDAxNjA0MCwweDAyNTAxNywweDUwMDQxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDM4MDE5LDB4NTQwNDE4LDB4NDFjNDQ0LDB4MDJkMDFjLDB4NDIwNTIwLDB4MDFlMDQyLDB4MDM3MDFmLDB4NDI0NGNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMmEwMjEsMHgwMjIwNGMsMHg0Nzg0MjgsMHgwMjQwMzEsMHg0MmM0ZGMsMHg0MzA0ZTgsMHgwMjcwMzMsMHg0YTAwMjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDUwYzAyOSwweDQzNDRhNCwweDAyYzAyYiwweDQ3MDQzOCwweDQ0MDRjOCwweDRmODQ0OCwweDA0OTAyZiwweDA0YjAzMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDRjNDg0LDB4NTI0MDMyLDB4NGVjNDU0LDB4MDNlMDM0LDB4MDM1MDQ2LDB4NGM0MDM2LDB4NDg4NDU4LDB4NGQ0NDVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NjA0NjgsMHgwNGUwM2EsMHg1MWM0NjQsMHgwM2MwNGEsMHg0NmM1MTQsMHg0NzQ1M2MsMHgwNDUwM2YsMHg0N2M0YWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0NDA0MSwweDUxMDQ4MCwweDA0MzA0ZCwweDRlNDQ4YywweDQ5MDUxOCwweDQ5NDQ5YywweDA0ODA0NywweDRjMDQ5OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGI4NGE4LDB4NGIwNTA4LDB4NGZjNGI0LDB4NGJjNTA0LDB4NTMwNGQwLDB4NTM0NGYwLDB4NGY0NTJjLDB4NTI4NTM4fTsKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisvKiAgVGFibGU6IEh1ZmZUcmVlNDIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEKKyAqIChDb2RlYm9vayAyKS4gICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIzIGFuZCAxMSBub3QgdXNlZCAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlKSBvciAoaW5kZXggdmFsdWUgKgorICogNCkgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGlucHV0OiAgICAgICAgICBjb2Rld29yZCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitjb25zdCBVSU5UIGFIdWZmVHJlZTQyWzgwXSA9IHsKKyAgICAweDAyNjAwMSwgMHgwMTQwMDIsIDB4MDA5MDAzLCAweDAxMDAwNCwgMHgwMWQwMDUsIDB4MDA2MDBkLCAweDAwNzAxOCwKKyAgICAweDQ1MDAwOCwgMHg0ZTA0MDAsIDB4MDJlMDBhLCAweDAzOTAwYiwgMHgwM2QwMGMsIDB4NDNjNDA0LCAweDAxYjAwZSwKKyAgICAweDAwZjA0ZiwgMHg0ZDg0MDgsIDB4MDIzMDExLCAweDAxMjAzYiwgMHgwMWEwMTMsIDB4NDE0NDBjLCAweDAxNTAyMCwKKyAgICAweDAxNjA0MCwgMHgwMjUwMTcsIDB4NTAwNDEwLCAweDAzODAxOSwgMHg1NDA0MTgsIDB4NDFjNDQ0LCAweDAyZDAxYywKKyAgICAweDQyMDUyMCwgMHgwMWUwNDIsIDB4MDM3MDFmLCAweDQyNDRjYywgMHgwMmEwMjEsIDB4MDIyMDRjLCAweDQ3ODQyOCwKKyAgICAweDAyNDAzMSwgMHg0MmM0ZGMsIDB4NDMwNGU4LCAweDAyNzAzMywgMHg0YTAwMjgsIDB4NTBjMDI5LCAweDQzNDRhNCwKKyAgICAweDAyYzAyYiwgMHg0NzA0MzgsIDB4NDQwNGM4LCAweDRmODQ0OCwgMHgwNDkwMmYsIDB4MDRiMDMwLCAweDQ0YzQ4NCwKKyAgICAweDUyNDAzMiwgMHg0ZWM0NTQsIDB4MDNlMDM0LCAweDAzNTA0NiwgMHg0YzQwMzYsIDB4NDg4NDU4LCAweDRkNDQ1YywKKyAgICAweDQ2MDQ2OCwgMHgwNGUwM2EsIDB4NTFjNDY0LCAweDAzYzA0YSwgMHg0NmM1MTQsIDB4NDc0NTNjLCAweDA0NTAzZiwKKyAgICAweDQ3YzRhYywgMHgwNDQwNDEsIDB4NTEwNDgwLCAweDA0MzA0ZCwgMHg0ZTQ0OGMsIDB4NDkwNTE4LCAweDQ5NDQ5YywKKyAgICAweDA0ODA0NywgMHg0YzA0OTgsIDB4NGI4NGE4LCAweDRiMDUwOCwgMHg0ZmM0YjQsIDB4NGJjNTA0LCAweDUzMDRkMCwKKyAgICAweDUzNDRmMCwgMHg0ZjQ1MmMsIDB4NTI4NTM4fTsKIAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAgVGFibGU6IEh1ZmZUcmVlNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgZGVzY3JpcHRpb246ICAgIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGRlY29kZSB0cmVlIGZvciBzcGVjdHJhbCBkYXRhIChDb2RlYm9vayAzKS4gICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIzIGFuZCAxMSBub3QgdXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjIgYW5kIDEwIGRldGVybWluZSBlbmQgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlKSBvciAoaW5kZXggdmFsdWUgKiA0KSAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGlucHV0OiAgICAgICAgICBjb2Rld29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBvdXRwdXQ6ICAgICAgICAgaW5kZXggKiA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotY29uc3QgVUlOVCBhSHVmZlRyZWU0M1s4MF0gPSB7MHg0MDAwMDEsMHgwMDIwMDQsMHgwMDMwMGEsMHg0NmM0MDQsMHgwMGIwMDUsMHgwMDYwMGQsMHgwMzQwMDcsMHgwMzcwMDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ5NDAwOSwweDRkODQwOCwweDQyNDQwYywweDAwYzAxYiwweDQ5MDQxMCwweDAwZTAxNiwweDAwZjAxMSwweDAxMDAxNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDE0NGZjLDB4MDEyMDFkLDB4MDIwMDEzLDB4NTA4NDE4LDB4NGMwMDE1LDB4NDFjNDQwLDB4MDIyMDE3LDB4MDE4MDI2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTkwMzUsMHgwMzgwMWEsMHg0MjA0NDQsMHgwMWMwMWYsMHg0MzA0MjgsMHgwMjEwMWUsMHg0NDg0MmMsMHg0Nzg0MzQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRiNDQzOCwweDQ1NDQzYywweDAyYzAyMywweDAzOTAyNCwweDAyNTAzZiwweDQ4ODQ0YywweDAzMDAyNywweDAyZTAyOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMyMDI5LDB4MDJhMDQxLDB4NGQ0MDJiLDB4NDUwNGYwLDB4MDQzMDJkLDB4NDU4NGE4LDB4MDJmMDNiLDB4NDYwNDVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMzEwM2QsMHg0NjQwNDYsMHgwMzMwNDQsMHg0Njg1M2MsMHg0NzA0OWMsMHgwNDUwMzYsMHg0NzQ0ZGMsMHg0YTA0N2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDUwMDQ4MCwweDRhYzAzYSwweDRiODQ4NCwweDAzYzA0ZSwweDQ4YzUyNCwweDAzZTA0MCwweDQ5ODRlOCwweDUwYzRhNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGIwNTMwLDB4MDQyMDQ3LDB4NGJjMDRiLDB4NGU0NGM0LDB4NTE4NGM4LDB4NTJjNGNjLDB4NTIwNGQwLDB4MDRkMDQ4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGEwNDksMHg0ZTAwNGMsMHg1MWM0ZWMsMHg0ZjQ1MTAsMHg1Mjg0ZjgsMHg1MDQwNGYsMHg1MTQ1MzgsMHg1NDA1MzR9OworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKy8qICBUYWJsZTogSHVmZlRyZWU0MyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YQorICogKENvZGVib29rIDMpLiAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqCisgKiA0KSAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogNCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2NvbnN0IFVJTlQgYUh1ZmZUcmVlNDNbODBdID0geworICAgIDB4NDAwMDAxLCAweDAwMjAwNCwgMHgwMDMwMGEsIDB4NDZjNDA0LCAweDAwYjAwNSwgMHgwMDYwMGQsIDB4MDM0MDA3LAorICAgIDB4MDM3MDA4LCAweDQ5NDAwOSwgMHg0ZDg0MDgsIDB4NDI0NDBjLCAweDAwYzAxYiwgMHg0OTA0MTAsIDB4MDBlMDE2LAorICAgIDB4MDBmMDExLCAweDAxMDAxNCwgMHg0MTQ0ZmMsIDB4MDEyMDFkLCAweDAyMDAxMywgMHg1MDg0MTgsIDB4NGMwMDE1LAorICAgIDB4NDFjNDQwLCAweDAyMjAxNywgMHgwMTgwMjYsIDB4MDE5MDM1LCAweDAzODAxYSwgMHg0MjA0NDQsIDB4MDFjMDFmLAorICAgIDB4NDMwNDI4LCAweDAyMTAxZSwgMHg0NDg0MmMsIDB4NDc4NDM0LCAweDRiNDQzOCwgMHg0NTQ0M2MsIDB4MDJjMDIzLAorICAgIDB4MDM5MDI0LCAweDAyNTAzZiwgMHg0ODg0NGMsIDB4MDMwMDI3LCAweDAyZTAyOCwgMHgwMzIwMjksIDB4MDJhMDQxLAorICAgIDB4NGQ0MDJiLCAweDQ1MDRmMCwgMHgwNDMwMmQsIDB4NDU4NGE4LCAweDAyZjAzYiwgMHg0NjA0NWMsIDB4MDMxMDNkLAorICAgIDB4NDY0MDQ2LCAweDAzMzA0NCwgMHg0Njg1M2MsIDB4NDcwNDljLCAweDA0NTAzNiwgMHg0NzQ0ZGMsIDB4NGEwNDdjLAorICAgIDB4NTAwNDgwLCAweDRhYzAzYSwgMHg0Yjg0ODQsIDB4MDNjMDRlLCAweDQ4YzUyNCwgMHgwM2UwNDAsIDB4NDk4NGU4LAorICAgIDB4NTBjNGE0LCAweDRiMDUzMCwgMHgwNDIwNDcsIDB4NGJjMDRiLCAweDRlNDRjNCwgMHg1MTg0YzgsIDB4NTJjNGNjLAorICAgIDB4NTIwNGQwLCAweDA0ZDA0OCwgMHgwNGEwNDksIDB4NGUwMDRjLCAweDUxYzRlYywgMHg0ZjQ1MTAsIDB4NTI4NGY4LAorICAgIDB4NTA0MDRmLCAweDUxNDUzOCwgMHg1NDA1MzR9OwogCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICBUYWJsZTogSHVmZlRyZWU0NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEgKENvZGVib29rIDQpLiAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqIDQpICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1jb25zdCBVSU5UIGFIdWZmVHJlZTQ0WzgwXSA9IHsweDAwMTAwNCwweDAyMDAwMiwweDAzNjAwMywweDQ5MDQwMCwweDAwNTAwOCwweDAxMDAwNiwweDAxZjAwNywweDQwNDQyOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBlMDA5LDB4MDExMDBhLDB4MDBiMDE4LDB4MDE2MDBjLDB4MDM3MDBkLDB4NDA4MDE1LDB4MDBmMDNlLDB4NDBjNDI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MTA0NzgsMHgwMjIwMTIsMHgwMzgwMTMsMHgwMWUwMTQsMHg0NTQ0MTQsMHg0NDg0MTgsMHgwMjUwMTcsMHg0NzQ0MWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzMDAxOSwweDAyNjAxYSwweDAyZDAxYiwweDAxYzAzNCwweDAxZDAyOSwweDQyMDRmMCwweDRkYzQyYywweDQ3MDQzMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxMDNjLDB4NGEwNDM0LDB4MDIzMDJhLDB4NDQwMDI0LDB4NDM4NGE4LDB4NDNjNDRjLDB4MDI3MDNhLDB4MDI4MDJjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NDQ1MjQsMHg0NTA0ZTAsMHgwMmIwM2QsMHg0NTg0ODAsMHg0NWM0ZjQsMHgwNGIwMmUsMHgwNGYwMmYsMHg0NjA1MjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MjAzMSwweDA0ODAzMiwweDA0OTAzMywweDUxNDQ2NCwweDAzNTA0YywweDU0MDQ2OCwweDQ3YzQ2YywweDQ4NDRkOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDM5MDQ0LDB4NDg4NGZjLDB4MDNiMDQ1LDB4NDhjNTNjLDB4NDk0NDljLDB4NGI4NDk4LDB4MDNmMDQ2LDB4MDQxMDQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YzQ0YTQsMHg1MGM0YWMsMHgwNGEwNDMsMHg1MTg0YjAsMHg0ZTQ0YjQsMHg0YmM0ZWMsMHgwNGUwNDcsMHg0YzA0ZTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRjODUxMCwweDRjYzUyYywweDRkMDUzMCwweDUwNDRkNCwweDUzODA0ZCwweDUyODRmOCwweDUwODUwMCwweDUxYzUzNH07CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworLyogIFRhYmxlOiBIdWZmVHJlZTQ0ICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgZGVzY3JpcHRpb246ICAgIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGRlY29kZSB0cmVlIGZvciBzcGVjdHJhbCBkYXRhCisgKiAoQ29kZWJvb2sgNCkuICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjIgYW5kIDEwIGRldGVybWluZSBlbmQgdmFsdWUgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlICoKKyAqIDQpICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBvdXRwdXQ6ICAgICAgICAgaW5kZXggKiA0ICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworY29uc3QgVUlOVCBhSHVmZlRyZWU0NFs4MF0gPSB7CisgICAgMHgwMDEwMDQsIDB4MDIwMDAyLCAweDAzNjAwMywgMHg0OTA0MDAsIDB4MDA1MDA4LCAweDAxMDAwNiwgMHgwMWYwMDcsCisgICAgMHg0MDQ0MjgsIDB4MDBlMDA5LCAweDAxMTAwYSwgMHgwMGIwMTgsIDB4MDE2MDBjLCAweDAzNzAwZCwgMHg0MDgwMTUsCisgICAgMHgwMGYwM2UsIDB4NDBjNDI0LCAweDQxMDQ3OCwgMHgwMjIwMTIsIDB4MDM4MDEzLCAweDAxZTAxNCwgMHg0NTQ0MTQsCisgICAgMHg0NDg0MTgsIDB4MDI1MDE3LCAweDQ3NDQxYywgMHgwMzAwMTksIDB4MDI2MDFhLCAweDAyZDAxYiwgMHgwMWMwMzQsCisgICAgMHgwMWQwMjksIDB4NDIwNGYwLCAweDRkYzQyYywgMHg0NzA0MzAsIDB4MDIxMDNjLCAweDRhMDQzNCwgMHgwMjMwMmEsCisgICAgMHg0NDAwMjQsIDB4NDM4NGE4LCAweDQzYzQ0YywgMHgwMjcwM2EsIDB4MDI4MDJjLCAweDQ0NDUyNCwgMHg0NTA0ZTAsCisgICAgMHgwMmIwM2QsIDB4NDU4NDgwLCAweDQ1YzRmNCwgMHgwNGIwMmUsIDB4MDRmMDJmLCAweDQ2MDUyMCwgMHgwNDIwMzEsCisgICAgMHgwNDgwMzIsIDB4MDQ5MDMzLCAweDUxNDQ2NCwgMHgwMzUwNGMsIDB4NTQwNDY4LCAweDQ3YzQ2YywgMHg0ODQ0ZDgsCisgICAgMHgwMzkwNDQsIDB4NDg4NGZjLCAweDAzYjA0NSwgMHg0OGM1M2MsIDB4NDk0NDljLCAweDRiODQ5OCwgMHgwM2YwNDYsCisgICAgMHgwNDEwNDAsIDB4NGM0NGE0LCAweDUwYzRhYywgMHgwNGEwNDMsIDB4NTE4NGIwLCAweDRlNDRiNCwgMHg0YmM0ZWMsCisgICAgMHgwNGUwNDcsIDB4NGMwNGU4LCAweDRjODUxMCwgMHg0Y2M1MmMsIDB4NGQwNTMwLCAweDUwNDRkNCwgMHg1MzgwNGQsCisgICAgMHg1Mjg0ZjgsIDB4NTA4NTAwLCAweDUxYzUzNH07CiAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogIFRhYmxlOiBIdWZmVHJlZTIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YSAoQ29kZWJvb2sgNSkuICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlICogMikgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWNvbnN0IFVJTlQgYUh1ZmZUcmVlMjFbODBdID0gezB4NDUwMDAxLDB4MDQ0MDAyLDB4MDQyMDAzLDB4MDM1MDA0LDB4MDI2MDA1LDB4MDIyMDA2LDB4MDEzMDA3LDB4MDEwMDA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGQwMDksMHgwMWMwMGEsMHgwMWYwMGIsMHgwMWUwMGMsMHg0YTA0MDAsMHgwMWIwMGUsMHgwMzIwMGYsMHg0N2U0MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAxMSwweDAxMjA0ZCwweDQwNDQ5YywweDAxNzAxNCwweDAxNTAxOSwweDAxNjAzZiwweDQwNjQ1OCwweDAxODA0ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDQ4NDA4LDB4MDQ5MDFhLDB4NDBhNDVhLDB4NDhjNDBjLDB4MDFkMDMxLDB4NDBlNDhlLDB4NDkwNDEwLDB4NDkyNDEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjEwMzAsMHg0ODA0MTQsMHgwMzMwMjMsMHgwMjQwMmUsMHgwMjUwM2UsMHg0MTY0ODIsMHgwMmEwMjcsMHgwMjgwMmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyOTA0MCwweDQxODQ2OCwweDAyYjA0YSwweDQxYTQ4NiwweDAyZDA0OCwweDQxYzQ4NCwweDA0ZTAyZiwweDQxZTQyNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDIwNDM0LDB4NDIyNDllLDB4NDI0NDk0LDB4MDNkMDM0LDB4NDI4NDcwLDB4MDM5MDM2LDB4MDM3MDNiLDB4MDM4MDQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MmE0NzYsMHgwM2EwNGIsMHg0MmM0NTQsMHgwM2MwNDcsMHg0MmU0NzIsMHg0MzA0NzgsMHg0MzI0NmUsMHg0OTY0MzYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ4ODQzOCwweDQzYTQ2NiwweDA0NjA0MywweDQzYzQ2NCwweDA0NTA0YywweDQzZTQ2MiwweDQ2MDQ0MCwweDQ0MjQ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDVjNDQ0LDB4NDZhNDQ2LDB4NDRhNDU2LDB4NDc0NDRjLDB4NDUyNDRlLDB4NDZjNDdjLDB4NDhhNDdhLDB4NDlhNDk4fTsKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisvKiAgVGFibGU6IEh1ZmZUcmVlMjEgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEKKyAqIChDb2RlYm9vayA1KS4gICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIzIGFuZCAxMSBub3QgdXNlZCAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlKSBvciAoaW5kZXggdmFsdWUgKgorICogMikgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGlucHV0OiAgICAgICAgICBjb2Rld29yZCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitjb25zdCBVSU5UIGFIdWZmVHJlZTIxWzgwXSA9IHsKKyAgICAweDQ1MDAwMSwgMHgwNDQwMDIsIDB4MDQyMDAzLCAweDAzNTAwNCwgMHgwMjYwMDUsIDB4MDIyMDA2LCAweDAxMzAwNywKKyAgICAweDAxMDAwOCwgMHgwMGQwMDksIDB4MDFjMDBhLCAweDAxZjAwYiwgMHgwMWUwMGMsIDB4NGEwNDAwLCAweDAxYjAwZSwKKyAgICAweDAzMjAwZiwgMHg0N2U0MDIsIDB4MDIwMDExLCAweDAxMjA0ZCwgMHg0MDQ0OWMsIDB4MDE3MDE0LCAweDAxNTAxOSwKKyAgICAweDAxNjAzZiwgMHg0MDY0NTgsIDB4MDE4MDRmLCAweDQ0ODQwOCwgMHgwNDkwMWEsIDB4NDBhNDVhLCAweDQ4YzQwYywKKyAgICAweDAxZDAzMSwgMHg0MGU0OGUsIDB4NDkwNDEwLCAweDQ5MjQxMiwgMHgwMjEwMzAsIDB4NDgwNDE0LCAweDAzMzAyMywKKyAgICAweDAyNDAyZSwgMHgwMjUwM2UsIDB4NDE2NDgyLCAweDAyYTAyNywgMHgwMjgwMmMsIDB4MDI5MDQwLCAweDQxODQ2OCwKKyAgICAweDAyYjA0YSwgMHg0MWE0ODYsIDB4MDJkMDQ4LCAweDQxYzQ4NCwgMHgwNGUwMmYsIDB4NDFlNDI2LCAweDQyMDQzNCwKKyAgICAweDQyMjQ5ZSwgMHg0MjQ0OTQsIDB4MDNkMDM0LCAweDQyODQ3MCwgMHgwMzkwMzYsIDB4MDM3MDNiLCAweDAzODA0MSwKKyAgICAweDQyYTQ3NiwgMHgwM2EwNGIsIDB4NDJjNDU0LCAweDAzYzA0NywgMHg0MmU0NzIsIDB4NDMwNDc4LCAweDQzMjQ2ZSwKKyAgICAweDQ5NjQzNiwgMHg0ODg0MzgsIDB4NDNhNDY2LCAweDA0NjA0MywgMHg0M2M0NjQsIDB4MDQ1MDRjLCAweDQzZTQ2MiwKKyAgICAweDQ2MDQ0MCwgMHg0NDI0NWUsIDB4NDVjNDQ0LCAweDQ2YTQ0NiwgMHg0NGE0NTYsIDB4NDc0NDRjLCAweDQ1MjQ0ZSwKKyAgICAweDQ2YzQ3YywgMHg0OGE0N2EsIDB4NDlhNDk4fTsKIAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAgVGFibGU6IEh1ZmZUcmVlMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgZGVzY3JpcHRpb246ICAgIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGRlY29kZSB0cmVlIGZvciBzcGVjdHJhbCBkYXRhIChDb2RlYm9vayA2KS4gICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIzIGFuZCAxMSBub3QgdXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjIgYW5kIDEwIGRldGVybWluZSBlbmQgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlKSBvciAoaW5kZXggdmFsdWUgKiAyKSAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGlucHV0OiAgICAgICAgICBjb2Rld29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBvdXRwdXQ6ICAgICAgICAgaW5kZXggKiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotY29uc3QgVUlOVCBhSHVmZlRyZWUyMls4MF0gPSB7MHgwM2MwMDEsMHgwMmYwMDIsMHgwMjAwMDMsMHgwMWMwMDQsMHgwMGYwMDUsMHgwMGMwMDYsMHgwMTYwMDcsMHgwNGQwMDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwYjAwOSwweDAxNTAwYSwweDQwMDQ5MCwweDQwZTQwMiwweDAwZDAxMywweDAwZTAyYSwweDQwYzQwNCwweDAxOTAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDExMDQxLDB4MDM4MDEyLDB4NDBhNDA2LDB4MDE0MDM3LDB4NDA4NDljLDB4NGEwNDEwLDB4MDRhMDE3LDB4NDU4MDE4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MTI0MjIsMHgwMjgwMWEsMHgwMWIwMjksMHg0ODA0MTQsMHgwMjQwMWQsMHgwMWUwMmIsMHg0OGEwMWYsMHg0MTY0MzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyZDAyMSwweDAyNjAyMiwweDAyMzAzOSwweDQxODQ2OCwweDAyNTA0MywweDQ4NjQxYSwweDAyNzA0MCwweDQxYzQ4OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDFlNDhjLDB4NDIwNDVhLDB4NDdjNDI0LDB4MDRjMDJjLDB4NDZlNDI2LDB4MDM2MDJlLDB4NDI4NDc4LDB4MDMwMDMzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0M2MwMzEsMHgwNGIwMzIsMHg0MmU0MmEsMHgwMzQwM2EsMHgwMzUwNDgsMHg0MmM0NDIsMHg0NzA0MzAsMHg0OTQ0MzQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQzNjQ5YSwweDQ1YzQzOCwweDA0NDAzYiwweDQzYTQ1NCwweDA0NTAzZCwweDAzZTAzZiwweDQzZTQ2NCwweDQ0MDQ2MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDg0NDQ0LDB4MDQ5MDQyLDB4NDQ2NDQ4LDB4NDRhNDU2LDB4NDY2NDRjLDB4MDQ3MDQ2LDB4NDRlNDUyLDB4NDUwNDYyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NzQ0NWUsMHg0NmE0OTYsMHg0OTg0NmMsMHg0NzI0NzYsMHg0N2E0ODIsMHgwNGUwNGYsMHg0N2U0OTIsMHg0OGU0OWV9OworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKy8qICBUYWJsZTogSHVmZlRyZWUyMiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YQorICogKENvZGVib29rIDYpLiAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqCisgKiAyKSAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogMiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2NvbnN0IFVJTlQgYUh1ZmZUcmVlMjJbODBdID0geworICAgIDB4MDNjMDAxLCAweDAyZjAwMiwgMHgwMjAwMDMsIDB4MDFjMDA0LCAweDAwZjAwNSwgMHgwMGMwMDYsIDB4MDE2MDA3LAorICAgIDB4MDRkMDA4LCAweDAwYjAwOSwgMHgwMTUwMGEsIDB4NDAwNDkwLCAweDQwZTQwMiwgMHgwMGQwMTMsIDB4MDBlMDJhLAorICAgIDB4NDBjNDA0LCAweDAxOTAxMCwgMHgwMTEwNDEsIDB4MDM4MDEyLCAweDQwYTQwNiwgMHgwMTQwMzcsIDB4NDA4NDljLAorICAgIDB4NGEwNDEwLCAweDA0YTAxNywgMHg0NTgwMTgsIDB4NDEyNDIyLCAweDAyODAxYSwgMHgwMWIwMjksIDB4NDgwNDE0LAorICAgIDB4MDI0MDFkLCAweDAxZTAyYiwgMHg0OGEwMWYsIDB4NDE2NDMyLCAweDAyZDAyMSwgMHgwMjYwMjIsIDB4MDIzMDM5LAorICAgIDB4NDE4NDY4LCAweDAyNTA0MywgMHg0ODY0MWEsIDB4MDI3MDQwLCAweDQxYzQ4OCwgMHg0MWU0OGMsIDB4NDIwNDVhLAorICAgIDB4NDdjNDI0LCAweDA0YzAyYywgMHg0NmU0MjYsIDB4MDM2MDJlLCAweDQyODQ3OCwgMHgwMzAwMzMsIDB4NDNjMDMxLAorICAgIDB4MDRiMDMyLCAweDQyZTQyYSwgMHgwMzQwM2EsIDB4MDM1MDQ4LCAweDQyYzQ0MiwgMHg0NzA0MzAsIDB4NDk0NDM0LAorICAgIDB4NDM2NDlhLCAweDQ1YzQzOCwgMHgwNDQwM2IsIDB4NDNhNDU0LCAweDA0NTAzZCwgMHgwM2UwM2YsIDB4NDNlNDY0LAorICAgIDB4NDQwNDYwLCAweDQ4NDQ0NCwgMHgwNDkwNDIsIDB4NDQ2NDQ4LCAweDQ0YTQ1NiwgMHg0NjY0NGMsIDB4MDQ3MDQ2LAorICAgIDB4NDRlNDUyLCAweDQ1MDQ2MiwgMHg0NzQ0NWUsIDB4NDZhNDk2LCAweDQ5ODQ2YywgMHg0NzI0NzYsIDB4NDdhNDgyLAorICAgIDB4MDRlMDRmLCAweDQ3ZTQ5MiwgMHg0OGU0OWV9OwogCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICBUYWJsZTogSHVmZlRyZWUyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEgKENvZGVib29rIDcpLiAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqIDIpICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1jb25zdCBVSU5UIGFIdWZmVHJlZTIzWzYzXSA9IHsweDQwMDAwMSwweDAwMjAwMywweDQxMDQwMiwweDAwNDAwNywweDQxMjAwNSwweDAxYzAwNiwweDQyMDQwNCwweDAwODAwYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFkMDA5LDB4MDBhMDFmLDB4NDA2MDI2LDB4MDBjMDEyLDB4MDBkMDBmLDB4MDI3MDBlLDB4NDA4NDQwLDB4MDEwMDIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjgwMTEsMHg0NTQ0MGEsMHgwMTMwMTcsMHgwMjkwMTQsMHgwMjQwMTUsMHgwMTYwMmYsMHg0M2M0MGMsMHgwMmIwMTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxOTAzMywweDAzMjAxYSwweDQzZTAxYiwweDQ3MDQwZSwweDQyMjQxNCwweDAxZTAyNSwweDQzMjQxNiwweDAyMDAyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDE4NDQyLDB4NDFhNDUyLDB4MDM2MDIzLDB4NDFjNDQ2LDB4NDY0NDFlLDB4NDI0NDMwLDB4NDI2NDM0LDB4NDM2NDI4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NDQ0MmEsMHgwMmUwMmEsMHg0NTY0MmMsMHgwMzAwMmMsMHgwMmQwM2IsMHg0NjY0MmUsMHg0M2E0MzgsMHg0NjA0NDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzMTAzNywweDQ3MjQ0YSwweDQ1YTQ0YywweDAzNDAzOSwweDAzODAzNSwweDQ3ODQ0ZSwweDQ2MjQ1MCwweDQ3NDQ1OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDZhNDVjLDB4MDNhMDNjLDB4NDVlNDdhLDB4NDc2NDY4LDB4MDNkMDNlLDB4NDdjNDZjLDB4NDZlNDdlfTsKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisvKiAgVGFibGU6IEh1ZmZUcmVlMjMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEKKyAqIChDb2RlYm9vayA3KS4gICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIzIGFuZCAxMSBub3QgdXNlZCAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlKSBvciAoaW5kZXggdmFsdWUgKgorICogMikgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGlucHV0OiAgICAgICAgICBjb2Rld29yZCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitjb25zdCBVSU5UIGFIdWZmVHJlZTIzWzYzXSA9IHsKKyAgICAweDQwMDAwMSwgMHgwMDIwMDMsIDB4NDEwNDAyLCAweDAwNDAwNywgMHg0MTIwMDUsIDB4MDFjMDA2LCAweDQyMDQwNCwKKyAgICAweDAwODAwYiwgMHgwMWQwMDksIDB4MDBhMDFmLCAweDQwNjAyNiwgMHgwMGMwMTIsIDB4MDBkMDBmLCAweDAyNzAwZSwKKyAgICAweDQwODQ0MCwgMHgwMTAwMjIsIDB4MDI4MDExLCAweDQ1NDQwYSwgMHgwMTMwMTcsIDB4MDI5MDE0LCAweDAyNDAxNSwKKyAgICAweDAxNjAyZiwgMHg0M2M0MGMsIDB4MDJiMDE4LCAweDAxOTAzMywgMHgwMzIwMWEsIDB4NDNlMDFiLCAweDQ3MDQwZSwKKyAgICAweDQyMjQxNCwgMHgwMWUwMjUsIDB4NDMyNDE2LCAweDAyMDAyMSwgMHg0MTg0NDIsIDB4NDFhNDUyLCAweDAzNjAyMywKKyAgICAweDQxYzQ0NiwgMHg0NjQ0MWUsIDB4NDI0NDMwLCAweDQyNjQzNCwgMHg0MzY0MjgsIDB4NDQ0NDJhLCAweDAyZTAyYSwKKyAgICAweDQ1NjQyYywgMHgwMzAwMmMsIDB4MDJkMDNiLCAweDQ2NjQyZSwgMHg0M2E0MzgsIDB4NDYwNDQ4LCAweDAzMTAzNywKKyAgICAweDQ3MjQ0YSwgMHg0NWE0NGMsIDB4MDM0MDM5LCAweDAzODAzNSwgMHg0Nzg0NGUsIDB4NDYyNDUwLCAweDQ3NDQ1OCwKKyAgICAweDQ2YTQ1YywgMHgwM2EwM2MsIDB4NDVlNDdhLCAweDQ3NjQ2OCwgMHgwM2QwM2UsIDB4NDdjNDZjLCAweDQ2ZTQ3ZX07CiAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogIFRhYmxlOiBIdWZmVHJlZTI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YSAoQ29kZWJvb2sgOCkuICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlICogMikgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWNvbnN0IFVJTlQgYUh1ZmZUcmVlMjRbNjNdID0gezB4MDAxMDA2LDB4MDFkMDAyLDB4MDA1MDAzLDB4NDI0MDA0LDB4NDAwNDIwLDB4NDE0NDAyLDB4MDA3MDBhLDB4MDA4MDIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDkwMWYsMHg0MDQ0MzIsMHgwMGIwMTEsMHgwMGMwMGUsMHgwMGQwMzIsMHg0MDY0NDYsMHgwMjMwMGYsMHgwMzMwMTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ1ODQwOCwweDAyNTAxMiwweDAxMzAxNiwweDAxNDAyZiwweDAxNTAzOCwweDQ2ODQwYSwweDAyODAxNywweDAxODAxYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDM5MDE5LDB4NDBjNDdhLDB4MDNlMDFiLDB4MDNiMDFjLDB4NDBlNDdlLDB4NDEyMDFlLDB4NDIyNDEwLDB4NDE2NDM0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMmEwMjEsMHgwMjIwMmIsMHg0MTg0NDQsMHgwMmMwMjQsMHg0MWE0NTYsMHgwMmQwMjYsMHgwMjcwMzQsMHg0NjI0MWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyOTAzNiwweDQxZTQ1YywweDQyNjAzMSwweDQyODQzMCwweDQ1MjQyYSwweDAzNzAyZSwweDQyYzQ2NCwweDAzMDAzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDc0NDJlLDB4NDM2NDQyLDB4NDM4NDU0LDB4NDNhNDQ4LDB4MDM1MDNhLDB4NDNjNDY2LDB4NDNlMDNkLDB4NDRhNDQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NGM0NzIsMHg0NjA0NGUsMHg0NWE0NTAsMHg0NWU0NzAsMHg0NmE0NzYsMHg0NmM0NzgsMHg0N2M0NmV9OworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKy8qICBUYWJsZTogSHVmZlRyZWUyNCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YQorICogKENvZGVib29rIDgpLiAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqCisgKiAyKSAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogMiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2NvbnN0IFVJTlQgYUh1ZmZUcmVlMjRbNjNdID0geworICAgIDB4MDAxMDA2LCAweDAxZDAwMiwgMHgwMDUwMDMsIDB4NDI0MDA0LCAweDQwMDQyMCwgMHg0MTQ0MDIsIDB4MDA3MDBhLAorICAgIDB4MDA4MDIwLCAweDAwOTAxZiwgMHg0MDQ0MzIsIDB4MDBiMDExLCAweDAwYzAwZSwgMHgwMGQwMzIsIDB4NDA2NDQ2LAorICAgIDB4MDIzMDBmLCAweDAzMzAxMCwgMHg0NTg0MDgsIDB4MDI1MDEyLCAweDAxMzAxNiwgMHgwMTQwMmYsIDB4MDE1MDM4LAorICAgIDB4NDY4NDBhLCAweDAyODAxNywgMHgwMTgwMWEsIDB4MDM5MDE5LCAweDQwYzQ3YSwgMHgwM2UwMWIsIDB4MDNiMDFjLAorICAgIDB4NDBlNDdlLCAweDQxMjAxZSwgMHg0MjI0MTAsIDB4NDE2NDM0LCAweDAyYTAyMSwgMHgwMjIwMmIsIDB4NDE4NDQ0LAorICAgIDB4MDJjMDI0LCAweDQxYTQ1NiwgMHgwMmQwMjYsIDB4MDI3MDM0LCAweDQ2MjQxYywgMHgwMjkwMzYsIDB4NDFlNDVjLAorICAgIDB4NDI2MDMxLCAweDQyODQzMCwgMHg0NTI0MmEsIDB4MDM3MDJlLCAweDQyYzQ2NCwgMHgwMzAwM2MsIDB4NDc0NDJlLAorICAgIDB4NDM2NDQyLCAweDQzODQ1NCwgMHg0M2E0NDgsIDB4MDM1MDNhLCAweDQzYzQ2NiwgMHg0M2UwM2QsIDB4NDRhNDQwLAorICAgIDB4NDRjNDcyLCAweDQ2MDQ0ZSwgMHg0NWE0NTAsIDB4NDVlNDcwLCAweDQ2YTQ3NiwgMHg0NmM0NzgsIDB4NDdjNDZlfTsKIAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAgVGFibGU6IEh1ZmZUcmVlMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgZGVzY3JpcHRpb246ICAgIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGRlY29kZSB0cmVlIGZvciBzcGVjdHJhbCBkYXRhIChDb2RlYm9vayA5KS4gICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIzIGFuZCAxMSBub3QgdXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjIgYW5kIDEwIGRldGVybWluZSBlbmQgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlKSBvciAoaW5kZXggdmFsdWUgKiAyKSAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGlucHV0OiAgICAgICAgICBjb2Rld29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBvdXRwdXQ6ICAgICAgICAgaW5kZXggKiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotY29uc3QgVUlOVCBhSHVmZlRyZWUyNVsxNjhdID0gezB4NDAwMDAxLDB4MDAyMDAzLDB4NDFhNDAyLDB4MDA0MDA3LDB4NDFjMDA1LDB4MDM1MDA2LDB4NDM0NDA0LDB4MDA4MDEwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA5MDBjLDB4MDRhMDBhLDB4NDIwMDBiLDB4NDRlNDA2LDB4MDM2MDBkLDB4MDM4MDBlLDB4MDVhMDBmLDB4NDA4NDY4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDExMDFhLDB4MDEyMDE2LDB4MDM5MDEzLDB4MDcwMDE0LDB4NDZlMDE1LDB4NDBhNDQwLDB4MDNiMDE3LDB4MDE4MDRkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5MDRmLDB4NGI4NDBjLDB4MDFiMDIyLDB4MDFjMDQxLDB4MDNmMDFkLDB4MDFlMDIwLDB4MDFmMDViLDB4NDBlNGVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxMDdjLDB4NDVjNDEwLDB4MDIzMDJjLDB4MDI0MDI4LDB4MDUzMDI1LDB4MDI2MDQ1LDB4MDI3MDdkLDB4NDEyNTIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ3MDI5LDB4MDVlMDJhLDB4MDJiMDhhLDB4NTI2NDE0LDB4MDU2MDJkLDB4MDJlMDgxLDB4MDJmMDMyLDB4MDZlMDMwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMxMDgwLDB4NDE2NTQ0LDB4MDc5MDMzLDB4MDM0MDkxLDB4NDE4NTJjLDB4NDM2NDFlLDB4MDRiMDM3LDB4NDIyNDZhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDNjNDI0LDB4MDRjMDNhLDB4NDI2NDU2LDB4MDNjMDY2LDB4MDNkMDNlLDB4NDgyNDI4LDB4NDU4NDJhLDB4MDQwMDcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDJjNGJhLDB4MDUwMDQyLDB4MDQzMDVjLDB4MDQ0MDc0LDB4NDJlNGJlLDB4MDZhMDQ2LDB4NGRjNDMwLDB4MDc1MDQ4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ5MGEzLDB4NDRhNDMyLDB4NDUwNDM4LDB4NDNhNDUyLDB4NDg0NDNlLDB4MDRlMDY4LDB4NDVhNDQyLDB4NGQ0NDQ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUxMDg4LDB4MDUyMDg3LDB4NDQ2NDhjLDB4MDc3MDU0LDB4NGRhMDU1LDB4NTBhNDQ4LDB4MDU3MDYwLDB4MDZiMDU4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU5MDZkLDB4NDRjNGY2LDB4NDZjNDU0LDB4NDVlNDc0LDB4MDY5MDVkLDB4NDYwNTIwLDB4MDVmMDdlLDB4NDYyNDk0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxMDYzLDB4MDdmMDYyLDB4NDY0NDk2LDB4MDY0MDhiLDB4MDhkMDY1LDB4NTQyNDY2LDB4MDY3MDcxLDB4NGQyNDcwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDcyNGVjLDB4NDc4NDc2LDB4NTNhNDdhLDB4MDliMDZjLDB4NDdjNGFjLDB4NGY4NDdlLDB4MDZmMDc4LDB4NTEwNDgwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDg2NDllLDB4NDg4NGEwLDB4MDczMDdiLDB4NDljNDhhLDB4NGE2NDhlLDB4MDk4MDc2LDB4NDkwNGMwLDB4NDkyNGVhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGM4NDk4LDB4MDdhMDhlLDB4NTEyNDlhLDB4NGEyNGQ2LDB4NTA2NGE0LDB4NGYyNGE4LDB4NGFhNGRlLDB4NTFlNGFlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGIwNTM4LDB4MDgyMDkyLDB4MDgzMDg1LDB4MDhmMDg0LDB4NTQ2NGIyLDB4MDk2MDg2LDB4NGNlNGI0LDB4NGQwNGI2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDg5MDkwLDB4NGJjNTA4LDB4NGMyNTNlLDB4MDhjMGE0LDB4NTI4NGM0LDB4NGUwNGM2LDB4NGNhNGZhLDB4NTE0NGNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGYwNGQ4LDB4NGUyNGZjLDB4MDkzMDljLDB4MDk0MDk5LDB4MDk1MDk3LDB4NGU0NTE2LDB4NGU2NTJlLDB4NGU4NGZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGY0NTBjLDB4MDlhMDlmLDB4NTAwNTAyLDB4NTA0NTBlLDB4MDlkMGEwLDB4MDllMGE1LDB4NTE4NTMwLDB4NTFhNTRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGE3MGExLDB4MGEyMGE2LDB4NTFjNTM0LDB4NTNjNTI0LDB4NTQwNTJhLDB4NTQ4NTMyLDB4NTM2NTUwLDB4NTRjNTRlfTsKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisvKiAgVGFibGU6IEh1ZmZUcmVlMjUgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEKKyAqIChDb2RlYm9vayA5KS4gICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIzIGFuZCAxMSBub3QgdXNlZCAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlKSBvciAoaW5kZXggdmFsdWUgKgorICogMikgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGlucHV0OiAgICAgICAgICBjb2Rld29yZCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitjb25zdCBVSU5UIGFIdWZmVHJlZTI1WzE2OF0gPSB7CisgICAgMHg0MDAwMDEsIDB4MDAyMDAzLCAweDQxYTQwMiwgMHgwMDQwMDcsIDB4NDFjMDA1LCAweDAzNTAwNiwgMHg0MzQ0MDQsCisgICAgMHgwMDgwMTAsIDB4MDA5MDBjLCAweDA0YTAwYSwgMHg0MjAwMGIsIDB4NDRlNDA2LCAweDAzNjAwZCwgMHgwMzgwMGUsCisgICAgMHgwNWEwMGYsIDB4NDA4NDY4LCAweDAxMTAxYSwgMHgwMTIwMTYsIDB4MDM5MDEzLCAweDA3MDAxNCwgMHg0NmUwMTUsCisgICAgMHg0MGE0NDAsIDB4MDNiMDE3LCAweDAxODA0ZCwgMHgwMTkwNGYsIDB4NGI4NDBjLCAweDAxYjAyMiwgMHgwMWMwNDEsCisgICAgMHgwM2YwMWQsIDB4MDFlMDIwLCAweDAxZjA1YiwgMHg0MGU0ZWUsIDB4MDIxMDdjLCAweDQ1YzQxMCwgMHgwMjMwMmMsCisgICAgMHgwMjQwMjgsIDB4MDUzMDI1LCAweDAyNjA0NSwgMHgwMjcwN2QsIDB4NDEyNTIyLCAweDA0NzAyOSwgMHgwNWUwMmEsCisgICAgMHgwMmIwOGEsIDB4NTI2NDE0LCAweDA1NjAyZCwgMHgwMmUwODEsIDB4MDJmMDMyLCAweDA2ZTAzMCwgMHgwMzEwODAsCisgICAgMHg0MTY1NDQsIDB4MDc5MDMzLCAweDAzNDA5MSwgMHg0MTg1MmMsIDB4NDM2NDFlLCAweDA0YjAzNywgMHg0MjI0NmEsCisgICAgMHg0M2M0MjQsIDB4MDRjMDNhLCAweDQyNjQ1NiwgMHgwM2MwNjYsIDB4MDNkMDNlLCAweDQ4MjQyOCwgMHg0NTg0MmEsCisgICAgMHgwNDAwNzIsIDB4NDJjNGJhLCAweDA1MDA0MiwgMHgwNDMwNWMsIDB4MDQ0MDc0LCAweDQyZTRiZSwgMHgwNmEwNDYsCisgICAgMHg0ZGM0MzAsIDB4MDc1MDQ4LCAweDA0OTBhMywgMHg0NGE0MzIsIDB4NDUwNDM4LCAweDQzYTQ1MiwgMHg0ODQ0M2UsCisgICAgMHgwNGUwNjgsIDB4NDVhNDQyLCAweDRkNDQ0NCwgMHgwNTEwODgsIDB4MDUyMDg3LCAweDQ0NjQ4YywgMHgwNzcwNTQsCisgICAgMHg0ZGEwNTUsIDB4NTBhNDQ4LCAweDA1NzA2MCwgMHgwNmIwNTgsIDB4MDU5MDZkLCAweDQ0YzRmNiwgMHg0NmM0NTQsCisgICAgMHg0NWU0NzQsIDB4MDY5MDVkLCAweDQ2MDUyMCwgMHgwNWYwN2UsIDB4NDYyNDk0LCAweDA2MTA2MywgMHgwN2YwNjIsCisgICAgMHg0NjQ0OTYsIDB4MDY0MDhiLCAweDA4ZDA2NSwgMHg1NDI0NjYsIDB4MDY3MDcxLCAweDRkMjQ3MCwgMHg0NzI0ZWMsCisgICAgMHg0Nzg0NzYsIDB4NTNhNDdhLCAweDA5YjA2YywgMHg0N2M0YWMsIDB4NGY4NDdlLCAweDA2ZjA3OCwgMHg1MTA0ODAsCisgICAgMHg0ODY0OWUsIDB4NDg4NGEwLCAweDA3MzA3YiwgMHg0OWM0OGEsIDB4NGE2NDhlLCAweDA5ODA3NiwgMHg0OTA0YzAsCisgICAgMHg0OTI0ZWEsIDB4NGM4NDk4LCAweDA3YTA4ZSwgMHg1MTI0OWEsIDB4NGEyNGQ2LCAweDUwNjRhNCwgMHg0ZjI0YTgsCisgICAgMHg0YWE0ZGUsIDB4NTFlNGFlLCAweDRiMDUzOCwgMHgwODIwOTIsIDB4MDgzMDg1LCAweDA4ZjA4NCwgMHg1NDY0YjIsCisgICAgMHgwOTYwODYsIDB4NGNlNGI0LCAweDRkMDRiNiwgMHgwODkwOTAsIDB4NGJjNTA4LCAweDRjMjUzZSwgMHgwOGMwYTQsCisgICAgMHg1Mjg0YzQsIDB4NGUwNGM2LCAweDRjYTRmYSwgMHg1MTQ0Y2MsIDB4NGYwNGQ4LCAweDRlMjRmYywgMHgwOTMwOWMsCisgICAgMHgwOTQwOTksIDB4MDk1MDk3LCAweDRlNDUxNiwgMHg0ZTY1MmUsIDB4NGU4NGZlLCAweDRmNDUwYywgMHgwOWEwOWYsCisgICAgMHg1MDA1MDIsIDB4NTA0NTBlLCAweDA5ZDBhMCwgMHgwOWUwYTUsIDB4NTE4NTMwLCAweDUxYTU0YSwgMHgwYTcwYTEsCisgICAgMHgwYTIwYTYsIDB4NTFjNTM0LCAweDUzYzUyNCwgMHg1NDA1MmEsIDB4NTQ4NTMyLCAweDUzNjU1MCwgMHg1NGM1NGV9OwogCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICBUYWJsZTogSHVmZlRyZWUyNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yIHNwZWN0cmFsIGRhdGEgKENvZGVib29rIDEwKS4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqIDIpICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIG91dHB1dDogICAgICAgICBpbmRleCAqIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1jb25zdCBVSU5UIGFIdWZmVHJlZTI2WzE2OF0gPSB7MHgwMDYwMDEsMHgwMDIwMTMsMHgwMDMwMGYsMHgwMDQwMGQsMHgwM2IwMDUsMHg0MDA0NmUsMHgwMzcwMDcsMHgwMDgwMGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDkwNjcsMHg0MDI0MjAsMHgwNTYwMGIsMHgwMGMwNTcsMHg0MzQ0MDQsMHgwNjYwMGUsMHg0MDY0NzAsMHgwM2MwMTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTkwMTEsMHgwNmYwMTIsMHg0OWU0MDgsMHgwMTQwMTksMHgwM2YwMTUsMHgwMTYwNDQsMHgwMTcwNDIsMHgwNzkwMTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0Yjg0MGEsMHgwMWEwMWYsMHgwMWIwNDcsMHgwN2MwMWMsMHgwODcwMWQsMHgwNjkwMWUsMHg0NDY0MGMsMHgwMjAwMjcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGIwMjEsMHgwMjIwNGYsMHgwMjMwMjUsMHgwMjQwNmIsMHg0MGU0ZTAsMHgwODEwMjYsMHg1Mjg0MTAsMHgwMjgwMmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmMwMjksMHgwOGYwMmEsMHgwMmIwNzgsMHg1M2E0MTIsMHgwNTIwMmQsMHgwMmUwMzMsMHgwMmYwMzEsMHgwMzAwYTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MTQ0Y2UsMHgwYTYwMzIsMHg0MTY1MzQsMHgwOWEwMzQsMHgwOWYwMzUsMHgwMzYwYTcsMHg1NGU0MTgsMHgwM2EwMzgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MzYwMzksMHg0Mzg0MWEsMHg0MWM0MWUsMHg0MjI0NmEsMHgwNTgwM2QsMHgwM2UwNjgsMHg0MjQ0ODQsMHgwNDAwNWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDEwN2EsMHg0MjY0NWEsMHgwNDMwOTMsMHg0ZDI0MjgsMHgwNWUwNDUsMHgwNDYwNzIsMHg0MmE0NWUsMHgwNDgwNjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzMwNDksMHgwNGEwOTgsMHg0MmM0YzQsMHgwNzUwNGMsMHgwOTUwNGQsMHgwNGUwOWMsMHg1MTA0MmUsMHgwNjMwNTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzcwNTEsMHg0MzA1M2MsMHgwNTMwODQsMHgwNjUwNTQsMHg0ZTQwNTUsMHg0ZmU0MzIsMHg0M2E0NTQsMHg0M2M0NmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0M2U0ODYsMHgwNzAwNWEsMHg0YTA0NDAsMHgwNzEwNWMsMHgwNWQwN2IsMHg0NWM0NDIsMHgwNWYwOGEsMHg0NzY0NDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwN2YwNjEsMHgwNjIwNmEsMHg0NDg1MDYsMHgwNjQwOGUsMHg1MjY0NGEsMHg1NDQ0NGMsMHg0NTY0NGUsMHg0NTI0NTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODg0NTgsMHg0NjA0ZWMsMHg0NjI0ZjYsMHg1MGU0NjQsMHgwODIwNmQsMHgwYTQwNmUsMHg1NDI0NjYsMHg0YTI0NjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0OGE0NzIsMHg0NzQwODksMHg0ZDg0NzgsMHgwOTcwNzQsMHg0N2E1MDgsMHgwOGQwNzYsMHg0N2M0YjYsMHg1MTI0N2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODA0ZmMsMHg0YmM0ODIsMHg0OGM0YTQsMHg0OGU0ZDQsMHgwN2QwN2UsMHg0OTA0ZGEsMHg0OTIwOGIsMHgwOTQwODAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0OTQ1MGMsMHg0OTY0ZTIsMHgwOWQwODMsMHg1MmE0OTgsMHgwODUwOTEsMHgwYTUwODYsMHg0Y2M0OWEsMHgwODgwOGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZWU0OWMsMHg0YTY0YmEsMHg0YTg0YzAsMHg0YzI0YWEsMHg0YWM0ZjAsMHg0YWU0ZDAsMHg0Y2E0YjAsMHgwOTAwYTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YjI0ZWEsMHgwOTIwOTksMHg0YjQ1MTYsMHg0ZDY0YmUsMHg0YzY1MGEsMHg1MjIwOTYsMHg0Yzg1MjQsMHg0ZGM0ZjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZGU0ZjQsMHg0ZTY1NDgsMHgwOWUwOWIsMHg1Mzg0ZTgsMHg1MjA0ZjgsMHg0ZmE1M2UsMHg1MDA1MWEsMHgwYTMwYTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDI1MzYsMHg1MTQ1MDQsMHg1MWU1MTgsMHg1NGE1MWMsMHg1NDA1MmMsMHg1MmU1NDYsMHg1MzA1MzIsMHg1NGM1NTB9OworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKy8qICBUYWJsZTogSHVmZlRyZWUyNiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YQorICogKENvZGVib29rIDEwKS4gICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjMgYW5kIDExIG5vdCB1c2VkICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICovCisvKiAgICAgICAgICAgICAgICAgICAgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpIG9yIChpbmRleCB2YWx1ZSAqCisgKiAyKSAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgaW5wdXQ6ICAgICAgICAgIGNvZGV3b3JkICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogMiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2NvbnN0IFVJTlQgYUh1ZmZUcmVlMjZbMTY4XSA9IHsKKyAgICAweDAwNjAwMSwgMHgwMDIwMTMsIDB4MDAzMDBmLCAweDAwNDAwZCwgMHgwM2IwMDUsIDB4NDAwNDZlLCAweDAzNzAwNywKKyAgICAweDAwODAwYSwgMHgwMDkwNjcsIDB4NDAyNDIwLCAweDA1NjAwYiwgMHgwMGMwNTcsIDB4NDM0NDA0LCAweDA2NjAwZSwKKyAgICAweDQwNjQ3MCwgMHgwM2MwMTAsIDB4MDU5MDExLCAweDA2ZjAxMiwgMHg0OWU0MDgsIDB4MDE0MDE5LCAweDAzZjAxNSwKKyAgICAweDAxNjA0NCwgMHgwMTcwNDIsIDB4MDc5MDE4LCAweDRiODQwYSwgMHgwMWEwMWYsIDB4MDFiMDQ3LCAweDA3YzAxYywKKyAgICAweDA4NzAxZCwgMHgwNjkwMWUsIDB4NDQ2NDBjLCAweDAyMDAyNywgMHgwNGIwMjEsIDB4MDIyMDRmLCAweDAyMzAyNSwKKyAgICAweDAyNDA2YiwgMHg0MGU0ZTAsIDB4MDgxMDI2LCAweDUyODQxMCwgMHgwMjgwMmMsIDB4MDZjMDI5LCAweDA4ZjAyYSwKKyAgICAweDAyYjA3OCwgMHg1M2E0MTIsIDB4MDUyMDJkLCAweDAyZTAzMywgMHgwMmYwMzEsIDB4MDMwMGEyLCAweDQxNDRjZSwKKyAgICAweDBhNjAzMiwgMHg0MTY1MzQsIDB4MDlhMDM0LCAweDA5ZjAzNSwgMHgwMzYwYTcsIDB4NTRlNDE4LCAweDAzYTAzOCwKKyAgICAweDQzNjAzOSwgMHg0Mzg0MWEsIDB4NDFjNDFlLCAweDQyMjQ2YSwgMHgwNTgwM2QsIDB4MDNlMDY4LCAweDQyNDQ4NCwKKyAgICAweDA0MDA1YiwgMHgwNDEwN2EsIDB4NDI2NDVhLCAweDA0MzA5MywgMHg0ZDI0MjgsIDB4MDVlMDQ1LCAweDA0NjA3MiwKKyAgICAweDQyYTQ1ZSwgMHgwNDgwNjAsIDB4MDczMDQ5LCAweDA0YTA5OCwgMHg0MmM0YzQsIDB4MDc1MDRjLCAweDA5NTA0ZCwKKyAgICAweDA0ZTA5YywgMHg1MTA0MmUsIDB4MDYzMDUwLCAweDA3NzA1MSwgMHg0MzA1M2MsIDB4MDUzMDg0LCAweDA2NTA1NCwKKyAgICAweDRlNDA1NSwgMHg0ZmU0MzIsIDB4NDNhNDU0LCAweDQzYzQ2YywgMHg0M2U0ODYsIDB4MDcwMDVhLCAweDRhMDQ0MCwKKyAgICAweDA3MTA1YywgMHgwNWQwN2IsIDB4NDVjNDQyLCAweDA1ZjA4YSwgMHg0NzY0NDQsIDB4MDdmMDYxLCAweDA2MjA2YSwKKyAgICAweDQ0ODUwNiwgMHgwNjQwOGUsIDB4NTI2NDRhLCAweDU0NDQ0YywgMHg0NTY0NGUsIDB4NDUyNDUwLCAweDQ4ODQ1OCwKKyAgICAweDQ2MDRlYywgMHg0NjI0ZjYsIDB4NTBlNDY0LCAweDA4MjA2ZCwgMHgwYTQwNmUsIDB4NTQyNDY2LCAweDRhMjQ2OCwKKyAgICAweDQ4YTQ3MiwgMHg0NzQwODksIDB4NGQ4NDc4LCAweDA5NzA3NCwgMHg0N2E1MDgsIDB4MDhkMDc2LCAweDQ3YzRiNiwKKyAgICAweDUxMjQ3ZSwgMHg0ODA0ZmMsIDB4NGJjNDgyLCAweDQ4YzRhNCwgMHg0OGU0ZDQsIDB4MDdkMDdlLCAweDQ5MDRkYSwKKyAgICAweDQ5MjA4YiwgMHgwOTQwODAsIDB4NDk0NTBjLCAweDQ5NjRlMiwgMHgwOWQwODMsIDB4NTJhNDk4LCAweDA4NTA5MSwKKyAgICAweDBhNTA4NiwgMHg0Y2M0OWEsIDB4MDg4MDhjLCAweDRlZTQ5YywgMHg0YTY0YmEsIDB4NGE4NGMwLCAweDRjMjRhYSwKKyAgICAweDRhYzRmMCwgMHg0YWU0ZDAsIDB4NGNhNGIwLCAweDA5MDBhMSwgMHg0YjI0ZWEsIDB4MDkyMDk5LCAweDRiNDUxNiwKKyAgICAweDRkNjRiZSwgMHg0YzY1MGEsIDB4NTIyMDk2LCAweDRjODUyNCwgMHg0ZGM0ZjIsIDB4NGRlNGY0LCAweDRlNjU0OCwKKyAgICAweDA5ZTA5YiwgMHg1Mzg0ZTgsIDB4NTIwNGY4LCAweDRmYTUzZSwgMHg1MDA1MWEsIDB4MGEzMGEwLCAweDUwMjUzNiwKKyAgICAweDUxNDUwNCwgMHg1MWU1MTgsIDB4NTRhNTFjLCAweDU0MDUyYywgMHg1MmU1NDYsIDB4NTMwNTMyLCAweDU0YzU1MH07CiAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogIFRhYmxlOiBIdWZmVHJlZTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3Igc3BlY3RyYWwgZGF0YSAoQ29kZWJvb2sgMTEpLiAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlICogMikgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgb3V0cHV0OiAgICAgICAgIGluZGV4ICogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWNvbnN0IFVJTlQgYUh1ZmZUcmVlMjdbMjg4XSA9IHsweDAwMTAwZCwweDAwMjAwNiwweDAwMzAwNCwweDQwMDQyNCwweDA0NzAwNSwweDQwMjQ0NiwweDA0ODAwNywweDAwODAwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwOTA0YywweDQ0YTQwNCwweDA3NDAwYiwweDAwYzBiYiwweDQ2NjQwNiwweDAwZTAxNCwweDAwZjA1NCwweDA0ZTAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1MTAxMSwweDBhOTAxMiwweDAxMzBiYywweDQwODQ2NCwweDAxNTAxZiwweDAxNjAxYSwweDAxNzA1OSwweDBhZjAxOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjYTAxOSwweDQwYTBlNCwweDAxYjA1ZSwweDAxYzA4NCwweDBiZjAxZCwweDA1ZDAxZSwweDU1YTQwYywweDAyMDAyNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMTA2NiwweDA0MzAyMiwweDAyMzA2MiwweDAyNDA4ZCwweDAyNTEwOCwweDQwZTQ4MCwweDAyNzAzMCwweDAyODAyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyOTA2YiwweDAyYTBkYSwweDA2NTAyYiwweDQxMDVjOCwweDBhNDAyZCwweDBlYzAyZSwweDBkZDAyZiwweDUzMjQxMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZTAzMSwweDAzMjAzNiwweDAzMzAzZSwweDBmZDAzNCwweDBmYzAzNSwweDQxNDViMCwweDAzNzAzYSwweDAzODExNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwZDAzOSwweDViYTQxNiwweDEwZjAzYiwweDAzYzA0MSwweDVmYTAzZCwweDQxYzQxOCwweDEwNDAzZiwweDA0MDExZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQxYTVmNCwweDExYzA0MiwweDQxZTYxYywweDA4NzA0NCwweDBmNTA0NSwweDBkOTA0NiwweDQyMDRhMiwweDY0MDQyMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0OTA0YSwweDQyNjQ0OCwweDA0YjA3MywweDQyODQ2OCwweDQ2YzA0ZCwweDQ4YTQyYSwweDA0ZjA3NywweDA3NjA1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyYzRiMCwweDA1MjBhNywweDA5NjA1MywweDQyZTRhOCwweDA1NTA3ZCwweDA3YTA1NiwweDBkNDA1NywweDBkZjA1OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ0MjQzMCwweDA1YTA4MSwweDA1YjA5YiwweDA1YzBlMiwweDViODQzMiwweDRmZTQzNCwweDA1ZjA5ZSwweDBlNjA2MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MTBkNiwweDU3YzQzNiwweDBjYzA2MywweDExMjA2NCwweDQzODRhMCwweDQzYTVjYSwweDA2NzA4OSwweDA2ODBiNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2OTBhMiwweDBhMTA2YSwweDQzYzU5YywweDA5MjA2YywweDA2ZDBiYSwweDYwNjQzZSwweDBkMTA2ZiwweDA3MDBlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBkZTA3MSwweDEwYjA3MiwweDQ0MDU2YywweDQ2YTQ0NCwweDA3NTA5NCwweDQ4YzQ0YywweDQ0ZTQ5MCwweDA5NTA3OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBhYjA3OSwweDQ1MDRjZSwweDA3YjA5NywweDExZTA3YywweDYzMDQ1MiwweDBhYzA3ZSwweDA3ZjA5OSwweDA4MDEwNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ1NDRiOCwweDA4MjBiMSwweDA4MzBlNSwweDRmYzQ1NiwweDBiMzA4NSwweDA4NjA5ZCwweDQ1ODUzZSwweDA4ODBjMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVjMDQ1YSwweDA4YTA4ZiwweDA4YjBjZSwweDA4YzBmNywweDU4NjQ1YywweDExMTA4ZSwweDQ1ZTVjNCwweDBjNDA5MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwYTA5MSwweDQ2MDRlNCwweDBkMDA5MywweDQ2MjYwOCwweDQ4ZTQ2ZSwweDQ3MDRiMiwweDRkMjQ3MiwweDA5ODBiZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRmMjQ3NCwweDBlMzA5YSwweDQ3NjRhYSwweDBiZTA5YywweDQ3ODUxYSwweDQ3YTRkZSwweDA5ZjBiNSwweDBhMDBjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDUwMDQ3YywweDU3ODQ3ZSwweDBhMzBjMywweDUwNDQ4MiwweDBlOTBhNSwweDBhNjEwMCwweDRjODQ4NCwweDBhODExZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ4NjYyYSwweDBjNzBhYSwweDQ4ODQ5NCwweDQ5MjRkMCwweDBhZDBjOCwweDBhZTBkOCwweDQ5NjYzNiwweDEwZTBiMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRmODQ5OCwweDBmMzBiMiwweDQ5YTRkYywweDBmMjBiNCwweDUzYzQ5YywweDBiNjBjYiwweDQ5ZTU3YSwweDBiODBlMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBiOTEwOSwweDVlNDRhNCwweDU0ODRhNiwweDRhYzRhZSwweDRiNDRjYSwweDRkNjRiNiwweDRiYTVkYSwweDBjNjBjMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRiYzUxZSwweDRiZTU1NiwweDYyMDRjMCwweDRjMjRjNCwweDBmODBjNSwweDU2NjRjNiwweDRjYzUzYSwweDRkNDYyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBmMTBjOSwweDRkODU1MiwweDRkYTRmYSwweDViZTRlMCwweDBjZDBmZiwweDUyNDRlMiwweDBjZjBlOCwweDRlNjU2OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU5YTRlOCwweDBmOTBkMiwweDEwMTBkMywweDVhYzRlYSwweDBkNTBkNywweDRlYzYzNCwweDRlZTU2MCwweDRmNDRmMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRmNjYzOCwweDUwMjUyMiwweDBkYjBkYywweDUwNjVhNiwweDUwODYwNCwweDYwMDUwYSwweDUwYzBmYiwweDYzMjUwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExMzBlMSwweDVhNDUxMCwweDUxMjVmYywweDUxNjUxNCwweDUxODYzZSwweDUxYzUzNiwweDBlNzBmNCwweDU1YzUyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYwMjUyNiwweDBlYjBlYSwweDVjYzUyOCwweDVlYTUyYSwweDExNDBlZCwweDYwYzUyYywweDEwMjBlZiwweDBmMDExOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU4ZTUyZSwweDUzMDYyMiwweDU1ODUzNCwweDUzODYxZSwweDU1ZTU0MCwweDU4MDBmNiwweDU3ZTU0MiwweDU0NDVlNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU0NjVlOCwweDBmYTExNSwweDU0YzU0YSwweDU0ZTYwZSwweDVhZTU1MCwweDExNjBmZSwweDVmMDU1NCwweDU2NDU2MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU2YTU4YSwweDU2ZTVlZSwweDEwMzEwYywweDU3MDVkMCwweDEwNzEwNSwweDU3MjVkNCwweDU3NDYzYSwweDU3NjViNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU4MjViYywweDU4NDVlMiwweDU4ODVkZSwweDU4YzU5MiwweDVjZTU5MCwweDU5NDVmNiwweDYzYzU5NiwweDExYjExMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVkODU5OCwweDVjMjU5ZSwweDVlMDVhMCwweDVhMjVjNiwweDVhODYwYSwweDVhYTVlYywweDViMjYxMCwweDExYTExOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYxODViNiwweDVmMjVkMiwweDVkNjYxNiwweDVkYzVmOCwweDYxYTVmZSwweDYxMjYxNCwweDYyZTYyNCwweDYyNjYyOH07CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworLyogIFRhYmxlOiBIdWZmVHJlZTI3ICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogICAgZGVzY3JpcHRpb246ICAgIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGRlY29kZSB0cmVlIGZvciBzcGVjdHJhbCBkYXRhCisgKiAoQ29kZWJvb2sgMTEpLiAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjIgYW5kIDEwIGRldGVybWluZSBlbmQgdmFsdWUgKi8KKy8qICAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlICoKKyAqIDIpICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBvdXRwdXQ6ICAgICAgICAgaW5kZXggKiAyICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworY29uc3QgVUlOVCBhSHVmZlRyZWUyN1syODhdID0geworICAgIDB4MDAxMDBkLCAweDAwMjAwNiwgMHgwMDMwMDQsIDB4NDAwNDI0LCAweDA0NzAwNSwgMHg0MDI0NDYsIDB4MDQ4MDA3LAorICAgIDB4MDA4MDBhLCAweDAwOTA0YywgMHg0NGE0MDQsIDB4MDc0MDBiLCAweDAwYzBiYiwgMHg0NjY0MDYsIDB4MDBlMDE0LAorICAgIDB4MDBmMDU0LCAweDA0ZTAxMCwgMHgwNTEwMTEsIDB4MGE5MDEyLCAweDAxMzBiYywgMHg0MDg0NjQsIDB4MDE1MDFmLAorICAgIDB4MDE2MDFhLCAweDAxNzA1OSwgMHgwYWYwMTgsIDB4MGNhMDE5LCAweDQwYTBlNCwgMHgwMWIwNWUsIDB4MDFjMDg0LAorICAgIDB4MGJmMDFkLCAweDA1ZDAxZSwgMHg1NWE0MGMsIDB4MDIwMDI2LCAweDAyMTA2NiwgMHgwNDMwMjIsIDB4MDIzMDYyLAorICAgIDB4MDI0MDhkLCAweDAyNTEwOCwgMHg0MGU0ODAsIDB4MDI3MDMwLCAweDAyODAyYywgMHgwMjkwNmIsIDB4MDJhMGRhLAorICAgIDB4MDY1MDJiLCAweDQxMDVjOCwgMHgwYTQwMmQsIDB4MGVjMDJlLCAweDBkZDAyZiwgMHg1MzI0MTIsIDB4MDZlMDMxLAorICAgIDB4MDMyMDM2LCAweDAzMzAzZSwgMHgwZmQwMzQsIDB4MGZjMDM1LCAweDQxNDViMCwgMHgwMzcwM2EsIDB4MDM4MTE3LAorICAgIDB4MTBkMDM5LCAweDViYTQxNiwgMHgxMGYwM2IsIDB4MDNjMDQxLCAweDVmYTAzZCwgMHg0MWM0MTgsIDB4MTA0MDNmLAorICAgIDB4MDQwMTFkLCAweDQxYTVmNCwgMHgxMWMwNDIsIDB4NDFlNjFjLCAweDA4NzA0NCwgMHgwZjUwNDUsIDB4MGQ5MDQ2LAorICAgIDB4NDIwNGEyLCAweDY0MDQyMiwgMHgwNDkwNGEsIDB4NDI2NDQ4LCAweDA0YjA3MywgMHg0Mjg0NjgsIDB4NDZjMDRkLAorICAgIDB4NDhhNDJhLCAweDA0ZjA3NywgMHgwNzYwNTAsIDB4NDJjNGIwLCAweDA1MjBhNywgMHgwOTYwNTMsIDB4NDJlNGE4LAorICAgIDB4MDU1MDdkLCAweDA3YTA1NiwgMHgwZDQwNTcsIDB4MGRmMDU4LCAweDQ0MjQzMCwgMHgwNWEwODEsIDB4MDViMDliLAorICAgIDB4MDVjMGUyLCAweDViODQzMiwgMHg0ZmU0MzQsIDB4MDVmMDllLCAweDBlNjA2MCwgMHgwNjEwZDYsIDB4NTdjNDM2LAorICAgIDB4MGNjMDYzLCAweDExMjA2NCwgMHg0Mzg0YTAsIDB4NDNhNWNhLCAweDA2NzA4OSwgMHgwNjgwYjcsIDB4MDY5MGEyLAorICAgIDB4MGExMDZhLCAweDQzYzU5YywgMHgwOTIwNmMsIDB4MDZkMGJhLCAweDYwNjQzZSwgMHgwZDEwNmYsIDB4MDcwMGVlLAorICAgIDB4MGRlMDcxLCAweDEwYjA3MiwgMHg0NDA1NmMsIDB4NDZhNDQ0LCAweDA3NTA5NCwgMHg0OGM0NGMsIDB4NDRlNDkwLAorICAgIDB4MDk1MDc4LCAweDBhYjA3OSwgMHg0NTA0Y2UsIDB4MDdiMDk3LCAweDExZTA3YywgMHg2MzA0NTIsIDB4MGFjMDdlLAorICAgIDB4MDdmMDk5LCAweDA4MDEwNiwgMHg0NTQ0YjgsIDB4MDgyMGIxLCAweDA4MzBlNSwgMHg0ZmM0NTYsIDB4MGIzMDg1LAorICAgIDB4MDg2MDlkLCAweDQ1ODUzZSwgMHgwODgwYzIsIDB4NWMwNDVhLCAweDA4YTA4ZiwgMHgwOGIwY2UsIDB4MDhjMGY3LAorICAgIDB4NTg2NDVjLCAweDExMTA4ZSwgMHg0NWU1YzQsIDB4MGM0MDkwLCAweDEwYTA5MSwgMHg0NjA0ZTQsIDB4MGQwMDkzLAorICAgIDB4NDYyNjA4LCAweDQ4ZTQ2ZSwgMHg0NzA0YjIsIDB4NGQyNDcyLCAweDA5ODBiZCwgMHg0ZjI0NzQsIDB4MGUzMDlhLAorICAgIDB4NDc2NGFhLCAweDBiZTA5YywgMHg0Nzg1MWEsIDB4NDdhNGRlLCAweDA5ZjBiNSwgMHgwYTAwYzEsIDB4NTAwNDdjLAorICAgIDB4NTc4NDdlLCAweDBhMzBjMywgMHg1MDQ0ODIsIDB4MGU5MGE1LCAweDBhNjEwMCwgMHg0Yzg0ODQsIDB4MGE4MTFmLAorICAgIDB4NDg2NjJhLCAweDBjNzBhYSwgMHg0ODg0OTQsIDB4NDkyNGQwLCAweDBhZDBjOCwgMHgwYWUwZDgsIDB4NDk2NjM2LAorICAgIDB4MTBlMGIwLCAweDRmODQ5OCwgMHgwZjMwYjIsIDB4NDlhNGRjLCAweDBmMjBiNCwgMHg1M2M0OWMsIDB4MGI2MGNiLAorICAgIDB4NDllNTdhLCAweDBiODBlMCwgMHgwYjkxMDksIDB4NWU0NGE0LCAweDU0ODRhNiwgMHg0YWM0YWUsIDB4NGI0NGNhLAorICAgIDB4NGQ2NGI2LCAweDRiYTVkYSwgMHgwYzYwYzAsIDB4NGJjNTFlLCAweDRiZTU1NiwgMHg2MjA0YzAsIDB4NGMyNGM0LAorICAgIDB4MGY4MGM1LCAweDU2NjRjNiwgMHg0Y2M1M2EsIDB4NGQ0NjJjLCAweDBmMTBjOSwgMHg0ZDg1NTIsIDB4NGRhNGZhLAorICAgIDB4NWJlNGUwLCAweDBjZDBmZiwgMHg1MjQ0ZTIsIDB4MGNmMGU4LCAweDRlNjU2OCwgMHg1OWE0ZTgsIDB4MGY5MGQyLAorICAgIDB4MTAxMGQzLCAweDVhYzRlYSwgMHgwZDUwZDcsIDB4NGVjNjM0LCAweDRlZTU2MCwgMHg0ZjQ0ZjAsIDB4NGY2NjM4LAorICAgIDB4NTAyNTIyLCAweDBkYjBkYywgMHg1MDY1YTYsIDB4NTA4NjA0LCAweDYwMDUwYSwgMHg1MGMwZmIsIDB4NjMyNTBlLAorICAgIDB4MTEzMGUxLCAweDVhNDUxMCwgMHg1MTI1ZmMsIDB4NTE2NTE0LCAweDUxODYzZSwgMHg1MWM1MzYsIDB4MGU3MGY0LAorICAgIDB4NTVjNTIwLCAweDYwMjUyNiwgMHgwZWIwZWEsIDB4NWNjNTI4LCAweDVlYTUyYSwgMHgxMTQwZWQsIDB4NjBjNTJjLAorICAgIDB4MTAyMGVmLCAweDBmMDExOSwgMHg1OGU1MmUsIDB4NTMwNjIyLCAweDU1ODUzNCwgMHg1Mzg2MWUsIDB4NTVlNTQwLAorICAgIDB4NTgwMGY2LCAweDU3ZTU0MiwgMHg1NDQ1ZTYsIDB4NTQ2NWU4LCAweDBmYTExNSwgMHg1NGM1NGEsIDB4NTRlNjBlLAorICAgIDB4NWFlNTUwLCAweDExNjBmZSwgMHg1ZjA1NTQsIDB4NTY0NTYyLCAweDU2YTU4YSwgMHg1NmU1ZWUsIDB4MTAzMTBjLAorICAgIDB4NTcwNWQwLCAweDEwNzEwNSwgMHg1NzI1ZDQsIDB4NTc0NjNhLCAweDU3NjViNCwgMHg1ODI1YmMsIDB4NTg0NWUyLAorICAgIDB4NTg4NWRlLCAweDU4YzU5MiwgMHg1Y2U1OTAsIDB4NTk0NWY2LCAweDYzYzU5NiwgMHgxMWIxMTAsIDB4NWQ4NTk4LAorICAgIDB4NWMyNTllLCAweDVlMDVhMCwgMHg1YTI1YzYsIDB4NWE4NjBhLCAweDVhYTVlYywgMHg1YjI2MTAsIDB4MTFhMTE4LAorICAgIDB4NjE4NWI2LCAweDVmMjVkMiwgMHg1ZDY2MTYsIDB4NWRjNWY4LCAweDYxYTVmZSwgMHg2MTI2MTQsIDB4NjJlNjI0LAorICAgIDB4NjI2NjI4fTsKIAotLyogZ2V0IHN0YXJ0aW5nIGFkZHJlc3NlcyBvZiBodWZmbWFuIHRhYmxlcyBpbnRvIGFuIGFycmF5IFtjb252ZXJ0IGNvZGVib29rIGludG8gc3RhcnRpbmcgYWRkcmVzc10gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYiAgICB0cmVlICovCi1jb25zdCBVSU5UICAgKmFIdWZmVGFibGVbTUFYX0NCXSA9IHthSHVmZlRyZWU0MSwgIC8qIDAgICAgICAtICAgKi8gIC8qIHVzZSB0cmVlIDEgYXMgZHVtbXkgaGVyZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlNDEsICAvKiAxICAgICAgMSAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWU0MiwgIC8qIDIgICAgICAyICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTQzLCAgLyogMyAgICAgIDMgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlNDQsICAvKiA0ICAgICAgNCAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyMSwgIC8qIDUgICAgICA1ICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTIyLCAgLyogNiAgICAgIDYgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjMsICAvKiA3ICAgICAgNyAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNCwgIC8qIDggICAgICA4ICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI1LCAgLyogOSAgICAgIDkgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjYsICAvKiAxMCAgICAgMTAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNywgIC8qIDExICAgICAxMSAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTQxLCAgLyogMTIgICAgIC0gICAqLyAgLyogdXNlIHRyZWUgMSBhcyBkdW1teSBoZXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWU0MSwgIC8qIDEzICAgICAtICAgKi8gIC8qIHVzZSB0cmVlIDEgYXMgZHVtbXkgaGVyZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlNDEsICAvKiAxNCAgICAgLSAgICovICAvKiB1c2UgdHJlZSAxIGFzIGR1bW15IGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTQxLCAgLyogMTUgICAgIC0gICAqLyAgLyogdXNlIHRyZWUgMSBhcyBkdW1teSBoZXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNywgIC8qIDE2ICAgICAxMSAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI3LCAgLyogMTcgICAgIDExICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjcsICAvKiAxOCAgICAgMTEgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNywgIC8qIDE5ICAgICAxMSAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI3LCAgLyogMjAgICAgIDExICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjcsICAvKiAyMSAgICAgMTEgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNywgIC8qIDIyICAgICAxMSAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI3LCAgLyogMjMgICAgIDExICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjcsICAvKiAyNCAgICAgMTEgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNywgIC8qIDI1ICAgICAxMSAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI3LCAgLyogMjYgICAgIDExICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjcsICAvKiAyNyAgICAgMTEgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyNywgIC8qIDI4ICAgICAxMSAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIdWZmVHJlZTI3LCAgLyogMjkgICAgIDExICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUh1ZmZUcmVlMjcsICAvKiAzMCAgICAgMTEgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHVmZlRyZWUyN307IC8qIDMxICAgICAxMSAgKi8KKy8qIGdldCBzdGFydGluZyBhZGRyZXNzZXMgb2YgaHVmZm1hbiB0YWJsZXMgaW50byBhbiBhcnJheSBbY29udmVydCBjb2RlYm9vayBpbnRvCisgKiBzdGFydGluZyBhZGRyZXNzXSAqLworLyogY2IgICAgdHJlZSAqLworY29uc3QgVUlOVCAqYUh1ZmZUYWJsZVtNQVhfQ0JdID0geworICAgIGFIdWZmVHJlZTQxLAorICAgIC8qIDAgICAgICAtICAgKi8gLyogdXNlIHRyZWUgMSBhcyBkdW1teSBoZXJlICovCisgICAgYUh1ZmZUcmVlNDEsICAgICAvKiAxICAgICAgMSAgICovCisgICAgYUh1ZmZUcmVlNDIsICAgICAvKiAyICAgICAgMiAgICovCisgICAgYUh1ZmZUcmVlNDMsICAgICAvKiAzICAgICAgMyAgICovCisgICAgYUh1ZmZUcmVlNDQsICAgICAvKiA0ICAgICAgNCAgICovCisgICAgYUh1ZmZUcmVlMjEsICAgICAvKiA1ICAgICAgNSAgICovCisgICAgYUh1ZmZUcmVlMjIsICAgICAvKiA2ICAgICAgNiAgICovCisgICAgYUh1ZmZUcmVlMjMsICAgICAvKiA3ICAgICAgNyAgICovCisgICAgYUh1ZmZUcmVlMjQsICAgICAvKiA4ICAgICAgOCAgICovCisgICAgYUh1ZmZUcmVlMjUsICAgICAvKiA5ICAgICAgOSAgICovCisgICAgYUh1ZmZUcmVlMjYsICAgICAvKiAxMCAgICAgMTAgICovCisgICAgYUh1ZmZUcmVlMjcsICAgICAvKiAxMSAgICAgMTEgICovCisgICAgYUh1ZmZUcmVlNDEsCisgICAgLyogMTIgICAgIC0gICAqLyAvKiB1c2UgdHJlZSAxIGFzIGR1bW15IGhlcmUgKi8KKyAgICBhSHVmZlRyZWU0MSwKKyAgICAvKiAxMyAgICAgLSAgICovIC8qIHVzZSB0cmVlIDEgYXMgZHVtbXkgaGVyZSAqLworICAgIGFIdWZmVHJlZTQxLAorICAgIC8qIDE0ICAgICAtICAgKi8gLyogdXNlIHRyZWUgMSBhcyBkdW1teSBoZXJlICovCisgICAgYUh1ZmZUcmVlNDEsCisgICAgLyogMTUgICAgIC0gICAqLyAvKiB1c2UgdHJlZSAxIGFzIGR1bW15IGhlcmUgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDE2ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDE3ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDE4ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDE5ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDIwICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDIxICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDIyICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDIzICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDI0ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDI1ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDI2ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDI3ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDI4ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDI5ICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyNywgICAgIC8qIDMwICAgICAxMSAgKi8KKyAgICBhSHVmZlRyZWUyN307ICAgIC8qIDMxICAgICAxMSAgKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGRhdGEtZGVzY3JpcHRpb246Ci0gIFRoZSBmb2xsb3dpbmcgdGFibGVzIGNvbnRhaW4gdGhlIHF1YW50aXplZCB2YWx1ZXMuIFR3byBvciBmb3VyIG9mIHRoZSBxdWFudGl6ZWQgdmFsdWVzIGFyZQotICBpbmRleGVkIGJ5IHRoZSByZXN1bHQgb2YgdGhlIGRlY29kaW5nIGluIHRoZSBkZWNvZGluZyB0cmVlIChzZWUgdGFibGVzIGFib3ZlKS4KLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICBUaGUgZm9sbG93aW5nIHRhYmxlcyBjb250YWluIHRoZSBxdWFudGl6ZWQgdmFsdWVzLiBUd28gb3IgZm91ciBvZiB0aGUKKyBxdWFudGl6ZWQgdmFsdWVzIGFyZSBpbmRleGVkIGJ5IHRoZSByZXN1bHQgb2YgdGhlIGRlY29kaW5nIGluIHRoZSBkZWNvZGluZyB0cmVlCisgKHNlZSB0YWJsZXMgYWJvdmUpLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAgVGFibGU6IFZhbFRhYjQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgZGVzY3JpcHRpb246ICAgIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIHF1YW50aXplZCB2YWx1ZXMgZm9yIGNvZGVib29rcyAxLTIuICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWNvbnN0IFNDSEFSICBhVmFsVGFiNDFbMzI0XT17LTEsLTEsLTEsLTEsLTEsLTEsLTEsMCwtMSwtMSwtMSwxLC0xLC0xLDAsLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLDAsMCwtMSwtMSwwLDEsLTEsLTEsMSwtMSwtMSwtMSwxLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLDEsMSwtMSwwLC0xLC0xLC0xLDAsLTEsMCwtMSwwLC0xLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLDAsMCwtMSwtMSwwLDAsMCwtMSwwLDAsMSwtMSwwLDEsLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLDAsMSwwLC0xLDAsMSwxLC0xLDEsLTEsLTEsLTEsMSwtMSwwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwxLC0xLDEsLTEsMSwwLC0xLC0xLDEsMCwwLC0xLDEsMCwxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwxLDEsLTEsLTEsMSwxLDAsLTEsMSwxLDEsMCwtMSwtMSwtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwtMSwtMSwwLDAsLTEsLTEsMSwwLC0xLDAsLTEsMCwtMSwwLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsLTEsMCwxLDAsLTEsMSwtMSwwLC0xLDEsMCwwLC0xLDEsMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwLC0xLC0xLDAsMCwtMSwwLDAsMCwtMSwxLDAsMCwwLC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLDAsMCwwLDAsMCwwLDEsMCwwLDEsLTEsMCwwLDEsMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwLDEsMSwwLDEsLTEsLTEsMCwxLC0xLDAsMCwxLC0xLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMSwwLC0xLDAsMSwwLDAsMCwxLDAsMSwwLDEsMSwtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwxLDEsMCwwLDEsMSwxLDEsLTEsLTEsLTEsMSwtMSwtMSwwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLC0xLC0xLDEsMSwtMSwwLC0xLDEsLTEsMCwwLDEsLTEsMCwxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLC0xLDEsLTEsMSwtMSwxLDAsMSwtMSwxLDEsMSwwLC0xLC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLDAsLTEsMCwxLDAsLTEsMSwxLDAsMCwtMSwxLDAsMCwwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLDAsMCwxLDEsMCwxLC0xLDEsMCwxLDAsMSwwLDEsMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwxLC0xLC0xLDEsMSwtMSwwLDEsMSwtMSwxLDEsMSwwLC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLDEsMCwwLDEsMSwwLDEsMSwxLDEsLTEsMSwxLDEsMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwxLDEsMX07CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworLyogIFRhYmxlOiBWYWxUYWI0MSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgdmFsdWVzIGZvciBjb2RlYm9va3MKKyAqIDEtMi4gICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitjb25zdCBTQ0hBUiBhVmFsVGFiNDFbMzI0XSA9IHsKKyAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMCwgIC0xLCAtMSwgLTEsIDEsICAtMSwgLTEsIDAsICAtMSwgLTEsIC0xLAorICAgIDAsICAwLCAgLTEsIC0xLCAwLCAgMSwgIC0xLCAtMSwgMSwgIC0xLCAtMSwgLTEsIDEsICAwLCAgLTEsIC0xLCAxLCAgMSwKKyAgICAtMSwgMCwgIC0xLCAtMSwgLTEsIDAsICAtMSwgMCwgIC0xLCAwLCAgLTEsIDEsICAtMSwgMCwgIDAsICAtMSwgLTEsIDAsCisgICAgMCwgIDAsICAtMSwgMCwgIDAsICAxLCAgLTEsIDAsICAxLCAgLTEsIC0xLCAwLCAgMSwgIDAsICAtMSwgMCwgIDEsICAxLAorICAgIC0xLCAxLCAgLTEsIC0xLCAtMSwgMSwgIC0xLCAwLCAgLTEsIDEsICAtMSwgMSwgIC0xLCAxLCAgMCwgIC0xLCAtMSwgMSwKKyAgICAwLCAgMCwgIC0xLCAxLCAgMCwgIDEsICAtMSwgMSwgIDEsICAtMSwgLTEsIDEsICAxLCAgMCwgIC0xLCAxLCAgMSwgIDEsCisgICAgMCwgIC0xLCAtMSwgLTEsIDAsICAtMSwgLTEsIDAsICAwLCAgLTEsIC0xLCAxLCAgMCwgIC0xLCAwLCAgLTEsIDAsICAtMSwKKyAgICAwLCAgMCwgIDAsICAtMSwgMCwgIDEsICAwLCAgLTEsIDEsICAtMSwgMCwgIC0xLCAxLCAgMCwgIDAsICAtMSwgMSwgIDEsCisgICAgMCwgIDAsICAtMSwgLTEsIDAsICAwLCAgLTEsIDAsICAwLCAgMCwgIC0xLCAxLCAgMCwgIDAsICAwLCAgLTEsIDAsICAwLAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIC0xLCAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICAxLCAgMSwKKyAgICAwLCAgMSwgIC0xLCAtMSwgMCwgIDEsICAtMSwgMCwgIDAsICAxLCAgLTEsIDEsICAwLCAgMSwgIDAsICAtMSwgMCwgIDEsCisgICAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgLTEsIDAsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLAorICAgIDEsICAtMSwgLTEsIC0xLCAxLCAgLTEsIC0xLCAwLCAgMSwgIC0xLCAtMSwgMSwgIDEsICAtMSwgMCwgIC0xLCAxLCAgLTEsCisgICAgMCwgIDAsICAxLCAgLTEsIDAsICAxLCAgMSwgIC0xLCAxLCAgLTEsIDEsICAtMSwgMSwgIDAsICAxLCAgLTEsIDEsICAxLAorICAgIDEsICAwLCAgLTEsIC0xLCAxLCAgMCwgIC0xLCAwLCAgMSwgIDAsICAtMSwgMSwgIDEsICAwLCAgMCwgIC0xLCAxLCAgMCwKKyAgICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEsICAtMSwgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsCisgICAgMSwgIDEsICAtMSwgLTEsIDEsICAxLCAgLTEsIDAsICAxLCAgMSwgIC0xLCAxLCAgMSwgIDEsICAwLCAgLTEsIDEsICAxLAorICAgIDAsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIC0xLCAxLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMX07CiAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogIFRhYmxlOiBWYWxUYWI0MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgdmFsdWVzIGZvciBjb2RlYm9va3MgMy00LiAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1jb25zdCBTQ0hBUiAgYVZhbFRhYjQyWzMyNF09ezAsMCwwLDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwxLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMCwxLDEsMCwwLDEsMiwwLDAsMiwwLDAsMCwyLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMCwyLDIsMCwxLDAsMCwwLDEsMCwxLDAsMSwwLDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMSwxLDAsMCwxLDEsMSwwLDEsMSwyLDAsMSwyLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMSwyLDEsMCwxLDIsMiwwLDIsMCwwLDAsMiwwLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMiwwLDIsMCwyLDEsMCwwLDIsMSwxLDAsMiwxLDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMiwyLDAsMCwyLDIsMSwwLDIsMiwyLDEsMCwwLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMCwwLDEsMSwwLDAsMiwxLDAsMSwwLDEsMCwxLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMCwxLDIsMSwwLDIsMCwxLDAsMiwxLDEsMCwyLDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMSwwLDAsMSwxLDAsMSwxLDEsMCwyLDEsMSwxLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMSwxLDEsMSwxLDEsMiwxLDEsMiwwLDEsMSwyLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMSwyLDIsMSwyLDAsMCwxLDIsMCwxLDEsMiwwLDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMiwxLDAsMSwyLDEsMSwxLDIsMSwyLDEsMiwyLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMiwyLDEsMSwyLDIsMiwyLDAsMCwwLDIsMCwwLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsMCwwLDIsMiwwLDEsMCwyLDAsMSwxLDIsMCwxLDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsMCwyLDAsMiwwLDIsMSwyLDAsMiwyLDIsMSwwLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsMSwwLDEsMiwxLDAsMiwyLDEsMSwwLDIsMSwxLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsMSwxLDIsMiwxLDIsMCwyLDEsMiwxLDIsMSwyLDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsMiwwLDAsMiwyLDAsMSwyLDIsMCwyLDIsMiwxLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsMiwxLDEsMiwyLDEsMiwyLDIsMiwwLDIsMiwyLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsMiwyLDJ9OworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKy8qICBUYWJsZTogVmFsVGFiNDIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgcXVhbnRpemVkIHZhbHVlcyBmb3IgY29kZWJvb2tzCisgKiAzLTQuICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworY29uc3QgU0NIQVIgYVZhbFRhYjQyWzMyNF0gPSB7CisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMiwgMCwgMCwgMSwgMCwgMCwgMCwgMSwgMSwgMCwgMCwgMSwgMiwgMCwKKyAgICAwLCAyLCAwLCAwLCAwLCAyLCAxLCAwLCAwLCAyLCAyLCAwLCAxLCAwLCAwLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAyLCAwLCAxLAorICAgIDEsIDAsIDAsIDEsIDEsIDEsIDAsIDEsIDEsIDIsIDAsIDEsIDIsIDAsIDAsIDEsIDIsIDEsIDAsIDEsIDIsIDIsIDAsIDIsIDAsCisgICAgMCwgMCwgMiwgMCwgMSwgMCwgMiwgMCwgMiwgMCwgMiwgMSwgMCwgMCwgMiwgMSwgMSwgMCwgMiwgMSwgMiwgMCwgMiwgMiwgMCwKKyAgICAwLCAyLCAyLCAxLCAwLCAyLCAyLCAyLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAxLCAxLCAwLCAwLCAyLCAxLCAwLCAxLCAwLCAxLAorICAgIDAsIDEsIDEsIDEsIDAsIDEsIDIsIDEsIDAsIDIsIDAsIDEsIDAsIDIsIDEsIDEsIDAsIDIsIDIsIDEsIDEsIDAsIDAsIDEsIDEsCisgICAgMCwgMSwgMSwgMSwgMCwgMiwgMSwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMSwgMSwgMiwgMCwgMSwgMSwgMiwKKyAgICAxLCAxLCAxLCAyLCAyLCAxLCAyLCAwLCAwLCAxLCAyLCAwLCAxLCAxLCAyLCAwLCAyLCAxLCAyLCAxLCAwLCAxLCAyLCAxLCAxLAorICAgIDEsIDIsIDEsIDIsIDEsIDIsIDIsIDAsIDEsIDIsIDIsIDEsIDEsIDIsIDIsIDIsIDIsIDAsIDAsIDAsIDIsIDAsIDAsIDEsIDIsCisgICAgMCwgMCwgMiwgMiwgMCwgMSwgMCwgMiwgMCwgMSwgMSwgMiwgMCwgMSwgMiwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMSwgMiwgMCwKKyAgICAyLCAyLCAyLCAxLCAwLCAwLCAyLCAxLCAwLCAxLCAyLCAxLCAwLCAyLCAyLCAxLCAxLCAwLCAyLCAxLCAxLCAxLCAyLCAxLCAxLAorICAgIDIsIDIsIDEsIDIsIDAsIDIsIDEsIDIsIDEsIDIsIDEsIDIsIDIsIDIsIDIsIDAsIDAsIDIsIDIsIDAsIDEsIDIsIDIsIDAsIDIsCisgICAgMiwgMiwgMSwgMCwgMiwgMiwgMSwgMSwgMiwgMiwgMSwgMiwgMiwgMiwgMiwgMCwgMiwgMiwgMiwgMSwgMiwgMiwgMiwgMn07CiAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogIFRhYmxlOiBWYWxUYWIyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgdmFsdWVzIGZvciBjb2RlYm9va3MgNS02LiAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1jb25zdCBTQ0hBUiAgYVZhbFRhYjIxWzE2Ml09ey00LC00LC00LC0zLC00LC0yLC00LC0xLC00LDAsLTQsMSwtNCwyLC00LDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00LDQsLTMsLTQsLTMsLTMsLTMsLTIsLTMsLTEsLTMsMCwtMywxLC0zLDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zLDMsLTMsNCwtMiwtNCwtMiwtMywtMiwtMiwtMiwtMSwtMiwwLC0yLDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLDIsLTIsMywtMiw0LC0xLC00LC0xLC0zLC0xLC0yLC0xLC0xLC0xLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLDEsLTEsMiwtMSwzLC0xLDQsMCwtNCwwLC0zLDAsLTIsMCwtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwLDAsMSwwLDIsMCwzLDAsNCwxLC00LDEsLTMsMSwtMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwtMSwxLDAsMSwxLDEsMiwxLDMsMSw0LDIsLTQsMiwtMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwtMiwyLC0xLDIsMCwyLDEsMiwyLDIsMywyLDQsMywtNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywtMywzLC0yLDMsLTEsMywwLDMsMSwzLDIsMywzLDMsNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwtNCw0LC0zLDQsLTIsNCwtMSw0LDAsNCwxLDQsMiw0LDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsNH07CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworLyogIFRhYmxlOiBWYWxUYWIyMSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgdmFsdWVzIGZvciBjb2RlYm9va3MKKyAqIDUtNi4gICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitjb25zdCBTQ0hBUiBhVmFsVGFiMjFbMTYyXSA9IHsKKyAgICAtNCwgLTQsIC00LCAtMywgLTQsIC0yLCAtNCwgLTEsIC00LCAwLCAtNCwgMSwgLTQsIDIsIC00LCAzLCAtNCwgNCwKKyAgICAtMywgLTQsIC0zLCAtMywgLTMsIC0yLCAtMywgLTEsIC0zLCAwLCAtMywgMSwgLTMsIDIsIC0zLCAzLCAtMywgNCwKKyAgICAtMiwgLTQsIC0yLCAtMywgLTIsIC0yLCAtMiwgLTEsIC0yLCAwLCAtMiwgMSwgLTIsIDIsIC0yLCAzLCAtMiwgNCwKKyAgICAtMSwgLTQsIC0xLCAtMywgLTEsIC0yLCAtMSwgLTEsIC0xLCAwLCAtMSwgMSwgLTEsIDIsIC0xLCAzLCAtMSwgNCwKKyAgICAwLCAgLTQsIDAsICAtMywgMCwgIC0yLCAwLCAgLTEsIDAsICAwLCAwLCAgMSwgMCwgIDIsIDAsICAzLCAwLCAgNCwKKyAgICAxLCAgLTQsIDEsICAtMywgMSwgIC0yLCAxLCAgLTEsIDEsICAwLCAxLCAgMSwgMSwgIDIsIDEsICAzLCAxLCAgNCwKKyAgICAyLCAgLTQsIDIsICAtMywgMiwgIC0yLCAyLCAgLTEsIDIsICAwLCAyLCAgMSwgMiwgIDIsIDIsICAzLCAyLCAgNCwKKyAgICAzLCAgLTQsIDMsICAtMywgMywgIC0yLCAzLCAgLTEsIDMsICAwLCAzLCAgMSwgMywgIDIsIDMsICAzLCAzLCAgNCwKKyAgICA0LCAgLTQsIDQsICAtMywgNCwgIC0yLCA0LCAgLTEsIDQsICAwLCA0LCAgMSwgNCwgIDIsIDQsICAzLCA0LCAgNH07CiAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogIFRhYmxlOiBWYWxUYWIyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgdmFsdWVzIGZvciBjb2RlYm9va3MgNy04LiAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1jb25zdCBTQ0hBUiAgYVZhbFRhYjIyWzEyOF09ezAsMCwwLDEsMCwyLDAsMywwLDQsMCw1LDAsNiwwLDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsMCwxLDEsMSwyLDEsMywxLDQsMSw1LDEsNiwxLDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsMCwyLDEsMiwyLDIsMywyLDQsMiw1LDIsNiwyLDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsMCwzLDEsMywyLDMsMywzLDQsMyw1LDMsNiwzLDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsMCw0LDEsNCwyLDQsMyw0LDQsNCw1LDQsNiw0LDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsMCw1LDEsNSwyLDUsMyw1LDQsNSw1LDUsNiw1LDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsMCw2LDEsNiwyLDYsMyw2LDQsNiw1LDYsNiw2LDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsMCw3LDEsNywyLDcsMyw3LDQsNyw1LDcsNiw3LDd9OworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKy8qICBUYWJsZTogVmFsVGFiMjIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgcXVhbnRpemVkIHZhbHVlcyBmb3IgY29kZWJvb2tzCisgKiA3LTguICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworY29uc3QgU0NIQVIgYVZhbFRhYjIyWzEyOF0gPSB7CisgICAgMCwgMCwgMCwgMSwgMCwgMiwgMCwgMywgMCwgNCwgMCwgNSwgMCwgNiwgMCwgNywgMSwgMCwgMSwgMSwgMSwgMiwKKyAgICAxLCAzLCAxLCA0LCAxLCA1LCAxLCA2LCAxLCA3LCAyLCAwLCAyLCAxLCAyLCAyLCAyLCAzLCAyLCA0LCAyLCA1LAorICAgIDIsIDYsIDIsIDcsIDMsIDAsIDMsIDEsIDMsIDIsIDMsIDMsIDMsIDQsIDMsIDUsIDMsIDYsIDMsIDcsIDQsIDAsCisgICAgNCwgMSwgNCwgMiwgNCwgMywgNCwgNCwgNCwgNSwgNCwgNiwgNCwgNywgNSwgMCwgNSwgMSwgNSwgMiwgNSwgMywKKyAgICA1LCA0LCA1LCA1LCA1LCA2LCA1LCA3LCA2LCAwLCA2LCAxLCA2LCAyLCA2LCAzLCA2LCA0LCA2LCA1LCA2LCA2LAorICAgIDYsIDcsIDcsIDAsIDcsIDEsIDcsIDIsIDcsIDMsIDcsIDQsIDcsIDUsIDcsIDYsIDcsIDd9OwogCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICBUYWJsZTogVmFsVGFiMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgcXVhbnRpemVkIHZhbHVlcyBmb3IgY29kZWJvb2tzIDktMTAuICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotY29uc3QgU0NIQVIgIGFWYWxUYWIyM1szMzhdPXswLDAsMCwxLDAsMiwwLDMsMCw0LDAsNSwwLDYsMCw3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLDgsMCw5LDAsMTAsMCwxMSwwLDEyLDEsMCwxLDEsMSwyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLDMsMSw0LDEsNSwxLDYsMSw3LDEsOCwxLDksMSwxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwxMSwxLDEyLDIsMCwyLDEsMiwyLDIsMywyLDQsMiw1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLDYsMiw3LDIsOCwyLDksMiwxMCwyLDExLDIsMTIsMywwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLDEsMywyLDMsMywzLDQsMyw1LDMsNiwzLDcsMyw4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLDksMywxMCwzLDExLDMsMTIsNCwwLDQsMSw0LDIsNCwzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LDQsNCw1LDQsNiw0LDcsNCw4LDQsOSw0LDEwLDQsMTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsMTIsNSwwLDUsMSw1LDIsNSwzLDUsNCw1LDUsNSw2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LDcsNSw4LDUsOSw1LDEwLDUsMTEsNSwxMiw2LDAsNiwxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LDIsNiwzLDYsNCw2LDUsNiw2LDYsNyw2LDgsNiw5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LDEwLDYsMTEsNiwxMiw3LDAsNywxLDcsMiw3LDMsNyw0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LDUsNyw2LDcsNyw3LDgsNyw5LDcsMTAsNywxMSw3LDEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LDAsOCwxLDgsMiw4LDMsOCw0LDgsNSw4LDYsOCw3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LDgsOCw5LDgsMTAsOCwxMSw4LDEyLDksMCw5LDEsOSwyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LDMsOSw0LDksNSw5LDYsOSw3LDksOCw5LDksOSwxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwxMSw5LDEyLDEwLDAsMTAsMSwxMCwyLDEwLDMsMTAsNCwxMCw1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCw2LDEwLDcsMTAsOCwxMCw5LDEwLDEwLDEwLDExLDEwLDEyLDExLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExLDEsMTEsMiwxMSwzLDExLDQsMTEsNSwxMSw2LDExLDcsMTEsOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEsOSwxMSwxMCwxMSwxMSwxMSwxMiwxMiwwLDEyLDEsMTIsMiwxMiwzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiw0LDEyLDUsMTIsNiwxMiw3LDEyLDgsMTIsOSwxMiwxMCwxMiwxMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsMTJ9OworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKy8qICBUYWJsZTogVmFsVGFiMjMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiAgICBkZXNjcmlwdGlvbjogICAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgcXVhbnRpemVkIHZhbHVlcyBmb3IgY29kZWJvb2tzCisgKiA5LTEwLiAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworY29uc3QgU0NIQVIgYVZhbFRhYjIzWzMzOF0gPSB7CisgICAgMCwgIDAsICAwLCAgMSwgIDAsICAyLCAgMCwgIDMsICAwLCAgNCwgIDAsICA1LCAgMCwgIDYsICAwLCAgNywgIDAsICA4LCAgMCwKKyAgICA5LCAgMCwgIDEwLCAwLCAgMTEsIDAsICAxMiwgMSwgIDAsICAxLCAgMSwgIDEsICAyLCAgMSwgIDMsICAxLCAgNCwgIDEsICA1LAorICAgIDEsICA2LCAgMSwgIDcsICAxLCAgOCwgIDEsICA5LCAgMSwgIDEwLCAxLCAgMTEsIDEsICAxMiwgMiwgIDAsICAyLCAgMSwgIDIsCisgICAgMiwgIDIsICAzLCAgMiwgIDQsICAyLCAgNSwgIDIsICA2LCAgMiwgIDcsICAyLCAgOCwgIDIsICA5LCAgMiwgIDEwLCAyLCAgMTEsCisgICAgMiwgIDEyLCAzLCAgMCwgIDMsICAxLCAgMywgIDIsICAzLCAgMywgIDMsICA0LCAgMywgIDUsICAzLCAgNiwgIDMsICA3LCAgMywKKyAgICA4LCAgMywgIDksICAzLCAgMTAsIDMsICAxMSwgMywgIDEyLCA0LCAgMCwgIDQsICAxLCAgNCwgIDIsICA0LCAgMywgIDQsICA0LAorICAgIDQsICA1LCAgNCwgIDYsICA0LCAgNywgIDQsICA4LCAgNCwgIDksICA0LCAgMTAsIDQsICAxMSwgNCwgIDEyLCA1LCAgMCwgIDUsCisgICAgMSwgIDUsICAyLCAgNSwgIDMsICA1LCAgNCwgIDUsICA1LCAgNSwgIDYsICA1LCAgNywgIDUsICA4LCAgNSwgIDksICA1LCAgMTAsCisgICAgNSwgIDExLCA1LCAgMTIsIDYsICAwLCAgNiwgIDEsICA2LCAgMiwgIDYsICAzLCAgNiwgIDQsICA2LCAgNSwgIDYsICA2LCAgNiwKKyAgICA3LCAgNiwgIDgsICA2LCAgOSwgIDYsICAxMCwgNiwgIDExLCA2LCAgMTIsIDcsICAwLCAgNywgIDEsICA3LCAgMiwgIDcsICAzLAorICAgIDcsICA0LCAgNywgIDUsICA3LCAgNiwgIDcsICA3LCAgNywgIDgsICA3LCAgOSwgIDcsICAxMCwgNywgIDExLCA3LCAgMTIsIDgsCisgICAgMCwgIDgsICAxLCAgOCwgIDIsICA4LCAgMywgIDgsICA0LCAgOCwgIDUsICA4LCAgNiwgIDgsICA3LCAgOCwgIDgsICA4LCAgOSwKKyAgICA4LCAgMTAsIDgsICAxMSwgOCwgIDEyLCA5LCAgMCwgIDksICAxLCAgOSwgIDIsICA5LCAgMywgIDksICA0LCAgOSwgIDUsICA5LAorICAgIDYsICA5LCAgNywgIDksICA4LCAgOSwgIDksICA5LCAgMTAsIDksICAxMSwgOSwgIDEyLCAxMCwgMCwgIDEwLCAxLCAgMTAsIDIsCisgICAgMTAsIDMsICAxMCwgNCwgIDEwLCA1LCAgMTAsIDYsICAxMCwgNywgIDEwLCA4LCAgMTAsIDksICAxMCwgMTAsIDEwLCAxMSwgMTAsCisgICAgMTIsIDExLCAwLCAgMTEsIDEsICAxMSwgMiwgIDExLCAzLCAgMTEsIDQsICAxMSwgNSwgIDExLCA2LCAgMTEsIDcsICAxMSwgOCwKKyAgICAxMSwgOSwgIDExLCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLCAwLCAgMTIsIDEsICAxMiwgMiwgIDEyLCAzLCAgMTIsIDQsICAxMiwKKyAgICA1LCAgMTIsIDYsICAxMiwgNywgIDEyLCA4LCAgMTIsIDksICAxMiwgMTAsIDEyLCAxMSwgMTIsIDEyfTsKIAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAgVGFibGU6IFZhbFRhYjI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogICAgZGVzY3JpcHRpb246ICAgIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIHF1YW50aXplZCB2YWx1ZXMgZm9yIGNvZGVib29rcyAxMS4gICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWNvbnN0IFNDSEFSICBhVmFsVGFiMjRbNTc4XT17MCwwLDAsMSwwLDIsMCwzLDAsNCwwLDUsMCw2LDAsNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCw4LDAsOSwwLDEwLDAsMTEsMCwxMiwwLDEzLDAsMTQsMCwxNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwxNiwxLDAsMSwxLDEsMiwxLDMsMSw0LDEsNSwxLDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsNywxLDgsMSw5LDEsMTAsMSwxMSwxLDEyLDEsMTMsMSwxNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwxNSwxLDE2LDIsMCwyLDEsMiwyLDIsMywyLDQsMiw1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLDYsMiw3LDIsOCwyLDksMiwxMCwyLDExLDIsMTIsMiwxMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwxNCwyLDE1LDIsMTYsMywwLDMsMSwzLDIsMywzLDMsNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyw1LDMsNiwzLDcsMyw4LDMsOSwzLDEwLDMsMTEsMywxMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywxMywzLDE0LDMsMTUsMywxNiw0LDAsNCwxLDQsMiw0LDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsNCw0LDUsNCw2LDQsNyw0LDgsNCw5LDQsMTAsNCwxMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwxMiw0LDEzLDQsMTQsNCwxNSw0LDE2LDUsMCw1LDEsNSwyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LDMsNSw0LDUsNSw1LDYsNSw3LDUsOCw1LDksNSwxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwxMSw1LDEyLDUsMTMsNSwxNCw1LDE1LDUsMTYsNiwwLDYsMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwyLDYsMyw2LDQsNiw1LDYsNiw2LDcsNiw4LDYsOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwxMCw2LDExLDYsMTIsNiwxMyw2LDE0LDYsMTUsNiwxNiw3LDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsMSw3LDIsNywzLDcsNCw3LDUsNyw2LDcsNyw3LDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsOSw3LDEwLDcsMTEsNywxMiw3LDEzLDcsMTQsNywxNSw3LDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LDAsOCwxLDgsMiw4LDMsOCw0LDgsNSw4LDYsOCw3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LDgsOCw5LDgsMTAsOCwxMSw4LDEyLDgsMTMsOCwxNCw4LDE1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LDE2LDksMCw5LDEsOSwyLDksMyw5LDQsOSw1LDksNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSw3LDksOCw5LDksOSwxMCw5LDExLDksMTIsOSwxMyw5LDE0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LDE1LDksMTYsMTAsMCwxMCwxLDEwLDIsMTAsMywxMCw0LDEwLDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLDYsMTAsNywxMCw4LDEwLDksMTAsMTAsMTAsMTEsMTAsMTIsMTAsMTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLDE0LDEwLDE1LDEwLDE2LDExLDAsMTEsMSwxMSwyLDExLDMsMTEsNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEsNSwxMSw2LDExLDcsMTEsOCwxMSw5LDExLDEwLDExLDExLDExLDEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSwxMywxMSwxNCwxMSwxNSwxMSwxNiwxMiwwLDEyLDEsMTIsMiwxMiwzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiw0LDEyLDUsMTIsNiwxMiw3LDEyLDgsMTIsOSwxMiwxMCwxMiwxMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsMTIsMTIsMTMsMTIsMTQsMTIsMTUsMTIsMTYsMTMsMCwxMywxLDEzLDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzLDMsMTMsNCwxMyw1LDEzLDYsMTMsNywxMyw4LDEzLDksMTMsMTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzLDExLDEzLDEyLDEzLDEzLDEzLDE0LDEzLDE1LDEzLDE2LDE0LDAsMTQsMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQsMiwxNCwzLDE0LDQsMTQsNSwxNCw2LDE0LDcsMTQsOCwxNCw5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNCwxMCwxNCwxMSwxNCwxMiwxNCwxMywxNCwxNCwxNCwxNSwxNCwxNiwxNSwwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwxLDE1LDIsMTUsMywxNSw0LDE1LDUsMTUsNiwxNSw3LDE1LDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LDksMTUsMTAsMTUsMTEsMTUsMTIsMTUsMTMsMTUsMTQsMTUsMTUsMTUsMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LDAsMTYsMSwxNiwyLDE2LDMsMTYsNCwxNiw1LDE2LDYsMTYsNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsOCwxNiw5LDE2LDEwLDE2LDExLDE2LDEyLDE2LDEzLDE2LDE0LDE2LDE1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwxNn07CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworLyogIFRhYmxlOiBWYWxUYWIyNCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICAgIGRlc2NyaXB0aW9uOiAgICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgdmFsdWVzIGZvciBjb2RlYm9va3MgMTEuCisgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitjb25zdCBTQ0hBUiBhVmFsVGFiMjRbNTc4XSA9IHsKKyAgICAwLCAgMCwgIDAsICAxLCAgMCwgIDIsICAwLCAgMywgIDAsICA0LCAgMCwgIDUsICAwLCAgNiwgIDAsICA3LCAgMCwgIDgsICAwLAorICAgIDksICAwLCAgMTAsIDAsICAxMSwgMCwgIDEyLCAwLCAgMTMsIDAsICAxNCwgMCwgIDE1LCAwLCAgMTYsIDEsICAwLCAgMSwgIDEsCisgICAgMSwgIDIsICAxLCAgMywgIDEsICA0LCAgMSwgIDUsICAxLCAgNiwgIDEsICA3LCAgMSwgIDgsICAxLCAgOSwgIDEsICAxMCwgMSwKKyAgICAxMSwgMSwgIDEyLCAxLCAgMTMsIDEsICAxNCwgMSwgIDE1LCAxLCAgMTYsIDIsICAwLCAgMiwgIDEsICAyLCAgMiwgIDIsICAzLAorICAgIDIsICA0LCAgMiwgIDUsICAyLCAgNiwgIDIsICA3LCAgMiwgIDgsICAyLCAgOSwgIDIsICAxMCwgMiwgIDExLCAyLCAgMTIsIDIsCisgICAgMTMsIDIsICAxNCwgMiwgIDE1LCAyLCAgMTYsIDMsICAwLCAgMywgIDEsICAzLCAgMiwgIDMsICAzLCAgMywgIDQsICAzLCAgNSwKKyAgICAzLCAgNiwgIDMsICA3LCAgMywgIDgsICAzLCAgOSwgIDMsICAxMCwgMywgIDExLCAzLCAgMTIsIDMsICAxMywgMywgIDE0LCAzLAorICAgIDE1LCAzLCAgMTYsIDQsICAwLCAgNCwgIDEsICA0LCAgMiwgIDQsICAzLCAgNCwgIDQsICA0LCAgNSwgIDQsICA2LCAgNCwgIDcsCisgICAgNCwgIDgsICA0LCAgOSwgIDQsICAxMCwgNCwgIDExLCA0LCAgMTIsIDQsICAxMywgNCwgIDE0LCA0LCAgMTUsIDQsICAxNiwgNSwKKyAgICAwLCAgNSwgIDEsICA1LCAgMiwgIDUsICAzLCAgNSwgIDQsICA1LCAgNSwgIDUsICA2LCAgNSwgIDcsICA1LCAgOCwgIDUsICA5LAorICAgIDUsICAxMCwgNSwgIDExLCA1LCAgMTIsIDUsICAxMywgNSwgIDE0LCA1LCAgMTUsIDUsICAxNiwgNiwgIDAsICA2LCAgMSwgIDYsCisgICAgMiwgIDYsICAzLCAgNiwgIDQsICA2LCAgNSwgIDYsICA2LCAgNiwgIDcsICA2LCAgOCwgIDYsICA5LCAgNiwgIDEwLCA2LCAgMTEsCisgICAgNiwgIDEyLCA2LCAgMTMsIDYsICAxNCwgNiwgIDE1LCA2LCAgMTYsIDcsICAwLCAgNywgIDEsICA3LCAgMiwgIDcsICAzLCAgNywKKyAgICA0LCAgNywgIDUsICA3LCAgNiwgIDcsICA3LCAgNywgIDgsICA3LCAgOSwgIDcsICAxMCwgNywgIDExLCA3LCAgMTIsIDcsICAxMywKKyAgICA3LCAgMTQsIDcsICAxNSwgNywgIDE2LCA4LCAgMCwgIDgsICAxLCAgOCwgIDIsICA4LCAgMywgIDgsICA0LCAgOCwgIDUsICA4LAorICAgIDYsICA4LCAgNywgIDgsICA4LCAgOCwgIDksICA4LCAgMTAsIDgsICAxMSwgOCwgIDEyLCA4LCAgMTMsIDgsICAxNCwgOCwgIDE1LAorICAgIDgsICAxNiwgOSwgIDAsICA5LCAgMSwgIDksICAyLCAgOSwgIDMsICA5LCAgNCwgIDksICA1LCAgOSwgIDYsICA5LCAgNywgIDksCisgICAgOCwgIDksICA5LCAgOSwgIDEwLCA5LCAgMTEsIDksICAxMiwgOSwgIDEzLCA5LCAgMTQsIDksICAxNSwgOSwgIDE2LCAxMCwgMCwKKyAgICAxMCwgMSwgIDEwLCAyLCAgMTAsIDMsICAxMCwgNCwgIDEwLCA1LCAgMTAsIDYsICAxMCwgNywgIDEwLCA4LCAgMTAsIDksICAxMCwKKyAgICAxMCwgMTAsIDExLCAxMCwgMTIsIDEwLCAxMywgMTAsIDE0LCAxMCwgMTUsIDEwLCAxNiwgMTEsIDAsICAxMSwgMSwgIDExLCAyLAorICAgIDExLCAzLCAgMTEsIDQsICAxMSwgNSwgIDExLCA2LCAgMTEsIDcsICAxMSwgOCwgIDExLCA5LCAgMTEsIDEwLCAxMSwgMTEsIDExLAorICAgIDEyLCAxMSwgMTMsIDExLCAxNCwgMTEsIDE1LCAxMSwgMTYsIDEyLCAwLCAgMTIsIDEsICAxMiwgMiwgIDEyLCAzLCAgMTIsIDQsCisgICAgMTIsIDUsICAxMiwgNiwgIDEyLCA3LCAgMTIsIDgsICAxMiwgOSwgIDEyLCAxMCwgMTIsIDExLCAxMiwgMTIsIDEyLCAxMywgMTIsCisgICAgMTQsIDEyLCAxNSwgMTIsIDE2LCAxMywgMCwgIDEzLCAxLCAgMTMsIDIsICAxMywgMywgIDEzLCA0LCAgMTMsIDUsICAxMywgNiwKKyAgICAxMywgNywgIDEzLCA4LCAgMTMsIDksICAxMywgMTAsIDEzLCAxMSwgMTMsIDEyLCAxMywgMTMsIDEzLCAxNCwgMTMsIDE1LCAxMywKKyAgICAxNiwgMTQsIDAsICAxNCwgMSwgIDE0LCAyLCAgMTQsIDMsICAxNCwgNCwgIDE0LCA1LCAgMTQsIDYsICAxNCwgNywgIDE0LCA4LAorICAgIDE0LCA5LCAgMTQsIDEwLCAxNCwgMTEsIDE0LCAxMiwgMTQsIDEzLCAxNCwgMTQsIDE0LCAxNSwgMTQsIDE2LCAxNSwgMCwgIDE1LAorICAgIDEsICAxNSwgMiwgIDE1LCAzLCAgMTUsIDQsICAxNSwgNSwgIDE1LCA2LCAgMTUsIDcsICAxNSwgOCwgIDE1LCA5LCAgMTUsIDEwLAorICAgIDE1LCAxMSwgMTUsIDEyLCAxNSwgMTMsIDE1LCAxNCwgMTUsIDE1LCAxNSwgMTYsIDE2LCAwLCAgMTYsIDEsICAxNiwgMiwgIDE2LAorICAgIDMsICAxNiwgNCwgIDE2LCA1LCAgMTYsIDYsICAxNiwgNywgIDE2LCA4LCAgMTYsIDksICAxNiwgMTAsIDE2LCAxMSwgMTYsIDEyLAorICAgIDE2LCAxMywgMTYsIDE0LCAxNiwgMTUsIDE2LCAxNn07CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNiICAgIHF1YW50LiB2YWwgdGFibGUgKi8KLWNvbnN0IFNDSEFSICAqYVF1YW50VGFibGVbXSA9IHthVmFsVGFiNDEsICAgIC8qIDAgICAgICAgICAgICAgLSAgICAgICAgKi8gIC8qIHVzZSBxdWFudC4gdmFsIHRhbGJsZSAxIGFzIGR1bW15IGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiNDEsICAgIC8qIDEgICAgICAgICAgICAgMSAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiNDEsICAgIC8qIDIgICAgICAgICAgICAgMSAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiNDIsICAgIC8qIDMgICAgICAgICAgICAgMiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiNDIsICAgIC8qIDQgICAgICAgICAgICAgMiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjEsICAgIC8qIDUgICAgICAgICAgICAgMyAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjEsICAgIC8qIDYgICAgICAgICAgICAgMyAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjIsICAgIC8qIDcgICAgICAgICAgICAgNCAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjIsICAgIC8qIDggICAgICAgICAgICAgNCAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjMsICAgIC8qIDkgICAgICAgICAgICAgNSAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjMsICAgIC8qIDEwICAgICAgICAgICAgNSAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDExICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiNDEsICAgIC8qIDEyICAgICAgICAgICAgLSAgICAgICAgKi8gIC8qIHVzZSBxdWFudC4gdmFsIHRhbGJsZSAxIGFzIGR1bW15IGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiNDEsICAgIC8qIDEzICAgICAgICAgICAgLSAgICAgICAgKi8gIC8qIHVzZSBxdWFudC4gdmFsIHRhbGJsZSAxIGFzIGR1bW15IGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiNDEsICAgIC8qIDE0ICAgICAgICAgICAgLSAgICAgICAgKi8gIC8qIHVzZSBxdWFudC4gdmFsIHRhbGJsZSAxIGFzIGR1bW15IGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiNDEsICAgIC8qIDE1ICAgICAgICAgICAgLSAgICAgICAgKi8gIC8qIHVzZSBxdWFudC4gdmFsIHRhbGJsZSAxIGFzIGR1bW15IGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDE2ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDE3ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDE4ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDE5ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDIwICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDIxICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDIyICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDIzICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDI0ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDI1ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDI2ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDI3ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDI4ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDI5ICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjQsICAgIC8qIDMwICAgICAgICAgICAgNiAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhVmFsVGFiMjR9OyAgIC8qIDMxICAgICAgICAgICAgNiAgICAgICAgKi8KKy8qIGNiICAgIHF1YW50LiB2YWwgdGFibGUgKi8KK2NvbnN0IFNDSEFSICphUXVhbnRUYWJsZVtdID0geworICAgIGFWYWxUYWI0MSwKKyAgICAvKiAwICAgICAgICAgICAgIC0gICAgICAgICovIC8qIHVzZSBxdWFudC4gdmFsIHRhbGJsZSAxIGFzIGR1bW15IGhlcmUgKi8KKyAgICBhVmFsVGFiNDEsICAgICAgICAgICAgICAgICAgIC8qIDEgICAgICAgICAgICAgMSAgICAgICAgKi8KKyAgICBhVmFsVGFiNDEsICAgICAgICAgICAgICAgICAgIC8qIDIgICAgICAgICAgICAgMSAgICAgICAgKi8KKyAgICBhVmFsVGFiNDIsICAgICAgICAgICAgICAgICAgIC8qIDMgICAgICAgICAgICAgMiAgICAgICAgKi8KKyAgICBhVmFsVGFiNDIsICAgICAgICAgICAgICAgICAgIC8qIDQgICAgICAgICAgICAgMiAgICAgICAgKi8KKyAgICBhVmFsVGFiMjEsICAgICAgICAgICAgICAgICAgIC8qIDUgICAgICAgICAgICAgMyAgICAgICAgKi8KKyAgICBhVmFsVGFiMjEsICAgICAgICAgICAgICAgICAgIC8qIDYgICAgICAgICAgICAgMyAgICAgICAgKi8KKyAgICBhVmFsVGFiMjIsICAgICAgICAgICAgICAgICAgIC8qIDcgICAgICAgICAgICAgNCAgICAgICAgKi8KKyAgICBhVmFsVGFiMjIsICAgICAgICAgICAgICAgICAgIC8qIDggICAgICAgICAgICAgNCAgICAgICAgKi8KKyAgICBhVmFsVGFiMjMsICAgICAgICAgICAgICAgICAgIC8qIDkgICAgICAgICAgICAgNSAgICAgICAgKi8KKyAgICBhVmFsVGFiMjMsICAgICAgICAgICAgICAgICAgIC8qIDEwICAgICAgICAgICAgNSAgICAgICAgKi8KKyAgICBhVmFsVGFiMjQsICAgICAgICAgICAgICAgICAgIC8qIDExICAgICAgICAgICAgNiAgICAgICAgKi8KKyAgICBhVmFsVGFiNDEsCisgICAgLyogMTIgICAgICAgICAgICAtICAgICAgICAqLyAvKiB1c2UgcXVhbnQuIHZhbCB0YWxibGUgMSBhcyBkdW1teSBoZXJlICovCisgICAgYVZhbFRhYjQxLAorICAgIC8qIDEzICAgICAgICAgICAgLSAgICAgICAgKi8gLyogdXNlIHF1YW50LiB2YWwgdGFsYmxlIDEgYXMgZHVtbXkgaGVyZSAqLworICAgIGFWYWxUYWI0MSwKKyAgICAvKiAxNCAgICAgICAgICAgIC0gICAgICAgICovIC8qIHVzZSBxdWFudC4gdmFsIHRhbGJsZSAxIGFzIGR1bW15IGhlcmUgKi8KKyAgICBhVmFsVGFiNDEsCisgICAgLyogMTUgICAgICAgICAgICAtICAgICAgICAqLyAvKiB1c2UgcXVhbnQuIHZhbCB0YWxibGUgMSBhcyBkdW1teSBoZXJlICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAxNiAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAxNyAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAxOCAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAxOSAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyMCAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyMSAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyMiAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyMyAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyNCAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyNSAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyNiAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyNyAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyOCAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAyOSAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0LCAgICAgICAgICAgICAgICAgICAvKiAzMCAgICAgICAgICAgIDYgICAgICAgICovCisgICAgYVZhbFRhYjI0fTsgICAgICAgICAgICAgICAgICAvKiAzMSAgICAgICAgICAgIDYgICAgICAgICovCiAKIC8qIGFycmF5cyBmb3IgSENSX1RBQkxFX0lORk8gc3RydWN0dXJlcyAqLwogLyogbWF4aW11bSBsZW5ndGggb2YgY29kZXdvcmQgaW4gZWFjaCBjb2RlYm9vayAqLwotLyogY29kZWJvb2s6ICAgICAgICAgICAgICAgICAgICAgMCwxLCAyLDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxICovCi1jb25zdCBVQ0hBUiAgIGFNYXhDd0xlbltNQVhfQ0JdPXswLDExLDksMjAsMTYsMTMsMTEsMTQsMTIsMTcsMTQsNDksMCwgMCwgMCwgMCwgMTQsMTcsMjEsMjEsMjUsMjUsMjksMjksMjksMjksMzMsMzMsMzMsMzcsMzcsNDF9OworLyogY29kZWJvb2s6ICAgICAgICAgICAgICAgICAgICAgMCwxLCAyLDMsIDQsIDUsIDYsIDcsIDgsIDksCisgKiAxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSAqLworY29uc3QgVUNIQVIgYU1heEN3TGVuW01BWF9DQl0gPSB7MCwgIDExLCA5LCAgMjAsIDE2LCAxMywgMTEsIDE0LCAxMiwgMTcsIDE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDksIDAsICAwLCAgMCwgIDAsICAxNCwgMTcsIDIxLCAyMSwgMjUsIDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksIDI5LCAyOSwgMjksIDMzLCAzMywgMzMsIDM3LCAzNywgNDF9OwogCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgIDEzICAxNSAgMTcgIDE5ICAyMSAgMjMgIDI1ICAyNyAgMzkgIDMxICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQjogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMTAgIDEyICAxNCAgMTYgIDE4ICAyMCAgMjIgIDI0ICAyNiAgMjggIDMwICAgICAgICovCi1jb25zdCBVQ0hBUiAgIGFEaW1DYltNQVhfQ0JdICA9ICAgezIsNCw0LDQsNCwyLDIsMiwyLDIsMiwyLDEsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMn07ICAgLyogY29kZWJvb2sgZGltZW5zaW9uIC0gemVybyBjYiBnb3QgYSBkaW1lbnNpb24gb2YgMiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExICAxMyAgMTUgIDE3ICAxOQorICogMjEgIDIzICAyNSAgMjcgIDM5ICAzMSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0I6ICAwIDEgMiAzIDQgNSA2IDcgOCA5IDEwICAxMiAgMTQgIDE2ICAxOCAgMjAKKyAqIDIyICAyNCAgMjYgIDI4ICAzMCAgICAgICAqLworY29uc3QgVUNIQVIgYURpbUNiW01BWF9DQl0gPSB7CisgICAgMiwgNCwgNCwgNCwgNCwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMSwgMiwgMiwgMiwgMiwKKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyfTsgLyogY29kZWJvb2sgZGltZW5zaW9uIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvIGNiIGdvdCBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uIG9mIDIgKi8KIAotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExICAxMyAgMTUgIDE3ICAxOSAgMjEgIDIzICAyNSAgMjcgIDM5ICAzMSAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0I6ICAwIDEgMiAzIDQgNSA2IDcgOCA5IDEwICAxMiAgMTQgIDE2ICAxOCAgMjAgIDIyICAyNCAgMjYgIDI4ICAzMCAgICAgICAqLwotY29uc3QgVUNIQVIgICBhRGltQ2JTaGlmdFtNQVhfQ0JdPXsxLDIsMiwyLDIsMSwxLDEsMSwxLDEsMSwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDF9OyAgIC8qIGNvZGVib29rIGRpbWVuc2lvbiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExICAxMyAgMTUgIDE3ICAxOQorICogMjEgIDIzICAyNSAgMjcgIDM5ICAzMSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0I6ICAwIDEgMiAzIDQgNSA2IDcgOCA5IDEwICAxMiAgMTQgIDE2ICAxOCAgMjAKKyAqIDIyICAyNCAgMjYgIDI4ICAzMCAgICAgICAqLworY29uc3QgVUNIQVIgYURpbUNiU2hpZnRbTUFYX0NCXSA9IHsKKyAgICAxLCAyLCAyLCAyLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9OyAvKiBjb2RlYm9vayBkaW1lbnNpb24gKi8KIAotLyogICAgICAgICAgICAgICAxIC0+IGRlY29kZSBzaWduIGJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgIDAgLT4gZGVjb2RlIG5vIHNpZ24gYml0cyAgICAgICAgICAgICAgICAxMSAgMTMgIDE1ICAxNyAgMTkgIDIxICAyMyAgMjUgIDI3ICAzOSAgMzEgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgQ0I6ICAwIDEgMiAzIDQgNSA2IDcgOCA5IDEwICAxMiAgMTQgIDE2ICAxOCAgMjAgIDIyICAyNCAgMjYgIDI4ICAzMCAgICAgICAqLwotY29uc3QgVUNIQVIgICBhU2lnbkNiW01BWF9DQl09ezAsMCwwLDEsMSwwLDAsMSwxLDEsMSwxLDAsMCwwLDAsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMX07CisvKiAgICAgICAgICAgICAgIDEgLT4gZGVjb2RlIHNpZ24gYml0cyAqLworLyogICAgICAgICAgICAgICAwIC0+IGRlY29kZSBubyBzaWduIGJpdHMgICAgICAgICAgICAgICAgMTEgIDEzICAxNSAgMTcgIDE5ICAyMQorICogMjMgIDI1ICAyNyAgMzkgIDMxICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgIENCOiAgMCAxIDIgMyA0IDUgNiA3IDggOSAxMCAgMTIgIDE0ICAxNiAgMTggIDIwICAyMgorICogMjQgIDI2ICAyOCAgMzAgICAgICAgKi8KK2NvbnN0IFVDSEFSIGFTaWduQ2JbTUFYX0NCXSA9IHswLCAwLCAwLCAxLCAxLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9OwogCiAvKiBhcnJheXMgZm9yIEhDUl9DQl9QQUlSUyBzdHJ1Y3R1cmVzICovCi1jb25zdCBVQ0hBUiAgIGFNaW5PZkNiUGFpcltNQVhfQ0JfUEFJUlNdPXswLDEsMyw1LDcsIDksMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMTF9OwotY29uc3QgVUNIQVIgICBhTWF4T2ZDYlBhaXJbTUFYX0NCX1BBSVJTXT17MCwyLDQsNiw4LDEwLDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDExfTsKK2NvbnN0IFVDSEFSIGFNaW5PZkNiUGFpcltNQVhfQ0JfUEFJUlNdID0gezAsICAxLCAgMywgIDUsICA3LCAgOSwgIDE2LCAxNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDExfTsKK2NvbnN0IFVDSEFSIGFNYXhPZkNiUGFpcltNQVhfQ0JfUEFJUlNdID0gezAsICAyLCAgNCwgIDYsICA4LCAgMTAsIDE2LCAxNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDExfTsKIAogLyogcHJpb3JpdGllcyBvZiBjb2RlYm9va3MgKi8KLWNvbnN0IFVDSEFSICAgYUNiUHJpb3JpdHlbTUFYX0NCXT17MCwxLDEsMiwyLDMsMyw0LDQsNSw1LDIyLDAsMCwwLDAsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMX07Citjb25zdCBVQ0hBUiBhQ2JQcmlvcml0eVtNQVhfQ0JdID0gezAsICAxLCAgMSwgIDIsICAyLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMiwgMCwgIDAsICAwLCAgMCwgIDYsICA3LCAgOCwgIDksICAxMCwgMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxfTsKIAotY29uc3QgU0NIQVIgICBhQ29kZWJvb2syU3RhcnRJbnRbXSA9IHtTVE9QX1RISVNfU1RBVEUgICAgLCAgICAvKiBjYiAgMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX09OTFkgICAgICAgICAgLCAgICAvKiBjYiAgMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX09OTFkgICAgICAgICAgLCAgICAvKiBjYiAgMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX0JPRFkgICAgLCAgICAvKiBjYiAgMyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX0JPRFkgICAgLCAgICAvKiBjYiAgNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX09OTFkgICAgICAgICAgLCAgICAvKiBjYiAgNSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX09OTFkgICAgICAgICAgLCAgICAvKiBjYiAgNiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX0JPRFkgICAgLCAgICAvKiBjYiAgNyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX0JPRFkgICAgLCAgICAvKiBjYiAgOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX0JPRFkgICAgLCAgICAvKiBjYiAgOSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX0JPRFkgICAgLCAgICAvKiBjYiAxMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAxMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE9QX1RISVNfU1RBVEUgICAgLCAgICAvKiBjYiAxMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE9QX1RISVNfU1RBVEUgICAgLCAgICAvKiBjYiAxMyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE9QX1RISVNfU1RBVEUgICAgLCAgICAvKiBjYiAxNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE9QX1RISVNfU1RBVEUgICAgLCAgICAvKiBjYiAxNSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAxNiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAxNyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAxOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAxOSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyMyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyNSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyNiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyNyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAyOSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgICAvKiBjYiAzMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZfTsgICAvKiBjYiAzMSAqLworY29uc3QgU0NIQVIgYUNvZGVib29rMlN0YXJ0SW50W10gPSB7U1RPUF9USElTX1NUQVRFLCAgICAgIC8qIGNiICAwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX09OTFksICAgICAgICAgICAgLyogY2IgIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfT05MWSwgICAgICAgICAgICAvKiBjYiAgMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX19CT0RZLCAgICAgIC8qIGNiICAzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX0JPRFksICAgICAgLyogY2IgIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfT05MWSwgICAgICAgICAgICAvKiBjYiAgNSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9PTkxZLCAgICAgICAgICAgIC8qIGNiICA2ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX0JPRFksICAgICAgLyogY2IgIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfU0lHTl9fQk9EWSwgICAgICAvKiBjYiAgOCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX19CT0RZLCAgICAgIC8qIGNiICA5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX0JPRFksICAgICAgLyogY2IgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfU0lHTl9FU0NfX0JPRFksICAvKiBjYiAxMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RPUF9USElTX1NUQVRFLCAgICAgIC8qIGNiIDEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE9QX1RISVNfU1RBVEUsICAgICAgLyogY2IgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUT1BfVEhJU19TVEFURSwgICAgICAvKiBjYiAxNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RPUF9USElTX1NUQVRFLCAgICAgIC8qIGNiIDE1ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgLyogY2IgMTYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfU0lHTl9FU0NfX0JPRFksICAvKiBjYiAxNyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgIC8qIGNiIDE4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgLyogY2IgMTkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfU0lHTl9FU0NfX0JPRFksICAvKiBjYiAyMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgIC8qIGNiIDIxICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgLyogY2IgMjIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfU0lHTl9FU0NfX0JPRFksICAvKiBjYiAyMyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgIC8qIGNiIDI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgLyogY2IgMjUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfU0lHTl9FU0NfX0JPRFksICAvKiBjYiAyNiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgIC8qIGNiIDI3ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZLCAgLyogY2IgMjggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfU0lHTl9FU0NfX0JPRFksICAvKiBjYiAyOSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fQk9EWSwgIC8qIGNiIDMwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19CT0RZfTsgLyogY2IgMzEgKi8KIAotY29uc3QgU1RBVEVGVU5DIGFTdGF0ZUNvbnN0YW50MlN0YXRlW10gPSB7TlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICAgIC8qICAwID0gU1RPUF9USElTX1NUQVRFICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfT05MWSAgICAgICAgICAgICAgICAsICAgIC8qICAxID0gQk9EWV9PTkxZICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9fQk9EWSAgICAgICAgICAsICAgIC8qICAyID0gQk9EWV9TSUdOX19CT0RZICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9fU0lHTiAgICAgICAgICAsICAgIC8qICAzID0gQk9EWV9TSUdOX19TSUdOICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0JPRFkgICAgICAsICAgIC8qICA0ID0gQk9EWV9TSUdOX0VTQ19fQk9EWSAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX1NJR04gICAgICAsICAgIC8qICA1ID0gQk9EWV9TSUdOX0VTQ19fU0lHTiAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0VTQ19QUkVGSVgsICAgIC8qICA2ID0gQk9EWV9TSUdOX0VTQ19fRVNDX1BSRUZJWCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0VTQ19XT1JEICB9OyAgIC8qICA3ID0gQk9EWV9TSUdOX0VTQ19fRVNDX1dPUkQgICAqLworY29uc3QgU1RBVEVGVU5DIGFTdGF0ZUNvbnN0YW50MlN0YXRlW10gPSB7CisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAwID0gU1RPUF9USElTX1NUQVRFICAgICAgICAgICAqLworICAgIEhjcl9TdGF0ZV9CT0RZX09OTFksICAgICAgICAgICAgICAgICAvKiAgMSA9IEJPRFlfT05MWSAgICAgICAgICAgICAgICAgKi8KKyAgICBIY3JfU3RhdGVfQk9EWV9TSUdOX19CT0RZLCAgICAgICAgICAgLyogIDIgPSBCT0RZX1NJR05fX0JPRFkgICAgICAgICAgICovCisgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9fU0lHTiwgICAgICAgICAgIC8qICAzID0gQk9EWV9TSUdOX19TSUdOICAgICAgICAgICAqLworICAgIEhjcl9TdGF0ZV9CT0RZX1NJR05fRVNDX19CT0RZLCAgICAgICAvKiAgNCA9IEJPRFlfU0lHTl9FU0NfX0JPRFkgICAgICAgKi8KKyAgICBIY3JfU3RhdGVfQk9EWV9TSUdOX0VTQ19fU0lHTiwgICAgICAgLyogIDUgPSBCT0RZX1NJR05fRVNDX19TSUdOICAgICAgICovCisgICAgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0VTQ19QUkVGSVgsIC8qICA2ID0gQk9EWV9TSUdOX0VTQ19fRVNDX1BSRUZJWCAqLworICAgIEhjcl9TdGF0ZV9CT0RZX1NJR05fRVNDX19FU0NfV09SRH07ICAvKiAgNyA9IEJPRFlfU0lHTl9FU0NfX0VTQ19XT1JEICAgKi8KIAotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0I6ICAwIDEgMiAzIDQgNSA2IDcgOCAgOSAxMCAgICAgIDEyICAgIDE0ICAgIDE2ICAgIDE4ICAgIDIwICAgICAgMjIgICAgICAyNCAgICAgIDI2ICAgICAgMjggICAgICAgMzAgICAgICAgICAqLwotY29uc3QgVVNIT1JUIGFMYXJnZXN0QWJzb2x1dGVWYWx1ZVtNQVhfQ0JdPXswLDEsMSwyLDIsNCw0LDcsNywxMiwxMiw4MTkxLCAwLCAwLCAwLCAwLDE1LDMxLDQ3LDYzLDk1LDEyNywxNTksMTkxLDIyMywyNTUsMzE5LDM4Myw1MTEsNzY3LDEwMjMsMjA0N307IC8qIGxhdiAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgICAgIDEzICAgIDE1ICAgIDE3ICAgIDE5ICAgICAyMSAgICAgIDIzICAgICAgMjUgICAgICAyNyAgICAgIDM5ICAgICAgIDMxICAgICAqLwotCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQjogIDAgMSAyIDMgNCA1IDYgNyA4ICA5IDEwICAgICAgMTIKKyAqIDE0ICAgIDE2ICAgIDE4ICAgIDIwICAgICAgMjIgICAgICAyNCAgICAgIDI2ICAgICAgMjggICAgICAgMzAgICAgICAgICAqLworY29uc3QgVVNIT1JUIGFMYXJnZXN0QWJzb2x1dGVWYWx1ZVtNQVhfQ0JdID0geworICAgIDAsICAgIDEsICAgMSwgICAyLCAgIDIsICAgNCwgICA0LCAgIDcsICAgNywgICAgMTIsICAxMiwKKyAgICA4MTkxLCAwLCAgIDAsICAgMCwgICAwLCAgIDE1LCAgMzEsICA0NywgIDYzLCAgIDk1LCAgMTI3LAorICAgIDE1OSwgIDE5MSwgMjIzLCAyNTUsIDMxOSwgMzgzLCA1MTEsIDc2NywgMTAyMywgMjA0N307IC8qIGxhdiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgICAgIDEzCisgKiAxNSAgICAxNyAgICAxOSAgICAgMjEgICAgICAyMyAgICAgIDI1ICAgICAgMjcgICAgICAzOSAgICAgICAzMSAgICAgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBkZXNjcmlwdGlvbjogICAgVGhlIHRhYmxlICdIdWZmVHJlZVJ2bGNFc2NhcGUnIGNvbnRhaW5zIHRoZSBkZWNvZGUgdHJlZSBmb3IgdGhlIHJ2bGMKLSAgICAgICAgICAgICAgICAgICBlc2NhcGUgc2VxdWVuY2VzLgotICAgICAgICAgICAgICAgICAgIGJpdCAyMyBhbmQgMTEgbm90IHVzZWQKLSAgICAgICAgICAgICAgICAgICBiaXQgMjIgYW5kIDEwIGRldGVybWluZSBlbmQgdmFsdWUgIC0tPiAgaWYgc2V0IGNvZGV3b3JkIGlzIGRlY29kZWQKLSAgICAgICAgICAgICAgICAgICBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSkgb3IgKGluZGV4IHZhbHVlKQotICAgICAgICAgICAgICAgICAgIFRoZSBlc2NhcGUgc2VxdWVuY2UgaXMgdGhlIGluZGV4IHZhbHVlLgorICAgZGVzY3JpcHRpb246ICAgIFRoZSB0YWJsZSAnSHVmZlRyZWVSdmxjRXNjYXBlJyBjb250YWlucyB0aGUgZGVjb2RlIHRyZWUgZm9yCit0aGUgcnZsYyBlc2NhcGUgc2VxdWVuY2VzLiBiaXQgMjMgYW5kIDExIG5vdCB1c2VkIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZAordmFsdWUgIC0tPiAgaWYgc2V0IGNvZGV3b3JkIGlzIGRlY29kZWQgYml0IDIxLTEyIGFuZCA5LTAgKG9mZnNldCB0byBuZXh0IG5vZGUpCitvciAoaW5kZXggdmFsdWUpIFRoZSBlc2NhcGUgc2VxdWVuY2UgaXMgdGhlIGluZGV4IHZhbHVlLgogCiAgICBpbnB1dDogICAgICAgICAgY29kZXdvcmQKICAgIG91dHB1dDogICAgICAgICBpbmRleAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1jb25zdCBVSU5UIGFIdWZmVHJlZVJ2bGNFc2NhcGVbNTNdID0geyAweDAwMjAwMSwweDQwMDAwMywweDQwMTAwNCwweDQwMjAwNSwweDQwMzAwNywweDQwNDAwNiwweDAwYTQwNSwweDAwOTAwOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBiNDA2LDB4MDBjNDA3LDB4MDBkNDA4LDB4MDBlNDA5LDB4NDBiNDBhLDB4NDBjMDBmLDB4NDBkMDEwLDB4NDBlMDExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MGYwMTIsMHg0MTAwMTMsMHg0MTEwMTQsMHg0MTIwMTUsMHgwMTY0MTMsMHg0MTQ0MTUsMHgwMTc0MTYsMHg0MTcwMTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQxOTAxOSwweDAxYTQxOCwweDAxYjQxYSwweDAxYzAyMywweDAzMjAxZCwweDAxZTAyMCwweDQzNTAxZiwweDQxYjQxYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxMDIyLDB4NDFkNDFlLDB4NDFmNDIwLDB4MDI0MDJiLDB4MDI1MDI4LDB4MDI2MDI3LDB4NDIxNDIyLDB4NDIzNDI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjkwMmEsMHg0MjU0MjYsMHg0Mjc0MjgsMHgwMmMwMmYsMHgwMmQwMmUsMHg0Mjk0MmEsMHg0MmI0MmMsMHgwMzAwMzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyZDQyZSwweDQyZjQzMCwweDAzMzAzNCwweDQzMTQzMiwweDQzMzQzNCB9OworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworY29uc3QgVUlOVCBhSHVmZlRyZWVSdmxjRXNjYXBlWzUzXSA9IHsKKyAgICAweDAwMjAwMSwgMHg0MDAwMDMsIDB4NDAxMDA0LCAweDQwMjAwNSwgMHg0MDMwMDcsIDB4NDA0MDA2LCAweDAwYTQwNSwKKyAgICAweDAwOTAwOCwgMHgwMGI0MDYsIDB4MDBjNDA3LCAweDAwZDQwOCwgMHgwMGU0MDksIDB4NDBiNDBhLCAweDQwYzAwZiwKKyAgICAweDQwZDAxMCwgMHg0MGUwMTEsIDB4NDBmMDEyLCAweDQxMDAxMywgMHg0MTEwMTQsIDB4NDEyMDE1LCAweDAxNjQxMywKKyAgICAweDQxNDQxNSwgMHgwMTc0MTYsIDB4NDE3MDE4LCAweDQxOTAxOSwgMHgwMWE0MTgsIDB4MDFiNDFhLCAweDAxYzAyMywKKyAgICAweDAzMjAxZCwgMHgwMWUwMjAsIDB4NDM1MDFmLCAweDQxYjQxYywgMHgwMjEwMjIsIDB4NDFkNDFlLCAweDQxZjQyMCwKKyAgICAweDAyNDAyYiwgMHgwMjUwMjgsIDB4MDI2MDI3LCAweDQyMTQyMiwgMHg0MjM0MjQsIDB4MDI5MDJhLCAweDQyNTQyNiwKKyAgICAweDQyNzQyOCwgMHgwMmMwMmYsIDB4MDJkMDJlLCAweDQyOTQyYSwgMHg0MmI0MmMsIDB4MDMwMDMxLCAweDQyZDQyZSwKKyAgICAweDQyZjQzMCwgMHgwMzMwMzQsIDB4NDMxNDMyLCAweDQzMzQzNH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgZGVzY3JpcHRpb246ICAgIFRoZSB0YWJsZSAnSHVmZlRyZWVSdmxjJyBjb250YWlucyB0aGUgaHVmZm1hbiBkZWNvZGluZyB0cmVlIGZvciB0aGUgUlZMQwotICAgICAgICAgICAgICAgICAgIHNjYWxlIGZhY3RvcnMuIFRoZSB0YWJsZSBjb250YWlucyAxNSBhbGxvd2VkLCBzeW1tZXRyaWMgY29kZXdvcmRzIGFuZCA4Ci0gICAgICAgICAgICAgICAgICAgZm9yYmlkZGVuIGNvZGV3b3Jkcywgd2hpY2ggYXJlIHVzZWQgZm9yIGVycm9yIGRldGVjdGlvbi4KKyAgIGRlc2NyaXB0aW9uOiAgICBUaGUgdGFibGUgJ0h1ZmZUcmVlUnZsYycgY29udGFpbnMgdGhlIGh1ZmZtYW4gZGVjb2RpbmcgdHJlZQorZm9yIHRoZSBSVkxDIHNjYWxlIGZhY3RvcnMuIFRoZSB0YWJsZSBjb250YWlucyAxNSBhbGxvd2VkLCBzeW1tZXRyaWMgY29kZXdvcmRzCithbmQgOCBmb3JiaWRkZW4gY29kZXdvcmRzLCB3aGljaCBhcmUgdXNlZCBmb3IgZXJyb3IgZGV0ZWN0aW9uLgogCiAgICB1c2FnZSBvZiBiaXRzOiAgYml0IDIzIGFuZCAxMSBub3QgdXNlZAotICAgICAgICAgICAgICAgICAgIGJpdCAyMiBhbmQgMTAgZGV0ZXJtaW5lIGVuZCB2YWx1ZSAgLS0+ICBpZiBzZXQgY29kZXdvcmQgaXMgZGVjb2RlZAotICAgICAgICAgICAgICAgICAgIGJpdCAyMS0xMiBhbmQgOS0wIChvZmZzZXQgdG8gbmV4dCBub2RlIHdpdGhpbiB0aGUgdGFibGUpIG9yIChpbmRleCs3KS4KLSAgICAgICAgICAgICAgICAgICBUaGUgZGVjb2RlZCAoaW5kZXgrNykgaXMgaW4gdGhlIHJhbmdlIGZyb20gMCwxLC4uLDIyLiBJZiB0aGUgKGluZGV4KzcpCi0gICAgICAgICAgICAgICAgICAgaXMgaW4gdGhlIHJhbmdlIDE1LDE2LC4uLDIyLCB0aGVuIGEgZm9yYmlkZGVuIGNvZGV3b3JkIGlzIGRlY29kZWQuCisgICAgICAgICAgICAgICAgICAgYml0IDIyIGFuZCAxMCBkZXRlcm1pbmUgZW5kIHZhbHVlICAtLT4gIGlmIHNldCBjb2Rld29yZCBpcworZGVjb2RlZCBiaXQgMjEtMTIgYW5kIDktMCAob2Zmc2V0IHRvIG5leHQgbm9kZSB3aXRoaW4gdGhlIHRhYmxlKSBvciAoaW5kZXgrNykuCisgICAgICAgICAgICAgICAgICAgVGhlIGRlY29kZWQgKGluZGV4KzcpIGlzIGluIHRoZSByYW5nZSBmcm9tIDAsMSwuLiwyMi4gSWYgdGhlCisoaW5kZXgrNykgaXMgaW4gdGhlIHJhbmdlIDE1LDE2LC4uLDIyLCB0aGVuIGEgZm9yYmlkZGVuIGNvZGV3b3JkIGlzIGRlY29kZWQuCiAKICAgIGlucHV0OiAgICAgICAgICBBIHNpbmdsZSBiaXQgZnJvbSBhIFJWTEMgc2NhbGVmYWN0b3IgY29kZXdvcmQKLSAgIG91dHB1dDogICAgICAgICBbaWYgY29kZXdvcmQgaXMgbm90IGNvbXBsZXRlbHkgZGVjb2RlZDpdIG9mZnNldCB0byBuZXh0IG5vZGUgd2l0aGluIHRhYmxlIG9yCi0gICAgICAgICAgICAgICAgICAgW2lmIGNvZGV3b3JkIGlzIGRlY29kZWQ6XSBBIGRwY20gdmFsdWUgaS5lLiAoaW5kZXgrNykgaW4gcmFuZ2UgZnJvbSAwLDEsLi4sMjIuCi0gICAgICAgICAgICAgICAgICAgVGhlIGRpZmZlcmVudGlhbCBzY2FsZWZhY3RvciAoRFBDTSB2YWx1ZSkgbmFtZWQgJ2luZGV4JyBpcyBjYWxjdWxhdGVkIGJ5Ci0gICAgICAgICAgICAgICAgICAgc3VidHJhY3RpbmcgNyBmcm9tIHRoZSBkZWNvZGVkIHZhbHVlIChpbmRleCs3KS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotY29uc3QgVUlOVCBhSHVmZlRyZWVSdmxDb2Rld2RzWzIyXSA9IHsgMHg0MDcwMDEsMHgwMDIwMDksMHgwMDM0MDYsMHgwMDQ0MDUsMHgwMDU0MDQsMHgwMDY0MDMsMHgwMDc0MDAsMHgwMDg0MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQxMTQwMSwweDAwYTQwOCwweDAwYzAwYiwweDAwZTQwOSwweDAxMDAwZCwweDQwZjQwYSwweDQxNDAwZiwweDAxMzQwYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDExMDE1LDB4NDEwMDEyLDB4NDEyNDBjLDB4NDE2MDE0LDB4NDE1NDBkLDB4NDEzNDBlIH07CisgICBvdXRwdXQ6ICAgICAgICAgW2lmIGNvZGV3b3JkIGlzIG5vdCBjb21wbGV0ZWx5IGRlY29kZWQ6XSBvZmZzZXQgdG8gbmV4dCBub2RlCit3aXRoaW4gdGFibGUgb3IgW2lmIGNvZGV3b3JkIGlzIGRlY29kZWQ6XSBBIGRwY20gdmFsdWUgaS5lLiAoaW5kZXgrNykgaW4gcmFuZ2UKK2Zyb20gMCwxLC4uLDIyLiBUaGUgZGlmZmVyZW50aWFsIHNjYWxlZmFjdG9yIChEUENNIHZhbHVlKSBuYW1lZCAnaW5kZXgnIGlzCitjYWxjdWxhdGVkIGJ5IHN1YnRyYWN0aW5nIDcgZnJvbSB0aGUgZGVjb2RlZCB2YWx1ZSAoaW5kZXgrNykuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitjb25zdCBVSU5UIGFIdWZmVHJlZVJ2bENvZGV3ZHNbMjJdID0geworICAgIDB4NDA3MDAxLCAweDAwMjAwOSwgMHgwMDM0MDYsIDB4MDA0NDA1LCAweDAwNTQwNCwgMHgwMDY0MDMsCisgICAgMHgwMDc0MDAsIDB4MDA4NDAyLCAweDQxMTQwMSwgMHgwMGE0MDgsIDB4MDBjMDBiLCAweDAwZTQwOSwKKyAgICAweDAxMDAwZCwgMHg0MGY0MGEsIDB4NDE0MDBmLCAweDAxMzQwYiwgMHgwMTEwMTUsIDB4NDEwMDEyLAorICAgIDB4NDEyNDBjLCAweDQxNjAxNCwgMHg0MTU0MGQsIDB4NDEzNDBlfTsKIAorY29uc3QgRklYUF9XVEIgTG93RGVsYXlTeW50aGVzaXMyNTZbNzY4XSA9IHsKKyAgICBXVEMoMHhkYWVjYjg4YSksIFdUQygweGRiN2E1MjMwKSwgV1RDKDB4ZGMwOTM5NjEpLCBXVEMoMHhkYzk5NzdiNSksCisgICAgV1RDKDB4ZGQyYjExYjQpLCBXVEMoMHhkZGJlMDZjMSksIFdUQygweGRlNTI1Mjc3KSwgV1RDKDB4ZGVlN2YxNjcpLAorICAgIFdUQygweGRmN2VlMmY5KSwgV1RDKDB4ZTAxNzMyMDcpLCBXVEMoMHhlMGIwZTcwZSksIFdUQygweGUxNGJlYjRkKSwKKyAgICBXVEMoMHhlMWU4MjAwMiksIFdUQygweGUyODU2OTNkKSwgV1RDKDB4ZTMyM2JhM2MpLCBXVEMoMHhlM2MzM2NkYiksCisgICAgV1RDKDB4ZTQ2NDBjOTMpLCBXVEMoMHhlNTA2MGIzZiksIFdUQygweGU1YTkxNWNlKSwgV1RDKDB4ZTY0Y2ZmYzIpLAorICAgIFdUQygweGU2ZjE5ODY4KSwgV1RDKDB4ZTc5NmI0ZDcpLCBXVEMoMHhlODNjMmViZiksIFdUQygweGU4ZTFlZWExKSwKKyAgICBXVEMoMHhlOTg3Zjc4NCksIFdUQygweGVhMmU4MDE0KSwgV1RDKDB4ZWFkNWEyYjYpLCBXVEMoMHhlYjdkMzQ3NiksCisgICAgV1RDKDB4ZWMyNGViZmIpLCBXVEMoMHhlY2NjNGU5YSksIFdUQygweGVkNzJmNzIzKSwgV1RDKDB4ZWUxOGI1ODUpLAorICAgIFdUQygweGVlYmQ2OTAyKSwgV1RDKDB4ZWY2MTA2NjEpLCBXVEMoMHhmMDAzN2Y0MSksIFdUQygweGYwYTRjMTM5KSwKKyAgICBXVEMoMHhmMTQ0YzViYyksIFdUQygweGYxZTM5NWM0KSwgV1RDKDB4ZjI4MTJjNWQpLCBXVEMoMHhmMzFkNmRiNCksCisgICAgV1RDKDB4ZjNiODNlZDApLCBXVEMoMHhmNDUxNzk2MyksIFdUQygweGY0ZThkNjcyKSwgV1RDKDB4ZjU3ZGU0OTUpLAorICAgIFdUQygweGY2MTAzOTVlKSwgV1RDKDB4ZjY5ZjdlODQpLCBXVEMoMHhmNzJiOTE1MiksIFdUQygweGY3YjQ5NWI1KSwKKyAgICBXVEMoMHhmODNhZjQ1MyksIFdUQygweGY4YmY3MTE4KSwgV1RDKDB4Zjk0MjlhMzMpLCBXVEMoMHhmOWM0YzE4MyksCisgICAgV1RDKDB4ZmE0NjY1OTIpLCBXVEMoMHhmYWM4MDg2NyksIFdUQygweGZiNDlkMmJkKSwgV1RDKDB4ZmJjYjcyOTQpLAorICAgIFdUQygweGZjNGQwZTM1KSwgV1RDKDB4ZmNjZjdlN2IpLCBXVEMoMHhmZDUzYWY5NyksIFdUQygweGZkZGFiNWNhKSwKKyAgICBXVEMoMHhmZTYyOWE1NiksIFdUQygweGZlZTVjN2M5KSwgV1RDKDB4ZmY1YjYzMTEpLCBXVEMoMHhmZmI2YmQ0NSksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweGJmZjZjODQ1KSwgV1RDKDB4YmZlNDYxZWUpLCBXVEMoMHhiZmQxZjU4NiksIFdUQygweGJmYmY4NWIyKSwKKyAgICBXVEMoMHhiZmFkMTUxOCksIFdUQygweGJmOWFhNjQwKSwgV1RDKDB4YmY4ODM5MTEpLCBXVEMoMHhiZjc1Y2FmMCksCisgICAgV1RDKDB4YmY2MzVjNGIpLCBXVEMoMHhiZjUwZjA5YiksIFdUQygweGJmM2U4ODZkKSwgV1RDKDB4YmYyYzIxNjcpLAorICAgIFdUQygweGJmMTliYzJjKSwgV1RDKDB4YmYwNzVjNjQpLCBXVEMoMHhiZWY1MDJkYiksIFdUQygweGJlZTJhZDgzKSwKKyAgICBXVEMoMHhiZWQwNWQ2NyksIFdUQygweGJlYmUxNmE3KSwgV1RDKDB4YmVhYmRhNDYpLCBXVEMoMHhiZTk5YTYyZSksCisgICAgV1RDKDB4YmU4NzdiOTApLCBXVEMoMHhiZTc1NWVlOCksIFdUQygweGJlNjM1MTdkKSwgV1RDKDB4YmU1MTUxNWIpLAorICAgIFdUQygweGJlM2Y1ZmM5KSwgV1RDKDB4YmUyZDgxNDEpLCBXVEMoMHhiZTFiYjcyMSksIFdUQygweGJlMDlmZmEzKSwKKyAgICBXVEMoMHhiZGY4NWMxNyksIFdUQygweGJkZTZkMGUzKSwgV1RDKDB4YmRkNTVmNDcpLCBXVEMoMHhiZGM0MDU1ZCksCisgICAgV1RDKDB4YmRiMmM0MzgpLCBXVEMoMHhiZGExOWZlMCksIFdUQygweGJkOTA5OTQyKSwgV1RDKDB4YmQ3ZmFlMmYpLAorICAgIFdUQygweGJkNmVkZjhkKSwgV1RDKDB4YmQ1ZTMxNTMpLCBXVEMoMHhiZDRkYTQ1YiksIFdUQygweGJkM2QzNjVhKSwKKyAgICBXVEMoMHhiZDJjZTdlYiksIFdUQygweGJkMWNiYzg3KSwgV1RDKDB4YmQwY2I0NjYpLCBXVEMoMHhiY2ZjY2M4MCksCisgICAgV1RDKDB4YmNlZDA0YzUpLCBXVEMoMHhiY2RkNjAyMiksIFdUQygweGJjY2RkZTQ5KSwgV1RDKDB4YmNiZTdiYjQpLAorICAgIFdUQygweGJjYWYzN2VjKSwgV1RDKDB4YmNhMDE1OTQpLCBXVEMoMHhiYzkxMTQ5YiksIFdUQygweGJjODIzMjM0KSwKKyAgICBXVEMoMHhiYzczNmQ4MSksIFdUQygweGJjNjRjN2E0KSwgV1RDKDB4YmM1NjQwODUpLCBXVEMoMHhiYzQ3ZDZhOSksCisgICAgV1RDKDB4YmMzOTg2MTcpLCBXVEMoMHhiYzJiNDkxNSksIFdUQygweGJjMWQyYTkyKSwgV1RDKDB4YmMwZjQzNzApLAorICAgIFdUQygweGJjMDE2Nzg1KSwgV1RDKDB4YmJmMzJmNmMpLCBXVEMoMHhiYmU1MzY0OCksIFdUQygweGJiZDkxZWI1KSwKKyAgICBXVEMoMHhiYmQwMmY3YyksIFdUQygweGJiY2I1OGRiKSwgV1RDKDB4YmJjYTVhYzIpLCBXVEMoMHhiYmNiZGVhMiksCisgICAgV1RDKDB4YmJjZWUxOTIpLCBXVEMoMHhiYmQyYzdjMiksIFdUQygweGJiZDdhNjQ4KSwgV1RDKDB4YmJkZTNjNWEpLAorICAgIFdUQygweGJiZTcwNzlmKSwgV1RDKDB4YmJmMjM4YmYpLCBXVEMoMHhiYmZmOGVlYyksIFdUQygweGJjMGU1ZDIyKSwKKyAgICBXVEMoMHhiYzFlMmM4YiksIFdUQygweGJjMmVjM2E0KSwgV1RDKDB4YmM0MDJmMTkpLCBXVEMoMHhiYzUyYzFhYyksCisgICAgV1RDKDB4YmM2NzA5YWEpLCBXVEMoMHhiYzdkY2JjZSksIFdUQygweGJjOTc5MzgzKSwgV1RDKDB4YmNiNGFlMzApLAorICAgIFdUQygweGJjZDUyYWViKSwgV1RDKDB4YmNmOGRiNjMpLCBXVEMoMHhiZDFmNjk5MyksIFdUQygweGJkNDg1YjQ2KSwKKyAgICBXVEMoMHhiZDczNTAwNyksIFdUQygweGJkYTAwM2ZjKSwgV1RDKDB4YmRjZTU1NmMpLCBXVEMoMHhiZGZlNDUzYiksCisgICAgV1RDKDB4YmUyZmZkNGUpLCBXVEMoMHhiZTYzY2ViNyksIFdUQygweGJlOWEwMDZmKSwgV1RDKDB4YmVkMmNlMmIpLAorICAgIFdUQygweGJmMGU3ZDhlKSwgV1RDKDB4YmY0ZDVjZmMpLCBXVEMoMHhiZjhmOTJiZCksIFdUQygweGJmZDUxNjBjKSwKKyAgICBXVEMoMHhjMDFkM2IyNyksIFdUQygweGMwNjZiOGY1KSwgV1RDKDB4YzBiMGEzYjgpLCBXVEMoMHhjMGZhN2NkZCksCisgICAgV1RDKDB4YzE0NGIwZTgpLCBXVEMoMHhjMTkwOGQ3MSksIFdUQygweGMxZGVkNDAzKSwgV1RDKDB4YzIyZmFlNDkpLAorICAgIFdUQygweGMyODMwMDkyKSwgV1RDKDB4YzJkODZjYTgpLCBXVEMoMHhjMzJmNDM0MSksIFdUQygweGMzODY4N2U1KSwKKyAgICBXVEMoMHhjM2RkNWM1NSksIFdUQygweGM0MzMxMGU0KSwgV1RDKDB4YzQ4ODNlY2EpLCBXVEMoMHhjNGRlYmEzZCksCisgICAgV1RDKDB4YzUzNzJjODIpLCBXVEMoMHhjNTkxMDJmYiksIFdUQygweGM1ZWI0MTZhKSwgV1RDKDB4YzY0NDk4NmYpLAorICAgIFdUQygweGM2OWNhYmIyKSwgV1RDKDB4YzZmNDEyOTApLCBXVEMoMHhjNzRiMjJiZiksIFdUQygweGM3YTFlNGI5KSwKKyAgICBXVEMoMHhjN2Y4MzUwMCksIFdUQygweGM4NGRjNzM3KSwgV1RDKDB4YzhhMjRlMDcpLCBXVEMoMHhjOGY1Nzc2ZiksCisgICAgV1RDKDB4YjRkYjRhOGIpLCBXVEMoMHhiM2M1OGEzMiksIFdUQygweGIyYjJhY2I0KSwgV1RDKDB4YjFhMmFmYzApLAorICAgIFdUQygweGIwOTU5MTA3KSwgV1RDKDB4YWY4YjRlMGEpLCBXVEMoMHhhZTgzZGZlZiksIFdUQygweGFkN2YzYmE2KSwKKyAgICBXVEMoMHhhYzdkNWE1NyksIFdUQygweGFiN2UzOTdkKSwgV1RDKDB4YWE4MWQ1YTcpLCBXVEMoMHhhOTg4MmE2NCksCisgICAgV1RDKDB4YTg5MTM1YmMpLCBXVEMoMHhhNzljZjg0ZSksIFdUQygweGE2YWI3NGZjKSwgV1RDKDB4YTViY2IwZDApLAorICAgIFdUQygweGE0ZDBiMWI4KSwgV1RDKDB4YTNlNzdlNmQpLCBXVEMoMHhhMzAxMWUxNiksIFdUQygweGEyMWQ5ODZjKSwKKyAgICBXVEMoMHhhMTNjZjkyMSksIFdUQygweGEwNWY0ZmI5KSwgV1RDKDB4OWY4NGE4NTApLCBXVEMoMHg5ZWFkMGJhZiksCisgICAgV1RDKDB4OWRkODg4OGMpLCBXVEMoMHg5ZDA3MzM4NSksIFdUQygweDljMzkxZGI1KSwgV1RDKDB4OWI2ZTU0ODQpLAorICAgIFdUQygweDlhYTZlNjU2KSwgV1RDKDB4OTllMmUyYzUpLCBXVEMoMHg5OTIyNWFjNCksIFdUQygweDk4NjU2MDhhKSwKKyAgICBXVEMoMHg5N2FjMDU2NCksIFdUQygweDk2ZjY1OTg0KSwgV1RDKDB4OTY0NDZhMjUpLCBXVEMoMHg5NTk2NDE5NiksCisgICAgV1RDKDB4OTRlYmU5ZWMpLCBXVEMoMHg5NDQ1NmQxOSksIFdUQygweDkzYTJkNDZhKSwgV1RDKDB4OTMwNDI4NjQpLAorICAgIFdUQygweDkyNjk2ZGVhKSwgV1RDKDB4OTFkMmE2MzcpLCBXVEMoMHg5MTNmZDEyMCksIFdUQygweDkwYjBlY2ZlKSwKKyAgICBXVEMoMHg5MDI1ZjIzOSksIFdUQygweDhmOWVkMzNlKSwgV1RDKDB4OGYxYjgwNGIpLCBXVEMoMHg4ZTliZTcyYiksCisgICAgV1RDKDB4OGUxZmU5ODQpLCBXVEMoMHg4ZGE3NWNlNCksIFdUQygweDhkMzIxNTExKSwgV1RDKDB4OGNiZmUzODEpLAorICAgIFdUQygweDhjNTA4MDkwKSwgV1RDKDB4OGJlMzhiN2IpLCBXVEMoMHg4Yjc4YTEwYSksIFdUQygweDhiMGY1YmI0KSwKKyAgICBXVEMoMHg4YWE3NDBmMyksIFdUQygweDhhM2ZjNDM5KSwgV1RDKDB4ODlkOGEwOTMpLCBXVEMoMHg4OTcxZTdiZiksCisgICAgV1RDKDB4ODkwZDBmYTgpLCBXVEMoMHg4OGFjZmMzMiksIFdUQygweDg4NTVlMDdhKSwgV1RDKDB4ODgwZDUwMTApLAorICAgIFdUQygweDg3Y2M0NDRjKSwgV1RDKDB4ODdiNmU4NGUpLCBXVEMoMHg4NzllMzcxMyksIFdUQygweDg3ODUwYTg3KSwKKyAgICBXVEMoMHg4NzZjNzZlZSksIFdUQygweDg3NTNjNTVhKSwgV1RDKDB4ODczYWE3MGQpLCBXVEMoMHg4NzIxNDdlNyksCisgICAgV1RDKDB4ODcwN2JiMjMpLCBXVEMoMHg4NmVkZjY0ZiksIFdUQygweDg2ZDNmMjBkKSwgV1RDKDB4ODZiOWFiNjgpLAorICAgIFdUQygweDg2OWYyMWU3KSwgV1RDKDB4ODY4NDU3NDQpLCBXVEMoMHg4NjY5NDk5ZSksIFdUQygweDg2NGRmMzk1KSwKKyAgICBXVEMoMHg4NjMyNTRiMiksIFdUQygweDg2MTY3MTVlKSwgV1RDKDB4ODVmYTQ4NzApLCBXVEMoMHg4NWRkZDMyNCksCisgICAgV1RDKDB4ODVjMTEwOGIpLCBXVEMoMHg4NWE0MDU5NyksIFdUQygweDg1ODZiMWQxKSwgV1RDKDB4ODU2OTBmNDgpLAorICAgIFdUQygweDg1NGIxZGZiKSwgV1RDKDB4ODUyY2UzZTcpLCBXVEMoMHg4NTBlNjFjOCksIFdUQygweDg0ZWY5MzAzKSwKKyAgICBXVEMoMHg4NGQwNzhjMiksIFdUQygweDg0YjExOWZhKSwgV1RDKDB4ODQ5MTc3ZmEpLCBXVEMoMHg4NDcxOGU1NiksCisgICAgV1RDKDB4ODQ1MTVlNjUpLCBXVEMoMHg4NDMwZWY1MyksIFdUQygweDg0MTA0MmNiKSwgV1RDKDB4ODNlZjU0ZTgpLAorICAgIFdUQygweDgzY2UyN2FiKSwgV1RDKDB4ODNhY2MzMGEpLCBXVEMoMHg4MzhiMjkzNCksIFdUQygweDgzNjk1Njg2KSwKKyAgICBXVEMoMHg4MzQ3NGQ0NyksIFdUQygweDgzMjUxNWI2KSwgV1RDKDB4ODMwMmIyMDIpLCBXVEMoMHg4MmUwMWUzYiksCisgICAgV1RDKDB4ODJiZDVjOGUpLCBXVEMoMHg4MjlhNzU1YSksIFdUQygweDgyNzc2YWJmKSwgV1RDKDB4ODI1NDM4OGEpLAorICAgIFdUQygweDgyMzBlMDdlKSwgV1RDKDB4ODIwZDZhNjkpLCBXVEMoMHg4MWU5ZDgyZCksIFdUQygweDgxYzYyNWFlKSwKKyAgICBXVEMoMHg4MWEyNTQ1NSksIFdUQygweDgxN2U2YjFmKSwgV1RDKDB4ODE1YTZiMzkpLCBXVEMoMHg4MTM2NGZlYyksCisgICAgV1RDKDB4ODExMjFhMzQpLCBXVEMoMHg4MGVkZDBjOSksIFdUQygweDgwYzk3NDc5KSwgV1RDKDB4ODBhNTAwMGEpLAorICAgIFdUQygweDgwODA3MzMyKSwgV1RDKDB4ODA1YmQyZTYpLCBXVEMoMHg4MDM3MjQ2MCksIFdUQygweDgwMTI2Y2M0KSwKKyAgICBXVEMoMHgwYThhODQzMSksIFdUQygweDBhZTNjMzI5KSwgV1RDKDB4MGIzZmRhYjIpLCBXVEMoMHgwYjllNmU0NCksCisgICAgV1RDKDB4MGJmZjIxNjEpLCBXVEMoMHgwYzYxOWE3MiksIFdUQygweDBjYzVjNjZkKSwgV1RDKDB4MGQyYmQ2ZGYpLAorICAgIFdUQygweDBkOTNjZjY0KSwgV1RDKDB4MGRmZDg1NDUpLCBXVEMoMHgwZTY5MDkzYSksIFdUQygweDBlZDZhNjM2KSwKKyAgICBXVEMoMHgwZjQ2NWFlYSksIFdUQygweDBmYjdkODEwKSwgV1RDKDB4MTAyYWRlOTkpLCBXVEMoMHgxMDlmNDI0NSksCisgICAgV1RDKDB4MTExNGM5ZTgpLCBXVEMoMHgxMThiMzFiYyksIFdUQygweDEyMDI4MmI4KSwgV1RDKDB4MTI3YjBiZTEpLAorICAgIFdUQygweDEyZjQ2YjlhKSwgV1RDKDB4MTM2ZDhkZGUpLCBXVEMoMHgxM2U1NzkxMiksIFdUQygweDE0NWI1NWNiKSwKKyAgICBXVEMoMHgxNGNlNWIxOCksIFdUQygweDE1M2RjY2QwKSwgV1RDKDB4MTVhOGU3MjQpLCBXVEMoMHgxNjBlZGVmZSksCisgICAgV1RDKDB4MTY2ZjAwNGYpLCBXVEMoMHgxNmM4YWZmNCksIFdUQygweDE3MWI3YWZjKSwgV1RDKDB4MTc2NzNkYjMpLAorICAgIFdUQygweDE3YWZiNzk4KSwgV1RDKDB4MTdmYzYyYTIpLCBXVEMoMHgxODUxMTRjMSksIFdUQygweDE4YWRkNzIyKSwKKyAgICBXVEMoMHgxOTEyNzk4ZCksIFdUQygweDE5N2ViOWEyKSwgV1RDKDB4MTlmMjU2NTcpLCBXVEMoMHgxYTZkMTEzZSksCisgICAgV1RDKDB4MWFlZWI4MjQpLCBXVEMoMHgxYjc3MjNhYiksIFdUQygweDFjMDYwYjc3KSwgV1RDKDB4MWM5YjA5YTEpLAorICAgIFdUQygweDFkMzYxODIyKSwgV1RDKDB4MWRkNzkzM2YpLCBXVEMoMHgxZTdmZjU5MiksIFdUQygweDFmMmZkMGI1KSwKKyAgICBXVEMoMHgxZmU3NjJhOSksIFdUQygweDIwYTY4NzAwKSwgV1RDKDB4MjE2YmJmNWUpLCBXVEMoMHgyMjM0NDc5OCksCisgICAgV1RDKDB4MjJmZWViZGIpLCBXVEMoMHgyM2NjMjJhNiksIFdUQygweDI0OWRhMTBiKSwgV1RDKDB4MjU3NjJlNDEpLAorICAgIFdUQygweDI2NTVlYmM4KSwgV1RDKDB4MjczYTRlNjYpLCBXVEMoMHgyODIxMmVhYSksIFdUQygweDI5MDhmZjMwKSwKKyAgICBXVEMoMHgyOWYyY2EwMCksIFdUQygweDJhZTIyMWM0KSwgV1RDKDB4MmJkOWM2ZmMpLCBXVEMoMHgyY2RiOTY3ZSksCisgICAgV1RDKDB4MmRlNjRjODYpLCBXVEMoMHgyZWY2MTM0MCksIFdUQygweDMwMDY4NTJiKSwgV1RDKDB4MzExMzFhMWIpLAorICAgIFdUQygweDMyMWFlYzc5KSwgV1RDKDB4MzMyMGQ0ZWQpLCBXVEMoMHgzNDJhMmNiMyksIFdUQygweDM1M2U3N2Y3KSwKKyAgICBXVEMoMHgzNjYwYWFiYSksIFdUQygweDM3OGVmMDU3KSwgV1RDKDB4MzhjNDI0OTUpLCBXVEMoMHgzOWY4MWNlYyksCisgICAgV1RDKDB4M2IyNTAxNDgpLCBXVEMoMHgzYzQ3OTYwZSksIFdUQygweDNkNjBjNjI1KSwgV1RDKDB4M2U3NTg2NGEpLAorICAgIFdUQygweDNmOGE5ZWY3KSwgV1RDKDB4NDBhNDZkMzYpLCBXVEMoMHg0MWM1MzdkNyksIFdUQygweDQyZWQyODg5KSwKKyAgICBXVEMoMHg0NDFiNTJkMSksIFdUQygweDQ1NGRjMzdmKSwgV1RDKDB4NDY4MWU5ZmEpLCBXVEMoMHg0N2I0YTlmZSksCisgICAgV1RDKDB4NDhlMzk5NjApLCBXVEMoMHg0YTBkMTBmZCksIFdUQygweDRiMzA4MjRiKSwgV1RDKDB4NGM0ZTc1OWUpLAorICAgIFdUQygweDRkNjgwYjFjKSwgV1RDKDB4NGU3ZWVjYWEpLCBXVEMoMHg0Zjk0N2QxZSksIFdUQygweDUwYTlkMWY0KSwKKyAgICBXVEMoMHg1MWJmZWUxOSksIFdUQygweDUyZDdiZTRkKSwgV1RDKDB4NTNmMTg3ZWIpLCBXVEMoMHg1NTBjZDNjOCksCisgICAgV1RDKDB4NTYyNzA3MDYpLCBXVEMoMHg1NzNiN2M3NSksIFdUQygweDU4NDc0ODE5KSwgV1RDKDB4NTk0OTZhZTIpLAorICAgIFdUQygweDVhNDNkZmEwKSwgV1RDKDB4NWIzYjcyMWYpLCBXVEMoMHg1YzMyZTI2NiksIFdUQygweDVkMmFiZWExKSwKKyAgICBXVEMoMHg1ZTIyYjQ3OSksIFdUQygweDVmMTk5ZjhiKSwgV1RDKDB4NjAwZDkxOTQpLCBXVEMoMHg2MGZiZTE4OCksCisgICAgV1RDKDB4NjFlMjg5ZGUpLCBXVEMoMHg2MmMwNTIwYyksIFdUQygweDYzOTc0ZDFlKSwgV1RDKDB4NjQ2Y2IwMjIpLAorICAgIFdUQygweDY1NDI3NDVhKSwgV1RDKDB4NjYxNzJlMmYpLCBXVEMoMHg2NmU4OTdkMCksIFdUQygweDY3YjNjYzUyKSwKKyAgICBXVEMoMHg2ODc4M2ViZCksIFdUQygweDY5MzdiOWVkKSwgV1RDKDB4NjlmMzY1ZGQpLCBXVEMoMHg2YWFiYWIxYSksCisgICAgV1RDKDB4NmI2MDg0OWMpLCBXVEMoMHg2YzExODc2ZSksIFdUQygweDZjYmU0NmYwKSwgV1RDKDB4NmQ2NjQ1YmMpLAorICAgIFdUQygweGFlMjM4MzY2KSwgV1RDKDB4YjA0N2Q5OWEpLCBXVEMoMHhiMjYyMDdiYSksIFdUQygweGI0NzMzYWI1KSwKKyAgICBXVEMoMHhiNjdjOWY1ZiksIFdUQygweGI4N2Y1YmNlKSwgV1RDKDB4YmE3YmYxOGQpLCBXVEMoMHhiYzcyM2RkNiksCisgICAgV1RDKDB4YmU2MjFiZTgpLCBXVEMoMHhjMDRiNmIzZCksIFdUQygweGMyMmUwMGZmKSwgV1RDKDB4YzQwOWE4YWQpLAorICAgIFdUQygweGM1ZGU0MjViKSwgV1RDKDB4YzdhYmMyYTcpLCBXVEMoMHhjOTcyMTQyMSksIFdUQygweGNiMzExNzNjKSwKKyAgICBXVEMoMHhjY2U4YzA4ZCksIFdUQygweGNlOTkxODk0KSwgV1RDKDB4ZDA0MjE4Y2QpLCBXVEMoMHhkMWUzYWJhOSksCisgICAgV1RDKDB4ZDM3ZGNmMGMpLCBXVEMoMHhkNTEwOTQyZiksIFdUQygweGQ2OWJmYTg2KSwgV1RDKDB4ZDgxZmVmY2MpLAorICAgIFdUQygweGQ5OWM3NjZkKSwgV1RDKDB4ZGIxMWE1NzApLCBXVEMoMHhkYzdmODA2ZSksIFdUQygweGRkZTVmNzlkKSwKKyAgICBXVEMoMHhkZjQ1MTA5MiksIFdUQygweGUwOWNlNjQ1KSwgV1RDKDB4ZTFlZDdmZmYpLCBXVEMoMHhlMzM2ZDE2YSksCisgICAgV1RDKDB4ZTQ3OGU0ZjQpLCBXVEMoMHhlNWIzZGJiYiksIFdUQygweGU2ZTdjMWFjKSwgV1RDKDB4ZTgxNDhkNTMpLAorICAgIFdUQygweGU5M2E0ODM1KSwgV1RDKDB4ZWE1OTBlYjApLCBXVEMoMHhlYjcwZTRmOCksIFdUQygweGVjODFiNzVkKSwKKyAgICBXVEMoMHhlZDhiOGI2YyksIFdUQygweGVlOGU4MDY4KSwgV1RDKDB4ZWY4YWE5NzApLCBXVEMoMHhmMDgwMGRmZCksCisgICAgV1RDKDB4ZjE2ZWRjNGQpLCBXVEMoMHhmMjU3Njg1MyksIFdUQygweGYzMzllMDU4KSwgV1RDKDB4ZjQxNjRhNTEpLAorICAgIFdUQygweGY0ZWM4ZmI4KSwgV1RDKDB4ZjViYzdjZWYpLCBXVEMoMHhmNjg1YTY5NyksIFdUQygweGY3NDc3MWM5KSwKKyAgICBXVEMoMHhmODAxZjMxYiksIFdUQygweGY4YjVlZWIxKSwgV1RDKDB4Zjk2M2ZhZGIpLCBXVEMoMHhmYTBjNzQyNyksCisgICAgV1RDKDB4ZmFhZjNlMGYpLCBXVEMoMHhmYjRiY2I2ZCksIFdUQygweGZiZTIyNzZmKSwgV1RDKDB4ZmM3MmY1NzgpLAorICAgIFdUQygweGZjZmU2NWQ5KSwgV1RDKDB4ZmQ4NDJlNWIpLCBXVEMoMHhmZTAzZTE0ZSksIFdUQygweGZlN2NlMDdkKSwKKyAgICBXVEMoMHhmZWVmOTMyYiksIFdUQygweGZmNWQwMjM2KSwgV1RDKDB4ZmZjNjhmZWUpLCBXVEMoMHgwMDJkYmNjYyksCisgICAgV1RDKDB4MDA5MjdjNzgpLCBXVEMoMHgwMGYzMmNiZCksIFdUQygweDAxNGQ3MjA5KSwgV1RDKDB4MDE5ZTVmNTEpLAorICAgIFdUQygweDAxZTU1MGFhKSwgV1RDKDB4MDIyM2ZjMDcpLCBXVEMoMHgwMjVkMjYxOCksIFdUQygweDAyOTQ3YjEyKSwKKyAgICBXVEMoMHgwMmNjMzNkYiksIFdUQygweDAzMDRmYTkyKSwgV1RDKDB4MDMzZGI3MTMpLCBXVEMoMHgwMzczYTQzMSksCisgICAgV1RDKDB4MDNhNDdkOTYpLCBXVEMoMHgwM2NlOWIwZiksIFdUQygweDAzZjE0ZGM5KSwgV1RDKDB4MDQwY2UwYmMpLAorICAgIFdUQygweDA0MjI0NWE5KSwgV1RDKDB4MDQzMzA5YTUpLCBXVEMoMHgwNDQwOTgxYSksIFdUQygweDA0NGMzMGYxKSwKKyAgICBXVEMoMHgwNDU2YmI3NCksIFdUQygweDA0NjBjMWI0KSwgV1RDKDB4MDQ2YTJmZGQpLCBXVEMoMHgwNDcyNTczZiksCisgICAgV1RDKDB4MDQ3ODc3YjYpLCBXVEMoMHgwNDdiYzY3MyksIFdUQygweDA0N2I4NjE1KSwgV1RDKDB4MDQ3NzBiZTIpLAorICAgIFdUQygweDA0NmUyM2ZjKSwgV1RDKDB4MDQ2MTE0NjApLCBXVEMoMHgwNDUwN2ZiZCksIFdUQygweDA0M2Q2MTcwKSwKKyAgICBXVEMoMHgwNDI4Y2EzMSksIFdUQygweDA0MTNkMzlhKSwgV1RDKDB4MDNmZWI5YzMpLCBXVEMoMHgwM2U4ZDk0NiksCisgICAgV1RDKDB4MDNkMTY2NjcpLCBXVEMoMHgwM2I3N2FiYSksIFdUQygweDAzOWFhMzg0KSwgV1RDKDB4MDM3YWU3NWMpLAorICAgIFdUQygweDAzNThiZTgwKSwgV1RDKDB4MDMzNTBhZjYpLCBXVEMoMHgwMzEwNjRmYSksIFdUQygweDAyZWIxM2Y2KSwKKyAgICBXVEMoMHgwMmM1MWE3YiksIFdUQygweDAyOWUzOGIwKSwgV1RDKDB4MDI3NjE5ZWYpLCBXVEMoMHgwMjRjNWMwOSksCisgICAgV1RDKDB4MDIyMTBlYTMpLCBXVEMoMHgwMWY0YjE5ZSksIFdUQygweDAxYzc4Zjc5KSwgV1RDKDB4MDE5OWI4YWQpLAorICAgIFdUQygweDAxNmIzYWVmKSwgV1RDKDB4MDEzYzIzNjYpLCBXVEMoMHgwMTBjN2JlOCksIFdUQygweDAwZGM0YmI1KSwKKyAgICBXVEMoMHgwMGFiYWIyOSksIFdUQygweDAwN2FjM2UxKSwgV1RDKDB4MDA0OWMwMmYpLCBXVEMoMHgwMDE4Y2E3MSksCisgICAgV1RDKDB4ZDYyMDgyMjEpLCBXVEMoMHhkNTRlOWY1YiksIFdUQygweGQ0N2ZhMzVmKSwgV1RDKDB4ZDNiMzViZGIpLAorICAgIFdUQygweGQyZTk5NjkzKSwgV1RDKDB4ZDIyMjI2ODUpLCBXVEMoMHhkMTVkNWU0YyksIFdUQygweGQwOWMwNmZmKSwKKyAgICBXVEMoMHhjZmRlMGMyNCksIFdUQygweGNmMjI4MWQyKSwgV1RDKDB4Y2U2OThiMmEpLCBXVEMoMHhjZGI0NTVlMCksCisgICAgV1RDKDB4Y2QwMmM5YjcpLCBXVEMoMHhjYzUzODFlNSksIFdUQygweGNiYTU4MGMzKSwgV1RDKDB4Y2FmODM5ZWEpLAorICAgIFdUQygweGNhNGFkMGI3KSwgV1RDKDB4Yzk5YzIxNTMpLCBXVEMoMHhjOGVjNWE2MSksIFdUQygweGM4M2NlMjU4KSwKKyAgICBXVEMoMHhjNzhjNDJjZCksIFdUQygweGM2ZDYyMTNiKSwgV1RDKDB4YzYxNmE2ZTApLCBXVEMoMHhjNTRhOWYyNyksCisgICAgV1RDKDB4YzQ2ZWU0NGQpLCBXVEMoMHhjMzgwNThhMiksIFdUQygweGMyN2JkODhkKSwgV1RDKDB4YzE1ZTNkMDcpLAorICAgIFdUQygweGMwMjRhNGQ5KSwgV1RDKDB4YmVjYzdjYTIpLCBXVEMoMHhiZDUzZjJiOSksIFdUQygweGJiYmE5OGI0KSwKKyAgICBXVEMoMHhiYTBmZmJjMyksIFdUQygweGI4NzJmYjI0KSwgV1RDKDB4YjZmMzY1NDcpLCBXVEMoMHhiNTkxNTM0NSksCisgICAgV1RDKDB4YjQ0YzM5NzUpLCBXVEMoMHhiMzIzODk0MiksIFdUQygweGIyMTZiM2ZiKSwgV1RDKDB4YjEyNTJiMGIpLAorICAgIFdUQygweGIwNGU1ZmM4KSwgV1RDKDB4YWY5MWMzNzApLCBXVEMoMHhhZWVlYzc2MCksIFdUQygweGFlNjRkZDBiKSwKKyAgICBXVEMoMHhhZGYzNzVjZSksIFdUQygweGFkOWEwMmYwKSwgV1RDKDB4YWQ1N2Y1YmMpLCBXVEMoMHhhZDJjYmY4NyksCisgICAgV1RDKDB4YWQxN2QxOWQpLCBXVEMoMHhhZDE4OWQ0MiksIFdUQygweGFkMmU5M2Q2KSwgV1RDKDB4YWQ1OTI2ZDMpLAorICAgIFdUQygweGFkOTdjNzhhKSwgV1RDKDB4YWRlOWU3MjYpLCBXVEMoMHhhZTRlZjZmYyksIFdUQygweGFlYzY2ODhjKSwKKyAgICBXVEMoMHhhZjRmYWQyYyksIFdUQygweGFmZWEzNjA1KSwgV1RDKDB4YjA5NTc0NjkpLCBXVEMoMHhiMTUwZDlkMiksCisgICAgV1RDKDB4YjIxYmQ3OTMpLCBXVEMoMHhiMmY1ZGU1ZCksIFdUQygweGIzZGU1NzNkKSwgV1RDKDB4YjRkNGRlNDcpLAorICAgIFdUQygweGI1ZDg5YzgwKSwgV1RDKDB4YjZlOTM3YzIpLCBXVEMoMHhiODA2MTM1NCksIFdUQygweGI5MmVhMDdjKSwKKyAgICBXVEMoMHhiYTYyNTA4ZSksIFdUQygweGJiYTA5NGU0KSwgV1RDKDB4YmNlOGRlZTApLCBXVEMoMHhiZTNhOWZlMyksCisgICAgV1RDKDB4YmY5NTQ5MzkpLCBXVEMoMHhjMGY4NGMxMSksIFdUQygweGMyNjMxOWMyKSwgV1RDKDB4YzNkNTIzYzUpLAorICAgIFdUQygweGM1NGRkYjc3KSwgV1RDKDB4YzZjY2IyMTcpLCBXVEMoMHhjODUxMThmOCksIFdUQygweGM5ZGE4MTgyKSwKKyAgICBXVEMoMHhjYjY4NWQwNyksIFdUQygweGNjZmExY2M3KSwgV1RDKDB4Y2U4ZjMyMTEpLCBXVEMoMHhkMDI3MGU0OCksCisgICAgV1RDKDB4ZDFjMTIyYzcpLCBXVEMoMHhkMzVjZTBkZSksIFdUQygweGQ0ZjliOWUxKSwgV1RDKDB4ZDY5NzFmMjMpLAorICAgIFdUQygweGQ4MzQ4MWY4KSwgV1RDKDB4ZDlkMTUzYmIpLCBXVEMoMHhkYjZkMDVjMCksIFdUQygweGRkMDcwOTU2KSwKKyAgICBXVEMoMHhkZTllY2ZkMiksIFdUQygweGUwMzNjYTkxKSwgV1RDKDB4ZTFjNTZhZTcpLCBXVEMoMHhlMzUzMjIyMyksCisgICAgV1RDKDB4ZTRkYzYxOTkpLCBXVEMoMHhlNjYwOWFhNSksIFdUQygweGU3ZGYzZTlhKSwgV1RDKDB4ZTk1N2JlYzkpLAorICAgIFdUQygweGVhYzk4Yzg0KSwgV1RDKDB4ZWMzNDE5MjcpLCBXVEMoMHhlZDk2ZDYwNyksIFdUQygweGVlZjEzNDc0KSwKKyAgICBXVEMoMHhmMDQyYTVjNSksIFdUQygweGYxOGE5YjRlKSwgV1RDKDB4ZjJjODg2NjcpLCBXVEMoMHhmM2ZiZDg2MyksCisgICAgV1RDKDB4ZjUyNDAyOTYpLCBXVEMoMHhmNjQwNzY1OCksIFdUQygweGY3NTBhNGZlKSwgV1RDKDB4Zjg1M2ZmZGEpLAorICAgIFdUQygweGY5NDlmODQwKSwgV1RDKDB4ZmEzMWZmODMpLCBXVEMoMHhmYjBiODZmYiksIFdUQygweGZiZDVmZmZlKSwKKyAgICBXVEMoMHhmYzkwZGJlMSksIFdUQygweGZkM2I4YmY4KSwgV1RDKDB4ZmRkNTgxOTcpLCBXVEMoMHhmZTVlMmUxNCksCisgICAgV1RDKDB4ZmVkNTAyYzQpLCBXVEMoMHhmZjM5NzBmYyksIFdUQygweGZmOGFlYTBmKSwgV1RDKDB4ZmZjOGRmNTUpLAorICAgIFdUQygweGZmZjJjMjMzKSwgV1RDKDB4MDAwODA0ZTYpLCBXVEMoMHgwMDA4MjU2YSksIFdUQygweGZmZjI1MzU4KSwKK307CiAKK2NvbnN0IEZJWFBfV1RCIExvd0RlbGF5U3ludGhlc2lzMjQwWzcyMF0gPSB7CisgICAgV1RDKDB4ZGFmMTZiYTEpLCBXVEMoMHhkYjg4OGQ0ZCksIFdUQygweGRjMjEyYmMxKSwgV1RDKDB4ZGNiYjUxZDApLAorICAgIFdUQygweGRkNTcwM2JlKSwgV1RDKDB4ZGRmNDNmM2IpLCBXVEMoMHhkZTkyZmVlNSksIFdUQygweGRmMzMzZjkyKSwKKyAgICBXVEMoMHhkZmQ1MDVkMSksIFdUQygweGUwNzg2MjRhKSwgV1RDKDB4ZTExZDQ4ZmYpLCBXVEMoMHhlMWMzOTM1OCksCisgICAgV1RDKDB4ZTI2YjIwNjYpLCBXVEMoMHhlMzEzZDhhOSksIFdUQygweGUzYmRlNjNjKSwgV1RDKDB4ZTQ2OTZlNDUpLAorICAgIFdUQygweGU1MTY0ZDk1KSwgV1RDKDB4ZTVjNDU5N2QpLCBXVEMoMHhlNjczNTk2ZiksIFdUQygweGU3MjMxNTNjKSwKKyAgICBXVEMoMHhlN2QzNTgxMyksIFdUQygweGU4ODNmYTQ5KSwgV1RDKDB4ZTkzNGU3YTMpLCBXVEMoMHhlOWU2NDIwNSksCisgICAgV1RDKDB4ZWE5ODRhYTgpLCBXVEMoMHhlYjRhZTZlZiksIFdUQygweGViZmRjYmY2KSwgV1RDKDB4ZWNiMDc0NGIpLAorICAgIFdUQygweGVkNjI1NjcxKSwgV1RDKDB4ZWUxMzMzNjEpLCBXVEMoMHhlZWMyZTFiNCksIFdUQygweGVmNzE1MzM0KSwKKyAgICBXVEMoMHhmMDFlNzU4OCksIFdUQygweGYwY2EzM2VjKSwgV1RDKDB4ZjE3NDhhNGUpLCBXVEMoMHhmMjFkODNlZCksCisgICAgV1RDKDB4ZjJjNTBkYmUpLCBXVEMoMHhmMzZiMDYzOSksIFdUQygweGY0MGY0ODkyKSwgV1RDKDB4ZjRiMTk0NGQpLAorICAgIFdUQygweGY1NTE3Mjg5KSwgV1RDKDB4ZjVlZTU3M2QpLCBXVEMoMHhmNjg3ZDcwZCksIFdUQygweGY3MWRiMzY4KSwKKyAgICBXVEMoMHhmN2IwMTA1NyksIFdUQygweGY4M2Y2NTcwKSwgV1RDKDB4ZjhjYzlkMGEpLCBXVEMoMHhmOTU4NWE3MyksCisgICAgV1RDKDB4ZjllMzA3ZjgpLCBXVEMoMHhmYTZkNDRkMiksIFdUQygweGZhZjc5ZDc1KSwgV1RDKDB4ZmI4MjA4ZTgpLAorICAgIFdUQygweGZjMGMzM2M4KSwgV1RDKDB4ZmM5NmQwMGMpLCBXVEMoMHhmZDIyZjI1NyksIFdUQygweGZkYjFlNjIzKSwKKyAgICBXVEMoMHhmZTQzMThhMyksIFdUQygweGZlZDA4YzFkKSwgV1RDKDB4ZmY1MDkxZjEpLCBXVEMoMHhmZmI0MzkwYSksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4YmZmNjJiNjIpLCBXVEMoMHhiZmUyOGE4NCksIFdUQygweGJmY2VlMzBkKSwgV1RDKDB4YmZiYjM4MzIpLAorICAgIFdUQygweGJmYTc4ZDI5KSwgV1RDKDB4YmY5M2U0OTApLCBXVEMoMHhiZjgwM2NjNiksIFdUQygweGJmNmM5Mzc2KSwKKyAgICBXVEMoMHhiZjU4ZWI4OSksIFdUQygweGJmNDU0N2Y4KSwgV1RDKDB4YmYzMWE2YWEpLCBXVEMoMHhiZjFlMDZhMyksCisgICAgV1RDKDB4YmYwYTZiZGYpLCBXVEMoMHhiZWY2ZDg2MyksIFdUQygweGJlZTM0OWU1KSwgV1RDKDB4YmVjZmMxNDUpLAorICAgIFdUQygweGJlYmM0MzYyKSwgV1RDKDB4YmVhOGQxMTEpLCBXVEMoMHhiZTk1NjgwNiksIFdUQygweGJlODIwYWViKSwKKyAgICBXVEMoMHhiZTZlYmViOSksIFdUQygweGJlNWI4MzEzKSwgV1RDKDB4YmU0ODU2NzgpLCBXVEMoMHhiZTM1M2NmYiksCisgICAgV1RDKDB4YmUyMjNhYjgpLCBXVEMoMHhiZTBmNGU1ZiksIFdUQygweGJkZmM3N2I0KSwgV1RDKDB4YmRlOWJiOTkpLAorICAgIFdUQygweGJkZDcxY2JlKSwgV1RDKDB4YmRjNDk5MGQpLCBXVEMoMHhiZGIyMzE3NSksIFdUQygweGJkOWZlYWI2KSwKKyAgICBXVEMoMHhiZDhkYzU4ZCksIFdUQygweGJkN2JiZjhjKSwgV1RDKDB4YmQ2OWRhZWMpLCBXVEMoMHhiZDU4MWMwNyksCisgICAgV1RDKDB4YmQ0NjgyMGMpLCBXVEMoMHhiZDM1MGFmOCksIFdUQygweGJkMjNiOWNjKSwgV1RDKDB4YmQxMjkxNTgpLAorICAgIFdUQygweGJkMDE4ZWNlKSwgV1RDKDB4YmNmMGIwNTcpLCBXVEMoMHhiY2RmZjkxMiksIFdUQygweGJjY2Y2OWNmKSwKKyAgICBXVEMoMHhiY2JlZmU4MSksIFdUQygweGJjYWViNjNhKSwgV1RDKDB4YmM5ZTk0MDYpLCBXVEMoMHhiYzhlOTc3YyksCisgICAgV1RDKDB4YmM3ZWJkNTgpLCBXVEMoMHhiYzZmMDU0NCksIFdUQygweGJjNWY3MDc3KSwgV1RDKDB4YmM0ZmZlMWQpLAorICAgIFdUQygweGJjNDBhYjk5KSwgV1RDKDB4YmMzMTcyMzkpLCBXVEMoMHhiYzIyNTJhZCksIFdUQygweGJjMTM2OTYzKSwKKyAgICBXVEMoMHhiYzA0YTgyMiksIFdUQygweGJiZjU5NDFlKSwgV1RDKDB4YmJlNjhkYWIpLCBXVEMoMHhiYmQ5N2EzNiksCisgICAgV1RDKDB4YmJjZmY0NGYpLCBXVEMoMHhiYmNiMTg5MSksIFdUQygweGJiY2E3ODE4KSwgV1RDKDB4YmJjYzc2NWYpLAorICAgIFdUQygweGJiY2ZmYWE1KSwgV1RDKDB4YmJkNDZhMGYpLCBXVEMoMHhiYmRhNDA2MCksIFdUQygweGJiZTI1N2YxKSwKKyAgICBXVEMoMHhiYmVkMTMxYyksIFdUQygweGJiZmE3NjI4KSwgV1RDKDB4YmMwOWNkZDYpLCBXVEMoMHhiYzFhNjg1YiksCisgICAgV1RDKDB4YmMyYmYyZmQpLCBXVEMoMHhiYzNlNjU1NyksIFdUQygweGJjNTIxZDM3KSwgV1RDKDB4YmM2N2MwOTMpLAorICAgIFdUQygweGJjODAzYjk4KSwgV1RDKDB4YmM5YzMwNjApLCBXVEMoMHhiY2JiZjZkYSksIFdUQygweGJjZGY4YzUxKSwKKyAgICBXVEMoMHhiZDA2YWZiNSksIFdUQygweGJkMzBlMzZkKSwgV1RDKDB4YmQ1ZDk5YTApLCBXVEMoMHhiZDhjNzFhNiksCisgICAgV1RDKDB4YmRiZDI5YzMpLCBXVEMoMHhiZGVmYjcyYSksIFdUQygweGJlMjQzNjYwKSwgV1RDKDB4YmU1YjAzMzUpLAorICAgIFdUQygweGJlOTQ3N2ZkKSwgV1RDKDB4YmVkMGRlMDApLCBXVEMoMHhiZjEwODg4MSksIFdUQygweGJmNTNkNTg1KSwKKyAgICBXVEMoMHhiZjlhZWViYSksIFdUQygweGJmZTViYjM4KSwgV1RDKDB4YzAzMzMxOGMpLCBXVEMoMHhjMDgxY2RmMiksCisgICAgV1RDKDB4YzBkMGE5ZWUpLCBXVEMoMHhjMTFmNzZkNSksIFdUQygweGMxNmY2NmMzKSwgV1RDKDB4YzFjMWQ1YzEpLAorICAgIFdUQygweGMyMTcyNmQ0KSwgV1RDKDB4YzI2ZjViYmEpLCBXVEMoMHhjMmNhMTAzNiksIFdUQygweGMzMjY4YjBmKSwKKyAgICBXVEMoMHhjMzgzOWZmMyksIFdUQygweGMzZTAzZDIyKSwgV1RDKDB4YzQzYjkzZWYpLCBXVEMoMHhjNDk2ODU5NCksCisgICAgV1RDKDB4YzRmMzM1M2MpLCBXVEMoMHhjNTUyMDJhYiksIFdUQygweGM1YjIxZmNmKSwgV1RDKDB4YzYxMjI0ZTYpLAorICAgIFdUQygweGM2NzBjMTY4KSwgV1RDKDB4YzZjZTNmMWUpLCBXVEMoMHhjNzJiM2ZiYiksIFdUQygweGM3ODdlNjg4KSwKKyAgICBXVEMoMHhjN2U0MWY1NiksIFdUQygweGM4M2Y5NGE5KSwgV1RDKDB4Yzg5OWU4MzMpLCBXVEMoMHhjOGYyYjgzMiksCisgICAgV1RDKDB4YjRkMWZjNzgpLCBXVEMoMHhiM2E5ZWM3MCksIFdUQygweGIyODUyNGNhKSwgV1RDKDB4YjE2M2EyYmEpLAorICAgIFdUQygweGIwNDU2MzczKSwgV1RDKDB4YWYyYTYzMjcpLCBXVEMoMHhhZTEyOTcwOCksIFdUQygweGFjZmRmMmNhKSwKKyAgICBXVEMoMHhhYmVjNzE2OCksIFdUQygweGFhZGUwZjhjKSwgV1RDKDB4YTlkMmM4MGEpLCBXVEMoMHhhOGNhOTcxMSksCisgICAgV1RDKDB4YTdjNTdjZGMpLCBXVEMoMHhhNmMzN2MyOSksIFdUQygweGE1YzQ5YWU2KSwgV1RDKDB4YTRjOGUwMmMpLAorICAgIFdUQygweGEzZDA1NDIyKSwgV1RDKDB4YTJkYWZmODMpLCBXVEMoMHhhMWU4ZWMwNCksIFdUQygweGEwZmEyOTNmKSwKKyAgICBXVEMoMHhhMDBlYzk4YSksIFdUQygweDlmMjZkOTkwKSwgV1RDKDB4OWU0MjY1YTUpLCBXVEMoMHg5ZDYxODQzNyksCisgICAgV1RDKDB4OWM4NDRjZTApLCBXVEMoMHg5YmFhZDBmYSksIFdUQygweDlhZDUyMTU0KSwgV1RDKDB4OWEwMzUwOWIpLAorICAgIFdUQygweDk5MzU3MmVkKSwgV1RDKDB4OTg2YjllNGQpLCBXVEMoMHg5N2E1ZTdkOCksIFdUQygweDk2ZTQ2MzI5KSwKKyAgICBXVEMoMHg5NjI3MWZmOCksIFdUQygweDk1NmUyYWI4KSwgV1RDKDB4OTRiOThmOWMpLCBXVEMoMHg5NDA5NWE5NyksCisgICAgV1RDKDB4OTM1ZDk2OWIpLCBXVEMoMHg5MmI2NGNkZiksIFdUQygweDkyMTM4MDliKSwgV1RDKDB4OTE3NTMyOGEpLAorICAgIFdUQygweDkwZGI2MTUzKSwgV1RDKDB4OTA0NjA3MTIpLCBXVEMoMHg4ZmI1MTQ2ZiksIFdUQygweDhmMjg3NmY0KSwKKyAgICBXVEMoMHg4ZWEwMThlNSksIFdUQygweDhlMWJkNmRmKSwgV1RDKDB4OGQ5YjdkOWIpLCBXVEMoMHg4ZDFlZDc0NSksCisgICAgV1RDKDB4OGNhNWE5NDIpLCBXVEMoMHg4YzJmOTNjZSksIFdUQygweDhiYmMyMDRjKSwgV1RDKDB4OGI0YWQ1OGQpLAorICAgIFdUQygweDhhZGIzMWU0KSwgV1RDKDB4OGE2YzkwOWIpLCBXVEMoMHg4OWZlNjczZCksIFdUQygweDg5OTBhNDc4KSwKKyAgICBXVEMoMHg4OTI0NDY3MCksIFdUQygweDg4YmM4NGNiKSwgV1RDKDB4ODg1ZTA5NjMpLCBXVEMoMHg4ODBmNzNmNSksCisgICAgV1RDKDB4ODdjYmEyYzApLCBXVEMoMHg4N2I0OGE2ZiksIFdUQygweDg3OTlmYjI1KSwgV1RDKDB4ODc3ZjQ2ZjIpLAorICAgIFdUQygweDg3NjUxOWNkKSwgV1RDKDB4ODc0YTlhMTEpLCBXVEMoMHg4NzJmYWUwMSksIFdUQygweDg3MTQ4N2QyKSwKKyAgICBXVEMoMHg4NmY5Mjg3YiksIFdUQygweDg2ZGQ4M2I1KSwgV1RDKDB4ODZjMTk0N2MpLCBXVEMoMHg4NmE1NThmMSksCisgICAgV1RDKDB4ODY4OGQyZTMpLCBXVEMoMHg4NjZjMDE1YiksIFdUQygweDg2NGVkZTBjKSwgV1RDKDB4ODYzMTY3Y2MpLAorICAgIFdUQygweDg2MTNhM2I4KSwgV1RDKDB4ODVmNThmYjIpLCBXVEMoMHg4NWQ3MjNmMCksIFdUQygweDg1Yjg2MTc2KSwKKyAgICBXVEMoMHg4NTk5NGQ4MiksIFdUQygweDg1NzllNDQzKSwgV1RDKDB4ODU1YTIwMWIpLCBXVEMoMHg4NTNhMDViNyksCisgICAgV1RDKDB4ODUxOTlhMjYpLCBXVEMoMHg4NGY4ZDkzZiksIFdUQygweDg0ZDdjMTAwKSwgV1RDKDB4ODRiNjU5MDEpLAorICAgIFdUQygweDg0OTRhNGVlKSwgV1RDKDB4ODQ3MjlmZDQpLCBXVEMoMHg4NDUwNGE5YiksIFdUQygweDg0MmRhZGIzKSwKKyAgICBXVEMoMHg4NDBhY2E3MSksIFdUQygweDgzZTc5Yzg3KSwgV1RDKDB4ODNjNDI4OTIpLCBXVEMoMHg4M2EwNzc2NyksCisgICAgV1RDKDB4ODM3Yzg4M2EpLCBXVEMoMHg4MzU4NTgzNSksIFdUQygweDgzMzNlZWNhKSwgV1RDKDB4ODMwZjUzNjgpLAorICAgIFdUQygweDgyZWE4MmVjKSwgV1RDKDB4ODJjNTdjNTcpLCBXVEMoMHg4MmEwNDhlYSksIFdUQygweDgyN2FlZDg2KSwKKyAgICBXVEMoMHg4MjU1NjU4OCksIFdUQygweDgyMmZiMjU1KSwgV1RDKDB4ODIwOWRkMWUpLCBXVEMoMHg4MWUzZTc2ZiksCisgICAgV1RDKDB4ODFiZGNjYWMpLCBXVEMoMHg4MTk3OTA5OCksIFdUQygweDgxNzEzYWQ3KSwgV1RDKDB4ODE0YWM5NWQpLAorICAgIFdUQygweDgxMjQzN2YyKSwgV1RDKDB4ODBmZDhjNGIpLCBXVEMoMHg4MGQ2Y2MwYSksIFdUQygweDgwYWZmMjgzKSwKKyAgICBXVEMoMHg4MDg4ZmM2NCksIFdUQygweDgwNjFlZWJlKSwgV1RDKDB4ODAzYWNmZTkpLCBXVEMoMHg4MDEzYTYyZCksCisgICAgV1RDKDB4MGE4ZDcxMGEpLCBXVEMoMHgwYWVjZDk3NCksIFdUQygweDBiNGY3NDQ5KSwgV1RDKDB4MGJiNGQxM2IpLAorICAgIFdUQygweDBjMWM3ZmVlKSwgV1RDKDB4MGM4NjIwMmEpLCBXVEMoMHgwY2YxYzJlNyksIFdUQygweDBkNWY5OGQxKSwKKyAgICBXVEMoMHgwZGNmODE2YSksIFdUQygweDBlNDE2MmFlKSwgV1RDKDB4MGViNTg4YWQpLCBXVEMoMHgwZjJjMWU4OCksCisgICAgV1RDKDB4MGZhNGQxNGYpLCBXVEMoMHgxMDFmNGQ4MCksIFdUQygweDEwOWI1YmZkKSwgV1RDKDB4MTExOGI5MDgpLAorICAgIFdUQygweDExOTcxNDY2KSwgV1RDKDB4MTIxNjgyNDkpLCBXVEMoMHgxMjk3NTRhYiksIFdUQygweDEzMThkNWMwKSwKKyAgICBXVEMoMHgxMzk5YjVkNyksIFdUQygweDE0MThkOGVjKSwgV1RDKDB4MTQ5NTNmMjQpLCBXVEMoMHgxNTBkZmU4YSksCisgICAgV1RDKDB4MTU4MjJmYWEpLCBXVEMoMHgxNWYwZGQ3MCksIFdUQygweDE2NTkyMDE0KSwgV1RDKDB4MTZiYTM1YjIpLAorICAgIFdUQygweDE3MTM4NGU3KSwgV1RDKDB4MTc2NGNmMWYpLCBXVEMoMHgxN2IyMmEyOCksIFdUQygweDE4MDQ3ZDQwKSwKKyAgICBXVEMoMHgxODVmZmMwNSksIFdUQygweDE4YzRhMDc1KSwgV1RDKDB4MTkzMjI5ODApLCBXVEMoMHgxOWE4NDY0MyksCisgICAgV1RDKDB4MWEyNmE4ZjQpLCBXVEMoMHgxYWFkMDk5ZCksIFdUQygweDFiM2IzNDkzKSwgV1RDKDB4MWJkMGViMzIpLAorICAgIFdUQygweDFjNmRiNzU0KSwgV1RDKDB4MWQxMTVhOGMpLCBXVEMoMHgxZGJjMzI5YiksIFdUQygweDFlNmVjYjMzKSwKKyAgICBXVEMoMHgxZjI5ZDQyYSksIFdUQygweDFmZWRhMmU0KSwgV1RDKDB4MjBiYTA1NmUpLCBXVEMoMHgyMThkMDJhMiksCisgICAgV1RDKDB4MjI2MzVjNzUpLCBXVEMoMHgyMzNjMmU3ZiksIFdUQygweDI0MTg0ZGExKSwgV1RDKDB4MjRmYTc5OWQpLAorICAgIFdUQygweDI1ZTU0ZTk1KSwgV1RDKDB4MjZkNmVkZDgpLCBXVEMoMHgyN2NjNTdhNSksIFdUQygweDI4YzM2MzQ5KSwKKyAgICBXVEMoMHgyOWJiZGZkZiksIFdUQygweDJhYjliN2MyKSwgV1RDKDB4MmJjMDk3OTApLCBXVEMoMHgyY2QyZDQ2NSksCisgICAgV1RDKDB4MmRlZjRjYjkpLCBXVEMoMHgyZjExNWRjYyksIFdUQygweDMwMzNhOTljKSwgV1RDKDB4MzE1MGZkOGQpLAorICAgIFdUQygweDMyNjk4YTk0KSwgV1RDKDB4MzM4MTUyZTYpLCBXVEMoMHgzNGEwMmRjZCksIFdUQygweDM1Y2RlZGQxKSwKKyAgICBXVEMoMHgzNzBhYTlmYSksIFdUQygweDM4NTI3YTc5KSwgV1RDKDB4Mzk5YzRhNGYpLCBXVEMoMHgzYWRmOWMyNyksCisgICAgV1RDKDB4M2MxN2VkYzcpLCBXVEMoMHgzZDQ0ZjA1ZCksIFdUQygweDNlNmM1MTllKSwgV1RDKDB4M2Y5M2VhNWIpLAorICAgIFdUQygweDQwYzBmYzZkKSwgV1RDKDB4NDFmNjBiZGQpLCBXVEMoMHg0MzMzMmQxNSksIFdUQygweDQ0NzZlNmVhKSwKKyAgICBXVEMoMHg0NWJlYjdlMSksIFdUQygweDQ3MDcyZjJiKSwgV1RDKDB4NDg0Y2I3MWEpLCBXVEMoMHg0OThjZWFmZCksCisgICAgV1RDKDB4NGFjNjUwYzMpLCBXVEMoMHg0YmY5MzQ1OCksIFdUQygweDRkMjZhNGM3KSwgV1RDKDB4NGU1MDkwZWIpLAorICAgIFdUQygweDRmNzhjMmFjKSwgV1RDKDB4NTBhMDkxOGEpLCBXVEMoMHg1MWM5Mzk5NSksIFdUQygweDUyZjNkNmM3KSwKKyAgICBXVEMoMHg1NDIwYTlhMiksIFdUQygweDU1NGVmMTIyKSwgV1RDKDB4NTY3YWM0YTkpLCBXVEMoMHg1NzllYmViOSksCisgICAgV1RDKDB4NThiODU2OWMpLCBXVEMoMHg1OWM3NGVhNCksIFdUQygweDVhZDAzZjMxKSwgV1RDKDB4NWJkODIxYzgpLAorICAgIFdUQygweDVjZTA1NTAyKSwgV1RDKDB4NWRlOGU1ODIpLCBXVEMoMHg1ZWYwOWI0OSksIFdUQygweDVmZjU2MjQ3KSwKKyAgICBXVEMoMHg2MGY0MGQ4MSksIFdUQygweDYxZWExNDUwKSwgV1RDKDB4NjJkNjBhMmQpLCBXVEMoMHg2M2JhZDdmMSksCisgICAgV1RDKDB4NjQ5ZTk0MmUpLCBXVEMoMHg2NTgyNzU1NiksIFdUQygweDY2NjQ4MTc4KSwgV1RDKDB4Njc0MThjMzEpLAorICAgIFdUQygweDY4MTZjMWVlKSwgV1RDKDB4NjhlNTQxMWQpLCBXVEMoMHg2OWFlZmZkYiksIFdUQygweDZhNzRiYjBlKSwKKyAgICBXVEMoMHg2YjM2YTVhZSksIFdUQygweDZiZjQ0ZmQxKSwgV1RDKDB4NmNhZDM0MWYpLCBXVEMoMHg2ZDYwYzBjYSksCisgICAgV1RDKDB4YWUzNWY3OWIpLCBXVEMoMHhiMDdlMWIwZCksIFdUQygweGIyYmFkMjZkKSwgV1RDKDB4YjRlZDhhZjcpLAorICAgIFdUQygweGI3MTdiMjA3KSwgV1RDKDB4YjkzYThmNWIpLCBXVEMoMHhiYjU2NjMxZSksIFdUQygweGJkNmFmY2FiKSwKKyAgICBXVEMoMHhiZjc4MzJkYiksIFdUQygweGMxN2RkOTk2KSwgV1RDKDB4YzM3YmIzNTUpLCBXVEMoMHhjNTcxOGQ3MiksCisgICAgV1RDKDB4Yzc1ZjU2Y2MpLCBXVEMoMHhjOTQ0ZjkzZCksIFdUQygweGNiMjI0ZjE3KSwgV1RDKDB4Y2NmNzQ4MDUpLAorICAgIFdUQygweGNlYzNlZDhjKSwgV1RDKDB4ZDA4ODM1ZDkpLCBXVEMoMHhkMjQ0MDgzNyksIFdUQygweGQzZjc2OTJkKSwKKyAgICBXVEMoMHhkNWEyNmIxNyksIFdUQygweGQ3NDUwMmI2KSwgV1RDKDB4ZDhkZjFmODIpLCBXVEMoMHhkYTcwZDQ5NSksCisgICAgV1RDKDB4ZGJmYTM1YTEpLCBXVEMoMHhkZDdiMzQ5OCksIFdUQygweGRlZjNjYmEzKSwgV1RDKDB4ZTA2NDE4NGUpLAorICAgIFdUQygweGUxY2MyYWI5KSwgV1RDKDB4ZTMyYmY1NDgpLCBXVEMoMHhlNDgzODFjZCksIFdUQygweGU1ZDJmNzc5KSwKKyAgICBXVEMoMHhlNzFhNjIxOCksIFdUQygweGU4NTliNzg5KSwgV1RDKDB4ZTk5MTBhNjApLCBXVEMoMHhlYWMwNzk1NiksCisgICAgV1RDKDB4ZWJlN2ZiNTUpLCBXVEMoMHhlZDA3N2Y0MSksIFdUQygweGVlMWYxZjlkKSwgV1RDKDB4ZWYyZWZkOTkpLAorICAgIFdUQygweGYwMzcyNDcyKSwgV1RDKDB4ZjEzN2I2MDUpLCBXVEMoMHhmMjMxMTJiMyksIFdUQygweGYzMjM4MDhhKSwKKyAgICBXVEMoMHhmNDBmMGE4NiksIFdUQygweGY0ZjM5ODgzKSwgV1RDKDB4ZjVkMGViM2MpLCBXVEMoMHhmNmE2NzljNiksCisgICAgV1RDKDB4Zjc3Mzk2NDApLCBXVEMoMHhmODM4OTg0OSksIFdUQygweGY4ZjY2YjJhKSwgV1RDKDB4ZjlhZGE3ZDYpLAorICAgIFdUQygweGZhNWU5N2VkKSwgV1RDKDB4ZmIwOGJlY2QpLCBXVEMoMHhmYmFiYjM4MCksIFdUQygweGZjNDgxMjVmKSwKKyAgICBXVEMoMHhmY2RlNWI0MCksIFdUQygweGZkNmU0YWFjKSwgV1RDKDB4ZmRmNzY1NjApLCBXVEMoMHhmZTc4ZjNhYiksCisgICAgV1RDKDB4ZmVmMzRjZjApLCBXVEMoMHhmZjY3YjY4OSksIFdUQygweGZmZDdlMzQyKSwgV1RDKDB4MDA0NTg0ZWYpLAorICAgIFdUQygweDAwYjAwMDc0KSwgV1RDKDB4MDExNTJkNDcpLCBXVEMoMHgwMTcxY2NlYSksIFdUQygweDAxYzJmZGJlKSwKKyAgICBXVEMoMHgwMjA5YjU2MyksIFdUQygweDAyNDg5ODMyKSwgV1RDKDB4MDI4M2UyY2QpLCBXVEMoMHgwMmJmMjA1MCksCisgICAgV1RDKDB4MDJmYjcyZmIpLCBXVEMoMHgwMzM4MWYyOSksIFdUQygweDAzNzFlYTdjKSwgV1RDKDB4MDNhNjAyZjMpLAorICAgIFdUQygweDAzZDI2N2UwKSwgV1RDKDB4MDNmNjYyMWIpLCBXVEMoMHgwNDEyNWRjOCksIFdUQygweDA0MjdiN2E1KSwKKyAgICBXVEMoMHgwNDM4NTA2MiksIFdUQygweDA0NDVjYWNhKSwgV1RDKDB4MDQ1MThlZTMpLCBXVEMoMHgwNDVjNzQ1ZSksCisgICAgV1RDKDB4MDQ2NmQ3MTQpLCBXVEMoMHgwNDcwMTI1YyksIFdUQygweDA0Nzc0MmQ3KSwgV1RDKDB4MDQ3YjczY2YpLAorICAgIFdUQygweDA0N2JiYTgyKSwgV1RDKDB4MDQ3NzQ0YWEpLCBXVEMoMHgwNDZkYzUzNiksIFdUQygweDA0NWY5MDY4KSwKKyAgICBXVEMoMHgwNDRkNzYzMiksIFdUQygweDA0MzhhYTkyKSwgV1RDKDB4MDQyMjdmMzkpLCBXVEMoMHgwNDBjMjMzMSksCisgICAgV1RDKDB4MDNmNTYxZDgpLCBXVEMoMHgwM2RkNjBiNCksIFdUQygweDAzYzMxMDY0KSwgV1RDKDB4MDNhNThkN2QpLAorICAgIFdUQygweDAzODRiNzRmKSwgV1RDKDB4MDM2MGUyOWEpLCBXVEMoMHgwMzNiMTE1MSksIFdUQygweDAzMTQxN2YwKSwKKyAgICBXVEMoMHgwMmVjNTRjYSksIFdUQygweDAyYzNkMmNlKSwgV1RDKDB4MDI5YTQ1OGQpLCBXVEMoMHgwMjZmNDQxMSksCisgICAgV1RDKDB4MDI0MjYwOTMpLCBXVEMoMHgwMjEzZDY3ZiksIFdUQygweDAxZTQzYjAxKSwgV1RDKDB4MDFiM2M3YzEpLAorICAgIFdUQygweDAxODI4ZGQ4KSwgV1RDKDB4MDE1MDlkOTIpLCBXVEMoMHgwMTFlMDU1NiksIFdUQygweDAwZWFjZTFkKSwKKyAgICBXVEMoMHgwMGI3MGJiMyksIFdUQygweDAwODJlZDhiKSwgV1RDKDB4MDA0ZWE3MDcpLCBXVEMoMHgwMDFhNmI4ZiksCisgICAgV1RDKDB4ZDYxOTc2OWIpLCBXVEMoMHhkNTM5Y2JmNiksIFdUQygweGQ0NWQ2OGI5KSwgV1RDKDB4ZDM4NDBmY2UpLAorICAgIFdUQygweGQyYWQ4NDBiKSwgV1RDKDB4ZDFkOWE1ODApLCBXVEMoMHhkMTA5MjE2MCksIFdUQygweGQwM2NhY2RjKSwKKyAgICBXVEMoMHhjZjczODNiYSksIFdUQygweGNlYWNmZDQ2KSwgV1RDKDB4Y2RlYTQyOWEpLCBXVEMoMHhjZDJiZjVlYyksCisgICAgV1RDKDB4Y2M3MDlkYzEpLCBXVEMoMHhjYmI2ZGM5MSksIFdUQygweGNhZmRmZjcxKSwgV1RDKDB4Y2E0NTA0Y2QpLAorICAgIFdUQygweGM5OGE5M2Y0KSwgV1RDKDB4YzhjZjBlYjApLCBXVEMoMHhjODEzZWU3ZiksIFdUQygweGM3NTY2NWYzKSwKKyAgICBXVEMoMHhjNjkxMmQ2MyksIFdUQygweGM1YmZmNzRhKSwgV1RDKDB4YzRkZWU5ZmEpLCBXVEMoMHhjM2VhMzllZiksCisgICAgV1RDKDB4YzJkZTFjOTQpLCBXVEMoMHhjMWI2YmQwOCksIFdUQygweGMwNzA3NGRhKSwgV1RDKDB4YmYwODEwMzgpLAorICAgIFdUQygweGJkN2IxNjZiKSwgV1RDKDB4YmJjOGFmZDcpLCBXVEMoMHhiYTAxZDQ3YyksIFdUQygweGI4NGI0ODFmKSwKKyAgICBXVEMoMHhiNmI2NTk1MyksIFdUQygweGI1NDJlNWQyKSwgV1RDKDB4YjNmMDQyOTEpLCBXVEMoMHhiMmJkYzI1YSksCisgICAgV1RDKDB4YjFhYWI4MTApLCBXVEMoMHhiMGI2NzZhMCksIFdUQygweGFmZTA1MGQ1KSwgV1RDKDB4YWYyNzk5N2QpLAorICAgIFdUQygweGFlOGJhMzkwKSwgV1RDKDB4YWUwYmMyMDIpLCBXVEMoMHhhZGE3NDc5ZCksIFdUQygweGFkNWQ4NzJmKSwKKyAgICBXVEMoMHhhZDJkZDM5MiksIFdUQygweGFkMTc3Zjk3KSwgV1RDKDB4YWQxOWRlMDQpLCBXVEMoMHhhZDM0NDFjNSksCisgICAgV1RDKDB4YWQ2NWZkZGMpLCBXVEMoMHhhZGFlNjUxNCksIFdUQygweGFlMGNjYTE4KSwgV1RDKDB4YWU4MDdmZGUpLAorICAgIFdUQygweGFmMDhkOTY3KSwgV1RDKDB4YWZhNTI5NmYpLCBXVEMoMHhiMDU0YzJhYyksIFdUQygweGIxMTZmODFiKSwKKyAgICBXVEMoMHhiMWViMWNiMSksIFdUQygweGIyZDA4MmZlKSwgV1RDKDB4YjNjNjc3ZTUpLCBXVEMoMHhiNGNjNmU5YyksCisgICAgV1RDKDB4YjVlMTdlYjQpLCBXVEMoMHhiNzA1Mjk1NiksIFdUQygweGI4MzZiNDI3KSwgV1RDKDB4Yjk3NTcxZjMpLAorICAgIFdUQygweGJhYzBiNTk0KSwgV1RDKDB4YmMxN2QxZWUpLCBXVEMoMHhiZDdhMTllYiksIFdUQygweGJlZTZlMDcxKSwKKyAgICBXVEMoMHhjMDVkNzgzNyksIFdUQygweGMxZGQzM2ZlKSwgV1RDKDB4YzM2NTY2YzIpLCBXVEMoMHhjNGY1NjM3NyksCisgICAgV1RDKDB4YzY4YzdjZTUpLCBXVEMoMHhjODJhMDVkYiksIFdUQygweGM5Y2Q1MTQ4KSwgV1RDKDB4Y2I3NWIyMDcpLAorICAgIFdUQygweGNkMjI3YWQ5KSwgV1RDKDB4Y2VkMmZlOTUpLCBXVEMoMHhkMDg2OTAyNiksIFdUQygweGQyM2M4MjY4KSwKKyAgICBXVEMoMHhkM2Y0MjgzNCksIFdUQygweGQ1YWNkNDYwKSwgV1RDKDB4ZDc2NWQ5YzUpLCBXVEMoMHhkOTFlOGI0MiksCisgICAgV1RDKDB4ZGFkNjNiYjUpLCBXVEMoMHhkYzhjM2RmMiksIFdUQygweGRlM2ZlNGQxKSwgV1RDKDB4ZGZmMDgzMzMpLAorICAgIFdUQygweGUxOWQ2YmY2KSwgV1RDKDB4ZTM0NWYxZWUpLCBXVEMoMHhlNGU5NjdmMyksIFdUQygweGU2ODcyMGU3KSwKKyAgICBXVEMoMHhlODFlNmZhMyksIFdUQygweGU5YWVhNmZiKSwgV1RDKDB4ZWIzNzE5Y2IpLCBXVEMoMHhlY2I3MWFmMyksCisgICAgV1RDKDB4ZWUyZGZkNGIpLCBXVEMoMHhlZjliMTNhYiksIFdUQygweGYwZmRiMGVlKSwgV1RDKDB4ZjI1NTI3ZjEpLAorICAgIFdUQygweGYzYTBjYjhlKSwgV1RDKDB4ZjRkZmVlOWYpLCBXVEMoMHhmNjExZTNmZiksIFdUQygweGY3MzVmZThiKSwKKyAgICBXVEMoMHhmODRiOTExYSksIFdUQygweGY5NTFlZTg1KSwgV1RDKDB4ZmE0ODY5YTUpLCBXVEMoMHhmYjJlNTU1NyksCisgICAgV1RDKDB4ZmMwMzA0NzcpLCBXVEMoMHhmY2M1YzllMCksIFdUQygweGZkNzVmODZiKSwgV1RDKDB4ZmUxMmUyZjIpLAorICAgIFdUQygweGZlOWJkYzUxKSwgV1RDKDB4ZmYxMDM3NjEpLCBXVEMoMHhmZjZmNDZmYyksIFdUQygweGZmYjg1ZGZlKSwKKyAgICBXVEMoMHhmZmVhY2Y0MiksIFdUQygweDAwMDVlZTAzKSwgV1RDKDB4MDAwOTE2MmIpLCBXVEMoMHhmZmYzNjhkMSksCit9OworCitjb25zdCBGSVhQX1dUQiBMb3dEZWxheVN5bnRoZXNpczE2MFs0ODBdID0geworICAgIFdUQygweGRiMTcxMTMwKSwgV1RDKDB4ZGJmYWRmYmQpLCBXVEMoMHhkY2UyMTkyYSksIFdUQygweGRkY2NjYmM4KSwKKyAgICBXVEMoMHhkZWJhZWIwYyksIFdUQygweGRmYWM2ZWJkKSwgV1RDKDB4ZTBhMTc4NzUpLCBXVEMoMHhlMTk5ZTEwYyksCisgICAgV1RDKDB4ZTI5NTMxZmQpLCBXVEMoMHhlMzkzM2VmNiksIFdUQygweGU0OTQ4N2JlKSwgV1RDKDB4ZTU5OGJjZjUpLAorICAgIFdUQygweGU2OWYzOGIwKSwgV1RDKDB4ZTdhNzNkNDUpLCBXVEMoMHhlOGIwMmU5NCksIFdUQygweGU5YjlkYzk3KSwKKyAgICBXVEMoMHhlYWM0ZTYyYyksIFdUQygweGViZDExMWZjKSwgV1RDKDB4ZWNkZDAyNDIpLCBXVEMoMHhlZGU3MTc4ZCksCisgICAgV1RDKDB4ZWVlZTljMjQpLCBXVEMoMHhlZmYzNGRiYSksIFdUQygweGYwZjRlYWY1KSwgV1RDKDB4ZjFmMzY2OTUpLAorICAgIFdUQygweGYyZWViMmIyKSwgV1RDKDB4ZjNlNjYzY2IpLCBXVEMoMHhmNGQ5Y2JmZSksIFdUQygweGY1Yzc2YjNjKSwKKyAgICBXVEMoMHhmNmFkYTRjYiksIFdUQygweGY3OGJjOTJkKSwgV1RDKDB4Zjg2MmRjNTcpLCBXVEMoMHhmOTM1ODljYSksCisgICAgV1RDKDB4ZmEwNTliNDQpLCBXVEMoMHhmYWQ1MDFmYyksIFdUQygweGZiYTQ5ODE5KSwgV1RDKDB4ZmM3NDBmNTgpLAorICAgIFdUQygweGZkNDY1YjZkKSwgV1RDKDB4ZmUxZWUwNmYpLCBXVEMoMHhmZWYyNTgxYiksIFdUQygweGZmOWVjN2Q5KSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4YmZmMTQzZjYpLCBXVEMoMHhiZmQzY2Q1YyksIFdUQygweGJmYjY0ZDU0KSwgV1RDKDB4YmY5OGNlODApLAorICAgIFdUQygweGJmN2I1MjkxKSwgV1RDKDB4YmY1ZGQ1MjMpLCBXVEMoMHhiZjQwNWY4ZSksIFdUQygweGJmMjJlZTU1KSwKKyAgICBXVEMoMHhiZjA1ODY2NCksIFdUQygweGJlZTgyZDIyKSwgV1RDKDB4YmVjYWUwYTEpLCBXVEMoMHhiZWFkYWNiNSksCisgICAgV1RDKDB4YmU5MDhmNjgpLCBXVEMoMHhiZTczOTAxZCksIFdUQygweGJlNTZiNjczKSwgV1RDKDB4YmUzYTAxM2UpLAorICAgIFdUQygweGJlMWQ3ZGFkKSwgV1RDKDB4YmUwMTJiMTkpLCBXVEMoMHhiZGU1MTEzNCksIFdUQygweGJkYzkzNzgxKSwKKyAgICBXVEMoMHhiZGFkOWM4OCksIFdUQygweGJkOTI0YmQ4KSwgV1RDKDB4YmQ3NzQzMTEpLCBXVEMoMHhiZDVjODgyYiksCisgICAgV1RDKDB4YmQ0MjIwZmEpLCBXVEMoMHhiZDI4MGE0OSksIFdUQygweGJkMGU0ZDUwKSwgV1RDKDB4YmNmNGU0NmUpLAorICAgIFdUQygweGJjZGJkMWE0KSwgV1RDKDB4YmNjMzE2MjQpLCBXVEMoMHhiY2FhYWEwMiksIFdUQygweGJjOTI5MzQ4KSwKKyAgICBXVEMoMHhiYzdhY2MxMiksIFdUQygweGJjNjM1MjVlKSwgV1RDKDB4YmM0YzI2YjEpLCBXVEMoMHhiYzM1M2VhOSksCisgICAgV1RDKDB4YmMxZTkxZTIpLCBXVEMoMHhiYzA4NWFlYSksIFdUQygweGJiZjFjMDRhKSwgV1RDKDB4YmJkYzc1MjEpLAorICAgIFdUQygweGJiY2U0NzQwKSwgV1RDKDB4YmJjYTUxODcpLCBXVEMoMHhiYmNkM2E3YyksIFdUQygweGJiZDMzNjM0KSwKKyAgICBXVEMoMHhiYmRjMGEzNCksIFdUQygweGJiZWEyMThhKSwgV1RDKDB4YmJmZTI1YjcpLCBXVEMoMHhiYzE2Mjg4NyksCisgICAgV1RDKDB4YmMzMDc2YzUpLCBXVEMoMHhiYzRkMDlmNiksIFdUQygweGJjNmQ5MjVjKSwgV1RDKDB4YmM5NGRhNmUpLAorICAgIFdUQygweGJjYzQ4MzAwKSwgV1RDKDB4YmNmYzk3NjMpLCBXVEMoMHhiZDNiZDk0ZiksIFdUQygweGJkODA4ZDA1KSwKKyAgICBXVEMoMHhiZGM5YTExYiksIFdUQygweGJlMTZlMzM5KSwgV1RDKDB4YmU2OTFkYjkpLCBXVEMoMHhiZWMxNzljMSksCisgICAgV1RDKDB4YmYyMTAxNDApLCBXVEMoMHhiZjg4Y2Q2MiksIFdUQygweGJmZjhlOGQzKSwgV1RDKDB4YzA2ZTFhYWEpLAorICAgIFdUQygweGMwZTQ1OTUxKSwgV1RDKDB4YzE1YjM4MjApLCBXVEMoMHhjMWQ2ZTJmZiksIFdUQygweGMyNTkwZTBhKSwKKyAgICBXVEMoMHhjMmUxMGY4MyksIFdUQygweGMzNmM1YzlhKSwgV1RDKDB4YzNmNzM1ZjMpLCBXVEMoMHhjNDdmYjJkMSksCisgICAgV1RDKDB4YzUwYWJjZTUpLCBXVEMoMHhjNTlhMGEyNSksIFdUQygweGM2MjlmMjFjKSwgV1RDKDB4YzZiNmVmODkpLAorICAgIFdUQygweGM3NDI3MTgwKSwgV1RDKDB4YzdjZDFmYzQpLCBXVEMoMHhjODU2NDg1ZiksIFdUQygweGM4ZGNhZTkzKSwKKyAgICBXVEMoMHhiNDg3YTk4NiksIFdUQygweGIyY2UwODEyKSwgV1RDKDB4YjExYmM0YzIpLCBXVEMoMHhhZjcwZDVjYiksCisgICAgV1RDKDB4YWRjZDIyOGUpLCBXVEMoMHhhYzMwODZhMiksIFdUQygweGFhOWFmMzZiKSwgV1RDKDB4YTkwYzU5MzUpLAorICAgIFdUQygweGE3ODRiMjE0KSwgV1RDKDB4YTYwNDA3ZTkpLCBXVEMoMHhhNDhhNzA3NiksIFdUQygweGEzMTgwNmY5KSwKKyAgICBXVEMoMHhhMWFjZWIwMyksIFdUQygweGEwNDk0ZjYzKSwgV1RDKDB4OWVlZDY4NDApLCBXVEMoMHg5ZDk5NjU3MCksCisgICAgV1RDKDB4OWM0ZDkzYjQpLCBXVEMoMHg5YjBhMzExNCksIFdUQygweDk5Y2Y3OThkKSwgV1RDKDB4OTg5ZGIxNmEpLAorICAgIFdUQygweDk3NzUyMTQ2KSwgV1RDKDB4OTY1NjA5ZjEpLCBXVEMoMHg5NTQwOWIwNSksIFdUQygweDk0MzRmZGE5KSwKKyAgICBXVEMoMHg5MzMzNTg3YiksIFdUQygweDkyM2JjN2Q2KSwgV1RDKDB4OTE0ZTUyOTkpLCBXVEMoMHg5MDZhZjM0NSksCisgICAgV1RDKDB4OGY5MTg1ZTYpLCBXVEMoMHg4ZWMxY2JlOSksIFdUQygweDhkZmI2NGM5KSwgV1RDKDB4OGQzZGFiMTgpLAorICAgIFdUQygweDhjODdkZTM0KSwgV1RDKDB4OGJkOGM0OTQpLCBXVEMoMHg4YjJlY2FjYyksIFdUQygweDhhODgyYTVmKSwKKyAgICBXVEMoMHg4OWUyZWNkMSksIFdUQygweDg5M2YxMmIyKSwgV1RDKDB4ODhhM2M4NzgpLCBXVEMoMHg4ODIxNDFjNyksCisgICAgV1RDKDB4ODdjNjVkY2QpLCBXVEMoMHg4N2EwYzA3YiksIFdUQygweDg3NzhiODU5KSwgV1RDKDB4ODc1MTQ2OTgpLAorICAgIFdUQygweDg3MjhlOTAwKSwgV1RDKDB4ODcwMDA2NzkpLCBXVEMoMHg4NmQ2OGYwNSksIFdUQygweDg2YWM2ZWU3KSwKKyAgICBXVEMoMHg4NjgxYTVjZSksIFdUQygweDg2NTYyZWQwKSwgV1RDKDB4ODYyOWZkZWIpLCBXVEMoMHg4NWZkMWNhOCksCisgICAgV1RDKDB4ODVjZjdiMzIpLCBXVEMoMHg4NWExMWEyZiksIFdUQygweDg1NzFmYmJlKSwgV1RDKDB4ODU0MjEzZjUpLAorICAgIFdUQygweDg1MTE3MjJiKSwgV1RDKDB4ODRlMDBlZTMpLCBXVEMoMHg4NGFkZjM0NiksIFdUQygweDg0N2IyOGU1KSwKKyAgICBXVEMoMHg4NDQ3YTlkMCksIFdUQygweDg0MTM4YTIwKSwgV1RDKDB4ODNkZWM1YjYpLCBXVEMoMHg4M2E5Njk0ZiksCisgICAgV1RDKDB4ODM3MzgyMzEpLCBXVEMoMHg4MzNkMGRlZiksIFdUQygweDgzMDYyNDdiKSwgV1RDKDB4ODJjZWMyOWIpLAorICAgIFdUQygweDgyOTZmNWYzKSwgV1RDKDB4ODI1ZWNiZTQpLCBXVEMoMHg4MjI2M2ZlOCksIFdUQygweDgxZWQ2ODJmKSwKKyAgICBXVEMoMHg4MWI0NDA2ZCksIFdUQygweDgxN2FkMmExKSwgV1RDKDB4ODE0MTI3ZjQpLCBXVEMoMHg4MTA3MzkyZCksCisgICAgV1RDKDB4ODBjZDE4NGQpLCBXVEMoMHg4MDkyYmM1ZiksIFdUQygweDgwNTgyODY2KSwgV1RDKDB4ODAxZDcxNGYpLAorICAgIFdUQygweDBhYTRmODQ2KSwgV1RDKDB4MGIzNjg2ZmUpLCBXVEMoMHgwYmNlODk5ZSksIFdUQygweDBjNmI4YTdlKSwKKyAgICBXVEMoMHgwZDBkMDM2ZiksIFdUQygweDBkYjM1OGI4KSwgV1RDKDB4MGU1ZTMxZGQpLCBXVEMoMHgwZjBlNDI3MCksCisgICAgV1RDKDB4MGZjMzQ3YzEpLCBXVEMoMHgxMDdjMzVjYyksIFdUQygweDExMzgzYTYzKSwgV1RDKDB4MTFmNjg3NTkpLAorICAgIFdUQygweDEyYjdiMWUzKSwgV1RDKDB4MTM3OTlkNjEpLCBXVEMoMHgxNDM4M2RiNCksIFdUQygweDE0ZjAzMmMwKSwKKyAgICBXVEMoMHgxNTllNjkyMCksIFdUQygweDE2M2ZiNDQ5KSwgV1RDKDB4MTZkMTQ4MjApLCBXVEMoMHgxNzUxMmMzZiksCisgICAgV1RDKDB4MTdjNWY2MjIpLCBXVEMoMHgxODQ4M2YyYSksIFdUQygweDE4ZGYzMDc0KSwgV1RDKDB4MTk4OWY1ODkpLAorICAgIFdUQygweDFhNDc4M2FmKSwgV1RDKDB4MWIxNmYxNTIpLCBXVEMoMHgxYmY3Nzk1YSksIFdUQygweDFjZTdjOTUwKSwKKyAgICBXVEMoMHgxZGU4MTdlYyksIFdUQygweDFlZmEzZjRhKSwgV1RDKDB4MjAxZmYzN2EpLCBXVEMoMHgyMTU3ZDRlMSksCisgICAgV1RDKDB4MjI5OTUwMzYpLCBXVEMoMHgyM2UwZDg4MiksIFdUQygweDI1MzQ1ZGIyKSwgV1RDKDB4MjY5YTEwYzMpLAorICAgIFdUQygweDI4MGEwNzk4KSwgV1RDKDB4Mjk3ZDZjZjkpLCBXVEMoMHgyYWZhN2UxYiksIFdUQygweDJjOGQyMTBhKSwKKyAgICBXVEMoMHgyZTM3N2RiMiksIFdUQygweDJmZWI2MGNjKSwgV1RDKDB4MzE5NzcxMTEpLCBXVEMoMHgzMzNiMTYzNyksCisgICAgV1RDKDB4MzRlYTE0ZGYpLCBXVEMoMHgzNmJhMzJkNCksIFdUQygweDM4YTUyNGM4KSwgV1RDKDB4M2E4ZmE4OTEpLAorICAgIFdUQygweDNjNjQwY2IzKSwgV1RDKDB4M2UyMmFiMTEpLCBXVEMoMHgzZmRlN2NjOSksIFdUQygweDQxYTgwNDg2KSwKKyAgICBXVEMoMHg0MzgzOTRlNCksIFdUQygweDQ1NmM4ZDhmKSwgV1RDKDB4NDc1OGY0ZGEpLCBXVEMoMHg0OTNkN2E3YiksCisgICAgV1RDKDB4NGIxMzlmMzIpLCBXVEMoMHg0Y2RiYjE5OSksIFdUQygweDRlOWFiOGQxKSwgV1RDKDB4NTA1Njk1MzApLAorICAgIFdUQygweDUyMTNhODllKSwgV1RDKDB4NTNkNTQ2MmMpLCBXVEMoMHg1NTlhNWFhNyksIFdUQygweDU3NTZhY2Y1KSwKKyAgICBXVEMoMHg1OGZjZmIzOCksIFdUQygweDVhOGUzZTA3KSwgV1RDKDB4NWMxYTIwZTgpLCBXVEMoMHg1ZGE2YzdkYSksCisgICAgV1RDKDB4NWYzMjMxZjMpLCBXVEMoMHg2MGI1MWZiNiksIFdUQygweDYyMjYwODQ4KSwgV1RDKDB4NjM4MWY1YTkpLAorICAgIFdUQygweDY0ZDc5YWM3KSwgV1RDKDB4NjYyYzUxYzApLCBXVEMoMHg2Nzc3OWMwNyksIFdUQygweDY4YjIyMTg0KSwKKyAgICBXVEMoMHg2OWUwY2EyOCksIFdUQygweDZiMDY4YmNmKSwgV1RDKDB4NmMyMzAwOGUpLCBXVEMoMHg2ZDM0Njg1NiksCisgICAgV1RDKDB4YWVjOTI2OTMpLCBXVEMoMHhiMjJjYTJiZCksIFdUQygweGI1NzhkNDIxKSwgV1RDKDB4YjhiMjdlZGIpLAorICAgIFdUQygweGJiZGMzOGI1KSwgV1RDKDB4YmVmNTk4YmIpLCBXVEMoMHhjMWZlMGRjZCksIFdUQygweGM0ZjRkN2ZmKSwKKyAgICBXVEMoMHhjN2Q5ODQ3OSksIFdUQygweGNhYWJjMjg5KSwgV1RDKDB4Y2Q2YjM4ZjYpLCBXVEMoMHhkMDE3ZWRmZiksCisgICAgV1RDKDB4ZDJiMWFhMzcpLCBXVEMoMHhkNTM4NzM5ZiksIFdUQygweGQ3YWM1NTRkKSwgV1RDKDB4ZGEwZDJmNWUpLAorICAgIFdUQygweGRjNWIzZjY5KSwgV1RDKDB4ZGU5NjZlMzApLCBXVEMoMHhlMGJlZTJjOCksIFdUQygweGUyZDRjOWNkKSwKKyAgICBXVEMoMHhlNGQ4MjAwMCksIFdUQygweGU2Yzk0OTI2KSwgV1RDKDB4ZThhODRiMTQpLCBXVEMoMHhlYTc1NWFjMyksCisgICAgV1RDKDB4ZWMzMDliZGMpLCBXVEMoMHhlZGQ5ZjJhOCksIFdUQygweGVmNzFjMDQwKSwgV1RDKDB4ZjBmODQyYWQpLAorICAgIFdUQygweGYyNmU1M2NiKSwgV1RDKDB4ZjNkNGNkOWYpLCBXVEMoMHhmNTJiOWRkZiksIFdUQygweGY2NzFkYjRkKSwKKyAgICBXVEMoMHhmN2E1OGZhYSksIFdUQygweGY4Yzc5OTA3KSwgV1RDKDB4ZjlkYTdjNzMpLCBXVEMoMHhmYWRlZTI0MCksCisgICAgV1RDKDB4ZmJkMzYwZTYpLCBXVEMoMHhmY2I5NWRiNCksIFdUQygweGZkOTEzYmIxKSwgV1RDKDB4ZmU1OTRlMmUpLAorICAgIFdUQygweGZmMTBlNjdjKSwgV1RDKDB4ZmZiYzIzMjYpLCBXVEMoMHgwMDYwODM1MCksIFdUQygweDAwZmM4YTJkKSwKKyAgICBXVEMoMHgwMTg3MzMxMyksIFdUQygweDAxZjhlNGZlKSwgV1RDKDB4MDI1NzkzMTgpLCBXVEMoMHgwMmIwM2VjMyksCisgICAgV1RDKDB4MDMwYWIyZGEpLCBXVEMoMHgwMzYzZWEyYSksIFdUQygweDAzYjFlNjBkKSwgV1RDKDB4MDNlZTI5MjApLAorICAgIFdUQygweDA0MTg0MDVjKSwgV1RDKDB4MDQzNDg0NDkpLCBXVEMoMHgwNDQ4ZDlmNyksIFdUQygweDA0NTljNjVmKSwKKyAgICBXVEMoMHgwNDY5NGEyOSksIFdUQygweDA0NzViNTA2KSwgV1RDKDB4MDQ3YmViZWIpLCBXVEMoMHgwNDc4ZGNkMiksCisgICAgV1RDKDB4MDQ2YWE0NzUpLCBXVEMoMHgwNDUyNDlhOSksIFdUQygweDA0MzMzMmYwKSwgV1RDKDB4MDQxMWJiNzcpLAorICAgIFdUQygweDAzZWY4OTNiKSwgV1RDKDB4MDNjOWViYjgpLCBXVEMoMHgwMzlkYTc3OCksIFdUQygweDAzNmExMjczKSwKKyAgICBXVEMoMHgwMzMxNmE2MCksIFdUQygweDAyZjY1NTNhKSwgV1RDKDB4MDJiOThiZTkpLCBXVEMoMHgwMjdhMmUyYyksCisgICAgV1RDKDB4MDIzNmRmNjQpLCBXVEMoMHgwMWYwMzZiZiksIFdUQygweDAxYTc4YjQxKSwgV1RDKDB4MDE1ZDI5ZGEpLAorICAgIFdUQygweDAxMTE0NjI0KSwgV1RDKDB4MDBjNDA2ZTkpLCBXVEMoMHgwMDc1ZGRiMSksIFdUQygweDAwMjc3NjkyKSwKKyAgICBXVEMoMHhkNWUxMzllOSksIFdUQygweGQ0OTQzNjJlKSwgV1RDKDB4ZDM0ZTJiZmYpLCBXVEMoMHhkMjBlNTZmOCksCisgICAgV1RDKDB4ZDBkNWEzZGMpLCBXVEMoMHhjZmE1OTA0ZiksIFdUQygweGNlN2JlM2NiKSwgV1RDKDB4Y2Q1YjMwODYpLAorICAgIFdUQygweGNjNDIwZjBmKSwgV1RDKDB4Y2IyYzJiZjYpLCBXVEMoMHhjYTE2OTVjMyksIFdUQygweGM4ZmRmMDIwKSwKKyAgICBXVEMoMHhjN2U0ZmMwNyksIFdUQygweGM2YzM3NGM2KSwgV1RDKDB4YzU4OTU2NTMpLCBXVEMoMHhjNDI5NzIxOCksCisgICAgV1RDKDB4YzI5NmY5NTgpLCBXVEMoMHhjMGM1MWEzYyksIFdUQygweGJlYTg0ZWU1KSwgV1RDKDB4YmMzODg0MmYpLAorICAgIFdUQygweGI5OTE1OTY2KSwgV1RDKDB4YjcxODZhZTUpLCBXVEMoMHhiNGViMzA0MCksIFdUQygweGIzMDc2ODk3KSwKKyAgICBXVEMoMHhiMTZhY2JhMyksIFdUQygweGIwMTMxMTJhKSwgV1RDKDB4YWVmZGYwYTIpLCBXVEMoMHhhZTI5MjFmNSksCisgICAgV1RDKDB4YWQ5MjVjZDYpLCBXVEMoMHhhZDM3NThiZSksIFdUQygweGFkMTVjZDNkKSwgV1RDKDB4YWQyYjcxY2EpLAorICAgIFdUQygweGFkNzVmZTY1KSwgV1RDKDB4YWRmMzJhODQpLCBXVEMoMHhhZWEwYWRhOSksIFdUQygweGFmN2MzZmNkKSwKKyAgICBXVEMoMHhiMDgzOTgyNSksIFdUQygweGIxYjQ2ZTljKSwgV1RDKDB4YjMwYzdhMjApLCBXVEMoMHhiNDg5NzBiZSksCisgICAgV1RDKDB4YjYyOTEyZTApLCBXVEMoMHhiN2U5MGRlNyksIFdUQygweGI5YzcxZDEyKSwgV1RDKDB4YmJjMGY3ZmQpLAorICAgIFdUQygweGJkZDQ1Njc0KSwgV1RDKDB4YmZmZWYwMjIpLCBXVEMoMHhjMjNlN2M0OSksIFdUQygweGM0OTBiMmQ0KSwKKyAgICBXVEMoMHhjNmYzNGI3MCksIFdUQygweGM5NjNmZGE5KSwgV1RDKDB4Y2JlMDgxM2UpLCBXVEMoMHhjZTY2OGQ5OCksCisgICAgV1RDKDB4ZDBmM2RhNjkpLCBXVEMoMHhkMzg2MWY2NCksIFdUQygweGQ2MWIxNDFmKSwgV1RDKDB4ZDhiMDcwMzgpLAorICAgIFdUQygweGRiNDNlYjVkKSwgV1RDKDB4ZGRkMzNkMjIpLCBXVEMoMHhlMDVjMWQyZSksIFdUQygweGUyZGM0MzJjKSwKKyAgICBXVEMoMHhlNTUxNjZhZCksIFdUQygweGU3YjkzZjYyKSwgV1RDKDB4ZWExMTg0ZGYpLCBXVEMoMHhlYzU3ZWVjOSksCisgICAgV1RDKDB4ZWU4YTM0YzYpLCBXVEMoMHhmMGE2MGU3MCksIFdUQygweGYyYTkzMzZlKSwgV1RDKDB4ZjQ5MTViNjApLAorICAgIFdUQygweGY2NWMzZGVhKSwgV1RDKDB4ZjgwNzkyYWUpLCBXVEMoMHhmOTkxMTE0NyksIFdUQygweGZhZjY3MTU0KSwKKyAgICBXVEMoMHhmYzM1NmE3ZSksIFdUQygweGZkNGJiNDY1KSwgV1RDKDB4ZmUzNzA2YTkpLCBXVEMoMHhmZWY1MThlYyksCisgICAgV1RDKDB4ZmY4M2EyY2YpLCBXVEMoMHhmZmUwNWJlZCksIFdUQygweDAwMDhmZDI2KSwgV1RDKDB4ZmZmYjQwMzcpLAorfTsKKworY29uc3QgRklYUF9XVEIgTG93RGVsYXlTeW50aGVzaXMxMjhbMzg0XSA9IHsKKyAgICBXVEMoMHhkYjMzNWM3OCksIFdUQygweGRjNTEyZDQwKSwgV1RDKDB4ZGQ3NDYxMTYpLCBXVEMoMHhkZTljZjdhZSksCisgICAgV1RDKDB4ZGZjYWRkYTgpLCBXVEMoMHhlMGZlNDE5NiksIFdUQygweGUyMzZhNDA5KSwgV1RDKDB4ZTM3MzUxOGYpLAorICAgIFdUQygweGU0YjRlODcwKSwgV1RDKDB4ZTVmYWYyNWUpLCBXVEMoMHhlNzQ0MTkwYSksIFdUQygweGU4OGYwNmY0KSwKKyAgICBXVEMoMHhlOWRiMjc5NiksIFdUQygweGViMjk2MTNmKSwgV1RDKDB4ZWM3OGIwOGUpLCBXVEMoMHhlZGM1ZjY1ZCksCisgICAgV1RDKDB4ZWYwZjVhZjQpLCBXVEMoMHhmMDU0NDdkZCksIFdUQygweGYxOTQ1MzkyKSwgV1RDKDB4ZjJjZjc5NWEpLAorICAgIFdUQygweGY0MDUxMjNkKSwgV1RDKDB4ZjUzM2FmM2QpLCBXVEMoMHhmNjU4NDJkZCksIFdUQygweGY3NzA3MWFlKSwKKyAgICBXVEMoMHhmODdkNjIzZiksIFdUQygweGY5ODNjNzExKSwgV1RDKDB4ZmE4NzMwY2UpLCBXVEMoMHhmYjhhYWQ0YiksCisgICAgV1RDKDB4ZmM4ZTFkYzYpLCBXVEMoMHhmZDk2ZDE5YSksIFdUQygweGZlYTUzMjVhKSwgV1RDKDB4ZmY4ZDIxZGEpLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4YmZlZDk2MDYpLCBXVEMoMHhiZmM4YmRkZiksIFdUQygweGJmYTNkZDU3KSwgV1RDKDB4YmY3ZjAyM2MpLAorICAgIFdUQygweGJmNWEyNWU4KSwgV1RDKDB4YmYzNTU0ZGYpLCBXVEMoMHhiZjEwOGI2YiksIFdUQygweGJlZWJkN2JkKSwKKyAgICBXVEMoMHhiZWM3MzhhNiksIFdUQygweGJlYTJiZjQ1KSwgV1RDKDB4YmU3ZTZiNDIpLCBXVEMoMHhiZTVhNGZkNSksCisgICAgV1RDKDB4YmUzNjZkZTgpLCBXVEMoMHhiZTEyZDkxZSksIFdUQygweGJkZWY5MzM4KSwgV1RDKDB4YmRjY2FmNmUpLAorICAgIFdUQygweGJkYWEyZTNmKSwgV1RDKDB4YmQ4ODIwNWUpLCBXVEMoMHhiZDY2ODQzMCksIFdUQygweGJkNDU2OTk0KSwKKyAgICBXVEMoMHhiZDI0Y2RhZCksIFdUQygweGJkMDRiYzkxKSwgV1RDKDB4YmNlNTJkZWYpLCBXVEMoMHhiY2M2Mjk0MiksCisgICAgV1RDKDB4YmNhN2EyNzMpLCBXVEMoMHhiYzg5OWZiYSksIFdUQygweGJjNmMxNmFiKSwgV1RDKDB4YmM0ZjA4MTIpLAorICAgIFdUQygweGJjMzI2NTM3KSwgV1RDKDB4YmMxNjJmYjMpLCBXVEMoMHhiYmZhNTkxNSksIFdUQygweGJiZGVkNDYyKSwKKyAgICBXVEMoMHhiYmNkMzk1NiksIFdUQygweGJiY2FlMGY1KSwgV1RDKDB4YmJkMGJlYjcpLCBXVEMoMHhiYmRhYWY0MiksCisgICAgV1RDKDB4YmJlYzUyODkpLCBXVEMoMHhiYzA2ZDExNSksIFdUQygweGJjMjY2MTYyKSwgV1RDKDB4YmM0OTRkMjcpLAorICAgIFdUQygweGJjNzIxMDEzKSwgV1RDKDB4YmNhNWIyZDkpLCBXVEMoMHhiY2U2YTA2MyksIFdUQygweGJkMzM5ZDNkKSwKKyAgICBXVEMoMHhiZDg5NzViMiksIFdUQygweGJkZTYxOGIxKSwgV1RDKDB4YmU0OTlkZTEpLCBXVEMoMHhiZWI2MGZlYiksCisgICAgV1RDKDB4YmYyZDgzMGUpLCBXVEMoMHhiZmIxZWUyZSksIFdUQygweGMwNDFlMjJmKSwgV1RDKDB4YzBkNTk2MTgpLAorICAgIFdUQygweGMxNmE1NzRkKSwgV1RDKDB4YzIwNmVkOTQpLCBXVEMoMHhjMmFkN2FkMSksIFdUQygweGMzNWFlNzMzKSwKKyAgICBXVEMoMHhjNDA4NWZiZiksIFdUQygweGM0YjMzYTM1KSwgV1RDKDB4YzU2M2Y2Y2UpLCBXVEMoMHhjNjE4MWFiNyksCisgICAgV1RDKDB4YzZjODZiZWIpLCBXVEMoMHhjNzc2OGRlNCksIFdUQygweGM4MjMxYWIzKSwgV1RDKDB4YzhjYzE0NWEpLAorICAgIFdUQygweGI0NTAwZGRlKSwgV1RDKDB4YjIyYTUyNGUpLCBXVEMoMHhiMDEwMTQ0YyksIFdUQygweGFlMDEzNTMwKSwKKyAgICBXVEMoMHhhYmZkNzIwNiksIFdUQygweGFhMDRhOTJmKSwgV1RDKDB4YTgxNmMwMDgpLCBXVEMoMHhhNjMzYmFhYiksCisgICAgV1RDKDB4YTQ1YmJlMmIpLCBXVEMoMHhhMjhlZmY1ZSksIFdUQygweGEwY2RjNGM2KSwgV1RDKDB4OWYxODc4MDEpLAorICAgIFdUQygweDlkNmY3NzA4KSwgV1RDKDB4OWJkMzRlYjApLCBXVEMoMHg5YTQ0NzYzYSksIFdUQygweDk4YzM2YWNlKSwKKyAgICBXVEMoMHg5NzUwYjg5NiksIFdUQygweDk1ZWNkYzYxKSwgV1RDKDB4OTQ5ODJmOGMpLCBXVEMoMHg5MzUzMDA1YSksCisgICAgV1RDKDB4OTIxZDhiYWMpLCBXVEMoMHg5MGY3ZTEyNiksIFdUQygweDhmZTFlODI4KSwgV1RDKDB4OGVkYjNkZGMpLAorICAgIFdUQygweDhkZTMzN2M4KSwgV1RDKDB4OGNmODljZGIpLCBXVEMoMHg4YzE5YmU2ZCksIFdUQygweDhiNDNkMDcyKSwKKyAgICBXVEMoMHg4YTczNzY2MyksIFdUQygweDg5YTUyZjRkKSwgV1RDKDB4ODhkYzM4ZTgpLCBXVEMoMHg4ODJmNmYzZiksCisgICAgV1RDKDB4ODdjMjJjNTUpLCBXVEMoMHg4NzkxOGEyMSksIFdUQygweDg3NjAyYzYxKSwgV1RDKDB4ODcyZGZkMGEpLAorICAgIFdUQygweDg2ZmFlMDYzKSwgV1RDKDB4ODZjNmQ3MjkpLCBXVEMoMHg4NjkxYzRhZCksIFdUQygweDg2NWJhN2U4KSwKKyAgICBXVEMoMHg4NjI0NmI2NiksIFdUQygweDg1ZWMxN2FiKSwgV1RDKDB4ODViMjkzZTIpLCBXVEMoMHg4NTc3ZWFhYyksCisgICAgV1RDKDB4ODUzYzA5YmUpLCBXVEMoMHg4NGZmMDQyZCksIFdUQygweDg0YzBkMTk1KSwgV1RDKDB4ODQ4MThjNGMpLAorICAgIFdUQygweDg0NDEyZTYzKSwgV1RDKDB4ODNmZmQ0MmMpLCBXVEMoMHg4M2JkN2JkZiksIFdUQygweDgzN2E0NzFiKSwKKyAgICBXVEMoMHg4MzM2MzZkYyksIFdUQygweDgyZjE2ZTQ4KSwgV1RDKDB4ODJhYmVkMzcpLCBXVEMoMHg4MjY1ZDZjNCksCisgICAgV1RDKDB4ODIxZjI4Y2YpLCBXVEMoMHg4MWQ4MDMyMiksIFdUQygweDgxOTA2MjVjKSwgV1RDKDB4ODE0ODYxMzQpLAorICAgIFdUQygweDgwZmZmN2EwKSwgV1RDKDB4ODBiNzNkODYpLCBXVEMoMHg4MDZlMjUyNyksIFdUQygweDgwMjRjOTY5KSwKKyAgICBXVEMoMHgwYWI2YzJkMiksIFdUQygweDBiNmVkYWMyKSwgV1RDKDB4MGMzMDI5ODgpLCBXVEMoMHgwY2Y4OGZhYiksCisgICAgV1RDKDB4MGRjODc0NjEpLCBXVEMoMHgwZTlmOTEyMiksIFdUQygweDBmN2VlNTNmKSwgV1RDKDB4MTA2NGU3YmYpLAorICAgIFdUQygweDExNGZlNGI3KSwgV1RDKDB4MTIzZTllNGMpLCBXVEMoMHgxMzMxMTU4OSksIFdUQygweDE0MjBiNjY0KSwKKyAgICBXVEMoMHgxNTA2OTI0NSksIFdUQygweDE1ZGM5M2FkKSwgV1RDKDB4MTY5Y2FmNDEpLCBXVEMoMHgxNzQyMmUxNiksCisgICAgV1RDKDB4MTdkNTFkZTQpLCBXVEMoMHgxODdlNzYyMiksIFdUQygweDE5NDdhYTBiKSwgV1RDKDB4MWEyZWQzYjQpLAorICAgIFdUQygweDFiMzIxODU4KSwgV1RDKDB4MWM0ZmNjN2YpLCBXVEMoMHgxZDg2MDFhMyksIFdUQygweDFlZDZlYzVlKSwKKyAgICBXVEMoMHgyMDQ2MGIwNyksIFdUQygweDIxY2ZiZjU5KSwgV1RDKDB4MjM2NTI3MzIpLCBXVEMoMHgyNTA4ZTRiMSksCisgICAgV1RDKDB4MjZjN2IwYTYpLCBXVEMoMHgyODk1MDVkYSksIFdUQygweDJhNjk4ZGQ4KSwgV1RDKDB4MmM1OTU0ZDIpLAorICAgIFdUQygweDJlNmRkMTM1KSwgV1RDKDB4MzA4ZDgzOGYpLCBXVEMoMHgzMjlkZTM3NyksIFdUQygweDM0YjI4ZjEzKSwKKyAgICBXVEMoMHgzNmY2Nzk4OCksIFdUQygweDM5NWVjMWU1KSwgV1RDKDB4M2JiN2I1ODcpLCBXVEMoMHgzZGViNjNjYyksCisgICAgV1RDKDB4NDAxNmIzMjApLCBXVEMoMHg0MjU4NGViMiksIFdUQygweDQ0YjQyNGNhKSwgV1RDKDB4NDcxYmE1YjIpLAorICAgIFdUQygweDQ5NzkxOTU0KSwgV1RDKDB4NGJjMDIwMDQpLCBXVEMoMHg0ZGYzYjhjMCksIFdUQygweDUwMWYxZTFlKSwKKyAgICBXVEMoMHg1MjRiOTNlMiksIFdUQygweDU0N2YwZWVmKSwgV1RDKDB4NTZiMjNkMDMpLCBXVEMoMHg1OGM5OTA1MiksCisgICAgV1RDKDB4NWFiZmMwNDIpLCBXVEMoMHg1Y2FlYmYxYSksIFdUQygweDVlOWU2MThiKSwgV1RDKDB4NjA4NTk1ZDcpLAorICAgIFdUQygweDYyNTI4ZTY3KSwgV1RDKDB4NjQwMWViNTMpLCBXVEMoMHg2NWFkMGViMSksIFdUQygweDY3NGYxY2QyKSwKKyAgICBXVEMoMHg2OGQ4ODA0ZSksIFdUQygweDZhNGZmMTBlKSwgV1RDKDB4NmJiOTg3YTUpLCBXVEMoMHg2ZDEyZTkzNyksCisgICAgV1RDKDB4YWYzNzA2NTIpLCBXVEMoMHhiMzZiYWRjZiksIFdUQygweGI3N2VjMzIxKSwgV1RDKDB4YmI3N2UzNjQpLAorICAgIFdUQygweGJmNTc5NzllKSwgV1RDKDB4YzMxY2I1ODkpLCBXVEMoMHhjNmM1ZTY4NiksIFdUQygweGNhNTI4MTFkKSwKKyAgICBXVEMoMHhjZGMxZDY2YiksIFdUQygweGQxMTNkMGYwKSwgV1RDKDB4ZDQ0ODFjOTgpLCBXVEMoMHhkNzVlZTQxYiksCisgICAgV1RDKDB4ZGE1N2Y3YmYpLCBXVEMoMHhkZDMzYTkyNiksIFdUQygweGRmZjFlMjcyKSwgV1RDKDB4ZTI5MzEyMjcpLAorICAgIFdUQygweGU1MTc0MjMyKSwgV1RDKDB4ZTc3ZjBiMTUpLCBXVEMoMHhlOWNhODg5ZCksIFdUQygweGViZmEyZjdjKSwKKyAgICBXVEMoMHhlZTBkZTAwMiksIFdUQygweGYwMDYzMzI2KSwgV1RDKDB4ZjFlM2U1ZjEpLCBXVEMoMHhmM2E4ZDc0OSksCisgICAgV1RDKDB4ZjU1NTU1OTkpLCBXVEMoMHhmNmU3N2ViMiksIFdUQygweGY4NWNiNWQ2KSwgV1RDKDB4ZjliOGU2NGQpLAorICAgIFdUQygweGZhZmU1MmFkKSwgV1RDKDB4ZmMyYjM3YjgpLCBXVEMoMHhmZDQyMDQ2NyksIFdUQygweGZlNDE0MTJjKSwKKyAgICBXVEMoMHhmZjI2ZGVkNSksIFdUQygweGZmZmE2MTUwKSwgV1RDKDB4MDBjMzc0YTQpLCBXVEMoMHgwMTc3Mzg4NCksCisgICAgV1RDKDB4MDIwNThkZTMpLCBXVEMoMHgwMjc4ZDY4OSksIFdUQygweDAyZTg3MzcyKSwgV1RDKDB4MDM1OTMyNjgpLAorICAgIFdUQygweDAzYmE3OWFiKSwgV1RDKDB4MDNmZmYzMmIpLCBXVEMoMHgwNDJiMjM0MSksIFdUQygweDA0NDY5MGRlKSwKKyAgICBXVEMoMHgwNDViYzk2YSksIFdUQygweDA0NmU3N2U5KSwgV1RDKDB4MDQ3YTg1YzEpLCBXVEMoMHgwNDc5ZDhjNCksCisgICAgV1RDKDB4MDQ2ODFhZWMpLCBXVEMoMHgwNDQ3MzE4ZiksIFdUQygweDA0MWU0ZDEzKSwgV1RDKDB4MDNmM2VkYWQpLAorICAgIFdUQygweDAzYzRjYzE3KSwgV1RDKDB4MDM4YjFmNmYpLCBXVEMoMHgwMzQ3MDkwOSksIFdUQygweDAyZmRjZWJkKSwKKyAgICBXVEMoMHgwMmIxY2IxOCksIFdUQygweDAyNjE3MzBkKSwgV1RDKDB4MDIwYWZhZDApLCBXVEMoMHgwMWIwYjljOCksCisgICAgV1RDKDB4MDE1M2MxYTApLCBXVEMoMHgwMGY0NzQyNiksIFdUQygweDAwOTMzZGI3KSwgV1RDKDB4MDAzMTQwZTkpLAorICAgIFdUQygweGQ1YjczMGJmKSwgV1RDKDB4ZDQxOTJjMzIpLCBXVEMoMHhkMjg1OTQ3OSksIFdUQygweGQwZmMzYjlkKSwKKyAgICBXVEMoMHhjZjgwMDM1MiksIFdUQygweGNlMGU2YWIzKSwgV1RDKDB4Y2NhYWYyNWYpLCBXVEMoMHhjYjRlZDAwMyksCisgICAgV1RDKDB4YzlmM2FlNDQpLCBXVEMoMHhjODk0OGE1NiksIFdUQygweGM3MzIyNmZkKSwgV1RDKDB4YzViMjY3NmEpLAorICAgIFdUQygweGMzZmEyYTgyKSwgV1RDKDB4YzFmMDVmNzApLCBXVEMoMHhiZjdjODg0YiksIFdUQygweGJjOGIxZTg2KSwKKyAgICBXVEMoMHhiOTNlMTYzMyksIFdUQygweGI2M2ViNDgzKSwgV1RDKDB4YjNiNDVkMTQpLCBXVEMoMHhiMTlhOGVlMiksCisgICAgV1RDKDB4YWZlY2Q0YWEpLCBXVEMoMHhhZWE2YjhlNyksIFdUQygweGFkYzNjNmJmKSwgV1RDKDB4YWQzZjg4YWMpLAorICAgIFdUQygweGFkMTU4OTI5KSwgV1RDKDB4YWQ0MTUyYjEpLCBXVEMoMHhhZGJlNzA2OCksIFdUQygweGFlODg2Yzc2KSwKKyAgICBXVEMoMHhhZjlhZDFmZSksIFdUQygweGIwZjEyYjI2KSwgV1RDKDB4YjI4NzAzNDcpLCBXVEMoMHhiNDU3ZDYzMyksCisgICAgV1RDKDB4YjY1ZjU5MmMpLCBXVEMoMHhiODk4ZWNhMCksIFdUQygweGJiMDAyOTFiKSwgV1RDKDB4YmQ5MDk5NmIpLAorICAgIFdUQygweGMwNDVjODYxKSwgV1RDKDB4YzMxYjQwMjIpLCBXVEMoMHhjNjBjOGJkNSksIFdUQygweGM5MTUzNWYyKSwKKyAgICBXVEMoMHhjYzMwYzk0YyksIFdUQygweGNmNWFkMDM5KSwgV1RDKDB4ZDI4ZWQ1OGEpLCBXVEMoMHhkNWM4NjNlNSksCisgICAgV1RDKDB4ZDkwMzA1ZTYpLCBXVEMoMHhkYzNhNDY0NCksIFdUQygweGRmNjlhZjkzKSwgV1RDKDB4ZTI4Y2NjOTMpLAorICAgIFdUQygweGU1OWYyN2Q3KSwgV1RDKDB4ZTg5YzRjMTUpLCBXVEMoMHhlYjdmYzNlMyksIFdUQygweGVlNDUxOWY3KSwKKyAgICBXVEMoMHhmMGU3ZDhlZCksIFdUQygweGYzNjM4YjczKSwgV1RDKDB4ZjViM2JjMzApLCBXVEMoMHhmN2QzZjVkMCksCisgICAgV1RDKDB4ZjliZmMyZjApLCBXVEMoMHhmYjcyYWUzNSksIFdUQygweGZjZTg0MjUxKSwgV1RDKDB4ZmUxYzA5ZTUpLAorICAgIFdUQygweGZmMDk4ZjlhKSwgV1RDKDB4ZmZhYzVlMTUpLCBXVEMoMHhmZmZmZmZiMiksIFdUQygweDAwMDAxNTliKSwKK307CisKK2NvbnN0IEZJWFBfV1RCIExvd0RlbGF5U3ludGhlc2lzMTIwWzM2MF0gPSB7CisgICAgV1RDKDB4ZGIzY2NkY2QpLCBXVEMoMHhkYzZlMGQ2OSksIFdUQygweGRkYTU3MGE3KSwgV1RDKDB4ZGVlMmVmMzMpLAorICAgIFdUQygweGUwMjY4MGY0KSwgV1RDKDB4ZTE3MDQzOTcpLCBXVEMoMHhlMmJmNTYyNiksIFdUQygweGU0MTM3YzgwKSwKKyAgICBXVEMoMHhlNTZkMzBjZCksIFdUQygweGU2Y2IyMmZlKSwgV1RDKDB4ZTgyYjlmMTQpLCBXVEMoMHhlOThkODIyMCksCisgICAgV1RDKDB4ZWFmMThhMTcpLCBXVEMoMHhlYzU3MzI4ZiksIFdUQygweGVkYmFlOTAxKSwgV1RDKDB4ZWYxYTQyYjkpLAorICAgIFdUQygweGYwNzQ4MWY3KSwgV1RDKDB4ZjFjOTMyZDQpLCBXVEMoMHhmMzE4M2UxOSksIFdUQygweGY0NjBiMzVmKSwKKyAgICBXVEMoMHhmNWEwNGFjNyksIFdUQygweGY2ZDMzODQ1KSwgV1RDKDB4ZjdmODBlYzApLCBXVEMoMHhmOTEyYTVjZCksCisgICAgV1RDKDB4ZmEyODJhMmUpLCBXVEMoMHhmYjNjZDgxYyksIFdUQygweGZjNTE2MjliKSwgV1RDKDB4ZmQ2OWY4MWYpLAorICAgIFdUQygweGZlOGFiZGViKSwgV1RDKDB4ZmY4NmYxNzMpLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4YmZlYzViZmEpLCBXVEMoMHhiZmM1MGRkOCksIFdUQygweGJmOWRiODhiKSwgV1RDKDB4YmY3NjY4M2MpLAorICAgIFdUQygweGJmNGYxOTQ0KSwgV1RDKDB4YmYyN2Q2NDkpLCBXVEMoMHhiZjAwYTE1OCksIFdUQygweGJlZDk4NDhjKSwKKyAgICBXVEMoMHhiZWIyODhmMSksIFdUQygweGJlOGJiNzlmKSwgV1RDKDB4YmU2NTFmMDApLCBXVEMoMHhiZTNlYzZmOCksCisgICAgV1RDKDB4YmUxOGMxZjYpLCBXVEMoMHhiZGYzMTVmZSksIFdUQygweGJkY2RkNzlkKSwgV1RDKDB4YmRhOTA5YzEpLAorICAgIFdUQygweGJkODRiZWFlKSwgV1RDKDB4YmQ2MGY2YWIpLCBXVEMoMHhiZDNkYzIxMCksIFdUQygweGJkMWIyMDkzKSwKKyAgICBXVEMoMHhiY2Y5MWFlOSksIFdUQygweGJjZDdhY2FiKSwgV1RDKDB4YmNiNmQ1Y2MpLCBXVEMoMHhiYzk2OTE0MyksCisgICAgV1RDKDB4YmM3NmRjZjQpLCBXVEMoMHhiYzU3YjMxNyksIFdUQygweGJjMzkwYzRkKSwgV1RDKDB4YmMxYWQ1MTQpLAorICAgIFdUQygweGJiZmQyZmRiKSwgV1RDKDB4YmJkZmE1NDgpLCBXVEMoMHhiYmNjZTk0NiksIFdUQygweGJiY2IzOWQ5KSwKKyAgICBXVEMoMHhiYmQyMTRjZiksIFdUQygweGJiZGRmYjYwKSwgV1RDKDB4YmJmMzc4M2UpLCBXVEMoMHhiYzExZjhkMiksCisgICAgV1RDKDB4YmMzNTA5ZjgpLCBXVEMoMHhiYzVjYTJiMCksIFdUQygweGJjOGRjMGIwKSwgV1RDKDB4YmNjZDRiMmYpLAorICAgIFdUQygweGJkMWI3MTA3KSwgV1RDKDB4YmQ3NGM2YTQpLCBXVEMoMHhiZGQ2MzVjMCksIFdUQygweGJlM2Y0Y2Q3KSwKKyAgICBXVEMoMHhiZWIyNDgzNiksIFdUQygweGJmMzFiNWRmKSwgV1RDKDB4YmZiZmU2ZTIpLCBXVEMoMHhjMDVhNmRiZiksCisgICAgV1RDKDB4YzBmODA3MDApLCBXVEMoMHhjMTk4NDQ5YyksIFdUQygweGMyNDJlYTE1KSwgV1RDKDB4YzJmODI3MGQpLAorICAgIFdUQygweGMzYjIwYmQyKSwgV1RDKDB4YzQ2OGY1NTQpLCBXVEMoMHhjNTIyNjM3ZSksIFdUQygweGM1ZTI0MDNiKSwKKyAgICBXVEMoMHhjNjlmOTc3MSksIFdUQygweGM3NTk5ZGQ1KSwgV1RDKDB4YzgxMWY4NWEpLCBXVEMoMHhjOGM2ODdkYiksCisgICAgV1RDKDB4YjQzZDhiM2IpLCBXVEMoMHhiMWYzZmIzYyksIFdUQygweGFmYjc3YmU5KSwgV1RDKDB4YWQ4N2UwNjMpLAorICAgIFdUQygweGFiNjRkY2Q1KSwgV1RDKDB4YTk0ZTRjYzIpLCBXVEMoMHhhNzQ0MThmOCksIFdUQygweGE1NDY1ODM3KSwKKyAgICBXVEMoMHhhMzU1NDI1MiksIFdUQygweGExNzExZjU5KSwgV1RDKDB4OWY5YTYyZjUpLCBXVEMoMHg5ZGQxODEwNCksCisgICAgV1RDKDB4OWMxNzE2N2UpLCBXVEMoMHg5YTZiYmJlOSksIFdUQygweDk4ZDAwNjFjKSwgV1RDKDB4OTc0NDllMjMpLAorICAgIFdUQygweDk1Y2ExYWQ2KSwgV1RDKDB4OTQ2MGU3YTEpLCBXVEMoMHg5MzA5NjIyMiksIFdUQygweDkxYzNjOWRhKSwKKyAgICBXVEMoMHg5MDkwMjYzMyksIFdUQygweDhmNmUzYzVmKSwgV1RDKDB4OGU1ZDc3ODgpLCBXVEMoMHg4ZDVjYjc4OSksCisgICAgV1RDKDB4OGM2YTQyZDUpLCBXVEMoMHg4YjgzM2Q2ZiksIFdUQygweDhhYTNjYzEwKSwgV1RDKDB4ODljNzc4OWEpLAorICAgIFdUQygweDg4ZWY5ODAyKSwgV1RDKDB4ODgzNDUyYzMpLCBXVEMoMHg4N2MwYmI5YSksIFdUQygweDg3OGM4MzI2KSwKKyAgICBXVEMoMHg4NzU3ZWI0YyksIFdUQygweDg3MjIyMTE5KSwgV1RDKDB4ODZlYjVmMzEpLCBXVEMoMHg4NmIzODAyYyksCisgICAgV1RDKDB4ODY3YTczZWUpLCBXVEMoMHg4NjQwMmNmOCksIFdUQygweDg2MDRhNDM5KSwgV1RDKDB4ODVjN2NkMjIpLAorICAgIFdUQygweDg1ODlhNDBiKSwgV1RDKDB4ODU0YTFkMmYpLCBXVEMoMHg4NTA5NDRjMSksIFdUQygweDg0YzcxNjcwKSwKKyAgICBXVEMoMHg4NDgzYWNjOCksIFdUQygweDg0M2YwNGI2KSwgV1RDKDB4ODNmOTNjZDkpLCBXVEMoMHg4M2IyNTc2YyksCisgICAgV1RDKDB4ODM2YTc4MTIpLCBXVEMoMHg4MzIxYTc2NCksIFdUQygweDgyZDgwNWU4KSwgV1RDKDB4ODI4ZGEwNzYpLAorICAgIFdUQygweDgyNDI5MGMzKSwgV1RDKDB4ODFmNmU2YTgpLCBXVEMoMHg4MWFhYjIzYyksIFdUQygweDgxNWUwNWY4KSwKKyAgICBXVEMoMHg4MTEwZTRkNiksIFdUQygweDgwYzM2MmRmKSwgV1RDKDB4ODA3NTc4MWQpLCBXVEMoMHg4MDI3M2MwYyksCisgICAgV1RDKDB4MGFiY2I3ZWQpLCBXVEMoMHgwYjgxZDE4MyksIFdUQygweDBjNTExM2UzKSwgV1RDKDB4MGQyODY3ZDUpLAorICAgIFdUQygweDBlMDgyZmE1KSwgV1RDKDB4MGVmMDg5YWQpLCBXVEMoMHgwZmUxZDljZCksIFdUQygweDEwZDllNWY0KSwKKyAgICBXVEMoMHgxMWQ2YTJhMCksIFdUQygweDEyZDgxNGIxKSwgV1RDKDB4MTNkOThmNTIpLCBXVEMoMHgxNGQyMjFlMSksCisgICAgV1RDKDB4MTViYTQ2N2EpLCBXVEMoMHgxNjhhOWMxOCksIFdUQygweDE3M2QxZmVmKSwgV1RDKDB4MTdkYTNiZmYpLAorICAgIFdUQygweDE4OTEyY2FjKSwgV1RDKDB4MTk2YzJhNWUpLCBXVEMoMHgxYTY4ZGQyZSksIFdUQygweDFiODUyNTBjKSwKKyAgICBXVEMoMHgxY2JlYTlhMSksIFdUQygweDFlMTQ3YmU3KSwgV1RDKDB4MWY4YWE0NDYpLCBXVEMoMHgyMTIyZTczYSksCisgICAgV1RDKDB4MjJjZjZkZTMpLCBXVEMoMHgyNDg4NjdmMyksIFdUQygweDI2NWQ3OTM3KSwgV1RDKDB4Mjg0N2M5MWIpLAorICAgIFdUQygweDJhMzlkOThlKSwgV1RDKDB4MmM0ODJhYmYpLCBXVEMoMHgyZTdmZjQzOSksIFdUQygweDMwYzMxZjQ2KSwKKyAgICBXVEMoMHgzMmY1MjQ1ZCksIFdUQygweDM1MzUwNzBlKSwgV1RDKDB4MzdhZGFlMzgpLCBXVEMoMHgzYTNmMTUxYSksCisgICAgV1RDKDB4M2NhZjg2MWIpLCBXVEMoMHgzZWZmYzA4YiksIFdUQygweDQxNWE4MDNiKSwgV1RDKDB4NDNkNDVjYTkpLAorICAgIFdUQygweDQ2NjMxYzY5KSwgV1RDKDB4NDhlZDljN2UpLCBXVEMoMHg0YjYwODgwNyksIFdUQygweDRkYmJlYWQzKSwKKyAgICBXVEMoMHg1MDBjYTFkZiksIFdUQygweDUyNWUzYzVkKSwgV1RDKDB4NTRiN2MxOTkpLCBXVEMoMHg1NzBkZjlhMiksCisgICAgV1RDKDB4NTk0MGY2NjEpLCBXVEMoMHg1YjU0MmYxMyksIFdUQygweDVkNjRhMjAyKSwgV1RDKDB4NWY3MzhlMzkpLAorICAgIFdUQygweDYxNzA0MDI3KSwgV1RDKDB4NjM0OGVmNWUpLCBXVEMoMHg2NTEwOWM1ZiksIFdUQygweDY2ZDNlMjlkKSwKKyAgICBXVEMoMHg2ODdlYjI5YSksIFdUQygweDZhMTI1NjQzKSwgV1RDKDB4NmI5NjBiM2EpLCBXVEMoMHg2ZDA3YjI4MyksCisgICAgV1RDKDB4YWY1YjhkYWEpLCBXVEMoMHhiM2Q1NTdiYSksIFdUQygweGI4MjlmZWIyKSwgV1RDKDB4YmM2MTk5ZTcpLAorICAgIFdUQygweGMwN2JmYmMxKSwgV1RDKDB4YzQ3N2ExYjYpLCBXVEMoMHhjODUzMmYzMCksIFdUQygweGNjMGRkNjk4KSwKKyAgICBXVEMoMHhjZmE3MWYwNiksIFdUQygweGQzMWVjNTc4KSwgV1RDKDB4ZDY3NGM1YjkpLCBXVEMoMHhkOWE5MDUxNiksCisgICAgV1RDKDB4ZGNiYmMyYjYpLCBXVEMoMHhkZmFjZjkzNCksIFdUQygweGUyN2QxOWFiKSwgV1RDKDB4ZTUyYzNkODkpLAorICAgIFdUQygweGU3YmIwZjUyKSwgV1RDKDB4ZWEyOWJkZDApLCBXVEMoMHhlYzc4YmM0YSksIFdUQygweGVlYTgwNWU2KSwKKyAgICBXVEMoMHhmMGI4NWE2OCksIFdUQygweGYyYWIyNjZlKSwgV1RDKDB4ZjQ4MjM0YTcpLCBXVEMoMHhmNjNjYjczMyksCisgICAgV1RDKDB4ZjdkNzBiM2YpLCBXVEMoMHhmOTUyZDRkMyksIFdUQygweGZhYjQ5MDZkKSwgV1RDKDB4ZmJmYWE4NTgpLAorICAgIFdUQygweGZkMjcyNDM3KSwgV1RDKDB4ZmUzOTJiZWEpLCBXVEMoMHhmZjJlMjZmMSksIFdUQygweDAwMGVmYWMwKSwKKyAgICBXVEMoMHgwMGUzNmQyNiksIFdUQygweDAxOWJkODAzKSwgV1RDKDB4MDIyOWUzNTcpLCBXVEMoMHgwMmExNmIyNSksCisgICAgV1RDKDB4MDMxOWVlNWUpLCBXVEMoMHgwMzhjY2VhMCksIFdUQygweDAzZTU2ZDNkKSwgV1RDKDB4MDQxZGMwNzIpLAorICAgIFdUQygweDA0M2Y1OGNjKSwgV1RDKDB4MDQ1NzEyNzMpLCBXVEMoMHgwNDZiYTc2MSksIFdUQygweDA0NzljYWE1KSwKKyAgICBXVEMoMHgwNDdhMjI3OSksIFdUQygweDA0NjczOTUwKSwgV1RDKDB4MDQ0MzUyNjMpLCBXVEMoMHgwNDE3NTBkYSksCisgICAgV1RDKDB4MDNlOTk5MjYpLCBXVEMoMHgwM2I0YmExZiksIFdUQygweDAzNzMxZTJiKSwgV1RDKDB4MDMyN2IzMDMpLAorICAgIFdUQygweDAyZDgzMDFiKSwgV1RDKDB4MDI4NGZiMTEpLCBXVEMoMHgwMjJiNDY0YSksIFdUQygweDAxY2MxYjQwKSwKKyAgICBXVEMoMHgwMTY5YWI3ZCksIFdUQygweDAxMDQ3ZDFlKSwgV1RDKDB4MDA5ZDA0ZTApLCBXVEMoMHgwMDM0ODRiMCksCisgICAgV1RDKDB4ZDVhOTM0OGEpLCBXVEMoMHhkM2YwNWVjYSksIFdUQygweGQyNDMzOWU3KSwgV1RDKDB4ZDBhMjY5YjcpLAorICAgIFdUQygweGNmMGZlMDI2KSwgV1RDKDB4Y2Q4YWExNGIpLCBXVEMoMHhjYzEzOTYzZSksIFdUQygweGNhYTE5YzVhKSwKKyAgICBXVEMoMHhjOTJjZDcwMSksIFdUQygweGM3YjVjZDdiKSwgV1RDKDB4YzYyYTRmZTMpLCBXVEMoMHhjNDY3NDJiZSksCisgICAgV1RDKDB4YzI0ZTEyOGMpLCBXVEMoMHhiZmMwYjc1OCksIFdUQygweGJjYTY2MWUzKSwgV1RDKDB4YjkyMjkyNGIpLAorICAgIFdUQygweGI1Zjg3YWMyKSwgV1RDKDB4YjM1MzA4ZTcpLCBXVEMoMHhiMTJjYzkwZiksIFdUQygweGFmODA1MjJjKSwKKyAgICBXVEMoMHhhZTQ4M2IxMCksIFdUQygweGFkN2YxYWY5KSwgV1RDKDB4YWQxZjg4NzQpLCBXVEMoMHhhZDI0MWEwOSksCisgICAgV1RDKDB4YWQ4NzY2ZWEpLCBXVEMoMHhhZTQ0MDViMSksIFdUQygweGFmNTQ4ZDcyKSwgV1RDKDB4YjBiMzk0YWQpLAorICAgIFdUQygweGIyNWJiMjk3KSwgV1RDKDB4YjQ0NzZmYTEpLCBXVEMoMHhiNjcxOGQyYyksIFdUQygweGI4ZDQ3NzgxKSwKKyAgICBXVEMoMHhiYjZhZDM3YiksIFdUQygweGJlMmYzODMxKSwgV1RDKDB4YzExYzNjNmMpLCBXVEMoMHhjNDJjNzZiMSksCisgICAgV1RDKDB4Yzc1YTdlNDApLCBXVEMoMHhjYWEwZTlkMSksIFdUQygweGNkZmE1MDJiKSwgV1RDKDB4ZDE2MTQ4MDMpLAorICAgIFdUQygweGQ0ZDA2ODUwKSwgV1RDKDB4ZDg0MjQ3ZDMpLCBXVEMoMHhkYmIxN2Q2ZCksIFdUQygweGRmMTg5ZmUzKSwKKyAgICBXVEMoMHhlMjcyNDYxZSksIFdUQygweGU1YjkwNmUxKSwgV1RDKDB4ZThlNzc5MGUpLCBXVEMoMHhlYmY4MzM2NiksCisgICAgV1RDKDB4ZWVlNWNjY2MpLCBXVEMoMHhmMWFhZGMwYSksIFdUQygweGY0NDFmN2ZhKSwgV1RDKDB4ZjZhNWI3NzIpLAorICAgIFdUQygweGY4ZDBiMTQ2KSwgV1RDKDB4ZmFiZDdjM2UpLCBXVEMoMHhmYzY2YWYzNSksIFdUQygweGZkYzZlMTAxKSwKKyAgICBXVEMoMHhmZWQ4YTg3NSksIFdUQygweGZmOTY5YzYzKSwgV1RDKDB4ZmZmYjUzOTApLCBXVEMoMHgwMDAxN2FkOCksCit9OwogCiBjb25zdCBGSVhQX1dUQiBMb3dEZWxheVN5bnRoZXNpczUxMlsxNTM2XSA9IHsKLS8qIHBhcnQgMCAqLwotV1RDKDB4ZGFjOTg0YzApLCBXVEMoMHhkYjEwMDA4MCksIFdUQygweGRiNTZjZDAwKSwgV1RDKDB4ZGI5ZGVjNDApLCBXVEMoMHhkYmU1NWZjMCksIFdUQygweGRjMmQyODgwKSwgV1RDKDB4ZGM3NTQ3ODApLCBXVEMoMHhkY2JkYmQ4MCksCi1XVEMoMHhkZDA2OGE4MCksIFdUQygweGRkNGZhZTgwKSwgV1RDKDB4ZGQ5OTI5NDApLCBXVEMoMHhkZGUyZjljMCksIFdUQygweGRlMmQxZmMwKSwgV1RDKDB4ZGU3NzlhODApLCBXVEMoMHhkZWMyNmEwMCksIFdUQygweGRmMGQ4ZTAwKSwKLVdUQygweGRmNTkwNjgwKSwgV1RDKDB4ZGZhNGQ1NDApLCBXVEMoMHhkZmYwZmM4MCksIFdUQygweGUwM2Q3ZTIwKSwgV1RDKDB4ZTA4YTU5MDApLCBXVEMoMHhlMGQ3OGEyMCksIFdUQygweGUxMjUwY2MwKSwgV1RDKDB4ZTE3MmRjYzApLAotV1RDKDB4ZTFjMGY3YTApLCBXVEMoMHhlMjBmNTlhMCksIFdUQygweGUyNWRmZWEwKSwgV1RDKDB4ZTJhY2U0MDApLCBXVEMoMHhlMmZjMGJlMCksIFdUQygweGUzNGI3YmMwKSwgV1RDKDB4ZTM5YjNjODApLCBXVEMoMHhlM2ViNTI2MCksCi1XVEMoMHhlNDNiYmFjMCksIFdUQygweGU0OGM3MTYwKSwgV1RDKDB4ZTRkZDcxNDApLCBXVEMoMHhlNTJlYjYwMCksIFdUQygweGU1ODAzYzAwKSwgV1RDKDB4ZTVkMWZkYTApLCBXVEMoMHhlNjIzZjM2MCksIFdUQygweGU2NzYxNzAwKSwKLVdUQygweGU2Yzg2NDAwKSwgV1RDKDB4ZTcxYWQ1MDApLCBXVEMoMHhlNzZkNjNlMCksIFdUQygweGU3YzAwYmEwKSwgV1RDKDB4ZTgxMmM4ZTApLCBXVEMoMHhlODY1OThlMCksIFdUQygweGU4Yjg3OGUwKSwgV1RDKDB4ZTkwYjY4YTApLAotV1RDKDB4ZTk1ZTZjNDApLCBXVEMoMHhlOWIxOGFlMCksIFdUQygweGVhMDRjZTgwKSwgV1RDKDB4ZWE1ODNiYTApLCBXVEMoMHhlYWFiY2RhMCksIFdUQygweGVhZmY3ZWUwKSwgV1RDKDB4ZWI1MzQ4ZTApLCBXVEMoMHhlYmE3MjJjMCksCi1XVEMoMHhlYmZiMDA2MCksIFdUQygweGVjNGVkMjQwKSwgV1RDKDB4ZWNhMjg1NDApLCBXVEMoMHhlY2Y2MGMyMCksIFdUQygweGVkNDk2MTIwKSwgV1RDKDB4ZWQ5YzdlODApLCBXVEMoMHhlZGVmNWU0MCksIFdUQygweGVlNDFmYzAwKSwKLVdUQygweGVlOTQ1NjAwKSwgV1RDKDB4ZWVlNjZhYzApLCBXVEMoMHhlZjM4MzlhMCksIFdUQygweGVmODljMGUwKSwgV1RDKDB4ZWZkYWZkYTApLCBXVEMoMHhmMDJiZWQ2MCksIFdUQygweGYwN2M4ZTgwKSwgV1RDKDB4ZjBjY2UwMDApLAotV1RDKDB4ZjExY2UyMjApLCBXVEMoMHhmMTZjOTYyMCksIFdUQygweGYxYmJmZTMwKSwgV1RDKDB4ZjIwYjE5ZTApLCBXVEMoMHhmMjU5ZTVhMCksIFdUQygweGYyYTg1ZGMwKSwgV1RDKDB4ZjJmNjdlZDApLCBXVEMoMHhmMzQ0NDViMCksCi1XVEMoMHhmMzkxYWVkMCksIFdUQygweGYzZGViNTkwKSwgV1RDKDB4ZjQyYjUzZTApLCBXVEMoMHhmNDc3ODE0MCksIFdUQygweGY0YzMzMTkwKSwgV1RDKDB4ZjUwZTU2NjApLCBXVEMoMHhmNTU4ZGYzMCksIFdUQygweGY1YTJiZTUwKSwKLVdUQygweGY1ZWJlYTEwKSwgV1RDKDB4ZjYzNDU3ODApLCBXVEMoMHhmNjdiZmFiMCksIFdUQygweGY2YzJjZWUwKSwgV1RDKDB4ZjcwOGQ3YjApLCBXVEMoMHhmNzRlMTljMCksIFdUQygweGY3OTI5YTcwKSwgV1RDKDB4ZjdkNjY2MzApLAotV1RDKDB4ZjgxOTkyNjgpLCBXVEMoMHhmODVjMzg2MCksIFdUQygweGY4OWU3NDgwKSwgV1RDKDB4ZjhlMDU4YzApLCBXVEMoMHhmOTIxZWMwOCksIFdUQygweGY5NjMzODAwKSwgV1RDKDB4ZjlhNDQ5ODApLCBXVEMoMHhmOWU1MzE1OCksCi1XVEMoMHhmYTI2MDE1OCksIFdUQygweGZhNjZjYTE4KSwgV1RDKDB4ZmFhNzlhYzApLCBXVEMoMHhmYWU4NzkyMCksIFdUQygweGZiMjk1ZmEwKSwgV1RDKDB4ZmI2YTQyYjgpLCBXVEMoMHhmYmFiMTI0MCksIFdUQygweGZiZWJkMWMwKSwKLVdUQygweGZjMmM5YzI0KSwgV1RDKDB4ZmM2ZDhkOTApLCBXVEMoMHhmY2FlYzI0MCksIFdUQygweGZjZjA1Njg0KSwgV1RDKDB4ZmQzMjZhOTgpLCBXVEMoMHhmZDc1MjU0YyksIFdUQygweGZkYjhhZmQ0KSwgV1RDKDB4ZmRmY2NkZmMpLAotV1RDKDB4ZmU0MGQ2OTQpLCBXVEMoMHhmZTg0MTYxYyksIFdUQygweGZlYzVjZjVhKSwgV1RDKDB4ZmYwNGU3ZmMpLCBXVEMoMHhmZjNmZGZlMyksIFdUQygweGZmNzUxZGRmKSwgV1RDKDB4ZmZhMmZiMGYpLCBXVEMoMHhmZmM4N2M0MiksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweGJmZmI2MDgxKSwgV1RDKDB4YmZmMjJmODEpLCBXVEMoMHhiZmU4ZmMwMSksIFdUQygweGJmZGZjNzgxKSwgV1RDKDB4YmZkNjkxMDEpLCBXVEMoMHhiZmNkNWEwMSksIFdUQygweGJmYzQyMjAxKSwgV1RDKDB4YmZiYWU5ODEpLAotV1RDKDB4YmZiMWIxMDEpLCBXVEMoMHhiZmE4NzkwMSksIFdUQygweGJmOWY0MTgxKSwgV1RDKDB4YmY5NjBiMDEpLCBXVEMoMHhiZjhjZDQ4MSksIFdUQygweGJmODM5ZDgxKSwgV1RDKDB4YmY3YTY2ODEpLCBXVEMoMHhiZjcxMmYwMSksCi1XVEMoMHhiZjY3ZjgwMSksIFdUQygweGJmNWVjMTAxKSwgV1RDKDB4YmY1NThiMDEpLCBXVEMoMHhiZjRjNTY4MSksIFdUQygweGJmNDMyMjgxKSwgV1RDKDB4YmYzOWVlODEpLCBXVEMoMHhiZjMwYmIwMSksIFdUQygweGJmMjc4ODAxKSwKLVdUQygweGJmMWU1NTAxKSwgV1RDKDB4YmYxNTIzODEpLCBXVEMoMHhiZjBiZjM4MSksIFdUQygweGJmMDJjNTgxKSwgV1RDKDB4YmVmOTk5MDEpLCBXVEMoMHhiZWYwNmQwMSksIFdUQygweGJlZTc0MjgxKSwgV1RDKDB4YmVkZTE5MDEpLAotV1RDKDB4YmVkNGYwODEpLCBXVEMoMHhiZWNiY2E4MSksIFdUQygweGJlYzJhNzgxKSwgV1RDKDB4YmViOTg2ODEpLCBXVEMoMHhiZWIwNjg4MSksIFdUQygweGJlYTc0YzgxKSwgV1RDKDB4YmU5ZTMyODEpLCBXVEMoMHhiZTk1MWE4MSksCi1XVEMoMHhiZThjMDUwMSksIFdUQygweGJlODJmMzAxKSwgV1RDKDB4YmU3OWU0ODEpLCBXVEMoMHhiZTcwZGEwMSksIFdUQygweGJlNjdkMzgxKSwgV1RDKDB4YmU1ZWQwODEpLCBXVEMoMHhiZTU1ZDAwMSksIFdUQygweGJlNGNkMzgxKSwKLVdUQygweGJlNDNkYTgxKSwgV1RDKDB4YmUzYWU2MDEpLCBXVEMoMHhiZTMxZjcwMSksIFdUQygweGJlMjkwZDAxKSwgV1RDKDB4YmUyMDI4MDEpLCBXVEMoMHhiZTE3NDc4MSksIFdUQygweGJlMGU2YzAxKSwgV1RDKDB4YmUwNTk0ODEpLAotV1RDKDB4YmRmY2MzMDEpLCBXVEMoMHhiZGYzZjcwMSksIFdUQygweGJkZWIzMTAxKSwgV1RDKDB4YmRlMjcyMDEpLCBXVEMoMHhiZGQ5Yjk4MSksIFdUQygweGJkZDEwNjgxKSwgV1RDKDB4YmRjODU5ODEpLCBXVEMoMHhiZGJmYjI4MSksCi1XVEMoMHhiZGI3MTIwMSksIFdUQygweGJkYWU3ODgxKSwgV1RDKDB4YmRhNWU2MDEpLCBXVEMoMHhiZDlkNWI4MSksIFdUQygweGJkOTRkODAxKSwgV1RDKDB4YmQ4YzVjMDEpLCBXVEMoMHhiZDgzZTY4MSksIFdUQygweGJkN2I3NzgxKSwKLVdUQygweGJkNzMxMDgxKSwgV1RDKDB4YmQ2YWIxMDEpLCBXVEMoMHhiZDYyNTk4MSksIFdUQygweGJkNWEwYjAxKSwgV1RDKDB4YmQ1MWM0ODEpLCBXVEMoMHhiZDQ5ODYwMSksIFdUQygweGJkNDE0ZjAxKSwgV1RDKDB4YmQzOTFmODEpLAotV1RDKDB4YmQzMGY4ODEpLCBXVEMoMHhiZDI4ZDk4MSksIFdUQygweGJkMjBjNDAxKSwgV1RDKDB4YmQxOGI3ODEpLCBXVEMoMHhiZDEwYjM4MSksIFdUQygweGJkMDhiNzgxKSwgV1RDKDB4YmQwMGMzODEpLCBXVEMoMHhiY2Y4ZDc4MSksCi1XVEMoMHhiY2YwZjM4MSksIFdUQygweGJjZTkxODAxKSwgV1RDKDB4YmNlMTQ2MDEpLCBXVEMoMHhiY2Q5N2M4MSksIFdUQygweGJjZDFiYjgxKSwgV1RDKDB4YmNjYTAzMDEpLCBXVEMoMHhiY2MyNTE4MSksIFdUQygweGJjYmFhODAxKSwKLVdUQygweGJjYjMwNjAxKSwgV1RDKDB4YmNhYjZjMDEpLCBXVEMoMHhiY2EzZGIwMSksIFdUQygweGJjOWM1MjgxKSwgV1RDKDB4YmM5NGQyMDEpLCBXVEMoMHhiYzhkNTkwMSksIFdUQygweGJjODVlODAxKSwgV1RDKDB4YmM3ZTdlMDEpLAotV1RDKDB4YmM3NzFjMDEpLCBXVEMoMHhiYzZmYzEwMSksIFdUQygweGJjNjg2ZTAxKSwgV1RDKDB4YmM2MTIzMDEpLCBXVEMoMHhiYzU5ZGY4MSksIFdUQygweGJjNTJhMzgxKSwgV1RDKDB4YmM0YjZlODEpLCBXVEMoMHhiYzQ0NDA4MSksCi1XVEMoMHhiYzNkMTgwMSksIFdUQygweGJjMzVmNTAxKSwgV1RDKDB4YmMyZWQ2ODEpLCBXVEMoMHhiYzI3YmQ4MSksIFdUQygweGJjMjBhZTAxKSwgV1RDKDB4YmMxOWFiMDEpLCBXVEMoMHhiYzEyYjgwMSksIFdUQygweGJjMGJjZjgxKSwKLVdUQygweGJjMDRlMzgxKSwgV1RDKDB4YmJmZGU0ODEpLCBXVEMoMHhiYmY2YzYwMSksIFdUQygweGJiZWY5YjgxKSwgV1RDKDB4YmJlODk5MDEpLCBXVEMoMHhiYmUxZjQwMSksIFdUQygweGJiZGJlMjAxKSwgV1RDKDB4YmJkNjhjODEpLAotV1RDKDB4YmJkMjEyODEpLCBXVEMoMHhiYmNlOTE4MSksIFdUQygweGJiY2MyNjgxKSwgV1RDKDB4YmJjYWNhMDEpLCBXVEMoMHhiYmNhNTA4MSksIFdUQygweGJiY2E4ZDAxKSwgV1RDKDB4YmJjYjUzMDEpLCBXVEMoMHhiYmNjODIwMSksCi1XVEMoMHhiYmNlMDYwMSksIFdUQygweGJiY2ZjYTgxKSwgV1RDKDB4YmJkMWJkODEpLCBXVEMoMHhiYmQzZTEwMSksIFdUQygweGJiZDY0ZDAxKSwgV1RDKDB4YmJkOTFiODEpLCBXVEMoMHhiYmRjNjQ4MSksIFdUQygweGJiZTAzODAxKSwKLVdUQygweGJiZTQ5ZDAxKSwgV1RDKDB4YmJlOTk5ODEpLCBXVEMoMHhiYmVmMzMwMSksIFdUQygweGJiZjU2MTgxKSwgV1RDKDB4YmJmYzBmODEpLCBXVEMoMHhiYzAzMjYwMSksIFdUQygweGJjMGE4ZjAxKSwgV1RDKDB4YmMxMjNiODEpLAotV1RDKDB4YmMxYTI0MDEpLCBXVEMoMHhiYzIyNDE4MSksIFdUQygweGJjMmE4YzgxKSwgV1RDKDB4YmMzMzA3ODEpLCBXVEMoMHhiYzNiYmMwMSksIFdUQygweGJjNDRiNDgxKSwgV1RDKDB4YmM0ZGZiODEpLCBXVEMoMHhiYzU3YTMwMSksCi1XVEMoMHhiYzYxYzQwMSksIFdUQygweGJjNmM3NzgxKSwgV1RDKDB4YmM3N2Q2MDEpLCBXVEMoMHhiYzgzZjIwMSksIFdUQygweGJjOTBkNDgxKSwgV1RDKDB4YmM5ZTg4MDEpLCBXVEMoMHhiY2FkMTUwMSksIFdUQygweGJjYmM3ZTAxKSwKLVdUQygweGJjY2NiZDAxKSwgV1RDKDB4YmNkZGNjODEpLCBXVEMoMHhiY2VmYTYwMSksIFdUQygweGJkMDIzZjAxKSwgV1RDKDB4YmQxNTg4MDEpLCBXVEMoMHhiZDI5NzE4MSksIFdUQygweGJkM2RlYjgxKSwgV1RDKDB4YmQ1MmViMDEpLAotV1RDKDB4YmQ2ODY2ODEpLCBXVEMoMHhiZDdlNTU4MSksIFdUQygweGJkOTRiMDAxKSwgV1RDKDB4YmRhYjcxODEpLCBXVEMoMHhiZGMyOWE4MSksIFdUQygweGJkZGEyYTAxKSwgV1RDKDB4YmRmMjIxODEpLCBXVEMoMHhiZTBhODU4MSksCi1XVEMoMHhiZTIzNjAwMSksIFdUQygweGJlM2NiYzAxKSwgV1RDKDB4YmU1NmEzODEpLCBXVEMoMHhiZTcxMjAwMSksIFdUQygweGJlOGMzNzgxKSwgV1RDKDB4YmVhN2YzMDEpLCBXVEMoMHhiZWM0NTg4MSksIFdUQygweGJlZTE3MjAxKSwKLVdUQygweGJlZmY0ODAxKSwgV1RDKDB4YmYxZGU2MDEpLCBXVEMoMHhiZjNkNTUwMSksIFdUQygweGJmNWQ5YTgxKSwgV1RDKDB4YmY3ZWI1ODEpLCBXVEMoMHhiZmEwYTU4MSksIFdUQygweGJmYzM2YTAxKSwgV1RDKDB4YmZlNmVkMDEpLAotV1RDKDB4YzAwYjA0YzApLCBXVEMoMHhjMDJmODZjMCksIFdUQygweGMwNTQ0OTQwKSwgV1RDKDB4YzA3OTJlYzApLCBXVEMoMHhjMDllMjY0MCksIFdUQygweGMwYzMxZjAwKSwgV1RDKDB4YzBlODBhMDApLCBXVEMoMHhjMTBjZjQ4MCksCi1XVEMoMHhjMTMyMDk0MCksIFdUQygweGMxNTc3M2MwKSwgV1RDKDB4YzE3ZDVmMDApLCBXVEMoMHhjMWEzZTM0MCksIFdUQygweGMxY2IwNWMwKSwgV1RDKDB4YzFmMmNiYzApLCBXVEMoMHhjMjFiMzk0MCksIFdUQygweGMyNDQ0YjAwKSwKLVdUQygweGMyNmRmNWMwKSwgV1RDKDB4YzI5ODJkODApLCBXVEMoMHhjMmMyZTY0MCksIFdUQygweGMyZWUwYTAwKSwgV1RDKDB4YzMxOTc5NDApLCBXVEMoMHhjMzQ1MTNjMCksIFdUQygweGMzNzBiOWMwKSwgV1RDKDB4YzM5YzRmMDApLAotV1RDKDB4YzNjN2JjMDApLCBXVEMoMHhjM2YyZTk0MCksIFdUQygweGM0MWRjMTQwKSwgV1RDKDB4YzQ0ODU2YzApLCBXVEMoMHhjNDcyZTY0MCksIFdUQygweGM0OWRhZDgwKSwgV1RDKDB4YzRjOGU4ODApLCBXVEMoMHhjNGY0YWNjMCksCi1XVEMoMHhjNTIwZTg0MCksIFdUQygweGM1NGQ4NzgwKSwgV1RDKDB4YzU3YTc2YzApLCBXVEMoMHhjNWE3OTY0MCksIFdUQygweGM1ZDRiYWMwKSwgV1RDKDB4YzYwMWI4ODApLCBXVEMoMHhjNjJlNjU4MCksIFdUQygweGM2NWFiNjAwKSwKLVdUQygweGM2ODZiZDQwKSwgV1RDKDB4YzZiMjhmYzApLCBXVEMoMHhjNmRlNDFjMCksIFdUQygweGM3MDlkZTQwKSwgV1RDKDB4YzczNTY2NDApLCBXVEMoMHhjNzYwZGE4MCksIFdUQygweGM3OGMzYzQwKSwgV1RDKDB4YzdiNzg2NDApLAotV1RDKDB4YzdlMmFmYzApLCBXVEMoMHhjODBkYWU4MCksIFdUQygweGM4Mzg3OGMwKSwgV1RDKDB4Yzg2MzA0YzApLCBXVEMoMHhjODhkNDkwMCksIFdUQygweGM4YjczYjgwKSwgV1RDKDB4YzhlMGQyODApLCBXVEMoMHhjOTBhMDQ0MCksCi0vKiBwYXJ0IDEgKi8KLVdUQygweGI1MjEyZTgxKSwgV1RDKDB4YjQ5NTk1MDEpLCBXVEMoMHhiNDBhYjUwMSksIFdUQygweGIzODA4ZDgxKSwgV1RDKDB4YjJmNzFmMDEpLCBXVEMoMHhiMjZlNjg4MSksIFdUQygweGIxZTY2YTAxKSwgV1RDKDB4YjE1ZjIzODEpLAotV1RDKDB4YjBkODk0MDEpLCBXVEMoMHhiMDUyYmMwMSksIFdUQygweGFmY2Q5YTgxKSwgV1RDKDB4YWY0OTJmMDEpLCBXVEMoMHhhZWM1NzgwMSksIFdUQygweGFlNDI3NDgxKSwgV1RDKDB4YWRjMDIyODEpLCBXVEMoMHhhZDNlODEwMSksCi1XVEMoMHhhY2JkOTA4MSksIFdUQygweGFjM2Q1MDAxKSwgV1RDKDB4YWJiZGMwMDEpLCBXVEMoMHhhYjNlZGYwMSksIFdUQygweGFhYzBhZDAxKSwgV1RDKDB4YWE0MzI5ODEpLCBXVEMoMHhhOWM2NTQwMSksIFdUQygweGE5NGEyYzAxKSwKLVdUQygweGE4Y2ViMjAxKSwgV1RDKDB4YTg1M2U1MDEpLCBXVEMoMHhhN2Q5YzY4MSksIFdUQygweGE3NjA1NjAxKSwgV1RDKDB4YTZlNzk0MDEpLCBXVEMoMHhhNjZmODIwMSksIFdUQygweGE1ZjgxZjgxKSwgV1RDKDB4YTU4MTZlODEpLAotV1RDKDB4YTUwYjZlODEpLCBXVEMoMHhhNDk2MjE4MSksIFdUQygweGE0MjE4ODAxKSwgV1RDKDB4YTNhZGEyODEpLCBXVEMoMHhhMzNhNzIwMSksIFdUQygweGEyYzdmODAxKSwgV1RDKDB4YTI1NjM1MDEpLCBXVEMoMHhhMWU1MmE4MSksCi1XVEMoMHhhMTc0ZGE4MSksIFdUQygweGExMDU0NzAxKSwgV1RDKDB4YTA5NjcyMDEpLCBXVEMoMHhhMDI4NWQ4MSksIFdUQygweDlmYmIwOTgxKSwgV1RDKDB4OWY0ZTc4MDEpLCBXVEMoMHg5ZWUyYTkwMSksIFdUQygweDllNzc5ZjgxKSwKLVdUQygweDllMGQ1ZTAxKSwgV1RDKDB4OWRhM2U2MDEpLCBXVEMoMHg5ZDNiM2I4MSksIFdUQygweDljZDM1ZjgxKSwgV1RDKDB4OWM2YzU0ODEpLCBXVEMoMHg5YzA2MWI4MSksIFdUQygweDliYTBiNzAxKSwgV1RDKDB4OWIzYzI4MDEpLAotV1RDKDB4OWFkODcwODEpLCBXVEMoMHg5YTc1OTMwMSksIFdUQygweDlhMTM5MTAxKSwgV1RDKDB4OTliMjZjODEpLCBXVEMoMHg5OTUyMjgwMSksIFdUQygweDk4ZjJjNjAxKSwgV1RDKDB4OTg5NDQ5MDEpLCBXVEMoMHg5ODM2YjIwMSksCi1XVEMoMHg5N2RhMDQ4MSksIFdUQygweDk3N2U0MTgxKSwgV1RDKDB4OTcyMzZiMDEpLCBXVEMoMHg5NmM5ODM4MSksIFdUQygweDk2NzA4YjgxKSwgV1RDKDB4OTYxODg1MDEpLCBXVEMoMHg5NWMxNzA4MSksIFdUQygweDk1NmI0ZjgxKSwKLVdUQygweDk1MTYyMzgxKSwgV1RDKDB4OTRjMWVlMDEpLCBXVEMoMHg5NDZlYWY4MSksIFdUQygweDk0MWM2OTAxKSwgV1RDKDB4OTNjYjFjODEpLCBXVEMoMHg5MzdhY2IwMSksIFdUQygweDkzMmI3NTAxKSwgV1RDKDB4OTJkZDFiMDEpLAotV1RDKDB4OTI4ZmJlMDEpLCBXVEMoMHg5MjQzNWQwMSksIFdUQygweDkxZjdmOTgxKSwgV1RDKDB4OTFhZDkyODEpLCBXVEMoMHg5MTY0Mjc4MSksIFdUQygweDkxMWJiOTgxKSwgV1RDKDB4OTBkNDQ3ODEpLCBXVEMoMHg5MDhkZDEwMSksCi1XVEMoMHg5MDQ4NTQwMSksIFdUQygweDkwMDNjZTgxKSwgV1RDKDB4OGZjMDNmMDEpLCBXVEMoMHg4ZjdkYTQwMSksIFdUQygweDhmM2JmYjAxKSwgV1RDKDB4OGVmYjQxODEpLCBXVEMoMHg4ZWJiNzU4MSksIFdUQygweDhlN2M5MzAxKSwKLVdUQygweDhlM2U5NDgxKSwgV1RDKDB4OGUwMTc1ODEpLCBXVEMoMHg4ZGM1MzAwMSksIFdUQygweDhkODliZTgxKSwgV1RDKDB4OGQ0ZjFiMDEpLCBXVEMoMHg4ZDE1NDA4MSksIFdUQygweDhjZGMyOTAxKSwgV1RDKDB4OGNhM2NiMDEpLAotV1RDKDB4OGM2YzFiMDEpLCBXVEMoMHg4YzM1MGQwMSksIFdUQygweDhiZmU5NDAxKSwgV1RDKDB4OGJjOGE0MDEpLCBXVEMoMHg4YjkzMzAwMSksIFdUQygweDhiNWUyYzgxKSwgV1RDKDB4OGIyOThiODEpLCBXVEMoMHg4YWY1M2U4MSksCi1XVEMoMHg4YWMxMzM4MSksIFdUQygweDhhOGQ1ODAxKSwgV1RDKDB4OGE1OTlhODEpLCBXVEMoMHg4YTI1ZjMwMSksIFdUQygweDg5ZjI2MTAxKSwgV1RDKDB4ODliZWU1ODEpLCBXVEMoMHg4OThiODMwMSksIFdUQygweDg5NTg2OTAxKSwKLVdUQygweDg5MjVmMTAxKSwgV1RDKDB4ODhmNDc5MDEpLCBXVEMoMHg4OGM0NWU4MSksIFdUQygweDg4OTYyOTgxKSwgV1RDKDB4ODg2YThhODEpLCBXVEMoMHg4ODQyMzMwMSksIFdUQygweDg4MWRkMzAxKSwgV1RDKDB4ODdmZGQ3ODEpLAotV1RDKDB4ODdkMGNhODEpLCBXVEMoMHg4N2M3NjIwMSksIFdUQygweDg3YmNhYjgxKSwgV1RDKDB4ODdiMGVmMDEpLCBXVEMoMHg4N2E0OGIwMSksIFdUQygweDg3OTdkZDgxKSwgV1RDKDB4ODc4YjQzMDEpLCBXVEMoMHg4NzdlZGUwMSksCi1XVEMoMHg4NzcyOTcwMSksIFdUQygweDg3NjY1NDgxKSwgV1RDKDB4ODc1OWZkMDEpLCBXVEMoMHg4NzRkODY4MSksIFdUQygweDg3NDBmNjgxKSwgV1RDKDB4ODczNDUzODEpLCBXVEMoMHg4NzI3YTM4MSksIFdUQygweDg3MWFlOTgxKSwKLVdUQygweDg3MGUyMzAxKSwgV1RDKDB4ODcwMTRmODEpLCBXVEMoMHg4NmY0NmQ4MSksIFdUQygweDg2ZTc3YjgxKSwgV1RDKDB4ODZkYTc5MDEpLCBXVEMoMHg4NmNkNjY4MSksIFdUQygweDg2YzA0MzgxKSwgV1RDKDB4ODZiMzBmMDEpLAotV1RDKDB4ODZhNWNhODEpLCBXVEMoMHg4Njk4NzU4MSksIFdUQygweDg2OGIxMDAxKSwgV1RDKDB4ODY3ZDlhODEpLCBXVEMoMHg4NjcwMTM4MSksIFdUQygweDg2NjI3YjAxKSwgV1RDKDB4ODY1NGQwMDEpLCBXVEMoMHg4NjQ3MTI4MSksCi1XVEMoMHg4NjM5NDMwMSksIFdUQygweDg2MmI2MjAxKSwgV1RDKDB4ODYxZDcwODEpLCBXVEMoMHg4NjBmNmUwMSksIFdUQygweDg2MDE1OTgxKSwgV1RDKDB4ODVmMzMyODEpLCBXVEMoMHg4NWU0ZjgwMSksIFdUQygweDg1ZDZhOTgxKSwKLVdUQygweDg1Yzg0ODAxKSwgV1RDKDB4ODViOWQ0ODEpLCBXVEMoMHg4NWFiNGYwMSksIFdUQygweDg1OWNiNzgxKSwgV1RDKDB4ODU4ZTBlMDEpLCBXVEMoMHg4NTdmNTEwMSksIFdUQygweDg1NzA3ZjgxKSwgV1RDKDB4ODU2MTlhMDEpLAotV1RDKDB4ODU1MmExODEpLCBXVEMoMHg4NTQzOTYwMSksIFdUQygweDg1MzQ3OTAxKSwgV1RDKDB4ODUyNTRhODEpLCBXVEMoMHg4NTE2MDk4MSksIFdUQygweDg1MDZiNTgxKSwgV1RDKDB4ODRmNzRlMDEpLCBXVEMoMHg4NGU3ZDM4MSksCi1XVEMoMHg4NGQ4NDYwMSksIFdUQygweDg0YzhhNzAxKSwgV1RDKDB4ODRiOGY4MDEpLCBXVEMoMHg4NGE5MzgwMSksIFdUQygweDg0OTk2NzAxKSwgV1RDKDB4ODQ4OTg0ODEpLCBXVEMoMHg4NDc5OGY4MSksIFdUQygweDg0Njk4ODgxKSwKLVdUQygweDg0NTk3MDgxKSwgV1RDKDB4ODQ0OTQ4ODEpLCBXVEMoMHg4NDM5MTA4MSksIFdUQygweDg0MjhjYTAxKSwgV1RDKDB4ODQxODc0MDEpLCBXVEMoMHg4NDA4MGQ4MSksIFdUQygweDgzZjc5NjgxKSwgV1RDKDB4ODNlNzBmMDEpLAotV1RDKDB4ODNkNjc4ODEpLCBXVEMoMHg4M2M1ZDM4MSksIFdUQygweDgzYjUyMTAxKSwgV1RDKDB4ODNhNDYxODEpLCBXVEMoMHg4MzkzOTUwMSksIFdUQygweDgzODJiYTAxKSwgV1RDKDB4ODM3MWQwODEpLCBXVEMoMHg4MzYwZDkwMSksCi1XVEMoMHg4MzRmZDQ4MSksIFdUQygweDgzM2VjMzgxKSwgV1RDKDB4ODMyZGE3ODEpLCBXVEMoMHg4MzFjODEwMSksIFdUQygweDgzMGI0ZjgxKSwgV1RDKDB4ODJmYTExODEpLCBXVEMoMHg4MmU4YzgwMSksIFdUQygweDgyZDc3MjAxKSwKLVdUQygweDgyYzYxMTAxKSwgV1RDKDB4ODJiNGE2MDEpLCBXVEMoMHg4MmEzMzI4MSksIFdUQygweDgyOTFiNjAxKSwgV1RDKDB4ODI4MDMxMDEpLCBXVEMoMHg4MjZlYTIwMSksIFdUQygweDgyNWQwOTAxKSwgV1RDKDB4ODI0YjY2MDEpLAotV1RDKDB4ODIzOWI5ODEpLCBXVEMoMHg4MjI4MDU4MSksIFdUQygweDgyMTY0YTgxKSwgV1RDKDB4ODIwNDg4ODEpLCBXVEMoMHg4MWYyYmY4MSksIFdUQygweDgxZTBlZTgxKSwgV1RDKDB4ODFjZjE1ODEpLCBXVEMoMHg4MWJkMzQwMSksCi1XVEMoMHg4MWFiNGIwMSksIFdUQygweDgxOTk1YzAxKSwgV1RDKDB4ODE4NzY3ODEpLCBXVEMoMHg4MTc1NmQ4MSksIFdUQygweDgxNjM2ZDgxKSwgV1RDKDB4ODE1MTY3MDEpLCBXVEMoMHg4MTNmNTk4MSksIFdUQygweDgxMmQ0NDgxKSwKLVdUQygweDgxMWIyOTgxKSwgV1RDKDB4ODEwOTA5ODEpLCBXVEMoMHg4MGY2ZTQ4MSksIFdUQygweDgwZTRiYjgxKSwgV1RDKDB4ODBkMjhkODEpLCBXVEMoMHg4MGMwNWEwMSksIFdUQygweDgwYWUxZjgxKSwgV1RDKDB4ODA5YmRmMDEpLAotV1RDKDB4ODA4OTk4ODEpLCBXVEMoMHg4MDc3NGM4MSksIFdUQygweDgwNjRmYzgxKSwgV1RDKDB4ODA1MmE4ODEpLCBXVEMoMHg4MDQwNTEwMSksIFdUQygweDgwMmRmNzAxKSwgV1RDKDB4ODAxYjliMDEpLCBXVEMoMHg4MDA5M2UwMSksCi1XVEMoMHgwYTc0YjEyMCksIFdUQygweDBhYTA4YTkwKSwgV1RDKDB4MGFjZDJiODApLCBXVEMoMHgwYWZhODg2MCksIFdUQygweDBiMjg5NTkwKSwgV1RDKDB4MGI1NzQ3OTApLCBXVEMoMHgwYjg2OTJkMCksIFdUQygweDBiYjY2YmIwKSwKLVdUQygweDBiZTZjNmIwKSwgV1RDKDB4MGMxNzk4MzApLCBXVEMoMHgwYzQ4ZDUwMCksIFdUQygweDBjN2E3YWQwKSwgV1RDKDB4MGNhYzkwMDApLCBXVEMoMHgwY2RmMWI2MCksIFdUQygweDBkMTIyMzkwKSwgV1RDKDB4MGQ0NWE4ZjApLAotV1RDKDB4MGQ3OWE1ZTApLCBXVEMoMHgwZGFlMTQ4MCksIFdUQygweDBkZTJlZjMwKSwgV1RDKDB4MGUxODM4MDApLCBXVEMoMHgwZTRkZjhjMCksIFdUQygweDBlODQzYjkwKSwgV1RDKDB4MGViYjBhMjApLCBXVEMoMHgwZWYyNjQzMCksCi1XVEMoMHgwZjJhM2ZjMCksIFdUQygweDBmNjI5MjgwKSwgV1RDKDB4MGY5YjUyMTApLCBXVEMoMHgwZmQ0NzY5MCksIFdUQygweDEwMGRmYTgwKSwgV1RDKDB4MTA0N2Q4YTApLCBXVEMoMHgxMDgyMGI0MCksIFdUQygweDEwYmM4YjgwKSwKLVdUQygweDEwZjc1MDgwKSwgV1RDKDB4MTEzMjUxMDApLCBXVEMoMHgxMTZkODRlMCksIFdUQygweDExYThlY2UwKSwgV1RDKDB4MTFlNDk0MjApLCBXVEMoMHgxMjIwODVhMCksIFdUQygweDEyNWNjYmMwKSwgV1RDKDB4MTI5OTVhNDApLAotV1RDKDB4MTJkNjBlODApLCBXVEMoMHgxMzEyYzRjMCksIFdUQygweDEzNGY1OWUwKSwgV1RDKDB4MTM4YmFlNjApLCBXVEMoMHgxM2M3YTc0MCksIFdUQygweDE0MDMyOWUwKSwgV1RDKDB4MTQzZTFiNjApLCBXVEMoMHgxNDc4NjJhMCksCi1XVEMoMHgxNGIxZTg0MCksIFdUQygweDE0ZWE5NGMwKSwgV1RDKDB4MTUyMjUwYTApLCBXVEMoMHgxNTU5MDM4MCksIFdUQygweDE1OGU5M2UwKSwgV1RDKDB4MTVjMmU4MjApLCBXVEMoMHgxNWY1ZTZlMCksIFdUQygweDE2Mjc3OWEwKSwKLVdUQygweDE2NTc4Y2EwKSwgV1RDKDB4MTY4NjBjYTApLCBXVEMoMHgxNmIyZTY0MCksIFdUQygweDE2ZGUwYjAwKSwgV1RDKDB4MTcwNzcxNDApLCBXVEMoMHgxNzJmMGZhMCksIFdUQygweDE3NTRlMjAwKSwgV1RDKDB4MTc3OTYwODApLAotV1RDKDB4MTc5ZDdmMjApLCBXVEMoMHgxN2MyMzc2MCksIFdUQygweDE3ZTg3ZGEwKSwgV1RDKDB4MTgxMGNjODApLCBXVEMoMHgxODNiMjVhMCksIFdUQygweDE4Njc4NTIwKSwgV1RDKDB4MTg5NWU3MDApLCBXVEMoMHgxOGM2NDU0MCksCi1XVEMoMHgxOGY4OTc4MCksIFdUQygweDE5MmNkNTYwKSwgV1RDKDB4MTk2MmY2ODApLCBXVEMoMHgxOTlhZjJhMCksIFdUQygweDE5ZDRjMWUwKSwgV1RDKDB4MWExMDVjYTApLCBXVEMoMHgxYTRkYmFlMCksIFdUQygweDFhOGNkNjYwKSwKLVdUQygweDFhY2RhYTYwKSwgV1RDKDB4MWIxMDMyNjApLCBXVEMoMHgxYjU0Njk0MCksIFdUQygweDFiOWE0NjAwKSwgV1RDKDB4MWJlMWJiODApLCBXVEMoMHgxYzJhYmM2MCksIFdUQygweDFjNzUzYjgwKSwgV1RDKDB4MWNjMTM4NjApLAotV1RDKDB4MWQwZWJlMjApLCBXVEMoMHgxZDVkZDhjMCksIFdUQygweDFkYWU5NDgwKSwgV1RDKDB4MWUwMTAwNjApLCBXVEMoMHgxZTU1MmY0MCksIFdUQygweDFlYWIzM2UwKSwgV1RDKDB4MWYwMzIwNjApLCBXVEMoMHgxZjVjZmNlMCksCi1XVEMoMHgxZmI4YzY2MCksIFdUQygweDIwMTY3OWMwKSwgV1RDKDB4MjA3NjExYzApLCBXVEMoMHgyMGQ3NWYwMCksIFdUQygweDIxM2EwNjQwKSwgV1RDKDB4MjE5ZGFiODApLCBXVEMoMHgyMjAxZjQ4MCksIFdUQygweDIyNjZiYTgwKSwKLVdUQygweDIyY2MwYWMwKSwgV1RDKDB4MjMzMWY0YzApLCBXVEMoMHgyMzk4ODk0MCksIFdUQygweDIzZmZmZjQwKSwgV1RDKDB4MjQ2OGIzNDApLCBXVEMoMHgyNGQzMDMwMCksIFdUQygweDI1M2Y0OTAwKSwgV1RDKDB4MjVhZDg5ODApLAotV1RDKDB4MjYxZDcyYzApLCBXVEMoMHgyNjhlYWVjMCksIFdUQygweDI3MDBlODgwKSwgV1RDKDB4Mjc3M2RiNDApLCBXVEMoMHgyN2U3NTFjMCksIFdUQygweDI4NWIxNzgwKSwgV1RDKDB4MjhjZWZiYzApLCBXVEMoMHgyOTQzMWY4MCksCi1XVEMoMHgyOWI3ZjY4MCksIFdUQygweDJhMmRmNzgwKSwgV1RDKDB4MmFhNTk4ODApLCBXVEMoMHgyYjFmMzI4MCksIFdUQygweDJiOWIwMTQwKSwgV1RDKDB4MmMxOTQwMDApLCBXVEMoMHgyYzlhMjU0MCksIFdUQygweDJkMWQ4ZGMwKSwKLVdUQygweDJkYTJmYzQwKSwgV1RDKDB4MmUyOWVlODApLCBXVEMoMHgyZWIxZTM0MCksIFdUQygweDJmM2E0ZTQwKSwgV1RDKDB4MmZjMjk5ODApLCBXVEMoMHgzMDRhMmVjMCksIFdUQygweDMwZDA3Y2MwKSwgV1RDKDB4MzE1NTY2YzApLAotV1RDKDB4MzFkOTQ0ODApLCBXVEMoMHgzMjVjNzJjMCksIFdUQygweDMyZGY1MWMwKSwgV1RDKDB4MzM2MjhjODApLCBXVEMoMHgzM2U3MWEwMCksIFdUQygweDM0NmRmNDAwKSwgV1RDKDB4MzRmODBkYzApLCBXVEMoMHgzNTg1YzY0MCksCi1XVEMoMHgzNjE2ZTcwMCksIFdUQygweDM2YWIzMzgwKSwgV1RDKDB4Mzc0MjZhYzApLCBXVEMoMHgzN2RiZTg0MCksIFdUQygweDM4NzZhMzQwKSwgV1RDKDB4MzkxMThmNDApLCBXVEMoMHgzOWFiYTJjMCksIFdUQygweDNhNDQyMmMwKSwKLVdUQygweDNhZGFhMjAwKSwgV1RDKDB4M2I2ZWI2YzApLCBXVEMoMHgzYmZmZmQ4MCksIFdUQygweDNjOGU5MzgwKSwgV1RDKDB4M2QxYjE3ODApLCBXVEMoMHgzZGE2MmUwMCksIFdUQygweDNlMzA3YjAwKSwgV1RDKDB4M2ViYTk3YzApLAotV1RDKDB4M2Y0NTEyODApLCBXVEMoMHgzZmQwNzk0MCksIFdUQygweDQwNWQ1NzdmKSwgV1RDKDB4NDBlYmY1N2YpLCBXVEMoMHg0MTdjNTlmZiksIFdUQygweDQyMGU4OTdmKSwgV1RDKDB4NDJhMjg1N2YpLCBXVEMoMHg0MzM4MzA3ZiksCi1XVEMoMHg0M2NmNGQ3ZiksIFdUQygweDQ0Njc5Y2ZmKSwgV1RDKDB4NDUwMGRmZmYpLCBXVEMoMHg0NTlhYzJmZiksIFdUQygweDQ2MzRlMmZmKSwgV1RDKDB4NDZjZWQ5ZmYpLCBXVEMoMHg0NzY4NDM3ZiksIFdUQygweDQ4MDBkMjdmKSwKLVdUQygweDQ4OTg1MGZmKSwgV1RDKDB4NDkyZTg4ZmYpLCBXVEMoMHg0OWMzNDZmZiksIFdUQygweDRhNTY3OGZmKSwgV1RDKDB4NGFlODJmN2YpLCBXVEMoMHg0Yjc4N2M3ZiksIFdUQygweDRjMDc3MTdmKSwgV1RDKDB4NGM5NTMzN2YpLAotV1RDKDB4NGQyMWY3N2YpLCBXVEMoMHg0ZGFkZjNmZiksIFdUQygweDRlMzk1ZWZmKSwgV1RDKDB4NGVjNDY1N2YpLCBXVEMoMHg0ZjRmMjk3ZiksIFdUQygweDRmZDljZDdmKSwgV1RDKDB4NTA2NDczN2YpLCBXVEMoMHg1MGVmM2NmZiksCi1XVEMoMHg1MTdhNDZmZiksIFdUQygweDUyMDViMGZmKSwgV1RDKDB4NTI5MTk3ZmYpLCBXVEMoMHg1MzFlMDRmZiksIFdUQygweDUzYWFlYjdmKSwgV1RDKDB4NTQzODNlZmYpLCBXVEMoMHg1NGM1ZWY3ZiksIFdUQygweDU1NTNhOGZmKSwKLVdUQygweDU1ZTBkNTdmKSwgV1RDKDB4NTY2Y2RhN2YpLCBXVEMoMHg1NmY3MjBmZiksIFdUQygweDU3N2Y0YWZmKSwgV1RDKDB4NTgwNTM0ZmYpLCBXVEMoMHg1ODg4YmQ3ZiksIFdUQygweDU5MDljNmZmKSwgV1RDKDB4NTk4ODkwZmYpLAotV1RDKDB4NWEwNWI3ZmYpLCBXVEMoMHg1YTgxZGI3ZiksIFdUQygweDVhZmQ5OWZmKSwgV1RDKDB4NWI3OTRhN2YpLCBXVEMoMHg1YmY1MDA3ZiksIFdUQygweDVjNzBjYmZmKSwgV1RDKDB4NWNlY2JiN2YpLCBXVEMoMHg1ZDY4YzQ3ZiksCi1XVEMoMHg1ZGU0YzNmZiksIFdUQygweDVlNjA5NGZmKSwgV1RDKDB4NWVkYzEyN2YpLCBXVEMoMHg1ZjU2ZmRmZiksIFdUQygweDVmZDEwMTdmKSwgV1RDKDB4NjA0OWM2N2YpLCBXVEMoMHg2MGMwZjY3ZiksIFdUQygweDYxMzY1MGZmKSwKLVdUQygweDYxYTlhOWZmKSwgV1RDKDB4NjIxYWQ3N2YpLCBXVEMoMHg2Mjg5YjM3ZiksIFdUQygweDYyZjY3ZmZmKSwgV1RDKDB4NjM2MWU4N2YpLCBXVEMoMHg2M2NjOWJmZiksIFdUQygweDY0Mzc0NTdmKSwgV1RDKDB4NjRhMjI0N2YpLAotV1RDKDB4NjUwZDBjN2YpLCBXVEMoMHg2NTc3Y2M3ZiksIFdUQygweDY1ZTIzMjdmKSwgV1RDKDB4NjY0YmY1N2YpLCBXVEMoMHg2NmI0YjVmZiksIFdUQygweDY3MWMxMzdmKSwgV1RDKDB4Njc4MWFmZmYpLCBXVEMoMHg2N2U1NzlmZiksCi1XVEMoMHg2ODQ3YWJmZiksIFdUQygweDY4YTg4MmZmKSwgV1RDKDB4NjkwODNiZmYpLCBXVEMoMHg2OTY2ZmJmZiksIFdUQygweDY5YzRjZmZmKSwgV1RDKDB4NmEyMWM1N2YpLCBXVEMoMHg2YTdkZTg3ZiksIFdUQygweDZhZDkzNzdmKSwKLVdUQygweDZiMzNhNWZmKSwgV1RDKDB4NmI4ZDI1N2YpLCBXVEMoMHg2YmU1YThmZiksIFdUQygweDZjM2QyMGZmKSwgV1RDKDB4NmM5MzgwZmYpLCBXVEMoMHg2Y2U4YmE3ZiksIFdUQygweDZkM2NiZmZmKSwgV1RDKDB4NmQ4ZjgyN2YpLAotLyogcGFydCAyICovCi1XVEMoMHhhZDk4YjQ4MSksIFdUQygweGFlYWQ5ZDAxKSwgV1RDKDB4YWZiZmMzODEpLCBXVEMoMHhiMGNmNGQwMSksIFdUQygweGIxZGM1ZjgxKSwgV1RDKDB4YjJlNzIwODEpLCBXVEMoMHhiM2VmYjUwMSksIFdUQygweGI0ZjY0MzgxKSwKLVdUQygweGI1ZmFmMTAxKSwgV1RDKDB4YjZmZGU0MDEpLCBXVEMoMHhiN2ZmNDAwMSksIFdUQygweGI4ZmYxNjAxKSwgV1RDKDB4YjlmZDYxODEpLCBXVEMoMHhiYWZhMWQwMSksIFdUQygweGJiZjU0NDAxKSwgV1RDKDB4YmNlZWQxMDEpLAotV1RDKDB4YmRlNmMwODEpLCBXVEMoMHhiZWRkMGU4MSksIFdUQygweGJmZDFiNzAxKSwgV1RDKDB4YzBjNGI0NDApLCBXVEMoMHhjMWI1ZmZjMCksIFdUQygweGMyYTU5MzQwKSwgV1RDKDB4YzM5MzY3ODApLCBXVEMoMHhjNDdmNzhjMCksCi1XVEMoMHhjNTY5YzYwMCksIFdUQygweGM2NTI0ZDQwKSwgV1RDKDB4YzczOTBkYzApLCBXVEMoMHhjODFlMDRjMCksIFdUQygweGM5MDEyZTAwKSwgV1RDKDB4YzllMjg1NDApLCBXVEMoMHhjYWMyMDcwMCksIFdUQygweGNiOWZiMWMwKSwKLVdUQygweGNjN2I4NjQwKSwgV1RDKDB4Y2Q1NTg2MDApLCBXVEMoMHhjZTJkYjIwMCksIFdUQygweGNmMDQwOWMwKSwgV1RDKDB4Y2ZkODhhNDApLCBXVEMoMHhkMGFiMzA4MCksIFdUQygweGQxN2JmYTAwKSwgV1RDKDB4ZDI0YWU2NDApLAotV1RDKDB4ZDMxN2Y3YzApLCBXVEMoMHhkM2UzMzA4MCksIFdUQygweGQ0YWM5MzQwKSwgV1RDKDB4ZDU3NDFmNDApLCBXVEMoMHhkNjM5ZDJjMCksIFdUQygweGQ2ZmRhYjAwKSwgV1RDKDB4ZDdiZmE1YzApLCBXVEMoMHhkODdmYzMwMCksCi1XVEMoMHhkOTNlMDYwMCksIFdUQygweGQ5ZmE3MTgwKSwgV1RDKDB4ZGFiNTA5MDApLCBXVEMoMHhkYjZkY2NjMCksIFdUQygweGRjMjRiYTgwKSwgV1RDKDB4ZGNkOWQwMDApLCBXVEMoMHhkZDhkMGI4MCksIFdUQygweGRlM2U2ZGMwKSwKLVdUQygweGRlZWRmOWMwKSwgV1RDKDB4ZGY5YmIzNDApLCBXVEMoMHhlMDQ3OWUyMCksIFdUQygweGUwZjFiYWMwKSwgV1RDKDB4ZTE5YTA3ZTApLCBXVEMoMHhlMjQwODM4MCksIFdUQygweGUyZTUyYzAwKSwgV1RDKDB4ZTM4ODAyZTApLAotV1RDKDB4ZTQyOTBjMDApLCBXVEMoMHhlNGM4NGMyMCksIFdUQygweGU1NjVjNzYwKSwgV1RDKDB4ZTYwMTdmMjApLCBXVEMoMHhlNjliNzI0MCksIFdUQygweGU3MzM5ZjYwKSwgV1RDKDB4ZTdjYTA1MDApLCBXVEMoMHhlODVlYTQ4MCksCi1XVEMoMHhlOGYxODE4MCksIFdUQygweGU5ODI5ZmMwKSwgV1RDKDB4ZWExMjAyZTApLCBXVEMoMHhlYTlmYWI4MCksIFdUQygweGViMmI5NzAwKSwgV1RDKDB4ZWJiNWMyYTApLCBXVEMoMHhlYzNlMmJjMCksIFdUQygweGVjYzRkMzAwKSwKLVdUQygweGVkNDliYzgwKSwgV1RDKDB4ZWRjY2VjNjApLCBXVEMoMHhlZTRlNjZhMCksIFdUQygweGVlY2UyZDgwKSwgV1RDKDB4ZWY0YzQxZTApLCBXVEMoMHhlZmM4YTQ4MCksIFdUQygweGYwNDM1NjEwKSwgV1RDKDB4ZjBiYzVjNjApLAotV1RDKDB4ZjEzM2MyMzApLCBXVEMoMHhmMWE5OTI3MCksIFdUQygweGYyMWRkN2IwKSwgV1RDKDB4ZjI5MDk3ZTApLCBXVEMoMHhmMzAxZDNkMCksIFdUQygweGYzNzE4YzIwKSwgV1RDKDB4ZjNkZmMxODApLCBXVEMoMHhmNDRjNzEwMCksCi1XVEMoMHhmNGI3OTQ4MCksIFdUQygweGY1MjEyNWIwKSwgV1RDKDB4ZjU4OTFkZjApLCBXVEMoMHhmNWVmNmZlMCksIFdUQygweGY2NTQwNzMwKSwgV1RDKDB4ZjZiNmNmNTApLCBXVEMoMHhmNzE3YjQ5MCksIFdUQygweGY3NzZiOWEwKSwKLVdUQygweGY3ZDNmNzIwKSwgV1RDKDB4ZjgyZjg2ZTgpLCBXVEMoMHhmODg5ODI2MCksIFdUQygweGY4ZTFmYzUwKSwgV1RDKDB4ZjkzOTAwZjApLCBXVEMoMHhmOThlOWMyOCksIFdUQygweGY5ZTJkOTQwKSwgV1RDKDB4ZmEzNWI0YTApLAotV1RDKDB4ZmE4NzFiZDgpLCBXVEMoMHhmYWQ2ZmJkMCksIFdUQygweGZiMjU0MjUwKSwgV1RDKDB4ZmI3MWYwYzApLCBXVEMoMHhmYmJkMWMyOCksIFdUQygweGZjMDZkYTYwKSwgV1RDKDB4ZmM0ZjQwYTQpLCBXVEMoMHhmYzk2NTUwMCksCi1XVEMoMHhmY2RjMGU1YyksIFdUQygweGZkMjA2MmY0KSwgV1RDKDB4ZmQ2MzQ4ZDApLCBXVEMoMHhmZGE0YjFiOCksIFdUQygweGZkZTQ4YjJjKSwgV1RDKDB4ZmUyMmMyODApLCBXVEMoMHhmZTVmNDYyYSksIFdUQygweGZlOWExZjJlKSwKLVdUQygweGZlZDM3MTFjKSwgV1RDKDB4ZmYwYjYwYWMpLCBXVEMoMHhmZjQyMTJkZCksIFdUQygweGZmNzdiMzQ0KSwgV1RDKDB4ZmZhYzc0MDcpLCBXVEMoMHhmZmUwODc5NiksIFdUQygweDAwMTQxZTM3KSwgV1RDKDB4MDA0NzM2NjUpLAotV1RDKDB4MDA3OTljZDApLCBXVEMoMHgwMGFiMWJmZiksIFdUQygweDAwZGI3ZDhiKSwgV1RDKDB4MDEwYTc1ZWEpLCBXVEMoMHgwMTM3YTQ2ZSksIFdUQygweDAxNjJhNzdhKSwgV1RDKDB4MDE4YjIwYWMpLCBXVEMoMHgwMWIwZmI3YSksCi1XVEMoMHgwMWQ0NmQzYyksIFdUQygweDAxZjVhZTdjKSwgV1RDKDB4MDIxNGY5MWMpLCBXVEMoMHgwMjMyYTVjYyksIFdUQygweDAyNGYyYzA0KSwgV1RDKDB4MDI2YjA0OGMpLCBXVEMoMHgwMjg2YTYyOCksIFdUQygweDAyYTI1ODA4KSwKLVdUQygweDAyYmUzMWMwKSwgV1RDKDB4MDJkYTQ4ZTApLCBXVEMoMHgwMmY2YjA5YyksIFdUQygweDAzMTM0NWRjKSwgV1RDKDB4MDMyZmFmNTApLCBXVEMoMHgwMzRiOTE0OCksIFdUQygweDAzNjY5MGU4KSwgV1RDKDB4MDM4MDY1OGMpLAotV1RDKDB4MDM5OGQ4ZTQpLCBXVEMoMHgwM2FmYjU2OCksIFdUQygweDAzYzRjNmUwKSwgV1RDKDB4MDNkN2Y3NzApLCBXVEMoMHgwM2U5NGY5YyksIFdUQygweDAzZjhkOTM4KSwgV1RDKDB4MDQwNjllZTgpLCBXVEMoMHgwNDEyYmVmOCksCi1XVEMoMHgwNDFkNmIzMCksIFdUQygweDA0MjZkNjM4KSwgV1RDKDB4MDQyZjMyODgpLCBXVEMoMHgwNDM2YWQ5OCksIFdUQygweDA0M2Q2ZmQwKSwgV1RDKDB4MDQ0M2ExNzApLCBXVEMoMHgwNDQ5NmE0MCksIFdUQygweDA0NGVlNzI4KSwKLVdUQygweDA0NTQyYTQwKSwgV1RDKDB4MDQ1OTQ1MjApLCBXVEMoMHgwNDVlNDg5MCksIFdUQygweDA0NjMzMjEwKSwgV1RDKDB4MDQ2N2ViZTgpLCBXVEMoMHgwNDZjNWY4MCksIFdUQygweDA0NzA3NjMwKSwgV1RDKDB4MDQ3NDE3ZjApLAotV1RDKDB4MDQ3NzJiNTgpLCBXVEMoMHgwNDc5OTZlOCksIFdUQygweDA0N2I0MTQwKSwgV1RDKDB4MDQ3YzEyYTApLCBXVEMoMHgwNDdiZjUyMCksIFdUQygweDA0N2FkMmUwKSwgV1RDKDB4MDQ3ODk2OTApLCBXVEMoMHgwNDc1MzljOCksCi1XVEMoMHgwNDcwYzRiOCksIFdUQygweDA0NmI0MDU4KSwgV1RDKDB4MDQ2NGI2MDApLCBXVEMoMHgwNDVkM2EwOCksIFdUQygweDA0NTRlYmM4KSwgV1RDKDB4MDQ0YmViMDApLCBXVEMoMHgwNDQyNTc5OCksIFdUQygweDA0Mzg1M2IwKSwKLVdUQygweDA0MmUwMzk4KSwgV1RDKDB4MDQyMzhiZDgpLCBXVEMoMHgwNDE5MGY5OCksIFdUQygweDA0MGU5NjcwKSwgV1RDKDB4MDQwNDBjMTgpLCBXVEMoMHgwM2Y5NWIzMCksIFdUQygweDAzZWU2ZTIwKSwgV1RDKDB4MDNlMzJiNjQpLAotV1RDKDB4MDNkNzc1OTgpLCBXVEMoMHgwM2NiMmYyNCksIFdUQygweDAzYmUzYjE4KSwgV1RDKDB4MDNiMDhiMTgpLCBXVEMoMHgwM2EyMWY2NCksIFdUQygweDAzOTJmOGQ0KSwgV1RDKDB4MDM4MzE4ZTApLCBXVEMoMHgwMzcyOGU5NCksCi1XVEMoMHgwMzYxNzY5NCksIFdUQygweDAzNGZlZTE4KSwgV1RDKDB4MDMzZTExZjQpLCBXVEMoMHgwMzJiZjUzMCksIFdUQygweDAzMTlhMTE0KSwgV1RDKDB4MDMwNzFlODApLCBXVEMoMHgwMmY0NzVmNCksIFdUQygweDAyZTFhN2MwKSwKLVdUQygweDAyY2VhYzA0KSwgV1RDKDB4MDJiYjdhODQpLCBXVEMoMHgwMmE4MGFmMCksIFdUQygweDAyOTQ1MmIwKSwgV1RDKDB4MDI4MDQ0ZTApLCBXVEMoMHgwMjZiZDQ4OCksIFdUQygweDAyNTZmNTU4KSwgV1RDKDB4MDI0MWE5NDApLAotV1RDKDB4MDIyYzAwODQpLCBXVEMoMHgwMjE2MGMwOCksIFdUQygweDAxZmZkYzVhKSwgV1RDKDB4MDFlOTdhZDIpLCBXVEMoMHgwMWQyZTk4MiksIFdUQygweDAxYmMyYTJhKSwgV1RDKDB4MDFhNTNlOGMpLCBXVEMoMHgwMThlMjg2MCksCi1XVEMoMHgwMTc2ZTk0YyksIFdUQygweDAxNWY4MmZhKSwgV1RDKDB4MDE0N2Y3MGUpLCBXVEMoMHgwMTMwNDZjMiksIFdUQygweDAxMTg3MmU4KSwgV1RDKDB4MDEwMDdjNGEpLCBXVEMoMHgwMGU4NjNjZiksIFdUQygweDAwZDAyYzgxKSwKLVdUQygweDAwYjdkYjk0KSwgV1RDKDB4MDA5Zjc2NTEpLCBXVEMoMHgwMDg3MDIwNCksIFdUQygweDAwNmU4M2Y4KSwgV1RDKDB4MDA1NjAxNzYpLCBXVEMoMHgwMDNkN2ZjYiksIFdUQygweDAwMjUwNDNmKSwgV1RDKDB4MDAwYzk0MWYpLAotV1RDKDB4ZDY1NTc0YzApLCBXVEMoMHhkNWViYzEwMCksIFdUQygweGQ1ODJkMDgwKSwgV1RDKDB4ZDUxYTljYzApLCBXVEMoMHhkNGIzMWY4MCksIFdUQygweGQ0NGM1MjgwKSwgV1RDKDB4ZDNlNjJmODApLCBXVEMoMHhkMzgwYjA0MCksCi1XVEMoMHhkMzFiY2U0MCksIFdUQygweGQyYjc4MzgwKSwgV1RDKDB4ZDI1M2NhNDApLCBXVEMoMHhkMWYwYWNjMCksIFdUQygweGQxOGU0NTgwKSwgV1RDKDB4ZDEyY2FmNDApLCBXVEMoMHhkMGNjMDQwMCksIFdUQygweGQwNmM0MGMwKSwKLVdUQygweGQwMGQ0NzQwKSwgV1RDKDB4Y2ZhZWY2YzApLCBXVEMoMHhjZjUxMzE0MCksIFdUQygweGNlZjNmYTgwKSwgV1RDKDB4Y2U5NzdhNDApLCBXVEMoMHhjZTNiZDk4MCksIFdUQygweGNkZTEzZjQwKSwgV1RDKDB4Y2Q4N2E4ODApLAotV1RDKDB4Y2QyZWU4MDApLCBXVEMoMHhjY2Q2Y2YwMCksIFdUQygweGNjN2YyZjQwKSwgV1RDKDB4Y2MyN2U4ODApLCBXVEMoMHhjYmQwZWEwMCksIFdUQygweGNiN2EyMzgwKSwgV1RDKDB4Y2IyMzgzODApLCBXVEMoMHhjYWNjZWU4MCksCi1XVEMoMHhjYTc2M2VjMCksIFdUQygweGNhMWY0ZDAwKSwgV1RDKDB4YzljN2Y0ODApLCBXVEMoMHhjOTcwM2I0MCksIFdUQygweGM5MTg1MjAwKSwgV1RDKDB4YzhjMDZiMDApLCBXVEMoMHhjODY4YjRjMCksIFdUQygweGM4MTEwMGMwKSwKLVdUQygweGM3YjhjMjgwKSwgV1RDKDB4Yzc1ZjZhNDApLCBXVEMoMHhjNzA0NjkwMCksIFdUQygweGM2YTc0MzQwKSwgV1RDKDB4YzY0NzkzMDApLCBXVEMoMHhjNWU0ZjIwMCksIFdUQygweGM1N2VmYWMwKSwgV1RDKDB4YzUxNTQ4ODApLAotV1RDKDB4YzRhNzc3ODApLCBXVEMoMHhjNDM1MjQ0MCksIFdUQygweGMzYmRlYWMwKSwgV1RDKDB4YzM0MTY3NDApLCBXVEMoMHhjMmJmMzNjMCksIFdUQygweGMyMzZlYjQwKSwgV1RDKDB4YzFhODI5MDApLCBXVEMoMHhjMTEyOTBjMCksCi1XVEMoMHhjMDc1Y2YwMCksIFdUQygweGJmZDE5MDgxKSwgV1RDKDB4YmYyNTg0MDEpLCBXVEMoMHhiZTcxNmQ4MSksIFdUQygweGJkYjUyYjgxKSwgV1RDKDB4YmNmMDlhODEpLCBXVEMoMHhiYzIzYWY4MSksIFdUQygweGJiNTA1YzAxKSwKLVdUQygweGJhN2E5MDgxKSwgV1RDKDB4YjlhNjUyODEpLCBXVEMoMHhiOGQ3OTMwMSksIFdUQygweGI4MTA0YzAxKSwgV1RDKDB4Yjc1MDgxODEpLCBXVEMoMHhiNjk4MjIwMSksIFdUQygweGI1ZTcxYjAxKSwgV1RDKDB4YjUzZDViMDEpLAotV1RDKDB4YjQ5YWQwODEpLCBXVEMoMHhiM2ZmNjkwMSksIFdUQygweGIzNmIxMzAxKSwgV1RDKDB4YjJkZGJkMDEpLCBXVEMoMHhiMjU3NTQ4MSksIFdUQygweGIxZDdjODAxKSwgV1RDKDB4YjE1ZjA2MDEpLCBXVEMoMHhiMGVjZmMwMSksCi1XVEMoMHhiMDgxOTg4MSksIFdUQygweGIwMWNjYTAxKSwgV1RDKDB4YWZiZTdlMDEpLCBXVEMoMHhhZjY2YTMwMSksIFdUQygweGFmMTUyNzAxKSwgV1RDKDB4YWVjOWY4ODEpLCBXVEMoMHhhZTg1MDYwMSksIFdUQygweGFlNDYzYzgxKSwKLVdUQygweGFlMGQ4YjAxKSwgV1RDKDB4YWRkYWUwMDEpLCBXVEMoMHhhZGFlMjg4MSksIFdUQygweGFkODc1MzgxKSwgV1RDKDB4YWQ2NjRmODEpLCBXVEMoMHhhZDRiMDk4MSksIFdUQygweGFkMzU3MDgxKSwgV1RDKDB4YWQyNTczMDEpLAotV1RDKDB4YWQxYWZlMDEpLCBXVEMoMHhhZDE2MDA4MSksIFdUQygweGFkMTY2OTAxKSwgV1RDKDB4YWQxYzI0ODEpLCBXVEMoMHhhZDI3MjIwMSksIFdUQygweGFkMzc0ZjgxKSwgV1RDKDB4YWQ0YzliMDEpLCBXVEMoMHhhZDY2ZjM4MSksCi1XVEMoMHhhZDg2NDYwMSksIFdUQygweGFkYWE4MTAxKSwgV1RDKDB4YWRkMzkzMDEpLCBXVEMoMHhhZTAxNmEwMSksIFdUQygweGFlMzNmNDgxKSwgV1RDKDB4YWU2YjIwMDEpLCBXVEMoMHhhZWE2ZGIwMSksIFdUQygweGFlZTcxMzgxKSwKLVdUQygweGFmMmJiODAxKSwgV1RDKDB4YWY3NGI2ODEpLCBXVEMoMHhhZmMxZmQwMSksIFdUQygweGIwMTM3YTAxKSwgV1RDKDB4YjA2OTFiODEpLCBXVEMoMHhiMGMyY2Y4MSksIFdUQygweGIxMjA4NDgxKSwgV1RDKDB4YjE4MjI4ODEpLAotV1RDKDB4YjFlN2E5ODEpLCBXVEMoMHhiMjUwZjYwMSksIFdUQygweGIyYmRmYzAxKSwgV1RDKDB4YjMyZWFhMDEpLCBXVEMoMHhiM2EyZWQwMSksIFdUQygweGI0MWFiNDgxKSwgV1RDKDB4YjQ5NWVlMDEpLCBXVEMoMHhiNTE0ODgwMSksCi1XVEMoMHhiNTk2NzA4MSksIFdUQygweGI2MWI5NTgxKSwgV1RDKDB4YjZhM2U1ODEpLCBXVEMoMHhiNzJmNGUwMSksIFdUQygweGI3YmRiZTAxKSwgV1RDKDB4Yjg0ZjIzODEpLCBXVEMoMHhiOGUzNmM4MSksIFdUQygweGI5N2E4NzAxKSwKLVdUQygweGJhMTQ2MTAxKSwgV1RDKDB4YmFiMGU5ODEpLCBXVEMoMHhiYjUwMGQ4MSksIFdUQygweGJiZjFiYzgxKSwgV1RDKDB4YmM5NWUzODEpLCBXVEMoMHhiZDNjNzE4MSksIFdUQygweGJkZTU1NDgxKSwgV1RDKDB4YmU5MDdhMDEpLAotV1RDKDB4YmYzZGQxMDEpLCBXVEMoMHhiZmVkNDcwMSksIFdUQygweGMwOWVjYWMwKSwgV1RDKDB4YzE1MjRhMDApLCBXVEMoMHhjMjA3YjMwMCksIFdUQygweGMyYmVmNDQwKSwgV1RDKDB4YzM3N2ZiODApLCBXVEMoMHhjNDMyYjcwMCksCi1XVEMoMHhjNGVmMTUwMCksIFdUQygweGM1YWQwM2MwKSwgV1RDKDB4YzY2YzcxNDApLCBXVEMoMHhjNzJkNGJjMCksIFdUQygweGM3ZWY4MTgwKSwgV1RDKDB4YzhiMzAwODApLCBXVEMoMHhjOTc3YjcwMCksIFdUQygweGNhM2Q5MzQwKSwKLVdUQygweGNiMDQ4MzQwKSwgV1RDKDB4Y2JjYzc1NDApLCBXVEMoMHhjYzk1NTc0MCksIFdUQygweGNkNWYxN2MwKSwgV1RDKDB4Y2UyOWE0ODApLCBXVEMoMHhjZWY0ZWMwMCksIFdUQygweGNmYzBkYzgwKSwgV1RDKDB4ZDA4ZDYzYzApLAotV1RDKDB4ZDE1YTcwNDApLCBXVEMoMHhkMjI3ZjAwMCksIFdUQygweGQyZjVkMTQwKSwgV1RDKDB4ZDNjNDAyNDApLCBXVEMoMHhkNDkyNzEwMCksIFdUQygweGQ1NjEwYjgwKSwgV1RDKDB4ZDYyZmMwODApLCBXVEMoMHhkNmZlN2RjMCksCi1XVEMoMHhkN2NkMzE0MCksIFdUQygweGQ4OWJjOTgwKSwgV1RDKDB4ZDk2YTM0YzApLCBXVEMoMHhkYTM4NjBjMCksIFdUQygweGRiMDYzYzAwKSwgV1RDKDB4ZGJkM2I0ODApLCBXVEMoMHhkY2EwYjg4MCksIFdUQygweGRkNmQzNjQwKSwKLVdUQygweGRlMzkxYmMwKSwgV1RDKDB4ZGYwNDU3NDApLCBXVEMoMHhkZmNlZDZjMCksIFdUQygweGUwOTg4OGMwKSwgV1RDKDB4ZTE2MTViMjApLCBXVEMoMHhlMjI5M2MyMCksIFdUQygweGUyZjAxYTAwKSwgV1RDKDB4ZTNiNWUyYzApLAotV1RDKDB4ZTQ3YTg0YzApLCBXVEMoMHhlNTNkZWUwMCksIFdUQygweGU2MDAwY2MwKSwgV1RDKDB4ZTZjMGNmMjApLCBXVEMoMHhlNzgwMjM2MCksIFdUQygweGU4M2RmN2EwKSwgV1RDKDB4ZThmYTM5ZTApLCBXVEMoMHhlOWI0ZDg4MCksCi1XVEMoMHhlYTZkYzFhMCksIFdUQygweGViMjRlMzYwKSwgV1RDKDB4ZWJkYTJiZTApLCBXVEMoMHhlYzhkODk2MCksIFdUQygweGVkM2VlYTIwKSwgV1RDKDB4ZWRlZTNjMDApLCBXVEMoMHhlZTliNmQ4MCksIFdUQygweGVmNDY2Y2EwKSwKLVdUQygweGVmZWYyNzgwKSwgV1RDKDB4ZjA5NThjNTApLCBXVEMoMHhmMTM5ODk1MCksIFdUQygweGYxZGIwY2EwKSwgV1RDKDB4ZjI3YTA0NzApLCBXVEMoMHhmMzE2NWVkMCksIFdUQygweGYzYjAwYTEwKSwgV1RDKDB4ZjQ0NmY0NDApLAotV1RDKDB4ZjRkYjBiOTApLCBXVEMoMHhmNTZjM2UzMCksIFdUQygweGY1ZmE3YTUwKSwgV1RDKDB4ZjY4NWFlMTApLCBXVEMoMHhmNzBkYzdhMCksIFdUQygweGY3OTJiNTIwKSwgV1RDKDB4ZjgxNDY0YzgpLCBXVEMoMHhmODkyYzRjMCksCi1XVEMoMHhmOTBkYzMzMCksIFdUQygweGY5ODU0ZTQwKSwgV1RDKDB4ZjlmOTU0MTgpLCBXVEMoMHhmYTY5YzJmMCksIFdUQygweGZhZDY4OGU4KSwgV1RDKDB4ZmIzZjk0MjgpLCBXVEMoMHhmYmE0ZDJlOCksIFdUQygweGZjMDYzMzQ0KSwKLVdUQygweGZjNjNhMzcwKSwgV1RDKDB4ZmNiZDExOTQpLCBXVEMoMHhmZDEyNmJkYyksIFdUQygweGZkNjNhMDZjKSwgV1RDKDB4ZmRiMDlkNzgpLCBXVEMoMHhmZGY5NTEyNCksIFdUQygweGZlM2RhOTllKSwgV1RDKDB4ZmU3ZDk1MGUpLAotV1RDKDB4ZmViOTAxYTIpLCBXVEMoMHhmZWVmZGQ4MCksIFdUQygweGZmMjIxNmQ3KSwgV1RDKDB4ZmY0ZjliY2YpLCBXVEMoMHhmZjc4NWE5MyksIFdUQygweGZmOWM0MTRlKSwgV1RDKDB4ZmZiYjNlMmIpLCBXVEMoMHhmZmQ1M2Y1NCksCi1XVEMoMHhmZmVhMzJmNCksIFdUQygweGZmZmEwNzM1KSwgV1RDKDB4MDAwNGFhNDMpLCBXVEMoMHgwMDBhMGE0NyksIFdUQygweDAwMGExNTZjKSwgV1RDKDB4MDAwNGI5ZGUpLCBXVEMoMHhmZmY5ZTVjNSksIFdUQygweGZmZTk4NzRlKQotfTsKLQorICAgIC8qIHBhcnQgMCAqLworICAgIFdUQygweGRhYzk4NGMwKSwgV1RDKDB4ZGIxMDAwODApLCBXVEMoMHhkYjU2Y2QwMCksIFdUQygweGRiOWRlYzQwKSwKKyAgICBXVEMoMHhkYmU1NWZjMCksIFdUQygweGRjMmQyODgwKSwgV1RDKDB4ZGM3NTQ3ODApLCBXVEMoMHhkY2JkYmQ4MCksCisgICAgV1RDKDB4ZGQwNjhhODApLCBXVEMoMHhkZDRmYWU4MCksIFdUQygweGRkOTkyOTQwKSwgV1RDKDB4ZGRlMmY5YzApLAorICAgIFdUQygweGRlMmQxZmMwKSwgV1RDKDB4ZGU3NzlhODApLCBXVEMoMHhkZWMyNmEwMCksIFdUQygweGRmMGQ4ZTAwKSwKKyAgICBXVEMoMHhkZjU5MDY4MCksIFdUQygweGRmYTRkNTQwKSwgV1RDKDB4ZGZmMGZjODApLCBXVEMoMHhlMDNkN2UyMCksCisgICAgV1RDKDB4ZTA4YTU5MDApLCBXVEMoMHhlMGQ3OGEyMCksIFdUQygweGUxMjUwY2MwKSwgV1RDKDB4ZTE3MmRjYzApLAorICAgIFdUQygweGUxYzBmN2EwKSwgV1RDKDB4ZTIwZjU5YTApLCBXVEMoMHhlMjVkZmVhMCksIFdUQygweGUyYWNlNDAwKSwKKyAgICBXVEMoMHhlMmZjMGJlMCksIFdUQygweGUzNGI3YmMwKSwgV1RDKDB4ZTM5YjNjODApLCBXVEMoMHhlM2ViNTI2MCksCisgICAgV1RDKDB4ZTQzYmJhYzApLCBXVEMoMHhlNDhjNzE2MCksIFdUQygweGU0ZGQ3MTQwKSwgV1RDKDB4ZTUyZWI2MDApLAorICAgIFdUQygweGU1ODAzYzAwKSwgV1RDKDB4ZTVkMWZkYTApLCBXVEMoMHhlNjIzZjM2MCksIFdUQygweGU2NzYxNzAwKSwKKyAgICBXVEMoMHhlNmM4NjQwMCksIFdUQygweGU3MWFkNTAwKSwgV1RDKDB4ZTc2ZDYzZTApLCBXVEMoMHhlN2MwMGJhMCksCisgICAgV1RDKDB4ZTgxMmM4ZTApLCBXVEMoMHhlODY1OThlMCksIFdUQygweGU4Yjg3OGUwKSwgV1RDKDB4ZTkwYjY4YTApLAorICAgIFdUQygweGU5NWU2YzQwKSwgV1RDKDB4ZTliMThhZTApLCBXVEMoMHhlYTA0Y2U4MCksIFdUQygweGVhNTgzYmEwKSwKKyAgICBXVEMoMHhlYWFiY2RhMCksIFdUQygweGVhZmY3ZWUwKSwgV1RDKDB4ZWI1MzQ4ZTApLCBXVEMoMHhlYmE3MjJjMCksCisgICAgV1RDKDB4ZWJmYjAwNjApLCBXVEMoMHhlYzRlZDI0MCksIFdUQygweGVjYTI4NTQwKSwgV1RDKDB4ZWNmNjBjMjApLAorICAgIFdUQygweGVkNDk2MTIwKSwgV1RDKDB4ZWQ5YzdlODApLCBXVEMoMHhlZGVmNWU0MCksIFdUQygweGVlNDFmYzAwKSwKKyAgICBXVEMoMHhlZTk0NTYwMCksIFdUQygweGVlZTY2YWMwKSwgV1RDKDB4ZWYzODM5YTApLCBXVEMoMHhlZjg5YzBlMCksCisgICAgV1RDKDB4ZWZkYWZkYTApLCBXVEMoMHhmMDJiZWQ2MCksIFdUQygweGYwN2M4ZTgwKSwgV1RDKDB4ZjBjY2UwMDApLAorICAgIFdUQygweGYxMWNlMjIwKSwgV1RDKDB4ZjE2Yzk2MjApLCBXVEMoMHhmMWJiZmUzMCksIFdUQygweGYyMGIxOWUwKSwKKyAgICBXVEMoMHhmMjU5ZTVhMCksIFdUQygweGYyYTg1ZGMwKSwgV1RDKDB4ZjJmNjdlZDApLCBXVEMoMHhmMzQ0NDViMCksCisgICAgV1RDKDB4ZjM5MWFlZDApLCBXVEMoMHhmM2RlYjU5MCksIFdUQygweGY0MmI1M2UwKSwgV1RDKDB4ZjQ3NzgxNDApLAorICAgIFdUQygweGY0YzMzMTkwKSwgV1RDKDB4ZjUwZTU2NjApLCBXVEMoMHhmNTU4ZGYzMCksIFdUQygweGY1YTJiZTUwKSwKKyAgICBXVEMoMHhmNWViZWExMCksIFdUQygweGY2MzQ1NzgwKSwgV1RDKDB4ZjY3YmZhYjApLCBXVEMoMHhmNmMyY2VlMCksCisgICAgV1RDKDB4ZjcwOGQ3YjApLCBXVEMoMHhmNzRlMTljMCksIFdUQygweGY3OTI5YTcwKSwgV1RDKDB4ZjdkNjY2MzApLAorICAgIFdUQygweGY4MTk5MjY4KSwgV1RDKDB4Zjg1YzM4NjApLCBXVEMoMHhmODllNzQ4MCksIFdUQygweGY4ZTA1OGMwKSwKKyAgICBXVEMoMHhmOTIxZWMwOCksIFdUQygweGY5NjMzODAwKSwgV1RDKDB4ZjlhNDQ5ODApLCBXVEMoMHhmOWU1MzE1OCksCisgICAgV1RDKDB4ZmEyNjAxNTgpLCBXVEMoMHhmYTY2Y2ExOCksIFdUQygweGZhYTc5YWMwKSwgV1RDKDB4ZmFlODc5MjApLAorICAgIFdUQygweGZiMjk1ZmEwKSwgV1RDKDB4ZmI2YTQyYjgpLCBXVEMoMHhmYmFiMTI0MCksIFdUQygweGZiZWJkMWMwKSwKKyAgICBXVEMoMHhmYzJjOWMyNCksIFdUQygweGZjNmQ4ZDkwKSwgV1RDKDB4ZmNhZWMyNDApLCBXVEMoMHhmY2YwNTY4NCksCisgICAgV1RDKDB4ZmQzMjZhOTgpLCBXVEMoMHhmZDc1MjU0YyksIFdUQygweGZkYjhhZmQ0KSwgV1RDKDB4ZmRmY2NkZmMpLAorICAgIFdUQygweGZlNDBkNjk0KSwgV1RDKDB4ZmU4NDE2MWMpLCBXVEMoMHhmZWM1Y2Y1YSksIFdUQygweGZmMDRlN2ZjKSwKKyAgICBXVEMoMHhmZjNmZGZlMyksIFdUQygweGZmNzUxZGRmKSwgV1RDKDB4ZmZhMmZiMGYpLCBXVEMoMHhmZmM4N2M0MiksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHhiZmZiNjA4MSksIFdUQygweGJmZjIyZjgxKSwgV1RDKDB4YmZlOGZjMDEpLCBXVEMoMHhiZmRmYzc4MSksCisgICAgV1RDKDB4YmZkNjkxMDEpLCBXVEMoMHhiZmNkNWEwMSksIFdUQygweGJmYzQyMjAxKSwgV1RDKDB4YmZiYWU5ODEpLAorICAgIFdUQygweGJmYjFiMTAxKSwgV1RDKDB4YmZhODc5MDEpLCBXVEMoMHhiZjlmNDE4MSksIFdUQygweGJmOTYwYjAxKSwKKyAgICBXVEMoMHhiZjhjZDQ4MSksIFdUQygweGJmODM5ZDgxKSwgV1RDKDB4YmY3YTY2ODEpLCBXVEMoMHhiZjcxMmYwMSksCisgICAgV1RDKDB4YmY2N2Y4MDEpLCBXVEMoMHhiZjVlYzEwMSksIFdUQygweGJmNTU4YjAxKSwgV1RDKDB4YmY0YzU2ODEpLAorICAgIFdUQygweGJmNDMyMjgxKSwgV1RDKDB4YmYzOWVlODEpLCBXVEMoMHhiZjMwYmIwMSksIFdUQygweGJmMjc4ODAxKSwKKyAgICBXVEMoMHhiZjFlNTUwMSksIFdUQygweGJmMTUyMzgxKSwgV1RDKDB4YmYwYmYzODEpLCBXVEMoMHhiZjAyYzU4MSksCisgICAgV1RDKDB4YmVmOTk5MDEpLCBXVEMoMHhiZWYwNmQwMSksIFdUQygweGJlZTc0MjgxKSwgV1RDKDB4YmVkZTE5MDEpLAorICAgIFdUQygweGJlZDRmMDgxKSwgV1RDKDB4YmVjYmNhODEpLCBXVEMoMHhiZWMyYTc4MSksIFdUQygweGJlYjk4NjgxKSwKKyAgICBXVEMoMHhiZWIwNjg4MSksIFdUQygweGJlYTc0YzgxKSwgV1RDKDB4YmU5ZTMyODEpLCBXVEMoMHhiZTk1MWE4MSksCisgICAgV1RDKDB4YmU4YzA1MDEpLCBXVEMoMHhiZTgyZjMwMSksIFdUQygweGJlNzllNDgxKSwgV1RDKDB4YmU3MGRhMDEpLAorICAgIFdUQygweGJlNjdkMzgxKSwgV1RDKDB4YmU1ZWQwODEpLCBXVEMoMHhiZTU1ZDAwMSksIFdUQygweGJlNGNkMzgxKSwKKyAgICBXVEMoMHhiZTQzZGE4MSksIFdUQygweGJlM2FlNjAxKSwgV1RDKDB4YmUzMWY3MDEpLCBXVEMoMHhiZTI5MGQwMSksCisgICAgV1RDKDB4YmUyMDI4MDEpLCBXVEMoMHhiZTE3NDc4MSksIFdUQygweGJlMGU2YzAxKSwgV1RDKDB4YmUwNTk0ODEpLAorICAgIFdUQygweGJkZmNjMzAxKSwgV1RDKDB4YmRmM2Y3MDEpLCBXVEMoMHhiZGViMzEwMSksIFdUQygweGJkZTI3MjAxKSwKKyAgICBXVEMoMHhiZGQ5Yjk4MSksIFdUQygweGJkZDEwNjgxKSwgV1RDKDB4YmRjODU5ODEpLCBXVEMoMHhiZGJmYjI4MSksCisgICAgV1RDKDB4YmRiNzEyMDEpLCBXVEMoMHhiZGFlNzg4MSksIFdUQygweGJkYTVlNjAxKSwgV1RDKDB4YmQ5ZDViODEpLAorICAgIFdUQygweGJkOTRkODAxKSwgV1RDKDB4YmQ4YzVjMDEpLCBXVEMoMHhiZDgzZTY4MSksIFdUQygweGJkN2I3NzgxKSwKKyAgICBXVEMoMHhiZDczMTA4MSksIFdUQygweGJkNmFiMTAxKSwgV1RDKDB4YmQ2MjU5ODEpLCBXVEMoMHhiZDVhMGIwMSksCisgICAgV1RDKDB4YmQ1MWM0ODEpLCBXVEMoMHhiZDQ5ODYwMSksIFdUQygweGJkNDE0ZjAxKSwgV1RDKDB4YmQzOTFmODEpLAorICAgIFdUQygweGJkMzBmODgxKSwgV1RDKDB4YmQyOGQ5ODEpLCBXVEMoMHhiZDIwYzQwMSksIFdUQygweGJkMThiNzgxKSwKKyAgICBXVEMoMHhiZDEwYjM4MSksIFdUQygweGJkMDhiNzgxKSwgV1RDKDB4YmQwMGMzODEpLCBXVEMoMHhiY2Y4ZDc4MSksCisgICAgV1RDKDB4YmNmMGYzODEpLCBXVEMoMHhiY2U5MTgwMSksIFdUQygweGJjZTE0NjAxKSwgV1RDKDB4YmNkOTdjODEpLAorICAgIFdUQygweGJjZDFiYjgxKSwgV1RDKDB4YmNjYTAzMDEpLCBXVEMoMHhiY2MyNTE4MSksIFdUQygweGJjYmFhODAxKSwKKyAgICBXVEMoMHhiY2IzMDYwMSksIFdUQygweGJjYWI2YzAxKSwgV1RDKDB4YmNhM2RiMDEpLCBXVEMoMHhiYzljNTI4MSksCisgICAgV1RDKDB4YmM5NGQyMDEpLCBXVEMoMHhiYzhkNTkwMSksIFdUQygweGJjODVlODAxKSwgV1RDKDB4YmM3ZTdlMDEpLAorICAgIFdUQygweGJjNzcxYzAxKSwgV1RDKDB4YmM2ZmMxMDEpLCBXVEMoMHhiYzY4NmUwMSksIFdUQygweGJjNjEyMzAxKSwKKyAgICBXVEMoMHhiYzU5ZGY4MSksIFdUQygweGJjNTJhMzgxKSwgV1RDKDB4YmM0YjZlODEpLCBXVEMoMHhiYzQ0NDA4MSksCisgICAgV1RDKDB4YmMzZDE4MDEpLCBXVEMoMHhiYzM1ZjUwMSksIFdUQygweGJjMmVkNjgxKSwgV1RDKDB4YmMyN2JkODEpLAorICAgIFdUQygweGJjMjBhZTAxKSwgV1RDKDB4YmMxOWFiMDEpLCBXVEMoMHhiYzEyYjgwMSksIFdUQygweGJjMGJjZjgxKSwKKyAgICBXVEMoMHhiYzA0ZTM4MSksIFdUQygweGJiZmRlNDgxKSwgV1RDKDB4YmJmNmM2MDEpLCBXVEMoMHhiYmVmOWI4MSksCisgICAgV1RDKDB4YmJlODk5MDEpLCBXVEMoMHhiYmUxZjQwMSksIFdUQygweGJiZGJlMjAxKSwgV1RDKDB4YmJkNjhjODEpLAorICAgIFdUQygweGJiZDIxMjgxKSwgV1RDKDB4YmJjZTkxODEpLCBXVEMoMHhiYmNjMjY4MSksIFdUQygweGJiY2FjYTAxKSwKKyAgICBXVEMoMHhiYmNhNTA4MSksIFdUQygweGJiY2E4ZDAxKSwgV1RDKDB4YmJjYjUzMDEpLCBXVEMoMHhiYmNjODIwMSksCisgICAgV1RDKDB4YmJjZTA2MDEpLCBXVEMoMHhiYmNmY2E4MSksIFdUQygweGJiZDFiZDgxKSwgV1RDKDB4YmJkM2UxMDEpLAorICAgIFdUQygweGJiZDY0ZDAxKSwgV1RDKDB4YmJkOTFiODEpLCBXVEMoMHhiYmRjNjQ4MSksIFdUQygweGJiZTAzODAxKSwKKyAgICBXVEMoMHhiYmU0OWQwMSksIFdUQygweGJiZTk5OTgxKSwgV1RDKDB4YmJlZjMzMDEpLCBXVEMoMHhiYmY1NjE4MSksCisgICAgV1RDKDB4YmJmYzBmODEpLCBXVEMoMHhiYzAzMjYwMSksIFdUQygweGJjMGE4ZjAxKSwgV1RDKDB4YmMxMjNiODEpLAorICAgIFdUQygweGJjMWEyNDAxKSwgV1RDKDB4YmMyMjQxODEpLCBXVEMoMHhiYzJhOGM4MSksIFdUQygweGJjMzMwNzgxKSwKKyAgICBXVEMoMHhiYzNiYmMwMSksIFdUQygweGJjNDRiNDgxKSwgV1RDKDB4YmM0ZGZiODEpLCBXVEMoMHhiYzU3YTMwMSksCisgICAgV1RDKDB4YmM2MWM0MDEpLCBXVEMoMHhiYzZjNzc4MSksIFdUQygweGJjNzdkNjAxKSwgV1RDKDB4YmM4M2YyMDEpLAorICAgIFdUQygweGJjOTBkNDgxKSwgV1RDKDB4YmM5ZTg4MDEpLCBXVEMoMHhiY2FkMTUwMSksIFdUQygweGJjYmM3ZTAxKSwKKyAgICBXVEMoMHhiY2NjYmQwMSksIFdUQygweGJjZGRjYzgxKSwgV1RDKDB4YmNlZmE2MDEpLCBXVEMoMHhiZDAyM2YwMSksCisgICAgV1RDKDB4YmQxNTg4MDEpLCBXVEMoMHhiZDI5NzE4MSksIFdUQygweGJkM2RlYjgxKSwgV1RDKDB4YmQ1MmViMDEpLAorICAgIFdUQygweGJkNjg2NjgxKSwgV1RDKDB4YmQ3ZTU1ODEpLCBXVEMoMHhiZDk0YjAwMSksIFdUQygweGJkYWI3MTgxKSwKKyAgICBXVEMoMHhiZGMyOWE4MSksIFdUQygweGJkZGEyYTAxKSwgV1RDKDB4YmRmMjIxODEpLCBXVEMoMHhiZTBhODU4MSksCisgICAgV1RDKDB4YmUyMzYwMDEpLCBXVEMoMHhiZTNjYmMwMSksIFdUQygweGJlNTZhMzgxKSwgV1RDKDB4YmU3MTIwMDEpLAorICAgIFdUQygweGJlOGMzNzgxKSwgV1RDKDB4YmVhN2YzMDEpLCBXVEMoMHhiZWM0NTg4MSksIFdUQygweGJlZTE3MjAxKSwKKyAgICBXVEMoMHhiZWZmNDgwMSksIFdUQygweGJmMWRlNjAxKSwgV1RDKDB4YmYzZDU1MDEpLCBXVEMoMHhiZjVkOWE4MSksCisgICAgV1RDKDB4YmY3ZWI1ODEpLCBXVEMoMHhiZmEwYTU4MSksIFdUQygweGJmYzM2YTAxKSwgV1RDKDB4YmZlNmVkMDEpLAorICAgIFdUQygweGMwMGIwNGMwKSwgV1RDKDB4YzAyZjg2YzApLCBXVEMoMHhjMDU0NDk0MCksIFdUQygweGMwNzkyZWMwKSwKKyAgICBXVEMoMHhjMDllMjY0MCksIFdUQygweGMwYzMxZjAwKSwgV1RDKDB4YzBlODBhMDApLCBXVEMoMHhjMTBjZjQ4MCksCisgICAgV1RDKDB4YzEzMjA5NDApLCBXVEMoMHhjMTU3NzNjMCksIFdUQygweGMxN2Q1ZjAwKSwgV1RDKDB4YzFhM2UzNDApLAorICAgIFdUQygweGMxY2IwNWMwKSwgV1RDKDB4YzFmMmNiYzApLCBXVEMoMHhjMjFiMzk0MCksIFdUQygweGMyNDQ0YjAwKSwKKyAgICBXVEMoMHhjMjZkZjVjMCksIFdUQygweGMyOTgyZDgwKSwgV1RDKDB4YzJjMmU2NDApLCBXVEMoMHhjMmVlMGEwMCksCisgICAgV1RDKDB4YzMxOTc5NDApLCBXVEMoMHhjMzQ1MTNjMCksIFdUQygweGMzNzBiOWMwKSwgV1RDKDB4YzM5YzRmMDApLAorICAgIFdUQygweGMzYzdiYzAwKSwgV1RDKDB4YzNmMmU5NDApLCBXVEMoMHhjNDFkYzE0MCksIFdUQygweGM0NDg1NmMwKSwKKyAgICBXVEMoMHhjNDcyZTY0MCksIFdUQygweGM0OWRhZDgwKSwgV1RDKDB4YzRjOGU4ODApLCBXVEMoMHhjNGY0YWNjMCksCisgICAgV1RDKDB4YzUyMGU4NDApLCBXVEMoMHhjNTRkODc4MCksIFdUQygweGM1N2E3NmMwKSwgV1RDKDB4YzVhNzk2NDApLAorICAgIFdUQygweGM1ZDRiYWMwKSwgV1RDKDB4YzYwMWI4ODApLCBXVEMoMHhjNjJlNjU4MCksIFdUQygweGM2NWFiNjAwKSwKKyAgICBXVEMoMHhjNjg2YmQ0MCksIFdUQygweGM2YjI4ZmMwKSwgV1RDKDB4YzZkZTQxYzApLCBXVEMoMHhjNzA5ZGU0MCksCisgICAgV1RDKDB4YzczNTY2NDApLCBXVEMoMHhjNzYwZGE4MCksIFdUQygweGM3OGMzYzQwKSwgV1RDKDB4YzdiNzg2NDApLAorICAgIFdUQygweGM3ZTJhZmMwKSwgV1RDKDB4YzgwZGFlODApLCBXVEMoMHhjODM4NzhjMCksIFdUQygweGM4NjMwNGMwKSwKKyAgICBXVEMoMHhjODhkNDkwMCksIFdUQygweGM4YjczYjgwKSwgV1RDKDB4YzhlMGQyODApLCBXVEMoMHhjOTBhMDQ0MCksCisgICAgLyogcGFydCAxICovCisgICAgV1RDKDB4YjUyMTJlODEpLCBXVEMoMHhiNDk1OTUwMSksIFdUQygweGI0MGFiNTAxKSwgV1RDKDB4YjM4MDhkODEpLAorICAgIFdUQygweGIyZjcxZjAxKSwgV1RDKDB4YjI2ZTY4ODEpLCBXVEMoMHhiMWU2NmEwMSksIFdUQygweGIxNWYyMzgxKSwKKyAgICBXVEMoMHhiMGQ4OTQwMSksIFdUQygweGIwNTJiYzAxKSwgV1RDKDB4YWZjZDlhODEpLCBXVEMoMHhhZjQ5MmYwMSksCisgICAgV1RDKDB4YWVjNTc4MDEpLCBXVEMoMHhhZTQyNzQ4MSksIFdUQygweGFkYzAyMjgxKSwgV1RDKDB4YWQzZTgxMDEpLAorICAgIFdUQygweGFjYmQ5MDgxKSwgV1RDKDB4YWMzZDUwMDEpLCBXVEMoMHhhYmJkYzAwMSksIFdUQygweGFiM2VkZjAxKSwKKyAgICBXVEMoMHhhYWMwYWQwMSksIFdUQygweGFhNDMyOTgxKSwgV1RDKDB4YTljNjU0MDEpLCBXVEMoMHhhOTRhMmMwMSksCisgICAgV1RDKDB4YThjZWIyMDEpLCBXVEMoMHhhODUzZTUwMSksIFdUQygweGE3ZDljNjgxKSwgV1RDKDB4YTc2MDU2MDEpLAorICAgIFdUQygweGE2ZTc5NDAxKSwgV1RDKDB4YTY2ZjgyMDEpLCBXVEMoMHhhNWY4MWY4MSksIFdUQygweGE1ODE2ZTgxKSwKKyAgICBXVEMoMHhhNTBiNmU4MSksIFdUQygweGE0OTYyMTgxKSwgV1RDKDB4YTQyMTg4MDEpLCBXVEMoMHhhM2FkYTI4MSksCisgICAgV1RDKDB4YTMzYTcyMDEpLCBXVEMoMHhhMmM3ZjgwMSksIFdUQygweGEyNTYzNTAxKSwgV1RDKDB4YTFlNTJhODEpLAorICAgIFdUQygweGExNzRkYTgxKSwgV1RDKDB4YTEwNTQ3MDEpLCBXVEMoMHhhMDk2NzIwMSksIFdUQygweGEwMjg1ZDgxKSwKKyAgICBXVEMoMHg5ZmJiMDk4MSksIFdUQygweDlmNGU3ODAxKSwgV1RDKDB4OWVlMmE5MDEpLCBXVEMoMHg5ZTc3OWY4MSksCisgICAgV1RDKDB4OWUwZDVlMDEpLCBXVEMoMHg5ZGEzZTYwMSksIFdUQygweDlkM2IzYjgxKSwgV1RDKDB4OWNkMzVmODEpLAorICAgIFdUQygweDljNmM1NDgxKSwgV1RDKDB4OWMwNjFiODEpLCBXVEMoMHg5YmEwYjcwMSksIFdUQygweDliM2MyODAxKSwKKyAgICBXVEMoMHg5YWQ4NzA4MSksIFdUQygweDlhNzU5MzAxKSwgV1RDKDB4OWExMzkxMDEpLCBXVEMoMHg5OWIyNmM4MSksCisgICAgV1RDKDB4OTk1MjI4MDEpLCBXVEMoMHg5OGYyYzYwMSksIFdUQygweDk4OTQ0OTAxKSwgV1RDKDB4OTgzNmIyMDEpLAorICAgIFdUQygweDk3ZGEwNDgxKSwgV1RDKDB4OTc3ZTQxODEpLCBXVEMoMHg5NzIzNmIwMSksIFdUQygweDk2Yzk4MzgxKSwKKyAgICBXVEMoMHg5NjcwOGI4MSksIFdUQygweDk2MTg4NTAxKSwgV1RDKDB4OTVjMTcwODEpLCBXVEMoMHg5NTZiNGY4MSksCisgICAgV1RDKDB4OTUxNjIzODEpLCBXVEMoMHg5NGMxZWUwMSksIFdUQygweDk0NmVhZjgxKSwgV1RDKDB4OTQxYzY5MDEpLAorICAgIFdUQygweDkzY2IxYzgxKSwgV1RDKDB4OTM3YWNiMDEpLCBXVEMoMHg5MzJiNzUwMSksIFdUQygweDkyZGQxYjAxKSwKKyAgICBXVEMoMHg5MjhmYmUwMSksIFdUQygweDkyNDM1ZDAxKSwgV1RDKDB4OTFmN2Y5ODEpLCBXVEMoMHg5MWFkOTI4MSksCisgICAgV1RDKDB4OTE2NDI3ODEpLCBXVEMoMHg5MTFiYjk4MSksIFdUQygweDkwZDQ0NzgxKSwgV1RDKDB4OTA4ZGQxMDEpLAorICAgIFdUQygweDkwNDg1NDAxKSwgV1RDKDB4OTAwM2NlODEpLCBXVEMoMHg4ZmMwM2YwMSksIFdUQygweDhmN2RhNDAxKSwKKyAgICBXVEMoMHg4ZjNiZmIwMSksIFdUQygweDhlZmI0MTgxKSwgV1RDKDB4OGViYjc1ODEpLCBXVEMoMHg4ZTdjOTMwMSksCisgICAgV1RDKDB4OGUzZTk0ODEpLCBXVEMoMHg4ZTAxNzU4MSksIFdUQygweDhkYzUzMDAxKSwgV1RDKDB4OGQ4OWJlODEpLAorICAgIFdUQygweDhkNGYxYjAxKSwgV1RDKDB4OGQxNTQwODEpLCBXVEMoMHg4Y2RjMjkwMSksIFdUQygweDhjYTNjYjAxKSwKKyAgICBXVEMoMHg4YzZjMWIwMSksIFdUQygweDhjMzUwZDAxKSwgV1RDKDB4OGJmZTk0MDEpLCBXVEMoMHg4YmM4YTQwMSksCisgICAgV1RDKDB4OGI5MzMwMDEpLCBXVEMoMHg4YjVlMmM4MSksIFdUQygweDhiMjk4YjgxKSwgV1RDKDB4OGFmNTNlODEpLAorICAgIFdUQygweDhhYzEzMzgxKSwgV1RDKDB4OGE4ZDU4MDEpLCBXVEMoMHg4YTU5OWE4MSksIFdUQygweDhhMjVmMzAxKSwKKyAgICBXVEMoMHg4OWYyNjEwMSksIFdUQygweDg5YmVlNTgxKSwgV1RDKDB4ODk4YjgzMDEpLCBXVEMoMHg4OTU4NjkwMSksCisgICAgV1RDKDB4ODkyNWYxMDEpLCBXVEMoMHg4OGY0NzkwMSksIFdUQygweDg4YzQ1ZTgxKSwgV1RDKDB4ODg5NjI5ODEpLAorICAgIFdUQygweDg4NmE4YTgxKSwgV1RDKDB4ODg0MjMzMDEpLCBXVEMoMHg4ODFkZDMwMSksIFdUQygweDg3ZmRkNzgxKSwKKyAgICBXVEMoMHg4N2QwY2E4MSksIFdUQygweDg3Yzc2MjAxKSwgV1RDKDB4ODdiY2FiODEpLCBXVEMoMHg4N2IwZWYwMSksCisgICAgV1RDKDB4ODdhNDhiMDEpLCBXVEMoMHg4Nzk3ZGQ4MSksIFdUQygweDg3OGI0MzAxKSwgV1RDKDB4ODc3ZWRlMDEpLAorICAgIFdUQygweDg3NzI5NzAxKSwgV1RDKDB4ODc2NjU0ODEpLCBXVEMoMHg4NzU5ZmQwMSksIFdUQygweDg3NGQ4NjgxKSwKKyAgICBXVEMoMHg4NzQwZjY4MSksIFdUQygweDg3MzQ1MzgxKSwgV1RDKDB4ODcyN2EzODEpLCBXVEMoMHg4NzFhZTk4MSksCisgICAgV1RDKDB4ODcwZTIzMDEpLCBXVEMoMHg4NzAxNGY4MSksIFdUQygweDg2ZjQ2ZDgxKSwgV1RDKDB4ODZlNzdiODEpLAorICAgIFdUQygweDg2ZGE3OTAxKSwgV1RDKDB4ODZjZDY2ODEpLCBXVEMoMHg4NmMwNDM4MSksIFdUQygweDg2YjMwZjAxKSwKKyAgICBXVEMoMHg4NmE1Y2E4MSksIFdUQygweDg2OTg3NTgxKSwgV1RDKDB4ODY4YjEwMDEpLCBXVEMoMHg4NjdkOWE4MSksCisgICAgV1RDKDB4ODY3MDEzODEpLCBXVEMoMHg4NjYyN2IwMSksIFdUQygweDg2NTRkMDAxKSwgV1RDKDB4ODY0NzEyODEpLAorICAgIFdUQygweDg2Mzk0MzAxKSwgV1RDKDB4ODYyYjYyMDEpLCBXVEMoMHg4NjFkNzA4MSksIFdUQygweDg2MGY2ZTAxKSwKKyAgICBXVEMoMHg4NjAxNTk4MSksIFdUQygweDg1ZjMzMjgxKSwgV1RDKDB4ODVlNGY4MDEpLCBXVEMoMHg4NWQ2YTk4MSksCisgICAgV1RDKDB4ODVjODQ4MDEpLCBXVEMoMHg4NWI5ZDQ4MSksIFdUQygweDg1YWI0ZjAxKSwgV1RDKDB4ODU5Y2I3ODEpLAorICAgIFdUQygweDg1OGUwZTAxKSwgV1RDKDB4ODU3ZjUxMDEpLCBXVEMoMHg4NTcwN2Y4MSksIFdUQygweDg1NjE5YTAxKSwKKyAgICBXVEMoMHg4NTUyYTE4MSksIFdUQygweDg1NDM5NjAxKSwgV1RDKDB4ODUzNDc5MDEpLCBXVEMoMHg4NTI1NGE4MSksCisgICAgV1RDKDB4ODUxNjA5ODEpLCBXVEMoMHg4NTA2YjU4MSksIFdUQygweDg0Zjc0ZTAxKSwgV1RDKDB4ODRlN2QzODEpLAorICAgIFdUQygweDg0ZDg0NjAxKSwgV1RDKDB4ODRjOGE3MDEpLCBXVEMoMHg4NGI4ZjgwMSksIFdUQygweDg0YTkzODAxKSwKKyAgICBXVEMoMHg4NDk5NjcwMSksIFdUQygweDg0ODk4NDgxKSwgV1RDKDB4ODQ3OThmODEpLCBXVEMoMHg4NDY5ODg4MSksCisgICAgV1RDKDB4ODQ1OTcwODEpLCBXVEMoMHg4NDQ5NDg4MSksIFdUQygweDg0MzkxMDgxKSwgV1RDKDB4ODQyOGNhMDEpLAorICAgIFdUQygweDg0MTg3NDAxKSwgV1RDKDB4ODQwODBkODEpLCBXVEMoMHg4M2Y3OTY4MSksIFdUQygweDgzZTcwZjAxKSwKKyAgICBXVEMoMHg4M2Q2Nzg4MSksIFdUQygweDgzYzVkMzgxKSwgV1RDKDB4ODNiNTIxMDEpLCBXVEMoMHg4M2E0NjE4MSksCisgICAgV1RDKDB4ODM5Mzk1MDEpLCBXVEMoMHg4MzgyYmEwMSksIFdUQygweDgzNzFkMDgxKSwgV1RDKDB4ODM2MGQ5MDEpLAorICAgIFdUQygweDgzNGZkNDgxKSwgV1RDKDB4ODMzZWMzODEpLCBXVEMoMHg4MzJkYTc4MSksIFdUQygweDgzMWM4MTAxKSwKKyAgICBXVEMoMHg4MzBiNGY4MSksIFdUQygweDgyZmExMTgxKSwgV1RDKDB4ODJlOGM4MDEpLCBXVEMoMHg4MmQ3NzIwMSksCisgICAgV1RDKDB4ODJjNjExMDEpLCBXVEMoMHg4MmI0YTYwMSksIFdUQygweDgyYTMzMjgxKSwgV1RDKDB4ODI5MWI2MDEpLAorICAgIFdUQygweDgyODAzMTAxKSwgV1RDKDB4ODI2ZWEyMDEpLCBXVEMoMHg4MjVkMDkwMSksIFdUQygweDgyNGI2NjAxKSwKKyAgICBXVEMoMHg4MjM5Yjk4MSksIFdUQygweDgyMjgwNTgxKSwgV1RDKDB4ODIxNjRhODEpLCBXVEMoMHg4MjA0ODg4MSksCisgICAgV1RDKDB4ODFmMmJmODEpLCBXVEMoMHg4MWUwZWU4MSksIFdUQygweDgxY2YxNTgxKSwgV1RDKDB4ODFiZDM0MDEpLAorICAgIFdUQygweDgxYWI0YjAxKSwgV1RDKDB4ODE5OTVjMDEpLCBXVEMoMHg4MTg3Njc4MSksIFdUQygweDgxNzU2ZDgxKSwKKyAgICBXVEMoMHg4MTYzNmQ4MSksIFdUQygweDgxNTE2NzAxKSwgV1RDKDB4ODEzZjU5ODEpLCBXVEMoMHg4MTJkNDQ4MSksCisgICAgV1RDKDB4ODExYjI5ODEpLCBXVEMoMHg4MTA5MDk4MSksIFdUQygweDgwZjZlNDgxKSwgV1RDKDB4ODBlNGJiODEpLAorICAgIFdUQygweDgwZDI4ZDgxKSwgV1RDKDB4ODBjMDVhMDEpLCBXVEMoMHg4MGFlMWY4MSksIFdUQygweDgwOWJkZjAxKSwKKyAgICBXVEMoMHg4MDg5OTg4MSksIFdUQygweDgwNzc0YzgxKSwgV1RDKDB4ODA2NGZjODEpLCBXVEMoMHg4MDUyYTg4MSksCisgICAgV1RDKDB4ODA0MDUxMDEpLCBXVEMoMHg4MDJkZjcwMSksIFdUQygweDgwMWI5YjAxKSwgV1RDKDB4ODAwOTNlMDEpLAorICAgIFdUQygweDBhNzRiMTIwKSwgV1RDKDB4MGFhMDhhOTApLCBXVEMoMHgwYWNkMmI4MCksIFdUQygweDBhZmE4ODYwKSwKKyAgICBXVEMoMHgwYjI4OTU5MCksIFdUQygweDBiNTc0NzkwKSwgV1RDKDB4MGI4NjkyZDApLCBXVEMoMHgwYmI2NmJiMCksCisgICAgV1RDKDB4MGJlNmM2YjApLCBXVEMoMHgwYzE3OTgzMCksIFdUQygweDBjNDhkNTAwKSwgV1RDKDB4MGM3YTdhZDApLAorICAgIFdUQygweDBjYWM5MDAwKSwgV1RDKDB4MGNkZjFiNjApLCBXVEMoMHgwZDEyMjM5MCksIFdUQygweDBkNDVhOGYwKSwKKyAgICBXVEMoMHgwZDc5YTVlMCksIFdUQygweDBkYWUxNDgwKSwgV1RDKDB4MGRlMmVmMzApLCBXVEMoMHgwZTE4MzgwMCksCisgICAgV1RDKDB4MGU0ZGY4YzApLCBXVEMoMHgwZTg0M2I5MCksIFdUQygweDBlYmIwYTIwKSwgV1RDKDB4MGVmMjY0MzApLAorICAgIFdUQygweDBmMmEzZmMwKSwgV1RDKDB4MGY2MjkyODApLCBXVEMoMHgwZjliNTIxMCksIFdUQygweDBmZDQ3NjkwKSwKKyAgICBXVEMoMHgxMDBkZmE4MCksIFdUQygweDEwNDdkOGEwKSwgV1RDKDB4MTA4MjBiNDApLCBXVEMoMHgxMGJjOGI4MCksCisgICAgV1RDKDB4MTBmNzUwODApLCBXVEMoMHgxMTMyNTEwMCksIFdUQygweDExNmQ4NGUwKSwgV1RDKDB4MTFhOGVjZTApLAorICAgIFdUQygweDExZTQ5NDIwKSwgV1RDKDB4MTIyMDg1YTApLCBXVEMoMHgxMjVjY2JjMCksIFdUQygweDEyOTk1YTQwKSwKKyAgICBXVEMoMHgxMmQ2MGU4MCksIFdUQygweDEzMTJjNGMwKSwgV1RDKDB4MTM0ZjU5ZTApLCBXVEMoMHgxMzhiYWU2MCksCisgICAgV1RDKDB4MTNjN2E3NDApLCBXVEMoMHgxNDAzMjllMCksIFdUQygweDE0M2UxYjYwKSwgV1RDKDB4MTQ3ODYyYTApLAorICAgIFdUQygweDE0YjFlODQwKSwgV1RDKDB4MTRlYTk0YzApLCBXVEMoMHgxNTIyNTBhMCksIFdUQygweDE1NTkwMzgwKSwKKyAgICBXVEMoMHgxNThlOTNlMCksIFdUQygweDE1YzJlODIwKSwgV1RDKDB4MTVmNWU2ZTApLCBXVEMoMHgxNjI3NzlhMCksCisgICAgV1RDKDB4MTY1NzhjYTApLCBXVEMoMHgxNjg2MGNhMCksIFdUQygweDE2YjJlNjQwKSwgV1RDKDB4MTZkZTBiMDApLAorICAgIFdUQygweDE3MDc3MTQwKSwgV1RDKDB4MTcyZjBmYTApLCBXVEMoMHgxNzU0ZTIwMCksIFdUQygweDE3Nzk2MDgwKSwKKyAgICBXVEMoMHgxNzlkN2YyMCksIFdUQygweDE3YzIzNzYwKSwgV1RDKDB4MTdlODdkYTApLCBXVEMoMHgxODEwY2M4MCksCisgICAgV1RDKDB4MTgzYjI1YTApLCBXVEMoMHgxODY3ODUyMCksIFdUQygweDE4OTVlNzAwKSwgV1RDKDB4MThjNjQ1NDApLAorICAgIFdUQygweDE4Zjg5NzgwKSwgV1RDKDB4MTkyY2Q1NjApLCBXVEMoMHgxOTYyZjY4MCksIFdUQygweDE5OWFmMmEwKSwKKyAgICBXVEMoMHgxOWQ0YzFlMCksIFdUQygweDFhMTA1Y2EwKSwgV1RDKDB4MWE0ZGJhZTApLCBXVEMoMHgxYThjZDY2MCksCisgICAgV1RDKDB4MWFjZGFhNjApLCBXVEMoMHgxYjEwMzI2MCksIFdUQygweDFiNTQ2OTQwKSwgV1RDKDB4MWI5YTQ2MDApLAorICAgIFdUQygweDFiZTFiYjgwKSwgV1RDKDB4MWMyYWJjNjApLCBXVEMoMHgxYzc1M2I4MCksIFdUQygweDFjYzEzODYwKSwKKyAgICBXVEMoMHgxZDBlYmUyMCksIFdUQygweDFkNWRkOGMwKSwgV1RDKDB4MWRhZTk0ODApLCBXVEMoMHgxZTAxMDA2MCksCisgICAgV1RDKDB4MWU1NTJmNDApLCBXVEMoMHgxZWFiMzNlMCksIFdUQygweDFmMDMyMDYwKSwgV1RDKDB4MWY1Y2ZjZTApLAorICAgIFdUQygweDFmYjhjNjYwKSwgV1RDKDB4MjAxNjc5YzApLCBXVEMoMHgyMDc2MTFjMCksIFdUQygweDIwZDc1ZjAwKSwKKyAgICBXVEMoMHgyMTNhMDY0MCksIFdUQygweDIxOWRhYjgwKSwgV1RDKDB4MjIwMWY0ODApLCBXVEMoMHgyMjY2YmE4MCksCisgICAgV1RDKDB4MjJjYzBhYzApLCBXVEMoMHgyMzMxZjRjMCksIFdUQygweDIzOTg4OTQwKSwgV1RDKDB4MjNmZmZmNDApLAorICAgIFdUQygweDI0NjhiMzQwKSwgV1RDKDB4MjRkMzAzMDApLCBXVEMoMHgyNTNmNDkwMCksIFdUQygweDI1YWQ4OTgwKSwKKyAgICBXVEMoMHgyNjFkNzJjMCksIFdUQygweDI2OGVhZWMwKSwgV1RDKDB4MjcwMGU4ODApLCBXVEMoMHgyNzczZGI0MCksCisgICAgV1RDKDB4MjdlNzUxYzApLCBXVEMoMHgyODViMTc4MCksIFdUQygweDI4Y2VmYmMwKSwgV1RDKDB4Mjk0MzFmODApLAorICAgIFdUQygweDI5YjdmNjgwKSwgV1RDKDB4MmEyZGY3ODApLCBXVEMoMHgyYWE1OTg4MCksIFdUQygweDJiMWYzMjgwKSwKKyAgICBXVEMoMHgyYjliMDE0MCksIFdUQygweDJjMTk0MDAwKSwgV1RDKDB4MmM5YTI1NDApLCBXVEMoMHgyZDFkOGRjMCksCisgICAgV1RDKDB4MmRhMmZjNDApLCBXVEMoMHgyZTI5ZWU4MCksIFdUQygweDJlYjFlMzQwKSwgV1RDKDB4MmYzYTRlNDApLAorICAgIFdUQygweDJmYzI5OTgwKSwgV1RDKDB4MzA0YTJlYzApLCBXVEMoMHgzMGQwN2NjMCksIFdUQygweDMxNTU2NmMwKSwKKyAgICBXVEMoMHgzMWQ5NDQ4MCksIFdUQygweDMyNWM3MmMwKSwgV1RDKDB4MzJkZjUxYzApLCBXVEMoMHgzMzYyOGM4MCksCisgICAgV1RDKDB4MzNlNzFhMDApLCBXVEMoMHgzNDZkZjQwMCksIFdUQygweDM0ZjgwZGMwKSwgV1RDKDB4MzU4NWM2NDApLAorICAgIFdUQygweDM2MTZlNzAwKSwgV1RDKDB4MzZhYjMzODApLCBXVEMoMHgzNzQyNmFjMCksIFdUQygweDM3ZGJlODQwKSwKKyAgICBXVEMoMHgzODc2YTM0MCksIFdUQygweDM5MTE4ZjQwKSwgV1RDKDB4MzlhYmEyYzApLCBXVEMoMHgzYTQ0MjJjMCksCisgICAgV1RDKDB4M2FkYWEyMDApLCBXVEMoMHgzYjZlYjZjMCksIFdUQygweDNiZmZmZDgwKSwgV1RDKDB4M2M4ZTkzODApLAorICAgIFdUQygweDNkMWIxNzgwKSwgV1RDKDB4M2RhNjJlMDApLCBXVEMoMHgzZTMwN2IwMCksIFdUQygweDNlYmE5N2MwKSwKKyAgICBXVEMoMHgzZjQ1MTI4MCksIFdUQygweDNmZDA3OTQwKSwgV1RDKDB4NDA1ZDU3N2YpLCBXVEMoMHg0MGViZjU3ZiksCisgICAgV1RDKDB4NDE3YzU5ZmYpLCBXVEMoMHg0MjBlODk3ZiksIFdUQygweDQyYTI4NTdmKSwgV1RDKDB4NDMzODMwN2YpLAorICAgIFdUQygweDQzY2Y0ZDdmKSwgV1RDKDB4NDQ2NzljZmYpLCBXVEMoMHg0NTAwZGZmZiksIFdUQygweDQ1OWFjMmZmKSwKKyAgICBXVEMoMHg0NjM0ZTJmZiksIFdUQygweDQ2Y2VkOWZmKSwgV1RDKDB4NDc2ODQzN2YpLCBXVEMoMHg0ODAwZDI3ZiksCisgICAgV1RDKDB4NDg5ODUwZmYpLCBXVEMoMHg0OTJlODhmZiksIFdUQygweDQ5YzM0NmZmKSwgV1RDKDB4NGE1Njc4ZmYpLAorICAgIFdUQygweDRhZTgyZjdmKSwgV1RDKDB4NGI3ODdjN2YpLCBXVEMoMHg0YzA3NzE3ZiksIFdUQygweDRjOTUzMzdmKSwKKyAgICBXVEMoMHg0ZDIxZjc3ZiksIFdUQygweDRkYWRmM2ZmKSwgV1RDKDB4NGUzOTVlZmYpLCBXVEMoMHg0ZWM0NjU3ZiksCisgICAgV1RDKDB4NGY0ZjI5N2YpLCBXVEMoMHg0ZmQ5Y2Q3ZiksIFdUQygweDUwNjQ3MzdmKSwgV1RDKDB4NTBlZjNjZmYpLAorICAgIFdUQygweDUxN2E0NmZmKSwgV1RDKDB4NTIwNWIwZmYpLCBXVEMoMHg1MjkxOTdmZiksIFdUQygweDUzMWUwNGZmKSwKKyAgICBXVEMoMHg1M2FhZWI3ZiksIFdUQygweDU0MzgzZWZmKSwgV1RDKDB4NTRjNWVmN2YpLCBXVEMoMHg1NTUzYThmZiksCisgICAgV1RDKDB4NTVlMGQ1N2YpLCBXVEMoMHg1NjZjZGE3ZiksIFdUQygweDU2ZjcyMGZmKSwgV1RDKDB4NTc3ZjRhZmYpLAorICAgIFdUQygweDU4MDUzNGZmKSwgV1RDKDB4NTg4OGJkN2YpLCBXVEMoMHg1OTA5YzZmZiksIFdUQygweDU5ODg5MGZmKSwKKyAgICBXVEMoMHg1YTA1YjdmZiksIFdUQygweDVhODFkYjdmKSwgV1RDKDB4NWFmZDk5ZmYpLCBXVEMoMHg1Yjc5NGE3ZiksCisgICAgV1RDKDB4NWJmNTAwN2YpLCBXVEMoMHg1YzcwY2JmZiksIFdUQygweDVjZWNiYjdmKSwgV1RDKDB4NWQ2OGM0N2YpLAorICAgIFdUQygweDVkZTRjM2ZmKSwgV1RDKDB4NWU2MDk0ZmYpLCBXVEMoMHg1ZWRjMTI3ZiksIFdUQygweDVmNTZmZGZmKSwKKyAgICBXVEMoMHg1ZmQxMDE3ZiksIFdUQygweDYwNDljNjdmKSwgV1RDKDB4NjBjMGY2N2YpLCBXVEMoMHg2MTM2NTBmZiksCisgICAgV1RDKDB4NjFhOWE5ZmYpLCBXVEMoMHg2MjFhZDc3ZiksIFdUQygweDYyODliMzdmKSwgV1RDKDB4NjJmNjdmZmYpLAorICAgIFdUQygweDYzNjFlODdmKSwgV1RDKDB4NjNjYzliZmYpLCBXVEMoMHg2NDM3NDU3ZiksIFdUQygweDY0YTIyNDdmKSwKKyAgICBXVEMoMHg2NTBkMGM3ZiksIFdUQygweDY1NzdjYzdmKSwgV1RDKDB4NjVlMjMyN2YpLCBXVEMoMHg2NjRiZjU3ZiksCisgICAgV1RDKDB4NjZiNGI1ZmYpLCBXVEMoMHg2NzFjMTM3ZiksIFdUQygweDY3ODFhZmZmKSwgV1RDKDB4NjdlNTc5ZmYpLAorICAgIFdUQygweDY4NDdhYmZmKSwgV1RDKDB4NjhhODgyZmYpLCBXVEMoMHg2OTA4M2JmZiksIFdUQygweDY5NjZmYmZmKSwKKyAgICBXVEMoMHg2OWM0Y2ZmZiksIFdUQygweDZhMjFjNTdmKSwgV1RDKDB4NmE3ZGU4N2YpLCBXVEMoMHg2YWQ5Mzc3ZiksCisgICAgV1RDKDB4NmIzM2E1ZmYpLCBXVEMoMHg2YjhkMjU3ZiksIFdUQygweDZiZTVhOGZmKSwgV1RDKDB4NmMzZDIwZmYpLAorICAgIFdUQygweDZjOTM4MGZmKSwgV1RDKDB4NmNlOGJhN2YpLCBXVEMoMHg2ZDNjYmZmZiksIFdUQygweDZkOGY4MjdmKSwKKyAgICAvKiBwYXJ0IDIgKi8KKyAgICBXVEMoMHhhZDk4YjQ4MSksIFdUQygweGFlYWQ5ZDAxKSwgV1RDKDB4YWZiZmMzODEpLCBXVEMoMHhiMGNmNGQwMSksCisgICAgV1RDKDB4YjFkYzVmODEpLCBXVEMoMHhiMmU3MjA4MSksIFdUQygweGIzZWZiNTAxKSwgV1RDKDB4YjRmNjQzODEpLAorICAgIFdUQygweGI1ZmFmMTAxKSwgV1RDKDB4YjZmZGU0MDEpLCBXVEMoMHhiN2ZmNDAwMSksIFdUQygweGI4ZmYxNjAxKSwKKyAgICBXVEMoMHhiOWZkNjE4MSksIFdUQygweGJhZmExZDAxKSwgV1RDKDB4YmJmNTQ0MDEpLCBXVEMoMHhiY2VlZDEwMSksCisgICAgV1RDKDB4YmRlNmMwODEpLCBXVEMoMHhiZWRkMGU4MSksIFdUQygweGJmZDFiNzAxKSwgV1RDKDB4YzBjNGI0NDApLAorICAgIFdUQygweGMxYjVmZmMwKSwgV1RDKDB4YzJhNTkzNDApLCBXVEMoMHhjMzkzNjc4MCksIFdUQygweGM0N2Y3OGMwKSwKKyAgICBXVEMoMHhjNTY5YzYwMCksIFdUQygweGM2NTI0ZDQwKSwgV1RDKDB4YzczOTBkYzApLCBXVEMoMHhjODFlMDRjMCksCisgICAgV1RDKDB4YzkwMTJlMDApLCBXVEMoMHhjOWUyODU0MCksIFdUQygweGNhYzIwNzAwKSwgV1RDKDB4Y2I5ZmIxYzApLAorICAgIFdUQygweGNjN2I4NjQwKSwgV1RDKDB4Y2Q1NTg2MDApLCBXVEMoMHhjZTJkYjIwMCksIFdUQygweGNmMDQwOWMwKSwKKyAgICBXVEMoMHhjZmQ4OGE0MCksIFdUQygweGQwYWIzMDgwKSwgV1RDKDB4ZDE3YmZhMDApLCBXVEMoMHhkMjRhZTY0MCksCisgICAgV1RDKDB4ZDMxN2Y3YzApLCBXVEMoMHhkM2UzMzA4MCksIFdUQygweGQ0YWM5MzQwKSwgV1RDKDB4ZDU3NDFmNDApLAorICAgIFdUQygweGQ2MzlkMmMwKSwgV1RDKDB4ZDZmZGFiMDApLCBXVEMoMHhkN2JmYTVjMCksIFdUQygweGQ4N2ZjMzAwKSwKKyAgICBXVEMoMHhkOTNlMDYwMCksIFdUQygweGQ5ZmE3MTgwKSwgV1RDKDB4ZGFiNTA5MDApLCBXVEMoMHhkYjZkY2NjMCksCisgICAgV1RDKDB4ZGMyNGJhODApLCBXVEMoMHhkY2Q5ZDAwMCksIFdUQygweGRkOGQwYjgwKSwgV1RDKDB4ZGUzZTZkYzApLAorICAgIFdUQygweGRlZWRmOWMwKSwgV1RDKDB4ZGY5YmIzNDApLCBXVEMoMHhlMDQ3OWUyMCksIFdUQygweGUwZjFiYWMwKSwKKyAgICBXVEMoMHhlMTlhMDdlMCksIFdUQygweGUyNDA4MzgwKSwgV1RDKDB4ZTJlNTJjMDApLCBXVEMoMHhlMzg4MDJlMCksCisgICAgV1RDKDB4ZTQyOTBjMDApLCBXVEMoMHhlNGM4NGMyMCksIFdUQygweGU1NjVjNzYwKSwgV1RDKDB4ZTYwMTdmMjApLAorICAgIFdUQygweGU2OWI3MjQwKSwgV1RDKDB4ZTczMzlmNjApLCBXVEMoMHhlN2NhMDUwMCksIFdUQygweGU4NWVhNDgwKSwKKyAgICBXVEMoMHhlOGYxODE4MCksIFdUQygweGU5ODI5ZmMwKSwgV1RDKDB4ZWExMjAyZTApLCBXVEMoMHhlYTlmYWI4MCksCisgICAgV1RDKDB4ZWIyYjk3MDApLCBXVEMoMHhlYmI1YzJhMCksIFdUQygweGVjM2UyYmMwKSwgV1RDKDB4ZWNjNGQzMDApLAorICAgIFdUQygweGVkNDliYzgwKSwgV1RDKDB4ZWRjY2VjNjApLCBXVEMoMHhlZTRlNjZhMCksIFdUQygweGVlY2UyZDgwKSwKKyAgICBXVEMoMHhlZjRjNDFlMCksIFdUQygweGVmYzhhNDgwKSwgV1RDKDB4ZjA0MzU2MTApLCBXVEMoMHhmMGJjNWM2MCksCisgICAgV1RDKDB4ZjEzM2MyMzApLCBXVEMoMHhmMWE5OTI3MCksIFdUQygweGYyMWRkN2IwKSwgV1RDKDB4ZjI5MDk3ZTApLAorICAgIFdUQygweGYzMDFkM2QwKSwgV1RDKDB4ZjM3MThjMjApLCBXVEMoMHhmM2RmYzE4MCksIFdUQygweGY0NGM3MTAwKSwKKyAgICBXVEMoMHhmNGI3OTQ4MCksIFdUQygweGY1MjEyNWIwKSwgV1RDKDB4ZjU4OTFkZjApLCBXVEMoMHhmNWVmNmZlMCksCisgICAgV1RDKDB4ZjY1NDA3MzApLCBXVEMoMHhmNmI2Y2Y1MCksIFdUQygweGY3MTdiNDkwKSwgV1RDKDB4Zjc3NmI5YTApLAorICAgIFdUQygweGY3ZDNmNzIwKSwgV1RDKDB4ZjgyZjg2ZTgpLCBXVEMoMHhmODg5ODI2MCksIFdUQygweGY4ZTFmYzUwKSwKKyAgICBXVEMoMHhmOTM5MDBmMCksIFdUQygweGY5OGU5YzI4KSwgV1RDKDB4ZjllMmQ5NDApLCBXVEMoMHhmYTM1YjRhMCksCisgICAgV1RDKDB4ZmE4NzFiZDgpLCBXVEMoMHhmYWQ2ZmJkMCksIFdUQygweGZiMjU0MjUwKSwgV1RDKDB4ZmI3MWYwYzApLAorICAgIFdUQygweGZiYmQxYzI4KSwgV1RDKDB4ZmMwNmRhNjApLCBXVEMoMHhmYzRmNDBhNCksIFdUQygweGZjOTY1NTAwKSwKKyAgICBXVEMoMHhmY2RjMGU1YyksIFdUQygweGZkMjA2MmY0KSwgV1RDKDB4ZmQ2MzQ4ZDApLCBXVEMoMHhmZGE0YjFiOCksCisgICAgV1RDKDB4ZmRlNDhiMmMpLCBXVEMoMHhmZTIyYzI4MCksIFdUQygweGZlNWY0NjJhKSwgV1RDKDB4ZmU5YTFmMmUpLAorICAgIFdUQygweGZlZDM3MTFjKSwgV1RDKDB4ZmYwYjYwYWMpLCBXVEMoMHhmZjQyMTJkZCksIFdUQygweGZmNzdiMzQ0KSwKKyAgICBXVEMoMHhmZmFjNzQwNyksIFdUQygweGZmZTA4Nzk2KSwgV1RDKDB4MDAxNDFlMzcpLCBXVEMoMHgwMDQ3MzY2NSksCisgICAgV1RDKDB4MDA3OTljZDApLCBXVEMoMHgwMGFiMWJmZiksIFdUQygweDAwZGI3ZDhiKSwgV1RDKDB4MDEwYTc1ZWEpLAorICAgIFdUQygweDAxMzdhNDZlKSwgV1RDKDB4MDE2MmE3N2EpLCBXVEMoMHgwMThiMjBhYyksIFdUQygweDAxYjBmYjdhKSwKKyAgICBXVEMoMHgwMWQ0NmQzYyksIFdUQygweDAxZjVhZTdjKSwgV1RDKDB4MDIxNGY5MWMpLCBXVEMoMHgwMjMyYTVjYyksCisgICAgV1RDKDB4MDI0ZjJjMDQpLCBXVEMoMHgwMjZiMDQ4YyksIFdUQygweDAyODZhNjI4KSwgV1RDKDB4MDJhMjU4MDgpLAorICAgIFdUQygweDAyYmUzMWMwKSwgV1RDKDB4MDJkYTQ4ZTApLCBXVEMoMHgwMmY2YjA5YyksIFdUQygweDAzMTM0NWRjKSwKKyAgICBXVEMoMHgwMzJmYWY1MCksIFdUQygweDAzNGI5MTQ4KSwgV1RDKDB4MDM2NjkwZTgpLCBXVEMoMHgwMzgwNjU4YyksCisgICAgV1RDKDB4MDM5OGQ4ZTQpLCBXVEMoMHgwM2FmYjU2OCksIFdUQygweDAzYzRjNmUwKSwgV1RDKDB4MDNkN2Y3NzApLAorICAgIFdUQygweDAzZTk0ZjljKSwgV1RDKDB4MDNmOGQ5MzgpLCBXVEMoMHgwNDA2OWVlOCksIFdUQygweDA0MTJiZWY4KSwKKyAgICBXVEMoMHgwNDFkNmIzMCksIFdUQygweDA0MjZkNjM4KSwgV1RDKDB4MDQyZjMyODgpLCBXVEMoMHgwNDM2YWQ5OCksCisgICAgV1RDKDB4MDQzZDZmZDApLCBXVEMoMHgwNDQzYTE3MCksIFdUQygweDA0NDk2YTQwKSwgV1RDKDB4MDQ0ZWU3MjgpLAorICAgIFdUQygweDA0NTQyYTQwKSwgV1RDKDB4MDQ1OTQ1MjApLCBXVEMoMHgwNDVlNDg5MCksIFdUQygweDA0NjMzMjEwKSwKKyAgICBXVEMoMHgwNDY3ZWJlOCksIFdUQygweDA0NmM1ZjgwKSwgV1RDKDB4MDQ3MDc2MzApLCBXVEMoMHgwNDc0MTdmMCksCisgICAgV1RDKDB4MDQ3NzJiNTgpLCBXVEMoMHgwNDc5OTZlOCksIFdUQygweDA0N2I0MTQwKSwgV1RDKDB4MDQ3YzEyYTApLAorICAgIFdUQygweDA0N2JmNTIwKSwgV1RDKDB4MDQ3YWQyZTApLCBXVEMoMHgwNDc4OTY5MCksIFdUQygweDA0NzUzOWM4KSwKKyAgICBXVEMoMHgwNDcwYzRiOCksIFdUQygweDA0NmI0MDU4KSwgV1RDKDB4MDQ2NGI2MDApLCBXVEMoMHgwNDVkM2EwOCksCisgICAgV1RDKDB4MDQ1NGViYzgpLCBXVEMoMHgwNDRiZWIwMCksIFdUQygweDA0NDI1Nzk4KSwgV1RDKDB4MDQzODUzYjApLAorICAgIFdUQygweDA0MmUwMzk4KSwgV1RDKDB4MDQyMzhiZDgpLCBXVEMoMHgwNDE5MGY5OCksIFdUQygweDA0MGU5NjcwKSwKKyAgICBXVEMoMHgwNDA0MGMxOCksIFdUQygweDAzZjk1YjMwKSwgV1RDKDB4MDNlZTZlMjApLCBXVEMoMHgwM2UzMmI2NCksCisgICAgV1RDKDB4MDNkNzc1OTgpLCBXVEMoMHgwM2NiMmYyNCksIFdUQygweDAzYmUzYjE4KSwgV1RDKDB4MDNiMDhiMTgpLAorICAgIFdUQygweDAzYTIxZjY0KSwgV1RDKDB4MDM5MmY4ZDQpLCBXVEMoMHgwMzgzMThlMCksIFdUQygweDAzNzI4ZTk0KSwKKyAgICBXVEMoMHgwMzYxNzY5NCksIFdUQygweDAzNGZlZTE4KSwgV1RDKDB4MDMzZTExZjQpLCBXVEMoMHgwMzJiZjUzMCksCisgICAgV1RDKDB4MDMxOWExMTQpLCBXVEMoMHgwMzA3MWU4MCksIFdUQygweDAyZjQ3NWY0KSwgV1RDKDB4MDJlMWE3YzApLAorICAgIFdUQygweDAyY2VhYzA0KSwgV1RDKDB4MDJiYjdhODQpLCBXVEMoMHgwMmE4MGFmMCksIFdUQygweDAyOTQ1MmIwKSwKKyAgICBXVEMoMHgwMjgwNDRlMCksIFdUQygweDAyNmJkNDg4KSwgV1RDKDB4MDI1NmY1NTgpLCBXVEMoMHgwMjQxYTk0MCksCisgICAgV1RDKDB4MDIyYzAwODQpLCBXVEMoMHgwMjE2MGMwOCksIFdUQygweDAxZmZkYzVhKSwgV1RDKDB4MDFlOTdhZDIpLAorICAgIFdUQygweDAxZDJlOTgyKSwgV1RDKDB4MDFiYzJhMmEpLCBXVEMoMHgwMWE1M2U4YyksIFdUQygweDAxOGUyODYwKSwKKyAgICBXVEMoMHgwMTc2ZTk0YyksIFdUQygweDAxNWY4MmZhKSwgV1RDKDB4MDE0N2Y3MGUpLCBXVEMoMHgwMTMwNDZjMiksCisgICAgV1RDKDB4MDExODcyZTgpLCBXVEMoMHgwMTAwN2M0YSksIFdUQygweDAwZTg2M2NmKSwgV1RDKDB4MDBkMDJjODEpLAorICAgIFdUQygweDAwYjdkYjk0KSwgV1RDKDB4MDA5Zjc2NTEpLCBXVEMoMHgwMDg3MDIwNCksIFdUQygweDAwNmU4M2Y4KSwKKyAgICBXVEMoMHgwMDU2MDE3NiksIFdUQygweDAwM2Q3ZmNiKSwgV1RDKDB4MDAyNTA0M2YpLCBXVEMoMHgwMDBjOTQxZiksCisgICAgV1RDKDB4ZDY1NTc0YzApLCBXVEMoMHhkNWViYzEwMCksIFdUQygweGQ1ODJkMDgwKSwgV1RDKDB4ZDUxYTljYzApLAorICAgIFdUQygweGQ0YjMxZjgwKSwgV1RDKDB4ZDQ0YzUyODApLCBXVEMoMHhkM2U2MmY4MCksIFdUQygweGQzODBiMDQwKSwKKyAgICBXVEMoMHhkMzFiY2U0MCksIFdUQygweGQyYjc4MzgwKSwgV1RDKDB4ZDI1M2NhNDApLCBXVEMoMHhkMWYwYWNjMCksCisgICAgV1RDKDB4ZDE4ZTQ1ODApLCBXVEMoMHhkMTJjYWY0MCksIFdUQygweGQwY2MwNDAwKSwgV1RDKDB4ZDA2YzQwYzApLAorICAgIFdUQygweGQwMGQ0NzQwKSwgV1RDKDB4Y2ZhZWY2YzApLCBXVEMoMHhjZjUxMzE0MCksIFdUQygweGNlZjNmYTgwKSwKKyAgICBXVEMoMHhjZTk3N2E0MCksIFdUQygweGNlM2JkOTgwKSwgV1RDKDB4Y2RlMTNmNDApLCBXVEMoMHhjZDg3YTg4MCksCisgICAgV1RDKDB4Y2QyZWU4MDApLCBXVEMoMHhjY2Q2Y2YwMCksIFdUQygweGNjN2YyZjQwKSwgV1RDKDB4Y2MyN2U4ODApLAorICAgIFdUQygweGNiZDBlYTAwKSwgV1RDKDB4Y2I3YTIzODApLCBXVEMoMHhjYjIzODM4MCksIFdUQygweGNhY2NlZTgwKSwKKyAgICBXVEMoMHhjYTc2M2VjMCksIFdUQygweGNhMWY0ZDAwKSwgV1RDKDB4YzljN2Y0ODApLCBXVEMoMHhjOTcwM2I0MCksCisgICAgV1RDKDB4YzkxODUyMDApLCBXVEMoMHhjOGMwNmIwMCksIFdUQygweGM4NjhiNGMwKSwgV1RDKDB4YzgxMTAwYzApLAorICAgIFdUQygweGM3YjhjMjgwKSwgV1RDKDB4Yzc1ZjZhNDApLCBXVEMoMHhjNzA0NjkwMCksIFdUQygweGM2YTc0MzQwKSwKKyAgICBXVEMoMHhjNjQ3OTMwMCksIFdUQygweGM1ZTRmMjAwKSwgV1RDKDB4YzU3ZWZhYzApLCBXVEMoMHhjNTE1NDg4MCksCisgICAgV1RDKDB4YzRhNzc3ODApLCBXVEMoMHhjNDM1MjQ0MCksIFdUQygweGMzYmRlYWMwKSwgV1RDKDB4YzM0MTY3NDApLAorICAgIFdUQygweGMyYmYzM2MwKSwgV1RDKDB4YzIzNmViNDApLCBXVEMoMHhjMWE4MjkwMCksIFdUQygweGMxMTI5MGMwKSwKKyAgICBXVEMoMHhjMDc1Y2YwMCksIFdUQygweGJmZDE5MDgxKSwgV1RDKDB4YmYyNTg0MDEpLCBXVEMoMHhiZTcxNmQ4MSksCisgICAgV1RDKDB4YmRiNTJiODEpLCBXVEMoMHhiY2YwOWE4MSksIFdUQygweGJjMjNhZjgxKSwgV1RDKDB4YmI1MDVjMDEpLAorICAgIFdUQygweGJhN2E5MDgxKSwgV1RDKDB4YjlhNjUyODEpLCBXVEMoMHhiOGQ3OTMwMSksIFdUQygweGI4MTA0YzAxKSwKKyAgICBXVEMoMHhiNzUwODE4MSksIFdUQygweGI2OTgyMjAxKSwgV1RDKDB4YjVlNzFiMDEpLCBXVEMoMHhiNTNkNWIwMSksCisgICAgV1RDKDB4YjQ5YWQwODEpLCBXVEMoMHhiM2ZmNjkwMSksIFdUQygweGIzNmIxMzAxKSwgV1RDKDB4YjJkZGJkMDEpLAorICAgIFdUQygweGIyNTc1NDgxKSwgV1RDKDB4YjFkN2M4MDEpLCBXVEMoMHhiMTVmMDYwMSksIFdUQygweGIwZWNmYzAxKSwKKyAgICBXVEMoMHhiMDgxOTg4MSksIFdUQygweGIwMWNjYTAxKSwgV1RDKDB4YWZiZTdlMDEpLCBXVEMoMHhhZjY2YTMwMSksCisgICAgV1RDKDB4YWYxNTI3MDEpLCBXVEMoMHhhZWM5Zjg4MSksIFdUQygweGFlODUwNjAxKSwgV1RDKDB4YWU0NjNjODEpLAorICAgIFdUQygweGFlMGQ4YjAxKSwgV1RDKDB4YWRkYWUwMDEpLCBXVEMoMHhhZGFlMjg4MSksIFdUQygweGFkODc1MzgxKSwKKyAgICBXVEMoMHhhZDY2NGY4MSksIFdUQygweGFkNGIwOTgxKSwgV1RDKDB4YWQzNTcwODEpLCBXVEMoMHhhZDI1NzMwMSksCisgICAgV1RDKDB4YWQxYWZlMDEpLCBXVEMoMHhhZDE2MDA4MSksIFdUQygweGFkMTY2OTAxKSwgV1RDKDB4YWQxYzI0ODEpLAorICAgIFdUQygweGFkMjcyMjAxKSwgV1RDKDB4YWQzNzRmODEpLCBXVEMoMHhhZDRjOWIwMSksIFdUQygweGFkNjZmMzgxKSwKKyAgICBXVEMoMHhhZDg2NDYwMSksIFdUQygweGFkYWE4MTAxKSwgV1RDKDB4YWRkMzkzMDEpLCBXVEMoMHhhZTAxNmEwMSksCisgICAgV1RDKDB4YWUzM2Y0ODEpLCBXVEMoMHhhZTZiMjAwMSksIFdUQygweGFlYTZkYjAxKSwgV1RDKDB4YWVlNzEzODEpLAorICAgIFdUQygweGFmMmJiODAxKSwgV1RDKDB4YWY3NGI2ODEpLCBXVEMoMHhhZmMxZmQwMSksIFdUQygweGIwMTM3YTAxKSwKKyAgICBXVEMoMHhiMDY5MWI4MSksIFdUQygweGIwYzJjZjgxKSwgV1RDKDB4YjEyMDg0ODEpLCBXVEMoMHhiMTgyMjg4MSksCisgICAgV1RDKDB4YjFlN2E5ODEpLCBXVEMoMHhiMjUwZjYwMSksIFdUQygweGIyYmRmYzAxKSwgV1RDKDB4YjMyZWFhMDEpLAorICAgIFdUQygweGIzYTJlZDAxKSwgV1RDKDB4YjQxYWI0ODEpLCBXVEMoMHhiNDk1ZWUwMSksIFdUQygweGI1MTQ4ODAxKSwKKyAgICBXVEMoMHhiNTk2NzA4MSksIFdUQygweGI2MWI5NTgxKSwgV1RDKDB4YjZhM2U1ODEpLCBXVEMoMHhiNzJmNGUwMSksCisgICAgV1RDKDB4YjdiZGJlMDEpLCBXVEMoMHhiODRmMjM4MSksIFdUQygweGI4ZTM2YzgxKSwgV1RDKDB4Yjk3YTg3MDEpLAorICAgIFdUQygweGJhMTQ2MTAxKSwgV1RDKDB4YmFiMGU5ODEpLCBXVEMoMHhiYjUwMGQ4MSksIFdUQygweGJiZjFiYzgxKSwKKyAgICBXVEMoMHhiYzk1ZTM4MSksIFdUQygweGJkM2M3MTgxKSwgV1RDKDB4YmRlNTU0ODEpLCBXVEMoMHhiZTkwN2EwMSksCisgICAgV1RDKDB4YmYzZGQxMDEpLCBXVEMoMHhiZmVkNDcwMSksIFdUQygweGMwOWVjYWMwKSwgV1RDKDB4YzE1MjRhMDApLAorICAgIFdUQygweGMyMDdiMzAwKSwgV1RDKDB4YzJiZWY0NDApLCBXVEMoMHhjMzc3ZmI4MCksIFdUQygweGM0MzJiNzAwKSwKKyAgICBXVEMoMHhjNGVmMTUwMCksIFdUQygweGM1YWQwM2MwKSwgV1RDKDB4YzY2YzcxNDApLCBXVEMoMHhjNzJkNGJjMCksCisgICAgV1RDKDB4YzdlZjgxODApLCBXVEMoMHhjOGIzMDA4MCksIFdUQygweGM5NzdiNzAwKSwgV1RDKDB4Y2EzZDkzNDApLAorICAgIFdUQygweGNiMDQ4MzQwKSwgV1RDKDB4Y2JjYzc1NDApLCBXVEMoMHhjYzk1NTc0MCksIFdUQygweGNkNWYxN2MwKSwKKyAgICBXVEMoMHhjZTI5YTQ4MCksIFdUQygweGNlZjRlYzAwKSwgV1RDKDB4Y2ZjMGRjODApLCBXVEMoMHhkMDhkNjNjMCksCisgICAgV1RDKDB4ZDE1YTcwNDApLCBXVEMoMHhkMjI3ZjAwMCksIFdUQygweGQyZjVkMTQwKSwgV1RDKDB4ZDNjNDAyNDApLAorICAgIFdUQygweGQ0OTI3MTAwKSwgV1RDKDB4ZDU2MTBiODApLCBXVEMoMHhkNjJmYzA4MCksIFdUQygweGQ2ZmU3ZGMwKSwKKyAgICBXVEMoMHhkN2NkMzE0MCksIFdUQygweGQ4OWJjOTgwKSwgV1RDKDB4ZDk2YTM0YzApLCBXVEMoMHhkYTM4NjBjMCksCisgICAgV1RDKDB4ZGIwNjNjMDApLCBXVEMoMHhkYmQzYjQ4MCksIFdUQygweGRjYTBiODgwKSwgV1RDKDB4ZGQ2ZDM2NDApLAorICAgIFdUQygweGRlMzkxYmMwKSwgV1RDKDB4ZGYwNDU3NDApLCBXVEMoMHhkZmNlZDZjMCksIFdUQygweGUwOTg4OGMwKSwKKyAgICBXVEMoMHhlMTYxNWIyMCksIFdUQygweGUyMjkzYzIwKSwgV1RDKDB4ZTJmMDFhMDApLCBXVEMoMHhlM2I1ZTJjMCksCisgICAgV1RDKDB4ZTQ3YTg0YzApLCBXVEMoMHhlNTNkZWUwMCksIFdUQygweGU2MDAwY2MwKSwgV1RDKDB4ZTZjMGNmMjApLAorICAgIFdUQygweGU3ODAyMzYwKSwgV1RDKDB4ZTgzZGY3YTApLCBXVEMoMHhlOGZhMzllMCksIFdUQygweGU5YjRkODgwKSwKKyAgICBXVEMoMHhlYTZkYzFhMCksIFdUQygweGViMjRlMzYwKSwgV1RDKDB4ZWJkYTJiZTApLCBXVEMoMHhlYzhkODk2MCksCisgICAgV1RDKDB4ZWQzZWVhMjApLCBXVEMoMHhlZGVlM2MwMCksIFdUQygweGVlOWI2ZDgwKSwgV1RDKDB4ZWY0NjZjYTApLAorICAgIFdUQygweGVmZWYyNzgwKSwgV1RDKDB4ZjA5NThjNTApLCBXVEMoMHhmMTM5ODk1MCksIFdUQygweGYxZGIwY2EwKSwKKyAgICBXVEMoMHhmMjdhMDQ3MCksIFdUQygweGYzMTY1ZWQwKSwgV1RDKDB4ZjNiMDBhMTApLCBXVEMoMHhmNDQ2ZjQ0MCksCisgICAgV1RDKDB4ZjRkYjBiOTApLCBXVEMoMHhmNTZjM2UzMCksIFdUQygweGY1ZmE3YTUwKSwgV1RDKDB4ZjY4NWFlMTApLAorICAgIFdUQygweGY3MGRjN2EwKSwgV1RDKDB4Zjc5MmI1MjApLCBXVEMoMHhmODE0NjRjOCksIFdUQygweGY4OTJjNGMwKSwKKyAgICBXVEMoMHhmOTBkYzMzMCksIFdUQygweGY5ODU0ZTQwKSwgV1RDKDB4ZjlmOTU0MTgpLCBXVEMoMHhmYTY5YzJmMCksCisgICAgV1RDKDB4ZmFkNjg4ZTgpLCBXVEMoMHhmYjNmOTQyOCksIFdUQygweGZiYTRkMmU4KSwgV1RDKDB4ZmMwNjMzNDQpLAorICAgIFdUQygweGZjNjNhMzcwKSwgV1RDKDB4ZmNiZDExOTQpLCBXVEMoMHhmZDEyNmJkYyksIFdUQygweGZkNjNhMDZjKSwKKyAgICBXVEMoMHhmZGIwOWQ3OCksIFdUQygweGZkZjk1MTI0KSwgV1RDKDB4ZmUzZGE5OWUpLCBXVEMoMHhmZTdkOTUwZSksCisgICAgV1RDKDB4ZmViOTAxYTIpLCBXVEMoMHhmZWVmZGQ4MCksIFdUQygweGZmMjIxNmQ3KSwgV1RDKDB4ZmY0ZjliY2YpLAorICAgIFdUQygweGZmNzg1YTkzKSwgV1RDKDB4ZmY5YzQxNGUpLCBXVEMoMHhmZmJiM2UyYiksIFdUQygweGZmZDUzZjU0KSwKKyAgICBXVEMoMHhmZmVhMzJmNCksIFdUQygweGZmZmEwNzM1KSwgV1RDKDB4MDAwNGFhNDMpLCBXVEMoMHgwMDBhMGE0NyksCisgICAgV1RDKDB4MDAwYTE1NmMpLCBXVEMoMHgwMDA0YjlkZSksIFdUQygweGZmZjllNWM1KSwgV1RDKDB4ZmZlOTg3NGUpfTsKIAogY29uc3QgRklYUF9XVEIgTG93RGVsYXlTeW50aGVzaXM0ODBbMTQ0MF0gPSB7Ci0KLVdUQygweGRhZDJlNmMwKSwgV1RDKDB4ZGIxZGE5MDApLCBXVEMoMHhkYjY4Y2U0MCksIFdUQygweGRiYjQ1ODQwKSwgV1RDKDB4ZGMwMDQ5NDApLCBXVEMoMHhkYzRjYTI4MCksIFdUQygweGRjOTk2NTAwKSwgV1RDKDB4ZGNlNjkxNDApLAotV1RDKDB4ZGQzNDI3ODApLCBXVEMoMHhkZDgyMjcwMCksIFdUQygweGRkZDA4YTgwKSwgV1RDKDB4ZGUxZjRkMDApLCBXVEMoMHhkZTZlNmVjMCksIFdUQygweGRlYmRlYzQwKSwgV1RDKDB4ZGYwZGJhODApLCBXVEMoMHhkZjVkZDU0MCksCi1XVEMoMHhkZmFlM2NjMCksIFdUQygweGRmZmYwNTAwKSwgV1RDKDB4ZTA1MDUxNDApLCBXVEMoMHhlMGEyMjk4MCksIFdUQygweGUwZjQ4OGUwKSwgV1RDKDB4ZTE0NzYxODApLCBXVEMoMHhlMTlhYTQ4MCksIFdUQygweGUxZWU0ZDgwKSwKLVdUQygweGUyNDI1NDAwKSwgV1RDKDB4ZTI5Njg5YTApLCBXVEMoMHhlMmVhY2Q2MCksIFdUQygweGUzM2YyNDIwKSwgV1RDKDB4ZTM5M2EzMDApLCBXVEMoMHhlM2U4N2YyMCksIFdUQygweGU0M2RjZWUwKSwgV1RDKDB4ZTQ5MzhhODApLAotV1RDKDB4ZTRlOWIwYTApLCBXVEMoMHhlNTQwNDMwMCksIFdUQygweGU1OTczZTYwKSwgV1RDKDB4ZTVlZTliODApLCBXVEMoMHhlNjQ2NDllMCksIFdUQygweGU2OWUzN2UwKSwgV1RDKDB4ZTZmNjVlYzApLCBXVEMoMHhlNzRlYjZjMCksCi1XVEMoMHhlN2E3MzAwMCksIFdUQygweGU3ZmZiZTQwKSwgV1RDKDB4ZTg1ODVlZTApLCBXVEMoMHhlOGIxMDc0MCksIFdUQygweGU5MDk5YzQwKSwgV1RDKDB4ZTk2MjE0ZTApLCBXVEMoMHhlOWJhNzlhMCksIFdUQygweGVhMTJlN2MwKSwKLVdUQygweGVhNmI4OWMwKSwgV1RDKDB4ZWFjNDY1ODApLCBXVEMoMHhlYjFkNzI2MCksIFdUQygweGViNzZiNjIwKSwgV1RDKDB4ZWJkMDM2YzApLCBXVEMoMHhlYzI5ZTUyMCksIFdUQygweGVjODNhYTYwKSwgV1RDKDB4ZWNkZDVhMDApLAotV1RDKDB4ZWQzNmQ1MDApLCBXVEMoMHhlZDkwMTU0MCksIFdUQygweGVkZTkxMTYwKSwgV1RDKDB4ZWU0MWJjMjApLCBXVEMoMHhlZTlhMGVlMCksIFdUQygweGVlZjIwODYwKSwgV1RDKDB4ZWY0OWE3ZTApLCBXVEMoMHhlZmEwZWMwMCksCi1XVEMoMHhlZmY3ZDFjMCksIFdUQygweGYwNGU1NmIwKSwgV1RDKDB4ZjBhNDc2ZTApLCBXVEMoMHhmMGZhMmY2MCksIFdUQygweGYxNGY4MGUwKSwgV1RDKDB4ZjFhNDZlMTApLCBXVEMoMHhmMWY4ZmU4MCksIFdUQygweGYyNGQzNGEwKSwKLVdUQygweGYyYTEwYmIwKSwgV1RDKDB4ZjJmNDgyMTApLCBXVEMoMHhmMzQ3OWNjMCksIFdUQygweGYzOWE1YmUwKSwgV1RDKDB4ZjNlY2I4ZjApLCBXVEMoMHhmNDNlYWZhMCksIFdUQygweGY0OTAzYjUwKSwgV1RDKDB4ZjRlMTRlODApLAotV1RDKDB4ZjUzMWQ2YTApLCBXVEMoMHhmNTgxYmMxMCksIFdUQygweGY1ZDBlOWMwKSwgV1RDKDB4ZjYxZjUyNTApLCBXVEMoMHhmNjZjZTZlMCksIFdUQygweGY2Yjk5MzMwKSwgV1RDKDB4ZjcwNTRlYjApLCBXVEMoMHhmNzUwMWYyMCksCi1XVEMoMHhmNzlhMDc1MCksIFdUQygweGY3ZTMwNzAwKSwgV1RDKDB4ZjgyYjJmYzApLCBXVEMoMHhmODcyYTEzOCksIFdUQygweGY4Yjk3ZjE4KSwgV1RDKDB4ZjhmZmU2NjgpLCBXVEMoMHhmOTQ1ZTUzOCksIFdUQygweGY5OGI4ODYwKSwKLVdUQygweGY5ZDBmMzgwKSwgV1RDKDB4ZmExNjUxNDgpLCBXVEMoMHhmYTViYjhhOCksIFdUQygweGZhYTEzZGY4KSwgV1RDKDB4ZmFlNmZiMDApLCBXVEMoMHhmYjJjZjhjOCksIFdUQygweGZiNzMyYTgwKSwgV1RDKDB4ZmJiOTc5MTApLAotV1RDKDB4ZmJmZmNkMTApLCBXVEMoMHhmYzQ2MzQ3OCksIFdUQygweGZjOGNkM2ZjKSwgV1RDKDB4ZmNkM2JlNWMpLCBXVEMoMHhmZDFhZmE5MCksIFdUQygweGZkNjJhYTg0KSwgV1RDKDB4ZmRhYjAyODgpLCBXVEMoMHhmZGY0MDRiNCksCi1XVEMoMHhmZTNkMzAwNiksIFdUQygweGZlODViMjBlKSwgV1RDKDB4ZmVjY2E0Y2MpLCBXVEMoMHhmZjEwZDU1OSksIFdUQygweGZmNTA1NzliKSwgV1RDKDB4ZmY4YTQwZDIpLCBXVEMoMHhmZmI3ZDg2ZSksIFdUQygweGZmZWY2YmJiKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAotV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCi1XVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKLVdUQygweGJmZjY3YTAxKSwgV1RDKDB4YmZlY2FhODEpLCBXVEMoMHhiZmUyZDkwMSksIFdUQygweGJmZDkwNjAxKSwgV1RDKDB4YmZjZjMxODEpLCBXVEMoMHhiZmM1NWM4MSksIFdUQygweGJmYmI4NzAxKSwgV1RDKDB4YmZiMWIxMDEpLAotV1RDKDB4YmZhN2RjMDEpLCBXVEMoMHhiZjllMDcwMSksIFdUQygweGJmOTQzMzAxKSwgV1RDKDB4YmY4YTVmODEpLCBXVEMoMHhiZjgwOGI4MSksIFdUQygweGJmNzZiNzAxKSwgV1RDKDB4YmY2Y2UyMDEpLCBXVEMoMHhiZjYzMGQ4MSksCi1XVEMoMHhiZjU5M2EwMSksIFdUQygweGJmNGY2ODAxKSwgV1RDKDB4YmY0NTk2ODEpLCBXVEMoMHhiZjNiYzYwMSksIFdUQygweGJmMzFmNTAxKSwgV1RDKDB4YmYyODI1MDEpLCBXVEMoMHhiZjFlNTUwMSksIFdUQygweGJmMTQ4NjgxKSwKLVdUQygweGJmMGFiYTAxKSwgV1RDKDB4YmYwMGVmODEpLCBXVEMoMHhiZWY3MjY4MSksIFdUQygweGJlZWQ1ZjAxKSwgV1RDKDB4YmVlMzk4MDEpLCBXVEMoMHhiZWQ5ZDI4MSksIFdUQygweGJlZDAwZjgxKSwgV1RDKDB4YmVjNjRlODEpLAotV1RDKDB4YmViYzkxODEpLCBXVEMoMHhiZWIyZDY4MSksIFdUQygweGJlYTkxZjAxKSwgV1RDKDB4YmU5ZjY5MDEpLCBXVEMoMHhiZTk1YjU4MSksIFdUQygweGJlOGMwNTAxKSwgV1RDKDB4YmU4MjU4MDEpLCBXVEMoMHhiZTc4YjAwMSksCi1XVEMoMHhiZTZmMGMwMSksIFdUQygweGJlNjU2YzAxKSwgV1RDKDB4YmU1YmQwMDEpLCBXVEMoMHhiZTUyMzc4MSksIFdUQygweGJlNDhhMzAxKSwgV1RDKDB4YmUzZjEzODEpLCBXVEMoMHhiZTM1ODkwMSksIFdUQygweGJlMmMwNTAxKSwKLVdUQygweGJlMjI4NjgxKSwgV1RDKDB4YmUxOTBkODEpLCBXVEMoMHhiZTBmOWEwMSksIFdUQygweGJlMDYyYjgxKSwgV1RDKDB4YmRmY2MzMDEpLCBXVEMoMHhiZGYzNjEwMSksIFdUQygweGJkZWEwNjgxKSwgV1RDKDB4YmRlMGIzMDEpLAotV1RDKDB4YmRkNzY3MDEpLCBXVEMoMHhiZGNlMjE4MSksIFdUQygweGJkYzRlMzAxKSwgV1RDKDB4YmRiYmFiMDEpLCBXVEMoMHhiZGIyN2IwMSksIFdUQygweGJkYTk1MzAxKSwgV1RDKDB4YmRhMDMzODEpLCBXVEMoMHhiZDk3MWM4MSksCi1XVEMoMHhiZDhlMGUwMSksIFdUQygweGJkODUwNzAxKSwgV1RDKDB4YmQ3YzA3ODEpLCBXVEMoMHhiZDczMTA4MSksIFdUQygweGJkNmEyMjAxKSwgV1RDKDB4YmQ2MTNkODEpLCBXVEMoMHhiZDU4NjI4MSksIFdUQygweGJkNGY5MTAxKSwKLVdUQygweGJkNDZjODAxKSwgV1RDKDB4YmQzZTA4MDEpLCBXVEMoMHhiZDM1NTA4MSksIFdUQygweGJkMmNhMjgxKSwgV1RDKDB4YmQyM2ZmMDEpLCBXVEMoMHhiZDFiNjUwMSksIFdUQygweGJkMTJkNTgxKSwgV1RDKDB4YmQwYTRmODEpLAotV1RDKDB4YmQwMWQyODEpLCBXVEMoMHhiY2Y5NWU4MSksIFdUQygweGJjZjBmMzgxKSwgV1RDKDB4YmNlODkyODEpLCBXVEMoMHhiY2UwM2I4MSksIFdUQygweGJjZDdlZjAxKSwgV1RDKDB4YmNjZmFjMDEpLCBXVEMoMHhiY2M3NzE4MSksCi1XVEMoMHhiY2JmNDAwMSksIFdUQygweGJjYjcxNzAxKSwgV1RDKDB4YmNhZWY3MDEpLCBXVEMoMHhiY2E2ZTEwMSksIFdUQygweGJjOWVkNDgxKSwgV1RDKDB4YmM5NmQxMDEpLCBXVEMoMHhiYzhlZDcwMSksIFdUQygweGJjODZlNTgxKSwKLVdUQygweGJjN2VmYzgxKSwgV1RDKDB4YmM3NzFjMDEpLCBXVEMoMHhiYzZmNDQwMSksIFdUQygweGJjNjc3NTAxKSwgV1RDKDB4YmM1ZmFlODEpLCBXVEMoMHhiYzU3ZjEwMSksIFdUQygweGJjNTAzYjgxKSwgV1RDKDB4YmM0ODhlODEpLAotV1RDKDB4YmM0MGU4ODEpLCBXVEMoMHhiYzM5NDkwMSksIFdUQygweGJjMzFhZjAxKSwgV1RDKDB4YmMyYTFhODEpLCBXVEMoMHhiYzIyOGYwMSksIFdUQygweGJjMWIxMDgxKSwgV1RDKDB4YmMxM2E0ODEpLCBXVEMoMHhiYzBjNDU4MSksCi1XVEMoMHhiYzA0ZTM4MSksIFdUQygweGJiZmQ2YzAxKSwgV1RDKDB4YmJmNWQxODEpLCBXVEMoMHhiYmVlMmY4MSksIFdUQygweGJiZTZjODAxKSwgV1RDKDB4YmJkZmRiODEpLCBXVEMoMHhiYmQ5YTc4MSksIFdUQygweGJiZDQ1ODgxKSwKLVdUQygweGJiZDAxMzAxKSwgV1RDKDB4YmJjY2ZjODEpLCBXVEMoMHhiYmNiMjI4MSksIFdUQygweGJiY2E1ZDAxKSwgV1RDKDB4YmJjYTc0ODEpLCBXVEMoMHhiYmNiMzIwMSksIFdUQygweGJiY2M2YjAxKSwgV1RDKDB4YmJjZTA2MDEpLAotV1RDKDB4YmJjZmVhODEpLCBXVEMoMHhiYmQyMDMwMSksIFdUQygweGJiZDQ1NjAxKSwgV1RDKDB4YmJkNzAyMDEpLCBXVEMoMHhiYmRhMjUwMSksIFdUQygweGJiZGRkYjAxKSwgV1RDKDB4YmJlMjMyODEpLCBXVEMoMHhiYmU3MzIwMSksCi1XVEMoMHhiYmVjZTI4MSksIFdUQygweGJiZjM0MjgxKSwgV1RDKDB4YmJmYTNjMDEpLCBXVEMoMHhiYzAxYjM4MSksIFdUQygweGJjMDk4ZDgxKSwgV1RDKDB4YmMxMWI2ODEpLCBXVEMoMHhiYzFhMjQwMSksIFdUQygweGJjMjJjZDgxKSwKLVdUQygweGJjMmJhYjAxKSwgV1RDKDB4YmMzNGMwODEpLCBXVEMoMHhiYzNlMTk4MSksIFdUQygweGJjNDdjMjgxKSwgV1RDKDB4YmM1MWNiMDEpLCBXVEMoMHhiYzVjNGM4MSksIFdUQygweGJjNjc2NTAxKSwgV1RDKDB4YmM3MzM0MDEpLAotV1RDKDB4YmM3ZmQzMDEpLCBXVEMoMHhiYzhkNTEwMSksIFdUQygweGJjOWJiOTAxKSwgV1RDKDB4YmNhYjE3ODEpLCBXVEMoMHhiY2JiNzAwMSksIFdUQygweGJjY2NiZDAxKSwgV1RDKDB4YmNkZWY3MDEpLCBXVEMoMHhiY2YyMTYwMSksCi1XVEMoMHhiZDA2MGM4MSksIFdUQygweGJkMWFjODAxKSwgV1RDKDB4YmQzMDM1ODEpLCBXVEMoMHhiZDQ2NDI4MSksIFdUQygweGJkNWNlMjgxKSwgV1RDKDB4YmQ3NDBiODEpLCBXVEMoMHhiZDhiYjI4MSksIFdUQygweGJkYTNkMDgxKSwKLVdUQygweGJkYmM2MzgxKSwgV1RDKDB4YmRkNTZiODEpLCBXVEMoMHhiZGVlZTk4MSksIFdUQygweGJlMDhlMTgxKSwgV1RDKDB4YmUyMzYwMDEpLCBXVEMoMHhiZTNlNzIwMSksIFdUQygweGJlNWEyMzAxKSwgV1RDKDB4YmU3NjdlODEpLAotV1RDKDB4YmU5MzhjODEpLCBXVEMoMHhiZWIxNTcwMSksIFdUQygweGJlY2ZlNjAxKSwgV1RDKDB4YmVlZjQ2MDEpLCBXVEMoMHhiZjBmODMwMSksIFdUQygweGJmMzBhOTAxKSwgV1RDKDB4YmY1MmMxMDEpLCBXVEMoMHhiZjc1Y2M4MSksCi1XVEMoMHhiZjk5Y2IwMSksIFdUQygweGJmYmViYjgxKSwgV1RDKDB4YmZlNDg5ODEpLCBXVEMoMHhjMDBiMDRjMCksIFdUQygweGMwMzFmODgwKSwgV1RDKDB4YzA1OTMzNDApLCBXVEMoMHhjMDgwOTI4MCksIFdUQygweGMwYTgwMmMwKSwKLVdUQygweGMwY2Y2ZWMwKSwgV1RDKDB4YzBmNmNjMDApLCBXVEMoMHhjMTFlM2E4MCksIFdUQygweGMxNDVmMDQwKSwgV1RDKDB4YzE2ZTIyYzApLCBXVEMoMHhjMTk2ZmIwMCksIFdUQygweGMxYzA4NjgwKSwgV1RDKDB4YzFlYWNhMDApLAotV1RDKDB4YzIxNWNiYzApLCBXVEMoMHhjMjQxODk0MCksIFdUQygweGMyNmRmNWMwKSwgV1RDKDB4YzI5YjAyYzApLCBXVEMoMHhjMmM4YTE0MCksIFdUQygweGMyZjZiNTAwKSwgV1RDKDB4YzMyNTE3NDApLCBXVEMoMHhjMzUzYTBjMCksCi1XVEMoMHhjMzgyMmMwMCksIFdUQygweGMzYjA5OTQwKSwgV1RDKDB4YzNkZWNjYzApLCBXVEMoMHhjNDBjYTgwMCksIFdUQygweGM0M2EyOGMwKSwgV1RDKDB4YzQ2NzhhMDApLCBXVEMoMHhjNDk1MTc4MCksIFdUQygweGM0YzMxZDAwKSwKLVdUQygweGM0ZjFiZGMwKSwgV1RDKDB4YzUyMGU4NDApLCBXVEMoMHhjNTUwODQ0MCksIFdUQygweGM1ODA3OTAwKSwgV1RDKDB4YzViMDllODApLCBXVEMoMHhjNWUwYmZjMCksIFdUQygweGM2MTBhNzQwKSwgV1RDKDB4YzY0MDI5YzApLAotV1RDKDB4YzY2ZjQ5YzApLCBXVEMoMHhjNjllMjE4MCksIFdUQygweGM2Y2NjYTQwKSwgV1RDKDB4YzZmYjU3MDApLCBXVEMoMHhjNzI5Y2M4MCksIFdUQygweGM3NTgyYjQwKSwgV1RDKDB4Yzc4Njc0ODApLCBXVEMoMHhjN2I0YTQ4MCksCi1XVEMoMHhjN2UyYWZjMCksIFdUQygweGM4MTA4YTgwKSwgV1RDKDB4YzgzZTI4YzApLCBXVEMoMHhjODZiN2YwMCksIFdUQygweGM4OTg4MTAwKSwgV1RDKDB4YzhjNTIzNDApLCBXVEMoMHhjOGYxNTk4MCksIFdUQygweGM5MWQxODQwKSwKLVdUQygweGI0ZDZhMzgxKSwgV1RDKDB4YjQ0MjJiODEpLCBXVEMoMHhiM2FlODYwMSksIFdUQygweGIzMWJiMzAxKSwgV1RDKDB4YjI4OWIxODEpLCBXVEMoMHhiMWY4ODE4MSksIFdUQygweGIxNjgyMjgxKSwgV1RDKDB4YjBkODk0MDEpLAotV1RDKDB4YjA0OWQ2MDEpLCBXVEMoMHhhZmJiZTgwMSksIFdUQygweGFmMmVjOTAxKSwgV1RDKDB4YWVhMjc2ODEpLCBXVEMoMHhhZTE2ZjAwMSksIFdUQygweGFkOGMzMzAxKSwgV1RDKDB4YWQwMjNmMDEpLCBXVEMoMHhhYzc5MTQwMSksCi1XVEMoMHhhYmYwYjE4MSksIFdUQygweGFiNjkxNjgxKSwgV1RDKDB4YWFlMjQzMDEpLCBXVEMoMHhhYTVjMzYwMSksIFdUQygweGE5ZDZlZjAxKSwgV1RDKDB4YTk1MjZkODEpLCBXVEMoMHhhOGNlYjIwMSksIFdUQygweGE4NGJiYjgxKSwKLVdUQygweGE3Yzk4YjAxKSwgV1RDKDB4YTc0ODIxMDEpLCBXVEMoMHhhNmM3N2UwMSksIFdUQygweGE2NDdhMzAxKSwgV1RDKDB4YTVjODkwMDEpLCBXVEMoMHhhNTRhNDcwMSksIFdUQygweGE0Y2NjOTAxKSwgV1RDKDB4YTQ1MDE2MDEpLAotV1RDKDB4YTNkNDMwMDEpLCBXVEMoMHhhMzU5MTgwMSksIFdUQygweGEyZGVjZTgxKSwgV1RDKDB4YTI2NTU1ODEpLCBXVEMoMHhhMWVjYWUwMSksIFdUQygweGExNzRkYTgxKSwgV1RDKDB4YTBmZGRkODEpLCBXVEMoMHhhMDg3Yjk4MSksCi1XVEMoMHhhMDEyNzA4MSksIFdUQygweDlmOWUwMzAxKSwgV1RDKDB4OWYyYTcyODEpLCBXVEMoMHg5ZWI3YzEwMSksIFdUQygweDllNDVmMDgxKSwgV1RDKDB4OWRkNTA0ODEpLCBXVEMoMHg5ZDY1MDA4MSksIFdUQygweDljZjVlNzAxKSwKLVdUQygweDljODdiYTgxKSwgV1RDKDB4OWMxYTdjODEpLCBXVEMoMHg5YmFlMmY4MSksIFdUQygweDliNDJkNTgxKSwgV1RDKDB4OWFkODcwODEpLCBXVEMoMHg5YTZmMDM4MSksIFdUQygweDlhMDY5MDAxKSwgV1RDKDB4OTk5ZjE5ODEpLAotV1RDKDB4OTkzOGEyODEpLCBXVEMoMHg5OGQzMmQ4MSksIFdUQygweDk4NmViZDgxKSwgV1RDKDB4OTgwYjU1MDEpLCBXVEMoMHg5N2E4ZjY4MSksIFdUQygweDk3NDdhNDgxKSwgV1RDKDB4OTZlNzYxMDEpLCBXVEMoMHg5Njg4MmUwMSksCi1XVEMoMHg5NjJhMGM4MSksIFdUQygweDk1Y2NmZjAxKSwgV1RDKDB4OTU3MTA2MDEpLCBXVEMoMHg5NTE2MjM4MSksIFdUQygweDk0YmM1OTgxKSwgV1RDKDB4OTQ2M2E4ODEpLCBXVEMoMHg5NDBjMTI4MSksIFdUQygweDkzYjU5OTAxKSwKLVdUQygweDkzNjAzZDAxKSwgV1RDKDB4OTMwYmZmODEpLCBXVEMoMHg5MmI4ZTEwMSksIFdUQygweDkyNjZlMjgxKSwgV1RDKDB4OTIxNjAzMDEpLCBXVEMoMHg5MWM2NDMwMSksIFdUQygweDkxNzdhMzAxKSwgV1RDKDB4OTEyYTIyMDEpLAotV1RDKDB4OTBkZGMwMDEpLCBXVEMoMHg5MDkyN2I4MSksIFdUQygweDkwNDg1NDAxKSwgV1RDKDB4OGZmZjQ2MDEpLCBXVEMoMHg4ZmI3NGY4MSksIFdUQygweDhmNzA2ZjAxKSwgV1RDKDB4OGYyYWExMDEpLCBXVEMoMHg4ZWU1ZTMwMSksCi1XVEMoMHg4ZWEyMzIwMSksIFdUQygweDhlNWY4ODgxKSwgV1RDKDB4OGUxZGUwMDEpLCBXVEMoMHg4ZGRkMzIwMSksIFdUQygweDhkOWQ3NzgxKSwgV1RDKDB4OGQ1ZWFhMDEpLCBXVEMoMHg4ZDIwYzMwMSksIFdUQygweDhjZTNiYTgxKSwKLVdUQygweDhjYTc4NzgxKSwgV1RDKDB4OGM2YzFiMDEpLCBXVEMoMHg4YzMxNjY4MSksIFdUQygweDhiZjc1YjAxKSwgV1RDKDB4OGJiZGU5ODEpLCBXVEMoMHg4Yjg1MDI4MSksIFdUQygweDhiNGM5NzAxKSwgV1RDKDB4OGIxNDk3MDEpLAotV1RDKDB4OGFkY2VlMDEpLCBXVEMoMHg4YWE1ODY4MSksIFdUQygweDhhNmU0YTAxKSwgV1RDKDB4OGEzNzI4ODEpLCBXVEMoMHg4YTAwMWYwMSksIFdUQygweDg5YzkyZjgxKSwgV1RDKDB4ODk5MjVhODEpLCBXVEMoMHg4OTViY2QwMSksCi1XVEMoMHg4OTI1ZjEwMSksIFdUQygweDg4ZjEzODAxKSwgV1RDKDB4ODhiZTE2ODEpLCBXVEMoMHg4ODhkMzE4MSksIFdUQygweDg4NWY4NDgxKSwgV1RDKDB4ODgzNTM1MDEpLCBXVEMoMHg4ODEyNDI4MSksIFdUQygweDg3ZTczZDgxKSwKLVdUQygweDg3ZDRhYzgxKSwgV1RDKDB4ODdjYjUxMDEpLCBXVEMoMHg4N2MwNWU4MSksIFdUQygweDg3YjQyNDgxKSwgV1RDKDB4ODdhNzBlODEpLCBXVEMoMHg4Nzk5OGYwMSksIFdUQygweDg3OGMxODgxKSwgV1RDKDB4ODc3ZWRlMDEpLAotV1RDKDB4ODc3MWM2MDEpLCBXVEMoMHg4NzY0YjEwMSksIFdUQygweDg3NTc4MTgxKSwgV1RDKDB4ODc0YTJmMDEpLCBXVEMoMHg4NzNjYzIwMSksIFdUQygweDg3MmY0MjAxKSwgV1RDKDB4ODcyMWI0ODEpLCBXVEMoMHg4NzE0MWIwMSksCi1XVEMoMHg4NzA2NzI4MSksIFdUQygweDg2ZjhiYTgxKSwgV1RDKDB4ODZlYWYwODEpLCBXVEMoMHg4NmRkMTQ4MSksIFdUQygweDg2Y2YyNjAxKSwgV1RDKDB4ODZjMTI0MDEpLCBXVEMoMHg4NmIzMGYwMSksIFdUQygweDg2YTRlNzgxKSwKLVdUQygweDg2OTZhZDAxKSwgV1RDKDB4ODY4ODYwMDEpLCBXVEMoMHg4NjdhMDA4MSksIFdUQygweDg2NmI4ZDgxKSwgV1RDKDB4ODY1ZDA1ODEpLCBXVEMoMHg4NjRlNjkwMSksIFdUQygweDg2M2ZiNzAxKSwgV1RDKDB4ODYzMGYxODEpLAotV1RDKDB4ODYyMjE4MDEpLCBXVEMoMHg4NjEzMmMwMSksIFdUQygweDg2MDQyYzAxKSwgV1RDKDB4ODVmNTE2ODEpLCBXVEMoMHg4NWU1ZWI4MSksIFdUQygweDg1ZDZhOTgxKSwgV1RDKDB4ODVjNzUyMDEpLCBXVEMoMHg4NWI3ZTYwMSksCi1XVEMoMHg4NWE4NjU4MSksIFdUQygweDg1OThkMDgxKSwgV1RDKDB4ODU4OTI2ODEpLCBXVEMoMHg4NTc5NjYwMSksIFdUQygweDg1Njk4ZTgxKSwgV1RDKDB4ODU1OWEwODEpLCBXVEMoMHg4NTQ5OWQwMSksIFdUQygweDg1Mzk4NDgxKSwKLVdUQygweDg1Mjk1ODgxKSwgV1RDKDB4ODUxOTE4MDEpLCBXVEMoMHg4NTA4YzE4MSksIFdUQygweDg0Zjg1NTgxKSwgV1RDKDB4ODRlN2QzODEpLCBXVEMoMHg4NGQ3M2MwMSksIFdUQygweDg0YzY5MTAxKSwgV1RDKDB4ODRiNWQzMDEpLAotV1RDKDB4ODRhNTAyMDEpLCBXVEMoMHg4NDk0MWQ4MSksIFdUQygweDg0ODMyNDgxKSwgV1RDKDB4ODQ3MjE3MDEpLCBXVEMoMHg4NDYwZjU4MSksIFdUQygweDg0NGZjMDgxKSwgV1RDKDB4ODQzZTdhODEpLCBXVEMoMHg4NDJkMjI4MSksCi1XVEMoMHg4NDFiYjk4MSksIFdUQygweDg0MGEzZTgxKSwgV1RDKDB4ODNmOGIwMDEpLCBXVEMoMHg4M2U3MGYwMSksIFdUQygweDgzZDU1ZDAxKSwgV1RDKDB4ODNjMzlhODEpLCBXVEMoMHg4M2IxYzg4MSksIFdUQygweDgzOWZlODAxKSwKLVdUQygweDgzOGRmODAxKSwgV1RDKDB4ODM3YmY4MDEpLCBXVEMoMHg4MzY5ZTc4MSksIFdUQygweDgzNTdjNzAxKSwgV1RDKDB4ODM0NTk4ODEpLCBXVEMoMHg4MzMzNWM4MSksIFdUQygweDgzMjExNTAxKSwgV1RDKDB4ODMwZWMwODEpLAotV1RDKDB4ODJmYzVmMDEpLCBXVEMoMHg4MmU5ZWYwMSksIFdUQygweDgyZDc3MjAxKSwgV1RDKDB4ODJjNGU4MDEpLCBXVEMoMHg4MmIyNTMwMSksIFdUQygweDgyOWZiNDAxKSwgV1RDKDB4ODI4ZDBiMDEpLCBXVEMoMHg4MjdhNTgwMSksCi1XVEMoMHg4MjY3OTkwMSksIFdUQygweDgyNTRjZjAxKSwgV1RDKDB4ODI0MWZhMDEpLCBXVEMoMHg4MjJmMWIwMSksIFdUQygweDgyMWMzNDAxKSwgV1RDKDB4ODIwOTQ1ODEpLCBXVEMoMHg4MWY2NGYwMSksIFdUQygweDgxZTM0ZjgxKSwKLVdUQygweDgxZDA0NjgxKSwgV1RDKDB4ODFiZDM0MDEpLCBXVEMoMHg4MWFhMTk4MSksIFdUQygweDgxOTZmNzgxKSwgV1RDKDB4ODE4M2NmODEpLCBXVEMoMHg4MTcwYTE4MSksIFdUQygweDgxNWQ2YzAxKSwgV1RDKDB4ODE0YTJmODEpLAotV1RDKDB4ODEzNmVhMDEpLCBXVEMoMHg4MTIzOWQ4MSksIFdUQygweDgxMTA0YTAxKSwgV1RDKDB4ODBmY2YxODEpLCBXVEMoMHg4MGU5OTQwMSksIFdUQygweDgwZDYzMTAxKSwgV1RDKDB4ODBjMmM3ODEpLCBXVEMoMHg4MGFmNTcwMSksCi1XVEMoMHg4MDliZGYwMSksIFdUQygweDgwODg2MDgxKSwgV1RDKDB4ODA3NGRjMDEpLCBXVEMoMHg4MDYxNTI4MSksIFdUQygweDgwNGRjNDgxKSwgV1RDKDB4ODAzYTMzODEpLCBXVEMoMHg4MDI2OWY4MSksIFdUQygweDgwMTMwOTgxKSwKLVdUQygweDBhNjA4MjIwKSwgV1RDKDB4MGE4ZWU3ZDApLCBXVEMoMHgwYWJlMzVjMCksIFdUQygweDBhZWU1ZGUwKSwgV1RDKDB4MGIxZjUyMzApLCBXVEMoMHgwYjUxMDRhMCksIFdUQygweDBiODM2NzIwKSwgV1RDKDB4MGJiNjZiYjApLAotV1RDKDB4MGJlYTA0NDApLCBXVEMoMHgwYzFlMjJjMCksIFdUQygweDBjNTJiYTcwKSwgV1RDKDB4MGM4N2NhOTApLCBXVEMoMHgwY2JkNWJhMCksIFdUQygweDBjZjM3NWUwKSwgV1RDKDB4MGQyYTFmNTApLCBXVEMoMHgwZDYxNTQ4MCksCi1XVEMoMHgwZDk5MGU0MCksIFdUQygweDBkZDE0NTAwKSwgV1RDKDB4MGUwOWY3MzApLCBXVEMoMHgwZTQzMmU5MCksIFdUQygweDBlN2NmNzkwKSwgV1RDKDB4MGViNzVlNTApLCBXVEMoMHgwZWYyNjQzMCksIFdUQygweDBmMmRmZDcwKSwKLVdUQygweDBmNmExZDcwKSwgV1RDKDB4MGZhNmI3ZTApLCBXVEMoMHgwZmUzYzNkMCksIFdUQygweDEwMjEzYWMwKSwgV1RDKDB4MTA1ZjE2NDApLCBXVEMoMHgxMDlkNGYyMCksIFdUQygweDEwZGJkYjgwKSwgV1RDKDB4MTExYWIwYzApLAotV1RDKDB4MTE1OWMzNjApLCBXVEMoMHgxMTk5MGZjMCksIFdUQygweDExZDhhMDYwKSwgV1RDKDB4MTIxODgyYzApLCBXVEMoMHgxMjU4YzQ4MCksIFdUQygweDEyOTk1YTQwKSwgV1RDKDB4MTJkYTFiMDApLCBXVEMoMHgxMzFhZGI2MCksCi1XVEMoMHgxMzViNzBjMCksIFdUQygweDEzOWJiNjgwKSwgV1RDKDB4MTNkYjhjMDApLCBXVEMoMHgxNDFhZDA4MCksIFdUQygweDE0NTk2NDYwKSwgV1RDKDB4MTQ5NzI5ZTApLCBXVEMoMHgxNGQ0MDRlMCksIFdUQygweDE1MGZkOGUwKSwKLVdUQygweDE1NGE4OGMwKSwgV1RDKDB4MTU4M2Y1ZTApLCBXVEMoMHgxNWJjMDEyMCksIFdUQygweDE1ZjI4YmEwKSwgV1RDKDB4MTYyNzc5YTApLCBXVEMoMHgxNjVhYjMwMCksIFdUQygweDE2OGMyMDQwKSwgV1RDKDB4MTZiYmFhODApLAotV1RDKDB4MTZlOTQxMjApLCBXVEMoMHgxNzE0ZDllMCksIFdUQygweDE3M2U2NDQwKSwgV1RDKDB4MTc2NjA2ODApLCBXVEMoMHgxNzhjYTAyMCksIFdUQygweDE3YjM2NDAwKSwgV1RDKDB4MTdkYjg0ZTApLCBXVEMoMHgxODA1ZDkyMCksCi1XVEMoMHgxODMyODQwMCksIFdUQygweDE4NjE3Y2MwKSwgV1RDKDB4MTg5MmJmYTApLCBXVEMoMHgxOGM2NDU0MCksIFdUQygweDE4ZmMwNDAwKSwgV1RDKDB4MTkzM2YxNDApLCBXVEMoMHgxOTZlMDMyMCksIFdUQygweDE5YWEyZmMwKSwKLVdUQygweDE5ZTg2ZDgwKSwgV1RDKDB4MWEyOGIyZTApLCBXVEMoMHgxYTZhZjcwMCksIFdUQygweDFhYWYzMzIwKSwgV1RDKDB4MWFmNTYxODApLCBXVEMoMHgxYjNkN2NlMCksIFdUQygweDFiODc3YzQwKSwgV1RDKDB4MWJkMzUwYzApLAotV1RDKDB4MWMyMGVhNDApLCBXVEMoMHgxYzcwMzg0MCksIFdUQygweDFjYzEzODYwKSwgV1RDKDB4MWQxM2Y3NjApLCBXVEMoMHgxZDY4ODQyMCksIFdUQygweDFkYmVlZDQwKSwgV1RDKDB4MWUxNzQ2NjApLCBXVEMoMHgxZTcxYTY0MCksCi1XVEMoMHgxZWNlMjQwMCksIFdUQygweDFmMmNkMjIwKSwgV1RDKDB4MWY4ZGIzYzApLCBXVEMoMHgxZmYwYzNlMCksIFdUQygweDIwNTYwMDgwKSwgV1RDKDB4MjBiZDQ2YzApLCBXVEMoMHgyMTI2MzQwMCksIFdUQygweDIxOTA1NzQwKSwKLVdUQygweDIxZmI0MTAwKSwgV1RDKDB4MjI2NmJhODApLCBXVEMoMHgyMmQyZDE0MCksIFdUQygweDIzM2Y5NzgwKSwgV1RDKDB4MjNhZDI1YzApLCBXVEMoMHgyNDFiYzgwMCksIFdUQygweDI0OGJmMDQwKSwgV1RDKDB4MjRmZTEzODApLAotV1RDKDB4MjU3MjgxODApLCBXVEMoMHgyNWU5MGEwMCksIFdUQygweDI2NjE0MDgwKSwgV1RDKDB4MjZkYWJkYzApLCBXVEMoMHgyNzU1MjU0MCksIFdUQygweDI3ZDAzMjAwKSwgV1RDKDB4Mjg0YmE1ODApLCBXVEMoMHgyOGM3NDBjMCksCi1XVEMoMHgyOTQzMWY4MCksIFdUQygweDI5YmZjOWMwKSwgV1RDKDB4MmEzZGQwODApLCBXVEMoMHgyYWJkYzAwMCksIFdUQygweDJiM2ZmZDAwKSwgV1RDKDB4MmJjNGNkODApLCBXVEMoMHgyYzRjN2Q0MCksIFdUQygweDJjZDcyZWMwKSwKLVdUQygweDJkNjQ3ZjgwKSwgV1RDKDB4MmRmM2NkODApLCBXVEMoMHgyZTg0N2Q4MCksIFdUQygweDJmMTVlYTQwKSwgV1RDKDB4MmZhNzYwYzApLCBXVEMoMHgzMDM4MmI4MCksIFdUQygweDMwYzc5NDQwKSwgV1RDKDB4MzE1NTY2YzApLAotV1RDKDB4MzFlMjA4MDApLCBXVEMoMHgzMjZkZTdjMCksIFdUQygweDMyZjk4MjAwKSwgV1RDKDB4MzM4NWJhMDApLCBXVEMoMHgzNDEzYmVjMCksIFdUQygweDM0YTRjNDgwKSwgV1RDKDB4MzUzOWJmMDApLCBXVEMoMHgzNWQyYzRjMCksCi1XVEMoMHgzNjZmODM0MCksIFdUQygweDM3MGZiODAwKSwgV1RDKDB4MzdiMmNmODApLCBXVEMoMHgzODU3YTQ4MCksIFdUQygweDM4ZmNlZTgwKSwgV1RDKDB4MzlhMTY4NDApLCBXVEMoMHgzYTQ0MjJjMCksIFdUQygweDNhZTQ5NWMwKSwKLVdUQygweDNiODI0MDAwKSwgV1RDKDB4M2MxY2I1MDApLCBXVEMoMHgzY2I0MzhjMCksIFdUQygweDNkNDk5NGMwKSwgV1RDKDB4M2RkZDhmNDApLCBXVEMoMHgzZTcwZWMwMCksIFdUQygweDNmMDQ1ZTQwKSwgV1RDKDB4M2Y5ODkwODApLAotV1RDKDB4NDAyZTMyZmYpLCBXVEMoMHg0MGM1YzA3ZiksIFdUQygweDQxNWY1NDdmKSwgV1RDKDB4NDFmYWYwN2YpLCBXVEMoMHg0Mjk4OTk3ZiksIFdUQygweDQzMzgzMDdmKSwgV1RDKDB4NDNkOTZiZmYpLCBXVEMoMHg0NDdiZmZmZiksCi1XVEMoMHg0NTFmOWNmZiksIFdUQygweDQ1YzNkYWZmKSwgV1RDKDB4NDY2ODNlZmYpLCBXVEMoMHg0NzBjNGNmZiksIFdUQygweDQ3YWY5M2ZmKSwgV1RDKDB4NDg1MWMzZmYpLCBXVEMoMHg0OGYyOWQ3ZiksIFdUQygweDQ5OTFkZTdmKSwKLVdUQygweDRhMmY1ZTdmKSwgV1RDKDB4NGFjYjI4N2YpLCBXVEMoMHg0YjY1NTM3ZiksIFdUQygweDRiZmRmMzdmKSwgV1RDKDB4NGM5NTMzN2YpLCBXVEMoMHg0ZDJiNTFmZiksIFdUQygweDRkYzA5MWZmKSwgV1RDKDB4NGU1NTMzZmYpLAotV1RDKDB4NGVlOTZiN2YpLCBXVEMoMHg0ZjdkNjFmZiksIFdUQygweDUwMTE0MGZmKSwgV1RDKDB4NTBhNTMxN2YpLCBXVEMoMHg1MTM5NWE3ZiksIFdUQygweDUxY2RkZjdmKSwgV1RDKDB4NTI2MmU2ZmYpLCBXVEMoMHg1MmY4ODVmZiksCi1XVEMoMHg1MzhlYjQ3ZiksIFdUQygweDU0MjU2MGZmKSwgV1RDKDB4NTRiYzdiN2YpLCBXVEMoMHg1NTUzYThmZiksIFdUQygweDU1ZWEzNWZmKSwgV1RDKDB4NTY3ZjY2ZmYpLCBXVEMoMHg1NzEyODk3ZiksIFdUQygweDU3YTMzYTdmKSwKLVdUQygweDU4MzE1MmZmKSwgV1RDKDB4NThiY2E1ZmYpLCBXVEMoMHg1OTQ1MzBmZiksIFdUQygweDU5Y2I3OWZmKSwgV1RDKDB4NWE1MDQ3ZmYpLCBXVEMoMHg1YWQ0NWVmZiksIFdUQygweDViNTg0ZTdmKSwgV1RDKDB4NWJkYzQxN2YpLAotV1RDKDB4NWM2MDQ4N2YpLCBXVEMoMHg1Y2U0NzZmZiksIFdUQygweDVkNjhjNDdmKSwgV1RDKDB4NWRlZDA2ZmYpLCBXVEMoMHg1ZTcxMTFmZiksIFdUQygweDVlZjRiNWZmKSwgV1RDKDB4NWY3N2ExN2YpLCBXVEMoMHg1ZmY5NmFmZiksCi1XVEMoMHg2MDc5YTdmZiksIFdUQygweDYwZjdmN2ZmKSwgV1RDKDB4NjE3NDE3ZmYpLCBXVEMoMHg2MWVkZDg3ZiksIFdUQygweDYyNjRmZmZmKSwgV1RDKDB4NjJkOWE2ZmYpLCBXVEMoMHg2MzRjODE3ZiksIFdUQygweDYzYmU2NTdmKSwKLVdUQygweDY0MzAyNzdmKSwgV1RDKDB4NjRhMjI0N2YpLCBXVEMoMHg2NTE0MmJmZiksIFdUQygweDY1ODYwMjdmKSwgV1RDKDB4NjVmNzY5N2YpLCBXVEMoMHg2NjY4MDFmZiksIFdUQygweDY2ZDc1NmZmKSwgV1RDKDB4Njc0NGYwZmYpLAotV1RDKDB4NjdiMDc4N2YpLCBXVEMoMHg2ODFhMDc3ZiksIFdUQygweDY4ODFlYmZmKSwgV1RDKDB4NjhlODcwN2YpLCBXVEMoMHg2OTRkY2VmZiksIFdUQygweDY5YjIxZTdmKSwgV1RDKDB4NmExNTZjZmYpLCBXVEMoMHg2YTc3Y2E3ZiksCi1XVEMoMHg2YWQ5Mzc3ZiksIFdUQygweDZiMzlhNGZmKSwgV1RDKDB4NmI5OTAxZmYpLCBXVEMoMHg2YmY3M2NmZiksIFdUQygweDZjNTQ0NTdmKSwgV1RDKDB4NmNiMDBhZmYpLCBXVEMoMHg2ZDBhN2JmZiksIFdUQygweDZkNjM4N2ZmKSwKLVdUQygweGFlMmNiZTAxKSwgV1RDKDB4YWY1MjZkMDEpLCBXVEMoMHhiMDc1MTIwMSksIFdUQygweGIxOTRkYTgxKSwgV1RDKDB4YjJiMWY0MDEpLCBXVEMoMHhiM2NjOGQwMSksIFdUQygweGI0ZTRkMjAxKSwgV1RDKDB4YjVmYWYxMDEpLAotV1RDKDB4YjcwZjE4ODEpLCBXVEMoMHhiODIxNzMwMSksIFdUQygweGI5MzIxMTgxKSwgV1RDKDB4YmE0MGVlMDEpLCBXVEMoMHhiYjRlMDIwMSksIFdUQygweGJjNTk0NzgxKSwgV1RDKDB4YmQ2MmI4ODEpLCBXVEMoMHhiZTZhNTE4MSksCi1XVEMoMHhiZjcwMGQwMSksIFdUQygweGMwNzNlNGMwKSwgV1RDKDB4YzE3NWQyNDApLCBXVEMoMHhjMjc1Y2M4MCksIFdUQygweGMzNzNjYjgwKSwgV1RDKDB4YzQ2ZmNhMDApLCBXVEMoMHhjNTY5YzYwMCksIFdUQygweGM2NjFiZGMwKSwKLVdUQygweGM3NTdhZjgwKSwgV1RDKDB4Yzg0Yjk4NDApLCBXVEMoMHhjOTNkNzMwMCksIFdUQygweGNhMmQzYTQwKSwgV1RDKDB4Y2IxYWVhNDApLCBXVEMoMHhjYzA2ODI4MCksIFdUQygweGNjZjAwNDgwKSwgV1RDKDB4Y2RkNzcyMDApLAotV1RDKDB4Y2ViY2NiNDApLCBXVEMoMHhjZmEwMGQ4MCksIFdUQygweGQwODEzNTQwKSwgV1RDKDB4ZDE2MDNmMDApLCBXVEMoMHhkMjNkMjk4MCksIFdUQygweGQzMTdmN2MwKSwgV1RDKDB4ZDNmMGFjNDApLCBXVEMoMHhkNGM3NDk4MCksCi1XVEMoMHhkNTliY2Y4MCksIFdUQygweGQ2NmUzYjAwKSwgV1RDKDB4ZDczZTg5MDApLCBXVEMoMHhkODBjYjc0MCksIFdUQygweGQ4ZDhjN2MwKSwgV1RDKDB4ZDlhMmJlMDApLCBXVEMoMHhkYTZhOWU0MCksIFdUQygweGRiMzA2YTQwKSwKLVdUQygweGRiZjQyMDgwKSwgV1RDKDB4ZGNiNWJlODApLCBXVEMoMHhkZDc1NDE0MCksIFdUQygweGRlMzJhOTAwKSwgV1RDKDB4ZGVlZGY5YzApLCBXVEMoMHhkZmE3MzdjMCksIFdUQygweGUwNWU2NzQwKSwgV1RDKDB4ZTExMzg5MDApLAotV1RDKDB4ZTFjNjlhYzApLCBXVEMoMHhlMjc3OWE0MCksIFdUQygweGUzMjY4NjgwKSwgV1RDKDB4ZTNkMzYyNjApLCBXVEMoMHhlNDdlMzNhMCksIFdUQygweGU1MjZmZjgwKSwgV1RDKDB4ZTVjZGM5NjApLCBXVEMoMHhlNjcyOTEwMCksCi1XVEMoMHhlNzE1NTQ2MCksIFdUQygweGU3YjYxMWMwKSwgV1RDKDB4ZTg1NGNhMjApLCBXVEMoMHhlOGYxODE4MCksIFdUQygweGU5OGMzY2EwKSwgV1RDKDB4ZWEyNGZmZTApLCBXVEMoMHhlYWJiY2IyMCksIFdUQygweGViNTA5YjYwKSwKLVdUQygweGViZTM2ZDAwKSwgV1RDKDB4ZWM3NDNlMDApLCBXVEMoMHhlZDAzMTBlMCksIFdUQygweGVkOGZlYWEwKSwgV1RDKDB4ZWUxYWQwNjApLCBXVEMoMHhlZWEzYzY0MCksIFdUQygweGVmMmFjZDYwKSwgV1RDKDB4ZWZhZmU2YTApLAotV1RDKDB4ZjAzMzEyZjApLCBXVEMoMHhmMGI0NTgwMCksIFdUQygweGYxMzNjMjMwKSwgV1RDKDB4ZjFiMTVlZjApLCBXVEMoMHhmMjJkM2FmMCksIFdUQygweGYyYTc1YzgwKSwgV1RDKDB4ZjMxZmM0NjApLCBXVEMoMHhmMzk2NzNiMCksCi1XVEMoMHhmNDBiNmEwMCksIFdUQygweGY0N2VhMjMwKSwgV1RDKDB4ZjRmMDE0NTApLCBXVEMoMHhmNTVmYjkzMCksIFdUQygweGY1Y2Q4NGMwKSwgV1RDKDB4ZjYzOTYwOTApLCBXVEMoMHhmNmEzMzNlMCksIFdUQygweGY3MGFlNTQwKSwKLVdUQygweGY3NzA3MjYwKSwgV1RDKDB4ZjdkM2Y3MjApLCBXVEMoMHhmODM1OTJmMCksIFdUQygweGY4OTU2NDUwKSwgV1RDKDB4ZjhmMzgxMjApLCBXVEMoMHhmOTRmZjdjOCksIFdUQygweGY5YWFkNzQwKSwgV1RDKDB4ZmEwNDI5MjApLAotV1RDKDB4ZmE1YmUxMTApLCBXVEMoMHhmYWIxZTc3OCksIFdUQygweGZiMDYyNDc4KSwgV1RDKDB4ZmI1ODhkNzgpLCBXVEMoMHhmYmE5MzUzMCksIFdUQygweGZiZjgzNmM4KSwgV1RDKDB4ZmM0NWFjZTApLCBXVEMoMHhmYzkxYTI5NCksCi1XVEMoMHhmY2RjMGU1YyksIFdUQygweGZkMjRlNDM4KSwgV1RDKDB4ZmQ2YzE3ZGMpLCBXVEMoMHhmZGIxOTc1OCksIFdUQygweGZkZjU0YzNjKSwgV1RDKDB4ZmUzNzFlZjgpLCBXVEMoMHhmZTc3MDFhYSksIFdUQygweGZlYjUwZDYyKSwKLVdUQygweGZlZjE3MDBhKSwgV1RDKDB4ZmYyYzU1NzQpLCBXVEMoMHhmZjY1ZWU3YiksIFdUQygweGZmOWU3NWRlKSwgV1RDKDB4ZmZkNjI4NjMpLCBXVEMoMHgwMDBkNDQwMSksIFdUQygweDAwNDNkMzQ1KSwgV1RDKDB4MDA3OTljZDApLAotV1RDKDB4MDBhZTVmNDkpLCBXVEMoMHgwMGUxZDdhNCksIFdUQygweDAxMTNhNmYyKSwgV1RDKDB4MDE0MzU3NWMpLCBXVEMoMHgwMTcwNzAyNCksIFdUQygweDAxOWE5MzQ2KSwgV1RDKDB4MDFjMWNmMDgpLCBXVEMoMHgwMWU2NmMxMiksCi1XVEMoMHgwMjA4YWM0OCksIFdUQygweDAyMjhlODY4KSwgV1RDKDB4MDI0N2E2YzgpLCBXVEMoMHgwMjY1N2FhMCksIFdUQygweDAyODJmNzEwKSwgV1RDKDB4MDJhMDdlNTApLCBXVEMoMHgwMmJlMzFjMCksIFdUQygweDAyZGMyYjMwKSwKLVdUQygweDAyZmE3ZjM0KSwgV1RDKDB4MDMxOGZiMTApLCBXVEMoMHgwMzM3MmZkYyksIFdUQygweDAzNTRhZTU0KSwgV1RDKDB4MDM3MTBkMTgpLCBXVEMoMHgwMzhiZmRiNCksIFdUQygweDAzYTU0MDg0KSwgV1RDKDB4MDNiYzkyYjgpLAotV1RDKDB4MDNkMWM3MTApLCBXVEMoMHgwM2U0ZGQyMCksIFdUQygweDAzZjVlMjVjKSwgV1RDKDB4MDQwNGUyMTgpLCBXVEMoMHgwNDExZmMzMCksIFdUQygweDA0MWQ2YjMwKSwgV1RDKDB4MDQyNzZjZDApLCBXVEMoMHgwNDMwM2UwMCksCi1XVEMoMHgwNDM4MTUyOCksIFdUQygweDA0M2YyMzEwKSwgV1RDKDB4MDQ0NTk5MDgpLCBXVEMoMHgwNDRiYTQzMCksIFdUQygweDA0NTE2MWY4KSwgV1RDKDB4MDQ1NmU2ZjgpLCBXVEMoMHgwNDVjNDlhOCksIFdUQygweDA0NjE5MmY4KSwKLVdUQygweDA0NjZhZjQwKSwgV1RDKDB4MDQ2YjgyNDApLCBXVEMoMHgwNDZmZjBkOCksIFdUQygweDA0NzNkZTE4KSwgV1RDKDB4MDQ3NzJiNTgpLCBXVEMoMHgwNDc5YjlhMCksIFdUQygweDA0N2I2YTMwKSwgV1RDKDB4MDQ3YzIwODgpLAotV1RDKDB4MDQ3YmMyMzApLCBXVEMoMHgwNDdhMzQxOCksIFdUQygweDA0Nzc2MDk4KSwgV1RDKDB4MDQ3MzQ3OTApLCBXVEMoMHgwNDZkZjRjMCksIFdUQygweDA0Njc3MjIwKSwgV1RDKDB4MDQ1ZmQxYjApLCBXVEMoMHgwNDU3MzU4OCksCi1XVEMoMHgwNDRkYzRiOCksIFdUQygweDA0NDNhNWI4KSwgV1RDKDB4MDQzOTAxNjApLCBXVEMoMHgwNDJlMDM5OCksIFdUQygweDA0MjJkOGMwKSwgV1RDKDB4MDQxN2FhMzApLCBXVEMoMHgwNDBjN2NlMCksIFdUQygweDA0MDEzNmUwKSwKLVdUQygweDAzZjViZWIwKSwgV1RDKDB4MDNlOWY4ZWMpLCBXVEMoMHgwM2RkYzQ4NCksIFdUQygweDAzZDBmZDljKSwgV1RDKDB4MDNjMzdmYTApLCBXVEMoMHgwM2I1MzAxNCksIFdUQygweDAzYTYwYTE4KSwgV1RDKDB4MDM5NjBmODgpLAotV1RDKDB4MDM4NTQxMTApLCBXVEMoMHgwMzczYWQ5YyksIFdUQygweDAzNjE3Njk0KSwgV1RDKDB4MDM0ZWJmOWMpLCBXVEMoMHgwMzNiYWIzMCksIFdUQygweDAzMjg0ZWYwKSwgV1RDKDB4MDMxNGI1OTgpLCBXVEMoMHgwMzAwZWE1NCksCi1XVEMoMHgwMmVjZjUyNCksIFdUQygweDAyZDhkMjEwKSwgV1RDKDB4MDJjNDc2YWMpLCBXVEMoMHgwMmFmZDk0MCksIFdUQygweDAyOWFlZTRjKSwgV1RDKDB4MDI4NWE2ZjQpLCBXVEMoMHgwMjZmZjM5OCksIFdUQygweDAyNTljNDQ4KSwKLVdUQygweDAyNDMxN2NjKSwgV1RDKDB4MDIyYzAwODQpLCBXVEMoMHgwMjE0OTMxMCksIFdUQygweDAxZmNlMzM0KSwgV1RDKDB4MDFlNGZiMjQpLCBXVEMoMHgwMWNjZGQwYSksIFdUQygweDAxYjQ4YjIwKSwgV1RDKDB4MDE5YzA3N2UpLAotV1RDKDB4MDE4MzU0MzIpLCBXVEMoMHgwMTZhNzMzYyksIFdUQygweDAxNTE2NmE2KSwgV1RDKDB4MDEzODMwMmUpLCBXVEMoMHgwMTFlZDBmNiksIFdUQygweDAxMDU0OWY4KSwgV1RDKDB4MDBlYjljMjUpLCBXVEMoMHgwMGQxY2FhNiksCi1XVEMoMHgwMGI3ZGI5NCksIFdUQygweDAwOWRkNTYwKSwgV1RDKDB4MDA4M2JlNzUpLCBXVEMoMHgwMDY5OWQ0MSksIFdUQygweDAwNGY3ODJmKSwgV1RDKDB4MDAzNTU1YWIpLCBXVEMoMHgwMDFiM2MyMSksIFdUQygweDAwMDEzMWZlKSwKLVdUQygweGQ2MWNmYzQwKSwgV1RDKDB4ZDVhY2IzNDApLCBXVEMoMHhkNTNkNDQwMCksIFdUQygweGQ0Y2VhNmMwKSwgV1RDKDB4ZDQ2MGQ0NDApLCBXVEMoMHhkM2YzYzQ0MCksIFdUQygweGQzODc2ZjgwKSwgV1RDKDB4ZDMxYmNlNDApLAotV1RDKDB4ZDJiMGQ5MDApLCBXVEMoMHhkMjQ2ODk4MCksIFdUQygweGQxZGNlZjAwKSwgV1RDKDB4ZDE3NDI5YzApLCBXVEMoMHhkMTBjNWI4MCksIFdUQygweGQwYTU5YjgwKSwgV1RDKDB4ZDAzZmQ3ODApLCBXVEMoMHhjZmRhZTc4MCksCi1XVEMoMHhjZjc2YTM4MCksIFdUQygweGNmMTJmYWMwKSwgV1RDKDB4Y2ViMDExMDApLCBXVEMoMHhjZTRlMThjMCksIFdUQygweGNkZWQ0NDQwKSwgV1RDKDB4Y2Q4ZDlhNDApLCBXVEMoMHhjZDJlZTgwMCksIFdUQygweGNjZDBmNDQwKSwKLVdUQygweGNjNzM4NzgwKSwgV1RDKDB4Y2MxNjdkNDApLCBXVEMoMHhjYmI5YzE4MCksIFdUQygweGNiNWQ0MDQwKSwgV1RDKDB4Y2IwMGUyNDApLCBXVEMoMHhjYWE0ODAwMCksIFdUQygweGNhNDdlYWMwKSwgV1RDKDB4YzllYWYxYzApLAotV1RDKDB4Yzk4ZDgxMDApLCBXVEMoMHhjOTJmYzU4MCksIFdUQygweGM4ZDFmYzgwKSwgV1RDKDB4Yzg3NDY0ODApLCBXVEMoMHhjODE2ZGM0MCksIFdUQygweGM3YjhjMjgwKSwgV1RDKDB4Yzc1OTY4MDApLCBXVEMoMHhjNmY4MWY4MCksCi1XVEMoMHhjNjk0NTc0MCksIFdUQygweGM2MmQ5M2MwKSwgV1RDKDB4YzVjMzU4YzApLCBXVEMoMHhjNTU1MmI4MCksIFdUQygweGM0ZTI5MjQwKSwgV1RDKDB4YzQ2YjE0NDApLCBXVEMoMHhjM2VlMzg0MCksIFdUQygweGMzNmI4NTAwKSwKLVdUQygweGMyZTI4MDQwKSwgV1RDKDB4YzI1MmFlODApLCBXVEMoMHhjMWJiOTU0MCksIFdUQygweGMxMWNjMjAwKSwgV1RDKDB4YzA3NWNmMDApLCBXVEMoMHhiZmM2NTc4MSksIFdUQygweGJmMGRmODgxKSwgV1RDKDB4YmU0YzZmMDEpLAotV1RDKDB4YmQ4MTk0MDEpLCBXVEMoMHhiY2FkMmQwMSksIFdUQygweGJiY2ZiOTgxKSwgV1RDKDB4YmFlY2E2ODEpLCBXVEMoMHhiYTA4ZTc4MSksIFdUQygweGI5Mjk3MDgxKSwgV1RDKDB4Yjg1MWUwODEpLCBXVEMoMHhiNzgyZWQwMSksCi1XVEMoMHhiNmJjNmE4MSksIFdUQygweGI1ZmU0OTgxKSwgV1RDKDB4YjU0ODcyODEpLCBXVEMoMHhiNDlhZDA4MSksIFdUQygweGIzZjU0ZDgxKSwgV1RDKDB4YjM1N2Q0MDEpLCBXVEMoMHhiMmMyNGUwMSksIFdUQygweGIyMzRhNjgxKSwKLVdUQygweGIxYWVjNzAxKSwgV1RDKDB4YjEzMDliMDEpLCBXVEMoMHhiMGJhMGMwMSksIFdUQygweGIwNGIwNDgxKSwgV1RDKDB4YWZlMzZmMDEpLCBXVEMoMHhhZjgzMzYwMSksIFdUQygweGFmMmE0MzgxKSwgV1RDKDB4YWVkODgyMDEpLAotV1RDKDB4YWU4ZGRiODEpLCBXVEMoMHhhZTRhM2I4MSksIFdUQygweGFlMGQ4YjAxKSwgV1RDKDB4YWRkN2I1ODEpLCBXVEMoMHhhZGE4YTQ4MSksIFdUQygweGFkODA0MjgxKSwgV1RDKDB4YWQ1ZTdhODEpLCBXVEMoMHhhZDQzMzYwMSksCi1XVEMoMHhhZDJlNjAwMSksIFdUQygweGFkMWZlMjgxKSwgV1RDKDB4YWQxN2E4MDEpLCBXVEMoMHhhZDE1OWE4MSksIFdUQygweGFkMTlhNTAxKSwgV1RDKDB4YWQyM2IxMDEpLCBXVEMoMHhhZDMzYWEwMSksIFdUQygweGFkNDk3OTgxKSwKLVdUQygweGFkNjUwYTAxKSwgV1RDKDB4YWQ4NjQ2MDEpLCBXVEMoMHhhZGFkMTc4MSksIFdUQygweGFkZDk2OTgxKSwgV1RDKDB4YWUwYjI2MDEpLCBXVEMoMHhhZTQyMzc4MSksIFdUQygweGFlN2U4ODAxKSwgV1RDKDB4YWVjMDAyMDEpLAotV1RDKDB4YWYwNjkwODEpLCBXVEMoMHhhZjUyMWM4MSksIFdUQygweGFmYTI5MjAxKSwgV1RDKDB4YWZmN2RhMDEpLCBXVEMoMHhiMDUxZGYwMSksIFdUQygweGIwYjA4YzgxKSwgV1RDKDB4YjExM2NiODEpLCBXVEMoMHhiMTdiODcwMSksCi1XVEMoMHhiMWU3YTk4MSksIFdUQygweGIyNTgxZDgxKSwgV1RDKDB4YjJjY2NjODEpLCBXVEMoMHhiMzQ1YTE4MSksIFdUQygweGIzYzI4NzAxKSwgV1RDKDB4YjQ0MzY2ODEpLCBXVEMoMHhiNGM4MmI4MSksIFdUQygweGI1NTBiZjgxKSwKLVdUQygweGI1ZGQwZDAxKSwgV1RDKDB4YjY2Y2ZmMDEpLCBXVEMoMHhiNzAwN2YwMSksIFdUQygweGI3OTc3NzgxKSwgV1RDKDB4YjgzMWQzODEpLCBXVEMoMHhiOGNmN2QwMSksIFdUQygweGI5NzA1ZTAxKSwgV1RDKDB4YmExNDYxMDEpLAotV1RDKDB4YmFiYjcwODEpLCBXVEMoMHhiYjY1Nzc4MSksIFdUQygweGJjMTI1ZjAxKSwgV1RDKDB4YmNjMjEyODEpLCBXVEMoMHhiZDc0N2I4MSksIFdUQygweGJlMjk4NTgxKSwgV1RDKDB4YmVlMTE5ODEpLCBXVEMoMHhiZjliMjMwMSksCi1XVEMoMHhjMDU3OGI4MCksIFdUQygweGMxMTYzZGMwKSwgV1RDKDB4YzFkNzI0MDApLCBXVEMoMHhjMjlhMjhjMCksIFdUQygweGMzNWYzNjQwKSwgV1RDKDB4YzQyNjM2YzApLCBXVEMoMHhjNGVmMTUwMCksIFdUQygweGM1YjliYjAwKSwKLVdUQygweGM2ODYxMzQwKSwgV1RDKDB4Yzc1NDA4NDApLCBXVEMoMHhjODIzODQwMCksIFdUQygweGM4ZjQ3MTAwKSwgV1RDKDB4YzljNmI5YzApLCBXVEMoMHhjYTlhNDg0MCksIFdUQygweGNiNmYwNzgwKSwgV1RDKDB4Y2M0NGUxNDApLAotV1RDKDB4Y2QxYmMwMDApLCBXVEMoMHhjZGYzOGUwMCksIFdUQygweGNlY2MzNjAwKSwgV1RDKDB4Y2ZhNWEyNDApLCBXVEMoMHhkMDdmYmNjMCksIFdUQygweGQxNWE3MDQwKSwgV1RDKDB4ZDIzNWE2YzApLCBXVEMoMHhkMzExNGIwMCksCi1XVEMoMHhkM2VkNDc0MCksIFdUQygweGQ0Yzk4NTgwKSwgV1RDKDB4ZDVhNWYwODApLCBXVEMoMHhkNjgyNzI4MCksIFdUQygweGQ3NWVmNjAwKSwgV1RDKDB4ZDgzYjY1MDApLCBXVEMoMHhkOTE3YWEwMCksIFdUQygweGQ5ZjNhZjgwKSwKLVdUQygweGRhY2Y1ZmMwKSwgV1RDKDB4ZGJhYWE1NDApLCBXVEMoMHhkYzg1NmEwMCksIFdUQygweGRkNWY5OGMwKSwgV1RDKDB4ZGUzOTFiYzApLCBXVEMoMHhkZjExZGQ0MCksIFdUQygweGRmZTljNzgwKSwgV1RDKDB4ZTBjMGM1NDApLAotV1RDKDB4ZTE5NmMwODApLCBXVEMoMHhlMjZiYTNjMCksIFdUQygweGUzM2Y1OTYwKSwgV1RDKDB4ZTQxMWNiYTApLCBXVEMoMHhlNGUyZTUwMCksIFdUQygweGU1YjI4ZmMwKSwgV1RDKDB4ZTY4MGI2NDApLCBXVEMoMHhlNzRkNDJlMCksCi1XVEMoMHhlODE4MWZlMCksIFdUQygweGU4ZTEzN2UwKSwgV1RDKDB4ZTlhODc1MDApLCBXVEMoMHhlYTZkYzFhMCksIFdUQygweGViMzEwODIwKSwgV1RDKDB4ZWJmMjMzMDApLCBXVEMoMHhlY2IxMmM2MCksIFdUQygweGVkNmRkZWUwKSwKLVdUQygweGVlMjgzNGEwKSwgV1RDKDB4ZWVlMDE4MDApLCBXVEMoMHhlZjk1NzM4MCksIFdUQygweGYwNDgzMTYwKSwgV1RDKDB4ZjBmODNjMDApLCBXVEMoMHhmMWE1N2RiMCksIFdUQygweGYyNGZlMGYwKSwgV1RDKDB4ZjJmNzRmZjApLAotV1RDKDB4ZjM5YmI1MzApLCBXVEMoMHhmNDNjZmFmMCksIFdUQygweGY0ZGIwYjkwKSwgV1RDKDB4ZjU3NWQxODApLCBXVEMoMHhmNjBkMzcwMCksIFdUQygweGY2YTEyNjgwKSwgV1RDKDB4ZjczMThhNTApLCBXVEMoMHhmN2JlNGNjMCksCi1XVEMoMHhmODQ3NTg1MCksIFdUQygweGY4Y2M5NzM4KSwgV1RDKDB4Zjk0ZGYzZTApLCBXVEMoMHhmOWNiNThhOCksIFdUQygweGZhNDRhZmUwKSwgV1RDKDB4ZmFiOWUzZTgpLCBXVEMoMHhmYjJhZGYyMCksIFdUQygweGZiOTc4YmU4KSwKLVdUQygweGZiZmZkNDg4KSwgV1RDKDB4ZmM2M2EzNzApLCBXVEMoMHhmY2MyZTJmMCksIFdUQygweGZkMWQ3ZDY0KSwgV1RDKDB4ZmQ3MzVkMmMpLCBXVEMoMHhmZGM0NmM5YyksIFdUQygweGZlMTA5NjE4KSwgV1RDKDB4ZmU1N2MzZjQpLAotV1RDKDB4ZmU5OWUwOTApLCBXVEMoMHhmZWQ2ZDY0NCksIFdUQygweGZmMGU4ZjZlKSwgV1RDKDB4ZmY0MGY2NjcpLCBXVEMoMHhmZjZkZjU4YyksIFdUQygweGZmOTU3NzM4KSwgV1RDKDB4ZmZiNzY1YzUpLCBXVEMoMHhmZmQzYWI5MCksCi1XVEMoMHhmZmVhMzJmNCksIFdUQygweGZmZmFlNjRjKSwgV1RDKDB4MDAwNWFmZjMpLCBXVEMoMHgwMDBhN2E0NCksIFdUQygweDAwMDkyZjljKSwgV1RDKDB4MDAwMWJhNTQpLCBXVEMoMHhmZmY0MDRjYSksIFdUQygweGZmZGZmOTU3KQotfTsKLQotCi0KKyAgICBXVEMoMHhkYWQyZTZjMCksIFdUQygweGRiMWRhOTAwKSwgV1RDKDB4ZGI2OGNlNDApLCBXVEMoMHhkYmI0NTg0MCksCisgICAgV1RDKDB4ZGMwMDQ5NDApLCBXVEMoMHhkYzRjYTI4MCksIFdUQygweGRjOTk2NTAwKSwgV1RDKDB4ZGNlNjkxNDApLAorICAgIFdUQygweGRkMzQyNzgwKSwgV1RDKDB4ZGQ4MjI3MDApLCBXVEMoMHhkZGQwOGE4MCksIFdUQygweGRlMWY0ZDAwKSwKKyAgICBXVEMoMHhkZTZlNmVjMCksIFdUQygweGRlYmRlYzQwKSwgV1RDKDB4ZGYwZGJhODApLCBXVEMoMHhkZjVkZDU0MCksCisgICAgV1RDKDB4ZGZhZTNjYzApLCBXVEMoMHhkZmZmMDUwMCksIFdUQygweGUwNTA1MTQwKSwgV1RDKDB4ZTBhMjI5ODApLAorICAgIFdUQygweGUwZjQ4OGUwKSwgV1RDKDB4ZTE0NzYxODApLCBXVEMoMHhlMTlhYTQ4MCksIFdUQygweGUxZWU0ZDgwKSwKKyAgICBXVEMoMHhlMjQyNTQwMCksIFdUQygweGUyOTY4OWEwKSwgV1RDKDB4ZTJlYWNkNjApLCBXVEMoMHhlMzNmMjQyMCksCisgICAgV1RDKDB4ZTM5M2EzMDApLCBXVEMoMHhlM2U4N2YyMCksIFdUQygweGU0M2RjZWUwKSwgV1RDKDB4ZTQ5MzhhODApLAorICAgIFdUQygweGU0ZTliMGEwKSwgV1RDKDB4ZTU0MDQzMDApLCBXVEMoMHhlNTk3M2U2MCksIFdUQygweGU1ZWU5YjgwKSwKKyAgICBXVEMoMHhlNjQ2NDllMCksIFdUQygweGU2OWUzN2UwKSwgV1RDKDB4ZTZmNjVlYzApLCBXVEMoMHhlNzRlYjZjMCksCisgICAgV1RDKDB4ZTdhNzMwMDApLCBXVEMoMHhlN2ZmYmU0MCksIFdUQygweGU4NTg1ZWUwKSwgV1RDKDB4ZThiMTA3NDApLAorICAgIFdUQygweGU5MDk5YzQwKSwgV1RDKDB4ZTk2MjE0ZTApLCBXVEMoMHhlOWJhNzlhMCksIFdUQygweGVhMTJlN2MwKSwKKyAgICBXVEMoMHhlYTZiODljMCksIFdUQygweGVhYzQ2NTgwKSwgV1RDKDB4ZWIxZDcyNjApLCBXVEMoMHhlYjc2YjYyMCksCisgICAgV1RDKDB4ZWJkMDM2YzApLCBXVEMoMHhlYzI5ZTUyMCksIFdUQygweGVjODNhYTYwKSwgV1RDKDB4ZWNkZDVhMDApLAorICAgIFdUQygweGVkMzZkNTAwKSwgV1RDKDB4ZWQ5MDE1NDApLCBXVEMoMHhlZGU5MTE2MCksIFdUQygweGVlNDFiYzIwKSwKKyAgICBXVEMoMHhlZTlhMGVlMCksIFdUQygweGVlZjIwODYwKSwgV1RDKDB4ZWY0OWE3ZTApLCBXVEMoMHhlZmEwZWMwMCksCisgICAgV1RDKDB4ZWZmN2QxYzApLCBXVEMoMHhmMDRlNTZiMCksIFdUQygweGYwYTQ3NmUwKSwgV1RDKDB4ZjBmYTJmNjApLAorICAgIFdUQygweGYxNGY4MGUwKSwgV1RDKDB4ZjFhNDZlMTApLCBXVEMoMHhmMWY4ZmU4MCksIFdUQygweGYyNGQzNGEwKSwKKyAgICBXVEMoMHhmMmExMGJiMCksIFdUQygweGYyZjQ4MjEwKSwgV1RDKDB4ZjM0NzljYzApLCBXVEMoMHhmMzlhNWJlMCksCisgICAgV1RDKDB4ZjNlY2I4ZjApLCBXVEMoMHhmNDNlYWZhMCksIFdUQygweGY0OTAzYjUwKSwgV1RDKDB4ZjRlMTRlODApLAorICAgIFdUQygweGY1MzFkNmEwKSwgV1RDKDB4ZjU4MWJjMTApLCBXVEMoMHhmNWQwZTljMCksIFdUQygweGY2MWY1MjUwKSwKKyAgICBXVEMoMHhmNjZjZTZlMCksIFdUQygweGY2Yjk5MzMwKSwgV1RDKDB4ZjcwNTRlYjApLCBXVEMoMHhmNzUwMWYyMCksCisgICAgV1RDKDB4Zjc5YTA3NTApLCBXVEMoMHhmN2UzMDcwMCksIFdUQygweGY4MmIyZmMwKSwgV1RDKDB4Zjg3MmExMzgpLAorICAgIFdUQygweGY4Yjk3ZjE4KSwgV1RDKDB4ZjhmZmU2NjgpLCBXVEMoMHhmOTQ1ZTUzOCksIFdUQygweGY5OGI4ODYwKSwKKyAgICBXVEMoMHhmOWQwZjM4MCksIFdUQygweGZhMTY1MTQ4KSwgV1RDKDB4ZmE1YmI4YTgpLCBXVEMoMHhmYWExM2RmOCksCisgICAgV1RDKDB4ZmFlNmZiMDApLCBXVEMoMHhmYjJjZjhjOCksIFdUQygweGZiNzMyYTgwKSwgV1RDKDB4ZmJiOTc5MTApLAorICAgIFdUQygweGZiZmZjZDEwKSwgV1RDKDB4ZmM0NjM0NzgpLCBXVEMoMHhmYzhjZDNmYyksIFdUQygweGZjZDNiZTVjKSwKKyAgICBXVEMoMHhmZDFhZmE5MCksIFdUQygweGZkNjJhYTg0KSwgV1RDKDB4ZmRhYjAyODgpLCBXVEMoMHhmZGY0MDRiNCksCisgICAgV1RDKDB4ZmUzZDMwMDYpLCBXVEMoMHhmZTg1YjIwZSksIFdUQygweGZlY2NhNGNjKSwgV1RDKDB4ZmYxMGQ1NTkpLAorICAgIFdUQygweGZmNTA1NzliKSwgV1RDKDB4ZmY4YTQwZDIpLCBXVEMoMHhmZmI3ZDg2ZSksIFdUQygweGZmZWY2YmJiKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHhiZmY2N2EwMSksIFdUQygweGJmZWNhYTgxKSwgV1RDKDB4YmZlMmQ5MDEpLCBXVEMoMHhiZmQ5MDYwMSksCisgICAgV1RDKDB4YmZjZjMxODEpLCBXVEMoMHhiZmM1NWM4MSksIFdUQygweGJmYmI4NzAxKSwgV1RDKDB4YmZiMWIxMDEpLAorICAgIFdUQygweGJmYTdkYzAxKSwgV1RDKDB4YmY5ZTA3MDEpLCBXVEMoMHhiZjk0MzMwMSksIFdUQygweGJmOGE1ZjgxKSwKKyAgICBXVEMoMHhiZjgwOGI4MSksIFdUQygweGJmNzZiNzAxKSwgV1RDKDB4YmY2Y2UyMDEpLCBXVEMoMHhiZjYzMGQ4MSksCisgICAgV1RDKDB4YmY1OTNhMDEpLCBXVEMoMHhiZjRmNjgwMSksIFdUQygweGJmNDU5NjgxKSwgV1RDKDB4YmYzYmM2MDEpLAorICAgIFdUQygweGJmMzFmNTAxKSwgV1RDKDB4YmYyODI1MDEpLCBXVEMoMHhiZjFlNTUwMSksIFdUQygweGJmMTQ4NjgxKSwKKyAgICBXVEMoMHhiZjBhYmEwMSksIFdUQygweGJmMDBlZjgxKSwgV1RDKDB4YmVmNzI2ODEpLCBXVEMoMHhiZWVkNWYwMSksCisgICAgV1RDKDB4YmVlMzk4MDEpLCBXVEMoMHhiZWQ5ZDI4MSksIFdUQygweGJlZDAwZjgxKSwgV1RDKDB4YmVjNjRlODEpLAorICAgIFdUQygweGJlYmM5MTgxKSwgV1RDKDB4YmViMmQ2ODEpLCBXVEMoMHhiZWE5MWYwMSksIFdUQygweGJlOWY2OTAxKSwKKyAgICBXVEMoMHhiZTk1YjU4MSksIFdUQygweGJlOGMwNTAxKSwgV1RDKDB4YmU4MjU4MDEpLCBXVEMoMHhiZTc4YjAwMSksCisgICAgV1RDKDB4YmU2ZjBjMDEpLCBXVEMoMHhiZTY1NmMwMSksIFdUQygweGJlNWJkMDAxKSwgV1RDKDB4YmU1MjM3ODEpLAorICAgIFdUQygweGJlNDhhMzAxKSwgV1RDKDB4YmUzZjEzODEpLCBXVEMoMHhiZTM1ODkwMSksIFdUQygweGJlMmMwNTAxKSwKKyAgICBXVEMoMHhiZTIyODY4MSksIFdUQygweGJlMTkwZDgxKSwgV1RDKDB4YmUwZjlhMDEpLCBXVEMoMHhiZTA2MmI4MSksCisgICAgV1RDKDB4YmRmY2MzMDEpLCBXVEMoMHhiZGYzNjEwMSksIFdUQygweGJkZWEwNjgxKSwgV1RDKDB4YmRlMGIzMDEpLAorICAgIFdUQygweGJkZDc2NzAxKSwgV1RDKDB4YmRjZTIxODEpLCBXVEMoMHhiZGM0ZTMwMSksIFdUQygweGJkYmJhYjAxKSwKKyAgICBXVEMoMHhiZGIyN2IwMSksIFdUQygweGJkYTk1MzAxKSwgV1RDKDB4YmRhMDMzODEpLCBXVEMoMHhiZDk3MWM4MSksCisgICAgV1RDKDB4YmQ4ZTBlMDEpLCBXVEMoMHhiZDg1MDcwMSksIFdUQygweGJkN2MwNzgxKSwgV1RDKDB4YmQ3MzEwODEpLAorICAgIFdUQygweGJkNmEyMjAxKSwgV1RDKDB4YmQ2MTNkODEpLCBXVEMoMHhiZDU4NjI4MSksIFdUQygweGJkNGY5MTAxKSwKKyAgICBXVEMoMHhiZDQ2YzgwMSksIFdUQygweGJkM2UwODAxKSwgV1RDKDB4YmQzNTUwODEpLCBXVEMoMHhiZDJjYTI4MSksCisgICAgV1RDKDB4YmQyM2ZmMDEpLCBXVEMoMHhiZDFiNjUwMSksIFdUQygweGJkMTJkNTgxKSwgV1RDKDB4YmQwYTRmODEpLAorICAgIFdUQygweGJkMDFkMjgxKSwgV1RDKDB4YmNmOTVlODEpLCBXVEMoMHhiY2YwZjM4MSksIFdUQygweGJjZTg5MjgxKSwKKyAgICBXVEMoMHhiY2UwM2I4MSksIFdUQygweGJjZDdlZjAxKSwgV1RDKDB4YmNjZmFjMDEpLCBXVEMoMHhiY2M3NzE4MSksCisgICAgV1RDKDB4YmNiZjQwMDEpLCBXVEMoMHhiY2I3MTcwMSksIFdUQygweGJjYWVmNzAxKSwgV1RDKDB4YmNhNmUxMDEpLAorICAgIFdUQygweGJjOWVkNDgxKSwgV1RDKDB4YmM5NmQxMDEpLCBXVEMoMHhiYzhlZDcwMSksIFdUQygweGJjODZlNTgxKSwKKyAgICBXVEMoMHhiYzdlZmM4MSksIFdUQygweGJjNzcxYzAxKSwgV1RDKDB4YmM2ZjQ0MDEpLCBXVEMoMHhiYzY3NzUwMSksCisgICAgV1RDKDB4YmM1ZmFlODEpLCBXVEMoMHhiYzU3ZjEwMSksIFdUQygweGJjNTAzYjgxKSwgV1RDKDB4YmM0ODhlODEpLAorICAgIFdUQygweGJjNDBlODgxKSwgV1RDKDB4YmMzOTQ5MDEpLCBXVEMoMHhiYzMxYWYwMSksIFdUQygweGJjMmExYTgxKSwKKyAgICBXVEMoMHhiYzIyOGYwMSksIFdUQygweGJjMWIxMDgxKSwgV1RDKDB4YmMxM2E0ODEpLCBXVEMoMHhiYzBjNDU4MSksCisgICAgV1RDKDB4YmMwNGUzODEpLCBXVEMoMHhiYmZkNmMwMSksIFdUQygweGJiZjVkMTgxKSwgV1RDKDB4YmJlZTJmODEpLAorICAgIFdUQygweGJiZTZjODAxKSwgV1RDKDB4YmJkZmRiODEpLCBXVEMoMHhiYmQ5YTc4MSksIFdUQygweGJiZDQ1ODgxKSwKKyAgICBXVEMoMHhiYmQwMTMwMSksIFdUQygweGJiY2NmYzgxKSwgV1RDKDB4YmJjYjIyODEpLCBXVEMoMHhiYmNhNWQwMSksCisgICAgV1RDKDB4YmJjYTc0ODEpLCBXVEMoMHhiYmNiMzIwMSksIFdUQygweGJiY2M2YjAxKSwgV1RDKDB4YmJjZTA2MDEpLAorICAgIFdUQygweGJiY2ZlYTgxKSwgV1RDKDB4YmJkMjAzMDEpLCBXVEMoMHhiYmQ0NTYwMSksIFdUQygweGJiZDcwMjAxKSwKKyAgICBXVEMoMHhiYmRhMjUwMSksIFdUQygweGJiZGRkYjAxKSwgV1RDKDB4YmJlMjMyODEpLCBXVEMoMHhiYmU3MzIwMSksCisgICAgV1RDKDB4YmJlY2UyODEpLCBXVEMoMHhiYmYzNDI4MSksIFdUQygweGJiZmEzYzAxKSwgV1RDKDB4YmMwMWIzODEpLAorICAgIFdUQygweGJjMDk4ZDgxKSwgV1RDKDB4YmMxMWI2ODEpLCBXVEMoMHhiYzFhMjQwMSksIFdUQygweGJjMjJjZDgxKSwKKyAgICBXVEMoMHhiYzJiYWIwMSksIFdUQygweGJjMzRjMDgxKSwgV1RDKDB4YmMzZTE5ODEpLCBXVEMoMHhiYzQ3YzI4MSksCisgICAgV1RDKDB4YmM1MWNiMDEpLCBXVEMoMHhiYzVjNGM4MSksIFdUQygweGJjNjc2NTAxKSwgV1RDKDB4YmM3MzM0MDEpLAorICAgIFdUQygweGJjN2ZkMzAxKSwgV1RDKDB4YmM4ZDUxMDEpLCBXVEMoMHhiYzliYjkwMSksIFdUQygweGJjYWIxNzgxKSwKKyAgICBXVEMoMHhiY2JiNzAwMSksIFdUQygweGJjY2NiZDAxKSwgV1RDKDB4YmNkZWY3MDEpLCBXVEMoMHhiY2YyMTYwMSksCisgICAgV1RDKDB4YmQwNjBjODEpLCBXVEMoMHhiZDFhYzgwMSksIFdUQygweGJkMzAzNTgxKSwgV1RDKDB4YmQ0NjQyODEpLAorICAgIFdUQygweGJkNWNlMjgxKSwgV1RDKDB4YmQ3NDBiODEpLCBXVEMoMHhiZDhiYjI4MSksIFdUQygweGJkYTNkMDgxKSwKKyAgICBXVEMoMHhiZGJjNjM4MSksIFdUQygweGJkZDU2YjgxKSwgV1RDKDB4YmRlZWU5ODEpLCBXVEMoMHhiZTA4ZTE4MSksCisgICAgV1RDKDB4YmUyMzYwMDEpLCBXVEMoMHhiZTNlNzIwMSksIFdUQygweGJlNWEyMzAxKSwgV1RDKDB4YmU3NjdlODEpLAorICAgIFdUQygweGJlOTM4YzgxKSwgV1RDKDB4YmViMTU3MDEpLCBXVEMoMHhiZWNmZTYwMSksIFdUQygweGJlZWY0NjAxKSwKKyAgICBXVEMoMHhiZjBmODMwMSksIFdUQygweGJmMzBhOTAxKSwgV1RDKDB4YmY1MmMxMDEpLCBXVEMoMHhiZjc1Y2M4MSksCisgICAgV1RDKDB4YmY5OWNiMDEpLCBXVEMoMHhiZmJlYmI4MSksIFdUQygweGJmZTQ4OTgxKSwgV1RDKDB4YzAwYjA0YzApLAorICAgIFdUQygweGMwMzFmODgwKSwgV1RDKDB4YzA1OTMzNDApLCBXVEMoMHhjMDgwOTI4MCksIFdUQygweGMwYTgwMmMwKSwKKyAgICBXVEMoMHhjMGNmNmVjMCksIFdUQygweGMwZjZjYzAwKSwgV1RDKDB4YzExZTNhODApLCBXVEMoMHhjMTQ1ZjA0MCksCisgICAgV1RDKDB4YzE2ZTIyYzApLCBXVEMoMHhjMTk2ZmIwMCksIFdUQygweGMxYzA4NjgwKSwgV1RDKDB4YzFlYWNhMDApLAorICAgIFdUQygweGMyMTVjYmMwKSwgV1RDKDB4YzI0MTg5NDApLCBXVEMoMHhjMjZkZjVjMCksIFdUQygweGMyOWIwMmMwKSwKKyAgICBXVEMoMHhjMmM4YTE0MCksIFdUQygweGMyZjZiNTAwKSwgV1RDKDB4YzMyNTE3NDApLCBXVEMoMHhjMzUzYTBjMCksCisgICAgV1RDKDB4YzM4MjJjMDApLCBXVEMoMHhjM2IwOTk0MCksIFdUQygweGMzZGVjY2MwKSwgV1RDKDB4YzQwY2E4MDApLAorICAgIFdUQygweGM0M2EyOGMwKSwgV1RDKDB4YzQ2NzhhMDApLCBXVEMoMHhjNDk1MTc4MCksIFdUQygweGM0YzMxZDAwKSwKKyAgICBXVEMoMHhjNGYxYmRjMCksIFdUQygweGM1MjBlODQwKSwgV1RDKDB4YzU1MDg0NDApLCBXVEMoMHhjNTgwNzkwMCksCisgICAgV1RDKDB4YzViMDllODApLCBXVEMoMHhjNWUwYmZjMCksIFdUQygweGM2MTBhNzQwKSwgV1RDKDB4YzY0MDI5YzApLAorICAgIFdUQygweGM2NmY0OWMwKSwgV1RDKDB4YzY5ZTIxODApLCBXVEMoMHhjNmNjY2E0MCksIFdUQygweGM2ZmI1NzAwKSwKKyAgICBXVEMoMHhjNzI5Y2M4MCksIFdUQygweGM3NTgyYjQwKSwgV1RDKDB4Yzc4Njc0ODApLCBXVEMoMHhjN2I0YTQ4MCksCisgICAgV1RDKDB4YzdlMmFmYzApLCBXVEMoMHhjODEwOGE4MCksIFdUQygweGM4M2UyOGMwKSwgV1RDKDB4Yzg2YjdmMDApLAorICAgIFdUQygweGM4OTg4MTAwKSwgV1RDKDB4YzhjNTIzNDApLCBXVEMoMHhjOGYxNTk4MCksIFdUQygweGM5MWQxODQwKSwKKyAgICBXVEMoMHhiNGQ2YTM4MSksIFdUQygweGI0NDIyYjgxKSwgV1RDKDB4YjNhZTg2MDEpLCBXVEMoMHhiMzFiYjMwMSksCisgICAgV1RDKDB4YjI4OWIxODEpLCBXVEMoMHhiMWY4ODE4MSksIFdUQygweGIxNjgyMjgxKSwgV1RDKDB4YjBkODk0MDEpLAorICAgIFdUQygweGIwNDlkNjAxKSwgV1RDKDB4YWZiYmU4MDEpLCBXVEMoMHhhZjJlYzkwMSksIFdUQygweGFlYTI3NjgxKSwKKyAgICBXVEMoMHhhZTE2ZjAwMSksIFdUQygweGFkOGMzMzAxKSwgV1RDKDB4YWQwMjNmMDEpLCBXVEMoMHhhYzc5MTQwMSksCisgICAgV1RDKDB4YWJmMGIxODEpLCBXVEMoMHhhYjY5MTY4MSksIFdUQygweGFhZTI0MzAxKSwgV1RDKDB4YWE1YzM2MDEpLAorICAgIFdUQygweGE5ZDZlZjAxKSwgV1RDKDB4YTk1MjZkODEpLCBXVEMoMHhhOGNlYjIwMSksIFdUQygweGE4NGJiYjgxKSwKKyAgICBXVEMoMHhhN2M5OGIwMSksIFdUQygweGE3NDgyMTAxKSwgV1RDKDB4YTZjNzdlMDEpLCBXVEMoMHhhNjQ3YTMwMSksCisgICAgV1RDKDB4YTVjODkwMDEpLCBXVEMoMHhhNTRhNDcwMSksIFdUQygweGE0Y2NjOTAxKSwgV1RDKDB4YTQ1MDE2MDEpLAorICAgIFdUQygweGEzZDQzMDAxKSwgV1RDKDB4YTM1OTE4MDEpLCBXVEMoMHhhMmRlY2U4MSksIFdUQygweGEyNjU1NTgxKSwKKyAgICBXVEMoMHhhMWVjYWUwMSksIFdUQygweGExNzRkYTgxKSwgV1RDKDB4YTBmZGRkODEpLCBXVEMoMHhhMDg3Yjk4MSksCisgICAgV1RDKDB4YTAxMjcwODEpLCBXVEMoMHg5ZjllMDMwMSksIFdUQygweDlmMmE3MjgxKSwgV1RDKDB4OWViN2MxMDEpLAorICAgIFdUQygweDllNDVmMDgxKSwgV1RDKDB4OWRkNTA0ODEpLCBXVEMoMHg5ZDY1MDA4MSksIFdUQygweDljZjVlNzAxKSwKKyAgICBXVEMoMHg5Yzg3YmE4MSksIFdUQygweDljMWE3YzgxKSwgV1RDKDB4OWJhZTJmODEpLCBXVEMoMHg5YjQyZDU4MSksCisgICAgV1RDKDB4OWFkODcwODEpLCBXVEMoMHg5YTZmMDM4MSksIFdUQygweDlhMDY5MDAxKSwgV1RDKDB4OTk5ZjE5ODEpLAorICAgIFdUQygweDk5MzhhMjgxKSwgV1RDKDB4OThkMzJkODEpLCBXVEMoMHg5ODZlYmQ4MSksIFdUQygweDk4MGI1NTAxKSwKKyAgICBXVEMoMHg5N2E4ZjY4MSksIFdUQygweDk3NDdhNDgxKSwgV1RDKDB4OTZlNzYxMDEpLCBXVEMoMHg5Njg4MmUwMSksCisgICAgV1RDKDB4OTYyYTBjODEpLCBXVEMoMHg5NWNjZmYwMSksIFdUQygweDk1NzEwNjAxKSwgV1RDKDB4OTUxNjIzODEpLAorICAgIFdUQygweDk0YmM1OTgxKSwgV1RDKDB4OTQ2M2E4ODEpLCBXVEMoMHg5NDBjMTI4MSksIFdUQygweDkzYjU5OTAxKSwKKyAgICBXVEMoMHg5MzYwM2QwMSksIFdUQygweDkzMGJmZjgxKSwgV1RDKDB4OTJiOGUxMDEpLCBXVEMoMHg5MjY2ZTI4MSksCisgICAgV1RDKDB4OTIxNjAzMDEpLCBXVEMoMHg5MWM2NDMwMSksIFdUQygweDkxNzdhMzAxKSwgV1RDKDB4OTEyYTIyMDEpLAorICAgIFdUQygweDkwZGRjMDAxKSwgV1RDKDB4OTA5MjdiODEpLCBXVEMoMHg5MDQ4NTQwMSksIFdUQygweDhmZmY0NjAxKSwKKyAgICBXVEMoMHg4ZmI3NGY4MSksIFdUQygweDhmNzA2ZjAxKSwgV1RDKDB4OGYyYWExMDEpLCBXVEMoMHg4ZWU1ZTMwMSksCisgICAgV1RDKDB4OGVhMjMyMDEpLCBXVEMoMHg4ZTVmODg4MSksIFdUQygweDhlMWRlMDAxKSwgV1RDKDB4OGRkZDMyMDEpLAorICAgIFdUQygweDhkOWQ3NzgxKSwgV1RDKDB4OGQ1ZWFhMDEpLCBXVEMoMHg4ZDIwYzMwMSksIFdUQygweDhjZTNiYTgxKSwKKyAgICBXVEMoMHg4Y2E3ODc4MSksIFdUQygweDhjNmMxYjAxKSwgV1RDKDB4OGMzMTY2ODEpLCBXVEMoMHg4YmY3NWIwMSksCisgICAgV1RDKDB4OGJiZGU5ODEpLCBXVEMoMHg4Yjg1MDI4MSksIFdUQygweDhiNGM5NzAxKSwgV1RDKDB4OGIxNDk3MDEpLAorICAgIFdUQygweDhhZGNlZTAxKSwgV1RDKDB4OGFhNTg2ODEpLCBXVEMoMHg4YTZlNGEwMSksIFdUQygweDhhMzcyODgxKSwKKyAgICBXVEMoMHg4YTAwMWYwMSksIFdUQygweDg5YzkyZjgxKSwgV1RDKDB4ODk5MjVhODEpLCBXVEMoMHg4OTViY2QwMSksCisgICAgV1RDKDB4ODkyNWYxMDEpLCBXVEMoMHg4OGYxMzgwMSksIFdUQygweDg4YmUxNjgxKSwgV1RDKDB4ODg4ZDMxODEpLAorICAgIFdUQygweDg4NWY4NDgxKSwgV1RDKDB4ODgzNTM1MDEpLCBXVEMoMHg4ODEyNDI4MSksIFdUQygweDg3ZTczZDgxKSwKKyAgICBXVEMoMHg4N2Q0YWM4MSksIFdUQygweDg3Y2I1MTAxKSwgV1RDKDB4ODdjMDVlODEpLCBXVEMoMHg4N2I0MjQ4MSksCisgICAgV1RDKDB4ODdhNzBlODEpLCBXVEMoMHg4Nzk5OGYwMSksIFdUQygweDg3OGMxODgxKSwgV1RDKDB4ODc3ZWRlMDEpLAorICAgIFdUQygweDg3NzFjNjAxKSwgV1RDKDB4ODc2NGIxMDEpLCBXVEMoMHg4NzU3ODE4MSksIFdUQygweDg3NGEyZjAxKSwKKyAgICBXVEMoMHg4NzNjYzIwMSksIFdUQygweDg3MmY0MjAxKSwgV1RDKDB4ODcyMWI0ODEpLCBXVEMoMHg4NzE0MWIwMSksCisgICAgV1RDKDB4ODcwNjcyODEpLCBXVEMoMHg4NmY4YmE4MSksIFdUQygweDg2ZWFmMDgxKSwgV1RDKDB4ODZkZDE0ODEpLAorICAgIFdUQygweDg2Y2YyNjAxKSwgV1RDKDB4ODZjMTI0MDEpLCBXVEMoMHg4NmIzMGYwMSksIFdUQygweDg2YTRlNzgxKSwKKyAgICBXVEMoMHg4Njk2YWQwMSksIFdUQygweDg2ODg2MDAxKSwgV1RDKDB4ODY3YTAwODEpLCBXVEMoMHg4NjZiOGQ4MSksCisgICAgV1RDKDB4ODY1ZDA1ODEpLCBXVEMoMHg4NjRlNjkwMSksIFdUQygweDg2M2ZiNzAxKSwgV1RDKDB4ODYzMGYxODEpLAorICAgIFdUQygweDg2MjIxODAxKSwgV1RDKDB4ODYxMzJjMDEpLCBXVEMoMHg4NjA0MmMwMSksIFdUQygweDg1ZjUxNjgxKSwKKyAgICBXVEMoMHg4NWU1ZWI4MSksIFdUQygweDg1ZDZhOTgxKSwgV1RDKDB4ODVjNzUyMDEpLCBXVEMoMHg4NWI3ZTYwMSksCisgICAgV1RDKDB4ODVhODY1ODEpLCBXVEMoMHg4NTk4ZDA4MSksIFdUQygweDg1ODkyNjgxKSwgV1RDKDB4ODU3OTY2MDEpLAorICAgIFdUQygweDg1Njk4ZTgxKSwgV1RDKDB4ODU1OWEwODEpLCBXVEMoMHg4NTQ5OWQwMSksIFdUQygweDg1Mzk4NDgxKSwKKyAgICBXVEMoMHg4NTI5NTg4MSksIFdUQygweDg1MTkxODAxKSwgV1RDKDB4ODUwOGMxODEpLCBXVEMoMHg4NGY4NTU4MSksCisgICAgV1RDKDB4ODRlN2QzODEpLCBXVEMoMHg4NGQ3M2MwMSksIFdUQygweDg0YzY5MTAxKSwgV1RDKDB4ODRiNWQzMDEpLAorICAgIFdUQygweDg0YTUwMjAxKSwgV1RDKDB4ODQ5NDFkODEpLCBXVEMoMHg4NDgzMjQ4MSksIFdUQygweDg0NzIxNzAxKSwKKyAgICBXVEMoMHg4NDYwZjU4MSksIFdUQygweDg0NGZjMDgxKSwgV1RDKDB4ODQzZTdhODEpLCBXVEMoMHg4NDJkMjI4MSksCisgICAgV1RDKDB4ODQxYmI5ODEpLCBXVEMoMHg4NDBhM2U4MSksIFdUQygweDgzZjhiMDAxKSwgV1RDKDB4ODNlNzBmMDEpLAorICAgIFdUQygweDgzZDU1ZDAxKSwgV1RDKDB4ODNjMzlhODEpLCBXVEMoMHg4M2IxYzg4MSksIFdUQygweDgzOWZlODAxKSwKKyAgICBXVEMoMHg4MzhkZjgwMSksIFdUQygweDgzN2JmODAxKSwgV1RDKDB4ODM2OWU3ODEpLCBXVEMoMHg4MzU3YzcwMSksCisgICAgV1RDKDB4ODM0NTk4ODEpLCBXVEMoMHg4MzMzNWM4MSksIFdUQygweDgzMjExNTAxKSwgV1RDKDB4ODMwZWMwODEpLAorICAgIFdUQygweDgyZmM1ZjAxKSwgV1RDKDB4ODJlOWVmMDEpLCBXVEMoMHg4MmQ3NzIwMSksIFdUQygweDgyYzRlODAxKSwKKyAgICBXVEMoMHg4MmIyNTMwMSksIFdUQygweDgyOWZiNDAxKSwgV1RDKDB4ODI4ZDBiMDEpLCBXVEMoMHg4MjdhNTgwMSksCisgICAgV1RDKDB4ODI2Nzk5MDEpLCBXVEMoMHg4MjU0Y2YwMSksIFdUQygweDgyNDFmYTAxKSwgV1RDKDB4ODIyZjFiMDEpLAorICAgIFdUQygweDgyMWMzNDAxKSwgV1RDKDB4ODIwOTQ1ODEpLCBXVEMoMHg4MWY2NGYwMSksIFdUQygweDgxZTM0ZjgxKSwKKyAgICBXVEMoMHg4MWQwNDY4MSksIFdUQygweDgxYmQzNDAxKSwgV1RDKDB4ODFhYTE5ODEpLCBXVEMoMHg4MTk2Zjc4MSksCisgICAgV1RDKDB4ODE4M2NmODEpLCBXVEMoMHg4MTcwYTE4MSksIFdUQygweDgxNWQ2YzAxKSwgV1RDKDB4ODE0YTJmODEpLAorICAgIFdUQygweDgxMzZlYTAxKSwgV1RDKDB4ODEyMzlkODEpLCBXVEMoMHg4MTEwNGEwMSksIFdUQygweDgwZmNmMTgxKSwKKyAgICBXVEMoMHg4MGU5OTQwMSksIFdUQygweDgwZDYzMTAxKSwgV1RDKDB4ODBjMmM3ODEpLCBXVEMoMHg4MGFmNTcwMSksCisgICAgV1RDKDB4ODA5YmRmMDEpLCBXVEMoMHg4MDg4NjA4MSksIFdUQygweDgwNzRkYzAxKSwgV1RDKDB4ODA2MTUyODEpLAorICAgIFdUQygweDgwNGRjNDgxKSwgV1RDKDB4ODAzYTMzODEpLCBXVEMoMHg4MDI2OWY4MSksIFdUQygweDgwMTMwOTgxKSwKKyAgICBXVEMoMHgwYTYwODIyMCksIFdUQygweDBhOGVlN2QwKSwgV1RDKDB4MGFiZTM1YzApLCBXVEMoMHgwYWVlNWRlMCksCisgICAgV1RDKDB4MGIxZjUyMzApLCBXVEMoMHgwYjUxMDRhMCksIFdUQygweDBiODM2NzIwKSwgV1RDKDB4MGJiNjZiYjApLAorICAgIFdUQygweDBiZWEwNDQwKSwgV1RDKDB4MGMxZTIyYzApLCBXVEMoMHgwYzUyYmE3MCksIFdUQygweDBjODdjYTkwKSwKKyAgICBXVEMoMHgwY2JkNWJhMCksIFdUQygweDBjZjM3NWUwKSwgV1RDKDB4MGQyYTFmNTApLCBXVEMoMHgwZDYxNTQ4MCksCisgICAgV1RDKDB4MGQ5OTBlNDApLCBXVEMoMHgwZGQxNDUwMCksIFdUQygweDBlMDlmNzMwKSwgV1RDKDB4MGU0MzJlOTApLAorICAgIFdUQygweDBlN2NmNzkwKSwgV1RDKDB4MGViNzVlNTApLCBXVEMoMHgwZWYyNjQzMCksIFdUQygweDBmMmRmZDcwKSwKKyAgICBXVEMoMHgwZjZhMWQ3MCksIFdUQygweDBmYTZiN2UwKSwgV1RDKDB4MGZlM2MzZDApLCBXVEMoMHgxMDIxM2FjMCksCisgICAgV1RDKDB4MTA1ZjE2NDApLCBXVEMoMHgxMDlkNGYyMCksIFdUQygweDEwZGJkYjgwKSwgV1RDKDB4MTExYWIwYzApLAorICAgIFdUQygweDExNTljMzYwKSwgV1RDKDB4MTE5OTBmYzApLCBXVEMoMHgxMWQ4YTA2MCksIFdUQygweDEyMTg4MmMwKSwKKyAgICBXVEMoMHgxMjU4YzQ4MCksIFdUQygweDEyOTk1YTQwKSwgV1RDKDB4MTJkYTFiMDApLCBXVEMoMHgxMzFhZGI2MCksCisgICAgV1RDKDB4MTM1YjcwYzApLCBXVEMoMHgxMzliYjY4MCksIFdUQygweDEzZGI4YzAwKSwgV1RDKDB4MTQxYWQwODApLAorICAgIFdUQygweDE0NTk2NDYwKSwgV1RDKDB4MTQ5NzI5ZTApLCBXVEMoMHgxNGQ0MDRlMCksIFdUQygweDE1MGZkOGUwKSwKKyAgICBXVEMoMHgxNTRhODhjMCksIFdUQygweDE1ODNmNWUwKSwgV1RDKDB4MTViYzAxMjApLCBXVEMoMHgxNWYyOGJhMCksCisgICAgV1RDKDB4MTYyNzc5YTApLCBXVEMoMHgxNjVhYjMwMCksIFdUQygweDE2OGMyMDQwKSwgV1RDKDB4MTZiYmFhODApLAorICAgIFdUQygweDE2ZTk0MTIwKSwgV1RDKDB4MTcxNGQ5ZTApLCBXVEMoMHgxNzNlNjQ0MCksIFdUQygweDE3NjYwNjgwKSwKKyAgICBXVEMoMHgxNzhjYTAyMCksIFdUQygweDE3YjM2NDAwKSwgV1RDKDB4MTdkYjg0ZTApLCBXVEMoMHgxODA1ZDkyMCksCisgICAgV1RDKDB4MTgzMjg0MDApLCBXVEMoMHgxODYxN2NjMCksIFdUQygweDE4OTJiZmEwKSwgV1RDKDB4MThjNjQ1NDApLAorICAgIFdUQygweDE4ZmMwNDAwKSwgV1RDKDB4MTkzM2YxNDApLCBXVEMoMHgxOTZlMDMyMCksIFdUQygweDE5YWEyZmMwKSwKKyAgICBXVEMoMHgxOWU4NmQ4MCksIFdUQygweDFhMjhiMmUwKSwgV1RDKDB4MWE2YWY3MDApLCBXVEMoMHgxYWFmMzMyMCksCisgICAgV1RDKDB4MWFmNTYxODApLCBXVEMoMHgxYjNkN2NlMCksIFdUQygweDFiODc3YzQwKSwgV1RDKDB4MWJkMzUwYzApLAorICAgIFdUQygweDFjMjBlYTQwKSwgV1RDKDB4MWM3MDM4NDApLCBXVEMoMHgxY2MxMzg2MCksIFdUQygweDFkMTNmNzYwKSwKKyAgICBXVEMoMHgxZDY4ODQyMCksIFdUQygweDFkYmVlZDQwKSwgV1RDKDB4MWUxNzQ2NjApLCBXVEMoMHgxZTcxYTY0MCksCisgICAgV1RDKDB4MWVjZTI0MDApLCBXVEMoMHgxZjJjZDIyMCksIFdUQygweDFmOGRiM2MwKSwgV1RDKDB4MWZmMGMzZTApLAorICAgIFdUQygweDIwNTYwMDgwKSwgV1RDKDB4MjBiZDQ2YzApLCBXVEMoMHgyMTI2MzQwMCksIFdUQygweDIxOTA1NzQwKSwKKyAgICBXVEMoMHgyMWZiNDEwMCksIFdUQygweDIyNjZiYTgwKSwgV1RDKDB4MjJkMmQxNDApLCBXVEMoMHgyMzNmOTc4MCksCisgICAgV1RDKDB4MjNhZDI1YzApLCBXVEMoMHgyNDFiYzgwMCksIFdUQygweDI0OGJmMDQwKSwgV1RDKDB4MjRmZTEzODApLAorICAgIFdUQygweDI1NzI4MTgwKSwgV1RDKDB4MjVlOTBhMDApLCBXVEMoMHgyNjYxNDA4MCksIFdUQygweDI2ZGFiZGMwKSwKKyAgICBXVEMoMHgyNzU1MjU0MCksIFdUQygweDI3ZDAzMjAwKSwgV1RDKDB4Mjg0YmE1ODApLCBXVEMoMHgyOGM3NDBjMCksCisgICAgV1RDKDB4Mjk0MzFmODApLCBXVEMoMHgyOWJmYzljMCksIFdUQygweDJhM2RkMDgwKSwgV1RDKDB4MmFiZGMwMDApLAorICAgIFdUQygweDJiM2ZmZDAwKSwgV1RDKDB4MmJjNGNkODApLCBXVEMoMHgyYzRjN2Q0MCksIFdUQygweDJjZDcyZWMwKSwKKyAgICBXVEMoMHgyZDY0N2Y4MCksIFdUQygweDJkZjNjZDgwKSwgV1RDKDB4MmU4NDdkODApLCBXVEMoMHgyZjE1ZWE0MCksCisgICAgV1RDKDB4MmZhNzYwYzApLCBXVEMoMHgzMDM4MmI4MCksIFdUQygweDMwYzc5NDQwKSwgV1RDKDB4MzE1NTY2YzApLAorICAgIFdUQygweDMxZTIwODAwKSwgV1RDKDB4MzI2ZGU3YzApLCBXVEMoMHgzMmY5ODIwMCksIFdUQygweDMzODViYTAwKSwKKyAgICBXVEMoMHgzNDEzYmVjMCksIFdUQygweDM0YTRjNDgwKSwgV1RDKDB4MzUzOWJmMDApLCBXVEMoMHgzNWQyYzRjMCksCisgICAgV1RDKDB4MzY2ZjgzNDApLCBXVEMoMHgzNzBmYjgwMCksIFdUQygweDM3YjJjZjgwKSwgV1RDKDB4Mzg1N2E0ODApLAorICAgIFdUQygweDM4ZmNlZTgwKSwgV1RDKDB4MzlhMTY4NDApLCBXVEMoMHgzYTQ0MjJjMCksIFdUQygweDNhZTQ5NWMwKSwKKyAgICBXVEMoMHgzYjgyNDAwMCksIFdUQygweDNjMWNiNTAwKSwgV1RDKDB4M2NiNDM4YzApLCBXVEMoMHgzZDQ5OTRjMCksCisgICAgV1RDKDB4M2RkZDhmNDApLCBXVEMoMHgzZTcwZWMwMCksIFdUQygweDNmMDQ1ZTQwKSwgV1RDKDB4M2Y5ODkwODApLAorICAgIFdUQygweDQwMmUzMmZmKSwgV1RDKDB4NDBjNWMwN2YpLCBXVEMoMHg0MTVmNTQ3ZiksIFdUQygweDQxZmFmMDdmKSwKKyAgICBXVEMoMHg0Mjk4OTk3ZiksIFdUQygweDQzMzgzMDdmKSwgV1RDKDB4NDNkOTZiZmYpLCBXVEMoMHg0NDdiZmZmZiksCisgICAgV1RDKDB4NDUxZjljZmYpLCBXVEMoMHg0NWMzZGFmZiksIFdUQygweDQ2NjgzZWZmKSwgV1RDKDB4NDcwYzRjZmYpLAorICAgIFdUQygweDQ3YWY5M2ZmKSwgV1RDKDB4NDg1MWMzZmYpLCBXVEMoMHg0OGYyOWQ3ZiksIFdUQygweDQ5OTFkZTdmKSwKKyAgICBXVEMoMHg0YTJmNWU3ZiksIFdUQygweDRhY2IyODdmKSwgV1RDKDB4NGI2NTUzN2YpLCBXVEMoMHg0YmZkZjM3ZiksCisgICAgV1RDKDB4NGM5NTMzN2YpLCBXVEMoMHg0ZDJiNTFmZiksIFdUQygweDRkYzA5MWZmKSwgV1RDKDB4NGU1NTMzZmYpLAorICAgIFdUQygweDRlZTk2YjdmKSwgV1RDKDB4NGY3ZDYxZmYpLCBXVEMoMHg1MDExNDBmZiksIFdUQygweDUwYTUzMTdmKSwKKyAgICBXVEMoMHg1MTM5NWE3ZiksIFdUQygweDUxY2RkZjdmKSwgV1RDKDB4NTI2MmU2ZmYpLCBXVEMoMHg1MmY4ODVmZiksCisgICAgV1RDKDB4NTM4ZWI0N2YpLCBXVEMoMHg1NDI1NjBmZiksIFdUQygweDU0YmM3YjdmKSwgV1RDKDB4NTU1M2E4ZmYpLAorICAgIFdUQygweDU1ZWEzNWZmKSwgV1RDKDB4NTY3ZjY2ZmYpLCBXVEMoMHg1NzEyODk3ZiksIFdUQygweDU3YTMzYTdmKSwKKyAgICBXVEMoMHg1ODMxNTJmZiksIFdUQygweDU4YmNhNWZmKSwgV1RDKDB4NTk0NTMwZmYpLCBXVEMoMHg1OWNiNzlmZiksCisgICAgV1RDKDB4NWE1MDQ3ZmYpLCBXVEMoMHg1YWQ0NWVmZiksIFdUQygweDViNTg0ZTdmKSwgV1RDKDB4NWJkYzQxN2YpLAorICAgIFdUQygweDVjNjA0ODdmKSwgV1RDKDB4NWNlNDc2ZmYpLCBXVEMoMHg1ZDY4YzQ3ZiksIFdUQygweDVkZWQwNmZmKSwKKyAgICBXVEMoMHg1ZTcxMTFmZiksIFdUQygweDVlZjRiNWZmKSwgV1RDKDB4NWY3N2ExN2YpLCBXVEMoMHg1ZmY5NmFmZiksCisgICAgV1RDKDB4NjA3OWE3ZmYpLCBXVEMoMHg2MGY3ZjdmZiksIFdUQygweDYxNzQxN2ZmKSwgV1RDKDB4NjFlZGQ4N2YpLAorICAgIFdUQygweDYyNjRmZmZmKSwgV1RDKDB4NjJkOWE2ZmYpLCBXVEMoMHg2MzRjODE3ZiksIFdUQygweDYzYmU2NTdmKSwKKyAgICBXVEMoMHg2NDMwMjc3ZiksIFdUQygweDY0YTIyNDdmKSwgV1RDKDB4NjUxNDJiZmYpLCBXVEMoMHg2NTg2MDI3ZiksCisgICAgV1RDKDB4NjVmNzY5N2YpLCBXVEMoMHg2NjY4MDFmZiksIFdUQygweDY2ZDc1NmZmKSwgV1RDKDB4Njc0NGYwZmYpLAorICAgIFdUQygweDY3YjA3ODdmKSwgV1RDKDB4NjgxYTA3N2YpLCBXVEMoMHg2ODgxZWJmZiksIFdUQygweDY4ZTg3MDdmKSwKKyAgICBXVEMoMHg2OTRkY2VmZiksIFdUQygweDY5YjIxZTdmKSwgV1RDKDB4NmExNTZjZmYpLCBXVEMoMHg2YTc3Y2E3ZiksCisgICAgV1RDKDB4NmFkOTM3N2YpLCBXVEMoMHg2YjM5YTRmZiksIFdUQygweDZiOTkwMWZmKSwgV1RDKDB4NmJmNzNjZmYpLAorICAgIFdUQygweDZjNTQ0NTdmKSwgV1RDKDB4NmNiMDBhZmYpLCBXVEMoMHg2ZDBhN2JmZiksIFdUQygweDZkNjM4N2ZmKSwKKyAgICBXVEMoMHhhZTJjYmUwMSksIFdUQygweGFmNTI2ZDAxKSwgV1RDKDB4YjA3NTEyMDEpLCBXVEMoMHhiMTk0ZGE4MSksCisgICAgV1RDKDB4YjJiMWY0MDEpLCBXVEMoMHhiM2NjOGQwMSksIFdUQygweGI0ZTRkMjAxKSwgV1RDKDB4YjVmYWYxMDEpLAorICAgIFdUQygweGI3MGYxODgxKSwgV1RDKDB4YjgyMTczMDEpLCBXVEMoMHhiOTMyMTE4MSksIFdUQygweGJhNDBlZTAxKSwKKyAgICBXVEMoMHhiYjRlMDIwMSksIFdUQygweGJjNTk0NzgxKSwgV1RDKDB4YmQ2MmI4ODEpLCBXVEMoMHhiZTZhNTE4MSksCisgICAgV1RDKDB4YmY3MDBkMDEpLCBXVEMoMHhjMDczZTRjMCksIFdUQygweGMxNzVkMjQwKSwgV1RDKDB4YzI3NWNjODApLAorICAgIFdUQygweGMzNzNjYjgwKSwgV1RDKDB4YzQ2ZmNhMDApLCBXVEMoMHhjNTY5YzYwMCksIFdUQygweGM2NjFiZGMwKSwKKyAgICBXVEMoMHhjNzU3YWY4MCksIFdUQygweGM4NGI5ODQwKSwgV1RDKDB4YzkzZDczMDApLCBXVEMoMHhjYTJkM2E0MCksCisgICAgV1RDKDB4Y2IxYWVhNDApLCBXVEMoMHhjYzA2ODI4MCksIFdUQygweGNjZjAwNDgwKSwgV1RDKDB4Y2RkNzcyMDApLAorICAgIFdUQygweGNlYmNjYjQwKSwgV1RDKDB4Y2ZhMDBkODApLCBXVEMoMHhkMDgxMzU0MCksIFdUQygweGQxNjAzZjAwKSwKKyAgICBXVEMoMHhkMjNkMjk4MCksIFdUQygweGQzMTdmN2MwKSwgV1RDKDB4ZDNmMGFjNDApLCBXVEMoMHhkNGM3NDk4MCksCisgICAgV1RDKDB4ZDU5YmNmODApLCBXVEMoMHhkNjZlM2IwMCksIFdUQygweGQ3M2U4OTAwKSwgV1RDKDB4ZDgwY2I3NDApLAorICAgIFdUQygweGQ4ZDhjN2MwKSwgV1RDKDB4ZDlhMmJlMDApLCBXVEMoMHhkYTZhOWU0MCksIFdUQygweGRiMzA2YTQwKSwKKyAgICBXVEMoMHhkYmY0MjA4MCksIFdUQygweGRjYjViZTgwKSwgV1RDKDB4ZGQ3NTQxNDApLCBXVEMoMHhkZTMyYTkwMCksCisgICAgV1RDKDB4ZGVlZGY5YzApLCBXVEMoMHhkZmE3MzdjMCksIFdUQygweGUwNWU2NzQwKSwgV1RDKDB4ZTExMzg5MDApLAorICAgIFdUQygweGUxYzY5YWMwKSwgV1RDKDB4ZTI3NzlhNDApLCBXVEMoMHhlMzI2ODY4MCksIFdUQygweGUzZDM2MjYwKSwKKyAgICBXVEMoMHhlNDdlMzNhMCksIFdUQygweGU1MjZmZjgwKSwgV1RDKDB4ZTVjZGM5NjApLCBXVEMoMHhlNjcyOTEwMCksCisgICAgV1RDKDB4ZTcxNTU0NjApLCBXVEMoMHhlN2I2MTFjMCksIFdUQygweGU4NTRjYTIwKSwgV1RDKDB4ZThmMTgxODApLAorICAgIFdUQygweGU5OGMzY2EwKSwgV1RDKDB4ZWEyNGZmZTApLCBXVEMoMHhlYWJiY2IyMCksIFdUQygweGViNTA5YjYwKSwKKyAgICBXVEMoMHhlYmUzNmQwMCksIFdUQygweGVjNzQzZTAwKSwgV1RDKDB4ZWQwMzEwZTApLCBXVEMoMHhlZDhmZWFhMCksCisgICAgV1RDKDB4ZWUxYWQwNjApLCBXVEMoMHhlZWEzYzY0MCksIFdUQygweGVmMmFjZDYwKSwgV1RDKDB4ZWZhZmU2YTApLAorICAgIFdUQygweGYwMzMxMmYwKSwgV1RDKDB4ZjBiNDU4MDApLCBXVEMoMHhmMTMzYzIzMCksIFdUQygweGYxYjE1ZWYwKSwKKyAgICBXVEMoMHhmMjJkM2FmMCksIFdUQygweGYyYTc1YzgwKSwgV1RDKDB4ZjMxZmM0NjApLCBXVEMoMHhmMzk2NzNiMCksCisgICAgV1RDKDB4ZjQwYjZhMDApLCBXVEMoMHhmNDdlYTIzMCksIFdUQygweGY0ZjAxNDUwKSwgV1RDKDB4ZjU1ZmI5MzApLAorICAgIFdUQygweGY1Y2Q4NGMwKSwgV1RDKDB4ZjYzOTYwOTApLCBXVEMoMHhmNmEzMzNlMCksIFdUQygweGY3MGFlNTQwKSwKKyAgICBXVEMoMHhmNzcwNzI2MCksIFdUQygweGY3ZDNmNzIwKSwgV1RDKDB4ZjgzNTkyZjApLCBXVEMoMHhmODk1NjQ1MCksCisgICAgV1RDKDB4ZjhmMzgxMjApLCBXVEMoMHhmOTRmZjdjOCksIFdUQygweGY5YWFkNzQwKSwgV1RDKDB4ZmEwNDI5MjApLAorICAgIFdUQygweGZhNWJlMTEwKSwgV1RDKDB4ZmFiMWU3NzgpLCBXVEMoMHhmYjA2MjQ3OCksIFdUQygweGZiNTg4ZDc4KSwKKyAgICBXVEMoMHhmYmE5MzUzMCksIFdUQygweGZiZjgzNmM4KSwgV1RDKDB4ZmM0NWFjZTApLCBXVEMoMHhmYzkxYTI5NCksCisgICAgV1RDKDB4ZmNkYzBlNWMpLCBXVEMoMHhmZDI0ZTQzOCksIFdUQygweGZkNmMxN2RjKSwgV1RDKDB4ZmRiMTk3NTgpLAorICAgIFdUQygweGZkZjU0YzNjKSwgV1RDKDB4ZmUzNzFlZjgpLCBXVEMoMHhmZTc3MDFhYSksIFdUQygweGZlYjUwZDYyKSwKKyAgICBXVEMoMHhmZWYxNzAwYSksIFdUQygweGZmMmM1NTc0KSwgV1RDKDB4ZmY2NWVlN2IpLCBXVEMoMHhmZjllNzVkZSksCisgICAgV1RDKDB4ZmZkNjI4NjMpLCBXVEMoMHgwMDBkNDQwMSksIFdUQygweDAwNDNkMzQ1KSwgV1RDKDB4MDA3OTljZDApLAorICAgIFdUQygweDAwYWU1ZjQ5KSwgV1RDKDB4MDBlMWQ3YTQpLCBXVEMoMHgwMTEzYTZmMiksIFdUQygweDAxNDM1NzVjKSwKKyAgICBXVEMoMHgwMTcwNzAyNCksIFdUQygweDAxOWE5MzQ2KSwgV1RDKDB4MDFjMWNmMDgpLCBXVEMoMHgwMWU2NmMxMiksCisgICAgV1RDKDB4MDIwOGFjNDgpLCBXVEMoMHgwMjI4ZTg2OCksIFdUQygweDAyNDdhNmM4KSwgV1RDKDB4MDI2NTdhYTApLAorICAgIFdUQygweDAyODJmNzEwKSwgV1RDKDB4MDJhMDdlNTApLCBXVEMoMHgwMmJlMzFjMCksIFdUQygweDAyZGMyYjMwKSwKKyAgICBXVEMoMHgwMmZhN2YzNCksIFdUQygweDAzMThmYjEwKSwgV1RDKDB4MDMzNzJmZGMpLCBXVEMoMHgwMzU0YWU1NCksCisgICAgV1RDKDB4MDM3MTBkMTgpLCBXVEMoMHgwMzhiZmRiNCksIFdUQygweDAzYTU0MDg0KSwgV1RDKDB4MDNiYzkyYjgpLAorICAgIFdUQygweDAzZDFjNzEwKSwgV1RDKDB4MDNlNGRkMjApLCBXVEMoMHgwM2Y1ZTI1YyksIFdUQygweDA0MDRlMjE4KSwKKyAgICBXVEMoMHgwNDExZmMzMCksIFdUQygweDA0MWQ2YjMwKSwgV1RDKDB4MDQyNzZjZDApLCBXVEMoMHgwNDMwM2UwMCksCisgICAgV1RDKDB4MDQzODE1MjgpLCBXVEMoMHgwNDNmMjMxMCksIFdUQygweDA0NDU5OTA4KSwgV1RDKDB4MDQ0YmE0MzApLAorICAgIFdUQygweDA0NTE2MWY4KSwgV1RDKDB4MDQ1NmU2ZjgpLCBXVEMoMHgwNDVjNDlhOCksIFdUQygweDA0NjE5MmY4KSwKKyAgICBXVEMoMHgwNDY2YWY0MCksIFdUQygweDA0NmI4MjQwKSwgV1RDKDB4MDQ2ZmYwZDgpLCBXVEMoMHgwNDczZGUxOCksCisgICAgV1RDKDB4MDQ3NzJiNTgpLCBXVEMoMHgwNDc5YjlhMCksIFdUQygweDA0N2I2YTMwKSwgV1RDKDB4MDQ3YzIwODgpLAorICAgIFdUQygweDA0N2JjMjMwKSwgV1RDKDB4MDQ3YTM0MTgpLCBXVEMoMHgwNDc3NjA5OCksIFdUQygweDA0NzM0NzkwKSwKKyAgICBXVEMoMHgwNDZkZjRjMCksIFdUQygweDA0Njc3MjIwKSwgV1RDKDB4MDQ1ZmQxYjApLCBXVEMoMHgwNDU3MzU4OCksCisgICAgV1RDKDB4MDQ0ZGM0YjgpLCBXVEMoMHgwNDQzYTViOCksIFdUQygweDA0MzkwMTYwKSwgV1RDKDB4MDQyZTAzOTgpLAorICAgIFdUQygweDA0MjJkOGMwKSwgV1RDKDB4MDQxN2FhMzApLCBXVEMoMHgwNDBjN2NlMCksIFdUQygweDA0MDEzNmUwKSwKKyAgICBXVEMoMHgwM2Y1YmViMCksIFdUQygweDAzZTlmOGVjKSwgV1RDKDB4MDNkZGM0ODQpLCBXVEMoMHgwM2QwZmQ5YyksCisgICAgV1RDKDB4MDNjMzdmYTApLCBXVEMoMHgwM2I1MzAxNCksIFdUQygweDAzYTYwYTE4KSwgV1RDKDB4MDM5NjBmODgpLAorICAgIFdUQygweDAzODU0MTEwKSwgV1RDKDB4MDM3M2FkOWMpLCBXVEMoMHgwMzYxNzY5NCksIFdUQygweDAzNGViZjljKSwKKyAgICBXVEMoMHgwMzNiYWIzMCksIFdUQygweDAzMjg0ZWYwKSwgV1RDKDB4MDMxNGI1OTgpLCBXVEMoMHgwMzAwZWE1NCksCisgICAgV1RDKDB4MDJlY2Y1MjQpLCBXVEMoMHgwMmQ4ZDIxMCksIFdUQygweDAyYzQ3NmFjKSwgV1RDKDB4MDJhZmQ5NDApLAorICAgIFdUQygweDAyOWFlZTRjKSwgV1RDKDB4MDI4NWE2ZjQpLCBXVEMoMHgwMjZmZjM5OCksIFdUQygweDAyNTljNDQ4KSwKKyAgICBXVEMoMHgwMjQzMTdjYyksIFdUQygweDAyMmMwMDg0KSwgV1RDKDB4MDIxNDkzMTApLCBXVEMoMHgwMWZjZTMzNCksCisgICAgV1RDKDB4MDFlNGZiMjQpLCBXVEMoMHgwMWNjZGQwYSksIFdUQygweDAxYjQ4YjIwKSwgV1RDKDB4MDE5YzA3N2UpLAorICAgIFdUQygweDAxODM1NDMyKSwgV1RDKDB4MDE2YTczM2MpLCBXVEMoMHgwMTUxNjZhNiksIFdUQygweDAxMzgzMDJlKSwKKyAgICBXVEMoMHgwMTFlZDBmNiksIFdUQygweDAxMDU0OWY4KSwgV1RDKDB4MDBlYjljMjUpLCBXVEMoMHgwMGQxY2FhNiksCisgICAgV1RDKDB4MDBiN2RiOTQpLCBXVEMoMHgwMDlkZDU2MCksIFdUQygweDAwODNiZTc1KSwgV1RDKDB4MDA2OTlkNDEpLAorICAgIFdUQygweDAwNGY3ODJmKSwgV1RDKDB4MDAzNTU1YWIpLCBXVEMoMHgwMDFiM2MyMSksIFdUQygweDAwMDEzMWZlKSwKKyAgICBXVEMoMHhkNjFjZmM0MCksIFdUQygweGQ1YWNiMzQwKSwgV1RDKDB4ZDUzZDQ0MDApLCBXVEMoMHhkNGNlYTZjMCksCisgICAgV1RDKDB4ZDQ2MGQ0NDApLCBXVEMoMHhkM2YzYzQ0MCksIFdUQygweGQzODc2ZjgwKSwgV1RDKDB4ZDMxYmNlNDApLAorICAgIFdUQygweGQyYjBkOTAwKSwgV1RDKDB4ZDI0Njg5ODApLCBXVEMoMHhkMWRjZWYwMCksIFdUQygweGQxNzQyOWMwKSwKKyAgICBXVEMoMHhkMTBjNWI4MCksIFdUQygweGQwYTU5YjgwKSwgV1RDKDB4ZDAzZmQ3ODApLCBXVEMoMHhjZmRhZTc4MCksCisgICAgV1RDKDB4Y2Y3NmEzODApLCBXVEMoMHhjZjEyZmFjMCksIFdUQygweGNlYjAxMTAwKSwgV1RDKDB4Y2U0ZTE4YzApLAorICAgIFdUQygweGNkZWQ0NDQwKSwgV1RDKDB4Y2Q4ZDlhNDApLCBXVEMoMHhjZDJlZTgwMCksIFdUQygweGNjZDBmNDQwKSwKKyAgICBXVEMoMHhjYzczODc4MCksIFdUQygweGNjMTY3ZDQwKSwgV1RDKDB4Y2JiOWMxODApLCBXVEMoMHhjYjVkNDA0MCksCisgICAgV1RDKDB4Y2IwMGUyNDApLCBXVEMoMHhjYWE0ODAwMCksIFdUQygweGNhNDdlYWMwKSwgV1RDKDB4YzllYWYxYzApLAorICAgIFdUQygweGM5OGQ4MTAwKSwgV1RDKDB4YzkyZmM1ODApLCBXVEMoMHhjOGQxZmM4MCksIFdUQygweGM4NzQ2NDgwKSwKKyAgICBXVEMoMHhjODE2ZGM0MCksIFdUQygweGM3YjhjMjgwKSwgV1RDKDB4Yzc1OTY4MDApLCBXVEMoMHhjNmY4MWY4MCksCisgICAgV1RDKDB4YzY5NDU3NDApLCBXVEMoMHhjNjJkOTNjMCksIFdUQygweGM1YzM1OGMwKSwgV1RDKDB4YzU1NTJiODApLAorICAgIFdUQygweGM0ZTI5MjQwKSwgV1RDKDB4YzQ2YjE0NDApLCBXVEMoMHhjM2VlMzg0MCksIFdUQygweGMzNmI4NTAwKSwKKyAgICBXVEMoMHhjMmUyODA0MCksIFdUQygweGMyNTJhZTgwKSwgV1RDKDB4YzFiYjk1NDApLCBXVEMoMHhjMTFjYzIwMCksCisgICAgV1RDKDB4YzA3NWNmMDApLCBXVEMoMHhiZmM2NTc4MSksIFdUQygweGJmMGRmODgxKSwgV1RDKDB4YmU0YzZmMDEpLAorICAgIFdUQygweGJkODE5NDAxKSwgV1RDKDB4YmNhZDJkMDEpLCBXVEMoMHhiYmNmYjk4MSksIFdUQygweGJhZWNhNjgxKSwKKyAgICBXVEMoMHhiYTA4ZTc4MSksIFdUQygweGI5Mjk3MDgxKSwgV1RDKDB4Yjg1MWUwODEpLCBXVEMoMHhiNzgyZWQwMSksCisgICAgV1RDKDB4YjZiYzZhODEpLCBXVEMoMHhiNWZlNDk4MSksIFdUQygweGI1NDg3MjgxKSwgV1RDKDB4YjQ5YWQwODEpLAorICAgIFdUQygweGIzZjU0ZDgxKSwgV1RDKDB4YjM1N2Q0MDEpLCBXVEMoMHhiMmMyNGUwMSksIFdUQygweGIyMzRhNjgxKSwKKyAgICBXVEMoMHhiMWFlYzcwMSksIFdUQygweGIxMzA5YjAxKSwgV1RDKDB4YjBiYTBjMDEpLCBXVEMoMHhiMDRiMDQ4MSksCisgICAgV1RDKDB4YWZlMzZmMDEpLCBXVEMoMHhhZjgzMzYwMSksIFdUQygweGFmMmE0MzgxKSwgV1RDKDB4YWVkODgyMDEpLAorICAgIFdUQygweGFlOGRkYjgxKSwgV1RDKDB4YWU0YTNiODEpLCBXVEMoMHhhZTBkOGIwMSksIFdUQygweGFkZDdiNTgxKSwKKyAgICBXVEMoMHhhZGE4YTQ4MSksIFdUQygweGFkODA0MjgxKSwgV1RDKDB4YWQ1ZTdhODEpLCBXVEMoMHhhZDQzMzYwMSksCisgICAgV1RDKDB4YWQyZTYwMDEpLCBXVEMoMHhhZDFmZTI4MSksIFdUQygweGFkMTdhODAxKSwgV1RDKDB4YWQxNTlhODEpLAorICAgIFdUQygweGFkMTlhNTAxKSwgV1RDKDB4YWQyM2IxMDEpLCBXVEMoMHhhZDMzYWEwMSksIFdUQygweGFkNDk3OTgxKSwKKyAgICBXVEMoMHhhZDY1MGEwMSksIFdUQygweGFkODY0NjAxKSwgV1RDKDB4YWRhZDE3ODEpLCBXVEMoMHhhZGQ5Njk4MSksCisgICAgV1RDKDB4YWUwYjI2MDEpLCBXVEMoMHhhZTQyMzc4MSksIFdUQygweGFlN2U4ODAxKSwgV1RDKDB4YWVjMDAyMDEpLAorICAgIFdUQygweGFmMDY5MDgxKSwgV1RDKDB4YWY1MjFjODEpLCBXVEMoMHhhZmEyOTIwMSksIFdUQygweGFmZjdkYTAxKSwKKyAgICBXVEMoMHhiMDUxZGYwMSksIFdUQygweGIwYjA4YzgxKSwgV1RDKDB4YjExM2NiODEpLCBXVEMoMHhiMTdiODcwMSksCisgICAgV1RDKDB4YjFlN2E5ODEpLCBXVEMoMHhiMjU4MWQ4MSksIFdUQygweGIyY2NjYzgxKSwgV1RDKDB4YjM0NWExODEpLAorICAgIFdUQygweGIzYzI4NzAxKSwgV1RDKDB4YjQ0MzY2ODEpLCBXVEMoMHhiNGM4MmI4MSksIFdUQygweGI1NTBiZjgxKSwKKyAgICBXVEMoMHhiNWRkMGQwMSksIFdUQygweGI2NmNmZjAxKSwgV1RDKDB4YjcwMDdmMDEpLCBXVEMoMHhiNzk3Nzc4MSksCisgICAgV1RDKDB4YjgzMWQzODEpLCBXVEMoMHhiOGNmN2QwMSksIFdUQygweGI5NzA1ZTAxKSwgV1RDKDB4YmExNDYxMDEpLAorICAgIFdUQygweGJhYmI3MDgxKSwgV1RDKDB4YmI2NTc3ODEpLCBXVEMoMHhiYzEyNWYwMSksIFdUQygweGJjYzIxMjgxKSwKKyAgICBXVEMoMHhiZDc0N2I4MSksIFdUQygweGJlMjk4NTgxKSwgV1RDKDB4YmVlMTE5ODEpLCBXVEMoMHhiZjliMjMwMSksCisgICAgV1RDKDB4YzA1NzhiODApLCBXVEMoMHhjMTE2M2RjMCksIFdUQygweGMxZDcyNDAwKSwgV1RDKDB4YzI5YTI4YzApLAorICAgIFdUQygweGMzNWYzNjQwKSwgV1RDKDB4YzQyNjM2YzApLCBXVEMoMHhjNGVmMTUwMCksIFdUQygweGM1YjliYjAwKSwKKyAgICBXVEMoMHhjNjg2MTM0MCksIFdUQygweGM3NTQwODQwKSwgV1RDKDB4YzgyMzg0MDApLCBXVEMoMHhjOGY0NzEwMCksCisgICAgV1RDKDB4YzljNmI5YzApLCBXVEMoMHhjYTlhNDg0MCksIFdUQygweGNiNmYwNzgwKSwgV1RDKDB4Y2M0NGUxNDApLAorICAgIFdUQygweGNkMWJjMDAwKSwgV1RDKDB4Y2RmMzhlMDApLCBXVEMoMHhjZWNjMzYwMCksIFdUQygweGNmYTVhMjQwKSwKKyAgICBXVEMoMHhkMDdmYmNjMCksIFdUQygweGQxNWE3MDQwKSwgV1RDKDB4ZDIzNWE2YzApLCBXVEMoMHhkMzExNGIwMCksCisgICAgV1RDKDB4ZDNlZDQ3NDApLCBXVEMoMHhkNGM5ODU4MCksIFdUQygweGQ1YTVmMDgwKSwgV1RDKDB4ZDY4MjcyODApLAorICAgIFdUQygweGQ3NWVmNjAwKSwgV1RDKDB4ZDgzYjY1MDApLCBXVEMoMHhkOTE3YWEwMCksIFdUQygweGQ5ZjNhZjgwKSwKKyAgICBXVEMoMHhkYWNmNWZjMCksIFdUQygweGRiYWFhNTQwKSwgV1RDKDB4ZGM4NTZhMDApLCBXVEMoMHhkZDVmOThjMCksCisgICAgV1RDKDB4ZGUzOTFiYzApLCBXVEMoMHhkZjExZGQ0MCksIFdUQygweGRmZTljNzgwKSwgV1RDKDB4ZTBjMGM1NDApLAorICAgIFdUQygweGUxOTZjMDgwKSwgV1RDKDB4ZTI2YmEzYzApLCBXVEMoMHhlMzNmNTk2MCksIFdUQygweGU0MTFjYmEwKSwKKyAgICBXVEMoMHhlNGUyZTUwMCksIFdUQygweGU1YjI4ZmMwKSwgV1RDKDB4ZTY4MGI2NDApLCBXVEMoMHhlNzRkNDJlMCksCisgICAgV1RDKDB4ZTgxODFmZTApLCBXVEMoMHhlOGUxMzdlMCksIFdUQygweGU5YTg3NTAwKSwgV1RDKDB4ZWE2ZGMxYTApLAorICAgIFdUQygweGViMzEwODIwKSwgV1RDKDB4ZWJmMjMzMDApLCBXVEMoMHhlY2IxMmM2MCksIFdUQygweGVkNmRkZWUwKSwKKyAgICBXVEMoMHhlZTI4MzRhMCksIFdUQygweGVlZTAxODAwKSwgV1RDKDB4ZWY5NTczODApLCBXVEMoMHhmMDQ4MzE2MCksCisgICAgV1RDKDB4ZjBmODNjMDApLCBXVEMoMHhmMWE1N2RiMCksIFdUQygweGYyNGZlMGYwKSwgV1RDKDB4ZjJmNzRmZjApLAorICAgIFdUQygweGYzOWJiNTMwKSwgV1RDKDB4ZjQzY2ZhZjApLCBXVEMoMHhmNGRiMGI5MCksIFdUQygweGY1NzVkMTgwKSwKKyAgICBXVEMoMHhmNjBkMzcwMCksIFdUQygweGY2YTEyNjgwKSwgV1RDKDB4ZjczMThhNTApLCBXVEMoMHhmN2JlNGNjMCksCisgICAgV1RDKDB4Zjg0NzU4NTApLCBXVEMoMHhmOGNjOTczOCksIFdUQygweGY5NGRmM2UwKSwgV1RDKDB4ZjljYjU4YTgpLAorICAgIFdUQygweGZhNDRhZmUwKSwgV1RDKDB4ZmFiOWUzZTgpLCBXVEMoMHhmYjJhZGYyMCksIFdUQygweGZiOTc4YmU4KSwKKyAgICBXVEMoMHhmYmZmZDQ4OCksIFdUQygweGZjNjNhMzcwKSwgV1RDKDB4ZmNjMmUyZjApLCBXVEMoMHhmZDFkN2Q2NCksCisgICAgV1RDKDB4ZmQ3MzVkMmMpLCBXVEMoMHhmZGM0NmM5YyksIFdUQygweGZlMTA5NjE4KSwgV1RDKDB4ZmU1N2MzZjQpLAorICAgIFdUQygweGZlOTllMDkwKSwgV1RDKDB4ZmVkNmQ2NDQpLCBXVEMoMHhmZjBlOGY2ZSksIFdUQygweGZmNDBmNjY3KSwKKyAgICBXVEMoMHhmZjZkZjU4YyksIFdUQygweGZmOTU3NzM4KSwgV1RDKDB4ZmZiNzY1YzUpLCBXVEMoMHhmZmQzYWI5MCksCisgICAgV1RDKDB4ZmZlYTMyZjQpLCBXVEMoMHhmZmZhZTY0YyksIFdUQygweDAwMDVhZmYzKSwgV1RDKDB4MDAwYTdhNDQpLAorICAgIFdUQygweDAwMDkyZjljKSwgV1RDKDB4MDAwMWJhNTQpLCBXVEMoMHhmZmY0MDRjYSksIFdUQygweGZmZGZmOTU3KX07CiAKIC8qCiAgKiBUTlNfTUFYX0JBTkRTCiAgKiBlbnRyeSBmb3IgZWFjaCBzYW1wbGluZyByYXRlCiAgKiAgMSAgbG9uZyB3aW5kb3cKICAqICAyICBTSE9SVCB3aW5kb3cKLSovCi1jb25zdCBVQ0hBUiB0bnNfbWF4X2JhbmRzX3RibFsxM11bMl0gPQotewotICB7IDMxLCAgOSB9LCAvKiA5NjAwMCAqLwotICB7IDMxLCAgOSB9LCAvKiA4ODIwMCAqLwotICB7IDM0LCAxMCB9LCAvKiA2NDAwMCAqLwotICB7IDQwLCAxNCB9LCAvKiA0ODAwMCAqLwotICB7IDQyLCAxNCB9LCAvKiA0NDEwMCAqLwotICB7IDUxLCAxNCB9LCAvKiAzMjAwMCAqLwotICB7IDQ2LCAxNCB9LCAvKiAyNDAwMCAqLwotICB7IDQ2LCAxNCB9LCAvKiAyMjA1MCAqLwotICB7IDQyLCAxNCB9LCAvKiAxNjAwMCAqLwotICB7IDQyLCAxNCB9LCAvKiAxMjAwMCAqLwotICB7IDQyLCAxNCB9LCAvKiAxMTAyNSAqLwotICB7IDM5LCAxNCB9LCAvKiAgODAwMCAqLwotICB7IDM5LCAxNCB9LCAvKiAgNzM1MCAqLworICovCitjb25zdCBVQ0hBUiB0bnNfbWF4X2JhbmRzX3RibFsxM11bMl0gPSB7CisgICAgezMxLCA5fSwgIC8qIDk2MDAwICovCisgICAgezMxLCA5fSwgIC8qIDg4MjAwICovCisgICAgezM0LCAxMH0sIC8qIDY0MDAwICovCisgICAgezQwLCAxNH0sIC8qIDQ4MDAwICovCisgICAgezQyLCAxNH0sIC8qIDQ0MTAwICovCisgICAgezUxLCAxNH0sIC8qIDMyMDAwICovCisgICAgezQ2LCAxNH0sIC8qIDI0MDAwICovCisgICAgezQ2LCAxNH0sIC8qIDIyMDUwICovCisgICAgezQyLCAxNH0sIC8qIDE2MDAwICovCisgICAgezQyLCAxNH0sIC8qIDEyMDAwICovCisgICAgezQyLCAxNH0sIC8qIDExMDI1ICovCisgICAgezM5LCAxNH0sIC8qICA4MDAwICovCisgICAgezM5LCAxNH0sIC8qICA3MzUwICovCiB9OwogCiAvKiBUTlNfTUFYX0JBTkRTIGZvciBsb3cgZGVsYXkuIFRoZSBhcnJheSBpbmRleCBpcyB0aGUgc2FtcGxlUmF0ZUluZGV4ICovCiBjb25zdCBVQ0hBUiB0bnNfbWF4X2JhbmRzX3RibF80ODBbMTNdID0gewotICAzMSwgLyogOTYwMDAgKi8KLSAgMzEsIC8qIDg4MjAwICovCi0gIDMxLCAvKiA2NDAwMCAqLwotICAzMSwgLyogNDgwMDAgKi8KLSAgMzIsIC8qIDQ0MTAwICovCi0gIDM3LCAvKiAzMjAwMCAqLwotICAzMCwgLyogMjQwMDAgKi8KLSAgMzAsIC8qIDIyMDUwICovCi0gIDMwLCAvKiAxNjAwMCAqLwotICAzMCwgLyogMTIwMDAgKi8KLSAgMzAsIC8qIDExMDI1ICovCi0gIDMwLCAvKiAgODAwMCAqLwotICAzMCAgLyogIDczNTAgKi8KKyAgICAzMSwgLyogOTYwMDAgKi8KKyAgICAzMSwgLyogODgyMDAgKi8KKyAgICAzMSwgLyogNjQwMDAgKi8KKyAgICAzMSwgLyogNDgwMDAgKi8KKyAgICAzMiwgLyogNDQxMDAgKi8KKyAgICAzNywgLyogMzIwMDAgKi8KKyAgICAzMCwgLyogMjQwMDAgKi8KKyAgICAzMCwgLyogMjIwNTAgKi8KKyAgICAzMCwgLyogMTYwMDAgKi8KKyAgICAzMCwgLyogMTIwMDAgKi8KKyAgICAzMCwgLyogMTEwMjUgKi8KKyAgICAzMCwgLyogIDgwMDAgKi8KKyAgICAzMCAgLyogIDczNTAgKi8KIH07CiBjb25zdCBVQ0hBUiB0bnNfbWF4X2JhbmRzX3RibF81MTJbMTNdID0gewotICAzMSwgLyogOTYwMDAgKi8KLSAgMzEsIC8qIDg4MjAwICovCi0gIDMxLCAvKiA2NDAwMCAqLwotICAzMSwgLyogNDgwMDAgKi8KLSAgMzIsIC8qIDQ0MTAwICovCi0gIDM3LCAvKiAzMjAwMCAqLwotICAzMSwgLyogMjQwMDAgKi8KLSAgMzEsIC8qIDIyMDUwICovCi0gIDMxLCAvKiAxNjAwMCAqLwotICAzMSwgLyogMTIwMDAgKi8KLSAgMzEsIC8qIDExMDI1ICovCi0gIDMxLCAvKiAgODAwMCAqLwotICAzMSAgLyogIDczNTAgKi8KKyAgICAzMSwgLyogOTYwMDAgKi8KKyAgICAzMSwgLyogODgyMDAgKi8KKyAgICAzMSwgLyogNjQwMDAgKi8KKyAgICAzMSwgLyogNDgwMDAgKi8KKyAgICAzMiwgLyogNDQxMDAgKi8KKyAgICAzNywgLyogMzIwMDAgKi8KKyAgICAzMSwgLyogMjQwMDAgKi8KKyAgICAzMSwgLyogMjIwNTAgKi8KKyAgICAzMSwgLyogMTYwMDAgKi8KKyAgICAzMSwgLyogMTIwMDAgKi8KKyAgICAzMSwgLyogMTEwMjUgKi8KKyAgICAzMSwgLyogIDgwMDAgKi8KKyAgICAzMSAgLyogIDczNTAgKi8KIH07CiAKICNkZWZpbmUgVENDKHgpIChGSVhQX0RCTCh4KSkKIAotY29uc3QgRklYUF9UQ0MgRkRLYWFjRGVjX3Ruc0NvZWZmMyBbOF0gPQotewotICBUQ0MoMHg4MWYxZDFkNCksIFRDQygweDkxMjYxNDZjKSwgVENDKDB4YWRiOTIyYzQpLCBUQ0MoMHhkNDM4YWYxZiksCi0gIFRDQygweDAwMDAwMDAwKSwgVENDKDB4Mzc4OTgwOWIpLCBUQ0MoMHg2NDEzMGRkNCksIFRDQygweDdjY2E3MDE2KQotfTsKLWNvbnN0IEZJWFBfVENDIEZES2FhY0RlY190bnNDb2VmZjQgWzE2XSA9Ci17Ci0gIFRDQygweDgwOGJjODQyKSwgVENDKDB4ODRlMmU1OGMpLCBUQ0MoMHg4ZDZiNDlkMSksIFRDQygweDk5ZGE5MjBhKSwKLSAgVENDKDB4YTljNDU3MTMpLCBUQ0MoMHhiYzlkZGViOSksIFRDQygweGQxYzJkNTFiKSwgVENDKDB4ZTg3YWU1M2QpLAotICBUQ0MoMHgwMDAwMDAwMCksIFRDQygweDFhOWNkOWI2KSwgVENDKDB4MzQwZmYyNTQpLCBUQ0MoMHg0YjNjOGMyOSksCi0gIFRDQygweDVmMWY1ZWJiKSwgVENDKDB4NmVkOWViYmEpLCBUQ0MoMHg3OWJjMzg1ZiksIFRDQygweDdmNGM3ZTViKQotfTsKK2NvbnN0IEZJWFBfVENDIEZES2FhY0RlY190bnNDb2VmZjNbOF0gPSB7CisgICAgVENDKDB4ODFmMWQxZDQpLCBUQ0MoMHg5MTI2MTQ2YyksIFRDQygweGFkYjkyMmM0KSwgVENDKDB4ZDQzOGFmMWYpLAorICAgIFRDQygweDAwMDAwMDAwKSwgVENDKDB4Mzc4OTgwOWIpLCBUQ0MoMHg2NDEzMGRkNCksIFRDQygweDdjY2E3MDE2KX07Citjb25zdCBGSVhQX1RDQyBGREthYWNEZWNfdG5zQ29lZmY0WzE2XSA9IHsKKyAgICBUQ0MoMHg4MDhiYzg0MiksIFRDQygweDg0ZTJlNThjKSwgVENDKDB4OGQ2YjQ5ZDEpLCBUQ0MoMHg5OWRhOTIwYSksCisgICAgVENDKDB4YTljNDU3MTMpLCBUQ0MoMHhiYzlkZGViOSksIFRDQygweGQxYzJkNTFiKSwgVENDKDB4ZTg3YWU1M2QpLAorICAgIFRDQygweDAwMDAwMDAwKSwgVENDKDB4MWE5Y2Q5YjYpLCBUQ0MoMHgzNDBmZjI1NCksIFRDQygweDRiM2M4YzI5KSwKKyAgICBUQ0MoMHg1ZjFmNWViYiksIFRDQygweDZlZDllYmJhKSwgVENDKDB4NzliYzM4NWYpLCBUQ0MoMHg3ZjRjN2U1Yil9OwogCi0vKiBNUEVHIGxpa2UgbWFwcGluZyAobm8gY2hhbmdlKS4gKi8KLWNvbnN0IFVDSEFSIGNoYW5uZWxNYXBwaW5nVGFibGVQYXNzdGhyb3VnaFsxNV1bOF0gPQotewotICAgICB7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3fSwgIC8qICBmYWxsYmFjayAgKi8KLSAgICAgeyAwLCAgMSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NX0sICAvKiAgbW9ubyAvIFBTICovCi0gICAgIHsgMCwgIDEsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTV9LCAgLyogIHN0ZXJlbyAgICAqLwotICAgICB7IDAsICAxLCAgMiwyNTUsMjU1LDI1NSwyNTUsMjU1fSwgIC8qICAzY2ggICAgICAgKi8KLSAgICAgeyAwLCAgMSwgIDIsICAzLDI1NSwyNTUsMjU1LDI1NX0sICAvKiAgNGNoICAgICAgICovCi0gICAgIHsgMCwgIDEsICAyLCAgMywgIDQsMjU1LDI1NSwyNTV9LCAgLyogIDVjaCAgICAgICAqLwotICAgICB7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwyNTUsMjU1fSwgIC8qICA1LjFjaCAgICAgKi8KLSAgICAgeyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgN30sICAvKiAgNy4xIGZyb250ICovCi0gICAgIHsgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDd9LCAgLyogIHJlc2VydmVkICAqLwotICAgICB7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3fSwgIC8qICByZXNlcnZlZCAgKi8KLSAgICAgeyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgN30sICAvKiAgcmVzZXJ2ZWQgICovCi0gICAgIHsgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwyNTV9LCAgLyogIDYuMWNoICAgICAqLwotICAgICB7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3fSwgIC8qICA3LjEgcmVhciAgKi8KLSAgICAgeyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgN30sICAvKiAgcmVzZXJ2ZWQgICovCi0gICAgIHsgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDd9ICAgLyogIDcuMSB0b3AgICAqLworY29uc3QgVUNIQVIgRkRLYWFjRGVjX3Ruc0NvZWZmM19nYWluX2xkW10gPSB7CisgICAgMywgMSwgMSwgMSwgMCwgMSwgMSwgMywKIH07Ci0KLS8qIFdBViBmaWxlIGxpa2UgbWFwcGluZyAoZnJvbSBNUEVHIG1hcHBpbmcpLiAqLwotY29uc3QgVUNIQVIgY2hhbm5lbE1hcHBpbmdUYWJsZVdBVlsxNV1bOF0gPQotewotICAgICB7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3fSwgIC8qICBmYWxsYmFjayAgKi8KLSAgICAgeyAwLCAgMSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NX0sICAvKiAgbW9ubyAvIFBTICovCi0gICAgIHsgMCwgIDEsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTV9LCAgLyogIHN0ZXJlbyAgICAqLwotICAgICB7IDIsICAwLCAgMSwyNTUsMjU1LDI1NSwyNTUsMjU1fSwgIC8qICAzY2ggICAgICAgKi8KLSAgICAgeyAyLCAgMCwgIDEsICAzLDI1NSwyNTUsMjU1LDI1NX0sICAvKiAgNGNoICAgICAgICovCi0gICAgIHsgMiwgIDAsICAxLCAgMywgIDQsMjU1LDI1NSwyNTV9LCAgLyogIDVjaCAgICAgICAqLwotICAgICB7IDIsICAwLCAgMSwgIDQsICA1LCAgMywyNTUsMjU1fSwgIC8qICA1LjFjaCAgICAgKi8KLSAgICAgeyAyLCAgNiwgIDcsICAwLCAgMSwgIDQsICA1LCAgM30sICAvKiAgNy4xIGZyb250ICovCi0gICAgIHsgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDd9LCAgLyogIHJlc2VydmVkICAqLwotICAgICB7IDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3fSwgIC8qICByZXNlcnZlZCAgKi8KLSAgICAgeyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgN30sICAvKiAgcmVzZXJ2ZWQgICovCi0gICAgIHsgMiwgIDAsICAxLCAgNCwgIDUsICA2LCAgMywyNTV9LCAgLyogIDYuMWNoICAgICAqLwotICAgICB7IDIsICAwLCAgMSwgIDYsICA3LCAgNCwgIDUsICAzfSwgIC8qICA3LjEgcmVhciAgKi8KLSAgICAgeyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgN30sICAvKiAgcmVzZXJ2ZWQgICovCi0gICAgIHsgMiwgIDAsICAxLCAgNCwgIDUsICAzLCAgNiwgIDd9ICAgLyogIDcuMSB0b3AgICAqLworY29uc3QgVUNIQVIgRkRLYWFjRGVjX3Ruc0NvZWZmNF9nYWluX2xkW10gPSB7CisgICAgNCwgMiwgMiwgMSwgMSwgMSwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgNCwKIH07CiAKIC8qIExvb2t1cCB0YWJsZXMgZm9yIGVsZW1lbnRzIGluIEVSIGJpdHN0cmVhbSAqLwotY29uc3QgTVA0X0VMRU1FTlRfSUQgZWxlbWVudHNUYWJbMTVdWzddID0KLXsKLSAvKiAgMSAqLyAgeyBJRF9TQ0UsICBJRF9FWFQsICBJRF9FTkQsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0sIC8qIDEgY2hhbm5lbCAgKi8KLSAvKiAgMiAqLyAgeyBJRF9DUEUsICBJRF9FWFQsICBJRF9FTkQsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gIC8qIDIgY2hhbm5lbHMgKi8KLSAvKiAgMyAqLyAseyBJRF9TQ0UsICBJRF9DUEUsICBJRF9FWFQsICBJRF9FTkQsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0sIC8qIDMgY2hhbm5lbHMgKi8KLSAvKiAgNCAqLyAgeyBJRF9TQ0UsICBJRF9DUEUsICBJRF9TQ0UsICBJRF9FWFQsICBJRF9FTkQsICBJRF9OT05FLCBJRF9OT05FIH0sIC8qIDQgY2hhbm5lbHMgKi8KLSAvKiAgNSAqLyAgeyBJRF9TQ0UsICBJRF9DUEUsICBJRF9DUEUsICBJRF9FWFQsICBJRF9FTkQsICBJRF9OT05FLCBJRF9OT05FIH0sIC8qIDUgY2hhbm5lbHMgKi8KLSAvKiAgNiAqLyAgeyBJRF9TQ0UsICBJRF9DUEUsICBJRF9DUEUsICBJRF9MRkUsICBJRF9FWFQsICBJRF9FTkQsICBJRF9OT05FIH0gIC8qIDYgY2hhbm5lbHMgKi8KLSAvKiAgNyAqLyAseyBJRF9TQ0UsICBJRF9DUEUsICBJRF9DUEUsICBJRF9DUEUsICBJRF9MRkUsICBJRF9FWFQsICBJRF9FTkQgIH0sICAvKiA4IGNoYW5uZWxzICovCi0gLyogIDggKi8gIHsgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9LCAgLyogcmVzZXJ2ZWQgICAqLwotIC8qICA5ICovICB7IElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSwgIC8qIHJlc2VydmVkICAgKi8KLSAvKiAxMCAqLyAgeyBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0sICAvKiByZXNlcnZlZCAgICovCi0gLyogMTEgKi8gIHsgSURfU0NFLCAgSURfQ1BFLCAgSURfQ1BFLCAgSURfU0NFLCAgSURfTEZFLCAgSURfRVhULCAgSURfRU5EICB9LCAgLyogNyBjaGFubmVscyAqLwotIC8qIDEyICovICB7IElEX1NDRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX0xGRSwgIElEX0VYVCwgIElEX0VORCAgfSwgIC8qIDggY2hhbm5lbHMgKi8KLSAvKiAxMyAqLyAgeyBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0sICAvKiByZXNlcnZlZCAgICovCi0gLyogMTQgKi8gIHsgSURfU0NFLCAgSURfQ1BFLCAgSURfQ1BFLCAgSURfTEZFLCAgSURfQ1BFLCAgSURfRVhULCAgSURfRU5EICB9ICAgLyogOCBjaGFubmVscyAqLworY29uc3QgTVA0X0VMRU1FTlRfSUQKKyAgICBlbGVtZW50c1RhYltBQUNERUNfTUFYX0NIX0NPTkZdW0FBQ0RFQ19DSF9FTEVNRU5UU19UQUJfU0laRV0gPSB7CisgICAgICAgIC8qICAxICovIHtJRF9TQ0UsIElEX0VYVCwgSURfRU5ELCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLAorICAgICAgICAgICAgICAgICAgSURfTk9ORX0sIC8qIDEgY2hhbm5lbCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMiAqLworICAgICAgICB7SURfQ1BFLCBJRF9FWFQsIElEX0VORCwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwKKyAgICAgICAgIElEX05PTkV9IC8qIDIgY2hhbm5lbHMgKi8KKyNpZiAoQUFDREVDX01BWF9DSF9DT05GID4gMikKKyAgICAgICAgLyogIDMgKi8sCisgICAgICAgIHtJRF9TQ0UsIElEX0NQRSwgSURfRVhULCBJRF9FTkQsIElEX05PTkUsIElEX05PTkUsCisgICAgICAgICBJRF9OT05FfSwgLyogMyBjaGFubmVscyAqLworICAgICAgICAgICAgICAgICAgIC8qICA0ICovCisgICAgICAgIHtJRF9TQ0UsIElEX0NQRSwgSURfU0NFLCBJRF9FWFQsIElEX0VORCwgSURfTk9ORSwKKyAgICAgICAgIElEX05PTkV9LCAvKiA0IGNoYW5uZWxzICovCisgICAgICAgICAgICAgICAgICAgLyogIDUgKi8KKyAgICAgICAge0lEX1NDRSwgSURfQ1BFLCBJRF9DUEUsIElEX0VYVCwgSURfRU5ELCBJRF9OT05FLAorICAgICAgICAgSURfTk9ORX0sIC8qIDUgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgICAgICAgICAvKiAgNiAqLworICAgICAgICB7SURfU0NFLCBJRF9DUEUsIElEX0NQRSwgSURfTEZFLCBJRF9FWFQsIElEX0VORCwKKyAgICAgICAgIElEX05PTkV9IC8qIDYgY2hhbm5lbHMgKi8KKyNlbmRpZgorI2lmIChBQUNERUNfTUFYX0NIX0NPTkYgPiA2KQorICAgICAgICAvKiAgNyAqLywKKyAgICAgICAge0lEX1NDRSwgSURfQ1BFLCBJRF9DUEUsIElEX0NQRSwgSURfTEZFLCBJRF9FWFQsCisgICAgICAgICBJRF9FTkR9LCAvKiA4IGNoYW5uZWxzICovCisgICAgICAgICAgICAgICAgICAvKiAgOCAqLworICAgICAgICB7SURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwKKyAgICAgICAgIElEX05PTkV9LCAvKiByZXNlcnZlZCAgICovCisgICAgICAgICAgICAgICAgICAgLyogIDkgKi8KKyAgICAgICAge0lEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsCisgICAgICAgICBJRF9OT05FfSwgLyogcmVzZXJ2ZWQgICAqLworICAgICAgICAgICAgICAgICAgIC8qIDEwICovCisgICAgICAgIHtJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLAorICAgICAgICAgSURfTk9ORX0sIC8qIHJlc2VydmVkICAgKi8KKyAgICAgICAgICAgICAgICAgICAvKiAxMSAqLworICAgICAgICB7SURfU0NFLCBJRF9DUEUsIElEX0NQRSwgSURfU0NFLCBJRF9MRkUsIElEX0VYVCwKKyAgICAgICAgIElEX0VORH0sIC8qIDcgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgICAgICAgIC8qIDEyICovCisgICAgICAgIHtJRF9TQ0UsIElEX0NQRSwgSURfQ1BFLCBJRF9DUEUsIElEX0xGRSwgSURfRVhULAorICAgICAgICAgSURfRU5EfSwgLyogOCBjaGFubmVscyAqLworICAgICAgICAgICAgICAgICAgLyogMTMgKi8KKyAgICAgICAge0lEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsCisgICAgICAgICBJRF9OT05FfSwgLyogc2VlIGVsZW1lbnRzQ2hDZmcxMyAqLworICAgICAgICAgICAgICAgICAgIC8qIDE0ICovCisgICAgICAgIHtJRF9TQ0UsIElEX0NQRSwgSURfQ1BFLCBJRF9MRkUsIElEX0NQRSwgSURfRVhULAorICAgICAgICAgSURfRU5EfSAvKiA4IGNoYW5uZWxzICovCisjZW5kaWYKIH07CiAKIC8qISBSYW5kb20gc2lnbiBiaXQgdXNlZCBmb3IgY29uY2VhbG1lbnQKLSovCi1jb25zdCBVU0hPUlQgcmFuZG9tU2lnbltBQUNfTkZfTk9fUkFORE9NX1ZBTC8xNl0gPSB7Ci0vKgotICAgc2lnbiBiaXRzIG9mIEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtdIGVudHJpZXM6Ci0gICBMU0IgLi4uLi4uLi4uLi4gTVNCICAtPiAgICBNU0IgLi4uIExTQgotKi8KLS8qIDEwMDEgMDExMSAwMDExIDExMDAgIC0+ICovIDB4M2NlOSwKLS8qIDAxMDAgMDExMSAwMTExIDEwMTEgIC0+ICovIDB4ZGVlMiwKLS8qIDAwMDEgMTEwMCAxMTEwIDEwMTEgIC0+ICovIDB4ZDczOCwKLS8qIDAwMDEgMDAxMSAwMTEwIDEwMDEgIC0+ICovIDB4OTZjOCwKLS8qIDAxMDEgMDAxMSAxMTAxIDAwMDAgIC0+ICovIDB4MGJjYSwKLS8qIDAwMDEgMDAwMSAxMTExIDAxMDAgIC0+ICovIDB4MmY4OCwKLS8qIDExMTAgMTEwMCAxMTEwIDExMDEgIC0+ICovIDB4YjczNywKLS8qIDAwMTAgMTAxMCAxMDExIDEwMDEgIC0+ICovIDB4OWQ1NCwKLS8qIDAxMTEgMTEwMCAwMTEwIDEwMTAgIC0+ICovIDB4NTYzZSwKLS8qIDExMDEgMDExMSAwMDEwIDAxMDEgIC0+ICovIDB4YTRlYiwKLS8qIDAwMDEgMDEwMSAxMDExIDExMDAgIC0+ICovIDB4M2RhOCwKLS8qIDAxMDEgMDExMSAxMDAxIDEwMTEgIC0+ICovIDB4ZDllYSwKLS8qIDExMDEgMDEwMCAwMTAxIDAxMDEgIC0+ICovIDB4YWEyYiwKLS8qIDEwMDAgMTAwMSAwMTAwIDAwMTEgIC0+ICovIDB4YzI5MSwKLS8qIDExMDAgMTExMSAxMDEwIDExMDAgIC0+ICovIDB4MzVmMywKLS8qIDExMDAgMTAxMCAxMTEwIDAwMTAgIC0+ICovIDB4NDc1MywKLS8qIDAxMTAgMDAwMSAxMDEwIDEwMDAgIC0+ICovIDB4MTU4NiwKLS8qIDAwMTEgMDEwMSAxMTExIDExMDAgIC0+ICovIDB4M2ZhYywKLS8qIDAwMDEgMDExMCAxMDEwIDAwMDEgIC0+ICovIDB4ODU2OCwKLS8qIDAwMTAgMTEwMSAwMTExIDAwMTAgIC0+ICovIDB4NGViNCwKLS8qIDExMDEgMTAxMCAwMTAwIDEwMDEgIC0+ICovIDB4OTI1YiwKLS8qIDExMDAgMTAwMSAwMDAwIDExMTAgIC0+ICovIDB4NzA5MywKLS8qIDEwMDAgMTEwMCAwMTEwIDEwMTAgIC0+ICovIDB4NTYzMSwKLS8qIDAwMDAgMTAwMCAwMTEwIDExMDEgIC0+ICovIDB4YjYxMCwKLS8qIDEwMDAgMDAwMSAxMTExIDEwMTEgIC0+ICovIDB4ZGY4MSwKLS8qIDExMTEgMDAxMSAwMTAwIDAxMTEgIC0+ICovIDB4ZTJjZiwKLS8qIDEwMDAgMDAwMSAwMDEwIDEwMTAgIC0+ICovIDB4NTQ4MSwKLS8qIDExMDEgMDEwMSAxMTAwIDExMTEgIC0+ICovIDB4ZjNhYiwKLS8qIDAxMTAgMDAwMSAwMTEwIDEwMDAgIC0+ICovIDB4MTY4NiwKLS8qIDAwMTEgMDAxMSAxMTAwIDAxMTAgIC0+ICovIDB4NjNjYywKLS8qIDAwMTEgMDExMSAwMTAxIDAxMTAgIC0+ICovIDB4NmFlYywKLS8qIDEwMTEgMDAwMSAxMDEwIDAwMTAgIC0+ICovIDB4NDU4ZAorICovCitjb25zdCBVU0hPUlQgQWFjRGVjX3JhbmRvbVNpZ25bQUFDX05GX05PX1JBTkRPTV9WQUwgLyAxNl0gPSB7CisgICAgLyoKKyAgICAgICBzaWduIGJpdHMgb2YgRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW10gZW50cmllczoKKyAgICAgICBMU0IgLi4uLi4uLi4uLi4gTVNCICAtPiAgICBNU0IgLi4uIExTQgorICAgICovCisgICAgLyogMTAwMSAwMTExIDAwMTEgMTEwMCAgLT4gKi8gMHgzY2U5LAorICAgIC8qIDAxMDAgMDExMSAwMTExIDEwMTEgIC0+ICovIDB4ZGVlMiwKKyAgICAvKiAwMDAxIDExMDAgMTExMCAxMDExICAtPiAqLyAweGQ3MzgsCisgICAgLyogMDAwMSAwMDExIDAxMTAgMTAwMSAgLT4gKi8gMHg5NmM4LAorICAgIC8qIDAxMDEgMDAxMSAxMTAxIDAwMDAgIC0+ICovIDB4MGJjYSwKKyAgICAvKiAwMDAxIDAwMDEgMTExMSAwMTAwICAtPiAqLyAweDJmODgsCisgICAgLyogMTExMCAxMTAwIDExMTAgMTEwMSAgLT4gKi8gMHhiNzM3LAorICAgIC8qIDAwMTAgMTAxMCAxMDExIDEwMDEgIC0+ICovIDB4OWQ1NCwKKyAgICAvKiAwMTExIDExMDAgMDExMCAxMDEwICAtPiAqLyAweDU2M2UsCisgICAgLyogMTEwMSAwMTExIDAwMTAgMDEwMSAgLT4gKi8gMHhhNGViLAorICAgIC8qIDAwMDEgMDEwMSAxMDExIDExMDAgIC0+ICovIDB4M2RhOCwKKyAgICAvKiAwMTAxIDAxMTEgMTAwMSAxMDExICAtPiAqLyAweGQ5ZWEsCisgICAgLyogMTEwMSAwMTAwIDAxMDEgMDEwMSAgLT4gKi8gMHhhYTJiLAorICAgIC8qIDEwMDAgMTAwMSAwMTAwIDAwMTEgIC0+ICovIDB4YzI5MSwKKyAgICAvKiAxMTAwIDExMTEgMTAxMCAxMTAwICAtPiAqLyAweDM1ZjMsCisgICAgLyogMTEwMCAxMDEwIDExMTAgMDAxMCAgLT4gKi8gMHg0NzUzLAorICAgIC8qIDAxMTAgMDAwMSAxMDEwIDEwMDAgIC0+ICovIDB4MTU4NiwKKyAgICAvKiAwMDExIDAxMDEgMTExMSAxMTAwICAtPiAqLyAweDNmYWMsCisgICAgLyogMDAwMSAwMTEwIDEwMTAgMDAwMSAgLT4gKi8gMHg4NTY4LAorICAgIC8qIDAwMTAgMTEwMSAwMTExIDAwMTAgIC0+ICovIDB4NGViNCwKKyAgICAvKiAxMTAxIDEwMTAgMDEwMCAxMDAxICAtPiAqLyAweDkyNWIsCisgICAgLyogMTEwMCAxMDAxIDAwMDAgMTExMCAgLT4gKi8gMHg3MDkzLAorICAgIC8qIDEwMDAgMTEwMCAwMTEwIDEwMTAgIC0+ICovIDB4NTYzMSwKKyAgICAvKiAwMDAwIDEwMDAgMDExMCAxMTAxICAtPiAqLyAweGI2MTAsCisgICAgLyogMTAwMCAwMDAxIDExMTEgMTAxMSAgLT4gKi8gMHhkZjgxLAorICAgIC8qIDExMTEgMDAxMSAwMTAwIDAxMTEgIC0+ICovIDB4ZTJjZiwKKyAgICAvKiAxMDAwIDAwMDEgMDAxMCAxMDEwICAtPiAqLyAweDU0ODEsCisgICAgLyogMTEwMSAwMTAxIDExMDAgMTExMSAgLT4gKi8gMHhmM2FiLAorICAgIC8qIDAxMTAgMDAwMSAwMTEwIDEwMDAgIC0+ICovIDB4MTY4NiwKKyAgICAvKiAwMDExIDAwMTEgMTEwMCAwMTEwICAtPiAqLyAweDYzY2MsCisgICAgLyogMDAxMSAwMTExIDAxMDEgMDExMCAgLT4gKi8gMHg2YWVjLAorICAgIC8qIDEwMTEgMDAwMSAxMDEwIDAwMTAgIC0+ICovIDB4NDU4ZH07CisKKy8qIE1EU1QgZmlsdGVyIGNvZWZmaWNpZW50cyBmb3IgY3VycmVudCB3aW5kb3cKKyAqIG1heDogMC42MzU3MjIgPT4gMjAgYml0cyAodW5zaWduZWQpIG5lY2Vzc2FyeSBmb3IgcmVwcmVzZW50YXRpb24KKyAqIG1pbjogPSAtbWF4ICovCitjb25zdCBGSVhQX0ZJTFQgbWRzdF9maWx0X2NvZWZfY3VyclsyMF1bM10gPSB7CisgICAge0ZJTFQoMC4wMDAwMDBmKSwgRklMVCgwLjAwMDAwMGYpLCBGSUxUKDAuNTAwMDAwZil9LAorICAgIC8qLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjUwMDAwMGYpLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKCAwLjAwMDAwMGYpIH0sICovIC8qIG9ubHkgbG9uZyAvIGVpZ2h0IHNob3J0ICBsOnNpbmUgcjpzaW5lICovCisgICAge0ZJTFQoMC4wOTE0OTdmKSwgRklMVCgwLjAwMDAwMGYpLCBGSUxUKDAuNTgxNDI3Zil9LAorICAgIC8qLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjU4MTQyN2YpLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjA5MTQ5N2YpIH0sICovIC8qICAgICAgICAgICAgICAgICAgICAgICAgICBsOmtiZCAgcjprYmQgICovCisgICAge0ZJTFQoMC4wNDU3NDhmKSwgRklMVCgwLjA1NzIzOGYpLCBGSUxUKDAuNTQwNzE0Zil9LAorICAgIC8qLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjU0MDcxNGYpLCBGSUxUKC0wLjA1NzIzOGYpLCBGSUxUKC0wLjA0NTc0OGYpIH0sICovIC8qICAgICAgICAgICAgICAgICAgICAgICAgICBsOnNpbmUgcjprYmQgICovCisgICAge0ZJTFQoMC4wNDU3NDhmKSwgRklMVCgtMC4wNTcyMzhmKSwgRklMVCgwLjU0MDcxNGYpfSwKKyAgICAvKiwgRklMVCggMC4wMDAwMDBmKSwgRklMVCgtMC41NDA3MTRmKSwgRklMVCggMC4wNTcyMzhmKSwgRklMVCgtMC4wNDU3NDhmKSB9LCAqLyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgbDprYmQgIHI6c2luZSAqLworCisgICAge0ZJTFQoMC4xMDI2NThmKSwgRklMVCgwLjEwMzc5MWYpLCBGSUxUKDAuNTY3MTQ5Zil9LAorICAgIC8qLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjU2NzE0OWYpLCBGSUxUKC0wLjEwMzc5MWYpLCBGSUxUKC0wLjEwMjY1OGYpIH0sICovIC8qIGxvbmcgc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAge0ZJTFQoMC4xNTA1MTJmKSwgRklMVCgwLjA0Nzk2OWYpLAorICAgICBGSUxUKDAuNjA4NTc0Zil9LCAvKiwgRklMVCggMC4wMDAwMDBmKSwgRklMVCgtMC42MDg1NzRmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklMVCgtMC4wNDc5NjlmKSwgRklMVCgtMC4xNTA1MTJmKSB9LCAqLworICAgIHtGSUxUKDAuMTA0NzYzZiksIEZJTFQoMC4xMDUyMDdmKSwKKyAgICAgRklMVCgwLjU2Nzg2MWYpfSwgLyosIEZJTFQoIDAuMDAwMDAwZiksIEZJTFQoLTAuNTY3ODYxZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTFQoLTAuMTA1MjA3ZiksIEZJTFQoLTAuMTA0NzYzZikgfSwgKi8KKyAgICB7RklMVCgwLjE0ODQwNmYpLCBGSUxUKDAuMDQ2NTUzZiksCisgICAgIEZJTFQoMC42MDc4NjNmKX0sIC8qLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjYwNzg2M2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxUKC0wLjA0NjU1M2YpLCBGSUxUKC0wLjE0ODQwNmYpIH0sICovCisKKyAgICB7RklMVCgwLjEwMjY1OGYpLCBGSUxUKC0wLjEwMzc5MWYpLCBGSUxUKDAuNTY3MTQ5Zil9LAorICAgIC8qLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjU2NzE0OWYpLCBGSUxUKCAwLjEwMzc5MWYpLCBGSUxUKC0wLjEwMjY1OGYpIH0sICovIC8qIGxvbmcgc3RvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAge0ZJTFQoMC4xNTA1MTJmKSwgRklMVCgtMC4wNDc5NjlmKSwKKyAgICAgRklMVCgwLjYwODU3NGYpfSwgLyosIEZJTFQoIDAuMDAwMDAwZiksIEZJTFQoLTAuNjA4NTc0ZiksIEZJTFQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQ3OTY5ZiksIEZJTFQoLTAuMTUwNTEyZikgfSwgKi8KKyAgICB7RklMVCgwLjE0ODQwNmYpLCBGSUxUKC0wLjA0NjU1M2YpLAorICAgICBGSUxUKDAuNjA3ODYzZil9LCAvKiwgRklMVCggMC4wMDAwMDBmKSwgRklMVCgtMC42MDc4NjNmKSwgRklMVCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDY1NTNmKSwgRklMVCgtMC4xNDg0MDZmKSB9LCAqLworICAgIHtGSUxUKDAuMTA0NzYzZiksIEZJTFQoLTAuMTA1MjA3ZiksCisgICAgIEZJTFQoMC41Njc4NjFmKX0sIC8qLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjU2Nzg2MWYpLCBGSUxUKAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEwNTIwN2YpLCBGSUxUKC0wLjEwNDc2M2YpIH0sICovCisKKyAgICB7RklMVCgwLjIwNTMxNmYpLCBGSUxUKDAuMDAwMDAwZiksIEZJTFQoMC42MzQyOThmKX0sCisgICAgLyosIEZJTFQoIDAuMDAwMDAwZiksIEZJTFQoLTAuNjM0Mjk4ZiksIEZJTFQoIDAuMDAwMDAwZiksIEZJTFQoLTAuMjA1MzE2ZikgfSwgKi8gLyogc3RvcCBzdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB7RklMVCgwLjIwOTUyNmYpLCBGSUxUKDAuMDAwMDAwZiksCisgICAgIEZJTFQoMC42MzU3MjJmKX0sIC8qLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjYzNTcyMmYpLCBGSUxUKAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYpLCBGSUxUKC0wLjIwOTUyNmYpIH0sICovCisgICAge0ZJTFQoMC4yMDc0MjFmKSwgRklMVCgwLjAwMTQxNmYpLAorICAgICBGSUxUKDAuNjM1MDEwZil9LCAvKiwgRklMVCggMC4wMDAwMDBmKSwgRklMVCgtMC42MzUwMTBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklMVCgtMC4wMDE0MTZmKSwgRklMVCgtMC4yMDc0MjFmKSB9LCAqLworICAgIHtGSUxUKDAuMjA3NDIxZiksIEZJTFQoLTAuMDAxNDE2ZiksCisgICAgIEZJTFQoMC42MzUwMTBmKX0sIC8qLCBGSUxUKCAwLjAwMDAwMGYpLCBGSUxUKC0wLjYzNTAxMGYpLCBGSUxUKAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMTQxNmYpLCBGSUxUKC0wLjIwNzQyMWYpIH0gICovCisKKyAgICB7RklMVCgwLjE4NTYxOGYpLCBGSUxUKDAuMDAwMDAwZiksIEZJTFQoMC42MjczNzFmKX0sCisgICAgLyosIEZJTFQoIDAuMDAwMDAwZiksIEZJTFQoLTAuNjM0Mjk4ZiksIEZJTFQoIDAuMDAwMDAwZiksIEZJTFQoLTAuMjA1MzE2ZikgfSwgKi8gLyogc3RvcCBzdGFydCAgIFRyYW5zZm9ybSBTcGxpdHRpbmcgICAgICAgICovCisgICAge0ZJTFQoMC4yMDQ5MzJmKSwgRklMVCgwLjAwMDAwMGYpLAorICAgICBGSUxUKDAuNjM0MTU5Zil9LCAvKiwgRklMVCggMC4wMDAwMDBmKSwgRklMVCgtMC42MzU3MjJmKSwgRklMVCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmKSwgRklMVCgtMC4yMDk1MjZmKSB9LCAqLworICAgIHtGSUxUKDAuMTk0NjA5ZiksIEZJTFQoMC4wMDYyMDJmKSwKKyAgICAgRklMVCgwLjYzMDUzNmYpfSwgLyosIEZJTFQoIDAuMDAwMDAwZiksIEZJTFQoLTAuNjM1MDEwZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTFQoLTAuMDAxNDE2ZiksIEZJTFQoLTAuMjA3NDIxZikgfSwgKi8KKyAgICB7RklMVCgwLjE5NDYwOWYpLCBGSUxUKC0wLjAwNjIwMmYpLAorICAgICBGSUxUKDAuNjMwNTM2Zil9LCAvKiwgRklMVCggMC4wMDAwMDBmKSwgRklMVCgtMC42MzUwMTBmKSwgRklMVCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDE0MTZmKSwgRklMVCgtMC4yMDc0MjFmKSB9ICAqLwogfTsKIAorLyogTURTVCBmaWx0ZXIgY29lZmZpY2llbnRzIGZvciBwcmV2aW91cyB3aW5kb3cKKyAqIG1heDogMC4zMTgzMSA9PiAxNSBiaXRzICh1bnNpZ25lZCkgbmVjZXNzYXJ5IGZvciByZXByZXNlbnRhdGlvbgorICogbWluOiAwLjAgKi8KK2NvbnN0IEZJWFBfRklMVCBtZHN0X2ZpbHRfY29lZl9wcmV2WzZdWzRdID0geworICAgIHtGSUxUKDAuMDAwMDAwZiksIEZJTFQoMC4xMDYxMDNmKSwgRklMVCgwLjI1MDAwMGYpLCBGSUxUKDAuMzE4MzEwZil9LAorICAgIC8qLCBGSUxUKCAwLjI1MDAwMGYpLCBGSUxUKCAwLjEwNjEwM2YpLCBGSUxUKCAwLjAwMDAwMGYpIH0sICovIC8qIG9ubHkgbG9uZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gbG9uZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDpzaW5lICovCisgICAge0ZJTFQoMC4wNTk1MDlmKSwgRklMVCgwLjEyMzcxNGYpLCBGSUxUKDAuMTg2NTc5ZiksIEZJTFQoMC4yMTMwNzdmKX0sCisgICAgLyosIEZJTFQoIDAuMTg2NTc5ZiksIEZJTFQoIDAuMTIzNzE0ZiksIEZJTFQoIDAuMDU5NTA5ZikgfSwgKi8gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsOmtiZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAge0ZJTFQoMC4wMzg0OThmKSwgRklMVCgwLjAzOTIxMmYpLCBGSUxUKDAuMDM5NjQ1ZiksIEZJTFQoMC4wMzk3OTBmKX0sCisgICAgLyosIEZJTFQoIDAuMDM5NjQ1ZiksIEZJTFQoIDAuMDM5MjEyZiksIEZJTFQoIDAuMDM4NDk4ZikgfSwgKi8gLyogbG9uZyBzdG9wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBzdG9wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsOnNpbmUgKi8KKyAgICB7RklMVCgwLjAyNjE0MmYpLCBGSUxUKDAuMDI2NDEzZiksIEZJTFQoMC4wMjY1NzdmKSwgRklMVCgwLjAyNjYzMWYpfSwKKyAgICAvKiwgRklMVCggMC4wMjY1NzdmKSwgRklMVCggMC4wMjY0MTNmKSwgRklMVCggMC4wMjYxNDJmKSB9ICAqLyAvKiAgICAgICAgICAgICAgICAgICAgICAgICBsOmtiZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAge0ZJTFQoMC4wNjk2MDhmKSwgRklMVCgwLjA3NTAyOGYpLCBGSUxUKDAuMDc4NDIzZiksIEZJTFQoMC4wNzk1ODBmKX0sCisgICAgLyosIEZJTFQoIDAuMDM5NjQ1ZiksIEZJTFQoIDAuMDM5MjEyZiksIEZJTFQoIDAuMDM4NDk4ZikgfSwgKi8gLyogVHJhbnNmb3JtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXR0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDpzaW5lICovCisgICAge0ZJTFQoMC4wNDIxNzJmKSwgRklMVCgwLjA0MzQ1OGYpLCBGSUxUKDAuMDQ0MjQ4ZiksIEZJTFQoMC4wNDQ1MTRmKX0sCisgICAgLyosIEZJTFQoIDAuMDI2NTc3ZiksIEZJTFQoIDAuMDI2NDEzZiksIEZJTFQoIDAuMDI2MTQyZikgfSAgKi8gLyogICAgICAgICAgICAgICAgICAgICAgICAgbDprYmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK307CmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2FhY19yb20uaCBiL2xpYkFBQ2RlYy9zcmMvYWFjX3JvbS5oCmluZGV4IGYzMTRhMmQuLmZmYWY5NTEgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvYWFjX3JvbS5oCisrKyBiL2xpYkFBQ2RlYy9zcmMvYWFjX3JvbS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorCiAgICBEZXNjcmlwdGlvbjogRGVmaW5pdGlvbiBvZiBjb25zdGFudCB0YWJsZXMKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmbmRlZiBBQUNfUk9NX0gKICNkZWZpbmUgQUFDX1JPTV9ICkBAIC05NiwxMyArMTA4LDI2IEBACiAjaW5jbHVkZSAiYWFjZGVjX2hjcl90eXBlcy5oIgogI2luY2x1ZGUgImFhY2RlY19oY3JzLmgiCiAKLSNkZWZpbmUgQUFDX05GX05PX1JBTkRPTV9WQUwgIDUxMiAgIC8qITwgU2l6ZSBvZiByYW5kb20gbnVtYmVyIGFycmF5IGZvciBub2lzZSBmbG9vciAqLworI2RlZmluZSBQQ01fREVDIEZJWFBfREJMCisjZGVmaW5lIE1BWFZBTF9QQ01fREVDIE1BWFZBTF9EQkwKKyNkZWZpbmUgTUlOVkFMX1BDTV9ERUMgTUlOVkFMX0RCTAorI2RlZmluZSBGSVhQX0RCTDJQQ01fREVDKHgpICh4KQorI2RlZmluZSBQQ01fREVDMkZJWFBfREJMKHgpICh4KQorI2RlZmluZSBQQ01fREVDX0JJVFMgREZSQUNUX0JJVFMKKyNkZWZpbmUgUENNX0RFQzJGWF9QQ00oeCkgRlhfREJMMkZYX1BDTSh4KQorI2RlZmluZSBGWF9QQ00yUENNX0RFQyh4KSBGWF9QQ00yRlhfREJMKHgpCisKKyNkZWZpbmUgQUFDREVDX01BWF9DSF9DT05GIDE0CisjZGVmaW5lIEFBQ0RFQ19DSF9FTEVNRU5UU19UQUJfU0laRSA3IC8qITwgU2l6ZSBvZiBlbGVtZW50IHRhYmxlcyAqLworCisjZGVmaW5lIEFBQ19ORl9OT19SQU5ET01fVkFMIFwKKyAgNTEyIC8qITwgU2l6ZSBvZiByYW5kb20gbnVtYmVyIGFycmF5IGZvciBub2lzZSBmbG9vciAqLwogCiAjZGVmaW5lIElOVl9RVUFOVF9UQUJMRVNJWkUgMjU2CiAKLWV4dGVybiBjb25zdCBGSVhQX0RCTCBJbnZlcnNlUXVhbnRUYWJsZSBbSU5WX1FVQU5UX1RBQkxFU0laRSArIDFdIDsKLWV4dGVybiBjb25zdCBGSVhQX0RCTCBNYW50aXNzYVRhYmxlIFs0XVsxNF0gOwotZXh0ZXJuIGNvbnN0IFNDSEFSIEV4cG9uZW50VGFibGUgWzRdWzE0XSA7CitleHRlcm4gY29uc3QgRklYUF9EQkwgSW52ZXJzZVF1YW50VGFibGVbSU5WX1FVQU5UX1RBQkxFU0laRSArIDFdOworZXh0ZXJuIGNvbnN0IEZJWFBfREJMIE1hbnRpc3NhVGFibGVbNF1bMTRdOworZXh0ZXJuIGNvbnN0IFNDSEFSIEV4cG9uZW50VGFibGVbNF1bMTRdOwogCiAjZGVmaW5lIE5VTV9MRF9DT0VGXzUxMiAxNTM2CiAjZGVmaW5lIE5VTV9MRF9DT0VGXzQ4MCAxNDQwCkBAIC0xMTIsNiArMTM3LDExIEBACiAjZGVmaW5lIFdUUzIgKC0yKQogZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIExvd0RlbGF5U3ludGhlc2lzNTEyWzE1MzZdOwogZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIExvd0RlbGF5U3ludGhlc2lzNDgwWzE0NDBdOworZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIExvd0RlbGF5U3ludGhlc2lzMjU2Wzc2OF07CitleHRlcm4gY29uc3QgRklYUF9XVEIgTG93RGVsYXlTeW50aGVzaXMyNDBbNzIwXTsKK2V4dGVybiBjb25zdCBGSVhQX1dUQiBMb3dEZWxheVN5bnRoZXNpczE2MFs0ODBdOworZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIExvd0RlbGF5U3ludGhlc2lzMTI4WzM4NF07CitleHRlcm4gY29uc3QgRklYUF9XVEIgTG93RGVsYXlTeW50aGVzaXMxMjBbMzYwXTsKIAogdHlwZWRlZiBzdHJ1Y3QgewogICBjb25zdCBTSE9SVCAqc2ZiT2Zmc2V0TG9uZzsKQEAgLTEyMywxMyArMTUzLDkgQEAKIGV4dGVybiBjb25zdCBTRkJfSU5GTyBzZmJPZmZzZXRUYWJsZXNbNV1bMTZdOwogCiAvKiBIdWZmbWFuIHRhYmxlcyAqLwotZW51bSB7Ci0gIEh1ZmZtYW5CaXRzID0gMiwKLSAgSHVmZm1hbkVudHJpZXMgPSAoMSA8PCBIdWZmbWFuQml0cykKLX07CitlbnVtIHsgSHVmZm1hbkJpdHMgPSAyLCBIdWZmbWFuRW50cmllcyA9ICgxIDw8IEh1ZmZtYW5CaXRzKSB9OwogCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICBjb25zdCBVU0hPUlQgKCpDb2RlQm9vaylbSHVmZm1hbkVudHJpZXNdOwogICBVQ0hBUiBEaW1lbnNpb247CiAgIFVDSEFSIG51bUJpdHM7CkBAIC0xMzksMjggKzE2NSwyNiBAQAogZXh0ZXJuIGNvbnN0IENvZGVCb29rRGVzY3JpcHRpb24gQUFDY29kZUJvb2tEZXNjcmlwdGlvblRhYmxlWzEzXTsKIGV4dGVybiBjb25zdCBDb2RlQm9va0Rlc2NyaXB0aW9uIEFBQ2NvZGVCb29rRGVzY3JpcHRpb25TQ0w7CiAKK2V4dGVybiBjb25zdCBTVEFURUZVTkMgYVN0YXRlQ29uc3RhbnQyU3RhdGVbXTsKIAotZXh0ZXJuIGNvbnN0IFNUQVRFRlVOQyAgYVN0YXRlQ29uc3RhbnQyU3RhdGVbXTsKK2V4dGVybiBjb25zdCBTQ0hBUiBhQ29kZWJvb2syU3RhcnRJbnRbXTsKIAotZXh0ZXJuIGNvbnN0IFNDSEFSICAgICAgYUNvZGVib29rMlN0YXJ0SW50W107CitleHRlcm4gY29uc3QgVUNIQVIgYU1pbk9mQ2JQYWlyW107CitleHRlcm4gY29uc3QgVUNIQVIgYU1heE9mQ2JQYWlyW107CiAKLWV4dGVybiBjb25zdCBVQ0hBUiAgICAgIGFNaW5PZkNiUGFpcltdOwotZXh0ZXJuIGNvbnN0IFVDSEFSICAgICAgYU1heE9mQ2JQYWlyW107CitleHRlcm4gY29uc3QgVUNIQVIgYU1heEN3TGVuW107CitleHRlcm4gY29uc3QgVUNIQVIgYURpbUNiW107CitleHRlcm4gY29uc3QgVUNIQVIgYURpbUNiU2hpZnRbXTsKK2V4dGVybiBjb25zdCBVQ0hBUiBhU2lnbkNiW107CitleHRlcm4gY29uc3QgVUNIQVIgYUNiUHJpb3JpdHlbXTsKIAotZXh0ZXJuIGNvbnN0IFVDSEFSICAgICAgYU1heEN3TGVuW107Ci1leHRlcm4gY29uc3QgVUNIQVIgICAgICBhRGltQ2JbXTsKLWV4dGVybiBjb25zdCBVQ0hBUiAgICAgIGFEaW1DYlNoaWZ0W107Ci1leHRlcm4gY29uc3QgVUNIQVIgICAgICBhU2lnbkNiW107Ci1leHRlcm4gY29uc3QgVUNIQVIgICAgICBhQ2JQcmlvcml0eVtdOworZXh0ZXJuIGNvbnN0IFVJTlQgKmFIdWZmVGFibGVbXTsKK2V4dGVybiBjb25zdCBTQ0hBUiAqYVF1YW50VGFibGVbXTsKIAotZXh0ZXJuIGNvbnN0IFVJTlQgICAgICAqYUh1ZmZUYWJsZVtdOwotZXh0ZXJuIGNvbnN0IFNDSEFSICAgICAqYVF1YW50VGFibGVbXTsKK2V4dGVybiBjb25zdCBVU0hPUlQgYUxhcmdlc3RBYnNvbHV0ZVZhbHVlW107CiAKLWV4dGVybiBjb25zdCBVU0hPUlQgICAgIGFMYXJnZXN0QWJzb2x1dGVWYWx1ZVtdOwotCi1leHRlcm4gY29uc3QgVUlOVCAgIGFIdWZmVHJlZVJ2bGNFc2NhcGVbXTsKLWV4dGVybiBjb25zdCBVSU5UICAgYUh1ZmZUcmVlUnZsQ29kZXdkc1tdOwotCitleHRlcm4gY29uc3QgVUlOVCBhSHVmZlRyZWVSdmxjRXNjYXBlW107CitleHRlcm4gY29uc3QgVUlOVCBhSHVmZlRyZWVSdmxDb2Rld2RzW107CiAKIGV4dGVybiBjb25zdCBVQ0hBUiB0bnNfbWF4X2JhbmRzX3RibFsxM11bMl07CiAKQEAgLTE3Miw3ICsxOTYsMTAgQEAKIGV4dGVybiBjb25zdCBGSVhQX1RDQyBGREthYWNEZWNfdG5zQ29lZmYzWzhdOwogZXh0ZXJuIGNvbnN0IEZJWFBfVENDIEZES2FhY0RlY190bnNDb2VmZjRbMTZdOwogCi1leHRlcm4gY29uc3QgVVNIT1JUIHJhbmRvbVNpZ25bQUFDX05GX05PX1JBTkRPTV9WQUwvMTZdOworZXh0ZXJuIGNvbnN0IFVDSEFSIEZES2FhY0RlY190bnNDb2VmZjNfZ2Fpbl9sZFtdOworZXh0ZXJuIGNvbnN0IFVDSEFSIEZES2FhY0RlY190bnNDb2VmZjRfZ2Fpbl9sZFtdOworCitleHRlcm4gY29uc3QgVVNIT1JUIEFhY0RlY19yYW5kb21TaWduW0FBQ19ORl9OT19SQU5ET01fVkFMIC8gMTZdOwogCiBleHRlcm4gY29uc3QgRklYUF9EQkwgcG93Ml9kaXYyNG1pbnVzMVs0N107CiBleHRlcm4gY29uc3QgaW50IG9mZnNldFRhYlsyXVsxNl07CkBAIC0xODMsNiArMjEwLDI4IEBACiBleHRlcm4gY29uc3QgVUNIQVIgY2hhbm5lbE1hcHBpbmdUYWJsZVdBVlsxNV1bOF07CiAKIC8qIExvb2t1cCB0YWJsZXMgZm9yIGVsZW1lbnRzIGluIEVSIGJpdHN0cmVhbSAqLwotZXh0ZXJuIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGVsZW1lbnRzVGFiWzE1XVs3XTsKK2V4dGVybiBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbGVtZW50c1RhYltBQUNERUNfTUFYX0NIX0NPTkZdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQUFDREVDX0NIX0VMRU1FTlRTX1RBQl9TSVpFXTsKKworI2RlZmluZSBTRl9GTkFfQ09FRkZTIFwKKyAgMSAvKiBDb21waWxlLXRpbWUgcHJlc2NhbGVyIGZvciBNRFNULWZpbHRlciBjb2VmZmljaWVudHMuICovCisvKiBTRl9GTkFfQ09FRkZTID4gMCBzaG91bGQgb25seSBiZSBjb25zaWRlcmVkIGZvciBGSVhQX0RCTC1jb2VmZmljaWVudHMgICovCisvKiAoaS5lLiBpZiBDUExYX1BSRURfRklMVEVSXzE2QklUIGlzIG5vdCBkZWZpbmVkKS4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiBXaXRoIEZJWFBfREJMIGxvc3Mgb2YgcHJlY2lzaW9uIGlzIHBvc3NpYmxlIGZvciBTRl9GTkFfQ09FRkZTID4gMTEuICAgICovCisKKyNpZmRlZiBDUExYX1BSRURfRklMVEVSXzE2QklUCisjZGVmaW5lIEZJWFBfRklMVCBGSVhQX1NHTAorI2RlZmluZSBGSUxUKGEpICgoRkwyRlhDT05TVF9TR0woYSkpID4+IFNGX0ZOQV9DT0VGRlMpCisjZWxzZQorI2RlZmluZSBGSVhQX0ZJTFQgRklYUF9EQkwKKyNkZWZpbmUgRklMVChhKSAoKEZMMkZYQ09OU1RfREJMKGEpKSA+PiBTRl9GTkFfQ09FRkZTKQorI2VuZGlmCisKK2V4dGVybiBjb25zdCBGSVhQX0ZJTFQgbWRzdF9maWx0X2NvZWZfY3VyclsyMF1bM107IC8qIE1EU1QtZmlsdGVyIGNvZWZmaWNpZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXMgdXNlZCBmb3IgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93ICAqLworZXh0ZXJuIGNvbnN0IEZJWFBfRklMVCBtZHN0X2ZpbHRfY29lZl9wcmV2WzZdWzRdOyAgLyogTURTVC1maWx0ZXIgY29lZmZpY2llbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlcyB1c2VkIGZvciBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93ICovCiAKICNlbmRpZiAvKiAjaWZuZGVmIEFBQ19ST01fSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfZHJjLmNwcCBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2RyYy5jcHAKaW5kZXggZWI4ZTQxMC4uOTIyYTA5ZSAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfZHJjLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL2FhY2RlY19kcmMuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLcKpIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMzcgKzkwLDY0IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEdyaWViZWwKKwogICAgRGVzY3JpcHRpb246IER5bmFtaWMgcmFuZ2UgY29udHJvbCAoRFJDKSBkZWNvZGVyIHRvb2wgZm9yIEFBQwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiYWFjZGVjX2RyYy5oIgogCi0KICNpbmNsdWRlICJjaGFubmVsaW5mby5oIgogI2luY2x1ZGUgImFhY19yb20uaCIKIAotICNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCisjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgogCiAvKgogICogRHluYW1pYyBSYW5nZSBDb250cm9sCiAgKi8KIAogLyogRm9yIHBhcmFtZXRlciBjb252ZXJzaW9uICovCi0jZGVmaW5lIERSQ19QQVJBTUVURVJfQklUUyAgICAgICAgKCA3ICkKLSNkZWZpbmUgRFJDX01BWF9RVUFOVF9TVEVQUyAgICAgICAoIDE8PERSQ19QQVJBTUVURVJfQklUUyApCi0jZGVmaW5lIERSQ19NQVhfUVVBTlRfRkFDVE9SICAgICAgKCBEUkNfTUFYX1FVQU5UX1NURVBTLTEgKQotI2RlZmluZSBEUkNfUEFSQU1fUVVBTlRfU1RFUCAgICAgICggRkwyRlhDT05TVF9EQkwoMS4wZi8oZmxvYXQpRFJDX01BWF9RVUFOVF9GQUNUT1IpICkKLSNkZWZpbmUgRFJDX1BBUkFNX1NDQUxFICAgICAgICAgICAoIDEgKQorI2RlZmluZSBEUkNfUEFSQU1FVEVSX0JJVFMgKDcpCisjZGVmaW5lIERSQ19NQVhfUVVBTlRfU1RFUFMgKDEgPDwgRFJDX1BBUkFNRVRFUl9CSVRTKQorI2RlZmluZSBEUkNfTUFYX1FVQU5UX0ZBQ1RPUiAoRFJDX01BWF9RVUFOVF9TVEVQUyAtIDEpCisjZGVmaW5lIERSQ19QQVJBTV9RVUFOVF9TVEVQIFwKKyAgKEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpRFJDX01BWF9RVUFOVF9GQUNUT1IpKQorI2RlZmluZSBEUkNfUEFSQU1fU0NBTEUgKDEpCisjZGVmaW5lIERSQ19TQ0FMSU5HX01BWCBcCisgICgoRklYUF9EQkwpKChJTlQpKERSQ19QQVJBTV9RVUFOVF9TVEVQID4+IERSQ19QQVJBTV9TQ0FMRSkgKiAoSU5UKTEyNykpCiAKLSNkZWZpbmUgTUFYX1JFRkVSRU5DRV9MRVZFTCAgICAgICAoIDEyNyApCisjZGVmaW5lIERSQ19CTE9DS19MRU4gKDEwMjQpCisjZGVmaW5lIERSQ19CQU5EX01VTFQgKDQpCisjZGVmaW5lIERSQ19CTE9DS19MRU5fRElWX0JBTkRfTVVMVCAoRFJDX0JMT0NLX0xFTiAvIERSQ19CQU5EX01VTFQpCiAKLSAjZGVmaW5lIERWQl9BTkNfREFUQV9TWU5DX0JZVEUgICAoIDB4QkMgKSAgICAvKiBEVkIgYW5jaWxsYXJ5IGRhdGEgc3luYyBieXRlLiAqLworI2RlZmluZSBNQVhfUkVGRVJFTkNFX0xFVkVMICgxMjcpCisKKyNkZWZpbmUgRFJDX0hFQVZZX1RIUkVTSE9MRF9EQiAoMTApCisKKyNkZWZpbmUgRFZCX0FOQ19EQVRBX1NZTkNfQllURSAoMHhCQykgLyogRFZCIGFuY2lsbGFyeSBkYXRhIHN5bmMgYnl0ZS4gKi8KKworI2RlZmluZSBPRkYgMAorI2RlZmluZSBPTiAxCisKK3N0YXRpYyBJTlQgY29udmVydF9kcmNQYXJhbShGSVhQX0RCTCBwYXJhbV9kYmwpIHsKKyAgLyogY29udmVydHMgYW4gaW50ZXJuYWwgRFJDIGJvb3N0L2N1dCBzY2FsaW5nIGZhY3RvciBpbiBGSVhQX0RCTAorICAgICAod2hpY2ggaXMgZG93bnNjYWxlZCBieSBEUkNfUEFSQU1fU0NBTEUpCisgICAgIGJhY2sgdG8gYW4gaW50ZWdlciB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEyNy4gKi8KKyAgTE9ORyBwYXJhbV9sb25nOworCisgIHBhcmFtX2xvbmcgPSAoTE9ORylwYXJhbV9kYmwgPj4gNzsKKyAgcGFyYW1fbG9uZyA9IHBhcmFtX2xvbmcgKiAoSU5UKURSQ19NQVhfUVVBTlRfRkFDVE9SOworICBwYXJhbV9sb25nID4+PSAzMSAtIDcgLSBEUkNfUEFSQU1fU0NBTEUgLSAxOworICBwYXJhbV9sb25nICs9IDE7IC8qIGZvciByb3VuZGluZyAqLworICBwYXJhbV9sb25nID4+PSAxOworCisgIHJldHVybiAoSU5UKXBhcmFtX2xvbmc7Cit9CiAKIC8qIQogICBcYnJpZWYgSW5pdGlhbGl6ZSBEUkMgaW5mb3JtYXRpb24KQEAgLTExOCw5ICsxNTYsNyBAQAogCiAgIFxyZXR1cm4gbm9uZQogKi8KLXZvaWQgYWFjRGVjb2Rlcl9kcmNJbml0ICgKLSAgICBIQU5ETEVfQUFDX0RSQyBzZWxmICkKLXsKK3ZvaWQgYWFjRGVjb2Rlcl9kcmNJbml0KEhBTkRMRV9BQUNfRFJDIHNlbGYpIHsKICAgQ0RyY1BhcmFtcyAqcFBhcmFtczsKIAogICBpZiAoc2VsZiA9PSBOVUxMKSB7CkBAIC0xMjgsMjggKzE2NCwzNiBAQAogICB9CiAKICAgLyogaW5pdCBjb250cm9sIGZpZWxkcyAqLwotICBzZWxmLT5lbmFibGUgPSAwOworICBzZWxmLT5lbmFibGUgPSBPRkY7CiAgIHNlbGYtPm51bVRocmVhZHMgPSAwOwogCiAgIC8qIGluaXQgcGFyYW1zICovCiAgIHBQYXJhbXMgPSAmc2VsZi0+cGFyYW1zOwogICBwUGFyYW1zLT5ic0RlbGF5RW5hYmxlID0gMDsKLSAgcFBhcmFtcy0+Y3V0ICAgICAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgcFBhcmFtcy0+dXNyQ3V0ICAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgcFBhcmFtcy0+Ym9vc3QgICAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgcFBhcmFtcy0+Y3V0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgIHBQYXJhbXMtPnVzckN1dCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICBwUGFyYW1zLT5ib29zdCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICBwUGFyYW1zLT51c3JCb29zdCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICBwUGFyYW1zLT50YXJnZXRSZWZMZXZlbCA9IC0xOwogICBwUGFyYW1zLT5leHBpcnlGcmFtZSA9IEFBQ0RFQ19EUkNfREZMVF9FWFBJUllfRlJBTUVTOwotICBwUGFyYW1zLT5hcHBseURpZ2l0YWxOb3JtID0gMDsKLSAgcFBhcmFtcy0+YXBwbHlIZWF2eUNvbXByZXNzaW9uID0gMDsKKyAgcFBhcmFtcy0+YXBwbHlEaWdpdGFsTm9ybSA9IE9GRjsKKyAgcFBhcmFtcy0+YXBwbHlIZWF2eUNvbXByZXNzaW9uID0gT0ZGOworICBwUGFyYW1zLT51c3JBcHBseUhlYXZ5Q29tcHJlc3Npb24gPSBPRkY7CisKKyAgcFBhcmFtcy0+ZGVmYXVsdFByZXNlbnRhdGlvbk1vZGUgPSBESVNBQkxFRF9QQVJBTUVURVJfSEFORExJTkc7CisgIHBQYXJhbXMtPmVuY29kZXJUYXJnZXRMZXZlbCA9IE1BWF9SRUZFUkVOQ0VfTEVWRUw7IC8qIHdvcnN0IGNhc2UgYXNzdW1wdGlvbiAqLworCisgIHNlbGYtPnVwZGF0ZSA9IDE7CisgIHNlbGYtPm51bU91dENoYW5uZWxzID0gMDsKKyAgc2VsZi0+cHJldkFhY051bUNoYW5uZWxzID0gMDsKIAogICAvKiBpbml0aWFsIHByb2dyYW0gcmVmIGxldmVsID0gdGFyZ2V0IHJlZiBsZXZlbCAqLwogICBzZWxmLT5wcm9nUmVmTGV2ZWwgPSBwUGFyYW1zLT50YXJnZXRSZWZMZXZlbDsKICAgc2VsZi0+cHJvZ1JlZkxldmVsUHJlc2VudCA9IDA7CiAgIHNlbGYtPnByZXNNb2RlID0gLTE7CisgIHNlbGYtPnVuaURyY1ByZWNlZGVuY2UgPSAwOwogfQogCi0KIC8qIQogICBcYnJpZWYgSW5pdGlhbGl6ZSBEUkMgY29udHJvbCBkYXRhIGZvciBvbmUgY2hhbm5lbAogCkBAIC0xNTcsMjAgKzIwMSwxNyBAQAogCiAgIFxyZXR1cm4gbm9uZQogKi8KLXZvaWQgYWFjRGVjb2Rlcl9kcmNJbml0Q2hhbm5lbERhdGEgKAotICAgIENEcmNDaGFubmVsRGF0YSAqcERyY0NoRGF0YSApCi17Cit2b2lkIGFhY0RlY29kZXJfZHJjSW5pdENoYW5uZWxEYXRhKENEcmNDaGFubmVsRGF0YSAqcERyY0NoRGF0YSkgewogICBpZiAocERyY0NoRGF0YSAhPSBOVUxMKSB7CiAgICAgcERyY0NoRGF0YS0+ZXhwaXJ5Q291bnQgPSAwOwotICAgIHBEcmNDaERhdGEtPm51bUJhbmRzICAgID0gMTsKLSAgICBwRHJjQ2hEYXRhLT5iYW5kVG9wWzBdICA9ICgxMDI0ID4+IDIpIC0gMTsKKyAgICBwRHJjQ2hEYXRhLT5udW1CYW5kcyA9IDE7CisgICAgcERyY0NoRGF0YS0+YmFuZFRvcFswXSA9IERSQ19CTE9DS19MRU5fRElWX0JBTkRfTVVMVCAtIDE7CiAgICAgcERyY0NoRGF0YS0+ZHJjVmFsdWVbMF0gPSAwOwogICAgIHBEcmNDaERhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWUgPSAwOwogICAgIHBEcmNDaERhdGEtPmRyY0RhdGFUeXBlID0gVU5LTk9XTl9QQVlMT0FEOwogICB9CiB9CiAKLQogLyohCiAgIFxicmllZiAgU2V0IG9uZSBzaW5nbGUgRFJDIHBhcmFtZXRlcgogCkBAIC0xODAsMTQxICsyMjEsMTUyIEBACiAKICAgXHJldHVybiBhbiBlcnJvciBjb2RlLgogKi8KLUFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0gKAotICAgIEhBTkRMRV9BQUNfRFJDICAgIHNlbGYsCi0gICAgQUFDREVDX0RSQ19QQVJBTSAgcGFyYW0sCi0gICAgSU5UICAgICAgICAgICAgICAgdmFsdWUgKQoteworQUFDX0RFQ09ERVJfRVJST1IgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbShIQU5ETEVfQUFDX0RSQyBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNERUNfRFJDX1BBUkFNIHBhcmFtLCBJTlQgdmFsdWUpIHsKICAgQUFDX0RFQ09ERVJfRVJST1IgRXJyb3JTdGF0dXMgPSBBQUNfREVDX09LOwogCi0gIHN3aXRjaCAocGFyYW0pCi0gIHsKLSAgY2FzZSBEUkNfQ1VUX1NDQUxFOgotICAgIC8qIHNldCBhdHRlbnVhdGlvbiBzY2FsZSBmYWN0b3IgKi8KLSAgICBpZiAoICh2YWx1ZSA8IDApCi0gICAgICB8fCAodmFsdWUgPiBEUkNfTUFYX1FVQU5UX0ZBQ1RPUikgKSB7Ci0gICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKLSAgICB9Ci0gICAgaWYgKHNlbGYgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7Ci0gICAgfQotICAgIHNlbGYtPnBhcmFtcy51c3JDdXQgPSAoRklYUF9EQkwpKChJTlQpKERSQ19QQVJBTV9RVUFOVF9TVEVQPj5EUkNfUEFSQU1fU0NBTEUpICogKElOVCl2YWx1ZSk7Ci0gICAgaWYgKHNlbGYtPnBhcmFtcy5hcHBseUhlYXZ5Q29tcHJlc3Npb24gPT0gMCkKLSAgICAgIHNlbGYtPnBhcmFtcy5jdXQgPSBzZWxmLT5wYXJhbXMudXNyQ3V0OwotICAgIGJyZWFrOwotICBjYXNlIERSQ19CT09TVF9TQ0FMRToKLSAgICAvKiBzZXQgYm9vc3QgZmFjdG9yICovCi0gICAgaWYgKCAodmFsdWUgPCAwKQotICAgICAgfHwgKHZhbHVlID4gRFJDX01BWF9RVUFOVF9GQUNUT1IpICkgewotICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7Ci0gICAgfQotICAgIGlmIChzZWxmID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwotICAgIH0KLSAgICBzZWxmLT5wYXJhbXMudXNyQm9vc3QgPSAoRklYUF9EQkwpKChJTlQpKERSQ19QQVJBTV9RVUFOVF9TVEVQPj5EUkNfUEFSQU1fU0NBTEUpICogKElOVCl2YWx1ZSk7Ci0gICAgaWYgKHNlbGYtPnBhcmFtcy5hcHBseUhlYXZ5Q29tcHJlc3Npb24gPT0gMCkKLSAgICAgIHNlbGYtPnBhcmFtcy5ib29zdCA9IHNlbGYtPnBhcmFtcy51c3JCb29zdDsKLSAgICBicmVhazsKLSAgY2FzZSBUQVJHRVRfUkVGX0xFVkVMOgotICAgIGlmICggdmFsdWUgPiAgTUFYX1JFRkVSRU5DRV9MRVZFTAotICAgICAgfHwgdmFsdWUgPCAtTUFYX1JFRkVSRU5DRV9MRVZFTCApIHsKLSAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwotICAgIH0KLSAgICBpZiAoc2VsZiA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKLSAgICB9Ci0gICAgaWYgKHZhbHVlIDwgMCkgewotICAgICAgc2VsZi0+cGFyYW1zLmFwcGx5RGlnaXRhbE5vcm0gPSAwOwotICAgICAgc2VsZi0+cGFyYW1zLnRhcmdldFJlZkxldmVsID0gLTE7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgLyogcmVmX2xldmVsIG11c3QgYmUgYmV0d2VlbiAwIGFuZCBNQVhfUkVGRVJFTkNFX0xFVkVMLCBpbmNsdXNpdmUgKi8KLSAgICAgIHNlbGYtPnBhcmFtcy5hcHBseURpZ2l0YWxOb3JtID0gMTsKLSAgICAgIGlmIChzZWxmLT5wYXJhbXMudGFyZ2V0UmVmTGV2ZWwgIT0gKFNDSEFSKXZhbHVlKSB7Ci0gICAgICAgIHNlbGYtPnBhcmFtcy50YXJnZXRSZWZMZXZlbCA9IChTQ0hBUil2YWx1ZTsKLSAgICAgICAgc2VsZi0+cHJvZ1JlZkxldmVsID0gKFNDSEFSKXZhbHVlOyAgLyogQWx3YXlzIHNldCB0aGUgcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgZXF1YWwgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCBsZXZlbCBhY2NvcmRpbmcgdG8gNC41LjIuNy4zIG9mIElTTy9JRUMgMTQ0OTYtMy4gKi8KKyAgc3dpdGNoIChwYXJhbSkgeworICAgIGNhc2UgRFJDX0NVVF9TQ0FMRToKKyAgICAgIC8qIHNldCBhdHRlbnVhdGlvbiBzY2FsZSBmYWN0b3IgKi8KKyAgICAgIGlmICgodmFsdWUgPCAwKSB8fCAodmFsdWUgPiBEUkNfTUFYX1FVQU5UX0ZBQ1RPUikpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CiAgICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIEFQUExZX05PUk1BTElaQVRJT046Ci0gICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEpIHsKLSAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwotICAgIH0KLSAgICBpZiAoc2VsZiA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKLSAgICB9Ci0gICAgLyogU3RvcmUgbmV3IHBhcmFtZXRlciB2YWx1ZSAqLwotICAgIHNlbGYtPnBhcmFtcy5hcHBseURpZ2l0YWxOb3JtID0gKFVDSEFSKXZhbHVlOwotICAgIGJyZWFrOwotICBjYXNlIEFQUExZX0hFQVZZX0NPTVBSRVNTSU9OOgotICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAxKSB7Ci0gICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKLSAgICB9Ci0gICAgaWYgKHNlbGYgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7Ci0gICAgfQotICAgIGlmIChzZWxmLT5wYXJhbXMuYXBwbHlIZWF2eUNvbXByZXNzaW9uICE9IChVQ0hBUil2YWx1ZSkgewotICAgICAgaWYgKHZhbHVlID09IDEpIHsKLSAgICAgICAgLyogRGlzYWJsZSBzY2FsaW5nIG9mIERSQyB2YWx1ZXMgYnkgc2V0dGluZyB0aGUgbWF4IHZhbHVlcyAqLwotICAgICAgICBzZWxmLT5wYXJhbXMuYm9vc3QgPSBGTDJGWENPTlNUX0RCTCgxLjBmLyhmbG9hdCkoMTw8RFJDX1BBUkFNX1NDQUxFKSk7Ci0gICAgICAgIHNlbGYtPnBhcmFtcy5jdXQgICA9IEZMMkZYQ09OU1RfREJMKDEuMGYvKGZsb2F0KSgxPDxEUkNfUEFSQU1fU0NBTEUpKTsKKyAgICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgICAgICB9CisgICAgICBzZWxmLT5wYXJhbXMudXNyQ3V0ID0gKEZJWFBfREJMKSgKKyAgICAgICAgICAoSU5UKShEUkNfUEFSQU1fUVVBTlRfU1RFUCA+PiBEUkNfUEFSQU1fU0NBTEUpICogKElOVCl2YWx1ZSk7CisgICAgICBzZWxmLT51cGRhdGUgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfQk9PU1RfU0NBTEU6CisgICAgICAvKiBzZXQgYm9vc3QgZmFjdG9yICovCisgICAgICBpZiAoKHZhbHVlIDwgMCkgfHwgKHZhbHVlID4gRFJDX01BWF9RVUFOVF9GQUNUT1IpKSB7CisgICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgfQorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgIH0KKyAgICAgIHNlbGYtPnBhcmFtcy51c3JCb29zdCA9IChGSVhQX0RCTCkoCisgICAgICAgICAgKElOVCkoRFJDX1BBUkFNX1FVQU5UX1NURVAgPj4gRFJDX1BBUkFNX1NDQUxFKSAqIChJTlQpdmFsdWUpOworICAgICAgc2VsZi0+dXBkYXRlID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFSR0VUX1JFRl9MRVZFTDoKKyAgICAgIGlmICh2YWx1ZSA+IE1BWF9SRUZFUkVOQ0VfTEVWRUwgfHwgdmFsdWUgPCAtTUFYX1JFRkVSRU5DRV9MRVZFTCkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICAgIH0KKyAgICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgICAgICB9CisgICAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgIHNlbGYtPnBhcmFtcy5hcHBseURpZ2l0YWxOb3JtID0gT0ZGOworICAgICAgICBzZWxmLT5wYXJhbXMudGFyZ2V0UmVmTGV2ZWwgPSAtMTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFJlc3RvcmUgdGhlIHVzZXIgcGFyYW1zICovCi0gICAgICAgIHNlbGYtPnBhcmFtcy5ib29zdCA9IHNlbGYtPnBhcmFtcy51c3JCb29zdDsKLSAgICAgICAgc2VsZi0+cGFyYW1zLmN1dCAgID0gc2VsZi0+cGFyYW1zLnVzckN1dDsKKyAgICAgICAgLyogcmVmX2xldmVsIG11c3QgYmUgYmV0d2VlbiAwIGFuZCBNQVhfUkVGRVJFTkNFX0xFVkVMLCBpbmNsdXNpdmUgKi8KKyAgICAgICAgc2VsZi0+cGFyYW1zLmFwcGx5RGlnaXRhbE5vcm0gPSBPTjsKKyAgICAgICAgaWYgKHNlbGYtPnBhcmFtcy50YXJnZXRSZWZMZXZlbCAhPSAoU0NIQVIpdmFsdWUpIHsKKyAgICAgICAgICBzZWxmLT5wYXJhbXMudGFyZ2V0UmVmTGV2ZWwgPSAoU0NIQVIpdmFsdWU7CisgICAgICAgICAgc2VsZi0+cHJvZ1JlZkxldmVsID0gKFNDSEFSKXZhbHVlOyAvKiBBbHdheXMgc2V0IHRoZSBwcm9ncmFtIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgZXF1YWwgdG8gdGhlIHRhcmdldCBsZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nIHRvIDQuNS4yLjcuMyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNPL0lFQyAxNDQ5Ni0zLiAqLworICAgICAgICB9CisgICAgICAgIHNlbGYtPnVwZGF0ZSA9IDE7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEFQUExZX05PUk1BTElaQVRJT046CisgICAgICBpZiAoKHZhbHVlICE9IE9GRikgJiYgKHZhbHVlICE9IE9OKSkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICAgIH0KKyAgICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CiAgICAgICB9CiAgICAgICAvKiBTdG9yZSBuZXcgcGFyYW1ldGVyIHZhbHVlICovCi0gICAgICBzZWxmLT5wYXJhbXMuYXBwbHlIZWF2eUNvbXByZXNzaW9uID0gKFVDSEFSKXZhbHVlOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBEUkNfQlNfREVMQVk6Ci0gICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEpIHsKKyAgICAgIHNlbGYtPnBhcmFtcy5hcHBseURpZ2l0YWxOb3JtID0gKFVDSEFSKXZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUFBMWV9IRUFWWV9DT01QUkVTU0lPTjoKKyAgICAgIGlmICgodmFsdWUgIT0gT0ZGKSAmJiAodmFsdWUgIT0gT04pKSB7CisgICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgfQorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgIH0KKyAgICAgIC8qIFN0b3JlIG5ldyBwYXJhbWV0ZXIgdmFsdWUgKi8KKyAgICAgIHNlbGYtPnBhcmFtcy51c3JBcHBseUhlYXZ5Q29tcHJlc3Npb24gPSAoVUNIQVIpdmFsdWU7CisgICAgICBzZWxmLT51cGRhdGUgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBERUZBVUxUX1BSRVNFTlRBVElPTl9NT0RFOgorICAgICAgaWYgKHZhbHVlIDwgQUFDX0RSQ19QQVJBTUVURVJfSEFORExJTkdfRElTQUJMRUQgfHwKKyAgICAgICAgICB2YWx1ZSA+IEFBQ19EUkNfUFJFU0VOVEFUSU9OX01PREVfMl9ERUZBVUxUKSB7CisgICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgfQorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgIH0KKyAgICAgIHNlbGYtPnBhcmFtcy5kZWZhdWx0UHJlc2VudGF0aW9uTW9kZSA9CisgICAgICAgICAgKEFBQ0RFQ19EUkNfUEFSQU1FVEVSX0hBTkRMSU5HKXZhbHVlOworICAgICAgc2VsZi0+dXBkYXRlID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRU5DT0RFUl9UQVJHRVRfTEVWRUw6CisgICAgICBpZiAodmFsdWUgPiBNQVhfUkVGRVJFTkNFX0xFVkVMIHx8IHZhbHVlIDwgMCkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICAgIH0KKyAgICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgICAgICB9CisgICAgICBzZWxmLT5wYXJhbXMuZW5jb2RlclRhcmdldExldmVsID0gKFVDSEFSKXZhbHVlOworICAgICAgc2VsZi0+dXBkYXRlID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX0JTX0RFTEFZOgorICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgICB9CisgICAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOworICAgICAgfQorICAgICAgc2VsZi0+cGFyYW1zLmJzRGVsYXlFbmFibGUgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX0RBVEFfRVhQSVJZX0ZSQU1FOgorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgIH0KKyAgICAgIHNlbGYtPnBhcmFtcy5leHBpcnlGcmFtZSA9ICh2YWx1ZSA+IDApID8gKFVJTlQpdmFsdWUgOiAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNQVhfT1VUUFVUX0NIQU5ORUxTOgorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgIH0KKyAgICAgIHNlbGYtPm51bU91dENoYW5uZWxzID0gKElOVCl2YWx1ZTsKKyAgICAgIHNlbGYtPnVwZGF0ZSA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVOSURSQ19QUkVDRURFTkNFOgorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgIH0KKyAgICAgIHNlbGYtPnVuaURyY1ByZWNlZGVuY2UgPSAoVUNIQVIpdmFsdWU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgogICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7Ci0gICAgfQotICAgIGlmIChzZWxmID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwotICAgIH0KLSAgICBzZWxmLT5wYXJhbXMuYnNEZWxheUVuYWJsZSA9IHZhbHVlOwotICAgIGJyZWFrOwotICBjYXNlIERSQ19EQVRBX0VYUElSWV9GUkFNRToKLSAgICBpZiAoc2VsZiA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKLSAgICB9Ci0gICAgc2VsZi0+cGFyYW1zLmV4cGlyeUZyYW1lID0gKFVJTlQpdmFsdWU7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7Ci0gIH0gIC8qIHN3aXRjaChwYXJhbSkgKi8KLQotICAvKiBzd2l0Y2ggb24vb2ZmIHByb2Nlc3NpbmcgKi8KLSAgc2VsZi0+ZW5hYmxlID0gKCAoc2VsZi0+cGFyYW1zLmJvb3N0ID4gKEZJWFBfREJMKTApCi0gICAgICAgICAgICAgICAgfHwgKHNlbGYtPnBhcmFtcy5jdXQgICA+IChGSVhQX0RCTCkwKQotICAgICAgICAgICAgICAgIHx8IChzZWxmLT5wYXJhbXMuYXBwbHlIZWF2eUNvbXByZXNzaW9uICE9IDApCi0gICAgICAgICAgICAgICAgfHwgKHNlbGYtPnBhcmFtcy50YXJnZXRSZWZMZXZlbCA+PSAwKSApOwotCisgIH0gLyogc3dpdGNoKHBhcmFtKSAqLwogCiAgIHJldHVybiBFcnJvclN0YXR1czsKIH0KIAotCi1zdGF0aWMgaW50IHBhcnNlRXhjbHVkZWRDaGFubmVscyggVUlOVCAqZXhjbHVkZWRDaG5zTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicyApCi17CitzdGF0aWMgaW50IHBhcnNlRXhjbHVkZWRDaGFubmVscyhVSU5UICpleGNsdWRlZENobnNNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMpIHsKICAgVUlOVCBleGNsdWRlTWFzayA9IDA7CiAgIFVJTlQgaSwgajsKLSAgaW50ICBiaXRDbnQgPSA5OworICBpbnQgYml0Q250ID0gOTsKIAotICBmb3IgKGkgPSAwLCBqID0gMTsgaSA8IDc7IGkrKywgajw8PTEpIHsKLSAgICBpZiAoRkRLcmVhZEJpdHMoYnMsMSkpIHsKKyAgZm9yIChpID0gMCwgaiA9IDE7IGkgPCA3OyBpKyssIGogPDw9IDEpIHsKKyAgICBpZiAoRkRLcmVhZEJpdHMoYnMsIDEpKSB7CiAgICAgICBleGNsdWRlTWFzayB8PSBqOwogICAgIH0KICAgfQogCiAgIC8qIGFkZGl0aW9uYWxfZXhjbHVkZWRfY2hucyAqLwotICB3aGlsZSAoRkRLcmVhZEJpdHMoYnMsMSkpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrLCBqPDw9MSkgewotICAgICAgaWYgKEZES3JlYWRCaXRzKGJzLDEpKSB7CisgIHdoaWxlIChGREtyZWFkQml0cyhicywgMSkpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrLCBqIDw8PSAxKSB7CisgICAgICBpZiAoRkRLcmVhZEJpdHMoYnMsIDEpKSB7CiAgICAgICAgIGV4Y2x1ZGVNYXNrIHw9IGo7CiAgICAgICB9CiAgICAgfQpAQCAtMzI3LDcgKzM3OSw2IEBACiAgIHJldHVybiAoYml0Q250KTsKIH0KIAotCiAvKiEKICAgXGJyaWVmIFNhdmUgRFJDIHBheWxvYWQgYml0c3RyZWFtIHBvc2l0aW9uCiAKQEAgLTMzNiwxMyArMzg3LDEwIEBACiAKICAgXHJldHVybiBUaGUgbnVtYmVyIG9mIERSQyBwYXlsb2FkIGJpdHMKICovCi1pbnQgYWFjRGVjb2Rlcl9kcmNNYXJrUGF5bG9hZCAoCi0gICAgSEFORExFX0FBQ19EUkMgc2VsZiwKLSAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICBBQUNERUNfRFJDX1BBWUxPQURfVFlQRSB0eXBlICkKLXsKK2ludCBhYWNEZWNvZGVyX2RyY01hcmtQYXlsb2FkKEhBTkRMRV9BQUNfRFJDIHNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDREVDX0RSQ19QQVlMT0FEX1RZUEUgdHlwZSkgewogICBVSU5UIGJzU3RhcnRQb3M7Ci0gIGludCAgaSwgbnVtQmFuZHMgPSAxLCBiaXRDbnQgPSAwOworICBpbnQgaSwgbnVtQmFuZHMgPSAxLCBiaXRDbnQgPSAwOwogCiAgIGlmIChzZWxmID09IE5VTEwpIHsKICAgICByZXR1cm4gMDsKQEAgLTM1MSw5NyArMzk5LDk3IEBACiAgIGJzU3RhcnRQb3MgPSBGREtnZXRWYWxpZEJpdHMoYnMpOwogCiAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgTVBFR19EUkNfRVhUX0RBVEE6Ci0gICAgeworICAgIGNhc2UgTVBFR19EUkNfRVhUX0RBVEE6IHsKICAgICAgIGJpdENudCA9IDQ7CiAKLSAgICAgIGlmIChGREtyZWFkQml0cyhicywxKSkgeyAgICAgICAgICAvKiBwY2VfdGFnX3ByZXNlbnQgKi8KLSAgICAgICAgRkRLcmVhZEJpdHMoYnMsOCk7ICAgICAgICAgICAgICAvKiBwY2VfaW5zdGFuY2VfdGFnICsgZHJjX3RhZ19yZXNlcnZlZF9iaXRzICovCi0gICAgICAgIGJpdENudCs9ODsKKyAgICAgIGlmIChGREtyZWFkQml0cyhicywgMSkpIHsgLyogcGNlX3RhZ19wcmVzZW50ICovCisgICAgICAgIEZES3JlYWRCaXRzKGJzLCA4KTsgICAgIC8qIHBjZV9pbnN0YW5jZV90YWcgKyBkcmNfdGFnX3Jlc2VydmVkX2JpdHMgKi8KKyAgICAgICAgYml0Q250ICs9IDg7CiAgICAgICB9CiAKLSAgICAgIGlmIChGREtyZWFkQml0cyhicywxKSkgeyAgICAgICAgICAvKiBleGNsdWRlZF9jaG5zX3ByZXNlbnQgKi8KLSAgICAgICAgRkRLcmVhZEJpdHMoYnMsNyk7ICAgICAgICAgICAgICAvKiBleGNsdWRlIG1hc2sgWzAuLjddICovCi0gICAgICAgIGJpdENudCs9ODsKLSAgICAgICAgd2hpbGUgKEZES3JlYWRCaXRzKGJzLDEpKSB7ICAgICAvKiBhZGRpdGlvbmFsX2V4Y2x1ZGVkX2NobnMgKi8KLSAgICAgICAgICBGREtyZWFkQml0cyhicyw3KTsgICAgICAgICAgICAvKiBleGNsdWRlIG1hc2sgW3guLnldICovCi0gICAgICAgICAgYml0Q250Kz04OworICAgICAgaWYgKEZES3JlYWRCaXRzKGJzLCAxKSkgeyAvKiBleGNsdWRlZF9jaG5zX3ByZXNlbnQgKi8KKyAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDcpOyAgICAgLyogZXhjbHVkZSBtYXNrIFswLi43XSAqLworICAgICAgICBiaXRDbnQgKz0gODsKKyAgICAgICAgd2hpbGUgKEZES3JlYWRCaXRzKGJzLCAxKSkgeyAvKiBhZGRpdGlvbmFsX2V4Y2x1ZGVkX2NobnMgKi8KKyAgICAgICAgICBGREtyZWFkQml0cyhicywgNyk7ICAgICAgICAvKiBleGNsdWRlIG1hc2sgW3guLnldICovCisgICAgICAgICAgYml0Q250ICs9IDg7CiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgaWYgKEZES3JlYWRCaXRzKGJzLDEpKSB7ICAgICAgICAgIC8qIGRyY19iYW5kc19wcmVzZW50ICovCisgICAgICBpZiAoRkRLcmVhZEJpdHMoYnMsIDEpKSB7ICAgICAgICAgLyogZHJjX2JhbmRzX3ByZXNlbnQgKi8KICAgICAgICAgbnVtQmFuZHMgKz0gRkRLcmVhZEJpdHMoYnMsIDQpOyAvKiBkcmNfYmFuZF9pbmNyICovCi0gICAgICAgIEZES3JlYWRCaXRzKGJzLDQpOyAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgKi8KLSAgICAgICAgYml0Q250Kz04OworICAgICAgICBGREtyZWFkQml0cyhicywgNCk7ICAgICAgICAgICAgIC8qIHJlc2VydmVkICovCisgICAgICAgIGJpdENudCArPSA4OwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgewotICAgICAgICAgIEZES3JlYWRCaXRzKGJzLDgpOyAgICAgICAgICAgIC8qIGRyY19iYW5kX3RvcFtpXSAqLwotICAgICAgICAgIGJpdENudCs9ODsKKyAgICAgICAgICBGREtyZWFkQml0cyhicywgOCk7IC8qIGRyY19iYW5kX3RvcFtpXSAqLworICAgICAgICAgIGJpdENudCArPSA4OwogICAgICAgICB9CiAgICAgICB9CiAKLSAgICAgIGlmIChGREtyZWFkQml0cyhicywxKSkgeyAgICAgICAgICAvKiBwcm9nX3JlZl9sZXZlbF9wcmVzZW50ICovCi0gICAgICAgIEZES3JlYWRCaXRzKGJzLDgpOyAgICAgICAgICAgICAgLyogcHJvZ19yZWZfbGV2ZWwgKyBwcm9nX3JlZl9sZXZlbF9yZXNlcnZlZF9iaXRzICovCi0gICAgICAgIGJpdENudCs9ODsKKyAgICAgIGlmIChGREtyZWFkQml0cyhicywgMSkpIHsgLyogcHJvZ19yZWZfbGV2ZWxfcHJlc2VudCAqLworICAgICAgICBGREtyZWFkQml0cyhicywgOCk7IC8qIHByb2dfcmVmX2xldmVsICsgcHJvZ19yZWZfbGV2ZWxfcmVzZXJ2ZWRfYml0cyAqLworICAgICAgICBiaXRDbnQgKz0gODsKICAgICAgIH0KIAogICAgICAgZm9yIChpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKLSAgICAgICAgRkRLcmVhZEJpdHMoYnMsOCk7ICAgICAgICAgICAgICAvKiBkeW5fcm5nX3NnbltpXSArIGR5bl9ybmdfY3RsW2ldICovCi0gICAgICAgIGJpdENudCs9ODsKKyAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDgpOyAvKiBkeW5fcm5nX3NnbltpXSArIGR5bl9ybmdfY3RsW2ldICovCisgICAgICAgIGJpdENudCArPSA4OwogICAgICAgfQogCi0gICAgICBpZiAoIChzZWxmLT5udW1QYXlsb2FkcyA8IE1BWF9EUkNfVEhSRUFEUykKLSAgICAgICAgJiYgKChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKSA+PSAwKSApCi0gICAgICB7CisgICAgICBpZiAoKHNlbGYtPm51bVBheWxvYWRzIDwgTUFYX0RSQ19USFJFQURTKSAmJgorICAgICAgICAgICgoSU5UKUZES2dldFZhbGlkQml0cyhicykgPj0gMCkpIHsKICAgICAgICAgc2VsZi0+ZHJjUGF5bG9hZFBvc2l0aW9uW3NlbGYtPm51bVBheWxvYWRzKytdID0gYnNTdGFydFBvczsKICAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7CisgICAgfSBicmVhazsKIAogICAgIGNhc2UgRFZCX0RSQ19BTkNfREFUQToKICAgICAgIGJpdENudCArPSA4OwogICAgICAgLyogY2hlY2sgc3luYyB3b3JkICovCi0gICAgICBpZiAoRkRLcmVhZEJpdHMoYnMsIDgpID09IERWQl9BTkNfREFUQV9TWU5DX0JZVEUpCi0gICAgICB7CisgICAgICBpZiAoRkRLcmVhZEJpdHMoYnMsIDgpID09IERWQl9BTkNfREFUQV9TWU5DX0JZVEUpIHsKICAgICAgICAgaW50IGRteExldmVsc1ByZXNlbnQsIGNvbXByZXNzaW9uUHJlc2VudDsKICAgICAgICAgaW50IGNvYXJzZUdyYWluVGNQcmVzZW50LCBmaW5lR3JhaW5UY1ByZXNlbnQ7CiAKLSAgICAgICAgLyogYnNfaW5mbyBmaWVsZCAqLyAKLSAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXBlZ19hdWRpb190eXBlLCBkb2xieV9zdXJyb3VuZF9tb2RlLCBwcmVzZW50YXRpb25fbW9kZSAqLwotICAgICAgICBiaXRDbnQrPTg7CisgICAgICAgIC8qIGJzX2luZm8gZmllbGQgKi8KKyAgICAgICAgRkRLcmVhZEJpdHMoCisgICAgICAgICAgICBicywKKyAgICAgICAgICAgIDgpOyAvKiBtcGVnX2F1ZGlvX3R5cGUsIGRvbGJ5X3N1cnJvdW5kX21vZGUsIHByZXNlbnRhdGlvbl9tb2RlICovCisgICAgICAgIGJpdENudCArPSA4OwogCiAgICAgICAgIC8qIEV2YWx1YXRlIGFuY2lsbGFyeV9kYXRhX3N0YXR1cyAqLwotICAgICAgICBGREtyZWFkQml0cyhicywgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCwgc2V0IHRvIDAgKi8KLSAgICAgICAgZG14TGV2ZWxzUHJlc2VudCA9IEZES3JlYWRCaXRzKGJzLCAxKTsgICAgICAgLyogZG93bm1peGluZ19sZXZlbHNfTVBFRzRfc3RhdHVzICovCi0gICAgICAgIEZES3JlYWRCaXRzKGJzLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkLCBzZXQgdG8gMCAqLwotICAgICAgICBjb21wcmVzc2lvblByZXNlbnQgICA9IEZES3JlYWRCaXRzKGJzLCAxKTsgICAvKiBhdWRpb19jb2RpbmdfbW9kZV9hbmRfY29tcHJlc3Npb24gc3RhdHVzICovCi0gICAgICAgIGNvYXJzZUdyYWluVGNQcmVzZW50ID0gRkRLcmVhZEJpdHMoYnMsIDEpOyAgIC8qIGNvYXJzZV9ncmFpbl90aW1lY29kZV9zdGF0dXMgKi8KLSAgICAgICAgZmluZUdyYWluVGNQcmVzZW50ICAgPSBGREtyZWFkQml0cyhicywgMSk7ICAgLyogZmluZV9ncmFpbl90aW1lY29kZV9zdGF0dXMgKi8KLSAgICAgICAgYml0Q250Kz04OworICAgICAgICBGREtyZWFkQml0cyhicywgMyk7IC8qIHJlc2VydmVkLCBzZXQgdG8gMCAqLworICAgICAgICBkbXhMZXZlbHNQcmVzZW50ID0KKyAgICAgICAgICAgIEZES3JlYWRCaXRzKGJzLCAxKTsgLyogZG93bm1peGluZ19sZXZlbHNfTVBFRzRfc3RhdHVzICovCisgICAgICAgIEZES3JlYWRCaXRzKGJzLCAxKTsgICAgIC8qIHJlc2VydmVkLCBzZXQgdG8gMCAqLworICAgICAgICBjb21wcmVzc2lvblByZXNlbnQgPQorICAgICAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDEpOyAvKiBhdWRpb19jb2RpbmdfbW9kZV9hbmRfY29tcHJlc3Npb24gc3RhdHVzICovCisgICAgICAgIGNvYXJzZUdyYWluVGNQcmVzZW50ID0KKyAgICAgICAgICAgIEZES3JlYWRCaXRzKGJzLCAxKTsgLyogY29hcnNlX2dyYWluX3RpbWVjb2RlX3N0YXR1cyAqLworICAgICAgICBmaW5lR3JhaW5UY1ByZXNlbnQgPQorICAgICAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDEpOyAvKiBmaW5lX2dyYWluX3RpbWVjb2RlX3N0YXR1cyAqLworICAgICAgICBiaXRDbnQgKz0gODsKIAogICAgICAgICAvKiBNUEVHNCBkb3dubWl4aW5nIGxldmVscyAqLwogICAgICAgICBpZiAoZG14TGV2ZWxzUHJlc2VudCkgewotICAgICAgICAgIEZES3JlYWRCaXRzKGJzLCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb3dubWl4aW5nX2xldmVsc19NUEVHNCAqLwotICAgICAgICAgIGJpdENudCs9ODsKKyAgICAgICAgICBGREtyZWFkQml0cyhicywgOCk7IC8qIGRvd25taXhpbmdfbGV2ZWxzX01QRUc0ICovCisgICAgICAgICAgYml0Q250ICs9IDg7CiAgICAgICAgIH0KICAgICAgICAgLyogYXVkaW8gY29kaW5nIG1vZGUgYW5kIGNvbXByZXNzaW9uIHN0YXR1cyAqLwogICAgICAgICBpZiAoY29tcHJlc3Npb25QcmVzZW50KSB7Ci0gICAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhdWRpb19jb2RpbmdfbW9kZSwgQ29tcHJlc3Npb25fdmFsdWUgKi8KLSAgICAgICAgICBiaXRDbnQrPTE2OworICAgICAgICAgIEZES3JlYWRCaXRzKGJzLCAxNik7IC8qIGF1ZGlvX2NvZGluZ19tb2RlLCBDb21wcmVzc2lvbl92YWx1ZSAqLworICAgICAgICAgIGJpdENudCArPSAxNjsKICAgICAgICAgfQogICAgICAgICAvKiBjb2Fyc2UgZ3JhaW4gdGltZWNvZGUgKi8KICAgICAgICAgaWYgKGNvYXJzZUdyYWluVGNQcmVzZW50KSB7Ci0gICAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDE2KTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvYXJzZV9ncmFpbl90aW1lY29kZSAqLwotICAgICAgICAgIGJpdENudCs9MTY7CisgICAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDE2KTsgLyogY29hcnNlX2dyYWluX3RpbWVjb2RlICovCisgICAgICAgICAgYml0Q250ICs9IDE2OwogICAgICAgICB9CiAgICAgICAgIC8qIGZpbmUgZ3JhaW4gdGltZWNvZGUgKi8KICAgICAgICAgaWYgKGZpbmVHcmFpblRjUHJlc2VudCkgewotICAgICAgICAgIEZES3JlYWRCaXRzKGJzLCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAvKiBmaW5lX2dyYWluX3RpbWVjb2RlICovCi0gICAgICAgICAgYml0Q250Kz0xNjsKKyAgICAgICAgICBGREtyZWFkQml0cyhicywgMTYpOyAvKiBmaW5lX2dyYWluX3RpbWVjb2RlICovCisgICAgICAgICAgYml0Q250ICs9IDE2OwogICAgICAgICB9Ci0gICAgICAgIGlmICggIXNlbGYtPmR2YkFuY0RhdGFBdmFpbGFibGUKLSAgICAgICAgICAmJiAoKElOVClGREtnZXRWYWxpZEJpdHMoYnMpID49IDApICkKLSAgICAgICAgewotICAgICAgICAgIHNlbGYtPmR2YkFuY0RhdGFQb3NpdGlvbiAgPSBic1N0YXJ0UG9zOworICAgICAgICBpZiAoIXNlbGYtPmR2YkFuY0RhdGFBdmFpbGFibGUgJiYgKChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKSA+PSAwKSkgeworICAgICAgICAgIHNlbGYtPmR2YkFuY0RhdGFQb3NpdGlvbiA9IGJzU3RhcnRQb3M7CiAgICAgICAgICAgc2VsZi0+ZHZiQW5jRGF0YUF2YWlsYWJsZSA9IDE7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTQ1NCwxMTIgKzUwMiwxMDEgQEAKICAgcmV0dXJuIChiaXRDbnQpOwogfQogCi0KIC8qIQogICBcYnJpZWYgUGFyc2UgRFJDIHBhcmFtZXRlcnMgZnJvbSBiaXRzdHJlYW0KIAogICBcYnMgSGFuZGxlIG9mIEZESyBiaXRzdHJlYW0gKGluKQogICBccERyY0JzIFBvaW50ZXIgdG8gRFJDIHBheWxvYWQgZGF0YSBjb250YWluZXIgKG91dCkKLSAgXHBheWxvYWRQb3NpdGlvbiBCaXRzdHJlYW0gcG9zaXRpb24gb2YgTVBFRyBEUkMgZGF0YSBqdW5rIChpbikKKyAgXHBheWxvYWRQb3NpdGlvbiBCaXRzdHJlYW0gcG9zaXRpb24gb2YgTVBFRyBEUkMgZGF0YSBjaHVuayAoaW4pCiAKLSAgXHJldHVybiBOdW1iZXIgb2YgYml0cyByZWFkICgwIGluIGNhc2Ugb2YgYSBwYXJzZSBlcnJvcikKKyAgXHJldHVybiBGbGFnIHRlbGxpbmcgd2hldGhlciBuZXcgRFJDIGRhdGEgaGFzIGJlZW4gZm91bmQgb3Igbm90LgogKi8KLXN0YXRpYyBpbnQgYWFjRGVjb2Rlcl9kcmNQYXJzZSAoCi0gICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGJzLAotICAgIENEcmNQYXlsb2FkICAgICAgICAgICpwRHJjQnMsCi0gICAgVUlOVCAgICAgICAgICAgICAgICAgIHBheWxvYWRQb3NpdGlvbiApCi17Ci0gIGludCBpLCBudW1CYW5kcywgYml0Q250ID0gNDsKK3N0YXRpYyBpbnQgYWFjRGVjb2Rlcl9kcmNQYXJzZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgQ0RyY1BheWxvYWQgKnBEcmNCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHBheWxvYWRQb3NpdGlvbikgeworICBpbnQgaSwgbnVtQmFuZHM7CiAKICAgLyogTW92ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBEUkMgcGF5bG9hZCBmaWVsZCAqLwotICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgRkRLZ2V0VmFsaWRCaXRzKGJzKS1wYXlsb2FkUG9zaXRpb24pOworICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgKElOVClGREtnZXRWYWxpZEJpdHMoYnMpIC0gKElOVClwYXlsb2FkUG9zaXRpb24pOwogCiAgIC8qIHBjZV90YWdfcHJlc2VudCAqLwotICBpZiAoRkRLcmVhZEJpdHMoYnMsMSkpCi0gIHsKLSAgICBwRHJjQnMtPnBjZUluc3RhbmNlVGFnID0gRkRLcmVhZEJpdHMoYnMsIDQpOyAgLyogcGNlX2luc3RhbmNlX3RhZyAqLworICBpZiAoRkRLcmVhZEJpdHMoYnMsIDEpKSB7CisgICAgcERyY0JzLT5wY2VJbnN0YW5jZVRhZyA9IEZES3JlYWRCaXRzKGJzLCA0KTsgLyogcGNlX2luc3RhbmNlX3RhZyAqLwogICAgIC8qIG9ubHkgb25lIHByb2dyYW0gc3VwcG9ydGVkICovCi0gICAgRkRLcmVhZEJpdHMoYnMsIDQpOyAgLyogZHJjX3RhZ19yZXNlcnZlZF9iaXRzICovCi0gICAgYml0Q250ICs9IDg7CisgICAgRkRLcmVhZEJpdHMoYnMsIDQpOyAvKiBkcmNfdGFnX3Jlc2VydmVkX2JpdHMgKi8KICAgfSBlbHNlIHsKLSAgICBwRHJjQnMtPnBjZUluc3RhbmNlVGFnID0gLTE7ICAvKiBub3QgcHJlc2VudCAqLworICAgIHBEcmNCcy0+cGNlSW5zdGFuY2VUYWcgPSAtMTsgLyogbm90IHByZXNlbnQgKi8KICAgfQogCi0gIGlmIChGREtyZWFkQml0cyhicywxKSkgeyAgICAgICAgLyogZXhjbHVkZWRfY2huc19wcmVzZW50ICovCisgIGlmIChGREtyZWFkQml0cyhicywgMSkpIHsgLyogZXhjbHVkZWRfY2huc19wcmVzZW50ICovCiAgICAgLyogZ2V0IGV4Y2x1ZGVkX2Nobl9tYXNrICovCi0gICAgYml0Q250ICs9IHBhcnNlRXhjbHVkZWRDaGFubmVscygmcERyY0JzLT5leGNsdWRlZENobnNNYXNrLCBicyk7CisgICAgcGFyc2VFeGNsdWRlZENoYW5uZWxzKCZwRHJjQnMtPmV4Y2x1ZGVkQ2huc01hc2ssIGJzKTsKICAgfSBlbHNlIHsKICAgICBwRHJjQnMtPmV4Y2x1ZGVkQ2huc01hc2sgPSAwOwogICB9CiAKICAgbnVtQmFuZHMgPSAxOwotICBpZiAoRkRLcmVhZEJpdHMoYnMsMSkpICAvKiBkcmNfYmFuZHNfcHJlc2VudCAqLworICBpZiAoRkRLcmVhZEJpdHMoYnMsIDEpKSAvKiBkcmNfYmFuZHNfcHJlc2VudCAqLwogICB7CiAgICAgLyogZ2V0IGJhbmRfaW5jciAqLwotICAgIG51bUJhbmRzICs9IEZES3JlYWRCaXRzKGJzLCA0KTsgIC8qIGRyY19iYW5kX2luY3IgKi8KLSAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmRyY0ludGVycG9sYXRpb25TY2hlbWUgPSBGREtyZWFkQml0cyhicywgNCk7ICAvKiBkcmNfaW50ZXJwb2xhdGlvbl9zY2hlbWUgKi8KLSAgICBiaXRDbnQgKz0gODsKKyAgICBudW1CYW5kcyArPSBGREtyZWFkQml0cyhicywgNCk7IC8qIGRyY19iYW5kX2luY3IgKi8KKyAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmRyY0ludGVycG9sYXRpb25TY2hlbWUgPQorICAgICAgICBGREtyZWFkQml0cyhicywgNCk7IC8qIGRyY19pbnRlcnBvbGF0aW9uX3NjaGVtZSAqLwogICAgIC8qIGJhbmRfdG9wICovCi0gICAgZm9yIChpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspCi0gICAgewotICAgICAgcERyY0JzLT5jaGFubmVsRGF0YS5iYW5kVG9wW2ldID0gRkRLcmVhZEJpdHMoYnMsIDgpOyAgLyogZHJjX2JhbmRfdG9wW2ldICovCi0gICAgICBiaXRDbnQgKz0gODsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgeworICAgICAgcERyY0JzLT5jaGFubmVsRGF0YS5iYW5kVG9wW2ldID0gRkRLcmVhZEJpdHMoYnMsIDgpOyAvKiBkcmNfYmFuZF90b3BbaV0gKi8KICAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgcERyY0JzLT5jaGFubmVsRGF0YS5iYW5kVG9wWzBdID0gKDEwMjQgPj4gMikgLSAxOyAgLyogLi4uIGNvbXByaXNpbmcgdGhlIHdob2xlIHNwZWN0cnVtLiAqLzsKKyAgfSBlbHNlIHsKKyAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmJhbmRUb3BbMF0gPSBEUkNfQkxPQ0tfTEVOX0RJVl9CQU5EX01VTFQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE7IC8qIC4uLiBjb21wcmlzaW5nIHRoZSB3aG9sZSBzcGVjdHJ1bS4gKi8KKyAgICA7CiAgIH0KIAogICBwRHJjQnMtPmNoYW5uZWxEYXRhLm51bUJhbmRzID0gbnVtQmFuZHM7CiAKLSAgaWYgKEZES3JlYWRCaXRzKGJzLDEpKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2dfcmVmX2xldmVsX3ByZXNlbnQgKi8KKyAgaWYgKEZES3JlYWRCaXRzKGJzLCAxKSkgLyogcHJvZ19yZWZfbGV2ZWxfcHJlc2VudCAqLwogICB7Ci0gICAgcERyY0JzLT5wcm9nUmVmTGV2ZWwgPSBGREtyZWFkQml0cyhicywgNyk7ICAvKiBwcm9nX3JlZl9sZXZlbCAqLwotICAgIEZES3JlYWRCaXRzKGJzLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvZ19yZWZfbGV2ZWxfcmVzZXJ2ZWRfYml0cyAqLwotICAgIGJpdENudCArPSA4OworICAgIHBEcmNCcy0+cHJvZ1JlZkxldmVsID0gRkRLcmVhZEJpdHMoYnMsIDcpOyAvKiBwcm9nX3JlZl9sZXZlbCAqLworICAgIEZES3JlYWRCaXRzKGJzLCAxKTsgLyogcHJvZ19yZWZfbGV2ZWxfcmVzZXJ2ZWRfYml0cyAqLwogICB9IGVsc2UgewogICAgIHBEcmNCcy0+cHJvZ1JlZkxldmVsID0gLTE7CiAgIH0KIAotICBmb3IgKGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykKLSAgewotICAgIHBEcmNCcy0+Y2hhbm5lbERhdGEuZHJjVmFsdWVbaV0gID0gRkRLcmVhZEJpdHMoYnMsIDEpIDw8IDc7ICAgLyogZHluX3JuZ19zZ25baV0gKi8KLSAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmRyY1ZhbHVlW2ldIHw9IEZES3JlYWRCaXRzKGJzLCA3KSAmIDB4N0Y7IC8qIGR5bl9ybmdfY3RsW2ldICovCi0gICAgYml0Q250ICs9IDg7CisgIGZvciAoaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgcERyY0JzLT5jaGFubmVsRGF0YS5kcmNWYWx1ZVtpXSA9IEZES3JlYWRCaXRzKGJzLCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCA3OyAvKiBkeW5fcm5nX3NnbltpXSAqLworICAgIHBEcmNCcy0+Y2hhbm5lbERhdGEuZHJjVmFsdWVbaV0gfD0KKyAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDcpICYgMHg3RjsgLyogZHluX3JuZ19jdGxbaV0gKi8KICAgfQogCiAgIC8qIFNldCBEUkMgcGF5bG9hZCB0eXBlICovCiAgIHBEcmNCcy0+Y2hhbm5lbERhdGEuZHJjRGF0YVR5cGUgPSBNUEVHX0RSQ19FWFRfREFUQTsKIAotICByZXR1cm4gKGJpdENudCk7CisgIHJldHVybiAoMSk7CiB9CiAKLQogLyohCi0gIFxicmllZiBQYXJzZSBoZWF2eSBjb21wcmVzc2lvbiB2YWx1ZSB0cmFuc3BvcnRlZCBpbiBEU0VzIG9mIERWQiBzdHJlYW1zIHdpdGggTVBFRy00IGNvbnRlbnQuCisgIFxicmllZiBQYXJzZSBoZWF2eSBjb21wcmVzc2lvbiB2YWx1ZSB0cmFuc3BvcnRlZCBpbiBEU0VzIG9mIERWQiBzdHJlYW1zIHdpdGgKKyAgTVBFRy00IGNvbnRlbnQuCiAKICAgXGJzIEhhbmRsZSBvZiBGREsgYml0c3RyZWFtIChpbikKICAgXHBEcmNCcyBQb2ludGVyIHRvIERSQyBwYXlsb2FkIGRhdGEgY29udGFpbmVyIChvdXQpCi0gIFxwYXlsb2FkUG9zaXRpb24gQml0c3RyZWFtIHBvc2l0aW9uIG9mIERWQiBhbmNpbGxhcnkgZGF0YSBqdW5rCisgIFxwYXlsb2FkUG9zaXRpb24gQml0c3RyZWFtIHBvc2l0aW9uIG9mIERWQiBhbmNpbGxhcnkgZGF0YSBjaHVuawogCi0gIFxyZXR1cm4gTnVtYmVyIG9mIGJpdHMgcmVhZCAoMCBpbiBjYXNlIG9mIGEgcGFyc2UgZXJyb3IpCisgIFxyZXR1cm4gRmxhZyB0ZWxsaW5nIHdoZXRoZXIgbmV3IERSQyBkYXRhIGhhcyBiZWVuIGZvdW5kIG9yIG5vdC4KICovCi0jZGVmaW5lIERWQl9DT01QUkVTU0lPTl9TQ0FMRSAgICggOCApICAgICAgIC8qIDQ4LDE2NCBkQiAqLworI2RlZmluZSBEVkJfQ09NUFJFU1NJT05fU0NBTEUgKDgpIC8qIDQ4LDE2NCBkQiAqLwogCi1zdGF0aWMgaW50IGFhY0RlY29kZXJfZHJjUmVhZENvbXByZXNzaW9uICgKLSAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMsCi0gICAgQ0RyY1BheWxvYWQgICAgICAgICAgKnBEcmNCcywKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgcGF5bG9hZFBvc2l0aW9uICkKLXsKLSAgaW50ICBiaXRDbnQgPSAwOwotICBpbnQgIGRteExldmVsc1ByZXNlbnQsIGV4dGVuc2lvblByZXNlbnQsIGNvbXByZXNzaW9uUHJlc2VudDsKLSAgaW50ICBjb2Fyc2VHcmFpblRjUHJlc2VudCwgZmluZUdyYWluVGNQcmVzZW50Oworc3RhdGljIGludCBhYWNEZWNvZGVyX2RyY1JlYWRDb21wcmVzc2lvbihIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RyY1BheWxvYWQgKnBEcmNCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBwYXlsb2FkUG9zaXRpb24pIHsKKyAgaW50IGZvdW5kRHJjRGF0YSA9IDA7CisgIGludCBkbXhMZXZlbHNQcmVzZW50LCBjb21wcmVzc2lvblByZXNlbnQ7CiAKICAgLyogTW92ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBEUkMgcGF5bG9hZCBmaWVsZCAqLwotICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgRkRLZ2V0VmFsaWRCaXRzKGJzKS1wYXlsb2FkUG9zaXRpb24pOworICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgKElOVClGREtnZXRWYWxpZEJpdHMoYnMpIC0gKElOVClwYXlsb2FkUG9zaXRpb24pOwogCiAgIC8qIFNhbml0eSBjaGVja3MgKi8KLSAgaWYgKCBGREtnZXRWYWxpZEJpdHMoYnMpIDwgMjQgKSB7CisgIGlmIChGREtnZXRWYWxpZEJpdHMoYnMpIDwgMjQpIHsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC01NjgsMTE1ICs2MDUsODcgQEAKICAgICByZXR1cm4gMDsKICAgfQogCi0gIC8qIEV2YWx1YXRlIGJzX2luZm8gZmllbGQgKi8gCi0gIGlmIChGREtyZWFkQml0cyhicywgMikgIT0gMykgeyAgICAgICAgICAgICAgIC8qIG1wZWdfYXVkaW9fdHlwZSAqLworICAvKiBFdmFsdWF0ZSBic19pbmZvIGZpZWxkICovCisgIGlmIChGREtyZWFkQml0cyhicywgMikgIT0gMykgeyAvKiBtcGVnX2F1ZGlvX3R5cGUgKi8KICAgICAvKiBObyBNUEVHLTQgYXVkaW8gZGF0YSAqLwogICAgIHJldHVybiAwOwogICB9Ci0gIEZES3JlYWRCaXRzKGJzLCAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbGJ5X3N1cnJvdW5kX21vZGUgKi8KLSAgcERyY0JzLT5wcmVzTW9kZSA9IEZES3JlYWRCaXRzKGJzLCAyKTsgICAgICAgLyogcHJlc2VudGF0aW9uX21vZGUgKi8KLSAgRkRLcmVhZEJpdHMoYnMsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RlcmVvX2Rvd25taXhfbW9kZSAqLwotICBpZiAoRkRLcmVhZEJpdHMoYnMsIDEpICE9IDApIHsgICAgICAgICAgICAgICAvKiByZXNlcnZlZCwgc2V0IHRvIDAgKi8KKyAgRkRLcmVhZEJpdHMoYnMsIDIpOyAgICAgICAgICAgICAgICAgICAgLyogZG9sYnlfc3Vycm91bmRfbW9kZSAqLworICBwRHJjQnMtPnByZXNNb2RlID0gRkRLcmVhZEJpdHMoYnMsIDIpOyAvKiBwcmVzZW50YXRpb25fbW9kZSAqLworICBGREtyZWFkQml0cyhicywgMSk7ICAgICAgICAgICAgICAgICAgICAvKiBzdGVyZW9fZG93bm1peF9tb2RlICovCisgIGlmIChGREtyZWFkQml0cyhicywgMSkgIT0gMCkgeyAgICAgICAgIC8qIHJlc2VydmVkLCBzZXQgdG8gMCAqLwogICAgIHJldHVybiAwOwogICB9CiAKICAgLyogRXZhbHVhdGUgYW5jaWxsYXJ5X2RhdGFfc3RhdHVzICovCi0gIGlmIChGREtyZWFkQml0cyhicywgMykgIT0gMCkgeyAgICAgICAgICAgICAgIC8qIHJlc2VydmVkLCBzZXQgdG8gMCAqLworICBpZiAoRkRLcmVhZEJpdHMoYnMsIDMpICE9IDApIHsgLyogcmVzZXJ2ZWQsIHNldCB0byAwICovCiAgICAgcmV0dXJuIDA7CiAgIH0KLSAgZG14TGV2ZWxzUHJlc2VudCA9IEZES3JlYWRCaXRzKGJzLCAxKTsgICAgICAgLyogZG93bm1peGluZ19sZXZlbHNfTVBFRzRfc3RhdHVzICovCi0gIGV4dGVuc2lvblByZXNlbnQgPSBGREtyZWFkQml0cyhicywgMSk7ICAgICAgIC8qIGFuY2lsbGFyeV9kYXRhX2V4dGVuc2lvbl9zdGF0dXM7ICovCi0gIGNvbXByZXNzaW9uUHJlc2VudCAgID0gRkRLcmVhZEJpdHMoYnMsIDEpOyAgIC8qIGF1ZGlvX2NvZGluZ19tb2RlX2FuZF9jb21wcmVzc2lvbiBzdGF0dXMgKi8KLSAgY29hcnNlR3JhaW5UY1ByZXNlbnQgPSBGREtyZWFkQml0cyhicywgMSk7ICAgLyogY29hcnNlX2dyYWluX3RpbWVjb2RlX3N0YXR1cyAqLwotICBmaW5lR3JhaW5UY1ByZXNlbnQgICA9IEZES3JlYWRCaXRzKGJzLCAxKTsgICAvKiBmaW5lX2dyYWluX3RpbWVjb2RlX3N0YXR1cyAqLwotICBiaXRDbnQgKz0gMjQ7CisgIGRteExldmVsc1ByZXNlbnQgPSBGREtyZWFkQml0cyhicywgMSk7IC8qIGRvd25taXhpbmdfbGV2ZWxzX01QRUc0X3N0YXR1cyAqLworICAvKmV4dGVuc2lvblByZXNlbnQgPSovRkRLcmVhZEJpdHMoYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsgLyogYW5jaWxsYXJ5X2RhdGFfZXh0ZW5zaW9uX3N0YXR1czsgKi8KKyAgY29tcHJlc3Npb25QcmVzZW50ID0KKyAgICAgIEZES3JlYWRCaXRzKGJzLCAxKTsgLyogYXVkaW9fY29kaW5nX21vZGVfYW5kX2NvbXByZXNzaW9uIHN0YXR1cyAqLworICAvKmNvYXJzZUdyYWluVGNQcmVzZW50ID0qL0ZES3JlYWRCaXRzKGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOyAvKiBjb2Fyc2VfZ3JhaW5fdGltZWNvZGVfc3RhdHVzICovCisgIC8qZmluZUdyYWluVGNQcmVzZW50ICAgPSovRkRLcmVhZEJpdHMoYnMsIDEpOyAvKiBmaW5lX2dyYWluX3RpbWVjb2RlX3N0YXR1cyAqLwogCiAgIGlmIChkbXhMZXZlbHNQcmVzZW50KSB7Ci0gICAgRkRLcmVhZEJpdHMoYnMsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvd25taXhpbmdfbGV2ZWxzX01QRUc0ICovCi0gICAgYml0Q250ICs9IDg7CisgICAgRkRLcmVhZEJpdHMoYnMsIDgpOyAvKiBkb3dubWl4aW5nX2xldmVsc19NUEVHNCAqLwogICB9CiAKICAgLyogYXVkaW9fY29kaW5nX21vZGVfYW5kX2NvbXByZXNzaW9uX3N0YXR1cyAqLwotICBpZiAoY29tcHJlc3Npb25QcmVzZW50KQotICB7CisgIGlmIChjb21wcmVzc2lvblByZXNlbnQpIHsKICAgICBVQ0hBUiBjb21wcmVzc2lvbk9uLCBjb21wcmVzc2lvblZhbHVlOwogCiAgICAgLyogYXVkaW9fY29kaW5nX21vZGUgKi8KLSAgICBpZiAoIEZES3JlYWRCaXRzKGJzLCA3KSAhPSAwICkgeyAgLyogVGhlIHJlc2VydmVkIGJpdHMgc2hhbGwgYmUgc2V0IHRvICIwIi4gKi8KKyAgICBpZiAoRkRLcmVhZEJpdHMoYnMsIDcpICE9IDApIHsgLyogVGhlIHJlc2VydmVkIGJpdHMgc2hhbGwgYmUgc2V0IHRvICIwIi4gKi8KICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBjb21wcmVzc2lvbk9uICAgID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCAxKTsgIC8qIGNvbXByZXNzaW9uX29uICovCi0gICAgY29tcHJlc3Npb25WYWx1ZSA9IChVQ0hBUilGREtyZWFkQml0cyhicywgOCk7ICAvKiBDb21wcmVzc2lvbl92YWx1ZSAqLwotICAgIGJpdENudCArPSAxNjsKKyAgICBjb21wcmVzc2lvbk9uID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCAxKTsgICAgLyogY29tcHJlc3Npb25fb24gKi8KKyAgICBjb21wcmVzc2lvblZhbHVlID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA4KTsgLyogQ29tcHJlc3Npb25fdmFsdWUgKi8KIAotICAgIGlmICggY29tcHJlc3Npb25PbiApIHsKLSAgICAgIC8qIEEgY29tcHJlc3Npb24gdmFsdWUgaXMgYXZhaWxhYmxlIHNvIHN0b3JlIHRoZSBkYXRhIGp1c3QgbGlrZSBNUEVHIERSQyBkYXRhICovCi0gICAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLm51bUJhbmRzICAgID0gIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9uZSBiYW5kIC4uLiAqLwotICAgICAgcERyY0JzLT5jaGFubmVsRGF0YS5kcmNWYWx1ZVswXSA9ICBjb21wcmVzc2lvblZhbHVlOyAgICAgICAgICAgICAvKiAuLi4gd2l0aCBvbmUgdmFsdWUgLi4uICovCi0gICAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmJhbmRUb3BbMF0gID0gKDEwMjQgPj4gMikgLSAxOyAgLyogLi4uIGNvbXByaXNpbmcgdGhlIHdob2xlIHNwZWN0cnVtLiAqLwotICAgICAgcERyY0JzLT5wY2VJbnN0YW5jZVRhZyAgICAgICAgICA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgcHJlc2VudCAqLwotICAgICAgcERyY0JzLT5wcm9nUmVmTGV2ZWwgICAgICAgICAgICA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgcHJlc2VudCAqLwotICAgICAgcERyY0JzLT5jaGFubmVsRGF0YS5kcmNEYXRhVHlwZSA9ICBEVkJfRFJDX0FOQ19EQVRBOyAgICAgICAgICAgICAvKiBTZXQgRFJDIHBheWxvYWQgdHlwZSB0byBEVkIuICovCi0gICAgfSBlbHNlIHsKLSAgICAgIC8qIE5vIGNvbXByZXNzaW9uIHZhbHVlIGF2YWlsYWJsZSAqLwotICAgICAgLyogQ0FVVElPTjogSXQgaXMgbm90IGNsZWFybHkgZGVmaW5lZCBieSBzdGFuZGFyZCBob3cgdG8gcmVhY3QgaW4gdGhpcyBzaXR1YXRpb24uICovCi0gICAgICAvKiBUdXJuIGRvd24gdGhlIGNvbXByZXNzaW9uIHZhbHVlIHRvIGFwcm94LiAwZEIgKi8KLSAgICAgIHBEcmNCcy0+Y2hhbm5lbERhdGEubnVtQmFuZHMgICAgPSAgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT25lIGJhbmQgLi4uICovCi0gICAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmRyY1ZhbHVlWzBdID0gIDB4ODA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC4uLiB3aXRoIGFwcm94LiAwZEIgLi4uICovCi0gICAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmJhbmRUb3BbMF0gID0gKDEwMjQgPj4gMikgLSAxOyAgLyogLi4uIGNvbXByaXNpbmcgdGhlIHdob2xlIHNwZWN0cnVtLiAqLwotICAgICAgcERyY0JzLT5jaGFubmVsRGF0YS5kcmNEYXRhVHlwZSA9ICBEVkJfRFJDX0FOQ19EQVRBOyAgICAgICAgICAgICAvKiBTZXQgRFJDIHBheWxvYWQgdHlwZSB0byBEVkIuICovCi0KLSAgICAgIC8qIElmIGNvbXByZXNzaW9uX29uIGZpZWxkIGlzIHNldCB0byAiMCIgdGhlIGNvbXByZXNzaW9uX3ZhbHVlIGZpZWxkIHNoYWxsIGJlICIwMDAwIDAwMDAiLiAqLwotICAgICAgaWYgKGNvbXByZXNzaW9uVmFsdWUgIT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KKyAgICBpZiAoY29tcHJlc3Npb25PbikgeworICAgICAgLyogQSBjb21wcmVzc2lvbiB2YWx1ZSBpcyBhdmFpbGFibGUgc28gc3RvcmUgdGhlIGRhdGEganVzdCBsaWtlIE1QRUcgRFJDCisgICAgICAgKiBkYXRhICovCisgICAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLm51bUJhbmRzID0gMTsgLyogT25lIGJhbmQgLi4uICovCisgICAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmRyY1ZhbHVlWzBdID0KKyAgICAgICAgICBjb21wcmVzc2lvblZhbHVlOyAvKiAuLi4gd2l0aCBvbmUgdmFsdWUgLi4uICovCisgICAgICBwRHJjQnMtPmNoYW5uZWxEYXRhLmJhbmRUb3BbMF0gPQorICAgICAgICAgIERSQ19CTE9DS19MRU5fRElWX0JBTkRfTVVMVCAtCisgICAgICAgICAgMTsgLyogLi4uIGNvbXByaXNpbmcgdGhlIHdob2xlIHNwZWN0cnVtLiAqLworICAgICAgOworICAgICAgcERyY0JzLT5wY2VJbnN0YW5jZVRhZyA9IC0xOyAvKiBOb3QgcHJlc2VudCAqLworICAgICAgcERyY0JzLT5wcm9nUmVmTGV2ZWwgPSAtMTsgICAvKiBOb3QgcHJlc2VudCAqLworICAgICAgcERyY0JzLT5jaGFubmVsRGF0YS5kcmNEYXRhVHlwZSA9CisgICAgICAgICAgRFZCX0RSQ19BTkNfREFUQTsgLyogU2V0IERSQyBwYXlsb2FkIHR5cGUgdG8gRFZCLiAqLworICAgICAgZm91bmREcmNEYXRhID0gMTsKICAgICB9CiAgIH0KIAotICAvKiBSZWFkIHRpbWVjb2RlcyBpZiBhdmFpbGFibGUganVzdCB0byBnZXQgdGhlIHJpZ2h0IGFtb3VudCBvZiBiaXRzLiAqLwotICBpZiAoY29hcnNlR3JhaW5UY1ByZXNlbnQpIHsKLSAgICBGREtyZWFkQml0cyhicywgMTYpOyAgICAgIC8qIGNvYXJzZV9ncmFpbl90aW1lY29kZSAqLwotICAgIGJpdENudCArPSAxNjsKLSAgfQotICBpZiAoZmluZUdyYWluVGNQcmVzZW50KSB7Ci0gICAgRkRLcmVhZEJpdHMoYnMsIDE2KTsgICAgICAvKiBmaW5lX2dyYWluX3RpbWVjb2RlICovCi0gICAgYml0Q250ICs9IDE2OwotICB9Ci0KLSAgLyogUmVhZCBleHRlbnNpb24ganVzdCB0byBnZXQgdGhlIHJpZ2h0IGFtb3VudCBvZiBiaXRzLiAqLwotICBpZiAoZXh0ZW5zaW9uUHJlc2VudCkgewotICAgIGludCAgZXh0Qml0cyA9IDg7Ci0KLSAgICBGREtyZWFkQml0cyhicywgMSk7ICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQsIHNldCB0byAwICovCi0gICAgaWYgKEZES3JlYWRCaXRzKGJzLCAxKSkgZXh0Qml0cyArPSA4OyAgIC8qIGV4dF9kb3dubWl4aW5nX2xldmVsc19zdGF0dXMgKi8KLSAgICBpZiAoRkRLcmVhZEJpdHMoYnMsIDEpKSBleHRCaXRzICs9IDE2OyAgLyogZXh0X2Rvd25taXhpbmdfZ2xvYmFsX2dhaW5zX3N0YXR1cyAqLwotICAgIGlmIChGREtyZWFkQml0cyhicywgMSkpIGV4dEJpdHMgKz0gODsgICAvKiBleHRfZG93bm1peGluZ19sZmVfbGV2ZWxfc3RhdHVzICovCi0KLSAgICBGREtwdXNoRm9yKGJzLCBleHRCaXRzIC0gNCk7ICAgICAgICAgICAgLyogc2tpcCB0aGUgZXh0ZW5zaW9uIHBheWxvYWQgcmVtYWluZGVyLiAqLwotICAgIGJpdENudCArPSBleHRCaXRzOwotICB9Ci0KLSAgcmV0dXJuIChiaXRDbnQpOworICByZXR1cm4gKGZvdW5kRHJjRGF0YSk7CiB9CiAKLQotLyogCi0gKiBQcmVwYXJlIERSQyBwcm9jZXNzaW5nCisvKgorICogRXh0cmFjdCBEUkMgcGF5bG9hZCBmcm9tIGJpdHN0cmVhbSBhbmQgbWFwIGl0IHRvIGNoYW5uZWxzLgorICogICBWYWxpZCByZXR1cm4gdmFsdWVzIGFyZToKKyAqICAgICAtMSA6IEFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJlZC4KKyAqICAgICAgMCA6IE5vIGVycm9yIGFuZCBubyB2YWxpZCBEUkMgZGF0YSBhdmFpbGFibGUuCisgKiAgICAgIDEgOiBObyBlcnJvciBhbmQgdmFsaWQgRFJDIGRhdGEgaGFzIGJlZW4gbWFwcGVkLgogICovCi1zdGF0aWMgaW50IGFhY0RlY29kZXJfZHJjRXh0cmFjdEFuZE1hcCAoCi0gICAgICAgIEhBTkRMRV9BQUNfRFJDICBzZWxmLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bXSwKLSAgICAgICAgVUNIQVIgIHBjZUluc3RhbmNlVGFnLAotICAgICAgICBVQ0hBUiAgY2hhbm5lbE1hcHBpbmdbXSwgLyogQ2hhbm5lbCBtYXBwaW5nIHRyYW5zbGF0aW5nIGRyY0NoYW5uZWwgaW5kZXggdG8gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggKi8KLSAgICAgICAgaW50ICAgIHZhbGlkQ2hhbm5lbHMgKQotewotICBDRHJjUGF5bG9hZCAgdGhyZWFkQnNbTUFYX0RSQ19USFJFQURTXTsKK3N0YXRpYyBpbnQgYWFjRGVjb2Rlcl9kcmNFeHRyYWN0QW5kTWFwKAorICAgIEhBTkRMRV9BQUNfRFJDIHNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW10sCisgICAgVUNIQVIgcGNlSW5zdGFuY2VUYWcsCisgICAgVUNIQVIgY2hhbm5lbE1hcHBpbmdbXSwgLyogQ2hhbm5lbCBtYXBwaW5nIHRyYW5zbGF0aW5nIGRyY0NoYW5uZWwgaW5kZXggdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCAqLworICAgIGludCB2YWxpZENoYW5uZWxzKSB7CisgIENEcmNQYXlsb2FkIHRocmVhZEJzW01BWF9EUkNfVEhSRUFEU107CiAgIENEcmNQYXlsb2FkICp2YWxpZFRocmVhZEJzW01BWF9EUkNfVEhSRUFEU107Ci0gIENEcmNQYXJhbXMgICpwUGFyYW1zOworICBDRHJjUGFyYW1zICpwUGFyYW1zOwogICBVSU5UIGJhY2t1cEJzUG9zaXRpb247Ci0gIGludCAgaSwgdGhyZWFkLCB2YWxpZFRocmVhZHMgPSAwOwotICBpbnQgIG51bUV4Y2x1ZGVkQ2huc1tNQVhfRFJDX1RIUkVBRFNdOworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IGksIHRocmVhZCwgdmFsaWRUaHJlYWRzID0gMDsKIAogICBGREtfQVNTRVJUKHNlbGYgIT0gTlVMTCk7CiAgIEZES19BU1NFUlQoaEJzICE9IE5VTEwpOwpAQCAtNjg3LDQ1ICs2OTYsNDAgQEAKICAgc2VsZi0+bnVtVGhyZWFkcyA9IDA7CiAgIGJhY2t1cEJzUG9zaXRpb24gPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKIAotICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+bnVtUGF5bG9hZHMgJiYgc2VsZi0+bnVtVGhyZWFkcyA8IE1BWF9EUkNfVEhSRUFEUzsgaSsrKSB7Ci0gICAgaW50IGJpdHNQYXJzZWQ7Ci0KLSAgICAvKiBJbml0IHBheWxvYWQgZGF0YSBjaHVuay4gVGhlIG1lbWNsZWFyIGlzIHZlcnkgaW1wb3J0YW50IGJlY2F1c2UgaXQgaW5pdGlhbGl6ZXMKLSAgICAgICB0aGUgbW9zdCB2YWx1ZXMuIFdpdGhvdXQgaXQgdGhlIG1vZHVsZSB3b3VsZG4ndCB3b3JrIHByb3Blcmx5IG9yIGNyYXNoLiAqLworICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+bnVtUGF5bG9hZHMgJiYgc2VsZi0+bnVtVGhyZWFkcyA8IE1BWF9EUkNfVEhSRUFEUzsKKyAgICAgICBpKyspIHsKKyAgICAvKiBJbml0IHBheWxvYWQgZGF0YSBjaHVuay4gVGhlIG1lbWNsZWFyIGlzIHZlcnkgaW1wb3J0YW50IGJlY2F1c2UgaXQKKyAgICAgICBpbml0aWFsaXplcyB0aGUgbW9zdCB2YWx1ZXMuIFdpdGhvdXQgaXQgdGhlIG1vZHVsZSB3b3VsZG4ndCB3b3JrIHByb3Blcmx5CisgICAgICAgb3IgY3Jhc2guICovCiAgICAgRkRLbWVtY2xlYXIoJnRocmVhZEJzW3NlbGYtPm51bVRocmVhZHNdLCBzaXplb2YoQ0RyY1BheWxvYWQpKTsKLSAgICB0aHJlYWRCc1tzZWxmLT5udW1UaHJlYWRzXS5jaGFubmVsRGF0YS5iYW5kVG9wWzBdICA9ICgxMDI0ID4+IDIpIC0gMTsKKyAgICB0aHJlYWRCc1tzZWxmLT5udW1UaHJlYWRzXS5jaGFubmVsRGF0YS5iYW5kVG9wWzBdID0KKyAgICAgICAgRFJDX0JMT0NLX0xFTl9ESVZfQkFORF9NVUxUIC0gMTsKIAogICAgIC8qIEV4dHJhY3QgcGF5bG9hZCAqLwotICAgIGJpdHNQYXJzZWQgPSBhYWNEZWNvZGVyX2RyY1BhcnNlKCBoQnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRocmVhZEJzW3NlbGYtPm51bVRocmVhZHNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5kcmNQYXlsb2FkUG9zaXRpb25baV0gKTsKLSAgICBpZiAoYml0c1BhcnNlZCA+IDApIHsKLSAgICAgIHNlbGYtPm51bVRocmVhZHMrKzsKLSAgICB9CisgICAgc2VsZi0+bnVtVGhyZWFkcyArPSBhYWNEZWNvZGVyX2RyY1BhcnNlKGhCcywgJnRocmVhZEJzW3NlbGYtPm51bVRocmVhZHNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5kcmNQYXlsb2FkUG9zaXRpb25baV0pOwogICB9CiAgIHNlbGYtPm51bVBheWxvYWRzID0gMDsKIAotICBpZiAoc2VsZi0+ZHZiQW5jRGF0YUF2YWlsYWJsZSAmJiBzZWxmLT5udW1UaHJlYWRzIDwgTUFYX0RSQ19USFJFQURTKQotICB7IC8qIEFwcGVuZCBhIERWQiBoZWF2eSBjb21wcmVzc2lvbiBwYXlsb2FkIHRocmVhZCBpZiBhdmFpbGFibGUuICovCi0gICAgaW50IGJpdHNQYXJzZWQ7CisgIGlmIChzZWxmLT5kdmJBbmNEYXRhQXZhaWxhYmxlICYmCisgICAgICBzZWxmLT5udW1UaHJlYWRzIDwgTUFYX0RSQ19USFJFQURTKSB7IC8qIEFwcGVuZCBhIERWQiBoZWF2eSBjb21wcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkIHRocmVhZCBpZiBhdmFpbGFibGUuICovCiAKLSAgICAvKiBJbml0IHBheWxvYWQgZGF0YSBjaHVuay4gVGhlIG1lbWNsZWFyIGlzIHZlcnkgaW1wb3J0YW50IGJlY2F1c2UgaXQgaW5pdGlhbGl6ZXMKLSAgICAgICB0aGUgbW9zdCB2YWx1ZXMuIFdpdGhvdXQgaXQgdGhlIG1vZHVsZSB3b3VsZG4ndCB3b3JrIHByb3Blcmx5IG9yIGNyYXNoLiAqLworICAgIC8qIEluaXQgcGF5bG9hZCBkYXRhIGNodW5rLiBUaGUgbWVtY2xlYXIgaXMgdmVyeSBpbXBvcnRhbnQgYmVjYXVzZSBpdAorICAgICAgIGluaXRpYWxpemVzIHRoZSBtb3N0IHZhbHVlcy4gV2l0aG91dCBpdCB0aGUgbW9kdWxlIHdvdWxkbid0IHdvcmsgcHJvcGVybHkKKyAgICAgICBvciBjcmFzaC4gKi8KICAgICBGREttZW1jbGVhcigmdGhyZWFkQnNbc2VsZi0+bnVtVGhyZWFkc10sIHNpemVvZihDRHJjUGF5bG9hZCkpOwotICAgIHRocmVhZEJzW3NlbGYtPm51bVRocmVhZHNdLmNoYW5uZWxEYXRhLmJhbmRUb3BbMF0gID0gKDEwMjQgPj4gMikgLSAxOworICAgIHRocmVhZEJzW3NlbGYtPm51bVRocmVhZHNdLmNoYW5uZWxEYXRhLmJhbmRUb3BbMF0gPQorICAgICAgICBEUkNfQkxPQ0tfTEVOX0RJVl9CQU5EX01VTFQgLSAxOwogCiAgICAgLyogRXh0cmFjdCBwYXlsb2FkICovCi0gICAgYml0c1BhcnNlZCA9IGFhY0RlY29kZXJfZHJjUmVhZENvbXByZXNzaW9uKCBoQnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJlYWRCc1tzZWxmLT5udW1UaHJlYWRzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmR2YkFuY0RhdGFQb3NpdGlvbiApOwotICAgIGlmIChiaXRzUGFyc2VkID4gMCkgewotICAgICAgc2VsZi0+bnVtVGhyZWFkcysrOwotICAgIH0KKyAgICBzZWxmLT5udW1UaHJlYWRzICs9IGFhY0RlY29kZXJfZHJjUmVhZENvbXByZXNzaW9uKAorICAgICAgICBoQnMsICZ0aHJlYWRCc1tzZWxmLT5udW1UaHJlYWRzXSwgc2VsZi0+ZHZiQW5jRGF0YVBvc2l0aW9uKTsKICAgfQogICBzZWxmLT5kdmJBbmNEYXRhQXZhaWxhYmxlID0gMDsKIAogICAvKiBSZXNldCB0aGUgYml0YnVmZmZlciAqLwotICBGREtwdXNoQmlEaXJlY3Rpb25hbChoQnMsIEZES2dldFZhbGlkQml0cyhoQnMpIC0gYmFja3VwQnNQb3NpdGlvbik7CisgIEZES3B1c2hCaURpcmVjdGlvbmFsKGhCcywgKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSAtIChJTlQpYmFja3VwQnNQb3NpdGlvbik7CiAKICAgLyogY2FsY3VsYXRlIG51bWJlciBvZiB2YWxpZCBiaXRzIGluIGV4Y2xfY2huX21hc2sgKi8KIApAQCAtNzQ0LDkgKzc0OCw5IEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGlmIChwVGhyZWFkQnMtPnBjZUluc3RhbmNlVGFnID49IDApIHsgIC8qIGlmIFBDRSB0YWcgcHJlc2VudCAqLworICAgIGlmIChwVGhyZWFkQnMtPnBjZUluc3RhbmNlVGFnID49IDApIHsgLyogaWYgUENFIHRhZyBwcmVzZW50ICovCiAgICAgICBpZiAocFRocmVhZEJzLT5wY2VJbnN0YW5jZVRhZyAhPSBwY2VJbnN0YW5jZVRhZykgewotICAgICAgICBjb250aW51ZTsgIC8qIGRvbid0IGFjY2VwdCAqLworICAgICAgICBjb250aW51ZTsgLyogZG9uJ3QgYWNjZXB0ICovCiAgICAgICB9CiAgICAgfQogCkBAIC03NjAsNDQgKzc2NCwxNyBAQAogICAgICAgfQogICAgIH0KICAgICBpZiAobnVtRXhjbENobnMgPCB2YWxpZENoYW5uZWxzKSB7Ci0gICAgICB2YWxpZFRocmVhZEJzW3ZhbGlkVGhyZWFkc10gICA9IHBUaHJlYWRCczsKLSAgICAgIG51bUV4Y2x1ZGVkQ2huc1t2YWxpZFRocmVhZHNdID0gbnVtRXhjbENobnM7CisgICAgICB2YWxpZFRocmVhZEJzW3ZhbGlkVGhyZWFkc10gPSBwVGhyZWFkQnM7CiAgICAgICB2YWxpZFRocmVhZHMrKzsKICAgICB9CiAgIH0KIAotICBpZiAodmFsaWRUaHJlYWRzID4gMSkgewotICAgIGludCBjaDsKLQotICAgIC8qIGNoZWNrIGNvbnNpc3RlbmN5IG9mIGV4Y2xfY2huX21hc2sgYW1vbmdzdCB2YWxpZCBEUkMgdGhyZWFkcyAqLwotICAgIGZvciAoY2ggPSAwOyBjaCA8IHZhbGlkQ2hhbm5lbHM7IGNoKyspIHsKLSAgICAgIGludCBwcmVzZW50ID0gMDsKLQotICAgICAgZm9yICh0aHJlYWQgPSAwOyB0aHJlYWQgPCB2YWxpZFRocmVhZHM7IHRocmVhZCsrKSB7Ci0gICAgICAgIENEcmNQYXlsb2FkICpwVGhyZWFkQnMgPSB2YWxpZFRocmVhZEJzW3RocmVhZF07Ci0KLQotICAgICAgICAvKiB0aHJlYWQgYXBwbGllcyB0byB0aGlzIGNoYW5uZWwgKi8KLSAgICAgICAgaWYgKCAocFRocmVhZEJzLT5jaGFubmVsRGF0YS5kcmNEYXRhVHlwZSA9PSBNUEVHX0RSQ19FWFRfREFUQSkKLSAgICAgICAgICAmJiAoIChudW1FeGNsdWRlZENobnNbdGhyZWFkXSA9PSAwKQotICAgICAgICAgICAgfHwgKCEocFRocmVhZEJzLT5leGNsdWRlZENobnNNYXNrICYgKDE8PGNoKSkpICkgKSB7Ci0gICAgICAgICAgcHJlc2VudCsrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLQotICAgICAgaWYgKHByZXNlbnQgPiAxKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQogICAvKiBtYXAgRFJDIGJpdHN0cmVhbSBpbmZvcm1hdGlvbiBvbnRvIERSQyBjaGFubmVsIGluZm9ybWF0aW9uICovCi0gIGZvciAodGhyZWFkID0gMDsgdGhyZWFkIDwgdmFsaWRUaHJlYWRzOyB0aHJlYWQrKykKLSAgeworICBmb3IgKHRocmVhZCA9IDA7IHRocmVhZCA8IHZhbGlkVGhyZWFkczsgdGhyZWFkKyspIHsKICAgICBDRHJjUGF5bG9hZCAqcFRocmVhZEJzID0gdmFsaWRUaHJlYWRCc1t0aHJlYWRdOwogICAgIElOVCBleGNsTWFzayA9IHBUaHJlYWRCcy0+ZXhjbHVkZWRDaG5zTWFzazsKLSAgICBBQUNERUNfRFJDX1BBWUxPQURfVFlQRSBkcmNQYXlsb2FkVHlwZSA9IChBQUNERUNfRFJDX1BBWUxPQURfVFlQRSlwVGhyZWFkQnMtPmNoYW5uZWxEYXRhLmRyY0RhdGFUeXBlOworICAgIEFBQ0RFQ19EUkNfUEFZTE9BRF9UWVBFIGRyY1BheWxvYWRUeXBlID0KKyAgICAgICAgKEFBQ0RFQ19EUkNfUEFZTE9BRF9UWVBFKXBUaHJlYWRCcy0+Y2hhbm5lbERhdGEuZHJjRGF0YVR5cGU7CiAgICAgaW50IGNoOwogCiAgICAgLyogbGFzdCBwcm9nUmVmTGV2ZWwgdHJhbnNtaXR0ZWQgaXMgdGhlIG9uZSB0aGF0IGlzIHVzZWQKQEAgLTgwNiw3ICs3ODMsNyBAQAogICAgIGlmIChwVGhyZWFkQnMtPnByb2dSZWZMZXZlbCA+PSAwKSB7CiAgICAgICBzZWxmLT5wcm9nUmVmTGV2ZWwgPSBwVGhyZWFkQnMtPnByb2dSZWZMZXZlbDsKICAgICAgIHNlbGYtPnByb2dSZWZMZXZlbFByZXNlbnQgPSAxOwotICAgICAgc2VsZi0+cHJsRXhwaXJ5Q291bnQgPSAwOyAgLyogR290IGEgbmV3IHZhbHVlIC0+IFJlc2V0IGNvdW50ZXIgKi8KKyAgICAgIHNlbGYtPnBybEV4cGlyeUNvdW50ID0gMDsgLyogR290IGEgbmV3IHZhbHVlIC0+IFJlc2V0IGNvdW50ZXIgKi8KICAgICB9CiAKICAgICBpZiAoZHJjUGF5bG9hZFR5cGUgPT0gRFZCX0RSQ19BTkNfREFUQSkgewpAQCAtODE2LDQzICs3OTMsNTEgQEAKIAogICAgIC8qIFNDRSwgQ1BFIGFuZCBMRkUgKi8KICAgICBmb3IgKGNoID0gMDsgY2ggPCB2YWxpZENoYW5uZWxzOyBjaCsrKSB7CisgICAgICBBQUNERUNfRFJDX1BBWUxPQURfVFlQRSBwcnZQYXlsb2FkVHlwZSA9IFVOS05PV05fUEFZTE9BRDsKICAgICAgIGludCBtYXBlZENoYW5uZWwgPSBjaGFubmVsTWFwcGluZ1tjaF07CiAKLSAgICAgIGlmICggKChleGNsTWFzayAmICgxPDxtYXBlZENoYW5uZWwpKSA9PSAwKQotICAgICAgICAmJiAoIChkcmNQYXlsb2FkVHlwZSA9PSBNUEVHX0RSQ19FWFRfREFUQSkKLSAgICAgICAgICB8fCAoKGRyY1BheWxvYWRUeXBlID09IERWQl9EUkNfQU5DX0RBVEEpICYmIHNlbGYtPnBhcmFtcy5hcHBseUhlYXZ5Q29tcHJlc3Npb24pCi0gICAgICAgICApICkgewotICAgICAgICAvKiBjb3B5IHRocmVhZCB0byBjaGFubmVsICovCisgICAgICBpZiAoKG1hcGVkQ2hhbm5lbCA+PSB2YWxpZENoYW5uZWxzKSB8fAorICAgICAgICAgICgoZXhjbE1hc2sgJiAoMSA8PCBtYXBlZENoYW5uZWwpKSAhPSAwKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGlmICgocFBhcmFtcy0+ZXhwaXJ5RnJhbWUgPD0gMCkgfHwKKyAgICAgICAgICAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPmRyY0RhdGEuZXhwaXJ5Q291bnQgPAorICAgICAgICAgICBwUGFyYW1zLT5leHBpcnlGcmFtZSkpIHsKKyAgICAgICAgcHJ2UGF5bG9hZFR5cGUgPQorICAgICAgICAgICAgKEFBQ0RFQ19EUkNfUEFZTE9BRF9UWVBFKXBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdCisgICAgICAgICAgICAgICAgLT5kcmNEYXRhLmRyY0RhdGFUeXBlOworICAgICAgfQorICAgICAgaWYgKCgoZHJjUGF5bG9hZFR5cGUgPT0gTVBFR19EUkNfRVhUX0RBVEEpICYmCisgICAgICAgICAgIChwcnZQYXlsb2FkVHlwZSAhPSBEVkJfRFJDX0FOQ19EQVRBKSkgfHwKKyAgICAgICAgICAoKGRyY1BheWxvYWRUeXBlID09IERWQl9EUkNfQU5DX0RBVEEpICYmCisgICAgICAgICAgIChwUGFyYW1zLT5hcHBseUhlYXZ5Q29tcHJlc3Npb24gPT0KKyAgICAgICAgICAgIE9OKSkpIHsgLyogY29weSB0aHJlYWQgdG8gY2hhbm5lbCAqLwogICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+ZHJjRGF0YSA9IHBUaHJlYWRCcy0+Y2hhbm5lbERhdGE7CisgICAgICAgIHJlc3VsdCA9IDE7CiAgICAgICB9CiAgICAgfQogICAgIC8qIENDRXMgbm90IHN1cHBvcnRlZCBieSBub3cgKi8KICAgfQogCiAgIC8qIEluY3JlbWVudCBhbmQgY2hlY2sgZXhwaXJ5IGNvdW50ZXIgZm9yIHRoZSBwcm9ncmFtIHJlZmVyZW5jZSBsZXZlbDogKi8KLSAgaWYgKCAocFBhcmFtcy0+ZXhwaXJ5RnJhbWUgPiAwKQotICAgICYmIChzZWxmLT5wcmxFeHBpcnlDb3VudCsrID4gcFBhcmFtcy0+ZXhwaXJ5RnJhbWUpICkKLSAgeyAvKiBUaGUgcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgaXMgdG9vIG9sZCwgc28gc2V0IGl0IGJhY2sgdG8gdGhlIHRhcmdldCBsZXZlbC4gKi8KKyAgaWYgKChwUGFyYW1zLT5leHBpcnlGcmFtZSA+IDApICYmCisgICAgICAoc2VsZi0+cHJsRXhwaXJ5Q291bnQrKyA+CisgICAgICAgcFBhcmFtcy0+ZXhwaXJ5RnJhbWUpKSB7IC8qIFRoZSBwcm9ncmFtIHJlZmVyZW5jZSBsZXZlbCBpcyB0b28gb2xkLCBzbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgaXQgYmFjayB0byB0aGUgdGFyZ2V0IGxldmVsLiAqLwogICAgIHNlbGYtPnByb2dSZWZMZXZlbFByZXNlbnQgPSAwOwogICAgIHNlbGYtPnByb2dSZWZMZXZlbCA9IHBQYXJhbXMtPnRhcmdldFJlZkxldmVsOwogICAgIHNlbGYtPnBybEV4cGlyeUNvdW50ID0gMDsKICAgfQogCi0gIHJldHVybiAwOworICByZXR1cm4gcmVzdWx0OwogfQogCi0KLXZvaWQgYWFjRGVjb2Rlcl9kcmNBcHBseSAoCi0gICAgICAgIEhBTkRMRV9BQUNfRFJDICAgICAgICAgIHNlbGYsCi0gICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgKnBTYnJEZWMsCi0gICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgIENEcmNDaGFubmVsRGF0YSAgICAgICAgKnBEcmNDaERhdGEsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgKmV4dEdhaW4sCi0gICAgICAgIGludCAgY2gsICAgLyogbmVlZGVkIG9ubHkgZm9yIFNCUiAqLwotICAgICAgICBpbnQgIGFhY0ZyYW1lU2l6ZSwKLSAgICAgICAgaW50ICBiU2JyUHJlc2VudCApCi17Ci0gIGludCBiYW5kLCB0b3AsIGJpbiwgbnVtQmFuZHM7Cit2b2lkIGFhY0RlY29kZXJfZHJjQXBwbHkoSEFORExFX0FBQ19EUkMgc2VsZiwgdm9pZCAqcFNickRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIENEcmNDaGFubmVsRGF0YSAqcERyY0NoRGF0YSwgRklYUF9EQkwgKmV4dEdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoLCAvKiBuZWVkZWQgb25seSBmb3IgU0JSICovCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFhY0ZyYW1lU2l6ZSwgaW50IGJTYnJQcmVzZW50KSB7CisgIGludCBiYW5kLCBiaW4sIG51bUJhbmRzOwogICBpbnQgYm90dG9tID0gMDsKICAgaW50IG1vZGlmeUJpbnMgPSAwOwogCkBAIC04NjAsMzMgKzg0NSwzNSBAQAogICBJTlQgbWF4X2V4cG9uZW50OwogCiAgIEZJWFBfREJMIG5vcm1fbWFudGlzc2EgPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsKLSAgSU5UICBub3JtX2V4cG9uZW50ID0gMTsKKyAgSU5UIG5vcm1fZXhwb25lbnQgPSAxOwogCiAgIEZJWFBfREJMIGZhY3RfbWFudGlzc2FbTUFYX0RSQ19CQU5EU107Ci0gIElOVCAgZmFjdF9leHBvbmVudFtNQVhfRFJDX0JBTkRTXTsKKyAgSU5UIGZhY3RfZXhwb25lbnRbTUFYX0RSQ19CQU5EU107CiAKLSAgQ0RyY1BhcmFtcyAgKnBQYXJhbXMgPSAmc2VsZi0+cGFyYW1zOworICBDRHJjUGFyYW1zICpwUGFyYW1zID0gJnNlbGYtPnBhcmFtczsKIAotICBGSVhQX0RCTCAgICAqcFNwZWN0cmFsQ29lZmZpY2llbnQgID0gIFNQRUNfTE9ORyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCk7Ci0gIENJY3NJbmZvICAgICpwSWNzSW5mbyAgICAgICAgICAgICAgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbzsKLSAgU0hPUlQgICAgICAgKnBTcGVjU2NhbGUgICAgICAgICAgICA9ICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGU7CisgIEZJWFBfREJMICpwU3BlY3RyYWxDb2VmZmljaWVudCA9CisgICAgICBTUEVDX0xPTkcocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQpOworICBDSWNzSW5mbyAqcEljc0luZm8gPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbzsKKyAgU0hPUlQgKnBTcGVjU2NhbGUgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGU7CiAKICAgaW50IHdpblNlcSA9IHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZTsKIAogICAvKiBJbmNyZW1lbnQgYW5kIGNoZWNrIGV4cGlyeSBjb3VudGVyICovCi0gIGlmICggKHBQYXJhbXMtPmV4cGlyeUZyYW1lID4gMCkKLSAgICAmJiAoKytwRHJjQ2hEYXRhLT5leHBpcnlDb3VudCA+IHBQYXJhbXMtPmV4cGlyeUZyYW1lKSApCi0gIHsgLyogVGhlIERSQyBkYXRhIGlzIHRvbyBvbGQsIHNvIGRlbGV0ZSBpdC4gKi8KLSAgICBhYWNEZWNvZGVyX2RyY0luaXRDaGFubmVsRGF0YSggcERyY0NoRGF0YSApOworICBpZiAoKHBQYXJhbXMtPmV4cGlyeUZyYW1lID4gMCkgJiYKKyAgICAgICgrK3BEcmNDaERhdGEtPmV4cGlyeUNvdW50ID4KKyAgICAgICBwUGFyYW1zLT5leHBpcnlGcmFtZSkpIHsgLyogVGhlIERSQyBkYXRhIGlzIHRvbyBvbGQsIHNvIGRlbGV0ZSBpdC4gKi8KKyAgICBhYWNEZWNvZGVyX2RyY0luaXRDaGFubmVsRGF0YShwRHJjQ2hEYXRhKTsKICAgfQogCi0gIGlmICghc2VsZi0+ZW5hYmxlKSB7Ci0gICAgc2JyRGVjb2Rlcl9kcmNEaXNhYmxlKCAoSEFORExFX1NCUkRFQ09ERVIpcFNickRlYywgY2ggKTsKKyAgaWYgKHNlbGYtPmVuYWJsZSAhPSBPTikgeworICAgIHNickRlY29kZXJfZHJjRGlzYWJsZSgoSEFORExFX1NCUkRFQ09ERVIpcFNickRlYywgY2gpOwogICAgIGlmIChleHRHYWluICE9IE5VTEwpIHsKICAgICAgIElOVCBnYWluU2NhbGUgPSAoSU5UKSpleHRHYWluOwotICAgICAgLyogVGhlIGdhaW4gc2NhbGluZyBtdXN0IGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gaW4gdGhlIGJ1ZmZlciBwb2ludGVkIG9uIGJ5IGV4dEdhaW4uICovCisgICAgICAvKiBUaGUgZ2FpbiBzY2FsaW5nIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBpbiB0aGUgYnVmZmVyIHBvaW50ZWQKKyAgICAgICAqIG9uIGJ5IGV4dEdhaW4uICovCiAgICAgICBpZiAoZ2FpblNjYWxlID49IDAgJiYgZ2FpblNjYWxlIDw9IERGUkFDVF9CSVRTKSB7Ci0gICAgICAgICpleHRHYWluID0gc2NhbGVWYWx1ZShub3JtX21hbnRpc3NhLCBub3JtX2V4cG9uZW50LWdhaW5TY2FsZSk7CisgICAgICAgICpleHRHYWluID0gc2NhbGVWYWx1ZShub3JtX21hbnRpc3NhLCBub3JtX2V4cG9uZW50IC0gZ2FpblNjYWxlKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIEZES19BU1NFUlQoMCk7CiAgICAgICB9CkBAIC04OTUsOSArODgyLDYgQEAKICAgfQogCiAgIG51bUJhbmRzID0gcERyY0NoRGF0YS0+bnVtQmFuZHM7Ci0gIHRvcCA9IEZES21heCgwLCBudW1CYW5kcy0xKTsKLQotICBwRHJjQ2hEYXRhLT5iYW5kVG9wWzBdID0gZml4TWluKHBEcmNDaERhdGEtPmJhbmRUb3BbMF0sIChhYWNGcmFtZVNpemUgPj4gMikgLSAxKTsKIAogICAvKiBJZiBwcm9ncmFtIHJlZmVyZW5jZSBub3JtYWxpemF0aW9uIGlzIGRvbmUgaW4gdGhlIGRpZ2l0YWwgZG9tYWluLAogICBtb2RpZnkgZmFjdG9yIHRvIHBlcmZvcm0gbm9ybWFsaXphdGlvbi4gIHByb2dfcmVmX2xldmVsIGNhbgpAQCAtOTA2LDQ1ICs4OTAsNDIgQEAKICAgcmVkdWNlZCBEQUMgU05SIChpZiBzaWduYWwgaXMgYXR0ZW51YXRlZCkgb3IgY2xpcHBpbmcgKGlmIHNpZ25hbCBpcwogICBib29zdGVkKSAqLwogCi0gIGlmIChwUGFyYW1zLT50YXJnZXRSZWZMZXZlbCA+PSAwKQotICB7CisgIGlmIChwUGFyYW1zLT50YXJnZXRSZWZMZXZlbCA+PSAwKSB7CiAgICAgLyogMC41XigodGFyZ2V0UmVmTGV2ZWwgLSBwcm9nUmVmTGV2ZWwpLzI0KSAqLwotICAgIG5vcm1fbWFudGlzc2EgPSBmTGRQb3coCi0gICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgtMS4wKSwgLyogbG9nMigwLjUpICovCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgKEZJWFBfREJMKSgoSU5UKShGTDJGWENPTlNUX0RCTCgxLjBmLzI0LjApPj4zKSAqIChJTlQpKHBQYXJhbXMtPnRhcmdldFJlZkxldmVsLXNlbGYtPnByb2dSZWZMZXZlbCkpLAotICAgICAgICAgICAgMywKLSAgICAgICAgICAgJm5vcm1fZXhwb25lbnQgKTsKKyAgICBub3JtX21hbnRpc3NhID0KKyAgICAgICAgZkxkUG93KEZMMkZYQ09OU1RfREJMKC0xLjApLCAvKiBsb2cyKDAuNSkgKi8KKyAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAoRklYUF9EQkwpKChJTlQpKEZMMkZYQ09OU1RfREJMKDEuMGYgLyAyNC4wKSA+PiAzKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQpKHBQYXJhbXMtPnRhcmdldFJlZkxldmVsIC0gc2VsZi0+cHJvZ1JlZkxldmVsKSksCisgICAgICAgICAgICAgICAzLCAmbm9ybV9leHBvbmVudCk7CiAgIH0KICAgLyogQWx3YXlzIGV4cG9ydCB0aGUgbm9ybWFsaXphdGlvbiBnYWluIChpZiBwb3NzaWJsZSkuICovCiAgIGlmIChleHRHYWluICE9IE5VTEwpIHsKICAgICBJTlQgZ2FpblNjYWxlID0gKElOVCkqZXh0R2FpbjsKLSAgICAvKiBUaGUgZ2FpbiBzY2FsaW5nIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBpbiB0aGUgYnVmZmVyIHBvaW50ZWQgb24gYnkgZXh0R2Fpbi4gKi8KKyAgICAvKiBUaGUgZ2FpbiBzY2FsaW5nIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBpbiB0aGUgYnVmZmVyIHBvaW50ZWQgb24KKyAgICAgKiBieSBleHRHYWluLiAqLwogICAgIGlmIChnYWluU2NhbGUgPj0gMCAmJiBnYWluU2NhbGUgPD0gREZSQUNUX0JJVFMpIHsKLSAgICAgICpleHRHYWluID0gc2NhbGVWYWx1ZShub3JtX21hbnRpc3NhLCBub3JtX2V4cG9uZW50LWdhaW5TY2FsZSk7CisgICAgICAqZXh0R2FpbiA9IHNjYWxlVmFsdWUobm9ybV9tYW50aXNzYSwgbm9ybV9leHBvbmVudCAtIGdhaW5TY2FsZSk7CiAgICAgfSBlbHNlIHsKICAgICAgIEZES19BU1NFUlQoMCk7CiAgICAgfQogICB9Ci0gIGlmIChzZWxmLT5wYXJhbXMuYXBwbHlEaWdpdGFsTm9ybSA9PSAwKSB7CisgIGlmIChzZWxmLT5wYXJhbXMuYXBwbHlEaWdpdGFsTm9ybSA9PSBPRkYpIHsKICAgICAvKiBSZXNldCBub3JtYWxpemF0aW9uIGdhaW4gc2luY2UgdGhpcyBtb2R1bGUgbXVzdCBub3QgYXBwbHkgaXQgKi8KICAgICBub3JtX21hbnRpc3NhID0gRkwyRlhDT05TVF9EQkwoMC41Zik7CiAgICAgbm9ybV9leHBvbmVudCA9IDE7CiAgIH0KIAotCiAgIC8qIGNhbGMgc2NhbGUgZmFjdG9ycyAqLwotICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbnVtQmFuZHM7IGJhbmQrKykKLSAgeworICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbnVtQmFuZHM7IGJhbmQrKykgewogICAgIFVDSEFSIGRyY1ZhbCA9IHBEcmNDaERhdGEtPmRyY1ZhbHVlW2JhbmRdOwotICAgIHRvcCA9IGZpeE1pbigoaW50KSggKHBEcmNDaERhdGEtPmJhbmRUb3BbYmFuZF0rMSk8PDIgKSwgYWFjRnJhbWVTaXplKTsKIAogICAgIGZhY3RfbWFudGlzc2FbYmFuZF0gPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsKICAgICBmYWN0X2V4cG9uZW50W2JhbmRdID0gMTsKIAotICAgIGlmICggIHBQYXJhbXMtPmFwcGx5SGVhdnlDb21wcmVzc2lvbgotICAgICAgJiYgKChBQUNERUNfRFJDX1BBWUxPQURfVFlQRSlwRHJjQ2hEYXRhLT5kcmNEYXRhVHlwZSA9PSBEVkJfRFJDX0FOQ19EQVRBKSApCi0gICAgeworICAgIGlmICgocFBhcmFtcy0+YXBwbHlIZWF2eUNvbXByZXNzaW9uID09IE9OKSAmJgorICAgICAgICAoKEFBQ0RFQ19EUkNfUEFZTE9BRF9UWVBFKXBEcmNDaERhdGEtPmRyY0RhdGFUeXBlID09CisgICAgICAgICBEVkJfRFJDX0FOQ19EQVRBKSkgewogICAgICAgSU5UIGNvbXByZXNzaW9uRmFjdG9yVmFsX2U7CiAgICAgICBpbnQgdmFsWCwgdmFsWTsKIApAQCAtOTU0LDQ4ICs5MzUsNDQgQEAKICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgdW5zY2FsZWQgaGVhdnkgY29tcHJlc3Npb24gZmFjdG9yLgogICAgICAgICAgY29tcHJlc3Npb25GYWN0b3IgPSA0OC4xNjQgLSA2LjAyMDYqdmFsWCAtIDAuNDAxNCp2YWxZIGRCCiAgICAgICAgICByYW5nZTogLTQ4LjE2NiBkQiB0byA0OC4xNjQgZEIgKi8KLSAgICAgIGlmICggZHJjVmFsICE9IDB4N0YgKSB7Ci0gICAgICAgIGZhY3RfbWFudGlzc2FbYmFuZF0gPQotICAgICAgICAgIGZQb3dJbnQoIEZMMkZYQ09OU1RfREJMKDAuOTU0ODM4NjcxODEpLCAvKiAtMC40MDE0ZEIgPSAwLjk1NDgzODY3MTgxICovCi0gICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICB2YWxZLAotICAgICAgICAgICAgICAgICAgJmNvbXByZXNzaW9uRmFjdG9yVmFsX2UgKTsKKyAgICAgIGlmIChkcmNWYWwgIT0gMHg3RikgeworICAgICAgICBmYWN0X21hbnRpc3NhW2JhbmRdID0gZlBvd0ludCgKKyAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuOTU0ODM4NjcxODEpLCAvKiAtMC40MDE0ZEIgPSAwLjk1NDgzODY3MTgxICovCisgICAgICAgICAgICAwLCB2YWxZLCAmY29tcHJlc3Npb25GYWN0b3JWYWxfZSk7CiAKICAgICAgICAgLyogLTAuMDAwOGRCICg0OC4xNjQgLSA2LjAyMDYqOCA9IC0wLjAwMDgpICovCi0gICAgICAgIGZhY3RfbWFudGlzc2FbYmFuZF0gPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjk5OTkwNzkwMDg0KSwgZmFjdF9tYW50aXNzYVtiYW5kXSk7CisgICAgICAgIGZhY3RfbWFudGlzc2FbYmFuZF0gPQorICAgICAgICAgICAgZk11bHQoRkwyRlhDT05TVF9EQkwoMC45OTk5MDc5MDA4NCksIGZhY3RfbWFudGlzc2FbYmFuZF0pOwogCi0gICAgICAgIGZhY3RfZXhwb25lbnRbYmFuZF0gPSBEVkJfQ09NUFJFU1NJT05fU0NBTEUgLSB2YWxYICsgY29tcHJlc3Npb25GYWN0b3JWYWxfZTsKKyAgICAgICAgZmFjdF9leHBvbmVudFtiYW5kXSA9CisgICAgICAgICAgICBEVkJfQ09NUFJFU1NJT05fU0NBTEUgLSB2YWxYICsgY29tcHJlc3Npb25GYWN0b3JWYWxfZTsKICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICBpZiAoKEFBQ0RFQ19EUkNfUEFZTE9BRF9UWVBFKXBEcmNDaERhdGEtPmRyY0RhdGFUeXBlID09IE1QRUdfRFJDX0VYVF9EQVRBKQotICAgIHsKLSAgICAvKiBhcHBseSB0aGUgc2NhbGVkIGR5bmFtaWMgcmFuZ2UgY29udHJvbCB3b3JkcyB0byBmYWN0b3IuCi0gICAgICogaWYgc2NhbGluZyBkcmNfY3V0IChvciBkcmNfYm9vc3QpLCBvciBjb250cm9sIHdvcmQgZHJjX21hbnRpc3NhIGlzIDAKLSAgICAgKiB0aGVuIHRoZXJlIGlzIG5vIGR5bmFtaWMgcmFuZ2UgY29tcHJlc3Npb24KLSAgICAgKgotICAgICAqIGlmIHBEcmNDaERhdGEtPmRyY1NnbltiYW5kXSBpcyAKLSAgICAgKiAgMSB0aGVuIGdhaW4gaXMgPCAxIDogIGZhY3RvciA9IDJeKC1zZWxmLT5jdXQgICAqIHBEcmNDaERhdGEtPmRyY01hZ1tiYW5kXSAvIDI0KQotICAgICAqICAwIHRoZW4gZ2FpbiBpcyA+IDEgOiAgZmFjdG9yID0gMl4oIHNlbGYtPmJvb3N0ICogcERyY0NoRGF0YS0+ZHJjTWFnW2JhbmRdIC8gMjQpCi0gICAgICovCisgICAgfSBlbHNlIGlmICgoQUFDREVDX0RSQ19QQVlMT0FEX1RZUEUpcERyY0NoRGF0YS0+ZHJjRGF0YVR5cGUgPT0KKyAgICAgICAgICAgICAgIE1QRUdfRFJDX0VYVF9EQVRBKSB7CisgICAgICAvKiBhcHBseSB0aGUgc2NhbGVkIGR5bmFtaWMgcmFuZ2UgY29udHJvbCB3b3JkcyB0byBmYWN0b3IuCisgICAgICAgKiBpZiBzY2FsaW5nIGRyY19jdXQgKG9yIGRyY19ib29zdCksIG9yIGNvbnRyb2wgd29yZCBkcmNfbWFudGlzc2EgaXMgMAorICAgICAgICogdGhlbiB0aGVyZSBpcyBubyBkeW5hbWljIHJhbmdlIGNvbXByZXNzaW9uCisgICAgICAgKgorICAgICAgICogaWYgcERyY0NoRGF0YS0+ZHJjU2duW2JhbmRdIGlzCisgICAgICAgKiAgMSB0aGVuIGdhaW4gaXMgPCAxIDogIGZhY3RvciA9IDJeKC1zZWxmLT5jdXQgICAqCisgICAgICAgKiBwRHJjQ2hEYXRhLT5kcmNNYWdbYmFuZF0gLyAyNCkgMCB0aGVuIGdhaW4gaXMgPiAxIDogIGZhY3RvciA9IDJeKAorICAgICAgICogc2VsZi0+Ym9vc3QgKiBwRHJjQ2hEYXRhLT5kcmNNYWdbYmFuZF0gLyAyNCkKKyAgICAgICAqLwogCi0gICAgaWYgKChkcmNWYWwmMHg3RikgPiAwKSB7Ci0gICAgICBGSVhQX0RCTCB0UGFyYW1WYWwgPSAoZHJjVmFsICYgMHg4MCkgPyAtcFBhcmFtcy0+Y3V0IDogcFBhcmFtcy0+Ym9vc3Q7CisgICAgICBpZiAoKGRyY1ZhbCAmIDB4N0YpID4gMCkgeworICAgICAgICBGSVhQX0RCTCB0UGFyYW1WYWwgPSAoZHJjVmFsICYgMHg4MCkgPyAtcFBhcmFtcy0+Y3V0IDogcFBhcmFtcy0+Ym9vc3Q7CiAKLSAgICAgIGZhY3RfbWFudGlzc2FbYmFuZF0gPQotICAgICAgICBmMlBvdyggKEZJWFBfREJMKSgoSU5UKWZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMGYvMTkyLjBmKSwgdFBhcmFtVmFsKSAqIChkcmNWYWwmMHg3RikpLAotICAgICAgICAgICAgICAgICAzK0RSQ19QQVJBTV9TQ0FMRSwKLSAgICAgICAgICAgICAgICAmZmFjdF9leHBvbmVudFtiYW5kXSApOwotICAgIH0KKyAgICAgICAgZmFjdF9tYW50aXNzYVtiYW5kXSA9IGYyUG93KAorICAgICAgICAgICAgKEZJWFBfREJMKSgoSU5UKWZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMGYgLyAxOTIuMGYpLCB0UGFyYW1WYWwpICoKKyAgICAgICAgICAgICAgICAgICAgICAgKGRyY1ZhbCAmIDB4N0YpKSwKKyAgICAgICAgICAgIDMgKyBEUkNfUEFSQU1fU0NBTEUsICZmYWN0X2V4cG9uZW50W2JhbmRdKTsKKyAgICAgIH0KICAgICB9CiAKLSAgICBmYWN0X21hbnRpc3NhW2JhbmRdICA9IGZNdWx0KGZhY3RfbWFudGlzc2FbYmFuZF0sIG5vcm1fbWFudGlzc2EpOworICAgIGZhY3RfbWFudGlzc2FbYmFuZF0gPSBmTXVsdChmYWN0X21hbnRpc3NhW2JhbmRdLCBub3JtX21hbnRpc3NhKTsKICAgICBmYWN0X2V4cG9uZW50W2JhbmRdICs9IG5vcm1fZXhwb25lbnQ7CiAKLQotICAgIGJvdHRvbSA9IHRvcDsKLQotICB9ICAvKiBlbmQgbG9vcCBvdmVyIGJhbmRzICovCi0KKyAgfSAvKiBlbmQgbG9vcCBvdmVyIGJhbmRzICovCiAKICAgLyogbm9ybWFsaXphdGlvbnMgKi8KICAgewpAQCAtMTAxMiw3ICs5ODksOCBAQAogICAgIHJlcyA9IENudExlYWRpbmdaZXJvcyhtYXhfbWFudGlzc2EpIC0gMTsKIAogICAgIC8qIGFib3ZlIHRvcG1vc3QgRFJDIGJhbmQgZ2FpbiBmYWN0b3IgaXMgMSAqLwotICAgIGlmICgoKHBEcmNDaERhdGEtPmJhbmRUb3BbbnVtQmFuZHMtMV0rMSk8PDIpIDwgYWFjRnJhbWVTaXplKSByZXMgPSAwOworICAgIGlmICgoKHBEcmNDaERhdGEtPmJhbmRUb3BbZk1heCgwLCBudW1CYW5kcyAtIDEpXSArIDEpIDw8IDIpIDwgYWFjRnJhbWVTaXplKQorICAgICAgcmVzID0gMDsKIAogICAgIGlmIChyZXMgPiAwKSB7CiAgICAgICByZXMgPSBmaXhNaW4ocmVzLCBtYXhfZXhwb25lbnQpOwpAQCAtMTAyMCw3ICs5OTgsNyBAQAogCiAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbnVtQmFuZHM7IGJhbmQrKykgewogICAgICAgICBmYWN0X21hbnRpc3NhW2JhbmRdIDw8PSByZXM7Ci0gICAgICAgIGZhY3RfZXhwb25lbnRbYmFuZF0gIC09IHJlczsKKyAgICAgICAgZmFjdF9leHBvbmVudFtiYW5kXSAtPSByZXM7CiAgICAgICB9CiAgICAgfQogCkBAIC0xMDM5LDI1ICsxMDE3LDI1IEBACiAgIH0KIAogICAvKiAgYXBwbHkgZmFjdG9yIHRvIHNwZWN0cmFsIGxpbmVzCi0gICAqICBzaG9ydCBibG9ja3MgbXVzdCB0YWtlIGNhcmUgdGhhdCBiYW5kcyBmYWxsIG9uIAorICAgKiAgc2hvcnQgYmxvY2tzIG11c3QgdGFrZSBjYXJlIHRoYXQgYmFuZHMgZmFsbCBvbgogICAgKiAgYmxvY2sgYm91bmRhcmllcyEKICAgICovCi0gIGlmICghYlNiclByZXNlbnQpCi0gIHsKKyAgaWYgKCFiU2JyUHJlc2VudCkgewogICAgIGJvdHRvbSA9IDA7CiAKICAgICBpZiAoIW1vZGlmeUJpbnMpIHsKLSAgICAgIC8qIFdlIGRvbid0IGhhdmUgdG8gbW9kaWZ5IHRoZSBzcGVjdHJhbCBiaW5zIGJlY2F1c2UgdGhlIGZyYWN0aW9uYWwgcGFydCBvZiBhbGwgZmFjdG9ycyBpcyAwLjUuCi0gICAgICAgICBJbiBvcmRlciB0byBrZWVwIGFjY3VyYW5jeSB3ZSBkb24ndCBhcHBseSB0aGUgZmFjdG9yIGJ1dCBkZWNyZWFzZSB0aGUgZXhwb25lbnQgaW5zdGVhZC4gKi8KKyAgICAgIC8qIFdlIGRvbid0IGhhdmUgdG8gbW9kaWZ5IHRoZSBzcGVjdHJhbCBiaW5zIGJlY2F1c2UgdGhlIGZyYWN0aW9uYWwgcGFydAorICAgICAgICAgb2YgYWxsIGZhY3RvcnMgaXMgMC41LiBJbiBvcmRlciB0byBrZWVwIGFjY3VyYW5jeSB3ZSBkb24ndCBhcHBseSB0aGUKKyAgICAgICAgIGZhY3RvciBidXQgZGVjcmVhc2UgdGhlIGV4cG9uZW50IGluc3RlYWQuICovCiAgICAgICBtYXhfZXhwb25lbnQgLT0gMTsKLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbnVtQmFuZHM7IGJhbmQrKykKLSAgICAgIHsKLSAgICAgICAgdG9wID0gZml4TWluKChpbnQpKCAocERyY0NoRGF0YS0+YmFuZFRvcFtiYW5kXSsxKTw8MiApLCBhYWNGcmFtZVNpemUpOyAgIC8qIC4uLiAqIERSQ19CQU5EX01VTFQ7ICovCisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBudW1CYW5kczsgYmFuZCsrKSB7CisgICAgICAgIGludCB0b3AgPSBmaXhNaW4oKGludCkoKHBEcmNDaERhdGEtPmJhbmRUb3BbYmFuZF0gKyAxKSA8PCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhYWNGcmFtZVNpemUpOyAvKiAuLi4gKiBEUkNfQkFORF9NVUxUOyAqLwogCiAgICAgICAgIGZvciAoYmluID0gYm90dG9tOyBiaW4gPCB0b3A7IGJpbisrKSB7Ci0gICAgICAgICAgcFNwZWN0cmFsQ29lZmZpY2llbnRbYmluXSA9IGZNdWx0KHBTcGVjdHJhbENvZWZmaWNpZW50W2Jpbl0sIGZhY3RfbWFudGlzc2FbYmFuZF0pOworICAgICAgICAgIHBTcGVjdHJhbENvZWZmaWNpZW50W2Jpbl0gPQorICAgICAgICAgICAgICBmTXVsdChwU3BlY3RyYWxDb2VmZmljaWVudFtiaW5dLCBmYWN0X21hbnRpc3NhW2JhbmRdKTsKICAgICAgICAgfQogCiAgICAgICAgIGJvdHRvbSA9IHRvcDsKQEAgLTEwNjYsNyArMTA0NCw3IEBACiAKICAgICAvKiBhYm92ZSB0b3Btb3N0IERSQyBiYW5kIGdhaW4gZmFjdG9yIGlzIDEgKi8KICAgICBpZiAobWF4X2V4cG9uZW50ID4gMCkgewotICAgICAgZm9yIChiaW4gPSBib3R0b207IGJpbiA8IGFhY0ZyYW1lU2l6ZTsgYmluKz0xKSB7CisgICAgICBmb3IgKGJpbiA9IGJvdHRvbTsgYmluIDwgYWFjRnJhbWVTaXplOyBiaW4gKz0gMSkgewogICAgICAgICBwU3BlY3RyYWxDb2VmZmljaWVudFtiaW5dID4+PSBtYXhfZXhwb25lbnQ7CiAgICAgICB9CiAgICAgfQpAQCAtMTA3NCwxMDUgKzEwNTIsMjk0IEBACiAgICAgLyogYWRqdXN0IHNjYWxpbmcgKi8KICAgICBwU3BlY1NjYWxlWzBdICs9IG1heF9leHBvbmVudDsKIAotICAgIGlmICh3aW5TZXEgPT0gRWlnaHRTaG9ydFNlcXVlbmNlKSB7CisgICAgaWYgKHdpblNlcSA9PSBCTE9DS19TSE9SVCkgewogICAgICAgaW50IHdpbjsKICAgICAgIGZvciAod2luID0gMTsgd2luIDwgODsgd2luKyspIHsKICAgICAgICAgcFNwZWNTY2FsZVt3aW5dICs9IG1heF9leHBvbmVudDsKICAgICAgIH0KICAgICB9Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgSEFORExFX1NCUkRFQ09ERVIgaFNickRlY29kZXIgPSAoSEFORExFX1NCUkRFQ09ERVIpcFNickRlYzsKLSAgICBVSU5UIG51bUJhbmRzID0gcERyY0NoRGF0YS0+bnVtQmFuZHM7CisgICAgbnVtQmFuZHMgPSBwRHJjQ2hEYXRhLT5udW1CYW5kczsKIAogICAgIC8qIGZlZWQgZmFjdG9ycyBpbnRvIFNCUiBkZWNvZGVyIGZvciBhcHBsaWNhdGlvbiBpbiBRTUYgZG9tYWluLiAqLwotICAgIHNickRlY29kZXJfZHJjRmVlZENoYW5uZWwgKAotICAgICAgICAgICAgaFNickRlY29kZXIsCi0gICAgICAgICAgICBjaCwKLSAgICAgICAgICAgIG51bUJhbmRzLAotICAgICAgICAgICAgZmFjdF9tYW50aXNzYSwKLSAgICAgICAgICAgIG1heF9leHBvbmVudCwKLSAgICAgICAgICAgIHBEcmNDaERhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWUsCi0gICAgICAgICAgICB3aW5TZXEsCi0gICAgICAgICAgICBwRHJjQ2hEYXRhLT5iYW5kVG9wCi0gICAgICAgICAgKTsKKyAgICBzYnJEZWNvZGVyX2RyY0ZlZWRDaGFubmVsKGhTYnJEZWNvZGVyLCBjaCwgbnVtQmFuZHMsIGZhY3RfbWFudGlzc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZXhwb25lbnQsIHBEcmNDaERhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5TZXEsIHBEcmNDaERhdGEtPmJhbmRUb3ApOwogICB9CiAKICAgcmV0dXJuOwogfQogCi0KLS8qIAotICogUHJlcGFyZSBEUkMgcHJvY2Vzc2luZworLyoKKyAqIERSQyBwYXJhbWV0ZXIgYW5kIHByZXNlbnRhdGlvbiBtb2RlIGhhbmRsaW5nCiAgKi8KLWludCBhYWNEZWNvZGVyX2RyY1Byb2xvZyAoCi0gICAgICAgIEhBTkRMRV9BQUNfRFJDICBzZWxmLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bXSwKLSAgICAgICAgVUNIQVIgIHBjZUluc3RhbmNlVGFnLAotICAgICAgICBVQ0hBUiAgY2hhbm5lbE1hcHBpbmdbXSwgLyogQ2hhbm5lbCBtYXBwaW5nIHRyYW5zbGF0aW5nIGRyY0NoYW5uZWwgaW5kZXggdG8gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggKi8KLSAgICAgICAgaW50ICAgIHZhbGlkQ2hhbm5lbHMgKQotewotICBpbnQgZXJyID0gMDsKK3N0YXRpYyB2b2lkIGFhY0RlY29kZXJfZHJjUGFyYW1ldGVySGFuZGxpbmcoSEFORExFX0FBQ19EUkMgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGFhY051bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiBwcmV2RHJjUHJvZ1JlZkxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiBwcmV2RHJjUHJlc01vZGUpIHsKKyAgaW50IGlzRG93bm1peCwgaXNNb25vRG93bm1peCwgaXNTdGVyZW9Eb3dubWl4OworICBpbnQgZERteCwgZEhyOworICBBQUNERUNfRFJDX1BBUkFNRVRFUl9IQU5ETElORyBkcmNQYXJhbWV0ZXJIYW5kbGluZzsKKyAgQ0RyY1BhcmFtcyAqcDsKIAotICBpZiAoc2VsZiA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIC0xOworICBGREtfQVNTRVJUKHNlbGYgIT0gTlVMTCk7CisKKyAgcCA9ICZzZWxmLT5wYXJhbXM7CisKKyAgaWYgKHNlbGYtPnByb2dSZWZMZXZlbCAhPSBwcmV2RHJjUHJvZ1JlZkxldmVsKSBzZWxmLT51cGRhdGUgPSAxOworCisgIGlmIChzZWxmLT5wcmVzTW9kZSAhPSBwcmV2RHJjUHJlc01vZGUpIHNlbGYtPnVwZGF0ZSA9IDE7CisKKyAgaWYgKHNlbGYtPnByZXZBYWNOdW1DaGFubmVscyAhPSBhYWNOdW1DaGFubmVscykgc2VsZi0+dXBkYXRlID0gMTsKKworICAvKiByZXR1cm4gaWYgbm8gcmVsZXZhbnQgcGFyYW1ldGVyIGhhcyBjaGFuZ2VkICovCisgIGlmICghc2VsZi0+dXBkYXRlKSB7CisgICAgcmV0dXJuOwogICB9CiAKLSAgaWYgKCFzZWxmLT5wYXJhbXMuYnNEZWxheUVuYWJsZSkKLSAgewotICAgIGVyciA9IGFhY0RlY29kZXJfZHJjRXh0cmFjdEFuZE1hcCAoCi0gICAgICAgICAgICBzZWxmLAotICAgICAgICAgICAgaEJzLAotICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKLSAgICAgICAgICAgIHBjZUluc3RhbmNlVGFnLAotICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmcsCi0gICAgICAgICAgICB2YWxpZENoYW5uZWxzICk7CisgIC8qIGRlcml2ZSBkb3dubWl4IHByb3BlcnR5LiBhYWNOdW1DaGFubmVsczogbnVtYmVyIG9mIGNoYW5uZWxzIGluIGFhYyBzdHJlYW0sCisgICAqIG51bU91dENoYW5uZWxzOiBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzICovCisgIGlzRG93bm1peCA9IChhYWNOdW1DaGFubmVscyA+IHNlbGYtPm51bU91dENoYW5uZWxzKTsKKyAgaXNEb3dubWl4ID0gKGlzRG93bm1peCAmJiAoc2VsZi0+bnVtT3V0Q2hhbm5lbHMgPiAwKSk7CisgIGlzTW9ub0Rvd25taXggPSAoaXNEb3dubWl4ICYmIChzZWxmLT5udW1PdXRDaGFubmVscyA9PSAxKSk7CisgIGlzU3RlcmVvRG93bm1peCA9IChpc0Rvd25taXggJiYgKHNlbGYtPm51bU91dENoYW5uZWxzID09IDIpKTsKKworICBpZiAoKHNlbGYtPnByZXNNb2RlID09IDEpIHx8IChzZWxmLT5wcmVzTW9kZSA9PSAyKSkgeworICAgIGRyY1BhcmFtZXRlckhhbmRsaW5nID0gKEFBQ0RFQ19EUkNfUEFSQU1FVEVSX0hBTkRMSU5HKXNlbGYtPnByZXNNb2RlOworICB9IGVsc2UgeyAvKiBubyBwcmVzZW50YXRpb24gbW9kZSAtPiB1c2UgcGFyYW1ldGVyIGhhbmRsaW5nIHNwZWNpZmllZCBieQorICAgICAgICAgICAgICBBQUNfRFJDX0RFRkFVTFRfUFJFU0VOVEFUSU9OX01PREUgKi8KKyAgICBkcmNQYXJhbWV0ZXJIYW5kbGluZyA9IHAtPmRlZmF1bHRQcmVzZW50YXRpb25Nb2RlOwogICB9CiAKLSAgcmV0dXJuIGVycjsKKyAgLyogYnkgZGVmYXVsdCwgZG8gYXMgZGVzaXJlZCAqLworICBwLT5jdXQgPSBwLT51c3JDdXQ7CisgIHAtPmJvb3N0ID0gcC0+dXNyQm9vc3Q7CisgIHAtPmFwcGx5SGVhdnlDb21wcmVzc2lvbiA9IHAtPnVzckFwcGx5SGVhdnlDb21wcmVzc2lvbjsKKworICBzd2l0Y2ggKGRyY1BhcmFtZXRlckhhbmRsaW5nKSB7CisgICAgY2FzZSBESVNBQkxFRF9QQVJBTUVURVJfSEFORExJTkc6CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIHVzZSBkcmMgcGFyYW1ldGVycyBhcyByZXF1ZXN0ZWQgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTkFCTEVEX1BBUkFNRVRFUl9IQU5ETElORzoKKyAgICAgIC8qIGREbXg6IGVzdGltYXRlZCBoZWFkcm9vbSByZWR1Y3Rpb24gZHVlIHRvIGRvd25taXgsIGZvcm1hdDogLTEvNCpkQgorICAgICAgICAgZERteCA9IGZsb29yKC00KjIwKmxvZzEwKGFhY051bUNoYW5uZWxzL251bU91dENoYW5uZWxzKSkgKi8KKyAgICAgIGlmIChpc0Rvd25taXgpIHsKKyAgICAgICAgRklYUF9EQkwgZG14VG1wOworICAgICAgICBpbnQgZV9sb2csIGVfbXVsdDsKKyAgICAgICAgZG14VG1wID0gZkRpdk5vcm0oc2VsZi0+bnVtT3V0Q2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFhY051bUNoYW5uZWxzKTsgLyogaW52ZXJzZSBkaXZpc2lvbiAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlIHNpZ24gYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dhcml0aG0gKi8KKyAgICAgICAgZG14VG1wID0gZkxvZzIoZG14VG1wLCAwLCAmZV9sb2cpOworICAgICAgICBkbXhUbXAgPSBmTXVsdE5vcm0oCisgICAgICAgICAgICBkbXhUbXAsIEZMMkZYQ09OU1RfREJMKDQuMGYgKiAyMC4wZiAqIDAuMzAxMDNmIC8gKGZsb2F0KSgxIDw8IDUpKSwKKyAgICAgICAgICAgICZlX211bHQpOyAvKiBlID0gZV9sb2cgKyBlX211bHQgKyA1ICovCisgICAgICAgIGREbXggPSAoaW50KXNjYWxlVmFsdWUoZG14VG1wLCBlX2xvZyArIGVfbXVsdCArIDUgLSAoREZSQUNUX0JJVFMgLSAxKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkRG14ID0gMDsKKyAgICAgIH0KKworICAgICAgLyogZEhyOiBGdWxsIGVzdGltYXRlZCAoZGVjb2RlcikgaGVhZHJvb20gcmVkdWN0aW9uIGR1ZSB0byBsb3VkbmVzcworICAgICAgICogbm9ybWFsaXNhdGlvbiAoRFRMIC0gUFJMKSBhbmQgZG93bm1peC4gRm9ybWF0OiAtMS80KmRCICovCisgICAgICBpZiAocC0+dGFyZ2V0UmVmTGV2ZWwgPj0gMCkgeyAvKiBpZiB0YXJnZXQgbGV2ZWwgaXMgcHJvdmlkZWQgKi8KKyAgICAgICAgZEhyID0gcC0+dGFyZ2V0UmVmTGV2ZWwgKyBkRG14IC0gc2VsZi0+cHJvZ1JlZkxldmVsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZEhyID0gZERteDsKKyAgICAgIH0KKworICAgICAgaWYgKGRIciA8IDApIHsgLyogaWYgaGVhZHJvb20gaXMgcmVkdWNlZCAqLworICAgICAgICAvKiBVc2UgY29tcHJlc3Npb24sIGJ1dCBhcyBsaXR0bGUgYXMgcG9zc2libGUuICovCisgICAgICAgIC8qIGVIcjogSGVhZHJvb20gcHJvdmlkZWQgYnkgZW5jb2RlciwgZm9ybWF0OiAtMS80IGRCICovCisgICAgICAgIGludCBlSHIgPSBmaXhNaW4ocC0+ZW5jb2RlclRhcmdldExldmVsIC0gc2VsZi0+cHJvZ1JlZkxldmVsLCAwKTsKKyAgICAgICAgaWYgKGVIciA8CisgICAgICAgICAgICBkSHIpIHsgLyogaWYgZW5jb2RlciBwcm92aWRlcyBtb3JlIGhlYWRyb29tIHRoYW4gZGVjb2RlciBuZWVkcyAqLworICAgICAgICAgIC8qIGRlcml2ZSBzY2FsaW5nIG9mIGxpZ2h0IERSQyAqLworICAgICAgICAgIEZJWFBfREJMIGNhbGNGYWN0b3Jfbm9ybTsKKyAgICAgICAgICBJTlQgY2FsY0ZhY3RvcjsgLyogZnJhY3Rpb24gb2YgRFJDIGdhaW5zIHRoYXQgaXMgbWluaW1hbGx5IG5lZWRlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcHBpbmcgcHJldmVudGlvbiAqLworICAgICAgICAgIGNhbGNGYWN0b3Jfbm9ybSA9CisgICAgICAgICAgICAgIGZEaXZOb3JtKC1kSHIsIC1lSHIpOyAvKiAwLjAgPCBjYWxjRmFjdG9yX25vcm0gPCAxLjAgKi8KKyAgICAgICAgICBjYWxjRmFjdG9yX25vcm0gPSBjYWxjRmFjdG9yX25vcm0gPj4gRFJDX1BBUkFNX1NDQUxFOworICAgICAgICAgIC8qIHF1YW50aXplIHRvIDEyOCBzdGVwcyAqLworICAgICAgICAgIGNhbGNGYWN0b3IgPSBjb252ZXJ0X2RyY1BhcmFtKAorICAgICAgICAgICAgICBjYWxjRmFjdG9yX25vcm0pOyAvKiBjb252ZXJ0IHRvIGludGVnZXIgdmFsdWUgYmV0d2VlbiAwIGFuZCAxMjcgKi8KKyAgICAgICAgICBjYWxjRmFjdG9yX25vcm0gPSAoRklYUF9EQkwpKAorICAgICAgICAgICAgICAoSU5UKShEUkNfUEFSQU1fUVVBTlRfU1RFUCA+PiBEUkNfUEFSQU1fU0NBTEUpICogY2FsY0ZhY3Rvcik7CisgICAgICAgICAgcC0+Y3V0ID0gKGNhbGNGYWN0b3Jfbm9ybSA+IHAtPmN1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgPyBjYWxjRmFjdG9yX25vcm0KKyAgICAgICAgICAgICAgICAgICAgICAgOiBwLT5jdXQ7IC8qIHVzZSBjYWxjRmFjdG9yX25vcm0gYXMgbG93ZXIgbGltaXQgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBlbmNvZGVyIHByb3ZpZGVzIGVxdWFsIG9yIGxlc3MgaGVhZHJvb20gdGhhbiBkZWNvZGVyIG5lZWRzICovCisgICAgICAgICAgLyogdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4gSXQgaXMKKyAgICAgICAgICAgKiBhc3N1bWVkIHRoYXQgdGhlIGZyYW1ld29yayBhY3RpdmF0ZXMgaXQgYnkgZGVmYXVsdCAqLworICAgICAgICAgIHAtPmN1dCA9IERSQ19TQ0FMSU5HX01BWDsKKyAgICAgICAgICBpZiAoKGRIciAtIGVIcikgPD0KKyAgICAgICAgICAgICAgLTQgKiBEUkNfSEVBVllfVEhSRVNIT0xEX0RCKSB7IC8qIHVzZSBoZWF2eSBjb21wcmVzc2lvbiBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZHJvb20gZGVmaWNpdCBpcyBlcXVhbCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGVyIHRoYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSQ19IRUFWWV9USFJFU0hPTERfREIgKi8KKyAgICAgICAgICAgIHAtPmFwcGx5SGVhdnlDb21wcmVzc2lvbiA9IE9OOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsgLyogZEhyID49IDAgKi8KKyAgICAgICAgLyogbm8gcmVzdHJpY3Rpb25zIHJlcXVpcmVkLCBhcyBoZWFkcm9vbSBpcyBub3QgcmVkdWNlZC4gKi8KKyAgICAgICAgLyogcC0+Y3V0ID0gcC0+dXNyQ3V0OyAqLworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIHByZXNlbnRhdGlvbiBtb2RlIDEgYW5kIDIgYWNjb3JkaW5nIHRvIEVUU0kgVFMgMTAxIDE1NDoKKyAgICAgICAgIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIChEVkIpOyBTcGVjaWZpY2F0aW9uIGZvciB0aGUgdXNlIG9mIFZpZGVvCisgICAgICAgICBhbmQgQXVkaW8gQ29kaW5nIGluIEJyb2FkY2FzdGluZyBBcHBsaWNhdGlvbnMgYmFzZWQgb24gdGhlIE1QRUctMgorICAgICAgICAgVHJhbnNwb3J0IFN0cmVhbSwgc2VjdGlvbiBDLjUuNC4sICJEZWNvZGluZyIsIGFuZCBUYWJsZSBDLjMzLiBBbHNvCisgICAgICAgICBhY2NvcmRpbmcgdG8gYW1lbmRtZW50IDQgdG8gSVNPL0lFQyAxNDQ5Ni0zLCBzZWN0aW9uIDQuNS4yLjE0LjIuNCwgYW5kCisgICAgICAgICBUYWJsZSBBTUQ0LjExLiBJU08gRFJDICAgICAgICAgICAgLT4gYXBwbHlIZWF2eUNvbXByZXNzaW9uID0gT0ZGIChVc2UKKyAgICAgICAgIGxpZ2h0IGNvbXByZXNzaW9uLCBNUEVHLXN0eWxlKSBDb21wcmVzc2lvbl92YWx1ZSAgLT4KKyAgICAgICAgIGFwcGx5SGVhdnlDb21wcmVzc2lvbiA9IE9OICAoVXNlIGhlYXZ5IGNvbXByZXNzaW9uLCBEVkItc3R5bGUpIHNjYWxpbmcKKyAgICAgICAgIHJlc3RyaWN0ZWQgLT4gcC0+Y3V0ID0gRFJDX1NDQUxJTkdfTUFYICovCisKKyAgICBjYXNlIERSQ19QUkVTRU5UQVRJT05fTU9ERV8xOiAvKiBwcmVzZW50YXRpb24gbW9kZSAxLCBMaWdodDotMzEvSGVhdnk6LTIzICovCisgICAgICBpZiAoKHAtPnRhcmdldFJlZkxldmVsID49IDApICYmCisgICAgICAgICAgKHAtPnRhcmdldFJlZkxldmVsIDwKKyAgICAgICAgICAgMTI0KSkgeyAvKiBpZiB0YXJnZXQgbGV2ZWwgaXMgcHJvdmlkZWQgYW5kID4gLTMxIGRCICovCisgICAgICAgIC8qIHBsYXliYWNrIHVwIHRvIC0yMyBkQiAqLworICAgICAgICBwLT5hcHBseUhlYXZ5Q29tcHJlc3Npb24gPSBPTjsKKyAgICAgIH0gZWxzZSB7IC8qIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIgb3Igbm90IHByb3ZpZGVkICovCisgICAgICAgIC8qIHBsYXliYWNrIC0zMSBkQiAqLworICAgICAgICBpZiAoaXNNb25vRG93bm1peCB8fCBpc1N0ZXJlb0Rvd25taXgpIHsgLyogc3RlcmVvIG9yIG1vbm8gZG93bm1peGluZyAqLworICAgICAgICAgIHAtPmN1dCA9IERSQ19TQ0FMSU5HX01BWDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERSQ19QUkVTRU5UQVRJT05fTU9ERV8yOiAvKiBwcmVzZW50YXRpb24gbW9kZSAyLCBMaWdodDotMjMvSGVhdnk6LTIzICovCisgICAgICBpZiAoKHAtPnRhcmdldFJlZkxldmVsID49IDApICYmCisgICAgICAgICAgKHAtPnRhcmdldFJlZkxldmVsIDwKKyAgICAgICAgICAgMTI0KSkgeyAvKiBpZiB0YXJnZXQgbGV2ZWwgaXMgcHJvdmlkZWQgYW5kID4gLTMxIGRCICovCisgICAgICAgIC8qIHBsYXliYWNrIHVwIHRvIC0yMyBkQiAqLworICAgICAgICBpZiAoaXNNb25vRG93bm1peCkgeyAvKiBpZiBtb25vIGRvd25taXggKi8KKyAgICAgICAgICBwLT5hcHBseUhlYXZ5Q29tcHJlc3Npb24gPSBPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwLT5hcHBseUhlYXZ5Q29tcHJlc3Npb24gPSBPRkY7CisgICAgICAgICAgcC0+Y3V0ID0gRFJDX1NDQUxJTkdfTUFYOworICAgICAgICB9CisgICAgICB9IGVsc2UgeyAvKiB0YXJnZXQgbGV2ZWwgPD0gLTMxIGRCIG9yIG5vdCBwcm92aWRlZCAqLworICAgICAgICAvKiBwbGF5YmFjayAtMzEgZEIgKi8KKyAgICAgICAgcC0+YXBwbHlIZWF2eUNvbXByZXNzaW9uID0gT0ZGOworICAgICAgICBpZiAoaXNNb25vRG93bm1peCB8fCBpc1N0ZXJlb0Rvd25taXgpIHsgLyogc3RlcmVvIG9yIG1vbm8gZG93bm1peGluZyAqLworICAgICAgICAgIHAtPmN1dCA9IERSQ19TQ0FMSU5HX01BWDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgIH0gLyogIHN3aXRjaCAoZHJjUGFyYW1ldGVySGFuZGxpbmcpICovCisKKyAgLyogV2l0aCBoZWF2eSBjb21wcmVzc2lvbiwgdGhlcmUgaXMgbm8gc2NhbGluZy4KKyAgICAgU2NhbGluZyBmYWN0b3JzIGFyZSBzZXQgZm9yIG5vdGlmaWNhdGlvbiBvbmx5LiAqLworICBpZiAocC0+YXBwbHlIZWF2eUNvbXByZXNzaW9uID09IE9OKSB7CisgICAgcC0+Ym9vc3QgPSBEUkNfU0NBTElOR19NQVg7CisgICAgcC0+Y3V0ID0gRFJDX1NDQUxJTkdfTUFYOworICB9CisKKyAgLyogc3dpdGNoIG9uL29mZiBwcm9jZXNzaW5nICovCisgIHNlbGYtPmVuYWJsZSA9ICgocC0+Ym9vc3QgPiAoRklYUF9EQkwpMCkgfHwgKHAtPmN1dCA+IChGSVhQX0RCTCkwKSB8fAorICAgICAgICAgICAgICAgICAgKHAtPmFwcGx5SGVhdnlDb21wcmVzc2lvbiA9PSBPTikgfHwgKHAtPnRhcmdldFJlZkxldmVsID49IDApKTsKKyAgc2VsZi0+ZW5hYmxlID0gKHNlbGYtPmVuYWJsZSAmJiAhc2VsZi0+dW5pRHJjUHJlY2VkZW5jZSk7CisKKyAgc2VsZi0+cHJldkFhY051bUNoYW5uZWxzID0gYWFjTnVtQ2hhbm5lbHM7CisgIHNlbGYtPnVwZGF0ZSA9IDA7CiB9CiAKLQotLyogCi0gKiBGaW5hbGl6ZSBEUkMgcHJvY2Vzc2luZworLyoKKyAqIFByZXBhcmUgRFJDIHByb2Nlc3NpbmcKKyAqICAgVmFsaWQgcmV0dXJuIHZhbHVlcyBhcmU6CisgKiAgICAgLTEgOiBBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VyZWQuCisgKiAgICAgIDAgOiBObyBlcnJvciBhbmQgbm8gdmFsaWQgRFJDIGRhdGEgYXZhaWxhYmxlLgorICogICAgICAxIDogTm8gZXJyb3IgYW5kIHZhbGlkIERSQyBkYXRhIGhhcyBiZWVuIG1hcHBlZC4KICAqLwotaW50IGFhY0RlY29kZXJfZHJjRXBpbG9nICgKLSAgICAgICAgSEFORExFX0FBQ19EUkMgIHNlbGYsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tdLAotICAgICAgICBVQ0hBUiAgcGNlSW5zdGFuY2VUYWcsCi0gICAgICAgIFVDSEFSICBjaGFubmVsTWFwcGluZ1tdLCAvKiBDaGFubmVsIG1hcHBpbmcgdHJhbnNsYXRpbmcgZHJjQ2hhbm5lbCBpbmRleCB0byBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCAqLwotICAgICAgICBpbnQgICAgdmFsaWRDaGFubmVscyApCi17Ci0gIGludCBlcnIgPSAwOworaW50IGFhY0RlY29kZXJfZHJjUHJvbG9nKAorICAgIEhBTkRMRV9BQUNfRFJDIHNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW10sCisgICAgVUNIQVIgcGNlSW5zdGFuY2VUYWcsCisgICAgVUNIQVIgY2hhbm5lbE1hcHBpbmdbXSwgLyogQ2hhbm5lbCBtYXBwaW5nIHRyYW5zbGF0aW5nIGRyY0NoYW5uZWwgaW5kZXggdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCAqLworICAgIGludCB2YWxpZENoYW5uZWxzKSB7CisgIGludCByZXN1bHQgPSAwOwogCiAgIGlmIChzZWxmID09IE5VTEwpIHsKICAgICByZXR1cm4gLTE7CiAgIH0KIAotICBpZiAoc2VsZi0+cGFyYW1zLmJzRGVsYXlFbmFibGUpCi0gIHsKLSAgICBlcnIgPSBhYWNEZWNvZGVyX2RyY0V4dHJhY3RBbmRNYXAgKAotICAgICAgICAgICAgc2VsZiwKLSAgICAgICAgICAgIGhCcywKLSAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICBwY2VJbnN0YW5jZVRhZywKLSAgICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLAotICAgICAgICAgICAgdmFsaWRDaGFubmVscyApOworICBpZiAoIXNlbGYtPnBhcmFtcy5ic0RlbGF5RW5hYmxlKSB7CisgICAgLyoga2VlcCBwcmV2aW91cyBwcm9nUmVmTGV2ZWwgYW5kIHByZXNNb2RlIGZvciB1cGRhdGUgZmxhZyBpbgorICAgICAqIGRyY1BhcmFtZXRlckhhbmRsaW5nICovCisgICAgSU5UIHByZXZQUkwsIHByZXZQTSA9IDA7CisgICAgcHJldlBSTCA9IHNlbGYtPnByb2dSZWZMZXZlbDsKKyAgICBwcmV2UE0gPSBzZWxmLT5wcmVzTW9kZTsKKworICAgIHJlc3VsdCA9IGFhY0RlY29kZXJfZHJjRXh0cmFjdEFuZE1hcCgKKyAgICAgICAgc2VsZiwgaEJzLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLCBwY2VJbnN0YW5jZVRhZywgY2hhbm5lbE1hcHBpbmcsCisgICAgICAgIHZhbGlkQ2hhbm5lbHMpOworCisgICAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyogRHJjIHBhcmFtZXRlciBoYW5kbGluZyAqLworICAgIGFhY0RlY29kZXJfZHJjUGFyYW1ldGVySGFuZGxpbmcoc2VsZiwgdmFsaWRDaGFubmVscywgcHJldlBSTCwgcHJldlBNKTsKICAgfQogCi0gIHJldHVybiBlcnI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBGaW5hbGl6ZSBEUkMgcHJvY2Vzc2luZworICogICBWYWxpZCByZXR1cm4gdmFsdWVzIGFyZToKKyAqICAgICAtMSA6IEFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJlZC4KKyAqICAgICAgMCA6IE5vIGVycm9yIGFuZCBubyB2YWxpZCBEUkMgZGF0YSBhdmFpbGFibGUuCisgKiAgICAgIDEgOiBObyBlcnJvciBhbmQgdmFsaWQgRFJDIGRhdGEgaGFzIGJlZW4gbWFwcGVkLgorICovCitpbnQgYWFjRGVjb2Rlcl9kcmNFcGlsb2coCisgICAgSEFORExFX0FBQ19EUkMgc2VsZiwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bXSwKKyAgICBVQ0hBUiBwY2VJbnN0YW5jZVRhZywKKyAgICBVQ0hBUiBjaGFubmVsTWFwcGluZ1tdLCAvKiBDaGFubmVsIG1hcHBpbmcgdHJhbnNsYXRpbmcgZHJjQ2hhbm5lbCBpbmRleCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4ICovCisgICAgaW50IHZhbGlkQ2hhbm5lbHMpIHsKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChzZWxmLT5wYXJhbXMuYnNEZWxheUVuYWJsZSkgeworICAgIC8qIGtlZXAgcHJldmlvdXMgcHJvZ1JlZkxldmVsIGFuZCBwcmVzTW9kZSBmb3IgdXBkYXRlIGZsYWcgaW4KKyAgICAgKiBkcmNQYXJhbWV0ZXJIYW5kbGluZyAqLworICAgIElOVCBwcmV2UFJMLCBwcmV2UE0gPSAwOworICAgIHByZXZQUkwgPSBzZWxmLT5wcm9nUmVmTGV2ZWw7CisgICAgcHJldlBNID0gc2VsZi0+cHJlc01vZGU7CisKKyAgICByZXN1bHQgPSBhYWNEZWNvZGVyX2RyY0V4dHJhY3RBbmRNYXAoCisgICAgICAgIHNlbGYsIGhCcywgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywgcGNlSW5zdGFuY2VUYWcsIGNoYW5uZWxNYXBwaW5nLAorICAgICAgICB2YWxpZENoYW5uZWxzKTsKKworICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qIERyYyBwYXJhbWV0ZXIgaGFuZGxpbmcgKi8KKyAgICBhYWNEZWNvZGVyX2RyY1BhcmFtZXRlckhhbmRsaW5nKHNlbGYsIHZhbGlkQ2hhbm5lbHMsIHByZXZQUkwsIHByZXZQTSk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OwogfQogCiAvKgogICogRXhwb3J0IHJlbGV2YW50IG1ldGFkYXRhIGluZm8gZnJvbSBiaXRzdHJlYW0gcGF5bG9hZC4KICAqLwotdm9pZCBhYWNEZWNvZGVyX2RyY0dldEluZm8gKAotICAgICAgICBIQU5ETEVfQUFDX0RSQyAgc2VsZiwKLSAgICAgICAgU0NIQVIgICAgICAgICAgKnBQcmVzTW9kZSwKLSAgICAgICAgU0NIQVIgICAgICAgICAgKnBQcm9nUmVmTGV2ZWwgKQotewordm9pZCBhYWNEZWNvZGVyX2RyY0dldEluZm8oSEFORExFX0FBQ19EUkMgc2VsZiwgU0NIQVIgKnBQcmVzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICpwUHJvZ1JlZkxldmVsKSB7CiAgIGlmIChzZWxmICE9IE5VTEwpIHsKICAgICBpZiAocFByZXNNb2RlICE9IE5VTEwpIHsKICAgICAgICpwUHJlc01vZGUgPSBzZWxmLT5wcmVzTW9kZTsKZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2RyYy5oIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNfZHJjLmgKaW5kZXggYzg1MGFhNS4uOTI0ZWM2ZiAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfZHJjLmgKKysrIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNfZHJjLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTExICs5MCwxMDMgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBDaHJpc3RpYW4gR3JpZWJlbAorCiAgICBEZXNjcmlwdGlvbjogRHluYW1pYyByYW5nZSBjb250cm9sIChEUkMpIGRlY29kZXIgdG9vbCBmb3IgQUFDCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgQUFDREVDX0RSQ19ICiAjZGVmaW5lIEFBQ0RFQ19EUkNfSAogCi0jaW5jbHVkZSAidHBfZGF0YS5oIiAgICAgICAgICAgIC8qIGZvciBwcm9ncmFtIGNvbmZpZyBlbGVtZW50IHN1cHBvcnQgKi8KLQorI2luY2x1ZGUgInRwX2RhdGEuaCIgLyogZm9yIHByb2dyYW0gY29uZmlnIGVsZW1lbnQgc3VwcG9ydCAqLwogCiAjaW5jbHVkZSAiYWFjZGVjX2RyY190eXBlcy5oIgogI2luY2x1ZGUgImNoYW5uZWwuaCIKICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAKLSNkZWZpbmUgQUFDREVDX0RSQ19ERkxUX0VYUElSWV9GUkFNRVMgKCAgNTAgKSAgIC8qIERlZmF1bHQgRFJDIGRhdGEgZXhwaXJ5IHRpbWUgaW4gQUFDIGZyYW1lcyAgICovCisjZGVmaW5lIEFBQ0RFQ19EUkNfREZMVF9FWFBJUllfRlJBTUVTIFwKKyAgKDApIC8qIERlZmF1bHQgRFJDIGRhdGEgZXhwaXJ5IHRpbWUgaW4gQUFDIGZyYW1lcyAgICovCisKKy8qICNkZWZpbmUgQUFDREVDX0RSQ19JR05PUkVfRlJBTUVTX1dJVEhfTVVMVElQTEVfQ0hfVEhSRUFEUyAqLyAvKiBUaGUgbmFtZSBzYXlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgYWxsLiAqLworLyogI2RlZmluZSBBQUNERUNfRFJDX0RFQlVHICovCiAKIC8qKgogICogXGJyaWVmIERSQyBtb2R1bGUgc2V0dGluZyBwYXJhbWV0ZXJzCiAgKi8KLXR5cGVkZWYgZW51bQotewordHlwZWRlZiBlbnVtIHsKICAgRFJDX0NVVF9TQ0FMRSA9IDAsCiAgIERSQ19CT09TVF9TQ0FMRSwKICAgVEFSR0VUX1JFRl9MRVZFTCwKICAgRFJDX0JTX0RFTEFZLAogICBEUkNfREFUQV9FWFBJUllfRlJBTUUsCiAgIEFQUExZX05PUk1BTElaQVRJT04sCi0gIEFQUExZX0hFQVZZX0NPTVBSRVNTSU9OCi0KKyAgQVBQTFlfSEVBVllfQ09NUFJFU1NJT04sCisgIERFRkFVTFRfUFJFU0VOVEFUSU9OX01PREUsCisgIEVOQ09ERVJfVEFSR0VUX0xFVkVMLAorICBNQVhfT1VUUFVUX0NIQU5ORUxTLAorICBVTklEUkNfUFJFQ0VERU5DRQogfSBBQUNERUNfRFJDX1BBUkFNOwogCi0KIC8qKgogICogXGJyaWVmIERSQyBtb2R1bGUgaW50ZXJmYWNlIGZ1bmN0aW9ucwogICovCi12b2lkIGFhY0RlY29kZXJfZHJjSW5pdCAoCi0gICAgICAgIEhBTkRMRV9BQUNfRFJDICBzZWxmICk7Cit2b2lkIGFhY0RlY29kZXJfZHJjSW5pdChIQU5ETEVfQUFDX0RSQyBzZWxmKTsKIAotdm9pZCBhYWNEZWNvZGVyX2RyY0luaXRDaGFubmVsRGF0YSAoCi0gICAgICAgIENEcmNDaGFubmVsRGF0YSAqcERyY0NoYW5uZWwgKTsKK3ZvaWQgYWFjRGVjb2Rlcl9kcmNJbml0Q2hhbm5lbERhdGEoQ0RyY0NoYW5uZWxEYXRhICpwRHJjQ2hhbm5lbCk7CiAKLUFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0gKAotICAgICAgICBIQU5ETEVfQUFDX0RSQyAgICBzZWxmLAotICAgICAgICBBQUNERUNfRFJDX1BBUkFNICBwYXJhbSwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgdmFsdWUgKTsKK0FBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0oSEFORExFX0FBQ19EUkMgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDREVDX0RSQ19QQVJBTSBwYXJhbSwgSU5UIHZhbHVlKTsKIAotaW50IGFhY0RlY29kZXJfZHJjTWFya1BheWxvYWQgKAotICAgICAgICBIQU5ETEVfQUFDX0RSQyAgc2VsZiwKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCcywKLSAgICAgICAgQUFDREVDX0RSQ19QQVlMT0FEX1RZUEUgIHR5cGUgKTsKK2ludCBhYWNEZWNvZGVyX2RyY01hcmtQYXlsb2FkKEhBTkRMRV9BQUNfRFJDIHNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0RFQ19EUkNfUEFZTE9BRF9UWVBFIHR5cGUpOwogCi1pbnQgYWFjRGVjb2Rlcl9kcmNQcm9sb2cgKAotICAgICAgICBIQU5ETEVfQUFDX0RSQyAgc2VsZiwKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAotICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW10sCi0gICAgICAgIFVDSEFSICBwY2VJbnN0YW5jZVRhZywKLSAgICAgICAgVUNIQVIgIGNoYW5uZWxNYXBwaW5nW10sCi0gICAgICAgIGludCAgICBudW1DaGFubmVscyApOworaW50IGFhY0RlY29kZXJfZHJjUHJvbG9nKAorICAgIEhBTkRMRV9BQUNfRFJDIHNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW10sCisgICAgVUNIQVIgcGNlSW5zdGFuY2VUYWcsIFVDSEFSIGNoYW5uZWxNYXBwaW5nW10sIGludCB2YWxpZENoYW5uZWxzKTsKIAogLyoqCi0gKiBcYnJpZWYgQXBwbHkgRFJDLiBJZiBTQlIgaXMgcHJlc2VudCwgRFJDIGRhdGEgaXMgaGFuZGVkIG92ZXIgdG8gdGhlIFNCUiBkZWNvZGVyLgorICogXGJyaWVmIEFwcGx5IERSQy4gSWYgU0JSIGlzIHByZXNlbnQsIERSQyBkYXRhIGlzIGhhbmRlZCBvdmVyIHRvIHRoZSBTQlIKKyAqIGRlY29kZXIuCiAgKiBccGFyYW0gc2VsZiBBQUMgZGVjb2RlciBpbnN0YW5jZQogICogXHBhcmFtIHBTYnJEZWMgcG9pbnRlciB0byBTQlIgZGVjb2RlciBpbnN0YW5jZQogICogXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gQUFDIGRlY29kZXIgY2hhbm5lbCBpbnN0YW5jZSB0byBiZSBwcm9jZXNzZWQKICAqIFxwYXJhbSBwRHJjRGF0IERSQyBjaGFubmVsIGRhdGEKLSAqIFxwYXJhbSBleHRHYWluIFBvaW50ZXIgdG8gYSBGSVhQX0RCTCB3aGVyZSBhIGV4dGVybmFsbHkgYXBwbHlhYmxlIGdhaW4gd2lsbCBiZSBzdG9yZWQgaW50byAoaW5kZXBlbmRlbnRseSBvbiB3aGV0aGVyIGl0IHdpbGwgYmUgYXBwbHkgaW50ZXJuYWxseSBvciBub3QpLgotICogICAgICAgICAgICAgICAgQXQgZnVuY3Rpb24gY2FsbCB0aGUgYnVmZmVyIG11c3QgaG9sZCB0aGUgc2NhbGUgKDAgPj0gc2NhbGUgPCBERlJBQ1RfQklUUykgdG8gYmUgYXBwbGllZCBvbiB0aGUgZ2FpbiB2YWx1ZS4KKyAqIFxwYXJhbSBleHRHYWluIFBvaW50ZXIgdG8gYSBGSVhQX0RCTCB3aGVyZSBhIGV4dGVybmFsbHkgYXBwbHlhYmxlIGdhaW4gd2lsbAorICogYmUgc3RvcmVkIGludG8gKGluZGVwZW5kZW50bHkgb24gd2hldGhlciBpdCB3aWxsIGJlIGFwcGx5IGludGVybmFsbHkgb3Igbm90KS4KKyAqICAgICAgICAgICAgICAgIEF0IGZ1bmN0aW9uIGNhbGwgdGhlIGJ1ZmZlciBtdXN0IGhvbGQgdGhlIHNjYWxlICgwID49IHNjYWxlIDwKKyAqIERGUkFDVF9CSVRTKSB0byBiZSBhcHBsaWVkIG9uIHRoZSBnYWluIHZhbHVlLgogICogXHBhcmFtIGNoIGNoYW5uZWwgaW5kZXgKICAqIFxwYXJhbSBhYWNGcmFtZVNpemUgQUFDIGZyYW1lIHNpemUKLSAqIFxwYXJhbSBiU2JyUHJlc2VudCBmbGFnIGluZGljYXRpbmcgdGhhdCBTQlIgaXMgcHJlc2VudCwgaW4gd2hpY2ggY2FzZSBEUkMgaXMgaGFuZGVkIG92ZXIgdG8gdGhlIFNCUiBpbnN0YW5jZSBwU2JyRGVjCisgKiBccGFyYW0gYlNiclByZXNlbnQgZmxhZyBpbmRpY2F0aW5nIHRoYXQgU0JSIGlzIHByZXNlbnQsIGluIHdoaWNoIGNhc2UgRFJDIGlzCisgKiBoYW5kZWQgb3ZlciB0byB0aGUgU0JSIGluc3RhbmNlIHBTYnJEZWMKICAqLwotdm9pZCBhYWNEZWNvZGVyX2RyY0FwcGx5ICgKLSAgICAgICAgSEFORExFX0FBQ19EUkMgICAgICAgICAgc2VsZiwKLSAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAqcFNickRlYywKLSAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgQ0RyY0NoYW5uZWxEYXRhICAgICAgICAqcERyY0RhdCwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAqZXh0R2FpbiwKLSAgICAgICAgaW50ICBjaCwKLSAgICAgICAgaW50ICBhYWNGcmFtZVNpemUsCi0gICAgICAgIGludCAgYlNiclByZXNlbnQgKTsKK3ZvaWQgYWFjRGVjb2Rlcl9kcmNBcHBseShIQU5ETEVfQUFDX0RSQyBzZWxmLCB2b2lkICpwU2JyRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0RyY0NoYW5uZWxEYXRhICpwRHJjRGF0LCBGSVhQX0RCTCAqZXh0R2FpbiwgaW50IGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhYWNGcmFtZVNpemUsIGludCBiU2JyUHJlc2VudCk7CiAKLWludCBhYWNEZWNvZGVyX2RyY0VwaWxvZyAoCi0gICAgICAgIEhBTkRMRV9BQUNfRFJDICBzZWxmLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bXSwKLSAgICAgICAgVUNIQVIgIHBjZUluc3RhbmNlVGFnLAotICAgICAgICBVQ0hBUiAgY2hhbm5lbE1hcHBpbmdbXSwKLSAgICAgICAgaW50ICAgIHZhbGlkQ2hhbm5lbHMgKTsKK2ludCBhYWNEZWNvZGVyX2RyY0VwaWxvZygKKyAgICBIQU5ETEVfQUFDX0RSQyBzZWxmLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tdLAorICAgIFVDSEFSIHBjZUluc3RhbmNlVGFnLCBVQ0hBUiBjaGFubmVsTWFwcGluZ1tdLCBpbnQgdmFsaWRDaGFubmVscyk7CiAKIC8qKgogICogXGJyaWVmIEdldCBtZXRhZGF0YSBpbmZvcm1hdGlvbiBmb3VuZCBpbiBiaXRzdHJlYW0uCiAgKiBccGFyYW0gc2VsZiBEUkMgbW9kdWxlIGluc3RhbmNlIGhhbmRsZS4KLSAqIFxwYXJhbSBwUHJlc01vZGUgUG9pbnRlciB0byBmaWVsZCB3aGVyZSB0aGUgcHJlc2VudGF0aW9uIG1vZGUgd2lsbCBiZSB3cml0dGVuIHRvLgotICogXHBhcmFtIHBQcm9nUmVmTGV2ZWwgUG9pbnRlciB0byBmaWVsZCB3aGVyZSB0aGUgcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgd2lsbCBiZSB3cml0dGVuIHRvLgorICogXHBhcmFtIHBQcmVzTW9kZSBQb2ludGVyIHRvIGZpZWxkIHdoZXJlIHRoZSBwcmVzZW50YXRpb24gbW9kZSB3aWxsIGJlIHdyaXR0ZW4KKyAqIHRvLgorICogXHBhcmFtIHBQcm9nUmVmTGV2ZWwgUG9pbnRlciB0byBmaWVsZCB3aGVyZSB0aGUgcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgd2lsbAorICogYmUgd3JpdHRlbiB0by4KICAqIFxyZXR1cm4gTm90aGluZy4KICAqLwotdm9pZCBhYWNEZWNvZGVyX2RyY0dldEluZm8gKAotICAgICAgICBIQU5ETEVfQUFDX0RSQyAgc2VsZiwKLSAgICAgICAgU0NIQVIgICpwUHJlc01vZGUsCi0gICAgICAgIFNDSEFSICAqcFByb2dSZWZMZXZlbCApOwordm9pZCBhYWNEZWNvZGVyX2RyY0dldEluZm8oSEFORExFX0FBQ19EUkMgc2VsZiwgU0NIQVIgKnBQcmVzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICpwUHJvZ1JlZkxldmVsKTsKIAotCi0jZW5kaWYgIC8qIEFBQ0RFQ19EUkNfSCAqLworI2VuZGlmIC8qIEFBQ0RFQ19EUkNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfZHJjX3R5cGVzLmggYi9saWJBQUNkZWMvc3JjL2FhY2RlY19kcmNfdHlwZXMuaAppbmRleCA0YzZkMTYzLi43NmMzNWQwIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY2RlY19kcmNfdHlwZXMuaAorKysgYi9saWJBQUNkZWMvc3JjL2FhY2RlY19kcmNfdHlwZXMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw5NiArOTAsMTMxIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEdyaWViZWwKKwogICAgRGVzY3JpcHRpb246IER5bmFtaWMgcmFuZ2UgY29udHJvbCAoRFJDKSBnbG9iYWwgZGF0YSB0eXBlcwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIEFBQ0RFQ19EUkNfVFlQRVNfSAogI2RlZmluZSBBQUNERUNfRFJDX1RZUEVTX0gKIAotCi0KICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKLSAjZGVmaW5lIE1BWF9EUkNfVEhSRUFEUyAgICAgICggICAzICkgICAgICAgIC8qIEhlYXZ5IGNvbXByZXNzaW9uIHZhbHVlIGlzIGhhbmRsZWQganVzdCBsaWtlIE1QRUcgRFJDIGRhdGEgKi8KLSNkZWZpbmUgTUFYX0RSQ19CQU5EUyAgICAgICAgICggIDE2ICkgICAgICAgIC8qIDJeTEVOX0RSQ19CQU5EX0lOQ1IgKExFTl9EUkNfQkFORF9JTkNSID0gNCkgKi8KKyNkZWZpbmUgTUFYX0RSQ19USFJFQURTIFwKKyAgKCg4KSArIDEpIC8qIEhlYXZ5IGNvbXByZXNzaW9uIHZhbHVlIGlzIGhhbmRsZWQganVzdCBsaWtlIE1QRUcgRFJDIGRhdGEgKi8KKyNkZWZpbmUgTUFYX0RSQ19CQU5EUyAoMTYpIC8qIDJeTEVOX0RSQ19CQU5EX0lOQ1IgKExFTl9EUkNfQkFORF9JTkNSID0gNCkgKi8KIAogLyoqCiAgKiBcYnJpZWYgRFJDIG1vZHVsZSBnbG9iYWwgZGF0YSB0eXBlcwogICovCi10eXBlZGVmIGVudW0KLXsKLSAgVU5LTk9XTl9QQVlMT0FEICAgPSAgMCwKLSAgTVBFR19EUkNfRVhUX0RBVEEgPSAgMSwKLSAgRFZCX0RSQ19BTkNfREFUQSAgPSAgMgordHlwZWRlZiBlbnVtIHsKKyAgVU5LTk9XTl9QQVlMT0FEID0gMCwKKyAgTVBFR19EUkNfRVhUX0RBVEEgPSAxLAorICBEVkJfRFJDX0FOQ19EQVRBID0gMgogCiB9IEFBQ0RFQ19EUkNfUEFZTE9BRF9UWVBFOwogCi10eXBlZGVmIHN0cnVjdAotewotICBVSU5UICAgIGV4cGlyeUNvdW50OwotICBVSU5UICAgIG51bUJhbmRzOwotICBVU0hPUlQgIGJhbmRUb3BbTUFYX0RSQ19CQU5EU107Ci0gIFNIT1JUICAgZHJjSW50ZXJwb2xhdGlvblNjaGVtZTsKLSAgVUNIQVIgICBkcmNWYWx1ZVtNQVhfRFJDX0JBTkRTXTsKLSAgU0NIQVIgICBkcmNEYXRhVHlwZTsKKy8qKgorICogXGJyaWVmIE9wdGlvbnMgZm9yIHBhcmFtZXRlciBoYW5kbGluZyAvIHByZXNlbnRhdGlvbiBtb2RlCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIERJU0FCTEVEX1BBUkFNRVRFUl9IQU5ETElORyA9IC0xLCAvKiE8IERSQyBwYXJhbWV0ZXIgaGFuZGxpbmcgZGlzYWJsZWQsIGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBhcmUgYXBwbGllZCBhcyByZXF1ZXN0ZWQuICovCisgIEVOQUJMRURfUEFSQU1FVEVSX0hBTkRMSU5HID0KKyAgICAgIDAsIC8qITwgQXBwbHkgY2hhbmdlcyB0byByZXF1ZXN0ZWQgRFJDIHBhcmFtZXRlcnMgdG8gcHJldmVudCBjbGlwcGluZyAqLworICBEUkNfUFJFU0VOVEFUSU9OX01PREVfMSA9IDEsIC8qITwgRFJDIFByZXNlbnRhdGlvbiBtb2RlIDEqLworICBEUkNfUFJFU0VOVEFUSU9OX01PREVfMiA9IDIgIC8qITwgRFJDIFByZXNlbnRhdGlvbiBtb2RlIDIqLworCit9IEFBQ0RFQ19EUkNfUEFSQU1FVEVSX0hBTkRMSU5HOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQgZXhwaXJ5Q291bnQ7CisgIFVJTlQgbnVtQmFuZHM7CisgIFVTSE9SVCBiYW5kVG9wW01BWF9EUkNfQkFORFNdOworICBTSE9SVCBkcmNJbnRlcnBvbGF0aW9uU2NoZW1lOworICBVQ0hBUiBkcmNWYWx1ZVtNQVhfRFJDX0JBTkRTXTsKKyAgU0NIQVIgZHJjRGF0YVR5cGU7CiAKIH0gQ0RyY0NoYW5uZWxEYXRhOwogCi10eXBlZGVmIHN0cnVjdAotewotICBVSU5UICAgZXhjbHVkZWRDaG5zTWFzazsKLSAgU0NIQVIgIHByb2dSZWZMZXZlbDsKLSAgU0NIQVIgIHByZXNNb2RlOyAgICAgLyogUHJlc2VudGF0aW9uIG1vZGU6IDAgKG5vdCBpbmRpY2F0ZWQpLCAxLCAyLCBhbmQgMyAocmVzZXJ2ZWQpLiAqLwotICBTQ0hBUiAgcGNlSW5zdGFuY2VUYWc7Cit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQgZXhjbHVkZWRDaG5zTWFzazsKKyAgU0NIQVIgcHJvZ1JlZkxldmVsOworICBTQ0hBUiBwcmVzTW9kZTsgLyogUHJlc2VudGF0aW9uIG1vZGU6IDAgKG5vdCBpbmRpY2F0ZWQpLCAxLCAyLCBhbmQgMworICAgICAgICAgICAgICAgICAgICAgKHJlc2VydmVkKS4gKi8KKyAgU0NIQVIgcGNlSW5zdGFuY2VUYWc7CiAKICAgQ0RyY0NoYW5uZWxEYXRhIGNoYW5uZWxEYXRhOwogCiB9IENEcmNQYXlsb2FkOwogCi10eXBlZGVmIHN0cnVjdAotewotICBGSVhQX0RCTCAgY3V0OyAgICAgICAvKiBUaGUgYXR0ZW51YXRpb24gc2NhbGUgZmFjdG9yIGN1cnJlbnRseSB1c2VkLiAgICAgKi8KLSAgRklYUF9EQkwgIHVzckN1dDsgICAgLyogVGhlIGxhdGVzdCBhdHRlbnVhdGlvbiBzY2FsZSBmYWN0b3Igc2V0IGJ5IHVzZXIuICovCi0gIEZJWFBfREJMICBib29zdDsgICAgIC8qIFRoZSBib29zdCBzY2FsZSBmYWN0b3IgY3VycmVudGx5IHVzZWQuICAgICAgICAgICAqLwotICBGSVhQX0RCTCAgdXNyQm9vc3Q7ICAvKiBUaGUgbGF0ZXN0IGJvb3N0IHNjYWxlIGZhY3RvciBzZXQgYnkgdXNlci4gICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogRFJDIHBhcmFtZXRlcnM6IExhdGVzdCB1c2VyIHJlcXVlc3RzICovCisgIEZJWFBfREJMIHVzckN1dDsKKyAgRklYUF9EQkwgdXNyQm9vc3Q7CisgIFVDSEFSIHVzckFwcGx5SGVhdnlDb21wcmVzc2lvbjsKIAotICBVSU5UICAgZXhwaXJ5RnJhbWU7Ci0gIFNDSEFSICB0YXJnZXRSZWZMZXZlbDsKLSAgVUNIQVIgIGJzRGVsYXlFbmFibGU7Ci0gIFVDSEFSICBhcHBseURpZ2l0YWxOb3JtOwotICBVQ0hBUiAgYXBwbHlIZWF2eUNvbXByZXNzaW9uOworICAvKiBEUkMgcGFyYW1ldGVyczogQ3VycmVudGx5IHVzZWQsIHBvc3NpYmx5IGNoYW5nZWQgYnkKKyAgICogYWFjRGVjb2Rlcl9kcmNQYXJhbWV0ZXJIYW5kbGluZyAqLworICBGSVhQX0RCTCBjdXQ7ICAgICAgICAgLyogYXR0ZW51YXRpb24gc2NhbGUgZmFjdG9yICovCisgIEZJWFBfREJMIGJvb3N0OyAgICAgICAvKiBib29zdCBzY2FsZSBmYWN0b3IgICovCisgIFNDSEFSIHRhcmdldFJlZkxldmVsOyAvKiB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIGZvciBsb3VkbmVzcyBub3JtYWxpemF0aW9uICovCisgIFVDSEFSIGFwcGx5SGVhdnlDb21wcmVzc2lvbjsgLyogaGVhdnkgY29tcHJlc3Npb24gKERWQikgZmxhZyAqLworCisgIFVJTlQgZXhwaXJ5RnJhbWU7CisgIFVDSEFSIGJzRGVsYXlFbmFibGU7CisgIFVDSEFSIGFwcGx5RGlnaXRhbE5vcm07CisKKyAgQUFDREVDX0RSQ19QQVJBTUVURVJfSEFORExJTkcgZGVmYXVsdFByZXNlbnRhdGlvbk1vZGU7CisgIFVDSEFSIGVuY29kZXJUYXJnZXRMZXZlbDsKIAogfSBDRHJjUGFyYW1zOwogCit0eXBlZGVmIHN0cnVjdCB7CisgIENEcmNQYXJhbXMKKyAgICAgIHBhcmFtczsgLyogTW9kdWxlIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IGJ5IHVzZXIgKHZpYSBTZXRQYXJhbSBBUEkKKyAgICAgICAgICAgICAgICAgZnVuY3Rpb24pICovCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIENEcmNQYXJhbXMgcGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb2R1bGUgcGFyYW1ldGVycyB0aGF0IGNhbiBiZSBzZXQgYnkgdXNlciAodmlhIFNldFBhcmFtIEFQSSBmdW5jdGlvbikgKi8KKyAgVUNIQVIgZW5hYmxlOyAgICAgIC8qIFN3aXRjaCB0aGF0IGNvbnRyb2xzIGR5bmFtaWMgcmFuZ2UgcHJvY2Vzc2luZyAqLworICBVQ0hBUiBkaWdpdGFsTm9ybTsgLyogU3dpdGNoIHRvIGVuLS9kaXNhYmxlIHJlZmVyZW5jZSBsZXZlbCBub3JtYWxpemF0aW9uIGluCisgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdGFsIGRvbWFpbiAqLwogCi0gIFVDSEFSICBlbmFibGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTd2l0Y2ggdGhhdCBjb250cm9scyBkeW5hbWljIHJhbmdlIHByb2Nlc3NpbmcgKi8KLSAgVUNIQVIgIGRpZ2l0YWxOb3JtOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN3aXRjaCB0byBlbi0vZGlzYWJsZSByZWZlcmVuY2UgbGV2ZWwgbm9ybWFsaXphdGlvbiBpbiBkaWdpdGFsIGRvbWFpbiAqLworICBVQ0hBUiB1cGRhdGU7IC8qIEZsYWcgaW5kaWNhdGluZyB0aGUgY2hhbmdlIG9mIGEgdXNlciBvciBiaXRzdHJlYW0gcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgd2hpY2ggYWZmZWN0cyBhYWNEZWNvZGVyX2RyY1BhcmFtZXRlckhhbmRsaW5nICovCisgIElOVCBudW1PdXRDaGFubmVsczsgICAgIC8qIE51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKi8KKyAgSU5UIHByZXZBYWNOdW1DaGFubmVsczsgLyogUHJldmlvdXMgbnVtYmVyIG9mIGNoYW5uZWxzIG9mIGFhYyBiaXRzdHJlYW0sIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHVwZGF0ZSBmbGFnICovCiAKLSAgVVNIT1JUIG51bVBheWxvYWRzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgRFJDIGRhdGEgcGF5bG9hZCBlbGVtZW50cyBmb3VuZCB3aXRoaW4gZnJhbWUgKi8KLSAgVVNIT1JUIG51bVRocmVhZHM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgRFJDIGRhdGEgdGhyZWFkcyBleHRyYWN0ZWQgZnJvbSB0aGUgZm91bmQgcGF5bG9hZCBlbGVtZW50cyAqLwotICBTQ0hBUiAgcHJvZ1JlZkxldmVsOyAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgZm9yIGFsbCBjaGFubmVscyAqLwotICBVQ0hBUiAgcHJvZ1JlZkxldmVsUHJlc2VudDsgICAgICAgICAgICAgICAgLyogUHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgZm91bmQgaW4gYml0c3RyZWFtICovCisgIFVTSE9SVCBudW1QYXlsb2FkczsgLyogVGhlIG51bWJlciBvZiBEUkMgZGF0YSBwYXlsb2FkIGVsZW1lbnRzIGZvdW5kIHdpdGhpbgorICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lICovCisgIFVTSE9SVAorICBudW1UaHJlYWRzOyAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgRFJDIGRhdGEgdGhyZWFkcyBleHRyYWN0ZWQgZnJvbSB0aGUgZm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkIGVsZW1lbnRzICovCisgIFNDSEFSIHByb2dSZWZMZXZlbDsgLyogUHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgZm9yIGFsbCBjaGFubmVscyAqLworICBVQ0hBUiBwcm9nUmVmTGV2ZWxQcmVzZW50OyAvKiBQcm9ncmFtIHJlZmVyZW5jZSBsZXZlbCBmb3VuZCBpbiBiaXRzdHJlYW0gKi8KIAotICBVSU5UICAgcHJsRXhwaXJ5Q291bnQ7ICAgICAgICAgICAgICAgICAgICAgLyogQ291bnRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIG1vbml0b3IgdGhlIGxpZmUgdGltZSBvZiB0aGUgcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwuICovCisgIFVJTlQgcHJsRXhwaXJ5Q291bnQ7IC8qIENvdW50ZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBtb25pdG9yIHRoZSBsaWZlIHRpbWUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByb2dyYW0gcmVmZXJlbmNlIGxldmVsLiAqLwogCi0gIFNDSEFSICBwcmVzTW9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJlc2VudGF0aW9uIG1vZGUgYXMgZGVmaW5lZCBpbiBFVFNJIFRTIDEwMSAxNTQgKi8KLSAgVUNIQVIgIGR2YkFuY0RhdGFBdmFpbGFibGU7ICAgICAgICAgICAgICAgICAgLyogRmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIERWQiBhbmNpbGxhcnkgZGF0YSBpcyBwcmVzZW50IG9yIG5vdCAqLwotICBVSU5UICAgZHZiQW5jRGF0YVBvc2l0aW9uOyAgICAgICAgICAgICAgICAgICAvKiBVc2VkIHRvIHN0b3JlIHRoZSBEVkIgYW5jaWxsYXJ5IGRhdGEgcGF5bG9hZCBwb3NpdGlvbiBpbiB0aGUgYml0c3RyZWFtIChvbmx5IG9uZSBwZXIgZnJhbWUpICovCi0gIFVJTlQgICBkcmNQYXlsb2FkUG9zaXRpb25bTUFYX0RSQ19USFJFQURTXTsgIC8qIFVzZWQgdG8gc3RvcmUgdGhlIERSQyBwYXlsb2FkIHBvc2l0aW9ucyBpbiB0aGUgYml0c3RyZWFtICovCisgIFNDSEFSIHByZXNNb2RlOyAvKiBQcmVzZW50YXRpb24gbW9kZSBhcyBkZWZpbmVkIGluIEVUU0kgVFMgMTAxIDE1NCAqLworICBVQ0hBUiBkdmJBbmNEYXRhQXZhaWxhYmxlOyAvKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgRFZCIGFuY2lsbGFyeSBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHByZXNlbnQgb3Igbm90ICovCisgIFVJTlQgZHZiQW5jRGF0YVBvc2l0aW9uOyAgIC8qIFVzZWQgdG8gc3RvcmUgdGhlIERWQiBhbmNpbGxhcnkgZGF0YSBwYXlsb2FkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBiaXRzdHJlYW0gKG9ubHkgb25lIHBlciBmcmFtZSkgKi8KKyAgVUlOVCBkcmNQYXlsb2FkUG9zaXRpb25bTUFYX0RSQ19USFJFQURTXTsgLyogVXNlZCB0byBzdG9yZSB0aGUgRFJDIHBheWxvYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25zIGluIHRoZSBiaXRzdHJlYW0gKi8KKworICBVQ0hBUgorICB1bmlEcmNQcmVjZWRlbmNlOyAvKiBGbGFnIGZvciBzaWduYWxsaW5nIHRoYXQgdW5pRHJjIGlzIGFjdGl2ZSBhbmQgdGFrZXMKKyAgICAgICAgICAgICAgICAgICAgICAgcHJlY2VkZW5jZSBvdmVyIGxlZ2FjeSBEUkMgKi8KIAogfSBDRHJjSW5mbzsKIAogdHlwZWRlZiBDRHJjSW5mbyAqSEFORExFX0FBQ19EUkM7CiAKICNlbmRpZiAvKiBBQUNERUNfRFJDX1RZUEVTX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyLmNwcCBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjci5jcHAKaW5kZXggZTMxNGUyNy4uODRlMDViMCAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3IuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDExICs5MCwxMiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBSb2JlcnQgV2VpZG5lciAoRFNQIFNvbHV0aW9ucykKKwogICAgRGVzY3JpcHRpb246IEhDUiBEZWNvZGVyOiBIQ1IgaW5pdGlhbGl6YXRpb24sIHByZXByb2Nlc3MgSENSIHNpZGVpbmZvLAogICAgICAgICAgICAgICAgIGRlY29kZSBwcmlvcml0eSBjb2Rld29yZHMgKFBDV3MpCiAKQEAgLTkxLDggKzEwMyw2IEBACiAKICNpbmNsdWRlICJhYWNkZWNfaGNyLmgiCiAKLQotCiAjaW5jbHVkZSAiYWFjZGVjX2hjcl90eXBlcy5oIgogI2luY2x1ZGUgImFhY2RlY19oY3JfYml0LmgiCiAjaW5jbHVkZSAiYWFjZGVjX2hjcnMuaCIKQEAgLTEwMSwyNjMgKzExMSwyNDcgQEAKICNpbmNsdWRlICJjaGFubmVsLmgiCiAjaW5jbHVkZSAiYmxvY2suaCIKIAotI2luY2x1ZGUgImFhY2RlY29kZXIuaCIgICAgIC8qIGZvciBJRF9DUEUsIElEX1NDRSAuLi4gKi8KKyNpbmNsdWRlICJhYWNkZWNvZGVyLmgiIC8qIGZvciBJRF9DUEUsIElEX1NDRSAuLi4gKi8KICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAKIGV4dGVybiBpbnQgbWxGaWxlQ2hDdXJyOwogCi1zdGF0aWMgdm9pZCBlcnJEZXRlY3RvckluSGNyU2lkZWluZm9TaHJ0KFNDSEFSIGNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCBudW1MaW5lLAorc3RhdGljIHZvaWQgZXJyRGV0ZWN0b3JJbkhjclNpZGVpbmZvU2hydChTQ0hBUiBjYiwgU0hPUlQgbnVtTGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqZXJyb3JXb3JkKTsKIAotc3RhdGljIHZvaWQgZXJyRGV0ZWN0b3JJbkhjckxlbmd0aHMoU0NIQVIgIGxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgIGxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgKmVycm9yV29yZCk7CitzdGF0aWMgdm9pZCBlcnJEZXRlY3RvckluSGNyTGVuZ3RocyhTQ0hBUiBsZW5ndGhPZkxvbmdlc3RDb2Rld29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUIGxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqZXJyb3JXb3JkKTsKIAotc3RhdGljIHZvaWQgSGNyQ2FsY051bUNvZGV3b3JkICAgICAgICAgICAgICAgICAgICAoSF9IQ1JfSU5GTyBwSGNyKTsKK3N0YXRpYyB2b2lkIEhjckNhbGNOdW1Db2Rld29yZChIX0hDUl9JTkZPIHBIY3IpOwogc3RhdGljIHZvaWQgSGNyU29ydENvZGVib29rQW5kTnVtQ29kZXdvcmRJblNlY3Rpb24oSF9IQ1JfSU5GTyBwSGNyKTsKLXN0YXRpYyB2b2lkIEhjclByZXBhcmVTZWdtZW50YXRpb25HcmlkICAgICAgICAgICAgKEhfSENSX0lORk8gcEhjcik7Ci1zdGF0aWMgdm9pZCBIY3JFeHRlbmRlZFNlY3Rpb25JbmZvICAgICAgICAgICAgICAgIChIX0hDUl9JTkZPIHBIY3IpOworc3RhdGljIHZvaWQgSGNyUHJlcGFyZVNlZ21lbnRhdGlvbkdyaWQoSF9IQ1JfSU5GTyBwSGNyKTsKK3N0YXRpYyB2b2lkIEhjckV4dGVuZGVkU2VjdGlvbkluZm8oSF9IQ1JfSU5GTyBwSGNyKTsKIAotc3RhdGljIHZvaWQgRGVyaXZlTnVtYmVyT2ZFeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzKFVJTlQgICBudW1TZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgKnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgIG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICAqcE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeCk7CitzdGF0aWMgdm9pZCBEZXJpdmVOdW1iZXJPZkV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHMoCisgICAgVUlOVCBudW1TZWdtZW50LCBVU0hPUlQgKnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uLAorICAgIGludCBudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4LAorICAgIFVTSE9SVCAqcE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHMsCisgICAgaW50IG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHgpOwogCi1zdGF0aWMgSU5UICBEZWNvZGVFc2NhcGVTZXF1ZW5jZShIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjQ29lZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICpwTGVmdFN0YXJ0T2ZTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgKnBOdW1EZWNvZGVkQml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworc3RhdGljIElOVCBEZWNvZGVFc2NhcGVTZXF1ZW5jZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgSU5UIHF1YW50U3BlY0NvZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcExlZnRTdGFydE9mU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBOdW1EZWNvZGVkQml0cyk7CiAKLXN0YXRpYyBpbnQgRGVjb2RlUENXX1NpZ24oSEFORExFX0ZES19CSVRTVFJFQU0gIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgY29kZWJvb2tEaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDSEFSICAgICAgICAgICpwUXVhbnRWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICpwUXVhbnRTcGVjQ29lZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgKnF1YW50U3BlY0NvZWZJZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICpwTGVmdFN0YXJ0T2ZTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICpwTnVtRGVjb2RlZEJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICApOworc3RhdGljIGludCBEZWNvZGVQQ1dfU2lnbihIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgVUlOVCBjb2RlYm9va0RpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NIQVIgKnBRdWFudFZhbCwgRklYUF9EQkwgKnBRdWFudFNwZWNDb2VmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnF1YW50U3BlY0NvZWZJZHgsIElOVCAqcExlZnRTdGFydE9mU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LCBpbnQgKnBOdW1EZWNvZGVkQml0cyk7CiAKLXN0YXRpYyBjb25zdCBTQ0hBUiAqRGVjb2RlUENXX0JvZHkoSEFORExFX0ZES19CSVRTVFJFQU0gIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAqcEN1cnJlbnRUcmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0hBUiAgICAgICAgICAqcFF1YW50VmFsQmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgKnBOdW1EZWNvZGVkQml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CitzdGF0aWMgY29uc3QgU0NIQVIgKkRlY29kZVBDV19Cb2R5KEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICpwQ3VycmVudFRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDSEFSICpwUXVhbnRWYWxCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnBMZWZ0U3RhcnRPZlNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICpwUmVtYWluaW5nQml0c0luU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwTnVtRGVjb2RlZEJpdHMpOwogCiBzdGF0aWMgdm9pZCBEZWNvZGVQQ1dzKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBIX0hDUl9JTkZPIHBIY3IpOwogCiBzdGF0aWMgdm9pZCBIY3JSZW9yZGVyUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMoCi0gICAgICAgIEhfSENSX0lORk8gcEhjciwKLSAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8KLSAgICAgICAgKTsKKyAgICBIX0hDUl9JTkZPIHBIY3IsIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8pOwogCitzdGF0aWMgVUNIQVIgZXJyRGV0ZWN0UGN3U2VnbWVudGF0aW9uKFNDSEFSIHJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhfSENSX0lORk8gcEhjciwgUENXX1RZUEUga2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnFzY19iYXNlX29mX2N3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBkaW1lbnNpb24pOwogCi0jaWYgQ0hFQ0tfU0VHTUVOVEFUSU9OX0lNTUVESUFURUxZCi1zdGF0aWMgVUNIQVIgZXJyRGV0ZWN0UGN3U2VnbWVudGF0aW9uKFNDSEFSICAgICAgIHJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhfSENSX0lORk8gIHBIY3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDV19UWVBFICAgIGtpbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKnFzY19iYXNlX29mX2N3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICBkaW1lbnNpb24pOwotI2VuZGlmCi0KLSNpZiBDSEVDS19TRUdNRU5UQVRJT05fRklOQUwKIHN0YXRpYyB2b2lkIGVyckRldGVjdFdpdGhpblNlZ21lbnRhdGlvbkZpbmFsKEhfSENSX0lORk8gcEhjcik7Ci0jZW5kaWYKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246ICAgQ2hlY2sgaWYgY29kZWJvb2sgYW5kIG51bVNlY3QgYXJlIHdpdGhpbiBhbGxvd2VkIHJhbmdlIChzaG9ydCBvbmx5KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGVyckRldGVjdG9ySW5IY3JTaWRlaW5mb1NocnQoU0NIQVIgY2IsIFNIT1JUIG51bUxpbmUsVUlOVCogZXJyb3JXb3JkKQotewotCi0KLQotICBpZiAoIGNiIDwgWkVST19IQ0IgfHwgY2IgPj0gTUFYX0NCX0NIRUNLIHx8IGNiID09IEJPT0tTQ0wgKSB7CisgICAgIGRlc2NyaXB0aW9uOiAgIENoZWNrIGlmIGNvZGVib29rIGFuZCBudW1TZWN0IGFyZSB3aXRoaW4gYWxsb3dlZCByYW5nZQorKHNob3J0IG9ubHkpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyB2b2lkIGVyckRldGVjdG9ySW5IY3JTaWRlaW5mb1NocnQoU0NIQVIgY2IsIFNIT1JUIG51bUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKmVycm9yV29yZCkgeworICBpZiAoY2IgPCBaRVJPX0hDQiB8fCBjYiA+PSBNQVhfQ0JfQ0hFQ0sgfHwgY2IgPT0gQk9PS1NDTCkgewogICAgICplcnJvcldvcmQgfD0gQ0JfT1VUX09GX1JBTkdFX1NIT1JUX0JMT0NLOwogICB9Ci0gIGlmICggbnVtTGluZSA8IDAgfHwgbnVtTGluZSA+IDEwMjQgKSB7CisgIGlmIChudW1MaW5lIDwgMCB8fCBudW1MaW5lID4gMTAyNCkgewogICAgICplcnJvcldvcmQgfD0gTElORV9JTl9TRUNUX09VVF9PRl9SQU5HRV9TSE9SVF9CTE9DSzsKICAgfQogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBkZXNjcmlwdGlvbjogICBDaGVjayBib3RoIEhDUiBsZW5ndGhzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgZXJyRGV0ZWN0b3JJbkhjckxlbmd0aHMoU0NIQVIgIGxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgIGxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgKmVycm9yV29yZCkKLXsKLSAgaWYgKCBsZW5ndGhPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA8IGxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkICkgeworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgdm9pZCBlcnJEZXRlY3RvckluSGNyTGVuZ3RocyhTQ0hBUiBsZW5ndGhPZkxvbmdlc3RDb2Rld29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUIGxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqZXJyb3JXb3JkKSB7CisgIGlmIChsZW5ndGhPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA8IGxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkKSB7CiAgICAgKmVycm9yV29yZCB8PSBIQ1JfU0lfTEVOR1RIU19GQUlMVVJFOwogICB9CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGRlc2NyaXB0aW9uOiAgIERlY29kZSAoYW5kIGFkYXB0IGlmIG5lY2Vzc2FyeSkgdGhlIHR3byBIQ1Igc2lkZWluZm8gY29tcG9uZW50czoKLSAgICAgICAgICAgICAgICAgICAgJ3Jlb3JkZXJlZF9zcGVjdHJhbF9kYXRhX2xlbmd0aCcgYW5kICdsb25nZXN0X2NvZGV3b3JkX2xlbmd0aCcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgIGRlc2NyaXB0aW9uOiAgIERlY29kZSAoYW5kIGFkYXB0IGlmIG5lY2Vzc2FyeSkgdGhlIHR3byBIQ1Igc2lkZWluZm8KK2NvbXBvbmVudHM6ICdyZW9yZGVyZWRfc3BlY3RyYWxfZGF0YV9sZW5ndGgnIGFuZCAnbG9uZ2VzdF9jb2Rld29yZF9sZW5ndGgnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KIAotdm9pZCBDSGNyX1JlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gICAgYnMsCi0gICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKQotewotICBJTlQgICAgZ2xvYmFsSGNyVHlwZSA9IGdldEhjclR5cGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5lckhjckluZm8pOwotICBTSE9SVCAgbGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhOwotICBTQ0hBUiAgbGVuZ09mTG9uZ2VzdENvZGV3b3JkOwordm9pZCBDSGNyX1JlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgZ2xvYmFsSGNyVHlwZSkgeworICBTSE9SVCBsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGE7CisgIFNDSEFSIGxlbmdPZkxvbmdlc3RDb2Rld29yZDsKIAotICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPSAwOwotICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZMb25nZXN0Q29kZXdvcmQgICAgICAgPSAwOworICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPQorICAgICAgMDsKKyAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mTG9uZ2VzdENvZGV3b3JkID0gMDsKIAotCi0KLSAgICAvKiAtLS0tLS0tIFNJLVZhbHVlIE5vIDEgLS0tLS0tLSAqLwotICAgIGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA9IEZES3JlYWRCaXRzKGJzLDE0KSArIEVSUk9SX0xPUlNEOwotICAgIGlmICggZ2xvYmFsSGNyVHlwZSA9PSBJRF9DUEUgKSB7Ci0gICAgICBpZiAoKGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA+PSAwKSAmJiAobGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhIDw9IENQRV9UT1BfTEVOR1RIKSkgewotICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPSBsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGE7IC8qIHRoZSBkZWNvZGVkIHZhbHVlIGlzIHdpdGhpbiByYW5nZSAqLwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGlmIChsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPiBDUEVfVE9QX0xFTkdUSCkgewotICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5sZW5PZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA9IENQRV9UT1BfTEVOR1RIOyAgICAgICAgICAgIC8qIHVzZSB2YWxpZCBtYXhpbXVtICovCi0gICAgICAgIH0KKyAgLyogLS0tLS0tLSBTSS1WYWx1ZSBObyAxIC0tLS0tLS0gKi8KKyAgbGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID0gRkRLcmVhZEJpdHMoYnMsIDE0KSArIEVSUk9SX0xPUlNEOworICBpZiAoZ2xvYmFsSGNyVHlwZSA9PSBJRF9DUEUpIHsKKyAgICBpZiAoKGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA+PSAwKSAmJgorICAgICAgICAobGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhIDw9IENQRV9UT1BfTEVOR1RIKSkgeworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjCisgICAgICAgICAgLmxlbk9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID0KKyAgICAgICAgICBsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGE7IC8qIHRoZSBkZWNvZGVkIHZhbHVlIGlzIHdpdGhpbiByYW5nZSAqLworICAgIH0gZWxzZSB7CisgICAgICBpZiAobGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID4gQ1BFX1RPUF9MRU5HVEgpIHsKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjCisgICAgICAgICAgICAubGVuT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPQorICAgICAgICAgICAgQ1BFX1RPUF9MRU5HVEg7IC8qIHVzZSB2YWxpZCBtYXhpbXVtICovCiAgICAgICB9CiAgICAgfQotICAgIGVsc2UgaWYgKGdsb2JhbEhjclR5cGUgPT0gSURfU0NFIHx8IGdsb2JhbEhjclR5cGUgPT0gSURfTEZFIHx8IGdsb2JhbEhjclR5cGUgPT0gSURfQ0NFICkgewotICAgICAgaWYgKChsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPj0gMCkgJiYgKGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA8PSBTQ0VfVE9QX0xFTkdUSCkpIHsKLSAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID0gbGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhOyAvKiB0aGUgZGVjb2RlZCB2YWx1ZSBpcyB3aXRoaW4gcmFuZ2UgKi8KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpZiAobGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID4gU0NFX1RPUF9MRU5HVEgpIHsKLSAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPSBTQ0VfVE9QX0xFTkdUSDsgICAgICAgICAgICAvKiB1c2UgdmFsaWQgbWF4aW11bSAqLwotICAgICAgICB9CisgIH0gZWxzZSBpZiAoZ2xvYmFsSGNyVHlwZSA9PSBJRF9TQ0UgfHwgZ2xvYmFsSGNyVHlwZSA9PSBJRF9MRkUgfHwKKyAgICAgICAgICAgICBnbG9iYWxIY3JUeXBlID09IElEX0NDRSkgeworICAgIGlmICgobGVuZ09mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID49IDApICYmCisgICAgICAgIChsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPD0gU0NFX1RPUF9MRU5HVEgpKSB7CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMKKyAgICAgICAgICAubGVuT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPQorICAgICAgICAgIGxlbmdPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YTsgLyogdGhlIGRlY29kZWQgdmFsdWUgaXMgd2l0aGluIHJhbmdlICovCisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChsZW5nT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgPiBTQ0VfVE9QX0xFTkdUSCkgeworICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMKKyAgICAgICAgICAgIC5sZW5PZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA9CisgICAgICAgICAgICBTQ0VfVE9QX0xFTkdUSDsgLyogdXNlIHZhbGlkIG1heGltdW0gKi8KICAgICAgIH0KICAgICB9CisgIH0KIAotICAgIC8qIC0tLS0tLS0gU0ktVmFsdWUgTm8gMiAtLS0tLS0tICovCi0gICAgbGVuZ09mTG9uZ2VzdENvZGV3b3JkID0gRkRLcmVhZEJpdHMoYnMsNikgKyBFUlJPUl9MT0xDOwotICAgIGlmICgobGVuZ09mTG9uZ2VzdENvZGV3b3JkID49IDApICYmIChsZW5nT2ZMb25nZXN0Q29kZXdvcmQgPD0gTEVOX09GX0xPTkdFU1RfQ1dfVE9QX0xFTkdUSCkpIHsKLSAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5sZW5PZkxvbmdlc3RDb2Rld29yZCA9IGxlbmdPZkxvbmdlc3RDb2Rld29yZDsgICAgICAgICAgICAgICAgLyogdGhlIGRlY29kZWQgdmFsdWUgaXMgd2l0aGluIHJhbmdlICovCisgIC8qIC0tLS0tLS0gU0ktVmFsdWUgTm8gMiAtLS0tLS0tICovCisgIGxlbmdPZkxvbmdlc3RDb2Rld29yZCA9IEZES3JlYWRCaXRzKGJzLCA2KSArIEVSUk9SX0xPTEM7CisgIGlmICgobGVuZ09mTG9uZ2VzdENvZGV3b3JkID49IDApICYmCisgICAgICAobGVuZ09mTG9uZ2VzdENvZGV3b3JkIDw9IExFTl9PRl9MT05HRVNUX0NXX1RPUF9MRU5HVEgpKSB7CisgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mTG9uZ2VzdENvZGV3b3JkID0KKyAgICAgICAgbGVuZ09mTG9uZ2VzdENvZGV3b3JkOyAvKiB0aGUgZGVjb2RlZCB2YWx1ZSBpcyB3aXRoaW4gcmFuZ2UgKi8KKyAgfSBlbHNlIHsKKyAgICBpZiAobGVuZ09mTG9uZ2VzdENvZGV3b3JkID4gTEVOX09GX0xPTkdFU1RfQ1dfVE9QX0xFTkdUSCkgeworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mTG9uZ2VzdENvZGV3b3JkID0KKyAgICAgICAgICBMRU5fT0ZfTE9OR0VTVF9DV19UT1BfTEVOR1RIOyAvKiB1c2UgdmFsaWQgbWF4aW11bSAqLwogICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGlmIChsZW5nT2ZMb25nZXN0Q29kZXdvcmQgPiBMRU5fT0ZfTE9OR0VTVF9DV19UT1BfTEVOR1RIKSB7Ci0gICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5sZW5PZkxvbmdlc3RDb2Rld29yZCA9IExFTl9PRl9MT05HRVNUX0NXX1RPUF9MRU5HVEg7ICAgICAgIC8qIHVzZSB2YWxpZCBtYXhpbXVtICovCi0gICAgICB9Ci0gICAgfQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGRlc2NyaXB0aW9uOiAgIFNldHMgdXAgSENSIFJPTS1UYWJsZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXZvaWQgSGNySW5pdFJvbShIX0hDUl9JTkZPIHBIY3IpCi17Ci0gIHBIY3ItPmNiUGFpcnMucE1pbk9mQ2JQYWlyICAgICA9IGFNaW5PZkNiUGFpcjsKLSAgcEhjci0+Y2JQYWlycy5wTWF4T2ZDYlBhaXIgICAgID0gYU1heE9mQ2JQYWlyOwotCi0gIHBIY3ItPnRhYmxlSW5mby5wTWF4Q3dMZW5ndGggICA9IGFNYXhDd0xlbjsKLSAgcEhjci0+dGFibGVJbmZvLnBDYkRpbWVuc2lvbiAgID0gYURpbUNiOwotICBwSGNyLT50YWJsZUluZm8ucENiRGltU2hpZnQgICAgPSBhRGltQ2JTaGlmdDsKLSAgcEhjci0+dGFibGVJbmZvLnBDYlNpZ24gICAgICAgID0gYVNpZ25DYjsKLSAgcEhjci0+dGFibGVJbmZvLnBDYlByaW9yaXR5ICAgID0gYUNiUHJpb3JpdHk7Ci0gIHBIY3ItPnRhYmxlSW5mby5wTGFyZ2VzdEFic1ZhbCA9IGFMYXJnZXN0QWJzb2x1dGVWYWx1ZTsKKyAgfQogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBkZXNjcmlwdGlvbjogICBTZXQgdXAgSENSIC0gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGV2ZXJ5IGNhbGwgdG8gSGNyRGVjb2RlcigpLgotICAgICAgICAgICAgICAgICAgICBGb3Igc2hvcnQgYmxvY2sgYSBzb3J0aW5nIGFsZ29yaXRobSBpcyBhcHBsaWVkIHRvIGdldCB0aGUgU0kgaW4gdGhlIG9yZGVyCi0gICAgICAgICAgICAgICAgICAgIHRoYXQgSENSIGNvdWxkIGFzc2VtYmxlIHRoZSBxc2MncyBhcyBpZiBpdCBpcyBhIGxvbmcgYmxvY2suCisgICAgIGRlc2NyaXB0aW9uOiAgIFNldCB1cCBIQ1IgLSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZXZlcnkgY2FsbCB0bworSGNyRGVjb2RlcigpLiBGb3Igc2hvcnQgYmxvY2sgYSBzb3J0aW5nIGFsZ29yaXRobSBpcyBhcHBsaWVkIHRvIGdldCB0aGUgU0kgaW4KK3RoZSBvcmRlciB0aGF0IEhDUiBjb3VsZCBhc3NlbWJsZSB0aGUgcXNjJ3MgYXMgaWYgaXQgaXMgYSBsb25nIGJsb2NrLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgcmV0dXJuOiAgICAgZXJyb3IgbG9nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLVVJTlQgSGNySW5pdChIX0hDUl9JTkZPICAgICAgICAgICAgICBwSGNyLAotICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCitVSU5UIEhjckluaXQoSF9IQ1JfSU5GTyBwSGNyLCBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAogICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgIGJzKQoteworICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzKSB7CiAgIENJY3NJbmZvICpwSWNzSW5mbyA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvOwogICBTSE9SVCAqcE51bUxpbmVzSW5TZWM7CiAgIFVDSEFSICpwQ29kZUJrOwotICBTSE9SVCAgbnVtU2VjdGlvbjsKLSAgU0NIQVIgIGNiOwotICBpbnQgIG51bUxpbmU7Ci0gIGludCAgaTsKKyAgU0hPUlQgbnVtU2VjdGlvbjsKKyAgU0NIQVIgY2I7CisgIGludCBudW1MaW5lOworICBpbnQgaTsKIAotICBwSGNyLT5kZWNJbk91dC5sZW5ndGhPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhOwotICBwSGNyLT5kZWNJbk91dC5sZW5ndGhPZkxvbmdlc3RDb2Rld29yZCAgICAgICAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mTG9uZ2VzdENvZGV3b3JkOwotICBwSGNyLT5kZWNJbk91dC5wUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQ7Ci0gIHBIY3ItPmRlY0luT3V0LnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ICAgPSAwOwotICBwSGNyLT5kZWNJbk91dC5wQ29kZWJvb2sgICAgICAgICAgICAgICAgICAgICAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmFDb2RlQm9va3M0SGNyOwotICBwSGNyLT5kZWNJbk91dC5wTnVtTGluZUluU2VjdCAgICAgICAgICAgICAgICAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmFOdW1MaW5lSW5TZWM0SGNyOwotICBwSGNyLT5kZWNJbk91dC5udW1TZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLm51bWJlclNlY3Rpb247CisgIHBIY3ItPmRlY0luT3V0Lmxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID0KKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYworICAgICAgICAgIC5sZW5PZlJlb3JkZXJlZFNwZWN0cmFsRGF0YTsKKyAgcEhjci0+ZGVjSW5PdXQubGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQgPQorICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmxlbk9mTG9uZ2VzdENvZGV3b3JkOworICBwSGNyLT5kZWNJbk91dC5wUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlID0KKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50OworICBwSGNyLT5kZWNJbk91dC5xdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCA9IDA7CisgIHBIY3ItPmRlY0luT3V0LnBDb2RlYm9vayA9CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMuYUNvZGVCb29rczRIY3I7CisgIHBIY3ItPmRlY0luT3V0LnBOdW1MaW5lSW5TZWN0ID0KKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5hTnVtTGluZUluU2VjNEhjcjsKKyAgcEhjci0+ZGVjSW5PdXQubnVtU2VjdGlvbiA9CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubnVtYmVyU2VjdGlvbjsKICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgPSAwOwotICBwSGNyLT5ub25QY3dTaWRlaW5mby5wUmVzdWx0QmFzZSAgICAgICAgICAgICAgICAgID0gU1BFQ19MT05HKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50KTsKKyAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFJlc3VsdEJhc2UgPQorICAgICAgU1BFQ19MT05HKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50KTsKIAogICBGREtzeW5jQ2FjaGUoYnMpOwotICBwSGNyLT5kZWNJbk91dC5iaXRzdHJlYW1JbmRleCAgICAgICAgICAgICAgICAgICAgID0gRkRLZ2V0Qml0Q250KGJzKTsKKyAgcEhjci0+ZGVjSW5PdXQuYml0c3RyZWFtSW5kZXggPSBGREtnZXRCaXRDbnQoYnMpOwogCi0gIGlmICghSXNMb25nQmxvY2soJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pKSAgIC8qIHNob3J0IGJsb2NrICovCisgIGlmICghSXNMb25nQmxvY2soJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pKSAvKiBzaG9ydCBibG9jayAqLwogICB7Ci0gICAgU0hPUlQgIGJhbmQ7Ci0gICAgU0hPUlQgIG1heEJhbmQ7Ci0gICAgU0NIQVIgIGdyb3VwOwotICAgIFNDSEFSICB3aW5Hcm91cExlbjsKLSAgICBTQ0hBUiAgd2luZG93OwotICAgIFNDSEFSICBudW1Vbml0SW5CYW5kOwotICAgIFNDSEFSICBjbnRVbml0SW5CYW5kOwotICAgIFNDSEFSICBncm91cFdpbjsKLSAgICBTQ0hBUiAgY2JfcHJldjsKKyAgICBTSE9SVCBiYW5kOworICAgIFNIT1JUIG1heEJhbmQ7CisgICAgU0NIQVIgZ3JvdXA7CisgICAgU0NIQVIgd2luR3JvdXBMZW47CisgICAgU0NIQVIgd2luZG93OworICAgIFNDSEFSIG51bVVuaXRJbkJhbmQ7CisgICAgU0NIQVIgY250VW5pdEluQmFuZDsKKyAgICBTQ0hBUiBncm91cFdpbjsKKyAgICBTQ0hBUiBjYl9wcmV2OwogCiAgICAgVUNIQVIgKnBDb2RlQm9vazsKICAgICBjb25zdCBTSE9SVCAqQmFuZE9mZnNldHM7Ci0gICAgU0NIQVIgIG51bU9mR3JvdXBzOworICAgIFNDSEFSIG51bU9mR3JvdXBzOwogCi0KLSAgICBwQ29kZUJvb2sgICAgICA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2s7ICAgICAgICAgICAgIC8qIGluICovCi0gICAgcE51bUxpbmVzSW5TZWMgPSBwSGNyLT5kZWNJbk91dC5wTnVtTGluZUluU2VjdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0ICovCi0gICAgcENvZGVCayAgICAgICAgPSBwSGNyLT5kZWNJbk91dC5wQ29kZWJvb2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0ICovCi0gICAgQmFuZE9mZnNldHMgICAgPSBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKHBJY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbyk7IC8qIGF1eCAqLwotICAgIG51bU9mR3JvdXBzICAgID0gR2V0V2luZG93R3JvdXBzKHBJY3NJbmZvKTsKKyAgICBwQ29kZUJvb2sgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rOyAvKiBpbiAqLworICAgIHBOdW1MaW5lc0luU2VjID0gcEhjci0+ZGVjSW5PdXQucE51bUxpbmVJblNlY3Q7ICAgICAgICAgIC8qIG91dCAqLworICAgIHBDb2RlQmsgPSBwSGNyLT5kZWNJbk91dC5wQ29kZWJvb2s7ICAgICAgICAgICAgICAgICAgICAgIC8qIG91dCAqLworICAgIEJhbmRPZmZzZXRzID0KKyAgICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cyhwSWNzSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8pOyAvKiBhdXggKi8KKyAgICBudW1PZkdyb3VwcyA9IEdldFdpbmRvd0dyb3VwcyhwSWNzSW5mbyk7CiAKICAgICBudW1MaW5lID0gMDsKICAgICBudW1TZWN0aW9uID0gMDsKLSAgICBjYiAgICAgID0gcENvZGVCb29rWzBdOworICAgIGNiID0gcENvZGVCb29rWzBdOwogICAgIGNiX3ByZXYgPSBwQ29kZUJvb2tbMF07CiAKLSAgICAvKiBjb252ZXJ0IEhDUi1zaWRlaW5mbyBpbnRvIGEgdW5pdHdpc2UgbWFubmVyOiBXaGVuIHRoZSBjYiBjaGFuZ2VzLCBhIG5ldyBzZWN0aW9uIHN0YXJ0cyAqLworICAgIC8qIGNvbnZlcnQgSENSLXNpZGVpbmZvIGludG8gYSB1bml0d2lzZSBtYW5uZXI6IFdoZW4gdGhlIGNiIGNoYW5nZXMsIGEgbmV3CisgICAgICogc2VjdGlvbiBzdGFydHMgKi8KIAogICAgICpwQ29kZUJrKysgPSBjYl9wcmV2OwogCiAgICAgbWF4QmFuZCA9IEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7Ci0gICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG1heEJhbmQ7IGJhbmQrKykgeyAgLyogZnJvbSBsb3cgdG8gaGlnaCBzZmJzIGkuZS4gZnJvbSBsb3cgdG8gaGlnaCBmcmVxdWVuY2llcyAgKi8KLSAgICAgIG51bVVuaXRJbkJhbmQgPSAoKEJhbmRPZmZzZXRzW2JhbmQrMV0gLSBCYW5kT2Zmc2V0c1tiYW5kXSkgPj4gRk9VUl9MT0dfRElWX1RXT19MT0cpOyAvKiBnZXQgdGhlIG51bWJlciBvZiB1bml0cyBpbiBjdXJyZW50IHNmYiAqLwotICAgICAgZm9yIChjbnRVbml0SW5CYW5kID0gbnVtVW5pdEluQmFuZDsgIGNudFVuaXRJbkJhbmQgIT0gMDsgY250VW5pdEluQmFuZC0tICkgeyAvKiBmb3IgZXZlcnkgdW5pdCBpbiB0aGUgYmFuZCAqLworICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBtYXhCYW5kOworICAgICAgICAgYmFuZCsrKSB7IC8qIGZyb20gbG93IHRvIGhpZ2ggc2ZicyBpLmUuIGZyb20gbG93IHRvIGhpZ2ggZnJlcXVlbmNpZXMgKi8KKyAgICAgIG51bVVuaXRJbkJhbmQgPQorICAgICAgICAgICgoQmFuZE9mZnNldHNbYmFuZCArIDFdIC0gQmFuZE9mZnNldHNbYmFuZF0pID4+CisgICAgICAgICAgIEZPVVJfTE9HX0RJVl9UV09fTE9HKTsgLyogZ2V0IHRoZSBudW1iZXIgb2YgdW5pdHMgaW4gY3VycmVudCBzZmIgKi8KKyAgICAgIGZvciAoY250VW5pdEluQmFuZCA9IG51bVVuaXRJbkJhbmQ7IGNudFVuaXRJbkJhbmQgIT0gMDsKKyAgICAgICAgICAgY250VW5pdEluQmFuZC0tKSB7IC8qIGZvciBldmVyeSB1bml0IGluIHRoZSBiYW5kICovCiAgICAgICAgIGZvciAod2luZG93ID0gMCwgZ3JvdXAgPSAwOyBncm91cCA8IG51bU9mR3JvdXBzOyBncm91cCsrKSB7Ci0gICAgICAgICAgd2luR3JvdXBMZW4gPSBHZXRXaW5kb3dHcm91cExlbmd0aCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyxncm91cCk7CisgICAgICAgICAgd2luR3JvdXBMZW4gPSAoU0NIQVIpR2V0V2luZG93R3JvdXBMZW5ndGgoCisgICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLCBncm91cCk7CiAgICAgICAgICAgZm9yIChncm91cFdpbiA9IHdpbkdyb3VwTGVuOyBncm91cFdpbiAhPSAwOyBncm91cFdpbi0tLCB3aW5kb3crKykgewogICAgICAgICAgICAgY2IgPSBwQ29kZUJvb2tbZ3JvdXAgKiAxNiArIGJhbmRdOwogICAgICAgICAgICAgaWYgKGNiICE9IGNiX3ByZXYpIHsKLSNpZiBDSEVDS19WQUxJRF9IQ1JfSU5QVVQgLyogc2hvcnQtYmxvY2sgIDEgb2YgMiAqLwotICAgICAgICAgICAgICBlcnJEZXRlY3RvckluSGNyU2lkZWluZm9TaHJ0KGNiLG51bUxpbmUsJnBIY3ItPmRlY0luT3V0LmVycm9yTG9nICk7Ci0gICAgICAgICAgICAgIGlmIChwSGNyLT5kZWNJbk91dC5lcnJvckxvZyAhPSAwICkgewotICAgICAgICAgICAgICAgIHJldHVybiAoIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICk7CisgICAgICAgICAgICAgIGVyckRldGVjdG9ySW5IY3JTaWRlaW5mb1NocnQoY2IsIG51bUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBIY3ItPmRlY0luT3V0LmVycm9yTG9nKTsKKyAgICAgICAgICAgICAgaWYgKHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHBIY3ItPmRlY0luT3V0LmVycm9yTG9nKTsKICAgICAgICAgICAgICAgfQotI2VuZGlmCiAgICAgICAgICAgICAgICpwQ29kZUJrKysgPSBjYjsKICAgICAgICAgICAgICAgKnBOdW1MaW5lc0luU2VjKysgPSBudW1MaW5lOwogICAgICAgICAgICAgICBudW1TZWN0aW9uKys7CiAKICAgICAgICAgICAgICAgY2JfcHJldiA9IGNiOwogICAgICAgICAgICAgICBudW1MaW5lID0gTElORVNfUEVSX1VOSVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIG51bUxpbmUgKz0gTElORVNfUEVSX1VOSVQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQpAQCAtMzY3LDE4ICszNjEsMTYgQEAKIAogICAgIG51bVNlY3Rpb24rKzsKIAotI2lmIENIRUNLX1ZBTElEX0hDUl9JTlBVVCAvKiBzaG9ydC1ibG9jayAgMiBvZiAyICovCi0gICAgZXJyRGV0ZWN0b3JJbkhjclNpZGVpbmZvU2hydChjYixudW1MaW5lLCZwSGNyLT5kZWNJbk91dC5lcnJvckxvZyApOwotICAgIGlmICggbnVtU2VjdGlvbiA8PSAwIHx8IG51bVNlY3Rpb24gPiAxMDI0LzIgKSB7CisgICAgZXJyRGV0ZWN0b3JJbkhjclNpZGVpbmZvU2hydChjYiwgbnVtTGluZSwgJnBIY3ItPmRlY0luT3V0LmVycm9yTG9nKTsKKyAgICBpZiAobnVtU2VjdGlvbiA8PSAwIHx8IG51bVNlY3Rpb24gPiAxMDI0IC8gMikgewogICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gTlVNX1NFQ1RfT1VUX09GX1JBTkdFX1NIT1JUX0JMT0NLOwogICAgIH0KICAgICBlcnJEZXRlY3RvckluSGNyTGVuZ3RocyhwSGNyLT5kZWNJbk91dC5sZW5ndGhPZkxvbmdlc3RDb2Rld29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGNyLT5kZWNJbk91dC5sZW5ndGhPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSGNyLT5kZWNJbk91dC5lcnJvckxvZyk7Ci0gICAgaWYgKHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICE9IDAgKSB7Ci0gICAgICByZXR1cm4gKCBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSGNyLT5kZWNJbk91dC5lcnJvckxvZyk7CisgICAgaWYgKHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICE9IDApIHsKKyAgICAgIHJldHVybiAocEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cpOwogICAgIH0KLSNlbmRpZgogCiAgICAgKnBDb2RlQmsgPSBjYjsKICAgICAqcE51bUxpbmVzSW5TZWMgPSBudW1MaW5lOwpAQCAtMzg2LDQ2ICszNzgsNDAgQEAKIAogICB9IGVsc2UgLyogZW5kIHNob3J0IGJsb2NrIHByZXBhcmUgU0kgKi8KICAgeyAgICAgIC8qIGxvbmcgYmxvY2sgKi8KLSNpZiBDSEVDS19WQUxJRF9IQ1JfSU5QVVQgLyogbG9uZy1ibG9jayAgMSBvZiAxICovCiAgICAgZXJyRGV0ZWN0b3JJbkhjckxlbmd0aHMocEhjci0+ZGVjSW5PdXQubGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhjci0+ZGVjSW5PdXQubGVuZ3RoT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cpOwotICAgIG51bVNlY3Rpb24gICAgID0gcEhjci0+ZGVjSW5PdXQubnVtU2VjdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cpOworICAgIG51bVNlY3Rpb24gPSBwSGNyLT5kZWNJbk91dC5udW1TZWN0aW9uOwogICAgIHBOdW1MaW5lc0luU2VjID0gcEhjci0+ZGVjSW5PdXQucE51bUxpbmVJblNlY3Q7Ci0gICAgcENvZGVCayAgICAgICAgPSBwSGNyLT5kZWNJbk91dC5wQ29kZWJvb2s7Ci0gICAgaWYgKCBudW1TZWN0aW9uIDw9IDAgfHwgbnVtU2VjdGlvbiA+IDY0ICkgeworICAgIHBDb2RlQmsgPSBwSGNyLT5kZWNJbk91dC5wQ29kZWJvb2s7CisgICAgaWYgKG51bVNlY3Rpb24gPD0gMCB8fCBudW1TZWN0aW9uID4gNjQpIHsKICAgICAgIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nIHw9IE5VTV9TRUNUX09VVF9PRl9SQU5HRV9MT05HX0JMT0NLOwogICAgICAgbnVtU2VjdGlvbiA9IDA7CiAgICAgfQogCi0gICAgZm9yICggaSA9IG51bVNlY3Rpb247IGkgIT0gMDsgaS0tICkKLSAgICB7CisgICAgZm9yIChpID0gbnVtU2VjdGlvbjsgaSAhPSAwOyBpLS0pIHsKICAgICAgIGNiID0gKnBDb2RlQmsrKzsKIAotICAgICAgaWYgKCBjYiA8IFpFUk9fSENCIHx8IGNiID49IE1BWF9DQl9DSEVDSyB8fCBjYiA9PSBCT09LU0NMICkgeworICAgICAgaWYgKGNiIDwgWkVST19IQ0IgfHwgY2IgPj0gTUFYX0NCX0NIRUNLIHx8IGNiID09IEJPT0tTQ0wpIHsKICAgICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gQ0JfT1VUX09GX1JBTkdFX0xPTkdfQkxPQ0s7CiAgICAgICB9CiAKICAgICAgIG51bUxpbmUgPSAqcE51bUxpbmVzSW5TZWMrKzsKICAgICAgIC8qIEZES19BU1NFUlQobnVtTGluZSA+IDApOyAqLwogCi0gICAgICBpZiAoIChudW1MaW5lIDw9IDApIHx8IChudW1MaW5lID4gMTAyNCkgKSB7CisgICAgICBpZiAoKG51bUxpbmUgPD0gMCkgfHwgKG51bUxpbmUgPiAxMDI0KSkgewogICAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBMSU5FX0lOX1NFQ1RfT1VUX09GX1JBTkdFX0xPTkdfQkxPQ0s7CiAgICAgICB9CiAgICAgfQotICAgIGlmIChwSGNyLT5kZWNJbk91dC5lcnJvckxvZyAhPSAwICkgewotICAgICAgcmV0dXJuICggcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgKTsKKyAgICBpZiAocEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgIT0gMCkgeworICAgICAgcmV0dXJuIChwSGNyLT5kZWNJbk91dC5lcnJvckxvZyk7CiAgICAgfQotI2VuZGlmICAvKiBDSEVDS19WQUxJRF9IQ1JfSU5QVVQgKi8KICAgfQogCiAgIHBDb2RlQmsgPSBwSGNyLT5kZWNJbk91dC5wQ29kZWJvb2s7Ci0gIGZvciAoIGkgPSAwOyBpIDwgbnVtU2VjdGlvbjsgaSsrICkgewotICAgIGlmICgKLSAgICAgICAgICgqcENvZGVCayA9PSBOT0lTRV9IQ0IpICAgICAgfHwKLSAgICAgICAgICgqcENvZGVCayA9PSBJTlRFTlNJVFlfSENCMikgfHwKLSAgICAgICAgICgqcENvZGVCayA9PSBJTlRFTlNJVFlfSENCKSkKLSAgICB7CisgIGZvciAoaSA9IDA7IGkgPCBudW1TZWN0aW9uOyBpKyspIHsKKyAgICBpZiAoKCpwQ29kZUJrID09IE5PSVNFX0hDQikgfHwgKCpwQ29kZUJrID09IElOVEVOU0lUWV9IQ0IyKSB8fAorICAgICAgICAoKnBDb2RlQmsgPT0gSU5URU5TSVRZX0hDQikpIHsKICAgICAgICpwQ29kZUJrID0gMDsKICAgICB9CiAgICAgcENvZGVCaysrOwpAQCAtNDMzLDU0ICs0MTksMjQgQEAKIAogICAvKiBIQ1Itc2lkZWluZm8taW5wdXQgaXMgY29tcGxldGUgYW5kIHNlZW1zIHRvIGJlIHZhbGlkICovCiAKLQotCi0gIHJldHVybiAoIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICk7CisgIHJldHVybiAocEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cpOwogfQogCi0KLQotCi0jaWYgVVNFX0hDUl9EVU1NWQotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgdGhlIGNvZGV3b3JkcyBvZiB0aGUgc3BlY3RyYWwKK2NvZWZmaWNpZW50cyBmcm9tIHRoZSBiaXRzdHJlYW0gYWNjb3JkaW5nIHRvIHRoZSBIQ1IgYWxnb3JpdGhtIGFuZCBzdG9yZXMgdGhlCitxdWFudGl6ZWQgc3BlY3RyYWwgY29lZmZpY2llbnRzIGluIGNvcnJlY3Qgb3JkZXIgaW4gdGhlIG91dHB1dCBidWZmZXIuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KIAotICAgICBkZXNjcmlwdGlvbjogICBUaGlzIEhDUiAtIGR1bW15ICAtIGZ1bmN0aW9uIHdyaXRlcyBvbmx5IGEgZGlyYWMtc2VxdWVuY2UgaW4gb3V0cHV0IGJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotVUlOVCBIY3JEZWNvZGVyKEhfSENSX0lORk8gICAgICAgICAgICAgIHBIY3IsCi0gICAgICAgICAgICAgICAgY29uc3QgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICBicykKLXsKLSAgZm9yIChTSE9SVCBpPTA7IGkgPCAxMDI0OyBpKysgKSB7Ci0gICAgcEhjci0+ZGVjSW5PdXQucFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzLT5Mb25nW2ldID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgaWYgKCBpICUgMzAgPT0gMCkgewotICAgICAgcEhjci0+ZGVjSW5PdXQucFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzLT5Mb25nW2ldID0gKEZJWFBfREJMKUhDUl9ESVJBQzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbHNlIC8qIFVTRV9IQ1JfRFVNTVkgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiBkZWNvZGVzIHRoZSBjb2Rld29yZHMgb2YgdGhlIHNwZWN0cmFsIGNvZWZmaWNpZW50cyBmcm9tIHRoZQotICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0gYWNjb3JkaW5nIHRvIHRoZSBIQ1IgYWxnb3JpdGhtIGFuZCBzdG9yZXMgdGhlIHF1YW50aXplZCBzcGVjdHJhbAotICAgICAgICAgICAgICAgICAgICBjb2VmZmljaWVudHMgaW4gY29ycmVjdCBvcmRlciBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLVVJTlQgSGNyRGVjb2RlcihIX0hDUl9JTkZPICAgICAgICAgICAgICBwSGNyLAotICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAgICAgICAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgYnMpCi17CitVSU5UIEhjckRlY29kZXIoSF9IQ1JfSU5GTyBwSGNyLCBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzKSB7CiAgIGludCBwVG1wMSwgcFRtcDIsIHBUbXAzLCBwVG1wNDsKLSNpZiBERVRFQ1RfVE9PX0xPTkdfQ1dfUkVBRFMKLSAgaW50ICAgICAgICBwVG1wNTsKLSNlbmRpZgorICBpbnQgcFRtcDU7CiAKLSAgSU5UICAgICAgICBiaXRDbnRPZmZzdDsKLSAgVUlOVCAgICAgICBzYXZlQml0Q250ID0gRkRLZ2V0Qml0Q250KGJzKTsgICAvKiBzYXZlIGJpdHN0cmVhbSBwb3NpdGlvbiAqLworICBJTlQgYml0Q250T2Zmc3Q7CisgIElOVCBzYXZlQml0Q250ID0gRkRLZ2V0Qml0Q250KGJzKTsgLyogc2F2ZSBiaXRzdHJlYW0gcG9zaXRpb24gKi8KIAogICBIY3JDYWxjTnVtQ29kZXdvcmQocEhjcik7CiAKQEAgLTQ5MCwyNDQgKzQ0NiwyNDAgQEAKIAogICBIY3JFeHRlbmRlZFNlY3Rpb25JbmZvKHBIY3IpOwogCi0gIGlmICgoIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICYgSENSX0ZBVEFMX1BDV19FUlJPUl9NQVNLICkgIT0gMCApIHsKLSAgICByZXR1cm4gKCBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyApOyAgLyogc2lkZWluZm8gaXMgbWFzc2l2ZWx5IGNvcnJ1cHQsIHJldHVybiBmcm9tIEhDUiB3aXRob3V0IGhhdmluZyBkZWNvZGVkIGFueXRoaW5nICovCisgIGlmICgocEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgJiBIQ1JfRkFUQUxfUENXX0VSUk9SX01BU0spICE9IDApIHsKKyAgICByZXR1cm4gKHBIY3ItPmRlY0luT3V0LmVycm9yTG9nKTsgLyogc2lkZWluZm8gaXMgbWFzc2l2ZWx5IGNvcnJ1cHQsIHJldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIEhDUiB3aXRob3V0IGhhdmluZyBkZWNvZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueXRoaW5nICovCiAgIH0KIAotICBEZXJpdmVOdW1iZXJPZkV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHMocEhjci0+c2VnbWVudEluZm8ubnVtU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeCk7CisgIERlcml2ZU51bWJlck9mRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0cygKKyAgICAgIHBIY3ItPnNlZ21lbnRJbmZvLm51bVNlZ21lbnQsCisgICAgICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbiwKKyAgICAgIHBIY3ItPnNlY3Rpb25JbmZvLm51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHgsCisgICAgICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0cywKKyAgICAgIHBIY3ItPnNlY3Rpb25JbmZvLm51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHgpOwogCiAgIC8qIHN0b3JlICovCiAgIHBUbXAxID0gcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeDsKICAgcFRtcDIgPSBwSGNyLT5zZWN0aW9uSW5mby5leHRlbmRlZFNvcnRlZENvZGVib29rSWR4OwogICBwVG1wMyA9IHBIY3ItPnNlY3Rpb25JbmZvLm51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHg7CiAgIHBUbXA0ID0gcEhjci0+ZGVjSW5PdXQucXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHg7Ci0jaWYgREVURUNUX1RPT19MT05HX0NXX1JFQURTCiAgIHBUbXA1ID0gcEhjci0+c2VjdGlvbkluZm8ubWF4TGVuT2ZDYkluRXh0U3J0U2VjSWR4OwotI2VuZGlmCiAKICAgLyogLS0tLS0tLSBkZWNvZGUgbWVhbmluZ2Z1bCBQQ1dzIC0tLS0tLSAqLwogICBEZWNvZGVQQ1dzKGJzLCBwSGNyKTsKIAotICBpZiAoKCBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyAmIEhDUl9GQVRBTF9QQ1dfRVJST1JfTUFTSyApID09IDAgKSB7CisgIGlmICgocEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgJiBIQ1JfRkFUQUxfUENXX0VSUk9SX01BU0spID09IDApIHsKICAgICAvKiAtLS0tLS0gZGVjb2RlIHRoZSBub24tUENXcyAtLS0tLS0tLSAqLwogICAgIERlY29kZU5vblBDV3MoYnMsIHBIY3IpOwogICB9CiAKLQotI2lmIENIRUNLX1NFR01FTlRBVElPTl9GSU5BTAogICBlcnJEZXRlY3RXaXRoaW5TZWdtZW50YXRpb25GaW5hbChwSGNyKTsKLSNlbmRpZgogCiAgIC8qIHJlc3RvcmUgKi8KICAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCA9IHBUbXAxOwotICBwSGNyLT5zZWN0aW9uSW5mby5leHRlbmRlZFNvcnRlZENvZGVib29rSWR4ICAgICAgICAgICAgID0gcFRtcDI7Ci0gIHBIY3ItPnNlY3Rpb25JbmZvLm51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHggICAgPSBwVG1wMzsKLSAgcEhjci0+ZGVjSW5PdXQucXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHggICAgICAgICA9IHBUbXA0OwotI2lmIERFVEVDVF9UT09fTE9OR19DV19SRUFEUwotICBwSGNyLT5zZWN0aW9uSW5mby5tYXhMZW5PZkNiSW5FeHRTcnRTZWNJZHggICAgICAgICAgICAgID0gcFRtcDU7Ci0jZW5kaWYKKyAgcEhjci0+c2VjdGlvbkluZm8uZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeCA9IHBUbXAyOworICBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4ID0gcFRtcDM7CisgIHBIY3ItPmRlY0luT3V0LnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ID0gcFRtcDQ7CisgIHBIY3ItPnNlY3Rpb25JbmZvLm1heExlbk9mQ2JJbkV4dFNydFNlY0lkeCA9IHBUbXA1OwogCi0gIEhjclJlb3JkZXJRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cyhwSGNyLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbyk7CisgIEhjclJlb3JkZXJRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cyhwSGNyLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8pOwogCiAgIC8qIHJlc3RvcmUgYml0c3RyZWFtIHBvc2l0aW9uICovCiAgIGJpdENudE9mZnN0ID0gc2F2ZUJpdENudCAtIEZES2dldEJpdENudChicyk7Ci0gIGlmKCBiaXRDbnRPZmZzdCApIHsKKyAgaWYgKGJpdENudE9mZnN0KSB7CiAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoYnMsIGJpdENudE9mZnN0KTsKICAgfQogCi0gIHJldHVybiAoIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nICk7CisgIHJldHVybiAocEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cpOwogfQogCi0KLSNlbmRpZiAgLyogVVNFX0hDUl9EVU1NWSAqLwotCi0KLQotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIHJlb3JkZXJzIHRoZSBxdWFudGl6ZWQgc3BlY3RyYWwgY29lZmZpY2llbnRzIHNlY3Rpb253aXNlIGZvcgotICAgICAgICAgICAgICAgICAgICBsb25nLSBhbmQgc2hvcnQtYmxvY2tzIGFuZCBjb21wYXJlcyB0byB0aGUgTEFWIChMYXJnZXN0IEFic29sdXRlIFZhbHVlIG9mCi0gICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGNvZGVib29rKSAtLSBhIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgaWYgdGhlcmUgaXMgYW4gZXJyb3IKKyAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiByZW9yZGVycyB0aGUgcXVhbnRpemVkIHNwZWN0cmFsIGNvZWZmaWNpZW50cworc2VjdGlvbndpc2UgZm9yIGxvbmctIGFuZCBzaG9ydC1ibG9ja3MgYW5kIGNvbXBhcmVzIHRvIHRoZSBMQVYgKExhcmdlc3QgQWJzb2x1dGUKK1ZhbHVlIG9mIHRoZSBjdXJyZW50IGNvZGVib29rKSAtLSBhIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgaWYgdGhlcmUgaXMgYW4gZXJyb3IKICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0ZWQuCi0gICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWwgZm9yIHNob3J0LWJsb2NrcyBhIHVuaXQtYmFzZWQtZGVpbnRlcmxlYXZpbmcgaXMgYXBwbGllZC4KLSAgICAgICAgICAgICAgICAgICAgTW9yZW92ZXIgKGZvciBzaG9ydCBibG9ja3MpIHRoZSBzY2FsaW5nIGlzIGRlcml2ZWQgKGNvbXBhcmUgcGxhaW4gaHVmZm1hbgotICAgICAgICAgICAgICAgICAgICBkZWNvZGVyKS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWwgZm9yIHNob3J0LWJsb2NrcyBhIHVuaXQtYmFzZWQtZGVpbnRlcmxlYXZpbmcgaXMKK2FwcGxpZWQuIE1vcmVvdmVyIChmb3Igc2hvcnQgYmxvY2tzKSB0aGUgc2NhbGluZyBpcyBkZXJpdmVkIChjb21wYXJlIHBsYWluCitodWZmbWFuIGRlY29kZXIpLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKIHN0YXRpYyB2b2lkIEhjclJlb3JkZXJRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cygKLSAgICAgICAgSF9IQ1JfSU5GTyBwSGNyLCBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbwotICAgICAgICApCi17Ci0gIElOVCAgICAgICBxc2M7Ci0gIFVJTlQgICAgICBhYnNfcXNjOwotICBVSU5UICAgICAgaSxqOwotICBVU0hPUlQgICAgbnVtU3BlY3RyYWxWYWx1ZXNJblNlY3Rpb247CisgICAgSF9IQ1JfSU5GTyBwSGNyLCBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvKSB7CisgIElOVCBxc2M7CisgIFVJTlQgYWJzX3FzYzsKKyAgVUlOVCBpLCBqOworICBVU0hPUlQgbnVtU3BlY3RyYWxWYWx1ZXNJblNlY3Rpb247CiAgIEZJWFBfREJMICpwVGVWYTsKLSAgVVNIT1JUICAgIGxhdkVycm9yQ250ID0gMDsKKyAgVVNIT1JUIGxhdkVycm9yQ250ID0gMDsKIAotICBVSU5UICAgICAgbnVtU2VjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICA9IHBIY3ItPmRlY0luT3V0Lm51bVNlY3Rpb247Ci0gIFNQRUNUUkFMX1BUUiAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzQmFzZSA9IHBIY3ItPmRlY0luT3V0LnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2U7Ci0gIEZJWFBfREJMICpwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMgICAgID0gU1BFQ19MT05HKHBIY3ItPmRlY0luT3V0LnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UpOwotICBjb25zdCBVQ0hBUiAgICAqcENiRGltU2hpZnQgICAgICAgICAgICAgICAgICA9IHBIY3ItPnRhYmxlSW5mby5wQ2JEaW1TaGlmdDsKLSAgY29uc3QgVVNIT1JUICAgKnBMYXJnZXN0QWJzVmFsICAgICAgICAgICAgICAgPSBwSGNyLT50YWJsZUluZm8ucExhcmdlc3RBYnNWYWw7Ci0gIFVDSEFSICAgICpwU29ydGVkQ29kZWJvb2sgICAgICAgICAgICAgICAgICAgID0gcEhjci0+c2VjdGlvbkluZm8ucFNvcnRlZENvZGVib29rOwotICBVU0hPUlQgICAqcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uICAgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbjsKLSAgVVNIT1JUICAgKnBSZW9yZGVyT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5zZWN0aW9uSW5mby5wUmVvcmRlck9mZnNldDsKLSAgRklYUF9EQkwgKnBUZW1wVmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wVGVtcFZhbHVlczsKLSAgRklYUF9EQkwgKnBCYWsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wVGVtcFZhbHVlczsKKyAgVUlOVCBudW1TZWN0aW9uID0gcEhjci0+ZGVjSW5PdXQubnVtU2VjdGlvbjsKKyAgU1BFQ1RSQUxfUFRSIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UgPQorICAgICAgcEhjci0+ZGVjSW5PdXQucFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzQmFzZTsKKyAgRklYUF9EQkwgKnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cyA9CisgICAgICBTUEVDX0xPTkcocEhjci0+ZGVjSW5PdXQucFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzQmFzZSk7CisgIGNvbnN0IFVDSEFSICpwQ2JEaW1TaGlmdCA9IGFEaW1DYlNoaWZ0OworICBjb25zdCBVU0hPUlQgKnBMYXJnZXN0QWJzVmFsID0gYUxhcmdlc3RBYnNvbHV0ZVZhbHVlOworICBVQ0hBUiAqcFNvcnRlZENvZGVib29rID0gcEhjci0+c2VjdGlvbkluZm8ucFNvcnRlZENvZGVib29rOworICBVU0hPUlQgKnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbiA9CisgICAgICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb247CisgIFVTSE9SVCAqcFJlb3JkZXJPZmZzZXQgPSBwSGNyLT5zZWN0aW9uSW5mby5wUmVvcmRlck9mZnNldDsKKyAgRklYUF9EQkwgcFRlbXBWYWx1ZXNbMTAyNF07CisgIEZJWFBfREJMICpwQmFrID0gcFRlbXBWYWx1ZXM7CiAKLSAgRkRLbWVtY2xlYXIocFRlbXBWYWx1ZXMsMTAyNCpzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY2xlYXIocFRlbXBWYWx1ZXMsIDEwMjQgKiBzaXplb2YoRklYUF9EQkwpKTsKIAotICAvKiBsb25nIGFuZCBzaG9ydDogY2hlY2sgaWYgZGVjb2RlZCBodWZmbWFuLXZhbHVlcyAocXVhbnRpemVkIHNwZWN0cmFsIGNvZWZmaWNpZW50cykgYXJlIHdpdGhpbiByYW5nZSAqLwotICBmb3IgKCBpPW51bVNlY3Rpb247IGkgIT0gMDsgaS0tICkgewotICAgIG51bVNwZWN0cmFsVmFsdWVzSW5TZWN0aW9uID0gKnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbisrIDw8IHBDYkRpbVNoaWZ0WypwU29ydGVkQ29kZWJvb2tdOworICAvKiBsb25nIGFuZCBzaG9ydDogY2hlY2sgaWYgZGVjb2RlZCBodWZmbWFuLXZhbHVlcyAocXVhbnRpemVkIHNwZWN0cmFsCisgICAqIGNvZWZmaWNpZW50cykgYXJlIHdpdGhpbiByYW5nZSAqLworICBmb3IgKGkgPSBudW1TZWN0aW9uOyBpICE9IDA7IGktLSkgeworICAgIG51bVNwZWN0cmFsVmFsdWVzSW5TZWN0aW9uID0gKnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbisrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwQ2JEaW1TaGlmdFsqcFNvcnRlZENvZGVib29rXTsKICAgICBwVGVWYSA9ICZwVGVtcFZhbHVlc1sqcFJlb3JkZXJPZmZzZXQrK107Ci0gICAgZm9yKCBqID0gbnVtU3BlY3RyYWxWYWx1ZXNJblNlY3Rpb247IGogIT0gMDsgai0tICkgeworICAgIGZvciAoaiA9IG51bVNwZWN0cmFsVmFsdWVzSW5TZWN0aW9uOyBqICE9IDA7IGotLSkgewogICAgICAgcXNjID0gKnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cysrOwotICAgICAgYWJzX3FzYyA9IEZES2Ficyhxc2MpOwotI2lmIFZBTElEX0xBVl9FUlJPUl9UUklHR0VSCi0gICAgICBpZiAoIGFic19xc2MgPD0gcExhcmdlc3RBYnNWYWxbKnBTb3J0ZWRDb2RlYm9va10gKSB7Ci0gICAgICAgICpwVGVWYSsrID0gKEZJWFBfREJMKXFzYzsgIC8qIHRoZSBxc2MgdmFsdWUgaXMgd2l0aGluIHJhbmdlICovCi0gICAgICB9Ci0gICAgICBlbHNlIHsgLyogbGluZSBpcyB0b28gaGlnaCAuLiAqLwotICAgICAgICBpZiAoIGFic19xc2MgPT0gUV9WQUxVRV9JTlZBTElEICkgeyAvKiAuLiBiZWNhdXNlIG9mIHByZXZpb3VzIG1hcmtpbmcgLS0+IGRvbnQgc2V0IExBViBmbGFnICh3b3VsZCBiZSBjb25mdXNpbmcpLCBqdXN0IGNvcHkgb3V0IHRoZSBhbHJlYWR5IG1hcmtlZCB2YWx1ZSAqLwotICAgICAgICAgICpwVGVWYSsrID0gKEZJWFBfREJMKSBxc2M7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLi4gYmVjYXVzZSBhIHRvbyBoaWdoIHZhbHVlIHdhcyBkZWNvZGVkIGZvciB0aGlzIGNiIC0tPiBzZXQgTEFWIGZsYWcgKi8KLSAgICAgICAgICAqcFRlVmErKyA9IChGSVhQX0RCTCkgUV9WQUxVRV9JTlZBTElEOworICAgICAgYWJzX3FzYyA9IGZBYnMocXNjKTsKKyAgICAgIGlmIChhYnNfcXNjIDw9IHBMYXJnZXN0QWJzVmFsWypwU29ydGVkQ29kZWJvb2tdKSB7CisgICAgICAgICpwVGVWYSsrID0gKEZJWFBfREJMKXFzYzsgLyogdGhlIHFzYyB2YWx1ZSBpcyB3aXRoaW4gcmFuZ2UgKi8KKyAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBsaW5lIGlzIHRvbyBoaWdoIC4uICovCisgICAgICAgIGlmIChhYnNfcXNjID09CisgICAgICAgICAgICBRX1ZBTFVFX0lOVkFMSUQpIHsgLyogLi4gYmVjYXVzZSBvZiBwcmV2aW91cyBtYXJraW5nIC0tPiBkb250IHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExBViBmbGFnICh3b3VsZCBiZSBjb25mdXNpbmcpLCBqdXN0IGNvcHkgb3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFscmVhZHkgbWFya2VkIHZhbHVlICovCisgICAgICAgICAgKnBUZVZhKysgPSAoRklYUF9EQkwpcXNjOworICAgICAgICB9IGVsc2UgeyAvKiAuLiBiZWNhdXNlIGEgdG9vIGhpZ2ggdmFsdWUgd2FzIGRlY29kZWQgZm9yIHRoaXMgY2IgLS0+IHNldAorICAgICAgICAgICAgICAgICAgICBMQVYgZmxhZyAqLworICAgICAgICAgICpwVGVWYSsrID0gKEZJWFBfREJMKVFfVkFMVUVfSU5WQUxJRDsKICAgICAgICAgICBsYXZFcnJvckNudCArPSAxOwogICAgICAgICB9CiAgICAgICB9Ci0jZWxzZQotICAgICAgaWYgKCBhYnNfcXNjIDw9IHBMYXJnZXN0QWJzVmFsWypwU29ydGVkQ29kZWJvb2tdICkgewotICAgICAgICAqcFRlVmErKyA9IHFzYzsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAqcFRlVmErKyA9IFFfVkFMVUVfSU5WQUxJRDsKLSAgICAgICAgbGF2RXJyb3JDbnQgKz0gMTsKLSAgICAgIH0KLSNlbmRpZgogICAgIH0KICAgICBwU29ydGVkQ29kZWJvb2srKzsKICAgfQogCi0gIGlmICghSXNMb25nQmxvY2soJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pKQotICB7CisgIGlmICghSXNMb25nQmxvY2soJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pKSB7CiAgICAgRklYUF9EQkwgKnBPdXQ7Ci0gICAgRklYUF9EQkwgIGxvY01heDsKLSAgICBGSVhQX0RCTCAgdG1wOwotICAgIFNDSEFSICAgICBncm91cG9mZnNldDsKLSAgICBTQ0hBUiAgICAgZ3JvdXA7Ci0gICAgU0NIQVIgICAgIGJhbmQ7Ci0gICAgU0NIQVIgICAgIGdyb3Vwd2luOwotICAgIFNDSEFSICAgICB3aW5kb3c7Ci0gICAgU0NIQVIgICAgIG51bVdpbkdyb3VwOwotICAgIFNIT1JUICAgICBpbnRlcm07Ci0gICAgU0NIQVIgICAgIG51bVNmYlRyYW5zbTsKLSAgICBTQ0hBUiAgICAgd2luR3JvdXBMZW47Ci0gICAgU0hPUlQgICAgIGluZGV4OwotICAgIElOVCAgICAgICBtc2I7Ci0gICAgSU5UICAgICAgIGxzYjsKKyAgICBGSVhQX0RCTCBsb2NNYXg7CisgICAgRklYUF9EQkwgdG1wOworICAgIFNDSEFSIGdyb3Vwb2Zmc2V0OworICAgIFNDSEFSIGdyb3VwOworICAgIFNDSEFSIGJhbmQ7CisgICAgU0NIQVIgZ3JvdXB3aW47CisgICAgU0NIQVIgd2luZG93OworICAgIFNDSEFSIG51bVdpbkdyb3VwOworICAgIFNIT1JUIGludGVybTsKKyAgICBTQ0hBUiBudW1TZmJUcmFuc207CisgICAgU0NIQVIgd2luR3JvdXBMZW47CisgICAgU0hPUlQgaW5kZXg7CisgICAgSU5UIG1zYjsKKyAgICBJTlQgbHNiOwogCi0gICAgU0hPUlQgICAqcFNjYWxlRmFjSGNyID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcjsKLSAgICBTSE9SVCAgICpwU2ZiU2NsSGNyICAgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNmYlNjYWxlOwotICAgIGNvbnN0IFNIT1JUICpCYW5kT2Zmc2V0cyA9IEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKTsKKyAgICBTSE9SVCAqcFNjYWxlRmFjSGNyID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcjsKKyAgICBTSE9SVCAqcFNmYlNjbEhjciA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2ZiU2NhbGU7CisgICAgY29uc3QgU0hPUlQgKkJhbmRPZmZzZXRzID0gR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cygKKyAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKTsKIAotICAgIHBCYWsgPSBwSGNyLT5zZWdtZW50SW5mby5wVGVtcFZhbHVlczsKKyAgICBwQmFrID0gcFRlbXBWYWx1ZXM7CiAgICAgLyogZGVpbnRlcmxlYXZlIHVuaXR3aXNlIGZvciBzaG9ydCBibG9ja3MgKi8KLSAgICBmb3IgKCB3aW5kb3cgPSAwOyB3aW5kb3cgPCAoOCk7IHdpbmRvdysrICkgewotICAgICAgcE91dCA9IFNQRUMocFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzQmFzZSwgd2luZG93LCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoKTsKLSAgICAgIGZvciAoIGk9MDsgaSA8IChMSU5FU19QRVJfVU5JVF9HUk9VUCk7IGkrKyApIHsKLSAgICAgICAgcFRlVmEgPSBwQmFrICsgKHdpbmRvdyA8PCBGT1VSX0xPR19ESVZfVFdPX0xPRykgKyBpICogMzI7CS8qIGRpc3RhbmNlIG9mIGxpbmVzIGJldHdlZW4gdW5pdCBncm91cHMgaGFzIHRvIGJlIGNvbnN0YW50IGZvciBldmVyeSBmcmFtZWxlbmd0aCAoMzIpISAgKi8KLSAgICAgICAgZm9yICggaj0oTElORVNfUEVSX1VOSVQpOyBqICE9IDA7IGotLSApIHsKKyAgICBmb3IgKHdpbmRvdyA9IDA7IHdpbmRvdyA8ICg4KTsgd2luZG93KyspIHsKKyAgICAgIHBPdXQgPSBTUEVDKHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UsIHdpbmRvdywKKyAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGgpOworICAgICAgZm9yIChpID0gMDsgaSA8IChMSU5FU19QRVJfVU5JVF9HUk9VUCk7IGkrKykgeworICAgICAgICBwVGVWYSA9IHBCYWsgKyAod2luZG93IDw8IEZPVVJfTE9HX0RJVl9UV09fTE9HKSArCisgICAgICAgICAgICAgICAgaSAqIDMyOyAvKiBkaXN0YW5jZSBvZiBsaW5lcyBiZXR3ZWVuIHVuaXQgZ3JvdXBzIGhhcyB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQgZm9yIGV2ZXJ5IGZyYW1lbGVuZ3RoICgzMikhICAqLworICAgICAgICBmb3IgKGogPSAoTElORVNfUEVSX1VOSVQpOyBqICE9IDA7IGotLSkgewogICAgICAgICAgICpwT3V0KysgPSAqcFRlVmErKzsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KIAogICAgIC8qIHNob3J0IGJsb2NrcyBvbmx5ICovCi0gICAgLyogZGVyaXZlIGdsb2JhbCBzY2FsaW5nLXZhbHVlIGZvciBldmVyeSBzZmIgYW5kIGV2ZXJ5IHdpbmRvdyAoYXMgaXQgaXMgZG9uZSBpbiBwbGFpbi1odWZmbWFuLWRlY29kZXIgYXQgc2hvcnQgYmxvY2tzKSAqLworICAgIC8qIGRlcml2ZSBnbG9iYWwgc2NhbGluZy12YWx1ZSBmb3IgZXZlcnkgc2ZiIGFuZCBldmVyeSB3aW5kb3cgKGFzIGl0IGlzIGRvbmUKKyAgICAgKiBpbiBwbGFpbi1odWZmbWFuLWRlY29kZXIgYXQgc2hvcnQgYmxvY2tzKSAqLwogICAgIGdyb3Vwb2Zmc2V0ID0gMDsKIAogICAgIG51bVdpbkdyb3VwID0gR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKLSAgICBudW1TZmJUcmFuc20gPSBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOworICAgIG51bVNmYlRyYW5zbSA9CisgICAgICAgIEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7CiAKICAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBudW1XaW5Hcm91cDsgZ3JvdXArKykgewotICAgICAgd2luR3JvdXBMZW4gPSBHZXRXaW5kb3dHcm91cExlbmd0aCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyxncm91cCk7CisgICAgICB3aW5Hcm91cExlbiA9CisgICAgICAgICAgR2V0V2luZG93R3JvdXBMZW5ndGgoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sIGdyb3VwKTsKICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBudW1TZmJUcmFuc207IGJhbmQrKykgewogICAgICAgICBpbnRlcm0gPSBncm91cCAqIDE2ICsgYmFuZDsKICAgICAgICAgbXNiID0gcFNjYWxlRmFjSGNyW2ludGVybV0gPj4gMjsKICAgICAgICAgbHNiID0gcFNjYWxlRmFjSGNyW2ludGVybV0gJiAzOwogICAgICAgICBmb3IgKGdyb3Vwd2luID0gMDsgZ3JvdXB3aW4gPCB3aW5Hcm91cExlbjsgZ3JvdXB3aW4rKykgewogICAgICAgICAgIHdpbmRvdyA9IGdyb3Vwb2Zmc2V0ICsgZ3JvdXB3aW47Ci0gICAgICAgICAgcEJhayA9IFNQRUMocFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzQmFzZSwgd2luZG93LCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoKTsKKyAgICAgICAgICBwQmFrID0gU1BFQyhwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlLCB3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCk7CiAgICAgICAgICAgbG9jTWF4ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICAgICAgZm9yIChpbmRleCA9IEJhbmRPZmZzZXRzW2JhbmRdOyBpbmRleCA8IEJhbmRPZmZzZXRzW2JhbmQrMV07IGluZGV4ICs9IExJTkVTX1BFUl9VTklUKSB7CisgICAgICAgICAgZm9yIChpbmRleCA9IEJhbmRPZmZzZXRzW2JhbmRdOyBpbmRleCA8IEJhbmRPZmZzZXRzW2JhbmQgKyAxXTsKKyAgICAgICAgICAgICAgIGluZGV4ICs9IExJTkVTX1BFUl9VTklUKSB7CiAgICAgICAgICAgICBwVGVWYSA9ICZwQmFrW2luZGV4XTsKLSAgICAgICAgICAgIGZvciAoIGkgPSBMSU5FU19QRVJfVU5JVDsgaSAhPSAwOyBpIC0tKSB7Ci0gICAgICAgICAgICAgIHRtcCA9ICgqcFRlVmEgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSk/IC0qcFRlVmErKyA6ICpwVGVWYSsrOwotICAgICAgICAgICAgICBsb2NNYXggPSBmaXhNYXgodG1wLGxvY01heCk7CisgICAgICAgICAgICBmb3IgKGkgPSBMSU5FU19QRVJfVU5JVDsgaSAhPSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgdG1wID0gKCpwVGVWYSA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSA/IC0qcFRlVmErKyA6ICpwVGVWYSsrOworICAgICAgICAgICAgICBsb2NNYXggPSBmaXhNYXgodG1wLCBsb2NNYXgpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoIGZpeHBfYWJzKGxvY01heCkgPiAoRklYUF9EQkwpTUFYX1FVQU5USVpFRF9WQUxVRSApIHsKKyAgICAgICAgICBpZiAoZml4cF9hYnMobG9jTWF4KSA+IChGSVhQX0RCTClNQVhfUVVBTlRJWkVEX1ZBTFVFKSB7CiAgICAgICAgICAgICBsb2NNYXggPSAoRklYUF9EQkwpTUFYX1FVQU5USVpFRF9WQUxVRTsKICAgICAgICAgICB9Ci0gICAgICAgICAgcFNmYlNjbEhjclt3aW5kb3cqMTYrYmFuZF0gPSBtc2IgLSBHZXRTY2FsZUZyb21WYWx1ZShsb2NNYXgsIGxzYik7ICAvKiBzYXZlIGdsb2JhbCBzY2FsZSBtYXhpbWEgaW4gdGhpcyBzZmIgKi8KKyAgICAgICAgICBwU2ZiU2NsSGNyW3dpbmRvdyAqIDE2ICsgYmFuZF0gPQorICAgICAgICAgICAgICBtc2IgLSBHZXRTY2FsZUZyb21WYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY01heCwgbHNiKTsgLyogc2F2ZSBnbG9iYWwgc2NhbGUgbWF4aW1hIGluIHRoaXMgc2ZiICovCiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGdyb3Vwb2Zmc2V0ICs9IEdldFdpbmRvd0dyb3VwTGVuZ3RoKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLGdyb3VwKTsKKyAgICAgIGdyb3Vwb2Zmc2V0ICs9CisgICAgICAgICAgR2V0V2luZG93R3JvdXBMZW5ndGgoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sIGdyb3VwKTsKICAgICB9Ci0gIH0gZWxzZQotICB7CisgIH0gZWxzZSB7CiAgICAgLyogY29weSBzdHJhaWdodCBmb3IgbG9uZy1ibG9ja3MgKi8KLSAgICBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMgPSBTUEVDX0xPTkcocFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzQmFzZSk7Ci0gICAgZm9yICggaSA9IDEwMjQ7IGkgIT0gMDsgaS0tICkgeworICAgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cyA9CisgICAgICAgIFNQRUNfTE9ORyhwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlKTsKKyAgICBmb3IgKGkgPSAxMDI0OyBpICE9IDA7IGktLSkgewogICAgICAgKnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cysrID0gKnBCYWsrKzsKICAgICB9CiAgIH0KIAotICBpZiAoIGxhdkVycm9yQ250ICE9IDAgKSB7CisgIGlmIChsYXZFcnJvckNudCAhPSAwKSB7CiAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gTEFWX1ZJT0xBVElPTjsKICAgfQogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIGNvZGV3b3JkcwotICAgICAgICAgICAgICAgICAgICBmb3IgZWFjaCBzZWN0aW9uIChudW1Db2Rld29yZEluU2VjdGlvbikgYW5kIHRoZSBudW1iZXIgb2YgY29kZXdvcmRzCi0gICAgICAgICAgICAgICAgICAgIGZvciBhbGwgc2VjdGlvbnMgKG51bUNvZGV3b3JkKS4KLSAgICAgICAgICAgICAgICAgICAgRm9yIHplcm8gYW5kIGludGVuc2l0eSBjb2RlYm9va3MgYSBlbnRyeSBpcyBhbHNvIGRvbmUgaW4gdGhlIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgIG51bUNvZGV3b3JkSW5TZWN0aW9uLiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGNvZGVib29rIGlzIGEgdHdvIHR1cGxlcwotICAgICAgICAgICAgICAgICAgICBjb2RlYm9vay4gVGhpcyBpcyBuZWVkZWQgbGF0ZXIgZm9yIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgYmFzZSBhZGRyZXNzZXMKLSAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSByZW9yZGVyaW5nIG9mIHRoZSBxdWFudGl6ZSBzcGVjdHJhbCBjb2VmZmljaWVudHMgYXQgdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgaGNyIHRvb2wuCi0gICAgICAgICAgICAgICAgICAgIFRoZSB2YXJpYWJsZSBudW1Db2Rld29yZCBjb250YWluIHRoZSBudW1iZXIgb2YgY29kZXdvcmRzIHdoaWNoIGFyZSByZWFsbHkKLSAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdHN0cmVhbS4gWmVybyBvciBpbnRlbnNpdHkgY29kZWJvb2tzIGRvZXMgbm90IGluY3JlYXNlIHRoZQotICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBudW1Db2Rld29yZHMuCisgICAgICAgICAgICAgICAgICAgIGZvciBlYWNoIHNlY3Rpb24gKG51bUNvZGV3b3JkSW5TZWN0aW9uKSBhbmQgdGhlIG51bWJlciBvZgorY29kZXdvcmRzIGZvciBhbGwgc2VjdGlvbnMgKG51bUNvZGV3b3JkKS4gRm9yIHplcm8gYW5kIGludGVuc2l0eSBjb2RlYm9va3MgYQorZW50cnkgaXMgYWxzbyBkb25lIGluIHRoZSB2YXJpYWJsZSBudW1Db2Rld29yZEluU2VjdGlvbi4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZQorY29kZWJvb2sgaXMgYSB0d28gdHVwbGVzIGNvZGVib29rLiBUaGlzIGlzIG5lZWRlZCBsYXRlciBmb3IgdGhlIGNhbGN1bGF0aW9uIG9mCit0aGUgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSByZW9yZGVyaW5nIG9mIHRoZSBxdWFudGl6ZSBzcGVjdHJhbCBjb2VmZmljaWVudHMgYXQKK3RoZSBlbmQgb2YgdGhlIGhjciB0b29sLiBUaGUgdmFyaWFibGUgbnVtQ29kZXdvcmQgY29udGFpbiB0aGUgbnVtYmVyIG9mCitjb2Rld29yZHMgd2hpY2ggYXJlIHJlYWxseSBpbiB0aGUgYml0c3RyZWFtLiBaZXJvIG9yIGludGVuc2l0eSBjb2RlYm9va3MgZG9lcworbm90IGluY3JlYXNlIHRoZSB2YXJpYWJsZSBudW1Db2Rld29yZHMuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICByZXR1cm46ICAgLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLwogCi1zdGF0aWMgdm9pZCBIY3JDYWxjTnVtQ29kZXdvcmQoSF9IQ1JfSU5GTyBwSGNyKQotewotICBpbnQgICAgIGhjclNlY3Rpb247Ci0gIFVJTlQgICAgbnVtQ29kZXdvcmQ7CitzdGF0aWMgdm9pZCBIY3JDYWxjTnVtQ29kZXdvcmQoSF9IQ1JfSU5GTyBwSGNyKSB7CisgIGludCBoY3JTZWN0aW9uOworICBVSU5UIG51bUNvZGV3b3JkOwogCi0gIFVJTlQgICAgbnVtU2VjdGlvbiAgICAgICAgICAgID0gICBwSGNyLT5kZWNJbk91dC5udW1TZWN0aW9uOwotICBVQ0hBUiAgKnBDb2RlYm9vayAgICAgICAgICAgICA9ICAgcEhjci0+ZGVjSW5PdXQucENvZGVib29rOwotICBTSE9SVCAgKnBOdW1MaW5lSW5TZWN0aW9uICAgICA9ICAgcEhjci0+ZGVjSW5PdXQucE51bUxpbmVJblNlY3Q7Ci0gIGNvbnN0IFVDSEFSICAqcENiRGltU2hpZnQgICAgID0gICBwSGNyLT50YWJsZUluZm8ucENiRGltU2hpZnQ7Ci0gIFVTSE9SVCAqcE51bUNvZGV3b3JkSW5TZWN0aW9uID0gICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtQ29kZXdvcmRJblNlY3Rpb247CisgIFVJTlQgbnVtU2VjdGlvbiA9IHBIY3ItPmRlY0luT3V0Lm51bVNlY3Rpb247CisgIFVDSEFSICpwQ29kZWJvb2sgPSBwSGNyLT5kZWNJbk91dC5wQ29kZWJvb2s7CisgIFNIT1JUICpwTnVtTGluZUluU2VjdGlvbiA9IHBIY3ItPmRlY0luT3V0LnBOdW1MaW5lSW5TZWN0OworICBjb25zdCBVQ0hBUiAqcENiRGltU2hpZnQgPSBhRGltQ2JTaGlmdDsKKworICBVU0hPUlQgKnBOdW1Db2Rld29yZEluU2VjdGlvbiA9IHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1Db2Rld29yZEluU2VjdGlvbjsKIAogICBudW1Db2Rld29yZCA9IDA7Ci0gIGZvciAoIGhjclNlY3Rpb24gPSBudW1TZWN0aW9uOyBoY3JTZWN0aW9uICE9IDA7IGhjclNlY3Rpb24tLSApIHsKKyAgZm9yIChoY3JTZWN0aW9uID0gbnVtU2VjdGlvbjsgaGNyU2VjdGlvbiAhPSAwOyBoY3JTZWN0aW9uLS0pIHsKICAgICAqcE51bUNvZGV3b3JkSW5TZWN0aW9uID0gKnBOdW1MaW5lSW5TZWN0aW9uKysgPj4gcENiRGltU2hpZnRbKnBDb2RlYm9va107Ci0gICAgaWYgKCAqcENvZGVib29rICE9IDAgKSB7CisgICAgaWYgKCpwQ29kZWJvb2sgIT0gMCkgewogICAgICAgbnVtQ29kZXdvcmQgKz0gKnBOdW1Db2Rld29yZEluU2VjdGlvbjsKICAgICB9CiAgICAgcE51bUNvZGV3b3JkSW5TZWN0aW9uKys7CkBAIC03MzYsNjEgKzY4OCw2MyBAQAogICBwSGNyLT5zZWN0aW9uSW5mby5udW1Db2Rld29yZCA9IG51bUNvZGV3b3JkOwogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgbnVtYmVyCi0gICAgICAgICAgICAgICAgICAgIG9mIHNvcnRlZCBjb2RlYm9va3MgYW5kIHNvcnRzIHRoZSBjb2RlYm9va3MgYW5kIHRoZSBudW1Db2Rld29yZEluU2VjdGlvbgotICAgICAgICAgICAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIHByaW9yaXR5LgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgICAgICAgICAgICAgb2Ygc29ydGVkIGNvZGVib29rcyBhbmQgc29ydHMgdGhlIGNvZGVib29rcyBhbmQgdGhlCitudW1Db2Rld29yZEluU2VjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHByaW9yaXR5LgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLXN0YXRpYyB2b2lkIEhjclNvcnRDb2RlYm9va0FuZE51bUNvZGV3b3JkSW5TZWN0aW9uKEhfSENSX0lORk8gcEhjcikKLXsKK3N0YXRpYyB2b2lkIEhjclNvcnRDb2RlYm9va0FuZE51bUNvZGV3b3JkSW5TZWN0aW9uKEhfSENSX0lORk8gcEhjcikgeworICBVSU5UIGksIGosIGs7CisgIFVDSEFSIHRlbXA7CisgIFVJTlQgY291bnRlcjsKKyAgVUlOVCBzdGFydE9mZnNldDsKKyAgVUlOVCBudW1aZXJvU2VjdGlvbjsKKyAgVUNIQVIgKnBEZXN0OworICBVSU5UIG51bVNlY3Rpb25EZWM7CiAKLSAgVUlOVCAgICBpLGosazsKLSAgVUNIQVIgICB0ZW1wOwotICBVSU5UICAgIGNvdW50ZXI7Ci0gIFVJTlQgICAgc3RhcnRPZmZzZXQ7Ci0gIFVJTlQgICAgbnVtWmVyb1NlY3Rpb247Ci0gIFVDSEFSICAqcERlc3Q7Ci0gIFVJTlQgICAgbnVtU2VjdGlvbkRlYzsKLQotICBVSU5UICAgIG51bVNlY3Rpb24gICAgICAgICAgICAgICAgICA9ICAgcEhjci0+ZGVjSW5PdXQubnVtU2VjdGlvbjsKLSAgVUNIQVIgICpwQ29kZWJvb2sgICAgICAgICAgICAgICAgICAgPSAgIHBIY3ItPmRlY0luT3V0LnBDb2RlYm9vazsKLSAgVUNIQVIgICpwU29ydGVkQ29kZWJvb2sgICAgICAgICAgICAgPSAgIHBIY3ItPnNlY3Rpb25JbmZvLnBTb3J0ZWRDb2RlYm9vazsKLSAgVVNIT1JUICpwTnVtQ29kZXdvcmRJblNlY3Rpb24gICAgICAgPSAgIHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1Db2Rld29yZEluU2VjdGlvbjsKLSAgVVNIT1JUICpwTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb24gPSAgIHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbjsKLSAgVUNIQVIgICpwQ29kZWJvb2tTd2l0Y2ggICAgICAgICAgICAgPSAgIHBIY3ItPnNlY3Rpb25JbmZvLnBDb2RlYm9va1N3aXRjaDsKLSAgVVNIT1JUICpwUmVvcmRlck9mZnNldCAgICAgICAgICAgICAgPSAgIHBIY3ItPnNlY3Rpb25JbmZvLnBSZW9yZGVyT2Zmc2V0OwotICBjb25zdCBVQ0hBUiAgICpwQ2JQcmlvcml0eSAgICAgICAgICA9ICAgcEhjci0+dGFibGVJbmZvLnBDYlByaW9yaXR5OwotICBjb25zdCBVQ0hBUiAgICpwTWluT2ZDYlBhaXIgICAgICAgICA9ICAgcEhjci0+Y2JQYWlycy5wTWluT2ZDYlBhaXI7Ci0gIGNvbnN0IFVDSEFSICAgKnBNYXhPZkNiUGFpciAgICAgICAgID0gICBwSGNyLT5jYlBhaXJzLnBNYXhPZkNiUGFpcjsKLSAgY29uc3QgVUNIQVIgICAqcENiRGltU2hpZnQgICAgICAgICAgPSAgIHBIY3ItPnRhYmxlSW5mby5wQ2JEaW1TaGlmdDsKKyAgVUlOVCBudW1TZWN0aW9uID0gcEhjci0+ZGVjSW5PdXQubnVtU2VjdGlvbjsKKyAgVUNIQVIgKnBDb2RlYm9vayA9IHBIY3ItPmRlY0luT3V0LnBDb2RlYm9vazsKKyAgVUNIQVIgKnBTb3J0ZWRDb2RlYm9vayA9IHBIY3ItPnNlY3Rpb25JbmZvLnBTb3J0ZWRDb2RlYm9vazsKKyAgVVNIT1JUICpwTnVtQ29kZXdvcmRJblNlY3Rpb24gPSBwSGNyLT5zZWN0aW9uSW5mby5wTnVtQ29kZXdvcmRJblNlY3Rpb247CisgIFVTSE9SVCAqcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uID0KKyAgICAgIHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbjsKKyAgVUNIQVIgKnBDb2RlYm9va1N3aXRjaCA9IHBIY3ItPnNlY3Rpb25JbmZvLnBDb2RlYm9va1N3aXRjaDsKKyAgVVNIT1JUICpwUmVvcmRlck9mZnNldCA9IHBIY3ItPnNlY3Rpb25JbmZvLnBSZW9yZGVyT2Zmc2V0OworICBjb25zdCBVQ0hBUiAqcENiUHJpb3JpdHkgPSBhQ2JQcmlvcml0eTsKKyAgY29uc3QgVUNIQVIgKnBNaW5PZkNiUGFpciA9IGFNaW5PZkNiUGFpcjsKKyAgY29uc3QgVUNIQVIgKnBNYXhPZkNiUGFpciA9IGFNYXhPZkNiUGFpcjsKKyAgY29uc3QgVUNIQVIgKnBDYkRpbVNoaWZ0ID0gYURpbUNiU2hpZnQ7CiAKICAgVUlOVCBzZWFyY2hTdGFydCA9IDA7CiAKLSAgLyogY2FsY3VsYXRlICpwTnVtU29ydGVkU2VjdGlvbiBhbmQgc3RvcmUgdGhlIHByaW9yaXRpZXMgaW4gYXJyYXkgcFNvcnRlZENkZWJvb2sgKi8KKyAgLyogY2FsY3VsYXRlICpwTnVtU29ydGVkU2VjdGlvbiBhbmQgc3RvcmUgdGhlIHByaW9yaXRpZXMgaW4gYXJyYXkKKyAgICogcFNvcnRlZENkZWJvb2sgKi8KICAgcERlc3QgPSBwU29ydGVkQ29kZWJvb2s7CiAgIG51bVplcm9TZWN0aW9uID0gMDsKLSAgZm9yICggaT1udW1TZWN0aW9uOyBpICE9IDA7IGktLSApIHsKLSAgICBpZiAoIHBDYlByaW9yaXR5WypwQ29kZWJvb2tdID09IDAgKSB7CisgIGZvciAoaSA9IG51bVNlY3Rpb247IGkgIT0gMDsgaS0tKSB7CisgICAgaWYgKHBDYlByaW9yaXR5WypwQ29kZWJvb2tdID09IDApIHsKICAgICAgIG51bVplcm9TZWN0aW9uICs9IDE7CiAgICAgfQogICAgICpwRGVzdCsrID0gcENiUHJpb3JpdHlbKnBDb2RlYm9vaysrXTsKICAgfQotICBwSGNyLT5zZWN0aW9uSW5mby5udW1Tb3J0ZWRTZWN0aW9uID0gbnVtU2VjdGlvbiAtIG51bVplcm9TZWN0aW9uOyAgICAvKiBudW1Tb3J0ZWRTZWN0aW9uIGNvbnRhaW5zIG5vIHplcm8gb3IgaW50ZW5zaXR5IHNlY3Rpb24gKi8KKyAgcEhjci0+c2VjdGlvbkluZm8ubnVtU29ydGVkU2VjdGlvbiA9CisgICAgICBudW1TZWN0aW9uIC0gbnVtWmVyb1NlY3Rpb247IC8qIG51bVNvcnRlZFNlY3Rpb24gY29udGFpbnMgbm8gemVybyBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnNpdHkgc2VjdGlvbiAqLwogICBwQ29kZWJvb2sgPSBwSGNyLT5kZWNJbk91dC5wQ29kZWJvb2s7CiAKICAgLyogc29ydCBwcmlvcml0aWVzIG9mIHRoZSBjb2RlYm9va3MgaW4gYXJyYXkgcFNvcnRlZENkZWJvb2tbXSAqLwogICBudW1TZWN0aW9uRGVjID0gbnVtU2VjdGlvbiAtIDE7Ci0gIGlmICggbnVtU2VjdGlvbkRlYyA+IDAgKSB7CisgIGlmIChudW1TZWN0aW9uRGVjID4gMCkgewogICAgIGNvdW50ZXIgPSBudW1TZWN0aW9uRGVjOwotICAgIGZvciAoIGo9bnVtU2VjdGlvbkRlYzsgaiAhPSAwOyBqLS0gKSB7Ci0gICAgICBmb3IgKCBpPTA7IGkgPCBjb3VudGVyOyBpKysgKSB7CisgICAgZm9yIChqID0gbnVtU2VjdGlvbkRlYzsgaiAhPSAwOyBqLS0pIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudGVyOyBpKyspIHsKICAgICAgICAgLyogc3dhcCBwcmlvcml0aWVzICovCi0gICAgICAgIGlmICggcFNvcnRlZENvZGVib29rW2krMV0gPiBwU29ydGVkQ29kZWJvb2tbaV0gKSB7Ci0gICAgICAgICAgdGVtcCAgICAgICAgICAgICAgICAgPSBwU29ydGVkQ29kZWJvb2tbaV07Ci0gICAgICAgICAgcFNvcnRlZENvZGVib29rW2ldICAgPSBwU29ydGVkQ29kZWJvb2tbaSsxXTsKLSAgICAgICAgICBwU29ydGVkQ29kZWJvb2tbaSsxXSA9IHRlbXA7CisgICAgICAgIGlmIChwU29ydGVkQ29kZWJvb2tbaSArIDFdID4gcFNvcnRlZENvZGVib29rW2ldKSB7CisgICAgICAgICAgdGVtcCA9IHBTb3J0ZWRDb2RlYm9va1tpXTsKKyAgICAgICAgICBwU29ydGVkQ29kZWJvb2tbaV0gPSBwU29ydGVkQ29kZWJvb2tbaSArIDFdOworICAgICAgICAgIHBTb3J0ZWRDb2RlYm9va1tpICsgMV0gPSB0ZW1wOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBjb3VudGVyIC09IDE7CkBAIC03OTgsMjggKzc1MiwzMyBAQAogICB9CiAKICAgLyogY2xlYXIgY29kZWJvb2tTd2l0Y2ggYXJyYXkgKi8KLSAgZm9yICggaSA9IG51bVNlY3Rpb247IGkgIT0gMDsgaS0tKSB7CisgIGZvciAoaSA9IG51bVNlY3Rpb247IGkgIT0gMDsgaS0tKSB7CiAgICAgKnBDb2RlYm9va1N3aXRjaCsrID0gMDsKICAgfQogICBwQ29kZWJvb2tTd2l0Y2ggPSBwSGNyLT5zZWN0aW9uSW5mby5wQ29kZWJvb2tTd2l0Y2g7CiAKLSAgLyogc29ydCBzZWN0aW9uQ29kZWJvb2tzIGFuZCBudW1Db2R3b3Jkc0luU2VjdGlvbiBhbmQgY2FsY3VsYXRlIHBSZW9yZGVyT2Zmc3Rbal0gKi8KLSAgZm9yICggaiA9IDA7IGogPCBudW1TZWN0aW9uOyBqKysgKSB7Ci0gICAgZm9yICggaSA9IHNlYXJjaFN0YXJ0OyBpIDwgbnVtU2VjdGlvbjsgaSsrICkgewotICAgICAgaWYgKCBwQ29kZWJvb2tTd2l0Y2hbaV0gPT0gMCAmJiAoIHBNaW5PZkNiUGFpcltwU29ydGVkQ29kZWJvb2tbal1dID09IHBDb2RlYm9va1tpXSAgfHwgIHBNYXhPZkNiUGFpcltwU29ydGVkQ29kZWJvb2tbal1dID09IHBDb2RlYm9va1tpXSApKSB7CisgIC8qIHNvcnQgc2VjdGlvbkNvZGVib29rcyBhbmQgbnVtQ29kd29yZHNJblNlY3Rpb24gYW5kIGNhbGN1bGF0ZQorICAgKiBwUmVvcmRlck9mZnN0W2pdICovCisgIGZvciAoaiA9IDA7IGogPCBudW1TZWN0aW9uOyBqKyspIHsKKyAgICBmb3IgKGkgPSBzZWFyY2hTdGFydDsgaSA8IG51bVNlY3Rpb247IGkrKykgeworICAgICAgaWYgKHBDb2RlYm9va1N3aXRjaFtpXSA9PSAwICYmCisgICAgICAgICAgKHBNaW5PZkNiUGFpcltwU29ydGVkQ29kZWJvb2tbal1dID09IHBDb2RlYm9va1tpXSB8fAorICAgICAgICAgICBwTWF4T2ZDYlBhaXJbcFNvcnRlZENvZGVib29rW2pdXSA9PSBwQ29kZWJvb2tbaV0pKSB7CiAgICAgICAgIHBDb2RlYm9va1N3aXRjaFtpXSA9IDE7Ci0gICAgICAgIHBTb3J0ZWRDb2RlYm9va1tqXSA9IHBDb2RlYm9va1tpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb3J0IGNvZGVib29rICovCi0gICAgICAgIHBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbltqXSA9IHBOdW1Db2Rld29yZEluU2VjdGlvbltpXTsgICAgICAvKiBzb3J0IE51bUNvZGV3b3JkSW5TZWN0aW9uICovCisgICAgICAgIHBTb3J0ZWRDb2RlYm9va1tqXSA9IHBDb2RlYm9va1tpXTsgLyogc29ydCBjb2RlYm9vayAqLworICAgICAgICBwTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb25bal0gPQorICAgICAgICAgICAgcE51bUNvZGV3b3JkSW5TZWN0aW9uW2ldOyAvKiBzb3J0IE51bUNvZGV3b3JkSW5TZWN0aW9uICovCiAKICAgICAgICAgc3RhcnRPZmZzZXQgPSAwOwotICAgICAgICBmb3IgKCBrID0gMDsgayA8IGk7IGsrKyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFrZSBlbnRyeSBpbiBwUmVvcmRlck9mZnN0ICovCisgICAgICAgIGZvciAoayA9IDA7IGsgPCBpOyBrKyspIHsgLyogbWFrZSBlbnRyeSBpbiBwUmVvcmRlck9mZnN0ICovCiAgICAgICAgICAgc3RhcnRPZmZzZXQgKz0gcE51bUNvZGV3b3JkSW5TZWN0aW9uW2tdIDw8IHBDYkRpbVNoaWZ0W3BDb2RlYm9va1trXV07CiAgICAgICAgIH0KLSAgICAgICAgcFJlb3JkZXJPZmZzZXRbal0gPSBzdGFydE9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9mZnNldCBmb3IgcmVvcmRlcmluZyB0aGUgY29kZXdvcmRzICovCisgICAgICAgIHBSZW9yZGVyT2Zmc2V0W2pdID0KKyAgICAgICAgICAgIHN0YXJ0T2Zmc2V0OyAvKiBvZmZzZXQgZm9yIHJlb3JkZXJpbmcgdGhlIGNvZGV3b3JkcyAqLwogCi0gICAgICAgIGlmKGkgPT0gc2VhcmNoU3RhcnQpIHsKLSAgICAgICAgICBVSU5UIGsgPSBpOwotICAgICAgICAgIHdoaWxlKHBDb2RlYm9va1N3aXRjaFtrKytdID09IDEpIHNlYXJjaFN0YXJ0Kys7CisgICAgICAgIGlmIChpID09IHNlYXJjaFN0YXJ0KSB7CisgICAgICAgICAgayA9IGk7CisgICAgICAgICAgd2hpbGUgKHBDb2RlYm9va1N3aXRjaFtrKytdID09IDEpIHNlYXJjaFN0YXJ0Kys7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgICB9CkBAIC04MjcsNDUgKzc4Niw0OSBAQAogICB9CiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzZWdtZW50YXRpb24sIHdoaWNoIGluY2x1ZGVzIG51bVNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgIGxlZnRTdGFydE9mU2VnbWVudCwgcmlnaHRTdGFydE9mU2VnbWVudCBhbmQgcmVtYWluaW5nQml0c0luU2VnbWVudC4KLSAgICAgICAgICAgICAgICAgICAgVGhlIHNlZ21lbnRhdGlvbiBjb3VsZCBiZSB2aXN1YWxpemVkIGEgYXMga2luZCBvZiAnb3ZlcmxheS1ncmlkJyBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbS1ibG9jayBob2xkaW5nIHRoZSBIQ1ItZW5jb2RlZCBxdWFudGl6ZWQtc3BlY3RyYWwtY29lZmZpY2llbnRzLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzZWdtZW50YXRpb24sIHdoaWNoIGluY2x1ZGVzCitudW1TZWdtZW50LCBsZWZ0U3RhcnRPZlNlZ21lbnQsIHJpZ2h0U3RhcnRPZlNlZ21lbnQgYW5kIHJlbWFpbmluZ0JpdHNJblNlZ21lbnQuCisgICAgICAgICAgICAgICAgICAgIFRoZSBzZWdtZW50YXRpb24gY291bGQgYmUgdmlzdWFsaXplZCBhIGFzIGtpbmQgb2YKKydvdmVybGF5LWdyaWQnIGZvciB0aGUgYml0c3RyZWFtLWJsb2NrIGhvbGRpbmcgdGhlIEhDUi1lbmNvZGVkCitxdWFudGl6ZWQtc3BlY3RyYWwtY29lZmZpY2llbnRzLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLXN0YXRpYyB2b2lkIEhjclByZXBhcmVTZWdtZW50YXRpb25HcmlkKEhfSENSX0lORk8gcEhjcikKLXsKLSAgVVNIT1JUICAgaSxqOwotICBVU0hPUlQgICBudW1TZWdtZW50ID0gMDsKLSAgVVNIT1JUICAgc2VnbWVudFN0YXJ0ID0gMDsKLSAgVUNIQVIgICAgc2VnbWVudFdpZHRoOwotICBVQ0hBUiAgICBsYXN0U2VnbWVudFdpZHRoOwotICBVQ0hBUiAgICBzb3J0ZWRDb2RlYm9vazsKLSAgVUNIQVIgICAgZW5kRmxhZyA9IDA7Ci0gIFVTSE9SVCAgIGludGVybWVkaWF0ZVJlc3VsdDsKK3N0YXRpYyB2b2lkIEhjclByZXBhcmVTZWdtZW50YXRpb25HcmlkKEhfSENSX0lORk8gcEhjcikgeworICBVU0hPUlQgaSwgajsKKyAgVVNIT1JUIG51bVNlZ21lbnQgPSAwOworICBJTlQgc2VnbWVudFN0YXJ0ID0gMDsKKyAgVUNIQVIgc2VnbWVudFdpZHRoOworICBVQ0hBUiBsYXN0U2VnbWVudFdpZHRoOworICBVQ0hBUiBzb3J0ZWRDb2RlYm9vazsKKyAgVUNIQVIgZW5kRmxhZyA9IDA7CisgIElOVCBpbnRlcm1lZGlhdGVSZXN1bHQ7CiAKLSAgU0NIQVIgICAgbGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQgICAgICAgPSAgIHBIY3ItPmRlY0luT3V0Lmxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkOwotICBTSE9SVCAgICBsZW5ndGhPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSA9ICAgcEhjci0+ZGVjSW5PdXQubGVuZ3RoT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGE7Ci0gIFVJTlQgICAgIG51bVNvcnRlZFNlY3Rpb24gICAgICAgICAgICAgID0gICBwSGNyLT5zZWN0aW9uSW5mby5udW1Tb3J0ZWRTZWN0aW9uOwotICBVQ0hBUiAgICpwU29ydGVkQ29kZWJvb2sgICAgICAgICAgICAgICA9ICAgcEhjci0+c2VjdGlvbkluZm8ucFNvcnRlZENvZGVib29rOwotICBVU0hPUlQgICpwTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb24gICA9ICAgcEhjci0+c2VjdGlvbkluZm8ucE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOwotICBVU0hPUlQgICpwTGVmdFN0YXJ0T2ZTZWdtZW50ICAgICAgICAgICA9ICAgcEhjci0+c2VnbWVudEluZm8ucExlZnRTdGFydE9mU2VnbWVudDsKLSAgVVNIT1JUICAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQgICAgICAgICAgPSAgIHBIY3ItPnNlZ21lbnRJbmZvLnBSaWdodFN0YXJ0T2ZTZWdtZW50OwotICBTQ0hBUiAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudCAgICAgICA9ICAgcEhjci0+c2VnbWVudEluZm8ucFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7Ci0gIFVTSE9SVCAgIGJpdHN0cmVhbUluZGV4ICAgICAgICAgICAgICAgID0gICBwSGNyLT5kZWNJbk91dC5iaXRzdHJlYW1JbmRleDsKLSAgY29uc3QgVUNIQVIgKnBNYXhDd0xlbmd0aCAgICAgICAgICAgICAgPSAgIHBIY3ItPnRhYmxlSW5mby5wTWF4Q3dMZW5ndGg7CisgIFNDSEFSIGxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkID0gcEhjci0+ZGVjSW5PdXQubGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQ7CisgIFNIT1JUIGxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhID0KKyAgICAgIHBIY3ItPmRlY0luT3V0Lmxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhOworICBVSU5UIG51bVNvcnRlZFNlY3Rpb24gPSBwSGNyLT5zZWN0aW9uSW5mby5udW1Tb3J0ZWRTZWN0aW9uOworICBVQ0hBUiAqcFNvcnRlZENvZGVib29rID0gcEhjci0+c2VjdGlvbkluZm8ucFNvcnRlZENvZGVib29rOworICBVU0hPUlQgKnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbiA9CisgICAgICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb247CisgIElOVCAqcExlZnRTdGFydE9mU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBMZWZ0U3RhcnRPZlNlZ21lbnQ7CisgIElOVCAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wUmlnaHRTdGFydE9mU2VnbWVudDsKKyAgU0NIQVIgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7CisgIElOVCBiaXRzdHJlYW1JbmRleCA9IHBIY3ItPmRlY0luT3V0LmJpdHN0cmVhbUluZGV4OworICBjb25zdCBVQ0hBUiAqcE1heEN3TGVuZ3RoID0gYU1heEN3TGVuOwogCi0gIGZvciAoIGk9bnVtU29ydGVkU2VjdGlvbjsgaSAhPSAwOyBpLS0gKSB7CisgIGZvciAoaSA9IG51bVNvcnRlZFNlY3Rpb247IGkgIT0gMDsgaS0tKSB7CiAgICAgc29ydGVkQ29kZWJvb2sgPSAqcFNvcnRlZENvZGVib29rKys7Ci0gICAgc2VnbWVudFdpZHRoID0gRkRLbWluKHBNYXhDd0xlbmd0aFtzb3J0ZWRDb2RlYm9va10sbGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQpOworICAgIHNlZ21lbnRXaWR0aCA9CisgICAgICAgIGZNaW4oKElOVClwTWF4Q3dMZW5ndGhbc29ydGVkQ29kZWJvb2tdLCAoSU5UKWxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkKTsKIAotICAgIGZvciAoIGogPSAqcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOyBqICE9IDAgOyBqLS0gKSB7CisgICAgZm9yIChqID0gKnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbjsgaiAhPSAwOyBqLS0pIHsKICAgICAgIC8qIHdpZHRoIGFsbG93cyBhIG5ldyBzZWdtZW50ICovCiAgICAgICBpbnRlcm1lZGlhdGVSZXN1bHQgPSBiaXRzdHJlYW1JbmRleCArIHNlZ21lbnRTdGFydDsKLSAgICAgIGlmICggKHNlZ21lbnRTdGFydCArIHNlZ21lbnRXaWR0aCkgPD0gbGVuZ3RoT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEgKSB7Ci0gICAgICAgIC8qIHN0b3JlIHNlZ21lbnQgc3RhcnQsIHNlZ21lbnQgbGVuZ3RoIGFuZCBpbmNyZW1lbnQgdGhlIG51bWJlciBvZiBzZWdtZW50cyAqLworICAgICAgaWYgKChzZWdtZW50U3RhcnQgKyBzZWdtZW50V2lkdGgpIDw9IGxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhKSB7CisgICAgICAgIC8qIHN0b3JlIHNlZ21lbnQgc3RhcnQsIHNlZ21lbnQgbGVuZ3RoIGFuZCBpbmNyZW1lbnQgdGhlIG51bWJlciBvZgorICAgICAgICAgKiBzZWdtZW50cyAqLwogICAgICAgICAqcExlZnRTdGFydE9mU2VnbWVudCsrID0gaW50ZXJtZWRpYXRlUmVzdWx0OwogICAgICAgICAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQrKyA9IGludGVybWVkaWF0ZVJlc3VsdCArIHNlZ21lbnRXaWR0aCAtIDE7CiAgICAgICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudCsrID0gc2VnbWVudFdpZHRoOwpAQCAtODgyLDcgKzg0NSw4IEBACiAKICAgICAgICAgbGFzdFNlZ21lbnRXaWR0aCA9IGxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhIC0gc2VnbWVudFN0YXJ0OwogICAgICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgPSBsYXN0U2VnbWVudFdpZHRoOwotICAgICAgICAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQgPSBiaXRzdHJlYW1JbmRleCArIHNlZ21lbnRTdGFydCArIGxhc3RTZWdtZW50V2lkdGggLSAxOworICAgICAgICAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQgPQorICAgICAgICAgICAgYml0c3RyZWFtSW5kZXggKyBzZWdtZW50U3RhcnQgKyBsYXN0U2VnbWVudFdpZHRoIC0gMTsKICAgICAgICAgZW5kRmxhZyA9IDE7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQpAQCAtODkzLDUyICs4NTcsNTAgQEAKICAgICB9CiAgIH0KICAgcEhjci0+c2VnbWVudEluZm8ubnVtU2VnbWVudCA9IG51bVNlZ21lbnQ7Ci0KIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGFkYXB0cyB0aGUgc29ydGVkIHNlY3Rpb24gYm91bmRhcmllcyB0byB0aGUgYm91bmRhcmllcyBvZgotICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb24uIElmIHRoZSBzZWN0aW9uIGxlbmd0aHMgZG9lcyBub3QgZml0IGNvbXBsZXRlbHkgaW50byB0aGUKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCBzZWdtZW50LCB0aGUgc2VjdGlvbiBpcyBzcGl0dGVkIGludG8gdHdvIHNvIGNhbGxlZCAnZXh0ZW5kZWQKLSAgICAgICAgICAgICAgICAgICAgc2VjdGlvbnMnLiBUaGUgZXh0ZW5kZWQtc2VjdGlvbi1pbmZvIChwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGluCi0gICAgICAgICAgICAgICAgICAgIGFuZCBwRXh0ZW5kZWRTb3J0ZWRDb2RlYm9vaykgaXMgdXBkYXRlZCBpbiB0aGlzIGNhc2UuCisgICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gYWRhcHRzIHRoZSBzb3J0ZWQgc2VjdGlvbiBib3VuZGFyaWVzIHRvIHRoZQorYm91bmRhcmllcyBvZiBzZWdtZW50YXRpb24uIElmIHRoZSBzZWN0aW9uIGxlbmd0aHMgZG9lcyBub3QgZml0IGNvbXBsZXRlbHkgaW50bwordGhlIGN1cnJlbnQgc2VnbWVudCwgdGhlIHNlY3Rpb24gaXMgc3BpdHRlZCBpbnRvIHR3byBzbyBjYWxsZWQgJ2V4dGVuZGVkCisgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25zJy4gVGhlIGV4dGVuZGVkLXNlY3Rpb24taW5mbworKHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW4gYW5kIHBFeHRlbmRlZFNvcnRlZENvZGVib29rKSBpcyB1cGRhdGVkIGluCit0aGlzIGNhc2UuCiAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KIAotc3RhdGljIHZvaWQgSGNyRXh0ZW5kZWRTZWN0aW9uSW5mbyhIX0hDUl9JTkZPIHBIY3IpCi17Ci0gIFVJTlQgICAgc3J0U2VjQ250ID0gMDsgICAgICAgICAvKiBjb3VudGVyIGZvciBzb3J0ZWQgc2VjdGlvbnMgKi8KLSAgVUlOVCAgICB4U3J0U2NDbnQgPSAwOyAgICAgICAgIC8qIGNvdW50ZXIgZm9yIGV4dGVuZGVkIHNvcnRlZCBzZWN0aW9ucyAqLwotICBVSU5UICAgIHJlbWFpbk51bUN3SW5Tb3J0U2VjOwotICBVSU5UICAgIGluU2VnbWVudFJlbWFpbk51bUNXOworc3RhdGljIHZvaWQgSGNyRXh0ZW5kZWRTZWN0aW9uSW5mbyhIX0hDUl9JTkZPIHBIY3IpIHsKKyAgVUlOVCBzcnRTZWNDbnQgPSAwOyAvKiBjb3VudGVyIGZvciBzb3J0ZWQgc2VjdGlvbnMgKi8KKyAgVUlOVCB4U3J0U2NDbnQgPSAwOyAvKiBjb3VudGVyIGZvciBleHRlbmRlZCBzb3J0ZWQgc2VjdGlvbnMgKi8KKyAgVUlOVCByZW1haW5OdW1Dd0luU29ydFNlYzsKKyAgVUlOVCBpblNlZ21lbnRSZW1haW5OdW1DVzsKIAotICBVSU5UICAgIG51bVNvcnRlZFNlY3Rpb24gICAgICAgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLm51bVNvcnRlZFNlY3Rpb247Ci0gIFVDSEFSICAqcFNvcnRlZENvZGVib29rICAgICAgICAgICAgID0gcEhjci0+c2VjdGlvbkluZm8ucFNvcnRlZENvZGVib29rOwotICBVU0hPUlQgKnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbiA9IHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbjsKLSAgVUNIQVIgICpwRXh0ZW5kZWRTb3J0ZWRDb0JvICAgICAgICAgPSBwSGNyLT5zZWN0aW9uSW5mby5wRXh0ZW5kZWRTb3J0ZWRDb2RlYm9vazsKLSAgVVNIT1JUICpwTnVtRXh0U29ydEN3SW5TZWN0ICAgICAgICAgPSBwSGNyLT5zZWN0aW9uSW5mby5wTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbjsKLSAgVUlOVCAgICBudW1TZWdtZW50ICAgICAgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5udW1TZWdtZW50OwotI2lmIERFVEVDVF9UT09fTE9OR19DV19SRUFEUwotICBVQ0hBUiAgKnBNYXhMZW5PZkNiSW5FeHRTcnRTZWMgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLnBNYXhMZW5PZkNiSW5FeHRTcnRTZWM7Ci0gIFNDSEFSICAgbGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQgICAgID0gcEhjci0+ZGVjSW5PdXQubGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQ7Ci0gIGNvbnN0IFVDSEFSICAgKnBNYXhDd0xlbmd0aCAgICAgICAgID0gcEhjci0+dGFibGVJbmZvLnBNYXhDd0xlbmd0aDsKLSNlbmRpZgorICBVSU5UIG51bVNvcnRlZFNlY3Rpb24gPSBwSGNyLT5zZWN0aW9uSW5mby5udW1Tb3J0ZWRTZWN0aW9uOworICBVQ0hBUiAqcFNvcnRlZENvZGVib29rID0gcEhjci0+c2VjdGlvbkluZm8ucFNvcnRlZENvZGVib29rOworICBVU0hPUlQgKnBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbiA9CisgICAgICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb247CisgIFVDSEFSICpwRXh0ZW5kZWRTb3J0ZWRDb0JvID0gcEhjci0+c2VjdGlvbkluZm8ucEV4dGVuZGVkU29ydGVkQ29kZWJvb2s7CisgIFVTSE9SVCAqcE51bUV4dFNvcnRDd0luU2VjdCA9CisgICAgICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbjsKKyAgVUlOVCBudW1TZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ubnVtU2VnbWVudDsKKyAgVUNIQVIgKnBNYXhMZW5PZkNiSW5FeHRTcnRTZWMgPSBwSGNyLT5zZWN0aW9uSW5mby5wTWF4TGVuT2ZDYkluRXh0U3J0U2VjOworICBTQ0hBUiBsZW5ndGhPZkxvbmdlc3RDb2Rld29yZCA9IHBIY3ItPmRlY0luT3V0Lmxlbmd0aE9mTG9uZ2VzdENvZGV3b3JkOworICBjb25zdCBVQ0hBUiAqcE1heEN3TGVuZ3RoID0gYU1heEN3TGVuOwogCiAgIHJlbWFpbk51bUN3SW5Tb3J0U2VjID0gcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uW3NydFNlY0NudF07CiAgIGluU2VnbWVudFJlbWFpbk51bUNXID0gbnVtU2VnbWVudDsKIAogICB3aGlsZSAoc3J0U2VjQ250IDwgbnVtU29ydGVkU2VjdGlvbikgewogICAgIGlmIChpblNlZ21lbnRSZW1haW5OdW1DVyA8IHJlbWFpbk51bUN3SW5Tb3J0U2VjKSB7Ci0KICAgICAgIHBOdW1FeHRTb3J0Q3dJblNlY3RbeFNydFNjQ250XSA9IGluU2VnbWVudFJlbWFpbk51bUNXOwogICAgICAgcEV4dGVuZGVkU29ydGVkQ29Cb1t4U3J0U2NDbnRdID0gcFNvcnRlZENvZGVib29rW3NydFNlY0NudF07CiAKICAgICAgIHJlbWFpbk51bUN3SW5Tb3J0U2VjIC09IGluU2VnbWVudFJlbWFpbk51bUNXOwogICAgICAgaW5TZWdtZW50UmVtYWluTnVtQ1cgPSBudW1TZWdtZW50OwotICAgICAgLyogZGF0YSBvZiBhIHNvcnRlZCBzZWN0aW9uIHdhcyBub3QgaW50ZWdyYXRlZCBpbiBleHRlbmRlZCBzb3J0ZWQgc2VjdGlvbiAqLwotICAgIH0KLSAgICBlbHNlIGlmIChpblNlZ21lbnRSZW1haW5OdW1DVyA9PSByZW1haW5OdW1Dd0luU29ydFNlYykgeworICAgICAgLyogZGF0YSBvZiBhIHNvcnRlZCBzZWN0aW9uIHdhcyBub3QgaW50ZWdyYXRlZCBpbiBleHRlbmRlZCBzb3J0ZWQgc2VjdGlvbgorICAgICAgICovCisgICAgfSBlbHNlIGlmIChpblNlZ21lbnRSZW1haW5OdW1DVyA9PSByZW1haW5OdW1Dd0luU29ydFNlYykgewogICAgICAgcE51bUV4dFNvcnRDd0luU2VjdFt4U3J0U2NDbnRdID0gaW5TZWdtZW50UmVtYWluTnVtQ1c7CiAgICAgICBwRXh0ZW5kZWRTb3J0ZWRDb0JvW3hTcnRTY0NudF0gPSBwU29ydGVkQ29kZWJvb2tbc3J0U2VjQ250XTsKIApAQCAtOTQ2LDc0ICs5MDgsNjYgQEAKICAgICAgIHJlbWFpbk51bUN3SW5Tb3J0U2VjID0gcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uW3NydFNlY0NudF07CiAgICAgICBpblNlZ21lbnRSZW1haW5OdW1DVyA9IG51bVNlZ21lbnQ7CiAgICAgICAvKiBkYXRhIG9mIGEgc29ydGVkIHNlY3Rpb24gd2FzIGludGVncmF0ZWQgaW4gZXh0ZW5kZWQgc29ydGVkIHNlY3Rpb24gKi8KLSAgICB9Ci0gICAgZWxzZSB7IC8qIGluU2VnbWVudFJlbWFpbk51bUNXID4gcmVtYWluTnVtQ3dJblNvcnRTZWMgKi8KKyAgICB9IGVsc2UgeyAvKiBpblNlZ21lbnRSZW1haW5OdW1DVyA+IHJlbWFpbk51bUN3SW5Tb3J0U2VjICovCiAgICAgICBwTnVtRXh0U29ydEN3SW5TZWN0W3hTcnRTY0NudF0gPSByZW1haW5OdW1Dd0luU29ydFNlYzsKICAgICAgIHBFeHRlbmRlZFNvcnRlZENvQm9beFNydFNjQ250XSA9IHBTb3J0ZWRDb2RlYm9va1tzcnRTZWNDbnRdOwogCi0KICAgICAgIGluU2VnbWVudFJlbWFpbk51bUNXIC09IHJlbWFpbk51bUN3SW5Tb3J0U2VjOwogICAgICAgc3J0U2VjQ250Kys7CiAgICAgICByZW1haW5OdW1Dd0luU29ydFNlYyA9IHBOdW1Tb3J0ZWRDb2Rld29yZEluU2VjdGlvbltzcnRTZWNDbnRdOwogICAgICAgLyogZGF0YSBvZiBhIHNvcnRlZCBzZWN0aW9uIHdhcyBpbnRlZ3JhdGVkIGluIGV4dGVuZGVkIHNvcnRlZCBzZWN0aW9uICovCiAgICAgfQotI2lmIERFVEVDVF9UT09fTE9OR19DV19SRUFEUwotICAgIHBNYXhMZW5PZkNiSW5FeHRTcnRTZWNbeFNydFNjQ250XSA9IEZES21pbihwTWF4Q3dMZW5ndGhbcEV4dGVuZGVkU29ydGVkQ29Cb1t4U3J0U2NDbnRdXSxsZW5ndGhPZkxvbmdlc3RDb2Rld29yZCk7Ci0jZW5kaWYKLQotCisgICAgcE1heExlbk9mQ2JJbkV4dFNydFNlY1t4U3J0U2NDbnRdID0KKyAgICAgICAgZk1pbigoSU5UKXBNYXhDd0xlbmd0aFtwRXh0ZW5kZWRTb3J0ZWRDb0JvW3hTcnRTY0NudF1dLAorICAgICAgICAgICAgIChJTlQpbGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQpOwogCiAgICAgeFNydFNjQ250ICs9IDE7CiAKLSAgICBpZiAoIHhTcnRTY0NudCA+PSAoTUFYX1NGQl9IQ1IgKyBNQVhfSENSX1NFVFMpICkgeworICAgIGlmICh4U3J0U2NDbnQgPj0gKE1BWF9TRkJfSENSICsgTUFYX0hDUl9TRVRTKSkgewogICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gRVhURU5ERURfU09SVEVEX0NPVU5URVJfT1ZFUkZMT1c7CiAgICAgICByZXR1cm47CiAgICAgfQotCiAgIH0KICAgcE51bUV4dFNvcnRDd0luU2VjdFt4U3J0U2NDbnRdID0gMDsKLQogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIGV4dGVuZGVkIHNvcnRlZCBzZWN0aW9ucyB3aGljaAotICAgICAgICAgICAgICAgICAgICBiZWxvbmcgdG8gdGhlIHNldHMuIEVhY2ggc2V0IGZyb20gc2V0IDAgKG9uZSBhbmQgb25seSBzZXQgZm9yIHRoZSBQQ1dzKQotICAgICAgICAgICAgICAgICAgICB0aWxsIHRvIHRoZSBsYXN0IHNldCBnZXRzIGEgZW50cnkgaW4gdGhlIGFycmF5IHRvIHdoaWNoCisgICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIGV4dGVuZGVkIHNvcnRlZAorc2VjdGlvbnMgd2hpY2ggYmVsb25nIHRvIHRoZSBzZXRzLiBFYWNoIHNldCBmcm9tIHNldCAwIChvbmUgYW5kIG9ubHkgc2V0IGZvciB0aGUKK1BDV3MpIHRpbGwgdG8gdGhlIGxhc3Qgc2V0IGdldHMgYSBlbnRyeSBpbiB0aGUgYXJyYXkgdG8gd2hpY2gKICAgICAgICAgICAgICAgICAgICAgJ3BOdW1FeHRlbmRlZFNvcnRlZFNlY3RpbnNJblNldHMnIHBvaW50cyB0by4KIAotICAgICAgICAgICAgICAgICAgICBDYWxjdWxhdGlvbjogVGhlIGVudHJ5cyBpbiBwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGluIGFyZSBhZGRlZAotICAgICAgICAgICAgICAgICAgICB1bnRpbGwgdGhlIHZhbHVlIG51bVNlZ21lbnQgaXMgcmVhY2hlZC4gVGhlbiB0aGUgc3VtX3ZhcmlhYmxlIGlzIGNsZWFyZWQKLSAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBjYWxjdWxhdGlvbiBzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nLiBBcyBtdWNoIGV4dGVuZGVkIHNvcnRlZAotICAgICAgICAgICAgICAgICAgICBTZWN0aW9ucyBhcmUgc3VtbWVkIHVwIHRvIHJlYWNoIHRoZSB2YWx1ZSBudW1TZWdtZW50LCBhcyBtdWNoIGlzIHRoZQotICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGVudHJ5IGluICpwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGluLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIERlcml2ZU51bWJlck9mRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0cyhVSU5UICAgIG51bVNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICpwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgIG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICpwTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgIG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHgpCi17Ci0gIFVTSE9SVCAgY291bnRlciA9IDA7Ci0gIFVJTlQgICAgY3dTdW0gICA9IDA7Ci0gIFVTSE9SVCAqcE51bUV4U29ydEN3SW5TZWMgICA9IHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOworICAgICAgICAgICAgICAgICAgICBDYWxjdWxhdGlvbjogVGhlIGVudHJ5cyBpbgorcE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3RpbiBhcmUgYWRkZWQgdW50aWxsIHRoZSB2YWx1ZSBudW1TZWdtZW50IGlzCityZWFjaGVkLiBUaGVuIHRoZSBzdW1fdmFyaWFibGUgaXMgY2xlYXJlZCBhbmQgdGhlIGNhbGN1bGF0aW9uIHN0YXJ0cyBmcm9tIHRoZQorYmVnaW5uaW5nLiBBcyBtdWNoIGV4dGVuZGVkIHNvcnRlZCBTZWN0aW9ucyBhcmUgc3VtbWVkIHVwIHRvIHJlYWNoIHRoZSB2YWx1ZQorbnVtU2VnbWVudCwgYXMgbXVjaCBpcyB0aGUgY3VycmVudCBlbnRyeSBpbiAqcE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpbi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIHZvaWQgRGVyaXZlTnVtYmVyT2ZFeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzKAorICAgIFVJTlQgbnVtU2VnbWVudCwgVVNIT1JUICpwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbiwKKyAgICBpbnQgbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCwKKyAgICBVU0hPUlQgKnBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzLAorICAgIGludCBudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4KSB7CisgIFVTSE9SVCBjb3VudGVyID0gMDsKKyAgVUlOVCBjd1N1bSA9IDA7CisgIFVTSE9SVCAqcE51bUV4U29ydEN3SW5TZWMgPSBwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbjsKICAgVVNIT1JUICpwTnVtRXhTb3J0U2VjSW5TZXRzID0gcE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHM7CiAKLSAgd2hpbGUgKHBOdW1FeFNvcnRDd0luU2VjW251bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHhdICE9IDApCi0gIHsKKyAgd2hpbGUgKHBOdW1FeFNvcnRDd0luU2VjW251bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHhdICE9IDApIHsKICAgICBjd1N1bSArPSBwTnVtRXhTb3J0Q3dJblNlY1tudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4XTsKICAgICBudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4Kys7Ci0gICAgaWYgKG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHggPj0gKE1BWF9TRkJfSENSK01BWF9IQ1JfU0VUUykpIHsKKyAgICBpZiAobnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCA+PSAoTUFYX1NGQl9IQ1IgKyBNQVhfSENSX1NFVFMpKSB7CiAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlmIChjd1N1bSA+IG51bVNlZ21lbnQpIHsKICAgICAgIHJldHVybjsKICAgICB9CiAgICAgY291bnRlcisrOwotICAgIGlmIChjb3VudGVyID4gMTAyNC80KSB7CisgICAgaWYgKGNvdW50ZXIgPiAxMDI0IC8gNCkgewogICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBpZiAoIGN3U3VtID09IG51bVNlZ21lbnQgKSB7CisgICAgaWYgKGN3U3VtID09IG51bVNlZ21lbnQpIHsKICAgICAgIHBOdW1FeFNvcnRTZWNJblNldHNbbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeF0gPSBjb3VudGVyOwogICAgICAgbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeCsrOwogICAgICAgaWYgKG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHggPj0gTUFYX0hDUl9TRVRTKSB7CkBAIC0xMDIzLDk5ICs5NzcsMTA5IEBACiAgICAgICBjd1N1bSA9IDA7CiAgICAgfQogICB9Ci0gIHBOdW1FeFNvcnRTZWNJblNldHNbbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeF0gPSBjb3VudGVyOyAgIC8qIHNhdmUgbGFzdCBlbnRyeSBmb3IgdGhlIGxhc3QgLSBwcm9iYWJseSBzaG9ydGVyIC0gc2V0ICovCisgIHBOdW1FeFNvcnRTZWNJblNldHNbbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeF0gPQorICAgICAgY291bnRlcjsgLyogc2F2ZSBsYXN0IGVudHJ5IGZvciB0aGUgbGFzdCAtIHByb2JhYmx5IHNob3J0ZXIgLSBzZXQgKi8KIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgYWxsIHByaW9yaXR5IGNvZGV3b3JkcyAoUENXcykgaW4gYSBzcGVjdHJ1bSAod2l0aGluCi0gICAgICAgICAgICAgICAgICAgIHNldCAwKS4gVGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBQQ1dzIGlzIG1hbmFnZWQgaW4gdHdvIGxvb3BzLiBUaGUKLSAgICAgICAgICAgICAgICAgICAgbG9vcGNvdW50ZXIgb2YgdGhlIG91dGVyIGxvb3AgaXMgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBwb2ludGVyCi0gICAgICAgICAgICAgICAgICAgIHBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzIHBvaW50cyB0by4gVGhpcyB2YWx1ZSByZXByZXNlbnRzIHRoZQotICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgZXh0ZW5kZWQgc29ydGVkIHNlY3Rpb25zIHdpdGhpbiBzZXQgMC4KLSAgICAgICAgICAgICAgICAgICAgVGhlIGxvb3Bjb3VudGVyIG9mIHRoZSBpbm5lciBsb29wIGlzIHNldCB0byB0aGUgZmlyc3QgdmFsdWUgcG9pbnRlcgotICAgICAgICAgICAgICAgICAgICBwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGluIHBvaW50cyB0by4gVGhlIHZhbHVlIHJlcHJlc2VudHMgdGhlCi0gICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBleHRlbmRlZCBzb3J0ZWQgY29kZXdvcmRzIGluIHNlY3Rpb25zICh0aGUgb3JpZ2luYWwgc2VjdGlvbnMgaGF2ZQotICAgICAgICAgICAgICAgICAgICBiZWVuIHNwbGl0dGVkIHRvIGdvIGFsb25nIHdpdGggdGhlIGJvcmRlcnMgb2YgdGhlIHNldHMpLgotICAgICAgICAgICAgICAgICAgICBFYWNoIHRpbWUgdGhlIG51bWJlciBvZiB0aGUgZXh0ZW5kZWQgc29ydGVkIGNvZGV3b3JkcyBpbiBzZWN0aW9ucyBhcmUgZGUtCi0gICAgICAgICAgICAgICAgICAgIGNvZGVkLCB0aGUgcG9pbnRlciAncE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3RpbicgaXMgaW5jcmVtZW50ZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgb25lLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIERlY29kZVBDV3MoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIEhfSENSX0lORk8gcEhjcikKLXsKLSAgVUlOVCAgICAgICAgIGk7Ci0gIFVTSE9SVCAgICAgICBleHRTb3J0U2VjOwotICBVU0hPUlQgICAgICAgY3VyRXh0U29ydEN3SW5TZWM7Ci0gIFVDSEFSICAgICAgICBjb2RlYm9vazsKLSAgVUNIQVIgICAgICAgIGRpbWVuc2lvbjsKLSAgY29uc3QgVUlOVCAgKnBDdXJyZW50VHJlZTsKKyAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiBkZWNvZGVzIGFsbCBwcmlvcml0eSBjb2Rld29yZHMgKFBDV3MpIGluIGEKK3NwZWN0cnVtICh3aXRoaW4gc2V0IDApLiBUaGUgY2FsY3VsYXRpb24gb2YgdGhlIFBDV3MgaXMgbWFuYWdlZCBpbiB0d28gbG9vcHMuCitUaGUgbG9vcGNvdW50ZXIgb2YgdGhlIG91dGVyIGxvb3AgaXMgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgIHBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzIHBvaW50cyB0by4gVGhpcyB2YWx1ZQorcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGV4dGVuZGVkIHNvcnRlZCBzZWN0aW9ucyB3aXRoaW4gc2V0IDAuIFRoZSBsb29wY291bnRlcgorb2YgdGhlIGlubmVyIGxvb3AgaXMgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgIHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW4gcG9pbnRzIHRvLiBUaGUgdmFsdWUKK3JlcHJlc2VudHMgdGhlIG51bWJlciBvZiBleHRlbmRlZCBzb3J0ZWQgY29kZXdvcmRzIGluIHNlY3Rpb25zICh0aGUgb3JpZ2luYWwKK3NlY3Rpb25zIGhhdmUgYmVlbiBzcGxpdHRlZCB0byBnbyBhbG9uZyB3aXRoIHRoZSBib3JkZXJzIG9mIHRoZSBzZXRzKS4gRWFjaCB0aW1lCit0aGUgbnVtYmVyIG9mIHRoZSBleHRlbmRlZCBzb3J0ZWQgY29kZXdvcmRzIGluIHNlY3Rpb25zIGFyZSBkZS0gY29kZWQsIHRoZQorcG9pbnRlciAncE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3RpbicgaXMgaW5jcmVtZW50ZWQgYnkgb25lLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgdm9pZCBEZWNvZGVQQ1dzKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBIX0hDUl9JTkZPIHBIY3IpIHsKKyAgVUlOVCBpOworICBVU0hPUlQgZXh0U29ydFNlYzsKKyAgVVNIT1JUIGN1ckV4dFNvcnRDd0luU2VjOworICBVQ0hBUiBjb2RlYm9vazsKKyAgVUNIQVIgZGltZW5zaW9uOworICBjb25zdCBVSU5UICpwQ3VycmVudFRyZWU7CiAgIGNvbnN0IFNDSEFSICpwUXVhbnRWYWxCYXNlOwogICBjb25zdCBTQ0hBUiAqcFF1YW50VmFsOwogCi0gIFVTSE9SVCAgICAgICpwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbiA9IHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOwotICBpbnQgICAgICAgICAgbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCA9IHBIY3ItPnNlY3Rpb25JbmZvLm51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHg7Ci0gIFVDSEFSICAgICAgICpwRXh0ZW5kZWRTb3J0ZWRDb2RlYm9vayAgICAgICAgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLnBFeHRlbmRlZFNvcnRlZENvZGVib29rOwotICBpbnQgICAgICAgICAgZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeCAgICAgICAgICAgPSBwSGNyLT5zZWN0aW9uSW5mby5leHRlbmRlZFNvcnRlZENvZGVib29rSWR4OwotICBVU0hPUlQgICAgICAqcE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHMgICAgPSBwSGNyLT5zZWN0aW9uSW5mby5wTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0czsKLSAgaW50ICAgICAgICAgIG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHggID0gcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeDsKLSAgRklYUF9EQkwgICAgKnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cyAgICAgID0gU1BFQ19MT05HKHBIY3ItPmRlY0luT3V0LnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UpOwotICBpbnQgICAgICAgICAgcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHggICAgPSBwSGNyLT5kZWNJbk91dC5xdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeDsKLSAgVVNIT1JUICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQgICAgICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucExlZnRTdGFydE9mU2VnbWVudDsKLSAgU0NIQVIgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50ICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7Ci0jaWYgREVURUNUX1RPT19MT05HX0NXX1JFQURTCi0gIFVDSEFSICAgICAgICpwTWF4TGVuT2ZDYkluRXh0U3J0U2VjICAgICAgICAgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLnBNYXhMZW5PZkNiSW5FeHRTcnRTZWM7Ci0gIGludCAgICAgICAgICBtYXhMZW5PZkNiSW5FeHRTcnRTZWNJZHggICAgICAgICAgICA9IHBIY3ItPnNlY3Rpb25JbmZvLm1heExlbk9mQ2JJbkV4dFNydFNlY0lkeDsKLSAgVUNIQVIgICAgICAgIG1heEFsbG93ZWRDd0xlbjsKLSAgaW50ICAgICAgICAgIG51bURlY29kZWRCaXRzOwotI2VuZGlmCi0gIGNvbnN0IFVDSEFSICpwQ2JEaW1lbnNpb24gPSAgcEhjci0+dGFibGVJbmZvLnBDYkRpbWVuc2lvbjsKLSAgY29uc3QgVUNIQVIgKnBDYlNpZ24gICAgICA9ICBwSGNyLT50YWJsZUluZm8ucENiU2lnbjsKKyAgVVNIT1JUICpwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbiA9CisgICAgICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbjsKKyAgaW50IG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHggPQorICAgICAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeDsKKyAgVUNIQVIgKnBFeHRlbmRlZFNvcnRlZENvZGVib29rID0gcEhjci0+c2VjdGlvbkluZm8ucEV4dGVuZGVkU29ydGVkQ29kZWJvb2s7CisgIGludCBleHRlbmRlZFNvcnRlZENvZGVib29rSWR4ID0gcEhjci0+c2VjdGlvbkluZm8uZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeDsKKyAgVVNIT1JUICpwTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0cyA9CisgICAgICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0czsKKyAgaW50IG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHggPQorICAgICAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeDsKKyAgRklYUF9EQkwgKnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cyA9CisgICAgICBTUEVDX0xPTkcocEhjci0+ZGVjSW5PdXQucFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzQmFzZSk7CisgIGludCBxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCA9CisgICAgICBwSGNyLT5kZWNJbk91dC5xdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeDsKKyAgSU5UICpwTGVmdFN0YXJ0T2ZTZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucExlZnRTdGFydE9mU2VnbWVudDsKKyAgU0NIQVIgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7CisgIFVDSEFSICpwTWF4TGVuT2ZDYkluRXh0U3J0U2VjID0gcEhjci0+c2VjdGlvbkluZm8ucE1heExlbk9mQ2JJbkV4dFNydFNlYzsKKyAgaW50IG1heExlbk9mQ2JJbkV4dFNydFNlY0lkeCA9IHBIY3ItPnNlY3Rpb25JbmZvLm1heExlbk9mQ2JJbkV4dFNydFNlY0lkeDsKKyAgVUNIQVIgbWF4QWxsb3dlZEN3TGVuOworICBpbnQgbnVtRGVjb2RlZEJpdHM7CisgIGNvbnN0IFVDSEFSICpwQ2JEaW1lbnNpb24gPSBhRGltQ2I7CisgIGNvbnN0IFVDSEFSICpwQ2JTaWduID0gYVNpZ25DYjsKIAogICAvKiBjbGVhciByZXN1bHQgYXJyYXkgKi8KLSAgLy9wUVNDID0gJnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c1txdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeF07Ci0gIC8vcFFTQyA9ICpwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHM7Ci0KLSAgRkRLbWVtY2xlYXIocFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzK3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4LDEwMjQqc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNsZWFyKHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cyArIHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4LAorICAgICAgICAgICAgICAxMDI0ICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKICAgLyogZGVjb2RlIGFsbCBQQ1dzIGluIHRoZSBleHRlbmRlZCBzb3J0ZWQgc2VjdGlvbihzKSBiZWxvbmdpbmcgdG8gc2V0IDAgKi8KLSAgZm9yICggZXh0U29ydFNlYyA9IHBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzW251bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHhdOyBleHRTb3J0U2VjICE9IDA7IGV4dFNvcnRTZWMtLSApIHsKLQotICAgIGNvZGVib29rICAgICAgICA9ICBwRXh0ZW5kZWRTb3J0ZWRDb2RlYm9va1tleHRlbmRlZFNvcnRlZENvZGVib29rSWR4XTsgICAvKiBnZXQgY29kZWJvb2sgZm9yIHRoaXMgZXh0ZW5kZWQgc29ydGVkIHNlY3Rpb24gYW5kIGluY3JlbWVudCBwdHIgdG8gY2Igb2YgbmV4dCBleHQuIHNvcnQgc2VjICovCisgIGZvciAoZXh0U29ydFNlYyA9CisgICAgICAgICAgIHBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzW251bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHhdOworICAgICAgIGV4dFNvcnRTZWMgIT0gMDsgZXh0U29ydFNlYy0tKSB7CisgICAgY29kZWJvb2sgPQorICAgICAgICBwRXh0ZW5kZWRTb3J0ZWRDb2RlYm9va1tleHRlbmRlZFNvcnRlZENvZGVib29rSWR4XTsgLyogZ2V0IGNvZGVib29rIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBleHRlbmRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkIHNlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBpbmNyZW1lbnQgcHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBjYiBvZiBuZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQuIHNvcnQgc2VjICovCiAgICAgZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeCsrOwotICAgIGlmIChleHRlbmRlZFNvcnRlZENvZGVib29rSWR4ID49IChNQVhfU0ZCX0hDUitNQVhfSENSX1NFVFMpKSB7CisgICAgaWYgKGV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHggPj0gKE1BWF9TRkJfSENSICsgTUFYX0hDUl9TRVRTKSkgewogICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBkaW1lbnNpb24gICAgICAgPSAgcENiRGltZW5zaW9uW2NvZGVib29rXTsgICAgICAgICAvKiBnZXQgZGltZW5zaW9uIG9mIGNvZGVib29rIG9mIHRoaXMgZXh0ZW5kZWQgc29ydC4gc2VjLiAqLwotICAgIHBDdXJyZW50VHJlZSAgICA9ICBhSHVmZlRhYmxlICBbY29kZWJvb2tdOyAgICAgICAgIC8qIGNvbnZlcnQgY29kZWJvb2sgdG8gcG9pbnRlciB0byBRU0NzICovCi0gICAgcFF1YW50VmFsQmFzZSAgID0gIGFRdWFudFRhYmxlIFtjb2RlYm9va107ICAgICAgICAgLyogY29udmVydCBjb2RlYm9vayB0byBpbmRleCB0byB0YWJsZSBvZiBRU0NzICovCi0jaWYgREVURUNUX1RPT19MT05HX0NXX1JFQURTCisgICAgZGltZW5zaW9uID0gcENiRGltZW5zaW9uW2NvZGVib29rXTsgLyogZ2V0IGRpbWVuc2lvbiBvZiBjb2RlYm9vayBvZiB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWQgc29ydC4gc2VjLiAqLworICAgIHBDdXJyZW50VHJlZSA9CisgICAgICAgIGFIdWZmVGFibGVbY29kZWJvb2tdOyAvKiBjb252ZXJ0IGNvZGVib29rIHRvIHBvaW50ZXIgdG8gUVNDcyAqLworICAgIHBRdWFudFZhbEJhc2UgPQorICAgICAgICBhUXVhbnRUYWJsZVtjb2RlYm9va107IC8qIGNvbnZlcnQgY29kZWJvb2sgdG8gaW5kZXggdG8gdGFibGUgb2YgUVNDcyAqLwogICAgIG1heEFsbG93ZWRDd0xlbiA9IHBNYXhMZW5PZkNiSW5FeHRTcnRTZWNbbWF4TGVuT2ZDYkluRXh0U3J0U2VjSWR4XTsKICAgICBtYXhMZW5PZkNiSW5FeHRTcnRTZWNJZHgrKzsKLSAgICBpZiAobWF4TGVuT2ZDYkluRXh0U3J0U2VjSWR4ID49IChNQVhfU0ZCX0hDUitNQVhfSENSX1NFVFMpKSB7CisgICAgaWYgKG1heExlbk9mQ2JJbkV4dFNydFNlY0lkeCA+PSAoTUFYX1NGQl9IQ1IgKyBNQVhfSENSX1NFVFMpKSB7CiAgICAgICByZXR1cm47CiAgICAgfQotI2VuZGlmCiAKICAgICAvKiBzd2l0Y2ggZm9yIGRlY29kaW5nIHdpdGggZGlmZmVyZW50IGNvZGVib29rczogKi8KLSAgICBpZiAoIHBDYlNpZ25bY29kZWJvb2tdID09IDAgKSB7ICAgICAgICAgICAgICAgICAgICAvKiBubyBzaWduIGJpdHMgZm9sbG93IGFmdGVyIHRoZSBjb2Rld29yZC1ib2R5ICovCisgICAgaWYgKHBDYlNpZ25bY29kZWJvb2tdID09CisgICAgICAgIDApIHsgLyogbm8gc2lnbiBiaXRzIGZvbGxvdyBhZnRlciB0aGUgY29kZXdvcmQtYm9keSAqLwogICAgICAgLyogUENXX0JvZHlPTkxZICovCiAgICAgICAvKj09PT09PT09PT09PT09Ki8KIAotICAgICAgZm9yICggY3VyRXh0U29ydEN3SW5TZWMgPSBwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbltudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4XSA7IGN1ckV4dFNvcnRDd0luU2VjICE9IDA7IGN1ckV4dFNvcnRDd0luU2VjLS0pIHsKKyAgICAgIGZvciAoY3VyRXh0U29ydEN3SW5TZWMgPSBwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbgorICAgICAgICAgICAgICAgW251bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHhdOworICAgICAgICAgICBjdXJFeHRTb3J0Q3dJblNlYyAhPSAwOyBjdXJFeHRTb3J0Q3dJblNlYy0tKSB7CiAgICAgICAgIG51bURlY29kZWRCaXRzID0gMDsKIAogICAgICAgICAvKiBkZWNvZGUgUENXX0JPRFkgKi8KLSAgICAgICAgcFF1YW50VmFsID0gRGVjb2RlUENXX0JvZHkoYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50VHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1YW50VmFsQmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bURlY29kZWRCaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcFF1YW50VmFsID0KKyAgICAgICAgICAgIERlY29kZVBDV19Cb2R5KGJzLCBwQ3VycmVudFRyZWUsIHBRdWFudFZhbEJhc2UsIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudCwgJm51bURlY29kZWRCaXRzKTsKIAogICAgICAgICAvKiByZXN1bHQgaXMgd3JpdHRlbiBvdXQgaGVyZSBiZWNhdXNlIE5PIHNpZ24gYml0cyBmb2xsb3cgdGhlIGJvZHkgKi8KLSAgICAgICAgZm9yKCBpPWRpbWVuc2lvbjsgaSAhPSAwIDsgaS0tICkgewotICAgICAgICAgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c1txdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeF0gPSAoRklYUF9EQkwpICpwUXVhbnRWYWwrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgcXVhbnQuIHNwZWMuIGNvZWYuIGludG8gc3BlY3RydW07IHNpZ24gaXMgYWxyZWFkeSB2YWxpZCAqLworICAgICAgICBmb3IgKGkgPSBkaW1lbnNpb247IGkgIT0gMDsgaS0tKSB7CisgICAgICAgICAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzW3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4XSA9CisgICAgICAgICAgICAgIChGSVhQX0RCTCkqcFF1YW50VmFsKys7IC8qIHdyaXRlIHF1YW50LiBzcGVjLiBjb2VmLiBpbnRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWN0cnVtOyBzaWduIGlzIGFscmVhZHkgdmFsaWQgKi8KICAgICAgICAgICBxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCsrOwogICAgICAgICAgIGlmIChxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCA+PSAxMDI0KSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0xMTI0LDk0ICsxMDg4LDgzIEBACiAKICAgICAgICAgLyogb25lIG1vcmUgUENXIHNob3VsZCBiZSBkZWNvZGVkICovCiAKLSNpZiBERVRFQ1RfVE9PX0xPTkdfQ1dfUkVBRFMKLSAgICAgICAgaWYgKCBtYXhBbGxvd2VkQ3dMZW4gPCAobnVtRGVjb2RlZEJpdHMgKyBFUlJPUl9QQ1dfQk9EWV9PTkxZX1RPT19MT05HKSApIHsKKyAgICAgICAgaWYgKG1heEFsbG93ZWRDd0xlbiA8IChudW1EZWNvZGVkQml0cyArIEVSUk9SX1BDV19CT0RZX09OTFlfVE9PX0xPTkcpKSB7CiAgICAgICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gVE9PX01BTllfUENXX0JPRFlfQklUU19ERUNPREVEOwogICAgICAgICB9Ci0jZW5kaWYKIAotI2lmIENIRUNLX1NFR01FTlRBVElPTl9JTU1FRElBVEVMWQotICAgICAgICBpZiAoMSA9PSBlcnJEZXRlY3RQY3dTZWdtZW50YXRpb24oKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LUVSUk9SX1BDV19CT0RZLHBIY3IsUENXX0JPRFkscFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzK3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4LWRpbWVuc2lvbixkaW1lbnNpb24pKSB7CisgICAgICAgIGlmICgxID09IGVyckRldGVjdFBjd1NlZ21lbnRhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudCAtIEVSUk9SX1BDV19CT0RZLCBwSGNyLCBQQ1dfQk9EWSwKKyAgICAgICAgICAgICAgICAgICAgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHggLSBkaW1lbnNpb24sCisgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb24pKSB7CiAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBwb2ludGVyIGZvciBkZWNvZGluZyB0aGUgbmV4dCBQQ1cgKi8KLSAgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBwb2ludGVyIGZvciBkZWNvZGluZyB0aGUgbmV4dCBQQ1cgKi8KKyAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCsrOyAvKiB1cGRhdGUgcG9pbnRlciBmb3IgZGVjb2RpbmcgdGhlIG5leHQgUENXICovCisgICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50Kys7IC8qIHVwZGF0ZSBwb2ludGVyIGZvciBkZWNvZGluZyB0aGUgbmV4dCBQQ1cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKCggcENiU2lnbltjb2RlYm9va10gPT0gMSApICYmICggY29kZWJvb2sgPCAxMSApKSB7ICAvKiBwb3NzaWJseSB0aGVyZSBmb2xsb3cgMSwyLDMgb3IgNCBzaWduIGJpdHMgYWZ0ZXIgdGhlIGNvZGV3b3JkLWJvZHkgKi8KKyAgICB9IGVsc2UgaWYgKChjb2RlYm9vayA8IDExKSAmJiAocENiU2lnbltjb2RlYm9va10gPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkpIHsgLyogcG9zc2libHkgdGhlcmUgZm9sbG93IDEsMiwzIG9yIDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiBiaXRzIGFmdGVyIHRoZSBjb2Rld29yZC1ib2R5ICovCiAgICAgICAvKiBQQ1dfQm9keSBhbmQgUENXX1NpZ24gKi8KICAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT0qLwogCi0gICAgICBmb3IgKCBjdXJFeHRTb3J0Q3dJblNlYyA9IHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uW251bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHhdIDsgY3VyRXh0U29ydEN3SW5TZWMgIT0gMDsgY3VyRXh0U29ydEN3SW5TZWMtLSkKLSAgICAgIHsKKyAgICAgIGZvciAoY3VyRXh0U29ydEN3SW5TZWMgPSBwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbgorICAgICAgICAgICAgICAgW251bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHhdOworICAgICAgICAgICBjdXJFeHRTb3J0Q3dJblNlYyAhPSAwOyBjdXJFeHRTb3J0Q3dJblNlYy0tKSB7CiAgICAgICAgIGludCBlcnI7Ci0gICAgICAgIG51bURlY29kZWRCaXRzICA9IDA7CisgICAgICAgIG51bURlY29kZWRCaXRzID0gMDsKIAotICAgICAgICBwUXVhbnRWYWwgPSBEZWNvZGVQQ1dfQm9keShicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnRUcmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUXVhbnRWYWxCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtRGVjb2RlZEJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBwUXVhbnRWYWwgPQorICAgICAgICAgICAgRGVjb2RlUENXX0JvZHkoYnMsIHBDdXJyZW50VHJlZSwgcFF1YW50VmFsQmFzZSwgcExlZnRTdGFydE9mU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50LCAmbnVtRGVjb2RlZEJpdHMpOwogCi0gICAgICAgIGVyciA9IERlY29kZVBDV19TaWduKCBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWFudFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtRGVjb2RlZEJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgZXJyID0gRGVjb2RlUENXX1NpZ24oCisgICAgICAgICAgICBicywgZGltZW5zaW9uLCBwUXVhbnRWYWwsIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cywKKyAgICAgICAgICAgICZxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCwgcExlZnRTdGFydE9mU2VnbWVudCwKKyAgICAgICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50LCAmbnVtRGVjb2RlZEJpdHMpOwogICAgICAgICBpZiAoZXJyICE9IDApIHsKICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgLyogb25lIG1vcmUgUENXIHNob3VsZCBiZSBkZWNvZGVkICovCiAKLSNpZiBERVRFQ1RfVE9PX0xPTkdfQ1dfUkVBRFMKLSAgICAgICAgaWYgKCBtYXhBbGxvd2VkQ3dMZW4gPCAobnVtRGVjb2RlZEJpdHMgKyBFUlJPUl9QQ1dfQk9EWV9TSUdOX1RPT19MT05HKSApIHsKKyAgICAgICAgaWYgKG1heEFsbG93ZWRDd0xlbiA8IChudW1EZWNvZGVkQml0cyArIEVSUk9SX1BDV19CT0RZX1NJR05fVE9PX0xPTkcpKSB7CiAgICAgICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gVE9PX01BTllfUENXX0JPRFlfU0lHTl9CSVRTX0RFQ09ERUQ7CiAgICAgICAgIH0KLSNlbmRpZgogCi0jaWYgQ0hFQ0tfU0VHTUVOVEFUSU9OX0lNTUVESUFURUxZCi0gICAgICAgIGlmICgxID09IGVyckRldGVjdFBjd1NlZ21lbnRhdGlvbigqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQtRVJST1JfUENXX0JPRFlfU0lHTixwSGNyLFBDV19CT0RZX1NJR04sIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cytxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeC1kaW1lbnNpb24sZGltZW5zaW9uKSkgeworICAgICAgICBpZiAoMSA9PSBlcnJEZXRlY3RQY3dTZWdtZW50YXRpb24oCisgICAgICAgICAgICAgICAgICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgLSBFUlJPUl9QQ1dfQk9EWV9TSUdOLCBwSGNyLAorICAgICAgICAgICAgICAgICAgICAgUENXX0JPRFlfU0lHTiwKKyAgICAgICAgICAgICAgICAgICAgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHggLSBkaW1lbnNpb24sCisgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb24pKSB7CiAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0jZW5kaWYKICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCsrOwogICAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudCsrOwogICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICgoIHBDYlNpZ25bY29kZWJvb2tdID09IDEgKSAmJiAoIGNvZGVib29rID49IDExICkpIHsgLyogcG9zc2libHkgdGhlcmUgZm9sbG93IHNvbWUgc2lnbiBiaXRzIGFuZCBtYXliZSBvbmUgb3IgdHdvIGVzY2FwZSBzZXF1ZW5jZXMgYWZ0ZXIgdGhlIGN3LWJvZHkgKi8KKyAgICB9IGVsc2UgaWYgKChwQ2JTaWduW2NvZGVib29rXSA9PSAxKSAmJgorICAgICAgICAgICAgICAgKGNvZGVib29rID49IDExKSkgeyAvKiBwb3NzaWJseSB0aGVyZSBmb2xsb3cgc29tZSBzaWduIGJpdHMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlIG9uZSBvciB0d28gZXNjYXBlIHNlcXVlbmNlcyBhZnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY3ctYm9keSAqLwogICAgICAgLyogUENXX0JvZHksIFBDV19TaWduIGFuZCBtYXliZSBQQ1dfRXNjYXBlICovCiAgICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotICAgICAgZm9yICggY3VyRXh0U29ydEN3SW5TZWMgPSBwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbltudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4XSA7IGN1ckV4dFNvcnRDd0luU2VjICE9IDA7IGN1ckV4dFNvcnRDd0luU2VjLS0pCi0gICAgICB7CisgICAgICBmb3IgKGN1ckV4dFNvcnRDd0luU2VjID0gcE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb24KKyAgICAgICAgICAgICAgIFtudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4XTsKKyAgICAgICAgICAgY3VyRXh0U29ydEN3SW5TZWMgIT0gMDsgY3VyRXh0U29ydEN3SW5TZWMtLSkgewogICAgICAgICBpbnQgZXJyOwotICAgICAgICBudW1EZWNvZGVkQml0cyAgPSAwOworICAgICAgICBudW1EZWNvZGVkQml0cyA9IDA7CiAKICAgICAgICAgLyogZGVjb2RlIFBDV19CT0RZICovCi0gICAgICAgIHBRdWFudFZhbCA9IERlY29kZVBDV19Cb2R5KGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudFRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWFudFZhbEJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1EZWNvZGVkQml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIHBRdWFudFZhbCA9CisgICAgICAgICAgICBEZWNvZGVQQ1dfQm9keShicywgcEN1cnJlbnRUcmVlLCBwUXVhbnRWYWxCYXNlLCBwTGVmdFN0YXJ0T2ZTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsICZudW1EZWNvZGVkQml0cyk7CiAKLSAgICAgICAgZXJyID0gRGVjb2RlUENXX1NpZ24oIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1YW50VmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1EZWNvZGVkQml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBlcnIgPSBEZWNvZGVQQ1dfU2lnbigKKyAgICAgICAgICAgIGJzLCBkaW1lbnNpb24sIHBRdWFudFZhbCwgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzLAorICAgICAgICAgICAgJnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4LCBwTGVmdFN0YXJ0T2ZTZWdtZW50LAorICAgICAgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsICZudW1EZWNvZGVkQml0cyk7CiAgICAgICAgIGlmIChlcnIgIT0gMCkgewogICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMTIxOSwyNiArMTE3MiwzMiBAQAogICAgICAgICAvKiBkZWNvZGUgUENXX0VTQ0FQRSBpZiBwcmVzZW50ICovCiAgICAgICAgIHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4IC09IERJTUVOU0lPTl9PRl9FU0NBUEVfQ09ERUJPT0s7CiAKLSAgICAgICAgaWYgKCBmaXhwX2FicyhwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNbcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHhdKSA9PSAoRklYUF9EQkwpRVNDQVBFX1ZBTFVFICkgewotICAgICAgICAgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c1txdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeF0gPSAoRklYUF9EQkwpIERlY29kZUVzY2FwZVNlcXVlbmNlKCBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c1txdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1EZWNvZGVkQml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGlmIChmaXhwX2FicyhwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICBbcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHhdKSA9PQorICAgICAgICAgICAgKEZJWFBfREJMKUVTQ0FQRV9WQUxVRSkgeworICAgICAgICAgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c1txdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeF0gPQorICAgICAgICAgICAgICAoRklYUF9EQkwpRGVjb2RlRXNjYXBlU2VxdWVuY2UoCisgICAgICAgICAgICAgICAgICBicywKKyAgICAgICAgICAgICAgICAgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAgICAgIFtxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeF0sCisgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LCBwUmVtYWluaW5nQml0c0luU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICZudW1EZWNvZGVkQml0cyk7CiAgICAgICAgIH0KICAgICAgICAgcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHgrKzsKICAgICAgICAgaWYgKHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ID49IDEwMjQpIHsKICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIGZpeHBfYWJzKHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c1txdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeF0pID09IChGSVhQX0RCTClFU0NBUEVfVkFMVUUgKSB7Ci0gICAgICAgICAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzW3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4XSA9IChGSVhQX0RCTCkgRGVjb2RlRXNjYXBlU2VxdWVuY2UoIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzW3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bURlY29kZWRCaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKGZpeHBfYWJzKHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAgICAgICAgIFtxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeF0pID09CisgICAgICAgICAgICAoRklYUF9EQkwpRVNDQVBFX1ZBTFVFKSB7CisgICAgICAgICAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzW3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4XSA9CisgICAgICAgICAgICAgIChGSVhQX0RCTClEZWNvZGVFc2NhcGVTZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICAgIGJzLAorICAgICAgICAgICAgICAgICAgcFF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICAgICAgW3F1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4XSwKKyAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAorICAgICAgICAgICAgICAgICAgJm51bURlY29kZWRCaXRzKTsKICAgICAgICAgfQogICAgICAgICBxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCsrOwogICAgICAgICBpZiAocXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHggPj0gMTAyNCkgewpAQCAtMTI0NywxNyArMTIwNiwyMCBAQAogCiAgICAgICAgIC8qIG9uZSBtb3JlIFBDVyBzaG91bGQgYmUgZGVjb2RlZCAqLwogCi0jaWYgREVURUNUX1RPT19MT05HX0NXX1JFQURTCi0gICAgICAgIGlmICggbWF4QWxsb3dlZEN3TGVuIDwgKG51bURlY29kZWRCaXRzICsgRVJST1JfUENXX0JPRFlfU0lHTl9FU0NfVE9PX0xPTkcpICkgeworICAgICAgICBpZiAobWF4QWxsb3dlZEN3TGVuIDwKKyAgICAgICAgICAgIChudW1EZWNvZGVkQml0cyArIEVSUk9SX1BDV19CT0RZX1NJR05fRVNDX1RPT19MT05HKSkgewogICAgICAgICAgIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nIHw9IFRPT19NQU5ZX1BDV19CT0RZX1NJR05fRVNDX0JJVFNfREVDT0RFRDsKICAgICAgICAgfQotI2VuZGlmCiAKLSNpZiBDSEVDS19TRUdNRU5UQVRJT05fSU1NRURJQVRFTFkKLSAgICAgICAgaWYgKDEgPT0gZXJyRGV0ZWN0UGN3U2VnbWVudGF0aW9uKCpwUmVtYWluaW5nQml0c0luU2VnbWVudC1FUlJPUl9QQ1dfQk9EWV9TSUdOX0VTQyxwSGNyLFBDV19CT0RZX1NJR05fRVNDLHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50cytxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeC1ESU1FTlNJT05fT0ZfRVNDQVBFX0NPREVCT09LLERJTUVOU0lPTl9PRl9FU0NBUEVfQ09ERUJPT0spKSB7CisgICAgICAgIGlmICgxID09IGVyckRldGVjdFBjd1NlZ21lbnRhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudCAtIEVSUk9SX1BDV19CT0RZX1NJR05fRVNDLCBwSGNyLAorICAgICAgICAgICAgICAgICAgICAgUENXX0JPRFlfU0lHTl9FU0MsCisgICAgICAgICAgICAgICAgICAgICBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMgKworICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBESU1FTlNJT05fT0ZfRVNDQVBFX0NPREVCT09LLAorICAgICAgICAgICAgICAgICAgICAgRElNRU5TSU9OX09GX0VTQ0FQRV9DT0RFQk9PSykpIHsKICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSNlbmRpZgogICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50Kys7CiAgICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50Kys7CiAgICAgICB9CkBAIC0xMjY1LDcgKzEyMjcsNyBAQAogCiAgICAgLyogYWxsIFBDV3MgYmVsb25naW5nIHRvIHRoaXMgZXh0ZW5kZWQgc2VjdGlvbiBzaG91bGQgYmUgZGVjb2RlZCAqLwogICAgIG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHgrKzsKLSAgICBpZiAobnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCA+PSBNQVhfU0ZCX0hDUitNQVhfSENSX1NFVFMpIHsKKyAgICBpZiAobnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCA+PSBNQVhfU0ZCX0hDUiArIE1BWF9IQ1JfU0VUUykgewogICAgICAgcmV0dXJuOwogICAgIH0KICAgfQpAQCAtMTI3Nyw2NiArMTIzOSw2NSBAQAogICB9CiAKICAgLyogV3JpdGUgYmFjayBpbmRleGVzIGludG8gc3RydWN0dXJlICovCi0gIHBIY3ItPnNlY3Rpb25JbmZvLm51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHggPSBudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4OworICBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4ID0KKyAgICAgIG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHg7CiAgIHBIY3ItPnNlY3Rpb25JbmZvLmV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHggPSBleHRlbmRlZFNvcnRlZENvZGVib29rSWR4OwotICBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4ID0gbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeDsKLSAgcEhjci0+ZGVjSW5PdXQucXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHggPSBxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeDsKKyAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeCA9CisgICAgICBudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4OworICBwSGNyLT5kZWNJbk91dC5xdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCA9CisgICAgICBxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeDsKICAgcEhjci0+c2VjdGlvbkluZm8ubWF4TGVuT2ZDYkluRXh0U3J0U2VjSWR4ID0gbWF4TGVuT2ZDYkluRXh0U3J0U2VjSWR4OwogfQogCi0jaWYgQ0hFQ0tfU0VHTUVOVEFUSU9OX0lNTUVESUFURUxZCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpbW1lZGlhdGVseSBhZnRlciBldmVyeSBkZWNvZGVkIFBDVywgd2hldGhlciBvdXQgb2YKLSAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgc2VnbWVudCB0b28gbWFueSBiaXRzIGhhdmUgYmVlbiByZWFkIG9yIG5vdC4gSWYgYW4gZXJyb3Igb2NjdXJycywKLSAgICAgICAgICAgICAgICAgICAgcHJvYmFibHkgdGhlIHNpZGVpbmZvIG9yIHRoZSBIQ1ItYml0c3RyZWFtIGJsb2NrIGhvbGRpbmcgdGhlIGh1ZmZtYW4KLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZCBxdWFudGl6ZWQgc3BlY3RyYWwgY29lZmZpY2llbnRzIGlzIGRpc3RvcnRlZC4gSW4gdGhpcyBjYXNlIHRoZSB0d28KLSAgICAgICAgICAgICAgICAgICAgb3IgZm91ciBxdWFudGl6ZWQgc3BlY3RyYWwgY29lZmZpY2llbnRzIGJlbG9uZ2luZyB0byB0aGUgY3VycmVudCBjb2Rld29yZAorICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpbW1lZGlhdGVseSBhZnRlciBldmVyeSBkZWNvZGVkIFBDVywKK3doZXRoZXIgb3V0IG9mIHRoZSBjdXJyZW50IHNlZ21lbnQgdG9vIG1hbnkgYml0cyBoYXZlIGJlZW4gcmVhZCBvciBub3QuIElmIGFuCitlcnJvciBvY2N1cnJzLCBwcm9iYWJseSB0aGUgc2lkZWluZm8gb3IgdGhlIEhDUi1iaXRzdHJlYW0gYmxvY2sgaG9sZGluZyB0aGUKK2h1ZmZtYW4gZW5jb2RlZCBxdWFudGl6ZWQgc3BlY3RyYWwgY29lZmZpY2llbnRzIGlzIGRpc3RvcnRlZC4gSW4gdGhpcyBjYXNlIHRoZQordHdvIG9yIGZvdXIgcXVhbnRpemVkIHNwZWN0cmFsIGNvZWZmaWNpZW50cyBiZWxvbmdpbmcgdG8gdGhlIGN1cnJlbnQgY29kZXdvcmQKICAgICAgICAgICAgICAgICAgICAgYXJlIG1hcmtlZCAoZm9yIGJlaW5nIGRldGVjdGVkIGJ5IGNvbmNlYWxtZW50IGxhdGVyKS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgVUNIQVIgZXJyRGV0ZWN0UGN3U2VnbWVudGF0aW9uKFNDSEFSICAgICAgIHJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhfSENSX0lORk8gIHBIY3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDV19UWVBFICAgIGtpbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKnFzY19iYXNlX29mX2N3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICBkaW1lbnNpb24pCi17CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBVQ0hBUiBlcnJEZXRlY3RQY3dTZWdtZW50YXRpb24oU0NIQVIgcmVtYWluaW5nQml0c0luU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSF9IQ1JfSU5GTyBwSGNyLCBQQ1dfVFlQRSBraW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcXNjX2Jhc2Vfb2ZfY3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGRpbWVuc2lvbikgewogICBTQ0hBUiBpOwotICBpZiAoIHJlbWFpbmluZ0JpdHNJblNlZ21lbnQgPCAwICkgeworICBpZiAocmVtYWluaW5nQml0c0luU2VnbWVudCA8IDApIHsKICAgICAvKiBsb2cgdGhlIGVycm9yICovCiAgICAgc3dpdGNoIChraW5kKSB7Ci0gICAgY2FzZSBQQ1dfQk9EWToKKyAgICAgIGNhc2UgUENXX0JPRFk6CiAgICAgICAgIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nIHw9IFNFR01FTlRfT1ZFUlJJREVfRVJSX1BDV19CT0RZOwogICAgICAgICBicmVhazsKLSAgICBjYXNlIFBDV19CT0RZX1NJR046CisgICAgICBjYXNlIFBDV19CT0RZX1NJR046CiAgICAgICAgIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nIHw9IFNFR01FTlRfT1ZFUlJJREVfRVJSX1BDV19CT0RZX1NJR047CiAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgUENXX0JPRFlfU0lHTl9FU0M6CisgICAgICBjYXNlIFBDV19CT0RZX1NJR05fRVNDOgogICAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBTRUdNRU5UX09WRVJSSURFX0VSUl9QQ1dfQk9EWV9TSUdOX0VTQzsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIC8qIG1hcmsgdGhlIGVycmVkIGxpbmVzICovCi0gICAgZm9yICggaSA9IGRpbWVuc2lvbjsgaSAhPSAwOyBpLS0gKSB7Ci0gICAgICAqcXNjX2Jhc2Vfb2ZfY3crKyA9IChGSVhQX0RCTCkgUV9WQUxVRV9JTlZBTElEOworICAgIGZvciAoaSA9IGRpbWVuc2lvbjsgaSAhPSAwOyBpLS0pIHsKKyAgICAgICpxc2NfYmFzZV9vZl9jdysrID0gKEZJWFBfREJMKVFfVkFMVUVfSU5WQUxJRDsKICAgICB9CiAgICAgcmV0dXJuIDE7CiAgIH0KICAgcmV0dXJuIDA7CiB9Ci0jZW5kaWYKIAotI2lmIENIRUNLX1NFR01FTlRBVElPTl9GSU5BTAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgYWxsIHNlZ21lbnRzIGFyZSBlbXB0eSBhZnRlciBkZWNvZGluZy4gVGhlcmUKLSAgICAgICAgICAgICAgICAgICAgYXJlIF9ubyBsaW5lcyBtYXJrZGVkXyBhcyBpbnZhbGlkIGJlY2F1c2UgaXQgY291bGQgbm90IGJlIHRyYWNlZCBiYWNrCi0gICAgICAgICAgICAgICAgICAgIHdoZXJlIGZyb20gdGhlIHJlbWFpbmluZyBiaXRzIGFyZS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgdm9pZCBlcnJEZXRlY3RXaXRoaW5TZWdtZW50YXRpb25GaW5hbChIX0hDUl9JTkZPIHBIY3IpCi17Ci0gIFVDSEFSICAgc2VnbWVudGF0aW9uRXJyb3JGbGFnICAgPSAwOwotICBVU0hPUlQgIGk7Ci0gIFNDSEFSICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wUmVtYWluaW5nQml0c0luU2VnbWVudDsKLSAgVUlOVCAgICBudW1TZWdtZW50ICAgICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLm51bVNlZ21lbnQ7CisgICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIGFsbCBzZWdtZW50cyBhcmUgZW1wdHkgYWZ0ZXIKK2RlY29kaW5nLiBUaGVyZSBhcmUgX25vIGxpbmVzIG1hcmtkZWRfIGFzIGludmFsaWQgYmVjYXVzZSBpdCBjb3VsZCBub3QgYmUgdHJhY2VkCitiYWNrIHdoZXJlIGZyb20gdGhlIHJlbWFpbmluZyBiaXRzIGFyZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIHZvaWQgZXJyRGV0ZWN0V2l0aGluU2VnbWVudGF0aW9uRmluYWwoSF9IQ1JfSU5GTyBwSGNyKSB7CisgIFVDSEFSIHNlZ21lbnRhdGlvbkVycm9yRmxhZyA9IDA7CisgIFVTSE9SVCBpOworICBTQ0hBUiAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgVUlOVCBudW1TZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ubnVtU2VnbWVudDsKIAotICBmb3IgKCBpPW51bVNlZ21lbnQ7IGkgIT0gMCA7IGktLSkgeworICBmb3IgKGkgPSBudW1TZWdtZW50OyBpICE9IDA7IGktLSkgewogICAgIGlmICgqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQrKyAhPSAwKSB7CiAgICAgICBzZWdtZW50YXRpb25FcnJvckZsYWcgPSAxOwogICAgIH0KQEAgLTEzNDUsMTI1ICsxMzA2LDExNCBAQAogICAgIHBIY3ItPmRlY0luT3V0LmVycm9yTG9nIHw9IEJJVF9JTl9TRUdNRU5UQVRJT05fRVJST1I7CiAgIH0KIH0KLSNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIHdhbGtzIG9uZSBzdGVwIHdpdGhpbiB0aGUgZGVjb2RpbmcgdHJlZS4gV2hpY2ggYnJhbmNoIGlzCi0gICAgICAgICAgICAgICAgICAgIHRha2VuIGRlcGVuZHMgb24gdGhlIGRlY29kZWQgY2FycnlCaXQgaW5wdXQgcGFyYW1ldGVyLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgIENhcnJ5Qml0VG9CcmFuY2hWYWx1ZShVQ0hBUiAgY2FycnlCaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgIHRyZWVOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICpicmFuY2hWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAqYnJhbmNoTm9kZSkKLXsKKyAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiB3YWxrcyBvbmUgc3RlcCB3aXRoaW4gdGhlIGRlY29kaW5nIHRyZWUuIFdoaWNoCiticmFuY2ggaXMgdGFrZW4gZGVwZW5kcyBvbiB0aGUgZGVjb2RlZCBjYXJyeUJpdCBpbnB1dCBwYXJhbWV0ZXIuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3ZvaWQgQ2FycnlCaXRUb0JyYW5jaFZhbHVlKFVDSEFSIGNhcnJ5Qml0LCBVSU5UIHRyZWVOb2RlLCBVSU5UICpicmFuY2hWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKmJyYW5jaE5vZGUpIHsKICAgaWYgKGNhcnJ5Qml0ID09IDApIHsKLSAgICAqYnJhbmNoTm9kZSA9ICh0cmVlTm9kZSAmIE1BU0tfTEVGVCkgPj4gTEVGVF9PRkZTRVQ7IC8qIE1BU0tfTEVGVDogIDAwRkZGMDAwICovCi0gIH0KLSAgZWxzZSB7Ci0gICAgKmJyYW5jaE5vZGUgPSB0cmVlTm9kZSAmIE1BU0tfUklHSFQ7ICAgICAgICAgICAgICAgICAvKiBNQVNLX1JJR0hUOiAwMDAwMEZGRiAqLworICAgICpicmFuY2hOb2RlID0KKyAgICAgICAgKHRyZWVOb2RlICYgTUFTS19MRUZUKSA+PiBMRUZUX09GRlNFVDsgLyogTUFTS19MRUZUOiAgMDBGRkYwMDAgKi8KKyAgfSBlbHNlIHsKKyAgICAqYnJhbmNoTm9kZSA9IHRyZWVOb2RlICYgTUFTS19SSUdIVDsgLyogTUFTS19SSUdIVDogMDAwMDBGRkYgKi8KICAgfQogCi0gICpicmFuY2hWYWx1ZSA9ICpicmFuY2hOb2RlICYgQ0xSX0JJVF8xMDsgICAgICAgICAgICAgICAvKiBjbGVhciBiaXQgMTAgKGlmIHNldCkgKi8KKyAgKmJyYW5jaFZhbHVlID0gKmJyYW5jaE5vZGUgJiBDTFJfQklUXzEwOyAvKiBjbGVhciBiaXQgMTAgKGlmIHNldCkgKi8KIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBkZXNjcmlwdGlvbjogICBEZWNvZGVzIHRoZSBib2R5IG9mIGEgcHJpb3JpdHkgY29kZXdvcmQgKFBDVykKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHJldHVybjogICAtIHJldHVybiB2YWx1ZSBpcyBwb2ludGVyIHRvIGZpcnN0IG9mIHR3byBvciBmb3VyIHF1YW50aXplZCBzcGVjdHJhbAotICAgICAgICAgICAgICAgICAgICBjb2VmZmljaWVudHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgY29uc3QgU0NIQVIgKkRlY29kZVBDV19Cb2R5KEhBTkRMRV9GREtfQklUU1RSRUFNICBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgKnBDdXJyZW50VHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NIQVIgICAgICAgICAgKnBRdWFudFZhbEJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICpwTGVmdFN0YXJ0T2ZTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICpwTnVtRGVjb2RlZEJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CisgICAgICAgIHJldHVybjogICAtIHJldHVybiB2YWx1ZSBpcyBwb2ludGVyIHRvIGZpcnN0IG9mIHR3byBvciBmb3VyIHF1YW50aXplZAorc3BlY3RyYWwgY29lZmZpY2llbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBjb25zdCBTQ0hBUiAqRGVjb2RlUENXX0JvZHkoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgKnBDdXJyZW50VHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NIQVIgKnBRdWFudFZhbEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcExlZnRTdGFydE9mU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBOdW1EZWNvZGVkQml0cykgewogICBVQ0hBUiBjYXJyeUJpdDsKLSAgVUlOVCAgYnJhbmNoTm9kZTsKLSAgVUlOVCAgdHJlZU5vZGU7Ci0gIFVJTlQgIGJyYW5jaFZhbHVlOwotICBjb25zdCAgU0NIQVIgKnBRdWFudFZhbDsKKyAgVUlOVCBicmFuY2hOb2RlOworICBVSU5UIHRyZWVOb2RlOworICBVSU5UIGJyYW5jaFZhbHVlOworICBjb25zdCBTQ0hBUiAqcFF1YW50VmFsOwogCiAgIC8qIGRlY29kZSBQQ1dfQk9EWSAqLwotICB0cmVlTm9kZSA9ICpwQ3VycmVudFRyZWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBmaXJzdCBub2RlIG9mIGN1cnJlbnQgdHJlZSBiZWxvbmdpbmcgdG8gY3VycmVudCBjb2RlYm9vayAqLworICB0cmVlTm9kZSA9ICpwQ3VycmVudFRyZWU7IC8qIGdldCBmaXJzdCBub2RlIG9mIGN1cnJlbnQgdHJlZSBiZWxvbmdpbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGNvZGVib29rICovCiAKICAgLyogZGVjb2RlIHdob2xlIFBDVy1jb2Rld29yZC1ib2R5ICovCiAgIHdoaWxlICgxKSB7Ci0KLSAgICBjYXJyeUJpdCA9IEhjckdldEFCaXRGcm9tQml0c3RyZWFtKGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsICAgICAgICAgICAgICAgICAvKiBkdW1teSAqLworICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oYnMsIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LCAvKiBkdW1teSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTV9MRUZUX1RPX1JJR0hUKTsKICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgLT0gMTsKICAgICAqcE51bURlY29kZWRCaXRzICs9IDE7CiAKLSAgICBDYXJyeUJpdFRvQnJhbmNoVmFsdWUoY2FycnlCaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmYnJhbmNoVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZicmFuY2hOb2RlKTsKKyAgICBDYXJyeUJpdFRvQnJhbmNoVmFsdWUoY2FycnlCaXQsIHRyZWVOb2RlLCAmYnJhbmNoVmFsdWUsICZicmFuY2hOb2RlKTsKIAotICAgIGlmICgoYnJhbmNoTm9kZSAmIFRFU1RfQklUXzEwKSA9PSBURVNUX0JJVF8xMCkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlc3QgYml0IDEwIDsgaWYgc2V0IC0tPiBjb2Rld29yZC1ib2R5IGlzIGNvbXBsZXRlICovCi0gICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGJyYW5jaCBpbiB0cmVlIHJlYWNoZWQgIGkuZS4gYSB3aG9sZSBQQ1ctQm9keSBpcyBkZWNvZGVkICovCisgICAgaWYgKChicmFuY2hOb2RlICYgVEVTVF9CSVRfMTApID09CisgICAgICAgIFRFU1RfQklUXzEwKSB7IC8qIHRlc3QgYml0IDEwIDsgaWYgc2V0IC0tPiBjb2Rld29yZC1ib2R5IGlzIGNvbXBsZXRlICovCisgICAgICBicmVhazsgLyogZW5kIG9mIGJyYW5jaCBpbiB0cmVlIHJlYWNoZWQgIGkuZS4gYSB3aG9sZSBQQ1ctQm9keSBpcyBkZWNvZGVkCisgICAgICAgICAgICAgICovCisgICAgfSBlbHNlIHsKKyAgICAgIHRyZWVOb2RlID0gKigKKyAgICAgICAgICBwQ3VycmVudFRyZWUgKworICAgICAgICAgIGJyYW5jaFZhbHVlKTsgLyogdXBkYXRlIHRyZWVOb2RlIGZvciBmdXJ0aGVyIHN0ZXAgaW4gZGVjb2RpbmcgdHJlZSAqLwogICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHRyZWVOb2RlID0gKihwQ3VycmVudFRyZWUgKyBicmFuY2hWYWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgdHJlZU5vZGUgZm9yIGZ1cnRoZXIgc3RlcCBpbiBkZWNvZGluZyB0cmVlICovCi0gICAgfQotCiAgIH0KIAotICBwUXVhbnRWYWwgPSBwUXVhbnRWYWxCYXNlICsgYnJhbmNoVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBwb2ludGVyIHRvIHZhbGlkIGZpcnN0IG9mIDIgb3IgNCBxdWFudGl6ZWQgdmFsdWVzICovCisgIHBRdWFudFZhbCA9CisgICAgICBwUXVhbnRWYWxCYXNlICsgYnJhbmNoVmFsdWU7IC8qIHVwZGF0ZSBwb2ludGVyIHRvIHZhbGlkIGZpcnN0IG9mIDIgb3IgNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6ZWQgdmFsdWVzICovCiAKICAgcmV0dXJuIHBRdWFudFZhbDsKIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBkZXNjcmlwdGlvbjogICBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgb25lIGVzY2FwZSBzZXF1ZW5jZS4gSW4gY2FzZSBvZiBhIGVzY2FwZSBjb2RlYm9vawotICAgICAgICAgICAgICAgICAgICBhbmQgaW4gY2FzZSBvZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHF1YW50aXplZCBzcGVjdHJhbCB2YWx1ZSA9PSAxNiwKLSAgICAgICAgICAgICAgICAgICAgYSBlc2NhcGVTZXF1ZW5jZSBpcyBkZWNvZGVkIGluIHR3byBzdGVwczoKKyAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiBkZWNvZGVzIG9uZSBlc2NhcGUgc2VxdWVuY2UuIEluIGNhc2Ugb2YgYQorZXNjYXBlIGNvZGVib29rIGFuZCBpbiBjYXNlIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgcXVhbnRpemVkIHNwZWN0cmFsCit2YWx1ZSA9PSAxNiwgYSBlc2NhcGVTZXF1ZW5jZSBpcyBkZWNvZGVkIGluIHR3byBzdGVwczoKICAgICAgICAgICAgICAgICAgICAgICAxLiBlc2NhcGUgcHJlZml4CiAgICAgICAgICAgICAgICAgICAgICAgMi4gZXNjYXBlIHdvcmQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KIAotc3RhdGljIElOVCAgRGVjb2RlRXNjYXBlU2VxdWVuY2UoSEFORExFX0ZES19CSVRTVFJFQU0gIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY0NvZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAqcExlZnRTdGFydE9mU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICpwTnVtRGVjb2RlZEJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICBVSU5UICBpOwotICBJTlQgICBzaWduOwotICBVSU5UICBlc2NhcGVPbmVzQ291bnRlciA9IDA7Ci0gIFVJTlQgIGNhcnJ5Qml0OwotICBJTlQgICBlc2NhcGVfd29yZCA9IDA7CitzdGF0aWMgSU5UIERlY29kZUVzY2FwZVNlcXVlbmNlKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBJTlQgcXVhbnRTcGVjQ29lZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwTGVmdFN0YXJ0T2ZTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcE51bURlY29kZWRCaXRzKSB7CisgIFVJTlQgaTsKKyAgSU5UIHNpZ247CisgIFVJTlQgZXNjYXBlT25lc0NvdW50ZXIgPSAwOworICBVSU5UIGNhcnJ5Qml0OworICBJTlQgZXNjYXBlX3dvcmQgPSAwOwogCiAgIC8qIGRlY29kZSBlc2NhcGUgcHJlZml4ICovCiAgIHdoaWxlICgxKSB7Ci0gICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbShicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LCAgICAgICAgICAgICAgICAvKiBkdW1teSAqLworICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oYnMsIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LCAvKiBkdW1teSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTV9MRUZUX1RPX1JJR0hUKTsKICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgLT0gMTsKICAgICAqcE51bURlY29kZWRCaXRzICs9IDE7CiAKICAgICBpZiAoY2FycnlCaXQgIT0gMCkgewogICAgICAgZXNjYXBlT25lc0NvdW50ZXIgKz0gMTsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIGVzY2FwZU9uZXNDb3VudGVyICs9IDQ7CiAgICAgICBicmVhazsKICAgICB9CiAgIH0KIAogICAvKiBkZWNvZGUgZXNjYXBlIHdvcmQgKi8KLSAgZm9yKCBpPWVzY2FwZU9uZXNDb3VudGVyOyBpICE9IDAgOyBpLS0gKSB7Ci0gICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbShicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVmdFN0YXJ0T2ZTZWdtZW50LCAgICAgICAgICAgICAgICAvKiBkdW1teSAqLworICBmb3IgKGkgPSBlc2NhcGVPbmVzQ291bnRlcjsgaSAhPSAwOyBpLS0pIHsKKyAgICBjYXJyeUJpdCA9IEhjckdldEFCaXRGcm9tQml0c3RyZWFtKGJzLCBwTGVmdFN0YXJ0T2ZTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwgLyogZHVtbXkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST01fTEVGVF9UT19SSUdIVCk7CiAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50IC09IDE7CiAgICAgKnBOdW1EZWNvZGVkQml0cyArPSAxOwpAQCAtMTQ3NCw2MSArMTQyNCw1NCBAQAogCiAgIHNpZ24gPSAocXVhbnRTcGVjQ29lZiA+PSAwKSA/IDEgOiAtMTsKIAotICBxdWFudFNwZWNDb2VmID0gc2lnbiAqICgoKElOVCApIDEgPDwgZXNjYXBlT25lc0NvdW50ZXIpICsgZXNjYXBlX3dvcmQpOworICBxdWFudFNwZWNDb2VmID0gc2lnbiAqICgoKElOVCkxIDw8IGVzY2FwZU9uZXNDb3VudGVyKSArIGVzY2FwZV93b3JkKTsKIAogICByZXR1cm4gcXVhbnRTcGVjQ29lZjsKIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBkZXNjcmlwdGlvbjogICBEZWNvZGVzIHRoZSBTaWduYml0cyBvZiBhIHByaW9yaXR5IGNvZGV3b3JkIChQQ1cpIGFuZCB3cml0ZXMgb3V0IHRoZQotICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmcgcXVhbnRpemVkIHNwZWN0cmFsIHZhbHVlcyBpbnRvIHVuc29ydGVkIHNlY3Rpb25zCisgICAgIGRlc2NyaXB0aW9uOiAgIERlY29kZXMgdGhlIFNpZ25iaXRzIG9mIGEgcHJpb3JpdHkgY29kZXdvcmQgKFBDVykgYW5kIHdyaXRlcworb3V0IHRoZSByZXN1bHRpbmcgcXVhbnRpemVkIHNwZWN0cmFsIHZhbHVlcyBpbnRvIHVuc29ydGVkIHNlY3Rpb25zCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBvdXRwdXQ6ICAgLSB0d28gb3IgZm91ciBsaW5lcyBhdCBwb3NpdGlvbiBpbiBjb3JyZXNwb25kaW5nIHNlY3Rpb24gKHdoaWNoIGFyZSBub3QKLSAgICAgICAgICAgICAgICAgICAgbG9jYXRlZCBhdCB0aGUgZGVzaXJlZCBwb3NpdGlvbiwgaS5lLiB0aGV5IG11c3QgYmUgcmVvcmRlcmVkIGluIHRoZSBsYXN0Ci0gICAgICAgICAgICAgICAgICAgIG9mIGVpZ2h0IGZ1bmN0aW9uIG9mIEhDUikKKyAgICAgICAgb3V0cHV0OiAgIC0gdHdvIG9yIGZvdXIgbGluZXMgYXQgcG9zaXRpb24gaW4gY29ycmVzcG9uZGluZyBzZWN0aW9uCisod2hpY2ggYXJlIG5vdCBsb2NhdGVkIGF0IHRoZSBkZXNpcmVkIHBvc2l0aW9uLCBpLmUuIHRoZXkgbXVzdCBiZSByZW9yZGVyZWQgaW4KK3RoZSBsYXN0IG9mIGVpZ2h0IGZ1bmN0aW9uIG9mIEhDUikKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHJldHVybjogICAtIHVwZGF0ZWQgcFF1YW50U3BlY0NvZWYgcG9pbnRlciAodG8gbmV4dCBlbXB0eSBzdG9yYWdlIGZvciBhIGxpbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIGludCBEZWNvZGVQQ1dfU2lnbihIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICBjb2RlYm9va0RpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NIQVIgICAgICAgICAgKnBRdWFudFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgKnBRdWFudFNwZWNDb2VmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqcXVhbnRTcGVjQ29lZklkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgICAgICpwUmVtYWluaW5nQml0c0luU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgKnBOdW1EZWNvZGVkQml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgVUlOVCAgICAgaTsKLSAgVUlOVCAgICAgY2FycnlCaXQ7Ci0gIElOVCAgICAgIHF1YW50U3BlY0NvZWY7CisgICAgICAgIHJldHVybjogICAtIHVwZGF0ZWQgcFF1YW50U3BlY0NvZWYgcG9pbnRlciAodG8gbmV4dCBlbXB0eSBzdG9yYWdlIGZvciBhCitsaW5lKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgaW50IERlY29kZVBDV19TaWduKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBVSU5UIGNvZGVib29rRGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0hBUiAqcFF1YW50VmFsLCBGSVhQX0RCTCAqcFF1YW50U3BlY0NvZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcXVhbnRTcGVjQ29lZklkeCwgSU5UICpwTGVmdFN0YXJ0T2ZTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcE51bURlY29kZWRCaXRzKSB7CisgIFVJTlQgaTsKKyAgVUlOVCBjYXJyeUJpdDsKKyAgSU5UIHF1YW50U3BlY0NvZWY7CiAKLSAgZm9yKCBpPWNvZGVib29rRGltOyBpICE9IDAgOyBpLS0gKSB7CisgIGZvciAoaSA9IGNvZGVib29rRGltOyBpICE9IDA7IGktLSkgewogICAgIHF1YW50U3BlY0NvZWYgPSAqcFF1YW50VmFsKys7CiAgICAgaWYgKHF1YW50U3BlY0NvZWYgIT0gMCkgewotICAgICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbShicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlZnRTdGFydE9mU2VnbWVudCwgICAgLyogZHVtbXkgKi8KKyAgICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oYnMsIHBMZWZ0U3RhcnRPZlNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnQsIC8qIGR1bW15ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST01fTEVGVF9UT19SSUdIVCk7CiAgICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgLT0gMTsKICAgICAgICpwTnVtRGVjb2RlZEJpdHMgKz0gMTsKLSAgICAgIGlmICgqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgPCAwIHx8ICpwTnVtRGVjb2RlZEJpdHMgPj0gKDEwMjQ+PjEpKSB7CisgICAgICBpZiAoKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50IDwgMCB8fCAqcE51bURlY29kZWRCaXRzID49ICgxMDI0ID4+IDEpKSB7CiAgICAgICAgIHJldHVybiAtMTsKICAgICAgIH0KIAogICAgICAgLyogYWRhcHQgc2lnbiBvZiB2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoZSBkZWNvZGVkIHNpZ24gYml0ICovCiAgICAgICBpZiAoY2FycnlCaXQgIT0gMCkgewogICAgICAgICBwUXVhbnRTcGVjQ29lZlsqcXVhbnRTcGVjQ29lZklkeF0gPSAtKEZJWFBfREJMKXF1YW50U3BlY0NvZWY7CisgICAgICB9IGVsc2UgeworICAgICAgICBwUXVhbnRTcGVjQ29lZlsqcXVhbnRTcGVjQ29lZklkeF0gPSAoRklYUF9EQkwpcXVhbnRTcGVjQ29lZjsKICAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBwUXVhbnRTcGVjQ29lZlsqcXVhbnRTcGVjQ29lZklkeF0gPSAgKEZJWFBfREJMKXF1YW50U3BlY0NvZWY7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICBwUXVhbnRTcGVjQ29lZlsqcXVhbnRTcGVjQ29lZklkeF0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICB9Ci0gICAgKnF1YW50U3BlY0NvZWZJZHggKz0gMSA7CisgICAgKnF1YW50U3BlY0NvZWZJZHggKz0gMTsKICAgICBpZiAoKnF1YW50U3BlY0NvZWZJZHggPj0gMTAyNCkgewogICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTE1MzYsNTYgKzE0NzksMjAgQEAKICAgcmV0dXJuIDA7CiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246ICAgTXV0ZXMgc3BlY3RyYWwgbGluZXMgd2hpY2ggaGF2ZSBiZWVuIG1hcmtlZCBhcyBlcnJvbmVvdXMgKFFfVkFMVUVfSU5WQUxJRCkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIEhjck11dGVFcnJvbmVvdXNMaW5lcyhIX0hDUl9JTkZPIGhIY3IpCi17CisgICAgIGRlc2NyaXB0aW9uOiAgIE11dGVzIHNwZWN0cmFsIGxpbmVzIHdoaWNoIGhhdmUgYmVlbiBtYXJrZWQgYXMgZXJyb25lb3VzCisoUV9WQUxVRV9JTlZBTElEKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCit2b2lkIEhjck11dGVFcnJvbmVvdXNMaW5lcyhIX0hDUl9JTkZPIGhIY3IpIHsKICAgaW50IGM7Ci0gIEZJWFBfREJMICpSRVNUUklDVCBwTG9uZyA9IFNQRUNfTE9ORyhoSGNyLT5kZWNJbk91dC5wUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlKTsKKyAgRklYUF9EQkwgKlJFU1RSSUNUIHBMb25nID0KKyAgICAgIFNQRUNfTE9ORyhoSGNyLT5kZWNJbk91dC5wUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlKTsKIAogICAvKiBpZiB0aGVyZSBpcyBhIGxpbmUgd2l0aCB2YWx1ZSBRX1ZBTFVFX0lOVkFMSUQgbXV0ZSBpdCAqLwogICBmb3IgKGMgPSAwOyBjIDwgMTAyNDsgYysrKSB7CiAgICAgaWYgKHBMb25nW2NdID09IChGSVhQX0RCTClRX1ZBTFVFX0lOVkFMSUQpIHsKLSNpZiBIQ1JfTElTVEVOX1RPX01VVEVEX0xJTkVTCi0gICAgICBwTG9uZ1tjXSA9IChGSVhQX0RCTClIQ1JfRElSQUM7ICAgLyogbWFya2luZyAqLwotI2Vsc2UKLSAgICAgIHBMb25nW2NdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7ICAvKiBtdXRpbmcgKi8KLSNlbmRpZgorICAgICAgcExvbmdbY10gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsgLyogbXV0aW5nICovCiAgICAgfQogICB9CiB9Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246ICAgU2V0cyBnbG9iYWwgSENSIHR5cGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIHNldEhjclR5cGUoSF9IQ1JfSU5GTyBoSGNyLCBNUDRfRUxFTUVOVF9JRCB0eXBlKQotewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIElEX1NDRToKLSAgICAgIGhIY3ItPmdsb2JhbEhjclR5cGUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJRF9DUEU6Ci0gICAgICBoSGNyLT5nbG9iYWxIY3JUeXBlID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGRlc2NyaXB0aW9uOiAgIEdldHMgSENSIHR5cGUgZnJvbSB0aGUgSENSIGRhdGEgc3RydWN0dXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICByZXR1cm46ICAgLSBnbG9iYWwgSENSIHR5cGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1JTlQgZ2V0SGNyVHlwZShIX0hDUl9JTkZPIGhIY3IpCi17Ci0gIHJldHVybiBoSGNyLT5nbG9iYWxIY3JUeXBlOwotfQotCi0KLQotCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3IuaCBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjci5oCmluZGV4IDZmYzUyN2IuLmJlMjExNDQgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjci5oCisrKyBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjci5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQ4ICs5MCwzOSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBSb2JlcnQgV2VpZG5lciAoRFNQIFNvbHV0aW9ucykKKwogICAgRGVzY3JpcHRpb246IEhDUiBEZWNvZGVyOiBJbnRlcmZhY2UgZnVuY3Rpb24gZGVjbGFyYXRpb247IGNvbW1vbiBkZWZpbmVzCiAgICAgICAgICAgICAgICAgYW5kIHN0cnVjdHVyZXM7IGRlZmluZXMgZm9yIHN3aXRjaGluZyBlcnJvci1nZW5lcmF0b3IsCiAgICAgICAgICAgICAgICAgLWRldGVjdG9yLCBhbmQgLWNvbmNlYWxtZW50CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgX0FBQ0RFQ19IQ1JfSF8KLSNkZWZpbmUgX0FBQ0RFQ19IQ1JfSF8KLQotCisjaWZuZGVmIEFBQ0RFQ19IQ1JfSAorI2RlZmluZSBBQUNERUNfSENSX0gKIAogI2luY2x1ZGUgImNoYW5uZWxpbmZvLmgiCiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgogCi12b2lkICBIY3JJbml0Um9tIChIX0hDUl9JTkZPIGhIY3IpOwotVUlOVCBIY3JJbml0KEhfSENSX0lORk8gICAgICAgICAgICAgIHBIY3IsCi0gICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKK1VJTlQgSGNySW5pdChIX0hDUl9JTkZPIHBIY3IsIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCiAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgYnMpOwotVUlOVCAgSGNyRGVjb2RlciAoSF9IQ1JfSU5GTyBoSGNyLAotICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMpOwotdm9pZCAgQ2FycnlCaXRUb0JyYW5jaFZhbHVlKAotICAgICAgICBVQ0hBUiAgY2FycnlCaXQsCi0gICAgICAgIFVJTlQgICB0cmVlTm9kZSwKLSAgICAgICAgVUlOVCAgKmJyYW5jaFZhbHVlLAotICAgICAgICBVSU5UICAqYnJhbmNoTm9kZQotICAgICAgICApOworICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzKTsKK1VJTlQgSGNyRGVjb2RlcihIX0hDUl9JTkZPIGhIY3IsIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMpOwordm9pZCBDYXJyeUJpdFRvQnJhbmNoVmFsdWUoVUNIQVIgY2FycnlCaXQsIFVJTlQgdHJlZU5vZGUsIFVJTlQgKmJyYW5jaFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqYnJhbmNoTm9kZSk7CiAKLXZvaWQgIENIY3JfUmVhZCAgKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbyk7Ci12b2lkICBIY3JNdXRlRXJyb25lb3VzTGluZXMoSF9IQ1JfSU5GTyBoSGNyKTsKK3ZvaWQgQ0hjcl9SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGdsb2JhbEhjclR5cGUpOwordm9pZCBIY3JNdXRlRXJyb25lb3VzTGluZXMoSF9IQ1JfSU5GTyBoSGNyKTsKIAotdm9pZCAgc2V0SGNyVHlwZShIX0hDUl9JTkZPIGhIY3IsIE1QNF9FTEVNRU5UX0lEIHR5cGUpOwotSU5UICAgZ2V0SGNyVHlwZShIX0hDUl9JTkZPIGhIY3IpOwordm9pZCBzZXRIY3JUeXBlKEhfSENSX0lORk8gaEhjciwgTVA0X0VMRU1FTlRfSUQgdHlwZSk7CitJTlQgZ2V0SGNyVHlwZShIX0hDUl9JTkZPIGhIY3IpOwogCi0KLQotI2VuZGlmIC8qIF9BQUNERUNfSENSX0hfICovCisjZW5kaWYgLyogQUFDREVDX0hDUl9IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3JfYml0LmNwcCBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcl9iaXQuY3BwCmluZGV4IGRmMjY4NWIuLmE1M2VmMTYgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcl9iaXQuY3BwCisrKyBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcl9iaXQuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDM5ICs5MCwzOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBSb2JlcnQgV2VpZG5lciAoRFNQIFNvbHV0aW9ucykKKwogICAgRGVzY3JpcHRpb246IEhDUiBEZWNvZGVyOiBCaXRzdHJlYW0gcmVhZGluZwogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiYWFjZGVjX2hjcl9iaXQuaCIKIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICBkZXNjcmlwdGlvbjogIFRoaXMgZnVuY3Rpb24gdG9nZ2xlcyB0aGUgcmVhZCBkaXJlY3Rpb24uCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICBpbnB1dDogICAgICAgIGN1cnJlbnQgcmVhZCBkaXJlY3Rpb24KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIHJldHVybjogICAgICAgbmV3IHJlYWQgZGlyZWN0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotVUNIQVIgVG9nZ2xlUmVhZERpcmVjdGlvbihVQ0hBUiByZWFkRGlyZWN0aW9uKQotewotICBpZiAoIHJlYWREaXJlY3Rpb24gPT0gRlJPTV9MRUZUX1RPX1JJR0hUICkgeworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitVQ0hBUiBUb2dnbGVSZWFkRGlyZWN0aW9uKFVDSEFSIHJlYWREaXJlY3Rpb24pIHsKKyAgaWYgKHJlYWREaXJlY3Rpb24gPT0gRlJPTV9MRUZUX1RPX1JJR0hUKSB7CiAgICAgcmV0dXJuIEZST01fUklHSFRfVE9fTEVGVDsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICByZXR1cm4gRlJPTV9MRUZUX1RPX1JJR0hUOwogICB9CiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgYml0IGZyb20gdGhlIGJpdHN0cmVhbSBhY2NvcmRpbmcgdG8gcmVhZCBkaXJlY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgIEl0IGlzIGNhbGxlZCB2ZXJ5IG9mdGVuLCB0aGVyZWZvcmUgaXQgbWFrZXMgc2Vuc2UgdG8gaW5saW5lIGl0IChydW50aW1lKS4KKyAgICAgZGVzY3JpcHRpb246ICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgYml0IGZyb20gdGhlIGJpdHN0cmVhbSBhY2NvcmRpbmcgdG8KK3JlYWQgZGlyZWN0aW9uLiBJdCBpcyBjYWxsZWQgdmVyeSBvZnRlbiwgdGhlcmVmb3JlIGl0IG1ha2VzIHNlbnNlIHRvIGlubGluZSBpdAorKHJ1bnRpbWUpLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgaW5wdXQ6ICAgIC0gaGFuZGxlIHRvIEZESyBiaXRzdHJlYW0KICAgICAgICAgICAgICAgICAgIC0gcmVmZXJlbmNlIHZhbHVlIG1hcmtpbmcgc3RhcnQgb2YgYml0ZmllbGQKQEAgLTEyMCwyOCArMTMwLDI1IEBACiAgICAgICAgICAgICAgICAgICAtIHJlYWREaXJlY3Rpb24KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIHJldHVybjogICAtIGJpdCBmcm9tIGJpdHN0cmVhbQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLVVJTlQgSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oSEFORExFX0ZES19CSVRTVFJFQU0gIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAqcExlZnRTdGFydE9mU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgKnBSaWdodFN0YXJ0T2ZTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgcmVhZERpcmVjdGlvbikKLXsKLSAgVUlOVCAgIGJpdDsKLSAgSU5UICAgIHJlYWRCaXRPZmZzZXQ7CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK1VJTlQgSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIElOVCAqcExlZnRTdGFydE9mU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwUmlnaHRTdGFydE9mU2VnbWVudCwgVUNIQVIgcmVhZERpcmVjdGlvbikgeworICBVSU5UIGJpdDsKKyAgSU5UIHJlYWRCaXRPZmZzZXQ7CiAKICAgaWYgKHJlYWREaXJlY3Rpb24gPT0gRlJPTV9MRUZUX1RPX1JJR0hUKSB7Ci0gICAgcmVhZEJpdE9mZnNldCA9ICpwTGVmdFN0YXJ0T2ZTZWdtZW50LUZES2dldEJpdENudChicyk7Ci0gICAgaWYoIHJlYWRCaXRPZmZzZXQgKSB7CisgICAgcmVhZEJpdE9mZnNldCA9ICpwTGVmdFN0YXJ0T2ZTZWdtZW50IC0gRkRLZ2V0Qml0Q250KGJzKTsKKyAgICBpZiAocmVhZEJpdE9mZnNldCkgewogICAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoYnMsIHJlYWRCaXRPZmZzZXQpOwogICAgIH0KIAogICAgIGJpdCA9IEZES3JlYWRCaXRzKGJzLCAxKTsKIAogICAgICpwTGVmdFN0YXJ0T2ZTZWdtZW50ICs9IDE7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgcmVhZEJpdE9mZnNldCA9ICpwUmlnaHRTdGFydE9mU2VnbWVudC1GREtnZXRCaXRDbnQoYnMpOwotICAgIGlmKCByZWFkQml0T2Zmc2V0ICkgeworICB9IGVsc2UgeworICAgIHJlYWRCaXRPZmZzZXQgPSAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQgLSBGREtnZXRCaXRDbnQoYnMpOworICAgIGlmIChyZWFkQml0T2Zmc2V0KSB7CiAgICAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgcmVhZEJpdE9mZnNldCk7CiAgICAgfQogCkBAIC0xNTIsMTQgKzE1OSw1IEBACiAgICAgKnBSaWdodFN0YXJ0T2ZTZWdtZW50IC09IDE7CiAgIH0KIAotCi0jaWYgRVJST1JfR0VORVJBVE9SX0JJVF9TVFJFQU1fSENSCi0gIHN0YXRpYyBpbnQgYTsKLSAgaWYgKCgrK2EgJSBNT0RVTE9fRElWSVNPUl9IQ1IpID09IDApIHsKLSAgICBiaXQgPSAoYml0ID09IDApID8gMSA6IDA7Ci0gIH0KLSNlbmRpZgotCiAgIHJldHVybiAoYml0KTsKIH0KLQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyX2JpdC5oIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNyX2JpdC5oCmluZGV4IDg5OTRmZjEuLjdhNTdjOGMgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcl9iaXQuaAorKysgYi9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3JfYml0LmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjggKzkwLDI0IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIFJvYmVydCBXZWlkbmVyIChEU1AgU29sdXRpb25zKQorCiAgICBEZXNjcmlwdGlvbjogSENSIERlY29kZXI6IEJpdHN0cmVhbSByZWFkaW5nIHByb3RvdHlwZXMKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfQUFDREVDX0hDUl9CSVRfSF8KLSNkZWZpbmUgX0FBQ0RFQ19IQ1JfQklUX0hfCi0KLQorI2lmbmRlZiBBQUNERUNfSENSX0JJVF9ICisjZGVmaW5lIEFBQ0RFQ19IQ1JfQklUX0gKIAogI2luY2x1ZGUgImFhY2RlY19oY3IuaCIKIAogVUNIQVIgVG9nZ2xlUmVhZERpcmVjdGlvbihVQ0hBUiByZWFkRGlyZWN0aW9uKTsKIAotVUlOVCAgSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oSEFORExFX0ZES19CSVRTVFJFQU0gIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgcmVhZERpcmVjdGlvbik7CitVSU5UIEhjckdldEFCaXRGcm9tQml0c3RyZWFtKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBJTlQgKnBMZWZ0U3RhcnRPZlNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQsIFVDSEFSIHJlYWREaXJlY3Rpb24pOwogCi0KLSNlbmRpZiAvKiBfQUFDREVDX0hDUl9CSVRfSF8gKi8KKyNlbmRpZiAvKiBBQUNERUNfSENSX0JJVF9IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3JfdHlwZXMuaCBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcl90eXBlcy5oCmluZGV4IDMyM2VjNGUuLmQ1NTBiYzIgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcl90eXBlcy5oCisrKyBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcl90eXBlcy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIwICs5MCwxOSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBSb2JlcnQgV2VpZG5lciAoRFNQIFNvbHV0aW9ucykKKwogICAgRGVzY3JpcHRpb246IEhDUiBEZWNvZGVyOiBDb21tb24gZGVmaW5lcyBhbmQgc3RydWN0dXJlczsgZGVmaW5lcyBmb3IKICAgICAgICAgICAgICAgICBzd2l0Y2hpbmcgZXJyb3ItZ2VuZXJhdG9yLCAtZGV0ZWN0b3IsIGFuZCAtY29uY2VhbG1lbnQ7CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgX0FBQ0RFQ19IQ1JfVFlQRVNfSF8KLSNkZWZpbmUgX0FBQ0RFQ19IQ1JfVFlQRVNfSF8KLQotCisjaWZuZGVmIEFBQ0RFQ19IQ1JfVFlQRVNfSAorI2RlZmluZSBBQUNERUNfSENSX1RZUEVTX0gKIAogI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKICNpbmNsdWRlICJvdmVybGFwYWRkLmgiCkBAIC0xMDAsMTg2ICsxMTAsMjQ5IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jZGVmaW5lICBMSU5FU19QRVJfVU5JVCAgICAgICAgICAgICAgICA0CisjZGVmaW5lIExJTkVTX1BFUl9VTklUIDQKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIC0tLS0tLS0tLS0tIGJhc2ljIEhDUiBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLSAqLwogCi0KLSAjZGVmaW5lICBNQVhfU0ZCX0hDUiAgICAgICAgICAgICAgICAgKCgoMTAyNC84KSAvIExJTkVTX1BFUl9VTklUKSAqIDgpICAvKiAoOCAqIDE2KSBpcyBub3QgZW5vdWdoIGJlY2F1c2Ugc2ZicyBhcmUgc3BsaXQgaW4gdW5pdHMgZm9yIGJsb2NrdHlwZSBzaG9ydCAqLwotICNkZWZpbmUgIE5VTUJFUl9PRl9VTklUX0dST1VQUyAgICAgICAoTElORVNfUEVSX1VOSVQgKiA4KQotICNkZWZpbmUgIExJTkVTX1BFUl9VTklUX0dST1VQICAgICAgICAoMTAyNCAvIE5VTUJFUl9PRl9VTklUX0dST1VQUykgICAgIC8qIDE1IDE2IDMwIDMyICovCi0KKyNkZWZpbmUgTUFYX1NGQl9IQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgxMDI0IC8gOCkgLyBMSU5FU19QRVJfVU5JVCkgKiA4KSAvKiAoOCAqIDE2KSBpcyBub3QgZW5vdWdoIGJlY2F1c2Ugc2ZicyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBzcGxpdCBpbiB1bml0cyBmb3IgYmxvY2t0eXBlICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKi8KKyNkZWZpbmUgTlVNQkVSX09GX1VOSVRfR1JPVVBTIChMSU5FU19QRVJfVU5JVCAqIDgpCisjZGVmaW5lIExJTkVTX1BFUl9VTklUX0dST1VQICgxMDI0IC8gTlVNQkVSX09GX1VOSVRfR1JPVVBTKSAvKiAxNSAxNiAzMCAzMiAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNkZWZpbmUgIEZST01fTEVGVF9UT19SSUdIVCAgICAgICAgICAgIDAKLSNkZWZpbmUgIEZST01fUklHSFRfVE9fTEVGVCAgICAgICAgICAgIDEKKyNkZWZpbmUgRlJPTV9MRUZUX1RPX1JJR0hUIDAKKyNkZWZpbmUgRlJPTV9SSUdIVF9UT19MRUZUIDEKIAotI2RlZmluZSAgTUFYX0NCX1BBSVJTICAgICAgICAgICAgICAgICAgMjMKLSNkZWZpbmUgIE1BWF9IQ1JfU0VUUyAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIE1BWF9DQl9QQUlSUyAyMworI2RlZmluZSBNQVhfSENSX1NFVFMgMTQKIAotI2RlZmluZSAgRVNDQVBFX1ZBTFVFICAgICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgIFBPU0lUSU9OX09GX0ZMQUdfQSAgICAgICAgICAgIDIxCi0jZGVmaW5lICBQT1NJVElPTl9PRl9GTEFHX0IgICAgICAgICAgICAyMAorI2RlZmluZSBFU0NBUEVfVkFMVUUgMTYKKyNkZWZpbmUgUE9TSVRJT05fT0ZfRkxBR19BIDIxCisjZGVmaW5lIFBPU0lUSU9OX09GX0ZMQUdfQiAyMAogCi0jZGVmaW5lICBNQVhfQ0IgICAgICAgICAgICAgICAgICAgICAgICAzMiAgICAgLyogbGFzdCB1c2VkIENCIGlzIGNiICMzMSB3aGVuIFZDQjExIGlzIHVzZWQgKi8KKyNkZWZpbmUgTUFYX0NCIDMyIC8qIGxhc3QgdXNlZCBDQiBpcyBjYiAjMzEgd2hlbiBWQ0IxMSBpcyB1c2VkICovCiAKLSNkZWZpbmUgIE1BWF9DQl9DSEVDSyAgICAgICAgICAgICAgICAgIDMyICAgICAvKiBzdXBwb3J0IGZvciBWQ0IxMSBhdmFpbGFibGUgLS0gaXMgbW9yZSBnZW5lcmFsLCBjb3VsZCB0aGVyZWZvcmUgdXNlZCBpbiBib3RoIGNhc2VzICovCisjZGVmaW5lIE1BWF9DQl9DSEVDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMzIgLyogc3VwcG9ydCBmb3IgVkNCMTEgYXZhaWxhYmxlIC0tIGlzIG1vcmUgZ2VuZXJhbCwgY291bGQgdGhlcmVmb3JlIHVzZWQgXAorICAgICAgICBpbiBib3RoIGNhc2VzICovCiAKLSNkZWZpbmUgIE5VTUJFUl9PRl9CSVRfSU5fV09SRCAgICAgICAgIDMyCisjZGVmaW5lIE5VTUJFUl9PRl9CSVRfSU5fV09SRCAzMgogCiAvKiBsb2cgKi8KLSNkZWZpbmUgIFRISVJUWVRXT19MT0dfRElWX1RXT19MT0cgICAgIDUKLSNkZWZpbmUgIEVJR0hUX0xPR19ESVZfVFdPX0xPRyAgICAgICAgIDMKLSNkZWZpbmUgIEZPVVJfTE9HX0RJVl9UV09fTE9HICAgICAgICAgIDIKKyNkZWZpbmUgVEhJUlRZVFdPX0xPR19ESVZfVFdPX0xPRyA1CisjZGVmaW5lIEVJR0hUX0xPR19ESVZfVFdPX0xPRyAzCisjZGVmaW5lIEZPVVJfTE9HX0RJVl9UV09fTE9HIDIKIAogLyogYm9yZGVycyAqLwotI2RlZmluZSAgQ1BFX1RPUF9MRU5HVEggICAgICAgICAgICAgICAgMTIyODgKLSNkZWZpbmUgIFNDRV9UT1BfTEVOR1RIICAgICAgICAgICAgICAgIDYxNDQKLSNkZWZpbmUgIExFTl9PRl9MT05HRVNUX0NXX1RPUF9MRU5HVEggIDQ5CisjZGVmaW5lIENQRV9UT1BfTEVOR1RIIDEyMjg4CisjZGVmaW5lIFNDRV9UT1BfTEVOR1RIIDYxNDQKKyNkZWZpbmUgTEVOX09GX0xPTkdFU1RfQ1dfVE9QX0xFTkdUSCA0OQogCiAvKiBxc2MncyBvZiBoaWdoIGxldmVsICovCi0jZGVmaW5lICBRX1ZBTFVFX0lOVkFMSUQgICAgICAgICAgICAgICA4MTkyICAgLyogbWFyayBhIGludmFsaWQgbGluZSB3aXRoIHRoaXMgdmFsdWUgKHRvIGJlIGNvbmNlYWxlZCBsYXRlciBvbikgKi8KLSNkZWZpbmUgIEhDUl9ESVJBQyAgICAgICAgICAgICAgICAgICAgIDUwMCAgICAvKiBhIGxpbmUgb2YgaGlnaCBsZXZlbCAqLworI2RlZmluZSBRX1ZBTFVFX0lOVkFMSUQgXAorICA4MTkyIC8qIG1hcmsgYSBpbnZhbGlkIGxpbmUgd2l0aCB0aGlzIHZhbHVlICh0byBiZSBjb25jZWFsZWQgbGF0ZXIgb24pICovCisjZGVmaW5lIEhDUl9ESVJBQyA1MDAgLyogYSBsaW5lIG9mIGhpZ2ggbGV2ZWwgKi8KIAogLyogbWFza3MgKi8KLSNkZWZpbmUgIE1BU0tfTEVGVCAgICAgICAgICAgICAgICAgICAgIDB4RkZGMDAwCi0jZGVmaW5lICBNQVNLX1JJR0hUICAgICAgICAgICAgICAgICAgICAweEZGRgotI2RlZmluZSAgQ0xSX0JJVF8xMCAgICAgICAgICAgICAgICAgICAgMHgzRkYKLSNkZWZpbmUgIFRFU1RfQklUXzEwICAgICAgICAgICAgICAgICAgIDB4NDAwCisjZGVmaW5lIE1BU0tfTEVGVCAweEZGRjAwMAorI2RlZmluZSBNQVNLX1JJR0hUIDB4RkZGCisjZGVmaW5lIENMUl9CSVRfMTAgMHgzRkYKKyNkZWZpbmUgVEVTVF9CSVRfMTAgMHg0MDAKIAotI2RlZmluZSAgTEVGVF9PRkZTRVQgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgTEVGVF9PRkZTRVQgMTIKIAotLyogd2hlbiBzZXQgSENSIGlzIHJlcGxhY2VkIGJ5IGEgZHVtbXktbW9kdWxlIHdoaWNoIGp1c3QgZmlsbHMgdGhlIG91dHB1dGJ1ZmZlciB3aXRoIGEgZGlyYWMgc2VxdWVuY2UgKi8KLS8qIHVzZSB0aGlzIGlmIEhDUiBpcyBzdXNwZWN0ZWQgdG8gd3JpdGUgaW4gb3RoZXIgbW9kdWxlcyAtLSBpZiBlcnJvciBpcyBzdGVsbCB0aGVyZSwgSENSIGlzIGlubm9jZW50ICovCi0jZGVmaW5lIFVTRV9IQ1JfRFVNTVkgICAgICAgICAgICAgICAgICAgICAwCi0KKy8qIHdoZW4gc2V0IEhDUiBpcyByZXBsYWNlZCBieSBhIGR1bW15LW1vZHVsZSB3aGljaCBqdXN0IGZpbGxzIHRoZSBvdXRwdXRidWZmZXIKKyAqIHdpdGggYSBkaXJhYyBzZXF1ZW5jZSAqLworLyogdXNlIHRoaXMgaWYgSENSIGlzIHN1c3BlY3RlZCB0byB3cml0ZSBpbiBvdGhlciBtb2R1bGVzIC0tIGlmIGVycm9yIGlzIHN0ZWxsCisgKiB0aGVyZSwgSENSIGlzIGlubm9jZW50ICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogLSAgICBpbnNlcnQgSENSIGVycm9ycyAgICAgICAtICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotICAvKiBtb2RpZnkgaW5wdXQgbGVuZ3RocyAtLSBoaWdoIHByb3RlY3RlZCAqLwotI2RlZmluZSBFUlJPUl9MT1JTRCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogb2Zmc2V0OiBlcnJvciBpZiBkaWZmZXJlbnQgZnJvbSB6ZXJvICovCi0jZGVmaW5lIEVSUk9SX0xPTEMgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBvZmZzZXQ6IGVycm9yIGlmIGRpZmZlcmVudCBmcm9tIHplcm8gKi8KKy8qIG1vZGlmeSBpbnB1dCBsZW5ndGhzIC0tIGhpZ2ggcHJvdGVjdGVkICovCisjZGVmaW5lIEVSUk9SX0xPUlNEIDAgLyogb2Zmc2V0OiBlcnJvciBpZiBkaWZmZXJlbnQgZnJvbSB6ZXJvICovCisjZGVmaW5lIEVSUk9SX0xPTEMgMCAgLyogb2Zmc2V0OiBlcnJvciBpZiBkaWZmZXJlbnQgZnJvbSB6ZXJvICovCiAKLSAgLyogc2VnbWVudHMgYXJlIGVhcmxpZXIgZW1wdHkgYXMgZXhwZWN0ZWQgd2hlbiBkZWNvZGluZyBQQ1dzICovCi0jZGVmaW5lIEVSUk9SX1BDV19CT0RZICAgICAgICAgICAgICAgICAgICAwICAvKiBzZXQgYSBwb3NpdGl2ZSB2YWx1ZXMgdG8gdHJpZ2dlciB0aGUgZXJyb3IgKG1ha2Ugc2VnbWVudHMgZWFybHllciBhcHBlYXIgdG8gYmUgZW1wdHkpICovCi0jZGVmaW5lIEVSUk9SX1BDV19CT0RZX1NJR04gICAgICAgICAgICAgICAwICAvKiBzZXQgYSBwb3NpdGl2ZSB2YWx1ZXMgdG8gdHJpZ2dlciB0aGUgZXJyb3IgKG1ha2Ugc2VnbWVudHMgZWFybHllciBhcHBlYXIgdG8gYmUgZW1wdHkpICovCi0jZGVmaW5lIEVSUk9SX1BDV19CT0RZX1NJR05fRVNDICAgICAgICAgICAwICAvKiBzZXQgYSBwb3NpdGl2ZSB2YWx1ZXMgdG8gdHJpZ2dlciB0aGUgZXJyb3IgKG1ha2Ugc2VnbWVudHMgZWFybHllciBhcHBlYXIgdG8gYmUgZW1wdHkpICovCisvKiBzZWdtZW50cyBhcmUgZWFybGllciBlbXB0eSBhcyBleHBlY3RlZCB3aGVuIGRlY29kaW5nIFBDV3MgKi8KKyNkZWZpbmUgRVJST1JfUENXX0JPRFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDAgLyogc2V0IGEgcG9zaXRpdmUgdmFsdWVzIHRvIHRyaWdnZXIgdGhlIGVycm9yIChtYWtlIHNlZ21lbnRzIGVhcmx5ZXIgXAorICAgICAgIGFwcGVhciB0byBiZSBlbXB0eSkgKi8KKyNkZWZpbmUgRVJST1JfUENXX0JPRFlfU0lHTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDAgLyogc2V0IGEgcG9zaXRpdmUgdmFsdWVzIHRvIHRyaWdnZXIgdGhlIGVycm9yIChtYWtlIHNlZ21lbnRzIGVhcmx5ZXIgXAorICAgICAgIGFwcGVhciB0byBiZSBlbXB0eSkgKi8KKyNkZWZpbmUgRVJST1JfUENXX0JPRFlfU0lHTl9FU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDAgLyogc2V0IGEgcG9zaXRpdmUgdmFsdWVzIHRvIHRyaWdnZXIgdGhlIGVycm9yIChtYWtlIHNlZ21lbnRzIGVhcmx5ZXIgXAorICAgICAgIGFwcGVhciB0byBiZSBlbXB0eSkgKi8KIAotICAvKiBwcmV0ZW5kIHRoZXJlIGFyZSB0b28gbWFueSBiaXRzIGRlY29kZWQgKGVubGFyZ2UgbGVuZ3RoIG9mIGNvZGV3b3JkKSBhdCBQQ1dzIC0tIHVzZSBhIHBvc2l0aXZlIHZhbHVlICovCi0jZGVmaW5lIEVSUk9SX1BDV19CT0RZX09OTFlfVE9PX0xPTkcgICAgICAwICAvKiBzZXQgYSBwb3NpdGl2ZSB2YWx1ZXMgdG8gdHJpZ2dlciB0aGUgZXJyb3IgKi8KLSNkZWZpbmUgRVJST1JfUENXX0JPRFlfU0lHTl9UT09fTE9ORyAgICAgIDAgIC8qIHNldCBhIHBvc2l0aXZlIHZhbHVlcyB0byB0cmlnZ2VyIHRoZSBlcnJvciAqLwotI2RlZmluZSBFUlJPUl9QQ1dfQk9EWV9TSUdOX0VTQ19UT09fTE9ORyAgMCAgLyogc2V0IGEgcG9zaXRpdmUgdmFsdWVzIHRvIHRyaWdnZXIgdGhlIGVycm9yICovCisvKiBwcmV0ZW5kIHRoZXJlIGFyZSB0b28gbWFueSBiaXRzIGRlY29kZWQgKGVubGFyZ2UgbGVuZ3RoIG9mIGNvZGV3b3JkKSBhdCBQQ1dzCisgKiAtLSB1c2UgYSBwb3NpdGl2ZSB2YWx1ZSAqLworI2RlZmluZSBFUlJPUl9QQ1dfQk9EWV9PTkxZX1RPT19MT05HIFwKKyAgMCAvKiBzZXQgYSBwb3NpdGl2ZSB2YWx1ZXMgdG8gdHJpZ2dlciB0aGUgZXJyb3IgKi8KKyNkZWZpbmUgRVJST1JfUENXX0JPRFlfU0lHTl9UT09fTE9ORyBcCisgIDAgLyogc2V0IGEgcG9zaXRpdmUgdmFsdWVzIHRvIHRyaWdnZXIgdGhlIGVycm9yICovCisjZGVmaW5lIEVSUk9SX1BDV19CT0RZX1NJR05fRVNDX1RPT19MT05HIFwKKyAgMCAvKiBzZXQgYSBwb3NpdGl2ZSB2YWx1ZXMgdG8gdHJpZ2dlciB0aGUgZXJyb3IgKi8KIAotICAvKiBtb2RpZnkgSENSIGJpdHN0cmVhbSBibG9jayAqLwotI2RlZmluZSBFUlJPUl9HRU5FUkFUT1JfQklUX1NUUkVBTV9IQ1IgICAgMCAgLyogbW9kaWZ5IGV2ZXJ5IDxNT0RVTE9fRElWSVNPUl9IQ1I+LWJpdCB3aGVuIHJlYWRpbmcgZnJvbSBiaXRzdHJlYW0gKi8gLyogISEhIEJFV0FSRSEhISBpZiBSVkxDIGlzIGFjdGl2ZSwgYWxzbyBSVkxDIGRhdGEgYXQgRVNDMiB3aWxsIGJlIG1vZGlmaWVkICEhISAqLwotI2RlZmluZSBNT0RVTE9fRElWSVNPUl9IQ1IgICAgICAgICAgICAgICAzMAorLyogbW9kaWZ5IEhDUiBiaXRzdHJlYW0gYmxvY2sgKi8KIAorI2RlZmluZSBNT0RVTE9fRElWSVNPUl9IQ1IgMzAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiAtICAgIGRldGVjdCBIQ1IgZXJyb3JzICAgICAgIC0gKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAvKiBjaGVjayBpbnB1dCBkYXRhICovCi0jZGVmaW5lIENIRUNLX1ZBTElEX0hDUl9JTlBVVCAgICAgICAgICAgICAxICAvKiBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdG8gY2hlY2sgaW5wdXQgZGF0YSAqLworLyogY2hlY2sgaW5wdXQgZGF0YSAqLwogCi0gIC8qIGR1cmluZyBkZWNvZGluZyAqLwotI2RlZmluZSBDSEVDS19TRUdNRU5UQVRJT05fSU1NRURJQVRFTFkgICAgMSAgLyogdGhlIDIgb3IgNCBsaW5lcyBvZiBhIGRldGVjdGVkIFBDVy1kZWNvZGluZy1lcnJvciBpcyBtYXJrZWQgKi8KKy8qIGR1cmluZyBkZWNvZGluZyAqLwogCi0jZGVmaW5lIENIRUNLX1NFR01FTlRBVElPTl9GSU5BTCAgICAgICAgICAxICAvKiBhbGwgdGhlIHNlZ21lbnRzIGFyZSBjaGVja2VkIC0tIHRoZXJlZm9yZSAtLSBpZiB0aGlzIGNoZWNrIHBhc3NlcywgaXRzIGEga2luZCBvZiBldmlkZW5jZSB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCBQQ1dzIGFuZCBub24tUENXcyBhcmUgZmluZSAqLworLyogYWxsIHRoZSBzZWdtZW50cyBhcmUgY2hlY2tlZCAtLSB0aGVyZWZvcmUgLS0gaWYgdGhpcyBjaGVjayBwYXNzZXMsIGl0cyBhIGtpbmQKKyAgIG9mIGV2aWRlbmNlIHRoYXQgdGhlIGRlY29kZWQgUENXcyBhbmQgbm9uLVBDV3MgYXJlIGZpbmUgKi8KIAotI2RlZmluZSBERVRFQ1RfVE9PX0xPTkdfQ1dfUkVBRFMgICAgICAgICAgMSAgLyogaWYgYSBjb2Rld29yZCBpcyBkZWNvZGVkIHRoZXJlIGV4aXN0cyBhIGJvcmRlciBmb3IgdGhlIG51bWJlciBvZiBiaXRzLCB3aGljaCBhcmUgYWxsb3dlZCB0byByZWFkIGZvciB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rld29yZC4gVGhpcyBib3JkZXIgaXMgdGhlIG1pbmltdW0gb2YgdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBjb2Rld29yZCAoZm9yIHRoZSBjdXJyZW50bHkgdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWJvb2spIGFuZCB0aGUgc2VwYXJhdGVseSB0cmFuc21pdHRlZCAnbGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQnIGluIHRoaXMgZnJhbWUgYW5kIGNoYW5uZWwuIFRoZSBudW1iZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGRlY29kZWQgYml0cyBpcyBjb3VudGVkIChmb3IgUENXcyBvbmx5IC0tIHRoZXJlIGl0IG1ha2VzIHJlYWxseSBzZW5zZSBpbiBteSBvcGluaW9uKS4gSWYgdGhpcyBudW1iZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VlZHMgdGhlIGJvcmRlciAoZGVyaXZlZCBhcyBtaW5pbXVtIC0tIHNlZSBhYm92ZSksIGEgZXJyb3IgaXMgZGV0ZWN0ZWQuICovCisvKiBpZiBhIGNvZGV3b3JkIGlzIGRlY29kZWQgdGhlcmUgZXhpc3RzIGEgYm9yZGVyIGZvciB0aGUgbnVtYmVyIG9mIGJpdHMsIHdoaWNoCisgICBhcmUgYWxsb3dlZCB0byByZWFkIGZvciB0aGlzIGNvZGV3b3JkLiBUaGlzIGJvcmRlciBpcyB0aGUgbWluaW11bSBvZiB0aGUKKyAgIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBjb2Rld29yZCAoZm9yIHRoZSBjdXJyZW50bHkgdXNlZCBjb2RlYm9vaykgYW5kIHRoZQorICAgc2VwYXJhdGVseSB0cmFuc21pdHRlZCAnbGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQnIGluIHRoaXMgZnJhbWUgYW5kIGNoYW5uZWwuCisgICBUaGUgbnVtYmVyIG9mIGRlY29kZWQgYml0cyBpcyBjb3VudGVkIChmb3IgUENXcyBvbmx5IC0tIHRoZXJlIGl0IG1ha2VzIHJlYWxseQorICAgc2Vuc2UgaW4gbXkgb3BpbmlvbikuIElmIHRoaXMgbnVtYmVyIGV4Y2VlZHMgdGhlIGJvcmRlciAoZGVyaXZlZCBhcyBtaW5pbXVtCisgICAtLSBzZWUgYWJvdmUpLCBhIGVycm9yIGlzIGRldGVjdGVkLiAqLwogCi0jZGVmaW5lIFNUQVRFX01BQ0hJTkVfRVJST1JfQ0hFQ0sgICAgICAgICAxICAvKiB0ZXN0IGlmIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGJpdHMgaW4gYSBzZWdtZW50IGlzIF9iZWxvd18gemVyby4gSWYgdGhlcmUgYXJlIG5vIGVycm9ycyB0aGUgbG93ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkIHZhbHVlIGZvciByZW1haW5pbmdCaXRzSW5TZWdtZW50IGlzIHplcm8uIFRoaXMgY2hlY2sgYWxzbyBjb3VsZCBiZSBzZXQgdG8gemVybyAoc2F2ZSBydW50aW1lKSAqLwotICAvKiBvdGhlciAqLwotI2RlZmluZSBWQUxJRF9MQVZfRVJST1JfVFJJR0dFUiAgICAgICAgICAgMSAgLyogd2hlbiBzZXQgdG8gJzEnLCBhdm9pZCBzZXR0aW5nIHRoZSBMQVYtRmxhZyBpbiBlcnJvckxvZyBkdWUgdG8gYSBwcmV2aW91cy1saW5lLW1hcmtpbmcgKGF0IFBDVyBkZWNvZGVyKS4gQSBsaXR0bGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUgcnVudGltZSBpcyBuZWVkZWQgdGhlbiB3aGVuIHdyaXRpbmcgdmFsdWVzIG91dCBpbnRvIG91dHB1dC1idWZmZXIuICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVGhpcyBlcnJvciBjaGVjayBjb3VsZCBiZSBzZXQgdG8gemVybyBiZWNhdXNlIGR1ZSB0byBhIHRlc3Qgd2l0aGluCisgICBSVkxDLUVzY2FwZS1odWZmbWFuLURlY29kZXIgYSB0b28gbG9uZyBjb2Rld29yZCBjb3VsZCBub3QgYmUgZGV0ZWN0ZWQgLS0gaXQKKyAgIHNlZW1zIHRoYXQgZm9yIFJWTEMtRXNjYXBlLUNvZGV3b3JkIHRoZSBjb2Rlcm9vbSBpcyB1c2VkIHRvIDEwMCUuIFRoZXJlZm9yZSBJCisgICBhc3N1bWUgdGhhdCB0aGUgY29kZXJvb20gaXMgdXNlZCB0byAxMDAlIGFsc28gZm9yIHRoZSBjb2RlYm9va3MgMS4uMTEgdXNlZCBhdAorICAgSENSIFRoZXJlZm9yZSB0aGlzIHRlc3QgaXMgZGVhY3RpdmF0ZWQgcGVuZGluZyBmdXJ0aGVyIG5vdGljZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCi0jZGVmaW5lIEhDUl9MSVNURU5fVE9fTVVURURfTElORVMgICAgICAgICAwICAvKiBsaXN0ZW4gdG8gdGhlICJlcnJvci1jb25jZWFsbWVudCIgZm9yIHRlc3RpbmcgKi8KKy8qIHRlc3QgaWYgdGhlIG51bWJlciBvZiByZW1haW5pbmcgYml0cyBpbiBhIHNlZ21lbnQgaXMgX2JlbG93XyB6ZXJvLiBJZiB0aGVyZQorICAgYXJlIG5vIGVycm9ycyB0aGUgbG93ZXN0IGFsbG93ZWQgdmFsdWUgZm9yIHJlbWFpbmluZ0JpdHNJblNlZ21lbnQgaXMgemVyby4KKyAgIFRoaXMgY2hlY2sgYWxzbyBjb3VsZCBiZSBzZXQgdG8gemVybyAoc2F2ZSBydW50aW1lKSAqLworCisvKiBvdGhlciAqLworLyogd2hlbiBzZXQgdG8gJzEnLCBhdm9pZCBzZXR0aW5nIHRoZSBMQVYtRmxhZyBpbiBlcnJvckxvZyBkdWUgdG8gYQorICAgcHJldmlvdXMtbGluZS1tYXJraW5nIChhdCBQQ1cgZGVjb2RlcikuIEEgbGl0dGxlIG1vcmUgcnVudGltZSBpcyBuZWVkZWQgdGhlbgorICAgd2hlbiB3cml0aW5nIHZhbHVlcyBvdXQgaW50byBvdXRwdXQtYnVmZmVyLiAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIC0gICAgY29uY2VhbCBIQ1IgZXJyb3JzICAgICAgLSAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNkZWZpbmUgSENSX0VSUk9SX0NPTkNFQUxNRU5UICAgICAgICAgICAgIDEgIC8qIGlmIHNldCB0byAnMScsIEhDUiBfbXV0ZXNfIHRoZSBlcnJlZCBxdWFudGl6ZWQgc3BlY3RyYWwgY29lZmZpY2llbnRzICovCi0KKyNkZWZpbmUgSENSX0VSUk9SX0NPTkNFQUxNRU5UIFwKKyAgMSAvKiBpZiBzZXQgdG8gJzEnLCBIQ1IgX211dGVzXyB0aGUgZXJyZWQgcXVhbnRpemVkIHNwZWN0cmFsIGNvZWZmaWNpZW50cyAqLwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckxvZzogQSB3b3JkIG9mIDMyIGJpdHMgdXNlZCBmb3IgbG9nZ2luZyBwb3NzaWJsZSBlcnJvcnMgd2l0aGluIEhDUgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBjYXNlIG9mIGRpc3RvcnRlZCBiaXRzdHJlYW1zLiBUYWJsZSBvZiBhbGwga25vd24gZXJyb3JzOgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTG9nOiBBIHdvcmQgb2YgMzIgYml0cyB1c2VkIGZvcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcgcG9zc2libGUgZXJyb3JzIHdpdGhpbiBIQ1IKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gY2FzZSBvZiBkaXN0b3J0ZWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtcy4gVGFibGUgb2YgYWxsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub3duIGVycm9yczoKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXQgIGZhdGFsICBsb2NhdGlvbiAgICBtZWFuaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0tLS0rLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNkZWZpbmUgU0VHTUVOVF9PVkVSUklERV9FUlJfUENXX0JPRFkgICAgICAgICAgIDB4ODAwMDAwMDAgLy8gIDMxICAgbm8gICAgUENXLURlYyAgICAgRHVyaW5nIFBDVyBkZWNvZGluZyBpdCBpcyBjaGVja2VkIGFmdGVyIGV2ZXJ5IFBDVyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYml0cyBkZWNvZGVkIChpbW1lZGlhdGUgY2hlY2spLgotI2RlZmluZSBTRUdNRU5UX09WRVJSSURFX0VSUl9QQ1dfQk9EWV9TSUdOICAgICAgMHg0MDAwMDAwMCAvLyAgMzAgICBubyAgICBQQ1ctRGVjICAgICBEdXJpbmcgUENXIGRlY29kaW5nIGl0IGlzIGNoZWNrZWQgYWZ0ZXIgZXZlcnkgUENXIGlmIHRoZXJlIGFyZSB0b28gbWFueSBiaXRzIGRlY29kZWQgKGltbWVkaWF0ZSBjaGVjaykuCi0jZGVmaW5lIFNFR01FTlRfT1ZFUlJJREVfRVJSX1BDV19CT0RZX1NJR05fRVNDICAweDIwMDAwMDAwIC8vICAyOSAgIG5vICAgIFBDVy1EZWMgICAgIER1cmluZyBQQ1cgZGVjb2RpbmcgaXQgaXMgY2hlY2tlZCBhZnRlciBldmVyeSBQQ1cgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGJpdHMgZGVjb2RlZCAoaW1tZWRpYXRlIGNoZWNrKS4KLSNkZWZpbmUgRVhURU5ERURfU09SVEVEX0NPVU5URVJfT1ZFUkZMT1cgICAgICAgIDB4MTAwMDAwMDAgLy8gIDI4ICAgeWVzICAgSW5pdC1EZWMgICAgRXJyb3IgZHVyaW5nIGV4dGVuZGluZyBzaWRlaW5mbyAobmVpdGhlciBhIFBDVyBub3IgYSBub25QQ1cgd2FzIGRlY29kZWQgc28gZmFyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwODAwMDAwMCAvLyAgMjcgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwNDAwMDAwMCAvLyAgMjYgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMjAwMDAwMCAvLyAgMjUgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMTAwMDAwMCAvLyAgMjQgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMDgwMDAwMCAvLyAgMjMgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMDQwMDAwMCAvLyAgMjIgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMDIwMDAwMCAvLyAgMjEgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMDEwMDAwMCAvLyAgMjAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZAorLy8gYml0ICBmYXRhbCAgbG9jYXRpb24gICAgbWVhbmluZworLy8gLS0tLSstLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBTRUdNRU5UX09WRVJSSURFX0VSUl9QQ1dfQk9EWSBcCisgIDB4ODAwMDAwMDAgIC8vICAzMSAgIG5vICAgIFBDVy1EZWMgICAgIER1cmluZyBQQ1cgZGVjb2RpbmcgaXQgaXMgY2hlY2tlZCBhZnRlcgorICAgICAgICAgICAgICAvLyAgZXZlcnkgUENXIGlmIHRoZXJlIGFyZSB0b28gbWFueSBiaXRzIGRlY29kZWQgKGltbWVkaWF0ZQorICAgICAgICAgICAgICAvLyAgY2hlY2spLgorI2RlZmluZSBTRUdNRU5UX09WRVJSSURFX0VSUl9QQ1dfQk9EWV9TSUdOIFwKKyAgMHg0MDAwMDAwMCAgLy8gIDMwICAgbm8gICAgUENXLURlYyAgICAgRHVyaW5nIFBDVyBkZWNvZGluZyBpdCBpcyBjaGVja2VkIGFmdGVyCisgICAgICAgICAgICAgIC8vICBldmVyeSBQQ1cgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGJpdHMgZGVjb2RlZCAoaW1tZWRpYXRlCisgICAgICAgICAgICAgIC8vICBjaGVjaykuCisjZGVmaW5lIFNFR01FTlRfT1ZFUlJJREVfRVJSX1BDV19CT0RZX1NJR05fRVNDIFwKKyAgMHgyMDAwMDAwMCAgLy8gIDI5ICAgbm8gICAgUENXLURlYyAgICAgRHVyaW5nIFBDVyBkZWNvZGluZyBpdCBpcyBjaGVja2VkIGFmdGVyCisgICAgICAgICAgICAgIC8vICBldmVyeSBQQ1cgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGJpdHMgZGVjb2RlZCAoaW1tZWRpYXRlCisgICAgICAgICAgICAgIC8vICBjaGVjaykuCisjZGVmaW5lIEVYVEVOREVEX1NPUlRFRF9DT1VOVEVSX09WRVJGTE9XIFwKKyAgMHgxMDAwMDAwMCAgLy8gIDI4ICAgeWVzICAgSW5pdC1EZWMgICAgRXJyb3IgZHVyaW5nIGV4dGVuZGluZyBzaWRlaW5mbworICAgICAgICAgICAgICAvLyAgKG5laXRoZXIgYSBQQ1cgbm9yIGEgbm9uUENXIHdhcyBkZWNvZGVkIHNvIGZhcikKKyAgICAgICAgICAgICAgLy8gMHgwODAwMDAwMCAvLyAgMjcgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZAorICAgICAgICAgICAgICAvLyAweDA0MDAwMDAwIC8vICAyNiAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCisgICAgICAgICAgICAgIC8vIDB4MDIwMDAwMDAgLy8gIDI1ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQKKyAgICAgICAgICAgICAgLy8gMHgwMTAwMDAwMCAvLyAgMjQgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZAorICAgICAgICAgICAgICAvLyAweDAwODAwMDAwIC8vICAyMyAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCisgICAgICAgICAgICAgIC8vIDB4MDA0MDAwMDAgLy8gIDIyICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQKKyAgICAgICAgICAgICAgLy8gMHgwMDIwMDAwMCAvLyAgMjEgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZAorICAgICAgICAgICAgICAvLyAweDAwMTAwMDAwIC8vICAyMCAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsIGVycm9ycyAqLwotI2RlZmluZSBUT09fTUFOWV9QQ1dfQk9EWV9CSVRTX0RFQ09ERUQgICAgICAgICAgMHgwMDA4MDAwMCAvLyAgMTkgICB5ZXMgICBQQ1ctRGVjICAgICBEdXJpbmcgUENXLWJvZHktZGVjb2RpbmcgdG9vIG1hbnkgYml0cyBoYXZlIGJlZW4gcmVhZCBmcm9tIGJpdHN0cmVhbSAtLSBhZHZpY2U6IHNraXAgbm9uLVBDVyBkZWNvZGluZwotI2RlZmluZSBUT09fTUFOWV9QQ1dfQk9EWV9TSUdOX0JJVFNfREVDT0RFRCAgICAgMHgwMDA0MDAwMCAvLyAgMTggICB5ZXMgICBQQ1ctRGVjICAgICBEdXJpbmcgUENXLWJvZHktc2lnbi1kZWNvZGluZyB0b28gbWFueSBiaXRzIGhhdmUgYmVlbiByZWFkIGZyb20gYml0c3RyZWFtIC0tIGFkdmljZTogc2tpcCBub24tUENXIGRlY29kaW5nCi0jZGVmaW5lIFRPT19NQU5ZX1BDV19CT0RZX1NJR05fRVNDX0JJVFNfREVDT0RFRCAweDAwMDIwMDAwIC8vICAxNyAgIHllcyAgIFBDVy1EZWMgICAgIER1cmluZyBQQ1ctYm9keS1zaWduLWVzYy1kZWNvZGluZyB0b28gbWFueSBiaXRzIGhhdmUgYmVlbiByZWFkIGZyb20gYml0c3RyZWFtIC0tIGFkdmljZTogc2tpcCBub24tUENXIGRlY29kaW5nCisvKiBzcGVjaWFsIGVycm9ycyAqLworI2RlZmluZSBUT09fTUFOWV9QQ1dfQk9EWV9CSVRTX0RFQ09ERUQgXAorICAweDAwMDgwMDAwICAvLyAgMTkgICB5ZXMgICBQQ1ctRGVjICAgICBEdXJpbmcgUENXLWJvZHktZGVjb2RpbmcgdG9vIG1hbnkgYml0cworICAgICAgICAgICAgICAvLyAgaGF2ZSBiZWVuIHJlYWQgZnJvbSBiaXRzdHJlYW0gLS0gYWR2aWNlOiBza2lwIG5vbi1QQ1cgZGVjb2RpbmcKKyNkZWZpbmUgVE9PX01BTllfUENXX0JPRFlfU0lHTl9CSVRTX0RFQ09ERUQgXAorICAweDAwMDQwMDAwICAvLyAgMTggICB5ZXMgICBQQ1ctRGVjICAgICBEdXJpbmcgUENXLWJvZHktc2lnbi1kZWNvZGluZyB0b28gbWFueQorICAgICAgICAgICAgICAvLyAgYml0cyBoYXZlIGJlZW4gcmVhZCBmcm9tIGJpdHN0cmVhbSAtLSBhZHZpY2U6IHNraXAgbm9uLVBDVworICAgICAgICAgICAgICAvLyAgZGVjb2RpbmcKKyNkZWZpbmUgVE9PX01BTllfUENXX0JPRFlfU0lHTl9FU0NfQklUU19ERUNPREVEIFwKKyAgMHgwMDAyMDAwMCAgLy8gIDE3ICAgeWVzICAgUENXLURlYyAgICAgRHVyaW5nIFBDVy1ib2R5LXNpZ24tZXNjLWRlY29kaW5nIHRvbworICAgICAgICAgICAgICAvLyAgbWFueSBiaXRzIGhhdmUgYmVlbiByZWFkIGZyb20gYml0c3RyZWFtIC0tIGFkdmljZTogc2tpcAorICAgICAgICAgICAgICAvLyAgbm9uLVBDVyBkZWNvZGluZwogCisvLyAweDAwMDEwMDAwIC8vICAxNiAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkCisjZGVmaW5lIFNUQVRFX0VSUk9SX0JPRFlfT05MWSBcCisgIDB4MDAwMDgwMDAgIC8vICAxNSAgIG5vICAgIE5vblBDVy1EZWMgIFN0YXRlIG1hY2hpbmUgcmV0dXJuZWQgd2l0aCBlcnJvcgorI2RlZmluZSBTVEFURV9FUlJPUl9CT0RZX1NJR05fX0JPRFkgXAorICAweDAwMDA0MDAwICAvLyAgMTQgICBubyAgICBOb25QQ1ctRGVjICBTdGF0ZSBtYWNoaW5lIHJldHVybmVkIHdpdGggZXJyb3IKKyNkZWZpbmUgU1RBVEVfRVJST1JfQk9EWV9TSUdOX19TSUdOIFwKKyAgMHgwMDAwMjAwMCAgLy8gIDEzICAgbm8gICAgTm9uUENXLURlYyAgU3RhdGUgbWFjaGluZSByZXR1cm5lZCB3aXRoIGVycm9yCisjZGVmaW5lIFNUQVRFX0VSUk9SX0JPRFlfU0lHTl9FU0NfX0JPRFkgXAorICAweDAwMDAxMDAwICAvLyAgMTIgICBubyAgICBOb25QQ1ctRGVjICBTdGF0ZSBtYWNoaW5lIHJldHVybmVkIHdpdGggZXJyb3IKKyNkZWZpbmUgU1RBVEVfRVJST1JfQk9EWV9TSUdOX0VTQ19fU0lHTiBcCisgIDB4MDAwMDA4MDAgIC8vICAxMSAgIG5vICAgIE5vblBDVy1EZWMgIFN0YXRlIG1hY2hpbmUgcmV0dXJuZWQgd2l0aCBlcnJvcgorI2RlZmluZSBTVEFURV9FUlJPUl9CT0RZX1NJR05fRVNDX19FU0NfUFJFRklYIFwKKyAgMHgwMDAwMDQwMCAgLy8gIDEwICAgbm8gICAgTm9uUENXLURlYyAgU3RhdGUgbWFjaGluZSByZXR1cm5lZCB3aXRoIGVycm9yCisjZGVmaW5lIFNUQVRFX0VSUk9SX0JPRFlfU0lHTl9FU0NfX0VTQ19XT1JEIFwKKyAgMHgwMDAwMDIwMCAgLy8gICA5ICAgbm8gICAgTm9uUENXLURlYyAgU3RhdGUgbWFjaGluZSByZXR1cm5lZCB3aXRoIGVycm9yCisjZGVmaW5lIEhDUl9TSV9MRU5HVEhTX0ZBSUxVUkUgXAorICAweDAwMDAwMTAwICAvLyAgIDggICB5ZXMgICBJbml0LURlYyAgICBMZW5ndGhPZkxvbmdlc3RDb2Rld29yZCBtdXN0IG5vdCBiZQorICAgICAgICAgICAgICAvLyAgIGxlc3MgdGhhbiBsZW5naHRPZlJlb3JkZXJlZFNwZWN0cmFsRGF0YQorI2RlZmluZSBOVU1fU0VDVF9PVVRfT0ZfUkFOR0VfU0hPUlRfQkxPQ0sgXAorICAweDAwMDAwMDgwICAvLyAgIDcgICB5ZXMgICBJbml0LURlYyAgICBUaGUgbnVtYmVyIG9mIHNlY3Rpb25zIGlzIG5vdCB3aXRoaW4KKyAgICAgICAgICAgICAgLy8gICB0aGUgYWxsb3dlZCByYW5nZSAoc2hvcnQgYmxvY2spCisjZGVmaW5lIE5VTV9TRUNUX09VVF9PRl9SQU5HRV9MT05HX0JMT0NLIFwKKyAgMHgwMDAwMDA0MCAgLy8gICA2ICAgeWVzICAgSW5pdC1EZWMgICAgVGhlIG51bWJlciBvZiBzZWN0aW9ucyBpcyBub3Qgd2l0aGluCisgICAgICAgICAgICAgIC8vICAgdGhlIGFsbG93ZWQgcmFuZ2UgKGxvbmcgYmxvY2spCisjZGVmaW5lIExJTkVfSU5fU0VDVF9PVVRfT0ZfUkFOR0VfU0hPUlRfQkxPQ0sgXAorICAweDAwMDAwMDIwICAvLyAgIDUgICB5ZXMgICBJbml0LURlYyAgICBUaGUgbnVtYmVyIG9mIGxpbmVzIHBlciBzZWN0aW9uIGlzIG5vdAorICAgICAgICAgICAgICAvLyAgIHdpdGhpbiB0aGUgYWxsb3dlZCByYW5nZSAoc2hvcnQgYmxvY2spCisjZGVmaW5lIENCX09VVF9PRl9SQU5HRV9TSE9SVF9CTE9DSyBcCisgIDB4MDAwMDAwMTAgIC8vICAgNCAgIHllcyAgIEluaXQtRGVjICAgIFRoZSBjb2RlYm9vayBpcyBub3Qgd2l0aGluIHRoZSBhbGxvd2VkCisgICAgICAgICAgICAgIC8vICAgcmFuZ2UgKHNob3J0IGJsb2NrKQorI2RlZmluZSBMSU5FX0lOX1NFQ1RfT1VUX09GX1JBTkdFX0xPTkdfQkxPQ0sgXAorICAweDAwMDAwMDA4ICAvLyAgIDMgICB5ZXMgICBJbml0LURlYyAgICBUaGUgbnVtYmVyIG9mIGxpbmVzIHBlciBzZWN0aW9uIGlzIG5vdAorICAgICAgICAgICAgICAvLyAgIHdpdGhpbiB0aGUgYWxsb3dlZCByYW5nZSAobG9uZyBibG9jaykKKyNkZWZpbmUgQ0JfT1VUX09GX1JBTkdFX0xPTkdfQkxPQ0sgXAorICAweDAwMDAwMDA0ICAvLyAgIDIgICB5ZXMgICBJbml0LURlYyAgICBUaGUgY29kZWJvb2sgaXMgbm90IHdpdGhpbiB0aGUgYWxsb3dlZAorICAgICAgICAgICAgICAvLyAgIHJhbmdlIChsb25nIGJsb2NrKQorI2RlZmluZSBMQVZfVklPTEFUSU9OIFwKKyAgMHgwMDAwMDAwMiAgLy8gICAxICAgbm8gICAgRmluYWwgICAgICAgVGhlIGFic29sdXRlIHZhbHVlIG9mIGF0IGxlYXN0IG9uZQorICAgICAgICAgICAgICAvLyAgIGRlY29kZWQgbGluZSB3YXMgdG9vIGhpZ2ggZm9yIHRoZSBhY2NvcmRpbmcgY29kZWJvb2suCisjZGVmaW5lIEJJVF9JTl9TRUdNRU5UQVRJT05fRVJST1IgXAorICAweDAwMDAwMDAxICAvLyAgIDAgICBubyAgICBGaW5hbCAgICAgICBBZnRlciBQQ1cgYW5kIG5vbi1QV0MtZGVjb2RpbmcgYXQgbGVhc3QKKyAgICAgICAgICAgICAgLy8gICBvbmUgc2VnbWVudCBpcyBub3QgemVybyAoZ2xvYmFsIGNoZWNrKS4KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMDAxMDAwMCAvLyAgMTYgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZAotI2RlZmluZSBTVEFURV9FUlJPUl9CT0RZX09OTFkgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMCAvLyAgMTUgICBubyAgICBOb25QQ1ctRGVjICBTdGF0ZSBtYWNoaW5lIHJldHVybmVkIHdpdGggZXJyb3IKLSNkZWZpbmUgU1RBVEVfRVJST1JfQk9EWV9TSUdOX19CT0RZICAgICAgICAgICAgIDB4MDAwMDQwMDAgLy8gIDE0ICAgbm8gICAgTm9uUENXLURlYyAgU3RhdGUgbWFjaGluZSByZXR1cm5lZCB3aXRoIGVycm9yCi0jZGVmaW5lIFNUQVRFX0VSUk9SX0JPRFlfU0lHTl9fU0lHTiAgICAgICAgICAgICAweDAwMDAyMDAwIC8vICAxMyAgIG5vICAgIE5vblBDVy1EZWMgIFN0YXRlIG1hY2hpbmUgcmV0dXJuZWQgd2l0aCBlcnJvcgotI2RlZmluZSBTVEFURV9FUlJPUl9CT0RZX1NJR05fRVNDX19CT0RZICAgICAgICAgMHgwMDAwMTAwMCAvLyAgMTIgICBubyAgICBOb25QQ1ctRGVjICBTdGF0ZSBtYWNoaW5lIHJldHVybmVkIHdpdGggZXJyb3IKLSNkZWZpbmUgU1RBVEVfRVJST1JfQk9EWV9TSUdOX0VTQ19fU0lHTiAgICAgICAgIDB4MDAwMDA4MDAgLy8gIDExICAgbm8gICAgTm9uUENXLURlYyAgU3RhdGUgbWFjaGluZSByZXR1cm5lZCB3aXRoIGVycm9yCi0jZGVmaW5lIFNUQVRFX0VSUk9SX0JPRFlfU0lHTl9FU0NfX0VTQ19QUkVGSVggICAweDAwMDAwNDAwIC8vICAxMCAgIG5vICAgIE5vblBDVy1EZWMgIFN0YXRlIG1hY2hpbmUgcmV0dXJuZWQgd2l0aCBlcnJvcgotI2RlZmluZSBTVEFURV9FUlJPUl9CT0RZX1NJR05fRVNDX19FU0NfV09SRCAgICAgMHgwMDAwMDIwMCAvLyAgIDkgICBubyAgICBOb25QQ1ctRGVjICBTdGF0ZSBtYWNoaW5lIHJldHVybmVkIHdpdGggZXJyb3IKLSNkZWZpbmUgSENSX1NJX0xFTkdUSFNfRkFJTFVSRSAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAgLy8gICA4ICAgeWVzICAgSW5pdC1EZWMgICAgTGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQgbXVzdCBub3QgYmUgbGVzcyB0aGFuIGxlbmdodE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhCi0jZGVmaW5lIE5VTV9TRUNUX09VVF9PRl9SQU5HRV9TSE9SVF9CTE9DSyAgICAgICAweDAwMDAwMDgwIC8vICAgNyAgIHllcyAgIEluaXQtRGVjICAgIFRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgaXMgbm90IHdpdGhpbiB0aGUgYWxsb3dlZCByYW5nZSAoc2hvcnQgYmxvY2spCi0jZGVmaW5lIE5VTV9TRUNUX09VVF9PRl9SQU5HRV9MT05HX0JMT0NLICAgICAgICAweDAwMDAwMDQwIC8vICAgNiAgIHllcyAgIEluaXQtRGVjICAgIFRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgaXMgbm90IHdpdGhpbiB0aGUgYWxsb3dlZCByYW5nZSAobG9uZyBibG9jaykKLSNkZWZpbmUgTElORV9JTl9TRUNUX09VVF9PRl9SQU5HRV9TSE9SVF9CTE9DSyAgIDB4MDAwMDAwMjAgLy8gICA1ICAgeWVzICAgSW5pdC1EZWMgICAgVGhlIG51bWJlciBvZiBsaW5lcyBwZXIgc2VjdGlvbiBpcyBub3Qgd2l0aGluIHRoZSBhbGxvd2VkIHJhbmdlIChzaG9ydCBibG9jaykKLSNkZWZpbmUgQ0JfT1VUX09GX1JBTkdFX1NIT1JUX0JMT0NLICAgICAgICAgICAgIDB4MDAwMDAwMTAgLy8gICA0ICAgeWVzICAgSW5pdC1EZWMgICAgVGhlIGNvZGVib29rIGlzIG5vdCB3aXRoaW4gdGhlIGFsbG93ZWQgcmFuZ2UgKHNob3J0IGJsb2NrKQotI2RlZmluZSBMSU5FX0lOX1NFQ1RfT1VUX09GX1JBTkdFX0xPTkdfQkxPQ0sgICAgMHgwMDAwMDAwOCAvLyAgIDMgICB5ZXMgICBJbml0LURlYyAgICBUaGUgbnVtYmVyIG9mIGxpbmVzIHBlciBzZWN0aW9uIGlzIG5vdCB3aXRoaW4gdGhlIGFsbG93ZWQgcmFuZ2UgKGxvbmcgYmxvY2spCi0jZGVmaW5lIENCX09VVF9PRl9SQU5HRV9MT05HX0JMT0NLICAgICAgICAgICAgICAweDAwMDAwMDA0IC8vICAgMiAgIHllcyAgIEluaXQtRGVjICAgIFRoZSBjb2RlYm9vayBpcyBub3Qgd2l0aGluIHRoZSBhbGxvd2VkIHJhbmdlIChsb25nIGJsb2NrKQotI2RlZmluZSBMQVZfVklPTEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMiAvLyAgIDEgICBubyAgICBGaW5hbCAgICAgICBUaGUgYWJzb2x1dGUgdmFsdWUgb2YgYXQgbGVhc3Qgb25lIGRlY29kZWQgbGluZSB3YXMgdG9vIGhpZ2ggZm9yIHRoZSBhY2NvcmRpbmcgY29kZWJvb2suCi0jZGVmaW5lIEJJVF9JTl9TRUdNRU5UQVRJT05fRVJST1IgICAgICAgICAgICAgICAweDAwMDAwMDAxIC8vICAgMCAgIG5vICAgIEZpbmFsICAgICAgIEFmdGVyIFBDVyBhbmQgbm9uLVBXQy1kZWNvZGluZyBhdCBsZWFzdCBvbmUgc2VnbWVudCBpcyBub3QgemVybyAoZ2xvYmFsIGNoZWNrKS4KKy8qLS0tLS0tLS0tLSovCisjZGVmaW5lIEhDUl9GQVRBTF9QQ1dfRVJST1JfTUFTSyAweDEwMEUwMUZDCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0qLwotI2RlZmluZSBIQ1JfRkFUQUxfUENXX0VSUk9SX01BU0sgICAgICAgICAgICAgICAgMHgxMDBFMDFGQwotCi0KLXR5cGVkZWYgZW51bSB7Ci0gIFBDV19CT0RZLAotICBQQ1dfQk9EWV9TSUdOLAotICBQQ1dfQk9EWV9TSUdOX0VTQwotfSBQQ1dfVFlQRTsKLQordHlwZWRlZiBlbnVtIHsgUENXX0JPRFksIFBDV19CT0RZX1NJR04sIFBDV19CT0RZX1NJR05fRVNDIH0gUENXX1RZUEU7CiAKIC8qIGludGVyZmFjZSBEZWNvZGVyIDwtLS0+IEhDUiAqLwogdHlwZWRlZiBzdHJ1Y3QgewotICBVSU5UICAgICAgICAgIGVycm9yTG9nOwotICBTUEVDVFJBTF9QVFIgIHBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2U7Ci0gIGludCAgICAgICAgICAgcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHg7Ci0gIFNIT1JUICAgICAgICAgbGVuZ3RoT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGE7Ci0gIFNIT1JUICAgICAgICAgbnVtU2VjdGlvbjsKLSAgU0hPUlQgICAgICAgICpwTnVtTGluZUluU2VjdDsKLSAgVVNIT1JUICAgICAgICBiaXRzdHJlYW1JbmRleDsKLSAgU0NIQVIgICAgICAgICBsZW5ndGhPZkxvbmdlc3RDb2Rld29yZDsKLSAgVUNIQVIgICAgICAgICpwQ29kZWJvb2s7CisgIFVJTlQgZXJyb3JMb2c7CisgIFNQRUNUUkFMX1BUUiBwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNCYXNlOworICBpbnQgcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHg7CisgIFNIT1JUIGxlbmd0aE9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhOworICBTSE9SVCBudW1TZWN0aW9uOworICBTSE9SVCAqcE51bUxpbmVJblNlY3Q7CisgIElOVCBiaXRzdHJlYW1JbmRleDsKKyAgU0NIQVIgbGVuZ3RoT2ZMb25nZXN0Q29kZXdvcmQ7CisgIFVDSEFSICpwQ29kZWJvb2s7CiB9IEhDUl9JTlBVVF9PVVRQVVQ7CiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTI4Nyw4MCArMzYwLDczIEBACiAgIGNvbnN0IFVDSEFSICpwTWF4T2ZDYlBhaXI7CiB9IEhDUl9DQl9QQUlSUzsKIAotdHlwZWRlZiBzdHJ1Y3R7Cit0eXBlZGVmIHN0cnVjdCB7CiAgIGNvbnN0IFVTSE9SVCAqcExhcmdlc3RBYnNWYWw7Ci0gIGNvbnN0IFVDSEFSICAqcE1heEN3TGVuZ3RoOwotICBjb25zdCBVQ0hBUiAgKnBDYkRpbWVuc2lvbjsKLSAgY29uc3QgVUNIQVIgICpwQ2JEaW1TaGlmdDsKLSAgY29uc3QgVUNIQVIgICpwQ2JTaWduOwotICBjb25zdCBVQ0hBUiAgKnBDYlByaW9yaXR5OworICBjb25zdCBVQ0hBUiAqcE1heEN3TGVuZ3RoOworICBjb25zdCBVQ0hBUiAqcENiRGltZW5zaW9uOworICBjb25zdCBVQ0hBUiAqcENiRGltU2hpZnQ7CisgIGNvbnN0IFVDSEFSICpwQ2JTaWduOworICBjb25zdCBVQ0hBUiAqcENiUHJpb3JpdHk7CiB9IEhDUl9UQUJMRV9JTkZPOwogCi10eXBlZGVmIHN0cnVjdHsKLSAgVUlOVCAgICAgIG51bVNlZ21lbnQ7Ci0gIFVJTlQgICAgICBwU2VnbWVudEJpdGZpZWxkWygoMTAyND4+MSkvTlVNQkVSX09GX0JJVF9JTl9XT1JEKzEpXTsKLSAgVUlOVCAgICAgIHBDb2Rld29yZEJpdGZpZWxkWygoMTAyND4+MSkvTlVNQkVSX09GX0JJVF9JTl9XT1JEKzEpXTsKLSAgVUlOVCAgICAgIHNlZ21lbnRPZmZzZXQ7Ci0gIEZJWFBfREJMICBwVGVtcFZhbHVlc1sxMDI0XTsKLSAgVVNIT1JUICAgIHBMZWZ0U3RhcnRPZlNlZ21lbnRbMTAyND4+MV07Ci0gIFVTSE9SVCAgICBwUmlnaHRTdGFydE9mU2VnbWVudFsxMDI0Pj4xXTsKLSAgU0NIQVIgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50WzEwMjQ+PjFdOwotICBVQ0hBUiAgICAgcmVhZERpcmVjdGlvbjsKLSAgVUNIQVIgICAgIG51bVdvcmRGb3JCaXRmaWVsZDsKLSAgVVNIT1JUICAgIHBOdW1CaXRWYWxpZEluTGFzdFdvcmQ7Cit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQgbnVtU2VnbWVudDsKKyAgVUlOVCBwU2VnbWVudEJpdGZpZWxkWygoMTAyNCA+PiAxKSAvIE5VTUJFUl9PRl9CSVRfSU5fV09SRCArIDEpXTsKKyAgVUlOVCBwQ29kZXdvcmRCaXRmaWVsZFsoKDEwMjQgPj4gMSkgLyBOVU1CRVJfT0ZfQklUX0lOX1dPUkQgKyAxKV07CisgIFVJTlQgc2VnbWVudE9mZnNldDsKKyAgSU5UIHBMZWZ0U3RhcnRPZlNlZ21lbnRbMTAyNCA+PiAxXTsKKyAgSU5UIHBSaWdodFN0YXJ0T2ZTZWdtZW50WzEwMjQgPj4gMV07CisgIFNDSEFSIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50WzEwMjQgPj4gMV07CisgIFVDSEFSIHJlYWREaXJlY3Rpb247CisgIFVDSEFSIG51bVdvcmRGb3JCaXRmaWVsZDsKKyAgVVNIT1JUIHBOdW1CaXRWYWxpZEluTGFzdFdvcmQ7CiB9IEhDUl9TRUdNRU5UX0lORk87CiAKLXR5cGVkZWYgc3RydWN0ewordHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UIG51bUNvZGV3b3JkOworICBVSU5UIG51bVNvcnRlZFNlY3Rpb247CisgIFVTSE9SVCBwTnVtQ29kZXdvcmRJblNlY3Rpb25bTUFYX1NGQl9IQ1JdOworICBVU0hPUlQgcE51bVNvcnRlZENvZGV3b3JkSW5TZWN0aW9uW01BWF9TRkJfSENSXTsKKyAgVVNIT1JUIHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uW01BWF9TRkJfSENSICsgTUFYX0hDUl9TRVRTXTsKKyAgaW50IG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHg7CisgIFVTSE9SVCBwTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c1tNQVhfSENSX1NFVFNdOworICBpbnQgbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeDsKKyAgVVNIT1JUIHBSZW9yZGVyT2Zmc2V0W01BWF9TRkJfSENSXTsKKyAgVUNIQVIgcFNvcnRlZENvZGVib29rW01BWF9TRkJfSENSXTsKIAotICBVSU5UICAgIG51bUNvZGV3b3JkOwotICBVSU5UICAgIG51bVNvcnRlZFNlY3Rpb247Ci0gIFVTSE9SVCAgcE51bUNvZGV3b3JkSW5TZWN0aW9uW01BWF9TRkJfSENSXTsKLSAgVVNIT1JUICBwTnVtU29ydGVkQ29kZXdvcmRJblNlY3Rpb25bTUFYX1NGQl9IQ1JdOwotICBVU0hPUlQgIHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uW01BWF9TRkJfSENSK01BWF9IQ1JfU0VUU107Ci0gIGludCAgICAgbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeDsKLSAgVVNIT1JUICBwTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c1tNQVhfSENSX1NFVFNdOwotICBpbnQgICAgIG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHg7Ci0gIFVTSE9SVCAgcFJlb3JkZXJPZmZzZXRbTUFYX1NGQl9IQ1JdOwotICBVQ0hBUiAgIHBTb3J0ZWRDb2RlYm9va1tNQVhfU0ZCX0hDUl07Ci0KLSAgVUNIQVIgICBwRXh0ZW5kZWRTb3J0ZWRDb2RlYm9va1tNQVhfU0ZCX0hDUitNQVhfSENSX1NFVFNdOwotICBpbnQgICAgIGV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHg7Ci0jaWYgREVURUNUX1RPT19MT05HX0NXX1JFQURTCi0gIFVDSEFSICAgcE1heExlbk9mQ2JJbkV4dFNydFNlY1tNQVhfU0ZCX0hDUitNQVhfSENSX1NFVFNdOwotICBpbnQgICAgIG1heExlbk9mQ2JJbkV4dFNydFNlY0lkeDsKLSNlbmRpZgotICBVQ0hBUiAgIHBDb2RlYm9va1N3aXRjaFtNQVhfU0ZCX0hDUl07CisgIFVDSEFSIHBFeHRlbmRlZFNvcnRlZENvZGVib29rW01BWF9TRkJfSENSICsgTUFYX0hDUl9TRVRTXTsKKyAgaW50IGV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHg7CisgIFVDSEFSIHBNYXhMZW5PZkNiSW5FeHRTcnRTZWNbTUFYX1NGQl9IQ1IgKyBNQVhfSENSX1NFVFNdOworICBpbnQgbWF4TGVuT2ZDYkluRXh0U3J0U2VjSWR4OworICBVQ0hBUiBwQ29kZWJvb2tTd2l0Y2hbTUFYX1NGQl9IQ1JdOwogfSBIQ1JfU0VDVElPTl9JTkZPOwogCi10eXBlZGVmIFVJTlQgKCpTVEFURUZVTkMpKEhBTkRMRV9GREtfQklUU1RSRUFNLCB2b2lkKik7Cit0eXBlZGVmIFVJTlQgKCpTVEFURUZVTkMpKEhBTkRMRV9GREtfQklUU1RSRUFNLCB2b2lkICopOwogCi10eXBlZGVmIHN0cnVjdHsKK3R5cGVkZWYgc3RydWN0IHsKICAgLyogd29yc3QtY2FzZSBhbmQgMTAyNC80IG5vbi1QQ1dzIGV4aXN0IGluIHdvcnN0LWNhc2UgKi8KLSAgRklYUF9EQkwgICpwUmVzdWx0QmFzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCYXNlIGFkZHJlc3MgZm9yIHNwZWN0cmFsIGRhdGEgb3V0cHV0IHRhcmdldCBidWZmZXIgKi8KLSAgVUlOVCAgICAgICBpTm9kZVsxMDI0Pj4yXTsgICAgICAgICAgIC8qIEhlbHBlciBpbmRpY2VzIGZvciBjb2RlIGJvb2tzICovCi0gIFVTSE9SVCAgICAgaVJlc3VsdFBvaW50ZXJbMTAyND4+Ml07ICAvKiBIZWxwZXIgaW5kaWNlcyBmb3IgYWNjZXNzaW5nIHBSZXN1bHRCYXNlICovCi0gIFVJTlQgICAgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1sxMDI0Pj4yXTsKLSAgVUlOVCAgICAgICBjb2Rld29yZE9mZnNldDsKLSAgU1RBVEVGVU5DICBwU3RhdGU7Ci0gIFVDSEFSICAgICAgcENvZGVib29rWzEwMjQ+PjJdOwotICBVQ0hBUiAgICAgIHBDbnRTaWduWzEwMjQ+PjJdOwotICAvKiB0aGlzIGFycmF5IGhvbGRzIHRoZSBzdGF0ZXMgY29kZWQgYXMgaW50ZWdlciB2YWx1ZXMgd2l0aGluIHRoZSByYW5nZSBbMCwxLC4uLDddICovCi0gIFNDSEFSICAgICAgcFN0YVsxMDI0Pj4yXTsKKyAgRklYUF9EQkwKKyAgKnBSZXN1bHRCYXNlOyAvKiBCYXNlIGFkZHJlc3MgZm9yIHNwZWN0cmFsIGRhdGEgb3V0cHV0IHRhcmdldCBidWZmZXIgKi8KKyAgVUlOVCBpTm9kZVsxMDI0ID4+IDJdOyAvKiBIZWxwZXIgaW5kaWNlcyBmb3IgY29kZSBib29rcyAqLworICBVU0hPUlQKKyAgaVJlc3VsdFBvaW50ZXJbMTAyNCA+PiAyXTsgLyogSGVscGVyIGluZGljZXMgZm9yIGFjY2Vzc2luZyBwUmVzdWx0QmFzZSAqLworICBVSU5UIHBFc2NhcGVTZXF1ZW5jZUluZm9bMTAyNCA+PiAyXTsKKyAgVUlOVCBjb2Rld29yZE9mZnNldDsKKyAgU1RBVEVGVU5DIHBTdGF0ZTsKKyAgVUNIQVIgcENvZGVib29rWzEwMjQgPj4gMl07CisgIFVDSEFSIHBDbnRTaWduWzEwMjQgPj4gMl07CisgIC8qIHRoaXMgYXJyYXkgaG9sZHMgdGhlIHN0YXRlcyBjb2RlZCBhcyBpbnRlZ2VyIHZhbHVlcyB3aXRoaW4gdGhlIHJhbmdlCisgICAqIFswLDEsLi4sN10gKi8KKyAgU0NIQVIgcFN0YVsxMDI0ID4+IDJdOwogfSBIQ1JfTk9OX1BDV19TSURFSU5GTzsKIAotdHlwZWRlZiBzdHJ1Y3R7Ci0gIEhDUl9JTlBVVF9PVVRQVVQgICAgICBkZWNJbk91dDsKLSAgSENSX0NCX1BBSVJTICAgICAgICAgIGNiUGFpcnM7Ci0gIEhDUl9UQUJMRV9JTkZPICAgICAgICB0YWJsZUluZm87Ci0gIEhDUl9TRUdNRU5UX0lORk8gICAgICBzZWdtZW50SW5mbzsKLSAgSENSX1NFQ1RJT05fSU5GTyAgICAgIHNlY3Rpb25JbmZvOwotICBIQ1JfTk9OX1BDV19TSURFSU5GTyAgbm9uUGN3U2lkZWluZm87Ci0KLSAgSU5UICAgICAgICAgICAgICAgICAgIGdsb2JhbEhjclR5cGU7Cit0eXBlZGVmIHN0cnVjdCB7CisgIEhDUl9JTlBVVF9PVVRQVVQgZGVjSW5PdXQ7CisgIEhDUl9TRUdNRU5UX0lORk8gc2VnbWVudEluZm87CisgIEhDUl9TRUNUSU9OX0lORk8gc2VjdGlvbkluZm87CisgIEhDUl9OT05fUENXX1NJREVJTkZPIG5vblBjd1NpZGVpbmZvOwogfSBDRXJIY3JJbmZvOwogCit0eXBlZGVmIENFckhjckluZm8gKkhfSENSX0lORk87CiAKLXR5cGVkZWYgIENFckhjckluZm8gICpIX0hDUl9JTkZPOwotCi0KLSNlbmRpZiAvKiBfQUFDREVDX0hDUl9UWVBFU19IXyAqLworI2VuZGlmIC8qIEFBQ0RFQ19IQ1JfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNycy5jcHAgYi9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3JzLmNwcAppbmRleCBjMGIyMTczLi5lMmI3Y2Q4IDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3JzLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3JzLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxMSArOTAsMTIgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgUm9iZXJ0IFdlaWRuZXIgKERTUCBTb2x1dGlvbnMpCisKICAgIERlc2NyaXB0aW9uOiBIQ1IgRGVjb2RlcjogUHJlcGFyZSBkZWNvZGluZyBvZiBub24tUENXcywgc2VnbWVudGF0aW9uLSBhbmQKICAgICAgICAgICAgICAgICBiaXRmaWVsZC1oYW5kbGluZywgSENSLVN0YXRlbWFjaGluZQogCkBAIC05MSwxMTEgKzEwMywxMTMgQEAKIAogI2luY2x1ZGUgImFhY2RlY19oY3JzLmgiCiAKLQogI2luY2x1ZGUgImFhY2RlY19oY3IuaCIKIAogI2luY2x1ZGUgImFhY2RlY19oY3JfYml0LmgiCiAjaW5jbHVkZSAiYWFjX3JvbS5oIgogI2luY2x1ZGUgImFhY19yYW0uaCIKIAotCi1zdGF0aWMgVUlOVCBJbml0U2VnbWVudEJpdGZpZWxkKFVJTlQgICAqcE51bVNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAqcFNlZ21lbnRCaXRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICpwTnVtV29yZEZvckJpdGZpZWxkLAorc3RhdGljIFVJTlQgSW5pdFNlZ21lbnRCaXRmaWVsZChVSU5UICpwTnVtU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpwU2VnbWVudEJpdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcE51bVdvcmRGb3JCaXRmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICpwTnVtQml0VmFsaWRJbkxhc3RXb3JkKTsKIAogc3RhdGljIHZvaWQgSW5pdE5vblBDV1NpZGVJbmZvcm1hdGlvbkZvckN1cnJlbnRTZXQoSF9IQ1JfSU5GTyBwSGNyKTsKIAogc3RhdGljIElOVCBNb2R1bG9WYWx1ZShJTlQgaW5wdXQsIElOVCBidWZmZXJsZW5ndGgpOwogCi1zdGF0aWMgdm9pZCBDbGVhckJpdEZyb21CaXRmaWVsZChTVEFURUZVTkMgKnB0clN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICpwQml0ZmllbGQpOwotCitzdGF0aWMgdm9pZCBDbGVhckJpdEZyb21CaXRmaWVsZChTVEFURUZVTkMgKnB0clN0YXRlLCBVSU5UIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKnBCaXRmaWVsZCk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGRlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgYWxsIG5vbi1wcmlvcml0eSBjb2Rld29yZHMgKG5vbi1QQ1dzKSBieSB1c2luZyBhCi0gICAgICAgICAgICAgICAgICBzdGF0ZS1tYWNoaW5lLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgIERlY29kZU5vblBDV3MoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIEhfSENSX0lORk8gcEhjcikKLXsKLSAgVUlOVCAgICBudW1WYWxpZFNlZ21lbnQ7Ci0gIElOVCAgICAgc2VnbWVudE9mZnNldDsKLSAgSU5UICAgICBjb2Rld29yZE9mZnNldEJhc2U7Ci0gIElOVCAgICAgY29kZXdvcmRPZmZzZXQ7Ci0gIFVJTlQgICAgdHJpYWw7CisgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgYWxsIG5vbi1wcmlvcml0eSBjb2Rld29yZHMgKG5vbi1QQ1dzKSBieQordXNpbmcgYSBzdGF0ZS1tYWNoaW5lLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCit2b2lkIERlY29kZU5vblBDV3MoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIEhfSENSX0lORk8gcEhjcikgeworICBVSU5UIG51bVZhbGlkU2VnbWVudDsKKyAgSU5UIHNlZ21lbnRPZmZzZXQ7CisgIElOVCBjb2Rld29yZE9mZnNldEJhc2U7CisgIElOVCBjb2Rld29yZE9mZnNldDsKKyAgVUlOVCB0cmlhbDsKIAotICBVSU5UICAgKnBOdW1TZWdtZW50OwotICBTQ0hBUiAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OwotICBVSU5UICAgKnBTZWdtZW50Qml0ZmllbGQ7Ci0gIFVDSEFSICAqcE51bVdvcmRGb3JCaXRmaWVsZDsKKyAgVUlOVCAqcE51bVNlZ21lbnQ7CisgIFNDSEFSICpwUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgVUlOVCAqcFNlZ21lbnRCaXRmaWVsZDsKKyAgVUNIQVIgKnBOdW1Xb3JkRm9yQml0ZmllbGQ7CiAgIFVTSE9SVCAqcE51bUJpdFZhbGlkSW5MYXN0V29yZDsKLSAgVUlOVCAgICpwQ29kZXdvcmRCaXRmaWVsZDsKLSAgSU5UICAgICBiaXRmaWVsZFdvcmQ7Ci0gIElOVCAgICAgYml0SW5Xb3JkOwotICBVSU5UICAgIHRlbXBXb3JkOwotICBVSU5UICAgIGludGVyTWVkaWF0ZVdvcmQ7Ci0gIElOVCAgICAgdGVtcEJpdDsKLSAgSU5UICAgICBjYXJyeTsKKyAgVUlOVCAqcENvZGV3b3JkQml0ZmllbGQ7CisgIElOVCBiaXRmaWVsZFdvcmQ7CisgIElOVCBiaXRJbldvcmQ7CisgIFVJTlQgdGVtcFdvcmQ7CisgIFVJTlQgaW50ZXJNZWRpYXRlV29yZDsKKyAgSU5UIHRlbXBCaXQ7CisgIElOVCBjYXJyeTsKIAotICBVSU5UICAgIG51bUNvZGV3b3JkOwotICBVQ0hBUiAgIG51bVNldDsKLSAgVUNIQVIgICBjdXJyZW50U2V0OwotICBVSU5UICAgIGNvZGV3b3JkSW5TZXQ7Ci0gIFVJTlQgICAgcmVtYWluaW5nQ29kZXdvcmRzSW5TZXQ7Ci0gIFNDSEFSICAqcFN0YTsKLSAgVUlOVCAgICByZXQ7CisgIFVJTlQgbnVtQ29kZXdvcmQ7CisgIFVDSEFSIG51bVNldDsKKyAgVUNIQVIgY3VycmVudFNldDsKKyAgVUlOVCBjb2Rld29yZEluU2V0OworICBVSU5UIHJlbWFpbmluZ0NvZGV3b3Jkc0luU2V0OworICBTQ0hBUiAqcFN0YTsKKyAgVUlOVCByZXQ7CiAKLSAgcE51bVNlZ21lbnQgICAgICAgICAgICAgPSAmKHBIY3ItPnNlZ21lbnRJbmZvLm51bVNlZ21lbnQpOwotICBwUmVtYWluaW5nQml0c0luU2VnbWVudCA9ICAgcEhjci0+c2VnbWVudEluZm8ucFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7Ci0gIHBTZWdtZW50Qml0ZmllbGQgICAgICAgID0gICBwSGNyLT5zZWdtZW50SW5mby5wU2VnbWVudEJpdGZpZWxkOwotICBwTnVtV29yZEZvckJpdGZpZWxkICAgICA9ICYocEhjci0+c2VnbWVudEluZm8ubnVtV29yZEZvckJpdGZpZWxkKTsKLSAgcE51bUJpdFZhbGlkSW5MYXN0V29yZCAgPSAmKHBIY3ItPnNlZ21lbnRJbmZvLnBOdW1CaXRWYWxpZEluTGFzdFdvcmQpOwotICBwU3RhICAgICAgICAgICAgICAgICAgICA9ICAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YTsKKyAgcE51bVNlZ21lbnQgPSAmKHBIY3ItPnNlZ21lbnRJbmZvLm51bVNlZ21lbnQpOworICBwUmVtYWluaW5nQml0c0luU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OworICBwU2VnbWVudEJpdGZpZWxkID0gcEhjci0+c2VnbWVudEluZm8ucFNlZ21lbnRCaXRmaWVsZDsKKyAgcE51bVdvcmRGb3JCaXRmaWVsZCA9ICYocEhjci0+c2VnbWVudEluZm8ubnVtV29yZEZvckJpdGZpZWxkKTsKKyAgcE51bUJpdFZhbGlkSW5MYXN0V29yZCA9ICYocEhjci0+c2VnbWVudEluZm8ucE51bUJpdFZhbGlkSW5MYXN0V29yZCk7CisgIHBTdGEgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhOwogCi0gIG51bVZhbGlkU2VnbWVudCA9IEluaXRTZWdtZW50Qml0ZmllbGQocE51bVNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlZ21lbnRCaXRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtV29yZEZvckJpdGZpZWxkLAorICBudW1WYWxpZFNlZ21lbnQgPSBJbml0U2VnbWVudEJpdGZpZWxkKHBOdW1TZWdtZW50LCBwUmVtYWluaW5nQml0c0luU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkLCBwTnVtV29yZEZvckJpdGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1CaXRWYWxpZEluTGFzdFdvcmQpOwogCi0gIGlmICggbnVtVmFsaWRTZWdtZW50ICE9IDAgKSB7CisgIGlmIChudW1WYWxpZFNlZ21lbnQgIT0gMCkgewogICAgIG51bUNvZGV3b3JkID0gcEhjci0+c2VjdGlvbkluZm8ubnVtQ29kZXdvcmQ7CiAgICAgbnVtU2V0ID0gKChudW1Db2Rld29yZCAtIDEpIC8gKnBOdW1TZWdtZW50KSArIDE7CiAKLQogICAgIHBIY3ItPnNlZ21lbnRJbmZvLnJlYWREaXJlY3Rpb24gPSBGUk9NX1JJR0hUX1RPX0xFRlQ7CiAKICAgICAvKiBQcm9jZXNzIHNldHMgc3Vic2VxdWVudGx5ICovCi0gICAgZm9yICggY3VycmVudFNldCA9IDE7IGN1cnJlbnRTZXQgPCBudW1TZXQgOyBjdXJyZW50U2V0KysgKSB7Ci0KLQotCisgICAgZm9yIChjdXJyZW50U2V0ID0gMTsgY3VycmVudFNldCA8IG51bVNldDsgY3VycmVudFNldCsrKSB7CiAgICAgICAvKiBzdGVwIDEgKi8KLSAgICAgIG51bUNvZGV3b3JkIC09ICpwTnVtU2VnbWVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHJlbWFpbmluZyBub24gUENXcyBbZm9yIGFsbCBzZXRzXSAqLwotICAgICAgaWYgKCBudW1Db2Rld29yZCA8ICpwTnVtU2VnbWVudCApIHsKLSAgICAgICAgY29kZXdvcmRJblNldCA9IG51bUNvZGV3b3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIGxhc3Qgc2V0ICovCi0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgY29kZXdvcmRJblNldCA9ICpwTnVtU2VnbWVudDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIGFsbCBzZXRzIGV4Y2VwdCBsYXN0IHNldCAqLworICAgICAgbnVtQ29kZXdvcmQgLT0KKyAgICAgICAgICAqcE51bVNlZ21lbnQ7IC8qIG51bWJlciBvZiByZW1haW5pbmcgbm9uIFBDV3MgW2ZvciBhbGwgc2V0c10gKi8KKyAgICAgIGlmIChudW1Db2Rld29yZCA8ICpwTnVtU2VnbWVudCkgeworICAgICAgICBjb2Rld29yZEluU2V0ID0gbnVtQ29kZXdvcmQ7IC8qIGZvciBsYXN0IHNldCAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZXdvcmRJblNldCA9ICpwTnVtU2VnbWVudDsgLyogZm9yIGFsbCBzZXRzIGV4Y2VwdCBsYXN0IHNldCAqLwogICAgICAgfQogCiAgICAgICAvKiBzdGVwIDIgKi8KLSAgICAgIC8qIHByZXBhcmUgYXJyYXkgJ0NvZGV3b3JkQml0ZmllbGQnOyBhcyBtdWNoIG9uZXMgYXJlIHdyaXR0ZW4gZnJvbSBsZWZ0IGluIGFsbCB3b3JkcywgYXMgbXVjaCBkZWNvZGVkQ29kZXdvcmRJblNldENvdW50ZXIgbm9uUENXcyBleGlzdCBpbiB0aGlzIHNldCAqLworICAgICAgLyogcHJlcGFyZSBhcnJheSAnQ29kZXdvcmRCaXRmaWVsZCc7IGFzIG11Y2ggb25lcyBhcmUgd3JpdHRlbiBmcm9tIGxlZnQgaW4KKyAgICAgICAqIGFsbCB3b3JkcywgYXMgbXVjaCBkZWNvZGVkQ29kZXdvcmRJblNldENvdW50ZXIgbm9uUENXcyBleGlzdCBpbiB0aGlzCisgICAgICAgKiBzZXQgKi8KICAgICAgIHRlbXBXb3JkID0gMHhGRkZGRkZGRjsKICAgICAgIHBDb2Rld29yZEJpdGZpZWxkID0gcEhjci0+c2VnbWVudEluZm8ucENvZGV3b3JkQml0ZmllbGQ7CiAKLSAgICAgIGZvciAoIGJpdGZpZWxkV29yZCA9ICpwTnVtV29yZEZvckJpdGZpZWxkOyBiaXRmaWVsZFdvcmQgIT0wOyBiaXRmaWVsZFdvcmQtLSApIHsgLyogbG9vcCBvdmVyIGFsbCB1c2VkIHdvcmRzICovCi0gICAgICAgIGlmICggY29kZXdvcmRJblNldCA+IE5VTUJFUl9PRl9CSVRfSU5fV09SRCApIHsgICAgICAgIC8qIG1vcmUgY29kZXdvcmRzIHRoYW4gbnVtYmVyIG9mIGJpdHMgPT4gZmlsbCBvbmVzICovCisgICAgICBmb3IgKGJpdGZpZWxkV29yZCA9ICpwTnVtV29yZEZvckJpdGZpZWxkOyBiaXRmaWVsZFdvcmQgIT0gMDsKKyAgICAgICAgICAgYml0ZmllbGRXb3JkLS0pIHsgLyogbG9vcCBvdmVyIGFsbCB1c2VkIHdvcmRzICovCisgICAgICAgIGlmIChjb2Rld29yZEluU2V0ID4gTlVNQkVSX09GX0JJVF9JTl9XT1JEKSB7IC8qIG1vcmUgY29kZXdvcmRzIHRoYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGJpdHMgPT4gZmlsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVzICovCiAgICAgICAgICAgLyogZmlsbCBhIHdob2xlIHdvcmQgd2l0aCBvbmVzICovCiAgICAgICAgICAgKnBDb2Rld29yZEJpdGZpZWxkKysgPSB0ZW1wV29yZDsKLSAgICAgICAgICBjb2Rld29yZEluU2V0IC09IE5VTUJFUl9PRl9CSVRfSU5fV09SRDsgICAgICAgICAgICAgLyogc3VidHJhY3QgbnVtYmVyIG9mIGJpdHMgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKKyAgICAgICAgICBjb2Rld29yZEluU2V0IC09IE5VTUJFUl9PRl9CSVRfSU5fV09SRDsgLyogc3VidHJhY3QgbnVtYmVyIG9mIGJpdHMgKi8KKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAvKiBwcmVwYXJlIGxhc3QgdGVtcFdvcmQgKi8KLSAgICAgICAgICBmb3IgKHJlbWFpbmluZ0NvZGV3b3Jkc0luU2V0ID0gY29kZXdvcmRJblNldDsgcmVtYWluaW5nQ29kZXdvcmRzSW5TZXQgPCBOVU1CRVJfT0ZfQklUX0lOX1dPUkQgOyByZW1haW5pbmdDb2Rld29yZHNJblNldCsrICkgewotICAgICAgICAgICAgdGVtcFdvcmQgPSB0ZW1wV29yZCAmIH4oMSA8PCAoTlVNQkVSX09GX0JJVF9JTl9XT1JELTEtcmVtYWluaW5nQ29kZXdvcmRzSW5TZXQpKTsgLyogc2V0IGEgemVybyBhdCBiaXQgbnVtYmVyIChOVU1CRVJfT0ZfQklUX0lOX1dPUkQtMS1pKSBpbiB0ZW1wV29yZCAqLworICAgICAgICAgIGZvciAocmVtYWluaW5nQ29kZXdvcmRzSW5TZXQgPSBjb2Rld29yZEluU2V0OworICAgICAgICAgICAgICAgcmVtYWluaW5nQ29kZXdvcmRzSW5TZXQgPCBOVU1CRVJfT0ZfQklUX0lOX1dPUkQ7CisgICAgICAgICAgICAgICByZW1haW5pbmdDb2Rld29yZHNJblNldCsrKSB7CisgICAgICAgICAgICB0ZW1wV29yZCA9CisgICAgICAgICAgICAgICAgdGVtcFdvcmQgJgorICAgICAgICAgICAgICAgIH4oMQorICAgICAgICAgICAgICAgICAgPDwgKE5VTUJFUl9PRl9CSVRfSU5fV09SRCAtIDEgLQorICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ0NvZGV3b3Jkc0luU2V0KSk7IC8qIHNldCBhIHplcm8gYXQgYml0IG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOVU1CRVJfT0ZfQklUX0lOX1dPUkQtMS1pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRlbXBXb3JkICovCiAgICAgICAgICAgfQogICAgICAgICAgICpwQ29kZXdvcmRCaXRmaWVsZCsrID0gdGVtcFdvcmQ7CiAgICAgICAgICAgdGVtcFdvcmQgPSAweDAwMDAwMDAwOwpAQCAtMjEyLDExNDcgKzIyNiwxMjcwIEBACiAKICAgICAgIC8qIGxvb3Agb3ZlciB0cmlhbHMgKi8KICAgICAgIGNvZGV3b3JkT2Zmc2V0QmFzZSA9IDA7Ci0gICAgICBmb3IgKCB0cmlhbCA9ICpwTnVtU2VnbWVudDsgdHJpYWwgPiAwOyB0cmlhbC0tICkgewotCisgICAgICBmb3IgKHRyaWFsID0gKnBOdW1TZWdtZW50OyB0cmlhbCA+IDA7IHRyaWFsLS0pIHsKICAgICAgICAgLyogbG9vcCBvdmVyIG51bWJlciBvZiB3b3JkcyBpbiBiaXRmaWVsZHMgKi8KLSAgICAgICAgc2VnbWVudE9mZnNldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgYXQgemVybyBpbiBldmVyeSBzZWdtZW50ICovCi0gICAgICAgIHBIY3ItPnNlZ21lbnRJbmZvLnNlZ21lbnRPZmZzZXQgPSBzZWdtZW50T2Zmc2V0OyAgICAgICAgIC8qIHN0b3JlIGluIHN0cnVjdHVyZSBmb3Igc3RhdGVzICovCisgICAgICAgIHNlZ21lbnRPZmZzZXQgPSAwOyAvKiBzdGFydCBhdCB6ZXJvIGluIGV2ZXJ5IHNlZ21lbnQgKi8KKyAgICAgICAgcEhjci0+c2VnbWVudEluZm8uc2VnbWVudE9mZnNldCA9CisgICAgICAgICAgICBzZWdtZW50T2Zmc2V0OyAvKiBzdG9yZSBpbiBzdHJ1Y3R1cmUgZm9yIHN0YXRlcyAqLwogICAgICAgICBjb2Rld29yZE9mZnNldCA9IGNvZGV3b3JkT2Zmc2V0QmFzZTsKLSAgICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8uY29kZXdvcmRPZmZzZXQgPSBjb2Rld29yZE9mZnNldDsgICAgLyogc3RvcmUgaW4gc3RydWN0dXJlIGZvciBzdGF0ZXMgKi8KKyAgICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8uY29kZXdvcmRPZmZzZXQgPQorICAgICAgICAgICAgY29kZXdvcmRPZmZzZXQ7IC8qIHN0b3JlIGluIHN0cnVjdHVyZSBmb3Igc3RhdGVzICovCiAKLSAgICAgICAgZm9yICggYml0ZmllbGRXb3JkPTA7IGJpdGZpZWxkV29yZCA8ICpwTnVtV29yZEZvckJpdGZpZWxkOyBiaXRmaWVsZFdvcmQrKyApIHsKLQorICAgICAgICBmb3IgKGJpdGZpZWxkV29yZCA9IDA7IGJpdGZpZWxkV29yZCA8ICpwTnVtV29yZEZvckJpdGZpZWxkOworICAgICAgICAgICAgIGJpdGZpZWxkV29yZCsrKSB7CiAgICAgICAgICAgLyogZGVyaXZlIHRlbXBXb3JkIHdpdGggYml0d2lzZSBhbmQgKi8KLSAgICAgICAgICB0ZW1wV29yZCA9IHBTZWdtZW50Qml0ZmllbGRbYml0ZmllbGRXb3JkXSAmIHBDb2Rld29yZEJpdGZpZWxkW2JpdGZpZWxkV29yZF07CisgICAgICAgICAgdGVtcFdvcmQgPQorICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkW2JpdGZpZWxkV29yZF0gJiBwQ29kZXdvcmRCaXRmaWVsZFtiaXRmaWVsZFdvcmRdOwogCiAgICAgICAgICAgLyogaWYgdGVtcFdvcmQgaXMgbm90IHplcm8sIGRlY29kZSBzb21ldGhpbmcgKi8KLSAgICAgICAgICBpZiAoIHRlbXBXb3JkICE9IDAgKSB7Ci0KLQotICAgICAgICAgICAgLyogbG9vcCBvdmVyIGFsbCBiaXRzIGluIHRlbXBXb3JkOyBzdGFydCBzdGF0ZSBtYWNoaW5lIGlmICYgaXMgdHJ1ZSAqLwotICAgICAgICAgICAgZm9yICggYml0SW5Xb3JkID0gTlVNQkVSX09GX0JJVF9JTl9XT1JEOyBiaXRJbldvcmQgPiAwOyBiaXRJbldvcmQtLSApIHsKLQotICAgICAgICAgICAgICBpbnRlck1lZGlhdGVXb3JkID0gKChVSU5UKTEgPDwgKGJpdEluV29yZC0xKSApOwotICAgICAgICAgICAgICBpZiAoICggdGVtcFdvcmQgJiBpbnRlck1lZGlhdGVXb3JkICkgPT0gaW50ZXJNZWRpYXRlV29yZCApIHsKLQorICAgICAgICAgIGlmICh0ZW1wV29yZCAhPSAwKSB7CisgICAgICAgICAgICAvKiBsb29wIG92ZXIgYWxsIGJpdHMgaW4gdGVtcFdvcmQ7IHN0YXJ0IHN0YXRlIG1hY2hpbmUgaWYgJiBpcyB0cnVlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZvciAoYml0SW5Xb3JkID0gTlVNQkVSX09GX0JJVF9JTl9XT1JEOyBiaXRJbldvcmQgPiAwOworICAgICAgICAgICAgICAgICBiaXRJbldvcmQtLSkgeworICAgICAgICAgICAgICBpbnRlck1lZGlhdGVXb3JkID0gKChVSU5UKTEgPDwgKGJpdEluV29yZCAtIDEpKTsKKyAgICAgICAgICAgICAgaWYgKCh0ZW1wV29yZCAmIGludGVyTWVkaWF0ZVdvcmQpID09IGludGVyTWVkaWF0ZVdvcmQpIHsKICAgICAgICAgICAgICAgICAvKiBnZXQgc3RhdGUgYW5kIHN0YXJ0IHN0YXRlIG1hY2hpbmUgKi8KLSAgICAgICAgICAgICAgICBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUgPSBhU3RhdGVDb25zdGFudDJTdGF0ZVtwU3RhW2NvZGV3b3JkT2Zmc2V0XV07CisgICAgICAgICAgICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlID0KKyAgICAgICAgICAgICAgICAgICAgYVN0YXRlQ29uc3RhbnQyU3RhdGVbcFN0YVtjb2Rld29yZE9mZnNldF1dOwogCi0gICAgICAgICAgICAgICAgd2hpbGUocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICByZXQgPSAoKFNUQVRFRlVOQykgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKShicywgcEhjcik7Ci0jaWYgU1RBVEVfTUFDSElORV9FUlJPUl9DSEVDSwotICAgICAgICAgICAgICAgICAgaWYgKCByZXQgIT0gMCApIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSB7CisgICAgICAgICAgICAgICAgICByZXQgPSAoKFNUQVRFRlVOQylwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpKGJzLCBwSGNyKTsKKyAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAvKiB1cGRhdGUgYm90aCBvZmZzZXRzICovCi0gICAgICAgICAgICAgIHNlZ21lbnRPZmZzZXQgKz0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgTlVNQkVSX09GX0JJVF9JTl9XT1JEIHRpbWVzIG9uZSAqLworICAgICAgICAgICAgICBzZWdtZW50T2Zmc2V0ICs9IDE7IC8qIGFkZCBOVU1CRVJfT0ZfQklUX0lOX1dPUkQgdGltZXMgb25lICovCiAgICAgICAgICAgICAgIHBIY3ItPnNlZ21lbnRJbmZvLnNlZ21lbnRPZmZzZXQgPSBzZWdtZW50T2Zmc2V0OwotICAgICAgICAgICAgICBjb2Rld29yZE9mZnNldCArPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkIE5VTUJFUl9PRl9CSVRfSU5fV09SRCB0aW1lcyBvbmUgKi8KLSAgICAgICAgICAgICAgY29kZXdvcmRPZmZzZXQgPSBNb2R1bG9WYWx1ZShjb2Rld29yZE9mZnNldCwqcE51bVNlZ21lbnQpOyAgICAgIC8qIGluZGV4IG9mIHRoZSBjdXJyZW50IGNvZGV3b3JkIGxpZXMgd2l0aGluIG1vZHVsbyByYW5nZSAqLworICAgICAgICAgICAgICBjb2Rld29yZE9mZnNldCArPSAxOyAvKiBhZGQgTlVNQkVSX09GX0JJVF9JTl9XT1JEIHRpbWVzIG9uZSAqLworICAgICAgICAgICAgICBjb2Rld29yZE9mZnNldCA9CisgICAgICAgICAgICAgICAgICBNb2R1bG9WYWx1ZShjb2Rld29yZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwTnVtU2VnbWVudCk7IC8qIGluZGV4IG9mIHRoZSBjdXJyZW50IGNvZGV3b3JkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWVzIHdpdGhpbiBtb2R1bG8gcmFuZ2UgKi8KICAgICAgICAgICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8uY29kZXdvcmRPZmZzZXQgPSBjb2Rld29yZE9mZnNldDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzZWdtZW50T2Zmc2V0ICs9IE5VTUJFUl9PRl9CSVRfSU5fV09SRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQgTlVNQkVSX09GX0JJVF9JTl9XT1JEIGF0IG9uY2UgKi8KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VnbWVudE9mZnNldCArPQorICAgICAgICAgICAgICAgIE5VTUJFUl9PRl9CSVRfSU5fV09SRDsgLyogYWRkIE5VTUJFUl9PRl9CSVRfSU5fV09SRCBhdCBvbmNlICovCiAgICAgICAgICAgICBwSGNyLT5zZWdtZW50SW5mby5zZWdtZW50T2Zmc2V0ID0gc2VnbWVudE9mZnNldDsKLSAgICAgICAgICAgIGNvZGV3b3JkT2Zmc2V0ICs9IE5VTUJFUl9PRl9CSVRfSU5fV09SRDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZCBOVU1CRVJfT0ZfQklUX0lOX1dPUkQgYXQgb25jZSAqLwotICAgICAgICAgICAgY29kZXdvcmRPZmZzZXQgPSBNb2R1bG9WYWx1ZShjb2Rld29yZE9mZnNldCwqcE51bVNlZ21lbnQpOyAgICAgICAgLyogaW5kZXggb2YgdGhlIGN1cnJlbnQgY29kZXdvcmQgbGllcyB3aXRoaW4gbW9kdWxvIHJhbmdlICovCisgICAgICAgICAgICBjb2Rld29yZE9mZnNldCArPQorICAgICAgICAgICAgICAgIE5VTUJFUl9PRl9CSVRfSU5fV09SRDsgLyogYWRkIE5VTUJFUl9PRl9CSVRfSU5fV09SRCBhdCBvbmNlICovCisgICAgICAgICAgICBjb2Rld29yZE9mZnNldCA9IE1vZHVsb1ZhbHVlKAorICAgICAgICAgICAgICAgIGNvZGV3b3JkT2Zmc2V0LAorICAgICAgICAgICAgICAgICpwTnVtU2VnbWVudCk7IC8qIGluZGV4IG9mIHRoZSBjdXJyZW50IGNvZGV3b3JkIGxpZXMgd2l0aGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxvIHJhbmdlICovCiAgICAgICAgICAgICBwSGNyLT5ub25QY3dTaWRlaW5mby5jb2Rld29yZE9mZnNldCA9IGNvZGV3b3JkT2Zmc2V0OwogICAgICAgICAgIH0KICAgICAgICAgfSAvKiBlbmQgb2YgYml0ZmllbGQgd29yZCBsb29wICovCiAKICAgICAgICAgLyogZGVjcmVtZW50IGNvZGV3b3JkIC0gcG9pbnRlciAqLwogICAgICAgICBjb2Rld29yZE9mZnNldEJhc2UgLT0gMTsKLSAgICAgICAgY29kZXdvcmRPZmZzZXRCYXNlID0gTW9kdWxvVmFsdWUoY29kZXdvcmRPZmZzZXRCYXNlLCpwTnVtU2VnbWVudCk7ICAgIC8qIGluZGV4IG9mIHRoZSBjdXJyZW50IGNvZGV3b3JkIGJhc2UgbGllcyB3aXRoaW4gbW9kdWxvIHJhbmdlICovCisgICAgICAgIGNvZGV3b3JkT2Zmc2V0QmFzZSA9CisgICAgICAgICAgICBNb2R1bG9WYWx1ZShjb2Rld29yZE9mZnNldEJhc2UsICpwTnVtU2VnbWVudCk7IC8qIGluZGV4IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGNvZGV3b3JkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgbGllcyB3aXRoaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxvIHJhbmdlICovCiAKICAgICAgICAgLyogcm90YXRlIG51bVNlZ21lbnQgYml0cyBpbiBjb2Rld29yZEJpdGZpZWxkICovCi0gICAgICAgIC8qIHJvdGF0aW9uIG9mICpudW1TZWdtZW50IGJpdHMgaW4gYml0ZmllbGQgb2YgY29kZXdvcmRzIChjaXJjbGUtcm90YXRpb24pICovCisgICAgICAgIC8qIHJvdGF0aW9uIG9mICpudW1TZWdtZW50IGJpdHMgaW4gYml0ZmllbGQgb2YgY29kZXdvcmRzCisgICAgICAgICAqIChjaXJjbGUtcm90YXRpb24pICovCiAgICAgICAgIC8qIGdldCBsYXN0IHZhbGlkIGJpdCAqLwotICAgICAgICB0ZW1wQml0ID0gcENvZGV3b3JkQml0ZmllbGRbKnBOdW1Xb3JkRm9yQml0ZmllbGQtMV0gJiAoMSA8PCAoTlVNQkVSX09GX0JJVF9JTl9XT1JEIC0gKnBOdW1CaXRWYWxpZEluTGFzdFdvcmQpKTsKKyAgICAgICAgdGVtcEJpdCA9IHBDb2Rld29yZEJpdGZpZWxkWypwTnVtV29yZEZvckJpdGZpZWxkIC0gMV0gJgorICAgICAgICAgICAgICAgICAgKDEgPDwgKE5VTUJFUl9PRl9CSVRfSU5fV09SRCAtICpwTnVtQml0VmFsaWRJbkxhc3RXb3JkKSk7CiAgICAgICAgIHRlbXBCaXQgPSB0ZW1wQml0ID4+IChOVU1CRVJfT0ZfQklUX0lOX1dPUkQgLSAqcE51bUJpdFZhbGlkSW5MYXN0V29yZCk7CiAKICAgICAgICAgLyogd3JpdGUgemVybyBpbnRvIHBsYWNlIHdoZXJlIHRlbXBCaXQgd2FzIGZldGNoZWQgZnJvbSAqLwotICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZFsqcE51bVdvcmRGb3JCaXRmaWVsZC0xXSA9IHBDb2Rld29yZEJpdGZpZWxkWypwTnVtV29yZEZvckJpdGZpZWxkLTFdICYgfigxIDw8IChOVU1CRVJfT0ZfQklUX0lOX1dPUkQgLSAqcE51bUJpdFZhbGlkSW5MYXN0V29yZCkpOworICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZFsqcE51bVdvcmRGb3JCaXRmaWVsZCAtIDFdID0KKyAgICAgICAgICAgIHBDb2Rld29yZEJpdGZpZWxkWypwTnVtV29yZEZvckJpdGZpZWxkIC0gMV0gJgorICAgICAgICAgICAgfigxIDw8IChOVU1CRVJfT0ZfQklUX0lOX1dPUkQgLSAqcE51bUJpdFZhbGlkSW5MYXN0V29yZCkpOwogCiAgICAgICAgIC8qIHJvdGF0ZSBsYXN0IHZhbGlkIHdvcmQgKi8KLSAgICAgICAgcENvZGV3b3JkQml0ZmllbGRbKnBOdW1Xb3JkRm9yQml0ZmllbGQtMV0gPSBwQ29kZXdvcmRCaXRmaWVsZFsqcE51bVdvcmRGb3JCaXRmaWVsZC0xXSA+PiAxOworICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZFsqcE51bVdvcmRGb3JCaXRmaWVsZCAtIDFdID0KKyAgICAgICAgICAgIHBDb2Rld29yZEJpdGZpZWxkWypwTnVtV29yZEZvckJpdGZpZWxkIC0gMV0gPj4gMTsKIAotICAgICAgICAvKiB0cmFuc2ZhcmUgY2FycnkgYml0IDAgZnJvbSBjdXJyZW50IHdvcmQgaW50byBiaXRwb3NpdGlvbiAzMSBmcm9tIG5leHQgd29yZCBhbmQgcm90YXRlIGN1cnJlbnQgd29yZCAqLwotICAgICAgICBmb3IgKCBiaXRmaWVsZFdvcmQgPSAqcE51bVdvcmRGb3JCaXRmaWVsZC0yOyBiaXRmaWVsZFdvcmQgPiAtMSA7IGJpdGZpZWxkV29yZC0tICkgeworICAgICAgICAvKiB0cmFuc2ZhcmUgY2FycnkgYml0IDAgZnJvbSBjdXJyZW50IHdvcmQgaW50byBiaXRwb3NpdGlvbiAzMSBmcm9tIG5leHQKKyAgICAgICAgICogd29yZCBhbmQgcm90YXRlIGN1cnJlbnQgd29yZCAqLworICAgICAgICBmb3IgKGJpdGZpZWxkV29yZCA9ICpwTnVtV29yZEZvckJpdGZpZWxkIC0gMjsgYml0ZmllbGRXb3JkID4gLTE7CisgICAgICAgICAgICAgYml0ZmllbGRXb3JkLS0pIHsKICAgICAgICAgICAvKiBnZXQgY2FycnkgKD1iaXQgYXQgcG9zaXRpb24gMCkgZnJvbSBjdXJyZW50IHdvcmQgKi8KICAgICAgICAgICBjYXJyeSA9IHBDb2Rld29yZEJpdGZpZWxkW2JpdGZpZWxkV29yZF0gJiAxOwogCi0gICAgICAgICAgLyogcHV0IHRoZSBjYXJyeSBiaXQgYXQgcG9zaXRpb24gMzEgaW50byB3b3JkIHJpZ2h0IGZyb20gY3VycmVudCB3b3JkICovCi0gICAgICAgICAgcENvZGV3b3JkQml0ZmllbGRbYml0ZmllbGRXb3JkKzFdID0gcENvZGV3b3JkQml0ZmllbGRbYml0ZmllbGRXb3JkKzFdIHwgKGNhcnJ5IDw8IChOVU1CRVJfT0ZfQklUX0lOX1dPUkQtMSkpOworICAgICAgICAgIC8qIHB1dCB0aGUgY2FycnkgYml0IGF0IHBvc2l0aW9uIDMxIGludG8gd29yZCByaWdodCBmcm9tIGN1cnJlbnQgd29yZAorICAgICAgICAgICAqLworICAgICAgICAgIHBDb2Rld29yZEJpdGZpZWxkW2JpdGZpZWxkV29yZCArIDFdID0KKyAgICAgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGRbYml0ZmllbGRXb3JkICsgMV0gfAorICAgICAgICAgICAgICAoY2FycnkgPDwgKE5VTUJFUl9PRl9CSVRfSU5fV09SRCAtIDEpKTsKIAogICAgICAgICAgIC8qIHNoaWZ0IGN1cnJlbnQgd29yZCAqLwotICAgICAgICAgIHBDb2Rld29yZEJpdGZpZWxkW2JpdGZpZWxkV29yZF0gPSBwQ29kZXdvcmRCaXRmaWVsZFtiaXRmaWVsZFdvcmRdID4+IDE7CisgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGRbYml0ZmllbGRXb3JkXSA9CisgICAgICAgICAgICAgIHBDb2Rld29yZEJpdGZpZWxkW2JpdGZpZWxkV29yZF0gPj4gMTsKICAgICAgICAgfQogCiAgICAgICAgIC8qIHB1dCB0ZW1wQml0IGludG8gZnJlZSBiaXQtcG9zaXRpb24gMzEgZnJvbSBmaXJzdCB3b3JkICovCi0gICAgICAgIHBDb2Rld29yZEJpdGZpZWxkWzBdID0gcENvZGV3b3JkQml0ZmllbGRbMF0gfCAodGVtcEJpdCA8PCAoTlVNQkVSX09GX0JJVF9JTl9XT1JELTEpKTsKKyAgICAgICAgcENvZGV3b3JkQml0ZmllbGRbMF0gPQorICAgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGRbMF0gfCAodGVtcEJpdCA8PCAoTlVNQkVSX09GX0JJVF9JTl9XT1JEIC0gMSkpOwogCiAgICAgICB9IC8qIGVuZCBvZiB0cmlhbCBsb29wICovCiAKICAgICAgIC8qIHRvZ2dsZSByZWFkIGRpcmVjdGlvbiAqLwotICAgICAgcEhjci0+c2VnbWVudEluZm8ucmVhZERpcmVjdGlvbiA9IFRvZ2dsZVJlYWREaXJlY3Rpb24ocEhjci0+c2VnbWVudEluZm8ucmVhZERpcmVjdGlvbik7Ci0KKyAgICAgIHBIY3ItPnNlZ21lbnRJbmZvLnJlYWREaXJlY3Rpb24gPQorICAgICAgICAgIFRvZ2dsZVJlYWREaXJlY3Rpb24ocEhjci0+c2VnbWVudEluZm8ucmVhZERpcmVjdGlvbik7CiAgICAgfQogICAgIC8qIGVuZCBvZiBzZXQgbG9vcCAqLwogCiAgICAgLyogYWxsIG5vbi1QQ1dzIG9mIHRoaXMgc3BlY3RydW0gYXJlIGRlY29kZWQgKi8KICAgfQogCi0gIC8qIGFsbCBQQ1dzIGFuZCBhbGwgbm9uIFBDV3MgYXJlIGRlY29kZWQuIFRoZXkgYXJlIHVuYmFja3NvcnRlZCBpbiBvdXRwdXQgYnVmZmVyLiBIZXJlIGlzIHRoZSBJbnRlcmZhY2Ugd2l0aCBjb21wYXJpbmcgUVNDcyB0byBhc20gZGVjb2RpbmcgKi8KKyAgLyogYWxsIFBDV3MgYW5kIGFsbCBub24gUENXcyBhcmUgZGVjb2RlZC4gVGhleSBhcmUgdW5iYWNrc29ydGVkIGluIG91dHB1dAorICAgKiBidWZmZXIuIEhlcmUgaXMgdGhlIEludGVyZmFjZSB3aXRoIGNvbXBhcmluZyBRU0NzIHRvIGFzbSBkZWNvZGluZyAqLwogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIGRlc2NyaXB0aW9uOiAgIFRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgdGhlIGJpdGZpZWxkIHVzZWQgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICBzZWdtZW50cy4gVGhlIGxpc3QgaXMgc2V0IHVwIG9uY2UgdG8gYmUgdXNlZCBpbiBhbGwgZm9sbG93aW5nIHNldHMuIElmIGEKLSAgICAgICAgICAgICAgICAgICAgc2VnbWVudCBpcyBkZWNvZGVkIGVtcHR5LCB0aGUgYWNjb3JkaW5nIGJpdCBmcm9tIHRoZSBCaXRmaWVsZCBpcyByZW1vdmVkLgorICAgICAgICAgICAgICAgICAgICBzZWdtZW50cy4gVGhlIGxpc3QgaXMgc2V0IHVwIG9uY2UgdG8gYmUgdXNlZCBpbiBhbGwKK2ZvbGxvd2luZyBzZXRzLiBJZiBhIHNlZ21lbnQgaXMgZGVjb2RlZCBlbXB0eSwgdGhlIGFjY29yZGluZyBiaXQgZnJvbSB0aGUKK0JpdGZpZWxkIGlzIHJlbW92ZWQuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICByZXR1cm46ICAgICBudW1WYWxpZFNlZ21lbnQgPSB0aGUgbnVtYmVyIG9mIHZhbGlkIHNlZ21lbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIFVJTlQgSW5pdFNlZ21lbnRCaXRmaWVsZChVSU5UICAgKnBOdW1TZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgKnBTZWdtZW50Qml0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAqcE51bVdvcmRGb3JCaXRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICpwTnVtQml0VmFsaWRJbkxhc3RXb3JkKQotewotICBTSE9SVCAgIGk7Ci0gIFVTSE9SVCAgcjsKLSAgVUNIQVIgICBiaXRmaWVsZFdvcmQ7Ci0gIFVJTlQgICAgdGVtcFdvcmQ7Ci0gIFVTSE9SVCAgbnVtVmFsaWRTZWdtZW50OworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgVUlOVCBJbml0U2VnbWVudEJpdGZpZWxkKFVJTlQgKnBOdW1TZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKnBTZWdtZW50Qml0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwTnVtV29yZEZvckJpdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgKnBOdW1CaXRWYWxpZEluTGFzdFdvcmQpIHsKKyAgU0hPUlQgaTsKKyAgVVNIT1JUIHI7CisgIFVDSEFSIGJpdGZpZWxkV29yZDsKKyAgVUlOVCB0ZW1wV29yZDsKKyAgVVNIT1JUIG51bVZhbGlkU2VnbWVudDsKIAotICAqcE51bVdvcmRGb3JCaXRmaWVsZCA9ICgoKnBOdW1TZWdtZW50LTEpID4+IFRISVJUWVRXT19MT0dfRElWX1RXT19MT0cpICsgMTsKKyAgKnBOdW1Xb3JkRm9yQml0ZmllbGQgPSAoKCpwTnVtU2VnbWVudCAtIDEpID4+IFRISVJUWVRXT19MT0dfRElWX1RXT19MT0cpICsgMTsKIAogICAvKiBsb29wIG92ZXIgYWxsIHdvcmRzLCB3aGljaCBhcmUgY29tcGxldGVseSB1c2VkIG9yIG9ubHkgcGFydGlhbCAqLwotICAvKiBiaXQgaW4gcFNlZ21lbnRCaXRmaWVsZCBpcyB6ZXJvIGlmIHNlZ21lbnQgaXMgZW1wdHk7IGJpdCBpbiBwU2VnbWVudEJpdGZpZWxkIGlzIG9uZSBpZiBzZWdtZW50IGlzIG5vdCBlbXB0eSAqLworICAvKiBiaXQgaW4gcFNlZ21lbnRCaXRmaWVsZCBpcyB6ZXJvIGlmIHNlZ21lbnQgaXMgZW1wdHk7IGJpdCBpbgorICAgKiBwU2VnbWVudEJpdGZpZWxkIGlzIG9uZSBpZiBzZWdtZW50IGlzIG5vdCBlbXB0eSAqLwogICBudW1WYWxpZFNlZ21lbnQgPSAwOwogICAqcE51bUJpdFZhbGlkSW5MYXN0V29yZCA9ICpwTnVtU2VnbWVudDsKIAogICAvKiBsb29wIG92ZXIgd29yZHMgKi8KLSAgZm9yICggYml0ZmllbGRXb3JkPTA7IGJpdGZpZWxkV29yZCA8ICpwTnVtV29yZEZvckJpdGZpZWxkIC0gMTsgYml0ZmllbGRXb3JkKysgKSB7Ci0gICAgdGVtcFdvcmQgPSAweEZGRkZGRkZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IG9uZXMgKi8KKyAgZm9yIChiaXRmaWVsZFdvcmQgPSAwOyBiaXRmaWVsZFdvcmQgPCAqcE51bVdvcmRGb3JCaXRmaWVsZCAtIDE7CisgICAgICAgYml0ZmllbGRXb3JkKyspIHsKKyAgICB0ZW1wV29yZCA9IDB4RkZGRkZGRkY7IC8qIHNldCBvbmVzICovCiAgICAgciA9IGJpdGZpZWxkV29yZCA8PCBUSElSVFlUV09fTE9HX0RJVl9UV09fTE9HOwotICAgIGZvciAoIGk9MDsgaSA8IE5VTUJFUl9PRl9CSVRfSU5fV09SRDsgaSsrKSB7Ci0gICAgICBpZiAoIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3IgKyBpXSA9PSAwICkgewotICAgICAgICB0ZW1wV29yZCA9IHRlbXBXb3JkICYgfigxIDw8IChOVU1CRVJfT0ZfQklUX0lOX1dPUkQtMS1pKSk7ICAgICAgICAgIC8qIHNldCBhIHplcm8gYXQgYml0IG51bWJlciAoTlVNQkVSX09GX0JJVF9JTl9XT1JELTEtaSkgaW4gdGVtcFdvcmQgKi8KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBudW1WYWxpZFNlZ21lbnQgKz0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvdW50IHNlZ21lbnRzIHdoaWNoIGFyZSBub3QgZW1wdHkgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNQkVSX09GX0JJVF9JTl9XT1JEOyBpKyspIHsKKyAgICAgIGlmIChwUmVtYWluaW5nQml0c0luU2VnbWVudFtyICsgaV0gPT0gMCkgeworICAgICAgICB0ZW1wV29yZCA9IHRlbXBXb3JkICYgfigxIDw8IChOVU1CRVJfT0ZfQklUX0lOX1dPUkQgLSAxIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSkpOyAvKiBzZXQgYSB6ZXJvIGF0IGJpdCBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTlVNQkVSX09GX0JJVF9JTl9XT1JELTEtaSkgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wV29yZCAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbnVtVmFsaWRTZWdtZW50ICs9IDE7IC8qIGNvdW50IHNlZ21lbnRzIHdoaWNoIGFyZSBub3QgZW1wdHkgKi8KICAgICAgIH0KICAgICB9Ci0gICAgcFNlZ21lbnRCaXRmaWVsZFtiaXRmaWVsZFdvcmRdID0gdGVtcFdvcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgcmVzdWx0ICovCi0gICAgKnBOdW1CaXRWYWxpZEluTGFzdFdvcmQgLT0gTlVNQkVSX09GX0JJVF9JTl9XT1JEOyAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIG51bWJlciBvZiB6ZXJvcyBvbiBMU0Igc2lkZSBpbiB0aGUgbGFzdCB3b3JkICovCisgICAgcFNlZ21lbnRCaXRmaWVsZFtiaXRmaWVsZFdvcmRdID0gdGVtcFdvcmQ7ICAgICAgICAvKiBzdG9yZSByZXN1bHQgKi8KKyAgICAqcE51bUJpdFZhbGlkSW5MYXN0V29yZCAtPSBOVU1CRVJfT0ZfQklUX0lOX1dPUkQ7IC8qIGNhbGN1bGF0ZSBudW1iZXIgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm9zIG9uIExTQiBzaWRlIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGFzdCB3b3JkICovCiAgIH0KIAotCiAgIC8qIGNhbGN1bGF0ZSBsYXN0IHdvcmQ6IHByZXBhcmUgc3BlY2lhbCB0ZW1wV29yZCAqLwogICB0ZW1wV29yZCA9IDB4RkZGRkZGRkY7Ci0gIGZvciAoIGk9MDsgaSA8ICggTlVNQkVSX09GX0JJVF9JTl9XT1JEIC0gKnBOdW1CaXRWYWxpZEluTGFzdFdvcmQgKTsgaSsrICkgewotICAgIHRlbXBXb3JkID0gdGVtcFdvcmQgJiB+KDEgPDwgaSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGJpdCBpIGluIHRlbXBXb3JkICovCisgIGZvciAoaSA9IDA7IGkgPCAoTlVNQkVSX09GX0JJVF9JTl9XT1JEIC0gKnBOdW1CaXRWYWxpZEluTGFzdFdvcmQpOyBpKyspIHsKKyAgICB0ZW1wV29yZCA9IHRlbXBXb3JkICYgfigxIDw8IGkpOyAvKiBjbGVhciBiaXQgaSBpbiB0ZW1wV29yZCAqLwogICB9CiAKICAgLyogY2FsY3VsYXRlIGxhc3Qgd29yZCAqLwogICByID0gYml0ZmllbGRXb3JkIDw8IFRISVJUWVRXT19MT0dfRElWX1RXT19MT0c7Ci0gIGZvciAoIGk9MDsgaTwqcE51bUJpdFZhbGlkSW5MYXN0V29yZDsgaSsrKSB7Ci0gICAgaWYgKCBwUmVtYWluaW5nQml0c0luU2VnbWVudFtyICsgaV0gPT0gMCApIHsKLSAgICAgIHRlbXBXb3JkID0gdGVtcFdvcmQgJiB+KDEgPDwgKE5VTUJFUl9PRl9CSVRfSU5fV09SRC0xLWkpKTsgICAgICAgICAgICAvKiBzZXQgYSB6ZXJvIGF0IGJpdCBudW1iZXIgKE5VTUJFUl9PRl9CSVRfSU5fV09SRC0xLWkpIGluIHRlbXBXb3JkICovCi0gICAgfQotICAgIGVsc2UgewotICAgICAgbnVtVmFsaWRTZWdtZW50ICs9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvdW50IHNlZ21lbnRzIHdoaWNoIGFyZSBub3QgZW1wdHkgKi8KKyAgZm9yIChpID0gMDsgaSA8ICpwTnVtQml0VmFsaWRJbkxhc3RXb3JkOyBpKyspIHsKKyAgICBpZiAocFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbciArIGldID09IDApIHsKKyAgICAgIHRlbXBXb3JkID0gdGVtcFdvcmQgJiB+KDEgPDwgKE5VTUJFUl9PRl9CSVRfSU5fV09SRCAtIDEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSkpOyAvKiBzZXQgYSB6ZXJvIGF0IGJpdCBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5VTUJFUl9PRl9CSVRfSU5fV09SRC0xLWkpIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBXb3JkICovCisgICAgfSBlbHNlIHsKKyAgICAgIG51bVZhbGlkU2VnbWVudCArPSAxOyAvKiBjb3VudCBzZWdtZW50cyB3aGljaCBhcmUgbm90IGVtcHR5ICovCiAgICAgfQogICB9Ci0gIHBTZWdtZW50Qml0ZmllbGRbYml0ZmllbGRXb3JkXSA9IHRlbXBXb3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgcmVzdWx0ICovCi0KLQorICBwU2VnbWVudEJpdGZpZWxkW2JpdGZpZWxkV29yZF0gPSB0ZW1wV29yZDsgLyogc3RvcmUgcmVzdWx0ICovCiAKICAgcmV0dXJuIG51bVZhbGlkU2VnbWVudDsKIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBkZXNjcmlwdGlvbjogIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCBzaWRlaW5mbyBmb3IgdGhlIG5vbi1QQ1cgZGVjb2RlciAoZm9yIHRoZSBjdXJyZW50IHNldCkuCisgIGRlc2NyaXB0aW9uOiAgVGhpcyBmdW5jdGlvbiBzZXRzIHVwIHNpZGVpbmZvIGZvciB0aGUgbm9uLVBDVyBkZWNvZGVyIChmb3IgdGhlCitjdXJyZW50IHNldCkuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgSW5pdE5vblBDV1NpZGVJbmZvcm1hdGlvbkZvckN1cnJlbnRTZXQoSF9IQ1JfSU5GTyBwSGNyKQotewotICBVU0hPUlQgICAgIGksazsKLSAgVUNIQVIgICAgICBjb2RlYm9va0RpbTsKLSAgVUlOVCAgICAgICBzdGFydE5vZGU7CitzdGF0aWMgdm9pZCBJbml0Tm9uUENXU2lkZUluZm9ybWF0aW9uRm9yQ3VycmVudFNldChIX0hDUl9JTkZPIHBIY3IpIHsKKyAgVVNIT1JUIGksIGs7CisgIFVDSEFSIGNvZGVib29rRGltOworICBVSU5UIHN0YXJ0Tm9kZTsKIAotICBVQ0hBUiAgICAgKnBDb2RlYm9vayAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICBwSGNyLT5ub25QY3dTaWRlaW5mby5wQ29kZWJvb2s7Ci0gIFVJTlQgICAgICAqaU5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgIHBIY3ItPm5vblBjd1NpZGVpbmZvLmlOb2RlOwotICBVQ0hBUiAgICAgKnBDbnRTaWduICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICBwSGNyLT5ub25QY3dTaWRlaW5mby5wQ250U2lnbjsKLSAgVVNIT1JUICAgICppUmVzdWx0UG9pbnRlciAgICAgICAgICAgICAgICAgICAgICA9ICAgcEhjci0+bm9uUGN3U2lkZWluZm8uaVJlc3VsdFBvaW50ZXI7Ci0gIFVJTlQgICAgICAqcEVzY2FwZVNlcXVlbmNlSW5mbyAgICAgICAgICAgICAgICAgPSAgIHBIY3ItPm5vblBjd1NpZGVpbmZvLnBFc2NhcGVTZXF1ZW5jZUluZm87Ci0gIFNDSEFSICAgICAqcFN0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgIHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGE7Ci0gIFVTSE9SVCAgICAqcE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb24gPSAgIHBIY3ItPnNlY3Rpb25JbmZvLnBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uOwotICBpbnQgICAgICAgIG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHggPSAgIHBIY3ItPnNlY3Rpb25JbmZvLm51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHg7Ci0gIFVDSEFSICAgICAqcEV4dGVuZGVkU29ydGVkQ29kZWJvb2sgICAgICAgICAgICAgPSAgIHBIY3ItPnNlY3Rpb25JbmZvLnBFeHRlbmRlZFNvcnRlZENvZGVib29rOwotICBpbnQgICAgICAgIGV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHggICAgICAgICAgID0gICBwSGNyLT5zZWN0aW9uSW5mby5leHRlbmRlZFNvcnRlZENvZGVib29rSWR4OwotICBVU0hPUlQgICAgKnBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzICAgID0gICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0czsKLSAgaW50ICAgICAgICBudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4ICA9ICAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeDsKLSAgRklYUF9EQkwgICpwUXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHMgICAgICA9ICAgU1BFQ19MT05HKHBIY3ItPmRlY0luT3V0LnBRdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0Jhc2UpOwotICBpbnQgICAgICAgIHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ICAgID0gICBwSGNyLT5kZWNJbk91dC5xdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeDsKLSAgY29uc3QgVUNIQVIgICAgICpwQ2JEaW1lbnNpb24gICAgICAgICAgICAgICAgICA9ICAgcEhjci0+dGFibGVJbmZvLnBDYkRpbWVuc2lvbjsKKyAgVUNIQVIgKnBDb2RlYm9vayA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBDb2RlYm9vazsKKyAgVUlOVCAqaU5vZGUgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pTm9kZTsKKyAgVUNIQVIgKnBDbnRTaWduID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucENudFNpZ247CisgIFVTSE9SVCAqaVJlc3VsdFBvaW50ZXIgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pUmVzdWx0UG9pbnRlcjsKKyAgVUlOVCAqcEVzY2FwZVNlcXVlbmNlSW5mbyA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBFc2NhcGVTZXF1ZW5jZUluZm87CisgIFNDSEFSICpwU3RhID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YTsKKyAgVVNIT1JUICpwTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbiA9CisgICAgICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbjsKKyAgaW50IG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHggPQorICAgICAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeDsKKyAgVUNIQVIgKnBFeHRlbmRlZFNvcnRlZENvZGVib29rID0gcEhjci0+c2VjdGlvbkluZm8ucEV4dGVuZGVkU29ydGVkQ29kZWJvb2s7CisgIGludCBleHRlbmRlZFNvcnRlZENvZGVib29rSWR4ID0gcEhjci0+c2VjdGlvbkluZm8uZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeDsKKyAgVVNIT1JUICpwTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0cyA9CisgICAgICBwSGNyLT5zZWN0aW9uSW5mby5wTnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0czsKKyAgaW50IG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHggPQorICAgICAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeDsKKyAgaW50IHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ID0KKyAgICAgIHBIY3ItPmRlY0luT3V0LnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4OworICBjb25zdCBVQ0hBUiAqcENiRGltZW5zaW9uID0gYURpbUNiOwogICBpbnQgaXRlcmF0aW9uQ291bnRlciA9IDA7CiAKLSAgLyogbG9vcCBvdmVyIG51bWJlciBvZiBleHRlbmRlZCBzb3J0ZWQgc2VjdGlvbnMgaW4gdGhlIGN1cnJlbnQgc2V0IHNvIGFsbCBjb2Rld29yZHMgc2lkZWluZm8gdmFyaWFibGVzIHdpdGhpbiB0aGlzIHNldCBjYW4gYmUgcHJlcGFyZWQgZm9yIGRlY29kaW5nICovCi0gIGZvciAoIGk9cE51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNbbnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeF07IGkgIT0gMDsgaS0tICkgeworICAvKiBsb29wIG92ZXIgbnVtYmVyIG9mIGV4dGVuZGVkIHNvcnRlZCBzZWN0aW9ucyBpbiB0aGUgY3VycmVudCBzZXQgc28gYWxsCisgICAqIGNvZGV3b3JkcyBzaWRlaW5mbyB2YXJpYWJsZXMgd2l0aGluIHRoaXMgc2V0IGNhbiBiZSBwcmVwYXJlZCBmb3IgZGVjb2RpbmcKKyAgICovCisgIGZvciAoaSA9IHBOdW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzW251bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHhdOworICAgICAgIGkgIT0gMDsgaS0tKSB7CisgICAgY29kZWJvb2tEaW0gPQorICAgICAgICBwQ2JEaW1lbnNpb25bcEV4dGVuZGVkU29ydGVkQ29kZWJvb2tbZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeF1dOworICAgIHN0YXJ0Tm9kZSA9ICphSHVmZlRhYmxlW3BFeHRlbmRlZFNvcnRlZENvZGVib29rW2V4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHhdXTsKIAotICAgIGNvZGVib29rRGltID0gcENiRGltZW5zaW9uW3BFeHRlbmRlZFNvcnRlZENvZGVib29rW2V4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHhdXTsKLSAgICBzdGFydE5vZGUgICA9ICphSHVmZlRhYmxlW3BFeHRlbmRlZFNvcnRlZENvZGVib29rW2V4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHhdXTsKLSAgICAKLSAgICBmb3IgKCBrID0gcE51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25bbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeF07IGsgIT0gMDsgay0tICkgeworICAgIGZvciAoayA9IHBOdW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uCisgICAgICAgICAgICAgW251bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHhdOworICAgICAgICAgayAhPSAwOyBrLS0pIHsKICAgICAgIGl0ZXJhdGlvbkNvdW50ZXIrKzsKLSAgICAgIGlmIChpdGVyYXRpb25Db3VudGVyID4gKDEwMjQ+PjIpKSB7CisgICAgICBpZiAoaXRlcmF0aW9uQ291bnRlciA+ICgxMDI0ID4+IDIpKSB7CiAgICAgICAgIHJldHVybjsKICAgICAgIH0KLSAgICAgICpwU3RhKysgICAgICAgICAgICAgICAgID0gYUNvZGVib29rMlN0YXJ0SW50W3BFeHRlbmRlZFNvcnRlZENvZGVib29rW2V4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHhdXTsKLSAgICAgICpwQ29kZWJvb2srKyAgICAgICAgICAgID0gcEV4dGVuZGVkU29ydGVkQ29kZWJvb2tbZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeF07Ci0gICAgICAqaU5vZGUrKyAgICAgICAgICAgICAgICA9IHN0YXJ0Tm9kZTsKLSAgICAgICpwQ250U2lnbisrICAgICAgICAgICAgID0gMDsKLSAgICAgICppUmVzdWx0UG9pbnRlcisrICAgICAgID0gcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHg7Ci0gICAgICAqcEVzY2FwZVNlcXVlbmNlSW5mbysrICA9IDA7Ci0gICAgICBxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeCArPSBjb2RlYm9va0RpbTsgICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgcG9pbnRlciBieSBjb2RlYm9va0RpbSAtLT4gcG9pbnQgdG8gbmV4dCBzdGFydGluZyB2YWx1ZSBmb3Igd3JpdGluZyBvdXQgKi8KKyAgICAgICpwU3RhKysgPSBhQ29kZWJvb2syU3RhcnRJbnQKKyAgICAgICAgICBbcEV4dGVuZGVkU29ydGVkQ29kZWJvb2tbZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeF1dOworICAgICAgKnBDb2RlYm9vaysrID0gcEV4dGVuZGVkU29ydGVkQ29kZWJvb2tbZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeF07CisgICAgICAqaU5vZGUrKyA9IHN0YXJ0Tm9kZTsKKyAgICAgICpwQ250U2lnbisrID0gMDsKKyAgICAgICppUmVzdWx0UG9pbnRlcisrID0gcXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHg7CisgICAgICAqcEVzY2FwZVNlcXVlbmNlSW5mbysrID0gMDsKKyAgICAgIHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ICs9CisgICAgICAgICAgY29kZWJvb2tEaW07IC8qIHVwZGF0ZSBwb2ludGVyIGJ5IGNvZGVib29rRGltIC0tPiBwb2ludCB0byBuZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIHZhbHVlIGZvciB3cml0aW5nIG91dCAqLwogICAgICAgaWYgKHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ID49IDEwMjQpIHsKICAgICAgICAgcmV0dXJuOwogICAgICAgfQogICAgIH0KLSAgICBudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluYyBwdHIgZm9yIG5leHQgZXh0IHNvcnQgc2VjIGluIGN1cnJlbnQgc2V0ICovCi0gICAgZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmMgcHRyIGZvciBuZXh0IGV4dCBzb3J0IHNlYyBpbiBjdXJyZW50IHNldCAqLwotICAgIGlmIChudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4ID49IChNQVhfU0ZCX0hDUitNQVhfSENSX1NFVFMpIHx8IGV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHggPj0gKE1BWF9TRkJfSENSK01BWF9IQ1JfU0VUUykpIHsKKyAgICBudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4Kys7IC8qIGluYyBwdHIgZm9yIG5leHQgZXh0IHNvcnQgc2VjIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHNldCAqLworICAgIGV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHgrKzsgLyogaW5jIHB0ciBmb3IgbmV4dCBleHQgc29ydCBzZWMgaW4gY3VycmVudCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4ID49IChNQVhfU0ZCX0hDUiArIE1BWF9IQ1JfU0VUUykgfHwKKyAgICAgICAgZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeCA+PSAoTUFYX1NGQl9IQ1IgKyBNQVhfSENSX1NFVFMpKSB7CiAgICAgICByZXR1cm47CiAgICAgfQogICB9Ci0gIG51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHgrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmMgcHRyIGZvciBuZXh0IHNldCBvZiBub24tUENXcyAqLwotICBpZiAobnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCA+PSAoTUFYX1NGQl9IQ1IrTUFYX0hDUl9TRVRTKSkgeworICBudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4Kys7IC8qIGluYyBwdHIgZm9yIG5leHQgc2V0IG9mIG5vbi1QQ1dzICovCisgIGlmIChudW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4ID49IChNQVhfU0ZCX0hDUiArIE1BWF9IQ1JfU0VUUykpIHsKICAgICByZXR1cm47CiAgIH0KIAogICAvKiBXcml0ZSBiYWNrIGluZGV4ZXMgKi8KLSAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeCA9IG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHg7CisgIHBIY3ItPnNlY3Rpb25JbmZvLm51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHggPQorICAgICAgbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeDsKICAgcEhjci0+c2VjdGlvbkluZm8uZXh0ZW5kZWRTb3J0ZWRDb2RlYm9va0lkeCA9IGV4dGVuZGVkU29ydGVkQ29kZWJvb2tJZHg7Ci0gIHBIY3ItPnNlY3Rpb25JbmZvLm51bUV4dGVuZGVkU29ydGVkU2VjdGlvbnNJblNldHNJZHggPSBudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4OwotICBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4ID0gbnVtRXh0ZW5kZWRTb3J0ZWRDb2Rld29yZEluU2VjdGlvbklkeDsKLSAgcEhjci0+ZGVjSW5PdXQucXVhbnRpemVkU3BlY3RyYWxDb2VmZmljaWVudHNJZHggPSBxdWFudGl6ZWRTcGVjdHJhbENvZWZmaWNpZW50c0lkeDsKKyAgcEhjci0+c2VjdGlvbkluZm8ubnVtRXh0ZW5kZWRTb3J0ZWRTZWN0aW9uc0luU2V0c0lkeCA9CisgICAgICBudW1FeHRlbmRlZFNvcnRlZFNlY3Rpb25zSW5TZXRzSWR4OworICBwSGNyLT5zZWN0aW9uSW5mby5udW1FeHRlbmRlZFNvcnRlZENvZGV3b3JkSW5TZWN0aW9uSWR4ID0KKyAgICAgIG51bUV4dGVuZGVkU29ydGVkQ29kZXdvcmRJblNlY3Rpb25JZHg7CisgIHBIY3ItPmRlY0luT3V0LnF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4ID0KKyAgICAgIHF1YW50aXplZFNwZWN0cmFsQ29lZmZpY2llbnRzSWR4OwogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIGRlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGlucHV0IHZhbHVlIGlmIHRoZSB2YWx1ZSBpcyBpbiB0aGUKLSAgICAgICAgICAgICAgICAgIHJhbmdlIG9mIGJ1ZmZlcmxlbmd0aC4gSWYgPGlucHV0PiBpcyBzbWFsbGVyLCBvbmUgYnVmZmVybGVuZ3RoIGlzIGFkZGVkLAotICAgICAgICAgICAgICAgICAgaWYgPGlucHV0PiBpcyBiaWdnZXIgb25lIGJ1ZmZlcmxlbmd0aCBpcyBzdWJ0cmFjdGVkLgorICAgICAgICAgICAgICAgICAgcmFuZ2Ugb2YgYnVmZmVybGVuZ3RoLiBJZiA8aW5wdXQ+IGlzIHNtYWxsZXIsIG9uZSBidWZmZXJsZW5ndGgKK2lzIGFkZGVkLCBpZiA8aW5wdXQ+IGlzIGJpZ2dlciBvbmUgYnVmZmVybGVuZ3RoIGlzIHN1YnRyYWN0ZWQuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICByZXR1cm46ICAgbW9kdWxvIHJlc3VsdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBJTlQgTW9kdWxvVmFsdWUoSU5UIGlucHV0LCBJTlQgYnVmZmVybGVuZ3RoKQotewotICBpZiAoIGlucHV0ID4gKGJ1ZmZlcmxlbmd0aCAtIDEpICkgeworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgSU5UIE1vZHVsb1ZhbHVlKElOVCBpbnB1dCwgSU5UIGJ1ZmZlcmxlbmd0aCkgeworICBpZiAoaW5wdXQgPiAoYnVmZmVybGVuZ3RoIC0gMSkpIHsKICAgICByZXR1cm4gKGlucHV0IC0gYnVmZmVybGVuZ3RoKTsKICAgfQotICBpZiAoIGlucHV0IDwgMCApIHsKKyAgaWYgKGlucHV0IDwgMCkgewogICAgIHJldHVybiAoaW5wdXQgKyBidWZmZXJsZW5ndGgpOwogICB9CiAgIHJldHVybiBpbnB1dDsKIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBkZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBjbGVhcnMgYSBiaXQgZnJvbSBjdXJyZW50IGJpdGZpZWxkIGFuZAogICAgICAgICAgICAgICAgICAgc3dpdGNoZXMgb2ZmIHRoZSBzdGF0ZW1hY2hpbmUuCiAKICAgICAgICAgICAgICAgICAgIEEgYml0IGlzIGNsZWFyZWQgaW4gdHdvIGNhc2VzOgotICAgICAgICAgICAgICAgICAgYSkgYSBjb2Rld29yZCBpcyBkZWNvZGVkLCB0aGVuIGEgYml0IGlzIGNsZWFyZWQgaW4gY29kZXdvcmQgYml0ZmllbGQKLSAgICAgICAgICAgICAgICAgIGIpIGEgc2VnbWVudCBpcyBkZWNvZGVkIGVtcHR5LCB0aGVuIGEgYml0IGlzIGNsZWFyZWQgaW4gc2VnbWVudCBiaXRmaWVsZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIENsZWFyQml0RnJvbUJpdGZpZWxkKFNUQVRFRlVOQyAqcHRyU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgKnBCaXRmaWVsZCkKLXsKLSAgVUlOVCAgbnVtQml0ZmllbGRXb3JkOwotICBVSU5UICBudW1CaXRmaWVsZEJpdDsKKyAgICAgICAgICAgICAgICAgIGEpIGEgY29kZXdvcmQgaXMgZGVjb2RlZCwgdGhlbiBhIGJpdCBpcyBjbGVhcmVkIGluIGNvZGV3b3JkCitiaXRmaWVsZCBiKSBhIHNlZ21lbnQgaXMgZGVjb2RlZCBlbXB0eSwgdGhlbiBhIGJpdCBpcyBjbGVhcmVkIGluIHNlZ21lbnQKK2JpdGZpZWxkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyB2b2lkIENsZWFyQml0RnJvbUJpdGZpZWxkKFNUQVRFRlVOQyAqcHRyU3RhdGUsIFVJTlQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqcEJpdGZpZWxkKSB7CisgIFVJTlQgbnVtQml0ZmllbGRXb3JkOworICBVSU5UIG51bUJpdGZpZWxkQml0OwogCiAgIC8qIGdldCBib3RoIHZhbHVlcyBuZWVkZWQgZm9yIGNsZWFyaW5nIHRoZSBiaXQgKi8KLSAgbnVtQml0ZmllbGRXb3JkID0gb2Zmc2V0ID4+IFRISVJUWVRXT19MT0dfRElWX1RXT19MT0c7ICAgICAgICAgICAgICAgICAgICAgIC8qIGludCAgID0gd29yZE5yICovCi0gIG51bUJpdGZpZWxkQml0ICA9IG9mZnNldCAtIChudW1CaXRmaWVsZFdvcmQgPDwgVEhJUlRZVFdPX0xPR19ESVZfVFdPX0xPRyk7ICAvKiBmcmFjdCA9IGJpdE5yICAqLworICBudW1CaXRmaWVsZFdvcmQgPSBvZmZzZXQgPj4gVEhJUlRZVFdPX0xPR19ESVZfVFdPX0xPRzsgLyogaW50ICAgPSB3b3JkTnIgKi8KKyAgbnVtQml0ZmllbGRCaXQgPSBvZmZzZXQgLSAobnVtQml0ZmllbGRXb3JkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFRISVJUWVRXT19MT0dfRElWX1RXT19MT0cpOyAvKiBmcmFjdCA9IGJpdE5yICAqLwogCiAgIC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkICovCi0gIHBCaXRmaWVsZFtudW1CaXRmaWVsZFdvcmRdID0gcEJpdGZpZWxkW251bUJpdGZpZWxkV29yZF0gJiB+KDEgPDwgKE5VTUJFUl9PRl9CSVRfSU5fV09SRC0xIC0gbnVtQml0ZmllbGRCaXQpKTsKKyAgcEJpdGZpZWxkW251bUJpdGZpZWxkV29yZF0gPQorICAgICAgcEJpdGZpZWxkW251bUJpdGZpZWxkV29yZF0gJgorICAgICAgfigxIDw8IChOVU1CRVJfT0ZfQklUX0lOX1dPUkQgLSAxIC0gbnVtQml0ZmllbGRCaXQpKTsKIAotICAvKiBzd2l0Y2ggb2ZmIHN0YXRlIG1hY2hpbmUgYmVjYXVzZSBjb2Rld29yZCBpcyBkZWNvZGVkIGFuZC9vciBiZWNhdXNlIHNlZ21lbnQgaXMgZW1wdHkgKi8KKyAgLyogc3dpdGNoIG9mZiBzdGF0ZSBtYWNoaW5lIGJlY2F1c2UgY29kZXdvcmQgaXMgZGVjb2RlZCBhbmQvb3IgYmVjYXVzZSBzZWdtZW50CisgICAqIGlzIGVtcHR5ICovCiAgICpwdHJTdGF0ZSA9IE5VTEw7CiB9CiAKLQotCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0YXRlcyBvZiB0aGUgc3RhdGVtYWNoaW5lCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGRlc2NyaXB0aW9uOiAgRGVjb2RlcyB0aGUgYm9keSBvZiBhIGNvZGV3b3JkLiBUaGlzIFN0YXRlIGlzIHVzZWQgZm9yIGNvZGVib29rcyAxLDIsNSBhbmQgNi4KLSAgICAgICAgICAgICAgICAgICBObyBzaWduIGJpdHMgYXJlIGRlY29kZWQsIGJlY2F1c2UgdGhlIHRhYmxlIG9mIHRoZSBxdWFudGl6ZWQgc3BlY3RyYWwgdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgaGFzIGdvdCBhIHZhbGlkIHNpZ24gYXQgdGhlIHF1YW50aXplZCBzcGVjdHJhbCBsaW5lcy4KKyAgICAgZGVzY3JpcHRpb246ICBEZWNvZGVzIHRoZSBib2R5IG9mIGEgY29kZXdvcmQuIFRoaXMgU3RhdGUgaXMgdXNlZCBmb3IKK2NvZGVib29rcyAxLDIsNSBhbmQgNi4gTm8gc2lnbiBiaXRzIGFyZSBkZWNvZGVkLCBiZWNhdXNlIHRoZSB0YWJsZSBvZiB0aGUKK3F1YW50aXplZCBzcGVjdHJhbCB2YWx1ZXMgaGFzIGdvdCBhIHZhbGlkIHNpZ24gYXQgdGhlIHF1YW50aXplZCBzcGVjdHJhbCBsaW5lcy4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG91dHB1dDogICBUd28gb3IgZm91ciBxdWFudGl6ZXMgc3BlY3RyYWwgdmFsdWVzIHdyaXR0ZW4gYXQgcG9zaXRpb24gd2hlcmUgcFJlc3VsdFBvaW50cgotICAgICAgICAgICAgICAgICAgcG9pbnRzIHRvCisgICAgICAgIG91dHB1dDogICBUd28gb3IgZm91ciBxdWFudGl6ZXMgc3BlY3RyYWwgdmFsdWVzIHdyaXR0ZW4gYXQgcG9zaXRpb24KK3doZXJlIHBSZXN1bHRQb2ludHIgcG9pbnRzIHRvCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICByZXR1cm46ICAgMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLVVJTlQgSGNyX1N0YXRlX0JPRFlfT05MWShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgdm9pZCAqcHRyKQoteworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitVSU5UIEhjcl9TdGF0ZV9CT0RZX09OTFkoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIHZvaWQgKnB0cikgewogICBIX0hDUl9JTkZPIHBIY3IgPSAoSF9IQ1JfSU5GTylwdHI7Ci0gIFVJTlQgICAgICAgICpwU2VnbWVudEJpdGZpZWxkOwotICBVSU5UICAgICAgICAqcENvZGV3b3JkQml0ZmllbGQ7Ci0gIFVJTlQgICAgICAgICBzZWdtZW50T2Zmc2V0OwotICBGSVhQX0RCTCAgICAqcFJlc3VsdEJhc2U7Ci0gIFVJTlQgICAgICAgICppTm9kZTsKLSAgVVNIT1JUICAgICAgKmlSZXN1bHRQb2ludGVyOwotICBVSU5UICAgICAgICAgY29kZXdvcmRPZmZzZXQ7Ci0gIFVJTlQgICAgICAgICBicmFuY2hOb2RlOwotICBVSU5UICAgICAgICAgYnJhbmNoVmFsdWU7Ci0gIFVJTlQgICAgICAgICBpUVNDOwotICBVSU5UICAgICAgICAgdHJlZU5vZGU7Ci0gIFVDSEFSICAgICAgICBjYXJyeUJpdDsKLSAgVVNIT1JUICAgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQ7Ci0gIFVTSE9SVCAgICAgICpwUmlnaHRTdGFydE9mU2VnbWVudDsKLSAgU0NIQVIgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OwotICBVQ0hBUiAgICAgICAgcmVhZERpcmVjdGlvbjsKLSAgVUNIQVIgICAgICAgKnBDb2RlYm9vazsKLSAgVUNIQVIgICAgICAgIGRpbUNudHI7Ci0gIGNvbnN0IFVJTlQgICpwQ3VycmVudFRyZWU7CisgIFVJTlQgKnBTZWdtZW50Qml0ZmllbGQ7CisgIFVJTlQgKnBDb2Rld29yZEJpdGZpZWxkOworICBVSU5UIHNlZ21lbnRPZmZzZXQ7CisgIEZJWFBfREJMICpwUmVzdWx0QmFzZTsKKyAgVUlOVCAqaU5vZGU7CisgIFVTSE9SVCAqaVJlc3VsdFBvaW50ZXI7CisgIFVJTlQgY29kZXdvcmRPZmZzZXQ7CisgIFVJTlQgYnJhbmNoTm9kZTsKKyAgVUlOVCBicmFuY2hWYWx1ZTsKKyAgVUlOVCBpUVNDOworICBVSU5UIHRyZWVOb2RlOworICBVQ0hBUiBjYXJyeUJpdDsKKyAgSU5UICpwTGVmdFN0YXJ0T2ZTZWdtZW50OworICBJTlQgKnBSaWdodFN0YXJ0T2ZTZWdtZW50OworICBTQ0hBUiAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7CisgIFVDSEFSIHJlYWREaXJlY3Rpb247CisgIFVDSEFSICpwQ29kZWJvb2s7CisgIFVDSEFSIGRpbUNudHI7CisgIGNvbnN0IFVJTlQgKnBDdXJyZW50VHJlZTsKICAgY29uc3QgVUNIQVIgKnBDYkRpbWVuc2lvbjsKICAgY29uc3QgU0NIQVIgKnBRdWFudFZhbDsKICAgY29uc3QgU0NIQVIgKnBRdWFudFZhbEJhc2U7CiAKICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wUmVtYWluaW5nQml0c0luU2VnbWVudDsKLSAgcExlZnRTdGFydE9mU2VnbWVudCAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wTGVmdFN0YXJ0T2ZTZWdtZW50OwotICBwUmlnaHRTdGFydE9mU2VnbWVudCAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSaWdodFN0YXJ0T2ZTZWdtZW50OwotICByZWFkRGlyZWN0aW9uICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnJlYWREaXJlY3Rpb247Ci0gIHBTZWdtZW50Qml0ZmllbGQgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucFNlZ21lbnRCaXRmaWVsZDsKLSAgcENvZGV3b3JkQml0ZmllbGQgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wQ29kZXdvcmRCaXRmaWVsZDsKLSAgc2VnbWVudE9mZnNldCAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5zZWdtZW50T2Zmc2V0OworICBwTGVmdFN0YXJ0T2ZTZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucExlZnRTdGFydE9mU2VnbWVudDsKKyAgcFJpZ2h0U3RhcnRPZlNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wUmlnaHRTdGFydE9mU2VnbWVudDsKKyAgcmVhZERpcmVjdGlvbiA9IHBIY3ItPnNlZ21lbnRJbmZvLnJlYWREaXJlY3Rpb247CisgIHBTZWdtZW50Qml0ZmllbGQgPSBwSGNyLT5zZWdtZW50SW5mby5wU2VnbWVudEJpdGZpZWxkOworICBwQ29kZXdvcmRCaXRmaWVsZCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBDb2Rld29yZEJpdGZpZWxkOworICBzZWdtZW50T2Zmc2V0ID0gcEhjci0+c2VnbWVudEluZm8uc2VnbWVudE9mZnNldDsKIAotICBwQ29kZWJvb2sgICAgICAgICAgICAgICA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBDb2RlYm9vazsKLSAgaU5vZGUgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pTm9kZTsKLSAgcFJlc3VsdEJhc2UgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wUmVzdWx0QmFzZTsKLSAgaVJlc3VsdFBvaW50ZXIgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pUmVzdWx0UG9pbnRlcjsKLSAgY29kZXdvcmRPZmZzZXQgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5jb2Rld29yZE9mZnNldDsKKyAgcENvZGVib29rID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucENvZGVib29rOworICBpTm9kZSA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLmlOb2RlOworICBwUmVzdWx0QmFzZSA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBSZXN1bHRCYXNlOworICBpUmVzdWx0UG9pbnRlciA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLmlSZXN1bHRQb2ludGVyOworICBjb2Rld29yZE9mZnNldCA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLmNvZGV3b3JkT2Zmc2V0OwogCi0gIHBDYkRpbWVuc2lvbiAgICAgICAgICAgID0gcEhjci0+dGFibGVJbmZvLnBDYkRpbWVuc2lvbjsKKyAgcENiRGltZW5zaW9uID0gYURpbUNiOwogCi0gIHRyZWVOb2RlICAgICAgICAgICAgICAgID0gaU5vZGVbY29kZXdvcmRPZmZzZXRdOwotICBwQ3VycmVudFRyZWUgICAgICAgICAgICA9IGFIdWZmVGFibGVbcENvZGVib29rW2NvZGV3b3JkT2Zmc2V0XV07CisgIHRyZWVOb2RlID0gaU5vZGVbY29kZXdvcmRPZmZzZXRdOworICBwQ3VycmVudFRyZWUgPSBhSHVmZlRhYmxlW3BDb2RlYm9va1tjb2Rld29yZE9mZnNldF1dOwogCi0KLSAgZm9yICggOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA+IDAgOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxICkgewotCi0gICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbSggYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcExlZnRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKKyAgZm9yICg7IHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdID4gMDsKKyAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxKSB7CisgICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbShicywgJnBMZWZ0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJpZ2h0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZERpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRGlyZWN0aW9uKTsKIAotICAgIENhcnJ5Qml0VG9CcmFuY2hWYWx1ZShjYXJyeUJpdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYWtlIGEgc3RlcCBpbiBkZWNvZGluZyB0cmVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmYnJhbmNoVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZicmFuY2hOb2RlKTsKKyAgICBDYXJyeUJpdFRvQnJhbmNoVmFsdWUoY2FycnlCaXQsIC8qIG1ha2UgYSBzdGVwIGluIGRlY29kaW5nIHRyZWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZU5vZGUsICZicmFuY2hWYWx1ZSwgJmJyYW5jaE5vZGUpOwogCi0gICAgLyogaWYgZW5kIG9mIGJyYW5jaCByZWFjaGVkIHdyaXRlIG91dCBsaW5lcyBhbmQgY291bnQgYml0cyBuZWVkZWQgZm9yIHNpZ24sIG90aGVyd2lzZSBzdG9yZSBub2RlIGluIGNvZGV3b3JkIHNpZGVpbmZvICovCi0gICAgaWYgKChicmFuY2hOb2RlICYgVEVTVF9CSVRfMTApID09IFRFU1RfQklUXzEwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlc3QgYml0IDEwIDsgPT0+IGJvZHkgaXMgY29tcGxldGUgKi8KLSAgICAgIHBRdWFudFZhbEJhc2UgPSBhUXVhbnRUYWJsZVtwQ29kZWJvb2tbY29kZXdvcmRPZmZzZXRdXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGJhc2UgYWRkcmVzcyBvZiBxdWFudGl6ZWQgdmFsdWVzIGJlbG9uZ2luZyB0byBjdXJyZW50IGNvZGVib29rICovCi0gICAgICBwUXVhbnRWYWwgPSBwUXVhbnRWYWxCYXNlICsgYnJhbmNoVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBwb2ludGVyIHRvIGZpcnN0IHZhbGlkIGxpbmUgW29mIDIgb3IgNCBxdWFudGl6ZWQgdmFsdWVzXSAqLworICAgIC8qIGlmIGVuZCBvZiBicmFuY2ggcmVhY2hlZCB3cml0ZSBvdXQgbGluZXMgYW5kIGNvdW50IGJpdHMgbmVlZGVkIGZvciBzaWduLAorICAgICAqIG90aGVyd2lzZSBzdG9yZSBub2RlIGluIGNvZGV3b3JkIHNpZGVpbmZvICovCisgICAgaWYgKChicmFuY2hOb2RlICYgVEVTVF9CSVRfMTApID09CisgICAgICAgIFRFU1RfQklUXzEwKSB7IC8qIHRlc3QgYml0IDEwIDsgPT0+IGJvZHkgaXMgY29tcGxldGUgKi8KKyAgICAgIHBRdWFudFZhbEJhc2UgPSBhUXVhbnRUYWJsZVtwQ29kZWJvb2tbY29kZXdvcmRPZmZzZXRdXTsgLyogZ2V0IGJhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbG9uZ2luZyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVib29rICovCisgICAgICBwUXVhbnRWYWwgPSBwUXVhbnRWYWxCYXNlICsgYnJhbmNoVmFsdWU7IC8qIHNldCBwb2ludGVyIHRvIGZpcnN0IHZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgW29mIDIgb3IgNCBxdWFudGl6ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzXSAqLwogCi0gICAgICBpUVNDID0gaVJlc3VsdFBvaW50ZXJbY29kZXdvcmRPZmZzZXRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHBvc2l0aW9uIG9mIGZpcnN0IGxpbmUgZm9yIHdyaXRpbmcgb3V0IHJlc3VsdCAqLworICAgICAgaVFTQyA9IGlSZXN1bHRQb2ludGVyW2NvZGV3b3JkT2Zmc2V0XTsgLyogZ2V0IHBvc2l0aW9uIG9mIGZpcnN0IGxpbmUgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nIG91dCByZXN1bHQgKi8KIAotICAgICAgZm9yICggZGltQ250ciA9IHBDYkRpbWVuc2lvbltwQ29kZWJvb2tbY29kZXdvcmRPZmZzZXRdXTsgZGltQ250ciAhPSAwOyBkaW1DbnRyLS0gKSB7Ci0gICAgICAgIHBSZXN1bHRCYXNlW2lRU0MrK10gPSAoRklYUF9EQkwpKnBRdWFudFZhbCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBvdXQgMiBvciA0IGxpbmVzIGludG8gc3BlY3RydW07IG5vIFNpZ24gYml0cyBhdmFpbGFibGUgaW4gdGhpcyBzdGF0ZSAqLworICAgICAgZm9yIChkaW1DbnRyID0gcENiRGltZW5zaW9uW3BDb2RlYm9va1tjb2Rld29yZE9mZnNldF1dOyBkaW1DbnRyICE9IDA7CisgICAgICAgICAgIGRpbUNudHItLSkgeworICAgICAgICBwUmVzdWx0QmFzZVtpUVNDKytdID0KKyAgICAgICAgICAgIChGSVhQX0RCTCkqcFF1YW50VmFsKys7IC8qIHdyaXRlIG91dCAyIG9yIDQgbGluZXMgaW50bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY3RydW07IG5vIFNpZ24gYml0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIGluIHRoaXMgc3RhdGUgKi8KICAgICAgIH0KIAotICAgICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2Rld29yZEJpdGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCi0gICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxhc3QgcmVpbml0aWFsemF0aW9uIG9mIGZvciBsb29wIGNvdW50ZXIgKHNlZSBhYm92ZSkgaXMgZG9uZSBoZXJlICovCi0gICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBicmFuY2ggaW4gdHJlZSByZWFjaGVkICBpLmUuIGEgd2hvbGUgbm9uUENXLUJvZHkgaXMgZGVjb2RlZCAqLwotICAgIH0KLSAgICBlbHNlIHsgLyogYm9keSBpcyBub3QgZGVjb2RlZCBjb21wbGV0ZWx5OiAqLwotICAgICAgdHJlZU5vZGUgPSAqKHBDdXJyZW50VHJlZSArIGJyYW5jaFZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgdHJlZU5vZGUgZm9yIGZ1cnRoZXIgc3RlcCBpbiBkZWNvZGluZyB0cmVlICovCisgICAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksIHNlZ21lbnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZCk7IC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggb2ZmIHN0YXRlbWFjaGluZSAqLworICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMTsgLyogbGFzdCByZWluaXRpYWx6YXRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsb29wIGNvdW50ZXIgKHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUpIGlzIGRvbmUgaGVyZSAqLworICAgICAgYnJlYWs7IC8qIGVuZCBvZiBicmFuY2ggaW4gdHJlZSByZWFjaGVkICBpLmUuIGEgd2hvbGUgbm9uUENXLUJvZHkgaXMKKyAgICAgICAgICAgICAgICBkZWNvZGVkICovCisgICAgfSBlbHNlIHsgLyogYm9keSBpcyBub3QgZGVjb2RlZCBjb21wbGV0ZWx5OiAqLworICAgICAgdHJlZU5vZGUgPSAqKAorICAgICAgICAgIHBDdXJyZW50VHJlZSArCisgICAgICAgICAgYnJhbmNoVmFsdWUpOyAvKiB1cGRhdGUgdHJlZU5vZGUgZm9yIGZ1cnRoZXIgc3RlcCBpbiBkZWNvZGluZyB0cmVlICovCiAgICAgfQogICB9Ci0gIGlOb2RlW2NvZGV3b3JkT2Zmc2V0XSA9IHRyZWVOb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIHVwZGF0ZWQgdHJlZU5vZGUgYmVjYXVzZSBtYXliZSBkZWNvZGluZyBvZiBjb2Rld29yZCBib2R5IG5vdCBmaW5pc2hlZCB5ZXQgKi8KKyAgaU5vZGVbY29kZXdvcmRPZmZzZXRdID0gdHJlZU5vZGU7IC8qIHN0b3JlIHVwZGF0ZWQgdHJlZU5vZGUgYmVjYXVzZSBtYXliZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rpbmcgb2YgY29kZXdvcmQgYm9keSBub3QgZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlldCAqLwogCi0gIGlmICggcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPD0gMCApIHsKLSAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCisgIGlmIChwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8PSAwKSB7CisgICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLCBzZWdtZW50T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWdtZW50Qml0ZmllbGQpOyAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KIAotI2lmIFNUQVRFX01BQ0hJTkVfRVJST1JfQ0hFQ0sKLSAgICBpZiAoIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDwgMCApIHsKKyAgICBpZiAocFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPCAwKSB7CiAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBTVEFURV9FUlJPUl9CT0RZX09OTFk7Ci0gICAgICByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX09OTFk7CisgICAgICByZXR1cm4gQk9EWV9PTkxZOwogICAgIH0KLSNlbmRpZgogICB9CiAKICAgcmV0dXJuIFNUT1BfVEhJU19TVEFURTsKIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBkZXNjcmlwdGlvbjogRGVjb2RlcyB0aGUgY29kZXdvcmQgYm9keSwgd3JpdGVzIG91dCByZXN1bHQgYW5kIGNvdW50cyB0aGUgbnVtYmVyIG9mIHF1YW50aXplZAotICAgICAgICAgICAgICAgICAgc3BlY3RyYWwgdmFsdWVzLCB3aGljaCBhcmUgZGlmZmVyZW50IGZvcm0gemVyby4gRm9yIHRob3NlIHZhbHVlcyBzaWduIGJpdHMgYXJlCi0gICAgICAgICAgICAgICAgICBuZWVkZWQuCisgICAgIGRlc2NyaXB0aW9uOiBEZWNvZGVzIHRoZSBjb2Rld29yZCBib2R5LCB3cml0ZXMgb3V0IHJlc3VsdCBhbmQgY291bnRzIHRoZQorbnVtYmVyIG9mIHF1YW50aXplZCBzcGVjdHJhbCB2YWx1ZXMsIHdoaWNoIGFyZSBkaWZmZXJlbnQgZm9ybSB6ZXJvLiBGb3IgdGhvc2UKK3ZhbHVlcyBzaWduIGJpdHMgYXJlIG5lZWRlZC4KIAotICAgICAgICAgICAgICAgICAgSWYgc2lnbiBiaXQgY291bnRlciBjbnRTaWduIGlzIGRpZmZlcmVudCBmcm9tIHplcm8sIHN3aXRjaCB0byBuZXh0IHN0YXRlIHRvCi0gICAgICAgICAgICAgICAgICBkZWNvZGUgc2lnbiBCaXRzIHRoZXJlLgotICAgICAgICAgICAgICAgICAgSWYgc2lnbiBiaXQgY291bnRlciBjbnRTaWduIGlzIHplcm8sIG5vIHNpZ24gYml0cyBhcmUgbmVlZGVkIGFuZCBjb2Rld29yZCBpcwotICAgICAgICAgICAgICAgICAgZGVjb2RlZC4KKyAgICAgICAgICAgICAgICAgIElmIHNpZ24gYml0IGNvdW50ZXIgY250U2lnbiBpcyBkaWZmZXJlbnQgZnJvbSB6ZXJvLCBzd2l0Y2ggdG8KK25leHQgc3RhdGUgdG8gZGVjb2RlIHNpZ24gQml0cyB0aGVyZS4gSWYgc2lnbiBiaXQgY291bnRlciBjbnRTaWduIGlzIHplcm8sIG5vCitzaWduIGJpdHMgYXJlIG5lZWRlZCBhbmQgY29kZXdvcmQgaXMgZGVjb2RlZC4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG91dHB1dDogICBUd28gb3IgZm91ciB3cml0dGVuIHF1YW50aXplcyBzcGVjdHJhbCB2YWx1ZXMgd3JpdHRlbiBhdCBwb3NpdGlvbiB3aGVyZQotICAgICAgICAgICAgICAgICAgcFJlc3VsdFBvaW50ciBwb2ludHMgdG8uIFRoZSBzaWducyBvZiB0aG9zZSBsaW5lcyBtYXkgYmUgd3JvbmcuIElmIHRoZSBzaWducwotICAgICAgICAgICAgICAgICAgW29uIGp1c3Qgb25lIHNpZ25sZSBzaWduXSBpcyB3cm9uZywgdGhlIG5leHQgc3RhdGUgd2lsbCBjb3JyZWN0IGl0LgorICAgICAgICBvdXRwdXQ6ICAgVHdvIG9yIGZvdXIgd3JpdHRlbiBxdWFudGl6ZXMgc3BlY3RyYWwgdmFsdWVzIHdyaXR0ZW4gYXQKK3Bvc2l0aW9uIHdoZXJlIHBSZXN1bHRQb2ludHIgcG9pbnRzIHRvLiBUaGUgc2lnbnMgb2YgdGhvc2UgbGluZXMgbWF5IGJlIHdyb25nLgorSWYgdGhlIHNpZ25zIFtvbiBqdXN0IG9uZSBzaWdubGUgc2lnbl0gaXMgd3JvbmcsIHRoZSBuZXh0IHN0YXRlIHdpbGwgY29ycmVjdCBpdC4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIHJldHVybjogICAwCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotVUlOVCBIY3JfU3RhdGVfQk9EWV9TSUdOX19CT0RZKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCB2b2lkICpwdHIpCi17CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK1VJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9fQk9EWShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgdm9pZCAqcHRyKSB7CiAgIEhfSENSX0lORk8gcEhjciA9IChIX0hDUl9JTkZPKXB0cjsKLSAgU0NIQVIgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OwotICBVU0hPUlQgICAgICAqcExlZnRTdGFydE9mU2VnbWVudDsKLSAgVVNIT1JUICAgICAgKnBSaWdodFN0YXJ0T2ZTZWdtZW50OwotICBVQ0hBUiAgICAgICAgcmVhZERpcmVjdGlvbjsKLSAgVUlOVCAgICAgICAgKnBTZWdtZW50Qml0ZmllbGQ7Ci0gIFVJTlQgICAgICAgICpwQ29kZXdvcmRCaXRmaWVsZDsKLSAgVUlOVCAgICAgICAgIHNlZ21lbnRPZmZzZXQ7CisgIFNDSEFSICpwUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgSU5UICpwTGVmdFN0YXJ0T2ZTZWdtZW50OworICBJTlQgKnBSaWdodFN0YXJ0T2ZTZWdtZW50OworICBVQ0hBUiByZWFkRGlyZWN0aW9uOworICBVSU5UICpwU2VnbWVudEJpdGZpZWxkOworICBVSU5UICpwQ29kZXdvcmRCaXRmaWVsZDsKKyAgVUlOVCBzZWdtZW50T2Zmc2V0OwogCi0gIFVDSEFSICAgICAgICpwQ29kZWJvb2s7Ci0gIFVJTlQgICAgICAgICppTm9kZTsKLSAgVUNIQVIgICAgICAgKnBDbnRTaWduOwotICBGSVhQX0RCTCAgICAqcFJlc3VsdEJhc2U7Ci0gIFVTSE9SVCAgICAgICppUmVzdWx0UG9pbnRlcjsKLSAgVUlOVCAgICAgICAgIGNvZGV3b3JkT2Zmc2V0OworICBVQ0hBUiAqcENvZGVib29rOworICBVSU5UICppTm9kZTsKKyAgVUNIQVIgKnBDbnRTaWduOworICBGSVhQX0RCTCAqcFJlc3VsdEJhc2U7CisgIFVTSE9SVCAqaVJlc3VsdFBvaW50ZXI7CisgIFVJTlQgY29kZXdvcmRPZmZzZXQ7CiAKLSAgVUlOVCAgICAgICAgIGlRU0M7Ci0gIFVJTlQgICAgICAgICBjbnRTaWduOwotICBVQ0hBUiAgICAgICAgZGltQ250cjsKLSAgVUNIQVIgICAgICAgIGNhcnJ5Qml0OwotICBTQ0hBUiAgICAgICAqcFN0YTsKLSAgVUlOVCAgICAgICAgIHRyZWVOb2RlOwotICBVSU5UICAgICAgICAgYnJhbmNoVmFsdWU7Ci0gIFVJTlQgICAgICAgICBicmFuY2hOb2RlOworICBVSU5UIGlRU0M7CisgIFVJTlQgY250U2lnbjsKKyAgVUNIQVIgZGltQ250cjsKKyAgVUNIQVIgY2FycnlCaXQ7CisgIFNDSEFSICpwU3RhOworICBVSU5UIHRyZWVOb2RlOworICBVSU5UIGJyYW5jaFZhbHVlOworICBVSU5UIGJyYW5jaE5vZGU7CiAgIGNvbnN0IFVDSEFSICpwQ2JEaW1lbnNpb247Ci0gIGNvbnN0IFVJTlQgICpwQ3VycmVudFRyZWU7CisgIGNvbnN0IFVJTlQgKnBDdXJyZW50VHJlZTsKICAgY29uc3QgU0NIQVIgKnBRdWFudFZhbEJhc2U7CiAgIGNvbnN0IFNDSEFSICpwUXVhbnRWYWw7CiAKLSAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wUmVtYWluaW5nQml0c0luU2VnbWVudDsKLSAgcExlZnRTdGFydE9mU2VnbWVudCAgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wTGVmdFN0YXJ0T2ZTZWdtZW50OwotICBwUmlnaHRTdGFydE9mU2VnbWVudCAgICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSaWdodFN0YXJ0T2ZTZWdtZW50OwotICByZWFkRGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnJlYWREaXJlY3Rpb247Ci0gIHBTZWdtZW50Qml0ZmllbGQgICAgICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucFNlZ21lbnRCaXRmaWVsZDsKLSAgcENvZGV3b3JkQml0ZmllbGQgICAgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wQ29kZXdvcmRCaXRmaWVsZDsKLSAgc2VnbWVudE9mZnNldCAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5zZWdtZW50T2Zmc2V0OworICBwUmVtYWluaW5nQml0c0luU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OworICBwTGVmdFN0YXJ0T2ZTZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucExlZnRTdGFydE9mU2VnbWVudDsKKyAgcFJpZ2h0U3RhcnRPZlNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wUmlnaHRTdGFydE9mU2VnbWVudDsKKyAgcmVhZERpcmVjdGlvbiA9IHBIY3ItPnNlZ21lbnRJbmZvLnJlYWREaXJlY3Rpb247CisgIHBTZWdtZW50Qml0ZmllbGQgPSBwSGNyLT5zZWdtZW50SW5mby5wU2VnbWVudEJpdGZpZWxkOworICBwQ29kZXdvcmRCaXRmaWVsZCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBDb2Rld29yZEJpdGZpZWxkOworICBzZWdtZW50T2Zmc2V0ID0gcEhjci0+c2VnbWVudEluZm8uc2VnbWVudE9mZnNldDsKIAotICBwQ29kZWJvb2sgICAgICAgICAgICAgICAgICAgICAgICA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBDb2RlYm9vazsKLSAgaU5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pTm9kZTsKLSAgcENudFNpZ24gICAgICAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wQ250U2lnbjsKLSAgcFJlc3VsdEJhc2UgICAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wUmVzdWx0QmFzZTsKLSAgaVJlc3VsdFBvaW50ZXIgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pUmVzdWx0UG9pbnRlcjsKLSAgY29kZXdvcmRPZmZzZXQgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5jb2Rld29yZE9mZnNldDsKLSAgcFN0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhOworICBwQ29kZWJvb2sgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wQ29kZWJvb2s7CisgIGlOb2RlID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaU5vZGU7CisgIHBDbnRTaWduID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucENudFNpZ247CisgIHBSZXN1bHRCYXNlID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFJlc3VsdEJhc2U7CisgIGlSZXN1bHRQb2ludGVyID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaVJlc3VsdFBvaW50ZXI7CisgIGNvZGV3b3JkT2Zmc2V0ID0gcEhjci0+bm9uUGN3U2lkZWluZm8uY29kZXdvcmRPZmZzZXQ7CisgIHBTdGEgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhOwogCi0gIHBDYkRpbWVuc2lvbiAgICAgICAgICAgICAgICAgICAgID0gcEhjci0+dGFibGVJbmZvLnBDYkRpbWVuc2lvbjsKKyAgcENiRGltZW5zaW9uID0gYURpbUNiOwogCi0gIHRyZWVOb2RlICAgICAgICAgICAgICAgICAgICAgICAgID0gaU5vZGVbY29kZXdvcmRPZmZzZXRdOwotICBwQ3VycmVudFRyZWUgICAgICAgICAgICAgICAgICAgICA9IGFIdWZmVGFibGVbcENvZGVib29rW2NvZGV3b3JkT2Zmc2V0XV07CisgIHRyZWVOb2RlID0gaU5vZGVbY29kZXdvcmRPZmZzZXRdOworICBwQ3VycmVudFRyZWUgPSBhSHVmZlRhYmxlW3BDb2RlYm9va1tjb2Rld29yZE9mZnNldF1dOwogCi0KLSAgZm9yICggOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA+IDAgOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxICkgewotCi0gICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbSggYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcExlZnRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKKyAgZm9yICg7IHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdID4gMDsKKyAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxKSB7CisgICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbShicywgJnBMZWZ0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJpZ2h0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZERpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRGlyZWN0aW9uKTsKIAotICAgIENhcnJ5Qml0VG9CcmFuY2hWYWx1ZShjYXJyeUJpdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYWtlIGEgc3RlcCBpbiBkZWNvZGluZyB0cmVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmYnJhbmNoVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZicmFuY2hOb2RlKTsKKyAgICBDYXJyeUJpdFRvQnJhbmNoVmFsdWUoY2FycnlCaXQsIC8qIG1ha2UgYSBzdGVwIGluIGRlY29kaW5nIHRyZWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZU5vZGUsICZicmFuY2hWYWx1ZSwgJmJyYW5jaE5vZGUpOwogCi0gICAgLyogaWYgZW5kIG9mIGJyYW5jaCByZWFjaGVkIHdyaXRlIG91dCBsaW5lcyBhbmQgY291bnQgYml0cyBuZWVkZWQgZm9yIHNpZ24sIG90aGVyd2lzZSBzdG9yZSBub2RlIGluIGNvZGV3b3JkIHNpZGVpbmZvICovCi0gICAgaWYgKChicmFuY2hOb2RlICYgVEVTVF9CSVRfMTApID09IFRFU1RfQklUXzEwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlc3QgYml0IDEwIDsgaWYgc2V0IGJvZHkgY29tcGxldGUgKi8KLSAgICAgIC8qIGJvZHkgY29tcGxldGVseSBkZWNvZGVkOyBicmFuY2hWYWx1ZSBpcyB2YWxpZCwgc2V0IHBRdWFudFZhbCB0byBmaXJzdCAob2YgdHdvIG9yIGZvdXIpIHF1YW50aXplZCBzcGVjdHJhbCBjb2VmZmljaWVudHMgKi8KLSAgICAgIHBRdWFudFZhbEJhc2UgPSBhUXVhbnRUYWJsZVtwQ29kZWJvb2tbY29kZXdvcmRPZmZzZXRdXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGJhc2UgYWRkcmVzcyBvZiBxdWFudGl6ZWQgdmFsdWVzIGJlbG9uZ2luZyB0byBjdXJyZW50IGNvZGVib29rICovCi0gICAgICBwUXVhbnRWYWwgPSBwUXVhbnRWYWxCYXNlICsgYnJhbmNoVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBwb2ludGVyIHRvIGZpcnN0IHZhbGlkIGxpbmUgW29mIDIgb3IgNCBxdWFudGl6ZWQgdmFsdWVzXSAqLworICAgIC8qIGlmIGVuZCBvZiBicmFuY2ggcmVhY2hlZCB3cml0ZSBvdXQgbGluZXMgYW5kIGNvdW50IGJpdHMgbmVlZGVkIGZvciBzaWduLAorICAgICAqIG90aGVyd2lzZSBzdG9yZSBub2RlIGluIGNvZGV3b3JkIHNpZGVpbmZvICovCisgICAgaWYgKChicmFuY2hOb2RlICYgVEVTVF9CSVRfMTApID09CisgICAgICAgIFRFU1RfQklUXzEwKSB7IC8qIHRlc3QgYml0IDEwIDsgaWYgc2V0IGJvZHkgY29tcGxldGUgKi8KKyAgICAgIC8qIGJvZHkgY29tcGxldGVseSBkZWNvZGVkOyBicmFuY2hWYWx1ZSBpcyB2YWxpZCwgc2V0IHBRdWFudFZhbCB0byBmaXJzdAorICAgICAgICogKG9mIHR3byBvciBmb3VyKSBxdWFudGl6ZWQgc3BlY3RyYWwgY29lZmZpY2llbnRzICovCisgICAgICBwUXVhbnRWYWxCYXNlID0gYVF1YW50VGFibGVbcENvZGVib29rW2NvZGV3b3JkT2Zmc2V0XV07IC8qIGdldCBiYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Mgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWxvbmdpbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYm9vayAqLworICAgICAgcFF1YW50VmFsID0gcFF1YW50VmFsQmFzZSArIGJyYW5jaFZhbHVlOyAvKiBzZXQgcG9pbnRlciB0byBmaXJzdCB2YWxpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lIFtvZiAyIG9yIDQgcXVhbnRpemVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc10gKi8KIAotICAgICAgaVFTQyA9IGlSZXN1bHRQb2ludGVyW2NvZGV3b3JkT2Zmc2V0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgcG9zaXRpb24gb2YgZmlyc3QgbGluZSBmb3Igd3JpdGluZyByZXN1bHQgKi8KKyAgICAgIGlRU0MgPSBpUmVzdWx0UG9pbnRlcltjb2Rld29yZE9mZnNldF07IC8qIGdldCBwb3NpdGlvbiBvZiBmaXJzdCBsaW5lIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGluZyByZXN1bHQgKi8KIAotICAgICAgLyogY29kZXdvcmQgZGVjb2RpbmcgcmVzdWx0IGlzIHdyaXR0ZW4gb3V0IGhlcmU6IFdyaXRlIG91dCAyIG9yIDQgcXVhbnRpemVkIHNwZWN0cmFsIHZhbHVlcyB3aXRoIHByb2JhYmx5ICovCi0gICAgICAvKiB3cm9uZyBzaWduIGFuZCBjb3VudCBudW1iZXIgb2YgdmFsdWVzIHdoaWNoIGFyZSBkaWZmZXJlbnQgZnJvbSB6ZXJvIGZvciBzaWduIGJpdCBkZWNvZGluZyBbd2hpY2ggaGFwcGVucyBpbiBuZXh0IHN0YXRlXSAqLworICAgICAgLyogY29kZXdvcmQgZGVjb2RpbmcgcmVzdWx0IGlzIHdyaXR0ZW4gb3V0IGhlcmU6IFdyaXRlIG91dCAyIG9yIDQKKyAgICAgICAqIHF1YW50aXplZCBzcGVjdHJhbCB2YWx1ZXMgd2l0aCBwcm9iYWJseSAqLworICAgICAgLyogd3Jvbmcgc2lnbiBhbmQgY291bnQgbnVtYmVyIG9mIHZhbHVlcyB3aGljaCBhcmUgZGlmZmVyZW50IGZyb20gemVybyBmb3IKKyAgICAgICAqIHNpZ24gYml0IGRlY29kaW5nIFt3aGljaCBoYXBwZW5zIGluIG5leHQgc3RhdGVdICovCiAgICAgICBjbnRTaWduID0gMDsKLSAgICAgIGZvciAoIGRpbUNudHIgPSBwQ2JEaW1lbnNpb25bcENvZGVib29rW2NvZGV3b3JkT2Zmc2V0XV07IGRpbUNudHIgIT0gMDsgZGltQ250ci0tICkgewotICAgICAgICBwUmVzdWx0QmFzZVtpUVNDKytdID0gKEZJWFBfREJMKSpwUXVhbnRWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgcXVhbnQuIHNwZWMuIGNvZWYuIGludG8gc3BlY3RydW0gKi8KLSAgICAgICAgaWYgKCAqcFF1YW50VmFsKysgIT0gMCApIHsKKyAgICAgIGZvciAoZGltQ250ciA9IHBDYkRpbWVuc2lvbltwQ29kZWJvb2tbY29kZXdvcmRPZmZzZXRdXTsgZGltQ250ciAhPSAwOworICAgICAgICAgICBkaW1DbnRyLS0pIHsKKyAgICAgICAgcFJlc3VsdEJhc2VbaVFTQysrXSA9CisgICAgICAgICAgICAoRklYUF9EQkwpKnBRdWFudFZhbDsgLyogd3JpdGUgcXVhbnQuIHNwZWMuIGNvZWYuIGludG8gc3BlY3RydW0gKi8KKyAgICAgICAgaWYgKCpwUXVhbnRWYWwrKyAhPSAwKSB7CiAgICAgICAgICAgY250U2lnbiArPSAxOwogICAgICAgICB9CiAgICAgICB9CiAKLSAgICAgIGlmICggY250U2lnbiA9PSAwICkgewotICAgICAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2Rld29yZEJpdGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZCBzd2l0Y2ggb2ZmIHN0YXRlbWFjaGluZSAqLworICAgICAgaWYgKGNudFNpZ24gPT0gMCkgeworICAgICAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgKKyAgICAgICAgICAgICYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwgc2VnbWVudE9mZnNldCwKKyAgICAgICAgICAgIHBDb2Rld29yZEJpdGZpZWxkKTsgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kIHN3aXRjaCBvZmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtYWNoaW5lICovCisgICAgICB9IGVsc2UgeworICAgICAgICBwQ250U2lnbltjb2Rld29yZE9mZnNldF0gPSBjbnRTaWduOyAgICAgLyogd3JpdGUgc2lnbiBjb3VudCByZXN1bHQgaW50bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXdvcmRzaWRlaW5mbyBvZiBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rld29yZCAqLworICAgICAgICBwU3RhW2NvZGV3b3JkT2Zmc2V0XSA9IEJPRFlfU0lHTl9fU0lHTjsgLyogY2hhbmdlIHN0YXRlICovCisgICAgICAgIHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSA9CisgICAgICAgICAgICBhU3RhdGVDb25zdGFudDJTdGF0ZVtwU3RhW2NvZGV3b3JkT2Zmc2V0XV07IC8qIGdldCBzdGF0ZSBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRlIGFycmF5IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3LXNpZGVpbmZvICovCiAgICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgcENudFNpZ25bY29kZXdvcmRPZmZzZXRdID0gY250U2lnbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgc2lnbiBjb3VudCByZXN1bHQgaW50byBjb2Rld29yZHNpZGVpbmZvIG9mIGN1cnJlbnQgY29kZXdvcmQgKi8KLSAgICAgICAgcFN0YVtjb2Rld29yZE9mZnNldF0gPSBCT0RZX1NJR05fX1NJR047ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hhbmdlIHN0YXRlICovCi0gICAgICAgIHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSA9IGFTdGF0ZUNvbnN0YW50MlN0YXRlW3BTdGFbY29kZXdvcmRPZmZzZXRdXTsgICAgICAgICAgIC8qIGdldCBzdGF0ZSBmcm9tIHNlcGFyYXRlIGFycmF5IG9mIGN3LXNpZGVpbmZvICovCi0gICAgICB9Ci0gICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxhc3QgcmVpbml0aWFsemF0aW9uIG9mIGZvciBsb29wIGNvdW50ZXIgKHNlZSBhYm92ZSkgaXMgZG9uZSBoZXJlICovCi0gICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBicmFuY2ggaW4gdHJlZSByZWFjaGVkICBpLmUuIGEgd2hvbGUgbm9uUENXLUJvZHkgaXMgZGVjb2RlZCAqLwotICAgIH0KLSAgICBlbHNlIHsvKiBib2R5IGlzIG5vdCBkZWNvZGVkIGNvbXBsZXRlbHk6ICovCi0gICAgICB0cmVlTm9kZSA9ICoocEN1cnJlbnRUcmVlICsgYnJhbmNoVmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSB0cmVlTm9kZSBmb3IgZnVydGhlciBzdGVwIGluIGRlY29kaW5nIHRyZWUgKi8KKyAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDE7IC8qIGxhc3QgcmVpbml0aWFsemF0aW9uIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbG9vcCBjb3VudGVyIChzZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlKSBpcyBkb25lIGhlcmUgKi8KKyAgICAgIGJyZWFrOyAvKiBlbmQgb2YgYnJhbmNoIGluIHRyZWUgcmVhY2hlZCAgaS5lLiBhIHdob2xlIG5vblBDVy1Cb2R5IGlzCisgICAgICAgICAgICAgICAgZGVjb2RlZCAqLworICAgIH0gZWxzZSB7IC8qIGJvZHkgaXMgbm90IGRlY29kZWQgY29tcGxldGVseTogKi8KKyAgICAgIHRyZWVOb2RlID0gKigKKyAgICAgICAgICBwQ3VycmVudFRyZWUgKworICAgICAgICAgIGJyYW5jaFZhbHVlKTsgLyogdXBkYXRlIHRyZWVOb2RlIGZvciBmdXJ0aGVyIHN0ZXAgaW4gZGVjb2RpbmcgdHJlZSAqLwogICAgIH0KICAgfQotICBpTm9kZVtjb2Rld29yZE9mZnNldF0gPSB0cmVlTm9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSB1cGRhdGVkIHRyZWVOb2RlIGJlY2F1c2UgbWF5YmUgZGVjb2Rpbmcgb2YgY29kZXdvcmQgYm9keSBub3QgZmluaXNoZWQgeWV0ICovCisgIGlOb2RlW2NvZGV3b3JkT2Zmc2V0XSA9IHRyZWVOb2RlOyAvKiBzdG9yZSB1cGRhdGVkIHRyZWVOb2RlIGJlY2F1c2UgbWF5YmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kaW5nIG9mIGNvZGV3b3JkIGJvZHkgbm90IGZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXQgKi8KIAotICBpZiAoIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDw9IDAgKSB7Ci0gICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNlZ21lbnRCaXRmaWVsZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZCBzd2l0Y2ggb2ZmIHN0YXRlbWFjaGluZSAqLworICBpZiAocFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPD0gMCkgeworICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwgc2VnbWVudE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkKTsgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCiAKLSNpZiBTVEFURV9NQUNISU5FX0VSUk9SX0NIRUNLCi0gICAgaWYgKCBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8IDAgKSB7CisgICAgaWYgKHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDwgMCkgewogICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gU1RBVEVfRVJST1JfQk9EWV9TSUdOX19CT0RZOwotICAgICAgcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX19CT0RZOworICAgICAgcmV0dXJuIEJPRFlfU0lHTl9fQk9EWTsKICAgICB9Ci0jZW5kaWYKICAgfQogCiAgIHJldHVybiBTVE9QX1RISVNfU1RBVEU7CiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246IFRoaXMgc3RhdGUgZGVjb2RlcyB0aGUgc2lnbiBiaXRzIGJlbG9uZ2luZyB0byBhIGNvZGV3b3JkLiBUaGUgc3RhdGUgaXMgY2FsbGVkCi0gICAgICAgICAgICAgICAgICBhcyBvZnRlbiBpbiBkaWZmZXJlbnQgInRyaWFscyIgdW50aWwgcENudFNnbltjb2Rld29yZE9mZnNldF0gaXMgemVyby4KKyAgICAgZGVzY3JpcHRpb246IFRoaXMgc3RhdGUgZGVjb2RlcyB0aGUgc2lnbiBiaXRzIGJlbG9uZ2luZyB0byBhIGNvZGV3b3JkLiBUaGUKK3N0YXRlIGlzIGNhbGxlZCBhcyBvZnRlbiBpbiBkaWZmZXJlbnQgInRyaWFscyIgdW50aWwgcENudFNnbltjb2Rld29yZE9mZnNldF0gaXMKK3plcm8uCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBvdXRwdXQ6ICAgVGhlIHR3byBvciBmb3VyIHF1YW50aXplcyBzcGVjdHJhbCB2YWx1ZXMgKHdyaXR0ZW4gaW4gcHJldmlvdXMgc3RhdGUpIGhhdmUKLSAgICAgICAgICAgICAgICAgIG5vdyB0aGUgY29ycmVjdCBzaWduLgorICAgICAgICBvdXRwdXQ6ICAgVGhlIHR3byBvciBmb3VyIHF1YW50aXplcyBzcGVjdHJhbCB2YWx1ZXMgKHdyaXR0ZW4gaW4gcHJldmlvdXMKK3N0YXRlKSBoYXZlIG5vdyB0aGUgY29ycmVjdCBzaWduLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgcmV0dXJuOiAgIDAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1VSU5UIEhjcl9TdGF0ZV9CT0RZX1NJR05fX1NJR04oSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIHZvaWQgKnB0cikKLXsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworVUlOVCBIY3JfU3RhdGVfQk9EWV9TSUdOX19TSUdOKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCB2b2lkICpwdHIpIHsKICAgSF9IQ1JfSU5GTyBwSGNyID0gKEhfSENSX0lORk8pcHRyOwotICBTQ0hBUiAgICAgICAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7Ci0gIFVTSE9SVCAgICAgICpwTGVmdFN0YXJ0T2ZTZWdtZW50OwotICBVU0hPUlQgICAgICAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQ7Ci0gIFVDSEFSICAgICAgICByZWFkRGlyZWN0aW9uOwotICBVSU5UICAgICAgICAqcFNlZ21lbnRCaXRmaWVsZDsKLSAgVUlOVCAgICAgICAgKnBDb2Rld29yZEJpdGZpZWxkOwotICBVSU5UICAgICAgICAgc2VnbWVudE9mZnNldDsKKyAgU0NIQVIgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OworICBJTlQgKnBMZWZ0U3RhcnRPZlNlZ21lbnQ7CisgIElOVCAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQ7CisgIFVDSEFSIHJlYWREaXJlY3Rpb247CisgIFVJTlQgKnBTZWdtZW50Qml0ZmllbGQ7CisgIFVJTlQgKnBDb2Rld29yZEJpdGZpZWxkOworICBVSU5UIHNlZ21lbnRPZmZzZXQ7CiAKLSAgVUNIQVIgICAgICAgKnBDbnRTaWduOwotICBGSVhQX0RCTCAgICAqcFJlc3VsdEJhc2U7Ci0gIFVTSE9SVCAgICAgICppUmVzdWx0UG9pbnRlcjsKLSAgVUlOVCAgICAgICAgIGNvZGV3b3JkT2Zmc2V0OwotICBVQ0hBUiAgICAgICAgY2FycnlCaXQ7Ci0gIFVJTlQgICAgICAgICBpUVNDOwotICBVQ0hBUiAgICAgICAgY250U2lnbjsKKyAgVUNIQVIgKnBDbnRTaWduOworICBGSVhQX0RCTCAqcFJlc3VsdEJhc2U7CisgIFVTSE9SVCAqaVJlc3VsdFBvaW50ZXI7CisgIFVJTlQgY29kZXdvcmRPZmZzZXQ7CisKKyAgVUNIQVIgY2FycnlCaXQ7CisgIFVJTlQgaVFTQzsKKyAgVUNIQVIgY250U2lnbjsKIAogICBwUmVtYWluaW5nQml0c0luU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OwotICBwTGVmdFN0YXJ0T2ZTZWdtZW50ICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBMZWZ0U3RhcnRPZlNlZ21lbnQ7Ci0gIHBSaWdodFN0YXJ0T2ZTZWdtZW50ICAgID0gcEhjci0+c2VnbWVudEluZm8ucFJpZ2h0U3RhcnRPZlNlZ21lbnQ7Ci0gIHJlYWREaXJlY3Rpb24gICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucmVhZERpcmVjdGlvbjsKLSAgcFNlZ21lbnRCaXRmaWVsZCAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wU2VnbWVudEJpdGZpZWxkOwotICBwQ29kZXdvcmRCaXRmaWVsZCAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBDb2Rld29yZEJpdGZpZWxkOwotICBzZWdtZW50T2Zmc2V0ICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnNlZ21lbnRPZmZzZXQ7CisgIHBMZWZ0U3RhcnRPZlNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wTGVmdFN0YXJ0T2ZTZWdtZW50OworICBwUmlnaHRTdGFydE9mU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSaWdodFN0YXJ0T2ZTZWdtZW50OworICByZWFkRGlyZWN0aW9uID0gcEhjci0+c2VnbWVudEluZm8ucmVhZERpcmVjdGlvbjsKKyAgcFNlZ21lbnRCaXRmaWVsZCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBTZWdtZW50Qml0ZmllbGQ7CisgIHBDb2Rld29yZEJpdGZpZWxkID0gcEhjci0+c2VnbWVudEluZm8ucENvZGV3b3JkQml0ZmllbGQ7CisgIHNlZ21lbnRPZmZzZXQgPSBwSGNyLT5zZWdtZW50SW5mby5zZWdtZW50T2Zmc2V0OwogCi0gIHBDbnRTaWduICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucENudFNpZ247Ci0gIHBSZXN1bHRCYXNlICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFJlc3VsdEJhc2U7Ci0gIGlSZXN1bHRQb2ludGVyICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaVJlc3VsdFBvaW50ZXI7Ci0gIGNvZGV3b3JkT2Zmc2V0ICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uY29kZXdvcmRPZmZzZXQ7Ci0gIGlRU0MgICAgICAgICAgICAgICAgICAgID0gaVJlc3VsdFBvaW50ZXJbY29kZXdvcmRPZmZzZXRdOwotICBjbnRTaWduICAgICAgICAgICAgICAgICA9IHBDbnRTaWduW2NvZGV3b3JkT2Zmc2V0XTsKKyAgLypwQ29kZWJvb2sgICAgICAgICAgICAgICA9ICovCisgIHBDbnRTaWduID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucENudFNpZ247CisgIHBSZXN1bHRCYXNlID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFJlc3VsdEJhc2U7CisgIGlSZXN1bHRQb2ludGVyID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaVJlc3VsdFBvaW50ZXI7CisgIGNvZGV3b3JkT2Zmc2V0ID0gcEhjci0+bm9uUGN3U2lkZWluZm8uY29kZXdvcmRPZmZzZXQ7CiAKLQorICBpUVNDID0gaVJlc3VsdFBvaW50ZXJbY29kZXdvcmRPZmZzZXRdOworICBjbnRTaWduID0gcENudFNpZ25bY29kZXdvcmRPZmZzZXRdOwogCiAgIC8qIGxvb3AgZm9yIHNpZ24gYml0IGRlY29kaW5nICovCi0gIGZvciAoIDsgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPiAwIDsgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMSApIHsKLQotICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBMZWZ0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCisgIGZvciAoOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA+IDA7CisgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMSkgeworICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oYnMsICZwTGVmdFN0YXJ0T2ZTZWdtZW50W3NlZ21lbnRPZmZzZXRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSaWdodFN0YXJ0T2ZTZWdtZW50W3NlZ21lbnRPZmZzZXRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWREaXJlY3Rpb24pOwotICAgIGNudFNpZ24gLT0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWNyZW1lbnQgc2lnbiBjb3VudGVyIGJlY2F1c2Ugb25lIHNpZ24gYml0IGhhcyBiZWVuIHJlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWREaXJlY3Rpb24pOworICAgIGNudFNpZ24gLT0KKyAgICAgICAgMTsgLyogZGVjcmVtZW50IHNpZ24gY291bnRlciBiZWNhdXNlIG9uZSBzaWduIGJpdCBoYXMgYmVlbiByZWFkICovCiAKLSAgICAvKiBzZWFyY2ggZm9yIGEgbGluZSAod2hpY2ggd2FzIGRlY29kZWQgaW4gcHJldmlvdXMgc3RhdGUpIHdoaWNoIGlzIG5vdCB6ZXJvLiBbVGhpcyB2YWx1ZSB3aWxsIGdldCBhIHNpZ25dICovCi0gICAgd2hpbGUgKCBwUmVzdWx0QmFzZVtpUVNDXSA9PSAoRklYUF9EQkwpMCApIHsKLSAgICAgIGlRU0MrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9pbnRzIHRvIGN1cnJlbnQgdmFsdWUgZGlmZmVyZW50IGZyb20gemVybyAqLwotICAgICAgaWYgKGlRU0MgPj0gMTAyNCkgeworICAgIC8qIHNlYXJjaCBmb3IgYSBsaW5lICh3aGljaCB3YXMgZGVjb2RlZCBpbiBwcmV2aW91cyBzdGF0ZSkgd2hpY2ggaXMgbm90CisgICAgICogemVyby4gW1RoaXMgdmFsdWUgd2lsbCBnZXQgYSBzaWduXSAqLworICAgIHdoaWxlIChwUmVzdWx0QmFzZVtpUVNDXSA9PSAoRklYUF9EQkwpMCkgeworICAgICAgaWYgKCsraVFTQyA+PSAxMDI0KSB7IC8qIHBvaW50cyB0byBjdXJyZW50IHZhbHVlIGRpZmZlcmVudCBmcm9tIHplcm8gKi8KICAgICAgICAgcmV0dXJuIEJPRFlfU0lHTl9fU0lHTjsKICAgICAgIH0KICAgICB9CiAKLSAgICAvKiBwdXQgc2lnbiB0b2dldGhlciB3aXRoIGxpbmU7IGlmIGNhcnJ5Qml0IGlzIHplcm8sIHRoZSBzaWduIGlzIG9rIGFscmVhZHk7IG5vIHdyaXRlIG9wZXJhdGlvbiBuZWNlc3NhcnkgaW4gdGhpcyBjYXNlICovCi0gICAgaWYgKCBjYXJyeUJpdCAhPSAwICkgewotICAgICAgcFJlc3VsdEJhc2VbaVFTQ10gPSAtcFJlc3VsdEJhc2VbaVFTQ107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYXJyeUJpdCA9IDEgLS0+IG1pbnVzICovCisgICAgLyogcHV0IHNpZ24gdG9nZXRoZXIgd2l0aCBsaW5lOyBpZiBjYXJyeUJpdCBpcyB6ZXJvLCB0aGUgc2lnbiBpcyBvayBhbHJlYWR5OworICAgICAqIG5vIHdyaXRlIG9wZXJhdGlvbiBuZWNlc3NhcnkgaW4gdGhpcyBjYXNlICovCisgICAgaWYgKGNhcnJ5Qml0ICE9IDApIHsKKyAgICAgIHBSZXN1bHRCYXNlW2lRU0NdID0gLXBSZXN1bHRCYXNlW2lRU0NdOyAvKiBjYXJyeUJpdCA9IDEgLS0+IG1pbnVzICovCiAgICAgfQogCi0gICAgaVFTQysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBwb2ludGVyIHRvIG5leHQgKG1heWJlIHZhbGlkKSB2YWx1ZSAqLworICAgIGlRU0MrKzsgLyogdXBkYXRlIHBvaW50ZXIgdG8gbmV4dCAobWF5YmUgdmFsaWQpIHZhbHVlICovCiAKLSAgICBpZiAoIGNudFNpZ24gPT0gMCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKGNudFNpZ249PTApICA9PT4gIHNldCBzdGF0ZSBDT0RFV09SRF9ERUNPREVEICovCi0gICAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KLSAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGFzdCByZWluaXRpYWx6YXRpb24gb2YgZm9yIGxvb3AgY291bnRlciAoc2VlIGFib3ZlKSBpcyBkb25lIGhlcmUgKi8KLSAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2hvbGUgbm9uUENXLUJvZHkgYW5kIGFjY29yZGluZyBzaWduIGJpdHMgYXJlIGRlY29kZWQgKi8KLSAgICAgfQorICAgIGlmIChjbnRTaWduID09IDApIHsgLyogaWYgKGNudFNpZ249PTApICA9PT4gIHNldCBzdGF0ZSBDT0RFV09SRF9ERUNPREVEICovCisgICAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksIHNlZ21lbnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZCk7IC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggb2ZmIHN0YXRlbWFjaGluZSAqLworICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMTsgLyogbGFzdCByZWluaXRpYWx6YXRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsb29wIGNvdW50ZXIgKHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUpIGlzIGRvbmUgaGVyZSAqLworICAgICAgYnJlYWs7IC8qIHdob2xlIG5vblBDVy1Cb2R5IGFuZCBhY2NvcmRpbmcgc2lnbiBiaXRzIGFyZSBkZWNvZGVkICovCisgICAgfQogICB9CiAgIHBDbnRTaWduW2NvZGV3b3JkT2Zmc2V0XSA9IGNudFNpZ247Ci0gIGlSZXN1bHRQb2ludGVyW2NvZGV3b3JkT2Zmc2V0XSA9IGlRU0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIHVwZGF0ZWQgcFJlc3VsdFBvaW50ZXIgKi8KKyAgaVJlc3VsdFBvaW50ZXJbY29kZXdvcmRPZmZzZXRdID0gaVFTQzsgLyogc3RvcmUgdXBkYXRlZCBwUmVzdWx0UG9pbnRlciAqLwogCi0gIGlmICggcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPD0gMCApIHsKLSAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCisgIGlmIChwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8PSAwKSB7CisgICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLCBzZWdtZW50T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWdtZW50Qml0ZmllbGQpOyAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KIAotI2lmIFNUQVRFX01BQ0hJTkVfRVJST1JfQ0hFQ0sKLSAgICBpZiAoIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDwgMCApIHsKKyAgICBpZiAocFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPCAwKSB7CiAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBTVEFURV9FUlJPUl9CT0RZX1NJR05fX1NJR047Ci0gICAgICByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fX1NJR047CisgICAgICByZXR1cm4gQk9EWV9TSUdOX19TSUdOOwogICAgIH0KLSNlbmRpZgogICB9CiAKICAgcmV0dXJuIFNUT1BfVEhJU19TVEFURTsKIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBkZXNjcmlwdGlvbjogRGVjb2RlcyB0aGUgY29kZXdvcmQgYm9keSBpbiBjYXNlIG9mIGNvZGVib29rIGlzIDExLiBXcml0ZXMgb3V0IHJlc3VsdGluZwotICAgICAgICAgICAgICAgICAgdHdvIG9yIGZvdXIgbGluZXMgW3dpdGggcHJvYmFibHkgd3Jvbmcgc2lnbl0gYW5kIGNvdW50cyB0aGUgbnVtYmVyIG9mCi0gICAgICAgICAgICAgICAgICBsaW5lcywgd2hpY2ggYXJlIGRpZmZlcmVudCBmb3JtIHplcm8uIFRoaXMgaW5mb3JtYXRpb24gaXMgbmVlZGVkIGluIG5leHQKKyAgICAgZGVzY3JpcHRpb246IERlY29kZXMgdGhlIGNvZGV3b3JkIGJvZHkgaW4gY2FzZSBvZiBjb2RlYm9vayBpcyAxMS4gV3JpdGVzCitvdXQgcmVzdWx0aW5nIHR3byBvciBmb3VyIGxpbmVzIFt3aXRoIHByb2JhYmx5IHdyb25nIHNpZ25dIGFuZCBjb3VudHMgdGhlIG51bWJlcgorb2YgbGluZXMsIHdoaWNoIGFyZSBkaWZmZXJlbnQgZm9ybSB6ZXJvLiBUaGlzIGluZm9ybWF0aW9uIGlzIG5lZWRlZCBpbiBuZXh0CiAgICAgICAgICAgICAgICAgICBzdGF0ZSB3aGVyZSBzaWduIGJpdHMgd2lsbCBiZSBkZWNvZGVkLCBpZiBuZWNlc3NhcnkuCi0gICAgICAgICAgICAgICAgICBJZiBzaWduIGJpdCBjb3VudGVyIGNudFNpZ24gaXMgemVybywgbm8gc2lnbiBiaXRzIGFyZSBuZWVkZWQgYW5kIGNvZGV3b3JkIGlzCi0gICAgICAgICAgICAgICAgICBkZWNvZGVkIGNvbXBsZXRlbHkuCisgICAgICAgICAgICAgICAgICBJZiBzaWduIGJpdCBjb3VudGVyIGNudFNpZ24gaXMgemVybywgbm8gc2lnbiBiaXRzIGFyZSBuZWVkZWQKK2FuZCBjb2Rld29yZCBpcyBkZWNvZGVkIGNvbXBsZXRlbHkuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBvdXRwdXQ6ICAgVHdvIGxpbmVzIChxdWFudGl6ZXMgc3BlY3RyYWwgY29lZmZpY2llbnRzKSB3aGljaCBhcmUgcHJvYmFibHkgd3JvbmcuIFRoZQotICAgICAgICAgICAgICAgICAgc2lnbiBtYXkgYmUgd3JvbmcgYW5kIGlmIG9uZSBvciB0d28gdmFsdWVzIGlzL2FyZSAxNiwgdGhlIGZvbGxvd2luZyBzdGF0ZXMKLSAgICAgICAgICAgICAgICAgIHdpbGwgZGVjb2RlIHRoZSBlc2NhcGUgc2VxdWVuY2UgdG8gY29ycmVjdCB0aGUgdmFsdWVzIHdoaWNoIGFyZSB3aXJ0dGVuIGhlcmUuCisgICAgICAgIG91dHB1dDogICBUd28gbGluZXMgKHF1YW50aXplcyBzcGVjdHJhbCBjb2VmZmljaWVudHMpIHdoaWNoIGFyZSBwcm9iYWJseQord3JvbmcuIFRoZSBzaWduIG1heSBiZSB3cm9uZyBhbmQgaWYgb25lIG9yIHR3byB2YWx1ZXMgaXMvYXJlIDE2LCB0aGUgZm9sbG93aW5nCitzdGF0ZXMgd2lsbCBkZWNvZGUgdGhlIGVzY2FwZSBzZXF1ZW5jZSB0byBjb3JyZWN0IHRoZSB2YWx1ZXMgd2hpY2ggYXJlIHdpcnR0ZW4KK2hlcmUuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICByZXR1cm46ICAgMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLVVJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0JPRFkoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIHZvaWQgKnB0cikKLXsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworVUlOVCBIY3JfU3RhdGVfQk9EWV9TSUdOX0VTQ19fQk9EWShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgdm9pZCAqcHRyKSB7CiAgIEhfSENSX0lORk8gcEhjciA9IChIX0hDUl9JTkZPKXB0cjsKLSAgU0NIQVIgICAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OwotICBVU0hPUlQgICAgICAqcExlZnRTdGFydE9mU2VnbWVudDsKLSAgVVNIT1JUICAgICAgKnBSaWdodFN0YXJ0T2ZTZWdtZW50OwotICBVQ0hBUiAgICAgICAgcmVhZERpcmVjdGlvbjsKLSAgVUlOVCAgICAgICAgKnBTZWdtZW50Qml0ZmllbGQ7Ci0gIFVJTlQgICAgICAgICpwQ29kZXdvcmRCaXRmaWVsZDsKLSAgVUlOVCAgICAgICAgIHNlZ21lbnRPZmZzZXQ7CisgIFNDSEFSICpwUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgSU5UICpwTGVmdFN0YXJ0T2ZTZWdtZW50OworICBJTlQgKnBSaWdodFN0YXJ0T2ZTZWdtZW50OworICBVQ0hBUiByZWFkRGlyZWN0aW9uOworICBVSU5UICpwU2VnbWVudEJpdGZpZWxkOworICBVSU5UICpwQ29kZXdvcmRCaXRmaWVsZDsKKyAgVUlOVCBzZWdtZW50T2Zmc2V0OwogCi0gIFVJTlQgICAgICAgICppTm9kZTsKLSAgVUNIQVIgICAgICAgKnBDbnRTaWduOwotICBGSVhQX0RCTCAgICAqcFJlc3VsdEJhc2U7Ci0gIFVTSE9SVCAgICAgICppUmVzdWx0UG9pbnRlcjsKLSAgVUlOVCAgICAgICAgIGNvZGV3b3JkT2Zmc2V0OworICBVSU5UICppTm9kZTsKKyAgVUNIQVIgKnBDbnRTaWduOworICBGSVhQX0RCTCAqcFJlc3VsdEJhc2U7CisgIFVTSE9SVCAqaVJlc3VsdFBvaW50ZXI7CisgIFVJTlQgY29kZXdvcmRPZmZzZXQ7CiAKLSAgVUNIQVIgICAgICAgIGNhcnJ5Qml0OwotICBVSU5UICAgICAgICAgaVFTQzsKLSAgVUlOVCAgICAgICAgIGNudFNpZ247Ci0gIFVJTlQgICAgICAgICBkaW1DbnRyOwotICBVSU5UICAgICAgICAgdHJlZU5vZGU7Ci0gIFNDSEFSICAgICAgICpwU3RhOwotICBVSU5UICAgICAgICAgYnJhbmNoTm9kZTsKLSAgVUlOVCAgICAgICAgIGJyYW5jaFZhbHVlOwotICBjb25zdCBVSU5UICAqcEN1cnJlbnRUcmVlOworICBVQ0hBUiBjYXJyeUJpdDsKKyAgVUlOVCBpUVNDOworICBVSU5UIGNudFNpZ247CisgIFVJTlQgZGltQ250cjsKKyAgVUlOVCB0cmVlTm9kZTsKKyAgU0NIQVIgKnBTdGE7CisgIFVJTlQgYnJhbmNoTm9kZTsKKyAgVUlOVCBicmFuY2hWYWx1ZTsKKyAgY29uc3QgVUlOVCAqcEN1cnJlbnRUcmVlOwogICBjb25zdCBTQ0hBUiAqcFF1YW50VmFsQmFzZTsKICAgY29uc3QgU0NIQVIgKnBRdWFudFZhbDsKIAogICBwUmVtYWluaW5nQml0c0luU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OwotICBwTGVmdFN0YXJ0T2ZTZWdtZW50ICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBMZWZ0U3RhcnRPZlNlZ21lbnQ7Ci0gIHBSaWdodFN0YXJ0T2ZTZWdtZW50ICAgID0gcEhjci0+c2VnbWVudEluZm8ucFJpZ2h0U3RhcnRPZlNlZ21lbnQ7Ci0gIHJlYWREaXJlY3Rpb24gICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucmVhZERpcmVjdGlvbjsKLSAgcFNlZ21lbnRCaXRmaWVsZCAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wU2VnbWVudEJpdGZpZWxkOwotICBwQ29kZXdvcmRCaXRmaWVsZCAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBDb2Rld29yZEJpdGZpZWxkOwotICBzZWdtZW50T2Zmc2V0ICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnNlZ21lbnRPZmZzZXQ7CisgIHBMZWZ0U3RhcnRPZlNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wTGVmdFN0YXJ0T2ZTZWdtZW50OworICBwUmlnaHRTdGFydE9mU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSaWdodFN0YXJ0T2ZTZWdtZW50OworICByZWFkRGlyZWN0aW9uID0gcEhjci0+c2VnbWVudEluZm8ucmVhZERpcmVjdGlvbjsKKyAgcFNlZ21lbnRCaXRmaWVsZCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBTZWdtZW50Qml0ZmllbGQ7CisgIHBDb2Rld29yZEJpdGZpZWxkID0gcEhjci0+c2VnbWVudEluZm8ucENvZGV3b3JkQml0ZmllbGQ7CisgIHNlZ21lbnRPZmZzZXQgPSBwSGNyLT5zZWdtZW50SW5mby5zZWdtZW50T2Zmc2V0OwogCi0gIGlOb2RlICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaU5vZGU7Ci0gIHBDbnRTaWduICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucENudFNpZ247Ci0gIHBSZXN1bHRCYXNlICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFJlc3VsdEJhc2U7Ci0gIGlSZXN1bHRQb2ludGVyICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaVJlc3VsdFBvaW50ZXI7Ci0gIGNvZGV3b3JkT2Zmc2V0ICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uY29kZXdvcmRPZmZzZXQ7Ci0gIHBTdGEgICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YTsKKyAgaU5vZGUgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pTm9kZTsKKyAgcENudFNpZ24gPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wQ250U2lnbjsKKyAgcFJlc3VsdEJhc2UgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wUmVzdWx0QmFzZTsKKyAgaVJlc3VsdFBvaW50ZXIgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pUmVzdWx0UG9pbnRlcjsKKyAgY29kZXdvcmRPZmZzZXQgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5jb2Rld29yZE9mZnNldDsKKyAgcFN0YSA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGE7CiAKLSAgdHJlZU5vZGUgICAgICAgICAgICAgICAgPSBpTm9kZVtjb2Rld29yZE9mZnNldF07Ci0gIHBDdXJyZW50VHJlZSAgICAgICAgICAgID0gYUh1ZmZUYWJsZVtFU0NBUEVfQ09ERUJPT0tdOworICB0cmVlTm9kZSA9IGlOb2RlW2NvZGV3b3JkT2Zmc2V0XTsKKyAgcEN1cnJlbnRUcmVlID0gYUh1ZmZUYWJsZVtFU0NBUEVfQ09ERUJPT0tdOwogCi0KLSAgZm9yICggOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA+IDAgOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxICkgewotCi0gICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbSggYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcExlZnRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKKyAgZm9yICg7IHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdID4gMDsKKyAgICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxKSB7CisgICAgY2FycnlCaXQgPSBIY3JHZXRBQml0RnJvbUJpdHN0cmVhbShicywgJnBMZWZ0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJpZ2h0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZERpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRGlyZWN0aW9uKTsKIAogICAgIC8qIG1ha2UgYSBzdGVwIGluIHRyZWUgKi8KLSAgICBDYXJyeUJpdFRvQnJhbmNoVmFsdWUoY2FycnlCaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmYnJhbmNoVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZicmFuY2hOb2RlKTsKKyAgICBDYXJyeUJpdFRvQnJhbmNoVmFsdWUoY2FycnlCaXQsIHRyZWVOb2RlLCAmYnJhbmNoVmFsdWUsICZicmFuY2hOb2RlKTsKIAotICAgIC8qIGlmIGVuZCBvZiBicmFuY2ggcmVhY2hlZCB3cml0ZSBvdXQgbGluZXMgYW5kIGNvdW50IGJpdHMgbmVlZGVkIGZvciBzaWduLCBvdGhlcndpc2Ugc3RvcmUgbm9kZSBpbiBjb2Rld29yZCBzaWRlaW5mbyAqLwotICAgIGlmICgoYnJhbmNoTm9kZSAmIFRFU1RfQklUXzEwKSA9PSBURVNUX0JJVF8xMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXN0IGJpdCAxMCA7IGlmIHNldCBib2R5IGNvbXBsZXRlICovCisgICAgLyogaWYgZW5kIG9mIGJyYW5jaCByZWFjaGVkIHdyaXRlIG91dCBsaW5lcyBhbmQgY291bnQgYml0cyBuZWVkZWQgZm9yIHNpZ24sCisgICAgICogb3RoZXJ3aXNlIHN0b3JlIG5vZGUgaW4gY29kZXdvcmQgc2lkZWluZm8gKi8KKyAgICBpZiAoKGJyYW5jaE5vZGUgJiBURVNUX0JJVF8xMCkgPT0KKyAgICAgICAgVEVTVF9CSVRfMTApIHsgLyogdGVzdCBiaXQgMTAgOyBpZiBzZXQgYm9keSBjb21wbGV0ZSAqLwogCiAgICAgICAvKiBib2R5IGNvbXBsZXRlbHkgZGVjb2RlZDsgYnJhbmNoVmFsdWUgaXMgdmFsaWQgKi8KLSAgICAgIC8qIHNldCBwUXVhbnRWb2wgdG8gZmlyc3QgKG9mIHR3byBvciBmb3VyKSBxdWFudGl6ZWQgc3BlY3RyYWwgY29lZmZpY2llbnRzICovCi0gICAgICBwUXVhbnRWYWxCYXNlID0gYVF1YW50VGFibGVbRVNDQVBFX0NPREVCT09LXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGJhc2UgYWRkcmVzcyBvZiBxdWFudGl6ZWQgdmFsdWVzIGJlbG9uZ2luZyB0byBjdXJyZW50IGNvZGVib29rICovCi0gICAgICBwUXVhbnRWYWwgPSBwUXVhbnRWYWxCYXNlICsgYnJhbmNoVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IHBvaW50ZXIgdG8gZmlyc3QgdmFsaWQgbGluZSBbb2YgMiBvciA0IHF1YW50aXplZCB2YWx1ZXNdICovCisgICAgICAvKiBzZXQgcFF1YW50Vm9sIHRvIGZpcnN0IChvZiB0d28gb3IgZm91cikgcXVhbnRpemVkIHNwZWN0cmFsIGNvZWZmaWNpZW50cworICAgICAgICovCisgICAgICBwUXVhbnRWYWxCYXNlID0gYVF1YW50VGFibGVbRVNDQVBFX0NPREVCT09LXTsgLyogZ2V0IGJhc2UgYWRkcmVzcyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXplZCB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWxvbmdpbmcgdG8gY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVib29rICovCisgICAgICBwUXVhbnRWYWwgPSBwUXVhbnRWYWxCYXNlICsgYnJhbmNoVmFsdWU7IC8qIHNldCBwb2ludGVyIHRvIGZpcnN0IHZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgW29mIDIgb3IgNCBxdWFudGl6ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzXSAqLwogCi0gICAgICAvKiBtYWtlIGJhY2t1cCBmcm9tIG9yaWdpbmFsIHJlc3VsdFBvaW50ZXIgaW4gbm9kZSBzdG9yYWdlIGZvciBzdGF0ZSBCT0RZX1NJR05fRVNDX19TSUdOICovCisgICAgICAvKiBtYWtlIGJhY2t1cCBmcm9tIG9yaWdpbmFsIHJlc3VsdFBvaW50ZXIgaW4gbm9kZSBzdG9yYWdlIGZvciBzdGF0ZQorICAgICAgICogQk9EWV9TSUdOX0VTQ19fU0lHTiAqLwogICAgICAgaU5vZGVbY29kZXdvcmRPZmZzZXRdID0gaVJlc3VsdFBvaW50ZXJbY29kZXdvcmRPZmZzZXRdOwogCiAgICAgICAvKiBnZXQgcG9zaXRpb24gb2YgZmlyc3QgbGluZSBmb3Igd3JpdGluZyByZXN1bHQgKi8KICAgICAgIGlRU0MgPSBpUmVzdWx0UG9pbnRlcltjb2Rld29yZE9mZnNldF07CiAKLSAgICAgIC8qIGNvZGV3b3JkIGRlY29kaW5nIHJlc3VsdCBpcyB3cml0dGVuIG91dCBoZXJlOiBXcml0ZSBvdXQgMiBvciA0IHF1YW50aXplZCBzcGVjdHJhbCB2YWx1ZXMgd2l0aCBwcm9iYWJseSAqLwotICAgICAgLyogd3Jvbmcgc2lnbiBhbmQgY291bnQgbnVtYmVyIG9mIHZhbHVlcyB3aGljaCBhcmUgZGlmZmVyZW50IGZyb20gemVybyBmb3Igc2lnbiBiaXQgZGVjb2RpbmcgW3doaWNoIGhhcHBlbnMgaW4gbmV4dCBzdGF0ZV0gKi8KKyAgICAgIC8qIGNvZGV3b3JkIGRlY29kaW5nIHJlc3VsdCBpcyB3cml0dGVuIG91dCBoZXJlOiBXcml0ZSBvdXQgMiBvciA0CisgICAgICAgKiBxdWFudGl6ZWQgc3BlY3RyYWwgdmFsdWVzIHdpdGggcHJvYmFibHkgKi8KKyAgICAgIC8qIHdyb25nIHNpZ24gYW5kIGNvdW50IG51bWJlciBvZiB2YWx1ZXMgd2hpY2ggYXJlIGRpZmZlcmVudCBmcm9tIHplcm8gZm9yCisgICAgICAgKiBzaWduIGJpdCBkZWNvZGluZyBbd2hpY2ggaGFwcGVucyBpbiBuZXh0IHN0YXRlXSAqLwogICAgICAgY250U2lnbiA9IDA7CiAKLSAgICAgIGZvciAoIGRpbUNudHIgPSBESU1FTlNJT05fT0ZfRVNDQVBFX0NPREVCT09LOyBkaW1DbnRyICE9IDA7IGRpbUNudHItLSApIHsKLSAgICAgICAgcFJlc3VsdEJhc2VbaVFTQysrXSA9IChGSVhQX0RCTCkqcFF1YW50VmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIHF1YW50LiBzcGVjLiBjb2VmLiBpbnRvIHNwZWN0cnVtICovCi0gICAgICAgIGlmICggKnBRdWFudFZhbCsrICE9IDAgKSB7CisgICAgICBmb3IgKGRpbUNudHIgPSBESU1FTlNJT05fT0ZfRVNDQVBFX0NPREVCT09LOyBkaW1DbnRyICE9IDA7IGRpbUNudHItLSkgeworICAgICAgICBwUmVzdWx0QmFzZVtpUVNDKytdID0KKyAgICAgICAgICAgIChGSVhQX0RCTCkqcFF1YW50VmFsOyAvKiB3cml0ZSBxdWFudC4gc3BlYy4gY29lZi4gaW50byBzcGVjdHJ1bSAqLworICAgICAgICBpZiAoKnBRdWFudFZhbCsrICE9IDApIHsKICAgICAgICAgICBjbnRTaWduICs9IDE7CiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgaWYgKCBjbnRTaWduID09IDAgKSB7Ci0gICAgICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KKyAgICAgIGlmIChjbnRTaWduID09IDApIHsKKyAgICAgICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoCisgICAgICAgICAgICAmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksIHNlZ21lbnRPZmZzZXQsCisgICAgICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZCk7IC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZCBzd2l0Y2ggb2ZmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWFjaGluZSAqLwogICAgICAgICAvKiBjb2Rld29yZCBkZWNvZGVkICovCi0gICAgICB9Ci0gICAgICBlbHNlIHsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIHdyaXRlIHNpZ24gY291bnQgcmVzdWx0IGludG8gY29kZXdvcmRzaWRlaW5mbyBvZiBjdXJyZW50IGNvZGV3b3JkICovCiAgICAgICAgIHBDbnRTaWduW2NvZGV3b3JkT2Zmc2V0XSA9IGNudFNpZ247Ci0gICAgICAgIHBTdGFbY29kZXdvcmRPZmZzZXRdID0gQk9EWV9TSUdOX0VTQ19fU0lHTjsgICAgICAgICAgICAgICAgIC8qIGNoYW5nZSBzdGF0ZSAqLwotICAgICAgICBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUgPSBhU3RhdGVDb25zdGFudDJTdGF0ZVtwU3RhW2NvZGV3b3JkT2Zmc2V0XV07ICAgICAgICAgICAvKiBnZXQgc3RhdGUgZnJvbSBzZXBhcmF0ZSBhcnJheSBvZiBjdy1zaWRlaW5mbyAqLworICAgICAgICBwU3RhW2NvZGV3b3JkT2Zmc2V0XSA9IEJPRFlfU0lHTl9FU0NfX1NJR047IC8qIGNoYW5nZSBzdGF0ZSAqLworICAgICAgICBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUgPQorICAgICAgICAgICAgYVN0YXRlQ29uc3RhbnQyU3RhdGVbcFN0YVtjb2Rld29yZE9mZnNldF1dOyAvKiBnZXQgc3RhdGUgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0ZSBhcnJheSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdy1zaWRlaW5mbyAqLwogICAgICAgfQotICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgbGFzdCByZWluaXRpYWx6YXRpb24gb2YgZm9yIGxvb3AgY291bnRlciAoc2VlIGFib3ZlKSBpcyBkb25lIGhlcmUgKi8KLSAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGJyYW5jaCBpbiB0cmVlIHJlYWNoZWQgIGkuZS4gYSB3aG9sZSBub25QQ1ctQm9keSBpcyBkZWNvZGVkICovCi0gICAgfQotICAgIGVsc2UgeyAvKiBib2R5IGlzIG5vdCBkZWNvZGVkIGNvbXBsZXRlbHk6ICovCi0gICAgICAvKiB1cGRhdGUgdHJlZU5vZGUgZm9yIGZ1cnRoZXIgc3RlcCBpbiBkZWNvZGluZyB0cmVlIGFuZCBzdG9yZSB1cGRhdGVkIHRyZWVOb2RlIGJlY2F1c2UgbWF5YmUgbm8gbW9yZSBiaXRzIGxlZnQgaW4gc2VnbWVudCAqLworICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMTsgLyogdGhlIGxhc3QgcmVpbml0aWFsemF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBmb3IgbG9vcCBjb3VudGVyIChzZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlKSBpcyBkb25lIGhlcmUgKi8KKyAgICAgIGJyZWFrOyAvKiBlbmQgb2YgYnJhbmNoIGluIHRyZWUgcmVhY2hlZCAgaS5lLiBhIHdob2xlIG5vblBDVy1Cb2R5IGlzCisgICAgICAgICAgICAgICAgZGVjb2RlZCAqLworICAgIH0gZWxzZSB7IC8qIGJvZHkgaXMgbm90IGRlY29kZWQgY29tcGxldGVseTogKi8KKyAgICAgIC8qIHVwZGF0ZSB0cmVlTm9kZSBmb3IgZnVydGhlciBzdGVwIGluIGRlY29kaW5nIHRyZWUgYW5kIHN0b3JlIHVwZGF0ZWQKKyAgICAgICAqIHRyZWVOb2RlIGJlY2F1c2UgbWF5YmUgbm8gbW9yZSBiaXRzIGxlZnQgaW4gc2VnbWVudCAqLwogICAgICAgdHJlZU5vZGUgPSAqKHBDdXJyZW50VHJlZSArIGJyYW5jaFZhbHVlKTsKICAgICAgIGlOb2RlW2NvZGV3b3JkT2Zmc2V0XSA9IHRyZWVOb2RlOwogICAgIH0KICAgfQogCi0gIGlmICggcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPD0gMCApIHsKLSAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZCBzd2l0Y2ggb2ZmIHN0YXRlbWFjaGluZSAqLworICBpZiAocFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPD0gMCkgeworICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwgc2VnbWVudE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkKTsgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCiAKLSNpZiBTVEFURV9NQUNISU5FX0VSUk9SX0NIRUNLCi0gICAgaWYgKCBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8IDAgKSB7CisgICAgaWYgKHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDwgMCkgewogICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gU1RBVEVfRVJST1JfQk9EWV9TSUdOX0VTQ19fQk9EWTsKLSAgICAgIHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfU0lHTl9FU0NfX0JPRFk7CisgICAgICByZXR1cm4gQk9EWV9TSUdOX0VTQ19fQk9EWTsKICAgICB9Ci0jZW5kaWYKICAgfQogCiAgIHJldHVybiBTVE9QX1RISVNfU1RBVEU7CiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246IFRoaXMgc3RhdGUgZGVjb2RlcyB0aGUgc2lnbiBiaXRzLCBpZiBhIGNvZGV3b3JkIG9mIGNvZGVib29rIDExIG5lZWRzIHNvbWUuCi0gICAgICAgICAgICAgICAgICBBIGZsYWcgbmFtZWQgJ2ZsYWdCJyBpbiBjb2Rld29yZCBzaWRlaW5mbyBpcyBzZXQsIGlmIHRoZSBzZWNvbmQgbGluZSBvZgotICAgICAgICAgICAgICAgICAgcXVhbnRpemVkIHNwZWN0cmFsIHZhbHVlcyBpcyAxNi4gVGhlICdmbGFnQicgaXMgdXNlZCBpbiBjYXNlIG9mIGRlY29kaW5nCi0gICAgICAgICAgICAgICAgICBvZiBhIGVzY2FwZSBzZXF1ZW5jZSBpcyBuZWNlc3NhcnkgYXMgZmFyIGFzIHRoZSBzZWNvbmQgbGluZSBpcyBjb25jZXJuZWQuCisgICAgIGRlc2NyaXB0aW9uOiBUaGlzIHN0YXRlIGRlY29kZXMgdGhlIHNpZ24gYml0cywgaWYgYSBjb2Rld29yZCBvZiBjb2RlYm9vayAxMQorbmVlZHMgc29tZS4gQSBmbGFnIG5hbWVkICdmbGFnQicgaW4gY29kZXdvcmQgc2lkZWluZm8gaXMgc2V0LCBpZiB0aGUgc2Vjb25kIGxpbmUKK29mIHF1YW50aXplZCBzcGVjdHJhbCB2YWx1ZXMgaXMgMTYuIFRoZSAnZmxhZ0InIGlzIHVzZWQgaW4gY2FzZSBvZiBkZWNvZGluZyBvZiBhCitlc2NhcGUgc2VxdWVuY2UgaXMgbmVjZXNzYXJ5IGFzIGZhciBhcyB0aGUgc2Vjb25kIGxpbmUgaXMgY29uY2VybmVkLgogCi0gICAgICAgICAgICAgICAgICBJZiBvbmx5IHRoZSBmaXJzdCBsaW5lIG5lZWRzIGFuIGVzY2FwZSBzZXF1ZW5jZSwgdGhlIGZsYWdCIGlzIGNsZWFyZWQuCi0gICAgICAgICAgICAgICAgICBJZiBvbmx5IHRoZSBzZWNvbmQgbGluZSBuZWVkcyBhbiBlc2NhcGUgc2VxdWVuY2UsIHRoZSBmbGFnQiBpcyBub3QgdXNlZC4KKyAgICAgICAgICAgICAgICAgIElmIG9ubHkgdGhlIGZpcnN0IGxpbmUgbmVlZHMgYW4gZXNjYXBlIHNlcXVlbmNlLCB0aGUgZmxhZ0IgaXMKK2NsZWFyZWQuIElmIG9ubHkgdGhlIHNlY29uZCBsaW5lIG5lZWRzIGFuIGVzY2FwZSBzZXF1ZW5jZSwgdGhlIGZsYWdCIGlzIG5vdAordXNlZC4KIAotICAgICAgICAgICAgICAgICAgRm9yIHN0b3Jpbmcgc2lkZWluZm8gaW4gY2FzZSBvZiBlc2NhcGUgc2VxdWVuY2UgZGVjb2Rpbmcgb25lIHNpbmdsZSB3b3JkCi0gICAgICAgICAgICAgICAgICBjYW4gYmUgdXNlZCBmb3IgYm90aCBlc2NhcGUgc2VxdWVuY2VzIGJlY2F1c2UgdGhleSBhcmUgZGVjb2RlZCBub3QgYXQgdGhlCi0gICAgICAgICAgICAgICAgICBzYW1lIHRpbWU6CisgICAgICAgICAgICAgICAgICBGb3Igc3RvcmluZyBzaWRlaW5mbyBpbiBjYXNlIG9mIGVzY2FwZSBzZXF1ZW5jZSBkZWNvZGluZyBvbmUKK3NpbmdsZSB3b3JkIGNhbiBiZSB1c2VkIGZvciBib3RoIGVzY2FwZSBzZXF1ZW5jZXMgYmVjYXVzZSB0aGV5IGFyZSBkZWNvZGVkIG5vdAorYXQgdGhlIHNhbWUgdGltZToKIAogCi0gICAgICAgICAgICAgICAgICBiaXQgMjMgMjIgMjEgMjAgMTkgMTggMTcgMTYgMTUgMTQgMTMgMTIgMTEgMTAgIDkgIDggIDcgIDYgIDUgIDQgIDMgIDIgIDEgIDAKLSAgICAgICAgICAgICAgICAgICAgICA9PT09PSA9PSA9PSA9PT09PT09PT09PSA9PT09PT09PT09PSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgICAgIF4gICAgICBeICBeICAgICAgICAgXiAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgIF4KLSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgfCAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgIHJlcy4gZmxhZ0EgIGZsYWdCICBlc2NhcGVQcmVmaXhVcCAgZXNjYXBlUHJlZml4RG93biAgZXNjYXBlV29yZAorICAgICAgICAgICAgICAgICAgYml0IDIzIDIyIDIxIDIwIDE5IDE4IDE3IDE2IDE1IDE0IDEzIDEyIDExIDEwICA5ICA4ICA3ICA2ICA1Cis0ICAzICAyICAxICAwCisgICAgICAgICAgICAgICAgICAgICAgPT09PT0gPT0gPT0gPT09PT09PT09PT0gPT09PT09PT09PT0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IF4gICAgICBeICBeICAgICAgICAgXiAgICAgICAgICAgIF4KK14gfCAgICAgIHwgIHwgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCByZXMuIGZsYWdBICBmbGFnQgorZXNjYXBlUHJlZml4VXAgIGVzY2FwZVByZWZpeERvd24gIGVzY2FwZVdvcmQKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgb3V0cHV0OiAgIFR3byBsaW5lcyB3aXRoIGNvcnJlY3Qgc2lnbi4gSWYgb25lIG9yIHR3byB2YWx1ZXMgaXMvYXJlIDE2LCB0aGUgbGluZXMgYXJlCi0gICAgICAgICAgICAgICAgICBub3QgdmFsaWQsIG90aGVyd2lzZSB0aGV5IGFyZS4KKyAgICAgICAgb3V0cHV0OiAgIFR3byBsaW5lcyB3aXRoIGNvcnJlY3Qgc2lnbi4gSWYgb25lIG9yIHR3byB2YWx1ZXMgaXMvYXJlIDE2LAordGhlIGxpbmVzIGFyZSBub3QgdmFsaWQsIG90aGVyd2lzZSB0aGV5IGFyZS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIHJldHVybjogICAwCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotVUlOVCBIY3JfU3RhdGVfQk9EWV9TSUdOX0VTQ19fU0lHTihIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgdm9pZCAqcHRyKQoteworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitVSU5UIEhjcl9TdGF0ZV9CT0RZX1NJR05fRVNDX19TSUdOKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCB2b2lkICpwdHIpIHsKICAgSF9IQ1JfSU5GTyBwSGNyID0gKEhfSENSX0lORk8pcHRyOwotICBTQ0hBUiAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OwotICBVU0hPUlQgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQ7Ci0gIFVTSE9SVCAgICAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQ7Ci0gIFVDSEFSICAgICAgcmVhZERpcmVjdGlvbjsKLSAgVUlOVCAgICAgICpwU2VnbWVudEJpdGZpZWxkOwotICBVSU5UICAgICAgKnBDb2Rld29yZEJpdGZpZWxkOwotICBVSU5UICAgICAgIHNlZ21lbnRPZmZzZXQ7CisgIFNDSEFSICpwUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgSU5UICpwTGVmdFN0YXJ0T2ZTZWdtZW50OworICBJTlQgKnBSaWdodFN0YXJ0T2ZTZWdtZW50OworICBVQ0hBUiByZWFkRGlyZWN0aW9uOworICBVSU5UICpwU2VnbWVudEJpdGZpZWxkOworICBVSU5UICpwQ29kZXdvcmRCaXRmaWVsZDsKKyAgVUlOVCBzZWdtZW50T2Zmc2V0OwogCi0gIFVJTlQgICAgICAqaU5vZGU7Ci0gIFVDSEFSICAgICAqcENudFNpZ247Ci0gIEZJWFBfREJMICAqcFJlc3VsdEJhc2U7Ci0gIFVTSE9SVCAgICAqaVJlc3VsdFBvaW50ZXI7Ci0gIFVJTlQgICAgICAqcEVzY2FwZVNlcXVlbmNlSW5mbzsKLSAgVUlOVCAgICAgICBjb2Rld29yZE9mZnNldDsKKyAgVUlOVCAqaU5vZGU7CisgIFVDSEFSICpwQ250U2lnbjsKKyAgRklYUF9EQkwgKnBSZXN1bHRCYXNlOworICBVU0hPUlQgKmlSZXN1bHRQb2ludGVyOworICBVSU5UICpwRXNjYXBlU2VxdWVuY2VJbmZvOworICBVSU5UIGNvZGV3b3JkT2Zmc2V0OwogCi0gIFVJTlQgICAgICAgaVFTQzsKLSAgVUNIQVIgICAgICBjbnRTaWduOwotICBVSU5UICAgICAgIGZsYWdBOwotICBVSU5UICAgICAgIGZsYWdCOwotICBVSU5UICAgICAgIGZsYWdzOwotICBVQ0hBUiAgICAgIGNhcnJ5Qml0OwotICBTQ0hBUiAgICAgKnBTdGE7CisgIFVJTlQgaVFTQzsKKyAgVUNIQVIgY250U2lnbjsKKyAgVUlOVCBmbGFnQTsKKyAgVUlOVCBmbGFnQjsKKyAgVUlOVCBmbGFnczsKKyAgVUNIQVIgY2FycnlCaXQ7CisgIFNDSEFSICpwU3RhOwogCiAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7Ci0gIHBMZWZ0U3RhcnRPZlNlZ21lbnQgICAgID0gcEhjci0+c2VnbWVudEluZm8ucExlZnRTdGFydE9mU2VnbWVudDsKLSAgcFJpZ2h0U3RhcnRPZlNlZ21lbnQgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wUmlnaHRTdGFydE9mU2VnbWVudDsKLSAgcmVhZERpcmVjdGlvbiAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5yZWFkRGlyZWN0aW9uOwotICBwU2VnbWVudEJpdGZpZWxkICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBTZWdtZW50Qml0ZmllbGQ7Ci0gIHBDb2Rld29yZEJpdGZpZWxkICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucENvZGV3b3JkQml0ZmllbGQ7Ci0gIHNlZ21lbnRPZmZzZXQgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8uc2VnbWVudE9mZnNldDsKKyAgcExlZnRTdGFydE9mU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBMZWZ0U3RhcnRPZlNlZ21lbnQ7CisgIHBSaWdodFN0YXJ0T2ZTZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucFJpZ2h0U3RhcnRPZlNlZ21lbnQ7CisgIHJlYWREaXJlY3Rpb24gPSBwSGNyLT5zZWdtZW50SW5mby5yZWFkRGlyZWN0aW9uOworICBwU2VnbWVudEJpdGZpZWxkID0gcEhjci0+c2VnbWVudEluZm8ucFNlZ21lbnRCaXRmaWVsZDsKKyAgcENvZGV3b3JkQml0ZmllbGQgPSBwSGNyLT5zZWdtZW50SW5mby5wQ29kZXdvcmRCaXRmaWVsZDsKKyAgc2VnbWVudE9mZnNldCA9IHBIY3ItPnNlZ21lbnRJbmZvLnNlZ21lbnRPZmZzZXQ7CiAKLSAgaU5vZGUgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pTm9kZTsKLSAgcENudFNpZ24gICAgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wQ250U2lnbjsKLSAgcFJlc3VsdEJhc2UgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wUmVzdWx0QmFzZTsKLSAgaVJlc3VsdFBvaW50ZXIgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pUmVzdWx0UG9pbnRlcjsKLSAgcEVzY2FwZVNlcXVlbmNlSW5mbyAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wRXNjYXBlU2VxdWVuY2VJbmZvOwotICBjb2Rld29yZE9mZnNldCAgICAgICAgICA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLmNvZGV3b3JkT2Zmc2V0OwotICBwU3RhICAgICAgICAgICAgICAgICAgICA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGE7CisgIGlOb2RlID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaU5vZGU7CisgIHBDbnRTaWduID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucENudFNpZ247CisgIHBSZXN1bHRCYXNlID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFJlc3VsdEJhc2U7CisgIGlSZXN1bHRQb2ludGVyID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaVJlc3VsdFBvaW50ZXI7CisgIHBFc2NhcGVTZXF1ZW5jZUluZm8gPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wRXNjYXBlU2VxdWVuY2VJbmZvOworICBjb2Rld29yZE9mZnNldCA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLmNvZGV3b3JkT2Zmc2V0OworICBwU3RhID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YTsKIAotICBpUVNDICAgICAgICAgICAgICAgICAgICA9IGlSZXN1bHRQb2ludGVyW2NvZGV3b3JkT2Zmc2V0XTsKLSAgY250U2lnbiAgICAgICAgICAgICAgICAgPSBwQ250U2lnbltjb2Rld29yZE9mZnNldF07Ci0KKyAgaVFTQyA9IGlSZXN1bHRQb2ludGVyW2NvZGV3b3JkT2Zmc2V0XTsKKyAgY250U2lnbiA9IHBDbnRTaWduW2NvZGV3b3JkT2Zmc2V0XTsKIAogICAvKiBsb29wIGZvciBzaWduIGJpdCBkZWNvZGluZyAqLwotICBmb3IgKCA7IHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdID4gMCA7IHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDEgKSB7Ci0KLSAgICBjYXJyeUJpdCA9IEhjckdldEFCaXRGcm9tQml0c3RyZWFtKCBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwTGVmdFN0YXJ0T2ZTZWdtZW50W3NlZ21lbnRPZmZzZXRdLAorICBmb3IgKDsgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPiAwOworICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDEpIHsKKyAgICBjYXJyeUJpdCA9IEhjckdldEFCaXRGcm9tQml0c3RyZWFtKGJzLCAmcExlZnRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmlnaHRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWREaXJlY3Rpb24pOwogCiAgICAgLyogZGVjcmVtZW50IHNpZ24gY291bnRlciBiZWNhdXNlIG9uZSBzaWduIGJpdCBoYXMgYmVlbiByZWFkICovCiAgICAgY250U2lnbiAtPSAxOwogICAgIHBDbnRTaWduW2NvZGV3b3JkT2Zmc2V0XSA9IGNudFNpZ247CiAKLSAgICAvKiBnZXQgYSBxdWFudGl6ZWQgc3BlY3RyYWwgdmFsdWUgKHdoaWNoIHdhcyBkZWNvZGVkIGluIHByZXZpb3VzIHN0YXRlKSB3aGljaCBpcyBub3QgemVyby4gW1RoaXMgdmFsdWUgd2lsbCBnZXQgYSBzaWduXSAqLwotICAgIHdoaWxlICggcFJlc3VsdEJhc2VbaVFTQ10gPT0gKEZJWFBfREJMKTAgKSB7Ci0gICAgICBpUVNDKys7CisgICAgLyogZ2V0IGEgcXVhbnRpemVkIHNwZWN0cmFsIHZhbHVlICh3aGljaCB3YXMgZGVjb2RlZCBpbiBwcmV2aW91cyBzdGF0ZSkKKyAgICAgKiB3aGljaCBpcyBub3QgemVyby4gW1RoaXMgdmFsdWUgd2lsbCBnZXQgYSBzaWduXSAqLworICAgIHdoaWxlIChwUmVzdWx0QmFzZVtpUVNDXSA9PSAoRklYUF9EQkwpMCkgeworICAgICAgaWYgKCsraVFTQyA+PSAxMDI0KSB7CisgICAgICAgIHJldHVybiBCT0RZX1NJR05fRVNDX19TSUdOOworICAgICAgfQogICAgIH0KICAgICBpUmVzdWx0UG9pbnRlcltjb2Rld29yZE9mZnNldF0gPSBpUVNDOwogCi0gICAgLyogcHV0IG5lZ2F0aXZlIHNpZ24gdG9nZXRoZXIgd2l0aCBxdWFudGl6ZWQgc3BlY3RyYWwgdmFsdWU7IGlmIGNhcnJ5Qml0IGlzIHplcm8sIHRoZSBzaWduIGlzIG9rIGFscmVhZHk7IG5vIHdyaXRlIG9wZXJhdGlvbiBuZWNlc3NhcnkgaW4gdGhpcyBjYXNlICovCi0gICAgaWYgKCBjYXJyeUJpdCAhPSAwICkgewotICAgICAgcFJlc3VsdEJhc2VbaVFTQ10gPSAtIHBSZXN1bHRCYXNlW2lRU0NdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYXJyeUJpdCA9IDEgLS0+IG1pbnVzICovCisgICAgLyogcHV0IG5lZ2F0aXZlIHNpZ24gdG9nZXRoZXIgd2l0aCBxdWFudGl6ZWQgc3BlY3RyYWwgdmFsdWU7IGlmIGNhcnJ5Qml0IGlzCisgICAgICogemVybywgdGhlIHNpZ24gaXMgb2sgYWxyZWFkeTsgbm8gd3JpdGUgb3BlcmF0aW9uIG5lY2Vzc2FyeSBpbiB0aGlzIGNhc2UKKyAgICAgKi8KKyAgICBpZiAoY2FycnlCaXQgIT0gMCkgeworICAgICAgcFJlc3VsdEJhc2VbaVFTQ10gPSAtcFJlc3VsdEJhc2VbaVFTQ107IC8qIGNhcnJ5Qml0ID0gMSAtLT4gbWludXMgKi8KICAgICB9Ci0gICAgaVFTQysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBpbmRleCB0byBuZXh0IChtYXliZSB2YWxpZCkgdmFsdWUgKi8KKyAgICBpUVNDKys7IC8qIHVwZGF0ZSBpbmRleCB0byBuZXh0IChtYXliZSB2YWxpZCkgdmFsdWUgKi8KICAgICBpUmVzdWx0UG9pbnRlcltjb2Rld29yZE9mZnNldF0gPSBpUVNDOwogCi0gICAgaWYgKCBjbnRTaWduID09IDAgKSB7CisgICAgaWYgKGNudFNpZ24gPT0gMCkgewogICAgICAgLyogYWxsIHNpZ24gYml0cyBhcmUgZGVjb2RlZCBub3cgKi8KLSAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGFzdCByZWluaXRpYWx6YXRpb24gb2YgZm9yIGxvb3AgY291bnRlciAoc2VlIGFib3ZlKSBpcyBkb25lIGhlcmUgKi8KKyAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDE7IC8qIGxhc3QgcmVpbml0aWFsemF0aW9uIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbG9vcCBjb3VudGVyIChzZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlKSBpcyBkb25lIGhlcmUgKi8KIAotICAgICAgLyogY2hlY2sgZGVjb2RlZCB2YWx1ZXMgaWYgY29kZXdvcmQgaXMgZGVjb2RlZDogQ2hlY2sgaWYgb25lIG9yIHR3byBlc2NhcGUgc2VxdWVuY2VzIDE2IGZvbGxvdyAqLworICAgICAgLyogY2hlY2sgZGVjb2RlZCB2YWx1ZXMgaWYgY29kZXdvcmQgaXMgZGVjb2RlZDogQ2hlY2sgaWYgb25lIG9yIHR3byBlc2NhcGUKKyAgICAgICAqIHNlcXVlbmNlcyAxNiBmb2xsb3cgKi8KIAogICAgICAgLyogc3RlcCAwICovCi0gICAgICAvKiByZXN0b3JlIHBvaW50ZXIgdG8gZmlyc3QgZGVjb2RlZCBxdWFudGl6ZWQgdmFsdWUgWyA9IG9yaWdpbmFsIHBSZXN1bHRQb2ludHJdIGZyb20gaW5kZXggaU5vZGUgcHJlcGFyZWQgaW4gU3RhdGVfQk9EWV9TSUdOX0VTQ19fQk9EWSAqLworICAgICAgLyogcmVzdG9yZSBwb2ludGVyIHRvIGZpcnN0IGRlY29kZWQgcXVhbnRpemVkIHZhbHVlIFsgPSBvcmlnaW5hbAorICAgICAgICogcFJlc3VsdFBvaW50cl0gZnJvbSBpbmRleCBpTm9kZSBwcmVwYXJlZCBpbiBTdGF0ZV9CT0RZX1NJR05fRVNDX19CT0RZCisgICAgICAgKi8KICAgICAgIGlRU0MgPSBpTm9kZVtjb2Rld29yZE9mZnNldF07CiAKICAgICAgIC8qIHN0ZXAgMSAqLwogICAgICAgLyogdGVzdCBmaXJzdCB2YWx1ZSBpZiBlc2NhcGUgc2VxdWVuY2UgZm9sbG93cyAqLwotICAgICAgZmxhZ0EgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgZmlyc3QgcG9zc2libGUgZXNjYXBlIHNlcXVlbmNlICovCi0gICAgICBpZiAoIGZpeHBfYWJzKHBSZXN1bHRCYXNlW2lRU0MrK10pID09IChGSVhQX0RCTClFU0NBUEVfVkFMVUUgKSB7CisgICAgICBmbGFnQSA9IDA7IC8qIGZvciBmaXJzdCBwb3NzaWJsZSBlc2NhcGUgc2VxdWVuY2UgKi8KKyAgICAgIGlmIChmaXhwX2FicyhwUmVzdWx0QmFzZVtpUVNDKytdKSA9PSAoRklYUF9EQkwpRVNDQVBFX1ZBTFVFKSB7CiAgICAgICAgIGZsYWdBID0gMTsKICAgICAgIH0KIAogICAgICAgLyogc3RlcCAyICovCiAgICAgICAvKiB0ZXN0IHNlY29uZCB2YWx1ZSBpZiBlc2NhcGUgc2VxdWVuY2UgZm9sbG93cyAqLwotICAgICAgZmxhZ0IgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3Igc2Vjb25kIHBvc3NpYmxlIGVzY2FwZSBzZXF1ZW5jZSAqLwotICAgICAgaWYgKCBmaXhwX2FicyhwUmVzdWx0QmFzZVtpUVNDXSkgPT0gKEZJWFBfREJMKUVTQ0FQRV9WQUxVRSApIHsKKyAgICAgIGZsYWdCID0gMDsgLyogZm9yIHNlY29uZCBwb3NzaWJsZSBlc2NhcGUgc2VxdWVuY2UgKi8KKyAgICAgIGlmIChmaXhwX2FicyhwUmVzdWx0QmFzZVtpUVNDXSkgPT0gKEZJWFBfREJMKUVTQ0FQRV9WQUxVRSkgewogICAgICAgICBmbGFnQiA9IDE7CiAgICAgICB9CiAKLQogICAgICAgLyogc3RlcCAzICovCiAgICAgICAvKiBldmFsdWF0ZSBmbGFnIHJlc3VsdCBhbmQgZ28gb24gaWYgbmVjZXNzYXJ5ICovCi0gICAgICBpZiAoICFmbGFnQSAmJiAhZmxhZ0IgKSB7Ci0gICAgICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCi0gICAgICB9Ci0gICAgICBlbHNlIHsKKyAgICAgIGlmICghZmxhZ0EgJiYgIWZsYWdCKSB7CisgICAgICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKAorICAgICAgICAgICAgJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLCBzZWdtZW50T2Zmc2V0LAorICAgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGQpOyAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQgc3dpdGNoIG9mZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1hY2hpbmUgKi8KKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIGF0IGxlYXN0IG9uZSBvZiB0d28gbGluZXMgaXMgMTYgKi8KLSAgICAgICAgLyogc3RvcmUgYm90aCBmbGFncyBhdCBjb3JyZWN0IHBvc2l0aW9ucyBpbiBub24gUENXIGNvZGV3b3JkIHNpZGVpbmZvIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICovCi0gICAgICAgIGZsYWdzID0gMDsKLSAgICAgICAgZmxhZ3MgPSAgIGZsYWdBIDw8IFBPU0lUSU9OX09GX0ZMQUdfQTsKKyAgICAgICAgLyogc3RvcmUgYm90aCBmbGFncyBhdCBjb3JyZWN0IHBvc2l0aW9ucyBpbiBub24gUENXIGNvZGV3b3JkIHNpZGVpbmZvCisgICAgICAgICAqIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICovCisgICAgICAgIGZsYWdzID0gZmxhZ0EgPDwgUE9TSVRJT05fT0ZfRkxBR19BOwogICAgICAgICBmbGFncyB8PSAoZmxhZ0IgPDwgUE9TSVRJT05fT0ZfRkxBR19CKTsKICAgICAgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gPSBmbGFnczsKIAotCiAgICAgICAgIC8qIHNldCBuZXh0IHN0YXRlICovCiAgICAgICAgIHBTdGFbY29kZXdvcmRPZmZzZXRdID0gQk9EWV9TSUdOX0VTQ19fRVNDX1BSRUZJWDsKLSAgICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlID0gYVN0YXRlQ29uc3RhbnQyU3RhdGVbcFN0YVtjb2Rld29yZE9mZnNldF1dOyAgICAgICAgICAgLyogZ2V0IHN0YXRlIGZyb20gc2VwYXJhdGUgYXJyYXkgb2YgY3ctc2lkZWluZm8gKi8KKyAgICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlID0KKyAgICAgICAgICAgIGFTdGF0ZUNvbnN0YW50MlN0YXRlW3BTdGFbY29kZXdvcmRPZmZzZXRdXTsgLyogZ2V0IHN0YXRlIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdGUgYXJyYXkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ctc2lkZWluZm8gKi8KIAogICAgICAgICAvKiBzZXQgcmVzdWx0IHBvaW50ZXIgdG8gdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHR3byBkZWNvZGVkIGxpbmVzICovCiAgICAgICAgIGlSZXN1bHRQb2ludGVyW2NvZGV3b3JkT2Zmc2V0XSA9IGlOb2RlW2NvZGV3b3JkT2Zmc2V0XTsKIAotICAgICAgICBpZiAoICFmbGFnQSAmJiBmbGFnQiApIHsKLSAgICAgICAgICAvKiB1cGRhdGUgcFJlc3VsdFBvaW50ciA9PT4gc3RhdGUgU3RhdF9CT0RZX1NJR05fRVNDX19FU0NfV09SRCB3cml0ZXMgdG8gY29ycmVjdCBwb3NpdGlvbi4gU2Vjb25kIHZhbHVlIGlzIHRoZSBvbmUgYW5kIG9ubHkgZXNjYXBlIHZhbHVlICovCisgICAgICAgIGlmICghZmxhZ0EgJiYgZmxhZ0IpIHsKKyAgICAgICAgICAvKiB1cGRhdGUgcFJlc3VsdFBvaW50ciA9PT4gc3RhdGUgU3RhdF9CT0RZX1NJR05fRVNDX19FU0NfV09SRCB3cml0ZXMKKyAgICAgICAgICAgKiB0byBjb3JyZWN0IHBvc2l0aW9uLiBTZWNvbmQgdmFsdWUgaXMgdGhlIG9uZSBhbmQgb25seSBlc2NhcGUgdmFsdWUKKyAgICAgICAgICAgKi8KICAgICAgICAgICBpUVNDID0gaVJlc3VsdFBvaW50ZXJbY29kZXdvcmRPZmZzZXRdOwogICAgICAgICAgIGlRU0MrKzsKICAgICAgICAgICBpUmVzdWx0UG9pbnRlcltjb2Rld29yZE9mZnNldF0gPSBpUVNDOwogICAgICAgICB9CiAKLSAgICAgIH0gICAgIC8qIGF0IGxlYXN0IG9uZSBvZiB0d28gbGluZXMgaXMgMTYgKi8KLSAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm9uUENXLUJvZHkgYXQgY2IgMTEgYW5kIGFjY29yZGluZyBzaWduIGJpdHMgYXJlIGRlY29kZWQgKi8KKyAgICAgIH0gICAgICAvKiBhdCBsZWFzdCBvbmUgb2YgdHdvIGxpbmVzIGlzIDE2ICovCisgICAgICBicmVhazsgLyogbm9uUENXLUJvZHkgYXQgY2IgMTEgYW5kIGFjY29yZGluZyBzaWduIGJpdHMgYXJlIGRlY29kZWQgKi8KIAogICAgIH0gLyogaWYgKCBjbnRTaWduID09IDAgKSAqLwotICB9IC8qIGxvb3Agb3ZlciByZW1haW5pbmcgQml0cyBpbiBzZWdtZW50ICovCisgIH0gICAvKiBsb29wIG92ZXIgcmVtYWluaW5nIEJpdHMgaW4gc2VnbWVudCAqLwogCi0gIGlmICggcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPD0gMCApIHsKLSAgICBDbGVhckJpdEZyb21CaXRmaWVsZCgmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCisgIGlmIChwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8PSAwKSB7CisgICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLCBzZWdtZW50T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWdtZW50Qml0ZmllbGQpOyAvKiBjbGVhciBhIGJpdCBpbiBiaXRmaWVsZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIG9mZiBzdGF0ZW1hY2hpbmUgKi8KIAotI2lmIFNUQVRFX01BQ0hJTkVfRVJST1JfQ0hFQ0sKLSAgICBpZiAoIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDwgMCApIHsKKyAgICBpZiAocFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPCAwKSB7CiAgICAgICBwSGNyLT5kZWNJbk91dC5lcnJvckxvZyB8PSBTVEFURV9FUlJPUl9CT0RZX1NJR05fRVNDX19TSUdOOwotICAgICAgcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9TSUdOX0VTQ19fU0lHTjsKKyAgICAgIHJldHVybiBCT0RZX1NJR05fRVNDX19TSUdOOwogICAgIH0KLSNlbmRpZgotCiAgIH0KICAgcmV0dXJuIFNUT1BfVEhJU19TVEFURTsKIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBkZXNjcmlwdGlvbjogRGVjb2RlIGVzY2FwZSBwcmVmaXggb2YgZmlyc3Qgb3Igc2Vjb25kIGVzY2FwZSBzZXF1ZW5jZS4gVGhlIGVzY2FwZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgIGNvbnNpc3RzIG9mIG9uZXMuIFRoZSBmb2xsb3dpbmcgemVybyBpcyBhbHNvIGRlY29kZWQgaGVyZS4KKyAgICAgZGVzY3JpcHRpb246IERlY29kZSBlc2NhcGUgcHJlZml4IG9mIGZpcnN0IG9yIHNlY29uZCBlc2NhcGUgc2VxdWVuY2UuIFRoZQorZXNjYXBlIHByZWZpeCBjb25zaXN0cyBvZiBvbmVzLiBUaGUgZm9sbG93aW5nIHplcm8gaXMgYWxzbyBkZWNvZGVkIGhlcmUuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBvdXRwdXQ6ICAgSWYgdGhlIHNpbmdsZSBzZXBhcmF0b3ItemVybyB3aGljaCBmb2xsb3dzIHRoZSBlc2NhcGUtcHJlZml4LW9uZXMgaXMgbm90IHlldCBkZWNvZGVkOgotICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgJ2VzY2FwZVByZWZpeFVwJyBpbiB3b3JkIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIGlzIHVwZGF0ZWQuCisgICAgICAgIG91dHB1dDogICBJZiB0aGUgc2luZ2xlIHNlcGFyYXRvci16ZXJvIHdoaWNoIGZvbGxvd3MgdGhlCitlc2NhcGUtcHJlZml4LW9uZXMgaXMgbm90IHlldCBkZWNvZGVkOiBUaGUgdmFsdWUgJ2VzY2FwZVByZWZpeFVwJyBpbiB3b3JkCitwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSBpcyB1cGRhdGVkLgogCi0gICAgICAgICAgICAgICAgICBJZiB0aGUgc2luZ2xlIHNlcGFyYXRvci16ZXJvIHdoaWNoIGZvbGxvd3MgdGhlIGVzY2FwZS1wcmVmaXgtb25lcyBpcyBkZWNvZGVkOgotICAgICAgICAgICAgICAgICAgICBUd28gdXBkYXRlZCB2YWx1ZXMgJ2VzY2FwZVByZWZpeFVwJyBhbmQgJ2VzY2FwZVByZWZpeERvd24nIGluIHdvcmQKLSAgICAgICAgICAgICAgICAgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0uIFRoaXMgU3RhdGUgaXMgZmluaXNoZWQuIFN3aXRjaCB0byBuZXh0IHN0YXRlLgorICAgICAgICAgICAgICAgICAgSWYgdGhlIHNpbmdsZSBzZXBhcmF0b3ItemVybyB3aGljaCBmb2xsb3dzIHRoZQorZXNjYXBlLXByZWZpeC1vbmVzIGlzIGRlY29kZWQ6IFR3byB1cGRhdGVkIHZhbHVlcyAnZXNjYXBlUHJlZml4VXAnIGFuZAorJ2VzY2FwZVByZWZpeERvd24nIGluIHdvcmQgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0uIFRoaXMgU3RhdGUgaXMKK2ZpbmlzaGVkLiBTd2l0Y2ggdG8gbmV4dCBzdGF0ZS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIHJldHVybjogICAwCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotVUlOVCBIY3JfU3RhdGVfQk9EWV9TSUdOX0VTQ19fRVNDX1BSRUZJWChIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgdm9pZCAqcHRyKQoteworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitVSU5UIEhjcl9TdGF0ZV9CT0RZX1NJR05fRVNDX19FU0NfUFJFRklYKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCB2b2lkICpwdHIpIHsKICAgSF9IQ1JfSU5GTyBwSGNyID0gKEhfSENSX0lORk8pcHRyOwotICBTQ0hBUiAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OwotICBVU0hPUlQgKnBMZWZ0U3RhcnRPZlNlZ21lbnQ7Ci0gIFVTSE9SVCAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQ7Ci0gIFVDSEFSICAgcmVhZERpcmVjdGlvbjsKLSAgVUlOVCAgICpwU2VnbWVudEJpdGZpZWxkOwotICBVSU5UICAgIHNlZ21lbnRPZmZzZXQ7Ci0gIFVJTlQgICAqcEVzY2FwZVNlcXVlbmNlSW5mbzsKLSAgVUlOVCAgICBjb2Rld29yZE9mZnNldDsKLSAgVUNIQVIgICBjYXJyeUJpdDsKLSAgVUlOVCAgICBlc2NhcGVQcmVmaXhVcDsKLSAgU0NIQVIgICpwU3RhOworICBTQ0hBUiAqcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7CisgIElOVCAqcExlZnRTdGFydE9mU2VnbWVudDsKKyAgSU5UICpwUmlnaHRTdGFydE9mU2VnbWVudDsKKyAgVUNIQVIgcmVhZERpcmVjdGlvbjsKKyAgVUlOVCAqcFNlZ21lbnRCaXRmaWVsZDsKKyAgVUlOVCBzZWdtZW50T2Zmc2V0OworICBVSU5UICpwRXNjYXBlU2VxdWVuY2VJbmZvOworICBVSU5UIGNvZGV3b3JkT2Zmc2V0OworICBVQ0hBUiBjYXJyeUJpdDsKKyAgVUlOVCBlc2NhcGVQcmVmaXhVcDsKKyAgU0NIQVIgKnBTdGE7CiAKLSAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wUmVtYWluaW5nQml0c0luU2VnbWVudDsKLSAgcExlZnRTdGFydE9mU2VnbWVudCAgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wTGVmdFN0YXJ0T2ZTZWdtZW50OwotICBwUmlnaHRTdGFydE9mU2VnbWVudCAgICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBSaWdodFN0YXJ0T2ZTZWdtZW50OwotICByZWFkRGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnJlYWREaXJlY3Rpb247Ci0gIHBTZWdtZW50Qml0ZmllbGQgICAgICAgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucFNlZ21lbnRCaXRmaWVsZDsKLSAgc2VnbWVudE9mZnNldCAgICAgICAgICAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5zZWdtZW50T2Zmc2V0OwotICBwRXNjYXBlU2VxdWVuY2VJbmZvICAgICAgICAgICAgICA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBFc2NhcGVTZXF1ZW5jZUluZm87Ci0gIGNvZGV3b3JkT2Zmc2V0ICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8uY29kZXdvcmRPZmZzZXQ7Ci0gIHBTdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YTsKKyAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnQgPSBwSGNyLT5zZWdtZW50SW5mby5wUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgcExlZnRTdGFydE9mU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBMZWZ0U3RhcnRPZlNlZ21lbnQ7CisgIHBSaWdodFN0YXJ0T2ZTZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucFJpZ2h0U3RhcnRPZlNlZ21lbnQ7CisgIHJlYWREaXJlY3Rpb24gPSBwSGNyLT5zZWdtZW50SW5mby5yZWFkRGlyZWN0aW9uOworICBwU2VnbWVudEJpdGZpZWxkID0gcEhjci0+c2VnbWVudEluZm8ucFNlZ21lbnRCaXRmaWVsZDsKKyAgc2VnbWVudE9mZnNldCA9IHBIY3ItPnNlZ21lbnRJbmZvLnNlZ21lbnRPZmZzZXQ7CisgIHBFc2NhcGVTZXF1ZW5jZUluZm8gPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wRXNjYXBlU2VxdWVuY2VJbmZvOworICBjb2Rld29yZE9mZnNldCA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLmNvZGV3b3JkT2Zmc2V0OworICBwU3RhID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YTsKIAotICBlc2NhcGVQcmVmaXhVcCAgPSAocEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJiBNQVNLX0VTQ0FQRV9QUkVGSVhfVVApID4+IExTQl9FU0NBUEVfUFJFRklYX1VQOwotCisgIGVzY2FwZVByZWZpeFVwID0KKyAgICAgIChwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSAmIE1BU0tfRVNDQVBFX1BSRUZJWF9VUCkgPj4KKyAgICAgIExTQl9FU0NBUEVfUFJFRklYX1VQOwogCiAgIC8qIGRlY29kZSBlc2NhcGUgcHJlZml4ICovCi0gIGZvciAoIDsgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPiAwIDsgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMSApIHsKLQotICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBMZWZ0U3RhcnRPZlNlZ21lbnRbc2VnbWVudE9mZnNldF0sCisgIGZvciAoOyBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA+IDA7CisgICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMSkgeworICAgIGNhcnJ5Qml0ID0gSGNyR2V0QUJpdEZyb21CaXRzdHJlYW0oYnMsICZwTGVmdFN0YXJ0T2ZTZWdtZW50W3NlZ21lbnRPZmZzZXRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSaWdodFN0YXJ0T2ZTZWdtZW50W3NlZ21lbnRPZmZzZXRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWREaXJlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZERpcmVjdGlvbik7CiAKICAgICAvKiBjb3VudCBvbmVzIGFuZCBzdG9yZSBzdW0gaW4gZXNjYXBlUHJlZml4VXAgKi8KLSAgICBpZiAoIGNhcnJ5Qml0ID09IDEgKSB7Ci0gICAgICBlc2NhcGVQcmVmaXhVcCArPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIGNvbnRlciBmb3Igb25lcyAqLworICAgIGlmIChjYXJyeUJpdCA9PSAxKSB7CisgICAgICBlc2NhcGVQcmVmaXhVcCArPSAxOyAvKiB1cGRhdGUgY29udGVyIGZvciBvbmVzICovCiAKICAgICAgIC8qIHN0b3JlIHVwZGF0ZWQgY291bnRlciBpbiBzaWRlaW5mbyBvZiBjdXJyZW50IGNvZGV3b3JkICovCi0gICAgICBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSAmPSB+TUFTS19FU0NBUEVfUFJFRklYX1VQOyAgICAgICAgLyogZGVsZXRlIG9sZCBlc2NhcGVQcmVmaXhVcCAqLwotICAgICAgZXNjYXBlUHJlZml4VXAgPDw9IExTQl9FU0NBUEVfUFJFRklYX1VQOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoaWZ0IHRvIGNvcnJlY3QgcG9zaXRpb24gKi8KLSAgICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIHw9IGVzY2FwZVByZWZpeFVwOyAgICAgICAgICAgICAgICAvKiBpbnNlcnQgbmV3IGVzY2FwZVByZWZpeFVwICovCi0gICAgICBlc2NhcGVQcmVmaXhVcCA+Pj0gTFNCX0VTQ0FQRV9QUkVGSVhfVVA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hpZnQgYmFjayBkb3duICovCi0gICAgfQotICAgIGVsc2UgeyAgLyogc2VwYXJhdG9yIFt6ZXJvXSByZWFjaGVkICovCi0gICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGFzdCByZWluaXRpYWx6YXRpb24gb2YgZm9yIGxvb3AgY291bnRlciAoc2VlIGFib3ZlKSBpcyBkb25lIGhlcmUgKi8KLSAgICAgIGVzY2FwZVByZWZpeFVwICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBlc2NhcGVfc2VwYXJhdG9yICcwJyBhcHBlYXJzLCBhZGQgNCBhbmQgPT0+IGJyZWFrICovCisgICAgICBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSAmPQorICAgICAgICAgIH5NQVNLX0VTQ0FQRV9QUkVGSVhfVVA7ICAgICAgICAgICAgICAvKiBkZWxldGUgb2xkIGVzY2FwZVByZWZpeFVwICovCisgICAgICBlc2NhcGVQcmVmaXhVcCA8PD0gTFNCX0VTQ0FQRV9QUkVGSVhfVVA7IC8qIHNoaWZ0IHRvIGNvcnJlY3QgcG9zaXRpb24gKi8KKyAgICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIHw9CisgICAgICAgICAgZXNjYXBlUHJlZml4VXA7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluc2VydCBuZXcgZXNjYXBlUHJlZml4VXAgKi8KKyAgICAgIGVzY2FwZVByZWZpeFVwID4+PSBMU0JfRVNDQVBFX1BSRUZJWF9VUDsgLyogc2hpZnQgYmFjayBkb3duICovCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcGFyYXRvciBbemVyb10gcmVhY2hlZCAqLworICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMTsgLyogbGFzdCByZWluaXRpYWx6YXRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsb29wIGNvdW50ZXIgKHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUpIGlzIGRvbmUgaGVyZSAqLworICAgICAgZXNjYXBlUHJlZml4VXAgKz0KKyAgICAgICAgICA0OyAvKiBpZiBlc2NhcGVfc2VwYXJhdG9yICcwJyBhcHBlYXJzLCBhZGQgNCBhbmQgPT0+IGJyZWFrICovCiAKLSAgICAgIC8qIHN0b3JlIGVzY2FwZVByZWZpeFVwIGluIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIGF0IGJpdCBwb3NpdGlvbiBlc2NhcGVQcmVmaXhVcCAqLwotICAgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJj0gfk1BU0tfRVNDQVBFX1BSRUZJWF9VUDsgICAgICAgIC8qIGRlbGV0ZSBvbGQgZXNjYXBlUHJlZml4VXAgKi8KLSAgICAgIGVzY2FwZVByZWZpeFVwIDw8PSBMU0JfRVNDQVBFX1BSRUZJWF9VUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGlmdCB0byBjb3JyZWN0IHBvc2l0aW9uICovCi0gICAgICBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSB8PSBlc2NhcGVQcmVmaXhVcDsgICAgICAgICAgICAgICAgLyogaW5zZXJ0IG5ldyBlc2NhcGVQcmVmaXhVcCAqLwotICAgICAgZXNjYXBlUHJlZml4VXAgPj49IExTQl9FU0NBUEVfUFJFRklYX1VQOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoaWZ0IGJhY2sgZG93biAqLworICAgICAgLyogc3RvcmUgZXNjYXBlUHJlZml4VXAgaW4gcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gYXQgYml0CisgICAgICAgKiBwb3NpdGlvbiBlc2NhcGVQcmVmaXhVcCAqLworICAgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJj0KKyAgICAgICAgICB+TUFTS19FU0NBUEVfUFJFRklYX1VQOyAgICAgICAgICAgICAgLyogZGVsZXRlIG9sZCBlc2NhcGVQcmVmaXhVcCAqLworICAgICAgZXNjYXBlUHJlZml4VXAgPDw9IExTQl9FU0NBUEVfUFJFRklYX1VQOyAvKiBzaGlmdCB0byBjb3JyZWN0IHBvc2l0aW9uICovCisgICAgICBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSB8PQorICAgICAgICAgIGVzY2FwZVByZWZpeFVwOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbnNlcnQgbmV3IGVzY2FwZVByZWZpeFVwICovCisgICAgICBlc2NhcGVQcmVmaXhVcCA+Pj0gTFNCX0VTQ0FQRV9QUkVGSVhfVVA7IC8qIHNoaWZ0IGJhY2sgZG93biAqLwogCi0gICAgICAvKiBzdG9yZSBlc2NhcGVQcmVmaXhVcCBpbiBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSBhdCBiaXQgcG9zaXRpb24gZXNjYXBlUHJlZml4RG93biAqLwotICAgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJj0gfk1BU0tfRVNDQVBFX1BSRUZJWF9ET1dOOyAgICAgIC8qIGRlbGV0ZSBvbGQgZXNjYXBlUHJlZml4RG93biAqLwotICAgICAgZXNjYXBlUHJlZml4VXAgPDw9IExTQl9FU0NBUEVfUFJFRklYX0RPV047ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoaWZ0IHRvIGNvcnJlY3QgcG9zaXRpb24gKi8KLSAgICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIHw9IGVzY2FwZVByZWZpeFVwOyAgICAgICAgICAgICAgICAvKiBpbnNlcnQgbmV3IGVzY2FwZVByZWZpeERvd24gKi8KLSAgICAgIGVzY2FwZVByZWZpeFVwID4+PSBMU0JfRVNDQVBFX1BSRUZJWF9ET1dOOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGlmdCBiYWNrIGRvd24gKi8KKyAgICAgIC8qIHN0b3JlIGVzY2FwZVByZWZpeFVwIGluIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIGF0IGJpdAorICAgICAgICogcG9zaXRpb24gZXNjYXBlUHJlZml4RG93biAqLworICAgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJj0KKyAgICAgICAgICB+TUFTS19FU0NBUEVfUFJFRklYX0RPV047IC8qIGRlbGV0ZSBvbGQgZXNjYXBlUHJlZml4RG93biAqLworICAgICAgZXNjYXBlUHJlZml4VXAgPDw9IExTQl9FU0NBUEVfUFJFRklYX0RPV047IC8qIHNoaWZ0IHRvIGNvcnJlY3QgcG9zaXRpb24gKi8KKyAgICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIHw9CisgICAgICAgICAgZXNjYXBlUHJlZml4VXA7IC8qIGluc2VydCBuZXcgZXNjYXBlUHJlZml4RG93biAqLwogCi0gICAgICBwU3RhW2NvZGV3b3JkT2Zmc2V0XSA9IEJPRFlfU0lHTl9FU0NfX0VTQ19XT1JEOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IG5leHQgc3RhdGUgKi8KLSAgICAgIHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSA9IGFTdGF0ZUNvbnN0YW50MlN0YXRlW3BTdGFbY29kZXdvcmRPZmZzZXRdXTsgICAgICAgICAgIC8qIGdldCBzdGF0ZSBmcm9tIHNlcGFyYXRlIGFycmF5IG9mIGN3LXNpZGVpbmZvICovCisgICAgICBwU3RhW2NvZGV3b3JkT2Zmc2V0XSA9IEJPRFlfU0lHTl9FU0NfX0VTQ19XT1JEOyAvKiBzZXQgbmV4dCBzdGF0ZSAqLworICAgICAgcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlID0KKyAgICAgICAgICBhU3RhdGVDb25zdGFudDJTdGF0ZVtwU3RhW2NvZGV3b3JkT2Zmc2V0XV07IC8qIGdldCBzdGF0ZSBmcm9tIHNlcGFyYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSBvZiBjdy1zaWRlaW5mbyAqLwogICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAKLSAgaWYgKCBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8PSAwICkgewotICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWdtZW50Qml0ZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZCBzd2l0Y2ggb2ZmIHN0YXRlbWFjaGluZSAqLworICBpZiAocFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPD0gMCkgeworICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwgc2VnbWVudE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkKTsgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCiAKLSNpZiBTVEFURV9NQUNISU5FX0VSUk9SX0NIRUNLCi0gICAgaWYgKCBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8IDAgKSB7CisgICAgaWYgKHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDwgMCkgewogICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gU1RBVEVfRVJST1JfQk9EWV9TSUdOX0VTQ19fRVNDX1BSRUZJWDsKLSAgICAgIHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfU0lHTl9FU0NfX0VTQ19QUkVGSVg7CisgICAgICByZXR1cm4gQk9EWV9TSUdOX0VTQ19fRVNDX1BSRUZJWDsKICAgICB9Ci0jZW5kaWYKICAgfQogCiAgIHJldHVybiBTVE9QX1RISVNfU1RBVEU7CiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZGVzY3JpcHRpb246IERlY29kZSBlc2NhcGVXb3JkIG9mIGVzY2FwZSBzZXF1ZW5jZS4gSWYgdGhlIGVzY2FwZSBzZXF1ZW5jZSBpcyBkZWNvZGVkCi0gICAgICAgICAgICAgICAgICBjb21wbGV0ZWx5LCBhc3NlbWJsZSBxdWFudGl6ZWQtc3BlY3RyYWwtZXNjYXBlLWNvZWZmaWNpZW50IGFuZCByZXBsYWNlIHRoZQotICAgICAgICAgICAgICAgICAgcHJldmlvdXMgZGVjb2RlZCAxNiBieSB0aGUgbmV3IHZhbHVlLgotICAgICAgICAgICAgICAgICAgVGVzdCBmbGFnQi4gSWYgZmxhZ0IgaXMgc2V0LCB0aGUgc2Vjb25kIGVzY2FwZSBzZXF1ZW5jZSBtdXN0IGJlIGRlY29kZWQuIElmCi0gICAgICAgICAgICAgICAgICBmbGFnQiBpcyBub3Qgc2V0LCB0aGUgY29kZXdvcmQgaXMgZGVjb2RlZCBhbmQgdGhlIHN0YXRlIG1hY2hpbmUgaXMgc3dpdGNoZWQKLSAgICAgICAgICAgICAgICAgIG9mZi4KKyAgICAgZGVzY3JpcHRpb246IERlY29kZSBlc2NhcGVXb3JkIG9mIGVzY2FwZSBzZXF1ZW5jZS4gSWYgdGhlIGVzY2FwZSBzZXF1ZW5jZQoraXMgZGVjb2RlZCBjb21wbGV0ZWx5LCBhc3NlbWJsZSBxdWFudGl6ZWQtc3BlY3RyYWwtZXNjYXBlLWNvZWZmaWNpZW50IGFuZAorcmVwbGFjZSB0aGUgcHJldmlvdXMgZGVjb2RlZCAxNiBieSB0aGUgbmV3IHZhbHVlLiBUZXN0IGZsYWdCLiBJZiBmbGFnQiBpcyBzZXQsCit0aGUgc2Vjb25kIGVzY2FwZSBzZXF1ZW5jZSBtdXN0IGJlIGRlY29kZWQuIElmIGZsYWdCIGlzIG5vdCBzZXQsIHRoZSBjb2Rld29yZCBpcworZGVjb2RlZCBhbmQgdGhlIHN0YXRlIG1hY2hpbmUgaXMgc3dpdGNoZWQgb2ZmLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgb3V0cHV0OiAgIFR3byBsaW5lcyB3aXRoIHZhbGlkIHNpZ24uIEF0IGxlYXN0IG9uZSBvZiBib3RoIGxpbmVzIGhhcyBnb3QgdGhlIGNvcnJlY3QKLSAgICAgICAgICAgICAgICAgIHZhbHVlLgorICAgICAgICBvdXRwdXQ6ICAgVHdvIGxpbmVzIHdpdGggdmFsaWQgc2lnbi4gQXQgbGVhc3Qgb25lIG9mIGJvdGggbGluZXMgaGFzIGdvdAordGhlIGNvcnJlY3QgdmFsdWUuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICByZXR1cm46ICAgMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLVVJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0VTQ19XT1JEKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCB2b2lkICpwdHIpCi17CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK1VJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0VTQ19XT1JEKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCB2b2lkICpwdHIpIHsKICAgSF9IQ1JfSU5GTyBwSGNyID0gKEhfSENSX0lORk8pcHRyOwotICBTQ0hBUiAgICAgKnBSZW1haW5pbmdCaXRzSW5TZWdtZW50OwotICBVU0hPUlQgICAgKnBMZWZ0U3RhcnRPZlNlZ21lbnQ7Ci0gIFVTSE9SVCAgICAqcFJpZ2h0U3RhcnRPZlNlZ21lbnQ7Ci0gIFVDSEFSICAgICAgcmVhZERpcmVjdGlvbjsKLSAgVUlOVCAgICAgICpwU2VnbWVudEJpdGZpZWxkOwotICBVSU5UICAgICAgKnBDb2Rld29yZEJpdGZpZWxkOwotICBVSU5UICAgICAgIHNlZ21lbnRPZmZzZXQ7CisgIFNDSEFSICpwUmVtYWluaW5nQml0c0luU2VnbWVudDsKKyAgSU5UICpwTGVmdFN0YXJ0T2ZTZWdtZW50OworICBJTlQgKnBSaWdodFN0YXJ0T2ZTZWdtZW50OworICBVQ0hBUiByZWFkRGlyZWN0aW9uOworICBVSU5UICpwU2VnbWVudEJpdGZpZWxkOworICBVSU5UICpwQ29kZXdvcmRCaXRmaWVsZDsKKyAgVUlOVCBzZWdtZW50T2Zmc2V0OwogCi0gIEZJWFBfREJMICAqcFJlc3VsdEJhc2U7Ci0gIFVTSE9SVCAgICAqaVJlc3VsdFBvaW50ZXI7Ci0gIFVJTlQgICAgICAqcEVzY2FwZVNlcXVlbmNlSW5mbzsKLSAgVUlOVCAgICAgICBjb2Rld29yZE9mZnNldDsKKyAgRklYUF9EQkwgKnBSZXN1bHRCYXNlOworICBVU0hPUlQgKmlSZXN1bHRQb2ludGVyOworICBVSU5UICpwRXNjYXBlU2VxdWVuY2VJbmZvOworICBVSU5UIGNvZGV3b3JkT2Zmc2V0OwogCi0gIFVJTlQgICAgICAgZXNjYXBlV29yZDsKLSAgVUlOVCAgICAgICBlc2NhcGVQcmVmaXhEb3duOwotICBVSU5UICAgICAgIGVzY2FwZVByZWZpeFVwOwotICBVQ0hBUiAgICAgIGNhcnJ5Qml0OwotICBVSU5UICAgICAgIGlRU0M7Ci0gIElOVCAgICAgICAgc2lnbjsKLSAgVUlOVCAgICAgICBmbGFnQTsKLSAgVUlOVCAgICAgICBmbGFnQjsKLSAgU0NIQVIgICAgICpwU3RhOworICBVSU5UIGVzY2FwZVdvcmQ7CisgIFVJTlQgZXNjYXBlUHJlZml4RG93bjsKKyAgVUlOVCBlc2NhcGVQcmVmaXhVcDsKKyAgVUNIQVIgY2FycnlCaXQ7CisgIFVJTlQgaVFTQzsKKyAgSU5UIHNpZ247CisgIFVJTlQgZmxhZ0E7CisgIFVJTlQgZmxhZ0I7CisgIFNDSEFSICpwU3RhOwogCiAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucFJlbWFpbmluZ0JpdHNJblNlZ21lbnQ7Ci0gIHBMZWZ0U3RhcnRPZlNlZ21lbnQgICAgID0gcEhjci0+c2VnbWVudEluZm8ucExlZnRTdGFydE9mU2VnbWVudDsKLSAgcFJpZ2h0U3RhcnRPZlNlZ21lbnQgICAgPSBwSGNyLT5zZWdtZW50SW5mby5wUmlnaHRTdGFydE9mU2VnbWVudDsKLSAgcmVhZERpcmVjdGlvbiAgICAgICAgICAgPSBwSGNyLT5zZWdtZW50SW5mby5yZWFkRGlyZWN0aW9uOwotICBwU2VnbWVudEJpdGZpZWxkICAgICAgICA9IHBIY3ItPnNlZ21lbnRJbmZvLnBTZWdtZW50Qml0ZmllbGQ7Ci0gIHBDb2Rld29yZEJpdGZpZWxkICAgICAgID0gcEhjci0+c2VnbWVudEluZm8ucENvZGV3b3JkQml0ZmllbGQ7Ci0gIHNlZ21lbnRPZmZzZXQgICAgICAgICAgID0gcEhjci0+c2VnbWVudEluZm8uc2VnbWVudE9mZnNldDsKKyAgcExlZnRTdGFydE9mU2VnbWVudCA9IHBIY3ItPnNlZ21lbnRJbmZvLnBMZWZ0U3RhcnRPZlNlZ21lbnQ7CisgIHBSaWdodFN0YXJ0T2ZTZWdtZW50ID0gcEhjci0+c2VnbWVudEluZm8ucFJpZ2h0U3RhcnRPZlNlZ21lbnQ7CisgIHJlYWREaXJlY3Rpb24gPSBwSGNyLT5zZWdtZW50SW5mby5yZWFkRGlyZWN0aW9uOworICBwU2VnbWVudEJpdGZpZWxkID0gcEhjci0+c2VnbWVudEluZm8ucFNlZ21lbnRCaXRmaWVsZDsKKyAgcENvZGV3b3JkQml0ZmllbGQgPSBwSGNyLT5zZWdtZW50SW5mby5wQ29kZXdvcmRCaXRmaWVsZDsKKyAgc2VnbWVudE9mZnNldCA9IHBIY3ItPnNlZ21lbnRJbmZvLnNlZ21lbnRPZmZzZXQ7CiAKLSAgcFJlc3VsdEJhc2UgICAgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wUmVzdWx0QmFzZTsKLSAgaVJlc3VsdFBvaW50ZXIgICAgICAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5pUmVzdWx0UG9pbnRlcjsKLSAgcEVzY2FwZVNlcXVlbmNlSW5mbyAgICAgPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wRXNjYXBlU2VxdWVuY2VJbmZvOwotICBjb2Rld29yZE9mZnNldCAgICAgICAgICA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLmNvZGV3b3JkT2Zmc2V0OwotICBwU3RhICAgICAgICAgICAgICAgICAgICA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGE7CisgIHBSZXN1bHRCYXNlID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFJlc3VsdEJhc2U7CisgIGlSZXN1bHRQb2ludGVyID0gcEhjci0+bm9uUGN3U2lkZWluZm8uaVJlc3VsdFBvaW50ZXI7CisgIHBFc2NhcGVTZXF1ZW5jZUluZm8gPSBwSGNyLT5ub25QY3dTaWRlaW5mby5wRXNjYXBlU2VxdWVuY2VJbmZvOworICBjb2Rld29yZE9mZnNldCA9IHBIY3ItPm5vblBjd1NpZGVpbmZvLmNvZGV3b3JkT2Zmc2V0OworICBwU3RhID0gcEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YTsKIAotICBlc2NhcGVXb3JkICAgICAgID0gIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICYgTUFTS19FU0NBUEVfV09SRDsKLSAgZXNjYXBlUHJlZml4RG93biA9IChwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSAmIE1BU0tfRVNDQVBFX1BSRUZJWF9ET1dOKSA+PiBMU0JfRVNDQVBFX1BSRUZJWF9ET1dOOwotCisgIGVzY2FwZVdvcmQgPSBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSAmIE1BU0tfRVNDQVBFX1dPUkQ7CisgIGVzY2FwZVByZWZpeERvd24gPQorICAgICAgKHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICYgTUFTS19FU0NBUEVfUFJFRklYX0RPV04pID4+CisgICAgICBMU0JfRVNDQVBFX1BSRUZJWF9ET1dOOwogCiAgIC8qIGRlY29kZSBlc2NhcGUgd29yZCAqLwotICBmb3IgKCA7IHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdID4gMCA7IHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDEgKSB7Ci0KLSAgICBjYXJyeUJpdCA9IEhjckdldEFCaXRGcm9tQml0c3RyZWFtKCBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwTGVmdFN0YXJ0T2ZTZWdtZW50W3NlZ21lbnRPZmZzZXRdLAorICBmb3IgKDsgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPiAwOworICAgICAgIHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIC09IDEpIHsKKyAgICBjYXJyeUJpdCA9IEhjckdldEFCaXRGcm9tQml0c3RyZWFtKGJzLCAmcExlZnRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmlnaHRTdGFydE9mU2VnbWVudFtzZWdtZW50T2Zmc2V0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWREaXJlY3Rpb24pOwogCiAgICAgLyogYnVpbGQgZXNjYXBlIHdvcmQgKi8KLSAgICBlc2NhcGVXb3JkIDw8PSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZWZ0IHNoaWZ0IHByZXZpb3VzIGRlY29kZWQgcGFydCBvZiBlc2NhcGVXb3JkIGJ5IG9uIGJpdCAqLwotICAgIGVzY2FwZVdvcmQgPSBlc2NhcGVXb3JkIHwgY2FycnlCaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFzc2VtYmxlIGVzY2FwZSB3b3JkIGJ5IGJpdHdpc2Ugb3IgKi8KKyAgICBlc2NhcGVXb3JkIDw8PQorICAgICAgICAxOyAvKiBsZWZ0IHNoaWZ0IHByZXZpb3VzIGRlY29kZWQgcGFydCBvZiBlc2NhcGVXb3JkIGJ5IG9uIGJpdCAqLworICAgIGVzY2FwZVdvcmQgPSBlc2NhcGVXb3JkIHwgY2FycnlCaXQ7IC8qIGFzc2VtYmxlIGVzY2FwZSB3b3JkIGJ5IGJpdHdpc2Ugb3IgKi8KIAotICAgIC8qIGRlY3JlbWVudCBjb3VudGVyIGZvciBsZW5ndGggb2YgZXNjYXBlIHdvcmQgYmVjYXVzZSBvbmUgbW9yZSBiaXQgd2FzIGRlY29kZWQgKi8KKyAgICAvKiBkZWNyZW1lbnQgY291bnRlciBmb3IgbGVuZ3RoIG9mIGVzY2FwZSB3b3JkIGJlY2F1c2Ugb25lIG1vcmUgYml0IHdhcworICAgICAqIGRlY29kZWQgKi8KICAgICBlc2NhcGVQcmVmaXhEb3duIC09IDE7CiAKICAgICAvKiBzdG9yZSB1cGRhdGVkIGVzY2FwZVByZWZpeERvd24gKi8KLSAgICBwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSAmPSB+TUFTS19FU0NBUEVfUFJFRklYX0RPV047ICAgICAgICAvKiBkZWxldGUgb2xkIGVzY2FwZVByZWZpeERvd24gKi8KLSAgICBlc2NhcGVQcmVmaXhEb3duIDw8PSBMU0JfRVNDQVBFX1BSRUZJWF9ET1dOOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGlmdCB0byBjb3JyZWN0IHBvc2l0aW9uICovCi0gICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gfD0gZXNjYXBlUHJlZml4RG93bjsgICAgICAgICAgICAgICAgLyogaW5zZXJ0IG5ldyBlc2NhcGVQcmVmaXhEb3duICovCi0gICAgZXNjYXBlUHJlZml4RG93biA+Pj0gTFNCX0VTQ0FQRV9QUkVGSVhfRE9XTjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hpZnQgYmFjayAqLwotCisgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJj0KKyAgICAgICAgfk1BU0tfRVNDQVBFX1BSRUZJWF9ET1dOOyAvKiBkZWxldGUgb2xkIGVzY2FwZVByZWZpeERvd24gKi8KKyAgICBlc2NhcGVQcmVmaXhEb3duIDw8PSBMU0JfRVNDQVBFX1BSRUZJWF9ET1dOOyAvKiBzaGlmdCB0byBjb3JyZWN0IHBvc2l0aW9uICovCisgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gfD0KKyAgICAgICAgZXNjYXBlUHJlZml4RG93bjsgLyogaW5zZXJ0IG5ldyBlc2NhcGVQcmVmaXhEb3duICovCisgICAgZXNjYXBlUHJlZml4RG93biA+Pj0gTFNCX0VTQ0FQRV9QUkVGSVhfRE9XTjsgLyogc2hpZnQgYmFjayAqLwogCiAgICAgLyogc3RvcmUgdXBkYXRlZCBlc2NhcGVXb3JkICovCi0gICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJj0gfk1BU0tfRVNDQVBFX1dPUkQ7ICAgICAgICAgICAgICAgLyogZGVsZXRlIG9sZCBlc2NhcGVXb3JkICovCi0gICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gfD0gZXNjYXBlV29yZDsgICAgICAgICAgICAgICAgICAgICAgLyogaW5zZXJ0IG5ldyBlc2NhcGVXb3JkICovCisgICAgcEVzY2FwZVNlcXVlbmNlSW5mb1tjb2Rld29yZE9mZnNldF0gJj0KKyAgICAgICAgfk1BU0tfRVNDQVBFX1dPUkQ7IC8qIGRlbGV0ZSBvbGQgZXNjYXBlV29yZCAqLworICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdIHw9CisgICAgICAgIGVzY2FwZVdvcmQ7IC8qIGluc2VydCBuZXcgZXNjYXBlV29yZCAqLwogCisgICAgaWYgKGVzY2FwZVByZWZpeERvd24gPT0gMCkgeworICAgICAgcFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gLT0gMTsgLyogbGFzdCByZWluaXRpYWx6YXRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsb29wIGNvdW50ZXIgKHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUpIGlzIGRvbmUgaGVyZSAqLwogCi0gICAgaWYgKCBlc2NhcGVQcmVmaXhEb3duID09IDAgKSB7Ci0gICAgICBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSAtPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGFzdCByZWluaXRpYWx6YXRpb24gb2YgZm9yIGxvb3AgY291bnRlciAoc2VlIGFib3ZlKSBpcyBkb25lIGhlcmUgKi8KLQotICAgICAgLyogZXNjYXBlIHNlcXVlbmNlIGRlY29kZWQuIEFzc2VtYmxlIGVzY2FwZS1saW5lIGFuZCByZXBsYWNlIG9yaWdpbmFsIGxpbmUgKi8KKyAgICAgIC8qIGVzY2FwZSBzZXF1ZW5jZSBkZWNvZGVkLiBBc3NlbWJsZSBlc2NhcGUtbGluZSBhbmQgcmVwbGFjZSBvcmlnaW5hbCBsaW5lCisgICAgICAgKi8KIAogICAgICAgLyogc3RlcCAwICovCiAgICAgICAvKiBkZXJpdmUgc2lnbiAqLwogICAgICAgaVFTQyA9IGlSZXN1bHRQb2ludGVyW2NvZGV3b3JkT2Zmc2V0XTsKLSAgICAgIHNpZ24gPSAocFJlc3VsdEJhc2VbaVFTQ10gPj0gKEZJWFBfREJMKTApID8gMSA6IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHNpZ24gb2YgZXNjYXBlIHZhbHVlIDE2ICovCisgICAgICBzaWduID0gKHBSZXN1bHRCYXNlW2lRU0NdID49IChGSVhQX0RCTCkwKQorICAgICAgICAgICAgICAgICA/IDEKKyAgICAgICAgICAgICAgICAgOiAtMTsgLyogZ2V0IHNpZ24gb2YgZXNjYXBlIHZhbHVlIDE2ICovCiAKICAgICAgIC8qIHN0ZXAgMSAqLwogICAgICAgLyogZ2V0IGVzY2FwZVByZWZpeFVwICovCi0gICAgICBlc2NhcGVQcmVmaXhVcCA9IChwRXNjYXBlU2VxdWVuY2VJbmZvW2NvZGV3b3JkT2Zmc2V0XSAmIE1BU0tfRVNDQVBFX1BSRUZJWF9VUCkgPj4gTFNCX0VTQ0FQRV9QUkVGSVhfVVA7CisgICAgICBlc2NhcGVQcmVmaXhVcCA9CisgICAgICAgICAgKHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICYgTUFTS19FU0NBUEVfUFJFRklYX1VQKSA+PgorICAgICAgICAgIExTQl9FU0NBUEVfUFJFRklYX1VQOwogCiAgICAgICAvKiBzdGVwIDIgKi8KICAgICAgIC8qIGNhbGN1bGF0ZSBlc2NhcGUgdmFsdWUgKi8KLSAgICAgIHBSZXN1bHRCYXNlW2lRU0NdID0gKEZJWFBfREJMKShzaWduICogKCgoSU5UKSAxIDw8IGVzY2FwZVByZWZpeFVwKSArIGVzY2FwZVdvcmQpKTsKKyAgICAgIHBSZXN1bHRCYXNlW2lRU0NdID0KKyAgICAgICAgICAoRklYUF9EQkwpKHNpZ24gKiAoKChJTlQpMSA8PCBlc2NhcGVQcmVmaXhVcCkgKyAoSU5UKWVzY2FwZVdvcmQpKTsKIAotICAgICAgLyogZ2V0IGJvdGggZmxhZ3MgZnJvbSBzaWRlaW5mbyAoZmxhZ3MgYXJlIG5vdCBzaGlmdGVkIHRvIHRoZSBsc2ItcG9zaXRpb24pICovCisgICAgICAvKiBnZXQgYm90aCBmbGFncyBmcm9tIHNpZGVpbmZvIChmbGFncyBhcmUgbm90IHNoaWZ0ZWQgdG8gdGhlCisgICAgICAgKiBsc2ItcG9zaXRpb24pICovCiAgICAgICBmbGFnQSA9IHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICYgTUFTS19GTEFHX0E7CiAgICAgICBmbGFnQiA9IHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICYgTUFTS19GTEFHX0I7CiAKQEAgLTEzNjEsNDkgKzE0OTgsNTEgQEAKICAgICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdID0gMDsKIAogICAgICAgLyogY2hhbmdlIHN0YXRlIGluIGRlcGVuZGVuY2Ugb2YgZmxhZyBmbGFnQiAqLwotICAgICAgaWYgKCBmbGFnQSAhPSAwICkgewotICAgICAgICAvKiBmaXJzdCBlc2NhcGUgc2VxdWVuY2UgZGVjb2RlZDsgcHJldmlvdXMgZGVjb2RlZCAxNiBoYXMgYmVlbiByZXBsYWNlZCBieSB2YWxpZCBsaW5lICovCisgICAgICBpZiAoZmxhZ0EgIT0gMCkgeworICAgICAgICAvKiBmaXJzdCBlc2NhcGUgc2VxdWVuY2UgZGVjb2RlZDsgcHJldmlvdXMgZGVjb2RlZCAxNiBoYXMgYmVlbiByZXBsYWNlZAorICAgICAgICAgKiBieSB2YWxpZCBsaW5lICovCiAKLSAgICAgICAgLyogY2xlYXIgZmxhZ0EgaW4gc2lkZWluZm8gd29yZCBiZWNhdXNlIHRoaXMgZXNjYXBlIHNlcXVlbmNlIGhhcyBhbHJlYWR5IGJlZWQgZGVjb2RlZCAqLworICAgICAgICAvKiBjbGVhciBmbGFnQSBpbiBzaWRlaW5mbyB3b3JkIGJlY2F1c2UgdGhpcyBlc2NhcGUgc2VxdWVuY2UgaGFzIGFscmVhZHkKKyAgICAgICAgICogYmVlZCBkZWNvZGVkICovCiAgICAgICAgIHBFc2NhcGVTZXF1ZW5jZUluZm9bY29kZXdvcmRPZmZzZXRdICY9IH5NQVNLX0ZMQUdfQTsKIAotICAgICAgICBpZiAoIGZsYWdCID09IDAgKSB7Ci0gICAgICAgICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZGV3b3JkQml0ZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgIGlmIChmbGFnQiA9PSAwKSB7CisgICAgICAgICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLCBzZWdtZW50T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2Rld29yZEJpdGZpZWxkKTsgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBzd2l0Y2ggb2ZmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1hY2hpbmUgKi8KKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAvKiB1cGRhdGVkIHBvaW50ZXIgdG8gbmV4dCBhbmQgbGFzdCAxNiAqLwogICAgICAgICAgIGlRU0MrKzsKICAgICAgICAgICBpUmVzdWx0UG9pbnRlcltjb2Rld29yZE9mZnNldF0gPSBpUVNDOwogCiAgICAgICAgICAgLyogY2hhbmdlIHN0YXRlICovCiAgICAgICAgICAgcFN0YVtjb2Rld29yZE9mZnNldF0gPSBCT0RZX1NJR05fRVNDX19FU0NfUFJFRklYOwotICAgICAgICAgIHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSA9IGFTdGF0ZUNvbnN0YW50MlN0YXRlW3BTdGFbY29kZXdvcmRPZmZzZXRdXTsgLyogZ2V0IHN0YXRlIGZyb20gc2VwYXJhdGUgYXJyYXkgb2YgY3ctc2lkZWluZm8gKi8KKyAgICAgICAgICBwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUgPQorICAgICAgICAgICAgICBhU3RhdGVDb25zdGFudDJTdGF0ZVtwU3RhW2NvZGV3b3JkT2Zmc2V0XV07IC8qIGdldCBzdGF0ZSBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdGUgYXJyYXkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdy1zaWRlaW5mbyAqLwogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoJihwSGNyLT5ub25QY3dTaWRlaW5mby5wU3RhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZCBzd2l0Y2ggb2ZmIHN0YXRlbWFjaGluZSAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ2xlYXJCaXRGcm9tQml0ZmllbGQoCisgICAgICAgICAgICAmKHBIY3ItPm5vblBjd1NpZGVpbmZvLnBTdGF0ZSksIHNlZ21lbnRPZmZzZXQsCisgICAgICAgICAgICBwQ29kZXdvcmRCaXRmaWVsZCk7IC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZCBzd2l0Y2ggb2ZmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWFjaGluZSAqLwogICAgICAgfQogICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAKLSAgaWYgKCBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8PSAwICkgewotICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWdtZW50Qml0ZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGEgYml0IGluIGJpdGZpZWxkIGFuZCBzd2l0Y2ggb2ZmIHN0YXRlbWFjaGluZSAqLworICBpZiAocFJlbWFpbmluZ0JpdHNJblNlZ21lbnRbc2VnbWVudE9mZnNldF0gPD0gMCkgeworICAgIENsZWFyQml0RnJvbUJpdGZpZWxkKCYocEhjci0+bm9uUGN3U2lkZWluZm8ucFN0YXRlKSwgc2VnbWVudE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudEJpdGZpZWxkKTsgLyogY2xlYXIgYSBiaXQgaW4gYml0ZmllbGQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCBvZmYgc3RhdGVtYWNoaW5lICovCiAKLSNpZiBTVEFURV9NQUNISU5FX0VSUk9SX0NIRUNLCi0gICAgaWYgKCBwUmVtYWluaW5nQml0c0luU2VnbWVudFtzZWdtZW50T2Zmc2V0XSA8IDAgKSB7CisgICAgaWYgKHBSZW1haW5pbmdCaXRzSW5TZWdtZW50W3NlZ21lbnRPZmZzZXRdIDwgMCkgewogICAgICAgcEhjci0+ZGVjSW5PdXQuZXJyb3JMb2cgfD0gU1RBVEVfRVJST1JfQk9EWV9TSUdOX0VTQ19fRVNDX1dPUkQ7Ci0gICAgICByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX1NJR05fRVNDX19FU0NfV09SRDsKKyAgICAgIHJldHVybiBCT0RZX1NJR05fRVNDX19FU0NfV09SRDsKICAgICB9Ci0jZW5kaWYKICAgfQogCiAgIHJldHVybiBTVE9QX1RISVNfU1RBVEU7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcnMuaCBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX2hjcnMuaAppbmRleCA2NzhiYTI2Li5hY2IyZjQwIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY2RlY19oY3JzLmgKKysrIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNfaGNycy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDc1ICs5MCw4NyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBSb2JlcnQgV2VpZG5lciAoRFNQIFNvbHV0aW9ucykKKwogICAgRGVzY3JpcHRpb246IEhDUiBEZWNvZGVyOiBEZWZpbmVzIG9mIHN0YXRlLWNvbnN0YW50cywgbWFza3MgYW5kCiAgICAgICAgICAgICAgICAgc3RhdGUtcHJvdG90eXBlcwogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIF9BQUNERUNfSENSU19IXwotI2RlZmluZSBfQUFDREVDX0hDUlNfSF8KLQotCisjaWZuZGVmIEFBQ0RFQ19IQ1JTX0gKKyNkZWZpbmUgQUFDREVDX0hDUlNfSAogCiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgogI2luY2x1ZGUgImFhY2RlY19oY3JfdHlwZXMuaCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgZm91ciBkaWZmZXJlbnQga2luZHMgb2YgdHlwZXMgb2Ygc3RhdGVzIGFyZTogICAgICAgICAgICAgICAgICAgICAqLwotLyogZGlmZmVyZW50IHN0YXRlcyBhcmUgZGVmaW5lZCBhcyBjb25zdGFudHMgKi8gICAgIC8qIHN0YXJ0ICAgbWlkZGxlPXNlbGYgICBuZXh0ICAgc3RvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lICBTVE9QX1RISVNfU1RBVEUgICAgICAgICAgICAgMCAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgIEJPRFlfT05MWSAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAvKiAgIFggICAgICAgICAgWCAgICAgICAgICAgICAgICBYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSAgQk9EWV9TSUdOX19CT0RZICAgICAgICAgICAgIDIgICAgICAgICAgICAgIC8qICAgWCAgICAgICAgICBYICAgICAgICAgWCAgICAgIFggW3N0b3AgaWYgbm8gc2lnbl0gICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lICBCT0RZX1NJR05fX1NJR04gICAgICAgICAgICAgMyAgICAgICAgICAgICAgLyogICAgICAgICAgICAgIFggICAgICAgICAgICAgICAgWCBbc3RvcCBpZiBzaWduIGJpdHMgZGVjb2RlZF0gICAgICAgICAgKi8KLSNkZWZpbmUgIEJPRFlfU0lHTl9FU0NfX0JPRFkgICAgICAgICA0ICAgICAgICAgICAgICAvKiAgIFggICAgICAgICAgWCAgICAgICAgIFggICAgICBYIFtzdG9wIGlmIG5vIHNpZ25dICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSAgQk9EWV9TSUdOX0VTQ19fU0lHTiAgICAgICAgIDUgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICBYICAgICAgICAgWCAgICAgIFggW3N0b3AgaWYgbm8gZXNjYXBlIHNlcXVlbmNlXSAgICAgICAgICovCi0jZGVmaW5lICBCT0RZX1NJR05fRVNDX19FU0NfUFJFRklYICAgNiAgICAgICAgICAgICAgLyogICAgICAgICAgICAgIFggICAgICAgICBYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgIEJPRFlfU0lHTl9FU0NfX0VTQ19XT1JEICAgICA3ICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgWCAgICAgICAgIFggICAgICBYIFtzdG9wIGlmIGFicyhzZWNvbmQgcXNjKSAhPSAxNl0gICAgICAqLworLyogVGhlIGZvdXIgZGlmZmVyZW50IGtpbmRzIG9mIHR5cGVzIG9mIHN0YXRlcyBhcmU6ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGRpZmZlcmVudCBzdGF0ZXMgYXJlIGRlZmluZWQgYXMgY29uc3RhbnRzICovIC8qIHN0YXJ0ICAgbWlkZGxlPXNlbGYgICBuZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wICovCisjZGVmaW5lIFNUT1BfVEhJU19TVEFURSBcCisgIDAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk9EWV9PTkxZIFwKKyAgMSAvKiAgIFggICAgICAgICAgWCAgICAgICAgICAgICAgICBYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCT0RZX1NJR05fX0JPRFkgXAorICAyIC8qICAgWCAgICAgICAgICBYICAgICAgICAgWCAgICAgIFggW3N0b3AgaWYgbm8gc2lnbl0gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJPRFlfU0lHTl9fU0lHTiBcCisgIDMgLyogICAgICAgICAgICAgIFggICAgICAgICAgICAgICAgWCBbc3RvcCBpZiBzaWduIGJpdHMgZGVjb2RlZF0gICAgICAgICAgKi8KKyNkZWZpbmUgQk9EWV9TSUdOX0VTQ19fQk9EWSBcCisgIDQgLyogICBYICAgICAgICAgIFggICAgICAgICBYICAgICAgWCBbc3RvcCBpZiBubyBzaWduXSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk9EWV9TSUdOX0VTQ19fU0lHTiBcCisgIDUgLyogICAgICAgICAgICAgIFggICAgICAgICBYICAgICAgWCBbc3RvcCBpZiBubyBlc2NhcGUgc2VxdWVuY2VdICAgICAgICAgKi8KKyNkZWZpbmUgQk9EWV9TSUdOX0VTQ19fRVNDX1BSRUZJWCBcCisgIDYgLyogICAgICAgICAgICAgIFggICAgICAgICBYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk9EWV9TSUdOX0VTQ19fRVNDX1dPUkQgXAorICA3IC8qICAgICAgICAgICAgICBYICAgICAgICAgWCAgICAgIFggW3N0b3AgaWYgYWJzKHNlY29uZCBxc2MpICE9IDE2XSAgICAgICovCiAKIC8qIGV4YW1wbGVzOiAqLwogCi0vKiBCT0RZX09OTFkgICAgICAgICAgICAgICAgICAgIG1lYW5zIG9ubHkgdGhlIGNvZGV3b3JkIGJvZHkgd2lsbCBiZSBkZWNvZGVkOyBubyBzaWduIGJpdHMgd2lsbCBmb2xsb3cgYW5kIG5vIGVzY2FwZXNlcXVlbmNlIHdpbGwgZm9sbG93ICovCisvKiBCT0RZX09OTFkgICAgICAgICAgICAgICAgICAgIG1lYW5zIG9ubHkgdGhlIGNvZGV3b3JkIGJvZHkgd2lsbCBiZSBkZWNvZGVkOyBubworICogc2lnbiBiaXRzIHdpbGwgZm9sbG93IGFuZCBubyBlc2NhcGVzZXF1ZW5jZSB3aWxsIGZvbGxvdyAqLwogCi0vKiBCT0RZX1NJR05fX0JPRFkgICAgICAgICAgICAgIG1lYW5zIHRoYXQgdGhlIGNvZGV3b3JkIGNvbnNpc3RzIG9mIHR3byBwYXJ0czsgYm9keSBhbmQgc2lnbiBwYXJ0LiBUaGUgcGFydCAnX19CT0RZJyBhZnRlciB0aGUgdHdvIHVuZGVyc2NvcmVzIHNob3dzICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlIGJpdHMgd2hpY2ggYXJlIGN1cnJlbnRseSBkZWNvZGVkIGJlbG9uZyB0byB0aGUgJ19fQk9EWScgb2YgdGhlIGNvZGV3b3JkIGFuZCBub3QgdG8gdGhlIHNpZ24gcGFydC4gKi8KKy8qIEJPRFlfU0lHTl9fQk9EWSAgICAgICAgICAgICAgbWVhbnMgdGhhdCB0aGUgY29kZXdvcmQgY29uc2lzdHMgb2YgdHdvIHBhcnRzOworICogYm9keSBhbmQgc2lnbiBwYXJ0LiBUaGUgcGFydCAnX19CT0RZJyBhZnRlciB0aGUgdHdvIHVuZGVyc2NvcmVzIHNob3dzICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlIGJpdHMgd2hpY2ggYXJlIGN1cnJlbnRseSBkZWNvZGVkIGJlbG9uZworICogdG8gdGhlICdfX0JPRFknIG9mIHRoZSBjb2Rld29yZCBhbmQgbm90IHRvIHRoZSBzaWduIHBhcnQuICovCiAKLS8qIEJPRFlfU0lHTl9FU0NfX0VTQ19QQiAgICAgICAgbWVhbnMgdGhhdCB0aGUgY29kZXdvcmQgY29uc2lzdHMgb2YgdGhyZWUgcGFydHM7IGJvZHksIHNpZ24gYW5kIChoZXJlOiB0d28pIGVzY2FwZSBzZXF1ZW5jZXM7ICAqLworLyogQk9EWV9TSUdOX0VTQ19fRVNDX1BCICAgICAgICBtZWFucyB0aGF0IHRoZSBjb2Rld29yZCBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0czsKKyAqIGJvZHksIHNpZ24gYW5kIChoZXJlOiB0d28pIGVzY2FwZSBzZXF1ZW5jZXM7ICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQID0gUHJlZml4ID0gb25lcyAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXID0gRXNjYXBlIFdvcmQgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSA9IGZpcnN0IHBvc3NpYmxlIChvZiB0d28pIEVzY2FwZSBzZXF1ZWNlcyAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCID0gc2Vjb25kIHBvc3NpYmxlIChvZiB0d28pIEVzY2FwZSBzZXF1ZWNlcyAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcGFydCBhZnRlciB0aGUgdHdvIHVuZGVyc2NvcmVzIHNob3dzIHRoYXQgdGhlIGN1cnJlbnQgYml0cyB3aGljaCBhcmUgZGVjb2RlZCBiZWxvbmcgdG8gdGhlICdfX0VTQ19QQicgLSBwYXJ0IG9mIHRoZSAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rld29yZC4gVGhhdCBtZWFucyB0aGUgYm9keSBhbmQgdGhlIHNpZ24gYml0cyBhcmUgZGVjb2RlZCBjb21wbGV0ZWx5IGFuZCB0aGUgYml0cyB3aGljaCBhcmUgZGVjb2RlZCBub3cgYmVsb25nIHRvICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlc2NhcGUgc2VxdWVuY2UgW1AgPSBwcmVmaXg7IEI9c2Vjb25kIHBvc3NpYmxlIGVzY2FwZSBzZXF1ZW5jZV0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHBhcnQgYWZ0ZXIgdGhlIHR3byB1bmRlcnNjb3JlcyBzaG93cyB0aGF0CisgKiB0aGUgY3VycmVudCBiaXRzIHdoaWNoIGFyZSBkZWNvZGVkIGJlbG9uZyB0byB0aGUgJ19fRVNDX1BCJyAtIHBhcnQgb2YgdGhlICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGV3b3JkLiBUaGF0IG1lYW5zIHRoZSBib2R5IGFuZCB0aGUgc2lnbiBiaXRzCisgKiBhcmUgZGVjb2RlZCBjb21wbGV0ZWx5IGFuZCB0aGUgYml0cyB3aGljaCBhcmUgZGVjb2RlZCBub3cgYmVsb25nIHRvICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlc2NhcGUgc2VxdWVuY2UgW1AgPSBwcmVmaXg7IEI9c2Vjb25kCisgKiBwb3NzaWJsZSBlc2NhcGUgc2VxdWVuY2VdICovCiAKKyNkZWZpbmUgTVNCXzMxX01BU0sgMHg4MDAwMDAwMCAvKiBtYXNrcyBNU0IgKD0gQml0IDMxKSBpbiBhIDMyIGJpdCB3b3JkICovCisjZGVmaW5lIERJTUVOU0lPTl9PRl9FU0NBUEVfQ09ERUJPT0sgMiAvKiBmb3IgY2IgPj0gMTEgaXMgZGltZW5zaW9uIDIgKi8KKyNkZWZpbmUgRVNDQVBFX0NPREVCT09LIDExCiAKLSNkZWZpbmUgICBNU0JfMzFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMCAgICAgICAgICAgICAgLyogbWFza3MgTVNCICg9IEJpdCAzMSkgaW4gYSAzMiBiaXQgd29yZCAqLwotI2RlZmluZSAgIERJTUVOU0lPTl9PRl9FU0NBUEVfQ09ERUJPT0sgICAgICAyICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgY2IgPj0gMTEgaXMgZGltZW5zaW9uIDIgKi8KLSNkZWZpbmUgICBFU0NBUEVfQ09ERUJPT0sgICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgTUFTS19FU0NBUEVfUFJFRklYX1VQIDB4MDAwRjAwMDAKKyNkZWZpbmUgTFNCX0VTQ0FQRV9QUkVGSVhfVVAgMTYKIAotI2RlZmluZSAgIE1BU0tfRVNDQVBFX1BSRUZJWF9VUCAgICAgICAgICAgICAweDAwMEYwMDAwCi0jZGVmaW5lICAgTFNCX0VTQ0FQRV9QUkVGSVhfVVAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIE1BU0tfRVNDQVBFX1BSRUZJWF9ET1dOIDB4MDAwMEYwMDAKKyNkZWZpbmUgTFNCX0VTQ0FQRV9QUkVGSVhfRE9XTiAxMgogCi0jZGVmaW5lICAgTUFTS19FU0NBUEVfUFJFRklYX0RPV04gICAgICAgICAgIDB4MDAwMEYwMDAKLSNkZWZpbmUgICBMU0JfRVNDQVBFX1BSRUZJWF9ET1dOICAgICAgICAgICAgMTIKLQotI2RlZmluZSAgIE1BU0tfRVNDQVBFX1dPUkQgICAgICAgICAgICAgICAgICAweDAwMDAwRkZGCi0jZGVmaW5lICAgTUFTS19GTEFHX0EgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgICBNQVNLX0ZMQUdfQiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAotCisjZGVmaW5lIE1BU0tfRVNDQVBFX1dPUkQgMHgwMDAwMEZGRgorI2RlZmluZSBNQVNLX0ZMQUdfQSAweDAwMjAwMDAwCisjZGVmaW5lIE1BU0tfRkxBR19CIDB4MDAxMDAwMDAKIAogZXh0ZXJuIHZvaWQgRGVjb2RlTm9uUENXcyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgSF9IQ1JfSU5GTyBoSGNyKTsKIAotVUlOVCBIY3JfU3RhdGVfQk9EWV9PTkxZICAgICAgICAgICAgICAgICAoSEFORExFX0ZES19CSVRTVFJFQU0sIHZvaWQqKTsKLVVJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9fQk9EWSAgICAgICAgICAgKEhBTkRMRV9GREtfQklUU1RSRUFNLCB2b2lkKik7Ci1VSU5UIEhjcl9TdGF0ZV9CT0RZX1NJR05fX1NJR04gICAgICAgICAgIChIQU5ETEVfRkRLX0JJVFNUUkVBTSwgdm9pZCopOwotVUlOVCBIY3JfU3RhdGVfQk9EWV9TSUdOX0VTQ19fQk9EWSAgICAgICAoSEFORExFX0ZES19CSVRTVFJFQU0sIHZvaWQqKTsKLVVJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX1NJR04gICAgICAgKEhBTkRMRV9GREtfQklUU1RSRUFNLCB2b2lkKik7Ci1VSU5UIEhjcl9TdGF0ZV9CT0RZX1NJR05fRVNDX19FU0NfUFJFRklYIChIQU5ETEVfRkRLX0JJVFNUUkVBTSwgdm9pZCopOwotVUlOVCBIY3JfU3RhdGVfQk9EWV9TSUdOX0VTQ19fRVNDX1dPUkQgICAoSEFORExFX0ZES19CSVRTVFJFQU0sIHZvaWQqKTsKK1VJTlQgSGNyX1N0YXRlX0JPRFlfT05MWShIQU5ETEVfRkRLX0JJVFNUUkVBTSwgdm9pZCopOworVUlOVCBIY3JfU3RhdGVfQk9EWV9TSUdOX19CT0RZKEhBTkRMRV9GREtfQklUU1RSRUFNLCB2b2lkKik7CitVSU5UIEhjcl9TdGF0ZV9CT0RZX1NJR05fX1NJR04oSEFORExFX0ZES19CSVRTVFJFQU0sIHZvaWQqKTsKK1VJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0JPRFkoSEFORExFX0ZES19CSVRTVFJFQU0sIHZvaWQqKTsKK1VJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX1NJR04oSEFORExFX0ZES19CSVRTVFJFQU0sIHZvaWQqKTsKK1VJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0VTQ19QUkVGSVgoSEFORExFX0ZES19CSVRTVFJFQU0sIHZvaWQqKTsKK1VJTlQgSGNyX1N0YXRlX0JPRFlfU0lHTl9FU0NfX0VTQ19XT1JEKEhBTkRMRV9GREtfQklUU1RSRUFNLCB2b2lkKik7CiAKLSNlbmRpZiAvKiBfQUFDREVDX0hDUlNfSF8gKi8KLQorI2VuZGlmIC8qIEFBQ0RFQ19IQ1JTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX3Bucy5jcHAgYi9saWJBQUNkZWMvc3JjL2FhY2RlY19wbnMuY3BwCmluZGV4IDU0MWVmMDcuLjQzMmNkNGUgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX3Bucy5jcHAKKysrIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNfcG5zLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxOCArOTAsMTggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKwogICAgRGVzY3JpcHRpb246IHBlcmNlcHR1YWwgbm9pc2Ugc3Vic3RpdHV0aW9uIHRvb2wKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImFhY2RlY19wbnMuaCIKIAotCiAjaW5jbHVkZSAiYWFjX3JhbS5oIgogI2luY2x1ZGUgImFhY19yb20uaCIKICNpbmNsdWRlICJjaGFubmVsaW5mby5oIgpAQCAtOTksNDUgKzExMCwzOCBAQAogCiAjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKIAotCi0jZGVmaW5lIE5PSVNFX09GRlNFVCA5MCAgICAgICAgICAgLyogY2YuIElTTyAxNDQ5Ni0zIHAuIDE3NSAqLworI2RlZmluZSBOT0lTRV9PRkZTRVQgOTAgLyogY2YuIElTTyAxNDQ5Ni0zIHAuIDE3NSAqLwogCiAvKiEKICAgXGJyaWVmIFJlc2V0IEludGVyQ2hhbm5lbCBhbmQgUE5TIGRhdGEKIAogICBUaGUgZnVuY3Rpb24gcmVzZXRzIHRoZSBJbnRlckNoYW5uZWwgYW5kIFBOUyBkYXRhCiAqLwotdm9pZCBDUG5zX1Jlc2V0RGF0YSgKLSAgICBDUG5zRGF0YSAqcFBuc0RhdGEsCi0gICAgQ1Buc0ludGVyQ2hhbm5lbERhdGEgKnBQbnNJbnRlckNoYW5uZWxEYXRhCi0gICAgKQotewordm9pZCBDUG5zX1Jlc2V0RGF0YShDUG5zRGF0YSAqcFBuc0RhdGEsCisgICAgICAgICAgICAgICAgICAgIENQbnNJbnRlckNoYW5uZWxEYXRhICpwUG5zSW50ZXJDaGFubmVsRGF0YSkgeworICBGREtfQVNTRVJUKHBQbnNEYXRhICE9IE5VTEwpOworICBGREtfQVNTRVJUKHBQbnNJbnRlckNoYW5uZWxEYXRhICE9IE5VTEwpOwogICAvKiBBc3NpZ24gcG9pbnRlciBhbHdheXMsIHNpbmNlIHBQbnNEYXRhIGlzIG5vdCBwZXJzaXN0ZW50IGRhdGEgKi8KICAgcFBuc0RhdGEtPnBQbnNJbnRlckNoYW5uZWxEYXRhID0gcFBuc0ludGVyQ2hhbm5lbERhdGE7CiAgIHBQbnNEYXRhLT5QbnNBY3RpdmUgPSAwOwogICBwUG5zRGF0YS0+Q3VycmVudEVuZXJneSA9IDA7CiAKLSAgRkRLbWVtY2xlYXIocFBuc0RhdGEtPnBuc1VzZWQsKDgqMTYpKnNpemVvZihVQ0hBUikpOwotICBGREttZW1jbGVhcihwUG5zSW50ZXJDaGFubmVsRGF0YS0+Y29ycmVsYXRlZCwoOCoxNikqc2l6ZW9mKFVDSEFSKSk7CisgIEZES21lbWNsZWFyKHBQbnNEYXRhLT5wbnNVc2VkLCAoOCAqIDE2KSAqIHNpemVvZihVQ0hBUikpOworICBGREttZW1jbGVhcihwUG5zSW50ZXJDaGFubmVsRGF0YS0+Y29ycmVsYXRlZCwgKDggKiAxNikgKiBzaXplb2YoVUNIQVIpKTsKIH0KIAogLyohCi0gIFxicmllZiBJbml0aWFsaXplIFBOUyBkYXRhCisgIFxicmllZiBVcGRhdGUgUE5TIG5vaXNlIGdlbmVyYXRvciBzdGF0ZS4KIAotICBUaGUgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIFBOUyBkYXRhCisgIFRoZSBmdW5jdGlvbiBzZXRzIHRoZSBzZWVkIGZvciBQTlMgbm9pc2UgZ2VuZXJhdGlvbi4KKyAgSXQgY2FuIGJlIHVzZWQgdG8gbGluayB0d28gb3IgbW9yZSBjaGFubmVscyBpbiB0ZXJtcyBvZiBQTlMuCiAqLwotdm9pZCBDUG5zX0luaXRQbnMoCi0gICAgQ1Buc0RhdGEgKnBQbnNEYXRhLAotICAgIENQbnNJbnRlckNoYW5uZWxEYXRhICpwUG5zSW50ZXJDaGFubmVsRGF0YSwKLSAgICBJTlQqIGN1cnJlbnRTZWVkLCBJTlQqIHJhbmRvbVNlZWQpCi17Ci0gIC8qIHNhdmUgcG9pbnRlciB0byBpbnRlciBjaGFubmVsIGRhdGEgKi8KLSAgcFBuc0RhdGEtPnBQbnNJbnRlckNoYW5uZWxEYXRhID0gcFBuc0ludGVyQ2hhbm5lbERhdGE7Ci0KK3ZvaWQgQ1Buc19VcGRhdGVOb2lzZVN0YXRlKENQbnNEYXRhICpwUG5zRGF0YSwgSU5UICpjdXJyZW50U2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcmFuZG9tU2VlZCkgewogICAvKiB1c2UgcG9pbnRlciBiZWNhdXNlIHNlZWQgaGFzIHRvIGJlCiAgICAgIHNhbWUsIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgISAqLwogICBwUG5zRGF0YS0+Y3VycmVudFNlZWQgPSBjdXJyZW50U2VlZDsKLSAgcFBuc0RhdGEtPnJhbmRvbVNlZWQgID0gcmFuZG9tU2VlZDsKKyAgcFBuc0RhdGEtPnJhbmRvbVNlZWQgPSByYW5kb21TZWVkOwogfQogCiAvKiEKQEAgLTE0OCwxMSArMTUyLDggQEAKIAogICBccmV0dXJuICBQTlMgdXNlZAogKi8KLWludCBDUG5zX0lzUG5zVXNlZCAoY29uc3QgQ1Buc0RhdGEgKnBQbnNEYXRhLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYW5kKQotewotICB1bnNpZ25lZCBwbnNfYmFuZCA9IGdyb3VwKjE2K2JhbmQ7CitpbnQgQ1Buc19Jc1Buc1VzZWQoY29uc3QgQ1Buc0RhdGEgKnBQbnNEYXRhLCBjb25zdCBpbnQgZ3JvdXAsIGNvbnN0IGludCBiYW5kKSB7CisgIHVuc2lnbmVkIHBuc19iYW5kID0gZ3JvdXAgKiAxNiArIGJhbmQ7CiAKICAgcmV0dXJuIHBQbnNEYXRhLT5wbnNVc2VkW3Buc19iYW5kXSAmIChVQ0hBUikxOwogfQpAQCAtMTYyLDEzICsxNjMsMTAgQEAKIAogICBUaGUgZnVuY3Rpb24gYWN0aXZhdGVzIHRoZSBub2lzZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBjaGFubmVsIHBhaXIKICovCi12b2lkIENQbnNfU2V0Q29ycmVsYXRpb24oQ1Buc0RhdGEgKnBQbnNEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBncm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3V0b2ZwaGFzZSkKLXsKK3ZvaWQgQ1Buc19TZXRDb3JyZWxhdGlvbihDUG5zRGF0YSAqcFBuc0RhdGEsIGNvbnN0IGludCBncm91cCwgY29uc3QgaW50IGJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG91dG9mcGhhc2UpIHsKICAgQ1Buc0ludGVyQ2hhbm5lbERhdGEgKnBJbnRlckNoYW5uZWxEYXRhID0gcFBuc0RhdGEtPnBQbnNJbnRlckNoYW5uZWxEYXRhOwotICB1bnNpZ25lZCBwbnNfYmFuZCA9IGdyb3VwKjE2K2JhbmQ7CisgIHVuc2lnbmVkIHBuc19iYW5kID0gZ3JvdXAgKiAxNiArIGJhbmQ7CiAKICAgcEludGVyQ2hhbm5lbERhdGEtPmNvcnJlbGF0ZWRbcG5zX2JhbmRdID0gKG91dG9mcGhhc2UpID8gMyA6IDE7CiB9CkBAIC0xODEsMTMgKzE3OSwxMCBAQAogCiAgIFxyZXR1cm4gIFBOUyBpcyBjb3JyZWxhdGVkCiAqLwotc3RhdGljCi1pbnQgQ1Buc19Jc0NvcnJlbGF0ZWQoY29uc3QgQ1Buc0RhdGEgKnBQbnNEYXRhLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBncm91cCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmFuZCkKLXsKK3N0YXRpYyBpbnQgQ1Buc19Jc0NvcnJlbGF0ZWQoY29uc3QgQ1Buc0RhdGEgKnBQbnNEYXRhLCBjb25zdCBpbnQgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYW5kKSB7CiAgIENQbnNJbnRlckNoYW5uZWxEYXRhICpwSW50ZXJDaGFubmVsRGF0YSA9IHBQbnNEYXRhLT5wUG5zSW50ZXJDaGFubmVsRGF0YTsKLSAgdW5zaWduZWQgcG5zX2JhbmQgPSBncm91cCoxNitiYW5kOworICB1bnNpZ25lZCBwbnNfYmFuZCA9IGdyb3VwICogMTYgKyBiYW5kOwogCiAgIHJldHVybiAocEludGVyQ2hhbm5lbERhdGEtPmNvcnJlbGF0ZWRbcG5zX2JhbmRdICYgMHgwMSkgPyAxIDogMDsKIH0KQEAgLTIwMCwxMyArMTk1LDEwIEBACiAKICAgXHJldHVybiAgUE5TIGlzIG91dC1vZi1waGFzZQogKi8KLXN0YXRpYwotaW50IENQbnNfSXNPdXRPZlBoYXNlKGNvbnN0IENQbnNEYXRhICpwUG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJhbmQpCi17CitzdGF0aWMgaW50IENQbnNfSXNPdXRPZlBoYXNlKGNvbnN0IENQbnNEYXRhICpwUG5zRGF0YSwgY29uc3QgaW50IGdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmFuZCkgewogICBDUG5zSW50ZXJDaGFubmVsRGF0YSAqcEludGVyQ2hhbm5lbERhdGEgPSBwUG5zRGF0YS0+cFBuc0ludGVyQ2hhbm5lbERhdGE7Ci0gIHVuc2lnbmVkIHBuc19iYW5kID0gZ3JvdXAqMTYrYmFuZDsKKyAgdW5zaWduZWQgcG5zX2JhbmQgPSBncm91cCAqIDE2ICsgYmFuZDsKIAogICByZXR1cm4gKHBJbnRlckNoYW5uZWxEYXRhLT5jb3JyZWxhdGVkW3Buc19iYW5kXSAmIDB4MDIpID8gMSA6IDA7CiB9CkBAIC0yMTYsMzYgKzIwOCwzMCBAQAogCiAgIFRoZSBmdW5jdGlvbiByZWFkcyB0aGUgUE5TIGluZm9ybWF0aW9uIGZyb20gdGhlIGJpdHN0cmVhbQogKi8KLXZvaWQgQ1Buc19SZWFkIChDUG5zRGF0YSAqcFBuc0RhdGEsCi0gICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCi0gICAgICAgICAgICAgICAgY29uc3QgQ29kZUJvb2tEZXNjcmlwdGlvbiAqaGNiLAotICAgICAgICAgICAgICAgIFNIT1JUICpwU2NhbGVGYWN0b3IsCi0gICAgICAgICAgICAgICAgVUNIQVIgZ2xvYmFsX2dhaW4sCi0gICAgICAgICAgICAgICAgaW50IGJhbmQsCi0gICAgICAgICAgICAgICAgaW50IGdyb3VwIC8qID0gMCAqLykKLXsKLSAgaW50IGRlbHRhIDsKLSAgVUlOVCBwbnNfYmFuZCA9IGdyb3VwKjE2K2JhbmQ7Cit2b2lkIENQbnNfUmVhZChDUG5zRGF0YSAqcFBuc0RhdGEsIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICAgICAgICAgY29uc3QgQ29kZUJvb2tEZXNjcmlwdGlvbiAqaGNiLCBTSE9SVCAqcFNjYWxlRmFjdG9yLAorICAgICAgICAgICAgICAgVUNIQVIgZ2xvYmFsX2dhaW4sIGludCBiYW5kLCBpbnQgZ3JvdXAgLyogPSAwICovKSB7CisgIGludCBkZWx0YTsKKyAgVUlOVCBwbnNfYmFuZCA9IGdyb3VwICogMTYgKyBiYW5kOwogCiAgIGlmIChwUG5zRGF0YS0+UG5zQWN0aXZlKSB7CiAgICAgLyogTmV4dCBQTlMgYmFuZCBjYXNlICovCi0gICAgZGVsdGEgPSBDQmxvY2tfRGVjb2RlSHVmZm1hbldvcmQgKGJzLCBoY2IpIC0gNjA7CisgICAgZGVsdGEgPSBDQmxvY2tfRGVjb2RlSHVmZm1hbldvcmQoYnMsIGhjYikgLSA2MDsKICAgfSBlbHNlIHsKICAgICAvKiBGaXJzdCBQTlMgYmFuZCBjYXNlICovCi0gICAgaW50IG5vaXNlU3RhcnRWYWx1ZSA9IEZES3JlYWRCaXRzKGJzLDkpOworICAgIGludCBub2lzZVN0YXJ0VmFsdWUgPSBGREtyZWFkQml0cyhicywgOSk7CiAKLSAgICBkZWx0YSA9IG5vaXNlU3RhcnRWYWx1ZSAtIDI1NiA7CisgICAgZGVsdGEgPSBub2lzZVN0YXJ0VmFsdWUgLSAyNTY7CiAgICAgcFBuc0RhdGEtPlBuc0FjdGl2ZSA9IDE7CiAgICAgcFBuc0RhdGEtPkN1cnJlbnRFbmVyZ3kgPSBnbG9iYWxfZ2FpbiAtIE5PSVNFX09GRlNFVDsKICAgfQogCi0gIHBQbnNEYXRhLT5DdXJyZW50RW5lcmd5ICs9IGRlbHRhIDsKKyAgcFBuc0RhdGEtPkN1cnJlbnRFbmVyZ3kgKz0gZGVsdGE7CiAgIHBTY2FsZUZhY3RvcltwbnNfYmFuZF0gPSBwUG5zRGF0YS0+Q3VycmVudEVuZXJneTsKIAogICBwUG5zRGF0YS0+cG5zVXNlZFtwbnNfYmFuZF0gPSAxOwogfQogCi0KIC8qKgogICogXGJyaWVmIEdlbmVyYXRlIGEgdmVjdG9yIG9mIG5vaXNlIG9mIGdpdmVuIGxlbmd0aC4gVGhlIG5vaXNlIHZhbHVlcyBhcmUKICAqICAgICAgICBzY2FsZWQgaW4gb3JkZXIgdG8geWllbGQgYSBub2lzZSBlbmVyZ3kgb2YgMS4wCkBAIC0yNTQsMzIgKzI0MCwyOSBAQAogICogXHBhcmFtIHBSYW5kb21TdGF0ZSBwb2ludGVyIHRvIHRoZSBzdGF0ZSBvZiB0aGUgcmFuZG9tIGdlbmVyYXRvciBiZWluZyB1c2VkLgogICogXHJldHVybiBleHBvbmVudCBvZiBnZW5lcmF0ZWQgbm9pc2UgdmVjdG9yLgogICovCi1zdGF0aWMgaW50IEdlbmVyYXRlUmFuZG9tVmVjdG9yIChGSVhQX0RCTCAqUkVTVFJJQ1Qgc3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBSYW5kb21TdGF0ZSkKLXsKK3N0YXRpYyBpbnQgR2VuZXJhdGVSYW5kb21WZWN0b3IoRklYUF9EQkwgKlJFU1RSSUNUIHNwZWMsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBSYW5kb21TdGF0ZSkgewogICBpbnQgaSwgaW52TnJnX2UgPSAwLCBucmdfZSA9IDA7Ci0gIEZJWFBfREJMIGludk5yZ19tLCBucmdfbSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpIDsKKyAgRklYUF9EQkwgaW52TnJnX20sIG5yZ19tID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgIEZJWFBfREJMICpSRVNUUklDVCBwdHIgPSBzcGVjOwogICBpbnQgcmFuZG9tU3RhdGUgPSAqcFJhbmRvbVN0YXRlOwogCiAjZGVmaW5lIEdFTl9OT0lTRV9OUkdfU0NBTEUgNwogCiAgIC8qIEdlbmVyYXRlIG5vaXNlIGFuZCBjYWxjdWxhdGUgZW5lcmd5LiAqLwotICBmb3IgKGk9MDsgaTxzaXplOyBpKyspCi0gIHsKLSAgICByYW5kb21TdGF0ZSA9ICgxNjY0NTI1TCAqIHJhbmRvbVN0YXRlKSArIDEwMTM5MDQyMjNMOyAvLyBOdW1lcmljYWwgUmVjaXBlcwotICAgIG5yZ19tID0gZlBvdzJBZGREaXYyKG5yZ19tLCAoRklYUF9EQkwpcmFuZG9tU3RhdGU+PkdFTl9OT0lTRV9OUkdfU0NBTEUpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgcmFuZG9tU3RhdGUgPQorICAgICAgICAoKChJTlQ2NCkxNjY0NTI1ICogcmFuZG9tU3RhdGUpICsgKElOVDY0KTEwMTM5MDQyMjMpICYgMHhGRkZGRkZGRjsKKyAgICBucmdfbSA9IGZQb3cyQWRkRGl2MihucmdfbSwgKEZJWFBfREJMKXJhbmRvbVN0YXRlID4+IEdFTl9OT0lTRV9OUkdfU0NBTEUpOwogICAgICpwdHIrKyA9IChGSVhQX0RCTClyYW5kb21TdGF0ZTsKICAgfQotICBucmdfZSA9IEdFTl9OT0lTRV9OUkdfU0NBTEUqMiArIDE7CisgIG5yZ19lID0gR0VOX05PSVNFX05SR19TQ0FMRSAqIDIgKyAxOwogCiAgIC8qIHdlaWdodCBub2lzZSB3aXRoID0gMSAvIHNxcnRfbnJnOyAqLwotICBpbnZOcmdfbSA9IGludlNxcnROb3JtMihucmdfbTw8MSwgJmludk5yZ19lKTsKLSAgaW52TnJnX2UgKz0gLSgobnJnX2UtMSk+PjEpOworICBpbnZOcmdfbSA9IGludlNxcnROb3JtMihucmdfbSA8PCAxLCAmaW52TnJnX2UpOworICBpbnZOcmdfZSArPSAtKChucmdfZSAtIDEpID4+IDEpOwogCi0gIGZvciAoaT1zaXplOyBpLS07ICkKLSAgeworICBmb3IgKGkgPSBzaXplOyBpLS07KSB7CiAgICAgc3BlY1tpXSA9IGZNdWx0KHNwZWNbaV0sIGludk5yZ19tKTsKICAgfQogCkBAIC0yODksOCArMjcyLDggQEAKICAgcmV0dXJuIGludk5yZ19lOwogfQogCi1zdGF0aWMgdm9pZCBTY2FsZUJhbmQgKEZJWFBfREJMICpSRVNUUklDVCBzcGVjLCBpbnQgc2l6ZSwgaW50IHNjYWxlRmFjdG9yLCBpbnQgc3BlY1NjYWxlLCBpbnQgbm9pc2VfZSwgaW50IG91dF9vZl9waGFzZSkKLXsKK3N0YXRpYyB2b2lkIFNjYWxlQmFuZChGSVhQX0RCTCAqUkVTVFJJQ1Qgc3BlYywgaW50IHNpemUsIGludCBzY2FsZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc3BlY1NjYWxlLCBpbnQgbm9pc2VfZSwgaW50IG91dF9vZl9waGFzZSkgewogICBpbnQgaSwgc2hpZnQsIHNmRXhwb25lbnQ7CiAgIEZJWFBfREJMIHNmTWF0aXNzYTsKIApAQCAtMzA4LDIwICsyOTEsMTkgQEAKICAgc2hpZnQgPSBzZkV4cG9uZW50IC0gc3BlY1NjYWxlICsgMSArIG5vaXNlX2U7CiAKICAgLyogQXBwbHkgZ2FpbiB0byBub2lzZSB2YWx1ZXMgKi8KLSAgaWYgKHNoaWZ0Pj0wKSB7Ci0gICAgc2hpZnQgPSBmaXhNaW4oIHNoaWZ0LCBERlJBQ1RfQklUUy0xICk7Ci0gICAgZm9yIChpID0gc2l6ZSA7IGktLSAhPSAwOyApIHsKLSAgICAgIHNwZWMgW2ldID0gZk11bHREaXYyIChzcGVjIFtpXSwgc2ZNYXRpc3NhKSA8PCBzaGlmdDsKKyAgaWYgKHNoaWZ0ID49IDApIHsKKyAgICBzaGlmdCA9IGZpeE1pbihzaGlmdCwgREZSQUNUX0JJVFMgLSAxKTsKKyAgICBmb3IgKGkgPSBzaXplOyBpLS0gIT0gMDspIHsKKyAgICAgIHNwZWNbaV0gPSBmTXVsdERpdjIoc3BlY1tpXSwgc2ZNYXRpc3NhKSA8PCBzaGlmdDsKICAgICB9CiAgIH0gZWxzZSB7Ci0gICAgc2hpZnQgPSBmaXhNaW4oIC1zaGlmdCwgREZSQUNUX0JJVFMtMSApOwotICAgIGZvciAoaSA9IHNpemUgOyBpLS0gIT0gMDsgKSB7Ci0gICAgICBzcGVjIFtpXSA9IGZNdWx0RGl2MiAoc3BlYyBbaV0sIHNmTWF0aXNzYSkgPj4gc2hpZnQ7CisgICAgc2hpZnQgPSBmaXhNaW4oLXNoaWZ0LCBERlJBQ1RfQklUUyAtIDEpOworICAgIGZvciAoaSA9IHNpemU7IGktLSAhPSAwOykgeworICAgICAgc3BlY1tpXSA9IGZNdWx0RGl2MihzcGVjW2ldLCBzZk1hdGlzc2EpID4+IHNoaWZ0OwogICAgIH0KICAgfQogfQogCi0KIC8qIQogICBcYnJpZWYgQXBwbHkgUE5TCiAKQEAgLTMyOSw1MSArMzExLDQ4IEBACiAgIGZsYWdnZWQgYXMgbm9pc3kgYmFuZHMKIAogKi8KLXZvaWQgQ1Buc19BcHBseSAoY29uc3QgQ1Buc0RhdGEgKnBQbnNEYXRhLAotICAgICAgICAgICAgICAgICBjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sCi0gICAgICAgICAgICAgICAgIFNQRUNUUkFMX1BUUiBwU3BlY3RydW0sCi0gICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUICAgICpwU3BlY1NjYWxlLAotICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCAgICAqcFNjYWxlRmFjdG9yLAotICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKLSAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGdyYW51bGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaGFubmVsKQotewordm9pZCBDUG5zX0FwcGx5KGNvbnN0IENQbnNEYXRhICpwUG5zRGF0YSwgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLAorICAgICAgICAgICAgICAgIFNQRUNUUkFMX1BUUiBwU3BlY3RydW0sIGNvbnN0IFNIT1JUICpwU3BlY1NjYWxlLAorICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUICpwU2NhbGVGYWN0b3IsCisgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgICAgICAgICAgICAgY29uc3QgSU5UIGdyYW51bGVMZW5ndGgsIGNvbnN0IGludCBjaGFubmVsKSB7CiAgIGlmIChwUG5zRGF0YS0+UG5zQWN0aXZlKSB7Ci0gICAgY29uc3Qgc2hvcnQgKkJhbmRPZmZzZXRzID0gR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cyhwSWNzSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8pOworICAgIGNvbnN0IHNob3J0ICpCYW5kT2Zmc2V0cyA9CisgICAgICAgIEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMocEljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKTsKIAogICAgIGludCBTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQgPSBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQocEljc0luZm8pOwogCi0gICAgZm9yIChpbnQgd2luZG93ID0gMCwgZ3JvdXAgPSAwOyBncm91cCA8IEdldFdpbmRvd0dyb3VwcyhwSWNzSW5mbyk7IGdyb3VwKyspIHsKLSAgICAgIGZvciAoaW50IGdyb3Vwd2luID0gMDsgZ3JvdXB3aW4gPCBHZXRXaW5kb3dHcm91cExlbmd0aChwSWNzSW5mbywgZ3JvdXApOyBncm91cHdpbisrLCB3aW5kb3crKykgeworICAgIGZvciAoaW50IHdpbmRvdyA9IDAsIGdyb3VwID0gMDsgZ3JvdXAgPCBHZXRXaW5kb3dHcm91cHMocEljc0luZm8pOworICAgICAgICAgZ3JvdXArKykgeworICAgICAgZm9yIChpbnQgZ3JvdXB3aW4gPSAwOyBncm91cHdpbiA8IEdldFdpbmRvd0dyb3VwTGVuZ3RoKHBJY3NJbmZvLCBncm91cCk7CisgICAgICAgICAgIGdyb3Vwd2luKyssIHdpbmRvdysrKSB7CiAgICAgICAgIEZJWFBfREJMICpzcGVjdHJ1bSA9IFNQRUMocFNwZWN0cnVtLCB3aW5kb3csIGdyYW51bGVMZW5ndGgpOwogCi0gICAgICAgIGZvciAoaW50IGJhbmQgPSAwIDsgYmFuZCA8IFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZDsgYmFuZCsrKSB7Ci0gICAgICAgICAgaWYgKENQbnNfSXNQbnNVc2VkIChwUG5zRGF0YSwgZ3JvdXAsIGJhbmQpKSB7Ci0gICAgICAgICAgICBVSU5UIHBuc19iYW5kID0gZ3JvdXAqMTYrYmFuZDsKKyAgICAgICAgZm9yIChpbnQgYmFuZCA9IDA7IGJhbmQgPCBTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgICAgIGlmIChDUG5zX0lzUG5zVXNlZChwUG5zRGF0YSwgZ3JvdXAsIGJhbmQpKSB7CisgICAgICAgICAgICBVSU5UIHBuc19iYW5kID0gd2luZG93ICogMTYgKyBiYW5kOwogCi0gICAgICAgICAgICBpbnQgYmFuZFdpZHRoID0gQmFuZE9mZnNldHMgW2JhbmQgKyAxXSAtIEJhbmRPZmZzZXRzIFtiYW5kXSA7CisgICAgICAgICAgICBpbnQgYmFuZFdpZHRoID0gQmFuZE9mZnNldHNbYmFuZCArIDFdIC0gQmFuZE9mZnNldHNbYmFuZF07CiAgICAgICAgICAgICBpbnQgbm9pc2VfZTsKIAogICAgICAgICAgICAgRkRLX0FTU0VSVChiYW5kV2lkdGggPj0gMCk7CiAKLSAgICAgICAgICAgIGlmIChjaGFubmVsID4gMCAmJiBDUG5zX0lzQ29ycmVsYXRlZChwUG5zRGF0YSwgZ3JvdXAsIGJhbmQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBub2lzZV9lID0gR2VuZXJhdGVSYW5kb21WZWN0b3IgKHNwZWN0cnVtICsgQmFuZE9mZnNldHMgW2JhbmRdLCBiYW5kV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFBuc0RhdGEtPnJhbmRvbVNlZWQgW3Buc19iYW5kXSkgOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwUG5zRGF0YS0+cmFuZG9tU2VlZCBbcG5zX2JhbmRdID0gKnBQbnNEYXRhLT5jdXJyZW50U2VlZCA7CisgICAgICAgICAgICBpZiAoY2hhbm5lbCA+IDAgJiYgQ1Buc19Jc0NvcnJlbGF0ZWQocFBuc0RhdGEsIGdyb3VwLCBiYW5kKSkgeworICAgICAgICAgICAgICBub2lzZV9lID0KKyAgICAgICAgICAgICAgICAgIEdlbmVyYXRlUmFuZG9tVmVjdG9yKHNwZWN0cnVtICsgQmFuZE9mZnNldHNbYmFuZF0sIGJhbmRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUG5zRGF0YS0+cmFuZG9tU2VlZFtwbnNfYmFuZF0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgcFBuc0RhdGEtPnJhbmRvbVNlZWRbcG5zX2JhbmRdID0gKnBQbnNEYXRhLT5jdXJyZW50U2VlZDsKIAotICAgICAgICAgICAgICBub2lzZV9lID0gR2VuZXJhdGVSYW5kb21WZWN0b3IgKHNwZWN0cnVtICsgQmFuZE9mZnNldHMgW2JhbmRdLCBiYW5kV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUG5zRGF0YS0+Y3VycmVudFNlZWQpIDsKKyAgICAgICAgICAgICAgbm9pc2VfZSA9IEdlbmVyYXRlUmFuZG9tVmVjdG9yKHNwZWN0cnVtICsgQmFuZE9mZnNldHNbYmFuZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kV2lkdGgsIHBQbnNEYXRhLT5jdXJyZW50U2VlZCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGludCBvdXRPZlBoYXNlICA9IENQbnNfSXNPdXRPZlBoYXNlIChwUG5zRGF0YSwgZ3JvdXAsIGJhbmQpOworICAgICAgICAgICAgaW50IG91dE9mUGhhc2UgPSBDUG5zX0lzT3V0T2ZQaGFzZShwUG5zRGF0YSwgZ3JvdXAsIGJhbmQpOwogCi0gICAgICAgICAgICBTY2FsZUJhbmQgKHNwZWN0cnVtICsgQmFuZE9mZnNldHMgW2JhbmRdLCBiYW5kV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgIHBTY2FsZUZhY3RvcltwbnNfYmFuZF0sCi0gICAgICAgICAgICAgICAgICAgICAgIHBTcGVjU2NhbGVbd2luZG93XSwgbm9pc2VfZSwgb3V0T2ZQaGFzZSkgOworICAgICAgICAgICAgU2NhbGVCYW5kKHNwZWN0cnVtICsgQmFuZE9mZnNldHNbYmFuZF0sIGJhbmRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICBwU2NhbGVGYWN0b3JbZ3JvdXAgKiAxNiArIGJhbmRdLCBwU3BlY1NjYWxlW3dpbmRvd10sCisgICAgICAgICAgICAgICAgICAgICAgbm9pc2VfZSwgb3V0T2ZQaGFzZSk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2FhY2RlY19wbnMuaCBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX3Bucy5oCmluZGV4IGZjOWJkY2IuLjQ1Y2Q5ODkgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX3Bucy5oCisrKyBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX3Bucy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIyICs5MCwyMiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorCiAgICBEZXNjcmlwdGlvbjogcGVyY2VwdHVhbCBub2lzZSBzdWJzdGl0dXRpb24gdG9vbAogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIFBOU19ICi0jZGVmaW5lIFBOU19ICisjaWZuZGVmIEFBQ0RFQ19QTlNfSAorI2RlZmluZSBBQUNERUNfUE5TX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAotCi0jZGVmaW5lIE5PX09GQkFORFMgKCg4KjE2KSkKKyNkZWZpbmUgTk9fT0ZCQU5EUyAoKDggKiAxNikpCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgVUNIQVIgY29ycmVsYXRlZFtOT19PRkJBTkRTXTsKQEAgLTEwMiwxOSArMTEzLDE3IEBACiAKIHR5cGVkZWYgc3RydWN0IHsKICAgQ1Buc0ludGVyQ2hhbm5lbERhdGEgKnBQbnNJbnRlckNoYW5uZWxEYXRhOwotICBVQ0hBUiAgcG5zVXNlZFtOT19PRkJBTkRTXTsKLSAgaW50ICAgIEN1cnJlbnRFbmVyZ3k7Ci0gIFVDSEFSICBQbnNBY3RpdmU7Ci0gIElOVCAgICpjdXJyZW50U2VlZDsKLSAgSU5UICAgKnJhbmRvbVNlZWQ7CisgIFVDSEFSIHBuc1VzZWRbTk9fT0ZCQU5EU107CisgIGludCBDdXJyZW50RW5lcmd5OworICBVQ0hBUiBQbnNBY3RpdmU7CisgIElOVCAqY3VycmVudFNlZWQ7CisgIElOVCAqcmFuZG9tU2VlZDsKIH0gQ1Buc0RhdGE7CiAKLXZvaWQgQ1Buc19Jbml0UG5zICggQ1Buc0RhdGEgKnBQbnNEYXRhLAotICAgICAgICAgICAgICAgICAgICBDUG5zSW50ZXJDaGFubmVsRGF0YSAqcFBuc0ludGVyQ2hhbm5lbERhdGEsCi0gICAgICAgICAgICAgICAgICAgIElOVCogY3VycmVudFNlZWQsCi0gICAgICAgICAgICAgICAgICAgIElOVCogcmFuZG9tU2VlZCApOwordm9pZCBDUG5zX1VwZGF0ZU5vaXNlU3RhdGUoQ1Buc0RhdGEgKnBQbnNEYXRhLCBJTlQgKmN1cnJlbnRTZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpyYW5kb21TZWVkKTsKIAotdm9pZCBDUG5zX1Jlc2V0RGF0YSAoIENQbnNEYXRhICpwUG5zRGF0YSwgQ1Buc0ludGVyQ2hhbm5lbERhdGEgKnBQbnNJbnRlckNoYW5uZWxEYXRhICk7Cit2b2lkIENQbnNfUmVzZXREYXRhKENQbnNEYXRhICpwUG5zRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQ1Buc0ludGVyQ2hhbm5lbERhdGEgKnBQbnNJbnRlckNoYW5uZWxEYXRhKTsKIAotCi0jZW5kaWYgLyogI2lmbmRlZiBQTlNfSCAqLworI2VuZGlmIC8qICNpZm5kZWYgQUFDREVDX1BOU19IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2FhY2RlY190bnMuY3BwIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNfdG5zLmNwcAppbmRleCAzNTJmMDRhLi5mYjNmZTMzIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY2RlY190bnMuY3BwCisrKyBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX3Rucy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjEgKzkwLDI0IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKICAgIERlc2NyaXB0aW9uOiB0ZW1wb3JhbCBub2lzZSBzaGFwaW5nIHRvb2wKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImFhY2RlY190bnMuaCIKICNpbmNsdWRlICJhYWNfcm9tLmgiCiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgogI2luY2x1ZGUgImNoYW5uZWxpbmZvLmgiCiAKKyNpbmNsdWRlICJGREtfbHBjLmgiCiAKKyNkZWZpbmUgVE5TX01BWElNVU1fT1JERVJfQUFDIDEyCiAKIC8qIQogICBcYnJpZWYgUmVzZXQgdG5zIGRhdGEKQEAgLTEwMiwxOSArMTE2LDIwIEBACiAKICAgXHJldHVybiAgbm9uZQogKi8KLXZvaWQgQ1Ruc19SZXNldChDVG5zRGF0YSAqcFRuc0RhdGEpCi17Cit2b2lkIENUbnNfUmVzZXQoQ1Ruc0RhdGEgKnBUbnNEYXRhKSB7CiAgIC8qIE5vdGU6IHRoZSBmb2xsb3dpbmcgRkRLbWVtY2xlYXIgc2hvdWxkIG5vdCBiZSByZXF1aXJlZC4gKi8KLSAgRkRLbWVtY2xlYXIocFRuc0RhdGEtPkZpbHRlciwgVE5TX01BWF9XSU5ET1dTKlROU19NQVhJTVVNX0ZJTFRFUlMqc2l6ZW9mKENGaWx0ZXIpKTsKLSAgRkRLbWVtY2xlYXIocFRuc0RhdGEtPk51bWJlck9mRmlsdGVycywgVE5TX01BWF9XSU5ET1dTKnNpemVvZihVQ0hBUikpOworICBGREttZW1jbGVhcihwVG5zRGF0YS0+RmlsdGVyLAorICAgICAgICAgICAgICBUTlNfTUFYX1dJTkRPV1MgKiBUTlNfTUFYSU1VTV9GSUxURVJTICogc2l6ZW9mKENGaWx0ZXIpKTsKKyAgRkRLbWVtY2xlYXIocFRuc0RhdGEtPk51bWJlck9mRmlsdGVycywgVE5TX01BWF9XSU5ET1dTICogc2l6ZW9mKFVDSEFSKSk7CiAgIHBUbnNEYXRhLT5EYXRhUHJlc2VudCA9IDA7CiAgIHBUbnNEYXRhLT5BY3RpdmUgPSAwOwogfQogCi12b2lkIENUbnNfUmVhZERhdGFQcmVzZW50RmxhZyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgICAgLyohPCBwb2ludGVyIHRvIGJpdHN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1Ruc0RhdGEgKnBUbnNEYXRhKSAgICAgICAgIC8qITwgcG9pbnRlciB0byBhYWMgZGVjb2RlciBjaGFubmVsIGluZm8gKi8KK3ZvaWQgQ1Ruc19SZWFkRGF0YVByZXNlbnRGbGFnKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCAvKiE8IHBvaW50ZXIgdG8gYml0c3RyZWFtICovCisgICAgQ1Ruc0RhdGEgKnBUbnNEYXRhKSAgICAgIC8qITwgcG9pbnRlciB0byBhYWMgZGVjb2RlciBjaGFubmVsIGluZm8gKi8KIHsKLSAgcFRuc0RhdGEtPkRhdGFQcmVzZW50ID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywxKTsKKyAgcFRuc0RhdGEtPkRhdGFQcmVzZW50ID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCAxKTsKIH0KIAogLyohCkBAIC0xMjUsODMgKzE0MCw4OSBAQAogCiAgIFxyZXR1cm4gIG5vbmUKICovCi1BQUNfREVDT0RFUl9FUlJPUiBDVG5zX1JlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1Ruc0RhdGEgKnBUbnNEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzKQotewotICBVQ0hBUiBuX2ZpbHQsb3JkZXI7Ci0gIFVDSEFSIGxlbmd0aCxjb2VmX3Jlcyxjb2VmX2NvbXByZXNzOworQUFDX0RFQ09ERVJfRVJST1IgQ1Ruc19SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBDVG5zRGF0YSAqcFRuc0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLCBjb25zdCBVSU5UIGZsYWdzKSB7CisgIFVDSEFSIG5fZmlsdCwgb3JkZXI7CisgIFVDSEFSIGxlbmd0aCwgY29lZl9yZXMsIGNvZWZfY29tcHJlc3M7CiAgIFVDSEFSIHdpbmRvdzsKLSAgVUNIQVIgd2luc19wZXJfZnJhbWUgPSBHZXRXaW5kb3dzUGVyRnJhbWUocEljc0luZm8pOwotICBVQ0hBUiBpc0xvbmdGbGFnID0gSXNMb25nQmxvY2socEljc0luZm8pOworICBVQ0hBUiB3aW5zX3Blcl9mcmFtZTsKKyAgVUNIQVIgaXNMb25nRmxhZzsKKyAgVUNIQVIgc3RhcnRfd2luZG93OwogICBBQUNfREVDT0RFUl9FUlJPUiBFcnJvclN0YXR1cyA9IEFBQ19ERUNfT0s7CiAKICAgaWYgKCFwVG5zRGF0YS0+RGF0YVByZXNlbnQpIHsKICAgICByZXR1cm4gRXJyb3JTdGF0dXM7CiAgIH0KIAotICBmb3IgKHdpbmRvdyA9IDA7IHdpbmRvdyA8IHdpbnNfcGVyX2ZyYW1lOyB3aW5kb3crKykKICAgewotICAgIHBUbnNEYXRhLT5OdW1iZXJPZkZpbHRlcnNbd2luZG93XSA9IG5fZmlsdCA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsIGlzTG9uZ0ZsYWcgPyAyIDogMSk7CisgICAgc3RhcnRfd2luZG93ID0gMDsKKyAgICB3aW5zX3Blcl9mcmFtZSA9IEdldFdpbmRvd3NQZXJGcmFtZShwSWNzSW5mbyk7CisgICAgaXNMb25nRmxhZyA9IElzTG9uZ0Jsb2NrKHBJY3NJbmZvKTsKKyAgfQogCi0gICAgaWYgKHBUbnNEYXRhLT5OdW1iZXJPZkZpbHRlcnNbd2luZG93XSA+IFROU19NQVhJTVVNX0ZJTFRFUlMpewotICAgICAgICBwVG5zRGF0YS0+TnVtYmVyT2ZGaWx0ZXJzW3dpbmRvd10gPSBuX2ZpbHQgPSBUTlNfTUFYSU1VTV9GSUxURVJTOwotICAgIH0KKyAgcFRuc0RhdGEtPkdhaW5MZCA9IDA7CiAKLSAgICBpZiAobl9maWx0KQotICAgIHsKKyAgZm9yICh3aW5kb3cgPSBzdGFydF93aW5kb3c7IHdpbmRvdyA8IHdpbnNfcGVyX2ZyYW1lOyB3aW5kb3crKykgeworICAgIHBUbnNEYXRhLT5OdW1iZXJPZkZpbHRlcnNbd2luZG93XSA9IG5fZmlsdCA9CisgICAgICAgIChVQ0hBUilGREtyZWFkQml0cyhicywgaXNMb25nRmxhZyA/IDIgOiAxKTsKKworICAgIGlmIChuX2ZpbHQpIHsKICAgICAgIGludCBpbmRleDsKICAgICAgIFVDSEFSIG5leHRzdG9wYmFuZDsKIAotICAgICAgY29lZl9yZXMgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDEpOworICAgICAgY29lZl9yZXMgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDEpOwogCiAgICAgICBuZXh0c3RvcGJhbmQgPSBHZXRTY2FsZUZhY3RvckJhbmRzVG90YWwocEljc0luZm8pOwogCi0gICAgICBmb3IgKGluZGV4PTA7IGluZGV4IDwgbl9maWx0OyBpbmRleCsrKQotICAgICAgeworICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbl9maWx0OyBpbmRleCsrKSB7CiAgICAgICAgIENGaWx0ZXIgKmZpbHRlciA9ICZwVG5zRGF0YS0+RmlsdGVyW3dpbmRvd11baW5kZXhdOwogCiAgICAgICAgIGxlbmd0aCA9IChVQ0hBUilGREtyZWFkQml0cyhicywgaXNMb25nRmxhZyA/IDYgOiA0KTsKIAotICAgICAgICBpZiAobGVuZ3RoID4gbmV4dHN0b3BiYW5kKXsKKyAgICAgICAgaWYgKGxlbmd0aCA+IG5leHRzdG9wYmFuZCkgewogICAgICAgICAgIGxlbmd0aCA9IG5leHRzdG9wYmFuZDsKICAgICAgICAgfQogCiAgICAgICAgIGZpbHRlci0+U3RhcnRCYW5kID0gbmV4dHN0b3BiYW5kIC0gbGVuZ3RoOwotICAgICAgICBmaWx0ZXItPlN0b3BCYW5kICA9IG5leHRzdG9wYmFuZDsKKyAgICAgICAgZmlsdGVyLT5TdG9wQmFuZCA9IG5leHRzdG9wYmFuZDsKICAgICAgICAgbmV4dHN0b3BiYW5kID0gZmlsdGVyLT5TdGFydEJhbmQ7CiAKLSAgICAgICAgewotICAgICAgICAgIGZpbHRlci0+T3JkZXIgPSBvcmRlciA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsIGlzTG9uZ0ZsYWcgPyA1IDogMyk7CisgICAgICAgIGlmIChmbGFncyAmIChBQ19VU0FDIHwgQUNfUlNWRDUwIHwgQUNfUlNWNjAzREEpKSB7CisgICAgICAgICAgLyogbWF4KE9yZGVyKSA9IDE1IChsb25nKSwgNyAoc2hvcnQpICovCisgICAgICAgICAgZmlsdGVyLT5PcmRlciA9IG9yZGVyID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCBpc0xvbmdGbGFnID8gNCA6IDMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZpbHRlci0+T3JkZXIgPSBvcmRlciA9IChVQ0hBUilGREtyZWFkQml0cyhicywgaXNMb25nRmxhZyA/IDUgOiAzKTsKKworICAgICAgICAgIGlmIChmaWx0ZXItPk9yZGVyID4gVE5TX01BWElNVU1fT1JERVIpIHsKKyAgICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19UTlNfUkVBRF9FUlJPUjsKKyAgICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKKyAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZmlsdGVyLT5PcmRlciA+IFROU19NQVhJTVVNX09SREVSKXsKLSAgICAgICAgICBmaWx0ZXItPk9yZGVyID0gb3JkZXIgPSBUTlNfTUFYSU1VTV9PUkRFUjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvcmRlcikKLSAgICAgICAgewotICAgICAgICAgIFVDSEFSIGNvZWYsc19tYXNrOworICAgICAgICBGREtfQVNTRVJUKG9yZGVyIDw9CisgICAgICAgICAgICAgICAgICAgVE5TX01BWElNVU1fT1JERVIpOyAvKiBhdm9pZCBpbGxlZ2FsIG1lbW9yeSBhY2Nlc3MgKi8KKyAgICAgICAgaWYgKG9yZGVyKSB7CisgICAgICAgICAgVUNIQVIgY29lZiwgc19tYXNrOwogICAgICAgICAgIFVDSEFSIGk7CiAgICAgICAgICAgU0NIQVIgbl9tYXNrOwotICAgICAgICAgIHN0YXRpYyBjb25zdCBVQ0hBUiBzZ25fbWFza1tdID0geyAgMHgyLCAgMHg0LCAgMHg4IH07Ci0gICAgICAgICAgc3RhdGljIGNvbnN0IFNDSEFSIG5lZ19tYXNrW10gPSB7IH4weDMsIH4weDcsIH4weEYgfTsKIAotICAgICAgICAgIGZpbHRlci0+RGlyZWN0aW9uID0gRkRLcmVhZEJpdHMoYnMsMSkgPyAtMSA6IDE7CisgICAgICAgICAgc3RhdGljIGNvbnN0IFVDSEFSIHNnbl9tYXNrW10gPSB7MHgyLCAweDQsIDB4OH07CisgICAgICAgICAgc3RhdGljIGNvbnN0IFNDSEFSIG5lZ19tYXNrW10gPSB7fjB4MywgfjB4NywgfjB4Rn07CiAKLSAgICAgICAgICBjb2VmX2NvbXByZXNzID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywxKTsKKyAgICAgICAgICBmaWx0ZXItPkRpcmVjdGlvbiA9IEZES3JlYWRCaXRzKGJzLCAxKSA/IC0xIDogMTsKKworICAgICAgICAgIGNvZWZfY29tcHJlc3MgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDEpOwogCiAgICAgICAgICAgZmlsdGVyLT5SZXNvbHV0aW9uID0gY29lZl9yZXMgKyAzOwogCiAgICAgICAgICAgc19tYXNrID0gc2duX21hc2tbY29lZl9yZXMgKyAxIC0gY29lZl9jb21wcmVzc107CiAgICAgICAgICAgbl9tYXNrID0gbmVnX21hc2tbY29lZl9yZXMgKyAxIC0gY29lZl9jb21wcmVzc107CiAKLSAgICAgICAgICBmb3IgKGk9MDsgaSA8IG9yZGVyOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgY29lZiA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsZmlsdGVyLT5SZXNvbHV0aW9uIC0gY29lZl9jb21wcmVzcyk7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9yZGVyOyBpKyspIHsKKyAgICAgICAgICAgIGNvZWYgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIGZpbHRlci0+UmVzb2x1dGlvbiAtIGNvZWZfY29tcHJlc3MpOwogICAgICAgICAgICAgZmlsdGVyLT5Db2VmZltpXSA9IChjb2VmICYgc19tYXNrKSA/IChjb2VmIHwgbl9tYXNrKSA6IGNvZWY7CiAgICAgICAgICAgfQorICAgICAgICAgIHBUbnNEYXRhLT5HYWluTGQgPSA0OwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtMjEyLDExNSArMjMzLDM1IEBACiAgIHJldHVybiBFcnJvclN0YXR1czsKIH0KIAordm9pZCBDVG5zX1JlYWREYXRhUHJlc2VudFVzYWMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBDVG5zRGF0YSAqcFRuc0RhdGEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1Ruc0RhdGEgKnBUbnNEYXRhMSwgVUNIQVIgKnB0bnNfb25fbHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sIGNvbnN0IFVJTlQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGVsRmxhZ3MsIGNvbnN0IGludCBmQ29tbW9uV2luZG93KSB7CisgIGludCBjb21tb25fdG5zID0gMDsKIAotc3RhdGljIHZvaWQgQ1Ruc19GaWx0ZXIgKEZJWFBfREJMICpzcGVjLCBpbnQgc2l6ZSwgaW50IGluYywgRklYUF9UQ0MgY29lZmYgW10sIGludCBvcmRlcikKLXsKLSAgLy8gLSBTaW1wbGUgYWxsLXBvbGUgZmlsdGVyIG9mIG9yZGVyICJvcmRlciIgZGVmaW5lZCBieQotICAvLyAgIHkobikgPSAgeChuKSAtIGEoMikqeShuLTEpIC0gLi4uIC0gYShvcmRlcisxKSp5KG4tb3JkZXIpCi0gIC8vCi0gIC8vIC0gVGhlIHN0YXRlIHZhcmlhYmxlcyBvZiB0aGUgZmlsdGVyIGFyZSBpbml0aWFsaXplZCB0byB6ZXJvIGV2ZXJ5IHRpbWUKLSAgLy8KLSAgLy8gLSBUaGUgb3V0cHV0IGRhdGEgaXMgd3JpdHRlbiBvdmVyIHRoZSBpbnB1dCBkYXRhICgiaW4tcGxhY2Ugb3BlcmF0aW9uIikKLSAgLy8KLSAgLy8gLSBBbiBpbnB1dCB2ZWN0b3Igb2YgInNpemUiIHNhbXBsZXMgaXMgcHJvY2Vzc2VkIGFuZCB0aGUgaW5kZXggaW5jcmVtZW50Ci0gIC8vICAgdG8gdGhlIG5leHQgZGF0YSBzYW1wbGUgaXMgZ2l2ZW4gYnkgImluYyIKLQotICBpbnQgaSxqLE47Ci0gIEZJWFBfREJMICpwU3BlYzsKLSAgRklYUF9EQkwgbWF4VmFsPUZMMkZYQ09OU1RfREJMKDAuMCk7Ci0gIElOVCBzOwotCi0gIEZES19BU1NFUlQob3JkZXIgPD0gVE5TX01BWElNVU1fT1JERVIpOwotICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoc3RhdGUsIEZJWFBfREJMLCBUTlNfTUFYSU1VTV9PUkRFUik7Ci0gIEZES21lbWNsZWFyKHN0YXRlLCBvcmRlcipzaXplb2YoRklYUF9EQkwpKTsKLQotICBmb3IgKGk9MDsgaTxzaXplOyBpKyspIHsKLSAgICBtYXhWYWwgPSBmaXhNYXgobWF4VmFsLGZpeHBfYWJzKHNwZWNbaV0pKTsKKyAgaWYgKGZDb21tb25XaW5kb3cpIHsKKyAgICBjb21tb25fdG5zID0gRkRLcmVhZEJpdChoQnMpOwogICB9CisgIHsgKnB0bnNfb25fbHIgPSBGREtyZWFkQml0KGhCcyk7IH0KKyAgaWYgKGNvbW1vbl90bnMpIHsKKyAgICBwVG5zRGF0YTAtPkRhdGFQcmVzZW50ID0gMTsKKyAgICBDVG5zX1JlYWQoaEJzLCBwVG5zRGF0YTAsIHBJY3NJbmZvLCBmbGFncyk7CiAKLSAgaWYgKCBtYXhWYWwgPiBGTDJGWENPTlNUX0RCTCgwLjAzMTI1KjAuNzA3MTA2NzgxMTgpICkKLSAgICBzID0gZml4TWF4KENudExlYWRpbmdaZXJvcyhtYXhWYWwpLTYsMCk7Ci0gIGVsc2UKLSAgICBzID0gZml4TWF4KENudExlYWRpbmdaZXJvcyhtYXhWYWwpLTUsMCk7CisgICAgcFRuc0RhdGEwLT5EYXRhUHJlc2VudCA9IDA7CisgICAgcFRuc0RhdGEwLT5BY3RpdmUgPSAxOworICAgICpwVG5zRGF0YTEgPSAqcFRuc0RhdGEwOworICB9IGVsc2UgeworICAgIGludCB0bnNfcHJlc2VudF9ib3RoOwogCi0gIHMgPSBmaXhNaW4ocywyKTsKLSAgcyA9IHMtMTsKLQotICBpZiAoaW5jID09IC0xKQotICAgIHBTcGVjID0gJnNwZWNbc2l6ZSAtIDFdOwotICBlbHNlCi0gICAgcFNwZWMgPSAmc3BlY1swXTsKLQotICBGSVhQX1RDQyAqcENvZWZmOwotCi0jZGVmaW5lIEZJUlNUX1BBUlRfRkxUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRklYUF9EQkwgeCwgKnBTdGF0ZSA9IHN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcENvZWZmID0gY29lZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHMgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB4ID0gKHBTcGVjIFswXT4+MSkgKyBmTXVsdERpdjIgKCpwQ29lZmYrKywgcFN0YXRlIFswXSkgOyAgICAgICBcCi0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB4ID0gKHBTcGVjIFswXTw8cykgKyBmTXVsdERpdjIgKCpwQ29lZmYrKywgcFN0YXRlIFswXSkgOwotCi0jZGVmaW5lIElOTkVSX0ZMVFJfSU5MSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB4ID0gZk11bHRBZGREaXYyICh4LCAqcENvZWZmLCBwU3RhdGUgWzFdKTsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBwU3RhdGUgWzBdID0gcFN0YXRlIFsxXSAtIChmTXVsdERpdjIgKCpwQ29lZmYrKywgeCkgPDwyKSA7ICAgICBcCi0gICAgICBwU3RhdGUrKzsKLQotI2RlZmluZSBMQVNUX1BBUlRfRkxUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKHMgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAqcFNwZWMgPSB4IDw8IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAqcFNwZWMgPSB4ID4+IHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKnBTdGF0ZSA9KC14KSA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcFNwZWMgICArPSBpbmMgOwotCi0KLSAgIGlmIChvcmRlcj44KQotICAgewotICAgICAgTiA9IChvcmRlci0xKSY3OwotCi0gICAgICBmb3IgKGkgPSBzaXplIDsgaSAhPSAwIDsgaS0tKQotICAgICAgewotICAgICAgICBGSVJTVF9QQVJUX0ZMVFIKLQotICAgICAgICBmb3IgKGogPSBOOyBqID4gMCA7IGotLSkgeyBJTk5FUl9GTFRSX0lOTElORSB9Ci0KLSAgICAgICAgSU5ORVJfRkxUUl9JTkxJTkUgSU5ORVJfRkxUUl9JTkxJTkUgSU5ORVJfRkxUUl9JTkxJTkUgSU5ORVJfRkxUUl9JTkxJTkUKLSAgICAgICAgSU5ORVJfRkxUUl9JTkxJTkUgSU5ORVJfRkxUUl9JTkxJTkUgSU5ORVJfRkxUUl9JTkxJTkUgSU5ORVJfRkxUUl9JTkxJTkUKLQotICAgICAgICBMQVNUX1BBUlRfRkxUUgotICAgICAgfQotCi0gICB9IGVsc2UgaWYgKG9yZGVyPjQpIHsKLQotICAgICAgTiA9IChvcmRlci0xKSYzOwotCi0gICAgICBmb3IgKGkgPSBzaXplIDsgaSAhPSAwIDsgaS0tKQotICAgICAgewotICAgICAgICBGSVJTVF9QQVJUX0ZMVFIKLSAgICAgICAgZm9yIChqID0gTjsgaiA+IDAgOyBqLS0pIHsgSU5ORVJfRkxUUl9JTkxJTkUgfQotCi0gICAgICAgIElOTkVSX0ZMVFJfSU5MSU5FIElOTkVSX0ZMVFJfSU5MSU5FIElOTkVSX0ZMVFJfSU5MSU5FIElOTkVSX0ZMVFJfSU5MSU5FCi0KLSAgICAgICAgTEFTVF9QQVJUX0ZMVFIKLSAgICAgIH0KLQotICAgfSBlbHNlIHsKLQotICAgICAgTiA9IG9yZGVyLTE7Ci0KLSAgICAgIGZvciAoaSA9IHNpemUgOyBpICE9IDAgOyBpLS0pCi0gICAgICB7Ci0gICAgICAgIEZJUlNUX1BBUlRfRkxUUgotCi0gICAgICAgIGZvciAoaiA9IE47IGogPiAwIDsgai0tKSB7IElOTkVSX0ZMVFJfSU5MSU5FIH0KLQotICAgICAgICBMQVNUX1BBUlRfRkxUUgotICAgICAgfQotICAgfQotCi0gICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHN0YXRlLCBGSVhQX0RCTCwgVE5TX01BWElNVU1fT1JERVIpOworICAgIHRuc19wcmVzZW50X2JvdGggPSBGREtyZWFkQml0KGhCcyk7CisgICAgaWYgKHRuc19wcmVzZW50X2JvdGgpIHsKKyAgICAgIHBUbnNEYXRhMC0+RGF0YVByZXNlbnQgPSAxOworICAgICAgcFRuc0RhdGExLT5EYXRhUHJlc2VudCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHBUbnNEYXRhMS0+RGF0YVByZXNlbnQgPSBGREtyZWFkQml0KGhCcyk7CisgICAgICBwVG5zRGF0YTAtPkRhdGFQcmVzZW50ID0gIXBUbnNEYXRhMS0+RGF0YVByZXNlbnQ7CisgICAgfQorICB9CiB9CiAKIC8qIQpAQCAtMzMwLDgzICsyNzEsOTEgQEAKIAogICBccmV0dXJuICBub25lCiAqLwotdm9pZCBDVG5zX0FwcGx5ICgKLSAgICAgICAgQ1Ruc0RhdGEgKlJFU1RSSUNUIHBUbnNEYXRhLCAvKiE8IHBvaW50ZXIgdG8gYWFjIGRlY29kZXIgaW5mbyAqLwotICAgICAgICBjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sCi0gICAgICAgIFNQRUNUUkFMX1BUUiBwU3BlY3RyYWxDb2VmZmljaWVudCwKLSAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgIGNvbnN0IElOVCBncmFudWxlTGVuZ3RoCi0gICAgICAgICkKLXsKLSAgaW50IHdpbmRvdyxpbmRleCxzdGFydCxzdG9wLHNpemU7Cit2b2lkIENUbnNfQXBwbHkoQ1Ruc0RhdGEgKlJFU1RSSUNUIHBUbnNEYXRhLCAvKiE8IHBvaW50ZXIgdG8gYWFjIGRlY29kZXIgaW5mbyAqLworICAgICAgICAgICAgICAgIGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbywgU1BFQ1RSQUxfUFRSIHBTcGVjdHJhbENvZWZmaWNpZW50LAorICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgIGNvbnN0IElOVCBncmFudWxlTGVuZ3RoLCBjb25zdCBVQ0hBUiBuYmFuZHMsCisgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgaWdmX2FjdGl2ZSwgY29uc3QgVUlOVCBmbGFncykgeworICBpbnQgd2luZG93LCBpbmRleCwgc3RhcnQsIHN0b3AsIHNpemUsIHN0YXJ0X3dpbmRvdywgd2luc19wZXJfZnJhbWU7CiAKKyAgaWYgKHBUbnNEYXRhLT5BY3RpdmUpIHsKKyAgICBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKGNvZWZmLCBGSVhQX1RDQywgVE5TX01BWElNVU1fT1JERVIpCiAKLSAgaWYgKHBUbnNEYXRhLT5BY3RpdmUpCi0gIHsKLSAgICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQoY29lZmYsIEZJWFBfVENDLCBUTlNfTUFYSU1VTV9PUkRFUik7CisgICAgeworICAgICAgc3RhcnRfd2luZG93ID0gMDsKKyAgICAgIHdpbnNfcGVyX2ZyYW1lID0gR2V0V2luZG93c1BlckZyYW1lKHBJY3NJbmZvKTsKKyAgICB9CiAKLSAgICAgIGZvciAod2luZG93PTA7IHdpbmRvdyA8IEdldFdpbmRvd3NQZXJGcmFtZShwSWNzSW5mbyk7IHdpbmRvdysrKQotICAgICAgewotICAgICAgICBGSVhQX0RCTCAqcFNwZWN0cnVtID0gU1BFQyhwU3BlY3RyYWxDb2VmZmljaWVudCwgd2luZG93LCBncmFudWxlTGVuZ3RoKTsKKyAgICBmb3IgKHdpbmRvdyA9IHN0YXJ0X3dpbmRvdzsgd2luZG93IDwgd2luc19wZXJfZnJhbWU7IHdpbmRvdysrKSB7CisgICAgICBGSVhQX0RCTCAqcFNwZWN0cnVtOwogCi0gICAgICAgIGZvciAoaW5kZXg9MDsgaW5kZXggPCBwVG5zRGF0YS0+TnVtYmVyT2ZGaWx0ZXJzW3dpbmRvd107IGluZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICBDRmlsdGVyICpSRVNUUklDVCBmaWx0ZXIgPSAmcFRuc0RhdGEtPkZpbHRlclt3aW5kb3ddW2luZGV4XTsKKyAgICAgIHsgcFNwZWN0cnVtID0gU1BFQyhwU3BlY3RyYWxDb2VmZmljaWVudCwgd2luZG93LCBncmFudWxlTGVuZ3RoKTsgfQogCi0gICAgICAgICAgaWYgKGZpbHRlci0+T3JkZXIgPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICBGSVhQX1RDQyAqcENvZWZmOwotICAgICAgICAgICAgIGludCB0bnNfbWF4X2JhbmRzOworICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcFRuc0RhdGEtPk51bWJlck9mRmlsdGVyc1t3aW5kb3ddOyBpbmRleCsrKSB7CisgICAgICAgIENGaWx0ZXIgKmZpbHRlciA9ICZwVG5zRGF0YS0+RmlsdGVyW3dpbmRvd11baW5kZXhdOwogCi0gICAgICAgICAgICAgcENvZWZmID0gJmNvZWZmW2ZpbHRlci0+T3JkZXItMV07Ci0gICAgICAgICAgICAgaWYgKGZpbHRlci0+UmVzb2x1dGlvbiA9PSAzKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBmaWx0ZXItPk9yZGVyOyBpKyspCi0gICAgICAgICAgICAgICAgICpwQ29lZmYtLSA9IEZES2FhY0RlY190bnNDb2VmZjNbZmlsdGVyLT5Db2VmZltpXSs0XTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBmaWx0ZXItPk9yZGVyOyBpKyspCi0gICAgICAgICAgICAgICAgICpwQ29lZmYtLSA9IEZES2FhY0RlY190bnNDb2VmZjRbZmlsdGVyLT5Db2VmZltpXSs4XTsKLSAgICAgICAgICAgICB9CisgICAgICAgIGlmIChmaWx0ZXItPk9yZGVyID4gMCkgeworICAgICAgICAgIEZJWFBfVENDICpwQ29lZmY7CisgICAgICAgICAgVUNIQVIgdG5zX21heF9iYW5kczsKIAotICAgICAgICAgICAgIHN3aXRjaCAoZ3JhbnVsZUxlbmd0aCkgewotICAgICAgICAgICAgICAgY2FzZSA0ODA6Ci0gICAgICAgICAgICAgICAgIHRuc19tYXhfYmFuZHMgPSB0bnNfbWF4X2JhbmRzX3RibF80ODBbcFNhbXBsaW5nUmF0ZUluZm8tPnNhbXBsaW5nUmF0ZUluZGV4XTsKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDUxMjoKLSAgICAgICAgICAgICAgICAgdG5zX21heF9iYW5kcyA9IHRuc19tYXhfYmFuZHNfdGJsXzUxMltwU2FtcGxpbmdSYXRlSW5mby0+c2FtcGxpbmdSYXRlSW5kZXhdOwotICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgIHRuc19tYXhfYmFuZHMgPSBHZXRNYXhpbXVtVG5zQmFuZHMocEljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvLT5zYW1wbGluZ1JhdGVJbmRleCk7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIH0KKyAgICAgICAgICBwQ29lZmYgPSBjb2VmZjsKKyAgICAgICAgICBpZiAoZmlsdGVyLT5SZXNvbHV0aW9uID09IDMpIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpbHRlci0+T3JkZXI7IGkrKykKKyAgICAgICAgICAgICAgKnBDb2VmZisrID0gRkRLYWFjRGVjX3Ruc0NvZWZmM1tmaWx0ZXItPkNvZWZmW2ldICsgNF07CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpbHRlci0+T3JkZXI7IGkrKykKKyAgICAgICAgICAgICAgKnBDb2VmZisrID0gRkRLYWFjRGVjX3Ruc0NvZWZmNFtmaWx0ZXItPkNvZWZmW2ldICsgOF07CisgICAgICAgICAgfQogCi0gICAgICAgICAgICAgc3RhcnQgPSBmaXhNaW4oIGZpeE1pbihmaWx0ZXItPlN0YXJ0QmFuZCwgdG5zX21heF9iYW5kcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZChwSWNzSW5mbykgKTsKKyAgICAgICAgICBzd2l0Y2ggKGdyYW51bGVMZW5ndGgpIHsKKyAgICAgICAgICAgIGNhc2UgNDgwOgorICAgICAgICAgICAgICB0bnNfbWF4X2JhbmRzID0KKyAgICAgICAgICAgICAgICAgIHRuc19tYXhfYmFuZHNfdGJsXzQ4MFtwU2FtcGxpbmdSYXRlSW5mby0+c2FtcGxpbmdSYXRlSW5kZXhdOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTEyOgorICAgICAgICAgICAgICB0bnNfbWF4X2JhbmRzID0KKyAgICAgICAgICAgICAgICAgIHRuc19tYXhfYmFuZHNfdGJsXzUxMltwU2FtcGxpbmdSYXRlSW5mby0+c2FtcGxpbmdSYXRlSW5kZXhdOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHRuc19tYXhfYmFuZHMgPSBHZXRNYXhpbXVtVG5zQmFuZHMoCisgICAgICAgICAgICAgICAgICBwSWNzSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8tPnNhbXBsaW5nUmF0ZUluZGV4KTsKKyAgICAgICAgICAgICAgLyogU2VlIHJlZGVmaW5pdGlvbiBvZiBUTlNfTUFYX0JBTkRTIHRhYmxlICovCisgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBKSkgJiYKKyAgICAgICAgICAgICAgICAgIChwU2FtcGxpbmdSYXRlSW5mby0+c2FtcGxpbmdSYXRlSW5kZXggPiA1KSkgeworICAgICAgICAgICAgICAgIHRuc19tYXhfYmFuZHMgKz0gMTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CiAKLSAgICAgICAgICAgICBzdGFydCA9IEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMocEljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKVtzdGFydF07CisgICAgICAgICAgc3RhcnQgPSBmaXhNaW4oZml4TWluKGZpbHRlci0+U3RhcnRCYW5kLCB0bnNfbWF4X2JhbmRzKSwgbmJhbmRzKTsKIAotICAgICAgICAgICAgIHN0b3AgPSBmaXhNaW4oIGZpeE1pbihmaWx0ZXItPlN0b3BCYW5kLCB0bnNfbWF4X2JhbmRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQocEljc0luZm8pICk7CisgICAgICAgICAgc3RhcnQgPSBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKHBJY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbylbc3RhcnRdOwogCi0gICAgICAgICAgICAgc3RvcCA9IEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMocEljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKVtzdG9wXTsKKyAgICAgICAgICBpZiAoaWdmX2FjdGl2ZSkgeworICAgICAgICAgICAgc3RvcCA9IGZpeE1pbihmaWx0ZXItPlN0b3BCYW5kLCBuYmFuZHMpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdG9wID0gZml4TWluKGZpeE1pbihmaWx0ZXItPlN0b3BCYW5kLCB0bnNfbWF4X2JhbmRzKSwgbmJhbmRzKTsKKyAgICAgICAgICB9CiAKLSAgICAgICAgICAgICBzaXplID0gc3RvcCAtIHN0YXJ0OworICAgICAgICAgIHN0b3AgPSBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKHBJY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbylbc3RvcF07CiAKLSAgICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgIENUbnNfRmlsdGVyKCZwU3BlY3RydW1bc3RhcnRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLT5EaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLT5PcmRlciApOwotICAgICAgICAgICAgIH0KKyAgICAgICAgICBzaXplID0gc3RvcCAtIHN0YXJ0OworCisgICAgICAgICAgaWYgKHNpemUpIHsKKyAgICAgICAgICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChzdGF0ZSwgRklYUF9EQkwsIFROU19NQVhJTVVNX09SREVSKQorCisgICAgICAgICAgICBGREttZW1jbGVhcihzdGF0ZSwgVE5TX01BWElNVU1fT1JERVIgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICAgIENMcGNfU3ludGhlc2lzTGF0dGljZShwU3BlY3RydW0gKyBzdGFydCwgc2l6ZSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXItPkRpcmVjdGlvbiwgY29lZmYsIGZpbHRlci0+T3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpOworCisgICAgICAgICAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHN0YXRlLCBGSVhQX0RCTCwgVE5TX01BWElNVU1fT1JERVIpCiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBDX0FBTExPQ19TQ1JBVENIX0VORChjb2VmZiwgRklYUF9UQ0MsIFROU19NQVhJTVVNX09SREVSKTsKKyAgICB9CisgICAgQ19BQUxMT0NfU0NSQVRDSF9FTkQoY29lZmYsIEZJWFBfVENDLCBUTlNfTUFYSU1VTV9PUkRFUikKICAgfQotCiB9CmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2FhY2RlY190bnMuaCBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX3Rucy5oCmluZGV4IGYwMjlkOTYuLjFhNjNiZWQgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX3Rucy5oCisrKyBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjX3Rucy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDI5ICs5MCwzNyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorCiAgICBEZXNjcmlwdGlvbjogdGVtcG9yYWwgbm9pc2Ugc2hhcGluZyB0b29sCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgVE5TX0gKLSNkZWZpbmUgVE5TX0gKKyNpZm5kZWYgQUFDREVDX1ROU19ICisjZGVmaW5lIEFBQ0RFQ19UTlNfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCi1lbnVtCi17Ci0gIFROU19NQVhfV0lORE9XUyA9IDgsICAgIC8qIDggKi8KLSAgVE5TX01BWElNVU1fT1JERVIgICA9IDIwLCAgLyogMTIgZm9yIEFBQy1MQyBhbmQgQUFDLVNTUi4gU2V0IHRvIDIwIGZvciBBQUMtTWFpbiAoQU9UIDEpLiBTb21lIGJyb2tlbiBlbmNvZGVycyBhbHNvIGRvIG9yZGVyIDIwIGZvciBBQUMtTEMgOiggKi8KK2VudW0geworICBUTlNfTUFYX1dJTkRPV1MgPSA4LCAvKiA4ICovCiAgIFROU19NQVhJTVVNX0ZJTFRFUlMgPSAzCiB9OwogCi10eXBlZGVmIHN0cnVjdAoteworLyogVE5TX01BWElNVU1fT1JERVIgKGZvciBtZW1vcnkgYWxsb2NhdGlvbikKKyAgIDEyIGZvciBBQUMtTEMgYW5kIEFBQy1TU1IuIFNldCB0byAyMCBmb3IgQUFDLU1haW4gKEFPVCAxKS4gU29tZSBicm9rZW4KKyAgIGVuY29kZXJzIGFsc28gZG8gb3JkZXIgMjAgZm9yIEFBQy1MQyA6KCAxNSBmb3IgVVNBQyAoQU9UIDQyKQorKi8KKyNkZWZpbmUgVE5TX01BWElNVU1fT1JERVIgKDIwKQorCisjaWYgKFROU19NQVhJTVVNX09SREVSIDwgMTUpCisjZXJyb3IgVVNBQzogVE5TIGZpbHRlciBvcmRlciB1cCAxNSBjYW4gYmUgc2lnbmFsZWQhCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgewogICBTQ0hBUiBDb2VmZltUTlNfTUFYSU1VTV9PUkRFUl07CiAKICAgVUNIQVIgU3RhcnRCYW5kOwpAQCAtMTEzLDE0ICsxMzIsMTggQEAKICAgVUNIQVIgT3JkZXI7CiB9IENGaWx0ZXI7CiAKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgIENGaWx0ZXIgRmlsdGVyW1ROU19NQVhfV0lORE9XU11bVE5TX01BWElNVU1fRklMVEVSU107CiAgIFVDSEFSIE51bWJlck9mRmlsdGVyc1tUTlNfTUFYX1dJTkRPV1NdOwogICBVQ0hBUiBEYXRhUHJlc2VudDsKICAgVUNIQVIgQWN0aXZlOworCisgIC8qIGxvZzIgb2YgdGhlIG1heGltdW0gdG90YWwgZmlsdGVyIGdhaW5zLiBUaGUgdmFsdWUgaXMgcmVxdWlyZWQgdG8KKyAgICAga2VlcCBuZWNlc3NhcnkgbWFudGlzc2EgaGVhZHJvb20gc28gdGhhdCB3aGlsZSBhcHBseWluZyB0aGUgVE5TIHByZWRpY3RvcgorICAgICB0aGUgbWFudGlzc2FzIGRvIG5vdCBvdmVyZmxvdy4gKi8KKyAgVUNIQVIgR2FpbkxkOwogfSBDVG5zRGF0YTsKIAogdm9pZCBDVG5zX1Jlc2V0KENUbnNEYXRhICpwVG5zRGF0YSk7CiAKLSNlbmRpZiAvKiAjaWZuZGVmIFROU19IICovCisjZW5kaWYgLyogI2lmbmRlZiBBQUNERUNfVE5TX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjb2Rlci5jcHAgYi9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXIuY3BwCmluZGV4IDU3OWU0NzAuLmI4YjEzMjcgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjb2Rlci5jcHAKKysrIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNvZGVyLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw2MCArOTAsNjggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKwogICAgRGVzY3JpcHRpb246CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxwYWdlIGRlZmF1bHQgR2VuZXJhbCBPdmVydmlldyBvZiB0aGUgQUFDIERlY29kZXIgSW1wbGVtZW50YXRpb24KIAotICBUaGUgbWFpbiBlbnRyeSBwb2ludCB0byBkZWNvZGUgYSBBQUMgZnJhbWUgaXMgQ0FhY0RlY29kZXJfRGVjb2RlRnJhbWUoKS4gSXQgaGFuZGxlcyB0aGUgZGlmZmVyZW50Ci0gIHRyYW5zcG9ydCBtdWx0aXBsZXhlcyBhbmQgYml0c3RyZWFtIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24uIEl0IGV4dHJhY3RzIHRoZQotICBBQUNfcmF3X2RhdGFfYmxvY2tzIGZyb20gdGhlc2UgYml0c3RyZWFtcyB0byBmdXJ0aGVyIHByb2Nlc3MgdGhlbiBpbiB0aGUgYWN0dWFsIGRlY29kaW5nIHN0YWdlcy4KKyAgVGhlIG1haW4gZW50cnkgcG9pbnQgdG8gZGVjb2RlIGEgQUFDIGZyYW1lIGlzIENBYWNEZWNvZGVyX0RlY29kZUZyYW1lKCkuIEl0CisgIGhhbmRsZXMgdGhlIGRpZmZlcmVudCB0cmFuc3BvcnQgbXVsdGlwbGV4ZXMgYW5kIGJpdHN0cmVhbSBmb3JtYXRzIHN1cHBvcnRlZCBieQorICB0aGlzIGltcGxlbWVudGF0aW9uLiBJdCBleHRyYWN0cyB0aGUgQUFDX3Jhd19kYXRhX2Jsb2NrcyBmcm9tIHRoZXNlIGJpdHN0cmVhbXMKKyAgdG8gZnVydGhlciBwcm9jZXNzIHRoZW4gaW4gdGhlIGFjdHVhbCBkZWNvZGluZyBzdGFnZXMuCiAKLSAgTm90ZTogQ2xpY2sgb24gYSBmdW5jdGlvbiBvZiBmaWxlIGluIHRoZSBhYm92ZSBpbWFnZSB0byBzZWUgZGV0YWlscyBhYm91dCB0aGUgZnVuY3Rpb24uIEFsc28gbm90ZSwgdGhhdAotICB0aGlzIGlzIGp1c3QgYW4gb3ZlcnZpZXcgb2YgdGhlIG1vc3QgaW1wb3J0YW50IGZ1bmN0aW9ucyBhbmQgbm90IGEgY29tcGxldGUgY2FsbCBncmFwaC4KKyAgTm90ZTogQ2xpY2sgb24gYSBmdW5jdGlvbiBvZiBmaWxlIGluIHRoZSBhYm92ZSBpbWFnZSB0byBzZWUgZGV0YWlscyBhYm91dCB0aGUKKyAgZnVuY3Rpb24uIEFsc28gbm90ZSwgdGhhdCB0aGlzIGlzIGp1c3QgYW4gb3ZlcnZpZXcgb2YgdGhlIG1vc3QgaW1wb3J0YW50CisgIGZ1bmN0aW9ucyBhbmQgbm90IGEgY29tcGxldGUgY2FsbCBncmFwaC4KIAogICA8aDI+MSBCaXRzdHJlYW0gZGVmb3JtYXR0ZXI8L2gyPgotICBUaGUgYmFzaWMgYml0IHN0cmVhbSBwYXJzZXIgZnVuY3Rpb24gQ0NoYW5uZWxFbGVtZW50X1JlYWQoKSBpcyBjYWxsZWQuIEl0IHVzZXMgb3RoZXIgc3ViY2FsbHMgaW4gb3JkZXIKLSAgdG8gcGFyc2UgYW5kIHVucGFjayB0aGUgYml0c3RyZWFtcy4gTm90ZSwgdGhhdCB0aGlzIGluY2x1ZGVzIGh1ZmZtYW5uIGRlY29kaW5nIG9mIHRoZSBjb2RlZCBzcGVjdHJhbCBkYXRhLgotICBUaGlzIG9wZXJhdGlvbiBjYW4gYmUgY29tcHV0YXRpb25hbCBzaWduaWZpY2FudCBzcGVjaWZpY2FsbHkgYXQgaGlnaGVyIGJpdHJhdGVzLiBPcHRpbWl6YXRpb24gaXMgbGlrZWx5IGluCi0gIENCbG9ja19SZWFkU3BlY3RyYWxEYXRhKCkuCisgIFRoZSBiYXNpYyBiaXQgc3RyZWFtIHBhcnNlciBmdW5jdGlvbiBDQ2hhbm5lbEVsZW1lbnRfUmVhZCgpIGlzIGNhbGxlZC4gSXQgdXNlcworICBvdGhlciBzdWJjYWxscyBpbiBvcmRlciB0byBwYXJzZSBhbmQgdW5wYWNrIHRoZSBiaXRzdHJlYW1zLiBOb3RlLCB0aGF0IHRoaXMKKyAgaW5jbHVkZXMgaHVmZm1hbm4gZGVjb2Rpbmcgb2YgdGhlIGNvZGVkIHNwZWN0cmFsIGRhdGEuIFRoaXMgb3BlcmF0aW9uIGNhbiBiZQorICBjb21wdXRhdGlvbmFsIHNpZ25pZmljYW50IHNwZWNpZmljYWxseSBhdCBoaWdoZXIgYml0cmF0ZXMuIE9wdGltaXphdGlvbiBpcworICBsaWtlbHkgaW4gQ0Jsb2NrX1JlYWRTcGVjdHJhbERhdGEoKS4KIAotICBUaGUgYml0c3RyZWFtIGRlZm9ybWF0dGVyIGFsc28gaW5jbHVkZXMgbWFueSBiaXRmaWVsZCBvcGVyYXRpb25zLiBQcm9maWxpbmcgb24gdGhlIHRhcmdldCB3aWxsIGRldGVybWluZQotICByZXF1aXJlZCBvcHRpbWl6YXRpb25zLgorICBUaGUgYml0c3RyZWFtIGRlZm9ybWF0dGVyIGFsc28gaW5jbHVkZXMgbWFueSBiaXRmaWVsZCBvcGVyYXRpb25zLiBQcm9maWxpbmcgb24KKyAgdGhlIHRhcmdldCB3aWxsIGRldGVybWluZSByZXF1aXJlZCBvcHRpbWl6YXRpb25zLgogCiAgIDxoMj4yIEFjdHVhbCBkZWNvZGluZyB0byByZXRhaW4gdGhlIHRpbWUgZG9tYWluIG91dHB1dDwvaDI+Ci0gIFRoZSBiYXNpYyBiaXRzdHJlYW0gZGVmb3JtYXR0ZXIgZnVuY3Rpb24gQ0NoYW5uZWxFbGVtZW50X0RlY29kZSgpIGZvciBDUEUgZWxlbWVudHMgYW5kIFNDRSBlbGVtZW50cyBhcmUgY2FsbGVkLgotICBFeGNlcHQgZm9yIHRoZSBzdGVyZW8gcHJvY2Vzc2luZyAoMi4xKSB3aGljaCBpcyBvbmx5IHVzZWQgZm9yIENQRSBlbGVtZW50cywgdGhlIGZ1bmN0aW9uIGNhbGxzIGZvciBDUEUgb3IgU0NFCi0gIGFyZSBzaW1pbGFyLCBleGNlcHQgdGhhdCBDUEUgYWx3YXlzIHByb2Nlc3NlcyB0byBpbmRlcGVuZGVudCBjaGFubmVscyB3aGlsZSBTQ0Ugb25seSBwcm9jZXNzZXMgb25lIGNoYW5uZWwuCisgIFRoZSBiYXNpYyBiaXRzdHJlYW0gZGVmb3JtYXR0ZXIgZnVuY3Rpb24gQ0NoYW5uZWxFbGVtZW50X0RlY29kZSgpIGZvciBDUEUKKyAgZWxlbWVudHMgYW5kIFNDRSBlbGVtZW50cyBhcmUgY2FsbGVkLiBFeGNlcHQgZm9yIHRoZSBzdGVyZW8gcHJvY2Vzc2luZyAoMi4xKQorICB3aGljaCBpcyBvbmx5IHVzZWQgZm9yIENQRSBlbGVtZW50cywgdGhlIGZ1bmN0aW9uIGNhbGxzIGZvciBDUEUgb3IgU0NFIGFyZQorICBzaW1pbGFyLCBleGNlcHQgdGhhdCBDUEUgYWx3YXlzIHByb2Nlc3NlcyB0byBpbmRlcGVuZGVudCBjaGFubmVscyB3aGlsZSBTQ0UKKyAgb25seSBwcm9jZXNzZXMgb25lIGNoYW5uZWwuCiAKLSAgT2Z0ZW4gdGhlcmUgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gbG9uZyBibG9ja3MgYW5kIHNob3J0IGJsb2Nrcy4gSG93ZXZlciwgY29tcHV0YXRpb25hbCBleHBlbnNpdmUgZnVuY3Rpb25zCi0gIHRoYXQgdXN1c2FsbHkgcmVxdWlyZSBvcHRpbWl6YXRpb24gYXJlIGJlaW5nIHNoYXJlZCBieSB0aGVzZSB0d28gZ3JvdXBzLAorICBPZnRlbiB0aGVyZSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBsb25nIGJsb2NrcyBhbmQgc2hvcnQgYmxvY2tzLiBIb3dldmVyLAorICBjb21wdXRhdGlvbmFsIGV4cGVuc2l2ZSBmdW5jdGlvbnMgdGhhdCB1c3VzYWxseSByZXF1aXJlIG9wdGltaXphdGlvbiBhcmUgYmVpbmcKKyAgc2hhcmVkIGJ5IHRoZXNlIHR3byBncm91cHMsCiAKICAgPGgzPjIuMSBTdGVyZW8gcHJvY2Vzc2luZyBmb3IgQ1BFIGVsZW1lbnRzPC9oMz4KLSAgQ0NoYW5uZWxQYWlyRWxlbWVudF9EZWNvZGUoKSBmaXJzdCBjYWxsZXMgdGhlIGpvaW50IHN0ZXJlbyAgdG9vbHMgaW4gc3RlcmVvLmNwcCB3aGVuIHJlcXVpcmVkLgorICBDQ2hhbm5lbFBhaXJFbGVtZW50X0RlY29kZSgpIGZpcnN0IGNhbGxlcyB0aGUgam9pbnQgc3RlcmVvICB0b29scyBpbgorICBzdGVyZW8uY3BwIHdoZW4gcmVxdWlyZWQuCiAKICAgPGgzPjIuMiBTY2FsaW5nIG9mIHNwZWN0cmFsIGRhdGE8L2gzPgogICBDQmxvY2tfU2NhbGVTcGVjdHJhbERhdGEoKS4KIAogICA8aDM+Mi4zIEFwcGx5IGFkZGl0aW9uYWwgY29kaW5nIHRvb2xzPC9oMz4KLSAgQXBwbHlUb29scygpIGNhbGxlcyB0aGUgUE5TIHRvb2xzIGluIGNhc2Ugb2YgTVBFRy00IGJpdHN0cmVhbXMsIGFuZCBUTlMgZmlsdGVyaW5nIENUbnNfQXBwbHkoKSBmb3IgTVBFRy0yIGFuZCBNUEVHLTQgYml0c3RyZWFtcy4KLSAgVGhlIGZ1bmN0aW9uIFRuc0ZpbHRlcklJUigpIHdoaWNoIGlzIGNhbGxlZCBieSBDVG5zX0FwcGx5KCkgKDIuMy4xKSBtaWdodCByZXF1aXJlIHNvbWUgb3B0aW1pemF0aW9uLgorICBBcHBseVRvb2xzKCkgY2FsbGVzIHRoZSBQTlMgdG9vbHMgaW4gY2FzZSBvZiBNUEVHLTQgYml0c3RyZWFtcywgYW5kIFROUworICBmaWx0ZXJpbmcgQ1Ruc19BcHBseSgpIGZvciBNUEVHLTIgYW5kIE1QRUctNCBiaXRzdHJlYW1zLiBUaGUgZnVuY3Rpb24KKyAgVG5zRmlsdGVySUlSKCkgd2hpY2ggaXMgY2FsbGVkIGJ5IENUbnNfQXBwbHkoKSAoMi4zLjEpIG1pZ2h0IHJlcXVpcmUgc29tZQorICBvcHRpbWl6YXRpb24uCiAKICAgPGgyPjMgRnJlcXVlbmN5LVRvLVRpbWUgY29udmVyc2lvbjwvaDM+Ci0gIFRoZSBmaWx0ZXJiYW5rIGlzIGNhbGxlZCB1c2luZyBDQmxvY2tfRnJlcXVlbmN5VG9UaW1lKCkgdXNpbmcgdGhlIE1EQ1QgbW9kdWxlIGZyb20gdGhlIEZESyBUb29scworICBUaGUgZmlsdGVyYmFuayBpcyBjYWxsZWQgdXNpbmcgQ0Jsb2NrX0ZyZXF1ZW5jeVRvVGltZSgpIHVzaW5nIHRoZSBNRENUIG1vZHVsZQorICBmcm9tIHRoZSBGREsgVG9vbHMKIAogKi8KIAotCi0KICNpbmNsdWRlICJhYWNkZWNvZGVyLmgiCiAKICNpbmNsdWRlICJhYWNfcm9tLmgiCkBAIC0xNDAsNTQgKzE1OSwxNTUgQEAKICNpbmNsdWRlICJjaGFubmVsLmgiCiAjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCiAKLSNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCisjaW5jbHVkZSAiYWFjZGVjX3Bucy5oIgogCi0gICNpbmNsdWRlICJhYWNkZWNfcG5zLmgiCisjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgogCi0gICNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCisjaW5jbHVkZSAic2FjX2RlY19saWIuaCIKIAorI2luY2x1ZGUgImFhY2RlY19oY3IuaCIKKyNpbmNsdWRlICJydmxjLmgiCiAKKyNpbmNsdWRlICJ1c2FjZGVjX2xwZC5oIgogCi0KLSAgI2luY2x1ZGUgImFhY2RlY19oY3IuaCIKLSAgI2luY2x1ZGUgInJ2bGMuaCIKLQorI2luY2x1ZGUgImFjX2FyaXRoX2NvZGVyLmgiCiAKICNpbmNsdWRlICJ0cGRlY19saWIuaCIKIAogI2luY2x1ZGUgImNvbmNlYWwuaCIKIAotICAjaW5jbHVkZSAiRkRLX2NyYy5oIgorI2luY2x1ZGUgIkZES19jcmMuaCIKKyNkZWZpbmUgUFNfSVNfRVhQTElDSVRMWV9ESVNBQkxFRChhb3QsIGZsYWdzKSBcCisgICgoKGFvdCkgPT0gQU9UX0RSTV9BQUMpICYmICEoZmxhZ3MgJiBBQ19QU19QUkVTRU5UKSkKIAorI2RlZmluZSBJU19TVEVSRU9fU0JSKGVsX2lkLCBzdGVyZW9Db25maWdJbmRleCkgICAgICAgICAgICBcCisgICgoKGVsX2lkKSA9PSBJRF9VU0FDX0NQRSAmJiAoc3RlcmVvQ29uZmlnSW5kZXgpID09IDApIHx8IFwKKyAgICgoZWxfaWQpID09IElEX1VTQUNfQ1BFICYmIChzdGVyZW9Db25maWdJbmRleCkgPT0gMykpCiAKLXZvaWQgQ0FhY0RlY29kZXJfU3luY1FtZk1vZGUoSEFORExFX0FBQ0RFQ09ERVIgc2VsZikKLXsKK3ZvaWQgQ0FhY0RlY29kZXJfU3luY1FtZk1vZGUoSEFORExFX0FBQ0RFQ09ERVIgc2VsZikgeworICBGREtfQVNTRVJUKAorICAgICAgISgoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19NUFNfUFJFU0VOVCkgJiYgKHNlbGYtPmZsYWdzWzBdICYgQUNfUFNfUFJFU0VOVCkpKTsKIAogICAvKiBBc3NpZ24gdXNlciByZXF1ZXN0ZWQgbW9kZSAqLwogICBzZWxmLT5xbWZNb2RlQ3VyciA9IHNlbGYtPnFtZk1vZGVVc2VyOwogCi0gIGlmICggc2VsZi0+cW1mTW9kZUN1cnIgPT0gTk9UX0RFRklORUQgKQotICB7Ci0gICAgaWYgKCAoSVNfTE9XREVMQVkoc2VsZi0+c3RyZWFtSW5mby5hb3QpICYmIChzZWxmLT5mbGFncyAmIEFDX01QU19QUkVTRU5UKSkKLSAgICAgIHx8ICggKHNlbGYtPnN0cmVhbUluZm8uYWFjTnVtQ2hhbm5lbHMgPT0gMSkKLSAgICAgICAgJiYgKCAoQ0FOX0RPX1BTKHNlbGYtPnN0cmVhbUluZm8uYW90KSAmJiAhKHNlbGYtPmZsYWdzICYgQUNfTVBTX1BSRVNFTlQpKQotICAgICAgICAgIHx8ICggIElTX1VTQUMoc2VsZi0+c3RyZWFtSW5mby5hb3QpICYmICAoc2VsZi0+ZmxhZ3MgJiBBQ19NUFNfUFJFU0VOVCkpICkgKSApCi0gICAgeworICBpZiAoSVNfVVNBQyhzZWxmLT5zdHJlYW1JbmZvLmFvdCkpIHsKKyAgICBzZWxmLT5xbWZNb2RlQ3VyciA9IE1PREVfSFE7CisgIH0KKworICBpZiAoc2VsZi0+cW1mTW9kZUN1cnIgPT0gTk9UX0RFRklORUQpIHsKKyAgICBpZiAoKElTX0xPV0RFTEFZKHNlbGYtPnN0cmVhbUluZm8uYW90KSAmJgorICAgICAgICAgKHNlbGYtPmZsYWdzWzBdICYgQUNfTVBTX1BSRVNFTlQpKSB8fAorICAgICAgICAoKHNlbGYtPnN0cmVhbUluZm8uYWFjTnVtQ2hhbm5lbHMgPT0gMSkgJiYKKyAgICAgICAgICgoQ0FOX0RPX1BTKHNlbGYtPnN0cmVhbUluZm8uYW90KSAmJgorICAgICAgICAgICAhKHNlbGYtPmZsYWdzWzBdICYgQUNfTVBTX1BSRVNFTlQpKSB8fAorICAgICAgICAgIChJU19VU0FDKHNlbGYtPnN0cmVhbUluZm8uYW90KSkpKSkgewogICAgICAgc2VsZi0+cW1mTW9kZUN1cnIgPSBNT0RFX0hROwogICAgIH0gZWxzZSB7CiAgICAgICBzZWxmLT5xbWZNb2RlQ3VyciA9IE1PREVfTFA7CiAgICAgfQogICB9CiAKKyAgaWYgKHNlbGYtPm1wc0VuYWJsZUN1cnIpIHsKKyAgICBpZiAoSVNfTE9XREVMQVkoc2VsZi0+c3RyZWFtSW5mby5hb3QpICYmCisgICAgICAgIChzZWxmLT5xbWZNb2RlQ3VyciA9PSBNT0RFX0xQKSkgeyAvKiBPdmVycnVsZSB1c2VyIHJlcXVlc3RlZCBRTUYgbW9kZSAqLworICAgICAgc2VsZi0+cW1mTW9kZUN1cnIgPSBNT0RFX0hROworICAgIH0KKyAgICAvKiBTZXQgYW5kIGNoZWNrIGlmIE1QUyBkZWNvZGVyIGFsbG93cyB0aGUgY3VycmVudCBtb2RlICovCisgICAgc3dpdGNoIChtcGVnU3Vycm91bmREZWNvZGVyX1NldFBhcmFtKAorICAgICAgICAoQ01wZWdTdXJyb3VuZERlY29kZXIgKilzZWxmLT5wTXBlZ1N1cnJvdW5kRGVjb2RlciwKKyAgICAgICAgU0FDREVDX1BBUlRJQUxMWV9DT01QTEVYLCBzZWxmLT5xbWZNb2RlQ3VyciA9PSBNT0RFX0xQKSkgeworICAgICAgY2FzZSBNUFNfT0s6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNUFNfSU5WQUxJRF9QQVJBTUVURVI6IHsgLyogT25seSBvbmUgbW9kZSBzdXBwb3J0ZWQuIEZpbmQgb3V0IHdoaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmU6ICovCisgICAgICAgIExJQl9JTkZPIGxpYkluZm9bRkRLX01PRFVMRV9MQVNUXTsKKyAgICAgICAgVUlOVCBtcHNDYXBzOworCisgICAgICAgIEZES2luaXRMaWJJbmZvKGxpYkluZm8pOworICAgICAgICBtcGVnU3Vycm91bmREZWNvZGVyX0dldExpYkluZm8obGliSW5mbyk7CisgICAgICAgIG1wc0NhcHMgPSBGREtsaWJJbmZvX2dldENhcGFiaWxpdGllcyhsaWJJbmZvLCBGREtfTVBTREVDKTsKKworICAgICAgICBpZiAoKChtcHNDYXBzICYgQ0FQRl9NUFNfTFApICYmIChzZWxmLT5xbWZNb2RlQ3VyciA9PSBNT0RFX0xQKSkgfHwKKyAgICAgICAgICAgICgobXBzQ2FwcyAmIENBUEZfTVBTX0hRKSAmJgorICAgICAgICAgICAgIChzZWxmLT5xbWZNb2RlQ3VyciA9PQorICAgICAgICAgICAgICBNT0RFX0hRKSkpIHsgLyogTVBTIGRlY29kZXIgZG9lcyBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgbW9kZS4gKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfSAvKiBGYWxsLXRocm91Z2g6ICovCisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoc2VsZi0+cW1mTW9kZVVzZXIgPT0gTk9UX0RFRklORUQpIHsKKyAgICAgICAgICAvKiBSZXZlcnQgaW4gY2FzZSBtcGVnU3Vycm91bmREZWNvZGVyX1NldFBhcmFtKCkgZmFpbHMuICovCisgICAgICAgICAgc2VsZi0+cW1mTW9kZUN1cnIgPQorICAgICAgICAgICAgICAoc2VsZi0+cW1mTW9kZUN1cnIgPT0gTU9ERV9MUCkgPyBNT0RFX0hRIDogTU9ERV9MUDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBpbiBjYXNlIHNwZWNpZmljIG1vZGUgd2FzIHJlcXVlc3RlZCB3ZSBkaXNhYmxlIE1QUyBhbmQgcGxheW91dCB0aGUKKyAgICAgICAgICAgKiBkb3dubWl4ICovCisgICAgICAgICAgc2VsZi0+bXBzRW5hYmxlQ3VyciA9IDA7CisgICAgICAgIH0KKyAgICB9CisgIH0KIAogICAvKiBTZXQgU0JSIHRvIGN1cnJlbnQgUU1GIG1vZGUuIEVycm9yIGRvZXMgbm90IG1hdHRlci4gKi8KLSAgc2JyRGVjb2Rlcl9TZXRQYXJhbShzZWxmLT5oU2JyRGVjb2RlciwgU0JSX1FNRl9NT0RFLCAoc2VsZi0+cW1mTW9kZUN1cnIgPT0gTU9ERV9MUCkpOwotICBzZWxmLT5wc1Bvc3NpYmxlID0gKChDQU5fRE9fUFMoc2VsZi0+c3RyZWFtSW5mby5hb3QpICYmIHNlbGYtPnN0cmVhbUluZm8uYWFjTnVtQ2hhbm5lbHMgPT0gMSAmJiAhIChzZWxmLT5mbGFncyAmIEFDX01QU19QUkVTRU5UKSkpICYmIHNlbGYtPnFtZk1vZGVDdXJyID09IE1PREVfSFEgOwotICBGREtfQVNTRVJUKCAhICggKHNlbGYtPmZsYWdzICYgQUNfTVBTX1BSRVNFTlQpICYmIHNlbGYtPnBzUG9zc2libGUgKSApOworICBzYnJEZWNvZGVyX1NldFBhcmFtKHNlbGYtPmhTYnJEZWNvZGVyLCBTQlJfUU1GX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgKHNlbGYtPnFtZk1vZGVDdXJyID09IE1PREVfTFApKTsKKyAgc2VsZi0+cHNQb3NzaWJsZSA9CisgICAgICAoKENBTl9ET19QUyhzZWxmLT5zdHJlYW1JbmZvLmFvdCkgJiYKKyAgICAgICAgIVBTX0lTX0VYUExJQ0lUTFlfRElTQUJMRUQoc2VsZi0+c3RyZWFtSW5mby5hb3QsIHNlbGYtPmZsYWdzWzBdKSAmJgorICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY051bUNoYW5uZWxzID09IDEgJiYKKyAgICAgICAgIShzZWxmLT5mbGFnc1swXSAmIEFDX01QU19QUkVTRU5UKSkpICYmCisgICAgICBzZWxmLT5xbWZNb2RlQ3VyciA9PSBNT0RFX0hROworICBGREtfQVNTRVJUKCEoKHNlbGYtPmZsYWdzWzBdICYgQUNfTVBTX1BSRVNFTlQpICYmIHNlbGYtPnBzUG9zc2libGUpKTsKIH0KIAotdm9pZCBDQWFjRGVjb2Rlcl9TaWduYWxJbnRlcnJ1cHRpb24oSEFORExFX0FBQ0RFQ09ERVIgc2VsZikKLXsKK3ZvaWQgQ0FhY0RlY29kZXJfU2lnbmFsSW50ZXJydXB0aW9uKEhBTkRMRV9BQUNERUNPREVSIHNlbGYpIHsKKyAgaWYgKHNlbGYtPmZsYWdzWzBdICYgKEFDX1VTQUMgfCBBQ19SU1ZENTAgfCBBQ19SU1Y2MDNEQSkpIHsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmTWluKHNlbGYtPmFhY0NoYW5uZWxzLCAoOCkpOyBpKyspIHsKKyAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvCisgICAgICAgICAgICAgIFtpXSkgeyAvKiBudW1iZXIgb2YgYWN0aXZlIGNoYW5uZWxzIGNhbiBiZSBzbWFsbGVyICovCisgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9baV0tPmhBckNvLT5tX251bWJlckxpbmVzUHJldiA9IDA7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qIQorICBcYnJpZWYgQ2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnQgY2hhbm5lbHMKKworICBcdHlwZSAgY2hhbm5lbCB0eXBlCisgIFx1c2FjU3RlcmVvQ29uZmlnSW5kZXggIHVzYWMgc3RlcmVvIGNvbmZpZyBpbmRleAorCisgIFxyZXR1cm4gIGVsZW1lbnQgY2hhbm5lbHMKKyovCitzdGF0aWMgaW50IENBYWNEZWNvZGVyX0dldEVMQ2hhbm5lbHMoTVA0X0VMRU1FTlRfSUQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiB1c2FjU3RlcmVvQ29uZmlnSW5kZXgpIHsKKyAgaW50IGVsX2NoYW5uZWxzID0gMDsKKworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIElEX1VTQUNfQ1BFOgorICAgICAgaWYgKHVzYWNTdGVyZW9Db25maWdJbmRleCA9PSAxKSB7CisgICAgICAgIGVsX2NoYW5uZWxzID0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVsX2NoYW5uZWxzID0gMjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSURfQ1BFOgorICAgICAgZWxfY2hhbm5lbHMgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJRF9VU0FDX1NDRToKKyAgICBjYXNlIElEX1VTQUNfTEZFOgorICAgIGNhc2UgSURfU0NFOgorICAgIGNhc2UgSURfTEZFOgorICAgICAgZWxfY2hhbm5lbHMgPSAxOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGVsX2NoYW5uZWxzID0gMDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGVsX2NoYW5uZWxzOwogfQogCiAvKiEKQEAgLTE5NywxMSArMzE3LDkgQEAKIAogICBccmV0dXJuICBFcnJvciBjb2RlCiAqLwotc3RhdGljIEFBQ19ERUNPREVSX0VSUk9SIENBYWNEZWNvZGVyX0FuY0RhdGFSZXNldChDQW5jRGF0YSAqYW5jRGF0YSkKLXsKK3N0YXRpYyBBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9BbmNEYXRhUmVzZXQoQ0FuY0RhdGEgKmFuY0RhdGEpIHsKICAgaW50IGk7Ci0gIGZvciAoaT0wOyBpPDg7IGkrKykKLSAgeworICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAgICAgYW5jRGF0YS0+b2Zmc2V0W2ldID0gMDsKICAgfQogICBhbmNEYXRhLT5uckVsZW1lbnRzID0gMDsKQEAgLTIxOCw4ICszMzYsOCBAQAogCiAgIFxyZXR1cm4gIEVycm9yIGNvZGUKICovCi1BQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9BbmNEYXRhSW5pdChDQW5jRGF0YSAqYW5jRGF0YSwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSkKLXsKK0FBQ19ERUNPREVSX0VSUk9SIENBYWNEZWNvZGVyX0FuY0RhdGFJbml0KENBbmNEYXRhICphbmNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSkgewogICBpZiAoc2l6ZSA+PSAwKSB7CiAgICAgYW5jRGF0YS0+YnVmZmVyID0gYnVmZmVyOwogICAgIGFuY0RhdGEtPmJ1ZmZlclNpemUgPSBzaXplOwpAQCAtMjM4LDI3ICszNTYsMjYgQEAKICAgXGFuY0RhdGEgUG9pbnRlciB0byBhbmNpbGxhcnkgZGF0YSBzdHJ1Y3R1cmUKICAgXGluZGV4IEluZGV4IG9mIHRoZSBhbmMgZGF0YSBlbGVtZW50IHRvIGdldAogICBccHRyIFBvaW50ZXIgdG8gYSBidWZmZXIgcmVjZWl2aW5nIGEgcG9pbnRlciB0byB0aGUgcmVxdWVzdGVkIGFuYyBkYXRhIGVsZW1lbnQKLSAgXHNpemUgUG9pbnRlciB0byBhIGJ1ZmZlciByZWNlaXZpbmcgdGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdGVkIGFuYyBkYXRhIGVsZW1lbnQgaW4gYnl0ZXMKKyAgXHNpemUgUG9pbnRlciB0byBhIGJ1ZmZlciByZWNlaXZpbmcgdGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdGVkIGFuYyBkYXRhCisgIGVsZW1lbnQgaW4gYnl0ZXMKIAogICBccmV0dXJuICBFcnJvciBjb2RlCiAqLwotQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfQW5jRGF0YUdldChDQW5jRGF0YSAqYW5jRGF0YSwgaW50IGluZGV4LCB1bnNpZ25lZCBjaGFyICoqcHRyLCBpbnQgKnNpemUpCi17CitBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9BbmNEYXRhR2V0KENBbmNEYXRhICphbmNEYXRhLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKipwdHIsIGludCAqc2l6ZSkgewogICBBQUNfREVDT0RFUl9FUlJPUiBlcnJvciA9IEFBQ19ERUNfT0s7CiAKLSAgKnB0ciAgPSBOVUxMOworICAqcHRyID0gTlVMTDsKICAgKnNpemUgPSAwOwogCi0gIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgOCAmJiBpbmRleCA8IGFuY0RhdGEtPm5yRWxlbWVudHMpCi0gIHsKLSAgICAqcHRyICA9ICZhbmNEYXRhLT5idWZmZXJbYW5jRGF0YS0+b2Zmc2V0W2luZGV4XV07Ci0gICAgKnNpemUgPSBhbmNEYXRhLT5vZmZzZXRbaW5kZXgrMV0gLSBhbmNEYXRhLT5vZmZzZXRbaW5kZXhdOworICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IDggLSAxICYmIGluZGV4IDwgYW5jRGF0YS0+bnJFbGVtZW50cykgeworICAgICpwdHIgPSAmYW5jRGF0YS0+YnVmZmVyW2FuY0RhdGEtPm9mZnNldFtpbmRleF1dOworICAgICpzaXplID0gYW5jRGF0YS0+b2Zmc2V0W2luZGV4ICsgMV0gLSBhbmNEYXRhLT5vZmZzZXRbaW5kZXhdOwogICB9CiAKICAgcmV0dXJuIGVycm9yOwogfQogCi0KIC8qIQogICBcYnJpZWYgUGFyc2UgYW5jaWxsYXJ5IGRhdGEKIApAQCAtMjY4LDQwICszODUsMzIgQEAKIAogICBccmV0dXJuICBFcnJvciBjb2RlCiAqLwotc3RhdGljCi1BQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9BbmNEYXRhUGFyc2UgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FuY0RhdGEgKmFuY0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYW5jQnl0ZXMgKQoteworc3RhdGljIEFBQ19ERUNPREVSX0VSUk9SIENBYWNEZWNvZGVyX0FuY0RhdGFQYXJzZShDQW5jRGF0YSAqYW5jRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYW5jQnl0ZXMpIHsKICAgQUFDX0RFQ09ERVJfRVJST1IgZXJyb3IgPSBBQUNfREVDX09LOwogICBpbnQgcmVhZEJ5dGVzID0gMDsKIAotICBpZiAoYW5jRGF0YS0+YnVmZmVyICE9IE5VTEwpCi0gIHsKKyAgaWYgKGFuY0RhdGEtPmJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgaWYgKGFuY0J5dGVzID4gMCkgewogICAgICAgLyogd3JpdGUgYW5jaWxsYXJ5IGRhdGEgdG8gZXh0ZXJuYWwgYnVmZmVyICovCiAgICAgICBpbnQgb2Zmc2V0ID0gYW5jRGF0YS0+b2Zmc2V0W2FuY0RhdGEtPm5yRWxlbWVudHNdOwogCi0gICAgICBpZiAoKG9mZnNldCArIGFuY0J5dGVzKSA+IGFuY0RhdGEtPmJ1ZmZlclNpemUpCi0gICAgICB7CisgICAgICBpZiAoKG9mZnNldCArIGFuY0J5dGVzKSA+IGFuY0RhdGEtPmJ1ZmZlclNpemUpIHsKICAgICAgICAgZXJyb3IgPSBBQUNfREVDX1RPT19TTUFMTF9BTkNfQlVGRkVSOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYW5jRGF0YS0+bnJFbGVtZW50cyA+PSA4LTEpCi0gICAgICB7CisgICAgICB9IGVsc2UgaWYgKGFuY0RhdGEtPm5yRWxlbWVudHMgPj0gOCAtIDEpIHsKICAgICAgICAgZXJyb3IgPSBBQUNfREVDX1RPT19NQU5ZX0FOQ19FTEVNRU5UUzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIGludCBpOwogCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhbmNCeXRlczsgaSsrKSB7Ci0gICAgICAgICAgYW5jRGF0YS0+YnVmZmVyW2krb2Zmc2V0XSA9IEZES3JlYWRCaXRzKGhCcywgOCk7CisgICAgICAgICAgYW5jRGF0YS0+YnVmZmVyW2kgKyBvZmZzZXRdID0gRkRLcmVhZEJpdHMoaEJzLCA4KTsKICAgICAgICAgICByZWFkQnl0ZXMrKzsKICAgICAgICAgfQogCiAgICAgICAgIGFuY0RhdGEtPm5yRWxlbWVudHMrKzsKLSAgICAgICAgYW5jRGF0YS0+b2Zmc2V0W2FuY0RhdGEtPm5yRWxlbWVudHNdID0gYW5jQnl0ZXMgKyBhbmNEYXRhLT5vZmZzZXRbYW5jRGF0YS0+bnJFbGVtZW50cy0xXTsKKyAgICAgICAgYW5jRGF0YS0+b2Zmc2V0W2FuY0RhdGEtPm5yRWxlbWVudHNdID0KKyAgICAgICAgICAgIGFuY0J5dGVzICsgYW5jRGF0YS0+b2Zmc2V0W2FuY0RhdGEtPm5yRWxlbWVudHMgLSAxXTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTMxMCw3ICs0MTksNyBAQAogCiAgIGlmIChyZWFkQnl0ZXMgPiAwKSB7CiAgICAgLyogc2tpcCBkYXRhICovCi0gICAgRkRLcHVzaEZvcihoQnMsIHJlYWRCeXRlczw8Myk7CisgICAgRkRLcHVzaEZvcihoQnMsIHJlYWRCeXRlcyA8PCAzKTsKICAgfQogCiAgIHJldHVybiBlcnJvcjsKQEAgLTMyMyw3NSArNDMyLDY3IEBACiAKICAgXHJldHVybiAgRXJyb3IgY29kZQogKi8KLXN0YXRpYyBBQUNfREVDT0RFUl9FUlJPUiBDRGF0YVN0cmVhbUVsZW1lbnRfUmVhZCAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9BQUNERUNPREVSICAgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAqZWxlbWVudEluc3RhbmNlVGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgYWxpZ25tZW50QW5jaG9yICkKLXsKLSAgSEFORExFX1RSQU5TUE9SVERFQyAgcFRwOwotICBDQW5jRGF0YSAqYW5jRGF0YTsKK3N0YXRpYyBBQUNfREVDT0RFUl9FUlJPUiBDRGF0YVN0cmVhbUVsZW1lbnRfUmVhZChIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICplbGVtZW50SW5zdGFuY2VUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBhbGlnbm1lbnRBbmNob3IpIHsKICAgQUFDX0RFQ09ERVJfRVJST1IgZXJyb3IgPSBBQUNfREVDX09LOwotICBVSU5UIGRhdGFTdGFydCwgZHNlQml0czsKKyAgVUlOVCBkc2VCaXRzOworICBJTlQgZGF0YVN0YXJ0OwogICBpbnQgZGF0YUJ5dGVBbGlnbkZsYWcsIGNvdW50OwogCiAgIEZES19BU1NFUlQoc2VsZiAhPSBOVUxMKTsKIAotICBhbmNEYXRhID0gJnNlbGYtPmFuY0RhdGE7Ci0gIHBUcCA9IHNlbGYtPmhJbnB1dDsKLQotICBpbnQgY3JjUmVnID0gdHJhbnNwb3J0RGVjX0NyY1N0YXJ0UmVnKHBUcCwgMCk7CisgIGludCBjcmNSZWcgPSB0cmFuc3BvcnREZWNfQ3JjU3RhcnRSZWcoc2VsZi0+aElucHV0LCAwKTsKIAogICAvKiBFbGVtZW50IEluc3RhbmNlIFRhZyAqLwotICAqZWxlbWVudEluc3RhbmNlVGFnID0gRkRLcmVhZEJpdHMoYnMsNCk7CisgICplbGVtZW50SW5zdGFuY2VUYWcgPSBGREtyZWFkQml0cyhicywgNCk7CiAgIC8qIERhdGEgQnl0ZSBBbGlnbiBGbGFnICovCi0gIGRhdGFCeXRlQWxpZ25GbGFnID0gRkRLcmVhZEJpdHMoYnMsMSk7CisgIGRhdGFCeXRlQWxpZ25GbGFnID0gRkRLcmVhZEJpdHMoYnMsIDEpOwogCi0gIGNvdW50ID0gRkRLcmVhZEJpdHMoYnMsOCk7CisgIGNvdW50ID0gRkRLcmVhZEJpdHMoYnMsIDgpOwogCiAgIGlmIChjb3VudCA9PSAyNTUpIHsKLSAgICBjb3VudCArPSBGREtyZWFkQml0cyhicyw4KTsgLyogRXNjQ291bnQgKi8KKyAgICBjb3VudCArPSBGREtyZWFkQml0cyhicywgOCk7IC8qIEVzY0NvdW50ICovCiAgIH0KLSAgZHNlQml0cyA9IGNvdW50Kjg7CisgIGRzZUJpdHMgPSBjb3VudCAqIDg7CiAKICAgaWYgKGRhdGFCeXRlQWxpZ25GbGFnKSB7CiAgICAgRkRLYnl0ZUFsaWduKGJzLCBhbGlnbm1lbnRBbmNob3IpOwogICB9CiAKLSAgZGF0YVN0YXJ0ID0gRkRLZ2V0VmFsaWRCaXRzKGJzKTsKKyAgZGF0YVN0YXJ0ID0gKElOVClGREtnZXRWYWxpZEJpdHMoYnMpOwogCi0gIGVycm9yID0gQ0FhY0RlY29kZXJfQW5jRGF0YVBhcnNlKGFuY0RhdGEsIGJzLCBjb3VudCk7Ci0gIHRyYW5zcG9ydERlY19DcmNFbmRSZWcocFRwLCBjcmNSZWcpOworICBlcnJvciA9IENBYWNEZWNvZGVyX0FuY0RhdGFQYXJzZSgmc2VsZi0+YW5jRGF0YSwgYnMsIGNvdW50KTsKKyAgdHJhbnNwb3J0RGVjX0NyY0VuZFJlZyhzZWxmLT5oSW5wdXQsIGNyY1JlZyk7CiAKICAgewotICAgIC8qIE1vdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF0YSBqdW5rICovCi0gICAgRkRLcHVzaEJhY2soYnMsIGRhdGFTdGFydC1GREtnZXRWYWxpZEJpdHMoYnMpKTsKKyAgICAvKiBNb3ZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEgY2h1bmsgKi8KKyAgICBGREtwdXNoQmFjayhicywgZGF0YVN0YXJ0IC0gKElOVClGREtnZXRWYWxpZEJpdHMoYnMpKTsKIAogICAgIC8qIFJlYWQgQW5jIGRhdGEgaWYgYXZhaWxhYmxlICovCi0gICAgYWFjRGVjb2Rlcl9kcmNNYXJrUGF5bG9hZCggc2VsZi0+aERyY0luZm8sIGJzLCBEVkJfRFJDX0FOQ19EQVRBICk7CisgICAgYWFjRGVjb2Rlcl9kcmNNYXJrUGF5bG9hZChzZWxmLT5oRHJjSW5mbywgYnMsIERWQl9EUkNfQU5DX0RBVEEpOwogICB9CiAKICAgewogICAgIFBDTURNWF9FUlJPUiBkbXhFcnIgPSBQQ01ETVhfT0s7CiAKLSAgICAvKiBNb3ZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEganVuayAqLwotICAgIEZES3B1c2hCYWNrKGJzLCBkYXRhU3RhcnQtRkRLZ2V0VmFsaWRCaXRzKGJzKSk7CisgICAgLyogTW92ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhIGNodW5rICovCisgICAgRkRLcHVzaEJhY2soYnMsIGRhdGFTdGFydCAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKSk7CiAKICAgICAvKiBSZWFkIERNWCBtZXRhLWRhdGEgKi8KLSAgICBkbXhFcnIgPSBwY21EbXhfUGFyc2UgKAotICAgICAgICAgICAgICAgICAgICAgc2VsZi0+aFBjbVV0aWxzLAotICAgICAgICAgICAgICAgICAgICAgYnMsCi0gICAgICAgICAgICAgICAgICAgICBkc2VCaXRzLAotICAgICAgICAgICAgICAgICAgICAgMCAvKiBub3QgbXBlZzIgKi8gKTsKKyAgICBkbXhFcnIgPSBwY21EbXhfUGFyc2Uoc2VsZi0+aFBjbVV0aWxzLCBicywgZHNlQml0cywgMCAvKiBub3QgbXBlZzIgKi8pOworICAgIGlmIChlcnJvciA9PSBBQUNfREVDX09LICYmIGRteEVyciAhPSBQQ01ETVhfT0spIHsKKyAgICAgIGVycm9yID0gQUFDX0RFQ19VTktOT1dOOwogICAgIH0KKyAgfQogCiAgIC8qIE1vdmUgdG8gdGhlIHZlcnkgZW5kIG9mIHRoZSBlbGVtZW50LiAqLwotICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgRkRLZ2V0VmFsaWRCaXRzKGJzKS1kYXRhU3RhcnQrZHNlQml0cyk7CisgIEZES3B1c2hCaURpcmVjdGlvbmFsKGJzLCAoSU5UKUZES2dldFZhbGlkQml0cyhicykgLSBkYXRhU3RhcnQgKyAoSU5UKWRzZUJpdHMpOwogCiAgIHJldHVybiBlcnJvcjsKIH0KIAotI2lmZGVmIFRQX1BDRV9FTkFCTEUKIC8qIQogICBcYnJpZWYgUmVhZCBQcm9ncmFtIENvbmZpZyBFbGVtZW50CiAKQEAgLTQwMSwxNSArNTAyLDE0IEBACiAgIFxjaGFubmVsQ29uZmlnIEN1cnJlbnQgY2hhbm5lbCBjb25maWd1cmF0aW9uCiAgIFxhbGlnbkFuY2hvciBBbmNob3IgZm9yIGJ5dGUgYWxpZ25tZW50CiAKLSAgXHJldHVybiAgUENFIHN0YXR1cyAoLTE6IGZhaWwsIDA6IG5vIG5ldyBQQ0UsIDE6IFBDRSB1cGRhdGVkLCAyOiBQQ0UgdXBkYXRlZCBuZWVkIHJlLWNvbmZpZykuCisgIFxyZXR1cm4gIFBDRSBzdGF0dXMgKC0xOiBmYWlsLCAwOiBubyBuZXcgUENFLCAxOiBQQ0UgdXBkYXRlZCwgMjogUENFIHVwZGF0ZWQKKyAgbmVlZCByZS1jb25maWcpLgogKi8KLXN0YXRpYyBpbnQgQ1Byb2dyYW1Db25maWdFbGVtZW50X1JlYWQgKAotICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgIEhBTkRMRV9UUkFOU1BPUlRERUMgIHBUcCwKLSAgICBDUHJvZ3JhbUNvbmZpZyAgICAgICpwY2UsCi0gICAgY29uc3QgVUlOVCAgICAgICAgICAgY2hhbm5lbENvbmZpZywKLSAgICBjb25zdCBVSU5UICAgICAgICAgICBhbGlnbkFuY2hvciApCi17CitzdGF0aWMgaW50IENQcm9ncmFtQ29uZmlnRWxlbWVudF9SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfVFJBTlNQT1JUREVDIHBUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1Byb2dyYW1Db25maWcgKnBjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBjaGFubmVsQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGFsaWduQW5jaG9yKSB7CiAgIGludCBwY2VTdGF0dXMgPSAwOwogICBpbnQgY3JjUmVnOwogCkBAIC00MTcsNyArNTE3LDYgQEAKICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHRtcFBjZSwgQ1Byb2dyYW1Db25maWcsIDEpOwogCiAgIENQcm9ncmFtQ29uZmlnX0luaXQodG1wUGNlKTsKLSAgQ1Byb2dyYW1Db25maWdfUmVzZXQodG1wUGNlKTsKIAogICBjcmNSZWcgPSB0cmFuc3BvcnREZWNfQ3JjU3RhcnRSZWcocFRwLCAwKTsKIApAQCAtNDI1LDM1ICs1MjQsMzQgQEAKIAogICB0cmFuc3BvcnREZWNfQ3JjRW5kUmVnKHBUcCwgY3JjUmVnKTsKIAotICBpZiAoICBDUHJvZ3JhbUNvbmZpZ19Jc1ZhbGlkKHRtcFBjZSkKLSAgICAmJiAodG1wUGNlLT5Qcm9maWxlID09IDEpICkKLSAgewotICAgIGlmICggIXBjZS0+aXNWYWxpZCAmJiAoY2hhbm5lbENvbmZpZyA+IDApICkgeworICBpZiAoQ1Byb2dyYW1Db25maWdfSXNWYWxpZCh0bXBQY2UpICYmICh0bXBQY2UtPlByb2ZpbGUgPT0gMSkpIHsKKyAgICBpZiAoIUNQcm9ncmFtQ29uZmlnX0lzVmFsaWQocGNlKSAmJiAoY2hhbm5lbENvbmZpZyA+IDApKSB7CiAgICAgICAvKiBDcmVhdGUgYSBzdGFuZGFyZCBjaGFubmVsIGNvbmZpZyBQQ0UgdG8gY29tcGFyZSB3aXRoICovCi0gICAgICBDUHJvZ3JhbUNvbmZpZ19HZXREZWZhdWx0KCBwY2UsIGNoYW5uZWxDb25maWcgKTsKKyAgICAgIENQcm9ncmFtQ29uZmlnX0dldERlZmF1bHQocGNlLCBjaGFubmVsQ29uZmlnKTsKICAgICB9CiAKLSAgICBpZiAocGNlLT5pc1ZhbGlkKSB7CisgICAgaWYgKENQcm9ncmFtQ29uZmlnX0lzVmFsaWQocGNlKSkgewogICAgICAgLyogQ29tcGFyZSB0aGUgbmV3IGFuZCB0aGUgb2xkIFBDRSAodGFncyBpZ25vcmVkKSAqLwotICAgICAgc3dpdGNoICggQ1Byb2dyYW1Db25maWdfQ29tcGFyZSggcGNlLCB0bXBQY2UgKSApCi0gICAgICB7Ci0gICAgICBjYXNlIDE6ICAvKiBDaGFubmVsIGNvbmZpZ3VyYXRpb24gbm90IGNoYW5nZWQuIEp1c3QgbmV3IG1ldGFkYXRhLiAqLwotICAgICAgICBGREttZW1jcHkocGNlLCB0bXBQY2UsIHNpemVvZihDUHJvZ3JhbUNvbmZpZykpOyAgICAvKiBTdG9yZSB0aGUgY29tcGxldGUgUENFICovCi0gICAgICAgIHBjZVN0YXR1cyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBQQ0UgYnV0IG5vIGNoYW5nZSBvZiBjb25maWcgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDI6ICAvKiBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIGFyZSBpZGVudGljYWwgYnV0IG5vdCB0aGUgY29uZmlnICovCi0gICAgICAgIGlmIChjaGFubmVsQ29uZmlnID09IDApIHsKLSAgICAgICAgICBGREttZW1jcHkocGNlLCB0bXBQY2UsIHNpemVvZihDUHJvZ3JhbUNvbmZpZykpOyAgLyogU3RvcmUgdGhlIGNvbXBsZXRlIFBDRSAqLwotICAgICAgICAgIHBjZVN0YXR1cyA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWNvZGVyIG5lZWRzIHJlLWNvbmZpZ3VyYXRpb24gKi8KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgLTE6ICAvKiBUaGUgY2hhbm5lbCBjb25maWd1cmF0aW9uIGlzIGNvbXBsZXRlbHkgZGlmZmVyZW50ICovCi0gICAgICAgIHBjZVN0YXR1cyA9IC0xOyAgLyogTm90IHN1cHBvcnRlZCEgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDA6ICAvKiBOb3RoaW5nIHRvIGRvIGJlY2F1c2UgUENFIG1hdGNoZXMgdGhlIG9sZCBvbmUgZXhhY3RseS4gKi8KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8qIHBjZVN0YXR1cyA9IDA7ICovCi0gICAgICAgIGJyZWFrOworICAgICAgc3dpdGNoIChDUHJvZ3JhbUNvbmZpZ19Db21wYXJlKHBjZSwgdG1wUGNlKSkgeworICAgICAgICBjYXNlIDE6IC8qIENoYW5uZWwgY29uZmlndXJhdGlvbiBub3QgY2hhbmdlZC4gSnVzdCBuZXcgbWV0YWRhdGEuICovCisgICAgICAgICAgRkRLbWVtY3B5KHBjZSwgdG1wUGNlLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ1Byb2dyYW1Db25maWcpKTsgLyogU3RvcmUgdGhlIGNvbXBsZXRlIFBDRSAqLworICAgICAgICAgIHBjZVN0YXR1cyA9IDE7IC8qIE5ldyBQQ0UgYnV0IG5vIGNoYW5nZSBvZiBjb25maWcgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOiAvKiBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIGFyZSBpZGVudGljYWwgYnV0IG5vdCB0aGUgY29uZmlnICovCisgICAgICAgICAgaWYgKGNoYW5uZWxDb25maWcgPT0gMCkgeworICAgICAgICAgICAgRkRLbWVtY3B5KHBjZSwgdG1wUGNlLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDUHJvZ3JhbUNvbmZpZykpOyAvKiBTdG9yZSB0aGUgY29tcGxldGUgUENFICovCisgICAgICAgICAgICBwY2VTdGF0dXMgPSAyOyAvKiBEZWNvZGVyIG5lZWRzIHJlLWNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgLTE6IC8qIFRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gaXMgY29tcGxldGVseSBkaWZmZXJlbnQgKi8KKyAgICAgICAgICBwY2VTdGF0dXMgPSAtMTsgLyogTm90IHN1cHBvcnRlZCEgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOiAvKiBOb3RoaW5nIHRvIGRvIGJlY2F1c2UgUENFIG1hdGNoZXMgdGhlIG9sZCBvbmUgZXhhY3RseS4gKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAvKiBwY2VTdGF0dXMgPSAwOyAqLworICAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtNDYyLDcgKzU2MCwyNDMgQEAKIAogICByZXR1cm4gcGNlU3RhdHVzOwogfQotI2VuZGlmIC8qIFRQX1BDRV9FTkFCTEUgKi8KKworLyohCisgIFxicmllZiBQcmVwYXJlcyBjcm9zc2ZhZGUgZm9yIFVTQUMgREFTSCBJUEYgY29uZmlnIGNoYW5nZQorCisgIFxwVGltZURhdGEgICAgICAgICAgICAgUG9pbnRlciB0byB0aW1lIGRhdGEKKyAgXHBUaW1lRGF0YUZsdXNoICAgICAgICBQb2ludGVyIHRvIGZsdXNoZWQgdGltZSBkYXRhCisgIFxudW1DaGFubmVscyAgICAgICAgICAgTnVtYmVyIG9mIGNoYW5uZWxzCisgIFxmcmFtZVNpemUgICAgICAgICAgICAgU2l6ZSBvZiBmcmFtZQorICBcaW50ZXJsZWF2ZWQgICAgICAgICAgIEluZGljYXRlcyBpZiB0aW1lIGRhdGEgaXMgaW50ZXJsZWF2ZWQKKworICBccmV0dXJuICBFcnJvciBjb2RlCisqLworTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIENBYWNEZWNvZGVyX1ByZXBhcmVDcm9zc0ZhZGUoCisgICAgY29uc3QgSU5UX1BDTSAqcFRpbWVEYXRhLCBJTlRfUENNICoqcFRpbWVEYXRhRmx1c2gsIGNvbnN0IElOVCBudW1DaGFubmVscywKKyAgICBjb25zdCBJTlQgZnJhbWVTaXplLCBjb25zdCBJTlQgaW50ZXJsZWF2ZWQpIHsKKyAgaW50IGksIGNoLCBzMSwgczI7CisgIEFBQ19ERUNPREVSX0VSUk9SIEVycm9yU3RhdHVzOworCisgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19PSzsKKworICBpZiAoaW50ZXJsZWF2ZWQpIHsKKyAgICBzMSA9IDE7CisgICAgczIgPSBudW1DaGFubmVsczsKKyAgfSBlbHNlIHsKKyAgICBzMSA9IGZyYW1lU2l6ZTsKKyAgICBzMiA9IDE7CisgIH0KKworICBmb3IgKGNoID0gMDsgY2ggPCBudW1DaGFubmVsczsgY2grKykgeworICAgIGNvbnN0IElOVF9QQ00gKnBJbiA9ICZwVGltZURhdGFbY2ggKiBzMV07CisgICAgZm9yIChpID0gMDsgaSA8IFRJTUVfREFUQV9GTFVTSF9TSVpFOyBpKyspIHsKKyAgICAgIHBUaW1lRGF0YUZsdXNoW2NoXVtpXSA9ICpwSW47CisgICAgICBwSW4gKz0gczI7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEVycm9yU3RhdHVzOworfQorCisvKiEKKyAgXGJyaWVmIEFwcGxpZXMgY3Jvc3NmYWRlIGZvciBVU0FDIERBU0ggSVBGIGNvbmZpZyBjaGFuZ2UKKworICBccFRpbWVEYXRhICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGltZSBkYXRhCisgIFxwVGltZURhdGFGbHVzaCAgICAgICAgUG9pbnRlciB0byBmbHVzaGVkIHRpbWUgZGF0YQorICBcbnVtQ2hhbm5lbHMgICAgICAgICAgIE51bWJlciBvZiBjaGFubmVscworICBcZnJhbWVTaXplICAgICAgICAgICAgIFNpemUgb2YgZnJhbWUKKyAgXGludGVybGVhdmVkICAgICAgICAgICBJbmRpY2F0ZXMgaWYgdGltZSBkYXRhIGlzIGludGVybGVhdmVkCisKKyAgXHJldHVybiAgRXJyb3IgY29kZQorKi8KK0xJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9BcHBseUNyb3NzRmFkZSgKKyAgICBJTlRfUENNICpwVGltZURhdGEsIElOVF9QQ00gKipwVGltZURhdGFGbHVzaCwgY29uc3QgSU5UIG51bUNoYW5uZWxzLAorICAgIGNvbnN0IElOVCBmcmFtZVNpemUsIGNvbnN0IElOVCBpbnRlcmxlYXZlZCkgeworICBpbnQgaSwgY2gsIHMxLCBzMjsKKyAgQUFDX0RFQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7CisKKyAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX09LOworCisgIGlmIChpbnRlcmxlYXZlZCkgeworICAgIHMxID0gMTsKKyAgICBzMiA9IG51bUNoYW5uZWxzOworICB9IGVsc2UgeworICAgIHMxID0gZnJhbWVTaXplOworICAgIHMyID0gMTsKKyAgfQorCisgIGZvciAoY2ggPSAwOyBjaCA8IG51bUNoYW5uZWxzOyBjaCsrKSB7CisgICAgSU5UX1BDTSAqcEluID0gJnBUaW1lRGF0YVtjaCAqIHMxXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgVElNRV9EQVRBX0ZMVVNIX1NJWkU7IGkrKykgeworICAgICAgRklYUF9TR0wgYWxwaGEgPSAoRklYUF9TR0wpaQorICAgICAgICAgICAgICAgICAgICAgICA8PCAoRlJBQ1RfQklUUyAtIDEgLSBUSU1FX0RBVEFfRkxVU0hfU0laRV9TRik7CisgICAgICBGSVhQX0RCTCB0aW1lID0gRlhfUENNMkZYX0RCTCgqcEluKTsKKyAgICAgIEZJWFBfREJMIHRpbWVGbHVzaCA9IEZYX1BDTTJGWF9EQkwocFRpbWVEYXRhRmx1c2hbY2hdW2ldKTsKKworICAgICAgKnBJbiA9IChJTlRfUENNKShGSVhQX1BDTSlGWF9EQkwyRlhfUENNKAorICAgICAgICAgIHRpbWVGbHVzaCAtIGZNdWx0KHRpbWVGbHVzaCwgYWxwaGEpICsgZk11bHQodGltZSwgYWxwaGEpKTsKKyAgICAgIHBJbiArPSBzMjsKKyAgICB9CisgIH0KKworICByZXR1cm4gRXJyb3JTdGF0dXM7Cit9CisKKy8qIQorICBcYnJpZWYgUGFyc2UgUHJlUm9sbCBFeHRlbnNpb24gUGF5bG9hZAorCisgIFxzZWxmICAgICAgICAgICAgIEhhbmRsZSBvZiBBQUMgZGVjb2RlcgorICBcbnVtUHJlcm9sbEFVICAgICBOdW1iZXIgb2YgcHJlUm9sbCBBVXMKKyAgXHByZXJvbGxBVU9mZnNldCAgT2Zmc2V0IHRvIGVhY2ggcHJlUm9sbCBBVQorICBccHJlcm9sbEFVTGVuZ3RoICBMZW5ndGggb2YgZWFjaCBwcmVSb2xsIEFVCisKKyAgXHJldHVybiAgRXJyb3IgY29kZQorKi8KK0xJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9QcmVSb2xsRXh0ZW5zaW9uUGF5bG9hZFBhcnNlKAorICAgIEhBTkRMRV9BQUNERUNPREVSIHNlbGYsIFVJTlQgKm51bVByZXJvbGxBVSwgVUlOVCAqcHJlcm9sbEFVT2Zmc2V0LAorICAgIFVJTlQgKnByZXJvbGxBVUxlbmd0aCkgeworICBGREtfQklUU1RSRUFNIGJzOworICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnM7CisgIEFBQ19ERUNPREVSX0VSUk9SIEVycm9yU3RhdHVzOworCisgIElOVCBhdVN0YXJ0QW5jaG9yOworICBVSU5UIGluZGVwZW5kZW5jeUZsYWc7CisgIFVJTlQgZXh0UGF5bG9hZFByZXNlbnRGbGFnOworICBVSU5UIHVzZURlZmF1bHRMZW5ndGhGbGFnOworICBVSU5UIGNvbmZpZ0xlbmd0aCA9IDA7CisgIFVJTlQgcHJlUm9sbFBvc3NpYmxlID0gMTsKKyAgVUlOVCBpOworICBVQ0hBUiBjb25maWdDaGFuZ2VkID0gMDsKKyAgVUNIQVIgY29uZmlnW1RQX1VTQUNfTUFYX0NPTkZJR19MRU5dID0gezB9OworICBVQ0hBUgorICBpbXBsaWNpdEV4cGxpY2l0Q2ZnRGlmZiA9IDA7IC8qIGluIGNhc2UgaW1wbGljaXQgYW5kIGV4cGxpY2l0IGNvbmZpZyBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFsIHByZXJvbGwgQVUncyBzaG91bGQgYmUgcHJvY2Vzc2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgZGVjb2RlciByZXNldCAqLworCisgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19PSzsKKworICBoQnMgPSB0cmFuc3BvcnREZWNfR2V0Qml0c3RyZWFtKHNlbGYtPmhJbnB1dCwgMCk7CisgIGJzID0gKmhCczsKKworICBhdVN0YXJ0QW5jaG9yID0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKTsKKyAgaWYgKGF1U3RhcnRBbmNob3IgPD0gMCkgeworICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19OT1RfRU5PVUdIX0JJVFM7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogSW5kZXBlbmRlbmN5IGZsYWcgKi8KKyAgRkRLcmVhZEJpdChoQnMpOworCisgIC8qIFBheWxvYWQgcHJlc2VudCBmbGFnIG9mIGV4dGVuc2lvbiBJRF9FWFRfRUxFX0FVRElPUFJFUk9MTCBtdXN0IGJlIG9uZSAqLworICBleHRQYXlsb2FkUHJlc2VudEZsYWcgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBpZiAoIWV4dFBheWxvYWRQcmVzZW50RmxhZykgeworICAgIHByZVJvbGxQb3NzaWJsZSA9IDA7CisgIH0KKworICAvKiBEZWZhdWx0IGxlbmd0aCBmbGFnIG9mIGV4dGVuc2lvbiBJRF9FWFRfRUxFX0FVRElPUFJFUk9MTCBtdXN0IGJlIHplcm8gKi8KKyAgdXNlRGVmYXVsdExlbmd0aEZsYWcgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBpZiAodXNlRGVmYXVsdExlbmd0aEZsYWcpIHsKKyAgICBwcmVSb2xsUG9zc2libGUgPSAwOworICB9CisKKyAgaWYgKHByZVJvbGxQb3NzaWJsZSkgeyAvKiBleHRQYXlsb2FkUHJlc2VudEZsYWcgJiYgIXVzZURlZmF1bHRMZW5ndGhGbGFnICovCisgICAgLyogUmVhZCBvdmVyYWxsIGV4dCBwYXlsb2FkIGxlbmd0aCwgdXNlRGVmYXVsdExlbmd0aEZsYWcgbXVzdCBiZSB6ZXJvLiAgKi8KKyAgICBlc2NhcGVkVmFsdWUoaEJzLCA4LCAxNiwgMCk7CisKKyAgICAvKiBSZWFkIFJTVkQ2MCBDb25maWcgc2l6ZSAqLworICAgIGNvbmZpZ0xlbmd0aCA9IGVzY2FwZWRWYWx1ZShoQnMsIDQsIDQsIDgpOworCisgICAgLyogQXZvaWQgZGVjb2RpbmcgcHJlIHJvbGwgZnJhbWVzIGlmIHRoZXJlIHdhcyBubyBjb25maWcgY2hhbmdlIGFuZCBubworICAgICAqIGNvbmZpZyBpcyBpbmNsdWRlZCBpbiB0aGUgcHJlIHJvbGwgZXh0IHBheWxvYWQuICovCisgIH0KKworICAvKiBJZiBwcmUgcm9sbCBub3QgcG9zc2libGUgdGhlbiBleGl0LiAqLworICBpZiAocHJlUm9sbFBvc3NpYmxlID09IDApIHsKKyAgICAvKiBTYW5pdHkgY2hlY2s6IGlmIGZsdXNoaW5nIGlzIHN3aXRjaGVkIG9uLCBwcmVSb2xsUG9zc2libGUgbXVzdCBiZSAxICovCisgICAgaWYgKHNlbGYtPmZsdXNoU3RhdHVzICE9IEFBQ0RFQ19GTFVTSF9PRkYpIHsKKyAgICAgIC8qIE1pc21hdGNoIG9mIGN1cnJlbnQgcGF5bG9hZCBhbmQgZmx1c2hpbmcgc3RhdHVzICovCisgICAgICBzZWxmLT5mbHVzaFN0YXR1cyA9IEFBQ0RFQ19GTFVTSF9PRkY7CisgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgfQorICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIGlmIChzZWxmLT5mbGFnc1swXSAmIEFDX1VTQUMpIHsKKyAgICBpZiAoY29uZmlnTGVuZ3RoID4gMCkgeworICAgICAgLyogREFTSCBJUEYgVVNBQyBDb25maWcgQ2hhbmdlOiBSZWFkIG5ldyBjb25maWcgYW5kIGNvbXBhcmUgd2l0aCBjdXJyZW50CisgICAgICAgKiBjb25maWcuIEFwcGx5IHJlY29uZmlndXJhdGlvbiBpZiBjb25maWcncyBhcmUgZGlmZmVyZW50LiAqLworICAgICAgZm9yIChpID0gMDsgaSA8IGNvbmZpZ0xlbmd0aDsgaSsrKSB7CisgICAgICAgIGNvbmZpZ1tpXSA9IEZES3JlYWRCaXRzKGhCcywgOCk7CisgICAgICB9CisgICAgICBUUkFOU1BPUlRERUNfRVJST1IgdGVycjsKKyAgICAgIHRlcnIgPSB0cmFuc3BvcnREZWNfSW5CYW5kQ29uZmlnKHNlbGYtPmhJbnB1dCwgY29uZmlnLCBjb25maWdMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5idWlsZFVwU3RhdHVzLCAmY29uZmlnQ2hhbmdlZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbXBsaWNpdEV4cGxpY2l0Q2ZnRGlmZik7CisgICAgICBpZiAodGVyciAhPSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogRm9yIHRoZSBmaXJzdCBmcmFtZSBidWlsZFVwU3RhdHVzIGlzIG5vdCBzZXQgYW5kIG5vIGZsdXNoaW5nIGlzIHBlcmZvcm1lZAorICAgKiBidXQgcHJlcm9sbCBBVSdzIHNob3VsZCBwcm9jZXNzZWQuICovCisgIC8qIEZvciBVU0FDIHRoZXJlIGlzIG5vIGlkbGUgc3RhdGUuICovCisgIGlmICgoc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyA9PSAwKSAmJiAhaW1wbGljaXRFeHBsaWNpdENmZ0RpZmYgJiYKKyAgICAgIChzZWxmLT5mbGFnc1swXSAmIEFDX1VTQUMpKSB7CisgICAgc2VsZi0+YnVpbGRVcFN0YXR1cyA9IEFBQ0RFQ19VU0FDX0JVSUxEX1VQX09OOworICAgIC8qIHNhbml0eSBjaGVjazogaWYgYnVpbGRVcCBzdGF0dXMgb24gLT4gZmx1c2hpbmcgbXVzdCBiZSBvZmYgKi8KKyAgICBpZiAoc2VsZi0+Zmx1c2hTdGF0dXMgIT0gQUFDREVDX0ZMVVNIX09GRikgeworICAgICAgc2VsZi0+Zmx1c2hTdGF0dXMgPSBBQUNERUNfRkxVU0hfT0ZGOworICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfQorCisgIGlmIChzZWxmLT5mbGFnc1swXSAmIEFDX1VTQUMpIHsKKyAgICAvKiBXZSBhcmUgaW50ZXJlc3RlZCBpbiBwcmVyb2xsIEFVcyBpZiBhbiBleHBsaWNpdCBvciBhbiBpbXBsaWNpdCBjb25maWcKKyAgICAgKiBjaGFuZ2UgaXMgc2lnbmFsaXplZCBpbiBvdGhlciB3b3JkcyBpZiB0aGUgYnVpbGQgdXAgc3RhdHVzIGlzIHNldC4gKi8KKyAgICBpZiAoc2VsZi0+YnVpbGRVcFN0YXR1cyA9PSBBQUNERUNfVVNBQ19CVUlMRF9VUF9PTikgeworICAgICAgc2VsZi0+YXBwbHlDcm9zc2ZhZGUgfD0gRkRLcmVhZEJpdChoQnMpOworICAgICAgRkRLcmVhZEJpdChoQnMpOyAvKiByZXNlcnZlZCAqLworICAgICAgLyogUmVhZCBudW0gcHJlcm9sbCBBVSdzICovCisgICAgICAqbnVtUHJlcm9sbEFVID0gZXNjYXBlZFZhbHVlKGhCcywgMiwgNCwgMCk7CisgICAgICAvKiBjaGVjayBsaW1pdHMgZm9yIFVTQUMgKi8KKyAgICAgIGlmICgqbnVtUHJlcm9sbEFVID4gQUFDREVDX01BWF9OVU1fUFJFUk9MTF9BVV9VU0FDKSB7CisgICAgICAgICpudW1QcmVyb2xsQVUgPSAwOworICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgKm51bVByZXJvbGxBVTsgaSsrKSB7CisgICAgLyogRm9yIGV2ZXJ5IEFVIGdldCBsZW5ndGggYW5kIG9mZnNldCBpbiB0aGUgYml0c3RyZWFtICovCisgICAgcHJlcm9sbEFVTGVuZ3RoW2ldID0gZXNjYXBlZFZhbHVlKGhCcywgMTYsIDE2LCAwKTsKKyAgICBpZiAocHJlcm9sbEFVTGVuZ3RoW2ldID4gMCkgeworICAgICAgcHJlcm9sbEFVT2Zmc2V0W2ldID0gYXVTdGFydEFuY2hvciAtIEZES2dldFZhbGlkQml0cyhoQnMpOworICAgICAgaW5kZXBlbmRlbmN5RmxhZyA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICAgIGlmIChpID09IDAgJiYgIWluZGVwZW5kZW5jeUZsYWcpIHsKKyAgICAgICAgKm51bVByZXJvbGxBVSA9IDA7CisgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgICAgRkRLcHVzaEZvcihoQnMsIHByZXJvbGxBVUxlbmd0aFtpXSAqIDggLSAxKTsKKyAgICAgIHNlbGYtPnByZXJvbGxBVUxlbmd0aFtpXSA9IChwcmVyb2xsQVVMZW5ndGhbaV0gKiA4KSArIHByZXJvbGxBVU9mZnNldFtpXTsKKyAgICB9IGVsc2UgeworICAgICAgKm51bVByZXJvbGxBVSA9IDA7CisgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfUEFSU0VfRVJST1I7IC8qIFNvbWV0aGluZyBpcyB3cm9uZyAqLworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfQorCitiYWlsOgorCisgICpoQnMgPSBiczsKKworICByZXR1cm4gRXJyb3JTdGF0dXM7Cit9CiAKIC8qIQogICBcYnJpZWYgUGFyc2UgRXh0ZW5zaW9uIFBheWxvYWQKQEAgLTQ3MywxNCArODA3LDkgQEAKIAogICBccmV0dXJuICBFcnJvciBjb2RlCiAqLwotc3RhdGljCi1BQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9FeHRQYXlsb2FkUGFyc2UgKEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVA0X0VMRU1FTlRfSUQgcHJldmlvdXNfZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVsSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmSXNGaWxsRWxlbWVudCkKLXsKK3N0YXRpYyBBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9FeHRQYXlsb2FkUGFyc2UoCisgICAgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBpbnQgKmNvdW50LAorICAgIE1QNF9FTEVNRU5UX0lEIHByZXZpb3VzX2VsZW1lbnQsIGludCBlbEluZGV4LCBpbnQgZklzRmlsbEVsZW1lbnQpIHsKICAgQUFDX0RFQ09ERVJfRVJST1IgZXJyb3IgPSBBQUNfREVDX09LOwogICBFWFRfUEFZTE9BRF9UWVBFIGV4dGVuc2lvbl90eXBlOwogICBpbnQgYnl0ZXMgPSAoKmNvdW50KSA+PiAzOwpAQCAtNDkyLDE4MiArODIxLDI3NCBAQAogICAgIHJldHVybiBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKICAgfQogCi0gIGV4dGVuc2lvbl90eXBlID0gKEVYVF9QQVlMT0FEX1RZUEUpIEZES3JlYWRCaXRzKGhCcywgNCk7ICAgIC8qIGJzX2V4dGVuc2lvbl90eXBlICovCisgIGV4dGVuc2lvbl90eXBlID0KKyAgICAgIChFWFRfUEFZTE9BRF9UWVBFKUZES3JlYWRCaXRzKGhCcywgNCk7IC8qIGJzX2V4dGVuc2lvbl90eXBlICovCiAgICpjb3VudCAtPSA0OwogCi0gIHN3aXRjaCAoZXh0ZW5zaW9uX3R5cGUpCi0gIHsKLSAgY2FzZSBFWFRfRFlOQU1JQ19SQU5HRToKLSAgICB7Ci0gICAgICBJTlQgcmVhZEJpdHMgPSBhYWNEZWNvZGVyX2RyY01hcmtQYXlsb2FkKCBzZWxmLT5oRHJjSW5mbywgaEJzLCBNUEVHX0RSQ19FWFRfREFUQSApOworICAvKiBGb3IgRUxELCB0aGUgU0JSIHNpZ25hbGluZyBpcyBleHBsaWNpdCBhbmQgcGFyc2VkIGluCisgICAgIGFhY0RlY29kZXJfUGFyc2VFeHBsaWNpdE1wc0FuZFNicigpLCB0aGVyZWZvcmUgc2tpcCBTQlIgaWYgaW1wbGljaXQKKyAgICAgcHJlc2VudC4gKi8KKyAgaWYgKChzZWxmLT5mbGFnc1swXSAmIEFDX0VMRCkgJiYgKChleHRlbnNpb25fdHlwZSA9PSBFWFRfU0JSX0RBVEFfQ1JDKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4dGVuc2lvbl90eXBlID09IEVYVF9TQlJfREFUQSkpKSB7CisgICAgZXh0ZW5zaW9uX3R5cGUgPSBFWFRfRklMOyAvKiBza2lwIHNiciBkYXRhICovCisgIH0KIAotICAgICAgaWYgKHJlYWRCaXRzID4gKmNvdW50KQotICAgICAgeyAvKiBSZWFkIHRvbyBtdWNoLiBTb21ldGhpbmcgd2VudCB3cm9uZyEgKi8KKyAgc3dpdGNoIChleHRlbnNpb25fdHlwZSkgeworICAgIGNhc2UgRVhUX0RZTkFNSUNfUkFOR0U6IHsKKyAgICAgIElOVCByZWFkQml0cyA9CisgICAgICAgICAgYWFjRGVjb2Rlcl9kcmNNYXJrUGF5bG9hZChzZWxmLT5oRHJjSW5mbywgaEJzLCBNUEVHX0RSQ19FWFRfREFUQSk7CisKKyAgICAgIGlmIChyZWFkQml0cyA+ICpjb3VudCkgeyAvKiBSZWFkIHRvbyBtdWNoLiBTb21ldGhpbmcgd2VudCB3cm9uZyEgKi8KICAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOwogICAgICAgfQogICAgICAgKmNvdW50IC09IHJlYWRCaXRzOwotICAgIH0KLSAgICBicmVhazsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgRVhUX1VOSV9EUkM6IHsKKyAgICAgIERSQ19ERUNfRVJST1IgZHJjRXJyID0gRFJDX0RFQ19PSzsKKyAgICAgIERSQ19ERUNfQ09ERUNfTU9ERSBkcmNEZWNDb2RlY01vZGUgPSBEUkNfREVDX0NPREVDX01PREVfVU5ERUZJTkVEOworICAgICAgSU5UIG5CaXRzUmVtYWluaW5nID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisgICAgICBJTlQgcmVhZEJpdHM7CiAKLQotICBjYXNlIEVYVF9TQlJfREFUQV9DUkM6Ci0gICAgY3JjRmxhZyA9IDE7Ci0gIGNhc2UgRVhUX1NCUl9EQVRBOgotICAgIGlmIChJU19DSEFOTkVMX0VMRU1FTlQocHJldmlvdXNfZWxlbWVudCkpIHsKLSAgICAgIFNCUl9FUlJPUiBzYnJFcnJvcjsKLQotICAgICAgQ0FhY0RlY29kZXJfU3luY1FtZk1vZGUoc2VsZik7Ci0KLSAgICAgIHNickVycm9yID0gc2JyRGVjb2Rlcl9Jbml0RWxlbWVudCgKLSAgICAgICAgICAgICAgc2VsZi0+aFNickRlY29kZXIsCi0gICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5leHRTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFvdCwKLSAgICAgICAgICAgICAgcHJldmlvdXNfZWxlbWVudCwKLSAgICAgICAgICAgICAgZWxJbmRleAotICAgICAgICAgICAgICApOwotCi0gICAgICBpZiAoc2JyRXJyb3IgPT0gU0JSREVDX09LKSB7Ci0gICAgICAgIHNickVycm9yID0gc2JyRGVjb2Rlcl9QYXJzZSAoCi0gICAgICAgICAgICAgICAgc2VsZi0+aFNickRlY29kZXIsCi0gICAgICAgICAgICAgICAgaEJzLAotICAgICAgICAgICAgICAgIGNvdW50LAotICAgICAgICAgICAgICAgKmNvdW50LAotICAgICAgICAgICAgICAgIGNyY0ZsYWcsCi0gICAgICAgICAgICAgICAgcHJldmlvdXNfZWxlbWVudCwKLSAgICAgICAgICAgICAgICBlbEluZGV4LAotICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzICYgQUNfSU5ERVAgKTsKLSAgICAgICAgLyogRW5hYmxlIFNCUiBmb3IgaW1wbGljaXQgU0JSIHNpZ25hbGxpbmcgYnV0IG9ubHkgaWYgbm8gc2V2ZXJlIGVycm9yIGhhcHBlbmQuICovCi0gICAgICAgIGlmICggKHNickVycm9yID09IFNCUkRFQ19PSykKLSAgICAgICAgICB8fCAoc2JyRXJyb3IgPT0gU0JSREVDX1BBUlNFX0VSUk9SKSApIHsKLSAgICAgICAgICBzZWxmLT5zYnJFbmFibGVkID0gMTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogRG8gbm90IHRyeSB0byBhcHBseSBTQlIgYmVjYXVzZSBpbml0aWFsaXppbmcgdGhlIGVsZW1lbnQgZmFpbGVkLiAqLwotICAgICAgICBzZWxmLT5zYnJFbmFibGVkID0gMDsKKyAgICAgIHN3aXRjaCAoc2VsZi0+c3RyZWFtSW5mby5hb3QpIHsKKyAgICAgICAgY2FzZSBBT1RfQUFDX0xDOgorICAgICAgICBjYXNlIEFPVF9TQlI6CisgICAgICAgIGNhc2UgQU9UX1BTOgorICAgICAgICAgIGRyY0RlY0NvZGVjTW9kZSA9IERSQ19ERUNfTVBFR180X0FBQzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBlcnJvciA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgZ290byBiYWlsOwogICAgICAgfQotICAgICAgLyogQ2l0YXRpb24gZnJvbSBJU08vSUVDIDE0NDk2LTMgY2hhcHRlciA0LjUuMi4xLjUuMgotICAgICAgRmlsbCBlbGVtZW50cyBjb250YWluaW5nIGFuIGV4dGVuc2lvbl9wYXlsb2FkKCkgd2l0aCBhbiBleHRlbnNpb25fdHlwZSBvZiBFWFRfU0JSX0RBVEEKLSAgICAgIG9yIEVYVF9TQlJfREFUQV9DUkMgc2hhbGwgbm90IGNvbnRhaW4gYW55IG90aGVyIGV4dGVuc2lvbl9wYXlsb2FkIG9mIGFueSBvdGhlciBleHRlbnNpb25fdHlwZS4KLSAgICAgICovCi0gICAgICBpZiAoZklzRmlsbEVsZW1lbnQpIHsKLSAgICAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoaEJzLCAqY291bnQpOworCisgICAgICBkcmNFcnIgPSBGREtfZHJjRGVjX1NldENvZGVjTW9kZShzZWxmLT5oVW5pRHJjRGVjb2RlciwgZHJjRGVjQ29kZWNNb2RlKTsKKyAgICAgIGlmIChkcmNFcnIpIHsKKyAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisKKyAgICAgIGRyY0VyciA9IEZES19kcmNEZWNfUmVhZFVuaURyYyhzZWxmLT5oVW5pRHJjRGVjb2RlciwgaEJzKTsKKyAgICAgIGlmIChkcmNFcnIpIHsKKyAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICByZWFkQml0cyA9IChJTlQpbkJpdHNSZW1haW5pbmcgLSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpOworICAgICAgaWYgKHJlYWRCaXRzID4gKmNvdW50KSB7IC8qIFJlYWQgdG9vIG11Y2guIFNvbWV0aGluZyB3ZW50IHdyb25nISAqLworICAgICAgICBlcnJvciA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICB9CisgICAgICAqY291bnQgLT0gcmVhZEJpdHM7CisgICAgICAvKiBTa2lwIGFueSB0cmFpbGluZyBiaXRzICovCisgICAgICBGREtwdXNoRm9yKGhCcywgKmNvdW50KTsKKyAgICAgICpjb3VudCA9IDA7CisgICAgfSBicmVhazsKKyAgICBjYXNlIEVYVF9MRFNBQ19EQVRBOgorICAgIGNhc2UgRVhUX1NBQ19EQVRBOgorICAgICAgLyogUmVhZCBNUEVHIFN1cnJvdW5kIEV4dGVuc2lvbiBwYXlsb2FkICovCisgICAgICB7CisgICAgICAgIGludCBlcnIsIG1wc1NhbXBsZVJhdGUsIG1wc0ZyYW1lU2l6ZTsKKworICAgICAgICBpZiAoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19QU19QUkVTRU5UKSB7CisgICAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEhhbmRsZSBTQlIgZHVhbCByYXRlIGNhc2UgKi8KKyAgICAgICAgaWYgKHNlbGYtPnN0cmVhbUluZm8uZXh0U2FtcGxpbmdSYXRlICE9IDApIHsKKyAgICAgICAgICBtcHNTYW1wbGVSYXRlID0gc2VsZi0+c3RyZWFtSW5mby5leHRTYW1wbGluZ1JhdGU7CisgICAgICAgICAgbXBzRnJhbWVTaXplID0gc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgKgorICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLT5zdHJlYW1JbmZvLmV4dFNhbXBsaW5nUmF0ZSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbXBzU2FtcGxlUmF0ZSA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZTsKKyAgICAgICAgICBtcHNGcmFtZVNpemUgPSBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZTsKKyAgICAgICAgfQorICAgICAgICAvKiBTZXR0aW5nIG9mIGludGVybmFsIE1QUyBzdGF0ZTsgbWF5IGJlIHJlc2V0IGluCisgICAgICAgICAgIENBYWNEZWNvZGVyX1N5bmNRbWZNb2RlIGlmIGRlY29kZXIgaXMgdW5hYmxlIHRvIGRlY29kZSB3aXRoIHVzZXIKKyAgICAgICAgICAgZGVmaW5lZCBxbWZNb2RlICovCisgICAgICAgIGlmICghKHNlbGYtPmZsYWdzWzBdICYgKEFDX1VTQUMgfCBBQ19SU1ZENTAgfCBBQ19FTEQpKSkgeworICAgICAgICAgIHNlbGYtPm1wc0VuYWJsZUN1cnIgPSBzZWxmLT5tcHNFbmFibGVVc2VyOworICAgICAgICB9CisgICAgICAgIGlmIChzZWxmLT5tcHNFbmFibGVDdXJyKSB7CisgICAgICAgICAgaWYgKCFzZWxmLT5xbWZEb21haW4uZ2xvYmFsQ29uZi5xbWZEb21haW5FeHBsaWNpdENvbmZpZykgeworICAgICAgICAgICAgLyogaWYgbm90IGRvbmUgeWV0LCBhbGxvY2F0ZSBmdWxsIE1QRUcgU3Vycm91bmQgZGVjb2RlciBpbnN0YW5jZSAqLworICAgICAgICAgICAgaWYgKG1wZWdTdXJyb3VuZERlY29kZXJfSXNGdWxsTXBlZ1N1cnJvdW5kRGVjb2Rlckluc3RhbmNlQXZhaWxhYmxlKAorICAgICAgICAgICAgICAgICAgICAoQ01wZWdTdXJyb3VuZERlY29kZXIgKilzZWxmLT5wTXBlZ1N1cnJvdW5kRGVjb2RlcikgPT0KKyAgICAgICAgICAgICAgICBTQUNfSU5TVEFOQ0VfTk9UX0ZVTExfQVZBSUxBQkxFKSB7CisgICAgICAgICAgICAgIGlmIChtcGVnU3Vycm91bmREZWNvZGVyX09wZW4oCisgICAgICAgICAgICAgICAgICAgICAgKENNcGVnU3Vycm91bmREZWNvZGVyICoqKSZzZWxmLT5wTXBlZ1N1cnJvdW5kRGVjb2RlciwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnFtZkRvbWFpbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFDX0RFQ19PVVRfT0ZfTUVNT1JZOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVyciA9IG1wZWdTdXJyb3VuZERlY29kZXJfUGFyc2UoCisgICAgICAgICAgICAgIChDTXBlZ1N1cnJvdW5kRGVjb2RlciAqKXNlbGYtPnBNcGVnU3Vycm91bmREZWNvZGVyLCBoQnMsIGNvdW50LAorICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFvdCwgbXBzU2FtcGxlUmF0ZSwgbXBzRnJhbWVTaXplLAorICAgICAgICAgICAgICBzZWxmLT5mbGFnc1swXSAmIEFDX0lOREVQKTsKKyAgICAgICAgICBpZiAoZXJyID09IE1QU19PSykgeworICAgICAgICAgICAgc2VsZi0+ZmxhZ3NbMF0gfD0gQUNfTVBTX1BSRVNFTlQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogU2tpcCBhbnkgdHJhaWxpbmcgYnl0ZXMgKi8KKyAgICAgICAgRkRLcHVzaEZvcihoQnMsICpjb3VudCk7CiAgICAgICAgICpjb3VudCA9IDA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKiBJZiB0aGlzIGlzIG5vdCBhIGZpbGwgZWxlbWVudCB3aXRoIGEga25vd24gbGVuZ3RoLCB3ZSBhcmUgc2NyZXdlZCBhbmQgZnVydGhlciBwYXJzaW5nIG1ha2VzIG5vIHNlbnNlLiAqLwotICAgICAgICBpZiAoc2JyRXJyb3IgIT0gU0JSREVDX09LKSB7Ci0gICAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7Ci0gICAgICAgIH0KICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOwotICAgIH0KLSAgICBicmVhazsKKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgRVhUX0ZJTExfREFUQToKLSAgICB7CisgICAgY2FzZSBFWFRfU0JSX0RBVEFfQ1JDOgorICAgICAgY3JjRmxhZyA9IDE7CisgICAgY2FzZSBFWFRfU0JSX0RBVEE6CisgICAgICBpZiAoSVNfQ0hBTk5FTF9FTEVNRU5UKHByZXZpb3VzX2VsZW1lbnQpKSB7CisgICAgICAgIFNCUl9FUlJPUiBzYnJFcnJvcjsKKyAgICAgICAgVUNIQVIgY29uZmlnTW9kZSA9IDA7CisgICAgICAgIFVDSEFSIGNvbmZpZ0NoYW5nZWQgPSAwOworCisgICAgICAgIENBYWNEZWNvZGVyX1N5bmNRbWZNb2RlKHNlbGYpOworCisgICAgICAgIGNvbmZpZ01vZGUgfD0gQUNfQ01fQUxMT0NfTUVNOworCisgICAgICAgIHNickVycm9yID0gc2JyRGVjb2Rlcl9Jbml0RWxlbWVudCgKKyAgICAgICAgICAgIHNlbGYtPmhTYnJEZWNvZGVyLCBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGUsCisgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmV4dFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lLCBzZWxmLT5zdHJlYW1JbmZvLmFvdCwKKyAgICAgICAgICAgIHByZXZpb3VzX2VsZW1lbnQsIGVsSW5kZXgsCisgICAgICAgICAgICAyLCAvKiBTaWduYWxpemUgdGhhdCBoYXJtb25pY1NCUiBzaGFsbCBiZSBpZ25vcmVkIGluIHRoZSBjb25maWcKKyAgICAgICAgICAgICAgICAgIGNoYW5nZSBkZXRlY3Rpb24gKi8KKyAgICAgICAgICAgIDAsIGNvbmZpZ01vZGUsICZjb25maWdDaGFuZ2VkLCBzZWxmLT5kb3duc2NhbGVGYWN0b3IpOworCisgICAgICAgIGlmIChzYnJFcnJvciA9PSBTQlJERUNfT0spIHsKKyAgICAgICAgICBzYnJFcnJvciA9IHNickRlY29kZXJfUGFyc2Uoc2VsZi0+aFNickRlY29kZXIsIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+cERybUJzQnVmZmVyLCBzZWxmLT5kcm1Cc0J1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LCAqY291bnQsIGNyY0ZsYWcsIHByZXZpb3VzX2VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsSW5kZXgsIHNlbGYtPmZsYWdzWzBdLCBzZWxmLT5lbEZsYWdzKTsKKyAgICAgICAgICAvKiBFbmFibGUgU0JSIGZvciBpbXBsaWNpdCBTQlIgc2lnbmFsbGluZyBidXQgb25seSBpZiBubyBzZXZlcmUgZXJyb3IKKyAgICAgICAgICAgKiBoYXBwZW5kLiAqLworICAgICAgICAgIGlmICgoc2JyRXJyb3IgPT0gU0JSREVDX09LKSB8fCAoc2JyRXJyb3IgPT0gU0JSREVDX1BBUlNFX0VSUk9SKSkgeworICAgICAgICAgICAgc2VsZi0+c2JyRW5hYmxlZCA9IDE7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIERvIG5vdCB0cnkgdG8gYXBwbHkgU0JSIGJlY2F1c2UgaW5pdGlhbGl6aW5nIHRoZSBlbGVtZW50IGZhaWxlZC4gKi8KKyAgICAgICAgICBzZWxmLT5zYnJFbmFibGVkID0gMDsKKyAgICAgICAgfQorICAgICAgICAvKiBDaXRhdGlvbiBmcm9tIElTTy9JRUMgMTQ0OTYtMyBjaGFwdGVyIDQuNS4yLjEuNS4yCisgICAgICAgIEZpbGwgZWxlbWVudHMgY29udGFpbmluZyBhbiBleHRlbnNpb25fcGF5bG9hZCgpIHdpdGggYW4gZXh0ZW5zaW9uX3R5cGUKKyAgICAgICAgb2YgRVhUX1NCUl9EQVRBIG9yIEVYVF9TQlJfREFUQV9DUkMgc2hhbGwgbm90IGNvbnRhaW4gYW55IG90aGVyCisgICAgICAgIGV4dGVuc2lvbl9wYXlsb2FkIG9mIGFueSBvdGhlciBleHRlbnNpb25fdHlwZS4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKGZJc0ZpbGxFbGVtZW50KSB7CisgICAgICAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoaEJzLCAqY291bnQpOworICAgICAgICAgICpjb3VudCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogSWYgdGhpcyBpcyBub3QgYSBmaWxsIGVsZW1lbnQgd2l0aCBhIGtub3duIGxlbmd0aCwgd2UgYXJlIHNjcmV3ZWQKKyAgICAgICAgICAgKiBhbmQgZnVydGhlciBwYXJzaW5nIG1ha2VzIG5vIHNlbnNlLiAqLworICAgICAgICAgIGlmIChzYnJFcnJvciAhPSBTQlJERUNfT0spIHsKKyAgICAgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVYVF9GSUxMX0RBVEE6IHsKICAgICAgIGludCB0ZW1wOwogCi0gICAgICB0ZW1wID0gRkRLcmVhZEJpdHMoaEJzLDQpOworICAgICAgdGVtcCA9IEZES3JlYWRCaXRzKGhCcywgNCk7CiAgICAgICBieXRlcy0tOwogICAgICAgaWYgKHRlbXAgIT0gMCkgewogICAgICAgICBlcnJvciA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgd2hpbGUgKGJ5dGVzID4gMCkgewotICAgICAgICB0ZW1wID0gRkRLcmVhZEJpdHMoaEJzLDgpOworICAgICAgICB0ZW1wID0gRkRLcmVhZEJpdHMoaEJzLCA4KTsKICAgICAgICAgYnl0ZXMtLTsKICAgICAgICAgaWYgKHRlbXAgIT0gMHhhNSkgewogICAgICAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgfQotICAgICAgKmNvdW50ID0gYnl0ZXM8PDM7Ci0gICAgfQotICAgIGJyZWFrOworICAgICAgKmNvdW50ID0gYnl0ZXMgPDwgMzsKKyAgICB9IGJyZWFrOwogCi0gIGNhc2UgRVhUX0RBVEFfRUxFTUVOVDoKLSAgICB7CisgICAgY2FzZSBFWFRfREFUQV9FTEVNRU5UOiB7CiAgICAgICBpbnQgZGF0YUVsZW1lbnRWZXJzaW9uOwogCi0gICAgICBkYXRhRWxlbWVudFZlcnNpb24gPSBGREtyZWFkQml0cyhoQnMsNCk7CisgICAgICBkYXRhRWxlbWVudFZlcnNpb24gPSBGREtyZWFkQml0cyhoQnMsIDQpOwogICAgICAgKmNvdW50IC09IDQ7CiAgICAgICBpZiAoZGF0YUVsZW1lbnRWZXJzaW9uID09IDApIC8qIEFOQ19EQVRBICovCiAgICAgICB7CiAgICAgICAgIGludCB0ZW1wLCBkYXRhRWxlbWVudExlbmd0aCA9IDA7CiAgICAgICAgIGRvIHsKLSAgICAgICAgICB0ZW1wID0gRkRLcmVhZEJpdHMoaEJzLDgpOworICAgICAgICAgIHRlbXAgPSBGREtyZWFkQml0cyhoQnMsIDgpOwogICAgICAgICAgICpjb3VudCAtPSA4OwogICAgICAgICAgIGRhdGFFbGVtZW50TGVuZ3RoICs9IHRlbXA7Ci0gICAgICAgIH0gd2hpbGUgKHRlbXAgPT0gMjU1ICk7CisgICAgICAgIH0gd2hpbGUgKHRlbXAgPT0gMjU1KTsKIAogICAgICAgICBDQWFjRGVjb2Rlcl9BbmNEYXRhUGFyc2UoJnNlbGYtPmFuY0RhdGEsIGhCcywgZGF0YUVsZW1lbnRMZW5ndGgpOwotICAgICAgICAqY291bnQgLT0gKGRhdGFFbGVtZW50TGVuZ3RoPDwzKTsKKyAgICAgICAgKmNvdW50IC09IChkYXRhRWxlbWVudExlbmd0aCA8PCAzKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIGFsaWduID0gMCAqLwogICAgICAgICBlcnJvciA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CiAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7CisgICAgfSBicmVhazsKIAotICBjYXNlIEVYVF9EQVRBX0xFTkdUSDoKLSAgICBpZiAoICFmSXNGaWxsRWxlbWVudCAgICAgICAgICAvKiBNYWtlcyBubyBzZW5zIHRvIGhhdmUgYW4gYWRkaXRpb25hbCBsZW5ndGggaW4gYSBmaWxsIC4uLiAgICovCi0gICAgICAmJiAoc2VsZi0+ZmxhZ3MgJiBBQ19FUikgKSAgLyogLi4uIGVsZW1lbnQgYmVjYXVzZSB0aGlzIGV4dGVuc2lvbiBwYXlsb2FkIHR5cGUgd2FzIC4uLiAgICAqLwotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC4uLiBjcmVhdGVkIHRvIGNpcmN1bXZlbnQgdGhlIG1pc3NpbmcgbGVuZ3RoIGluIEVSLVN5bnRheC4gKi8KLSAgICAgIGludCBiaXRDbnQsIGxlbiA9IEZES3JlYWRCaXRzKGhCcywgNCk7Ci0gICAgICAqY291bnQgLT0gNDsKKyAgICBjYXNlIEVYVF9EQVRBX0xFTkdUSDoKKyAgICAgIGlmICghZklzRmlsbEVsZW1lbnQgLyogTWFrZXMgbm8gc2VucyB0byBoYXZlIGFuIGFkZGl0aW9uYWwgbGVuZ3RoIGluIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCAuLi4gICAqLworICAgICAgICAgICYmCisgICAgICAgICAgKHNlbGYtPmZsYWdzWzBdICYKKyAgICAgICAgICAgQUNfRVIpKSAvKiAuLi4gZWxlbWVudCBiZWNhdXNlIHRoaXMgZXh0ZW5zaW9uIHBheWxvYWQgdHlwZSB3YXMgLi4uICovCisgICAgICB7IC8qIC4uLiBjcmVhdGVkIHRvIGNpcmN1bXZlbnQgdGhlIG1pc3NpbmcgbGVuZ3RoIGluIEVSLVN5bnRheC4gKi8KKyAgICAgICAgaW50IGJpdENudCwgbGVuID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICAgICAgKmNvdW50IC09IDQ7CiAKLSAgICAgIGlmIChsZW4gPT0gMTUpIHsKLSAgICAgICAgaW50IGFkZF9sZW4gPSBGREtyZWFkQml0cyhoQnMsIDgpOwotICAgICAgICAqY291bnQgLT0gODsKLSAgICAgICAgbGVuICs9IGFkZF9sZW47CisgICAgICAgIGlmIChsZW4gPT0gMTUpIHsKKyAgICAgICAgICBpbnQgYWRkX2xlbiA9IEZES3JlYWRCaXRzKGhCcywgOCk7CisgICAgICAgICAgKmNvdW50IC09IDg7CisgICAgICAgICAgbGVuICs9IGFkZF9sZW47CiAKLSAgICAgICAgaWYgKGFkZF9sZW4gPT0gMjU1KSB7Ci0gICAgICAgICAgbGVuICs9IEZES3JlYWRCaXRzKGhCcywgMTYpOwotICAgICAgICAgICpjb3VudCAtPSAxNjsKKyAgICAgICAgICBpZiAoYWRkX2xlbiA9PSAyNTUpIHsKKyAgICAgICAgICAgIGxlbiArPSBGREtyZWFkQml0cyhoQnMsIDE2KTsKKyAgICAgICAgICAgICpjb3VudCAtPSAxNjsKKyAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgbGVuIDw8PSAzOworICAgICAgICBiaXRDbnQgPSBsZW47CisKKyAgICAgICAgaWYgKChFWFRfUEFZTE9BRF9UWVBFKUZES3JlYWRCaXRzKGhCcywgNCkgPT0gRVhUX0RBVEFfTEVOR1RIKSB7CisgICAgICAgICAgLyogQ2hlY2sgTk9URSAyOiBUaGUgZXh0ZW5zaW9uX3BheWxvYWQoKSBpbmNsdWRlZCBoZXJlIG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBoYXZlIGV4dGVuc2lvbl90eXBlID09IEVYVF9EQVRBX0xFTkdUSC4gKi8KKyAgICAgICAgICBlcnJvciA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIHJld2luZCBhbmQgY2FsbCBteXNlbGYgYWdhaW4uICovCisgICAgICAgICAgRkRLcHVzaEJhY2soaEJzLCA0KTsKKworICAgICAgICAgIGVycm9yID0gQ0FhY0RlY29kZXJfRXh0UGF5bG9hZFBhcnNlKAorICAgICAgICAgICAgICBzZWxmLCBoQnMsICZiaXRDbnQsIHByZXZpb3VzX2VsZW1lbnQsIGVsSW5kZXgsCisgICAgICAgICAgICAgIDEpOyAvKiBUcmVhdCBzYW1lIGFzIGZpbGwgZWxlbWVudCAqLworCisgICAgICAgICAgKmNvdW50IC09IGxlbiAtIGJpdENudDsKKyAgICAgICAgfQorICAgICAgICAvKiBOb3RlOiB0aGUgZmFsbCB0aHJvdWdoIGluIGNhc2UgdGhlIGlmIHN0YXRlbWVudCBhYm92ZSBpcyBub3QgdGFrZW4gaXMKKyAgICAgICAgICogaW50ZW50aW9uYWwuICovCisgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgbGVuIDw8PSAzOwotICAgICAgYml0Q250ID0gbGVuOwogCi0gICAgICBpZiAoIChFWFRfUEFZTE9BRF9UWVBFKUZES3JlYWRCaXRzKGhCcywgNCkgPT0gRVhUX0RBVEFfTEVOR1RIICkgewotICAgICAgICAvKiBDaGVjayBOT1RFIDI6IFRoZSBleHRlbnNpb25fcGF5bG9hZCgpIGluY2x1ZGVkIGhlcmUgbXVzdAotICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBoYXZlIGV4dGVuc2lvbl90eXBlID09IEVYVF9EQVRBX0xFTkdUSC4gKi8KLSAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogcmV3aW5kIGFuZCBjYWxsIG15c2VsZiBhZ2Fpbi4gKi8KLSAgICAgICAgRkRLcHVzaEJhY2soaEJzLCA0KTsKKyAgICBjYXNlIEVYVF9GSUw6CiAKLSAgICAgICAgZXJyb3IgPQotICAgICAgICAgIENBYWNEZWNvZGVyX0V4dFBheWxvYWRQYXJzZSAoCi0gICAgICAgICAgICAgICAgICBzZWxmLAotICAgICAgICAgICAgICAgICAgaEJzLAotICAgICAgICAgICAgICAgICAmYml0Q250LAotICAgICAgICAgICAgICAgICAgcHJldmlvdXNfZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgIGVsSW5kZXgsCi0gICAgICAgICAgICAgICAgICAwICk7Ci0KLSAgICAgICAgKmNvdW50IC09IGxlbiAtIGJpdENudDsKLSAgICAgIH0KLSAgICAgIC8qIE5vdGU6IHRoZSBmYWxsIHRocm91Z2ggaW4gY2FzZSB0aGUgaWYgc3RhdGVtZW50IGFib3ZlIGlzIG5vdCB0YWtlbiBpcyBpbnRlbnRpb25hbC4gKi8KKyAgICBkZWZhdWx0OgorICAgICAgLyogYWxpZ24gPSA0ICovCisgICAgICBGREtwdXNoRm9yKGhCcywgKmNvdW50KTsKKyAgICAgICpjb3VudCA9IDA7CiAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgY2FzZSBFWFRfRklMOgotCi0gIGRlZmF1bHQ6Ci0gICAgLyogYWxpZ24gPSA0ICovCi0gICAgRkRLcHVzaEZvcihoQnMsICpjb3VudCk7Ci0gICAgKmNvdW50ID0gMDsKLSAgICBicmVhazsKICAgfQogCiBiYWlsOgotICBpZiAoIChlcnJvciAhPSBBQUNfREVDX09LKQotICAgICYmIGZJc0ZpbGxFbGVtZW50ICkKLSAgeyAvKiBTa2lwIHRoZSByZW1haW5pbmcgZXh0ZW5zaW9uIGJ5dGVzICovCisgIGlmICgoZXJyb3IgIT0gQUFDX0RFQ19PSykgJiYKKyAgICAgIGZJc0ZpbGxFbGVtZW50KSB7IC8qIFNraXAgdGhlIHJlbWFpbmluZyBleHRlbnNpb24gYnl0ZXMgKi8KICAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChoQnMsICpjb3VudCk7CiAgICAgKmNvdW50ID0gMDsKICAgICAvKiBQYXRjaCBlcnJvciBjb2RlIGJlY2F1c2UgZGVjb2RpbmcgY2FuIGdvIG9uLiAqLwpAQCAtNjc3LDE1ICsxMDk4LDEwNyBAQAogICByZXR1cm4gZXJyb3I7CiB9CiAKK3N0YXRpYyBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX1BhcnNlRXhwbGljaXRNcHNBbmRTYnIoCisgICAgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgcHJldmlvdXNfZWxlbWVudCwgY29uc3QgaW50IHByZXZpb3VzX2VsZW1lbnRfaW5kZXgsCisgICAgY29uc3QgaW50IGVsZW1lbnRfaW5kZXgsIGNvbnN0IGludCBlbF9jbnRbXSkgeworICBBQUNfREVDT0RFUl9FUlJPUiBFcnJvclN0YXR1cyA9IEFBQ19ERUNfT0s7CisgIElOVCBiaXRDbnQgPSAwOworCisgIC8qIGdldCB0aGUgcmVtYWluaW5nIGJpdHMgb2YgdGhpcyBmcmFtZSAqLworICBiaXRDbnQgPSB0cmFuc3BvcnREZWNfR2V0QXVCaXRzUmVtYWluaW5nKHNlbGYtPmhJbnB1dCwgMCk7CisKKyAgaWYgKChiaXRDbnQgPiAwKSAmJiAoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19TQlJfUFJFU0VOVCkgJiYKKyAgICAgIChzZWxmLT5mbGFnc1swXSAmIChBQ19VU0FDIHwgQUNfUlNWRDUwIHwgQUNfRUxEIHwgQUNfRFJNKSkpIHsKKyAgICBTQlJfRVJST1IgZXJyID0gU0JSREVDX09LOworICAgIGludCBjaEVsSWR4LCBudW1DaEVsZW1lbnRzID0gZWxfY250W0lEX1NDRV0gKyBlbF9jbnRbSURfQ1BFXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbF9jbnRbSURfTEZFXSArIGVsX2NudFtJRF9VU0FDX1NDRV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxfY250W0lEX1VTQUNfQ1BFXSArIGVsX2NudFtJRF9VU0FDX0xGRV07CisKKyAgICBpZiAoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19VU0FDKSB7CisgICAgICBjaEVsSWR4ID0gbnVtQ2hFbGVtZW50cyAtIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGNoRWxJZHggPSAwOyAvKiBFTEQgY2FzZSAqLworICAgIH0KKworICAgIGZvciAoOyBjaEVsSWR4IDwgbnVtQ2hFbGVtZW50czsgY2hFbElkeCArPSAxKSB7CisgICAgICBNUDRfRUxFTUVOVF9JRCBzYnJUeXBlOworICAgICAgaWYgKHNlbGYtPmZsYWdzWzBdICYgKEFDX1VTQUMpKSB7CisgICAgICAgIEZES19BU1NFUlQoKHNlbGYtPmVsZW1lbnRzW2VsZW1lbnRfaW5kZXhdID09IElEX1VTQUNfU0NFKSB8fAorICAgICAgICAgICAgICAgICAgIChzZWxmLT5lbGVtZW50c1tlbGVtZW50X2luZGV4XSA9PSBJRF9VU0FDX0NQRSkpOworICAgICAgICBzYnJUeXBlID0gSVNfU1RFUkVPX1NCUihzZWxmLT5lbGVtZW50c1tlbGVtZW50X2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+dXNhY1N0ZXJlb0NvbmZpZ0luZGV4W2VsZW1lbnRfaW5kZXhdKQorICAgICAgICAgICAgICAgICAgICAgID8gSURfQ1BFCisgICAgICAgICAgICAgICAgICAgICAgOiBJRF9TQ0U7CisgICAgICB9IGVsc2UKKyAgICAgICAgc2JyVHlwZSA9IHNlbGYtPmVsZW1lbnRzW2NoRWxJZHhdOworICAgICAgZXJyID0gc2JyRGVjb2Rlcl9QYXJzZShzZWxmLT5oU2JyRGVjb2RlciwgYnMsIHNlbGYtPnBEcm1Cc0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZHJtQnNCdWZmZXJTaXplLCAmYml0Q250LCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3NbMF0gJiBBQ19TQlJDUkMsIHNiclR5cGUsIGNoRWxJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzWzBdLCBzZWxmLT5lbEZsYWdzKTsKKyAgICAgIGlmIChlcnIgIT0gU0JSREVDX09LKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBzd2l0Y2ggKGVycikgeworICAgICAgY2FzZSBTQlJERUNfUEFSU0VfRVJST1I6CisgICAgICAgIC8qIENhbiBub3QgZ28gb24gcGFyc2luZyBiZWNhdXNlIHdlIGRvIG5vdAorICAgICAgICAgICAga25vdyB0aGUgbGVuZ3RoIG9mIHRoZSBTQlIgZXh0ZW5zaW9uIGRhdGEuICovCisgICAgICAgIEZES3B1c2hGb3IoYnMsIGJpdENudCk7CisgICAgICAgIGJpdENudCA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTQlJERUNfT0s6CisgICAgICAgIHNlbGYtPnNickVuYWJsZWQgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoKGJpdENudCA+IDApICYmIChzZWxmLT5mbGFnc1swXSAmIChBQ19VU0FDIHwgQUNfUlNWRDUwKSkpIHsKKyAgICBpZiAoKHNlbGYtPmZsYWdzWzBdICYgQUNfTVBTX1BSRVNFTlQpIHx8CisgICAgICAgIChzZWxmLT5lbEZsYWdzW2VsZW1lbnRfaW5kZXhdICYgQUNfRUxfVVNBQ19NUFMyMTIpKSB7CisgICAgICBpbnQgZXJyOworCisgICAgICBlcnIgPSBtcGVnU3Vycm91bmREZWNvZGVyX1BhcnNlTm9IZWFkZXIoCisgICAgICAgICAgKENNcGVnU3Vycm91bmREZWNvZGVyICopc2VsZi0+cE1wZWdTdXJyb3VuZERlY29kZXIsIGJzLCAmYml0Q250LAorICAgICAgICAgIHNlbGYtPmZsYWdzWzBdICYgQUNfSU5ERVApOworICAgICAgaWYgKGVyciAhPSBNUFNfT0spIHsKKyAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7CisgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19EUk0pIHsKKyAgICBpZiAoKGJpdENudCA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKSkgIT0gMCkgeworICAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoYnMsIGJpdENudCk7CisgICAgfQorICB9CisKKyAgaWYgKCEoc2VsZi0+ZmxhZ3NbMF0gJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX0RSTSkpKSB7CisgICAgd2hpbGUgKGJpdENudCA+IDcpIHsKKyAgICAgIEVycm9yU3RhdHVzID0gQ0FhY0RlY29kZXJfRXh0UGF5bG9hZFBhcnNlKAorICAgICAgICAgIHNlbGYsIGJzLCAmYml0Q250LCBwcmV2aW91c19lbGVtZW50LCBwcmV2aW91c19lbGVtZW50X2luZGV4LCAwKTsKKyAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfREVDX09LKSB7CisgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOworICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gRXJyb3JTdGF0dXM7Cit9CisKIC8qICBTdHJlYW0gQ29uZmlndXJhdGlvbiBhbmQgSW5mb3JtYXRpb24uCiAKLSAgICBUaGlzIGNsYXNzIGhvbGRzIGNvbmZpZ3VyYXRpb24gYW5kIGluZm9ybWF0aW9uIGRhdGEgZm9yIGEgc3RyZWFtIHRvIGJlIGRlY29kZWQuIEl0Ci0gICAgcHJvdmlkZXMgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24gYXMgd2VsbCBhcyB0aGUgZGVjb2RlciB3aXRoIHN1YnN0YW50aWFsIGluZm9ybWF0aW9uLAotICAgIGUuZy4gcHJvZmlsZSwgc2FtcGxpbmcgcmF0ZSwgbnVtYmVyIG9mIGNoYW5uZWxzIGZvdW5kIGluIHRoZSBiaXRzdHJlYW0gZXRjLgorICAgIFRoaXMgY2xhc3MgaG9sZHMgY29uZmlndXJhdGlvbiBhbmQgaW5mb3JtYXRpb24gZGF0YSBmb3IgYSBzdHJlYW0gdG8gYmUKKyAgIGRlY29kZWQuIEl0IHByb3ZpZGVzIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uIGFzIHdlbGwgYXMgdGhlIGRlY29kZXIgd2l0aAorICAgc3Vic3RhbnRpYWwgaW5mb3JtYXRpb24sIGUuZy4gcHJvZmlsZSwgc2FtcGxpbmcgcmF0ZSwgbnVtYmVyIG9mIGNoYW5uZWxzCisgICBmb3VuZCBpbiB0aGUgYml0c3RyZWFtIGV0Yy4KICovCi1zdGF0aWMKLXZvaWQgQ1N0cmVhbUluZm9Jbml0KENTdHJlYW1JbmZvICpwU3RyZWFtSW5mbykKLXsKK3N0YXRpYyB2b2lkIENTdHJlYW1JbmZvSW5pdChDU3RyZWFtSW5mbyAqcFN0cmVhbUluZm8pIHsKICAgcFN0cmVhbUluZm8tPmFhY1NhbXBsZVJhdGUgPSAwOwogICBwU3RyZWFtSW5mby0+cHJvZmlsZSA9IC0xOwogICBwU3RyZWFtSW5mby0+YW90ID0gQU9UX05PTkU7CkBAIC02OTQsMTIgKzEyMDcsMTIgQEAKICAgcFN0cmVhbUluZm8tPmJpdFJhdGUgPSAwOwogICBwU3RyZWFtSW5mby0+YWFjU2FtcGxlc1BlckZyYW1lID0gMDsKIAotICBwU3RyZWFtSW5mby0+ZXh0QW90ICA9IEFPVF9OT05FOworICBwU3RyZWFtSW5mby0+ZXh0QW90ID0gQU9UX05PTkU7CiAgIHBTdHJlYW1JbmZvLT5leHRTYW1wbGluZ1JhdGUgPSAwOwogCiAgIHBTdHJlYW1JbmZvLT5mbGFncyA9IDA7CiAKLSAgcFN0cmVhbUluZm8tPmVwQ29uZmlnID0gLTE7ICAgLyogZGVmYXVsdCBpcyBubyBFUiAqLworICBwU3RyZWFtSW5mby0+ZXBDb25maWcgPSAtMTsgLyogZGVmYXVsdDogbm8gRVIgKi8KIAogICBwU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMgPSAwOwogICBwU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSA9IDA7CkBAIC03MDgsMjEgKzEyMjEsMjQgQEAKICAgcFN0cmVhbUluZm8tPm91dHB1dERlbGF5ID0gMDsKIAogICAvKiBEUkMgKi8KLSAgcFN0cmVhbUluZm8tPmRyY1Byb2dSZWZMZXYgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgdG8gbm90IGluZGljYXRlZCAqLwotICBwU3RyZWFtSW5mby0+ZHJjUHJlc01vZGUgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQ6IHByZXNlbnRhdGlvbiBtb2RlIG5vdCBpbmRpY2F0ZWQgKi8KKyAgcFN0cmVhbUluZm8tPmRyY1Byb2dSZWZMZXYgPQorICAgICAgLTE7IC8qIHNldCBwcm9ncmFtIHJlZmVyZW5jZSBsZXZlbCB0byBub3QgaW5kaWNhdGVkICovCisgIHBTdHJlYW1JbmZvLT5kcmNQcmVzTW9kZSA9IC0xOyAvKiBkZWZhdWx0OiBwcmVzZW50YXRpb24gbW9kZSBub3QgaW5kaWNhdGVkICovCiB9CiAKIC8qIQogICBcYnJpZWYgSW5pdGlhbGl6YXRpb24gb2YgQWFjRGVjb2RlckNoYW5uZWxJbmZvCiAKLSAgVGhlIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBwb2ludGVycyB0byBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gZm9yIGVhY2ggY2hhbm5lbCwKLSAgc2V0IHRoZSBzdGFydCB2YWx1ZXMgZm9yIHdpbmRvdyBzaGFwZSBhbmQgd2luZG93IHNlcXVlbmNlIG9mIG92ZXJsYXAmYWRkIHRvIHplcm8sCi0gIHNldCB0aGUgb3ZlcmxhcCBidWZmZXIgdG8gemVybyBhbmQgaW5pdGlhbGl6ZXMgdGhlIHBvaW50ZXJzIHRvIHRoZSB3aW5kb3cgY29lZmZpY2llbnRzLgotICBccGFyYW0gYnNGb3JtYXQgaXMgdGhlIGZvcm1hdCBvZiB0aGUgQUFDIGJpdHN0cmVhbQorICBUaGUgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHBvaW50ZXJzIHRvIEFhY0RlY29kZXJDaGFubmVsSW5mbyBmb3IgZWFjaAorICBjaGFubmVsLCBzZXQgdGhlIHN0YXJ0IHZhbHVlcyBmb3Igd2luZG93IHNoYXBlIGFuZCB3aW5kb3cgc2VxdWVuY2Ugb2YKKyAgb3ZlcmxhcCZhZGQgdG8gemVybywgc2V0IHRoZSBvdmVybGFwIGJ1ZmZlciB0byB6ZXJvIGFuZCBpbml0aWFsaXplcyB0aGUKKyAgcG9pbnRlcnMgdG8gdGhlIHdpbmRvdyBjb2VmZmljaWVudHMuIFxwYXJhbSBic0Zvcm1hdCBpcyB0aGUgZm9ybWF0IG9mIHRoZSBBQUMKKyAgYml0c3RyZWFtCiAKICAgXHJldHVybiAgQUFDREVDT0RFUiBpbnN0YW5jZQogKi8KLUxJTktTUEVDX0NQUCBIQU5ETEVfQUFDREVDT0RFUiBDQWFjRGVjb2Rlcl9PcGVuKFRSQU5TUE9SVF9UWVBFIGJzRm9ybWF0KSAgICAvKiE8IGJpdHN0cmVhbSBmb3JtYXQgKGFkaWYsYWR0cyxsb2FzLC4uLikuICovCitMSU5LU1BFQ19DUFAgSEFORExFX0FBQ0RFQ09ERVIgQ0FhY0RlY29kZXJfT3BlbigKKyAgICBUUkFOU1BPUlRfVFlQRSBic0Zvcm1hdCkgLyohPCBiaXRzdHJlYW0gZm9ybWF0IChhZGlmLGFkdHMsbG9hcywuLi4pLiAqLwogewogICBIQU5ETEVfQUFDREVDT0RFUiBzZWxmOwogCkBAIC03MzEsMTIgKzEyNDcsMTQgQEAKICAgICBnb3RvIGJhaWw7CiAgIH0KIAotICAvKiBBc3NpZ24gY2hhbm5lbCBtYXBwaW5nIGluZm8gYXJyYXlzIChkb2luZyBzbyByZW1vdmVzIGRlcGVuZGVuY3kgb2Ygc2V0dGluZ3MgaGVhZGVyIGluIEFQSSBoZWFkZXIpLiAqLworICBGREtfUW1mRG9tYWluX0NsZWFyUmVxdWVzdGVkKCZzZWxmLT5xbWZEb21haW4uZ2xvYmFsQ29uZik7CisKKyAgLyogQXNzaWduIGNoYW5uZWwgbWFwcGluZyBpbmZvIGFycmF5cyAoZG9pbmcgc28gcmVtb3ZlcyBkZXBlbmRlbmN5IG9mIHNldHRpbmdzCisgICAqIGhlYWRlciBpbiBBUEkgaGVhZGVyKS4gKi8KICAgc2VsZi0+c3RyZWFtSW5mby5wQ2hhbm5lbEluZGljZXMgPSBzZWxmLT5jaGFubmVsSW5kaWNlczsKICAgc2VsZi0+c3RyZWFtSW5mby5wQ2hhbm5lbFR5cGUgPSBzZWxmLT5jaGFubmVsVHlwZTsKLQotICAvKiBzZXQgZGVmYXVsdCBvdXRwdXQgbW9kZSAqLwotICBzZWxmLT5vdXRwdXRJbnRlcmxlYXZlZCA9IDE7ICAvKiBpbnRlcmxlYXZlZCAqLworICBzZWxmLT5kb3duc2NhbGVGYWN0b3IgPSAxOworICBzZWxmLT5kb3duc2NhbGVGYWN0b3JJbkJTID0gMTsKIAogICAvKiBpbml0aWFsaXplIGFuYyBkYXRhICovCiAgIENBYWNEZWNvZGVyX0FuY0RhdGFJbml0KCZzZWxmLT5hbmNEYXRhLCBOVUxMLCAwKTsKQEAgLTc0NCw3NiArMTI2MiwyMDkgQEAKICAgLyogaW5pdGlhbGl6ZSBzdHJlYW0gaW5mbyAqLwogICBDU3RyZWFtSW5mb0luaXQoJnNlbGYtPnN0cmVhbUluZm8pOwogCisgIC8qIGluaXRpYWxpemUgcHJvZ2FtIGNvbmZpZyAqLworICBDUHJvZ3JhbUNvbmZpZ19Jbml0KCZzZWxmLT5wY2UpOworCiAgIC8qIGluaXRpYWxpemUgZXJyb3IgY29uY2VhbG1lbnQgY29tbW9uIGRhdGEgKi8KICAgQ0NvbmNlYWxtZW50X0luaXRDb21tb25EYXRhKCZzZWxmLT5jb25jZWFsQ29tbW9uRGF0YSk7CisgIHNlbGYtPmNvbmNlYWxNZXRob2RVc2VyID0gQ29uY2VhbE1ldGhvZE5vbmU7IC8qIHVuZGVmaW5lZCAtPiBhdXRvIG1vZGUgKi8KIAogICBzZWxmLT5oRHJjSW5mbyA9IEdldERyY0luZm8oKTsKICAgaWYgKHNlbGYtPmhEcmNJbmZvID09IE5VTEwpIHsKICAgICBnb3RvIGJhaWw7CiAgIH0KICAgLyogSW5pdCBjb21tb24gRFJDIHN0cnVjdHVyZSAqLwotICBhYWNEZWNvZGVyX2RyY0luaXQoIHNlbGYtPmhEcmNJbmZvICk7CisgIGFhY0RlY29kZXJfZHJjSW5pdChzZWxmLT5oRHJjSW5mbyk7CiAgIC8qIFNldCBkZWZhdWx0IGZyYW1lIGRlbGF5ICovCi0gIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0gKAotICAgICAgICAgIHNlbGYtPmhEcmNJbmZvLAotICAgICAgICAgIERSQ19CU19ERUxBWSwKLSAgICAgICAgICBDQ29uY2VhbG1lbnRfR2V0RGVsYXkoJnNlbGYtPmNvbmNlYWxDb21tb25EYXRhKQotICAgICAgICApOworICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtKHNlbGYtPmhEcmNJbmZvLCBEUkNfQlNfREVMQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0NvbmNlYWxtZW50X0dldERlbGF5KCZzZWxmLT5jb25jZWFsQ29tbW9uRGF0YSkpOwogCisgIHNlbGYtPndvcmtCdWZmZXJDb3JlMiA9IEdldFdvcmtCdWZmZXJDb3JlMigpOworICBpZiAoc2VsZi0+d29ya0J1ZmZlckNvcmUyID09IE5VTEwpIGdvdG8gYmFpbDsKIAotICBzZWxmLT5hYWNDb21tb25EYXRhLndvcmtCdWZmZXJDb3JlMSA9IEdldFdvcmtCdWZmZXJDb3JlMSgpOwotICBzZWxmLT5hYWNDb21tb25EYXRhLndvcmtCdWZmZXJDb3JlMiA9IEdldFdvcmtCdWZmZXJDb3JlMigpOwotICBpZiAoc2VsZi0+YWFjQ29tbW9uRGF0YS53b3JrQnVmZmVyQ29yZTEgPT0gTlVMTAotICAgIHx8c2VsZi0+YWFjQ29tbW9uRGF0YS53b3JrQnVmZmVyQ29yZTIgPT0gTlVMTCApCisgIC8qIFdoZW4gUlNWRDYwIGlzIGFjdGl2ZSB1c2UgZGVkaWNhdGVkIG1lbW9yeSBmb3IgY29yZSBkZWNvZGluZyAqLworICBzZWxmLT5wVGltZURhdGEyID0gR2V0V29ya0J1ZmZlckNvcmU1KCk7CisgIHNlbGYtPnRpbWVEYXRhMlNpemUgPSBHZXRSZXF1aXJlZE1lbVdvcmtCdWZmZXJDb3JlNSgpOworICBpZiAoc2VsZi0+cFRpbWVEYXRhMiA9PSBOVUxMKSB7CiAgICAgZ290byBiYWlsOworICB9CiAKICAgcmV0dXJuIHNlbGY7CiAKIGJhaWw6Ci0gIENBYWNEZWNvZGVyX0Nsb3NlKCBzZWxmICk7CisgIENBYWNEZWNvZGVyX0Nsb3NlKHNlbGYpOwogCiAgIHJldHVybiBOVUxMOwogfQogCi0vKiBEZXN0cm95IGFhYyBkZWNvZGVyICovCi1MSU5LU1BFQ19DUFAgdm9pZCBDQWFjRGVjb2Rlcl9DbG9zZShIQU5ETEVfQUFDREVDT0RFUiBzZWxmKQoteworLyogUmV2ZXJ0IENBYWNEZWNvZGVyX0luaXQoKSAqLworc3RhdGljIHZvaWQgQ0FhY0RlY29kZXJfRGVJbml0KEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN1YlN0cmVhbUluZGV4KSB7CiAgIGludCBjaDsKKyAgaW50IGFhY0NoYW5uZWxPZmZzZXQgPSAwLCBhYWNDaGFubmVscyA9ICg4KTsKKyAgaW50IG51bUVsZW1lbnRzID0gKCgoOCkpICsgKDgpKSwgZWxlbWVudE9mZnNldCA9IDA7CiAKLSAgaWYgKHNlbGYgPT0gTlVMTCkKLSAgICByZXR1cm47CisgIGlmIChzZWxmID09IE5VTEwpIHJldHVybjsKIAotICBmb3IgKGNoPTA7IGNoPCg4KTsgY2grKykgewotICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXSAhPSBOVUxMKSB7Ci0gICAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPnBPdmVybGFwQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgRnJlZU92ZXJsYXBCdWZmZXIgKCZzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+cE92ZXJsYXBCdWZmZXIpOworICB7CisgICAgc2VsZi0+YXNjQ2hhbm5lbHNbMF0gPSAwOworICAgIHNlbGYtPmVsZW1lbnRzWzBdID0gSURfRU5EOworICB9CisKKyAgZm9yIChjaCA9IGFhY0NoYW5uZWxPZmZzZXQ7IGNoIDwgYWFjQ2hhbm5lbE9mZnNldCArIGFhY0NoYW5uZWxzOyBjaCsrKSB7CisgICAgaWYgKHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdICE9IE5VTEwpIHsKKyAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cENvbVN0YXRpY0RhdGEgIT0gTlVMTCkgeworICAgICAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0KKyAgICAgICAgICAgICAgICAtPnBDb21TdGF0aWNEYXRhLT5wV29ya0J1ZmZlckNvcmUxICE9IE5VTEwpIHsKKyAgICAgICAgICBpZiAoY2ggPT0gYWFjQ2hhbm5lbE9mZnNldCkgeworICAgICAgICAgICAgRnJlZVdvcmtCdWZmZXJDb3JlMSgmc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnBDb21TdGF0aWNEYXRhLT5wV29ya0J1ZmZlckNvcmUxKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdCisgICAgICAgICAgICAgICAgLT5wQ29tU3RhdGljRGF0YS0+Y3BseFByZWRpY3Rpb25EYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICBGcmVlQ3BseFByZWRpY3Rpb25EYXRhKCZzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnBDb21TdGF0aWNEYXRhLT5jcGx4UHJlZGljdGlvbkRhdGEpOworICAgICAgICB9CisgICAgICAgIC8qIEF2b2lkIGRvdWJsZSBmcmVlIG9mIGxpbmtlZCBwQ29tU3RhdGljRGF0YSBpbiBjYXNlIG9mIENQRSBieSBzZXR0aW5ncworICAgICAgICAgKiBwb2ludGVyIHRvIE5VTEwuICovCisgICAgICAgIGlmIChjaCA8ICg4KSAtIDEpIHsKKyAgICAgICAgICBpZiAoKHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2ggKyAxXSAhPSBOVUxMKSAmJgorICAgICAgICAgICAgICAoc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaCArIDFdLT5wQ29tU3RhdGljRGF0YSA9PQorICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBDb21TdGF0aWNEYXRhKSkgeworICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaCArIDFdLT5wQ29tU3RhdGljRGF0YSA9IE5VTEw7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZES2ZyZWUoc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBDb21TdGF0aWNEYXRhKTsKKyAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBDb21TdGF0aWNEYXRhID0gTlVMTDsKICAgICAgIH0KLSAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXSAhPSBOVUxMKSB7Ci0gICAgICAgIEZyZWVBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKCZzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXSk7CisgICAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBDb21EYXRhICE9IE5VTEwpIHsKKyAgICAgICAgLyogQXZvaWQgZG91YmxlIGZyZWUgb2YgbGlua2VkIHBDb21EYXRhIGluIGNhc2Ugb2YgQ1BFIGJ5IHNldHRpbmdzCisgICAgICAgICAqIHBvaW50ZXIgdG8gTlVMTC4gKi8KKyAgICAgICAgaWYgKGNoIDwgKDgpIC0gMSkgeworICAgICAgICAgIGlmICgoc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaCArIDFdICE9IE5VTEwpICYmCisgICAgICAgICAgICAgIChzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoICsgMV0tPnBDb21EYXRhID09CisgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cENvbURhdGEpKSB7CisgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoICsgMV0tPnBDb21EYXRhID0gTlVMTDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoID09IGFhY0NoYW5uZWxPZmZzZXQpIHsKKyAgICAgICAgICBGcmVlV29ya0J1ZmZlckNvcmU2KAorICAgICAgICAgICAgICAoU0NIQVIgKiopJnNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wQ29tRGF0YSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRkRLYWZyZWUoc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBDb21EYXRhKTsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cENvbURhdGEgPSBOVUxMOwogICAgICAgfQogICAgIH0KKyAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0gIT0gTlVMTCkgeworICAgICAgaWYgKHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5wT3ZlcmxhcEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIEZyZWVPdmVybGFwQnVmZmVyKAorICAgICAgICAgICAgJnNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5wT3ZlcmxhcEJ1ZmZlcik7CisgICAgICB9CisgICAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPmhBckNvICE9IE5VTEwpIHsKKyAgICAgICAgQ0FyY29fRGVzdHJveShzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+aEFyQ28pOworICAgICAgfQorICAgICAgRnJlZUFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbygmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0pOworICAgIH0KICAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0gIT0gTlVMTCkgewotICAgICAgRnJlZUFhY0RlY29kZXJDaGFubmVsSW5mbyAoJnNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdKTsKKyAgICAgIEZyZWVBYWNEZWNvZGVyQ2hhbm5lbEluZm8oJnNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdKTsKICAgICB9CiAgIH0KIAorICB7CisgICAgaW50IGVsOworICAgIGZvciAoZWwgPSBlbGVtZW50T2Zmc2V0OyBlbCA8IGVsZW1lbnRPZmZzZXQgKyBudW1FbGVtZW50czsgZWwrKykgeworICAgICAgaWYgKHNlbGYtPmNwZVN0YXRpY0RhdGFbZWxdICE9IE5VTEwpIHsKKyAgICAgICAgRnJlZUNwZVBlcnNpc3RlbnREYXRhKCZzZWxmLT5jcGVTdGF0aWNEYXRhW2VsXSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgRkRLX0RlbGF5X0Rlc3Ryb3koJnNlbGYtPnVzYWNSZXNpZHVhbERlbGF5KTsKKwogICBzZWxmLT5hYWNDaGFubmVscyA9IDA7CisgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSA9IDA7CisgIHNlbGYtPnN0cmVhbUluZm8uc2FtcGxlUmF0ZSA9IDA7CisgIC8qIFRoaXMgc2FtcGxlcmF0ZSB2YWx1ZSBpcyBjaGVja2VkIGZvciBjb25maWd1cmF0aW9uIGNoYW5nZSwgbm90IHRoZSBvdGhlcnMKKyAgICogYWJvdmUuICovCisgIHNlbGYtPnNhbXBsaW5nUmF0ZUluZm9bc3ViU3RyZWFtSW5kZXhdLnNhbXBsaW5nUmF0ZSA9IDA7Cit9CisKKy8qIQorICogXGJyaWVmIENBYWNEZWNvZGVyX0N0cmxDRkdDaGFuZ2UgU2V0IGNvbmZpZyBjaGFuZ2UgcGFyYW1ldGVycy4KKyAqCisgKiBccGFyYW0gc2VsZiAgICAgICAgICAgW2ldICAgaGFuZGxlIHRvIEFBQ0RFQ09ERVIgc3RydWN0dXJlCisgKiBccGFyYW0gZmx1c2hTdGF0dXMgICAgW2ldICAgZmx1c2ggc3RhdHVzOiBvbnxvZmYKKyAqIFxwYXJhbSBmbHVzaENudCAgICAgICBbaV0gICBmbHVzaCBmcmFtZSBjb3VudGVyCisgKiBccGFyYW0gYnVpbGRVcFN0YXR1cyAgW2ldICAgYnVpbGQgdXAgc3RhdHVzOiBvbnxvZmYKKyAqIFxwYXJhbSBidWlsZFVwQ250ICAgICBbaV0gICBidWlsZCB1cCBmcmFtZSBjb3VudGVyCisgKgorICogXHJldHVybiBlcnJvcgorICovCitMSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfQ3RybENGR0NoYW5nZShIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgZmx1c2hTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiBmbHVzaENudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGJ1aWxkVXBTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiBidWlsZFVwQ250KSB7CisgIEFBQ19ERUNPREVSX0VSUk9SIGVyciA9IEFBQ19ERUNfT0s7CisKKyAgc2VsZi0+Zmx1c2hTdGF0dXMgPSBmbHVzaFN0YXR1czsKKyAgc2VsZi0+Zmx1c2hDbnQgPSBmbHVzaENudDsKKyAgc2VsZi0+YnVpbGRVcFN0YXR1cyA9IGJ1aWxkVXBTdGF0dXM7CisgIHNlbGYtPmJ1aWxkVXBDbnQgPSBidWlsZFVwQ250OworCisgIHJldHVybiAoZXJyKTsKK30KKworLyohCisgKiBcYnJpZWYgQ0FhY0RlY29kZXJfRnJlZU1lbSBGcmVlIGNvbmZpZyBkZXBlbmRlbnQgQUFDIG1lbW9yeS4KKyAqCisgKiBccGFyYW0gc2VsZiAgICAgICBbaV0gICBoYW5kbGUgdG8gQUFDREVDT0RFUiBzdHJ1Y3R1cmUKKyAqCisgKiBccmV0dXJuIGVycm9yCisgKi8KK0xJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9GcmVlTWVtKEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3ViU3RyZWFtSW5kZXgpIHsKKyAgQUFDX0RFQ09ERVJfRVJST1IgZXJyID0gQUFDX0RFQ19PSzsKKworICBDQWFjRGVjb2Rlcl9EZUluaXQoc2VsZiwgc3ViU3RyZWFtSW5kZXgpOworCisgIHJldHVybiAoZXJyKTsKK30KKworLyogRGVzdHJveSBhYWMgZGVjb2RlciAqLworTElOS1NQRUNfQ1BQIHZvaWQgQ0FhY0RlY29kZXJfQ2xvc2UoSEFORExFX0FBQ0RFQ09ERVIgc2VsZikgeworICBpZiAoc2VsZiA9PSBOVUxMKSByZXR1cm47CisKKyAgQ0FhY0RlY29kZXJfRGVJbml0KHNlbGYsIDApOworCisgIHsKKyAgICBpbnQgY2g7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgKDgpOyBjaCsrKSB7CisgICAgICBpZiAoc2VsZi0+cFRpbWVEYXRhRmx1c2hbY2hdICE9IE5VTEwpIHsKKyAgICAgICAgRnJlZVRpbWVEYXRhRmx1c2goJnNlbGYtPnBUaW1lRGF0YUZsdXNoW2NoXSk7CisgICAgICB9CisgICAgfQorICB9CiAKICAgaWYgKHNlbGYtPmhEcmNJbmZvKSB7CiAgICAgRnJlZURyY0luZm8oJnNlbGYtPmhEcmNJbmZvKTsKICAgfQogCi0gIGlmIChzZWxmLT5hYWNDb21tb25EYXRhLndvcmtCdWZmZXJDb3JlMSAhPSBOVUxMKSB7Ci0gICAgRnJlZVdvcmtCdWZmZXJDb3JlMSAoJnNlbGYtPmFhY0NvbW1vbkRhdGEud29ya0J1ZmZlckNvcmUxKTsKKyAgLyogRnJlZSBXb3JrQnVmZmVyQ29yZTIgKi8KKyAgaWYgKHNlbGYtPndvcmtCdWZmZXJDb3JlMiAhPSBOVUxMKSB7CisgICAgRnJlZVdvcmtCdWZmZXJDb3JlMigmc2VsZi0+d29ya0J1ZmZlckNvcmUyKTsKICAgfQotICBpZiAoc2VsZi0+YWFjQ29tbW9uRGF0YS53b3JrQnVmZmVyQ29yZTIgIT0gTlVMTCkgewotICAgIEZyZWVXb3JrQnVmZmVyQ29yZTIgKCZzZWxmLT5hYWNDb21tb25EYXRhLndvcmtCdWZmZXJDb3JlMik7CisgIGlmIChzZWxmLT5wVGltZURhdGEyICE9IE5VTEwpIHsKKyAgICBGcmVlV29ya0J1ZmZlckNvcmU1KCZzZWxmLT5wVGltZURhdGEyKTsKICAgfQogCi0gIEZyZWVBYWNEZWNvZGVyICggJnNlbGYpOworICBGREtfUW1mRG9tYWluX0Nsb3NlKCZzZWxmLT5xbWZEb21haW4pOworCisgIEZyZWVBYWNEZWNvZGVyKCZzZWxmKTsKIH0KIAotCiAvKiEKICAgXGJyaWVmIEluaXRpYWxpemF0aW9uIG9mIGRlY29kZXIgaW5zdGFuY2UKIApAQCAtODIxLDM1NyArMTQ3Miw5OTQgQEAKIAogICBccmV0dXJuICBlcnJvciBzdGF0dXM6IDAgZm9yIHN1Y2Nlc3MsIDw+MCBmb3IgdW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbnMKICovCi1MSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfSW5pdChIQU5ETEVfQUFDREVDT0RFUiBzZWxmLCBjb25zdCBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKmFzYykKLXsKK0xJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUgorQ0FhY0RlY29kZXJfSW5pdChIQU5ETEVfQUFDREVDT0RFUiBzZWxmLCBjb25zdCBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKmFzYywKKyAgICAgICAgICAgICAgICAgVUNIQVIgY29uZmlnTW9kZSwgVUNIQVIgKmNvbmZpZ0NoYW5nZWQpIHsKICAgQUFDX0RFQ09ERVJfRVJST1IgZXJyID0gQUFDX0RFQ19PSzsKLSAgSU5UIGFzY0NoYW5uZWxzLCBjaCwgYXNjQ2hhbmdlZCA9IDA7CisgIElOVCBhc2NDaGFubmVscywgYXNjQ2hhbmdlZCA9IDA7CisgIEFBQ0RFQ19SRU5ERVJfTU9ERSBpbml0UmVuZGVyTW9kZSA9IEFBQ0RFQ19SRU5ERVJfSU5WQUxJRDsKKyAgU0NIQVIgdXNhY1N0ZXJlb0NvbmZpZ0luZGV4ID0gLTE7CisgIGludCB1c2FjUmVzaWR1YWxEZWxheUNvbXBTYW1wbGVzID0gMDsKKyAgaW50IGVsZW1lbnRPZmZzZXQsIGFhY0NoYW5uZWxzT2Zmc2V0LCBhYWNDaGFubmVsc09mZnNldElkeDsKKyAgY29uc3QgaW50IHN0cmVhbUluZGV4ID0gMDsKKyAgSU5UIGZsdXNoQ2hhbm5lbHMgPSAwOwogCi0gIGlmICghc2VsZikKLSAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgaWYgKCFzZWxmKSByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKworICBVQ0hBUiBkb3duc2NhbGVGYWN0b3IgPSBzZWxmLT5kb3duc2NhbGVGYWN0b3I7CisgIFVDSEFSIGRvd25zY2FsZUZhY3RvckluQlMgPSBzZWxmLT5kb3duc2NhbGVGYWN0b3JJbkJTOwogCiAgIC8vIHNldCBwcm9maWxlIGFuZCBjaGVjayBmb3Igc3VwcG9ydGVkIGFvdAotICAvLyBsZWF2ZSBwcm9maWxlIG9uIGRlZmF1bHQgKD0tMSkgZm9yIGFsbCBvdGhlciBzdXBwb3J0ZWQgTVBFRy00IGFvdCdzIGV4Y2VwdCBhb3Q9MiAoPUFBQy1MQykKKyAgLy8gbGVhdmUgcHJvZmlsZSBvbiBkZWZhdWx0ICg9LTEpIGZvciBhbGwgb3RoZXIgc3VwcG9ydGVkIE1QRUctNCBhb3QncyBleGNlcHQKKyAgLy8gYW90PTIgKD1BQUMtTEMpCiAgIHN3aXRjaCAoYXNjLT5tX2FvdCkgewotICBjYXNlIEFPVF9BQUNfTEM6Ci0gICAgc2VsZi0+c3RyZWFtSW5mby5wcm9maWxlID0gMTsKLQotICBjYXNlIEFPVF9FUl9BQUNfU0NBTDoKLSAgICBpZiAoYXNjLT5tX3NjLm1fZ2FTcGVjaWZpY0NvbmZpZy5tX2xheWVyID4gMCkgewotICAgICAgLyogYWFjX3NjYWxhYmxlX2V4dGVuc2lvbl9lbGVtZW50KCkgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuICovCi0gICAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7Ci0gICAgfQotCi0gIGNhc2UgQU9UX1NCUjoKLSAgY2FzZSBBT1RfUFM6Ci0gIGNhc2UgQU9UX0VSX0FBQ19MRDoKLSAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKLSAgY2FzZSBBT1RfRFJNX0FBQzoKLSAgICBicmVhazsKLQotICBkZWZhdWx0OgotICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0FPVDsKKyAgICBjYXNlIEFPVF9BQUNfTEM6CisgICAgICBzZWxmLT5zdHJlYW1JbmZvLnByb2ZpbGUgPSAxOworICAgIGNhc2UgQU9UX0VSX0FBQ19TQ0FMOgorICAgICAgaWYgKGFzYy0+bV9zYy5tX2dhU3BlY2lmaWNDb25maWcubV9sYXllciA+IDApIHsKKyAgICAgICAgLyogYWFjX3NjYWxhYmxlX2V4dGVuc2lvbl9lbGVtZW50KCkgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuICovCisgICAgICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgICAgIH0KKyAgICBjYXNlIEFPVF9TQlI6CisgICAgY2FzZSBBT1RfUFM6CisgICAgY2FzZSBBT1RfRVJfQUFDX0xDOgorICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKKyAgICBjYXNlIEFPVF9EUk1fQUFDOgorICAgIGNhc2UgQU9UX0RSTV9TVVJST1VORDoKKyAgICAgIGluaXRSZW5kZXJNb2RlID0gQUFDREVDX1JFTkRFUl9JTURDVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6CisgICAgICBpbml0UmVuZGVyTW9kZSA9IEFBQ0RFQ19SRU5ERVJfRUxERkI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFPVF9VU0FDOgorICAgICAgaW5pdFJlbmRlck1vZGUgPSBBQUNERUNfUkVOREVSX0lNRENUOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0FPVDsKICAgfQogCi0gIENQcm9ncmFtQ29uZmlnX0luaXQoJnNlbGYtPnBjZSk7CisgIGlmIChDUHJvZ3JhbUNvbmZpZ19Jc1ZhbGlkKCZzZWxmLT5wY2UpICYmIChhc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gPiAwKSkgeworICAgIC8qIENvbXBhcmUgdGhlIHN0b3JlZCAob2xkKSBQQ0Ugd2l0aCBhIGRlZmF1bHQgUENFIGNyZWF0ZWQgZnJvbSB0aGUgKG5ldykKKyAgICAgICBjaGFubmVsX2NvbmZpZyAob24gYSB0ZW1wb3JhbCBidWZmZXIpIHRvIGZpbmQgb3V0IHdoZXRlciB3ZSBjYW4ga2VlcCBpdAorICAgICAgIChhbmQgaXRzIG1ldGFkYXRhKSBvciBub3QuICovCisgICAgaW50IHBjZUNtcFJlc3VsdDsKKyAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQodG1wUGNlLCBDUHJvZ3JhbUNvbmZpZywgMSk7CisKKyAgICBDUHJvZ3JhbUNvbmZpZ19HZXREZWZhdWx0KHRtcFBjZSwgYXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uKTsKKyAgICBwY2VDbXBSZXN1bHQgPSBDUHJvZ3JhbUNvbmZpZ19Db21wYXJlKCZzZWxmLT5wY2UsIHRtcFBjZSk7CisgICAgaWYgKChwY2VDbXBSZXN1bHQgPCAwKSAvKiBSZXNldCBpZiBQQ0VzIGFyZSBjb21wbGV0ZWx5IGRpZmZlcmVudCAuLi4gKi8KKyAgICAgICAgfHwKKyAgICAgICAgKHBjZUNtcFJlc3VsdCA+IDEpKSB7IC8qICAgICAgICAgICAgLi4uIG9yIGhhdmUgYSBkaWZmZXJlbnQgbGF5b3V0LiAqLworICAgICAgQ1Byb2dyYW1Db25maWdfSW5pdCgmc2VsZi0+cGNlKTsKKyAgICB9IC8qIE90aGVyd2lzZSBrZWVwIHRoZSBQQ0UgKGFuZCBpdHMgbWV0YWRhdGEpLiAqLworICAgIENfQUxMT0NfU0NSQVRDSF9FTkQodG1wUGNlLCBDUHJvZ3JhbUNvbmZpZywgMSk7CisgIH0gZWxzZSB7CisgICAgQ1Byb2dyYW1Db25maWdfSW5pdCgmc2VsZi0+cGNlKTsKKyAgfQogCiAgIC8qIHNldCBjaGFubmVscyAqLwogICBzd2l0Y2ggKGFzYy0+bV9jaGFubmVsQ29uZmlndXJhdGlvbikgewotICBjYXNlIDA6Ci0jaWZkZWYgVFBfUENFX0VOQUJMRQotICAgIC8qIGdldCBjaGFubmVscyBmcm9tIHByb2dyYW0gY29uZmlnIChBU0MpICovCi0gICAgaWYgKENQcm9ncmFtQ29uZmlnX0lzVmFsaWQoJmFzYy0+bV9wcm9nckNvbmZpZ0VsZW1lbnQpKSB7Ci0gICAgICBhc2NDaGFubmVscyA9IGFzYy0+bV9wcm9nckNvbmZpZ0VsZW1lbnQuTnVtQ2hhbm5lbHM7Ci0gICAgICBpZiAoYXNjQ2hhbm5lbHMgPiAwKSB7Ci0gICAgICAgIGludCBlbDsKLSAgICAgICAgLyogdmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzIC0+IGNvcHkgcHJvZ3JhbSBjb25maWcgZWxlbWVudCAoUENFKSBmcm9tIEFTQyAqLwotICAgICAgICBGREttZW1jcHkoJnNlbGYtPnBjZSwgJmFzYy0+bV9wcm9nckNvbmZpZ0VsZW1lbnQsIHNpemVvZihDUHJvZ3JhbUNvbmZpZykpOwotICAgICAgICAvKiBCdWlsdCBlbGVtZW50IHRhYmxlICovCi0gICAgICAgIGVsID0gQ1Byb2dyYW1Db25maWdfR2V0RWxlbWVudFRhYmxlKCZhc2MtPm1fcHJvZ3JDb25maWdFbGVtZW50LCBzZWxmLT5lbGVtZW50cywgKDgpLCAmc2VsZi0+Y2hNYXBJbmRleCk7Ci0gICAgICAgIGZvciAoOyBlbDwoOCk7IGVsKyspIHsKLSAgICAgICAgICBzZWxmLT5lbGVtZW50c1tlbF0gPSBJRF9OT05FOworICAgIGNhc2UgMDoKKyAgICAgIHN3aXRjaCAoYXNjLT5tX2FvdCkgeworICAgICAgICBjYXNlIEFPVF9VU0FDOgorICAgICAgICAgIHNlbGYtPmNoTWFwSW5kZXggPSAwOworICAgICAgICAgIGFzY0NoYW5uZWxzID0gYXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5tX25Vc2FjQ2hhbm5lbHM7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgLyogZ2V0IGNoYW5uZWxzIGZyb20gcHJvZ3JhbSBjb25maWcgKEFTQykgKi8KKyAgICAgICAgICBpZiAoQ1Byb2dyYW1Db25maWdfSXNWYWxpZCgmYXNjLT5tX3Byb2dyQ29uZmlnRWxlbWVudCkpIHsKKyAgICAgICAgICAgIGFzY0NoYW5uZWxzID0gYXNjLT5tX3Byb2dyQ29uZmlnRWxlbWVudC5OdW1DaGFubmVsczsKKyAgICAgICAgICAgIGlmIChhc2NDaGFubmVscyA+IDApIHsKKyAgICAgICAgICAgICAgaW50IGVsX3RtcDsKKyAgICAgICAgICAgICAgLyogdmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzIC0+IGNvcHkgcHJvZ3JhbSBjb25maWcgZWxlbWVudCAoUENFKQorICAgICAgICAgICAgICAgKiBmcm9tIEFTQyAqLworICAgICAgICAgICAgICBGREttZW1jcHkoJnNlbGYtPnBjZSwgJmFzYy0+bV9wcm9nckNvbmZpZ0VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ1Byb2dyYW1Db25maWcpKTsKKyAgICAgICAgICAgICAgLyogQnVpbHQgZWxlbWVudCB0YWJsZSAqLworICAgICAgICAgICAgICBlbF90bXAgPSBDUHJvZ3JhbUNvbmZpZ19HZXRFbGVtZW50VGFibGUoCisgICAgICAgICAgICAgICAgICAmYXNjLT5tX3Byb2dyQ29uZmlnRWxlbWVudCwgc2VsZi0+ZWxlbWVudHMsICgoKDgpKSArICg4KSksCisgICAgICAgICAgICAgICAgICAmc2VsZi0+Y2hNYXBJbmRleCk7CisgICAgICAgICAgICAgIGZvciAoOyBlbF90bXAgPCAoMyAqICgoOCkgKiAyKSArICgoKDgpICogMikpIC8gMiArIDQgKiAoMSkgKyAxKTsKKyAgICAgICAgICAgICAgICAgICBlbF90bXArKykgeworICAgICAgICAgICAgICAgIHNlbGYtPmVsZW1lbnRzW2VsX3RtcF0gPSBJRF9OT05FOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmLT5jaE1hcEluZGV4ID0gMDsKKyAgICAgICAgICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUc7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICBjYXNlIDM6CisgICAgY2FzZSA0OgorICAgIGNhc2UgNToKKyAgICBjYXNlIDY6CisgICAgICBhc2NDaGFubmVscyA9IGFzYy0+bV9jaGFubmVsQ29uZmlndXJhdGlvbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTE6CisgICAgICBhc2NDaGFubmVscyA9IDc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgY2FzZSAxMjoKKyAgICBjYXNlIDE0OgorICAgICAgYXNjQ2hhbm5lbHMgPSA4OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUc7CisgIH0KKworICBpZiAoYXNjLT5tX2FvdCA9PSBBT1RfVVNBQykgeworICAgIGZsdXNoQ2hhbm5lbHMgPSBmTWluKGFzY0NoYW5uZWxzLCAoOCkpOworICAgIElOVCBudW1DaGFubmVsOworICAgIHBjbURteF9HZXRQYXJhbShzZWxmLT5oUGNtVXRpbHMsIE1JTl9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTLAorICAgICAgICAgICAgICAgICAgICAmbnVtQ2hhbm5lbCk7CisgICAgZmx1c2hDaGFubmVscyA9IGZNaW4oZk1heChudW1DaGFubmVsLCBmbHVzaENoYW5uZWxzKSwgKDgpKTsKKyAgfQorCisgIGlmIChJU19VU0FDKGFzYy0+bV9hb3QpKSB7CisgICAgZm9yIChpbnQgZWwgPSAwOyBlbCA8IChJTlQpYXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5tX3VzYWNOdW1FbGVtZW50czsgZWwrKykgeworICAgICAgLyogZml4IG51bWJlciBvZiBjb3JlIGNoYW5uZWxzIGFrYSBhc2NDaGFubmVscyBmb3Igc3RlcmVvQ29uZmlnSW5kZXggPSAxCisgICAgICAgKiBjYXNlcyAqLworICAgICAgaWYgKGFzYy0+bV9zYy5tX3VzYWNDb25maWcuZWxlbWVudFtlbF0ubV9zdGVyZW9Db25maWdJbmRleCA9PSAxKSB7CisgICAgICAgIGFzY0NoYW5uZWxzLS07IC8qIHN0ZXJlb0NvbmZpZ0luZGV4ID09IDEgc3RlcmVvIGNhc2VzIGRvIGFjdHVhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW4gb25seSBhIG1vbm8gY29yZSBjaGFubmVsLiAqLworICAgICAgfSBlbHNlIGlmIChhc2MtPm1fc2MubV91c2FjQ29uZmlnLmVsZW1lbnRbZWxdLm1fc3RlcmVvQ29uZmlnSW5kZXggPT0gMikgeworICAgICAgICAvKiBJbiB0aGlzIGNhc2UgaXQgaXMgbmVjZXNzYXJ5IHRvIGZvbGxvdyB1cCB0aGUgRE1YIHNpZ25hbCBkZWxheSBjYXVzZWQKKyAgICAgICAgICAgYnkgSEJFIGFsc28gd2l0aCB0aGUgcmVzaWR1YWwgc2lnbmFsICgybmQgY29yZSBjaGFubmVsKS4gVGhlIFNCUgorICAgICAgICAgICBvdmVybGFwIGRlbGF5IGlzIG5vdCByZWdhcmRlZCBoZXJlLCB0aGlzIGlzIGhhbmRsZWQgYnkgdGhlIE1QUzIxMgorICAgICAgICAgICBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKGFzYy0+bV9zYy5tX3VzYWNDb25maWcuZWxlbWVudFtlbF0ubV9oYXJtb25pY1NCUikgeworICAgICAgICAgIHVzYWNSZXNpZHVhbERlbGF5Q29tcFNhbXBsZXMgKz0gYXNjLT5tX3NhbXBsZXNQZXJGcmFtZTsKICAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEFBQ19ERUNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKKyAgICAgICAgaWYgKGFzYy0+bV9zYy5tX3VzYWNDb25maWcubV9jb3JlU2JyRnJhbWVMZW5ndGhJbmRleCA9PSA0KSB7CisgICAgICAgICAgdXNhY1Jlc2lkdWFsRGVsYXlDb21wU2FtcGxlcyArPQorICAgICAgICAgICAgICA2ICogMTY7IC8qIGRpZmZlcmVuY2UgYmV0d2VlbiAxMiBTQlIKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGFwIHNsb3RzIGZyb20gU0JSIGFuZCA2CisgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdHMgZGVsYXllZCBpbiBNUFMyMTIgKi8KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGFhY0NoYW5uZWxzT2Zmc2V0ID0gMDsKKyAgYWFjQ2hhbm5lbHNPZmZzZXRJZHggPSAwOworICBlbGVtZW50T2Zmc2V0ID0gMDsKKyAgaWYgKGNvbmZpZ01vZGUgJiBBQ19DTV9BTExPQ19NRU0pIHsKKyAgICBpZiAoKGFzY0NoYW5uZWxzIDw9IDApIHx8CisgICAgICAgIChhc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gPiBBQUNERUNfTUFYX0NIX0NPTkYpKSB7CisgICAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOworICAgIH0KKyAgICBpZiAoKGFzY0NoYW5uZWxzICsgYWFjQ2hhbm5lbHNPZmZzZXRJZHgpID4gKCg4KSAqIDIpKSB7CisgICAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOworICAgIH0KKyAgICBpZiAoKGFzY0NoYW5uZWxzICsgYWFjQ2hhbm5lbHNPZmZzZXQpID4gKDgpKSB7CisgICAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOworICAgIH0KKyAgfQorCisgIC8qIFNldCBzeW50YXggZmxhZ3MgKi8KKyAgc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdID0gMDsKKyAgeyBGREttZW1jbGVhcihzZWxmLT5lbEZsYWdzLCBzaXplb2Yoc2VsZi0+ZWxGbGFncykpOyB9CisKKyAgaWYgKChhc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gPiAwKSB8fCBJU19VU0FDKGFzYy0+bV9hb3QpKSB7CisgICAgaWYgKElTX1VTQUMoYXNjLT5tX2FvdCkpIHsKKyAgICAgIC8qIGNvcHkgcG9pbnRlciB0byB1c2FjIGNvbmZpZworICAgICAgICAodGhpcyBpcyBwcmVsaW1pbmFyeSBzaW5jZSB0aGVyZSdzIGFuIG9uZ29pbmcgZGlzY3Vzc2lvbiBhYm91dCBzdG9yaW5nCisgICAgICAgIHRoZSBjb25maWctcGFydCBvZiB0aGUgYml0c3RyZWFtIHJhdGhlciB0aGFuIHRoZSBjb21wbGV0ZSBkZWNvZGVkCisgICAgICAgIGNvbmZpZ3VyYXRpb24pICovCisgICAgICBzZWxmLT5wVXNhY0NvbmZpZ1tzdHJlYW1JbmRleF0gPSAmYXNjLT5tX3NjLm1fdXNhY0NvbmZpZzsKKworICAgICAgLyogY29weSBsaXN0IG9mIGVsZW1lbnRzICovCisgICAgICBpZiAoc2VsZi0+cFVzYWNDb25maWdbc3RyZWFtSW5kZXhdLT5tX3VzYWNOdW1FbGVtZW50cyA+CisgICAgICAgICAgKDMgKiAoKDgpICogMikgKyAoKCg4KSAqIDIpKSAvIDIgKyA0ICogKDEpICsgMSkpIHsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorCisgICAgICBpZiAoc2VsZi0+bnVtVXNhY0VsZW1lbnRzW3N0cmVhbUluZGV4XSAhPQorICAgICAgICAgIGFzYy0+bV9zYy5tX3VzYWNDb25maWcubV91c2FjTnVtRWxlbWVudHMpIHsKKyAgICAgICAgYXNjQ2hhbmdlZCA9IDE7CisgICAgICB9CisKKyAgICAgIGlmIChjb25maWdNb2RlICYgQUNfQ01fQUxMT0NfTUVNKSB7CisgICAgICAgIHNlbGYtPm51bVVzYWNFbGVtZW50c1tzdHJlYW1JbmRleF0gPQorICAgICAgICAgICAgYXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5tX3VzYWNOdW1FbGVtZW50czsKKyAgICAgIH0KKworICAgICAgc2VsZi0+bXBzRW5hYmxlQ3VyciA9IDA7CisgICAgICBmb3IgKGludCBfZWwgPSAwOworICAgICAgICAgICBfZWwgPCAoaW50KXNlbGYtPnBVc2FjQ29uZmlnW3N0cmVhbUluZGV4XS0+bV91c2FjTnVtRWxlbWVudHM7CisgICAgICAgICAgIF9lbCsrKSB7CisgICAgICAgIGludCBlbCA9IF9lbCArIGVsZW1lbnRPZmZzZXQ7CisgICAgICAgIGlmIChzZWxmLT5lbGVtZW50c1tlbF0gIT0KKyAgICAgICAgICAgIHNlbGYtPnBVc2FjQ29uZmlnW3N0cmVhbUluZGV4XS0+ZWxlbWVudFtfZWxdLnVzYWNFbGVtZW50VHlwZSkgeworICAgICAgICAgIGFzY0NoYW5nZWQgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChzZWxmLT51c2FjU3RlcmVvQ29uZmlnSW5kZXhbZWxdICE9CisgICAgICAgICAgICBhc2MtPm1fc2MubV91c2FjQ29uZmlnLmVsZW1lbnRbX2VsXS5tX3N0ZXJlb0NvbmZpZ0luZGV4KSB7CisgICAgICAgICAgYXNjQ2hhbmdlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbmZpZ01vZGUgJiBBQ19DTV9BTExPQ19NRU0pIHsKKyAgICAgICAgICBzZWxmLT5lbGVtZW50c1tlbF0gPQorICAgICAgICAgICAgICBzZWxmLT5wVXNhY0NvbmZpZ1tzdHJlYW1JbmRleF0tPmVsZW1lbnRbX2VsXS51c2FjRWxlbWVudFR5cGU7CisgICAgICAgICAgLyogZm9yIFVuaWZpZWQgU3RlcmVvIENvZGluZyAqLworICAgICAgICAgIHNlbGYtPnVzYWNTdGVyZW9Db25maWdJbmRleFtlbF0gPQorICAgICAgICAgICAgICBhc2MtPm1fc2MubV91c2FjQ29uZmlnLmVsZW1lbnRbX2VsXS5tX3N0ZXJlb0NvbmZpZ0luZGV4OworICAgICAgICAgIGlmIChzZWxmLT5lbGVtZW50c1tlbF0gPT0gSURfVVNBQ19DUEUpIHsKKyAgICAgICAgICAgIHNlbGYtPm1wc0VuYWJsZUN1cnIgfD0gc2VsZi0+dXNhY1N0ZXJlb0NvbmZpZ0luZGV4W2VsXSA/IDEgOiAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNlbGYtPmVsRmxhZ3NbZWxdIHw9CisgICAgICAgICAgICAoYXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5lbGVtZW50W19lbF0ubV9ub2lzZUZpbGxpbmcpCisgICAgICAgICAgICAgICAgPyBBQ19FTF9VU0FDX05PSVNFCisgICAgICAgICAgICAgICAgOiAwOworICAgICAgICBzZWxmLT5lbEZsYWdzW2VsXSB8PQorICAgICAgICAgICAgKGFzYy0+bV9zYy5tX3VzYWNDb25maWcuZWxlbWVudFtfZWxdLm1fc3RlcmVvQ29uZmlnSW5kZXggPiAwKQorICAgICAgICAgICAgICAgID8gQUNfRUxfVVNBQ19NUFMyMTIKKyAgICAgICAgICAgICAgICA6IDA7CisgICAgICAgIHNlbGYtPmVsRmxhZ3NbZWxdIHw9IChhc2MtPm1fc2MubV91c2FjQ29uZmlnLmVsZW1lbnRbX2VsXS5tX2ludGVyVGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBQ19FTF9VU0FDX0lURVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICAgICAgc2VsZi0+ZWxGbGFnc1tlbF0gfD0KKyAgICAgICAgICAgIChhc2MtPm1fc2MubV91c2FjQ29uZmlnLmVsZW1lbnRbX2VsXS5tX3B2YykgPyBBQ19FTF9VU0FDX1BWQyA6IDA7CisgICAgICAgIHNlbGYtPmVsRmxhZ3NbZWxdIHw9CisgICAgICAgICAgICAoYXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5lbGVtZW50W19lbF0udXNhY0VsZW1lbnRUeXBlID09IElEX1VTQUNfTEZFKQorICAgICAgICAgICAgICAgID8gQUNfRUxfVVNBQ19MRkUKKyAgICAgICAgICAgICAgICA6IDA7CisgICAgICAgIHNlbGYtPmVsRmxhZ3NbZWxdIHw9CisgICAgICAgICAgICAoYXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5lbGVtZW50W19lbF0udXNhY0VsZW1lbnRUeXBlID09IElEX1VTQUNfTEZFKQorICAgICAgICAgICAgICAgID8gQUNfRUxfTEZFCisgICAgICAgICAgICAgICAgOiAwOworICAgICAgICBpZiAoKGFzYy0+bV9zYy5tX3VzYWNDb25maWcuZWxlbWVudFtfZWxdLnVzYWNFbGVtZW50VHlwZSA9PQorICAgICAgICAgICAgIElEX1VTQUNfQ1BFKSAmJgorICAgICAgICAgICAgKChzZWxmLT51c2FjU3RlcmVvQ29uZmlnSW5kZXhbZWxdID09IDApKSkgeworICAgICAgICAgIHNlbGYtPmVsRmxhZ3NbZWxdIHw9IEFDX0VMX1VTQUNfQ1BfUE9TU0lCTEU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc2VsZi0+aGFzQXVkaW9QcmVSb2xsID0gMDsKKyAgICAgIGlmIChzZWxmLT5wVXNhY0NvbmZpZ1tzdHJlYW1JbmRleF0tPm1fdXNhY051bUVsZW1lbnRzKSB7CisgICAgICAgIHNlbGYtPmhhc0F1ZGlvUHJlUm9sbCA9IGFzYy0+bV9zYy5tX3VzYWNDb25maWcuZWxlbWVudFswXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4dEVsZW1lbnQudXNhY0V4dEVsZW1lbnRIYXNBdWRpb1ByZVJvbGw7CisgICAgICB9CisgICAgICBpZiAoY29uZmlnTW9kZSAmIEFDX0NNX0FMTE9DX01FTSkgeworICAgICAgICBzZWxmLT5lbGVtZW50c1tlbGVtZW50T2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+cFVzYWNDb25maWdbc3RyZWFtSW5kZXhdLT5tX3VzYWNOdW1FbGVtZW50c10gPQorICAgICAgICAgICAgSURfRU5EOwogICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICBzZWxmLT5jaE1hcEluZGV4ID0gMDsKLSAgICAgIGlmICh0cmFuc3BvcnREZWNfR2V0Rm9ybWF0KHNlbGYtPmhJbnB1dCkgPT0gVFRfTVA0X0FEVFMpIHsKLSAgICAgICAgLyogc2V0IGRlZmF1bHQgbWF4X2NoYW5uZWxzIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBiZWNhdXNlIGluIGltcGxpY2l0IGNoYW5uZWwgbWFwcGluZyBtb2RlCi0gICAgICAgICAgIHdlIGRvbid0IGtub3cgdGhlIGFjdHVhbCBudW1iZXIgb2YgY2hhbm5lbHMgdW50aWwgd2UgcHJvY2Vzc2VkIGF0IGxlYXN0IG9uZSByYXdfZGF0YV9ibG9jaygpLiAqLwotICAgICAgICBhc2NDaGFubmVscyA9ICg4KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUc7CisgICAgICAvKiBJbml0aWFsaXplIGNvbnN0YW50IG1hcHBpbmdzIGZvciBjaGFubmVsIGNvbmZpZyAxLTcgKi8KKyAgICAgIGludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IEFBQ0RFQ19DSF9FTEVNRU5UU19UQUJfU0laRTsgaSsrKSB7CisgICAgICAgIHNlbGYtPmVsZW1lbnRzW2ldID0gZWxlbWVudHNUYWJbYXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uIC0gMV1baV07CisgICAgICB9CisgICAgICBmb3IgKDsgaSA8ICgzICogKCg4KSAqIDIpICsgKCgoOCkgKiAyKSkgLyAyICsgNCAqICgxKSArIDEpOyBpKyspIHsKKyAgICAgICAgc2VsZi0+ZWxlbWVudHNbaV0gPSBJRF9OT05FOwogICAgICAgfQogICAgIH0KLSNlbHNlIC8qIFRQX1BDRV9FTkFCTEUgKi8KLSAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOwotI2VuZGlmIC8qIFRQX1BDRV9FTkFCTEUgKi8KLSAgICBicmVhazsKLSAgY2FzZSAxOiBjYXNlIDI6IGNhc2UgMzogY2FzZSA0OiBjYXNlIDU6IGNhc2UgNjoKLSAgICBhc2NDaGFubmVscyA9IGFzYy0+bV9jaGFubmVsQ29uZmlndXJhdGlvbjsKLSAgICBicmVhazsKLSAgY2FzZSAxMToKLSAgICBhc2NDaGFubmVscyA9IDc7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgNzogY2FzZSAxMjogY2FzZSAxNDoKLSAgICBhc2NDaGFubmVscyA9IDg7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIEFBQ19ERUNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKLSAgfQogCi0gIGlmIChhc2NDaGFubmVscyA+ICg4KSkgewotICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUc7Ci0gIH0KKyAgICB7CisgICAgICBpbnQgY2g7CiAKLSAgLyogSW5pdGlhbGl6ZSBjb25zdGFudCBtYXBwaW5ncyBmb3IgY2hhbm5lbCBjb25maWcgMS03ICovCi0gIGlmIChhc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gPiAwKSB7Ci0gICAgaW50IGVsOwotICAgIEZES21lbWNweShzZWxmLT5lbGVtZW50cywgZWxlbWVudHNUYWJbYXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uLTFdLCBzaXplb2YoTVA0X0VMRU1FTlRfSUQpKkZES21pbig3LCg4KSkpOwotICAgIGZvciAoZWw9NzsgZWw8KDgpOyBlbCsrKSB7Ci0gICAgICBzZWxmLT5lbGVtZW50c1tlbF0gPSBJRF9OT05FOworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgYXNjQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgc2VsZi0+Y2hNYXBwaW5nW2NoXSA9IGNoOworICAgICAgfQorICAgICAgZm9yICg7IGNoIDwgKDgpOyBjaCsrKSB7CisgICAgICAgIHNlbGYtPmNoTWFwcGluZ1tjaF0gPSAyNTU7CisgICAgICB9CiAgICAgfQotICAgIGZvciAoY2g9MDsgY2g8YXNjQ2hhbm5lbHM7IGNoKyspIHsKLSAgICAgIHNlbGYtPmNoTWFwcGluZ1tjaF0gPSBjaDsKLSAgICB9Ci0gICAgZm9yICg7IGNoPCg4KTsgY2grKykgewotICAgICAgc2VsZi0+Y2hNYXBwaW5nW2NoXSA9IDI1NTsKLSAgICB9CisKICAgICBzZWxmLT5jaE1hcEluZGV4ID0gYXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uOwotICB9Ci0gI2lmZGVmIFRQX1BDRV9FTkFCTEUKLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgaWYgKENQcm9ncmFtQ29uZmlnX0lzVmFsaWQoJmFzYy0+bV9wcm9nckNvbmZpZ0VsZW1lbnQpKSB7CiAgICAgICAvKiBTZXQgbWF0cml4IG1peGRvd24gaW5mb3MgaWYgYXZhaWxhYmxlIGZyb20gUENFLiAqLwotICAgICAgcGNtRG14X1NldE1hdHJpeE1peGRvd25Gcm9tUGNlICggc2VsZi0+aFBjbVV0aWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjLT5tX3Byb2dyQ29uZmlnRWxlbWVudC5NYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjLT5tX3Byb2dyQ29uZmlnRWxlbWVudC5NYXRyaXhNaXhkb3duSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2MtPm1fcHJvZ3JDb25maWdFbGVtZW50LlBzZXVkb1N1cnJvdW5kRW5hYmxlICk7CisgICAgICBwY21EbXhfU2V0TWF0cml4TWl4ZG93bkZyb21QY2UoCisgICAgICAgICAgc2VsZi0+aFBjbVV0aWxzLCBhc2MtPm1fcHJvZ3JDb25maWdFbGVtZW50Lk1hdHJpeE1peGRvd25JbmRleFByZXNlbnQsCisgICAgICAgICAgYXNjLT5tX3Byb2dyQ29uZmlnRWxlbWVudC5NYXRyaXhNaXhkb3duSW5kZXgsCisgICAgICAgICAgYXNjLT5tX3Byb2dyQ29uZmlnRWxlbWVudC5Qc2V1ZG9TdXJyb3VuZEVuYWJsZSk7CiAgICAgfQogICB9Ci0gI2VuZGlmCiAKICAgc2VsZi0+c3RyZWFtSW5mby5jaGFubmVsQ29uZmlnID0gYXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uOwogCiAgIGlmIChzZWxmLT5zdHJlYW1JbmZvLmFvdCAhPSBhc2MtPm1fYW90KSB7Ci0gICAgc2VsZi0+c3RyZWFtSW5mby5hb3QgPSBhc2MtPm1fYW90OworICAgIGlmIChjb25maWdNb2RlICYgQUNfQ01fQUxMT0NfTUVNKSB7CisgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFvdCA9IGFzYy0+bV9hb3Q7CisgICAgfQogICAgIGFzY0NoYW5nZWQgPSAxOwogICB9CiAKLSAgaWYgKHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lICE9IChJTlQpYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSkgewotICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lID0gYXNjLT5tX3NhbXBsZXNQZXJGcmFtZTsKKyAgaWYgKGFzYy0+bV9hb3QgPT0gQU9UX0VSX0FBQ19FTEQgJiYKKyAgICAgIGFzYy0+bV9zYy5tX2VsZFNwZWNpZmljQ29uZmlnLm1fZG93bnNjYWxlZFNhbXBsaW5nRnJlcXVlbmN5ICE9IDApIHsKKyAgICBpZiAoc2VsZi0+c2FtcGxpbmdSYXRlSW5mb1swXS5zYW1wbGluZ1JhdGUgIT0KKyAgICAgICAgICAgIGFzYy0+bV9zYy5tX2VsZFNwZWNpZmljQ29uZmlnLm1fZG93bnNjYWxlZFNhbXBsaW5nRnJlcXVlbmN5IHx8CisgICAgICAgIHNlbGYtPnNhbXBsaW5nUmF0ZUluZm9bMF0uc2FtcGxpbmdSYXRlICogc2VsZi0+ZG93bnNjYWxlRmFjdG9yICE9CisgICAgICAgICAgICBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3kpIHsKKyAgICAgIC8qIGdldCBkb3duc2NhbGVkU2FtcGxpbmdGcmVxdWVuY3kgZnJvbSBFU0MgYW5kIGNvbXB1dGUgdGhlIGRvd25zY2FsZQorICAgICAgICogZmFjdG9yICovCisgICAgICBkb3duc2NhbGVGYWN0b3JJbkJTID0KKyAgICAgICAgICBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3kgLworICAgICAgICAgIGFzYy0+bV9zYy5tX2VsZFNwZWNpZmljQ29uZmlnLm1fZG93bnNjYWxlZFNhbXBsaW5nRnJlcXVlbmN5OworICAgICAgaWYgKGRvd25zY2FsZUZhY3RvckluQlMgPT0gMSB8fCBkb3duc2NhbGVGYWN0b3JJbkJTID09IDIgfHwKKyAgICAgICAgICBkb3duc2NhbGVGYWN0b3JJbkJTID09IDMgfHwgZG93bnNjYWxlRmFjdG9ySW5CUyA9PSA0KSB7CisgICAgICAgIGRvd25zY2FsZUZhY3RvciA9IGRvd25zY2FsZUZhY3RvckluQlM7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGRvd25zY2FsZUZhY3RvckluQlMgPSAxOworICAgIGRvd25zY2FsZUZhY3RvciA9IDE7CisgIH0KKworICBpZiAoc2VsZi0+ZG93bnNjYWxlRmFjdG9ySW5CUyAhPSBkb3duc2NhbGVGYWN0b3JJbkJTKSB7CisgICAgaWYgKGNvbmZpZ01vZGUgJiBBQ19DTV9BTExPQ19NRU0pIHsKKyAgICAgIHNlbGYtPmRvd25zY2FsZUZhY3RvckluQlMgPSBkb3duc2NhbGVGYWN0b3JJbkJTOworICAgICAgc2VsZi0+ZG93bnNjYWxlRmFjdG9yID0gZG93bnNjYWxlRmFjdG9yOworICAgIH0KICAgICBhc2NDaGFuZ2VkID0gMTsKICAgfQogCi0gIHNlbGYtPnN0cmVhbUluZm8uYml0UmF0ZSAgICAgICAgICAgID0gMDsKKyAgaWYgKChJTlQpYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSAlIGRvd25zY2FsZUZhY3RvciAhPSAwKSB7CisgICAgcmV0dXJuIEFBQ19ERUNfVU5TVVBQT1JURURfU0FNUExJTkdSQVRFOyAvKiBmcmFtZVNpemUvZHNmIG11c3QgYmUgYW4gaW50ZWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyICovCisgIH0KIAotICAvKiBTZXQgc3ludGF4IGZsYWdzICovCi0gIHNlbGYtPmZsYWdzID0gMDsKLQotICBzZWxmLT5zdHJlYW1JbmZvLmV4dEFvdCAgICAgICAgICAgICAgID0gYXNjLT5tX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZTsKLSAgc2VsZi0+c3RyZWFtSW5mby5leHRTYW1wbGluZ1JhdGUgICAgICA9IGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgc2VsZi0+ZmxhZ3MgfD0gKGFzYy0+bV9zYnJQcmVzZW50RmxhZykgPyBBQ19TQlJfUFJFU0VOVCA6IDA7Ci0gIHNlbGYtPmZsYWdzIHw9IChhc2MtPm1fcHNQcmVzZW50RmxhZykgPyBBQ19QU19QUkVTRU5UIDogMDsKLSAgc2VsZi0+c2JyRW5hYmxlZCA9IDA7Ci0KLSAgLyogLS0tLS0tLS0tIHZjYjExIC0tLS0tLS0tLS0tLSAqLwotICBzZWxmLT5mbGFncyB8PSAoYXNjLT5tX3ZjYjExRmxhZykgPyBBQ19FUl9WQ0IxMSA6IDA7Ci0KLSAgLyogLS0tLS0tLS0tLSBydmxjIC0tLS0tLS0tLS0tLSAqLwotICBzZWxmLT5mbGFncyB8PSAoYXNjLT5tX3J2bGNGbGFnKSA/IEFDX0VSX1JWTEMgOiAwOwotCi0gIC8qIC0tLS0tLS0tLS0tIGhjciAtLS0tLS0tLS0tLS0gKi8KLSAgc2VsZi0+ZmxhZ3MgfD0gKGFzYy0+bV9oY3JGbGFnKSA/IEFDX0VSX0hDUiA6IDA7CisgIHNlbGYtPnN0cmVhbUluZm8uYml0UmF0ZSA9IDA7CiAKICAgaWYgKGFzYy0+bV9hb3QgPT0gQU9UX0VSX0FBQ19FTEQpIHsKLSAgICBzZWxmLT5mbGFncyB8PSAgQUNfRUxEOwotICAgIHNlbGYtPmZsYWdzIHw9IChhc2MtPm1fc2JyUHJlc2VudEZsYWcpID8gQUNfU0JSX1BSRVNFTlQgOiAwOyAgLyogTmVlZCB0byBzZXQgdGhlIFNCUiBmbGFnIGZvciBiYWNrd2FyZC1jb21wYXRpYmlsaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb25zLiBFdmVuIGlmIFNCUiBpcyBub3Qgc3VwcG9ydGVkLiAqLwotICAgIHNlbGYtPmZsYWdzIHw9IChhc2MtPm1fc2MubV9lbGRTcGVjaWZpY0NvbmZpZy5tX3NickNyY0ZsYWcpID8gQUNfU0JSQ1JDIDogMDsKLSAgICBzZWxmLT5mbGFncyB8PSAoYXNjLT5tX3NjLm1fZWxkU3BlY2lmaWNDb25maWcubV91c2VMZFFtZlRpbWVBbGlnbikgPyBBQ19MRF9NUFMgOiAwOwotICB9Ci0gIHNlbGYtPmZsYWdzIHw9IChhc2MtPm1fYW90ID09IEFPVF9FUl9BQUNfTEQpID8gQUNfTEQgOiAwOwotICBzZWxmLT5mbGFncyB8PSAoYXNjLT5tX2VwQ29uZmlnID49IDApID8gQUNfRVIgOiAwOwotICBpZiAoIGFzYy0+bV9hb3QgPT0gQU9UX0RSTV9BQUMgKSB7Ci0gICAgc2VsZi0+ZmxhZ3MgfD0gQUNfRFJNfEFDX1NCUkNSQ3xBQ19TQ0FMQUJMRTsKLSAgfQotICBpZiAoIChhc2MtPm1fYW90ID09IEFPVF9BQUNfU0NBTCkKLSAgICB8fCAoYXNjLT5tX2FvdCA9PSBBT1RfRVJfQUFDX1NDQUwpICkgewotICAgIHNlbGYtPmZsYWdzIHw9IEFDX1NDQUxBQkxFOworICAgIGlmIChzZWxmLT51c2VMZFFtZlRpbWVBbGlnbiAhPQorICAgICAgICBhc2MtPm1fc2MubV9lbGRTcGVjaWZpY0NvbmZpZy5tX3VzZUxkUW1mVGltZUFsaWduKSB7CisgICAgICBhc2NDaGFuZ2VkID0gMTsKKyAgICB9CisgICAgaWYgKGNvbmZpZ01vZGUgJiBBQ19DTV9BTExPQ19NRU0pIHsKKyAgICAgIHNlbGYtPnVzZUxkUW1mVGltZUFsaWduID0KKyAgICAgICAgICBhc2MtPm1fc2MubV9lbGRTcGVjaWZpY0NvbmZpZy5tX3VzZUxkUW1mVGltZUFsaWduOworICAgIH0KICAgfQogCi0KKyAgc2VsZi0+c3RyZWFtSW5mby5leHRBb3QgPSBhc2MtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlOworICBpZiAoc2VsZi0+c3RyZWFtSW5mby5leHRTYW1wbGluZ1JhdGUgIT0KKyAgICAgIChJTlQpYXNjLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5KSB7CisgICAgYXNjQ2hhbmdlZCA9IDE7CisgIH0KKyAgaWYgKGNvbmZpZ01vZGUgJiBBQ19DTV9BTExPQ19NRU0pIHsKKyAgICBzZWxmLT5zdHJlYW1JbmZvLmV4dFNhbXBsaW5nUmF0ZSA9IGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeTsKKyAgfQorICBzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gfD0gKGFzYy0+bV9zYnJQcmVzZW50RmxhZykgPyBBQ19TQlJfUFJFU0VOVCA6IDA7CisgIHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSB8PSAoYXNjLT5tX3BzUHJlc2VudEZsYWcpID8gQUNfUFNfUFJFU0VOVCA6IDA7CiAgIGlmIChhc2MtPm1fc2JyUHJlc2VudEZsYWcpIHsKICAgICBzZWxmLT5zYnJFbmFibGVkID0gMTsKICAgICBzZWxmLT5zYnJFbmFibGVkUHJldiA9IDE7CisgIH0gZWxzZSB7CisgICAgc2VsZi0+c2JyRW5hYmxlZCA9IDA7CisgICAgc2VsZi0+c2JyRW5hYmxlZFByZXYgPSAwOwogICB9Ci0gIGlmIChhc2MtPm1fcHNQcmVzZW50RmxhZykgewotICAgIHNlbGYtPmZsYWdzIHw9IEFDX1BTX1BSRVNFTlQ7CisgIGlmIChzZWxmLT5zYnJFbmFibGVkICYmIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSkgeworICAgIGlmIChkb3duc2NhbGVGYWN0b3IgIT0gMSAmJiAoZG93bnNjYWxlRmFjdG9yKSYxKSB7CisgICAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9TQU1QTElOR1JBVEU7IC8qIFNCUiBuZWVkcyBhbiBldmVuIGRvd25zY2FsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3IgKi8KKyAgICB9CisgICAgaWYgKGNvbmZpZ01vZGUgJiBBQ19DTV9BTExPQ19NRU0pIHsKKyAgICAgIHNlbGYtPnN0cmVhbUluZm8uZXh0U2FtcGxpbmdSYXRlID0KKyAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmV4dFNhbXBsaW5nUmF0ZSAvIHNlbGYtPmRvd25zY2FsZUZhY3RvcjsKKyAgICB9CiAgIH0KIAotICBpZiAoIChhc2MtPm1fZXBDb25maWcgPj0gMCkKLSAgICAmJiAoYXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uIDw9IDApICkgewotICAgIC8qIHdlIGhhdmUgdG8ga25vdyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG90aGVyd2lzZSBubyBkZWNvZGluZyBpcyBwb3NzaWJsZSAqLworICAvKiAtLS0tLS0tLS0gdmNiMTEgLS0tLS0tLS0tLS0tICovCisgIHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSB8PSAoYXNjLT5tX3ZjYjExRmxhZykgPyBBQ19FUl9WQ0IxMSA6IDA7CisKKyAgLyogLS0tLS0tLS0tLSBydmxjIC0tLS0tLS0tLS0tLSAqLworICBzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gfD0gKGFzYy0+bV9ydmxjRmxhZykgPyBBQ19FUl9SVkxDIDogMDsKKworICAvKiAtLS0tLS0tLS0tLSBoY3IgLS0tLS0tLS0tLS0tICovCisgIHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSB8PSAoYXNjLT5tX2hjckZsYWcpID8gQUNfRVJfSENSIDogMDsKKworICBpZiAoYXNjLT5tX2FvdCA9PSBBT1RfRVJfQUFDX0VMRCkgeworICAgIHNlbGYtPm1wc0VuYWJsZUN1cnIgPSAwOworICAgIHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSB8PSBBQ19FTEQ7CisgICAgc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdIHw9CisgICAgICAgIChhc2MtPm1fc2JyUHJlc2VudEZsYWcpCisgICAgICAgICAgICA/IEFDX1NCUl9QUkVTRU5UCisgICAgICAgICAgICA6IDA7IC8qIE5lZWQgdG8gc2V0IHRoZSBTQlIgZmxhZyBmb3IgYmFja3dhcmQtY29tcGF0aWJpbGl0eQorICAgICAgIHJlYXNvbnMuIEV2ZW4gaWYgU0JSIGlzIG5vdCBzdXBwb3J0ZWQuICovCisgICAgc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdIHw9CisgICAgICAgIChhc2MtPm1fc2MubV9lbGRTcGVjaWZpY0NvbmZpZy5tX3NickNyY0ZsYWcpID8gQUNfU0JSQ1JDIDogMDsKKyAgICBzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gfD0KKyAgICAgICAgKGFzYy0+bV9zYy5tX2VsZFNwZWNpZmljQ29uZmlnLm1fdXNlTGRRbWZUaW1lQWxpZ24pID8gQUNfTVBTX1BSRVNFTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICBpZiAoc2VsZi0+bXBzQXBwbGljYWJsZSkgeworICAgICAgc2VsZi0+bXBzRW5hYmxlQ3VyciA9IGFzYy0+bV9zYy5tX2VsZFNwZWNpZmljQ29uZmlnLm1fdXNlTGRRbWZUaW1lQWxpZ247CisgICAgfQorICB9CisgIHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSB8PSAoYXNjLT5tX2FvdCA9PSBBT1RfRVJfQUFDX0xEKSA/IEFDX0xEIDogMDsKKyAgc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdIHw9IChhc2MtPm1fZXBDb25maWcgPj0gMCkgPyBBQ19FUiA6IDA7CisKKyAgaWYgKGFzYy0+bV9hb3QgPT0gQU9UX1VTQUMpIHsKKyAgICBzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gfD0gQUNfVVNBQzsKKyAgICBzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gfD0KKyAgICAgICAgKGFzYy0+bV9zYy5tX3VzYWNDb25maWcuZWxlbWVudFswXS5tX3N0ZXJlb0NvbmZpZ0luZGV4ID4gMCkKKyAgICAgICAgICAgID8gQUNfTVBTX1BSRVNFTlQKKyAgICAgICAgICAgIDogMDsKKyAgfQorICBpZiAoYXNjLT5tX2FvdCA9PSBBT1RfRFJNX0FBQykgeworICAgIHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSB8PSBBQ19EUk0gfCBBQ19TQlJDUkMgfCBBQ19TQ0FMQUJMRTsKKyAgfQorICBpZiAoYXNjLT5tX2FvdCA9PSBBT1RfRFJNX1NVUlJPVU5EKSB7CisgICAgc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdIHw9CisgICAgICAgIEFDX0RSTSB8IEFDX1NCUkNSQyB8IEFDX1NDQUxBQkxFIHwgQUNfTVBTX1BSRVNFTlQ7CisgICAgRkRLX0FTU0VSVCghYXNjLT5tX3BzUHJlc2VudEZsYWcpOworICB9CisgIGlmICgoYXNjLT5tX2FvdCA9PSBBT1RfQUFDX1NDQUwpIHx8IChhc2MtPm1fYW90ID09IEFPVF9FUl9BQUNfU0NBTCkpIHsKKyAgICBzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gfD0gQUNfU0NBTEFCTEU7CisgIH0KKworICBpZiAoKGFzYy0+bV9lcENvbmZpZyA+PSAwKSAmJiAoYXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uIDw9IDApKSB7CisgICAgLyogd2UgaGF2ZSB0byBrbm93IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgb3RoZXJ3aXNlIG5vIGRlY29kaW5nIGlzIHBvc3NpYmxlCisgICAgICovCiAgICAgcmV0dXJuIEFBQ19ERUNfVU5TVVBQT1JURURfRVJfRk9STUFUOwogICB9CiAKICAgc2VsZi0+c3RyZWFtSW5mby5lcENvbmZpZyA9IGFzYy0+bV9lcENvbmZpZzsKICAgLyogc2VsZi0+aElucHV0LT5hc2MubV9lcENvbmZpZyA9IGFzYy0+bV9lcENvbmZpZzsgKi8KIAotICBpZiAoYXNjLT5tX2VwQ29uZmlnID4gMSkKLSAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9FUl9GT1JNQVQ7CisgIGlmIChhc2MtPm1fZXBDb25maWcgPiAxKSByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9FUl9GT1JNQVQ7CiAKICAgLyogQ2hlY2sgaWYgc2FtcGxlcmF0ZSBjaGFuZ2VkLiAqLwotICBpZiAoc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVSYXRlICE9IChJTlQpYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5KSB7CisgIGlmICgoc2VsZi0+c2FtcGxpbmdSYXRlSW5mb1tzdHJlYW1JbmRleF0uc2FtcGxpbmdSYXRlICE9CisgICAgICAgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5KSB8fAorICAgICAgKHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lICE9CisgICAgICAgKElOVClhc2MtPm1fc2FtcGxlc1BlckZyYW1lIC8gZG93bnNjYWxlRmFjdG9yKSkgewogICAgIEFBQ19ERUNPREVSX0VSUk9SIGVycm9yOwogCiAgICAgYXNjQ2hhbmdlZCA9IDE7CiAKLSAgICAvKiBVcGRhdGUgc2FtcGxlcmF0ZSBpbmZvLiAqLwotICAgIGVycm9yID0gZ2V0U2FtcGxpbmdSYXRlSW5mbygmc2VsZi0+c2FtcGxpbmdSYXRlSW5mbywgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSwgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5SW5kZXgsIGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0gICAgaWYgKGVycm9yICE9IEFBQ19ERUNfT0spIHsKLSAgICAgIHJldHVybiBlcnJvcjsKKyAgICBpZiAoY29uZmlnTW9kZSAmIEFDX0NNX0FMTE9DX01FTSkgeworICAgICAgLyogVXBkYXRlIHNhbXBsZXJhdGUgaW5mby4gKi8KKyAgICAgIGVycm9yID0gZ2V0U2FtcGxpbmdSYXRlSW5mbygKKyAgICAgICAgICAmc2VsZi0+c2FtcGxpbmdSYXRlSW5mb1tzdHJlYW1JbmRleF0sIGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5SW5kZXgsIGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSk7CisgICAgICBpZiAoZXJyb3IgIT0gQUFDX0RFQ19PSykgeworICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICB9CisgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGUgPQorICAgICAgICAgIHNlbGYtPnNhbXBsaW5nUmF0ZUluZm9bMF0uc2FtcGxpbmdSYXRlIC8gc2VsZi0+ZG93bnNjYWxlRmFjdG9yOworICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgPQorICAgICAgICAgIGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUgLyBzZWxmLT5kb3duc2NhbGVGYWN0b3I7CiAgICAgfQotICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSA9IHNlbGYtPnNhbXBsaW5nUmF0ZUluZm8uc2FtcGxpbmdSYXRlOwogICB9CiAKICAgLyogQ2hlY2sgaWYgYW1vdW50IG9mIGNoYW5uZWxzIGhhcyBjaGFuZ2VkLiAqLwotICBpZiAoc2VsZi0+YXNjQ2hhbm5lbHMgIT0gYXNjQ2hhbm5lbHMpCi0gIHsKLSAgICAgYXNjQ2hhbmdlZCA9IDE7CisgIGlmIChzZWxmLT5hc2NDaGFubmVsc1tzdHJlYW1JbmRleF0gIT0gYXNjQ2hhbm5lbHMpIHsKKyAgICBhc2NDaGFuZ2VkID0gMTsKKyAgfQogCi0gICAgIC8qIEFsbG9jYXRlIGFsbCBtZW1vcnkgc3RydWN0dXJlcyBmb3IgZWFjaCBjaGFubmVsICovCi0gICAgIHsKLSAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBhc2NDaGFubmVsczsgY2grKykgewotICAgICAgICAgQ0FhY0RlY29kZXJEeW5hbWljRGF0YSAqYWFjRGVjb2RlckR5bmFtaWNEYXRhID0gJnNlbGYtPmFhY0NvbW1vbkRhdGEud29ya0J1ZmZlckNvcmUxLT5wQWFjRGVjb2RlckR5bmFtaWNEYXRhW2NoJTJdOworICAvKiBkZXRlY3QgY29uZmlnIGNoYW5nZSAqLworICBpZiAoY29uZmlnTW9kZSAmIEFDX0NNX0RFVF9DRkdfQ0hBTkdFKSB7CisgICAgaWYgKGFzY0NoYW5nZWQgIT0gMCkgeworICAgICAgKmNvbmZpZ0NoYW5nZWQgPSAxOworICAgIH0KKyAgICByZXR1cm4gZXJyOworICB9CiAKLSAgICAgICAgIC8qIGluaXRpYWxpemUgcG9pbnRlciB0byBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICovCi0gICAgICAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0gPT0gTlVMTCkgewotICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSA9IEdldEFhY0RlY29kZXJDaGFubmVsSW5mbyhjaCk7Ci0gICAgICAgICAgIC8qIFRoaXMgaXMgdGVtcG9yYXJ5IHVudGlsIHRoZSBEeW5hbWljRGF0YSBpcyBzcGxpdCBpbnRvIHR3byBvciBtb3JlIHJlZ2lvbnMhCi0gICAgICAgICAgICAgIFRoZSBtZW1vcnkgY291bGQgYmUgcmV1c2VkIGFmdGVyIGNvbXBsZXRlZCBjb3JlIGRlY29kaW5nLiAqLwotICAgICAgICAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0gPT0gTlVMTCkgewotICAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgICAgfQotICAgICAgICAgICAvKiBIb29rIHNoYXJlZCB3b3JrIG1lbW9yeSBpbnRvIGNoYW5uZWwgZGF0YSBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBEeW5EYXRhID0gIGFhY0RlY29kZXJEeW5hbWljRGF0YTsKLSAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBDb21EYXRhID0gJnNlbGYtPmFhY0NvbW1vbkRhdGE7Ci0gICAgICAgICB9CisgIC8qIHNldCBBQ19VU0FDX1NDRkdJMyBnbG9iYWxseSBpZiBhbnkgdXNhYyBlbGVtZW50IHVzZXMgKi8KKyAgc3dpdGNoIChhc2MtPm1fYW90KSB7CisgICAgY2FzZSBBT1RfVVNBQzoKKyAgICAgIGlmIChzZWxmLT5zYnJFbmFibGVkKSB7CisgICAgICAgIGZvciAoaW50IF9lbCA9IDA7CisgICAgICAgICAgICAgX2VsIDwgKGludClzZWxmLT5wVXNhY0NvbmZpZ1tzdHJlYW1JbmRleF0tPm1fdXNhY051bUVsZW1lbnRzOworICAgICAgICAgICAgIF9lbCsrKSB7CisgICAgICAgICAgaW50IGVsID0gZWxlbWVudE9mZnNldCArIF9lbDsKKyAgICAgICAgICBpZiAoSVNfVVNBQ19DSEFOTkVMX0VMRU1FTlQoc2VsZi0+ZWxlbWVudHNbZWxdKSkgeworICAgICAgICAgICAgaWYgKHVzYWNTdGVyZW9Db25maWdJbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgdXNhY1N0ZXJlb0NvbmZpZ0luZGV4ID0gc2VsZi0+dXNhY1N0ZXJlb0NvbmZpZ0luZGV4W2VsXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGlmICgodXNhY1N0ZXJlb0NvbmZpZ0luZGV4ICE9IHNlbGYtPnVzYWNTdGVyZW9Db25maWdJbmRleFtlbF0pIHx8CisgICAgICAgICAgICAgICAgICAoc2VsZi0+dXNhY1N0ZXJlb0NvbmZpZ0luZGV4W2VsXSA+IDApKSB7CisgICAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CiAKLSAgICAgICAgIC8qIEFsbG9jYXRlIHBlcnNpc3RlbnQgY2hhbm5lbCBtZW1vcnkgKi8KLSAgICAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdID0gR2V0QWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvKGNoKTsKLSAgICAgICAgICAgaWYgKHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdID09IE5VTEwpIHsKLSAgICAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPnBPdmVybGFwQnVmZmVyID0gR2V0T3ZlcmxhcEJ1ZmZlcihjaCk7IC8qIFRoaXMgYXJlYSBzaXplIGRlcGVuZHMgb24gdGhlIEFPVCAqLwotICAgICAgICAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPnBPdmVybGFwQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBTcGVjdHJhbENvZWZmaWNpZW50ID0gKFNQRUNUUkFMX1BUUikgJnNlbGYtPmFhY0NvbW1vbkRhdGEud29ya0J1ZmZlckNvcmUyW2NoKjEwMjRdOworICAgICAgICBpZiAodXNhY1N0ZXJlb0NvbmZpZ0luZGV4IDwgMCkgeworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQogCi0gICAgICAgICB9Ci0gICAgICAgICBDUG5zX0luaXRQbnMoJnNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5kYXRhLmFhYy5QbnNEYXRhLCAmc2VsZi0+YWFjQ29tbW9uRGF0YS5wbnNJbnRlckNoYW5uZWxEYXRhLCAmc2VsZi0+YWFjQ29tbW9uRGF0YS5wbnNDdXJyZW50U2VlZCwgc2VsZi0+YWFjQ29tbW9uRGF0YS5wbnNSYW5kb21TZWVkKTsKLSAgICAgICB9CisgICAgICAgIGlmICh1c2FjU3RlcmVvQ29uZmlnSW5kZXggPT0gMykgeworICAgICAgICAgIHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSB8PSBBQ19VU0FDX1NDRkdJMzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CiAKLSAgICAgICBpZiAoYXNjQ2hhbm5lbHMgPiBzZWxmLT5hYWNDaGFubmVscykKLSAgICAgICB7Ci0gICAgICAgICAvKiBNYWtlIGFsbG9jYXRlZCBjaGFubmVsIGNvdW50IHBlcnNpc3RlbnQgaW4gZGVjb2RlciBjb250ZXh0LiAqLwotICAgICAgICAgc2VsZi0+YWFjQ2hhbm5lbHMgPSBhc2NDaGFubmVsczsKLSAgICAgICB9CisgIGlmICgqY29uZmlnQ2hhbmdlZCkgeworICAgIC8qIFNldCB1cCBRTUYgZG9tYWluIGZvciBBT1RzIHdpdGggZXhwbGljaXQgc2lnbmFsbGluZyBvZiBTQlIgYW5kIG9yIE1QUy4KKyAgICAgICBUaGlzIGlzIHRvIGJlIGFibGUgdG8gcGxheSBvdXQgdGhlIGZpcnN0IGZyYW1lIGFsd2F5IHdpdGggdGhlIGNvcnJlY3QKKyAgICAgICBmcmFtZSBzaXplIGFuZCBzYW1wbGluZyByYXRlIGV2ZW4gaW4gY2FzZSBvZiBjb25jZWFsbWVudC4KKyAgICAqLworICAgIHN3aXRjaCAoYXNjLT5tX2FvdCkgeworICAgICAgY2FzZSBBT1RfVVNBQzoKKyAgICAgICAgaWYgKHNlbGYtPnNickVuYWJsZWQpIHsKKyAgICAgICAgICBjb25zdCBVQ0hBUiBtYXBfc2JyUmF0aW9fMl9uQW5hQmFuZHNbXSA9IHsxNiwgMjQsIDMyfTsKIAotICAgICAgIEhjckluaXRSb20oJnNlbGYtPmFhY0NvbW1vbkRhdGEub3ZlcmxheS5hYWMuZXJIY3JJbmZvKTsKLSAgICAgICBzZXRIY3JUeXBlKCZzZWxmLT5hYWNDb21tb25EYXRhLm92ZXJsYXkuYWFjLmVySGNySW5mbywgSURfU0NFKTsKKyAgICAgICAgICBGREtfQVNTRVJUKGFzYy0+bV9zYy5tX3VzYWNDb25maWcubV9zYnJSYXRpb0luZGV4ID4gMCk7CisgICAgICAgICAgRkRLX0FTU0VSVChzdHJlYW1JbmRleCA9PSAwKTsKKworICAgICAgICAgIHNlbGYtPnFtZkRvbWFpbi5nbG9iYWxDb25mLm5JbnB1dENoYW5uZWxzX3JlcXVlc3RlZCA9IGFzY0NoYW5uZWxzOworICAgICAgICAgIHNlbGYtPnFtZkRvbWFpbi5nbG9iYWxDb25mLm5PdXRwdXRDaGFubmVsc19yZXF1ZXN0ZWQgPQorICAgICAgICAgICAgICAodXNhY1N0ZXJlb0NvbmZpZ0luZGV4ID09IDEpID8gMiA6IGFzY0NoYW5uZWxzOworICAgICAgICAgIHNlbGYtPnFtZkRvbWFpbi5nbG9iYWxDb25mLmZsYWdzX3JlcXVlc3RlZCA9IDA7CisgICAgICAgICAgc2VsZi0+cW1mRG9tYWluLmdsb2JhbENvbmYubkJhbmRzQW5hbHlzaXNfcmVxdWVzdGVkID0KKyAgICAgICAgICAgICAgbWFwX3NiclJhdGlvXzJfbkFuYUJhbmRzW2FzYy0+bV9zYy5tX3VzYWNDb25maWcubV9zYnJSYXRpb0luZGV4IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFdOworICAgICAgICAgIHNlbGYtPnFtZkRvbWFpbi5nbG9iYWxDb25mLm5CYW5kc1N5bnRoZXNpc19yZXF1ZXN0ZWQgPSA2NDsKKyAgICAgICAgICBzZWxmLT5xbWZEb21haW4uZ2xvYmFsQ29uZi5uUW1mVGltZVNsb3RzX3JlcXVlc3RlZCA9CisgICAgICAgICAgICAgIChhc2MtPm1fc2MubV91c2FjQ29uZmlnLm1fc2JyUmF0aW9JbmRleCA9PSAxKSA/IDY0IDogMzI7CisgICAgICAgICAgc2VsZi0+cW1mRG9tYWluLmdsb2JhbENvbmYublFtZk92VGltZVNsb3RzX3JlcXVlc3RlZCA9CisgICAgICAgICAgICAgIChhc2MtPm1fc2MubV91c2FjQ29uZmlnLm1fc2JyUmF0aW9JbmRleCA9PSAxKSA/IDEyIDogNjsKKyAgICAgICAgICBzZWxmLT5xbWZEb21haW4uZ2xvYmFsQ29uZi5uUW1mUHJvY0JhbmRzX3JlcXVlc3RlZCA9IDY0OworICAgICAgICAgIHNlbGYtPnFtZkRvbWFpbi5nbG9iYWxDb25mLm5RbWZQcm9jQ2hhbm5lbHNfcmVxdWVzdGVkID0gMTsKKyAgICAgICAgICBzZWxmLT5xbWZEb21haW4uZ2xvYmFsQ29uZi5wYXJrQ2hhbm5lbCA9CisgICAgICAgICAgICAgICh1c2FjU3RlcmVvQ29uZmlnSW5kZXggPT0gMykgPyAxIDogMDsKKyAgICAgICAgICBzZWxmLT5xbWZEb21haW4uZ2xvYmFsQ29uZi5wYXJrQ2hhbm5lbF9yZXF1ZXN0ZWQgPQorICAgICAgICAgICAgICAodXNhY1N0ZXJlb0NvbmZpZ0luZGV4ID09IDMpID8gMSA6IDA7CisgICAgICAgICAgc2VsZi0+cW1mRG9tYWluLmdsb2JhbENvbmYucW1mRG9tYWluRXhwbGljaXRDb25maWcgPSAxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKKyAgICAgICAgaWYgKHNlbGYtPm1wc0VuYWJsZUN1cnIgJiYKKyAgICAgICAgICAgIGFzYy0+bV9zYy5tX2VsZFNwZWNpZmljQ29uZmlnLm1fdXNlTGRRbWZUaW1lQWxpZ24pIHsKKyAgICAgICAgICBTQUNfSU5QVVRfQ09ORklHIHNhY19pbnRlcmZhY2UgPQorICAgICAgICAgICAgICAoc2VsZi0+c2JyRW5hYmxlZCAmJiBzZWxmLT5oU2JyRGVjb2RlcikgPyBTQUNfSU5URVJGQUNFX1FNRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTQUNfSU5URVJGQUNFX1RJTUU7CisgICAgICAgICAgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9Db25maWd1cmVRbWZEb21haW4oCisgICAgICAgICAgICAgIChDTXBlZ1N1cnJvdW5kRGVjb2RlciAqKXNlbGYtPnBNcGVnU3Vycm91bmREZWNvZGVyLCBzYWNfaW50ZXJmYWNlLAorICAgICAgICAgICAgICAoVUlOVClzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGUsIGFzYy0+bV9hb3QpOworICAgICAgICAgIHNlbGYtPnFtZkRvbWFpbi5nbG9iYWxDb25mLnFtZkRvbWFpbkV4cGxpY2l0Q29uZmlnID0gMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHNlbGYtPnFtZkRvbWFpbi5nbG9iYWxDb25mLnFtZkRvbWFpbkV4cGxpY2l0Q29uZmlnID0KKyAgICAgICAgICAgIDA7IC8qIHFtZkRvbWFpbiBpcyBpbml0aWFsaXplZCBieSBTQlIgYW5kIE1QUyBpbml0IGZ1bmN0aW9ucyBpZgorICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgYWxsIG1lbW9yeSBzdHJ1Y3R1cmVzIGZvciBlYWNoIGNoYW5uZWwgKi8KKyAgICB7CisgICAgICBpbnQgY2ggPSBhYWNDaGFubmVsc09mZnNldDsKKyAgICAgIGZvciAoaW50IF9jaCA9IDA7IF9jaCA8IGFzY0NoYW5uZWxzOyBfY2grKykgeworICAgICAgICBpZiAoY2ggPj0gKDgpKSB7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdID0gR2V0QWFjRGVjb2RlckNoYW5uZWxJbmZvKGNoKTsKKyAgICAgICAgLyogVGhpcyBpcyB0ZW1wb3JhcnkgdW50aWwgdGhlIER5bmFtaWNEYXRhIGlzIHNwbGl0IGludG8gdHdvIG9yIG1vcmUKKyAgICAgICAgICAgcmVnaW9ucyEgVGhlIG1lbW9yeSBjb3VsZCBiZSByZXVzZWQgYWZ0ZXIgY29tcGxldGVkIGNvcmUgZGVjb2RpbmcuICovCisgICAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSA9PSBOVUxMKSB7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICAgIGNoKys7CisgICAgICB9CisKKyAgICAgIGludCBjaElkeCA9IGFhY0NoYW5uZWxzT2Zmc2V0SWR4OworICAgICAgY2ggPSBhYWNDaGFubmVsc09mZnNldDsKKyAgICAgIGludCBfbnVtRWxlbWVudHM7CisgICAgICBfbnVtRWxlbWVudHMgPSAoKCg4KSkgKyAoOCkpOworICAgICAgaWYgKHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSAmIChBQ19SU1Y2MDNEQSB8IEFDX1VTQUMpKSB7CisgICAgICAgIF9udW1FbGVtZW50cyA9IChpbnQpYXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5tX3VzYWNOdW1FbGVtZW50czsKKyAgICAgIH0KKyAgICAgIGlmIChzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gJiAoQUNfRVIgfCBBQ19MRCB8IEFDX0VMRCkpIHsKKyAgICAgICAgX251bUVsZW1lbnRzID0gKGFzYy0+bV9jaGFubmVsQ29uZmlndXJhdGlvbiA9PSA3KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPyA4CisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFzYy0+bV9jaGFubmVsQ29uZmlndXJhdGlvbjsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IF9lbCA9IDA7IF9lbCA8IF9udW1FbGVtZW50czsgX2VsKyspIHsKKyAgICAgICAgaW50IGVsX2NoYW5uZWxzID0gMDsKKyAgICAgICAgaW50IGVsID0gZWxlbWVudE9mZnNldCArIF9lbDsKKworICAgICAgICBpZiAoc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdICYKKyAgICAgICAgICAgIChBQ19FTEQgfCBBQ19SU1Y2MDNEQSB8IEFDX1VTQUMgfCBBQ19SU1ZENTApKSB7CisgICAgICAgICAgaWYgKGNoID49IGFzY0NoYW5uZWxzKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHNlbGYtPmVsZW1lbnRzW2VsXSkgeworICAgICAgICAgIGNhc2UgSURfU0NFOgorICAgICAgICAgIGNhc2UgSURfQ1BFOgorICAgICAgICAgIGNhc2UgSURfTEZFOgorICAgICAgICAgIGNhc2UgSURfVVNBQ19TQ0U6CisgICAgICAgICAgY2FzZSBJRF9VU0FDX0NQRToKKyAgICAgICAgICBjYXNlIElEX1VTQUNfTEZFOgorCisgICAgICAgICAgICBlbF9jaGFubmVscyA9IENBYWNEZWNvZGVyX0dldEVMQ2hhbm5lbHMoCisgICAgICAgICAgICAgICAgc2VsZi0+ZWxlbWVudHNbZWxdLCBzZWxmLT51c2FjU3RlcmVvQ29uZmlnSW5kZXhbZWxdKTsKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cENvbVN0YXRpY0RhdGEgPQorICAgICAgICAgICAgICAgICAgKENBYWNEZWNvZGVyQ29tbW9uU3RhdGljRGF0YSAqKUZES2NhbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAxLCBzaXplb2YoQ0FhY0RlY29kZXJDb21tb25TdGF0aWNEYXRhKSk7CisgICAgICAgICAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cENvbVN0YXRpY0RhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoY2ggPT0gYWFjQ2hhbm5lbHNPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cENvbURhdGEgPQorICAgICAgICAgICAgICAgICAgICAoQ0FhY0RlY29kZXJDb21tb25EYXRhICopR2V0V29ya0J1ZmZlckNvcmU2KCk7CisgICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0KKyAgICAgICAgICAgICAgICAgICAgLT5wQ29tU3RhdGljRGF0YS0+cFdvcmtCdWZmZXJDb3JlMSA9IEdldFdvcmtCdWZmZXJDb3JlMSgpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wQ29tRGF0YSA9CisgICAgICAgICAgICAgICAgICAgIChDQWFjRGVjb2RlckNvbW1vbkRhdGEgKilGREthYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ0FhY0RlY29kZXJDb21tb25EYXRhKSwgQUxJR05NRU5UX0RFRkFVTFQpOworICAgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdCisgICAgICAgICAgICAgICAgICAgIC0+cENvbVN0YXRpY0RhdGEtPnBXb3JrQnVmZmVyQ29yZTEgPQorICAgICAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2FhY0NoYW5uZWxzT2Zmc2V0XQorICAgICAgICAgICAgICAgICAgICAgICAgLT5wQ29tU3RhdGljRGF0YS0+cFdvcmtCdWZmZXJDb3JlMTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoKHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wQ29tRGF0YSA9PSBOVUxMKSB8fAorICAgICAgICAgICAgICAgICAgKHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdCisgICAgICAgICAgICAgICAgICAgICAgIC0+cENvbVN0YXRpY0RhdGEtPnBXb3JrQnVmZmVyQ29yZTEgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBEeW5EYXRhID0KKyAgICAgICAgICAgICAgICAgICYoc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0KKyAgICAgICAgICAgICAgICAgICAgICAgIC0+cENvbURhdGEtPnBBYWNEZWNvZGVyRHluYW1pY0RhdGFbMF0pOworICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cFNwZWN0cmFsQ29lZmZpY2llbnQgPQorICAgICAgICAgICAgICAgICAgKFNQRUNUUkFMX1BUUikmc2VsZi0+d29ya0J1ZmZlckNvcmUyW2NoICogMTAyNF07CisKKyAgICAgICAgICAgICAgaWYgKGVsX2NoYW5uZWxzID09IDIpIHsKKyAgICAgICAgICAgICAgICBGREtfQVNTRVJUKGNoIDwgKDgpIC0gMSk7CisgICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaCArIDFdLT5wQ29tRGF0YSA9CisgICAgICAgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wQ29tRGF0YTsKKyAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoICsgMV0tPnBDb21TdGF0aWNEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBDb21TdGF0aWNEYXRhOworICAgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2ggKyAxXQorICAgICAgICAgICAgICAgICAgICAtPnBDb21TdGF0aWNEYXRhLT5wV29ya0J1ZmZlckNvcmUxID0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0KKyAgICAgICAgICAgICAgICAgICAgICAgIC0+cENvbVN0YXRpY0RhdGEtPnBXb3JrQnVmZmVyQ29yZTE7CisgICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaCArIDFdLT5wRHluRGF0YSA9CisgICAgICAgICAgICAgICAgICAgICYoc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLT5wQ29tRGF0YS0+cEFhY0RlY29kZXJEeW5hbWljRGF0YVsxXSk7CisgICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaCArIDFdLT5wU3BlY3RyYWxDb2VmZmljaWVudCA9CisgICAgICAgICAgICAgICAgICAgIChTUEVDVFJBTF9QVFIpJnNlbGYtPndvcmtCdWZmZXJDb3JlMlsoY2ggKyAxKSAqIDEwMjRdOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY2ggKz0gZWxfY2hhbm5lbHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaElkeCArPSBlbF9jaGFubmVsczsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYtPmVsZW1lbnRzW2VsXSA9PSBJRF9FTkQpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGVsKys7CisgICAgICB9CisKKyAgICAgIGNoSWR4ID0gYWFjQ2hhbm5lbHNPZmZzZXRJZHg7CisgICAgICBjaCA9IGFhY0NoYW5uZWxzT2Zmc2V0OworICAgICAgZm9yIChpbnQgX2NoID0gMDsgX2NoIDwgYXNjQ2hhbm5lbHM7IF9jaCsrKSB7CisgICAgICAgIC8qIEFsbG9jYXRlIHBlcnNpc3RlbnQgY2hhbm5lbCBtZW1vcnkgKi8KKyAgICAgICAgeworICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdID0KKyAgICAgICAgICAgICAgR2V0QWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvKGNoKTsKKyAgICAgICAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0gPT0gTlVMTCkgeworICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgIH0KKyAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+cE92ZXJsYXBCdWZmZXIgPQorICAgICAgICAgICAgICBHZXRPdmVybGFwQnVmZmVyKGNoKTsgLyogVGhpcyBhcmVhIHNpemUgZGVwZW5kcyBvbiB0aGUgQU9UICovCisgICAgICAgICAgaWYgKHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5wT3ZlcmxhcEJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gJgorICAgICAgICAgICAgICAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBIC8qfEFDX0JTQUMqLykpIHsKKyAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5oQXJDbyA9IENBcmNvX0NyZWF0ZSgpOworICAgICAgICAgICAgaWYgKHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5oQXJDbyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIShzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gJiAoQUNfVVNBQyB8IEFDX1JTVjYwM0RBKSkpIHsKKyAgICAgICAgICAgIENQbnNfVXBkYXRlTm9pc2VTdGF0ZSgKKyAgICAgICAgICAgICAgICAmc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmRhdGEuYWFjLlBuc0RhdGEsCisgICAgICAgICAgICAgICAgJnNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5wbnNDdXJyZW50U2VlZCwKKyAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cENvbURhdGEtPnBuc1JhbmRvbVNlZWQpOworICAgICAgICAgIH0KKyAgICAgICAgICBjaCsrOworICAgICAgICB9CisgICAgICAgIGNoSWR4Kys7CisgICAgICB9CisKKyAgICAgIGlmIChzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gJiBBQ19VU0FDKSB7CisgICAgICAgIGZvciAoaW50IF9jaCA9IDA7IF9jaCA8IGZsdXNoQ2hhbm5lbHM7IF9jaCsrKSB7CisgICAgICAgICAgY2ggPSBhYWNDaGFubmVsc09mZnNldCArIF9jaDsKKyAgICAgICAgICBpZiAoc2VsZi0+cFRpbWVEYXRhRmx1c2hbY2hdID09IE5VTEwpIHsKKyAgICAgICAgICAgIHNlbGYtPnBUaW1lRGF0YUZsdXNoW2NoXSA9IEdldFRpbWVEYXRhRmx1c2goY2gpOworICAgICAgICAgICAgaWYgKHNlbGYtPnBUaW1lRGF0YUZsdXNoW2NoXSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSAmIChBQ19VU0FDIHwgQUNfUlNWNjAzREEpKSB7CisgICAgICAgIGludCBjb21wbGV4U3RlcmVvUHJlZFBvc3NpYmxlID0gMDsKKyAgICAgICAgY2ggPSBhYWNDaGFubmVsc09mZnNldDsKKyAgICAgICAgY2hJZHggPSBhYWNDaGFubmVsc09mZnNldElkeDsKKyAgICAgICAgZm9yIChpbnQgX2VsMiA9IDA7IF9lbDIgPCAoaW50KWFzYy0+bV9zYy5tX3VzYWNDb25maWcubV91c2FjTnVtRWxlbWVudHM7CisgICAgICAgICAgICAgX2VsMisrKSB7CisgICAgICAgICAgaW50IGVsMiA9IGVsZW1lbnRPZmZzZXQgKyBfZWwyOworICAgICAgICAgIGludCBlbENoID0gMCwgY2gyOworCisgICAgICAgICAgaWYgKChzZWxmLT5lbGVtZW50c1tlbDJdID09IElEX1VTQUNfQ1BFKSAmJgorICAgICAgICAgICAgICAhKHNlbGYtPnVzYWNTdGVyZW9Db25maWdJbmRleFtlbDJdID09IDEpKSB7CisgICAgICAgICAgICBlbENoID0gMjsKKyAgICAgICAgICB9IGVsc2UgaWYgKElTX0NIQU5ORUxfRUxFTUVOVChzZWxmLT5lbGVtZW50c1tlbDJdKSkgeworICAgICAgICAgICAgZWxDaCA9IDE7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHNlbGYtPmVsRmxhZ3NbZWwyXSAmIEFDX0VMX1VTQUNfQ1BfUE9TU0lCTEUpIHsKKyAgICAgICAgICAgIGNvbXBsZXhTdGVyZW9QcmVkUG9zc2libGUgPSAxOworICAgICAgICAgICAgaWYgKHNlbGYtPmNwZVN0YXRpY0RhdGFbZWwyXSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgIHNlbGYtPmNwZVN0YXRpY0RhdGFbZWwyXSA9IEdldENwZVBlcnNpc3RlbnREYXRhKCk7CisgICAgICAgICAgICAgIGlmIChzZWxmLT5jcGVTdGF0aWNEYXRhW2VsMl0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGZvciAoY2gyID0gMDsgY2gyIDwgZWxDaDsgY2gyKyspIHsKKyAgICAgICAgICAgIC8qIEhvb2sgZWxlbWVudCBzcGVjaWZpYyBjcGVTdGF0aWNEYXRhIGludG8gY2hhbm5lbCBzcGVjaWZpYworICAgICAgICAgICAgICogYWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICovCisgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+cENwZVN0YXRpY0RhdGEgPQorICAgICAgICAgICAgICAgIHNlbGYtPmNwZVN0YXRpY0RhdGFbZWwyXTsKKyAgICAgICAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+cENwZVN0YXRpY0RhdGEgIT0KKyAgICAgICAgICAgICAgICBOVUxMKSB7CisgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdCisgICAgICAgICAgICAgICAgICAtPnBDcGVTdGF0aWNEYXRhLT5qb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhCisgICAgICAgICAgICAgICAgICAuc3BlY3RyYWxDb2VmZnNbY2gyXSA9CisgICAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXQorICAgICAgICAgICAgICAgICAgICAgIC0+Y29uY2VhbG1lbnRJbmZvLnNwZWN0cmFsQ29lZmZpY2llbnQ7CisgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdCisgICAgICAgICAgICAgICAgICAtPnBDcGVTdGF0aWNEYXRhLT5qb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLnNwZWNTY2FsZVtjaDJdID0KKyAgICAgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdCisgICAgICAgICAgICAgICAgICAgICAgLT5jb25jZWFsbWVudEluZm8uc3BlY1NjYWxlOworICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXQorICAgICAgICAgICAgICAgICAgLT5wQ3BlU3RhdGljRGF0YS0+am9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS5zY3JhdGNoQnVmZmVyID0KKyAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCAqKXNlbGYtPnBUaW1lRGF0YTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaElkeCsrOworICAgICAgICAgICAgY2grKzsKKyAgICAgICAgICB9IC8qIGZvciBlYWNoIGNoYW5uZWwgaW4gY3VycmVudCBlbGVtZW50ICovCisgICAgICAgICAgaWYgKGNvbXBsZXhTdGVyZW9QcmVkUG9zc2libGUgJiYgKGVsQ2ggPT0gMikpIHsKKyAgICAgICAgICAgIC8qIG5lZWRlZCBvbmNlIGZvciBhbGwgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGlmIChzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoIC0gMV0KKyAgICAgICAgICAgICAgICAgICAgLT5wQ29tU3RhdGljRGF0YS0+Y3BseFByZWRpY3Rpb25EYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaCAtIDFdCisgICAgICAgICAgICAgICAgICAtPnBDb21TdGF0aWNEYXRhLT5jcGx4UHJlZGljdGlvbkRhdGEgPQorICAgICAgICAgICAgICAgICAgR2V0Q3BseFByZWRpY3Rpb25EYXRhKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaCAtIDFdCisgICAgICAgICAgICAgICAgICAgIC0+cENvbVN0YXRpY0RhdGEtPmNwbHhQcmVkaWN0aW9uRGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGVsQ2ggPiAwKSB7CisgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoIC0gZWxDaF0tPm5mUmFuZG9tU2VlZCA9CisgICAgICAgICAgICAgICAgKFVMT05HKTB4MzAzOTsKKyAgICAgICAgICAgIGlmIChzZWxmLT5lbGVtZW50c1tlbDJdID09IElEX1VTQUNfQ1BFKSB7CisgICAgICAgICAgICAgIGlmIChhc2MtPm1fc2MubV91c2FjQ29uZmlnLmVsZW1lbnRbZWwyXS5tX3N0ZXJlb0NvbmZpZ0luZGV4ICE9CisgICAgICAgICAgICAgICAgICAxKSB7CisgICAgICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaCAtIGVsQ2ggKyAxXQorICAgICAgICAgICAgICAgICAgICAtPm5mUmFuZG9tU2VlZCA9IChVTE9ORykweDEwOTMyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IC8qIGZvciBlYWNoIGVsZW1lbnQgKi8KKyAgICAgIH0KKworICAgICAgaWYgKGFzY0NoYW5uZWxzICE9IHNlbGYtPmFhY0NoYW5uZWxzKSB7CisgICAgICAgIC8qIE1ha2UgYWxsb2NhdGVkIGNoYW5uZWwgY291bnQgcGVyc2lzdGVudCBpbiBkZWNvZGVyIGNvbnRleHQuICovCisgICAgICAgIHNlbGYtPmFhY0NoYW5uZWxzID0gYWFjQ2hhbm5lbHNPZmZzZXQgKyBjaDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodXNhY1Jlc2lkdWFsRGVsYXlDb21wU2FtcGxlcykgeworICAgICAgSU5UIGRlbGF5RXJyID0gRkRLX0RlbGF5X0NyZWF0ZSgmc2VsZi0+dXNhY1Jlc2lkdWFsRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVU0hPUlQpdXNhY1Jlc2lkdWFsRGVsYXlDb21wU2FtcGxlcywgMSk7CisgICAgICBpZiAoZGVsYXlFcnIpIHsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQogICAgIH0KIAogICAgIC8qIE1ha2UgYW1vdW50IG9mIHNpZ25hbGxlZCBjaGFubmVscyBwZXJzaXN0ZW50IGluIGRlY29kZXIgY29udGV4dC4gKi8KLSAgICBzZWxmLT5hc2NDaGFubmVscyA9IGFzY0NoYW5uZWxzOworICAgIHNlbGYtPmFzY0NoYW5uZWxzW3N0cmVhbUluZGV4XSA9IGFzY0NoYW5uZWxzOworICAgIC8qIEluaXQgdGhlIHByZXZpb3VzIGNoYW5uZWwgY291bnQgdmFsdWVzLiBUaGlzIGlzIHJlcXVpcmVkIHRvIGF2b2lkIGEKKyAgICAgICBtaXNtYXRjaCBvZiBtZW1vcnkgYWNjZXNzZXMgaW4gdGhlIGVycm9yIGNvbmNlYWxtZW50IG1vZHVsZSBhbmQgdGhlCisgICAgICAgYWxsb2NhdGVkIGNoYW5uZWwgc3RydWN0dXJlcyBpbiB0aGlzIGZ1bmN0aW9uLiAqLworICAgIHNlbGYtPmFhY0NoYW5uZWxzUHJldiA9IDA7CisgIH0KKworICBpZiAoc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1swXSAhPSBOVUxMKSB7CisgICAgc2VsZi0+cERybUJzQnVmZmVyID0gc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1swXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnBDb21TdGF0aWNEYXRhLT5wV29ya0J1ZmZlckNvcmUxLT5Ecm1Cc0J1ZmZlcjsKKyAgICBzZWxmLT5kcm1Cc0J1ZmZlclNpemUgPSBEUk1fQlNfQlVGRkVSX1NJWkU7CiAgIH0KIAogICAvKiBVcGRhdGUgc3RydWN0dXJlcyAqLwotICBpZiAoYXNjQ2hhbmdlZCkgeworICBpZiAoKmNvbmZpZ0NoYW5nZWQpIHsKKyAgICAvKiBUaGluZ3MgdG8gYmUgZG9uZSBmb3IgZWFjaCBjaGFubmVsLCB3aGljaCBkbyBub3QgaW52b2x2ZSBhbGxvY2F0aW5nCisgICAgICAgbWVtb3J5LiBEb2luZyB0aGVzZSB0aGluZ3Mgb25seSBvbiB0aGUgY2hhbm5lbHMgbmVlZGVkIGZvciB0aGUgY3VycmVudAorICAgICAgIGNvbmZpZ3VyYXRpb24gKGFzY0NoYW5uZWxzKSBjb3VsZCBsZWFkIHRvIG1lbW9yeSBhY2Nlc3MgdmlvbGF0aW9uIGxhdGVyCisgICAgICAgKGVycm9yIGNvbmNlYWxtZW50KS4gKi8KKyAgICBpbnQgY2ggPSAwOworICAgIGludCBjaElkeCA9IDA7CisgICAgZm9yIChpbnQgX2NoID0gMDsgX2NoIDwgc2VsZi0+YXNjQ2hhbm5lbHNbc3RyZWFtSW5kZXhdOyBfY2grKykgeworICAgICAgc3dpdGNoIChzZWxmLT5zdHJlYW1JbmZvLmFvdCkgeworICAgICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgICAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmdyYW51bGVMZW5ndGggPQorICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+Z3JhbnVsZUxlbmd0aCA9CisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lIC8gODsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5yZW5kZXJNb2RlID0gaW5pdFJlbmRlck1vZGU7CiAKLSAgICAgLyogVGhpbmdzIHRvIGJlIGRvbmUgZm9yIGVhY2ggY2hhbm5lbCwgd2hpY2ggZG8gbm90IGludm9sdmUgYWxsb2NhdGluZyBtZW1vcnkuCi0gICAgICAgIERvaW5nIHRoZXNlIHRoaW5ncyBvbmx5IG9uIHRoZSBjaGFubmVscyBuZWVkZWQgZm9yIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24KLSAgICAgICAgKGFzY0NoYW5uZWxzKSBjb3VsZCBsZWFkIHRvIG1lbW9yeSBhY2Nlc3MgdmlvbGF0aW9uIGxhdGVyIChlcnJvciBjb25jZWFsbWVudCkuICovCi0gICAgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPmFhY0NoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgc3dpdGNoIChzZWxmLT5zdHJlYW1JbmZvLmFvdCkgewotICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKLSAgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKLSAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmdyYW51bGVMZW5ndGggPSBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+Z3JhbnVsZUxlbmd0aCA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lIC8gODsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgfQotICAgICAgIG1kY3RfaW5pdCggJnNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5JTWRjdCwKLSAgICAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+cE92ZXJsYXBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgT3ZlcmxhcEJ1ZmZlclNpemUgKTsKKyAgICAgIG1kY3RfaW5pdCgmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPklNZGN0LAorICAgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5wT3ZlcmxhcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICBPdmVybGFwQnVmZmVyU2l6ZSk7CiAKKyAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5sYXN0X2NvcmVfbW9kZSA9IEZEX0xPTkc7CisgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+bGFzdF9scGRfbW9kZSA9IDI1NTsKIAotICAgICAgICAvKiBSZXNldCBEUkMgY29udHJvbCBkYXRhIGZvciB0aGlzIGNoYW5uZWwgKi8KLSAgICAgICAgYWFjRGVjb2Rlcl9kcmNJbml0Q2hhbm5lbERhdGEgKCAmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPmRyY0RhdGEgKTsKKyAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5sYXN0X3RjeF9waXRjaCA9IExfRElWOwogCi0gICAgICAgLyogUmVzZXQgY29uY2VhbG1lbnQgb25seSBpZiBBU0MgY2hhbmdlZC4gT3RoZXJ3aXNlIGl0IHdpbGwgYmUgZG9uZSB3aXRoIGFueSBjb25maWcgY2FsbGJhY2suCi0gICAgICAgICAgRS5nLiBldmVyeSB0aW1lIHRoZSBMQVRNIFNNQyBpcyBwcmVzZW50LiAqLwotICAgICAgIENDb25jZWFsbWVudF9Jbml0Q2hhbm5lbERhdGEoJnNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5jb25jZWFsbWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+Y29uY2VhbENvbW1vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgKTsKLSAgICAgfQorICAgICAgLyogUmVzZXQgRFJDIGNvbnRyb2wgZGF0YSBmb3IgdGhpcyBjaGFubmVsICovCisgICAgICBhYWNEZWNvZGVyX2RyY0luaXRDaGFubmVsRGF0YSgKKyAgICAgICAgICAmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPmRyY0RhdGEpOworCisgICAgICAvKiBEZWxldGUgbWl4ZG93biBtZXRhZGF0YSBmcm9tIHRoZSBwYXN0ICovCisgICAgICBwY21EbXhfUmVzZXQoc2VsZi0+aFBjbVV0aWxzLCBQQ01ETVhfUkVTRVRfQlNfREFUQSk7CisKKyAgICAgIC8qIFJlc2V0IGNvbmNlYWxtZW50IG9ubHkgaWYgQVNDIGNoYW5nZWQuIE90aGVyd2lzZSBpdCB3aWxsIGJlIGRvbmUgd2l0aAorICAgICAgICAgYW55IGNvbmZpZyBjYWxsYmFjay4gRS5nLiBldmVyeSB0aW1lIHRoZSBMQVRNIFNNQyBpcyBwcmVzZW50LiAqLworICAgICAgQ0NvbmNlYWxtZW50X0luaXRDaGFubmVsRGF0YSgKKyAgICAgICAgICAmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPmNvbmNlYWxtZW50SW5mbywKKyAgICAgICAgICAmc2VsZi0+Y29uY2VhbENvbW1vbkRhdGEsIGluaXRSZW5kZXJNb2RlLAorICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lKTsKKyAgICAgIGNoKys7CisgICAgICBjaElkeCsrOworICAgIH0KICAgfQogCiAgIC8qIFVwZGF0ZSBleHRlcm5hbGx5IHZpc2libGUgY29weSBvZiBmbGFncyAqLwotICBzZWxmLT5zdHJlYW1JbmZvLmZsYWdzID0gc2VsZi0+ZmxhZ3M7CisgIHNlbGYtPnN0cmVhbUluZm8uZmxhZ3MgPSBzZWxmLT5mbGFnc1swXTsKKworICBpZiAoKmNvbmZpZ0NoYW5nZWQpIHsKKyAgICBpbnQgZHJjRGVjU2FtcGxlUmF0ZSwgZHJjRGVjRnJhbWVTaXplOworCisgICAgaWYgKHNlbGYtPnN0cmVhbUluZm8uZXh0U2FtcGxpbmdSYXRlICE9IDApIHsKKyAgICAgIGRyY0RlY1NhbXBsZVJhdGUgPSBzZWxmLT5zdHJlYW1JbmZvLmV4dFNhbXBsaW5nUmF0ZTsKKyAgICAgIGRyY0RlY0ZyYW1lU2l6ZSA9IChzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5leHRTYW1wbGluZ1JhdGUpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZTsKKyAgICB9IGVsc2UgeworICAgICAgZHJjRGVjU2FtcGxlUmF0ZSA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZTsKKyAgICAgIGRyY0RlY0ZyYW1lU2l6ZSA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lOworICAgIH0KKworICAgIGlmIChGREtfZHJjRGVjX0luaXQoc2VsZi0+aFVuaURyY0RlY29kZXIsIGRyY0RlY0ZyYW1lU2l6ZSwgZHJjRGVjU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmFhY0NoYW5uZWxzKSAhPSAwKQorICAgICAgZ290byBiYWlsOworICB9CisKKyAgaWYgKGFzYy0+bV9hb3QgPT0gQU9UX1VTQUMpIHsKKyAgICBwY21MaW1pdGVyX1NldEF0dGFjayhzZWxmLT5oTGltaXRlciwgKDUpKTsKKyAgICBwY21MaW1pdGVyX1NldFRocmVzaG9sZChzZWxmLT5oTGltaXRlciwgRkwyRlhDT05TVF9EQkwoMC44OTEyNTA5NGYpKTsKKyAgfQogCiAgIHJldHVybiBlcnI7CiAKIGJhaWw6Ci0gIGFhY0RlY29kZXJfQ2xvc2UoIHNlbGYgKTsKKyAgQ0FhY0RlY29kZXJfRGVJbml0KHNlbGYsIDApOwogICByZXR1cm4gQUFDX0RFQ19PVVRfT0ZfTUVNT1JZOwogfQogCi0KIExJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgKLSAgICAgICAgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKLSAgICAgICAgY29uc3QgVUlOVCBmbGFncywKLSAgICAgICAgSU5UX1BDTSAqcFRpbWVEYXRhLAotICAgICAgICBjb25zdCBJTlQgIHRpbWVEYXRhU2l6ZSwKLSAgICAgICAgY29uc3QgSU5UIGludGVybGVhdmVkCi0gICAgICAgICkKLXsKKyAgICBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLCBjb25zdCBVSU5UIGZsYWdzLCBGSVhQX1BDTSAqcFRpbWVEYXRhLAorICAgIGNvbnN0IElOVCB0aW1lRGF0YVNpemUsIGNvbnN0IGludCB0aW1lRGF0YUNoYW5uZWxPZmZzZXQpIHsKICAgQUFDX0RFQ09ERVJfRVJST1IgRXJyb3JTdGF0dXMgPSBBQUNfREVDX09LOwogCiAgIENQcm9ncmFtQ29uZmlnICpwY2U7CiAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzID0gdHJhbnNwb3J0RGVjX0dldEJpdHN0cmVhbShzZWxmLT5oSW5wdXQsIDApOwogCi0gIE1QNF9FTEVNRU5UX0lEIHR5cGUgPSBJRF9OT05FOyAgICAgICAgICAgIC8qIEN1cnJlbnQgZWxlbWVudCB0eXBlICovCi0gIElOVCBhYWNDaGFubmVscz0wOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoYW5uZWwgY291bnRlciBmb3IgY2hhbm5lbHMgZm91bmQgaW4gdGhlIGJpdHN0cmVhbSAqLwotICBpbnQgY2hPdXRNYXBJZHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgY2hhbm5lbCBtYXBwaW5nIGluZGV4IChzZWUgY29tbWVudCBiZWxvdykgKi8KKyAgTVA0X0VMRU1FTlRfSUQgdHlwZSA9IElEX05PTkU7IC8qIEN1cnJlbnQgZWxlbWVudCB0eXBlICovCisgIElOVCBhYWNDaGFubmVscyA9IDA7IC8qIENoYW5uZWwgY291bnRlciBmb3IgY2hhbm5lbHMgZm91bmQgaW4gdGhlIGJpdHN0cmVhbSAqLworICBjb25zdCBpbnQgc3RyZWFtSW5kZXggPSAwOyAvKiBpbmRleCBvZiB0aGUgY3VycmVudCBzdWJzdHJlYW0gKi8KIAotICBJTlQgYXVTdGFydEFuY2hvciA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKTsgIC8qIEFVIHN0YXJ0IGJpdCBidWZmZXIgcG9zaXRpb24gZm9yIEFVIGJ5dGUgYWxpZ25tZW50ICovCisgIElOVCBhdVN0YXJ0QW5jaG9yID0gKElOVClGREtnZXRWYWxpZEJpdHMoCisgICAgICBicyk7IC8qIEFVIHN0YXJ0IGJpdCBidWZmZXIgcG9zaXRpb24gZm9yIEFVIGJ5dGUgYWxpZ25tZW50ICovCiAKLSAgc2VsZi0+ZnJhbWVPSyA9IDE7CisgIElOVCBjaGVja1NhbXBsZVJhdGUgPSBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGU7CisKKyAgSU5UIENDb25jZWFsX1RERmFkaW5nX0FwcGxpZWRbKDgpXSA9IHsKKyAgICAgIDB9OyAvKiBJbml0aWFsaXplIHN0YXR1cyBvZiBUaW1lIERvbWFpbiBmYWRpbmcgKi8KKworICBpZiAoc2VsZi0+YWFjQ2hhbm5lbHMgPD0gMCkgeworICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUc7CisgIH0KIAogICAvKiBBbnkgc3VwcG9ydGVkIGJhc2UgbGF5ZXIgdmFsaWQgQVUgd2lsbCByZXF1aXJlIG1vcmUgdGhhbiAxNiBiaXRzLiAqLwotICBpZiAoICh0cmFuc3BvcnREZWNfR2V0QXVCaXRzUmVtYWluaW5nKHNlbGYtPmhJbnB1dCwgMCkgPCAxNSkgJiYgKGZsYWdzICYgKEFBQ0RFQ19DT05DRUFMfEFBQ0RFQ19GTFVTSCkpID09IDApIHsKKyAgaWYgKCh0cmFuc3BvcnREZWNfR2V0QXVCaXRzUmVtYWluaW5nKHNlbGYtPmhJbnB1dCwgMCkgPCAxNSkgJiYKKyAgICAgIChmbGFncyAmIChBQUNERUNfQ09OQ0VBTCB8IEFBQ0RFQ19GTFVTSCkpID09IDApIHsKICAgICBzZWxmLT5mcmFtZU9LID0gMDsKICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOwogICB9CiAKLQogICAvKiBSZXNldCBQcm9ncmFtIENvbmZpZyBzdHJ1Y3R1cmUgKi8KICAgcGNlID0gJnNlbGYtPnBjZTsKICAgQ1Byb2dyYW1Db25maWdfUmVzZXQocGNlKTsKIAogICBDQWFjRGVjb2Rlcl9BbmNEYXRhUmVzZXQoJnNlbGYtPmFuY0RhdGEpOwotCi0gIHsKKyAgaWYgKCEoZmxhZ3MgJiAoQUFDREVDX0NPTkNFQUwgfCBBQUNERUNfRkxVU0gpKSAmJgorICAgICAgIShzZWxmLT5mbGFnc1swXSAmIChBQ19VU0FDIHwgQUNfUlNWNjAzREEpKSkgewogICAgIGludCBjaDsKLQogICAgIGlmIChzZWxmLT5zdHJlYW1JbmZvLmNoYW5uZWxDb25maWcgPT0gMCkgewogICAgICAgLyogSW5pdCBDaGFubmVsL0VsZW1lbnQgbWFwcGluZyB0YWJsZSAqLwotICAgICAgZm9yIChjaD0wOyBjaDwoOCk7IGNoKyspIHsKKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8ICg4KTsgY2grKykgewogICAgICAgICBzZWxmLT5jaE1hcHBpbmdbY2hdID0gMjU1OwogICAgICAgfQogICAgICAgaWYgKCFDUHJvZ3JhbUNvbmZpZ19Jc1ZhbGlkKHBjZSkpIHsKICAgICAgICAgaW50IGVsOwotICAgICAgICBmb3IgKGVsPTA7IGVsPCg4KTsgZWwrKykgeworICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCAoMyAqICgoOCkgKiAyKSArICgoKDgpICogMikpIC8gMiArIDQgKiAoMSkgKyAxKTsKKyAgICAgICAgICAgICBlbCsrKSB7CiAgICAgICAgICAgc2VsZi0+ZWxlbWVudHNbZWxdID0gSURfTk9ORTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogCisgIGlmIChzZWxmLT5kb3duc2NhbGVGYWN0b3IgPiAxICYmIChzZWxmLT5mbGFnc1swXSAmIEFDX0VMRCkpIHsKKyAgICBzZWxmLT5mbGFnc1swXSB8PSBBQ19FTERfRE9XTlNDQUxFOworICB9IGVsc2UgeworICAgIHNlbGYtPmZsYWdzWzBdICY9IH5BQ19FTERfRE9XTlNDQUxFOworICB9CisgIC8qIHVuc3VwcG9ydGVkIGRzZiAoYWFjU2FtcGxlUmF0ZSBoYXMgbm90IHlldCBiZWVuIGRpdmlkZWQgYnkgZHNmKSAtPiBkaXZpZGUKKyAgICovCisgIGlmIChzZWxmLT5kb3duc2NhbGVGYWN0b3JJbkJTID4gMSAmJgorICAgICAgKHNlbGYtPmZsYWdzWzBdICYgQUNfRUxEX0RPV05TQ0FMRSkgPT0gMCkgeworICAgIGNoZWNrU2FtcGxlUmF0ZSA9CisgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSAvIHNlbGYtPmRvd25zY2FsZUZhY3RvckluQlM7CisgIH0KKwogICAvKiBDaGVjayBzYW1wbGluZyBmcmVxdWVuY3kgICovCi0gIHN3aXRjaCAoIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSApIHsKKyAgaWYgKHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSA8PSAwKSB7CisgICAgLyogSW5zdGFuY2UgbWF5YmUgdW5pbml0aWFsaXplZCEgKi8KKyAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9TQU1QTElOR1JBVEU7CisgIH0KKyAgc3dpdGNoIChjaGVja1NhbXBsZVJhdGUpIHsKICAgICBjYXNlIDk2MDAwOgogICAgIGNhc2UgODgyMDA6CiAgICAgY2FzZSA2NDAwMDoKICAgICBjYXNlIDE2MDAwOgogICAgIGNhc2UgMTIwMDA6Ci0gICBjYXNlIDExMDI1OgotICAgY2FzZSAgODAwMDoKLSAgICBjYXNlICA3MzUwOgorICAgIGNhc2UgMTEwMjU6CisgICAgY2FzZSA4MDAwOgorICAgIGNhc2UgNzM1MDoKICAgICBjYXNlIDQ4MDAwOgogICAgIGNhc2UgNDQxMDA6CiAgICAgY2FzZSAzMjAwMDoKQEAgLTExNzksMjI1ICsyNDY3LDI2MyBAQAogICAgIGNhc2UgMjIwNTA6CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgaWYgKCAhIChzZWxmLT5mbGFncyAmIChBQ19VU0FDfEFDX1JTVkQ1MCkpICkgeworICAgICAgaWYgKCEoc2VsZi0+ZmxhZ3NbMF0gJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBKSkpIHsKICAgICAgICAgcmV0dXJuIEFBQ19ERUNfVU5TVVBQT1JURURfU0FNUExJTkdSQVRFOwogICAgICAgfQogICAgICAgYnJlYWs7CiAgIH0KIAotCi0gIGlmICggZmxhZ3MgJiBBQUNERUNfQ0xSSElTVCApCi0gIHsKLSAgICBpbnQgY2g7Ci0gICAgLyogQ2xlYXIgaGlzdG9yeSAqLwotICAgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPmFhY0NoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAvKiBSZXNldCBjb25jZWFsbWVudCAqLwotICAgICAgQ0NvbmNlYWxtZW50X0luaXRDaGFubmVsRGF0YSgmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPmNvbmNlYWxtZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPmNvbmNlYWxDb21tb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgKTsKLSAgICAgIC8qIENsZWFyIG92ZXJsYXAtYWRkIGJ1ZmZlcnMgdG8gYXZvaWQgY2xpY2tzLiAqLwotICAgICAgRkRLbWVtY2xlYXIoc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPnBPdmVybGFwQnVmZmVyLCBPdmVybGFwQnVmZmVyU2l6ZSpzaXplb2YoRklYUF9EQkwpKTsKLSAgICAgfQorICBpZiAoZmxhZ3MgJiBBQUNERUNfQ0xSSElTVCkgeworICAgIGlmICghKHNlbGYtPmZsYWdzWzBdICYgQUNfVVNBQykpIHsKKyAgICAgIGludCBjaDsKKyAgICAgIC8qIENsZWFyIGhpc3RvcnkgKi8KKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPmFhY0NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIC8qIFJlc2V0IGNvbmNlYWxtZW50ICovCisgICAgICAgIENDb25jZWFsbWVudF9Jbml0Q2hhbm5lbERhdGEoCisgICAgICAgICAgICAmc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPmNvbmNlYWxtZW50SW5mbywKKyAgICAgICAgICAgICZzZWxmLT5jb25jZWFsQ29tbW9uRGF0YSwKKyAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnJlbmRlck1vZGUsCisgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSk7CisgICAgICAgIC8qIENsZWFyIG92ZXJsYXAtYWRkIGJ1ZmZlcnMgdG8gYXZvaWQgY2xpY2tzLiAqLworICAgICAgICBGREttZW1jbGVhcihzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+cE92ZXJsYXBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIE92ZXJsYXBCdWZmZXJTaXplICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICB9CisgICAgICBpZiAoc2VsZi0+c3RyZWFtSW5mby5jaGFubmVsQ29uZmlnID4gMCkgeworICAgICAgICAvKiBEZWNsYXJlIHRoZSBwb3NzaWJseSBhZG9wdGVkIG9sZCBQQ0UgKHdpdGggb3V0ZGF0ZWQgbWV0YWRhdGEpCisgICAgICAgICAqIGludmFsaWQuICovCisgICAgICAgIENQcm9ncmFtQ29uZmlnX0luaXQocGNlKTsKKyAgICAgIH0KKyAgICB9CiAgIH0KIAotCi0KLSNpZmRlZiBUUF9QQ0VfRU5BQkxFCi0gIGludCBwY2VSZWFkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgaW5kaWNhdGluZyBhIFBDRSBpbiB0aGUgY3VycmVudCByYXdfZGF0YV9ibG9jaygpICovCi0jZW5kaWYKLQorICBpbnQgcGNlUmVhZCA9IDA7IC8qIEZsYWcgaW5kaWNhdGluZyBhIFBDRSBpbiB0aGUgY3VycmVudCByYXdfZGF0YV9ibG9jaygpICovCiAKICAgSU5UIGhkYWFjRGVjb2RlZCA9IDA7Ci0gIE1QNF9FTEVNRU5UX0lEIHByZXZpb3VzX2VsZW1lbnQgPSBJRF9FTkQ7IC8qIExhc3QgZWxlbWVudCBJRCAocmVxdWlyZWQgZm9yIGV4dGVuc2lvbiBwYXlsb2FkIG1hcHBpbmcgKi8KLSAgVUNIQVIgcHJldmlvdXNfZWxlbWVudF9pbmRleCA9IDA7ICAgICAgICAgLyogQ2Fub25pY2FsIGluZGV4IG9mIGxhc3QgZWxlbWVudCAqLwotICBpbnQgZWxlbWVudF9jb3VudCA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGNvdW50ZXIgZm9yIGVsZW1lbnRzIGZvdW5kIGluIHRoZSBiaXRzdHJlYW0gKi8KLSAgaW50IGVsX2NudFtJRF9MQVNUXSA9IHsgMCB9OyAgICAgICAgICAgICAgLyogZWxlbWVudCBjb3VudGVyICggcm9idXN0bmVzcyApICovCisgIE1QNF9FTEVNRU5UX0lEIHByZXZpb3VzX2VsZW1lbnQgPQorICAgICAgSURfRU5EOyAvKiBMYXN0IGVsZW1lbnQgSUQgKHJlcXVpcmVkIGZvciBleHRlbnNpb24gcGF5bG9hZCBtYXBwaW5nICovCisgIFVDSEFSIHByZXZpb3VzX2VsZW1lbnRfaW5kZXggPSAwOyAvKiBDYW5vbmljYWwgaW5kZXggb2YgbGFzdCBlbGVtZW50ICovCisgIGludCBlbGVtZW50X2NvdW50ID0KKyAgICAgIDA7IC8qIEVsZW1lbnQgY291bnRlciBmb3IgZWxlbWVudHMgZm91bmQgaW4gdGhlIGJpdHN0cmVhbSAqLworICBpbnQgY2hhbm5lbF9lbGVtZW50X2NvdW50ID0gMDsgLyogQ2hhbm5lbCBlbGVtZW50IGNvdW50ZXIgKi8KKyAgTVA0X0VMRU1FTlRfSUQKKyAgY2hhbm5lbF9lbGVtZW50c1soMyAqICgoOCkgKiAyKSArICgoKDgpICogMikpIC8gMiArIDQgKiAoMSkgKworICAgICAgICAgICAgICAgICAgICAxKV07ICAgICAvKiBDaGFubmVsIGVsZW1lbnRzIGluIGJpdCBzdHJlYW0gb3JkZXIuICovCisgIGludCBlbF9jbnRbSURfTEFTVF0gPSB7MH07IC8qIGVsZW1lbnQgY291bnRlciAoIHJvYnVzdG5lc3MgKSAqLworICBpbnQgZWxlbWVudF9jb3VudF9wcmV2X3N0cmVhbXMgPQorICAgICAgMDsgLyogRWxlbWVudCBjb3VudCBvZiBhbGwgcHJldmlvdXMgc3ViIHN0cmVhbXMuICovCiAKLSAgd2hpbGUgKCAodHlwZSAhPSBJRF9FTkQpICYmICghIChmbGFncyAmIChBQUNERUNfQ09OQ0VBTCB8IEFBQ0RFQ19GTFVTSCkpKSAmJiBzZWxmLT5mcmFtZU9LICkKLSAgeworICB3aGlsZSAoKHR5cGUgIT0gSURfRU5EKSAmJiAoIShmbGFncyAmIChBQUNERUNfQ09OQ0VBTCB8IEFBQ0RFQ19GTFVTSCkpKSAmJgorICAgICAgICAgc2VsZi0+ZnJhbWVPSykgewogICAgIGludCBlbF9jaGFubmVsczsKIAotICAgIGlmICghIChzZWxmLT5mbGFncyAmIChBQ19VU0FDfEFDX1JTVkQ1MHxBQ19FTER8QUNfU0NBTEFCTEV8QUNfRVIpKSkKLSAgICAgIHR5cGUgPSAoTVA0X0VMRU1FTlRfSUQpIEZES3JlYWRCaXRzKGJzLDMpOwotICAgIGVsc2UgCisgICAgaWYgKCEoc2VsZi0+ZmxhZ3NbMF0gJgorICAgICAgICAgIChBQ19VU0FDIHwgQUNfUlNWRDUwIHwgQUNfUlNWNjAzREEgfCBBQ19FTEQgfCBBQ19TQ0FMQUJMRSB8IEFDX0VSKSkpCisgICAgICB0eXBlID0gKE1QNF9FTEVNRU5UX0lEKUZES3JlYWRCaXRzKGJzLCAzKTsKKyAgICBlbHNlCiAgICAgICB0eXBlID0gc2VsZi0+ZWxlbWVudHNbZWxlbWVudF9jb3VudF07CiAKLSAgICBzZXRIY3JUeXBlKCZzZWxmLT5hYWNDb21tb25EYXRhLm92ZXJsYXkuYWFjLmVySGNySW5mbywgdHlwZSk7CisgICAgaWYgKChzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCkgJiYKKyAgICAgICAgIGVsZW1lbnRfY291bnQgPT0gMCkgfHwKKyAgICAgICAgKHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSAmIEFDX1JTVjYwM0RBKSkgeworICAgICAgc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdICY9IH5BQ19JTkRFUDsKIAorICAgICAgaWYgKEZES3JlYWRCaXQoYnMpKSB7CisgICAgICAgIHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSB8PSBBQ19JTkRFUDsKKyAgICAgIH0KIAotICAgIGlmICgoSU5UKUZES2dldFZhbGlkQml0cyhicykgPCAwKQorICAgICAgaW50IGNoID0gYWFjQ2hhbm5lbHM7CisgICAgICBmb3IgKGludCBjaElkeCA9IGFhY0NoYW5uZWxzOyBjaElkeCA8IHNlbGYtPmFzY0NoYW5uZWxzW3N0cmVhbUluZGV4XTsKKyAgICAgICAgICAgY2hJZHgrKykgeworICAgICAgICB7CisgICAgICAgICAgLyogUm9idXN0bmVzcyBjaGVjayAqLworICAgICAgICAgIGlmIChjaCA+PSBzZWxmLT5hYWNDaGFubmVscykgeworICAgICAgICAgICAgcmV0dXJuIEFBQ19ERUNfVU5LTk9XTjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBpZiBsYXN0IGZyYW1lIHdhcyBicm9rZW4gYW5kIHRoaXMgZnJhbWUgaXMgbm8gaW5kZXBlbmRlbnQgZnJhbWUsCisgICAgICAgICAgICogY29ycmVjdCBkZWNvZGluZyBpcyBpbXBvc3NpYmxlIHdlIG5lZWQgdG8gdHJpZ2dlciBjb25jZWFsbWVudCAqLworICAgICAgICAgIGlmICgoQ0NvbmNlYWxtZW50X0dldExhc3RGcmFtZU9rKAorICAgICAgICAgICAgICAgICAgICZzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+Y29uY2VhbG1lbnRJbmZvLAorICAgICAgICAgICAgICAgICAgIDEpID09IDApICYmCisgICAgICAgICAgICAgICEoc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdICYgQUNfSU5ERVApKSB7CisgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgY2grKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmICgoSU5UKUZES2dldFZhbGlkQml0cyhicykgPCAwKSB7CiAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICB9CiAKLSAgICBzd2l0Y2ggKHR5cGUpCi0gICAgeworICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgY2FzZSBJRF9TQ0U6CiAgICAgICBjYXNlIElEX0NQRToKICAgICAgIGNhc2UgSURfTEZFOgorICAgICAgY2FzZSBJRF9VU0FDX1NDRToKKyAgICAgIGNhc2UgSURfVVNBQ19DUEU6CisgICAgICBjYXNlIElEX1VTQUNfTEZFOgorCisgICAgICAgIGVsX2NoYW5uZWxzID0gQ0FhY0RlY29kZXJfR2V0RUxDaGFubmVscygKKyAgICAgICAgICAgIHR5cGUsIHNlbGYtPnVzYWNTdGVyZW9Db25maWdJbmRleFtlbGVtZW50X2NvdW50XSk7CisKICAgICAgICAgLyoKICAgICAgICAgICBDb25zaXN0ZW5jeSBjaGVjawotICAgICAgICAqLworICAgICAgICAgKi8KKyAgICAgICAgeworICAgICAgICAgIGludCB0b3RhbEFzY0NoYW5uZWxzID0gMDsKIAotICAgICAgICBpZiAodHlwZSA9PSBJRF9DUEUpIHsKLSAgICAgICAgICBlbF9jaGFubmVscyA9IDI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZWxfY2hhbm5lbHMgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAoZWxfY250W3R5cGVdID49IChzZWxmLT5hc2NDaGFubmVscz4+KGVsX2NoYW5uZWxzLTEpKSkgfHwgKGFhY0NoYW5uZWxzID4gKHNlbGYtPmFzY0NoYW5uZWxzLWVsX2NoYW5uZWxzKSkgKSB7Ci0gICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKLSAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggIShzZWxmLT5mbGFncyAmIChBQ19VU0FDfEFDX1JTVkQ1MCkpICkgewotICAgICAgICAgIGludCBjaDsKLSAgICAgICAgICBmb3IgKGNoPTA7IGNoIDwgZWxfY2hhbm5lbHM7IGNoKz0xKSB7Ci0gICAgICAgICAgICBDUG5zX1Jlc2V0RGF0YSgmc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1thYWNDaGFubmVscytjaF0tPmRhdGEuYWFjLlBuc0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1thYWNDaGFubmVscytjaF0tPnBDb21EYXRhLT5wbnNJbnRlckNoYW5uZWxEYXRhKTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICgxICogMSk7IGkrKykgeworICAgICAgICAgICAgdG90YWxBc2NDaGFubmVscyArPSBzZWxmLT5hc2NDaGFubmVsc1tpXTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKChlbF9jbnRbdHlwZV0gPj0gKHRvdGFsQXNjQ2hhbm5lbHMgPj4gKGVsX2NoYW5uZWxzIC0gMSkpKSB8fAorICAgICAgICAgICAgICAoYWFjQ2hhbm5lbHMgPiAodG90YWxBc2NDaGFubmVscyAtIGVsX2NoYW5uZWxzKSkpIHsKKyAgICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CisgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmKHNlbGYtPmZyYW1lT0spIHsKLSAgICAgICAgICBFcnJvclN0YXR1cyA9IENDaGFubmVsRWxlbWVudF9SZWFkKCBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2FhY0NoYW5uZWxzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2FhY0NoYW5uZWxzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5zYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsX2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZXBDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+aElucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICBpZiAoRXJyb3JTdGF0dXMpIHsKKyAgICAgICAgaWYgKCEoc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdICYgKEFDX1VTQUMgfCBBQ19SU1ZENTAgfCBBQ19SU1Y2MDNEQSkpKSB7CisgICAgICAgICAgaW50IGNoOworICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGVsX2NoYW5uZWxzOyBjaCArPSAxKSB7CisgICAgICAgICAgICBDUG5zX1Jlc2V0RGF0YSgmc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1thYWNDaGFubmVscyArIGNoXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmRhdGEuYWFjLlBuc0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1thYWNDaGFubmVscyArIGNoXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnBDb21EYXRhLT5wbnNJbnRlckNoYW5uZWxEYXRhKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZi0+ZnJhbWVPSykgeworICAgICAgICAgIEVycm9yU3RhdHVzID0gQ0NoYW5uZWxFbGVtZW50X1JlYWQoCisgICAgICAgICAgICAgIGJzLCAmc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1thYWNDaGFubmVsc10sCisgICAgICAgICAgICAgICZzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2FhY0NoYW5uZWxzXSwKKyAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hb3QsICZzZWxmLT5zYW1wbGluZ1JhdGVJbmZvW3N0cmVhbUluZGV4XSwKKyAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdLCBzZWxmLT5lbEZsYWdzW2VsZW1lbnRfY291bnRdLAorICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSwgZWxfY2hhbm5lbHMsCisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZXBDb25maWcsIHNlbGYtPmhJbnB1dCk7CisgICAgICAgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19ERUNfT0spIHsKICAgICAgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOwogICAgICAgICAgIH0KICAgICAgICAgfQogCi0KLSAgICAgICAgaWYgKCBzZWxmLT5mcmFtZU9LKSB7Ci0gICAgICAgICAgLyogTG9va3VwIHRoZSBlbGVtZW50IGFuZCBkZWNvZGUgaXQgb25seSBpZiBpdCBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IHByb2dyYW0gKi8KLSAgICAgICAgICBpZiAoIENQcm9ncmFtQ29uZmlnX0xvb2t1cEVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICBwY2UsCi0gICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmNoYW5uZWxDb25maWcsCisgICAgICAgIGlmIChzZWxmLT5mcmFtZU9LKSB7CisgICAgICAgICAgLyogTG9va3VwIHRoZSBlbGVtZW50IGFuZCBkZWNvZGUgaXQgb25seSBpZiBpdCBiZWxvbmdzIHRvIHRoZSBjdXJyZW50CisgICAgICAgICAgICogcHJvZ3JhbSAqLworICAgICAgICAgIGlmIChDUHJvZ3JhbUNvbmZpZ19Mb29rdXBFbGVtZW50KAorICAgICAgICAgICAgICAgICAgcGNlLCBzZWxmLT5zdHJlYW1JbmZvLmNoYW5uZWxDb25maWcsCiAgICAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2FhY0NoYW5uZWxzXS0+RWxlbWVudEluc3RhbmNlVGFnLAotICAgICAgICAgICAgICAgICAgYWFjQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICBzZWxmLT5jaE1hcHBpbmcsCi0gICAgICAgICAgICAgICAgICBzZWxmLT5jaGFubmVsVHlwZSwKLSAgICAgICAgICAgICAgICAgIHNlbGYtPmNoYW5uZWxJbmRpY2VzLAotICAgICAgICAgICAgICAgICAmcHJldmlvdXNfZWxlbWVudF9pbmRleCwKLSAgICAgICAgICAgICAgICAgIHNlbGYtPmVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgdHlwZSkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggIWhkYWFjRGVjb2RlZCApIHsKLSAgICAgICAgICAgICAgQ0NoYW5uZWxFbGVtZW50X0RlY29kZSgKLSAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5wQWFjRGVjb2RlckNoYW5uZWxJbmZvW2FhY0NoYW5uZWxzXSwKLSAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2FhY0NoYW5uZWxzXSwKLSAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5zYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgIGVsX2NoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFhY0NoYW5uZWxzICs9IDE7Ci0gICAgICAgICAgICBpZiAodHlwZSA9PSBJRF9DUEUpIHsKLSAgICAgICAgICAgICAgYWFjQ2hhbm5lbHMgKz0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICBhYWNDaGFubmVscywgc2VsZi0+Y2hNYXBwaW5nLCBzZWxmLT5jaGFubmVsVHlwZSwKKyAgICAgICAgICAgICAgICAgIHNlbGYtPmNoYW5uZWxJbmRpY2VzLCAoOCksICZwcmV2aW91c19lbGVtZW50X2luZGV4LAorICAgICAgICAgICAgICAgICAgc2VsZi0+ZWxlbWVudHMsIHR5cGUpKSB7CisgICAgICAgICAgICBjaGFubmVsX2VsZW1lbnRzW2NoYW5uZWxfZWxlbWVudF9jb3VudCsrXSA9IHR5cGU7CisgICAgICAgICAgICBhYWNDaGFubmVscyArPSBlbF9jaGFubmVsczsKKyAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7CiAgICAgICAgICAgfQogICAgICAgICAgIC8qIENyZWF0ZSBTQlIgZWxlbWVudCBmb3IgU0JSIGZvciB1cHNhbXBsaW5nIGZvciBMRkUgZWxlbWVudHMsCi0gICAgICAgICAgICAgYW5kIGlmIFNCUiB3YXMgZXhwbGljaXRseSBzaWduYWxlZCwgYmVjYXVzZSB0aGUgZmlyc3QgZnJhbWUocykKKyAgICAgICAgICAgICBhbmQgaWYgU0JSIHdhcyBpbXBsaWNpdGx5IHNpZ25hbGVkLCBiZWNhdXNlIHRoZSBmaXJzdCBmcmFtZShzKQogICAgICAgICAgICAgIG1heSBub3QgY29udGFpbiBTQlIgcGF5bG9hZCAoYnJva2VuIGVuY29kZXIsIGJpdCBlcnJvcnMpLiAqLwotICAgICAgICAgIGlmICggKHNlbGYtPmZsYWdzICYgQUNfU0JSX1BSRVNFTlQpIHx8IChzZWxmLT5zYnJFbmFibGVkID09IDEpICkKLSAgICAgICAgICB7CisgICAgICAgICAgaWYgKHNlbGYtPmZyYW1lT0sgJiYKKyAgICAgICAgICAgICAgKChzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gJiBBQ19TQlJfUFJFU0VOVCkgfHwKKyAgICAgICAgICAgICAgIChzZWxmLT5zYnJFbmFibGVkID09IDEpKSAmJgorICAgICAgICAgICAgICAhKHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSAmCisgICAgICAgICAgICAgICAgQUNfVVNBQykgLyogSXMgZG9uZSBkdXJpbmcgZXhwbGljaXQgY29uZmlnIHNldCB1cCAqLworICAgICAgICAgICkgewogICAgICAgICAgICAgU0JSX0VSUk9SIHNickVycm9yOworICAgICAgICAgICAgVUNIQVIgY29uZmlnTW9kZSA9IDA7CisgICAgICAgICAgICBVQ0hBUiBjb25maWdDaGFuZ2VkID0gMDsKKyAgICAgICAgICAgIGNvbmZpZ01vZGUgfD0gQUNfQ01fQUxMT0NfTUVNOwogCiAgICAgICAgICAgICBzYnJFcnJvciA9IHNickRlY29kZXJfSW5pdEVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIHNlbGYtPmhTYnJEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZXh0U2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hb3QsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX2VsZW1lbnRfaW5kZXgKLSAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBzZWxmLT5oU2JyRGVjb2Rlciwgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZXh0U2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lLCBzZWxmLT5zdHJlYW1JbmZvLmFvdCwgdHlwZSwKKyAgICAgICAgICAgICAgICBwcmV2aW91c19lbGVtZW50X2luZGV4LCAyLCAvKiBTaWduYWxpemUgdGhhdCBoYXJtb25pY1NCUiBzaGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGlnbm9yZWQgaW4gdGhlIGNvbmZpZyBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAwLCBjb25maWdNb2RlLCAmY29uZmlnQ2hhbmdlZCwgc2VsZi0+ZG93bnNjYWxlRmFjdG9yKTsKICAgICAgICAgICAgIGlmIChzYnJFcnJvciAhPSBTQlJERUNfT0spIHsKLSAgICAgICAgICAgICAgLyogRG8gbm90IHRyeSB0byBhcHBseSBTQlIgYmVjYXVzZSBpbml0aWFsaXppbmcgdGhlIGVsZW1lbnQgZmFpbGVkLiAqLworICAgICAgICAgICAgICAvKiBEbyBub3QgdHJ5IHRvIGFwcGx5IFNCUiBiZWNhdXNlIGluaXRpYWxpemluZyB0aGUgZWxlbWVudAorICAgICAgICAgICAgICAgKiBmYWlsZWQuICovCiAgICAgICAgICAgICAgIHNlbGYtPnNickVuYWJsZWQgPSAwOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGVsX2NudFt0eXBlXSsrOworICAgICAgICBpZiAoc2VsZi0+ZnJhbWVPSyAmJiAoc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdICYgQUNfVVNBQykgJiYKKyAgICAgICAgICAgICh0eXBlID09IElEX1VTQUNfQ1BFIHx8IHR5cGUgPT0gSURfVVNBQ19TQ0UpKSB7CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBhYWNEZWNvZGVyX1BhcnNlRXhwbGljaXRNcHNBbmRTYnIoCisgICAgICAgICAgICAgIHNlbGYsIGJzLCBwcmV2aW91c19lbGVtZW50LCBwcmV2aW91c19lbGVtZW50X2luZGV4LCBlbGVtZW50X2NvdW50LAorICAgICAgICAgICAgICBlbF9jbnQpOworICAgICAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKICAgICAgIGNhc2UgSURfQ0NFOgogICAgICAgICAvKgogICAgICAgICAgIENvbnNpc3RlbmN5IGNoZWNrCiAgICAgICAgICovCi0gICAgICAgIGlmICggZWxfY250W3R5cGVdID4gc2VsZi0+YXNjQ2hhbm5lbHMgKSB7CisgICAgICAgIGlmIChlbF9jbnRbdHlwZV0gPiBzZWxmLT5hc2NDaGFubmVsc1tzdHJlYW1JbmRleF0pIHsKICAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOwogICAgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHNlbGYtPmZyYW1lT0spCi0gICAgICAgIHsKKyAgICAgICAgaWYgKHNlbGYtPmZyYW1lT0spIHsKKyAgICAgICAgICBDQWFjRGVjb2RlckNvbW1vbkRhdGEgY29tbW9uRGF0YTsKKyAgICAgICAgICBDQWFjRGVjb2RlckNvbW1vblN0YXRpY0RhdGEgY29tbW9uU3RhdGljRGF0YTsKKyAgICAgICAgICBDV29ya0J1ZmZlckNvcmUxIHdvcmtCdWZmZXJDb3JlMTsKKyAgICAgICAgICBjb21tb25TdGF0aWNEYXRhLnBXb3JrQnVmZmVyQ29yZTEgPSAmd29ya0J1ZmZlckNvcmUxOwogICAgICAgICAgIC8qIG1lbW9yeSBmb3Igc3BlY3RyYWwgbGluZXMgdGVtcG9yYWwgb24gc2NyYXRjaCAqLwotICAgICAgICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChtZGN0U3BlYywgRklYUF9EQkwsIDEwMjQpOworICAgICAgICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQobWRjdFNwZWMsIEZJWFBfREJMLCAxMDI0KTsKIAogICAgICAgICAgIC8qIGNyZWF0ZSBkdW1teSBjaGFubmVsIGZvciBDQ0UgcGFyc2luZyBvbiBzdGFjayAqLwotICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gIHRtcEFhY0RlY29kZXJDaGFubmVsSW5mbywgKnBUbXBBYWNEZWNvZGVyQ2hhbm5lbEluZm87CisgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyB0bXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICpwVG1wQWFjRGVjb2RlckNoYW5uZWxJbmZvOwogCi0gICAgICAgICAgRkRLbWVtY2xlYXIobWRjdFNwZWMsIDEwMjQqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgRkRLbWVtY2xlYXIobWRjdFNwZWMsIDEwMjQgKiBzaXplb2YoRklYUF9EQkwpKTsKIAotICAgICAgICAgIHRtcEFhY0RlY29kZXJDaGFubmVsSW5mby5wRHluRGF0YSA9ICAgc2VsZi0+YWFjQ29tbW9uRGF0YS53b3JrQnVmZmVyQ29yZTEtPnBBYWNEZWNvZGVyRHluYW1pY0RhdGE7Ci0gICAgICAgICAgdG1wQWFjRGVjb2RlckNoYW5uZWxJbmZvLnBDb21EYXRhID0gICZzZWxmLT5hYWNDb21tb25EYXRhOwotICAgICAgICAgIHRtcEFhY0RlY29kZXJDaGFubmVsSW5mby5wU3BlY3RyYWxDb2VmZmljaWVudCAgPSAoU1BFQ1RSQUxfUFRSKW1kY3RTcGVjOworICAgICAgICAgIHRtcEFhY0RlY29kZXJDaGFubmVsSW5mby5wRHluRGF0YSA9IGNvbW1vbkRhdGEucEFhY0RlY29kZXJEeW5hbWljRGF0YTsKKyAgICAgICAgICB0bXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8ucENvbURhdGEgPSAmY29tbW9uRGF0YTsKKyAgICAgICAgICB0bXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8ucENvbVN0YXRpY0RhdGEgPSAmY29tbW9uU3RhdGljRGF0YTsKKyAgICAgICAgICB0bXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8ucFNwZWN0cmFsQ29lZmZpY2llbnQgPQorICAgICAgICAgICAgICAoU1BFQ1RSQUxfUFRSKW1kY3RTcGVjOwogICAgICAgICAgIC8qIEFzc3VtZSBBQUMtTEMgKi8KLSAgICAgICAgICB0bXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8uZ3JhbnVsZUxlbmd0aCA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lIC8gODsKLQorICAgICAgICAgIHRtcEFhY0RlY29kZXJDaGFubmVsSW5mby5ncmFudWxlTGVuZ3RoID0KKyAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgLyA4OwogICAgICAgICAgIC8qIFJlc2V0IFBOUyBkYXRhLiAqLwotICAgICAgICAgIENQbnNfUmVzZXREYXRhKCZ0bXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8uZGF0YS5hYWMuUG5zRGF0YSwgJnRtcEFhY0RlY29kZXJDaGFubmVsSW5mby5wQ29tRGF0YS0+cG5zSW50ZXJDaGFubmVsRGF0YSk7Ci0KKyAgICAgICAgICBDUG5zX1Jlc2V0RGF0YSgKKyAgICAgICAgICAgICAgJnRtcEFhY0RlY29kZXJDaGFubmVsSW5mby5kYXRhLmFhYy5QbnNEYXRhLAorICAgICAgICAgICAgICAmdG1wQWFjRGVjb2RlckNoYW5uZWxJbmZvLnBDb21EYXRhLT5wbnNJbnRlckNoYW5uZWxEYXRhKTsKICAgICAgICAgICBwVG1wQWFjRGVjb2RlckNoYW5uZWxJbmZvID0gJnRtcEFhY0RlY29kZXJDaGFubmVsSW5mbzsKICAgICAgICAgICAvKiBkbyBDQ0UgcGFyc2luZyAqLwotICAgICAgICAgIEVycm9yU3RhdHVzID0gQ0NoYW5uZWxFbGVtZW50X1JlYWQoIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBUbXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5zYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5lcENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5oSW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBDQ2hhbm5lbEVsZW1lbnRfUmVhZCgKKyAgICAgICAgICAgICAgYnMsICZwVG1wQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBOVUxMLCBzZWxmLT5zdHJlYW1JbmZvLmFvdCwKKyAgICAgICAgICAgICAgJnNlbGYtPnNhbXBsaW5nUmF0ZUluZm9bc3RyZWFtSW5kZXhdLCBzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0sCisgICAgICAgICAgICAgIEFDX0VMX0dBX0NDRSwgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUsIDEsCisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZXBDb25maWcsIHNlbGYtPmhJbnB1dCk7CiAKLSAgICAgICAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKG1kY3RTcGVjLCBGSVhQX0RCTCwgMTAyNCk7CisgICAgICAgICAgQ19BQUxMT0NfU0NSQVRDSF9FTkQobWRjdFNwZWMsIEZJWFBfREJMLCAxMDI0KTsKIAogICAgICAgICAgIGlmIChFcnJvclN0YXR1cykgewogICAgICAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7CiAgICAgICAgICAgfQogCiAgICAgICAgICAgaWYgKHNlbGYtPmZyYW1lT0spIHsKLSAgICAgICAgICAgIC8qIExvb2t1cCB0aGUgZWxlbWVudCBhbmQgZGVjb2RlIGl0IG9ubHkgaWYgaXQgYmVsb25ncyB0byB0aGUgY3VycmVudCBwcm9ncmFtICovCisgICAgICAgICAgICAvKiBMb29rdXAgdGhlIGVsZW1lbnQgYW5kIGRlY29kZSBpdCBvbmx5IGlmIGl0IGJlbG9uZ3MgdG8gdGhlCisgICAgICAgICAgICAgKiBjdXJyZW50IHByb2dyYW0gKi8KICAgICAgICAgICAgIGlmIChDUHJvZ3JhbUNvbmZpZ19Mb29rdXBFbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBwY2UsCi0gICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uY2hhbm5lbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgcFRtcEFhY0RlY29kZXJDaGFubmVsSW5mby0+RWxlbWVudEluc3RhbmNlVGFnLAotICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICBzZWxmLT5jaE1hcHBpbmcsCi0gICAgICAgICAgICAgICAgICAgIHNlbGYtPmNoYW5uZWxUeXBlLAotICAgICAgICAgICAgICAgICAgICBzZWxmLT5jaGFubmVsSW5kaWNlcywKLSAgICAgICAgICAgICAgICAgICAmcHJldmlvdXNfZWxlbWVudF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUpICkKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGNlLCBzZWxmLT5zdHJlYW1JbmZvLmNoYW5uZWxDb25maWcsCisgICAgICAgICAgICAgICAgICAgIHBUbXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPkVsZW1lbnRJbnN0YW5jZVRhZywgMCwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+Y2hNYXBwaW5nLCBzZWxmLT5jaGFubmVsVHlwZSwgc2VsZi0+Y2hhbm5lbEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICg4KSwgJnByZXZpb3VzX2VsZW1lbnRfaW5kZXgsIHNlbGYtPmVsZW1lbnRzLCB0eXBlKSkgewogICAgICAgICAgICAgICAvKiBkZWNvZGluZyBvZiBDQ0Ugbm90IHN1cHBvcnRlZCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CkBAIC0xNDA1LDE1NiArMjczMSwxNDUgQEAKICAgICAgICAgZWxfY250W3R5cGVdKys7CiAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIElEX0RTRToKLSAgICAgICAgewotICAgICAgICAgIFVDSEFSIGVsZW1lbnRfaW5zdGFuY2VfdGFnOworICAgICAgY2FzZSBJRF9EU0U6IHsKKyAgICAgICAgVUNIQVIgZWxlbWVudF9pbnN0YW5jZV90YWc7CiAKLSAgICAgICAgICBDRGF0YVN0cmVhbUVsZW1lbnRfUmVhZCggc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnRfaW5zdGFuY2VfdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdVN0YXJ0QW5jaG9yICk7CisgICAgICAgIENEYXRhU3RyZWFtRWxlbWVudF9SZWFkKHNlbGYsIGJzLCAmZWxlbWVudF9pbnN0YW5jZV90YWcsIGF1U3RhcnRBbmNob3IpOwogCi0gICAgICAgICAgaWYgKCFDUHJvZ3JhbUNvbmZpZ19Mb29rdXBFbGVtZW50KAotICAgICAgICAgICAgICAgICAgIHBjZSwKLSAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmNoYW5uZWxDb25maWcsCi0gICAgICAgICAgICAgICAgICAgZWxlbWVudF9pbnN0YW5jZV90YWcsCi0gICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICBzZWxmLT5jaE1hcHBpbmcsCi0gICAgICAgICAgICAgICAgICAgc2VsZi0+Y2hhbm5lbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgc2VsZi0+Y2hhbm5lbEluZGljZXMsCi0gICAgICAgICAgICAgICAgICAmcHJldmlvdXNfZWxlbWVudF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICBzZWxmLT5lbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICB0eXBlKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogbW9zdCBsaWtlbHkgYW4gZXJyb3IgaW4gYml0c3RyZWFtIG9jY3VyZWQgKi8KLSAgICAgICAgICAgIC8vc2VsZi0+ZnJhbWVPSyA9IDA7Ci0gICAgICAgICAgfQorICAgICAgICBpZiAoIUNQcm9ncmFtQ29uZmlnX0xvb2t1cEVsZW1lbnQoCisgICAgICAgICAgICAgICAgcGNlLCBzZWxmLT5zdHJlYW1JbmZvLmNoYW5uZWxDb25maWcsIGVsZW1lbnRfaW5zdGFuY2VfdGFnLCAwLAorICAgICAgICAgICAgICAgIHNlbGYtPmNoTWFwcGluZywgc2VsZi0+Y2hhbm5lbFR5cGUsIHNlbGYtPmNoYW5uZWxJbmRpY2VzLCAoOCksCisgICAgICAgICAgICAgICAgJnByZXZpb3VzX2VsZW1lbnRfaW5kZXgsIHNlbGYtPmVsZW1lbnRzLCB0eXBlKSkgeworICAgICAgICAgIC8qIG1vc3QgbGlrZWx5IGFuIGVycm9yIGluIGJpdHN0cmVhbSBvY2N1cmVkICovCisgICAgICAgICAgLy8gc2VsZi0+ZnJhbWVPSyA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICB9IGJyZWFrOwogCi0jaWZkZWYgVFBfUENFX0VOQUJMRQotICAgICAgY2FzZSBJRF9QQ0U6Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQgcmVzdWx0ID0gQ1Byb2dyYW1Db25maWdFbGVtZW50X1JlYWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmhJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uY2hhbm5lbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1U3RhcnRBbmNob3IgKTsKLSAgICAgICAgICBpZiAoIHJlc3VsdCA8IDAgKSB7Ci0gICAgICAgICAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZyAqLwotICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgY2FzZSBJRF9QQ0U6IHsKKyAgICAgICAgaW50IHJlc3VsdCA9IENQcm9ncmFtQ29uZmlnRWxlbWVudF9SZWFkKGJzLCBzZWxmLT5oSW5wdXQsIHBjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uY2hhbm5lbENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1U3RhcnRBbmNob3IpOworICAgICAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgICAgIC8qIFNvbWV0aGluZyB3ZW50IHdyb25nICovCisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOworICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA+IDEpIHsKKyAgICAgICAgICAvKiBCdWlsdCBlbGVtZW50IHRhYmxlICovCisgICAgICAgICAgaW50IGVsSWR4ID0gQ1Byb2dyYW1Db25maWdfR2V0RWxlbWVudFRhYmxlKAorICAgICAgICAgICAgICBwY2UsIHNlbGYtPmVsZW1lbnRzLCAoKCg4KSkgKyAoOCkpLCAmc2VsZi0+Y2hNYXBJbmRleCk7CisgICAgICAgICAgLyogUmVzZXQgdGhlIHJlbWFpbmluZyB0YWJzICovCisgICAgICAgICAgZm9yICg7IGVsSWR4IDwgKDMgKiAoKDgpICogMikgKyAoKCg4KSAqIDIpKSAvIDIgKyA0ICogKDEpICsgMSk7CisgICAgICAgICAgICAgICBlbElkeCsrKSB7CisgICAgICAgICAgICBzZWxmLT5lbGVtZW50c1tlbElkeF0gPSBJRF9OT05FOworICAgICAgICAgIH0KKyAgICAgICAgICAvKiBNYWtlIG5ldyBudW1iZXIgb2YgY2hhbm5lbCBwZXJzaXN0ZW50ICovCisgICAgICAgICAgc2VsZi0+YXNjQ2hhbm5lbHNbc3RyZWFtSW5kZXhdID0gcGNlLT5OdW1DaGFubmVsczsKKyAgICAgICAgICAvKiBJZiBQQ0UgaXMgbm90IGZpcnN0IGVsZW1lbnQgY29uY2VhbCB0aGlzIGZyYW1lIHRvIGF2b2lkCisgICAgICAgICAgICogaW5jb25zaXN0ZW5jaWVzICovCisgICAgICAgICAgaWYgKGVsZW1lbnRfY291bnQgIT0gMCkgewogICAgICAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7CiAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKCByZXN1bHQgPiAxICkgewotICAgICAgICAgICAgLyogQnVpbHQgZWxlbWVudCB0YWJsZSAqLwotICAgICAgICAgICAgaW50IGVsSWR4ID0gQ1Byb2dyYW1Db25maWdfR2V0RWxlbWVudFRhYmxlKHBjZSwgc2VsZi0+ZWxlbWVudHMsICg4KSwgJnNlbGYtPmNoTWFwSW5kZXgpOwotICAgICAgICAgICAgLyogUmVzZXQgdGhlIHJlbWFpbmluZyB0YWJzICovCi0gICAgICAgICAgICBmb3IgKCA7IGVsSWR4PCg4KTsgZWxJZHgrKykgewotICAgICAgICAgICAgICBzZWxmLT5lbGVtZW50c1tlbElkeF0gPSBJRF9OT05FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogTWFrZSBuZXcgbnVtYmVyIG9mIGNoYW5uZWwgcGVyc2lzdGFudCAqLwotICAgICAgICAgICAgc2VsZi0+YXNjQ2hhbm5lbHMgPSBwY2UtPk51bUNoYW5uZWxzOwotICAgICAgICAgICAgLyogSWYgUENFIGlzIG5vdCBmaXJzdCBlbGVtZW50IGNvbmNlYWwgdGhpcyBmcmFtZSB0byBhdm9pZCBpbmNvbnNpc3RlbmNpZXMgKi8KLSAgICAgICAgICAgIGlmICggZWxlbWVudF9jb3VudCAhPSAwICkgewotICAgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcGNlUmVhZCA9IChyZXN1bHQ+PTApID8gMSA6IDA7CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogVFBfUENFX0VOQUJMRSAqLworICAgICAgICBwY2VSZWFkID0gKHJlc3VsdCA+PSAwKSA/IDEgOiAwOworICAgICAgfSBicmVhazsKIAotICAgICAgY2FzZSBJRF9GSUw6Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQgYml0Q250ID0gRkRLcmVhZEJpdHMoYnMsNCk7ICAgICAgICAgICAvKiBic19jb3VudCAqLworICAgICAgY2FzZSBJRF9GSUw6IHsKKyAgICAgICAgaW50IGJpdENudCA9IEZES3JlYWRCaXRzKGJzLCA0KTsgLyogYnNfY291bnQgKi8KIAotICAgICAgICAgIGlmIChiaXRDbnQgPT0gMTUpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW50IGVzY19jb3VudCA9IEZES3JlYWRCaXRzKGJzLDgpOyAgICAgLyogYnNfZXNjX2NvdW50ICovCi0gICAgICAgICAgICBiaXRDbnQgPSAgZXNjX2NvdW50ICsgMTQ7Ci0gICAgICAgICAgfQorICAgICAgICBpZiAoYml0Q250ID09IDE1KSB7CisgICAgICAgICAgaW50IGVzY19jb3VudCA9IEZES3JlYWRCaXRzKGJzLCA4KTsgLyogYnNfZXNjX2NvdW50ICovCisgICAgICAgICAgYml0Q250ID0gZXNjX2NvdW50ICsgMTQ7CisgICAgICAgIH0KIAotICAgICAgICAgIC8qIENvbnZlcnQgdG8gYml0cyAqLwotICAgICAgICAgIGJpdENudCA8PD0gMzsKKyAgICAgICAgLyogQ29udmVydCB0byBiaXRzICovCisgICAgICAgIGJpdENudCA8PD0gMzsKIAotICAgICAgICAgIHdoaWxlIChiaXRDbnQgPiAwKSB7Ci0gICAgICAgICAgICBFcnJvclN0YXR1cyA9IENBYWNEZWNvZGVyX0V4dFBheWxvYWRQYXJzZShzZWxmLCBicywgJmJpdENudCwgcHJldmlvdXNfZWxlbWVudCwgcHJldmlvdXNfZWxlbWVudF9pbmRleCwgMSk7Ci0gICAgICAgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19PSykgewotICAgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CisgICAgICAgIHdoaWxlIChiaXRDbnQgPiAwKSB7CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBDQWFjRGVjb2Rlcl9FeHRQYXlsb2FkUGFyc2UoCisgICAgICAgICAgICAgIHNlbGYsIGJzLCAmYml0Q250LCBwcmV2aW91c19lbGVtZW50LCBwcmV2aW91c19lbGVtZW50X2luZGV4LCAxKTsKKyAgICAgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICB9IGJyZWFrOwogCiAgICAgICBjYXNlIElEX0VYVDoKLSAgICAgICAgewotICAgICAgICAgIElOVCBiaXRDbnQgPSAwOwotCi0gICAgICAgICAgLyogZ2V0IHRoZSByZW1haW5pbmcgYml0cyBvZiB0aGlzIGZyYW1lICovCi0gICAgICAgICAgYml0Q250ID0gdHJhbnNwb3J0RGVjX0dldEF1Qml0c1JlbWFpbmluZyhzZWxmLT5oSW5wdXQsIDApOwotCi0gICAgICAgICAgaWYgKCAoYml0Q250ID4gMCkgJiYgKHNlbGYtPmZsYWdzICYgQUNfU0JSX1BSRVNFTlQpICYmIChzZWxmLT5mbGFncyAmIChBQ19VU0FDfEFDX1JTVkQ1MHxBQ19FTER8QUNfRFJNKSkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFNCUl9FUlJPUiBlcnIgPSBTQlJERUNfT0s7Ci0gICAgICAgICAgICBpbnQgIGVsSWR4LCBudW1DaEVsZW1lbnRzID0gZWxfY250W0lEX1NDRV0gKyBlbF9jbnRbSURfQ1BFXTsKLQotICAgICAgICAgICAgZm9yIChlbElkeCA9IDA7IGVsSWR4IDwgbnVtQ2hFbGVtZW50czsgZWxJZHggKz0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZXJyID0gc2JyRGVjb2Rlcl9QYXJzZSAoCi0gICAgICAgICAgICAgICAgICAgIHNlbGYtPmhTYnJEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICBicywKLSAgICAgICAgICAgICAgICAgICAmYml0Q250LAotICAgICAgICAgICAgICAgICAgICAtMSwKLSAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3MgJiBBQ19TQlJDUkMsCi0gICAgICAgICAgICAgICAgICAgIHNlbGYtPmVsZW1lbnRzW2VsSWR4XSwKLSAgICAgICAgICAgICAgICAgICAgZWxJZHgsCi0gICAgICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzICYgQUNfSU5ERVAgKTsKLQotICAgICAgICAgICAgICBpZiAoZXJyICE9IFNCUkRFQ19PSykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGVycikgewotICAgICAgICAgICAgY2FzZSBTQlJERUNfUEFSU0VfRVJST1I6Ci0gICAgICAgICAgICAgIC8qIENhbiBub3QgZ28gb24gcGFyc2luZyBiZWNhdXNlIHdlIGRvIG5vdAotICAgICAgICAgICAgICAgICBrbm93IHRoZSBsZW5ndGggb2YgdGhlIFNCUiBleHRlbnNpb24gZGF0YS4gKi8KLSAgICAgICAgICAgICAgRkRLcHVzaEZvcihicywgYml0Q250KTsKLSAgICAgICAgICAgICAgYml0Q250ID0gMDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNCUkRFQ19PSzoKLSAgICAgICAgICAgICAgc2VsZi0+c2JyRW5hYmxlZCA9IDE7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgaWYgKHNlbGYtPmZsYWdzICYgQUNfRFJNKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoYml0Q250ID0gKElOVClGREtnZXRWYWxpZEJpdHMoYnMpKSAhPSAwKSB7Ci0gICAgICAgICAgICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGJzLCBiaXRDbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggISAoc2VsZi0+ZmxhZ3MgJiAoQUNfVVNBQ3xBQ19SU1ZENTB8QUNfRFJNKSkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlICggYml0Q250ID4gNyApIHsKLSAgICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBDQWFjRGVjb2Rlcl9FeHRQYXlsb2FkUGFyc2Uoc2VsZiwgYnMsICZiaXRDbnQsIHByZXZpb3VzX2VsZW1lbnQsIHByZXZpb3VzX2VsZW1lbnRfaW5kZXgsIDApOwotICAgICAgICAgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19PSykgewotICAgICAgICAgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOwotICAgICAgICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBFcnJvclN0YXR1cyA9IGFhY0RlY29kZXJfUGFyc2VFeHBsaWNpdE1wc0FuZFNicigKKyAgICAgICAgICAgIHNlbGYsIGJzLCBwcmV2aW91c19lbGVtZW50LCBwcmV2aW91c19lbGVtZW50X2luZGV4LCBlbGVtZW50X2NvdW50LAorICAgICAgICAgICAgZWxfY250KTsKICAgICAgICAgYnJlYWs7CiAKKyAgICAgIGNhc2UgSURfVVNBQ19FWFQ6IHsKKyAgICAgICAgLyogcGFyc2UgZXh0ZW5zaW9uIGVsZW1lbnQgcGF5bG9hZAorICAgICAgICAgICBxLnYuIHJzdjYwM2RhRXh0RWxlbWVudCgpIElTTy9JRUMgRElTIDIzMDA4LTMgIFRhYmxlIDMwCisgICAgICAgICAgIG9yICAgVXNhY0V4RWxlbWVudCgpIElTTy9JRUMgRkRJUyAyMzAwMy0zOjIwMTEoRSkgIFRhYmxlIDIxCisgICAgICAgICAqLworICAgICAgICBpbnQgdXNhY0V4dEVsZW1lbnRQYXlsb2FkTGVuZ3RoOworICAgICAgICAvKiBpbnQgdXNhY0V4dEVsZW1lbnRTdGFydCwgdXNhY0V4dEVsZW1lbnRTdG9wOyAqLworCisgICAgICAgIGlmIChGREtyZWFkQml0KGJzKSkgeyAgIC8qIHVzYWNFeHRFbGVtZW50UHJlc2VudCAqLworICAgICAgICAgIGlmIChGREtyZWFkQml0KGJzKSkgeyAvKiB1c2FjRXh0RWxlbWVudFVzZURlZmF1bHRMZW5ndGggKi8KKyAgICAgICAgICAgIHVzYWNFeHRFbGVtZW50UGF5bG9hZExlbmd0aCA9CisgICAgICAgICAgICAgICAgc2VsZi0+cFVzYWNDb25maWdbc3RyZWFtSW5kZXhdCisgICAgICAgICAgICAgICAgICAgIC0+ZWxlbWVudFtlbGVtZW50X2NvdW50IC0gZWxlbWVudF9jb3VudF9wcmV2X3N0cmVhbXNdCisgICAgICAgICAgICAgICAgICAgIC5leHRFbGVtZW50LnVzYWNFeHRFbGVtZW50RGVmYXVsdExlbmd0aDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXNhY0V4dEVsZW1lbnRQYXlsb2FkTGVuZ3RoID0gRkRLcmVhZEJpdHMoYnMsIDgpOworICAgICAgICAgICAgaWYgKHVzYWNFeHRFbGVtZW50UGF5bG9hZExlbmd0aCA9PSAoVUlOVCkoMSA8PCA4KSAtIDEpIHsKKyAgICAgICAgICAgICAgVUlOVCB2YWx1ZUFkZCA9IEZES3JlYWRCaXRzKGJzLCAxNik7CisgICAgICAgICAgICAgIHVzYWNFeHRFbGVtZW50UGF5bG9hZExlbmd0aCArPSAoSU5UKXZhbHVlQWRkIC0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHVzYWNFeHRFbGVtZW50UGF5bG9hZExlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGludCB1c2FjRXh0Qml0UG9zOworCisgICAgICAgICAgICBpZiAoc2VsZi0+cFVzYWNDb25maWdbc3RyZWFtSW5kZXhdCisgICAgICAgICAgICAgICAgICAgIC0+ZWxlbWVudFtlbGVtZW50X2NvdW50IC0gZWxlbWVudF9jb3VudF9wcmV2X3N0cmVhbXNdCisgICAgICAgICAgICAgICAgICAgIC5leHRFbGVtZW50LnVzYWNFeHRFbGVtZW50UGF5bG9hZEZyYWcpIHsKKyAgICAgICAgICAgICAgLyogdXNhY0V4dEVsZW1lbnRTdGFydCA9ICovIEZES3JlYWRCaXQoYnMpOworICAgICAgICAgICAgICAvKiB1c2FjRXh0RWxlbWVudFN0b3AgPSAqLyBGREtyZWFkQml0KGJzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8qIHVzYWNFeHRFbGVtZW50U3RhcnQgPSAxOyAqLworICAgICAgICAgICAgICAvKiB1c2FjRXh0RWxlbWVudFN0b3AgPSAxOyAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1c2FjRXh0Qml0UG9zID0gKElOVClGREtnZXRWYWxpZEJpdHMoYnMpOworCisgICAgICAgICAgICBVU0FDX0VYVF9FTEVNRU5UX1RZUEUgdXNhY0V4dEVsZW1lbnRUeXBlID0KKyAgICAgICAgICAgICAgICBzZWxmLT5wVXNhY0NvbmZpZ1tzdHJlYW1JbmRleF0KKyAgICAgICAgICAgICAgICAgICAgLT5lbGVtZW50W2VsZW1lbnRfY291bnQgLSBlbGVtZW50X2NvdW50X3ByZXZfc3RyZWFtc10KKyAgICAgICAgICAgICAgICAgICAgLmV4dEVsZW1lbnQudXNhY0V4dEVsZW1lbnRUeXBlOworCisgICAgICAgICAgICBzd2l0Y2ggKHVzYWNFeHRFbGVtZW50VHlwZSkgeworICAgICAgICAgICAgICBjYXNlIElEX0VYVF9FTEVfVU5JX0RSQzogLyogdW5pRHJjR2FpbigpICovCisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUluZGV4ID09IDApIHsKKyAgICAgICAgICAgICAgICAgIGludCBkcmNFcnI7CisKKyAgICAgICAgICAgICAgICAgIGRyY0VyciA9IEZES19kcmNEZWNfUmVhZFVuaURyY0dhaW4oc2VsZi0+aFVuaURyY0RlY29kZXIsIGJzKTsKKyAgICAgICAgICAgICAgICAgIGlmIChkcmNFcnIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNraXAgYW55IHJlbWFpbmluZyBiaXRzIG9mIGV4dGVuc2lvbiBwYXlsb2FkICovCisgICAgICAgICAgICB1c2FjRXh0Qml0UG9zID0gKHVzYWNFeHRFbGVtZW50UGF5bG9hZExlbmd0aCAqIDgpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNhY0V4dEJpdFBvcyAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKSk7CisgICAgICAgICAgICBpZiAodXNhY0V4dEJpdFBvcyA8IDApIHsKKyAgICAgICAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7CisgICAgICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGJzLCB1c2FjRXh0Qml0UG9zKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CiAgICAgICBjYXNlIElEX0VORDoKKyAgICAgIGNhc2UgSURfVVNBQ19FTkQ6CiAgICAgICAgIGJyZWFrOwogCiAgICAgICBkZWZhdWx0OgpAQCAtMTU2NiwzMiArMjg4MSw1NiBAQAogICAgIHByZXZpb3VzX2VsZW1lbnQgPSB0eXBlOwogICAgIGVsZW1lbnRfY291bnQrKzsKIAotICB9ICAgLyogd2hpbGUgKCAodHlwZSAhPSBJRF9FTkQpIC4uLiApICovCisgIH0gLyogd2hpbGUgKCAodHlwZSAhPSBJRF9FTkQpIC4uLiApICovCiAKLSAgaWYgKCAhKGZsYWdzICYgKEFBQ0RFQ19DT05DRUFMfEFBQ0RFQ19GTFVTSCkpICkKLSAgeworICBpZiAoIShmbGFncyAmIChBQUNERUNfQ09OQ0VBTCB8IEFBQ0RFQ19GTFVTSCkpKSB7CisgICAgLyogZmxvYXQgZGVjb2RlciBjaGVja3MgaWYgYml0c0xlZnQgaXMgaW4gcmFuZ2UgMC03OyBvbmx5IHByZXJvbGxBVXMgYXJlCisgICAgICogYnl0ZUFsaWduZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBmaXJzdCBiaXQgKi8KICAgICAvKiBCeXRlIGFsaWdubWVudCB3aXRoIHJlc3BlY3QgdG8gdGhlIGZpcnN0IGJpdCBvZiB0aGUgcmF3X2RhdGFfYmxvY2soKS4gKi8KLSAgICB7CisgICAgaWYgKCEoc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdICYgKEFDX1JTVkQ1MCB8IEFDX1VTQUMpKSB8fAorICAgICAgICAoc2VsZi0+cHJlcm9sbEFVTGVuZ3RoW3NlbGYtPmFjY2Vzc1VuaXRdKSAvKiBpbmRpY2F0ZXMgcHJlcm9sbCAqLworICAgICkgewogICAgICAgRkRLYnl0ZUFsaWduKGJzLCBhdVN0YXJ0QW5jaG9yKTsKICAgICB9CiAKICAgICAvKiBDaGVjayBpZiBhbGwgYml0cyBvZiB0aGUgcmF3X2RhdGFfYmxvY2soKSBoYXZlIGJlZW4gcmVhZC4gKi8KLSAgICBpZiAoIHRyYW5zcG9ydERlY19HZXRBdUJpdHNUb3RhbChzZWxmLT5oSW5wdXQsIDApID4gMCApIHsKKyAgICBpZiAodHJhbnNwb3J0RGVjX0dldEF1Qml0c1RvdGFsKHNlbGYtPmhJbnB1dCwgMCkgPiAwKSB7CiAgICAgICBJTlQgdW5yZWFkQml0cyA9IHRyYW5zcG9ydERlY19HZXRBdUJpdHNSZW1haW5pbmcoc2VsZi0+aElucHV0LCAwKTsKLSAgICAgIGlmICggdW5yZWFkQml0cyAhPSAwICkgeworICAgICAgLyogZm9yIHByZS1yb2xsIGZyYW1lcyBwcmUtcm9sbCBsZW5ndGggaGFzIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0b3RhbCBBVQorICAgICAgICogbGVuZ2h0ICovCisgICAgICAvKiB1bnJlYWRCaXRzIHJlZ2FyZGluZyBwcmVyb2xsIGJvdW5kcyAqLworICAgICAgaWYgKHNlbGYtPnByZXJvbGxBVUxlbmd0aFtzZWxmLT5hY2Nlc3NVbml0XSkgeworICAgICAgICB1bnJlYWRCaXRzID0gdW5yZWFkQml0cyAtIHRyYW5zcG9ydERlY19HZXRBdUJpdHNUb3RhbChzZWxmLT5oSW5wdXQsIDApICsKKyAgICAgICAgICAgICAgICAgICAgIChJTlQpc2VsZi0+cHJlcm9sbEFVTGVuZ3RoW3NlbGYtPmFjY2Vzc1VuaXRdOworICAgICAgfQorICAgICAgaWYgKCgoc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdICYgKEFDX1JTVkQ1MCB8IEFDX1VTQUMpKSAmJgorICAgICAgICAgICAoKHVucmVhZEJpdHMgPCAwKSB8fCAodW5yZWFkQml0cyA+IDcpKSAmJgorICAgICAgICAgICAhKHNlbGYtPnByZXJvbGxBVUxlbmd0aFtzZWxmLT5hY2Nlc3NVbml0XSkpIHx8CisgICAgICAgICAgKCghKHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSAmIChBQ19SU1ZENTAgfCBBQ19VU0FDKSkgfHwKKyAgICAgICAgICAgIChzZWxmLT5wcmVyb2xsQVVMZW5ndGhbc2VsZi0+YWNjZXNzVW5pdF0pKSAmJgorICAgICAgICAgICAodW5yZWFkQml0cyAhPSAwKSkpIHsKKyAgICAgICAgaWYgKCgoKHVucmVhZEJpdHMgPCAwKSB8fCAodW5yZWFkQml0cyA+IDcpKSAmJiBzZWxmLT5mcmFtZU9LKSAmJgorICAgICAgICAgICAgKCh0cmFuc3BvcnREZWNfR2V0Rm9ybWF0KHNlbGYtPmhJbnB1dCkgPT0gVFRfRFJNKSAmJgorICAgICAgICAgICAgIChzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gJiBBQ19VU0FDKSkpIHsKKyAgICAgICAgICAvKiBTZXQgZnJhbWUgT0sgYmVjYXVzZSBvZiBmaWxsIGJpdHMuICovCisgICAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7CisgICAgICAgIH0KIAotICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKICAgICAgICAgLyogRG8gbm90IG92ZXJ3cml0ZSBjdXJyZW50IGVycm9yICovCiAgICAgICAgIGlmIChFcnJvclN0YXR1cyA9PSBBQUNfREVDX09LICYmIHNlbGYtPmZyYW1lT0sgPT0gMCkgewogICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKICAgICAgICAgfQotICAgICAgICAvKiBBbHdheXMgcHV0IHRoZSBiaXRidWZmZXIgYXQgdGhlIHJpZ2h0IHBvc2l0aW9uIGFmdGVyIHRoZSBjdXJyZW50IEFjY2VzcyBVbml0LiAqLworICAgICAgICAvKiBBbHdheXMgcHV0IHRoZSBiaXRidWZmZXIgYXQgdGhlIHJpZ2h0IHBvc2l0aW9uIGFmdGVyIHRoZSBjdXJyZW50CisgICAgICAgICAqIEFjY2VzcyBVbml0LiAqLwogICAgICAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywgdW5yZWFkQml0cyk7CiAgICAgICB9CiAgICAgfQogCi0gICAgLyogQ2hlY2sgdGhlIGxhc3QgZWxlbWVudC4gVGhlIHRlcm1pbmF0b3IgKElEX0VORCkgaGFzIHRvIGJlIHRoZSBsYXN0IG9uZSAoZXZlbiBpZiBFUiBzeW50YXggaXMgdXNlZCkuICovCi0gICAgaWYgKCBzZWxmLT5mcmFtZU9LICYmIHR5cGUgIT0gSURfRU5EICkgeworICAgIC8qIENoZWNrIHRoZSBsYXN0IGVsZW1lbnQuIFRoZSB0ZXJtaW5hdG9yIChJRF9FTkQpIGhhcyB0byBiZSB0aGUgbGFzdCBvbmUKKyAgICAgKiAoZXZlbiBpZiBFUiBzeW50YXggaXMgdXNlZCkuICovCisgICAgaWYgKHNlbGYtPmZyYW1lT0sgJiYgdHlwZSAhPSBJRF9FTkQpIHsKICAgICAgIC8qIERvIG5vdCBvdmVyd3JpdGUgY3VycmVudCBlcnJvciAqLwogICAgICAgaWYgKEVycm9yU3RhdHVzID09IEFBQ19ERUNfT0spIHsKICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1BBUlNFX0VSUk9SOwpAQCAtMTYwMCwyMTkgKzI5MzksNDc5IEBACiAgICAgfQogICB9CiAKLSAgLyogTW9yZSBBQUMgY2hhbm5lbHMgdGhhbiBzcGVjaWZpZWQgYnkgdGhlIEFTQyBub3QgYWxsb3dlZC4gKi8KLSAgaWYgKCAoYWFjQ2hhbm5lbHMgPT0gMCB8fCBhYWNDaGFubmVscyA+IHNlbGYtPmFhY0NoYW5uZWxzKSAmJiAhKGZsYWdzICYgKEFBQ0RFQ19DT05DRUFMfEFBQ0RFQ19GTFVTSCkpICkgewotICAgIHsKLSAgICAgIC8qIERvIG5vdCBvdmVyd3JpdGUgY3VycmVudCBlcnJvciAqLwotICAgICAgaWYgKEVycm9yU3RhdHVzID09IEFBQ19ERUNfT0spIHsKLSAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKLSAgICAgIH0KLSAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOwotICAgIH0KLSAgICBhYWNDaGFubmVscyA9IDA7CisgIGlmICghKGZsYWdzICYgKEFBQ0RFQ19DT05DRUFMIHwgQUFDREVDX0ZMVVNIKSkgJiYgc2VsZi0+ZnJhbWVPSykgeworICAgIGNoYW5uZWxfZWxlbWVudHNbY2hhbm5lbF9lbGVtZW50X2NvdW50KytdID0gSURfRU5EOwogICB9Ci0gIGVsc2UgaWYgKCBhYWNDaGFubmVscyA+IHNlbGYtPmFzY0NoYW5uZWxzICkgeworICBlbGVtZW50X2NvdW50ID0gMDsKKyAgYWFjQ2hhbm5lbHMgPSAwOworICB0eXBlID0gSURfTk9ORTsKKyAgcHJldmlvdXNfZWxlbWVudF9pbmRleCA9IDA7CisKKyAgd2hpbGUgKHR5cGUgIT0gSURfRU5EICYmCisgICAgICAgICBlbGVtZW50X2NvdW50IDwgKDMgKiAoKDgpICogMikgKyAoKCg4KSAqIDIpKSAvIDIgKyA0ICogKDEpICsgMSkpIHsKKyAgICBpbnQgZWxfY2hhbm5lbHM7CisKKyAgICBpZiAoKGZsYWdzICYgKEFBQ0RFQ19DT05DRUFMIHwgQUFDREVDX0ZMVVNIKSkgfHwgIXNlbGYtPmZyYW1lT0spIHsKKyAgICAgIGNoYW5uZWxfZWxlbWVudHNbZWxlbWVudF9jb3VudF0gPSBzZWxmLT5lbGVtZW50c1tlbGVtZW50X2NvdW50XTsKKyAgICAgIGlmIChjaGFubmVsX2VsZW1lbnRzW2VsZW1lbnRfY291bnRdID09IElEX05PTkUpIHsKKyAgICAgICAgY2hhbm5lbF9lbGVtZW50c1tlbGVtZW50X2NvdW50XSA9IElEX0VORDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdICYgKEFDX1VTQUMgfCBBQ19SU1Y2MDNEQSB8IEFDX0JTQUMpKSB7CisgICAgICB0eXBlID0gc2VsZi0+ZWxlbWVudHNbZWxlbWVudF9jb3VudF07CisgICAgfSBlbHNlIHsKKyAgICAgIHR5cGUgPSBjaGFubmVsX2VsZW1lbnRzW2VsZW1lbnRfY291bnRdOworICAgIH0KKworICAgIGlmICghKGZsYWdzICYgKEFBQ0RFQ19DT05DRUFMIHwgQUFDREVDX0ZMVVNIKSkgJiYgc2VsZi0+ZnJhbWVPSykgeworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgSURfU0NFOgorICAgICAgICBjYXNlIElEX0NQRToKKyAgICAgICAgY2FzZSBJRF9MRkU6CisgICAgICAgIGNhc2UgSURfVVNBQ19TQ0U6CisgICAgICAgIGNhc2UgSURfVVNBQ19DUEU6CisgICAgICAgIGNhc2UgSURfVVNBQ19MRkU6CisKKyAgICAgICAgICBlbF9jaGFubmVscyA9IENBYWNEZWNvZGVyX0dldEVMQ2hhbm5lbHMoCisgICAgICAgICAgICAgIHR5cGUsIHNlbGYtPnVzYWNTdGVyZW9Db25maWdJbmRleFtlbGVtZW50X2NvdW50XSk7CisKKyAgICAgICAgICBpZiAoIWhkYWFjRGVjb2RlZCkgeworICAgICAgICAgICAgaWYgKHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bYWFjQ2hhbm5lbHNdCisgICAgICAgICAgICAgICAgICAgIC0+cENwZVN0YXRpY0RhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2FhY0NoYW5uZWxzXQorICAgICAgICAgICAgICAgICAgLT5wQ3BlU3RhdGljRGF0YS0+am9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS5zY3JhdGNoQnVmZmVyID0KKyAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCAqKXBUaW1lRGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENDaGFubmVsRWxlbWVudF9EZWNvZGUoCisgICAgICAgICAgICAgICAgJnNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bYWFjQ2hhbm5lbHNdLAorICAgICAgICAgICAgICAgICZzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2FhY0NoYW5uZWxzXSwKKyAgICAgICAgICAgICAgICAmc2VsZi0+c2FtcGxpbmdSYXRlSW5mb1tzdHJlYW1JbmRleF0sIHNlbGYtPmZsYWdzW3N0cmVhbUluZGV4XSwKKyAgICAgICAgICAgICAgICBzZWxmLT5lbEZsYWdzW2VsZW1lbnRfY291bnRdLCBlbF9jaGFubmVscyk7CisgICAgICAgICAgfQorICAgICAgICAgIGFhY0NoYW5uZWxzICs9IGVsX2NoYW5uZWxzOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElEX05PTkU6CisgICAgICAgICAgdHlwZSA9IElEX0VORDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgZWxlbWVudF9jb3VudCsrOworICB9CisKKyAgLyogTW9yZSBBQUMgY2hhbm5lbHMgdGhhbiBzcGVjaWZpZWQgYnkgdGhlIEFTQyBub3QgYWxsb3dlZC4gKi8KKyAgaWYgKChhYWNDaGFubmVscyA9PSAwIHx8IGFhY0NoYW5uZWxzID4gc2VsZi0+YWFjQ2hhbm5lbHMpICYmCisgICAgICAhKGZsYWdzICYgKEFBQ0RFQ19DT05DRUFMIHwgQUFDREVDX0ZMVVNIKSkpIHsKICAgICAvKiBEbyBub3Qgb3ZlcndyaXRlIGN1cnJlbnQgZXJyb3IgKi8KICAgICBpZiAoRXJyb3JTdGF0dXMgPT0gQUFDX0RFQ19PSykgewotICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CiAgICAgfQogICAgIHNlbGYtPmZyYW1lT0sgPSAwOwogICAgIGFhY0NoYW5uZWxzID0gMDsKICAgfQogCi0gIGlmICggVFJBTlNQT1JUREVDX09LICE9IHRyYW5zcG9ydERlY19DcmNDaGVjayhzZWxmLT5oSW5wdXQpICkKLSAgewotICAgIHNlbGYtPmZyYW1lT0s9MDsKKyAgaWYgKFRSQU5TUE9SVERFQ19PSyAhPSB0cmFuc3BvcnREZWNfQ3JjQ2hlY2soc2VsZi0+aElucHV0KSkgeworICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19DUkNfRVJST1I7CisgICAgc2VsZi0+ZnJhbWVPSyA9IDA7CiAgIH0KIAotICAvKiBzdG9yZSBvciByZXN0b3JlIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGluZm8gKi8KLSAgaWYgKCBzZWxmLT5mcmFtZU9LICYmICEoZmxhZ3MgJihBQUNERUNfQ09OQ0VBTHxBQUNERUNfRkxVU0gpKSApIHsKLSAgICBzZWxmLT5hYWNDaGFubmVsc1ByZXYgPSBhYWNDaGFubmVsczsgIC8qIHN0b3JlICovCi0gICAgRkRLbWVtY3B5KHNlbGYtPmNoYW5uZWxUeXBlUHJldiwgc2VsZi0+Y2hhbm5lbFR5cGUsICg4KSpzaXplb2YoQVVESU9fQ0hBTk5FTF9UWVBFKSk7ICAvKiBzdG9yZSAqLwotICAgIEZES21lbWNweShzZWxmLT5jaGFubmVsSW5kaWNlc1ByZXYsIHNlbGYtPmNoYW5uZWxJbmRpY2VzLCAoOCkqc2l6ZW9mKFVDSEFSKSk7ICAgICAgICAgLyogc3RvcmUgKi8KLSAgICBzZWxmLT5zYnJFbmFibGVkUHJldiA9IHNlbGYtPnNickVuYWJsZWQ7CisgIC8qIEVuc3VyZSB0aGF0IGluIGNhc2Ugb2YgY29uY2VhbG1lbnQgYSBwcm9wZXIgZXJyb3Igc3RhdHVzIGlzIHNldC4gKi8KKyAgaWYgKChzZWxmLT5mcmFtZU9LID09IDApICYmIChFcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKSkgeworICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CisgIH0KKworICBpZiAoc2VsZi0+ZnJhbWVPSyAmJiAoZmxhZ3MgJiBBQUNERUNfRkxVU0gpKSB7CisgICAgYWFjQ2hhbm5lbHMgPSBzZWxmLT5hYWNDaGFubmVsc1ByZXY7CisgICAgLyogQmVjYXVzZSB0aGUgZG93bm1peCBjb3VsZCBiZSBhY3RpdmUsIGl0cyBuZWNlc3NhcnkgdG8gcmVzdG9yZSB0aGUgY2hhbm5lbAorICAgICAqIHR5cGUgYW5kIGluZGljZXMuICovCisgICAgRkRLbWVtY3B5KHNlbGYtPmNoYW5uZWxUeXBlLCBzZWxmLT5jaGFubmVsVHlwZVByZXYsCisgICAgICAgICAgICAgICg4KSAqIHNpemVvZihBVURJT19DSEFOTkVMX1RZUEUpKTsgLyogcmVzdG9yZSAqLworICAgIEZES21lbWNweShzZWxmLT5jaGFubmVsSW5kaWNlcywgc2VsZi0+Y2hhbm5lbEluZGljZXNQcmV2LAorICAgICAgICAgICAgICAoOCkgKiBzaXplb2YoVUNIQVIpKTsgLyogcmVzdG9yZSAqLworICAgIHNlbGYtPnNickVuYWJsZWQgPSBzZWxmLT5zYnJFbmFibGVkUHJldjsKICAgfSBlbHNlIHsKLSAgICBpZiAoc2VsZi0+YWFjQ2hhbm5lbHMgPiAwKSB7Ci0gICAgICBhYWNDaGFubmVscyA9IHNlbGYtPmFhY0NoYW5uZWxzUHJldjsgIC8qIHJlc3RvcmUgKi8KLSAgICAgIEZES21lbWNweShzZWxmLT5jaGFubmVsVHlwZSwgc2VsZi0+Y2hhbm5lbFR5cGVQcmV2LCAoOCkqc2l6ZW9mKEFVRElPX0NIQU5ORUxfVFlQRSkpOyAgLyogcmVzdG9yZSAqLwotICAgICAgRkRLbWVtY3B5KHNlbGYtPmNoYW5uZWxJbmRpY2VzLCBzZWxmLT5jaGFubmVsSW5kaWNlc1ByZXYsICg4KSpzaXplb2YoVUNIQVIpKTsgICAgICAgICAvKiByZXN0b3JlICovCi0gICAgICBzZWxmLT5zYnJFbmFibGVkID0gc2VsZi0+c2JyRW5hYmxlZFByZXY7Ci0gICAgIH0KKyAgICAvKiBzdG9yZSBvciByZXN0b3JlIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGluZm8gKi8KKyAgICBpZiAoc2VsZi0+ZnJhbWVPSyAmJiAhKGZsYWdzICYgQUFDREVDX0NPTkNFQUwpKSB7CisgICAgICBzZWxmLT5hYWNDaGFubmVsc1ByZXYgPSBhYWNDaGFubmVsczsgLyogc3RvcmUgKi8KKyAgICAgIEZES21lbWNweShzZWxmLT5jaGFubmVsVHlwZVByZXYsIHNlbGYtPmNoYW5uZWxUeXBlLAorICAgICAgICAgICAgICAgICg4KSAqIHNpemVvZihBVURJT19DSEFOTkVMX1RZUEUpKTsgLyogc3RvcmUgKi8KKyAgICAgIEZES21lbWNweShzZWxmLT5jaGFubmVsSW5kaWNlc1ByZXYsIHNlbGYtPmNoYW5uZWxJbmRpY2VzLAorICAgICAgICAgICAgICAgICg4KSAqIHNpemVvZihVQ0hBUikpOyAvKiBzdG9yZSAqLworICAgICAgc2VsZi0+c2JyRW5hYmxlZFByZXYgPSBzZWxmLT5zYnJFbmFibGVkOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoc2VsZi0+YWFjQ2hhbm5lbHMgPiAwKSB7CisgICAgICAgIGlmICgoc2VsZi0+YnVpbGRVcFN0YXR1cyA9PSBBQUNERUNfUlNWNjBfQlVJTERfVVBfT04pIHx8CisgICAgICAgICAgICAoc2VsZi0+YnVpbGRVcFN0YXR1cyA9PSBBQUNERUNfUlNWNjBfQlVJTERfVVBfT05fSU5fQkFORCkgfHwKKyAgICAgICAgICAgIChzZWxmLT5idWlsZFVwU3RhdHVzID09IEFBQ0RFQ19VU0FDX0JVSUxEX1VQX09OKSkgeworICAgICAgICAgIGFhY0NoYW5uZWxzID0gc2VsZi0+YWFjQ2hhbm5lbHM7CisgICAgICAgICAgc2VsZi0+YWFjQ2hhbm5lbHNQcmV2ID0gYWFjQ2hhbm5lbHM7IC8qIHN0b3JlICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYWFjQ2hhbm5lbHMgPSBzZWxmLT5hYWNDaGFubmVsc1ByZXY7IC8qIHJlc3RvcmUgKi8KKyAgICAgICAgfQorICAgICAgICBGREttZW1jcHkoc2VsZi0+Y2hhbm5lbFR5cGUsIHNlbGYtPmNoYW5uZWxUeXBlUHJldiwKKyAgICAgICAgICAgICAgICAgICg4KSAqIHNpemVvZihBVURJT19DSEFOTkVMX1RZUEUpKTsgLyogcmVzdG9yZSAqLworICAgICAgICBGREttZW1jcHkoc2VsZi0+Y2hhbm5lbEluZGljZXMsIHNlbGYtPmNoYW5uZWxJbmRpY2VzUHJldiwKKyAgICAgICAgICAgICAgICAgICg4KSAqIHNpemVvZihVQ0hBUikpOyAvKiByZXN0b3JlICovCisgICAgICAgIHNlbGYtPnNickVuYWJsZWQgPSBzZWxmLT5zYnJFbmFibGVkUHJldjsKKyAgICAgIH0KKyAgICB9CiAgIH0KIAogICAvKiBVcGRhdGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAqLwogICBzZWxmLT5zdHJlYW1JbmZvLmFhY051bUNoYW5uZWxzID0gYWFjQ2hhbm5lbHM7CiAKLSAjaWZkZWYgVFBfUENFX0VOQUJMRQorICAvKiBFbnN1cmUgY29uc2lzdGVuY3kgb2YgSVNfT1VUUFVUX1ZBTElEKCkgbWFjcm8uICovCisgIGlmIChhYWNDaGFubmVscyA9PSAwKSB7CisgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1VOS05PV047CisgIH0KKwogICBpZiAocGNlUmVhZCA9PSAxICYmIENQcm9ncmFtQ29uZmlnX0lzVmFsaWQocGNlKSkgewogICAgIC8qIFNldCBtYXRyaXggbWl4ZG93biBpbmZvcyBpZiBhdmFpbGFibGUgZnJvbSBQQ0UuICovCi0gICAgcGNtRG14X1NldE1hdHJpeE1peGRvd25Gcm9tUGNlICggc2VsZi0+aFBjbVV0aWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjZS0+TWF0cml4TWl4ZG93bkluZGV4UHJlc2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2UtPk1hdHJpeE1peGRvd25JbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2UtPlBzZXVkb1N1cnJvdW5kRW5hYmxlICk7CisgICAgcGNtRG14X1NldE1hdHJpeE1peGRvd25Gcm9tUGNlKAorICAgICAgICBzZWxmLT5oUGNtVXRpbHMsIHBjZS0+TWF0cml4TWl4ZG93bkluZGV4UHJlc2VudCwKKyAgICAgICAgcGNlLT5NYXRyaXhNaXhkb3duSW5kZXgsIHBjZS0+UHNldWRvU3Vycm91bmRFbmFibGUpOworICAgIDsKICAgfQotICNlbmRpZgogCiAgIC8qIElmIHRoZXJlIGlzIG5vIHZhbGlkIGRhdGEgdG8gdHJhbnNmcm9tIGludG8gdGltZSBkb21haW4sIHJldHVybi4gKi8KLSAgaWYgKCAhIElTX09VVFBVVF9WQUxJRChFcnJvclN0YXR1cykgKSB7CisgIGlmICghSVNfT1VUUFVUX1ZBTElEKEVycm9yU3RhdHVzKSkgewogICAgIHJldHVybiBFcnJvclN0YXR1czsKICAgfQogCi0gIC8qIFNldHVwIHRoZSBvdXRwdXQgY2hhbm5lbCBtYXBwaW5nLiBUaGUgdGFibGUgYmVsb3cgc2hvd3MgdGhlIGZvdXIgcG9zc2liaWxpdGllczoKLSAgICogICAjIHwgY2hDZmcgfCBQQ0UgfCBjQ2hDZmcgfCBjaE91dE1hcElkeAorICAvKiBTZXR1cCB0aGUgb3V0cHV0IGNoYW5uZWwgbWFwcGluZy4gVGhlIHRhYmxlIGJlbG93IHNob3dzIHRoZSB0aHJlZQorICAgKiBwb3NzaWJpbGl0aWVzOiAjIHwgY2hDZmcgfCBQQ0UgfCBjaE1hcEluZGV4CisgICAqICAtLS0rLS0tLS0tLSstLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogICAxIHwgID4gMCAgfCAgbm8gfCBjaENmZworICAgKiAgIDIgfCAgIDAgICB8IHllcyB8IGNDaENmZworICAgKiAgIDMgfCAgIDAgICB8ICBubyB8IGFhY0NoYW5uZWxzIHx8IDAKICAgICogIC0tLSstLS0tLS0tKy0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLQotICAgKiAgIDEgfCAgPiAwICB8ICBubyB8ICAgIC0gICB8IGNoQ2ZnCi0gICAqICAgMiB8ICAgMCAgIHwgeWVzIHwgID4gMCAgIHwgY0NoQ2ZnCi0gICAqICAgMyB8ICAgMCAgIHwgeWVzIHwgICAgMCAgIHwgYWFjQ2hhbm5lbHMgfHwgMAotICAgKiAgIDQgfCAgIDAgICB8ICBubyB8ICAgIC0gICB8IGFhY0NoYW5uZWxzIHx8IDAKLSAgICogIC0tLSstLS0tLS0tKy0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLQotICAgKiAgV2hlcmUgY2hDZmcgaXMgdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbiBpbmRleCBmcm9tIEFTQyBhbmQgY0NoQ2ZnIGlzIGEgY29ycmVzcG9uZGluZyBjaENmZwotICAgKiAgZGVyaXZlZCBmcm9tIGEgZ2l2ZW4gUENFLiBUaGUgdmFyaWFibGUgYWFjQ2hhbm5lbHMgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGNoYW5uZWwgZm91bmQKLSAgICogIGR1cmluZyBiaXRzdHJlYW0gZGVjb2RpbmcuIER1ZSB0byB0aGUgc3RydWN0dXJlIG9mIHRoZSBtYXBwaW5nIHRhYmxlIGl0IGNhbiBvbmx5IGJlIHVzZWQgZm9yCi0gICAqICBtYXBwaW5nIGlmIGl0cyB2YWx1ZSBpcyBzbWFsbGVyIHRoYW4gNy4gT3RoZXJ3aXNlIHdlIHVzZSB0aGUgZmFsbGJhY2sgKDApIHdoaWNoIGlzIGEgc2ltcGxlCi0gICAqICBwYXNzLXRocm91Z2guIFRoZSBwb3NzaWJpbGl0eSAjNCBzaG91bGQgYXBwZWFyIG9ubHkgd2l0aCBNUEVHLTIgKEFEVFMpIHN0cmVhbXMuIFRoaXMgaXMKLSAgICogIG1vZGUgaXMgY2FsbGVkICJpbXBsaWNpdCBjaGFubmVsIG1hcHBpbmciLgorICAgKiAgV2hlcmUgY2hDZmcgaXMgdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbiBpbmRleCBmcm9tIEFTQyBhbmQgY0NoQ2ZnIGlzIGEKKyAgICogY29ycmVzcG9uZGluZyBjaENmZyBkZXJpdmVkIGZyb20gYSBnaXZlbiBQQ0UuIFRoZSB2YXJpYWJsZSBhYWNDaGFubmVscworICAgKiByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgY2hhbm5lbCBmb3VuZCBkdXJpbmcgYml0c3RyZWFtIGRlY29kaW5nLiBEdWUgdG8KKyAgICogdGhlIHN0cnVjdHVyZSBvZiB0aGUgbWFwcGluZyB0YWJsZSBpdCBjYW4gb25seSBiZSB1c2VkIGZvciBtYXBwaW5nIGlmIGl0cworICAgKiB2YWx1ZSBpcyBzbWFsbGVyIHRoYW4gNy4gT3RoZXJ3aXNlIHdlIHVzZSB0aGUgZmFsbGJhY2sgKDApIHdoaWNoIGlzIGEKKyAgICogc2ltcGxlIHBhc3MtdGhyb3VnaC4gVGhlIHBvc3NpYmlsaXR5ICMzIHNob3VsZCBhcHBlYXIgb25seSB3aXRoIE1QRUctMgorICAgKiAoQURUUykgc3RyZWFtcy4gVGhpcyBpcyBtb2RlIGlzIGNhbGxlZCAiaW1wbGljaXQgY2hhbm5lbCBtYXBwaW5nIi4KICAgICovCi0gIGNoT3V0TWFwSWR4ID0gKChzZWxmLT5jaE1hcEluZGV4PT0wKSAmJiAoYWFjQ2hhbm5lbHM8NykpID8gYWFjQ2hhbm5lbHMgOiBzZWxmLT5jaE1hcEluZGV4OworICBpZiAoKHNlbGYtPnN0cmVhbUluZm8uY2hhbm5lbENvbmZpZyA9PSAwKSAmJiAhcGNlLT5pc1ZhbGlkKSB7CisgICAgc2VsZi0+Y2hNYXBJbmRleCA9IChhYWNDaGFubmVscyA8IDcpID8gYWFjQ2hhbm5lbHMgOiAwOworICB9CiAKICAgLyoKICAgICBJbnZlcnNlIHRyYW5zZm9ybQogICAqLwogICB7Ci0gICAgaW50IHN0cmlkZSwgb2Zmc2V0LCBjOworICAgIGludCBjLCBjSWR4OworICAgIGludCBtYXBwZWQsIGZDb3B5Q2hNYXAgPSAxOworICAgIFVDSEFSIGRyY0NoTWFwWyg4KV07CiAKLSAgICAvKiBUdXJuIG9uL29mZiBEUkMgbW9kdWxlcyBsZXZlbCBub3JtYWxpemF0aW9uIGluIGRpZ2l0YWwgZG9tYWluIGRlcGVuZGluZyBvbiB0aGUgbGltaXRlciBzdGF0dXMuICovCi0gICAgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbSggc2VsZi0+aERyY0luZm8sIEFQUExZX05PUk1BTElaQVRJT04sIChzZWxmLT5saW1pdGVyRW5hYmxlQ3VycikgPyAwIDogMSApOwotICAgIC8qIEV4dHJhY3QgRFJDIGNvbnRyb2wgZGF0YSBhbmQgbWFwIGl0IHRvIGNoYW5uZWxzICh3aXRob3V0IGJpdHN0cmVhbSBkZWxheSkgKi8KLSAgICBhYWNEZWNvZGVyX2RyY1Byb2xvZyAoCi0gICAgICAgICAgICBzZWxmLT5oRHJjSW5mbywKLSAgICAgICAgICAgIGJzLAotICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKLSAgICAgICAgICAgIHNlbGYtPnBjZS5FbGVtZW50SW5zdGFuY2VUYWcsCi0gICAgICAgICAgICBzZWxmLT5jaE1hcHBpbmcsCi0gICAgICAgICAgICBhYWNDaGFubmVscwotICAgICAgICAgICk7CisgICAgaWYgKChzZWxmLT5zdHJlYW1JbmZvLmNoYW5uZWxDb25maWcgPT0gMCkgJiYgQ1Byb2dyYW1Db25maWdfSXNWYWxpZChwY2UpKSB7CisgICAgICAvKiBJU08vSUVDIDE0NDk2LTMgc2F5czoKKyAgICAgICAgICAgSWYgYSBQQ0UgaXMgcHJlc2VudCwgdGhlIGV4Y2x1ZGVfbWFzayBiaXRzIGNvcnJlc3BvbmQgdG8gdGhlIGF1ZGlvCisgICAgICAgICBjaGFubmVscyBpbiB0aGUgU0NFLCBDUEUsIENDRSBhbmQgTEZFIHN5bnRheCBlbGVtZW50cyBpbiB0aGUgb3JkZXIgb2YKKyAgICAgICAgIHRoZWlyIGFwcGVhcmFuY2UgaW4gdGhlIFBDRS4gSW4gdGhlIGNhc2Ugb2YgYSBDUEUsIHRoZSBmaXJzdAorICAgICAgICAgdHJhbnNtaXR0ZWQgbWFzayBiaXQgY29ycmVzcG9uZHMgdG8gdGhlIGZpcnN0IGNoYW5uZWwgaW4gdGhlIENQRSwgdGhlCisgICAgICAgICBzZWNvbmQgdHJhbnNtaXR0ZWQgbWFzayBiaXQgdG8gdGhlIHNlY29uZCBjaGFubmVsLiBJbiB0aGUgY2FzZSBvZiBhCisgICAgICAgICBDQ0UsIGEgbWFzayBiaXQgaXMgdHJhbnNtaXR0ZWQgb25seSBpZiB0aGUgY291cGxpbmcgY2hhbm5lbCBpcworICAgICAgICAgc3BlY2lmaWVkIHRvIGJlIGFuIGluZGVwZW5kZW50bHkgc3dpdGNoZWQgY291cGxpbmcgY2hhbm5lbC4gVGh1cyB3ZQorICAgICAgICAgaGF2ZSB0byBjb252ZXJ0IHRoZSBpbnRlcm5hbCBjaGFubmVsIG1hcHBpbmcgZnJvbSAiY2Fub25pY2FsIiBNUEVHIHRvCisgICAgICAgICBQQ0Ugb3JkZXI6ICovCisgICAgICBVQ0hBUiB0bXBDaE1hcFsoOCldOworICAgICAgaWYgKENQcm9ncmFtQ29uZmlnX0dldFBjZUNoTWFwKHBjZSwgdG1wQ2hNYXAsICg4KSkgPT0gMCkgeworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgYWFjQ2hhbm5lbHM7IGMgKz0gMSkgeworICAgICAgICAgIGRyY0NoTWFwW2NdID0KKyAgICAgICAgICAgICAgKHNlbGYtPmNoTWFwcGluZ1tjXSA9PSAyNTUpID8gMjU1IDogdG1wQ2hNYXBbc2VsZi0+Y2hNYXBwaW5nW2NdXTsKKyAgICAgICAgfQorICAgICAgICBmQ29weUNoTWFwID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGZDb3B5Q2hNYXAgIT0gMCkgeworICAgICAgRkRLbWVtY3B5KGRyY0NoTWFwLCBzZWxmLT5jaE1hcHBpbmcsICg4KSAqIHNpemVvZihVQ0hBUikpOworICAgIH0KIAotICAgIC8qICJjIiBpdGVyYXRlcyBpbiBjYW5vbmljYWwgTVBFRyBjaGFubmVsIG9yZGVyICovCi0gICAgZm9yIChjPTA7IGMgPCBhYWNDaGFubmVsczsgYysrKQotICAgIHsKLSAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm87CisgICAgLyogVHVybiBvbi9vZmYgRFJDIG1vZHVsZXMgbGV2ZWwgbm9ybWFsaXphdGlvbiBpbiBkaWdpdGFsIGRvbWFpbiBkZXBlbmRpbmcKKyAgICAgKiBvbiB0aGUgbGltaXRlciBzdGF0dXMuICovCisgICAgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbShzZWxmLT5oRHJjSW5mbywgQVBQTFlfTk9STUFMSVpBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLT5saW1pdGVyRW5hYmxlQ3VycikgPyAwIDogMSk7CiAKLSAgICAgIC8qIFNlbGVjdCBjb3JyZWN0IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gZm9yIGN1cnJlbnQgY2hhbm5lbCAqLwotICAgICAgaWYgKHNlbGYtPmNoTWFwcGluZ1tjXSA+PSBhYWNDaGFubmVscykgewotICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvID0gc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tjXTsKKyAgICAvKiBkZWFjdGl2YXRlIGxlZ2FjeSBEUkMgaW4gY2FzZSB1bmlEcmMgaXMgYWN0aXZlLCBpLmUuIHVuaURyYyBwYXlsb2FkIGlzCisgICAgICogcHJlc2VudCBhbmQgb25lIG9mIERSQyBvciBMb3VkbmVzcyBOb3JtYWxpemF0aW9uIGlzIHN3aXRjaGVkIG9uICovCisgICAgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbSgKKyAgICAgICAgc2VsZi0+aERyY0luZm8sIFVOSURSQ19QUkVDRURFTkNFLAorICAgICAgICBGREtfZHJjRGVjX0dldFBhcmFtKHNlbGYtPmhVbmlEcmNEZWNvZGVyLCBEUkNfREVDX0lTX0FDVElWRSkpOworCisgICAgLyogRXh0cmFjdCBEUkMgY29udHJvbCBkYXRhIGFuZCBtYXAgaXQgdG8gY2hhbm5lbHMgKHdpdGhvdXQgYml0c3RyZWFtIGRlbGF5KQorICAgICAqLworICAgIG1hcHBlZCA9IGFhY0RlY29kZXJfZHJjUHJvbG9nKAorICAgICAgICBzZWxmLT5oRHJjSW5mbywgYnMsIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgICAgIHBjZS0+RWxlbWVudEluc3RhbmNlVGFnLCBkcmNDaE1hcCwgYWFjQ2hhbm5lbHMpOworICAgIGlmIChtYXBwZWQgPiAwKSB7CisgICAgICAvKiBJZiBhdCBsZWFzdCBvbmUgRFJDIHRocmVhZCBoYXMgYmVlbiBtYXBwZWQgdG8gYSBjaGFubmVsIHRocmVyZSB3YXMgRFJDCisgICAgICAgKiBkYXRhIGluIHRoZSBiaXRzdHJlYW0uICovCisgICAgICBzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gfD0gQUNfRFJDX1BSRVNFTlQ7CisgICAgfQorCisgICAgLyogQ3JlYXRlIGEgcmV2ZXJzZSBtYXBwaW5nIHRhYmxlICovCisgICAgVUNIQVIgUmV2ZXJzZV9jaE1hcHBpbmdbKCg4KSAqIDIpXTsKKyAgICBmb3IgKGMgPSAwOyBjIDwgYWFjQ2hhbm5lbHM7IGMrKykgeworICAgICAgaW50IGQ7CisgICAgICBmb3IgKGQgPSAwOyBkIDwgYWFjQ2hhbm5lbHMgLSAxOyBkKyspIHsKKyAgICAgICAgaWYgKHNlbGYtPmNoTWFwcGluZ1tkXSA9PSBjKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFJldmVyc2VfY2hNYXBwaW5nW2NdID0gZDsKKyAgICB9CisKKyAgICBpbnQgZWw7CisgICAgaW50IGVsX2NoYW5uZWxzOworICAgIGMgPSAwOworICAgIGNJZHggPSAwOworICAgIGVsX2NoYW5uZWxzID0gMDsKKyAgICBmb3IgKGVsID0gMDsgZWwgPCBlbGVtZW50X2NvdW50OyBlbCsrKSB7CisgICAgICBpbnQgZnJhbWVPa19idXRDb25jZWFsID0KKyAgICAgICAgICAwOyAvKiBGb3JjZSBmcmFtZSBjb25jZWFsbWVudCBkdXJpbmcgbXV0ZSByZWxlYXNlIGFjdGl2ZSBzdGF0ZS4gKi8KKyAgICAgIGludCBjb25jZWFsQXBwbHlSZXR1cm5Db2RlOworCisgICAgICBpZiAoc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdICYgKEFDX1VTQUMgfCBBQ19SU1Y2MDNEQSB8IEFDX0JTQUMpKSB7CisgICAgICAgIHR5cGUgPSBzZWxmLT5lbGVtZW50c1tlbF07CiAgICAgICB9IGVsc2UgewotICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvID0gc2VsZi0+cEFhY0RlY29kZXJDaGFubmVsSW5mb1tzZWxmLT5jaE1hcHBpbmdbY11dOworICAgICAgICB0eXBlID0gY2hhbm5lbF9lbGVtZW50c1tlbF07CiAgICAgICB9CiAKLSAgICAgIC8qIFNldHVwIG9mZnNldCBhbmQgc3RyaWRlIGZvciB0aW1lIGJ1ZmZlciB0cmF2ZXJzYWwuICovCi0gICAgICBpZiAoaW50ZXJsZWF2ZWQpIHsKLSAgICAgICAgc3RyaWRlID0gYWFjQ2hhbm5lbHM7Ci0gICAgICAgIG9mZnNldCA9IHNlbGYtPmNoYW5uZWxPdXRwdXRNYXBwaW5nW2NoT3V0TWFwSWR4XVtjXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0cmlkZSA9IDE7Ci0gICAgICAgIG9mZnNldCA9IHNlbGYtPmNoYW5uZWxPdXRwdXRNYXBwaW5nW2NoT3V0TWFwSWR4XVtjXSAqIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lOwotICAgICAgfQotCi0KLSAgICAgIGlmICggZmxhZ3MmQUFDREVDX0ZMVVNIICkgewotICAgICAgICAvKiBDbGVhciBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCBiZWNhdXNlIHdpdGggQUFDREVDX0ZMVVNIIHNldCBpdCBjb250YWlucyB1bmRlZmluZWQgZGF0YS4gKi8KLSAgICAgICAgRkRLbWVtY2xlYXIocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQsIHNpemVvZihGSVhQX0RCTCkqc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUpOwotICAgICAgfQotCi0gICAgICAvKgotICAgICAgICBDb25jZWFsIGRlZmVjdGl2ZSBzcGVjdHJhbCBkYXRhCi0gICAgICAqLwotICAgICAgQ0NvbmNlYWxtZW50X0FwcGx5KCZzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NdLT5jb25jZWFsbWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi0+ZnJhbWVPSyAmJiAhKGZsYWdzJkFBQ0RFQ19DT05DRUFMKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzCi0gICAgICAgICAgICAgICAgICAgICAgICApOwotCi0KLSAgICAgIGlmIChmbGFncyAmIChBQUNERUNfSU5UUnxBQUNERUNfQ0xSSElTVCkpIHsKLSAgICAgICAgLyogUmVzZXQgRFJDIGNvbnRyb2wgZGF0YSBmb3IgdGhpcyBjaGFubmVsICovCi0gICAgICAgIGFhY0RlY29kZXJfZHJjSW5pdENoYW5uZWxEYXRhICggJnNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY10tPmRyY0RhdGEgKTsKLSAgICAgIH0KLSAgICAgIC8qIFRoZSBEUkMgbW9kdWxlIGRlbWFuZHMgdG8gYmUgY2FsbGVkIHdpdGggdGhlIGdhaW4gZmllbGQgaG9sZGluZyB0aGUgZ2FpbiBzY2FsZS4gKi8KLSAgICAgIHNlbGYtPmV4dEdhaW5bMF0gPSAoRklYUF9EQkwpVERMX0dBSU5fU0NBTElORzsKLSAgICAgIC8qIERSQyBwcm9jZXNzaW5nICovCi0gICAgICBhYWNEZWNvZGVyX2RyY0FwcGx5ICgKLSAgICAgICAgICAgICAgc2VsZi0+aERyY0luZm8sCi0gICAgICAgICAgICAgIHNlbGYtPmhTYnJEZWNvZGVyLAotICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICAgICAgICZzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NdLT5kcmNEYXRhLAotICAgICAgICAgICAgICBzZWxmLT5leHRHYWluLAotICAgICAgICAgICAgICBjLAotICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgc2VsZi0+c2JyRW5hYmxlZAotICAgICAgICAgICAgKTsKLQotICAgICAgc3dpdGNoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5yZW5kZXJNb2RlKQogICAgICAgewotICAgICAgICBjYXNlIEFBQ0RFQ19SRU5ERVJfSU1EQ1Q6Ci0gICAgICAgICAgQ0Jsb2NrX0ZyZXF1ZW5jeVRvVGltZSgKLSAgICAgICAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY10sCi0gICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgcFRpbWVEYXRhICsgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAoc2VsZi0+ZnJhbWVPSyAmJiAhKGZsYWdzJkFBQ0RFQ19DT05DRUFMKSksCi0gICAgICAgICAgICAgICAgICBzZWxmLT5hYWNDb21tb25EYXRhLndvcmtCdWZmZXJDb3JlMS0+bWRjdE91dFRlbXAKLSAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgc2VsZi0+ZXh0R2FpbkRlbGF5ID0gc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQUFDREVDX1JFTkRFUl9FTERGQjoKLSAgICAgICAgICBDQmxvY2tfRnJlcXVlbmN5VG9UaW1lTG93RGVsYXkoCi0gICAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NdLAotICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgIHBUaW1lRGF0YSArIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgc3RyaWRlCi0gICAgICAgICAgICAgICAgICApOwotICAgICAgICAgIHNlbGYtPmV4dEdhaW5EZWxheSA9IChzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSoyIC0gIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lLzIgLSAxKS8yOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19VTktOT1dOOwotICAgICAgICAgIGJyZWFrOworICAgICAgICBpbnQgbkVsZW1lbnRDaGFubmVsczsKKworICAgICAgICBuRWxlbWVudENoYW5uZWxzID0KKyAgICAgICAgICAgIENBYWNEZWNvZGVyX0dldEVMQ2hhbm5lbHModHlwZSwgc2VsZi0+dXNhY1N0ZXJlb0NvbmZpZ0luZGV4W2VsXSk7CisKKyAgICAgICAgZWxfY2hhbm5lbHMgKz0gbkVsZW1lbnRDaGFubmVsczsKKworICAgICAgICBpZiAobkVsZW1lbnRDaGFubmVscyA9PSAwKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGlmICggZmxhZ3MmQUFDREVDX0ZMVVNIICkgewotICAgICAgICAgIEZES21lbWNsZWFyKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50LCBzaXplb2YoRklYUF9EQkwpKnNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lKTsKLSAgICAgICAgRkRLbWVtY2xlYXIoc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjXS0+cE92ZXJsYXBCdWZmZXIsIE92ZXJsYXBCdWZmZXJTaXplKnNpemVvZihGSVhQX0RCTCkpOworCisgICAgICBpbnQgb2Zmc2V0OworICAgICAgaW50IGVsQ2ggPSAwOworICAgICAgLyogImMiIGl0ZXJhdGVzIGluIGNhbm9uaWNhbCBNUEVHIGNoYW5uZWwgb3JkZXIgKi8KKyAgICAgIGZvciAoOyBjSWR4IDwgZWxfY2hhbm5lbHM7IGMrKywgY0lkeCsrLCBlbENoKyspIHsKKyAgICAgICAgLyogUm9idXN0bmVzcyBjaGVjayAqLworICAgICAgICBpZiAoYyA+PSBhYWNDaGFubmVscykgeworICAgICAgICAgIHJldHVybiBBQUNfREVDX1VOS05PV047CisgICAgICAgIH0KKworICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvID0KKyAgICAgICAgICAgIHNlbGYtPnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY107CisgICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gPQorICAgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjXTsKKworICAgICAgICAvKiBTZXR1cCBvZmZzZXQgZm9yIHRpbWUgYnVmZmVyIHRyYXZlcnNhbC4gKi8KKyAgICAgICAgeworICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gPQorICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW1JldmVyc2VfY2hNYXBwaW5nW2NdXTsKKyAgICAgICAgICBvZmZzZXQgPQorICAgICAgICAgICAgICBGREtfY2hNYXBEZXNjcl9nZXRNYXBWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICZzZWxmLT5tYXBEZXNjciwgUmV2ZXJzZV9jaE1hcHBpbmdbY0lkeF0sIHNlbGYtPmNoTWFwSW5kZXgpICoKKyAgICAgICAgICAgICAgdGltZURhdGFDaGFubmVsT2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZsYWdzICYgQUFDREVDX0ZMVVNIKSB7CisgICAgICAgICAgLyogQ2xlYXIgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQgYmVjYXVzZSB3aXRoCisgICAgICAgICAgICogQUFDREVDX0ZMVVNIIHNldCBpdCBjb250YWlucyB1bmRlZmluZWQgZGF0YS4gKi8KKyAgICAgICAgICBGREttZW1jbGVhcihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUpOworICAgICAgICB9CisKKyAgICAgICAgLyogaWYgVGhlIGljcyBpbmZvIGlzIG5vdCB2YWxpZCBhbmQgaXQgd2lsbCBiZSBzdG9yZWQgYW5kIHVzZWQgaW4gdGhlCisgICAgICAgICAqIGZvbGxvd2luZyBjb25jZWFsbWVudCBtZXRob2QsIG1hcmsgdGhlIGZyYW1lIGFzIGVycm9uZW91cyAqLworICAgICAgICB7CisgICAgICAgICAgQ0ljc0luZm8gKnBJY3NJbmZvID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm87CisgICAgICAgICAgQ0NvbmNlYWxtZW50SW5mbyAqaENvbmNlYWxtZW50SW5mbyA9CisgICAgICAgICAgICAgICZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm87CisgICAgICAgICAgY29uc3QgaW50IG11dGVfcmVsZWFzZV9hY3RpdmUgPQorICAgICAgICAgICAgICAoc2VsZi0+ZnJhbWVPSyAmJiAhKGZsYWdzICYgQUFDREVDX0NPTkNFQUwpKSAmJgorICAgICAgICAgICAgICAoKGhDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA+PSBDb25jZWFsU3RhdGVfTXV0ZSkgJiYKKyAgICAgICAgICAgICAgIChoQ29uY2VhbG1lbnRJbmZvLT5jbnRWYWxpZEZyYW1lcyArIDEgPD0KKyAgICAgICAgICAgICAgICBoQ29uY2VhbG1lbnRJbmZvLT5wQ29uY2VhbFBhcmFtcy0+bnVtTXV0ZVJlbGVhc2VGcmFtZXMpKTsKKyAgICAgICAgICBjb25zdCBpbnQgaWNzSXNJbnZhbGlkID0gKEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZChwSWNzSW5mbykgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kc1RvdGFsKHBJY3NJbmZvKSk7CisgICAgICAgICAgY29uc3QgaW50IGljc0luZm9Vc2VkaW5GYWRlT3V0ID0KKyAgICAgICAgICAgICAgIShwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5yZW5kZXJNb2RlID09IEFBQ0RFQ19SRU5ERVJfTFBEICYmCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9scGRfbW9kZSA9PSAwKTsKKyAgICAgICAgICBpZiAoaWNzSW5mb1VzZWRpbkZhZGVPdXQgJiYgaWNzSXNJbnZhbGlkICYmICFtdXRlX3JlbGVhc2VfYWN0aXZlKSB7CisgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgIENvbmNlYWwgZGVmZWN0aXZlIHNwZWN0cmFsIGRhdGEKKyAgICAgICAgKi8KKyAgICAgICAgeworICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKipwcEFhY0RlY29kZXJDaGFubmVsSW5mbyA9CisgICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvOworICAgICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKipwcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyA9CisgICAgICAgICAgICAgICZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvOworICAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbmNlYWxBcHBseVJldHVybkNvZGUgPSBDQ29uY2VhbG1lbnRfQXBwbHkoCisgICAgICAgICAgICAgICAgJigqcHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8pLT5jb25jZWFsbWVudEluZm8sCisgICAgICAgICAgICAgICAgKnBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCAqcHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgJnNlbGYtPnNhbXBsaW5nUmF0ZUluZm9bc3RyZWFtSW5kZXhdLAorICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfbHBkX21vZGUsCisgICAgICAgICAgICAgICAgKHNlbGYtPmZyYW1lT0sgJiYgIShmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSksCisgICAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbmNlYWxBcHBseVJldHVybkNvZGUgPT0gLTEpIHsKKyAgICAgICAgICBmcmFtZU9rX2J1dENvbmNlYWwgPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZsYWdzICYgKEFBQ0RFQ19JTlRSKSkgeworICAgICAgICAgIC8qIFJlc2V0IERSQyBjb250cm9sIGRhdGEgZm9yIHRoaXMgY2hhbm5lbCAqLworICAgICAgICAgIGFhY0RlY29kZXJfZHJjSW5pdENoYW5uZWxEYXRhKCZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5kcmNEYXRhKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmxhZ3MgJiAoQUFDREVDX0NMUkhJU1QpKSB7CisgICAgICAgICAgaWYgKCEoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19VU0FDKSkgeworICAgICAgICAgICAgLyogUmVzZXQgRFJDIGNvbnRyb2wgZGF0YSBmb3IgdGhpcyBjaGFubmVsICovCisgICAgICAgICAgICBhYWNEZWNvZGVyX2RyY0luaXRDaGFubmVsRGF0YSgKKyAgICAgICAgICAgICAgICAmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+ZHJjRGF0YSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIFRoZSBEUkMgbW9kdWxlIGRlbWFuZHMgdG8gYmUgY2FsbGVkIHdpdGggdGhlIGdhaW4gZmllbGQgaG9sZGluZyB0aGUKKyAgICAgICAgICogZ2FpbiBzY2FsZS4gKi8KKyAgICAgICAgc2VsZi0+ZXh0R2FpblswXSA9IChGSVhQX0RCTClURExfR0FJTl9TQ0FMSU5HOworICAgICAgICAvKiBEUkMgcHJvY2Vzc2luZyAqLworICAgICAgICBhYWNEZWNvZGVyX2RyY0FwcGx5KAorICAgICAgICAgICAgc2VsZi0+aERyY0luZm8sIHNlbGYtPmhTYnJEZWNvZGVyLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmRyY0RhdGEsIHNlbGYtPmV4dEdhaW4sIGMsCisgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSwgc2VsZi0+c2JyRW5hYmxlZAorCisgICAgICAgICk7CisKKyAgICAgICAgaWYgKHRpbWVEYXRhU2l6ZSA8IHRpbWVEYXRhQ2hhbm5lbE9mZnNldCAqIHNlbGYtPmFhY0NoYW5uZWxzKSB7CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChzZWxmLT5mbHVzaFN0YXR1cyAmJiAoc2VsZi0+Zmx1c2hDbnQgPiAwKSAmJgorICAgICAgICAgICAgIShmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSkgeworICAgICAgICAgIEZES21lbWNsZWFyKHBUaW1lRGF0YSArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9QQ00pICogc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBzd2l0Y2ggKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnJlbmRlck1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgQUFDREVDX1JFTkRFUl9JTURDVDoKKworICAgICAgICAgICAgICBDQmxvY2tfRnJlcXVlbmN5VG9UaW1lKAorICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywgcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgIHBUaW1lRGF0YSArIG9mZnNldCwgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAoc2VsZi0+ZnJhbWVPSyAmJiAhKGZsYWdzICYgQUFDREVDX0NPTkNFQUwpICYmCisgICAgICAgICAgICAgICAgICAgIWZyYW1lT2tfYnV0Q29uY2VhbCksCisgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tU3RhdGljRGF0YS0+cFdvcmtCdWZmZXJDb3JlMQorICAgICAgICAgICAgICAgICAgICAgIC0+bWRjdE91dFRlbXAsCisgICAgICAgICAgICAgICAgICBzZWxmLT5lbEZsYWdzW2VsXSwgZWxDaCk7CisKKyAgICAgICAgICAgICAgc2VsZi0+ZXh0R2FpbkRlbGF5ID0gc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWU7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQUNERUNfUkVOREVSX0VMREZCOiB7CisgICAgICAgICAgICAgIENCbG9ja19GcmVxdWVuY3lUb1RpbWVMb3dEZWxheSgKKyAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICBwVGltZURhdGEgKyBvZmZzZXQsIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lKTsKKyAgICAgICAgICAgICAgc2VsZi0+ZXh0R2FpbkRlbGF5ID0KKyAgICAgICAgICAgICAgICAgIChzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSAqIDIgLQorICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lIC8gMiAtIDEpIC8KKyAgICAgICAgICAgICAgICAgIDI7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQUNERUNfUkVOREVSX0xQRDoKKworICAgICAgICAgICAgICBDTHBkX1JlbmRlclRpbWVTaWduYWwoCisgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgcFRpbWVEYXRhICsgb2Zmc2V0LCBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICZzZWxmLT5zYW1wbGluZ1JhdGVJbmZvW3N0cmVhbUluZGV4XSwKKyAgICAgICAgICAgICAgICAgIChzZWxmLT5mcmFtZU9LICYmICEoZmxhZ3MgJiBBQUNERUNfQ09OQ0VBTCkgJiYKKyAgICAgICAgICAgICAgICAgICAhZnJhbWVPa19idXRDb25jZWFsKSwKKyAgICAgICAgICAgICAgICAgIGZsYWdzLCBzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0pOworCisgICAgICAgICAgICAgIHNlbGYtPmV4dEdhaW5EZWxheSA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19VTktOT1dOOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIC8qIFRpbWVEb21haW5GYWRpbmcgKi8KKyAgICAgICAgaWYgKCFDQ29uY2VhbF9UREZhZGluZ19BcHBsaWVkW2NdKSB7CisgICAgICAgICAgQ0NvbmNlYWxfVERGYWRpbmdfQXBwbGllZFtjXSA9IENDb25jZWFsbWVudF9UREZhZGluZygKKyAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICZzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NdLCBwVGltZURhdGEgKyBvZmZzZXQsIDApOworICAgICAgICAgIGlmIChjICsgMSA8ICg4KSAmJiBjIDwgYWFjQ2hhbm5lbHMgLSAxKSB7CisgICAgICAgICAgICAvKiB1cGRhdGUgbmV4dCBURE5vaXNlIFNlZWQgdG8gYXZvaWQgbXV0aW5nIGluIGNhc2Ugb2YgUGFyYW1ldHJpYworICAgICAgICAgICAgICogU3RlcmVvICovCisgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2MgKyAxXQorICAgICAgICAgICAgICAgIC0+Y29uY2VhbG1lbnRJbmZvLlRETm9pc2VTZWVkID0KKyAgICAgICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NdCisgICAgICAgICAgICAgICAgICAgIC0+Y29uY2VhbG1lbnRJbmZvLlRETm9pc2VTZWVkOworICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgfQogICAgIH0KIAorICAgIGlmIChzZWxmLT5mbGFnc1tzdHJlYW1JbmRleF0gJiBBQ19VU0FDKSB7CisgICAgICBpbnQgYnNQc2V1ZG9MciA9IDA7CisgICAgICBtcGVnU3Vycm91bmREZWNvZGVyX0lzUHNldWRvTFIoCisgICAgICAgICAgKENNcGVnU3Vycm91bmREZWNvZGVyICopc2VsZi0+cE1wZWdTdXJyb3VuZERlY29kZXIsICZic1BzZXVkb0xyKTsKKyAgICAgIC8qIElTTy9JRUMgMjMwMDMtMywgNy4xMS4yLjYgTW9kaWZpY2F0aW9uIG9mIGNvcmUgZGVjb2RlciBvdXRwdXQgKHBzZXVkbworICAgICAgICogTFIpICovCisgICAgICBpZiAoKGFhY0NoYW5uZWxzID09IDIpICYmIGJzUHNldWRvTHIpIHsKKyAgICAgICAgaW50IGksIG9mZnNldDI7CisgICAgICAgIGNvbnN0IEZJWFBfU0dMIGludlNxcnQyID0gRkwyRlhDT05TVF9TR0woMC43MDcxMDY3ODExODY1NDdmKTsKKyAgICAgICAgRklYUF9QQ00gKnBURCA9IHBUaW1lRGF0YTsKKworICAgICAgICBvZmZzZXQyID0gdGltZURhdGFDaGFubmVsT2Zmc2V0OworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZTsgaSsrKSB7CisgICAgICAgICAgRklYUF9EQkwgTCA9IEZYX1BDTTJGWF9EQkwocFREWzBdKTsKKyAgICAgICAgICBGSVhQX0RCTCBSID0gRlhfUENNMkZYX0RCTChwVERbb2Zmc2V0Ml0pOworICAgICAgICAgIEwgPSBmTXVsdChMLCBpbnZTcXJ0Mik7CisgICAgICAgICAgUiA9IGZNdWx0KFIsIGludlNxcnQyKTsKKyNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCisgICAgICAgICAgcFREWzBdID0gRlhfREJMMkZYX1BDTShmQWRkU2F0dXJhdGUoTCArIFIsIChGSVhQX0RCTCkweDgwMDApKTsKKyAgICAgICAgICBwVERbb2Zmc2V0Ml0gPSBGWF9EQkwyRlhfUENNKGZBZGRTYXR1cmF0ZShMIC0gUiwgKEZJWFBfREJMKTB4ODAwMCkpOworI2Vsc2UKKyAgICAgICAgICBwVERbMF0gPSBGWF9EQkwyRlhfUENNKEwgKyBSKTsKKyAgICAgICAgICBwVERbb2Zmc2V0Ml0gPSBGWF9EQkwyRlhfUENNKEwgLSBSKTsKKyNlbmRpZgorICAgICAgICAgIHBURCsrOworICAgICAgICB9CisgICAgICB9CisgICAgfQogCiAgICAgLyogRXh0cmFjdCBEUkMgY29udHJvbCBkYXRhIGFuZCBtYXAgaXQgdG8gY2hhbm5lbHMgKHdpdGggYml0c3RyZWFtIGRlbGF5KSAqLwotICAgIGFhY0RlY29kZXJfZHJjRXBpbG9nICgKLSAgICAgICAgICAgIHNlbGYtPmhEcmNJbmZvLAotICAgICAgICAgICAgYnMsCi0gICAgICAgICAgICBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAotICAgICAgICAgICAgc2VsZi0+cGNlLkVsZW1lbnRJbnN0YW5jZVRhZywKLSAgICAgICAgICAgIHNlbGYtPmNoTWFwcGluZywKLSAgICAgICAgICAgIGFhY0NoYW5uZWxzCi0gICAgICAgICAgKTsKKyAgICBtYXBwZWQgPSBhYWNEZWNvZGVyX2RyY0VwaWxvZygKKyAgICAgICAgc2VsZi0+aERyY0luZm8sIGJzLCBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICBwY2UtPkVsZW1lbnRJbnN0YW5jZVRhZywgZHJjQ2hNYXAsIGFhY0NoYW5uZWxzKTsKKyAgICBpZiAobWFwcGVkID4gMCkgeworICAgICAgLyogSWYgYXQgbGVhc3Qgb25lIERSQyB0aHJlYWQgaGFzIGJlZW4gbWFwcGVkIHRvIGEgY2hhbm5lbCB0aHJlcmUgd2FzIERSQworICAgICAgICogZGF0YSBpbiB0aGUgYml0c3RyZWFtLiAqLworICAgICAgc2VsZi0+ZmxhZ3Nbc3RyZWFtSW5kZXhdIHw9IEFDX0RSQ19QUkVTRU5UOworICAgIH0KICAgfQogCiAgIC8qIEFkZCBhZGRpdGlvbmFsIGNvbmNlYWxtZW50IGRlbGF5ICovCi0gIHNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXkgKz0gQ0NvbmNlYWxtZW50X0dldERlbGF5KCZzZWxmLT5jb25jZWFsQ29tbW9uRGF0YSkgKiBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZTsKKyAgc2VsZi0+c3RyZWFtSW5mby5vdXRwdXREZWxheSArPQorICAgICAgQ0NvbmNlYWxtZW50X0dldERlbGF5KCZzZWxmLT5jb25jZWFsQ29tbW9uRGF0YSkgKgorICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWU7CiAKICAgLyogTWFwIERSQyBkYXRhIHRvIFN0cmVhbUluZm8gc3RydWN0dXJlICovCi0gIGFhY0RlY29kZXJfZHJjR2V0SW5mbyAoCi0gICAgICAgICAgICBzZWxmLT5oRHJjSW5mbywKLSAgICAgICAgICAgJnNlbGYtPnN0cmVhbUluZm8uZHJjUHJlc01vZGUsCi0gICAgICAgICAgICZzZWxmLT5zdHJlYW1JbmZvLmRyY1Byb2dSZWZMZXYKLSAgICAgICAgICApOworICBhYWNEZWNvZGVyX2RyY0dldEluZm8oc2VsZi0+aERyY0luZm8sICZzZWxmLT5zdHJlYW1JbmZvLmRyY1ByZXNNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnN0cmVhbUluZm8uZHJjUHJvZ1JlZkxldik7CiAKICAgLyogUmVvcmRlciBjaGFubmVsIHR5cGUgaW5mb3JtYXRpb24gdGFibGVzLiAgKi8KLSAgeworICBpZiAoIShzZWxmLT5mbGFnc1swXSAmIEFDX1JTVjYwM0RBKSkgewogICAgIEFVRElPX0NIQU5ORUxfVFlQRSB0eXBlc1soOCldOwogICAgIFVDSEFSIGlkeFsoOCldOwogICAgIGludCBjOworICAgIGludCBtYXBWYWx1ZTsKIAogICAgIEZES19BU1NFUlQoc2l6ZW9mKHNlbGYtPmNoYW5uZWxUeXBlKSA9PSBzaXplb2YodHlwZXMpKTsKICAgICBGREtfQVNTRVJUKHNpemVvZihzZWxmLT5jaGFubmVsSW5kaWNlcykgPT0gc2l6ZW9mKGlkeCkpOwpAQCAtMTgyMCw5ICszNDE5LDExIEBACiAgICAgRkRLbWVtY3B5KHR5cGVzLCBzZWxmLT5jaGFubmVsVHlwZSwgc2l6ZW9mKHR5cGVzKSk7CiAgICAgRkRLbWVtY3B5KGlkeCwgc2VsZi0+Y2hhbm5lbEluZGljZXMsIHNpemVvZihpZHgpKTsKIAotICAgIGZvciAoYz0wOyBjPGFhY0NoYW5uZWxzOyBjKyspIHsKLSAgICAgIHNlbGYtPmNoYW5uZWxUeXBlW3NlbGYtPmNoYW5uZWxPdXRwdXRNYXBwaW5nW2NoT3V0TWFwSWR4XVtjXV0gPSB0eXBlc1tjXTsKLSAgICAgIHNlbGYtPmNoYW5uZWxJbmRpY2VzW3NlbGYtPmNoYW5uZWxPdXRwdXRNYXBwaW5nW2NoT3V0TWFwSWR4XVtjXV0gPSBpZHhbY107CisgICAgZm9yIChjID0gMDsgYyA8IGFhY0NoYW5uZWxzOyBjKyspIHsKKyAgICAgIG1hcFZhbHVlID0KKyAgICAgICAgICBGREtfY2hNYXBEZXNjcl9nZXRNYXBWYWx1ZSgmc2VsZi0+bWFwRGVzY3IsIGMsIHNlbGYtPmNoTWFwSW5kZXgpOworICAgICAgc2VsZi0+Y2hhbm5lbFR5cGVbbWFwVmFsdWVdID0gdHlwZXNbY107CisgICAgICBzZWxmLT5jaGFubmVsSW5kaWNlc1ttYXBWYWx1ZV0gPSBpZHhbY107CiAgICAgfQogICB9CiAKQEAgLTE4MzgsMTQgKzM0MzksOSBAQAogCiAgIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgc3RydWN0CiAqLwotTElOS1NQRUNfQ1BQIENTdHJlYW1JbmZvKiBDQWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiApCi17CitMSU5LU1BFQ19DUFAgQ1N0cmVhbUluZm8gKkNBYWNEZWNvZGVyX0dldFN0cmVhbUluZm8oSEFORExFX0FBQ0RFQ09ERVIgc2VsZikgewogICBpZiAoIXNlbGYpIHsKICAgICByZXR1cm4gTlVMTDsKICAgfQogICByZXR1cm4gJnNlbGYtPnN0cmVhbUluZm87CiB9Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvYWFjZGVjb2Rlci5oIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNvZGVyLmgKaW5kZXggMjViYzM1ZC4uMjBmNGM0NSAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9hYWNkZWNvZGVyLmgKKysrIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNvZGVyLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKICAgIERlc2NyaXB0aW9uOgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIEFBQ0RFQ09ERVJfSAogI2RlZmluZSBBQUNERUNPREVSX0gKQEAgLTEwNCwxMzQgKzExNiwyMzggQEAKIAogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAKKyNpbmNsdWRlICJGREtfcW1mX2RvbWFpbi5oIgogCiAjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgogCi0KICNpbmNsdWRlICJhYWNkZWNfZHJjLmgiCiAKLSAjaW5jbHVkZSAicGNtdXRpbHNfbGliLmgiCi0gI2luY2x1ZGUgImxpbWl0ZXIuaCIKKyNpbmNsdWRlICJwY21kbXhfbGliLmgiCiAKKyNpbmNsdWRlICJGREtfZHJjRGVjTGliLmgiCiAKLS8qIENhcGFiaWxpdGllcyBmbGFncyAqLwotI2RlZmluZSBDQVBGX0FBQ19MQyAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBDQVBGX0FBQ19MRCAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBDQVBGX0FBQ19TQ0FMICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBDQVBGX0FBQ19FUiAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBDQVBGX0FBQ180ODAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBDQVBGX0FBQ181MTIgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBDQVBGX0FBQ185NjAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBDQVBGX0FBQ18xMDI0ICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBDQVBGX0FBQ19IQ1IgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBDQVBGX0FBQ19WQ0IxMSAgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBDQVBGX0FBQ19SVkxDICAgICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBDQVBGX0FBQ19NUEVHNCAgICAgICAgMHgwMDAwMDgwMCAvKiBQTlMgKi8KLSNkZWZpbmUgQ0FQRl9BQUNfRFJDICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgQ0FQRl9BQUNfQ09OQ0VBTCAgICAgIDB4MDAwMDIwMDAKLSNkZWZpbmUgQ0FQRl9BQUNfRFJNX0JTRk9STUFUIDB4MDAwMDQwMDAKLSNkZWZpbmUgQ0FQRl9BQUNfQlNBQyAgICAgICAgIDB4MDAwMDgwMDAKKyNpbmNsdWRlICJsaW1pdGVyLmgiCisKKyNpbmNsdWRlICJGREtfZGVsYXkuaCIKKworI2RlZmluZSBUSU1FX0RBVEFfRkxVU0hfU0laRSAoMTI4KQorI2RlZmluZSBUSU1FX0RBVEFfRkxVU0hfU0laRV9TRiAoNykKKworI2RlZmluZSBBQUNERUNfTUFYX05VTV9QUkVST0xMX0FVX1VTQUMgKDMpCisjaWYgKEFBQ0RFQ19NQVhfTlVNX1BSRVJPTExfQVUgPCAzKQorI3VuZGVmIEFBQ0RFQ19NQVhfTlVNX1BSRVJPTExfQVUKKyNkZWZpbmUgQUFDREVDX01BWF9OVU1fUFJFUk9MTF9BVSBBQUNERUNfTUFYX05VTV9QUkVST0xMX0FVX1VTQUMKKyNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCBBQUNfREVDT0RFUl9JTlNUQU5DRSAqSEFORExFX0FBQ0RFQ09ERVI7CiAKK2VudW0geyBMID0gMCwgUiA9IDEgfTsKIAotZW51bQotewotICBMID0gMCwKLSAgUiA9IDEKK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICBpbnQgYnVmZmVyU2l6ZTsKKyAgaW50IG9mZnNldFs4XTsKKyAgaW50IG5yRWxlbWVudHM7Cit9IENBbmNEYXRhOworCit0eXBlZGVmIGVudW0geyBOT1RfREVGSU5FRCA9IC0xLCBNT0RFX0hRID0gMCwgTU9ERV9MUCA9IDEgfSBRTUZfTU9ERTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgYnNEZWxheTsKK30gU0JSX1BBUkFNUzsKKworZW51bSB7CisgIEFBQ0RFQ19GTFVTSF9PRkYgPSAwLAorICBBQUNERUNfUlNWNjBfQ0ZHX0NIQU5HRV9BVFNDX0ZMVVNIX09OID0gMSwKKyAgQUFDREVDX1JTVjYwX0RBU0hfSVBGX0FUU0NfRkxVU0hfT04gPSAyLAorICBBQUNERUNfVVNBQ19EQVNIX0lQRl9GTFVTSF9PTiA9IDMKK307CisKK2VudW0geworICBBQUNERUNfQlVJTERfVVBfT0ZGID0gMCwKKyAgQUFDREVDX1JTVjYwX0JVSUxEX1VQX09OID0gMSwKKyAgQUFDREVDX1JTVjYwX0JVSUxEX1VQX09OX0lOX0JBTkQgPSAyLAorICBBQUNERUNfVVNBQ19CVUlMRF9VUF9PTiA9IDMsCisgIEFBQ0RFQ19SU1Y2MF9CVUlMRF9VUF9JRExFID0gNCwKKyAgQUFDREVDX1JTVjYwX0JVSUxEX1VQX0lETEVfSU5fQkFORCA9IDUKIH07CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7Ci0gICAgaW50IGJ1ZmZlclNpemU7Ci0gICAgaW50IG9mZnNldFs4XTsKLSAgICBpbnQgbnJFbGVtZW50czsKLX0gQ0FuY0RhdGE7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIE5PVF9ERUZJTkVEID0gLTEsCi0gIE1PREVfSFEgICAgID0gIDAsCi0gIE1PREVfTFAgICAgID0gIDEKLX0gUU1GX01PREU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50ICAgICAgICBic0RlbGF5OwotfSBTQlJfUEFSQU1TOwotCisgIC8qIFVzYWMgRXh0ZW5zaW9uIEVsZW1lbnRzICovCisgIFVTQUNfRVhUX0VMRU1FTlRfVFlQRSB1c2FjRXh0RWxlbWVudFR5cGVbKDMpXTsKKyAgVUlOVCB1c2FjRXh0RWxlbWVudERlZmF1bHRMZW5ndGhbKDMpXTsKKyAgVUNIQVIgdXNhY0V4dEVsZW1lbnRQYXlsb2FkRnJhZ1soMyldOworfSBDVXNhY0NvcmVFeHRlbnNpb25zOwogCiAvKiBBQUMgZGVjb2RlciAob3BhcXVlIHRvd2FyZCB1c2VybGFuZCkgc3RydWN0IGRlY2xhcmF0aW9uICovCiBzdHJ1Y3QgQUFDX0RFQ09ERVJfSU5TVEFOQ0UgewotICBJTlQgICAgICAgICAgICAgICAgICAgYWFjQ2hhbm5lbHM7ICAgICAgICAgICAgICAgICAvKiE8IEFtb3VudCBvZiBBQUMgZGVjb2RlciBjaGFubmVscyBhbGxvY2F0ZWQuICAgICAgICAqLwotICBJTlQgICAgICAgICAgICAgICAgICAgYXNjQ2hhbm5lbHM7ICAgICAgICAgICAgICAgICAvKiE8IEFtb3VudCBvZiBBQUMgZGVjb2RlciBjaGFubmVscyBzaWduYWxsZWQgaW4gQVNDLiAqLwotICBJTlQgICAgICAgICAgICAgICAgICAgYmxvY2tOdW1iZXI7ICAgICAgICAgICAgICAgICAvKiE8IGZyYW1lIGNvdW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBJTlQgYWFjQ2hhbm5lbHM7IC8qITwgQW1vdW50IG9mIEFBQyBkZWNvZGVyIGNoYW5uZWxzIGFsbG9jYXRlZC4gICAgICAgICovCisgIElOVCBhc2NDaGFubmVsc1soMSAqCisgICAgICAgICAgICAgICAgICAgMSldOyAvKiE8IEFtb3VudCBvZiBBQUMgZGVjb2RlciBjaGFubmVscyBzaWduYWxsZWQgaW4gQVNDLiAqLworICBJTlQgYmxvY2tOdW1iZXI7ICAgICAgLyohPCBmcmFtZSBjb3VudGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotICBJTlQgICAgICAgICAgICAgICAgICAgbnJPZkxheWVyczsKKyAgSU5UIG5yT2ZMYXllcnM7CiAKLSAgSU5UICAgICAgICAgICAgICAgICAgIG91dHB1dEludGVybGVhdmVkOyAgICAgICAgICAgLyohPCBQQ00gb3V0cHV0IGZvcm1hdCAoaW50ZXJsZWF2ZWQvbm9uZSBpbnRlcmxlYXZlZCkuICovCisgIElOVCBvdXRwdXRJbnRlcmxlYXZlZDsgLyohPCBQQ00gb3V0cHV0IGZvcm1hdCAoaW50ZXJsZWF2ZWQvbm9uZSBpbnRlcmxlYXZlZCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLSAgSEFORExFX1RSQU5TUE9SVERFQyAgIGhJbnB1dDsgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc3BvcnQgbGF5ZXIgaGFuZGxlLiAqLworICBIQU5ETEVfVFJBTlNQT1JUREVDIGhJbnB1dDsgLyohPCBUcmFuc3BvcnQgbGF5ZXIgaGFuZGxlLiAqLwogCi0gIFNhbXBsaW5nUmF0ZUluZm8gICAgICBzYW1wbGluZ1JhdGVJbmZvOyAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgUmF0ZSBpbmZvcm1hdGlvbiB0YWJsZSAqLworICBTYW1wbGluZ1JhdGVJbmZvCisgICAgICBzYW1wbGluZ1JhdGVJbmZvWygxICogMSldOyAvKiE8IFNhbXBsaW5nIFJhdGUgaW5mb3JtYXRpb24gdGFibGUgKi8KIAotICBVQ0hBUiAgICAgICAgICAgICAgICAgZnJhbWVPSzsgICAgICAgICAgICAgICAgICAgICAvKiE8IFdpbGwgYmUgdW5zZXQgaWYgYSBjb25zaXN0ZW5jeSBjaGVjaywgZS5nLiBDUkMgZXRjLiBmYWlscyAqLworICBVQ0hBUgorICBmcmFtZU9LOyAvKiE8IFdpbGwgYmUgdW5zZXQgaWYgYSBjb25zaXN0ZW5jeSBjaGVjaywgZS5nLiBDUkMgZXRjLiBmYWlscyAqLwogCi0gIFVJTlQgICAgICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRmxhZ3MgZm9yIGludGVybmFsIGRlY29kZXIgdXNlLiBETyBOT1QgVVNFIHNlbGY6OnN0cmVhbWluZm86OmZsYWdzICEgKi8KKyAgVUlOVCBmbGFnc1soMSAqIDEpXTsgLyohPCBGbGFncyBmb3IgaW50ZXJuYWwgZGVjb2RlciB1c2UuIERPIE5PVCBVU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZjo6c3RyZWFtaW5mbzo6ZmxhZ3MgISAqLworICBVSU5UIGVsRmxhZ3NbKDMgKiAoKDgpICogMikgKyAoKCg4KSAqIDIpKSAvIDIgKyA0ICogKDEpICsKKyAgICAgICAgICAgICAgICAxKV07IC8qITwgRmxhZ3MgZm9yIGludGVybmFsIGRlY29kZXIgdXNlIChlbGVtZW50IHNwZWNpZmljKS4gRE8KKyAgICAgICAgICAgICAgICAgICAgICAgIE5PVCBVU0Ugc2VsZjo6c3RyZWFtaW5mbzo6ZmxhZ3MgISAqLwogCi0gIE1QNF9FTEVNRU5UX0lEICAgICAgICBlbGVtZW50c1soOCldOyAvKiE8IFRhYmxlIHdoZXJlIHRoZSBlbGVtZW50IElkJ3MgYXJlIGxpc3RlZCAgICAgICAgICAqLwotICBVQ0hBUiAgICAgICAgICAgICAgICAgZWxUYWdzWyg4KV07ICAgLyohPCBUYWJsZSB3aGVyZSB0aGUgZWxlbWVudHMgaWQgVGFncyBhcmUgbGlzdGVkICAgICAgKi8KLSAgVUNIQVIgICAgICAgICAgICAgICAgIGNoTWFwcGluZ1soOCldOyAgIC8qITwgVGFibGUgb2YgTVBFRyBjYW5vbmljYWwgb3JkZXIgdG8gYml0c3RyZWFtIGNoYW5uZWwgb3JkZXIgbWFwcGluZy4gKi8KKyAgTVA0X0VMRU1FTlRfSUQgZWxlbWVudHNbKDMgKiAoKDgpICogMikgKyAoKCg4KSAqIDIpKSAvIDIgKyA0ICogKDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpXTsgLyohPCBUYWJsZSB3aGVyZSB0aGUgZWxlbWVudCBJZCdzIGFyZSBsaXN0ZWQgKi8KKyAgVUNIQVIgZWxUYWdzWygzICogKCg4KSAqIDIpICsgKCgoOCkgKiAyKSkgLyAyICsgNCAqICgxKSArCisgICAgICAgICAgICAgICAgMSldOyAvKiE8IFRhYmxlIHdoZXJlIHRoZSBlbGVtZW50cyBpZCBUYWdzIGFyZSBsaXN0ZWQgICAgICAqLworICBVQ0hBUiBjaE1hcHBpbmdbKCg4KSAqIDIpXTsgLyohPCBUYWJsZSBvZiBNUEVHIGNhbm9uaWNhbCBvcmRlciB0byBiaXRzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgb3JkZXIgbWFwcGluZy4gKi8KIAotICBBVURJT19DSEFOTkVMX1RZUEUgICAgY2hhbm5lbFR5cGVbKDgpXTsgICAgLyohPCBBdWRpbyBjaGFubmVsIHR5cGUgb2YgZWFjaCBvdXRwdXQgYXVkaW8gY2hhbm5lbCAoZnJvbSAwIHVwdG8gbnVtQ2hhbm5lbHMpLiAgICAgICAgICAgKi8KLSAgVUNIQVIgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzWyg4KV07IC8qITwgQXVkaW8gY2hhbm5lbCBpbmRleCBmb3IgZWFjaCBvdXRwdXQgYXVkaW8gY2hhbm5lbCAoZnJvbSAwIHVwdG8gbnVtQ2hhbm5lbHMpLiAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlIElTTy9JRUMgMTM4MTgtNzoyMDA1KEUpLCA4LjUuMy4yIEV4cGxpY2l0IGNoYW5uZWwgbWFwcGluZyB1c2luZyBhIHByb2dyYW1fY29uZmlnX2VsZW1lbnQoKSAqLworICBBVURJT19DSEFOTkVMX1RZUEUgY2hhbm5lbFR5cGVbKDgpXTsgLyohPCBBdWRpbyBjaGFubmVsIHR5cGUgb2YgZWFjaCBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIGNoYW5uZWwgKGZyb20gMCB1cHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscykuICAgICAgICAgICAqLworICBVQ0hBUiBjaGFubmVsSW5kaWNlc1soOCldOyAvKiE8IEF1ZGlvIGNoYW5uZWwgaW5kZXggZm9yIGVhY2ggb3V0cHV0IGF1ZGlvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgKGZyb20gMCB1cHRvIG51bUNoYW5uZWxzKS4gICAgICAgICAqLworICAvKiBTZWUgSVNPL0lFQyAxMzgxOC03OjIwMDUoRSksIDguNS4zLjIgRXhwbGljaXQgY2hhbm5lbCBtYXBwaW5nIHVzaW5nIGEKKyAgICogcHJvZ3JhbV9jb25maWdfZWxlbWVudCgpICovCiAKKyAgRkRLX2NoYW5uZWxNYXBEZXNjciBtYXBEZXNjcjsgLyohPCBEZXNjcmliZXMgdGhlIG91dHB1dCBjaGFubmVsIG1hcHBpbmcuICovCisgIFVDSEFSIGNoTWFwSW5kZXg7IC8qITwgSW5kZXggdG8gYWNjZXNzIG9uZSBsaW5lIG9mIHRoZSBjaGFubmVsT3V0cHV0TWFwcGluZworICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS4gVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIG5vdCBhbGwgOCBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25zIGhhdmUgdGhlIHNhbWUgb3V0cHV0IG1hcHBpbmcuICovCisgIElOVCBzYnJEYXRhTGVuOyAgIC8qITwgRXhwZWN0ZWQgbGVuZ3RoIG9mIHRoZSBTQlIgcmVtYWluaW5nIGluIGJpdGJ1ZmZlciBhZnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBBQUMgcGF5bG9hZCBoYXMgYmVlbiBwYXJlZC4gICAqLwogCi0gIGNvbnN0IFVDSEFSICAgICAgICAgKCpjaGFubmVsT3V0cHV0TWFwcGluZylbOF07ICAgIC8qITwgVGFibGUgZm9yIE1QRUcgY2Fub25pY2FsIG9yZGVyIHRvIG91dHB1dCBjaGFubmVsIG9yZGVyIG1hcHBpbmcuICovCi0gIFVDSEFSICAgICAgICAgICAgICAgICBjaE1hcEluZGV4OyAgICAgICAgICAgICAgICAgIC8qITwgSW5kZXggdG8gYWNjZXNzIG9uZSBsaW5lIG9mIHRoZSBjaGFubmVsT3V0cHV0TWFwcGluZyB0YWJsZS4gVGhpcyBpcyByZXF1aXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2Ugbm90IGFsbCA4IGNoYW5uZWwgY29uZmlndXJhdGlvbnMgaGF2ZSB0aGUgc2FtZSBvdXRwdXQgbWFwcGluZy4gKi8KKyAgQ1Byb2dyYW1Db25maWcgcGNlOworICBDU3RyZWFtSW5mbworICAgICAgc3RyZWFtSW5mbzsgLyohPCBQb2ludGVyIHRvIFN0cmVhbUluZm8gZGF0YSAocmVhZCBmcm9tIHRoZSBiaXRzdHJlYW0pICovCisgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8KKyAgICAgICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvWyg4KV07IC8qITwgVGVtcG9yYWwgY2hhbm5lbCBtZW1vcnkgKi8KKyAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbworICAgICAgKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bKDgpXTsgLyohPCBQZXJzaXN0ZW50IGNoYW5uZWwgbWVtb3J5ICovCiAKLSAgQ1Byb2dyYW1Db25maWcgICAgICAgICAgICAgICAgcGNlOwotICBDU3RyZWFtSW5mbyAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvOyAgICAgICAgIC8qITwgcG9pbnRlciB0byBTdHJlYW1JbmZvIGRhdGEgKHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtKSAqLwotICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICAgICAgICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvWyg4KV07ICAgICAgIC8qITwgVGVtcG9yYWwgY2hhbm5lbCBtZW1vcnkgKi8KLSAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1soOCldOyAvKiE8IFBlcnNpc3RlbnQgY2hhbm5lbCBtZW1vcnkgKi8KKyAgRklYUF9EQkwgKndvcmtCdWZmZXJDb3JlMjsKKyAgUENNX0RFQyAqcFRpbWVEYXRhMjsKKyAgSU5UIHRpbWVEYXRhMlNpemU7CiAKLSAgQ0FhY0RlY29kZXJDb21tb25EYXRhICAgICAgICAgYWFjQ29tbW9uRGF0YTsgICAgICAgICAgICAgLyohPCBUZW1wb3JhbCBzaGFyZWQgZGF0YSBmb3IgYWxsIGNoYW5uZWxzIGhvb2tlZCBpbnRvIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKi8KKyAgQ3BlUGVyc2lzdGVudERhdGEgKmNwZVN0YXRpY0RhdGFbKAorICAgICAgMyAqICgoOCkgKiAyKSArICgoKDgpICogMikpIC8gMiArIDQgKiAoMSkgKworICAgICAgMSldOyAvKiE8IFBvaW50ZXIgdG8gcGVyc2lzdGVudCBkYXRhIHNoYXJlZCBieSBib3RoIGNoYW5uZWxzIG9mIGEgQ1BFLgorVGhpcyBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIG9uY2UgZm9yIGVhY2ggQ1BFLiAqLwogCi0gIENDb25jZWFsUGFyYW1zICAgICAgICAgICAgICAgIGNvbmNlYWxDb21tb25EYXRhOworICBDQ29uY2VhbFBhcmFtcyBjb25jZWFsQ29tbW9uRGF0YTsKKyAgQ0NvbmNlYWxtZW50TWV0aG9kIGNvbmNlYWxNZXRob2RVc2VyOwogCi0gIElOVCAgICAgICAgICAgICAgICAgICBhYWNDaGFubmVsc1ByZXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBhbW91bnQgb2YgQUFDIGNvcmUgY2hhbm5lbHMgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBkZWNvZGUgY2FsbC4gICAgICAgICAqLwotICBBVURJT19DSEFOTkVMX1RZUEUgICAgY2hhbm5lbFR5cGVQcmV2Wyg4KV07ICAgICAvKiE8IEFycmF5IGhvbGRpbmcgdGhlIGNoYW5uZWxUeXBlIHZhbHVlcyBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIGRlY29kZSBjYWxsLiAgICAqLwotICBVQ0hBUiAgICAgICAgICAgICAgICAgY2hhbm5lbEluZGljZXNQcmV2Wyg4KV07ICAvKiE8IEFycmF5IGhvbGRpbmcgdGhlIGNoYW5uZWxJbmRpY2VzIHZhbHVlcyBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIGRlY29kZSBjYWxsLiAqLworICBDVXNhY0NvcmVFeHRlbnNpb25zIHVzYWNDb3JlRXh0OyAvKiE8IERhdGEgYW5kIGhhbmRsZXMgdG8gZXh0ZW5kIFVTQUMgRkQvTFBECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUgZGVjb2RlciAoU0JSLCBNUFMsIC4uLikgKi8KKyAgVUlOVCBudW1Vc2FjRWxlbWVudHNbKDEgKiAxKV07CisgIFVDSEFSIHVzYWNTdGVyZW9Db25maWdJbmRleFsoMyAqICgoOCkgKiAyKSArICgoKDgpICogMikpIC8gMiArIDQgKiAoMSkgKyAxKV07CisgIGNvbnN0IENTVXNhY0NvbmZpZyAqcFVzYWNDb25maWdbKDEgKiAxKV07CisgIElOVCBuYkRpdjsgLyohPCBudW1iZXIgb2YgZnJhbWUgZGl2aXNpb25zIGluIExQRC1kb21haW4gKi8KIAorICBVQ0hBUiB1c2VMZFFtZlRpbWVBbGlnbjsKIAotICBIQU5ETEVfU0JSREVDT0RFUiAgIGhTYnJEZWNvZGVyOyAgICAgICAgICAgICAgICAgICAvKiE8IFNCUiBkZWNvZGVyIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICBVQ0hBUiAgICAgICAgICAgICAgIHNickVuYWJsZWQ7ICAgICAgICAgICAgICAgICAgICAvKiE8IGZsYWcgdG8gc3RvcmUgaWYgU0JSIGhhcyBiZWVuIGRldGVjdGVkICAgICAqLwotICBVQ0hBUiAgICAgICAgICAgICAgIHNickVuYWJsZWRQcmV2OyAgICAgICAgICAgICAgICAvKiE8IGZsYWcgdG8gc3RvcmUgaWYgU0JSIGhhcyBiZWVuIGRldGVjdGVkIGZyb20gcHJldmlvdXMgZnJhbWUgKi8KLSAgVUNIQVIgICAgICAgICAgICAgICBwc1Bvc3NpYmxlOyAgICAgICAgICAgICAgICAgICAgLyohPCBmbGFnIHRvIHN0b3JlIGlmIFBTIGlzIHBvc3NpYmxlICAgICAgICAgICAgKi8KLSAgU0JSX1BBUkFNUyAgICAgICAgICBzYnJQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgLyohPCBzdHJ1Y3QgdG8gc3RvcmUgYWxsIHNiciBwYXJhbWV0ZXJzICAgICAgICAgKi8KKyAgSU5UIGFhY0NoYW5uZWxzUHJldjsgLyohPCBUaGUgYW1vdW50IG9mIEFBQyBjb3JlIGNoYW5uZWxzIG9mIHRoZSBsYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWwgZGVjb2RlIGNhbGwuICAgICAgICAgKi8KKyAgQVVESU9fQ0hBTk5FTF9UWVBFIGNoYW5uZWxUeXBlUHJldlsoOCldOyAvKiE8IEFycmF5IGhvbGRpbmcgdGhlIGNoYW5uZWxUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGUgY2FsbC4gICAgKi8KKyAgVUNIQVIKKyAgY2hhbm5lbEluZGljZXNQcmV2Wyg4KV07IC8qITwgQXJyYXkgaG9sZGluZyB0aGUgY2hhbm5lbEluZGljZXMgdmFsdWVzIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGFzdCBzdWNjZXNzZnVsIGRlY29kZSBjYWxsLiAqLwogCi0gIFFNRl9NT0RFICAgcW1mTW9kZUN1cnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIGN1cnJlbnQgUU1GIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFFNRl9NT0RFICAgcW1mTW9kZVVzZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIFFNRiBtb2RlIHJlcXVlc3RlZCBieSB0aGUgbGlicmFyeSB1c2VyICovCisgIFVDSEFSCisgIGRvd25zY2FsZUZhY3RvcjsgLyohPCBWYXJpYWJsZSB0byBzdG9yZSBhIHN1cHBvcnRlZCBFTEQgZG93bnNjYWxlIGZhY3RvcgorICAgICAgICAgICAgICAgICAgICAgIG9mIDEsIDIsIDMgb3IgNCAqLworICBVQ0hBUiBkb3duc2NhbGVGYWN0b3JJbkJTOyAvKiE8IFZhcmlhYmxlIHRvIHN0b3JlIHRoZSAobm90IG5lY2Vzc2FyaWx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCkgRUxEIGRvd25zY2FsZSBmYWN0b3IgZGlzY292ZXJlZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtICovCiAKLSAgSEFORExFX0FBQ19EUkMgIGhEcmNJbmZvOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBoYW5kbGUgdG8gRFJDIGRhdGEgc3RydWN0dXJlICAgICAgICAgICAgICAgKi8KKyAgSEFORExFX1NCUkRFQ09ERVIgaFNickRlY29kZXI7IC8qITwgU0JSIGRlY29kZXIgaGFuZGxlLiAqLworICBVQ0hBUiBzYnJFbmFibGVkOyAgICAgLyohPCBmbGFnIHRvIHN0b3JlIGlmIFNCUiBoYXMgYmVlbiBkZXRlY3RlZCAgICAgKi8KKyAgVUNIQVIgc2JyRW5hYmxlZFByZXY7IC8qITwgZmxhZyB0byBzdG9yZSBpZiBTQlIgaGFzIGJlZW4gZGV0ZWN0ZWQgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgZnJhbWUgKi8KKyAgVUNIQVIgcHNQb3NzaWJsZTsgICAgIC8qITwgZmxhZyB0byBzdG9yZSBpZiBQUyBpcyBwb3NzaWJsZSAgICAgICAgICAgICovCisgIFNCUl9QQVJBTVMgc2JyUGFyYW1zOyAvKiE8IHN0cnVjdCB0byBzdG9yZSBhbGwgc2JyIHBhcmFtZXRlcnMgICAgICAgICAqLwogCisgIFVDSEFSICpwRHJtQnNCdWZmZXI7IC8qITwgUG9pbnRlciB0byBkeW5hbWljIGJ1ZmZlciB3aGljaCBpcyB1c2VkIHRvIHJldmVyc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHMgb2YgdGhlIERSTSBTQlIgcGF5bG9hZCAqLworICBVU0hPUlQgZHJtQnNCdWZmZXJTaXplOyAvKiE8IFNpemUgb2YgdGhlIGR5bmFtaWMgYnVmZmVyIHdoaWNoIGlzIHVzZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZSB0aGUgYml0cyBvZiB0aGUgRFJNIFNCUiBwYXlsb2FkICovCisgIEZES19RTUZfRE9NQUlOCisgIHFtZkRvbWFpbjsgLyohPCBJbnN0YW5jZSBvZiBtb2R1bGUgZm9yIFFNRiBkb21haW4gZGF0YSBoYW5kbGluZyAqLwogCi0gIENBbmNEYXRhICAgICAgYW5jRGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgc3RydWN0dXJlIHRvIGhhbmRsZSBhbmNpbGxhcnkgZGF0YSAgICAgICAgICovCisgIFFNRl9NT0RFIHFtZk1vZGVDdXJyOyAvKiE8IFRoZSBjdXJyZW50IFFNRiBtb2RlICAgICAgICAgICAgICAgICAgICAgICAqLworICBRTUZfTU9ERSBxbWZNb2RlVXNlcjsgLyohPCBUaGUgUU1GIG1vZGUgcmVxdWVzdGVkIGJ5IHRoZSBsaWJyYXJ5IHVzZXIgKi8KIAotICBIQU5ETEVfUENNX0RPV05NSVggIGhQY21VdGlsczsgICAgICAgICAgICAgICAgICAgICAvKiE8IHByaXZhdCBkYXRhIGZvciB0aGUgUENNIHV0aWxzLiAgICAgICAgICAgICAqLwotICBURExpbWl0ZXJQdHIgaExpbWl0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhhbmRsZSBvZiB0aW1lIGRvbWFpbiBsaW1pdGVyLiAgICAgICAgICAgICAqLwotICBVQ0hBUiAgICAgICAgbGltaXRlckVuYWJsZVVzZXI7ICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBsaW1pdGVyIGNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkIGJ5IHRoZSBsaWJyYXJ5IHVzZXIgKi8KLSAgVUNIQVIgICAgICAgIGxpbWl0ZXJFbmFibGVDdXJyOyAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgY3VycmVudCBsaW1pdGVyIGNvbmZpZ3VyYXRpb24uICAgICAgICAgKi8KKyAgSEFORExFX0FBQ19EUkMgaERyY0luZm87IC8qITwgaGFuZGxlIHRvIERSQyBkYXRhIHN0cnVjdHVyZSAgICAgICAgICAgICAgICovCisgIElOVCBtZXRhZGF0YUV4cGlyeTsgICAgICAvKiE8IE1ldGFkYXRhIGV4cGlyeSB0aW1lIGluIG1pbGxpLXNlY29uZHMuICAgICAqLwogCi0gIEZJWFBfREJMICAgICBleHRHYWluWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgR2FpbiB0aGF0IG11c3QgYmUgYXBwbGllZCB0byB0aGUgb3V0cHV0IHNpZ25hbC4gKi8KLSAgVUlOVCAgICAgICAgIGV4dEdhaW5EZWxheTsgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEZWxheSB0aGF0IG11c3QgYmUgYWNjb3VudGVkIGZvciBleHRHYWluLiAqLworICB2b2lkICpwTXBlZ1N1cnJvdW5kRGVjb2RlcjsgLyohPCBwb2ludGVyIHRvIG1wZWcgc3Vycm91bmQgZGVjb2RlciBzdHJ1Y3R1cmUgKi8KKyAgVUNIQVIgbXBzRW5hYmxlVXNlcjsgICAgICAgIC8qITwgTVBTIGVuYWJsZSB1c2VyIGZsYWcgICAgICAgICAgICAgICAgICAgICAgICovCisgIFVDSEFSIG1wc0VuYWJsZUN1cnI7ICAgICAgICAvKiE8IE1QUyBlbmFibGUgZGVjb2RlciBzdGF0ZSAgICAgICAgICAgICAgICAgICAqLworICBVQ0hBUiBtcHNBcHBsaWNhYmxlOyAgICAgICAgLyohPCBNUFMgYXBwbGljYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU0NIQVIgbXBzT3V0cHV0TW9kZTsgLyohPCBzZXR0aW5nOiBub3JtYWwgPSAwLCBiaW5hdXJhbCA9IDEsIHN0ZXJlbyA9IDIsIDUuMWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAqLworICBJTlQgbXBzT3V0Q2hhbm5lbHNMYXN0OyAvKiE8IFRoZSBhbW91bnQgb2YgY2hhbm5lbHMgcmV0dXJuZWQgYnkgdGhlIGxhc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bCBNUFMgZGVjb2RlciBjYWxsLiAqLworICBJTlQgbXBzRnJhbWVTaXplTGFzdDsgICAvKiE8IFRoZSBmcmFtZSBsZW5ndGggcmV0dXJuZWQgYnkgdGhlIGxhc3Qgc3VjY2Vzc2Z1bAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUFMgZGVjb2RlciBjYWxsLiAqLwogCi0gIElOVF9QQ00gICAgICBwY21PdXRwdXRCdWZmZXJbKDgpKigyMDQ4KV07CisgIENBbmNEYXRhIGFuY0RhdGE7IC8qITwgc3RydWN0dXJlIHRvIGhhbmRsZSBhbmNpbGxhcnkgZGF0YSAgICAgICAgICovCiAKKyAgSEFORExFX1BDTV9ET1dOTUlYIGhQY21VdGlsczsgLyohPCBwcml2YXQgZGF0YSBmb3IgdGhlIFBDTSB1dGlscy4gKi8KKworICBURExpbWl0ZXJQdHIgaExpbWl0ZXI7ICAgLyohPCBIYW5kbGUgb2YgdGltZSBkb21haW4gbGltaXRlci4gICAgICAgICAgICAgKi8KKyAgVUNIQVIgbGltaXRlckVuYWJsZVVzZXI7IC8qITwgVGhlIGxpbWl0ZXIgY29uZmlndXJhdGlvbiByZXF1ZXN0ZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5IHVzZXIgKi8KKyAgVUNIQVIgbGltaXRlckVuYWJsZUN1cnI7IC8qITwgVGhlIGN1cnJlbnQgbGltaXRlciBjb25maWd1cmF0aW9uLiAgICAgICAgICovCisgIEZJWFBfREJMIGV4dEdhaW5bMV07IC8qITwgR2FpbiB0aGF0IG11c3QgYmUgYXBwbGllZCB0byB0aGUgb3V0cHV0IHNpZ25hbC4gKi8KKyAgVUlOVCBleHRHYWluRGVsYXk7ICAgLyohPCBEZWxheSB0aGF0IG11c3QgYmUgYWNjb3VudGVkIGZvciBleHRHYWluLiAqLworCisgIElOVF9QQ00gcGNtT3V0cHV0QnVmZmVyWyg4KSAqICgxMDI0ICogMildOworCisgIEhBTkRMRV9EUkNfREVDT0RFUiBoVW5pRHJjRGVjb2RlcjsKKyAgVUNIQVIgbXVsdGliYW5kRHJjUHJlc2VudDsKKyAgVUNIQVIgbnVtVGltZVNsb3RzOworICBVSU5UIGxvdWRuZXNzSW5mb1NldFBvc2l0aW9uWzNdOworICBTQ0hBUiBkZWZhdWx0VGFyZ2V0TG91ZG5lc3M7CisKKyAgSU5UX1BDTQorICAqcFRpbWVEYXRhRmx1c2hbKCg4KSAqIDIpXTsgLyohPCBQb2ludGVyIHRvIHRoZSBmbHVzaGVkIHRpbWUgZGF0YSB3aGljaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSB1c2VkIGZvciB0aGUgY3Jvc3NmYWRlIGluIGNhc2Ugb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIFVTQUMgREFTSCBJUEYgY29uZmlnIGNoYW5nZSAqLworCisgIFVDSEFSIGZsdXNoU3RhdHVzOyAgICAgLyohPCBJbmRpY2F0ZXMgZmx1c2ggc3RhdHVzOiBvbnxvZmYgKi8KKyAgU0NIQVIgZmx1c2hDbnQ7ICAgICAgICAvKiE8IEZsdXNoIGZyYW1lIGNvdW50ZXIgKi8KKyAgVUNIQVIgYnVpbGRVcFN0YXR1czsgICAvKiE8IEluZGljYXRlcyBidWlsZCB1cCBzdGF0dXM6IG9ufG9mZiAqLworICBTQ0hBUiBidWlsZFVwQ250OyAgICAgIC8qITwgQnVpbGQgdXAgZnJhbWUgY291bnRlciAqLworICBVQ0hBUiBoYXNBdWRpb1ByZVJvbGw7IC8qITwgSW5kaWNhdGVzIHByZVJvbGwgc3RhdHVzOiBvbnxvZmYgKi8KKyAgVUlOVCBwcmVyb2xsQVVMZW5ndGhbQUFDREVDX01BWF9OVU1fUFJFUk9MTF9BVSArIDFdOyAvKiE8IFJlbGF0aXZlIG9mZnNldCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcmVyb2xsQVUgZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gdG8gdGhlIEFVCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgcG9zaXRpb24gaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtICovCisgIElOVCBhY2Nlc3NVbml0OyAvKiE8IE51bWJlciBvZiB0aGUgYWN0dWFsIHByb2Nlc3NlZCBwcmVyb2xsIGFjY2Vzc1VuaXQgKi8KKyAgVUNIQVIgYXBwbHlDcm9zc2ZhZGU7IC8qITwgaWYgc2V0IGNyb3NzZmFkZSBmb3Igc2VhbWxlc3Mgc3RyZWFtIHN3aXRjaGluZyBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGllZCAqLworCisgIEZES19TaWduYWxEZWxheSB1c2FjUmVzaWR1YWxEZWxheTsgLyohPCBEZWxheSByZXNpZHVhbCBzaWduYWwgdG8gY29tcGVuc2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBlU0JSIGRlbGF5IG9mIERNWCBzaWduYWwgaW4gY2FzZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXJlb0NvbmZpZ0luZGV4PT0yLiAqLwogfTsKIAotCi0jZGVmaW5lIEFBQ19ERUJVR19FWFRITFAgIlwKKyNkZWZpbmUgQUFDX0RFQlVHX0VYVEhMUCBcCisgICJcCiAtLS0gQUFDLUNvcmUgLS0tXG5cCiAgICAgMHgwMDAxMDAwMCBIZWFkZXIgZGF0YVxuXAogICAgIDB4MDAwMjAwMDAgQ1JDIGRhdGFcblwKQEAgLTI3Miw3ICszODgsOCBAQAogCiAgIFxyZXR1cm4gIEVycm9yIGNvZGUKICovCi1BQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9BbmNEYXRhSW5pdChDQW5jRGF0YSAqYW5jRGF0YSwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSk7CitBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9BbmNEYXRhSW5pdChDQW5jRGF0YSAqYW5jRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpOwogCiAvKiEKICAgXGJyaWVmIEdldCBvbmUgYW5jaWxsYXJ5IGRhdGEgZWxlbWVudApAQCAtMjgwLDIwICszOTcsMjIgQEAKICAgXGFuY0RhdGEgUG9pbnRlciB0byBhbmNpbGxhcnkgZGF0YSBzdHJ1Y3R1cmUKICAgXGluZGV4IEluZGV4IG9mIHRoZSBhbmMgZGF0YSBlbGVtZW50IHRvIGdldAogICBccHRyIFBvaW50ZXIgdG8gYSBidWZmZXIgcmVjZWl2aW5nIGEgcG9pbnRlciB0byB0aGUgcmVxdWVzdGVkIGFuYyBkYXRhIGVsZW1lbnQKLSAgXHNpemUgUG9pbnRlciB0byBhIGJ1ZmZlciByZWNlaXZpbmcgdGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdGVkIGFuYyBkYXRhIGVsZW1lbnQKKyAgXHNpemUgUG9pbnRlciB0byBhIGJ1ZmZlciByZWNlaXZpbmcgdGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdGVkIGFuYyBkYXRhCisgIGVsZW1lbnQKIAogICBccmV0dXJuICBFcnJvciBjb2RlCiAqLwotQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfQW5jRGF0YUdldChDQW5jRGF0YSAqYW5jRGF0YSwgaW50IGluZGV4LCB1bnNpZ25lZCBjaGFyICoqcHRyLCBpbnQgKnNpemUpOwotCitBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9BbmNEYXRhR2V0KENBbmNEYXRhICphbmNEYXRhLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKipwdHIsIGludCAqc2l6ZSk7CiAKIC8qIGluaXRpYWxpemF0aW9uIG9mIGFhYyBkZWNvZGVyICovCiBMSU5LU1BFQ19IIEhBTkRMRV9BQUNERUNPREVSIENBYWNEZWNvZGVyX09wZW4oVFJBTlNQT1JUX1RZUEUgYnNGb3JtYXQpOwogCi0vKiBJbml0aWFsaXphdGlvbiBvZiBzdHJlYW0taW5mbyBlbGVtZW50cyAqLworLyogSW5pdGlhbGl6YXRpb24gb2YgY2hhbm5lbCBlbGVtZW50cyAqLwogTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9Jbml0KEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICphc2MpOwotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICphc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgY29uZmlnTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqY29uZmlnQ2hhbmdlZCk7CiAvKiEKICAgXGJyaWVmIERlY29kZXMgb25lIGFhYyBmcmFtZQogCkBAIC0zMDgsMTggKzQyNywzOSBAQAogICBccmV0dXJuICBlcnJvciBzdGF0dXMKICovCiBMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SIENBYWNEZWNvZGVyX0RlY29kZUZyYW1lKAotICAgICAgICBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAotICAgICAgICBjb25zdCBVSU5UIGZsYWdzLAotICAgICAgICBJTlRfUENNICpwVGltZURhdGEsCi0gICAgICAgIGNvbnN0IElOVCAgdGltZURhdGFTaXplLAotICAgICAgICBjb25zdCBJTlQgaW50ZXJsZWF2ZWQKLSAgICAgICAgKTsKKyAgICBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLCBjb25zdCBVSU5UIGZsYWdzLCBGSVhQX1BDTSAqcFRpbWVEYXRhLAorICAgIGNvbnN0IElOVCB0aW1lRGF0YVNpemUsIGNvbnN0IGludCB0aW1lRGF0YUNoYW5uZWxPZmZzZXQpOworCisvKiBGcmVlIGNvbmZpZyBkZXBlbmRlbnQgQUFDIG1lbW9yeSAqLworTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9GcmVlTWVtKEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN1YlN0cmVhbUluZGV4KTsKKworLyogUHJlcGFyZSBjcm9zc2ZhZGUgZm9yIFVTQUMgREFTSCBJUEYgY29uZmlnIGNoYW5nZSAqLworTElOS1NQRUNfSCBBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9QcmVwYXJlQ3Jvc3NGYWRlKAorICAgIGNvbnN0IElOVF9QQ00gKnBUaW1lRGF0YSwgSU5UX1BDTSAqKnBUaW1lRGF0YUZsdXNoLCBjb25zdCBJTlQgbnVtQ2hhbm5lbHMsCisgICAgY29uc3QgSU5UIGZyYW1lU2l6ZSwgY29uc3QgSU5UIGludGVybGVhdmVkKTsKKworLyogQXBwbHkgY3Jvc3NmYWRlIGZvciBVU0FDIERBU0ggSVBGIGNvbmZpZyBjaGFuZ2UgKi8KK0xJTktTUEVDX0ggQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfQXBwbHlDcm9zc0ZhZGUoCisgICAgSU5UX1BDTSAqcFRpbWVEYXRhLCBJTlRfUENNICoqcFRpbWVEYXRhRmx1c2gsIGNvbnN0IElOVCBudW1DaGFubmVscywKKyAgICBjb25zdCBJTlQgZnJhbWVTaXplLCBjb25zdCBJTlQgaW50ZXJsZWF2ZWQpOworCisvKiBTZXQgZmx1c2ggYW5kIGJ1aWxkIHVwIG1vZGUgKi8KK0xJTktTUEVDX0ggQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfQ3RybENGR0NoYW5nZShIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGZsdXNoU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSIGZsdXNoQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGJ1aWxkVXBTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgYnVpbGRVcENudCk7CisKKy8qIFBhcnNlIHByZVJvbGwgRXh0ZW5zaW9uIFBheWxvYWQgKi8KK0xJTktTUEVDX0ggQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfUHJlUm9sbEV4dGVuc2lvblBheWxvYWRQYXJzZSgKKyAgICBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLCBVSU5UICpudW1QcmVyb2xsQVUsIFVJTlQgKnByZXJvbGxBVU9mZnNldCwKKyAgICBVSU5UICpwcmVyb2xsQVVMZW5ndGgpOwogCiAvKiBEZXN0cm95IGFhYyBkZWNvZGVyICovCi1MSU5LU1BFQ19IIHZvaWQgQ0FhY0RlY29kZXJfQ2xvc2UgKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmICk7CitMSU5LU1BFQ19IIHZvaWQgQ0FhY0RlY29kZXJfQ2xvc2UoSEFORExFX0FBQ0RFQ09ERVIgc2VsZik7CiAKIC8qIGdldCBzdHJlYW1pbmZvIGhhbmRsZSBmcm9tIGRlY29kZXIgKi8KLUxJTktTUEVDX0ggQ1N0cmVhbUluZm8qIENBYWNEZWNvZGVyX0dldFN0cmVhbUluZm8gKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmICk7Ci0KK0xJTktTUEVDX0ggQ1N0cmVhbUluZm8gKkNBYWNEZWNvZGVyX0dldFN0cmVhbUluZm8oSEFORExFX0FBQ0RFQ09ERVIgc2VsZik7CiAKICNlbmRpZiAvKiAjaWZuZGVmIEFBQ0RFQ09ERVJfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNkZWNvZGVyX2xpYi5jcHAgYi9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXJfbGliLmNwcAppbmRleCA1MGVmYjBmLi5kOThjZjVhIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXJfbGliLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXJfbGliLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCisKICAgIERlc2NyaXB0aW9uOgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiYWFjZGVjb2Rlcl9saWIuaCIKIApAQCAtOTUsMjIgKzEwNywyMCBAQAogI2luY2x1ZGUgInRwZGVjX2xpYi5oIgogI2luY2x1ZGUgIkZES19jb3JlLmgiIC8qIEZES190b29scyB2ZXJzaW9uIGluZm8gKi8KIAotCi0gI2luY2x1ZGUgInNicmRlY29kZXIuaCIKLQotCi0KKyNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCiAKICNpbmNsdWRlICJjb25jZWFsLmgiCiAKLSAjaW5jbHVkZSAiYWFjZGVjX2RyYy5oIgorI2luY2x1ZGUgImFhY2RlY19kcmMuaCIKIAorI2luY2x1ZGUgInNhY19kZWNfbGliLmgiCiAKKyNpbmNsdWRlICJwY21fdXRpbHMuaCIKIAogLyogRGVjb2RlciBsaWJyYXJ5IGluZm8gKi8KLSNkZWZpbmUgQUFDREVDT0RFUl9MSUJfVkwwIDIKLSNkZWZpbmUgQUFDREVDT0RFUl9MSUJfVkwxIDUKLSNkZWZpbmUgQUFDREVDT0RFUl9MSUJfVkwyIDE3CisjZGVmaW5lIEFBQ0RFQ09ERVJfTElCX1ZMMCAzCisjZGVmaW5lIEFBQ0RFQ09ERVJfTElCX1ZMMSAwCisjZGVmaW5lIEFBQ0RFQ09ERVJfTElCX1ZMMiAwCiAjZGVmaW5lIEFBQ0RFQ09ERVJfTElCX1RJVExFICJBQUMgRGVjb2RlciBMaWIiCiAjaWZkZWYgX19BTkRST0lEX18KICNkZWZpbmUgQUFDREVDT0RFUl9MSUJfQlVJTERfREFURSAiIgpAQCAtMTIwLDE5ICsxMzAsMzggQEAKICNkZWZpbmUgQUFDREVDT0RFUl9MSUJfQlVJTERfVElNRSBfX1RJTUVfXwogI2VuZGlmCiAKLXN0YXRpYyBBQUNfREVDT0RFUl9FUlJPUgotc2V0Q29uY2VhbE1ldGhvZCAoIGNvbnN0IEhBTkRMRV9BQUNERUNPREVSICBzZWxmLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICBtZXRob2QgKTsKK3N0YXRpYyBBQUNfREVDT0RFUl9FUlJPUiBzZXRDb25jZWFsTWV0aG9kKGNvbnN0IEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbWV0aG9kKTsKIAorc3RhdGljIHZvaWQgYWFjRGVjb2Rlcl9zZXRNZXRhZGF0YUV4cGlyeShjb25zdCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgdmFsdWUpIHsKKyAgLyogY2hlY2sgZGVjb2RlciBoYW5kbGUgKi8KKyAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgIElOVCBtZEV4cEZyYW1lID0gMDsgLyogZGVmYXVsdDogZGlzYWJsZSAqLwogCi1MSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IgYWFjRGVjb2Rlcl9HZXRGcmVlQnl0ZXMgKCBjb25zdCBIQU5ETEVfQUFDREVDT0RFUiAgc2VsZiwgVUlOVCAqcEZyZWVCeXRlcyl7CisgICAgaWYgKCh2YWx1ZSA+IDApICYmCisgICAgICAgIChzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSA+CisgICAgICAgICAwKSkgeyAvKiBEZXRlcm1pbmUgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIGZyYW1lczogKi8KKyAgICAgIEZJWFBfREJMIGZyYW1lVGltZSA9IGZEaXZOb3JtKHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lICogMTAwMCk7CisgICAgICBtZEV4cEZyYW1lID0gZk11bHRJY2VpbChmcmFtZVRpbWUsIHZhbHVlKTsKKyAgICB9CiAKKyAgICAvKiBDb25maWd1cmUgRFJDIG1vZHVsZSAqLworICAgIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0oc2VsZi0+aERyY0luZm8sIERSQ19EQVRBX0VYUElSWV9GUkFNRSwgbWRFeHBGcmFtZSk7CisKKyAgICAvKiBDb25maWd1cmUgUENNIGRvd25taXggbW9kdWxlICovCisgICAgcGNtRG14X1NldFBhcmFtKHNlbGYtPmhQY21VdGlscywgRE1YX0JTX0RBVEFfRVhQSVJZX0ZSQU1FLCBtZEV4cEZyYW1lKTsKKyAgfQorfQorCitMSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IKK2FhY0RlY29kZXJfR2V0RnJlZUJ5dGVzKGNvbnN0IEhBTkRMRV9BQUNERUNPREVSIHNlbGYsIFVJTlQgKnBGcmVlQnl0ZXMpIHsKICAgLyogcmVzZXQgZnJlZSBieXRlcyAqLwogICAqcEZyZWVCeXRlcyA9IDA7CiAKICAgLyogY2hlY2sgaGFuZGxlICovCi0gIGlmKCFzZWxmKQotICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOworICBpZiAoIXNlbGYpIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwogCiAgIC8qIHJldHVybiBuciBvZiBmcmVlIGJ5dGVzICovCiAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcyA9IHRyYW5zcG9ydERlY19HZXRCaXRzdHJlYW0oc2VsZi0+aElucHV0LCAwKTsKQEAgLTE0NSw0MyArMTc0LDQ2IEBACiAvKioKICAqIENvbmZpZyBEZWNvZGVyIHVzaW5nIGEgQ1NBdWRpb1NwZWNpZmljQ29uZmlnIHN0cnVjdC4KICAqLwotc3RhdGljCi1MSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IgYWFjRGVjb2Rlcl9Db25maWcoSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwgY29uc3QgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjU3RydWN0KQoteworc3RhdGljIExJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX0NvbmZpZygKKyAgICBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLCBjb25zdCBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2NTdHJ1Y3QsCisgICAgVUNIQVIgY29uZmlnTW9kZSwgVUNIQVIgKmNvbmZpZ0NoYW5nZWQpIHsKICAgQUFDX0RFQ09ERVJfRVJST1IgZXJyOwogCiAgIC8qIEluaXRpYWxpemUgQUFDIGNvcmUgZGVjb2RlciwgYW5kIHVwZGF0ZSBzZWxmLT5zdHJlYW1pbmZvICovCi0gIGVyciA9IENBYWNEZWNvZGVyX0luaXQoc2VsZiwgcEFzY1N0cnVjdCk7CisgIGVyciA9IENBYWNEZWNvZGVyX0luaXQoc2VsZiwgcEFzY1N0cnVjdCwgY29uZmlnTW9kZSwgY29uZmlnQ2hhbmdlZCk7CisKKyAgaWYgKCFGREtfY2hNYXBEZXNjcl9pc1ZhbGlkKCZzZWxmLT5tYXBEZXNjcikpIHsKKyAgICByZXR1cm4gQUFDX0RFQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOworICB9CiAKICAgcmV0dXJuIGVycjsKIH0KIAotTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfQ29uZmlnUmF3ICgKLSAgICAgICAgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKLSAgICAgICAgVUNIQVIgKmNvbmZbXSwKLSAgICAgICAgY29uc3QgVUlOVCBsZW5ndGhbXSApCi17CitMSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IgYWFjRGVjb2Rlcl9Db25maWdSYXcoSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqY29uZltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGVuZ3RoW10pIHsKICAgQUFDX0RFQ09ERVJfRVJST1IgZXJyID0gQUFDX0RFQ19PSzsKLSAgVFJBTlNQT1JUREVDX0VSUk9SICAgZXJyVHA7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBlcnJUcDsKICAgVUlOVCBsYXllciwgbnJPZkxheWVycyA9IHNlbGYtPm5yT2ZMYXllcnM7CiAKLSAgZm9yKGxheWVyID0gMDsgbGF5ZXIgPCBuck9mTGF5ZXJzOyBsYXllcisrKXsKLSAgICBpZihsZW5ndGhbbGF5ZXJdID4gMCl7Ci0gICAgICBlcnJUcCA9IHRyYW5zcG9ydERlY19PdXRPZkJhbmRDb25maWcoc2VsZi0+aElucHV0LCBjb25mW2xheWVyXSwgbGVuZ3RoW2xheWVyXSwgbGF5ZXIpOworICBmb3IgKGxheWVyID0gMDsgbGF5ZXIgPCBuck9mTGF5ZXJzOyBsYXllcisrKSB7CisgICAgaWYgKGxlbmd0aFtsYXllcl0gPiAwKSB7CisgICAgICBlcnJUcCA9IHRyYW5zcG9ydERlY19PdXRPZkJhbmRDb25maWcoc2VsZi0+aElucHV0LCBjb25mW2xheWVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhbbGF5ZXJdLCBsYXllcik7CiAgICAgICBpZiAoZXJyVHAgIT0gVFJBTlNQT1JUREVDX09LKSB7CiAgICAgICAgIHN3aXRjaCAoZXJyVHApIHsKLSAgICAgICAgY2FzZSBUUkFOU1BPUlRERUNfTkVFRF9UT19SRVNUQVJUOgotICAgICAgICAgIGVyciA9IEFBQ19ERUNfTkVFRF9UT19SRVNUQVJUOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ6Ci0gICAgICAgICAgZXJyID0gQUFDX0RFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgZXJyID0gQUFDX0RFQ19VTktOT1dOOwotICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVFJBTlNQT1JUREVDX05FRURfVE9fUkVTVEFSVDoKKyAgICAgICAgICAgIGVyciA9IEFBQ19ERUNfTkVFRF9UT19SRVNUQVJUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOgorICAgICAgICAgICAgZXJyID0gQUFDX0RFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJyID0gQUFDX0RFQ19VTktOT1dOOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgLyogaWYgYmFzZWxheWVyIGlzIE9LIHdlIGNvbnRpbnVlIGRlY29kaW5nICovCi0gICAgICAgIGlmKGxheWVyID49IDEpeworICAgICAgICBpZiAobGF5ZXIgPj0gMSkgewogICAgICAgICAgIHNlbGYtPm5yT2ZMYXllcnMgPSBsYXllcjsKICAgICAgICAgICBlcnIgPSBBQUNfREVDX09LOwogICAgICAgICB9CkBAIC0xOTMsMzkgKzIyNSw5MSBAQAogICByZXR1cm4gZXJyOwogfQogCitMSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IgYWFjRGVjb2Rlcl9SYXdJU09CTUZGRGF0YShIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgbGVuZ3RoKSB7CisgIEZES19CSVRTVFJFQU0gYnM7CisgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcyA9ICZiczsKKyAgQUFDX0RFQ09ERVJfRVJST1IgZXJyID0gQUFDX0RFQ19PSzsKIAorICBpZiAobGVuZ3RoIDwgOCkgcmV0dXJuIEFBQ19ERUNfVU5LTk9XTjsKIAotc3RhdGljIElOVCBhYWNEZWNvZGVyX0NvbmZpZ0NhbGxiYWNrKHZvaWQgKmhhbmRsZSwgY29uc3QgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjU3RydWN0KQoteworICB3aGlsZSAobGVuZ3RoID49IDgpIHsKKyAgICBVSU5UIHNpemUgPQorICAgICAgICAoYnVmZmVyWzBdIDw8IDI0KSB8IChidWZmZXJbMV0gPDwgMTYpIHwgKGJ1ZmZlclsyXSA8PCA4KSB8IGJ1ZmZlclszXTsKKyAgICBEUkNfREVDX0VSUk9SIHVuaURyY0VyciA9IERSQ19ERUNfT0s7CisKKyAgICBpZiAobGVuZ3RoIDwgc2l6ZSkgcmV0dXJuIEFBQ19ERUNfVU5LTk9XTjsKKyAgICBpZiAoc2l6ZSA8PSA4KSByZXR1cm4gQUFDX0RFQ19VTktOT1dOOworCisgICAgRkRLaW5pdEJpdFN0cmVhbShoQnMsIGJ1ZmZlciArIDgsIDB4MTAwMDAwMDAsIChzaXplIC0gOCkgKiA4KTsKKworICAgIGlmICgoYnVmZmVyWzRdID09ICdsJykgJiYgKGJ1ZmZlcls1XSA9PSAndScpICYmIChidWZmZXJbNl0gPT0gJ2QnKSAmJgorICAgICAgICAoYnVmZmVyWzddID09ICd0JykpIHsKKyAgICAgIHVuaURyY0VyciA9IEZES19kcmNEZWNfUmVhZExvdWRuZXNzQm94KHNlbGYtPmhVbmlEcmNEZWNvZGVyLCBoQnMpOworICAgIH0gZWxzZSBpZiAoKGJ1ZmZlcls0XSA9PSAnZCcpICYmIChidWZmZXJbNV0gPT0gJ20nKSAmJiAoYnVmZmVyWzZdID09ICdpJykgJiYKKyAgICAgICAgICAgICAgIChidWZmZXJbN10gPT0gJ3gnKSkgeworICAgICAgdW5pRHJjRXJyID0KKyAgICAgICAgICBGREtfZHJjRGVjX1JlYWREb3dubWl4SW5zdHJ1Y3Rpb25zX0JveChzZWxmLT5oVW5pRHJjRGVjb2RlciwgaEJzKTsKKyAgICB9IGVsc2UgaWYgKChidWZmZXJbNF0gPT0gJ3UnKSAmJiAoYnVmZmVyWzVdID09ICdkJykgJiYgKGJ1ZmZlcls2XSA9PSAnaScpICYmCisgICAgICAgICAgICAgICAoYnVmZmVyWzddID09ICcyJykpIHsKKyAgICAgIHVuaURyY0VyciA9CisgICAgICAgICAgRkRLX2RyY0RlY19SZWFkVW5pRHJjSW5zdHJ1Y3Rpb25zX0JveChzZWxmLT5oVW5pRHJjRGVjb2RlciwgaEJzKTsKKyAgICB9IGVsc2UgaWYgKChidWZmZXJbNF0gPT0gJ3UnKSAmJiAoYnVmZmVyWzVdID09ICdkJykgJiYgKGJ1ZmZlcls2XSA9PSAnYycpICYmCisgICAgICAgICAgICAgICAoYnVmZmVyWzddID09ICcyJykpIHsKKyAgICAgIHVuaURyY0VyciA9CisgICAgICAgICAgRkRLX2RyY0RlY19SZWFkVW5pRHJjQ29lZmZpY2llbnRzX0JveChzZWxmLT5oVW5pRHJjRGVjb2RlciwgaEJzKTsKKyAgICB9CisKKyAgICBpZiAodW5pRHJjRXJyICE9IERSQ19ERUNfT0spIGVyciA9IEFBQ19ERUNfVU5LTk9XTjsKKworICAgIGJ1ZmZlciArPSBzaXplOworICAgIGxlbmd0aCAtPSBzaXplOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIElOVCBhYWNEZWNvZGVyX0NvbmZpZ0NhbGxiYWNrKHZvaWQgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2NTdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgY29uZmlnTW9kZSwgVUNIQVIgKmNvbmZpZ0NoYW5nZWQpIHsKICAgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiA9IChIQU5ETEVfQUFDREVDT0RFUiloYW5kbGU7CiAgIEFBQ19ERUNPREVSX0VSUk9SIGVyciA9IEFBQ19ERUNfT0s7CiAgIFRSQU5TUE9SVERFQ19FUlJPUiBlcnJUcDsKIAorICBGREtfQVNTRVJUKHNlbGYgIT0gTlVMTCk7CiAgIHsKLSAgICB7Ci0gICAgICBlcnIgPSBhYWNEZWNvZGVyX0NvbmZpZyhzZWxmLCBwQXNjU3RydWN0KTsKLSAgICB9CisgICAgeyBlcnIgPSBhYWNEZWNvZGVyX0NvbmZpZyhzZWxmLCBwQXNjU3RydWN0LCBjb25maWdNb2RlLCBjb25maWdDaGFuZ2VkKTsgfQogICB9CiAgIGlmIChlcnIgPT0gQUFDX0RFQ19PSykgewotICAgIGlmICggc2VsZi0+ZmxhZ3MgJiAoQUNfVVNBQ3xBQ19SU1ZENTB8QUNfTER8QUNfRUxEKQotICAgICAgJiYgQ0NvbmNlYWxtZW50X0dldERlbGF5KCZzZWxmLT5jb25jZWFsQ29tbW9uRGF0YSkgPiAwICkKLSAgICB7CisgICAgLyoKKyAgICByZXZlcnQgY29uY2VhbG1lbnQgbWV0aG9kIGlmIGVpdGhlcgorICAgICAgIC0gSW50ZXJwb2xhdGlvbiBjb25jZWFsbWVudCBtaWdodCBub3QgYmUgbWVhbmluZ2Z1bAorICAgICAgIC0gSW50ZXJwb2xhdGlvbiBjb25jZWFsbWVudCBpcyBub3QgaW1wbGVtZW50ZWQKKyAgICAqLworICAgIGlmICgoc2VsZi0+ZmxhZ3NbMF0gJiAoQUNfTEQgfCBBQ19FTEQpICYmCisgICAgICAgICAoc2VsZi0+Y29uY2VhbE1ldGhvZFVzZXIgPT0gQ29uY2VhbE1ldGhvZE5vbmUpICYmCisgICAgICAgICBDQ29uY2VhbG1lbnRfR2V0RGVsYXkoJnNlbGYtPmNvbmNlYWxDb21tb25EYXRhKSA+CisgICAgICAgICAgICAgMCkgLyogbWlnaHQgbm90IGJlIG1lYW5pbmdmdWwgYnV0IGFsbG93IGlmIHVzZXIgaGFzIHNldCBpdAorICAgICAgICAgICAgICAgICAgIGV4cGljaXRseSAqLworICAgICAgICB8fCAoc2VsZi0+ZmxhZ3NbMF0gJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBKSAmJgorICAgICAgICAgICAgQ0NvbmNlYWxtZW50X0dldERlbGF5KCZzZWxmLT5jb25jZWFsQ29tbW9uRGF0YSkgPgorICAgICAgICAgICAgICAgIDApIC8qIG5vdCBpbXBsZW1lbnRlZCAqLworICAgICkgewogICAgICAgLyogUmV2ZXJ0IHRvIGVycm9yIGNvbmNlYWxtZW50IG1ldGhvZCBOb2lzZSBTdWJzdGl0dXRpb24uCi0gICAgICAgICBCZWNhdXNlIGludGVycG9sYXRpb24gaXMgbm90IGltcGxlbWVudGVkIGZvciBVU0FDL1JTVkQ1MCBvcgorICAgICAgICAgQmVjYXVzZSBpbnRlcnBvbGF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgVVNBQyBvcgogICAgICAgICAgdGhlIGFkZGl0aW9uYWwgZGVsYXkgaXMgdW53YW50ZWQgZm9yIGxvdyBkZWxheSBjb2RlY3MuICovCiAgICAgICBzZXRDb25jZWFsTWV0aG9kKHNlbGYsIDEpOwotI2lmZGVmIERFQlVHCi0gICAgICBGREtwcmludGYoIiAgQ29uY2VhbG1lbnQgbWV0aG9kIHdhcyByZXZlcnRlZCB0byAxICFcbiIpOwotI2VuZGlmCiAgICAgfQorICAgIGFhY0RlY29kZXJfc2V0TWV0YWRhdGFFeHBpcnkoc2VsZiwgc2VsZi0+bWV0YWRhdGFFeHBpcnkpOwogICAgIGVyclRwID0gVFJBTlNQT1JUREVDX09LOwogICB9IGVsc2UgewotICAgIGlmIChJU19JTklUX0VSUk9SKGVycikpIHsKKyAgICBpZiAoZXJyID09IEFBQ19ERUNfTkVFRF9UT19SRVNUQVJUKSB7CisgICAgICBlcnJUcCA9IFRSQU5TUE9SVERFQ19ORUVEX1RPX1JFU1RBUlQ7CisgICAgfSBlbHNlIGlmIChJU19JTklUX0VSUk9SKGVycikpIHsKICAgICAgIGVyclRwID0gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKICAgICB9IC8qIEZhdGFsIGVycm9ycyAqLwotICAgIGVsc2UgaWYgKGVyciA9PSBBQUNfREVDX05FRURfVE9fUkVTVEFSVCkgewotICAgICAgZXJyVHAgPSBUUkFOU1BPUlRERUNfTkVFRF9UT19SRVNUQVJUOwotICAgIH0gZWxzZSB7CisgICAgZWxzZSB7CiAgICAgICBlcnJUcCA9IFRSQU5TUE9SVERFQ19VTktPV05fRVJST1I7CiAgICAgfQogICB9CkBAIC0yMzMsMzcgKzMxNywyMjkgQEAKICAgcmV0dXJuIGVyclRwOwogfQogCitzdGF0aWMgSU5UIGFhY0RlY29kZXJfRnJlZU1lbUNhbGxiYWNrKHZvaWQgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjU3RydWN0KSB7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBlcnJUcCA9IFRSQU5TUE9SVERFQ19PSzsKKyAgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiA9IChIQU5ETEVfQUFDREVDT0RFUiloYW5kbGU7CiAKKyAgY29uc3QgaW50IHN1YlN0cmVhbUluZGV4ID0gMDsKIAotTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SCi1hYWNEZWNvZGVyX0FuY0RhdGFJbml0ICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplICkKLXsKKyAgRkRLX0FTU0VSVChzZWxmICE9IE5VTEwpOworCisgIGlmIChDQWFjRGVjb2Rlcl9GcmVlTWVtKHNlbGYsIHN1YlN0cmVhbUluZGV4KSAhPSBBQUNfREVDX09LKSB7CisgICAgZXJyVHAgPSBUUkFOU1BPUlRERUNfVU5LT1dOX0VSUk9SOworICB9CisKKyAgLyogZnJlZSBSYW1fU2JyRGVjb2RlciBhbmQgUmFtX1NickRlY0NoYW5uZWwgKi8KKyAgaWYgKHNlbGYtPmhTYnJEZWNvZGVyICE9IE5VTEwpIHsKKyAgICBpZiAoc2JyRGVjb2Rlcl9GcmVlTWVtKCZzZWxmLT5oU2JyRGVjb2RlcikgIT0gU0JSREVDX09LKSB7CisgICAgICBlcnJUcCA9IFRSQU5TUE9SVERFQ19VTktPV05fRVJST1I7CisgICAgfQorICB9CisKKyAgLyogZnJlZSBwU3BhdGlhbERlYyBhbmQgbXBzRGF0YSAqLworICBpZiAoc2VsZi0+cE1wZWdTdXJyb3VuZERlY29kZXIgIT0gTlVMTCkgeworICAgIGlmIChtcGVnU3Vycm91bmREZWNvZGVyX0ZyZWVNZW0oCisgICAgICAgICAgICAoQ01wZWdTdXJyb3VuZERlY29kZXIgKilzZWxmLT5wTXBlZ1N1cnJvdW5kRGVjb2RlcikgIT0gTVBTX09LKSB7CisgICAgICBlcnJUcCA9IFRSQU5TUE9SVERFQ19VTktPV05fRVJST1I7CisgICAgfQorICB9CisKKyAgLyogZnJlZSBwZXJzaXN0ZW50IHFtZiBkb21haW4gYnVmZmVyLCBRbWZXb3JrQnVmZmVyQ29yZTMsIFFtZldvcmtCdWZmZXJDb3JlNCwKKyAgICogUW1mV29ya0J1ZmZlckNvcmU1IGFuZCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyAqLworICBGREtfUW1mRG9tYWluX0ZyZWVNZW0oJnNlbGYtPnFtZkRvbWFpbik7CisKKyAgcmV0dXJuIGVyclRwOworfQorCitzdGF0aWMgSU5UIGFhY0RlY29kZXJfQ3RybENGR0NoYW5nZUNhbGxiYWNrKAorICAgIHZvaWQgKmhhbmRsZSwgY29uc3QgQ0N0cmxDRkdDaGFuZ2UgKnBDdHJsQ0ZHQ2hhbmdlU3RydWN0KSB7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBlcnJUcCA9IFRSQU5TUE9SVERFQ19PSzsKKyAgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiA9IChIQU5ETEVfQUFDREVDT0RFUiloYW5kbGU7CisKKyAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgIENBYWNEZWNvZGVyX0N0cmxDRkdDaGFuZ2UoCisgICAgICAgIHNlbGYsIHBDdHJsQ0ZHQ2hhbmdlU3RydWN0LT5mbHVzaFN0YXR1cywgcEN0cmxDRkdDaGFuZ2VTdHJ1Y3QtPmZsdXNoQ250LAorICAgICAgICBwQ3RybENGR0NoYW5nZVN0cnVjdC0+YnVpbGRVcFN0YXR1cywgcEN0cmxDRkdDaGFuZ2VTdHJ1Y3QtPmJ1aWxkVXBDbnQpOworICB9IGVsc2UgeworICAgIGVyclRwID0gVFJBTlNQT1JUREVDX1VOS09XTl9FUlJPUjsKKyAgfQorCisgIHJldHVybiBlcnJUcDsKK30KKworc3RhdGljIElOVCBhYWNEZWNvZGVyX1NzY0NhbGxiYWNrKHZvaWQgKmhhbmRsZSwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzdGVyZW9Db25maWdJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgY29yZVNickZyYW1lTGVuZ3RoSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGNvbmZpZ0J5dGVzLCBjb25zdCBVQ0hBUiBjb25maWdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpjb25maWdDaGFuZ2VkKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnI7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBlcnJUcDsKKyAgSEFORExFX0FBQ0RFQ09ERVIgaEFhY0RlY29kZXIgPSAoSEFORExFX0FBQ0RFQ09ERVIpaGFuZGxlOworCisgIGVyciA9IG1wZWdTdXJyb3VuZERlY29kZXJfQ29uZmlnKAorICAgICAgKENNcGVnU3Vycm91bmREZWNvZGVyICopaEFhY0RlY29kZXItPnBNcGVnU3Vycm91bmREZWNvZGVyLCBoQnMsIGNvcmVDb2RlYywKKyAgICAgIHNhbXBsaW5nUmF0ZSwgc3RlcmVvQ29uZmlnSW5kZXgsIGNvcmVTYnJGcmFtZUxlbmd0aEluZGV4LCBjb25maWdCeXRlcywKKyAgICAgIGNvbmZpZ01vZGUsIGNvbmZpZ0NoYW5nZWQpOworCisgIHN3aXRjaCAoZXJyKSB7CisgICAgY2FzZSBNUFNfVU5TVVBQT1JURURfQ09ORklHOgorICAgICAgLyogTVBTIGZvdW5kIGJ1dCBpbnZhbGlkIG9yIG5vdCBkZWNvZGFibGUgYnkgdGhpcyBpbnN0YW5jZSAgICAgICAgICAgICovCisgICAgICAvKiBXZSBzd2l0Y2ggb2ZmIE1QUyBhbmQga2VlcCBnb2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGhBYWNEZWNvZGVyLT5tcHNFbmFibGVDdXJyID0gMDsKKyAgICAgIGhBYWNEZWNvZGVyLT5tcHNBcHBsaWNhYmxlID0gMDsKKyAgICAgIGVyclRwID0gVFJBTlNQT1JUREVDX09LOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNUFNfUEFSU0VfRVJST1I6CisgICAgICAvKiBNUFMgZm91bmQgYnV0IGludmFsaWQgb3Igbm90IGRlY29kYWJsZSBieSB0aGlzIGluc3RhbmNlICAgICAgICAgICAgKi8KKyAgICAgIGhBYWNEZWNvZGVyLT5tcHNFbmFibGVDdXJyID0gMDsKKyAgICAgIGhBYWNEZWNvZGVyLT5tcHNBcHBsaWNhYmxlID0gMDsKKyAgICAgIGlmICgoY29yZUNvZGVjID09IEFPVF9VU0FDKSB8fCAoY29yZUNvZGVjID09IEFPVF9EUk1fVVNBQykgfHwKKyAgICAgICAgICBJU19MT1dERUxBWShjb3JlQ29kZWMpKSB7CisgICAgICAgIGVyclRwID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyVHAgPSBUUkFOU1BPUlRERUNfT0s7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIE1QU19PSzoKKyAgICAgIGhBYWNEZWNvZGVyLT5tcHNBcHBsaWNhYmxlID0gMTsKKyAgICAgIGVyclRwID0gVFJBTlNQT1JUREVDX09LOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIGVzcGVjaWFsbHkgUGFyc2luZyBlcnJvciBpcyBjcml0aWNhbCBmb3IgdHJhbnNwb3J0IGxheWVyICAgICAgICAgICovCisgICAgICBoQWFjRGVjb2Rlci0+bXBzQXBwbGljYWJsZSA9IDA7CisgICAgICBlcnJUcCA9IFRSQU5TUE9SVERFQ19VTktPV05fRVJST1I7CisgIH0KKworICByZXR1cm4gKElOVCllcnJUcDsKK30KKworc3RhdGljIElOVCBhYWNEZWNvZGVyX1VuaURyY0NhbGxiYWNrKHZvaWQgKmhhbmRsZSwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBmdWxsUGF5bG9hZExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgcGF5bG9hZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHN1YlN0cmVhbUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBwYXlsb2FkU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgYW90KSB7CisgIERSQ19ERUNfRVJST1IgZXJyID0gRFJDX0RFQ19PSzsKKyAgVFJBTlNQT1JUREVDX0VSUk9SIGVyclRwOworICBIQU5ETEVfQUFDREVDT0RFUiBoQWFjRGVjb2RlciA9IChIQU5ETEVfQUFDREVDT0RFUiloYW5kbGU7CisgIERSQ19ERUNfQ09ERUNfTU9ERSBkcmNEZWNDb2RlY01vZGUgPSBEUkNfREVDX0NPREVDX01PREVfVU5ERUZJTkVEOworCisgIGlmIChzdWJTdHJlYW1JbmRleCAhPSAwKSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19PSzsKKyAgfQorCisgIGVsc2UgaWYgKGFvdCA9PSBBT1RfVVNBQykgeworICAgIGRyY0RlY0NvZGVjTW9kZSA9IERSQ19ERUNfTVBFR19EX1VTQUM7CisgIH0KKworICBlcnIgPSBGREtfZHJjRGVjX1NldENvZGVjTW9kZShoQWFjRGVjb2Rlci0+aFVuaURyY0RlY29kZXIsIGRyY0RlY0NvZGVjTW9kZSk7CisgIGlmIChlcnIpIHJldHVybiAoSU5UKVRSQU5TUE9SVERFQ19VTktPV05fRVJST1I7CisKKyAgaWYgKHBheWxvYWRUeXBlID09IDApIC8qIHVuaURyY0NvbmZpZyAqLworICB7CisgICAgZXJyID0gRkRLX2RyY0RlY19SZWFkVW5pRHJjQ29uZmlnKGhBYWNEZWNvZGVyLT5oVW5pRHJjRGVjb2RlciwgaEJzKTsKKyAgfSBlbHNlIC8qIGxvdWRuZXNzSW5mb1NldCAqLworICB7CisgICAgZXJyID0gRkRLX2RyY0RlY19SZWFkTG91ZG5lc3NJbmZvU2V0KGhBYWNEZWNvZGVyLT5oVW5pRHJjRGVjb2RlciwgaEJzKTsKKyAgICBoQWFjRGVjb2Rlci0+bG91ZG5lc3NJbmZvU2V0UG9zaXRpb25bMV0gPSBwYXlsb2FkU3RhcnQ7CisgICAgaEFhY0RlY29kZXItPmxvdWRuZXNzSW5mb1NldFBvc2l0aW9uWzJdID0gZnVsbFBheWxvYWRMZW5ndGg7CisgIH0KKworICBpZiAoZXJyID09IERSQ19ERUNfT0spCisgICAgZXJyVHAgPSBUUkFOU1BPUlRERUNfT0s7CisgIGVsc2UKKyAgICBlcnJUcCA9IFRSQU5TUE9SVERFQ19VTktPV05fRVJST1I7CisKKyAgcmV0dXJuIChJTlQpZXJyVHA7Cit9CisKK0xJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX0FuY0RhdGFJbml0KEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqYnVmZmVyLCBpbnQgc2l6ZSkgewogICBDQW5jRGF0YSAqYW5jRGF0YSA9ICZzZWxmLT5hbmNEYXRhOwogCiAgIHJldHVybiBDQWFjRGVjb2Rlcl9BbmNEYXRhSW5pdChhbmNEYXRhLCBidWZmZXIsIHNpemUpOwogfQogCi0KLUxJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUgotYWFjRGVjb2Rlcl9BbmNEYXRhR2V0ICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqKnB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAqc2l6ZSApCi17CitMSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IgYWFjRGVjb2Rlcl9BbmNEYXRhR2V0KEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgVUNIQVIgKipwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2l6ZSkgewogICBDQW5jRGF0YSAqYW5jRGF0YSA9ICZzZWxmLT5hbmNEYXRhOwogCiAgIHJldHVybiBDQWFjRGVjb2Rlcl9BbmNEYXRhR2V0KGFuY0RhdGEsIGluZGV4LCBwdHIsIHNpemUpOwogfQogCisvKiBJZiBNUFMgaXMgcHJlc2VudCBpbiBzdHJlYW0sIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgaW5zdGFuY2UsIHdlJ2xsCisgICBoYXZlIHRvIHN3aXRjaCBvZmYgTVBTIGFuZCB1c2UgUU1GIHN5bnRoZXNpcyBpbiB0aGUgU0JSIG1vZHVsZSBpZiByZXF1aXJlZCAqLworc3RhdGljIGludCBpc1N1cHBvcnRlZE1wc0NvbmZpZyhBVURJT19PQkpFQ1RfVFlQRSBhb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1JbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZk1wc1ByZXNlbnQpIHsKKyAgTElCX0lORk8gbGliSW5mb1tGREtfTU9EVUxFX0xBU1RdOworICBVSU5UIG1wc0NhcHM7CisgIGludCBpc1N1cHBvcnRlZENmZyA9IDE7CiAKLXN0YXRpYyBBQUNfREVDT0RFUl9FUlJPUgotc2V0Q29uY2VhbE1ldGhvZCAoIGNvbnN0IEhBTkRMRV9BQUNERUNPREVSICBzZWxmLCAgIC8qITwgSGFuZGxlIG9mIHRoZSBkZWNvZGVyIGluc3RhbmNlICovCi0gICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgIG1ldGhvZCApCi17CisgIEZES2luaXRMaWJJbmZvKGxpYkluZm8pOworCisgIG1wZWdTdXJyb3VuZERlY29kZXJfR2V0TGliSW5mbyhsaWJJbmZvKTsKKworICBtcHNDYXBzID0gRkRLbGliSW5mb19nZXRDYXBhYmlsaXRpZXMobGliSW5mbywgRkRLX01QU0RFQyk7CisKKyAgaWYgKCEobXBzQ2FwcyAmIENBUEZfTVBTX0xEKSAmJiBJU19MT1dERUxBWShhb3QpKSB7CisgICAgLyogV2UgZ290IGFuIExEIEFPVCBidXQgTVBTIGRlY29kZXIgZG9lcyBub3Qgc3VwcG9ydCBMRC4gKi8KKyAgICBpc1N1cHBvcnRlZENmZyA9IDA7CisgIH0KKyAgaWYgKChtcHNDYXBzICYgQ0FQRl9NUFNfTEQpICYmIElTX0xPV0RFTEFZKGFvdCkgJiYgIWZNcHNQcmVzZW50KSB7CisgICAgLyogV2UgZ290IGFuIExEIEFPVCBhbmQgdGhlIE1QUyBkZWNvZGVyIHN1cHBvcnRzIGl0LgorICAgICAqIEJ1dCBMRC1NUFMgaXMgbm90IGV4cGxpY2l0bHkgc2lnbmFsZWQuICovCisgICAgaXNTdXBwb3J0ZWRDZmcgPSAwOworICB9CisgIGlmICghKG1wc0NhcHMgJiBDQVBGX01QU19VU0FDKSAmJiBJU19VU0FDKGFvdCkpIHsKKyAgICAvKiBXZSBnb3QgYW4gVVNBQyBBT1QgYnV0IE1QUyBkZWNvZGVyIGRvZXMgbm90IHN1cHBvcnQgVVNBQy4gKi8KKyAgICBpc1N1cHBvcnRlZENmZyA9IDA7CisgIH0KKyAgaWYgKCEobXBzQ2FwcyAmIENBUEZfTVBTX1NURCkgJiYgIUlTX0xPV0RFTEFZKGFvdCkgJiYgIUlTX1VTQUMoYW90KSkgeworICAgIC8qIFdlIGdvdCBhbiBHQSBBT1QgYnV0IE1QUyBkZWNvZGVyIGRvZXMgbm90IHN1cHBvcnQgaXQuICovCisgICAgaXNTdXBwb3J0ZWRDZmcgPSAwOworICB9CisgIC8qIENoZWNrIHdoZXRoZXIgdGhlIE1QUyBtb2R1bCBzdXBwb3J0cyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzOiAqLworICBzd2l0Y2ggKG51bUluQ2hhbm5lbHMpIHsKKyAgICBjYXNlIDE6CisgICAgICBpZiAoIShtcHNDYXBzICYgQ0FQRl9NUFNfMUNIX0lOKSkgeworICAgICAgICAvKiBXZSBnb3QgYSBvbmUgY2hhbm5lbCBpbnB1dCB0byBNUFMgZGVjb2RlciBidXQgaXQgZG9lcyBub3Qgc3VwcG9ydCBpdC4KKyAgICAgICAgICovCisgICAgICAgIGlzU3VwcG9ydGVkQ2ZnID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGlmICghKG1wc0NhcHMgJiBDQVBGX01QU18yQ0hfSU4pKSB7CisgICAgICAgIC8qIFdlIGdvdCBhIHR3byBjaGFubmVsIGlucHV0IHRvIE1QUyBkZWNvZGVyIGJ1dCBpdCBkb2VzIG5vdCBzdXBwb3J0IGl0LgorICAgICAgICAgKi8KKyAgICAgICAgaXNTdXBwb3J0ZWRDZmcgPSAwOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgIGNhc2UgNjoKKyAgICAgIGlmICghKG1wc0NhcHMgJiBDQVBGX01QU182Q0hfSU4pKSB7CisgICAgICAgIC8qIFdlIGdvdCBhIHNpeCBjaGFubmVsIGlucHV0IHRvIE1QUyBkZWNvZGVyIGJ1dCBpdCBkb2VzIG5vdCBzdXBwb3J0IGl0LgorICAgICAgICAgKi8KKyAgICAgICAgaXNTdXBwb3J0ZWRDZmcgPSAwOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlzU3VwcG9ydGVkQ2ZnID0gMDsKKyAgfQorCisgIHJldHVybiAoaXNTdXBwb3J0ZWRDZmcpOworfQorCitzdGF0aWMgQUFDX0RFQ09ERVJfRVJST1Igc2V0Q29uY2VhbE1ldGhvZCgKKyAgICBjb25zdCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLCAvKiE8IEhhbmRsZSBvZiB0aGUgZGVjb2RlciBpbnN0YW5jZSAqLworICAgIGNvbnN0IElOVCBtZXRob2QpIHsKICAgQUFDX0RFQ09ERVJfRVJST1IgZXJyb3JTdGF0dXMgPSBBQUNfREVDX09LOwotICBDQ29uY2VhbFBhcmFtcyAgKnBDb25jZWFsRGF0YSA9IE5VTEw7CisgIENDb25jZWFsUGFyYW1zICpwQ29uY2VhbERhdGEgPSBOVUxMOworICBpbnQgbWV0aG9kX3JldmVydCA9IDA7CiAgIEhBTkRMRV9TQlJERUNPREVSIGhTYnJEZWMgPSBOVUxMOwogICBIQU5ETEVfQUFDX0RSQyBoRHJjSW5mbyA9IE5VTEw7CiAgIEhBTkRMRV9QQ01fRE9XTk1JWCBoUGNtRG14ID0gTlVMTDsKQEAgLTI3NywyNSArNTUzLDMzIEBACiAgICAgaFNickRlYyA9IHNlbGYtPmhTYnJEZWNvZGVyOwogICAgIGhEcmNJbmZvID0gc2VsZi0+aERyY0luZm87CiAgICAgaFBjbURteCA9IHNlbGYtPmhQY21VdGlsczsKKyAgICBpZiAoc2VsZi0+ZmxhZ3NbMF0gJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBKSAmJiBtZXRob2QgPj0gMikgeworICAgICAgLyogSW50ZXJwb2xhdGlvbiBjb25jZWFsbWVudCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIFVTQUMvUlNWRDUwICovCisgICAgICAvKiBlcnJvclN0YXR1cyA9IEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgICAgICBnb3RvIGJhaWw7ICovCisgICAgICBtZXRob2RfcmV2ZXJ0ID0gMTsKKyAgICB9CisgICAgaWYgKHNlbGYtPmZsYWdzWzBdICYgKEFDX1VTQUMgfCBBQ19SU1ZENTAgfCBBQ19SU1Y2MDNEQSkgJiYgbWV0aG9kID49IDIpIHsKKyAgICAgIC8qIEludGVycG9sYXRpb24gY29uY2VhbG1lbnQgaXMgbm90IGltcGxlbWVudGVkIGZvciBVU0FDL1JTVkQ1MCAqLworICAgICAgZXJyb3JTdGF0dXMgPSBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgZ290byBiYWlsOworICAgIH0KICAgfQogCi0KICAgLyogR2V0IGN1cnJlbnQgbWV0aG9kL2RlbGF5ICovCiAgIGJhY2t1cE1ldGhvZCA9IENDb25jZWFsbWVudF9HZXRNZXRob2QocENvbmNlYWxEYXRhKTsKLSAgYmFja3VwRGVsYXkgID0gQ0NvbmNlYWxtZW50X0dldERlbGF5KHBDb25jZWFsRGF0YSk7CisgIGJhY2t1cERlbGF5ID0gQ0NvbmNlYWxtZW50X0dldERlbGF5KHBDb25jZWFsRGF0YSk7CiAKICAgLyogQmUgc3VyZSB0byBzZXQgQUFDIGFuZCBTQlIgY29uY2VhbG1lbnQgbWV0aG9kIHNpbXVsdGFuZW91c2x5ISAqLwotICBlcnJvclN0YXR1cyA9Ci0gICAgQ0NvbmNlYWxtZW50X1NldFBhcmFtcygKKyAgZXJyb3JTdGF0dXMgPSBDQ29uY2VhbG1lbnRfU2V0UGFyYW1zKAogICAgICAgcENvbmNlYWxEYXRhLAotICAgICAgKGludCltZXRob2QsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNlYWxNZXRob2QKLSAgICAgIEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQsICAvLyBjb25jZWFsRmFkZU91dFNsb3BlCi0gICAgICBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVELCAgLy8gY29uY2VhbEZhZGVJblNsb3BlCi0gICAgICBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVELCAgLy8gY29uY2VhbE11dGVSZWxlYXNlCi0gICAgICBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVEICAgLy8gY29uY2VhbENvbWZOb2lzZUxldmVsCi0gICAgKTsKLSAgaWYgKCAoZXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19PSykKLSAgICAmJiAoZXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19JTlZBTElEX0hBTkRMRSkgKSB7CisgICAgICAobWV0aG9kX3JldmVydCA9PSAwKSA/IChpbnQpbWV0aG9kIDogKGludCkxLCAgLy8gY29uY2VhbE1ldGhvZAorICAgICAgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCwgICAgICAgICAgIC8vIGNvbmNlYWxGYWRlT3V0U2xvcGUKKyAgICAgIEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQsICAgICAgICAgICAvLyBjb25jZWFsRmFkZUluU2xvcGUKKyAgICAgIEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQsICAgICAgICAgICAvLyBjb25jZWFsTXV0ZVJlbGVhc2UKKyAgICAgIEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQgICAgICAgICAgICAvLyBjb25jZWFsQ29tZk5vaXNlTGV2ZWwKKyAgKTsKKyAgaWYgKChlcnJvclN0YXR1cyAhPSBBQUNfREVDX09LKSAmJiAoZXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19JTlZBTElEX0hBTkRMRSkpIHsKICAgICBnb3RvIGJhaWw7CiAgIH0KIApAQCAtMzA2LDM1MCArNTkwLDM0MiBAQAogICAgIFNCUl9FUlJPUiBzYnJFcnIgPSBTQlJERUNfT0s7CiAKICAgICAvKiBzZXQgU0JSIGJpdHN0cmVhbSBkZWxheSAqLwotICAgIHNickVyciA9IHNickRlY29kZXJfU2V0UGFyYW0gKAotICAgICAgaFNickRlYywKLSAgICAgIFNCUl9TWVNURU1fQklUU1RSRUFNX0RFTEFZLAotICAgICAgYnNEZWxheQotICAgICk7CisgICAgc2JyRXJyID0gc2JyRGVjb2Rlcl9TZXRQYXJhbShoU2JyRGVjLCBTQlJfU1lTVEVNX0JJVFNUUkVBTV9ERUxBWSwgYnNEZWxheSk7CiAKICAgICBzd2l0Y2ggKHNickVycikgewotICAgIGNhc2UgU0JSREVDX09LOgotICAgIGNhc2UgU0JSREVDX05PVF9JTklUSUFMSVpFRDoKLSAgICAgIGlmIChzZWxmICE9IE5VTEwpIHsKLSAgICAgICAgLyogc2F2ZSB0aGUgcGFyYW0gdmFsdWUgYW5kIHNldCBsYXRlcgotICAgICAgICAgICAod2hlbiBTQlIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQpICovCi0gICAgICAgIHNlbGYtPnNiclBhcmFtcy5ic0RlbGF5ID0gYnNEZWxheTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvclN0YXR1cyA9IEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7Ci0gICAgICBnb3RvIGJhaWw7CisgICAgICBjYXNlIFNCUkRFQ19PSzoKKyAgICAgIGNhc2UgU0JSREVDX05PVF9JTklUSUFMSVpFRDoKKyAgICAgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICAgIC8qIHNhdmUgdGhlIHBhcmFtIHZhbHVlIGFuZCBzZXQgbGF0ZXIKKyAgICAgICAgICAgICAod2hlbiBTQlIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQpICovCisgICAgICAgICAgc2VsZi0+c2JyUGFyYW1zLmJzRGVsYXkgPSBic0RlbGF5OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyb3JTdGF0dXMgPSBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgICBnb3RvIGJhaWw7CiAgICAgfQogICB9CiAKLSAgZXJyb3JTdGF0dXMgPQotICAgIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0gKAotICAgICAgaERyY0luZm8sCi0gICAgICBEUkNfQlNfREVMQVksCi0gICAgICBic0RlbGF5Ci0gICAgKTsKLSAgaWYgKCAoZXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19PSykKLSAgICAmJiAoZXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19JTlZBTElEX0hBTkRMRSkgKSB7CisgIGVycm9yU3RhdHVzID0gYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbShoRHJjSW5mbywgRFJDX0JTX0RFTEFZLCBic0RlbGF5KTsKKyAgaWYgKChlcnJvclN0YXR1cyAhPSBBQUNfREVDX09LKSAmJiAoZXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19JTlZBTElEX0hBTkRMRSkpIHsKICAgICBnb3RvIGJhaWw7CiAgIH0KIAogICBpZiAoZXJyb3JTdGF0dXMgPT0gQUFDX0RFQ19PSykgewotICAgIFBDTURNWF9FUlJPUiBlcnIgPQotICAgICAgcGNtRG14X1NldFBhcmFtICgKLSAgICAgICAgaFBjbURteCwKLSAgICAgICAgRE1YX0JTX0RBVEFfREVMQVksCi0gICAgICAgIGJzRGVsYXkKLSAgICAgICk7CisgICAgUENNRE1YX0VSUk9SIGVyciA9IHBjbURteF9TZXRQYXJhbShoUGNtRG14LCBETVhfQlNfREFUQV9ERUxBWSwgYnNEZWxheSk7CiAgICAgc3dpdGNoIChlcnIpIHsKLSAgICBjYXNlIFBDTURNWF9JTlZBTElEX0hBTkRMRToKLSAgICAgIGVycm9yU3RhdHVzID0gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKLSAgICBjYXNlIFBDTURNWF9PSzoKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvclN0YXR1cyA9IEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7Ci0gICAgICBnb3RvIGJhaWw7CisgICAgICBjYXNlIFBDTURNWF9JTlZBTElEX0hBTkRMRToKKyAgICAgICAgZXJyb3JTdGF0dXMgPSBBQUNfREVDX0lOVkFMSURfSEFORExFOworICAgICAgY2FzZSBQQ01ETVhfT0s6CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyb3JTdGF0dXMgPSBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgICBnb3RvIGJhaWw7CiAgICAgfQogICB9CiAKLQogYmFpbDoKLSAgaWYgKCAoZXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19PSykKLSAgICAmJiAoZXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19JTlZBTElEX0hBTkRMRSkgKQotICB7CisgIGlmICgoZXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19PSykgJiYgKGVycm9yU3RhdHVzICE9IEFBQ19ERUNfSU5WQUxJRF9IQU5ETEUpKSB7CiAgICAgLyogUmV2ZXJ0IHRvIHRoZSBpbml0aWFsIHN0YXRlICovCi0gICAgQ0NvbmNlYWxtZW50X1NldFBhcmFtcyAoCi0gICAgICAgIHBDb25jZWFsRGF0YSwKLSAgICAgICAgKGludCliYWNrdXBNZXRob2QsCi0gICAgICAgIEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQsCi0gICAgICAgIEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQsCi0gICAgICAgIEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQsCi0gICAgICAgIEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQKLSAgICAgICk7CisgICAgQ0NvbmNlYWxtZW50X1NldFBhcmFtcygKKyAgICAgICAgcENvbmNlYWxEYXRhLCAoaW50KWJhY2t1cE1ldGhvZCwgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCwKKyAgICAgICAgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCwgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCwKKyAgICAgICAgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCk7CiAgICAgLyogUmV2ZXJ0IFNCUiBiaXRzdHJlYW0gZGVsYXkgKi8KLSAgICBzYnJEZWNvZGVyX1NldFBhcmFtICgKLSAgICAgICAgaFNickRlYywKLSAgICAgICAgU0JSX1NZU1RFTV9CSVRTVFJFQU1fREVMQVksCi0gICAgICAgIGJhY2t1cERlbGF5Ci0gICAgICApOworICAgIHNickRlY29kZXJfU2V0UGFyYW0oaFNickRlYywgU0JSX1NZU1RFTV9CSVRTVFJFQU1fREVMQVksIGJhY2t1cERlbGF5KTsKICAgICAvKiBSZXZlcnQgRFJDIGJpdHN0cmVhbSBkZWxheSAqLwotICAgIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0gKAotICAgICAgICBoRHJjSW5mbywKLSAgICAgICAgRFJDX0JTX0RFTEFZLAotICAgICAgICBiYWNrdXBEZWxheQotICAgICAgKTsKKyAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtKGhEcmNJbmZvLCBEUkNfQlNfREVMQVksIGJhY2t1cERlbGF5KTsKICAgICAvKiBSZXZlcnQgUENNIG1peGRvd24gYml0c3RyZWFtIGRlbGF5ICovCi0gICAgcGNtRG14X1NldFBhcmFtICgKLSAgICAgICAgaFBjbURteCwKLSAgICAgICAgRE1YX0JTX0RBVEFfREVMQVksCi0gICAgICAgIGJhY2t1cERlbGF5Ci0gICAgICApOworICAgIHBjbURteF9TZXRQYXJhbShoUGNtRG14LCBETVhfQlNfREFUQV9ERUxBWSwgYmFja3VwRGVsYXkpOwogICB9CiAKICAgcmV0dXJuIGVycm9yU3RhdHVzOwogfQogCi0KLUxJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUgotYWFjRGVjb2Rlcl9TZXRQYXJhbSAoIGNvbnN0IEhBTkRMRV9BQUNERUNPREVSICBzZWxmLCAgIC8qITwgSGFuZGxlIG9mIHRoZSBkZWNvZGVyIGluc3RhbmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFDREVDX1BBUkFNICAgICAgIHBhcmFtLCAgLyohPCBQYXJhbWV0ZXIgdG8gc2V0ICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgdmFsdWUpICAvKiE8IFBhcmFtZXRlciB2YWx1ZWQgICAgICAgICAgICAgICAqLworTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfU2V0UGFyYW0oCisgICAgY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwgLyohPCBIYW5kbGUgb2YgdGhlIGRlY29kZXIgaW5zdGFuY2UgKi8KKyAgICBjb25zdCBBQUNERUNfUEFSQU0gcGFyYW0sICAgICAvKiE8IFBhcmFtZXRlciB0byBzZXQgICAgICAgICAgICAgICAqLworICAgIGNvbnN0IElOVCB2YWx1ZSkgICAgICAgICAgICAgIC8qITwgUGFyYW1ldGVyIHZhbHVlZCAgICAgICAgICAgICAgICovCiB7CiAgIEFBQ19ERUNPREVSX0VSUk9SIGVycm9yU3RhdHVzID0gQUFDX0RFQ19PSzsKLSAgQ0NvbmNlYWxQYXJhbXMgICpwQ29uY2VhbERhdGEgPSBOVUxMOworICBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcERlYyA9IE5VTEw7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBlcnJUcCA9IFRSQU5TUE9SVERFQ19PSzsKICAgSEFORExFX0FBQ19EUkMgaERyY0luZm8gPSBOVUxMOwogICBIQU5ETEVfUENNX0RPV05NSVggaFBjbURteCA9IE5VTEw7CisgIFBDTURNWF9FUlJPUiBkbXhFcnIgPSBQQ01ETVhfT0s7CiAgIFRETGltaXRlclB0ciBoUGNtVGRsID0gTlVMTDsKKyAgRFJDX0RFQ19FUlJPUiB1bmlEcmNFcnIgPSBEUkNfREVDX09LOwogCiAgIC8qIGNoZWNrIGRlY29kZXIgaGFuZGxlICovCiAgIGlmIChzZWxmICE9IE5VTEwpIHsKLSAgICBwQ29uY2VhbERhdGEgPSAmc2VsZi0+Y29uY2VhbENvbW1vbkRhdGE7CisgICAgaFRwRGVjID0gc2VsZi0+aElucHV0OwogICAgIGhEcmNJbmZvID0gc2VsZi0+aERyY0luZm87CiAgICAgaFBjbURteCA9IHNlbGYtPmhQY21VdGlsczsKICAgICBoUGNtVGRsID0gc2VsZi0+aExpbWl0ZXI7CiAgIH0gZWxzZSB7CiAgICAgZXJyb3JTdGF0dXMgPSBBQUNfREVDX0lOVkFMSURfSEFORExFOworICAgIGdvdG8gYmFpbDsKICAgfQogCiAgIC8qIGNvbmZpZ3VyZSB0aGUgc3Vic3lzdGVtcyAqLwotICBzd2l0Y2ggKHBhcmFtKQotICB7Ci0gIGNhc2UgQUFDX1BDTV9PVVRQVVRfSU5URVJMRUFWRUQ6Ci0gICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEpIHsKLSAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwotICAgIH0KLSAgICBpZiAoc2VsZiA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKLSAgICB9Ci0gICAgc2VsZi0+b3V0cHV0SW50ZXJsZWF2ZWQgPSB2YWx1ZTsKLSAgICBicmVhazsKLQotICBjYXNlIEFBQ19QQ01fTUlOX09VVFBVVF9DSEFOTkVMUzoKLSAgICBpZiAodmFsdWUgPCAtMSB8fCB2YWx1ZSA+ICg4KSkgewotICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7Ci0gICAgfQotICAgIHsKLSAgICAgIFBDTURNWF9FUlJPUiBlcnI7Ci0KLSAgICAgIGVyciA9IHBjbURteF9TZXRQYXJhbSAoCi0gICAgICAgICAgICAgIGhQY21EbXgsCi0gICAgICAgICAgICAgIE1JTl9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTLAotICAgICAgICAgICAgICB2YWx1ZSApOwotCi0gICAgICBzd2l0Y2ggKGVycikgewotICAgICAgY2FzZSBQQ01ETVhfT0s6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBQQ01ETVhfSU5WQUxJRF9IQU5ETEU6Ci0gICAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwotICAgICAgZGVmYXVsdDoKKyAgc3dpdGNoIChwYXJhbSkgeworICAgIGNhc2UgQUFDX1BDTV9NSU5fT1VUUFVUX0NIQU5ORUxTOgorICAgICAgaWYgKHZhbHVlIDwgLTEgfHwgdmFsdWUgPiAoOCkpIHsKICAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CiAgICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgQUFDX1BDTV9NQVhfT1VUUFVUX0NIQU5ORUxTOgotICAgIGlmICh2YWx1ZSA8IC0xIHx8IHZhbHVlID4gKDgpKSB7Ci0gICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKLSAgICB9Ci0gICAgewotICAgICAgUENNRE1YX0VSUk9SIGVycjsKLQotICAgICAgZXJyID0gcGNtRG14X1NldFBhcmFtICgKLSAgICAgICAgICAgICAgaFBjbURteCwKLSAgICAgICAgICAgICAgTUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMsCi0gICAgICAgICAgICAgIHZhbHVlICk7Ci0KLSAgICAgIHN3aXRjaCAoZXJyKSB7Ci0gICAgICBjYXNlIFBDTURNWF9PSzoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFBDTURNWF9JTlZBTElEX0hBTkRMRToKLSAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBBQUNfUENNX0RVQUxfQ0hBTk5FTF9PVVRQVVRfTU9ERToKLSAgICB7Ci0gICAgICBQQ01ETVhfRVJST1IgZXJyOwotCi0gICAgICBlcnIgPSBwY21EbXhfU2V0UGFyYW0gKAotICAgICAgICAgICAgICBoUGNtRG14LAotICAgICAgICAgICAgICBETVhfRFVBTF9DSEFOTkVMX01PREUsCi0gICAgICAgICAgICAgIHZhbHVlICk7Ci0KLSAgICAgIHN3aXRjaCAoZXJyKSB7Ci0gICAgICBjYXNlIFBDTURNWF9PSzoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFBDTURNWF9JTlZBTElEX0hBTkRMRToKLSAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0KLQotICBjYXNlIEFBQ19QQ01fTElNSVRFUl9FTkFCTEU6Ci0gICAgaWYgKHZhbHVlIDwgLTEgfHwgdmFsdWUgPiAxKSB7Ci0gICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKLSAgICB9Ci0gICAgaWYgKHNlbGYgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7Ci0gICAgfQotICAgIHNlbGYtPmxpbWl0ZXJFbmFibGVVc2VyID0gdmFsdWU7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBBQUNfUENNX0xJTUlURVJfQVRUQUNLX1RJTUU6Ci0gICAgaWYgKHZhbHVlIDw9IDApIHsgIC8qIG1vZHVsZSBmdW5jdGlvbiBjb252ZXJ0cyB2YWx1ZSB0byB1bnNpZ25lZCAqLwotICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7Ci0gICAgfQotICAgIHN3aXRjaCAoc2V0TGltaXRlckF0dGFjayhoUGNtVGRsLCB2YWx1ZSkpIHsKLSAgICBjYXNlIFRETElNSVRfT0s6CisgICAgICBkbXhFcnIgPSBwY21EbXhfU2V0UGFyYW0oaFBjbURteCwgTUlOX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMsIHZhbHVlKTsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgVERMSU1JVF9JTlZBTElEX0hBTkRMRToKLSAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwotICAgIGNhc2UgVERMSU1JVF9JTlZBTElEX1BBUkFNRVRFUjoKKworICAgIGNhc2UgQUFDX1BDTV9NQVhfT1VUUFVUX0NIQU5ORUxTOgorICAgICAgaWYgKHZhbHVlIDwgLTEgfHwgdmFsdWUgPiAoOCkpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgICB9CisgICAgICBkbXhFcnIgPSBwY21EbXhfU2V0UGFyYW0oaFBjbURteCwgTUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMsIHZhbHVlKTsKKworICAgICAgaWYgKGRteEVyciAhPSBQQ01ETVhfT0spIHsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgICAgZXJyb3JTdGF0dXMgPQorICAgICAgICAgIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0oaERyY0luZm8sIE1BWF9PVVRQVVRfQ0hBTk5FTFMsIHZhbHVlKTsKKyAgICAgIGlmICh2YWx1ZSA+IDApIHsKKyAgICAgICAgdW5pRHJjRXJyID0gRkRLX2RyY0RlY19TZXRQYXJhbShzZWxmLT5oVW5pRHJjRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUkNfREVDX1RBUkdFVF9DSEFOTkVMX0NPVU5UX1JFUVVFU1RFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFBQ19QQ01fRFVBTF9DSEFOTkVMX09VVFBVVF9NT0RFOgorICAgICAgZG14RXJyID0gcGNtRG14X1NldFBhcmFtKGhQY21EbXgsIERNWF9EVUFMX0NIQU5ORUxfTU9ERSwgdmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFBQ19QQ01fTElNSVRFUl9FTkFCTEU6CisgICAgICBpZiAodmFsdWUgPCAtMiB8fCB2YWx1ZSA+IDEpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgICB9CisgICAgICBzZWxmLT5saW1pdGVyRW5hYmxlVXNlciA9IHZhbHVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFBQ19QQ01fTElNSVRFUl9BVFRBQ0tfVElNRToKKyAgICAgIGlmICh2YWx1ZSA8PSAwKSB7IC8qIG1vZHVsZSBmdW5jdGlvbiBjb252ZXJ0cyB2YWx1ZSB0byB1bnNpZ25lZCAqLworICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAocGNtTGltaXRlcl9TZXRBdHRhY2soaFBjbVRkbCwgdmFsdWUpKSB7CisgICAgICAgIGNhc2UgVERMSU1JVF9PSzoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBURExJTUlUX0lOVkFMSURfSEFORExFOgorICAgICAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOworICAgICAgICBjYXNlIFRETElNSVRfSU5WQUxJRF9QQVJBTUVURVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQUFDX1BDTV9MSU1JVEVSX1JFTEVBU19USU1FOgorICAgICAgaWYgKHZhbHVlIDw9IDApIHsgLyogbW9kdWxlIGZ1bmN0aW9uIGNvbnZlcnRzIHZhbHVlIHRvIHVuc2lnbmVkICovCisgICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgfQorICAgICAgc3dpdGNoIChwY21MaW1pdGVyX1NldFJlbGVhc2UoaFBjbVRkbCwgdmFsdWUpKSB7CisgICAgICAgIGNhc2UgVERMSU1JVF9PSzoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBURExJTUlUX0lOVkFMSURfSEFORExFOgorICAgICAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOworICAgICAgICBjYXNlIFRETElNSVRfSU5WQUxJRF9QQVJBTUVURVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQUFDX01FVEFEQVRBX1BST0ZJTEU6IHsKKyAgICAgIERNWF9QUk9GSUxFX1RZUEUgZG14UHJvZmlsZTsKKyAgICAgIElOVCBtZEV4cGlyeSA9IC0xOyAvKiBpbiBtcyAoLTE6IGRvbid0IGNoYW5nZSkgKi8KKworICAgICAgc3dpdGNoICgoQUFDX01EX1BST0ZJTEUpdmFsdWUpIHsKKyAgICAgICAgY2FzZSBBQUNfTURfUFJPRklMRV9NUEVHX1NUQU5EQVJEOgorICAgICAgICAgIGRteFByb2ZpbGUgPSBETVhfUFJGTF9TVEFOREFSRDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQUNfTURfUFJPRklMRV9NUEVHX0xFR0FDWToKKyAgICAgICAgICBkbXhQcm9maWxlID0gRE1YX1BSRkxfTUFUUklYX01JWDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQUNfTURfUFJPRklMRV9NUEVHX0xFR0FDWV9QUklPOgorICAgICAgICAgIGRteFByb2ZpbGUgPSBETVhfUFJGTF9GT1JDRV9NQVRSSVhfTUlYOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFBQ19NRF9QUk9GSUxFX0FSSUJfSkFQQU46CisgICAgICAgICAgZG14UHJvZmlsZSA9IERNWF9QUkZMX0FSSUJfSkFQQU47CisgICAgICAgICAgbWRFeHBpcnkgPSA1NTA7IC8qIG1zICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgICB9CisgICAgICBkbXhFcnIgPSBwY21EbXhfU2V0UGFyYW0oaFBjbURteCwgRE1YX1BST0ZJTEVfU0VUVElORywgKElOVClkbXhQcm9maWxlKTsKKyAgICAgIGlmIChkbXhFcnIgIT0gUENNRE1YX09LKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIGlmICgoc2VsZiAhPSBOVUxMKSAmJiAobWRFeHBpcnkgPj0gMCkpIHsKKyAgICAgICAgc2VsZi0+bWV0YWRhdGFFeHBpcnkgPSBtZEV4cGlyeTsKKyAgICAgICAgLyogRGV0ZXJtaW5lIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBmcmFtZXMgYW5kIGNvbmZpZ3VyZSBhbGwKKyAgICAgICAgICogcmVsYXRlZCBtb2R1bGVzLiAqLworICAgICAgICBhYWNEZWNvZGVyX3NldE1ldGFkYXRhRXhwaXJ5KHNlbGYsIG1kRXhwaXJ5KTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworCisgICAgY2FzZSBBQUNfTUVUQURBVEFfRVhQSVJZX1RJTUU6CisgICAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgfQorICAgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBzZWxmLT5tZXRhZGF0YUV4cGlyeSA9IHZhbHVlOworICAgICAgICAvKiBEZXRlcm1pbmUgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIGZyYW1lcyBhbmQgY29uZmlndXJlIGFsbAorICAgICAgICAgKiByZWxhdGVkIG1vZHVsZXMuICovCisgICAgICAgIGFhY0RlY29kZXJfc2V0TWV0YWRhdGFFeHBpcnkoc2VsZiwgdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFBQ19QQ01fT1VUUFVUX0NIQU5ORUxfTUFQUElORzoKKyAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAxKSB7CisgICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgfQorICAgICAgLyogQ0FVVElPTjogVGhlIGdpdmVuIHZhbHVlIG11c3QgYmUgaW52ZXJ0ZWQgdG8gbWF0Y2ggdGhlIGxvZ2ljISAqLworICAgICAgRkRLX2NoTWFwRGVzY3Jfc2V0UGFzc1Rocm91Z2goJnNlbGYtPm1hcERlc2NyLCAhdmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFBQ19RTUZfTE9XUE9XRVI6CisgICAgICBpZiAodmFsdWUgPCAtMSB8fCB2YWx1ZSA+IDEpIHsKKyAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogU2V0IFFNRiBtb2RlIChtaWdodCBiZSBvdmVycmlkZW4pCisgICAgICAgKiAgMDpIUSAoY29tcGxleCkKKyAgICAgICAqICAxOkxQIChwYXJ0aWFsbHkgY29tcGxleCkKKyAgICAgICAqLworICAgICAgc2VsZi0+cW1mTW9kZVVzZXIgPSAoUU1GX01PREUpdmFsdWU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1I6CisgICAgICAvKiBEUkMgY29tcHJlc3Npb24gZmFjdG9yICh3aGVyZSAwIGlzIG5vIGFuZCAxMjcgaXMgbWF4IGNvbXByZXNzaW9uKSAqLworICAgICAgZXJyb3JTdGF0dXMgPSBhYWNEZWNvZGVyX2RyY1NldFBhcmFtKGhEcmNJbmZvLCBEUkNfQ1VUX1NDQUxFLCB2YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQUFDX0RSQ19CT09TVF9GQUNUT1I6CisgICAgICAvKiBEUkMgYm9vc3QgZmFjdG9yICh3aGVyZSAwIGlzIG5vIGFuZCAxMjcgaXMgbWF4IGJvb3N0KSAqLworICAgICAgZXJyb3JTdGF0dXMgPSBhYWNEZWNvZGVyX2RyY1NldFBhcmFtKGhEcmNJbmZvLCBEUkNfQk9PU1RfU0NBTEUsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBQUNfRFJDX1JFRkVSRU5DRV9MRVZFTDoKKyAgICAgIGlmICgodmFsdWUgPj0gMCkgJiYKKyAgICAgICAgICAoKHZhbHVlIDwgNDApIHx8ICh2YWx1ZSA+IDEyNykpKSAvKiBhbGxvd2VkIHJhbmdlOiAtMTAgdG8gLTMxLjc1IGRCICovCisgICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICAgICAgLyogRFJDIHRhcmdldCByZWZlcmVuY2UgbGV2ZWwgcXVhbnRpemVkIGluIDAuMjVkQiBzdGVwcyB1c2luZyB2YWx1ZXMKKyAgICAgICAgIFs0MC4uMTI3XS4gTmVnYXRpdmUgdmFsdWVzIHN3aXRjaCBvZmYgbG91ZG5lc3Mgbm9ybWFsaXNhdGlvbi4gTmVnYXRpdmUKKyAgICAgICAgIHZhbHVlcyBhbHNvIHN3aXRjaCBvZmYgTVBFRy00IERSQywgd2hpbGUgTVBFRy1EIERSQyBjYW4gYmUgc2VwYXJhdGVseQorICAgICAgICAgc3dpdGNoZWQgb24vb2ZmIHdpdGggQUFDX1VOSURSQ19TRVRfRUZGRUNUICovCisgICAgICBlcnJvclN0YXR1cyA9IGFhY0RlY29kZXJfZHJjU2V0UGFyYW0oaERyY0luZm8sIFRBUkdFVF9SRUZfTEVWRUwsIHZhbHVlKTsKKyAgICAgIHVuaURyY0VyciA9IEZES19kcmNEZWNfU2V0UGFyYW0oc2VsZi0+aFVuaURyY0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSQ19ERUNfTE9VRE5FU1NfTk9STUFMSVpBVElPTl9PTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSh2YWx1ZSA+PSAwKSk7CisgICAgICAvKiBzZXQgdGFyZ2V0IGxvdWRuZXNzIGFsc28gZm9yIE1QRUctRCBEUkMgKi8KKyAgICAgIHNlbGYtPmRlZmF1bHRUYXJnZXRMb3VkbmVzcyA9IChTQ0hBUil2YWx1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OOgorICAgICAgLyogRG9uJ3QgbmVlZCB0byBvdmVyd3JpdGUgY3V0L2Jvb3N0IHZhbHVlcyAqLworICAgICAgZXJyb3JTdGF0dXMgPQorICAgICAgICAgIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0oaERyY0luZm8sIEFQUExZX0hFQVZZX0NPTVBSRVNTSU9OLCB2YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQUFDX0RSQ19ERUZBVUxUX1BSRVNFTlRBVElPTl9NT0RFOgorICAgICAgLyogRFJDIGRlZmF1bHQgcHJlc2VudGF0aW9uIG1vZGUgKi8KKyAgICAgIGVycm9yU3RhdHVzID0KKyAgICAgICAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtKGhEcmNJbmZvLCBERUZBVUxUX1BSRVNFTlRBVElPTl9NT0RFLCB2YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQUFDX0RSQ19FTkNfVEFSR0VUX0xFVkVMOgorICAgICAgLyogRW5jb2RlciB0YXJnZXQgbGV2ZWwgZm9yIGxpZ2h0IChpLmUuIG5vdCBoZWF2eSkgY29tcHJlc3Npb246CisgICAgICAgICBUYXJnZXQgcmVmZXJlbmNlIGxldmVsIGFzc3VtZWQgYXQgZW5jb2RlciBmb3IgZGVyaXZpbmcgbGltaXRpbmcgZ2FpbnMKKyAgICAgICAqLworICAgICAgZXJyb3JTdGF0dXMgPQorICAgICAgICAgIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0oaERyY0luZm8sIEVOQ09ERVJfVEFSR0VUX0xFVkVMLCB2YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQUFDX1VOSURSQ19TRVRfRUZGRUNUOgorICAgICAgaWYgKCh2YWx1ZSA8IC0xKSB8fCAodmFsdWUgPiA2KSkgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgICB1bmlEcmNFcnIgPSBGREtfZHJjRGVjX1NldFBhcmFtKHNlbGYtPmhVbmlEcmNEZWNvZGVyLCBEUkNfREVDX0VGRkVDVF9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNfVFBERUNfQ0xFQVJfQlVGRkVSOgorICAgICAgZXJyVHAgPSB0cmFuc3BvcnREZWNfU2V0UGFyYW0oaFRwRGVjLCBUUERFQ19QQVJBTV9SRVNFVCwgMSk7CisgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUxvc3RBY2Nlc3NVbml0cyA9IDA7CisgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUJhZEJ5dGVzID0gMDsKKyAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtVG90YWxCeXRlcyA9IDA7CisgICAgICAvKiBhYWNEZWNvZGVyX1NpZ25hbEludGVycnVwdGlvbihzZWxmKTsgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDX0NPTkNFQUxfTUVUSE9EOgorICAgICAgLyogQ2hhbmdpbmcgdGhlIGNvbmNlYWxtZW50IG1ldGhvZCBjYW4gaW50cm9kdWNlIGFkZGl0aW9uYWwgYml0c3RyZWFtCisgICAgICAgICBkZWxheS4gQW5kIHRoYXQgaW4gdHVybiBhZmZlY3RzIHN1YiBsaWJyYXJpZXMgYW5kIG1vZHVsZXMgd2hpY2ggbWFrZXMKKyAgICAgICAgIHRoZSB3aG9sZSB0aGluZyBxdWl0ZSBjb21wbGV4LiAgU28gdGhlIGNvbXBsZXRlIGNoYW5naW5nIHJvdXRpbmUgaXMKKyAgICAgICAgIHBhY2tlZCBpbnRvIGEgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIGtlZXBzIGFsbCBtb2R1bGVzIGFuZCBsaWJzIGluIGEKKyAgICAgICAgIGNvbnNpc3RlbnQgc3RhdGUgZXZlbiBpbiB0aGUgY2FzZSBhbiBlcnJvciBvY2N1cmVzLiAqLworICAgICAgZXJyb3JTdGF0dXMgPSBzZXRDb25jZWFsTWV0aG9kKHNlbGYsIHZhbHVlKTsKKyAgICAgIGlmIChlcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKSB7CisgICAgICAgIHNlbGYtPmNvbmNlYWxNZXRob2RVc2VyID0gKENDb25jZWFsbWVudE1ldGhvZCl2YWx1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCiAgICAgZGVmYXVsdDoKICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwotICAgIH0KLSAgICBicmVhazsKKyAgfSAvKiBzd2l0Y2gocGFyYW0pICovCiAKLSAgY2FzZSBBQUNfUENNX0xJTUlURVJfUkVMRUFTX1RJTUU6Ci0gICAgaWYgKHZhbHVlIDw9IDApIHsgIC8qIG1vZHVsZSBmdW5jdGlvbiBjb252ZXJ0cyB2YWx1ZSB0byB1bnNpZ25lZCAqLwotICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7Ci0gICAgfQotICAgIHN3aXRjaCAoc2V0TGltaXRlclJlbGVhc2UoaFBjbVRkbCwgdmFsdWUpKSB7Ci0gICAgY2FzZSBURExJTUlUX09LOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBURExJTUlUX0lOVkFMSURfSEFORExFOgotICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7Ci0gICAgY2FzZSBURExJTUlUX0lOVkFMSURfUEFSQU1FVEVSOgotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKLSAgICB9Ci0gICAgYnJlYWs7CitiYWlsOgogCi0gIGNhc2UgQUFDX1BDTV9PVVRQVVRfQ0hBTk5FTF9NQVBQSU5HOgotICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgaWYgKGVycm9yU3RhdHVzID09IEFBQ19ERUNfT0spIHsKKyAgICAvKiBDaGVjayBlcnJvciBjb2RlIHJldHVybmVkIGJ5IERNWCBtb2R1bGUgbGlicmFyeTogKi8KKyAgICBzd2l0Y2ggKGRteEVycikgeworICAgICAgY2FzZSBQQ01ETVhfT0s6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQQ01ETVhfSU5WQUxJRF9IQU5ETEU6CisgICAgICAgIGVycm9yU3RhdHVzID0gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBlcnJvclN0YXR1cyA9IEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgfQorICB9CisKKyAgaWYgKGVyclRwICE9IFRSQU5TUE9SVERFQ19PSyAmJiBlcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKSB7CisgICAgZXJyb3JTdGF0dXMgPSBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOworICB9CisKKyAgaWYgKGVycm9yU3RhdHVzID09IEFBQ19ERUNfT0spIHsKKyAgICAvKiBDaGVjayBlcnJvciBjb2RlIHJldHVybmVkIGJ5IE1QRUctRCBEUkMgZGVjb2RlciBsaWJyYXJ5OiAqLworICAgIHN3aXRjaCAodW5pRHJjRXJyKSB7CiAgICAgICBjYXNlIDA6Ci0gICAgICAgIGlmIChzZWxmICE9IE5VTEwpIHsKLSAgICAgICAgICBzZWxmLT5jaGFubmVsT3V0cHV0TWFwcGluZyA9IGNoYW5uZWxNYXBwaW5nVGFibGVQYXNzdGhyb3VnaDsKLSAgICAgICAgfQogICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgaWYgKHNlbGYgIT0gTlVMTCkgewotICAgICAgICAgIHNlbGYtPmNoYW5uZWxPdXRwdXRNYXBwaW5nID0gY2hhbm5lbE1hcHBpbmdUYWJsZVdBVjsKLSAgICAgICAgfQorICAgICAgY2FzZSAtOTk5ODoKKyAgICAgICAgZXJyb3JTdGF0dXMgPSBBQUNfREVDX0lOVkFMSURfSEFORExFOwogICAgICAgICBicmVhazsKICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIGVycm9yU3RhdHVzID0gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIGJyZWFrOwotCi0KLSAgY2FzZSBBQUNfUU1GX0xPV1BPV0VSOgotICAgIGlmICh2YWx1ZSA8IC0xIHx8IHZhbHVlID4gMSkgewotICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7Ci0gICAgfQotICAgIGlmIChzZWxmID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBRTUYgbW9kZSAobWlnaHQgYmUgb3ZlcnJpZGVuKQotICAgICAqICAwOkhRIChjb21wbGV4KQotICAgICAqICAxOkxQIChwYXJ0aWFsbHkgY29tcGxleCkKLSAgICAgKi8KLSAgICBzZWxmLT5xbWZNb2RlVXNlciA9IChRTUZfTU9ERSl2YWx1ZTsKLSAgICBicmVhazsKLQotCi0gIGNhc2UgQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1I6Ci0gICAgLyogRFJDIGNvbXByZXNzaW9uIGZhY3RvciAod2hlcmUgMCBpcyBubyBhbmQgMTI3IGlzIG1heCBjb21wcmVzc2lvbikgKi8KLSAgICBlcnJvclN0YXR1cyA9Ci0gICAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtICgKLSAgICAgICAgaERyY0luZm8sCi0gICAgICAgIERSQ19DVVRfU0NBTEUsCi0gICAgICAgIHZhbHVlCi0gICAgICApOwotICAgIGJyZWFrOwotCi0gIGNhc2UgQUFDX0RSQ19CT09TVF9GQUNUT1I6Ci0gICAgLyogRFJDIGJvb3N0IGZhY3RvciAod2hlcmUgMCBpcyBubyBhbmQgMTI3IGlzIG1heCBib29zdCkgKi8KLSAgICBlcnJvclN0YXR1cyA9Ci0gICAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtICgKLSAgICAgICAgaERyY0luZm8sCi0gICAgICAgIERSQ19CT09TVF9TQ0FMRSwKLSAgICAgICAgdmFsdWUKLSAgICAgICk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBBQUNfRFJDX1JFRkVSRU5DRV9MRVZFTDoKLSAgICAvKiBEUkMgcmVmZXJlbmNlIGxldmVsIHF1YW50aXplZCBpbiAwLjI1ZEIgc3RlcHMgdXNpbmcgdmFsdWVzIFswLi4xMjddIGl0IGlzICctJyBmb3IgYW5hbG9nIHNjYWxpbmcgKi8KLSAgICBlcnJvclN0YXR1cyA9Ci0gICAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtICgKLSAgICAgICAgaERyY0luZm8sCi0gICAgICAgIFRBUkdFVF9SRUZfTEVWRUwsCi0gICAgICAgIHZhbHVlCi0gICAgICApOwotICAgIGJyZWFrOwotCi0gIGNhc2UgQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTjoKLSAgICAvKiBEb24ndCBuZWVkIHRvIG92ZXJ3cml0ZSBjdXQvYm9vc3QgdmFsdWVzICovCi0gICAgZXJyb3JTdGF0dXMgPQotICAgICAgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbSAoCi0gICAgICAgIGhEcmNJbmZvLAotICAgICAgICBBUFBMWV9IRUFWWV9DT01QUkVTU0lPTiwKLSAgICAgICAgdmFsdWUKLSAgICAgICk7Ci0gICAgYnJlYWs7Ci0KLQotICBjYXNlIEFBQ19UUERFQ19DTEVBUl9CVUZGRVI6Ci0gICAgdHJhbnNwb3J0RGVjX1NldFBhcmFtKHNlbGYtPmhJbnB1dCwgVFBERUNfUEFSQU1fUkVTRVQsIDEpOwotICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtTG9zdEFjY2Vzc1VuaXRzID0gMDsKLSAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUJhZEJ5dGVzID0gMDsKLSAgICBzZWxmLT5zdHJlYW1JbmZvLm51bVRvdGFsQnl0ZXMgPSAwOwotICAgIC8qIGFhY0RlY29kZXJfU2lnbmFsSW50ZXJydXB0aW9uKHNlbGYpOyAqLwotICAgIGJyZWFrOwotCi0gIGNhc2UgQUFDX0NPTkNFQUxfTUVUSE9EOgotICAgIC8qIENoYW5naW5nIHRoZSBjb25jZWFsbWVudCBtZXRob2QgY2FuIGludHJvZHVjZSBhZGRpdGlvbmFsIGJpdHN0cmVhbSBkZWxheS4gQW5kCi0gICAgICAgdGhhdCBpbiB0dXJuIGFmZmVjdHMgc3ViIGxpYnJhcmllcyBhbmQgbW9kdWxlcyB3aGljaCBtYWtlcyB0aGUgd2hvbGUgdGhpbmcgcXVpdGUKLSAgICAgICBjb21wbGV4LiAgU28gdGhlIGNvbXBsZXRlIGNoYW5naW5nIHJvdXRpbmUgaXMgcGFja2VkIGludG8gYSBoZWxwZXIgZnVuY3Rpb24gd2hpY2gKLSAgICAgICBrZWVwcyBhbGwgbW9kdWxlcyBhbmQgbGlicyBpbiBhIGNvbnNpc3RlbnQgc3RhdGUgZXZlbiBpbiB0aGUgY2FzZSBhbiBlcnJvciBvY2N1cmVzLiAqLwotICAgIGVycm9yU3RhdHVzID0gc2V0Q29uY2VhbE1ldGhvZCAoIHNlbGYsIHZhbHVlICk7Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKLSAgfSAgLyogc3dpdGNoKHBhcmFtKSAqLworICB9CiAKICAgcmV0dXJuIChlcnJvclN0YXR1cyk7CiB9Ci0KLQotTElOS1NQRUNfQ1BQIEhBTkRMRV9BQUNERUNPREVSIGFhY0RlY29kZXJfT3BlbihUUkFOU1BPUlRfVFlQRSB0cmFuc3BvcnRGbXQsIFVJTlQgbnJPZkxheWVycykKLXsKK0xJTktTUEVDX0NQUCBIQU5ETEVfQUFDREVDT0RFUiBhYWNEZWNvZGVyX09wZW4oVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0Rm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIG5yT2ZMYXllcnMpIHsKICAgQUFDX0RFQ09ERVJfSU5TVEFOQ0UgKmFhY0RlYyA9IE5VTEw7CiAgIEhBTkRMRV9UUkFOU1BPUlRERUMgcEluOwogICBpbnQgZXJyID0gMDsKKyAgaW50IHN0ZXJlb0NvbmZpZ0luZGV4ID0gLTE7CisKKyAgVUlOVCBuck9mTGF5ZXJzX21pbiA9IGZNaW4obnJPZkxheWVycywgKFVJTlQpMSk7CiAKICAgLyogQWxsb2NhdGUgdHJhbnNwb3J0IGxheWVyIHN0cnVjdC4gKi8KLSAgcEluID0gdHJhbnNwb3J0RGVjX09wZW4odHJhbnNwb3J0Rm10LCBUUF9GTEFHX01QRUc0KTsKKyAgcEluID0gdHJhbnNwb3J0RGVjX09wZW4odHJhbnNwb3J0Rm10LCBUUF9GTEFHX01QRUc0LCBuck9mTGF5ZXJzX21pbik7CiAgIGlmIChwSW4gPT0gTlVMTCkgewogICAgIHJldHVybiBOVUxMOwogICB9CiAKLSAgdHJhbnNwb3J0RGVjX1NldFBhcmFtKHBJbiwgVFBERUNfUEFSQU1fSUdOT1JFX0JVRkZFUkZVTExORVNTLCAxKTsKLQogICAvKiBBbGxvY2F0ZSBBQUMgZGVjb2RlciBjb3JlIHN0cnVjdC4gKi8KICAgYWFjRGVjID0gQ0FhY0RlY29kZXJfT3Blbih0cmFuc3BvcnRGbXQpOwogCkBAIC02NTksMjkgKzkzNSw2NyBAQAogICB9CiAgIGFhY0RlYy0+aElucHV0ID0gcEluOwogCi0gIGFhY0RlYy0+bnJPZkxheWVycyA9IG5yT2ZMYXllcnM7CisgIGFhY0RlYy0+bnJPZkxheWVycyA9IG5yT2ZMYXllcnNfbWluOwogCi0gIGFhY0RlYy0+Y2hhbm5lbE91dHB1dE1hcHBpbmcgPSBjaGFubmVsTWFwcGluZ1RhYmxlV0FWOworICAvKiBTZXR1cCBjaGFubmVsIG1hcHBpbmcgZGVzY3JpcHRvci4gKi8KKyAgRkRLX2NoTWFwRGVzY3JfaW5pdCgmYWFjRGVjLT5tYXBEZXNjciwgTlVMTCwgMCwgMCk7CiAKICAgLyogUmVnaXN0ZXIgQ29uZmlnIFVwZGF0ZSBjYWxsYmFjay4gKi8KLSAgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyQXNjQ2FsbGJhY2socEluLCBhYWNEZWNvZGVyX0NvbmZpZ0NhbGxiYWNrLCAodm9pZCopYWFjRGVjKTsKKyAgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyQXNjQ2FsbGJhY2socEluLCBhYWNEZWNvZGVyX0NvbmZpZ0NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFhY0RlYyk7CiAKKyAgLyogUmVnaXN0ZXIgRnJlZSBNZW1vcnkgY2FsbGJhY2suICovCisgIHRyYW5zcG9ydERlY19SZWdpc3RlckZyZWVNZW1DYWxsYmFjayhwSW4sIGFhY0RlY29kZXJfRnJlZU1lbUNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhYWNEZWMpOworCisgIC8qIFJlZ2lzdGVyIGNvbmZpZyBzd2l0Y2ggY29udHJvbCBjYWxsYmFjay4gKi8KKyAgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyQ3RybENGR0NoYW5nZUNhbGxiYWNrKAorICAgICAgcEluLCBhYWNEZWNvZGVyX0N0cmxDRkdDaGFuZ2VDYWxsYmFjaywgKHZvaWQgKilhYWNEZWMpOworCisgIEZES21lbWNsZWFyKCZhYWNEZWMtPnFtZkRvbWFpbiwgc2l6ZW9mKEZES19RTUZfRE9NQUlOKSk7CiAgIC8qIG9wZW4gU0JSIGRlY29kZXIgKi8KLSAgaWYgKCBTQlJERUNfT0sgIT0gc2JyRGVjb2Rlcl9PcGVuICggJmFhY0RlYy0+aFNickRlY29kZXIgKSkgeworICBpZiAoU0JSREVDX09LICE9IHNickRlY29kZXJfT3BlbigmYWFjRGVjLT5oU2JyRGVjb2RlciwgJmFhY0RlYy0+cW1mRG9tYWluKSkgewogICAgIGVyciA9IC0xOwogICAgIGdvdG8gYmFpbDsKICAgfQogICBhYWNEZWMtPnFtZk1vZGVVc2VyID0gTk9UX0RFRklORUQ7Ci0gIHRyYW5zcG9ydERlY19SZWdpc3RlclNickNhbGxiYWNrKGFhY0RlYy0+aElucHV0LCAoY2JTYnJfdClzYnJEZWNvZGVyX0hlYWRlciwgKHZvaWQqKWFhY0RlYy0+aFNickRlY29kZXIpOworICB0cmFuc3BvcnREZWNfUmVnaXN0ZXJTYnJDYWxsYmFjayhhYWNEZWMtPmhJbnB1dCwgKGNiU2JyX3Qpc2JyRGVjb2Rlcl9IZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYWFjRGVjLT5oU2JyRGVjb2Rlcik7CiAKKyAgaWYgKG1wZWdTdXJyb3VuZERlY29kZXJfT3BlbigKKyAgICAgICAgICAoQ01wZWdTdXJyb3VuZERlY29kZXIgKiopJmFhY0RlYy0+cE1wZWdTdXJyb3VuZERlY29kZXIsCisgICAgICAgICAgc3RlcmVvQ29uZmlnSW5kZXgsICZhYWNEZWMtPnFtZkRvbWFpbikpIHsKKyAgICBlcnIgPSAtMTsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAgLyogU2V0IE1QRUcgU3Vycm91bmQgZGVmYXVsdHMgKi8KKyAgYWFjRGVjLT5tcHNFbmFibGVVc2VyID0gMDsKKyAgYWFjRGVjLT5tcHNFbmFibGVDdXJyID0gMDsKKyAgYWFjRGVjLT5tcHNBcHBsaWNhYmxlID0gMDsKKyAgYWFjRGVjLT5tcHNPdXRwdXRNb2RlID0gKFNDSEFSKVNBQ0RFQ19PVVRfTU9ERV9OT1JNQUw7CisgIHRyYW5zcG9ydERlY19SZWdpc3RlclNzY0NhbGxiYWNrKHBJbiwgYWFjRGVjb2Rlcl9Tc2NDYWxsYmFjaywgKHZvaWQgKilhYWNEZWMpOwogCi0gIHBjbURteF9PcGVuKCAmYWFjRGVjLT5oUGNtVXRpbHMgKTsKKyAgeworICAgIGlmIChGREtfZHJjRGVjX09wZW4oJihhYWNEZWMtPmhVbmlEcmNEZWNvZGVyKSwgRFJDX0RFQ19BTEwpICE9IDApIHsKKyAgICAgIGVyciA9IC0xOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfQorCisgIHRyYW5zcG9ydERlY19SZWdpc3RlclVuaURyY0NvbmZpZ0NhbGxiYWNrKHBJbiwgYWFjRGVjb2Rlcl9VbmlEcmNDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhYWNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhY0RlYy0+bG91ZG5lc3NJbmZvU2V0UG9zaXRpb24pOworICBhYWNEZWMtPmRlZmF1bHRUYXJnZXRMb3VkbmVzcyA9IChTQ0hBUik5NjsKKworICBwY21EbXhfT3BlbigmYWFjRGVjLT5oUGNtVXRpbHMpOwogICBpZiAoYWFjRGVjLT5oUGNtVXRpbHMgPT0gTlVMTCkgewogICAgIGVyciA9IC0xOwogICAgIGdvdG8gYmFpbDsKICAgfQogCi0gIGFhY0RlYy0+aExpbWl0ZXIgPSBjcmVhdGVMaW1pdGVyKFRETF9BVFRBQ0tfREVGQVVMVF9NUywgVERMX1JFTEVBU0VfREVGQVVMVF9NUywgU0FNUExFX01BWCwgKDgpLCA5NjAwMCk7CisgIGFhY0RlYy0+aExpbWl0ZXIgPQorICAgICAgcGNtTGltaXRlcl9DcmVhdGUoVERMX0FUVEFDS19ERUZBVUxUX01TLCBURExfUkVMRUFTRV9ERUZBVUxUX01TLAorICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKU1BWFZBTF9EQkwsICg4KSwgOTYwMDApOwogICBpZiAoTlVMTCA9PSBhYWNEZWMtPmhMaW1pdGVyKSB7CiAgICAgZXJyID0gLTE7CiAgICAgZ290byBiYWlsOwpAQCAtNjg5LDEwICsxMDAzLDkgQEAKICAgYWFjRGVjLT5saW1pdGVyRW5hYmxlVXNlciA9IChVQ0hBUiktMTsKICAgYWFjRGVjLT5saW1pdGVyRW5hYmxlQ3VyciA9IDA7CiAKLQotCiAgIC8qIEFzc3VyZSB0aGF0IGFsbCBtb2R1bGVzIGhhdmUgc2FtZSBkZWxheSAqLwotICBpZiAoIHNldENvbmNlYWxNZXRob2QoYWFjRGVjLCBDQ29uY2VhbG1lbnRfR2V0TWV0aG9kKCZhYWNEZWMtPmNvbmNlYWxDb21tb25EYXRhKSkgKSB7CisgIGlmIChzZXRDb25jZWFsTWV0aG9kKGFhY0RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0NvbmNlYWxtZW50X0dldE1ldGhvZCgmYWFjRGVjLT5jb25jZWFsQ29tbW9uRGF0YSkpKSB7CiAgICAgZXJyID0gLTE7CiAgICAgZ290byBiYWlsOwogICB9CkBAIC03MDUsMjUgKzEwMTgsMjQgQEAKICAgcmV0dXJuIGFhY0RlYzsKIH0KIAotTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfRmlsbCgKLSAgICAgICAgSEFORExFX0FBQ0RFQ09ERVIgICBzZWxmLAotICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgKnBCdWZmZXJbXSwKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICBidWZmZXJTaXplW10sCi0gICAgICAgIFVJTlQgICAgICAgICAgICAgICAqcEJ5dGVzVmFsaWQKLSAgICAgICAgKQoteworTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfRmlsbChIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcEJ1ZmZlcltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGJ1ZmZlclNpemVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqcEJ5dGVzVmFsaWQpIHsKICAgVFJBTlNQT1JUREVDX0VSUk9SIHRwRXJyOwotICAvKiBsb29wIGNvdW50ZXIgZm9yIGxheWVyczsgaWYgbm90IFRUX01QNF9SQVdQQUNLRVRTIHVzZWQgYXMgaW5kZXggZm9yIG9ubHkgCi0gICAgIGF2YWlsYWJsZSBsYXllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgSU5UIGxheWVyICAgICAgPSAwOworICAvKiBsb29wIGNvdW50ZXIgZm9yIGxheWVyczsgaWYgbm90IFRUX01QNF9SQVdQQUNLRVRTIHVzZWQgYXMgaW5kZXggZm9yIG9ubHkKKyAgICAgYXZhaWxhYmxlIGxheWVyICovCisgIElOVCBsYXllciA9IDA7CiAgIElOVCBuck9mTGF5ZXJzID0gc2VsZi0+bnJPZkxheWVyczsKIAogICB7Ci0gICAgZm9yIChsYXllciA9IDA7IGxheWVyIDwgbnJPZkxheWVyczsgbGF5ZXIrKyl7CisgICAgZm9yIChsYXllciA9IDA7IGxheWVyIDwgbnJPZkxheWVyczsgbGF5ZXIrKykgewogICAgICAgewotICAgICAgICB0cEVyciA9IHRyYW5zcG9ydERlY19GaWxsRGF0YSggc2VsZi0+aElucHV0LCBwQnVmZmVyW2xheWVyXSwgYnVmZmVyU2l6ZVtsYXllcl0sICZwQnl0ZXNWYWxpZFtsYXllcl0sIGxheWVyICk7CisgICAgICAgIHRwRXJyID0gdHJhbnNwb3J0RGVjX0ZpbGxEYXRhKHNlbGYtPmhJbnB1dCwgcEJ1ZmZlcltsYXllcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemVbbGF5ZXJdLCAmcEJ5dGVzVmFsaWRbbGF5ZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcik7CiAgICAgICAgIGlmICh0cEVyciAhPSBUUkFOU1BPUlRERUNfT0spIHsKLSAgICAgICAgICByZXR1cm4gQUFDX0RFQ19VTktOT1dOOyAgLyogTXVzdCBiZSBhbiBpbnRlcm5hbCBlcnJvciAqLworICAgICAgICAgIHJldHVybiBBQUNfREVDX1VOS05PV047IC8qIE11c3QgYmUgYW4gaW50ZXJuYWwgZXJyb3IgKi8KICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTczMiwzOCArMTA0NCw0NyBAQAogICByZXR1cm4gQUFDX0RFQ19PSzsKIH0KIAotCi1zdGF0aWMgdm9pZCBhYWNEZWNvZGVyX1NpZ25hbEludGVycnVwdGlvbihIQU5ETEVfQUFDREVDT0RFUiBzZWxmKQoteworc3RhdGljIHZvaWQgYWFjRGVjb2Rlcl9TaWduYWxJbnRlcnJ1cHRpb24oSEFORExFX0FBQ0RFQ09ERVIgc2VsZikgewogICBDQWFjRGVjb2Rlcl9TaWduYWxJbnRlcnJ1cHRpb24oc2VsZik7CiAKLSAgaWYgKCBzZWxmLT5oU2JyRGVjb2RlciAhPSBOVUxMICkgewotICAgIHNickRlY29kZXJfU2V0UGFyYW0oc2VsZi0+aFNickRlY29kZXIsIFNCUl9CU19JTlRFUlJVUFRJT04sIDApOworICBpZiAoc2VsZi0+aFNickRlY29kZXIgIT0gTlVMTCkgeworICAgIHNickRlY29kZXJfU2V0UGFyYW0oc2VsZi0+aFNickRlY29kZXIsIFNCUl9CU19JTlRFUlJVUFRJT04sIDEpOworICB9CisgIGlmIChzZWxmLT5tcHNFbmFibGVVc2VyKSB7CisgICAgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9TZXRQYXJhbSgKKyAgICAgICAgKENNcGVnU3Vycm91bmREZWNvZGVyICopc2VsZi0+cE1wZWdTdXJyb3VuZERlY29kZXIsCisgICAgICAgIFNBQ0RFQ19CU19JTlRFUlJVUFRJT04sIDEpOwogICB9CiB9CiAKLXN0YXRpYyB2b2lkIGFhY0RlY29kZXJfVXBkYXRlQml0U3RyZWFtQ291bnRlcnMoQ1N0cmVhbUluZm8gKnBTaSwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBpbnQgbkJpdHMsIEFBQ19ERUNPREVSX0VSUk9SIEVycm9yU3RhdHVzKQoteworc3RhdGljIHZvaWQgYWFjRGVjb2Rlcl9VcGRhdGVCaXRTdHJlYW1Db3VudGVycyhDU3RyZWFtSW5mbyAqcFNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDX0RFQ09ERVJfRVJST1IgRXJyb3JTdGF0dXMpIHsKICAgLyogY2FsY3VsYXRlIGJpdCBkaWZmZXJlbmNlIChhbW91bnQgb2YgYml0cyBtb3ZlZCBmb3J3YXJkKSAqLwotICBuQml0cyA9IG5CaXRzIC0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisgIG5CaXRzID0gbkJpdHMgLSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpOwogCiAgIC8qIE5vdGU6IFRoZSBhbW91bnQgb2YgYml0cyBjb25zdW1lZCBtaWdodCBiZWNvbWUgbmVnYXRpdmUgd2hlbiBwYXJzaW5nIGEKICAgICAgYml0IHN0cmVhbSB3aXRoIHNldmVyYWwgc3ViIGZyYW1lcywgYW5kIHdlIGZpbmQgb3V0IGF0IHRoZSBsYXN0IHN1YiBmcmFtZQotICAgICB0aGF0IHRoZSB0b3RhbCBmcmFtZSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggdGhlIHN1bSBvZiBzdWIgZnJhbWUgbGVuZ3RoLiAKKyAgICAgdGhhdCB0aGUgdG90YWwgZnJhbWUgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIHRoZSBzdW0gb2Ygc3ViIGZyYW1lIGxlbmd0aC4KICAgICAgSWYgdGhpcyBoYXBwZW5zLCB0aGUgdHJhbnNwb3J0IGRlY29kZXIgbWlnaHQgd2FudCB0byByZXdpbmQgdG8gdGhlIHN1cHBvc2VkCiAgICAgIGVuZGluZyBvZiB0aGUgdHJhbnNwb3J0IGZyYW1lLCBhbmQgdGhpcyBwb3NpdGlvbiBtaWdodCBiZSBiZWZvcmUgdGhlIGxhc3QKICAgICAgYWNjZXNzIHVuaXQgYmVnaW5uaW5nLiAqLwogCiAgIC8qIENhbGMgYml0cmF0ZS4gKi8KICAgaWYgKHBTaS0+ZnJhbWVTaXplID4gMCkgewotICAgIHBTaS0+Yml0UmF0ZSA9IChuQml0cyAqIHBTaS0+c2FtcGxlUmF0ZSkvcFNpLT5mcmFtZVNpemU7CisgICAgLyogYml0UmF0ZSA9IG5CaXRzICogc2FtcGxlUmF0ZSAvIGZyYW1lU2l6ZSAqLworICAgIGludCByYXRpb19lID0gMDsKKyAgICBGSVhQX0RCTCByYXRpb19tID0gZkRpdk5vcm0ocFNpLT5zYW1wbGVSYXRlLCBwU2ktPmZyYW1lU2l6ZSwgJnJhdGlvX2UpOworICAgIHBTaS0+Yml0UmF0ZSA9IChJTlQpZk11bHROb3JtKG5CaXRzLCBERlJBQ1RfQklUUyAtIDEsIHJhdGlvX20sIHJhdGlvX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREZSQUNUX0JJVFMgLSAxKTsKICAgfQogCiAgIC8qIGJpdC9ieXRlIGNvdW50ZXJzICovCiAgIHsKLSAgICBpbnQgbkJ5dGVzOworICAgIElOVCBuQnl0ZXM7CiAKLSAgICBuQnl0ZXMgPSBuQml0cz4+MzsKKyAgICBuQnl0ZXMgPSBuQml0cyA+PiAzOwogICAgIHBTaS0+bnVtVG90YWxCeXRlcyArPSBuQnl0ZXM7CiAgICAgaWYgKElTX09VVFBVVF9WQUxJRChFcnJvclN0YXR1cykpIHsKICAgICAgIHBTaS0+bnVtVG90YWxBY2Nlc3NVbml0cysrOwpAQCAtNzc1LDU0ICsxMDk2LDgxIEBACiAgIH0KIH0KIAotc3RhdGljIElOVCBhYWNEZWNvZGVyX0VzdGltYXRlTnVtYmVyT2ZMb3N0RnJhbWVzKEhBTkRMRV9BQUNERUNPREVSIHNlbGYpCi17CitzdGF0aWMgSU5UIGFhY0RlY29kZXJfRXN0aW1hdGVOdW1iZXJPZkxvc3RGcmFtZXMoSEFORExFX0FBQ0RFQ09ERVIgc2VsZikgewogICBJTlQgbjsKIAotICB0cmFuc3BvcnREZWNfR2V0TWlzc2luZ0FjY2Vzc1VuaXRDb3VudCggJm4sIHNlbGYtPmhJbnB1dCk7CisgIHRyYW5zcG9ydERlY19HZXRNaXNzaW5nQWNjZXNzVW5pdENvdW50KCZuLCBzZWxmLT5oSW5wdXQpOwogCiAgIHJldHVybiBuOwogfQogCi1MSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgKLSAgICAgICAgSEFORExFX0FBQ0RFQ09ERVIgIHNlbGYsCi0gICAgICAgIElOVF9QQ00gICAgICAgICAgICpwVGltZURhdGFfZXh0ZXJuLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgdGltZURhdGFTaXplX2V4dGVybiwKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgIGZsYWdzKQotewotICAgIEFBQ19ERUNPREVSX0VSUk9SIEVycm9yU3RhdHVzOwotICAgIGludCBmVHBJbnRlcnJ1cHRpb24gPSAwOyAgLyogVHJhbnNwb3J0IG9yaWdpbmF0ZWQgaW50ZXJydXB0aW9uIGRldGVjdGlvbi4gKi8KLSAgICBpbnQgZlRwQ29uY2VhbCA9IDA7ICAgICAgIC8qIFRyYW5zcG9ydCBvcmlnaW5hdGVkIGNvbmNlYWxtZW50LiAqLworTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SCithYWNEZWNvZGVyX0RlY29kZUZyYW1lKEhBTkRMRV9BQUNERUNPREVSIHNlbGYsIElOVF9QQ00gKnBUaW1lRGF0YV9leHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB0aW1lRGF0YVNpemVfZXh0ZXJuLCBjb25zdCBVSU5UIGZsYWdzKSB7CisgIEFBQ19ERUNPREVSX0VSUk9SIEVycm9yU3RhdHVzOworICBJTlQgbGF5ZXI7CisgIElOVCBuQml0czsKKyAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzOworICBpbnQgZlRwSW50ZXJydXB0aW9uID0gMDsgLyogVHJhbnNwb3J0IG9yaWdpbmF0ZWQgaW50ZXJydXB0aW9uIGRldGVjdGlvbi4gKi8KKyAgaW50IGZUcENvbmNlYWwgPSAwOyAgICAgIC8qIFRyYW5zcG9ydCBvcmlnaW5hdGVkIGNvbmNlYWxtZW50LiAqLworICBJTlRfUENNICpwVGltZURhdGEgPSBOVUxMOworICBJTlQgdGltZURhdGFTaXplID0gMDsKKyAgVUlOVCBhY2Nlc3NVbml0ID0gMDsKKyAgVUlOVCBudW1BY2Nlc3NVbml0cyA9IDE7CisgIFVJTlQgbnVtUHJlcm9sbEFVID0gMDsKKyAgaW50IGZFbmRBdU5vdEFkanVzdGVkID0gMDsgIC8qIFRoZSBlbmQgb2YgdGhlIGFjY2VzcyB1bml0IHdhcyBub3QgYWRqdXN0ZWQgKi8KKyAgaW50IGFwcGx5Q3Jvc3NmYWRlID0gMTsgICAgIC8qIGZsYWcgaW5kaWNhdGVzIGlmIGZsdXNoaW5nIHdhcyBwb3NzaWJsZSAqLworICBGSVhQX1BDTSAqcFRpbWVEYXRhRml4cFBjbTsgLyogU2lnbmFsIGJ1ZmZlciBmb3IgZGVjb2RpbmcgcHJvY2VzcyBiZWZvcmUgUENNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nICovCisgIElOVCB0aW1lRGF0YUZpeHBQY21TaXplOworICBQQ01fREVDICpwVGltZURhdGFQY21Qb3N0OyAvKiBTaWduYWwgYnVmZmVyIGZvciBQQ00gcG9zdC1wcm9jZXNzaW5nICovCisgIElOVCB0aW1lRGF0YVBjbVBvc3RTaXplOwogCi0gICAgaWYgKHNlbGYgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKKyAgfQorCisgIHBUaW1lRGF0YSA9IHNlbGYtPnBjbU91dHB1dEJ1ZmZlcjsKKyAgdGltZURhdGFTaXplID0gc2l6ZW9mKHNlbGYtPnBjbU91dHB1dEJ1ZmZlcikgLyBzaXplb2YoKnNlbGYtPnBjbU91dHB1dEJ1ZmZlcik7CisKKyAgaWYgKGZsYWdzICYgQUFDREVDX0lOVFIpIHsKKyAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUxvc3RBY2Nlc3NVbml0cyA9IDA7CisgIH0KKyAgaEJzID0gdHJhbnNwb3J0RGVjX0dldEJpdHN0cmVhbShzZWxmLT5oSW5wdXQsIDApOworCisgIC8qIEdldCBjdXJyZW50IGJpdHMgcG9zaXRpb24gZm9yIGJpdHJhdGUgY2FsY3VsYXRpb24uICovCisgIG5CaXRzID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisKKyAgaWYgKGZsYWdzICYgQUFDREVDX0NMUkhJU1QpIHsKKyAgICBpZiAoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19VU0FDKSB7CisgICAgICAvKiAxKSBzdG9yZSBBdWRpb1NwZWNpZmljQ29uZmlnIGFsd2F5cyBpbiBBdWRpb1NwZWNpZmljQ29uZmlnX1BhcnNlKCkgKi8KKyAgICAgIC8qIDIpIGZyZWUgbWVtb3J5IG9mIGR5bmFtaWMgYWxsb2NhdGVkIGRhdGEgKi8KKyAgICAgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyBhc2M7CisgICAgICB0cmFuc3BvcnREZWNfR2V0QXNjKHNlbGYtPmhJbnB1dCwgMCwgJmFzYyk7CisgICAgICBhYWNEZWNvZGVyX0ZyZWVNZW1DYWxsYmFjayhzZWxmLCAmYXNjKTsKKyAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMgPSAwOworICAgICAgLyogMykgcmVzdG9yZSBBdWRpb1NwZWNpZmljQ29uZmlnICovCisgICAgICB0cmFuc3BvcnREZWNfT3V0T2ZCYW5kQ29uZmlnKHNlbGYtPmhJbnB1dCwgYXNjLmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFzYy5jb25maWdCaXRzICsgNykgPj4gMywgMCk7CiAgICAgfQotICAgIElOVCBpbnRlcmxlYXZlZCA9IHNlbGYtPm91dHB1dEludGVybGVhdmVkOwotICAgIElOVF9QQ00gKnBUaW1lRGF0YSA9IHNlbGYtPnBjbU91dHB1dEJ1ZmZlcjsKLSAgICBJTlQgdGltZURhdGFTaXplID0gc2l6ZW9mKHNlbGYtPnBjbU91dHB1dEJ1ZmZlcikvc2l6ZW9mKCpzZWxmLT5wY21PdXRwdXRCdWZmZXIpOworICB9CiAKLSAgICBpZiAoZmxhZ3MgJiBBQUNERUNfSU5UUikgewotICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1Mb3N0QWNjZXNzVW5pdHMgPSAwOwotICAgIH0KKyAgaWYgKCEoKGZsYWdzICYgKEFBQ0RFQ19DT05DRUFMIHwgQUFDREVDX0ZMVVNIKSkgfHwKKyAgICAgICAgKHNlbGYtPmZsdXNoU3RhdHVzID09IEFBQ0RFQ19SU1Y2MF9EQVNIX0lQRl9BVFNDX0ZMVVNIX09OKSB8fAorICAgICAgICAoc2VsZi0+Zmx1c2hTdGF0dXMgPT0gQUFDREVDX1VTQUNfREFTSF9JUEZfRkxVU0hfT04pIHx8CisgICAgICAgIChzZWxmLT5idWlsZFVwU3RhdHVzID09IEFBQ0RFQ19SU1Y2MF9CVUlMRF9VUF9JRExFX0lOX0JBTkQpKSkgeworICAgIFRSQU5TUE9SVERFQ19FUlJPUiBlcnI7CiAKLSAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSB0cmFuc3BvcnREZWNfR2V0Qml0c3RyZWFtKHNlbGYtPmhJbnB1dCwgMCk7Ci0KLSAgICAvKiBHZXQgY3VycmVudCBiaXRzIHBvc2l0aW9uIGZvciBiaXRyYXRlIGNhbGN1bGF0aW9uLiAqLwotICAgIElOVCBuQml0cyA9IEZES2dldFZhbGlkQml0cyhoQnMpOwotICAgIGlmICghIChmbGFncyAmIChBQUNERUNfQ09OQ0VBTCB8IEFBQ0RFQ19GTFVTSCkgKSApCi0gICAgewotICAgICAgVFJBTlNQT1JUREVDX0VSUk9SIGVycjsKLQotICAgICAgZm9yKElOVCBsYXllciA9IDA7IGxheWVyIDwgc2VsZi0+bnJPZkxheWVyczsgbGF5ZXIrKykKLSAgICAgIHsKLSAgICAgICAgZXJyID0gdHJhbnNwb3J0RGVjX1JlYWRBY2Nlc3NVbml0KHNlbGYtPmhJbnB1dCwgbGF5ZXIpOwotICAgICAgICBpZiAoZXJyICE9IFRSQU5TUE9SVERFQ19PSykgewotICAgICAgICAgIHN3aXRjaCAoZXJyKSB7CisgICAgZm9yIChsYXllciA9IDA7IGxheWVyIDwgc2VsZi0+bnJPZkxheWVyczsgbGF5ZXIrKykgeworICAgICAgZXJyID0gdHJhbnNwb3J0RGVjX1JlYWRBY2Nlc3NVbml0KHNlbGYtPmhJbnB1dCwgbGF5ZXIpOworICAgICAgaWYgKGVyciAhPSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICAgICAgc3dpdGNoIChlcnIpIHsKICAgICAgICAgICBjYXNlIFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFM6CiAgICAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfTk9UX0VOT1VHSF9CSVRTOwogICAgICAgICAgICAgZ290byBiYWlsOwogICAgICAgICAgIGNhc2UgVFJBTlNQT1JUREVDX1NZTkNfRVJST1I6Ci0gICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUxvc3RBY2Nlc3NVbml0cyA9IGFhY0RlY29kZXJfRXN0aW1hdGVOdW1iZXJPZkxvc3RGcmFtZXMoc2VsZik7CisgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUxvc3RBY2Nlc3NVbml0cyA9CisgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9Fc3RpbWF0ZU51bWJlck9mTG9zdEZyYW1lcyhzZWxmKTsKICAgICAgICAgICAgIGZUcEludGVycnVwdGlvbiA9IDE7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBjYXNlIFRSQU5TUE9SVERFQ19ORUVEX1RPX1JFU1RBUlQ6CkBAIC04MzEsMjU4ICsxMTc5LDc3NCBAQAogICAgICAgICAgIGNhc2UgVFJBTlNQT1JUREVDX0NSQ19FUlJPUjoKICAgICAgICAgICAgIGZUcENvbmNlYWwgPSAxOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOgorICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1VOS05PV047CiAgICAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChzZWxmLT5zdHJlYW1JbmZvLm51bUxvc3RBY2Nlc3NVbml0cyA+IDApIHsKLSAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1Mb3N0QWNjZXNzVW5pdHMtLTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHNlbGYtPnN0cmVhbUluZm8ubnVtTG9zdEFjY2Vzc1VuaXRzID4gMCkgeworICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1Mb3N0QWNjZXNzVW5pdHMtLTsKKyAgICB9CisgIH0KKworICBzZWxmLT5mcmFtZU9LID0gMTsKKworICBVSU5UIHByZXJvbGxBVU9mZnNldFtBQUNERUNfTUFYX05VTV9QUkVST0xMX0FVXTsKKyAgVUlOVCBwcmVyb2xsQVVMZW5ndGhbQUFDREVDX01BWF9OVU1fUFJFUk9MTF9BVV07CisgIGZvciAoaW50IGkgPSAwOyBpIDwgQUFDREVDX01BWF9OVU1fUFJFUk9MTF9BVSArIDE7IGkrKykKKyAgICBzZWxmLT5wcmVyb2xsQVVMZW5ndGhbaV0gPSAwOworCisgIElOVCBhdVN0YXJ0QW5jaG9yOworICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnNBdTsKKworICAvKiBQcm9jZXNzIHByZXJvbGwgZnJhbWVzIGFuZCBjdXJyZW50IGZyYW1lICovCisgIGRvIHsKKyAgICBpZiAoIShmbGFncyAmIChBQUNERUNfQ09OQ0VBTCB8IEFBQ0RFQ19GTFVTSCkpICYmCisgICAgICAgIChzZWxmLT5mbHVzaFN0YXR1cyAhPSBBQUNERUNfUlNWNjBfQ0ZHX0NIQU5HRV9BVFNDX0ZMVVNIX09OKSAmJgorICAgICAgICAoYWNjZXNzVW5pdCA9PSAwKSAmJgorICAgICAgICAoc2VsZi0+aGFzQXVkaW9QcmVSb2xsIHx8CisgICAgICAgICAoc2VsZi0+YnVpbGRVcFN0YXR1cyA9PSBBQUNERUNfUlNWNjBfQlVJTERfVVBfSURMRV9JTl9CQU5EKSkgJiYKKyAgICAgICAgIWZUcEludGVycnVwdGlvbiAmJgorICAgICAgICAhZlRwQ29uY2VhbCAvKiBCaXQgc3RyZWFtIHBvaW50ZXIgbmVlZHMgdG8gYmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhCisgICAgICAgICAgICAgICAgICAgICAgICh2YWxpZCkgQVUuICovCisgICAgKSB7CisgICAgICBFcnJvclN0YXR1cyA9IENBYWNEZWNvZGVyX1ByZVJvbGxFeHRlbnNpb25QYXlsb2FkUGFyc2UoCisgICAgICAgICAgc2VsZiwgJm51bVByZXJvbGxBVSwgcHJlcm9sbEFVT2Zmc2V0LCBwcmVyb2xsQVVMZW5ndGgpOworCisgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19PSykgeworICAgICAgICBzd2l0Y2ggKEVycm9yU3RhdHVzKSB7CisgICAgICAgICAgY2FzZSBBQUNfREVDX05PVF9FTk9VR0hfQklUUzoKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICBjYXNlIEFBQ19ERUNfUEFSU0VfRVJST1I6CisgICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgfQorCisgICAgICBudW1BY2Nlc3NVbml0cyArPSBudW1QcmVyb2xsQVU7CisgICAgfQorCisgICAgaEJzQXUgPSB0cmFuc3BvcnREZWNfR2V0Qml0c3RyZWFtKHNlbGYtPmhJbnB1dCwgMCk7CisgICAgYXVTdGFydEFuY2hvciA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCc0F1KTsKKworICAgIHNlbGYtPmFjY2Vzc1VuaXQgPSBhY2Nlc3NVbml0OworICAgIGlmIChhY2Nlc3NVbml0IDwgbnVtUHJlcm9sbEFVKSB7CisgICAgICBGREtwdXNoRm9yKGhCc0F1LCBwcmVyb2xsQVVPZmZzZXRbYWNjZXNzVW5pdF0pOwogICAgIH0KIAogICAgIC8qIFNpZ25hbCBiaXQgc3RyZWFtIGludGVycnVwdGlvbiB0byBvdGhlciBtb2R1bGVzIGlmIHJlcXVpcmVkLiAqLwotICAgIGlmICggZlRwSW50ZXJydXB0aW9uIHx8IChmbGFncyAmIChBQUNERUNfSU5UUnxBQUNERUNfQ0xSSElTVCkpICkKLSAgICB7Ci0gICAgICBzYnJEZWNvZGVyX1NldFBhcmFtKHNlbGYtPmhTYnJEZWNvZGVyLCBTQlJfQ0xFQVJfSElTVE9SWSwgKGZsYWdzJkFBQ0RFQ19DTFJISVNUKSk7CisgICAgaWYgKGZUcEludGVycnVwdGlvbiB8fCAoZmxhZ3MgJiBBQUNERUNfSU5UUikpIHsKICAgICAgIGFhY0RlY29kZXJfU2lnbmFsSW50ZXJydXB0aW9uKHNlbGYpOwotICAgICAgaWYgKCAhIChmbGFncyAmIEFBQ0RFQ19JTlRSKSApIHsKKyAgICAgIGlmICghKGZsYWdzICYgQUFDREVDX0lOVFIpKSB7CiAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19UUkFOU1BPUlRfU1lOQ19FUlJPUjsKICAgICAgICAgZ290byBiYWlsOwogICAgICAgfQogICAgIH0KIAotICAgIC8qIEVtcHR5IGJpdCBidWZmZXIgaW4gY2FzZSBvZiBmbHVzaCByZXF1ZXN0LiAqLwotICAgIGlmIChmbGFncyAmIEFBQ0RFQ19GTFVTSCkKLSAgICB7Ci0gICAgICB0cmFuc3BvcnREZWNfU2V0UGFyYW0oc2VsZi0+aElucHV0LCBUUERFQ19QQVJBTV9SRVNFVCwgMSk7Ci0gICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUxvc3RBY2Nlc3NVbml0cyA9IDA7Ci0gICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUJhZEJ5dGVzID0gMDsKLSAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtVG90YWxCeXRlcyA9IDA7CisgICAgLyogQ2xlYXJpbmcgY29yZSBkYXRhIHdpbGwgYmUgZG9uZSBpbiBDQWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgpIGJlbG93LgorICAgICAgIFRlbGwgb3RoZXIgbW9kdWxlcyB0byBjbGVhciBzdGF0ZXMgaWYgcmVxdWlyZWQuICovCisgICAgaWYgKGZsYWdzICYgQUFDREVDX0NMUkhJU1QpIHsKKyAgICAgIGlmICghKHNlbGYtPmZsYWdzWzBdICYgQUNfVVNBQykpIHsKKyAgICAgICAgc2JyRGVjb2Rlcl9TZXRQYXJhbShzZWxmLT5oU2JyRGVjb2RlciwgU0JSX0NMRUFSX0hJU1RPUlksIDEpOworICAgICAgICBtcGVnU3Vycm91bmREZWNvZGVyX1NldFBhcmFtKAorICAgICAgICAgICAgKENNcGVnU3Vycm91bmREZWNvZGVyICopc2VsZi0+cE1wZWdTdXJyb3VuZERlY29kZXIsCisgICAgICAgICAgICBTQUNERUNfQ0xFQVJfSElTVE9SWSwgMSk7CisgICAgICAgIGlmIChGREtfUW1mRG9tYWluX0NsZWFyUGVyc2lzdGVudE1lbW9yeSgmc2VsZi0+cW1mRG9tYWluKSAhPSAwKSB7CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1VOS05PV047CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICB9CiAgICAgfQotICAgIC8qIFJlc2V0IHRoZSBvdXRwdXQgZGVsYXkgZmllbGQuIFRoZSBtb2R1bGVzIHdpbGwgYWRkIHRoZWlyIGZpZ3VyZXMgb25lIGFmdGVyIGFub3RoZXIuICovCisKKyAgICAvKiBFbXB0eSBiaXQgYnVmZmVyIGluIGNhc2Ugb2YgZmx1c2ggcmVxdWVzdC4gKi8KKyAgICBpZiAoZmxhZ3MgJiBBQUNERUNfRkxVU0ggJiYgIShmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSkgeworICAgICAgaWYgKCFzZWxmLT5mbHVzaFN0YXR1cykgeworICAgICAgICB0cmFuc3BvcnREZWNfU2V0UGFyYW0oc2VsZi0+aElucHV0LCBUUERFQ19QQVJBTV9SRVNFVCwgMSk7CisgICAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtTG9zdEFjY2Vzc1VuaXRzID0gMDsKKyAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1CYWRCeXRlcyA9IDA7CisgICAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtVG90YWxCeXRlcyA9IDA7CisgICAgICB9CisgICAgfQorICAgIC8qIFJlc2V0IHRoZSBvdXRwdXQgZGVsYXkgZmllbGQuIFRoZSBtb2R1bGVzIHdpbGwgYWRkIHRoZWlyIGZpZ3VyZXMgb25lCisgICAgICogYWZ0ZXIgYW5vdGhlci4gKi8KICAgICBzZWxmLT5zdHJlYW1JbmZvLm91dHB1dERlbGF5ID0gMDsKIAotICAgIGlmIChzZWxmLT5saW1pdGVyRW5hYmxlVXNlcj09KFVDSEFSKS0xKSB7Ci0gICAgICAvKiBFbmJhbGUgbGltaXRlciBmb3IgYWxsIG5vbi1sb3dkZWxheSBBT1Qncy4gKi8KLSAgICAgIHNlbGYtPmxpbWl0ZXJFbmFibGVDdXJyID0gKCBzZWxmLT5mbGFncyAmIChBQ19MRHxBQ19FTEQpICkgPyAwIDogMTsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgaWYgKHNlbGYtPmxpbWl0ZXJFbmFibGVVc2VyID09IChVQ0hBUiktMikgeworICAgICAgLyogRW5hYmxlIGxpbWl0ZXIgb25seSBmb3IgUlNWRDYwLiAqLworICAgICAgc2VsZi0+bGltaXRlckVuYWJsZUN1cnIgPSAoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19SU1Y2MDNEQSkgPyAxIDogMDsKKyAgICB9IGVsc2UgaWYgKHNlbGYtPmxpbWl0ZXJFbmFibGVVc2VyID09IChVQ0hBUiktMSkgeworICAgICAgLyogRW5hYmxlIGxpbWl0ZXIgZm9yIGFsbCBub24tbG93ZGVsYXkgQU9UJ3MuICovCisgICAgICBzZWxmLT5saW1pdGVyRW5hYmxlQ3VyciA9IChzZWxmLT5mbGFnc1swXSAmIChBQ19MRCB8IEFDX0VMRCkpID8gMCA6IDE7CisgICAgfSBlbHNlIHsKICAgICAgIC8qIFVzZSBsaW1pdGVyIGNvbmZpZ3VyYXRpb24gYXMgcmVxdWVzdGVkLiAqLwogICAgICAgc2VsZi0+bGltaXRlckVuYWJsZUN1cnIgPSBzZWxmLT5saW1pdGVyRW5hYmxlVXNlcjsKICAgICB9CiAgICAgLyogcmVzZXQgbGltaXRlciBnYWluIG9uIGEgcGVyIGZyYW1lIGJhc2lzICovCi0gICAgc2VsZi0+ZXh0R2FpblswXSA9IEZMMkZYQ09OU1RfREJMKDEuMGYvKGZsb2F0KSgxPDxURExfR0FJTl9TQ0FMSU5HKSk7CisgICAgc2VsZi0+ZXh0R2FpblswXSA9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgVERMX0dBSU5fU0NBTElORykpOwogCisgICAgcFRpbWVEYXRhRml4cFBjbSA9IHBUaW1lRGF0YTsKKyAgICB0aW1lRGF0YUZpeHBQY21TaXplID0gdGltZURhdGFTaXplOwogCi0gICAgRXJyb3JTdGF0dXMgPSBDQWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfCAoZlRwQ29uY2VhbCA/IEFBQ0RFQ19DT05DRUFMIDogMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lRGF0YVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmxlYXZlZCk7CisgICAgRXJyb3JTdGF0dXMgPSBDQWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSgKKyAgICAgICAgc2VsZiwKKyAgICAgICAgZmxhZ3MgfCAoZlRwQ29uY2VhbCA/IEFBQ0RFQ19DT05DRUFMIDogMCkgfAorICAgICAgICAgICAgKChzZWxmLT5mbHVzaFN0YXR1cyAmJiAhKGZsYWdzICYgQUFDREVDX0NPTkNFQUwpKSA/IEFBQ0RFQ19GTFVTSAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDApLAorICAgICAgICBwVGltZURhdGFGaXhwUGNtICsgMCwgdGltZURhdGFGaXhwUGNtU2l6ZSwKKyAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgKyAwKTsKIAotICAgIGlmICghKGZsYWdzICYgKEFBQ0RFQ19DT05DRUFMfEFBQ0RFQ19GTFVTSCkpKSB7Ci0gICAgICBUUkFOU1BPUlRERUNfRVJST1IgdHBFcnI7Ci0gICAgICB0cEVyciA9IHRyYW5zcG9ydERlY19FbmRBY2Nlc3NVbml0KHNlbGYtPmhJbnB1dCk7Ci0gICAgICBpZiAodHBFcnIgIT0gVFJBTlNQT1JUREVDX09LKSB7Ci0gICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIElmIHRoZSBjdXJyZW50IHBUaW1lRGF0YSBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgc2lnbmFsLCB0aGVyZSBub3RoaW5nIGVsc2Ugd2UgY2FuIGRvLCBzbyBiYWlsLiAqLwotICAgIGlmICggISBJU19PVVRQVVRfVkFMSUQoRXJyb3JTdGF0dXMpICkgewotICAgICAgZ290byBiYWlsOwotICAgIH0KLQorICAgIC8qIGlmIGZsdXNoaW5nIGZvciBVU0FDIERBU0ggSVBGIHdhcyBub3QgcG9zc2libGUgZ28gb24gd2l0aCBkZWNvZGluZworICAgICAqIHByZXJvbGwgKi8KKyAgICBpZiAoKHNlbGYtPmZsYWdzWzBdICYgQUNfVVNBQykgJiYKKyAgICAgICAgKHNlbGYtPmZsdXNoU3RhdHVzID09IEFBQ0RFQ19VU0FDX0RBU0hfSVBGX0ZMVVNIX09OKSAmJgorICAgICAgICAhKGZsYWdzICYgQUFDREVDX0NPTkNFQUwpICYmIChFcnJvclN0YXR1cyAhPSBBQUNfREVDX09LKSkgeworICAgICAgYXBwbHlDcm9zc2ZhZGUgPSAwOworICAgIH0gZWxzZSAvKiBVU0FDIERBU0ggSVBGIGZsdXNoaW5nIHBvc3NpYmxlIGJlZ2luICovCiAgICAgewotICAgICAgLyogRXhwb3J0IGRhdGEgaW50byBzdHJlYW1pbmZvIHN0cnVjdHVyZSAqLwotICAgICAgc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlID0gc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVSYXRlOwotICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgID0gc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWU7Ci0gICAgfQotICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMgPSBzZWxmLT5zdHJlYW1JbmZvLmFhY051bUNoYW5uZWxzOwotCi0KLQotICAgIENBYWNEZWNvZGVyX1N5bmNRbWZNb2RlKHNlbGYpOwotCi0vKiBzYnIgZGVjb2RlciAqLwotCi0gICAgaWYgKEVycm9yU3RhdHVzIHx8IChmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSB8fCBzZWxmLT5wQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvWzBdLT5jb25jZWFsbWVudEluZm8uY29uY2VhbFN0YXRlID4gQ29uY2VhbFN0YXRlX0ZhZGVJbikKLSAgICB7Ci0gICAgICBzZWxmLT5mcmFtZU9LID0gMDsgIC8qIGlmIGFuIGVycm9yIGhhcyBvY2N1cmVkIGRvIGNvbmNlYWxtZW50IGluIHRoZSBTQlIgZGVjb2RlciB0b28gKi8KLSAgICB9Ci0KLSAgICBpZiAoc2VsZi0+c2JyRW5hYmxlZCkKLSAgICB7Ci0gICAgICBTQlJfRVJST1Igc2JyRXJyb3IgPSBTQlJERUNfT0s7Ci0gICAgICBpbnQgY2hJZHgsIG51bUNvcmVDaGFubmVsID0gc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVsczsKLSAgICAgIGludCBjaE91dE1hcElkeCA9ICgoc2VsZi0+Y2hNYXBJbmRleD09MCkgJiYgKG51bUNvcmVDaGFubmVsPDcpKSA/IG51bUNvcmVDaGFubmVsIDogc2VsZi0+Y2hNYXBJbmRleDsKLQotICAgICAgLyogc2V0IHBhcmFtcyAqLwotICAgICAgc2JyRGVjb2Rlcl9TZXRQYXJhbSAoIHNlbGYtPmhTYnJEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9TWVNURU1fQklUU1RSRUFNX0RFTEFZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnNiclBhcmFtcy5ic0RlbGF5KTsKLSAgICAgIHNickRlY29kZXJfU2V0UGFyYW0gKCBzZWxmLT5oU2JyRGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfRkxVU0hfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBBQUNERUNfRkxVU0gpICk7Ci0KLSAgICAgIGlmICggc2VsZi0+c3RyZWFtSW5mby5hb3QgPT0gQU9UX0VSX0FBQ19FTEQgKSB7Ci0gICAgICAgIC8qIENvbmZpZ3VyZSBRTUYgKi8KLSAgICAgICAgc2JyRGVjb2Rlcl9TZXRQYXJhbSAoIHNlbGYtPmhTYnJEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0xEX1FNRl9USU1FX0FMSUdOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYtPmZsYWdzICYgQUNfTERfTVBTKSA/IDEgOiAwICk7Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgUENNRE1YX0VSUk9SIGRteEVycjsKLSAgICAgICAgSU5UICBtYXhPdXRDaCA9IDA7Ci0KLSAgICAgICAgZG14RXJyID0gcGNtRG14X0dldFBhcmFtKHNlbGYtPmhQY21VdGlscywgTUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMsICZtYXhPdXRDaCk7Ci0gICAgICAgIGlmICggKGRteEVyciA9PSBQQ01ETVhfT0spICYmIChtYXhPdXRDaCA9PSAxKSApIHsKLSAgICAgICAgICAvKiBEaXNhYmxlIFBTIHByb2Nlc3NpbmcgaWYgd2UgaGF2ZSB0byBjcmVhdGUgYSBtb25vIG91dHB1dCBzaWduYWwuICovCi0gICAgICAgICAgc2VsZi0+cHNQb3NzaWJsZSA9IDA7CisgICAgICBpZiAoISgoZmxhZ3MgJiAoQUFDREVDX0NPTkNFQUwgfCBBQUNERUNfRkxVU0gpKSB8fCBmVHBDb25jZWFsIHx8CisgICAgICAgICAgICBzZWxmLT5mbHVzaFN0YXR1cykgJiYKKyAgICAgICAgICAoIShJU19PVVRQVVRfVkFMSUQoRXJyb3JTdGF0dXMpKSB8fCAhKGFjY2Vzc1VuaXQgPCBudW1QcmVyb2xsQVUpKSkgeworICAgICAgICBUUkFOU1BPUlRERUNfRVJST1IgdHBFcnI7CisgICAgICAgIHRwRXJyID0gdHJhbnNwb3J0RGVjX0VuZEFjY2Vzc1VuaXQoc2VsZi0+aElucHV0KTsKKyAgICAgICAgaWYgKHRwRXJyICE9IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgICAgIHNlbGYtPmZyYW1lT0sgPSAwOworICAgICAgICB9CisgICAgICB9IGVsc2UgeyAvKiB3aGlsZSBwcmVyb2xsIHByb2Nlc3NpbmcgbGF0ZXIgcG9zc2libHkgYW4gZXJyb3IgaW4gdGhlCisgICAgICAgICAgICAgICAgICByZW5kZXJlciBwYXJ0IG9jY3VycnMgKi8KKyAgICAgICAgaWYgKElTX09VVFBVVF9WQUxJRChFcnJvclN0YXR1cykpIHsKKyAgICAgICAgICBmRW5kQXVOb3RBZGp1c3RlZCA9IDE7CiAgICAgICAgIH0KICAgICAgIH0KIAorICAgICAgLyogSWYgdGhlIGN1cnJlbnQgcFRpbWVEYXRhRml4cFBjbSBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgc2lnbmFsLCB0aGVyZQorICAgICAgICogbm90aGluZyBlbHNlIHdlIGNhbiBkbywgc28gYmFpbC4gKi8KKyAgICAgIGlmICghSVNfT1VUUFVUX1ZBTElEKEVycm9yU3RhdHVzKSkgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CiAKLSAgICAgIC8qIGFwcGx5IFNCUiBwcm9jZXNzaW5nICovCi0gICAgICBzYnJFcnJvciA9IHNickRlY29kZXJfQXBwbHkgKCBzZWxmLT5oU2JyRGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5zdHJlYW1JbmZvLnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5jaGFubmVsT3V0cHV0TWFwcGluZ1tjaE91dE1hcElkeF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmxlYXZlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZyYW1lT0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5wc1Bvc3NpYmxlKTsKKyAgICAgIHsKKyAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlID0gc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVSYXRlOworICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lOworICAgICAgfQogCisgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzID0gc2VsZi0+c3RyZWFtSW5mby5hYWNOdW1DaGFubmVsczsKIAotICAgICBpZiAoc2JyRXJyb3IgPT0gU0JSREVDX09LKSB7Ci0gICAgICAgI2RlZmluZSBVUFNfU0NBTEUgIDIgIC8qIE1heGltdW0gdXBzYW1wbGluZyBmYWN0b3IgaXMgNCAoQ0VMUCtTQlIpICovCi0gICAgICAgRklYUF9EQkwgIHVwc2FtcGxlRmFjdG9yID0gRkwyRlhDT05TVF9EQkwoMS4wZi8oMTw8VVBTX1NDQUxFKSk7CisgICAgICB7CisgICAgICAgIEZES19EZWxheV9BcHBseSgmc2VsZi0+dXNhY1Jlc2lkdWFsRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICBwVGltZURhdGFGaXhwUGNtICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICogKHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lICsgMCkgKyAwLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUsIDApOworICAgICAgfQogCi0gICAgICAgLyogVXBkYXRlIGRhdGEgaW4gc3RyZWFtaW5mbyBzdHJ1Y3R1cmUuIEFzc3VtZSB0aGF0IHRoZSBTQlIgdXBzYW1wbGluZyBmYWN0b3IgaXMgZWl0aGVyIDEgb3IgMiAqLwotICAgICAgIHNlbGYtPmZsYWdzIHw9IEFDX1NCUl9QUkVTRU5UOwotICAgICAgIGlmIChzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGUgIT0gc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlKSB7Ci0gICAgICAgICBpZiAoc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgPT0gNzY4KSB7Ci0gICAgICAgICAgIHVwc2FtcGxlRmFjdG9yID0gRkwyRlhDT05TVF9EQkwoOC4wZi8oMzw8VVBTX1NDQUxFKSk7Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgICAgICB1cHNhbXBsZUZhY3RvciA9IEZMMkZYQ09OU1RfREJMKDIuMGYvKDE8PFVQU19TQ0FMRSkpOwotICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICAvKiBBcHBseSB1cHNhbXBsaW5nIGZhY3RvciB0byBib3RoIHRoZSBjb3JlIGZyYW1lIGxlbmd0aCBhbmQgdGhlIGNvcmUgZGVsYXkgKi8KLSAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSAgICA9ICAgICAgIChJTlQpZk11bHQoKEZJWFBfREJMKXNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lPDxVUFNfU0NBTEUsIHVwc2FtcGxlRmFjdG9yKTsKLSAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm91dHB1dERlbGF5ICA9IChVSU5UKShJTlQpZk11bHQoKEZJWFBfREJMKXNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXk8PFVQU19TQ0FMRSwgdXBzYW1wbGVGYWN0b3IpOwotICAgICAgIHNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXkgKz0gc2JyRGVjb2Rlcl9HZXREZWxheSggc2VsZi0+aFNickRlY29kZXIgKTsKKyAgICAgIC8qIFNldHRpbmcgb2YgaW50ZXJuYWwgTVBTIHN0YXRlOyBtYXkgYmUgcmVzZXQgaW4gQ0FhY0RlY29kZXJfU3luY1FtZk1vZGUKKyAgICAgICAgIGlmIGRlY29kZXIgaXMgdW5hYmxlIHRvIGRlY29kZSB3aXRoIHVzZXIgZGVmaW5lZCBxbWZNb2RlICovCisgICAgICBpZiAoIShzZWxmLT5mbGFnc1swXSAmIChBQ19VU0FDIHwgQUNfUlNWRDUwIHwgQUNfUlNWNjAzREEgfCBBQ19FTEQpKSkgeworICAgICAgICBzZWxmLT5tcHNFbmFibGVDdXJyID0KKyAgICAgICAgICAgIChzZWxmLT5tcHNFbmFibGVVc2VyICYmCisgICAgICAgICAgICAgaXNTdXBwb3J0ZWRNcHNDb25maWcoc2VsZi0+c3RyZWFtSW5mby5hb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19NUFNfUFJFU0VOVCkgPyAxIDogMCkpOworICAgICAgfQogCi0gICAgICAgaWYgKHNlbGYtPnBzUG9zc2libGUpIHsKLSAgICAgICAgIHNlbGYtPmZsYWdzIHw9IEFDX1BTX1BSRVNFTlQ7Ci0gICAgICAgfQotICAgICAgIGZvciAoY2hJZHggPSBudW1Db3JlQ2hhbm5lbDsgY2hJZHggPCBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzOyBjaElkeCs9MSkgewotICAgICAgICAgc2VsZi0+Y2hhbm5lbFR5cGVbY2hJZHhdID0gQUNUX0ZST05UOwotICAgICAgICAgc2VsZi0+Y2hhbm5lbEluZGljZXNbY2hJZHhdID0gY2hJZHg7Ci0gICAgICAgfQotICAgICB9Ci0gICB9CisgICAgICBpZiAoIXNlbGYtPnFtZkRvbWFpbi5nbG9iYWxDb25mLnFtZkRvbWFpbkV4cGxpY2l0Q29uZmlnICYmCisgICAgICAgICAgc2VsZi0+bXBzRW5hYmxlQ3VycikgeworICAgICAgICAvKiBpZiBub3QgZG9uZSB5ZXQsIGFsbG9jYXRlIGZ1bGwgTVBFRyBTdXJyb3VuZCBkZWNvZGVyIGluc3RhbmNlICovCisgICAgICAgIGlmIChtcGVnU3Vycm91bmREZWNvZGVyX0lzRnVsbE1wZWdTdXJyb3VuZERlY29kZXJJbnN0YW5jZUF2YWlsYWJsZSgKKyAgICAgICAgICAgICAgICAoQ01wZWdTdXJyb3VuZERlY29kZXIgKilzZWxmLT5wTXBlZ1N1cnJvdW5kRGVjb2RlcikgPT0KKyAgICAgICAgICAgIFNBQ19JTlNUQU5DRV9OT1RfRlVMTF9BVkFJTEFCTEUpIHsKKyAgICAgICAgICBpZiAobXBlZ1N1cnJvdW5kRGVjb2Rlcl9PcGVuKAorICAgICAgICAgICAgICAgICAgKENNcGVnU3Vycm91bmREZWNvZGVyICoqKSZzZWxmLT5wTXBlZ1N1cnJvdW5kRGVjb2RlciwgLTEsCisgICAgICAgICAgICAgICAgICAmc2VsZi0+cW1mRG9tYWluKSkgeworICAgICAgICAgICAgcmV0dXJuIEFBQ19ERUNfT1VUX09GX01FTU9SWTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KIAorICAgICAgQ0FhY0RlY29kZXJfU3luY1FtZk1vZGUoc2VsZik7CiAKLSAgICB7Ci0gICAgSU5UIHBjbUxpbWl0ZXJTY2FsZSA9IDA7Ci0gICAgUENNRE1YX0VSUk9SIGRteEVyciA9IFBDTURNWF9PSzsKLSAgICBpZiAoIGZsYWdzICYgKEFBQ0RFQ19JTlRSIHwgQUFDREVDX0NMUkhJU1QpICkgewotICAgICAgLyogZGVsZXRlIGRhdGEgZnJvbSB0aGUgcGFzdCAoZS5nLiBtaXhkb3duIGNvZWZpY2llbnRzKSAqLwotICAgICAgcGNtRG14X1Jlc2V0KCBzZWxmLT5oUGNtVXRpbHMsIFBDTURNWF9SRVNFVF9CU19EQVRBICk7Ci0gICAgfQotICAgIC8qIGRvIFBDTSBwb3N0IHByb2Nlc3NpbmcgKi8KLSAgICBkbXhFcnIgPSBwY21EbXhfQXBwbHlGcmFtZSAoCi0gICAgICAgICAgICBzZWxmLT5oUGNtVXRpbHMsCi0gICAgICAgICAgICBwVGltZURhdGEsCi0gICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSwKLSAgICAgICAgICAgJnNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICBpbnRlcmxlYXZlZCwKLSAgICAgICAgICAgIHNlbGYtPmNoYW5uZWxUeXBlLAotICAgICAgICAgICAgc2VsZi0+Y2hhbm5lbEluZGljZXMsCi0gICAgICAgICAgICBzZWxmLT5jaGFubmVsT3V0cHV0TWFwcGluZywKLSAgICAgICAgICAgIChzZWxmLT5saW1pdGVyRW5hYmxlQ3VycikgPyAmcGNtTGltaXRlclNjYWxlIDogTlVMTAotICAgICAgKTsKLSAgICBpZiAoIChFcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKQotICAgICAgJiYgKGRteEVyciA9PSBQQ01ETVhfSU5WQUxJRF9NT0RFKSApIHsKLSAgICAgIC8qIEFubm91bmNlIHRoZSBmcmFtZXdvcmsgdGhhdCB0aGUgY3VycmVudCBjb21iaW5hdGlvbiBvZiBjaGFubmVsIGNvbmZpZ3VyYXRpb24gYW5kIGRvd25taXgKLSAgICAgICAqIHNldHRpbmdzIGFyZSBub3Qga25vdyB0byBwcm9kdWNlIGEgcHJlZGljdGFibGUgYmVoYXZpb3IgYW5kIHRodXMgbWF5YmUgcHJvZHVjZSBzdHJhbmdlIG91dHB1dC4gKi8KLSAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CisgICAgICBpZiAoIXNlbGYtPnFtZkRvbWFpbi5nbG9iYWxDb25mLnFtZkRvbWFpbkV4cGxpY2l0Q29uZmlnICYmCisgICAgICAgICAgc2VsZi0+bXBzRW5hYmxlQ3VycikgeworICAgICAgICBTQUNfSU5QVVRfQ09ORklHIHNhY19pbnRlcmZhY2UgPSAoc2VsZi0+c2JyRW5hYmxlZCAmJiBzZWxmLT5oU2JyRGVjb2RlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU0FDX0lOVEVSRkFDRV9RTUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU0FDX0lOVEVSRkFDRV9USU1FOworICAgICAgICAvKiBuZWVkcyB0byBiZSBkb25lIGJlZm9yZSBmaXJzdCBTQlIgYXBwbHkuICovCisgICAgICAgIG1wZWdTdXJyb3VuZERlY29kZXJfQ29uZmlndXJlUW1mRG9tYWluKAorICAgICAgICAgICAgKENNcGVnU3Vycm91bmREZWNvZGVyICopc2VsZi0+cE1wZWdTdXJyb3VuZERlY29kZXIsIHNhY19pbnRlcmZhY2UsCisgICAgICAgICAgICAoVUlOVClzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGUsIHNlbGYtPnN0cmVhbUluZm8uYW90KTsKKyAgICAgICAgc2VsZi0+cW1mRG9tYWluLmdsb2JhbENvbmYublFtZlRpbWVTbG90c19yZXF1ZXN0ZWQgPQorICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgLworICAgICAgICAgICAgc2VsZi0+cW1mRG9tYWluLmdsb2JhbENvbmYubkJhbmRzQW5hbHlzaXNfcmVxdWVzdGVkOworICAgICAgfQorCisgICAgICBzZWxmLT5xbWZEb21haW4uZ2xvYmFsQ29uZi5URGlucHV0ID0gcFRpbWVEYXRhOworCisgICAgICBzd2l0Y2ggKEZES19RbWZEb21haW5fQ29uZmlndXJlKCZzZWxmLT5xbWZEb21haW4pKSB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgUU1GX0RPTUFJTl9JTklUX0VSUk9SOgorICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19VTktOT1dOOworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgY2FzZSBRTUZfRE9NQUlOX09VVF9PRl9NRU1PUlk6CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX09VVF9PRl9NRU1PUlk7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICBjYXNlIFFNRl9ET01BSU5fT0s6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8qIHNiciBkZWNvZGVyICovCisKKyAgICAgIGlmICgoRXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19PSykgfHwgKGZsYWdzICYgQUFDREVDX0NPTkNFQUwpIHx8CisgICAgICAgICAgc2VsZi0+cEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1swXS0+Y29uY2VhbG1lbnRJbmZvLmNvbmNlYWxTdGF0ZSA+CisgICAgICAgICAgICAgIENvbmNlYWxTdGF0ZV9GYWRlSW4pIHsKKyAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7IC8qIGlmIGFuIGVycm9yIGhhcyBvY2N1cmVkIGRvIGNvbmNlYWxtZW50IGluIHRoZSBTQlIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIgdG9vICovCisgICAgICB9CisKKyAgICAgIGlmIChzZWxmLT5zYnJFbmFibGVkICYmICghKHNlbGYtPmZsYWdzWzBdICYgQUNfVVNBQ19TQ0ZHSTMpKSkgeworICAgICAgICBTQlJfRVJST1Igc2JyRXJyb3IgPSBTQlJERUNfT0s7CisgICAgICAgIGludCBjaElkeCwgbnVtQ29yZUNoYW5uZWwgPSBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzOworCisgICAgICAgIC8qIHNldCBwYXJhbXMgKi8KKyAgICAgICAgc2JyRGVjb2Rlcl9TZXRQYXJhbShzZWxmLT5oU2JyRGVjb2RlciwgU0JSX1NZU1RFTV9CSVRTVFJFQU1fREVMQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c2JyUGFyYW1zLmJzRGVsYXkpOworICAgICAgICBzYnJEZWNvZGVyX1NldFBhcmFtKAorICAgICAgICAgICAgc2VsZi0+aFNickRlY29kZXIsIFNCUl9GTFVTSF9EQVRBLAorICAgICAgICAgICAgKGZsYWdzICYgQUFDREVDX0ZMVVNIKSB8CisgICAgICAgICAgICAgICAgKChzZWxmLT5mbHVzaFN0YXR1cyAmJiAhKGZsYWdzICYgQUFDREVDX0NPTkNFQUwpKSA/IEFBQ0RFQ19GTFVTSAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwKSk7CisKKyAgICAgICAgaWYgKHNlbGYtPnN0cmVhbUluZm8uYW90ID09IEFPVF9FUl9BQUNfRUxEKSB7CisgICAgICAgICAgLyogQ29uZmlndXJlIFFNRiAqLworICAgICAgICAgIHNickRlY29kZXJfU2V0UGFyYW0oc2VsZi0+aFNickRlY29kZXIsIFNCUl9MRF9RTUZfVElNRV9BTElHTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLT5mbGFnc1swXSAmIEFDX01QU19QUkVTRU5UKSA/IDEgOiAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICBQQ01ETVhfRVJST1IgZG14RXJyOworICAgICAgICAgIElOVCBtYXhPdXRDaCA9IDA7CisKKyAgICAgICAgICBkbXhFcnIgPSBwY21EbXhfR2V0UGFyYW0oc2VsZi0+aFBjbVV0aWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUywgJm1heE91dENoKTsKKyAgICAgICAgICBpZiAoKGRteEVyciA9PSBQQ01ETVhfT0spICYmIChtYXhPdXRDaCA9PSAxKSkgeworICAgICAgICAgICAgLyogRGlzYWJsZSBQUyBwcm9jZXNzaW5nIGlmIHdlIGhhdmUgdG8gY3JlYXRlIGEgbW9ubyBvdXRwdXQgc2lnbmFsLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzZWxmLT5wc1Bvc3NpYmxlID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzYnJEZWNvZGVyX1NldFBhcmFtKHNlbGYtPmhTYnJEZWNvZGVyLCBTQlJfU0tJUF9RTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYtPm1wc0VuYWJsZUN1cnIpID8gMiA6IDApOworCisgICAgICAgIElOVF9QQ00gKmlucHV0OworICAgICAgICBpbnB1dCA9IChJTlRfUENNICopc2VsZi0+d29ya0J1ZmZlckNvcmUyOworICAgICAgICBGREttZW1jcHkoaW5wdXQsIHBUaW1lRGF0YSwKKyAgICAgICAgICAgICAgICAgIHNpemVvZihJTlRfUENNKSAqIChzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzKSAqCisgICAgICAgICAgICAgICAgICAgICAgKHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplKSk7CisKKyAgICAgICAgLyogYXBwbHkgU0JSIHByb2Nlc3NpbmcgKi8KKyAgICAgICAgc2JyRXJyb3IgPSBzYnJEZWNvZGVyX0FwcGx5KHNlbGYtPmhTYnJEZWNvZGVyLCBpbnB1dCwgcFRpbWVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZURhdGFTaXplLCAmc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5zdHJlYW1JbmZvLnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+bWFwRGVzY3IsIHNlbGYtPmNoTWFwSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5mcmFtZU9LLCAmc2VsZi0+cHNQb3NzaWJsZSk7CisKKyAgICAgICAgaWYgKHNickVycm9yID09IFNCUkRFQ19PSykgeworICAgICAgICAgIC8qIFVwZGF0ZSBkYXRhIGluIHN0cmVhbWluZm8gc3RydWN0dXJlLiBBc3N1bWUgdGhhdCB0aGUgU0JSIHVwc2FtcGxpbmcKKyAgICAgICAgICAgICBmYWN0b3IgaXMgZWl0aGVyIDEsIDIsIDgvMyBvciA0LiBNYXhpbXVtIHVwc2FtcGxpbmcgZmFjdG9yIGlzIDQKKyAgICAgICAgICAgICAoQ0VMUCtTQlIgb3IgVVNBQyA0OjEgU0JSKSAqLworICAgICAgICAgIHNlbGYtPmZsYWdzWzBdIHw9IEFDX1NCUl9QUkVTRU5UOworICAgICAgICAgIGlmIChzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGUgIT0gc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlKSB7CisgICAgICAgICAgICBpZiAoc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVSYXRlID4+IDIgPT0KKyAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLnNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgPQorICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUgPj4gMjsKKyAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5vdXRwdXREZWxheSA9IHNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXkgPj4gMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVSYXRlID4+IDEgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlKSB7CisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplID0KKyAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lID4+IDE7CisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXkgPSBzZWxmLT5zdHJlYW1JbmZvLm91dHB1dERlbGF5ID4+IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSA8PCAxID09CisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uc2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMTsKKyAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5vdXRwdXREZWxheSA9IHNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXkgPDwgMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVSYXRlIDw8IDIgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlKSB7CisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplID0gc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAyOworICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm91dHB1dERlbGF5ID0gc2VsZi0+c3RyZWFtSW5mby5vdXRwdXREZWxheSA8PCAyOworICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSA9PSA3NjgpIHsKKyAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgPQorICAgICAgICAgICAgICAgICAgKHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlc1BlckZyYW1lIDw8IDMpIC8gMzsKKyAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5vdXRwdXREZWxheSA9CisgICAgICAgICAgICAgICAgICAoc2VsZi0+c3RyZWFtSW5mby5vdXRwdXREZWxheSA8PCAzKSAvIDM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgPSBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZTsKKyAgICAgICAgICB9CisgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5vdXRwdXREZWxheSArPQorICAgICAgICAgICAgICBzYnJEZWNvZGVyX0dldERlbGF5KHNlbGYtPmhTYnJEZWNvZGVyKTsKKworICAgICAgICAgIGlmIChzZWxmLT5wc1Bvc3NpYmxlKSB7CisgICAgICAgICAgICBzZWxmLT5mbGFnc1swXSB8PSBBQ19QU19QUkVTRU5UOworICAgICAgICAgIH0KKyAgICAgICAgICBmb3IgKGNoSWR4ID0gbnVtQ29yZUNoYW5uZWw7IGNoSWR4IDwgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVsczsKKyAgICAgICAgICAgICAgIGNoSWR4ICs9IDEpIHsKKyAgICAgICAgICAgIHNlbGYtPmNoYW5uZWxUeXBlW2NoSWR4XSA9IEFDVF9GUk9OVDsKKyAgICAgICAgICAgIHNlbGYtPmNoYW5uZWxJbmRpY2VzW2NoSWR4XSA9IGNoSWR4OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2JyRXJyb3IgPT0gU0JSREVDX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMKSB7CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMOworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoc2VsZi0+bXBzRW5hYmxlQ3VycikgeworICAgICAgICBpbnQgZXJyLCBzYWNfaW50ZXJmYWNlLCBuQ2hhbm5lbHMsIGZyYW1lU2l6ZTsKKworICAgICAgICBuQ2hhbm5lbHMgPSBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzOworICAgICAgICBmcmFtZVNpemUgPSBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZTsKKyAgICAgICAgc2FjX2ludGVyZmFjZSA9IFNBQ19JTlRFUkZBQ0VfVElNRTsKKworICAgICAgICBpZiAoc2VsZi0+c2JyRW5hYmxlZCAmJiBzZWxmLT5oU2JyRGVjb2RlcikKKyAgICAgICAgICBzYWNfaW50ZXJmYWNlID0gU0FDX0lOVEVSRkFDRV9RTUY7CisgICAgICAgIGlmIChzZWxmLT5zdHJlYW1JbmZvLmFvdCA9PSBBT1RfVVNBQykgeworICAgICAgICAgIGlmIChzZWxmLT5mbGFnc1swXSAmIEFDX1VTQUNfU0NGR0kzKSB7CisgICAgICAgICAgICBzYWNfaW50ZXJmYWNlID0gU0FDX0lOVEVSRkFDRV9USU1FOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlcnIgPSBtcGVnU3Vycm91bmREZWNvZGVyX1NldFBhcmFtKAorICAgICAgICAgICAgKENNcGVnU3Vycm91bmREZWNvZGVyICopc2VsZi0+cE1wZWdTdXJyb3VuZERlY29kZXIsCisgICAgICAgICAgICBTQUNERUNfSU5URVJGQUNFLCBzYWNfaW50ZXJmYWNlKTsKKworICAgICAgICBpZiAoZXJyID09IDApIHsKKyAgICAgICAgICBlcnIgPSBtcGVnU3Vycm91bmREZWNvZGVyX0FwcGx5KAorICAgICAgICAgICAgICAoQ01wZWdTdXJyb3VuZERlY29kZXIgKilzZWxmLT5wTXBlZ1N1cnJvdW5kRGVjb2RlciwKKyAgICAgICAgICAgICAgKElOVF9QQ00gKilzZWxmLT53b3JrQnVmZmVyQ29yZTIsIHBUaW1lRGF0YSwgdGltZURhdGFTaXplLAorICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSwgJm5DaGFubmVscywgJmZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlLCBzZWxmLT5zdHJlYW1JbmZvLmFvdCwKKyAgICAgICAgICAgICAgc2VsZi0+Y2hhbm5lbFR5cGUsIHNlbGYtPmNoYW5uZWxJbmRpY2VzLCAmc2VsZi0+bWFwRGVzY3IpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciA9PSBNUFNfT1VUUFVUX0JVRkZFUl9UT09fU01BTEwpIHsKKyAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfT1VUUFVUX0JVRkZFUl9UT09fU01BTEw7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIgPT0gMCkgeworICAgICAgICAgIC8qIFVwZGF0ZSBvdXRwdXQgcGFyYW1ldGVyICovCisgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyA9IG5DaGFubmVsczsKKyAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSA9IGZyYW1lU2l6ZTsKKyAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm91dHB1dERlbGF5ICs9IG1wZWdTdXJyb3VuZERlY29kZXJfR2V0RGVsYXkoCisgICAgICAgICAgICAgIChDTXBlZ1N1cnJvdW5kRGVjb2RlciAqKXNlbGYtPnBNcGVnU3Vycm91bmREZWNvZGVyKTsKKyAgICAgICAgICAvKiBTYXZlIGN1cnJlbnQgcGFyYW1ldGVyIGZvciBwb3NzaWJsZSBjb25jZWFsbWVudCBvZiBuZXh0IGZyYW1lICovCisgICAgICAgICAgc2VsZi0+bXBzT3V0Q2hhbm5lbHNMYXN0ID0gbkNoYW5uZWxzOworICAgICAgICAgIHNlbGYtPm1wc0ZyYW1lU2l6ZUxhc3QgPSBmcmFtZVNpemU7CisgICAgICAgIH0gZWxzZSBpZiAoKHNlbGYtPm1wc091dENoYW5uZWxzTGFzdCA+IDApICYmCisgICAgICAgICAgICAgICAgICAgKHNlbGYtPm1wc0ZyYW1lU2l6ZUxhc3QgPiAwKSkgeworICAgICAgICAgIC8qIFJlc3RvcmUgcGFyYW1ldGVycyBvZiBsYXN0IGZyYW1lIC4uLiAqLworICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMgPSBzZWxmLT5tcHNPdXRDaGFubmVsc0xhc3Q7CisgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgPSBzZWxmLT5tcHNGcmFtZVNpemVMYXN0OworICAgICAgICAgIC8qIC4uLiBhbmQgY2xlYXIgb3V0cHV0IGJ1ZmZlciBzbyB0aGF0IHBvdGVudGlhbGx5IGNvcnJ1cHRlZCBkYXRhIGRvZXMKKyAgICAgICAgICAgKiBub3QgcmVhY2ggdGhlIGZyYW1ld29yay4gKi8KKyAgICAgICAgICBGREttZW1jbGVhcihwVGltZURhdGEsIHNlbGYtPm1wc091dENoYW5uZWxzTGFzdCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+bXBzRnJhbWVTaXplTGFzdCAqIHNpemVvZihJTlRfUENNKSk7CisgICAgICAgICAgLyogQWRkaXRpb25hbGx5IHByb2NsYWltIHRoYXQgdGhpcyBmcmFtZSBoYWQgZXJyb3JzIGR1cmluZyBkZWNvZGluZy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19VTktOT1dOOyAvKiBubyBvdXRwdXQgKi8KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBTQlIgZGVjb2RlciBmb3IgVW5pZmllZCBTdGVyZW8gQ29uZmlnIChzdGVyZW9Db25maWdJbmRleCA9PSAzKSAqLworCisgICAgICBpZiAoc2VsZi0+c2JyRW5hYmxlZCAmJiAoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19VU0FDX1NDRkdJMykpIHsKKyAgICAgICAgU0JSX0VSUk9SIHNickVycm9yID0gU0JSREVDX09LOworCisgICAgICAgIC8qIHNldCBwYXJhbXMgKi8KKyAgICAgICAgc2JyRGVjb2Rlcl9TZXRQYXJhbShzZWxmLT5oU2JyRGVjb2RlciwgU0JSX1NZU1RFTV9CSVRTVFJFQU1fREVMQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c2JyUGFyYW1zLmJzRGVsYXkpOworCisgICAgICAgIHNickRlY29kZXJfU2V0UGFyYW0oc2VsZi0+aFNickRlY29kZXIsIFNCUl9TS0lQX1FNRiwgMSk7CisKKyAgICAgICAgLyogYXBwbHkgU0JSIHByb2Nlc3NpbmcgKi8KKyAgICAgICAgc2JyRXJyb3IgPSBzYnJEZWNvZGVyX0FwcGx5KHNlbGYtPmhTYnJEZWNvZGVyLCBwVGltZURhdGEsIHBUaW1lRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVEYXRhU2l6ZSwgJnNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPm1hcERlc2NyLCBzZWxmLT5jaE1hcEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZnJhbWVPSywgJnNlbGYtPnBzUG9zc2libGUpOworCisgICAgICAgIGlmIChzYnJFcnJvciA9PSBTQlJERUNfT0spIHsKKyAgICAgICAgICAvKiBVcGRhdGUgZGF0YSBpbiBzdHJlYW1pbmZvIHN0cnVjdHVyZS4gQXNzdW1lIHRoYXQgdGhlIFNCUiB1cHNhbXBsaW5nCisgICAgICAgICAgICogZmFjdG9yIGlzIGVpdGhlciAxLDIgb3IgNCAqLworICAgICAgICAgIHNlbGYtPmZsYWdzWzBdIHw9IEFDX1NCUl9QUkVTRU5UOworICAgICAgICAgIGlmIChzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGUgIT0gc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlKSB7CisgICAgICAgICAgICBpZiAoc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgPT0gNzY4KSB7CisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplID0KKyAgICAgICAgICAgICAgICAgIChzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZSAqIDgpIC8gMzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVSYXRlIDw8IDIgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlKSB7CisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplID0gc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgPSBzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgc2VsZi0+ZmxhZ3NbMF0gJj0gfkFDX1BTX1BSRVNFTlQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNickVycm9yID09IFNCUkRFQ19PVVRQVVRfQlVGRkVSX1RPT19TTUFMTCkgeworICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19PVVRQVVRfQlVGRkVSX1RPT19TTUFMTDsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogVXNlIGRlZGljYXRlZCBtZW1vcnkgZm9yIFBDTSBwb3N0cHJvY2Vzc2luZyAqLworICAgICAgcFRpbWVEYXRhUGNtUG9zdCA9IHNlbGYtPnBUaW1lRGF0YTI7CisgICAgICB0aW1lRGF0YVBjbVBvc3RTaXplID0gc2VsZi0+dGltZURhdGEyU2l6ZTsKKworICAgICAgeworICAgICAgICBjb25zdCBpbnQgc2l6ZSA9CisgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSAqIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHM7CisgICAgICAgIEZES19BU1NFUlQodGltZURhdGFQY21Qb3N0U2l6ZSA+PSBzaXplKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICBwVGltZURhdGFQY21Qb3N0W2ldID0KKyAgICAgICAgICAgICAgKFBDTV9ERUMpRlhfUENNMlBDTV9ERUMocFRpbWVEYXRhW2ldKSA+PiBQQ01fT1VUX0hFQURST09NOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgaWYgKChGREtfZHJjRGVjX0dldFBhcmFtKHNlbGYtPmhVbmlEcmNEZWNvZGVyLCBEUkNfREVDX0lTX0FDVElWRSkpICYmCisgICAgICAgICAgICAhKHNlbGYtPmZsYWdzWzBdICYgQUNfUlNWNjAzREEpKSB7CisgICAgICAgICAgLyogQXBwbHkgRFJDIGdhaW5zKi8KKyAgICAgICAgICBpbnQgY2gsIGRyY0RlbGF5ID0gMDsKKyAgICAgICAgICBpbnQgbmVlZHNEZWludGVybGVhdmluZyA9IDA7CisgICAgICAgICAgRklYUF9EQkwgKmRyY1dvcmtCdWZmZXIgPSBOVUxMOworICAgICAgICAgIEZJWFBfREJMIGNoYW5uZWxHYWluWyg4KV07CisgICAgICAgICAgaW50IHJldmVyc2VJbkNoYW5uZWxNYXBbKDgpXTsKKyAgICAgICAgICBpbnQgcmV2ZXJzZU91dENoYW5uZWxNYXBbKDgpXTsKKyAgICAgICAgICBpbnQgbnVtRHJjT3V0Q2hhbm5lbHMgPSBGREtfZHJjRGVjX0dldFBhcmFtKAorICAgICAgICAgICAgICBzZWxmLT5oVW5pRHJjRGVjb2RlciwgRFJDX0RFQ19UQVJHRVRfQ0hBTk5FTF9DT1VOVF9TRUxFQ1RFRCk7CisgICAgICAgICAgRkRLbWVtY2xlYXIoY2hhbm5lbEdhaW4sIHNpemVvZihjaGFubmVsR2FpbikpOworICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8ICg4KTsgY2grKykgeworICAgICAgICAgICAgcmV2ZXJzZUluQ2hhbm5lbE1hcFtjaF0gPSBjaDsKKyAgICAgICAgICAgIHJldmVyc2VPdXRDaGFubmVsTWFwW2NoXSA9IGNoOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIElmIFNCUiBhbmQvb3IgTVBTIGlzIGFjdGl2ZSwgdGhlIERSQyBnYWlucyBhcmUgYWxpZ25lZCB0byB0aGUgUU1GCisgICAgICAgICAgICAgZG9tYWluIHNpZ25hbCBiZWZvcmUgdGhlIFFNRiBzeW50aGVzaXMuIFRoZXJlZm9yZSB0aGUgRFJDIGdhaW5zCisgICAgICAgICAgICAgbmVlZCB0byBiZSBkZWxheWVkIGJ5IHRoZSBRTUYgc3ludGhlc2lzIGRlbGF5LiAqLworICAgICAgICAgIGlmIChzZWxmLT5zYnJFbmFibGVkKSBkcmNEZWxheSA9IDI1NzsKKyAgICAgICAgICBpZiAoc2VsZi0+bXBzRW5hYmxlQ3VycikgZHJjRGVsYXkgPSAyNTc7CisgICAgICAgICAgLyogVGFrZSBpbnRvIGFjY291bnQgY29uY2VhbG1lbnQgZGVsYXkgKi8KKyAgICAgICAgICBkcmNEZWxheSArPSBDQ29uY2VhbG1lbnRfR2V0RGVsYXkoJnNlbGYtPmNvbmNlYWxDb21tb25EYXRhKSAqCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemU7CisKKyAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBVQ0hBUiBtYXBWYWx1ZSA9IEZES19jaE1hcERlc2NyX2dldE1hcFZhbHVlKAorICAgICAgICAgICAgICAgICZzZWxmLT5tYXBEZXNjciwgKFVDSEFSKWNoLCBzZWxmLT5jaE1hcEluZGV4KTsKKyAgICAgICAgICAgIGlmIChtYXBWYWx1ZSA8ICg4KSkgcmV2ZXJzZUluQ2hhbm5lbE1hcFttYXBWYWx1ZV0gPSBjaDsKKyAgICAgICAgICB9CisgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgKGludCludW1EcmNPdXRDaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgVUNIQVIgbWFwVmFsdWUgPSBGREtfY2hNYXBEZXNjcl9nZXRNYXBWYWx1ZSgKKyAgICAgICAgICAgICAgICAmc2VsZi0+bWFwRGVzY3IsIChVQ0hBUiljaCwgbnVtRHJjT3V0Q2hhbm5lbHMpOworICAgICAgICAgICAgaWYgKG1hcFZhbHVlIDwgKDgpKSByZXZlcnNlT3V0Q2hhbm5lbE1hcFttYXBWYWx1ZV0gPSBjaDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBUaGUgb3V0cHV0IG9mIFNCUiBhbmQgTVBTIGlzIGludGVybGVhdmVkLiBEZWludGVybGVhdmluZyBtYXkgYmUKKyAgICAgICAgICAgKiBuZWNlc3NhcnkgZm9yIEZES19kcmNEZWNfUHJvY2Vzc1RpbWUsIHdoaWNoIGFjY2VwdHMgZGVpbnRlcmxlYXZlZAorICAgICAgICAgICAqIGF1ZGlvIG9ubHkuICovCisgICAgICAgICAgaWYgKChzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzID4gMSkgJiYKKyAgICAgICAgICAgICAgKDAgfHwgKHNlbGYtPnNickVuYWJsZWQpIHx8IChzZWxmLT5tcHNFbmFibGVDdXJyKSkpIHsKKyAgICAgICAgICAgIC8qIGludGVybGVhdmluZy9kZWludGVybGVhdmluZyBpcyBwZXJmb3JtZWQgb24gdXBwZXIgcGFydCBvZgorICAgICAgICAgICAgICogcFRpbWVEYXRhUGNtUG9zdC4gQ2hlY2sgaWYgdGhpcyBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoLiAqLworICAgICAgICAgICAgaWYgKHRpbWVEYXRhUGNtUG9zdFNpemUgPAorICAgICAgICAgICAgICAgIChJTlQpKDIgKiBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSAqIHNpemVvZihQQ01fREVDKSkpIHsKKyAgICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1VOS05PV047CisgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5lZWRzRGVpbnRlcmxlYXZpbmcgPSAxOworICAgICAgICAgICAgZHJjV29ya0J1ZmZlciA9CisgICAgICAgICAgICAgICAgKEZJWFBfREJMICopcFRpbWVEYXRhUGNtUG9zdCArCisgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyAqIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplOworICAgICAgICAgICAgRkRLX2RlaW50ZXJsZWF2ZSgKKyAgICAgICAgICAgICAgICBwVGltZURhdGFQY21Qb3N0LCBkcmNXb3JrQnVmZmVyLCBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplLCBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRyY1dvcmtCdWZmZXIgPSAoRklYUF9EQkwgKilwVGltZURhdGFQY21Qb3N0OworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIHByZXBhcmUgTG91ZG5lc3MgTm9ybWFsaXNhdGlvbiBnYWluICovCisgICAgICAgICAgRkRLX2RyY0RlY19TZXRQYXJhbShzZWxmLT5oVW5pRHJjRGVjb2RlciwgRFJDX0RFQ19UQVJHRVRfTE9VRE5FU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UKS1zZWxmLT5kZWZhdWx0VGFyZ2V0TG91ZG5lc3MgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgOSkpKTsKKyAgICAgICAgICBGREtfZHJjRGVjX1NldENoYW5uZWxHYWlucyhzZWxmLT5oVW5pRHJjRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplLCBjaGFubmVsR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmNXb3JrQnVmZmVyLCBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSk7CisgICAgICAgICAgRkRLX2RyY0RlY19QcmVwcm9jZXNzKHNlbGYtPmhVbmlEcmNEZWNvZGVyKTsKKworICAgICAgICAgIC8qIGFwcGx5IERSQzEgZ2FpbiBzZXF1ZW5jZSAqLworICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIEZES19kcmNEZWNfUHJvY2Vzc1RpbWUoc2VsZi0+aFVuaURyY0RlY29kZXIsIGRyY0RlbGF5LCBEUkNfREVDX0RSQzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoLCByZXZlcnNlSW5DaGFubmVsTWFwW2NoXSAtIGNoLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmNXb3JrQnVmZmVyLCBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSk7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIGFwcGx5IGRvd25taXggKi8KKyAgICAgICAgICBGREtfZHJjRGVjX0FwcGx5RG93bm1peCgKKyAgICAgICAgICAgICAgc2VsZi0+aFVuaURyY0RlY29kZXIsIHJldmVyc2VJbkNoYW5uZWxNYXAsIHJldmVyc2VPdXRDaGFubmVsTWFwLAorICAgICAgICAgICAgICBkcmNXb3JrQnVmZmVyLAorICAgICAgICAgICAgICAmc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyk7IC8qIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgY2hhbmdlIGhlcmUgKi8KKyAgICAgICAgICAvKiBhcHBseSBEUkMyLzMgZ2FpbiBzZXF1ZW5jZSAqLworICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIEZES19kcmNEZWNfUHJvY2Vzc1RpbWUoc2VsZi0+aFVuaURyY0RlY29kZXIsIGRyY0RlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUkNfREVDX0RSQzJfRFJDMywgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VPdXRDaGFubmVsTWFwW2NoXSAtIGNoLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmNXb3JrQnVmZmVyLCBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKG5lZWRzRGVpbnRlcmxlYXZpbmcpIHsKKyAgICAgICAgICAgIEZES19pbnRlcmxlYXZlKAorICAgICAgICAgICAgICAgIGRyY1dvcmtCdWZmZXIsIHBUaW1lRGF0YVBjbVBvc3QsIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUsIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHNlbGYtPnN0cmVhbUluZm8uZXh0QW90ICE9IEFPVF9BQUNfU0xTKSB7CisgICAgICAgIElOVCBwY21MaW1pdGVyU2NhbGUgPSAwOworICAgICAgICBQQ01ETVhfRVJST1IgZG14RXJyID0gUENNRE1YX09LOworICAgICAgICBpZiAoZmxhZ3MgJiAoQUFDREVDX0lOVFIpKSB7CisgICAgICAgICAgLyogZGVsZXRlIGRhdGEgZnJvbSB0aGUgcGFzdCAoZS5nLiBtaXhkb3duIGNvZWZpY2llbnRzKSAqLworICAgICAgICAgIHBjbURteF9SZXNldChzZWxmLT5oUGNtVXRpbHMsIFBDTURNWF9SRVNFVF9CU19EQVRBKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmxhZ3MgJiAoQUFDREVDX0NMUkhJU1QpKSB7CisgICAgICAgICAgaWYgKCEoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19VU0FDKSkgeworICAgICAgICAgICAgLyogZGVsZXRlIGRhdGEgZnJvbSB0aGUgcGFzdCAoZS5nLiBtaXhkb3duIGNvZWZpY2llbnRzKSAqLworICAgICAgICAgICAgcGNtRG14X1Jlc2V0KHNlbGYtPmhQY21VdGlscywgUENNRE1YX1JFU0VUX0JTX0RBVEEpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIElOVCBpbnRlcmxlYXZlZCA9IDA7CisgICAgICAgIGludGVybGVhdmVkIHw9IChzZWxmLT5zYnJFbmFibGVkKSA/IDEgOiAwOworICAgICAgICBpbnRlcmxlYXZlZCB8PSAoc2VsZi0+bXBzRW5hYmxlQ3VycikgPyAxIDogMDsKKworICAgICAgICAvKiBkbyBQQ00gcG9zdCBwcm9jZXNzaW5nICovCisgICAgICAgIGRteEVyciA9IHBjbURteF9BcHBseUZyYW1lKAorICAgICAgICAgICAgc2VsZi0+aFBjbVV0aWxzLCBwVGltZURhdGFQY21Qb3N0LCB0aW1lRGF0YUZpeHBQY21TaXplLAorICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUsICZzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzLAorICAgICAgICAgICAgaW50ZXJsZWF2ZWQsIHNlbGYtPmNoYW5uZWxUeXBlLCBzZWxmLT5jaGFubmVsSW5kaWNlcywKKyAgICAgICAgICAgICZzZWxmLT5tYXBEZXNjciwKKyAgICAgICAgICAgIChzZWxmLT5saW1pdGVyRW5hYmxlQ3VycikgPyAmcGNtTGltaXRlclNjYWxlIDogTlVMTCk7CisgICAgICAgIGlmIChkbXhFcnIgPT0gUENNRE1YX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMKSB7CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMOworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKEVycm9yU3RhdHVzID09IEFBQ19ERUNfT0spICYmIChkbXhFcnIgPT0gUENNRE1YX0lOVkFMSURfTU9ERSkpIHsKKyAgICAgICAgICAvKiBBbm5vdW5jZSB0aGUgZnJhbWV3b3JrIHRoYXQgdGhlIGN1cnJlbnQgY29tYmluYXRpb24gb2YgY2hhbm5lbAorICAgICAgICAgICAqIGNvbmZpZ3VyYXRpb24gYW5kIGRvd25taXggc2V0dGluZ3MgYXJlIG5vdCBrbm93IHRvIHByb2R1Y2UgYQorICAgICAgICAgICAqIHByZWRpY3RhYmxlIGJlaGF2aW9yIGFuZCB0aHVzIG1heWJlIHByb2R1Y2Ugc3RyYW5nZSBvdXRwdXQuICovCisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbGFncyAmIEFBQ0RFQ19DTFJISVNUKSB7CisgICAgICAgICAgaWYgKCEoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19VU0FDKSkgeworICAgICAgICAgICAgLyogRGVsZXRlIHRoZSBkZWxheWVkIHNpZ25hbC4gKi8KKyAgICAgICAgICAgIHBjbUxpbWl0ZXJfUmVzZXQoc2VsZi0+aExpbWl0ZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLT5saW1pdGVyRW5hYmxlQ3VycikgeworICAgICAgICAgIC8qIHVzZSB3b3JrQnVmZmVyQ29yZTIgYnVmZmVyIGZvciBpbnRlcmxlYXZpbmcgKi8KKyAgICAgICAgICBQQ01fTElNICpwSW50ZXJsZWF2ZUJ1ZmZlcjsKKyAgICAgICAgICBpbnQgYmxvY2tMZW5ndGggPSBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZTsKKworICAgICAgICAgIC8qIFNldCBhY3R1YWwgc2lnbmFsIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICBwY21MaW1pdGVyX1NldE5DaGFubmVscyhzZWxmLT5oTGltaXRlciwgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyk7CisgICAgICAgICAgcGNtTGltaXRlcl9TZXRTYW1wbGVSYXRlKHNlbGYtPmhMaW1pdGVyLCBzZWxmLT5zdHJlYW1JbmZvLnNhbXBsZVJhdGUpOworICAgICAgICAgIHBjbUxpbWl0ZXJTY2FsZSArPSBQQ01fT1VUX0hFQURST09NOworCisgICAgICAgICAgaWYgKChzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzID09IDEpIHx8IChzZWxmLT5zYnJFbmFibGVkKSB8fAorICAgICAgICAgICAgICAoc2VsZi0+bXBzRW5hYmxlQ3VycikpIHsKKyAgICAgICAgICAgIHBJbnRlcmxlYXZlQnVmZmVyID0gKFBDTV9MSU0gKilwVGltZURhdGFQY21Qb3N0OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwSW50ZXJsZWF2ZUJ1ZmZlciA9IChQQ01fTElNICopcFRpbWVEYXRhOworICAgICAgICAgICAgLyogYXBwbHlMaW1pdGVyIHJlcXVlc3RzIGZvciBpbnRlcmxlYXZlZCBkYXRhICovCisgICAgICAgICAgICAvKiBJbnRlcmxlYXZlIG91cHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgRkRLX2ludGVybGVhdmUocFRpbWVEYXRhUGNtUG9zdCwgcEludGVybGVhdmVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzLCBibG9ja0xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwY21MaW1pdGVyX0FwcGx5KHNlbGYtPmhMaW1pdGVyLCBwSW50ZXJsZWF2ZUJ1ZmZlciwgcFRpbWVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZXh0R2FpbiwgJnBjbUxpbWl0ZXJTY2FsZSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmV4dEdhaW5EZWxheSwgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUpOworCisgICAgICAgICAgeworICAgICAgICAgICAgLyogQW5ub3VuY2UgdGhlIGFkZGl0aW9uYWwgbGltaXRlciBvdXRwdXQgZGVsYXkgKi8KKyAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXkgKz0gcGNtTGltaXRlcl9HZXREZWxheShzZWxmLT5oTGltaXRlcik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIElmIG51bUNoYW5uZWxzID0gMSB3ZSBkbyBub3QgbmVlZCBpbnRlcmxlYXZpbmcuIFRoZSBzYW1lIGFwcGxpZXMgaWYKKyAgICAgICAgICBTQlIgb3IgTVBTIGFyZSB1c2VkLCBzaW5jZSB0aGVpciBvdXRwdXQgaXMgaW50ZXJsZWF2ZWQgYWxyZWFkeQorICAgICAgICAgIChyZXNhbXBsZWQgb3Igbm90KSAqLworICAgICAgICAgIGlmICgoc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyA9PSAxKSB8fCAoc2VsZi0+c2JyRW5hYmxlZCkgfHwKKyAgICAgICAgICAgICAgKHNlbGYtPm1wc0VuYWJsZUN1cnIpKSB7CisgICAgICAgICAgICBzY2FsZVZhbHVlc1NhdHVyYXRlKAorICAgICAgICAgICAgICAgIHBUaW1lRGF0YSwgcFRpbWVEYXRhUGNtUG9zdCwKKyAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSAqIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgUENNX09VVF9IRUFEUk9PTSk7CisKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2NhbGVWYWx1ZXNTYXR1cmF0ZSgKKyAgICAgICAgICAgICAgICAoSU5UX1BDTSAqKXNlbGYtPndvcmtCdWZmZXJDb3JlMiwgcFRpbWVEYXRhUGNtUG9zdCwKKyAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSAqIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgUENNX09VVF9IRUFEUk9PTSk7CisgICAgICAgICAgICAvKiBJbnRlcmxlYXZlIG91cHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgRkRLX2ludGVybGVhdmUoKElOVF9QQ00gKilzZWxmLT53b3JrQnVmZmVyQ29yZTIsIHBUaW1lRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gLyogaWYgKHNlbGYtPnN0cmVhbUluZm8uZXh0QW90ICE9IEFPVF9BQUNfU0xTKSovCisKKyAgICAgIGlmIChzZWxmLT5mbGFnc1swXSAmIEFDX1VTQUMpIHsKKyAgICAgICAgaWYgKHNlbGYtPmZsdXNoU3RhdHVzID09IEFBQ0RFQ19VU0FDX0RBU0hfSVBGX0ZMVVNIX09OICYmCisgICAgICAgICAgICAhKGZsYWdzICYgQUFDREVDX0NPTkNFQUwpKSB7CisgICAgICAgICAgQ0FhY0RlY29kZXJfUHJlcGFyZUNyb3NzRmFkZShwVGltZURhdGEsIHNlbGYtPnBUaW1lRGF0YUZsdXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplLCAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHByZXBhcmUgY3Jvc3NmYWRlIGJ1ZmZlciBmb3IgZmFkZSBpbiAqLworICAgICAgICBpZiAoIWFwcGx5Q3Jvc3NmYWRlICYmIHNlbGYtPmFwcGx5Q3Jvc3NmYWRlICYmCisgICAgICAgICAgICAhKGZsYWdzICYgQUFDREVDX0NPTkNFQUwpKSB7CisgICAgICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVElNRV9EQVRBX0ZMVVNIX1NJWkU7IGkrKykgeworICAgICAgICAgICAgICBzZWxmLT5wVGltZURhdGFGbHVzaFtjaF1baV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBhcHBseUNyb3NzZmFkZSA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXBwbHlDcm9zc2ZhZGUgJiYgc2VsZi0+YXBwbHlDcm9zc2ZhZGUgJiYKKyAgICAgICAgICAgICEoYWNjZXNzVW5pdCA8IG51bVByZXJvbGxBVSkgJiYKKyAgICAgICAgICAgIChzZWxmLT5idWlsZFVwU3RhdHVzID09IEFBQ0RFQ19VU0FDX0JVSUxEX1VQX09OKSkgeworICAgICAgICAgIENBYWNEZWNvZGVyX0FwcGx5Q3Jvc3NGYWRlKHBUaW1lRGF0YSwgc2VsZi0+cFRpbWVEYXRhRmx1c2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSwgMSk7CisgICAgICAgICAgc2VsZi0+YXBwbHlDcm9zc2ZhZGUgPSAwOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIFNpZ25hbCBpbnRlcnJ1cHRpb24gdG8gdGFrZSBlZmZlY3QgaW4gbmV4dCBmcmFtZS4gKi8KKyAgICAgIGlmICgoZmxhZ3MgJiBBQUNERUNfRkxVU0ggfHwgc2VsZi0+Zmx1c2hTdGF0dXMpICYmCisgICAgICAgICAgIShmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSkgeworICAgICAgICBhYWNEZWNvZGVyX1NpZ25hbEludGVycnVwdGlvbihzZWxmKTsKKyAgICAgIH0KKworICAgICAgLyogVXBkYXRlIGV4dGVybmFsbHkgdmlzaWJsZSBjb3B5IG9mIGZsYWdzICovCisgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZsYWdzID0gc2VsZi0+ZmxhZ3NbMF07CisKKyAgICB9IC8qIFVTQUMgREFTSCBJUEYgZmx1c2hpbmcgcG9zc2libGUgZW5kICovCisgICAgaWYgKGFjY2Vzc1VuaXQgPCBudW1QcmVyb2xsQVUpIHsKKyAgICAgIEZES3B1c2hCYWNrKGhCc0F1LCBhdVN0YXJ0QW5jaG9yIC0gRkRLZ2V0VmFsaWRCaXRzKGhCc0F1KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICgoc2VsZi0+YnVpbGRVcFN0YXR1cyA9PSBBQUNERUNfUlNWNjBfQlVJTERfVVBfT04pIHx8CisgICAgICAgICAgKHNlbGYtPmJ1aWxkVXBTdGF0dXMgPT0gQUFDREVDX1JTVjYwX0JVSUxEX1VQX09OX0lOX0JBTkQpIHx8CisgICAgICAgICAgKHNlbGYtPmJ1aWxkVXBTdGF0dXMgPT0gQUFDREVDX1VTQUNfQlVJTERfVVBfT04pKSB7CisgICAgICAgIHNlbGYtPmJ1aWxkVXBDbnQtLTsKKworICAgICAgICBpZiAoc2VsZi0+YnVpbGRVcENudCA8IDApIHsKKyAgICAgICAgICBzZWxmLT5idWlsZFVwU3RhdHVzID0gMDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoc2VsZi0+ZmxhZ3NbMF0gJiBBQ19VU0FDKSB7CisgICAgICAgIGlmIChzZWxmLT5mbHVzaFN0YXR1cyA9PSBBQUNERUNfVVNBQ19EQVNIX0lQRl9GTFVTSF9PTiAmJgorICAgICAgICAgICAgIShmbGFncyAmIEFBQ0RFQ19DT05DRUFMKSkgeworICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplID0gMDsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KIAotICAgIGlmICggZmxhZ3MgJiBBQUNERUNfQ0xSSElTVCApIHsKLSAgICAgIC8qIERlbGV0ZSB0aGUgZGVsYXllZCBzaWduYWwuICovCi0gICAgICByZXNldExpbWl0ZXIoc2VsZi0+aExpbWl0ZXIpOworICAgIGlmIChzZWxmLT5mbHVzaFN0YXR1cyAhPSBBQUNERUNfVVNBQ19EQVNIX0lQRl9GTFVTSF9PTikgeworICAgICAgYWNjZXNzVW5pdCsrOwogICAgIH0KLSAgICBpZiAoc2VsZi0+bGltaXRlckVuYWJsZUN1cnIpCi0gICAgewotICAgICAgLyogU2V0IGFjdHVhbCBzaWduYWwgcGFyYW1ldGVycyAqLwotICAgICAgc2V0TGltaXRlck5DaGFubmVscyhzZWxmLT5oTGltaXRlciwgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyk7Ci0gICAgICBzZXRMaW1pdGVyU2FtcGxlUmF0ZShzZWxmLT5oTGltaXRlciwgc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlKTsKLQotICAgICAgYXBwbHlMaW1pdGVyKAotICAgICAgICAgICAgICBzZWxmLT5oTGltaXRlciwKLSAgICAgICAgICAgICAgcFRpbWVEYXRhLAotICAgICAgICAgICAgICBzZWxmLT5leHRHYWluLAotICAgICAgICAgICAgICZwY21MaW1pdGVyU2NhbGUsCi0gICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgIHNlbGYtPmV4dEdhaW5EZWxheSwKLSAgICAgICAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUKLSAgICAgICAgICAgICAgKTsKLQotICAgICAgLyogQW5ub3VuY2UgdGhlIGFkZGl0aW9uYWwgbGltaXRlciBvdXRwdXQgZGVsYXkgKi8KLSAgICAgIHNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXkgKz0gZ2V0TGltaXRlckRlbGF5KHNlbGYtPmhMaW1pdGVyKTsKLSAgICB9Ci0gICAgfQotCi0KLSAgICAvKiBTaWduYWwgaW50ZXJydXB0aW9uIHRvIHRha2UgZWZmZWN0IGluIG5leHQgZnJhbWUuICovCi0gICAgaWYgKCBmbGFncyAmIEFBQ0RFQ19GTFVTSCApIHsKLSAgICAgIGFhY0RlY29kZXJfU2lnbmFsSW50ZXJydXB0aW9uKHNlbGYpOwotICAgIH0KLQotICAgIC8qIFVwZGF0ZSBleHRlcm5hbGx5IHZpc2libGUgY29weSBvZiBmbGFncyAqLwotICAgIHNlbGYtPnN0cmVhbUluZm8uZmxhZ3MgPSBzZWxmLT5mbGFnczsKKyAgfSB3aGlsZSAoKGFjY2Vzc1VuaXQgPCBudW1BY2Nlc3NVbml0cykgfHwKKyAgICAgICAgICAgKChzZWxmLT5mbHVzaFN0YXR1cyA9PSBBQUNERUNfVVNBQ19EQVNIX0lQRl9GTFVTSF9PTikgJiYKKyAgICAgICAgICAgICEoZmxhZ3MgJiBBQUNERUNfQ09OQ0VBTCkpKTsKIAogYmFpbDoKIAotICAgIC8qIFVwZGF0ZSBTdGF0aXN0aWNzICovCi0gICAgYWFjRGVjb2Rlcl9VcGRhdGVCaXRTdHJlYW1Db3VudGVycygmc2VsZi0+c3RyZWFtSW5mbywgaEJzLCBuQml0cywgRXJyb3JTdGF0dXMpOworICAvKiBlcnJvciBpbiByZW5kZXJlciBwYXJ0IG9jY3VycmVkLCBFcnJvclN0YXR1cyB3YXMgc2V0IHRvIGludmFsaWQgb3V0cHV0ICovCisgIGlmIChmRW5kQXVOb3RBZGp1c3RlZCAmJiAhSVNfT1VUUFVUX1ZBTElEKEVycm9yU3RhdHVzKSAmJgorICAgICAgKGFjY2Vzc1VuaXQgPCBudW1QcmVyb2xsQVUpKSB7CisgICAgdHJhbnNwb3J0RGVjX0VuZEFjY2Vzc1VuaXQoc2VsZi0+aElucHV0KTsKKyAgfQogCi0gICAgLyogQ2hlY2sgd2hldGhlciBleHRlcm5hbCBvdXRwdXQgYnVmZmVyIGlzIGxhcmdlIGVub3VnaC4gKi8KLSAgICBpZiAodGltZURhdGFTaXplX2V4dGVybiA8IHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMqc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUpIHsKLSAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19PVVRQVVRfQlVGRkVSX1RPT19TTUFMTDsKLSAgICB9CisgIC8qIFVwZGF0ZSBTdGF0aXN0aWNzICovCisgIGFhY0RlY29kZXJfVXBkYXRlQml0U3RyZWFtQ291bnRlcnMoJnNlbGYtPnN0cmVhbUluZm8sIGhCcywgbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JTdGF0dXMpOworICBpZiAoKChzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzIDw9IDApIHx8CisgICAgICAgKHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplIDw9IDApIHx8CisgICAgICAgKHNlbGYtPnN0cmVhbUluZm8uc2FtcGxlUmF0ZSA8PSAwKSkgJiYKKyAgICAgIElTX09VVFBVVF9WQUxJRChFcnJvclN0YXR1cykpIHsKKyAgICAvKiBFbnN1cmUgY29uc2lzdGVuY3kgb2YgSVNfT1VUUFVUX1ZBTElEKCkgbWFjcm8uICovCisgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1VOS05PV047CisgIH0KIAotICAgIC8qIFVwZGF0ZSBleHRlcm5hbCBvdXRwdXQgYnVmZmVyLiAqLwotICAgIGlmICggSVNfT1VUUFVUX1ZBTElEKEVycm9yU3RhdHVzKSApIHsKLSAgICAgIEZES21lbWNweShwVGltZURhdGFfZXh0ZXJuLCBwVGltZURhdGEsIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMqc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUqc2l6ZW9mKCpwVGltZURhdGEpKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBGREttZW1jbGVhcihwVGltZURhdGFfZXh0ZXJuLCB0aW1lRGF0YVNpemVfZXh0ZXJuKnNpemVvZigqcFRpbWVEYXRhX2V4dGVybikpOwotICAgIH0KKyAgLyogQ2hlY2sgd2hldGhlciBleHRlcm5hbCBvdXRwdXQgYnVmZmVyIGlzIGxhcmdlIGVub3VnaC4gKi8KKyAgaWYgKHRpbWVEYXRhU2l6ZV9leHRlcm4gPAorICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyAqIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplKSB7CisgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMOworICB9CiAKLSAgICByZXR1cm4gRXJyb3JTdGF0dXM7CisgIC8qIFVwZGF0ZSBleHRlcm5hbCBvdXRwdXQgYnVmZmVyLiAqLworICBpZiAoSVNfT1VUUFVUX1ZBTElEKEVycm9yU3RhdHVzKSkgeworICAgIEZES21lbWNweShwVGltZURhdGFfZXh0ZXJuLCBwVGltZURhdGEsCisgICAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMgKiBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSAqCisgICAgICAgICAgICAgICAgICBzaXplb2YoKnBUaW1lRGF0YSkpOworICB9IGVsc2UgeworICAgIEZES21lbWNsZWFyKHBUaW1lRGF0YV9leHRlcm4sCisgICAgICAgICAgICAgICAgdGltZURhdGFTaXplX2V4dGVybiAqIHNpemVvZigqcFRpbWVEYXRhX2V4dGVybikpOworICB9CisKKyAgcmV0dXJuIEVycm9yU3RhdHVzOwogfQogCi1MSU5LU1BFQ19DUFAgdm9pZCBhYWNEZWNvZGVyX0Nsb3NlICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiApCi17Ci0gIGlmIChzZWxmID09IE5VTEwpCi0gICAgcmV0dXJuOwotCitMSU5LU1BFQ19DUFAgdm9pZCBhYWNEZWNvZGVyX0Nsb3NlKEhBTkRMRV9BQUNERUNPREVSIHNlbGYpIHsKKyAgaWYgKHNlbGYgPT0gTlVMTCkgcmV0dXJuOwogCiAgIGlmIChzZWxmLT5oTGltaXRlciAhPSBOVUxMKSB7Ci0gICAgZGVzdHJveUxpbWl0ZXIoc2VsZi0+aExpbWl0ZXIpOworICAgIHBjbUxpbWl0ZXJfRGVzdHJveShzZWxmLT5oTGltaXRlcik7CiAgIH0KIAogICBpZiAoc2VsZi0+aFBjbVV0aWxzICE9IE5VTEwpIHsKLSAgICBwY21EbXhfQ2xvc2UoICZzZWxmLT5oUGNtVXRpbHMgKTsKKyAgICBwY21EbXhfQ2xvc2UoJnNlbGYtPmhQY21VdGlscyk7CiAgIH0KIAorICBGREtfZHJjRGVjX0Nsb3NlKCZzZWxmLT5oVW5pRHJjRGVjb2Rlcik7CiAKKyAgaWYgKHNlbGYtPnBNcGVnU3Vycm91bmREZWNvZGVyICE9IE5VTEwpIHsKKyAgICBtcGVnU3Vycm91bmREZWNvZGVyX0Nsb3NlKAorICAgICAgICAoQ01wZWdTdXJyb3VuZERlY29kZXIgKilzZWxmLT5wTXBlZ1N1cnJvdW5kRGVjb2Rlcik7CisgIH0KIAogICBpZiAoc2VsZi0+aFNickRlY29kZXIgIT0gTlVMTCkgewogICAgIHNickRlY29kZXJfQ2xvc2UoJnNlbGYtPmhTYnJEZWNvZGVyKTsKQEAgLTEwOTUsMjQgKzE5NTksMjQgQEAKICAgQ0FhY0RlY29kZXJfQ2xvc2Uoc2VsZik7CiB9CiAKLQotTElOS1NQRUNfQ1BQIENTdHJlYW1JbmZvKiBhYWNEZWNvZGVyX0dldFN0cmVhbUluZm8gKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmICkKLXsKK0xJTktTUEVDX0NQUCBDU3RyZWFtSW5mbyAqYWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvKEhBTkRMRV9BQUNERUNPREVSIHNlbGYpIHsKICAgcmV0dXJuIENBYWNEZWNvZGVyX0dldFN0cmVhbUluZm8oc2VsZik7CiB9CiAKLUxJTktTUEVDX0NQUCBJTlQgYWFjRGVjb2Rlcl9HZXRMaWJJbmZvICggTElCX0lORk8gKmluZm8gKQoteworTElOS1NQRUNfQ1BQIElOVCBhYWNEZWNvZGVyX0dldExpYkluZm8oTElCX0lORk8gKmluZm8pIHsKICAgaW50IGk7CiAKICAgaWYgKGluZm8gPT0gTlVMTCkgewogICAgIHJldHVybiAtMTsKICAgfQogCi0gIHNickRlY29kZXJfR2V0TGliSW5mbyggaW5mbyApOwotICB0cmFuc3BvcnREZWNfR2V0TGliSW5mbyggaW5mbyApOwotICBGREtfdG9vbHNHZXRMaWJJbmZvKCBpbmZvICk7Ci0gIHBjbURteF9HZXRMaWJJbmZvKCBpbmZvICk7CisgIHNickRlY29kZXJfR2V0TGliSW5mbyhpbmZvKTsKKyAgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9HZXRMaWJJbmZvKGluZm8pOworICB0cmFuc3BvcnREZWNfR2V0TGliSW5mbyhpbmZvKTsKKyAgRkRLX3Rvb2xzR2V0TGliSW5mbyhpbmZvKTsKKyAgcGNtRG14X0dldExpYkluZm8oaW5mbyk7CisgIHBjbUxpbWl0ZXJfR2V0TGliSW5mbyhpbmZvKTsKKyAgRkRLX2RyY0RlY19HZXRMaWJJbmZvKGluZm8pOwogCiAgIC8qIHNlYXJjaCBmb3IgbmV4dCBmcmVlIHRhYiAqLwogICBmb3IgKGkgPSAwOyBpIDwgRkRLX01PRFVMRV9MQVNUOyBpKyspIHsKQEAgLTExMjUsNDEgKzE5ODksMjMgQEAKIAogICBpbmZvLT5tb2R1bGVfaWQgPSBGREtfQUFDREVDOwogICAvKiBidWlsZCBvd24gbGlicmFyeSBpbmZvICovCi0gIGluZm8tPnZlcnNpb24gPSBMSUJfVkVSU0lPTihBQUNERUNPREVSX0xJQl9WTDAsIEFBQ0RFQ09ERVJfTElCX1ZMMSwgQUFDREVDT0RFUl9MSUJfVkwyKTsKKyAgaW5mby0+dmVyc2lvbiA9CisgICAgICBMSUJfVkVSU0lPTihBQUNERUNPREVSX0xJQl9WTDAsIEFBQ0RFQ09ERVJfTElCX1ZMMSwgQUFDREVDT0RFUl9MSUJfVkwyKTsKICAgTElCX1ZFUlNJT05fU1RSSU5HKGluZm8pOwogICBpbmZvLT5idWlsZF9kYXRlID0gQUFDREVDT0RFUl9MSUJfQlVJTERfREFURTsKICAgaW5mby0+YnVpbGRfdGltZSA9IEFBQ0RFQ09ERVJfTElCX0JVSUxEX1RJTUU7CiAgIGluZm8tPnRpdGxlID0gQUFDREVDT0RFUl9MSUJfVElUTEU7CiAKICAgLyogU2V0IGZsYWdzICovCi0gIGluZm8tPmZsYWdzID0gMAotICAgICAgfCBDQVBGX0FBQ19MQwotICAgICAgfCBDQVBGX0VSX0FBQ19TQ0FMCi0gICAgICB8IENBUEZfQUFDX1ZDQjExCi0gICAgICB8IENBUEZfQUFDX0hDUgotICAgICAgfCBDQVBGX0FBQ19SVkxDCi0gICAgICB8IENBUEZfRVJfQUFDX0xECi0gICAgICB8IENBUEZfRVJfQUFDX0VMRAotICAgICAgfCBDQVBGX0FBQ19DT05DRUFMTUVOVAotICAgICAgfCBDQVBGX0FBQ19EUkMKKyAgaW5mby0+ZmxhZ3MgPSAwIHwgQ0FQRl9BQUNfTEMgfCBDQVBGX0VSX0FBQ19MQyB8IENBUEZfRVJfQUFDX1NDQUwgfAorICAgICAgICAgICAgICAgIENBUEZfQUFDX1ZDQjExIHwgQ0FQRl9BQUNfSENSIHwgQ0FQRl9BQUNfUlZMQyB8IENBUEZfRVJfQUFDX0xEIHwKKyAgICAgICAgICAgICAgICBDQVBGX0VSX0FBQ19FTEQgfCBDQVBGX0FBQ19DT05DRUFMTUVOVCB8IENBUEZfQUFDX0RSQyB8CisgICAgICAgICAgICAgICAgQ0FQRl9BQUNfTVBFRzQgfCBDQVBGX0FBQ19EUk1fQlNGT1JNQVQgfCBDQVBGX0FBQ18xMDI0IHwKKyAgICAgICAgICAgICAgICBDQVBGX0FBQ185NjAgfCBDQVBGX0FBQ181MTIgfCBDQVBGX0FBQ180ODAgfAorICAgICAgICAgICAgICAgIENBUEZfQUFDX0VMRF9ET1dOU0NBTEUKIAotICAgICAgfCBDQVBGX0FBQ19NUEVHNAotCi0gICAgICB8IENBUEZfQUFDX0RSTV9CU0ZPUk1BVAotCi0gICAgICB8IENBUEZfQUFDXzEwMjQKLSAgICAgIHwgQ0FQRl9BQUNfOTYwCi0KLSAgICAgIHwgQ0FQRl9BQUNfNTEyCi0KLSAgICAgIHwgQ0FQRl9BQUNfNDgwCi0KLSAgICAgIDsKKyAgICAgICAgICAgICAgICB8IENBUEZfQUFDX1VTQUMgfCBDQVBGX0VSX0FBQ19FTERWMiB8IENBUEZfQUFDX1VOSURSQzsKICAgLyogRW5kIG9mIGZsYWdzICovCiAKICAgcmV0dXJuIDA7CiB9Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvYXJtL2Jsb2NrX2FybS5jcHAgYi9saWJBQUNkZWMvc3JjL2FybS9ibG9ja19hcm0uY3BwCmluZGV4IGZiYzFiZjMuLjNjMWI0YmEgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvYXJtL2Jsb2NrX2FybS5jcHAKKysrIGIvbGliQUFDZGVjL3NyYy9hcm0vYmxvY2tfYXJtLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNiArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEFydGh1ciBUcml0dGhhcnQKKwogICAgRGVzY3JpcHRpb246IChBUk0gb3B0aW1pc2VkKSBTY2FsaW5nIG9mIHNwZWN0cmFsIGRhdGEKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjZGVmaW5lIEZVTkNUSU9OX0NCbG9ja19TY2FsZVNwZWN0cmFsRGF0YV9mdW5jMQogCkBAIC05NywyNiArMTA3LDIwIEBACiAgICAgICAgICBsb29wIG92ZXJoZWFkIHBlciBzYW1wbGUsIHRoYXQgZ29lcyBkb3duIHRvIDEtY3ljbGUgcGVyIHNhbXBsZQogICAgICAgICAgd2l0aCBhbiBvcHRpbWFsIDR4LWxvb3AgY29uc3RydWN0IChkbyAtIDR4IC0gd2hpbGUpLgogKi8KLQotRkRLX0lOTElORSBzdGF0aWMgdm9pZCBDQmxvY2tfU2NhbGVTcGVjdHJhbERhdGFfZnVuYzEoCi0gICAgRklYUF9EQkwgKnBTcGVjdHJ1bSwKLSAgICBpbnQgbWF4X2JhbmQsCi0gICAgY29uc3QgU0hPUlQgKiBSRVNUUklDVCBCYW5kT2Zmc2V0cywKLSAgICBpbnQgU3BlY1NjYWxlX3dpbmRvdywKLSAgICBjb25zdCBTSE9SVCAqIFJFU1RSSUNUIHBTZmJTY2FsZSwKLSAgICBpbnQgd2luZG93KQoteworc3RhdGljIGlubGluZSB2b2lkIENCbG9ja19TY2FsZVNwZWN0cmFsRGF0YV9mdW5jMSgKKyAgICBGSVhQX0RCTCAqcFNwZWN0cnVtLCBpbnQgbWF4U2ZicywgY29uc3QgU0hPUlQgKlJFU1RSSUNUIEJhbmRPZmZzZXRzLAorICAgIGludCBTcGVjU2NhbGVfd2luZG93LCBjb25zdCBTSE9SVCAqUkVTVFJJQ1QgcFNmYlNjYWxlLCBpbnQgd2luZG93KSB7CiAgIGludCBiYW5kX29mZnNldCA9IDA7Ci0gIGZvciAoaW50IGJhbmQ9MDsgYmFuZCA8IG1heF9iYW5kOyBiYW5kKyspCi0gIHsKKyAgZm9yIChpbnQgYmFuZCA9IDA7IGJhbmQgPCBtYXhTZmJzOyBiYW5kKyspIHsKICAgICBpbnQgcnVucyA9IGJhbmRfb2Zmc2V0OwotICAgIGJhbmRfb2Zmc2V0ID0gQmFuZE9mZnNldHNbYmFuZCsxXTsKLSAgICBydW5zID0gYmFuZF9vZmZzZXQgLSBydW5zOyAgICAvKiBpcyBhbHdheXMgYSBtdWx0aXBsZSBvZiA0ICovCi0gICAgaW50IHNjYWxlID0gU3BlY1NjYWxlX3dpbmRvdy1wU2ZiU2NhbGVbd2luZG93KjE2K2JhbmRdOwotICAgIGlmIChzY2FsZSkKLSAgICB7Ci0gICAgICBkbwotICAgICAgeworICAgIGJhbmRfb2Zmc2V0ID0gQmFuZE9mZnNldHNbYmFuZCArIDFdOworICAgIHJ1bnMgPSBiYW5kX29mZnNldCAtIHJ1bnM7IC8qIGlzIGFsd2F5cyBhIG11bHRpcGxlIG9mIDQgKi8KKyAgICBGREtfQVNTRVJUKChydW5zICYgMykgPT0gMCk7CisgICAgaW50IHNjYWxlID0KKyAgICAgICAgZk1pbihERlJBQ1RfQklUUyAtIDEsIFNwZWNTY2FsZV93aW5kb3cgLSBwU2ZiU2NhbGVbd2luZG93ICogMTYgKyBiYW5kXSk7CisKKyAgICBpZiAoc2NhbGUpIHsKKyAgICAgIGRvIHsKICAgICAgICAgRklYUF9EQkwgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKICAgICAgICAgdG1wMCA9IHBTcGVjdHJ1bVswXTsKICAgICAgICAgdG1wMSA9IHBTcGVjdHJ1bVsxXTsKQEAgLTEzMCwxMSArMTM0LDkgQEAKICAgICAgICAgKnBTcGVjdHJ1bSsrID0gdG1wMTsKICAgICAgICAgKnBTcGVjdHJ1bSsrID0gdG1wMjsKICAgICAgICAgKnBTcGVjdHJ1bSsrID0gdG1wMzsKLSAgICAgIH0gd2hpbGUgKChydW5zID0gcnVucy00KSAhPSAwKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHBTcGVjdHJ1bSs9IHJ1bnM7CisgICAgICB9IHdoaWxlICgocnVucyA9IHJ1bnMgLSA0KSAhPSAwKTsKKyAgICB9IGVsc2UgeworICAgICAgcFNwZWN0cnVtICs9IHJ1bnM7CiAgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2Jsb2NrLmNwcCBiL2xpYkFBQ2RlYy9zcmMvYmxvY2suY3BwCmluZGV4IGExOTI4NGUuLjdkMmE0YjkgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvYmxvY2suY3BwCisrKyBiL2xpYkFBQ2RlYy9zcmMvYmxvY2suY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDI4ICs5MCwzMyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorCiAgICBEZXNjcmlwdGlvbjogbG9uZy9zaG9ydC1ibG9jayBkZWNvZGluZwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiYmxvY2suaCIKIAogI2luY2x1ZGUgImFhY19yb20uaCIKICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisjaW5jbHVkZSAic2NhbGUuaCIKICNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCiAKKyNpbmNsdWRlICJ1c2FjZGVjX2ZhYy5oIgorI2luY2x1ZGUgInVzYWNkZWNfbHBkLmgiCisjaW5jbHVkZSAidXNhY2RlY19scGMuaCIKKyNpbmNsdWRlICJGREtfdHJpZ0ZjdHMuaCIKIAotCisjaW5jbHVkZSAiYWNfYXJpdGhfY29kZXIuaCIKIAogI2luY2x1ZGUgImFhY2RlY19oY3IuaCIKICNpbmNsdWRlICJydmxjLmgiCiAKLQogI2lmIGRlZmluZWQoX19hcm1fXykKICNpbmNsdWRlICJhcm0vYmxvY2tfYXJtLmNwcCIKICNlbmRpZgpAQCAtMTExLDEzNSArMTI3LDE2OSBAQAogICBUaGUgZnVuY3Rpb24gcmVhZHMgdGhlIGVzY2FwZSBzZXF1ZW5jZSBmcm9tIHRoZSBiaXRzdHJlYW0sCiAgIGlmIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50IGhhcyB0aGUKICAgdmFsdWUgMTYuCisgIEEgbGltaXRhdGlvbiBpcyBpbXBsZW1lbnRlZCB0byBtYXhpbWFsIDMxIGJpdHMgdG8gcHJldmVudCBlbmRsZXNzIGxvb3BzLgorICBJZiBpdCBzdHJpa2VzLCBNQVhfUVVBTlRJWkVEX1ZBTFVFICsgMSBpcyByZXR1cm5lZCwgaW5kZXBlbmRlbnQgb2YgdGhlIHNpZ24gb2YKKyAgcGFyYW1ldGVyIHEuCiAKICAgXHJldHVybiAgcXVhbnRpemVkIGNvZWZmaWNpZW50CiAqLwogTE9ORyBDQmxvY2tfR2V0RXNjYXBlKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCAvKiE8IHBvaW50ZXIgdG8gYml0c3RyZWFtICovCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBMT05HIHEpICAgICAgICAvKiE8IHF1YW50aXplZCBjb2VmZmljaWVudCAqLworICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExPTkcgcSkgICAgICAgICAgICAvKiE8IHF1YW50aXplZCBjb2VmZmljaWVudCAqLwogewotICBMT05HIGksIG9mZiwgbmVnIDsKKyAgaWYgKGZBYnMocSkgIT0gMTYpIHJldHVybiAocSk7CiAKLSAgaWYgKHEgPCAwKQotICB7Ci0gICAgaWYgKHEgIT0gLTE2KSByZXR1cm4gcTsKLSAgICBuZWcgPSAxOwotICB9Ci0gIGVsc2UKLSAgewotICAgIGlmIChxICE9ICsxNikgcmV0dXJuIHE7Ci0gICAgbmVnID0gMDsKKyAgTE9ORyBpLCBvZmY7CisgIGZvciAoaSA9IDQ7IGkgPCAzMjsgaSsrKSB7CisgICAgaWYgKEZES3JlYWRCaXQoYnMpID09IDApIGJyZWFrOwogICB9CiAKLSAgZm9yIChpPTQ7IDsgaSsrKQotICB7Ci0gICAgaWYgKEZES3JlYWRCaXRzKGJzLDEpID09IDApCi0gICAgICBicmVhazsKLSAgfQorICBpZiAoaSA9PSAzMikgcmV0dXJuIChNQVhfUVVBTlRJWkVEX1ZBTFVFICsgMSk7CiAKLSAgaWYgKGkgPiAxNikKLSAgewotICAgIGlmIChpIC0gMTYgPiBDQUNIRV9CSVRTKSB7IC8qIGNhbm5vdCByZWFkIG1vcmUgdGhhbiAiQ0FDSEVfQklUUyIgYml0cyBhdCBvbmNlIGluIHRoZSBmdW5jdGlvbiBGREtyZWFkQml0cygpICovCi0gICAgICByZXR1cm4gKE1BWF9RVUFOVElaRURfVkFMVUUgKyAxKTsgLyogcmV0dXJuaW5nIGludmFsaWQgdmFsdWUgdGhhdCB3aWxsIGJlIGNhcHR1cmVkIGxhdGVyICovCi0gICAgfQotCi0gICAgb2ZmID0gRkRLcmVhZEJpdHMoYnMsaS0xNikgPDwgMTY7Ci0gICAgb2ZmIHw9IEZES3JlYWRCaXRzKGJzLDE2KTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBvZmYgPSBGREtyZWFkQml0cyhicyxpKTsKLSAgfQotCisgIG9mZiA9IEZES3JlYWRCaXRzKGJzLCBpKTsKICAgaSA9IG9mZiArICgxIDw8IGkpOwogCi0gIGlmIChuZWcpIGkgPSAtaTsKKyAgaWYgKHEgPCAwKSBpID0gLWk7CiAKICAgcmV0dXJuIGk7CiB9CiAKIEFBQ19ERUNPREVSX0VSUk9SIENCbG9ja19SZWFkU2NhbGVGYWN0b3JEYXRhKAotICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICAgICAgVUlOVCBmbGFncwotICAgICAgICApCi17CisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgVUlOVCBmbGFncykgewogICBpbnQgdGVtcDsKICAgaW50IGJhbmQ7CiAgIGludCBncm91cDsKICAgaW50IHBvc2l0aW9uID0gMDsgLyogYWNjdSBmb3IgaW50ZW5zaXR5IGRlbHRhIGNvZGluZyAqLwotICBpbnQgZmFjdG9yID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkdsb2JhbEdhaW47IC8qIGFjY3UgZm9yIHNjYWxlIGZhY3RvciBkZWx0YSBjb2RpbmcgKi8KKyAgaW50IGZhY3RvciA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mbworICAgICAgICAgICAgICAgICAgIC5HbG9iYWxHYWluOyAvKiBhY2N1IGZvciBzY2FsZSBmYWN0b3IgZGVsdGEgY29kaW5nICovCiAgIFVDSEFSICpwQ29kZUJvb2sgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rOwogICBTSE9SVCAqcFNjYWxlRmFjdG9yID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcjsKLSAgY29uc3QgQ29kZUJvb2tEZXNjcmlwdGlvbiAqaGNiID0mQUFDY29kZUJvb2tEZXNjcmlwdGlvblRhYmxlW0JPT0tTQ0xdOworICBjb25zdCBDb2RlQm9va0Rlc2NyaXB0aW9uICpoY2IgPSAmQUFDY29kZUJvb2tEZXNjcmlwdGlvblRhYmxlW0JPT0tTQ0xdOwogCi0gIGludCBTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQgPSBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOwotICBmb3IgKGdyb3VwPTA7IGdyb3VwIDwgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsgZ3JvdXArKykKLSAgewotICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgU2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkOyBiYW5kKyspCi0gICAgewotICAgICAgc3dpdGNoIChwQ29kZUJvb2tbZ3JvdXAqMTYrYmFuZF0pIHsKKyAgY29uc3QgVVNIT1JUKCpDb2RlQm9vaylbSHVmZm1hbkVudHJpZXNdID0gaGNiLT5Db2RlQm9vazsKIAotICAgICAgY2FzZSBaRVJPX0hDQjogLyogemVybyBib29rICovCi0gICAgICAgIHBTY2FsZUZhY3Rvcltncm91cCoxNitiYW5kXSA9IDA7Ci0gICAgICAgIGJyZWFrOworICBpbnQgU2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkID0KKyAgICAgIEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7CisgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IEdldFdpbmRvd0dyb3VwcygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7CisgICAgICAgZ3JvdXArKykgeworICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgc3dpdGNoIChwQ29kZUJvb2tbYmFuZF0pIHsKKyAgICAgICAgY2FzZSBaRVJPX0hDQjogLyogemVybyBib29rICovCisgICAgICAgICAgcFNjYWxlRmFjdG9yW2JhbmRdID0gMDsKKyAgICAgICAgICBicmVhazsKIAotICAgICAgZGVmYXVsdDogLyogZGVjb2RlIHNjYWxlIGZhY3RvciAqLwotICAgICAgICB7Ci0gICAgICAgICAgdGVtcCA9IENCbG9ja19EZWNvZGVIdWZmbWFuV29yZChicyxoY2IpOwotICAgICAgICAgIGZhY3RvciArPSB0ZW1wIC0gNjA7IC8qIE1JREZBQyAxLjUgZEIgKi8KLSAgICAgICAgfQotICAgICAgICBwU2NhbGVGYWN0b3JbZ3JvdXAqMTYrYmFuZF0gPSBmYWN0b3IgLSAxMDA7Ci0gICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvKiBkZWNvZGUgc2NhbGUgZmFjdG9yICovCisgICAgICAgICAgaWYgKCEoKGZsYWdzICYgKEFDX1VTQUMgfCBBQ19SU1ZENTAgfCBBQ19SU1Y2MDNEQSkpICYmIGJhbmQgPT0gMCAmJgorICAgICAgICAgICAgICAgIGdyb3VwID09IDApKSB7CisgICAgICAgICAgICB0ZW1wID0gQ0Jsb2NrX0RlY29kZUh1ZmZtYW5Xb3JkQ0IoYnMsIENvZGVCb29rKTsKKyAgICAgICAgICAgIGZhY3RvciArPSB0ZW1wIC0gNjA7IC8qIE1JREZBQyAxLjUgZEIgKi8KKyAgICAgICAgICB9CisgICAgICAgICAgcFNjYWxlRmFjdG9yW2JhbmRdID0gZmFjdG9yIC0gMTAwOworICAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIElOVEVOU0lUWV9IQ0I6IC8qIGludGVuc2l0eSBzdGVlcmluZyAqLwotICAgICAgY2FzZSBJTlRFTlNJVFlfSENCMjoKLSAgICAgICAgdGVtcCA9IENCbG9ja19EZWNvZGVIdWZmbWFuV29yZChicyxoY2IpOwotICAgICAgICBwb3NpdGlvbiArPSB0ZW1wIC0gNjA7Ci0gICAgICAgIHBTY2FsZUZhY3Rvcltncm91cCoxNitiYW5kXSA9IHBvc2l0aW9uIC0gMTAwOwotICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCOiAvKiBpbnRlbnNpdHkgc3RlZXJpbmcgKi8KKyAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCMjoKKyAgICAgICAgICB0ZW1wID0gQ0Jsb2NrX0RlY29kZUh1ZmZtYW5Xb3JkQ0IoYnMsIENvZGVCb29rKTsKKyAgICAgICAgICBwb3NpdGlvbiArPSB0ZW1wIC0gNjA7CisgICAgICAgICAgcFNjYWxlRmFjdG9yW2JhbmRdID0gcG9zaXRpb24gLSAxMDA7CisgICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgTk9JU0VfSENCOiAvKiBQTlMgKi8KLSAgICAgICAgaWYgKGZsYWdzICYgKEFDX01QU19SRVN8QUNfVVNBQ3xBQ19SU1ZENTApKSB7Ci0gICAgICAgICAgcmV0dXJuIEFBQ19ERUNfUEFSU0VfRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgQ1Buc19SZWFkKCAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS5hYWMuUG5zRGF0YSwgYnMsIGhjYiwgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvciwgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkdsb2JhbEdhaW4sIGJhbmQsIGdyb3VwKTsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTk9JU0VfSENCOiAvKiBQTlMgKi8KKyAgICAgICAgICBpZiAoZmxhZ3MgJiAoQUNfTVBFR0RfUkVTIHwgQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBKSkgeworICAgICAgICAgICAgcmV0dXJuIEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICAgIENQbnNfUmVhZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS5hYWMuUG5zRGF0YSwgYnMsIGhjYiwKKyAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkdsb2JhbEdhaW4sCisgICAgICAgICAgICAgICAgICAgIGJhbmQsIGdyb3VwKTsKKyAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CisgICAgcENvZGVCb29rICs9IDE2OworICAgIHBTY2FsZUZhY3RvciArPSAxNjsKICAgfQogCiAgIHJldHVybiBBQUNfREVDX09LOwogfQogCi12b2lkIENCbG9ja19TY2FsZVNwZWN0cmFsRGF0YShDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbykKLXsKK3ZvaWQgQ0Jsb2NrX1NjYWxlU3BlY3RyYWxEYXRhKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBtYXhTZmJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8pIHsKICAgaW50IGJhbmQ7CiAgIGludCB3aW5kb3c7Ci0gIGNvbnN0IFNIT1JUICogUkVTVFJJQ1QgcFNmYlNjYWxlICA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2ZiU2NhbGU7Ci0gIFNIT1JUICogUkVTVFJJQ1QgcFNwZWNTY2FsZSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZTsKLSAgaW50IGdyb3Vwd2luLGdyb3VwOwotICBjb25zdCBTSE9SVCAqIFJFU1RSSUNUIEJhbmRPZmZzZXRzID0gR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8pOwotICBTUEVDVFJBTF9QVFIgUkVTVFJJQ1QgcFNwZWN0cmFsQ29lZmZpY2llbnQgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudDsKKyAgY29uc3QgU0hPUlQgKlJFU1RSSUNUIHBTZmJTY2FsZSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2ZiU2NhbGU7CisgIFNIT1JUICpSRVNUUklDVCBwU3BlY1NjYWxlID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+c3BlY1NjYWxlOworICBpbnQgZ3JvdXB3aW4sIGdyb3VwOworICBjb25zdCBTSE9SVCAqUkVTVFJJQ1QgQmFuZE9mZnNldHMgPSBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKAorICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKTsKKyAgU1BFQ1RSQUxfUFRSIFJFU1RSSUNUIHBTcGVjdHJhbENvZWZmaWNpZW50ID0KKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50OwogCisgIEZES21lbWNsZWFyKHBTcGVjU2NhbGUsIDggKiBzaXplb2YoU0hPUlQpKTsKIAotICBGREttZW1jbGVhcihwU3BlY1NjYWxlLCA4KnNpemVvZihTSE9SVCkpOwotCi0gIGludCBtYXhfYmFuZCA9IEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7Ci0gIGZvciAod2luZG93PTAsIGdyb3VwPTA7IGdyb3VwIDwgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsgZ3JvdXArKykKLSAgewotICAgIGZvciAoZ3JvdXB3aW49MDsgZ3JvdXB3aW4gPCBHZXRXaW5kb3dHcm91cExlbmd0aCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyxncm91cCk7IGdyb3Vwd2luKyssIHdpbmRvdysrKQotICAgIHsKKyAgZm9yICh3aW5kb3cgPSAwLCBncm91cCA9IDA7CisgICAgICAgZ3JvdXAgPCBHZXRXaW5kb3dHcm91cHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOyBncm91cCsrKSB7CisgICAgZm9yIChncm91cHdpbiA9IDA7IGdyb3Vwd2luIDwgR2V0V2luZG93R3JvdXBMZW5ndGgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLCBncm91cCk7CisgICAgICAgICBncm91cHdpbisrLCB3aW5kb3crKykgewogICAgICAgaW50IFNwZWNTY2FsZV93aW5kb3cgPSBwU3BlY1NjYWxlW3dpbmRvd107Ci0gICAgICBGSVhQX0RCTCAqcFNwZWN0cnVtID0gU1BFQyhwU3BlY3RyYWxDb2VmZmljaWVudCwgd2luZG93LCAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCk7CisgICAgICBGSVhQX0RCTCAqcFNwZWN0cnVtID0gU1BFQyhwU3BlY3RyYWxDb2VmZmljaWVudCwgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCk7CiAKICAgICAgIC8qIGZpbmQgc2NhbGluZyBmb3IgY3VycmVudCB3aW5kb3cgKi8KLSAgICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgbWF4X2JhbmQ7IGJhbmQrKykKLSAgICAgIHsKLSAgICAgICAgU3BlY1NjYWxlX3dpbmRvdyA9IGZNYXgoU3BlY1NjYWxlX3dpbmRvdywgKGludClwU2ZiU2NhbGVbd2luZG93KjE2K2JhbmRdKTsKKyAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBtYXhTZmJzOyBiYW5kKyspIHsKKyAgICAgICAgU3BlY1NjYWxlX3dpbmRvdyA9CisgICAgICAgICAgICBmTWF4KFNwZWNTY2FsZV93aW5kb3csIChpbnQpcFNmYlNjYWxlW3dpbmRvdyAqIDE2ICsgYmFuZF0pOwogICAgICAgfQogCi0gICAgICBpZiAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPlRuc0RhdGEuQWN0aXZlKSB7Ci0gICAgICAgIFNwZWNTY2FsZV93aW5kb3cgKz0gVE5TX1NDQUxFOworICAgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5UbnNEYXRhLkFjdGl2ZSAmJgorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5UbnNEYXRhLk51bWJlck9mRmlsdGVyc1t3aW5kb3ddID4KKyAgICAgICAgICAgICAgMCkgeworICAgICAgICBpbnQgZmlsdGVyX2luZGV4LCBTcGVjU2NhbGVfd2luZG93X3RuczsKKyAgICAgICAgaW50IHRuc19zdGFydCwgdG5zX3N0b3A7CisKKyAgICAgICAgLyogRmluZCBtYXggc2NhbGUgb2YgVE5TIGJhbmRzICovCisgICAgICAgIFNwZWNTY2FsZV93aW5kb3dfdG5zID0gMDsKKyAgICAgICAgdG5zX3N0YXJ0ID0gR2V0TWF4aW11bVRuc0JhbmRzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8tPnNhbXBsaW5nUmF0ZUluZGV4KTsKKyAgICAgICAgdG5zX3N0b3AgPSAwOworICAgICAgICBmb3IgKGZpbHRlcl9pbmRleCA9IDA7CisgICAgICAgICAgICAgZmlsdGVyX2luZGV4IDwgKGludClwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+VG5zRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuTnVtYmVyT2ZGaWx0ZXJzW3dpbmRvd107CisgICAgICAgICAgICAgZmlsdGVyX2luZGV4KyspIHsKKyAgICAgICAgICBmb3IgKGJhbmQgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+VG5zRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAuRmlsdGVyW3dpbmRvd11bZmlsdGVyX2luZGV4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAuU3RhcnRCYW5kOworICAgICAgICAgICAgICAgYmFuZCA8IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5UbnNEYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaWx0ZXJbd2luZG93XVtmaWx0ZXJfaW5kZXhdCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5TdG9wQmFuZDsKKyAgICAgICAgICAgICAgIGJhbmQrKykgeworICAgICAgICAgICAgU3BlY1NjYWxlX3dpbmRvd190bnMgPQorICAgICAgICAgICAgICAgIGZNYXgoU3BlY1NjYWxlX3dpbmRvd190bnMsIChpbnQpcFNmYlNjYWxlW3dpbmRvdyAqIDE2ICsgYmFuZF0pOworICAgICAgICAgIH0KKyAgICAgICAgICAvKiBGaW5kIFROUyBsaW5lIGJvdW5kYXJpZXMgZm9yIGFsbCBUTlMgZmlsdGVycyAqLworICAgICAgICAgIHRuc19zdGFydCA9CisgICAgICAgICAgICAgIGZNaW4odG5zX3N0YXJ0LCAoaW50KXBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5UbnNEYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpbHRlclt3aW5kb3ddW2ZpbHRlcl9pbmRleF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU3RhcnRCYW5kKTsKKyAgICAgICAgICB0bnNfc3RvcCA9CisgICAgICAgICAgICAgIGZNYXgodG5zX3N0b3AsIChpbnQpcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPlRuc0RhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GaWx0ZXJbd2luZG93XVtmaWx0ZXJfaW5kZXhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU3RvcEJhbmQpOworICAgICAgICB9CisgICAgICAgIFNwZWNTY2FsZV93aW5kb3dfdG5zID0gU3BlY1NjYWxlX3dpbmRvd190bnMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5UbnNEYXRhLkdhaW5MZDsKKyAgICAgICAgRkRLX0FTU0VSVCh0bnNfc3RvcCA+PSB0bnNfc3RhcnQpOworICAgICAgICAvKiBDb25zaWRlciBleGlzdGluZyBoZWFkcm9vbSBvZiBhbGwgTURDVCBsaW5lcyBpbnNpZGUgdGhlIFROUyBiYW5kcy4gKi8KKyAgICAgICAgU3BlY1NjYWxlX3dpbmRvd190bnMgLT0KKyAgICAgICAgICAgIGdldFNjYWxlZmFjdG9yKHBTcGVjdHJ1bSArIEJhbmRPZmZzZXRzW3Ruc19zdGFydF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCYW5kT2Zmc2V0c1t0bnNfc3RvcF0gLSBCYW5kT2Zmc2V0c1t0bnNfc3RhcnRdKTsKKyAgICAgICAgaWYgKFNwZWNTY2FsZV93aW5kb3cgPD0gMTcpIHsKKyAgICAgICAgICBTcGVjU2NhbGVfd2luZG93X3RucysrOworICAgICAgICB9CisgICAgICAgIC8qIEFkZCBlbm91Z2ggbWFudGlzc2EgaGVhZCByb29tIHN1Y2ggdGhhdCB0aGUgc3BlY3RydW0gaXMgc3RpbGwKKyAgICAgICAgICAgcmVwcmVzZW50YWJsZSBhZnRlciBhcHBseWluZyBUTlMuICovCisgICAgICAgIFNwZWNTY2FsZV93aW5kb3cgPSBmTWF4KFNwZWNTY2FsZV93aW5kb3csIFNwZWNTY2FsZV93aW5kb3dfdG5zKTsKICAgICAgIH0KIAogICAgICAgLyogc3RvcmUgc2NhbGluZyBvZiBjdXJyZW50IHdpbmRvdyAqLwpAQCAtMjQ3LDc5ICsyOTcsODAgQEAKIAogI2lmZGVmIEZVTkNUSU9OX0NCbG9ja19TY2FsZVNwZWN0cmFsRGF0YV9mdW5jMQogCi0gICAgICBDQmxvY2tfU2NhbGVTcGVjdHJhbERhdGFfZnVuYzEocFNwZWN0cnVtLCBtYXhfYmFuZCwgQmFuZE9mZnNldHMsIFNwZWNTY2FsZV93aW5kb3csIHBTZmJTY2FsZSwgd2luZG93KTsKKyAgICAgIENCbG9ja19TY2FsZVNwZWN0cmFsRGF0YV9mdW5jMShwU3BlY3RydW0sIG1heFNmYnMsIEJhbmRPZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNTY2FsZV93aW5kb3csIHBTZmJTY2FsZSwgd2luZG93KTsKIAotI2Vsc2UgLyogRlVOQ1RJT05fQ0Jsb2NrX1NjYWxlU3BlY3RyYWxEYXRhX2Z1bmMxICovCi0gICAgICBmb3IgKGJhbmQ9MDsgYmFuZCA8IG1heF9iYW5kOyBiYW5kKyspCi0gICAgICB7Ci0gICAgICAgIGludCBzY2FsZSA9IFNwZWNTY2FsZV93aW5kb3cgLSBwU2ZiU2NhbGVbd2luZG93KjE2K2JhbmRdOwotICAgICAgICBpZiAoc2NhbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBmb2xsb3dpbmcgcmVsYXRpb24gY2FuIGJlIHVzZWQgZm9yIG9wdGltaXphdGlvbnM6IChCYW5kT2Zmc2V0c1tpXSU0KSA9PSAwIGZvciBhbGwgaSAqLwotICAgICAgICAgIGludCBtYXhfaW5kZXggPSBCYW5kT2Zmc2V0c1tiYW5kKzFdOwotICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gQmFuZE9mZnNldHNbYmFuZF07IGluZGV4IDwgbWF4X2luZGV4OyBpbmRleCsrKQotICAgICAgICAgIHsKKyNlbHNlICAvKiBGVU5DVElPTl9DQmxvY2tfU2NhbGVTcGVjdHJhbERhdGFfZnVuYzEgKi8KKyAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBtYXhTZmJzOyBiYW5kKyspIHsKKyAgICAgICAgaW50IHNjYWxlID0gZk1pbihERlJBQ1RfQklUUyAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY1NjYWxlX3dpbmRvdyAtIHBTZmJTY2FsZVt3aW5kb3cgKiAxNiArIGJhbmRdKTsKKyAgICAgICAgaWYgKHNjYWxlKSB7CisgICAgICAgICAgRkRLX0FTU0VSVChzY2FsZSA+IDApOworCisgICAgICAgICAgLyogZm9sbG93aW5nIHJlbGF0aW9uIGNhbiBiZSB1c2VkIGZvciBvcHRpbWl6YXRpb25zOgorICAgICAgICAgICAqIChCYW5kT2Zmc2V0c1tpXSU0KSA9PSAwIGZvciBhbGwgaSAqLworICAgICAgICAgIGludCBtYXhfaW5kZXggPSBCYW5kT2Zmc2V0c1tiYW5kICsgMV07CisgICAgICAgICAgRFdPUkRfQUxJR05FRChwU3BlY3RydW0pOworICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gQmFuZE9mZnNldHNbYmFuZF07IGluZGV4IDwgbWF4X2luZGV4OyBpbmRleCsrKSB7CiAgICAgICAgICAgICBwU3BlY3RydW1baW5kZXhdID4+PSBzY2FsZTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KLSNlbmRpZiAgLyogRlVOQ1RJT05fQ0Jsb2NrX1NjYWxlU3BlY3RyYWxEYXRhX2Z1bmMxICovCisjZW5kaWYgLyogRlVOQ1RJT05fQ0Jsb2NrX1NjYWxlU3BlY3RyYWxEYXRhX2Z1bmMxICovCiAgICAgfQogICB9Ci0KIH0KIAotQUFDX0RFQ09ERVJfRVJST1IgQ0Jsb2NrX1JlYWRTZWN0aW9uRGF0YShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgIGZsYWdzKQoteworQUFDX0RFQ09ERVJfRVJST1IgQ0Jsb2NrX1JlYWRTZWN0aW9uRGF0YSgKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywgY29uc3QgVUlOVCBmbGFncykgewogICBpbnQgdG9wLCBiYW5kOwogICBpbnQgc2VjdF9sZW4sIHNlY3RfbGVuX2luY3I7CiAgIGludCBncm91cDsKICAgVUNIQVIgc2VjdF9jYjsKICAgVUNIQVIgKnBDb2RlQm9vayA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2s7CiAgIC8qIEhDUiBpbnB1dCAobG9uZykgKi8KLSAgU0hPUlQgKnBOdW1MaW5lc0luU2VjICAgID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLmFOdW1MaW5lSW5TZWM0SGNyOwotICBpbnQgICAgbnVtTGluZXNJblNlY0lkeCAgPSAwOwotICBVQ0hBUiAqcEhjckNvZGVCb29rICAgICAgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMuYUNvZGVCb29rczRIY3I7Ci0gIGNvbnN0IFNIT1JUICpCYW5kT2Zmc2V0cyA9IEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKTsKKyAgU0hPUlQgKnBOdW1MaW5lc0luU2VjID0KKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5hTnVtTGluZUluU2VjNEhjcjsKKyAgaW50IG51bUxpbmVzSW5TZWNJZHggPSAwOworICBVQ0hBUiAqcEhjckNvZGVCb29rID0KKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5hQ29kZUJvb2tzNEhjcjsKKyAgY29uc3QgU0hPUlQgKkJhbmRPZmZzZXRzID0gR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cygKKyAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbyk7CiAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5udW1iZXJTZWN0aW9uID0gMDsKICAgQUFDX0RFQ09ERVJfRVJST1IgRXJyb3JTdGF0dXMgPSBBQUNfREVDX09LOwogCi0gIEZES21lbWNsZWFyKHBDb2RlQm9vaywgc2l6ZW9mKFVDSEFSKSooOCoxNikpOworICBGREttZW1jbGVhcihwQ29kZUJvb2ssIHNpemVvZihVQ0hBUikgKiAoOCAqIDE2KSk7CiAKLSAgY29uc3QgaW50IG5iaXRzID0gKElzTG9uZ0Jsb2NrKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSA9PSAxKSA/IDUgOiAzOworICBjb25zdCBpbnQgbmJpdHMgPQorICAgICAgKElzTG9uZ0Jsb2NrKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSA9PSAxKSA/IDUgOiAzOwogCi0gIGludCBzZWN0X2VzY192YWwgPSAoMSA8PCBuYml0cykgLSAxIDsKKyAgaW50IHNlY3RfZXNjX3ZhbCA9ICgxIDw8IG5iaXRzKSAtIDE7CiAKLSAgVUNIQVIgU2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkID0gR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKLSAgZm9yIChncm91cD0wOyBncm91cDxHZXRXaW5kb3dHcm91cHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOyBncm91cCsrKQotICB7Ci0gICAgZm9yIChiYW5kPTA7IGJhbmQgPCBTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7ICkKLSAgICB7CisgIFVDSEFSIFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCA9CisgICAgICBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOworICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBHZXRXaW5kb3dHcm91cHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOworICAgICAgIGdyb3VwKyspIHsKKyAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgU2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkOykgewogICAgICAgc2VjdF9sZW4gPSAwOwotICAgICAgaWYgKCBmbGFncyAmIEFDX0VSX1ZDQjExICkgIHsKLSAgICAgICAgc2VjdF9jYiA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHNlY3RfY2IgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOworICAgICAgaWYgKGZsYWdzICYgQUNfRVJfVkNCMTEpIHsKKyAgICAgICAgc2VjdF9jYiA9IChVQ0hBUilGREtyZWFkQml0cyhicywgNSk7CisgICAgICB9IGVsc2UKKyAgICAgICAgc2VjdF9jYiA9IChVQ0hBUilGREtyZWFkQml0cyhicywgNCk7CiAKLSAgICAgIGlmICggKChmbGFncyAmIEFDX0VSX1ZDQjExKSA9PSAwKSB8fCAoIHNlY3RfY2IgPCAxMSApIHx8ICgoc2VjdF9jYiA+IDExKSAmJiAoc2VjdF9jYiA8IDE2KSkgKSB7CisgICAgICBpZiAoKChmbGFncyAmIEFDX0VSX1ZDQjExKSA9PSAwKSB8fCAoc2VjdF9jYiA8IDExKSB8fAorICAgICAgICAgICgoc2VjdF9jYiA+IDExKSAmJiAoc2VjdF9jYiA8IDE2KSkpIHsKICAgICAgICAgc2VjdF9sZW5faW5jciA9IEZES3JlYWRCaXRzKGJzLCBuYml0cyk7Ci0gICAgICAgIHdoaWxlIChzZWN0X2xlbl9pbmNyID09IHNlY3RfZXNjX3ZhbCkKLSAgICAgICAgeworICAgICAgICB3aGlsZSAoc2VjdF9sZW5faW5jciA9PSBzZWN0X2VzY192YWwpIHsKICAgICAgICAgICBzZWN0X2xlbiArPSBzZWN0X2VzY192YWw7CiAgICAgICAgICAgc2VjdF9sZW5faW5jciA9IEZES3JlYWRCaXRzKGJzLCBuYml0cyk7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgeworICAgICAgfSBlbHNlIHsKICAgICAgICAgc2VjdF9sZW5faW5jciA9IDE7CiAgICAgICB9CiAKICAgICAgIHNlY3RfbGVuICs9IHNlY3RfbGVuX2luY3I7CiAKLQogICAgICAgdG9wID0gYmFuZCArIHNlY3RfbGVuOwogCiAgICAgICBpZiAoZmxhZ3MgJiBBQ19FUl9IQ1IpIHsKQEAgLTMyNywxMCArMzc4LDEzIEBACiAgICAgICAgIGlmIChudW1MaW5lc0luU2VjSWR4ID49IE1BWF9TRkJfSENSKSB7CiAgICAgICAgICAgcmV0dXJuIEFBQ19ERUNfUEFSU0VfRVJST1I7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHRvcCA+IChpbnQpR2V0TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzKAorICAgICAgICAgICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbykpIHsKKyAgICAgICAgICByZXR1cm4gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgfQogICAgICAgICBwTnVtTGluZXNJblNlY1tudW1MaW5lc0luU2VjSWR4XSA9IEJhbmRPZmZzZXRzW3RvcF0gLSBCYW5kT2Zmc2V0c1tiYW5kXTsKICAgICAgICAgbnVtTGluZXNJblNlY0lkeCsrOwotICAgICAgICBpZiAoc2VjdF9jYiA9PSBCT09LU0NMKQotICAgICAgICB7CisgICAgICAgIGlmIChzZWN0X2NiID09IEJPT0tTQ0wpIHsKICAgICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0NPREVfQk9PSzsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAqcEhjckNvZGVCb29rKysgPSBzZWN0X2NiOwpAQCAtMzM5LDI1OSArMzkzLDM0MCBAQAogICAgICAgfQogCiAgICAgICAvKiBDaGVjayBzcGVjdHJhbCBsaW5lIGxpbWl0cyAqLwotICAgICAgaWYgKElzTG9uZ0Jsb2NrKCAmKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pICkpCi0gICAgICB7CisgICAgICBpZiAoSXNMb25nQmxvY2soJihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSkpIHsKICAgICAgICAgaWYgKHRvcCA+IDY0KSB7CiAgICAgICAgICAgcmV0dXJuIEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOwogICAgICAgICB9CiAgICAgICB9IGVsc2UgeyAvKiBzaG9ydCBibG9jayAqLwotICAgICAgICBpZiAodG9wICsgZ3JvdXAqMTYgPiAoOCAqIDE2KSkgeworICAgICAgICBpZiAodG9wICsgZ3JvdXAgKiAxNiA+ICg4ICogMTYpKSB7CiAgICAgICAgICAgcmV0dXJuIEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOwogICAgICAgICB9CiAgICAgICB9CiAKICAgICAgIC8qIENoZWNrIGlmIGRlY29kZWQgY29kZWJvb2sgaW5kZXggaXMgZmVhc2libGUgKi8KLSAgICAgIGlmICggKHNlY3RfY2IgPT0gQk9PS1NDTCkKLSAgICAgICB8fCAoIChzZWN0X2NiID09IElOVEVOU0lUWV9IQ0IgfHwgc2VjdF9jYiA9PSBJTlRFTlNJVFlfSENCMikgJiYgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyA9PSAwKQotICAgICAgICAgKQotICAgICAgeworICAgICAgaWYgKChzZWN0X2NiID09IEJPT0tTQ0wpIHx8CisgICAgICAgICAgKChzZWN0X2NiID09IElOVEVOU0lUWV9IQ0IgfHwgc2VjdF9jYiA9PSBJTlRFTlNJVFlfSENCMikgJiYKKyAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyA9PSAwKSkgewogICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0NPREVfQk9PSzsKICAgICAgIH0KIAogICAgICAgLyogU3RvcmUgY29kZWJvb2sgaW5kZXggKi8KLSAgICAgIGZvciAoOyBiYW5kIDwgdG9wOyBiYW5kKyspCi0gICAgICB7Ci0gICAgICAgIHBDb2RlQm9va1tncm91cCoxNitiYW5kXSA9IHNlY3RfY2I7CisgICAgICBmb3IgKDsgYmFuZCA8IHRvcDsgYmFuZCsrKSB7CisgICAgICAgIHBDb2RlQm9va1tncm91cCAqIDE2ICsgYmFuZF0gPSBzZWN0X2NiOwogICAgICAgfQogICAgIH0KICAgfQogCi0KICAgcmV0dXJuIEVycm9yU3RhdHVzOwogfQogCiAvKiBtc286IHByb3ZpZGVzIGEgZmFzdGVyIHdheSB0byBpLXF1YW50aXplIGEgd2hvbGUgYmFuZCBpbiBvbmUgZ28gKi8KIAogLyoqCi0gKiBcYnJpZWYgaW52ZXJzZSBxdWFudGl6ZSBvbmUgc2ZiLiBFYWNoIHZhbHVlIG9mIHRoZSBzZmIgaXMgcHJvY2Vzc2VkIGFjY29yZGluZyB0byB0aGUKLSAqICAgICAgICBmb3JtdWxhOiBzcGVjdHJ1bVtpXSA9IFNpZ24oc3BlY3RydW1baV0pICogTWF0aXNzYShzcGVjdHJ1bVtpXSleKDQvMykgKiAyXihsc2IvNCkuCisgKiBcYnJpZWYgaW52ZXJzZSBxdWFudGl6ZSBvbmUgc2ZiLiBFYWNoIHZhbHVlIG9mIHRoZSBzZmIgaXMgcHJvY2Vzc2VkIGFjY29yZGluZworICogdG8gdGhlIGZvcm11bGE6IHNwZWN0cnVtW2ldID0gU2lnbihzcGVjdHJ1bVtpXSkgKiBNYXRpc3NhKHNwZWN0cnVtW2ldKV4oNC8zKQorICogKiAyXihsc2IvNCkuCiAgKiBccGFyYW0gc3BlY3RydW0gcG9pbnRlciB0byBmaXJzdCBsaW5lIG9mIHRoZSBzZmIgdG8gYmUgaW52ZXJzZSBxdWFudGl6ZWQuCiAgKiBccGFyYW0gbm9MaW5lcyBudW1iZXIgb2YgbGluZXMgYmVsb25naW5nIHRvIHRoZSBzZmIuCiAgKiBccGFyYW0gbHNiIGxhc3QgMiBiaXRzIG9mIHRoZSBzY2FsZSBmYWN0b3Igb2YgdGhlIHNmYi4KICAqIFxwYXJhbSBzY2FsZSBtYXggYWxsb3dlZCBzaGlmdCBzY2FsZSBmb3IgdGhlIHNmYi4KICAqLwotc3RhdGljCi12b2lkIEludmVyc2VRdWFudGl6ZUJhbmQoIEZJWFBfREJMICogUkVTVFJJQ1Qgc3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9MaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBsc2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGUgKQotewotICAgIGNvbnN0IEZJWFBfREJMICogUkVTVFJJQ1QgSW52ZXJzZVF1YW50VGFibGVyPShGSVhQX0RCTCAqKUludmVyc2VRdWFudFRhYmxlOwotICAgIGNvbnN0IEZJWFBfREJMICogUkVTVFJJQ1QgTWFudGlzc2FUYWJsZXI9KEZJWFBfREJMICopTWFudGlzc2FUYWJsZVtsc2JdOwotICAgIGNvbnN0IFNDSEFSKiBSRVNUUklDVCBFeHBvbmVudFRhYmxlcj0oU0NIQVIqKUV4cG9uZW50VGFibGVbbHNiXTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBJbnZlcnNlUXVhbnRpemVCYW5kKAorICAgIEZJWFBfREJMICpSRVNUUklDVCBzcGVjdHJ1bSwgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIEludmVyc2VRdWFudFRhYmxlciwKKyAgICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgTWFudGlzc2FUYWJsZXIsCisgICAgY29uc3QgU0NIQVIgKlJFU1RSSUNUIEV4cG9uZW50VGFibGVyLCBJTlQgbm9MaW5lcywgSU5UIHNjYWxlKSB7CisgIHNjYWxlID0gc2NhbGUgKyAxOyAvKiArMSB0byBjb21wZW5zYXRlIGZNdWx0RGl2MiBzaGlmdC1yaWdodCBpbiBsb29wICovCiAKLSAgICBGSVhQX0RCTCAqcHRyID0gc3BlY3RydW07Ci0gICAgRklYUF9EQkwgc2lnbmVkVmFsdWU7CisgIEZJWFBfREJMICpSRVNUUklDVCBwdHIgPSBzcGVjdHJ1bTsKKyAgRklYUF9EQkwgc2lnbmVkVmFsdWU7CiAKLSAgICBGREtfQVNTRVJUKG5vTGluZXM+Mik7Ci0gICAgZm9yIChJTlQgaT1ub0xpbmVzOyBpLS07ICkKLSAgICB7Ci0gICAgICAgIGlmICgoc2lnbmVkVmFsdWUgPSAqcHRyKyspICE9IEZMMkZYQ09OU1RfREJMKDApKQotICAgICAgICB7Ci0gICAgICAgICAgRklYUF9EQkwgdmFsdWUgPSBmQWJzKHNpZ25lZFZhbHVlKTsKLSAgICAgICAgICBVSU5UIGZyZWVCaXRzID0gQ250TGVhZGluZ1plcm9zKHZhbHVlKTsKLSAgICAgICAgICBVSU5UIGV4cG9uZW50ID0gMzIgLSBmcmVlQml0czsKKyAgZm9yIChJTlQgaSA9IG5vTGluZXM7IGktLTspIHsKKyAgICBpZiAoKHNpZ25lZFZhbHVlID0gKnB0cisrKSAhPSBGTDJGWENPTlNUX0RCTCgwKSkgeworICAgICAgRklYUF9EQkwgdmFsdWUgPSBmQWJzKHNpZ25lZFZhbHVlKTsKKyAgICAgIFVJTlQgZnJlZUJpdHMgPSBDbnRMZWFkaW5nWmVyb3ModmFsdWUpOworICAgICAgVUlOVCBleHBvbmVudCA9IDMyIC0gZnJlZUJpdHM7CiAKLSAgICAgICAgICBVSU5UIHggPSAoVUlOVCkgKExPTkcpdmFsdWUgPDwgKElOVCkgZnJlZUJpdHM7Ci0gICAgICAgICAgeCA8PD0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hpZnQgb3V0IHNpZ24gYml0IHRvIGF2b2lkIG1hc2tpbmcgbGF0ZXIgb24gKi8KLSAgICAgICAgICBVSU5UIHRhYmxlSW5kZXggPSB4ID4+IDI0OwotICAgICAgICAgIHggPSAoeCA+PiAyMCkgJiAgMHgwRjsKKyAgICAgIFVJTlQgeCA9IChVSU5UKShMT05HKXZhbHVlIDw8IChJTlQpZnJlZUJpdHM7CisgICAgICB4IDw8PSAxOyAvKiBzaGlmdCBvdXQgc2lnbiBiaXQgdG8gYXZvaWQgbWFza2luZyBsYXRlciBvbiAqLworICAgICAgVUlOVCB0YWJsZUluZGV4ID0geCA+PiAyNDsKKyAgICAgIHggPSAoeCA+PiAyMCkgJiAweDBGOwogCi0gICAgICAgICAgVUlOVCByMD0oVUlOVCkoTE9ORylJbnZlcnNlUXVhbnRUYWJsZXJbdGFibGVJbmRleCswXTsKLSAgICAgICAgICBVSU5UIHIxPShVSU5UKShMT05HKUludmVyc2VRdWFudFRhYmxlclt0YWJsZUluZGV4KzFdOwotICAgICAgICAgIFVJTlQgdGVtcD0gKHIxIC0gcjApKnggKyAocjAgPDwgNCk7CisgICAgICBVSU5UIHIwID0gKFVJTlQpKExPTkcpSW52ZXJzZVF1YW50VGFibGVyW3RhYmxlSW5kZXggKyAwXTsKKyAgICAgIFVJTlQgcjEgPSAoVUlOVCkoTE9ORylJbnZlcnNlUXVhbnRUYWJsZXJbdGFibGVJbmRleCArIDFdOworICAgICAgVUlOVCB0ZW1wID0gKHIxIC0gcjApICogeCArIChyMCA8PCA0KTsKIAotICAgICAgICAgIHZhbHVlID0gZk11bHREaXYyKChGSVhQX0RCTCl0ZW1wLCBNYW50aXNzYVRhYmxlcltleHBvbmVudF0pOworICAgICAgdmFsdWUgPSBmTXVsdERpdjIoKEZJWFBfREJMKXRlbXAsIE1hbnRpc3NhVGFibGVyW2V4cG9uZW50XSk7CiAKLSAgICAgICAgICAvKiArIDEgY29tcGVuc2F0ZXMgZk11bHREaXYyKCkgKi8KLSAgICAgICAgICBzY2FsZVZhbHVlSW5QbGFjZSgmdmFsdWUsIHNjYWxlICsgRXhwb25lbnRUYWJsZXJbZXhwb25lbnRdICsgMSk7CisgICAgICAvKiArIDEgY29tcGVuc2F0ZXMgZk11bHREaXYyKCkgKi8KKyAgICAgIHNjYWxlVmFsdWVJblBsYWNlKCZ2YWx1ZSwgc2NhbGUgKyBFeHBvbmVudFRhYmxlcltleHBvbmVudF0pOwogCi0gICAgICAgICAgc2lnbmVkVmFsdWUgPSAoc2lnbmVkVmFsdWUgPCAoRklYUF9EQkwpMCkgPyAtdmFsdWUgOiB2YWx1ZTsKLSAgICAgICAgICBwdHJbLTFdID0gc2lnbmVkVmFsdWU7Ci0gICAgICAgIH0KKyAgICAgIHNpZ25lZFZhbHVlID0gKHNpZ25lZFZhbHVlIDwgKEZJWFBfREJMKTApID8gLXZhbHVlIDogdmFsdWU7CisgICAgICBwdHJbLTFdID0gc2lnbmVkVmFsdWU7CiAgICAgfQorICB9CiB9CiAKLUFBQ19ERUNPREVSX0VSUk9SIENCbG9ja19JbnZlcnNlUXVhbnRpemVTcGVjdHJhbERhdGEoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8pCi17CitzdGF0aWMgaW5saW5lIEZJWFBfREJMIG1heGFic19EKGNvbnN0IEZJWFBfREJMICpwU3BlY3RyYWxDb2VmZmljaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG5vTGluZXMpIHsKKyAgLyogRmluZCBtYXggc3BlY3RyYWwgbGluZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBzZmIgKi8KKyAgRklYUF9EQkwgbG9jTWF4ID0gKEZJWFBfREJMKTA7CisgIGludCBpOworCisgIERXT1JEX0FMSUdORUQocFNwZWN0cmFsQ29lZmZpY2llbnQpOworCisgIGZvciAoaSA9IG5vTGluZXM7IGktLSA+IDA7KSB7CisgICAgLyogRXhwZW5zaXZlIG1lbW9yeSBhY2Nlc3MgKi8KKyAgICBsb2NNYXggPSBmTWF4KGZpeHBfYWJzKHBTcGVjdHJhbENvZWZmaWNpZW50W2ldKSwgbG9jTWF4KTsKKyAgfQorCisgIHJldHVybiBsb2NNYXg7Cit9CisKK0FBQ19ERUNPREVSX0VSUk9SIENCbG9ja19JbnZlcnNlUXVhbnRpemVTcGVjdHJhbERhdGEoCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywgVUNIQVIgKmJhbmRfaXNfbm9pc2UsCisgICAgVUNIQVIgYWN0aXZlX2JhbmRfc2VhcmNoKSB7CiAgIGludCB3aW5kb3csIGdyb3VwLCBncm91cHdpbiwgYmFuZDsKLSAgaW50IFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCA9IEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7CisgIGludCBTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQgPQorICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKICAgVUNIQVIgKlJFU1RSSUNUIHBDb2RlQm9vayA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2s7CiAgIFNIT1JUICpSRVNUUklDVCBwU2ZiU2NhbGUgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNmYlNjYWxlOwogICBTSE9SVCAqUkVTVFJJQ1QgcFNjYWxlRmFjdG9yID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcjsKLSAgY29uc3QgU0hPUlQgKlJFU1RSSUNUIEJhbmRPZmZzZXRzID0gR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8pOworICBjb25zdCBTSE9SVCAqUkVTVFJJQ1QgQmFuZE9mZnNldHMgPSBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKAorICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKTsKKyAgY29uc3QgU0hPUlQgdG90YWxfYmFuZHMgPQorICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kc1RvdGFsKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKIAotICBGREttZW1jbGVhcihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNmYlNjYWxlLCAoOCoxNikqc2l6ZW9mKFNIT1JUKSk7CisgIEZES21lbWNsZWFyKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2ZiU2NhbGUsCisgICAgICAgICAgICAgICg4ICogMTYpICogc2l6ZW9mKFNIT1JUKSk7CiAKLSAgZm9yICh3aW5kb3c9MCwgZ3JvdXA9MDsgZ3JvdXAgPCBHZXRXaW5kb3dHcm91cHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOyBncm91cCsrKQotICB7Ci0gICAgZm9yIChncm91cHdpbj0wOyBncm91cHdpbiA8IEdldFdpbmRvd0dyb3VwTGVuZ3RoKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLGdyb3VwKTsgZ3JvdXB3aW4rKywgd2luZG93KyspCi0gICAgeworICBmb3IgKHdpbmRvdyA9IDAsIGdyb3VwID0gMDsKKyAgICAgICBncm91cCA8IEdldFdpbmRvd0dyb3VwcygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7IGdyb3VwKyspIHsKKyAgICBmb3IgKGdyb3Vwd2luID0gMDsgZ3JvdXB3aW4gPCBHZXRXaW5kb3dHcm91cExlbmd0aCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sIGdyb3VwKTsKKyAgICAgICAgIGdyb3Vwd2luKyssIHdpbmRvdysrKSB7CiAgICAgICAvKiBpbnZlcnNlIHF1YW50aXphdGlvbiAqLwotICAgICAgZm9yIChiYW5kPTA7IGJhbmQgPCBTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7IGJhbmQrKykKLSAgICAgIHsKLSAgICAgICAgRklYUF9EQkwgKnBTcGVjdHJhbENvZWZmaWNpZW50ID0gU1BFQyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCwgd2luZG93LCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoKSArIEJhbmRPZmZzZXRzW2JhbmRdOworICAgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZDsgYmFuZCsrKSB7CisgICAgICAgIEZJWFBfREJMICpwU3BlY3RyYWxDb2VmZmljaWVudCA9CisgICAgICAgICAgICBTUEVDKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50LCB3aW5kb3csCisgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGgpICsKKyAgICAgICAgICAgIEJhbmRPZmZzZXRzW2JhbmRdOworICAgICAgICBGSVhQX0RCTCBsb2NNYXg7CiAKLSAgICAgICAgaW50IG5vTGluZXMgPSBCYW5kT2Zmc2V0c1tiYW5kKzFdIC0gQmFuZE9mZnNldHNbYmFuZF07Ci0gICAgICAgIGludCBibmRzID0gZ3JvdXAqMTYrYmFuZDsKLSAgICAgICAgaW50IGk7CisgICAgICAgIGNvbnN0IGludCBub0xpbmVzID0gQmFuZE9mZnNldHNbYmFuZCArIDFdIC0gQmFuZE9mZnNldHNbYmFuZF07CisgICAgICAgIGNvbnN0IGludCBibmRzID0gZ3JvdXAgKiAxNiArIGJhbmQ7CiAKLSAgICAgICAgaWYgKChwQ29kZUJvb2tbYm5kc10gPT0gWkVST19IQ0IpCi0gICAgICAgICB8fCAocENvZGVCb29rW2JuZHNdID09IElOVEVOU0lUWV9IQ0IpCi0gICAgICAgICB8fCAocENvZGVCb29rW2JuZHNdID09IElOVEVOU0lUWV9IQ0IyKQotICAgICAgICAgICApCisgICAgICAgIGlmICgocENvZGVCb29rW2JuZHNdID09IFpFUk9fSENCKSB8fAorICAgICAgICAgICAgKHBDb2RlQm9va1tibmRzXSA9PSBJTlRFTlNJVFlfSENCKSB8fAorICAgICAgICAgICAgKHBDb2RlQm9va1tibmRzXSA9PSBJTlRFTlNJVFlfSENCMikpCiAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgaWYgKHBDb2RlQm9va1tibmRzXSA9PSBOT0lTRV9IQ0IpCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBMZWF2ZSBoZWFkcm9vbSBmb3IgUE5TIHZhbHVlcy4gKyAxIGJlY2F1c2UgY2VpbChsb2cyKDJeKDAuMjUqMykpKSA9IDEsCi0gICAgICAgICAgICAgd29yc3QgY2FzZSBvZiBhZGRpdGlvbmFsIGhlYWRyb29tIHJlcXVpcmVkIGJlY2F1c2Ugb2YgdGhlIHNjYWxlZmFjdG9yLiAqLwotICAgICAgICAgIHBTZmJTY2FsZVt3aW5kb3cqMTYrYmFuZF0gPSAocFNjYWxlRmFjdG9yIFtibmRzXSA+PiAyKSArIDEgOworICAgICAgICBpZiAocENvZGVCb29rW2JuZHNdID09IE5PSVNFX0hDQikgeworICAgICAgICAgIC8qIExlYXZlIGhlYWRyb29tIGZvciBQTlMgdmFsdWVzLiArIDEgYmVjYXVzZSBjZWlsKGxvZzIoMl4oMC4yNSozKSkpID0KKyAgICAgICAgICAgICAxLCB3b3JzdCBjYXNlIG9mIGFkZGl0aW9uYWwgaGVhZHJvb20gcmVxdWlyZWQgYmVjYXVzZSBvZiB0aGUKKyAgICAgICAgICAgICBzY2FsZWZhY3Rvci4gKi8KKyAgICAgICAgICBwU2ZiU2NhbGVbd2luZG93ICogMTYgKyBiYW5kXSA9IChwU2NhbGVGYWN0b3JbYm5kc10gPj4gMikgKyAxOwogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgLyogRmluZCBtYXggc3BlY3RyYWwgbGluZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBzZmIgKi8KLSAgICAgICAgRklYUF9EQkwgbG9jTWF4ID0gKEZJWFBfREJMKTA7CisgICAgICAgIGxvY01heCA9IG1heGFic19EKHBTcGVjdHJhbENvZWZmaWNpZW50LCBub0xpbmVzKTsKIAotICAgICAgICBmb3IgKGkgPSBub0xpbmVzOyBpLS0gOyApIHsKLSAgICAgICAgICAvKiBFeHBlbnNpdmUgbWVtb3J5IGFjY2VzcyAqLwotICAgICAgICAgIGxvY01heCA9IGZNYXgoZml4cF9hYnMocFNwZWN0cmFsQ29lZmZpY2llbnRbaV0pLCBsb2NNYXgpOworICAgICAgICBpZiAoYWN0aXZlX2JhbmRfc2VhcmNoKSB7CisgICAgICAgICAgaWYgKGxvY01heCAhPSBGSVhQX0RCTCgwKSkgeworICAgICAgICAgICAgYmFuZF9pc19ub2lzZVtncm91cCAqIDE2ICsgYmFuZF0gPSAwOworICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8qIENoZWFwIHJvYnVzdG5lc3MgaW1wcm92ZW1lbnQgLSBEbyBub3QgcmVtb3ZlISEhICovCiAgICAgICAgIGlmIChmaXhwX2Ficyhsb2NNYXgpID4gKEZJWFBfREJMKU1BWF9RVUFOVElaRURfVkFMVUUpIHsKLSAgICAgICAgICByZXR1cm4gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CisgICAgICAgICAgcmV0dXJuIEFBQ19ERUNfUEFSU0VfRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICAvKgotICAgICAgICAgICBUaGUgaW52ZXJzZSBxdWFudGl6ZWQgc3BlY3RyYWwgbGluZXMgYXJlIGRlZmluZWQgYnk6Ci0gICAgICAgIHBTcGVjdHJhbENvZWZmaWNpZW50W2ldID0gU2lnbihwU3BlY3RyYWxDb2VmZmljaWVudFtpXSkgKiAyXigwLjI1KnBTY2FsZUZhY3RvcltibmRzXSkgKiBwU3BlY3RyYWxDb2VmZmljaWVudFtpXV4oNC8zKQotICAgICAgICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG86Ci0gICAgICAgIHBTcGVjdHJhbENvZWZmaWNpZW50W2ldICAgID0gU2lnbihwU3BlY3RyYWxDb2VmZmljaWVudFtpXSkgKiAoMl4ocFNjYWxlRmFjdG9yW2JuZHNdICUgNCkgKiBwU3BlY3RyYWxDb2VmZmljaWVudFtpXV4oNC8zKSkKLSAgICAgICAgcFNwZWN0cmFsQ29lZmZpY2llbnRfZVtpXSArPSBwU2NhbGVGYWN0b3JbYm5kc10vNAorICAgICAgICAvKiBBZGRlZCBieSBZb3VsaXkgTmlub3Y6CisgICAgICAgIFRoZSBpbnZlcnNlIHF1YW50aXphdGlvbiBvcGVyYXRpb24gaXMgZ2l2ZW4gYnkgKElTTy9JRUMgMTQ0OTYtMzoyMDA5KEUpKQorICAgICAgICBieToKKworICAgICAgICB4X2ludnF1YW50PVNpZ24oeF9xdWFudCkuIGFicyh4X3F1YW50KV4oNC8zKQorCisgICAgICAgIFdlIGFwcGx5IGEgZ2FpbiwgZGVyaXZlZCBmcm9tIHRoZSBzY2FsZSBmYWN0b3IgZm9yIHRoZSBwYXJ0aWN1bGFyIHNmYiwKKyAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CisKKyAgICAgICAgZ2Fpbj0yXigwLjI1KlNjYWxlRmFjdG9yKQorCisgICAgICAgIFNvLCBhZnRlciBzY2FsaW5nIHdlIGhhdmU6CisKKyAgICAgICAgeF9yZXNjYWxlPWdhaW4qeF9pbnZxdWFudD1TaWduKHhfcXVhbnQpKjJeKDAuMjUqU2NhbGVGYWN0b3IpKmFicyhzX3F1YW50KV4oNC8zKQorCisgICAgICAgIFdlIGNvdWxkIHJlcHJlc2VudCB0aGUgU2NhbGVGYWN0b3IgYXM6CisKKyAgICAgICAgU2NhbGVGYWN0b3I9IChTY2FsZUZhY3RvciA+PiAyKSo0ICsgU2NhbGVGYWN0b3IgJTQKKworICAgICAgICBXaGVuIHdlIHN1YnN0aXR1dGUgaXQgd2UgZ2V0OgorCisgICAgICAgIHhfcmVzY2FsZT1TaWduKHhfcXVhbnQpKjJeKFNjYWxlRmFjdG9yPj4yKSogKAorICAgICAgICAyXigwLjI1KihTY2FsZUZhY3RvciU0KSkqYWJzKHNfcXVhbnQpXig0LzMpKQorCisgICAgICAgIFdoZW4gd2Ugc2V0OiBtc2I9KFNjYWxlRmFjdG9yPj4yKSBhbmQgbHNiPShTY2FsZUZhY3RvciU0KSwgd2Ugb2J0YWluOgorCisgICAgICAgIHhfcmVzY2FsZT1TaWduKHhfcXVhbnQpKigyXm1zYikqICggMl4obHNiLzQpKmFicyhzX3F1YW50KV4oNC8zKSkKKworICAgICAgICBUaGUgcmVzY2FsZWQgb3V0cHV0IGNhbiBiZSByZXByZXNlbnRlZCBieToKKyAgICAgICAgICAgbWFudGlzc2EgOiBTaWduKHhfcXVhbnQpKiggMl4obHNiLzQpKmFicyhzX3F1YW50KV4oNC8zKSkKKyAgICAgICAgICAgZXhwb25lbnQgOigyXm1zYikKKwogICAgICAgICAqLwotICAgICAgICB7Ci0gICAgICAgICAgaW50IG1zYiA9IHBTY2FsZUZhY3RvciBbYm5kc10gPj4gMiA7Ci0gICAgICAgICAgaW50IGxzYiA9IHBTY2FsZUZhY3RvciBbYm5kc10gJiAweDAzIDsKIAotICAgICAgICAgIGludCBzY2FsZSA9IEdldFNjYWxlRnJvbVZhbHVlKGxvY01heCwgbHNiKTsKKyAgICAgICAgaW50IG1zYiA9IHBTY2FsZUZhY3RvcltibmRzXSA+PiAyOwogCi0gICAgICAgICAgcFNmYlNjYWxlW3dpbmRvdyoxNitiYW5kXSA9IG1zYiAtIHNjYWxlOwotICAgICAgICAgIEludmVyc2VRdWFudGl6ZUJhbmQocFNwZWN0cmFsQ29lZmZpY2llbnQsIG5vTGluZXMsIGxzYiwgc2NhbGUpOworICAgICAgICAvKiBJbnZlcnNlIHF1YW50aXplIGJhbmQgb25seSBpZiBpdCBpcyBub3QgZW1wdHkgKi8KKyAgICAgICAgaWYgKGxvY01heCAhPSBGSVhQX0RCTCgwKSkgeworICAgICAgICAgIGludCBsc2IgPSBwU2NhbGVGYWN0b3JbYm5kc10gJiAweDAzOworCisgICAgICAgICAgaW50IHNjYWxlID0gRXZhbHVhdGVQb3dlcjQzKCZsb2NNYXgsIGxzYik7CisKKyAgICAgICAgICBzY2FsZSA9IENudExlYWRpbmdaZXJvcyhsb2NNYXgpIC0gc2NhbGUgLSAyOworCisgICAgICAgICAgcFNmYlNjYWxlW3dpbmRvdyAqIDE2ICsgYmFuZF0gPSBtc2IgLSBzY2FsZTsKKyAgICAgICAgICBJbnZlcnNlUXVhbnRpemVCYW5kKHBTcGVjdHJhbENvZWZmaWNpZW50LCBJbnZlcnNlUXVhbnRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbnRpc3NhVGFibGVbbHNiXSwgRXhwb25lbnRUYWJsZVtsc2JdLCBub0xpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBTZmJTY2FsZVt3aW5kb3cgKiAxNiArIGJhbmRdID0gbXNiOwogICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9CiAKKyAgICAgIH0gLyogZm9yIChiYW5kPTA7IGJhbmQgPCBTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7IGJhbmQrKykgKi8KKworICAgICAgLyogTWFrZSBzdXJlIHRoZSBhcnJheSBpcyBjbGVhcmVkIHRvIHRoZSBlbmQgKi8KKyAgICAgIFNIT1JUIHN0YXJ0X2NsZWFyID0gQmFuZE9mZnNldHNbU2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkXTsKKyAgICAgIFNIT1JUIGVuZF9jbGVhciA9IEJhbmRPZmZzZXRzW3RvdGFsX2JhbmRzXTsKKyAgICAgIGludCBkaWZmX2NsZWFyID0gKGludCkoZW5kX2NsZWFyIC0gc3RhcnRfY2xlYXIpOworICAgICAgRklYUF9EQkwgKnBTcGVjdHJhbENvZWZmaWNpZW50ID0KKyAgICAgICAgICBTUEVDKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50LCB3aW5kb3csCisgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoKSArCisgICAgICAgICAgc3RhcnRfY2xlYXI7CisgICAgICBGREttZW1jbGVhcihwU3BlY3RyYWxDb2VmZmljaWVudCwgZGlmZl9jbGVhciAqIHNpemVvZihGSVhQX0RCTCkpOworCisgICAgfSAvKiBmb3IgKGdyb3Vwd2luPTA7IGdyb3Vwd2luIDwKKyAgICAgICAgIEdldFdpbmRvd0dyb3VwTGVuZ3RoKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLGdyb3VwKTsKKyAgICAgICAgIGdyb3Vwd2luKyssIHdpbmRvdysrKSAqLworICB9ICAgLyogZm9yICh3aW5kb3c9MCwgZ3JvdXA9MDsgZ3JvdXAgPAorICAgICAgICAgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsgZ3JvdXArKykqLwogCiAgIHJldHVybiBBQUNfREVDX09LOwogfQogCitBQUNfREVDT0RFUl9FUlJPUiBDQmxvY2tfUmVhZFNwZWN0cmFsRGF0YSgKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywgY29uc3QgVUlOVCBmbGFncykgeworICBpbnQgaW5kZXgsIGk7CisgIGNvbnN0IFNIT1JUICpSRVNUUklDVCBCYW5kT2Zmc2V0cyA9IEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMoCisgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8pOwogCi1BQUNfREVDT0RFUl9FUlJPUiAgQ0Jsb2NrX1JlYWRTcGVjdHJhbERhdGEoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICBmbGFncykKLXsKLSAgaW50IGksaW5kZXg7Ci0gIGludCB3aW5kb3csZ3JvdXAsZ3JvdXB3aW4sZ3JvdXBvZmZzZXQsYmFuZDsKLSAgVUNIQVIgKlJFU1RSSUNUIHBDb2RlQm9vayA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2s7Ci0gIGNvbnN0IFNIT1JUICpSRVNUUklDVCBCYW5kT2Zmc2V0cyA9IEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKTsKLQotICBTUEVDVFJBTF9QVFIgcFNwZWN0cmFsQ29lZmZpY2llbnQgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudDsKLSAgRklYUF9EQkwgbG9jTWF4OwotCi0gIGludCBTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQgPSBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOworICBTUEVDVFJBTF9QVFIgcFNwZWN0cmFsQ29lZmZpY2llbnQgPQorICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQ7CiAKICAgRkRLX0FTU0VSVChCYW5kT2Zmc2V0cyAhPSBOVUxMKTsKIAogICBGREttZW1jbGVhcihwU3BlY3RyYWxDb2VmZmljaWVudCwgc2l6ZW9mKFNQRUNUUlVNKSk7CiAKLSAgaWYgKCAoZmxhZ3MgJiBBQ19FUl9IQ1IpID09IDAgKQotICB7CisgIGlmICgoZmxhZ3MgJiBBQ19FUl9IQ1IpID09IDApIHsKKyAgICBpbnQgZ3JvdXA7CisgICAgaW50IGdyb3Vwb2Zmc2V0OworICAgIFVDSEFSICpwQ29kZUJvb2sgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rOworICAgIGludCBTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQgPQorICAgICAgICBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOworICAgIGludCBncmFudWxlTGVuZ3RoID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aDsKKwogICAgIGdyb3Vwb2Zmc2V0ID0gMDsKIAogICAgIC8qIHBsYWluIGh1ZmZtYW4gZGVjb2RlciAgc2hvcnQgKi8KLSAgICBmb3IgKGdyb3VwPTA7IGdyb3VwIDwgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsgZ3JvdXArKykKLSAgICB7Ci0gICAgICBmb3IgKGJhbmQ9MDsgYmFuZCA8IFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZDsgYmFuZCsrKQotICAgICAgewotICAgICAgICBpbnQgYm5kcyA9IGdyb3VwKjE2K2JhbmQ7Ci0gICAgICAgIFVDSEFSIGN1cnJlbnRDQiA9IHBDb2RlQm9va1tibmRzXTsKKyAgICBpbnQgbWF4X2dyb3VwID0gR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKIAotICAgICAgICAvKiBwYXRjaCB0byBydW4gcGxhaW4taHVmZm1hbi1kZWNvZGVyIHdpdGggdmNiMTEgaW5wdXQgY29kZWJvb2tzIChMQVYtY2hlY2tpbmcgbWlnaHQgYmUgcG9zc2libGUgYmVsb3cgdXNpbmcgdGhlIHZpcnR1YWwgY2IgYW5kIGEgTEFWLXRhYmxlKSAqLworICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IG1heF9ncm91cDsgZ3JvdXArKykgeworICAgICAgaW50IG1heF9ncm91cHdpbiA9CisgICAgICAgICAgR2V0V2luZG93R3JvdXBMZW5ndGgoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sIGdyb3VwKTsKKyAgICAgIGludCBiYW5kOworCisgICAgICBpbnQgYm5kcyA9IGdyb3VwICogMTY7CisKKyAgICAgIGludCBiYW5kT2Zmc2V0MSA9IEJhbmRPZmZzZXRzWzBdOworICAgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZDsgYmFuZCsrLCBibmRzKyspIHsKKyAgICAgICAgVUNIQVIgY3VycmVudENCID0gcENvZGVCb29rW2JuZHNdOworICAgICAgICBpbnQgYmFuZE9mZnNldDAgPSBiYW5kT2Zmc2V0MTsKKyAgICAgICAgYmFuZE9mZnNldDEgPSBCYW5kT2Zmc2V0c1tiYW5kICsgMV07CisKKyAgICAgICAgLyogcGF0Y2ggdG8gcnVuIHBsYWluLWh1ZmZtYW4tZGVjb2RlciB3aXRoIHZjYjExIGlucHV0IGNvZGVib29rcworICAgICAgICAgKiAoTEFWLWNoZWNraW5nIG1pZ2h0IGJlIHBvc3NpYmxlIGJlbG93IHVzaW5nIHRoZSB2aXJ0dWFsIGNiIGFuZCBhCisgICAgICAgICAqIExBVi10YWJsZSkgKi8KICAgICAgICAgaWYgKChjdXJyZW50Q0IgPj0gMTYpICYmIChjdXJyZW50Q0IgPD0gMzEpKSB7CiAgICAgICAgICAgcENvZGVCb29rW2JuZHNdID0gY3VycmVudENCID0gMTE7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCAhKChjdXJyZW50Q0IgPT0gWkVST19IQ0IpCi0gICAgICAgICAgICB8fCAoY3VycmVudENCID09IE5PSVNFX0hDQikKLSAgICAgICAgICAgIHx8IChjdXJyZW50Q0IgPT0gSU5URU5TSVRZX0hDQikKLSAgICAgICAgICAgIHx8IChjdXJyZW50Q0IgPT0gSU5URU5TSVRZX0hDQjIpKSApCi0gICAgICAgIHsKLSAgICAgICAgICBjb25zdCBDb2RlQm9va0Rlc2NyaXB0aW9uICpoY2IgPSAmQUFDY29kZUJvb2tEZXNjcmlwdGlvblRhYmxlW2N1cnJlbnRDQl07CisgICAgICAgIGlmICgoKGN1cnJlbnRDQiAhPSBaRVJPX0hDQikgJiYgKGN1cnJlbnRDQiAhPSBOT0lTRV9IQ0IpICYmCisgICAgICAgICAgICAgKGN1cnJlbnRDQiAhPSBJTlRFTlNJVFlfSENCKSAmJiAoY3VycmVudENCICE9IElOVEVOU0lUWV9IQ0IyKSkpIHsKKyAgICAgICAgICBjb25zdCBDb2RlQm9va0Rlc2NyaXB0aW9uICpoY2IgPQorICAgICAgICAgICAgICAmQUFDY29kZUJvb2tEZXNjcmlwdGlvblRhYmxlW2N1cnJlbnRDQl07CiAgICAgICAgICAgaW50IHN0ZXAgPSBoY2ItPkRpbWVuc2lvbjsKICAgICAgICAgICBpbnQgb2Zmc2V0ID0gaGNiLT5PZmZzZXQ7CiAgICAgICAgICAgaW50IGJpdHMgPSBoY2ItPm51bUJpdHM7Ci0gICAgICAgICAgaW50IG1hc2sgPSAoMTw8Yml0cyktMTsKKyAgICAgICAgICBpbnQgbWFzayA9ICgxIDw8IGJpdHMpIC0gMTsKKyAgICAgICAgICBjb25zdCBVU0hPUlQoKkNvZGVCb29rKVtIdWZmbWFuRW50cmllc10gPSBoY2ItPkNvZGVCb29rOworICAgICAgICAgIGludCBncm91cHdpbjsKIAotICAgICAgICAgIGZvciAoZ3JvdXB3aW49MDsgZ3JvdXB3aW4gPCBHZXRXaW5kb3dHcm91cExlbmd0aCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyxncm91cCk7IGdyb3Vwd2luKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgd2luZG93ID0gZ3JvdXBvZmZzZXQgKyBncm91cHdpbjsKKyAgICAgICAgICBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtID0KKyAgICAgICAgICAgICAgJnBTcGVjdHJhbENvZWZmaWNpZW50W2dyb3Vwb2Zmc2V0ICogZ3JhbnVsZUxlbmd0aF07CiAKLSAgICAgICAgICAgIEZJWFBfREJMICptZGN0U3BlY3RydW0gPSBTUEVDKHBTcGVjdHJhbENvZWZmaWNpZW50LCB3aW5kb3csIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGgpOwotCi0gICAgICAgICAgICBsb2NNYXggPSAoRklYUF9EQkwpMCA7Ci0KLSAgICAgICAgICAgIGZvciAoaW5kZXg9QmFuZE9mZnNldHNbYmFuZF07IGluZGV4IDwgQmFuZE9mZnNldHNbYmFuZCsxXTsgaW5kZXgrPXN0ZXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGludCBpZHggPSBDQmxvY2tfRGVjb2RlSHVmZm1hbldvcmQoYnMsaGNiKTsKLQotICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxzdGVwOyBpKyspIHsKLSAgICAgICAgICAgICAgICBGSVhQX0RCTCB0bXA7Ci0KLSAgICAgICAgICAgICAgICB0bXAgPSAoRklYUF9EQkwpKChpZHggJiBtYXNrKS1vZmZzZXQpOwotICAgICAgICAgICAgICAgIGlkeCA+Pj0gYml0czsKLQotICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBGSVhQX0RCTCgwKSkKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gKEZES3JlYWRCaXRzKGJzLDEpKT8gLXRtcCA6IHRtcDsKKyAgICAgICAgICBpZiAob2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgIGZvciAoZ3JvdXB3aW4gPSAwOyBncm91cHdpbiA8IG1heF9ncm91cHdpbjsgZ3JvdXB3aW4rKykgeworICAgICAgICAgICAgICBmb3IgKGluZGV4ID0gYmFuZE9mZnNldDA7IGluZGV4IDwgYmFuZE9mZnNldDE7IGluZGV4ICs9IHN0ZXApIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gQ0Jsb2NrX0RlY29kZUh1ZmZtYW5Xb3JkQ0IoYnMsIENvZGVCb29rKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RlcDsgaSsrLCBpZHggPj49IGJpdHMpIHsKKyAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHRtcCA9IChGSVhQX0RCTCkoKGlkeCAmIG1hc2spIC0gb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gRklYUF9EQkwoMCkpIHRtcCA9IChGREtyZWFkQml0KGJzKSkgPyAtdG1wIDogdG1wOworICAgICAgICAgICAgICAgICAgbWRjdFNwZWN0cnVtW2luZGV4ICsgaV0gPSB0bXA7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVtpbmRleCtpXSA9IHRtcDsKLSAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgIGlmIChjdXJyZW50Q0IgPT0gRVNDQk9PSykKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVtpbmRleCswXSA9IChGSVhQX0RCTClDQmxvY2tfR2V0RXNjYXBlKGJzLCAoTE9ORyltZGN0U3BlY3RydW1baW5kZXgrMF0pOwotICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVtpbmRleCsxXSA9IChGSVhQX0RCTClDQmxvY2tfR2V0RXNjYXBlKGJzLCAoTE9ORyltZGN0U3BlY3RydW1baW5kZXgrMV0pOwotCisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDQiA9PSBFU0NCT09LKSB7CisgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7IGorKykKKyAgICAgICAgICAgICAgICAgICAgbWRjdFNwZWN0cnVtW2luZGV4ICsgal0gPSAoRklYUF9EQkwpQ0Jsb2NrX0dldEVzY2FwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGJzLCAoTE9ORyltZGN0U3BlY3RydW1baW5kZXggKyBqXSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bSArPSBncmFudWxlTGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGdyb3Vwd2luID0gMDsgZ3JvdXB3aW4gPCBtYXhfZ3JvdXB3aW47IGdyb3Vwd2luKyspIHsKKyAgICAgICAgICAgICAgZm9yIChpbmRleCA9IGJhbmRPZmZzZXQwOyBpbmRleCA8IGJhbmRPZmZzZXQxOyBpbmRleCArPSBzdGVwKSB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IENCbG9ja19EZWNvZGVIdWZmbWFuV29yZENCKGJzLCBDb2RlQm9vayk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0ZXA7IGkrKywgaWR4ID4+PSBiaXRzKSB7CisgICAgICAgICAgICAgICAgICBtZGN0U3BlY3RydW1baW5kZXggKyBpXSA9IChGSVhQX0RCTCkoKGlkeCAmIG1hc2spIC0gb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDQiA9PSBFU0NCT09LKSB7CisgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7IGorKykKKyAgICAgICAgICAgICAgICAgICAgbWRjdFNwZWN0cnVtW2luZGV4ICsgal0gPSAoRklYUF9EQkwpQ0Jsb2NrX0dldEVzY2FwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGJzLCAoTE9ORyltZGN0U3BlY3RydW1baW5kZXggKyBqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bSArPSBncmFudWxlTGVuZ3RoOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQotICAgICAgZ3JvdXBvZmZzZXQgKz0gR2V0V2luZG93R3JvdXBMZW5ndGgoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sZ3JvdXApOworICAgICAgZ3JvdXBvZmZzZXQgKz0gbWF4X2dyb3Vwd2luOwogICAgIH0KICAgICAvKiBwbGFpbiBodWZmbWFuIGRlY29kaW5nIChzaG9ydCkgZmluaXNoZWQgKi8KICAgfQorCiAgIC8qIEhDUiAtIEh1ZmZtYW4gQ29kZXdvcmQgUmVvcmRlcmluZyAgc2hvcnQgKi8KLSAgZWxzZSAgLyogaWYgKCBmbGFncyAmIEFDX0VSX0hDUiApICovCisgIGVsc2UgLyogaWYgKCBmbGFncyAmIEFDX0VSX0hDUiApICovCisKICAgewogICAgIEhfSENSX0lORk8gaEhjciA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuZXJIY3JJbmZvOworCiAgICAgaW50IGhjclN0YXR1cyA9IDA7CiAKICAgICAvKiBhZHZhbmNlZCBIdWZmbWFuIGRlY29kaW5nIHN0YXJ0cyBoZXJlIChIQ1IgZGVjb2RpbmcgOikgKi8KLSAgICBpZiAoIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5sZW5PZlJlb3JkZXJlZFNwZWN0cmFsRGF0YSAhPSAwICkgewotCisgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYworICAgICAgICAgICAgLmxlbk9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhICE9IDApIHsKICAgICAgIC8qIEhDUiBpbml0aWFsaXphdGlvbiBzaG9ydCAqLwogICAgICAgaGNyU3RhdHVzID0gSGNySW5pdChoSGNyLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbywgYnMpOwogCkBAIC02MDAsNyArNzM1LDggQEAKICAgICAgIH0KIAogICAgICAgLyogSENSIGRlY29kaW5nIHNob3J0ICovCi0gICAgICBoY3JTdGF0dXMgPSBIY3JEZWNvZGVyKGhIY3IsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIHBTYW1wbGluZ1JhdGVJbmZvLCBicyk7CisgICAgICBoY3JTdGF0dXMgPQorICAgICAgICAgIEhjckRlY29kZXIoaEhjciwgcEFhY0RlY29kZXJDaGFubmVsSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8sIGJzKTsKIAogICAgICAgaWYgKGhjclN0YXR1cyAhPSAwKSB7CiAjaWYgSENSX0VSUk9SX0NPTkNFQUxNRU5UCkBAIC02MTAsMTAwICs3NDYsMzE0IEBACiAjZW5kaWYgLyogSENSX0VSUk9SX0NPTkNFQUxNRU5UICovCiAgICAgICB9CiAKLSAgICAgIEZES3B1c2hGb3IgKGJzLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMubGVuT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGEpOworICAgICAgRkRLcHVzaEZvcihicywgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjCisgICAgICAgICAgICAgICAgICAgICAgICAgLmxlbk9mUmVvcmRlcmVkU3BlY3RyYWxEYXRhKTsKICAgICB9CiAgIH0KICAgLyogSENSIC0gSHVmZm1hbiBDb2Rld29yZCBSZW9yZGVyaW5nIHNob3J0IGZpbmlzaGVkICovCiAKLQotCi0gIGlmICggSXNMb25nQmxvY2soJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pICYmICEoZmxhZ3MgJiAoQUNfRUxEfEFDX1NDQUxBQkxFKSkgKQotICB7CisgIGlmIChJc0xvbmdCbG9jaygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykgJiYKKyAgICAgICEoZmxhZ3MgJiAoQUNfRUxEIHwgQUNfU0NBTEFCTEUpKSkgewogICAgIC8qIGFwcGx5IHB1bHNlIGRhdGEgKi8KLSAgICBDUHVsc2VEYXRhX0FwcGx5KCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMuUHVsc2VEYXRhLAotICAgICAgICAgICAgICAgICAgICAgIEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgICBTUEVDX0xPTkcocFNwZWN0cmFsQ29lZmZpY2llbnQpKTsKKyAgICBDUHVsc2VEYXRhX0FwcGx5KAorICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLlB1bHNlRGF0YSwKKyAgICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbyksCisgICAgICAgIFNQRUNfTE9ORyhwU3BlY3RyYWxDb2VmZmljaWVudCkpOwogICB9CiAKLQogICByZXR1cm4gQUFDX0RFQ19PSzsKIH0KIAorc3RhdGljIGNvbnN0IEZJWFBfU0dMIG5vaXNlX2xldmVsX3RhYls4XSA9IHsKKyAgICAvKiBGREtwb3coMiwgKGZsb2F0KShub2lzZV9sZXZlbC0xNCkvMy4wZikgKiAyOyAoKjIgdG8gY29tcGVuc2F0ZSBmb3IKKyAgICAgICBmTXVsdERpdjIpIG5vaXNlX2xldmVsX3RhYihub2lzZV9sZXZlbD09MCkgPT0gMCBieSBkZWZpbml0aW9uCisgICAgKi8KKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgwMDAwMDAwMCAvKjB4MGExNDUxNzMqLyksCisgICAgRlhfREJMMkZYQ09OU1RfU0dMKDB4MGNiMmZmNWUpLAorICAgIEZYX0RCTDJGWENPTlNUX1NHTCgweDEwMDAwMDAwKSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgxNDI4YTJlNyksCisgICAgRlhfREJMMkZYQ09OU1RfU0dMKDB4MTk2NWZlYmQpLAorICAgIEZYX0RCTDJGWENPTlNUX1NHTCgweDIwMDAwMDAwKSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgyODUxNDYwNiksCisgICAgRlhfREJMMkZYQ09OU1RfU0dMKDB4MzJjYmZkMzMpfTsKIAordm9pZCBDQmxvY2tfQXBwbHlOb2lzZShDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywgVUxPTkcgKm5mUmFuZG9tU2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmJhbmRfaXNfbm9pc2UpIHsKKyAgY29uc3QgU0hPUlQgKnN3Yl9vZmZzZXQgPSBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKAorICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8sIHBTYW1wbGluZ1JhdGVJbmZvKTsKKyAgaW50IGcsIHdpbiwgZ3dpbiwgc2ZiLCBub2lzZUZpbGxpbmdTdGFydE9mZnNldCwgbmZTdGFydE9mZnNldF9zZmI7CiAKLXZvaWQgQXBwbHlUb29scyAoIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bXSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaGFubmVsICkKLXsKKyAgLyogT2J0YWluIG5vaXNlIGxldmVsIGFuZCBzY2FsZSBmYWN0b3Igb2Zmc2V0LiAqLworICBpbnQgbm9pc2VfbGV2ZWwgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby51c2FjCisgICAgICAgICAgICAgICAgICAgICAgICAuZmRfbm9pc2VfbGV2ZWxfYW5kX29mZnNldCA+PgorICAgICAgICAgICAgICAgICAgICA1OworICBjb25zdCBGSVhQX1NHTCBub2lzZVZhbF9wb3MgPSBub2lzZV9sZXZlbF90YWJbbm9pc2VfbGV2ZWxdOwogCi0gIGlmICggIShmbGFncyAmIChBQ19VU0FDfEFDX1JTVkQ1MHxBQ19NUFNfUkVTKSkgKSB7Ci0gICAgQ1Buc19BcHBseSgKLSAgICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hhbm5lbF0tPmRhdGEuYWFjLlBuc0RhdGEsCi0gICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoYW5uZWxdLT5pY3NJbmZvLAotICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+cFNwZWN0cmFsQ29lZmZpY2llbnQsCi0gICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoYW5uZWxdLT5zcGVjU2NhbGUsCi0gICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoYW5uZWxdLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yLAotICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoYW5uZWxdLT5ncmFudWxlTGVuZ3RoLAotICAgICAgICAgICAgY2hhbm5lbAotICAgICAgICAgICAgKTsKKyAgLyogbm9pc2Vfb2Zmc2V0IGNhbiBjaGFuZ2UgZXZlbiB3aGVuIG5vaXNlX2xldmVsPTAuIE5lY2Nlc2FyeSBmb3IgSUdGIHN0ZXJlbworICAgKiBmaWxsaW5nICovCisgIGNvbnN0IGludCBub2lzZV9vZmZzZXQgPSAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8udXNhYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmRfbm9pc2VfbGV2ZWxfYW5kX29mZnNldCAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxZikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY7CisKKyAgaW50IG1heF9zZmIgPQorICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKKworICBub2lzZUZpbGxpbmdTdGFydE9mZnNldCA9CisgICAgICAoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pID09IEJMT0NLX1NIT1JUKQorICAgICAgICAgID8gMjAKKyAgICAgICAgICA6IDE2MDsKKyAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGggPT0gOTYpIHsKKyAgICBub2lzZUZpbGxpbmdTdGFydE9mZnNldCA9CisgICAgICAgICgzICogbm9pc2VGaWxsaW5nU3RhcnRPZmZzZXQpIC8KKyAgICAgICAgNDsgLyogc2NhbGUgb2Zmc2V0IHdpdGggMy80IGZvciBjb3JlQ29kZXJGcmFtZUxlbmd0aCA9PSA3NjggKi8KICAgfQogCi0gIENUbnNfQXBwbHkgKAotICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hhbm5lbF0tPnBEeW5EYXRhLT5UbnNEYXRhLAotICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hhbm5lbF0tPmljc0luZm8sCi0gICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+cFNwZWN0cmFsQ29lZmZpY2llbnQsCi0gICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+Z3JhbnVsZUxlbmd0aAotICAgICAgICAgICk7CisgIC8qIGRldGVybWluZSBzZmIgZnJvbSB3aGVyZSBvbiBub2lzZSBmaWxsaW5nIGlzIGFwcGxpZWQgKi8KKyAgZm9yIChzZmIgPSAwOyBzd2Jfb2Zmc2V0W3NmYl0gPCBub2lzZUZpbGxpbmdTdGFydE9mZnNldDsgc2ZiKyspCisgICAgOworICBuZlN0YXJ0T2Zmc2V0X3NmYiA9IHNmYjsKKworICAvKiBpZiAobm9pc2VfbGV2ZWwhPTApICovCisgIHsKKyAgICBmb3IgKGcgPSAwLCB3aW4gPSAwOyBnIDwgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKKyAgICAgICAgIGcrKykgeworICAgICAgaW50IHdpbmRvd0dyb3VwTGVuZ3RoID0KKyAgICAgICAgICBHZXRXaW5kb3dHcm91cExlbmd0aCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbywgZyk7CisgICAgICBmb3IgKHNmYiA9IG5mU3RhcnRPZmZzZXRfc2ZiOyBzZmIgPCBtYXhfc2ZiOyBzZmIrKykgeworICAgICAgICBpbnQgYmluX3N0YXJ0ID0gc3diX29mZnNldFtzZmJdOworICAgICAgICBpbnQgYmluX3N0b3AgPSBzd2Jfb2Zmc2V0W3NmYiArIDFdOworCisgICAgICAgIGludCBmbGFnTiA9IGJhbmRfaXNfbm9pc2VbZyAqIDE2ICsgc2ZiXTsKKworICAgICAgICAvKiBpZiBhbGwgYmlucyBvZiBvbmUgc2ZiIGluIG9uZSB3aW5kb3cgZ3JvdXAgYXJlIHplcm8gbW9kaWZ5IHRoZSBzY2FsZQorICAgICAgICAgKiBmYWN0b3IgYnkgbm9pc2Vfb2Zmc2V0ICovCisgICAgICAgIGlmIChmbGFnTikgeworICAgICAgICAgIC8qIENoYW5nZSBzY2FsaW5nIGZhY3RvcnMgZm9yIGVtcHR5IHNpZ25hbCBiYW5kcyAqLworICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbZyAqIDE2ICsgc2ZiXSArPQorICAgICAgICAgICAgICBub2lzZV9vZmZzZXQ7CisgICAgICAgICAgLyogc2NhbGUgZmFjdG9yICJzZiIgaW1wbGllZCBnYWluICJnIiBpcyBnID0gMl4oc2YvNCkgKi8KKyAgICAgICAgICBmb3IgKGd3aW4gPSAwOyBnd2luIDwgd2luZG93R3JvdXBMZW5ndGg7IGd3aW4rKykgeworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEKKyAgICAgICAgICAgICAgICAtPmFTZmJTY2FsZVsod2luICsgZ3dpbikgKiAxNiArIHNmYl0gKz0gKG5vaXNlX29mZnNldCA+PiAyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBVTE9ORyBzZWVkID0gKm5mUmFuZG9tU2VlZDsKKyAgICAgICAgLyogKyAxIGJlY2F1c2UgZXhwb25lbnQgb2YgTWFudGlzc2FUYWJsZVtsc2JdWzBdIGlzIGFsd2F5cyAxLiAqLworICAgICAgICBpbnQgc2NhbGUgPQorICAgICAgICAgICAgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbZyAqIDE2ICsgc2ZiXSA+PgorICAgICAgICAgICAgIDIpICsKKyAgICAgICAgICAgIDE7CisgICAgICAgIGludCBsc2IgPQorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltnICogMTYgKyBzZmJdICYgMzsKKyAgICAgICAgRklYUF9EQkwgbWFudGlzc2EgPSBNYW50aXNzYVRhYmxlW2xzYl1bMF07CisKKyAgICAgICAgZm9yIChnd2luID0gMDsgZ3dpbiA8IHdpbmRvd0dyb3VwTGVuZ3RoOyBnd2luKyspIHsKKyAgICAgICAgICBGSVhQX0RCTCAqcFNwZWMgPQorICAgICAgICAgICAgICBTUEVDKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50LCB3aW4gKyBnd2luLAorICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGgpOworCisgICAgICAgICAgaW50IHNjYWxlMSA9IHNjYWxlIC0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5hU2ZiU2NhbGVbKHdpbiArIGd3aW4pICogMTYgKyBzZmJdOworICAgICAgICAgIEZJWFBfREJMIHNjYWxlZF9ub2lzZVZhbF9wb3MgPQorICAgICAgICAgICAgICBzY2FsZVZhbHVlKGZNdWx0RGl2Mihub2lzZVZhbF9wb3MsIG1hbnRpc3NhKSwgc2NhbGUxKTsKKyAgICAgICAgICBGSVhQX0RCTCBzY2FsZWRfbm9pc2VWYWxfbmVnID0gLXNjYWxlZF9ub2lzZVZhbF9wb3M7CisKKyAgICAgICAgICAvKiBJZiB0aGUgd2hvbGUgYmFuZCBpcyB6ZXJvLCBqdXN0IGZpbGwgd2l0aG91dCBjaGVja2luZyAqLworICAgICAgICAgIGlmIChmbGFnTikgeworICAgICAgICAgICAgZm9yIChpbnQgYmluID0gYmluX3N0YXJ0OyBiaW4gPCBiaW5fc3RvcDsgYmluKyspIHsKKyAgICAgICAgICAgICAgc2VlZCA9IChVTE9ORykoCisgICAgICAgICAgICAgICAgICAoVUlOVDY0KXNlZWQgKiA2OTA2OSArCisgICAgICAgICAgICAgICAgICA1KTsgLyogSW5saW5lZDogVXNhY1JhbmRvbVNpZ24gLSBvcmlnaW4gaW4gdXNhY2RlY19scGQuaCAqLworICAgICAgICAgICAgICBwU3BlY1tiaW5dID0KKyAgICAgICAgICAgICAgICAgIChzZWVkICYgMHgxMDAwMCkgPyBzY2FsZWRfbm9pc2VWYWxfbmVnIDogc2NhbGVkX25vaXNlVmFsX3BvczsKKyAgICAgICAgICAgIH0gLyogZm9yIChiaW4uLi4pICovCisgICAgICAgICAgfQorICAgICAgICAgIC8qSWYgYmFuZCBpcyBzcGFyc2VseSBmaWxsZWQsIGNoZWNrIGZvciAwIGFuZCBmaWxsICovCisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBiaW4gPSBiaW5fc3RhcnQ7IGJpbiA8IGJpbl9zdG9wOyBiaW4rKykgeworICAgICAgICAgICAgICBpZiAocFNwZWNbYmluXSA9PSAoRklYUF9EQkwpMCkgeworICAgICAgICAgICAgICAgIHNlZWQgPSAoVUxPTkcpKAorICAgICAgICAgICAgICAgICAgICAoVUlOVDY0KXNlZWQgKiA2OTA2OSArCisgICAgICAgICAgICAgICAgICAgIDUpOyAvKiBJbmxpbmVkOiBVc2FjUmFuZG9tU2lnbiAtIG9yaWdpbiBpbiB1c2FjZGVjX2xwZC5oICovCisgICAgICAgICAgICAgICAgcFNwZWNbYmluXSA9IChzZWVkICYgMHgxMDAwMCkgPyBzY2FsZWRfbm9pc2VWYWxfbmVnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzY2FsZWRfbm9pc2VWYWxfcG9zOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8qIGZvciAoYmluLi4uKSAqLworICAgICAgICAgIH0KKworICAgICAgICB9IC8qIGZvciAoZ3dpbi4uLikgKi8KKyAgICAgICAgKm5mUmFuZG9tU2VlZCA9IHNlZWQ7CisgICAgICB9IC8qIGZvciAoc2ZiLi4uKSAqLworICAgICAgd2luICs9IHdpbmRvd0dyb3VwTGVuZ3RoOworICAgIH0gLyogZm9yIChnLi4uKSAqLworCisgIH0gLyogLi4uICovCiB9CiAKLXN0YXRpYwotaW50IGdldFdpbmRvdzJOcihpbnQgbGVuZ3RoLCBpbnQgc2hhcGUpCi17CitBQUNfREVDT0RFUl9FUlJPUiBDQmxvY2tfUmVhZEFjU3BlY3RyYWxEYXRhKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLCBjb25zdCBVSU5UIGZyYW1lX2xlbmd0aCwKKyAgICBjb25zdCBVSU5UIGZsYWdzKSB7CisgIEFBQ19ERUNPREVSX0VSUk9SIGVycm9yQUFDID0gQUFDX0RFQ19PSzsKKyAgQVJJVEhfQ09ESU5HX0VSUk9SIGVycm9yID0gQVJJVEhfQ09ERVJfT0s7CisgIGludCBhcml0aF9yZXNldF9mbGFnLCBsZywgbnVtV2luLCB3aW4sIHdpbkxlbjsKKyAgY29uc3QgU0hPUlQgKlJFU1RSSUNUIEJhbmRPZmZzZXRzOworCisgIC8qIG51bWJlciBvZiB0cmFuc21pdHRlZCBzcGVjdHJhbCBjb2VmZmljaWVudHMgKi8KKyAgQmFuZE9mZnNldHMgPSBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8pOworICBsZyA9IEJhbmRPZmZzZXRzW0dldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgKKyAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKV07CisKKyAgbnVtV2luID0gR2V0V2luZG93c1BlckZyYW1lKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKKyAgd2luTGVuID0gKElzTG9uZ0Jsb2NrKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSkKKyAgICAgICAgICAgICAgID8gKGludClmcmFtZV9sZW5ndGgKKyAgICAgICAgICAgICAgIDogKGludClmcmFtZV9sZW5ndGggLyBudW1XaW47CisKKyAgaWYgKGZsYWdzICYgQUNfSU5ERVApIHsKKyAgICBhcml0aF9yZXNldF9mbGFnID0gMTsKKyAgfSBlbHNlIHsKKyAgICBhcml0aF9yZXNldF9mbGFnID0gKFVTSE9SVClGREtyZWFkQml0cyhoQnMsIDEpOworICB9CisKKyAgZm9yICh3aW4gPSAwOyB3aW4gPCBudW1XaW47IHdpbisrKSB7CisgICAgZXJyb3IgPQorICAgICAgICBDQXJjb19EZWNvZGVBcml0aERhdGEocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+aEFyQ28sIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQRUMocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbiwgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZywgd2luTGVuLCBhcml0aF9yZXNldF9mbGFnICYmICh3aW4gPT0gMCkpOworICAgIGlmIChlcnJvciAhPSBBUklUSF9DT0RFUl9PSykgeworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfQorCitiYWlsOgorICBpZiAoZXJyb3IgPT0gQVJJVEhfQ09ERVJfRVJST1IpIHsKKyAgICBlcnJvckFBQyA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgIH0KKworICByZXR1cm4gZXJyb3JBQUM7Cit9CisKK3ZvaWQgQXBwbHlUb29scyhDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvW10sCisgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sIGNvbnN0IFVJTlQgZmxhZ3MsCisgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBlbEZsYWdzLCBjb25zdCBpbnQgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgY29tbW9uX3dpbmRvdykgeworICBpZiAoIShmbGFncyAmIChBQ19VU0FDIHwgQUNfUlNWRDUwIHwgQUNfTVBFR0RfUkVTIHwgQUNfUlNWNjAzREEpKSkgeworICAgIENQbnNfQXBwbHkoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hhbm5lbF0tPmRhdGEuYWFjLlBuc0RhdGEsCisgICAgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+aWNzSW5mbywKKyAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hhbm5lbF0tPnBTcGVjdHJhbENvZWZmaWNpZW50LAorICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+c3BlY1NjYWxlLAorICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+cER5bkRhdGEtPmFTY2FsZUZhY3RvciwKKyAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+Z3JhbnVsZUxlbmd0aCwgY2hhbm5lbCk7CisgIH0KKworICBVQ0hBUiBuYmFuZHMgPQorICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoYW5uZWxdLT5pY3NJbmZvKTsKKworICBDVG5zX0FwcGx5KCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoYW5uZWxdLT5wRHluRGF0YS0+VG5zRGF0YSwKKyAgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+aWNzSW5mbywKKyAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoYW5uZWxdLT5wU3BlY3RyYWxDb2VmZmljaWVudCwKKyAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaGFubmVsXS0+Z3JhbnVsZUxlbmd0aCwKKyAgICAgICAgICAgICBuYmFuZHMsIChlbEZsYWdzICYgQUNfRUxfRU5IQU5DRURfTk9JU0UpID8gMSA6IDAsIGZsYWdzKTsKK30KKworc3RhdGljIGludCBnZXRXaW5kb3cyTnIoaW50IGxlbmd0aCwgaW50IHNoYXBlKSB7CiAgIGludCBuciA9IDA7CiAKICAgaWYgKHNoYXBlID09IDIpIHsKICAgICAvKiBMb3cgT3ZlcmxhcCwgMy80IHplcm9lZCAqLwotICAgIG5yID0gKGxlbmd0aCAqIDMpPj4yOworICAgIG5yID0gKGxlbmd0aCAqIDMpID4+IDI7CiAgIH0KIAogICByZXR1cm4gbnI7CiB9CiAKLXZvaWQgQ0Jsb2NrX0ZyZXF1ZW5jeVRvVGltZShDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSBvdXRTYW1wbGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgZnJhbWVMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZnJhbWVPaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcFdvcmtCdWZmZXIxICkKLXsKLSAgaW50IGZyLCBmbCwgdGwsIG5TYW1wbGVzLCBuU3BlYzsKK0ZJWFBfREJMIGdldF9nYWluKGNvbnN0IEZJWFBfREJMICp4LCBjb25zdCBGSVhQX0RCTCAqeSwgaW50IG4pIHsKKyAgRklYUF9EQkwgY29yciA9IChGSVhQX0RCTCkwOworICBGSVhQX0RCTCBlbmVyID0gKEZJWFBfREJMKTE7CiAKLSAgLyogRGV0ZXJtaW5lIGxlZnQgc2xvcGUgbGVuZ3RoIChmbCksIHJpZ2h0IHNsb3BlIGxlbmd0aCAoZnIpIGFuZCB0cmFuc2Zvcm0gbGVuZ3RoICh0bCkuCi0gICAgIFVTQUM6IFRoZSBzbG9wZSBsZW5ndGggbWF5IG1pc21hdGNoIHdpdGggdGhlIHByZXZpb3VzIGZyYW1lIGluIGNhc2Ugb2YgTFBEIC8gRkQKLSAgICAgICAgICAgdHJhbnNpdGlvbnMuIFRoZSBhZGp1c3RtZW50IGlzIGhhbmRsZWQgYnkgdGhlIGltZGN0IGltcGxlbWVudGF0aW9uLgorICBpbnQgaGVhZHJvb21feCA9IGdldFNjYWxlZmFjdG9yKHgsIG4pOworICBpbnQgaGVhZHJvb21feSA9IGdldFNjYWxlZmFjdG9yKHksIG4pOworCisgIC8qQ2FsY3VsYXRlIHRoZSBub3JtYWxpemF0aW9uIG5lY2Vzc2FyeSBkdWUgdG8gYWRkaXRpb24qLworICAvKiBDaGVjayBmb3IgcG93ZXIgb2YgdHdvIC9zcGVjaWFsIGNhc2UgKi8KKyAgSU5UIHdpZHRoX3NoaWZ0ID0gKElOVCkoZk5vcm16KChGSVhQX0RCTCluKSk7CisgIC8qIEdldCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVjZXNzYXJ5IG1pbnVzIG9uZSwgYmVjYXVzZSB3ZSBuZWVkIG9uZSBzaWduIGJpdAorICAgKiBvbmx5ICovCisgIHdpZHRoX3NoaWZ0ID0gMzEgLSB3aWR0aF9zaGlmdDsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgIGNvcnIgKz0KKyAgICAgICAgZk11bHREaXYyKCh4W2ldIDw8IGhlYWRyb29tX3gpLCAoeVtpXSA8PCBoZWFkcm9vbV95KSkgPj4gd2lkdGhfc2hpZnQ7CisgICAgZW5lciArPSBmUG93MkRpdjIoKHlbaV0gPDwgaGVhZHJvb21feSkpID4+IHdpZHRoX3NoaWZ0OworICB9CisKKyAgaW50IGV4cF9jb3JyID0gKDE3IC0gaGVhZHJvb21feCkgKyAoMTcgLSBoZWFkcm9vbV95KSArIHdpZHRoX3NoaWZ0ICsgMTsKKyAgaW50IGV4cF9lbmVyID0gKCgxNyAtIGhlYWRyb29tX3kpIDw8IDEpICsgd2lkdGhfc2hpZnQgKyAxOworCisgIGludCB0ZW1wX2V4cCA9IDA7CisgIEZJWFBfREJMIG91dHB1dCA9IGZEaXZOb3JtU2lnbmVkKGNvcnIsIGVuZXIsICZ0ZW1wX2V4cCk7CisKKyAgaW50IG91dHB1dF9leHAgPSAoZXhwX2NvcnIgLSBleHBfZW5lcikgKyB0ZW1wX2V4cDsKKworICBJTlQgb3V0cHV0X3NoaWZ0ID0gMTcgLSBvdXRwdXRfZXhwOworICBvdXRwdXRfc2hpZnQgPSBmTWluKG91dHB1dF9zaGlmdCwgMzEpOworCisgIG91dHB1dCA9IHNjYWxlVmFsdWUob3V0cHV0LCAtb3V0cHV0X3NoaWZ0KTsKKworICByZXR1cm4gb3V0cHV0OworfQorCit2b2lkIENCbG9ja19GcmVxdWVuY3lUb1RpbWUoCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBGSVhQX1BDTSBvdXRTYW1wbGVzW10sCisgICAgY29uc3QgU0hPUlQgZnJhbWVMZW4sIGNvbnN0IGludCBmcmFtZU9rLCBGSVhQX0RCTCAqcFdvcmtCdWZmZXIxLAorICAgIFVJTlQgZWxGbGFncywgSU5UIGVsQ2gpIHsKKyAgaW50IGZyLCBmbCwgdGwsIG5TcGVjOworCisjaWYgZGVmaW5lZChGREtfQVNTRVJUX0VOQUJMRSkKKyAgTE9ORyBuU2FtcGxlczsKKyNlbmRpZgorCisgIC8qIERldGVybWluZSBsZWZ0IHNsb3BlIGxlbmd0aCAoZmwpLCByaWdodCBzbG9wZSBsZW5ndGggKGZyKSBhbmQgdHJhbnNmb3JtCisgICAgIGxlbmd0aCAodGwpLiBVU0FDOiBUaGUgc2xvcGUgbGVuZ3RoIG1heSBtaXNtYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBmcmFtZSBpbgorICAgICBjYXNlIG9mIExQRCAvIEZEIHRyYW5zaXRpb25zLiBUaGUgYWRqdXN0bWVudCBpcyBoYW5kbGVkIGJ5IHRoZSBpbWRjdAorICAgICBpbXBsZW1lbnRhdGlvbi4KICAgKi8KICAgdGwgPSBmcmFtZUxlbjsKICAgblNwZWMgPSAxOwogCi0gIHN3aXRjaCggcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mby5XaW5kb3dTZXF1ZW5jZSApIHsKKyAgc3dpdGNoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLldpbmRvd1NlcXVlbmNlKSB7CiAgICAgZGVmYXVsdDoKLSAgICBjYXNlIE9ubHlMb25nU2VxdWVuY2U6CisgICAgY2FzZSBCTE9DS19MT05HOgogICAgICAgZmwgPSBmcmFtZUxlbjsKLSAgICAgIGZyID0gZnJhbWVMZW4gLSBnZXRXaW5kb3cyTnIoZnJhbWVMZW4sIEdldFdpbmRvd1NoYXBlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSk7CisgICAgICBmciA9IGZyYW1lTGVuIC0KKyAgICAgICAgICAgZ2V0V2luZG93Mk5yKGZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgR2V0V2luZG93U2hhcGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pKTsKKyAgICAgIC8qIE5ldyBzdGFydHVwIG5lZWRzIGRpZmZlcmVudGlhdGlvbiBiZXR3ZWVuIHNpbmUgc2hhcGUgYW5kIGxvdyBvdmVybGFwCisgICAgICAgICBzaGFwZS4gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBmb3IgdGhlIExELUFBQyB0cmFuc2Zvcm1hdGlvbiB3aW5kb3dzLAorICAgICAgICAgYmVjYXVzZSB0aGUgc2xvcGUgbGVuZ3RoIGNhbiBiZSBkaWZmZXJlbnQgd2hpbGUgdXNpbmcgdGhlIHNhbWUgd2luZG93CisgICAgICAgICBzZXF1ZW5jZS4gKi8KKyAgICAgIGlmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5JTWRjdC5wcmV2X3RsID09IDApIHsKKyAgICAgICAgZmwgPSBmcjsKKyAgICAgIH0KICAgICAgIGJyZWFrOwotICAgIGNhc2UgTG9uZ1N0b3BTZXF1ZW5jZToKKyAgICBjYXNlIEJMT0NLX1NUT1A6CiAgICAgICBmbCA9IGZyYW1lTGVuID4+IDM7CiAgICAgICBmciA9IGZyYW1lTGVuOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMb25nU3RhcnRTZXF1ZW5jZTogLyogb3IgU3RvcFN0YXJ0U2VxdWVuY2UgKi8KKyAgICBjYXNlIEJMT0NLX1NUQVJUOiAvKiBvciBTdG9wU3RhcnRTZXF1ZW5jZSAqLwogICAgICAgZmwgPSBmcmFtZUxlbjsKICAgICAgIGZyID0gZnJhbWVMZW4gPj4gMzsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgRWlnaHRTaG9ydFNlcXVlbmNlOgorICAgIGNhc2UgQkxPQ0tfU0hPUlQ6CiAgICAgICBmbCA9IGZyID0gZnJhbWVMZW4gPj4gMzsKICAgICAgIHRsID4+PSAzOwogICAgICAgblNwZWMgPSA4OwpAQCAtNzExLDQ4ICsxMDYxLDE5OCBAQAogICB9CiAKICAgewotICAgIGludCBpOworICAgIGludCBsYXN0X2ZyYW1lX2xvc3QgPSBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xwY19sb3N0OwogCi0gICAgewotICAgICAgRklYUF9EQkwgKnRtcCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT53b3JrQnVmZmVyQ29yZTEtPm1kY3RPdXRUZW1wOwotCi0gICAgICBuU2FtcGxlcyA9IGltZGN0X2Jsb2NrKAotICAgICAgICAgICAgICZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5JTWRjdCwKLSAgICAgICAgICAgICAgdG1wLAotICAgICAgICAgICAgICBTUEVDX0xPTkcocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQpLAotICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGUsCi0gICAgICAgICAgICAgIG5TcGVjLAotICAgICAgICAgICAgICBmcmFtZUxlbiwKLSAgICAgICAgICAgICAgdGwsCi0gICAgICAgICAgICAgIEZES2dldFdpbmRvd1Nsb3BlKGZsLCBHZXRXaW5kb3dTaGFwZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykpLAotICAgICAgICAgICAgICBmbCwKLSAgICAgICAgICAgICAgRkRLZ2V0V2luZG93U2xvcGUoZnIsIEdldFdpbmRvd1NoYXBlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSksCi0gICAgICAgICAgICAgIGZyLAotICAgICAgICAgICAgICAoRklYUF9EQkwpMCApOwotCi0gICAgICBmb3IgKGk9MDsgaTxmcmFtZUxlbjsgaSsrKSB7Ci0gICAgICAgIG91dFNhbXBsZXNbaSpzdHJpZGVdID0gSU1EQ1RfU0NBTEUodG1wW2ldKTsKKyAgICBpZiAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9jb3JlX21vZGUgPT0gTFBEKSB7CisgICAgICBJTlQgZmFjX0ZCID0gMTsKKyAgICAgIGlmIChlbEZsYWdzICYgQUNfRUxfRlVMTEJBTkRMUEQpIHsKKyAgICAgICAgZmFjX0ZCID0gMjsKICAgICAgIH0KKworICAgICAgRklYUF9EQkwgKnN5bnRoOworCisgICAgICAvKiBLZWVwIHNvbWUgZnJlZSBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuIFRvIGJlIHVzZWQgZm9yCisgICAgICAgKiBwYXN0IGRhdGEgKi8KKyAgICAgIGlmICghKGVsRmxhZ3MgJiBBQ19FTF9MUERTVEVSRU9JRFgpKSB7CisgICAgICAgIHN5bnRoID0gcFdvcmtCdWZmZXIxICsgKChQSVRfTUFYX01BWCAtICgxICogTF9TVUJGUikpICogZmFjX0ZCKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN5bnRoID0gcFdvcmtCdWZmZXIxICsgUElUX01BWF9NQVggKiBmYWNfRkI7CisgICAgICB9CisKKyAgICAgIGludCBmYWNfbGVuZ3RoID0KKyAgICAgICAgICAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mby5XaW5kb3dTZXF1ZW5jZSA9PSBCTE9DS19TSE9SVCkKKyAgICAgICAgICAgICAgPyAoZnJhbWVMZW4gPj4gNCkKKyAgICAgICAgICAgICAgOiAoZnJhbWVMZW4gPj4gMyk7CisKKyAgICAgIElOVCBwaXRjaFtOQl9TVUJGUl9TVVBFUkZSICsgU1lOX1NGRF07CisgICAgICBGSVhQX0RCTCBwaXRfZ2FpbltOQl9TVUJGUl9TVVBFUkZSICsgU1lOX1NGRF07CisKKyAgICAgIGludCBuYkRpdiA9IChlbEZsYWdzICYgQUNfRUxfRlVMTEJBTkRMUEQpID8gMiA6IDQ7CisgICAgICBpbnQgbEZyYW1lID0gKGVsRmxhZ3MgJiBBQ19FTF9GVUxMQkFORExQRCkgPyBmcmFtZUxlbiAvIDIgOiBmcmFtZUxlbjsKKyAgICAgIGludCBuYlN1YmZyID0KKyAgICAgICAgICBsRnJhbWUgLyAobmJEaXYgKiBMX1NVQkZSKTsgLyogbnVtYmVyIG9mIHN1YmZyYW1lcyBwZXIgZGl2aXNpb24gKi8KKyAgICAgIGludCBMcGRTZmQgPSAobmJEaXYgKiBuYlN1YmZyKSA+PiAxOworICAgICAgaW50IFN5blNmZCA9IExwZFNmZCAtIEJQRl9TRkQ7CisKKyAgICAgIEZES21lbWNsZWFyKAorICAgICAgICAgIHBpdGNoLAorICAgICAgICAgIHNpemVvZigKKyAgICAgICAgICAgICAgcGl0Y2gpKTsgIC8vIGFkZGVkIHRvIHByZXZlbnQgZmVycmV0IGVycm9ycyBpbiBiYXNzX3BmXzFzZl9kZWxheQorICAgICAgRkRLbWVtY2xlYXIocGl0X2dhaW4sIHNpemVvZihwaXRfZ2FpbikpOworCisgICAgICAvKiBGQUMgY2FzZSAqLworICAgICAgaWYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfbHBkX21vZGUgPT0gMCB8fAorICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfbHBkX21vZGUgPT0gNCkgeworICAgICAgICBGSVhQX0RCTCBmYWNfYnVmW0xGQUNdOworICAgICAgICBGSVhQX0xQQyAqQSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZlswXTsKKworICAgICAgICBpZiAoIWZyYW1lT2sgfHwgbGFzdF9mcmFtZV9sb3N0IHx8CisgICAgICAgICAgICAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmZhY19kYXRhWzBdID09IE5VTEwpKSB7CisgICAgICAgICAgRkRLbWVtY2xlYXIoZmFjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmZhY19kYXRhWzBdID0gZmFjX2J1ZjsKKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuZmFjX2RhdGFfZVswXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBJTlQgQV9leHA7IC8qIGxpbmVhciBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyBleHBvbmVudCAqLworICAgICAgICB7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNX0xQX0ZJTFRFUl9PUkRFUjsgaSsrKSB7CisgICAgICAgICAgICBBW2ldID0gRlhfREJMMkZYX0xQQyhmaXhwX2NvcygKKyAgICAgICAgICAgICAgICBmTXVsdChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5scGM0X2xzZltpXSwKKyAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX1NHTCgoMSA8PCBMU1BBUkdfU0NBTEUpICogTV9QSSAvIDY0MDAuMCkpLAorICAgICAgICAgICAgICAgIExTRl9TQ0FMRSAtIExTUEFSR19TQ0FMRSkpOworICAgICAgICAgIH0KKworICAgICAgICAgIEVfTFBDX2ZfbHNwX2FfY29udmVyc2lvbihBLCBBLCAmQV9leHApOworICAgICAgICB9CisKKyNpZiBkZWZpbmVkKEZES19BU1NFUlRfRU5BQkxFKQorICAgICAgICBuU2FtcGxlcyA9CisjZW5kaWYKKyAgICAgICAgICAgIENMcGRfRkFDX0FjZWxwMk1kY3QoCisgICAgICAgICAgICAgICAgJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPklNZGN0LCBzeW50aCwKKyAgICAgICAgICAgICAgICBTUEVDX0xPTkcocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQpLAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZSwgblNwZWMsCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmZhY19kYXRhWzBdLAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YV9lWzBdLCBmYWNfbGVuZ3RoLAorICAgICAgICAgICAgICAgIGZyYW1lTGVuLCB0bCwKKyAgICAgICAgICAgICAgICBGREtnZXRXaW5kb3dTbG9wZSgKKyAgICAgICAgICAgICAgICAgICAgZnIsIEdldFdpbmRvd1NoYXBlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSksCisgICAgICAgICAgICAgICAgZnIsIEEsIEFfZXhwLCAmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+YWNlbHAsCisgICAgICAgICAgICAgICAgKEZJWFBfREJMKTAsIC8qIEZBQyBnYWluIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZC4gKi8KKyAgICAgICAgICAgICAgICAobGFzdF9mcmFtZV9sb3N0IHx8ICFmcmFtZU9rKSwgMSwKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xwZF9tb2RlLCAwLAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmN1cnJBbGlhc2luZ1N5bW1ldHJ5KTsKKworICAgICAgfSBlbHNlIHsKKyNpZiBkZWZpbmVkKEZES19BU1NFUlRfRU5BQkxFKQorICAgICAgICBuU2FtcGxlcyA9CisjZW5kaWYKKyAgICAgICAgICAgIGltbHRfYmxvY2soCisgICAgICAgICAgICAgICAgJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPklNZGN0LCBzeW50aCwKKyAgICAgICAgICAgICAgICBTUEVDX0xPTkcocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQpLAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZSwgblNwZWMsIGZyYW1lTGVuLCB0bCwKKyAgICAgICAgICAgICAgICBGREtnZXRXaW5kb3dTbG9wZSgKKyAgICAgICAgICAgICAgICAgICAgZmwsIEdldFdpbmRvd1NoYXBlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSksCisgICAgICAgICAgICAgICAgZmwsCisgICAgICAgICAgICAgICAgRkRLZ2V0V2luZG93U2xvcGUoCisgICAgICAgICAgICAgICAgICAgIGZyLCBHZXRXaW5kb3dTaGFwZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykpLAorICAgICAgICAgICAgICAgIGZyLCAoRklYUF9EQkwpMCwKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5jdXJyQWxpYXNpbmdTeW1tZXRyeQorICAgICAgICAgICAgICAgICAgICA/IE1MVF9GTEFHX0NVUlJfQUxJQVNfU1lNTUVUUlkKKyAgICAgICAgICAgICAgICAgICAgOiAwKTsKKyAgICAgIH0KKyAgICAgIEZES19BU1NFUlQoblNhbXBsZXMgPT0gZnJhbWVMZW4pOworCisgICAgICAvKiBUaGUgImlmIiBjbGF1c2UgaXMgZW50ZXJlZCBib3RoIGZvciBmdWxsYmFuZExwZCBtb25vIGFuZAorICAgICAgICogbm9uLWZ1bGxiYW5kTHBkKi4gVGhlICJlbHNlIi0+IGp1c3QgZm9yIGZ1bGxiYW5kTHBkIHN0ZXJlbyovCisgICAgICBpZiAoIShlbEZsYWdzICYgQUNfRUxfTFBEU1RFUkVPSURYKSkgeworICAgICAgICBGREttZW1jcHkocGl0Y2gsIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm9sZF9UX3BmLAorICAgICAgICAgICAgICAgICAgU3luU2ZkICogc2l6ZW9mKElOVCkpOworICAgICAgICBGREttZW1jcHkocGl0X2dhaW4sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm9sZF9nYWluX3BmLAorICAgICAgICAgICAgICAgICAgU3luU2ZkICogc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IFN5blNmZDsgaSA8IExwZFNmZCArIDM7IGkrKykgeworICAgICAgICAgIHBpdGNoW2ldID0gTF9TVUJGUjsKKyAgICAgICAgICBwaXRfZ2FpbltpXSA9IChGSVhQX0RCTCkwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfbHBkX21vZGUgPT0gMCkgeworICAgICAgICAgIHBpdGNoW1N5blNmZF0gPSBwaXRjaFtTeW5TZmQgLSAxXTsKKyAgICAgICAgICBwaXRfZ2FpbltTeW5TZmRdID0gcGl0X2dhaW5bU3luU2ZkIC0gMV07CisgICAgICAgICAgaWYgKElzTG9uZ0Jsb2NrKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSkgeworICAgICAgICAgICAgcGl0Y2hbU3luU2ZkICsgMV0gPSBwaXRjaFtTeW5TZmRdOworICAgICAgICAgICAgcGl0X2dhaW5bU3luU2ZkICsgMV0gPSBwaXRfZ2FpbltTeW5TZmRdOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIENvcHkgb2xkIGRhdGEgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyICovCisgICAgICAgIHsKKyAgICAgICAgICBGREttZW1jcHkoCisgICAgICAgICAgICAgIHBXb3JrQnVmZmVyMSwgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+b2xkX3N5bnRoLAorICAgICAgICAgICAgICAoKFBJVF9NQVhfTUFYIC0gKDEgKiBMX1NVQkZSKSkgKiBmYWNfRkIpICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIH0KKworICAgICAgICBGSVhQX0RCTCAqcDJfc3ludGggPSBwV29ya0J1ZmZlcjEgKyAoUElUX01BWF9NQVggKiBmYWNfRkIpOworCisgICAgICAgIC8qIHJlY2FsY3VsYXRlIHBpdGNoIGdhaW4gdG8gYWxsb3cgcG9zdGZpbGVyaW5nIG9uIEZBQyBhcmVhICovCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU3luU2ZkICsgMjsgaSsrKSB7CisgICAgICAgICAgaW50IFQgPSBwaXRjaFtpXTsKKyAgICAgICAgICBGSVhQX0RCTCBnYWluID0gcGl0X2dhaW5baV07CisKKyAgICAgICAgICBpZiAoZ2FpbiA+IChGSVhQX0RCTCkwKSB7CisgICAgICAgICAgICBnYWluID0gZ2V0X2dhaW4oJnAyX3N5bnRoW2kgKiBMX1NVQkZSICogZmFjX0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcDJfc3ludGhbKGkgKiBMX1NVQkZSICogZmFjX0ZCKSAtIGZhY19GQiAqIFRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExfU1VCRlIgKiBmYWNfRkIpOworICAgICAgICAgICAgcGl0X2dhaW5baV0gPSBnYWluOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJhc3NfcGZfMXNmX2RlbGF5KHAyX3N5bnRoLCBwaXRjaCwgcGl0X2dhaW4sIGZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoTHBkU2ZkICsgMikgKiBMX1NVQkZSICsgQlBGX1NGRCAqIExfU1VCRlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuIC0gKExwZFNmZCArIDQpICogTF9TVUJGUiwgb3V0U2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bWVtX2JwZik7CisgICAgICB9CisKKyAgICB9IGVsc2UgLyogbGFzdF9jb3JlX21vZGUgd2FzIG5vdCBMUEQgKi8KKyAgICB7CisgICAgICBGSVhQX0RCTCAqdG1wID0KKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tU3RhdGljRGF0YS0+cFdvcmtCdWZmZXJDb3JlMS0+bWRjdE91dFRlbXA7CisjaWYgZGVmaW5lZChGREtfQVNTRVJUX0VOQUJMRSkKKyAgICAgIG5TYW1wbGVzID0KKyNlbmRpZgorICAgICAgICAgIGltbHRfYmxvY2soJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPklNZGN0LCB0bXAsCisgICAgICAgICAgICAgICAgICAgICBTUEVDX0xPTkcocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQpLAorICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+c3BlY1NjYWxlLCBuU3BlYywgZnJhbWVMZW4sIHRsLAorICAgICAgICAgICAgICAgICAgICAgRkRLZ2V0V2luZG93U2xvcGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgZmwsIEdldFdpbmRvd1NoYXBlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSksCisgICAgICAgICAgICAgICAgICAgICBmbCwKKyAgICAgICAgICAgICAgICAgICAgIEZES2dldFdpbmRvd1Nsb3BlKAorICAgICAgICAgICAgICAgICAgICAgICAgIGZyLCBHZXRXaW5kb3dTaGFwZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykpLAorICAgICAgICAgICAgICAgICAgICAgZnIsIChGSVhQX0RCTCkwLAorICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Y3VyckFsaWFzaW5nU3ltbWV0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICA/IE1MVF9GTEFHX0NVUlJfQUxJQVNfU1lNTUVUUlkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IDApOworCisgICAgICBzY2FsZVZhbHVlc1NhdHVyYXRlKG91dFNhbXBsZXMsIHRtcCwgZnJhbWVMZW4sIE1EQ1RfT1VUX0hFQURST09NKTsKICAgICB9CiAgIH0KIAogICBGREtfQVNTRVJUKG5TYW1wbGVzID09IGZyYW1lTGVuKTsKIAorICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2NvcmVfbW9kZSA9CisgICAgICAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mby5XaW5kb3dTZXF1ZW5jZSA9PSBCTE9DS19TSE9SVCkgPyBGRF9TSE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRkRfTE9ORzsKKyAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9scGRfbW9kZSA9IDI1NTsKIH0KIAogI2luY2x1ZGUgImxkZmlsdGJhbmsuaCIKLXZvaWQgQ0Jsb2NrX0ZyZXF1ZW5jeVRvVGltZUxvd0RlbGF5KCBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSBvdXRTYW1wbGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvcnQgZnJhbWVMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBzdHJpZGUgKQotewotICBJbnZNZGN0VHJhbnNmb3JtTG93RGVsYXlfZmRrICgKLSAgICAgICAgICBTUEVDX0xPTkcocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQpLAotICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZVswXSwKLSAgICAgICAgICBvdXRTYW1wbGVzLAotICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPnBPdmVybGFwQnVmZmVyLAotICAgICAgICAgIHN0cmlkZSwKLSAgICAgICAgICBmcmFtZUxlbgotICAgICAgICAgICk7Cit2b2lkIENCbG9ja19GcmVxdWVuY3lUb1RpbWVMb3dEZWxheSgKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIEZJWFBfUENNIG91dFNhbXBsZXNbXSwKKyAgICBjb25zdCBzaG9ydCBmcmFtZUxlbikgeworICBJbnZNZGN0VHJhbnNmb3JtTG93RGVsYXlfZmRrKAorICAgICAgU1BFQ19MT05HKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50KSwKKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZVswXSwgb3V0U2FtcGxlcywKKyAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPnBPdmVybGFwQnVmZmVyLCBmcmFtZUxlbik7CiB9CmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2Jsb2NrLmggYi9saWJBQUNkZWMvc3JjL2Jsb2NrLmgKaW5kZXggZjkzOTRmNi4uZjBmNTZjZCAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9ibG9jay5oCisrKyBiL2xpYkFBQ2RlYy9zcmMvYmxvY2suaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKwogICAgRGVzY3JpcHRpb246IGxvbmcvc2hvcnQtYmxvY2sgZGVjb2RpbmcKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmbmRlZiBCTE9DS19ICiAjZGVmaW5lIEJMT0NLX0gKQEAgLTk3LDI1ICsxMDksMTkgQEAKICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAKIC8qIFBOUyAob2YgYmxvY2spICovCi12b2lkIENQbnNfUmVhZCAoQ1Buc0RhdGEgKnBQbnNEYXRhLAotICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgICAgICAgICAgICAgIGNvbnN0IENvZGVCb29rRGVzY3JpcHRpb24gKmhjYiwKLSAgICAgICAgICAgICAgICBTSE9SVCAqcFNjYWxlRmFjdG9yLAotICAgICAgICAgICAgICAgIFVDSEFSIGdsb2JhbF9nYWluLAotICAgICAgICAgICAgICAgIGludCBiYW5kLAotICAgICAgICAgICAgICAgIGludCBncm91cCk7Cit2b2lkIENQbnNfUmVhZChDUG5zRGF0YSAqcFBuc0RhdGEsIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICAgICAgICAgY29uc3QgQ29kZUJvb2tEZXNjcmlwdGlvbiAqaGNiLCBTSE9SVCAqcFNjYWxlRmFjdG9yLAorICAgICAgICAgICAgICAgVUNIQVIgZ2xvYmFsX2dhaW4sIGludCBiYW5kLCBpbnQgZ3JvdXApOwogCit2b2lkIENQbnNfQXBwbHkoY29uc3QgQ1Buc0RhdGEgKnBQbnNEYXRhLCBjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sCisgICAgICAgICAgICAgICAgU1BFQ1RSQUxfUFRSIHBTcGVjdHJ1bSwgY29uc3QgU0hPUlQgKnBTcGVjU2NhbGUsCisgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgKnBTY2FsZUZhY3RvciwKKyAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKKyAgICAgICAgICAgICAgICBjb25zdCBJTlQgZ3JhbnVsZUxlbmd0aCwgY29uc3QgaW50IGNoYW5uZWwpOwogCi12b2lkIENQbnNfQXBwbHkgKGNvbnN0IENQbnNEYXRhICpwUG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLAotICAgICAgICAgICAgICAgICBTUEVDVFJBTF9QVFIgcFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCAgICAqcFNwZWNTY2FsZSwKLSAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgICAgKnBTY2FsZUZhY3RvciwKLSAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgIGNvbnN0IElOVCBncmFudWxlTGVuZ3RoLAotICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY2hhbm5lbCk7Ci0KLQordm9pZCBDQmxvY2tfQXBwbHlOb2lzZShDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywgVUxPTkcgKm5mUmFuZG9tU2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmJhbmRfaXNfbm9pc2UpOwogCiAvKiBUTlMgKG9mIGJsb2NrKSAqLwogLyohCkBAIC0xMjYsMjggKzEzMiwyMSBAQAogCiAgIFxyZXR1cm4gIG5vbmUKICovCi12b2lkIENUbnNfUmVhZERhdGFQcmVzZW50RmxhZyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENUbnNEYXRhICpwVG5zRGF0YSk7Cit2b2lkIENUbnNfUmVhZERhdGFQcmVzZW50RmxhZyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgQ1Ruc0RhdGEgKnBUbnNEYXRhKTsKIAotdm9pZCBDVG5zX1JlYWREYXRhUHJlc2VudFVzYWMoCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgQ1Ruc0RhdGEgKnBUbnNEYXRhMCwKLSAgICAgICAgQ1Ruc0RhdGEgKnBUbnNEYXRhMSwKLSAgICAgICAgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLAotICAgICAgICBjb25zdCBVSU5UIGZsYWdzLAotICAgICAgICBjb25zdCBpbnQgZkNvbW1vbldpbmRvdwotICAgICAgICApOwordm9pZCBDVG5zX1JlYWREYXRhUHJlc2VudFVzYWMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBDVG5zRGF0YSAqcFRuc0RhdGEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1Ruc0RhdGEgKnBUbnNEYXRhMSwgVUNIQVIgKnB0bnNfb25fbHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sIGNvbnN0IFVJTlQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGVsRmxhZ3MsIGNvbnN0IGludCBmQ29tbW9uV2luZG93KTsKIAotQUFDX0RFQ09ERVJfRVJST1IgQ1Ruc19SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENUbnNEYXRhICpwVG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncyk7CitBQUNfREVDT0RFUl9FUlJPUiBDVG5zX1JlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIENUbnNEYXRhICpwVG5zRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sIGNvbnN0IFVJTlQgZmxhZ3MpOwogCi12b2lkIENUbnNfQXBwbHkgKCBDVG5zRGF0YSAqUkVTVFJJQ1QgcFRuc0RhdGEsIC8qITwgcG9pbnRlciB0byBhYWMgZGVjb2RlciBpbmZvICovCi0gICAgICAgICAgICAgICAgICBjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sCi0gICAgICAgICAgICAgICAgICBTUEVDVFJBTF9QVFIgcFNwZWN0cmFsQ29lZmZpY2llbnQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBncmFudWxlTGVuZ3RoKTsKK3ZvaWQgQ1Ruc19BcHBseShDVG5zRGF0YSAqUkVTVFJJQ1QgcFRuc0RhdGEsIC8qITwgcG9pbnRlciB0byBhYWMgZGVjb2RlciBpbmZvICovCisgICAgICAgICAgICAgICAgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLCBTUEVDVFJBTF9QVFIgcFNwZWN0cmFsQ29lZmZpY2llbnQsCisgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgICAgICAgICAgICAgY29uc3QgSU5UIGdyYW51bGVMZW5ndGgsIGNvbnN0IFVDSEFSIG5iYW5kcywKKyAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBpZ2ZfYWN0aXZlLCBjb25zdCBVSU5UIGZsYWdzKTsKIAogLyogQmxvY2sgKi8KIApAQCAtMTU1LDE3ICsxNTQsMTYgQEAKIAogLyoqCiAgKiBcYnJpZWYgUmVhZCBzY2FsZSBmYWN0b3IgZGF0YS4gU2VlIGNoYXB0ZXIgNC42LjIuMy4yIG9mIElTTy9JRUMgMTQ0OTYtMy4KLSAqICAgICAgICBUaGUgU0ZfT0ZGU0VUID0gMTAwIHZhbHVlIHJlZmVyZW5jZWQgaW4gY2hhcHRlciA0LjYuMi4zLjMgaXMgYWxyZWFkeSBzdWJzdHJhY3RlZAotICogICAgICAgIGZyb20gdGhlIHNjYWxlIGZhY3RvciB2YWx1ZXMuIEFsc28gaW5jbHVkZXMgUE5TIGRhdGEgcmVhZGluZy4KKyAqICAgICAgICBUaGUgU0ZfT0ZGU0VUID0gMTAwIHZhbHVlIHJlZmVyZW5jZWQgaW4gY2hhcHRlciA0LjYuMi4zLjMgaXMgYWxyZWFkeQorICogc3Vic3RyYWN0ZWQgZnJvbSB0aGUgc2NhbGUgZmFjdG9yIHZhbHVlcy4gQWxzbyBpbmNsdWRlcyBQTlMgZGF0YSByZWFkaW5nLgogICogXHBhcmFtIGJzIGJpdCBzdHJlYW0gaGFuZGxlIGRhdGEgc291cmNlCi0gKiBccGFyYW0gcEFhY0RlY29kZXJDaGFubmVsSW5mbyBjaGFubmVsIGNvbnRleHQgaW5mbyB3ZXJlIGRlY29kZWQgZGF0YSBpcyBzdG9yZWQgaW50by4KKyAqIFxwYXJhbSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvIGNoYW5uZWwgY29udGV4dCBpbmZvIHdlcmUgZGVjb2RlZCBkYXRhIGlzCisgKiBzdG9yZWQgaW50by4KICAqIFxwYXJhbSBmbGFncyB0aGUgZGVjb2RlciBmbGFncy4KICAqLwogQUFDX0RFQ09ERVJfRVJST1IgQ0Jsb2NrX1JlYWRTY2FsZUZhY3RvckRhdGEoCi0gICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgICAgICBjb25zdCBVSU5UIGZsYWdzCi0gICAgICAgICk7CisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgY29uc3QgVUlOVCBmbGFncyk7CiAKIC8qKgogICogXGJyaWVmIFJlYWQgSHVmZm1hbiBlbmNvZGVkIHNwZWN0cmFsIGRhdGEuCkBAIC0xNzMsMTExICsxNzEsMTI0IEBACiAgKiBccGFyYW0gcFNhbXBsaW5nUmF0ZUluZm8gc2FtcGxpbmcgcmF0ZSBpbmZvIChzZmIgb2Zmc2V0cykuCiAgKiBccGFyYW0gZmxhZ3Mgc3ludGF4IGZsYWdzLgogICovCi1BQUNfREVDT0RFUl9FUlJPUiAgQ0Jsb2NrX1JlYWRTcGVjdHJhbERhdGEoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICBmbGFncyk7Ci0KLQotQUFDX0RFQ09ERVJfRVJST1IgQ0Jsb2NrX1JlYWRTZWN0aW9uRGF0YShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgIGZsYWdzKTsKK0FBQ19ERUNPREVSX0VSUk9SIENCbG9ja19SZWFkU3BlY3RyYWxEYXRhKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLCBjb25zdCBVSU5UIGZsYWdzKTsKIAogLyoqCi0gKiBcYnJpZWYgZmluZCBhIGNvbW1vbiBleHBvbmVudCAoc2hpZnQgZmFjdG9yKSBmb3IgYWxsIHNmYiBpbiBlYWNoIFNwZWN0cmFsIHdpbmRvdywgYW5kIHN0b3JlIHRoZW0gaW50bwotICogICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm86OnNwZWNTY2FsZS4KKyAqIFxicmllZiBSZWFkIEFyaXRobWV0aWMgZW5jb2RlZCBzcGVjdHJhbCBkYXRhLgogICogXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gY2hhbm5lbCBjb250ZXh0IGluZm8uCisgKiBccGFyYW0gcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyBzdGF0aWMgY2hhbm5lbCBjb250ZXh0IGluZm8uCisgKiBccGFyYW0gcFNhbXBsaW5nUmF0ZUluZm8gc2FtcGxpbmcgcmF0ZSBpbmZvIChzZmIgb2Zmc2V0cykuCisgKiBccGFyYW0gZnJhbWVfbGVuZ3RoIHNwZWN0cmFsIHdpbmRvdyBsZW5ndGguCisgKiBccGFyYW0gZmxhZ3Mgc3ludGF4IGZsYWdzLgorICogXHJldHVybiBlcnJvciBjb2RlLgorICovCitBQUNfREVDT0RFUl9FUlJPUiBDQmxvY2tfUmVhZEFjU3BlY3RyYWxEYXRhKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLCBjb25zdCBVSU5UIGZyYW1lX2xlbmd0aCwKKyAgICBjb25zdCBVSU5UIGZsYWdzKTsKKworQUFDX0RFQ09ERVJfRVJST1IgQ0Jsb2NrX1JlYWRTZWN0aW9uRGF0YSgKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywgY29uc3QgVUlOVCBmbGFncyk7CisKKy8qKgorICogXGJyaWVmIGZpbmQgYSBjb21tb24gZXhwb25lbnQgKHNoaWZ0IGZhY3RvcikgZm9yIGFsbCBzZmIgaW4gZWFjaCBTcGVjdHJhbAorICogd2luZG93LCBhbmQgc3RvcmUgdGhlbSBpbnRvIENBYWNEZWNvZGVyQ2hhbm5lbEluZm86OnNwZWNTY2FsZS4KKyAqIFxwYXJhbSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvIGNoYW5uZWwgY29udGV4dCBpbmZvLgorICogXHBhcmFtIFVDSEFSIG1heFNmYnMgbWF4aW11bSBudW1iZXIgb2YgU0ZCcyB0byBiZSBwcm9jZXNzZWQgKG1pZ2h0IGRpZmZlcgorICogZnJvbSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLk1heFNmQmFuZHMpCiAgKiBccGFyYW0gcFNhbXBsaW5nUmF0ZUluZm8gc2FtcGxpbmcgcmF0ZSBpbmZvIChzZmIgb2Zmc2V0cykuCiAgKi8KLXZvaWQgQ0Jsb2NrX1NjYWxlU3BlY3RyYWxEYXRhKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvKTsKK3ZvaWQgQ0Jsb2NrX1NjYWxlU3BlY3RyYWxEYXRhKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBtYXhTZmJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8pOwogCiAvKioKICAqIFxicmllZiBBcHBseSBUTlMgYW5kIFBOUyB0b29scy4KICAqLwotdm9pZCBBcHBseVRvb2xzICggQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1tdLAotICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzLAotICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNoYW5uZWwgKTsKK3ZvaWQgQXBwbHlUb29scyhDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvW10sCisgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sIGNvbnN0IFVJTlQgZmxhZ3MsCisgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBlbEZsYWdzLCBjb25zdCBpbnQgY2hhbm5lbCwgY29uc3QgaW50IG1heWJlX2pzdGVyZW8pOwogCiAvKioKICAqIFxicmllZiBUcmFuc2Zvcm0gTURDVCBzcGVjdHJhbCBkYXRhIGludG8gdGltZSBkb21haW4KICAqLwotdm9pZCBDQmxvY2tfRnJlcXVlbmN5VG9UaW1lKENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNIG91dFNhbXBsZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCBmcmFtZUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmcmFtZU9rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwV29ya0J1ZmZlcjEpOwordm9pZCBDQmxvY2tfRnJlcXVlbmN5VG9UaW1lKAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywgRklYUF9QQ00gb3V0U2FtcGxlc1tdLAorICAgIGNvbnN0IFNIT1JUIGZyYW1lTGVuLCBjb25zdCBpbnQgZnJhbWVPaywgRklYUF9EQkwgKnBXb3JrQnVmZmVyMSwKKyAgICBVSU5UIGVsRmxhZ3MsIElOVCBlbENoKTsKIAogLyoqCiAgKiBcYnJpZWYgVHJhbnNmb3JtIGRvdWJsZSBsYXBwZWQgTURDVCAoQUFDLUVMRCkgc3BlY3RyYWwgZGF0YSBpbnRvIHRpbWUgZG9tYWluLgogICovCi12b2lkIENCbG9ja19GcmVxdWVuY3lUb1RpbWVMb3dEZWxheShDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gb3V0U2FtcGxlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvcnQgZnJhbWVMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIHN0cmlkZSk7Cit2b2lkIENCbG9ja19GcmVxdWVuY3lUb1RpbWVMb3dEZWxheSgKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIEZJWFBfUENNIG91dFNhbXBsZXNbXSwKKyAgICBjb25zdCBzaG9ydCBmcmFtZUxlbik7CiAKLUFBQ19ERUNPREVSX0VSUk9SIENCbG9ja19JbnZlcnNlUXVhbnRpemVTcGVjdHJhbERhdGEoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8pOworQUFDX0RFQ09ERVJfRVJST1IgQ0Jsb2NrX0ludmVyc2VRdWFudGl6ZVNwZWN0cmFsRGF0YSgKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgIFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLCBVQ0hBUiAqYmFuZF9pc19ub2lzZSwKKyAgICBVQ0hBUiBhY3RpdmVfYmFuZF9zZWFyY2gpOwogCiAvKioKICAqIFxicmllZiBDYWxjdWxhdGUgMl4obHNiLzQpICogdmFsdWVeKDQvMykKLSAqIFxwYXJhbSBwVmFsdWUgcG9pbnRlciB0byBxdWFudGl6ZWQgdmFsdWUuIFRoZSBpbnZlcnNlIHF1YW50aXplZCByZXN1bHQgaXMgc3RvcmVkIGJhY2sgaGVyZS4KLSAqIFxwYXJhbSBsc2IgMiBMU0JzIG9mIHRoZSBzY2FsZSBmYWN0b3IgKHNjYWxlRmFjdG9yICUgNCkgYXBwbGllZCBhcyBwb3dlciAyIGZhY3RvciB0byB0aGUKLSAqICAgICAgICByZXN1bHRpbmcgaW52ZXJzZSBxdWFudGl6ZWQgdmFsdWUuCisgKiBccGFyYW0gcFZhbHVlIHBvaW50ZXIgdG8gcXVhbnRpemVkIHZhbHVlLiBUaGUgaW52ZXJzZSBxdWFudGl6ZWQgcmVzdWx0IGlzCisgKiBzdG9yZWQgYmFjayBoZXJlLgorICogXHBhcmFtIGxzYiAyIExTQnMgb2YgdGhlIHNjYWxlIGZhY3RvciAoc2NhbGVGYWN0b3IgJSA0KSBhcHBsaWVkIGFzIHBvd2VyIDIKKyAqIGZhY3RvciB0byB0aGUgcmVzdWx0aW5nIGludmVyc2UgcXVhbnRpemVkIHZhbHVlLgogICogXHJldHVybiB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCAobWFudGlzc2EpIHN0b3JlZCBpbnRvICpwVmFsdWUuCiAgKi8KIEZES19JTkxJTkUKLWludCBFdmFsdWF0ZVBvd2VyNDMgKCBGSVhQX0RCTCAqcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgIFVJTlQgbHNiICkKLXsKK2ludCBFdmFsdWF0ZVBvd2VyNDMoRklYUF9EQkwgKnBWYWx1ZSwgVUlOVCBsc2IpIHsKICAgRklYUF9EQkwgdmFsdWU7CiAgIFVJTlQgZnJlZUJpdHM7CiAgIFVJTlQgZXhwb25lbnQ7CiAKICAgdmFsdWUgPSAqcFZhbHVlOwotICBmcmVlQml0cyA9IGZOb3JteiAodmFsdWUpIDsKLSAgZXhwb25lbnQgPSBERlJBQ1RfQklUUyAtIGZyZWVCaXRzIDsKLSAgRkRLX0FTU0VSVCAoZXhwb25lbnQgPCAxNCk7CisgIGZyZWVCaXRzID0gZk5vcm16KHZhbHVlKTsKKyAgZXhwb25lbnQgPSBERlJBQ1RfQklUUyAtIGZyZWVCaXRzOworICBGREtfQVNTRVJUKGV4cG9uZW50IDwgMTQpOwogCi0gIFVJTlQgeCA9ICgoKGludCl2YWx1ZSA8PCBmcmVlQml0cykgPj4gMTkpIDsKLSAgVUlOVCB0YWJsZUluZGV4ID0gKHggJiAweDBGRkYpID4+IDQgOwotICBGSVhQX0RCTCBpbnZRVmFsIDsKKyAgVUlOVCB4ID0gKCgoaW50KXZhbHVlIDw8IGZyZWVCaXRzKSA+PiAxOSk7CisgIFVJTlQgdGFibGVJbmRleCA9ICh4ICYgMHgwRkZGKSA+PiA0OworICBGSVhQX0RCTCBpbnZRVmFsOwogCiAgIHggPSB4ICYgMHgwRjsKIAotICBVSU5UIHIwPShMT05HKUludmVyc2VRdWFudFRhYmxlIFt0YWJsZUluZGV4KzBdOwotICBVSU5UIHIxPShMT05HKUludmVyc2VRdWFudFRhYmxlIFt0YWJsZUluZGV4KzFdOwotICBVU0hPUlQgbng9MTYteDsKLSAgVUlOVCB0ZW1wPShyMCkqbngrKHIxKSp4OworICBVSU5UIHIwID0gKExPTkcpSW52ZXJzZVF1YW50VGFibGVbdGFibGVJbmRleCArIDBdOworICBVSU5UIHIxID0gKExPTkcpSW52ZXJzZVF1YW50VGFibGVbdGFibGVJbmRleCArIDFdOworICBVU0hPUlQgbnggPSAxNiAtIHg7CisgIFVJTlQgdGVtcCA9IChyMCkqbnggKyAocjEpKng7CiAgIGludlFWYWwgPSAoRklYUF9EQkwpdGVtcDsKIAogICBGREtfQVNTRVJUKGxzYiA8IDQpOwotICAqcFZhbHVlID0gZk11bHREaXYyIChpbnZRVmFsLCBNYW50aXNzYVRhYmxlIFtsc2JdW2V4cG9uZW50XSkgOworICAqcFZhbHVlID0gZk11bHREaXYyKGludlFWYWwsIE1hbnRpc3NhVGFibGVbbHNiXVtleHBvbmVudF0pOwogCiAgIC8qICsgMSBjb21wZW5zYXRlcyBmTXVsdERpdjIoKS4gKi8KLSAgcmV0dXJuIEV4cG9uZW50VGFibGUgW2xzYl1bZXhwb25lbnRdICsgMTsKKyAgcmV0dXJuIEV4cG9uZW50VGFibGVbbHNiXVtleHBvbmVudF0gKyAxOwogfQogCisvKiBSZWNhbGN1bGF0ZSBnYWluICovCitGSVhQX0RCTCBnZXRfZ2Fpbihjb25zdCBGSVhQX0RCTCAqeCwgY29uc3QgRklYUF9EQkwgKnksIGludCBuKTsKKwogLyoqCi0gKiBcYnJpZWYgZGV0ZXJtaW5lIHRoZSByZXF1aXJlZCBzaGlmdCBzY2FsZSBmb3IgdGhlIGdpdmVuIHF1YW50aXplZCB2YWx1ZSBhbmQgc2NhbGUgKGZhY3RvciAlIDQpIHZhbHVlLgorICogXGJyaWVmIGRldGVybWluZSB0aGUgcmVxdWlyZWQgc2hpZnQgc2NhbGUgZm9yIHRoZSBnaXZlbiBxdWFudGl6ZWQgdmFsdWUgYW5kCisgKiBzY2FsZSAoZmFjdG9yICUgNCkgdmFsdWUuCiAgKi8KLUZES19JTkxJTkUgaW50IEdldFNjYWxlRnJvbVZhbHVlIChGSVhQX0RCTCB2YWx1ZSwgdW5zaWduZWQgaW50IGxzYikKLXsKLSAgaWYgKHZhbHVlIT0oRklYUF9EQkwpMCkKLSAgewotICAgIGludCBzY2FsZSA9IEV2YWx1YXRlUG93ZXI0MyAoJnZhbHVlLCBsc2IpIDsKLSAgICByZXR1cm4gQ250TGVhZGluZ1plcm9zICh2YWx1ZSkgLSBzY2FsZSAtIDIgOwotICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsgLyogUmV0dXJuIHplcm8sIGJlY2F1c2UgaXRzIHVzZWxlc3MgdG8gc2NhbGUgYSB6ZXJvIHZhbHVlLCBzYXZlcyB3b3JrbG9hZCBhbmQgYXZvaWRzIHNjYWxpbmcgb3ZlcnNoaWZ0cy4gKi8KK0ZES19JTkxJTkUgaW50IEdldFNjYWxlRnJvbVZhbHVlKEZJWFBfREJMIHZhbHVlLCB1bnNpZ25lZCBpbnQgbHNiKSB7CisgIGlmICh2YWx1ZSAhPSAoRklYUF9EQkwpMCkgeworICAgIGludCBzY2FsZSA9IEV2YWx1YXRlUG93ZXI0MygmdmFsdWUsIGxzYik7CisgICAgcmV0dXJuIENudExlYWRpbmdaZXJvcyh2YWx1ZSkgLSBzY2FsZSAtIDI7CisgIH0gZWxzZQorICAgIHJldHVybiAwOyAvKiBSZXR1cm4gemVybywgYmVjYXVzZSBpdHMgdXNlbGVzcyB0byBzY2FsZSBhIHplcm8gdmFsdWUsIHNhdmVzCisgICAgICAgICAgICAgICAgIHdvcmtsb2FkIGFuZCBhdm9pZHMgc2NhbGluZyBvdmVyc2hpZnRzLiAqLwogfQogCi0KLS8vI2lmZGVmIEFBQ0RFQ19IVUZGTUFOREVDT0RFUl9FTkFCTEUKLQogLyohCiAgIFxicmllZiBSZWFkIGh1ZmZtYW4gY29kZXdvcmQKIApAQCAtMjg2LDI3ICsyOTcsMjQgQEAKIAogICBccmV0dXJuICBpbmRleCB2YWx1ZQogKi8KLWlubGluZSBpbnQgQ0Jsb2NrX0RlY29kZUh1ZmZtYW5Xb3JkKCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gYml0c3RyZWFtICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZUJvb2tEZXNjcmlwdGlvbiAqaGNiICkgICAgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIGNvZGVib29rIGRlc2NyaXB0aW9uICovCitpbmxpbmUgaW50IENCbG9ja19EZWNvZGVIdWZmbWFuV29yZCgKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgICAgICAgIC8qITwgcG9pbnRlciB0byBiaXRzdHJlYW0gKi8KKyAgICBjb25zdCBDb2RlQm9va0Rlc2NyaXB0aW9uICpoY2IpIC8qITwgcG9pbnRlciB0byBjb2RlYm9vayBkZXNjcmlwdGlvbiAqLwogewogICBVSU5UIHZhbDsKICAgVUlOVCBpbmRleCA9IDA7Ci0gIGNvbnN0IFVTSE9SVCAoKkNvZGVCb29rKSBbSHVmZm1hbkVudHJpZXNdID0gaGNiLT5Db2RlQm9vazsKKyAgY29uc3QgVVNIT1JUKCpDb2RlQm9vaylbSHVmZm1hbkVudHJpZXNdID0gaGNiLT5Db2RlQm9vazsKIAotICB3aGlsZSAoMSkKLSAgewotICAgIHZhbCA9IENvZGVCb29rW2luZGV4XVtGREtyZWFkQml0cyhicyxIdWZmbWFuQml0cyldOyAvKiBFeHBlbnNpdmUgbWVtb3J5IGFjY2VzcyAqLworICB3aGlsZSAoMSkgeworICAgIHZhbCA9IENvZGVCb29rW2luZGV4XQorICAgICAgICAgICAgICAgICAgW0ZES3JlYWRCaXRzKGJzLCBIdWZmbWFuQml0cyldOyAvKiBFeHBlbnNpdmUgbWVtb3J5IGFjY2VzcyAqLwogCi0gICAgaWYgKCh2YWwgJiAxKSA9PSAwKQotICAgIHsKLSAgICAgIGluZGV4ID0gdmFsPj4yOworICAgIGlmICgodmFsICYgMSkgPT0gMCkgeworICAgICAgaW5kZXggPSB2YWwgPj4gMjsKICAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKHZhbCAmIDIpCi0gICAgICB7Ci0gICAgICAgIEZES3B1c2hCYWNrQ2FjaGUoYnMsMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICh2YWwgJiAyKSB7CisgICAgICAgIEZES3B1c2hCYWNrQ2FjaGUoYnMsIDEpOwogICAgICAgfQogCiAgICAgICB2YWwgPj49IDI7CkBAIC0zMTYsNyArMzI0LDIyIEBACiAKICAgcmV0dXJuIHZhbDsKIH0KK2lubGluZSBpbnQgQ0Jsb2NrX0RlY29kZUh1ZmZtYW5Xb3JkQ0IoCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIC8qITwgcG9pbnRlciB0byBiaXRzdHJlYW0gKi8KKyAgICBjb25zdCBVU0hPUlQgKAorICAgICAgICAqQ29kZUJvb2spW0h1ZmZtYW5FbnRyaWVzXSkgLyohPCBwb2ludGVyIHRvIGNvZGVib29rIGRlc2NyaXB0aW9uICovCit7CisgIFVJTlQgaW5kZXggPSAwOwogCi0vLyNlbmRpZiAvKiBBQUNERUNfSFVGRk1BTkRFQ09ERVJfRU5BQkxFICovCisgIHdoaWxlICgxKSB7CisgICAgaW5kZXggPSBDb2RlQm9va1tpbmRleF1bRkRLcmVhZDJCaXRzKGJzKV07IC8qIEV4cGVuc2l2ZSBtZW1vcnkgYWNjZXNzICovCisgICAgaWYgKGluZGV4ICYgMSkgYnJlYWs7CisgICAgaW5kZXggPj49IDI7CisgIH0KKyAgaWYgKGluZGV4ICYgMikgeworICAgIEZES3B1c2hCYWNrQ2FjaGUoYnMsIDEpOworICB9CisgIHJldHVybiBpbmRleCA+PiAyOworfQogCiAjZW5kaWYgLyogI2lmbmRlZiBCTE9DS19IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2NoYW5uZWwuY3BwIGIvbGliQUFDZGVjL3NyYy9jaGFubmVsLmNwcAppbmRleCA1NDc1MDc5Li5jZmZmZDU3IDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2NoYW5uZWwuY3BwCisrKyBiL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbC5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjEgKzkwLDIxIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKICAgIERlc2NyaXB0aW9uOgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiY2hhbm5lbC5oIgogI2luY2x1ZGUgImFhY2RlY29kZXIuaCIKICNpbmNsdWRlICJibG9jay5oIgogI2luY2x1ZGUgImFhY2RlY190bnMuaCIKICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCi0jaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgogCiAjaW5jbHVkZSAiY29uY2VhbC5oIgogCkBAIC0xMDEsMjcgKzExMiw0NiBAQAogCiAjaW5jbHVkZSAiYWFjZGVjX2hjci5oIgogCisjaW5jbHVkZSAidXNhY2RlY19scGQuaCIKKyNpbmNsdWRlICJ1c2FjZGVjX2ZhYy5oIgogCi1zdGF0aWMKLXZvaWQgTWFwTWlkU2lkZU1hc2tUb1Buc0NvcnJlbGF0aW9uIChDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzJdKQoteworc3RhdGljIHZvaWQgTWFwTWlkU2lkZU1hc2tUb1Buc0NvcnJlbGF0aW9uKAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMl0pIHsKICAgaW50IGdyb3VwOwogCi0gIGZvciAoZ3JvdXAgPSAwIDsgZ3JvdXAgPCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvLldpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvLldpbmRvd0dyb3VwczsKKyAgICAgICBncm91cCsrKSB7CiAgICAgVUNIQVIgZ3JvdXBNYXNrID0gMSA8PCBncm91cDsKIAotICAgIGZvciAoVUNIQVIgYmFuZCA9IDAgOyBiYW5kIDwgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mby5NYXhTZkJhbmRzOyBiYW5kKyspIHsKLSAgICAgIGlmIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wQ29tRGF0YS0+am9pbnRTdGVyZW9EYXRhLk1zVXNlZFtiYW5kXSAmIGdyb3VwTWFzaykgeyAvKiBjaGFubmVscyBhcmUgY29ycmVsYXRlZCAqLwotICAgICAgICBDUG5zX1NldENvcnJlbGF0aW9uKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5kYXRhLmFhYy5QbnNEYXRhLCBncm91cCwgYmFuZCwgMCk7CisgICAgZm9yIChVQ0hBUiBiYW5kID0gMDsgYmFuZCA8IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8uTWF4U2ZCYW5kczsKKyAgICAgICAgIGJhbmQrKykgeworICAgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBDb21EYXRhLT5qb2ludFN0ZXJlb0RhdGEuTXNVc2VkW2JhbmRdICYKKyAgICAgICAgICBncm91cE1hc2spIHsgLyogY2hhbm5lbHMgYXJlIGNvcnJlbGF0ZWQgKi8KKyAgICAgICAgQ1Buc19TZXRDb3JyZWxhdGlvbigmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+ZGF0YS5hYWMuUG5zRGF0YSwgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZCwgMCk7CiAKLSAgICAgICAgaWYgKENQbnNfSXNQbnNVc2VkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5kYXRhLmFhYy5QbnNEYXRhLCBncm91cCwgYmFuZCkgJiYKLSAgICAgICAgICAgIENQbnNfSXNQbnNVc2VkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5kYXRhLmFhYy5QbnNEYXRhLCBncm91cCwgYmFuZCkpCi0gICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cENvbURhdGEtPmpvaW50U3RlcmVvRGF0YS5Nc1VzZWRbYmFuZF0gXj0gZ3JvdXBNYXNrOyAvKiBjbGVhciB0aGUgZ3JvdXBNYXNrLWJpdCAqLworICAgICAgICBpZiAoQ1Buc19Jc1Buc1VzZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmRhdGEuYWFjLlBuc0RhdGEsIGdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZCkgJiYKKyAgICAgICAgICAgIENQbnNfSXNQbnNVc2VkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5kYXRhLmFhYy5QbnNEYXRhLCBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQpKQorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBDb21EYXRhLT5qb2ludFN0ZXJlb0RhdGEuTXNVc2VkW2JhbmRdIF49CisgICAgICAgICAgICAgIGdyb3VwTWFzazsgLyogY2xlYXIgdGhlIGdyb3VwTWFzay1iaXQgKi8KICAgICAgIH0KICAgICB9CiAgIH0KIH0KIAorc3RhdGljIHZvaWQgQ2xlYW5fQ29tcGxleF9QcmVkaWN0aW9uX2NvZWZmaWNpZW50cygKKyAgICBDSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YSAqcEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEsIGludCB3aW5kb3dHcm91cHMsCisgICAgY29uc3QgaW50IGxvd19saW1pdCwgY29uc3QgaW50IGhpZ2hfbGltaXQpIHsKKyAgZm9yIChpbnQgZ3JvdXAgPSAwOyBncm91cCA8IHdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgIGZvciAoaW50IHNmYiA9IGxvd19saW1pdDsgc2ZiIDwgaGlnaF9saW1pdDsgc2ZiKyspIHsKKyAgICAgIHBKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLT5hbHBoYV9xX3JlX3ByZXZbZ3JvdXBdW3NmYl0gPSAwOworICAgICAgcEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEtPmFscGhhX3FfaW1fcHJldltncm91cF1bc2ZiXSA9IDA7CisgICAgfQorICB9Cit9CisKIC8qIQogICBcYnJpZWYgRGVjb2RlIGNoYW5uZWwgcGFpciBlbGVtZW50CiAKQEAgLTEyOSw3OSArMTU5LDIzNSBAQAogCiAgIFxyZXR1cm4gIG5vbmUKICovCi12b2lkIENDaGFubmVsRWxlbWVudF9EZWNvZGUoIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMl0sIC8qITwgcG9pbnRlciB0byBhYWMgZGVjb2RlciBjaGFubmVsIGluZm8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1syXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZWxfY2hhbm5lbHMpCi17Ci0gIGludCBjaCwgbWF5YmVfanN0ZXJlbyA9IDA7Cit2b2lkIENDaGFubmVsRWxlbWVudF9EZWNvZGUoCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbworICAgICAgICAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1syXSwgLyohPCBwb2ludGVyIHRvIGFhYyBkZWNvZGVyIGNoYW5uZWwgaW5mbyAqLworICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bMl0sCisgICAgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sIFVJTlQgZmxhZ3MsIFVJTlQgZWxGbGFncywKKyAgICBpbnQgZWxfY2hhbm5lbHMpIHsKKyAgaW50IGNoID0gMDsKIAotICBtYXliZV9qc3RlcmVvID0gKGVsX2NoYW5uZWxzID4gMSk7CisgIGludCBtYXhTZkJhbmRzTCA9IDAsIG1heFNmQmFuZHNSID0gMDsKKyAgaW50IG1heWJlX2pzdGVyZW8gPSAoZWxfY2hhbm5lbHMgPiAxKTsKIAotICBmb3IgKGNoID0gMDsgY2ggPCBlbF9jaGFubmVsczsgY2grKykgewotICAgIGlmICggcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnJlbmRlck1vZGUgPT0gQUFDREVDX1JFTkRFUl9JTURDVAotICAgICAgfHwgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnJlbmRlck1vZGUgPT0gQUFDREVDX1JFTkRFUl9FTERGQiApCi0gICAgewotICAgICAgQ0Jsb2NrX0ludmVyc2VRdWFudGl6ZVNwZWN0cmFsRGF0YShwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSwgcFNhbXBsaW5nUmF0ZUluZm8pOworICBpZiAoZmxhZ3MgJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBKSAmJiBlbF9jaGFubmVscyA9PSAyKSB7CisgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmRhdGEudXNhYy5jb3JlX21vZGUgfHwKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+ZGF0YS51c2FjLmNvcmVfbW9kZSkgeworICAgICAgbWF5YmVfanN0ZXJlbyA9IDA7CiAgICAgfQogICB9CiAKKyAgaWYgKG1heWJlX2pzdGVyZW8pIHsKKyAgICBtYXhTZkJhbmRzTCA9CisgICAgICAgIEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mbyk7CisgICAgbWF4U2ZCYW5kc1IgPQorICAgICAgICBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPmljc0luZm8pOwogCisgICAgLyogYXBwbHkgbXMgKi8KKyAgICBpZiAocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdykgeworICAgICAgaWYgKCEoZmxhZ3MgJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBKSkpIHsKKyAgICAgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmRhdGEuYWFjLlBuc0RhdGEuUG5zQWN0aXZlIHx8CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5kYXRhLmFhYy5QbnNEYXRhLlBuc0FjdGl2ZSkgeworICAgICAgICAgIE1hcE1pZFNpZGVNYXNrVG9QbnNDb3JyZWxhdGlvbihwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogaWYgdG5zX29uX2xyID09IDEgcnVuIE1TICovIC8qICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLnVzYWMudG5zX2FjdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IDEpICovCisgICAgICBpZiAoKChmbGFncyAmIChBQ19VU0FDIHwgQUNfUlNWRDUwIHwgQUNfUlNWNjAzREEpKSAmJgorICAgICAgICAgICAocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cER5bkRhdGEtPnNwZWNpZmljVG8udXNhYy50bnNfb25fbHIgPT0KKyAgICAgICAgICAgIDEpKSB8fAorICAgICAgICAgICgoZmxhZ3MgJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBKSkgPT0gMCkpIHsKKyAgICAgICAgaW50IG1heF9zZmJfc3RlID0gKElOVCkocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mby5tYXhfc2ZiX3N0ZSk7CisKKyAgICAgICAgQ0pvaW50U3RlcmVvX0FwcGx5TVMoCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cFNwZWN0cmFsQ29lZmZpY2llbnQsCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5wU3BlY3RyYWxDb2VmZmljaWVudCwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBEeW5EYXRhLT5hU2ZiU2NhbGUsCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5wRHluRGF0YS0+YVNmYlNjYWxlLAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+c3BlY1NjYWxlLAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+c3BlY1NjYWxlLAorICAgICAgICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cygmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8pLAorICAgICAgICAgICAgR2V0V2luZG93R3JvdXBMZW5ndGhUYWJsZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mbyksCisgICAgICAgICAgICBHZXRXaW5kb3dHcm91cHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8pLCBtYXhfc2ZiX3N0ZSwKKyAgICAgICAgICAgIG1heFNmQmFuZHNMLCBtYXhTZkJhbmRzUiwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0KKyAgICAgICAgICAgICAgICAtPnBDb21EYXRhLT5qb2ludFN0ZXJlb0RhdGEuc3RvcmVfZG14X3JlX3ByZXYsCisgICAgICAgICAgICAmKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0KKyAgICAgICAgICAgICAgICAgIC0+cENvbURhdGEtPmpvaW50U3RlcmVvRGF0YS5zdG9yZV9kbXhfcmVfcHJldl9lKSwKKyAgICAgICAgICAgIDEpOworCisgICAgICB9IC8qIGlmICggKChlbEZsYWdzICYgQUNfRUxfVVNBQ19DUF9QT1NTSUJMRSkuLi4uICovCisgICAgfSAgIC8qIGlmIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93KSovCisKKyAgICAvKiBhcHBseSBpbnRlbnNpdHkgc3RlcmVvICovIC8qIG1vZGlmaWVzIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bXS0+YVNwZWNTZmIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICghKGZsYWdzICYgKEFDX1VTQUMgfCBBQ19SU1ZENTAgfCBBQ19SU1Y2MDNEQSkpKSB7CisgICAgICBpZiAoKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cgPT0KKyAgICAgICAgICAgMSkgJiYKKyAgICAgICAgICAoZWxfY2hhbm5lbHMgPT0gMikpIHsKKyAgICAgICAgQ0pvaW50U3RlcmVvX0FwcGx5SVMoCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cygmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8pLAorICAgICAgICAgICAgR2V0V2luZG93R3JvdXBMZW5ndGhUYWJsZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mbyksCisgICAgICAgICAgICBHZXRXaW5kb3dHcm91cHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8pLAorICAgICAgICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKAorICAgICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKSk7CisgICAgICB9CisgICAgfQorICB9IC8qIG1heWJlX3N0ZXJlbyAqLworCisgIGZvciAoY2ggPSAwOyBjaCA8IGVsX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5yZW5kZXJNb2RlID09IEFBQ0RFQ19SRU5ERVJfTFBEKSB7CisgICAgICAvKiBEZWNvZGUgTFBEIGRhdGEgKi8KKyAgICAgIENMcGRDaGFubmVsU3RyZWFtX0RlY29kZShwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXSwgZmxhZ3MpOworICAgIH0gZWxzZSB7CisgICAgICBVQ0hBUiBub1NmYnMgPQorICAgICAgICAgIEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmljc0luZm8pOworICAgICAgLyogRm9yIFVTQUMgY29tbW9uIHdpbmRvdzogbWF4X3NmYiBvZiBib3RoIGNoYW5uZWxzIG1heSBkaWZmZXIKKyAgICAgICAqIChjb21tb25fbWF4X3NmYiA9PSAwKS4gKi8KKyAgICAgIGlmICgobWF5YmVfanN0ZXJlbyA9PSAxKSAmJgorICAgICAgICAgIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93ID09CisgICAgICAgICAgIDEpKSB7CisgICAgICAgIG5vU2ZicyA9IGZNYXgobWF4U2ZCYW5kc0wsIG1heFNmQmFuZHNSKTsKKyAgICAgIH0KKyAgICAgIGludCBDUF9hY3RpdmUgPSAwOworICAgICAgaWYgKGVsRmxhZ3MgJiBBQ19FTF9VU0FDX0NQX1BPU1NJQkxFKSB7CisgICAgICAgIENQX2FjdGl2ZSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdCisgICAgICAgICAgICAgICAgICAgICAgICAtPnBDb21EYXRhLT5qb2ludFN0ZXJlb0RhdGEuY3BseF9wcmVkX2ZsYWc7CisgICAgICB9CisKKyAgICAgIC8qIE9taXQgd3JpdGluZyBvZiBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+c3BlY1NjYWxlIGZvciBjb21wbGV4CisgICAgICAgICBzdGVyZW8gcHJlZGljdGlvbiBzaW5jZSBzY2FsaW5nIGhhcyBhbHJlYWR5IGJlZW4gY2FycmllZCBvdXQuICovCisgICAgICBpbnQgbWF4X3NmYl9zdGUgPSAoSU5UKShwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvLm1heF9zZmJfc3RlKTsKKworICAgICAgaWYgKCghQ1BfYWN0aXZlKSB8fCAoQ1BfYWN0aXZlICYmIChtYXhfc2ZiX3N0ZSA8IG5vU2ZicykpIHx8CisgICAgICAgICAgKChmbGFncyAmIChBQ19VU0FDIHwgQUNfUlNWRDUwIHwgQUNfUlNWNjAzREEpKSAmJgorICAgICAgICAgICAocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cER5bkRhdGEtPnNwZWNpZmljVG8udXNhYy50bnNfb25fbHIgPT0KKyAgICAgICAgICAgIDApKSkgeworICAgICAgICBDQmxvY2tfU2NhbGVTcGVjdHJhbERhdGEocEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0sIG5vU2ZicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvKTsKKworICAgICAgICAvKkFjdGl2ZSBmb3IgdGhlIGNhc2Ugb2YgVE5TIGFwcGxpZWQgYmVmb3JlIE1TL0NQKi8KKyAgICAgICAgaWYgKChmbGFncyAmIChBQ19VU0FDIHwgQUNfUlNWRDUwIHwgQUNfUlNWNjAzREEpKSAmJgorICAgICAgICAgICAgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLnVzYWMudG5zX29uX2xyID09CisgICAgICAgICAgICAgMCkpIHsKKyAgICAgICAgICBpZiAoSXNMb25nQmxvY2soJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5pY3NJbmZvKSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub1NmYnM7IGkrKykgeworICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cER5bkRhdGEtPmFTZmJTY2FsZVtpXSA9CisgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+c3BlY1NjYWxlWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG5vU2ZiczsgaisrKSB7CisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBEeW5EYXRhLT5hU2ZiU2NhbGVbaSAqIDE2ICsgal0gPQorICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+c3BlY1NjYWxlW2ldOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IC8qIEVuZCAiZm9yIChjaCA9IDA7IGNoIDwgZWxfY2hhbm5lbHM7IGNoKyspIiAqLwogCiAgIGlmIChtYXliZV9qc3RlcmVvKSB7CiAgICAgLyogYXBwbHkgbXMgKi8KICAgICBpZiAocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdykgewotICAgICAgaW50IG1heFNmQmFuZHNMID0gR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKTsKLSAgICAgIGludCBtYXhTZkJhbmRzUiA9IEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+aWNzSW5mbyk7Ci0gICAgICBpZiAocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+ZGF0YS5hYWMuUG5zRGF0YS5QbnNBY3RpdmUgfHwgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+ZGF0YS5hYWMuUG5zRGF0YS5QbnNBY3RpdmUpIHsKLSAgICAgICAgTWFwTWlkU2lkZU1hc2tUb1Buc0NvcnJlbGF0aW9uKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pOworICAgIH0gLyogQ29tbW9uV2luZG93ICovCisgICAgZWxzZSB7CisgICAgICBpZiAoZWxGbGFncyAmIEFDX0VMX1VTQUNfQ1BfUE9TU0lCTEUpIHsKKyAgICAgICAgRkRLbWVtY2xlYXIoCisgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW0xdCisgICAgICAgICAgICAgICAgLT5wQ3BlU3RhdGljRGF0YS0+am9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS5hbHBoYV9xX3JlX3ByZXYsCisgICAgICAgICAgICBKb2ludFN0ZXJlb01heGltdW1Hcm91cHMgKiBKb2ludFN0ZXJlb01heGltdW1CYW5kcyAqIHNpemVvZihTSE9SVCkpOworICAgICAgICBGREttZW1jbGVhcigKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bTF0KKyAgICAgICAgICAgICAgICAtPnBDcGVTdGF0aWNEYXRhLT5qb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLmFscGhhX3FfaW1fcHJldiwKKyAgICAgICAgICAgIEpvaW50U3RlcmVvTWF4aW11bUdyb3VwcyAqIEpvaW50U3RlcmVvTWF4aW11bUJhbmRzICogc2l6ZW9mKFNIT1JUKSk7CisgICAgICB9CisgICAgfQorCisgIH0gLyogaWYgKG1heWJlX2pzdGVyZW8pICovCisKKyAgZm9yIChjaCA9IDA7IGNoIDwgZWxfY2hhbm5lbHM7IGNoKyspIHsKKyAgICBpZiAocEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnJlbmRlck1vZGUgPT0gQUFDREVDX1JFTkRFUl9MUEQpIHsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCEoZmxhZ3MgJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBKSkpIHsKKyAgICAgICAgLyogVXNlIHNhbWUgc2VlZCBmb3IgY291cGxlZCBjaGFubmVscyAoQ1BFKSAqLworICAgICAgICBpbnQgcG5zQ2ggPSAoY2ggPiAwKSA/IEwgOiBjaDsKKyAgICAgICAgQ1Buc19VcGRhdGVOb2lzZVN0YXRlKAorICAgICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5kYXRhLmFhYy5QbnNEYXRhLAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1twbnNDaF0tPmRhdGEuYWFjLlBuc0RhdGEuY3VycmVudFNlZWQsCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cENvbURhdGEtPnBuc1JhbmRvbVNlZWQpOwogICAgICAgfQogCi0gICAgICBDSm9pbnRTdGVyZW9fQXBwbHlNUyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kT2Zmc2V0cygmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mbywgcFNhbXBsaW5nUmF0ZUluZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0V2luZG93R3JvdXBMZW5ndGhUYWJsZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXaW5kb3dHcm91cHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2ZCYW5kc0wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTZkJhbmRzUik7CisgICAgICBpZiAoKCEoZmxhZ3MgJiAoQUNfVVNBQykpKSB8fAorICAgICAgICAgICgoZmxhZ3MgJiAoQUNfVVNBQykpICYmCisgICAgICAgICAgIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wRHluRGF0YS0+c3BlY2lmaWNUby51c2FjLnRuc19hY3RpdmUgPT0KKyAgICAgICAgICAgIDEpKSB8fAorICAgICAgICAgIChtYXliZV9qc3RlcmVvID09IDApKSB7CisgICAgICAgIEFwcGx5VG9vbHMoCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbywgZmxhZ3MsIGVsRmxhZ3MsIGNoLAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyk7CisgICAgICB9CisgICAgfSAvKiBFbmQgIn0gZWxzZSIgKi8KKyAgfSAgIC8qIEVuZCAiZm9yIChjaCA9IDA7IGNoIDwgZWxfY2hhbm5lbHM7IGNoKyspIiAqLworCisgIGlmIChtYXliZV9qc3RlcmVvKSB7CisgICAgLyogYXBwbHkgbXMgKi8KKyAgICBpZiAocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdykgeworICAgICAgLyogaWYgdG5zX29uX2xyID09IDAgcnVuIE1TICovCisgICAgICBpZiAoKGZsYWdzICYgKEFDX1VTQUMgfCBBQ19SU1ZENTAgfCBBQ19SU1Y2MDNEQSkpICYmCisgICAgICAgICAgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLnVzYWMudG5zX29uX2xyID09CisgICAgICAgICAgIDApKSB7CisgICAgICAgIGludCBtYXhfc2ZiX3N0ZSA9IChJTlQpKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8ubWF4X3NmYl9zdGUpOworCisgICAgICAgIENKb2ludFN0ZXJlb19BcHBseU1TKAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mbywgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBTcGVjdHJhbENvZWZmaWNpZW50LAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+cFNwZWN0cmFsQ29lZmZpY2llbnQsCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wRHluRGF0YS0+YVNmYlNjYWxlLAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+cER5bkRhdGEtPmFTZmJTY2FsZSwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnNwZWNTY2FsZSwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPnNwZWNTY2FsZSwKKyAgICAgICAgICAgIEdldFNjYWxlRmFjdG9yQmFuZE9mZnNldHMoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvKSwKKyAgICAgICAgICAgIEdldFdpbmRvd0dyb3VwTGVuZ3RoVGFibGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8pLAorICAgICAgICAgICAgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKSwgbWF4X3NmYl9zdGUsCisgICAgICAgICAgICBtYXhTZkJhbmRzTCwgbWF4U2ZCYW5kc1IsCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdCisgICAgICAgICAgICAgICAgLT5wQ29tRGF0YS0+am9pbnRTdGVyZW9EYXRhLnN0b3JlX2RteF9yZV9wcmV2LAorICAgICAgICAgICAgJihwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdCisgICAgICAgICAgICAgICAgICAtPnBDb21EYXRhLT5qb2ludFN0ZXJlb0RhdGEuc3RvcmVfZG14X3JlX3ByZXZfZSksCisgICAgICAgICAgICAxKTsKKyAgICAgIH0KKworICAgIH0gLyogaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cpICovCisKKyAgfSAvKiBpZiAobWF5YmVfanN0ZXJlbykgKi8KKworICBmb3IgKGNoID0gMDsgY2ggPCBlbF9jaGFubmVsczsgY2grKykgeworICAgIGlmIChlbEZsYWdzICYgQUNfRUxfVVNBQ19DUF9QT1NTSUJMRSkgeworICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tMXQorICAgICAgICAgIC0+cENwZVN0YXRpY0RhdGEtPmpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEuY2xlYXJTcGVjdHJhbENvZWZmcyA9IDA7CiAgICAgfQotCi0gICAgLyogYXBwbHkgaW50ZW5zaXR5IHN0ZXJlbyAqLyAvKiBtb2RpZmllcyBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW10tPmFTcGVjU2ZiICovCi0gICAgQ0pvaW50U3RlcmVvX0FwcGx5SVMocEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgR2V0V2luZG93R3JvdXBMZW5ndGhUYWJsZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cgPyAxIDogMCk7Ci0KICAgfQogCi0gIGZvciAoY2ggPSAwOyBjaCA8IGVsX2NoYW5uZWxzOyBjaCsrKQotICB7Ci0gICAgewotICAgICAgLyogd3JpdGUgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnNwZWNTY2FsZSAqLwotICAgICAgQ0Jsb2NrX1NjYWxlU3BlY3RyYWxEYXRhKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLCBwU2FtcGxpbmdSYXRlSW5mbyk7Ci0KLSAgICAgIEFwcGx5VG9vbHMgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIHBTYW1wbGluZ1JhdGVJbmZvLCBmbGFncywgY2gpOwotICAgIH0KLQotICB9Ci0KLSAgQ1J2bGNfRWxlbWVudENoZWNrKAotICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKLSAgICAgICAgICBmbGFncywKLSAgICAgICAgICBlbF9jaGFubmVscwotICAgICAgICAgICk7CisgIENSdmxjX0VsZW1lbnRDaGVjayhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIGVsX2NoYW5uZWxzKTsKIH0KIAotdm9pZCBDQ2hhbm5lbF9Db2RlYm9va1RhYmxlSW5pdChDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKQotewordm9pZCBDQ2hhbm5lbF9Db2RlYm9va1RhYmxlSW5pdCgKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKSB7CiAgIGludCBiLCB3LCBtYXhCYW5kcywgbWF4V2luZG93czsKICAgaW50IG1heFNmYiA9IEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7CiAgIFVDSEFSICpwQ29kZUJvb2sgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rOwogCi0gIGlmICggSXNMb25nQmxvY2soJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pICkgeworICBpZiAoSXNMb25nQmxvY2soJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pKSB7CiAgICAgbWF4QmFuZHMgPSA2NDsKICAgICBtYXhXaW5kb3dzID0gMTsKICAgfSBlbHNlIHsKQEAgLTIwOSw2MCArMzk1LDY5IEBACiAgICAgbWF4V2luZG93cyA9IDg7CiAgIH0KIAotICBmb3IgKHcgPSAwOyB3PG1heFdpbmRvd3M7IHcrKykgeworICBmb3IgKHcgPSAwOyB3IDwgbWF4V2luZG93czsgdysrKSB7CiAgICAgZm9yIChiID0gMDsgYiA8IG1heFNmYjsgYisrKSB7CiAgICAgICBwQ29kZUJvb2tbYl0gPSBFU0NCT09LOwogICAgIH0KLSAgICBmb3IgKDsgYjxtYXhCYW5kczsgYisrKSB7CisgICAgZm9yICg7IGIgPCBtYXhCYW5kczsgYisrKSB7CiAgICAgICBwQ29kZUJvb2tbYl0gPSBaRVJPX0hDQjsKICAgICB9CiAgICAgcENvZGVCb29rICs9IG1heEJhbmRzOwogICB9CiB9CiAKLQogLyoKICAqIEFyYml0cmFyeSBvcmRlciBiaXRzdHJlYW0gcGFyc2VyCiAgKi8KLQotQUFDX0RFQ09ERVJfRVJST1IgQ0NoYW5uZWxFbGVtZW50X1JlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgIGZyYW1lX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIG51bWJlck9mQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0hBUiBlcENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9UUkFOU1BPUlRERUMgcFRwRGVjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CitBQUNfREVDT0RFUl9FUlJPUiBDQ2hhbm5lbEVsZW1lbnRfUmVhZCgKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bXSwKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW10sCisgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgYW90LCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKKyAgICBjb25zdCBVSU5UIGZsYWdzLCBjb25zdCBVSU5UIGVsRmxhZ3MsIGNvbnN0IFVJTlQgZnJhbWVfbGVuZ3RoLAorICAgIGNvbnN0IFVDSEFSIG51bWJlck9mQ2hhbm5lbHMsIGNvbnN0IFNDSEFSIGVwQ29uZmlnLAorICAgIEhBTkRMRV9UUkFOU1BPUlRERUMgcFRwRGVjKSB7CiAgIEFBQ19ERUNPREVSX0VSUk9SIGVycm9yID0gQUFDX0RFQ19PSzsKICAgY29uc3QgZWxlbWVudF9saXN0X3QgKmxpc3Q7CiAgIGludCBpLCBjaCwgZGVjaXNpb25fYml0OwogICBpbnQgY3JjUmVnMSA9IC0xLCBjcmNSZWcyID0gLTE7CisgIGludCBjcGx4UHJlZDsKKyAgaW50IGluZF9zd19jY2VfZmxhZyA9IDAsIG51bV9nYWluX2VsZW1lbnRfbGlzdHMgPSAwOwogCi0gIEZES19BU1NFUlQoIChudW1iZXJPZkNoYW5uZWxzID09IDEpIHx8IChudW1iZXJPZkNoYW5uZWxzID09IDIpICk7CisgIEZES19BU1NFUlQoKG51bWJlck9mQ2hhbm5lbHMgPT0gMSkgfHwgKG51bWJlck9mQ2hhbm5lbHMgPT0gMikpOwogCiAgIC8qIEdldCBjaGFubmVsIGVsZW1lbnQgc2VxdWVuY2UgdGFibGUgKi8KLSAgbGlzdCA9IGdldEJpdHN0cmVhbUVsZW1lbnRMaXN0KGFvdCwgZXBDb25maWcsIG51bWJlck9mQ2hhbm5lbHMsIDApOworICBsaXN0ID0gZ2V0Qml0c3RyZWFtRWxlbWVudExpc3QoYW90LCBlcENvbmZpZywgbnVtYmVyT2ZDaGFubmVscywgMCwgZWxGbGFncyk7CiAgIGlmIChsaXN0ID09IE5VTEwpIHsKICAgICBlcnJvciA9IEFBQ19ERUNfVU5TVVBQT1JURURfRk9STUFUOwogICAgIGdvdG8gYmFpbDsKICAgfQogCiAgIENUbnNfUmVzZXQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnBEeW5EYXRhLT5UbnNEYXRhKTsKKyAgLyogU2V0IGNvbW1vbiB3aW5kb3cgdG8gMCBieSBkZWZhdWx0LiBJZiBzaWduYWxpemVkIGluIHRoZSBiaXQgc3RyZWFtIGl0IHdpbGwKKyAgICogYmUgb3ZlcndyaXR0ZW4gbGF0ZXIgZXhwbGljaXRlbHkgKi8KKyAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyA9IDA7CisgIGlmIChmbGFncyAmIChBQ19VU0FDIHwgQUNfUlNWRDUwIHwgQUNfUlNWNjAzREEpKSB7CisgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPnNwZWNpZmljVG8udXNhYy50bnNfYWN0aXZlID0gMDsKKyAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wRHluRGF0YS0+c3BlY2lmaWNUby51c2FjLnRuc19vbl9sciA9IDA7CisgIH0KICAgaWYgKG51bWJlck9mQ2hhbm5lbHMgPT0gMikgewogICAgIENUbnNfUmVzZXQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0tPnBEeW5EYXRhLT5UbnNEYXRhKTsKKyAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93ID0gMDsKICAgfQogCi0gIGlmIChmbGFncyAmIChBQ19FTER8QUNfU0NBTEFCTEUpKSB7CisgIGNwbHhQcmVkID0gMDsKKyAgaWYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gIT0gTlVMTCkgeworICAgIGlmIChlbEZsYWdzICYgQUNfRUxfVVNBQ19DUF9QT1NTSUJMRSkgeworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cENvbURhdGEtPmpvaW50U3RlcmVvRGF0YS5jcGx4X3ByZWRfZmxhZyA9IDA7CisgICAgICBjcGx4UHJlZCA9IDE7CisgICAgfQorICB9CisKKyAgaWYgKDAgfHwgKGZsYWdzICYgKEFDX0VMRCB8IEFDX1NDQUxBQkxFKSkpIHsKICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93ID0gMTsKICAgICBpZiAobnVtYmVyT2ZDaGFubmVscyA9PSAyKSB7Ci0gICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93ID0gcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdzsKLSAgICB9Ci0gICAgaWYgKG51bWJlck9mQ2hhbm5lbHMgPT0gMikgewotICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3c7CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93ID0KKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93OwogICAgIH0KICAgfQogCkBAIC0yNzIsMTcwICs0NjcsNDEzIEBACiAgIGRlY2lzaW9uX2JpdCA9IDA7CiAgIGRvIHsKICAgICBzd2l0Y2ggKGxpc3QtPmlkW2ldKSB7Ci0gICAgY2FzZSBlbGVtZW50X2luc3RhbmNlX3RhZzoKLSAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPkVsZW1lbnRJbnN0YW5jZVRhZyA9IEZES3JlYWRCaXRzKGhCcywgNCk7Ci0gICAgICBpZiAobnVtYmVyT2ZDaGFubmVscyA9PSAyKSB7Ci0gICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0tPkVsZW1lbnRJbnN0YW5jZVRhZyA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPkVsZW1lbnRJbnN0YW5jZVRhZzsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29tbW9uX3dpbmRvdzoKLSAgICAgIGRlY2lzaW9uX2JpdCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKLSAgICAgIGlmIChudW1iZXJPZkNoYW5uZWxzID09IDIpIHsKLSAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3c7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGljc19pbmZvOgotICAgICAgLyogUmVhZCBpbmRpdmlkdWFsIGNoYW5uZWwgaW5mbyAqLwotICAgICAgZXJyb3IgPSBJY3NSZWFkKCBoQnMsCi0gICAgICAgICAgICAgICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5pY3NJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgKTsKKyAgICAgIGNhc2UgZWxlbWVudF9pbnN0YW5jZV90YWc6CisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPkVsZW1lbnRJbnN0YW5jZVRhZyA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgICAgIGlmIChudW1iZXJPZkNoYW5uZWxzID09IDIpIHsKKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5FbGVtZW50SW5zdGFuY2VUYWcgPQorICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5FbGVtZW50SW5zdGFuY2VUYWc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGNvbW1vbl93aW5kb3c6CisgICAgICAgIGRlY2lzaW9uX2JpdCA9CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyA9CisgICAgICAgICAgICAgICAgRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICAgICAgaWYgKG51bWJlck9mQ2hhbm5lbHMgPT0gMikgeworICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cgPQorICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBpY3NfaW5mbzoKKyAgICAgICAgLyogc3RvcmUgbGFzdCB3aW5kb3cgc2VxdWVuY2UgKHV0aWxpemVkIGluIGNvbXBsZXggc3RlcmVvIHByZWRpY3Rpb24pCisgICAgICAgICAqIGJlZm9yZSByZWFkaW5nIG5ldyBjaGFubmVsLWluZm8gKi8KKyAgICAgICAgaWYgKGNwbHhQcmVkKSB7CisgICAgICAgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cpIHsKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bMF0KKyAgICAgICAgICAgICAgICAtPnBDcGVTdGF0aWNEYXRhLT5qb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLndpblNlcVByZXYgPQorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPmljc0luZm8uV2luZG93U2VxdWVuY2U7CisgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvWzBdCisgICAgICAgICAgICAgICAgLT5wQ3BlU3RhdGljRGF0YS0+am9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS53aW5TaGFwZVByZXYgPQorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPmljc0luZm8uV2luZG93U2hhcGU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIFJlYWQgaW5kaXZpZHVhbCBjaGFubmVsIGluZm8gKi8KKyAgICAgICAgZXJyb3IgPSBJY3NSZWFkKGhCcywgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5pY3NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sIGZsYWdzKTsKIAotICAgICAgaWYgKG51bWJlck9mQ2hhbm5lbHMgPT0gMiAmJiBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93KSB7Ci0gICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0tPmljc0luZm8gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5pY3NJbmZvOwotICAgICAgfQotICAgICAgYnJlYWs7CisgICAgICAgIGlmIChlbEZsYWdzICYgQUNfRUxfTEZFICYmCisgICAgICAgICAgICBHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmljc0luZm8pICE9CisgICAgICAgICAgICAgICAgQkxPQ0tfTE9ORykgeworICAgICAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCisgICAgICAgIGlmIChudW1iZXJPZkNoYW5uZWxzID09IDIgJiYKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5Db21tb25XaW5kb3cpIHsKKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5pY3NJbmZvID0KKyAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+aWNzSW5mbzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotICAgIGNhc2UgbHRwX2RhdGFfcHJlc2VudDoKLSAgICAgIGlmIChGREtyZWFkQml0cyhoQnMsIDEpICE9IDApIHsKLSAgICAgICAgZXJyb3IgPSBBQUNfREVDX1VOU1VQUE9SVEVEX1BSRURJQ1RJT047Ci0gICAgICB9Ci0gICAgICBicmVhazsKKyAgICAgIGNhc2UgY29tbW9uX21heF9zZmI6CisgICAgICAgIGlmIChGREtyZWFkQml0KGhCcykgPT0gMCkgeworICAgICAgICAgIGVycm9yID0gSWNzUmVhZE1heFNmYihoQnMsICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5pY3NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIG1zOgotICAgICAgaWYgKCBDSm9pbnRTdGVyZW9fUmVhZCgKLSAgICAgICAgICAgICAgaEJzLAotICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wQ29tRGF0YS0+am9pbnRTdGVyZW9EYXRhLCAKLSAgICAgICAgICAgICAgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5pY3NJbmZvKSwKLSAgICAgICAgICAgICAgR2V0U2NhbGVNYXhGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5pY3NJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0tPmljc0luZm8pLAotICAgICAgICAgICAgICBmbGFncykgKQorICAgICAgY2FzZSBsdHBfZGF0YV9wcmVzZW50OgorICAgICAgICBpZiAoRkRLcmVhZEJpdHMoaEJzLCAxKSAhPSAwKSB7CisgICAgICAgICAgZXJyb3IgPSBBQUNfREVDX1VOU1VQUE9SVEVEX1BSRURJQ1RJT047CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgbXM6CisKKyAgICAgICAgSU5UIG1heF9zZmJfc3RlOworICAgICAgICBJTlQgbWF4X3NmYl9zdGVfY2xlYXI7CisKKyAgICAgICAgbWF4X3NmYl9zdGUgPSBHZXRTY2FsZU1heEZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoCisgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+aWNzSW5mbywKKyAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5pY3NJbmZvKTsKKworICAgICAgICBtYXhfc2ZiX3N0ZV9jbGVhciA9IDY0OworCisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPmljc0luZm8ubWF4X3NmYl9zdGUgPSAoVUNIQVIpbWF4X3NmYl9zdGU7CisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0tPmljc0luZm8ubWF4X3NmYl9zdGUgPSAoVUNIQVIpbWF4X3NmYl9zdGU7CisKKyAgICAgICAgaWYgKGZsYWdzICYgKEFDX1VTQUMgfCBBQ19SU1Y2MDNEQSkgJiYKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93ID09CisgICAgICAgICAgICAgICAgMCkgeworICAgICAgICAgIENsZWFuX0NvbXBsZXhfUHJlZGljdGlvbl9jb2VmZmljaWVudHMoCisgICAgICAgICAgICAgICZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvWzBdCisgICAgICAgICAgICAgICAgICAgLT5wQ3BlU3RhdGljRGF0YS0+am9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YSwKKyAgICAgICAgICAgICAgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5pY3NJbmZvKSwgMCwgNjQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKENKb2ludFN0ZXJlb19SZWFkKAorICAgICAgICAgICAgICAgIGhCcywgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0tPnBDb21EYXRhLT5qb2ludFN0ZXJlb0RhdGEsCisgICAgICAgICAgICAgICAgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5pY3NJbmZvKSwKKyAgICAgICAgICAgICAgICBtYXhfc2ZiX3N0ZSwgbWF4X3NmYl9zdGVfY2xlYXIsCisgICAgICAgICAgICAgICAgLyogam9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YSBhbmQgY3BseFByZWRpY3Rpb25EYXRhIGFyZSBvbmx5CisgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlL2FsbG9jYXRlZCBpZiBjcGx4UHJlZCBpcyBhY3RpdmUuICovCisgICAgICAgICAgICAgICAgKChjcGx4UHJlZCA9PSAwKSB8fCAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgPyBOVUxMCisgICAgICAgICAgICAgICAgICAgIDogJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cENwZVN0YXRpY0RhdGEtPmpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEsCisgICAgICAgICAgICAgICAgKChjcGx4UHJlZCA9PSAwKSB8fCAocEFhY0RlY29kZXJDaGFubmVsSW5mb1swXSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgPyBOVUxMCisgICAgICAgICAgICAgICAgICAgIDogcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXQorICAgICAgICAgICAgICAgICAgICAgICAgICAtPnBDb21TdGF0aWNEYXRhLT5jcGx4UHJlZGljdGlvbkRhdGEsCisgICAgICAgICAgICAgICAgY3BseFByZWQsCisgICAgICAgICAgICAgICAgR2V0U2NhbGVGYWN0b3JCYW5kc1RvdGFsKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5pY3NJbmZvKSwKKyAgICAgICAgICAgICAgICBHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+aWNzSW5mbyksCisgICAgICAgICAgICAgICAgZmxhZ3MpKSB7CisgICAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgZ2xvYmFsX2dhaW46CisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uR2xvYmFsR2FpbiA9CisgICAgICAgICAgICAoVUNIQVIpRkRLcmVhZEJpdHMoaEJzLCA4KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2Ugc2VjdGlvbl9kYXRhOgorICAgICAgICBlcnJvciA9IENCbG9ja19SZWFkU2VjdGlvbkRhdGEoaEJzLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLCBmbGFncyk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHNjYWxlX2ZhY3Rvcl9kYXRhX3VzYWM6CisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5jdXJyQWxpYXNpbmdTeW1tZXRyeSA9IDA7CisgICAgICAgIC8qIFNldCBhY3RpdmUgc2ZiIGNvZGVib29rIGluZGV4ZXMgdG8gSENCX0VTQyB0byBtYWtlIHRoZW0gImFjdGl2ZSIgKi8KKyAgICAgICAgQ0NoYW5uZWxfQ29kZWJvb2tUYWJsZUluaXQoCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSk7IC8qICBlcXVhbHMgUmVhZFNlY3Rpb25EYXRhKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzKSBpbiBmbG9hdCBzb2Z0LiBibG9jay5jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IH41OTkgKi8KKyAgICAgICAgLyogTm90ZTogVGhlIG1pc3NpbmcgImJyZWFrIiBpcyBpbnRlbnRpb25hbCBoZXJlLCBzaW5jZSB3ZSBuZWVkIHRvIGNhbGwKKyAgICAgICAgICogQ0Jsb2NrX1JlYWRTY2FsZUZhY3RvckRhdGEoKS4gKi8KKworICAgICAgY2FzZSBzY2FsZV9mYWN0b3JfZGF0YToKKyAgICAgICAgaWYgKGZsYWdzICYgQUNfRVJfUlZMQykgeworICAgICAgICAgIC8qIHJlYWQgUlZMQyBkYXRhIGZyb20gYml0c3RyZWFtIChlcnJvciBzZW5zLiBjYXQuIDEpICovCisgICAgICAgICAgQ1J2bGNfUmVhZChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSwgaEJzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBlcnJvciA9IENCbG9ja19SZWFkU2NhbGVGYWN0b3JEYXRhKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLCBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgcHVsc2U6CisgICAgICAgIGlmIChDUHVsc2VEYXRhX1JlYWQoCisgICAgICAgICAgICAgICAgaEJzLAorICAgICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLlB1bHNlRGF0YSwKKyAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19Mb25nLCAvKiBwdWxzZSBkYXRhIGlzIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudCBpbiBsb25nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzISAqLworICAgICAgICAgICAgICAgICh2b2lkICopJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5pY3NJbmZvLAorICAgICAgICAgICAgICAgIGZyYW1lX2xlbmd0aCkgIT0gMCkgeworICAgICAgICAgIGVycm9yID0gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRuc19kYXRhX3ByZXNlbnQ6CisgICAgICAgIENUbnNfUmVhZERhdGFQcmVzZW50RmxhZygKKyAgICAgICAgICAgIGhCcywgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wRHluRGF0YS0+VG5zRGF0YSk7CisgICAgICAgIGlmIChlbEZsYWdzICYgQUNfRUxfTEZFICYmCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cER5bkRhdGEtPlRuc0RhdGEuRGF0YVByZXNlbnQpIHsKKyAgICAgICAgICBlcnJvciA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRuc19kYXRhOgorICAgICAgICAvKiB0bnNfZGF0YV9wcmVzZW50IGlzIGNoZWNrZWQgaW5zaWRlIENUbnNfUmVhZCgpLiAqLworICAgICAgICBlcnJvciA9IENUbnNfUmVhZChoQnMsICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cER5bkRhdGEtPlRuc0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+aWNzSW5mbywgZmxhZ3MpOworCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGdhaW5fY29udHJvbF9kYXRhOgorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50OgorICAgICAgICBpZiAoRkRLcmVhZEJpdHMoaEJzLCAxKSkgeworICAgICAgICAgIGVycm9yID0gQUFDX0RFQ19VTlNVUFBPUlRFRF9HQUlOX0NPTlRST0xfREFUQTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0d19kYXRhOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgY29tbW9uX3R3OgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdG5zX2RhdGFfcHJlc2VudF91c2FjOgorICAgICAgICBpZiAocEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPnNwZWNpZmljVG8udXNhYy50bnNfYWN0aXZlKSB7CisgICAgICAgICAgQ1Ruc19SZWFkRGF0YVByZXNlbnRVc2FjKAorICAgICAgICAgICAgICBoQnMsICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wRHluRGF0YS0+VG5zRGF0YSwKKyAgICAgICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0tPnBEeW5EYXRhLT5UbnNEYXRhLAorICAgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPnNwZWNpZmljVG8udXNhYy50bnNfb25fbHIsCisgICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5pY3NJbmZvLCBmbGFncywgZWxGbGFncywKKyAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkNvbW1vbldpbmRvdyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPnNwZWNpZmljVG8udXNhYy50bnNfb25fbHIgPQorICAgICAgICAgICAgICAoVUNIQVIpMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgY29yZV9tb2RlOgorICAgICAgICBkZWNpc2lvbl9iaXQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+ZGF0YS51c2FjLmNvcmVfbW9kZSA9IGRlY2lzaW9uX2JpdDsKKyAgICAgICAgaWYgKChjaCA9PSAxKSAmJiAocEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+ZGF0YS51c2FjLmNvcmVfbW9kZSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5kYXRhLnVzYWMuY29yZV9tb2RlKSkgeworICAgICAgICAgIC8qIFN0ZXJlb0NvcmVUb29sSW5mbyhjb3JlX21vZGVbY2hdICkgKi8KKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93ID0gMDsKKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uQ29tbW9uV2luZG93ID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdG5zX2FjdGl2ZToKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPnNwZWNpZmljVG8udXNhYy50bnNfYWN0aXZlID0KKyAgICAgICAgICAgIEZES3JlYWRCaXQoaEJzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIG5vaXNlOgorICAgICAgICBpZiAoZWxGbGFncyAmIEFDX0VMX1VTQUNfTk9JU0UpIHsKKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXQorICAgICAgICAgICAgICAtPnBEeW5EYXRhLT5zcGVjaWZpY1RvLnVzYWMuZmRfbm9pc2VfbGV2ZWxfYW5kX29mZnNldCA9CisgICAgICAgICAgICAgIEZES3JlYWRCaXRzKGhCcywgMyArIDUpOyAvKiBOb2lzZSBsZXZlbCAqLworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBscGRfY2hhbm5lbF9zdHJlYW06CisKICAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICBlcnJvciA9IENMcGRDaGFubmVsU3RyZWFtX1JlYWQoLyogPSBscGRfY2hhbm5lbF9zdHJlYW0oKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJzLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sIGZsYWdzKTsKICAgICAgIH0KLSAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBnbG9iYWxfZ2FpbjoKLSAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uR2xvYmFsR2FpbiA9IChVQ0hBUikgRkRLcmVhZEJpdHMoaEJzLDgpOwotICAgICAgYnJlYWs7CisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5yZW5kZXJNb2RlID0gQUFDREVDX1JFTkRFUl9MUEQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBmYWNfZGF0YTogeworICAgICAgICBpbnQgZkZhY0RhdFByZXNlbnQgPSBGREtyZWFkQml0KGhCcyk7CiAKLSAgICBjYXNlIHNlY3Rpb25fZGF0YToKLSAgICAgIGVycm9yID0gQ0Jsb2NrX1JlYWRTZWN0aW9uRGF0YSggaEJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICk7Ci0gICAgICBicmVhazsKKyAgICAgICAgLyogV2VlIG5lZWQgYSB2YWxpZCBmYWNfZGF0YVswXSBldmVuIGlmIG5vIEZBQyBkYXRhIGlzIHByZXNlbnQgKGFzCisgICAgICAgICAqIHRlbXBvcmFsIGJ1ZmZlcikgKi8KKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmRhdGEudXNhYy5mYWNfZGF0YVswXSA9CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+ZGF0YS51c2FjLmZhY19kYXRhMDsKIAorICAgICAgICBpZiAoZkZhY0RhdFByZXNlbnQpIHsKKyAgICAgICAgICBpZiAoZWxGbGFncyAmIEFDX0VMX0xGRSkgeworICAgICAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIEZBQyBkYXRhIHByZXNlbnQsIHRoaXMgZnJhbWUgaXMgRkQsIHNvIHRoZSBsYXN0IG1vZGUgaGFkIHRvIGJlCisgICAgICAgICAgICogQUNFTFAuICovCisgICAgICAgICAgaWYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5sYXN0X2NvcmVfbW9kZSAhPSBMUEQgfHwKKyAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPmxhc3RfbHBkX21vZGUgIT0gMCkgeworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmRhdGEudXNhYy5jb3JlX21vZGVfbGFzdCA9IExQRDsKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5kYXRhLnVzYWMubHBkX21vZGVfbGFzdCA9IDA7CisgICAgICAgICAgICAvKiBXZSBjYW4ndCBjaGFuZ2UgdGhlIHBhc3QhIFNvIGxvb2sgdG8gdGhlIGZ1dHVyZSBhbmQgZ28gYWhlYWQhICovCisgICAgICAgICAgfQorICAgICAgICAgIENMcGRfRkFDX1JlYWQoaEJzLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+ZGF0YS51c2FjLmZhY19kYXRhWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmRhdGEudXNhYy5mYWNfZGF0YV9lLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0xwZF9GQUNfZ2V0TGVuZ3RoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzTG9uZ0Jsb2NrKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+aWNzSW5mbyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmdyYW51bGVMZW5ndGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5sYXN0X2NvcmVfbW9kZSA9PSBMUEQgJiYKKyAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPmxhc3RfbHBkX21vZGUgPT0gMCkgeworICAgICAgICAgICAgLyogQUNFTFAgdG8gRkQgdHJhbnNpdG9ucyB3aXRob3V0IEZBQyBhcmUgcG9zc2libGUuIFRoYXQgaXMgd2h5IHdlCisgICAgICAgICAgICB6ZXJvIGl0IG91dCAoaS5lIEZBQyB3aWxsIG5vdCBiZSBjb25zaWRlcmVkIGluIHRoZSBzdWJzZXF1ZW50CisgICAgICAgICAgICBjYWxjdWxhdGlvbnMgKi8KKyAgICAgICAgICAgIEZES21lbWNsZWFyKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5kYXRhLnVzYWMuZmFjX2RhdGEwLAorICAgICAgICAgICAgICAgICAgICAgICAgTEZBQyAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgZXNjMl9ydmxjOgorICAgICAgICBpZiAoZmxhZ3MgJiBBQ19FUl9SVkxDKSB7CisgICAgICAgICAgQ1J2bGNfRGVjb2RlKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLAorICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXSwgaEJzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotICAgIGNhc2Ugc2NhbGVfZmFjdG9yX2RhdGE6Ci0gICAgICBpZiAoZmxhZ3MgJiBBQ19FUl9SVkxDKSB7Ci0gICAgICAgIC8qIHJlYWQgUlZMQyBkYXRhIGZyb20gYml0c3RyZWFtIChlcnJvciBzZW5zLiBjYXQuIDEpICovIAotICAgICAgICBDUnZsY19SZWFkKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLCBoQnMpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBlcnJvciA9IENCbG9ja19SZWFkU2NhbGVGYWN0b3JEYXRhKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLCBoQnMsIGZsYWdzKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOworICAgICAgY2FzZSBlc2MxX2hjcjoKKyAgICAgICAgaWYgKGZsYWdzICYgQUNfRVJfSENSKSB7CisgICAgICAgICAgQ0hjcl9SZWFkKGhCcywgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0sCisgICAgICAgICAgICAgICAgICAgIG51bWJlck9mQ2hhbm5lbHMgPT0gMiA/IElEX0NQRSA6IElEX1NDRSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIHB1bHNlOgotICAgICAgaWYgKCBDUHVsc2VEYXRhX1JlYWQoIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLlB1bHNlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19Mb25nLCAvKiBwdWxzZSBkYXRhIGlzIG9ubHkgYWxsb3dlZCB0byBiZSBwcmVzZW50IGluIGxvbmcgYmxvY2tzISAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmljc0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICkgIT0gMCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRuc19kYXRhX3ByZXNlbnQ6Ci0gICAgICBDVG5zX1JlYWREYXRhUHJlc2VudEZsYWcoaEJzLCAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBEeW5EYXRhLT5UbnNEYXRhKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdG5zX2RhdGE6Ci0gICAgICAvKiB0bnNfZGF0YV9wcmVzZW50IGlzIGNoZWNrZWQgaW5zaWRlIENUbnNfUmVhZCgpLiAqLwotICAgICAgZXJyb3IgPSBDVG5zX1JlYWQoaEJzLCAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnBEeW5EYXRhLT5UbnNEYXRhLCAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmljc0luZm8sIGZsYWdzKTsKLSAgICAgIGJyZWFrOworICAgICAgY2FzZSBzcGVjdHJhbF9kYXRhOgorICAgICAgICBlcnJvciA9IENCbG9ja19SZWFkU3BlY3RyYWxEYXRhKGhCcywgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sIGZsYWdzKTsKKyAgICAgICAgaWYgKGZsYWdzICYgQUNfRUxEKSB7CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnJlbmRlck1vZGUgPSBBQUNERUNfUkVOREVSX0VMREZCOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChmbGFncyAmIEFDX0hEQUFDKSB7CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cmVuZGVyTW9kZSA9IEFBQ0RFQ19SRU5ERVJfSU5USU1EQ1Q7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5yZW5kZXJNb2RlID0gQUFDREVDX1JFTkRFUl9JTURDVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIGdhaW5fY29udHJvbF9kYXRhOgotICAgICAgYnJlYWs7Ci0gICAgCi0gICAgY2FzZSBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50OgotICAgICAgaWYgKEZES3JlYWRCaXRzKGhCcywgMSkpIHsKLSAgICAgICAgZXJyb3IgPSBBQUNfREVDX1VOU1VQUE9SVEVEX0dBSU5fQ09OVFJPTF9EQVRBOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVzYzJfcnZsYzoKLSAgICAgIGlmIChmbGFncyAmIEFDX0VSX1JWTEMpIHsKLSAgICAgICAgQ1J2bGNfRGVjb2RlKAotICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLAotICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLAotICAgICAgICAgICAgICAgIGhCcwotICAgICAgICAgICAgICAgICk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXNjMV9oY3I6Ci0gICAgICBpZiAoZmxhZ3MgJiBBQ19FUl9IQ1IpIHsKLSAgICAgICAgQ0hjcl9SZWFkKGhCcywgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0gKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBzcGVjdHJhbF9kYXRhOgotICAgICAgZXJyb3IgPSBDQmxvY2tfUmVhZFNwZWN0cmFsRGF0YSggaEJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICk7Ci0gICAgICBpZiAoZmxhZ3MgJiBBQ19FTEQpIHsKLSAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPnJlbmRlck1vZGUgPSBBQUNERUNfUkVOREVSX0VMREZCOwotICAgICAgfSBlbHNlIHsKKyAgICAgIGNhc2UgYWNfc3BlY3RyYWxfZGF0YToKKyAgICAgICAgZXJyb3IgPSBDQmxvY2tfUmVhZEFjU3BlY3RyYWxEYXRhKAorICAgICAgICAgICAgaEJzLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSwgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0sCisgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywgZnJhbWVfbGVuZ3RoLCBmbGFncyk7CiAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5yZW5kZXJNb2RlID0gQUFDREVDX1JFTkRFUl9JTURDVDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOworICAgICAgICBicmVhazsKIAorICAgICAgY2FzZSBjb3VwbGVkX2VsZW1lbnRzOiB7CisgICAgICAgIGludCBudW1fY291cGxlZF9lbGVtZW50cywgYzsKIAotICAgICAgLyogQ1JDIGhhbmRsaW5nICovCi0gICAgY2FzZSBhZHRzY3JjX3N0YXJ0X3JlZzE6Ci0gICAgICBpZiAocFRwRGVjICE9IE5VTEwpIHsKLSAgICAgICAgY3JjUmVnMSA9IHRyYW5zcG9ydERlY19DcmNTdGFydFJlZyhwVHBEZWMsIDE5Mik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGFkdHNjcmNfc3RhcnRfcmVnMjoKLSAgICAgIGlmIChwVHBEZWMgIT0gTlVMTCkgewotICAgICAgICBjcmNSZWcyID0gdHJhbnNwb3J0RGVjX0NyY1N0YXJ0UmVnKHBUcERlYywgMTI4KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYWR0c2NyY19lbmRfcmVnMToKLSAgICBjYXNlIGRybWNyY19lbmRfcmVnOgotICAgICAgaWYgKHBUcERlYyAhPSBOVUxMKSB7Ci0gICAgICAgIHRyYW5zcG9ydERlY19DcmNFbmRSZWcocFRwRGVjLCBjcmNSZWcxKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYWR0c2NyY19lbmRfcmVnMjoKLSAgICAgIGlmIChwVHBEZWMgIT0gTlVMTCkgewotICAgICAgICB0cmFuc3BvcnREZWNfQ3JjRW5kUmVnKHBUcERlYywgY3JjUmVnMik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGRybWNyY19zdGFydF9yZWc6Ci0gICAgICBpZiAocFRwRGVjICE9IE5VTEwpIHsKLSAgICAgICAgY3JjUmVnMSA9IHRyYW5zcG9ydERlY19DcmNTdGFydFJlZyhwVHBEZWMsIDApOwotICAgICAgfQotICAgICAgYnJlYWs7CisgICAgICAgIGluZF9zd19jY2VfZmxhZyA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICAgICAgbnVtX2NvdXBsZWRfZWxlbWVudHMgPSBGREtyZWFkQml0cyhoQnMsIDMpOwogCi0gICAgICAvKiBOb24gZGF0YSBjYXNlcyAqLwotICAgIGNhc2UgbmV4dF9jaGFubmVsOgotICAgICAgY2ggPSAoY2ggKyAxKSAlIG51bWJlck9mQ2hhbm5lbHM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxpbmtfc2VxdWVuY2U6Ci0gICAgICBsaXN0ID0gbGlzdC0+bmV4dFtkZWNpc2lvbl9iaXRdOwotICAgICAgaT0tMTsKLSAgICAgIGJyZWFrOworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgKG51bV9jb3VwbGVkX2VsZW1lbnRzICsgMSk7IGMrKykgeworICAgICAgICAgIGludCBjY190YXJnZXRfaXNfY3BlOwogCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yID0gQUFDX0RFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7Ci0gICAgICBicmVhazsKKyAgICAgICAgICBudW1fZ2Fpbl9lbGVtZW50X2xpc3RzKys7CisgICAgICAgICAgY2NfdGFyZ2V0X2lzX2NwZSA9IEZES3JlYWRCaXQoaEJzKTsgLyogY2NfdGFyZ2V0X2lzX2NwZVtjXSAqLworICAgICAgICAgIEZES3JlYWRCaXRzKGhCcywgNCk7ICAgICAgICAgICAgICAgIC8qIGNjX3RhcmdldF90YWdfc2VsZWN0W2NdICovCisKKyAgICAgICAgICBpZiAoY2NfdGFyZ2V0X2lzX2NwZSkgeworICAgICAgICAgICAgaW50IGNjX2wsIGNjX3I7CisKKyAgICAgICAgICAgIGNjX2wgPSBGREtyZWFkQml0KGhCcyk7IC8qIGNjX2xbY10gKi8KKyAgICAgICAgICAgIGNjX3IgPSBGREtyZWFkQml0KGhCcyk7IC8qIGNjX3JbY10gKi8KKworICAgICAgICAgICAgaWYgKGNjX2wgJiYgY2NfcikgeworICAgICAgICAgICAgICBudW1fZ2Fpbl9lbGVtZW50X2xpc3RzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZES3JlYWRCaXQoaEJzKTsgICAgIC8qIGNjX2RvbWFpbiAqLworICAgICAgICBGREtyZWFkQml0KGhCcyk7ICAgICAvKiBnYWluX2VsZW1lbnRfc2lnbiAgKi8KKyAgICAgICAgRkRLcmVhZEJpdHMoaEJzLCAyKTsgLyogZ2Fpbl9lbGVtZW50X3NjYWxlICovCisgICAgICB9IGJyZWFrOworCisgICAgICBjYXNlIGdhaW5fZWxlbWVudF9saXN0czogeworICAgICAgICBjb25zdCBDb2RlQm9va0Rlc2NyaXB0aW9uICpoY2I7CisgICAgICAgIFVDSEFSICpwQ29kZUJvb2s7CisgICAgICAgIGludCBjOworCisgICAgICAgIGhjYiA9ICZBQUNjb2RlQm9va0Rlc2NyaXB0aW9uVGFibGVbQk9PS1NDTF07CisgICAgICAgIHBDb2RlQm9vayA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5wRHluRGF0YS0+YUNvZGVCb29rOworCisgICAgICAgIGZvciAoYyA9IDE7IGMgPCBudW1fZ2Fpbl9lbGVtZW50X2xpc3RzOyBjKyspIHsKKyAgICAgICAgICBpbnQgY2dlOworICAgICAgICAgIGlmIChpbmRfc3dfY2NlX2ZsYWcpIHsKKyAgICAgICAgICAgIGNnZSA9IDE7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNnZSA9IEZES3JlYWRCaXRzKGhCcywgMSk7IC8qIGNvbW1vbl9nYWluX2VsZW1lbnRfcHJlc2VudFtjXSAqLworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoY2dlKSB7CisgICAgICAgICAgICAvKiBIdWZmbWFuICovCisgICAgICAgICAgICBDQmxvY2tfRGVjb2RlSHVmZm1hbldvcmQoCisgICAgICAgICAgICAgICAgaEJzLCBoY2IpOyAvKiBoY29kX3NmW2NvbW1vbl9nYWluX2VsZW1lbnRbY11dIDEuLjE5ICovCisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBnLCBzZmI7CisgICAgICAgICAgICBmb3IgKGcgPSAwOworICAgICAgICAgICAgICAgICBnIDwgR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+aWNzSW5mbyk7CisgICAgICAgICAgICAgICAgIGcrKykgeworICAgICAgICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5pY3NJbmZvKTsKKyAgICAgICAgICAgICAgICAgICBzZmIrKykgeworICAgICAgICAgICAgICAgIGlmIChwQ29kZUJvb2tbc2ZiXSAhPSBaRVJPX0hDQikgeworICAgICAgICAgICAgICAgICAgLyogSHVmZm1hbiAqLworICAgICAgICAgICAgICAgICAgQ0Jsb2NrX0RlY29kZUh1ZmZtYW5Xb3JkKAorICAgICAgICAgICAgICAgICAgICAgIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICBoY2IpOyAvKiBoY29kX3NmW2RwY21fZ2Fpbl9lbGVtZW50W2NdW2ddW3NmYl1dIDEuLjE5ICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGJyZWFrOworCisgICAgICAgIC8qIENSQyBoYW5kbGluZyAqLworICAgICAgY2FzZSBhZHRzY3JjX3N0YXJ0X3JlZzE6CisgICAgICAgIGlmIChwVHBEZWMgIT0gTlVMTCkgeworICAgICAgICAgIGNyY1JlZzEgPSB0cmFuc3BvcnREZWNfQ3JjU3RhcnRSZWcocFRwRGVjLCAxOTIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBhZHRzY3JjX3N0YXJ0X3JlZzI6CisgICAgICAgIGlmIChwVHBEZWMgIT0gTlVMTCkgeworICAgICAgICAgIGNyY1JlZzIgPSB0cmFuc3BvcnREZWNfQ3JjU3RhcnRSZWcocFRwRGVjLCAxMjgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBhZHRzY3JjX2VuZF9yZWcxOgorICAgICAgY2FzZSBkcm1jcmNfZW5kX3JlZzoKKyAgICAgICAgaWYgKHBUcERlYyAhPSBOVUxMKSB7CisgICAgICAgICAgdHJhbnNwb3J0RGVjX0NyY0VuZFJlZyhwVHBEZWMsIGNyY1JlZzEpOworICAgICAgICAgIGNyY1JlZzEgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgYWR0c2NyY19lbmRfcmVnMjoKKyAgICAgICAgaWYgKGNyY1JlZzEgIT0gLTEpIHsKKyAgICAgICAgICBlcnJvciA9IEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOworICAgICAgICB9IGVsc2UgaWYgKHBUcERlYyAhPSBOVUxMKSB7CisgICAgICAgICAgdHJhbnNwb3J0RGVjX0NyY0VuZFJlZyhwVHBEZWMsIGNyY1JlZzIpOworICAgICAgICAgIGNyY1JlZzIgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgZHJtY3JjX3N0YXJ0X3JlZzoKKyAgICAgICAgaWYgKHBUcERlYyAhPSBOVUxMKSB7CisgICAgICAgICAgY3JjUmVnMSA9IHRyYW5zcG9ydERlY19DcmNTdGFydFJlZyhwVHBEZWMsIDApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIE5vbiBkYXRhIGNhc2VzICovCisgICAgICBjYXNlIG5leHRfY2hhbm5lbDoKKyAgICAgICAgY2ggPSAoY2ggKyAxKSAlIG51bWJlck9mQ2hhbm5lbHM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBsaW5rX3NlcXVlbmNlOgorICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dFtkZWNpc2lvbl9iaXRdOworICAgICAgICBpID0gLTE7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBlcnJvciA9IEFBQ19ERUNfVU5TVVBQT1JURURfRk9STUFUOworICAgICAgICBicmVhazsKICAgICB9CiAKICAgICBpZiAoZXJyb3IgIT0gQUFDX0RFQ19PSykgewpAQCAtNDQ2LDYgKzg4NCw0MCBAQAogCiAgIH0gd2hpbGUgKGxpc3QtPmlkW2ldICE9IGVuZF9vZl9zZXF1ZW5jZSk7CiAKKyAgZm9yIChjaCA9IDA7IGNoIDwgbnVtYmVyT2ZDaGFubmVsczsgY2grKykgeworICAgIGlmIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cmVuZGVyTW9kZSA9PSBBQUNERUNfUkVOREVSX0lNRENUIHx8CisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bY2hdLT5yZW5kZXJNb2RlID09IEFBQ0RFQ19SRU5ERVJfRUxERkIpIHsKKyAgICAgIC8qIFNob3dzIHdoaWNoIGJhbmRzIGFyZSBlbXB0eS4gKi8KKyAgICAgIFVDSEFSICpiYW5kX2lzX25vaXNlID0KKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cER5bkRhdGEtPmJhbmRfaXNfbm9pc2U7CisgICAgICBGREttZW1zZXQoYmFuZF9pc19ub2lzZSwgKFVDSEFSKTEsIHNpemVvZihVQ0hBUikgKiAoOCAqIDE2KSk7CisKKyAgICAgIGVycm9yID0gQ0Jsb2NrX0ludmVyc2VRdWFudGl6ZVNwZWN0cmFsRGF0YSgKKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXSwgcFNhbXBsaW5nUmF0ZUluZm8sIGJhbmRfaXNfbm9pc2UsIDEpOworICAgICAgaWYgKGVycm9yICE9IEFBQ19ERUNfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgfQorCisgICAgICBpZiAoZWxGbGFncyAmIEFDX0VMX1VTQUNfTk9JU0UpIHsKKyAgICAgICAgQ0Jsb2NrX0FwcGx5Tm9pc2UocEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0sIHBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0tPm5mUmFuZG9tU2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZF9pc19ub2lzZSk7CisKKyAgICAgIH0gLyogaWYgKGVsRmxhZ3MgJiBBQ19FTF9VU0FDX05PSVNFKSAqLworICAgIH0KKyAgfQorCiBiYWlsOgorICBpZiAoY3JjUmVnMSAhPSAtMSB8fCBjcmNSZWcyICE9IC0xKSB7CisgICAgaWYgKGVycm9yID09IEFBQ19ERUNfT0spIHsKKyAgICAgIGVycm9yID0gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CisgICAgfQorICAgIGlmIChjcmNSZWcxICE9IC0xKSB7CisgICAgICB0cmFuc3BvcnREZWNfQ3JjRW5kUmVnKHBUcERlYywgY3JjUmVnMSk7CisgICAgfQorICAgIGlmIChjcmNSZWcyICE9IC0xKSB7CisgICAgICB0cmFuc3BvcnREZWNfQ3JjRW5kUmVnKHBUcERlYywgY3JjUmVnMik7CisgICAgfQorICB9CiAgIHJldHVybiBlcnJvcjsKIH0KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbC5oIGIvbGliQUFDZGVjL3NyYy9jaGFubmVsLmgKaW5kZXggMTE0Njk5OC4uZWQ0NjY2NiAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9jaGFubmVsLmgKKysrIGIvbGliQUFDZGVjL3NyYy9jaGFubmVsLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNDYgKzkwLDQ4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKICAgIERlc2NyaXB0aW9uOgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIENIQU5ORUxfSAogI2RlZmluZSBDSEFOTkVMX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAotI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCiAjaW5jbHVkZSAiY2hhbm5lbGluZm8uaCIKICNpbmNsdWRlICJ0cGRlY19saWIuaCIKIAogLyoqCi0gKiBcYnJpZWYgSW5pdCBjb2RlQm9vayBTRkIgaW5kaWNlcyAoc2VjdGlvbiBkYXRhKSB3aXRoIEhDQl9FU0MuIFVzZWZ1bCBmb3IgYml0c3RyZWFtcwotICogd2hpY2ggZG8gbm90IGhhdmUgYW55IHNlY3Rpb24gZGF0YSwgYnV0IHN0aWxsIFNGQidzIChzY2FsZSBmYWN0b3IgYmFuZHMpLiBUaGlzIGhhcwotICogdGhlIGVmZmVjdCB0aGF0IHVwdG8gdGhlIGFtb3VudCBvZiB0cmFuc21pdHRlZCBTRkIgYXJlIHRyZWF0ZWQgYXMgbm9uLXplcm8uCi0gKiBccGFyYW0gcEFhY0RlY29kZXJDaGFubmVsSW5mbyBjaGFubmVsIGluZm8gc3RydWN0dXJlIGNvbnRhaW5pbmcgYSB2YWxpZCBpY3NJbmZvIHN0cnVjdC4KKyAqIFxicmllZiBJbml0IGNvZGVCb29rIFNGQiBpbmRpY2VzIChzZWN0aW9uIGRhdGEpIHdpdGggSENCX0VTQy4gVXNlZnVsIGZvcgorICogYml0c3RyZWFtcyB3aGljaCBkbyBub3QgaGF2ZSBhbnkgc2VjdGlvbiBkYXRhLCBidXQgc3RpbGwgU0ZCJ3MgKHNjYWxlIGZhY3RvcgorICogYmFuZHMpLiBUaGlzIGhhcyB0aGUgZWZmZWN0IHRoYXQgdXB0byB0aGUgYW1vdW50IG9mIHRyYW5zbWl0dGVkIFNGQiBhcmUKKyAqIHRyZWF0ZWQgYXMgbm9uLXplcm8uCisgKiBccGFyYW0gcEFhY0RlY29kZXJDaGFubmVsSW5mbyBjaGFubmVsIGluZm8gc3RydWN0dXJlIGNvbnRhaW5pbmcgYSB2YWxpZAorICogaWNzSW5mbyBzdHJ1Y3QuCiAgKi8KIHZvaWQgQ0NoYW5uZWxfQ29kZWJvb2tUYWJsZUluaXQoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbyk7CiAKIC8qKgogICogXGJyaWVmIGRlY29kZSBhIGNoYW5uZWwgZWxlbWVudC4gVG8gYmUgY2FsbGVkIGFmdGVyIENDaGFubmVsRWxlbWVudF9SZWFkKCkKLSAqIFxwYXJhbSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvIHBvaW50ZXIgdG8gY2hhbm5lbCBkYXRhIHN0cnVjdC4gRGVwZW5kaW5nIG9uIGVsX2NoYW5uZWxzIGVpdGhlciBvbmUgb3IgdHdvLgorICogXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gcG9pbnRlciB0byBjaGFubmVsIGRhdGEgc3RydWN0LiBEZXBlbmRpbmcgb24KKyAqIGVsX2NoYW5uZWxzIGVpdGhlciBvbmUgb3IgdHdvLgogICogXHBhcmFtIHBTYW1wbGluZ1JhdGVJbmZvIHBvaW50ZXIgdG8gc2FtcGxlIHJhdGUgaW5mb3JtYXRpb24gc3RydWN0dXJlCiAgKiBccGFyYW0gZWxfY2hhbm5lbHMgYW1vdW50IG9mIGNoYW5uZWxzIG9mIHRoZSBlbGVtZW50IHRvIGJlIGRlY29kZWQuCiAgKiBccGFyYW0gb3V0cHV0IHBvaW50ZXIgdG8gdGltZSBkb21haW4gb3V0cHV0IGJ1ZmZlciAoQUNFTFApCi0gKiBccGFyYW0gc3RyaWRlIGZhY3RvciBmb3IgYWNjZXNzaW5nIG91dHB1dAogICovCi12b2lkIENDaGFubmVsRWxlbWVudF9EZWNvZGUgKCBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1syXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbF9jaGFubmVscyApOwotCit2b2lkIENDaGFubmVsRWxlbWVudF9EZWNvZGUoCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1syXSwKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvWzJdLAorICAgIFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLCBVSU5UIGZsYWdzLCBVSU5UIGVsRmxhZ3MsCisgICAgaW50IGVsX2NoYW5uZWxzKTsKIAogLyoqCiAgKiBcYnJpZWYgUmVhZCBjaGFubmVsIGVsZW1lbnQgb2YgZ2l2ZW4gdHlwZSBmcm9tIGJpdHN0cmVhbS4KQEAgLTEyNiwyMyArMTM5LDIyIEBACiAgKiBccGFyYW0gcEFhY0RlY29kZXJDaGFubmVsSW5mbyBwb2ludGVyIGFycmF5IHRvIHN0b3JlIGNoYW5uZWwgaW5mb3JtYXRpb24uCiAgKiBccGFyYW0gYW90IEF1ZGlvIE9iamVjdCBUeXBlCiAgKiBccGFyYW0gcFNhbXBsaW5nUmF0ZUluZm8gc2FtcGxpbmcgcmF0ZSBpbmZvIHRhYmxlLgotICogXHBhcmFtIGZsYWdzIHBhcnNlciBndWlkYW5jZSBmbGFncwotICogXHBhcmFtIG51bWJlck9mQ2hhbm5lbHMgYW1vdW4gb2YgY2hhbm5lbHMgY29udGFpbmVkIGluIHRoZSBvYmplY3QgdG8gYmUgcGFyc2VkLgotICogXHBhcmFtIGVwQ29uZmlnIHRoZSBjdXJyZW50IGVwQ29uZmlnIHZhbHVlIG9idGFpbmVkIGZyb20gdGhlIEF1ZGlvIFNwZWNpZmljIENvbmZpZy4KKyAqIFxwYXJhbSBmbGFncyBjb21tb24gcGFyc2VyIGd1aWRhbmNlIGZsYWdzCisgKiBccGFyYW0gZWxGbGFncyBlbGVtZW50IHNwZWNpZmljIHBhcnNlciBndWlkYW5jZSBmbGFncworICogXHBhcmFtIG51bWJlck9mQ2hhbm5lbHMgYW1vdW4gb2YgY2hhbm5lbHMgY29udGFpbmVkIGluIHRoZSBvYmplY3QgdG8gYmUKKyAqIHBhcnNlZC4KKyAqIFxwYXJhbSBlcENvbmZpZyB0aGUgY3VycmVudCBlcENvbmZpZyB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBBdWRpbyBTcGVjaWZpYworICogQ29uZmlnLgogICogXHBhcmFtIHBUcCB0cmFuc3BvcnQgZGVjb2RlciBoYW5kbGUgcmVxdWlyZWQgZm9yIEFEVFMgQ1JDIGNoZWNraW5nLgogICogLi4uCiAgKiBccmV0dXJuIGFuIEFBQ19ERUNPREVSX0VSUk9SIGVycm9yIGNvZGUuCiAgKi8KLUFBQ19ERUNPREVSX0VSUk9SIENDaGFubmVsRWxlbWVudF9SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICBmcmFtZV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBudW1iZXJPZkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NIQVIgZXBDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfVFJBTlNQT1JUREVDIHBUcERlYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKK0FBQ19ERUNPREVSX0VSUk9SIENDaGFubmVsRWxlbWVudF9SZWFkKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1tdLAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bXSwKKyAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBhb3QsIFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAorICAgIGNvbnN0IFVJTlQgZmxhZ3MsIGNvbnN0IFVJTlQgZWxGbGFncywgY29uc3QgVUlOVCBmcmFtZV9sZW5ndGgsCisgICAgY29uc3QgVUNIQVIgbnVtYmVyT2ZDaGFubmVscywgY29uc3QgU0NIQVIgZXBDb25maWcsCisgICAgSEFORExFX1RSQU5TUE9SVERFQyBwVHBEZWMpOwogCiAjZW5kaWYgLyogI2lmbmRlZiBDSEFOTkVMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbGluZm8uY3BwIGIvbGliQUFDZGVjL3NyYy9jaGFubmVsaW5mby5jcHAKaW5kZXggNzZkNTg5NS4uNzlhZGQ1YiAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9jaGFubmVsaW5mby5jcHAKKysrIGIvbGliQUFDZGVjL3NyYy9jaGFubmVsaW5mby5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjcgKzkwLDIzIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKICAgIERlc2NyaXB0aW9uOiBpbmRpdmlkdWFsIGNoYW5uZWwgc3RyZWFtIGluZm8KIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImNoYW5uZWxpbmZvLmgiCiAjaW5jbHVkZSAiYWFjX3JvbS5oIgogI2luY2x1ZGUgImFhY19yYW0uaCIKICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAKLQotQUFDX0RFQ09ERVJfRVJST1IgSWNzUmVhZE1heFNmYiAoCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgICAgICBDSWNzSW5mbyAqcEljc0luZm8sCi0gICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvCi0gICAgICAgICkKLXsKK0FBQ19ERUNPREVSX0VSUk9SIEljc1JlYWRNYXhTZmIoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIENJY3NJbmZvICpwSWNzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8pIHsKICAgQUFDX0RFQ09ERVJfRVJST1IgRXJyb3JTdGF0dXMgPSBBQUNfREVDX09LOwogICBpbnQgbmJpdHM7CiAKQEAgLTExMCwzNiArMTE3LDMxIEBACiAgICAgbmJpdHMgPSA0OwogICAgIHBJY3NJbmZvLT5Ub3RhbFNmQmFuZHMgPSBwU2FtcGxpbmdSYXRlSW5mby0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX1Nob3J0OwogICB9Ci0gIHBJY3NJbmZvLT5NYXhTZkJhbmRzID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywgbmJpdHMpOworICBwSWNzSW5mby0+TWF4U2ZCYW5kcyA9IChVQ0hBUilGREtyZWFkQml0cyhicywgbmJpdHMpOwogCi0gIGlmIChwSWNzSW5mby0+TWF4U2ZCYW5kcyA+IHBJY3NJbmZvLT5Ub3RhbFNmQmFuZHMpeworICBpZiAocEljc0luZm8tPk1heFNmQmFuZHMgPiBwSWNzSW5mby0+VG90YWxTZkJhbmRzKSB7CiAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1BBUlNFX0VSUk9SOwogICB9CiAKICAgcmV0dXJuIEVycm9yU3RhdHVzOwogfQogCi0KLQotQUFDX0RFQ09ERVJfRVJST1IgSWNzUmVhZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ljc0luZm8gKnBJY3NJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvKiBwU2FtcGxpbmdSYXRlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncykKLXsKK0FBQ19ERUNPREVSX0VSUk9SIEljc1JlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIENJY3NJbmZvICpwSWNzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MpIHsKICAgQUFDX0RFQ09ERVJfRVJST1IgRXJyb3JTdGF0dXMgPSBBQUNfREVDX09LOwogCiAgIHBJY3NJbmZvLT5WYWxpZCA9IDA7CiAKLSAgaWYgKGZsYWdzICYgQUNfRUxEKXsKLSAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBPbmx5TG9uZ1NlcXVlbmNlOworICBpZiAoZmxhZ3MgJiBBQ19FTEQpIHsKKyAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBCTE9DS19MT05HOwogICAgIHBJY3NJbmZvLT5XaW5kb3dTaGFwZSA9IDA7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaWYgKCAhKGZsYWdzICYgKEFDX1VTQUN8QUNfUlNWRDUwKSkgKSB7Ci0gICAgICBGREtyZWFkQml0cyhicywxKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIShmbGFncyAmIChBQ19VU0FDIHwgQUNfUlNWRDUwIHwgQUNfUlNWNjAzREEpKSkgeworICAgICAgRkRLcmVhZEJpdHMoYnMsIDEpOwogICAgIH0KLSAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDIpOwotICAgIHBJY3NJbmZvLT5XaW5kb3dTaGFwZSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMSk7CisgICAgcEljc0luZm8tPldpbmRvd1NlcXVlbmNlID0gKEJMT0NLX1RZUEUpRkRLcmVhZEJpdHMoYnMsIDIpOworICAgIHBJY3NJbmZvLT5XaW5kb3dTaGFwZSA9IChVQ0hBUilGREtyZWFkQml0cyhicywgMSk7CiAgICAgaWYgKGZsYWdzICYgQUNfTEQpIHsKICAgICAgIGlmIChwSWNzSW5mby0+V2luZG93U2hhcGUpIHsKICAgICAgICAgcEljc0luZm8tPldpbmRvd1NoYXBlID0gMjsgLyogc2VsZWN0IGxvdyBvdmVybGFwIGluc3RlYWQgb2YgS0JEICovCkBAIC0xNDgsOCArMTUwLDggQEAKICAgfQogCiAgIC8qIFNhbml0eSBjaGVjayAqLwotICBpZiAoIChmbGFncyAmIChBQ19FTER8QUNfTEQpKSAmJiBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgIT0gT25seUxvbmdTZXF1ZW5jZSkgewotICAgIHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSA9IE9ubHlMb25nU2VxdWVuY2U7CisgIGlmICgoZmxhZ3MgJiAoQUNfRUxEIHwgQUNfTEQpKSAmJiBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgIT0gQkxPQ0tfTE9ORykgeworICAgIHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSA9IEJMT0NLX0xPTkc7CiAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX1BBUlNFX0VSUk9SOwogICAgIGdvdG8gYmFpbDsKICAgfQpAQCAtMTU5LDExICsxNjEsMTIgQEAKICAgICBnb3RvIGJhaWw7CiAgIH0KIAotICBpZiAoSXNMb25nQmxvY2socEljc0luZm8pKQotICB7Ci0gICAgaWYgKCAhKGZsYWdzICYgKEFDX0VMRHxBQ19TQ0FMQUJMRXxBQ19CU0FDfEFDX1VTQUN8QUNfUlNWRDUwKSkgKSAvKiBJZiBub3QgRUxEIG5vciBTY2FsYWJsZSBub3IgQlNBQyBub3IgVVNBQyBzeW50YXggdGhlbiAuLi4gKi8KKyAgaWYgKElzTG9uZ0Jsb2NrKHBJY3NJbmZvKSkgeworICAgIGlmICghKGZsYWdzICYgKEFDX0VMRCB8IEFDX1NDQUxBQkxFIHwgQUNfQlNBQyB8IEFDX1VTQUMgfCBBQ19SU1ZENTAgfAorICAgICAgICAgICAgICAgICAgIEFDX1JTVjYwM0RBKSkpIC8qIElmIG5vdCBFTEQgbm9yIFNjYWxhYmxlIG5vciBCU0FDIG5vciBVU0FDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4IHRoZW4gLi4uICovCiAgICAgewotICAgICAgaWYgKChVQ0hBUilGREtyZWFkQml0cyhicywxKSAhPSAwICkgLyogVUNIQVIgUHJlZGljdG9yRGF0YVByZXNlbnQgKi8KKyAgICAgIGlmICgoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDEpICE9IDApIC8qIFVDSEFSIFByZWRpY3RvckRhdGFQcmVzZW50ICovCiAgICAgICB7CiAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19VTlNVUFBPUlRFRF9QUkVESUNUSU9OOwogICAgICAgICBnb3RvIGJhaWw7CkBAIC0xNzIsNDUgKzE3NSwzNiBAQAogCiAgICAgcEljc0luZm8tPldpbmRvd0dyb3VwcyA9IDE7CiAgICAgcEljc0luZm8tPldpbmRvd0dyb3VwTGVuZ3RoWzBdID0gMTsKLSAgfQotICBlbHNlCi0gIHsKKyAgfSBlbHNlIHsKICAgICBJTlQgaTsKICAgICBVSU5UIG1hc2s7CiAKLSAgICBwSWNzSW5mby0+U2NhbGVGYWN0b3JHcm91cGluZyA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNyk7CisgICAgcEljc0luZm8tPlNjYWxlRmFjdG9yR3JvdXBpbmcgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDcpOwogCi0gICAgcEljc0luZm8tPldpbmRvd0dyb3VwcyA9IDAgOworICAgIHBJY3NJbmZvLT5XaW5kb3dHcm91cHMgPSAwOwogCi0gICAgZm9yIChpPTA7IGkgPCAoOC0xKTsgaSsrKQotICAgIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKDggLSAxKTsgaSsrKSB7CiAgICAgICBtYXNrID0gMSA8PCAoNiAtIGkpOwogICAgICAgcEljc0luZm8tPldpbmRvd0dyb3VwTGVuZ3RoW2ldID0gMTsKIAotICAgICAgaWYgKHBJY3NJbmZvLT5TY2FsZUZhY3Rvckdyb3VwaW5nICYgbWFzaykKLSAgICAgIHsKKyAgICAgIGlmIChwSWNzSW5mby0+U2NhbGVGYWN0b3JHcm91cGluZyAmIG1hc2spIHsKICAgICAgICAgcEljc0luZm8tPldpbmRvd0dyb3VwTGVuZ3RoW3BJY3NJbmZvLT5XaW5kb3dHcm91cHNdKys7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7CisgICAgICB9IGVsc2UgewogICAgICAgICBwSWNzSW5mby0+V2luZG93R3JvdXBzKys7CiAgICAgICB9CiAgICAgfQogCiAgICAgLyogbG9vcCBydW5zIHRvIGkgPCA3IG9ubHkgKi8KLSAgICBwSWNzSW5mby0+V2luZG93R3JvdXBMZW5ndGhbOC0xXSA9IDE7CisgICAgcEljc0luZm8tPldpbmRvd0dyb3VwTGVuZ3RoWzggLSAxXSA9IDE7CiAgICAgcEljc0luZm8tPldpbmRvd0dyb3VwcysrOwogICB9CiAKLQogYmFpbDoKLSAgaWYgKEVycm9yU3RhdHVzID09IEFBQ19ERUNfT0spCi0gICAgcEljc0luZm8tPlZhbGlkID0gMTsKKyAgaWYgKEVycm9yU3RhdHVzID09IEFBQ19ERUNfT0spIHBJY3NJbmZvLT5WYWxpZCA9IDE7CiAKICAgcmV0dXJuIEVycm9yU3RhdHVzOwogfQogCi0KIC8qCiAgIGludGVybGVhdmUgY29kZWJvb2tzIHRoZSBmb2xsb3dpbmcgd2F5CiAKQEAgLTIyNCw1MyArMjE4LDgwIEBACiAgICAgICgyNzB3KSAgICAgKDI3MXcpCiAqLwogCi0KIC8qCiAgIFRhYmxlIGVudHJpZXMgYXJlIHNvcnRlZCBhcyBmb2xsb3dpbmc6CiAgIHwgbnVtX3N3Yl9sb25nX3dpbmRvdyB8IHNmYmFuZHNfbG9uZyB8IG51bV9zd2Jfc2hvcnRfd2luZG93IHwgc2ZiYW5kc19zaG9ydCB8CiAqLwotQUFDX0RFQ09ERVJfRVJST1IgZ2V0U2FtcGxpbmdSYXRlSW5mbygKLSAgICAgICAgU2FtcGxpbmdSYXRlSW5mbyAqdCwKLSAgICAgICAgVUlOVCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgIFVJTlQgc2FtcGxpbmdSYXRlSW5kZXgsCi0gICAgICAgIFVJTlQgc2FtcGxpbmdSYXRlCi0gICAgICAgICkKLXsKK0FBQ19ERUNPREVSX0VSUk9SIGdldFNhbXBsaW5nUmF0ZUluZm8oU2FtcGxpbmdSYXRlSW5mbyAqdCwgVUlOVCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc2FtcGxpbmdSYXRlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc2FtcGxpbmdSYXRlKSB7CiAgIGludCBpbmRleCA9IDA7CiAKKyAgLyogU2VhcmNoIGNsb3Nlc3Qgc2FtcGxlcmF0ZSBhY2NvcmRpbmcgdG8gSVNPL0lFQyAxMzgxOC03OjIwMDUoRSkgOC4yLjQgKFRhYmxlCisgICAqIDM4KTogKi8KKyAgaWYgKChzYW1wbGluZ1JhdGVJbmRleCA+PSAxNSkgfHwgKHNhbXBsZXNQZXJGcmFtZSA9PSA3NjgpKSB7CisgICAgY29uc3QgVUlOVCBib3JkZXJzW10gPSB7KFVJTlQpLTEsIDkyMDE3LCA3NTEzMiwgNTU0MjYsIDQ2MDA5LCAzNzU2NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzcxMywgICAgMjMwMDQsIDE4NzgzLCAxMzg1NiwgMTE1MDIsIDkzOTF9OworICAgIFVJTlQgaSwgc2FtcGxpbmdSYXRlU2VhcmNoID0gc2FtcGxpbmdSYXRlOworCisgICAgaWYgKHNhbXBsZXNQZXJGcmFtZSA9PSA3NjgpIHsKKyAgICAgIHNhbXBsaW5nUmF0ZVNlYXJjaCA9IChzYW1wbGluZ1JhdGUgKiA0KSAvIDM7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDExOyBpKyspIHsKKyAgICAgIGlmIChib3JkZXJzW2ldID4gc2FtcGxpbmdSYXRlU2VhcmNoICYmCisgICAgICAgICAgc2FtcGxpbmdSYXRlU2VhcmNoID49IGJvcmRlcnNbaSArIDFdKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBzYW1wbGluZ1JhdGVJbmRleCA9IGk7CisgIH0KIAogICB0LT5zYW1wbGluZ1JhdGVJbmRleCA9IHNhbXBsaW5nUmF0ZUluZGV4OwogICB0LT5zYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CiAKICAgc3dpdGNoIChzYW1wbGVzUGVyRnJhbWUpIHsKLSAgY2FzZSAxMDI0OgotICAgIGluZGV4ID0gMDsKLSAgICBicmVhazsKLSAgY2FzZSA5NjA6Ci0gICAgaW5kZXggPSAxOwotICAgIGJyZWFrOwotICBjYXNlIDUxMjoKLSAgICBpbmRleCA9IDM7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgNDgwOgotICAgIGluZGV4ID0gNDsKLSAgICBicmVhazsKKyAgICBjYXNlIDEwMjQ6CisgICAgICBpbmRleCA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDk2MDoKKyAgICAgIGluZGV4ID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzY4OgorICAgICAgaW5kZXggPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1MTI6CisgICAgICBpbmRleCA9IDM7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ4MDoKKyAgICAgIGluZGV4ID0gNDsKKyAgICAgIGJyZWFrOwogCi0gIGRlZmF1bHQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgfQorCisgIHQtPlNjYWxlRmFjdG9yQmFuZHNfTG9uZyA9CisgICAgICBzZmJPZmZzZXRUYWJsZXNbaW5kZXhdW3NhbXBsaW5nUmF0ZUluZGV4XS5zZmJPZmZzZXRMb25nOworICB0LT5TY2FsZUZhY3RvckJhbmRzX1Nob3J0ID0KKyAgICAgIHNmYk9mZnNldFRhYmxlc1tpbmRleF1bc2FtcGxpbmdSYXRlSW5kZXhdLnNmYk9mZnNldFNob3J0OworICB0LT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfTG9uZyA9CisgICAgICBzZmJPZmZzZXRUYWJsZXNbaW5kZXhdW3NhbXBsaW5nUmF0ZUluZGV4XS5udW1iZXJPZlNmYkxvbmc7CisgIHQtPk51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19TaG9ydCA9CisgICAgICBzZmJPZmZzZXRUYWJsZXNbaW5kZXhdW3NhbXBsaW5nUmF0ZUluZGV4XS5udW1iZXJPZlNmYlNob3J0OworCisgIGlmICh0LT5TY2FsZUZhY3RvckJhbmRzX0xvbmcgPT0gTlVMTCB8fAorICAgICAgdC0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX0xvbmcgPT0gMCkgeworICAgIHQtPnNhbXBsaW5nUmF0ZSA9IDA7CiAgICAgcmV0dXJuIEFBQ19ERUNfVU5TVVBQT1JURURfRk9STUFUOwogICB9CiAKLSAgdC0+U2NhbGVGYWN0b3JCYW5kc19Mb25nID0gc2ZiT2Zmc2V0VGFibGVzW2luZGV4XVtzYW1wbGluZ1JhdGVJbmRleF0uc2ZiT2Zmc2V0TG9uZzsKLSAgdC0+U2NhbGVGYWN0b3JCYW5kc19TaG9ydCA9IHNmYk9mZnNldFRhYmxlc1tpbmRleF1bc2FtcGxpbmdSYXRlSW5kZXhdLnNmYk9mZnNldFNob3J0OwotICB0LT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfTG9uZyA9IHNmYk9mZnNldFRhYmxlc1tpbmRleF1bc2FtcGxpbmdSYXRlSW5kZXhdLm51bWJlck9mU2ZiTG9uZzsKLSAgdC0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX1Nob3J0ID0gc2ZiT2Zmc2V0VGFibGVzW2luZGV4XVtzYW1wbGluZ1JhdGVJbmRleF0ubnVtYmVyT2ZTZmJTaG9ydDsKLQotICBpZiAodC0+U2NhbGVGYWN0b3JCYW5kc19Mb25nID09IE5VTEwgfHwgdC0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX0xvbmcgPT0gMCkgewotICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKLSAgfQotCi0gIEZES19BU1NFUlQodC0+U2NhbGVGYWN0b3JCYW5kc19Mb25nW3QtPk51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19Mb25nXSA9PSBzYW1wbGVzUGVyRnJhbWUpOwotICBGREtfQVNTRVJUKHQtPlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQgPT0gTlVMTCB8fCB0LT5TY2FsZUZhY3RvckJhbmRzX1Nob3J0W3QtPk51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19TaG9ydF0qOCA9PSBzYW1wbGVzUGVyRnJhbWUpOworICBGREtfQVNTRVJUKChVSU5UKXQtPlNjYWxlRmFjdG9yQmFuZHNfTG9uZ1t0LT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfTG9uZ10gPT0KKyAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUpOworICBGREtfQVNTRVJUKAorICAgICAgdC0+U2NhbGVGYWN0b3JCYW5kc19TaG9ydCA9PSBOVUxMIHx8CisgICAgICAoVUlOVCl0LT5TY2FsZUZhY3RvckJhbmRzX1Nob3J0W3QtPk51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19TaG9ydF0gKiA4ID09CisgICAgICAgICAgc2FtcGxlc1BlckZyYW1lKTsKIAogICByZXR1cm4gQUFDX0RFQ19PSzsKIH0KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbGluZm8uaCBiL2xpYkFBQ2RlYy9zcmMvY2hhbm5lbGluZm8uaAppbmRleCBlMDkyYWIzLi40NWEyODhmIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2NoYW5uZWxpbmZvLmgKKysrIGIvbGliQUFDZGVjL3NyYy9jaGFubmVsaW5mby5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorCiAgICBEZXNjcmlwdGlvbjogaW5kaXZpZHVhbCBjaGFubmVsIHN0cmVhbSBpbmZvCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgQ0hBTk5FTElORk9fSAogI2RlZmluZSBDSEFOTkVMSU5GT19ICkBAIC0xMDgsMTAgKzEyMCwyMSBAQAogI2luY2x1ZGUgImFhY2RlY19oY3JfdHlwZXMuaCIKICNpbmNsdWRlICJydmxjX2luZm8uaCIKIAorI2luY2x1ZGUgInVzYWNkZWNfYWNlbHAuaCIKKyNpbmNsdWRlICJ1c2FjZGVjX2NvbnN0LmgiCisjaW5jbHVkZSAidXNhY2RlY19yb20uaCIKKworI2luY2x1ZGUgImFjX2FyaXRoX2NvZGVyLmgiCiAKICNpbmNsdWRlICJjb25jZWFsX3R5cGVzLmgiCiAKLSAjaW5jbHVkZSAiYWFjZGVjX2RyY190eXBlcy5oIgorI2luY2x1ZGUgImFhY2RlY19kcmNfdHlwZXMuaCIKKworI2RlZmluZSBXQl9TRUNUSU9OX1NJWkUgKDEwMjQgKiAyKQorCisjZGVmaW5lIERSTV9CU19CVUZGRVJfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICg1MTIpIC8qIHNpemUgb2YgdGhlIGR5bmFtaWMgYnVmZmVyIHdoaWNoIGlzIHVzZWQgdG8gcmV2ZXJzZSB0aGUgYml0cyBvZiBcCisgICAgICAgICAgIHRoZSBEUk0gU0JSIHBheWxvYWQgKi8KIAogLyogT3V0cHV0IHJlbmRlcmluZyBtb2RlICovCiB0eXBlZGVmIGVudW0gewpAQCAtMTIyLDIxICsxNDUsMTEgQEAKICAgQUFDREVDX1JFTkRFUl9JTlRJTURDVAogfSBBQUNERUNfUkVOREVSX01PREU7CiAKLWVudW0gewotICBNQVhfUVVBTlRJWkVEX1ZBTFVFID0gODE5MQotfTsKK2VudW0geyBNQVhfUVVBTlRJWkVEX1ZBTFVFID0gODE5MSB9OwogCi1lbnVtCi17Ci0gIE9ubHlMb25nU2VxdWVuY2UgPSAwLAotICBMb25nU3RhcnRTZXF1ZW5jZSwKLSAgRWlnaHRTaG9ydFNlcXVlbmNlLAotICBMb25nU3RvcFNlcXVlbmNlCi19OwordHlwZWRlZiBlbnVtIHsgRkRfTE9ORywgRkRfU0hPUlQsIExQRCB9IFVTQUNfQ09SRU1PREU7CiAKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgY29uc3QgU0hPUlQgKlNjYWxlRmFjdG9yQmFuZHNfTG9uZzsKICAgY29uc3QgU0hPUlQgKlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQ7CiAgIFVDSEFSIE51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19Mb25nOwpAQCAtMTQ1LDIwMCArMTU4LDMxNSBAQAogICBVSU5UIHNhbXBsaW5nUmF0ZTsKIH0gU2FtcGxpbmdSYXRlSW5mbzsKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgVUNIQVIgQ29tbW9uV2luZG93OwogICBVQ0hBUiBHbG9iYWxHYWluOwogCiB9IENSYXdEYXRhSW5mbzsKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgVUNIQVIgV2luZG93R3JvdXBMZW5ndGhbOF07CiAgIFVDSEFSIFdpbmRvd0dyb3VwczsKICAgVUNIQVIgVmFsaWQ7CiAKLSAgVUNIQVIgV2luZG93U2hhcGU7ICAgIC8qIDA6IHNpbmUgd2luZG93LCAxOiBLQkQsIDI6IGxvdyBvdmVybGFwICovCi0gIFVDSEFSIFdpbmRvd1NlcXVlbmNlOyAvKiBTZWUgZW51bSBhYm92ZSwgMDogbG9uZywgMTogc3RhcnQsIDI6IHNob3J0LCAzOiBzdG9wICovCisgIFVDSEFSIFdpbmRvd1NoYXBlOyAgICAgICAgIC8qIDA6IHNpbmUgd2luZG93LCAxOiBLQkQsIDI6IGxvdyBvdmVybGFwICovCisgIEJMT0NLX1RZUEUgV2luZG93U2VxdWVuY2U7IC8qIG1kY3QuaDsgMDogbG9uZywgMTogc3RhcnQsIDI6IHNob3J0LCAzOiBzdG9wICovCiAgIFVDSEFSIE1heFNmQmFuZHM7CisgIFVDSEFSIG1heF9zZmJfc3RlOwogICBVQ0hBUiBTY2FsZUZhY3Rvckdyb3VwaW5nOwogCiAgIFVDSEFSIFRvdGFsU2ZCYW5kczsKIAogfSBDSWNzSW5mbzsKIAotCi1lbnVtCi17CitlbnVtIHsKICAgWkVST19IQ0IgPSAwLAotICBFU0NCT09LICA9IDExLAorICBFU0NCT09LID0gMTEsCiAgIE5TUEVDQk9PS1MgPSBFU0NCT09LICsgMSwKLSAgQk9PS1NDTCAgICA9IE5TUEVDQk9PS1MsCi0gIE5PSVNFX0hDQiAgICAgID0gMTMsCisgIEJPT0tTQ0wgPSBOU1BFQ0JPT0tTLAorICBOT0lTRV9IQ0IgPSAxMywKICAgSU5URU5TSVRZX0hDQjIgPSAxNCwKLSAgSU5URU5TSVRZX0hDQiAgPSAxNSwKKyAgSU5URU5TSVRZX0hDQiA9IDE1LAogICBMQVNUX0hDQgogfTsKIAotI2RlZmluZSBUTlNfU0NBTEUgIDMKKy8qIFRoaXMgc3RydWN0IGhvbGRzIHRoZSBwZXJzaXN0ZW50IGRhdGEgc2hhcmVkIGJ5IGJvdGggY2hhbm5lbHMgb2YgYSBDUEUuCisgICBJdCBuZWVkcyB0byBiZSBhbGxvY2F0ZWQgZm9yIGVhY2ggQ1BFLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBDSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YSBqb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhOworfSBDcGVQZXJzaXN0ZW50RGF0YTsKIAogLyoKICAqIFRoaXMgc3RydWN0IG11c3QgYmUgYWxsb2NhdGVkIG9uZSBmb3IgZXZlcnkgY2hhbm5lbCBhbmQgbXVzdCBiZSBwZXJzaXN0ZW50LgogICovCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICBGSVhQX0RCTCAqcE92ZXJsYXBCdWZmZXI7CiAgIG1kY3RfdCBJTWRjdDsKIAorICBDQXJjb0RhdGEgKmhBckNvOwogCisgIElOVCBwbnNDdXJyZW50U2VlZDsKIAotICBDRHJjQ2hhbm5lbERhdGEgICBkcmNEYXRhOworICAvKiBMUEQgbWVtb3J5ICovCisgIEZJWFBfREJMIG9sZF9zeW50aFtQSVRfTUFYX01BWCAtIExfU1VCRlJdOworICBJTlQgb2xkX1RfcGZbU1lOX1NGRF07CisgIEZJWFBfREJMIG9sZF9nYWluX3BmW1NZTl9TRkRdOworICBGSVhQX0RCTCBtZW1fYnBmW0xfRklMVCArIExfU1VCRlJdOworICBVQ0hBUgorICBvbGRfYnBmX2NvbnRyb2xfaW5mbzsgLyogKDE6IGVuYWJsZSwgMDogZGlzYWJsZSkgYnBmIGZvciBwYXN0IHN1cGVyZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIFVTQUNfQ09SRU1PREUgbGFzdF9jb3JlX21vZGU7IC8qIGNvcmUgbW9kZSB1c2VkIGJ5IHRoZSBkZWNvZGVyIGluIHByZXZpb3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLiAobm90IHNpZ25hbGxlZCBieSB0aGUgYml0c3RyZWFtLCBzZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbzo6Y29yZV9tb2RlX2xhc3QgISEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgVUNIQVIgbGFzdF9scGRfbW9kZTsgICAgICAvKiBMUEQgbW9kZSB1c2VkIGJ5IHRoZSBkZWNvZGVyIGluIGxhc3QgTFBEIHN1YmZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub3Qgc2lnbmFsbGVkIGJ5IHRoZSBiaXRzdHJlYW0sIHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm86OmxwZF9tb2RlX2xhc3QgISEgKSAqLworICBVQ0hBUiBsYXN0X2xhc3RfbHBkX21vZGU7IC8qIExQRCBtb2RlIHVzZWQgaW4gc2Vjb25kIGxhc3QgTFBEIHN1YmZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub3Qgc2lnbmFsbGVkIGJ5IHRoZSBiaXRzdHJlYW0pICovCisgIFVDSEFSIGxhc3RfbHBjX2xvc3Q7ICAgICAgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIHByZXZpb3VzIExQQyBpcyBsb3N0ICovCisKKyAgRklYUF9MUEMKKyAgbHBjNF9sc2ZbTV9MUF9GSUxURVJfT1JERVJdOyAvKiBMYXN0IExQQzQgY29lZmZpY2llbnRzIGluIExTRiBkb21haW4uICovCisgIEZJWFBfTFBDIGxzZl9hZGFwdGl2ZV9tZWFuW01fTFBfRklMVEVSX09SREVSXTsgLyogQWRhcHRpdmUgbWVhbiBvZiBMUEMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZmljaWVudHMgaW4gTFNGIGRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjb25jZWFsbWVudC4gKi8KKyAgRklYUF9MUEMgbHBfY29lZmZfb2xkWzJdW01fTFBfRklMVEVSX09SREVSXTsgICAvKiBMYXN0IExQQyBjb2VmZmljaWVudHMgaW4gTFAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbi4gbHBfY29lZmZfb2xkWzBdIGlzIGxwYzQgKGNvZWZmcyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IGZvbGRpbmcgcG9pbnQgb2YgbGFzdCB0Y3ggZnJhbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBfY29lZmZfb2xkWzFdIGFyZSBjb2VmZnMgZm9yIGxlZnQgZm9sZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQgb2YgbGFzdCB0Y3ggZnJhbWUgKi8KKyAgSU5UIGxwX2NvZWZmX29sZF9leHBbMl07CisKKyAgRklYUF9TR0wKKyAgb2xkU3RhYmlsaXR5OyAvKiBMUEMgY29lZmYgc3RhYmlsaXR5IHZhbHVlIGZyb20gbGFzdCBmcmFtZSAocmVxdWlyZWQgZm9yCisgICAgICAgICAgICAgICAgICAgVENYIGNvbmNlYWxtZW50KS4gKi8KKyAgVUlOVCBudW1Mb3N0THBkRnJhbWVzOyAvKiBOdW1iZXIgb2YgY29uc2VjdXRpdmUgbG9zdCBzdWJmcmFtZXMuICovCisKKyAgLyogVENYIG1lbW9yeSAqLworICBGSVhQX0RCTCBsYXN0X3RjeF9nYWluOworICBJTlQgbGFzdF90Y3hfZ2Fpbl9lOworICBGSVhQX0RCTCBsYXN0X2FsZmRfZ2FpbnNbMzJdOyAvKiBTY2FsZWQgYnkgb25lIGJpdC4gKi8KKyAgU0hPUlQgbGFzdF90Y3hfcGl0Y2g7CisgIFVDSEFSIGxhc3RfdGN4X25vaXNlX2ZhY3RvcjsKKworICAvKiBBQ0VMUCBtZW1vcnkgKi8KKyAgQ0FjZWxwU3RhdGljTWVtIGFjZWxwOworCisgIFVMT05HIG5mUmFuZG9tU2VlZDsgLyogc2VlZCB2YWx1ZSBmb3IgVVNBQyBub2lzZSBmaWxsaW5nIHJhbmRvbSBnZW5lcmF0b3IgKi8KKworICBDRHJjQ2hhbm5lbERhdGEgZHJjRGF0YTsKICAgQ0NvbmNlYWxtZW50SW5mbyBjb25jZWFsbWVudEluZm87CiAKLX0gQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbzsKKyAgQ3BlUGVyc2lzdGVudERhdGEgKnBDcGVTdGF0aWNEYXRhOwogCit9IENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm87CiAKIC8qCiAgKiBUaGlzIHVuaW9uIG11c3QgYmUgYWxsb2NhdGVkIGZvciBldmVyeSBlbGVtZW50ICh1cCB0byAyIGNoYW5uZWxzKS4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgewotCiAgIC8qIENvbW1vbiBiaXQgc3RyZWFtIGRhdGEgKi8KLSAgU0hPUlQgYVNjYWxlRmFjdG9yWyg4KjE2KV07ICAgICAgICAgICAvKiBTcGVjdHJhbCBzY2FsZSBmYWN0b3JzIGZvciBlYWNoIHNmYiBpbiBlYWNoIHdpbmRvdy4gKi8KLSAgU0hPUlQgYVNmYlNjYWxlWyg4KjE2KV07ICAgICAgICAgICAgICAvKiBjb3VsZCBiZSBmcmVlIGFmdGVyIEFwcGx5VG9vbHMoKSAqLwotICBVQ0hBUiBhQ29kZUJvb2tbKDgqMTYpXTsgICAgICAgICAgICAgIC8qIHNlY3Rpb24gZGF0YTogY29kZWJvb2sgZm9yIGVhY2ggd2luZG93IGFuZCBzZmIuICovCi0gIENUbnNEYXRhICAgICAgICAgVG5zRGF0YTsKLSAgQ1Jhd0RhdGFJbmZvICAgICBSYXdEYXRhSW5mbzsKKyAgU0hPUlQgYVNjYWxlRmFjdG9yWygKKyAgICAgIDggKiAxNildOyAvKiBTcGVjdHJhbCBzY2FsZSBmYWN0b3JzIGZvciBlYWNoIHNmYiBpbiBlYWNoIHdpbmRvdy4gKi8KKyAgU0hPUlQgYVNmYlNjYWxlWyg4ICogMTYpXTsgLyogY291bGQgYmUgZnJlZSBhZnRlciBBcHBseVRvb2xzKCkgKi8KKyAgVUNIQVIKKyAgYUNvZGVCb29rWyg4ICogMTYpXTsgLyogc2VjdGlvbiBkYXRhOiBjb2RlYm9vayBmb3IgZWFjaCB3aW5kb3cgYW5kIHNmYi4gKi8KKyAgVUNIQVIgYmFuZF9pc19ub2lzZVsoOCAqIDE2KV07CisgIENUbnNEYXRhIFRuc0RhdGE7CisgIENSYXdEYXRhSW5mbyBSYXdEYXRhSW5mbzsKIAogICBzaG91bGRCZVVuaW9uIHsKLQogICAgIHN0cnVjdCB7CiAgICAgICBDUHVsc2VEYXRhIFB1bHNlRGF0YTsKLSAgICAgIFNIT1JUIGFOdW1MaW5lSW5TZWM0SGNyW01BWF9TRkJfSENSXTsgICAgICAgICAgLyogbmVlZGVkIG9uY2UgZm9yIGFsbCBjaGFubmVscyBleGNlcHQgZm9yIERybSBzeW50YXggKi8KLSAgICAgIFVDSEFSIGFDb2RlQm9va3M0SGNyW01BWF9TRkJfSENSXTsgICAgICAgICAgICAgLyogbmVlZGVkIG9uY2UgZm9yIGFsbCBjaGFubmVscyBleGNlcHQgZm9yIERybSBzeW50YXguIFNhbWUgYXMgImFDb2RlQm9vayIgPyAqLworICAgICAgU0hPUlQgYU51bUxpbmVJblNlYzRIY3JbTUFYX1NGQl9IQ1JdOyAvKiBuZWVkZWQgb25jZSBmb3IgYWxsIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBmb3IgRHJtIHN5bnRheCAqLworICAgICAgVUNIQVIKKyAgICAgIGFDb2RlQm9va3M0SGNyW01BWF9TRkJfSENSXTsgLyogbmVlZGVkIG9uY2UgZm9yIGFsbCBjaGFubmVscyBleGNlcHQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybSBzeW50YXguIFNhbWUgYXMgImFDb2RlQm9vayIgPyAqLwogICAgICAgU0hPUlQgbGVuT2ZSZW9yZGVyZWRTcGVjdHJhbERhdGE7CiAgICAgICBTQ0hBUiBsZW5PZkxvbmdlc3RDb2Rld29yZDsKICAgICAgIFNDSEFSIG51bWJlclNlY3Rpb247CiAgICAgICBTQ0hBUiBydmxjQ3VycmVudFNjYWxlRmFjdG9yT0s7CiAgICAgICBTQ0hBUiBydmxjSW50ZW5zaXR5VXNlZDsKICAgICB9IGFhYzsKLSAgfSBzcGVjaWZpY1RvOworICAgIHN0cnVjdCB7CisgICAgICBVQ0hBUiBmZF9ub2lzZV9sZXZlbF9hbmRfb2Zmc2V0OworICAgICAgVUNIQVIgdG5zX2FjdGl2ZTsKKyAgICAgIFVDSEFSIHRuc19vbl9scjsKKyAgICAgIFVDSEFSIHRjeF9ub2lzZV9mYWN0b3JbNF07CisgICAgICBVQ0hBUiB0Y3hfZ2xvYmFsX2dhaW5bNF07CisgICAgfSB1c2FjOworICB9CisgIHNwZWNpZmljVG87CiAKIH0gQ0FhY0RlY29kZXJEeW5hbWljRGF0YTsKIAogdHlwZWRlZiBzaG91bGRCZVVuaW9uIHsKLSAgQ0FhY0RlY29kZXJEeW5hbWljRGF0YSBwQWFjRGVjb2RlckR5bmFtaWNEYXRhWzJdOworICBVQ0hBUiBEcm1Cc0J1ZmZlcltEUk1fQlNfQlVGRkVSX1NJWkVdOwogCi0gIC8qIENvbW1vbiBzaWduYWwgZGF0YSwgY2FuIGJlIHVzZWQgb25jZSB0aGUgYml0IHN0cmVhbSBkYXRhIGZyb20gYWJvdmUgaXMgbm90IHVzZWQgYW55bW9yZS4gKi8KKyAgLyogQ29tbW9uIHNpZ25hbCBkYXRhLCBjYW4gYmUgdXNlZCBvbmNlIHRoZSBiaXQgc3RyZWFtIGRhdGEgZnJvbSBhYm92ZSBpcyBub3QKKyAgICogdXNlZCBhbnltb3JlLiAqLwogICBGSVhQX0RCTCBtZGN0T3V0VGVtcFsxMDI0XTsKLSAgRklYUF9EQkwgc2JyV29ya0J1ZmZlclsxMDI0KjJdOwogCi19IENXb3JrQnVmZmVyQ29yZTE7CisgIEZJWFBfREJMIHN5bnRoX2J1ZlsoUElUX01BWF9NQVggKyBTWU5fREVMQVkgKyBMX0ZSQU1FX1BMVVMpXTsKKworICBGSVhQX0RCTCB3b3JrQnVmZmVyW1dCX1NFQ1RJT05fU0laRV07Cit9CitDV29ya0J1ZmZlckNvcmUxOwogCiAvKiBDb21tb24gZGF0YSByZWZlcmVuY2VkIGJ5IGFsbCBjaGFubmVscyAqLwogdHlwZWRlZiBzdHJ1Y3QgewotCi0gIENXb3JrQnVmZmVyQ29yZTEgKndvcmtCdWZmZXJDb3JlMTsKLSAgRklYUF9EQkwqIHdvcmtCdWZmZXJDb3JlMjsKKyAgQ0FhY0RlY29kZXJEeW5hbWljRGF0YSBwQWFjRGVjb2RlckR5bmFtaWNEYXRhWzJdOwogCiAgIENQbnNJbnRlckNoYW5uZWxEYXRhIHBuc0ludGVyQ2hhbm5lbERhdGE7Ci0gIElOVCBwbnNDdXJyZW50U2VlZDsKLSAgSU5UIHBuc1JhbmRvbVNlZWRbKDgqMTYpXTsKKyAgSU5UIHBuc1JhbmRvbVNlZWRbKDggKiAxNildOwogCi0gIENKb2ludFN0ZXJlb0RhdGEgam9pbnRTdGVyZW9EYXRhOyAgICAgICAgICAgICAgLyogT25lIGZvciBvbmUgZWxlbWVudCAqLworICBDSm9pbnRTdGVyZW9EYXRhIGpvaW50U3RlcmVvRGF0YTsgLyogT25lIGZvciBvbmUgZWxlbWVudCAqLwogCiAgIHNob3VsZEJlVW5pb24gewogICAgIHN0cnVjdCB7CiAgICAgICBDRXJIY3JJbmZvIGVySGNySW5mbzsKICAgICAgIENFclJ2bGNJbmZvIGVyUnZsY0luZm87Ci0gICAgICBTSE9SVCBhUnZsY1NjZkVzY1tSVkxDX01BWF9TRkJdOyAgICAgICAgICAgICAgIC8qIG5lZWRlZCBvbmNlIGZvciBhbGwgY2hhbm5lbHMgKi8KLSAgICAgIFNIT1JUIGFSdmxjU2NmRndkW1JWTENfTUFYX1NGQl07ICAgICAgICAgICAgICAgLyogbmVlZGVkIG9uY2UgZm9yIGFsbCBjaGFubmVscyAqLwotICAgICAgU0hPUlQgYVJ2bGNTY2ZCd2RbUlZMQ19NQVhfU0ZCXTsgICAgICAgICAgICAgICAvKiBuZWVkZWQgb25jZSBmb3IgYWxsIGNoYW5uZWxzICovCisgICAgICBTSE9SVCBhUnZsY1NjZkVzY1tSVkxDX01BWF9TRkJdOyAvKiBuZWVkZWQgb25jZSBmb3IgYWxsIGNoYW5uZWxzICovCisgICAgICBTSE9SVCBhUnZsY1NjZkZ3ZFtSVkxDX01BWF9TRkJdOyAvKiBuZWVkZWQgb25jZSBmb3IgYWxsIGNoYW5uZWxzICovCisgICAgICBTSE9SVCBhUnZsY1NjZkJ3ZFtSVkxDX01BWF9TRkJdOyAvKiBuZWVkZWQgb25jZSBmb3IgYWxsIGNoYW5uZWxzICovCiAgICAgfSBhYWM7Ci0KLSAgfSBvdmVybGF5OworICB9CisgIG92ZXJsYXk7CiAKIH0gQ0FhY0RlY29kZXJDb21tb25EYXRhOwogCit0eXBlZGVmIHN0cnVjdCB7CisgIENXb3JrQnVmZmVyQ29yZTEgKnBXb3JrQnVmZmVyQ29yZTE7CisgIENDcGx4UHJlZGljdGlvbkRhdGEgKmNwbHhQcmVkaWN0aW9uRGF0YTsKK30gQ0FhY0RlY29kZXJDb21tb25TdGF0aWNEYXRhOwogCiAvKgotICogVGhpcyBzdHJ1Y3QgbXVzdCBiZSBhbGxvY2F0ZWQgb25lIGZvciBldmVyeSBjaGFubmVscyBvZiBldmVyeSBlbGVtZW50IGFuZCBtdXN0IGJlIHBlcnNpc3RlbnQuCi0gKiBBbW9uZyBpdHMgbWVtYmVycywgdGhlIGZvbGxvd2luZyBtZW1vcnkgYXJlYXMgY2FuIGJlIG92ZXJ3cml0dGVuIHVuZGVyIHRoZSBnaXZlbiBjb25kaXRpb25zOgotICogIC0gcFNwZWN0cmFsQ29lZmZpY2llbnQgVGhlIG1lbW9yeSBwb2ludGVkIHRvIGNhbiBiZSBvdmVyd3JpdHRlbiBhZnRlciB0aW1lIHNpZ25hbCByZW5kZXJpbmcuCisgKiBUaGlzIHN0cnVjdCBtdXN0IGJlIGFsbG9jYXRlZCBvbmUgZm9yIGV2ZXJ5IGNoYW5uZWwgb2YgZXZlcnkgZWxlbWVudCBhbmQgbXVzdAorICogYmUgcGVyc2lzdGVudC4gQW1vbmcgaXRzIG1lbWJlcnMsIHRoZSBmb2xsb3dpbmcgbWVtb3J5IGFyZWFzIGNhbiBiZQorICogb3ZlcndyaXR0ZW4gdW5kZXIgdGhlIGdpdmVuIGNvbmRpdGlvbnM6CisgKiAgLSBwU3BlY3RyYWxDb2VmZmljaWVudCBUaGUgbWVtb3J5IHBvaW50ZWQgdG8gY2FuIGJlIG92ZXJ3cml0dGVuIGFmdGVyIHRpbWUKKyAqIHNpZ25hbCByZW5kZXJpbmcuCiAgKiAgLSBkYXRhIGNhbiBiZSBvdmVyd3JpdHRlbiBhZnRlciB0aW1lIHNpZ25hbCByZW5kZXJpbmcuCi0gKiAgLSBwRHluRGF0YSBtZW1vcnkgcG9pbnRlZCB0byBjYW4gYmUgb3ZlcndyaXR0ZW4gYWZ0ZXIgZWFjaCBDQ2hhbm5lbEVsZW1lbnRfRGVjb2RlKCkgY2FsbC4KLSAqICAtIHBDb21EYXRhLT5vdmVybGF5IG1lbW9yeSBwb2ludGVkIHRvIGNhbiBiZSBvdmVyd3JpdHRlbiBhZnRlciBlYWNoIENDaGFubmVsRWxlbWVudF9EZWNvZGUoKSBjYWxsLi4KKyAqICAtIHBEeW5EYXRhIG1lbW9yeSBwb2ludGVkIHRvIGNhbiBiZSBvdmVyd3JpdHRlbiBhZnRlciBlYWNoCisgKiBDQ2hhbm5lbEVsZW1lbnRfRGVjb2RlKCkgY2FsbC4KKyAqICAtIHBDb21EYXRhLT5vdmVybGF5IG1lbW9yeSBwb2ludGVkIHRvIGNhbiBiZSBvdmVyd3JpdHRlbiBhZnRlciBlYWNoCisgKiBDQ2hhbm5lbEVsZW1lbnRfRGVjb2RlKCkgY2FsbC4uCiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIFNQRUNUUkFMX1BUUiBwU3BlY3RyYWxDb2VmZmljaWVudDsgICAgICAgICAgICAgLyogU3BlY3RyYWwgY29lZmZpY2llbnRzIG9mIGVhY2ggd2luZG93ICovCi0gIFNIT1JUIHNwZWNTY2FsZVs4XTsgICAgICAgICAgICAgICAgICAvKiBTY2FsZSBzaGlmdCB2YWx1ZXMgb2YgZWFjaCBzcGVjdHJ1bSB3aW5kb3cgKi8KLSAgQ0ljc0luZm8gaWNzSW5mbzsKLSAgSU5UIGdyYW51bGVMZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaXplIG9mIHNtYWxsZXN0IHNwZWN0cnVtIHBpZWNlICovCi0gIFVDSEFSIEVsZW1lbnRJbnN0YW5jZVRhZzsKLQotICBBQUNERUNfUkVOREVSX01PREUgcmVuZGVyTW9kZTsgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzaWduYWwgcmVuZGVyaW5nIG1vZGUgKi8KLQordHlwZWRlZiBzdHJ1Y3QgewogICBzaG91bGRCZVVuaW9uIHsKICAgICBzdHJ1Y3QgeworICAgICAgRklYUF9EQkwgZmFjX2RhdGEwW0xGQUNdOworICAgICAgVUNIQVIgZmFjX2RhdGFfZVs0XTsKKyAgICAgIEZJWFBfREJMCisgICAgICAqZmFjX2RhdGFbNF07IC8qIFBvaW50ZXJzIHRvIHVudXNlZCBwYXJ0cyBvZiBwU3BlY3RyYWxDb2VmZmljaWVudCAqLworCisgICAgICBVQ0hBUiBjb3JlX21vZGU7IC8qIGN1cnJlbnQgY29yZSBtb2RlICovCisgICAgICBVU0FDX0NPUkVNT0RFCisgICAgICBjb3JlX21vZGVfbGFzdDsgICAgICAvKiBwcmV2aW91cyBjb3JlIG1vZGUsIHNpZ25hbGxlZCBpbiB0aGUgYml0c3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm90IGRvbmUgYnkgdGhlIGRlY29kZXIsIHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbzo6bGFzdF9jb3JlX21vZGUgISEpKi8KKyAgICAgIFVDSEFSIGxwZF9tb2RlX2xhc3Q7IC8qIHByZXZpb3VzIExQRCBtb2RlLCBzaWduYWxsZWQgaW4gdGhlIGJpdHN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCBkb25lIGJ5IHRoZSBkZWNvZGVyLCBzZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm86Omxhc3RfY29yZV9tb2RlICEhKSovCisgICAgICBVQ0hBUiBtb2RbNF07CisgICAgICBVQ0hBUiBicGZfY29udHJvbF9pbmZvOyAvKiAoMTogZW5hYmxlLCAwOiBkaXNhYmxlKSBicGYgZm9yIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyZnJhbWUgKi8KKworICAgICAgRklYUF9MUEMgbHNwX2NvZWZmWzVdW01fTFBfRklMVEVSX09SREVSXTsgLyogbGluZWFyIHByZWRpY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmaWNpZW50cyBpbiBMU1AgZG9tYWluICovCisgICAgICBGSVhQX0xQQworICAgICAgbHBfY29lZmZbNV1bTV9MUF9GSUxURVJfT1JERVJdOyAvKiBsaW5lYXIgcHJlZGljdGlvbiBjb2VmZmljaWVudHMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFAgZG9tYWluICovCisgICAgICBJTlQgbHBfY29lZmZfZXhwWzVdOworICAgICAgRklYUF9MUEMgbHNmX2FkYXB0aXZlX21lYW5fY2FuZAorICAgICAgICAgIFtNX0xQX0ZJTFRFUl9PUkRFUl07IC8qIGNvbmNlYWxtZW50OiBpcyBjb3BpZWQgdG8KKyAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxzZl9hZGFwdGl2ZV9tZWFuIG9uY2UgZnJhbWUgaXMKKyAgICAgICAgICAgICAgICAgIGFzc3VtZWQgdG8gYmUgY29ycmVjdCovCisgICAgICBGSVhQX1NHTCBhU3RhYmlsaXR5WzRdOyAgLyogTFBDIGNvZWZmIHN0YWJpbGl0eSB2YWx1ZXMgcmVxdWlyZWQgZm9yIEFDRUxQCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIFRDWCAoY29uY2VhbG1lbnQpICovCisKKyAgICAgIENBY2VscENoYW5uZWxEYXRhIGFjZWxwWzRdOworCisgICAgICBGSVhQX0RCTCB0Y3hfZ2Fpbls0XTsKKyAgICAgIFNDSEFSIHRjeF9nYWluX2VbNF07CisgICAgfSB1c2FjOworCisgICAgc3RydWN0IHsKICAgICAgIENQbnNEYXRhIFBuc0RhdGE7IC8qIE5vdCByZXF1aXJlZCBmb3IgVVNBQyAqLwogICAgIH0gYWFjOworICB9CisgIGRhdGE7CiAKLSAgICBzdHJ1Y3QgewotICAgIH0gdXNhYzsKLSAgfSBkYXRhOworICBTUEVDVFJBTF9QVFIgcFNwZWN0cmFsQ29lZmZpY2llbnQ7IC8qIFNwZWN0cmFsIGNvZWZmaWNpZW50cyBvZiBlYWNoIHdpbmRvdyAqLworICBTSE9SVCBzcGVjU2NhbGVbOF07IC8qIFNjYWxlIHNoaWZ0IHZhbHVlcyBvZiBlYWNoIHNwZWN0cnVtIHdpbmRvdyAqLworICBDSWNzSW5mbyBpY3NJbmZvOworICBJTlQgZ3JhbnVsZUxlbmd0aDsgLyogU2l6ZSBvZiBzbWFsbGVzdCBzcGVjdHJ1bSBwaWVjZSAqLworICBVQ0hBUiBFbGVtZW50SW5zdGFuY2VUYWc7CiAKLSAgQ0FhY0RlY29kZXJEeW5hbWljRGF0YSAqcER5bkRhdGE7IC8qIERhdGEgcmVxdWlyZWQgZm9yIG9uZSBlbGVtZW50IGFuZCBkaXNjYXJkZWQgYWZ0ZXIgZGVjb2RpbmcgKi8KLSAgQ0FhY0RlY29kZXJDb21tb25EYXRhICAqcENvbURhdGE7IC8qIERhdGEgcmVxdWlyZWQgZm9yIG9uZSBjaGFubmVsIGF0IGEgdGltZSBkdXJpbmcgZGVjb2RlICovCisgIEFBQ0RFQ19SRU5ERVJfTU9ERSByZW5kZXJNb2RlOyAvKiBPdXRwdXQgc2lnbmFsIHJlbmRlcmluZyBtb2RlICovCisKKyAgQ0FhY0RlY29kZXJEeW5hbWljRGF0YSAqCisgICAgICBwRHluRGF0YTsgLyogRGF0YSByZXF1aXJlZCBmb3Igb25lIGVsZW1lbnQgYW5kIGRpc2NhcmRlZCBhZnRlciBkZWNvZGluZyAqLworICBDQWFjRGVjb2RlckNvbW1vbkRhdGEKKyAgICAgICpwQ29tRGF0YTsgLyogRGF0YSByZXF1aXJlZCBmb3Igb25lIGNoYW5uZWwgYXQgYSB0aW1lIGR1cmluZyBkZWNvZGUgKi8KKyAgQ0FhY0RlY29kZXJDb21tb25TdGF0aWNEYXRhICpwQ29tU3RhdGljRGF0YTsgLyogUGVyc2lzdGVudCBkYXRhIHJlcXVpcmVkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgY2hhbm5lbCBhdCBhIHRpbWUgZHVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZSAqLworCisgIGludCBjdXJyQWxpYXNpbmdTeW1tZXRyeTsgLyogcmVxdWlyZWQgZm9yIFJTVkQ2MCBNQ1QgKi8KIAogfSBDQWFjRGVjb2RlckNoYW5uZWxJbmZvOwogCiAvKiBjaGFubmVsaW5mby5jcHAgKi8KIAotQUFDX0RFQ09ERVJfRVJST1IgZ2V0U2FtcGxpbmdSYXRlSW5mbyhTYW1wbGluZ1JhdGVJbmZvICp0LCBVSU5UIHNhbXBsZXNQZXJGcmFtZSwgVUlOVCBzYW1wbGluZ1JhdGVJbmRleCwgVUlOVCBzYW1wbGluZ1JhdGUpOworQUFDX0RFQ09ERVJfRVJST1IgZ2V0U2FtcGxpbmdSYXRlSW5mbyhTYW1wbGluZ1JhdGVJbmZvICp0LCBVSU5UIHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzYW1wbGluZ1JhdGVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzYW1wbGluZ1JhdGUpOwogCiAvKioKICAqIFxicmllZiBSZWFkIG1heCBTRkIgZnJvbSBiaXQgc3RyZWFtIGFuZCBhc3NpZ24gVG90YWxTZkJhbmRzIGFjY29yZGluZwogICogICAgICAgIHRvIHRoZSB3aW5kb3cgc2VxdWVuY2UgYW5kIHNhbXBsZSByYXRlLgogICogXHBhcmFtIGhCcyBiaXQgc3RyZWFtIGhhbmRsZSBhcyBkYXRhIHNvdXJjZQotICogXHBhcmFtIHBJY3NJbmZvIEljc0luZm8gc3RydWN0dXJlIHRvIHJlYWQgdGhlIHdpbmRvdyBzZXF1ZW5jZSBhbmQgc3RvcmUgTWF4U2ZCYW5kcyBhbmQgVG90YWxTZkJhbmRzCisgKiBccGFyYW0gcEljc0luZm8gSWNzSW5mbyBzdHJ1Y3R1cmUgdG8gcmVhZCB0aGUgd2luZG93IHNlcXVlbmNlIGFuZCBzdG9yZQorICogTWF4U2ZCYW5kcyBhbmQgVG90YWxTZkJhbmRzCiAgKiBccGFyYW0gcFNhbXBsaW5nUmF0ZUluZm8gcmVhZCBvbmx5CiAgKi8KLUFBQ19ERUNPREVSX0VSUk9SIEljc1JlYWRNYXhTZmIgKAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIENJY3NJbmZvICpwSWNzSW5mbywKLSAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8KLSAgICAgICAgKTsKK0FBQ19ERUNPREVSX0VSUk9SIEljc1JlYWRNYXhTZmIoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBDSWNzSW5mbyAqcEljc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvKTsKIAotQUFDX0RFQ09ERVJfRVJST1IgSWNzUmVhZCgKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCi0gICAgICAgIENJY3NJbmZvICpwSWNzSW5mbywKLSAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyogU2FtcGxpbmdSYXRlSW5mb1RhYmxlLAotICAgICAgICBjb25zdCBVSU5UIGZsYWdzCi0gICAgICAgICk7CitBQUNfREVDT0RFUl9FUlJPUiBJY3NSZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBDSWNzSW5mbyAqcEljc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKlNhbXBsaW5nUmF0ZUluZm9UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncyk7CiAKIC8qIHN0ZXJlby5jcHAsIG9ubHkgY2FsbGVkIGZyb20gdGhpcyBmaWxlICovCiAKIC8qIQotICBcYnJpZWYgQXBwbGllcyBNUyBzdGVyZW8uIAotICAKKyAgXGJyaWVmIEFwcGxpZXMgTVMgc3RlcmVvLgorCiAgIFRoZSBmdW5jdGlvbiBhcHBsaWVzIE1TIHN0ZXJlby4KIAogICBccGFyYW0gcEFhY0RlY29kZXJDaGFubmVsSW5mbyBhYWMgY2hhbm5lbCBpbmZvLgogICBccGFyYW0gcFNjYWxlRmFjdG9yQmFuZE9mZnNldHMgcG9pbnRlciB0byBzY2FsZWZhY3RvciBiYW5kIG9mZnNldHMuCiAgIFxwYXJhbSBwV2luZG93R3JvdXBMZW5ndGggcG9pbnRlciB0byB3aW5kb3cgZ3JvdXAgbGVuZ3RoIGFycmF5LgogICBccGFyYW0gd2luZG93R3JvdXBzIG51bWJlciBvZiB3aW5kb3cgZ3JvdXBzLgotICBccGFyYW0gc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkTCBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgc2NhbGVmYWN0b3IgYmFuZHMgaW4gbGVmdCBjaGFubmVsLgotICBccGFyYW0gc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkUiBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgc2NhbGVmYWN0b3IgYmFuZHMgaW4gcmlnaHQgY2hhbm5lbC4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heSBkaWZmZXIgZnJvbSBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRMIG9ubHkgZm9yIFVTQUMuCi0gIFxyZXR1cm4gIG5vbmUKKyAgXHBhcmFtIHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZEwgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHNjYWxlZmFjdG9yIGJhbmRzIGluCisgIGxlZnQgY2hhbm5lbC4gXHBhcmFtIHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZFIgbnVtYmVyIG9mIHRyYW5zbWl0dGVkCisgIHNjYWxlZmFjdG9yIGJhbmRzIGluIHJpZ2h0IGNoYW5uZWwuIE1heSBkaWZmZXIgZnJvbQorICBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRMIG9ubHkgZm9yIFVTQUMuIFxyZXR1cm4gIG5vbmUKICovCi12b2lkIENKb2ludFN0ZXJlb19BcHBseU1TKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0ICpwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKnBXaW5kb3dHcm91cExlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHdpbmRvd0dyb3VwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRSKTsKK3ZvaWQgQ0pvaW50U3RlcmVvX0FwcGx5TVMoCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1syXSwKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvWzJdLAorICAgIEZJWFBfREJMICpzcGVjdHJ1bUwsIEZJWFBfREJMICpzcGVjdHJ1bVIsIFNIT1JUICpTRkJsZWZ0U2NhbGUsCisgICAgU0hPUlQgKlNGQnJpZ2h0U2NhbGUsIFNIT1JUICpzcGVjU2NhbGVMLCBTSE9SVCAqc3BlY1NjYWxlUiwKKyAgICBjb25zdCBTSE9SVCAqcFNjYWxlRmFjdG9yQmFuZE9mZnNldHMsIGNvbnN0IFVDSEFSICpwV2luZG93R3JvdXBMZW5ndGgsCisgICAgY29uc3QgaW50IHdpbmRvd0dyb3VwcywgY29uc3QgaW50IG1heF9zZmJfc3RlX291dHNpZGUsCisgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZEwsCisgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZFIsIEZJWFBfREJMICpzdG9yZV9kbXhfcmVfcHJldiwKKyAgICBTSE9SVCAqc3RvcmVfZG14X3JlX3ByZXZfZSwgY29uc3QgaW50IG1haW5iYW5kX2ZsYWcpOwogCiAvKiEKICAgXGJyaWVmIEFwcGxpZXMgaW50ZW5zaXR5IHN0ZXJlbwpAQCAtMzUwLDEwMSArNDc4LDg3IEBACiAgIFxwYXJhbSBwV2luZG93R3JvdXBMZW5ndGggcG9pbnRlciB0byB3aW5kb3cgZ3JvdXAgbGVuZ3RoIGFycmF5LgogICBccGFyYW0gd2luZG93R3JvdXBzIG51bWJlciBvZiB3aW5kb3cgZ3JvdXBzLgogICBccGFyYW0gc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkIG51bWJlciBvZiB0cmFuc21pdHRlZCBzY2FsZWZhY3RvciBiYW5kcy4KLSAgXHBhcmFtIENvbW1vbldpbmRvdyBjb21tb24gd2luZG93IGJpdC4KICAgXHJldHVybiAgbm9uZQogKi8KIHZvaWQgQ0pvaW50U3RlcmVvX0FwcGx5SVMoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1syXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvcnQgKnBTY2FsZUZhY3RvckJhbmRPZmZzZXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqcFdpbmRvd0dyb3VwTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgd2luZG93R3JvdXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIENvbW1vbldpbmRvdyk7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCk7CiAKIC8qIGFhY2RlY19wbnMuY3BwICovCi1pbnQgQ1Buc19Jc1Buc1VzZWQgKGNvbnN0IENQbnNEYXRhICpwUG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGdyb3VwLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmFuZCk7CitpbnQgQ1Buc19Jc1Buc1VzZWQoY29uc3QgQ1Buc0RhdGEgKnBQbnNEYXRhLCBjb25zdCBpbnQgZ3JvdXAsIGNvbnN0IGludCBiYW5kKTsKIAotdm9pZCBDUG5zX1NldENvcnJlbGF0aW9uKENQbnNEYXRhICpwUG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJhbmQsCit2b2lkIENQbnNfU2V0Q29ycmVsYXRpb24oQ1Buc0RhdGEgKnBQbnNEYXRhLCBjb25zdCBpbnQgZ3JvdXAsIGNvbnN0IGludCBiYW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvdXRvZnBoYXNlKTsKIAogLyoqKioqKioqKioqKioqKioqKiBpbmxpbmUgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKi8KIAotaW5saW5lIFVDSEFSIElzVmFsaWQoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvKQotewotICByZXR1cm4gcEljc0luZm8tPlZhbGlkOworaW5saW5lIFVDSEFSIElzVmFsaWQoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvKSB7IHJldHVybiBwSWNzSW5mby0+VmFsaWQ7IH0KKworaW5saW5lIFVDSEFSIElzTG9uZ0Jsb2NrKGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbykgeworICByZXR1cm4gKHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSAhPSBCTE9DS19TSE9SVCk7CiB9CiAKLWlubGluZSBVQ0hBUiBJc0xvbmdCbG9jayhjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pCi17Ci0gIHJldHVybiAocEljc0luZm8tPldpbmRvd1NlcXVlbmNlICE9IEVpZ2h0U2hvcnRTZXF1ZW5jZSk7Ci19Ci0KLWlubGluZSBVQ0hBUiBHZXRXaW5kb3dTaGFwZShjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pCi17CitpbmxpbmUgVUNIQVIgR2V0V2luZG93U2hhcGUoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvKSB7CiAgIHJldHVybiBwSWNzSW5mby0+V2luZG93U2hhcGU7CiB9CiAKLWlubGluZSBVQ0hBUiBHZXRXaW5kb3dTZXF1ZW5jZShjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pCi17CitpbmxpbmUgQkxPQ0tfVFlQRSBHZXRXaW5kb3dTZXF1ZW5jZShjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pIHsKICAgcmV0dXJuIHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZTsKIH0KIAotaW5saW5lIGNvbnN0IFNIT1JUICpHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbywgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyogc2FtcGxpbmdSYXRlSW5mbykKLXsKLSAgaWYgKElzTG9uZ0Jsb2NrKHBJY3NJbmZvKSkKLSAgeworaW5saW5lIGNvbnN0IFNIT1JUICpHZXRTY2FsZUZhY3RvckJhbmRPZmZzZXRzKAorICAgIGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbywgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqc2FtcGxpbmdSYXRlSW5mbykgeworICBpZiAoSXNMb25nQmxvY2socEljc0luZm8pKSB7CiAgICAgcmV0dXJuIHNhbXBsaW5nUmF0ZUluZm8tPlNjYWxlRmFjdG9yQmFuZHNfTG9uZzsKLSAgfQotICBlbHNlCi0gIHsKKyAgfSBlbHNlIHsKICAgICByZXR1cm4gc2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19TaG9ydDsKICAgfQogfQogCi1pbmxpbmUgaW50IEdldFdpbmRvd3NQZXJGcmFtZShjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pCi17Ci0gIHJldHVybiAocEljc0luZm8tPldpbmRvd1NlcXVlbmNlID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkgPyA4IDogMTsKK2lubGluZSBVQ0hBUiBHZXROdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHMoCisgICAgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvLCBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpzYW1wbGluZ1JhdGVJbmZvKSB7CisgIGlmIChJc0xvbmdCbG9jayhwSWNzSW5mbykpIHsKKyAgICByZXR1cm4gc2FtcGxpbmdSYXRlSW5mby0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX0xvbmc7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHNhbXBsaW5nUmF0ZUluZm8tPk51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19TaG9ydDsKKyAgfQogfQogCi1pbmxpbmUgVUNIQVIgR2V0V2luZG93R3JvdXBzKGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbykKLXsKK2lubGluZSBpbnQgR2V0V2luZG93c1BlckZyYW1lKGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbykgeworICByZXR1cm4gKHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSA9PSBCTE9DS19TSE9SVCkgPyA4IDogMTsKK30KKworaW5saW5lIFVDSEFSIEdldFdpbmRvd0dyb3Vwcyhjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pIHsKICAgcmV0dXJuIHBJY3NJbmZvLT5XaW5kb3dHcm91cHM7CiB9CiAKLWlubGluZSBVQ0hBUiBHZXRXaW5kb3dHcm91cExlbmd0aChjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sIGNvbnN0IElOVCBpbmRleCkKLXsKK2lubGluZSBVQ0hBUiBHZXRXaW5kb3dHcm91cExlbmd0aChjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sIGNvbnN0IElOVCBpbmRleCkgewogICByZXR1cm4gcEljc0luZm8tPldpbmRvd0dyb3VwTGVuZ3RoW2luZGV4XTsKIH0KIAotaW5saW5lIGNvbnN0IFVDSEFSICpHZXRXaW5kb3dHcm91cExlbmd0aFRhYmxlKGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbykKLXsKK2lubGluZSBjb25zdCBVQ0hBUiAqR2V0V2luZG93R3JvdXBMZW5ndGhUYWJsZShjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pIHsKICAgcmV0dXJuIHBJY3NJbmZvLT5XaW5kb3dHcm91cExlbmd0aDsKIH0KIAotaW5saW5lIFVDSEFSIEdldFNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZChjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pCi17CitpbmxpbmUgVUNIQVIgR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbykgewogICByZXR1cm4gcEljc0luZm8tPk1heFNmQmFuZHM7CiB9CiAKLWlubGluZSBVQ0hBUiBHZXRTY2FsZU1heEZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvMCwgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvMSkKLXsKK2lubGluZSBVQ0hBUiBHZXRTY2FsZU1heEZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvMSkgewogICByZXR1cm4gZk1heChwSWNzSW5mbzAtPk1heFNmQmFuZHMsIHBJY3NJbmZvMS0+TWF4U2ZCYW5kcyk7CiB9CiAKLWlubGluZSBVQ0hBUiBHZXRTY2FsZUZhY3RvckJhbmRzVG90YWwoY29uc3QgQ0ljc0luZm8gKnBJY3NJbmZvKQoteworaW5saW5lIFVDSEFSIEdldFNjYWxlRmFjdG9yQmFuZHNUb3RhbChjb25zdCBDSWNzSW5mbyAqcEljc0luZm8pIHsKICAgcmV0dXJuIHBJY3NJbmZvLT5Ub3RhbFNmQmFuZHM7CiB9CiAKIC8qIE5vdGU6IFRoaXMgZnVuY3Rpb24gYXBwbGllcyB0byBBQUMtTEMgb25seSAhICovCi1pbmxpbmUgVUNIQVIgR2V0TWF4aW11bVRuc0JhbmRzKGNvbnN0IENJY3NJbmZvICpwSWNzSW5mbywgY29uc3QgaW50IHNhbXBsaW5nUmF0ZUluZGV4KQoteworaW5saW5lIFVDSEFSIEdldE1heGltdW1UbnNCYW5kcyhjb25zdCBDSWNzSW5mbyAqcEljc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzYW1wbGluZ1JhdGVJbmRleCkgewogICByZXR1cm4gdG5zX21heF9iYW5kc190Ymxbc2FtcGxpbmdSYXRlSW5kZXhdWyFJc0xvbmdCbG9jayhwSWNzSW5mbyldOwogfQogCiAjZW5kaWYgLyogI2lmbmRlZiBDSEFOTkVMSU5GT19IICovCi0KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvY29uY2VhbC5jcHAgYi9saWJBQUNkZWMvc3JjL2NvbmNlYWwuY3BwCmluZGV4IDFjMzEzZWYuLmE2MDY0YjYgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvY29uY2VhbC5jcHAKKysrIGIvbGliQUFDZGVjL3NyYy9jb25jZWFsLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw1MyArOTAsNTggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKwogICAgRGVzY3JpcHRpb246IGluZGVwZW5kZW50IGNoYW5uZWwgY29uY2VhbG1lbnQKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxwYWdlIGNvbmNlYWxtZW50IEFBQyBjb3JlIGNvbmNlYWxtZW50CiAKLSAgVGhpcyBBQUMgY29yZSBpbXBsZW1lbnRhdGlvbiBpbmNsdWRlcyBhIGNvbmNlYWxtZW50IGZ1bmN0aW9uLCB3aGljaCBjYW4gYmUgZW5hYmxlZAotICB1c2luZyB0aGUgc2V2ZXJhbCBkZWZpbmVzIGR1cmluZyBjb21waWxhdGlvbi4KKyAgVGhpcyBBQUMgY29yZSBpbXBsZW1lbnRhdGlvbiBpbmNsdWRlcyBhIGNvbmNlYWxtZW50IGZ1bmN0aW9uLCB3aGljaCBjYW4gYmUKKyAgZW5hYmxlZCB1c2luZyB0aGUgc2V2ZXJhbCBkZWZpbmVzIGR1cmluZyBjb21waWxhdGlvbi4KIAotICBUaGVyZSBhcmUgdmFyaW91cyB0ZXN0cyBpbnNpZGUgdGhlIGNvcmUsIHN0YXJ0aW5nIHdpdGggc2ltcGxlIENSQyB0ZXN0cyBhbmQgZW5kaW5nIGluCi0gIGEgdmFyaWV0eSBvZiBwbGF1c2liaWxpdHkgY2hlY2tzLiBJZiBzdWNoIGEgY2hlY2sgaW5kaWNhdGVzIGFuIGludmFsaWQgYml0c3RyZWFtLCB0aGVuCi0gIGNvbmNlYWxtZW50IGlzIGFwcGxpZWQuCisgIFRoZXJlIGFyZSB2YXJpb3VzIHRlc3RzIGluc2lkZSB0aGUgY29yZSwgc3RhcnRpbmcgd2l0aCBzaW1wbGUgQ1JDIHRlc3RzIGFuZAorICBlbmRpbmcgaW4gYSB2YXJpZXR5IG9mIHBsYXVzaWJpbGl0eSBjaGVja3MuIElmIHN1Y2ggYSBjaGVjayBpbmRpY2F0ZXMgYW4KKyAgaW52YWxpZCBiaXRzdHJlYW0sIHRoZW4gY29uY2VhbG1lbnQgaXMgYXBwbGllZC4KIAotICBDb25jZWFsbWVudCBpcyBhbHNvIGFwcGxpZWQgd2hlbiB0aGUgY2FsbGluZyBtYWluIHByb2dyYW0gaW5kaWNhdGVzIGEgZGlzdG9ydGVkIG9yIG1pc3NpbmcKLSAgZGF0YSBmcmFtZSB1c2luZyB0aGUgZnJhbWVPSyBmbGFnLiBUaGlzIGlzIHVzZWQgZm9yIGVycm9yIGRldGVjdGlvbiBvbiB0aGUgdHJhbnNwb3J0IGxheWVyLgotICAoU2VlIGJlbG93KQorICBDb25jZWFsbWVudCBpcyBhbHNvIGFwcGxpZWQgd2hlbiB0aGUgY2FsbGluZyBtYWluIHByb2dyYW0gaW5kaWNhdGVzIGEKKyAgZGlzdG9ydGVkIG9yIG1pc3NpbmcgZGF0YSBmcmFtZSB1c2luZyB0aGUgZnJhbWVPSyBmbGFnLiBUaGlzIGlzIHVzZWQgZm9yIGVycm9yCisgIGRldGVjdGlvbiBvbiB0aGUgdHJhbnNwb3J0IGxheWVyLiAoU2VlIGJlbG93KQogCiAgIFRoZXJlIGFyZSB0aHJlZSBjb25jZWFsbWVudC1tb2RlczoKIAotICAxKSBNdXRpbmc6IFRoZSBzcGVjdHJhbCBkYXRhIGlzIHNpbXBseSBzZXQgdG8gemVybyBpbiBjYXNlIG9mIGFuIGRldGVjdGVkIGVycm9yLgorICAxKSBNdXRpbmc6IFRoZSBzcGVjdHJhbCBkYXRhIGlzIHNpbXBseSBzZXQgdG8gemVybyBpbiBjYXNlIG9mIGFuIGRldGVjdGVkCisgIGVycm9yLgogCi0gIDIpIE5vaXNlIHN1YnN0aXR1dGlvbjogSW4gY2FzZSBvZiBhbiBkZXRlY3RlZCBlcnJvciwgY29uY2VhbG1lbnQgY29waWVzIHRoZSBsYXN0IGZyYW1lIGFuZCBhZGRzCi0gICAgIGF0dGVudWF0ZXMgdGhlIHNwZWN0cmFsIGRhdGEuIEZvciB0aGlzIG1vZGUgeW91IGhhdmUgdG8gc2V0IHRoZSAjQ09OQ0VBTF9OT0lTRSBkZWZpbmUuCi0gICAgIE5vaXNlIHN1YnN0aXR1dGlvbiBhZGRzIG5vIGFkZGl0aW9uYWwgZGVsYXkuCisgIDIpIE5vaXNlIHN1YnN0aXR1dGlvbjogSW4gY2FzZSBvZiBhbiBkZXRlY3RlZCBlcnJvciwgY29uY2VhbG1lbnQgY29waWVzIHRoZQorICBsYXN0IGZyYW1lIGFuZCBhZGRzIGF0dGVudWF0ZXMgdGhlIHNwZWN0cmFsIGRhdGEuIEZvciB0aGlzIG1vZGUgeW91IGhhdmUgdG8KKyAgc2V0IHRoZSAjQ09OQ0VBTF9OT0lTRSBkZWZpbmUuIE5vaXNlIHN1YnN0aXR1dGlvbiBhZGRzIG5vIGFkZGl0aW9uYWwgZGVsYXkuCiAKLSAgMykgSW50ZXJwb2xhdGlvbjogVGhlIGludGVycG9sYXRpb24gcm91dGluZSBzd2FwcyB0aGUgc3BlY3RyYWwgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyBhbmQgdGhlCi0gICAgIGN1cnJlbnQgZnJhbWUganVzdCBiZWZvcmUgdGhlIGZpbmFsIGZyZXF1ZW5jeSB0byB0aW1lIGNvbnZlcnNpb24uIEluIGNhc2UgYSBzaW5nbGUgZnJhbWUgaXMKLSAgICAgY29ycnVwdGVkLCBjb25jZWFsbWFudCBpbnRlcnBvbGF0ZXMgYmV0d2VlbiB0aGUgbGFzdCBnb29kIGFuZCB0aGUgZmlyc3QgZ29vZCBmcmFtZSB0byBjcmVhdGUKLSAgICAgdGhlIHNwZWN0cmFsIGRhdGEgZm9yIHRoZSBtaXNzaW5nIGZyYW1lLiBJZiBtdWx0aXBsZSBmcmFtZXMgYXJlIGNvcnJ1cHRlZCwgY29uY2VhbG1lbnQKLSAgICAgaW1wbGVtZW50cyBmaXJzdCBhIGZhZGUgb3V0IGJhc2VkIG9uIHNsaWdodGx5IG1vZGlmaWVkIHNwZWN0cmFsIHZhbHVlcyBmcm9tIHRoZSBsYXN0IGdvb2QKLSAgICAgZnJhbWUuIEFzIHNvb24gYXMgZ29vZCBmcmFtZXMgYXJlIGF2YWlsYWJsZSwgY29uY2VhbG1hbnQgZmFkZXMgaW4gdGhlIG5ldyBzcGVjdHJhbCBkYXRhLgotICAgICBGb3IgdGhpcyBtb2RlIHlvdSBoYXZlIHRvIHNldCB0aGUgI0NPTkNFQUxfSU5URVIgZGVmaW5lLiBOb3RlIHRoYXQgaW4gdGhpcyBjYXNlLCB5b3UgYWxzbwotICAgICBuZWVkIHRvIHNldCAjU0JSX0JTX0RFTEFZX0VOQUJMRSwgd2hpY2ggYmFzaWNhbGx5IGFkZHMgYXBwcm9yaWF0ZSBkZWxheSBpbiB0aGUgU0JSIGRlY29kZXIuCi0gICAgIE5vdGUgdGhhdCB0aGUgSW50ZXJwb2xhdGluZy1Db25jZWFsbWVudCBpbmNyZWFzZXMgdGhlIGRlbGF5IG9mIHlvdXIgZGVjb2RlciBieSBvbmUgZnJhbWUKLSAgICAgYW5kIHRoYXQgaXQgZG9lcyByZXF1aXJlIGFkZGl0aW9uYWwgcmVzb3VyY2VzIHN1Y2ggYXMgbWVtb3J5IGFuZCBjb21wdXRhdGlvbmFsIGNvbXBsZXhpdHkuCisgIDMpIEludGVycG9sYXRpb246IFRoZSBpbnRlcnBvbGF0aW9uIHJvdXRpbmUgc3dhcHMgdGhlIHNwZWN0cmFsIGRhdGEgZnJvbSB0aGUKKyAgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50IGZyYW1lIGp1c3QgYmVmb3JlIHRoZSBmaW5hbCBmcmVxdWVuY3kgdG8gdGltZQorICBjb252ZXJzaW9uLiBJbiBjYXNlIGEgc2luZ2xlIGZyYW1lIGlzIGNvcnJ1cHRlZCwgY29uY2VhbG1hbnQgaW50ZXJwb2xhdGVzCisgIGJldHdlZW4gdGhlIGxhc3QgZ29vZCBhbmQgdGhlIGZpcnN0IGdvb2QgZnJhbWUgdG8gY3JlYXRlIHRoZSBzcGVjdHJhbCBkYXRhIGZvcgorICB0aGUgbWlzc2luZyBmcmFtZS4gSWYgbXVsdGlwbGUgZnJhbWVzIGFyZSBjb3JydXB0ZWQsIGNvbmNlYWxtZW50IGltcGxlbWVudHMKKyAgZmlyc3QgYSBmYWRlIG91dCBiYXNlZCBvbiBzbGlnaHRseSBtb2RpZmllZCBzcGVjdHJhbCB2YWx1ZXMgZnJvbSB0aGUgbGFzdCBnb29kCisgICAgIGZyYW1lLiBBcyBzb29uIGFzIGdvb2QgZnJhbWVzIGFyZSBhdmFpbGFibGUsIGNvbmNlYWxtYW50IGZhZGVzIGluIHRoZSBuZXcKKyAgc3BlY3RyYWwgZGF0YS4gRm9yIHRoaXMgbW9kZSB5b3UgaGF2ZSB0byBzZXQgdGhlICNDT05DRUFMX0lOVEVSIGRlZmluZS4gTm90ZQorICB0aGF0IGluIHRoaXMgY2FzZSwgeW91IGFsc28gbmVlZCB0byBzZXQgI1NCUl9CU19ERUxBWV9FTkFCTEUsIHdoaWNoIGJhc2ljYWxseQorICBhZGRzIGFwcHJvcmlhdGUgZGVsYXkgaW4gdGhlIFNCUiBkZWNvZGVyLiBOb3RlIHRoYXQgdGhlCisgIEludGVycG9sYXRpbmctQ29uY2VhbG1lbnQgaW5jcmVhc2VzIHRoZSBkZWxheSBvZiB5b3VyIGRlY29kZXIgYnkgb25lIGZyYW1lIGFuZAorICB0aGF0IGl0IGRvZXMgcmVxdWlyZSBhZGRpdGlvbmFsIHJlc291cmNlcyBzdWNoIGFzIG1lbW9yeSBhbmQgY29tcHV0YXRpb25hbAorICBjb21wbGV4aXR5LgogCiAgIDxoMj5Ib3cgY29uY2VhbG1lbnQgY2FuIGJlIHVzZWQgd2l0aCBlcnJvcnMgb24gdGhlIHRyYW5zcG9ydCBsYXllcjwvaDI+CiAKLSAgTWFueSBlcnJvcnMgY2FuIG9yIGhhdmUgdG8gYmUgZGV0ZWN0ZWQgb24gdGhlIHRyYW5zcG9ydCBsYXllci4gRm9yIGV4YW1wbGUgaW4gSVAgYmFzZWQgc3lzdGVtcwotICBwYWNrZXQgbG9zcyBjYW4gb2NjdXIuIFRoZSB0cmFuc3BvcnQgcHJvdG9jb2wgdXNlZCBzaG91bGQgaW5kaWNhdGUgc3VjaCBwYWNrZXQgbG9zcyBieSBpbnNlcnRpbmcKLSAgYW4gZW1wdHkgZnJhbWUgd2l0aCBmcmFtZU9LPTAuCisgIE1hbnkgZXJyb3JzIGNhbiBvciBoYXZlIHRvIGJlIGRldGVjdGVkIG9uIHRoZSB0cmFuc3BvcnQgbGF5ZXIuIEZvciBleGFtcGxlIGluCisgIElQIGJhc2VkIHN5c3RlbXMgcGFja2V0IGxvc3MgY2FuIG9jY3VyLiBUaGUgdHJhbnNwb3J0IHByb3RvY29sIHVzZWQgc2hvdWxkCisgIGluZGljYXRlIHN1Y2ggcGFja2V0IGxvc3MgYnkgaW5zZXJ0aW5nIGFuIGVtcHR5IGZyYW1lIHdpdGggZnJhbWVPSz0wLgogKi8KIAogI2luY2x1ZGUgImNvbmNlYWwuaCIKQEAgLTEzMywxNzEgKzE0OSwxNTMgQEAKICNpbmNsdWRlICJhYWNfcm9tLmgiCiAjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKIAotCiAvKiBQTlMgKG9mIGJsb2NrKSAqLwogI2luY2x1ZGUgImFhY2RlY19wbnMuaCIKICNpbmNsdWRlICJibG9jay5oIgogCi0jaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgorI2RlZmluZSBDT05DRUFMX0RGTFRfQ09NRl9OT0lTRV9MRVZFTCAoMHgxMDAwMDApCiAKLSNkZWZpbmUgQ09OQ0VBTF9ERkxUX0NPTUZfTk9JU0VfTEVWRUwgICAgICggNDYgKSAgLyogfj0gLTcwIGRCICovCi0KKyNkZWZpbmUgQ09OQ0VBTF9OT1RfREVGSU5FRCAoKFVDSEFSKS0xKQogCiAvKiBkZWZhdWx0IHNldHRpbmdzICovCi0jZGVmaW5lIENPTkNFQUxfREZMVF9GQURFT1VUX0ZSQU1FUyAgICAgICAoIDUgKQotI2RlZmluZSBDT05DRUFMX0RGTFRfRkFERUlOX0ZSQU1FUyAgICAgICAgKCA1ICkKLSNkZWZpbmUgQ09OQ0VBTF9ERkxUX01VVEVfUkVMRUFTRV9GUkFNRVMgICggMyApCisjZGVmaW5lIENPTkNFQUxfREZMVF9GQURFT1VUX0ZSQU1FUyAoNikKKyNkZWZpbmUgQ09OQ0VBTF9ERkxUX0ZBREVJTl9GUkFNRVMgKDUpCisjZGVmaW5lIENPTkNFQUxfREZMVF9NVVRFX1JFTEVBU0VfRlJBTUVTICgwKQogCi0jZGVmaW5lIENPTkNFQUxfREZMVF9GQURFX0ZBQ1RPUiAgICAgICAgICAoIDAuNzA3MTA2NzgxMTg2NTQ4ZiApICAgLyogMS9zcXJ0KDIpICovCisjZGVmaW5lIENPTkNFQUxfREZMVF9GQURFX0ZBQ1RPUiAoMC43MDcxMDY3ODExODY1NDhmKSAvKiAxL3NxcnQoMikgKi8KIAogLyogc29tZSBvZnRlbiB1c2VkIGNvbnN0YW50czogKi8KLSNkZWZpbmUgRklYUF9aRVJPICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjBmKQotI2RlZmluZSBGSVhQX09ORSAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEuMGYpCi0jZGVmaW5lIEZJWFBfRkxfQ09SUkVDVElPTiAgRkwyRlhDT05TVF9EQkwoMC41MzMzMzMzMzMzMzMzMzMzM2YpCisjZGVmaW5lIEZJWFBfWkVSTyBGTDJGWENPTlNUX0RCTCgwLjBmKQorI2RlZmluZSBGSVhQX09ORSBGTDJGWENPTlNUX0RCTCgxLjBmKQorI2RlZmluZSBGSVhQX0ZMX0NPUlJFQ1RJT04gRkwyRlhDT05TVF9EQkwoMC41MzMzMzMzMzMzMzMzMzMzM2YpCiAKIC8qIEZvciBwYXJhbWV0ZXIgY29udmVyc2lvbiAqLwotI2RlZmluZSBDT05DRUFMX1BBUkFNRVRFUl9CSVRTICAgICAgICAgICAgICAoIDggKQotI2RlZmluZSBDT05DRUFMX01BWF9RVUFOVF9GQUNUT1IgICAgICAgICAgICAoICgxPDxDT05DRUFMX1BBUkFNRVRFUl9CSVRTKS0xICkKLS8qI2RlZmluZSBDT05DRUFMX01JTl9BVFRFTlVBVElPTl9GQUNUT1JfMDI1ICAoIEZMMkZYQ09OU1RfREJMKDAuOTcxNjI3OTUxNTc3MTA2MTc0KSApKi8gIC8qIC0wLjI1IGRCICovCi0jZGVmaW5lIENPTkNFQUxfTUlOX0FUVEVOVUFUSU9OX0ZBQ1RPUl8wMjVfTEQgIEZMMkZYQ09OU1RfREJMKC0wLjA0MTUyNDEwMTE4NjA5MjAyOTU5Njg1MzQ0NTIxMjI5OSkKLS8qI2RlZmluZSBDT05DRUFMX01JTl9BVFRFTlVBVElPTl9GQUNUT1JfMDUwICAoIEZMMkZYQ09OU1RfREJMKDAuOTQ0MDYwODc2Mjg1OTIzMzgwKSApKi8gIC8qIC0wLjUwIGRCICovCi0jZGVmaW5lIENPTkNFQUxfTUlOX0FUVEVOVUFUSU9OX0ZBQ1RPUl8wNTBfTEQgRkwyRlhDT05TVF9EQkwoLTAuMDgzMDQ4MjAyMzcyMTg0MDU5MjUzNTk3MDA4MTQ1MjkzKQorI2RlZmluZSBDT05DRUFMX1BBUkFNRVRFUl9CSVRTICg4KQorI2RlZmluZSBDT05DRUFMX01BWF9RVUFOVF9GQUNUT1IgKCgxIDw8IENPTkNFQUxfUEFSQU1FVEVSX0JJVFMpIC0gMSkKKy8qI2RlZmluZSBDT05DRUFMX01JTl9BVFRFTlVBVElPTl9GQUNUT1JfMDI1ICAoIEZMMkZYQ09OU1RfREJMKDAuOTcxNjI3OTUxNTc3MTA2MTc0KSApKi8gLyogLTAuMjUgZEIgKi8KKyNkZWZpbmUgQ09OQ0VBTF9NSU5fQVRURU5VQVRJT05fRkFDVE9SXzAyNV9MRCBcCisgIEZMMkZYQ09OU1RfREJMKC0wLjA0MTUyNDEwMTE4NjA5MjAyOTU5Njg1MzQ0NTIxMjI5OSkKKy8qI2RlZmluZSBDT05DRUFMX01JTl9BVFRFTlVBVElPTl9GQUNUT1JfMDUwICAoIEZMMkZYQ09OU1RfREJMKDAuOTQ0MDYwODc2Mjg1OTIzMzgwKSApKi8gLyogLTAuNTAgZEIgKi8KKyNkZWZpbmUgQ09OQ0VBTF9NSU5fQVRURU5VQVRJT05fRkFDVE9SXzA1MF9MRCBcCisgIEZMMkZYQ09OU1RfREJMKC0wLjA4MzA0ODIwMjM3MjE4NDA1OTI1MzU5NzAwODE0NTI5MykKIAogdHlwZWRlZiBlbnVtIHsKICAgQ0NvbmNlYWxtZW50X05vRXhwYW5kLAogICBDQ29uY2VhbG1lbnRfRXhwYW5kLAogICBDQ29uY2VhbG1lbnRfQ29tcHJlc3MKLX0KLUNDb25jZWFsbWVudEV4cGFuZFR5cGU7Cit9IENDb25jZWFsbWVudEV4cGFuZFR5cGU7CiAKIHN0YXRpYyBjb25zdCBGSVhQX1NHTCBmYWNNb2Q0VGFibGVbNF0gPSB7Ci0gIEZMMkZYQ09OU1RfU0dMKDAuNTAwMDAwMDAwZiksICAgLyogRklYUF9TR0woMHg0MDAwKSwgIDJeLSgxLTAsMDApICovCi0gIEZMMkZYQ09OU1RfU0dMKDAuNTk0NjAzNTU4ZiksICAgLyogRklYUF9TR0woMHg0YzFiKSwgIDJeLSgxLTAsMjUpICovCi0gIEZMMkZYQ09OU1RfU0dMKDAuNzA3MTA2NzgxZiksICAgLyogRklYUF9TR0woMHg1YTgyKSwgIDJeLSgxLTAsNTApICovCi0gIEZMMkZYQ09OU1RfU0dMKDAuODQwODk2NDE1ZikgICAgLyogRklYUF9TR0woMHg2YmEyKSAgIDJeLSgxLTAsNzUpICovCisgICAgRkwyRlhDT05TVF9TR0woMC41MDAwMDAwMDBmKSwgLyogRklYUF9TR0woMHg0MDAwKSwgIDJeLSgxLTAsMDApICovCisgICAgRkwyRlhDT05TVF9TR0woMC41OTQ2MDM1NThmKSwgLyogRklYUF9TR0woMHg0YzFiKSwgIDJeLSgxLTAsMjUpICovCisgICAgRkwyRlhDT05TVF9TR0woMC43MDcxMDY3ODFmKSwgLyogRklYUF9TR0woMHg1YTgyKSwgIDJeLSgxLTAsNTApICovCisgICAgRkwyRlhDT05TVF9TR0woMC44NDA4OTY0MTVmKSAgLyogRklYUF9TR0woMHg2YmEyKSAgIDJeLSgxLTAsNzUpICovCiB9OwogCitzdGF0aWMgdm9pZCBDQ29uY2VhbG1lbnRfQ2FsY0JhbmRFbmVyZ3koCisgICAgRklYUF9EQkwgKnNwZWN0cnVtLCBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKKyAgICBjb25zdCBpbnQgYmxvY2tUeXBlLCBDQ29uY2VhbG1lbnRFeHBhbmRUeXBlIGV4LCBpbnQgKnNmYkVuZXJneSk7CiAKK3N0YXRpYyB2b2lkIENDb25jZWFsbWVudF9JbnRlcnBvbGF0ZUJ1ZmZlcihGSVhQX0RCTCAqc3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnBTcGVjU2NhbGVQcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpwU3BlY1NjYWxlQWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpwU3BlY1NjYWxlT3V0LCBpbnQgKmVuUHJ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZW5BY3QsIGludCBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgKnBTZmJPZmZzZXQpOwogCi0KLXN0YXRpYyB2b2lkCi0gIENDb25jZWFsbWVudF9DYWxjQmFuZEVuZXJneSAoCi0gICAgRklYUF9EQkwgICAgICAgICAgICAgICAqc3BlY3RydW0sCi0gICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgY29uc3QgaW50ICAgICAgICAgICAgICAgYmxvY2tUeXBlLAotICAgIENDb25jZWFsbWVudEV4cGFuZFR5cGUgIGV4LAotICAgIGludCAgICAgICAgICAgICAgICAgICAgKnNmYkVuZXJneQotICApOwotCi1zdGF0aWMgdm9pZAotICBDQ29uY2VhbG1lbnRfSW50ZXJwb2xhdGVCdWZmZXIgKAotICAgIEZJWFBfREJMICAgICpzcGVjdHJ1bSwKLSAgICBTSE9SVCAgICAgICAqcFNwZWNTY2FsZVByZXYsCi0gICAgU0hPUlQgICAgICAgKnBTcGVjU2NhbGVBY3QsCi0gICAgU0hPUlQgICAgICAgKnBTcGVjU2NhbGVPdXQsCi0gICAgaW50ICAgICAgICAgKmVuUHJ2LAotICAgIGludCAgICAgICAgICplbkFjdCwKLSAgICBpbnQgICAgICAgICAgc2ZiQ250LAotICAgIGNvbnN0IFNIT1JUICpwU2ZiT2Zmc2V0Ci0gICk7Ci0KLXN0YXRpYyBpbnQKLSAgQ0NvbmNlYWxtZW50X0FwcGx5SW50ZXIgKAotICAgIENDb25jZWFsbWVudEluZm8gICAgICAgKnBDb25jZWFsbWVudEluZm8sCitzdGF0aWMgaW50IENDb25jZWFsbWVudF9BcHBseUludGVyKAorICAgIENDb25jZWFsbWVudEluZm8gKnBDb25jZWFsbWVudEluZm8sCiAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKLSAgICBjb25zdCBpbnQgIHNhbXBsZXNQZXJGcmFtZSwKLSAgICBjb25zdCBpbnQgIGltcHJvdmVUb25hbCwKLSAgICBjb25zdCBpbnQgIGZyYW1lT2sKLSAgKTsKKyAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywgY29uc3QgaW50IHNhbXBsZXNQZXJGcmFtZSwKKyAgICBjb25zdCBpbnQgaW1wcm92ZVRvbmFsLCBjb25zdCBpbnQgZnJhbWVPaywgY29uc3QgaW50IG11dGVfcmVsZWFzZV9hY3RpdmUpOwogCi0KLQotc3RhdGljIGludAotICBDQ29uY2VhbG1lbnRfQXBwbHlOb2lzZSAoCitzdGF0aWMgaW50IENDb25jZWFsbWVudF9BcHBseU5vaXNlKAogICAgIENDb25jZWFsbWVudEluZm8gKnBDb25jZWFsbWVudEluZm8sCiAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAotICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAotICAgIGNvbnN0IGludCAgICBzYW1wbGVzUGVyRnJhbWUsCi0gICAgY29uc3QgVUlOVCBmbGFncwotICApOworICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLCBjb25zdCBpbnQgc2FtcGxlc1BlckZyYW1lLAorICAgIGNvbnN0IFVJTlQgZmxhZ3MpOwogCi1zdGF0aWMgdm9pZAotICBDQ29uY2VhbG1lbnRfVXBkYXRlU3RhdGUgKAotICAgIENDb25jZWFsbWVudEluZm8gKnBDb25jZWFsbWVudEluZm8sCi0gICAgaW50IGZyYW1lT2sKLSAgKTsKK3N0YXRpYyB2b2lkIENDb25jZWFsbWVudF9VcGRhdGVTdGF0ZSgKKyAgICBDQ29uY2VhbG1lbnRJbmZvICpwQ29uY2VhbG1lbnRJbmZvLCBpbnQgZnJhbWVPaywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgIGNvbnN0IGludCBzYW1wbGVzUGVyRnJhbWUsIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pOwogCi1zdGF0aWMgdm9pZAotICBDQ29uY2VhbG1lbnRfQXBwbHlSYW5kb21TaWduICgKLSAgICBpbnQgICAgICAgIGlSYW5kb21QaGFzZSwKLSAgICBGSVhQX0RCTCAgKnNwZWMsCi0gICAgaW50ICAgICAgICBzYW1wbGVzUGVyRnJhbWUKLSAgKTsKK3N0YXRpYyB2b2lkIENDb25jZWFsbWVudF9BcHBseVJhbmRvbVNpZ24oaW50IGlSYW5kb21QaGFzZSwgRklYUF9EQkwgKnNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVzUGVyRnJhbWUpOwogCisvKiBUaW1lRG9tYWluRmFkaW5nICovCitzdGF0aWMgdm9pZCBDQ29uY2VhbG1lbnRfVERGYWRlUGNtQXR0KGludCBzdGFydCwgaW50IGxlbiwgRklYUF9EQkwgZmFkZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBmYWRlU3RvcCwgRklYUF9QQ00gKnBjbWRhdGEpOworc3RhdGljIHZvaWQgQ0NvbmNlYWxtZW50X1RERmFkZUZpbGxGYWRpbmdTdGF0aW9ucyhGSVhQX0RCTCAqZmFkaW5nU3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZmFkaW5nU3RlcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGZhZGVTdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBmYWRlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFREZmFkaW5nVHlwZSBmYWRpbmdUeXBlKTsKK3N0YXRpYyB2b2lkIENDb25jZWFsbWVudF9UREZhZGluZ19kb0xpbmVhckZhZGluZ1N0ZXBzKGludCAqZmFkaW5nU3RlcHMpOwogCi1zdGF0aWMgaW50IENDb25jZWFsbWVudF9HZXRXaW5TZXEoaW50IHByZXZXaW5TZXEpCi17Ci0gIGludCBuZXdXaW5TZXEgPSBPbmx5TG9uZ1NlcXVlbmNlOworLyogU3RyZWFtbGluZSB0aGUgc3RhdGUgbWFjaGluZSAqLworc3RhdGljIGludCBDQ29uY2VhbG1lbnRfQXBwbHlGYWRlT3V0KAorICAgIGludCBtb2RlLCBDQ29uY2VhbG1lbnRJbmZvICpwQ29uY2VhbG1lbnRJbmZvLAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgY29uc3QgaW50IHNhbXBsZXNQZXJGcmFtZSwgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbyk7CisKK3N0YXRpYyBpbnQgQ0NvbmNlYWxtZW50X1RETm9pc2VfUmFuZG9tKFVMT05HICpzZWVkKTsKK3N0YXRpYyB2b2lkIENDb25jZWFsbWVudF9URE5vaXNlX0FwcGx5KENDb25jZWFsbWVudEluZm8gKmNvbnN0IHBDb25jZWFsbWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGVuLCBGSVhQX1BDTSAqY29uc3QgcGNtZGF0YSk7CisKK3N0YXRpYyBCTE9DS19UWVBFIENDb25jZWFsbWVudF9HZXRXaW5TZXEoaW50IHByZXZXaW5TZXEpIHsKKyAgQkxPQ0tfVFlQRSBuZXdXaW5TZXEgPSBCTE9DS19MT05HOwogCiAgIC8qIFRyeSB0byBoYXZlIG9ubHkgbG9uZyBibG9ja3MgKi8KLSAgaWYgKCBwcmV2V2luU2VxID09IExvbmdTdGFydFNlcXVlbmNlCi0gICAgfHwgcHJldldpblNlcSA9PSBFaWdodFNob3J0U2VxdWVuY2UgKQotICB7Ci0gICAgbmV3V2luU2VxID0gTG9uZ1N0b3BTZXF1ZW5jZTsKKyAgaWYgKHByZXZXaW5TZXEgPT0gQkxPQ0tfU1RBUlQgfHwgcHJldldpblNlcSA9PSBCTE9DS19TSE9SVCkgeworICAgIG5ld1dpblNlcSA9IEJMT0NLX1NUT1A7CiAgIH0KIAogICByZXR1cm4gKG5ld1dpblNlcSk7CiB9CiAKLQogLyohCiAgIFxicmllZiBJbml0IGNvbW1vbiBjb25jZWFsbWVudCBpbmZvcm1hdGlvbiBkYXRhCiAKLSAgXHBDb25jZWFsQ29tbW9uRGF0YSBQb2ludGVyIHRvIHRoZSBjb25jZWFsbWVudCBjb21tb24gZGF0YSBzdHJ1Y3R1cmUuCi0KLSAgXHJldHVybiAgbm9uZQorICBccGFyYW0gcENvbmNlYWxDb21tb25EYXRhIFBvaW50ZXIgdG8gdGhlIGNvbmNlYWxtZW50IGNvbW1vbiBkYXRhIHN0cnVjdHVyZS4KICovCi12b2lkCi0gIENDb25jZWFsbWVudF9Jbml0Q29tbW9uRGF0YSAoQ0NvbmNlYWxQYXJhbXMgKnBDb25jZWFsQ29tbW9uRGF0YSkKLXsKLSAgaWYgKHBDb25jZWFsQ29tbW9uRGF0YSAhPSBOVUxMKQotICB7Cit2b2lkIENDb25jZWFsbWVudF9Jbml0Q29tbW9uRGF0YShDQ29uY2VhbFBhcmFtcyAqcENvbmNlYWxDb21tb25EYXRhKSB7CisgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEgIT0gTlVMTCkgewogICAgIGludCBpOwogCiAgICAgLyogU2V0IGRlZmF1bHQgZXJyb3IgY29uY2VhbG1lbnQgdGVjaG5pcXVlICovCiAgICAgcENvbmNlYWxDb21tb25EYXRhLT5tZXRob2QgPSBDb25jZWFsTWV0aG9kSW50ZXI7CiAKLSAgICBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMgICAgID0gQ09OQ0VBTF9ERkxUX0ZBREVPVVRfRlJBTUVTOwotICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZUluRnJhbWVzICAgICAgPSBDT05DRUFMX0RGTFRfRkFERUlOX0ZSQU1FUzsKKyAgICBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMgPSBDT05DRUFMX0RGTFRfRkFERU9VVF9GUkFNRVM7CisgICAgcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlSW5GcmFtZXMgPSBDT05DRUFMX0RGTFRfRkFERUlOX0ZSQU1FUzsKICAgICBwQ29uY2VhbENvbW1vbkRhdGEtPm51bU11dGVSZWxlYXNlRnJhbWVzID0gQ09OQ0VBTF9ERkxUX01VVEVfUkVMRUFTRV9GUkFNRVM7CiAKLSAgICBwQ29uY2VhbENvbW1vbkRhdGEtPmNvbWZvcnROb2lzZUxldmVsICAgID0gQ09OQ0VBTF9ERkxUX0NPTUZfTk9JU0VfTEVWRUw7CisgICAgcENvbmNlYWxDb21tb25EYXRhLT5jb21mb3J0Tm9pc2VMZXZlbCA9CisgICAgICAgIChGSVhQX0RCTClDT05DRUFMX0RGTFRfQ09NRl9OT0lTRV9MRVZFTDsKIAogICAgIC8qIEluaXQgZmFkZSBmYWN0b3JzIChzeW1ldHJpYykgKi8KLSAgICBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbMF0gPSBGTDJGWENPTlNUX1NHTCggQ09OQ0VBTF9ERkxUX0ZBREVfRkFDVE9SICk7Ci0gICAgcENvbmNlYWxDb21tb25EYXRhLT5mYWRlSW5GYWN0b3JbMF0gID0gcENvbmNlYWxDb21tb25EYXRhLT5mYWRlT3V0RmFjdG9yWzBdOworICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZU91dEZhY3RvclswXSA9CisgICAgICAgIEZMMkZYQ09OU1RfU0dMKENPTkNFQUxfREZMVF9GQURFX0ZBQ1RPUik7CisgICAgcENvbmNlYWxDb21tb25EYXRhLT5mYWRlSW5GYWN0b3JbMF0gPSBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbMF07CiAKICAgICBmb3IgKGkgPSAxOyBpIDwgQ09OQ0VBTF9NQVhfTlVNX0ZBREVfRkFDVE9SUzsgaSsrKSB7Ci0gICAgICBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbaV0gPSBGWF9EQkwyRlhfU0dMKGZNdWx0KHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZU91dEZhY3RvcltpLTFdLEZMMkZYQ09OU1RfU0dMKENPTkNFQUxfREZMVF9GQURFX0ZBQ1RPUikpKTsKLSAgICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZUluRmFjdG9yW2ldICA9IHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZU91dEZhY3RvcltpXTsKKyAgICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZU91dEZhY3RvcltpXSA9CisgICAgICAgICAgRlhfREJMMkZYX1NHTChmTXVsdChwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbaSAtIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9TR0woQ09OQ0VBTF9ERkxUX0ZBREVfRkFDVE9SKSkpOworICAgICAgcENvbmNlYWxDb21tb25EYXRhLT5mYWRlSW5GYWN0b3JbaV0gPQorICAgICAgICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZU91dEZhY3RvcltpXTsKICAgICB9CiAgIH0KIH0KIAotCi0KIC8qIQogICBcYnJpZWYgR2V0IGN1cnJlbnQgY29uY2VhbG1lbnQgbWV0aG9kLgogCi0gIFxwQ29uY2VhbENvbW1vbkRhdGEgUG9pbnRlciB0byBjb21tb24gY29uY2VhbG1lbnQgZGF0YSAoZm9yIGFsbCBjaGFubmVscykKLQotICBccmV0dXJuIENvbmNlYWxtZW50IG1ldGhvZC4KKyAgXHBhcmFtIHBDb25jZWFsQ29tbW9uRGF0YSBQb2ludGVyIHRvIGNvbW1vbiBjb25jZWFsbWVudCBkYXRhIChmb3IgYWxsCisgIGNoYW5uZWxzKQogKi8KLUNDb25jZWFsbWVudE1ldGhvZAotICBDQ29uY2VhbG1lbnRfR2V0TWV0aG9kKCBDQ29uY2VhbFBhcmFtcyAqcENvbmNlYWxDb21tb25EYXRhICkKLXsKK0NDb25jZWFsbWVudE1ldGhvZCBDQ29uY2VhbG1lbnRfR2V0TWV0aG9kKENDb25jZWFsUGFyYW1zICpwQ29uY2VhbENvbW1vbkRhdGEpIHsKICAgQ0NvbmNlYWxtZW50TWV0aG9kIG1ldGhvZCA9IENvbmNlYWxNZXRob2ROb25lOwogCiAgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEgIT0gTlVMTCkgewpAQCAtMzA3LDk1ICszMDUsOTUgQEAKICAgcmV0dXJuIChtZXRob2QpOwogfQogCi0KIC8qIQogICBcYnJpZWYgSW5pdCBjb25jZWFsbWVudCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBjaGFubmVsCiAKLSAgVGhlIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBjb25jZWFsbWVudCBpbmZvcm1hdGlvbi4gVHdvIG1ldGhvZHMgY2FuIGJlIGNob3NlbjoKLSAgICAgICAgICAgICAwID0gaW50ZXJwb2xhdGlvbiBtZXRob2QgKGFkZHMgZGVsYXkpCi0gICAgICAgICAgICAgMSA9IG5vaXNlIHN1YnN0aXR1dGlvbiAobm8gZGVsYXksIGxvdyBjb21wbGV4aXR5KQotCi0gIFxyZXR1cm4gIG5vbmUKKyAgXHBhcmFtIHBDb25jZWFsQ2hhbm5lbEluZm8gUG9pbnRlciB0byB0aGUgY2hhbm5lbCByZWxhdGVkIGNvbmNlYWxtZW50IGluZm8KKyAgc3RydWN0dXJlIHRvIGJlIGluaXRpYWxpemVkLiBccGFyYW0gcENvbmNlYWxDb21tb25EYXRhICBQb2ludGVyIHRvIGNvbW1vbgorICBjb25jZWFsbWVudCBkYXRhIChmb3IgYWxsIGNoYW5uZWxzKSBccGFyYW0gaW5pdFJlbmRlck1vZGUgICAgICBJbml0aWFsIHJlbmRlcgorICBtb2RlIHRvIGJlIHNldCBmb3IgdGhlIGN1cnJlbnQgY2hhbm5lbC4gXHBhcmFtIHNhbXBsZXNQZXJGcmFtZSAgICAgVGhlIG51bWJlcgorICBvZiBzYW1wbGVzIHBlciBmcmFtZS4KICovCi12b2lkCi0gIENDb25jZWFsbWVudF9Jbml0Q2hhbm5lbERhdGEgKAotICAgIENDb25jZWFsbWVudEluZm8gKnBDb25jZWFsQ2hhbm5lbEluZm8sCi0gICAgQ0NvbmNlYWxQYXJhbXMgICAqcENvbmNlYWxDb21tb25EYXRhLAotICAgIGludCBzYW1wbGVzUGVyRnJhbWUgKQotewordm9pZCBDQ29uY2VhbG1lbnRfSW5pdENoYW5uZWxEYXRhKENDb25jZWFsbWVudEluZm8gKnBDb25jZWFsQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NvbmNlYWxQYXJhbXMgKnBDb25jZWFsQ29tbW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNERUNfUkVOREVSX01PREUgaW5pdFJlbmRlck1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZXNQZXJGcmFtZSkgewogICBpbnQgaTsKKyAgcENvbmNlYWxDaGFubmVsSW5mby0+VEROb2lzZVNlZWQgPSAwOworICBGREttZW1jbGVhcihwQ29uY2VhbENoYW5uZWxJbmZvLT5URE5vaXNlU3RhdGVzLAorICAgICAgICAgICAgICBzaXplb2YocENvbmNlYWxDaGFubmVsSW5mby0+VEROb2lzZVN0YXRlcykpOworICBwQ29uY2VhbENoYW5uZWxJbmZvLT5URE5vaXNlQ29lZlswXSA9IEZMMkZYQ09OU1RfU0dMKDAuMDVmKTsKKyAgcENvbmNlYWxDaGFubmVsSW5mby0+VEROb2lzZUNvZWZbMV0gPSBGTDJGWENPTlNUX1NHTCgwLjVmKTsKKyAgcENvbmNlYWxDaGFubmVsSW5mby0+VEROb2lzZUNvZWZbMl0gPSBGTDJGWENPTlNUX1NHTCgwLjQ1Zik7CiAKICAgcENvbmNlYWxDaGFubmVsSW5mby0+cENvbmNlYWxQYXJhbXMgPSBwQ29uY2VhbENvbW1vbkRhdGE7CiAKLSAgRkRLbWVtY2xlYXIocENvbmNlYWxDaGFubmVsSW5mby0+c3BlY3RyYWxDb2VmZmljaWVudCwgMTAyNCAqIHNpemVvZihGSVhQX0NOQ0wpKTsKKyAgcENvbmNlYWxDaGFubmVsSW5mby0+bGFzdFJlbmRlck1vZGUgPSBpbml0UmVuZGVyTW9kZTsKKworICBwQ29uY2VhbENoYW5uZWxJbmZvLT53aW5kb3dTaGFwZSA9IENPTkNFQUxfTk9UX0RFRklORUQ7CisgIHBDb25jZWFsQ2hhbm5lbEluZm8tPndpbmRvd1NlcXVlbmNlID0gQkxPQ0tfTE9ORzsgLyogZGVmYXVsdCB0eXBlICovCisgIHBDb25jZWFsQ2hhbm5lbEluZm8tPmxhc3RXaW5HcnBMZW4gPSAxOworCisgIHBDb25jZWFsQ2hhbm5lbEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9PazsKKworICBGREttZW1jbGVhcihwQ29uY2VhbENoYW5uZWxJbmZvLT5zcGVjdHJhbENvZWZmaWNpZW50LAorICAgICAgICAgICAgICAxMDI0ICogc2l6ZW9mKEZJWFBfQ05DTCkpOwogCiAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICBwQ29uY2VhbENoYW5uZWxJbmZvLT5zcGVjU2NhbGVbaV0gPSAwOwogICB9CiAKLSAgcENvbmNlYWxDaGFubmVsSW5mby0+aVJhbmRvbVBoYXNlICAgPSAwOwotCi0gIHBDb25jZWFsQ2hhbm5lbEluZm8tPndpbmRvd1NlcXVlbmNlID0gMDsKLSAgcENvbmNlYWxDaGFubmVsSW5mby0+d2luZG93U2hhcGUgICAgPSAwOworICBwQ29uY2VhbENoYW5uZWxJbmZvLT5pUmFuZG9tUGhhc2UgPSAwOwogCiAgIHBDb25jZWFsQ2hhbm5lbEluZm8tPnByZXZGcmFtZU9rWzBdID0gMTsKICAgcENvbmNlYWxDaGFubmVsSW5mby0+cHJldkZyYW1lT2tbMV0gPSAxOwogCi0gIHBDb25jZWFsQ2hhbm5lbEluZm8tPmNudEZhZGVGcmFtZXMgID0gMDsKKyAgcENvbmNlYWxDaGFubmVsSW5mby0+Y250RmFkZUZyYW1lcyA9IDA7CiAgIHBDb25jZWFsQ2hhbm5lbEluZm8tPmNudFZhbGlkRnJhbWVzID0gMDsKLQotICBwQ29uY2VhbENoYW5uZWxJbmZvLT5jb25jZWFsU3RhdGUgICA9IENvbmNlYWxTdGF0ZV9PazsKLQorICBwQ29uY2VhbENoYW5uZWxJbmZvLT5mYWRlX29sZCA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICBwQ29uY2VhbENoYW5uZWxJbmZvLT53aW5HcnBPZmZzZXRbMF0gPSAwOworICBwQ29uY2VhbENoYW5uZWxJbmZvLT53aW5HcnBPZmZzZXRbMV0gPSAwOworICBwQ29uY2VhbENoYW5uZWxJbmZvLT5hdHRHcnBPZmZzZXRbMF0gPSAwOworICBwQ29uY2VhbENoYW5uZWxJbmZvLT5hdHRHcnBPZmZzZXRbMV0gPSAwOwogfQogCi0KIC8qIQogICBcYnJpZWYgU2V0IGVycm9yIGNvbmNlYWxtZW50IHBhcmFtZXRlcnMKIAotICBcY29uY2VhbFBhcmFtcwotICBcbWV0aG9kCi0gIFxmYWRlT3V0U2xvcGUKLSAgXGZhZGVJblNsb3BlCi0gIFxtdXRlUmVsZWFzZQotICBcY29tZk5vaXNlTGV2ZWwKLQotICBccmV0dXJuICBub25lCisgIFxwYXJhbSBjb25jZWFsUGFyYW1zCisgIFxwYXJhbSBtZXRob2QKKyAgXHBhcmFtIGZhZGVPdXRTbG9wZQorICBccGFyYW0gZmFkZUluU2xvcGUKKyAgXHBhcmFtIG11dGVSZWxlYXNlCisgIFxwYXJhbSBjb21mTm9pc2VMZXZlbAogKi8KIEFBQ19ERUNPREVSX0VSUk9SCi0gIENDb25jZWFsbWVudF9TZXRQYXJhbXMgKAotICAgIENDb25jZWFsUGFyYW1zICpjb25jZWFsUGFyYW1zLAotICAgIGludCAgbWV0aG9kLAotICAgIGludCAgZmFkZU91dFNsb3BlLAotICAgIGludCAgZmFkZUluU2xvcGUsCi0gICAgaW50ICBtdXRlUmVsZWFzZSwKLSAgICBpbnQgIGNvbWZOb2lzZUxldmVsICkKLXsKK0NDb25jZWFsbWVudF9TZXRQYXJhbXMoQ0NvbmNlYWxQYXJhbXMgKmNvbmNlYWxQYXJhbXMsIGludCBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBmYWRlT3V0U2xvcGUsIGludCBmYWRlSW5TbG9wZSwgaW50IG11dGVSZWxlYXNlLAorICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBjb21mTm9pc2VMZXZlbCkgewogICAvKiBzZXQgY29uY2VhbG1lbnQgdGVjaG5pcXVlICovCiAgIGlmIChtZXRob2QgIT0gQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCkgewotICAgIHN3aXRjaCAoKENDb25jZWFsbWVudE1ldGhvZCltZXRob2QpCi0gICAgewotICAgIGNhc2UgQ29uY2VhbE1ldGhvZE11dGU6Ci0gICAgY2FzZSBDb25jZWFsTWV0aG9kTm9pc2U6Ci0gICAgY2FzZSBDb25jZWFsTWV0aG9kSW50ZXI6Ci0gICAgICAvKiBCZSBzdXJlIHRvIGVuYWJsZSBkZWxheSBhZGp1c3RtZW50IG9mIFNCUiBkZWNvZGVyISAqLwotICAgICAgaWYgKGNvbmNlYWxQYXJhbXMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIHNldCBwYXJhbSAqLwotICAgICAgICBjb25jZWFsUGFyYW1zLT5tZXRob2QgPSAoQ0NvbmNlYWxtZW50TWV0aG9kKW1ldGhvZDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOworICAgIHN3aXRjaCAoKENDb25jZWFsbWVudE1ldGhvZCltZXRob2QpIHsKKyAgICAgIGNhc2UgQ29uY2VhbE1ldGhvZE11dGU6CisgICAgICBjYXNlIENvbmNlYWxNZXRob2ROb2lzZToKKyAgICAgIGNhc2UgQ29uY2VhbE1ldGhvZEludGVyOgorICAgICAgICAvKiBCZSBzdXJlIHRvIGVuYWJsZSBkZWxheSBhZGp1c3RtZW50IG9mIFNCUiBkZWNvZGVyISAqLworICAgICAgICBpZiAoY29uY2VhbFBhcmFtcyA9PSBOVUxMKSB7CisgICAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogc2V0IHBhcmFtICovCisgICAgICAgICAgY29uY2VhbFBhcmFtcy0+bWV0aG9kID0gKENDb25jZWFsbWVudE1ldGhvZCltZXRob2Q7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKICAgICB9CiAgIH0KIAogICAvKiBzZXQgbnVtYmVyIG9mIGZyYW1lcyBmb3IgZmFkZS1vdXQgc2xvcGUgKi8KICAgaWYgKGZhZGVPdXRTbG9wZSAhPSBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVEKSB7Ci0gICAgaWYgKCAoZmFkZU91dFNsb3BlIDwgQ09OQ0VBTF9NQVhfTlVNX0ZBREVfRkFDVE9SUykKLSAgICAgICYmIChmYWRlT3V0U2xvcGUgPj0gMCkgKQotICAgIHsKKyAgICBpZiAoKGZhZGVPdXRTbG9wZSA8IENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlMpICYmIChmYWRlT3V0U2xvcGUgPj0gMCkpIHsKICAgICAgIGlmIChjb25jZWFsUGFyYW1zID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CiAgICAgICB9IGVsc2UgewpAQCAtNDA5LDkgKzQwNyw3IEBACiAKICAgLyogc2V0IG51bWJlciBvZiBmcmFtZXMgZm9yIGZhZGUtaW4gc2xvcGUgKi8KICAgaWYgKGZhZGVJblNsb3BlICE9IEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQpIHsKLSAgICBpZiAoIChmYWRlSW5TbG9wZSA8IENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlMpCi0gICAgICAmJiAoZmFkZUluU2xvcGUgPj0gMSkgKQotICAgIHsKKyAgICBpZiAoKGZhZGVJblNsb3BlIDwgQ09OQ0VBTF9NQVhfTlVNX0ZBREVfRkFDVE9SUykgJiYgKGZhZGVJblNsb3BlID49IDApKSB7CiAgICAgICBpZiAoY29uY2VhbFBhcmFtcyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwogICAgICAgfSBlbHNlIHsKQEAgLTQyNSw5ICs0MjEsOCBAQAogCiAgIC8qIHNldCBudW1iZXIgb2YgZXJyb3ItZnJlZSBmcmFtZXMgYWZ0ZXIgd2hpY2ggdGhlIG11dGluZyB3aWxsIGJlIHJlbGVhc2VkICovCiAgIGlmIChtdXRlUmVsZWFzZSAhPSBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVEKSB7Ci0gICAgaWYgKCAobXV0ZVJlbGVhc2UgPCAoQ09OQ0VBTF9NQVhfTlVNX0ZBREVfRkFDVE9SUzw8MSkpCi0gICAgICAmJiAobXV0ZVJlbGVhc2UgPj0gMCkgKQotICAgIHsKKyAgICBpZiAoKG11dGVSZWxlYXNlIDwgKENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlMgPDwgMSkpICYmCisgICAgICAgIChtdXRlUmVsZWFzZSA+PSAwKSkgewogICAgICAgaWYgKGNvbmNlYWxQYXJhbXMgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKICAgICAgIH0gZWxzZSB7CkBAIC00NDAsNTAgKzQzNSw0NiBAQAogICB9CiAKICAgLyogc2V0IGNvbmZvcnQgbm9pc2UgbGV2ZWwgd2hpY2ggd2lsbCBiZSBpbnNlcnRlZCB3aGlsZSBpbiBzdGF0ZSAnbXV0aW5nJyAqLwotICBpZiAoY29tZk5vaXNlTGV2ZWwgIT0gQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCkgewotICAgIGlmICggKGNvbWZOb2lzZUxldmVsIDwgLTEpCi0gICAgICB8fCAoY29tZk5vaXNlTGV2ZWwgPiAxMjcpICkgeworICBpZiAoY29tZk5vaXNlTGV2ZWwgIT0gKEZJWFBfREJMKUFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQpIHsKKyAgICBpZiAoKGNvbWZOb2lzZUxldmVsIDwgKEZJWFBfREJMKTApIHx8CisgICAgICAgIChjb21mTm9pc2VMZXZlbCA+IChGSVhQX0RCTClNQVhWQUxfREJMKSkgewogICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CiAgICAgfQogICAgIGlmIChjb25jZWFsUGFyYW1zID09IE5VTEwpIHsKICAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwogICAgIH0gZWxzZSB7Ci0gICAgICBjb25jZWFsUGFyYW1zLT5jb21mb3J0Tm9pc2VMZXZlbCA9IGNvbWZOb2lzZUxldmVsOworICAgICAgY29uY2VhbFBhcmFtcy0+Y29tZm9ydE5vaXNlTGV2ZWwgPSAoRklYUF9EQkwpY29tZk5vaXNlTGV2ZWw7CiAgICAgfQogICB9CiAKICAgcmV0dXJuIChBQUNfREVDX09LKTsKIH0KIAotCiAvKiEKICAgXGJyaWVmIFNldCBmYWRlLW91dC9pbiBhdHRlbnVhdGlvbiBmYWN0b3IgdmVjdG9ycwogCi0gIFxjb25jZWFsUGFyYW1zCi0gIFxmYWRlT3V0QXR0ZW51YXRpb25WZWN0b3IKLSAgXGZhZGVJbkF0dGVudWF0aW9uVmVjdG9yCisgIFxwYXJhbSBjb25jZWFsUGFyYW1zCisgIFxwYXJhbSBmYWRlT3V0QXR0ZW51YXRpb25WZWN0b3IKKyAgXHBhcmFtIGZhZGVJbkF0dGVudWF0aW9uVmVjdG9yCiAKICAgXHJldHVybiAwIGlmIE9LIGFsbCBvdGhlciB2YWx1ZXMgaW5kaWNhdGUgZXJyb3JzCiAqLwogQUFDX0RFQ09ERVJfRVJST1IKLSAgQ0NvbmNlYWxtZW50X1NldEF0dGVudWF0aW9uICgKLSAgICBDQ29uY2VhbFBhcmFtcyAqY29uY2VhbFBhcmFtcywKLSAgICBTSE9SVCAqZmFkZU91dEF0dGVudWF0aW9uVmVjdG9yLAotICAgIFNIT1JUICpmYWRlSW5BdHRlbnVhdGlvblZlY3RvciApCi17Ci0gIGlmICggKGZhZGVPdXRBdHRlbnVhdGlvblZlY3RvciA9PSBOVUxMKQotICAgICYmIChmYWRlSW5BdHRlbnVhdGlvblZlY3RvciAgPT0gTlVMTCkgKSB7CitDQ29uY2VhbG1lbnRfU2V0QXR0ZW51YXRpb24oQ0NvbmNlYWxQYXJhbXMgKmNvbmNlYWxQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgKmZhZGVPdXRBdHRlbnVhdGlvblZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCAqZmFkZUluQXR0ZW51YXRpb25WZWN0b3IpIHsKKyAgaWYgKChmYWRlT3V0QXR0ZW51YXRpb25WZWN0b3IgPT0gTlVMTCkgJiYgKGZhZGVJbkF0dGVudWF0aW9uVmVjdG9yID09IE5VTEwpKSB7CiAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CiAgIH0KIAogICAvKiBGYWRlLW91dCBmYWN0b3JzICovCi0gIGlmIChmYWRlT3V0QXR0ZW51YXRpb25WZWN0b3IgIT0gTlVMTCkKLSAgeworICBpZiAoZmFkZU91dEF0dGVudWF0aW9uVmVjdG9yICE9IE5VTEwpIHsKICAgICBpbnQgaTsKIAogICAgIC8qIGNoZWNrIHF1YW50aXplZCBmYWN0b3JzIGZpcnN0ICovCiAgICAgZm9yIChpID0gMDsgaSA8IENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlM7IGkrKykgewotICAgICAgaWYgKChmYWRlT3V0QXR0ZW51YXRpb25WZWN0b3JbaV0gPCAwKSB8fCAoZmFkZU91dEF0dGVudWF0aW9uVmVjdG9yW2ldID4gQ09OQ0VBTF9NQVhfUVVBTlRfRkFDVE9SKSkgeworICAgICAgaWYgKChmYWRlT3V0QXR0ZW51YXRpb25WZWN0b3JbaV0gPCAwKSB8fAorICAgICAgICAgIChmYWRlT3V0QXR0ZW51YXRpb25WZWN0b3JbaV0gPiBDT05DRUFMX01BWF9RVUFOVF9GQUNUT1IpKSB7CiAgICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwogICAgICAgfQogICAgIH0KQEAgLTQ5MiwyNiArNDgzLDI0IEBACiAgICAgfQogCiAgICAgLyogbm93IGRlcXVhbnRpemUgZmFjdG9ycyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTOyBpKyspIAotICAgIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ09OQ0VBTF9NQVhfTlVNX0ZBREVfRkFDVE9SUzsgaSsrKSB7CiAgICAgICBjb25jZWFsUGFyYW1zLT5mYWRlT3V0RmFjdG9yW2ldID0KLSAgICAgICAgRlhfREJMMkZYX1NHTCggZkxkUG93KCAgICBDT05DRUFMX01JTl9BVFRFTlVBVElPTl9GQUNUT1JfMDI1X0xELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgoSU5UKShGTDJGWENPTlNUX0RCTCgxLjAvMi4wKT4+KENPTkNFQUxfUEFSQU1FVEVSX0JJVFMtMSkpICogKElOVClmYWRlT3V0QXR0ZW51YXRpb25WZWN0b3JbaV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTkNFQUxfUEFSQU1FVEVSX0JJVFMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgIEZYX0RCTDJGWF9TR0woZkxkUG93KENPTkNFQUxfTUlOX0FUVEVOVUFUSU9OX0ZBQ1RPUl8wMjVfTEQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgoSU5UKShGTDJGWENPTlNUX0RCTCgxLjAgLyAyLjApID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ09OQ0VBTF9QQVJBTUVURVJfQklUUyAtIDEpKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UKWZhZGVPdXRBdHRlbnVhdGlvblZlY3RvcltpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OQ0VBTF9QQVJBTUVURVJfQklUUykpOwogICAgIH0KICAgfQogCiAgIC8qIEZhZGUtaW4gZmFjdG9ycyAqLwotICBpZiAoZmFkZUluQXR0ZW51YXRpb25WZWN0b3IgIT0gTlVMTCkKLSAgeworICBpZiAoZmFkZUluQXR0ZW51YXRpb25WZWN0b3IgIT0gTlVMTCkgewogICAgIGludCBpOwogCiAgICAgLyogY2hlY2sgcXVhbnRpemVkIGZhY3RvcnMgZmlyc3QgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgQ09OQ0VBTF9NQVhfTlVNX0ZBREVfRkFDVE9SUzsgaSsrKSB7Ci0gICAgICBpZiAoKGZhZGVJbkF0dGVudWF0aW9uVmVjdG9yW2ldIDwgMCkgfHwgKGZhZGVJbkF0dGVudWF0aW9uVmVjdG9yW2ldID4gQ09OQ0VBTF9NQVhfUVVBTlRfRkFDVE9SKSkgeworICAgICAgaWYgKChmYWRlSW5BdHRlbnVhdGlvblZlY3RvcltpXSA8IDApIHx8CisgICAgICAgICAgKGZhZGVJbkF0dGVudWF0aW9uVmVjdG9yW2ldID4gQ09OQ0VBTF9NQVhfUVVBTlRfRkFDVE9SKSkgewogICAgICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKICAgICAgIH0KICAgICB9CkBAIC01MjAsMzQgKzUwOSwyNiBAQAogICAgIH0KIAogICAgIC8qIG5vdyBkZXF1YW50aXplIGZhY3RvcnMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgQ09OQ0VBTF9NQVhfTlVNX0ZBREVfRkFDVE9SUzsgaSsrKQotICAgIHsKLSAgICAgIGNvbmNlYWxQYXJhbXMtPmZhZGVJbkZhY3RvcltpXSA9Ci0gICAgICAgIEZYX0RCTDJGWF9TR0woIGZMZFBvdyggQ09OQ0VBTF9NSU5fQVRURU5VQVRJT05fRkFDVE9SXzAyNV9MRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKChJTlQpKEZJWFBfT05FPj5DT05DRUFMX1BBUkFNRVRFUl9CSVRTKSAqIChJTlQpZmFkZUluQXR0ZW51YXRpb25WZWN0b3JbaV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05DRUFMX1BBUkFNRVRFUl9CSVRTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAgICAgICk7CisgICAgZm9yIChpID0gMDsgaSA8IENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlM7IGkrKykgeworICAgICAgY29uY2VhbFBhcmFtcy0+ZmFkZUluRmFjdG9yW2ldID0gRlhfREJMMkZYX1NHTCgKKyAgICAgICAgICBmTGRQb3coQ09OQ0VBTF9NSU5fQVRURU5VQVRJT05fRkFDVE9SXzAyNV9MRCwgMCwKKyAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgoSU5UKShGSVhQX09ORSA+PiBDT05DRUFMX1BBUkFNRVRFUl9CSVRTKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElOVClmYWRlSW5BdHRlbnVhdGlvblZlY3RvcltpXSksCisgICAgICAgICAgICAgICAgIENPTkNFQUxfUEFSQU1FVEVSX0JJVFMpKTsKICAgICB9CiAgIH0KIAogICByZXR1cm4gKEFBQ19ERUNfT0spOwogfQogCi0KIC8qIQogICBcYnJpZWYgR2V0IHN0YXRlIG9mIGNvbmNlYWxtZW50IG1vZHVsZS4KIAotICBccENvbmNlYWxDaGFubmVsSW5mbworICBccGFyYW0gcENvbmNlYWxDaGFubmVsSW5mbwogCiAgIFxyZXR1cm4gQ29uY2VhbG1lbnQgc3RhdGUuCiAqLwotQ0NvbmNlYWxtZW50U3RhdGUKLSAgQ0NvbmNlYWxtZW50X0dldFN0YXRlICgKLSAgICBDQ29uY2VhbG1lbnRJbmZvICpwQ29uY2VhbENoYW5uZWxJbmZvCi0gICkKLXsKK0NDb25jZWFsbWVudFN0YXRlIENDb25jZWFsbWVudF9HZXRTdGF0ZShDQ29uY2VhbG1lbnRJbmZvICpwQ29uY2VhbENoYW5uZWxJbmZvKSB7CiAgIENDb25jZWFsbWVudFN0YXRlIHN0YXRlID0gQ29uY2VhbFN0YXRlX09rOwogCiAgIGlmIChwQ29uY2VhbENoYW5uZWxJbmZvICE9IE5VTEwpIHsKQEAgLTU1NywyNTQgKzUzOCwyNDcgQEAKICAgcmV0dXJuIChzdGF0ZSk7CiB9CiAKLQotc3RhdGljIHZvaWQgQ0NvbmNlYWxtZW50X2Zha2VQbnNEYXRhICgKLSAgIENQbnNEYXRhICpwUG5zRGF0YSwKLSAgIENJY3NJbmZvICpwSWNzSW5mbywKLSAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAotICAgU0hPUlQgKnBTcGVjU2NhbGUsCi0gICBTSE9SVCAqcFNjYWxlRmFjdG9yLAotICAgY29uc3QgaW50IGxldmVsICkKLXsKLSAgQ1Buc0ludGVyQ2hhbm5lbERhdGEgKnBJbnRlckNoYW5uZWxEYXRhID0gcFBuc0RhdGEtPnBQbnNJbnRlckNoYW5uZWxEYXRhOwotCi0gIGludCAgcG5zQmFuZCwgYmFuZCwgZ3JvdXAsIHdpbjsKLSAgLy9pbnQgIGRlbHRhID0gMDsKLSAgaW50ICB3aW5kb3dzUGVyRnJhbWUgPSBHZXRXaW5kb3dzUGVyRnJhbWUocEljc0luZm8pOwotICBpbnQgIHJlZkxldmVsID0gKHdpbmRvd3NQZXJGcmFtZSA+IDEpID8gODIgOiA5MTsKLQotICBGREtfQVNTRVJUKGxldmVsID49IDAgJiYgbGV2ZWwgPD0gMTI3KTsKLQotICBmb3IgKHdpbiA9IDA7IHdpbiA8IHdpbmRvd3NQZXJGcmFtZTsgd2luKyspIHsKLSAgICBwU3BlY1NjYWxlW3dpbl0gPSAzMTsKLSAgfQotCi0gIC8qIGZha2UgSUNTIGluZm8gaWYgbmVjZXNzYXJ5ICovCi0gIGlmICghSXNWYWxpZChwSWNzSW5mbykpIHsKLSAgICBwSWNzSW5mby0+V2luZG93R3JvdXBzID0gMTsKLSAgICBpZiAoSXNMb25nQmxvY2socEljc0luZm8pKSB7Ci0gICAgICBwSWNzSW5mby0+VG90YWxTZkJhbmRzID0gcFNhbXBsaW5nUmF0ZUluZm8tPk51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19Mb25nOwotICAgICAgcEljc0luZm8tPldpbmRvd0dyb3VwTGVuZ3RoWzBdID0gMTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBwSWNzSW5mby0+VG90YWxTZkJhbmRzID0gcFNhbXBsaW5nUmF0ZUluZm8tPk51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19TaG9ydDsKLSAgICAgIHBJY3NJbmZvLT5XaW5kb3dHcm91cExlbmd0aFswXSA9IDg7Ci0gICAgfQotICAgIHBJY3NJbmZvLT5NYXhTZkJhbmRzID0gcEljc0luZm8tPlRvdGFsU2ZCYW5kczsKLSAgfQotCi0gIC8qIGdsb2JhbCBhY3RpdmF0ZSBQTlMgKi8KLSAgcFBuc0RhdGEtPlBuc0FjdGl2ZSA9IDE7Ci0gIC8qIHNldCBlbmVyZ3kgbGV2ZWwgKi8KLSAgcFBuc0RhdGEtPkN1cnJlbnRFbmVyZ3kgPSBmaXhNYXgoIDAsIHJlZkxldmVsIC0gbGV2ZWwgKTsKLQotICAvKgotICAgIHZhbHVlOiB8IEF2Zy4gUk1TIHBvd2VyIHwgQXZnLiBSTVMgcG93ZXIgfAotICAgICAgICAgICB8IHNwZWNTY2FsZSA9IDIyIHwgc3BlY1NjYWxlID0gMzEgfAotICAgIC0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwotICAgICAgICA1ICB8ICAgICAgICAgICAgICAgIHwgIC05OS4wIGRCCi0gICAgICAgMTUgIHwgICAgICAgICAgICAgICAgfCAgLTkwLjAgZEIKLSAgICAgICAyNSAgfCAgICAgICAgICAgICAgICB8ICAtODkuNyBkQiAKLSAgICAgICAzNSAgfCAgICAgICAgICAgICAgICB8ICAtODUuMyBkQgotICAgICAgLi4uICB8ICAgIC4uLiAgICAgICAgIHwgICAuLi4KLSAgICAgICA0NSAgfCAgLTY5LjkgZEIgICAgICB8ICAtNzAuMCBkQgotICAgICAgIDUwICB8ICAtNjIuMiBkQiAgICAgIHwgIAotICAgICAgIDU1ICB8ICAtNTUuNiBkQiAgICAgIHwgIC01NC42IGRCCi0gICAgICAgNjAgIHwgIC00Ny4wIGRCICAgICAgfAotICAgICAgIDY1ICB8ICAtMzkuNSBkQiAgICAgIHwgIC0zOS41IGRCCi0gICAgICAgNzAgIHwgIC0zMS45IGRCICAgICAgfCAgCi0gICAgICAgNzUgIHwgIC0yNC40IGRCICAgICAgfCAgLTI0LjQgZEIKLSAgICAgICA4MCAgfCAgLTE2LjkgZEIgICAgICB8ICAKLSAgICAgICA4NSAgfCAgIC05LjQgZEIgKGMpICB8ICAgLTkuNCBkQgotICAgICAgIDkwICB8ICAgLTMuOSBkQiAoYykgIHwgIAotICAgICAgIDk1ICB8ICAgICAgICAgICAgICAgIHwgICAtMi4xIGRCCi0gICAgICAxMDAgIHwgICAgICAgICAgICAgICAgfCAgIC0xLjYgZEIKLSAgICAgIDEwNSAgfCAgICAgICAgICAgICAgICB8ICAgLTEuNCBkQgotICAqLwotCi0gIGZvciAoZ3JvdXA9MDsgZ3JvdXAgPCBHZXRXaW5kb3dHcm91cHMocEljc0luZm8pOyBncm91cCsrKQotICB7Ci0gICAgZm9yIChiYW5kPTA7IGJhbmQgPCBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQocEljc0luZm8pOyBiYW5kKyspCi0gICAgewotICAgICAgcG5zQmFuZCA9IGdyb3VwICogMTYgKyBiYW5kOwotCi0gICAgICBpZiAocG5zQmFuZCA+PSBOT19PRkJBTkRTKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIC8vcFBuc0RhdGEtPkN1cnJlbnRFbmVyZ3kgKz0gZGVsdGEgOwotICAgICAgcFNjYWxlRmFjdG9yW3Buc0JhbmRdID0gcFBuc0RhdGEtPkN1cnJlbnRFbmVyZ3k7Ci0gICAgICBwSW50ZXJDaGFubmVsRGF0YS0+Y29ycmVsYXRlZFtwbnNCYW5kXSA9IDA7Ci0gICAgICBwUG5zRGF0YS0+cG5zVXNlZFtwbnNCYW5kXSA9IDE7Ci0gICAgfQotICB9Ci19Ci0KLQogLyohCiAgIFxicmllZiBTdG9yZSBkYXRhIGZvciBjb25jZWFsbWVudCB0ZWNobmlxdWVzIGFwcGxpZWQgbGF0ZXIKIAogICBJbnRlcmZhY2UgZnVuY3Rpb24gdG8gc3RvcmUgZGF0YSBmb3IgZGlmZmVyZW50IGNvbmNlYWxtZW50IHN0cmF0ZWdpZXMKLQotICAgXHJldHVybiAgbm9uZQogICovCi12b2lkCi0gIENDb25jZWFsbWVudF9TdG9yZSAoCit2b2lkIENDb25jZWFsbWVudF9TdG9yZSgKICAgICBDQ29uY2VhbG1lbnRJbmZvICpoQ29uY2VhbG1lbnRJbmZvLAogICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyApCi17Ci0gIGlmICggIShwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5yZW5kZXJNb2RlID09IEFBQ0RFQ19SRU5ERVJfTFBECi0gICAgICApICkKLSAgewotICAgIEZJWFBfREJMICpwU3BlY3RyYWxDb2VmZmljaWVudCA9ICBTUEVDX0xPTkcocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQpOwotICAgIFNIT1JUICAgICpwU3BlY1NjYWxlICAgICAgICAgICA9ICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGU7Ci0gICAgQ0ljc0luZm8gKnBJY3NJbmZvICAgICAgICAgICAgID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm87CisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbykgeworICBVQ0hBUiBuYkRpdiA9IE5CX0RJVjsKIAotICAgIFNIT1JUICB0U3BlY1NjYWxlWzhdOwotICAgIFVDSEFSICB0V2luZG93U2hhcGUsIHRXaW5kb3dTZXF1ZW5jZTsKKyAgaWYgKCEocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cmVuZGVyTW9kZSA9PSBBQUNERUNfUkVOREVSX0xQRCAmJgorICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubW9kW25iRGl2IC0gMV0gPT0gMCkpCisKKyAgeworICAgIEZJWFBfREJMICpwU3BlY3RyYWxDb2VmZmljaWVudCA9CisgICAgICAgIFNQRUNfTE9ORyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCk7CisgICAgU0hPUlQgKnBTcGVjU2NhbGUgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGU7CisgICAgQ0ljc0luZm8gKnBJY3NJbmZvID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm87CisKKyAgICBTSE9SVCB0U3BlY1NjYWxlWzhdOworICAgIFVDSEFSIHRXaW5kb3dTaGFwZTsKKyAgICBCTE9DS19UWVBFIHRXaW5kb3dTZXF1ZW5jZTsKIAogICAgIC8qIHN0b3JlIG9sZCB3aW5kb3cgaW5mb3MgZm9yIHN3YXBwaW5nICovCiAgICAgdFdpbmRvd1NlcXVlbmNlID0gaENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2U7Ci0gICAgdFdpbmRvd1NoYXBlICAgID0gaENvbmNlYWxtZW50SW5mby0+d2luZG93U2hhcGU7CisgICAgdFdpbmRvd1NoYXBlID0gaENvbmNlYWxtZW50SW5mby0+d2luZG93U2hhcGU7CiAKICAgICAvKiBzdG9yZSBvbGQgc2NhbGUgZmFjdG9ycyBmb3Igc3dhcHBpbmcgKi8KLSAgICBGREttZW1jcHkodFNwZWNTY2FsZSwgaENvbmNlYWxtZW50SW5mby0+c3BlY1NjYWxlLCA4KnNpemVvZihTSE9SVCkpOworICAgIEZES21lbWNweSh0U3BlY1NjYWxlLCBoQ29uY2VhbG1lbnRJbmZvLT5zcGVjU2NhbGUsIDggKiBzaXplb2YoU0hPUlQpKTsKIAogICAgIC8qIHN0b3JlIG5ldyB3aW5kb3cgaW5mb3MgKi8KICAgICBoQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTZXF1ZW5jZSA9IEdldFdpbmRvd1NlcXVlbmNlKHBJY3NJbmZvKTsKLSAgICBoQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTaGFwZSAgICA9IEdldFdpbmRvd1NoYXBlKHBJY3NJbmZvKTsKLSAgICBoQ29uY2VhbG1lbnRJbmZvLT5sYXN0V2luR3JwTGVuICA9ICooR2V0V2luZG93R3JvdXBMZW5ndGhUYWJsZShwSWNzSW5mbykrR2V0V2luZG93R3JvdXBzKHBJY3NJbmZvKS0xKTsKKyAgICBoQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTaGFwZSA9IEdldFdpbmRvd1NoYXBlKHBJY3NJbmZvKTsKKyAgICBoQ29uY2VhbG1lbnRJbmZvLT5sYXN0V2luR3JwTGVuID0KKyAgICAgICAgKihHZXRXaW5kb3dHcm91cExlbmd0aFRhYmxlKHBJY3NJbmZvKSArIEdldFdpbmRvd0dyb3VwcyhwSWNzSW5mbykgLSAxKTsKIAogICAgIC8qIHN0b3JlIG5ldyBzY2FsZSBmYWN0b3JzICovCi0gICAgRkRLbWVtY3B5KGhDb25jZWFsbWVudEluZm8tPnNwZWNTY2FsZSwgcFNwZWNTY2FsZSwgOCpzaXplb2YoU0hPUlQpKTsKKyAgICBGREttZW1jcHkoaENvbmNlYWxtZW50SW5mby0+c3BlY1NjYWxlLCBwU3BlY1NjYWxlLCA4ICogc2l6ZW9mKFNIT1JUKSk7CiAKLSAgICBpZiAoQ0NvbmNlYWxtZW50X0dldERlbGF5KGhDb25jZWFsbWVudEluZm8tPnBDb25jZWFsUGFyYW1zKSA9PSAwKQotICAgIHsKLSAgICAgIC8qIHN0b3JlIG5ldyBzcGVjdHJhbCBiaW5zICovCisgICAgaWYgKGhDb25jZWFsbWVudEluZm8tPnBDb25jZWFsUGFyYW1zLT5tZXRob2QgPCBDb25jZWFsTWV0aG9kSW50ZXIpIHsKKyAgICAvKiBzdG9yZSBuZXcgc3BlY3RyYWwgYmlucyAqLwogI2lmIChDTkNMX0ZSQUNUX0JJVFMgPT0gREZSQUNUX0JJVFMpCi0gICAgICBGREttZW1jcHkoaENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudCwgcFNwZWN0cmFsQ29lZmZpY2llbnQsIDEwMjQgKiBzaXplb2YoRklYUF9DTkNMKSk7CisgICAgICBGREttZW1jcHkoaENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudCwgcFNwZWN0cmFsQ29lZmZpY2llbnQsCisgICAgICAgICAgICAgICAgMTAyNCAqIHNpemVvZihGSVhQX0NOQ0wpKTsKICNlbHNlCi0gICAgICBGSVhQX0NOQ0wgKlJFU1RSSUNUIHBDbmNsID0gJmhDb25jZWFsbWVudEluZm8tPnNwZWN0cmFsQ29lZmZpY2llbnRbMTAyNC0xXTsKLSAgICAgIEZJWFBfREJMICAqUkVTVFJJQ1QgcFNwZWMgPSAmcFNwZWN0cmFsQ29lZmZpY2llbnRbMTAyNC0xXTsKKyAgICAgIEZJWFBfQ05DTCAqUkVTVFJJQ1QgcENuY2wgPQorICAgICAgICAgICZoQ29uY2VhbG1lbnRJbmZvLT5zcGVjdHJhbENvZWZmaWNpZW50WzEwMjQgLSAxXTsKKyAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwU3BlYyA9ICZwU3BlY3RyYWxDb2VmZmljaWVudFsxMDI0IC0gMV07CiAgICAgICBpbnQgaTsKLQogICAgICAgZm9yIChpID0gMTAyNDsgaSAhPSAwOyBpLS0pIHsKICAgICAgICAgKnBDbmNsLS0gPSBGWF9EQkwyRlhfQ05DTCgqcFNwZWMtLSk7CiAgICAgICB9CiAjZW5kaWYKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEZJWFBfQ05DTCAqUkVTVFJJQ1QgcENuY2wgPSAmaENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudFsxMDI0LTFdOwotICAgICAgRklYUF9EQkwgICpSRVNUUklDVCBwU3BlYyA9ICZwU3BlY3RyYWxDb2VmZmljaWVudFsxMDI0LTFdOwotICAgICAgaW50IGk7CisgICAgfSBlbHNlIHsKKyAgICAvKiBzd2FwIHNwZWN0cmFsIGRhdGEgKi8KKyNpZiAoRklYUF9DTkNMID09IEZJWFBfREJMKQorICAgICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHBTcGVjVG1wLCBGSVhQX0RCTCwgMTAyNCk7CisgICAgICBGREttZW1jcHkocFNwZWNUbXAsIHBTcGVjdHJhbENvZWZmaWNpZW50LCAxMDI0ICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBGREttZW1jcHkocFNwZWN0cmFsQ29lZmZpY2llbnQsIGhDb25jZWFsbWVudEluZm8tPnNwZWN0cmFsQ29lZmZpY2llbnQsCisgICAgICAgICAgICAgICAgMTAyNCAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgRkRLbWVtY3B5KGhDb25jZWFsbWVudEluZm8tPnNwZWN0cmFsQ29lZmZpY2llbnQsIHBTcGVjVG1wLAorICAgICAgICAgICAgICAgIDEwMjQgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIENfQUxMT0NfU0NSQVRDSF9FTkQocFNwZWNUbXAsIEZJWFBfREJMLCAxMDI0KTsKKyNlbHNlCisgICAgICBGSVhQX0NOQ0wgKlJFU1RSSUNUIHBDbmNsID0KKyAgICAgICAgICAmaENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudFsxMDI0IC0gMV07CisgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcFNwZWMgPSAmcFNwZWN0cmFsQ29lZmZpY2llbnRbMTAyNCAtIDFdOworICAgICAgRklYUF9EQkwgdFNwZWM7CiAKLSAgICAgIC8qIHN3YXAgc3BlY3RyYWwgZGF0YSAqLwotICAgICAgZm9yIChpID0gMTAyNDsgaSAhPSAwOyBpLS0pIHsKLSAgICAgICAgRklYUF9EQkwgdFNwZWMgPSAqcFNwZWM7CisgICAgICBmb3IgKGludCBpID0gMTAyNDsgaSAhPSAwOyBpLS0pIHsKKyAgICAgICAgdFNwZWMgPSAqcFNwZWM7CiAgICAgICAgICpwU3BlYy0tID0gRlhfQ05DTDJGWF9EQkwoKnBDbmNsKTsKLSAgICAgICAgKnBDbmNsLS0gPSBGWF9EQkwyRlhfQ05DTCggdFNwZWMpOworICAgICAgICAqcENuY2wtLSA9IEZYX0RCTDJGWF9DTkNMKHRTcGVjKTsKICAgICAgIH0KKyNlbmRpZgogCiAgICAgICAvKiBjb21wbGV0ZSBzd2FwcGluZyBvZiB3aW5kb3cgaW5mb3MgKi8KICAgICAgIHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSA9IHRXaW5kb3dTZXF1ZW5jZTsKLSAgICAgIHBJY3NJbmZvLT5XaW5kb3dTaGFwZSAgICA9IHRXaW5kb3dTaGFwZTsKKyAgICAgIHBJY3NJbmZvLT5XaW5kb3dTaGFwZSA9IHRXaW5kb3dTaGFwZTsKIAogICAgICAgLyogY29tcGxldGUgc3dhcHBpbmcgb2Ygc2NhbGUgZmFjdG9ycyAqLwotICAgICAgRkRLbWVtY3B5KHBTcGVjU2NhbGUsIHRTcGVjU2NhbGUsIDgqc2l6ZW9mKFNIT1JUKSk7CisgICAgICBGREttZW1jcHkocFNwZWNTY2FsZSwgdFNwZWNTY2FsZSwgOCAqIHNpemVvZihTSE9SVCkpOwogICAgIH0KICAgfQotICAKLX0KIAorICBpZiAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cmVuZGVyTW9kZSA9PSBBQUNERUNfUkVOREVSX0xQRCkgeworICAgIC8qIFN0b3JlIExTRjQgKi8KKyAgICBGREttZW1jcHkoaENvbmNlYWxtZW50SW5mby0+bHNmNCwgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bHBjNF9sc2YsCisgICAgICAgICAgICAgIHNpemVvZihoQ29uY2VhbG1lbnRJbmZvLT5sc2Y0KSk7CisgICAgLyogU3RvcmUgVENYIGdhaW4gKi8KKyAgICBoQ29uY2VhbG1lbnRJbmZvLT5sYXN0X3RjeF9nYWluID0KKyAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF90Y3hfZ2FpbjsKKyAgICBoQ29uY2VhbG1lbnRJbmZvLT5sYXN0X3RjeF9nYWluX2UgPQorICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X3RjeF9nYWluX2U7CisgIH0KK30KIAogLyohCiAgIFxicmllZiBBcHBseSBjb25jZWFsbWVudAogCiAgIEludGVyZmFjZSBmdW5jdGlvbiB0byBkaWZmZXJlbnQgY29uY2VhbG1lbnQgc3RyYXRlZ2llcwotCi0gICBccmV0dXJuICBub25lCiAgKi8KLWludAotICBDQ29uY2VhbG1lbnRfQXBwbHkgKAoraW50IENDb25jZWFsbWVudF9BcHBseSgKICAgICBDQ29uY2VhbG1lbnRJbmZvICpoQ29uY2VhbG1lbnRJbmZvLAogICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCiAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKLSAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKLSAgICBjb25zdCBpbnQgc2FtcGxlc1BlckZyYW1lLAotICAgIGNvbnN0IFVDSEFSIGxhc3RMcGRNb2RlLAotICAgIGNvbnN0IGludCBmcmFtZU9rLAotICAgIGNvbnN0IFVJTlQgZmxhZ3MpCi17CisgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sIGNvbnN0IGludCBzYW1wbGVzUGVyRnJhbWUsCisgICAgY29uc3QgVUNIQVIgbGFzdExwZE1vZGUsIGNvbnN0IGludCBmcmFtZU9rLCBjb25zdCBVSU5UIGZsYWdzKSB7CiAgIGludCBhcHBsaWVkUHJvY2Vzc2luZyA9IDA7CisgIGNvbnN0IGludCBtdXRlX3JlbGVhc2VfYWN0aXZlID0KKyAgICAgIGZyYW1lT2sgJiYgKGhDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA+PSBDb25jZWFsU3RhdGVfTXV0ZSkgJiYKKyAgICAgIChoQ29uY2VhbG1lbnRJbmZvLT5jbnRWYWxpZEZyYW1lcyArIDEgPD0KKyAgICAgICBoQ29uY2VhbG1lbnRJbmZvLT5wQ29uY2VhbFBhcmFtcy0+bnVtTXV0ZVJlbGVhc2VGcmFtZXMpOwogCi0gIGlmICggKGZyYW1lT2sgPT0gMCkKLSAgICAmJiAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cmVuZGVyTW9kZSAhPSAoQUFDREVDX1JFTkRFUl9NT0RFKWhDb25jZWFsbWVudEluZm8tPmxhc3RSZW5kZXJNb2RlKSApIHsKLSAgICAvKiByZXN0b3JlIHRoZSBsYXN0IHJlbmRlciBtb2RlIHRvIHN0YXkgaW4gdGhlIHNhbWUgZG9tYWluIHdoaWNoIGFsbG93cyB0byBkbyBhIHByb3BlciBjb25jZWFsbWVudCAqLwotICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnJlbmRlck1vZGUgPSAoQUFDREVDX1JFTkRFUl9NT0RFKWhDb25jZWFsbWVudEluZm8tPmxhc3RSZW5kZXJNb2RlOwotICB9IGVsc2UgewotICAgIC8qIG90aGVyd2lzZSBzdG9yZSB0aGUgY3VycmVudCBtb2RlICovCi0gICAgaENvbmNlYWxtZW50SW5mby0+bGFzdFJlbmRlck1vZGUgPSAoU0NIQVIpcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cmVuZGVyTW9kZTsKKyAgaWYgKGhDb25jZWFsbWVudEluZm8tPndpbmRvd1NoYXBlID09IENPTkNFQUxfTk9UX0RFRklORUQpIHsKKyAgICAvKiBJbml0aWFsaXplIHdpbmRvd19zaGFwZSB3aXRoIHNhbWUgdmFsdWUgYXMgaW4gdGhlIGN1cnJlbnQgKHBhcnNlZCkgZnJhbWUuCisgICAgICAgQmVjYXVzZSBzZWN0aW9uIDQuNi4xMS4zLjIgKFdpbmRvd2luZyBhbmQgYmxvY2sgc3dpdGNoaW5nKSBvZiBJU08vSUVDCisgICAgICAgMTQ0OTYtMzoyMDA5IHNheXM6IEZvciB0aGUgZmlyc3QgcmF3X2RhdGFfYmxvY2soKSB0byBiZSBkZWNvZGVkIHRoZQorICAgICAgIHdpbmRvd19zaGFwZSBvZiB0aGUgbGVmdCBhbmQgcmlnaHQgaGFsZiBvZiB0aGUgd2luZG93IGFyZSBpZGVudGljYWwuICovCisgICAgaENvbmNlYWxtZW50SW5mby0+d2luZG93U2hhcGUgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLldpbmRvd1NoYXBlOwogICB9CiAKLSAgaWYgKCBmcmFtZU9rICkKLSAgeworICBpZiAoZnJhbWVPayAmJiAhbXV0ZV9yZWxlYXNlX2FjdGl2ZSkgeworICAgIC8qIFVwZGF0ZSByZW5kZXIgbW9kZSBpZiBmcmFtZU9rIGV4Y2VwdCBmb3Igb25nb2luZyBtdXRlIHJlbGVhc2Ugc3RhdGUuICovCisgICAgaENvbmNlYWxtZW50SW5mby0+bGFzdFJlbmRlck1vZGUgPQorICAgICAgICAoU0NIQVIpcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cmVuZGVyTW9kZTsKKwogICAgIC8qIFJlc2N1ZSBjdXJyZW50IGRhdGEgZm9yIGNvbmNlYWxtZW50IGluIGZ1dHVyZSBmcmFtZXMgKi8KLSAgICBDQ29uY2VhbG1lbnRfU3RvcmUgKCBoQ29uY2VhbG1lbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyApOwotICAgIC8qIFJlc2V0IGluZGV4IHRvIHJhbmRvbSBzaWduIHZlY3RvciB0byBtYWtlIHNpZ24gY2FsY3VsYXRpb24gZnJhbWUgYWdub3N0aWMgCisgICAgQ0NvbmNlYWxtZW50X1N0b3JlKGhDb25jZWFsbWVudEluZm8sIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8pOworICAgIC8qIFJlc2V0IGluZGV4IHRvIHJhbmRvbSBzaWduIHZlY3RvciB0byBtYWtlIHNpZ24gY2FsY3VsYXRpb24gZnJhbWUgYWdub3N0aWMKICAgICAgICAob25seSBkZXBlbmRzIG9uIG51bWJlciBvZiBzdWJzZXF1ZW50bHkgY29uY2VhbGVkIHNwZWN0cmFsIGJsb2NrcykgKi8KLSAgICAgICAgaENvbmNlYWxtZW50SW5mby0+aVJhbmRvbVBoYXNlID0gMDsKKyAgICBoQ29uY2VhbG1lbnRJbmZvLT5pUmFuZG9tUGhhc2UgPSAwOworICB9IGVsc2UgeworICAgIGlmIChoQ29uY2VhbG1lbnRJbmZvLT5sYXN0UmVuZGVyTW9kZSA9PSBBQUNERUNfUkVOREVSX0lOVkFMSUQpIHsKKyAgICAgIGhDb25jZWFsbWVudEluZm8tPmxhc3RSZW5kZXJNb2RlID0gQUFDREVDX1JFTkRFUl9JTURDVDsKKyAgICB9CisgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cmVuZGVyTW9kZSA9CisgICAgICAgIChBQUNERUNfUkVOREVSX01PREUpaENvbmNlYWxtZW50SW5mby0+bGFzdFJlbmRlck1vZGU7CiAgIH0KIAogICAvKiBoYW5kIGN1cnJlbnQgZnJhbWUgc3RhdHVzIHRvIHRoZSBzdGF0ZSBtYWNoaW5lICovCi0gIENDb25jZWFsbWVudF9VcGRhdGVTdGF0ZSggaENvbmNlYWxtZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU9rICk7CisgIENDb25jZWFsbWVudF9VcGRhdGVTdGF0ZShoQ29uY2VhbG1lbnRJbmZvLCBmcmFtZU9rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mbyk7CiAKICAgewotICAgIC8qIENyZWF0ZSBkYXRhIGZvciBzaWduYWwgcmVuZGVyaW5nIGFjY29yZGluZyB0byB0aGUgc2VsZWN0ZWQgY29uY2VhbG1lbnQgbWV0aG9kIGFuZCBkZWNvZGVyIG9wZXJhdGluZyBtb2RlLiAqLworICAgIGlmICghZnJhbWVPayAmJiBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5yZW5kZXJNb2RlID09IEFBQ0RFQ19SRU5ERVJfSU1EQ1QpIHsKKyAgICAgIC8qIExQQyBleHRyYXBvbGF0aW9uICovCisgICAgICBDTHBjX0NvbmNlYWwocEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxzcF9jb2VmZiwKKyAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5scGM0X2xzZiwKKyAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sc2ZfYWRhcHRpdmVfbWVhbiwKKyAgICAgICAgICAgICAgICAgICBoQ29uY2VhbG1lbnRJbmZvLT5sYXN0UmVuZGVyTW9kZSA9PSBBQUNERUNfUkVOREVSX0lNRENUKTsKKyAgICAgIEZES21lbWNweShoQ29uY2VhbG1lbnRJbmZvLT5sc2Y0LCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5scGM0X2xzZiwKKyAgICAgICAgICAgICAgICBzaXplb2YocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bHBjNF9sc2YpKTsKKyAgICB9CiAKKyAgICAvKiBDcmVhdGUgZGF0YSBmb3Igc2lnbmFsIHJlbmRlcmluZyBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIGNvbmNlYWxtZW50CisgICAgICogbWV0aG9kIGFuZCBkZWNvZGVyIG9wZXJhdGluZyBtb2RlLiAqLwogCi0gICAgaWYgKCAhKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnJlbmRlck1vZGUgPT0gQUFDREVDX1JFTkRFUl9MUEQKLSAgICAgICAgKQotICAgICAgICApCi0gICAgewotICAgICAgc3dpdGNoIChoQ29uY2VhbG1lbnRJbmZvLT5wQ29uY2VhbFBhcmFtcy0+bWV0aG9kKQotICAgICAgewotICAgICAgZGVmYXVsdDoKLSAgICAgIGNhc2UgQ29uY2VhbE1ldGhvZE11dGU6Ci0gICAgICAgIGlmICghZnJhbWVPaykgewotICAgICAgICAgIC8qIE11dGUgc3BlY3RyYWwgZGF0YSBpbiBjYXNlIG9mIGVycm9ycyAqLwotICAgICAgICAgIEZES21lbWNsZWFyKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50LCBzYW1wbGVzUGVyRnJhbWUgKiBzaXplb2YoRklYUF9EQkwpKTsKLSAgICAgICAgICAvKiBTZXQgbGFzdCB3aW5kb3cgc2hhcGUgKi8KLSAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvLldpbmRvd1NoYXBlID0gaENvbmNlYWxtZW50SW5mby0+d2luZG93U2hhcGU7Ci0gICAgICAgICAgYXBwbGllZFByb2Nlc3NpbmcgPSAxOworICAgIGlmICgoIWZyYW1lT2sgfHwgbXV0ZV9yZWxlYXNlX2FjdGl2ZSkgJiYKKyAgICAgICAgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnJlbmRlck1vZGUgPT0gQUFDREVDX1JFTkRFUl9MUEQpKSB7CisgICAgICAvKiBSZXN0b3JlIG9sZCBMU0Y0ICovCisgICAgICBGREttZW1jcHkocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bHBjNF9sc2YsIGhDb25jZWFsbWVudEluZm8tPmxzZjQsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxwYzRfbHNmKSk7CisgICAgICAvKiBSZXN0b3JlIG9sZCBUQ1ggZ2FpbiAqLworICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF90Y3hfZ2FpbiA9CisgICAgICAgICAgaENvbmNlYWxtZW50SW5mby0+bGFzdF90Y3hfZ2FpbjsKKyAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfdGN4X2dhaW5fZSA9CisgICAgICAgICAgaENvbmNlYWxtZW50SW5mby0+bGFzdF90Y3hfZ2Fpbl9lOworICAgIH0KKworICAgIGlmICghKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnJlbmRlck1vZGUgPT0gQUFDREVDX1JFTkRFUl9MUEQgJiYKKyAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xwZF9tb2RlID09IDApKSB7CisgICAgICBzd2l0Y2ggKGhDb25jZWFsbWVudEluZm8tPnBDb25jZWFsUGFyYW1zLT5tZXRob2QpIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2FzZSBDb25jZWFsTWV0aG9kTXV0ZToKKyAgICAgICAgICBpZiAoIWZyYW1lT2spIHsKKyAgICAgICAgICAgIC8qIE11dGUgc3BlY3RyYWwgZGF0YSBpbiBjYXNlIG9mIGVycm9ycyAqLworICAgICAgICAgICAgRkRLbWVtY2xlYXIocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICAgIC8qIFNldCBsYXN0IHdpbmRvdyBzaGFwZSAqLworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mby5XaW5kb3dTaGFwZSA9CisgICAgICAgICAgICAgICAgaENvbmNlYWxtZW50SW5mby0+d2luZG93U2hhcGU7CisgICAgICAgICAgICBhcHBsaWVkUHJvY2Vzc2luZyA9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQ29uY2VhbE1ldGhvZE5vaXNlOgorICAgICAgICAgIC8qIE5vaXNlIHN1YnN0aXR1dGlvbiBlcnJvciBjb25jZWFsbWVudCB0ZWNobmlxdWUgKi8KKyAgICAgICAgICBhcHBsaWVkUHJvY2Vzc2luZyA9IENDb25jZWFsbWVudF9BcHBseU5vaXNlKAorICAgICAgICAgICAgICBoQ29uY2VhbG1lbnRJbmZvLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLCBwU2FtcGxpbmdSYXRlSW5mbywgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICBmbGFncyk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDb25jZWFsTWV0aG9kSW50ZXI6CisgICAgICAgICAgLyogRW5lcmd5IGludGVycG9sYXRpb24gY29uY2VhbG1lbnQgYmFzZWQgb24gM0dQUCAqLworICAgICAgICAgIGFwcGxpZWRQcm9jZXNzaW5nID0gQ0NvbmNlYWxtZW50X0FwcGx5SW50ZXIoCisgICAgICAgICAgICAgIGhDb25jZWFsbWVudEluZm8sIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIHBTYW1wbGluZ1JhdGVJbmZvLAorICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsIDAsIC8qIGRvbid0IHVzZSB0b25hbCBpbXByb3ZlbWVudCAqLworICAgICAgICAgICAgICBmcmFtZU9rLCBtdXRlX3JlbGVhc2VfYWN0aXZlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFmcmFtZU9rIHx8IG11dGVfcmVsZWFzZV9hY3RpdmUpIHsKKyAgICAgIC8qIHNpbXBseSByZXN0b3JlIHRoZSBidWZmZXIgKi8KKyAgICAgIEZJWFBfREJMICpwU3BlY3RyYWxDb2VmZmljaWVudCA9CisgICAgICAgICAgU1BFQ19MT05HKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50KTsKKyAgICAgIFNIT1JUICpwU3BlY1NjYWxlID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+c3BlY1NjYWxlOworICAgICAgQ0ljc0luZm8gKnBJY3NJbmZvID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm87CisjaWYgKENOQ0xfRlJBQ1RfQklUUyAhPSBERlJBQ1RfQklUUykKKyAgICAgIEZJWFBfQ05DTCAqUkVTVFJJQ1QgcENuY2wgPQorICAgICAgICAgICZoQ29uY2VhbG1lbnRJbmZvLT5zcGVjdHJhbENvZWZmaWNpZW50WzEwMjQgLSAxXTsKKyAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwU3BlYyA9ICZwU3BlY3RyYWxDb2VmZmljaWVudFsxMDI0IC0gMV07CisgICAgICBpbnQgaTsKKyNlbmRpZgorCisgICAgICAvKiByZXN0b3JlIHdpbmRvdyBpbmZvcyAoZ3JpKSBkbyB3ZSBuZWVkIHRoYXQ/ICovCisgICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBoQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTZXF1ZW5jZTsKKyAgICAgIHBJY3NJbmZvLT5XaW5kb3dTaGFwZSA9IGhDb25jZWFsbWVudEluZm8tPndpbmRvd1NoYXBlOworCisgICAgICBpZiAoaENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlICE9IENvbmNlYWxTdGF0ZV9NdXRlKSB7CisgICAgICAgIC8qIHJlc3RvcmUgc2NhbGUgZmFjdG9ycyAqLworICAgICAgICBGREttZW1jcHkocFNwZWNTY2FsZSwgaENvbmNlYWxtZW50SW5mby0+c3BlY1NjYWxlLCA4ICogc2l6ZW9mKFNIT1JUKSk7CisKKyAgICAgICAgLyogcmVzdG9yZSBzcGVjdHJhbCBiaW5zICovCisjaWYgKENOQ0xfRlJBQ1RfQklUUyA9PSBERlJBQ1RfQklUUykKKyAgICAgICAgRkRLbWVtY3B5KHBTcGVjdHJhbENvZWZmaWNpZW50LCBoQ29uY2VhbG1lbnRJbmZvLT5zcGVjdHJhbENvZWZmaWNpZW50LAorICAgICAgICAgICAgICAgICAgMTAyNCAqIHNpemVvZihGSVhQX0RCTCkpOworI2Vsc2UKKyAgICAgICAgZm9yIChpID0gMTAyNDsgaSAhPSAwOyBpLS0pIHsKKyAgICAgICAgICAqcFNwZWMtLSA9IEZYX0NOQ0wyRlhfREJMKCpwQ25jbC0tKTsKICAgICAgICAgfQotICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogY2xlYXIgc2NhbGUgZmFjdG9ycyAqLworICAgICAgICBGREttZW1jbGVhcihwU3BlY1NjYWxlLCA4ICogc2l6ZW9mKFNIT1JUKSk7CiAKLSAgICAgIGNhc2UgQ29uY2VhbE1ldGhvZE5vaXNlOgotICAgICAgICAvKiBOb2lzZSBzdWJzdGl0dXRpb24gZXJyb3IgY29uY2VhbG1lbnQgdGVjaG5pcXVlICovCi0gICAgICAgIGFwcGxpZWRQcm9jZXNzaW5nID0KLSAgICAgICAgICBDQ29uY2VhbG1lbnRfQXBwbHlOb2lzZSAoaENvbmNlYWxtZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBDb25jZWFsTWV0aG9kSW50ZXI6Ci0gICAgICAgIC8qIEVuZXJneSBpbnRlcnBvbGF0aW9uIGNvbmNlYWxtZW50IGJhc2VkIG9uIDNHUFAgKi8KLSAgICAgICAgYXBwbGllZFByb2Nlc3NpbmcgPQotICAgICAgICAgIENDb25jZWFsbWVudF9BcHBseUludGVyIChoQ29uY2VhbG1lbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgLyogZG9uJ3QgdXNlIHRvbmFsIGltcHJvdmVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lT2spOwotICAgICAgICBicmVhazsKLQorICAgICAgICAvKiBjbGVhciBidWZmZXIgKi8KKyAgICAgICAgRkRLbWVtY2xlYXIocFNwZWN0cmFsQ29lZmZpY2llbnQsIDEwMjQgKiBzaXplb2YoRklYUF9DTkNMKSk7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC04MTIsNyArNzg2LDcgQEAKICAgaENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMF0gPSBoQ29uY2VhbG1lbnRJbmZvLT5wcmV2RnJhbWVPa1sxXTsKICAgaENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMV0gPSBmcmFtZU9rOwogCi0gIHJldHVybiBhcHBsaWVkUHJvY2Vzc2luZzsKKyAgcmV0dXJuIG11dGVfcmVsZWFzZV9hY3RpdmUgPyAtMSA6IGFwcGxpZWRQcm9jZXNzaW5nOwogfQogCiAvKiEKQEAgLTgyMCwzMDggKzc5NCwxOTEgQEAKIAogICBJbiBjYXNlIG9mIGZyYW1lIGxvc3QgdGhpcyBmdW5jdGlvbiBwcm9kdWNlcyBhIG5vaXN5IGZyYW1lIHdpdGggcmVzcGVjdCB0byB0aGUKICAgZW5lcmdpZXMgdmFsdWVzIG9mIHBhc3QgZnJhbWUuCi0KLVxyZXR1cm4gIG5vbmUKICAqLwotc3RhdGljIGludAotICBDQ29uY2VhbG1lbnRfQXBwbHlOb2lzZSAoQ0NvbmNlYWxtZW50SW5mbyAqcENvbmNlYWxtZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncykKLXsKLSAgQ0NvbmNlYWxQYXJhbXMgKnBDb25jZWFsQ29tbW9uRGF0YSA9IHBDb25jZWFsbWVudEluZm8tPnBDb25jZWFsUGFyYW1zOwotCi0gIEZJWFBfREJMICpwU3BlY3RyYWxDb2VmZmljaWVudCA9ICBTUEVDX0xPTkcocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQpOwotICBTSE9SVCAgICAqcFNwZWNTY2FsZSAgICAgICAgICAgPSAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+c3BlY1NjYWxlOwotICBDSWNzSW5mbyAqcEljc0luZm8gICAgICAgICAgICAgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbzsKK3N0YXRpYyBpbnQgQ0NvbmNlYWxtZW50X0FwcGx5Tm9pc2UoCisgICAgQ0NvbmNlYWxtZW50SW5mbyAqcENvbmNlYWxtZW50SW5mbywKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sIGNvbnN0IGludCBzYW1wbGVzUGVyRnJhbWUsCisgICAgY29uc3QgVUlOVCBmbGFncykgeworICBGSVhQX0RCTCAqcFNwZWN0cmFsQ29lZmZpY2llbnQgPQorICAgICAgU1BFQ19MT05HKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50KTsKKyAgQ0ljc0luZm8gKnBJY3NJbmZvID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm87CiAKICAgaW50IGFwcGxpZWRQcm9jZXNzaW5nID0gMDsKIAotICBGREtfQVNTRVJUKChzYW1wbGVzUGVyRnJhbWU+PTQ4MCkgJiYgKHNhbXBsZXNQZXJGcmFtZTw9MTAyNCkpOwotICBGREtfQVNTRVJUKChzYW1wbGVzUGVyRnJhbWUmMHgxRikgPT0gMCk7CisgIEZES19BU1NFUlQocENvbmNlYWxtZW50SW5mbyAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVCgoc2FtcGxlc1BlckZyYW1lID49IDEyMCkgJiYgKHNhbXBsZXNQZXJGcmFtZSA8PSAxMDI0KSk7CiAKLSAgc3dpdGNoIChwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUpCi0gIHsKLSAgY2FzZSBDb25jZWFsU3RhdGVfT2s6Ci0gICAgLyogTm90aGluZyB0byBkbyBoZXJlISAqLwotICAgIGJyZWFrOworICBzd2l0Y2ggKHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSkgeworICAgIGNhc2UgQ29uY2VhbFN0YXRlX09rOgorICAgICAgLyogTm90aGluZyB0byBkbyBoZXJlISAqLworICAgICAgYnJlYWs7CiAKLSAgY2FzZSBDb25jZWFsU3RhdGVfU2luZ2xlOgotICBjYXNlIENvbmNlYWxTdGF0ZV9GYWRlT3V0OgotICAgIHsKLSAgICAgIC8qIHJlc3RvcmUgZnJlcXVlbmN5IGNvZWZmaWNpZW50cyBmcm9tIGJ1ZmZlciB3aXRoIGEgc3BlY2lmaWMgbXV0aW5nICovCi0gICAgICBGSVhQX1NHTCAgZmFjOwotICAgICAgaW50IHdpbiwgbnVtV2luZG93cyA9IDE7Ci0gICAgICBpbnQgd2luZG93TGVuID0gc2FtcGxlc1BlckZyYW1lOwotICAgICAgaW50IHRGYWRlRnJhbWVzLCBsYXN0V2luZG93ID0gMDsKLSAgICAgIGludCB3aW5faWR4X3N0cmlkZSA9IDE7CisgICAgY2FzZSBDb25jZWFsU3RhdGVfU2luZ2xlOgorICAgIGNhc2UgQ29uY2VhbFN0YXRlX0ZhZGVPdXQ6CisgICAgICBhcHBsaWVkUHJvY2Vzc2luZyA9IENDb25jZWFsbWVudF9BcHBseUZhZGVPdXQoCisgICAgICAgICAgLyptb2RlID0qLzEsIHBDb25jZWFsbWVudEluZm8sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKKyAgICAgIGJyZWFrOwogCi0gICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8gIT0gTlVMTCk7Ci0gICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPj0gMCk7Ci0gICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPCBDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTKTsKLSAgICAgIEZES19BU1NFUlQocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA8PSBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMpOwotCi0gICAgICAvKiBnZXQgYXR0ZW51YXRpb24gZmFjdG9yICovCi0gICAgICB0RmFkZUZyYW1lcyA9IHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXM7Ci0gICAgICBmYWMgPSBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3JbdEZhZGVGcmFtZXNdOwotCi0gICAgICAvKiBzZXQgb2xkIHdpbmRvdyBwYXJhbWV0ZXJzICovCi0gICAgICB7Ci0gICAgICAgIHBJY3NJbmZvLT5XaW5kb3dTaGFwZSAgICA9IHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NoYXBlOwotICAgICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBwQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTZXF1ZW5jZTsKLQotICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2UgPT0gMikgewotICAgICAgICAgIC8qIHNob3J0IGJsb2NrIGhhbmRsaW5nICovCi0gICAgICAgICAgbnVtV2luZG93cyA9IDg7Ci0gICAgICAgICAgd2luZG93TGVuICA9IHNhbXBsZXNQZXJGcmFtZSA+PiAzOwotICAgICAgICAgIGxhc3RXaW5kb3cgPSBudW1XaW5kb3dzIC0gcENvbmNlYWxtZW50SW5mby0+bGFzdFdpbkdycExlbjsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBmb3IgKHdpbiA9IDA7IHdpbiA8IG51bVdpbmRvd3M7IHdpbisrKSB7Ci0gICAgICAgIEZJWFBfQ05DTCAqcENuY2wgPSBwQ29uY2VhbG1lbnRJbmZvLT5zcGVjdHJhbENvZWZmaWNpZW50ICsgKGxhc3RXaW5kb3cgKiB3aW5kb3dMZW4pOwotICAgICAgICBGSVhQX0RCTCAgKnBPdXQgID0gcFNwZWN0cmFsQ29lZmZpY2llbnQgKyAod2luICogd2luZG93TGVuKTsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgRkRLX0FTU0VSVCgobGFzdFdpbmRvdyAqIHdpbmRvd0xlbiArIHdpbmRvd0xlbikgPD0gc2FtcGxlc1BlckZyYW1lKTsKLQotICAgICAgICAvKiByZXN0b3JlIGZyZXF1ZW5jeSBjb2VmZmljaWVudHMgZnJvbSBidWZmZXIgd2l0aCBhIHNwZWNpZmljIGF0dGVudWF0aW9uICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aW5kb3dMZW47IGkrKykgewotICAgICAgICAgIHBPdXRbaV0gPSBmTXVsdChwQ25jbFtpXSwgZmFjKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGFwcGx5IHJhbmRvbSBjaGFuZ2Ugb2Ygc2lnbiBmb3Igc3BlY3RyYWwgY29lZmZpY2llbnRzICovCi0gICAgICAgIENDb25jZWFsbWVudF9BcHBseVJhbmRvbVNpZ24ocENvbmNlYWxtZW50SW5mby0+aVJhbmRvbVBoYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dMZW4gKTsKLQotICAgICAgICAvKiBJbmNyZW1lbnQgcmFuZG9tIHBoYXNlIGluZGV4IHRvIGF2b2lkIHJlcGV0aXRpb24gYXJ0aWZhY3RzLiAqLwotICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5pUmFuZG9tUGhhc2UgPSAocENvbmNlYWxtZW50SW5mby0+aVJhbmRvbVBoYXNlICsgMSkgJiAoQUFDX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKLQotICAgICAgICAvKiBzZXQgb2xkIHNjYWxlIGZhY3RvcnMgKi8KLSAgICAgICAgcFNwZWNTY2FsZVt3aW4qd2luX2lkeF9zdHJpZGVdID0gcENvbmNlYWxtZW50SW5mby0+c3BlY1NjYWxlW3dpbl9pZHhfc3RyaWRlKmxhc3RXaW5kb3crK107Ci0KLSAgICAgICAgaWYgKCAobGFzdFdpbmRvdyA+PSBudW1XaW5kb3dzKQotICAgICAgICAgICYmIChudW1XaW5kb3dzID4gIDEpICkKLSAgICAgICAgewotICAgICAgICAgIC8qIGVuZCBvZiBzZXF1ZW5jZSAtPiByZXdpbmQgKi8KLSAgICAgICAgICBsYXN0V2luZG93ID0gbnVtV2luZG93cyAtIHBDb25jZWFsbWVudEluZm8tPmxhc3RXaW5HcnBMZW47Ci0gICAgICAgICAgLyogdXBkYXRlIHRoZSBhdHRlbnVhdGlvbiBmYWN0b3IgdG8gZ2V0IGEgZmFzdGVyIGZhZGUtb3V0ICovCi0gICAgICAgICAgdEZhZGVGcmFtZXMgKz0gMTsKLSAgICAgICAgICBpZiAodEZhZGVGcmFtZXMgPCBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMpIHsKLSAgICAgICAgICAgIGZhYyA9IHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZU91dEZhY3Rvclt0RmFkZUZyYW1lc107Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZhYyA9IChGSVhQX1NHTCkwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBzdG9yZSB0ZW1wIHZhcnMgKi8KLSAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPSB0RmFkZUZyYW1lczsKLSAgICAgIGFwcGxpZWRQcm9jZXNzaW5nID0gMTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBDb25jZWFsU3RhdGVfTXV0ZToKLSAgICB7CisgICAgY2FzZSBDb25jZWFsU3RhdGVfTXV0ZTogewogICAgICAgLyogc2V0IGR1bW15IHdpbmRvdyBwYXJhbWV0ZXJzICovCi0gICAgICBwSWNzSW5mby0+VmFsaWQgICAgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJpZ2dlciB0aGUgZ2VuZXJhdGlvbiBvZiBhIGNvbnNpdGVudCBJY3NJbmZvICovCi0gICAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgICAgPSBwQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTaGFwZTsgICAgLyogUHJldmVudCBhbiBpbnZhbGlkIFdpbmRvd1NoYXBlIChyZXF1aXJlZCBmb3IgRi9UIHRyYW5zZm9ybSkgKi8KLSAgICAgIHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSA9IENDb25jZWFsbWVudF9HZXRXaW5TZXEocENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2UpOwotICAgICAgcENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2UgPSBwSWNzSW5mby0+V2luZG93U2VxdWVuY2U7IC8qIFN0b3JlIGZvciBuZXh0IGZyYW1lIChzcGVjdHJ1bSBpbiBjb25jZWFsbWVudCBidWZmZXIgY2FuJ3QgYmUgdXNlZCBhdCBhbGwpICovCisgICAgICBwSWNzSW5mby0+VmFsaWQgPSAwOyAvKiBUcmlnZ2VyIHRoZSBnZW5lcmF0aW9uIG9mIGEgY29uc2l0ZW50IEljc0luZm8gKi8KKyAgICAgIHBJY3NJbmZvLT5XaW5kb3dTaGFwZSA9CisgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+d2luZG93U2hhcGU7IC8qIFByZXZlbnQgYW4gaW52YWxpZCBXaW5kb3dTaGFwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVxdWlyZWQgZm9yIEYvVCB0cmFuc2Zvcm0pICovCisgICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPQorICAgICAgICAgIENDb25jZWFsbWVudF9HZXRXaW5TZXEocENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2UpOworICAgICAgcENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2UgPQorICAgICAgICAgIHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZTsgLyogU3RvcmUgZm9yIG5leHQgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcGVjdHJ1bSBpbiBjb25jZWFsbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGNhbid0IGJlIHVzZWQgYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCkgKi8KIAogICAgICAgLyogbXV0ZSBzcGVjdHJhbCBkYXRhICovCiAgICAgICBGREttZW1jbGVhcihwU3BlY3RyYWxDb2VmZmljaWVudCwgc2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBGREttZW1jbGVhcihwQ29uY2VhbG1lbnRJbmZvLT5zcGVjdHJhbENvZWZmaWNpZW50LAorICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKLSAgICAgIGlmICggIShmbGFncyAmIChBQ19VU0FDfEFDX1JTVkQ1MCkpIAotICAgICAgICAgICAmJiBwQ29uY2VhbENvbW1vbkRhdGEtPmNvbWZvcnROb2lzZUxldmVsID49IDAKLSAgICAgICAgICAgJiYgcENvbmNlYWxDb21tb25EYXRhLT5jb21mb3J0Tm9pc2VMZXZlbCA8PSA2MSAvKiAtOTBkQiAqLykKLSAgICAgICAgewotICAgICAgICAvKiBpbnNlcnQgY29tZm9ydCBub2lzZSB1c2luZyBQTlMgKi8KLSAgICAgICAgQ0NvbmNlYWxtZW50X2Zha2VQbnNEYXRhICgKLSAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLmFhYy5QbnNEYXRhLAotICAgICAgICAgIHBJY3NJbmZvLAotICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2ZiU2NhbGUsCi0gICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvciwKLSAgICAgICAgICBwQ29uY2VhbENvbW1vbkRhdGEtPmNvbWZvcnROb2lzZUxldmVsCi0gICAgICAgICk7Ci0KLSAgICAgICAgQ1Buc19BcHBseSAoCi0gICAgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS5hYWMuUG5zRGF0YSwKLSAgICAgICAgICAgICAgICBwSWNzSW5mbywKLSAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCwKLSAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGUsCi0gICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvciwKLSAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywKLSAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoLAotICAgICAgICAgICAgICAgIDAgIC8qIGFsd2F5cyBhcHBseSB0byBmaXJzdCBjaGFubmVsICovCi0gICAgICAgICAgICAgICk7Ci0gICAgICB9CiAgICAgICBhcHBsaWVkUHJvY2Vzc2luZyA9IDE7Ci0gICAgfQotICAgIGJyZWFrOworICAgIH0gYnJlYWs7CiAKLSAgY2FzZSBDb25jZWFsU3RhdGVfRmFkZUluOgotICAgIHsKLSAgICAgIEZES19BU1NFUlQocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA+PSAwKTsKLSAgICAgIEZES19BU1NFUlQocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA8IENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlMpOwotICAgICAgRkRLX0FTU0VSVChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzIDwgcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlSW5GcmFtZXMpOworICAgIGNhc2UgQ29uY2VhbFN0YXRlX0ZhZGVJbjogeworICAgICAgLyogVGltZURvbWFpbkZhZGluZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIEF0dGVudWF0aW9uIG9mIHNpZ25hbCBpcyBkb25lIGluIENDb25jZWFsbWVudF9UREZhZGluZygpICovCiAKLSAgICAgIC8qIGF0dGVudWF0ZSBzaWduYWwgdG8gZ2V0IGEgc21vb3RoIGZhZGUtaW4gKi8KLSAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwT3V0ID0gJnBTcGVjdHJhbENvZWZmaWNpZW50W3NhbXBsZXNQZXJGcmFtZS0xXTsKLSAgICAgIEZJWFBfU0dMIGZhYyA9IHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZUluRmFjdG9yW3BDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXNdOwotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IHNhbXBsZXNQZXJGcmFtZTsgaSAhPSAwOyBpLS0pIHsKLSAgICAgICAgKnBPdXQgPSBmTXVsdCgqcE91dCwgZmFjKTsKLSAgICAgICAgcE91dC0tOwotICAgICAgfQogICAgICAgYXBwbGllZFByb2Nlc3NpbmcgPSAxOwotICAgIH0KLSAgICBicmVhazsKKyAgICB9IGJyZWFrOwogCi0gIGRlZmF1bHQ6Ci0gICAgLyogd2Ugc2hvdWxkbid0IGNvbWUgaGVyZSBhbnl3YXkgKi8KLSAgICBGREtfQVNTRVJUKDApOwotICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiB3ZSBzaG91bGRuJ3QgY29tZSBoZXJlIGFueXdheSAqLworICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgIGJyZWFrOwogICB9CiAKICAgcmV0dXJuIGFwcGxpZWRQcm9jZXNzaW5nOwogfQogCi0KIC8qIQogICBcYnJpZWYgQXBwbHkgY29uY2VhbG1lbnQgaW50ZXJwb2xhdGlvbgogCiAgIFRoZSBmdW5jdGlvbiBzd2FwcyB0aGUgZGF0YSBmcm9tIHRoZSBjdXJyZW50IGFuZCB0aGUgcHJldmlvdXMgZnJhbWUuIElmIGFuCiAgIGVycm9yIGhhcyBvY2N1cmVkLCBmcmFtZSBpbnRlcnBvbGF0aW9uIGlzIHBlcmZvcm1lZCB0byByZXN0b3JlIHRoZSBtaXNzaW5nCiAgIGZyYW1lLiBJbiBjYXNlIG9mIG11bHRpcGxlIGZhdWx0eSBmcmFtZXMsIGZhZGUtaW4gYW5kIGZhZGUtb3V0IGlzIGFwcGxpZWQuCi0KLSAgXHJldHVybiAgbm9uZQogKi8KLXN0YXRpYyBpbnQKLSAgQ0NvbmNlYWxtZW50X0FwcGx5SW50ZXIgKAotICAgIENDb25jZWFsbWVudEluZm8gICAgICAgKnBDb25jZWFsbWVudEluZm8sCitzdGF0aWMgaW50IENDb25jZWFsbWVudF9BcHBseUludGVyKAorICAgIENDb25jZWFsbWVudEluZm8gKnBDb25jZWFsbWVudEluZm8sCiAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKLSAgICBjb25zdCBpbnQgIHNhbXBsZXNQZXJGcmFtZSwKLSAgICBjb25zdCBpbnQgIGltcHJvdmVUb25hbCwKLSAgICBjb25zdCBpbnQgIGZyYW1lT2sgKQotewotICBDQ29uY2VhbFBhcmFtcyAgICpwQ29uY2VhbENvbW1vbkRhdGEgICAgPSAgcENvbmNlYWxtZW50SW5mby0+cENvbmNlYWxQYXJhbXM7CisgICAgY29uc3QgU2FtcGxpbmdSYXRlSW5mbyAqcFNhbXBsaW5nUmF0ZUluZm8sIGNvbnN0IGludCBzYW1wbGVzUGVyRnJhbWUsCisgICAgY29uc3QgaW50IGltcHJvdmVUb25hbCwgY29uc3QgaW50IGZyYW1lT2ssIGNvbnN0IGludCBtdXRlX3JlbGVhc2VfYWN0aXZlKSB7CisjaWYgZGVmaW5lZChGREtfQVNTRVJUX0VOQUJMRSkKKyAgQ0NvbmNlYWxQYXJhbXMgKnBDb25jZWFsQ29tbW9uRGF0YSA9IHBDb25jZWFsbWVudEluZm8tPnBDb25jZWFsUGFyYW1zOworI2VuZGlmCiAKLSAgRklYUF9EQkwgICAgICAgICAqcFNwZWN0cmFsQ29lZmZpY2llbnQgID0gIFNQRUNfTE9ORyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCk7Ci0gIENJY3NJbmZvICAgICAgICAgKnBJY3NJbmZvICAgICAgICAgICAgICA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvOwotICBTSE9SVCAgICAgICAgICAgICpwU3BlY1NjYWxlICAgICAgICAgICAgPSAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+c3BlY1NjYWxlOwotCisgIEZJWFBfREJMICpwU3BlY3RyYWxDb2VmZmljaWVudCA9CisgICAgICBTUEVDX0xPTkcocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQpOworICBDSWNzSW5mbyAqcEljc0luZm8gPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbzsKKyAgU0hPUlQgKnBTcGVjU2NhbGUgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGU7CiAKICAgaW50IHNmYkVuZXJneVByZXZbNjRdOwotICBpbnQgc2ZiRW5lcmd5QWN0IFs2NF07CisgIGludCBzZmJFbmVyZ3lBY3RbNjRdOwogCiAgIGludCBpLCBhcHBsaWVkUHJvY2Vzc2luZyA9IDA7CiAKICAgLyogY2xlYXIvaW5pdCAqLwogICBGREttZW1jbGVhcihzZmJFbmVyZ3lQcmV2LCA2NCAqIHNpemVvZihpbnQpKTsKLSAgRkRLbWVtY2xlYXIoc2ZiRW5lcmd5QWN0LCAgNjQgKiBzaXplb2YoaW50KSk7CisgIEZES21lbWNsZWFyKHNmYkVuZXJneUFjdCwgNjQgKiBzaXplb2YoaW50KSk7CiAKLQotICBpZiAoIWZyYW1lT2spCi0gIHsKKyAgaWYgKCFmcmFtZU9rIHx8IG11dGVfcmVsZWFzZV9hY3RpdmUpIHsKICAgICAvKiBSZXN0b3JlIGxhc3QgZnJhbWUgZnJvbSBjb25jZWFsbWVudCBidWZmZXIgKi8KLSAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgICAgPSBwQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTaGFwZTsKKyAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgPSBwQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTaGFwZTsKICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBwQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTZXF1ZW5jZTsKIAogICAgIC8qIFJlc3RvcmUgc3BlY3RyYWwgZGF0YSAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVzUGVyRnJhbWU7IGkrKykgewotICAgICAgcFNwZWN0cmFsQ29lZmZpY2llbnRbaV0gPSBGWF9DTkNMMkZYX0RCTChwQ29uY2VhbG1lbnRJbmZvLT5zcGVjdHJhbENvZWZmaWNpZW50W2ldKTsKKyAgICAgIHBTcGVjdHJhbENvZWZmaWNpZW50W2ldID0KKyAgICAgICAgICBGWF9DTkNMMkZYX0RCTChwQ29uY2VhbG1lbnRJbmZvLT5zcGVjdHJhbENvZWZmaWNpZW50W2ldKTsKICAgICB9CiAKICAgICAvKiBSZXN0b3JlIHNjYWxlIGZhY3RvcnMgKi8KLSAgICBGREttZW1jcHkocFNwZWNTY2FsZSwgcENvbmNlYWxtZW50SW5mby0+c3BlY1NjYWxlLCA4KnNpemVvZihTSE9SVCkpOworICAgIEZES21lbWNweShwU3BlY1NjYWxlLCBwQ29uY2VhbG1lbnRJbmZvLT5zcGVjU2NhbGUsIDggKiBzaXplb2YoU0hPUlQpKTsKICAgfQogCiAgIC8qIGlmIHByZXZpb3VzIGZyYW1lIHdhcyBub3Qgb2sgKi8KLSAgaWYgKCFwQ29uY2VhbG1lbnRJbmZvLT5wcmV2RnJhbWVPa1sxXSkgewotCisgIGlmICghcENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMV0gfHwgbXV0ZV9yZWxlYXNlX2FjdGl2ZSkgewogICAgIC8qIGlmIGN1cnJlbnQgZnJhbWUgKGZfbikgaXMgb2sgYW5kIHRoZSBsYXN0IGJ1dCBvbmUgZnJhbWUgKGZfKG4tMikpCiAgICAgICAgd2FzIG9rLCB0b28sIHRoZW4gaW50ZXJwb2xhdGUgYm90aCBmcmFtZXMgaW4gb3JkZXIgdG8gZ2VuZXJhdGUKICAgICAgICB0aGUgY3VycmVudCBvdXRwdXQgZnJhbWUgKGZfKG4tMSkpLiBPdGhlcndpc2UsIHVzZSB0aGUgbGFzdCBzdG9yZWQKICAgICAgICBmcmFtZSAoZl8obi0yKSBvciBmXyhuLTMpIG9yIC4uLikuICovCi0gICAgaWYgKGZyYW1lT2sgJiYgcENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMF0pCi0gICAgeworICAgIGlmIChmcmFtZU9rICYmIHBDb25jZWFsbWVudEluZm8tPnByZXZGcmFtZU9rWzBdICYmICFtdXRlX3JlbGVhc2VfYWN0aXZlKSB7CiAgICAgICBhcHBsaWVkUHJvY2Vzc2luZyA9IDE7CiAKLQotICAgICAgLyogSW50ZXJwb2xhdGUgYm90aCBmcmFtZXMgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGN1cnJlbnQgb3V0cHV0IGZyYW1lIChmXyhuLTEpKS4gKi8KLSAgICAgIGlmIChwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPT0gRWlnaHRTaG9ydFNlcXVlbmNlKSB7Ci0gICAgICAgIC8qIGZfKG4tMikgPT0gRWlnaHRTaG9ydFNlcXVlbmNlICovCisgICAgICAvKiBJbnRlcnBvbGF0ZSBib3RoIGZyYW1lcyBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgY3VycmVudCBvdXRwdXQgZnJhbWUKKyAgICAgICAqIChmXyhuLTEpKS4gKi8KKyAgICAgIGlmIChwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPT0gQkxPQ0tfU0hPUlQpIHsKKyAgICAgICAgLyogZl8obi0yKSA9PSBCTE9DS19TSE9SVCAqLwogICAgICAgICAvKiBzaG9ydC0tPz8/Pz8/LS1zaG9ydCwgc2hvcnQtLT8/Pz8/Py0tbG9uZyBpbnRlcnBvbGF0aW9uICovCiAgICAgICAgIC8qIHNob3J0LS1zaG9ydC0tLXNob3J0LCBzaG9ydC0tLWxvbmctLS1sb25nIGludGVycG9sYXRpb24gKi8KIAogICAgICAgICBpbnQgd25kOwogCi0gICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTZXF1ZW5jZSA9PSBFaWdodFNob3J0U2VxdWVuY2UpIHsgLyogZl9uID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSAqLworICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2UgPT0KKyAgICAgICAgICAgIEJMT0NLX1NIT1JUKSB7IC8qIGZfbiA9PSBCTE9DS19TSE9SVCAqLwogICAgICAgICAgIC8qIHNob3J0LS1zaG9ydC0tLXNob3J0IGludGVycG9sYXRpb24gKi8KIAotICAgICAgICAgIGludCBzY2FsZUZhY3RvckJhbmRzVG90YWwgPSBwU2FtcGxpbmdSYXRlSW5mby0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX1Nob3J0OwotICAgICAgICAgIGNvbnN0IFNIT1JUICpwU2ZiT2Zmc2V0ICAgPSBwU2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19TaG9ydDsKLSAgICAgICAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgPSAxOwotICAgICAgICAgIHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSA9IEVpZ2h0U2hvcnRTZXF1ZW5jZTsKKyAgICAgICAgICBpbnQgc2NhbGVGYWN0b3JCYW5kc1RvdGFsID0KKyAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8tPk51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19TaG9ydDsKKyAgICAgICAgICBjb25zdCBTSE9SVCAqcFNmYk9mZnNldCA9IHBTYW1wbGluZ1JhdGVJbmZvLT5TY2FsZUZhY3RvckJhbmRzX1Nob3J0OworICAgICAgICAgIHBJY3NJbmZvLT5XaW5kb3dTaGFwZSA9IChzYW1wbGVzUGVyRnJhbWUgPD0gNTEyKSA/IDIgOiAxOworICAgICAgICAgIHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSA9IEJMT0NLX1NIT1JUOwogCi0gICAgICAgICAgZm9yICh3bmQgPSAwOyB3bmQgPCA4OyB3bmQrKykKLSAgICAgICAgICB7CisgICAgICAgICAgZm9yICh3bmQgPSAwOyB3bmQgPCA4OyB3bmQrKykgewogICAgICAgICAgICAgQ0NvbmNlYWxtZW50X0NhbGNCYW5kRW5lcmd5KAotICAgICAgICAgICAgICAmcFNwZWN0cmFsQ29lZmZpY2llbnRbd25kICogKHNhbXBsZXNQZXJGcmFtZSAvIDgpXSwgLyogc3BlY18obi0yKSAqLwotICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICBFaWdodFNob3J0U2VxdWVuY2UsCi0gICAgICAgICAgICAgICBDQ29uY2VhbG1lbnRfTm9FeHBhbmQsCi0gICAgICAgICAgICAgICBzZmJFbmVyZ3lQcmV2KTsKKyAgICAgICAgICAgICAgICAmcFNwZWN0cmFsQ29lZmZpY2llbnRbd25kICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNhbXBsZXNQZXJGcmFtZSAvIDgpXSwgLyogc3BlY18obi0yKSAqLworICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLCBCTE9DS19TSE9SVCwgQ0NvbmNlYWxtZW50X05vRXhwYW5kLAorICAgICAgICAgICAgICAgIHNmYkVuZXJneVByZXYpOwogCiAgICAgICAgICAgICBDQ29uY2VhbG1lbnRfQ2FsY0JhbmRFbmVyZ3koCi0gICAgICAgICAgICAgICZwQ29uY2VhbG1lbnRJbmZvLT5zcGVjdHJhbENvZWZmaWNpZW50W3duZCAqIChzYW1wbGVzUGVyRnJhbWUgLyA4KV0sIC8qIHNwZWNfbiAqLwotICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICBFaWdodFNob3J0U2VxdWVuY2UsCi0gICAgICAgICAgICAgICBDQ29uY2VhbG1lbnRfTm9FeHBhbmQsCi0gICAgICAgICAgICAgICBzZmJFbmVyZ3lBY3QpOworICAgICAgICAgICAgICAgICZwQ29uY2VhbG1lbnRJbmZvLT5zcGVjdHJhbENvZWZmaWNpZW50W3duZCAqIChzYW1wbGVzUGVyRnJhbWUgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4KV0sIC8qIHNwZWNfbiAqLworICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLCBCTE9DS19TSE9SVCwgQ0NvbmNlYWxtZW50X05vRXhwYW5kLAorICAgICAgICAgICAgICAgIHNmYkVuZXJneUFjdCk7CiAKICAgICAgICAgICAgIENDb25jZWFsbWVudF9JbnRlcnBvbGF0ZUJ1ZmZlcigKLSAgICAgICAgICAgICAgJnBTcGVjdHJhbENvZWZmaWNpZW50W3duZCAqIChzYW1wbGVzUGVyRnJhbWUgLyA4KV0sIC8qIHNwZWNfKG4tMSkgKi8KLSAgICAgICAgICAgICAgJnBTcGVjU2NhbGVbd25kXSwKLSAgICAgICAgICAgICAgJnBDb25jZWFsbWVudEluZm8tPnNwZWNTY2FsZVt3bmRdLAotICAgICAgICAgICAgICAmcFNwZWNTY2FsZVt3bmRdLAotICAgICAgICAgICAgICAgc2ZiRW5lcmd5UHJldiwKLSAgICAgICAgICAgICAgIHNmYkVuZXJneUFjdCwKLSAgICAgICAgICAgICAgIHNjYWxlRmFjdG9yQmFuZHNUb3RhbCwKLSAgICAgICAgICAgICAgIHBTZmJPZmZzZXQpOwotCisgICAgICAgICAgICAgICAgJnBTcGVjdHJhbENvZWZmaWNpZW50W3duZCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzYW1wbGVzUGVyRnJhbWUgLyA4KV0sIC8qIHNwZWNfKG4tMSkgKi8KKyAgICAgICAgICAgICAgICAmcFNwZWNTY2FsZVt3bmRdLCAmcENvbmNlYWxtZW50SW5mby0+c3BlY1NjYWxlW3duZF0sCisgICAgICAgICAgICAgICAgJnBTcGVjU2NhbGVbd25kXSwgc2ZiRW5lcmd5UHJldiwgc2ZiRW5lcmd5QWN0LAorICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9yQmFuZHNUb3RhbCwgcFNmYk9mZnNldCk7CiAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAvKiBmX24gIT0gRWlnaHRTaG9ydFNlcXVlbmNlICovCisgICAgICAgIH0gZWxzZSB7IC8qIGZfbiAhPSBCTE9DS19TSE9SVCAqLwogICAgICAgICAgIC8qIHNob3J0LS0tbG9uZy0tLWxvbmcgaW50ZXJwb2xhdGlvbiAqLwogCi0gICAgICAgICAgaW50IHNjYWxlRmFjdG9yQmFuZHNUb3RhbCA9IHBTYW1wbGluZ1JhdGVJbmZvLT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfTG9uZzsKLSAgICAgICAgICBjb25zdCBTSE9SVCAqcFNmYk9mZnNldCAgID0gcFNhbXBsaW5nUmF0ZUluZm8tPlNjYWxlRmFjdG9yQmFuZHNfTG9uZzsKKyAgICAgICAgICBpbnQgc2NhbGVGYWN0b3JCYW5kc1RvdGFsID0KKyAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8tPk51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19Mb25nOworICAgICAgICAgIGNvbnN0IFNIT1JUICpwU2ZiT2Zmc2V0ID0gcFNhbXBsaW5nUmF0ZUluZm8tPlNjYWxlRmFjdG9yQmFuZHNfTG9uZzsKICAgICAgICAgICBTSE9SVCBzcGVjU2NhbGVPdXQ7CiAKLSAgICAgICAgICBDQ29uY2VhbG1lbnRfQ2FsY0JhbmRFbmVyZ3koJnBTcGVjdHJhbENvZWZmaWNpZW50W3NhbXBsZXNQZXJGcmFtZSAtIChzYW1wbGVzUGVyRnJhbWUgLyA4KV0sIC8qIFt3bmRdIHNwZWNfKG4tMikgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVpZ2h0U2hvcnRTZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NvbmNlYWxtZW50X0V4cGFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5QWN0KTsKKyAgICAgICAgICBDQ29uY2VhbG1lbnRfQ2FsY0JhbmRFbmVyZ3koCisgICAgICAgICAgICAgICZwU3BlY3RyYWxDb2VmZmljaWVudFtzYW1wbGVzUGVyRnJhbWUgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNhbXBsZXNQZXJGcmFtZSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCldLCAvKiBbd25kXSBzcGVjXyhuLTIpICovCisgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLCBCTE9DS19TSE9SVCwgQ0NvbmNlYWxtZW50X0V4cGFuZCwKKyAgICAgICAgICAgICAgc2ZiRW5lcmd5QWN0KTsKIAotICAgICAgICAgIENDb25jZWFsbWVudF9DYWxjQmFuZEVuZXJneShwQ29uY2VhbG1lbnRJbmZvLT5zcGVjdHJhbENvZWZmaWNpZW50LCAvKiBzcGVjX24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHlMb25nU2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDb25jZWFsbWVudF9Ob0V4cGFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5UHJldik7CisgICAgICAgICAgQ0NvbmNlYWxtZW50X0NhbGNCYW5kRW5lcmd5KAorICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5zcGVjdHJhbENvZWZmaWNpZW50LCAvKiBzcGVjX24gKi8KKyAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sIEJMT0NLX0xPTkcsIENDb25jZWFsbWVudF9Ob0V4cGFuZCwKKyAgICAgICAgICAgICAgc2ZiRW5lcmd5UHJldik7CiAKICAgICAgICAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgPSAwOwotICAgICAgICAgIHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSA9IExvbmdTdG9wU2VxdWVuY2U7CisgICAgICAgICAgcEljc0luZm8tPldpbmRvd1NlcXVlbmNlID0gQkxPQ0tfU1RPUDsKIAotICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVzUGVyRnJhbWUgOyBpKyspIHsKLSAgICAgICAgICAgIHBTcGVjdHJhbENvZWZmaWNpZW50W2ldID0gcENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudFtpXTsgLyogc3BlY19uICovCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNhbXBsZXNQZXJGcmFtZTsgaSsrKSB7CisgICAgICAgICAgICBwU3BlY3RyYWxDb2VmZmljaWVudFtpXSA9CisgICAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudFtpXTsgLyogc3BlY19uICovCiAgICAgICAgICAgfQogCiAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeyAvKiBzZWFyY2ggZm9yIG1heChzcGVjU2NhbGUpICovCkBAIC0xMTMxLDE0ICs5ODgsOSBAQAogICAgICAgICAgIH0KIAogICAgICAgICAgIENDb25jZWFsbWVudF9JbnRlcnBvbGF0ZUJ1ZmZlcigKLSAgICAgICAgICAgIHBTcGVjdHJhbENvZWZmaWNpZW50LCAvKiBzcGVjXyhuLTEpICovCi0gICAgICAgICAgICZwQ29uY2VhbG1lbnRJbmZvLT5zcGVjU2NhbGVbMF0sCi0gICAgICAgICAgICZwU3BlY1NjYWxlWzBdLAotICAgICAgICAgICAmc3BlY1NjYWxlT3V0LAotICAgICAgICAgICAgc2ZiRW5lcmd5UHJldiwKLSAgICAgICAgICAgIHNmYkVuZXJneUFjdCwKLSAgICAgICAgICAgIHNjYWxlRmFjdG9yQmFuZHNUb3RhbCwKLSAgICAgICAgICAgIHBTZmJPZmZzZXQpOworICAgICAgICAgICAgICBwU3BlY3RyYWxDb2VmZmljaWVudCwgLyogc3BlY18obi0xKSAqLworICAgICAgICAgICAgICAmcENvbmNlYWxtZW50SW5mby0+c3BlY1NjYWxlWzBdLCAmcFNwZWNTY2FsZVswXSwgJnNwZWNTY2FsZU91dCwKKyAgICAgICAgICAgICAgc2ZiRW5lcmd5UHJldiwgc2ZiRW5lcmd5QWN0LCBzY2FsZUZhY3RvckJhbmRzVG90YWwsIHBTZmJPZmZzZXQpOwogCiAgICAgICAgICAgcFNwZWNTY2FsZVswXSA9IHNwZWNTY2FsZU91dDsKICAgICAgICAgfQpAQCAtMTE0NiwyMSArOTk4LDIxIEBACiAgICAgICAgIC8qIGxvbmctLT8/Pz8/Py0tc2hvcnQsIGxvbmctLT8/Pz8/Py0tbG9uZyBpbnRlcnBvbGF0aW9uICovCiAgICAgICAgIC8qIGxvbmctLS1sb25nLS0tc2hvcnQsIGxvbmctLS1sb25nLS0tbG9uZyBpbnRlcnBvbGF0aW9uICovCiAKLSAgICAgICAgaW50IHNjYWxlRmFjdG9yQmFuZHNUb3RhbCA9IHBTYW1wbGluZ1JhdGVJbmZvLT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfTG9uZzsKLSAgICAgICAgY29uc3QgU0hPUlQgKnBTZmJPZmZzZXQgICA9IHBTYW1wbGluZ1JhdGVJbmZvLT5TY2FsZUZhY3RvckJhbmRzX0xvbmc7Ci0gICAgICAgIFNIT1JUIHNwZWNTY2FsZUFjdCAgICAgICAgPSBwQ29uY2VhbG1lbnRJbmZvLT5zcGVjU2NhbGVbMF07CisgICAgICAgIGludCBzY2FsZUZhY3RvckJhbmRzVG90YWwgPQorICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8tPk51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19Mb25nOworICAgICAgICBjb25zdCBTSE9SVCAqcFNmYk9mZnNldCA9IHBTYW1wbGluZ1JhdGVJbmZvLT5TY2FsZUZhY3RvckJhbmRzX0xvbmc7CisgICAgICAgIFNIT1JUIHNwZWNTY2FsZUFjdCA9IHBDb25jZWFsbWVudEluZm8tPnNwZWNTY2FsZVswXTsKIAotICAgICAgICBDQ29uY2VhbG1lbnRfQ2FsY0JhbmRFbmVyZ3kocFNwZWN0cmFsQ29lZmZpY2llbnQsICAvKiBzcGVjXyhuLTIpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHlMb25nU2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ29uY2VhbG1lbnRfTm9FeHBhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lQcmV2KTsKKyAgICAgICAgQ0NvbmNlYWxtZW50X0NhbGNCYW5kRW5lcmd5KHBTcGVjdHJhbENvZWZmaWNpZW50LCAvKiBzcGVjXyhuLTIpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywgQkxPQ0tfTE9ORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDb25jZWFsbWVudF9Ob0V4cGFuZCwgc2ZiRW5lcmd5UHJldik7CiAKLSAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPndpbmRvd1NlcXVlbmNlID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkgeyAgLyogZl9uID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSAqLworICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2UgPT0KKyAgICAgICAgICAgIEJMT0NLX1NIT1JUKSB7IC8qIGZfbiA9PSBCTE9DS19TSE9SVCAqLwogICAgICAgICAgIC8qIGxvbmctLS1sb25nLS0tc2hvcnQgaW50ZXJwb2xhdGlvbiAqLwogCi0gICAgICAgICAgcEljc0luZm8tPldpbmRvd1NoYXBlID0gMTsKLSAgICAgICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBMb25nU3RhcnRTZXF1ZW5jZTsKKyAgICAgICAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgPSAoc2FtcGxlc1BlckZyYW1lIDw9IDUxMikgPyAyIDogMTsKKyAgICAgICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBCTE9DS19TVEFSVDsKIAogICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCA4OyBpKyspIHsgLyogc2VhcmNoIGZvciBtYXgoc3BlY1NjYWxlKSAqLwogICAgICAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPnNwZWNTY2FsZVtpXSA+IHNwZWNTY2FsZUFjdCkgewpAQCAtMTE2OSwzMTAgKzEwMjEsMjc3IEBACiAgICAgICAgICAgfQogCiAgICAgICAgICAgLyogRXhwYW5kIGZpcnN0IHNob3J0IHNwZWN0cnVtICovCi0gICAgICAgICAgQ0NvbmNlYWxtZW50X0NhbGNCYW5kRW5lcmd5KHBDb25jZWFsbWVudEluZm8tPnNwZWN0cmFsQ29lZmZpY2llbnQsICAvKiBzcGVjX24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVpZ2h0U2hvcnRTZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NvbmNlYWxtZW50X0V4cGFuZCwgIC8qICEhISAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lBY3QpOworICAgICAgICAgIENDb25jZWFsbWVudF9DYWxjQmFuZEVuZXJneSgKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudCwgICAgICAgICAgICAgICAvKiBzcGVjX24gKi8KKyAgICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8sIEJMT0NLX1NIT1JULCBDQ29uY2VhbG1lbnRfRXhwYW5kLCAvKiAhISEgKi8KKyAgICAgICAgICAgICAgc2ZiRW5lcmd5QWN0KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAvKiBsb25nLS0tbG9uZy0tLWxvbmcgaW50ZXJwb2xhdGlvbiAqLwogCiAgICAgICAgICAgcEljc0luZm8tPldpbmRvd1NoYXBlID0gMDsKLSAgICAgICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBPbmx5TG9uZ1NlcXVlbmNlOworICAgICAgICAgIHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSA9IEJMT0NLX0xPTkc7CiAKLSAgICAgICAgICBDQ29uY2VhbG1lbnRfQ2FsY0JhbmRFbmVyZ3kocENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudCwgIC8qIHNwZWNfbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seUxvbmdTZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NvbmNlYWxtZW50X05vRXhwYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lBY3QpOworICAgICAgICAgIENDb25jZWFsbWVudF9DYWxjQmFuZEVuZXJneSgKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+c3BlY3RyYWxDb2VmZmljaWVudCwgLyogc3BlY19uICovCisgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLCBCTE9DS19MT05HLCBDQ29uY2VhbG1lbnRfTm9FeHBhbmQsCisgICAgICAgICAgICAgIHNmYkVuZXJneUFjdCk7CiAgICAgICAgIH0KIAotICAgICAgICAgIENDb25jZWFsbWVudF9JbnRlcnBvbGF0ZUJ1ZmZlcigKLSAgICAgICAgICAgIHBTcGVjdHJhbENvZWZmaWNpZW50LCAgLyogc3BlY18obi0xKSAqLwotICAgICAgICAgICAmcFNwZWNTY2FsZVswXSwKLSAgICAgICAgICAgJnNwZWNTY2FsZUFjdCwKLSAgICAgICAgICAgJnBTcGVjU2NhbGVbMF0sCi0gICAgICAgICAgICBzZmJFbmVyZ3lQcmV2LAotICAgICAgICAgICAgc2ZiRW5lcmd5QWN0LAotICAgICAgICAgICAgc2NhbGVGYWN0b3JCYW5kc1RvdGFsLAotICAgICAgICAgICAgcFNmYk9mZnNldCk7Ci0KKyAgICAgICAgQ0NvbmNlYWxtZW50X0ludGVycG9sYXRlQnVmZmVyKAorICAgICAgICAgICAgcFNwZWN0cmFsQ29lZmZpY2llbnQsIC8qIHNwZWNfKG4tMSkgKi8KKyAgICAgICAgICAgICZwU3BlY1NjYWxlWzBdLCAmc3BlY1NjYWxlQWN0LCAmcFNwZWNTY2FsZVswXSwgc2ZiRW5lcmd5UHJldiwKKyAgICAgICAgICAgIHNmYkVuZXJneUFjdCwgc2NhbGVGYWN0b3JCYW5kc1RvdGFsLCBwU2ZiT2Zmc2V0KTsKICAgICAgIH0KICAgICB9CiAKLSAgICAgIC8qIE5vaXNlIHN1YnN0aXR1dGlvbiBvZiBzaWduIG9mIHRoZSBvdXRwdXQgc3BlY3RyYWwgY29lZmZpY2llbnRzICovCi0gICAgICBDQ29uY2VhbG1lbnRfQXBwbHlSYW5kb21TaWduIChwQ29uY2VhbG1lbnRJbmZvLT5pUmFuZG9tUGhhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3BlY3RyYWxDb2VmZmljaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSk7Ci0gICAgICAvKiBJbmNyZW1lbnQgcmFuZG9tIHBoYXNlIGluZGV4IHRvIGF2b2lkIHJlcGV0aXRpb24gYXJ0aWZhY3RzLiAqLwotICAgICAgcENvbmNlYWxtZW50SW5mby0+aVJhbmRvbVBoYXNlID0gKHBDb25jZWFsbWVudEluZm8tPmlSYW5kb21QaGFzZSArIDEpICYgKEFBQ19ORl9OT19SQU5ET01fVkFMIC0gMSk7CisgICAgLyogTm9pc2Ugc3Vic3RpdHV0aW9uIG9mIHNpZ24gb2YgdGhlIG91dHB1dCBzcGVjdHJhbCBjb2VmZmljaWVudHMgKi8KKyAgICBDQ29uY2VhbG1lbnRfQXBwbHlSYW5kb21TaWduKHBDb25jZWFsbWVudEluZm8tPmlSYW5kb21QaGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGVjdHJhbENvZWZmaWNpZW50LCBzYW1wbGVzUGVyRnJhbWUpOworICAgIC8qIEluY3JlbWVudCByYW5kb20gcGhhc2UgaW5kZXggdG8gYXZvaWQgcmVwZXRpdGlvbiBhcnRpZmFjdHMuICovCisgICAgcENvbmNlYWxtZW50SW5mby0+aVJhbmRvbVBoYXNlID0KKyAgICAgICAgKHBDb25jZWFsbWVudEluZm8tPmlSYW5kb21QaGFzZSArIDEpICYgKEFBQ19ORl9OT19SQU5ET01fVkFMIC0gMSk7CiAgIH0KIAogICAvKiBzY2FsZSBzcGVjdHJ1bSBhY2NvcmRpbmcgdG8gY29uY2VhbG1lbnQgc3RhdGUgKi8KLSAgc3dpdGNoIChwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUpCi0gIHsKLSAgY2FzZSBDb25jZWFsU3RhdGVfU2luZ2xlOgotICAgIGFwcGxpZWRQcm9jZXNzaW5nID0gMTsKLSAgICBicmVhazsKLQotICBjYXNlIENvbmNlYWxTdGF0ZV9GYWRlT3V0OgotICAgIHsKLSAgICAgIEZES19BU1NFUlQocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA+PSAwKTsKLSAgICAgIEZES19BU1NFUlQocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA8IENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlMpOwotICAgICAgRkRLX0FTU0VSVChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzIDwgcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlT3V0RnJhbWVzKTsKLQotICAgICAgLyogcmVzdG9yZSBmcmVxdWVuY3kgY29lZmZpY2llbnRzIGZyb20gYnVmZmVyIHdpdGggYSBzcGVjaWZpYyBtdXRpbmcgKi8KLSAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwT3V0ID0gJnBTcGVjdHJhbENvZWZmaWNpZW50W3NhbXBsZXNQZXJGcmFtZS0xXTsKLSAgICAgIEZJWFBfU0dMIGZhYyA9IHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZU91dEZhY3RvcltwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzXTsKLQotICAgICAgZm9yIChpID0gc2FtcGxlc1BlckZyYW1lOyBpICE9IDA7IGktLSkgewotICAgICAgICAqcE91dCA9IGZNdWx0KCpwT3V0LCBmYWMpOwotICAgICAgICBwT3V0LS07Ci0gICAgICB9CisgIHN3aXRjaCAocENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlKSB7CisgICAgY2FzZSBDb25jZWFsU3RhdGVfU2luZ2xlOgogICAgICAgYXBwbGllZFByb2Nlc3NpbmcgPSAxOwotICAgIH0KLSAgICBicmVhazsKKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgQ29uY2VhbFN0YXRlX0ZhZGVJbjoKLSAgICB7CisgICAgY2FzZSBDb25jZWFsU3RhdGVfRmFkZU91dDogewogICAgICAgRkRLX0FTU0VSVChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID49IDApOwotICAgICAgRkRLX0FTU0VSVChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzIDwgQ09OQ0VBTF9NQVhfTlVNX0ZBREVfRkFDVE9SUyk7Ci0gICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPCBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVJbkZyYW1lcyk7CisgICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPAorICAgICAgICAgICAgICAgICBDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTKTsKKyAgICAgIEZES19BU1NFUlQocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA8CisgICAgICAgICAgICAgICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZU91dEZyYW1lcyk7CiAKLSAgICAgIC8qIGF0dGVudWF0ZSBzaWduYWwgdG8gZ2V0IGEgc21vb3RoIGZhZGUtaW4gKi8KLSAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwT3V0ID0gJnBTcGVjdHJhbENvZWZmaWNpZW50W3NhbXBsZXNQZXJGcmFtZS0xXTsKLSAgICAgIEZJWFBfU0dMIGZhYyA9IHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZUluRmFjdG9yW3BDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXNdOworICAgICAgLyogVGltZURvbWFpbkZhZGluZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIEF0dGVudWF0aW9uIG9mIHNpZ25hbCBpcyBkb25lIGluIENDb25jZWFsbWVudF9UREZhZGluZygpICovCiAKLSAgICAgIGZvciAoaSA9IHNhbXBsZXNQZXJGcmFtZTsgaSAhPSAwOyBpLS0pIHsKLSAgICAgICAgKnBPdXQgPSBmTXVsdCgqcE91dCwgZmFjKTsKLSAgICAgICAgcE91dC0tOwotICAgICAgfQogICAgICAgYXBwbGllZFByb2Nlc3NpbmcgPSAxOwotICAgIH0KLSAgICBicmVhazsKKyAgICB9IGJyZWFrOwogCi0gIGNhc2UgQ29uY2VhbFN0YXRlX011dGU6Ci0gICAgewotICAgICAgaW50IGZhYyA9IHBDb25jZWFsQ29tbW9uRGF0YS0+Y29tZm9ydE5vaXNlTGV2ZWw7CisgICAgY2FzZSBDb25jZWFsU3RhdGVfRmFkZUluOiB7CisgICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPj0gMCk7CisgICAgICBGREtfQVNTRVJUKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPAorICAgICAgICAgICAgICAgICBDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTKTsKKyAgICAgIEZES19BU1NFUlQocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA8CisgICAgICAgICAgICAgICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZUluRnJhbWVzKTsKIAorICAgICAgLyogVGltZURvbWFpbkZhZGluZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIEF0dGVudWF0aW9uIG9mIHNpZ25hbCBpcyBkb25lIGluIENDb25jZWFsbWVudF9UREZhZGluZygpICovCisKKyAgICAgIGFwcGxpZWRQcm9jZXNzaW5nID0gMTsKKyAgICB9IGJyZWFrOworCisgICAgY2FzZSBDb25jZWFsU3RhdGVfTXV0ZTogewogICAgICAgLyogc2V0IGR1bW15IHdpbmRvdyBwYXJhbWV0ZXJzICovCi0gICAgICBwSWNzSW5mby0+VmFsaWQgICAgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJpZ2dlciB0aGUgZ2VuZXJhdGlvbiBvZiBhIGNvbnNpdGVudCBJY3NJbmZvICovCi0gICAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgICAgPSBwQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTaGFwZTsgICAgLyogUHJldmVudCBhbiBpbnZhbGlkIFdpbmRvd1NoYXBlIChyZXF1aXJlZCBmb3IgRi9UIHRyYW5zZm9ybSkgKi8KLSAgICAgIHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZSA9IENDb25jZWFsbWVudF9HZXRXaW5TZXEocENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2UpOwotICAgICAgcENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2UgPSBwSWNzSW5mby0+V2luZG93U2VxdWVuY2U7IC8qIFN0b3JlIGZvciBuZXh0IGZyYW1lIChzcGVjdHJ1bSBpbiBjb25jZWFsbWVudCBidWZmZXIgY2FuJ3QgYmUgdXNlZCBhdCBhbGwpICovCisgICAgICBwSWNzSW5mby0+VmFsaWQgPSAwOyAvKiBUcmlnZ2VyIHRoZSBnZW5lcmF0aW9uIG9mIGEgY29uc2l0ZW50IEljc0luZm8gKi8KKyAgICAgIHBJY3NJbmZvLT5XaW5kb3dTaGFwZSA9CisgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+d2luZG93U2hhcGU7IC8qIFByZXZlbnQgYW4gaW52YWxpZCBXaW5kb3dTaGFwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVxdWlyZWQgZm9yIEYvVCB0cmFuc2Zvcm0pICovCisgICAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPQorICAgICAgICAgIENDb25jZWFsbWVudF9HZXRXaW5TZXEocENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2UpOworICAgICAgcENvbmNlYWxtZW50SW5mby0+d2luZG93U2VxdWVuY2UgPQorICAgICAgICAgIHBJY3NJbmZvLT5XaW5kb3dTZXF1ZW5jZTsgLyogU3RvcmUgZm9yIG5leHQgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcGVjdHJ1bSBpbiBjb25jZWFsbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGNhbid0IGJlIHVzZWQgYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCkgKi8KIAogICAgICAgLyogbXV0ZSBzcGVjdHJhbCBkYXRhICovCiAgICAgICBGREttZW1jbGVhcihwU3BlY3RyYWxDb2VmZmljaWVudCwgc2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKLSAgICAgIGlmIChmYWMgPj0gMCAmJiBmYWMgPD0gNjEpIHsKLSAgICAgICAgLyogaW5zZXJ0IGNvbWZvcnQgbm9pc2UgdXNpbmcgUE5TICovCi0gICAgICAgIENDb25jZWFsbWVudF9mYWtlUG5zRGF0YSAoCi0gICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS5hYWMuUG5zRGF0YSwKLSAgICAgICAgICBwSWNzSW5mbywKLSAgICAgICAgICBwU2FtcGxpbmdSYXRlSW5mbywKLSAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGUsCi0gICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvciwKLSAgICAgICAgICBmYWMKLSAgICAgICAgKTsKLQotICAgICAgICBDUG5zX0FwcGx5ICgKLSAgICAgICAgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLmFhYy5QbnNEYXRhLAotICAgICAgICAgICAgICAgIHBJY3NJbmZvLAotICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBTcGVjdHJhbENvZWZmaWNpZW50LAotICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZSwKLSAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yLAotICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgMCAgLyogYWx3YXlzIGFwcGx5IHRvIGZpcnN0IGNoYW5uZWwgKi8KLSAgICAgICAgICAgICAgKTsKLSAgICAgIH0KICAgICAgIGFwcGxpZWRQcm9jZXNzaW5nID0gMTsKLSAgICB9Ci0gICAgYnJlYWs7CisgICAgfSBicmVhazsKIAotICBkZWZhdWx0OgotICAgIC8qIG5vdGhpbmcgdG8gZG8gaGVyZSAqLwotICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBub3RoaW5nIHRvIGRvIGhlcmUgKi8KKyAgICAgIGJyZWFrOwogICB9CiAKICAgcmV0dXJuIGFwcGxpZWRQcm9jZXNzaW5nOwogfQogCi0KIC8qIQogICBcYnJpZWYgQ2FsY3VsYXRlIHRoZSBzcGVjdHJhbCBlbmVyZ3kKIAogICBUaGUgZnVuY3Rpb24gY2FsY3VsYXRlcyBiYW5kLXdpc2UgdGhlIHNwZWN0cmFsIGVuZXJneS4gVGhpcyBpcyB1c2VkIGZvcgogICBmcmFtZSBpbnRlcnBvbGF0aW9uLgotCi0gIFxyZXR1cm4gIG5vbmUKICovCi1zdGF0aWMgdm9pZAotICBDQ29uY2VhbG1lbnRfQ2FsY0JhbmRFbmVyZ3kgKAotICAgIEZJWFBfREJMICAgICAgICAgICAgICAgKnNwZWN0cnVtLAotICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAotICAgIGNvbnN0IGludCAgICAgICAgICAgICAgIGJsb2NrVHlwZSwKLSAgICBDQ29uY2VhbG1lbnRFeHBhbmRUeXBlICBleHBhbmRUeXBlLAotICAgIGludCAgICAgICAgICAgICAgICAgICAgKnNmYkVuZXJneSApCi17CitzdGF0aWMgdm9pZCBDQ29uY2VhbG1lbnRfQ2FsY0JhbmRFbmVyZ3koCisgICAgRklYUF9EQkwgKnNwZWN0cnVtLCBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywKKyAgICBjb25zdCBpbnQgYmxvY2tUeXBlLCBDQ29uY2VhbG1lbnRFeHBhbmRUeXBlIGV4cGFuZFR5cGUsIGludCAqc2ZiRW5lcmd5KSB7CiAgIGNvbnN0IFNIT1JUICpwU2ZiT2Zmc2V0OwogICBpbnQgbGluZSwgc2ZiLCBzY2FsZUZhY3RvckJhbmRzVG90YWwgPSAwOwotICAKLSAgLyogSW4gdGhlIGZvbGxvd2luZyBjYWxjdWxhdGlvbnMsIGVuQWNjdSBpcyBpbml0aWFsaXplZCB3aXRoIExTQi12YWx1ZSBpbiBvcmRlciB0byBhdm9pZCB6ZXJvIGVuZXJneS1sZXZlbCAqLworCisgIC8qIEluIHRoZSBmb2xsb3dpbmcgY2FsY3VsYXRpb25zLCBlbkFjY3UgaXMgaW5pdGlhbGl6ZWQgd2l0aCBMU0ItdmFsdWUgaW4KKyAgICogb3JkZXIgdG8gYXZvaWQgemVybyBlbmVyZ3ktbGV2ZWwgKi8KIAogICBsaW5lID0gMDsKIAotICBzd2l0Y2goYmxvY2tUeXBlKSB7CisgIHN3aXRjaCAoYmxvY2tUeXBlKSB7CisgICAgY2FzZSBCTE9DS19MT05HOgorICAgIGNhc2UgQkxPQ0tfU1RBUlQ6CisgICAgY2FzZSBCTE9DS19TVE9QOgogCi0gIGNhc2UgT25seUxvbmdTZXF1ZW5jZToKLSAgY2FzZSBMb25nU3RhcnRTZXF1ZW5jZToKLSAgY2FzZSBMb25nU3RvcFNlcXVlbmNlOgorICAgICAgaWYgKGV4cGFuZFR5cGUgPT0gQ0NvbmNlYWxtZW50X05vRXhwYW5kKSB7CisgICAgICAgIC8qIHN0YW5kYXJkIGxvbmcgY2FsY3VsYXRpb24gKi8KKyAgICAgICAgc2NhbGVGYWN0b3JCYW5kc1RvdGFsID0KKyAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfTG9uZzsKKyAgICAgICAgcFNmYk9mZnNldCA9IHBTYW1wbGluZ1JhdGVJbmZvLT5TY2FsZUZhY3RvckJhbmRzX0xvbmc7CiAKLSAgICBpZiAoZXhwYW5kVHlwZSA9PSBDQ29uY2VhbG1lbnRfTm9FeHBhbmQpIHsKLSAgICAgIC8qIHN0YW5kYXJkIGxvbmcgY2FsY3VsYXRpb24gKi8KLSAgICAgIHNjYWxlRmFjdG9yQmFuZHNUb3RhbCA9IHBTYW1wbGluZ1JhdGVJbmZvLT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfTG9uZzsKLSAgICAgIHBTZmJPZmZzZXQgICAgICAgICAgICA9IHBTYW1wbGluZ1JhdGVJbmZvLT5TY2FsZUZhY3RvckJhbmRzX0xvbmc7Ci0KLSAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2NhbGVGYWN0b3JCYW5kc1RvdGFsOyBzZmIrKykgewotICAgICAgICBGSVhQX0RCTCBlbkFjY3UgPSAoRklYUF9EQkwpKExPTkcpMTsKLSAgICAgICAgaW50IHNmYlNjYWxlID0gKHNpemVvZihMT05HKTw8MykgLSBDbnRMZWFkaW5nWmVyb3MocFNmYk9mZnNldFtzZmIrMV0gLSBwU2ZiT2Zmc2V0W3NmYl0pIC0gMTsKLSAgICAgICAgLyogc2NhbGluZyBkZXBlbmRzIG9uIHNmYiB3aWR0aC4gKi8KLSAgICAgICAgZm9yICggOyBsaW5lIDwgcFNmYk9mZnNldFtzZmIrMV07IGxpbmUrKykgewotICAgICAgICAgIGVuQWNjdSArPSBmUG93MkRpdjIoKihzcGVjdHJ1bSArIGxpbmUpKSA+PiBzZmJTY2FsZTsKKyAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzY2FsZUZhY3RvckJhbmRzVG90YWw7IHNmYisrKSB7CisgICAgICAgICAgRklYUF9EQkwgZW5BY2N1ID0gKEZJWFBfREJMKShMT05HKTE7CisgICAgICAgICAgaW50IHNmYlNjYWxlID0KKyAgICAgICAgICAgICAgKHNpemVvZihMT05HKSA8PCAzKSAtCisgICAgICAgICAgICAgIENudExlYWRpbmdaZXJvcyhwU2ZiT2Zmc2V0W3NmYiArIDFdIC0gcFNmYk9mZnNldFtzZmJdKSAtIDE7CisgICAgICAgICAgLyogc2NhbGluZyBkZXBlbmRzIG9uIHNmYiB3aWR0aC4gKi8KKyAgICAgICAgICBmb3IgKDsgbGluZSA8IHBTZmJPZmZzZXRbc2ZiICsgMV07IGxpbmUrKykgeworICAgICAgICAgICAgZW5BY2N1ICs9IGZQb3cyRGl2MigqKHNwZWN0cnVtICsgbGluZSkpID4+IHNmYlNjYWxlOworICAgICAgICAgIH0KKyAgICAgICAgICAqKHNmYkVuZXJneSArIHNmYikgPSBDbnRMZWFkaW5nWmVyb3MoZW5BY2N1KSAtIDE7CiAgICAgICAgIH0KLSAgICAgICAgKihzZmJFbmVyZ3kgKyBzZmIpID0gQ250TGVhZGluZ1plcm9zKGVuQWNjdSkgLSAxOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8qIGNvbXByZXNzIGxvbmcgdG8gc2hvcnQgKi8KLSAgICAgIHNjYWxlRmFjdG9yQmFuZHNUb3RhbCA9IHBTYW1wbGluZ1JhdGVJbmZvLT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQ7Ci0gICAgICBwU2ZiT2Zmc2V0ICAgICAgICAgICAgPSBwU2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19TaG9ydDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGNvbXByZXNzIGxvbmcgdG8gc2hvcnQgKi8KKyAgICAgICAgc2NhbGVGYWN0b3JCYW5kc1RvdGFsID0KKyAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQ7CisgICAgICAgIHBTZmJPZmZzZXQgPSBwU2FtcGxpbmdSYXRlSW5mby0+U2NhbGVGYWN0b3JCYW5kc19TaG9ydDsKIAotICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzY2FsZUZhY3RvckJhbmRzVG90YWw7IHNmYisrKSB7Ci0gICAgICAgIEZJWFBfREJMIGVuQWNjdSA9IChGSVhQX0RCTCkoTE9ORykxOwotICAgICAgICBpbnQgc2ZiU2NhbGUgPSAoc2l6ZW9mKExPTkcpPDwzKSAtIENudExlYWRpbmdaZXJvcyhwU2ZiT2Zmc2V0W3NmYisxXSAtIHBTZmJPZmZzZXRbc2ZiXSkgLSAxOwotICAgICAgICAvKiBzY2FsaW5nIGRlcGVuZHMgb24gc2ZiIHdpZHRoLiAqLwotICAgICAgICBmb3IgKDsgbGluZSA8IHBTZmJPZmZzZXRbc2ZiKzFdIDw8IDM7IGxpbmUrKykgewotICAgICAgICAgIGVuQWNjdSArPSAoZW5BY2N1ICsgKGZQb3cyRGl2MigqKHNwZWN0cnVtICsgbGluZSkpID4+IHNmYlNjYWxlKSkgPj4gMzsKKyAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzY2FsZUZhY3RvckJhbmRzVG90YWw7IHNmYisrKSB7CisgICAgICAgICAgRklYUF9EQkwgZW5BY2N1ID0gKEZJWFBfREJMKShMT05HKTE7CisgICAgICAgICAgaW50IHNmYlNjYWxlID0KKyAgICAgICAgICAgICAgKHNpemVvZihMT05HKSA8PCAzKSAtCisgICAgICAgICAgICAgIENudExlYWRpbmdaZXJvcyhwU2ZiT2Zmc2V0W3NmYiArIDFdIC0gcFNmYk9mZnNldFtzZmJdKSAtIDE7CisgICAgICAgICAgLyogc2NhbGluZyBkZXBlbmRzIG9uIHNmYiB3aWR0aC4gKi8KKyAgICAgICAgICBmb3IgKDsgbGluZSA8IHBTZmJPZmZzZXRbc2ZiICsgMV0gPDwgMzsgbGluZSsrKSB7CisgICAgICAgICAgICBlbkFjY3UgKz0KKyAgICAgICAgICAgICAgICAoZW5BY2N1ICsgKGZQb3cyRGl2MigqKHNwZWN0cnVtICsgbGluZSkpID4+IHNmYlNjYWxlKSkgPj4gMzsKKyAgICAgICAgICB9CisgICAgICAgICAgKihzZmJFbmVyZ3kgKyBzZmIpID0gQ250TGVhZGluZ1plcm9zKGVuQWNjdSkgLSAxOwogICAgICAgICB9Ci0gICAgICAgICooc2ZiRW5lcmd5ICsgc2ZiKSA9IENudExlYWRpbmdaZXJvcyhlbkFjY3UpIC0gMTsKICAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7CisgICAgICBicmVhazsKIAotICBjYXNlIEVpZ2h0U2hvcnRTZXF1ZW5jZToKKyAgICBjYXNlIEJMT0NLX1NIT1JUOgogCi0gICAgaWYgKGV4cGFuZFR5cGUgPT0gQ0NvbmNlYWxtZW50X05vRXhwYW5kKSB7Ci0gICAgICAvKiAgIHN0YW5kYXJkIHNob3J0IGNhbGN1bGF0aW9uICovCi0gICAgICBzY2FsZUZhY3RvckJhbmRzVG90YWwgPSBwU2FtcGxpbmdSYXRlSW5mby0+TnVtYmVyT2ZTY2FsZUZhY3RvckJhbmRzX1Nob3J0OwotICAgICAgcFNmYk9mZnNldCAgICAgICAgICAgID0gcFNhbXBsaW5nUmF0ZUluZm8tPlNjYWxlRmFjdG9yQmFuZHNfU2hvcnQ7CisgICAgICBpZiAoZXhwYW5kVHlwZSA9PSBDQ29uY2VhbG1lbnRfTm9FeHBhbmQpIHsKKyAgICAgICAgLyogICBzdGFuZGFyZCBzaG9ydCBjYWxjdWxhdGlvbiAqLworICAgICAgICBzY2FsZUZhY3RvckJhbmRzVG90YWwgPQorICAgICAgICAgICAgcFNhbXBsaW5nUmF0ZUluZm8tPk51bWJlck9mU2NhbGVGYWN0b3JCYW5kc19TaG9ydDsKKyAgICAgICAgcFNmYk9mZnNldCA9IHBTYW1wbGluZ1JhdGVJbmZvLT5TY2FsZUZhY3RvckJhbmRzX1Nob3J0OwogCi0gICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNjYWxlRmFjdG9yQmFuZHNUb3RhbDsgc2ZiKyspIHsKLSAgICAgICAgRklYUF9EQkwgZW5BY2N1ID0gKEZJWFBfREJMKShMT05HKTE7Ci0gICAgICAgIGludCBzZmJTY2FsZSA9IChzaXplb2YoTE9ORyk8PDMpIC0gQ250TGVhZGluZ1plcm9zKHBTZmJPZmZzZXRbc2ZiKzFdIC0gcFNmYk9mZnNldFtzZmJdKSAtIDE7Ci0gICAgICAgIC8qIHNjYWxpbmcgZGVwZW5kcyBvbiBzZmIgd2lkdGguICovCi0gICAgICAgIGZvciAoIDsgbGluZSA8IHBTZmJPZmZzZXRbc2ZiKzFdOyBsaW5lKyspIHsKLSAgICAgICAgICBlbkFjY3UgKz0gZlBvdzJEaXYyKCooc3BlY3RydW0gKyBsaW5lKSkgPj4gc2ZiU2NhbGU7CisgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2NhbGVGYWN0b3JCYW5kc1RvdGFsOyBzZmIrKykgeworICAgICAgICAgIEZJWFBfREJMIGVuQWNjdSA9IChGSVhQX0RCTCkoTE9ORykxOworICAgICAgICAgIGludCBzZmJTY2FsZSA9CisgICAgICAgICAgICAgIChzaXplb2YoTE9ORykgPDwgMykgLQorICAgICAgICAgICAgICBDbnRMZWFkaW5nWmVyb3MocFNmYk9mZnNldFtzZmIgKyAxXSAtIHBTZmJPZmZzZXRbc2ZiXSkgLSAxOworICAgICAgICAgIC8qIHNjYWxpbmcgZGVwZW5kcyBvbiBzZmIgd2lkdGguICovCisgICAgICAgICAgZm9yICg7IGxpbmUgPCBwU2ZiT2Zmc2V0W3NmYiArIDFdOyBsaW5lKyspIHsKKyAgICAgICAgICAgIGVuQWNjdSArPSBmUG93MkRpdjIoKihzcGVjdHJ1bSArIGxpbmUpKSA+PiBzZmJTY2FsZTsKKyAgICAgICAgICB9CisgICAgICAgICAgKihzZmJFbmVyZ3kgKyBzZmIpID0gQ250TGVhZGluZ1plcm9zKGVuQWNjdSkgLSAxOwogICAgICAgICB9Ci0gICAgICAgICooc2ZiRW5lcmd5ICsgc2ZiKSA9IENudExlYWRpbmdaZXJvcyhlbkFjY3UpIC0gMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvKiAgZXhwYW5kIHNob3J0IHRvIGxvbmcgc3BlY3RydW0gKi8KLSAgICAgIHNjYWxlRmFjdG9yQmFuZHNUb3RhbCA9IHBTYW1wbGluZ1JhdGVJbmZvLT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfTG9uZzsKLSAgICAgIHBTZmJPZmZzZXQgICAgICAgICAgICA9IHBTYW1wbGluZ1JhdGVJbmZvLT5TY2FsZUZhY3RvckJhbmRzX0xvbmc7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiAgZXhwYW5kIHNob3J0IHRvIGxvbmcgc3BlY3RydW0gKi8KKyAgICAgICAgc2NhbGVGYWN0b3JCYW5kc1RvdGFsID0KKyAgICAgICAgICAgIHBTYW1wbGluZ1JhdGVJbmZvLT5OdW1iZXJPZlNjYWxlRmFjdG9yQmFuZHNfTG9uZzsKKyAgICAgICAgcFNmYk9mZnNldCA9IHBTYW1wbGluZ1JhdGVJbmZvLT5TY2FsZUZhY3RvckJhbmRzX0xvbmc7CiAKLSAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2NhbGVGYWN0b3JCYW5kc1RvdGFsOyBzZmIrKykgewotICAgICAgICBGSVhQX0RCTCBlbkFjY3UgPSAoRklYUF9EQkwpKExPTkcpMTsKLSAgICAgICAgaW50IHNmYlNjYWxlID0gKHNpemVvZihMT05HKTw8MykgLSBDbnRMZWFkaW5nWmVyb3MocFNmYk9mZnNldFtzZmIrMV0gLSBwU2ZiT2Zmc2V0W3NmYl0pIC0gMTsKLSAgICAgICAgLyogc2NhbGluZyBkZXBlbmRzIG9uIHNmYiB3aWR0aC4gKi8KLSAgICAgICAgZm9yICggOyBsaW5lIDwgcFNmYk9mZnNldFtzZmIrMV07IGxpbmUrKykgewotICAgICAgICAgIGVuQWNjdSArPSBmUG93MkRpdjIoKihzcGVjdHJ1bSArIChsaW5lID4+IDMpKSkgPj4gc2ZiU2NhbGU7CisgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2NhbGVGYWN0b3JCYW5kc1RvdGFsOyBzZmIrKykgeworICAgICAgICAgIEZJWFBfREJMIGVuQWNjdSA9IChGSVhQX0RCTCkoTE9ORykxOworICAgICAgICAgIGludCBzZmJTY2FsZSA9CisgICAgICAgICAgICAgIChzaXplb2YoTE9ORykgPDwgMykgLQorICAgICAgICAgICAgICBDbnRMZWFkaW5nWmVyb3MocFNmYk9mZnNldFtzZmIgKyAxXSAtIHBTZmJPZmZzZXRbc2ZiXSkgLSAxOworICAgICAgICAgIC8qIHNjYWxpbmcgZGVwZW5kcyBvbiBzZmIgd2lkdGguICovCisgICAgICAgICAgZm9yICg7IGxpbmUgPCBwU2ZiT2Zmc2V0W3NmYiArIDFdOyBsaW5lKyspIHsKKyAgICAgICAgICAgIGVuQWNjdSArPSBmUG93MkRpdjIoKihzcGVjdHJ1bSArIChsaW5lID4+IDMpKSkgPj4gc2ZiU2NhbGU7CisgICAgICAgICAgfQorICAgICAgICAgICooc2ZiRW5lcmd5ICsgc2ZiKSA9IENudExlYWRpbmdaZXJvcyhlbkFjY3UpIC0gMTsKICAgICAgICAgfQotICAgICAgICAqKHNmYkVuZXJneSArIHNmYikgPSBDbnRMZWFkaW5nWmVyb3MoZW5BY2N1KSAtIDE7CiAgICAgICB9Ci0gICAgfQotICAgIGJyZWFrOworICAgICAgYnJlYWs7CiAgIH0KIH0KIAotCiAvKiEKICAgXGJyaWVmIEludGVycG9sYXRlIGJ1ZmZlcgogCiAgIFRoZSBmdW5jdGlvbiBjcmVhdGVzIHRoZSBpbnRlcnBvbGF0ZWQgc3BlY3RyYWwgZGF0YSBhY2NvcmRpbmcgdG8gdGhlCiAgIGVuZXJneSBvZiB0aGUgbGFzdCBnb29kIGZyYW1lIGFuZCB0aGUgY3VycmVudCAoZ29vZCkgZnJhbWUuCi0KLSAgXHJldHVybiAgbm9uZQogKi8KLXN0YXRpYyB2b2lkCi0gIENDb25jZWFsbWVudF9JbnRlcnBvbGF0ZUJ1ZmZlciAoCi0gICAgRklYUF9EQkwgICAgKnNwZWN0cnVtLAotICAgIFNIT1JUICAgICAgICpwU3BlY1NjYWxlUHJ2LAotICAgIFNIT1JUICAgICAgICpwU3BlY1NjYWxlQWN0LAotICAgIFNIT1JUICAgICAgICpwU3BlY1NjYWxlT3V0LAotICAgIGludCAgICAgICAgICplblBydiwKLSAgICBpbnQgICAgICAgICAqZW5BY3QsCi0gICAgaW50ICAgICAgICAgIHNmYkNudCwKLSAgICBjb25zdCBTSE9SVCAqcFNmYk9mZnNldCApCi17Ci0gIGludCAgICBzZmIsIGxpbmUgPSAwOwotICBpbnQgICAgZmFjX3NoaWZ0OwotICBpbnQgICAgZmFjX21vZDsKK3N0YXRpYyB2b2lkIENDb25jZWFsbWVudF9JbnRlcnBvbGF0ZUJ1ZmZlcihGSVhQX0RCTCAqc3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnBTcGVjU2NhbGVQcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnBTcGVjU2NhbGVBY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnBTcGVjU2NhbGVPdXQsIGludCAqZW5QcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplbkFjdCwgaW50IHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCAqcFNmYk9mZnNldCkgeworICBpbnQgc2ZiLCBsaW5lID0gMDsKKyAgaW50IGZhY19zaGlmdDsKKyAgaW50IGZhY19tb2Q7CiAgIEZJWFBfREJMIGFjY3U7CiAKICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYisrKSB7Ci0KLSAgICBmYWNfc2hpZnQgPSBlblBydltzZmJdIC0gZW5BY3Rbc2ZiXSArICgoKnBTcGVjU2NhbGVBY3QgLSAqcFNwZWNTY2FsZVBydikgPDwgMSk7Ci0gICAgZmFjX21vZCAgID0gZmFjX3NoaWZ0ICYgMzsKKyAgICBmYWNfc2hpZnQgPQorICAgICAgICBlblBydltzZmJdIC0gZW5BY3Rbc2ZiXSArICgoKnBTcGVjU2NhbGVBY3QgLSAqcFNwZWNTY2FsZVBydikgPDwgMSk7CisgICAgZmFjX21vZCA9IGZhY19zaGlmdCAmIDM7CiAgICAgZmFjX3NoaWZ0ID0gKGZhY19zaGlmdCA+PiAyKSArIDE7CiAgICAgZmFjX3NoaWZ0ICs9ICpwU3BlY1NjYWxlUHJ2IC0gZml4TWF4KCpwU3BlY1NjYWxlUHJ2LCAqcFNwZWNTY2FsZUFjdCk7CiAKLSAgICBmb3IgKDsgbGluZSA8IHBTZmJPZmZzZXRbc2ZiKzFdOyBsaW5lKyspIHsKLSAgICAgIGFjY3UgPSBmTXVsdCgqKHNwZWN0cnVtK2xpbmUpLCBmYWNNb2Q0VGFibGVbZmFjX21vZF0pOworICAgIGZvciAoOyBsaW5lIDwgcFNmYk9mZnNldFtzZmIgKyAxXTsgbGluZSsrKSB7CisgICAgICBhY2N1ID0gZk11bHQoKihzcGVjdHJ1bSArIGxpbmUpLCBmYWNNb2Q0VGFibGVbZmFjX21vZF0pOwogICAgICAgaWYgKGZhY19zaGlmdCA8IDApIHsKICAgICAgICAgYWNjdSA+Pj0gLWZhY19zaGlmdDsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGFjY3UgPDw9IGZhY19zaGlmdDsKICAgICAgIH0KLSAgICAgICooc3BlY3RydW0rbGluZSkgPSBhY2N1OworICAgICAgKihzcGVjdHJ1bSArIGxpbmUpID0gYWNjdTsKICAgICB9CiAgIH0KICAgKnBTcGVjU2NhbGVPdXQgPSBmaXhNYXgoKnBTcGVjU2NhbGVQcnYsICpwU3BlY1NjYWxlQWN0KTsKIH0KIAorLyohCisgIFxicmllZiBGaW5kIG5leHQgZmFkaW5nIGZyYW1lIGluIGNhc2Ugb2YgY2hhbmdpbmcgZmFkaW5nIGRpcmVjdGlvbgogCisgIFxwYXJhbSBwQ29uY2VhbENvbW1vbkRhdGEgUG9pbnRlciB0byB0aGUgY29uY2VhbG1lbnQgY29tbW9uIGRhdGEgc3RydWN0dXJlLgorICBccGFyYW0gYWN0RmFkZUluZGV4IExhc3QgaW5kZXggdXNlZCBmb3IgZmFkaW5nCisgIFxwYXJhbSBkaXJlY3Rpb24gRGlyZWN0aW9uIG9mIGNoYW5nZTogMCA6IGNoYW5nZSBmcm9tIEZBREUtT1VUIHRvIEZBREUtSU4sICAxCisgIDogY2hhbmdlIGZyb20gRkFERS1JTiB0byBGQURFLU9VVAogCisgIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyB0aGUgbmV4dCBmYWRpbmcgaW5kZXggdG8gYmUgdXNlZCBmb3IgdGhlIGZhZGluZworICBkaXJlY3Rpb24gdG8gYmUgY2hhbmdlZCB0by4KKyovCiAKLXN0YXRpYyBJTlQgZmluZEVxdWlGYWRlRnJhbWUgKAotICAgIENDb25jZWFsUGFyYW1zICpwQ29uY2VhbENvbW1vbkRhdGEsCi0gICAgSU5UIGFjdEZhZGVJbmRleCwKLSAgICBpbnQgZGlyZWN0aW9uICkKLXsKK3N0YXRpYyBJTlQgZmluZEVxdWlGYWRlRnJhbWUoQ0NvbmNlYWxQYXJhbXMgKnBDb25jZWFsQ29tbW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGFjdEZhZGVJbmRleCwgaW50IGRpcmVjdGlvbikgewogICBGSVhQX1NHTCAqcEZhY3RvcjsKLSAgRklYUF9TR0wgIHJlZmVyZW5jZVZhbDsKLSAgRklYUF9TR0wgIG1pbkRpZmYgPSAoRklYUF9TR0wpTUFYVkFMX1NHTDsKKyAgRklYUF9TR0wgcmVmZXJlbmNlVmFsOworICBGSVhQX1NHTCBtaW5EaWZmID0gKEZJWFBfU0dMKU1BWFZBTF9TR0w7CiAKLSAgSU5UICBudW1GcmFtZXMgPSAwOwotICBJTlQgIG5leHRGYWRlSW5kZXggPSAwOworICBJTlQgbmV4dEZhZGVJbmRleCA9IDA7CiAKLSAgaW50ICBpOworICBpbnQgaTsKIAogICAvKiBpbml0IGRlcGVuZGluZyBvbiBkaXJlY3Rpb24gKi8KLSAgaWYgKGRpcmVjdGlvbiA9PSAwKSB7ICAvKiBGQURFLU9VVCA9PiBGQURFLUlOICovCi0gICAgbnVtRnJhbWVzID0gcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlSW5GcmFtZXM7Ci0gICAgcmVmZXJlbmNlVmFsID0gcENvbmNlYWxDb21tb25EYXRhLT5mYWRlT3V0RmFjdG9yW2FjdEZhZGVJbmRleF0gPj4gMTsKKyAgaWYgKGRpcmVjdGlvbiA9PSAwKSB7IC8qIEZBREUtT1VUID0+IEZBREUtSU4gKi8KKyAgICBpZiAoYWN0RmFkZUluZGV4IDwgMCkgeworICAgICAgcmVmZXJlbmNlVmFsID0gKEZJWFBfU0dMKU1BWFZBTF9TR0w7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlZmVyZW5jZVZhbCA9IHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZU91dEZhY3RvclthY3RGYWRlSW5kZXhdID4+IDE7CisgICAgfQogICAgIHBGYWN0b3IgPSBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVJbkZhY3RvcjsKLSAgfQotICBlbHNlIHsgIC8qIEZBREUtSU4gPT4gRkFERS1PVVQgKi8KLSAgICBudW1GcmFtZXMgPSBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXM7Ci0gICAgcmVmZXJlbmNlVmFsID0gcENvbmNlYWxDb21tb25EYXRhLT5mYWRlSW5GYWN0b3JbYWN0RmFkZUluZGV4XSA+PiAxOworICB9IGVsc2UgeyAvKiBGQURFLUlOID0+IEZBREUtT1VUICovCisgICAgaWYgKGFjdEZhZGVJbmRleCA8IDApIHsKKyAgICAgIHJlZmVyZW5jZVZhbCA9IChGSVhQX1NHTClNQVhWQUxfU0dMOworICAgIH0gZWxzZSB7CisgICAgICByZWZlcmVuY2VWYWwgPSBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVJbkZhY3RvclthY3RGYWRlSW5kZXhdID4+IDE7CisgICAgfQogICAgIHBGYWN0b3IgPSBwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVPdXRGYWN0b3I7CiAgIH0KIAogICAvKiBzZWFyY2ggZm9yIG1pbmltdW0gZGlmZmVyZW5jZSAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKLSAgICBGSVhQX1NHTCBkaWZmID0gZml4cF9hYnMoKHBGYWN0b3JbaV0+PjEpIC0gcmVmZXJlbmNlVmFsKTsKKyAgZm9yIChpID0gMDsgaSA8IENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlM7IGkrKykgeworICAgIEZJWFBfU0dMIGRpZmYgPSBmaXhwX2FicygocEZhY3RvcltpXSA+PiAxKSAtIHJlZmVyZW5jZVZhbCk7CiAgICAgaWYgKGRpZmYgPCBtaW5EaWZmKSB7CiAgICAgICBtaW5EaWZmID0gZGlmZjsKICAgICAgIG5leHRGYWRlSW5kZXggPSBpOwpAQCAtMTQ4MCwxMyArMTI5OSwxNyBAQAogICB9CiAKICAgLyogY2hlY2sgYW5kIGFkanVzdCBkZXBlbmRpbmcgb24gZGlyZWN0aW9uICovCi0gIGlmIChkaXJlY3Rpb24gPT0gMCkgeyAgLyogRkFERS1PVVQgPT4gRkFERS1JTiAqLwotICAgIGlmICgoKHBGYWN0b3JbbmV4dEZhZGVJbmRleF0+PjEpIDw9IHJlZmVyZW5jZVZhbCkgJiYgKG5leHRGYWRlSW5kZXggPiAwKSkgeworICBpZiAoZGlyZWN0aW9uID09IDApIHsgLyogRkFERS1PVVQgPT4gRkFERS1JTiAqLworICAgIGlmIChuZXh0RmFkZUluZGV4ID4gcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlSW5GcmFtZXMpIHsKKyAgICAgIG5leHRGYWRlSW5kZXggPSBmTWF4KHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZUluRnJhbWVzIC0gMSwgMCk7CisgICAgfQorICAgIGlmICgoKHBGYWN0b3JbbmV4dEZhZGVJbmRleF0gPj4gMSkgPD0gcmVmZXJlbmNlVmFsKSAmJgorICAgICAgICAobmV4dEZhZGVJbmRleCA+IDApKSB7CiAgICAgICBuZXh0RmFkZUluZGV4IC09IDE7CiAgICAgfQotICB9Ci0gIGVsc2UgeyAgLyogRkFERS1JTiA9PiBGQURFLU9VVCAqLwotICAgIGlmICgoKHBGYWN0b3JbbmV4dEZhZGVJbmRleF0+PjEpID49IHJlZmVyZW5jZVZhbCkgJiYgKG5leHRGYWRlSW5kZXggPCBudW1GcmFtZXMtMSkpIHsKKyAgfSBlbHNlIHsgLyogRkFERS1JTiA9PiBGQURFLU9VVCAqLworICAgIGlmICgoKHBGYWN0b3JbbmV4dEZhZGVJbmRleF0gPj4gMSkgPj0gcmVmZXJlbmNlVmFsKSAmJgorICAgICAgICAobmV4dEZhZGVJbmRleCA8IENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlMgLSAxKSkgewogICAgICAgbmV4dEZhZGVJbmRleCArPSAxOwogICAgIH0KICAgfQpAQCAtMTQ5NCwyNjggKzEzMTcsMzA0IEBACiAgIHJldHVybiAobmV4dEZhZGVJbmRleCk7CiB9CiAKLQogLyohCiAgIFxicmllZiBVcGRhdGUgdGhlIGNvbmNlYWxtZW50IHN0YXRlCiAKICAgVGhlIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBjb25jZWFsbWVudCBzdGF0ZS1tYWNoaW5lLiBUaGUKICAgc3RhdGVzIGFyZTogbXV0ZSwgZmFkZS1pbiwgZmFkZS1vdXQsIGludGVycG9sYXRlIGFuZCBmcmFtZS1vay4KLQotICBccmV0dXJuICBub25lCiAqLwotc3RhdGljIHZvaWQKLSAgQ0NvbmNlYWxtZW50X1VwZGF0ZVN0YXRlICgKLSAgICBDQ29uY2VhbG1lbnRJbmZvICpwQ29uY2VhbG1lbnRJbmZvLAotICAgIGludCBmcmFtZU9rICkKLXsKK3N0YXRpYyB2b2lkIENDb25jZWFsbWVudF9VcGRhdGVTdGF0ZSgKKyAgICBDQ29uY2VhbG1lbnRJbmZvICpwQ29uY2VhbG1lbnRJbmZvLCBpbnQgZnJhbWVPaywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgIGNvbnN0IGludCBzYW1wbGVzUGVyRnJhbWUsIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pIHsKICAgQ0NvbmNlYWxQYXJhbXMgKnBDb25jZWFsQ29tbW9uRGF0YSA9IHBDb25jZWFsbWVudEluZm8tPnBDb25jZWFsUGFyYW1zOwogCi0gIHN3aXRjaCAocENvbmNlYWxDb21tb25EYXRhLT5tZXRob2QpCi0gIHsKLSAgY2FzZSBDb25jZWFsTWV0aG9kTm9pc2U6Ci0gICAgeworICBzd2l0Y2ggKHBDb25jZWFsQ29tbW9uRGF0YS0+bWV0aG9kKSB7CisgICAgY2FzZSBDb25jZWFsTWV0aG9kTm9pc2U6IHsKICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgIT0gQ29uY2VhbFN0YXRlX09rKSB7CiAgICAgICAgIC8qIGNvdW50IHRoZSB2YWxpZCBmcmFtZXMgZHVyaW5nIGNvbmNlYWxtZW50IHByb2Nlc3MgKi8KICAgICAgICAgaWYgKGZyYW1lT2spIHsKICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRWYWxpZEZyYW1lcyArPSAxOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudFZhbGlkRnJhbWVzICA9IDA7CisgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250VmFsaWRGcmFtZXMgPSAwOwogICAgICAgICB9CiAgICAgICB9CiAKICAgICAgIC8qIC0tIFNUQVRFIE1BQ0hJTkUgZm9yIE5vaXNlIFN1YnN0aXR1dGlvbiAtLSAqLwotICAgICAgc3dpdGNoIChwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUpCi0gICAgICB7Ci0gICAgICBjYXNlIENvbmNlYWxTdGF0ZV9PazoKLSAgICAgICAgaWYgKCFmcmFtZU9rKSB7Ci0gICAgICAgICAgaWYgKHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZU91dEZyYW1lcyA+IDApIHsKLSAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBTSU5HTEUtRlJBTUUtTE9TUyAqLwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlICAgPSBDb25jZWFsU3RhdGVfU2luZ2xlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgTVVURSAqLwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX011dGU7Ci0gICAgICAgICAgfQotICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgID0gMDsKLSAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRWYWxpZEZyYW1lcyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSkgeworICAgICAgICBjYXNlIENvbmNlYWxTdGF0ZV9PazoKKyAgICAgICAgICBpZiAoIWZyYW1lT2spIHsKKyAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPSAwOworICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250VmFsaWRGcmFtZXMgPSAwOworICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+YXR0R3JwT2Zmc2V0WzBdID0gMDsKKyAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmF0dEdycE9mZnNldFsxXSA9IDA7CisgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT53aW5HcnBPZmZzZXRbMF0gPSAwOworICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+d2luR3JwT2Zmc2V0WzFdID0gMDsKKyAgICAgICAgICAgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMgPiAwKSB7CisgICAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBTSU5HTEUtRlJBTUUtTE9TUyAqLworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfU2luZ2xlOworICAgICAgICAgICAgICAvKiBtb2RlIDAganVzdCB1cGRhdGVzIHRoZSBGYWRpbmcgY291bnRlciAqLworICAgICAgICAgICAgICBDQ29uY2VhbG1lbnRfQXBwbHlGYWRlT3V0KAorICAgICAgICAgICAgICAgICAgLyptb2RlID0qLzAsIHBDb25jZWFsbWVudEluZm8sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pOwogCi0gICAgICBjYXNlIENvbmNlYWxTdGF0ZV9TaW5nbGU6ICAvKiBKdXN0IGEgcHJlLXN0YWdlIGJlZm9yZSBmYWRlLW91dCBiZWdpbnMuIFN0YXkgaGVyZSBvbmx5IG9uZSBmcmFtZSEgKi8KLSAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyArPSAxOwotICAgICAgICBpZiAoZnJhbWVPaykgewotICAgICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5jbnRWYWxpZEZyYW1lcyA+IHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtTXV0ZVJlbGVhc2VGcmFtZXMpIHsKLSAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBGQURFLUlOICovCi0gICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgID0gQ29uY2VhbFN0YXRlX0ZhZGVJbjsKLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPSBmaW5kRXF1aUZhZGVGcmFtZSggcENvbmNlYWxDb21tb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogRmFkZU91dCAtPiBGYWRlSW4gKi8pOwotICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgTVVURSAqLworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfTXV0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDb25jZWFsU3RhdGVfU2luZ2xlOiAvKiBKdXN0IGEgcHJlLXN0YWdlIGJlZm9yZSBmYWRlLW91dCBiZWdpbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RheSBoZXJlIG9ubHkgb25lIGZyYW1lISAqLworICAgICAgICAgIGlmIChmcmFtZU9rKSB7CiAgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgT0sgKi8KICAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9PazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPj0gcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlT3V0RnJhbWVzKSB7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgTVVURSAqLwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX011dGU7CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBGQURFLU9VVCAqLwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX0ZhZGVPdXQ7CisgICAgICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA+PQorICAgICAgICAgICAgICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZU91dEZyYW1lcykgeworICAgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgTVVURSAqLworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfTXV0ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBGQURFLU9VVCAqLworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfRmFkZU91dDsKKyAgICAgICAgICAgICAgLyogbW9kZSAwIGp1c3QgdXBkYXRlcyB0aGUgRmFkaW5nIGNvdW50ZXIgKi8KKyAgICAgICAgICAgICAgQ0NvbmNlYWxtZW50X0FwcGx5RmFkZU91dCgKKyAgICAgICAgICAgICAgICAgIC8qbW9kZSA9Ki8wLCBwQ29uY2VhbG1lbnRJbmZvLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX0ZhZGVPdXQ6Ci0gICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgKz0gMTsgIC8qIHVzZWQgdG8gYWRkcmVzcyB0aGUgZmFkZS1vdXQgZmFjdG9ycyAqLwotICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+Y250VmFsaWRGcmFtZXMgPiBwQ29uY2VhbENvbW1vbkRhdGEtPm51bU11dGVSZWxlYXNlRnJhbWVzKSB7Ci0gICAgICAgICAgaWYgKHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZUluRnJhbWVzID4gMCkgewotICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIEZBREUtSU4gKi8KLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSAgPSBDb25jZWFsU3RhdGVfRmFkZUluOwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA9IGZpbmRFcXVpRmFkZUZyYW1lKCBwQ29uY2VhbENvbW1vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBGYWRlT3V0IC0+IEZhZGVJbiAqLyk7CisgICAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX0ZhZGVPdXQ6CisgICAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPmNudFZhbGlkRnJhbWVzID4KKyAgICAgICAgICAgICAgcENvbmNlYWxDb21tb25EYXRhLT5udW1NdXRlUmVsZWFzZUZyYW1lcykgeworICAgICAgICAgICAgaWYgKHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZUluRnJhbWVzID4gMCkgeworICAgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgRkFERS1JTiAqLworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfRmFkZUluOworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID0gZmluZEVxdWlGYWRlRnJhbWUoCisgICAgICAgICAgICAgICAgICBwQ29uY2VhbENvbW1vbkRhdGEsIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAwIC8qIEZhZGVPdXQgLT4gRmFkZUluICovKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBPSyAqLworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfT2s7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBPSyAqLwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX09rOworICAgICAgICAgICAgaWYgKGZyYW1lT2spIHsKKyAgICAgICAgICAgICAgLyogd2UgaGF2ZSBnb29kIGZyYW1lIGluZm9ybWF0aW9uIGJ1dCBzdGF5IGZ1bGx5IGluIGNvbmNlYWxtZW50IC0KKyAgICAgICAgICAgICAgICogcmVzZXQgd2luR3JwT2Zmc2V0L2F0dEdycE9mZnNldCAqLworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT53aW5HcnBPZmZzZXRbMF0gPSAwOworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT53aW5HcnBPZmZzZXRbMV0gPSAwOworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5hdHRHcnBPZmZzZXRbMF0gPSAwOworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5hdHRHcnBPZmZzZXRbMV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPj0KKyAgICAgICAgICAgICAgICBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMpIHsKKyAgICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE1VVEUgKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX011dGU7CisgICAgICAgICAgICB9IGVsc2UgLyogU3RheSBpbiBGQURFLU9VVCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBtb2RlIDAganVzdCB1cGRhdGVzIHRoZSBGYWRpbmcgY291bnRlciAqLworICAgICAgICAgICAgICBDQ29uY2VhbG1lbnRfQXBwbHlGYWRlT3V0KAorICAgICAgICAgICAgICAgICAgLyptb2RlID0qLzAsIHBDb25jZWFsbWVudEluZm8sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pOworICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA+PSBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMpIHsKLSAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBNVVRFICovCi0gICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfTXV0ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX011dGU6Ci0gICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5jbnRWYWxpZEZyYW1lcyA+IHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtTXV0ZVJlbGVhc2VGcmFtZXMpIHsKLSAgICAgICAgICBpZiAocENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlSW5GcmFtZXMgPiAwKSB7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgRkFERS1JTiAqLwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX0ZhZGVJbjsKLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPSBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVJbkZyYW1lcyAtIDE7CisgICAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX011dGU6CisgICAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPmNudFZhbGlkRnJhbWVzID4KKyAgICAgICAgICAgICAgcENvbmNlYWxDb21tb25EYXRhLT5udW1NdXRlUmVsZWFzZUZyYW1lcykgeworICAgICAgICAgICAgaWYgKHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZUluRnJhbWVzID4gMCkgeworICAgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgRkFERS1JTiAqLworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfRmFkZUluOworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID0KKyAgICAgICAgICAgICAgICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZUluRnJhbWVzIC0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBPSyAqLworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfT2s7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBPSyAqLwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX09rOworICAgICAgICAgICAgaWYgKGZyYW1lT2spIHsKKyAgICAgICAgICAgICAgLyogd2UgaGF2ZSBnb29kIGZyYW1lIGluZm9ybWF0aW9uIGJ1dCBzdGF5IGZ1bGx5IGluIGNvbmNlYWxtZW50IC0KKyAgICAgICAgICAgICAgICogcmVzZXQgd2luR3JwT2Zmc2V0L2F0dEdycE9mZnNldCAqLworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT53aW5HcnBPZmZzZXRbMF0gPSAwOworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT53aW5HcnBPZmZzZXRbMV0gPSAwOworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5hdHRHcnBPZmZzZXRbMF0gPSAwOworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5hdHRHcnBPZmZzZXRbMV0gPSAwOworICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgICAgICBicmVhazsKIAotICAgICAgY2FzZSBDb25jZWFsU3RhdGVfRmFkZUluOgotICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzIC09IDE7ICAvKiB1c2VkIHRvIGFkZHJlc3MgdGhlIGZhZGUtaW4gZmFjdG9ycyAqLwotICAgICAgICBpZiAoZnJhbWVPaykgewotICAgICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzIDwgMCkgewotICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE9LICovCi0gICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfT2s7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMgPiAwKSB7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgRkFERS1PVVQgKi8KLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSAgPSBDb25jZWFsU3RhdGVfRmFkZU91dDsKLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPSBmaW5kRXF1aUZhZGVGcmFtZSggcENvbmNlYWxDb21tb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzKzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLyogRmFkZUluIC0+IEZhZGVPdXQgKi8pOworICAgICAgICBjYXNlIENvbmNlYWxTdGF0ZV9GYWRlSW46CisgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyAtPSAxOworICAgICAgICAgIGlmIChmcmFtZU9rKSB7CisgICAgICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA8IDApIHsKKyAgICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE9LICovCisgICAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9PazsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE1VVEUgKi8KLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9NdXRlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMgPiAwKSB7CisgICAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBGQURFLU9VVCAqLworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfRmFkZU91dDsKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA9IGZpbmRFcXVpRmFkZUZyYW1lKAorICAgICAgICAgICAgICAgICAgcENvbmNlYWxDb21tb25EYXRhLCBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzICsgMSwKKyAgICAgICAgICAgICAgICAgIDEgLyogRmFkZUluIC0+IEZhZGVPdXQgKi8pOworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT53aW5HcnBPZmZzZXRbMF0gPSAwOworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT53aW5HcnBPZmZzZXRbMV0gPSAwOworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5hdHRHcnBPZmZzZXRbMF0gPSAwOworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5hdHRHcnBPZmZzZXRbMV0gPSAwOwogCi0gICAgICBkZWZhdWx0OgotICAgICAgICBGREtfQVNTRVJUKDApOwotICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mbworICAgICAgICAgICAgICAgICAgLT5jbnRGYWRlRnJhbWVzLS07IC8qIGRlY3JlYXNlIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ29uY2VhbG1lbnRfQXBwbHlGYWRlT3V0KCkgd2lsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlYXNlLCBhY2NvcmRpbmdseSAqLworICAgICAgICAgICAgICAvKiBtb2RlIDAganVzdCB1cGRhdGVzIHRoZSBGYWRpbmcgY291bnRlciAqLworICAgICAgICAgICAgICBDQ29uY2VhbG1lbnRfQXBwbHlGYWRlT3V0KAorICAgICAgICAgICAgICAgICAgLyptb2RlID0qLzAsIHBDb25jZWFsbWVudEluZm8sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE1VVEUgKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX011dGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7CisgICAgfSBicmVhazsKIAotICBjYXNlIENvbmNlYWxNZXRob2RJbnRlcjoKLSAgY2FzZSBDb25jZWFsTWV0aG9kVG9uYWw6Ci0gICAgeworICAgIGNhc2UgQ29uY2VhbE1ldGhvZEludGVyOgorICAgIGNhc2UgQ29uY2VhbE1ldGhvZFRvbmFsOiB7CiAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlICE9IENvbmNlYWxTdGF0ZV9PaykgewogICAgICAgICAvKiBjb3VudCB0aGUgdmFsaWQgZnJhbWVzIGR1cmluZyBjb25jZWFsbWVudCBwcm9jZXNzICovCi0gICAgICAgIGlmICggcENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMV0gfHwKLSAgICAgICAgICAgIChwQ29uY2VhbG1lbnRJbmZvLT5wcmV2RnJhbWVPa1swXSAmJiAhcENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMV0gJiYgZnJhbWVPaykgKSB7Ci0gICAgICAgICAgLyogVGhlIGZyYW1lIGlzIE9LIGV2ZW4gaWYgaXQgY2FuIGJlIGVzdGltYXRlZCBieSB0aGUgZW5lcmd5IGludGVycG9sYXRpb24gYWxnb3JpdGhtICovCisgICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5wcmV2RnJhbWVPa1sxXSB8fAorICAgICAgICAgICAgKHBDb25jZWFsbWVudEluZm8tPnByZXZGcmFtZU9rWzBdICYmCisgICAgICAgICAgICAgIXBDb25jZWFsbWVudEluZm8tPnByZXZGcmFtZU9rWzFdICYmIGZyYW1lT2spKSB7CisgICAgICAgICAgLyogVGhlIGZyYW1lIGlzIE9LIGV2ZW4gaWYgaXQgY2FuIGJlIGVzdGltYXRlZCBieSB0aGUgZW5lcmd5CisgICAgICAgICAgICogaW50ZXJwb2xhdGlvbiBhbGdvcml0aG0gKi8KICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRWYWxpZEZyYW1lcyArPSAxOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudFZhbGlkRnJhbWVzICA9IDA7CisgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250VmFsaWRGcmFtZXMgPSAwOwogICAgICAgICB9CiAgICAgICB9CiAKICAgICAgIC8qIC0tIFNUQVRFIE1BQ0hJTkUgZm9yIGVuZXJneSBpbnRlcnBvbGF0aW9uIC0tICovCi0gICAgICBzd2l0Y2ggKHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSkKLSAgICAgIHsKLSAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX09rOgotICAgICAgICBpZiAoIShwQ29uY2VhbG1lbnRJbmZvLT5wcmV2RnJhbWVPa1sxXSB8fAotICAgICAgICAgICAgIChwQ29uY2VhbG1lbnRJbmZvLT5wcmV2RnJhbWVPa1swXSAmJiAhcENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMV0gJiYgZnJhbWVPaykpKSB7Ci0gICAgICAgICAgaWYgKHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZU91dEZyYW1lcyA+IDApIHsKLSAgICAgICAgICAgIC8qIEZhZGUgb3V0IG9ubHkgaWYgdGhlIGVuZXJneSBpbnRlcnBvbGF0aW9uIGFsZ29yaXRobSBjYW4gbm90IGJlIGFwcGxpZWQhICovCi0gICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgICA9IENvbmNlYWxTdGF0ZV9GYWRlT3V0OworICAgICAgc3dpdGNoIChwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUpIHsKKyAgICAgICAgY2FzZSBDb25jZWFsU3RhdGVfT2s6CisgICAgICAgICAgaWYgKCEocENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMV0gfHwKKyAgICAgICAgICAgICAgICAocENvbmNlYWxtZW50SW5mby0+cHJldkZyYW1lT2tbMF0gJiYKKyAgICAgICAgICAgICAgICAgIXBDb25jZWFsbWVudEluZm8tPnByZXZGcmFtZU9rWzFdICYmIGZyYW1lT2spKSkgeworICAgICAgICAgICAgaWYgKHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZU91dEZyYW1lcyA+IDApIHsKKyAgICAgICAgICAgICAgLyogRmFkZSBvdXQgb25seSBpZiB0aGUgZW5lcmd5IGludGVycG9sYXRpb24gYWxnb3JpdGhtIGNhbiBub3QgYmUKKyAgICAgICAgICAgICAgICogYXBwbGllZCEgKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX0ZhZGVPdXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgTVVURSAqLworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfTXV0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPSAwOworICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250VmFsaWRGcmFtZXMgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENvbmNlYWxTdGF0ZV9TaW5nbGU6CisgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX09rOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX0ZhZGVPdXQ6CisgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyArPSAxOworCisgICAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPmNudFZhbGlkRnJhbWVzID4KKyAgICAgICAgICAgICAgcENvbmNlYWxDb21tb25EYXRhLT5udW1NdXRlUmVsZWFzZUZyYW1lcykgeworICAgICAgICAgICAgaWYgKHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZUluRnJhbWVzID4gMCkgeworICAgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgRkFERS1JTiAqLworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfRmFkZUluOworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID0gZmluZEVxdWlGYWRlRnJhbWUoCisgICAgICAgICAgICAgICAgICBwQ29uY2VhbENvbW1vbkRhdGEsIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgLSAxLAorICAgICAgICAgICAgICAgICAgMCAvKiBGYWRlT3V0IC0+IEZhZGVJbiAqLyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgT0sgKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX09rOworICAgICAgICAgICAgfQogICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgTVVURSAqLwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX011dGU7CisgICAgICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA+PQorICAgICAgICAgICAgICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZU91dEZyYW1lcykgeworICAgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgTVVURSAqLworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfTXV0ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyAgPSAwOwotICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudFZhbGlkRnJhbWVzID0gMDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgICAgICBicmVhazsKIAotICAgICAgY2FzZSBDb25jZWFsU3RhdGVfU2luZ2xlOgotICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfT2s7Ci0gICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvbmNlYWxTdGF0ZV9NdXRlOgorICAgICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5jbnRWYWxpZEZyYW1lcyA+CisgICAgICAgICAgICAgIHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtTXV0ZVJlbGVhc2VGcmFtZXMpIHsKKyAgICAgICAgICAgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVJbkZyYW1lcyA+IDApIHsKKyAgICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIEZBREUtSU4gKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX0ZhZGVJbjsKKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyA9CisgICAgICAgICAgICAgICAgICBwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVJbkZyYW1lcyAtIDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgT0sgKi8KKyAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX09rOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKIAotICAgICAgY2FzZSBDb25jZWFsU3RhdGVfRmFkZU91dDoKLSAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyArPSAxOworICAgICAgICBjYXNlIENvbmNlYWxTdGF0ZV9GYWRlSW46CisgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyAtPQorICAgICAgICAgICAgICAxOyAvKiB1c2VkIHRvIGFkZHJlc3MgdGhlIGZhZGUtaW4gZmFjdG9ycyAqLwogCi0gICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5jbnRWYWxpZEZyYW1lcyA+IHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtTXV0ZVJlbGVhc2VGcmFtZXMpIHsKLSAgICAgICAgICBpZiAocENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlSW5GcmFtZXMgPiAwKSB7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgRkFERS1JTiAqLwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlICA9IENvbmNlYWxTdGF0ZV9GYWRlSW47Ci0gICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID0gZmluZEVxdWlGYWRlRnJhbWUoIHBDb25jZWFsQ29tbW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcy0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIEZhZGVPdXQgLT4gRmFkZUluICovKTsKKyAgICAgICAgICBpZiAoZnJhbWVPayB8fCBwQ29uY2VhbG1lbnRJbmZvLT5wcmV2RnJhbWVPa1sxXSkgeworICAgICAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPCAwKSB7CisgICAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBPSyAqLworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfT2s7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIGNoYW5nZSB0byBzdGF0ZSBPSyAqLwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX09rOworICAgICAgICAgICAgaWYgKHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZU91dEZyYW1lcyA+IDApIHsKKyAgICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIEZBREUtT1VUICovCisgICAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9GYWRlT3V0OworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID0gZmluZEVxdWlGYWRlRnJhbWUoCisgICAgICAgICAgICAgICAgICBwQ29uY2VhbENvbW1vbkRhdGEsIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgKyAxLAorICAgICAgICAgICAgICAgICAgMSAvKiBGYWRlSW4gLT4gRmFkZU91dCAqLyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgTVVURSAqLworICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfTXV0ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPj0gcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlT3V0RnJhbWVzKSB7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgTVVURSAqLwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX011dGU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIENvbmNlYWxTdGF0ZV9NdXRlOgotICAgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+Y250VmFsaWRGcmFtZXMgPiBwQ29uY2VhbENvbW1vbkRhdGEtPm51bU11dGVSZWxlYXNlRnJhbWVzKSB7Ci0gICAgICAgICAgaWYgKHBDb25jZWFsQ29tbW9uRGF0YS0+bnVtRmFkZUluRnJhbWVzID4gMCkgewotICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIEZBREUtSU4gKi8KLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9GYWRlSW47Ci0gICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzID0gcENvbmNlYWxDb21tb25EYXRhLT5udW1GYWRlSW5GcmFtZXMgLSAxOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgT0sgKi8KLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSA9IENvbmNlYWxTdGF0ZV9PazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX0ZhZGVJbjoKLSAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y250RmFkZUZyYW1lcyAtPSAxOyAgLyogdXNlZCB0byBhZGRyZXNzIHRoZSBmYWRlLWluIGZhY3RvcnMgKi8KLQotICAgICAgICBpZiAoZnJhbWVPayB8fCBwQ29uY2VhbG1lbnRJbmZvLT5wcmV2RnJhbWVPa1sxXSkgewotICAgICAgICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzIDwgMCkgewotICAgICAgICAgICAgLyogY2hhbmdlIHRvIHN0YXRlIE9LICovCi0gICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUgPSBDb25jZWFsU3RhdGVfT2s7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChwQ29uY2VhbENvbW1vbkRhdGEtPm51bUZhZGVPdXRGcmFtZXMgPiAwKSB7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgRkFERS1PVVQgKi8KLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSAgPSBDb25jZWFsU3RhdGVfRmFkZU91dDsKLSAgICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPSBmaW5kRXF1aUZhZGVGcmFtZSggcENvbmNlYWxDb21tb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzKzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLyogRmFkZUluIC0+IEZhZGVPdXQgKi8pOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgdG8gc3RhdGUgTVVURSAqLwotICAgICAgICAgICAgcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlID0gQ29uY2VhbFN0YXRlX011dGU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICAgIGJyZWFrOwogICAgICAgfSAvKiBFbmQgc3dpdGNoKHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSkgKi8KLSAgICB9Ci0gICAgYnJlYWs7CisgICAgfSBicmVhazsKIAotICBkZWZhdWx0OgotICAgIC8qIERvbid0IG5lZWQgYSBzdGF0ZSBtYWNoaW5lIGZvciBvdGhlciBjb25jZWFsbWVudCBtZXRob2RzLiAqLwotICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBEb24ndCBuZWVkIGEgc3RhdGUgbWFjaGluZSBmb3Igb3RoZXIgY29uY2VhbG1lbnQgbWV0aG9kcy4gKi8KKyAgICAgIGJyZWFrOwogICB9Ci0KIH0KIAotCiAvKiEKIFxicmllZiBSYW5kb21pemVzIHRoZSBzaWduIG9mIHRoZSBzcGVjdHJhbCBkYXRhCiAKICAgVGhlIGZ1bmN0aW9uIHRvZ2dsZXMgdGhlIHNpZ24gb2YgdGhlIHNwZWN0cmFsIGRhdGEgcmFuZG9tbHkuIFRoaXMgaXMKICAgdXNlZnVsIHRvIGVuc3VyZSB0aGUgcXVhbGl0eSBvZiB0aGUgY29uY2VhbGVkIGZyYW1lcy4KLQotXHJldHVybiAgbm9uZQogICovCi1zdGF0aWMKLXZvaWQgQ0NvbmNlYWxtZW50X0FwcGx5UmFuZG9tU2lnbiAoaW50IHJhbmRvbVBoYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZXNQZXJGcmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CitzdGF0aWMgdm9pZCBDQ29uY2VhbG1lbnRfQXBwbHlSYW5kb21TaWduKGludCByYW5kb21QaGFzZSwgRklYUF9EQkwgKnNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVzUGVyRnJhbWUpIHsKICAgaW50IGk7Ci0gIFVTSE9SVCBwYWNrZWRTaWduPTA7CisgIFVTSE9SVCBwYWNrZWRTaWduID0gMDsKIAotICAvKiByYW5kb20gdGFibGUgNTEyeDE2Yml0IGhhcyBiZWVuIHJlZHVjZWQgdG8gNTEyIHBhY2tlZCBzaWduIGJpdHMgPSAzMngxNiBiaXQgKi8KKyAgLyogcmFuZG9tIHRhYmxlIDUxMngxNmJpdCBoYXMgYmVlbiByZWR1Y2VkIHRvIDUxMiBwYWNrZWQgc2lnbiBiaXRzID0gMzJ4MTYgYml0CisgICAqLwogCiAgIC8qIHJlYWQgY3VycmVudCBwYWNrZWQgc2lnbiB3b3JkICovCi0gIHBhY2tlZFNpZ24gPSByYW5kb21TaWduW3JhbmRvbVBoYXNlPj40XTsKLSAgcGFja2VkU2lnbiA+Pj0gKHJhbmRvbVBoYXNlJjB4Zik7CisgIHBhY2tlZFNpZ24gPSBBYWNEZWNfcmFuZG9tU2lnbltyYW5kb21QaGFzZSA+PiA0XTsKKyAgcGFja2VkU2lnbiA+Pj0gKHJhbmRvbVBoYXNlICYgMHhmKTsKIAotICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlc1BlckZyYW1lIDsgaSsrKSB7CisgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVzUGVyRnJhbWU7IGkrKykgewogICAgIGlmICgocmFuZG9tUGhhc2UgJiAweGYpID09IDApIHsKLSAgICAgIHBhY2tlZFNpZ24gPSByYW5kb21TaWduW3JhbmRvbVBoYXNlPj40XTsKKyAgICAgIHBhY2tlZFNpZ24gPSBBYWNEZWNfcmFuZG9tU2lnbltyYW5kb21QaGFzZSA+PiA0XTsKICAgICB9CiAKICAgICBpZiAocGFja2VkU2lnbiAmIDB4MSkgewpAQCAtMTc2Nyw1MyArMTYyNiw2IEBACiAgIH0KIH0KIAotCi0vKiEKLSAgXGJyaWVmIEdldCBmYWRlaW5nIGZhY3RvciBmb3IgY3VycmVudCBjb25jZWFsbWVudCBzdGF0ZS4KLQotICBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmFjdG9yIHVzZWQgZm9yIGZhZGluZyB0aGF0IGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgaW50ZXJuYWwgc3RhdGUuCi0KLSAgXHJldHVybiBGYWRlIGZhY3RvcgotICovCi1GSVhQX0RCTAotICBDQ29uY2VhbG1lbnRfR2V0RmFkZUZhY3RvciAoCi0gICAgICBDQ29uY2VhbG1lbnRJbmZvICpoQ29uY2VhbG1lbnRJbmZvLAotICAgICAgY29uc3QgaW50IGZQcmV2aW91c0ZhY3RvcgotICApCi17Ci0gIEZJWFBfREJMIGZhYyA9IChGSVhQX0RCTCkwOwotCi0gIENDb25jZWFsUGFyYW1zICpwQ29uY2VhbENvbW1vbkRhdGEgPSBoQ29uY2VhbG1lbnRJbmZvLT5wQ29uY2VhbFBhcmFtczsKLQotICBpZiAoaENvbmNlYWxtZW50SW5mby0+cENvbmNlYWxQYXJhbXMtPm1ldGhvZCA+IENvbmNlYWxNZXRob2RNdXRlKSB7Ci0gICAgc3dpdGNoIChoQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGUpIHsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICBjYXNlIENvbmNlYWxTdGF0ZV9NdXRlOgotICAgICAgICAvKiBOb3RoaW5nIHRvIGRvIGhlcmUgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIENvbmNlYWxTdGF0ZV9PazoKLSAgICAgICAgZmFjID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDb25jZWFsU3RhdGVfU2luZ2xlOgotICAgICAgY2FzZSBDb25jZWFsU3RhdGVfRmFkZU91dDoKLSAgICAgICAgewotICAgICAgICAgIGludCBpZHggPSBoQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzIC0gKChmUHJldmlvdXNGYWN0b3IgIT0gMCkgPyAxIDogMCk7Ci0gICAgICAgICAgZmFjID0gKGlkeCA8IDApID8gKEZJWFBfREJMKU1BWFZBTF9EQkwgOiBGWF9TR0wyRlhfREJMKHBDb25jZWFsQ29tbW9uRGF0YS0+ZmFkZU91dEZhY3RvcltpZHhdKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQ29uY2VhbFN0YXRlX0ZhZGVJbjoKLSAgICAgICAgewotICAgICAgICAgIGludCBpZHggPSBoQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzICsgKChmUHJldmlvdXNGYWN0b3IgIT0gMCkgPyAxIDogMCk7Ci0gICAgICAgICAgZmFjID0gKGlkeCA+PSBoQ29uY2VhbG1lbnRJbmZvLT5wQ29uY2VhbFBhcmFtcy0+bnVtRmFkZUluRnJhbWVzKSA/IChGSVhQX0RCTCkwIDogRlhfU0dMMkZYX0RCTChwQ29uY2VhbENvbW1vbkRhdGEtPmZhZGVJbkZhY3RvcltpZHhdKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gKGZhYyk7Ci19Ci0KLQogLyohCiAgIFxicmllZiBHZXQgZmFkZWluZyBmYWN0b3IgZm9yIGN1cnJlbnQgY29uY2VhbG1lbnQgc3RhdGUuCiAKQEAgLTE4MjMsMTIgKzE2MzUsOCBAQAogCiAgIFxyZXR1cm4gRnJhbWUgT0sgZmxhZyBvZiBwcmV2aW91cyBmcmFtZS4KICAqLwotaW50Ci0gIENDb25jZWFsbWVudF9HZXRMYXN0RnJhbWVPayAoCi0gICAgICBDQ29uY2VhbG1lbnRJbmZvICpoQ29uY2VhbG1lbnRJbmZvLAotICAgICAgY29uc3QgaW50IGZCZWZvcmVBcHBseQotICApCi17CitpbnQgQ0NvbmNlYWxtZW50X0dldExhc3RGcmFtZU9rKENDb25jZWFsbWVudEluZm8gKmhDb25jZWFsbWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmQmVmb3JlQXBwbHkpIHsKICAgaW50IHByZXZGcmFtZU9rID0gMTsKIAogICBpZiAoaENvbmNlYWxtZW50SW5mbyAhPSBOVUxMKSB7CkBAIC0xODM5LDI4ICsxNjQ3LDQ0OCBAQAogfQogCiAvKiEKLSAgXGJyaWVmIEdldCB0aGUgbnVtYmVyIG9mIGRlbGF5IGZyYW1lcyBpbnRyb2R1Y2VkIGJ5IGNvbmNlYWxtZW50IHRlY2huaXF1ZS4gCisgIFxicmllZiBHZXQgdGhlIG51bWJlciBvZiBkZWxheSBmcmFtZXMgaW50cm9kdWNlZCBieSBjb25jZWFsbWVudCB0ZWNobmlxdWUuCiAKICAgXHJldHVybiBOdW1iZXIgb2YgZGVsYXkgZnJhbWVzLgogICovCi1VSU5UCi0gIENDb25jZWFsbWVudF9HZXREZWxheSAoCi0gICAgICBDQ29uY2VhbFBhcmFtcyAqcENvbmNlYWxDb21tb25EYXRhCi0gICkKLXsKK1VJTlQgQ0NvbmNlYWxtZW50X0dldERlbGF5KENDb25jZWFsUGFyYW1zICpwQ29uY2VhbENvbW1vbkRhdGEpIHsKICAgVUlOVCBmcmFtZURlbGF5ID0gMDsKIAogICBpZiAocENvbmNlYWxDb21tb25EYXRhICE9IE5VTEwpIHsKICAgICBzd2l0Y2ggKHBDb25jZWFsQ29tbW9uRGF0YS0+bWV0aG9kKSB7Ci0gICAgY2FzZSBDb25jZWFsTWV0aG9kVG9uYWw6Ci0gICAgY2FzZSBDb25jZWFsTWV0aG9kSW50ZXI6Ci0gICAgICBmcmFtZURlbGF5ID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKKyAgICAgIGNhc2UgQ29uY2VhbE1ldGhvZFRvbmFsOgorICAgICAgY2FzZSBDb25jZWFsTWV0aG9kSW50ZXI6CisgICAgICAgIGZyYW1lRGVsYXkgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOwogICAgIH0KICAgfQogCiAgIHJldHVybiBmcmFtZURlbGF5OwogfQogCitzdGF0aWMgaW50IENDb25jZWFsbWVudF9BcHBseUZhZGVPdXQoCisgICAgaW50IG1vZGUsIENDb25jZWFsbWVudEluZm8gKnBDb25jZWFsbWVudEluZm8sCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICBjb25zdCBpbnQgc2FtcGxlc1BlckZyYW1lLCBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKSB7CisgIC8qIG1vZGUgMSA9IGFwcGx5IFJhbmRvbVNpZ24gYW5kIG11dGUgc3BlY3RyYWwgY29lZmZpY2llbnRzIGlmIG5lY2Vzc2FyeSwgICoKKyAgICogbW9kZSAwID0gVXBkYXRlIGNudEZhZGVGcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgLyogcmVzdG9yZSBmcmVxdWVuY3kgY29lZmZpY2llbnRzIGZyb20gYnVmZmVyIHdpdGggYSBzcGVjaWZpYyBtdXRpbmcgKi8KKyAgaW50IHNyY1dpbiwgZHN0V2luLCBudW1XaW5kb3dzID0gMTsKKyAgaW50IHdpbmRvd0xlbiA9IHNhbXBsZXNQZXJGcmFtZTsKKyAgaW50IHNyY0dycFN0YXJ0ID0gMDsKKyAgaW50IHdpbklkeFN0cmlkZSA9IDE7CisgIGludCBudW1XaW5HcnBQZXJGYWMsIGF0dElkeCwgYXR0SWR4U3RyaWRlOworICBpbnQgaTsKKyAgaW50IGFwcGxpZWRQcm9jZXNzaW5nID0gMDsKKworICBDSWNzSW5mbyAqcEljc0luZm8gPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbzsKKyAgRklYUF9EQkwgKnBTcGVjdHJhbENvZWZmaWNpZW50ID0KKyAgICAgIFNQRUNfTE9ORyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCk7CisgIFNIT1JUICpwU3BlY1NjYWxlID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+c3BlY1NjYWxlOworCisgIC8qIHNldCBvbGQgd2luZG93IHBhcmFtZXRlcnMgKi8KKyAgaWYgKHBDb25jZWFsbWVudEluZm8tPmxhc3RSZW5kZXJNb2RlID09IEFBQ0RFQ19SRU5ERVJfTFBEKSB7CisgICAgc3dpdGNoIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xwZF9tb2RlKSB7CisgICAgICBjYXNlIDE6CisgICAgICAgIG51bVdpbmRvd3MgPSA0OworICAgICAgICBzcmNHcnBTdGFydCA9IDM7CisgICAgICAgIHdpbmRvd0xlbiA9IHNhbXBsZXNQZXJGcmFtZSA+PiAyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgbnVtV2luZG93cyA9IDI7CisgICAgICAgIHNyY0dycFN0YXJ0ID0gMTsKKyAgICAgICAgd2luZG93TGVuID0gc2FtcGxlc1BlckZyYW1lID4+IDE7CisgICAgICAgIHdpbklkeFN0cmlkZSA9IDI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOgorICAgICAgICBudW1XaW5kb3dzID0gMTsKKyAgICAgICAgc3JjR3JwU3RhcnQgPSAwOworICAgICAgICB3aW5kb3dMZW4gPSBzYW1wbGVzUGVyRnJhbWU7CisgICAgICAgIHdpbklkeFN0cmlkZSA9IDQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBwQ29uY2VhbG1lbnRJbmZvLT5sYXN0V2luR3JwTGVuID0gMTsKKyAgfSBlbHNlIHsKKyAgICBwSWNzSW5mby0+V2luZG93U2hhcGUgPSBwQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTaGFwZTsKKyAgICBwSWNzSW5mby0+V2luZG93U2VxdWVuY2UgPSBwQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTZXF1ZW5jZTsKKworICAgIGlmIChwQ29uY2VhbG1lbnRJbmZvLT53aW5kb3dTZXF1ZW5jZSA9PSBCTE9DS19TSE9SVCkgeworICAgICAgLyogc2hvcnQgYmxvY2sgaGFuZGxpbmcgKi8KKyAgICAgIG51bVdpbmRvd3MgPSA4OworICAgICAgd2luZG93TGVuID0gc2FtcGxlc1BlckZyYW1lID4+IDM7CisgICAgICBzcmNHcnBTdGFydCA9IG51bVdpbmRvd3MgLSBwQ29uY2VhbG1lbnRJbmZvLT5sYXN0V2luR3JwTGVuOworICAgIH0KKyAgfQorCisgIGF0dElkeFN0cmlkZSA9CisgICAgICBmTWF4KDEsIChpbnQpKG51bVdpbmRvd3MgLyAocENvbmNlYWxtZW50SW5mby0+bGFzdFdpbkdycExlbiArIDEpKSk7CisKKyAgLyogbG9hZCBsYXN0IHN0YXRlICovCisgIGF0dElkeCA9IHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXM7CisgIG51bVdpbkdycFBlckZhYyA9IHBDb25jZWFsbWVudEluZm8tPmF0dEdycE9mZnNldFttb2RlXTsKKyAgc3JjV2luID0gc3JjR3JwU3RhcnQgKyBwQ29uY2VhbG1lbnRJbmZvLT53aW5HcnBPZmZzZXRbbW9kZV07CisKKyAgRkRLX0FTU0VSVCgoc3JjR3JwU3RhcnQgKiB3aW5kb3dMZW4gKyB3aW5kb3dMZW4pIDw9IHNhbXBsZXNQZXJGcmFtZSk7CisgIEZES19BU1NFUlQoKHNyY1dpbiAqIHdpbmRvd0xlbiArIHdpbmRvd0xlbikgPD0gMTAyNCk7CisKKyAgZm9yIChkc3RXaW4gPSAwOyBkc3RXaW4gPCBudW1XaW5kb3dzOyBkc3RXaW4gKz0gMSkgeworICAgIEZJWFBfQ05DTCAqcENuY2wgPQorICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5zcGVjdHJhbENvZWZmaWNpZW50ICsgKHNyY1dpbiAqIHdpbmRvd0xlbik7CisgICAgRklYUF9EQkwgKnBPdXQgPSBwU3BlY3RyYWxDb2VmZmljaWVudCArIChkc3RXaW4gKiB3aW5kb3dMZW4pOworCisgICAgaWYgKG1vZGUgPT0gMSkgeworICAgICAgLyogbXV0ZSBpZiBhdHRJZHggZ2V0cyBsYXJnZSBlbmF1Z2ggKi8KKyAgICAgIGlmIChhdHRJZHggPiBwQ29uY2VhbG1lbnRJbmZvLT5wQ29uY2VhbFBhcmFtcy0+bnVtRmFkZU91dEZyYW1lcykgeworICAgICAgICBGREttZW1jbGVhcihwQ25jbCwgc2l6ZW9mKEZJWFBfREJMKSAqIHdpbmRvd0xlbik7CisgICAgICB9CisKKyAgICAgIC8qIHJlc3RvcmUgZnJlcXVlbmN5IGNvZWZmaWNpZW50cyBmcm9tIGJ1ZmZlciAtIGF0dGVudWF0aW9uIGlzIGRvbmUgbGF0ZXIKKyAgICAgICAqLworICAgICAgZm9yIChpID0gMDsgaSA8IHdpbmRvd0xlbjsgaSsrKSB7CisgICAgICAgIHBPdXRbaV0gPSBwQ25jbFtpXTsKKyAgICAgIH0KKworICAgICAgLyogYXBwbHkgcmFuZG9tIGNoYW5nZSBvZiBzaWduIGZvciBzcGVjdHJhbCBjb2VmZmljaWVudHMgKi8KKyAgICAgIENDb25jZWFsbWVudF9BcHBseVJhbmRvbVNpZ24ocENvbmNlYWxtZW50SW5mby0+aVJhbmRvbVBoYXNlLCBwT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dMZW4pOworCisgICAgICAvKiBJbmNyZW1lbnQgcmFuZG9tIHBoYXNlIGluZGV4IHRvIGF2b2lkIHJlcGV0aXRpb24gYXJ0aWZhY3RzLiAqLworICAgICAgcENvbmNlYWxtZW50SW5mby0+aVJhbmRvbVBoYXNlID0KKyAgICAgICAgICAocENvbmNlYWxtZW50SW5mby0+aVJhbmRvbVBoYXNlICsgMSkgJiAoQUFDX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKKworICAgICAgLyogc2V0IG9sZCBzY2FsZSBmYWN0b3JzICovCisgICAgICBwU3BlY1NjYWxlW2RzdFdpbiAqIHdpbklkeFN0cmlkZV0gPQorICAgICAgICAgIHBDb25jZWFsbWVudEluZm8tPnNwZWNTY2FsZVtzcmNXaW4gKiB3aW5JZHhTdHJpZGVdOworICAgIH0KKworICAgIHNyY1dpbiArPSAxOworCisgICAgaWYgKHNyY1dpbiA+PSBudW1XaW5kb3dzKSB7CisgICAgICAvKiBlbmQgb2Ygc2VxdWVuY2UgLT4gcmV3aW5kIHRvIGZpcnN0IHdpbmRvdyBvZiBncm91cCAqLworICAgICAgc3JjV2luID0gc3JjR3JwU3RhcnQ7CisgICAgICBudW1XaW5HcnBQZXJGYWMgKz0gMTsKKyAgICAgIGlmIChudW1XaW5HcnBQZXJGYWMgPj0gYXR0SWR4U3RyaWRlKSB7CisgICAgICAgIG51bVdpbkdycFBlckZhYyA9IDA7CisgICAgICAgIGF0dElkeCArPSAxOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIHN0b3JlIGN1cnJlbnQgc3RhdGUgKi8KKworICBwQ29uY2VhbG1lbnRJbmZvLT53aW5HcnBPZmZzZXRbbW9kZV0gPSBzcmNXaW4gLSBzcmNHcnBTdGFydDsKKyAgRkRLX0FTU0VSVCgocENvbmNlYWxtZW50SW5mby0+d2luR3JwT2Zmc2V0W21vZGVdID49IDApICYmCisgICAgICAgICAgICAgKHBDb25jZWFsbWVudEluZm8tPndpbkdycE9mZnNldFttb2RlXSA8IDgpKTsKKyAgcENvbmNlYWxtZW50SW5mby0+YXR0R3JwT2Zmc2V0W21vZGVdID0gbnVtV2luR3JwUGVyRmFjOworICBGREtfQVNTRVJUKChwQ29uY2VhbG1lbnRJbmZvLT5hdHRHcnBPZmZzZXRbbW9kZV0gPj0gMCkgJiYKKyAgICAgICAgICAgICAocENvbmNlYWxtZW50SW5mby0+YXR0R3JwT2Zmc2V0W21vZGVdIDwgYXR0SWR4U3RyaWRlKSk7CisKKyAgaWYgKG1vZGUgPT0gMCkgeworICAgIHBDb25jZWFsbWVudEluZm8tPmNudEZhZGVGcmFtZXMgPSBhdHRJZHg7CisgIH0KKworICBhcHBsaWVkUHJvY2Vzc2luZyA9IDE7CisKKyAgcmV0dXJuIGFwcGxpZWRQcm9jZXNzaW5nOworfQorCisvKiEKKyAgXGJyaWVmIERvIFRpbWUgZG9tYWluIGZhZGluZyAoVERGYWRpbmcpIGluIGNvbmNlYWxtZW50IGNhc2UKKworICBJbiBjYXNlIG9mIGNvbmNlYWxtZW50LCB0aGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YgdGhlIGZhZGluZywgYWZ0ZXIgdGltZQorZG9tYWluIHNpZ25hbCBoYXMgYmVlbiByZW5kZXJlZCBieSB0aGUgcmVzcGVjdGl2ZSBzaWduYWwgcmVuZGVyaW5nIGZ1bmN0aW9ucy4KKyAgVGhlIGZhZGluZyBvdXQgaW4gY2FzZSBvZiBBQ0VMUCBkZWNvZGluZyBpcyBub3QgZG9uZSBieSB0aGlzIGZ1bmN0aW9uIGJ1dCBieQordGhlIEFDRUxQIGRlY29kZXIgZm9yIHRoZSBmaXJzdCBjb25jZWFsZWQgZnJhbWUgaWYgQ09OQ0VBTF9DT1JFX0lHTk9SQU5UX0ZBREUgaXMKK25vdCBzZXQuCisKKyAgVGltZURvbWFpbiBmYWRpbmcgbmV2ZXIgY3JlYXRlcyBqdW1wcyBpbiBlbmVyZ3kgLyBkaXNjb250aW51aXRpZXMsIGl0IGFsd2F5cworZG9lcyBhIGNvbnRpbnVvdXMgZmFkaW5nLiBUbyBhY2hpZXZlIHRoaXMsIGZhZGluZyBpcyBhbHdheXMgZG9uZSBmcm9tIGEgc3RhcnRpbmcKK3BvaW50IHRvIGEgdGFyZ2V0IHBvaW50LCB3aGlsZSB0aGUgc3RhcnRpbmcgcG9pbnQgaXMgYWx3YXlzIGRldGVybWluZWQgdG8gYmUgdGhlCitsYXN0IHRhcmdldCBwb2ludC4gQnkgdmFyeWluZyB0aGUgdGFyZ2V0IHBvaW50IG9mIGEgZmFkaW5nLCB0aGUgZmFkaW5nIHNsb3BlIGNhbgorYmUgY29udHJvbGxlZC4KKworICBUaGlzIHByaW5jaXBsZSBpcyBhcHBsaWVkIHRvIHRoZSBmYWRpbmcgd2l0aGluIGEgZnJhbWUgYW5kIHRoZSBmYWRpbmcgZnJvbQorZnJhbWUgdG8gZnJhbWUuCisKKyAgT25lIGZyYW1lIGlzIGRpdmlkZWQgaW50byA4IHN1YmZyYW1lcyB0byBvYnRhaW4gOCBwYXJ0cyBvZiBmYWRpbmcgc2xvcGVzCit3aXRoaW4gYSBmcmFtZSwgZWFjaCBtYXliZSB3aXRoIGl0cyBvd24gZ3JhZGllbnQuCisKKyAgV29ya2Zsb3c6CisgIDEuKSBEZXRlcm1pbmUgRmFkaW5nIGJlaGF2aW9yIGFuZCBlbmQtb2YtZnJhbWUgdGFyZ2V0IGZhZGluZyBsZXZlbCwgYmFzZWQgb24KK2NvbmNlYWxtZW50U3RhdGUgKGRldGVybWluZWQgYnkgQ0NvbmNlYWxtZW50X1VwZGF0ZVN0YXRlKCkpIGFuZCB0aGUgY29yZSBtb2RlLgorICAgICAgICAtIEJ5IF9ERUZBVUxUXywKKyAgICAgICAgICBUaGUgdGFyZ2V0IGZhZGluZyBsZXZlbCBpcyBkZXRlcm1pbmVkIGJ5IGZhZGVPdXRGYWN0b3JbY250RmFkZUZyYW1lc10KK2luIGNhc2Ugb2YgZmFkZU91dCwgb3IgZmFkZUluRmFjdG9yW2NudEZhZGVGcmFtZXNdIGluIGNhc2Ugb2YgZmFkZUluLgorICAgICAgICAgIC0tPiBmYWRpbmcgdHlwZSBpcyBGQURFX1RJTUVET01BSU4gaW4gdGhpcyBjYXNlLiBUYXJnZXQgZmFkaW5nIGxldmVsCitpcyBkZXRlcm1pbmVkIGJ5IGZhZGluZyBpbmRleCBjbnRGYWRlRnJhbWVzLgorCisgICAgICAgIC0gSWYgY29uY2VhbG1lbnRTdGF0ZSBpcyBzaWduYWxsaW5nIGEgX01VVEVEIFNJR05BTF8sCisgICAgICAgICAgVERGYWRpbmcgZGVjYXlzIHRvIDAgd2l0aGluIDEvOHRoIG9mIGEgZnJhbWUgaWYgbnVtRmFkZU91dEZyYW1lcyA9PSAwLgorICAgICAgICAgIC0tPiBmYWRpbmcgdHlwZSBpcyBGQURFX1RJTUVET01BSU5fVE9TUEVDVFJBTE1VVEUgaW4gdGhpcyBjYXNlLgorCisgICAgICAgIC0gSWYgY29uY2VhbG1lbnRTdGF0ZSBpcyBzaWduYWxsaW5nIHRoZSBfRU5EIE9GIE1VVElOR18sCisgICAgICAgICAgVERGYWRpbmcgZmFkZXMgdG8gdGFyZ2V0IGZhZGluZyBsZXZlbCB3aXRoaW4gMS84dGggb2YgYSBmcmFtZSBpZgorbnVtRmFkZUluRnJhbWVzID09IDAuCisgICAgICAgICAgLS0+IGZhZGluZyB0eXBlIGlzIEZBREVfVElNRURPTUFJTl9GUk9NU1BFQ1RSQUxNVVRFIGluIHRoaXMgY2FzZS4KK1RhcmdldCBmYWRpbmcgbGV2ZWwgaXMgZGV0ZXJtaW5lZCBieSBmYWRpbmcgaW5kZXggY250RmFkZUZyYW1lcy4KKworI2lmbmRlZiBDT05DRUFMX0NPUkVfSUdOT1JBTlRfRkFERQorICAgICAgICAtIEluIGNhc2Ugb2YgYW4gX0FDRUxQIEZBREVPVVRfLAorICAgICAgICAgIFRERmFkaW5nIGxlYXZlcyBmYWRpbmcgY29udHJvbCB0byBBQ0VMUCBkZWNvZGVyIGZvciAxLzIgZnJhbWUuCisgICAgICAgICAgLS0+IGZhZGluZyB0eXBlIGlzIEZBREVfQUNFTFBET01BSU4gaW4gdGhpcyBjYXNlLgorI2VuZGlmCisKKyAgMi4pIFJlbmRlciBmYWRpbmcgbGV2ZWxzIHdpdGhpbiBjdXJyZW50IGZyYW1lIGFuZCBkbyB0aGUgZmluYWwgZmFkaW5nOgorICAgICAgTWFwIEZhZGluZyBzbG9wZXMgdG8gZmFkaW5nIGxldmVscyBhbmQgYXBwbHkgdG8gdGltZSBkb21haW4gc2lnbmFsLgorCisKKyovCisKK0lOVCBDQ29uY2VhbG1lbnRfVERGYWRpbmcoCisgICAgaW50IGxlbiwgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqKnBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgIEZJWFBfUENNICpwY21kYXRhLCBGSVhQX1BDTSAqcGNtZGF0YV8xKSB7CisgIC8qCisgIERvIHRoZSBmYWRpbmcgaW4gVGltZSBkb21haW4gYmFzZWQgb24gY29uY2VhbG1lbnQgc3RhdGVzIGFuZCBjb3JlIG1vZGUKKyAgKi8KKyAgRklYUF9EQkwgZmFkZVN0b3AsIGF0dE11dGUgPSAoRklYUF9EQkwpMDsKKyAgaW50IGlkeCA9IDAsIGlpOworICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvID0KKyAgICAgICpwcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbzsKKyAgQ0NvbmNlYWxtZW50SW5mbyAqcENvbmNlYWxtZW50SW5mbyA9CisgICAgICAmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvOworICBDQ29uY2VhbFBhcmFtcyAqcENvbmNlYWxQYXJhbXMgPSBwQ29uY2VhbG1lbnRJbmZvLT5wQ29uY2VhbFBhcmFtczsKKyAgY29uc3QgQ0NvbmNlYWxtZW50U3RhdGUgY29uY2VhbFN0YXRlID0gcENvbmNlYWxtZW50SW5mby0+Y29uY2VhbFN0YXRlOworICBURGZhZGluZ1R5cGUgZmFkaW5nVHlwZTsKKyAgRklYUF9EQkwgZmFkaW5nU3RhdGlvbnNbOV0gPSB7MH07CisgIGludCBmYWRpbmdTdGVwc1s4XSA9IHswfTsKKyAgY29uc3QgRklYUF9EQkwgZmFkZVN0YXJ0ID0KKyAgICAgIHBDb25jZWFsbWVudEluZm8KKyAgICAgICAgICAtPmZhZGVfb2xkOyAvKiBzdGFydCBmYWRpbmcgYXQgbGFzdCBlbmQtb2YtZnJhbWUgYXR0ZW51YXRpb24gKi8KKyAgRklYUF9TR0wgKmZhZGVGYWN0b3IgPSBwQ29uY2VhbFBhcmFtcy0+ZmFkZU91dEZhY3RvcjsKKyAgY29uc3QgSU5UIGNudEZhZGVGcmFtZXMgPSBwQ29uY2VhbG1lbnRJbmZvLT5jbnRGYWRlRnJhbWVzOworICBpbnQgVERGYWRlT3V0U3RvcEJlZm9yZU11dGUgPSAxOworICBpbnQgVERGYWRlSW5TdG9wQmVmb3JlRnVsbExldmVsID0gMTsKKworICAvKgorICBkZXRlcm1pbmUgRmFkaW5nIGJlaGF2aW91ciAoZW5kLW9mLWZyYW1lIGF0dGVudWF0aW9uIGFuZCBmYWRpbmcgdHlwZSkgKDEuKQorICAqLworCisgIHN3aXRjaCAoY29uY2VhbFN0YXRlKSB7CisgICAgY2FzZSBDb25jZWFsU3RhdGVfU2luZ2xlOgorICAgIGNhc2UgQ29uY2VhbFN0YXRlX011dGU6CisgICAgY2FzZSBDb25jZWFsU3RhdGVfRmFkZU91dDoKKyAgICAgIGlkeCA9IChwQ29uY2VhbFBhcmFtcy0+bWV0aG9kID09IENvbmNlYWxNZXRob2ROb2lzZSkgPyBjbnRGYWRlRnJhbWVzIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNudEZhZGVGcmFtZXM7CisgICAgICBmYWRpbmdUeXBlID0gRkFERV9USU1FRE9NQUlOOworCisgICAgICBpZiAoY29uY2VhbFN0YXRlID09IENvbmNlYWxTdGF0ZV9NdXRlIHx8CisgICAgICAgICAgKGNudEZhZGVGcmFtZXMgKyBUREZhZGVPdXRTdG9wQmVmb3JlTXV0ZSkgPgorICAgICAgICAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5wQ29uY2VhbFBhcmFtcy0+bnVtRmFkZU91dEZyYW1lcykgeworICAgICAgICBmYWRpbmdUeXBlID0gRkFERV9USU1FRE9NQUlOX1RPU1BFQ1RSQUxNVVRFOworICAgICAgfQorCisgICAgICBicmVhazsKKyAgICBjYXNlIENvbmNlYWxTdGF0ZV9GYWRlSW46CisgICAgICBpZHggPSBjbnRGYWRlRnJhbWVzOworICAgICAgaWR4IC09IFRERmFkZUluU3RvcEJlZm9yZUZ1bGxMZXZlbDsKKyAgICBjYXNlIENvbmNlYWxTdGF0ZV9PazoKKyAgICAgIGZhZGVGYWN0b3IgPSBwQ29uY2VhbFBhcmFtcy0+ZmFkZUluRmFjdG9yOworICAgICAgaWR4ID0gKGNvbmNlYWxTdGF0ZSA9PSBDb25jZWFsU3RhdGVfT2spID8gLTEgOiBpZHg7CisgICAgICBmYWRpbmdUeXBlID0gKHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZV9vbGQgPT0gQ29uY2VhbFN0YXRlX011dGUpCisgICAgICAgICAgICAgICAgICAgICAgID8gRkFERV9USU1FRE9NQUlOX0ZST01TUEVDVFJBTE1VVEUKKyAgICAgICAgICAgICAgICAgICAgICAgOiBGQURFX1RJTUVET01BSU47CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgIGZhZGluZ1R5cGUgPSBGQURFX1RJTUVET01BSU5fVE9TUEVDVFJBTE1VVEU7CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIGRldGVybWluZSBUYXJnZXQgZW5kLW9mLWZyYW1lIGZhZGluZyBsZXZlbCBhbmQgZmFkaW5nIHNsb3BlICovCisgIHN3aXRjaCAoZmFkaW5nVHlwZSkgeworICAgIGNhc2UgRkFERV9USU1FRE9NQUlOX0ZST01TUEVDVFJBTE1VVEU6CisgICAgICBmYWRlU3RvcCA9CisgICAgICAgICAgKGlkeCA8IDApID8gKEZJWFBfREJMKU1BWFZBTF9EQkwgOiBGWF9TR0wyRlhfREJMKGZhZGVGYWN0b3JbaWR4XSk7CisgICAgICBpZiAocENvbmNlYWxtZW50SW5mby0+cENvbmNlYWxQYXJhbXMtPm51bUZhZGVJbkZyYW1lcyA9PSAwKSB7CisgICAgICAgIC8qIGRvIHN0ZXAgYXMgZmFzdCBhcyBwb3NzaWJsZSAqLworICAgICAgICBmYWRpbmdTdGVwc1swXSA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgQ0NvbmNlYWxtZW50X1RERmFkaW5nX2RvTGluZWFyRmFkaW5nU3RlcHMoJmZhZGluZ1N0ZXBzWzBdKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkFERV9USU1FRE9NQUlOOgorICAgICAgZmFkZVN0b3AgPQorICAgICAgICAgIChpZHggPCAwKSA/IChGSVhQX0RCTClNQVhWQUxfREJMIDogRlhfU0dMMkZYX0RCTChmYWRlRmFjdG9yW2lkeF0pOworICAgICAgQ0NvbmNlYWxtZW50X1RERmFkaW5nX2RvTGluZWFyRmFkaW5nU3RlcHMoJmZhZGluZ1N0ZXBzWzBdKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkFERV9USU1FRE9NQUlOX1RPU1BFQ1RSQUxNVVRFOgorICAgICAgZmFkZVN0b3AgPSBhdHRNdXRlOworICAgICAgaWYgKHBDb25jZWFsbWVudEluZm8tPnBDb25jZWFsUGFyYW1zLT5udW1GYWRlT3V0RnJhbWVzID09IDApIHsKKyAgICAgICAgLyogZG8gc3RlcCBhcyBmYXN0IGFzIHBvc3NpYmxlICovCisgICAgICAgIGZhZGluZ1N0ZXBzWzBdID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBDQ29uY2VhbG1lbnRfVERGYWRpbmdfZG9MaW5lYXJGYWRpbmdTdGVwcygmZmFkaW5nU3RlcHNbMF0pOworICAgICAgYnJlYWs7CisgIH0KKworICAvKgorICBSZW5kZXIgZmFkaW5nIGxldmVscyB3aXRoaW4gY3VycmVudCBmcmFtZSBhbmQgZG8gdGhlIGZpbmFsIGZhZGluZyAoMi4pCisgICovCisKKyAgbGVuID4+PSAzOworICBDQ29uY2VhbG1lbnRfVERGYWRlRmlsbEZhZGluZ1N0YXRpb25zKGZhZGluZ1N0YXRpb25zLCBmYWRpbmdTdGVwcywgZmFkZVN0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFkZVN0YXJ0LCBmYWRpbmdUeXBlKTsKKworICBpZiAoKGZhZGluZ1N0YXRpb25zWzhdICE9IChGSVhQX0RCTClNQVhWQUxfREJMKSB8fAorICAgICAgKGZhZGluZ1N0YXRpb25zWzddICE9IChGSVhQX0RCTClNQVhWQUxfREJMKSB8fAorICAgICAgKGZhZGluZ1N0YXRpb25zWzZdICE9IChGSVhQX0RCTClNQVhWQUxfREJMKSB8fAorICAgICAgKGZhZGluZ1N0YXRpb25zWzVdICE9IChGSVhQX0RCTClNQVhWQUxfREJMKSB8fAorICAgICAgKGZhZGluZ1N0YXRpb25zWzRdICE9IChGSVhQX0RCTClNQVhWQUxfREJMKSB8fAorICAgICAgKGZhZGluZ1N0YXRpb25zWzNdICE9IChGSVhQX0RCTClNQVhWQUxfREJMKSB8fAorICAgICAgKGZhZGluZ1N0YXRpb25zWzJdICE9IChGSVhQX0RCTClNQVhWQUxfREJMKSB8fAorICAgICAgKGZhZGluZ1N0YXRpb25zWzFdICE9IChGSVhQX0RCTClNQVhWQUxfREJMKSB8fAorICAgICAgKGZhZGluZ1N0YXRpb25zWzBdICE9CisgICAgICAgKEZJWFBfREJMKU1BWFZBTF9EQkwpKSAvKiBpZiB0aGVyZSdzIHNvbWV0aGluZyB0byBmYWRlICovCisgIHsKKyAgICBpbnQgc3RhcnQgPSAwOworICAgIGZvciAoaWkgPSAwOyBpaSA8IDg7IGlpKyspIHsKKyAgICAgIENDb25jZWFsbWVudF9UREZhZGVQY21BdHQoc3RhcnQsIGxlbiwgZmFkaW5nU3RhdGlvbnNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWRpbmdTdGF0aW9uc1tpaSArIDFdLCBwY21kYXRhKTsKKyAgICAgIHN0YXJ0ICs9IGxlbjsKKyAgICB9CisgIH0KKyAgQ0NvbmNlYWxtZW50X1RETm9pc2VfQXBwbHkocENvbmNlYWxtZW50SW5mbywgbGVuLCBwY21kYXRhKTsKKworICAvKiBTYXZlIGVuZC1vZi1mcmFtZSBhdHRlbnVhdGlvbiBhbmQgZmFkaW5nIHR5cGUgKi8KKyAgcENvbmNlYWxtZW50SW5mby0+bGFzdEZhZGluZ1R5cGUgPSBmYWRpbmdUeXBlOworICBwQ29uY2VhbG1lbnRJbmZvLT5mYWRlX29sZCA9IGZhZGVTdG9wOworICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGVfb2xkID0gY29uY2VhbFN0YXRlOworCisgIHJldHVybiAxOworfQorCisvKiBhdHRlbnVhdGUgcGNtZGF0YSBpbiBUaW1lIERvbWFpbiBGYWRpbmcgcHJvY2VzcyAqLworc3RhdGljIHZvaWQgQ0NvbmNlYWxtZW50X1RERmFkZVBjbUF0dChpbnQgc3RhcnQsIGludCBsZW4sIEZJWFBfREJMIGZhZGVTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgZmFkZVN0b3AsIEZJWFBfUENNICpwY21kYXRhKSB7CisgIGludCBpOworICBGSVhQX0RCTCBkU3RlcDsKKyAgRklYUF9EQkwgZEdhaW47CisgIEZJWFBfREJMIGRHYWluX2FwcGx5OworICBpbnQgYml0c2hpZnQgPSAoREZSQUNUX0JJVFMgLSBTQU1QTEVfQklUUyk7CisKKyAgLyogc2V0IHN0YXJ0IGVuZXJneSAqLworICBkR2FpbiA9IGZhZGVTdGFydDsKKyAgLyogZGV0ZXJtaW5lIGVuZXJneSBzdGVwcyBmcm9tIHNhbXBsZSB0byBzYW1wbGUgKi8KKyAgZFN0ZXAgPSAoRklYUF9EQkwpKChpbnQpKChmYWRlU3RhcnQgPj4gMSkgLSAoZmFkZVN0b3AgPj4gMSkpIC8gbGVuKSA8PCAxOworCisgIGZvciAoaSA9IHN0YXJ0OyBpIDwgKHN0YXJ0ICsgbGVuKTsgaSsrKSB7CisgICAgZEdhaW4gLT0gZFN0ZXA7CisgICAgLyogcHJldmVudCBnYWluIGZyb20gZ2V0dGluZyBuZWdhdGl2ZSBkdWUgdG8gcG9zc2libGUgZml4cG9pbnQgaW5hY2N1cmFjaWVzCisgICAgICovCisgICAgZEdhaW5fYXBwbHkgPSBmTWF4KChGSVhQX0RCTCkwLCBkR2Fpbik7CisgICAgLyogZmluYWxseSwgYXR0ZW51YXRlIHNhbXBsZXMgKi8KKyAgICBwY21kYXRhW2ldID0gKEZJWFBfUENNKSgoZk11bHQocGNtZGF0YVtpXSwgKGRHYWluX2FwcGx5KSkpID4+IGJpdHNoaWZ0KTsKKyAgfQorfQorCisvKgorXGJyaWVmIEZpbGwgRmFkaW5nU3RhdGlvbnMKKworVGhlIGZhZGluZ3N0YXRpb25zIGFyZSB0aGUgYXR0ZW51YXRpb24gZmFjdG9ycywgYmVpbmcgYXBwbGllZCB0byBpdHMgZGVkaWNhdGVkCitwb3J0aW9ucyBvZiBwY20gZGF0YS4gVGhleSBhcmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgZmFkaW5nc3RlcHMuIE9uZSBmYWRpbmdzdGVwCitpcyB0aGUgd2VpZ2h0ZWQgY29udHJpYnV0aW9uIHRvIHRoZSBmYWRpbmcgc2xvcGUgd2l0aGluIGl0cyBkZWRpY2F0ZWQgcG9ydGlvbiBvZgorcGNtIGRhdGEuCisKKypGYWRpbmdzdGVwcyAgOiAgICAgIDAgIDAgIDAgIDEgIDAgIDEgIDIgIDAKKworICAgICAgICAgICAgICAgICAgfDwtICAxIEZyYW1lIHBjbSBkYXRhIC0+fAorICAgICAgZmFkZVN0YXJ0LS0+fF9fX19fX19fX18gICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgXiAgXiAgXiAgXiBcX19fXyAgICAgICAgfAorIEF0dGVudWF0aW9uICA6ICAgfCAgfCAgfCAgfCAgXiAgXlxfXyAgICAgfAorICAgICAgICAgICAgICAgICAgfCAgfCAgfCAgfCAgfCAgfCAgXlwgICAgfAorICAgICAgICAgICAgICAgICAgfCAgfCAgfCAgfCAgfCAgfCAgfCBcX19ffDwtLSBmYWRlU3RvcAorICAgICAgICAgICAgICAgICAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgXiAgXgorICAgICAgICAgICAgICAgICAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgfAorRmFkaW5nc3RhdGlvbnM6ICBbMF1bMV1bMl1bM11bNF1bNV1bNl1bN11bOF0KKworKEZhZGluZ3N0YXRpb25zICJbMF0iIGlzICJbOF0gZnJvbSBwcmV2aW91cyBmcmFtZSIsIHRoZXJlZm9yZSBpdHMgbm90IG1lYW5pbmdmdWwKK3RvIGJlIGVkaXRlZCkKKworKi8KK3N0YXRpYyB2b2lkIENDb25jZWFsbWVudF9UREZhZGVGaWxsRmFkaW5nU3RhdGlvbnMoRklYUF9EQkwgKmZhZGluZ1N0YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmZhZGluZ1N0ZXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBmYWRlU3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgZmFkZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURGZhZGluZ1R5cGUgZmFkaW5nVHlwZSkgeworICBpbnQgaTsKKyAgSU5UIGZhZGluZ1N0ZXBzX3N1bSA9IDA7CisgIElOVCBmYWRlRGlmZjsKKworICBmYWRpbmdTdGVwc19zdW0gPSBmYWRpbmdTdGVwc1swXSArIGZhZGluZ1N0ZXBzWzFdICsgZmFkaW5nU3RlcHNbMl0gKworICAgICAgICAgICAgICAgICAgICBmYWRpbmdTdGVwc1szXSArIGZhZGluZ1N0ZXBzWzRdICsgZmFkaW5nU3RlcHNbNV0gKworICAgICAgICAgICAgICAgICAgICBmYWRpbmdTdGVwc1s2XSArIGZhZGluZ1N0ZXBzWzddOworICBmYWRlRGlmZiA9ICgoSU5UKShmYWRlU3RvcCAtIGZhZGVTdGFydCkgLyBmTWF4KGZhZGluZ1N0ZXBzX3N1bSwgKElOVCkxKSk7CisgIGZhZGluZ1N0YXRpb25zWzBdID0gZmFkZVN0YXJ0OworICBmb3IgKGkgPSAxOyBpIDwgODsgaSsrKSB7CisgICAgZmFkaW5nU3RhdGlvbnNbaV0gPQorICAgICAgICBmYWRpbmdTdGF0aW9uc1tpIC0gMV0gKyAoRklYUF9EQkwpKGZhZGVEaWZmICogZmFkaW5nU3RlcHNbaSAtIDFdKTsKKyAgfQorICBmYWRpbmdTdGF0aW9uc1s4XSA9IGZhZGVTdG9wOworfQorCitzdGF0aWMgdm9pZCBDQ29uY2VhbG1lbnRfVERGYWRpbmdfZG9MaW5lYXJGYWRpbmdTdGVwcyhpbnQgKmZhZGluZ1N0ZXBzKSB7CisgIGZhZGluZ1N0ZXBzWzBdID0gZmFkaW5nU3RlcHNbMV0gPSBmYWRpbmdTdGVwc1syXSA9IGZhZGluZ1N0ZXBzWzNdID0KKyAgICAgIGZhZGluZ1N0ZXBzWzRdID0gZmFkaW5nU3RlcHNbNV0gPSBmYWRpbmdTdGVwc1s2XSA9IGZhZGluZ1N0ZXBzWzddID0gMTsKK30KKworLyogZW5kIG9mIFRpbWVEb21haW5GYWRpbmcgZnVuY3Rpb25zICovCisKKy8qIGRlcml2ZWQgZnJvbSBpbnQgVXNhY1JhbmRvbVNpZ24oKSAqLworc3RhdGljIGludCBDQ29uY2VhbG1lbnRfVEROb2lzZV9SYW5kb20oVUxPTkcgKnNlZWQpIHsKKyAgKnNlZWQgPSAoVUxPTkcpKCgoVUlOVDY0KSgqc2VlZCkgKiA2OTA2OSkgKyA1KTsKKyAgcmV0dXJuIChpbnQpKCpzZWVkKTsKK30KKworc3RhdGljIHZvaWQgQ0NvbmNlYWxtZW50X1RETm9pc2VfQXBwbHkoQ0NvbmNlYWxtZW50SW5mbyAqY29uc3QgcENvbmNlYWxtZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBsZW4sIEZJWFBfUENNICpjb25zdCBwY21kYXRhKSB7CisgIEZJWFBfUENNICpzdGF0ZXMgPSBwQ29uY2VhbG1lbnRJbmZvLT5URE5vaXNlU3RhdGVzOworICBGSVhQX1BDTSBub2lzZVZhbDsKKyAgRklYUF9EQkwgbm9pc2VWYWxMb25nOworICBGSVhQX1NHTCAqY29lZiA9IHBDb25jZWFsbWVudEluZm8tPlRETm9pc2VDb2VmOworICBGSVhQX0RCTCBURE5vaXNlQXR0OworICBVTE9ORyBzZWVkID0gcENvbmNlYWxtZW50SW5mby0+VEROb2lzZVNlZWQgPQorICAgICAgKFVMT05HKUNDb25jZWFsbWVudF9URE5vaXNlX1JhbmRvbSgmcENvbmNlYWxtZW50SW5mby0+VEROb2lzZVNlZWQpICsgMTsKKworICBURE5vaXNlQXR0ID0gcENvbmNlYWxtZW50SW5mby0+cENvbmNlYWxQYXJhbXMtPmNvbWZvcnROb2lzZUxldmVsOworCisgIGludCBpaTsKKworICBpZiAoKHBDb25jZWFsbWVudEluZm8tPmNvbmNlYWxTdGF0ZSAhPSBDb25jZWFsU3RhdGVfT2sgfHwKKyAgICAgICBwQ29uY2VhbG1lbnRJbmZvLT5jb25jZWFsU3RhdGVfb2xkICE9IENvbmNlYWxTdGF0ZV9PaykgJiYKKyAgICAgIFRETm9pc2VBdHQgIT0gKEZJWFBfREJMKTApIHsKKyAgICBmb3IgKGlpID0gMDsgaWkgPCAobGVuIDw8IDMpOyBpaSsrKSB7CisgICAgICAvKiBjcmVhdGUgZmlsdGVyZWQgbm9pc2UgKi8KKyAgICAgIHN0YXRlc1syXSA9IHN0YXRlc1sxXTsKKyAgICAgIHN0YXRlc1sxXSA9IHN0YXRlc1swXTsKKyAgICAgIHN0YXRlc1swXSA9ICgoRklYUF9QQ00pQ0NvbmNlYWxtZW50X1RETm9pc2VfUmFuZG9tKCZzZWVkKSk7CisgICAgICBub2lzZVZhbExvbmcgPSBmTXVsdChzdGF0ZXNbMF0sIGNvZWZbMF0pICsgZk11bHQoc3RhdGVzWzFdLCBjb2VmWzFdKSArCisgICAgICAgICAgICAgICAgICAgICBmTXVsdChzdGF0ZXNbMl0sIGNvZWZbMl0pOworICAgICAgbm9pc2VWYWwgPSBGWF9EQkwyRlhfUENNKGZNdWx0KG5vaXNlVmFsTG9uZywgVEROb2lzZUF0dCkpOworCisgICAgICAvKiBhZGQgZmlsdGVyZWQgbm9pc2UgLSBjaGVjayBmb3IgY2xpcHBpbmcsIGJlZm9yZSAqLworICAgICAgaWYgKHBjbWRhdGFbaWldID4gKEZJWFBfUENNKU1BWFZBTF9GSVhQX1BDTSAtIG5vaXNlVmFsICYmCisgICAgICAgICAgbm9pc2VWYWwgPiAoRklYUF9QQ00pMCkgeworICAgICAgICBub2lzZVZhbCA9IG5vaXNlVmFsICogKEZJWFBfUENNKS0xOworICAgICAgfSBlbHNlIGlmIChwY21kYXRhW2lpXSA8IChGSVhQX1BDTSlNSU5WQUxfRklYUF9QQ00gLSBub2lzZVZhbCAmJgorICAgICAgICAgICAgICAgICBub2lzZVZhbCA8IChGSVhQX1BDTSkwKSB7CisgICAgICAgIG5vaXNlVmFsID0gbm9pc2VWYWwgKiAoRklYUF9QQ00pLTE7CisgICAgICB9CisKKyAgICAgIHBjbWRhdGFbaWldICs9IG5vaXNlVmFsOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9jb25jZWFsLmggYi9saWJBQUNkZWMvc3JjL2NvbmNlYWwuaAppbmRleCAyMGU2NzRmLi5lMDFhNzk2IDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2NvbmNlYWwuaAorKysgYi9saWJBQUNkZWMvc3JjL2NvbmNlYWwuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3MCArOTAsNjMgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKwogICAgRGVzY3JpcHRpb246IGluZGVwZW5kZW50IGNoYW5uZWwgY29uY2VhbG1lbnQKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfQ09OQ0VBTF9IXwotI2RlZmluZSBfQ09OQ0VBTF9IXwotCi0jaW5jbHVkZSAiYWFjZGVjb2Rlcl9saWIuaCIKKyNpZm5kZWYgQ09OQ0VBTF9ICisjZGVmaW5lIENPTkNFQUxfSAogCiAjaW5jbHVkZSAiY2hhbm5lbGluZm8uaCIKIAotI2RlZmluZSBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVEICggMHhGRkZFICkKKyNkZWZpbmUgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCAoMHhGRkZFKQogCi12b2lkIENDb25jZWFsbWVudF9Jbml0Q29tbW9uRGF0YSAgKENDb25jZWFsUGFyYW1zICAgKnBDb25jZWFsQ29tbW9uRGF0YSk7Cit2b2lkIENDb25jZWFsbWVudF9Jbml0Q29tbW9uRGF0YShDQ29uY2VhbFBhcmFtcyAqcENvbmNlYWxDb21tb25EYXRhKTsKIAotdm9pZCBDQ29uY2VhbG1lbnRfSW5pdENoYW5uZWxEYXRhIChDQ29uY2VhbG1lbnRJbmZvICpoQ29uY2VhbG1lbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ29uY2VhbFBhcmFtcyAgICpwQ29uY2VhbENvbW1vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgc2FtcGxlc1BlckZyYW1lKTsKK3ZvaWQgQ0NvbmNlYWxtZW50X0luaXRDaGFubmVsRGF0YShDQ29uY2VhbG1lbnRJbmZvICpoQ29uY2VhbG1lbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDb25jZWFsUGFyYW1zICpwQ29uY2VhbENvbW1vbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDREVDX1JFTkRFUl9NT0RFIGluaXRSZW5kZXJNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVzUGVyRnJhbWUpOwogCi1DQ29uY2VhbG1lbnRNZXRob2QKLSAgICAgQ0NvbmNlYWxtZW50X0dldE1ldGhvZCAgICAgICAoQ0NvbmNlYWxQYXJhbXMgKnBDb25jZWFsQ29tbW9uRGF0YSk7CitDQ29uY2VhbG1lbnRNZXRob2QgQ0NvbmNlYWxtZW50X0dldE1ldGhvZChDQ29uY2VhbFBhcmFtcyAqcENvbmNlYWxDb21tb25EYXRhKTsKIAotVUlOVAotICBDQ29uY2VhbG1lbnRfR2V0RGVsYXkgICAgICAgICAgIChDQ29uY2VhbFBhcmFtcyAqcENvbmNlYWxDb21tb25EYXRhKTsKK1VJTlQgQ0NvbmNlYWxtZW50X0dldERlbGF5KENDb25jZWFsUGFyYW1zICpwQ29uY2VhbENvbW1vbkRhdGEpOwogCiBBQUNfREVDT0RFUl9FUlJPUgotICAgICBDQ29uY2VhbG1lbnRfU2V0UGFyYW1zICAgICAgIChDQ29uY2VhbFBhcmFtcyAqY29uY2VhbFBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgZmFkZU91dFNsb3BlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIGZhZGVJblNsb3BlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIG11dGVSZWxlYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIGNvbWZOb2lzZUxldmVsKTsKK0NDb25jZWFsbWVudF9TZXRQYXJhbXMoQ0NvbmNlYWxQYXJhbXMgKmNvbmNlYWxQYXJhbXMsIGludCBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBmYWRlT3V0U2xvcGUsIGludCBmYWRlSW5TbG9wZSwgaW50IG11dGVSZWxlYXNlLAorICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBjb21mTm9pc2VMZXZlbCk7CiAKLUNDb25jZWFsbWVudFN0YXRlCi0gICAgIENDb25jZWFsbWVudF9HZXRTdGF0ZSAgICAgICAgKENDb25jZWFsbWVudEluZm8gKmhDb25jZWFsbWVudEluZm8pOworQ0NvbmNlYWxtZW50U3RhdGUgQ0NvbmNlYWxtZW50X0dldFN0YXRlKENDb25jZWFsbWVudEluZm8gKmhDb25jZWFsbWVudEluZm8pOwogCiBBQUNfREVDT0RFUl9FUlJPUgotICAgICBDQ29uY2VhbG1lbnRfU2V0QXR0ZW51YXRpb24gIChDQ29uY2VhbFBhcmFtcyAqY29uY2VhbFBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKmZhZGVPdXRBdHRlbnVhdGlvblZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKmZhZGVJbkF0dGVudWF0aW9uVmVjdG9yKTsKK0NDb25jZWFsbWVudF9TZXRBdHRlbnVhdGlvbihDQ29uY2VhbFBhcmFtcyAqY29uY2VhbFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCAqZmFkZU91dEF0dGVudWF0aW9uVmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUICpmYWRlSW5BdHRlbnVhdGlvblZlY3Rvcik7CiAKLXZvaWQgQ0NvbmNlYWxtZW50X1N0b3JlICAgICAgICAgICAoQ0NvbmNlYWxtZW50SW5mbyAqaENvbmNlYWxtZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyApOwordm9pZCBDQ29uY2VhbG1lbnRfU3RvcmUoCisgICAgQ0NvbmNlYWxtZW50SW5mbyAqaENvbmNlYWxtZW50SW5mbywKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8pOwogCi1pbnQgIENDb25jZWFsbWVudF9BcHBseSAgICAgICAgICAgKENDb25jZWFsbWVudEluZm8gKmhDb25jZWFsbWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBsYXN0THBkTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IEZyYW1lT2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MpOworaW50IENDb25jZWFsbWVudF9BcHBseSgKKyAgICBDQ29uY2VhbG1lbnRJbmZvICpoQ29uY2VhbG1lbnRJbmZvLAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywgY29uc3QgaW50IHNhbXBsZXNQZXJGcmFtZSwKKyAgICBjb25zdCBVQ0hBUiBsYXN0THBkTW9kZSwgY29uc3QgaW50IEZyYW1lT2ssIGNvbnN0IFVJTlQgZmxhZ3MpOwogCi1GSVhQX0RCTAotICAgICBDQ29uY2VhbG1lbnRfR2V0RmFkZUZhY3RvciAgIChDQ29uY2VhbG1lbnRJbmZvICpoQ29uY2VhbG1lbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZlByZXZpb3VzRmFjdG9yKTsKK2ludCBDQ29uY2VhbG1lbnRfR2V0TGFzdEZyYW1lT2soQ0NvbmNlYWxtZW50SW5mbyAqaENvbmNlYWxtZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZCZWZvcmVBcHBseSk7CiAKLWludCAgQ0NvbmNlYWxtZW50X0dldExhc3RGcmFtZU9rICAoQ0NvbmNlYWxtZW50SW5mbyAqaENvbmNlYWxtZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZCZWZvcmVBcHBseSk7CitJTlQgQ0NvbmNlYWxtZW50X1RERmFkaW5nKAorICAgIGludCBsZW4sIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKipwcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICBGSVhQX1BDTSAqcGNtZGF0YSwgRklYUF9QQ00gKnBjbWRhdGFfMSk7CiAKLSNlbmRpZiAvKiAjaWZuZGVmIF9DT05DRUFMX0hfICovCisjZW5kaWYgLyogI2lmbmRlZiBDT05DRUFMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvY29uY2VhbF90eXBlcy5oIGIvbGliQUFDZGVjL3NyYy9jb25jZWFsX3R5cGVzLmgKaW5kZXggMzFiYzY0NS4uZDkwMzc0ZSAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9jb25jZWFsX3R5cGVzLmgKKysrIGIvbGliQUFDZGVjL3NyYy9jb25jZWFsX3R5cGVzLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNDggKzkwLDQ1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEdyaWViZWwKKwogICAgRGVzY3JpcHRpb246IEVycm9yIGNvbmNlYWxtZW50IHN0cnVjdHMgYW5kIHR5cGVzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgQ09OQ0VBTF9UWVBFU19ICiAjZGVmaW5lIENPTkNFQUxfVFlQRVNfSAogCi0KLQogI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAogI2luY2x1ZGUgInJ2bGNfaW5mby5oIgogCisjaW5jbHVkZSAidXNhY2RlY19scGMuaCIKIAotI2RlZmluZSBDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTICAgICAgKCAxNiApCisjZGVmaW5lIENPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlMgKDMyKQogCi0gI2RlZmluZSBGSVhQX0NOQ0wgICAgICAgIEZJWFBfREJMCi0gI2RlZmluZSBGTDJGWENPTlNUX0NOQ0wgIEZMMkZYQ09OU1RfREJMCi0gI2RlZmluZSBGWF9EQkwyRlhfQ05DTAotICNkZWZpbmUgRlhfQ05DTDJGWF9EQkwKLSAjZGVmaW5lIENOQ0xfRlJBQ1RfQklUUyAgREZSQUNUX0JJVFMKKyNkZWZpbmUgRklYUF9DTkNMIEZJWFBfREJMCisjZGVmaW5lIEZMMkZYQ09OU1RfQ05DTCBGTDJGWENPTlNUX0RCTAorI2RlZmluZSBGWF9EQkwyRlhfQ05DTAorI2RlZmluZSBGWF9DTkNMMkZYX0RCTAorI2RlZmluZSBDTkNMX0ZSQUNUX0JJVFMgREZSQUNUX0JJVFMKIAogLyogV2FybmluZzogRG8gbm90IGV2ZXIgY2hhbmdlIHRoZXNlIHZhbHVlcy4gKi8KLXR5cGVkZWYgZW51bQotewotICBDb25jZWFsTWV0aG9kTm9uZSAgPSAtMSwKLSAgQ29uY2VhbE1ldGhvZE11dGUgID0gIDAsCi0gIENvbmNlYWxNZXRob2ROb2lzZSA9ICAxLAotICBDb25jZWFsTWV0aG9kSW50ZXIgPSAgMiwKLSAgQ29uY2VhbE1ldGhvZFRvbmFsID0gIDMKK3R5cGVkZWYgZW51bSB7CisgIENvbmNlYWxNZXRob2ROb25lID0gLTEsCisgIENvbmNlYWxNZXRob2RNdXRlID0gMCwKKyAgQ29uY2VhbE1ldGhvZE5vaXNlID0gMSwKKyAgQ29uY2VhbE1ldGhvZEludGVyID0gMiwKKyAgQ29uY2VhbE1ldGhvZFRvbmFsID0gMwogCiB9IENDb25jZWFsbWVudE1ldGhvZDsKIAotCi10eXBlZGVmIGVudW0KLXsKK3R5cGVkZWYgZW51bSB7CiAgIENvbmNlYWxTdGF0ZV9PaywKICAgQ29uY2VhbFN0YXRlX1NpbmdsZSwKICAgQ29uY2VhbFN0YXRlX0ZhZGVJbiwKQEAgLTEyOSw1MCArMTM3LDY3IEBACiAKIH0gQ0NvbmNlYWxtZW50U3RhdGU7CiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgRklYUF9TR0wgZmFkZU91dEZhY3RvcltDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTXTsKKyAgRklYUF9TR0wgZmFkZUluRmFjdG9yW0NPTkNFQUxfTUFYX05VTV9GQURFX0ZBQ1RPUlNdOwogCi10eXBlZGVmIHN0cnVjdAotewotICBGSVhQX1NHTCAgZmFkZU91dEZhY3RvcltDT05DRUFMX01BWF9OVU1fRkFERV9GQUNUT1JTXTsKLSAgRklYUF9TR0wgIGZhZGVJbkZhY3RvciBbQ09OQ0VBTF9NQVhfTlVNX0ZBREVfRkFDVE9SU107CisgIENDb25jZWFsbWVudE1ldGhvZCBtZXRob2Q7CiAKLSAgQ0NvbmNlYWxtZW50TWV0aG9kICBtZXRob2Q7Ci0KLSAgaW50ICBudW1GYWRlT3V0RnJhbWVzOwotICBpbnQgIG51bUZhZGVJbkZyYW1lczsKLSAgaW50ICBudW1NdXRlUmVsZWFzZUZyYW1lczsKLSAgaW50ICBjb21mb3J0Tm9pc2VMZXZlbDsKKyAgaW50IG51bUZhZGVPdXRGcmFtZXM7CisgIGludCBudW1GYWRlSW5GcmFtZXM7CisgIGludCBudW1NdXRlUmVsZWFzZUZyYW1lczsKKyAgRklYUF9EQkwgY29tZm9ydE5vaXNlTGV2ZWw7CiAKIH0gQ0NvbmNlYWxQYXJhbXM7CiAKK3R5cGVkZWYgZW51bSB7CisgIEZBREVfVElNRURPTUFJTl9UT1NQRUNUUkFMTVVURSA9IDEsCisgIEZBREVfVElNRURPTUFJTl9GUk9NU1BFQ1RSQUxNVVRFLAorICBGQURFX1RJTUVET01BSU4KK30gVERmYWRpbmdUeXBlOwogCi0KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgIENDb25jZWFsUGFyYW1zICpwQ29uY2VhbFBhcmFtczsKIAogICBGSVhQX0NOQ0wgc3BlY3RyYWxDb2VmZmljaWVudFsxMDI0XTsKLSAgU0hPUlQgICAgIHNwZWNTY2FsZVs4XTsKKyAgU0hPUlQgc3BlY1NjYWxlWzhdOwogCi0gIElOVCAgICBpUmFuZG9tUGhhc2U7Ci0gIElOVCAgICBwcmV2RnJhbWVPa1syXTsKLSAgSU5UICAgIGNudEZhZGVGcmFtZXM7Ci0gIElOVCAgICBjbnRWYWxpZEZyYW1lczsKKyAgSU5UIGlSYW5kb21QaGFzZTsKKyAgSU5UIHByZXZGcmFtZU9rWzJdOworICBJTlQgY250VmFsaWRGcmFtZXM7CisgIElOVCBjbnRGYWRlRnJhbWVzOyAvKiBTdGF0ZSBmb3Igc2lnbmFsIGZhZGUtaW4vb3V0ICovCisgIC8qIFN0YXRlcyBmb3Igc2lnbmFsIGZhZGUtb3V0IG9mIGZyYW1lcyB3aXRoIG1vcmUgdGhhbiBvbmUgd2luZG93L3N1YmZyYW1lIC0KKyAgICBbMF0gdXNlZCBieSBVcGRhdGUgQ250RmFkZUZyYW1lcyBtb2RlIG9mIENDb25jZWFsbWVudF9BcHBseUZhZGVPdXQsIFsxXSB1c2VkCisgICAgYnkgRmFkZU91dCBtb2RlICovCisgIGludCB3aW5HcnBPZmZzZXRbMl07IC8qIFN0YXRlIGZvciBzaWduYWwgZmFkZS1vdXQgb2YgZnJhbWVzIHdpdGggbW9yZSB0aGFuIG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cvc3ViZnJhbWUgKi8KKyAgaW50IGF0dEdycE9mZnNldFsyXTsgLyogU3RhdGUgZm9yIGZhc3RlciBzaWduYWwgZmFkZS1vdXQgb2YgZnJhbWVzIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpZW50IHNpZ25hbCBwYXJ0cyAqLwogCi0gIFNIT1JUIGFSdmxjUHJldmlvdXNTY2FsZUZhY3RvcltSVkxDX01BWF9TRkJdOyAgLyogbmVlZGVkIG9uY2UgcGVyIGNoYW5uZWwgKi8KLSAgVUNIQVIgYVJ2bGNQcmV2aW91c0NvZGVib29rW1JWTENfTUFYX1NGQl07ICAgICAvKiBuZWVkZWQgb25jZSBwZXIgY2hhbm5lbCAqLworICBTQ0hBUiBsYXN0UmVuZGVyTW9kZTsKKworICBVQ0hBUiB3aW5kb3dTaGFwZTsKKyAgQkxPQ0tfVFlQRSB3aW5kb3dTZXF1ZW5jZTsKKyAgVUNIQVIgbGFzdFdpbkdycExlbjsKKworICBDQ29uY2VhbG1lbnRTdGF0ZSBjb25jZWFsU3RhdGU7CisgIENDb25jZWFsbWVudFN0YXRlIGNvbmNlYWxTdGF0ZV9vbGQ7CisgIEZJWFBfREJMIGZhZGVfb2xkOyAgICAgICAgICAgLyogbGFzdCBmYWRpbmcgZmFjdG9yICovCisgIFREZmFkaW5nVHlwZSBsYXN0RmFkaW5nVHlwZTsgLyogbGFzdCBmYWRpbmcgdHlwZSAqLworCisgIFNIT1JUIGFSdmxjUHJldmlvdXNTY2FsZUZhY3RvcltSVkxDX01BWF9TRkJdOyAvKiBuZWVkZWQgb25jZSBwZXIgY2hhbm5lbCAqLworICBVQ0hBUiBhUnZsY1ByZXZpb3VzQ29kZWJvb2tbUlZMQ19NQVhfU0ZCXTsgICAgLyogbmVlZGVkIG9uY2UgcGVyIGNoYW5uZWwgKi8KICAgU0NIQVIgcnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JPSzsKICAgU0NIQVIgcnZsY1ByZXZpb3VzQmxvY2tUeXBlOwogCi0KLSAgU0NIQVIgIGxhc3RSZW5kZXJNb2RlOwotCi0gIFVDSEFSICB3aW5kb3dTaGFwZTsKLSAgVUNIQVIgIHdpbmRvd1NlcXVlbmNlOwotICBVQ0hBUiAgbGFzdFdpbkdycExlbjsKLQotICBDQ29uY2VhbG1lbnRTdGF0ZSBjb25jZWFsU3RhdGU7CisgIEZJWFBfTFBDIGxzZjRbTV9MUF9GSUxURVJfT1JERVJdOworICBGSVhQX0RCTCBsYXN0X3RjeF9nYWluOworICBJTlQgbGFzdF90Y3hfZ2Fpbl9lOworICBVTE9ORyBURE5vaXNlU2VlZDsKKyAgRklYUF9QQ00gVEROb2lzZVN0YXRlc1szXTsKKyAgRklYUF9TR0wgVEROb2lzZUNvZWZbM107CisgIEZJWFBfU0dMIFRETm9pc2VBdHQ7CiAKIH0gQ0NvbmNlYWxtZW50SW5mbzsKIAotCiAjZW5kaWYgLyogI2lmbmRlZiBDT05DRUFMX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvZGVidWcuaCBiL2xpYkFBQ2RlYy9zcmMvZGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkwMzI5MS4uMDAwMDAwMAotLS0gYS9saWJBQUNkZWMvc3JjL2RlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKLSAgIERlc2NyaXB0aW9uOiBkZWJ1ZyBvdXRwdXQKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIERFQlVHX0gKLSNkZWZpbmUgREVCVUdfSAotCi0jaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2xkZmlsdGJhbmsuY3BwIGIvbGliQUFDZGVjL3NyYy9sZGZpbHRiYW5rLmNwcAppbmRleCBjMDhjYzQxLi42NmE1OTE0IDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2xkZmlsdGJhbmsuY3BwCisrKyBiL2xpYkFBQ2RlYy9zcmMvbGRmaWx0YmFuay5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTkgKzkwLDE4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSoKLSAqICAgZmlsZW5hbWU6IGxkZmlsdGJhbmsuYwotICogICBwcm9qZWN0IDogTVBFRy00IEF1ZGlvIERlY29kZXIKLSAqICAgY29udGVudHMvZGVzY3JpcHRpb246IGxvdyBkZWxheSBmaWx0ZXJiYW5rCi0gKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IGxvdyBkZWxheSBmaWx0ZXJiYW5rCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJsZGZpbHRiYW5rLmgiCiAKLQogI2luY2x1ZGUgImFhY19yb20uaCIKICNpbmNsdWRlICJkY3QuaCIKICNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCkBAIC05OSwxMTAgKzEwOSwxNjYgQEAKIAogI2RlZmluZSBMREZCX0hFQURST09NIDIKIAotc3RhdGljIHZvaWQgbXVsdEUyX0RpbnZGX2ZkayhJTlRfUENNICpvdXRwdXQsIEZJWFBfREJMKiB4LCBjb25zdCBGSVhQX1dUQiogZmIsIEZJWFBfREJMKiB6LCBjb25zdCBpbnQgTiwgY29uc3QgaW50ICBzdHJpZGUpCi17Ci0gIGludCBpLCBzY2FsZTsKKyNpZiBkZWZpbmVkKF9fYXJtX18pCisjZW5kaWYKKworc3RhdGljIHZvaWQgbXVsdEUyX0RpbnZGX2ZkayhGSVhQX1BDTSAqb3V0cHV0LCBGSVhQX0RCTCAqeCwgY29uc3QgRklYUF9XVEIgKmZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqeiwgY29uc3QgaW50IE4pIHsKKyAgaW50IGk7CiAKICAgLyogIHNjYWxlIGZvciBGSVhQX0RCTCAtPiBJTlRfUENNIGNvbnZlcnNpb24uICovCi0gIHNjYWxlID0gKERGUkFDVF9CSVRTIC0gU0FNUExFX0JJVFMpIC0gTERGQl9IRUFEUk9PTTsKKyAgY29uc3QgaW50IHNjYWxlID0gKERGUkFDVF9CSVRTIC0gU0FNUExFX0JJVFMpIC0gTERGQl9IRUFEUk9PTTsKKyNpZiAoKERGUkFDVF9CSVRTIC0gU0FNUExFX0JJVFMgLSBMREZCX0hFQURST09NKSA+IDApCisgIEZJWFBfREJMIHJuZF92YWxfd3RzMCA9IChGSVhQX0RCTCkwOworICBGSVhQX0RCTCBybmRfdmFsX3d0czEgPSAoRklYUF9EQkwpMDsKKyAgaWYgKC1XVFMwIC0gMSArIHNjYWxlKQorICAgIHJuZF92YWxfd3RzMCA9IChGSVhQX0RCTCkoMSA8PCAoLVdUUzAgLSAxICsgc2NhbGUgLSAxKSk7CisgIGlmICgtV1RTMSAtIDEgKyBzY2FsZSkKKyAgICBybmRfdmFsX3d0czEgPSAoRklYUF9EQkwpKDEgPDwgKC1XVFMxIC0gMSArIHNjYWxlIC0gMSkpOworI2VuZGlmCiAKLSAgZm9yKGk9MDtpPE4vNDtpKyspCi0gIHsKKyAgZm9yIChpID0gMDsgaSA8IE4gLyA0OyBpKyspIHsKICAgICBGSVhQX0RCTCB6MCwgejIsIHRtcDsKIAotICAgIHoyID0geFtOLzIraV07Ci0gICAgejAgPSB6MiArICggZk11bHREaXYyKHpbTi8yK2ldLCBmYlsyKk4gKyBpXSkgPj4gKC1XVFMyLTEpICk7CisgICAgejIgPSB4W04gLyAyICsgaV07CisgICAgejAgPSB6MiArIChmTXVsdERpdjIoeltOIC8gMiArIGldLCBmYlsyICogTiArIGldKSA+PiAoLVdUUzIgLSAxKSk7CiAKLSAgICB6W04vMitpXSA9IHhbTi8yLTEtaV0gKyAoIGZNdWx0RGl2Mih6W04gKyBpXSwgZmJbMipOICsgTi8yICsgaV0pID4+ICgtV1RTMi0xKSApOworICAgIHpbTiAvIDIgKyBpXSA9IHhbTiAvIDIgLSAxIC0gaV0gKworICAgICAgICAgICAgICAgICAgIChmTXVsdERpdjIoeltOICsgaV0sIGZiWzIgKiBOICsgTiAvIDIgKyBpXSkgPj4gKC1XVFMyIC0gMSkpOwogCi0gICAgdG1wID0gKCBmTXVsdERpdjIoeltOLzIraV0sIGZiW04rTi8yLTEtaV0pICsgZk11bHREaXYyKHpbaV0sIGZiW04rTi8yK2ldKSApIDsKKyAgICB0bXAgPSAoZk11bHREaXYyKHpbTiAvIDIgKyBpXSwgZmJbTiArIE4gLyAyIC0gMSAtIGldKSArCisgICAgICAgICAgIGZNdWx0RGl2Mih6W2ldLCBmYltOICsgTiAvIDIgKyBpXSkpOwogCi0jaWYgKFNBTVBMRV9CSVRTIDw9IDE2KQotICAgIEZES19BU1NFUlQoICgtV1RTMS0xICsgc2NhbGUpID49IDApOwotICAgIG91dHB1dFsoTiozLzQtMS1pKSpzdHJpZGVdID0gKElOVF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQodG1wLCAtV1RTMS0xICsgc2NhbGUsIFNBTVBMRV9CSVRTKTsKKyNpZiAoKERGUkFDVF9CSVRTIC0gU0FNUExFX0JJVFMgLSBMREZCX0hFQURST09NKSA+IDApCisgICAgRkRLX0FTU0VSVCgoLVdUUzEgLSAxICsgc2NhbGUpID49IDApOworICAgIEZES19BU1NFUlQodG1wIDw9ICgoRklYUF9EQkwpMHg3RkZGRkZGRiAtCisgICAgICAgICAgICAgICAgICAgICAgIHJuZF92YWxfd3RzMSkpOyAvKiByb3VuZGluZyBtdXN0IG5vdCBjYXVzZSBvdmVyZmxvdyAqLworICAgIG91dHB1dFsoTiAqIDMgLyA0IC0gMSAtIGkpXSA9IChGSVhQX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVCgKKyAgICAgICAgdG1wICsgcm5kX3ZhbF93dHMxLCAtV1RTMSAtIDEgKyBzY2FsZSwgUENNX09VVF9CSVRTKTsKICNlbHNlCi0gICAgRkRLX0FTU0VSVCggKFdUUzErMSAtIHNjYWxlKSA+PSAwKTsKLSAgICBvdXRwdXRbKE4qMy80LTEtaSkqc3RyaWRlXSA9IChJTlRfUENNKVNBVFVSQVRFX0xFRlRfU0hJRlQodG1wLCBXVFMxKzEgLSBzY2FsZSwgU0FNUExFX0JJVFMpOworICAgIEZES19BU1NFUlQoKFdUUzEgKyAxIC0gc2NhbGUpID49IDApOworICAgIG91dHB1dFsoTiAqIDMgLyA0IC0gMSAtIGkpXSA9CisgICAgICAgIChGSVhQX1BDTSlTQVRVUkFURV9MRUZUX1NISUZUKHRtcCwgV1RTMSArIDEgLSBzY2FsZSwgUENNX09VVF9CSVRTKTsKICNlbmRpZgogCiAgICAgeltpXSA9IHowOwogICAgIHpbTiArIGldID0gejI7CiAgIH0KIAotICBmb3IoaT1OLzQ7aTxOLzI7aSsrKQotICB7CisgIGZvciAoaSA9IE4gLyA0OyBpIDwgTiAvIDI7IGkrKykgewogICAgIEZJWFBfREJMIHowLCB6MiwgdG1wMCwgdG1wMTsKIAotICAgIHoyID0geFtOLzIraV07Ci0gICAgejAgPSB6MiArICggZk11bHREaXYyKHpbTi8yK2ldLCBmYlsyKk4gKyBpXSkgPj4gKC1XVFMyLTEpICk7CisgICAgejIgPSB4W04gLyAyICsgaV07CisgICAgejAgPSB6MiArIChmTXVsdERpdjIoeltOIC8gMiArIGldLCBmYlsyICogTiArIGldKSA+PiAoLVdUUzIgLSAxKSk7CiAKLSAgICB6W04vMitpXSA9IHhbTi8yLTEtaV0gKyAoIGZNdWx0RGl2Mih6W04gKyBpXSwgZmJbMipOICsgTi8yICsgaV0pID4+ICgtV1RTMi0xKSApOworICAgIHpbTiAvIDIgKyBpXSA9IHhbTiAvIDIgLSAxIC0gaV0gKworICAgICAgICAgICAgICAgICAgIChmTXVsdERpdjIoeltOICsgaV0sIGZiWzIgKiBOICsgTiAvIDIgKyBpXSkgPj4gKC1XVFMyIC0gMSkpOwogCi0gICAgdG1wMCA9ICggZk11bHREaXYyKHpbTi8yK2ldLCBmYltOLzItMS1pXSkgICArIGZNdWx0RGl2Mih6W2ldLCBmYltOLzIraV0pICAgKSA7Ci0gICAgdG1wMSA9ICggZk11bHREaXYyKHpbTi8yK2ldLCBmYltOK04vMi0xLWldKSArIGZNdWx0RGl2Mih6W2ldLCBmYltOK04vMitpXSkgKSA7CisgICAgdG1wMCA9IChmTXVsdERpdjIoeltOIC8gMiArIGldLCBmYltOIC8gMiAtIDEgLSBpXSkgKworICAgICAgICAgICAgZk11bHREaXYyKHpbaV0sIGZiW04gLyAyICsgaV0pKTsKKyAgICB0bXAxID0gKGZNdWx0RGl2Mih6W04gLyAyICsgaV0sIGZiW04gKyBOIC8gMiAtIDEgLSBpXSkgKworICAgICAgICAgICAgZk11bHREaXYyKHpbaV0sIGZiW04gKyBOIC8gMiArIGldKSk7CiAKLSNpZiAoU0FNUExFX0JJVFMgPD0gMTYpCi0gICAgRkRLX0FTU0VSVCggKC1XVFMwLTEgKyBzY2FsZSkgPj0gMCk7Ci0gICAgb3V0cHV0WyhpLU4vNCkqc3RyaWRlXSAgICAgPSAoSU5UX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVCh0bXAwLCAtV1RTMC0xICsgc2NhbGUsIFNBTVBMRV9CSVRTKTsKLSAgICBvdXRwdXRbKE4qMy80LTEtaSkqc3RyaWRlXSA9IChJTlRfUENNKVNBVFVSQVRFX1JJR0hUX1NISUZUKHRtcDEsIC1XVFMxLTEgKyBzY2FsZSwgU0FNUExFX0JJVFMpOworI2lmICgoREZSQUNUX0JJVFMgLSBTQU1QTEVfQklUUyAtIExERkJfSEVBRFJPT00pID4gMCkKKyAgICBGREtfQVNTRVJUKCgtV1RTMCAtIDEgKyBzY2FsZSkgPj0gMCk7CisgICAgRkRLX0FTU0VSVCh0bXAwIDw9ICgoRklYUF9EQkwpMHg3RkZGRkZGRiAtCisgICAgICAgICAgICAgICAgICAgICAgICBybmRfdmFsX3d0czApKTsgLyogcm91bmRpbmcgbXVzdCBub3QgY2F1c2Ugb3ZlcmZsb3cgKi8KKyAgICBGREtfQVNTRVJUKHRtcDEgPD0gKChGSVhQX0RCTCkweDdGRkZGRkZGIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJuZF92YWxfd3RzMSkpOyAvKiByb3VuZGluZyBtdXN0IG5vdCBjYXVzZSBvdmVyZmxvdyAqLworICAgIG91dHB1dFsoaSAtIE4gLyA0KV0gPSAoRklYUF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQoCisgICAgICAgIHRtcDAgKyBybmRfdmFsX3d0czAsIC1XVFMwIC0gMSArIHNjYWxlLCBQQ01fT1VUX0JJVFMpOworICAgIG91dHB1dFsoTiAqIDMgLyA0IC0gMSAtIGkpXSA9IChGSVhQX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVCgKKyAgICAgICAgdG1wMSArIHJuZF92YWxfd3RzMSwgLVdUUzEgLSAxICsgc2NhbGUsIFBDTV9PVVRfQklUUyk7CiAjZWxzZQotICAgIEZES19BU1NFUlQoIChXVFMwKzEgLSBzY2FsZSkgPj0gMCk7Ci0gICAgb3V0cHV0WyhpLU4vNCkqc3RyaWRlXSAgICAgPSAoSU5UX1BDTSlTQVRVUkFURV9MRUZUX1NISUZUKHRtcDAsIFdUUzArMSAtIHNjYWxlLCBTQU1QTEVfQklUUyk7Ci0gICAgb3V0cHV0WyhOKjMvNC0xLWkpKnN0cmlkZV0gPSAoSU5UX1BDTSlTQVRVUkFURV9MRUZUX1NISUZUKHRtcDEsIFdUUzErMSAtIHNjYWxlLCBTQU1QTEVfQklUUyk7CisgICAgRkRLX0FTU0VSVCgoV1RTMCArIDEgLSBzY2FsZSkgPj0gMCk7CisgICAgb3V0cHV0WyhpIC0gTiAvIDQpXSA9CisgICAgICAgIChGSVhQX1BDTSlTQVRVUkFURV9MRUZUX1NISUZUKHRtcDAsIFdUUzAgKyAxIC0gc2NhbGUsIFBDTV9PVVRfQklUUyk7CisgICAgb3V0cHV0WyhOICogMyAvIDQgLSAxIC0gaSldID0KKyAgICAgICAgKEZJWFBfUENNKVNBVFVSQVRFX0xFRlRfU0hJRlQodG1wMSwgV1RTMSArIDEgLSBzY2FsZSwgUENNX09VVF9CSVRTKTsKICNlbmRpZgogICAgIHpbaV0gPSB6MDsKICAgICB6W04gKyBpXSA9IHoyOwogICB9CiAKICAgLyogRXhjaGFuZ2UgcXVhcnRlciBwYXJ0cyBvZiB4IHRvIGJyaW5nIHRoZW0gaW4gdGhlICJyaWdodCIgb3JkZXIgKi8KLSAgZm9yKGk9MDtpPE4vNDtpKyspCi0gIHsKLSAgICBGSVhQX0RCTCB0bXAwID0gZk11bHREaXYyKHpbaV0sIGZiW04vMitpXSk7CisgIGZvciAoaSA9IDA7IGkgPCBOIC8gNDsgaSsrKSB7CisgICAgRklYUF9EQkwgdG1wMCA9IGZNdWx0RGl2Mih6W2ldLCBmYltOIC8gMiArIGldKTsKIAotI2lmIChTQU1QTEVfQklUUyA8PSAxNikKLSAgICBGREtfQVNTRVJUKCAoLVdUUzAtMSArIHNjYWxlKSA+PSAwKTsKLSAgICBvdXRwdXRbKE4qMy80ICsgaSkqc3RyaWRlXSA9IChJTlRfUENNKVNBVFVSQVRFX1JJR0hUX1NISUZUKHRtcDAsIC1XVFMwLTEgKyBzY2FsZSwgU0FNUExFX0JJVFMpOworI2lmICgoREZSQUNUX0JJVFMgLSBTQU1QTEVfQklUUyAtIExERkJfSEVBRFJPT00pID4gMCkKKyAgICBGREtfQVNTRVJUKCgtV1RTMCAtIDEgKyBzY2FsZSkgPj0gMCk7CisgICAgRkRLX0FTU0VSVCh0bXAwIDw9ICgoRklYUF9EQkwpMHg3RkZGRkZGRiAtCisgICAgICAgICAgICAgICAgICAgICAgICBybmRfdmFsX3d0czApKTsgLyogcm91bmRpbmcgbXVzdCBub3QgY2F1c2Ugb3ZlcmZsb3cgKi8KKyAgICBvdXRwdXRbKE4gKiAzIC8gNCArIGkpXSA9IChGSVhQX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVCgKKyAgICAgICAgdG1wMCArIHJuZF92YWxfd3RzMCwgLVdUUzAgLSAxICsgc2NhbGUsIFBDTV9PVVRfQklUUyk7CiAjZWxzZQotICAgIEZES19BU1NFUlQoIChXVFMwKzEgLSBzY2FsZSkgPj0gMCk7Ci0gICAgb3V0cHV0WyhOKjMvNCArIGkpKnN0cmlkZV0gPSAoSU5UX1BDTSlTQVRVUkFURV9MRUZUX1NISUZUKHRtcDAsIFdUUzArMSAtIHNjYWxlLCBTQU1QTEVfQklUUyk7CisgICAgRkRLX0FTU0VSVCgoV1RTMCArIDEgLSBzY2FsZSkgPj0gMCk7CisgICAgb3V0cHV0WyhOICogMyAvIDQgKyBpKV0gPQorICAgICAgICAoRklYUF9QQ00pU0FUVVJBVEVfTEVGVF9TSElGVCh0bXAwLCBXVFMwICsgMSAtIHNjYWxlLCBQQ01fT1VUX0JJVFMpOwogI2VuZGlmCiAgIH0KIH0KIAotaW50IEludk1kY3RUcmFuc2Zvcm1Mb3dEZWxheV9mZGsgKEZJWFBfREJMICptZGN0RGF0YSwgY29uc3QgaW50IG1kY3REYXRhX2UsIElOVF9QQ00gKm91dHB1dCwgRklYUF9EQkwgKmZzX2J1ZmZlciwgY29uc3QgaW50IHN0cmlkZSwgY29uc3QgaW50IE4pIHsKLQoraW50IEludk1kY3RUcmFuc2Zvcm1Mb3dEZWxheV9mZGsoRklYUF9EQkwgKm1kY3REYXRhLCBjb25zdCBpbnQgbWRjdERhdGFfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUENNICpvdXRwdXQsIEZJWFBfREJMICpmc19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgTikgewogICBjb25zdCBGSVhQX1dUQiAqY29lZjsKICAgRklYUF9EQkwgZ2FpbiA9IChGSVhQX0RCTCkwOwotICBpbnQgc2NhbGUgPSBtZGN0RGF0YV9lICsgTURDVF9PVVRfSEVBRFJPT00gLSBMREZCX0hFQURST09NOyAvKiBUaGUgTERGQl9IRUFEUk9PTSBpcyBjb21wZW5zYXRlZCBpbnNpZGUgbXVsdEUyX0RpbnZGX2ZkaygpIGJlbG93ICovCisgIGludCBzY2FsZSA9IG1kY3REYXRhX2UgKyBNRENUX09VVF9IRUFEUk9PTSAtCisgICAgICAgICAgICAgIExERkJfSEVBRFJPT007IC8qIFRoZSBMREZCX0hFQURST09NIGlzIGNvbXBlbnNhdGVkIGluc2lkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0RTJfRGludkZfZmRrKCkgYmVsb3cgKi8KIAogICAvKiBTZWxlY3QgTEQgd2luZG93IHNsb3BlICovCi0gIGlmIChOID09IDUxMikKLSAgICBjb2VmID0gKEZJWFBfV1RCKilMb3dEZWxheVN5bnRoZXNpczUxMjsKLSAgZWxzZQotICAgIGNvZWYgPSAoRklYUF9XVEIqKUxvd0RlbGF5U3ludGhlc2lzNDgwOworICBzd2l0Y2ggKE4pIHsKKyAgICBjYXNlIDI1NjoKKyAgICAgIGNvZWYgPSBMb3dEZWxheVN5bnRoZXNpczI1NjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjQwOgorICAgICAgY29lZiA9IExvd0RlbGF5U3ludGhlc2lzMjQwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjA6CisgICAgICBjb2VmID0gTG93RGVsYXlTeW50aGVzaXMxNjA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyODoKKyAgICAgIGNvZWYgPSBMb3dEZWxheVN5bnRoZXNpczEyODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTIwOgorICAgICAgY29lZiA9IExvd0RlbGF5U3ludGhlc2lzMTIwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1MTI6CisgICAgICBjb2VmID0gTG93RGVsYXlTeW50aGVzaXM1MTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ4MDoKKyAgICBkZWZhdWx0OgorICAgICAgY29lZiA9IExvd0RlbGF5U3ludGhlc2lzNDgwOworICAgICAgYnJlYWs7CisgIH0KIAogICAvKgogICAgICBBcHBseSBleHBvbmVudCBhbmQgMS9OIGZhY3Rvci4KICAgICAgTm90ZTogInNjYWxlIiBpcyBvZmYgYnkgb25lIGJlY2F1c2UgZm9yIExEX01EQ1QgdGhlIHdpbmRvdyBsZW5ndGggaXMgdHdpY2UKLSAgICAgdGhlIHdpbmRvdyBsZW5ndGggb2YgYSByZWd1bGFyIE1EQ1QuIFRoaXMgaXMgY29ycmVjdGVkIGluc2lkZSBtdWx0RTJfRGludkZfZmRrKCkuCi0gICAgIFJlZmVyIHRvIElTTy9JRUMgMTQ0OTYtMzoyMDA5IHBhZ2UgMjc3LCBjaGFwdGVyIDQuNi4yMC4yICJMb3cgRGVsYXkgV2luZG93Ii4KKyAgICAgdGhlIHdpbmRvdyBsZW5ndGggb2YgYSByZWd1bGFyIE1EQ1QuIFRoaXMgaXMgY29ycmVjdGVkIGluc2lkZQorICAgICBtdWx0RTJfRGludkZfZmRrKCkuIFJlZmVyIHRvIElTTy9JRUMgMTQ0OTYtMzoyMDA5IHBhZ2UgMjc3LAorICAgICBjaGFwdGVyIDQuNi4yMC4yICJMb3cgRGVsYXkgV2luZG93Ii4KICAgICovCiAgIGltZGN0X2dhaW4oJmdhaW4sICZzY2FsZSwgTik7CiAKICAgZGN0X0lWKG1kY3REYXRhLCBOLCAmc2NhbGUpOwogCisgIGlmIChOID09IDI1NiB8fCBOID09IDI0MCB8fCBOID09IDE2MCkgeworICAgIHNjYWxlIC09IDE7CisgIH0gZWxzZSBpZiAoTiA9PSAxMjggfHwgTiA9PSAxMjApIHsKKyAgICBzY2FsZSAtPSAyOworICB9CisKICAgaWYgKGdhaW4gIT0gKEZJWFBfREJMKTApIHsKICAgICBzY2FsZVZhbHVlc1dpdGhGYWN0b3IobWRjdERhdGEsIGdhaW4sIE4sIHNjYWxlKTsKICAgfSBlbHNlIHsKICAgICBzY2FsZVZhbHVlcyhtZGN0RGF0YSwgTiwgc2NhbGUpOwogICB9CiAKLSAgLyogU2luY2UgYWxsIGV4cG9uZW50IGFuZCBmYWN0b3JzIGhhdmUgYmVlbiBhcHBsaWVkLCBjdXJyZW50IGV4cG9uZW50IGlzIHplcm8uICovCi0gIG11bHRFMl9EaW52Rl9mZGsob3V0cHV0LCBtZGN0RGF0YSwgY29lZiwgZnNfYnVmZmVyLCBOLCBzdHJpZGUpOworICAvKiBTaW5jZSBhbGwgZXhwb25lbnQgYW5kIGZhY3RvcnMgaGF2ZSBiZWVuIGFwcGxpZWQsIGN1cnJlbnQgZXhwb25lbnQgaXMgemVyby4KKyAgICovCisgIG11bHRFMl9EaW52Rl9mZGsob3V0cHV0LCBtZGN0RGF0YSwgY29lZiwgZnNfYnVmZmVyLCBOKTsKIAogICByZXR1cm4gKDEpOwogfQotCi0KLQotCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2xkZmlsdGJhbmsuaCBiL2xpYkFBQ2RlYy9zcmMvbGRmaWx0YmFuay5oCmluZGV4IGQxZjk0MDIuLmI2M2RhNmIgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvbGRmaWx0YmFuay5oCisrKyBiL2xpYkFBQ2RlYy9zcmMvbGRmaWx0YmFuay5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDMxICs5MCwyMyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICogICBmaWxlbmFtZTogbGRmaWx0YmFuay5oCi0gKiAgIHByb2plY3QgOiBNUEVHLTQgQXVkaW8gRGVjb2RlcgotICogICBjb250ZW50cy9kZXNjcmlwdGlvbjogbG93IGRlbGF5IGZpbHRlcmJhbmsgaW50ZXJmYWNlCi0gKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIEF1dGhvcihzKToKIAotI2lmbmRlZiBfTERGSUxUQkFOS19ICi0jZGVmaW5lIF9MREZJTFRCQU5LX0gKKyAgIERlc2NyaXB0aW9uOiBsb3cgZGVsYXkgZmlsdGVyYmFuayBpbnRlcmZhY2UKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBMREZJTFRCQU5LX0gKKyNkZWZpbmUgTERGSUxUQkFOS19ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKLQotaW50IEludk1kY3RUcmFuc2Zvcm1Mb3dEZWxheV9mZGsgKAotICAgICAgICBGSVhQX0RCTCAqbWRjdGRhdGFfbSwKLSAgICAgICAgY29uc3QgaW50IG1kY3RkYXRhX2UsCi0gICAgICAgIElOVF9QQ00gKm1kY3RPdXQsCi0gICAgICAgIEZJWFBfREJMICpmc19idWZmZXIsCi0gICAgICAgIGNvbnN0IGludCBzdHJpZGUsCi0gICAgICAgIGNvbnN0IGludCBmcmFtZUxlbmd0aAotICAgICAgICApOwotCitpbnQgSW52TWRjdFRyYW5zZm9ybUxvd0RlbGF5X2ZkayhGSVhQX0RCTCAqbWRjdGRhdGFfbSwgY29uc3QgaW50IG1kY3RkYXRhX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1BDTSAqbWRjdE91dCwgRklYUF9EQkwgKmZzX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmcmFtZUxlbmd0aCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9vdmVybGFwYWRkLmggYi9saWJBQUNkZWMvc3JjL292ZXJsYXBhZGQuaAppbmRleCAxNDY5YmU3Li40OWVlY2Q4IDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL292ZXJsYXBhZGQuaAorKysgYi9saWJBQUNkZWMvc3JjL292ZXJsYXBhZGQuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyNyArOTAsMzEgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKwogICAgRGVzY3JpcHRpb246CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgT1ZFUkxBUEFERF9ICiAjZGVmaW5lIE9WRVJMQVBBRERfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCi0jZGVmaW5lICBPdmVybGFwQnVmZmVyU2l6ZSAgKDEwMjQqMikKKy8qIEVMRCB1c2VzIGRpZmZlcmVudCBvdmVybGFwIHdoaWNoIGlzIHR3aWNlIHRoZSBmcmFtZSBzaXplOiAqLworI2RlZmluZSBPdmVybGFwQnVmZmVyU2l6ZSAoNzY4KQogCiB0eXBlZGVmIEZJWFBfREJMIFNQRUNUUlVNWzEwMjRdOwotdHlwZWRlZiBGSVhQX0RCTCAqIFNQRUNUUkFMX1BUUjsKK3R5cGVkZWYgRklYUF9EQkwqIFNQRUNUUkFMX1BUUjsKIAotI2RlZmluZSBTUEVDX0xPTkcocHRyKSAgICAgICAocHRyKQotI2RlZmluZSBTUEVDKHB0cix3LGdsKSAgICAgICgocHRyKSsoKHcpKihnbCkpKQorI2RlZmluZSBTUEVDX0xPTkcocHRyKSAocHRyKQorI2RlZmluZSBTUEVDKHB0ciwgdywgZ2wpICgocHRyKSArICgodykgKiAoZ2wpKSkKIAorI2RlZmluZSBTUEVDX1RDWChwdHIsIGYsIGdsLCBmYikgXAorICAoKHB0cikgKyAoKGYpICogKGdsICogMikgKiAoKChmYikgPT0gMCkgPyAxIDogMikpKQogCiAjZW5kaWYgLyogI2lmbmRlZiBPVkVSTEFQQUREX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvcHVsc2VkYXRhLmNwcCBiL2xpYkFBQ2RlYy9zcmMvcHVsc2VkYXRhLmNwcAppbmRleCAwZjJmMGVjLi5lYjZkNWJjIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL3B1bHNlZGF0YS5jcHAKKysrIGIvbGliQUFDZGVjL3NyYy9wdWxzZWRhdGEuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQyICs5MCwzNyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorCiAgICBEZXNjcmlwdGlvbjogcHVsc2UgZGF0YSB0b29sCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJwdWxzZWRhdGEuaCIKIAotCiAjaW5jbHVkZSAiY2hhbm5lbGluZm8uaCIKIAotCi1JTlQgQ1B1bHNlRGF0YV9SZWFkKAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICAgICAgQ1B1bHNlRGF0YSAqY29uc3QgUHVsc2VEYXRhLAotICAgICAgICBjb25zdCBTSE9SVCAqc2ZiX3N0YXJ0bGluZXMsCi0gICAgICAgIGNvbnN0IHZvaWQgKnBJY3NJbmZvLAotICAgICAgICBjb25zdCBTSE9SVCBmcmFtZV9sZW5ndGgKLSAgICAgICAgKQotewotICBpbnQgaSwgaz0wOwotICBjb25zdCBVSU5UIE1heFNmQmFuZHMgPSBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoKENJY3NJbmZvKilwSWNzSW5mbyk7CitJTlQgQ1B1bHNlRGF0YV9SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBDUHVsc2VEYXRhICpjb25zdCBQdWxzZURhdGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUICpzZmJfc3RhcnRsaW5lcywgY29uc3Qgdm9pZCAqcEljc0luZm8sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUIGZyYW1lX2xlbmd0aCkgeworICBpbnQgaSwgayA9IDA7CisgIGNvbnN0IFVJTlQgTWF4U2ZCYW5kcyA9CisgICAgICBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoKGNvbnN0IENJY3NJbmZvICopcEljc0luZm8pOwogCiAgIC8qIHJlc2V0IHB1bHNlIGRhdGEgZmxhZyAqLwogICBQdWxzZURhdGEtPlB1bHNlRGF0YVByZXNlbnQgPSAwOwogCi0gIGlmICgoUHVsc2VEYXRhLT5QdWxzZURhdGFQcmVzZW50ID0gKFVDSEFSKSBGREtyZWFkQml0KGJzKSkgIT0gMCkgewotICAgIGlmICghSXNMb25nQmxvY2soKENJY3NJbmZvKilwSWNzSW5mbykpIHsKKyAgaWYgKChQdWxzZURhdGEtPlB1bHNlRGF0YVByZXNlbnQgPSAoVUNIQVIpRkRLcmVhZEJpdChicykpICE9IDApIHsKKyAgICBpZiAoIUlzTG9uZ0Jsb2NrKChjb25zdCBDSWNzSW5mbyAqKXBJY3NJbmZvKSkgewogICAgICAgcmV0dXJuIEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOwogICAgIH0KIAotICAgIFB1bHNlRGF0YS0+TnVtYmVyUHVsc2UgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDIpOwotICAgIFB1bHNlRGF0YS0+UHVsc2VTdGFydEJhbmQgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDYpOworICAgIFB1bHNlRGF0YS0+TnVtYmVyUHVsc2UgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDIpOworICAgIFB1bHNlRGF0YS0+UHVsc2VTdGFydEJhbmQgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDYpOwogCiAgICAgaWYgKFB1bHNlRGF0YS0+UHVsc2VTdGFydEJhbmQgPj0gTWF4U2ZCYW5kcykgewogICAgICAgcmV0dXJuIEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOwpAQCAtMTIyLDM3ICsxMjgsMzcgQEAKIAogICAgIGsgPSBzZmJfc3RhcnRsaW5lc1tQdWxzZURhdGEtPlB1bHNlU3RhcnRCYW5kXTsKIAotICAgIGZvciAoaT0wOyBpPD1QdWxzZURhdGEtPk51bWJlclB1bHNlOyBpKyspIHsKLSAgICAgIFB1bHNlRGF0YS0+UHVsc2VPZmZzZXRbaV0gPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDUpOwotICAgICAgUHVsc2VEYXRhLT5QdWxzZUFtcFtpXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBQdWxzZURhdGEtPk51bWJlclB1bHNlOyBpKyspIHsKKyAgICAgIFB1bHNlRGF0YS0+UHVsc2VPZmZzZXRbaV0gPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDUpOworICAgICAgUHVsc2VEYXRhLT5QdWxzZUFtcFtpXSA9IChVQ0hBUilGREtyZWFkQml0cyhicywgNCk7CiAgICAgICBrICs9IFB1bHNlRGF0YS0+UHVsc2VPZmZzZXRbaV07CiAgICAgfQogCiAgICAgaWYgKGsgPj0gZnJhbWVfbGVuZ3RoKSB7Ci0gICAgICAgIHJldHVybiBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKKyAgICAgIHJldHVybiBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKICAgICB9CiAgIH0KIAotCiAgIHJldHVybiAwOwogfQogCi12b2lkIENQdWxzZURhdGFfQXBwbHkoQ1B1bHNlRGF0YSAqUHVsc2VEYXRhLCAgICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gcHVsc2UgZGF0YSBzaWRlIGluZm8gKi8KLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG9ydCAqcFNjYWxlRmFjdG9yQmFuZE9mZnNldHMsIC8qITwgcG9pbnRlciB0byBzY2FsZWZhY3RvciBiYW5kIG9mZnNldHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY29lZikgICAgICAgICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gc3BlY3RydW0gKi8KK3ZvaWQgQ1B1bHNlRGF0YV9BcHBseSgKKyAgICBDUHVsc2VEYXRhICpQdWxzZURhdGEsIC8qITwgcG9pbnRlciB0byBwdWxzZSBkYXRhIHNpZGUgaW5mbyAqLworICAgIGNvbnN0IHNob3J0CisgICAgICAgICpwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0cywgLyohPCBwb2ludGVyIHRvIHNjYWxlZmFjdG9yIGJhbmQgb2Zmc2V0cyAqLworICAgIEZJWFBfREJMICpjb2VmKSAgICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBzcGVjdHJ1bSAqLwogewotICBpbnQgaSxrOworICBpbnQgaSwgazsKIAotICBpZiAoUHVsc2VEYXRhLT5QdWxzZURhdGFQcmVzZW50KQotICB7CisgIGlmIChQdWxzZURhdGEtPlB1bHNlRGF0YVByZXNlbnQpIHsKICAgICBrID0gcFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbUHVsc2VEYXRhLT5QdWxzZVN0YXJ0QmFuZF07CiAKLSAgICBmb3IgKGk9MDsgaTw9UHVsc2VEYXRhLT5OdW1iZXJQdWxzZTsgaSsrKQotICAgIHsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IFB1bHNlRGF0YS0+TnVtYmVyUHVsc2U7IGkrKykgewogICAgICAgayArPSBQdWxzZURhdGEtPlB1bHNlT2Zmc2V0W2ldOwotICAgICAgaWYgKGNvZWYgW2tdID4gKEZJWFBfREJMKTApIGNvZWZba10gKz0gKEZJWFBfREJMKShpbnQpUHVsc2VEYXRhLT5QdWxzZUFtcFtpXTsKLSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZba10gLT0gKEZJWFBfREJMKShpbnQpUHVsc2VEYXRhLT5QdWxzZUFtcFtpXTsKKyAgICAgIGlmIChjb2VmW2tdID4gKEZJWFBfREJMKTApCisgICAgICAgIGNvZWZba10gKz0gKEZJWFBfREJMKShpbnQpUHVsc2VEYXRhLT5QdWxzZUFtcFtpXTsKKyAgICAgIGVsc2UKKyAgICAgICAgY29lZltrXSAtPSAoRklYUF9EQkwpKGludClQdWxzZURhdGEtPlB1bHNlQW1wW2ldOwogICAgIH0KICAgfQogfQotCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL3B1bHNlZGF0YS5oIGIvbGliQUFDZGVjL3NyYy9wdWxzZWRhdGEuaAppbmRleCBmYTk3ZDk5Li4xNWFlMTFjIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL3B1bHNlZGF0YS5oCisrKyBiL2xpYkFBQ2RlYy9zcmMvcHVsc2VkYXRhLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjcgKzkwLDI1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKICAgIERlc2NyaXB0aW9uOiBwdWxzZSBkYXRhIHRvb2wKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmbmRlZiBQVUxTRURBVEFfSAogI2RlZmluZSBQVUxTRURBVEFfSAogCi0KLQogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAKICNkZWZpbmUgTl9NQVhfTElORVMgNAogCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICBVQ0hBUiBQdWxzZURhdGFQcmVzZW50OwogICBVQ0hBUiBOdW1iZXJQdWxzZTsKICAgVUNIQVIgUHVsc2VTdGFydEJhbmQ7CkBAIC0xMTQsMTcgKzEyMywxNCBAQAogICogdGhlIGJpdHN0cmVhbS4KICAqCiAgKiBccGFyYW0gYnMgYml0IHN0cmVhbSBoYW5kbGUgZGF0YSBzb3VyY2UuCi0gKiBccGFyYW0gUHVsc2VEYXRhIHBvaW50ZXIgdG8gYSBDUHVsc2VEYXRhIHdlcmUgdGhlIGRlY29kZWQgZGF0YSBpcyBzdG9yZWQgaW50by4KKyAqIFxwYXJhbSBQdWxzZURhdGEgcG9pbnRlciB0byBhIENQdWxzZURhdGEgd2VyZSB0aGUgZGVjb2RlZCBkYXRhIGlzIHN0b3JlZAorICogaW50by4KICAqIFxwYXJhbSBNYXhTZkJhbmRzIG1heCBudW1iZXIgb2Ygc2NhbGUgZmFjdG9yIGJhbmRzLgogICogXHJldHVybiAwIG9uIHN1Y2Nlc3MsICE9IDAgb24gcGFyc2UgZXJyb3IuCiAgKi8KLUlOVCBDUHVsc2VEYXRhX1JlYWQoCi0gICAgICAgIGNvbnN0IEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgICAgICBDUHVsc2VEYXRhICpjb25zdCBQdWxzZURhdGEsCi0gICAgICAgIGNvbnN0IFNIT1JUICpzZmJfc3RhcnRsaW5lcywKLSAgICAgICAgY29uc3Qgdm9pZCAqcEljc0luZm8sCi0gICAgICAgIGNvbnN0IFNIT1JUIGZyYW1lX2xlbmd0aAotICAgICAgICApOworSU5UIENQdWxzZURhdGFfUmVhZChjb25zdCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgQ1B1bHNlRGF0YSAqY29uc3QgUHVsc2VEYXRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCAqc2ZiX3N0YXJ0bGluZXMsIGNvbnN0IHZvaWQgKnBJY3NJbmZvLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCBmcmFtZV9sZW5ndGgpOwogCiAvKioKICAqIFxicmllZiBBcHBseSBwdWxzZSBkYXRhIHRvIHNwZWN0cmFsIGxpbmVzCkBAIC0xMzQsMTIgKzE0MCwxMSBAQAogICoKICAqIFxwYXJhbSBQdWxzZURhdGEgcG9pbnRlciB0byB0aGUgcHJldmlvdXNseSBkZWNvZGVkIHB1bHNlIGRhdGEuCiAgKiBccGFyYW0gcFNjYWxlRmFjdG9yQmFuZE9mZnNldHMgc2NhbGUgZmFjdG9yIGJhbmQgbGluZSBvZmZzZXQgdGFibGUuCi0gKiBccGFyYW0gY29lZiBwb2ludGVyIHRvIHRoZSBzcGVjdHJhbCBkYXRhIHdlcmUgcHVsc2UgZGF0YSBzaG91bGQgYmUgYXBwbGllZCB0by4KKyAqIFxwYXJhbSBjb2VmIHBvaW50ZXIgdG8gdGhlIHNwZWN0cmFsIGRhdGEgd2VyZSBwdWxzZSBkYXRhIHNob3VsZCBiZSBhcHBsaWVkCisgKiB0by4KICAqIFxyZXR1cm4gIG5vbmUKLSovCisgKi8KIHZvaWQgQ1B1bHNlRGF0YV9BcHBseShDUHVsc2VEYXRhICpQdWxzZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvcnQgKnBTY2FsZUZhY3RvckJhbmRPZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb2VmKTsKLQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0ICpwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0cywgRklYUF9EQkwgKmNvZWYpOwogCiAjZW5kaWYgLyogI2lmbmRlZiBQVUxTRURBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9ydmxjLmNwcCBiL2xpYkFBQ2RlYy9zcmMvcnZsYy5jcHAKaW5kZXggMTZmMGJmNS4uOTJmOWYwMiAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9ydmxjLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL3J2bGMuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDcgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCkBAIC04OSw3ICsxMDgsNiBAQAogCiAjaW5jbHVkZSAicnZsYy5oIgogCi0KICNpbmNsdWRlICJibG9jay5oIgogCiAjaW5jbHVkZSAiYWFjX3JvbS5oIgpAQCAtMTAwLDI2ICsxMTgsMjUgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIGZ1bmN0aW9uOiAgICAgcnZsY0luaXQKIAotICAgICBkZXNjcmlwdGlvbjogIGluaXQgUlZMQyBieSBkYXRhIGZyb20gY2hhbm5lbGluZm8sIHdoaWNoIHdhcyBkZWNvZGVkIHByZXZpb3VzbHkgYW5kCi0gICAgICAgICAgICAgICAgICAgc2V0IHVwIHBvaW50ZXJzCisgICAgIGRlc2NyaXB0aW9uOiAgaW5pdCBSVkxDIGJ5IGRhdGEgZnJvbSBjaGFubmVsaW5mbywgd2hpY2ggd2FzIGRlY29kZWQKK3ByZXZpb3VzbHkgYW5kIHNldCB1cCBwb2ludGVycwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgaW5wdXQ6ICAgICAtIHBvaW50ZXIgcnZsYyBzdHJ1Y3R1cmUKICAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgY2hhbm5lbCBpbmZvIHN0cnVjdHVyZQogICAgICAgICAgICAgICAgICAgIC0gcG9pbnRlciBiaXRzdHJlYW0gc3RydWN0dXJlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICByZXR1cm46ICAgIC0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KIAotc3RhdGljCi12b2lkIHJ2bGNJbml0IChDRXJSdmxjSW5mbyAgICAgICAgICAgICpwUnZsYywKLSAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICBicykKLXsKK3N0YXRpYyB2b2lkIHJ2bGNJbml0KENFclJ2bGNJbmZvICpwUnZsYywKKyAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicykgewogICAvKiBSVkxDIGNvbW1vbiBpbml0aWFsaXphdGlvbiBwYXJ0IDIgb2YgMiAqLwotICBTSE9SVCAgICAgKnBTY2ZFc2MgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZFc2M7Ci0gIFNIT1JUICAgICAqcFNjZkZ3ZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZDsKLSAgU0hPUlQgICAgICpwU2NmQndkID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkOwotICBTSE9SVCAgICAgKnBTY2FsZUZhY3RvciA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3I7CisgIFNIT1JUICpwU2NmRXNjID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRXNjOworICBTSE9SVCAqcFNjZkZ3ZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZDsKKyAgU0hPUlQgKnBTY2ZCd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2Q7CisgIFNIT1JUICpwU2NhbGVGYWN0b3IgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yOwogICBpbnQgYm5kczsKIAogICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMucnZsY0ludGVuc2l0eVVzZWQgPSAwOwpAQCAtMTI5LDcgKzE0Niw3IEBACiAgIHBSdmxjLT5udW1EZWNvZGVkRXNjYXBlV29yZHNCd2QgPSAwOwogCiAgIHBSdmxjLT5pbnRlbnNpdHlfdXNlZCA9IDA7Ci0gIHBSdmxjLT5lcnJvckxvZ1J2bGMgICA9IDA7CisgIHBSdmxjLT5lcnJvckxvZ1J2bGMgPSAwOwogCiAgIHBSdmxjLT5jb25jZWFsX21heCA9IENPTkNFQUxfTUFYX0lOSVQ7CiAgIHBSdmxjLT5jb25jZWFsX21pbiA9IENPTkNFQUxfTUlOX0lOSVQ7CkBAIC0xMzcsOCArMTU0LDggQEAKICAgcFJ2bGMtPmNvbmNlYWxfbWF4X2VzYyA9IENPTkNFQUxfTUFYX0lOSVQ7CiAgIHBSdmxjLT5jb25jZWFsX21pbl9lc2MgPSBDT05DRUFMX01JTl9JTklUOwogCi0gIHBSdmxjLT5wSHVmZlRyZWVSdmxjRXNjYXBlICA9IGFIdWZmVHJlZVJ2bGNFc2NhcGU7Ci0gIHBSdmxjLT5wSHVmZlRyZWVSdmxDb2Rld2RzICA9IGFIdWZmVHJlZVJ2bENvZGV3ZHM7CisgIHBSdmxjLT5wSHVmZlRyZWVSdmxjRXNjYXBlID0gYUh1ZmZUcmVlUnZsY0VzY2FwZTsKKyAgcFJ2bGMtPnBIdWZmVHJlZVJ2bENvZGV3ZHMgPSBhSHVmZlRyZWVSdmxDb2Rld2RzOwogCiAgIC8qIGluaXQgc2NmIGFycmF5cyAoZm9yIHNhdmV0eSAoaW4gY2FzZSBvZiB0aGVyZSBhcmUgb25seSB6ZXJvIGNvZGVib29rcykpICovCiAgIGZvciAoYm5kcyA9IDA7IGJuZHMgPCBSVkxDX01BWF9TRkI7IGJuZHMrKykgewpAQCAtMTQ4LDMzICsxNjUsMzYgQEAKICAgICBwU2NhbGVGYWN0b3JbYm5kc10gPSAwOwogICB9CiAKLSAgLyogc2V0IGJhc2UgYml0c3RyZWFtIHB0ciB0byB0aGUgUlZMLWNvZGVkIHBhcnQgKHN0YXJ0IG9mIFJWTEMgZGF0YSAoRVNDIDIpKSAqLwotICBGREtzeW5jQ2FjaGUgKGJzKTsKKyAgLyogc2V0IGJhc2UgYml0c3RyZWFtIHB0ciB0byB0aGUgUlZMLWNvZGVkIHBhcnQgKHN0YXJ0IG9mIFJWTEMgZGF0YSAoRVNDIDIpKQorICAgKi8KKyAgRkRLc3luY0NhY2hlKGJzKTsKIAotICBwUnZsYy0+Yml0c3RyZWFtSW5kZXhSdmxGd2QgPSBGREtnZXRCaXRDbnQoYnMpOyAvKiBmaXJzdCBiaXQgd2l0aGluIFJWTCBjb2RlZCBibG9jayBhcyBzdGFydCBhZGRyZXNzIGZvciAgZm9yd2FyZCBkZWNvZGluZyAqLwotICBwUnZsYy0+Yml0c3RyZWFtSW5kZXhSdmxCd2QgPSBGREtnZXRCaXRDbnQoYnMpICsgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX3NmIC0gMTsgLyogbGFzdCBiaXQgd2l0aGluIFJWTCBjb2RlZCBibG9jayBhcyBzdGFydCBhZGRyZXNzIGZvciBiYWNrd2FyZCBkZWNvZGluZyAqLworICBwUnZsYy0+Yml0c3RyZWFtSW5kZXhSdmxGd2QgPSBGREtnZXRCaXRDbnQoCisgICAgICBicyk7IC8qIGZpcnN0IGJpdCB3aXRoaW4gUlZMIGNvZGVkIGJsb2NrIGFzIHN0YXJ0IGFkZHJlc3MgZm9yICBmb3J3YXJkCisgICAgICAgICAgICAgIGRlY29kaW5nICovCisgIHBSdmxjLT5iaXRzdHJlYW1JbmRleFJ2bEJ3ZCA9IEZES2dldEJpdENudChicykgKyBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfc2YgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOyAvKiBsYXN0IGJpdCB3aXRoaW4gUlZMIGNvZGVkIGJsb2NrIGFzIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgZm9yIGJhY2t3YXJkIGRlY29kaW5nICovCiAKLSAgLyogc2tpcCBSVkxDLWJpdHN0cmVhbS1wYXJ0IC0tIHBvaW50aW5nIG5vdyB0byBlc2NhcGVzIChpZiBwcmVzZW50KSBvciB0byBUTlMgZGF0YSAoaWYgcHJlc2VudCkgKi8KLSAgRkRLcHVzaEZvciAoYnMsIHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19zZik7CisgIC8qIHNraXAgUlZMQy1iaXRzdHJlYW0tcGFydCAtLSBwb2ludGluZyBub3cgdG8gZXNjYXBlcyAoaWYgcHJlc2VudCkgb3IgdG8gVE5TCisgICAqIGRhdGEgKGlmIHByZXNlbnQpICovCisgIEZES3B1c2hGb3IoYnMsIHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19zZik7CiAKLSAgaWYgKCBwUnZsYy0+c2ZfZXNjYXBlc19wcmVzZW50ICE9IDAgKSB7Ci0KKyAgaWYgKHBSdmxjLT5zZl9lc2NhcGVzX3ByZXNlbnQgIT0gMCkgewogICAgIC8qIGxvY2F0ZSBpbnRlcm5hbCBiaXRzdHJlYW0gcHRyIGF0IGVzY2FwZXMgKHdoaWNoIGlzIHRoZSBzZWNvbmQgcGFydCkgKi8KLSAgICBGREtzeW5jQ2FjaGUgKGJzKTsKKyAgICBGREtzeW5jQ2FjaGUoYnMpOwogICAgIHBSdmxjLT5iaXRzdHJlYW1JbmRleEVzYyA9IEZES2dldEJpdENudChicyk7CiAKLSAgICAvKiBza2lwIGVzY2FwZVJWTEMtYml0c3RyZWFtLXBhcnQgLS0gcG9pbnRpbmcgdG8gVE5TIGRhdGEgKGlmIHByZXNlbnQpICAgdG8gbWFrZSBkZWNvZGVyIGNvbnRpbnVlICovCi0gICAgLyogZGVjb2Rpbmcgb2YgUlZMQyBzaG91bGQgd29yayBkZXNwaXRlIHRoaXMgc2Vjb25kIHB1c2hGb3IgZHVyaW5nIGluaXRpYWxpemF0aW9uIGJlY2F1c2UgICAgICAgICovCi0gICAgLyogYml0c3RyZWFtIGluaXRpYWxpemF0aW9uIGlzIHZhbGlkIGZvciBib3RoIEVTQzIgZGF0YSBwYXJ0cyAoUlZMLWNvZGVkIHZhbHVlcyBhbmQgRVNDLWNvZGVkIHZhbHVlcykgKi8KLSAgICBGREtwdXNoRm9yIChicywgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMpOworICAgIC8qIHNraXAgZXNjYXBlUlZMQy1iaXRzdHJlYW0tcGFydCAtLSBwb2ludGluZyB0byBUTlMgZGF0YSAoaWYgcHJlc2VudCkgICB0bworICAgICAqIG1ha2UgZGVjb2RlciBjb250aW51ZSAqLworICAgIC8qIGRlY29kaW5nIG9mIFJWTEMgc2hvdWxkIHdvcmsgZGVzcGl0ZSB0aGlzIHNlY29uZCBwdXNoRm9yIGR1cmluZworICAgICAqIGluaXRpYWxpemF0aW9uIGJlY2F1c2UgICAgICAgICovCisgICAgLyogYml0c3RyZWFtIGluaXRpYWxpemF0aW9uIGlzIHZhbGlkIGZvciBib3RoIEVTQzIgZGF0YSBwYXJ0cyAoUlZMLWNvZGVkCisgICAgICogdmFsdWVzIGFuZCBFU0MtY29kZWQgdmFsdWVzKSAqLworICAgIEZES3B1c2hGb3IoYnMsIHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzKTsKICAgfQotCi0jaWYgVkVSQk9TRV9SVkxDX0lOSVQKLSAgRGVidWdPdXRwdXRJbml0KHBSdmxjLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pOwotI2VuZGlmCiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgZnVuY3Rpb246ICAgICBydmxjQ2hlY2tJbnRlbnNpdHlDYgogCkBAIC0xODcsMjAgKzIwNywyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgaW50ZW5zaXR5IGNvZGVib29rIGlzIHVzZWQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIHJldHVybjogICAgLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLwogCi1zdGF0aWMKLXZvaWQgcnZsY0NoZWNrSW50ZW5zaXR5Q2IgKENFclJ2bGNJbmZvICAgICAgICAgICAgKnBSdmxjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbykKLXsKK3N0YXRpYyB2b2lkIHJ2bGNDaGVja0ludGVuc2l0eUNiKAorICAgIENFclJ2bGNJbmZvICpwUnZsYywgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbykgewogICBpbnQgZ3JvdXAsIGJhbmQsIGJuZHM7CiAKICAgcFJ2bGMtPmludGVuc2l0eV91c2VkID0gMDsKIAotICBmb3IgKGdyb3VwPTA7IGdyb3VwIDwgcFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgewotICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKLSAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOwotICAgICAgaWYgKCAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9va1tibmRzXSA9PSBJTlRFTlNJVFlfSENCKSB8fCAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9va1tibmRzXSA9PSBJTlRFTlNJVFlfSENCMikgKSB7CisgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IHBSdmxjLT5udW1XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKKyAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKKyAgICAgIGJuZHMgPSAxNiAqIGdyb3VwICsgYmFuZDsKKyAgICAgIGlmICgocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9va1tibmRzXSA9PQorICAgICAgICAgICBJTlRFTlNJVFlfSENCKSB8fAorICAgICAgICAgIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rW2JuZHNdID09CisgICAgICAgICAgIElOVEVOU0lUWV9IQ0IyKSkgewogICAgICAgICBwUnZsYy0+aW50ZW5zaXR5X3VzZWQgPSAxOwogICAgICAgICBicmVhazsKICAgICAgIH0KQEAgLTIwOCw0OSArMjMwLDQ2IEBACiAgIH0KIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBmdW5jdGlvbjogICAgIHJ2bGNEZWNvZGVFc2NhcGVXb3JkCiAKLSAgICAgZGVzY3JpcHRpb246ICBEZWNvZGUgYSBodWZmbWFuIGNvZGVkIFJWTEMgRXNjYXBlLXdvcmQuIFRoaXMgdmFsdWUgaXMgcGFydCBvZiBhIERQQ00gY29kZWQKLSAgICAgICAgICAgICAgICAgICBzY2FsZWZhY3Rvci4KKyAgICAgZGVzY3JpcHRpb246ICBEZWNvZGUgYSBodWZmbWFuIGNvZGVkIFJWTEMgRXNjYXBlLXdvcmQuIFRoaXMgdmFsdWUgaXMgcGFydAorb2YgYSBEUENNIGNvZGVkIHNjYWxlZmFjdG9yLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgaW5wdXQ6ICAgICAtIHBvaW50ZXIgcnZsYyBzdHJ1Y3R1cmUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHJldHVybjogICAgLSBhIHNpbmdsZSBSVkxDLUVzY2FwZSB2YWx1ZSB3aGljaCBoYWQgdG8gYmUgYXBwbGllZCB0byBhIERQQ00gdmFsdWUgKHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICBoYXMgYSBhYnNvbHV0ZSB2YWx1ZSBvZiA3KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgcmV0dXJuOiAgICAtIGEgc2luZ2xlIFJWTEMtRXNjYXBlIHZhbHVlIHdoaWNoIGhhZCB0byBiZSBhcHBsaWVkIHRvIGEKK0RQQ00gdmFsdWUgKHdoaWNoIGhhcyBhIGFic29sdXRlIHZhbHVlIG9mIDcpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KIAotc3RhdGljCi1TQ0hBUiBydmxjRGVjb2RlRXNjYXBlV29yZCAoQ0VyUnZsY0luZm8gICAgICAgICAgKnBSdmxjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBicykKLXsKLSAgaW50ICAgICAgICAgICBpOwotICBTQ0hBUiAgICAgICAgIHZhbHVlOwotICBVQ0hBUiAgICAgICAgIGNhcnJ5Qml0OwotICBVSU5UICAgICAgICAgIHRyZWVOb2RlOwotICBVSU5UICAgICAgICAgIGJyYW5jaFZhbHVlOwotICBVSU5UICAgICAgICAgIGJyYW5jaE5vZGU7CitzdGF0aWMgU0NIQVIgcnZsY0RlY29kZUVzY2FwZVdvcmQoQ0VyUnZsY0luZm8gKnBSdmxjLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicykgeworICBpbnQgaTsKKyAgU0NIQVIgdmFsdWU7CisgIFVDSEFSIGNhcnJ5Qml0OworICBVSU5UIHRyZWVOb2RlOworICBVSU5UIGJyYW5jaFZhbHVlOworICBVSU5UIGJyYW5jaE5vZGU7CiAKLSAgVVNIT1JUKiAgICAgICBwQml0c3RyZWFtSW5kZXhFc2M7Ci0gIGNvbnN0IFVJTlQqICAgcEVzY1RyZWU7CisgIElOVCAqcEJpdHN0cmVhbUluZGV4RXNjOworICBjb25zdCBVSU5UICpwRXNjVHJlZTsKIAogICBwRXNjVHJlZSA9IHBSdmxjLT5wSHVmZlRyZWVSdmxjRXNjYXBlOwogICBwQml0c3RyZWFtSW5kZXhFc2MgPSAmKHBSdmxjLT5iaXRzdHJlYW1JbmRleEVzYyk7Ci0gIHRyZWVOb2RlID0gKnBFc2NUcmVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgYXQgc3RhcnRpbmcgbm9kZSAqLworICB0cmVlTm9kZSA9ICpwRXNjVHJlZTsgLyogaW5pdCBhdCBzdGFydGluZyBub2RlICovCiAKLSAgZm9yIChpPU1BWF9MRU5fUlZMQ19FU0NBUEVfV09SRC0xOyBpID49IDA7IGktLSkgewotICAgIGNhcnJ5Qml0ID0gcnZsY1JlYWRCaXRGcm9tQml0c3RyZWFtKGJzLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgbmV4dCBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0c3RyZWFtSW5kZXhFc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldEKTsKKyAgZm9yIChpID0gTUFYX0xFTl9SVkxDX0VTQ0FQRV9XT1JEIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBjYXJyeUJpdCA9IHJ2bGNSZWFkQml0RnJvbUJpdHN0cmVhbShicywgLyogZ2V0IG5leHQgYml0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdHN0cmVhbUluZGV4RXNjLCBGV0QpOwogCi0gICAgQ2FycnlCaXRUb0JyYW5jaFZhbHVlKGNhcnJ5Qml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGh1ZmZtYW4gZGVjb2RpbmcsIGRvIGEgc2luZ2xlIHN0ZXAgaW4gaHVmZm1hbiBkZWNvZGluZyB0cmVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmYnJhbmNoVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZicmFuY2hOb2RlKTsKKyAgICBDYXJyeUJpdFRvQnJhbmNoVmFsdWUoY2FycnlCaXQsIC8qIGh1ZmZtYW4gZGVjb2RpbmcsIGRvIGEgc2luZ2xlIHN0ZXAgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZtYW4gZGVjb2RpbmcgdHJlZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlTm9kZSwgJmJyYW5jaFZhbHVlLCAmYnJhbmNoTm9kZSk7CiAKLSAgICBpZiAoKGJyYW5jaE5vZGUgJiBURVNUX0JJVF8xMCkgPT0gVEVTVF9CSVRfMTApIHsgICAgICAgICAgICAgICAgLyogdGVzdCBiaXQgMTAgOyBpZiBzZXQgLS0+IGEgUlZMQy1lc2NhcGUtd29yZCBpcyBjb21wbGV0ZWx5IGRlY29kZWQgKi8KLSAgICAgIHZhbHVlID0gKFNDSEFSKSBicmFuY2hOb2RlICYgQ0xSX0JJVF8xMDsKKyAgICBpZiAoKGJyYW5jaE5vZGUgJiBURVNUX0JJVF8xMCkgPT0KKyAgICAgICAgVEVTVF9CSVRfMTApIHsgLyogdGVzdCBiaXQgMTAgOyBpZiBzZXQgLS0+IGEgUlZMQy1lc2NhcGUtd29yZCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWx5IGRlY29kZWQgKi8KKyAgICAgIHZhbHVlID0gKFNDSEFSKWJyYW5jaE5vZGUgJiBDTFJfQklUXzEwOwogICAgICAgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMgLT0gKE1BWF9MRU5fUlZMQ19FU0NBUEVfV09SRCAtIGkpOwogCiAgICAgICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMgPCAwKSB7CkBAIC0yNTksMzIgKzI3OCwzMyBAQAogICAgICAgfQogCiAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgdHJlZU5vZGUgPSAqKHBFc2NUcmVlICsgYnJhbmNoVmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgdHJlZU5vZGUgZm9yIGZ1cnRoZXIgc3RlcCBpbiBkZWNvZGluZyB0cmVlICovCisgICAgfSBlbHNlIHsKKyAgICAgIHRyZWVOb2RlID0gKigKKyAgICAgICAgICBwRXNjVHJlZSArCisgICAgICAgICAgYnJhbmNoVmFsdWUpOyAvKiB1cGRhdGUgdHJlZU5vZGUgZm9yIGZ1cnRoZXIgc3RlcCBpbiBkZWNvZGluZyB0cmVlICovCiAgICAgfQogICB9CiAKICAgcFJ2bGMtPmVycm9yTG9nUnZsYyB8PSBSVkxDX0VSUk9SX0FMTF9FU0NBUEVfV09SRFNfSU5WQUxJRDsKIAotICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaG91bGQgbm90IGJlIHJlYWNoZWQgKi8KKyAgcmV0dXJuIC0xOyAvKiBzaG91bGQgbm90IGJlIHJlYWNoZWQgKi8KIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBmdW5jdGlvbjogICAgIHJ2bGNEZWNvZGVFc2NhcGVzCiAKICAgICAgZGVzY3JpcHRpb246ICBEZWNvZGVzIGFsbCBodWZmbWFuIGNvZGVkIFJWTEMgRXNjYXBlIFdvcmRzLgotICAgICAgICAgICAgICAgICAgIEhlcmUgYSBkaWZmZXJlbmNlIHRvIHRoZSBwc2V1ZG8tY29kZS1pbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIGNhbiBiZSAKLSAgICAgICAgICAgICAgICAgICBmb3VuZC4gQSB3aGlsZSBsb29wIChhbmQgbm90IHR3byBuZXN0ZWQgZm9yIGxvb3BzKSBpcyB1c2VkIGZvciB0d28gcmVhc29uczoKKyAgICAgICAgICAgICAgICAgICBIZXJlIGEgZGlmZmVyZW5jZSB0byB0aGUgcHNldWRvLWNvZGUtaW1wbGVtZW50YXRpb24gZnJvbQorc3RhbmRhcmQgY2FuIGJlIGZvdW5kLiBBIHdoaWxlIGxvb3AgKGFuZCBub3QgdHdvIG5lc3RlZCBmb3IgbG9vcHMpIGlzIHVzZWQgZm9yCit0d28gcmVhc29uczoKIAotICAgICAgICAgICAgICAgICAgIDEuIFRoZSBwbGFpbiBodWZmbWFuIGVuY29kZWQgZXNjYXBlcyBhcmUgZGVjb2RlZCBiZWZvcmUgdGhlIFJWTC1jb2RlZCAKLSAgICAgICAgICAgICAgICAgICAgICBzY2FsZWZhY3RvcnMuIFRoZXJlZm9yZSB0aGUgZXNjYXBlcyBhcmUgcHJlc2VudCBpbiB0aGUgc2Vjb25kIHN0ZXAgCi0gICAgICAgICAgICAgICAgICAgICAgd2hlbiBkZWNvZGluZyB0aGUgUlZMLWNvZGVkLXNjYWxlZmFjdG9yIHZhbHVlcyBpbiBmb3J3YXJkIGFuZCAKLSAgICAgICAgICAgICAgICAgICAgICBiYWNrd2FyZCBkaXJlY3Rpb24uCisgICAgICAgICAgICAgICAgICAgMS4gVGhlIHBsYWluIGh1ZmZtYW4gZW5jb2RlZCBlc2NhcGVzIGFyZSBkZWNvZGVkIGJlZm9yZSB0aGUKK1JWTC1jb2RlZCBzY2FsZWZhY3RvcnMuIFRoZXJlZm9yZSB0aGUgZXNjYXBlcyBhcmUgcHJlc2VudCBpbiB0aGUgc2Vjb25kIHN0ZXAKKyAgICAgICAgICAgICAgICAgICAgICB3aGVuIGRlY29kaW5nIHRoZSBSVkwtY29kZWQtc2NhbGVmYWN0b3IgdmFsdWVzIGluIGZvcndhcmQKK2FuZCBiYWNrd2FyZCBkaXJlY3Rpb24uCiAKLSAgICAgICAgICAgICAgICAgICAgICBXaGVuIHRoZSBSVkwtY29kZWQgc2NhbGVmYWN0b3JzIGFyZSBkZWNvZGVkIGFuZCB0aGVyZSBhIGVzY2FwZSBpcyAKLSAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIHRoZW4gaXQgaXMganVzdCB0YWtlbiBvdXQgb2YgdGhlIGFycmF5IGluIGFzY2VuZGluZyBvcmRlci4KKyAgICAgICAgICAgICAgICAgICAgICBXaGVuIHRoZSBSVkwtY29kZWQgc2NhbGVmYWN0b3JzIGFyZSBkZWNvZGVkIGFuZCB0aGVyZSBhCitlc2NhcGUgaXMgbmVlZGVkLCB0aGVuIGl0IGlzIGp1c3QgdGFrZW4gb3V0IG9mIHRoZSBhcnJheSBpbiBhc2NlbmRpbmcgb3JkZXIuCiAKICAgICAgICAgICAgICAgICAgICAyLiBJdCdzIGZhc3Rlci4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yOTQsMjkgKzMxNCwyNSBAQAogICAgICAgICByZXR1cm46ICAgIC0gMCBvayAgICAgdGhlIGRlY29kZWQgZXNjYXBlcyBzZWVtIHRvIGJlIHZhbGlkCiAgICAgICAgICAgICAgICAgICAgLSAxIGVycm9yICB0aGVyZSB3YXMgYSBlcnJvciBkZXRlY3RlZCBkdXJpbmcgZGVjb2RpbmcgZXNjYXBlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+IGFsbCBlc2NhcGVzIGFyZSBpbnZhbGlkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLXN0YXRpYwotdm9pZCBydmxjRGVjb2RlRXNjYXBlcyAoQ0VyUnZsY0luZm8gICAgICAgICAgKnBSdmxjLAotICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgICAgICAgICAgICAgICAgKnBFc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMpCi17Ci0gIFNDSEFSICBlc2NXb3JkOwotICBTQ0hBUiAgZXNjQ250PTA7Ci0gIFNIT1JUKiBwRXNjQml0Q250U3VtOworc3RhdGljIHZvaWQgcnZsY0RlY29kZUVzY2FwZXMoQ0VyUnZsY0luZm8gKnBSdmxjLCBTSE9SVCAqcEVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzKSB7CisgIFNDSEFSIGVzY1dvcmQ7CisgIFNDSEFSIGVzY0NudCA9IDA7CisgIFNIT1JUICpwRXNjQml0Q250U3VtOwogCiAgIHBFc2NCaXRDbnRTdW0gPSAmKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzKTsKIAogICAvKiBEZWNvZGUgYWxsIFJWTEMtRXNjYXBlIHdvcmRzIHdpdGggYSBwbGFpbiBIdWZmbWFuLURlY29kZXIgKi8KLSAgd2hpbGUgKCAqcEVzY0JpdENudFN1bSA+IDAgKSB7CisgIHdoaWxlICgqcEVzY0JpdENudFN1bSA+IDApIHsKICAgICBlc2NXb3JkID0gcnZsY0RlY29kZUVzY2FwZVdvcmQocFJ2bGMsIGJzKTsKIAogICAgIGlmIChlc2NXb3JkID49IDApIHsKLQogICAgICAgcEVzY1tlc2NDbnRdID0gZXNjV29yZDsKICAgICAgIGVzY0NudCsrOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgcFJ2bGMtPmVycm9yTG9nUnZsYyB8PSBSVkxDX0VSUk9SX0FMTF9FU0NBUEVfV09SRFNfSU5WQUxJRDsKICAgICAgIHBSdmxjLT5udW1EZWNvZGVkRXNjYXBlV29yZHNFc2MgPSBlc2NDbnQ7CiAKQEAgLTMyNyw3ICszNDMsNiBAQAogICBwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzRXNjID0gZXNjQ250OwogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIGZ1bmN0aW9uOiAgICAgZGVjb2RlUlZMQ29kZXdvcmQKIApAQCAtMzM2LDY4ICszNTEsNzEgQEAKICAgICAgICAgaW5wdXQ6ICAgICAtIEZESyBiaXRzdHJlYW0gaGFuZGxlCiAgICAgICAgICAgICAgICAgICAgLSBwb2ludGVyIHJ2bGMgc3RydWN0dXJlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICByZXR1cm46ICAgIC0gYSBkcGNtIHZhbHVlIHdoaWNoIGlzIHdpdGhpbiByYW5nZSBbMCwxLC4uLDE0XSBpbiBjYXNlIG9mIG5vIGVycm9ycy4KLSAgICAgICAgICAgICAgICAgICAgIFRoZSBvZmZzZXQgb2YgNyBtdXN0IGJlIHN1YnRyYWN0ZWQgdG8gZ2V0IGEgdmFsaWQgZHBjbSBzY2FsZWZhY3RvciB2YWx1ZS4KLSAgICAgICAgICAgICAgICAgICAgIEluIGNhc2Ugb2YgZXJyb3JzIGEgZm9yYmlkZGVuIGNvZGV3b3JkIGlzIGRldGVjdGVkIC0tPiByZXR1cm5pbmcgLTEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgIHJldHVybjogICAgLSBhIGRwY20gdmFsdWUgd2hpY2ggaXMgd2l0aGluIHJhbmdlIFswLDEsLi4sMTRdIGluIGNhc2Ugb2YKK25vIGVycm9ycy4gVGhlIG9mZnNldCBvZiA3IG11c3QgYmUgc3VidHJhY3RlZCB0byBnZXQgYSB2YWxpZCBkcGNtIHNjYWxlZmFjdG9yCit2YWx1ZS4gSW4gY2FzZSBvZiBlcnJvcnMgYSBmb3JiaWRkZW4gY29kZXdvcmQgaXMgZGV0ZWN0ZWQgLS0+IHJldHVybmluZyAtMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLVNDSEFSIGRlY29kZVJWTENvZGV3b3JkIChIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMsIENFclJ2bGNJbmZvICpwUnZsYykKLXsKLSAgaW50ICAgICBpOwotICBTQ0hBUiAgIHZhbHVlOwotICBVQ0hBUiAgIGNhcnJ5Qml0OwotICBVSU5UICAgIGJyYW5jaFZhbHVlOwotICBVSU5UICAgIGJyYW5jaE5vZGU7CitTQ0hBUiBkZWNvZGVSVkxDb2Rld29yZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgQ0VyUnZsY0luZm8gKnBSdmxjKSB7CisgIGludCBpOworICBTQ0hBUiB2YWx1ZTsKKyAgVUNIQVIgY2FycnlCaXQ7CisgIFVJTlQgYnJhbmNoVmFsdWU7CisgIFVJTlQgYnJhbmNoTm9kZTsKIAogICBjb25zdCBVSU5UICpwUnZsQ29kZVRyZWUgPSBwUnZsYy0+cEh1ZmZUcmVlUnZsQ29kZXdkczsKLSAgVUNIQVIgICBkaXJlY3Rpb24gICAgICAgID0gcFJ2bGMtPmRpcmVjdGlvbjsKLSAgVVNIT1JUICpwQml0c3RySW5keFJ2bCAgID0gcFJ2bGMtPnBCaXRzdHJJbmR4UnZsX1JWTDsKLSAgVUlOVCAgICB0cmVlTm9kZSAgICAgICAgID0gKnBSdmxDb2RlVHJlZTsKKyAgVUNIQVIgZGlyZWN0aW9uID0gcFJ2bGMtPmRpcmVjdGlvbjsKKyAgSU5UICpwQml0c3RySW5keFJ2bCA9IHBSdmxjLT5wQml0c3RySW5keFJ2bF9SVkw7CisgIFVJTlQgdHJlZU5vZGUgPSAqcFJ2bENvZGVUcmVlOwogCi0gIGZvciAoaT1NQVhfTEVOX1JWTENfQ09ERV9XT1JELTE7IGkgPj0gMDsgaS0tKSB7IAotICAgIGNhcnJ5Qml0ID0gcnZsY1JlYWRCaXRGcm9tQml0c3RyZWFtKGJzLCAgICAgICAgICAgICAvKiBnZXQgbmV4dCBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0c3RySW5keFJ2bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24pOworICBmb3IgKGkgPSBNQVhfTEVOX1JWTENfQ09ERV9XT1JEIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBjYXJyeUJpdCA9IHJ2bGNSZWFkQml0RnJvbUJpdHN0cmVhbShicywgLyogZ2V0IG5leHQgYml0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdHN0ckluZHhSdmwsIGRpcmVjdGlvbik7CiAKLSAgICBDYXJyeUJpdFRvQnJhbmNoVmFsdWUoY2FycnlCaXQsICAgICAgICAgICAgICAgICAgICAgLyogaHVmZm1hbiBkZWNvZGluZywgZG8gYSBzaW5nbGUgc3RlcCBpbiBodWZmbWFuIGRlY29kaW5nIHRyZWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZicmFuY2hWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmJyYW5jaE5vZGUpOworICAgIENhcnJ5Qml0VG9CcmFuY2hWYWx1ZShjYXJyeUJpdCwgLyogaHVmZm1hbiBkZWNvZGluZywgZG8gYSBzaW5nbGUgc3RlcCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVmZm1hbiBkZWNvZGluZyB0cmVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVOb2RlLCAmYnJhbmNoVmFsdWUsICZicmFuY2hOb2RlKTsKIAotICAgIGlmICgoYnJhbmNoTm9kZSAmIFRFU1RfQklUXzEwKSA9PSBURVNUX0JJVF8xMCkgeyAgICAvKiB0ZXN0IGJpdCAxMCA7IGlmIHNldCAtLT4gYSBSVkxDLWNvZGV3b3JkIGlzIGNvbXBsZXRlbHkgZGVjb2RlZCAqLwotICAgICAgdmFsdWUgPSAoU0NIQVIpIChicmFuY2hOb2RlICYgQ0xSX0JJVF8xMCk7Ci0gICAgICAqcFJ2bGMtPnBSdmxCaXRDbnRfUlZMIC09IChNQVhfTEVOX1JWTENfQ09ERV9XT1JEIC0gaSk7ICAKLSAgICAgIAorICAgIGlmICgoYnJhbmNoTm9kZSAmIFRFU1RfQklUXzEwKSA9PQorICAgICAgICBURVNUX0JJVF8xMCkgeyAvKiB0ZXN0IGJpdCAxMCA7IGlmIHNldCAtLT4gYQorICAgICAgICAgICAgICAgICAgICAgICAgICBSVkxDLWNvZGV3b3JkIGlzIGNvbXBsZXRlbHkgZGVjb2RlZAorICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIHZhbHVlID0gKFNDSEFSKShicmFuY2hOb2RlICYgQ0xSX0JJVF8xMCk7CisgICAgICAqcFJ2bGMtPnBSdmxCaXRDbnRfUlZMIC09IChNQVhfTEVOX1JWTENfQ09ERV9XT1JEIC0gaSk7CisKICAgICAgIC8qIGNoZWNrIGF2YWlsYWJsZSBiaXRzIGZvciBkZWNvZGluZyAqLwogICAgICAgaWYgKCpwUnZsYy0+cFJ2bEJpdENudF9SVkwgPCAwKSB7Ci0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gIEZXRCkgeyAKLSAgICAgICAgICBwUnZsYy0+ZXJyb3JMb2dSdmxjIHw9IFJWTENfRVJST1JfUlZMX1NVTV9CSVRfQ09VTlRFUl9CRUxPV19aRVJPX0ZXRDsgfQotICAgICAgICBlbHNlIHsgCi0gICAgICAgICAgcFJ2bGMtPmVycm9yTG9nUnZsYyB8PSBSVkxDX0VSUk9SX1JWTF9TVU1fQklUX0NPVU5URVJfQkVMT1dfWkVST19CV0Q7IH0KLSAgICAgICAgdmFsdWUgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2lnbmFsaXplIGFuIGVycm9yIGluIHJldHVybiB2YWx1ZSwgYmVjYXVzZSB0b28gbWFueSBiaXRzIHdhcyBkZWNvZGVkICovCisgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRldEKSB7CisgICAgICAgICAgcFJ2bGMtPmVycm9yTG9nUnZsYyB8PSBSVkxDX0VSUk9SX1JWTF9TVU1fQklUX0NPVU5URVJfQkVMT1dfWkVST19GV0Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcFJ2bGMtPmVycm9yTG9nUnZsYyB8PSBSVkxDX0VSUk9SX1JWTF9TVU1fQklUX0NPVU5URVJfQkVMT1dfWkVST19CV0Q7CisgICAgICAgIH0KKyAgICAgICAgdmFsdWUgPSAtMTsgLyogc2lnbmFsaXplIGFuIGVycm9yIGluIHJldHVybiB2YWx1ZSwgYmVjYXVzZSB0b28gbWFueSBiaXRzCisgICAgICAgICAgICAgICAgICAgICAgIHdhcyBkZWNvZGVkICovCiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLyogY2hlY2sgbWF4IHZhbHVlIG9mIGRwY20gdmFsdWUgKi8KICAgICAgIGlmICh2YWx1ZSA+IE1BWF9BTExPV0VEX0RQQ01fSU5ERVgpIHsKLSAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSAgRldEKSB7IAotICAgICAgICAgIHBSdmxjLT5lcnJvckxvZ1J2bGMgfD0gUlZMQ19FUlJPUl9GT1JCSURERU5fQ1dfREVURUNURURfRldEOyAKKyAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBGV0QpIHsKKyAgICAgICAgICBwUnZsYy0+ZXJyb3JMb2dSdmxjIHw9IFJWTENfRVJST1JfRk9SQklEREVOX0NXX0RFVEVDVEVEX0ZXRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwUnZsYy0+ZXJyb3JMb2dSdmxjIHw9IFJWTENfRVJST1JfRk9SQklEREVOX0NXX0RFVEVDVEVEX0JXRDsKICAgICAgICAgfQotICAgICAgICBlbHNlIHsgCi0gICAgICAgICAgcFJ2bGMtPmVycm9yTG9nUnZsYyB8PSBSVkxDX0VSUk9SX0ZPUkJJRERFTl9DV19ERVRFQ1RFRF9CV0Q7IAotICAgICAgICB9Ci0gICAgICAgIHZhbHVlID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpZ25hbGl6ZSBhbiBlcnJvciBpbiByZXR1cm4gdmFsdWUsIGJlY2F1c2UgYSBmb3JiaWRkZW4gY3cgd2FzIGRldGVjdGVkKi8KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHZhbHVlID0gLTE7IC8qIHNpZ25hbGl6ZSBhbiBlcnJvciBpbiByZXR1cm4gdmFsdWUsIGJlY2F1c2UgYSBmb3JiaWRkZW4KKyAgICAgICAgICAgICAgICAgICAgICAgY3cgd2FzIGRldGVjdGVkKi8KKyAgICAgIH0KIAotICAgICAgcmV0dXJuIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gYSBkcGNtIHZhbHVlIHdpdGggb2Zmc2V0ICs3IG9yIGFuIGVycm9yIHN0YXR1cyAqLwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHRyZWVOb2RlID0gKihwUnZsQ29kZVRyZWUgKyBicmFuY2hWYWx1ZSk7ICAgICAgICAgLyogdXBkYXRlIHRyZWVOb2RlIGZvciBmdXJ0aGVyIHN0ZXAgaW4gZGVjb2RpbmcgdHJlZSAqLworICAgICAgcmV0dXJuIHZhbHVlOyAvKiByZXR1cm4gYSBkcGNtIHZhbHVlIHdpdGggb2Zmc2V0ICs3IG9yIGFuIGVycm9yIHN0YXR1cyAqLworICAgIH0gZWxzZSB7CisgICAgICB0cmVlTm9kZSA9ICooCisgICAgICAgICAgcFJ2bENvZGVUcmVlICsKKyAgICAgICAgICBicmFuY2hWYWx1ZSk7IC8qIHVwZGF0ZSB0cmVlTm9kZSBmb3IgZnVydGhlciBzdGVwIGluIGRlY29kaW5nIHRyZWUgKi8KICAgICB9CiAgIH0KLSAgCi0gIHJldHVybiAtMTsgIAotfQogCisgIHJldHVybiAtMTsKK30KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgZnVuY3Rpb246ICAgICBydmxjRGVjb2RlRm9yd2FyZApAQCAtNDA5LDk0ICs0MjcsNTYgQEAKICAgICAgICAgICAgICAgICAgICAtIGhhbmRsZSB0byBGREsgYml0c3RyZWFtCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICByZXR1cm46ICAgIC0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KIAotc3RhdGljCi12b2lkIHJ2bGNEZWNvZGVGb3J3YXJkIChDRXJSdmxjSW5mbyAgICAgICAgICAgICpwUnZsYywKLSAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICBicykKLXsKLSAgaW50IGJhbmQgID0gMDsKK3N0YXRpYyB2b2lkIHJ2bGNEZWNvZGVGb3J3YXJkKENFclJ2bGNJbmZvICpwUnZsYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicykgeworICBpbnQgYmFuZCA9IDA7CiAgIGludCBncm91cCA9IDA7Ci0gIGludCBibmRzICA9IDA7CisgIGludCBibmRzID0gMDsKIAogICBTSE9SVCBkcGNtOwogCi0gIFNIT1JUICBmYWN0b3IgICA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluIC0gU0ZfT0ZGU0VUOwotICBTSE9SVCAgcG9zaXRpb24gPSAtIFNGX09GRlNFVDsKLSAgU0hPUlQgIG5vaXNlbnJnID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkdsb2JhbEdhaW4gLSBTRl9PRkZTRVQgLSA5MCAtIDI1NjsKKyAgU0hPUlQgZmFjdG9yID0KKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluIC0gU0ZfT0ZGU0VUOworICBTSE9SVCBwb3NpdGlvbiA9IC1TRl9PRkZTRVQ7CisgIFNIT1JUIG5vaXNlbnJnID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkdsb2JhbEdhaW4gLQorICAgICAgICAgICAgICAgICAgIFNGX09GRlNFVCAtIDkwIC0gMjU2OwogCi0gIFNIT1JUKiBwU2NmRndkID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkOwotICBTSE9SVCogcFNjZkVzYyA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkVzYzsKLSAgVUNIQVIqIHBFc2NGd2RDbnQgPSAmKHBSdmxjLT5udW1EZWNvZGVkRXNjYXBlV29yZHNGd2QpOwotICAKKyAgU0hPUlQgKnBTY2ZGd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2Q7CisgIFNIT1JUICpwU2NmRXNjID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRXNjOworICBVQ0hBUiAqcEVzY0Z3ZENudCA9ICYocFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0Z3ZCk7CisKICAgcFJ2bGMtPnBSdmxCaXRDbnRfUlZMID0gJihwUnZsYy0+bGVuZ3RoX29mX3J2bGNfc2ZfZndkKTsKICAgcFJ2bGMtPnBCaXRzdHJJbmR4UnZsX1JWTCA9ICYocFJ2bGMtPmJpdHN0cmVhbUluZGV4UnZsRndkKTsKIAotICAqcEVzY0Z3ZENudCAgICAgICA9IDA7Ci0gIHBSdmxjLT5kaXJlY3Rpb24gID0gRldEOworICAqcEVzY0Z3ZENudCA9IDA7CisgIHBSdmxjLT5kaXJlY3Rpb24gPSBGV0Q7CiAgIHBSdmxjLT5ub2lzZV91c2VkID0gMDsKLSAgcFJ2bGMtPnNmX3VzZWQgICAgPSAwOwotICBwUnZsYy0+bGFzdFNjZiAgICA9IDA7Ci0gIHBSdmxjLT5sYXN0TnJnICAgID0gMDsKLSAgcFJ2bGMtPmxhc3RJcyAgICAgPSAwOyAgICAgICAgIAorICBwUnZsYy0+c2ZfdXNlZCA9IDA7CisgIHBSdmxjLT5sYXN0U2NmID0gMDsKKyAgcFJ2bGMtPmxhc3ROcmcgPSAwOworICBwUnZsYy0+bGFzdElzID0gMDsKIAotICBydmxjQ2hlY2tJbnRlbnNpdHlDYihwUnZsYyxwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKKyAgcnZsY0NoZWNrSW50ZW5zaXR5Q2IocFJ2bGMsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pOwogCiAgIC8qIG1haW4gbG9vcCBmd2QgbG9uZyAqLwotICBmb3IgKGdyb3VwPTA7IGdyb3VwIDwgcFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgewotICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKLSAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOworICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKSB7CisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgYmFuZCsrKSB7CisgICAgICBibmRzID0gMTYgKiBncm91cCArIGJhbmQ7CiAKICAgICAgIHN3aXRjaCAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9va1tibmRzXSkgeworICAgICAgICBjYXNlIFpFUk9fSENCOgorICAgICAgICAgIHBTY2ZGd2RbYm5kc10gPSAwOworICAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIFpFUk9fSENCIDoKLSAgICAgICAgcFNjZkZ3ZFtibmRzXSA9IDA7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIElOVEVOU0lUWV9IQ0IyIDoKLSAgICAgIGNhc2UgSU5URU5TSVRZX0hDQiAgOgotICAgICAgICAvKiBzdG9yZSBkcGNtX2lzX3Bvc2l0aW9uICovCi0gICAgICAgIGRwY20gPSBkZWNvZGVSVkxDb2Rld29yZChicywgcFJ2bGMpOwotICAgICAgICBpZiAoIGRwY20gPCAwICkgewotICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21heCA9IGJuZHM7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGRwY20gLT0gVEFCTEVfT0ZGU0VUOwotICAgICAgICBpZiAoKGRwY20gPT0gTUlOX1JWTCkgfHwgKGRwY20gPT0gTUFYX1JWTCkpIHsKLSAgICAgICAgICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMpIHsKLSAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21heCA9IGJuZHM7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKGRwY20gPT0gTUlOX1JWTCkgeyAKLSAgICAgICAgICAgICAgZHBjbSAtPSAqcFNjZkVzYysrOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgeyAKLSAgICAgICAgICAgICAgZHBjbSArPSAqcFNjZkVzYysrOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICgqcEVzY0Z3ZENudCkrKzsKLSAgICAgICAgICAgIGlmIChwUnZsYy0+Y29uY2VhbF9tYXhfZXNjID09IENPTkNFQUxfTUFYX0lOSVQpIHsKLSAgICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWF4X2VzYyA9IGJuZHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBvc2l0aW9uICs9IGRwY207Ci0gICAgICAgIHBTY2ZGd2RbYm5kc10gPSBwb3NpdGlvbjsKLSAgICAgICAgcFJ2bGMtPmxhc3RJcyA9IHBvc2l0aW9uOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBOT0lTRV9IQ0IgOgotICAgICAgICBpZiAocFJ2bGMtPm5vaXNlX3VzZWQgPT0gMCkgewotICAgICAgICAgIHBSdmxjLT5ub2lzZV91c2VkID0gMTsKLSAgICAgICAgICBwUnZsYy0+Zmlyc3Rfbm9pc2VfYmFuZCA9IGJuZHM7Ci0gICAgICAgICAgbm9pc2VucmcgKz0gcFJ2bGMtPmRwY21fbm9pc2VfbnJnOwotICAgICAgICAgIHBTY2ZGd2RbYm5kc10gPSAxMDAgKyBub2lzZW5yZzsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBwUnZsYy0+bGFzdE5yZyA9IG5vaXNlbnJnOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgeworICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0IyOgorICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0I6CisgICAgICAgICAgLyogc3RvcmUgZHBjbV9pc19wb3NpdGlvbiAqLwogICAgICAgICAgIGRwY20gPSBkZWNvZGVSVkxDb2Rld29yZChicywgcFJ2bGMpOwotICAgICAgICAgIGlmICggZHBjbSA8IDAgKSB7CisgICAgICAgICAgaWYgKGRwY20gPCAwKSB7CiAgICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9tYXggPSBibmRzOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgIH0KQEAgLTUwNSwxMyArNDg1LDExIEBACiAgICAgICAgICAgICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMpIHsKICAgICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWF4ID0gYm5kczsKICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIGlmIChkcGNtID09IE1JTl9SVkwpIHsgCi0gICAgICAgICAgICAgICAgZHBjbSAtPSAqcFNjZkVzYysrOyAKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIHsgCi0gICAgICAgICAgICAgICAgZHBjbSArPSAqcFNjZkVzYysrOyAKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGlmIChkcGNtID09IE1JTl9SVkwpIHsKKyAgICAgICAgICAgICAgICBkcGNtIC09ICpwU2NmRXNjKys7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHBjbSArPSAqcFNjZkVzYysrOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICgqcEVzY0Z3ZENudCkrKzsKICAgICAgICAgICAgICAgaWYgKHBSdmxjLT5jb25jZWFsX21heF9lc2MgPT0gQ09OQ0VBTF9NQVhfSU5JVCkgewpAQCAtNTE5LDUwICs0OTcsODQgQEAKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgICBub2lzZW5yZyArPSBkcGNtOwotICAgICAgICAgIHBTY2ZGd2RbYm5kc10gPSAxMDAgKyBub2lzZW5yZzsKLSAgICAgICAgICBwUnZsYy0+bGFzdE5yZyA9IG5vaXNlbnJnOyAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEuYWFjLlBuc0RhdGEucG5zVXNlZFtibmRzXSA9IDE7Ci0gICAgICAgIGJyZWFrIDsKKyAgICAgICAgICBwb3NpdGlvbiArPSBkcGNtOworICAgICAgICAgIHBTY2ZGd2RbYm5kc10gPSBwb3NpdGlvbjsKKyAgICAgICAgICBwUnZsYy0+bGFzdElzID0gcG9zaXRpb247CisgICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICBwUnZsYy0+c2ZfdXNlZCA9IDE7Ci0gICAgICAgIGRwY20gPSBkZWNvZGVSVkxDb2Rld29yZChicywgcFJ2bGMpOwotICAgICAgICBpZiAoIGRwY20gPCAwICkgewotICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21heCA9IGJuZHM7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGRwY20gLT0gVEFCTEVfT0ZGU0VUOwotICAgICAgICBpZiAoKGRwY20gPT0gTUlOX1JWTCkgfHwgKGRwY20gPT0gTUFYX1JWTCkpIHsKLSAgICAgICAgICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMpIHsKKyAgICAgICAgY2FzZSBOT0lTRV9IQ0I6CisgICAgICAgICAgaWYgKHBSdmxjLT5ub2lzZV91c2VkID09IDApIHsKKyAgICAgICAgICAgIHBSdmxjLT5ub2lzZV91c2VkID0gMTsKKyAgICAgICAgICAgIHBSdmxjLT5maXJzdF9ub2lzZV9iYW5kID0gYm5kczsKKyAgICAgICAgICAgIG5vaXNlbnJnICs9IHBSdmxjLT5kcGNtX25vaXNlX25yZzsKKyAgICAgICAgICAgIHBTY2ZGd2RbYm5kc10gPSAxMDAgKyBub2lzZW5yZzsKKyAgICAgICAgICAgIHBSdmxjLT5sYXN0TnJnID0gbm9pc2Vucmc7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRwY20gPSBkZWNvZGVSVkxDb2Rld29yZChicywgcFJ2bGMpOworICAgICAgICAgICAgaWYgKGRwY20gPCAwKSB7CisgICAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21heCA9IGJuZHM7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRwY20gLT0gVEFCTEVfT0ZGU0VUOworICAgICAgICAgICAgaWYgKChkcGNtID09IE1JTl9SVkwpIHx8IChkcGNtID09IE1BWF9SVkwpKSB7CisgICAgICAgICAgICAgIGlmIChwUnZsYy0+bGVuZ3RoX29mX3J2bGNfZXNjYXBlcykgeworICAgICAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21heCA9IGJuZHM7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChkcGNtID09IE1JTl9SVkwpIHsKKyAgICAgICAgICAgICAgICAgIGRwY20gLT0gKnBTY2ZFc2MrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgZHBjbSArPSAqcFNjZkVzYysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAoKnBFc2NGd2RDbnQpKys7CisgICAgICAgICAgICAgICAgaWYgKHBSdmxjLT5jb25jZWFsX21heF9lc2MgPT0gQ09OQ0VBTF9NQVhfSU5JVCkgeworICAgICAgICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWF4X2VzYyA9IGJuZHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2lzZW5yZyArPSBkcGNtOworICAgICAgICAgICAgcFNjZkZ3ZFtibmRzXSA9IDEwMCArIG5vaXNlbnJnOworICAgICAgICAgICAgcFJ2bGMtPmxhc3ROcmcgPSBub2lzZW5yZzsKKyAgICAgICAgICB9CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS5hYWMuUG5zRGF0YS5wbnNVc2VkW2JuZHNdID0gMTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHBSdmxjLT5zZl91c2VkID0gMTsKKyAgICAgICAgICBkcGNtID0gZGVjb2RlUlZMQ29kZXdvcmQoYnMsIHBSdmxjKTsKKyAgICAgICAgICBpZiAoZHBjbSA8IDApIHsKICAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21heCA9IGJuZHM7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKGRwY20gPT0gTUlOX1JWTCkgeyAKLSAgICAgICAgICAgICAgZHBjbSAtPSAqcFNjZkVzYysrOyB9Ci0gICAgICAgICAgICBlbHNlIHsgCi0gICAgICAgICAgICAgIGRwY20gKz0gKnBTY2ZFc2MrKzsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAoKnBFc2NGd2RDbnQpKys7Ci0gICAgICAgICAgICBpZiAocFJ2bGMtPmNvbmNlYWxfbWF4X2VzYyA9PSBDT05DRUFMX01BWF9JTklUKSB7Ci0gICAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21heF9lc2MgPSBibmRzOworICAgICAgICAgIGRwY20gLT0gVEFCTEVfT0ZGU0VUOworICAgICAgICAgIGlmICgoZHBjbSA9PSBNSU5fUlZMKSB8fCAoZHBjbSA9PSBNQVhfUlZMKSkgeworICAgICAgICAgICAgaWYgKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzKSB7CisgICAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21heCA9IGJuZHM7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGlmIChkcGNtID09IE1JTl9SVkwpIHsKKyAgICAgICAgICAgICAgICBkcGNtIC09ICpwU2NmRXNjKys7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHBjbSArPSAqcFNjZkVzYysrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICgqcEVzY0Z3ZENudCkrKzsKKyAgICAgICAgICAgICAgaWYgKHBSdmxjLT5jb25jZWFsX21heF9lc2MgPT0gQ09OQ0VBTF9NQVhfSU5JVCkgeworICAgICAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21heF9lc2MgPSBibmRzOworICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZhY3RvciArPSBkcGNtOwotICAgICAgICBwU2NmRndkW2JuZHNdID0gZmFjdG9yOwotICAgICAgICBwUnZsYy0+bGFzdFNjZiA9IGZhY3RvcjsKLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgZmFjdG9yICs9IGRwY207CisgICAgICAgICAgcFNjZkZ3ZFtibmRzXSA9IGZhY3RvcjsKKyAgICAgICAgICBwUnZsYy0+bGFzdFNjZiA9IGZhY3RvcjsKKyAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgIH0KIAogICAvKiBwb3N0ZmV0Y2ggZndkIGxvbmcgKi8KICAgaWYgKHBSdmxjLT5pbnRlbnNpdHlfdXNlZCkgewotICAgIGRwY20gPSBkZWNvZGVSVkxDb2Rld29yZChicywgcFJ2bGMpOyAgICAgIC8qIGRwY21faXNfbGFzdF9wb3NpdGlvbiAqLwotICAgIGlmICggZHBjbSA8IDAgKSB7CisgICAgZHBjbSA9IGRlY29kZVJWTENvZGV3b3JkKGJzLCBwUnZsYyk7IC8qIGRwY21faXNfbGFzdF9wb3NpdGlvbiAqLworICAgIGlmIChkcGNtIDwgMCkgewogICAgICAgcFJ2bGMtPmNvbmNlYWxfbWF4ID0gYm5kczsKICAgICAgIHJldHVybjsKICAgICB9CkBAIC01NzEsMTUgKzU4MywxMyBAQAogICAgICAgaWYgKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzKSB7CiAgICAgICAgIHBSdmxjLT5jb25jZWFsX21heCA9IGJuZHM7CiAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpZiAoZHBjbSA9PSBNSU5fUlZMKSB7IAotICAgICAgICAgIGRwY20gLT0gKnBTY2ZFc2MrKzsgCisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZHBjbSA9PSBNSU5fUlZMKSB7CisgICAgICAgICAgZHBjbSAtPSAqcFNjZkVzYysrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRwY20gKz0gKnBTY2ZFc2MrKzsKICAgICAgICAgfQotICAgICAgICBlbHNlIHsgCi0gICAgICAgICAgZHBjbSArPSAqcFNjZkVzYysrOyAKLSAgICAgICAgfQotICAgICAgICAoKnBFc2NGd2RDbnQpKys7ICAKKyAgICAgICAgKCpwRXNjRndkQ250KSsrOwogICAgICAgICBpZiAocFJ2bGMtPmNvbmNlYWxfbWF4X2VzYyA9PSBDT05DRUFMX01BWF9JTklUKSB7CiAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWF4X2VzYyA9IGJuZHM7CiAgICAgICAgIH0KQEAgLTU4OSw3ICs1OTksNiBAQAogICB9CiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgZnVuY3Rpb246ICAgICBydmxjRGVjb2RlQmFja3dhcmQKIApAQCAtNjAwLDIyICs2MDksMjIgQEAKICAgICAgICAgICAgICAgICAgICAtIGhhbmRsZSBGREsgYml0c3RyZWFtCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICByZXR1cm46ICAgIC0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KIAotc3RhdGljCi12b2lkIHJ2bGNEZWNvZGVCYWNrd2FyZCAoQ0VyUnZsY0luZm8gICAgICAgICAgICAqcFJ2bGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICBicykKLXsKLSAgU0hPUlQgIGJhbmQsIGdyb3VwLCBkcGNtLCBvZmZzZXQ7Ci0gIFNIT1JUICBibmRzID0gcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkLTE7CitzdGF0aWMgdm9pZCBydmxjRGVjb2RlQmFja3dhcmQoQ0VyUnZsY0luZm8gKnBSdmxjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMpIHsKKyAgU0hPUlQgYmFuZCwgZ3JvdXAsIGRwY20sIG9mZnNldDsKKyAgU0hPUlQgYm5kcyA9IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZCAtIDE7CiAKLSAgU0hPUlQgIGZhY3RvciAgICAgPSBwUnZsYy0+cmV2X2dsb2JhbF9nYWluIC0gU0ZfT0ZGU0VUOwotICBTSE9SVCAgcG9zaXRpb24gICA9IHBSdmxjLT5kcGNtX2lzX2xhc3RfcG9zaXRpb24gLSBTRl9PRkZTRVQ7Ci0gIFNIT1JUICBub2lzZW5yZyAgID0gcFJ2bGMtPnJldl9nbG9iYWxfZ2FpbiArIHBSdmxjLT5kcGNtX25vaXNlX2xhc3RfcG9zaXRpb24gLSBTRl9PRkZTRVQgLSA5MCAtIDI1NjsKKyAgU0hPUlQgZmFjdG9yID0gcFJ2bGMtPnJldl9nbG9iYWxfZ2FpbiAtIFNGX09GRlNFVDsKKyAgU0hPUlQgcG9zaXRpb24gPSBwUnZsYy0+ZHBjbV9pc19sYXN0X3Bvc2l0aW9uIC0gU0ZfT0ZGU0VUOworICBTSE9SVCBub2lzZW5yZyA9IHBSdmxjLT5yZXZfZ2xvYmFsX2dhaW4gKyBwUnZsYy0+ZHBjbV9ub2lzZV9sYXN0X3Bvc2l0aW9uIC0KKyAgICAgICAgICAgICAgICAgICBTRl9PRkZTRVQgLSA5MCAtIDI1NjsKIAotICBTSE9SVCAqcFNjZkJ3ZCAgICA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZDsKLSAgU0hPUlQgKnBTY2ZFc2MgICAgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZFc2M7CisgIFNIT1JUICpwU2NmQndkID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkOworICBTSE9SVCAqcFNjZkVzYyA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkVzYzsKICAgVUNIQVIgKnBFc2NFc2NDbnQgPSAmKHBSdmxjLT5udW1EZWNvZGVkRXNjYXBlV29yZHNFc2MpOwogICBVQ0hBUiAqcEVzY0J3ZENudCA9ICYocFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0J3ZCk7CiAKQEAgLTYyNCwxNSArNjMzLDE1IEBACiAKICAgKnBFc2NCd2RDbnQgPSAwOwogICBwUnZsYy0+ZGlyZWN0aW9uID0gQldEOwotICBwU2NmRXNjICs9ICpwRXNjRXNjQ250IC0gMTsgICAgICAgICAgICAgLyogc2V0IHBTY2ZFc2MgdG8gbGFzdCBlbnRyeSAqLworICBwU2NmRXNjICs9ICpwRXNjRXNjQ250IC0gMTsgLyogc2V0IHBTY2ZFc2MgdG8gbGFzdCBlbnRyeSAqLwogICBwUnZsYy0+Zmlyc3RTY2YgPSAwOwogICBwUnZsYy0+Zmlyc3ROcmcgPSAwOwogICBwUnZsYy0+Zmlyc3RJcyA9IDA7CiAKICAgLyogcHJlZmV0Y2ggbG9uZyBCV0QgKi8KICAgaWYgKHBSdmxjLT5pbnRlbnNpdHlfdXNlZCkgewotICAgIGRwY20gPSBkZWNvZGVSVkxDb2Rld29yZChicywgcFJ2bGMpOyAgICAgIC8qIGRwY21faXNfbGFzdF9wb3NpdGlvbiAqLwotICAgIGlmICggZHBjbSA8IDAgKSB7CisgICAgZHBjbSA9IGRlY29kZVJWTENvZGV3b3JkKGJzLCBwUnZsYyk7IC8qIGRwY21faXNfbGFzdF9wb3NpdGlvbiAqLworICAgIGlmIChkcGNtIDwgMCkgewogICAgICAgcFJ2bGMtPmRwY21faXNfbGFzdF9wb3NpdGlvbiA9IDA7CiAgICAgICBwUnZsYy0+Y29uY2VhbF9taW4gPSBibmRzOwogICAgICAgcmV0dXJuOwpAQCAtNjQyLDE1ICs2NTEsMTMgQEAKICAgICAgIGlmIChwUnZsYy0+bGVuZ3RoX29mX3J2bGNfZXNjYXBlcykgewogICAgICAgICBwUnZsYy0+Y29uY2VhbF9taW4gPSBibmRzOwogICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChkcGNtID09IE1JTl9SVkwpIHsKICAgICAgICAgICBkcGNtIC09ICpwU2NmRXNjLS07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgZHBjbSArPSAqcFNjZkVzYy0tOwogICAgICAgICB9Ci0gICAgICAgICgqcEVzY0J3ZENudCkrKzsgIAorICAgICAgICAoKnBFc2NCd2RDbnQpKys7CiAgICAgICAgIGlmIChwUnZsYy0+Y29uY2VhbF9taW5fZXNjID09IENPTkNFQUxfTUlOX0lOSVQpIHsKICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9taW5fZXNjID0gYm5kczsKICAgICAgICAgfQpAQCAtNjYwLDE3MSArNjY3LDE2MiBAQAogICB9CiAKICAgLyogbWFpbiBsb29wIGxvbmcgQldEICovCi0gIGZvciAoZ3JvdXA9cFJ2bGMtPm51bVdpbmRvd0dyb3Vwcy0xOyBncm91cCA+PSAwOyBncm91cC0tKSB7Ci0gICAgZm9yIChiYW5kPXBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZC0xOyBiYW5kID49IDA7IGJhbmQtLSkgewotICAgICAgYm5kcyA9IDE2Kmdyb3VwK2JhbmQ7CisgIGZvciAoZ3JvdXAgPSBwUnZsYy0+bnVtV2luZG93R3JvdXBzIC0gMTsgZ3JvdXAgPj0gMDsgZ3JvdXAtLSkgeworICAgIGZvciAoYmFuZCA9IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZCAtIDE7IGJhbmQgPj0gMDsgYmFuZC0tKSB7CisgICAgICBibmRzID0gMTYgKiBncm91cCArIGJhbmQ7CiAgICAgICBpZiAoKGJhbmQgPT0gMCkgJiYgKHBSdmxjLT5udW1XaW5kb3dHcm91cHMgIT0gMSkpCiAgICAgICAgIG9mZnNldCA9IDE2IC0gcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkICsgMTsKICAgICAgIGVsc2UKICAgICAgICAgb2Zmc2V0ID0gMTsKIAogICAgICAgc3dpdGNoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rW2JuZHNdKSB7CisgICAgICAgIGNhc2UgWkVST19IQ0I6CisgICAgICAgICAgcFNjZkJ3ZFtibmRzXSA9IDA7CisgICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgWkVST19IQ0IgOgotICAgICAgICBwU2NmQndkW2JuZHNdID0gMDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjIgOgotICAgICAgY2FzZSBJTlRFTlNJVFlfSENCICA6Ci0gICAgICAgIC8qIHN0b3JlIGRwY21faXNfcG9zaXRpb24gKi8KLSAgICAgICAgZHBjbSA9IGRlY29kZVJWTENvZGV3b3JkKGJzLCBwUnZsYyk7Ci0gICAgICAgIGlmICggZHBjbSA8IDAgKSB7Ci0gICAgICAgICAgcFNjZkJ3ZFtibmRzXSA9IHBvc2l0aW9uOwotICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21pbiA9IEZES21heCgwLGJuZHMtb2Zmc2V0KTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZHBjbSAtPSBUQUJMRV9PRkZTRVQ7Ci0gICAgICAgIGlmICgoZHBjbSA9PSBNSU5fUlZMKSB8fCAoZHBjbSA9PSBNQVhfUlZMKSkgewotICAgICAgICAgIGlmIChwUnZsYy0+bGVuZ3RoX29mX3J2bGNfZXNjYXBlcykgewotICAgICAgICAgICAgcFNjZkJ3ZFtibmRzXSA9IHBvc2l0aW9uOwotICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gRkRLbWF4KDAsYm5kcy1vZmZzZXQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChkcGNtID09IE1JTl9SVkwpIHsKLSAgICAgICAgICAgICAgZHBjbSAtPSAqcFNjZkVzYy0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIGRwY20gKz0gKnBTY2ZFc2MtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICgqcEVzY0J3ZENudCkrKzsKLSAgICAgICAgICAgIGlmIChwUnZsYy0+Y29uY2VhbF9taW5fZXNjID09IENPTkNFQUxfTUlOX0lOSVQpIHsKLSAgICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluX2VzYyA9IEZES21heCgwLGJuZHMtb2Zmc2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcFNjZkJ3ZFtibmRzXSA9IHBvc2l0aW9uOwotICAgICAgICBwb3NpdGlvbiAtPSBkcGNtOyAgCi0gICAgICAgIHBSdmxjLT5maXJzdElzID0gcG9zaXRpb247IAotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBOT0lTRV9IQ0IgOgotICAgICAgICBpZiAoIGJuZHMgPT0gcFJ2bGMtPmZpcnN0X25vaXNlX2JhbmQgKSB7Ci0gICAgICAgICAgcFNjZkJ3ZFtibmRzXSA9IHBSdmxjLT5kcGNtX25vaXNlX25yZyArIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluIC0gU0ZfT0ZGU0VUIC0gOTAgLSAyNTY7ICAgICAgICAgCi0gICAgICAgICAgcFJ2bGMtPmZpcnN0TnJnID0gcFNjZkJ3ZFtibmRzXTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKKyAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCMjoKKyAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCOgorICAgICAgICAgIC8qIHN0b3JlIGRwY21faXNfcG9zaXRpb24gKi8KICAgICAgICAgICBkcGNtID0gZGVjb2RlUlZMQ29kZXdvcmQoYnMsIHBSdmxjKTsKLSAgICAgICAgICBpZiAoIGRwY20gPCAwICkgewotICAgICAgICAgICAgcFNjZkJ3ZFtibmRzXSA9IG5vaXNlbnJnOwotICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gRkRLbWF4KDAsYm5kcy1vZmZzZXQpOworICAgICAgICAgIGlmIChkcGNtIDwgMCkgeworICAgICAgICAgICAgcFNjZkJ3ZFtibmRzXSA9IHBvc2l0aW9uOworICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gZk1heCgwLCBibmRzIC0gb2Zmc2V0KTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICB9CiAgICAgICAgICAgZHBjbSAtPSBUQUJMRV9PRkZTRVQ7CiAgICAgICAgICAgaWYgKChkcGNtID09IE1JTl9SVkwpIHx8IChkcGNtID09IE1BWF9SVkwpKSB7CiAgICAgICAgICAgICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMpIHsKLSAgICAgICAgICAgICAgcFNjZkJ3ZFtibmRzXSA9IG5vaXNlbnJnOwotICAgICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9taW4gPSBGREttYXgoMCxibmRzLW9mZnNldCk7CisgICAgICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPSBwb3NpdGlvbjsKKyAgICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gZk1heCgwLCBibmRzIC0gb2Zmc2V0KTsKICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBpZiAoZHBjbSA9PSBNSU5fUlZMKSB7CiAgICAgICAgICAgICAgICAgZHBjbSAtPSAqcFNjZkVzYy0tOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGRwY20gKz0gKnBTY2ZFc2MtLTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAoKnBFc2NCd2RDbnQpKys7CiAgICAgICAgICAgICAgIGlmIChwUnZsYy0+Y29uY2VhbF9taW5fZXNjID09IENPTkNFQUxfTUlOX0lOSVQpIHsKLSAgICAgICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9taW5fZXNjID0gRkRLbWF4KDAsYm5kcy1vZmZzZXQpOworICAgICAgICAgICAgICAgIHBSdmxjLT5jb25jZWFsX21pbl9lc2MgPSBmTWF4KDAsIGJuZHMgLSBvZmZzZXQpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPSBub2lzZW5yZzsKLSAgICAgICAgICBub2lzZW5yZyAtPSBkcGNtOwotICAgICAgICAgIHBSdmxjLT5maXJzdE5yZyA9IG5vaXNlbnJnOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrIDsKKyAgICAgICAgICBwU2NmQndkW2JuZHNdID0gcG9zaXRpb247CisgICAgICAgICAgcG9zaXRpb24gLT0gZHBjbTsKKyAgICAgICAgICBwUnZsYy0+Zmlyc3RJcyA9IHBvc2l0aW9uOworICAgICAgICAgIGJyZWFrOwogCi0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgZHBjbSA9IGRlY29kZVJWTENvZGV3b3JkKGJzLCBwUnZsYyk7Ci0gICAgICAgIGlmICggZHBjbSA8IDAgKSB7Ci0gICAgICAgICAgcFNjZkJ3ZFtibmRzXSA9IGZhY3RvcjsKLSAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9taW4gPSBGREttYXgoMCxibmRzLW9mZnNldCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGRwY20gLT0gVEFCTEVfT0ZGU0VUOwotICAgICAgICBpZiAoKGRwY20gPT0gTUlOX1JWTCkgfHwgKGRwY20gPT0gTUFYX1JWTCkpIHsKLSAgICAgICAgICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMpIHsKKyAgICAgICAgY2FzZSBOT0lTRV9IQ0I6CisgICAgICAgICAgaWYgKGJuZHMgPT0gcFJ2bGMtPmZpcnN0X25vaXNlX2JhbmQpIHsKKyAgICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPQorICAgICAgICAgICAgICAgIHBSdmxjLT5kcGNtX25vaXNlX25yZyArCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkdsb2JhbEdhaW4gLQorICAgICAgICAgICAgICAgIFNGX09GRlNFVCAtIDkwIC0gMjU2OworICAgICAgICAgICAgcFJ2bGMtPmZpcnN0TnJnID0gcFNjZkJ3ZFtibmRzXTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHBjbSA9IGRlY29kZVJWTENvZGV3b3JkKGJzLCBwUnZsYyk7CisgICAgICAgICAgICBpZiAoZHBjbSA8IDApIHsKKyAgICAgICAgICAgICAgcFNjZkJ3ZFtibmRzXSA9IG5vaXNlbnJnOworICAgICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9taW4gPSBmTWF4KDAsIGJuZHMgLSBvZmZzZXQpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkcGNtIC09IFRBQkxFX09GRlNFVDsKKyAgICAgICAgICAgIGlmICgoZHBjbSA9PSBNSU5fUlZMKSB8fCAoZHBjbSA9PSBNQVhfUlZMKSkgeworICAgICAgICAgICAgICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMpIHsKKyAgICAgICAgICAgICAgICBwU2NmQndkW2JuZHNdID0gbm9pc2Vucmc7CisgICAgICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gZk1heCgwLCBibmRzIC0gb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGRwY20gPT0gTUlOX1JWTCkgeworICAgICAgICAgICAgICAgICAgZHBjbSAtPSAqcFNjZkVzYy0tOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBkcGNtICs9ICpwU2NmRXNjLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICgqcEVzY0J3ZENudCkrKzsKKyAgICAgICAgICAgICAgICBpZiAocFJ2bGMtPmNvbmNlYWxfbWluX2VzYyA9PSBDT05DRUFMX01JTl9JTklUKSB7CisgICAgICAgICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9taW5fZXNjID0gZk1heCgwLCBibmRzIC0gb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPSBub2lzZW5yZzsKKyAgICAgICAgICAgIG5vaXNlbnJnIC09IGRwY207CisgICAgICAgICAgICBwUnZsYy0+Zmlyc3ROcmcgPSBub2lzZW5yZzsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBkcGNtID0gZGVjb2RlUlZMQ29kZXdvcmQoYnMsIHBSdmxjKTsKKyAgICAgICAgICBpZiAoZHBjbSA8IDApIHsKICAgICAgICAgICAgIHBTY2ZCd2RbYm5kc10gPSBmYWN0b3I7Ci0gICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9taW4gPSBGREttYXgoMCxibmRzLW9mZnNldCk7CisgICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9taW4gPSBmTWF4KDAsIGJuZHMgLSBvZmZzZXQpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChkcGNtID09IE1JTl9SVkwpIHsKLSAgICAgICAgICAgICAgZHBjbSAtPSAqcFNjZkVzYy0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIGRwY20gKz0gKnBTY2ZFc2MtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICgqcEVzY0J3ZENudCkrKzsKLSAgICAgICAgICAgIGlmIChwUnZsYy0+Y29uY2VhbF9taW5fZXNjID09IENPTkNFQUxfTUlOX0lOSVQpIHsKLSAgICAgICAgICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluX2VzYyA9IEZES21heCgwLGJuZHMtb2Zmc2V0KTsKKyAgICAgICAgICBkcGNtIC09IFRBQkxFX09GRlNFVDsKKyAgICAgICAgICBpZiAoKGRwY20gPT0gTUlOX1JWTCkgfHwgKGRwY20gPT0gTUFYX1JWTCkpIHsKKyAgICAgICAgICAgIGlmIChwUnZsYy0+bGVuZ3RoX29mX3J2bGNfZXNjYXBlcykgeworICAgICAgICAgICAgICBwU2NmQndkW2JuZHNdID0gZmFjdG9yOworICAgICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9taW4gPSBmTWF4KDAsIGJuZHMgLSBvZmZzZXQpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAoZHBjbSA9PSBNSU5fUlZMKSB7CisgICAgICAgICAgICAgICAgZHBjbSAtPSAqcFNjZkVzYy0tOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRwY20gKz0gKnBTY2ZFc2MtLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAoKnBFc2NCd2RDbnQpKys7CisgICAgICAgICAgICAgIGlmIChwUnZsYy0+Y29uY2VhbF9taW5fZXNjID09IENPTkNFQUxfTUlOX0lOSVQpIHsKKyAgICAgICAgICAgICAgICBwUnZsYy0+Y29uY2VhbF9taW5fZXNjID0gZk1heCgwLCBibmRzIC0gb2Zmc2V0KTsKKyAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwU2NmQndkW2JuZHNdID0gZmFjdG9yOwotICAgICAgICBmYWN0b3IgLT0gZHBjbTsKLSAgICAgICAgcFJ2bGMtPmZpcnN0U2NmID0gZmFjdG9yOwotICAgICAgICBicmVhazsKKyAgICAgICAgICBwU2NmQndkW2JuZHNdID0gZmFjdG9yOworICAgICAgICAgIGZhY3RvciAtPSBkcGNtOworICAgICAgICAgIHBSdmxjLT5maXJzdFNjZiA9IGZhY3RvcjsKKyAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgIH0KIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBmdW5jdGlvbjogICAgIHJ2bGNGaW5hbEVycm9yRGV0ZWN0aW9uICAgICAgICAgICAgIAorICAgICBmdW5jdGlvbjogICAgIHJ2bGNGaW5hbEVycm9yRGV0ZWN0aW9uCiAKLSAgICAgZGVzY3JpcHRpb246ICBDYWxsIFJWTEMgY29uY2VhbG1lbnQgaWYgZXJyb3Igd2FzIGRldGVjdGVkIGluIGRlY29kaW5nIHByb2Nlc3MKKyAgICAgZGVzY3JpcHRpb246ICBDYWxsIFJWTEMgY29uY2VhbG1lbnQgaWYgZXJyb3Igd2FzIGRldGVjdGVkIGluIGRlY29kaW5nCitwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICBpbnB1dDogICAgIC0gcG9pbnRlciBydmxjIHN0cnVjdHVyZQogICAgICAgICAgICAgICAgICAgIC0gcG9pbnRlciBjaGFubmVsIGluZm8gc3RydWN0dXJlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICByZXR1cm46ICAgIC0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KIAotc3RhdGljCi12b2lkIHJ2bGNGaW5hbEVycm9yRGV0ZWN0aW9uIChDQWFjRGVjb2RlckNoYW5uZWxJbmZvICAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8pCi17Ci0gIENFclJ2bGNJbmZvICpwUnZsYyA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuZXJSdmxjSW5mbzsKLSAgVUNIQVIgRXJyb3JTdGF0dXNDb21wbGV0ZSAgICAgICA9IDA7Ci0gIFVDSEFSIEVycm9yU3RhdHVzTGVuZ3RoRndkICAgICAgPSAwOwotICBVQ0hBUiBFcnJvclN0YXR1c0xlbmd0aEJ3ZCAgICAgID0gMDsKLSAgVUNIQVIgRXJyb3JTdGF0dXNMZW5ndGhFc2NhcGVzICA9IDA7Ci0gIFVDSEFSIEVycm9yU3RhdHVzRmlyc3RTY2YgICAgICAgPSAwOwotICBVQ0hBUiBFcnJvclN0YXR1c0xhc3RTY2YgICAgICAgID0gMDsKLSAgVUNIQVIgRXJyb3JTdGF0dXNGaXJzdE5yZyAgICAgICA9IDA7Ci0gIFVDSEFSIEVycm9yU3RhdHVzTGFzdE5yZyAgICAgICAgPSAwOwotICBVQ0hBUiBFcnJvclN0YXR1c0ZpcnN0SXMgICAgICAgID0gMDsKLSAgVUNIQVIgRXJyb3JTdGF0dXNMYXN0SXMgICAgICAgICA9IDA7CitzdGF0aWMgdm9pZCBydmxjRmluYWxFcnJvckRldGVjdGlvbigKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8pIHsKKyAgQ0VyUnZsY0luZm8gKnBSdmxjID0KKyAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuZXJSdmxjSW5mbzsKKyAgVUNIQVIgRXJyb3JTdGF0dXNDb21wbGV0ZSA9IDA7CisgIFVDSEFSIEVycm9yU3RhdHVzTGVuZ3RoRndkID0gMDsKKyAgVUNIQVIgRXJyb3JTdGF0dXNMZW5ndGhCd2QgPSAwOworICBVQ0hBUiBFcnJvclN0YXR1c0xlbmd0aEVzY2FwZXMgPSAwOworICBVQ0hBUiBFcnJvclN0YXR1c0ZpcnN0U2NmID0gMDsKKyAgVUNIQVIgRXJyb3JTdGF0dXNMYXN0U2NmID0gMDsKKyAgVUNIQVIgRXJyb3JTdGF0dXNGaXJzdE5yZyA9IDA7CisgIFVDSEFSIEVycm9yU3RhdHVzTGFzdE5yZyA9IDA7CisgIFVDSEFSIEVycm9yU3RhdHVzRmlyc3RJcyA9IDA7CisgIFVDSEFSIEVycm9yU3RhdHVzTGFzdElzID0gMDsKICAgVUNIQVIgRXJyb3JTdGF0dXNGb3JiaWRkZW5Dd0Z3ZCA9IDA7CiAgIFVDSEFSIEVycm9yU3RhdHVzRm9yYmlkZGVuQ3dCd2QgPSAwOwotICBVQ0hBUiBFcnJvclN0YXR1c051bUVzY2FwZXNGd2QgID0gMDsKLSAgVUNIQVIgRXJyb3JTdGF0dXNOdW1Fc2NhcGVzQndkICA9IDA7Ci0gIFVDSEFSIENvbmNlYWxTdGF0dXMgICAgICAgICAgICAgPSAxOwotICBVQ0hBUiBjdXJyZW50QmxvY2tUeXBlOyAgLyogc2hvcnQ6IDAsIG5vdCBzaG9ydDogMSovCi0KLSNpZiBWRVJCT1NFX1JWTENfT1VUUFVUCi0gIENIQVIgIFN0cmF0ZWd5WzYwXT0iTm8iOwotICBTSE9SVCBjb25jZWFsX21heDsKLSAgU0hPUlQgY29uY2VhbF9taW47Ci0jZW5kaWYKKyAgVUNIQVIgRXJyb3JTdGF0dXNOdW1Fc2NhcGVzRndkID0gMDsKKyAgVUNIQVIgRXJyb3JTdGF0dXNOdW1Fc2NhcGVzQndkID0gMDsKKyAgVUNIQVIgQ29uY2VhbFN0YXR1cyA9IDE7CisgIFVDSEFSIGN1cnJlbnRCbG9ja1R5cGU7IC8qIHNob3J0OiAwLCBub3Qgc2hvcnQ6IDEqLwogCiAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5ydmxjQ3VycmVudFNjYWxlRmFjdG9yT0sgPSAxOwogCi0gIC8qIGludmFsaWQgZXNjYXBlIHdvcmRzLCBiaXQgY291bnRlciB1bmVxdWFsIHplcm8sIGZvcmJpZGRlbiBjb2Rld29yZCBkZXRlY3RlZCAqLworICAvKiBpbnZhbGlkIGVzY2FwZSB3b3JkcywgYml0IGNvdW50ZXIgdW5lcXVhbCB6ZXJvLCBmb3JiaWRkZW4gY29kZXdvcmQgZGV0ZWN0ZWQKKyAgICovCiAgIGlmIChwUnZsYy0+ZXJyb3JMb2dSdmxjICYgUlZMQ19FUlJPUl9GT1JCSURERU5fQ1dfREVURUNURURfRldEKQogICAgIEVycm9yU3RhdHVzRm9yYmlkZGVuQ3dGd2QgPSAxOwogCkBAIC04MzIsMTAwICs4MzAsMTAyIEBACiAgICAgRXJyb3JTdGF0dXNGb3JiaWRkZW5Dd0J3ZCA9IDE7CiAKICAgLyogYml0IGNvdW50ZXIgZm9yd2FyZCB1bmVxdWFsIHplcm8gKi8KLSAgaWYgKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19zZl9md2QpCi0gICAgRXJyb3JTdGF0dXNMZW5ndGhGd2QgPSAxOworICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX3NmX2Z3ZCkgRXJyb3JTdGF0dXNMZW5ndGhGd2QgPSAxOwogCiAgIC8qIGJpdCBjb3VudGVyIGJhY2t3YXJkIHVuZXF1YWwgemVybyAqLwotICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX3NmX2J3ZCkKLSAgICBFcnJvclN0YXR1c0xlbmd0aEJ3ZCA9IDE7CisgIGlmIChwUnZsYy0+bGVuZ3RoX29mX3J2bGNfc2ZfYndkKSBFcnJvclN0YXR1c0xlbmd0aEJ3ZCA9IDE7CiAKICAgLyogYml0IGNvdW50ZXIgZXNjYXBlIHNlcXVlbmNlcyB1bmVxdWFsIHplcm8gKi8KICAgaWYgKHBSdmxjLT5zZl9lc2NhcGVzX3ByZXNlbnQpCi0gICAgaWYgKHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzKQotICAgICAgRXJyb3JTdGF0dXNMZW5ndGhFc2NhcGVzID0gMTsKKyAgICBpZiAocFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMpIEVycm9yU3RhdHVzTGVuZ3RoRXNjYXBlcyA9IDE7CiAKICAgaWYgKHBSdmxjLT5zZl91c2VkKSB7CiAgICAgLyogZmlyc3QgZGVjb2RlZCBzY2YgZG9lcyBub3QgbWF0Y2ggdG8gZ2xvYmFsIGdhaW4gaW4gYmFja3dhcmQgZGlyZWN0aW9uICovCi0gICAgaWYgKHBSdmxjLT5maXJzdFNjZiAhPSAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkdsb2JhbEdhaW4gLSBTRl9PRkZTRVQpICkgCisgICAgaWYgKHBSdmxjLT5maXJzdFNjZiAhPQorICAgICAgICAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkdsb2JhbEdhaW4gLSBTRl9PRkZTRVQpKQogICAgICAgRXJyb3JTdGF0dXNGaXJzdFNjZiA9IDE7CiAKLSAgICAvKiBsYXN0IGRlY29kZWQgc2NmIGRvZXMgbm90IG1hdGNoIHRvIHJldiBnbG9iYWwgZ2FpbiBpbiBmb3J3YXJkIGRpcmVjdGlvbiAqLwotICAgIGlmIChwUnZsYy0+bGFzdFNjZiAhPSAocFJ2bGMtPnJldl9nbG9iYWxfZ2FpbiAtIFNGX09GRlNFVCkgKSAKKyAgICAvKiBsYXN0IGRlY29kZWQgc2NmIGRvZXMgbm90IG1hdGNoIHRvIHJldiBnbG9iYWwgZ2FpbiBpbiBmb3J3YXJkIGRpcmVjdGlvbgorICAgICAqLworICAgIGlmIChwUnZsYy0+bGFzdFNjZiAhPSAocFJ2bGMtPnJldl9nbG9iYWxfZ2FpbiAtIFNGX09GRlNFVCkpCiAgICAgICBFcnJvclN0YXR1c0xhc3RTY2YgPSAxOwogICB9CiAKICAgaWYgKHBSdmxjLT5ub2lzZV91c2VkKSB7Ci0gICAgLyogZmlyc3QgZGVjb2RlZCBucmcgZG9lcyBub3QgbWF0Y2ggdG8gZHBjbV9ub2lzZV9ucmcgaW4gYmFja3dhcmQgZGlyZWN0aW9uICovCi0gICAgaWYgKHBSdmxjLT5maXJzdE5yZyAhPSAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkdsb2JhbEdhaW4gKyBwUnZsYy0+ZHBjbV9ub2lzZV9ucmcgLSBTRl9PRkZTRVQgLTkwIC0gMjU2KSApIAorICAgIC8qIGZpcnN0IGRlY29kZWQgbnJnIGRvZXMgbm90IG1hdGNoIHRvIGRwY21fbm9pc2VfbnJnIGluIGJhY2t3YXJkIGRpcmVjdGlvbgorICAgICAqLworICAgIGlmIChwUnZsYy0+Zmlyc3ROcmcgIT0KKyAgICAgICAgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluICsKKyAgICAgICAgIHBSdmxjLT5kcGNtX25vaXNlX25yZyAtIFNGX09GRlNFVCAtIDkwIC0gMjU2KSkKICAgICAgIEVycm9yU3RhdHVzRmlyc3ROcmcgPSAxOwogCi0gICAgLyogbGFzdCBkZWNvZGVkIG5yZyBkb2VzIG5vdCBtYXRjaCB0byBkcGNtX25vaXNlX2xhc3RfcG9zaXRpb24gaW4gZm9yd2FyZCBkaXJlY3Rpb24gKi8KLSAgICBpZiAocFJ2bGMtPmxhc3ROcmcgIT0gKHBSdmxjLT5yZXZfZ2xvYmFsX2dhaW4gKyBwUnZsYy0+ZHBjbV9ub2lzZV9sYXN0X3Bvc2l0aW9uIC0gU0ZfT0ZGU0VUIC0gOTAgLSAyNTYpICkgCisgICAgLyogbGFzdCBkZWNvZGVkIG5yZyBkb2VzIG5vdCBtYXRjaCB0byBkcGNtX25vaXNlX2xhc3RfcG9zaXRpb24gaW4gZm9yd2FyZAorICAgICAqIGRpcmVjdGlvbiAqLworICAgIGlmIChwUnZsYy0+bGFzdE5yZyAhPQorICAgICAgICAocFJ2bGMtPnJldl9nbG9iYWxfZ2FpbiArIHBSdmxjLT5kcGNtX25vaXNlX2xhc3RfcG9zaXRpb24gLSBTRl9PRkZTRVQgLQorICAgICAgICAgOTAgLSAyNTYpKQogICAgICAgRXJyb3JTdGF0dXNMYXN0TnJnID0gMTsKICAgfQogCiAgIGlmIChwUnZsYy0+aW50ZW5zaXR5X3VzZWQpIHsKICAgICAvKiBmaXJzdCBkZWNvZGVkIGlzIHBvc2l0aW9uIGRvZXMgbm90IG1hdGNoIGluIGJhY2t3YXJkIGRpcmVjdGlvbiAqLwotICAgIGlmIChwUnZsYy0+Zmlyc3RJcyAhPSAoLVNGX09GRlNFVCkgKSAKLSAgICAgIEVycm9yU3RhdHVzRmlyc3RJcyA9IDE7CisgICAgaWYgKHBSdmxjLT5maXJzdElzICE9ICgtU0ZfT0ZGU0VUKSkgRXJyb3JTdGF0dXNGaXJzdElzID0gMTsKIAogICAgIC8qIGxhc3QgZGVjb2RlZCBpcyBwb3NpdGlvbiBkb2VzIG5vdCBtYXRjaCBpbiBmb3J3YXJkIGRpcmVjdGlvbiAqLwotICAgIGlmIChwUnZsYy0+bGFzdElzICE9IChwUnZsYy0+ZHBjbV9pc19sYXN0X3Bvc2l0aW9uIC0gU0ZfT0ZGU0VUKSApIAorICAgIGlmIChwUnZsYy0+bGFzdElzICE9IChwUnZsYy0+ZHBjbV9pc19sYXN0X3Bvc2l0aW9uIC0gU0ZfT0ZGU0VUKSkKICAgICAgIEVycm9yU3RhdHVzTGFzdElzID0gMTsKICAgfQogCiAgIC8qIGRlY29kZWQgZXNjYXBlcyBhbmQgdXNlZCBlc2NhcGVzIGluIGZvcndhcmQgZGlyZWN0aW9uIGRvIG5vdCBmaXQgKi8KLSAgaWYgKChwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzRndkICE9IHBSdmxjLT5udW1EZWNvZGVkRXNjYXBlV29yZHNFc2MpICYmIChwUnZsYy0+Y29uY2VhbF9tYXggPT0gQ09OQ0VBTF9NQVhfSU5JVCkpIHsKKyAgaWYgKChwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzRndkICE9IHBSdmxjLT5udW1EZWNvZGVkRXNjYXBlV29yZHNFc2MpICYmCisgICAgICAocFJ2bGMtPmNvbmNlYWxfbWF4ID09IENPTkNFQUxfTUFYX0lOSVQpKSB7CiAgICAgRXJyb3JTdGF0dXNOdW1Fc2NhcGVzRndkID0gMTsKICAgfQogCiAgIC8qIGRlY29kZWQgZXNjYXBlcyBhbmQgdXNlZCBlc2NhcGVzIGluIGJhY2t3YXJkIGRpcmVjdGlvbiBkbyBub3QgZml0ICovCi0gIGlmICgocFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0J3ZCAhPSBwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzRXNjKSAmJiAocFJ2bGMtPmNvbmNlYWxfbWluID09IENPTkNFQUxfTUlOX0lOSVQpKSB7CisgIGlmICgocFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0J3ZCAhPSBwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzRXNjKSAmJgorICAgICAgKHBSdmxjLT5jb25jZWFsX21pbiA9PSBDT05DRUFMX01JTl9JTklUKSkgewogICAgIEVycm9yU3RhdHVzTnVtRXNjYXBlc0J3ZCA9IDE7CiAgIH0KIAotI2lmIFZFUkJPU0VfUlZMQ19PVVRQVVQKLSAgY29uY2VhbF9tYXggPSBwUnZsYy0+Y29uY2VhbF9tYXg7Ci0gIGNvbmNlYWxfbWluID0gcFJ2bGMtPmNvbmNlYWxfbWluOwotI2VuZGlmCisgIGlmIChFcnJvclN0YXR1c0xlbmd0aEVzY2FwZXMgfHwKKyAgICAgICgoKHBSdmxjLT5jb25jZWFsX21heCA9PSBDT05DRUFMX01BWF9JTklUKSAmJgorICAgICAgICAocFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0Z3ZCAhPSBwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzRXNjKSAmJgorICAgICAgICAoRXJyb3JTdGF0dXNMYXN0U2NmIHx8IEVycm9yU3RhdHVzTGFzdE5yZyB8fCBFcnJvclN0YXR1c0xhc3RJcykpCiAKLSAgaWYgKCAgICBFcnJvclN0YXR1c0xlbmd0aEVzY2FwZXMKLSAgICAgIHx8ICggCi0gICAgICAgICAgICggICAocFJ2bGMtPmNvbmNlYWxfbWF4ID09IENPTkNFQUxfTUFYX0lOSVQpIAotICAgICAgICAgICAgJiYgKHBSdmxjLT5udW1EZWNvZGVkRXNjYXBlV29yZHNGd2QgIT0gcFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0VzYykKLSAgICAgICAgICAgICYmIChFcnJvclN0YXR1c0xhc3RTY2YgfHwgRXJyb3JTdGF0dXNMYXN0TnJnIHx8IEVycm9yU3RhdHVzTGFzdElzKSApCi0gICAgICAgICAgIAotICAgICAgICAgICAgJiYgCisgICAgICAgJiYKIAotICAgICAgICAgICAoICAgKHBSdmxjLT5jb25jZWFsX21pbiA9PSBDT05DRUFMX01JTl9JTklUKSAKLSAgICAgICAgICAgICYmIChwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzQndkICE9IHBSdmxjLT5udW1EZWNvZGVkRXNjYXBlV29yZHNFc2MpCi0gICAgICAgICAgICAmJiAoRXJyb3JTdGF0dXNGaXJzdFNjZiB8fCBFcnJvclN0YXR1c0ZpcnN0TnJnIHx8IEVycm9yU3RhdHVzRmlyc3RJcykgKSAKLSAgICAgICAgICkgICAgCi0gICAgICB8fCAoICAgKHBSdmxjLT5jb25jZWFsX21heCA9PSBDT05DRUFMX01BWF9JTklUKSAKLSAgICAgICAgICAmJiAoKHBSdmxjLT5yZXZfZ2xvYmFsX2dhaW4gLSBTRl9PRkZTRVQgLSBwUnZsYy0+bGFzdFNjZikgPCAtMTUpCi0gICAgICAgICApCi0gICAgICB8fCAoICAgKHBSdmxjLT5jb25jZWFsX21pbiA9PSBDT05DRUFMX01JTl9JTklUKSAKLSAgICAgICAgICAmJiAoKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluIC0gU0ZfT0ZGU0VUIC0gcFJ2bGMtPmZpcnN0U2NmKSA8IC0xNSkKLSAgICAgICAgICkKLSAgICAgKSB7Ci0gICAgaWYgKChwUnZsYy0+Y29uY2VhbF9tYXggPT0gQ09OQ0VBTF9NQVhfSU5JVCkgfHwgKHBSdmxjLT5jb25jZWFsX21pbiA9PSBDT05DRUFMX01JTl9JTklUKSkgewotICAgICAgcFJ2bGMtPmNvbmNlYWxfbWF4ID0gMDsgCi0gICAgICBwUnZsYy0+Y29uY2VhbF9taW4gPSBGREttYXgoMCwgKHBSdmxjLT5udW1XaW5kb3dHcm91cHMtMSkqMTYrcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkLTEpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHBSdmxjLT5jb25jZWFsX21heCA9IEZES21pbihwUnZsYy0+Y29uY2VhbF9tYXgscFJ2bGMtPmNvbmNlYWxfbWF4X2VzYyk7IAotICAgICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gRkRLbWF4KHBSdmxjLT5jb25jZWFsX21pbixwUnZsYy0+Y29uY2VhbF9taW5fZXNjKTsKKyAgICAgICAoKHBSdmxjLT5jb25jZWFsX21pbiA9PSBDT05DRUFMX01JTl9JTklUKSAmJgorICAgICAgICAocFJ2bGMtPm51bURlY29kZWRFc2NhcGVXb3Jkc0J3ZCAhPSBwUnZsYy0+bnVtRGVjb2RlZEVzY2FwZVdvcmRzRXNjKSAmJgorICAgICAgICAoRXJyb3JTdGF0dXNGaXJzdFNjZiB8fCBFcnJvclN0YXR1c0ZpcnN0TnJnIHx8IEVycm9yU3RhdHVzRmlyc3RJcykpKSB8fAorICAgICAgKChwUnZsYy0+Y29uY2VhbF9tYXggPT0gQ09OQ0VBTF9NQVhfSU5JVCkgJiYKKyAgICAgICAoKHBSdmxjLT5yZXZfZ2xvYmFsX2dhaW4gLSBTRl9PRkZTRVQgLSBwUnZsYy0+bGFzdFNjZikgPCAtMTUpKSB8fAorICAgICAgKChwUnZsYy0+Y29uY2VhbF9taW4gPT0gQ09OQ0VBTF9NSU5fSU5JVCkgJiYKKyAgICAgICAoKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluIC0gU0ZfT0ZGU0VUIC0KKyAgICAgICAgIHBSdmxjLT5maXJzdFNjZikgPCAtMTUpKSkgeworICAgIGlmICgocFJ2bGMtPmNvbmNlYWxfbWF4ID09IENPTkNFQUxfTUFYX0lOSVQpIHx8CisgICAgICAgIChwUnZsYy0+Y29uY2VhbF9taW4gPT0gQ09OQ0VBTF9NSU5fSU5JVCkpIHsKKyAgICAgIHBSdmxjLT5jb25jZWFsX21heCA9IDA7CisgICAgICBwUnZsYy0+Y29uY2VhbF9taW4gPSBmTWF4KAorICAgICAgICAgIDAsIChwUnZsYy0+bnVtV2luZG93R3JvdXBzIC0gMSkgKiAxNiArIHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZCAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICBwUnZsYy0+Y29uY2VhbF9tYXggPSBmTWluKHBSdmxjLT5jb25jZWFsX21heCwgcFJ2bGMtPmNvbmNlYWxfbWF4X2VzYyk7CisgICAgICBwUnZsYy0+Y29uY2VhbF9taW4gPSBmTWF4KHBSdmxjLT5jb25jZWFsX21pbiwgcFJ2bGMtPmNvbmNlYWxfbWluX2VzYyk7CiAgICAgfQogICB9CiAKLSAgRXJyb3JTdGF0dXNDb21wbGV0ZSA9ICAgIEVycm9yU3RhdHVzTGFzdFNjZiB8fCBFcnJvclN0YXR1c0ZpcnN0U2NmIHx8IEVycm9yU3RhdHVzTGFzdE5yZyB8fCBFcnJvclN0YXR1c0ZpcnN0TnJnCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBFcnJvclN0YXR1c0xhc3RJcyB8fCBFcnJvclN0YXR1c0ZpcnN0SXMgfHwgRXJyb3JTdGF0dXNGb3JiaWRkZW5Dd0Z3ZCB8fCBFcnJvclN0YXR1c0ZvcmJpZGRlbkN3QndkIAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgRXJyb3JTdGF0dXNMZW5ndGhGd2QgfHwgRXJyb3JTdGF0dXNMZW5ndGhCd2QgfHwgRXJyb3JTdGF0dXNMZW5ndGhFc2NhcGVzIHx8IEVycm9yU3RhdHVzTnVtRXNjYXBlc0Z3ZCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVycm9yU3RhdHVzTnVtRXNjYXBlc0J3ZDsKKyAgRXJyb3JTdGF0dXNDb21wbGV0ZSA9IEVycm9yU3RhdHVzTGFzdFNjZiB8fCBFcnJvclN0YXR1c0ZpcnN0U2NmIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvclN0YXR1c0xhc3ROcmcgfHwgRXJyb3JTdGF0dXNGaXJzdE5yZyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JTdGF0dXNMYXN0SXMgfHwgRXJyb3JTdGF0dXNGaXJzdElzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvclN0YXR1c0ZvcmJpZGRlbkN3RndkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvclN0YXR1c0ZvcmJpZGRlbkN3QndkIHx8IEVycm9yU3RhdHVzTGVuZ3RoRndkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvclN0YXR1c0xlbmd0aEJ3ZCB8fCBFcnJvclN0YXR1c0xlbmd0aEVzY2FwZXMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yU3RhdHVzTnVtRXNjYXBlc0Z3ZCB8fCBFcnJvclN0YXR1c051bUVzY2FwZXNCd2Q7CiAKLSAgY3VycmVudEJsb2NrVHlwZSA9IChHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykgPT0gRWlnaHRTaG9ydFNlcXVlbmNlKSA/IDAgOiAxOworICBjdXJyZW50QmxvY2tUeXBlID0KKyAgICAgIChHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykgPT0gQkxPQ0tfU0hPUlQpID8gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxOwogCi0gICAKICAgaWYgKCFFcnJvclN0YXR1c0NvbXBsZXRlKSB7CiAgICAgaW50IGJhbmQ7CiAgICAgaW50IGdyb3VwOwpAQCAtOTM0LDExMSArOTM0LDExNSBAQAogCiAgICAgbGFzdFNmYkluZGV4ID0gKHBSdmxjLT5udW1XaW5kb3dHcm91cHMgPiAxKSA/IDE2IDogNjQ7CiAKLSAgICBmb3IgKGdyb3VwPTA7IGdyb3VwIDwgcFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgewotICAgICAgZm9yIChiYW5kPTA7IGJhbmQ8cFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKLSAgICAgICAgYm5kcyA9IDE2Kmdyb3VwK2JhbmQ7Ci0gICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yW2JuZHNdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOworICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IHBSdmxjLT5udW1XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKKyAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgICBibmRzID0gMTYgKiBncm91cCArIGJhbmQ7CisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPQorICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNTY2FsZUZhY3RvcltibmRzXSA9CisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOwogICAgICAgfQogICAgIH0KIAotICAgIGZvciAoZ3JvdXA9MDsgZ3JvdXAgPCBwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKQotICAgIHsKLSAgICAgIGZvciAoYmFuZD0wOyBiYW5kPHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgYmFuZCsrKSB7Ci0gICAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOwotICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9va1tibmRzXTsKKyAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKSB7CisgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKKyAgICAgICAgYm5kcyA9IDE2ICogZ3JvdXAgKyBiYW5kOworICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8KKyAgICAgICAgICAgIC5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10gPQorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9va1tibmRzXTsKICAgICAgIH0KLSAgICAgIGZvciAoOyBiYW5kIDxsYXN0U2ZiSW5kZXg7IGJhbmQrKykgewotICAgICAgICBibmRzID0gMTYqZ3JvdXArYmFuZDsKKyAgICAgIGZvciAoOyBiYW5kIDwgbGFzdFNmYkluZGV4OyBiYW5kKyspIHsKKyAgICAgICAgYm5kcyA9IDE2ICogZ3JvdXAgKyBiYW5kOwogICAgICAgICBGREtfQVNTRVJUKGJuZHMgPj0gMCAmJiBibmRzIDwgUlZMQ19NQVhfU0ZCKTsKLSAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSA9IFpFUk9fSENCOworICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8KKyAgICAgICAgICAgIC5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10gPSBaRVJPX0hDQjsKICAgICAgIH0KICAgICB9Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgaW50IGJhbmQ7CiAgICAgaW50IGdyb3VwOwogCi0gICAgLyogQSBzaW5nbGUgYml0IGVycm9yIHdhcyBkZXRlY3RlZCBpbiBkZWNvZGluZyBvZiBkcGNtIHZhbHVlcy4gSXQgYWxzbyBjb3VsZCBiZSBhbiBlcnJvciB3aXRoIG1vcmUgYml0cyBpbiBkZWNvZGluZwotICAgICAgIG9mIGVzY2FwZXMgYW5kIGRwY20gdmFsdWVzIHdoZXJlYnkgYW4gaWxsZWdhbCBjb2Rld29yZCBmb2xsb3dlZCBub3QgZGlyZWN0bHkgYWZ0ZXIgdGhlIGNvcnJ1cHRlZCBiaXRzIGJ1dCBqdXN0IAotICAgICAgIGFmdGVyIGRlY29kaW5nIHNvbWUgbW9yZSAod3JvbmcpIHNjYWxlZmFjdG9ycy4gVXNlIHRoZSBzbWFsbGVyIHNjYWxlZmFjdG9yIGZyb20gZm9yd2FyZCBkZWNvZGluZywgYmFja3dhcmQgZGVjb2RpbmcKLSAgICAgICBhbmQgcHJldmlvdXMgZnJhbWUuICovCi0gICAgaWYgKCAgICgocFJ2bGMtPmNvbmNlYWxfbWluICE9IENPTkNFQUxfTUlOX0lOSVQpIHx8IChwUnZsYy0+Y29uY2VhbF9tYXggIT0gQ09OQ0VBTF9NQVhfSU5JVCkpICYmIChwUnZsYy0+Y29uY2VhbF9taW4gPD0gcFJ2bGMtPmNvbmNlYWxfbWF4KSAKLSAgICAgICAgJiYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5ydmxjUHJldmlvdXNCbG9ja1R5cGUgPT0gY3VycmVudEJsb2NrVHlwZSkgJiYgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLnJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yT0sKLSAgICAgICAgJiYgcFJ2bGMtPnNmX2NvbmNlYWxtZW50ICYmIENvbmNlYWxTdGF0dXMgKQotICAgIHsKLSAgICAgIEJpZGlyZWN0aW9uYWxFc3RpbWF0aW9uX1VzZVNjZk9mUHJldkZyYW1lQXNSZWZlcmVuY2UgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8pOwotICAgICAgQ29uY2VhbFN0YXR1cz0wOwotI2lmIFZFUkJPU0VfUlZMQ19PVVRQVVQKLSAgICAgIEZES3N0cmNweShTdHJhdGVneSwiWWVzIChCaWRpcmVjdGlvbmFsRXN0aW1hdGlvbl9Vc2VTY2ZPZlByZXZGcmFtZUFzUmVmZXJlbmNlKSIpOwotI2VuZGlmCisgICAgLyogQSBzaW5nbGUgYml0IGVycm9yIHdhcyBkZXRlY3RlZCBpbiBkZWNvZGluZyBvZiBkcGNtIHZhbHVlcy4gSXQgYWxzbyBjb3VsZAorICAgICAgIGJlIGFuIGVycm9yIHdpdGggbW9yZSBiaXRzIGluIGRlY29kaW5nIG9mIGVzY2FwZXMgYW5kIGRwY20gdmFsdWVzIHdoZXJlYnkKKyAgICAgICBhbiBpbGxlZ2FsIGNvZGV3b3JkIGZvbGxvd2VkIG5vdCBkaXJlY3RseSBhZnRlciB0aGUgY29ycnVwdGVkIGJpdHMgYnV0CisgICAgICAganVzdCBhZnRlciBkZWNvZGluZyBzb21lIG1vcmUgKHdyb25nKSBzY2FsZWZhY3RvcnMuIFVzZSB0aGUgc21hbGxlcgorICAgICAgIHNjYWxlZmFjdG9yIGZyb20gZm9yd2FyZCBkZWNvZGluZywgYmFja3dhcmQgZGVjb2RpbmcgYW5kIHByZXZpb3VzIGZyYW1lLgorICAgICAqLworICAgIGlmICgoKHBSdmxjLT5jb25jZWFsX21pbiAhPSBDT05DRUFMX01JTl9JTklUKSB8fAorICAgICAgICAgKHBSdmxjLT5jb25jZWFsX21heCAhPSBDT05DRUFMX01BWF9JTklUKSkgJiYKKyAgICAgICAgKHBSdmxjLT5jb25jZWFsX21pbiA8PSBwUnZsYy0+Y29uY2VhbF9tYXgpICYmCisgICAgICAgIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8ucnZsY1ByZXZpb3VzQmxvY2tUeXBlID09CisgICAgICAgICBjdXJyZW50QmxvY2tUeXBlKSAmJgorICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8KKyAgICAgICAgICAgIC5ydmxjUHJldmlvdXNTY2FsZUZhY3Rvck9LICYmCisgICAgICAgIHBSdmxjLT5zZl9jb25jZWFsbWVudCAmJiBDb25jZWFsU3RhdHVzKSB7CisgICAgICBCaWRpcmVjdGlvbmFsRXN0aW1hdGlvbl9Vc2VTY2ZPZlByZXZGcmFtZUFzUmVmZXJlbmNlKAorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8pOworICAgICAgQ29uY2VhbFN0YXR1cyA9IDA7CiAgICAgfQogCi0gICAgLyogQSBzaW5nbGUgYml0IGVycm9yIHdhcyBkZXRlY3RlZCBpbiBkZWNvZGluZyBvZiBkcGNtIHZhbHVlcy4gSXQgYWxzbyBjb3VsZCBiZSBhbiBlcnJvciB3aXRoIG1vcmUgYml0cyBpbiBkZWNvZGluZwotICAgICAgIG9mIGVzY2FwZXMgYW5kIGRwY20gdmFsdWVzIHdoZXJlYnkgYW4gaWxsZWdhbCBjb2Rld29yZCBmb2xsb3dlZCBub3QgZGlyZWN0bHkgYWZ0ZXIgdGhlIGNvcnJ1cHRlZCBiaXRzIGJ1dCBqdXN0IAotICAgICAgIGFmdGVyIGRlY29kaW5nIHNvbWUgbW9yZSAod3JvbmcpIHNjYWxlZmFjdG9ycy4gVXNlIHRoZSBzbWFsbGVyIHNjYWxlZmFjdG9yIGZyb20gZm9yd2FyZCBhbmQgYmFja3dhcmQgZGVjb2RpbmcuICovCi0gICAgaWYgKCAgIChwUnZsYy0+Y29uY2VhbF9taW4gPD0gcFJ2bGMtPmNvbmNlYWxfbWF4KSAgJiYgKChwUnZsYy0+Y29uY2VhbF9taW4gIT0gQ09OQ0VBTF9NSU5fSU5JVCkgfHwgKHBSdmxjLT5jb25jZWFsX21heCAhPSBDT05DRUFMX01BWF9JTklUKSkKLSAgICAgICAgJiYgIShwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8ucnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JPSyAmJiBwUnZsYy0+c2ZfY29uY2VhbG1lbnQgJiYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5ydmxjUHJldmlvdXNCbG9ja1R5cGUgPT0gY3VycmVudEJsb2NrVHlwZSkpCi0gICAgICAgICYmIENvbmNlYWxTdGF0dXMgKQotICAgIHsKLSAgICAgIEJpZGlyZWN0aW9uYWxFc3RpbWF0aW9uX1VzZUxvd2VyU2NmT2ZDdXJyZW50RnJhbWUgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pOwotICAgICAgQ29uY2VhbFN0YXR1cz0wOwotI2lmIFZFUkJPU0VfUlZMQ19PVVRQVVQKLSAgICAgIEZES3N0cmNweShTdHJhdGVneSwiWWVzIChCaWRpcmVjdGlvbmFsRXN0aW1hdGlvbl9Vc2VMb3dlclNjZk9mQ3VycmVudEZyYW1lKSIpOwotI2VuZGlmCisgICAgLyogQSBzaW5nbGUgYml0IGVycm9yIHdhcyBkZXRlY3RlZCBpbiBkZWNvZGluZyBvZiBkcGNtIHZhbHVlcy4gSXQgYWxzbyBjb3VsZAorICAgICAgIGJlIGFuIGVycm9yIHdpdGggbW9yZSBiaXRzIGluIGRlY29kaW5nIG9mIGVzY2FwZXMgYW5kIGRwY20gdmFsdWVzIHdoZXJlYnkKKyAgICAgICBhbiBpbGxlZ2FsIGNvZGV3b3JkIGZvbGxvd2VkIG5vdCBkaXJlY3RseSBhZnRlciB0aGUgY29ycnVwdGVkIGJpdHMgYnV0CisgICAgICAganVzdCBhZnRlciBkZWNvZGluZyBzb21lIG1vcmUgKHdyb25nKSBzY2FsZWZhY3RvcnMuIFVzZSB0aGUgc21hbGxlcgorICAgICAgIHNjYWxlZmFjdG9yIGZyb20gZm9yd2FyZCBhbmQgYmFja3dhcmQgZGVjb2RpbmcuICovCisgICAgaWYgKChwUnZsYy0+Y29uY2VhbF9taW4gPD0gcFJ2bGMtPmNvbmNlYWxfbWF4KSAmJgorICAgICAgICAoKHBSdmxjLT5jb25jZWFsX21pbiAhPSBDT05DRUFMX01JTl9JTklUKSB8fAorICAgICAgICAgKHBSdmxjLT5jb25jZWFsX21heCAhPSBDT05DRUFMX01BWF9JTklUKSkgJiYKKyAgICAgICAgIShwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8KKyAgICAgICAgICAgICAgLnJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yT0sgJiYKKyAgICAgICAgICBwUnZsYy0+c2ZfY29uY2VhbG1lbnQgJiYKKyAgICAgICAgICAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAgICAucnZsY1ByZXZpb3VzQmxvY2tUeXBlID09IGN1cnJlbnRCbG9ja1R5cGUpKSAmJgorICAgICAgICBDb25jZWFsU3RhdHVzKSB7CisgICAgICBCaWRpcmVjdGlvbmFsRXN0aW1hdGlvbl9Vc2VMb3dlclNjZk9mQ3VycmVudEZyYW1lKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pOworICAgICAgQ29uY2VhbFN0YXR1cyA9IDA7CiAgICAgfQogCi0gICAgLyogTm8gZXJyb3JzIHdlcmUgZGV0ZWN0ZWQgaW4gZGVjb2Rpbmcgb2YgZXNjYXBlcyBhbmQgZHBjbSB2YWx1ZXMgaG93ZXZlciB0aGUgZmlyc3QgYW5kIGxhc3QgdmFsdWUgCi0gICAgICAgb2YgYSBncm91cCAoaXMsbnJnLHNmKSBpcyBpbmNvcnJlY3QgKi8gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAoICAgKHBSdmxjLT5jb25jZWFsX21pbiA8PSBwUnZsYy0+Y29uY2VhbF9tYXgpICAmJiAoKEVycm9yU3RhdHVzTGFzdFNjZiAmJiBFcnJvclN0YXR1c0ZpcnN0U2NmKSAKLSAgICAgICAgfHwgKEVycm9yU3RhdHVzTGFzdE5yZyAmJiBFcnJvclN0YXR1c0ZpcnN0TnJnKSB8fCAoRXJyb3JTdGF0dXNMYXN0SXMgJiYgRXJyb3JTdGF0dXNGaXJzdElzKSkgCi0gICAgICAgICYmICEoRXJyb3JTdGF0dXNGb3JiaWRkZW5Dd0Z3ZCB8fCBFcnJvclN0YXR1c0ZvcmJpZGRlbkN3QndkIHx8IEVycm9yU3RhdHVzTGVuZ3RoRXNjYXBlcyApICYmIENvbmNlYWxTdGF0dXMpCi0gICAgewotICAgICAgU3RhdGlzdGljYWxFc3RpbWF0aW9uIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKLSAgICAgIENvbmNlYWxTdGF0dXM9MDsKLSNpZiBWRVJCT1NFX1JWTENfT1VUUFVUCi0gICAgICBGREtzdHJjcHkoU3RyYXRlZ3ksIlllcyAoU3RhdGlzdGljYWxFc3RpbWF0aW9uKSIpOwotI2VuZGlmCisgICAgLyogTm8gZXJyb3JzIHdlcmUgZGV0ZWN0ZWQgaW4gZGVjb2Rpbmcgb2YgZXNjYXBlcyBhbmQgZHBjbSB2YWx1ZXMgaG93ZXZlcgorICAgICAgIHRoZSBmaXJzdCBhbmQgbGFzdCB2YWx1ZSBvZiBhIGdyb3VwIChpcyxucmcsc2YpIGlzIGluY29ycmVjdCAqLworICAgIGlmICgocFJ2bGMtPmNvbmNlYWxfbWluIDw9IHBSdmxjLT5jb25jZWFsX21heCkgJiYKKyAgICAgICAgKChFcnJvclN0YXR1c0xhc3RTY2YgJiYgRXJyb3JTdGF0dXNGaXJzdFNjZikgfHwKKyAgICAgICAgIChFcnJvclN0YXR1c0xhc3ROcmcgJiYgRXJyb3JTdGF0dXNGaXJzdE5yZykgfHwKKyAgICAgICAgIChFcnJvclN0YXR1c0xhc3RJcyAmJiBFcnJvclN0YXR1c0ZpcnN0SXMpKSAmJgorICAgICAgICAhKEVycm9yU3RhdHVzRm9yYmlkZGVuQ3dGd2QgfHwgRXJyb3JTdGF0dXNGb3JiaWRkZW5Dd0J3ZCB8fAorICAgICAgICAgIEVycm9yU3RhdHVzTGVuZ3RoRXNjYXBlcykgJiYKKyAgICAgICAgQ29uY2VhbFN0YXR1cykgeworICAgICAgU3RhdGlzdGljYWxFc3RpbWF0aW9uKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pOworICAgICAgQ29uY2VhbFN0YXR1cyA9IDA7CiAgICAgfQogCi0gICAgLyogQSBlcnJvciB3aXRoIG1vcmUgYml0cyBpbiBkZWNvZGluZyBvZiBlc2NhcGVzIGFuZCBkcGNtIHZhbHVlcyB3YXMgZGV0ZWN0ZWQuIFVzZSB0aGUgc21hbGxlciBzY2FsZWZhY3RvciBmcm9tIGZvcndhcmQgCi0gICAgICAgZGVjb2RpbmcsIGJhY2t3YXJkIGRlY29kaW5nIGFuZCBwcmV2aW91cyBmcmFtZS4gKi8KLSAgICBpZiAoICAgKHBSdmxjLT5jb25jZWFsX21pbiA8PSBwUnZsYy0+Y29uY2VhbF9tYXgpICYmIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5ydmxjUHJldmlvdXNTY2FsZUZhY3Rvck9LICYmIHBSdmxjLT5zZl9jb25jZWFsbWVudAotICAgICAgICAmJiAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLnJ2bGNQcmV2aW91c0Jsb2NrVHlwZSA9PSBjdXJyZW50QmxvY2tUeXBlKSAmJiBDb25jZWFsU3RhdHVzICkKLSAgICB7Ci0gICAgICBQcmVkaWN0aXZlSW50ZXJwb2xhdGlvbihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvKTsKLSAgICAgIENvbmNlYWxTdGF0dXM9MDsKLSNpZiBWRVJCT1NFX1JWTENfT1VUUFVUCi0gICAgICBGREtzdHJjcHkoU3RyYXRlZ3ksIlllcyAoUHJlZGljdGl2ZUludGVycG9sYXRpb24pIik7Ci0jZW5kaWYKKyAgICAvKiBBIGVycm9yIHdpdGggbW9yZSBiaXRzIGluIGRlY29kaW5nIG9mIGVzY2FwZXMgYW5kIGRwY20gdmFsdWVzIHdhcworICAgICAgIGRldGVjdGVkLiBVc2UgdGhlIHNtYWxsZXIgc2NhbGVmYWN0b3IgZnJvbSBmb3J3YXJkIGRlY29kaW5nLCBiYWNrd2FyZAorICAgICAgIGRlY29kaW5nIGFuZCBwcmV2aW91cyBmcmFtZS4gKi8KKyAgICBpZiAoKHBSdmxjLT5jb25jZWFsX21pbiA8PSBwUnZsYy0+Y29uY2VhbF9tYXgpICYmCisgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbworICAgICAgICAgICAgLnJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yT0sgJiYKKyAgICAgICAgcFJ2bGMtPnNmX2NvbmNlYWxtZW50ICYmCisgICAgICAgIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8ucnZsY1ByZXZpb3VzQmxvY2tUeXBlID09CisgICAgICAgICBjdXJyZW50QmxvY2tUeXBlKSAmJgorICAgICAgICBDb25jZWFsU3RhdHVzKSB7CisgICAgICBQcmVkaWN0aXZlSW50ZXJwb2xhdGlvbihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyk7CisgICAgICBDb25jZWFsU3RhdHVzID0gMDsKICAgICB9CiAKLSAgICAvKiBDYWxsIGZyYW1lIGNvbmNlYWxtZW50LCBiZWNhdXNlIG5vIGJldHRlciBzdHJhdGVneSB3YXMgZm91bmQuIFNldHRpbmcgdGhlIHNjYWxlZmFjdG9ycyB0byB6ZXJvIGlzIGRvbmUgZm9yIGRlYnVnZ2luZyAKLSAgICAgICBwdXJwb3NlcyAqLworICAgIC8qIENhbGwgZnJhbWUgY29uY2VhbG1lbnQsIGJlY2F1c2Ugbm8gYmV0dGVyIHN0cmF0ZWd5IHdhcyBmb3VuZC4gU2V0dGluZyB0aGUKKyAgICAgICBzY2FsZWZhY3RvcnMgdG8gemVybyBpcyBkb25lIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgKi8KICAgICBpZiAoQ29uY2VhbFN0YXR1cykgewotICAgICAgZm9yIChncm91cD0wOyBncm91cCA8IHBSdmxjLT5udW1XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKLSAgICAgICAgZm9yIChiYW5kPTA7IGJhbmQ8cFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKLSAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yWzE2Kmdyb3VwK2JhbmRdID0gMDsKKyAgICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IHBSdmxjLT5udW1XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKKyAgICAgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgYmFuZCsrKSB7CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvclsxNiAqIGdyb3VwICsgYmFuZF0gPSAwOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMucnZsY0N1cnJlbnRTY2FsZUZhY3Rvck9LID0gMDsKLSNpZiBWRVJCT1NFX1JWTENfT1VUUFVUCi0gICAgICBGREtzdHJjcHkoU3RyYXRlZ3ksIlllcyAoRnJhbWVDb25jZWFsbWVudCkiKTsKLSNlbmRpZgorICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjCisgICAgICAgICAgLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyA9IDA7CiAgICAgfQogICB9Ci0KLSNpZiBWRVJCT1NFX1JWTENfT1VUUFVUCi0gIERlYnVnT3V0cHV0RGlzdG9ydGVkQml0c3RyZWFtcyhwUnZsYyxwQWFjRGVjb2RlckNoYW5uZWxJbmZvLEVycm9yU3RhdHVzTGVuZ3RoRndkLEVycm9yU3RhdHVzTGVuZ3RoQndkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JTdGF0dXNMZW5ndGhFc2NhcGVzLEVycm9yU3RhdHVzRmlyc3RTY2YsRXJyb3JTdGF0dXNMYXN0U2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JTdGF0dXNGaXJzdE5yZyxFcnJvclN0YXR1c0xhc3ROcmcsRXJyb3JTdGF0dXNGaXJzdElzLEVycm9yU3RhdHVzTGFzdElzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JTdGF0dXNGb3JiaWRkZW5Dd0Z3ZCxFcnJvclN0YXR1c0ZvcmJpZGRlbkN3QndkLEVycm9yU3RhdHVzTnVtRXNjYXBlc0Z3ZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yU3RhdHVzTnVtRXNjYXBlc0J3ZCxjb25jZWFsX21heCxjb25jZWFsX21pbixTdHJhdGVneSk7Ci0jZW5kaWYKIH0KIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBmdW5jdGlvbjogICAgIENSdmxjX1JlYWQgICAgICAgICAgICAgCisgICAgIGZ1bmN0aW9uOiAgICAgQ1J2bGNfUmVhZAogCiAgICAgIGRlc2NyaXB0aW9uOiAgUmVhZCBSVkxDIEVTQzEgZGF0YSAoc2lkZSBpbmZvKSBmcm9tIGJpdHN0cmVhbS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMDQ3LDU2ICsxMDUxLDU4IEBACiAgICAgICAgICAgICAgICAgICAgLSBwb2ludGVyIGJpdHN0cmVhbSBzdHJ1Y3R1cmUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIHJldHVybjogICAgLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLwogCi12b2lkIENSdmxjX1JlYWQgKAotICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICBicykKLXsKLSAgQ0VyUnZsY0luZm8gKnBSdmxjID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5lclJ2bGNJbmZvOwordm9pZCBDUnZsY19SZWFkKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMpIHsKKyAgQ0VyUnZsY0luZm8gKnBSdmxjID0KKyAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuZXJSdmxjSW5mbzsKIAotICBpbnQgIGdyb3VwLGJhbmQ7CisgIGludCBncm91cCwgYmFuZDsKIAogICAvKiBSVkxDIGxvbmcgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gIEluaXQgcGFydCAxIG9mIDIgKi8KLSAgcFJ2bGMtPm51bVdpbmRvd0dyb3VwcyAgID0gR2V0V2luZG93R3JvdXBzKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKLSAgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkID0gR2V0U2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKTsKLSAgcFJ2bGMtPm5vaXNlX3VzZWQgICAgICAgICAgICAgICA9ICAwOyAgICAgICAgICAgICAgICAgIC8qIG5vaXNlIGRldGVjdGlvbiAqLwotICBwUnZsYy0+ZHBjbV9ub2lzZV9ucmcgICAgICAgICAgID0gIDA7ICAgICAgICAgICAgICAgICAgLyogb25seSBmb3IgZGVidWdnaW5nICovCi0gIHBSdmxjLT5kcGNtX25vaXNlX2xhc3RfcG9zaXRpb24gPSAgMDsgICAgICAgICAgICAgICAgICAvKiBvbmx5IGZvciBkZWJ1Z2dpbmcgKi8KLSAgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMgICA9IC0xOyAvKiBkZWZhdWx0IHZhbHVlIGlzIHVzZWQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29uY2VhbG1lbnQgKi8KKyAgcFJ2bGMtPm51bVdpbmRvd0dyb3VwcyA9IEdldFdpbmRvd0dyb3VwcygmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbyk7CisgIHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZCA9CisgICAgICBHZXRTY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pOworICBwUnZsYy0+bm9pc2VfdXNlZCA9IDA7ICAgICAgICAgICAgICAgLyogbm9pc2UgZGV0ZWN0aW9uICovCisgIHBSdmxjLT5kcGNtX25vaXNlX25yZyA9IDA7ICAgICAgICAgICAvKiBvbmx5IGZvciBkZWJ1Z2dpbmcgKi8KKyAgcFJ2bGMtPmRwY21fbm9pc2VfbGFzdF9wb3NpdGlvbiA9IDA7IC8qIG9ubHkgZm9yIGRlYnVnZ2luZyAqLworICBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfZXNjYXBlcyA9CisgICAgICAtMTsgLyogZGVmYXVsdCB2YWx1ZSBpcyB1c2VkIGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvbmNlYWxtZW50ICovCiAKICAgLyogcmVhZCBvbmx5IGVycm9yIHNlbnNpdGl2aXR5IGNsYXNzIDEgZGF0YSAoRVNDIDEgLSBkYXRhKSAqLwotICBwUnZsYy0+c2ZfY29uY2VhbG1lbnQgICAgPSBGREtyZWFkQml0cyhicywxKTsgICAgICAgICAgICAgICAgICAgIC8qICMxICovCi0gIHBSdmxjLT5yZXZfZ2xvYmFsX2dhaW4gICA9IEZES3JlYWRCaXRzKGJzLDgpOyAgICAgICAgICAgICAgICAgICAgLyogIzIgKi8KKyAgcFJ2bGMtPnNmX2NvbmNlYWxtZW50ID0gRkRLcmVhZEJpdHMoYnMsIDEpOyAgLyogIzEgKi8KKyAgcFJ2bGMtPnJldl9nbG9iYWxfZ2FpbiA9IEZES3JlYWRCaXRzKGJzLCA4KTsgLyogIzIgKi8KIAotICBpZiAoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkgewotICAgIHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19zZiA9IEZES3JlYWRCaXRzKGJzLDExKTsgICAgICAgICAgICAgICAgIC8qICMzICovCi0gIH0gICAgICAgICAgICAKLSAgZWxzZSB7Ci0gICAgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX3NmID0gRkRLcmVhZEJpdHMoYnMsOSk7ICAgICAgICAgICAgICAgICAgLyogIzMgKi8KKyAgaWYgKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSA9PSBCTE9DS19TSE9SVCkgeworICAgIHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19zZiA9IEZES3JlYWRCaXRzKGJzLCAxMSk7IC8qICMzICovCisgIH0gZWxzZSB7CisgICAgcFJ2bGMtPmxlbmd0aF9vZl9ydmxjX3NmID0gRkRLcmVhZEJpdHMoYnMsIDkpOyAvKiAjMyAqLwogICB9CiAKICAgLyogY2hlY2sgaWYgbm9pc2UgY29kZWJvb2sgaXMgdXNlZCAqLwogICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKSB7Ci0gICAgZm9yIChiYW5kPTA7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgewotICAgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2tbMTYqZ3JvdXArYmFuZF0gPT0gTk9JU0VfSENCKSB7CisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgYmFuZCsrKSB7CisgICAgICBpZiAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9va1sxNiAqIGdyb3VwICsgYmFuZF0gPT0KKyAgICAgICAgICBOT0lTRV9IQ0IpIHsKICAgICAgICAgcFJ2bGMtPm5vaXNlX3VzZWQgPSAxOwotICAgICAgICBicmVhazsgIAorICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgIH0KIAotICBpZiAocFJ2bGMtPm5vaXNlX3VzZWQpIAotICAgIHBSdmxjLT5kcGNtX25vaXNlX25yZyA9IEZES3JlYWRCaXRzKGJzLCA5KTsgICAgICAgICAgICAgIC8qICM0ICBQTlMgKi8gICAgCisgIGlmIChwUnZsYy0+bm9pc2VfdXNlZCkKKyAgICBwUnZsYy0+ZHBjbV9ub2lzZV9ucmcgPSBGREtyZWFkQml0cyhicywgOSk7IC8qICM0ICBQTlMgKi8KIAotICBwUnZsYy0+c2ZfZXNjYXBlc19wcmVzZW50ID0gRkRLcmVhZEJpdHMoYnMsIDEpOyAgICAgICAgICAgIC8qICM1ICAgICAgKi8KKyAgcFJ2bGMtPnNmX2VzY2FwZXNfcHJlc2VudCA9IEZES3JlYWRCaXRzKGJzLCAxKTsgLyogIzUgICAgICAqLwogCi0gIGlmICggcFJ2bGMtPnNmX2VzY2FwZXNfcHJlc2VudCkgewotICAgIHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzID0gRkRLcmVhZEJpdHMoYnMsIDgpOyAgICAgIC8qICM2ICAgICAgKi8KKyAgaWYgKHBSdmxjLT5zZl9lc2NhcGVzX3ByZXNlbnQpIHsKKyAgICBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfZXNjYXBlcyA9IEZES3JlYWRCaXRzKGJzLCA4KTsgLyogIzYgICAgICAqLwogICB9CiAKLSAgaWYgKHBSdmxjLT5ub2lzZV91c2VkKSB7IAotICAgIHBSdmxjLT5kcGNtX25vaXNlX2xhc3RfcG9zaXRpb24gPSBGREtyZWFkQml0cyhicywgOSk7ICAgIC8qICM3ICBQTlMgKi8gICAgCisgIGlmIChwUnZsYy0+bm9pc2VfdXNlZCkgeworICAgIHBSdmxjLT5kcGNtX25vaXNlX2xhc3RfcG9zaXRpb24gPSBGREtyZWFkQml0cyhicywgOSk7IC8qICM3ICBQTlMgKi8KICAgICBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfc2YgLT0gOTsKICAgfQogCkBAIC0xMTA0LDE2ICsxMTEwLDE1IEBACiAgIHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19zZl9id2QgPSBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfc2Y7CiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgZnVuY3Rpb246ICAgICBDUnZsY19EZWNvZGUgICAgICAgICAgICAgCisgICAgIGZ1bmN0aW9uOiAgICAgQ1J2bGNfRGVjb2RlCiAKICAgICAgZGVzY3JpcHRpb246ICBEZWNvZGUgcnZsYyBkYXRhCi0gICAgICAgICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIHJlYWRzIGJvdGggdGhlIGVzY2FwZSBzZXF1ZW5jZXMgYW5kIHRoZSBzY2FsZWZhY3RvcnMgaW4gZm9yd2FyZAotICAgICAgICAgICAgICAgICAgIGFuZCBiYWNrd2FyZCBkaXJlY3Rpb24uIElmIGFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIGRlY29kaW5nIHByb2Nlc3Mgd2hpY2ggY2FuIAotICAgICAgICAgICAgICAgICAgIG5vdCBiZSBjb25jZWFsZWQgd2l0aCB0aGUgcnZsYyBjb25jZWFsbWVudCBmcmFtZSBjb25jZWFsbWVudCB3aWxsIGJlIGluaXRpYXRlZC4gCi0gICAgICAgICAgICAgICAgICAgVGhlbiB0aGUgZWxlbWVudCAicnZsY0N1cnJlbnRTY2FsZUZhY3Rvck9LIiBpbiB0aGUgZGVjb2RlciBjaGFubmVsIGluZm8gaXMgc2V0IAotICAgICAgICAgICAgICAgICAgIHRvIDAgb3RoZXJ3aXNlIGl0IGlzIHNldCB0byAxLiAKKyAgICAgICAgICAgICAgICAgICBUaGUgZnVuY3Rpb24gcmVhZHMgYm90aCB0aGUgZXNjYXBlIHNlcXVlbmNlcyBhbmQgdGhlCitzY2FsZWZhY3RvcnMgaW4gZm9yd2FyZCBhbmQgYmFja3dhcmQgZGlyZWN0aW9uLiBJZiBhbiBlcnJvciBvY2N1cmVkIGR1cmluZworZGVjb2RpbmcgcHJvY2VzcyB3aGljaCBjYW4gbm90IGJlIGNvbmNlYWxlZCB3aXRoIHRoZSBydmxjIGNvbmNlYWxtZW50IGZyYW1lCitjb25jZWFsbWVudCB3aWxsIGJlIGluaXRpYXRlZC4gVGhlbiB0aGUgZWxlbWVudCAicnZsY0N1cnJlbnRTY2FsZUZhY3Rvck9LIiBpbgordGhlIGRlY29kZXIgY2hhbm5lbCBpbmZvIGlzIHNldCB0byAwIG90aGVyd2lzZSBpdCBpcyBzZXQgdG8gMS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIGlucHV0OiAgICAgLSBwb2ludGVyIHJ2bGMgc3RydWN0dXJlCiAgICAgICAgICAgICAgICAgICAgLSBwb2ludGVyIGNoYW5uZWwgaW5mbyBzdHJ1Y3R1cmUKQEAgLTExMjEsNjIgKzExMjYsNDUgQEAKICAgICAgICAgICAgICAgICAgICAtIHBvaW50ZXIgYml0c3RyZWFtIHN0cnVjdHVyZQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgcmV0dXJuOiAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfT0sKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KIAotdm9pZCBDUnZsY19EZWNvZGUgKAotICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKLSAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgIGJzCi0gICAgICAgICkKLXsKLSAgQ0VyUnZsY0luZm8gKnBSdmxjID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5lclJ2bGNJbmZvOwotICBJTlQgIGJpdENudE9mZnN0OwotICBVSU5UIHNhdmVCaXRDbnQ7Cit2b2lkIENSdmxjX0RlY29kZShDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzKSB7CisgIENFclJ2bGNJbmZvICpwUnZsYyA9CisgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmVyUnZsY0luZm87CisgIElOVCBiaXRDbnRPZmZzdDsKKyAgSU5UIHNhdmVCaXRDbnQ7CiAKLSAgcnZsY0luaXQocFJ2bGMscEFhY0RlY29kZXJDaGFubmVsSW5mbyxicyk7ICAKKyAgcnZsY0luaXQocFJ2bGMsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIGJzKTsKIAogICAvKiBzYXZlIGJpdHN0cmVhbSBwb3NpdGlvbiAqLwogICBzYXZlQml0Q250ID0gRkRLZ2V0Qml0Q250KGJzKTsKIAotI2lmIFJWTENfQURWQU5DRURfQklUU1RSRUFNX0VSUk9SX0dFTkVSQVRPUl9TRgotICBHZW5lcmF0ZVNpbmdsZUJpdEVycm9yKHBSdmxjLAotICAgICAgICAgICAgICAgICAgICAgICAgICYocFJ2bGMtPmJpdHN0cmVhbUluZGV4UnZsRndkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwUnZsYy0+bGVuZ3RoX29mX3J2bGNfc2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0jZW5kaWYKLQotI2lmIFJWTENfQURWQU5DRURfQklUU1RSRUFNX0VSUk9SX0dFTkVSQVRPUl9FU0MKICAgaWYgKHBSdmxjLT5zZl9lc2NhcGVzX3ByZXNlbnQpCi0gICAgR2VuZXJhdGVTaW5nbGVCaXRFcnJvcihwUnZsYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFJ2bGMtPmJpdHN0cmVhbUluZGV4RXNjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdmxjLT5sZW5ndGhfb2ZfcnZsY19lc2NhcGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7Ci0jZW5kaWYKKyAgICBydmxjRGVjb2RlRXNjYXBlcygKKyAgICAgICAgcFJ2bGMsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkVzYywgYnMpOwogCi0gIGlmICggcFJ2bGMtPnNmX2VzY2FwZXNfcHJlc2VudCkKLSAgICBydmxjRGVjb2RlRXNjYXBlcyhwUnZsYywgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRXNjLCBicyk7Ci0KLSAgcnZsY0RlY29kZUZvcndhcmQocFJ2bGMscEFhY0RlY29kZXJDaGFubmVsSW5mbywgYnMpOyAgICAKLSAgcnZsY0RlY29kZUJhY2t3YXJkKHBSdmxjLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIGJzKTsKKyAgcnZsY0RlY29kZUZvcndhcmQocFJ2bGMsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIGJzKTsKKyAgcnZsY0RlY29kZUJhY2t3YXJkKHBSdmxjLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBicyk7CiAgIHJ2bGNGaW5hbEVycm9yRGV0ZWN0aW9uKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8pOwogCi0gIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5ydmxjSW50ZW5zaXR5VXNlZCA9IHBSdmxjLT5pbnRlbnNpdHlfdXNlZDsKKyAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNJbnRlbnNpdHlVc2VkID0KKyAgICAgIHBSdmxjLT5pbnRlbnNpdHlfdXNlZDsKICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS5hYWMuUG5zRGF0YS5QbnNBY3RpdmUgPSBwUnZsYy0+bm9pc2VfdXNlZDsKIAogICAvKiByZXN0b3JlIGJpdHN0cmVhbSBwb3NpdGlvbiAqLwogICBiaXRDbnRPZmZzdCA9IHNhdmVCaXRDbnQgLSBGREtnZXRCaXRDbnQoYnMpOwotICBpZiggYml0Q250T2Zmc3QgKSB7CisgIGlmIChiaXRDbnRPZmZzdCkgewogICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGJzLCBiaXRDbnRPZmZzdCk7CiAgIH0KIH0KIAotdm9pZCBDUnZsY19FbGVtZW50Q2hlY2sgKAotICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvW10sCi0gICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bXSwKLSAgICAgICAgY29uc3QgVUlOVCBmbGFncywKLSAgICAgICAgY29uc3QgSU5UIGVsQ2hhbm5lbHMKLSAgICAgICAgKQotewordm9pZCBDUnZsY19FbGVtZW50Q2hlY2soCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1tdLAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bXSwKKyAgICBjb25zdCBVSU5UIGZsYWdzLCBjb25zdCBJTlQgZWxDaGFubmVscykgewogICBpbnQgY2g7CiAKICAgLyogUmVxdWlyZWQgZm9yIE1QUyByZXNpZHVhbHMuICovCkBAIC0xMTg1LDMxICsxMTczLDQyIEBACiAgIH0KIAogICAvKiBSVkxDIHNwZWNpZmljIHNhbml0eSBjaGVja3MgKi8KLSAgaWYgKCAoZmxhZ3MgJiBBQ19FUl9SVkxDKSAmJiAoZWxDaGFubmVscyA9PSAyKSkgeyAvKiB0byBiZSByZXZpZXdlZCAqLwotICAgIGlmICggKCAocEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyA9PSAwKSB8fAotICAgICAgICAgICAocEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyA9PSAwKSApCi0gICAgICAgICYmICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdLT5wQ29tRGF0YS0+am9pbnRTdGVyZW9EYXRhLk1zTWFza1ByZXNlbnQgICkgewotICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyA9IDA7Ci0gICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMucnZsY0N1cnJlbnRTY2FsZUZhY3Rvck9LID0gMDsKKyAgaWYgKChmbGFncyAmIEFDX0VSX1JWTEMpICYmIChlbENoYW5uZWxzID09IDIpKSB7IC8qIHRvIGJlIHJldmlld2VkICovCisgICAgaWYgKCgocEFhY0RlY29kZXJDaGFubmVsSW5mb1swXQorICAgICAgICAgICAgICAtPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5ydmxjQ3VycmVudFNjYWxlRmFjdG9yT0sgPT0gMCkgfHwKKyAgICAgICAgIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdCisgICAgICAgICAgICAgIC0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyA9PSAwKSkgJiYKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cENvbURhdGEtPmpvaW50U3RlcmVvRGF0YS5Nc01hc2tQcmVzZW50KSB7CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzBdCisgICAgICAgICAgLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMucnZsY0N1cnJlbnRTY2FsZUZhY3Rvck9LID0gMDsKKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0KKyAgICAgICAgICAtPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5ydmxjQ3VycmVudFNjYWxlRmFjdG9yT0sgPSAwOwogICAgIH0KIAotICAgIGlmICggICAocEFhY0RlY29kZXJDaGFubmVsSW5mb1swXS0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyA9PSAwKQotICAgICAgICAmJiAocEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyA9PSAxKQotICAgICAgICAmJiAocEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXS0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNJbnRlbnNpdHlVc2VkID09IDEpICl7Ci0gICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvWzFdLT5wRHluRGF0YS0+c3BlY2lmaWNUby5hYWMucnZsY0N1cnJlbnRTY2FsZUZhY3Rvck9LID0gMDsKKyAgICBpZiAoKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMF0KKyAgICAgICAgICAgICAtPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5ydmxjQ3VycmVudFNjYWxlRmFjdG9yT0sgPT0gMCkgJiYKKyAgICAgICAgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0KKyAgICAgICAgICAgICAtPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5ydmxjQ3VycmVudFNjYWxlRmFjdG9yT0sgPT0gMSkgJiYKKyAgICAgICAgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMV0KKyAgICAgICAgICAgICAtPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5ydmxjSW50ZW5zaXR5VXNlZCA9PSAxKSkgeworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1sxXQorICAgICAgICAgIC0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSyA9IDA7CiAgICAgfQogICB9CiAKLSAgZm9yIChjaCA9IDA7IGNoIDwgZWxDaGFubmVsczsgY2ggKyspCi0gIHsKLSAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+Y29uY2VhbG1lbnRJbmZvLnJ2bGNQcmV2aW91c0Jsb2NrVHlwZSA9IChHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tjaF0tPmljc0luZm8pID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkgPyAwIDogMTsKKyAgZm9yIChjaCA9IDA7IGNoIDwgZWxDaGFubmVsczsgY2grKykgeworICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdLT5jb25jZWFsbWVudEluZm8ucnZsY1ByZXZpb3VzQmxvY2tUeXBlID0KKyAgICAgICAgKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+aWNzSW5mbykgPT0gQkxPQ0tfU0hPUlQpCisgICAgICAgICAgICA/IDAKKyAgICAgICAgICAgIDogMTsKICAgICBpZiAoZmxhZ3MgJiBBQ19FUl9SVkxDKSB7Ci0gICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+Y29uY2VhbG1lbnRJbmZvLnJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yT0sgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXS0+cER5bkRhdGEtPnNwZWNpZmljVG8uYWFjLnJ2bGNDdXJyZW50U2NhbGVGYWN0b3JPSzsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW2NoXS0+Y29uY2VhbG1lbnRJbmZvLnJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yT0sgPSAwOworICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tjaF0KKyAgICAgICAgICAtPmNvbmNlYWxtZW50SW5mby5ydmxjUHJldmlvdXNTY2FsZUZhY3Rvck9LID0KKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW2NoXQorICAgICAgICAgICAgICAtPnBEeW5EYXRhLT5zcGVjaWZpY1RvLmFhYy5ydmxjQ3VycmVudFNjYWxlRmFjdG9yT0s7CisgICAgfSBlbHNlIHsKKyAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bY2hdCisgICAgICAgICAgLT5jb25jZWFsbWVudEluZm8ucnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JPSyA9IDA7CiAgICAgfQogICB9CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9ydmxjLmggYi9saWJBQUNkZWMvc3JjL3J2bGMuaAppbmRleCAxOGQ1ZmEzLi45YzYwZDUxIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL3J2bGMuaAorKysgYi9saWJBQUNkZWMvc3JjL3J2bGMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQpAQCAtOTAsOCArMTA5LDYgQEAKICNpZm5kZWYgUlZMQ19ICiAjZGVmaW5lIFJWTENfSAogCi0KLQogI2luY2x1ZGUgImFhY2RlY29kZXIuaCIKICNpbmNsdWRlICJjaGFubmVsLmgiCiAjaW5jbHVkZSAicnZsY19pbmZvLmgiCkBAIC0xMDAsMzUgKzExNywzNyBAQAogLyogICAgZXJyb3JMb2dSdmxjOiBBIHdvcmQgb2YgMzIgYml0cyB1c2VkIGZvciBsb2dnaW5nIHBvc3NpYmxlIGVycm9ycyAqLwogLyogICAgICAgICAgICAgICAgICB3aXRoaW4gUlZMQyBpbiBjYXNlIG9mIGRpc3RvcnRlZCBiaXRzdHJlYW1zLiAgICAgICAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVkxDX0VSUk9SX0FMTF9FU0NBUEVfV09SRFNfSU5WQUxJRCAgICAgICAgICAgICAgMHg4MDAwMDAwMCAgIC8qICBFU0MtRGVjICBEdXJpbmcgUlZMQy1Fc2NhcGUtZGVjb2RpbmcgdGhlcmUgaGF2ZSBiZWVuIG1vcmUgYml0cyBkZWNvZGVkIGFzIHRoZXJlIGFyZSBhdmFpbGFibGUgKi8KLSNkZWZpbmUgUlZMQ19FUlJPUl9SVkxfU1VNX0JJVF9DT1VOVEVSX0JFTE9XX1pFUk9fRldEICAgIDB4NDAwMDAwMDAgICAvKiAgUlZMLURlYyAgbmVnYXRpdmUgc3VtLWJpdGNvdW50ZXIgZHVyaW5nIFJWTC1md2QtZGVjb2RpbmcgKGxvbmcrc2hydCkgKi8KLSNkZWZpbmUgUlZMQ19FUlJPUl9SVkxfU1VNX0JJVF9DT1VOVEVSX0JFTE9XX1pFUk9fQldEICAgIDB4MjAwMDAwMDAgICAvKiAgUlZMLURlYyAgbmVnYXRpdmUgc3VtLWJpdGNvdW50ZXIgZHVyaW5nIFJWTC1md2QtZGVjb2RpbmcgKGxvbmcrc2hydCkgKi8KLSNkZWZpbmUgUlZMQ19FUlJPUl9GT1JCSURERU5fQ1dfREVURUNURURfRldEICAgICAgICAgICAgIDB4MDgwMDAwMDAgICAvKiAgUlZMLURlYyAgZm9yYmlkZGVuIGNvZGV3b3JkIGRldGVjdGVkIGZ3ZCAobG9uZytzaHJ0KSAqLwotI2RlZmluZSBSVkxDX0VSUk9SX0ZPUkJJRERFTl9DV19ERVRFQ1RFRF9CV0QgICAgICAgICAgICAgMHgwNDAwMDAwMCAgIC8qICBSVkwtRGVjICBmb3JiaWRkZW4gY29kZXdvcmQgZGV0ZWN0ZWQgYndkIChsb25nK3NocnQpICovCisjZGVmaW5lIFJWTENfRVJST1JfQUxMX0VTQ0FQRV9XT1JEU19JTlZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4ODAwMDAwMDAgLyogIEVTQy1EZWMgIER1cmluZyBSVkxDLUVzY2FwZS1kZWNvZGluZyB0aGVyZSBoYXZlIGJlZW4gbW9yZSBcCisgICAgICAgICAgICAgICAgYml0cyBkZWNvZGVkIGFzIHRoZXJlIGFyZSBhdmFpbGFibGUgKi8KKyNkZWZpbmUgUlZMQ19FUlJPUl9SVkxfU1VNX0JJVF9DT1VOVEVSX0JFTE9XX1pFUk9fRldEICAgICAgICAgICAgICAgICAgICAgXAorICAweDQwMDAwMDAwIC8qICBSVkwtRGVjICBuZWdhdGl2ZSBzdW0tYml0Y291bnRlciBkdXJpbmcgUlZMLWZ3ZC1kZWNvZGluZyBcCisgICAgICAgICAgICAgICAgKGxvbmcrc2hydCkgKi8KKyNkZWZpbmUgUlZMQ19FUlJPUl9SVkxfU1VNX0JJVF9DT1VOVEVSX0JFTE9XX1pFUk9fQldEICAgICAgICAgICAgICAgICAgICAgXAorICAweDIwMDAwMDAwIC8qICBSVkwtRGVjICBuZWdhdGl2ZSBzdW0tYml0Y291bnRlciBkdXJpbmcgUlZMLWZ3ZC1kZWNvZGluZyBcCisgICAgICAgICAgICAgICAgKGxvbmcrc2hydCkgKi8KKyNkZWZpbmUgUlZMQ19FUlJPUl9GT1JCSURERU5fQ1dfREVURUNURURfRldEIFwKKyAgMHgwODAwMDAwMCAvKiAgUlZMLURlYyAgZm9yYmlkZGVuIGNvZGV3b3JkIGRldGVjdGVkIGZ3ZCAobG9uZytzaHJ0KSAqLworI2RlZmluZSBSVkxDX0VSUk9SX0ZPUkJJRERFTl9DV19ERVRFQ1RFRF9CV0QgXAorICAweDA0MDAwMDAwIC8qICBSVkwtRGVjICBmb3JiaWRkZW4gY29kZXdvcmQgZGV0ZWN0ZWQgYndkIChsb25nK3NocnQpICovCiAKK3ZvaWQgQ1J2bGNfUmVhZChDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzKTsKIAotCi12b2lkIENSdmxjX1JlYWQgKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgIGJzKTsKLQotdm9pZCBDUnZsY19EZWNvZGUgKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCi0gICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgIGJzKTsKK3ZvaWQgQ1J2bGNfRGVjb2RlKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMpOwogCiAvKioKLSAqIFxicmllZiBwZXJmb3JtZSBzYW5pdHkgY2hlY2tzIHRvIHRoZSBjaGFubmVsIGRhdGEgY29ycmVzcG9uZGluZyB0byBvbmUgY2hhbm5lbCBlbGVtZW50LgorICogXGJyaWVmIHBlcmZvcm1lIHNhbml0eSBjaGVja3MgdG8gdGhlIGNoYW5uZWwgZGF0YSBjb3JyZXNwb25kaW5nIHRvIG9uZQorICogY2hhbm5lbCBlbGVtZW50LgogICogXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8KICAqIFxwYXJhbSBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvCiAgKiBccGFyYW0gZWxDaGFubmVscyBhbW91bnQgb2YgY2hhbm5lbHMgb2YgdGhlIGNoYW5uZWwgZWxlbWVudC4KICAqLwotdm9pZCBDUnZsY19FbGVtZW50Q2hlY2sgKAotICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvW10sCi0gICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bXSwKLSAgICAgICAgY29uc3QgVUlOVCBmbGFncywKLSAgICAgICAgY29uc3QgSU5UIGVsQ2hhbm5lbHMKLSAgICAgICAgKTsKLQotCi0KK3ZvaWQgQ1J2bGNfRWxlbWVudENoZWNrKAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bXSwKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW10sCisgICAgY29uc3QgVUlOVCBmbGFncywgY29uc3QgSU5UIGVsQ2hhbm5lbHMpOwogCiAjZW5kaWYgLyogUlZMQ19IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL3J2bGNfaW5mby5oIGIvbGliQUFDZGVjL3NyYy9ydmxjX2luZm8uaAppbmRleCA2MzkzNGFmLi5mYzljMTlkIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL3J2bGNfaW5mby5oCisrKyBiL2xpYkFBQ2RlYy9zcmMvcnZsY19pbmZvLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNyArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKQEAgLTg5LDg4ICsxMDgsOTYgQEAKICNpZm5kZWYgUlZMQ19JTkZPX0gKICNkZWZpbmUgUlZMQ19JTkZPX0gKIAorI2RlZmluZSBGV0QgMCAvKiBiaXRzdHJlYW0gZGVjb2RpbmcgZGlyZWN0aW9uIGZvcndhcmQgKFJWTCBjb2RlZCBwYXJ0KSAqLworI2RlZmluZSBCV0QgMSAvKiBiaXRzdHJlYW0gZGVjb2RpbmcgZGlyZWN0aW9uIGJhY2t3YXJkIChSVkwgY29kZWQgcGFydCkgKi8KIAorI2RlZmluZSBNQVhfUlZMIDcgIC8qIHBvc2l0aXZlIFJWTEMgZXNjYXBlICovCisjZGVmaW5lIE1JTl9SVkwgLTcgLyogbmVnYXRpdmUgUlZMQyBlc2NhcGUgKi8KKyNkZWZpbmUgTUFYX0FMTE9XRURfRFBDTV9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMTQgLyogdGhlIG1heGltdW0gYWxsb3dlZCBpbmRleCBvZiBhIGRlY29kZWQgZHBjbSB2YWx1ZSAob2Zmc2V0IFwKKyAgICAgICAgJ1RBQkxFX09GRlNFVCcgaW5jbCAtLT4gbXVzdCBiZSBzdWJ0cmFjdGVkKSAqLworI2RlZmluZSBUQUJMRV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgNyAvKiBkcGNtIG9mZnNldCBvZiB2YWxpZCBvdXRwdXQgdmFsdWVzIG9mIHJ2bCB0YWJsZSBkZWNvZGluZywgdGhlIHJ2bCB0YWJsZSBcCisgICAgICAgb3VseSByZXR1cm5zIHBvc2l0aXZlIHZhbHVlcywgdGhlcmVmb3JlIHRoZSBvZmZzZXQgKi8KKyNkZWZpbmUgTUFYX0xFTl9SVkxDX0NPREVfV09SRCA5IC8qIG1heCBsZW5ndGggb2YgYSBSVkwgY29kZXdvcmQgaW4gYml0cyAqLworI2RlZmluZSBNQVhfTEVOX1JWTENfRVNDQVBFX1dPUkQgXAorICAyMCAvKiBtYXggbGVuZ3RoIG9mIGh1ZmZtYW4gY29kZWQgUlZMQyBlc2NhcGUgd29yZCBpbiBiaXRzICovCiAKLSNkZWZpbmUgRldEICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgLyogYml0c3RyZWFtIGRlY29kaW5nIGRpcmVjdGlvbiBmb3J3YXJkIChSVkwgY29kZWQgcGFydCkgKi8KLSNkZWZpbmUgQldEICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgLyogYml0c3RyZWFtIGRlY29kaW5nIGRpcmVjdGlvbiBiYWNrd2FyZCAoUlZMIGNvZGVkIHBhcnQpICovCisjZGVmaW5lIERQQ01fTk9JU0VfTlJHX0JJVFMgOQorI2RlZmluZSBTRl9PRkZTRVQgMTAwIC8qIG9mZnNldCBmb3IgY29ycmVjdGluZyBzY2YgdmFsdWUgKi8KIAotI2RlZmluZSBNQVhfUlZMICAgICAgICAgICAgICAgICAgICAgICA3ICAgICAvKiBwb3NpdGl2ZSBSVkxDIGVzY2FwZSAqLwotI2RlZmluZSBNSU5fUlZMICAgICAgICAgICAgICAgICAgICAgIC03ICAgICAvKiBuZWdhdGl2ZSBSVkxDIGVzY2FwZSAqLwotI2RlZmluZSBNQVhfQUxMT1dFRF9EUENNX0lOREVYICAgICAgIDE0ICAgICAvKiB0aGUgbWF4aW11bSBhbGxvd2VkIGluZGV4IG9mIGEgZGVjb2RlZCBkcGNtIHZhbHVlIChvZmZzZXQgJ1RBQkxFX09GRlNFVCcgaW5jbCAtLT4gbXVzdCBiZSBzdWJ0cmFjdGVkKSAqLwotI2RlZmluZSBUQUJMRV9PRkZTRVQgICAgICAgICAgICAgICAgICA3ICAgICAvKiBkcGNtIG9mZnNldCBvZiB2YWxpZCBvdXRwdXQgdmFsdWVzIG9mIHJ2bCB0YWJsZSBkZWNvZGluZywgdGhlIHJ2bCB0YWJsZSBvdWx5IHJldHVybnMgcG9zaXRpdmUgdmFsdWVzLCB0aGVyZWZvcmUgdGhlIG9mZnNldCAqLwotI2RlZmluZSBNQVhfTEVOX1JWTENfQ09ERV9XT1JEICAgICAgICA5ICAgICAvKiBtYXggbGVuZ3RoIG9mIGEgUlZMIGNvZGV3b3JkIGluIGJpdHMgKi8KLSNkZWZpbmUgTUFYX0xFTl9SVkxDX0VTQ0FQRV9XT1JEICAgICAyMCAgICAgLyogbWF4IGxlbmd0aCBvZiBodWZmbWFuIGNvZGVkIFJWTEMgZXNjYXBlIHdvcmQgaW4gYml0cyAqLworI2RlZmluZSBDT05DRUFMX01BWF9JTklUIDEzMTEgIC8qIGFyYml0cmFyeSB2YWx1ZSAqLworI2RlZmluZSBDT05DRUFMX01JTl9JTklUIC0xMzExIC8qIGFyYml0cmFyeSB2YWx1ZSAqLwogCi0jZGVmaW5lIERQQ01fTk9JU0VfTlJHX0JJVFMgICAgICAgICAgIDkKLSNkZWZpbmUgU0ZfT0ZGU0VUICAgICAgICAgICAgICAgICAgIDEwMCAgICAgLyogb2Zmc2V0IGZvciBjb3JyZWN0aW5nIHNjZiB2YWx1ZSAqLwotCi0jZGVmaW5lIENPTkNFQUxfTUFYX0lOSVQgICAgICAgICAgIDEzMTEgICAgIC8qIGFyYml0cmFyeSB2YWx1ZSAqLwotI2RlZmluZSBDT05DRUFMX01JTl9JTklUICAgICAgICAgIC0xMzExICAgICAvKiBhcmJpdHJhcnkgdmFsdWUgKi8KLQotI2RlZmluZSBSVkxDX01BWF9TRkIgICAgICAgICAgICAgICgoOCkgKiAoMTYpKQorI2RlZmluZSBSVkxDX01BWF9TRkIgKCg4KSAqICgxNikpCiAKIC8qIHNpZGVpbmZvIG9mIFJWTEMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIC0tLS0tLS0gRVNDIDEgRGF0YTogLS0tLS0tLS0tICovICAgICAvKiBvcmRlciBvZiBSVkxDLWJpdHN0cmVhbSBjb21wb25lbnRzIGluIGJpdHN0cmVhbSAoUlZMQy1pbml0aWFsaXphdGlvbiksIGV2ZXJ5IGNvbXBvbmVudCBhcHBlYXJzIG9ubHkgb25jZSBpbiBiaXRzdHJlYW0gKi8KLSAgSU5UICAgICAgICBzZl9jb25jZWFsbWVudDsgICAgICAgICAgICAgIC8qIDEgICAgICAgICAgKi8KLSAgSU5UICAgICAgICByZXZfZ2xvYmFsX2dhaW47ICAgICAgICAgICAgIC8qIDIgICAgICAgICAgKi8KLSAgU0hPUlQgICAgICBsZW5ndGhfb2ZfcnZsY19zZjsgICAgICAgICAgIC8qIDMgICAgICAgICAgKi8gIC8qIG9yaWdpbmFsIHZhbHVlLCBnZXRzIG1vZGlmaWVkIChzdWJ0cmFjdCA5KSBpbiBjYXNlIG9mIG5vaXNlIChQTlMpOyBpcyBrZXB0IGZvciBsYXRlciB1c2UgKi8KLSAgSU5UICAgICAgICBkcGNtX25vaXNlX25yZzsgICAgICAgICAgICAgIC8qIDQgb3B0aW9uYWwgKi8KLSAgSU5UICAgICAgICBzZl9lc2NhcGVzX3ByZXNlbnQ7ICAgICAgICAgIC8qIDUgICAgICAgICAgKi8KLSAgU0hPUlQgICAgICBsZW5ndGhfb2ZfcnZsY19lc2NhcGVzOyAgICAgIC8qIDYgb3B0aW9uYWwgKi8KLSAgSU5UICAgICAgICBkcGNtX25vaXNlX2xhc3RfcG9zaXRpb247ICAgIC8qIDcgb3B0aW9uYWwgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogLS0tLS0tLSBFU0MgMSBEYXRhOiAtLS0tLS0tLS0gKi8gLyogb3JkZXIgb2YgUlZMQy1iaXRzdHJlYW0gY29tcG9uZW50cyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0gKFJWTEMtaW5pdGlhbGl6YXRpb24pLCBldmVyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgYXBwZWFycyBvbmx5IG9uY2UgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtICovCisgIElOVCBzZl9jb25jZWFsbWVudDsgICAgICAgICAgICAgICAgIC8qIDEgICAgICAgICAgKi8KKyAgSU5UIHJldl9nbG9iYWxfZ2FpbjsgICAgICAgICAgICAgICAgLyogMiAgICAgICAgICAqLworICBTSE9SVCBsZW5ndGhfb2ZfcnZsY19zZjsgLyogMyAgICAgICAgICAqLyAvKiBvcmlnaW5hbCB2YWx1ZSwgZ2V0cyBtb2RpZmllZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3VidHJhY3QgOSkgaW4gY2FzZSBvZiBub2lzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUE5TKTsgaXMga2VwdCBmb3IgbGF0ZXIgdXNlICovCisgIElOVCBkcGNtX25vaXNlX25yZzsgICAgICAgICAgICAgICAgICAgICAgIC8qIDQgb3B0aW9uYWwgKi8KKyAgSU5UIHNmX2VzY2FwZXNfcHJlc2VudDsgICAgICAgICAgICAgICAgICAgLyogNSAgICAgICAgICAqLworICBTSE9SVCBsZW5ndGhfb2ZfcnZsY19lc2NhcGVzOyAgICAgICAgICAgICAvKiA2IG9wdGlvbmFsICovCisgIElOVCBkcGNtX25vaXNlX2xhc3RfcG9zaXRpb247ICAgICAgICAgICAgIC8qIDcgb3B0aW9uYWwgKi8KIAotICBJTlQgICAgICAgIGRwY21faXNfbGFzdF9wb3NpdGlvbjsKKyAgSU5UIGRwY21faXNfbGFzdF9wb3NpdGlvbjsKIAotICBTSE9SVCAgICAgIGxlbmd0aF9vZl9ydmxjX3NmX2Z3ZDsgICAgICAgLyogbGVuZ3RoX29mX3J2bGNfc2YgdXNlZCBmb3IgZm9yd2FyZCBkZWNvZGluZyAqLwotICBTSE9SVCAgICAgIGxlbmd0aF9vZl9ydmxjX3NmX2J3ZDsgICAgICAgLyogbGVuZ3RoX29mX3J2bGNfc2YgdXNlZCBmb3IgYmFja3dhcmQgZGVjb2RpbmcgKi8KKyAgU0hPUlQgbGVuZ3RoX29mX3J2bGNfc2ZfZndkOyAvKiBsZW5ndGhfb2ZfcnZsY19zZiB1c2VkIGZvciBmb3J3YXJkIGRlY29kaW5nICovCisgIFNIT1JUCisgIGxlbmd0aF9vZl9ydmxjX3NmX2J3ZDsgLyogbGVuZ3RoX29mX3J2bGNfc2YgdXNlZCBmb3IgYmFja3dhcmQgZGVjb2RpbmcgKi8KIAogICAvKiBmb3IgUlZMLUNvZGV3b3JkIGRlY29kZXIgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBmd2QgYW5kIGJ3ZCBkZWNvZGluZyAqLwotICBTSE9SVCAgICAgKnBSdmxCaXRDbnRfUlZMOwotICBVU0hPUlQgICAgKnBCaXRzdHJJbmR4UnZsX1JWTDsKKyAgU0hPUlQgKnBSdmxCaXRDbnRfUlZMOworICBJTlQgKnBCaXRzdHJJbmR4UnZsX1JWTDsKIAotICBVQ0hBUiAgICAgIG51bVdpbmRvd0dyb3VwczsKLSAgVUNIQVIgICAgICBtYXhTZmJUcmFuc21pdHRlZDsKLSAgVUNIQVIgICAgICBmaXJzdF9ub2lzZV9ncm91cDsKLSAgVUNIQVIgICAgICBmaXJzdF9ub2lzZV9iYW5kOwotICBVQ0hBUiAgICAgIGRpcmVjdGlvbjsKKyAgVUNIQVIgbnVtV2luZG93R3JvdXBzOworICBVQ0hBUiBtYXhTZmJUcmFuc21pdHRlZDsKKyAgVUNIQVIgZmlyc3Rfbm9pc2VfZ3JvdXA7CisgIFVDSEFSIGZpcnN0X25vaXNlX2JhbmQ7CisgIFVDSEFSIGRpcmVjdGlvbjsKIAogICAvKiBiaXRzdHJlYW0gaW5kaWNlcyAqLwotICBVU0hPUlQgICAgIGJpdHN0cmVhbUluZGV4UnZsRndkOyAgICAgICAgLyogYmFzZSBhZGRyZXNzIG9mIFJWTC1jb2RlZC1zY2FsZWZhY3RvciBkYXRhIChFU0MgMikgZm9yIGZvcndhcmQgIGRlY29kaW5nICovCi0gIFVTSE9SVCAgICAgYml0c3RyZWFtSW5kZXhSdmxCd2Q7ICAgICAgICAvKiBiYXNlIGFkZHJlc3Mgb2YgUlZMLWNvZGVkLXNjYWxlZmFjdG9yIGRhdGEgKEVTQyAyKSBmb3IgYmFja3dhcmQgZGVjb2RpbmcgKi8KLSAgVVNIT1JUICAgICBiaXRzdHJlYW1JbmRleEVzYzsgICAgICAgICAgIC8qIGJhc2UgYWRkcmVzcyB3aGVyZSBSVkxDLWVzY2FwZXMgc3RhcnQgKEVTQyAyKSAqLworICBJTlQgYml0c3RyZWFtSW5kZXhSdmxGd2Q7IC8qIGJhc2UgYWRkcmVzcyBvZiBSVkwtY29kZWQtc2NhbGVmYWN0b3IgZGF0YSAoRVNDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMikgZm9yIGZvcndhcmQgIGRlY29kaW5nICovCisgIElOVCBiaXRzdHJlYW1JbmRleFJ2bEJ3ZDsgLyogYmFzZSBhZGRyZXNzIG9mIFJWTC1jb2RlZC1zY2FsZWZhY3RvciBkYXRhIChFU0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSBmb3IgYmFja3dhcmQgZGVjb2RpbmcgKi8KKyAgSU5UIGJpdHN0cmVhbUluZGV4RXNjOyAgICAvKiBiYXNlIGFkZHJlc3Mgd2hlcmUgUlZMQy1lc2NhcGVzIHN0YXJ0IChFU0MgMikgKi8KIAogICAvKiBkZWNvZGluZyB0cmVlcyAqLwogICBjb25zdCBVSU5UICpwSHVmZlRyZWVSdmxDb2Rld2RzOwogICBjb25zdCBVSU5UICpwSHVmZlRyZWVSdmxjRXNjYXBlOwogCiAgIC8qIGVzY2FwZSBjb3VudGVycyAqLwotICBVQ0hBUiAgICAgIG51bURlY29kZWRFc2NhcGVXb3Jkc0Z3ZDsgICAgLyogd2hlbiBkZWNvZGluZyBSVkwtY29kZXMgZm9yd2FyZCAgKi8KLSAgVUNIQVIgICAgICBudW1EZWNvZGVkRXNjYXBlV29yZHNCd2Q7ICAgIC8qIHdoZW4gZGVjb2RpbmcgUlZMLWNvZGVzIGJhY2t3YXJkICovCi0gIFVDSEFSICAgICAgbnVtRGVjb2RlZEVzY2FwZVdvcmRzRXNjOyAgICAvKiB3aGVuIGRlY29kaW5nIHRoZSBlc2NhcGUtV29yZHMgKi8KKyAgVUNIQVIgbnVtRGVjb2RlZEVzY2FwZVdvcmRzRndkOyAvKiB3aGVuIGRlY29kaW5nIFJWTC1jb2RlcyBmb3J3YXJkICAqLworICBVQ0hBUiBudW1EZWNvZGVkRXNjYXBlV29yZHNCd2Q7IC8qIHdoZW4gZGVjb2RpbmcgUlZMLWNvZGVzIGJhY2t3YXJkICovCisgIFVDSEFSIG51bURlY29kZWRFc2NhcGVXb3Jkc0VzYzsgLyogd2hlbiBkZWNvZGluZyB0aGUgZXNjYXBlLVdvcmRzICovCiAKLSAgU0NIQVIgICAgICBub2lzZV91c2VkOwotICBTQ0hBUiAgICAgIGludGVuc2l0eV91c2VkOwotICBTQ0hBUiAgICAgIHNmX3VzZWQ7CisgIFNDSEFSIG5vaXNlX3VzZWQ7CisgIFNDSEFSIGludGVuc2l0eV91c2VkOworICBTQ0hBUiBzZl91c2VkOwogCi0gIFNIT1JUICAgICAgZmlyc3RTY2Y7Ci0gIFNIT1JUICAgICAgbGFzdFNjZjsKLSAgU0hPUlQgICAgICBmaXJzdE5yZzsKLSAgU0hPUlQgICAgICBsYXN0TnJnOwotICBTSE9SVCAgICAgIGZpcnN0SXM7Ci0gIFNIT1JUICAgICAgbGFzdElzOworICBTSE9SVCBmaXJzdFNjZjsKKyAgU0hPUlQgbGFzdFNjZjsKKyAgU0hPUlQgZmlyc3ROcmc7CisgIFNIT1JUIGxhc3ROcmc7CisgIFNIT1JUIGZpcnN0SXM7CisgIFNIT1JUIGxhc3RJczsKIAogICAvKiAtLS0tLS0gUlZMQyBlcnJvciBkZXRlY3Rpb24gLS0tLS0tICovCi0gIFVJTlQgICAgICAgZXJyb3JMb2dSdmxjOyAgICAgICAgICAgICAgICAvKiBzdG9yZSBSVkxDIGVycm9ycyAgKi8KLSAgU0hPUlQgICAgICBjb25jZWFsX21pbjsgICAgICAgICAgICAgICAgIC8qIGlzIHNldCBhdCBiYWNrd2FyZCBkZWNvZGluZyAgKi8KLSAgU0hPUlQgICAgICBjb25jZWFsX21heDsgICAgICAgICAgICAgICAgIC8qIGlzIHNldCBhdCBmb3J3YXJkICBkZWNvZGluZyAgKi8KLSAgU0hPUlQgICAgICBjb25jZWFsX21pbl9lc2M7ICAgICAgICAgICAgIC8qIGlzIHNldCBhdCBiYWNrd2FyZCBkZWNvZGluZyAgKi8KLSAgU0hPUlQgICAgICBjb25jZWFsX21heF9lc2M7ICAgICAgICAgICAgIC8qIGlzIHNldCBhdCBmb3J3YXJkICBkZWNvZGluZyAgKi8KKyAgVUlOVCBlcnJvckxvZ1J2bGM7ICAgICAvKiBzdG9yZSBSVkxDIGVycm9ycyAgKi8KKyAgU0hPUlQgY29uY2VhbF9taW47ICAgICAvKiBpcyBzZXQgYXQgYmFja3dhcmQgZGVjb2RpbmcgICovCisgIFNIT1JUIGNvbmNlYWxfbWF4OyAgICAgLyogaXMgc2V0IGF0IGZvcndhcmQgIGRlY29kaW5nICAqLworICBTSE9SVCBjb25jZWFsX21pbl9lc2M7IC8qIGlzIHNldCBhdCBiYWNrd2FyZCBkZWNvZGluZyAgKi8KKyAgU0hPUlQgY29uY2VhbF9tYXhfZXNjOyAvKiBpcyBzZXQgYXQgZm9yd2FyZCAgZGVjb2RpbmcgICovCiB9IENFclJ2bGNJbmZvOwogCiB0eXBlZGVmIENFclJ2bGNJbmZvIFJWTENfSU5GTzsgLyogdGVtcCAqLwogCi0KLQogI2VuZGlmIC8qIFJWTENfSU5GT19IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL3J2bGNiaXQuY3BwIGIvbGliQUFDZGVjL3NyYy9ydmxjYml0LmNwcAppbmRleCA2ZWZiYjkzLi5jMDZjZjk2IDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL3J2bGNiaXQuY3BwCisrKyBiL2xpYkFBQ2RlYy9zcmMvcnZsY2JpdC5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNyArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKQEAgLTg5LDI4ICsxMDgsMjcgQEAKIAogI2luY2x1ZGUgInJ2bGNiaXQuaCIKIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBmdW5jdGlvbjogICAgIHJ2bGNSZWFkQml0RnJvbUJpdHN0cmVhbQogCi0gICAgIGRlc2NyaXB0aW9uOiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgYml0IGZyb20gdGhlIGJpdHN0cmVhbSBhY2NvcmRpbmcgdG8gcmVhZCBkaXJlY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgSXQgaXMgY2FsbGVkIHZlcnkgb2Z0ZW4sIHRoZXJlZm9yZSBpdCBtYWtlcyBzZW5zZSB0byBpbmxpbmUgaXQgKHJ1bnRpbWUpLgorICAgICBkZXNjcmlwdGlvbjogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGJpdCBmcm9tIHRoZSBiaXRzdHJlYW0gYWNjb3JkaW5nIHRvCityZWFkIGRpcmVjdGlvbi4gSXQgaXMgY2FsbGVkIHZlcnkgb2Z0ZW4sIHRoZXJlZm9yZSBpdCBtYWtlcyBzZW5zZSB0byBpbmxpbmUgaXQKKyhydW50aW1lKS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIGlucHV0OiAgICAgLSBiaXRzdHJlYW0KICAgICAgICAgICAgICAgICAgICAtIHBQb3NpdGlvbgogICAgICAgICAgICAgICAgICAgIC0gcmVhZERpcmVjdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgcmV0dXJuOiAgICAtIGJpdCBmcm9tIGJpdHN0cmVhbQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLwogCi1VQ0hBUiBydmxjUmVhZEJpdEZyb21CaXRzdHJlYW0gKEhBTkRMRV9GREtfQklUU1RSRUFNICBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgKnBQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgIHJlYWREaXJlY3Rpb24pCi17Ci0gIFVJTlQgICBiaXQ7Ci0gIElOVCAgICByZWFkQml0T2Zmc2V0ID0gKnBQb3NpdGlvbi1GREtnZXRCaXRDbnQoYnMpOworVUNIQVIgcnZsY1JlYWRCaXRGcm9tQml0c3RyZWFtKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBJTlQgKnBQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiByZWFkRGlyZWN0aW9uKSB7CisgIFVJTlQgYml0OworICBJTlQgcmVhZEJpdE9mZnNldCA9ICpwUG9zaXRpb24gLSBGREtnZXRCaXRDbnQoYnMpOwogCi0gIGlmKCByZWFkQml0T2Zmc2V0ICkgeworICBpZiAocmVhZEJpdE9mZnNldCkgewogICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGJzLCByZWFkQml0T2Zmc2V0KTsKICAgfQogCkBAIC0xMjgsNCArMTQ2LDMgQEAKIAogICByZXR1cm4gKGJpdCk7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvcnZsY2JpdC5oIGIvbGliQUFDZGVjL3NyYy9ydmxjYml0LmgKaW5kZXggMDJmYmE4OC4uNWM2YTNmMSAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9ydmxjYml0LmgKKysrIGIvbGliQUFDZGVjL3NyYy9ydmxjYml0LmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTEgKzkwLDEyIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIFJvYmVydCBXZWlkbmVyIChEU1AgU29sdXRpb25zKQorCiAgICBEZXNjcmlwdGlvbjogUlZMQyBEZWNvZGVyOiBCaXRzdHJlYW0gcmVhZGluZwogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTEsMTMgKzEwMyw5IEBACiAjaWZuZGVmIFJWTENCSVRfSAogI2RlZmluZSBSVkxDQklUX0gKIAotCi0KICNpbmNsdWRlICJydmxjLmgiCiAKLVVDSEFSIHJ2bGNSZWFkQml0RnJvbUJpdHN0cmVhbSAoSEFORExFX0ZES19CSVRTVFJFQU0gIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAqcFBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgcmVhZERpcmVjdGlvbik7Ci0KK1VDSEFSIHJ2bGNSZWFkQml0RnJvbUJpdHN0cmVhbShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgSU5UICpwUG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgcmVhZERpcmVjdGlvbik7CiAKICNlbmRpZiAvKiBSVkxDQklUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvcnZsY2NvbmNlYWwuY3BwIGIvbGliQUFDZGVjL3NyYy9ydmxjY29uY2VhbC5jcHAKaW5kZXggY2YzM2RkNS4uNzdmZGE2OCAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9ydmxjY29uY2VhbC5jcHAKKysrIGIvbGliQUFDZGVjL3NyYy9ydmxjY29uY2VhbC5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNyArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKQEAgLTg5LDM3ICsxMDgsMzMgQEAKIAogI2luY2x1ZGUgInJ2bGNjb25jZWFsLmgiCiAKLQogI2luY2x1ZGUgImJsb2NrLmgiCiAjaW5jbHVkZSAicnZsYy5oIgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBmdW5jdGlvbjogICAgICBjYWxjUmVmVmFsRndkCiAKLSAgZGVzY3JpcHRpb246ICAgVGhlIGZ1bmN0aW9uIGRldGVybWluZXMgdGhlIHNjYWxlZmFjdG9yIHdoaWNoIGlzIGNsb3NlZCB0byB0aGUgc2NhbGVmYWN0b3JiYW5kCi0gICAgICAgICAgICAgICAgIGNvbmNlYWxfbWluLiBUaGUgc2FtZSBpcyBkb25lIGZvciBpbnRlbnNpdHkgZGF0YSBhbmQgbm9pc2UgZW5lcmdpZXMuCisgIGRlc2NyaXB0aW9uOiAgIFRoZSBmdW5jdGlvbiBkZXRlcm1pbmVzIHRoZSBzY2FsZWZhY3RvciB3aGljaCBpcyBjbG9zZWQgdG8gdGhlCitzY2FsZWZhY3RvcmJhbmQgY29uY2VhbF9taW4uIFRoZSBzYW1lIGlzIGRvbmUgZm9yIGludGVuc2l0eSBkYXRhIGFuZCBub2lzZQorZW5lcmdpZXMuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBvdXRwdXQ6ICAgICAgICAtIHJlZmVyZW5jZSB2YWx1ZSBzY2YKICAgICAgICAgICAgICAgICAgLSByZWZlcmVuY2UgdmFsdWUgaW50ZXJuc2l0eSBkYXRhCiAgICAgICAgICAgICAgICAgIC0gcmVmZXJlbmNlIHZhbHVlIG5vaXNlIGVuZXJneQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgcmV0dXJuOiAgICAgICAgLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLwogCi1zdGF0aWMKLXZvaWQgY2FsY1JlZlZhbEZ3ZCAoQ0VyUnZsY0luZm8gKnBSdmxjLAotICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICBpbnQgKnJlZklzRndkLAotICAgICAgICAgICAgICAgICAgICBpbnQgKnJlZk5yZ0Z3ZCwKLSAgICAgICAgICAgICAgICAgICAgaW50ICpyZWZTY2ZGd2QpCi17Ci0gIGludCBiYW5kLGJuZHMsZ3JvdXAsc3RhcnRCYW5kOwotICBpbnQgaWRJcyxpZE5yZyxpZFNjZjsKLSAgaW50IGNvbmNlYWxfbWluLGNvbmNlYWxfZ3JvdXBfbWluOworc3RhdGljIHZvaWQgY2FsY1JlZlZhbEZ3ZChDRXJSdmxjSW5mbyAqcFJ2bGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcmVmSXNGd2QsIGludCAqcmVmTnJnRndkLCBpbnQgKnJlZlNjZkZ3ZCkgeworICBpbnQgYmFuZCwgYm5kcywgZ3JvdXAsIHN0YXJ0QmFuZDsKKyAgaW50IGlkSXMsIGlkTnJnLCBpZFNjZjsKKyAgaW50IGNvbmNlYWxfbWluLCBjb25jZWFsX2dyb3VwX21pbjsKICAgaW50IE1heGltdW1TY2FsZUZhY3RvckJhbmRzOwogCi0KLSAgaWYgKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSA9PSBFaWdodFNob3J0U2VxdWVuY2UpCisgIGlmIChHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykgPT0gQkxPQ0tfU0hPUlQpCiAgICAgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHMgPSAxNjsKICAgZWxzZQogICAgIE1heGltdW1TY2FsZUZhY3RvckJhbmRzID0gNjQ7CkBAIC0xMzEsNjkgKzE0Niw3MSBAQAogICBpZElzID0gaWROcmcgPSBpZFNjZiA9IDE7CiAKICAgLyogc2V0IHJlZmVyZW5jZSB2YWx1ZXMgKi8KLSAgKnJlZklzRndkID0gLSBTRl9PRkZTRVQ7Ci0gICpyZWZOcmdGd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uR2xvYmFsR2FpbiAtIFNGX09GRlNFVCAtIDkwIC0gMjU2OwotICAqcmVmU2NmRndkID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPlJhd0RhdGFJbmZvLkdsb2JhbEdhaW4gLSBTRl9PRkZTRVQ7CisgICpyZWZJc0Z3ZCA9IC1TRl9PRkZTRVQ7CisgICpyZWZOcmdGd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uR2xvYmFsR2FpbiAtCisgICAgICAgICAgICAgICBTRl9PRkZTRVQgLSA5MCAtIDI1NjsKKyAgKnJlZlNjZkZ3ZCA9CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+UmF3RGF0YUluZm8uR2xvYmFsR2FpbiAtIFNGX09GRlNFVDsKIAotICBzdGFydEJhbmQgPSBjb25jZWFsX21pbi0xOwotICBmb3IgKGdyb3VwPWNvbmNlYWxfZ3JvdXBfbWluOyBncm91cCA+PSAwOyBncm91cC0tKSB7Ci0gICAgZm9yIChiYW5kPXN0YXJ0QmFuZDsgYmFuZCA+PSAwOyBiYW5kLS0pIHsKLSAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOworICBzdGFydEJhbmQgPSBjb25jZWFsX21pbiAtIDE7CisgIGZvciAoZ3JvdXAgPSBjb25jZWFsX2dyb3VwX21pbjsgZ3JvdXAgPj0gMDsgZ3JvdXAtLSkgeworICAgIGZvciAoYmFuZCA9IHN0YXJ0QmFuZDsgYmFuZCA+PSAwOyBiYW5kLS0pIHsKKyAgICAgIGJuZHMgPSAxNiAqIGdyb3VwICsgYmFuZDsKICAgICAgIHN3aXRjaCAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9va1tibmRzXSkgewogICAgICAgICBjYXNlIFpFUk9fSENCOgogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0I6CiAgICAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjI6CiAgICAgICAgICAgaWYgKGlkSXMpIHsKLSAgICAgICAgICAgICpyZWZJc0Z3ZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKLSAgICAgICAgICAgIGlkSXM9MDsgLyogcmVmZXJlbmNlIHZhbHVlIGhhcyBiZWVuIHNldCAqLworICAgICAgICAgICAgKnJlZklzRndkID0KKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107CisgICAgICAgICAgICBpZElzID0gMDsgLyogcmVmZXJlbmNlIHZhbHVlIGhhcyBiZWVuIHNldCAqLwogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBOT0lTRV9IQ0I6CiAgICAgICAgICAgaWYgKGlkTnJnKSB7Ci0gICAgICAgICAgICAqcmVmTnJnRndkID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOwotICAgICAgICAgICAgaWROcmc9MDsgLyogcmVmZXJlbmNlIHZhbHVlIGhhcyBiZWVuIHNldCAqLworICAgICAgICAgICAgKnJlZk5yZ0Z3ZCA9CisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOworICAgICAgICAgICAgaWROcmcgPSAwOyAvKiByZWZlcmVuY2UgdmFsdWUgaGFzIGJlZW4gc2V0ICovCiAgICAgICAgICAgfQotICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICBpZiAoaWRTY2YpIHsKLSAgICAgICAgICAgICpyZWZTY2ZGd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107Ci0gICAgICAgICAgICBpZFNjZj0wOyAvKiByZWZlcmVuY2UgdmFsdWUgaGFzIGJlZW4gc2V0ICovCisgICAgICAgICAgICAqcmVmU2NmRndkID0KKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107CisgICAgICAgICAgICBpZFNjZiA9IDA7IC8qIHJlZmVyZW5jZSB2YWx1ZSBoYXMgYmVlbiBzZXQgKi8KICAgICAgICAgICB9CiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQotICAgIHN0YXJ0QmFuZCA9IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZC0xOworICAgIHN0YXJ0QmFuZCA9IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZCAtIDE7CiAgIH0KLQogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBmdW5jdGlvbjogICAgICBjYWxjUmVmVmFsQndkCiAKLSAgZGVzY3JpcHRpb246ICAgVGhlIGZ1bmN0aW9uIGRldGVybWluZXMgdGhlIHNjYWxlZmFjdG9yIHdoaWNoIGlzIGNsb3NlZCB0byB0aGUgc2NhbGVmYWN0b3JiYW5kCi0gICAgICAgICAgICAgICAgIGNvbmNlYWxfbWF4LiBUaGUgc2FtZSBpcyBkb25lIGZvciBpbnRlbnNpdHkgZGF0YSBhbmQgbm9pc2UgZW5lcmdpZXMuCisgIGRlc2NyaXB0aW9uOiAgIFRoZSBmdW5jdGlvbiBkZXRlcm1pbmVzIHRoZSBzY2FsZWZhY3RvciB3aGljaCBpcyBjbG9zZWQgdG8gdGhlCitzY2FsZWZhY3RvcmJhbmQgY29uY2VhbF9tYXguIFRoZSBzYW1lIGlzIGRvbmUgZm9yIGludGVuc2l0eSBkYXRhIGFuZCBub2lzZQorZW5lcmdpZXMuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBvdXRwdXQ6ICAgICAgICAtIHJlZmVyZW5jZSB2YWx1ZSBzY2YKICAgICAgICAgICAgICAgICAgLSByZWZlcmVuY2UgdmFsdWUgaW50ZXJuc2l0eSBkYXRhCiAgICAgICAgICAgICAgICAgIC0gcmVmZXJlbmNlIHZhbHVlIG5vaXNlIGVuZXJneQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgcmV0dXJuOiAgICAgICAgLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLwogCi1zdGF0aWMKLXZvaWQgY2FsY1JlZlZhbEJ3ZCAoQ0VyUnZsY0luZm8gKnBSdmxjLAotICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICBpbnQgKnJlZklzQndkLAotICAgICAgICAgICAgICAgICAgICBpbnQgKnJlZk5yZ0J3ZCwKLSAgICAgICAgICAgICAgICAgICAgaW50ICpyZWZTY2ZCd2QpCi17Ci0gIGludCBiYW5kLGJuZHMsZ3JvdXAsc3RhcnRCYW5kOwotICBpbnQgaWRJcyxpZE5yZyxpZFNjZjsKLSAgaW50IGNvbmNlYWxfbWF4LGNvbmNlYWxfZ3JvdXBfbWF4Oworc3RhdGljIHZvaWQgY2FsY1JlZlZhbEJ3ZChDRXJSdmxjSW5mbyAqcFJ2bGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcmVmSXNCd2QsIGludCAqcmVmTnJnQndkLCBpbnQgKnJlZlNjZkJ3ZCkgeworICBpbnQgYmFuZCwgYm5kcywgZ3JvdXAsIHN0YXJ0QmFuZDsKKyAgaW50IGlkSXMsIGlkTnJnLCBpZFNjZjsKKyAgaW50IGNvbmNlYWxfbWF4LCBjb25jZWFsX2dyb3VwX21heDsKICAgaW50IE1heGltdW1TY2FsZUZhY3RvckJhbmRzOwogCi0gIGlmIChHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykgPT0gRWlnaHRTaG9ydFNlcXVlbmNlKQorICBpZiAoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pID09IEJMT0NLX1NIT1JUKQogICAgIE1heGltdW1TY2FsZUZhY3RvckJhbmRzID0gMTY7CiAgIGVsc2UKICAgICBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kcyA9IDY0OwpAQCAtMjA2LDg2ICsyMjMsOTEgQEAKIAogICAvKiBzZXQgcmVmZXJlbmNlIHZhbHVlcyAqLwogICAqcmVmSXNCd2QgPSBwUnZsYy0+ZHBjbV9pc19sYXN0X3Bvc2l0aW9uIC0gU0ZfT0ZGU0VUOwotICAqcmVmTnJnQndkID0gcFJ2bGMtPnJldl9nbG9iYWxfZ2FpbiArIHBSdmxjLT5kcGNtX25vaXNlX2xhc3RfcG9zaXRpb24gLSBTRl9PRkZTRVQgLSA5MCAtIDI1NiArIHBSdmxjLT5kcGNtX25vaXNlX25yZzsKKyAgKnJlZk5yZ0J3ZCA9IHBSdmxjLT5yZXZfZ2xvYmFsX2dhaW4gKyBwUnZsYy0+ZHBjbV9ub2lzZV9sYXN0X3Bvc2l0aW9uIC0KKyAgICAgICAgICAgICAgIFNGX09GRlNFVCAtIDkwIC0gMjU2ICsgcFJ2bGMtPmRwY21fbm9pc2VfbnJnOwogICAqcmVmU2NmQndkID0gcFJ2bGMtPnJldl9nbG9iYWxfZ2FpbiAtIFNGX09GRlNFVDsKIAotICBzdGFydEJhbmQ9Y29uY2VhbF9tYXgrMTsKKyAgc3RhcnRCYW5kID0gY29uY2VhbF9tYXggKyAxOwogCiAgIC8qIGlmIG5lZWRlZCwgcmUtc2V0IHJlZmVyZW5jZSB2YWx1ZXMgKi8KLSAgZm9yIChncm91cD1jb25jZWFsX2dyb3VwX21heDsgZ3JvdXAgPCBwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKSB7Ci0gICAgZm9yIChiYW5kPXN0YXJ0QmFuZDsgYmFuZCA8IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgYmFuZCsrKSB7Ci0gICAgICBibmRzID0gMTYqZ3JvdXArYmFuZDsKKyAgZm9yIChncm91cCA9IGNvbmNlYWxfZ3JvdXBfbWF4OyBncm91cCA8IHBSdmxjLT5udW1XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKKyAgICBmb3IgKGJhbmQgPSBzdGFydEJhbmQ7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgYm5kcyA9IDE2ICogZ3JvdXAgKyBiYW5kOwogICAgICAgc3dpdGNoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rW2JuZHNdKSB7CiAgICAgICAgIGNhc2UgWkVST19IQ0I6CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjoKICAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCMjoKICAgICAgICAgICBpZiAoaWRJcykgewotICAgICAgICAgICAgKnJlZklzQndkID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdOwotICAgICAgICAgICAgaWRJcz0wOyAvKiByZWZlcmVuY2UgdmFsdWUgaGFzIGJlZW4gc2V0ICovCisgICAgICAgICAgICAqcmVmSXNCd2QgPQorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKKyAgICAgICAgICAgIGlkSXMgPSAwOyAvKiByZWZlcmVuY2UgdmFsdWUgaGFzIGJlZW4gc2V0ICovCiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE5PSVNFX0hDQjoKICAgICAgICAgICBpZiAoaWROcmcpIHsKLSAgICAgICAgICAgICpyZWZOcmdCd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107Ci0gICAgICAgICAgICBpZE5yZz0wOyAgLyogcmVmZXJlbmNlIHZhbHVlIGhhcyBiZWVuIHNldCAqLworICAgICAgICAgICAgKnJlZk5yZ0J3ZCA9CisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdOworICAgICAgICAgICAgaWROcmcgPSAwOyAvKiByZWZlcmVuY2UgdmFsdWUgaGFzIGJlZW4gc2V0ICovCiAgICAgICAgICAgfQotICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICBpZiAoaWRTY2YpIHsKLSAgICAgICAgICAgICpyZWZTY2ZCd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107Ci0gICAgICAgICAgICBpZFNjZj0wOyAvKiByZWZlcmVuY2UgdmFsdWUgaGFzIGJlZW4gc2V0ICovCisgICAgICAgICAgICAqcmVmU2NmQndkID0KKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CisgICAgICAgICAgICBpZFNjZiA9IDA7IC8qIHJlZmVyZW5jZSB2YWx1ZSBoYXMgYmVlbiBzZXQgKi8KICAgICAgICAgICB9CiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQotICAgIHN0YXJ0QmFuZD0wOworICAgIHN0YXJ0QmFuZCA9IDA7CiAgIH0KLQogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIGZ1bmN0aW9uOiAgICAgIEJpZGlyZWN0aW9uYWxFc3RpbWF0aW9uX1VzZUxvd2VyU2NmT2ZDdXJyZW50RnJhbWUKIAotICBkZXNjcmlwdGlvbjogICBUaGlzIGFwcHJvYWNoIGJ5IG1lYW5zIG9mIGJpZGlyZWN0aW9uYWwgZXN0aW1hdGlvbiBpcyBnZW5lcmFsbHkgcGVyZm9ybWVkIHdoZW4KLSAgICAgICAgICAgICAgICAgYSBzaW5nbGUgYml0IGVycm9yIGhhcyBiZWVuIGRldGVjdGVkLCB0aGUgYml0IGVycm9yIGNhbiBiZSBpc29sYXRlZCBiZXR3ZWVuCi0gICAgICAgICAgICAgICAgICdjb25jZWFsX21pbicgYW5kICdjb25jZWFsX21heCcgYW5kIHRoZSAnc2ZfY29uY2VhbG1lbnQnIGZsYWcgaXMgbm90IHNldC4gVGhlCi0gICAgICAgICAgICAgICAgIHNldHMgb2Ygc2NhbGVmYWN0b3JzIGRlY29kZWQgaW4gZm9yd2FyZCBhbmQgYmFja3dhcmQgZGlyZWN0aW9uIGFyZSBjb21wYXJlZAotICAgICAgICAgICAgICAgICB3aXRoIGVhY2ggb3RoZXIuIFRoZSBzbWFsbGVyIHNjYWxlZmFjdG9yIHdpbGwgYmUgY29uc2lkZXJlZCBhcyB0aGUgY29ycmVjdCBvbmUKLSAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LiBUaGUgcmVjb25zdHJ1Y3Rpb24gb2YgdGhlIHNjYWxlZmFjdG9ycyB3aXRoIHRoaXMgYXBwcm9hY2ggYXJjaGlldmUKLSAgICAgICAgICAgICAgICAgZ29vZCByZXN1bHRzIGluIGF1ZGlvIHF1YWxpdHkuIFRoZSBzdHJhdGVneSBtdXN0IGJlIGFwcGxpZWQgdG8gc2NhbGVmYWN0b3JzLAotICAgICAgICAgICAgICAgICBpbnRlbnNpdHkgZGF0YSBhbmQgbm9pc2UgZW5lcmd5IHNlcGVyYXRlbHkuCisgIGRlc2NyaXB0aW9uOiAgIFRoaXMgYXBwcm9hY2ggYnkgbWVhbnMgb2YgYmlkaXJlY3Rpb25hbCBlc3RpbWF0aW9uIGlzIGdlbmVyYWxseQorcGVyZm9ybWVkIHdoZW4gYSBzaW5nbGUgYml0IGVycm9yIGhhcyBiZWVuIGRldGVjdGVkLCB0aGUgYml0IGVycm9yIGNhbiBiZQoraXNvbGF0ZWQgYmV0d2VlbiAnY29uY2VhbF9taW4nIGFuZCAnY29uY2VhbF9tYXgnIGFuZCB0aGUgJ3NmX2NvbmNlYWxtZW50JyBmbGFnCitpcyBub3Qgc2V0LiBUaGUgc2V0cyBvZiBzY2FsZWZhY3RvcnMgZGVjb2RlZCBpbiBmb3J3YXJkIGFuZCBiYWNrd2FyZCBkaXJlY3Rpb24KK2FyZSBjb21wYXJlZCB3aXRoIGVhY2ggb3RoZXIuIFRoZSBzbWFsbGVyIHNjYWxlZmFjdG9yIHdpbGwgYmUgY29uc2lkZXJlZCBhcyB0aGUKK2NvcnJlY3Qgb25lIHJlc3BlY3RpdmVseS4gVGhlIHJlY29uc3RydWN0aW9uIG9mIHRoZSBzY2FsZWZhY3RvcnMgd2l0aCB0aGlzCithcHByb2FjaCBhcmNoaWV2ZSBnb29kIHJlc3VsdHMgaW4gYXVkaW8gcXVhbGl0eS4gVGhlIHN0cmF0ZWd5IG11c3QgYmUgYXBwbGllZCB0bworc2NhbGVmYWN0b3JzLCBpbnRlbnNpdHkgZGF0YSBhbmQgbm9pc2UgZW5lcmd5IHNlcGVyYXRlbHkuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBvdXRwdXQ6ICAgICAgICBDb25jZWFsZWQgc2NhbGVmYWN0b3IsIG5vaXNlIGVuZXJneSBhbmQgaW50ZW5zaXR5IGRhdGEgYmV0d2VlbiBjb25jZWFsX21pbiBhbmQKLSAgICAgICAgICAgICAgICAgY29uY2VhbF9tYXgKKyAgb3V0cHV0OiAgICAgICAgQ29uY2VhbGVkIHNjYWxlZmFjdG9yLCBub2lzZSBlbmVyZ3kgYW5kIGludGVuc2l0eSBkYXRhIGJldHdlZW4KK2NvbmNlYWxfbWluIGFuZCBjb25jZWFsX21heAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgcmV0dXJuOiAgICAgICAgLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLwogCi12b2lkIEJpZGlyZWN0aW9uYWxFc3RpbWF0aW9uX1VzZUxvd2VyU2NmT2ZDdXJyZW50RnJhbWUgKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pCi17Ci0gIENFclJ2bGNJbmZvICpwUnZsYyA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuZXJSdmxjSW5mbzsKLSAgaW50IGJhbmQsYm5kcyxzdGFydEJhbmQsZW5kQmFuZCxncm91cDsKLSAgaW50IGNvbmNlYWxfbWluLGNvbmNlYWxfbWF4OwotICBpbnQgY29uY2VhbF9ncm91cF9taW4sY29uY2VhbF9ncm91cF9tYXg7Cit2b2lkIEJpZGlyZWN0aW9uYWxFc3RpbWF0aW9uX1VzZUxvd2VyU2NmT2ZDdXJyZW50RnJhbWUoCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbykgeworICBDRXJSdmxjSW5mbyAqcFJ2bGMgPQorICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5lclJ2bGNJbmZvOworICBpbnQgYmFuZCwgYm5kcywgc3RhcnRCYW5kLCBlbmRCYW5kLCBncm91cDsKKyAgaW50IGNvbmNlYWxfbWluLCBjb25jZWFsX21heDsKKyAgaW50IGNvbmNlYWxfZ3JvdXBfbWluLCBjb25jZWFsX2dyb3VwX21heDsKICAgaW50IE1heGltdW1TY2FsZUZhY3RvckJhbmRzOwogCi0gIGlmIChHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykgPT0gRWlnaHRTaG9ydFNlcXVlbmNlKSB7CisgIGlmIChHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykgPT0gQkxPQ0tfU0hPUlQpIHsKICAgICBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kcyA9IDE2OwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIE1heGltdW1TY2FsZUZhY3RvckJhbmRzID0gNjQ7CiAgIH0KLSAgCi0gIC8qIElmIGFuIGVycm9yIHdhcyBkZXRlY3RlZCBqdXN0IGluIGZvcndhcmQgb3IgYmFja3dhcmQgZGlyZWN0aW9uLCBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgYm9yZGVyIGZvciBjb25jZWFsbWVudCB0byBhCi0gICAgIGFwcHJvcHJpYXRlIHNjYWxlZmFjdG9yIGJhbmQuIFRoZSBib3JkZXIgaXMgc2V0IHRvIGZpcnN0IG9yIGxhc3Qgc2ZiIHJlc3BlY3RpdmVseSwgYmVjYXVzZSB0aGUgZXJyb3Igd2lsbCBwb3NzaWJseSAKLSAgICAgbm90IGZvbGxvdyBkaXJlY3RseSBhZnRlciB0aGUgY29ycnVwdCBiaXQgYnV0IGp1c3QgYWZ0ZXIgZGVjb2Rpbmcgc29tZSBtb3JlICh3cm9uZykgc2NhbGVmYWN0b3JzLiAqLwotICBpZiAocFJ2bGMtPmNvbmNlYWxfbWluID09IENPTkNFQUxfTUlOX0lOSVQpCi0gICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gMDsKKworICAvKiBJZiBhbiBlcnJvciB3YXMgZGV0ZWN0ZWQganVzdCBpbiBmb3J3YXJkIG9yIGJhY2t3YXJkIGRpcmVjdGlvbiwgc2V0IHRoZQorICAgICBjb3JyZXNwb25kaW5nIGJvcmRlciBmb3IgY29uY2VhbG1lbnQgdG8gYSBhcHByb3ByaWF0ZSBzY2FsZWZhY3RvciBiYW5kLiBUaGUKKyAgICAgYm9yZGVyIGlzIHNldCB0byBmaXJzdCBvciBsYXN0IHNmYiByZXNwZWN0aXZlbHksIGJlY2F1c2UgdGhlIGVycm9yIHdpbGwKKyAgICAgcG9zc2libHkgbm90IGZvbGxvdyBkaXJlY3RseSBhZnRlciB0aGUgY29ycnVwdCBiaXQgYnV0IGp1c3QgYWZ0ZXIgZGVjb2RpbmcKKyAgICAgc29tZSBtb3JlICh3cm9uZykgc2NhbGVmYWN0b3JzLiAqLworICBpZiAocFJ2bGMtPmNvbmNlYWxfbWluID09IENPTkNFQUxfTUlOX0lOSVQpIHBSdmxjLT5jb25jZWFsX21pbiA9IDA7CiAKICAgaWYgKHBSdmxjLT5jb25jZWFsX21heCA9PSBDT05DRUFMX01BWF9JTklUKQotICAgIHBSdmxjLT5jb25jZWFsX21heCA9IChwUnZsYy0+bnVtV2luZG93R3JvdXBzLTEpKjE2K3BSdmxjLT5tYXhTZmJUcmFuc21pdHRlZC0xOworICAgIHBSdmxjLT5jb25jZWFsX21heCA9CisgICAgICAgIChwUnZsYy0+bnVtV2luZG93R3JvdXBzIC0gMSkgKiAxNiArIHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZCAtIDE7CiAKICAgY29uY2VhbF9taW4gPSBwUnZsYy0+Y29uY2VhbF9taW4gJSBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKICAgY29uY2VhbF9ncm91cF9taW4gPSBwUnZsYy0+Y29uY2VhbF9taW4gLyBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKQEAgLTI5MywyMCArMzE1LDIxIEBACiAgIGNvbmNlYWxfZ3JvdXBfbWF4ID0gcFJ2bGMtPmNvbmNlYWxfbWF4IC8gTWF4aW11bVNjYWxlRmFjdG9yQmFuZHM7CiAKICAgaWYgKHBSdmxjLT5jb25jZWFsX21pbiA9PSBwUnZsYy0+Y29uY2VhbF9tYXgpIHsKLQotICAgIGludCByZWZJc0Z3ZCxyZWZOcmdGd2QscmVmU2NmRndkOwotICAgIGludCByZWZJc0J3ZCxyZWZOcmdCd2QscmVmU2NmQndkOworICAgIGludCByZWZJc0Z3ZCwgcmVmTnJnRndkLCByZWZTY2ZGd2Q7CisgICAgaW50IHJlZklzQndkLCByZWZOcmdCd2QsIHJlZlNjZkJ3ZDsKIAogICAgIGJuZHMgPSBwUnZsYy0+Y29uY2VhbF9taW47Ci0gICAgY2FsY1JlZlZhbEZ3ZChwUnZsYyxwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCZyZWZJc0Z3ZCwmcmVmTnJnRndkLCZyZWZTY2ZGd2QpOwotICAgIGNhbGNSZWZWYWxCd2QocFJ2bGMscEFhY0RlY29kZXJDaGFubmVsSW5mbywmcmVmSXNCd2QsJnJlZk5yZ0J3ZCwmcmVmU2NmQndkKTsKKyAgICBjYWxjUmVmVmFsRndkKHBSdmxjLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCAmcmVmSXNGd2QsICZyZWZOcmdGd2QsCisgICAgICAgICAgICAgICAgICAmcmVmU2NmRndkKTsKKyAgICBjYWxjUmVmVmFsQndkKHBSdmxjLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCAmcmVmSXNCd2QsICZyZWZOcmdCd2QsCisgICAgICAgICAgICAgICAgICAmcmVmU2NmQndkKTsKIAogICAgIHN3aXRjaCAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9va1tibmRzXSkgewogICAgICAgY2FzZSBaRVJPX0hDQjoKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0I6CiAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0IyOgotICAgICAgICBpZiAocmVmSXNGd2QgPCByZWZJc0J3ZCkgCisgICAgICAgIGlmIChyZWZJc0Z3ZCA8IHJlZklzQndkKQogICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSByZWZJc0Z3ZDsKICAgICAgICAgZWxzZQogICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSByZWZJc0J3ZDsKQEAgLTMyMCw1NSArMzQzLDY0IEBACiAgICAgICBkZWZhdWx0OgogICAgICAgICBpZiAocmVmU2NmRndkIDwgcmVmU2NmQndkKQogICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSByZWZTY2ZGd2Q7Ci0gICAgICAgIGVsc2UgCisgICAgICAgIGVsc2UKICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gcmVmU2NmQndkOwogICAgICAgICBicmVhazsKICAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW3BSdmxjLT5jb25jZWFsX21heF0gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbcFJ2bGMtPmNvbmNlYWxfbWF4XTsKLSAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbcFJ2bGMtPmNvbmNlYWxfbWluXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtwUnZsYy0+Y29uY2VhbF9taW5dOworICB9IGVsc2UgeworICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYworICAgICAgICAuYVJ2bGNTY2ZGd2RbcFJ2bGMtPmNvbmNlYWxfbWF4XSA9CisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYworICAgICAgICAgICAgLmFSdmxjU2NmQndkW3BSdmxjLT5jb25jZWFsX21heF07CisgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjCisgICAgICAgIC5hUnZsY1NjZkJ3ZFtwUnZsYy0+Y29uY2VhbF9taW5dID0KKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjCisgICAgICAgICAgICAuYVJ2bGNTY2ZGd2RbcFJ2bGMtPmNvbmNlYWxfbWluXTsKIAotICAgIC8qIGNvbnNpZGVyIHRoZSBzbWFsbGVyIG9mIHRoZSBmb3J3YXJkIGFuZCBiYWNrd2FyZCBkZWNvZGVkIHZhbHVlIGFzIHRoZSBjb3JyZWN0IG9uZSAqLyAgCi0gICAgc3RhcnRCYW5kID0gY29uY2VhbF9taW47ICAgICAgCi0gICAgaWYgKGNvbmNlYWxfZ3JvdXBfbWluID09IGNvbmNlYWxfZ3JvdXBfbWF4KSAgIAotICAgICAgZW5kQmFuZCA9IGNvbmNlYWxfbWF4OyAgICAgIAotICAgIGVsc2UgICAgICAgICAgCi0gICAgICBlbmRCYW5kID0gcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkLTE7ICAgICAgIAorICAgIC8qIGNvbnNpZGVyIHRoZSBzbWFsbGVyIG9mIHRoZSBmb3J3YXJkIGFuZCBiYWNrd2FyZCBkZWNvZGVkIHZhbHVlIGFzIHRoZQorICAgICAqIGNvcnJlY3Qgb25lICovCisgICAgc3RhcnRCYW5kID0gY29uY2VhbF9taW47CisgICAgaWYgKGNvbmNlYWxfZ3JvdXBfbWluID09IGNvbmNlYWxfZ3JvdXBfbWF4KQorICAgICAgZW5kQmFuZCA9IGNvbmNlYWxfbWF4OworICAgIGVsc2UKKyAgICAgIGVuZEJhbmQgPSBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQgLSAxOwogCi0gICAgZm9yIChncm91cD1jb25jZWFsX2dyb3VwX21pbjsgZ3JvdXAgPD0gY29uY2VhbF9ncm91cF9tYXg7IGdyb3VwKyspIHsgIAotICAgICAgZm9yIChiYW5kPXN0YXJ0QmFuZDsgYmFuZCA8PSBlbmRCYW5kOyBiYW5kKyspIHsgIAotICAgICAgICBibmRzID0gMTYqZ3JvdXArYmFuZDsgIAotICAgICAgICBpZiAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdIDwgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdKSAgCi0gICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKKyAgICBmb3IgKGdyb3VwID0gY29uY2VhbF9ncm91cF9taW47IGdyb3VwIDw9IGNvbmNlYWxfZ3JvdXBfbWF4OyBncm91cCsrKSB7CisgICAgICBmb3IgKGJhbmQgPSBzdGFydEJhbmQ7IGJhbmQgPD0gZW5kQmFuZDsgYmFuZCsrKSB7CisgICAgICAgIGJuZHMgPSAxNiAqIGdyb3VwICsgYmFuZDsKKyAgICAgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXSA8CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc10pCisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9CisgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKICAgICAgICAgZWxzZQotICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107Ci0gICAgICB9ICAKLSAgICAgIHN0YXJ0QmFuZCA9IDA7ICAgCi0gICAgICBpZiAoKGdyb3VwKzEpID09IGNvbmNlYWxfZ3JvdXBfbWF4KSAgCi0gICAgICAgIGVuZEJhbmQgPSBjb25jZWFsX21heDsgIAotICAgIH0gIAorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPQorICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CisgICAgICB9CisgICAgICBzdGFydEJhbmQgPSAwOworICAgICAgaWYgKChncm91cCArIDEpID09IGNvbmNlYWxfZ3JvdXBfbWF4KSBlbmRCYW5kID0gY29uY2VhbF9tYXg7CisgICAgfQogICB9CiAKICAgLyogbm93IGNvcHkgYWxsIGRhdGEgdG8gdGhlIG91dHB1dCBidWZmZXIgd2hpY2ggbmVlZHMgbm90IHRvIGJlIGNvbmNlYWxlZCAqLwotICBpZiAoY29uY2VhbF9ncm91cF9taW4gPT0gMCkgCi0gICAgZW5kQmFuZCA9IGNvbmNlYWxfbWluOyAgICAKLSAgZWxzZSAgICAgICAgCi0gICAgZW5kQmFuZCA9IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgICAgIAotICBmb3IgKGdyb3VwPTA7IGdyb3VwIDw9IGNvbmNlYWxfZ3JvdXBfbWluOyBncm91cCsrKSB7Ci0gICAgZm9yIChiYW5kPTA7IGJhbmQgPCBlbmRCYW5kOyBiYW5kKyspIHsKLSAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOwotICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKKyAgaWYgKGNvbmNlYWxfZ3JvdXBfbWluID09IDApCisgICAgZW5kQmFuZCA9IGNvbmNlYWxfbWluOworICBlbHNlCisgICAgZW5kQmFuZCA9IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsKKyAgZm9yIChncm91cCA9IDA7IGdyb3VwIDw9IGNvbmNlYWxfZ3JvdXBfbWluOyBncm91cCsrKSB7CisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IGVuZEJhbmQ7IGJhbmQrKykgeworICAgICAgYm5kcyA9IDE2ICogZ3JvdXAgKyBiYW5kOworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOwogICAgIH0KLSAgICBpZiAoKGdyb3VwKzEpID09IGNvbmNlYWxfZ3JvdXBfbWluKSAKLSAgICAgIGVuZEJhbmQgPSBjb25jZWFsX21pbjsgICAgCisgICAgaWYgKChncm91cCArIDEpID09IGNvbmNlYWxfZ3JvdXBfbWluKSBlbmRCYW5kID0gY29uY2VhbF9taW47CiAgIH0KIAotICBzdGFydEJhbmQgPSBjb25jZWFsX21heCsxOyAgICAKLSAgZm9yIChncm91cD1jb25jZWFsX2dyb3VwX21heDsgZ3JvdXAgPCBwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKSB7Ci0gICAgZm9yIChiYW5kPXN0YXJ0QmFuZDsgYmFuZCA8IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgYmFuZCsrKSB7Ci0gICAgICBibmRzID0gMTYqZ3JvdXArYmFuZDsKLSAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CisgIHN0YXJ0QmFuZCA9IGNvbmNlYWxfbWF4ICsgMTsKKyAgZm9yIChncm91cCA9IGNvbmNlYWxfZ3JvdXBfbWF4OyBncm91cCA8IHBSdmxjLT5udW1XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKKyAgICBmb3IgKGJhbmQgPSBzdGFydEJhbmQ7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgYm5kcyA9IDE2ICogZ3JvdXAgKyBiYW5kOworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdOwogICAgIH0KICAgICBzdGFydEJhbmQgPSAwOwogICB9CkBAIC0zNzcsNzEgKzQwOSw3OSBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgZnVuY3Rpb246ICAgICAgQmlkaXJlY3Rpb25hbEVzdGltYXRpb25fVXNlU2NmT2ZQcmV2RnJhbWVBc1JlZmVyZW5jZQogCi0gIGRlc2NyaXB0aW9uOiAgIFRoaXMgYXBwcm9hY2ggYnkgbWVhbnMgb2YgYmlkaXJlY3Rpb25hbCBlc3RpbWF0aW9uIGlzIGdlbmVyYWxseSBwZXJmb3JtZWQgd2hlbgotICAgICAgICAgICAgICAgICBhIHNpbmdsZSBiaXQgZXJyb3IgaGFzIGJlZW4gZGV0ZWN0ZWQsIHRoZSBiaXQgZXJyb3IgY2FuIGJlIGlzb2xhdGVkIGJldHdlZW4gCi0gICAgICAgICAgICAgICAgICdjb25jZWFsX21pbicgYW5kICdjb25jZWFsX21heCcsIHRoZSAnc2ZfY29uY2VhbG1lbnQnIGZsYWcgaXMgc2V0IGFuZCB0aGUgCi0gICAgICAgICAgICAgICAgIHByZXZpb3VzIGZyYW1lIGhhcyB0aGUgc2FtZSBibG9jayB0eXBlIGFzIHRoZSBjdXJyZW50IGZyYW1lLiBUaGUgc2NhbGVmYWN0b3IgCi0gICAgICAgICAgICAgICAgIGRlY29kZWQgaW4gZm9yd2FyZCBhbmQgYmFja3dhcmQgZGlyZWN0aW9uIGFuZCB0aGUgc2NhbGVmYWN0b3Igb2YgdGhlIHByZXZpb3VzIAotICAgICAgICAgICAgICAgICBmcmFtZSBhcmUgY29tcGFyZWQgd2l0aCBlYWNoIG90aGVyLiBUaGUgc21hbGxlciBzY2FsZWZhY3RvciB3aWxsIGJlIGNvbnNpZGVyZWQgCi0gICAgICAgICAgICAgICAgIGFzIHRoZSBjb3JyZWN0IG9uZS4gQXQgdGhpcyB0aGUgY29kZWJvb2sgb2YgdGhlIHByZXZpb3VzIGFuZCBjdXJyZW50IGZyYW1lIG11c3QgCi0gICAgICAgICAgICAgICAgIGJlIG9mIHRoZSBzYW1lIHNldCAoc2NmLCBucmcsIGlzKSBpbiBlYWNoIHNjYWxlZmFjdG9yYmFuZC4gT3RoZXJ3aXNlIHRoZSAKLSAgICAgICAgICAgICAgICAgc2NhbGVmYWN0b3Igb2YgdGhlIHByZXZpb3VzIGZyYW1lIGlzIG5vdCBjb25zaWRlcmVkIGluIHRoZSBtaW5pbXVtIGNhbGN1bGF0aW9uLiAKLSAgICAgICAgICAgICAgICAgVGhlIHJlY29uc3RydWN0aW9uIG9mIHRoZSBzY2FsZWZhY3RvcnMgd2l0aCB0aGlzIGFwcHJvYWNoIGFyY2hpZXZlIGdvb2QgcmVzdWx0cyAKLSAgICAgICAgICAgICAgICAgaW4gYXVkaW8gcXVhbGl0eS4gVGhlIHN0cmF0ZWd5IG11c3QgYmUgYXBwbGllZCB0byBzY2FsZWZhY3RvcnMsIGludGVuc2l0eSBkYXRhIAotICAgICAgICAgICAgICAgICBhbmQgbm9pc2UgZW5lcmd5IHNlcGVyYXRlbHkuCisgIGRlc2NyaXB0aW9uOiAgIFRoaXMgYXBwcm9hY2ggYnkgbWVhbnMgb2YgYmlkaXJlY3Rpb25hbCBlc3RpbWF0aW9uIGlzIGdlbmVyYWxseQorcGVyZm9ybWVkIHdoZW4gYSBzaW5nbGUgYml0IGVycm9yIGhhcyBiZWVuIGRldGVjdGVkLCB0aGUgYml0IGVycm9yIGNhbiBiZQoraXNvbGF0ZWQgYmV0d2VlbiAnY29uY2VhbF9taW4nIGFuZCAnY29uY2VhbF9tYXgnLCB0aGUgJ3NmX2NvbmNlYWxtZW50JyBmbGFnIGlzCitzZXQgYW5kIHRoZSBwcmV2aW91cyBmcmFtZSBoYXMgdGhlIHNhbWUgYmxvY2sgdHlwZSBhcyB0aGUgY3VycmVudCBmcmFtZS4gVGhlCitzY2FsZWZhY3RvciBkZWNvZGVkIGluIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRpcmVjdGlvbiBhbmQgdGhlIHNjYWxlZmFjdG9yIG9mIHRoZQorcHJldmlvdXMgZnJhbWUgYXJlIGNvbXBhcmVkIHdpdGggZWFjaCBvdGhlci4gVGhlIHNtYWxsZXIgc2NhbGVmYWN0b3Igd2lsbCBiZQorY29uc2lkZXJlZCBhcyB0aGUgY29ycmVjdCBvbmUuIEF0IHRoaXMgdGhlIGNvZGVib29rIG9mIHRoZSBwcmV2aW91cyBhbmQgY3VycmVudAorZnJhbWUgbXVzdCBiZSBvZiB0aGUgc2FtZSBzZXQgKHNjZiwgbnJnLCBpcykgaW4gZWFjaCBzY2FsZWZhY3RvcmJhbmQuIE90aGVyd2lzZQordGhlIHNjYWxlZmFjdG9yIG9mIHRoZSBwcmV2aW91cyBmcmFtZSBpcyBub3QgY29uc2lkZXJlZCBpbiB0aGUgbWluaW11bQorY2FsY3VsYXRpb24uIFRoZSByZWNvbnN0cnVjdGlvbiBvZiB0aGUgc2NhbGVmYWN0b3JzIHdpdGggdGhpcyBhcHByb2FjaCBhcmNoaWV2ZQorZ29vZCByZXN1bHRzIGluIGF1ZGlvIHF1YWxpdHkuIFRoZSBzdHJhdGVneSBtdXN0IGJlIGFwcGxpZWQgdG8gc2NhbGVmYWN0b3JzLAoraW50ZW5zaXR5IGRhdGEgYW5kIG5vaXNlIGVuZXJneSBzZXBlcmF0ZWx5LgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgb3V0cHV0OiAgICAgICAgQ29uY2VhbGVkIHNjYWxlZmFjdG9yLCBub2lzZSBlbmVyZ3kgYW5kIGludGVuc2l0eSBkYXRhIGJldHdlZW4gY29uY2VhbF9taW4gYW5kIAotICAgICAgICAgICAgICAgICBjb25jZWFsX21heAorICBvdXRwdXQ6ICAgICAgICBDb25jZWFsZWQgc2NhbGVmYWN0b3IsIG5vaXNlIGVuZXJneSBhbmQgaW50ZW5zaXR5IGRhdGEgYmV0d2VlbgorY29uY2VhbF9taW4gYW5kIGNvbmNlYWxfbWF4CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICByZXR1cm46ICAgICAgICAtCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLXZvaWQgQmlkaXJlY3Rpb25hbEVzdGltYXRpb25fVXNlU2NmT2ZQcmV2RnJhbWVBc1JlZmVyZW5jZSAoCi0gICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8KLSAgICAgICAgKQotewotICBDRXJSdmxjSW5mbyAqcFJ2bGMgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmVyUnZsY0luZm87Ci0gIGludCBiYW5kLGJuZHMsc3RhcnRCYW5kLGVuZEJhbmQsZ3JvdXA7Ci0gIGludCBjb25jZWFsX21pbixjb25jZWFsX21heDsKLSAgaW50IGNvbmNlYWxfZ3JvdXBfbWluLGNvbmNlYWxfZ3JvdXBfbWF4Owordm9pZCBCaWRpcmVjdGlvbmFsRXN0aW1hdGlvbl9Vc2VTY2ZPZlByZXZGcmFtZUFzUmVmZXJlbmNlKAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbykgeworICBDRXJSdmxjSW5mbyAqcFJ2bGMgPQorICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5lclJ2bGNJbmZvOworICBpbnQgYmFuZCwgYm5kcywgc3RhcnRCYW5kLCBlbmRCYW5kLCBncm91cDsKKyAgaW50IGNvbmNlYWxfbWluLCBjb25jZWFsX21heDsKKyAgaW50IGNvbmNlYWxfZ3JvdXBfbWluLCBjb25jZWFsX2dyb3VwX21heDsKICAgaW50IE1heGltdW1TY2FsZUZhY3RvckJhbmRzOwotICBpbnQgY29tbW9uTWluOworICBTSE9SVCBjb21tb25NaW47CiAKLSAgaWYgKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSA9PSBFaWdodFNob3J0U2VxdWVuY2UpIHsKKyAgaWYgKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSA9PSBCTE9DS19TSE9SVCkgewogICAgIE1heGltdW1TY2FsZUZhY3RvckJhbmRzID0gMTY7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHMgPSA2NDsKICAgfQogCi0gIC8qIElmIGFuIGVycm9yIHdhcyBkZXRlY3RlZCBqdXN0IGluIGZvcndhcmQgb3IgYmFja3dhcmQgZGlyZWN0aW9uLCBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgYm9yZGVyIGZvciBjb25jZWFsbWVudCB0byBhCi0gICAgIGFwcHJvcHJpYXRlIHNjYWxlZmFjdG9yIGJhbmQuIFRoZSBib3JkZXIgaXMgc2V0IHRvIGZpcnN0IG9yIGxhc3Qgc2ZiIHJlc3BlY3RpdmVseSwgYmVjYXVzZSB0aGUgZXJyb3Igd2lsbCBwb3NzaWJseSAKLSAgICAgbm90IGZvbGxvdyBkaXJlY3RseSBhZnRlciB0aGUgY29ycnVwdCBiaXQgYnV0IGp1c3QgYWZ0ZXIgZGVjb2Rpbmcgc29tZSBtb3JlICh3cm9uZykgc2NhbGVmYWN0b3JzLiAqLwotICBpZiAocFJ2bGMtPmNvbmNlYWxfbWluID09IENPTkNFQUxfTUlOX0lOSVQpCi0gICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gMDsKKyAgLyogSWYgYW4gZXJyb3Igd2FzIGRldGVjdGVkIGp1c3QgaW4gZm9yd2FyZCBvciBiYWNrd2FyZCBkaXJlY3Rpb24sIHNldCB0aGUKKyAgICAgY29ycmVzcG9uZGluZyBib3JkZXIgZm9yIGNvbmNlYWxtZW50IHRvIGEgYXBwcm9wcmlhdGUgc2NhbGVmYWN0b3IgYmFuZC4gVGhlCisgICAgIGJvcmRlciBpcyBzZXQgdG8gZmlyc3Qgb3IgbGFzdCBzZmIgcmVzcGVjdGl2ZWx5LCBiZWNhdXNlIHRoZSBlcnJvciB3aWxsCisgICAgIHBvc3NpYmx5IG5vdCBmb2xsb3cgZGlyZWN0bHkgYWZ0ZXIgdGhlIGNvcnJ1cHQgYml0IGJ1dCBqdXN0IGFmdGVyIGRlY29kaW5nCisgICAgIHNvbWUgbW9yZSAod3JvbmcpIHNjYWxlZmFjdG9ycy4gKi8KKyAgaWYgKHBSdmxjLT5jb25jZWFsX21pbiA9PSBDT05DRUFMX01JTl9JTklUKSBwUnZsYy0+Y29uY2VhbF9taW4gPSAwOwogCiAgIGlmIChwUnZsYy0+Y29uY2VhbF9tYXggPT0gQ09OQ0VBTF9NQVhfSU5JVCkKLSAgICBwUnZsYy0+Y29uY2VhbF9tYXggPSAocFJ2bGMtPm51bVdpbmRvd0dyb3Vwcy0xKSoxNitwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQtMTsKKyAgICBwUnZsYy0+Y29uY2VhbF9tYXggPQorICAgICAgICAocFJ2bGMtPm51bVdpbmRvd0dyb3VwcyAtIDEpICogMTYgKyBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQgLSAxOwogCiAgIGNvbmNlYWxfbWluID0gcFJ2bGMtPmNvbmNlYWxfbWluICUgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHM7CiAgIGNvbmNlYWxfZ3JvdXBfbWluID0gcFJ2bGMtPmNvbmNlYWxfbWluIC8gTWF4aW11bVNjYWxlRmFjdG9yQmFuZHM7CiAgIGNvbmNlYWxfbWF4ID0gcFJ2bGMtPmNvbmNlYWxfbWF4ICUgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHM7CiAgIGNvbmNlYWxfZ3JvdXBfbWF4ID0gcFJ2bGMtPmNvbmNlYWxfbWF4IC8gTWF4aW11bVNjYWxlRmFjdG9yQmFuZHM7CiAKLSAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW3BSdmxjLT5jb25jZWFsX21heF0gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbcFJ2bGMtPmNvbmNlYWxfbWF4XTsgIAotICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbcFJ2bGMtPmNvbmNlYWxfbWluXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtwUnZsYy0+Y29uY2VhbF9taW5dOyAgCisgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYworICAgICAgLmFSdmxjU2NmRndkW3BSdmxjLT5jb25jZWFsX21heF0gPQorICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjCisgICAgICAgICAgLmFSdmxjU2NmQndkW3BSdmxjLT5jb25jZWFsX21heF07CisgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYworICAgICAgLmFSdmxjU2NmQndkW3BSdmxjLT5jb25jZWFsX21pbl0gPQorICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjCisgICAgICAgICAgLmFSdmxjU2NmRndkW3BSdmxjLT5jb25jZWFsX21pbl07CiAKLSAgLyogY29uc2lkZXIgdGhlIHNtYWxsZXIgb2YgdGhlIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRlY29kZWQgdmFsdWUgYXMgdGhlIGNvcnJlY3Qgb25lICovCi0gIHN0YXJ0QmFuZCA9IGNvbmNlYWxfbWluOyAgICAKLSAgaWYgKGNvbmNlYWxfZ3JvdXBfbWluID09IGNvbmNlYWxfZ3JvdXBfbWF4KSAKLSAgICBlbmRCYW5kID0gY29uY2VhbF9tYXg7ICAgIAotICBlbHNlICAgICAgICAKLSAgICBlbmRCYW5kID0gcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkLTE7ICAgICAKKyAgLyogY29uc2lkZXIgdGhlIHNtYWxsZXIgb2YgdGhlIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRlY29kZWQgdmFsdWUgYXMgdGhlCisgICAqIGNvcnJlY3Qgb25lICovCisgIHN0YXJ0QmFuZCA9IGNvbmNlYWxfbWluOworICBpZiAoY29uY2VhbF9ncm91cF9taW4gPT0gY29uY2VhbF9ncm91cF9tYXgpCisgICAgZW5kQmFuZCA9IGNvbmNlYWxfbWF4OworICBlbHNlCisgICAgZW5kQmFuZCA9IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZCAtIDE7CiAKLSAgZm9yIChncm91cD1jb25jZWFsX2dyb3VwX21pbjsgZ3JvdXAgPD0gY29uY2VhbF9ncm91cF9tYXg7IGdyb3VwKyspIHsKLSAgICBmb3IgKGJhbmQ9c3RhcnRCYW5kOyBiYW5kIDw9IGVuZEJhbmQ7IGJhbmQrKykgewotICAgICAgYm5kcyA9IDE2Kmdyb3VwK2JhbmQ7CisgIGZvciAoZ3JvdXAgPSBjb25jZWFsX2dyb3VwX21pbjsgZ3JvdXAgPD0gY29uY2VhbF9ncm91cF9tYXg7IGdyb3VwKyspIHsKKyAgICBmb3IgKGJhbmQgPSBzdGFydEJhbmQ7IGJhbmQgPD0gZW5kQmFuZDsgYmFuZCsrKSB7CisgICAgICBibmRzID0gMTYgKiBncm91cCArIGJhbmQ7CiAgICAgICBzd2l0Y2ggKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2tbYm5kc10pIHsKICAgICAgICAgY2FzZSBaRVJPX0hDQjoKICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gMDsKQEAgLTQ0OSw2MiArNDg5LDkyIEBACiAKICAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCOgogICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0IyOgotICAgICAgICAgIGlmICggKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc109PUlOVEVOU0lUWV9IQ0IpIHx8IChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdPT1JTlRFTlNJVFlfSENCMikgKSB7Ci0gICAgICAgICAgICBjb21tb25NaW4gPSBGREttaW4ocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXSk7Ci0gICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gRkRLbWluKGNvbW1vbk1pbiwgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNTY2FsZUZhY3RvcltibmRzXSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IEZES21pbihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc10scEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdKTsKKyAgICAgICAgICBpZiAoKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbworICAgICAgICAgICAgICAgICAgIC5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10gPT0gSU5URU5TSVRZX0hDQikgfHwKKyAgICAgICAgICAgICAgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbworICAgICAgICAgICAgICAgICAgIC5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10gPT0gSU5URU5TSVRZX0hDQjIpKSB7CisgICAgICAgICAgICBjb21tb25NaW4gPSBmTWluKAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXSwKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMKKyAgICAgICAgICAgICAgICAgICAgLmFSdmxjU2NmQndkW2JuZHNdKTsKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPQorICAgICAgICAgICAgICAgIGZNaW4oY29tbW9uTWluLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hUnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JbYm5kc10pOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gZk1pbigKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc10sCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjCisgICAgICAgICAgICAgICAgICAgIC5hUnZsY1NjZkJ3ZFtibmRzXSk7CiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgTk9JU0VfSENCOgotICAgICAgICAgIGlmICggcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXT09Tk9JU0VfSENCICkgewotICAgICAgICAgICAgY29tbW9uTWluID0gRkRLbWluKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXSxwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc10pOwotICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IEZES21pbihjb21tb25NaW4sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JbYm5kc10pOworICAgICAgICAgIGlmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8KKyAgICAgICAgICAgICAgICAgIC5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10gPT0gTk9JU0VfSENCKSB7CisgICAgICAgICAgICBjb21tb25NaW4gPSBmTWluKAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXSwKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMKKyAgICAgICAgICAgICAgICAgICAgLmFSdmxjU2NmQndkW2JuZHNdKTsKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPQorICAgICAgICAgICAgICAgIGZNaW4oY29tbW9uTWluLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hUnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JbYm5kc10pOwogICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gRkRLbWluKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXSxwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc10pOworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IGZNaW4oCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYworICAgICAgICAgICAgICAgICAgICAuYVJ2bGNTY2ZCd2RbYm5kc10pOwogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGlmICggICAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSE9WkVST19IQ0IpCi0gICAgICAgICAgICAgICYmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdIT1OT0lTRV9IQ0IpCi0gICAgICAgICAgICAgICYmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdIT1JTlRFTlNJVFlfSENCKSAKLSAgICAgICAgICAgICAgJiYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10hPUlOVEVOU0lUWV9IQ0IyKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgY29tbW9uTWluID0gRkRLbWluKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXSwgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdKTsKLSAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBGREttaW4oY29tbW9uTWluLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yW2JuZHNdKTsKKyAgICAgICAgICBpZiAoKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbworICAgICAgICAgICAgICAgICAgIC5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10gIT0gWkVST19IQ0IpICYmCisgICAgICAgICAgICAgIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8KKyAgICAgICAgICAgICAgICAgICAuYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdICE9IE5PSVNFX0hDQikgJiYKKyAgICAgICAgICAgICAgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbworICAgICAgICAgICAgICAgICAgIC5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10gIT0gSU5URU5TSVRZX0hDQikgJiYKKyAgICAgICAgICAgICAgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbworICAgICAgICAgICAgICAgICAgIC5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10gIT0gSU5URU5TSVRZX0hDQjIpKSB7CisgICAgICAgICAgICBjb21tb25NaW4gPSBmTWluKAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXSwKKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMKKyAgICAgICAgICAgICAgICAgICAgLmFSdmxjU2NmQndkW2JuZHNdKTsKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPQorICAgICAgICAgICAgICAgIGZNaW4oY29tbW9uTWluLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hUnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JbYm5kc10pOwogICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gRkRLbWluKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXSxwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc10pOworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IGZNaW4oCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYworICAgICAgICAgICAgICAgICAgICAuYVJ2bGNTY2ZCd2RbYm5kc10pOwogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9Ci0gICAgc3RhcnRCYW5kID0gMDsgCi0gICAgaWYgKChncm91cCsxKSA9PSBjb25jZWFsX2dyb3VwX21heCkKLSAgICAgIGVuZEJhbmQgPSBjb25jZWFsX21heDsKKyAgICBzdGFydEJhbmQgPSAwOworICAgIGlmICgoZ3JvdXAgKyAxKSA9PSBjb25jZWFsX2dyb3VwX21heCkgZW5kQmFuZCA9IGNvbmNlYWxfbWF4OwogICB9CiAKICAgLyogbm93IGNvcHkgYWxsIGRhdGEgdG8gdGhlIG91dHB1dCBidWZmZXIgd2hpY2ggbmVlZHMgbm90IHRvIGJlIGNvbmNlYWxlZCAqLwotICBpZiAoY29uY2VhbF9ncm91cF9taW4gPT0gMCkgCi0gICAgZW5kQmFuZCA9IGNvbmNlYWxfbWluOyAgICAKLSAgZWxzZSAgICAgICAgCi0gICAgZW5kQmFuZCA9IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgICAgIAotICBmb3IgKGdyb3VwPTA7IGdyb3VwIDw9IGNvbmNlYWxfZ3JvdXBfbWluOyBncm91cCsrKSB7Ci0gICAgZm9yIChiYW5kPTA7IGJhbmQgPCBlbmRCYW5kOyBiYW5kKyspIHsKLSAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOwotICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKKyAgaWYgKGNvbmNlYWxfZ3JvdXBfbWluID09IDApCisgICAgZW5kQmFuZCA9IGNvbmNlYWxfbWluOworICBlbHNlCisgICAgZW5kQmFuZCA9IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsKKyAgZm9yIChncm91cCA9IDA7IGdyb3VwIDw9IGNvbmNlYWxfZ3JvdXBfbWluOyBncm91cCsrKSB7CisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IGVuZEJhbmQ7IGJhbmQrKykgeworICAgICAgYm5kcyA9IDE2ICogZ3JvdXAgKyBiYW5kOworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOwogICAgIH0KLSAgICBpZiAoKGdyb3VwKzEpID09IGNvbmNlYWxfZ3JvdXBfbWluKSAKLSAgICAgIGVuZEJhbmQgPSBjb25jZWFsX21pbjsgICAgCisgICAgaWYgKChncm91cCArIDEpID09IGNvbmNlYWxfZ3JvdXBfbWluKSBlbmRCYW5kID0gY29uY2VhbF9taW47CiAgIH0KIAotICBzdGFydEJhbmQgPSBjb25jZWFsX21heCsxOyAgICAKLSAgZm9yIChncm91cD1jb25jZWFsX2dyb3VwX21heDsgZ3JvdXAgPCBwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKSB7Ci0gICAgZm9yIChiYW5kPXN0YXJ0QmFuZDsgYmFuZCA8IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgYmFuZCsrKSB7Ci0gICAgICBibmRzID0gMTYqZ3JvdXArYmFuZDsKLSAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CisgIHN0YXJ0QmFuZCA9IGNvbmNlYWxfbWF4ICsgMTsKKyAgZm9yIChncm91cCA9IGNvbmNlYWxfZ3JvdXBfbWF4OyBncm91cCA8IHBSdmxjLT5udW1XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKKyAgICBmb3IgKGJhbmQgPSBzdGFydEJhbmQ7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgYm5kcyA9IDE2ICogZ3JvdXAgKyBiYW5kOworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdOwogICAgIH0KICAgICBzdGFydEJhbmQgPSAwOwogICB9CkBAIC01MTMsODEgKzU4Myw4MiBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgZnVuY3Rpb246ICAgICAgU3RhdGlzdGljYWxFc3RpbWF0aW9uCiAKLSAgZGVzY3JpcHRpb246ICAgVGhpcyBhcHByb2FjaCBieSBtZWFucyBvZiBzdGF0aXN0aWNhbCBlc3RpbWF0aW9uIGlzIGdlbmVyYWxseSBwZXJmb3JtZWQgd2hlbiAKLSAgICAgICAgICAgICAgICAgYm90aCB0aGUgc3RhcnQgdmFsdWUgYW5kIHRoZSBlbmQgdmFsdWUgYXJlIGRpZmZlcmVudCBhbmQgbm8gZnVydGhlciBlcnJvcnMgaGF2ZSAKLSAgICAgICAgICAgICAgICAgYmVlbiBkZXRlY3RlZC4gQ29uc2lkZXJpbmcgdGhlIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRlY29kZWQgc2NhbGVmYWN0b3JzLCB0aGUgCi0gICAgICAgICAgICAgICAgIHNldCB3aXRoIHRoZSBsb3dlciBzY2FsZWZhY3RvcnMgaW4gc3VtIHdpbGwgYmUgY29uc2lkZXJlZCBhcyB0aGUgY29ycmVjdCBvbmUuIAotICAgICAgICAgICAgICAgICBUaGUgc2NhbGVmYWN0b3JzIGFyZSBkaWZmZXJlbnRpYWxseSBlbmNvZGVkLiBOb3JtYWxseSBpdCB3b3VsZCByZWFjaCB0byBjb21wYXJlIAotICAgICAgICAgICAgICAgICBvbmUgcGFpciBvZiB0aGUgZm9yd2FyZCBhbmQgYmFja3dhcmQgZGVjb2RlZCBzY2FsZWZhY3RvcnMgdG8gc3BlY2lmeSB0aGUgbG93ZXIgCi0gICAgICAgICAgICAgICAgIHNldC4gQnV0IGhhdmluZyBkZXRlY3RlZCBubyBmdXJ0aGVyIGVycm9ycyBkb2VzIG5vdCBuZWNlc3NhcmlseSBtZWFuIHRoZSBhYnNlbmNlCi0gICAgICAgICAgICAgICAgIG9mIGVycm9ycy4gVGhlcmVmb3JlIGFsbCBzY2FsZWZhY3RvcnMgZGVjb2RlZCBpbiBmb3J3YXJkIGFuZCBiYWNrd2FyZCBkaXJlY3Rpb24gCi0gICAgICAgICAgICAgICAgIGFyZSBzdW1tZWQgdXAgc2VwZXJhdGVseS4gVGhlIHNldCB3aXRoIHRoZSBsb3dlciBzdW0gd2lsbCBiZSB1c2VkLiBUaGUgc3RyYXRlZ3kgCi0gICAgICAgICAgICAgICAgIG11c3QgYmUgYXBwbGllZCB0byBzY2FsZWZhY3RvcnMsIGludGVuc2l0eSBkYXRhIGFuZCBub2lzZSBlbmVyZ3kgc2VwZXJhdGVseS4KKyAgZGVzY3JpcHRpb246ICAgVGhpcyBhcHByb2FjaCBieSBtZWFucyBvZiBzdGF0aXN0aWNhbCBlc3RpbWF0aW9uIGlzIGdlbmVyYWxseQorcGVyZm9ybWVkIHdoZW4gYm90aCB0aGUgc3RhcnQgdmFsdWUgYW5kIHRoZSBlbmQgdmFsdWUgYXJlIGRpZmZlcmVudCBhbmQgbm8KK2Z1cnRoZXIgZXJyb3JzIGhhdmUgYmVlbiBkZXRlY3RlZC4gQ29uc2lkZXJpbmcgdGhlIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRlY29kZWQKK3NjYWxlZmFjdG9ycywgdGhlIHNldCB3aXRoIHRoZSBsb3dlciBzY2FsZWZhY3RvcnMgaW4gc3VtIHdpbGwgYmUgY29uc2lkZXJlZCBhcwordGhlIGNvcnJlY3Qgb25lLiBUaGUgc2NhbGVmYWN0b3JzIGFyZSBkaWZmZXJlbnRpYWxseSBlbmNvZGVkLiBOb3JtYWxseSBpdCB3b3VsZAorcmVhY2ggdG8gY29tcGFyZSBvbmUgcGFpciBvZiB0aGUgZm9yd2FyZCBhbmQgYmFja3dhcmQgZGVjb2RlZCBzY2FsZWZhY3RvcnMgdG8KK3NwZWNpZnkgdGhlIGxvd2VyIHNldC4gQnV0IGhhdmluZyBkZXRlY3RlZCBubyBmdXJ0aGVyIGVycm9ycyBkb2VzIG5vdAorbmVjZXNzYXJpbHkgbWVhbiB0aGUgYWJzZW5jZSBvZiBlcnJvcnMuIFRoZXJlZm9yZSBhbGwgc2NhbGVmYWN0b3JzIGRlY29kZWQgaW4KK2ZvcndhcmQgYW5kIGJhY2t3YXJkIGRpcmVjdGlvbiBhcmUgc3VtbWVkIHVwIHNlcGVyYXRlbHkuIFRoZSBzZXQgd2l0aCB0aGUgbG93ZXIKK3N1bSB3aWxsIGJlIHVzZWQuIFRoZSBzdHJhdGVneSBtdXN0IGJlIGFwcGxpZWQgdG8gc2NhbGVmYWN0b3JzLCBpbnRlbnNpdHkgZGF0YQorYW5kIG5vaXNlIGVuZXJneSBzZXBlcmF0ZWx5LgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgb3V0cHV0OiAgICAgICAgQ29uY2VhbGVkIHNjYWxlZmFjdG9yLCBub2lzZSBlbmVyZ3kgYW5kIGludGVuc2l0eSBkYXRhCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICByZXR1cm46ICAgICAgICAtCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiAKLXZvaWQgU3RhdGlzdGljYWxFc3RpbWF0aW9uIChDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKQotewotICBDRXJSdmxjSW5mbyAqcFJ2bGMgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmVyUnZsY0luZm87Ci0gIGludCBiYW5kLGJuZHMsZ3JvdXA7Ci0gIGludCBzdW1Jc0Z3ZCxzdW1Jc0J3ZDsgICAgICAgICAgICAvKiBzdW0gb2YgaW50ZW5zaXR5IGRhdGEgZm9yd2FyZC9iYWNrd2FyZCAqLwotICBpbnQgc3VtTnJnRndkLHN1bU5yZ0J3ZDsgICAgICAgICAgLyogc3VtIG9mIG5vaXNlIGVuZXJneSBkYXRhIGZvcndhcmQvYmFja3dhcmQgKi8KLSAgaW50IHN1bVNjZkZ3ZCxzdW1TY2ZCd2Q7ICAgICAgICAgIC8qIHN1bSBvZiBzY2FsZWZhY3RvciBkYXRhIGZvcndhcmQvYmFja3dhcmQgKi8KLSAgaW50IHVzZUlzRndkLHVzZU5yZ0Z3ZCx1c2VTY2ZGd2Q7IC8qIHRoZSBmbGFncyBzaWduYWxzIHRoZSBlbGVtZW50cyB3aGljaCBhcmUgdXNlZCBmb3IgdGhlIGZpbmFsIHJlc3VsdCAqLwotICBpbnQgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHM7Ci0KLSAgaWYgKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSA9PSBFaWdodFNob3J0U2VxdWVuY2UpCi0gICAgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHMgPSAxNjsKLSAgZWxzZQotICAgIE1heGltdW1TY2FsZUZhY3RvckJhbmRzID0gNjQ7Cit2b2lkIFN0YXRpc3RpY2FsRXN0aW1hdGlvbihDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKSB7CisgIENFclJ2bGNJbmZvICpwUnZsYyA9CisgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmVyUnZsY0luZm87CisgIGludCBiYW5kLCBibmRzLCBncm91cDsKKyAgaW50IHN1bUlzRndkLCBzdW1Jc0J3ZDsgICAvKiBzdW0gb2YgaW50ZW5zaXR5IGRhdGEgZm9yd2FyZC9iYWNrd2FyZCAqLworICBpbnQgc3VtTnJnRndkLCBzdW1OcmdCd2Q7IC8qIHN1bSBvZiBub2lzZSBlbmVyZ3kgZGF0YSBmb3J3YXJkL2JhY2t3YXJkICovCisgIGludCBzdW1TY2ZGd2QsIHN1bVNjZkJ3ZDsgLyogc3VtIG9mIHNjYWxlZmFjdG9yIGRhdGEgZm9yd2FyZC9iYWNrd2FyZCAqLworICBpbnQgdXNlSXNGd2QsIHVzZU5yZ0Z3ZCwgdXNlU2NmRndkOyAvKiB0aGUgZmxhZ3Mgc2lnbmFscyB0aGUgZWxlbWVudHMgd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHVzZWQgZm9yIHRoZSBmaW5hbCByZXN1bHQgKi8KIAogICBzdW1Jc0Z3ZCA9IHN1bUlzQndkID0gc3VtTnJnRndkID0gc3VtTnJnQndkID0gc3VtU2NmRndkID0gc3VtU2NmQndkID0gMDsKICAgdXNlSXNGd2QgPSB1c2VOcmdGd2QgPSB1c2VTY2ZGd2QgPSAwOwogCi0gIC8qIGNhbGN1bGF0ZSBzdW0gb2YgZWFjaCBncm91cCAoc2NmLG5yZyxpcykgb2YgZm9yd2FyZCBhbmQgYmFja3dhcmQgZGlyZWN0aW9uICovCi0gIGZvciAoZ3JvdXA9MDsgZ3JvdXA8cFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgewotICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKLSAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOworICAvKiBjYWxjdWxhdGUgc3VtIG9mIGVhY2ggZ3JvdXAgKHNjZixucmcsaXMpIG9mIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRpcmVjdGlvbgorICAgKi8KKyAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgcFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgYm5kcyA9IDE2ICogZ3JvdXAgKyBiYW5kOwogICAgICAgc3dpdGNoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rW2JuZHNdKSB7CiAgICAgICAgIGNhc2UgWkVST19IQ0I6CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCOgogICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0IyOgotICAgICAgICAgIHN1bUlzRndkICs9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKLSAgICAgICAgICBzdW1Jc0J3ZCArPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CisgICAgICAgICAgc3VtSXNGd2QgKz0KKyAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOworICAgICAgICAgIHN1bUlzQndkICs9CisgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE5PSVNFX0hDQjoKLSAgICAgICAgICBzdW1OcmdGd2QgKz0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOwotICAgICAgICAgIHN1bU5yZ0J3ZCArPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107Ci0gICAgICAgICAgYnJlYWsgOworICAgICAgICAgIHN1bU5yZ0Z3ZCArPQorICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107CisgICAgICAgICAgc3VtTnJnQndkICs9CisgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKKyAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHN1bVNjZkZ3ZCArPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107Ci0gICAgICAgICAgc3VtU2NmQndkICs9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKKyAgICAgICAgICBzdW1TY2ZGd2QgKz0KKyAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOworICAgICAgICAgIHN1bVNjZkJ3ZCArPQorICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9CiAKICAgLyogZmluZCBmb3IgZWFjaCBncm91cCAoc2NmLG5yZyxpcykgdGhlIGNvcnJlY3QgZGlyZWN0aW9uICovCi0gIGlmICggc3VtSXNGd2QgPCBzdW1Jc0J3ZCApCi0gICAgdXNlSXNGd2QgPSAxOworICBpZiAoc3VtSXNGd2QgPCBzdW1Jc0J3ZCkgdXNlSXNGd2QgPSAxOwogCi0gIGlmICggc3VtTnJnRndkIDwgc3VtTnJnQndkICkKLSAgICB1c2VOcmdGd2QgPSAxOworICBpZiAoc3VtTnJnRndkIDwgc3VtTnJnQndkKSB1c2VOcmdGd2QgPSAxOwogCi0gIGlmICggc3VtU2NmRndkIDwgc3VtU2NmQndkICkKLSAgICB1c2VTY2ZGd2QgPSAxOworICBpZiAoc3VtU2NmRndkIDwgc3VtU2NmQndkKSB1c2VTY2ZGd2QgPSAxOwogCiAgIC8qIGNvbmNlYWwgZWFjaCBncm91cCAoc2NmLG5yZyxpcykgKi8KLSAgZm9yIChncm91cD0wOyBncm91cDxwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKSB7Ci0gICAgZm9yIChiYW5kPTA7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgewotICAgICAgYm5kcyA9IDE2Kmdyb3VwK2JhbmQ7CisgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IHBSdmxjLT5udW1XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKKyAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKKyAgICAgIGJuZHMgPSAxNiAqIGdyb3VwICsgYmFuZDsKICAgICAgIHN3aXRjaCAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9va1tibmRzXSkgewogICAgICAgICBjYXNlIFpFUk9fSENCOgogICAgICAgICAgIGJyZWFrOwpAQCAtNTk1LDYzICs2NjYsNjMgQEAKICAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCOgogICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0IyOgogICAgICAgICAgIGlmICh1c2VJc0Z3ZCkKLSAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0KKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107CiAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPQorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE5PSVNFX0hDQjoKICAgICAgICAgICBpZiAodXNlTnJnRndkKQotICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPQorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdOwotICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPQorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKKyAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIGlmICh1c2VTY2ZGd2QpCi0gICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9CisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOwogICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0KKyAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgZGVzY3JpcHRpb246ICAgQXBwcm9hY2ggYnkgbWVhbnMgb2YgcHJlZGljdGl2ZSBpbnRlcnBvbGF0aW9uCi0gICAgICAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggYnkgbWVhbnMgb2YgcHJlZGljdGl2ZSBlc3RpbWF0aW9uIGlzIGdlbmVyYWxseSBwZXJmb3JtZWQgd2hlbiAKLSAgICAgICAgICAgICAgICAgdGhlIGVycm9yIGNhbm5vdCBiZSBpc29sYXRlZCBiZXR3ZWVuICdjb25jZWFsX21pbicgYW5kICdjb25jZWFsX21heCcsIHRoZSAKLSAgICAgICAgICAgICAgICAgJ3NmX2NvbmNlYWxtZW50JyBmbGFnIGlzIHNldCBhbmQgdGhlIHByZXZpb3VzIGZyYW1lIGhhcyB0aGUgc2FtZSBibG9jayB0eXBlIAotICAgICAgICAgICAgICAgICBhcyB0aGUgY3VycmVudCBmcmFtZS4gQ2hlY2sgZm9yIGVhY2ggc2NhbGVmYWN0b3JiYW5kIGlmIHRoZSBzYW1lIHR5cGUgb2YgZGF0YSAKLSAgICAgICAgICAgICAgICAgKHNjYWxlZmFjdG9yLCBpbnRlcm5zaXR5IGRhdGEsIG5vaXNlIGVuZXJnaWVzKSBpcyB0cmFuc21pdHRlZC4gSWYgc28gdXNlIHRoZSAKLSAgICAgICAgICAgICAgICAgc2NhbGVmYWN0b3IgKGludGVuc2l0eSBkYXRhLCBub2lzZSBlbmVyZ3kpIGluIHRoZSBjdXJyZW50IGZyYW1lLiBPdGhlcndpc2Ugc2V0IAotICAgICAgICAgICAgICAgICB0aGUgc2NhbGVmYWN0b3IgKGludGVuc2l0eSBkYXRhLCBub2lzZSBlbmVyZ3kpIGZvciB0aGlzIHNjYWxlZmFjdG9yYmFuZCB0byB6ZXJvLgorICAgICAgICAgICAgICAgICBUaGlzIGFwcHJvYWNoIGJ5IG1lYW5zIG9mIHByZWRpY3RpdmUgZXN0aW1hdGlvbiBpcyBnZW5lcmFsbHkKK3BlcmZvcm1lZCB3aGVuIHRoZSBlcnJvciBjYW5ub3QgYmUgaXNvbGF0ZWQgYmV0d2VlbiAnY29uY2VhbF9taW4nIGFuZAorJ2NvbmNlYWxfbWF4JywgdGhlICdzZl9jb25jZWFsbWVudCcgZmxhZyBpcyBzZXQgYW5kIHRoZSBwcmV2aW91cyBmcmFtZSBoYXMgdGhlCitzYW1lIGJsb2NrIHR5cGUgYXMgdGhlIGN1cnJlbnQgZnJhbWUuIENoZWNrIGZvciBlYWNoIHNjYWxlZmFjdG9yYmFuZCBpZiB0aGUgc2FtZQordHlwZSBvZiBkYXRhIChzY2FsZWZhY3RvciwgaW50ZXJuc2l0eSBkYXRhLCBub2lzZSBlbmVyZ2llcykgaXMgdHJhbnNtaXR0ZWQuIElmCitzbyB1c2UgdGhlIHNjYWxlZmFjdG9yIChpbnRlbnNpdHkgZGF0YSwgbm9pc2UgZW5lcmd5KSBpbiB0aGUgY3VycmVudCBmcmFtZS4KK090aGVyd2lzZSBzZXQgdGhlIHNjYWxlZmFjdG9yIChpbnRlbnNpdHkgZGF0YSwgbm9pc2UgZW5lcmd5KSBmb3IgdGhpcworc2NhbGVmYWN0b3JiYW5kIHRvIHplcm8uCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBvdXRwdXQ6ICAgICAgICBDb25jZWFsZWQgc2NhbGVmYWN0b3IsIG5vaXNlIGVuZXJneSBhbmQgaW50ZW5zaXR5IGRhdGEKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIHJldHVybjogICAgICAgIC0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KIAotdm9pZCBQcmVkaWN0aXZlSW50ZXJwb2xhdGlvbiAoCi0gICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCi0gICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8KLSAgICAgICAgKQotewotICBDRXJSdmxjSW5mbyAqcFJ2bGMgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmVyUnZsY0luZm87Ci0gIGludCBiYW5kLGJuZHMsZ3JvdXA7Ci0gIGludCBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKLSAgaW50IGNvbW1vbk1pbjsKK3ZvaWQgUHJlZGljdGl2ZUludGVycG9sYXRpb24oCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvKSB7CisgIENFclJ2bGNJbmZvICpwUnZsYyA9CisgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmVyUnZsY0luZm87CisgIGludCBiYW5kLCBibmRzLCBncm91cDsKKyAgU0hPUlQgY29tbW9uTWluOwogCi0gIGlmIChHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+aWNzSW5mbykgPT0gRWlnaHRTaG9ydFNlcXVlbmNlKQotICAgIE1heGltdW1TY2FsZUZhY3RvckJhbmRzID0gMTY7Ci0gIGVsc2UKLSAgICBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kcyA9IDY0OwotCi0gIGZvciAoZ3JvdXA9MDsgZ3JvdXA8cFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgewotICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkOyBiYW5kKyspIHsKLSAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOworICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKSB7CisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgYmFuZCsrKSB7CisgICAgICBibmRzID0gMTYgKiBncm91cCArIGJhbmQ7CiAgICAgICBzd2l0Y2ggKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2tbYm5kc10pIHsKICAgICAgICAgY2FzZSBaRVJPX0hDQjoKICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gMDsKQEAgLTY1OSwzNCArNzMwLDU0IEBACiAKICAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCOgogICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0IyOgotICAgICAgICAgIGlmICggKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc109PUlOVEVOU0lUWV9IQ0IpIHx8IChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdPT1JTlRFTlNJVFlfSENCMikgKSB7Ci0gICAgICAgICAgICBjb21tb25NaW4gPSBGREttaW4ocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXSk7Ci0gICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gRkRLbWluKGNvbW1vbk1pbiwgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNTY2FsZUZhY3RvcltibmRzXSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgeworICAgICAgICAgIGlmICgocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSA9PSBJTlRFTlNJVFlfSENCKSB8fAorICAgICAgICAgICAgICAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSA9PSBJTlRFTlNJVFlfSENCMikpIHsKKyAgICAgICAgICAgIGNvbW1vbk1pbiA9IGZNaW4oCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYworICAgICAgICAgICAgICAgICAgICAuYVJ2bGNTY2ZCd2RbYm5kc10pOworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9CisgICAgICAgICAgICAgICAgZk1pbihjb21tb25NaW4sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNTY2FsZUZhY3RvcltibmRzXSk7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSAtMTEwOwogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE5PSVNFX0hDQjoKLSAgICAgICAgICBpZiAoIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc109PU5PSVNFX0hDQiApIHsKLSAgICAgICAgICAgIGNvbW1vbk1pbiA9IEZES21pbihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc10scEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdKTsKLSAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBGREttaW4oY29tbW9uTWluLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yW2JuZHNdKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgaWYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbworICAgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSA9PSBOT0lTRV9IQ0IpIHsKKyAgICAgICAgICAgIGNvbW1vbk1pbiA9IGZNaW4oCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYworICAgICAgICAgICAgICAgICAgICAuYVJ2bGNTY2ZCd2RbYm5kc10pOworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9CisgICAgICAgICAgICAgICAgZk1pbihjb21tb25NaW4sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNTY2FsZUZhY3RvcltibmRzXSk7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSAtMTEwOwogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGlmICggICAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSE9WkVST19IQ0IpCi0gICAgICAgICAgICAgICYmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdIT1OT0lTRV9IQ0IpIAotICAgICAgICAgICAgICAmJiAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSE9SU5URU5TSVRZX0hDQikgCi0gICAgICAgICAgICAgICYmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdIT1JTlRFTlNJVFlfSENCMikgKSB7Ci0gICAgICAgICAgICBjb21tb25NaW4gPSBGREttaW4ocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXSk7Ci0gICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gRkRLbWluKGNvbW1vbk1pbiwgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNTY2FsZUZhY3RvcltibmRzXSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgeworICAgICAgICAgIGlmICgocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSAhPSBaRVJPX0hDQikgJiYKKyAgICAgICAgICAgICAgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbworICAgICAgICAgICAgICAgICAgIC5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10gIT0gTk9JU0VfSENCKSAmJgorICAgICAgICAgICAgICAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSAhPSBJTlRFTlNJVFlfSENCKSAmJgorICAgICAgICAgICAgICAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvCisgICAgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSAhPSBJTlRFTlNJVFlfSENCMikpIHsKKyAgICAgICAgICAgIGNvbW1vbk1pbiA9IGZNaW4oCisgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYworICAgICAgICAgICAgICAgICAgICAuYVJ2bGNTY2ZCd2RbYm5kc10pOworICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9CisgICAgICAgICAgICAgICAgZk1pbihjb21tb25NaW4sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFSdmxjUHJldmlvdXNTY2FsZUZhY3RvcltibmRzXSk7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSAwOwogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKQEAgLTY5NCw0ICs3ODUsMyBAQAogICAgIH0KICAgfQogfQotCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL3J2bGNjb25jZWFsLmggYi9saWJBQUNkZWMvc3JjL3J2bGNjb25jZWFsLmgKaW5kZXggNzUwY2JjZC4uOGUyMDYyZSAxMDA2NDQKLS0tIGEvbGliQUFDZGVjL3NyYy9ydmxjY29uY2VhbC5oCisrKyBiL2xpYkFBQ2RlYy9zcmMvcnZsY2NvbmNlYWwuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQpAQCAtOTAsMjMgKzEwOSwxOSBAQAogI2lmbmRlZiBSVkxDQ09OQ0VBTF9ICiAjZGVmaW5lIFJWTENDT05DRUFMX0gKIAotCi0KICNpbmNsdWRlICJydmxjLmgiCiAKLXZvaWQgQmlkaXJlY3Rpb25hbEVzdGltYXRpb25fVXNlTG93ZXJTY2ZPZkN1cnJlbnRGcmFtZShDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKK3ZvaWQgQmlkaXJlY3Rpb25hbEVzdGltYXRpb25fVXNlTG93ZXJTY2ZPZkN1cnJlbnRGcmFtZSgKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKTsKIAogdm9pZCBCaWRpcmVjdGlvbmFsRXN0aW1hdGlvbl9Vc2VTY2ZPZlByZXZGcmFtZUFzUmVmZXJlbmNlKAotICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvCi0gICAgICAgICk7CisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvKTsKIAotdm9pZCBTdGF0aXN0aWNhbEVzdGltYXRpb24gKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8pOwordm9pZCBTdGF0aXN0aWNhbEVzdGltYXRpb24oQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbyk7CiAKLXZvaWQgUHJlZGljdGl2ZUludGVycG9sYXRpb24gKAotICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAotICAgICAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvCi0gICAgICAgICk7Ci0KK3ZvaWQgUHJlZGljdGl2ZUludGVycG9sYXRpb24oCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvKTsKIAogI2VuZGlmIC8qIFJWTENDT05DRUFMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvc3RlcmVvLmNwcCBiL2xpYkFBQ2RlYy9zcmMvc3RlcmVvLmNwcAppbmRleCA0ZjI4MjQ0Li5lZWQ4MjZiIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL3N0ZXJlby5jcHAKKysrIGIvbGliQUFDZGVjL3NyYy9zdGVyZW8uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIxNiArOTAsMTE1OCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorCiAgICBEZXNjcmlwdGlvbjogam9pbnQgc3RlcmVvIHByb2Nlc3NpbmcKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInN0ZXJlby5oIgogCi0KICNpbmNsdWRlICJhYWNfcm9tLmgiCiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgogI2luY2x1ZGUgImNoYW5uZWxpbmZvLmgiCisjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCiAKLWVudW0KLXsKLSAgTCA9IDAsCi0gIFIgPSAxCi19OworZW51bSB7IEwgPSAwLCBSID0gMSB9OwogCisjaW5jbHVkZSAiYmxvY2suaCIKIAotaW50IENKb2ludFN0ZXJlb19SZWFkKAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICAgICAgQ0pvaW50U3RlcmVvRGF0YSAqcEpvaW50U3RlcmVvRGF0YSwKLSAgICAgICAgY29uc3QgaW50IHdpbmRvd0dyb3VwcywKLSAgICAgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCwKLSAgICAgICAgY29uc3QgVUlOVCBmbGFncwotICAgICAgICApCi17Ci0gIGludCBncm91cCxiYW5kOworaW50IENKb2ludFN0ZXJlb19SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICAgICAgICAgICAgICAgIENKb2ludFN0ZXJlb0RhdGEgKnBKb2ludFN0ZXJlb0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHdpbmRvd0dyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBtYXhfc2ZiX3N0ZV9jbGVhciwKKyAgICAgICAgICAgICAgICAgICAgICBDSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YSAqcEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgQ0NwbHhQcmVkaWN0aW9uRGF0YSAqY3BseFByZWRpY3Rpb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGludCBjcGx4UHJlZGljdGlvbkFjdGl2LCBpbnQgc2NhbGVGYWN0b3JCYW5kc1RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dTZXF1ZW5jZSwgY29uc3QgVUlOVCBmbGFncykgeworICBpbnQgZ3JvdXAsIGJhbmQ7CiAKLSAgcEpvaW50U3RlcmVvRGF0YS0+TXNNYXNrUHJlc2VudCA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMik7CisgIHBKb2ludFN0ZXJlb0RhdGEtPk1zTWFza1ByZXNlbnQgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDIpOwogCi0gIEZES21lbWNsZWFyKHBKb2ludFN0ZXJlb0RhdGEtPk1zVXNlZCwgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKnNpemVvZihVQ0hBUikpOworICBGREttZW1jbGVhcihwSm9pbnRTdGVyZW9EYXRhLT5Nc1VzZWQsCisgICAgICAgICAgICAgIHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCAqIHNpemVvZihVQ0hBUikpOwogCi0gIHN3aXRjaCAocEpvaW50U3RlcmVvRGF0YS0+TXNNYXNrUHJlc2VudCkKLSAgewotICAgIGNhc2UgMCA6IC8qIG5vIE0vUyAqLworICBwSm9pbnRTdGVyZW9EYXRhLT5jcGx4X3ByZWRfZmxhZyA9IDA7CisgIGlmIChjcGx4UHJlZGljdGlvbkFjdGl2KSB7CisgICAgY3BseFByZWRpY3Rpb25EYXRhLT5wcmVkX2RpciA9IDA7CisgICAgY3BseFByZWRpY3Rpb25EYXRhLT5jb21wbGV4X2NvZWYgPSAwOworICAgIGNwbHhQcmVkaWN0aW9uRGF0YS0+dXNlX3ByZXZfZnJhbWUgPSAwOworICAgIGNwbHhQcmVkaWN0aW9uRGF0YS0+aWdmX3ByZWRfZGlyID0gMDsKKyAgfQorCisgIHN3aXRjaCAocEpvaW50U3RlcmVvRGF0YS0+TXNNYXNrUHJlc2VudCkgeworICAgIGNhc2UgMDogLyogbm8gTS9TICovCiAgICAgICAvKiBhbGwgZmxhZ3MgYXJlIGFscmVhZHkgY2xlYXJlZCAqLwotICAgICAgYnJlYWsgOworICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIDEgOiAvKiByZWFkIG1zX3VzZWQgKi8KLQotICAgICAgZm9yIChncm91cD0wOyBncm91cDx3aW5kb3dHcm91cHM7IGdyb3VwKyspCi0gICAgICB7Ci0gICAgICAgIGZvciAoYmFuZD0wOyBiYW5kPHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZDsgYmFuZCsrKQotICAgICAgICB7Ci0gICAgICAgICAgcEpvaW50U3RlcmVvRGF0YS0+TXNVc2VkW2JhbmRdIHw9IChGREtyZWFkQml0cyhicywxKSA8PCBncm91cCk7CisgICAgY2FzZSAxOiAvKiByZWFkIG1zX3VzZWQgKi8KKyAgICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IHdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkOyBiYW5kKyspIHsKKyAgICAgICAgICBwSm9pbnRTdGVyZW9EYXRhLT5Nc1VzZWRbYmFuZF0gfD0gKEZES3JlYWRCaXRzKGJzLCAxKSA8PCBncm91cCk7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGJyZWFrIDsKKyAgICAgIGJyZWFrOwogCi0gICAgY2FzZSAyIDogLyogZnVsbCBzcGVjdHJ1bSBNL1MgKi8KLQotICAgICAgZm9yIChiYW5kPTA7IGJhbmQ8c2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkOyBiYW5kKyspCi0gICAgICB7Ci0gICAgICAgIHBKb2ludFN0ZXJlb0RhdGEtPk1zVXNlZFtiYW5kXSA9IDI1NSA7ICAvKiBzZXQgYWxsIGZsYWdzIHRvIDEgKi8KKyAgICBjYXNlIDI6IC8qIGZ1bGwgc3BlY3RydW0gTS9TICovCisgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkOyBiYW5kKyspIHsKKyAgICAgICAgcEpvaW50U3RlcmVvRGF0YS0+TXNVc2VkW2JhbmRdID0gMjU1OyAvKiBzZXQgYWxsIGZsYWdzIHRvIDEgKi8KICAgICAgIH0KLSAgICAgIGJyZWFrIDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAzOgorICAgICAgLyogTS9TIGNvZGluZyBpcyBkaXNhYmxlZCwgY29tcGxleCBzdGVyZW8gcHJlZGljdGlvbiBpcyBlbmFibGVkICovCisgICAgICBpZiAoZmxhZ3MgJiAoQUNfVVNBQyB8IEFDX1JTVkQ1MCB8IEFDX1JTVjYwM0RBKSkgeworICAgICAgICBpZiAoY3BseFByZWRpY3Rpb25BY3RpdikgeyAvKiAnaWYgKHN0ZXJlb0NvbmZpZ0luZGV4ID09IDApJyAqLworCisgICAgICAgICAgcEpvaW50U3RlcmVvRGF0YS0+Y3BseF9wcmVkX2ZsYWcgPSAxOworCisgICAgICAgICAgLyogY3BseF9wcmVkX2RhdGEoKSAgY3AuIElTTy9JRUMgRkRJUyAyMzAwMy0zOjIwMTEoRSkgIFRhYmxlIDI2ICovCisgICAgICAgICAgaW50IGNwbHhfcHJlZF9hbGwgPSAwOyAvKiBsb2NhbCB1c2Ugb25seSAqLworICAgICAgICAgIGNwbHhfcHJlZF9hbGwgPSBGREtyZWFkQml0cyhicywgMSk7CisKKyAgICAgICAgICBpZiAoY3BseF9wcmVkX2FsbCkgeworICAgICAgICAgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgd2luZG93R3JvdXBzOyBncm91cCsrKSB7CisgICAgICAgICAgICAgIFVDSEFSIGdyb3VwbWFzayA9ICgoVUNIQVIpMSA8PCBncm91cCk7CisgICAgICAgICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgICAgICAgICAgIHBKb2ludFN0ZXJlb0RhdGEtPk1zVXNlZFtiYW5kXSB8PSBncm91cG1hc2s7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgd2luZG93R3JvdXBzOyBncm91cCsrKSB7CisgICAgICAgICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7CisgICAgICAgICAgICAgICAgICAgYmFuZCArPSBTRkJfUEVSX1BSRURfQkFORCkgeworICAgICAgICAgICAgICAgIHBKb2ludFN0ZXJlb0RhdGEtPk1zVXNlZFtiYW5kXSB8PSAoRkRLcmVhZEJpdHMoYnMsIDEpIDw8IGdyb3VwKTsKKyAgICAgICAgICAgICAgICBpZiAoKGJhbmQgKyAxKSA8IHNjYWxlRmFjdG9yQmFuZHNUb3RhbCkgeworICAgICAgICAgICAgICAgICAgcEpvaW50U3RlcmVvRGF0YS0+TXNVc2VkW2JhbmQgKyAxXSB8PQorICAgICAgICAgICAgICAgICAgICAgIChwSm9pbnRTdGVyZW9EYXRhLT5Nc1VzZWRbYmFuZF0gJiAoKFVDSEFSKTEgPDwgZ3JvdXApKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChjcGx4UHJlZGljdGlvbkFjdGl2KSB7CisgICAgLyogSWYgYWxsIHNmYiBhcmUgTVMtZWQgdGhlbiBubyBjb21wbGV4IHByZWRpY3Rpb24gKi8KKyAgICBpZiAocEpvaW50U3RlcmVvRGF0YS0+TXNNYXNrUHJlc2VudCA9PSAzKSB7CisgICAgICBpZiAocEpvaW50U3RlcmVvRGF0YS0+Y3BseF9wcmVkX2ZsYWcpIHsKKyAgICAgICAgaW50IGRlbHRhX2NvZGVfdGltZSA9IDA7CisKKyAgICAgICAgLyogc2V0IHBvaW50ZXIgdG8gSHVmZm1hbiBjb2RlYm9va3MgKi8KKyAgICAgICAgY29uc3QgQ29kZUJvb2tEZXNjcmlwdGlvbiAqaGNiID0gJkFBQ2NvZGVCb29rRGVzY3JpcHRpb25UYWJsZVtCT09LU0NMXTsKKyAgICAgICAgLyogc2V0IHByZWRpY3RvcnMgdG8gemVybyBpbiBjYXNlIG9mIGEgdHJhbnNpdGlvbiBmcm9tIGxvbmcgdG8gc2hvcnQKKyAgICAgICAgICogd2luZG93IHNlcXVlbmNlcyBhbmQgdmljZSB2ZXJzYSAqLworICAgICAgICBpZiAoKCh3aW5kb3dTZXF1ZW5jZSA9PSBCTE9DS19TSE9SVCkgJiYKKyAgICAgICAgICAgICAocEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEtPndpblNlcVByZXYgIT0gQkxPQ0tfU0hPUlQpKSB8fAorICAgICAgICAgICAgKChwSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS0+d2luU2VxUHJldiA9PSBCTE9DS19TSE9SVCkgJiYKKyAgICAgICAgICAgICAod2luZG93U2VxdWVuY2UgIT0gQkxPQ0tfU0hPUlQpKSkgeworICAgICAgICAgIEZES21lbWNsZWFyKHBKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLT5hbHBoYV9xX3JlX3ByZXYsCisgICAgICAgICAgICAgICAgICAgICAgSm9pbnRTdGVyZW9NYXhpbXVtR3JvdXBzICogSm9pbnRTdGVyZW9NYXhpbXVtQmFuZHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoU0hPUlQpKTsKKyAgICAgICAgICBGREttZW1jbGVhcihwSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS0+YWxwaGFfcV9pbV9wcmV2LAorICAgICAgICAgICAgICAgICAgICAgIEpvaW50U3RlcmVvTWF4aW11bUdyb3VwcyAqIEpvaW50U3RlcmVvTWF4aW11bUJhbmRzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFNIT1JUKSk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgIEZES21lbWNsZWFyKGNwbHhQcmVkaWN0aW9uRGF0YS0+YWxwaGFfcV9yZSwKKyAgICAgICAgICAgICAgICAgICAgICBKb2ludFN0ZXJlb01heGltdW1Hcm91cHMgKiBKb2ludFN0ZXJlb01heGltdW1CYW5kcyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihTSE9SVCkpOworICAgICAgICAgIEZES21lbWNsZWFyKGNwbHhQcmVkaWN0aW9uRGF0YS0+YWxwaGFfcV9pbSwKKyAgICAgICAgICAgICAgICAgICAgICBKb2ludFN0ZXJlb01heGltdW1Hcm91cHMgKiBKb2ludFN0ZXJlb01heGltdW1CYW5kcyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihTSE9SVCkpOworICAgICAgICB9CisKKyAgICAgICAgLyogMCA9IG1pZC0+c2lkZSBwcmVkaWN0aW9uLCAxID0gc2lkZS0+bWlkIHByZWRpY3Rpb24gKi8KKyAgICAgICAgY3BseFByZWRpY3Rpb25EYXRhLT5wcmVkX2RpciA9IEZES3JlYWRCaXRzKGJzLCAxKTsKKyAgICAgICAgY3BseFByZWRpY3Rpb25EYXRhLT5jb21wbGV4X2NvZWYgPSBGREtyZWFkQml0cyhicywgMSk7CisKKyAgICAgICAgaWYgKGNwbHhQcmVkaWN0aW9uRGF0YS0+Y29tcGxleF9jb2VmKSB7CisgICAgICAgICAgaWYgKGZsYWdzICYgQUNfSU5ERVApIHsKKyAgICAgICAgICAgIGNwbHhQcmVkaWN0aW9uRGF0YS0+dXNlX3ByZXZfZnJhbWUgPSAwOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjcGx4UHJlZGljdGlvbkRhdGEtPnVzZV9wcmV2X2ZyYW1lID0gRkRLcmVhZEJpdHMoYnMsIDEpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbGFncyAmIEFDX0lOREVQKSB7CisgICAgICAgICAgZGVsdGFfY29kZV90aW1lID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkZWx0YV9jb2RlX3RpbWUgPSBGREtyZWFkQml0cyhicywgMSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgaW50IGxhc3RfYWxwaGFfcV9yZSA9IDAsIGxhc3RfYWxwaGFfcV9pbSA9IDA7CisKKyAgICAgICAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCB3aW5kb3dHcm91cHM7IGdyb3VwKyspIHsKKyAgICAgICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7CisgICAgICAgICAgICAgICAgIGJhbmQgKz0gU0ZCX1BFUl9QUkVEX0JBTkQpIHsKKyAgICAgICAgICAgICAgaWYgKGRlbHRhX2NvZGVfdGltZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgaWYgKGdyb3VwID4gMCkgeworICAgICAgICAgICAgICAgICAgbGFzdF9hbHBoYV9xX3JlID0KKyAgICAgICAgICAgICAgICAgICAgICBjcGx4UHJlZGljdGlvbkRhdGEtPmFscGhhX3FfcmVbZ3JvdXAgLSAxXVtiYW5kXTsKKyAgICAgICAgICAgICAgICAgIGxhc3RfYWxwaGFfcV9pbSA9CisgICAgICAgICAgICAgICAgICAgICAgY3BseFByZWRpY3Rpb25EYXRhLT5hbHBoYV9xX2ltW2dyb3VwIC0gMV1bYmFuZF07CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgod2luZG93U2VxdWVuY2UgPT0gQkxPQ0tfU0hPUlQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAocEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEtPndpblNlcVByZXYgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTE9DS19TSE9SVCkpIHsKKyAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGVkIGZvciBlcnJvci1yb2J1c3RuZXNzICovCisgICAgICAgICAgICAgICAgICBpZiAocEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEtPndpbkdyb3Vwc1ByZXYgPT0gMCkgcmV0dXJuIC0xOworCisgICAgICAgICAgICAgICAgICBsYXN0X2FscGhhX3FfcmUgPQorICAgICAgICAgICAgICAgICAgICAgIHBKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLT5hbHBoYV9xX3JlX3ByZXYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3BKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLT53aW5Hcm91cHNQcmV2IC0gMV1bYmFuZF07CisgICAgICAgICAgICAgICAgICBsYXN0X2FscGhhX3FfaW0gPQorICAgICAgICAgICAgICAgICAgICAgIHBKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLT5hbHBoYV9xX2ltX3ByZXYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3BKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLT53aW5Hcm91cHNQcmV2IC0gMV1bYmFuZF07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGxhc3RfYWxwaGFfcV9yZSA9CisgICAgICAgICAgICAgICAgICAgICAgcEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEtPmFscGhhX3FfcmVfcHJldltncm91cF1bYmFuZF07CisgICAgICAgICAgICAgICAgICBsYXN0X2FscGhhX3FfaW0gPQorICAgICAgICAgICAgICAgICAgICAgIHBKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLT5hbHBoYV9xX2ltX3ByZXZbZ3JvdXBdW2JhbmRdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChiYW5kID4gMCkgeworICAgICAgICAgICAgICAgICAgbGFzdF9hbHBoYV9xX3JlID0KKyAgICAgICAgICAgICAgICAgICAgICBjcGx4UHJlZGljdGlvbkRhdGEtPmFscGhhX3FfcmVbZ3JvdXBdW2JhbmQgLSAxXTsKKyAgICAgICAgICAgICAgICAgIGxhc3RfYWxwaGFfcV9pbSA9CisgICAgICAgICAgICAgICAgICAgICAgY3BseFByZWRpY3Rpb25EYXRhLT5hbHBoYV9xX2ltW2dyb3VwXVtiYW5kIC0gMV07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGxhc3RfYWxwaGFfcV9yZSA9IDA7CisgICAgICAgICAgICAgICAgICBsYXN0X2FscGhhX3FfaW0gPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICB9IC8qIGlmIChkZWx0YV9jb2RlX3RpbWUgPT0gMSkgKi8KKworICAgICAgICAgICAgICBpZiAocEpvaW50U3RlcmVvRGF0YS0+TXNVc2VkW2JhbmRdICYgKChVQ0hBUikxIDw8IGdyb3VwKSkgeworICAgICAgICAgICAgICAgIGludCBkcGNtX2FscGhhX3JlLCBkcGNtX2FscGhhX2ltOworCisgICAgICAgICAgICAgICAgZHBjbV9hbHBoYV9yZSA9IENCbG9ja19EZWNvZGVIdWZmbWFuV29yZChicywgaGNiKTsKKyAgICAgICAgICAgICAgICBkcGNtX2FscGhhX3JlIC09IDYwOworICAgICAgICAgICAgICAgIGRwY21fYWxwaGFfcmUgKj0gLTE7CisKKyAgICAgICAgICAgICAgICBjcGx4UHJlZGljdGlvbkRhdGEtPmFscGhhX3FfcmVbZ3JvdXBdW2JhbmRdID0KKyAgICAgICAgICAgICAgICAgICAgZHBjbV9hbHBoYV9yZSArIGxhc3RfYWxwaGFfcV9yZTsKKworICAgICAgICAgICAgICAgIGlmIChjcGx4UHJlZGljdGlvbkRhdGEtPmNvbXBsZXhfY29lZikgeworICAgICAgICAgICAgICAgICAgZHBjbV9hbHBoYV9pbSA9IENCbG9ja19EZWNvZGVIdWZmbWFuV29yZChicywgaGNiKTsKKyAgICAgICAgICAgICAgICAgIGRwY21fYWxwaGFfaW0gLT0gNjA7CisgICAgICAgICAgICAgICAgICBkcGNtX2FscGhhX2ltICo9IC0xOworCisgICAgICAgICAgICAgICAgICBjcGx4UHJlZGljdGlvbkRhdGEtPmFscGhhX3FfaW1bZ3JvdXBdW2JhbmRdID0KKyAgICAgICAgICAgICAgICAgICAgICBkcGNtX2FscGhhX2ltICsgbGFzdF9hbHBoYV9xX2ltOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBjcGx4UHJlZGljdGlvbkRhdGEtPmFscGhhX3FfaW1bZ3JvdXBdW2JhbmRdID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjcGx4UHJlZGljdGlvbkRhdGEtPmFscGhhX3FfcmVbZ3JvdXBdW2JhbmRdID0gMDsKKyAgICAgICAgICAgICAgICBjcGx4UHJlZGljdGlvbkRhdGEtPmFscGhhX3FfaW1bZ3JvdXBdW2JhbmRdID0gMDsKKyAgICAgICAgICAgICAgfSAvKiBpZiAocEpvaW50U3RlcmVvRGF0YS0+TXNVc2VkW2JhbmRdICYgKChVQ0hBUikxIDw8IGdyb3VwKSkgKi8KKworICAgICAgICAgICAgICBpZiAoKGJhbmQgKyAxKSA8CisgICAgICAgICAgICAgICAgICBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQpIHsgLyogPD0gdGhpcyBzaG91bGQgYmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdCB3YXkgKGNwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTT19JRUNfRkRJU18yMzAwMy0wKEUpICovCisgICAgICAgICAgICAgICAgLyogICAgNy43LjIuMy4yIERlY29kaW5nIG9mIHByZWRpY3Rpb24gY29lZmZpY2llbnRzKSAqLworICAgICAgICAgICAgICAgIGNwbHhQcmVkaWN0aW9uRGF0YS0+YWxwaGFfcV9yZVtncm91cF1bYmFuZCArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgY3BseFByZWRpY3Rpb25EYXRhLT5hbHBoYV9xX3JlW2dyb3VwXVtiYW5kXTsKKyAgICAgICAgICAgICAgICBjcGx4UHJlZGljdGlvbkRhdGEtPmFscGhhX3FfaW1bZ3JvdXBdW2JhbmQgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgIGNwbHhQcmVkaWN0aW9uRGF0YS0+YWxwaGFfcV9pbVtncm91cF1bYmFuZF07CisgICAgICAgICAgICAgIH0gLyogaWYgKChiYW5kKzEpPHNjYWxlRmFjdG9yQmFuZHNUb3RhbCkgKi8KKworICAgICAgICAgICAgICBwSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS0+YWxwaGFfcV9yZV9wcmV2W2dyb3VwXVtiYW5kXSA9CisgICAgICAgICAgICAgICAgICBjcGx4UHJlZGljdGlvbkRhdGEtPmFscGhhX3FfcmVbZ3JvdXBdW2JhbmRdOworICAgICAgICAgICAgICBwSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS0+YWxwaGFfcV9pbV9wcmV2W2dyb3VwXVtiYW5kXSA9CisgICAgICAgICAgICAgICAgICBjcGx4UHJlZGljdGlvbkRhdGEtPmFscGhhX3FfaW1bZ3JvdXBdW2JhbmRdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGJhbmQgPSBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7IGJhbmQgPCBtYXhfc2ZiX3N0ZV9jbGVhcjsKKyAgICAgICAgICAgICAgICAgYmFuZCsrKSB7CisgICAgICAgICAgICAgIGNwbHhQcmVkaWN0aW9uRGF0YS0+YWxwaGFfcV9yZVtncm91cF1bYmFuZF0gPSAwOworICAgICAgICAgICAgICBjcGx4UHJlZGljdGlvbkRhdGEtPmFscGhhX3FfaW1bZ3JvdXBdW2JhbmRdID0gMDsKKyAgICAgICAgICAgICAgcEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEtPmFscGhhX3FfcmVfcHJldltncm91cF1bYmFuZF0gPSAwOworICAgICAgICAgICAgICBwSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS0+YWxwaGFfcV9pbV9wcmV2W2dyb3VwXVtiYW5kXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IHdpbmRvd0dyb3VwczsgZ3JvdXArKykgeworICAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbWF4X3NmYl9zdGVfY2xlYXI7IGJhbmQrKykgeworICAgICAgICAgIHBKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLT5hbHBoYV9xX3JlX3ByZXZbZ3JvdXBdW2JhbmRdID0gMDsKKyAgICAgICAgICBwSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS0+YWxwaGFfcV9pbV9wcmV2W2dyb3VwXVtiYW5kXSA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBwSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YS0+d2luR3JvdXBzUHJldiA9IHdpbmRvd0dyb3VwczsKICAgfQogCiAgIHJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBDSm9pbnRTdGVyZW9fZmlsdGVyQW5kQWRkKAorICAgIEZJWFBfREJMICppbiwgaW50IGxlbiwgaW50IHdpbmRvd0xlbiwgY29uc3QgRklYUF9GSUxUICpjb2VmZiwgRklYUF9EQkwgKm91dCwKKyAgICBVQ0hBUiBpc0N1cnJlbnQgLyogb3V0cHV0IHZhbHVlcyB3aXRoIGV2ZW4gaW5kZXggZ2V0IGEKKyAgICAgICAgICAgICAgICAgICAgICAgcG9zaXR2ZSBhZGRvbiAoPTEpIG9yIGEgbmVnYXRpdmUgYWRkb24KKyAgICAgICAgICAgICAgICAgICAgICAgKD0wKSAqLworKSB7CisgIGludCBpLCBqOworCisgIGludCBpbmRpY2VzXzFbXSA9IHsyLCAxLCAwLCAxLCAyLCAzfTsKKyAgaW50IGluZGljZXNfMltdID0gezEsIDAsIDAsIDIsIDMsIDR9OworICBpbnQgaW5kaWNlc18zW10gPSB7MCwgMCwgMSwgMywgNCwgNX07CisKKyAgaW50IHN1YnRyXzFbXSA9IHs2LCA1LCA0LCAyLCAxLCAxfTsKKyAgaW50IHN1YnRyXzJbXSA9IHs1LCA0LCAzLCAxLCAxLCAyfTsKKyAgaW50IHN1YnRyXzNbXSA9IHs0LCAzLCAyLCAxLCAyLCAzfTsKKworICBpZiAoaXNDdXJyZW50ID09IDEpIHsKKyAgICAvKiBleHBsb2l0IHRoZSBzeW1tZXRyeSBvZiB0aGUgdGFibGU6IGNvZWZmWzZdID0gLSBjb2VmZlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmWzVdID0gLSBjb2VmZlsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmWzRdID0gLSBjb2VmZlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmWzNdID0gMAorICAgICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICBvdXRbMF0gLT0gKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5baW5kaWNlc18xW2ldXSkgPj4gU1JfRk5BX09VVDsKKyAgICAgIG91dFswXSArPQorICAgICAgICAgIChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbaV0sIGluW2luZGljZXNfMVs1IC0gaV1dKSA+PiBTUl9GTkFfT1VUOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgIG91dFsxXSAtPSAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltpbmRpY2VzXzJbaV1dKSA+PiBTUl9GTkFfT1VUOworICAgICAgb3V0WzFdICs9CisgICAgICAgICAgKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5baW5kaWNlc18yWzUgLSBpXV0pID4+IFNSX0ZOQV9PVVQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgb3V0WzJdIC09IChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbaV0sIGluW2luZGljZXNfM1tpXV0pID4+IFNSX0ZOQV9PVVQ7CisgICAgICBvdXRbMl0gKz0KKyAgICAgICAgICAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltpbmRpY2VzXzNbNSAtIGldXSkgPj4gU1JfRk5BX09VVDsKKyAgICB9CisKKyAgICBmb3IgKGogPSAzOyBqIDwgKGxlbiAtIDMpOyBqKyspIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgb3V0W2pdIC09IChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbaV0sIGluW2ogLSAzICsgaV0pID4+IFNSX0ZOQV9PVVQ7CisgICAgICAgIG91dFtqXSArPSAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltqICsgMyAtIGldKSA+PiBTUl9GTkFfT1VUOworICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgIG91dFtsZW4gLSAzXSAtPQorICAgICAgICAgIChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbaV0sIGluW2xlbiAtIHN1YnRyXzFbaV1dKSA+PiBTUl9GTkFfT1VUOworICAgICAgb3V0W2xlbiAtIDNdICs9CisgICAgICAgICAgKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5bbGVuIC0gc3VidHJfMVs1IC0gaV1dKSA+PiBTUl9GTkFfT1VUOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgIG91dFtsZW4gLSAyXSAtPQorICAgICAgICAgIChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbaV0sIGluW2xlbiAtIHN1YnRyXzJbaV1dKSA+PiBTUl9GTkFfT1VUOworICAgICAgb3V0W2xlbiAtIDJdICs9CisgICAgICAgICAgKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5bbGVuIC0gc3VidHJfMls1IC0gaV1dKSA+PiBTUl9GTkFfT1VUOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgIG91dFtsZW4gLSAxXSAtPQorICAgICAgICAgIChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbaV0sIGluW2xlbiAtIHN1YnRyXzNbaV1dKSA+PiBTUl9GTkFfT1VUOworICAgICAgb3V0W2xlbiAtIDFdICs9CisgICAgICAgICAgKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5bbGVuIC0gc3VidHJfM1s1IC0gaV1dKSA+PiBTUl9GTkFfT1VUOworICAgIH0KKworICB9IGVsc2UgeworICAgIC8qIGV4cGxvaXQgdGhlIHN5bW1ldHJ5IG9mIHRoZSB0YWJsZTogY29lZmZbNl0gPSBjb2VmZlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmWzVdID0gY29lZmZbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZls0XSA9IGNvZWZmWzJdCisgICAgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgIG91dFswXSAtPSAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltpbmRpY2VzXzFbaV1dID4+IFNSX0ZOQV9PVVQpOworICAgICAgb3V0WzBdIC09CisgICAgICAgICAgKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5baW5kaWNlc18xWzUgLSBpXV0gPj4gU1JfRk5BX09VVCk7CisgICAgfQorICAgIG91dFswXSAtPSAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmWzNdLCBpblswXSA+PiBTUl9GTkFfT1VUKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgIG91dFsxXSArPSAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltpbmRpY2VzXzJbaV1dID4+IFNSX0ZOQV9PVVQpOworICAgICAgb3V0WzFdICs9CisgICAgICAgICAgKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5baW5kaWNlc18yWzUgLSBpXV0gPj4gU1JfRk5BX09VVCk7CisgICAgfQorICAgIG91dFsxXSArPSAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmWzNdLCBpblsxXSA+PiBTUl9GTkFfT1VUKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgIG91dFsyXSAtPSAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltpbmRpY2VzXzNbaV1dID4+IFNSX0ZOQV9PVVQpOworICAgICAgb3V0WzJdIC09CisgICAgICAgICAgKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5baW5kaWNlc18zWzUgLSBpXV0gPj4gU1JfRk5BX09VVCk7CisgICAgfQorICAgIG91dFsyXSAtPSAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmWzNdLCBpblsyXSA+PiBTUl9GTkFfT1VUKTsKKworICAgIGZvciAoaiA9IDM7IGogPCAobGVuIC0gNCk7IGorKykgeworICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBvdXRbal0gKz0gKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5baiAtIDMgKyBpXSA+PiBTUl9GTkFfT1VUKTsKKyAgICAgICAgb3V0W2pdICs9IChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbaV0sIGluW2ogKyAzIC0gaV0gPj4gU1JfRk5BX09VVCk7CisgICAgICB9CisgICAgICBvdXRbal0gKz0gKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZlszXSwgaW5bal0gPj4gU1JfRk5BX09VVCk7CisKKyAgICAgIGorKzsKKworICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBvdXRbal0gLT0gKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5baiAtIDMgKyBpXSA+PiBTUl9GTkFfT1VUKTsKKyAgICAgICAgb3V0W2pdIC09IChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbaV0sIGluW2ogKyAzIC0gaV0gPj4gU1JfRk5BX09VVCk7CisgICAgICB9CisgICAgICBvdXRbal0gLT0gKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZlszXSwgaW5bal0gPj4gU1JfRk5BX09VVCk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgb3V0W2xlbiAtIDNdICs9CisgICAgICAgICAgKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5bbGVuIC0gc3VidHJfMVtpXV0gPj4gU1JfRk5BX09VVCk7CisgICAgICBvdXRbbGVuIC0gM10gKz0KKyAgICAgICAgICAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltsZW4gLSBzdWJ0cl8xWzUgLSBpXV0gPj4gU1JfRk5BX09VVCk7CisgICAgfQorICAgIG91dFtsZW4gLSAzXSArPSAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmWzNdLCBpbltsZW4gLSAzXSA+PiBTUl9GTkFfT1VUKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgIG91dFtsZW4gLSAyXSAtPQorICAgICAgICAgIChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbaV0sIGluW2xlbiAtIHN1YnRyXzJbaV1dID4+IFNSX0ZOQV9PVVQpOworICAgICAgb3V0W2xlbiAtIDJdIC09CisgICAgICAgICAgKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZltpXSwgaW5bbGVuIC0gc3VidHJfMls1IC0gaV1dID4+IFNSX0ZOQV9PVVQpOworICAgIH0KKyAgICBvdXRbbGVuIC0gMl0gLT0gKEZJWFBfREJMKWZNdWx0RGl2Mihjb2VmZlszXSwgaW5bbGVuIC0gMl0gPj4gU1JfRk5BX09VVCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICBvdXRbbGVuIC0gMV0gKz0KKyAgICAgICAgICAoRklYUF9EQkwpZk11bHREaXYyKGNvZWZmW2ldLCBpbltsZW4gLSBzdWJ0cl8zW2ldXSA+PiBTUl9GTkFfT1VUKTsKKyAgICAgIG91dFtsZW4gLSAxXSArPQorICAgICAgICAgIChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbaV0sIGluW2xlbiAtIHN1YnRyXzNbNSAtIGldXSA+PiBTUl9GTkFfT1VUKTsKKyAgICB9CisgICAgb3V0W2xlbiAtIDFdICs9IChGSVhQX0RCTClmTXVsdERpdjIoY29lZmZbM10sIGluW2xlbiAtIDFdID4+IFNSX0ZOQV9PVVQpOworICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBDSm9pbnRTdGVyZW9fR2VuZXJhdGVNU091dHB1dChGSVhQX0RCTCAqcFNwZWNMQ3VyckJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBTcGVjUkN1cnJCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgbGVmdFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgcmlnaHRTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIG5TZmJCYW5kcykgeworICB1bnNpZ25lZCBpbnQgaTsKKworICBGSVhQX0RCTCBsZWZ0Q29lZmZpY2llbnQwOworICBGSVhQX0RCTCBsZWZ0Q29lZmZpY2llbnQxOworICBGSVhQX0RCTCBsZWZ0Q29lZmZpY2llbnQyOworICBGSVhQX0RCTCBsZWZ0Q29lZmZpY2llbnQzOworCisgIEZJWFBfREJMIHJpZ2h0Q29lZmZpY2llbnQwOworICBGSVhQX0RCTCByaWdodENvZWZmaWNpZW50MTsKKyAgRklYUF9EQkwgcmlnaHRDb2VmZmljaWVudDI7CisgIEZJWFBfREJMIHJpZ2h0Q29lZmZpY2llbnQzOworCisgIGZvciAoaSA9IG5TZmJCYW5kczsgaSA+IDA7IGkgLT0gNCkgeworICAgIGxlZnRDb2VmZmljaWVudDAgPSBwU3BlY0xDdXJyQmFuZFtpIC0gNF07CisgICAgbGVmdENvZWZmaWNpZW50MSA9IHBTcGVjTEN1cnJCYW5kW2kgLSAzXTsKKyAgICBsZWZ0Q29lZmZpY2llbnQyID0gcFNwZWNMQ3VyckJhbmRbaSAtIDJdOworICAgIGxlZnRDb2VmZmljaWVudDMgPSBwU3BlY0xDdXJyQmFuZFtpIC0gMV07CisKKyAgICByaWdodENvZWZmaWNpZW50MCA9IHBTcGVjUkN1cnJCYW5kW2kgLSA0XTsKKyAgICByaWdodENvZWZmaWNpZW50MSA9IHBTcGVjUkN1cnJCYW5kW2kgLSAzXTsKKyAgICByaWdodENvZWZmaWNpZW50MiA9IHBTcGVjUkN1cnJCYW5kW2kgLSAyXTsKKyAgICByaWdodENvZWZmaWNpZW50MyA9IHBTcGVjUkN1cnJCYW5kW2kgLSAxXTsKKworICAgIC8qIE1TIG91dHB1dCBnZW5lcmF0aW9uICovCisgICAgbGVmdENvZWZmaWNpZW50MCA+Pj0gbGVmdFNjYWxlOworICAgIGxlZnRDb2VmZmljaWVudDEgPj49IGxlZnRTY2FsZTsKKyAgICBsZWZ0Q29lZmZpY2llbnQyID4+PSBsZWZ0U2NhbGU7CisgICAgbGVmdENvZWZmaWNpZW50MyA+Pj0gbGVmdFNjYWxlOworCisgICAgcmlnaHRDb2VmZmljaWVudDAgPj49IHJpZ2h0U2NhbGU7CisgICAgcmlnaHRDb2VmZmljaWVudDEgPj49IHJpZ2h0U2NhbGU7CisgICAgcmlnaHRDb2VmZmljaWVudDIgPj49IHJpZ2h0U2NhbGU7CisgICAgcmlnaHRDb2VmZmljaWVudDMgPj49IHJpZ2h0U2NhbGU7CisKKyAgICBwU3BlY0xDdXJyQmFuZFtpIC0gNF0gPSBsZWZ0Q29lZmZpY2llbnQwICsgcmlnaHRDb2VmZmljaWVudDA7CisgICAgcFNwZWNMQ3VyckJhbmRbaSAtIDNdID0gbGVmdENvZWZmaWNpZW50MSArIHJpZ2h0Q29lZmZpY2llbnQxOworICAgIHBTcGVjTEN1cnJCYW5kW2kgLSAyXSA9IGxlZnRDb2VmZmljaWVudDIgKyByaWdodENvZWZmaWNpZW50MjsKKyAgICBwU3BlY0xDdXJyQmFuZFtpIC0gMV0gPSBsZWZ0Q29lZmZpY2llbnQzICsgcmlnaHRDb2VmZmljaWVudDM7CisKKyAgICBwU3BlY1JDdXJyQmFuZFtpIC0gNF0gPSBsZWZ0Q29lZmZpY2llbnQwIC0gcmlnaHRDb2VmZmljaWVudDA7CisgICAgcFNwZWNSQ3VyckJhbmRbaSAtIDNdID0gbGVmdENvZWZmaWNpZW50MSAtIHJpZ2h0Q29lZmZpY2llbnQxOworICAgIHBTcGVjUkN1cnJCYW5kW2kgLSAyXSA9IGxlZnRDb2VmZmljaWVudDIgLSByaWdodENvZWZmaWNpZW50MjsKKyAgICBwU3BlY1JDdXJyQmFuZFtpIC0gMV0gPSBsZWZ0Q29lZmZpY2llbnQzIC0gcmlnaHRDb2VmZmljaWVudDM7CisgIH0KK30KKwogdm9pZCBDSm9pbnRTdGVyZW9fQXBwbHlNUygKLSAgICAgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1syXSwKLSAgICAgICAgY29uc3QgU0hPUlQgKnBTY2FsZUZhY3RvckJhbmRPZmZzZXRzLAotICAgICAgICBjb25zdCBVQ0hBUiAqcFdpbmRvd0dyb3VwTGVuZ3RoLAotICAgICAgICBjb25zdCBpbnQgd2luZG93R3JvdXBzLAotICAgICAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkTCwKLSAgICAgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZFIKLSAgICAgICAgKQotewotICBDSm9pbnRTdGVyZW9EYXRhICpwSm9pbnRTdGVyZW9EYXRhID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBDb21EYXRhLT5qb2ludFN0ZXJlb0RhdGE7Ci0gIGludCB3aW5kb3csIGdyb3VwLCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7CisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mb1syXSwKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvWzJdLAorICAgIEZJWFBfREJMICpzcGVjdHJ1bUwsIEZJWFBfREJMICpzcGVjdHJ1bVIsIFNIT1JUICpTRkJsZWZ0U2NhbGUsCisgICAgU0hPUlQgKlNGQnJpZ2h0U2NhbGUsIFNIT1JUICpzcGVjU2NhbGVMLCBTSE9SVCAqc3BlY1NjYWxlUiwKKyAgICBjb25zdCBTSE9SVCAqcFNjYWxlRmFjdG9yQmFuZE9mZnNldHMsIGNvbnN0IFVDSEFSICpwV2luZG93R3JvdXBMZW5ndGgsCisgICAgY29uc3QgaW50IHdpbmRvd0dyb3VwcywgY29uc3QgaW50IG1heF9zZmJfc3RlX291dHNpZGUsCisgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZEwsCisgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZFIsIEZJWFBfREJMICpzdG9yZV9kbXhfcmVfcHJldiwKKyAgICBTSE9SVCAqc3RvcmVfZG14X3JlX3ByZXZfZSwgY29uc3QgaW50IG1haW5iYW5kX2ZsYWcpIHsKKyAgaW50IHdpbmRvdywgZ3JvdXAsIGJhbmQ7CisgIFVDSEFSIGdyb3VwTWFzazsKKyAgQ0pvaW50U3RlcmVvRGF0YSAqcEpvaW50U3RlcmVvRGF0YSA9CisgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cENvbURhdGEtPmpvaW50U3RlcmVvRGF0YTsKKyAgQ0NwbHhQcmVkaWN0aW9uRGF0YSAqY3BseFByZWRpY3Rpb25EYXRhID0KKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBDb21TdGF0aWNEYXRhLT5jcGx4UHJlZGljdGlvbkRhdGE7CiAKLSAgRkRLX0FTU0VSVChzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRMID09IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZFIpOwotICBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQgPSBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRMOwotICBmb3IgKHdpbmRvdyA9IDAsIGdyb3VwID0gMDsgZ3JvdXAgPCB3aW5kb3dHcm91cHM7IGdyb3VwKyspCi0gIHsKLSAgICBVQ0hBUiBncm91cE1hc2sgPSAxIDw8IGdyb3VwOworICBpbnQgbWF4X3NmYl9zdGUgPQorICAgICAgZk1heChzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRMLCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRSKTsKKyAgaW50IG1pbl9zZmJfc3RlID0KKyAgICAgIGZNaW4oc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkTCwgc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkUik7CisgIGludCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQgPSBtaW5fc2ZiX3N0ZTsKIAotICAgIGZvciAoaW50IGdyb3Vwd2luPTA7IGdyb3Vwd2luPHBXaW5kb3dHcm91cExlbmd0aFtncm91cF07IGdyb3Vwd2luKyssIHdpbmRvdysrKQorICBpZiAocEpvaW50U3RlcmVvRGF0YS0+Y3BseF9wcmVkX2ZsYWcpIHsKKyAgICBpbnQgd2luZG93TGVuLCBncm91cHdpbiwgZnJhbWVNYXhTY2FsZTsKKyAgICBDSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YSAqcEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEgPQorICAgICAgICAmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mb1tMXQorICAgICAgICAgICAgIC0+cENwZVN0YXRpY0RhdGEtPmpvaW50U3RlcmVvUGVyc2lzdGVudERhdGE7CisgICAgRklYUF9EQkwgKmNvbnN0IHN0YXRpY1NwZWN0cmFsQ29lZmZzTCA9CisgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bTF0KKyAgICAgICAgICAgIC0+cENwZVN0YXRpY0RhdGEtPmpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEuc3BlY3RyYWxDb2VmZnNbTF07CisgICAgRklYUF9EQkwgKmNvbnN0IHN0YXRpY1NwZWN0cmFsQ29lZmZzUiA9CisgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bTF0KKyAgICAgICAgICAgIC0+cENwZVN0YXRpY0RhdGEtPmpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEuc3BlY3RyYWxDb2VmZnNbUl07CisgICAgU0hPUlQgKmNvbnN0IHN0YXRpY1NwZWNTY2FsZUwgPQorICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW0xdCisgICAgICAgICAgICAtPnBDcGVTdGF0aWNEYXRhLT5qb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLnNwZWNTY2FsZVtMXTsKKyAgICBTSE9SVCAqY29uc3Qgc3RhdGljU3BlY1NjYWxlUiA9CisgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bTF0KKyAgICAgICAgICAgIC0+cENwZVN0YXRpY0RhdGEtPmpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEuc3BlY1NjYWxlW1JdOworCisgICAgRklYUF9EQkwgKmRteF9yZSA9CisgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bTF0KKyAgICAgICAgICAgIC0+cENwZVN0YXRpY0RhdGEtPmpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEuc2NyYXRjaEJ1ZmZlcjsKKyAgICBGSVhQX0RCTCAqZG14X3JlX3ByZXYgPQorICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW0xdCisgICAgICAgICAgICAtPnBDcGVTdGF0aWNEYXRhLT5qb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLnNjcmF0Y2hCdWZmZXIgKworICAgICAgICAxMDI0OworCisgICAgLyogV2hlbiBNUyBpcyBhcHBsaWVkIG92ZXIgdGhlIG1haW4gYmFuZCB0aGlzIHZhbHVlIGdldHMgY29tcHV0ZWQuIE90aGVyd2lzZQorICAgICAqIChmb3IgdGhlIHRpbGVzKSBpdCB1c2VzIHRoZSBhc3NpZ25lZCB2YWx1ZSAqLworICAgIFNIT1JUIGRteF9yZV9wcmV2X2UgPSAqc3RvcmVfZG14X3JlX3ByZXZfZTsKKworICAgIGNvbnN0IEZJWFBfRklMVCAqcENvZWZmOworICAgIGNvbnN0IEZJWFBfRklMVCAqcENvZWZmUHJldjsKKyAgICBpbnQgY29lZmZQb2ludGVyT2Zmc2V0OworCisgICAgaW50IHByZXZpb3VzU2hhcGUgPSAoaW50KXBKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLT53aW5TaGFwZVByZXY7CisgICAgaW50IGN1cnJlbnRTaGFwZSA9IChpbnQpcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mby5XaW5kb3dTaGFwZTsKKworICAgIC8qIGNvbXBsZXggc3RlcmVvIHByZWRpY3Rpb24gKi8KKworICAgIC8qIDAuIHByZXBhcmF0aW9ucyAqLworCisgICAgLyogMC4wLiBnZXQgc2NyYXRjaCBidWZmZXIgZm9yIGRvd25taXggTURTVCAqLworICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQoZG14X2ltLCBGSVhQX0RCTCwgMTAyNCk7CisKKyAgICAvKiAwLjEuIHdpbmRvdyBsZW5ndGhzICovCisKKyAgICAvKiBnZXQgbGVuZ3RoIG9mIHNob3J0IHdpbmRvdyBmb3IgY3VycmVudCBjb25maWd1cmF0aW9uICovCisgICAgd2luZG93TGVuID0KKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+Z3JhbnVsZUxlbmd0aDsgLyogZnJhbWVsZW5ndGggNzY4ID0+IDk2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWxlbmd0aCAxMDI0ID0+IDEyOCAqLworCisgICAgLyogaWYgdGhpcyBpcyBubyBzaG9ydC1ibG9jayBzZXQgbGVuZ3RoIGZvciBsb25nLWJsb2NrICovCisgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8uV2luZG93U2VxdWVuY2UgIT0gQkxPQ0tfU0hPUlQpIHsKKyAgICAgIHdpbmRvd0xlbiAqPSA4OworICAgIH0KKworICAgIC8qIDAuMi4gc2V0IHBvaW50ZXIgdG8gZmlsdGVyLWNvZWZmaWNpZW50cyBmb3IgTURTVCBleGNpdGF0aW9uIGluY2x1ZGluZworICAgICAqIHByZXZpb3VzIGZyYW1lIHBvcnRpb25zICovCisgICAgLyogICAgICBjcC4gSVNPL0lFQyBGRElTIDIzMDAzLTM6MjAxMShFKSB0YWJsZSAxMjUgKi8KKworICAgIC8qIHNldCBwb2ludGVyIHRvIGRlZmF1bHQtcG9zaXRpb24gKi8KKyAgICBwQ29lZmZQcmV2ID0gbWRzdF9maWx0X2NvZWZfcHJldltwcmV2aW91c1NoYXBlXTsKKworICAgIGlmIChjcGx4UHJlZGljdGlvbkRhdGEtPmNvbXBsZXhfY29lZiA9PSAxKSB7CisgICAgICBzd2l0Y2ggKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0KKyAgICAgICAgICAgICAgICAgIC0+aWNzSW5mby5XaW5kb3dTZXF1ZW5jZSkgeyAvKiBjdXJyZW50IHdpbmRvdyBzZXF1ZW5jZSAqLworICAgICAgICBjYXNlIEJMT0NLX1NIT1JUOgorICAgICAgICBjYXNlIEJMT0NLX0xPTkc6CisgICAgICAgICAgcENvZWZmUHJldiA9IG1kc3RfZmlsdF9jb2VmX3ByZXZbcHJldmlvdXNTaGFwZV07CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCTE9DS19TVEFSVDoKKyAgICAgICAgICBpZiAoKHBKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhLT53aW5TZXFQcmV2ID09IEJMT0NLX1NIT1JUKSB8fAorICAgICAgICAgICAgICAocEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEtPndpblNlcVByZXYgPT0gQkxPQ0tfU1RBUlQpKSB7CisgICAgICAgICAgICAvKiBhIHN0b3Atc3RhcnQtc2VxdWVuY2UgY2FuIG9ubHkgZm9sbG93IG9uIGFuIGVpZ2h0LXNob3J0LXNlcXVlbmNlCisgICAgICAgICAgICAgKiBvciBhIHN0YXJ0LXNlcXVlbmNlICovCisgICAgICAgICAgICBwQ29lZmZQcmV2ID0gbWRzdF9maWx0X2NvZWZfcHJldlsyICsgcHJldmlvdXNTaGFwZV07CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBDb2VmZlByZXYgPSBtZHN0X2ZpbHRfY29lZl9wcmV2W3ByZXZpb3VzU2hhcGVdOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJMT0NLX1NUT1A6CisgICAgICAgICAgcENvZWZmUHJldiA9IG1kc3RfZmlsdF9jb2VmX3ByZXZbMiArIHByZXZpb3VzU2hhcGVdOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcENvZWZmUHJldiA9IG1kc3RfZmlsdF9jb2VmX3ByZXZbcHJldmlvdXNTaGFwZV07CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgLyogMC4zLiBzZXQgcG9pbnRlciB0byBmaWx0ZXItY29lZmZpY2llbnRzIGZvciBNRFNUIGV4Y2l0YXRpb24gKi8KKworICAgIC8qIGRlZmluZSBvZmZzZXQgb2YgcG9pbnRlciB0byBmaWx0ZXItY29lZmZpY2llbnRzIGZvciBNRFNUIGV4aXRhdGlvbgorICAgICAqIGVtcGxveWluZyBvbmx5IHRoZSBjdXJyZW50IGZyYW1lICovCisgICAgaWYgKChwcmV2aW91c1NoYXBlID09IFNIQVBFX1NJTkUpICYmIChjdXJyZW50U2hhcGUgPT0gU0hBUEVfU0lORSkpIHsKKyAgICAgIGNvZWZmUG9pbnRlck9mZnNldCA9IDA7CisgICAgfSBlbHNlIGlmICgocHJldmlvdXNTaGFwZSA9PSBTSEFQRV9TSU5FKSAmJiAoY3VycmVudFNoYXBlID09IFNIQVBFX0tCRCkpIHsKKyAgICAgIGNvZWZmUG9pbnRlck9mZnNldCA9IDI7CisgICAgfSBlbHNlIGlmICgocHJldmlvdXNTaGFwZSA9PSBTSEFQRV9LQkQpICYmIChjdXJyZW50U2hhcGUgPT0gU0hBUEVfS0JEKSkgeworICAgICAgY29lZmZQb2ludGVyT2Zmc2V0ID0gMTsKKyAgICB9IGVsc2UgLyogaWYgKCAocHJldmlvdXNTaGFwZSA9PSBTSEFQRV9LQkQpICYmIChjdXJyZW50U2hhcGUgPT0gU0hBUEVfU0lORSkKKyAgICAgICAgICAgICAgKSAqLwogICAgIHsKLSAgICAgIGludCBiYW5kOwotICAgICAgRklYUF9EQkwgKmxlZnRTcGVjdHJ1bSwgKnJpZ2h0U3BlY3RydW07Ci0gICAgICBTSE9SVCAqbGVmdFNjYWxlID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBEeW5EYXRhLT5hU2ZiU2NhbGVbd2luZG93KjE2XTsKLSAgICAgIFNIT1JUICpyaWdodFNjYWxlID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPnBEeW5EYXRhLT5hU2ZiU2NhbGVbd2luZG93KjE2XTsKKyAgICAgIGNvZWZmUG9pbnRlck9mZnNldCA9IDM7CisgICAgfQogCi0gICAgICBsZWZ0U3BlY3RydW0gPSBTUEVDKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBTcGVjdHJhbENvZWZmaWNpZW50LCB3aW5kb3csIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmdyYW51bGVMZW5ndGgpOwotICAgICAgcmlnaHRTcGVjdHJ1bSA9IFNQRUMocEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+cFNwZWN0cmFsQ29lZmZpY2llbnQsIHdpbmRvdywgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+Z3JhbnVsZUxlbmd0aCk7CisgICAgLyogc2V0IHBvaW50ZXIgdG8gZmlsdGVyLWNvZWZmaWNpZW50IHRhYmxlIGNwLiBJU08vSUVDIEZESVMgMjMwMDMtMzoyMDExKEUpCisgICAgICogdGFibGUgMTI0ICovCisgICAgc3dpdGNoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdCisgICAgICAgICAgICAgICAgLT5pY3NJbmZvLldpbmRvd1NlcXVlbmNlKSB7IC8qIGN1cnJlbnQgd2luZG93IHNlcXVlbmNlICovCisgICAgICBjYXNlIEJMT0NLX1NIT1JUOgorICAgICAgY2FzZSBCTE9DS19MT05HOgorICAgICAgICBwQ29lZmYgPSBtZHN0X2ZpbHRfY29lZl9jdXJyW2NvZWZmUG9pbnRlck9mZnNldF07CisgICAgICAgIGJyZWFrOwogCi0gICAgICBmb3IgKGJhbmQ9MDsgYmFuZDxzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7IGJhbmQrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKHBKb2ludFN0ZXJlb0RhdGEtPk1zVXNlZFtiYW5kXSAmIGdyb3VwTWFzaykKLSAgICAgICAgewotICAgICAgICAgIGludCBsU2NhbGU9bGVmdFNjYWxlW2JhbmRdOwotICAgICAgICAgIGludCByU2NhbGU9cmlnaHRTY2FsZVtiYW5kXTsKLSAgICAgICAgICBpbnQgY29tbW9uU2NhbGU9bFNjYWxlID4gclNjYWxlID8gbFNjYWxlOnJTY2FsZTsKKyAgICAgIGNhc2UgQkxPQ0tfU1RBUlQ6CisgICAgICAgIGlmICgocEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEtPndpblNlcVByZXYgPT0gQkxPQ0tfU0hPUlQpIHx8CisgICAgICAgICAgICAocEpvaW50U3RlcmVvUGVyc2lzdGVudERhdGEtPndpblNlcVByZXYgPT0gQkxPQ0tfU1RBUlQpKSB7CisgICAgICAgICAgLyogYSBzdG9wLXN0YXJ0LXNlcXVlbmNlIGNhbiBvbmx5IGZvbGxvdyBvbiBhbiBlaWdodC1zaG9ydC1zZXF1ZW5jZSBvcgorICAgICAgICAgICAqIGEgc3RhcnQtc2VxdWVuY2UgKi8KKyAgICAgICAgICBwQ29lZmYgPSBtZHN0X2ZpbHRfY29lZl9jdXJyWzEyICsgY29lZmZQb2ludGVyT2Zmc2V0XTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwQ29lZmYgPSBtZHN0X2ZpbHRfY29lZl9jdXJyWzQgKyBjb2VmZlBvaW50ZXJPZmZzZXRdOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgLyogSVNPL0lFQyAxNDQ5Ni0zIENoYXB0ZXIgNC42LjguMS4xIDoKLSAgICAgICAgICAgICBNL1Mgam9pbnQgY2hhbm5lbCBjb2RpbmcgY2FuIG9ubHkgYmUgdXNlZCBpZiBjb21tb25fd2luZG93IGlzIJExki4gKi8KLSAgICAgICAgICBGREtfQVNTRVJUKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKSA9PSBHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+aWNzSW5mbykpOwotICAgICAgICAgIEZES19BU1NFUlQoR2V0V2luZG93U2hhcGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8pID09IEdldFdpbmRvd1NoYXBlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5pY3NJbmZvKSk7CisgICAgICBjYXNlIEJMT0NLX1NUT1A6CisgICAgICAgIHBDb2VmZiA9IG1kc3RfZmlsdF9jb2VmX2N1cnJbOCArIGNvZWZmUG9pbnRlck9mZnNldF07CisgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgY29tbW9uU2NhbGUrKzsKLSAgICAgICAgICBsZWZ0U2NhbGVbYmFuZF09Y29tbW9uU2NhbGU7Ci0gICAgICAgICAgcmlnaHRTY2FsZVtiYW5kXT1jb21tb25TY2FsZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHBDb2VmZiA9IG1kc3RfZmlsdF9jb2VmX2N1cnJbY29lZmZQb2ludGVyT2Zmc2V0XTsKKyAgICB9CiAKLSAgICAgICAgICBsU2NhbGUgPSBmTWluKERGUkFDVF9CSVRTLTEsIGNvbW1vblNjYWxlIC0gbFNjYWxlKTsKLSAgICAgICAgICByU2NhbGUgPSBmTWluKERGUkFDVF9CSVRTLTEsIGNvbW1vblNjYWxlIC0gclNjYWxlKTsKKyAgICAvKiAwLjQuIGZpbmQgbWF4aW11bSBjb21tb24gKGwvcikgYmFuZC1zY2FsaW5nLWZhY3RvciBmb3Igd2hvbGUgc2VxdWVuY2UKKyAgICAgKiAoYWxsIHdpbmRvd3MpICovCisgICAgZnJhbWVNYXhTY2FsZSA9IDA7CisgICAgZm9yICh3aW5kb3cgPSAwLCBncm91cCA9IDA7IGdyb3VwIDwgd2luZG93R3JvdXBzOyBncm91cCsrKSB7CisgICAgICBmb3IgKGdyb3Vwd2luID0gMDsgZ3JvdXB3aW4gPCBwV2luZG93R3JvdXBMZW5ndGhbZ3JvdXBdOworICAgICAgICAgICBncm91cHdpbisrLCB3aW5kb3crKykgeworICAgICAgICBTSE9SVCAqbGVmdFNjYWxlID0gJlNGQmxlZnRTY2FsZVt3aW5kb3cgKiAxNl07CisgICAgICAgIFNIT1JUICpyaWdodFNjYWxlID0gJlNGQnJpZ2h0U2NhbGVbd2luZG93ICogMTZdOworICAgICAgICBpbnQgd2luZG93TWF4U2NhbGUgPSAwOwogCi0gICAgICAgICAgRkRLX0FTU0VSVChsU2NhbGUgPj0gMCAmJiByU2NhbGUgPj0gMCk7CisgICAgICAgIC8qIGZpbmQgbWF4aW11bSBzY2FsaW5nIGZhY3RvciBvZiBhbGwgYmFuZHMgaW4gdGhpcyB3aW5kb3cgKi8KKyAgICAgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG1pbl9zZmJfc3RlOyBiYW5kKyspIHsKKyAgICAgICAgICBpbnQgbFNjYWxlID0gbGVmdFNjYWxlW2JhbmRdOworICAgICAgICAgIGludCByU2NhbGUgPSByaWdodFNjYWxlW2JhbmRdOworICAgICAgICAgIGludCBjb21tb25TY2FsZSA9ICgobFNjYWxlID4gclNjYWxlKSA/IGxTY2FsZSA6IHJTY2FsZSk7CisgICAgICAgICAgd2luZG93TWF4U2NhbGUgPQorICAgICAgICAgICAgICAod2luZG93TWF4U2NhbGUgPCBjb21tb25TY2FsZSkgPyBjb21tb25TY2FsZSA6IHdpbmRvd01heFNjYWxlOworICAgICAgICB9CisgICAgICAgIGlmIChzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRMID4KKyAgICAgICAgICAgIG1pbl9zZmJfc3RlKSB7IC8qIGkuZS4gc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkTCA9PSBtYXhfc2ZiX3N0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgZm9yICg7IGJhbmQgPCBtYXhfc2ZiX3N0ZTsgYmFuZCsrKSB7CisgICAgICAgICAgICBpbnQgbFNjYWxlID0gbGVmdFNjYWxlW2JhbmRdOworICAgICAgICAgICAgd2luZG93TWF4U2NhbGUgPQorICAgICAgICAgICAgICAgICh3aW5kb3dNYXhTY2FsZSA8IGxTY2FsZSkgPyBsU2NhbGUgOiB3aW5kb3dNYXhTY2FsZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZFIgPgorICAgICAgICAgICAgICBtaW5fc2ZiX3N0ZSkgeyAvKiBpLmUuIHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZFIgPT0gbWF4X3NmYl9zdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKDsgYmFuZCA8IG1heF9zZmJfc3RlOyBiYW5kKyspIHsKKyAgICAgICAgICAgICAgaW50IHJTY2FsZSA9IHJpZ2h0U2NhbGVbYmFuZF07CisgICAgICAgICAgICAgIHdpbmRvd01heFNjYWxlID0KKyAgICAgICAgICAgICAgICAgICh3aW5kb3dNYXhTY2FsZSA8IHJTY2FsZSkgPyByU2NhbGUgOiB3aW5kb3dNYXhTY2FsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KIAotICAgICAgICAgIGZvciAoaW50IGluZGV4PXBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmRdOyBpbmRleDxwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0c1tiYW5kKzFdOyBpbmRleCsrKQorICAgICAgICAvKiBmaW5kIG1heGltdW0gY29tbW9uIFNGIG9mIGFsbCB3aW5kb3dzICovCisgICAgICAgIGZyYW1lTWF4U2NhbGUgPQorICAgICAgICAgICAgKGZyYW1lTWF4U2NhbGUgPCB3aW5kb3dNYXhTY2FsZSkgPyB3aW5kb3dNYXhTY2FsZSA6IGZyYW1lTWF4U2NhbGU7CisgICAgICB9CisgICAgfQorCisgICAgLyogYWRkIHNvbWUgaGVhZHJvb20gZm9yIG92ZXJmbG93IHByb3RlY3Rpb24gZHVyaW5nIGZpbHRlciBhbmQgYWRkIG9wZXJhdGlvbgorICAgICAqLworICAgIGZyYW1lTWF4U2NhbGUgKz0gMjsKKworICAgIC8qIHByb2Nlc3Mgb24gd2luZG93LWJhc2lzIChpLmUuIGl0ZXJhdGUgb3ZlciBhbGwgZ3JvdXBzIGFuZCBjb3JyZXNwb25kaW5nCisgICAgICogd2luZG93cykgKi8KKyAgICBmb3IgKHdpbmRvdyA9IDAsIGdyb3VwID0gMDsgZ3JvdXAgPCB3aW5kb3dHcm91cHM7IGdyb3VwKyspIHsKKyAgICAgIGdyb3VwTWFzayA9IDEgPDwgZ3JvdXA7CisKKyAgICAgIGZvciAoZ3JvdXB3aW4gPSAwOyBncm91cHdpbiA8IHBXaW5kb3dHcm91cExlbmd0aFtncm91cF07CisgICAgICAgICAgIGdyb3Vwd2luKyssIHdpbmRvdysrKSB7CisgICAgICAgIC8qIGluaXRpYWxpemUgdGhlIE1EU1Qgd2l0aCB6ZXJvcyAqLworICAgICAgICBGREttZW1jbGVhcigmZG14X2ltW3dpbmRvd0xlbiAqIHdpbmRvd10sIHdpbmRvd0xlbiAqIHNpemVvZihGSVhQX0RCTCkpOworCisgICAgICAgIC8qIDEuIGNhbGN1bGF0ZSB0aGUgcHJldmlvdXMgZG93bm1peCBNRENULiBXZSBkbyB0aGlzIG9uY2UganVzdCBmb3IgdGhlCisgICAgICAgICAqIE1haW4gYmFuZC4gKi8KKyAgICAgICAgaWYgKGNwbHhQcmVkaWN0aW9uRGF0YS0+Y29tcGxleF9jb2VmID09IDEpIHsKKyAgICAgICAgICBpZiAoKGNwbHhQcmVkaWN0aW9uRGF0YS0+dXNlX3ByZXZfZnJhbWUgPT0gMSkgJiYgKG1haW5iYW5kX2ZsYWcpKSB7CisgICAgICAgICAgICAvKiBpZiB0aGlzIGlzIGEgbG9uZy1ibG9jayBvciB0aGUgZmlyc3Qgd2luZG93IG9mIGEgc2hvcnQtYmxvY2sKKyAgICAgICAgICAgICAgIGNhbGN1bGF0ZSB0aGUgZG93bm1peCBNRENUIG9mIHRoZSBwcmV2aW91cyBmcmFtZS4KKyAgICAgICAgICAgICAgIHVzZV9wcmV2X2ZyYW1lIGlzIGFzc3VtZWQgbm90IHRvIGNoYW5nZSBkdXJpbmcgYSBmcmFtZSEKKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIC8qIGZpcnN0IGRldGVybWluZSBzaGlmdGZhY3RvcnMgdG8gc2NhbGUgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCAqLworICAgICAgICAgICAgaWYgKChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvLldpbmRvd1NlcXVlbmNlICE9CisgICAgICAgICAgICAgICAgIEJMT0NLX1NIT1JUKSB8fAorICAgICAgICAgICAgICAgICh3aW5kb3cgPT0gMCkpIHsKKyAgICAgICAgICAgICAgaW50IGluZGV4X29mZnNldCA9IDA7CisgICAgICAgICAgICAgIGludCBzckxlZnRDaGFuID0gMDsKKyAgICAgICAgICAgICAgaW50IHNyUmlnaHRDaGFuID0gMDsKKyAgICAgICAgICAgICAgaWYgKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8uV2luZG93U2VxdWVuY2UgPT0KKyAgICAgICAgICAgICAgICAgIEJMT0NLX1NIT1JUKSB7CisgICAgICAgICAgICAgICAgLyogdXNlIHRoZSBsYXN0IHdpbmRvdyBvZiB0aGUgcHJldmlvdXMgZnJhbWUgZm9yIE1EQ1QKKyAgICAgICAgICAgICAgICAgKiBjYWxjdWxhdGlvbiBpZiB0aGlzIGlzIGEgc2hvcnQtYmxvY2suICovCisgICAgICAgICAgICAgICAgaW5kZXhfb2Zmc2V0ID0gd2luZG93TGVuICogNzsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGljU3BlY1NjYWxlTFs3XSA+IHN0YXRpY1NwZWNTY2FsZVJbN10pIHsKKyAgICAgICAgICAgICAgICAgIHNyUmlnaHRDaGFuID0gc3RhdGljU3BlY1NjYWxlTFs3XSAtIHN0YXRpY1NwZWNTY2FsZVJbN107CisgICAgICAgICAgICAgICAgICBkbXhfcmVfcHJldl9lID0gc3RhdGljU3BlY1NjYWxlTFs3XTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgc3JMZWZ0Q2hhbiA9IHN0YXRpY1NwZWNTY2FsZVJbN10gLSBzdGF0aWNTcGVjU2NhbGVMWzddOworICAgICAgICAgICAgICAgICAgZG14X3JlX3ByZXZfZSA9IHN0YXRpY1NwZWNTY2FsZVJbN107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzdGF0aWNTcGVjU2NhbGVMWzBdID4gc3RhdGljU3BlY1NjYWxlUlswXSkgeworICAgICAgICAgICAgICAgICAgc3JSaWdodENoYW4gPSBzdGF0aWNTcGVjU2NhbGVMWzBdIC0gc3RhdGljU3BlY1NjYWxlUlswXTsKKyAgICAgICAgICAgICAgICAgIGRteF9yZV9wcmV2X2UgPSBzdGF0aWNTcGVjU2NhbGVMWzBdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBzckxlZnRDaGFuID0gc3RhdGljU3BlY1NjYWxlUlswXSAtIHN0YXRpY1NwZWNTY2FsZUxbMF07CisgICAgICAgICAgICAgICAgICBkbXhfcmVfcHJldl9lID0gc3RhdGljU3BlY1NjYWxlUlswXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiBub3cgc2NhbGUgY2hhbm5lbHMgYW5kIGRldGVybWluZSBkb3dubWl4IE1EQ1Qgb2YgcHJldmlvdXMgZnJhbWUKKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIGlmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvW0xdCisgICAgICAgICAgICAgICAgICAgICAgLT5wQ3BlU3RhdGljRGF0YS0+am9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YQorICAgICAgICAgICAgICAgICAgICAgIC5jbGVhclNwZWN0cmFsQ29lZmZzID09IDEpIHsKKyAgICAgICAgICAgICAgICBGREttZW1jbGVhcihkbXhfcmVfcHJldiwgd2luZG93TGVuICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgICAgICAgZG14X3JlX3ByZXZfZSA9IDA7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGNwbHhQcmVkaWN0aW9uRGF0YS0+cHJlZF9kaXIgPT0gMCkgeworICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dMZW47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBkbXhfcmVfcHJldltpXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoKHN0YXRpY1NwZWN0cmFsQ29lZmZzTFtpbmRleF9vZmZzZXQgKyBpXSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICBzckxlZnRDaGFuKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY1NwZWN0cmFsQ29lZmZzUltpbmRleF9vZmZzZXQgKyBpXSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICBzclJpZ2h0Q2hhbikpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAxOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd0xlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRteF9yZV9wcmV2W2ldID0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoc3RhdGljU3BlY3RyYWxDb2VmZnNMW2luZGV4X29mZnNldCArIGldID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyTGVmdENoYW4pIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljU3BlY3RyYWxDb2VmZnNSW2luZGV4X29mZnNldCArIGldID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyUmlnaHRDaGFuKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDE7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogSW4gY2FzZSB0aGF0IHdlIHVzZSBJTkYgd2UgaGF2ZSB0byBwcmVzZXJ2ZSB0aGUgc3RhdGUgb2YgdGhlCisgICAgICAgICAgICAgICJkbXhfcmVfcHJldiIgKG9yaWdpbmFsIG9yIGNvbXB1dGVkKS4gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZQorICAgICAgICAgICAgICBoYXZlIHRvIGFwcGx5IE1TIG92ZXIgdGhlIHNlcGFyYXRlIElHRiB0aWxlcy4gKi8KKyAgICAgICAgICAgICAgRkRLbWVtY3B5KHN0b3JlX2RteF9yZV9wcmV2LCAmZG14X3JlX3ByZXZbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dMZW4gKiBzaXplb2YoRklYUF9EQkwpKTsKKworICAgICAgICAgICAgICAvKiBQYXJ0aWN1bGFyIGV4cG9uZW50IG9mIHRoZSBjb21wdXRlZC9vcmlnaW5hbCAiZG14X3JlX3ByZXYiIG11c3QKKyAgICAgICAgICAgICAgICogYmUga2VwdCBmb3IgdGhlIHRpbGUgTVMgY2FsY3VsYXRpb25zIGlmIG5lY2Vzc2FyeS4qLworICAgICAgICAgICAgICAqc3RvcmVfZG14X3JlX3ByZXZfZSA9IGRteF9yZV9wcmV2X2U7CisKKyAgICAgICAgICAgIH0gLyogaWYgKCAocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mby5XaW5kb3dTZXF1ZW5jZSAhPQorICAgICAgICAgICAgICAgICBCTE9DS19TSE9SVCkgfHwgKHdpbmRvdyA9PSAwKSApICovCisKKyAgICAgICAgICB9IC8qIGlmICggcEpvaW50U3RlcmVvRGF0YS0+dXNlX3ByZXZfZnJhbWUgPT0gMSApICovCisKKyAgICAgICAgfSAvKiBpZiAoIHBKb2ludFN0ZXJlb0RhdGEtPmNvbXBsZXhfY29lZiA9PSAxICkgKi8KKworICAgICAgICAvKiAyLiBjYWxjdWxhdGUgZG93bm1peCBNRENUIG9mIGN1cnJlbnQgZnJhbWUgKi8KKworICAgICAgICAvKiBzZXQgcG9pbnRlciB0byBzY2FsZS1mYWN0b3ItYmFuZHMgb2YgY3VycmVudCB3aW5kb3cgKi8KKyAgICAgICAgU0hPUlQgKmxlZnRTY2FsZSA9ICZTRkJsZWZ0U2NhbGVbd2luZG93ICogMTZdOworICAgICAgICBTSE9SVCAqcmlnaHRTY2FsZSA9ICZTRkJyaWdodFNjYWxlW3dpbmRvdyAqIDE2XTsKKworICAgICAgICBzcGVjU2NhbGVMW3dpbmRvd10gPSBzcGVjU2NhbGVSW3dpbmRvd10gPSBmcmFtZU1heFNjYWxlOworCisgICAgICAgIC8qIGFkYXB0IHNjYWxpbmctZmFjdG9ycyB0byBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICBpZiAoY3BseFByZWRpY3Rpb25EYXRhLT51c2VfcHJldl9mcmFtZSA9PSAxKSB7CisgICAgICAgICAgaWYgKHdpbmRvdyA9PSAwKSB7CisgICAgICAgICAgICBpZiAoZG14X3JlX3ByZXZfZSA8IGZyYW1lTWF4U2NhbGUpIHsKKyAgICAgICAgICAgICAgaWYgKG1haW5iYW5kX2ZsYWcgPT0gMCkgeworICAgICAgICAgICAgICAgIHNjYWxlVmFsdWVzKGRteF9yZV9wcmV2LCBzdG9yZV9kbXhfcmVfcHJldiwgd2luZG93TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oZnJhbWVNYXhTY2FsZSAtIGRteF9yZV9wcmV2X2UpKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd0xlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICBkbXhfcmVfcHJldltpXSA+Pj0gKGZyYW1lTWF4U2NhbGUgLSBkbXhfcmVfcHJldl9lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGlmIChtYWluYmFuZF9mbGFnID09IDApIHsKKyAgICAgICAgICAgICAgICBGREttZW1jcHkoZG14X3JlX3ByZXYsIHN0b3JlX2RteF9yZV9wcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dMZW4gKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzcGVjU2NhbGVMWzBdID0gZG14X3JlX3ByZXZfZTsKKyAgICAgICAgICAgICAgc3BlY1NjYWxlUlswXSA9IGRteF9yZV9wcmV2X2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsgLyogd2luZG93ICE9IDAgKi8KKyAgICAgICAgICAgIEZES19BU1NFUlQocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mby5XaW5kb3dTZXF1ZW5jZSA9PQorICAgICAgICAgICAgICAgICAgICAgICBCTE9DS19TSE9SVCk7CisgICAgICAgICAgICBpZiAoc3BlY1NjYWxlTFt3aW5kb3cgLSAxXSA8IGZyYW1lTWF4U2NhbGUpIHsKKyAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dMZW47IGkrKykgeworICAgICAgICAgICAgICAgIGRteF9yZVt3aW5kb3dMZW4gKiAod2luZG93IC0gMSkgKyBpXSA+Pj0KKyAgICAgICAgICAgICAgICAgICAgKGZyYW1lTWF4U2NhbGUgLSBzcGVjU2NhbGVMW3dpbmRvdyAtIDFdKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3BlY1NjYWxlTFt3aW5kb3ddID0gc3BlY1NjYWxlTFt3aW5kb3cgLSAxXTsKKyAgICAgICAgICAgICAgc3BlY1NjYWxlUlt3aW5kb3ddID0gc3BlY1NjYWxlUlt3aW5kb3cgLSAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gLyogaWYgKCBwSm9pbnRTdGVyZW9EYXRhLT51c2VfcHJldl9mcmFtZSA9PSAxICkgKi8KKworICAgICAgICAvKiBzY2FsaW5nIGZhY3RvcnMgb2YgYm90aCBjaGFubmVscyBvdWdodCB0byBiZSBlcXVhbCBub3cgKi8KKyAgICAgICAgRkRLX0FTU0VSVChzcGVjU2NhbGVMW3dpbmRvd10gPT0gc3BlY1NjYWxlUlt3aW5kb3ddKTsKKworICAgICAgICAvKiByZXNjYWxlIHNpZ25hbCBhbmQgY2FsY3VsYXRlIGRvd25taXggTURDVCAqLworICAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbWF4X3NmYl9zdGU7IGJhbmQrKykgeworICAgICAgICAgIC8qIGZpcnN0IGFkYXB0IHNjYWxpbmcgb2YgY3VycmVudCBiYW5kIHRvIHNjYWxpbmcgb2YgY3VycmVudCB3aW5kb3cgPT4KKyAgICAgICAgICAgKiBzaGlmdCBzaWduYWwgcmlnaHQgKi8KKyAgICAgICAgICBpbnQgbFNjYWxlID0gbGVmdFNjYWxlW2JhbmRdOworICAgICAgICAgIGludCByU2NhbGUgPSByaWdodFNjYWxlW2JhbmRdOworCisgICAgICAgICAgbFNjYWxlID0gZk1pbihERlJBQ1RfQklUUyAtIDEsIHNwZWNTY2FsZUxbd2luZG93XSAtIGxTY2FsZSk7CisgICAgICAgICAgclNjYWxlID0gZk1pbihERlJBQ1RfQklUUyAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBzcGVjU2NhbGVMW3dpbmRvd10gLSByU2NhbGUpOyAvKiBMIG9yIFIgZG9lc24ndAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1NjYWxlcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFsIGF0IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ICovCisKKyAgICAgICAgICAvKiBXcml0ZSBiYWNrIHRvIHNmYiBzY2FsZSB0byBjb3ZlciB0aGUgY2FzZSB3aGVuIG1heF9zZmJfc3RlIDwKKyAgICAgICAgICAgKiBtYXhfc2ZiICovCisgICAgICAgICAgbGVmdFNjYWxlW2JhbmRdID0gcmlnaHRTY2FsZVtiYW5kXSA9IHNwZWNTY2FsZUxbd2luZG93XTsKKworICAgICAgICAgIGZvciAoaW50IGkgPSBwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0c1tiYW5kXTsKKyAgICAgICAgICAgICAgIGkgPCBwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0c1tiYW5kICsgMV07IGkrKykgeworICAgICAgICAgICAgc3BlY3RydW1MW3dpbmRvd0xlbiAqIHdpbmRvdyArIGldID4+PSBsU2NhbGU7CisgICAgICAgICAgICBzcGVjdHJ1bVJbd2luZG93TGVuICogd2luZG93ICsgaV0gPj49IHJTY2FsZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBub3cgY2FsY3VsYXRlIGRvd25taXggTURDVCAqLworICAgICAgICAgIGlmIChwSm9pbnRTdGVyZW9EYXRhLT5Nc1VzZWRbYmFuZF0gJiBncm91cE1hc2spIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0c1tiYW5kXTsKKyAgICAgICAgICAgICAgICAgaSA8IHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmQgKyAxXTsgaSsrKSB7CisgICAgICAgICAgICAgIGRteF9yZVt3aW5kb3dMZW4gKiB3aW5kb3cgKyBpXSA9CisgICAgICAgICAgICAgICAgICBzcGVjdHJ1bUxbd2luZG93TGVuICogd2luZG93ICsgaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjcGx4UHJlZGljdGlvbkRhdGEtPnByZWRfZGlyID09IDApIHsKKyAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmRdOworICAgICAgICAgICAgICAgICAgIGkgPCBwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0c1tiYW5kICsgMV07IGkrKykgeworICAgICAgICAgICAgICAgIGRteF9yZVt3aW5kb3dMZW4gKiB3aW5kb3cgKyBpXSA9CisgICAgICAgICAgICAgICAgICAgIChzcGVjdHJ1bUxbd2luZG93TGVuICogd2luZG93ICsgaV0gKworICAgICAgICAgICAgICAgICAgICAgc3BlY3RydW1SW3dpbmRvd0xlbiAqIHdpbmRvdyArIGldKSA+PgorICAgICAgICAgICAgICAgICAgICAxOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBmb3IgKGludCBpID0gcFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbYmFuZF07CisgICAgICAgICAgICAgICAgICAgaSA8IHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmQgKyAxXTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZG14X3JlW3dpbmRvd0xlbiAqIHdpbmRvdyArIGldID0KKyAgICAgICAgICAgICAgICAgICAgKHNwZWN0cnVtTFt3aW5kb3dMZW4gKiB3aW5kb3cgKyBpXSAtCisgICAgICAgICAgICAgICAgICAgICBzcGVjdHJ1bVJbd2luZG93TGVuICogd2luZG93ICsgaV0pID4+CisgICAgICAgICAgICAgICAgICAgIDE7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgfSAvKiBmb3IgKCBiYW5kPTA7IGJhbmQ8bWF4X3NmYl9zdGU7IGJhbmQrKyApICovCisgICAgICAgIC8qIENsZWFuIHVudGlsIHRoZSBlbmQgKi8KKyAgICAgICAgZm9yIChpbnQgaSA9IHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW21heF9zZmJfc3RlX291dHNpZGVdOworICAgICAgICAgICAgIGkgPCB3aW5kb3dMZW47IGkrKykgeworICAgICAgICAgIGRteF9yZVt3aW5kb3dMZW4gKiB3aW5kb3cgKyBpXSA9IChGSVhQX0RCTCkwOworICAgICAgICB9CisKKyAgICAgICAgLyogMy4gY2FsY3VsYXRlIE1EU1QtcG9ydGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IGZyYW1lLiAqLworICAgICAgICBpZiAoY3BseFByZWRpY3Rpb25EYXRhLT5jb21wbGV4X2NvZWYgPT0gMSkgewogICAgICAgICAgIHsKLSAgICAgICAgICAgIEZJWFBfREJMIGxlZnRDb2VmZmljaWVudCAgPSBsZWZ0U3BlY3RydW0gW2luZGV4XSA7Ci0gICAgICAgICAgICBGSVhQX0RCTCByaWdodENvZWZmaWNpZW50ID0gcmlnaHRTcGVjdHJ1bSBbaW5kZXhdIDsKKyAgICAgICAgICAgIC8qIDMuMSBtb3ZlIHBvaW50ZXIgaW4gZmlsdGVyLWNvZWZmaWNpZW50IHRhYmxlIGluIGNhc2Ugb2Ygc2hvcnQKKyAgICAgICAgICAgICAqIHdpbmRvdyBzZXF1ZW5jZSAqLworICAgICAgICAgICAgLyogICAgIChvdGhlciBjb2VmZmljaWVudHMgYXJlIHV0aWxpemVkIGZvciB0aGUgbGFzdCA3IHNob3J0CisgICAgICAgICAgICAgKiB3aW5kb3dzKSAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmljc0luZm8uV2luZG93U2VxdWVuY2UgPT0KKyAgICAgICAgICAgICAgICAgQkxPQ0tfU0hPUlQpICYmCisgICAgICAgICAgICAgICAgKHdpbmRvdyAhPSAwKSkgeworICAgICAgICAgICAgICBwQ29lZmYgPSBtZHN0X2ZpbHRfY29lZl9jdXJyW2N1cnJlbnRTaGFwZV07CisgICAgICAgICAgICAgIHBDb2VmZlByZXYgPSBtZHN0X2ZpbHRfY29lZl9wcmV2W2N1cnJlbnRTaGFwZV07CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGxlZnRDb2VmZmljaWVudCA+Pj0gbFNjYWxlIDsKLSAgICAgICAgICAgIHJpZ2h0Q29lZmZpY2llbnQgPj49IHJTY2FsZSA7CisgICAgICAgICAgICAvKiBUaGUgbGVuZ3RoIG9mIHRoZSBmaWx0ZXIgcHJvY2Vzc2luZyBtdXN0IGJlIGV4dGVuZGVkIGJlY2F1c2Ugb2YKKyAgICAgICAgICAgICAqIGZpbHRlciBib3VuZGFyeSBwcm9ibGVtcyAqLworICAgICAgICAgICAgaW50IGV4dGVuZGVkX2JhbmQgPSBmTWluKAorICAgICAgICAgICAgICAgIHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW21heF9zZmJfc3RlX291dHNpZGVdICsgNywgd2luZG93TGVuKTsKIAotICAgICAgICAgICAgbGVmdFNwZWN0cnVtIFtpbmRleF0gPSBsZWZ0Q29lZmZpY2llbnQgKyByaWdodENvZWZmaWNpZW50IDsKLSAgICAgICAgICAgIHJpZ2h0U3BlY3RydW0gW2luZGV4XSA9IGxlZnRDb2VmZmljaWVudCAtIHJpZ2h0Q29lZmZpY2llbnQgOworICAgICAgICAgICAgLyogMy4yLiBlc3RpbWF0ZSBkb3dubWl4IE1EU1QgZnJvbSBjdXJyZW50IGZyYW1lIGRvd25taXggTURDVCAqLworICAgICAgICAgICAgaWYgKChwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvLldpbmRvd1NlcXVlbmNlID09CisgICAgICAgICAgICAgICAgIEJMT0NLX1NIT1JUKSAmJgorICAgICAgICAgICAgICAgICh3aW5kb3cgIT0gMCkpIHsKKyAgICAgICAgICAgICAgQ0pvaW50U3RlcmVvX2ZpbHRlckFuZEFkZCgmZG14X3JlW3dpbmRvd0xlbiAqIHdpbmRvd10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRfYmFuZCwgd2luZG93TGVuLCBwQ29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRteF9pbVt3aW5kb3dMZW4gKiB3aW5kb3ddLCAxKTsKKworICAgICAgICAgICAgICBDSm9pbnRTdGVyZW9fZmlsdGVyQW5kQWRkKCZkbXhfcmVbd2luZG93TGVuICogKHdpbmRvdyAtIDEpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZF9iYW5kLCB3aW5kb3dMZW4sIHBDb2VmZlByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRteF9pbVt3aW5kb3dMZW4gKiB3aW5kb3ddLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIENKb2ludFN0ZXJlb19maWx0ZXJBbmRBZGQoZG14X3JlLCBleHRlbmRlZF9iYW5kLCB3aW5kb3dMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZWZmLCBkbXhfaW0sIDEpOworCisgICAgICAgICAgICAgIGlmIChjcGx4UHJlZGljdGlvbkRhdGEtPnVzZV9wcmV2X2ZyYW1lID09IDEpIHsKKyAgICAgICAgICAgICAgICBDSm9pbnRTdGVyZW9fZmlsdGVyQW5kQWRkKGRteF9yZV9wcmV2LCBleHRlbmRlZF9iYW5kLCB3aW5kb3dMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29lZmZQcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRteF9pbVt3aW5kb3dMZW4gKiB3aW5kb3ddLCAwKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgfSAvKiBpZihwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT50cmFuc2Zvcm1fc3BsaXR0aW5nX2FjdGl2ZSkgKi8KKyAgICAgICAgfSAgIC8qIGlmICggcEpvaW50U3RlcmVvRGF0YS0+Y29tcGxleF9jb2VmID09IDEgKSAqLworCisgICAgICAgIC8qIDQuIHVwbWl4IHByb2Nlc3MgKi8KKyAgICAgICAgSU5UIHByZWRfZGlyID0gY3BseFByZWRpY3Rpb25EYXRhLT5wcmVkX2RpciA/IC0xIDogMTsKKyAgICAgICAgLyogMC4xIGluIFEtMy4zNCAqLworICAgICAgICBjb25zdCBGSVhQX0RCTCBwb2ludE9uZSA9IDB4NjY2NjY2NjY7IC8qIDAuOCAqLworICAgICAgICAvKiBTaGlmdCB2YWx1ZSBmb3IgdGhlIGRvd25taXggKi8KKyAgICAgICAgY29uc3QgSU5UIHNoaWZ0X2RteCA9IFNGX0ZOQV9DT0VGRlMgKyAxOworCisgICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBtYXhfc2ZiX3N0ZV9vdXRzaWRlOyBiYW5kKyspIHsKKyAgICAgICAgICBpZiAocEpvaW50U3RlcmVvRGF0YS0+TXNVc2VkW2JhbmRdICYgZ3JvdXBNYXNrKSB7CisgICAgICAgICAgICBGSVhQX1NHTCB0ZW1wUmUgPQorICAgICAgICAgICAgICAgIChGSVhQX1NHTCljcGx4UHJlZGljdGlvbkRhdGEtPmFscGhhX3FfcmVbZ3JvdXBdW2JhbmRdOworICAgICAgICAgICAgRklYUF9TR0wgdGVtcEltID0KKyAgICAgICAgICAgICAgICAoRklYUF9TR0wpY3BseFByZWRpY3Rpb25EYXRhLT5hbHBoYV9xX2ltW2dyb3VwXVtiYW5kXTsKKworICAgICAgICAgICAgLyogRmluZCB0aGUgbWluaW11bSBjb21tb24gaGVhZHJvb20gZm9yIGFscGhhX3JlIGFuZCBhbHBoYV9pbSAqLworICAgICAgICAgICAgaW50IGFscGhhX3JlX2hlYWRyb29tID0gQ291bnRMZWFkaW5nQml0cygoSU5UKXRlbXBSZSkgLSAxNjsKKyAgICAgICAgICAgIGlmICh0ZW1wUmUgPT0gKEZJWFBfU0dMKTApIGFscGhhX3JlX2hlYWRyb29tID0gMTU7CisgICAgICAgICAgICBpbnQgYWxwaGFfaW1faGVhZHJvb20gPSBDb3VudExlYWRpbmdCaXRzKChJTlQpdGVtcEltKSAtIDE2OworICAgICAgICAgICAgaWYgKHRlbXBJbSA9PSAoRklYUF9TR0wpMCkgYWxwaGFfaW1faGVhZHJvb20gPSAxNTsKKyAgICAgICAgICAgIGludCB2YWwgPSBmTWluKGFscGhhX3JlX2hlYWRyb29tLCBhbHBoYV9pbV9oZWFkcm9vbSk7CisKKyAgICAgICAgICAgIC8qIE11bHRpcGx5IGFscGhhIGJ5IDAuMSB3aXRoIG1heGltdW0gcHJlY2lzaW9uICovCisgICAgICAgICAgICBGREtfQVNTRVJUKHZhbCA+PSAwKTsKKyAgICAgICAgICAgIEZJWFBfREJMIGFscGhhX3JlX3RtcCA9IGZNdWx0KChGSVhQX1NHTCkodGVtcFJlIDw8IHZhbCksIHBvaW50T25lKTsKKyAgICAgICAgICAgIEZJWFBfREJMIGFscGhhX2ltX3RtcCA9IGZNdWx0KChGSVhQX1NHTCkodGVtcEltIDw8IHZhbCksIHBvaW50T25lKTsKKworICAgICAgICAgICAgLyogQ2FsY3VsYXRlIGFscGhhIGV4cG9uZW50ICovCisgICAgICAgICAgICAvKiAoUS0zLjM0ICogUTE1LjApIHNoaWZ0ZWQgbGVmdCBieSAidmFsIiAqLworICAgICAgICAgICAgaW50IGFscGhhX3JlX2V4cCA9IC0zICsgMTUgLSB2YWw7CisKKyAgICAgICAgICAgIGludCBoZWxwM19zaGlmdCA9IGFscGhhX3JlX2V4cCArIDE7CisKKyAgICAgICAgICAgIEZJWFBfREJMICpwMkNvZWZmTCA9ICYoCisgICAgICAgICAgICAgICAgc3BlY3RydW1MW3dpbmRvd0xlbiAqIHdpbmRvdyArIHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmRdXSk7CisgICAgICAgICAgICBGSVhQX0RCTCAqcDJDb2VmZlIgPSAmKAorICAgICAgICAgICAgICAgIHNwZWN0cnVtUlt3aW5kb3dMZW4gKiB3aW5kb3cgKyBwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0c1tiYW5kXV0pOworICAgICAgICAgICAgRklYUF9EQkwgKnAyZG14SW0gPQorICAgICAgICAgICAgICAgICYoZG14X2ltW3dpbmRvd0xlbiAqIHdpbmRvdyArIHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmRdXSk7CisgICAgICAgICAgICBGSVhQX0RCTCAqcDJkbXhSZSA9CisgICAgICAgICAgICAgICAgJihkbXhfcmVbd2luZG93TGVuICogd2luZG93ICsgcFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbYmFuZF1dKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmRdOworICAgICAgICAgICAgICAgICBpIDwgcFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbYmFuZCArIDFdOyBpKyspIHsKKyAgICAgICAgICAgICAgLyogQ2FsY3VsYXRpbmcgaGVscGVyIHRlcm06CisgICAgICAgICAgICAgICAgICAgIHNpZGUgPSBzcGVjUltpXSAtIGFscGhhX3JlW2ldICogZG14X3JlW2ldIC0gYWxwaGFfaW1baV0gKgorICAgICAgICAgICAgICAgIGRteF9pbVtpXTsKKworICAgICAgICAgICAgICAgIEhlcmUgImRteF9yZSIgbWF5IGJlIHRoZSBzYW1lIGFzICJzcGVjTCIgb3IgYWx0ZXJuYXRpdmVseSBrZWVwCisgICAgICAgICAgICAgICAgdGhlIGRvd25taXguICJkbXhfcmUiIGFuZCAic3BlY0wiIGFyZSB0d28gZGlmZmVyZW50IHBvaW50ZXJzCisgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gc2VwYXJhdGUgYXJyYXlzLCB3aGljaCBtYXkgb3IgbWF5IG5vdCBjb250YWluIHRoZQorICAgICAgICAgICAgICAgIHNhbWUgZGF0YSAod2l0aCBkaWZmZXJlbnQgc2NhbGluZykuCisgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgLyogaGVscDE6IGFscGhhX3JlW2ldICogZG14X3JlW2ldICovCisgICAgICAgICAgICAgIEZJWFBfREJMIGhlbHAxID0gZk11bHREaXYyKGFscGhhX3JlX3RtcCwgKnAyZG14UmUrKyk7CisKKyAgICAgICAgICAgICAgLyogdG1wOiBkbXhfaW1baV0gKi8KKyAgICAgICAgICAgICAgRklYUF9EQkwgdG1wID0gKCpwMmRteEltKyspIDw8IHNoaWZ0X2RteDsKKworICAgICAgICAgICAgICAvKiBoZWxwMjogYWxwaGFfaW1baV0gKiBkbXhfaW1baV0gKi8KKyAgICAgICAgICAgICAgRklYUF9EQkwgaGVscDIgPSBmTXVsdERpdjIoYWxwaGFfaW1fdG1wLCB0bXApOworCisgICAgICAgICAgICAgIC8qIGhlbHAzOiBhbHBoYV9yZVtpXSAqIGRteF9yZVtpXSArIGFscGhhX2ltW2ldICogZG14X2ltW2ldICovCisgICAgICAgICAgICAgIEZJWFBfREJMIGhlbHAzID0gaGVscDEgKyBoZWxwMjsKKworICAgICAgICAgICAgICAvKiBzaWRlICg9IGhlbHA0KSA9IHNwZWNSW2ldIC0gKGRteF9yZVtpXSAqIHNwZWNMW2ldICsgYWxwaGFfaW1baV0KKyAgICAgICAgICAgICAgICogKiBkbXhfaW1baV0pICovCisgICAgICAgICAgICAgIEZJWFBfREJMIGhlbHA0ID0gKnAyQ29lZmZSIC0gc2NhbGVWYWx1ZShoZWxwMywgaGVscDNfc2hpZnQpOworCisgICAgICAgICAgICAgIC8qIFdlIGNhbGN1bGF0ZSB0aGUgbGVmdCBhbmQgcmlnaHQgb3V0cHV0IGJ5IHVzaW5nIHRoZSBoZWxwZXIKKyAgICAgICAgICAgICAgICogZnVuY3Rpb24gKi8KKyAgICAgICAgICAgICAgLyogc3BlY1JbaV0gPSAtLysgKHNwZWNMW2ldIC0gc2lkZSk7ICovCisgICAgICAgICAgICAgICpwMkNvZWZmUiA9CisgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKChMT05HKSgqcDJDb2VmZkwgLSBoZWxwNCkgKiAoTE9ORylwcmVkX2Rpcik7CisgICAgICAgICAgICAgIHAyQ29lZmZSKys7CisKKyAgICAgICAgICAgICAgLyogc3BlY0xbaV0gPSBzcGVjTFtpXSArIHNpZGU7ICovCisgICAgICAgICAgICAgICpwMkNvZWZmTCA9ICpwMkNvZWZmTCArIGhlbHA0OworICAgICAgICAgICAgICBwMkNvZWZmTCsrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICB9IC8qIGZvciAoIGJhbmQ9MDsgYmFuZCA8IG1heF9zZmJfc3RlOyBiYW5kKysgKSAqLworICAgICAgfSAgIC8qIGZvciAoIGdyb3Vwd2luPTA7IGdyb3Vwd2luPHBXaW5kb3dHcm91cExlbmd0aFtncm91cF07IGdyb3Vwd2luKyssCisgICAgICAgICAgICAgd2luZG93KysgKSAqLworCisgICAgfSAvKiBmb3IgKCB3aW5kb3cgPSAwLCBncm91cCA9IDA7IGdyb3VwIDwgd2luZG93R3JvdXBzOyBncm91cCsrICkgKi8KKworICAgIC8qIGZyZWUgc2NyYXRjaCBidWZmZXIgKi8KKyAgICBDX0FBTExPQ19TQ1JBVENIX0VORChkbXhfaW0sIEZJWFBfREJMLCAxMDI0KTsKKworICB9IGVsc2UgeworICAgIC8qIE1TIHN0ZXJlbyAqLworCisgICAgZm9yICh3aW5kb3cgPSAwLCBncm91cCA9IDA7IGdyb3VwIDwgd2luZG93R3JvdXBzOyBncm91cCsrKSB7CisgICAgICBncm91cE1hc2sgPSAxIDw8IGdyb3VwOworCisgICAgICBmb3IgKGludCBncm91cHdpbiA9IDA7IGdyb3Vwd2luIDwgcFdpbmRvd0dyb3VwTGVuZ3RoW2dyb3VwXTsKKyAgICAgICAgICAgZ3JvdXB3aW4rKywgd2luZG93KyspIHsKKyAgICAgICAgRklYUF9EQkwgKmxlZnRTcGVjdHJ1bSwgKnJpZ2h0U3BlY3RydW07CisgICAgICAgIFNIT1JUICpsZWZ0U2NhbGUgPSAmU0ZCbGVmdFNjYWxlW3dpbmRvdyAqIDE2XTsKKyAgICAgICAgU0hPUlQgKnJpZ2h0U2NhbGUgPSAmU0ZCcmlnaHRTY2FsZVt3aW5kb3cgKiAxNl07CisKKyAgICAgICAgbGVmdFNwZWN0cnVtID0KKyAgICAgICAgICAgIFNQRUMoc3BlY3RydW1MLCB3aW5kb3csIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPmdyYW51bGVMZW5ndGgpOworICAgICAgICByaWdodFNwZWN0cnVtID0KKyAgICAgICAgICAgIFNQRUMoc3BlY3RydW1SLCB3aW5kb3csIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPmdyYW51bGVMZW5ndGgpOworCisgICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBtYXhfc2ZiX3N0ZV9vdXRzaWRlOyBiYW5kKyspIHsKKyAgICAgICAgICBpZiAocEpvaW50U3RlcmVvRGF0YS0+TXNVc2VkW2JhbmRdICYgZ3JvdXBNYXNrKSB7CisgICAgICAgICAgICBpbnQgbFNjYWxlID0gbGVmdFNjYWxlW2JhbmRdOworICAgICAgICAgICAgaW50IHJTY2FsZSA9IHJpZ2h0U2NhbGVbYmFuZF07CisgICAgICAgICAgICBpbnQgY29tbW9uU2NhbGUgPSBsU2NhbGUgPiByU2NhbGUgPyBsU2NhbGUgOiByU2NhbGU7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0Q3VyckJhbmQsIG9mZnNldE5leHRCYW5kOworCisgICAgICAgICAgICAvKiBJU08vSUVDIDE0NDk2LTMgQ2hhcHRlciA0LjYuOC4xLjEgOgorICAgICAgICAgICAgICAgTS9TIGpvaW50IGNoYW5uZWwgY29kaW5nIGNhbiBvbmx5IGJlIHVzZWQgaWYgY29tbW9uX3dpbmRvdyBpcyAxLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBGREtfQVNTRVJUKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKSA9PQorICAgICAgICAgICAgICAgICAgICAgICBHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+aWNzSW5mbykpOworICAgICAgICAgICAgRkRLX0FTU0VSVChHZXRXaW5kb3dTaGFwZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mbykgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgR2V0V2luZG93U2hhcGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPmljc0luZm8pKTsKKworICAgICAgICAgICAgY29tbW9uU2NhbGUrKzsKKyAgICAgICAgICAgIGxlZnRTY2FsZVtiYW5kXSA9IGNvbW1vblNjYWxlOworICAgICAgICAgICAgcmlnaHRTY2FsZVtiYW5kXSA9IGNvbW1vblNjYWxlOworCisgICAgICAgICAgICBsU2NhbGUgPSBmTWluKERGUkFDVF9CSVRTIC0gMSwgY29tbW9uU2NhbGUgLSBsU2NhbGUpOworICAgICAgICAgICAgclNjYWxlID0gZk1pbihERlJBQ1RfQklUUyAtIDEsIGNvbW1vblNjYWxlIC0gclNjYWxlKTsKKworICAgICAgICAgICAgRkRLX0FTU0VSVChsU2NhbGUgPj0gMCAmJiByU2NhbGUgPj0gMCk7CisKKyAgICAgICAgICAgIG9mZnNldEN1cnJCYW5kID0gcFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbYmFuZF07CisgICAgICAgICAgICBvZmZzZXROZXh0QmFuZCA9IHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmQgKyAxXTsKKworICAgICAgICAgICAgQ0pvaW50U3RlcmVvX0dlbmVyYXRlTVNPdXRwdXQoJihsZWZ0U3BlY3RydW1bb2Zmc2V0Q3VyckJhbmRdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocmlnaHRTcGVjdHJ1bVtvZmZzZXRDdXJyQmFuZF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbFNjYWxlLCByU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXROZXh0QmFuZCAtIG9mZnNldEN1cnJCYW5kKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZEwgPiBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQpIHsKKyAgICAgICAgICBmb3IgKDsgYmFuZCA8IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZEw7IGJhbmQrKykgeworICAgICAgICAgICAgaWYgKHBKb2ludFN0ZXJlb0RhdGEtPk1zVXNlZFtiYW5kXSAmIGdyb3VwTWFzaykgeworICAgICAgICAgICAgICByaWdodFNjYWxlW2JhbmRdID0gbGVmdFNjYWxlW2JhbmRdOworCisgICAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gcFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbYmFuZF07CisgICAgICAgICAgICAgICAgICAgaW5kZXggPCBwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0c1tiYW5kICsgMV07IGluZGV4KyspIHsKKyAgICAgICAgICAgICAgICBGSVhQX0RCTCBsZWZ0Q29lZmZpY2llbnQgPSBsZWZ0U3BlY3RydW1baW5kZXhdOworICAgICAgICAgICAgICAgIC8qIEZJWFBfREJMIHJpZ2h0Q29lZmZpY2llbnQgPSAoRklYUF9EQkwpMDsgKi8KKyAgICAgICAgICAgICAgICByaWdodFNwZWN0cnVtW2luZGV4XSA9IGxlZnRDb2VmZmljaWVudDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRSID4gc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkKSB7CisgICAgICAgICAgZm9yICg7IGJhbmQgPCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWRSOyBiYW5kKyspIHsKKyAgICAgICAgICAgIGlmIChwSm9pbnRTdGVyZW9EYXRhLT5Nc1VzZWRbYmFuZF0gJiBncm91cE1hc2spIHsKKyAgICAgICAgICAgICAgbGVmdFNjYWxlW2JhbmRdID0gcmlnaHRTY2FsZVtiYW5kXTsKKworICAgICAgICAgICAgICBmb3IgKGludCBpbmRleCA9IHBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmRdOworICAgICAgICAgICAgICAgICAgIGluZGV4IDwgcFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbYmFuZCArIDFdOyBpbmRleCsrKSB7CisgICAgICAgICAgICAgICAgLyogRklYUF9EQkwgbGVmdENvZWZmaWNpZW50ICA9IChGSVhQX0RCTCkwOyAqLworICAgICAgICAgICAgICAgIEZJWFBfREJMIHJpZ2h0Q29lZmZpY2llbnQgPSByaWdodFNwZWN0cnVtW2luZGV4XTsKKworICAgICAgICAgICAgICAgIGxlZnRTcGVjdHJ1bVtpbmRleF0gPSByaWdodENvZWZmaWNpZW50OworICAgICAgICAgICAgICAgIHJpZ2h0U3BlY3RydW1baW5kZXhdID0gLXJpZ2h0Q29lZmZpY2llbnQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0gIH0KIAotICAvKiBSZXNldCBNc1VzZWQgZmxhZ3MgaWYgbm8gZXhwbGljaXQgc2lnbmFsbGluZyB3YXMgdHJhbnNtaXR0ZWQuIE5lY2Vzc2FyeSBmb3IgaW50ZW5zaXR5IGNvZGluZy4KLSAgICAgUE5TIGNvcnJlbGF0aW9uIHNpZ25hbGxpbmcgd2FzIG1hcHBlZCBiZWZvcmUgY2FsbGluZyBDSm9pbnRTdGVyZW9fQXBwbHlNUygpLiAqLwotICBpZiAocEpvaW50U3RlcmVvRGF0YS0+TXNNYXNrUHJlc2VudCA9PSAyKSB7Ci0gICAgRkRLbWVtY2xlYXIocEpvaW50U3RlcmVvRGF0YS0+TXNVc2VkLCBKb2ludFN0ZXJlb01heGltdW1CYW5kcyAqIHNpemVvZihVQ0hBUikpOworICAgIC8qIFJlc2V0IE1zVXNlZCBmbGFncyBpZiBubyBleHBsaWNpdCBzaWduYWxsaW5nIHdhcyB0cmFuc21pdHRlZC4gTmVjZXNzYXJ5CisgICAgICAgZm9yIGludGVuc2l0eSBjb2RpbmcuIFBOUyBjb3JyZWxhdGlvbiBzaWduYWxsaW5nIHdhcyBtYXBwZWQgYmVmb3JlCisgICAgICAgY2FsbGluZyBDSm9pbnRTdGVyZW9fQXBwbHlNUygpLiAqLworICAgIGlmIChwSm9pbnRTdGVyZW9EYXRhLT5Nc01hc2tQcmVzZW50ID09IDIpIHsKKyAgICAgIEZES21lbWNsZWFyKHBKb2ludFN0ZXJlb0RhdGEtPk1zVXNlZCwKKyAgICAgICAgICAgICAgICAgIEpvaW50U3RlcmVvTWF4aW11bUJhbmRzICogc2l6ZW9mKFVDSEFSKSk7CisgICAgfQogICB9CiB9CiAKLXZvaWQgQ0pvaW50U3RlcmVvX0FwcGx5SVMoCi0gICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMl0sCi0gICAgICAgIGNvbnN0IFNIT1JUICpwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0cywKLSAgICAgICAgY29uc3QgVUNIQVIgKnBXaW5kb3dHcm91cExlbmd0aCwKLSAgICAgICAgY29uc3QgaW50IHdpbmRvd0dyb3VwcywKLSAgICAgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCwKLSAgICAgICAgY29uc3QgVUlOVCBDb21tb25XaW5kb3cKLSAgICAgICAgKQotewotICBDSm9pbnRTdGVyZW9EYXRhICpwSm9pbnRTdGVyZW9EYXRhID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bTF0tPnBDb21EYXRhLT5qb2ludFN0ZXJlb0RhdGE7Cit2b2lkIENKb2ludFN0ZXJlb19BcHBseUlTKENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUICpwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKnBXaW5kb3dHcm91cExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHdpbmRvd0dyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCkgeworICBDSm9pbnRTdGVyZW9EYXRhICpwSm9pbnRTdGVyZW9EYXRhID0KKyAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wQ29tRGF0YS0+am9pbnRTdGVyZW9EYXRhOwogCi0gIGZvciAoaW50IHdpbmRvdz0wLGdyb3VwPTA7IGdyb3VwPHdpbmRvd0dyb3VwczsgZ3JvdXArKykKLSAgeworICBmb3IgKGludCB3aW5kb3cgPSAwLCBncm91cCA9IDA7IGdyb3VwIDwgd2luZG93R3JvdXBzOyBncm91cCsrKSB7CiAgICAgVUNIQVIgKkNvZGVCb29rOwogICAgIFNIT1JUICpTY2FsZUZhY3RvcjsKICAgICBVQ0hBUiBncm91cE1hc2sgPSAxIDw8IGdyb3VwOwogCi0gICAgQ29kZUJvb2sgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+cER5bkRhdGEtPmFDb2RlQm9va1tncm91cCoxNl07Ci0gICAgU2NhbGVGYWN0b3IgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+cER5bkRhdGEtPmFTY2FsZUZhY3Rvcltncm91cCoxNl07CisgICAgQ29kZUJvb2sgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+cER5bkRhdGEtPmFDb2RlQm9va1tncm91cCAqIDE2XTsKKyAgICBTY2FsZUZhY3RvciA9CisgICAgICAgICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2dyb3VwICogMTZdOwogCi0gICAgZm9yIChpbnQgZ3JvdXB3aW49MDsgZ3JvdXB3aW48cFdpbmRvd0dyb3VwTGVuZ3RoW2dyb3VwXTsgZ3JvdXB3aW4rKywgd2luZG93KyspCi0gICAgeworICAgIGZvciAoaW50IGdyb3Vwd2luID0gMDsgZ3JvdXB3aW4gPCBwV2luZG93R3JvdXBMZW5ndGhbZ3JvdXBdOworICAgICAgICAgZ3JvdXB3aW4rKywgd2luZG93KyspIHsKICAgICAgIEZJWFBfREJMICpsZWZ0U3BlY3RydW0sICpyaWdodFNwZWN0cnVtOwotICAgICAgU0hPUlQgKmxlZnRTY2FsZSA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5wRHluRGF0YS0+YVNmYlNjYWxlW3dpbmRvdyoxNl07Ci0gICAgICBTSE9SVCAqcmlnaHRTY2FsZSA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5wRHluRGF0YS0+YVNmYlNjYWxlW3dpbmRvdyoxNl07CisgICAgICBTSE9SVCAqbGVmdFNjYWxlID0KKyAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cER5bkRhdGEtPmFTZmJTY2FsZVt3aW5kb3cgKiAxNl07CisgICAgICBTSE9SVCAqcmlnaHRTY2FsZSA9CisgICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPnBEeW5EYXRhLT5hU2ZiU2NhbGVbd2luZG93ICogMTZdOwogICAgICAgaW50IGJhbmQ7CiAKLSAgICAgIGxlZnRTcGVjdHJ1bSA9IFNQRUMocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cFNwZWN0cmFsQ29lZmZpY2llbnQsIHdpbmRvdywgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+Z3JhbnVsZUxlbmd0aCk7Ci0gICAgICByaWdodFNwZWN0cnVtID0gU1BFQyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5wU3BlY3RyYWxDb2VmZmljaWVudCwgd2luZG93LCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5ncmFudWxlTGVuZ3RoKTsKKyAgICAgIGxlZnRTcGVjdHJ1bSA9IFNQRUMocEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+cFNwZWN0cmFsQ29lZmZpY2llbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdywgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+Z3JhbnVsZUxlbmd0aCk7CisgICAgICByaWdodFNwZWN0cnVtID0gU1BFQyhwQWFjRGVjb2RlckNoYW5uZWxJbmZvW1JdLT5wU3BlY3RyYWxDb2VmZmljaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdywgcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+Z3JhbnVsZUxlbmd0aCk7CiAKLSAgICAgIGZvciAoYmFuZD0wOyBiYW5kPHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZDsgYmFuZCsrKQotICAgICAgewotICAgICAgICBpZiAoKENvZGVCb29rIFtiYW5kXSA9PSBJTlRFTlNJVFlfSENCKSB8fAotICAgICAgICAgICAgKENvZGVCb29rIFtiYW5kXSA9PSBJTlRFTlNJVFlfSENCMikpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgYmFuZFNjYWxlID0gLShTY2FsZUZhY3RvciBbYmFuZF0gKyAxMDApIDsKKyAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQ7IGJhbmQrKykgeworICAgICAgICBpZiAoKENvZGVCb29rW2JhbmRdID09IElOVEVOU0lUWV9IQ0IpIHx8CisgICAgICAgICAgICAoQ29kZUJvb2tbYmFuZF0gPT0gSU5URU5TSVRZX0hDQjIpKSB7CisgICAgICAgICAgaW50IGJhbmRTY2FsZSA9IC0oU2NhbGVGYWN0b3JbYmFuZF0gKyAxMDApOwogCi0gICAgICAgICAgaW50IG1zYiA9IGJhbmRTY2FsZSA+PiAyIDsKLSAgICAgICAgICBpbnQgbHNiID0gYmFuZFNjYWxlICYgMHgwMyA7CisgICAgICAgICAgaW50IG1zYiA9IGJhbmRTY2FsZSA+PiAyOworICAgICAgICAgIGludCBsc2IgPSBiYW5kU2NhbGUgJiAweDAzOwogCiAgICAgICAgICAgLyogZXhwb25lbnQgb2YgTWFudGlzc2FUYWJsZVtsc2JdWzBdIGlzIDEsIHRodXMgbXNiKzEgYmVsb3cuICovCiAgICAgICAgICAgRklYUF9EQkwgc2NhbGUgPSBNYW50aXNzYVRhYmxlW2xzYl1bMF07CiAKICAgICAgICAgICAvKiBJU08vSUVDIDE0NDk2LTMgQ2hhcHRlciA0LjYuOC4yLjMgOgotICAgICAgICAgICAgIFRoZSB1c2Ugb2YgaW50ZW5zaXR5IHN0ZXJlbyBjb2RpbmcgaXMgc2lnbmFsZWQgYnkgdGhlIHVzZSBvZiB0aGUgcHNldWRvIGNvZGVib29rcwotICAgICAgICAgICAgIElOVEVOU0lUWV9IQ0IgYW5kIElOVEVOU0lUWV9IQ0IyICgxNSBhbmQgMTQpIG9ubHkgaW4gdGhlIHJpZ2h0IGNoYW5uZWwgb2YgYQotICAgICAgICAgICAgIGNoYW5uZWxfcGFpcl9lbGVtZW50KCkgaGF2aW5nIGEgY29tbW9uIGljc19pbmZvKCkgKGNvbW1vbl93aW5kb3cgPT0gMSkuICovCi0gICAgICAgICAgRkRLX0FTU0VSVChHZXRXaW5kb3dTZXF1ZW5jZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tMXS0+aWNzSW5mbykgPT0gR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPmljc0luZm8pKTsKLSAgICAgICAgICBGREtfQVNTRVJUKEdldFdpbmRvd1NoYXBlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKSA9PSBHZXRXaW5kb3dTaGFwZSgmcEFhY0RlY29kZXJDaGFubmVsSW5mb1tSXS0+aWNzSW5mbykpOworICAgICAgICAgICAgIFRoZSB1c2Ugb2YgaW50ZW5zaXR5IHN0ZXJlbyBjb2RpbmcgaXMgc2lnbmFsZWQgYnkgdGhlIHVzZSBvZiB0aGUKKyAgICAgICAgICAgICBwc2V1ZG8gY29kZWJvb2tzIElOVEVOU0lUWV9IQ0IgYW5kIElOVEVOU0lUWV9IQ0IyICgxNSBhbmQgMTQpIG9ubHkKKyAgICAgICAgICAgICBpbiB0aGUgcmlnaHQgY2hhbm5lbCBvZiBhIGNoYW5uZWxfcGFpcl9lbGVtZW50KCkgaGF2aW5nIGEgY29tbW9uCisgICAgICAgICAgICAgaWNzX2luZm8oKSAoY29tbW9uX3dpbmRvdyA9PSAxKS4gKi8KKyAgICAgICAgICBGREtfQVNTRVJUKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKSA9PQorICAgICAgICAgICAgICAgICAgICAgR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPmljc0luZm8pKTsKKyAgICAgICAgICBGREtfQVNTRVJUKEdldFdpbmRvd1NoYXBlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvW0xdLT5pY3NJbmZvKSA9PQorICAgICAgICAgICAgICAgICAgICAgR2V0V2luZG93U2hhcGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bUl0tPmljc0luZm8pKTsKIAotICAgICAgICAgIHJpZ2h0U2NhbGVbYmFuZF0gPSBsZWZ0U2NhbGVbYmFuZF0rbXNiKzE7CisgICAgICAgICAgcmlnaHRTY2FsZVtiYW5kXSA9IGxlZnRTY2FsZVtiYW5kXSArIG1zYiArIDE7CiAKLSAgICAgICAgICBpZiAoQ29tbW9uV2luZG93ICYmIChwSm9pbnRTdGVyZW9EYXRhLT5Nc1VzZWRbYmFuZF0gJiBncm91cE1hc2spKQotICAgICAgICAgIHsKLQorICAgICAgICAgIGlmIChwSm9pbnRTdGVyZW9EYXRhLT5Nc1VzZWRbYmFuZF0gJiBncm91cE1hc2spIHsKICAgICAgICAgICAgIGlmIChDb2RlQm9va1tiYW5kXSA9PSBJTlRFTlNJVFlfSENCKSAvKiBfTk9UXyBpbi1waGFzZSAqLwogICAgICAgICAgICAgewotICAgICAgICAgICAgICBzY2FsZSA9IC1zY2FsZSA7CisgICAgICAgICAgICAgIHNjYWxlID0gLXNjYWxlOwogICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgeworICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoQ29kZUJvb2tbYmFuZF0gPT0gSU5URU5TSVRZX0hDQjIpIC8qIG91dC1vZi1waGFzZSAqLwogICAgICAgICAgICAgewotICAgICAgICAgICAgICBzY2FsZSA9IC1zY2FsZSA7CisgICAgICAgICAgICAgIHNjYWxlID0gLXNjYWxlOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KIAotICAgICAgICAgIGZvciAoaW50IGluZGV4PXBTY2FsZUZhY3RvckJhbmRPZmZzZXRzW2JhbmRdOyBpbmRleDxwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0c1tiYW5kKzFdOyBpbmRleCsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJpZ2h0U3BlY3RydW1baW5kZXhdID0gZk11bHQobGVmdFNwZWN0cnVtW2luZGV4XSxzY2FsZSk7CisgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSBwU2NhbGVGYWN0b3JCYW5kT2Zmc2V0c1tiYW5kXTsKKyAgICAgICAgICAgICAgIGluZGV4IDwgcFNjYWxlRmFjdG9yQmFuZE9mZnNldHNbYmFuZCArIDFdOyBpbmRleCsrKSB7CisgICAgICAgICAgICByaWdodFNwZWN0cnVtW2luZGV4XSA9IGZNdWx0KGxlZnRTcGVjdHJ1bVtpbmRleF0sIHNjYWxlKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvc3RlcmVvLmggYi9saWJBQUNkZWMvc3JjL3N0ZXJlby5oCmluZGV4IDg5OWI0ODUuLmFmN2E3NGYgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2RlYy9zcmMvc3RlcmVvLmgKKysrIGIvbGliQUFDZGVjL3NyYy9zdGVyZW8uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzNSArOTAsMTAwIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKICAgIERlc2NyaXB0aW9uOiBqb2ludCBzdGVyZW8gcHJvY2Vzc2luZwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIFNURVJFT19ICiAjZGVmaW5lIFNURVJFT19ICiAKLQotCiAjaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAotZW51bQotewotICBKb2ludFN0ZXJlb01heGltdW1Hcm91cHMgPSA4LAotICBKb2ludFN0ZXJlb01heGltdW1CYW5kcyA9IDY0Ci19OworI2RlZmluZSBTRkJfUEVSX1BSRURfQkFORCAyCiAKLXR5cGVkZWYgc3RydWN0Ci17CisjZGVmaW5lIFNSX0ZOQV9PVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMCAvKiBBZGRpdGlvbmFsIHNjYWxpbmcgb2YgdGhlIENKb2ludFN0ZXJlb19maWx0ZXJBbmRBZGQoKS1vdXRwdXQgdG8gYXZvaWQgXAorICAgICAgIG92ZXJmbG93cy4gICAgKi8KKyAgICAvKiBUaGUgc2NhbGluZyBmYWN0b3IgY2FuIGJlIHNldCB0byAwIGlmIHRoZSBjb2VmZmljaWVudHMgYXJlIHByZXNjYWxlZAorICAgICAqIGFwcHJvcHJpYXRlbHkuICovCisvKiBQcmVzY2FsaW5nIHZpYSBmYWN0b3IgU0ZfRk5BX0NPRUZGUyBpcyBkb25lIGF0IGNvbXBpbGUtdGltZSBidXQgc2hvdWxkIG9ubHkKKyAqIGJlICAgICAgKi8KKy8qIHV0aWxpemVkIGlmIHRoZSBjb2VmZmljaWVudHMgYXJlIHN0b3JlZCBhcyBGSVhQX0RCTC4gKGNwLiBhYWNfcm9tLmNwcC8uaCkgKi8KKworLyogVGhlIE5PX0NQTFhfUFJFRF9CVUdGSVgtc3dpdGNoIHdhcyBpbnRyb2R1Y2VkIHRvIGVuYWJsZSBkZWNvZGluZyBvZgorICAgY29uZm9ybWFuY2Utc3RyZWFtcyBpbiB3YXkgdGhhdCB0aGV5IGFyZSBjb21wYXJhYmxlIHRvIGJ1Z2d5CisgICByZWZlcmVuY2Utc3RyZWFtcy4gVGhpcyBpcyBlc3RhYmxpc2hlZCBieSBzdG9yaW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgorICAgZm9yIGNvbXB1dGF0aW9uIG9mIHRoZSAiZG93bm1peCBNRENUIG9mIHByZXZpb3VzIGZyYW1lIi4gVGhpcyBpcyBub3Qgc3RhbmRhcmQKKyAgIGNvbXBsaWFudC4gT25jZSBjb3JyZWN0IHJlZmVyZW5jZS1zdHJlYW1zIGZvciBjb21wbGV4LXN0ZXJlby1wcmVkaWN0aW9uIGFyZQorICAgYXZhaWxhYmxlIHRoaXMgc3dpdGNoIGJlY29tZXMgb2Jzb2xldGUuCisqLworLyojZGVmaW5lIE5PX0NQTFhfUFJFRF9CVUdGSVgqLworCitlbnVtIHsgSm9pbnRTdGVyZW9NYXhpbXVtR3JvdXBzID0gOCwgSm9pbnRTdGVyZW9NYXhpbXVtQmFuZHMgPSA2NCB9OworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIHByZWRfZGlyOyAgLy8gMCA9IHByZWRpY3Rpb24gZnJvbSBtaWQgdG8gc2lkZSBjaGFubmVsLCAxID0gdmljZSB2ZXJzYQorICBVQ0hBUgorICBpZ2ZfcHJlZF9kaXI7ICAvLyAwID0gcHJlZGljdGlvbiBmcm9tIG1pZCB0byBzaWRlIGNoYW5uZWwsIDEgPSB2aWNlIHZlcnNhCisgIFVDSEFSIGNvbXBsZXhfY29lZjsgICAgLy8gMCA9IGFscGhhX3FfaW1beF0gaXMgMCBmb3IgYWxsIHByZWRpY3Rpb24gYmFuZHMsIDEgPQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscGhhX3FfaW1beF0gaXMgdHJhbnNtaXR0ZWQgdmlhIGJpdHN0cmVhbQorICBVQ0hBUiB1c2VfcHJldl9mcmFtZTsgIC8vIDAgPSB1c2UgY3VycmVudCBmcmFtZSBmb3IgTURTVCBlc3RpbWF0aW9uLCAxID0gdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBhbmQgcHJldmlvdXMgZnJhbWUKKworICBTSE9SVCBhbHBoYV9xX3JlW0pvaW50U3RlcmVvTWF4aW11bUdyb3Vwc11bSm9pbnRTdGVyZW9NYXhpbXVtQmFuZHNdOworICBTSE9SVCBhbHBoYV9xX2ltW0pvaW50U3RlcmVvTWF4aW11bUdyb3Vwc11bSm9pbnRTdGVyZW9NYXhpbXVtQmFuZHNdOworfSBDQ3BseFByZWRpY3Rpb25EYXRhOworCisvKiBqb2ludCBzdGVyZW8gc2NyYXRjaCBtZW1vcnkgKHZhbGlkIGZvciB0aGlzIGZyYW1lKSAqLwordHlwZWRlZiBzdHJ1Y3QgewogICBVQ0hBUiBNc01hc2tQcmVzZW50OwotICBVQ0hBUiBNc1VzZWRbSm9pbnRTdGVyZW9NYXhpbXVtQmFuZHNdOyAvKiE8IGV2ZXJ5IGFycnkgZWxlbWVudCBjb250YWlucyBmbGFncyBmb3IgdXAgdG8gOCBncm91cHMgKi8KKyAgVUNIQVIgTXNVc2VkW0pvaW50U3RlcmVvTWF4aW11bUJhbmRzXTsgLyohPCBldmVyeSBhcnJ5IGVsZW1lbnQgY29udGFpbnMgZmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHVwIHRvIDggZ3JvdXBzLiB0aGlzIGFycmF5IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsc28gdXRpbGl6ZWQgZm9yIGNvbXBsZXggc3RlcmVvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3Rpb24uICovCisgIFVDSEFSIElHRl9Nc01hc2tQcmVzZW50OworCisgIFVDSEFSIGNwbHhfcHJlZF9mbGFnOyAvKiBzdGVyZW8gY29tcGxleCBwcmVkaWN0aW9uIHdhcyBzaWduYWxsZWQgZm9yIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lICovCisgIFVDSEFSIGlnZl9jcGx4X3ByZWRfZmxhZzsKKworICAvKiBUaGUgZm9sbG93aW5nIGFycmF5IGFuZCB2YXJpYWJsZSBhcmUgbmVlZGVkIGZvciB0aGUgY2FzZSAgd2hlbiBJTkYgaXMKKyAgICogYWN0aXZlICovCisgIEZJWFBfREJMIHN0b3JlX2RteF9yZV9wcmV2WzEwMjRdOworICBTSE9SVCBzdG9yZV9kbXhfcmVfcHJldl9lOworCiB9IENKb2ludFN0ZXJlb0RhdGE7CiAKKy8qIGpvaW50IHN0ZXJlbyBwZXJzaXN0ZW50IG1lbW9yeSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBjbGVhclNwZWN0cmFsQ29lZmZzOyAvKiBpbmRpY2F0ZXMgdGhhdCB0aGUgc3BlY3RyYWwgY29lZmZzIG11c3QgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJlZCBiZWNhdXNlIHRoZSB0cmFuc2Zvcm0gc3BsaXR0aW5nIGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnIG9mIHRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVsIHdhcyBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgRklYUF9EQkwgKnNjcmF0Y2hCdWZmZXI7IC8qIHBvaW50ZXIgdG8gc2NyYXRjaCBidWZmZXIgKi8KKworICBGSVhQX0RCTAorICAqc3BlY3RyYWxDb2VmZnNbMl07IC8qIHNwZWN0cmFsIGNvZWZmaWNpZW50cyBvZiB0aGlzIGNoYW5uZWwgdXRpbGl6ZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4IHN0ZXJlbyBwcmVkaWN0aW9uICovCisgIFNIT1JUICpzcGVjU2NhbGVbMl07CisKKyAgU0hPUlQgYWxwaGFfcV9yZV9wcmV2W0pvaW50U3RlcmVvTWF4aW11bUdyb3Vwc11bSm9pbnRTdGVyZW9NYXhpbXVtQmFuZHNdOworICBTSE9SVCBhbHBoYV9xX2ltX3ByZXZbSm9pbnRTdGVyZW9NYXhpbXVtR3JvdXBzXVtKb2ludFN0ZXJlb01heGltdW1CYW5kc107CisKKyAgVUNIQVIgd2luU2VxUHJldjsKKyAgVUNIQVIgd2luU2hhcGVQcmV2OworICBVQ0hBUiB3aW5Hcm91cHNQcmV2OworCit9IENKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhOwogCiAvKiEKICAgXGJyaWVmIFJlYWQgam9pbnQgc3RlcmVvIGRhdGEgZnJvbSBiaXRzdHJlYW0KQEAgLTExNSwyMCArMTkxLDIxIEBACiAgIFRoZSBmdW5jdGlvbiByZWFkcyBqb2ludCBzdGVyZW8gZGF0YSBmcm9tIGJpdHN0cmVhbS4KIAogICBccGFyYW0gYnMgYml0IHN0cmVhbSBoYW5kbGUgZGF0YSBzb3VyY2UuCi0gIFxwYXJhbSBwSm9pbnRTdGVyZW9EYXRhIHBvaW50ZXIgdG8gc3RlcmVvIGRhdGEgc3RydWN0dXJlIHRvIHJlY2VpdmUgZGVjb2RlZCBkYXRhLgotICBccGFyYW0gd2luZG93R3JvdXBzIG51bWJlciBvZiB3aW5kb3cgZ3JvdXBzLgotICBccGFyYW0gc2NhbGVGYWN0b3JCYW5kc1RyYW5zbWl0dGVkIG51bWJlciBvZiB0cmFuc21pdHRlZCBzY2FsZWZhY3RvciBiYW5kcy4KLSAgXHBhcmFtIGZsYWdzIGRlY29kZXIgZmxhZ3MKKyAgXHBhcmFtIHBKb2ludFN0ZXJlb0RhdGEgcG9pbnRlciB0byBzdGVyZW8gZGF0YSBzdHJ1Y3R1cmUgdG8gcmVjZWl2ZSBkZWNvZGVkCisgIGRhdGEuIFxwYXJhbSB3aW5kb3dHcm91cHMgbnVtYmVyIG9mIHdpbmRvdyBncm91cHMuIFxwYXJhbQorICBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHNjYWxlZmFjdG9yIGJhbmRzLiBccGFyYW0KKyAgZmxhZ3MgZGVjb2RlciBmbGFncwogCiAgIFxyZXR1cm4gIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IuCiAqLwotaW50IENKb2ludFN0ZXJlb19SZWFkKAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICAgICAgQ0pvaW50U3RlcmVvRGF0YSAqcEpvaW50U3RlcmVvRGF0YSwKLSAgICAgICAgaW50IHdpbmRvd0dyb3VwcywKLSAgICAgICAgaW50IHNjYWxlRmFjdG9yQmFuZHNUcmFuc21pdHRlZCwKLSAgICAgICAgVUlOVCBmbGFncwotICAgICAgICApOwotCitpbnQgQ0pvaW50U3RlcmVvX1JlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgICAgICAgICAgICAgICAgQ0pvaW50U3RlcmVvRGF0YSAqcEpvaW50U3RlcmVvRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgd2luZG93R3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZUZhY3RvckJhbmRzVHJhbnNtaXR0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG1heF9zZmJfc3RlX2NsZWFyLAorICAgICAgICAgICAgICAgICAgICAgIENKb2ludFN0ZXJlb1BlcnNpc3RlbnREYXRhICpwSm9pbnRTdGVyZW9QZXJzaXN0ZW50RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBDQ3BseFByZWRpY3Rpb25EYXRhICpjcGx4UHJlZGljdGlvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGNwbHhQcmVkaWN0aW9uQWN0aXYsIGludCBzY2FsZUZhY3RvckJhbmRzVG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd1NlcXVlbmNlLCBjb25zdCBVSU5UIGZsYWdzKTsKIAogI2VuZGlmIC8qICNpZm5kZWYgU1RFUkVPX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19hY2VfZDR0NjQuY3BwIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX2FjZV9kNHQ2NC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlMDZjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19hY2VfZDR0NjQuY3BwCkBAIC0wLDAgKzEsNDM5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IEFDRUxQCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2FjZGVjX2FjZV9kNHQ2NC5oIgorCisjZGVmaW5lIExfU1VCRlIgNjQgLyogU3ViZnJhbWUgc2l6ZSAgICAgICAgICAgICAgKi8KKworLyoKKyAqIERfQUNFTFBfYWRkX3B1bHNlCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgIHBvcyAgICAgICAgIEk6IHBvc2l0aW9uIG9mIHB1bHNlCisgKiAgICBuYl9wdWxzZSAgICBJOiBudW1iZXIgb2YgcHVsc2VzCisgKiAgICB0cmFjayAgICAgICBJOiB0cmFjaworICogICAgY29kZSAgICAgICAgTzogZml4ZWQgY29kZWJvb2sKKyAqCisgKiBGdW5jdGlvbjoKKyAqICAgIEFkZCBwdWxzZXMgdG8gZml4ZWQgY29kZWJvb2sKKyAqCisgKiBSZXR1cm5zOgorICogICAgdm9pZAorICovCitzdGF0aWMgdm9pZCBEX0FDRUxQX2FkZF9wdWxzZShTSE9SVCBwb3NbXSwgU0hPUlQgbmJfcHVsc2UsIFNIT1JUIHRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9DT0QgY29kZVtdKSB7CisgIFNIT1JUIGksIGs7CisgIGZvciAoayA9IDA7IGsgPCBuYl9wdWxzZTsgaysrKSB7CisgICAgLyogaSA9ICgocG9zW2tdICYgKDE2LTEpKSpOQl9UUkFDSykgKyB0cmFjazsgKi8KKyAgICBpID0gKChwb3Nba10gJiAoMTYgLSAxKSkgPDwgMikgKyB0cmFjazsKKyAgICBpZiAoKHBvc1trXSAmIDE2KSA9PSAwKSB7CisgICAgICBjb2RlW2ldID0gY29kZVtpXSArIChGSVhQX0NPRCkoNTEyIDw8IChDT0RfQklUUyAtIEZSQUNUX0JJVFMpKTsKKyAgICB9IGVsc2UgeworICAgICAgY29kZVtpXSA9IGNvZGVbaV0gLSAoRklYUF9DT0QpKDUxMiA8PCAoQ09EX0JJVFMgLSBGUkFDVF9CSVRTKSk7CisgICAgfQorICB9CisgIHJldHVybjsKK30KKy8qCisgKiBEX0FDRUxQX2RlY29kZV8xcF9OMQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgICBpbmRleCAgICBJOiBwdWxzZSBpbmRleAorICogICAgTiAgICAgICAgSTogbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uCisgKiAgICBvZmZzZXQgICBJOiBvZmZzZXQKKyAqICAgIHBvcyAgICAgIE86IHBvc2l0aW9uIG9mIHRoZSBwdWxzZQorICoKKyAqIEZ1bmN0aW9uOgorICogICAgRGVjb2RlIDEgcHVsc2Ugd2l0aCBOKzEgYml0cworICoKKyAqIFJldHVybnM6CisgKiAgICB2b2lkCisgKi8KK3N0YXRpYyB2b2lkIERfQUNFTFBfZGVjb2RlXzFwX04xKExPTkcgaW5kZXgsIFNIT1JUIE4sIFNIT1JUIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUIHBvc1tdKSB7CisgIFNIT1JUIHBvczE7CisgIExPTkcgaSwgbWFzazsKKworICBtYXNrID0gKCgxIDw8IE4pIC0gMSk7CisgIC8qCisgICAqIERlY29kZSAxIHB1bHNlIHdpdGggTisxIGJpdHMKKyAgICovCisgIHBvczEgPSAoU0hPUlQpKChpbmRleCAmIG1hc2spICsgb2Zmc2V0KTsKKyAgaSA9ICgoaW5kZXggPj4gTikgJiAxKTsKKyAgaWYgKGkgPT0gMSkgeworICAgIHBvczEgKz0gMTY7CisgIH0KKyAgcG9zWzBdID0gcG9zMTsKKyAgcmV0dXJuOworfQorLyoKKyAqIERfQUNFTFBfZGVjb2RlXzJwXzJOMQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgICBpbmRleCAgICBJOiBwdWxzZSBpbmRleAorICogICAgTiAgICAgICAgSTogbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uCisgKiAgICBvZmZzZXQgICBJOiBvZmZzZXQKKyAqICAgIHBvcyAgICAgIE86IHBvc2l0aW9uIG9mIHRoZSBwdWxzZQorICoKKyAqIEZ1bmN0aW9uOgorICogICAgRGVjb2RlIDIgcHVsc2VzIHdpdGggMipOKzEgYml0cworICoKKyAqIFJldHVybnM6CisgKiAgICB2b2lkCisgKi8KK3N0YXRpYyB2b2lkIERfQUNFTFBfZGVjb2RlXzJwXzJOMShMT05HIGluZGV4LCBTSE9SVCBOLCBTSE9SVCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgcG9zW10pIHsKKyAgU0hPUlQgcG9zMSwgcG9zMjsKKyAgTE9ORyBtYXNrLCBpOworICBtYXNrID0gKCgxIDw8IE4pIC0gMSk7CisgIC8qCisgICAqIERlY29kZSAyIHB1bHNlcyB3aXRoIDIqTisxIGJpdHMKKyAgICovCisgIHBvczEgPSAoU0hPUlQpKCgoaW5kZXggPj4gTikgJiBtYXNrKSArIG9mZnNldCk7CisgIGkgPSAoaW5kZXggPj4gKDIgKiBOKSkgJiAxOworICBwb3MyID0gKFNIT1JUKSgoaW5kZXggJiBtYXNrKSArIG9mZnNldCk7CisgIGlmICgocG9zMiAtIHBvczEpIDwgMCkgeworICAgIGlmIChpID09IDEpIHsKKyAgICAgIHBvczEgKz0gMTY7CisgICAgfSBlbHNlIHsKKyAgICAgIHBvczIgKz0gMTY7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChpID09IDEpIHsKKyAgICAgIHBvczEgKz0gMTY7CisgICAgICBwb3MyICs9IDE2OworICAgIH0KKyAgfQorICBwb3NbMF0gPSBwb3MxOworICBwb3NbMV0gPSBwb3MyOworICByZXR1cm47Cit9CisvKgorICogRF9BQ0VMUF9kZWNvZGVfM3BfM04xCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgIGluZGV4ICAgIEk6IHB1bHNlIGluZGV4CisgKiAgICBOICAgICAgICBJOiBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24KKyAqICAgIG9mZnNldCAgIEk6IG9mZnNldAorICogICAgcG9zICAgICAgTzogcG9zaXRpb24gb2YgdGhlIHB1bHNlCisgKgorICogRnVuY3Rpb246CisgKiAgICBEZWNvZGUgMyBwdWxzZXMgd2l0aCAzKk4rMSBiaXRzCisgKgorICogUmV0dXJuczoKKyAqICAgIHZvaWQKKyAqLworc3RhdGljIHZvaWQgRF9BQ0VMUF9kZWNvZGVfM3BfM04xKExPTkcgaW5kZXgsIFNIT1JUIE4sIFNIT1JUIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCBwb3NbXSkgeworICBTSE9SVCBqOworICBMT05HIG1hc2ssIGlkeDsKKworICAvKgorICAgKiBEZWNvZGUgMyBwdWxzZXMgd2l0aCAzKk4rMSBiaXRzCisgICAqLworICBtYXNrID0gKCgxIDw8ICgoMiAqIE4pIC0gMSkpIC0gMSk7CisgIGlkeCA9IGluZGV4ICYgbWFzazsKKyAgaiA9IG9mZnNldDsKKyAgaWYgKCgoaW5kZXggPj4gKCgyICogTikgLSAxKSkgJiAxKSA9PSAxKSB7CisgICAgaiArPSAoMSA8PCAoTiAtIDEpKTsKKyAgfQorICBEX0FDRUxQX2RlY29kZV8ycF8yTjEoaWR4LCBOIC0gMSwgaiwgcG9zKTsKKyAgbWFzayA9ICgoMSA8PCAoTiArIDEpKSAtIDEpOworICBpZHggPSAoaW5kZXggPj4gKDIgKiBOKSkgJiBtYXNrOworICBEX0FDRUxQX2RlY29kZV8xcF9OMShpZHgsIE4sIG9mZnNldCwgcG9zICsgMik7CisgIHJldHVybjsKK30KKy8qCisgKiBEX0FDRUxQX2RlY29kZV80cF80TjEKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAgaW5kZXggICAgSTogcHVsc2UgaW5kZXgKKyAqICAgIE4gICAgICAgIEk6IG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbgorICogICAgb2Zmc2V0ICAgSTogb2Zmc2V0CisgKiAgICBwb3MgICAgICBPOiBwb3NpdGlvbiBvZiB0aGUgcHVsc2UKKyAqCisgKiBGdW5jdGlvbjoKKyAqICAgIERlY29kZSA0IHB1bHNlcyB3aXRoIDQqTisxIGJpdHMKKyAqCisgKiBSZXR1cm5zOgorICogICAgdm9pZAorICovCitzdGF0aWMgdm9pZCBEX0FDRUxQX2RlY29kZV80cF80TjEoTE9ORyBpbmRleCwgU0hPUlQgTiwgU0hPUlQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUIHBvc1tdKSB7CisgIFNIT1JUIGo7CisgIExPTkcgbWFzaywgaWR4OworICAvKgorICAgKiBEZWNvZGUgNCBwdWxzZXMgd2l0aCA0Kk4rMSBiaXRzCisgICAqLworICBtYXNrID0gKCgxIDw8ICgoMiAqIE4pIC0gMSkpIC0gMSk7CisgIGlkeCA9IGluZGV4ICYgbWFzazsKKyAgaiA9IG9mZnNldDsKKyAgaWYgKCgoaW5kZXggPj4gKCgyICogTikgLSAxKSkgJiAxKSA9PSAxKSB7CisgICAgaiArPSAoMSA8PCAoTiAtIDEpKTsKKyAgfQorICBEX0FDRUxQX2RlY29kZV8ycF8yTjEoaWR4LCBOIC0gMSwgaiwgcG9zKTsKKyAgbWFzayA9ICgoMSA8PCAoKDIgKiBOKSArIDEpKSAtIDEpOworICBpZHggPSAoaW5kZXggPj4gKDIgKiBOKSkgJiBtYXNrOworICBEX0FDRUxQX2RlY29kZV8ycF8yTjEoaWR4LCBOLCBvZmZzZXQsIHBvcyArIDIpOworICByZXR1cm47Cit9CisvKgorICogRF9BQ0VMUF9kZWNvZGVfNHBfNE4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAgaW5kZXggICAgSTogcHVsc2UgaW5kZXgKKyAqICAgIE4gICAgICAgIEk6IG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbgorICogICAgb2Zmc2V0ICAgSTogb2Zmc2V0CisgKiAgICBwb3MgICAgICBPOiBwb3NpdGlvbiBvZiB0aGUgcHVsc2UKKyAqCisgKiBGdW5jdGlvbjoKKyAqICAgIERlY29kZSA0IHB1bHNlcyB3aXRoIDQqTiBiaXRzCisgKgorICogUmV0dXJuczoKKyAqICAgIHZvaWQKKyAqLworc3RhdGljIHZvaWQgRF9BQ0VMUF9kZWNvZGVfNHBfNE4oTE9ORyBpbmRleCwgU0hPUlQgTiwgU0hPUlQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgcG9zW10pIHsKKyAgU0hPUlQgaiwgbl8xOworICAvKgorICAgKiBEZWNvZGUgNCBwdWxzZXMgd2l0aCA0Kk4gYml0cworICAgKi8KKyAgbl8xID0gTiAtIDE7CisgIGogPSBvZmZzZXQgKyAoMSA8PCBuXzEpOworICBzd2l0Y2ggKChpbmRleCA+PiAoKDQgKiBOKSAtIDIpKSAmIDMpIHsKKyAgICBjYXNlIDA6CisgICAgICBpZiAoKChpbmRleCA+PiAoKDQgKiBuXzEpICsgMSkpICYgMSkgPT0gMCkgeworICAgICAgICBEX0FDRUxQX2RlY29kZV80cF80TjEoaW5kZXgsIG5fMSwgb2Zmc2V0LCBwb3MpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRF9BQ0VMUF9kZWNvZGVfNHBfNE4xKGluZGV4LCBuXzEsIGosIHBvcyk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBEX0FDRUxQX2RlY29kZV8xcF9OMSgoaW5kZXggPj4gKCgzICogbl8xKSArIDEpKSwgbl8xLCBvZmZzZXQsIHBvcyk7CisgICAgICBEX0FDRUxQX2RlY29kZV8zcF8zTjEoaW5kZXgsIG5fMSwgaiwgcG9zICsgMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBEX0FDRUxQX2RlY29kZV8ycF8yTjEoKGluZGV4ID4+ICgoMiAqIG5fMSkgKyAxKSksIG5fMSwgb2Zmc2V0LCBwb3MpOworICAgICAgRF9BQ0VMUF9kZWNvZGVfMnBfMk4xKGluZGV4LCBuXzEsIGosIHBvcyArIDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgRF9BQ0VMUF9kZWNvZGVfM3BfM04xKChpbmRleCA+PiAobl8xICsgMSkpLCBuXzEsIG9mZnNldCwgcG9zKTsKKyAgICAgIERfQUNFTFBfZGVjb2RlXzFwX04xKGluZGV4LCBuXzEsIGosIHBvcyArIDMpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuOworfQorCisvKgorICogRF9BQ0VMUF9kZWNvZGVfNHQKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAgaW5kZXggICAgICAgICAgSTogaW5kZXgKKyAqICAgIG1vZGUgICAgICAgICAgIEk6IHNwZWVjaCBtb2RlCisgKiAgICBjb2RlICAgICAgICAgICBJOiAoUTkpIGFsZ2VicmFpYyAoZml4ZWQpIGNvZGVib29rIGV4Y2l0YXRpb24KKyAqCisgKiBGdW5jdGlvbjoKKyAqICAgIDIwLCAzNiwgNDQsIDUyLCA2NCwgNzIsIDg4IGJpdHMgYWxnZWJyYWljIGNvZGVib29rLgorICogICAgNCB0cmFja3MgeCAxNiBwb3NpdGlvbnMgcGVyIHRyYWNrID0gNjQgc2FtcGxlcy4KKyAqCisgKiAgICAyMCBiaXRzIDUrNSs1KzUgLS0+IDQgcHVsc2VzIGluIGEgZnJhbWUgb2YgNjQgc2FtcGxlcy4KKyAqICAgIDM2IGJpdHMgOSs5KzkrOSAtLT4gOCBwdWxzZXMgaW4gYSBmcmFtZSBvZiA2NCBzYW1wbGVzLgorICogICAgNDQgYml0cyAxMys5KzEzKzkgLS0+IDEwIHB1bHNlcyBpbiBhIGZyYW1lIG9mIDY0IHNhbXBsZXMuCisgKiAgICA1MiBiaXRzIDEzKzEzKzEzKzEzIC0tPiAxMiBwdWxzZXMgaW4gYSBmcmFtZSBvZiA2NCBzYW1wbGVzLgorICogICAgNjQgYml0cyAyKzIrMisyKzE0KzE0KzE0KzE0IC0tPiAxNiBwdWxzZXMgaW4gYSBmcmFtZSBvZiA2NCBzYW1wbGVzLgorICogICAgNzIgYml0cyAxMCsyKzEwKzIrMTArMTQrMTArMTQgLS0+IDE4IHB1bHNlcyBpbiBhIGZyYW1lIG9mIDY0IHNhbXBsZXMuCisgKiAgICA4OCBiaXRzIDExKzExKzExKzExKzExKzExKzExKzExIC0tPiAyNCBwdWxzZXMgaW4gYSBmcmFtZSBvZiA2NCBzYW1wbGVzLgorICoKKyAqICAgIEFsbCBwdWxzZXMgY2FuIGhhdmUgdHdvICgyKSBwb3NzaWJsZSBhbXBsaXR1ZGVzOiArMSBvciAtMS4KKyAqICAgIEVhY2ggcHVsc2UgY2FuIHNpeHRlZW4gKDE2KSBwb3NzaWJsZSBwb3NpdGlvbnMuCisgKgorICogICAgY29kZXZlY3RvciBsZW5ndGggICAgNjQKKyAqICAgIG51bWJlciBvZiB0cmFjayAgICAgIDQKKyAqICAgIG51bWJlciBvZiBwb3NpdGlvbiAgIDE2CisgKgorICogUmV0dXJuczoKKyAqICAgIHZvaWQKKyAqLwordm9pZCBEX0FDRUxQX2RlY29kZV80dDY0KFNIT1JUIGluZGV4W10sIGludCBuYml0cywgRklYUF9DT0QgY29kZVtdKSB7CisgIExPTkcgTF9pbmRleDsKKyAgU0hPUlQgaywgcG9zWzZdOworCisgIEZES21lbWNsZWFyKGNvZGUsIExfU1VCRlIgKiBzaXplb2YoRklYUF9DT0QpKTsKKworICAvKiBkZWNvZGUgdGhlIHBvc2l0aW9ucyBhbmQgc2lnbnMgb2YgcHVsc2VzIGFuZCBidWlsZCB0aGUgY29kZXdvcmQgKi8KKyAgc3dpdGNoIChuYml0cykgeworICAgIGNhc2UgMTI6CisgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgayArPSAyKSB7CisgICAgICAgIExfaW5kZXggPSBpbmRleFsyICogKGsgLyAyKSArIDFdOworICAgICAgICBEX0FDRUxQX2RlY29kZV8xcF9OMShMX2luZGV4LCA0LCAwLCBwb3MpOworICAgICAgICBEX0FDRUxQX2FkZF9wdWxzZShwb3MsIDEsIDIgKiAoaW5kZXhbMiAqIChrIC8gMildKSArIGsgLyAyLCBjb2RlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6IHsKKyAgICAgIGludCBpID0gMDsKKyAgICAgIGludCBvZmZzZXQgPSBpbmRleFtpKytdOworICAgICAgb2Zmc2V0ID0gKG9mZnNldCA9PSAwKSA/IDEgOiAzOworICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgeworICAgICAgICBpZiAoayAhPSBvZmZzZXQpIHsKKyAgICAgICAgICBMX2luZGV4ID0gaW5kZXhbaSsrXTsKKyAgICAgICAgICBEX0FDRUxQX2RlY29kZV8xcF9OMShMX2luZGV4LCA0LCAwLCBwb3MpOworICAgICAgICAgIERfQUNFTFBfYWRkX3B1bHNlKHBvcywgMSwgaywgY29kZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgMjA6CisgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgIExfaW5kZXggPSAoTE9ORylpbmRleFtrXTsKKyAgICAgICAgRF9BQ0VMUF9kZWNvZGVfMXBfTjEoTF9pbmRleCwgNCwgMCwgcG9zKTsKKyAgICAgICAgRF9BQ0VMUF9hZGRfcHVsc2UocG9zLCAxLCBrLCBjb2RlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjg6CisgICAgICBmb3IgKGsgPSAwOyBrIDwgNCAtIDI7IGsrKykgeworICAgICAgICBMX2luZGV4ID0gKExPTkcpaW5kZXhba107CisgICAgICAgIERfQUNFTFBfZGVjb2RlXzJwXzJOMShMX2luZGV4LCA0LCAwLCBwb3MpOworICAgICAgICBEX0FDRUxQX2FkZF9wdWxzZShwb3MsIDIsIGssIGNvZGUpOworICAgICAgfQorICAgICAgZm9yIChrID0gMjsgayA8IDQ7IGsrKykgeworICAgICAgICBMX2luZGV4ID0gKExPTkcpaW5kZXhba107CisgICAgICAgIERfQUNFTFBfZGVjb2RlXzFwX04xKExfaW5kZXgsIDQsIDAsIHBvcyk7CisgICAgICAgIERfQUNFTFBfYWRkX3B1bHNlKHBvcywgMSwgaywgY29kZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDM2OgorICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgeworICAgICAgICBMX2luZGV4ID0gKExPTkcpaW5kZXhba107CisgICAgICAgIERfQUNFTFBfZGVjb2RlXzJwXzJOMShMX2luZGV4LCA0LCAwLCBwb3MpOworICAgICAgICBEX0FDRUxQX2FkZF9wdWxzZShwb3MsIDIsIGssIGNvZGUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSA0NDoKKyAgICAgIGZvciAoayA9IDA7IGsgPCA0IC0gMjsgaysrKSB7CisgICAgICAgIExfaW5kZXggPSAoTE9ORylpbmRleFtrXTsKKyAgICAgICAgRF9BQ0VMUF9kZWNvZGVfM3BfM04xKExfaW5kZXgsIDQsIDAsIHBvcyk7CisgICAgICAgIERfQUNFTFBfYWRkX3B1bHNlKHBvcywgMywgaywgY29kZSk7CisgICAgICB9CisgICAgICBmb3IgKGsgPSAyOyBrIDwgNDsgaysrKSB7CisgICAgICAgIExfaW5kZXggPSAoTE9ORylpbmRleFtrXTsKKyAgICAgICAgRF9BQ0VMUF9kZWNvZGVfMnBfMk4xKExfaW5kZXgsIDQsIDAsIHBvcyk7CisgICAgICAgIERfQUNFTFBfYWRkX3B1bHNlKHBvcywgMiwgaywgY29kZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDUyOgorICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgeworICAgICAgICBMX2luZGV4ID0gKExPTkcpaW5kZXhba107CisgICAgICAgIERfQUNFTFBfZGVjb2RlXzNwXzNOMShMX2luZGV4LCA0LCAwLCBwb3MpOworICAgICAgICBEX0FDRUxQX2FkZF9wdWxzZShwb3MsIDMsIGssIGNvZGUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSA2NDoKKyAgICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspIHsKKyAgICAgICAgTF9pbmRleCA9ICgoKExPTkcpaW5kZXhba10gPDwgMTQpICsgKExPTkcpaW5kZXhbayArIDRdKTsKKyAgICAgICAgRF9BQ0VMUF9kZWNvZGVfNHBfNE4oTF9pbmRleCwgNCwgMCwgcG9zKTsKKyAgICAgICAgRF9BQ0VMUF9hZGRfcHVsc2UocG9zLCA0LCBrLCBjb2RlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBGREtfQVNTRVJUKDApOworICB9CisgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19hY2VfZDR0NjQuaCBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19hY2VfZDR0NjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmJjM2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX2FjZV9kNHQ2NC5oCkBAIC0wLDAgKzEsMTE3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IEFDRUxQCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVVNBQ0RFQ19BQ0VfRDRUNjRfSAorI2RlZmluZSBVU0FDREVDX0FDRV9ENFQ2NF9ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKy8qIERhdGEgdHlwZSBkZWZpbml0aW9uIGZvciB0aGUgZml4ZWQgY29kZWJvb2sgdmVjdG9yICovCisjZGVmaW5lIEZJWFBfQ09EIEZJWFBfU0dMCisjZGVmaW5lIEZYX0NPRDJGWF9EQkwoeCkgKEZYX1NHTDJGWF9EQkwoeCkpCisjZGVmaW5lIEZYX0RCTDJGWF9DT0QoeCkgRlhfREJMMkZYX1NHTCgoeCkgKyAoRklYUF9EQkwpMHg4MDAwKQorI2RlZmluZSBGWF9TR0wyRlhfQ09EKHgpICh4KQorI2RlZmluZSBDT0RfQklUUyBGUkFDVF9CSVRTCisKK3ZvaWQgRF9BQ0VMUF9kZWNvZGVfNHQ2NChTSE9SVCBpbmRleFtdLCBpbnQgbmJpdHMsIEZJWFBfQ09EIGNvZGVbXSk7CisKKyNlbmRpZiAvKiBVU0FDREVDX0FDRV9ENFQ2NF9IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL3VzYWNkZWNfYWNlX2x0cC5jcHAgYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfYWNlX2x0cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk2NGI0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19hY2VfbHRwLmNwcApAQCAtMCwwICsxLDIyOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWF0dGhpYXMgSGlsZGVuYnJhbmQKKworICAgRGVzY3JpcHRpb246IFVTQUMgQUNFTFAgTFRQIGZpbHRlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidXNhY2RlY19hY2VfbHRwLmgiCisKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworI2RlZmluZSBVUF9TQU1QIDQKKyNkZWZpbmUgTF9JTlRFUlBPTDIgMTYKKyNkZWZpbmUgTF9TVUJGUiA2NAorCisjZGVmaW5lIEEyIEZMMkZYX1NHTCgyICogMC4xOGYpCisjZGVmaW5lIEIgRkwyRlhfU0dMKDAuNjRmKQorCitzdGF0aWMgY29uc3QgTE9ORyBQcmVkX2x0NF9pbnRlcjRfMltVUF9TQU1QXVtMX0lOVEVSUE9MMl0gPSB7CisgICAgeyhMT05HKTB4MDAwMEZGRkMsIChMT05HKTB4MDAwOEZGRkMsIChMT05HKTB4RkZFQjAwNEMsIChMT05HKTB4RkY1MDAxNEEsCisgICAgIChMT05HKTB4RkREOTAzNTEsIChMT05HKTB4RkIyQTA2Q0QsIChMT05HKTB4RjY5MjBENDYsIChMT05HKTB4RUJCNDJCMzUsCisgICAgIChMT05HKTB4NkQ5RUVGMzksIChMT05HKTB4MDYxOEZFMEYsIChMT05HKTB4RkZFMDAxMzEsIChMT05HKTB4RkU1NTAxQzUsCisgICAgIChMT05HKTB4RkU1RTAxNUQsIChMT05HKTB4RkVGNzAwQjYsIChMT05HKTB4RkY5MjAwMzcsIChMT05HKTB4RkZFQzAwMDN9LAorICAgIHsoTE9ORykweDAwMDJGRkYyLCAoTE9ORykweDAwMjZGRkJELCAoTE9ORykweDAwNURGRjk4LCAoTE9ORykweDAwNTVGRkVGLAorICAgICAoTE9ORykweEZGODkwMTVGLCAoTE9ORykweEZEM0EwNEU1LCAoTE9ORykweEY3RDkwREFBLCAoTE9ORykweEU2N0E1MEVFLAorICAgICAoTE9ORykweDUwRUVFNjdBLCAoTE9ORykweDBEQUFGN0Q5LCAoTE9ORykweDA0RTVGRDNBLCAoTE9ORykweDAxNUZGRjg5LAorICAgICAoTE9ORykweEZGRUYwMDU1LCAoTE9ORykweEZGOTgwMDVELCAoTE9ORykweEZGQkQwMDI2LCAoTE9ORykweEZGRjIwMDAyfSwKKyAgICB7KExPTkcpMHgwMDAzRkZFQywgKExPTkcpMHgwMDM3RkY5MiwgKExPTkcpMHgwMEI2RkVGNywgKExPTkcpMHgwMTVERkU1RSwKKyAgICAgKExPTkcpMHgwMUM1RkU1NSwgKExPTkcpMHgwMTMxRkZFMCwgKExPTkcpMHhGRTBGMDYxOCwgKExPTkcpMHhFRjM5NkQ5RSwKKyAgICAgKExPTkcpMHgyQjM1RUJCNCwgKExPTkcpMHgwRDQ2RjY5MiwgKExPTkcpMHgwNkNERkIyQSwgKExPTkcpMHgwMzUxRkREOSwKKyAgICAgKExPTkcpMHgwMTRBRkY1MCwgKExPTkcpMHgwMDRDRkZFQiwgKExPTkcpMHhGRkZDMDAwOCwgKExPTkcpMHhGRkZDMDAwMH0sCisgICAgeyhMT05HKTB4MDAwMkZGRjIsIChMT05HKTB4MDAyQkZGOUUsIChMT05HKTB4MDBCOUZFQ0UsIChMT05HKTB4MDFDRkZENzUsCisgICAgIChMT05HKTB4MDM1RUZCQzEsIChMT05HKTB4MDUyMUZBMEMsIChMT05HKTB4MDZBQUY4QzksIChMT05HKTB4MDc5MDc4NTIsCisgICAgIChMT05HKTB4MDc5MEY4QzksIChMT05HKTB4MDZBQUZBMEMsIChMT05HKTB4MDUyMUZCQzEsIChMT05HKTB4MDM1RUZENzUsCisgICAgIChMT05HKTB4MDFDRkZFQ0UsIChMT05HKTB4MDBCOUZGOUUsIChMT05HKTB4MDAyQkZGRjIsIChMT05HKTB4MDAwMjAwMDB9fTsKKwordm9pZCBQcmVkX2x0NChGSVhQX0RCTCBleGNbXSwgLyogaW4vb3V0OiBleGNpdGF0aW9uIGJ1ZmZlciAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgaW50IFQwLCAgICAgICAgIC8qIGlucHV0IDogaW50ZWdlciBwaXRjaCBsYWcgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIGludCBmcmFjICAgICAgICAvKiBpbnB1dCA6IGZyYWN0aW9uIG9mIGxhZyBpbiByYW5nZSAwLi4zICAqLworKSB7CisgIGludCBqOworICBGSVhQX0RCTCAqeDsKKyAgY29uc3QgTE9ORyAqaW50ZXJwb2w7CisgIEZJWFBfREJMIExfc3VtYiwgTF9zdW10OworCisgIHggPSAmZXhjWy1UMCAtIExfSU5URVJQT0wyICsgMV07CisKKyAgLyogcmVtYXAgZnJhYyBhbmQgeDoKKyAgICAgICAgICAgMCAtPiAzICAgeCAodW5jaGFuZ2VkKQorICAgICAgICAgICAxIC0+IDAgICB4LS0KKyAgICAgICAgICAgMiAtPiAxICAgeC0tCisgICAgICAgICAgIDMgLT4gMiAgIHgtLQorICAqLworCisgIGlmICgtLWZyYWMgPCAwKQorICAgIGZyYWMgKz0gVVBfU0FNUDsKKyAgZWxzZQorICAgIHgtLTsKKworICBqID0gTF9TVUJGUiArIDE7CisgIGRvIHsKKyAgICBMT05HIGZpbHQ7CisgICAgRklYUF9EQkwgeDAsIHgxOworICAgIEZJWFBfREJMICp4aSA9IHgrKzsKKyAgICBpbnRlcnBvbCA9IFByZWRfbHQ0X2ludGVyNF8yW2ZyYWNdOworICAgIGludCBpID0gMzsKKworICAgIGZpbHQgPSAqaW50ZXJwb2wrKzsKKyAgICB4MCA9ICp4aSsrOworICAgIHgxID0gKnhpKys7CisgICAgTF9zdW10ID0gZk11bHREaXYyKHgwLCAoRklYUF9TR0wpKChTSE9SVCkoZmlsdCA+PiAxNikpKTsKKyAgICBMX3N1bWIgPSBmTXVsdERpdjIoeDEsIChGSVhQX1NHTCkoKFNIT1JUKWZpbHQpKTsKKyAgICBkbyB7CisgICAgICBmaWx0ID0gKmludGVycG9sKys7CisgICAgICB4MCA9ICp4aSsrOworICAgICAgeDEgPSAqeGkrKzsKKyAgICAgIExfc3VtdCA9IGZNdWx0QWRkRGl2MihMX3N1bXQsIHgwLCAoRklYUF9TR0wpKChTSE9SVCkoZmlsdCA+PiAxNikpKTsKKyAgICAgIExfc3VtYiA9IGZNdWx0QWRkRGl2MihMX3N1bWIsIHgxLCAoRklYUF9TR0wpKChTSE9SVClmaWx0KSk7CisKKyAgICAgIGZpbHQgPSAqaW50ZXJwb2wrKzsKKyAgICAgIHgwID0gKnhpKys7CisgICAgICB4MSA9ICp4aSsrOworICAgICAgTF9zdW10ID0gZk11bHRBZGREaXYyKExfc3VtdCwgeDAsIChGSVhQX1NHTCkoKFNIT1JUKShmaWx0ID4+IDE2KSkpOworICAgICAgTF9zdW1iID0gZk11bHRBZGREaXYyKExfc3VtYiwgeDEsIChGSVhQX1NHTCkoKFNIT1JUKWZpbHQpKTsKKworICAgICAgZmlsdCA9ICppbnRlcnBvbCsrOworICAgICAgeDAgPSAqeGkrKzsKKyAgICAgIHgxID0gKnhpKys7CisgICAgICBMX3N1bXQgPSBmTXVsdEFkZERpdjIoTF9zdW10LCB4MCwgKEZJWFBfU0dMKSgoU0hPUlQpKGZpbHQgPj4gMTYpKSk7CisgICAgICBMX3N1bWIgPSBmTXVsdEFkZERpdjIoTF9zdW1iLCB4MSwgKEZJWFBfU0dMKSgoU0hPUlQpZmlsdCkpOworCisgICAgICBmaWx0ID0gKmludGVycG9sKys7CisgICAgICB4MCA9ICp4aSsrOworICAgICAgeDEgPSAqeGkrKzsKKyAgICAgIExfc3VtdCA9IGZNdWx0QWRkRGl2MihMX3N1bXQsIHgwLCAoRklYUF9TR0wpKChTSE9SVCkoZmlsdCA+PiAxNikpKTsKKyAgICAgIExfc3VtYiA9IGZNdWx0QWRkRGl2MihMX3N1bWIsIHgxLCAoRklYUF9TR0wpKChTSE9SVClmaWx0KSk7CisKKyAgICAgIGZpbHQgPSAqaW50ZXJwb2wrKzsKKyAgICAgIHgwID0gKnhpKys7CisgICAgICB4MSA9ICp4aSsrOworICAgICAgTF9zdW10ID0gZk11bHRBZGREaXYyKExfc3VtdCwgeDAsIChGSVhQX1NHTCkoKFNIT1JUKShmaWx0ID4+IDE2KSkpOworICAgICAgTF9zdW1iID0gZk11bHRBZGREaXYyKExfc3VtYiwgeDEsIChGSVhQX1NHTCkoKFNIT1JUKWZpbHQpKTsKKyAgICB9IHdoaWxlICgtLWkgIT0gMCk7CisKKyAgICBMX3N1bWIgPDw9IDE7CisgICAgTF9zdW1iID0gZkFkZFNhdHVyYXRlKExfc3VtdCA8PCAxLCBMX3N1bWIpOworICAgICpleGMrKyA9IExfc3VtYjsKKyAgfSB3aGlsZSAoLS1qICE9IDApOworICByZXR1cm47Cit9CisKK3ZvaWQgUHJlZF9sdDRfcG9zdGZpbHRlcihGSVhQX0RCTCBleGNbXSAvKiBpbi9vdXQ6IGV4Y2l0YXRpb24gYnVmZmVyICovCispIHsKKyAgLyoKKyAgZXhjW2ldICAgPSBBKmV4Y1tpLTFdICsgQipleGNbaV0gKyBBKmV4Y1tpKzFdCisgIGV4Y1tpKzFdID0gICAgICAgICAgICAgIEEqZXhjW2ldICsgQipleGNbaSsxXSArIEEqZXhjW2krMl0gOyBpID0gMDoyOjYyCisgICovCisgIGludCBpOworICBGSVhQX0RCTCBzdW0wLCBzdW0xLCBhX2V4YzAsIGFfZXhjMTsKKyAgYV9leGMwID0gZk11bHREaXYyKEEyLCBleGNbLTFdKTsKKyAgYV9leGMxID0gZk11bHREaXYyKEEyLCBleGNbMF0pOworCisgIC8qIEFSTTkyNjogMjIgY3ljbGVzL2l0ZXJhdGlvbiAqLworICBmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUjsgaSArPSAyKSB7CisgICAgc3VtMCA9IGFfZXhjMCArIGZNdWx0KEIsIGV4Y1tpXSk7CisgICAgc3VtMSA9IGFfZXhjMSArIGZNdWx0KEIsIGV4Y1tpICsgMV0pOworICAgIGFfZXhjMCA9IGZNdWx0RGl2MihBMiwgZXhjW2kgKyAxXSk7CisgICAgYV9leGMxID0gZk11bHREaXYyKEEyLCBleGNbaSArIDJdKTsKKyAgICBleGNbaV0gPSBzdW0wICsgYV9leGMwOworICAgIGV4Y1tpICsgMV0gPSBzdW0xICsgYV9leGMxOworICB9CisgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19hY2VfbHRwLmggYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfYWNlX2x0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMjhhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfYWNlX2x0cC5oCkBAIC0wLDAgKzEsMTI4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXR0aGlhcyBIaWxkZW5icmFuZAorCisgICBEZXNjcmlwdGlvbjogVVNBQyBBQ0VMUCBMVFAgZmlsdGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVVNBQ0RFQ19BQ0VfTFRQX0gKKyNkZWZpbmUgVVNBQ0RFQ19BQ0VfTFRQX0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworLyoqCisgKiBcYnJpZWYgQ29tcHV0ZSB0aGUgaW5pdGlhbCBhZGFwdGl2ZSBjb2RlYm9vayBleGNpdGF0aW9uIHYnKG4pIGJ5CisgKiBpbnRlcnBvbGF0aW5nIHRoZSBwYXN0IGV4Y2l0YXRpb24gdmVjdG9yIHUnKG4pLgorICogXHBhcmFtIGV4YyBwb2ludHMgdG8gYWRhcHRpdmUgY29kZWJvb2sgb2YgY3VycmVudCBzdWJmcmFtZSAoaW5wdXQvb3V0cHV0KQorICogXHBhcmFtIFQwIGludGVnZXIgcGFydCBvZiBkZWNvZGVkIHBpdGNoIGxhZyAoaW5wdXQpCisgKiBccGFyYW0gZnJhYyBmcmFjdGlvbmFsIHBhcnQgb2YgZGVjb2RlZCBwaXRjaCBsYWcgKDAuLjMpIChpbnB1dCkKKyAqLwordm9pZCBQcmVkX2x0NChGSVhQX0RCTCBleGNbXSwgLyogaW4vb3V0OiBleGNpdGF0aW9uIGJ1ZmZlciAqLworICAgICAgICAgICAgICBpbnQgVDAsICAgICAgICAgLyogaW5wdXQgOiBpbnRlZ2VyIHBpdGNoIGxhZyAqLworICAgICAgICAgICAgICBpbnQgZnJhYyAgICAgICAgLyogaW5wdXQgOiBmcmFjdGlvbiBvZiBsYWcgICAqLworKTsKKworLyoqCisgKiBcYnJpZWYgQ29tcHV0ZSB0aGUgYWRhcHRpdmUgY29kZWJvb2sgZXhjaXRhdGlvbiB2KG4pIGluIGNhc2Ugb2YKKyAqIGx0cF9maWx0ZXJpbmdfZmxhZyA9PSAwLgorICogXHBhcmFtIGV4YyBwb2ludHMgdG8gYWRhcHRpdmUgY29kZWJvb2sgb2YgY3VycmVudCBzdWJmcmFtZSAoaW5wdXQvb3V0cHV0KQorICovCit2b2lkIFByZWRfbHQ0X3Bvc3RmaWx0ZXIoRklYUF9EQkwgZXhjW10gLyogaW4vb3V0OiBleGNpdGF0aW9uIGJ1ZmZlciAqLworKTsKKworI2VuZGlmIC8qIFVTQUNERUNfQUNFX0xUUF9IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL3VzYWNkZWNfYWNlbHAuY3BwIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX2FjZWxwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjFmNDg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX2FjZWxwLmNwcApAQCAtMCwwICsxLDEyOTYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hdHRoaWFzIEhpbGRlbmJyYW5kCisKKyAgIERlc2NyaXB0aW9uOiBVU0FDIEFDRUxQIGZyYW1lIGRlY29kZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzYWNkZWNfYWNlbHAuaCIKKworI2luY2x1ZGUgInVzYWNkZWNfYWNlX2Q0dDY0LmgiCisjaW5jbHVkZSAidXNhY2RlY19hY2VfbHRwLmgiCisjaW5jbHVkZSAidXNhY2RlY19yb20uaCIKKyNpbmNsdWRlICJ1c2FjZGVjX2xwYy5oIgorI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCisKKyNkZWZpbmUgUElUX0ZSMl8xMms4IDEyOCAvKiBNaW5pbXVtIHBpdGNoIGxhZyB3aXRoIHJlc29sdXRpb24gMS8yICAgICAgKi8KKyNkZWZpbmUgUElUX0ZSMV8xMms4IDE2MCAvKiBNaW5pbXVtIHBpdGNoIGxhZyB3aXRoIHJlc29sdXRpb24gMSAgICAgICAgKi8KKyNkZWZpbmUgVElMVF9DT0RFMiBcCisgIEZMMkZYQ09OU1RfU0dMKDAuM2YgKiAyLjBmKSAvKiBBQ0VMUCBjb2RlIHByZS1lbXBoYXNpcyBmYWN0b3IgKCAqMiApICAgICAgKi8KKyNkZWZpbmUgUElUX1NIQVJQIFwKKyAgRkwyRlhDT05TVF9TR0woMC44NWYpIC8qIHBpdGNoIHNoYXJwZW5pbmcgZmFjdG9yICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQUkVFTVBIX0ZBQyBcCisgIEZMMkZYQ09OU1RfU0dMKDAuNjhmKSAvKiBBQ0VMUCBzeW50aCBwcmUtZW1waGFzaXMgZmFjdG9yICAgICAgICAgICAgKi8KKworI2RlZmluZSBBQ0VMUF9IRUFEUk9PTSAxCisjZGVmaW5lIEFDRUxQX09VVFNDQUxFIChNRENUX09VVF9IRUFEUk9PTSAtIEFDRUxQX0hFQURST09NKQorCisvKioKKyAqIFxicmllZiBDYWxjdWxhdGUgcHJlLWVtcGhhc2lzICgxIC0gbXUgel4tMSkgb24gaW5wdXQgc2lnbmFsLgorICogXHBhcmFtW2luXSBpbiBwb2ludGVyIHRvIGlucHV0IHNpZ25hbDsgaW5bLTFdIGlzIGFsc28gbmVlZGVkLgorICogXHBhcmFtW291dF0gb3V0IHBvaW50ZXIgdG8gb3V0cHV0IHNpZ25hbC4KKyAqIFxwYXJhbVtpbl0gTCBsZW5ndGggb2YgZmlsdGVyaW5nLgorICovCisvKiBzdGF0aWMgKi8KK3ZvaWQgRV9VVElMX3ByZWVtcGgoY29uc3QgRklYUF9EQkwgKmluLCBGSVhQX0RCTCAqb3V0LCBJTlQgTCkgeworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgTDsgaSsrKSB7CisgICAgb3V0W2ldID0gaW5baV0gLSBmTXVsdChQUkVFTVBIX0ZBQywgaW5baSAtIDFdKTsKKyAgfQorCisgIHJldHVybjsKK30KKworLyoqCisgKiBcYnJpZWYgQ2FsY3VsYXRlIGRlLWVtcGhhc2lzIDEvKDEgLSBUSUxUX0NPREUgel4tMSkgb24gaW5ub3ZhdGl2ZSBjb2RlYm9vaworICogdmVjdG9yLgorICogXHBhcmFtW2luLG91dF0geCBpbm5vdmF0aXZlIGNvZGVib29rIHZlY3Rvci4KKyAqLworc3RhdGljIHZvaWQgUHJlZW1waF9jb2RlKAorICAgIEZJWFBfQ09EIHhbXSAvKiAoaS9vKSAgIDogaW5wdXQgc2lnbmFsIG92ZXJ3cml0dGVuIGJ5IHRoZSBvdXRwdXQgKi8KKykgeworICBpbnQgaTsKKyAgRklYUF9EQkwgTF90bXA7CisKKyAgLyogQVJNOTI2OiAxMiBjeWNsZXMgcGVyIHNhbXBsZSAqLworICBmb3IgKGkgPSBMX1NVQkZSIC0gMTsgaSA+IDA7IGktLSkgeworICAgIExfdG1wID0gRlhfQ09EMkZYX0RCTCh4W2ldKTsKKyAgICBMX3RtcCAtPSBmTXVsdERpdjIoeFtpIC0gMV0sIFRJTFRfQ09ERTIpOworICAgIHhbaV0gPSBGWF9EQkwyRlhfQ09EKExfdG1wKTsKKyAgfQorfQorCisvKioKKyAqIFxicmllZiBBcHBseSBwaXRjaCBzaGFycGVuZXIgdG8gdGhlIGlubm92YXRpdmUgY29kZWJvb2sgdmVjdG9yLgorICogXHBhcmFtW2luLG91dF0geCBpbm5vdmF0aXZlIGNvZGVib29rIHZlY3Rvci4KKyAqIFxwYXJhbVtpbl0gcGl0X2xhZyBkZWNvZGVkIHBpdGNoIGxhZy4KKyAqLworc3RhdGljIHZvaWQgUGl0X3NocnAoCisgICAgRklYUF9DT0QgeFtdLCAvKiBpbi9vdXQ6IGltcHVsc2UgcmVzcG9uc2UgKG9yIGFsZ2VicmFpYyBjb2RlKSAqLworICAgIGludCBwaXRfbGFnICAgLyogaW5wdXQgOiBwaXRjaCBsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKykgeworICBpbnQgaTsKKyAgRklYUF9EQkwgTF90bXA7CisKKyAgZm9yIChpID0gcGl0X2xhZzsgaSA8IExfU1VCRlI7IGkrKykgeworICAgIExfdG1wID0gRlhfQ09EMkZYX0RCTCh4W2ldKTsKKyAgICBMX3RtcCArPSBmTXVsdCh4W2kgLSBwaXRfbGFnXSwgUElUX1NIQVJQKTsKKyAgICB4W2ldID0gRlhfREJMMkZYX0NPRChMX3RtcCk7CisgIH0KKworICByZXR1cm47Cit9CisKKyAgLyoqCisgICAqIFxicmllZiBDYWxjdWxhdGUgUXVhbnRpemVkIGNvZGVib29rIGdhaW4sIFF1YW50aXplZCBwaXRjaCBnYWluIGFuZCB1bmJpYXNlZAorICAgKiAgICAgICAgSW5ub3ZhdGl2ZSBjb2RlIHZlY3RvciBlbmVyZ3kuCisgICAqIFxwYXJhbVtpbl0gaW5kZXggaW5kZXggb2YgcXVhbnRpemVyLgorICAgKiBccGFyYW1baW5dIGNvZGUgaW5ub3ZhdGl2ZSBjb2RlIHZlY3RvciB3aXRoIGV4cG9uZW50ID0gU0ZfQ09ERS4KKyAgICogXHBhcmFtW291dF0gZ2Fpbl9waXQgUXVhbnRpemVkIHBpdGNoIGdhaW4gZ19wIHdpdGggZXhwb25lbnQgPSBTRl9HQUlOX1AuCisgICAqIFxwYXJhbVtvdXRdIGdhaW5fY29kZSBRdWFudGl6ZWQgY29kZWJvb2sgZ2FpbiBnX2MuCisgICAqIFxwYXJhbVtpbl0gbWVhbl9lbmVyIG1lYW5fZW5lciBkZWZpbmVkIGluIG9wZW4tbG9vcCAoMiBiaXRzKSwgZXhwb25lbnQgPSA3LgorICAgKiBccGFyYW1bb3V0XSBFX2NvZGUgdW5iaWFzZWQgaW5ub3ZhdGl2ZSBjb2RlIHZlY3RvciBlbmVyZ3kuCisgICAqIFxwYXJhbVtvdXRdIEVfY29kZV9lIGV4cG9uZW50IG9mIHVuYmlhc2VkIGlubm92YXRpdmUgY29kZSB2ZWN0b3IgZW5lcmd5LgorICAgKi8KKworI2RlZmluZSBTRl9NRUFOX0VORVJfTEcxMCA5CisKKy8qIHBvdygxMC4wLCB7MTgsIDMwLCA0MiwgNTR9LzIwLjApIC8oZmxvYXQpKDE8PFNGX01FQU5fRU5FUl9MRzEwKSAqLworc3RhdGljIGNvbnN0IEZJWFBfREJMIHBvd18xMF9tZWFuX2VuZXJneVs0XSA9IHsweDAxZmM1ZWJkLCAweDA3ZTdkYjkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFmNzkxZjY1LCAweDdkNGJmYmEzfTsKKworc3RhdGljIHZvaWQgRF9nYWluMl9wbHVzKGludCBpbmRleCwgRklYUF9DT0QgY29kZVtdLCBGSVhQX1NHTCAqZ2Fpbl9waXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmdhaW5fY29kZSwgaW50IG1lYW5fZW5lcl9iaXRzLCBpbnQgYmZpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICpwYXN0X2dwaXQsIEZJWFBfREJMICpwYXN0X2djb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwRW5lcl9jb2RlLCBpbnQgKnBFbmVyX2NvZGVfZSkgeworICBGSVhQX0RCTCBMdG1wOworICBGSVhQX0RCTCBnY29kZTAsIGdjb2RlX2lub3Y7CisgIElOVCBnY29kZTBfZSwgZ2NvZGVfaW5vdl9lOworICBpbnQgaTsKKworICBGSVhQX0RCTCBlbmVyX2NvZGU7CisgIElOVCBlbmVyX2NvZGVfZTsKKworICAvKiBlbmVyX2NvZGUgPSBzdW0oY29kZVtdXjIpICovCisgIGVuZXJfY29kZSA9IEZJWFBfREJMKDApOworICBmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUjsgaSsrKSB7CisgICAgZW5lcl9jb2RlICs9IGZQb3cyRGl2Mihjb2RlW2ldKTsKKyAgfQorCisgIGVuZXJfY29kZV9lID0gZk1heChmTm9ybShlbmVyX2NvZGUpIC0gMSwgMCk7CisgIGVuZXJfY29kZSA8PD0gZW5lcl9jb2RlX2U7CisgIGVuZXJfY29kZV9lID0gMiAqIFNGX0NPREUgKyAxIC0gZW5lcl9jb2RlX2U7CisKKyAgLyogZXhwb3J0IGVuZXJneSBvZiBjb2RlIGZvciBjYWxjX3BlcmlvZF9mYWN0b3IoKSAqLworICAqcEVuZXJfY29kZSA9IGVuZXJfY29kZTsKKyAgKnBFbmVyX2NvZGVfZSA9IGVuZXJfY29kZV9lOworCisgIGVuZXJfY29kZSArPSBzY2FsZVZhbHVlKEZMMkZYQ09OU1RfREJMKDAuMDFmKSwgLWVuZXJfY29kZV9lKTsKKworICAvKiBlbmVyX2NvZGUgKj0gMS9MX1NVQkZSLCBhbmQgbWFrZSBleHBvbmVudCBldmVuIChiZWNhdXNlIG9mIHNxdWFyZSByb290CisgICAqIGJlbG93KS4gKi8KKyAgaWYgKGVuZXJfY29kZV9lICYgMSkgeworICAgIGVuZXJfY29kZV9lIC09IDU7CisgICAgZW5lcl9jb2RlID4+PSAxOworICB9IGVsc2UgeworICAgIGVuZXJfY29kZV9lIC09IDY7CisgIH0KKyAgZ2NvZGVfaW5vdiA9IGludlNxcnROb3JtMihlbmVyX2NvZGUsICZnY29kZTBfZSk7CisgIGdjb2RlX2lub3ZfZSA9IGdjb2RlMF9lIC0gKGVuZXJfY29kZV9lID4+IDEpOworCisgIGlmIChiZmkpIHsKKyAgICBGSVhQX0RCTCB0Z2NvZGU7CisgICAgRklYUF9TR0wgdGdwaXQ7CisKKyAgICB0Z3BpdCA9ICpwYXN0X2dwaXQ7CisKKyAgICBpZiAodGdwaXQgPiBGTDJGWENPTlNUX1NHTCgwLjk1ZiAvICgxIDw8IFNGX0dBSU5fUCkpKSB7CisgICAgICB0Z3BpdCA9IEZMMkZYQ09OU1RfU0dMKDAuOTVmIC8gKDEgPDwgU0ZfR0FJTl9QKSk7CisgICAgfSBlbHNlIGlmICh0Z3BpdCA8IEZMMkZYQ09OU1RfU0dMKDAuNWYgLyAoMSA8PCBTRl9HQUlOX1ApKSkgeworICAgICAgdGdwaXQgPSBGTDJGWENPTlNUX1NHTCgwLjVmIC8gKDEgPDwgU0ZfR0FJTl9QKSk7CisgICAgfQorICAgICpnYWluX3BpdCA9IHRncGl0OworICAgIHRncGl0ID0gRlhfREJMMkZYX1NHTChmTXVsdCh0Z3BpdCwgRkwyRlhDT05TVF9EQkwoMC45NWYpKSk7CisgICAgKnBhc3RfZ3BpdCA9IHRncGl0OworCisgICAgdGdwaXQgPSBGTDJGWENPTlNUX1NHTCgxLjRmIC8gKDEgPDwgU0ZfR0FJTl9QKSkgLSB0Z3BpdDsKKyAgICB0Z2NvZGUgPSBmTXVsdCgqcGFzdF9nY29kZSwgdGdwaXQpIDw8IFNGX0dBSU5fUDsKKyAgICAqZ2Fpbl9jb2RlID0gc2NhbGVWYWx1ZShmTXVsdCh0Z2NvZGUsIGdjb2RlX2lub3YpLCBnY29kZV9pbm92X2UpOworICAgICpwYXN0X2djb2RlID0gdGdjb2RlOworCisgICAgcmV0dXJuOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLSBEZWNvZGUgZ2FpbnMgLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyoKKyAgIGdjb2RlMCA9IHBvdygxMC4wLCAoZmxvYXQpbWVhbl9lbmVyLzIwLjApOworICAgZ2NvZGUwID0gZ2NvZGUwIC8gc3FydChlbmVyX2NvZGUvTF9TVUJGUik7CisgICAqLworICBnY29kZTAgPSBwb3dfMTBfbWVhbl9lbmVyZ3lbbWVhbl9lbmVyX2JpdHNdOworICBnY29kZTAgPSBmTXVsdERpdjIoZ2NvZGUwLCBnY29kZV9pbm92KTsKKyAgZ2NvZGUwX2UgPSBnY29kZTBfZSArIFNGX01FQU5fRU5FUl9MRzEwIC0gKGVuZXJfY29kZV9lID4+IDEpICsgMTsKKworICBpID0gaW5kZXggPDwgMTsKKyAgKmdhaW5fcGl0ID0gdF9xdWFfZ2FpbjdiW2ldOyAvKiBhZGFwdGl2ZSBjb2RlYm9vayBnYWluICovCisgIC8qIHRfcXVhX2dhaW5baW5kMnAxXSA6IGZpeGVkIGNvZGVib29rIGdhaW4gY29ycmVjdGlvbiBmYWN0b3IgKi8KKyAgTHRtcCA9IGZNdWx0KHRfcXVhX2dhaW43YltpICsgMV0sIGdjb2RlMCk7CisgICpnYWluX2NvZGUgPSBzY2FsZVZhbHVlKEx0bXAsIGdjb2RlMF9lIC0gU0ZfR0FJTl9DICsgU0ZfUVVBX0dBSU43Qik7CisKKyAgLyogdXBkYXRlIGJhZCBmcmFtZSBoYW5kbGVyICovCisgICpwYXN0X2dwaXQgPSAqZ2Fpbl9waXQ7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHBhc3RfZ2NvZGUgID0gZ2Fpbl9jb2RlL2djb2RlX2lub3YKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgeworICAgIEZJWFBfREJMIGdjb2RlX207CisgICAgSU5UIGdjb2RlX2U7CisKKyAgICBnY29kZV9tID0gZkRpdk5vcm1IaWdoUHJlYyhMdG1wLCBnY29kZV9pbm92LCAmZ2NvZGVfZSk7CisgICAgZ2NvZGVfZSArPSAoZ2NvZGUwX2UgLSBTRl9HQUlOX0MgKyBTRl9RVUFfR0FJTjdCKSAtIChnY29kZV9pbm92X2UpOworICAgICpwYXN0X2djb2RlID0gc2NhbGVWYWx1ZShnY29kZV9tLCBnY29kZV9lKTsKKyAgfQorfQorCisvKioKKyAqIFxicmllZiBDYWxjdWxhdGUgcGVyaW9kL3ZvaWNpbmcgZmFjdG9yIHJfdgorICogXHBhcmFtW2luXSBleGMgcGl0Y2ggZXhjaXRhdGlvbi4KKyAqIFxwYXJhbVtpbl0gZ2Fpbl9waXQgZ2FpbiBvZiBwaXRjaCBnX3AuCisgKiBccGFyYW1baW5dIGdhaW5fY29kZSBnYWluIG9mIGNvZGUgZ19jLgorICogXHBhcmFtW2luXSBnYWluX2NvZGVfZSBleHBvbmVudCBvZiBnYWluIG9mIGNvZGUuCisgKiBccGFyYW1baW5dIGVuZXJfY29kZSB1bmJpYXNlZCBpbm5vdmF0aXZlIGNvZGUgdmVjdG9yIGVuZXJneS4KKyAqIFxwYXJhbVtpbl0gZW5lcl9jb2RlX2UgZXhwb25lbnQgb2YgdW5iaWFzZWQgaW5ub3ZhdGl2ZSBjb2RlIHZlY3RvciBlbmVyZ3kuCisgKiBccmV0dXJuIHBlcmlvZC92b2ljZSBmYWN0b3Igcl92ICgtMT11bnZvaWNlZCB0byAxPXZvaWNlZCksIGV4cG9uZW50IFNGX1BGQUMuCisgKi8KK3N0YXRpYyBGSVhQX0RCTCBjYWxjX3BlcmlvZF9mYWN0b3IoRklYUF9EQkwgZXhjW10sIEZJWFBfU0dMIGdhaW5fcGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBnYWluX2NvZGUsIEZJWFBfREJMIGVuZXJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZXJfY29kZV9lKSB7CisgIGludCBlbmVyX2V4Y19lLCBMX3RtcF9lLCBzID0gMDsKKyAgRklYUF9EQkwgZW5lcl9leGMsIExfdG1wOworICBGSVhQX0RCTCBwZXJpb2RfZmFjOworCisgIC8qIGVuZXJneSBvZiBwaXRjaCBleGNpdGF0aW9uICovCisgIGVuZXJfZXhjID0gKEZJWFBfREJMKTA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgTF9TVUJGUjsgaSsrKSB7CisgICAgZW5lcl9leGMgKz0gZlBvdzJEaXYyKGV4Y1tpXSkgPj4gczsKKyAgICBpZiAoZW5lcl9leGMgPiBGTDJGWENPTlNUX0RCTCgwLjVmKSkgeworICAgICAgZW5lcl9leGMgPj49IDE7CisgICAgICBzKys7CisgICAgfQorICB9CisKKyAgZW5lcl9leGNfZSA9IGZOb3JtKGVuZXJfZXhjKTsKKyAgZW5lcl9leGMgPSBmTXVsdChlbmVyX2V4YyA8PCBlbmVyX2V4Y19lLCBmUG93MihnYWluX3BpdCkpOworICBpZiAoZW5lcl9leGMgIT0gKEZJWFBfREJMKTApIHsKKyAgICBlbmVyX2V4Y19lID0gMiAqIFNGX0VYQyArIDEgKyAyICogU0ZfR0FJTl9QIC0gZW5lcl9leGNfZSArIHM7CisgIH0gZWxzZSB7CisgICAgZW5lcl9leGNfZSA9IDA7CisgIH0KKworICAvKiBlbmVyZ3kgb2YgaW5ub3ZhdGl2ZSBjb2RlIGV4Y2l0YXRpb24gKi8KKyAgLyogTF90bXAgPSBlbmVyX2NvZGUgKiBnYWluX2NvZGUqZ2Fpbl9jb2RlOyAqLworICBMX3RtcF9lID0gZk5vcm0oZ2Fpbl9jb2RlKTsKKyAgTF90bXAgPSBmUG93MihnYWluX2NvZGUgPDwgTF90bXBfZSk7CisgIExfdG1wID0gZk11bHQoZW5lcl9jb2RlLCBMX3RtcCk7CisgIExfdG1wX2UgPSAyICogU0ZfR0FJTl9DICsgZW5lcl9jb2RlX2UgLSAyICogTF90bXBfZTsKKworICAvKiBGaW5kIGNvbW1vbiBleHBvbmVudCAqLworICB7CisgICAgRklYUF9EQkwgbnVtLCBkZW47CisgICAgaW50IGV4cF9kaWZmOworCisgICAgZXhwX2RpZmYgPSBlbmVyX2V4Y19lIC0gTF90bXBfZTsKKyAgICBpZiAoZXhwX2RpZmYgPj0gMCkgeworICAgICAgZW5lcl9leGMgPj49IDE7CisgICAgICBpZiAoZXhwX2RpZmYgPD0gREZSQUNUX0JJVFMgLSAyKSB7CisgICAgICAgIExfdG1wID4+PSBleHBfZGlmZiArIDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBMX3RtcCA9IChGSVhQX0RCTCkwOworICAgICAgfQorICAgICAgZGVuID0gZW5lcl9leGMgKyBMX3RtcDsKKyAgICAgIGlmIChlbmVyX2V4Y19lIDwgREZSQUNUX0JJVFMgLSAxKSB7CisgICAgICAgIGRlbiArPSBzY2FsZVZhbHVlKEZMMkZYQ09OU1RfREJMKDAuMDFmKSwgLWVuZXJfZXhjX2UgLSAxKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGV4cF9kaWZmID49IC0oREZSQUNUX0JJVFMgLSAyKSkgeworICAgICAgICBlbmVyX2V4YyA+Pj0gMSAtIGV4cF9kaWZmOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZW5lcl9leGMgPSAoRklYUF9EQkwpMDsKKyAgICAgIH0KKyAgICAgIExfdG1wID4+PSAxOworICAgICAgZGVuID0gZW5lcl9leGMgKyBMX3RtcDsKKyAgICAgIGlmIChMX3RtcF9lIDwgREZSQUNUX0JJVFMgLSAxKSB7CisgICAgICAgIGRlbiArPSBzY2FsZVZhbHVlKEZMMkZYQ09OU1RfREJMKDAuMDFmKSwgLUxfdG1wX2UgLSAxKTsKKyAgICAgIH0KKyAgICB9CisgICAgbnVtID0gKGVuZXJfZXhjIC0gTF90bXApOworICAgIG51bSA+Pj0gU0ZfUEZBQzsKKworICAgIGlmIChkZW4gPiAoRklYUF9EQkwpMCkgeworICAgICAgaWYgKGVuZXJfZXhjID4gTF90bXApIHsKKyAgICAgICAgcGVyaW9kX2ZhYyA9IHNjaHVyX2RpdihudW0sIGRlbiwgMTYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGVyaW9kX2ZhYyA9IC1zY2h1cl9kaXYoLW51bSwgZGVuLCAxNik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHBlcmlvZF9mYWMgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKyAgICB9CisgIH0KKworICAvKiBleHBvbmVudCA9IFNGX1BGQUMgKi8KKyAgcmV0dXJuIHBlcmlvZF9mYWM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogbm9pc2UgZW5oYW5jZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiB+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIC0gRW5oYW5jZSBleGNpdGF0aW9uIG9uIG5vaXNlLiAobW9kaWZ5IGdhaW4gb2YgY29kZSkgICAgICAgKgorICogICBJZiBzaWduYWwgaXMgbm9pc3kgYW5kIExQQyBmaWx0ZXIgaXMgc3RhYmxlLCBtb3ZlIGdhaW4gICAqCisgKiAgIG9mIGNvZGUgMS41IGRCIHRvd2FyZCBnYWluIG9mIGNvZGUgdGhyZXNob2xkLiAgICAgICAgICAgICoKKyAqICAgVGhpcyBkZWNyZWFzZSBieSAzIGRCIG5vaXNlIGVuZXJneSB2YXJpYXRpb24uICAgICAgICAgICAgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqCisgKiBcYnJpZWYgRW5oYW5jZSBleGNpdGF0aW9uIG9uIG5vaXNlLiAobW9kaWZ5IGdhaW4gb2YgY29kZSkKKyAqIFxwYXJhbVtpbl0gZ2Fpbl9jb2RlIFF1YW50aXplZCBjb2RlYm9vayBnYWluIGdfYywgZXhwb25lbnQgPSBTRl9HQUlOX0MuCisgKiBccGFyYW1baW5dIHBlcmlvZF9mYWMgcGVyaW9kaWNpdHkgZmFjdG9yLCBleHBvbmVudCA9IFNGX1BGQUMuCisgKiBccGFyYW1baW5dIHN0YWJfZmFjIHN0YWJpbGl0eSBmYWN0b3IsIGV4cG9uZW50ID0gU0ZfU1RBQi4KKyAqIFxwYXJhbVtpbixvdXRdIHBfZ2NfdGhyZXNob2xkIG1vZGlmaWVkIGdhaW4gb2YgcHJldmlvdXMgc3ViZnJhbWUuCisgKiBccmV0dXJuIGdhaW5fY29kZSBzbW9vdGhlZCBnYWluIG9mIGNvZGUgZ19zYywgZXhwb25lbnQgPSBTRl9HQUlOX0MuCisgKi8KK3N0YXRpYyBGSVhQX0RCTAorbm9pc2VfZW5oYW5jZXIoLyogKG8pIDogc21vb3RoZWQgZ2FpbiBnX3NjICAgICAgICAgICAgICAgICAgICAgU0ZfR0FJTl9DICovCisgICAgICAgICAgICAgICBGSVhQX0RCTCBnYWluX2NvZGUsIC8qIChpKSA6IFF1YW50aXplZCBjb2RlYm9vayBnYWluIFNGX0dBSU5fQyAqLworICAgICAgICAgICAgICAgRklYUF9EQkwgcGVyaW9kX2ZhYywgLyogKGkpIDogcGVyaW9kaWNpdHkgZmFjdG9yICgtMT11bnZvaWNlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT12b2ljZWQpLCBTRl9QRkFDICovCisgICAgICAgICAgICAgICBGSVhQX1NHTCBzdGFiX2ZhYywgICAvKiAoaSkgOiBzdGFiaWxpdHkgZmFjdG9yICgwIDw9IC4uLiA8IDEuMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNGX1NUQUIgICAqLworICAgICAgICAgICAgICAgRklYUF9EQkwKKyAgICAgICAgICAgICAgICAgICAqcF9nY190aHJlc2hvbGQpIC8qIChpbyk6IGdhaW4gb2YgY29kZSB0aHJlc2hvbGQgU0ZfR0FJTl9DICovCit7CisgIEZJWFBfREJMIGZhYywgTF90bXAsIGdjX3RocmVzOworCisgIGdjX3RocmVzID0gKnBfZ2NfdGhyZXNob2xkOworCisgIExfdG1wID0gZ2Fpbl9jb2RlOworICBpZiAoTF90bXAgPCBnY190aHJlcykgeworICAgIExfdG1wICs9IGZNdWx0RGl2MihnYWluX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfU0dMKDIuMCAqIDAuMTlmKSk7IC8qICsxLjVkQiA9PiAqKDEuMCswLjE5KSAqLworICAgIGlmIChMX3RtcCA+IGdjX3RocmVzKSB7CisgICAgICBMX3RtcCA9IGdjX3RocmVzOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBMX3RtcCA9IGZNdWx0KGdhaW5fY29kZSwKKyAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfU0dMKDEuMGYgLyAxLjE5ZikpOyAvKiAtMS41ZEIgPT4gKjEwXigtMS41LzIwKSAqLworICAgIGlmIChMX3RtcCA8IGdjX3RocmVzKSB7CisgICAgICBMX3RtcCA9IGdjX3RocmVzOworICAgIH0KKyAgfQorICAqcF9nY190aHJlc2hvbGQgPSBMX3RtcDsKKworICAvKiB2b2ljaW5nIGZhY3RvciAgICAgbGFtYmRhID0gMC41KigxLXBlcmlvZF9mYWMpICovCisgIC8qIGdhaW4gc21vb3RoaW5nIGZhY3RvciBTX20gPSBsYW1iZGEqc3RhYl9mYWMgICg9ZmFjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMC41KHN0YWJfZmFjIC0gc3RhYl9mYWMgKiBwZXJpb2RfZmFjKSAqLworICBmYWMgPSAoRlhfU0dMMkZYX0RCTChzdGFiX2ZhYykgPj4gKFNGX1BGQUMgKyAxKSkgLQorICAgICAgICBmTXVsdERpdjIoc3RhYl9mYWMsIHBlcmlvZF9mYWMpOworICAvKiBmYWNfZSA9IFNGX1BGQUMgKyBTRl9TVEFCICovCisgIEZES19BU1NFUlQoZmFjID49IChGSVhQX0RCTCkwKTsKKworICAvKiBnYWluX2NvZGUgPSAoZmxvYXQpKChmYWMqdG1wKSArICgoMS4wLWZhYykqZ2Fpbl9jb2RlKSk7ICovCisgIGdhaW5fY29kZSA9IGZNdWx0KGZhYywgTF90bXApIC0KKyAgICAgICAgICAgICAgZk11bHQoRkwyRlhDT05TVF9EQkwoLTEuMGYgLyAoMSA8PCAoU0ZfUEZBQyArIFNGX1NUQUIpKSkgKyBmYWMsCisgICAgICAgICAgICAgICAgICAgIGdhaW5fY29kZSk7CisgIGdhaW5fY29kZSA8PD0gKFNGX1BGQUMgKyBTRl9TVEFCKTsKKworICByZXR1cm4gZ2Fpbl9jb2RlOworfQorCisvKioKKyAqIFxicmllZiBVcGRhdGUgYWRhcHRpdmUgY29kZWJvb2sgdScobikgKGV4YykKKyAqICAgICAgICBFbmhhbmNlIHBpdGNoIG9mIGMobikgYW5kIGJ1aWxkIHBvc3QtcHJvY2Vzc2VkIGV4Y2l0YXRpb24gdShuKSAoZXhjMikKKyAqIFxwYXJhbVtpbl0gY29kZSBpbm5vdmF0aXZlIGNvZGV2ZWN0b3IgYyhuKSwgZXhwb25lbnQgPSBTRl9DT0RFLgorICogXHBhcmFtW2luLG91dF0gZXhjIGZpbHRlcmVkIGFkYXB0aXZlIGNvZGVib29rIHYobiksIGV4cG9uZW50ID0gU0ZfRVhDLgorICogXHBhcmFtW2luXSBnYWluX3BpdCBhZGFwdGl2ZSBjb2RlYm9vayBnYWluLCBleHBvbmVudCA9IFNGX0dBSU5fUC4KKyAqIFxwYXJhbVtpbl0gZ2Fpbl9jb2RlIGlubm92YXRpdmUgY29kZWJvb2sgZ2FpbiBnX2MsIGV4cG9uZW50ID0gU0ZfR0FJTl9DLgorICogXHBhcmFtW2luXSBnYWluX2NvZGVfc21vb3RoZWQgc21vb3RoZWQgaW5ub3YuIGNvZGVib29rIGdhaW4gZ19zYywgZXhwb25lbnQgPQorICogU0ZfR0FJTl9DLgorICogXHBhcmFtW2luXSBwZXJpb2RfZmFjIHBlcmlvZGljaXR5IGZhY3RvciByX3YsIGV4cG9uZW50ID0gU0ZfUEZBQy4KKyAqIFxwYXJhbVtvdXRdIGV4YzIgcG9zdC1wcm9jZXNzZWQgZXhjaXRhdGlvbiB1KG4pLCBleHBvbmVudCA9IFNGX0VYQy4KKyAqLwordm9pZCBCdWlsZEFkYXB0aXZlRXhjaXRhdGlvbigKKyAgICBGSVhQX0NPRCBjb2RlW10sICAgIC8qIChpKSA6IGFsZ2VicmFpYyBjb2RldmVjdG9yIGMobikgICAgICAgICAgICAgUTkgICovCisgICAgRklYUF9EQkwgZXhjW10sICAgICAvKiAoaW8pOiBmaWx0ZXJlZCBhZGFwdGl2ZSBjb2RlYm9vayB2KG4pICAgICAgIFExNSAqLworICAgIEZJWFBfU0dMIGdhaW5fcGl0LCAgLyogKGkpIDogYWRhcHRpdmUgY29kZWJvb2sgZ2FpbiBnX3AgICAgICAgICAgICBRMTQgKi8KKyAgICBGSVhQX0RCTCBnYWluX2NvZGUsIC8qIChpKSA6IGlubm92YXRpdmUgY29kZWJvb2sgZ2FpbiBnX2MgICAgICAgICAgUTE2ICovCisgICAgRklYUF9EQkwgZ2Fpbl9jb2RlX3Ntb290aGVkLCAvKiAoaSkgOiBzbW9vdGhlZCBpbm5vdi4gY29kZWJvb2sgZ2FpbiBnX3NjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRMTYgKi8KKyAgICBGSVhQX0RCTCBwZXJpb2RfZmFjLCAvKiAoaSkgOiBwZXJpb2RpY2l0eSBmYWN0b3Igcl92ICAgICAgICAgICAgICAgIFExNSAqLworICAgIEZJWFBfREJMIGV4YzJbXSAgICAgIC8qIChvKSA6IHBvc3QtcHJvY2Vzc2VkIGV4Y2l0YXRpb24gdShuKSAgICAgICAgUTE1ICovCispIHsKKy8qIE5vdGU6IGNvZGVbTF9TVUJGUl0gYW5kIGV4YzJbTF9TVUJGUl0gc2hhcmUgdGhlIHNhbWUgbWVtb3J5IQorICAgICAgICAgSWYgZXhjMltpXSBpcyB3cml0dGVuLCBjb2RlW2ldIHdpbGwgYmUgZGVzdHJveWVkIQorKi8KKyNkZWZpbmUgU0YgKFNGX0NPREUgKyBTRl9HQUlOX0MgKyAxIC0gU0ZfRVhDKQorCisgIGludCBpOworICBGSVhQX0RCTCB0bXAsIGNwZSwgY29kZV9zbW9vdGhfcHJldiwgY29kZV9zbW9vdGg7CisKKyAgRklYUF9DT0QgY29kZV9pOworICBGSVhQX0RCTCBjcGVfY29kZV9zbW9vdGgsIGNwZV9jb2RlX3Ntb290aF9wcmV2OworCisgIC8qIGNwZSA9ICgxK3JfdikvOCAqIDIgOyAoIFNGID0gLTEpICovCisgIGNwZSA9IChwZXJpb2RfZmFjID4+ICgyIC0gU0ZfUEZBQykpICsgRkwyRlhDT05TVF9EQkwoMC4yNWYpOworCisgIC8qIHUnKG4pICovCisgIHRtcCA9IGZNdWx0RGl2MigqZXhjLCBnYWluX3BpdCkgPDwgKFNGX0dBSU5fUCArIDEpOyAvKiB2KDApKmdfcCAqLworICAqZXhjKysgPSB0bXAgKyAoZk11bHREaXYyKGNvZGVbMF0sIGdhaW5fY29kZSkgPDwgU0YpOworCisgIC8qIHUobikgKi8KKyAgY29kZV9zbW9vdGhfcHJldiA9IGZNdWx0RGl2MigqY29kZSsrLCBnYWluX2NvZGVfc21vb3RoZWQpCisgICAgICAgICAgICAgICAgICAgICA8PCBTRjsgLyogYygwKSAqIGdfc2MgKi8KKyAgY29kZV9pID0gKmNvZGUrKzsKKyAgY29kZV9zbW9vdGggPSBmTXVsdERpdjIoY29kZV9pLCBnYWluX2NvZGVfc21vb3RoZWQpIDw8IFNGOyAvKiBjKDEpICogZ19zYyAqLworICB0bXAgKz0gY29kZV9zbW9vdGhfcHJldjsgLyogdG1wID0gdigwKSpnX3AgKyBjKDApKmdfc2MgKi8KKyAgY3BlX2NvZGVfc21vb3RoID0gZk11bHREaXYyKGNwZSwgY29kZV9zbW9vdGgpOworICAqZXhjMisrID0gdG1wIC0gY3BlX2NvZGVfc21vb3RoOworICBjcGVfY29kZV9zbW9vdGhfcHJldiA9IGZNdWx0RGl2MihjcGUsIGNvZGVfc21vb3RoX3ByZXYpOworCisgIGkgPSBMX1NVQkZSIC0gMjsKKyAgZG8gLyogQVJNOTI2OiAyMiBjeWNsZXMgcGVyIGl0ZXJhdGlvbiAqLworICB7CisgICAgLyogdScobikgKi8KKyAgICB0bXAgPSBmTXVsdERpdjIoKmV4YywgZ2Fpbl9waXQpIDw8IChTRl9HQUlOX1AgKyAxKTsKKyAgICAqZXhjKysgPSB0bXAgKyAoZk11bHREaXYyKGNvZGVfaSwgZ2Fpbl9jb2RlKSA8PCBTRik7CisgICAgLyogdShuKSAqLworICAgIHRtcCArPSBjb2RlX3Ntb290aDsgLyogKz0gZ19zYyAqIGMoaSkgKi8KKyAgICB0bXAgLT0gY3BlX2NvZGVfc21vb3RoX3ByZXY7CisgICAgY3BlX2NvZGVfc21vb3RoX3ByZXYgPSBjcGVfY29kZV9zbW9vdGg7CisgICAgY29kZV9pID0gKmNvZGUrKzsKKyAgICBjb2RlX3Ntb290aCA9IGZNdWx0RGl2Mihjb2RlX2ksIGdhaW5fY29kZV9zbW9vdGhlZCkgPDwgU0Y7CisgICAgY3BlX2NvZGVfc21vb3RoID0gZk11bHREaXYyKGNwZSwgY29kZV9zbW9vdGgpOworICAgICpleGMyKysgPSB0bXAgLSBjcGVfY29kZV9zbW9vdGg7IC8qIHRtcCAtIGNfcGUgKiBnX3NjICogYyhpKzEpICovCisgIH0gd2hpbGUgKC0taSAhPSAwKTsKKworICAvKiB1JyhuKSAqLworICB0bXAgPSBmTXVsdERpdjIoKmV4YywgZ2Fpbl9waXQpIDw8IChTRl9HQUlOX1AgKyAxKTsKKyAgKmV4YyA9IHRtcCArIChmTXVsdERpdjIoY29kZV9pLCBnYWluX2NvZGUpIDw8IFNGKTsKKyAgLyogdShuKSAqLworICB0bXAgKz0gY29kZV9zbW9vdGg7CisgIHRtcCAtPSBjcGVfY29kZV9zbW9vdGhfcHJldjsKKyAgKmV4YzIrKyA9IHRtcDsKKworICByZXR1cm47Cit9CisKKy8qKgorICogXGJyaWVmIEludGVycG9sYXRlIExQQyB2ZWN0b3IgaW4gTFNQIGRvbWFpbiBmb3IgY3VycmVudCBzdWJmcmFtZSBhbmQgY29udmVydAorICogdG8gTFAgZG9tYWluCisgKiBccGFyYW1baW5dIGxzcF9vbGQgTFBDIHZlY3RvciAoTFNQIGRvbWFpbikgY29ycmVzcG9uZGluZyB0byB0aGUgYmVnaW5uaW5nIG9mCisgKiBjdXJyZW50IEFDRUxQIGZyYW1lLgorICogXHBhcmFtW2luXSBsc3BfbmV3IExQQyB2ZWN0b3IgKExTUCBkb21haW4pIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZCBvZgorICogY3VycmVudCBBQ0VMUCBmcmFtZS4KKyAqIFxwYXJhbVtpbl0gc3ViZnJfbnIgbnVtYmVyIG9mIGN1cnJlbnQgQUNFTFAgc3ViZnJhbWUgMC4uMy4KKyAqIFxwYXJhbVtpbl0gbmJfc3ViZnIgdG90YWwgbnVtYmVyIG9mIEFDRUxQIHN1YmZyYW1lcyBpbiB0aGlzIGZyYW1lLgorICogXHBhcmFtW291dF0gQSBMUCBmaWx0ZXIgY29lZmZpY2llbnRzIGZvciBjdXJyZW50IEFDRUxQIHN1YmZyYW1lLCBleHBvbmVudCA9CisgKiBTRl9BX0NPRUZGUy4KKyAqLworLyogc3RhdGljICovCit2b2lkIGludF9scGNfYWNlbHAoCisgICAgY29uc3QgRklYUF9MUEMgbHNwX29sZFtdLCAvKiBpbnB1dCA6IExTUHMgZnJvbSBwYXN0IGZyYW1lICAgICAgICAgICAgICAqLworICAgIGNvbnN0IEZJWFBfTFBDIGxzcF9uZXdbXSwgLyogaW5wdXQgOiBMU1BzIGZyb20gcHJlc2VudCBmcmFtZSAgICAgICAgICAgKi8KKyAgICBpbnQgc3ViZnJfbnIsIGludCBuYl9zdWJmciwKKyAgICBGSVhQX0xQQworICAgICAgICBBW10sIC8qIG91dHB1dDogaW50ZXJwb2xhdGVkIExQIGNvZWZmaWNpZW50cyBmb3IgY3VycmVudCBzdWJmcmFtZSAqLworICAgIElOVCAqQV9leHApIHsKKyAgaW50IGk7CisgIEZJWFBfTFBDIGxzcF9pbnRlcnBvbFtNX0xQX0ZJTFRFUl9PUkRFUl07CisgIEZJWFBfU0dMIGZhY19vbGQsIGZhY19uZXc7CisKKyAgRkRLX0FTU0VSVCgobmJfc3ViZnIgPT0gMykgfHwgKG5iX3N1YmZyID09IDQpKTsKKworICBmYWNfb2xkID0gbHNwX2ludGVycG9sX2ZhY3RvcltuYl9zdWJmciAmIDB4MV1bKG5iX3N1YmZyIC0gMSkgLSBzdWJmcl9ucl07CisgIGZhY19uZXcgPSBsc3BfaW50ZXJwb2xfZmFjdG9yW25iX3N1YmZyICYgMHgxXVtzdWJmcl9ucl07CisgIGZvciAoaSA9IDA7IGkgPCBNX0xQX0ZJTFRFUl9PUkRFUjsgaSsrKSB7CisgICAgbHNwX2ludGVycG9sW2ldID0gRlhfREJMMkZYX0xQQygKKyAgICAgICAgKGZNdWx0RGl2Mihsc3Bfb2xkW2ldLCBmYWNfb2xkKSArIGZNdWx0RGl2Mihsc3BfbmV3W2ldLCBmYWNfbmV3KSkgPDwgMSk7CisgIH0KKworICBFX0xQQ19mX2xzcF9hX2NvbnZlcnNpb24obHNwX2ludGVycG9sLCBBLCBBX2V4cCk7CisKKyAgcmV0dXJuOworfQorCisvKioKKyAqIFxicmllZiBQZXJmb3JtIExQIHN5bnRoZXNpcyBieSBmaWx0ZXJpbmcgdGhlIHBvc3QtcHJvY2Vzc2VkIGV4Y2l0YXRpb24gdShuKQorICogICAgICAgIHRocm91Z2ggdGhlIExQIHN5bnRoZXNpcyBmaWx0ZXIgMS9BKHopCisgKiBccGFyYW1baW5dIGEgTFAgZmlsdGVyIGNvZWZmaWNpZW50cywgZXhwb25lbnQgPSBTRl9BX0NPRUZGUy4KKyAqIFxwYXJhbVtpbl0gbGVuZ3RoIGxlbmd0aCBvZiBpbnB1dC9vdXRwdXQgc2lnbmFsLgorICogXHBhcmFtW2luXSB4IHBvc3QtcHJvY2Vzc2VkIGV4Y2l0YXRpb24gdShuKS4KKyAqIFxwYXJhbVtpbixvdXRdIHkgTFAgc3ludGhlc2lzIHNpZ25hbCBhbmQgZmlsdGVyIG1lbW9yeQorICogeVstTV9MUF9GSUxURVJfT1JERVIuLi0xXS4KKyAqLworCisvKiBzdGF0aWMgKi8KK3ZvaWQgU3luX2ZpbHQoY29uc3QgRklYUF9MUEMgYVtdLCAvKiAoaSkgOiBhW21dIHByZWRpY3Rpb24gY29lZmZpY2llbnRzIFExMiAqLworICAgICAgICAgICAgICBjb25zdCBJTlQgYV9leHAsCisgICAgICAgICAgICAgIElOVCBsZW5ndGgsICAgLyogKGkpIDogbGVuZ3RoIG9mIGlucHV0L291dHB1dCBzaWduYWwgKDY0fDEyOCkgICAqLworICAgICAgICAgICAgICBGSVhQX0RCTCB4W10sIC8qIChpKSA6IGlucHV0IHNpZ25hbCBReCAgKi8KKyAgICAgICAgICAgICAgRklYUF9EQkwgeVtdICAvKiAoaS9vKSA6IGZpbHRlciBzdGF0ZXMgLyBvdXRwdXQgc2lnbmFsICBReC1zKi8KKykgeworICBpbnQgaSwgajsKKyAgRklYUF9EQkwgTF90bXA7CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgTF90bXAgPSAoRklYUF9EQkwpMDsKKworICAgIGZvciAoaiA9IDA7IGogPCBNX0xQX0ZJTFRFUl9PUkRFUjsgaisrKSB7CisgICAgICBMX3RtcCAtPSBmTXVsdERpdjIoYVtqXSwgeVtpIC0gKGogKyAxKV0pOworICAgIH0KKworICAgIExfdG1wID0gc2NhbGVWYWx1ZShMX3RtcCwgYV9leHAgKyAxKTsKKyAgICB5W2ldID0gTF90bXAgKyB4W2ldOworICB9CisKKyAgcmV0dXJuOworfQorCisvKioKKyAqIFxicmllZiBDYWxjdWxhdGUgZGUtZW1waGFzaXMgMS8oMSAtIG11IHpeLTEpIG9uIGlucHV0IHNpZ25hbC4KKyAqIFxwYXJhbVtpbl0geCBpbnB1dCBzaWduYWwuCisgKiBccGFyYW1bb3V0XSB5IG91dHB1dCBzaWduYWwuCisgKiBccGFyYW1baW5dIEwgbGVuZ3RoIG9mIHNpZ25hbC4KKyAqIFxwYXJhbVtpbixvdXRdIG1lbSBtZW1vcnkgKHNpZ25hbFstMV0pLgorICovCisvKiBzdGF0aWMgKi8KK3ZvaWQgRGVlbXBoKEZJWFBfREJMICp4LCBGSVhQX0RCTCAqeSwgaW50IEwsIEZJWFBfREJMICptZW0pIHsKKyAgaW50IGk7CisgIEZJWFBfREJMIHlpID0gKm1lbTsKKworICBmb3IgKGkgPSAwOyBpIDwgTDsgaSsrKSB7CisgICAgRklYUF9EQkwgeGkgPSB4W2ldID4+IDE7CisgICAgeGkgPSBmTXVsdEFkZERpdjIoeGksIFBSRUVNUEhfRkFDLCB5aSk7CisgICAgeWkgPSBTQVRVUkFURV9MRUZUX1NISUZUKHhpLCAxLCAzMik7CisgICAgeVtpXSA9IHlpOworICB9CisgICptZW0gPSB5aTsKKyAgcmV0dXJuOworfQorCisvKioKKyAqIFxicmllZiBDb21wdXRlIHRoZSBMUCByZXNpZHVhbCBieSBmaWx0ZXJpbmcgdGhlIGlucHV0IHNwZWVjaCB0aHJvdWdoIHRoZQorICogYW5hbHlzaXMgZmlsdGVyIEEoeikuCisgKiBccGFyYW1baW5dIGEgTFAgZmlsdGVyIGNvZWZmaWNpZW50cywgZXhwb25lbnQgPSBTRl9BX0NPRUZGUworICogXHBhcmFtW2luXSB4IGlucHV0IHNpZ25hbCAobm90ZSB0aGF0IHZhbHVlcyB4Wy1tLi4tMV0gYXJlIG5lZWRlZCksIGV4cG9uZW50ID0KKyAqIFNGX1NZTlRICisgKiBccGFyYW1bb3V0XSB5IG91dHB1dCBzaWduYWwgKHJlc2lkdWFsKSwgZXhwb25lbnQgPSBTRl9FWEMKKyAqIFxwYXJhbVtpbl0gbCBsZW5ndGggb2YgZmlsdGVyaW5nCisgKi8KKy8qIHN0YXRpYyAqLwordm9pZCBFX1VUSUxfcmVzaWR1KGNvbnN0IEZJWFBfTFBDICphLCBjb25zdCBJTlQgYV9leHAsIEZJWFBfREJMICp4LCBGSVhQX0RCTCAqeSwKKyAgICAgICAgICAgICAgICAgICBJTlQgbCkgeworICBGSVhQX0RCTCBzOworICBJTlQgaSwgajsKKworICAvKiAobm90ZSB0aGF0IHZhbHVlcyB4Wy1tLi4tMV0gYXJlIG5lZWRlZCkgKi8KKyAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgeworICAgIHMgPSAoRklYUF9EQkwpMDsKKworICAgIGZvciAoaiA9IDA7IGogPCBNX0xQX0ZJTFRFUl9PUkRFUjsgaisrKSB7CisgICAgICBzICs9IGZNdWx0RGl2MihhW2pdLCB4W2kgLSBqIC0gMV0pOworICAgIH0KKworICAgIHMgPSBzY2FsZVZhbHVlKHMsIGFfZXhwICsgMSk7CisgICAgeVtpXSA9IGZBZGRTYXR1cmF0ZShzLCB4W2ldKTsKKyAgfQorCisgIHJldHVybjsKK30KKworLyogdXNlIHRvIG1hcCBzdWJmciBudW1iZXIgdG8gbnVtYmVyIG9mIGJpdHMgdXNlZCBmb3IgYWNiX2luZGV4ICovCitzdGF0aWMgY29uc3QgVUNIQVIgbnVtX2FjYl9pZHhfYml0c190YWJsZVsyXVtOQl9TVUJGUl0gPSB7CisgICAgezksIDYsIDksIDZ9LCAvKiBjb3JlQ29kZXJGcmFtZUxlbmd0aCA9PSAxMDI0ICovCisgICAgezksIDYsIDYsIDB9ICAvKiBjb3JlQ29kZXJGcmFtZUxlbmd0aCA9PSA3NjggICovCit9OworCitzdGF0aWMgaW50IERlY29kZVBpdGNoTGFnKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgbnVtX2FjYl9pZHhfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IFBJVF9NSU4sIC8qIFRNSU4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IFBJVF9GUjIsIC8qIFRGUjIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IFBJVF9GUjEsIC8qIFRGUjEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IFBJVF9NQVgsIC8qIFRNQVggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwVDAsIGludCAqcFQwX2ZyYWMsIGludCAqcFQwX21pbiwgaW50ICpwVDBfbWF4KSB7CisgIGludCBhY2JfaWR4OworICBpbnQgZXJyb3IgPSAwOworICBpbnQgVDAsIFQwX2ZyYWM7CisKKyAgRkRLX0FTU0VSVCgobnVtX2FjYl9pZHhfYml0cyA9PSA5KSB8fCAobnVtX2FjYl9pZHhfYml0cyA9PSA2KSk7CisKKyAgYWNiX2lkeCA9IEZES3JlYWRCaXRzKGhCcywgbnVtX2FjYl9pZHhfYml0cyk7CisKKyAgaWYgKG51bV9hY2JfaWR4X2JpdHMgPT0gNikgeworICAgIC8qIFdoZW4gdGhlIHBpdGNoIHZhbHVlIGlzIGVuY29kZWQgb24gNiBiaXRzLCBhIHBpdGNoIHJlc29sdXRpb24gb2YgMS80IGlzCisgICAgICAgYWx3YXlzIHVzZWQgaW4gdGhlIHJhbmdlIFtUMS04LCBUMSs3Ljc1XSwgd2hlcmUgVDEgaXMgbmVhcmVzdCBpbnRlZ2VyIHRvCisgICAgICAgdGhlIGZyYWN0aW9uYWwgcGl0Y2ggbGFnIG9mIHRoZSBwcmV2aW91cyBzdWJmcmFtZS4KKyAgICAqLworICAgIFQwID0gKnBUMF9taW4gKyBhY2JfaWR4IC8gNDsKKyAgICBUMF9mcmFjID0gYWNiX2lkeCAmIDB4MzsKKyAgfSBlbHNlIHsgLyogbnVtX2FjYl9pZHhfYml0cyA9PSA5ICovCisgICAgLyogV2hlbiB0aGUgcGl0Y2ggdmFsdWUgaXMgZW5jb2RlZCBvbiA5IGJpdHMsIGEgZnJhY3Rpb25hbCBwaXRjaCBkZWxheSBpcworICAgICAgIHVzZWQgd2l0aCByZXNvbHV0aW9ucyAwLjI1IGluIHRoZSByYW5nZSBbVE1JTiwgVEZSMi0wLjI1XSwgcmVzb2x1dGlvbnMKKyAgICAgICAwLjUgaW4gdGhlIHJhbmdlIFtURlIyLCBURlIxLTAuNV0sIGFuZCBpbnRlZ2VycyBvbmx5IGluIHRoZSByYW5nZSBbVEZSMSwKKyAgICAgICBUTUFYXS4gTk9URTogZm9yIHNtYWxsIHNhbXBsaW5nIHJhdGVzIFRNQVggY2FuIGdldCBzbWFsbGVyIHRoYW4gVEZSMS4KKyAgICAqLworICAgIGludCBUMF9taW4sIFQwX21heDsKKworICAgIGlmIChhY2JfaWR4IDwgKFBJVF9GUjIgLSBQSVRfTUlOKSAqIDQpIHsKKyAgICAgIC8qIGZpcnN0IGludGVydmFsIHdpdGggMC4yNSBwaXRjaCByZXNvbHV0aW9uICovCisgICAgICBUMCA9IFBJVF9NSU4gKyAoYWNiX2lkeCAvIDQpOworICAgICAgVDBfZnJhYyA9IGFjYl9pZHggJiAweDM7CisgICAgfSBlbHNlIGlmIChhY2JfaWR4IDwgKChQSVRfRlIyIC0gUElUX01JTikgKiA0ICsgKFBJVF9GUjEgLSBQSVRfRlIyKSAqIDIpKSB7CisgICAgICAvKiBzZWNvbmQgaW50ZXJ2YWwgd2l0aCAwLjUgcGl0Y2ggcmVzb2x1dGlvbiAqLworICAgICAgYWNiX2lkeCAtPSAoUElUX0ZSMiAtIFBJVF9NSU4pICogNDsKKyAgICAgIFQwID0gUElUX0ZSMiArIChhY2JfaWR4IC8gMik7CisgICAgICBUMF9mcmFjID0gKGFjYl9pZHggJiAweDEpICogMjsKKyAgICB9IGVsc2UgeworICAgICAgLyogdGhpcmQgaW50ZXJ2YWwgd2l0aCAxLjAgcGl0Y2ggcmVzb2x1dGlvbiAqLworICAgICAgVDAgPSBhY2JfaWR4ICsgUElUX0ZSMSAtICgoUElUX0ZSMiAtIFBJVF9NSU4pICogNCkgLQorICAgICAgICAgICAoKFBJVF9GUjEgLSBQSVRfRlIyKSAqIDIpOworICAgICAgVDBfZnJhYyA9IDA7CisgICAgfQorICAgIC8qIGZpbmQgVDBfbWluIGFuZCBUMF9tYXggZm9yIHN1YmZyYW1lIDEgb3IgMyAqLworICAgIFQwX21pbiA9IFQwIC0gODsKKyAgICBpZiAoVDBfbWluIDwgUElUX01JTikgeworICAgICAgVDBfbWluID0gUElUX01JTjsKKyAgICB9CisgICAgVDBfbWF4ID0gVDBfbWluICsgMTU7CisgICAgaWYgKFQwX21heCA+IFBJVF9NQVgpIHsKKyAgICAgIFQwX21heCA9IFBJVF9NQVg7CisgICAgICBUMF9taW4gPSBUMF9tYXggLSAxNTsKKyAgICB9CisgICAgKnBUMF9taW4gPSBUMF9taW47CisgICAgKnBUMF9tYXggPSBUMF9tYXg7CisgIH0KKyAgKnBUMCA9IFQwOworICAqcFQwX2ZyYWMgPSBUMF9mcmFjOworCisgIHJldHVybiBlcnJvcjsKK30KK3N0YXRpYyB2b2lkIENvbmNlYWxQaXRjaExhZyhDQWNlbHBTdGF0aWNNZW0gKmFjZWxwX21lbSwgY29uc3QgaW50IFBJVF9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwVDAsIGludCAqcFQwX2ZyYWMpIHsKKyAgVVNIT1JUICpwb2xkX1QwID0gJmFjZWxwX21lbS0+b2xkX1QwOworICBVQ0hBUiAqcG9sZF9UMF9mcmFjID0gJmFjZWxwX21lbS0+b2xkX1QwX2ZyYWM7CisKKyAgaWYgKChpbnQpKnBvbGRfVDAgPj0gUElUX01BWCkgeworICAgICpwb2xkX1QwID0gKFVDSEFSKShQSVRfTUFYIC0gNSk7CisgIH0KKyAgKnBUMCA9IChpbnQpKnBvbGRfVDA7CisgICpwVDBfZnJhYyA9IChpbnQpKnBvbGRfVDBfZnJhYzsKK30KKworc3RhdGljIFVDSEFSIHRhYl9jb3JlbW9kZTJuYml0c1s4XSA9IHsyMCwgMjgsIDM2LCA0NCwgNTIsIDY0LCAxMiwgMTZ9OworCitzdGF0aWMgaW50IE1hcENvcmVNb2RlMk5CaXRzKGludCBjb3JlX21vZGUpIHsKKyAgcmV0dXJuIChpbnQpdGFiX2NvcmVtb2RlMm5iaXRzW2NvcmVfbW9kZV07Cit9CisKK3ZvaWQgQ0xwZF9BY2VscERlY29kZShDQWNlbHBTdGF0aWNNZW0gKmFjZWxwX21lbSwgSU5UIGlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfTFBDIGxzcF9vbGRbTV9MUF9GSUxURVJfT1JERVJdLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfTFBDIGxzcF9uZXdbTV9MUF9GSUxURVJfT1JERVJdLAorICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMIHN0YWJfZmFjLCBDQWNlbHBDaGFubmVsRGF0YSAqcEFjZWxwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtTG9zdFN1YmZyYW1lcywgaW50IGxhc3RMcGNMb3N0LCBpbnQgZnJhbWVDbnQsCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgc3ludGhbXSwgaW50IHBUW10sIEZJWFBfREJMICpwaXRfZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICBJTlQgY29yZUNvZGVyRnJhbWVMZW5ndGgpIHsKKyAgaW50IGlfc3ViZnIsIHN1YmZyX25yLCBsX2RpdiwgVDsKKyAgaW50IFQwID0gLTEsIFQwX2ZyYWMgPSAtMTsgLyogbWFyayBpbnZhbGlkICovCisKKyAgaW50IHBpdF9nYWluX2luZGV4ID0gMDsKKworICBjb25zdCBpbnQgUElUX01BWCA9IFBJVF9NQVhfMTJrOCArICg2ICogaV9vZmZzZXQpOyAvKiBtYXhpbXVtIHBpdGNoIGxhZyAqLworCisgIEZJWFBfQ09EICpjb2RlOworICBGSVhQX0RCTCAqZXhjMjsKKyAgRklYUF9EQkwgKnN5bjsKKyAgRklYUF9EQkwgKmV4YzsKKyAgRklYUF9MUEMgQVtNX0xQX0ZJTFRFUl9PUkRFUl07CisgIElOVCBBX2V4cDsKKworICBGSVhQX0RCTCBwZXJpb2RfZmFjOworICBGSVhQX1NHTCBnYWluX3BpdDsKKyAgRklYUF9EQkwgZ2Fpbl9jb2RlLCBnYWluX2NvZGVfc21vb3RoLCBFbmVyX2NvZGU7CisgIGludCBFbmVyX2NvZGVfZTsKKyAgaW50IG47CisgIGludCBiZmkgPSAobnVtTG9zdFN1YmZyYW1lcyA+IDApID8gMSA6IDA7CisKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKAorICAgICAgZXhjX2J1ZiwgRklYUF9EQkwsCisgICAgICBQSVRfTUFYX01BWCArIExfSU5URVJQT0wgKyBMX0RJViArIDEpOyAvKiA0MTEgKyAxNyArIDI1NiArIDEgPSA2ODUgKi8KKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHN5bl9idWYsIEZJWFBfREJMLAorICAgICAgICAgICAgICAgICAgICAgICAgTV9MUF9GSUxURVJfT1JERVIgKyBMX0RJVik7IC8qIDE2ICsgMjU2ID0gMjcyICovCisgIC8qIHVzZSBzYW1lIG1lbW9yeSBmb3IgY29kZVtMX1NVQkZSXSBhbmQgZXhjMltMX1NVQkZSXSAqLworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQodG1wX2J1ZiwgRklYUF9EQkwsIExfU1VCRlIpOyAvKiA2NCAqLworICAvKiBtYWtlIHN1cmUgdGhleSBkb24ndCBvdmVybGFwIGlmIHRoZXkgYXJlIGFjY2Vzc2VkIGFsdGVybmF0aW5nbHkgaW4KKyAgICogQnVpbGRBZGFwdGl2ZUV4Y2l0YXRpb24oKSAqLworI2lmIChDT0RfQklUUyA9PSBGUkFDVF9CSVRTKQorICBjb2RlID0gKEZJWFBfQ09EICopKHRtcF9idWYgKyBMX1NVQkZSIC8gMik7CisjZWxpZiAoQ09EX0JJVFMgPT0gREZSQUNUX0JJVFMpCisgIGNvZGUgPSAoRklYUF9DT0QgKil0bXBfYnVmOworI2VuZGlmCisgIGV4YzIgPSAoRklYUF9EQkwgKil0bXBfYnVmOworCisgIHN5biA9IHN5bl9idWYgKyBNX0xQX0ZJTFRFUl9PUkRFUjsKKyAgZXhjID0gZXhjX2J1ZiArIFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTDsKKworICBGREttZW1jcHkoc3luX2J1ZiwgYWNlbHBfbWVtLT5vbGRfc3luX21lbSwKKyAgICAgICAgICAgIE1fTFBfRklMVEVSX09SREVSICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNweShleGNfYnVmLCBhY2VscF9tZW0tPm9sZF9leGNfbWVtLAorICAgICAgICAgICAgKFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCkgKiBzaXplb2YoRklYUF9EQkwpKTsKKworICBGREttZW1jbGVhcihleGNfYnVmICsgKFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCksCisgICAgICAgICAgICAgIChMX0RJViArIDEpICogc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgbF9kaXYgPSBjb3JlQ29kZXJGcmFtZUxlbmd0aCAvIE5CX0RJVjsKKworICBmb3IgKGlfc3ViZnIgPSAwLCBzdWJmcl9uciA9IDA7IGlfc3ViZnIgPCBsX2RpdjsKKyAgICAgICBpX3N1YmZyICs9IExfU1VCRlIsIHN1YmZyX25yKyspIHsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgICAgICogLSBEZWNvZGUgcGl0Y2ggbGFnIChUMCBhbmQgVDBfZnJhYykgICAgICAgICAgICAgKgorICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKGJmaSkgeworICAgICAgQ29uY2VhbFBpdGNoTGFnKGFjZWxwX21lbSwgUElUX01BWCwgJlQwLCAmVDBfZnJhYyk7CisgICAgfSBlbHNlIHsKKyAgICAgIFQwID0gKGludClwQWNlbHBEYXRhLT5UMFtzdWJmcl9ucl07CisgICAgICBUMF9mcmFjID0gKGludClwQWNlbHBEYXRhLT5UMF9mcmFjW3N1YmZyX25yXTsKKyAgICB9CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgICAgICogLSBGaW5kIHRoZSBwaXRjaCBnYWluLCB0aGUgaW50ZXJwb2xhdGlvbiBmaWx0ZXIgKgorICAgICAqICAgYW5kIHRoZSBhZGFwdGl2ZSBjb2RlYm9vayB2ZWN0b3IuICAgICAgICAgICAgICoKKyAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIFByZWRfbHQ0KCZleGNbaV9zdWJmcl0sIFQwLCBUMF9mcmFjKTsKKworICAgIGlmICgoIWJmaSAmJiBwQWNlbHBEYXRhLT5sdHBfZmlsdGVyaW5nX2ZsYWdbc3ViZnJfbnJdID09IDApIHx8CisgICAgICAgIChiZmkgJiYgbnVtTG9zdFN1YmZyYW1lcyA9PSAxICYmIHN0YWJfZmFjIDwgRkwyRlhDT05TVF9TR0woMC4yNWYpKSkgeworICAgICAgLyogZmluZCBwaXRjaCBleGNpdGF0aW9uIHdpdGggbHAgZmlsdGVyOiB2JyhuKSA9PiB2KG4pICovCisgICAgICBQcmVkX2x0NF9wb3N0ZmlsdGVyKCZleGNbaV9zdWJmcl0pOworICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgICAgKiAtIERlY29kZSBpbm5vdmF0aXZlIGNvZGVib29rLiAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogLSBBZGQgdGhlIGZpeGVkLWdhaW4gcGl0Y2ggY29udHJpYnV0aW9uIHRvIGNvZGVbXS4gICAgKgorICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKGJmaSkgeworICAgICAgZm9yIChuID0gMDsgbiA8IExfU1VCRlI7IG4rKykgeworICAgICAgICBjb2RlW25dID0KKyAgICAgICAgICAgIEZYX1NHTDJGWF9DT0QoKEZJWFBfU0dMKUVfVVRJTF9yYW5kb20oJmFjZWxwX21lbS0+c2VlZF9hY2UpKSA+PiA0OworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpbnQgbmJpdHMgPSBNYXBDb3JlTW9kZTJOQml0cygoaW50KXBBY2VscERhdGEtPmFjZWxwX2NvcmVfbW9kZSk7CisgICAgICBEX0FDRUxQX2RlY29kZV80dDY0KHBBY2VscERhdGEtPmljYl9pbmRleFtzdWJmcl9ucl0sIG5iaXRzLCAmY29kZVswXSk7CisgICAgfQorCisgICAgVCA9IFQwOworICAgIGlmIChUMF9mcmFjID4gMikgeworICAgICAgVCArPSAxOworICAgIH0KKworICAgIFByZWVtcGhfY29kZShjb2RlKTsKKyAgICBQaXRfc2hycChjb2RlLCBUKTsKKworICAgIC8qIE91dHB1dCBwaXRjaCBsYWcgZm9yIGJhc3MgcG9zdC1maWx0ZXIgKi8KKyAgICBpZiAoVCA+IFBJVF9NQVgpIHsKKyAgICAgIHBUW3N1YmZyX25yXSA9IFBJVF9NQVg7CisgICAgfSBlbHNlIHsKKyAgICAgIHBUW3N1YmZyX25yXSA9IFQ7CisgICAgfQorICAgIERfZ2FpbjJfcGx1cygKKyAgICAgICAgcEFjZWxwRGF0YS0+Z2FpbnNbc3ViZnJfbnJdLAorICAgICAgICBjb2RlLCAgICAgICAvKiAoaSkgIDogSW5ub3ZhdGl2ZSBjb2RlIHZlY3RvciwgZXhwb25lbnQgPSBTRl9DT0RFICovCisgICAgICAgICZnYWluX3BpdCwgIC8qIChvKSAgOiBRdWFudGl6ZWQgcGl0Y2ggZ2FpbiwgZXhwb25lbnQgPSBTRl9HQUlOX1AgKi8KKyAgICAgICAgJmdhaW5fY29kZSwgLyogKG8pICA6IFF1YW50aXplZCBjb2RlYm9vayBnYWluICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBwQWNlbHBEYXRhCisgICAgICAgICAgICAtPm1lYW5fZW5lcmd5LCAvKiAoaSkgIDogbWVhbl9lbmVyIGRlZmluZWQgaW4gb3Blbi1sb29wICgyIGJpdHMpICovCisgICAgICAgIGJmaSwgJmFjZWxwX21lbS0+cGFzdF9ncGl0LCAmYWNlbHBfbWVtLT5wYXN0X2djb2RlLAorICAgICAgICAmRW5lcl9jb2RlLCAgICAvKiAobykgIDogSW5ub3ZhdGl2ZSBjb2RlIHZlY3RvciBlbmVyZ3kgICAgICAgICAgICAgICovCisgICAgICAgICZFbmVyX2NvZGVfZSk7IC8qIChvKSAgOiBJbm5vdmF0aXZlIGNvZGUgdmVjdG9yIGVuZXJneSBleHBvbmVudCAgICAgKi8KKworICAgIHBpdF9nYWluW3BpdF9nYWluX2luZGV4KytdID0gRlhfU0dMMkZYX0RCTChnYWluX3BpdCk7CisKKyAgICAvKiBjYWxjIHBlcmlvZGljaXR5IGZhY3RvciByX3YgKi8KKyAgICBwZXJpb2RfZmFjID0KKyAgICAgICAgY2FsY19wZXJpb2RfZmFjdG9yKC8qIChvKSA6IGZhY3RvciAoLTE9dW52b2ljZWQgdG8gMT12b2ljZWQpICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhjW2lfc3ViZnJdLCAvKiAoaSkgOiBwaXRjaCBleGNpdGF0aW9uLCBleHBvbmVudCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRl9FWEMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW5fcGl0LCAgICAgIC8qIChpKSA6IGdhaW4gb2YgcGl0Y2gsIGV4cG9uZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNGX0dBSU5fUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Fpbl9jb2RlLCAgICAgLyogKGkpIDogZ2FpbiBvZiBjb2RlICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5lcl9jb2RlLCAgICAgLyogKGkpIDogRW5lcmd5IG9mIGNvZGVbXSAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZXJfY29kZV9lKTsgIC8qIChpKSA6IEV4cG9uZW50IG9mIGVuZXJneSBvZiBjb2RlW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgaWYgKGxhc3RMcGNMb3N0ICYmIGZyYW1lQ250ID09IDApIHsKKyAgICAgIGlmIChnYWluX3BpdCA+IEZMMkZYQ09OU1RfU0dMKDEuMGYgLyAoMSA8PCBTRl9HQUlOX1ApKSkgeworICAgICAgICBnYWluX3BpdCA9IEZMMkZYQ09OU1RfU0dMKDEuMGYgLyAoMSA8PCBTRl9HQUlOX1ApKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnYWluX2NvZGVfc21vb3RoID0KKyAgICAgICAgbm9pc2VfZW5oYW5jZXIoLyogKG8pIDogc21vb3RoZWQgZ2FpbiBnX3NjIGV4cG9uZW50ID0gU0ZfR0FJTl9DICovCisgICAgICAgICAgICAgICAgICAgICAgIGdhaW5fY29kZSwgIC8qIChpKSA6IFF1YW50aXplZCBjb2RlYm9vayBnYWluICAqLworICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2RfZmFjLCAvKiAoaSkgOiBwZXJpb2RpY2l0eSBmYWN0b3IgKC0xPXVudm9pY2VkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9dm9pY2VkKSAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgc3RhYl9mYWMsICAgLyogKGkpIDogc3RhYmlsaXR5IGZhY3RvciAoMCA8PSAuLi4gPCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb25lbnQgPSAxICovCisgICAgICAgICAgICAgICAgICAgICAgICZhY2VscF9tZW0tPmdjX3RocmVzaG9sZCk7CisKKyAgICAvKiBDb21wdXRlIGFkYXB0aXZlIGNvZGVib29rIHVwZGF0ZSB1JyhuKSwgcGl0Y2ggZW5oYW5jZW1lbnQgYycobikgYW5kCisgICAgICogcG9zdC1wcm9jZXNzZWQgZXhjaXRhdGlvbiB1KG4pLiAqLworICAgIEJ1aWxkQWRhcHRpdmVFeGNpdGF0aW9uKGNvZGUsIGV4YyArIGlfc3ViZnIsIGdhaW5fcGl0LCBnYWluX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Fpbl9jb2RlX3Ntb290aCwgcGVyaW9kX2ZhYywgZXhjMik7CisKKyAgICAvKiBJbnRlcnBvbGF0ZSBmaWx0ZXIgY29lZmZzIGZvciBjdXJyZW50IHN1YmZyYW1lIGluIGxzcCBkb21haW4gYW5kIGNvbnZlcnQKKyAgICAgKiB0byBMUCBkb21haW4gKi8KKyAgICBpbnRfbHBjX2FjZWxwKGxzcF9vbGQsICAvKiBpbnB1dCA6IExTUHMgZnJvbSBwYXN0IGZyYW1lICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgbHNwX25ldywgIC8qIGlucHV0IDogTFNQcyBmcm9tIHByZXNlbnQgZnJhbWUgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBzdWJmcl9uciwgLyogaW5wdXQgOiBBQ0VMUCBzdWJmcmFtZSBpbmRleCAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGNvcmVDb2RlckZyYW1lTGVuZ3RoIC8gTF9ESVYsCisgICAgICAgICAgICAgICAgICBBLCAvKiBvdXRwdXQ6IExQIGNvZWZmaWNpZW50cyBvZiB0aGlzIHN1YmZyYW1lICAqLworICAgICAgICAgICAgICAgICAgJkFfZXhwKTsKKworICAgIFN5bl9maWx0KEEsIC8qIChpKSA6IGFbbV0gcHJlZGljdGlvbiBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgIEFfZXhwLCBMX1NVQkZSLCAvKiAoaSkgOiBsZW5ndGggKi8KKyAgICAgICAgICAgICBleGMyLCAvKiAoaSkgOiBpbnB1dCBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAmc3luW2lfc3ViZnJdIC8qIChpL28pIDogZmlsdGVyIHN0YXRlcyAvIG91dHB1dCBzaWduYWwgKi8KKyAgICApOworCisgIH0gLyogZW5kIG9mIHN1YmZyYW1lIGxvb3AgKi8KKworICAvKiB1cGRhdGUgcGl0Y2ggdmFsdWUgZm9yIGJmaSBwcm9jZWR1cmUgKi8KKyAgYWNlbHBfbWVtLT5vbGRfVDBfZnJhYyA9IFQwX2ZyYWM7CisgIGFjZWxwX21lbS0+b2xkX1QwID0gVDA7CisKKyAgLyogc2F2ZSBvbGQgZXhjaXRhdGlvbiBhbmQgb2xkIHN5bnRoZXNpcyBtZW1vcnkgZm9yIG5leHQgQUNFTFAgZnJhbWUgKi8KKyAgRkRLbWVtY3B5KGFjZWxwX21lbS0+b2xkX2V4Y19tZW0sIGV4YyArIGxfZGl2IC0gKFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCksCisgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogKFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCkpOworICBGREttZW1jcHkoYWNlbHBfbWVtLT5vbGRfc3luX21lbSwgc3luX2J1ZiArIGxfZGl2LAorICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIE1fTFBfRklMVEVSX09SREVSKTsKKworICBEZWVtcGgoc3luLCBzeW50aCwgbF9kaXYsCisgICAgICAgICAmYWNlbHBfbWVtLT5kZV9lbXBoX21lbSk7IC8qIHJlZiBzb2Z0OiBtZW0gPSBzeW50aFstMV0gKi8KKworICBzY2FsZVZhbHVlcyhzeW50aCwgbF9kaXYsIC1BQ0VMUF9PVVRTQ0FMRSk7CisgIGFjZWxwX21lbS0+ZGVlbXBoX21lbV93c3luID0gYWNlbHBfbWVtLT5kZV9lbXBoX21lbTsKKworICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHRtcF9idWYsIEZJWFBfREJMLCBMX1NVQkZSKTsKKyAgQ19BTExPQ19TQ1JBVENIX0VORChzeW5fYnVmLCBGSVhQX0RCTCwgTV9MUF9GSUxURVJfT1JERVIgKyBMX0RJVik7CisgIENfQUxMT0NfU0NSQVRDSF9FTkQoZXhjX2J1ZiwgRklYUF9EQkwsIFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCArIExfRElWICsgMSk7CisgIHJldHVybjsKK30KKwordm9pZCBDTHBkX0FjZWxwUmVzZXQoQ0FjZWxwU3RhdGljTWVtICphY2VscCkgeworICBhY2VscC0+Z2NfdGhyZXNob2xkID0gKEZJWFBfREJMKTA7CisKKyAgYWNlbHAtPnBhc3RfZ3BpdCA9IChGSVhQX1NHTCkwOworICBhY2VscC0+cGFzdF9nY29kZSA9IChGSVhQX0RCTCkwOworICBhY2VscC0+b2xkX1QwID0gNjQ7CisgIGFjZWxwLT5vbGRfVDBfZnJhYyA9IDA7CisgIGFjZWxwLT5kZWVtcGhfbWVtX3dzeW4gPSAoRklYUF9EQkwpMDsKKyAgYWNlbHAtPndzeW5fcm1zID0gKEZJWFBfREJMKTA7CisgIGFjZWxwLT5zZWVkX2FjZSA9IDA7Cit9CisKKy8qIFRDWCB0aW1lIGRvbWFpbiBjb25jZWFsbWVudCAqLworLyogICBDb21wYXJlIHRvIGZpZ3VyZSAxM2Egb24gcGFnZSA1NCBpbiAzR1BQIFRTIDI2LjI5MCAqLwordm9pZCBDTHBkX1RjeFREQ29uY2VhbChDQWNlbHBTdGF0aWNNZW0gKmFjZWxwX21lbSwgU0hPUlQgKnBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0xQQyBsc3Bfb2xkW01fTFBfRklMVEVSX09SREVSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9MUEMgbHNwX25ld1tNX0xQX0ZJTFRFUl9PUkRFUl0sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIHN0YWJfZmFjLCBJTlQgbkxvc3RTZiwgRklYUF9EQkwgc3ludGhbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNvcmVDb2RlckZyYW1lTGVuZ3RoLCBVQ0hBUiBsYXN0X3RjeF9ub2lzZV9mYWN0b3IpIHsKKyAgLyogcmVwZWF0IHBhc3QgZXhjaXRhdGlvbiB3aXRoIHBpdGNoIGZyb20gcHJldmlvdXMgZGVjb2RlZCBUQ1ggZnJhbWUgKi8KKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKAorICAgICAgZXhjX2J1ZiwgRklYUF9EQkwsCisgICAgICBQSVRfTUFYX01BWCArIExfSU5URVJQT0wgKyBMX0RJVik7IC8qIDQxMSArICAxNyArIDI1NiArIDEgPSAgKi8KKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHN5bl9idWYsIEZJWFBfREJMLAorICAgICAgICAgICAgICAgICAgICAgICAgTV9MUF9GSUxURVJfT1JERVIgKyBMX0RJVik7IC8qIDI1NiArICAxNiAgICAgICAgICAgPSAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgKz0gICovCisgIEZJWFBfREJMIG5zX2J1ZltMX0RJViArIDFdOworICBGSVhQX0RCTCAqc3luID0gc3luX2J1ZiArIE1fTFBfRklMVEVSX09SREVSOworICBGSVhQX0RCTCAqZXhjID0gZXhjX2J1ZiArIFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTDsKKyAgRklYUF9EQkwgKm5zID0gbnNfYnVmICsgMTsKKyAgRklYUF9EQkwgdG1wLCBmYWN0X2V4YzsKKyAgSU5UIFQgPSBmTWluKCpwaXRjaCwgKFNIT1JUKVBJVF9NQVhfTUFYKTsKKyAgaW50IGksIGlfc3ViZnIsIHN1YmZyX25yOworICBpbnQgbERpdiA9IGNvcmVDb2RlckZyYW1lTGVuZ3RoIC8gTkJfRElWOworCisgIEZES21lbWNweShzeW5fYnVmLCBhY2VscF9tZW0tPm9sZF9zeW5fbWVtLAorICAgICAgICAgICAgTV9MUF9GSUxURVJfT1JERVIgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY3B5KGV4Y19idWYsIGFjZWxwX21lbS0+b2xkX2V4Y19tZW0sCisgICAgICAgICAgICAoUElUX01BWF9NQVggKyBMX0lOVEVSUE9MKSAqIHNpemVvZihGSVhQX0RCTCkpOworCisgIC8qIGlmIHdlIGxvc3QgYWxsIHBhY2tldHMgKGkuZS4gMSBwYWNrZXQgb2YgVENYLTIwIG1zLCAyIHBhY2tldHMgb2YKKyAgICAgdGhlIFRDWC00MCBtcyBvciA0IHBhY2tldHMgb2YgdGhlIFRDWC04MG1zKSwgd2UgbG9zdCB0aGUgd2hvbGUKKyAgICAgY29kZWQgZnJhbWUgZXh0cmFwb2xhdGlvbiBzdHJhdGVneTogcmVwZWF0IGxvc3QgZXhjaXRhdGlvbiBhbmQKKyAgICAgdXNlIGV4dHJhcG9sYXRlZCBMU0ZzICovCisKKyAgLyogQU1SLVdCKyBsaWtlIFRDWCBURCBjb25jZWFsbWVudCAqLworCisgIC8qIG51bWJlciBvZiBsb3N0IGZyYW1lIGNtcHQgKi8KKyAgaWYgKG5Mb3N0U2YgPCAyKSB7CisgICAgZmFjdF9leGMgPSBGTDJGWENPTlNUX0RCTCgwLjhmKTsKKyAgfSBlbHNlIHsKKyAgICBmYWN0X2V4YyA9IEZMMkZYQ09OU1RfREJMKDAuNGYpOworICB9CisKKyAgLyogcmVwZWF0IHBhc3QgZXhjaXRhdGlvbiAqLworICBmb3IgKGkgPSAwOyBpIDwgbERpdjsgaSsrKSB7CisgICAgZXhjW2ldID0gZk11bHQoZmFjdF9leGMsIGV4Y1tpIC0gVF0pOworICB9CisKKyAgdG1wID0gZk11bHQoZmFjdF9leGMsIGFjZWxwX21lbS0+d3N5bl9ybXMpOworICBhY2VscF9tZW0tPndzeW5fcm1zID0gdG1wOworCisgIC8qIGluaXQgZGVlbXBoX21lbV93c3luICovCisgIGFjZWxwX21lbS0+ZGVlbXBoX21lbV93c3luID0gZXhjWy0xXTsKKworICBuc1stMV0gPSBhY2VscF9tZW0tPmRlZW1waF9tZW1fd3N5bjsKKworICBmb3IgKGlfc3ViZnIgPSAwLCBzdWJmcl9uciA9IDA7IGlfc3ViZnIgPCBsRGl2OworICAgICAgIGlfc3ViZnIgKz0gTF9TVUJGUiwgc3ViZnJfbnIrKykgeworICAgIEZJWFBfREJMIHRSZXNbTF9TVUJGUl07CisgICAgRklYUF9MUEMgQVtNX0xQX0ZJTFRFUl9PUkRFUl07CisgICAgSU5UIEFfZXhwOworCisgICAgLyogaW50ZXJwb2xhdGUgTFBDIGNvZWZmaWNpZW50cyAqLworICAgIGludF9scGNfYWNlbHAobHNwX29sZCwgbHNwX25ldywgc3ViZnJfbnIsIGxEaXYgLyBMX1NVQkZSLCBBLCAmQV9leHApOworCisgICAgU3luX2ZpbHQoQSwgICAgICAgICAgICAgIC8qIChpKSA6IGFbbV0gcHJlZGljdGlvbiBjb2VmZmljaWVudHMgICAgICAgICAqLworICAgICAgICAgICAgIEFfZXhwLCBMX1NVQkZSLCAvKiAoaSkgOiBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAmZXhjW2lfc3ViZnJdLCAgLyogKGkpIDogaW5wdXQgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgJnN5bltpX3N1YmZyXSAgIC8qIChpL28pIDogZmlsdGVyIHN0YXRlcyAvIG91dHB1dCBzaWduYWwgICAgICAqLworICAgICk7CisKKyAgICBFX0xQQ19hX3dlaWdodCgKKyAgICAgICAgQSwgQSwKKyAgICAgICAgTV9MUF9GSUxURVJfT1JERVIpOyAvKiBvdmVyd3JpdGUgQSBhcyBpdCBpcyBub3QgbmVlZGVkIGFueSBsb25nZXIgKi8KKworICAgIEVfVVRJTF9yZXNpZHUoQSwgQV9leHAsICZzeW5baV9zdWJmcl0sIHRSZXMsIExfU1VCRlIpOworCisgICAgRGVlbXBoKHRSZXMsICZuc1tpX3N1YmZyXSwgTF9TVUJGUiwgJmFjZWxwX21lbS0+ZGVlbXBoX21lbV93c3luKTsKKworICAgIC8qIEFtcGxpdHVkZSBsaW1pdGVyIChzYXR1cmF0ZSBhdCB3c3luX3JtcykgKi8KKyAgICBmb3IgKGkgPSBpX3N1YmZyOyBpIDwgaV9zdWJmciArIExfU1VCRlI7IGkrKykgeworICAgICAgaWYgKG5zW2ldID4gdG1wKSB7CisgICAgICAgIG5zW2ldID0gdG1wOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG5zW2ldIDwgLXRtcCkgeworICAgICAgICAgIG5zW2ldID0gLXRtcDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIEVfVVRJTF9wcmVlbXBoKCZuc1tpX3N1YmZyXSwgdFJlcywgTF9TVUJGUik7CisKKyAgICBTeW5fZmlsdChBLCAgICAgICAgICAgICAgLyogKGkpIDogYVttXSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyAgICAgICAgICovCisgICAgICAgICAgICAgQV9leHAsIExfU1VCRlIsIC8qIChpKSA6IGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgIHRSZXMsICAgICAgICAgICAvKiAoaSkgOiBpbnB1dCBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAmc3luW2lfc3ViZnJdICAgLyogKGkvbykgOiBmaWx0ZXIgc3RhdGVzIC8gb3V0cHV0IHNpZ25hbCAgICAgICovCisgICAgKTsKKworICAgIEZES21lbW1vdmUoJnN5bnRoW2lfc3ViZnJdLCAmc3luW2lfc3ViZnJdLCBMX1NVQkZSICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIH0KKworICAvKiBzYXZlIG9sZCBleGNpdGF0aW9uIGFuZCBvbGQgc3ludGhlc2lzIG1lbW9yeSBmb3IgbmV4dCBBQ0VMUCBmcmFtZSAqLworICBGREttZW1jcHkoYWNlbHBfbWVtLT5vbGRfZXhjX21lbSwgZXhjICsgbERpdiAtIChQSVRfTUFYX01BWCArIExfSU5URVJQT0wpLAorICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIChQSVRfTUFYX01BWCArIExfSU5URVJQT0wpKTsKKyAgRkRLbWVtY3B5KGFjZWxwX21lbS0+b2xkX3N5bl9tZW0sIHN5bl9idWYgKyBsRGl2LAorICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIE1fTFBfRklMVEVSX09SREVSKTsKKyAgYWNlbHBfbWVtLT5kZV9lbXBoX21lbSA9IGFjZWxwX21lbS0+ZGVlbXBoX21lbV93c3luOworCisgIENfQUxMT0NfU0NSQVRDSF9FTkQoc3luX2J1ZiwgRklYUF9EQkwsIE1fTFBfRklMVEVSX09SREVSICsgTF9ESVYpOworICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGV4Y19idWYsIEZJWFBfREJMLCBQSVRfTUFYX01BWCArIExfSU5URVJQT0wgKyBMX0RJVik7Cit9CisKK3ZvaWQgQWNlbHBfUHJlUHJvY2Vzc2luZyhGSVhQX0RCTCAqc3ludGhfYnVmLCBGSVhQX0RCTCAqb2xkX3N5bnRoLCBJTlQgKnBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqb2xkX1RfcGYsIEZJWFBfREJMICpwaXRfZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqb2xkX2dhaW5fcGYsIElOVCBzYW1wbGluZ1JhdGUsIElOVCAqaV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNvcmVDb2RlckZyYW1lTGVuZ3RoLCBJTlQgc3luU2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuYlN1YmZyU3VwZXJmcikgeworICBpbnQgbjsKKworICAvKiBpbml0IGJlZ2lubmluZyBvZiBzeW50aF9idWYgd2l0aCBvbGQgc3ludGhlc2lzIGZyb20gcHJldmlvdXMgZnJhbWUgKi8KKyAgRkRLbWVtY3B5KHN5bnRoX2J1Ziwgb2xkX3N5bnRoLCBzaXplb2YoRklYUF9EQkwpICogKFBJVF9NQVhfTUFYIC0gQlBGX0RFTEFZKSk7CisKKyAgLyogY2FsY3VsYXRlIHBpdGNoIGxhZyBvZmZzZXQgZm9yIEFDRUxQIGRlY29kZXIgKi8KKyAgKmlfb2Zmc2V0ID0KKyAgICAgIChzYW1wbGluZ1JhdGUgKiBQSVRfTUlOXzEyazggKyAoRlNDQUxFX0RFTk9NIC8gMikpIC8gRlNDQUxFX0RFTk9NIC0KKyAgICAgIFBJVF9NSU5fMTJrODsKKworICAvKiBmb3IgYmFzcyBwb3N0ZmlsdGVyICovCisgIGZvciAobiA9IDA7IG4gPCBzeW5TZmQ7IG4rKykgeworICAgIHBpdGNoW25dID0gb2xkX1RfcGZbbl07CisgICAgcGl0X2dhaW5bbl0gPSBvbGRfZ2Fpbl9wZltuXTsKKyAgfQorICBmb3IgKG4gPSAwOyBuIDwgbmJTdWJmclN1cGVyZnI7IG4rKykgeworICAgIHBpdGNoW24gKyBzeW5TZmRdID0gTF9TVUJGUjsKKyAgICBwaXRfZ2FpbltuICsgc3luU2ZkXSA9IChGSVhQX0RCTCkwOworICB9Cit9CisKK3ZvaWQgQWNlbHBfUG9zdFByb2Nlc3NpbmcoRklYUF9EQkwgKnN5bnRoX2J1ZiwgRklYUF9EQkwgKm9sZF9zeW50aCwgSU5UICpwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpvbGRfVF9wZiwgSU5UIGNvcmVDb2RlckZyYW1lTGVuZ3RoLCBJTlQgc3luU2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbmJTdWJmclN1cGVyZnIpIHsKKyAgaW50IG47CisKKyAgLyogc3RvcmUgbGFzdCBwYXJ0IG9mIHN5bnRoX2J1ZiAod2hpY2ggaXMgbm90IGhhbmRsZWQgYnkgdGhlIElNRENUIG92ZXJsYXApCisgICAqIGZvciBuZXh0IGZyYW1lICovCisgIEZES21lbWNweShvbGRfc3ludGgsIHN5bnRoX2J1ZiArIGNvcmVDb2RlckZyYW1lTGVuZ3RoLAorICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIChQSVRfTUFYX01BWCAtIEJQRl9ERUxBWSkpOworCisgIC8qIGZvciBiYXNzIHBvc3RmaWx0ZXIgKi8KKyAgZm9yIChuID0gMDsgbiA8IHN5blNmZDsgbisrKSB7CisgICAgb2xkX1RfcGZbbl0gPSBwaXRjaFtuYlN1YmZyU3VwZXJmciArIG5dOworICB9Cit9CisKKyNkZWZpbmUgTF9GQUNfWklSIChMRkFDKQorCit2b2lkIENMcGRfQWNlbHBfWmlyKGNvbnN0IEZJWFBfTFBDIEFbXSwgY29uc3QgSU5UIEFfZXhwLAorICAgICAgICAgICAgICAgICAgICBDQWNlbHBTdGF0aWNNZW0gKmFjZWxwX21lbSwgY29uc3QgSU5UIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgemlyW10sIGludCBkb0RlZW1waCkgeworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQodG1wX2J1ZiwgRklYUF9EQkwsIExfRkFDX1pJUiArIE1fTFBfRklMVEVSX09SREVSKTsKKyAgRkRLX0FTU0VSVChsZW5ndGggPD0gTF9GQUNfWklSKTsKKworICBGREttZW1jcHkodG1wX2J1ZiwgYWNlbHBfbWVtLT5vbGRfc3luX21lbSwKKyAgICAgICAgICAgIE1fTFBfRklMVEVSX09SREVSICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbXNldCh0bXBfYnVmICsgTV9MUF9GSUxURVJfT1JERVIsIDAsIExfRkFDX1pJUiAqIHNpemVvZihGSVhQX0RCTCkpOworCisgIFN5bl9maWx0KEEsIEFfZXhwLCBsZW5ndGgsICZ0bXBfYnVmW01fTFBfRklMVEVSX09SREVSXSwKKyAgICAgICAgICAgJnRtcF9idWZbTV9MUF9GSUxURVJfT1JERVJdKTsKKyAgaWYgKCFkb0RlZW1waCkgeworICAgIC8qIGlmIGxhc3QgbHBkIG1vZGUgd2FzIFREIGNvbmNlYWxtZW50LCB0aGVuIGJ5cGFzcyBkZWVtcGggKi8KKyAgICBGREttZW1jcHkoemlyLCB0bXBfYnVmLCBsZW5ndGggKiBzaXplb2YoKnppcikpOworICB9IGVsc2UgeworICAgIERlZW1waCgmdG1wX2J1ZltNX0xQX0ZJTFRFUl9PUkRFUl0sICZ6aXJbMF0sIGxlbmd0aCwKKyAgICAgICAgICAgJmFjZWxwX21lbS0+ZGVfZW1waF9tZW0pOworICAgIHNjYWxlVmFsdWVzKHppciwgbGVuZ3RoLCAtQUNFTFBfT1VUU0NBTEUpOworICB9CisgIENfQUxMT0NfU0NSQVRDSF9FTkQodG1wX2J1ZiwgRklYUF9EQkwsIExfRkFDX1pJUiArIE1fTFBfRklMVEVSX09SREVSKTsKK30KKwordm9pZCBDTHBkX0FjZWxwUHJlcGFyZUludGVybmFsTWVtKGNvbnN0IEZJWFBfREJMICpzeW50aCwgVUNIQVIgbGFzdF9scGRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBsYXN0X2xhc3RfbHBkX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9MUEMgKkFfbmV3LCBjb25zdCBJTlQgQV9uZXdfZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfTFBDICpBX29sZCwgY29uc3QgSU5UIEFfb2xkX2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQWNlbHBTdGF0aWNNZW0gKmFjZWxwX21lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY29yZUNvZGVyRnJhbWVMZW5ndGgsIElOVCBjbGVhck9sZEV4YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBscGRfbW9kZSkgeworICBpbnQgbF9kaXYgPQorICAgICAgY29yZUNvZGVyRnJhbWVMZW5ndGggLyBOQl9ESVY7IC8qIGxlbmd0aCBvZiBvbmUgQUNFTFAvVENYMjAgZnJhbWUgKi8KKyAgaW50IGxfZGl2X3BhcnRpYWw7CisgIEZJWFBfREJMICpzeW4sICpvbGRfZXhjX21lbTsKKworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoc3ludGhfYnVmLCBGSVhQX0RCTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCArIE1fTFBfRklMVEVSX09SREVSKTsKKyAgc3luID0gJnN5bnRoX2J1ZltNX0xQX0ZJTFRFUl9PUkRFUl07CisKKyAgbF9kaXZfcGFydGlhbCA9IFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCAtIGxfZGl2OworICBvbGRfZXhjX21lbSA9IGFjZWxwX21lbS0+b2xkX2V4Y19tZW07CisKKyAgaWYgKGxwZF9tb2RlID09IDQpIHsKKyAgICAvKiBCeXBhc3MgRG9tYWluIGNvbnZlcnNpb24uIFRDWFREIENvbmNlYWxtZW50IGRvZXMgbm8gZGVlbXBoYXNpcyBpbiB0aGUKKyAgICAgKiBlbmQuICovCisgICAgRkRLbWVtY3B5KAorICAgICAgICBzeW50aF9idWYsICZzeW50aFstKFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCArIE1fTFBfRklMVEVSX09SREVSKV0sCisgICAgICAgIChQSVRfTUFYX01BWCArIExfSU5URVJQT0wgKyBNX0xQX0ZJTFRFUl9PUkRFUikgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAvKiBTZXQgZGVlbXBoYXNpcyBtZW1vcnkgc3RhdGUgZm9yIFREIGNvbmNlYWxtZW50ICovCisgICAgYWNlbHBfbWVtLT5kZWVtcGhfbWVtX3dzeW4gPSBzY2FsZVZhbHVlU2F0dXJhdGUoc3ludGhbLTFdLCBBQ0VMUF9PVVRTQ0FMRSk7CisgIH0gZWxzZSB7CisgICAgLyogY29udmVydCBwYXN0IFtQSVRfTUFYX01BWCtMX0lOVEVSUE9MK01fTFBfRklMVEVSX09SREVSXSBzeW50aGVzaXMgdG8KKyAgICAgKiBwcmVlbXBoIGRvbWFpbiAqLworICAgIEVfVVRJTF9wcmVlbXBoKCZzeW50aFstKFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCArIE1fTFBfRklMVEVSX09SREVSKV0sCisgICAgICAgICAgICAgICAgICAgc3ludGhfYnVmLCBQSVRfTUFYX01BWCArIExfSU5URVJQT0wgKyBNX0xQX0ZJTFRFUl9PUkRFUik7CisgICAgc2NhbGVWYWx1ZXNTYXR1cmF0ZShzeW50aF9idWYsIFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCArIE1fTFBfRklMVEVSX09SREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgQUNFTFBfT1VUU0NBTEUpOworICB9CisKKyAgLyogU2V0IGRlZW1waGFzaXMgbWVtb3J5IHN0YXRlICovCisgIGFjZWxwX21lbS0+ZGVfZW1waF9tZW0gPSBzY2FsZVZhbHVlU2F0dXJhdGUoc3ludGhbLTFdLCBBQ0VMUF9PVVRTQ0FMRSk7CisKKyAgLyogdXBkYXRlIGFjZWxwIHN5bnRoIGZpbHRlciBtZW1vcnkgKi8KKyAgRkRLbWVtY3B5KGFjZWxwX21lbS0+b2xkX3N5bl9tZW0sCisgICAgICAgICAgICAmc3luW1BJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCAtIE1fTFBfRklMVEVSX09SREVSXSwKKyAgICAgICAgICAgIE1fTFBfRklMVEVSX09SREVSICogc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgaWYgKGNsZWFyT2xkRXhjKSB7CisgICAgRkRLbWVtY2xlYXIob2xkX2V4Y19tZW0sIChQSVRfTUFYX01BWCArIExfSU5URVJQT0wpICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgQ19BTExPQ19TQ1JBVENIX0VORChzeW50aF9idWYsIEZJWFBfREJMLAorICAgICAgICAgICAgICAgICAgICAgICAgUElUX01BWF9NQVggKyBMX0lOVEVSUE9MICsgTV9MUF9GSUxURVJfT1JERVIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIHVwZGF0ZSBwYXN0IFtQSVRfTUFYX01BWCtMX0lOVEVSUE9MXSBzYW1wbGVzIG9mIGV4YyBtZW1vcnkgKi8KKyAgaWYgKGxhc3RfbHBkX21vZGUgPT0gMSkgeyAgICAgICAgLyogbGFzdCBmcmFtZSB3YXMgVENYMjAgKi8KKyAgICBpZiAobGFzdF9sYXN0X2xwZF9tb2RlID09IDApIHsgLyogQUNFTFAgLT4gVENYMjAgLT4gQUNFTFAgdHJhbnNpdGlvbiAqLworICAgICAgLyogRGVsYXkgdmFsaWQgcGFydCBvZiBleGNpdGF0aW9uIGJ1ZmZlciAoZnJvbSBwcmV2aW91cyBBQ0VMUCBmcmFtZSkgYnkKKyAgICAgICAqIGxfZGl2IHNhbXBsZXMgKi8KKyAgICAgIEZES21lbW1vdmUob2xkX2V4Y19tZW0sIG9sZF9leGNfbWVtICsgbF9kaXYsCisgICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkgKiBsX2Rpdl9wYXJ0aWFsKTsKKyAgICB9IGVsc2UgaWYgKGxhc3RfbGFzdF9scGRfbW9kZSA+IDApIHsgLyogVENYIC0+IFRDWDIwIC0+IEFDRUxQIHRyYW5zaXRpb24gKi8KKyAgICAgIEVfVVRJTF9yZXNpZHUoQV9vbGQsIEFfb2xkX2V4cCwgc3luLCBvbGRfZXhjX21lbSwgbF9kaXZfcGFydGlhbCk7CisgICAgfQorICAgIEVfVVRJTF9yZXNpZHUoQV9uZXcsIEFfbmV3X2V4cCwgc3luICsgbF9kaXZfcGFydGlhbCwKKyAgICAgICAgICAgICAgICAgIG9sZF9leGNfbWVtICsgbF9kaXZfcGFydGlhbCwgbF9kaXYpOworICB9IGVsc2UgeyAvKiBwcmV2IGZyYW1lIHdhcyBGRCwgVENYNDAgb3IgVENYODAgKi8KKyAgICBpbnQgZXhjX0FfbmV3X2xlbmd0aCA9IChjb3JlQ29kZXJGcmFtZUxlbmd0aCAvIDIgPiBQSVRfTUFYX01BWCArIExfSU5URVJQT0wpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQSVRfTUFYX01BWCArIExfSU5URVJQT0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvcmVDb2RlckZyYW1lTGVuZ3RoIC8gMjsKKyAgICBpbnQgZXhjX0Ffb2xkX2xlbmd0aCA9IFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCAtIGV4Y19BX25ld19sZW5ndGg7CisgICAgRV9VVElMX3Jlc2lkdShBX29sZCwgQV9vbGRfZXhwLCBzeW4sIG9sZF9leGNfbWVtLCBleGNfQV9vbGRfbGVuZ3RoKTsKKyAgICBFX1VUSUxfcmVzaWR1KEFfbmV3LCBBX25ld19leHAsICZzeW5bZXhjX0Ffb2xkX2xlbmd0aF0sCisgICAgICAgICAgICAgICAgICAmb2xkX2V4Y19tZW1bZXhjX0Ffb2xkX2xlbmd0aF0sIGV4Y19BX25ld19sZW5ndGgpOworICB9CisgIENfQUxMT0NfU0NSQVRDSF9FTkQoc3ludGhfYnVmLCBGSVhQX0RCTCwKKyAgICAgICAgICAgICAgICAgICAgICBQSVRfTUFYX01BWCArIExfSU5URVJQT0wgKyBNX0xQX0ZJTFRFUl9PUkRFUik7CisKKyAgcmV0dXJuOworfQorCitGSVhQX0RCTCAqQ0xwZF9BQ0VMUF9HZXRGcmVlRXhjTWVtKENBY2VscFN0YXRpY01lbSAqYWNlbHBfbWVtLCBJTlQgbGVuZ3RoKSB7CisgIEZES19BU1NFUlQobGVuZ3RoIDw9IFBJVF9NQVhfTUFYICsgTF9JTlRFUlBPTCk7CisgIHJldHVybiBhY2VscF9tZW0tPm9sZF9leGNfbWVtOworfQorCitJTlQgQ0xwZF9BY2VscFJlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBDQWNlbHBDaGFubmVsRGF0YSAqYWNlbHAsCisgICAgICAgICAgICAgICAgICAgSU5UIGFjZWxwX2NvcmVfbW9kZSwgSU5UIGNvcmVDb2RlckZyYW1lTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgIElOVCBpX29mZnNldCkgeworICBpbnQgbmJfc3ViZnIgPSBjb3JlQ29kZXJGcmFtZUxlbmd0aCAvIExfRElWOworICBjb25zdCBVQ0hBUiAqbnVtX2FjYl9pbmRleF9iaXRzID0KKyAgICAgIChuYl9zdWJmciA9PSA0KSA/IG51bV9hY2JfaWR4X2JpdHNfdGFibGVbMF0gOiBudW1fYWNiX2lkeF9iaXRzX3RhYmxlWzFdOworICBpbnQgbmJpdHM7CisgIGludCBlcnJvciA9IDA7CisKKyAgY29uc3QgaW50IFBJVF9NSU4gPSBQSVRfTUlOXzEyazggKyBpX29mZnNldDsKKyAgY29uc3QgaW50IFBJVF9GUjIgPSBQSVRfRlIyXzEyazggLSBpX29mZnNldDsKKyAgY29uc3QgaW50IFBJVF9GUjEgPSBQSVRfRlIxXzEyazg7CisgIGNvbnN0IGludCBQSVRfTUFYID0gUElUX01BWF8xMms4ICsgKDYgKiBpX29mZnNldCk7CisgIGludCBUMCwgVDBfZnJhYywgVDBfbWluID0gMCwgVDBfbWF4OworCisgIGlmIChQSVRfTUFYID4gUElUX01BWF9NQVgpIHsKKyAgICBlcnJvciA9IEFBQ19ERUNfREVDT0RFX0ZSQU1FX0VSUk9SOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIGFjZWxwLT5hY2VscF9jb3JlX21vZGUgPSBhY2VscF9jb3JlX21vZGU7CisKKyAgbmJpdHMgPSBNYXBDb3JlTW9kZTJOQml0cyhhY2VscF9jb3JlX21vZGUpOworCisgIC8qIGRlY29kZSBtZWFuIGVuZXJneSB3aXRoIDIgYml0cyA6IDE4LCAzMCwgNDIgb3IgNTQgZEIgKi8KKyAgYWNlbHAtPm1lYW5fZW5lcmd5ID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsKKworICBmb3IgKGludCBzZnIgPSAwOyBzZnIgPCBuYl9zdWJmcjsgc2ZyKyspIHsKKyAgICAvKiByZWFkIEFDQiBpbmRleCBhbmQgc3RvcmUgVDAgYW5kIFQwX2ZyYWMgZm9yIGVhY2ggQUNFTFAgc3ViZnJhbWUuICovCisgICAgZXJyb3IgPSBEZWNvZGVQaXRjaExhZyhoQnMsIG51bV9hY2JfaW5kZXhfYml0c1tzZnJdLCBQSVRfTUlOLCBQSVRfRlIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUElUX0ZSMSwgUElUX01BWCwgJlQwLCAmVDBfZnJhYywgJlQwX21pbiwgJlQwX21heCk7CisgICAgaWYgKGVycm9yKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgIGFjZWxwLT5UMFtzZnJdID0gKFVTSE9SVClUMDsKKyAgICBhY2VscC0+VDBfZnJhY1tzZnJdID0gKFVDSEFSKVQwX2ZyYWM7CisgICAgYWNlbHAtPmx0cF9maWx0ZXJpbmdfZmxhZ1tzZnJdID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICBzd2l0Y2ggKG5iaXRzKSB7CisgICAgICBjYXNlIDEyOiAvKiAxMiBiaXRzIEFNUi1XQiBjb2RlYm9vayBpcyB1c2VkICovCisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVswXSA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVsxXSA9IEZES3JlYWRCaXRzKGhCcywgNSk7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVsyXSA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVszXSA9IEZES3JlYWRCaXRzKGhCcywgNSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNjogLyogMTYgYml0cyBBTVItV0IgY29kZWJvb2sgaXMgdXNlZCAqLworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bMF0gPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bMV0gPSBGREtyZWFkQml0cyhoQnMsIDUpOworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bMl0gPSBGREtyZWFkQml0cyhoQnMsIDUpOworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bM10gPSBGREtyZWFkQml0cyhoQnMsIDUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjA6IC8qIDIwIGJpdHMgQU1SLVdCIGNvZGVib29rIGlzIHVzZWQgKi8KKyAgICAgICAgYWNlbHAtPmljYl9pbmRleFtzZnJdWzBdID0gRkRLcmVhZEJpdHMoaEJzLCA1KTsKKyAgICAgICAgYWNlbHAtPmljYl9pbmRleFtzZnJdWzFdID0gRkRLcmVhZEJpdHMoaEJzLCA1KTsKKyAgICAgICAgYWNlbHAtPmljYl9pbmRleFtzZnJdWzJdID0gRkRLcmVhZEJpdHMoaEJzLCA1KTsKKyAgICAgICAgYWNlbHAtPmljYl9pbmRleFtzZnJdWzNdID0gRkRLcmVhZEJpdHMoaEJzLCA1KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI4OiAvKiAyOCBiaXRzIEFNUi1XQiBjb2RlYm9vayBpcyB1c2VkICovCisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVswXSA9IEZES3JlYWRCaXRzKGhCcywgOSk7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVsxXSA9IEZES3JlYWRCaXRzKGhCcywgOSk7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVsyXSA9IEZES3JlYWRCaXRzKGhCcywgNSk7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVszXSA9IEZES3JlYWRCaXRzKGhCcywgNSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzNjogLyogMzYgYml0cyBBTVItV0IgY29kZWJvb2sgaXMgdXNlZCAqLworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bMF0gPSBGREtyZWFkQml0cyhoQnMsIDkpOworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bMV0gPSBGREtyZWFkQml0cyhoQnMsIDkpOworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bMl0gPSBGREtyZWFkQml0cyhoQnMsIDkpOworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bM10gPSBGREtyZWFkQml0cyhoQnMsIDkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDQ6IC8qIDQ0IGJpdHMgQU1SLVdCIGNvZGVib29rIGlzIHVzZWQgKi8KKyAgICAgICAgYWNlbHAtPmljYl9pbmRleFtzZnJdWzBdID0gRkRLcmVhZEJpdHMoaEJzLCAxMyk7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVsxXSA9IEZES3JlYWRCaXRzKGhCcywgMTMpOworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bMl0gPSBGREtyZWFkQml0cyhoQnMsIDkpOworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bM10gPSBGREtyZWFkQml0cyhoQnMsIDkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNTI6IC8qIDUyIGJpdHMgQU1SLVdCIGNvZGVib29rIGlzIHVzZWQgKi8KKyAgICAgICAgYWNlbHAtPmljYl9pbmRleFtzZnJdWzBdID0gRkRLcmVhZEJpdHMoaEJzLCAxMyk7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVsxXSA9IEZES3JlYWRCaXRzKGhCcywgMTMpOworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bMl0gPSBGREtyZWFkQml0cyhoQnMsIDEzKTsKKyAgICAgICAgYWNlbHAtPmljYl9pbmRleFtzZnJdWzNdID0gRkRLcmVhZEJpdHMoaEJzLCAxMyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2NDogLyogNjQgYml0cyBBTVItV0IgY29kZWJvb2sgaXMgdXNlZCAqLworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bMF0gPSBGREtyZWFkQml0cyhoQnMsIDIpOworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bMV0gPSBGREtyZWFkQml0cyhoQnMsIDIpOworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bMl0gPSBGREtyZWFkQml0cyhoQnMsIDIpOworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bM10gPSBGREtyZWFkQml0cyhoQnMsIDIpOworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bNF0gPSBGREtyZWFkQml0cyhoQnMsIDE0KTsKKyAgICAgICAgYWNlbHAtPmljYl9pbmRleFtzZnJdWzVdID0gRkRLcmVhZEJpdHMoaEJzLCAxNCk7CisgICAgICAgIGFjZWxwLT5pY2JfaW5kZXhbc2ZyXVs2XSA9IEZES3JlYWRCaXRzKGhCcywgMTQpOworICAgICAgICBhY2VscC0+aWNiX2luZGV4W3Nmcl1bN10gPSBGREtyZWFkQml0cyhoQnMsIDE0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBGREtfQVNTRVJUKDApOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgYWNlbHAtPmdhaW5zW3Nmcl0gPSBGREtyZWFkQml0cyhoQnMsIDcpOworICB9CisKK2JhaWw6CisgIHJldHVybiBlcnJvcjsKK30KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19hY2VscC5oIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX2FjZWxwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRlNDFmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19hY2VscC5oCkBAIC0wLDAgKzEsMjgxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXR0aGlhcyBIaWxkZW5icmFuZAorCisgICBEZXNjcmlwdGlvbjogVVNBQyBBQ0VMUCBmcmFtZSBkZWNvZGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVVNBQ0RFQ19BQ0VMUF9ICisjZGVmaW5lIFVTQUNERUNfQUNFTFBfSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJ1c2FjZGVjX2NvbnN0LmgiCisjaW5jbHVkZSAidXNhY2RlY19yb20uaCIKKworLy8jZGVmaW5lIEVOSEFOQ0VEX1RDWF9URF9DT05DRUFMX0VOQUJMRQorCisvKiogU3RydWN0dXJlIHdoaWNoIGhvbGRzIHRoZSBBQ0VMUCBpbnRlcm5hbCBwZXJzaXN0ZW50IG1lbW9yeSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBGSVhQX0RCTCBvbGRfZXhjX21lbVtQSVRfTUFYX01BWCArIExfSU5URVJQT0xdOworICBGSVhQX0RCTCBvbGRfc3luX21lbVtNX0xQX0ZJTFRFUl9PUkRFUl07IC8qIHN5bnRoZXNpcyBmaWx0ZXIgc3RhdGVzICovCisgIEZJWFBfU0dMIEFbTV9MUF9GSUxURVJfT1JERVJdOworICBJTlQgQV9leHA7CisgIEZJWFBfREJMIGdjX3RocmVzaG9sZDsKKyAgRklYUF9EQkwgZGVfZW1waF9tZW07CisgIEZJWFBfU0dMIHBhc3RfZ3BpdDsKKyAgRklYUF9EQkwgcGFzdF9nY29kZTsKKyAgVVNIT1JUIG9sZF9UMDsKKyAgVUNIQVIgb2xkX1QwX2ZyYWM7CisgIEZJWFBfREJMIGRlZW1waF9tZW1fd3N5bjsKKyAgRklYUF9EQkwgd3N5bl9ybXM7CisgIFNIT1JUIHNlZWRfYWNlOworfSBDQWNlbHBTdGF0aWNNZW07CisKKy8qKiBTdHJ1Y3R1cmUgd2hpY2ggaG9sZHMgdGhlIHBhcmFtZXRlciBkYXRhIG5lZWRlZCB0byBkZWNvZGUgb25lIEFDRUxQIGZyYW1lLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSCisgIGFjZWxwX2NvcmVfbW9kZTsgICAvKio8IG1lYW4gZXhjaXRhdGlvbiBlbmVyZ3kgaW5kZXggZm9yIHdob2xlIEFDRUxQIGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgVUNIQVIgbWVhbl9lbmVyZ3k7IC8qKjwgYWNlbHAgY29yZSBtb2RlIGZvciB3aG9sZSBBQ0VMUCBmcmFtZSAqLworICBVU0hPUlQgVDBbTkJfU1VCRlJdOworICBVQ0hBUiBUMF9mcmFjW05CX1NVQkZSXTsKKyAgVUNIQVIgbHRwX2ZpbHRlcmluZ19mbGFnW05CX1NVQkZSXTsgLyoqPCBjb250cm9sbHMgd2hldGhlciBMVFAgcG9zdGZpbHRlciBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUgZm9yIGVhY2ggQUNFTFAgc3ViZnJhbWUgKi8KKyAgU0hPUlQgaWNiX2luZGV4W05CX1NVQkZSXQorICAgICAgICAgICAgICAgICBbOF07IC8qKjwgaW5ub3ZhdGl2ZSBjb2RlYm9vayBpbmRleCBmb3IgZWFjaCBBQ0VMUCBzdWJmcmFtZSAqLworICBVQ0hBUiBnYWluc1tOQl9TVUJGUl07IC8qKjwgZ2FpbiBpbmRleCBmb3IgZWFjaCBBQ0VMUCBzdWJmcmFtZSAqLworfSBDQWNlbHBDaGFubmVsRGF0YTsKKworLyoqCisgKiBcYnJpZWYgUmVhZCB0aGUgYWNlbHBfY29kaW5nKCkgYml0c3RyZWFtIHBhcnQuCisgKiBccGFyYW1baW5dIGhCcyBiaXRzdHJlYW0gaGFuZGxlIHRvIHJlYWQgZGF0YSBmcm9tLgorICogXHBhcmFtW291dF0gYWNlbHBEYXRhIHBvaW50ZXIgdG8gc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBwYXJzZWQgZGF0YSBvZiBvbmUKKyAqIEFDRUxQIGZyYW1lLgorICogXHBhcmFtW2luXSBhY2VscF9jb3JlX21vZGUgdGhlIEFDRUxQIGNvcmUgbW9kZSBpbmRleC4KKyAqIFxwYXJhbVtpbl0gY29yZUNvZGVyRnJhbWVMZW5ndGggbGVuZ3RoIG9mIGNvcmUgY29kZXIgZnJhbWUgKDEwMjR8NzY4KQorICovCitJTlQgQ0xwZF9BY2VscFJlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBDQWNlbHBDaGFubmVsRGF0YSAqYWNlbHBEYXRhLAorICAgICAgICAgICAgICAgICAgIElOVCBhY2VscF9jb3JlX21vZGUsIElOVCBpX29mZnNldCwgSU5UIGNvcmVDb2RlckZyYW1lTGVuZ3RoKTsKKy8qKgorICogXGJyaWVmIEluaXRpYWxpemF0aW9uIG9mIG1lbW9yeSBiZWZvcmUgb25lIExQRCBmcmFtZSBpcyBkZWNvZGVkCisgKiBccGFyYW1bb3V0XSBzeW50aF9idWYgc3ludGhlc2lzIGJ1ZmZlciB0byBiZSBpbml0aWFsaXplZCwgZXhwb25lbnQgPSBTRl9TWU5USAorICogXHBhcmFtW2luXSBvbGRfc3ludGggcGFzdCBzeW50aGVzaXMgb2YgcHJldmlvdXMgTFBEIGZyYW1lLCBleHBvbmVudCA9CisgKiBTRl9TWU5USAorICogXHBhcmFtW291dF0gc3ludGhfYnVmX2ZiIGZ1bGxiYW5kIHN5bnRoZXNpcyBidWZmZXIgdG8gYmUgaW5pdGlhbGl6ZWQsCisgKiBleHBvbmVudCA9IFNGX1NZTlRICisgKiBccGFyYW1baW5dIG9sZF9zeW50aF9mYiBwYXN0IGZ1bGxiYW5kIHN5bnRoZXNpcyBvZiBwcmV2aW91cyBMUEQgZnJhbWUsCisgKiBleHBvbmVudCA9IFNGX1NZTlRICisgKiBccGFyYW1bb3V0XSBwaXRjaCB2ZWN0b3Igd2hlcmUgZGVjb2RlZCBwaXRjaCBsYWcgdmFsdWVzIGFyZSBzdG9yZWQKKyAqIFxwYXJhbVtpbl0gb2xkX1RfcGYgcGFzdCBwaXRjaCBsYWcgdmFsdWVzIG9mIHByZXZpb3VzIExQRCBmcmFtZQorICogXHBhcmFtW2luXSBzYW1wbGluZ1JhdGUgc2FtcGxpbmcgcmF0ZSBmb3IgcGl0Y2ggbGFnIG9mZnNldCBjYWxjdWxhdGlvbgorICogXHBhcmFtW291dF0gaV9vZmZzZXQgcGl0Y2ggbGFnIG9mZnNldCBmb3IgdGhlIGRlY29kaW5nIG9mIHRoZSBwaXRjaCBsYWcKKyAqIFxwYXJhbVtpbl0gY29yZUNvZGVyRnJhbWVMZW5ndGggbGVuZ3RoIG9mIGNvcmUgY29kZXIgZnJhbWUgKDEwMjR8NzY4KQorICovCit2b2lkIEFjZWxwX1ByZVByb2Nlc3NpbmcoRklYUF9EQkwgKnN5bnRoX2J1ZiwgRklYUF9EQkwgKm9sZF9zeW50aCwgSU5UICpwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm9sZF9UX3BmLCBGSVhQX0RCTCAqcGl0X2dhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm9sZF9nYWluX3BmLCBJTlQgc2FtcGxpbmdSYXRlLCBJTlQgKmlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjb3JlQ29kZXJGcmFtZUxlbmd0aCwgSU5UIHN5blNmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbmJTdWJmclN1cGVyZnIpOworCisvKioKKyAqIFxicmllZiBTYXZlIHRhaWwgb2YgYnVmZmVycyBmb3IgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBuZXh0IExQRCBmcmFtZQorICogXHBhcmFtW2luXSBzeW50aF9idWYgc3ludGhlc2lzIG9mIGN1cnJlbnQgTFBEIGZyYW1lLCBleHBvbmVudCA9IFNGX1NZTlRICisgKiBccGFyYW1bb3V0XSBvbGRfc3ludGggbWVtb3J5IHdoZXJlIHRhaWwgb2YgZnVsbGJhbmQgc3ludGhfYnVmIGlzIHN0b3JlZCwKKyAqIGV4cG9uZW50ID0gU0ZfU1lOVEgKKyAqIFxwYXJhbVtpbl0gc3ludGhfYnVmX2ZiIGZ1bGxiYW5kIHN5bnRoZXNpcyBvZiBjdXJyZW50IExQRCBmcmFtZSwgZXhwb25lbnQgPQorICogU0ZfU1lOVEgKKyAqIFxwYXJhbVtvdXRdIG9sZF9zeW50aF9mYiBtZW1vcnkgd2hlcmUgdGFpbCBvZiBmdWxsYmFuZCBzeW50aF9idWYgaXMgc3RvcmVkLAorICogZXhwb25lbnQgPSBTRl9TWU5USAorICogXHBhcmFtW2luXSBwaXRjaCBkZWNvZGVkIHBpdGNoIGxhZyB2YWx1ZXMgb2YgY3VycmVudCBMUEQgZnJhbWUKKyAqIFxwYXJhbVtvdXRdIG9sZF9UX3BmIG1lbW9yeSB3aGVyZSBsYXN0IFNZTl9TRkQgcGl0Y2ggbGFnIHZhbHVlcyBhcmUgc3RvcmVkCisgKi8KK3ZvaWQgQWNlbHBfUG9zdFByb2Nlc3NpbmcoRklYUF9EQkwgKnN5bnRoX2J1ZiwgRklYUF9EQkwgKm9sZF9zeW50aCwgSU5UICpwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpvbGRfVF9wZiwgSU5UIGNvcmVDb2RlckZyYW1lTGVuZ3RoLCBJTlQgc3luU2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbmJTdWJmclN1cGVyZnIpOworCisvKioKKyAqIFxicmllZiBEZWNvZGUgb25lIEFDRUxQIGZyYW1lICh0aHJlZSBvciBmb3VyIEFDRUxQIHN1YmZyYW1lcyB3aXRoIDY0IHNhbXBsZXMKKyAqIGVhY2gpCisgKiBccGFyYW1baW4sb3V0XSBhY2VscF9tZW0gcG9pbnRlciB0byBBQ0VMUCBtZW1vcnkgc3RydWN0dXJlCisgKiBccGFyYW1baW5dIGlfb2Zmc2V0IHBpdGNoIGxhZyBvZmZzZXQKKyAqIFxwYXJhbVtpbl0gbHNwX29sZCBMUEMgZmlsdGVyIGluIExTUCBkb21haW4gY29ycmVzcG9uZGluZyB0byBwcmV2aW91cyBmcmFtZQorICogXHBhcmFtW2luXSBsc3BfbmV3IExQQyBmaWx0ZXIgaW4gTFNQIGRvbWFpbiBjb3JyZXNwb25kaW5nIHRvIGN1cnJlbnQgZnJhbWUKKyAqIFxwYXJhbVtpbl0gc3RhYl9mYWMgc3RhYmlsaXR5IGZhY3RvciBjb25zdHJhaW5lZCBieSAwPD1zdGFiX2ZhYzw9MS4wLAorICogZXhwb25lbnQgPSBTRl9TVEFCCisgKiBccGFyYW1baW5dIGFjZWxwRGF0YSBwb2ludGVyIHRvIHN0cnVjdCB3aXRoIGRhdGEgd2hpY2ggaXMgbmVlZGVkIGZvciBkZWNvZGluZworICogb25lIEFDRUxQIGZyYW1lCisgKiBccGFyYW1bb3V0XSBzeW50aCBBQ0VMUCBvdXRwdXQgc2lnbmFsCisgKiBccGFyYW1bb3V0XSBwVCBmb3VyIGRlY29kZWQgcGl0Y2ggbGFnIHZhbHVlcworICogXHBhcmFtW2luXSBjb3JlQ29kZXJGcmFtZUxlbmd0aCBsZW5ndGggb2YgY29yZSBjb2RlciBmcmFtZSAoMTAyNHw3NjgpCisgKi8KK3ZvaWQgQ0xwZF9BY2VscERlY29kZShDQWNlbHBTdGF0aWNNZW0gKmFjZWxwX21lbSwgSU5UIGlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfTFBDIGxzcF9vbGRbTV9MUF9GSUxURVJfT1JERVJdLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfTFBDIGxzcF9uZXdbTV9MUF9GSUxURVJfT1JERVJdLAorICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMIHN0YWJfZmFjLCBDQWNlbHBDaGFubmVsRGF0YSAqYWNlbHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1Mb3N0U3ViZnJhbWVzLCBpbnQgbGFzdExwY0xvc3QsIGludCBmcmFtZUNudCwKKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBzeW50aFtdLCBpbnQgcFRbXSwgRklYUF9EQkwgKnBpdF9nYWluLAorICAgICAgICAgICAgICAgICAgICAgIElOVCBjb3JlQ29kZXJGcmFtZUxlbmd0aCk7CisKKy8qKgorICogXGJyaWVmIFJlc2V0IEFDRUxQIGludGVybmFsIG1lbW9yeS4KKyAqIFxwYXJhbVtvdXRdIGFjZWxwX21lbSBwb2ludGVyIHRvIEFDRUxQIG1lbW9yeSBzdHJ1Y3R1cmUKKyAqLwordm9pZCBDTHBkX0FjZWxwUmVzZXQoQ0FjZWxwU3RhdGljTWVtICphY2VscF9tZW0pOworCisvKioKKyAqIFxicmllZiBJbml0aWFsaXplIEFDRUxQIGludGVybmFsIG1lbW9yeSBpbiBjYXNlIG9mIEZBQyBiZWZvcmUgQUNFTFAgZGVjb2RlcgorICogaXMgY2FsbGVkCisgKiBccGFyYW1baW5dIHN5bnRoIHBvaW50cyB0byBlbmQrMSBvZiBwYXN0IHZhbGlkIHN5bnRoZXNpcyBzaWduYWwsIGV4cG9uZW50ID0KKyAqIFNGX1NZTlRICisgKiBccGFyYW1baW5dIGxhc3RfbHBkX21vZGUgbGFzdCBscGQgbW9kZQorICogXHBhcmFtW2luXSBsYXN0X2xhc3RfbHBkX21vZGUgbHBkIG1vZGUgYmVmb3JlIGxhc3RfbHBkX21vZGUKKyAqIFxwYXJhbVtpbl0gQV9uZXcgTFAgc3ludGhlc2lzIGZpbHRlciBjb2VmZnMgY29ycmVzcG9uZGluZyB0byBsYXN0IGZyYW1lLAorICogZXhwb25lbnQgPSBTRl9BX0NPRUZGUworICogXHBhcmFtW2luXSBBX29sZCBMUCBzeW50aGVzaXMgZmlsdGVyIGNvZWZmcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBmcmFtZSBiZWZvcmUKKyAqIGxhc3QgZnJhbWUsIGV4cG9uZW50ID0gU0ZfQV9DT0VGRlMKKyAqIFxwYXJhbVtpbixvdXRdIGFjZWxwX21lbSBwb2ludGVyIHRvIEFDRUxQIG1lbW9yeSBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gY29yZUNvZGVyRnJhbWVMZW5ndGggbGVuZ3RoIG9mIGNvcmUgY29kZXIgZnJhbWUgKDEwMjR8NzY4KQorICovCit2b2lkIENMcGRfQWNlbHBQcmVwYXJlSW50ZXJuYWxNZW0oY29uc3QgRklYUF9EQkwgKnN5bnRoLCBVQ0hBUiBsYXN0X2xwZF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGxhc3RfbGFzdF9scGRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0xQQyAqQV9uZXcsIGNvbnN0IElOVCBBX25ld19leHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9MUEMgKkFfb2xkLCBjb25zdCBJTlQgQV9vbGRfZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBY2VscFN0YXRpY01lbSAqYWNlbHBfbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjb3JlQ29kZXJGcmFtZUxlbmd0aCwgSU5UIGNsZWFyT2xkRXhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGxwZF9tb2RlKTsKKworLyoqCisgKiBcYnJpZWYgQ2FsY3VsYXRlIHplcm8gaW5wdXQgcmVzcG9uc2UgKHppcikgb2YgdGhlIGFjZWxwIHN5bnRoZXNpcyBmaWx0ZXIKKyAqIFxwYXJhbVtpbl0gQSBMUCBzeW50aGVzaXMgZmlsdGVyIGNvZWZmaWNpZW50cywgZXhwb25lbnQgPSBTRl9BX0NPRUZGUworICogXHBhcmFtW2luLG91dF0gYWNlbHBfbWVtIHBvaW50ZXIgdG8gQUNFTFAgbWVtb3J5IHN0cnVjdHVyZQorICogXHBhcmFtW2luXSBsZW5ndGggbGVuZ3RoIG9mIHppcgorICogXHBhcmFtW291dF0gemlyIHBvaW50ZXIgdG8gemlyIG91dHB1dCBidWZmZXIsIGV4cG9uZW50ID0gU0ZfU1lOVEgKKyAqLwordm9pZCBDTHBkX0FjZWxwX1ppcihjb25zdCBGSVhQX0xQQyBBW10sIGNvbnN0IElOVCBBX2V4cCwKKyAgICAgICAgICAgICAgICAgICAgQ0FjZWxwU3RhdGljTWVtICphY2VscF9tZW0sIGNvbnN0IElOVCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHppcltdLCBpbnQgZG9EZWVtcGgpOworCisvKioKKyAqIFxicmllZiBCb3Jyb3cgc3RhdGljIGV4Y2l0YXRpb24gbWVtb3J5IGZyb20gQUNFTFAgZGVjb2RlcgorICogXHBhcmFtW2luXSBhY2VscF9tZW0gcG9pbnRlciB0byBBQ0VMUCBtZW1vcnkgc3RydWN0dXJlCisgKiBccGFyYW1baW5dIGxlbmd0aCBudW1iZXIgb2YgcmVxdWVzdGVkIEZJWFBfREJMIHZhbHVlcworICogXHJldHVybiBwb2ludGVyIHRvIHJlcXVlc3RlZCBtZW1vcnkKKyAqCisgKiBUaGUgY2FsbGVyIGhhcyB0byB0YWtlIGNhcmUgbm90IHRvIG92ZXJ3cml0ZSB2YWxpZCBtZW1vcnkgYXJlYXMuCisgKiBEdXJpbmcgVENYL0ZBQyBjYWxjdWxhdGlvbnMgYW5kIGJlZm9yZSBDTHBkX0FjZWxwUHJlcGFyZUludGVybmFsTWVtKCkgaXMKKyAqIGNhbGxlZCwgdGhlIGZvbGxvd2luZyBtZW1vcnkgc2l6ZSBpcyBhdmFpbGFibGU6CisgKiAtIDI1NiBzYW1wbGVzIGluIGNhc2Ugb2YgQUNFTFAgLT4gVENYMjAgLT4gQUNFTFAgdHJhbnNpdGlvbgorICogLSBQSVRfTUFYX01BWCtMX0lOVEVSUE9MIHNhbXBsZXMgaW4gYWxsIG90aGVyIGNhc2VzCisgKi8KK0ZJWFBfREJMICpDTHBkX0FDRUxQX0dldEZyZWVFeGNNZW0oQ0FjZWxwU3RhdGljTWVtICphY2VscF9tZW0sIElOVCBsZW5ndGgpOworCit2b2lkIENMcGRfVGN4VERDb25jZWFsKENBY2VscFN0YXRpY01lbSAqYWNlbHBfbWVtLCBTSE9SVCAqcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfTFBDIGxzcF9vbGRbTV9MUF9GSUxURVJfT1JERVJdLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0xQQyBsc3BfbmV3W01fTFBfRklMVEVSX09SREVSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgc3RhYl9mYWMsIElOVCBudW1Mb3N0U3ViZnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBzeW50aFtdLCBJTlQgY29yZUNvZGVyRnJhbWVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGxhc3RfdGN4X25vaXNlX2ZhY3Rvcik7CisKK2lubGluZSBTSE9SVCBFX1VUSUxfcmFuZG9tKFNIT1JUICpzZWVkKSB7CisgICpzZWVkID0gKFNIT1JUKSgoKChMT05HKSpzZWVkICogKExPTkcpMzE4MjEpID4+IDEpICsgKExPTkcpMTM4NDkpOworICByZXR1cm4gKCpzZWVkKTsKK30KKworI2VuZGlmIC8qIFVTQUNERUNfQUNFTFBfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy91c2FjZGVjX2NvbnN0LmggYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfY29uc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RiYWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX2NvbnN0LmgKQEAgLTAsMCArMSwyMDIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKKworICAgRGVzY3JpcHRpb246IFVTQUMgcmVsYXRlZCBjb25zdGFudHMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBVU0FDREVDX0NPTlNUX0gKKyNkZWZpbmUgVVNBQ0RFQ19DT05TVF9ICisKKy8qIHNjYWxlIGZhY3RvcnMgKi8KKyNkZWZpbmUgU0ZfQ09ERSA2ICAgICAgIC8qIGV4cG9uZW50IG9mIGNvZGVbXSwgZml4ZWQgY29kZWJvb2sgdmVjdG9yICovCisjZGVmaW5lIFNGX0dBSU5fQyAxNiAgICAvKiBleHBvbmVudCBvZiBnYWluIGNvZGUgYW5kIHNtb290aGVkIGdhaW4gY29kZSAqLworI2RlZmluZSBTRl9FWEMgMTYgICAgICAgLyogZXhwb25lbnQgb2YgZXhjW10gYW5kIGV4YzJbXSwgZXhjaXRhdGlvbiBidWZmZXIgKi8KKyNkZWZpbmUgU0ZfR0FJTl9QIDEgICAgIC8qIGV4cG9uZW50IG9mIGdhaW5fcGl0ICovCisjZGVmaW5lIFNGX1BGQUMgMCAgICAgICAvKiBleHBvbmVudCBvZiBwZXJpb2Qvdm9pY2luZyBmYWN0b3IgKi8KKyNkZWZpbmUgU0ZfU1lOVEggU0ZfRVhDIC8qIGV4cG9uZW50IG9mIHN5bnRoZXNpcyBidWZmZXIgKi8KKyNkZWZpbmUgU0ZfQV9DT0VGRlMgMyAgIC8qIGV4cG9uZW50IG9mIExQIGRvbWFpbiBzeW50aGVzaXMgZmlsdGVyIGNvZWZmaWNpZW50ICovCisjZGVmaW5lIFNGX1NUQUIgMSAgICAgICAvKiBleHBvbmVudCBvZiBzdGFiaWxpdHkgZmFjdG9yICovCisKKy8qIGRlZmluaXRpb25zIHdoaWNoIGFyZSBpbmRlcGVuZGVudCBvZiBjb3JlQ29kZXJGcmFtZUxlbmd0aCAqLworI2RlZmluZSBNX0xQX0ZJTFRFUl9PUkRFUiAxNiAvKiBMUCBmaWx0ZXIgb3JkZXIgKi8KKworI2RlZmluZSBQSVRfTUlOXzEyazggMzQgICAgLyogTWluaW11bSBwaXRjaCBsYWcgd2l0aCByZXNvbHV0aW9uIDEvNCAqLworI2RlZmluZSBQSVRfTUFYXzEyazggMjMxICAgLyogTWF4aW11bSBwaXRjaCBsYWcgZm9yIGZzPTEyLjhrSHogKi8KKyNkZWZpbmUgRlNDQUxFX0RFTk9NIDEyODAwIC8qIEZyZXF1ZW5jeSBzY2FsZSBkZW5vbWluYXRvciAqLworI2RlZmluZSBGQUNfRlNDQUxFX01JTiBcCisgIDYwMDAgLyogTWluaW11bSBhbGxvd2VkIGZyZXF1ZW5jeSBzY2FsZSBmb3IgYWNlbHAgZGVjb2RlciAqLworCisjaWYgIWRlZmluZWQoTFBEX01BWF9DT1JFX1NSKQorI2RlZmluZSBMUERfTUFYX0NPUkVfU1IgMjQwMDAgLyogRGVmYXVsdCB2YWx1ZSBmcm9tIHJlZiBzb2Z0ICovCisjZW5kaWYKKyNkZWZpbmUgRkFDX0ZTQ0FMRV9NQVggXAorICBMUERfTUFYX0NPUkVfU1IgLyogTWF4aW11bSBhbGxvd2VkIGZyZXF1ZW5jeSBzY2FsZSBmb3IgYWNlbHAgZGVjb2RlciAqLworCisvKiBNYXhpbXVtIHBpdGNoIGxhZyAoPSA0MTEgZm9yIGZzX21heCA9IDI0MDAwKSAqLworI2RlZmluZSBQSVRfTUFYX1RNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFBJVF9NQVhfMTJrOCArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoNiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKChGQUNfRlNDQUxFX01BWCAqIFBJVF9NSU5fMTJrOCkgKyAoRlNDQUxFX0RFTk9NIC8gMikpIC8gRlNDQUxFX0RFTk9NKSAtIFwKKyAgICAgUElUX01JTl8xMms4KSkpCisjaWYgKFBJVF9NQVhfVE1QIDwgXAorICAgICAyNTYpIC8qIGNhbm5vdCBiZSBzbWFsbGVyIGJlY2F1c2Ugb2YgdGN4IHRpbWUgZG9tYWluIGNvbmNlYWxtZW50ICovCisjZGVmaW5lIFBJVF9NQVhfTUFYIDI1NgorI2Vsc2UKKyNkZWZpbmUgUElUX01BWF9NQVggUElUX01BWF9UTVAKKyNlbmRpZgorCisjZGVmaW5lIE5CX0RJViA0ICAgLyogbnVtYmVyIG9mIGRpdmlzaW9uICgyMG1zKSBwZXIgODBtcyBmcmFtZSAqLworI2RlZmluZSBMX1NVQkZSIDY0IC8qIHN1YmZyYW1lIHNpemUgKDVtcykgKi8KKyNkZWZpbmUgQlBGX1NGRCAxICAvKiBiYXNzIHBvc3RmaWx0ZXIgZGVsYXkgKHN1YmZyYW1lKSAqLworI2RlZmluZSBCUEZfREVMQVkgKEJQRl9TRkQgKiBMX1NVQkZSKSAvKiBiYXNzIHBvc3RmaWx0ZXIgZGVsYXkgKHNhbXBsZXMpICovCisKKyNkZWZpbmUgTF9GSUxUIDEyICAvKiBEZWxheSBvZiB1cC1zYW1wbGluZyBmaWx0ZXIgKGJhc3MgcG9zdC1maWx0ZXIpICovCisjZGVmaW5lIExfRVhUUkEgOTYgLyogZm9yIGJhc3MgcG9zdC1maWx0ZXIgKi8KKyNkZWZpbmUgTF9JTlRFUlBPTCBcCisgICgxNiArIDEpIC8qIExlbmd0aCBvZiBmaWx0ZXIgZm9yIGludGVycG9sYXRpb24gKGFjZWxwIGRlY29kZXIpICovCisKKy8qIGRlZmluaXRpb25zIGZvciBjb3JlQ29kZXJGcmFtZUxlbmd0aCA9IDEwMjQgKi8KKyNkZWZpbmUgTF9GUkFNRV9QTFVTXzEwMjQgMTAyNCAvKiBsZW5ndGggb2Ygb25lIDgwbXMgc3VwZXJmcmFtZSAqLworI2RlZmluZSBMX0RJVl8xMDI0IFwKKyAgKExfRlJBTUVfUExVU18xMDI0IC8gTkJfRElWKSAvKiBsZW5ndGggb2Ygb25lIGFjZWxwIG9yIHRjeDIwIGZyYW1lICovCisjZGVmaW5lIE5CX1NVQkZSXzEwMjQgXAorICAoTF9ESVZfMTAyNCAvIExfU1VCRlIpIC8qIG51bWJlciBvZiA1bXMgc3ViZnJhbWUgcGVyIGRpdmlzaW9uICovCisjZGVmaW5lIE5CX1NVQkZSX1NVUEVSRlJfMTAyNCBcCisgIChMX0ZSQU1FX1BMVVNfMTAyNCAvIExfU1VCRlIpIC8qIG51bWJlciBvZiA1bXMgc3ViZnJhbWUgcGVyIDgwbXMgZnJhbWUgKi8KKyNkZWZpbmUgQUFDX1NGRF8xMDI0IChOQl9TVUJGUl9TVVBFUkZSXzEwMjQgLyAyKSAvKiBBQUMgZGVsYXkgKHN1YmZyYW1lKSAqLworI2RlZmluZSBBQUNfREVMQVlfMTAyNCAoQUFDX1NGRF8xMDI0ICogTF9TVUJGUikgIC8qIEFBQyBkZWxheSAoc2FtcGxlcykgKi8KKyNkZWZpbmUgU1lOX1NGRF8xMDI0IChBQUNfU0ZEXzEwMjQgLSBCUEZfU0ZEKSAvKiBzeW50aGVzaXMgZGVsYXkgKHN1YmZyYW1lKSAqLworI2RlZmluZSBTWU5fREVMQVlfMTAyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFNZTl9TRkRfMTAyNCAqIExfU1VCRlIpICAgICAgICAgLyogc3ludGhlc2lzIGRlbGF5IChzYW1wbGVzKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMRkFDXzEwMjQgKExfRElWXzEwMjQgLyAyKSAvKiBGQUMgZnJhbWUgbGVuZ3RoICovCisjZGVmaW5lIExGQUNfU0hPUlRfMTAyNCBcCisgIChMX0RJVl8xMDI0IC8gNCkgICAgICAgIC8qIGZvciB0cmFuc2l0aW9ucyBFSUdIVF9TSE9SVCBGRC0+TFBEIGFuZCB2di4gKi8KKyNkZWZpbmUgRkROU19OUFRTXzEwMjQgNjQgLyogRkQgbm9pc2Ugc2hhcGluZyByZXNvbHV0aW9uICg2ND0xMDBIei9wb2ludCkgKi8KKworLyogZGVmaW5pdGlvbnMgZm9yIGNvcmVDb2RlckZyYW1lTGVuZ3RoID0gNzY4ICovCisjZGVmaW5lIExfRlJBTUVfUExVU183NjggNzY4CisjZGVmaW5lIExfRElWXzc2OCBcCisgIChMX0ZSQU1FX1BMVVNfNzY4IC8gTkJfRElWKSAvKiBsZW5ndGggb2Ygb25lIGFjZWxwIG9yIHRjeDIwIGZyYW1lICovCisjZGVmaW5lIE5CX1NVQkZSXzc2OCBcCisgIChMX0RJVl83NjggLyBMX1NVQkZSKSAvKiBudW1iZXIgb2YgNW1zIHN1YmZyYW1lIHBlciBkaXZpc2lvbiAqLworI2RlZmluZSBOQl9TVUJGUl9TVVBFUkZSXzc2OCBcCisgIChMX0ZSQU1FX1BMVVNfNzY4IC8gTF9TVUJGUikgLyogbnVtYmVyIG9mIDVtcyBzdWJmcmFtZSBwZXIgODBtcyBmcmFtZSAqLworI2RlZmluZSBBQUNfU0ZEXzc2OCAoTkJfU1VCRlJfU1VQRVJGUl83NjggLyAyKSAvKiBBQUMgZGVsYXkgKHN1YmZyYW1lKSAqLworI2RlZmluZSBBQUNfREVMQVlfNzY4IChBQUNfU0ZEXzc2OCAqIExfU1VCRlIpICAvKiBBQUMgZGVsYXkgKHNhbXBsZXMpICovCisjZGVmaW5lIFNZTl9TRkRfNzY4IChBQUNfU0ZEXzc2OCAtIEJQRl9TRkQpICAgIC8qIHN5bnRoZXNpcyBkZWxheSAoc3ViZnJhbWUpICovCisjZGVmaW5lIFNZTl9ERUxBWV83NjggKFNZTl9TRkRfNzY4ICogTF9TVUJGUikgIC8qIHN5bnRoZXNpcyBkZWxheSAoc2FtcGxlcykgKi8KKyNkZWZpbmUgTEZBQ183NjggKExfRElWXzc2OCAvIDIpICAgICAgICAgICAgICAgLyogRkFDIGZyYW1lIGxlbmd0aCAqLworI2RlZmluZSBMRkFDX1NIT1JUXzc2OCBcCisgIChMX0RJVl83NjggLyA0KSAvKiBmb3IgdHJhbnNpdGlvbnMgRUlHSFRfU0hPUlQgRkQtPkxQRCBhbmQgdnYuICovCisKKy8qIG1heGltdW0gKHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uKSAqLworI2RlZmluZSBMX0ZSQU1FX1BMVVMgTF9GUkFNRV9QTFVTXzEwMjQKKyNkZWZpbmUgTF9ESVYgTF9ESVZfMTAyNAorI2RlZmluZSBOQl9TVUJGUiBOQl9TVUJGUl8xMDI0CisjZGVmaW5lIE5CX1NVQkZSX1NVUEVSRlIgTkJfU1VCRlJfU1VQRVJGUl8xMDI0CisjZGVmaW5lIEFBQ19TRkQgQUFDX1NGRF8xMDI0CisjZGVmaW5lIEFBQ19ERUxBWSBBQUNfREVMQVlfMTAyNAorI2RlZmluZSBTWU5fU0ZEIFNZTl9TRkRfMTAyNAorI2RlZmluZSBTWU5fREVMQVkgU1lOX0RFTEFZXzEwMjQKKyNkZWZpbmUgTEZBQyBMRkFDXzEwMjQKKyNkZWZpbmUgTEZBQ19TSE9SVCBMRkFDX1NIT1JUXzEwMjQKKyNkZWZpbmUgRkROU19OUFRTIEZETlNfTlBUU18xMDI0CisKKyNlbmRpZiAvKiBVU0FDREVDX0NPTlNUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19mYWMuY3BwIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX2ZhYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjZTRhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19mYWMuY3BwCkBAIC0wLDAgKzEsNzQzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCisKKyAgIERlc2NyaXB0aW9uOiBVU0FDIEZBQworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidXNhY2RlY19mYWMuaCIKKworI2luY2x1ZGUgInVzYWNkZWNfY29uc3QuaCIKKyNpbmNsdWRlICJ1c2FjZGVjX2xwYy5oIgorI2luY2x1ZGUgInVzYWNkZWNfYWNlbHAuaCIKKyNpbmNsdWRlICJ1c2FjZGVjX3JvbS5oIgorI2luY2x1ZGUgImRjdC5oIgorI2luY2x1ZGUgIkZES190b29sc19yb20uaCIKKyNpbmNsdWRlICJtZGN0LmgiCisKKyNkZWZpbmUgU1BFQ19GQUMocHRyLCBpLCBnbCkgKChwdHIpICsgKChpKSAqIChnbCkpKQorCitGSVhQX0RCTCAqQ0xwZF9GQUNfR2V0TWVtb3J5KENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIG1vZFtOQl9ESVZdLCBpbnQgKnBTdGF0ZSkgeworICBGSVhQX0RCTCAqcHRyOworICBpbnQgaTsKKyAgaW50IGsgPSAwOworICBpbnQgbWF4X3dpbmRvd3MgPSA4OworCisgIEZES19BU1NFUlQoKnBTdGF0ZSA+PSAwICYmICpwU3RhdGUgPCBtYXhfd2luZG93cyk7CisKKyAgLyogTG9vayBmb3IgZnJlZSBzcGFjZSB0byBzdG9yZSBGQUMgZGF0YS4gMiBGQUMgZGF0YSBibG9ja3MgZml0IGludG8gZWFjaCBUQ1gKKyAgICogc3BlY3RyYWwgZGF0YSBibG9jay4gKi8KKyAgZm9yIChpID0gKnBTdGF0ZTsgaSA8IG1heF93aW5kb3dzOyBpKyspIHsKKyAgICBpZiAobW9kW2kgPj4gMV0gPT0gMCkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgKnBTdGF0ZSA9IGkgKyAxOworCisgIGlmIChpID09IG1heF93aW5kb3dzKSB7CisgICAgcHRyID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmZhY19kYXRhMDsKKyAgfSBlbHNlIHsKKyAgICBGREtfQVNTRVJUKG1vZFsoaSA+PiAxKV0gPT0gMCk7CisgICAgcHRyID0gU1BFQ19GQUMocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQsIGksCisgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCA8PCBrKTsKKyAgfQorCisgIHJldHVybiBwdHI7Cit9CisKK2ludCBDTHBkX0ZBQ19SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgRklYUF9EQkwgKnBGYWMsIFVDSEFSICpwRmFjU2NhbGUsCisgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLCBpbnQgdXNlX2dhaW4sIGludCBmcmFtZSkgeworICBGSVhQX0RCTCBmYWNfZ2FpbjsKKyAgaW50IGZhY19nYWluX2UgPSAwOworCisgIGlmICh1c2VfZ2FpbikgeworICAgIENMcGRfRGVjb2RlR2FpbigmZmFjX2dhaW4sICZmYWNfZ2Fpbl9lLCBGREtyZWFkQml0cyhoQnMsIDcpKTsKKyAgfQorCisgIGlmIChDTHBjX0RlY29kZUFWUShoQnMsIHBGYWMsIDEsIDEsIGxlbmd0aCkgIT0gMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHsKKyAgICBpbnQgc2NhbGU7CisKKyAgICBzY2FsZSA9IGdldFNjYWxlZmFjdG9yKHBGYWMsIGxlbmd0aCk7CisgICAgc2NhbGVWYWx1ZXMocEZhYywgbGVuZ3RoLCBzY2FsZSk7CisgICAgcEZhY1NjYWxlW2ZyYW1lXSA9IERGUkFDVF9CSVRTIC0gMSAtIHNjYWxlOworICB9CisKKyAgaWYgKHVzZV9nYWluKSB7CisgICAgaW50IGk7CisKKyAgICBwRmFjU2NhbGVbZnJhbWVdICs9IGZhY19nYWluX2U7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIHBGYWNbaV0gPSBmTXVsdChwRmFjW2ldLCBmYWNfZ2Fpbik7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvKioKKyAqIFxicmllZiBBcHBseSBzeW50aGVzaXMgZmlsdGVyIHdpdGggemVybyBpbnB1dCB0byB4LiBUaGUgb3ZlcmFsbCBmaWx0ZXIgZ2FpbgorICogaXMgMS4wLgorICogXHBhcmFtIGEgTFBDIGZpbHRlciBjb2VmZmljaWVudHMuCisgKiBccGFyYW0gbGVuZ3RoIGxlbmd0aCBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgdmVjdG9yIHguCisgKiBccGFyYW0geCBpbnB1dC9vdXRwdXQgdmVjdG9yLCB3aGVyZSB0aGUgc3ludGhlc2lzIGZpbHRlciBpcyBhcHBsaWVkIGluIHBsYWNlLgorICovCitzdGF0aWMgdm9pZCBTeW5fZmlsdF96ZXJvKGNvbnN0IEZJWFBfTFBDIGFbXSwgY29uc3QgSU5UIGFfZXhwLCBJTlQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCB4W10pIHsKKyAgaW50IGksIGo7CisgIEZJWFBfREJMIExfdG1wOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgIExfdG1wID0gKEZJWFBfREJMKTA7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgZk1pbihpLCBNX0xQX0ZJTFRFUl9PUkRFUik7IGorKykgeworICAgICAgTF90bXAgLT0gZk11bHREaXYyKGFbal0sIHhbaSAtIChqICsgMSldKTsKKyAgICB9CisKKyAgICBMX3RtcCA9IHNjYWxlVmFsdWUoTF90bXAsIGFfZXhwICsgMSk7CisKKyAgICB4W2ldID0gc2NhbGVWYWx1ZVNhdHVyYXRlKCh4W2ldID4+IDEpICsgKExfdG1wID4+IDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7IC8qIEF2b2lkIG92ZXJmbG93IGlzc3VlcyBhbmQgc2F0dXJhdGUuICovCisgIH0KK30KKworLyogVGFibGUgaXMgYWxzbyBjb3JyZWN0IGZvciBjb3JlQ29kZXJGcmFtZUxlbmd0aCA9IDc2OC4gRmFjdG9yIDMvNCBpcyBjYW5jZWxlZAorICAgb3V0OiBnYWluRmFjID0gMC41ICogc3FydChmYWNfbGVuZ3RoL2xGcmFtZSkKKyovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgZ2FpbkZhY1s0XSA9IHsweDQwMDAwMDAwLCAweDJkNDEzY2NkLCAweDIwMDAwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNmEwOWU2Nn07CisKK3ZvaWQgQ0ZhY19BcHBseUdhaW5zKEZJWFBfREJMIGZhY19kYXRhW0xGQUNdLCBjb25zdCBJTlQgZmFjX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIHRjeF9nYWluLCBjb25zdCBGSVhQX0RCTCBhbGZkX2dhaW5zW10sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbW9kKSB7CisgIEZJWFBfREJMIGZhY0ZhY3RvcjsKKyAgaW50IGk7CisKKyAgRkRLX0FTU0VSVCgoZmFjX2xlbmd0aCA9PSAxMjgpIHx8IChmYWNfbGVuZ3RoID09IDk2KSk7CisKKyAgLyogMikgQXBwbHkgZ2FpbiBmYWN0b3IgdG8gRkFDIGRhdGEgKi8KKyAgZmFjRmFjdG9yID0gZk11bHQoZ2FpbkZhY1ttb2RdLCB0Y3hfZ2Fpbik7CisgIGZvciAoaSA9IDA7IGkgPCBmYWNfbGVuZ3RoOyBpKyspIHsKKyAgICBmYWNfZGF0YVtpXSA9IGZNdWx0KGZhY19kYXRhW2ldLCBmYWNGYWN0b3IpOworICB9CisKKyAgLyogMykgQXBwbHkgc3BlY3RydW0gZGVzaGFwaW5nIHVzaW5nIGFsZmRfZ2FpbnMgKi8KKyAgZm9yIChpID0gMDsgaSA8IGZhY19sZW5ndGggLyA0OyBpKyspIHsKKyAgICBpbnQgazsKKworICAgIGsgPSBpID4+ICgzIC0gbW9kKTsKKyAgICBmYWNfZGF0YVtpXSA9IGZNdWx0KGZhY19kYXRhW2ldLCBhbGZkX2dhaW5zW2tdKQorICAgICAgICAgICAgICAgICAgPDwgMTsgLyogYWxmZF9nYWlucyBpcyBzY2FsZWQgYnkgb25lIGJpdC4gKi8KKyAgfQorfQorCitzdGF0aWMgdm9pZCBDRmFjX0NhbGNGYWNTaWduYWwoRklYUF9EQkwgKnBPdXQsIEZJWFBfREJMICpwRmFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmYWNfc2NhbGUsIGNvbnN0IGludCBmYWNfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfTFBDIEFbTV9MUF9GSUxURVJfT1JERVJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBBX2V4cCwgY29uc3QgaW50IGZBZGRaaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGlzRmRGYWMpIHsKKyAgRklYUF9MUEMgd0FbTV9MUF9GSUxURVJfT1JERVJdOworICBGSVhQX0RCTCB0Zl9nYWluID0gKEZJWFBfREJMKTA7CisgIGludCB3bGVuZ3RoOworICBpbnQgc2NhbGUgPSBmYWNfc2NhbGU7CisKKyAgLyogb2J0YWluIHRyYW5mb3JtIGdhaW4uICovCisgIGltZGN0X2dhaW4oJnRmX2dhaW4sICZzY2FsZSwgaXNGZEZhYyA/IDAgOiBmYWNfbGVuZ3RoKTsKKworICAvKiA0KSBDb21wdXRlIGludmVyc2UgRENULUlWIG9mIEZBQyBkYXRhLiBPdXRwdXQgc2NhbGUgb2YgRENUIElWIGlzIDE2IGJpdHMuCisgICAqLworICBkY3RfSVYocEZhYywgZmFjX2xlbmd0aCwgJnNjYWxlKTsKKyAgLyogZGN0X0lWIHNjYWxlID0gbG9nMihmYWNfbGVuZ3RoKS4gIi0gNyIgaXMgYSBmYWN0b3Igb2YgMi8xMjggKi8KKyAgaWYgKHRmX2dhaW4gIT0gKEZJWFBfREJMKTApIHsgLyogbm9uLXJhZGl4IDIgdHJhbnNmb3JtIGdhaW4gKi8KKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmYWNfbGVuZ3RoOyBpKyspIHsKKyAgICAgIHBGYWNbaV0gPSBmTXVsdCh0Zl9nYWluLCBwRmFjW2ldKTsKKyAgICB9CisgIH0KKyAgc2NhbGVWYWx1ZXNTYXR1cmF0ZShwT3V0LCBwRmFjLCBmYWNfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsgLyogQXZvaWQgb3ZlcmZsb3cgaXNzdWVzIGFuZCBzYXR1cmF0ZS4gKi8KKworICBFX0xQQ19hX3dlaWdodCh3QSwgQSwgTV9MUF9GSUxURVJfT1JERVIpOworCisgIC8qIFdlIG5lZWQgdGhlIG91dHB1dCBvZiB0aGUgSUlSIGZpbHRlciB0byBiZSBsb25nZXIgdGhhbiAiZmFjX2xlbmd0aCIuCisgIEZvciB0aGlzIHJlYXNvbiB3ZSBydW4gaXQgd2l0aCB6ZXJvIGlucHV0IGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0CisgIHNlcXVlbmNlLCBpLmUuIHdlIGdlbmVyYXRlIGl0cyBaSVIgYW5kIGV4dGVuZCB0aGUgb3V0cHV0IHNpZ25hbC4qLworICBGREttZW1jbGVhcihwT3V0ICsgZmFjX2xlbmd0aCwgZmFjX2xlbmd0aCAqIHNpemVvZihGSVhQX0RCTCkpOworICB3bGVuZ3RoID0gMiAqIGZhY19sZW5ndGg7CisKKyAgLyogNSkgQXBwbHkgd2VpZ2h0ZWQgc3ludGhlc2lzIGZpbHRlciB0byBGQUMgZGF0YSwgaW5jbHVkaW5nIG9wdGlvbmFsIFppciAoNS4KKyAgICogaXRlbSA0KS4gKi8KKyAgU3luX2ZpbHRfemVybyh3QSwgQV9leHAsIHdsZW5ndGgsIHBPdXQpOworfQorCitJTlQgQ0xwZF9GQUNfTWRjdDJBY2VscChIX01EQ1QgaE1kY3QsIEZJWFBfREJMICpvdXRwdXQsIEZJWFBfREJMICpwRmFjLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZhY19zY2FsZSwgRklYUF9MUEMgKkEsIElOVCBBX2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuck91dFNhbXBsZXMsIGNvbnN0IElOVCBmYWNfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGlzRmRGYWMsIFVDSEFSIHByZXZXaW5kb3dTaGFwZSkgeworICBGSVhQX0RCTCAqcE92bDsKKyAgRklYUF9EQkwgKnBPdXQwOworICBjb25zdCBGSVhQX1dUUCAqcFdpbmRvdzsKKyAgaW50IGksIGZsLCBuclNhbXBsZXMgPSAwOworCisgIEZES19BU1NFUlQoZmFjX2xlbmd0aCA8PSAxMDI0IC8gKDQgKiAyKSk7CisKKyAgZmwgPSBmYWNfbGVuZ3RoICogMjsKKworICBwV2luZG93ID0gRkRLZ2V0V2luZG93U2xvcGUoZmwsIHByZXZXaW5kb3dTaGFwZSk7CisKKyAgLyogQWRhcHQgd2luZG93IHNsb3BlIGxlbmd0aCBpbiBjYXNlIG9mIGZyYW1lIGxvc3MuICovCisgIGlmIChoTWRjdC0+cHJldl9mciAhPSBmbCkgeworICAgIGludCBubCA9IDA7CisgICAgaW1kY3RfYWRhcHRfcGFyYW1ldGVycyhoTWRjdCwgJmZsLCAmbmwsIGZhY19sZW5ndGgsIHBXaW5kb3csIG5yT3V0U2FtcGxlcyk7CisgICAgRkRLX0FTU0VSVChubCA9PSAwKTsKKyAgfQorCisgIGlmIChuclNhbXBsZXMgPCBuck91dFNhbXBsZXMpIHsKKyAgICBwT3V0MCA9IG91dHB1dDsKKyAgICBuclNhbXBsZXMgKz0gaE1kY3QtPm92X29mZnNldDsKKyAgICAvKiBQdXJnZSBidWZmZXJlZCBvdXRwdXQuICovCisgICAgRkRLbWVtY3B5KHBPdXQwLCBoTWRjdC0+b3ZlcmxhcC50aW1lLCBoTWRjdC0+b3Zfb2Zmc2V0ICogc2l6ZW9mKHBPdXQwWzBdKSk7CisgICAgaE1kY3QtPm92X29mZnNldCA9IDA7CisgIH0KKworICBwT3ZsID0gaE1kY3QtPm92ZXJsYXAuZnJlcSArIGhNZGN0LT5vdl9zaXplIC0gMTsKKworICBpZiAobnJTYW1wbGVzID49IG5yT3V0U2FtcGxlcykgeworICAgIHBPdXQwID0gaE1kY3QtPm92ZXJsYXAudGltZSArIGhNZGN0LT5vdl9vZmZzZXQ7CisgICAgaE1kY3QtPm92X29mZnNldCArPSBoTWRjdC0+cHJldl9uciArIGZsIC8gMjsKKyAgfSBlbHNlIHsKKyAgICBwT3V0MCA9IG91dHB1dCArIG5yU2FtcGxlczsKKyAgICBuclNhbXBsZXMgKz0gaE1kY3QtPnByZXZfbnIgKyBmbCAvIDI7CisgIH0KKyAgaWYgKGhNZGN0LT5wcmV2UHJldkFsaWFzU3ltbWV0cnkgPT0gMCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBoTWRjdC0+cHJldl9ucjsgaSsrKSB7CisgICAgICBGSVhQX0RCTCB4ID0gLSgqcE92bC0tKTsKKyAgICAgICpwT3V0MCA9IElNRENUX1NDQUxFX0RCTCh4KTsKKyAgICAgIHBPdXQwKys7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCBoTWRjdC0+cHJldl9ucjsgaSsrKSB7CisgICAgICBGSVhQX0RCTCB4ID0gKCpwT3ZsLS0pOworICAgICAgKnBPdXQwID0gSU1EQ1RfU0NBTEVfREJMKHgpOworICAgICAgcE91dDArKzsKKyAgICB9CisgIH0KKyAgaE1kY3QtPnByZXZfbnIgPSAwOworCisgIHsKKyAgICBpZiAocEZhYyAhPSBOVUxMKSB7CisgICAgICAvKiBOb3RlOiBUaGUgRkFDIGdhaW4gbWlnaHQgaGF2ZSBiZWVuIGFwcGxpZWQgZGlyZWN0bHkgYWZ0ZXIgYml0IHN0cmVhbQorICAgICAgICogcGFyc2UgaW4gdGhpcyBjYXNlLiAqLworICAgICAgQ0ZhY19DYWxjRmFjU2lnbmFsKHBPdXQwLCBwRmFjLCBmYWNfc2NhbGUsIGZhY19sZW5ndGgsIEEsIEFfZXhwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzRmRGYWMpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBDbGVhciBidWZmZXIgYmVjYXVzZSBvZiB0aGUgb3ZlcmxhcCBhbmQgQUREISAqLworICAgICAgRkRLbWVtY2xlYXIocE91dDAsIGZhY19sZW5ndGggKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICB9CisgIH0KKworICBpID0gMDsKKworICBpZiAoaE1kY3QtPnByZXZQcmV2QWxpYXNTeW1tZXRyeSA9PSAwKSB7CisgICAgZm9yICg7IGkgPCBmbCAvIDI7IGkrKykgeworICAgICAgRklYUF9EQkwgeDA7CisKKyAgICAgIC8qIE92ZXJsYXAgQWRkICovCisgICAgICB4MCA9IC1mTXVsdCgqcE92bC0tLCBwV2luZG93W2ldLnYucmUpOworCisgICAgICAqcE91dDAgKz0gSU1EQ1RfU0NBTEVfREJMKHgwKTsKKyAgICAgIHBPdXQwKys7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoOyBpIDwgZmwgLyAyOyBpKyspIHsKKyAgICAgIEZJWFBfREJMIHgwOworCisgICAgICAvKiBPdmVybGFwIEFkZCAqLworICAgICAgeDAgPSBmTXVsdCgqcE92bC0tLCBwV2luZG93W2ldLnYucmUpOworCisgICAgICAqcE91dDAgKz0gSU1EQ1RfU0NBTEVfREJMKHgwKTsKKyAgICAgIHBPdXQwKys7CisgICAgfQorICB9CisgIGlmIChoTWRjdC0+cEZhY1ppciAhPQorICAgICAgMCkgeyAvKiB0aGlzIHNob3VsZCBvbmx5IGhhcHBlbiBmb3IgQUNFTFAgLT4gVENYMjAgLT4gQUNFTFAgdHJhbnNpdGlvbiAqLworICAgIEZJWFBfREJMICpwT3V0ID0gcE91dDAgLSBmbCAvIDI7IC8qIGZsLzIgPT0gZmFjX2xlbmd0aCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBmbCAvIDI7IGkrKykgeworICAgICAgcE91dFtpXSArPSBJTURDVF9TQ0FMRV9EQkwoaE1kY3QtPnBGYWNaaXJbaV0pOworICAgIH0KKyAgICBoTWRjdC0+cEZhY1ppciA9IE5VTEw7CisgIH0KKworICBoTWRjdC0+cHJldl9mciA9IDA7CisgIGhNZGN0LT5wcmV2X25yID0gMDsKKyAgaE1kY3QtPnByZXZfdGwgPSAwOworICBoTWRjdC0+cHJldlByZXZBbGlhc1N5bW1ldHJ5ID0gaE1kY3QtPnByZXZBbGlhc1N5bW1ldHJ5OworCisgIHJldHVybiBuclNhbXBsZXM7Cit9CisKK0lOVCBDTHBkX0ZBQ19BY2VscDJNZGN0KEhfTURDVCBoTWRjdCwgRklYUF9EQkwgKm91dHB1dCwgRklYUF9EQkwgKl9wU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUIHNwZWNfc2NhbGVbXSwgY29uc3QgaW50IG5TcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBGYWMsIGNvbnN0IGludCBmYWNfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZmFjX2xlbmd0aCwgSU5UIG5vT3V0U2FtcGxlcywgY29uc3QgSU5UIHRsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9XVFAgKndycywgY29uc3QgSU5UIGZyLCBGSVhQX0xQQyBBWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCBBX2V4cCwgQ0FjZWxwU3RhdGljTWVtICphY2VscF9tZW0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBnYWluLCBjb25zdCBpbnQgbGFzdF9mcmFtZV9sb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGlzRmRGYWMsIGNvbnN0IFVDSEFSIGxhc3RfbHBkX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaywgaW50IGN1cnJBbGlhc2luZ1N5bW1ldHJ5KSB7CisgIEZJWFBfREJMICpwQ3VyciwgKnBPdmwsICpwU3BlYzsKKyAgY29uc3QgRklYUF9XVFAgKnBXaW5kb3c7CisgIGNvbnN0IEZJWFBfV1RCICpGYWNXaW5kb3daaXJfY29uY2VhbDsKKyAgVUNIQVIgZG9GYWNaaXJDb25jZWFsID0gMDsKKyAgaW50IGRvRGVlbXBoID0gMTsKKyAgY29uc3QgRklYUF9XVEIgKkZhY1dpbmRvd1ppciwgKkZhY1dpbmRvd1N5bnRoOworICBGSVhQX0RCTCAqcE91dDAgPSBvdXRwdXQsICpwT3V0MTsKKyAgaW50IHcsIGksIGZsLCBubCwgbnIsIGZfbGVuLCBuclNhbXBsZXMgPSAwLCBzID0gMCwgc2NhbGUsIHRvdGFsX2dhaW5fZTsKKyAgRklYUF9EQkwgKnBGLCAqcEZBQ19hbmRfRkFDX1pJUiA9IE5VTEw7CisgIEZJWFBfREJMIHRvdGFsX2dhaW4gPSBnYWluOworCisgIEZES19BU1NFUlQoZmFjX2xlbmd0aCA8PSAxMDI0IC8gKDQgKiAyKSk7CisgIHN3aXRjaCAoZmFjX2xlbmd0aCkgeworICAgIC8qIGNvcmVDb2RlckZyYW1lTGVuZ3RoID0gMTAyNCAqLworICAgIGNhc2UgMTI4OgorICAgICAgcFdpbmRvdyA9IFNpbmVXaW5kb3cyNTY7CisgICAgICBGYWNXaW5kb3daaXIgPSBGYWNXaW5kb3daaXIxMjg7CisgICAgICBGYWNXaW5kb3dTeW50aCA9IEZhY1dpbmRvd1N5bnRoMTI4OworICAgICAgYnJlYWs7CisgICAgY2FzZSA2NDoKKyAgICAgIHBXaW5kb3cgPSBTaW5lV2luZG93MTI4OworICAgICAgRmFjV2luZG93WmlyID0gRmFjV2luZG93WmlyNjQ7CisgICAgICBGYWNXaW5kb3dTeW50aCA9IEZhY1dpbmRvd1N5bnRoNjQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMyOgorICAgICAgcFdpbmRvdyA9IFNpbmVXaW5kb3c2NDsKKyAgICAgIEZhY1dpbmRvd1ppciA9IEZhY1dpbmRvd1ppcjMyOworICAgICAgRmFjV2luZG93U3ludGggPSBGYWNXaW5kb3dTeW50aDMyOworICAgICAgYnJlYWs7CisgICAgLyogY29yZUNvZGVyRnJhbWVMZW5ndGggPSA3NjggKi8KKyAgICBjYXNlIDk2OgorICAgICAgcFdpbmRvdyA9IFNpbmVXaW5kb3cxOTI7CisgICAgICBGYWNXaW5kb3daaXIgPSBGYWNXaW5kb3daaXI5NjsKKyAgICAgIEZhY1dpbmRvd1N5bnRoID0gRmFjV2luZG93U3ludGg5NjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDg6CisgICAgICBwV2luZG93ID0gU2luZVdpbmRvdzk2OworICAgICAgRmFjV2luZG93WmlyID0gRmFjV2luZG93WmlyNDg7CisgICAgICBGYWNXaW5kb3dTeW50aCA9IEZhY1dpbmRvd1N5bnRoNDg7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiAwOworICB9CisKKyAgRmFjV2luZG93WmlyX2NvbmNlYWwgPSBGYWNXaW5kb3dTeW50aDsKKyAgLyogRGVyaXZlIE5SIGFuZCBOTCAqLworICBmbCA9IGZhY19sZW5ndGggKiAyOworICBubCA9ICh0bCAtIGZsKSA+PiAxOworICBuciA9ICh0bCAtIGZyKSA+PiAxOworCisgIGlmIChub091dFNhbXBsZXMgPiBuclNhbXBsZXMpIHsKKyAgICAvKiBQdXJnZSBidWZmZXJlZCBvdXRwdXQuICovCisgICAgRkRLbWVtY3B5KHBPdXQwLCBoTWRjdC0+b3ZlcmxhcC50aW1lLCBoTWRjdC0+b3Zfb2Zmc2V0ICogc2l6ZW9mKHBPdXQwWzBdKSk7CisgICAgbnJTYW1wbGVzID0gaE1kY3QtPm92X29mZnNldDsKKyAgICBoTWRjdC0+b3Zfb2Zmc2V0ID0gMDsKKyAgfQorCisgIGlmIChuclNhbXBsZXMgPj0gbm9PdXRTYW1wbGVzKSB7CisgICAgcE91dDEgPSBoTWRjdC0+b3ZlcmxhcC50aW1lICsgaE1kY3QtPm92X29mZnNldDsKKyAgICBpZiAoaE1kY3QtPm92X29mZnNldCA8IGZhY19sZW5ndGgpIHsKKyAgICAgIHBPdXQwID0gb3V0cHV0ICsgbnJTYW1wbGVzOworICAgIH0gZWxzZSB7CisgICAgICBwT3V0MCA9IHBPdXQxOworICAgIH0KKyAgICBoTWRjdC0+b3Zfb2Zmc2V0ICs9IGZhY19sZW5ndGggKyBubDsKKyAgfSBlbHNlIHsKKyAgICBwT3V0MSA9IG91dHB1dCArIG5yU2FtcGxlczsKKyAgICBwT3V0MCA9IG91dHB1dCArIG5yU2FtcGxlczsKKyAgfQorCisgIHsKKyAgICBwRkFDX2FuZF9GQUNfWklSID0gQ0xwZF9BQ0VMUF9HZXRGcmVlRXhjTWVtKGFjZWxwX21lbSwgMiAqIGZhY19sZW5ndGgpOworICAgIHsKKyAgICAgIGNvbnN0IEZJWFBfREJMICpwVG1wMSwgKnBUbXAyOworCisgICAgICBkb0ZhY1ppckNvbmNlYWwgfD0gKChsYXN0X2ZyYW1lX2xvc3QgIT0gMCkgJiYgKGsgPT0gMCkpOworICAgICAgZG9EZWVtcGggJj0gKGxhc3RfbHBkX21vZGUgIT0gNCk7CisgICAgICBpZiAoZG9GYWNaaXJDb25jZWFsKSB7CisgICAgICAgIC8qIEFDRUxQIGNvbnRyaWJ1dGlvbiBpbiBjb25jZWFsbWVudCBjYXNlOgorICAgICAgICAgICBVc2UgWklSIHdpdGggYSBtb2RpZmllZCBaSVIgd2luZG93IHRvIHByZXNlcnZlIHNvbWUgbW9yZSBlbmVyZ3kuCisgICAgICAgICAgIERvbnQgdXNlIEZBQywgd2hpY2ggY29udGFpbnMgd3JvbmcgaW5mb3JtYXRpb24gZm9yIGNvbmNlYWxlZCBmcmFtZQorICAgICAgICAgICBEb250IHVzZSBsYXN0IEFDRUxQIHNhbXBsZXMsIGJ1dCBkb3VibGUgWklSLCBpbnN0ZWFkIChhZnRlcndhcmRzKSAqLworICAgICAgICBGREttZW1jbGVhcihwRkFDX2FuZF9GQUNfWklSLCAyICogZmFjX2xlbmd0aCAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICBGYWNXaW5kb3dTeW50aCA9IChGSVhQX1dUQiAqKXBGQUNfYW5kX0ZBQ19aSVI7CisgICAgICAgIEZhY1dpbmRvd1ppciA9IEZhY1dpbmRvd1ppcl9jb25jZWFsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ0ZhY19DYWxjRmFjU2lnbmFsKHBGQUNfYW5kX0ZBQ19aSVIsIHBGYWMsIGZhY19zY2FsZSArIHMsIGZhY19sZW5ndGgsIEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBX2V4cCwgMSwgaXNGZEZhYyk7CisgICAgICB9CisgICAgICAvKiA2KSBHZXQgd2luZG93ZWQgcGFzdCBBQ0VMUCBzYW1wbGVzIGFuZCBBQ0VMUCBaSVIgc2lnbmFsICovCisKKyAgICAgIC8qCisgICAgICAgKiBHZXQgQUNFTFAgWklSIChwRmFjW10pIGFuZCBBQ0VMUCBwYXN0IHNhbXBsZXMgKHBPdXQwW10pIGFuZCBhZGQgdGhlbQorICAgICAgICogdG8gdGhlIEZBQyBzeW50aCBzaWduYWwgY29udHJpYnV0aW9uIG9uIHBPdXQxW10uCisgICAgICAgKi8KKyAgICAgIHsKKyAgICAgICAgeworICAgICAgICAgIENMcGRfQWNlbHBfWmlyKEEsIEFfZXhwLCBhY2VscF9tZW0sIGZhY19sZW5ndGgsIHBGYWMsIGRvRGVlbXBoKTsKKworICAgICAgICAgIHBUbXAxID0gcE91dDA7CisgICAgICAgICAgcFRtcDIgPSBwRmFjOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMCwgdyA9IDA7IGkgPCBmYWNfbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBGSVhQX0RCTCB4OworICAgICAgICAgIC8qIERpdjIgaXMgY29tcGVuc2F0ZWQgYnkgdGFibGUgc2NhbGluZyAqLworICAgICAgICAgIHggPSBmTXVsdERpdjIocFRtcDJbaV0sIEZhY1dpbmRvd1ppclt3XSk7CisgICAgICAgICAgeCArPSBmTXVsdERpdjIocFRtcDFbLWkgLSAxXSwgRmFjV2luZG93U3ludGhbd10pOworICAgICAgICAgIHggKz0gcEZBQ19hbmRfRkFDX1pJUltpXTsKKyAgICAgICAgICBwT3V0MVtpXSA9IHg7CisKKyAgICAgICAgICB3Kys7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGRvRmFjWmlyQ29uY2VhbCkgeworICAgICAgICAvKiBaSVIgaXMgdGhlIG9ubHkgQUNFTFAgY29udHJpYnV0aW9uLCBzbyBkb3VibGUgaXQgKi8KKyAgICAgICAgc2NhbGVWYWx1ZXMocE91dDEsIGZhY19sZW5ndGgsIDEpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChuclNhbXBsZXMgPCBub091dFNhbXBsZXMpIHsKKyAgICBuclNhbXBsZXMgKz0gZmFjX2xlbmd0aCArIG5sOworICB9CisKKyAgLyogT2J0YWluIHRyYW5zZm9ybSBnYWluICovCisgIHRvdGFsX2dhaW4gPSBnYWluOworICB0b3RhbF9nYWluX2UgPSAwOworICBpbWRjdF9nYWluKCZ0b3RhbF9nYWluLCAmdG90YWxfZ2Fpbl9lLCB0bCk7CisKKyAgLyogSU1EQ1Qgb3ZlcmxhcCBhZGQgKi8KKyAgc2NhbGUgPSB0b3RhbF9nYWluX2U7CisgIHBTcGVjID0gX3BTcGVjOworCisgIC8qIE5vdGU6d2hlbiBjb21taW5nIGZyb20gYW4gTFBEIGZyYW1lIChUQ1gvQUNFTFApIHRoZSBwcmV2aW91cyBhbGlzYWluZworICAgKiBzeW1tZXRyeSBtdXN0IGFsd2F5cyBiZSAwICovCisgIGlmIChjdXJyQWxpYXNpbmdTeW1tZXRyeSA9PSAwKSB7CisgICAgZGN0X0lWKHBTcGVjLCB0bCwgJnNjYWxlKTsKKyAgfSBlbHNlIHsKKyAgICBGSVhQX0RCTCBfdG1wWzEwMjQgKyBBTElHTk1FTlRfREVGQVVMVCAvIHNpemVvZihGSVhQX0RCTCldOworICAgIEZJWFBfREJMICp0bXAgPSAoRklYUF9EQkwgKilBTElHTl9QVFIoX3RtcCk7CisgICAgQ19BTExPQ19BTElHTkVEX1JFR0lTVEVSKHRtcCwgc2l6ZW9mKF90bXApKTsKKyAgICBkc3RfSUlJKHBTcGVjLCB0bXAsIHRsLCAmc2NhbGUpOworICAgIENfQUxMT0NfQUxJR05FRF9VTlJFR0lTVEVSKHRtcCk7CisgIH0KKworICAvKiBPcHRpb25hbCBzY2FsaW5nIG9mIHRpbWUgZG9tYWluIC0gbm8geWV0IHdpbmRvd2VkIC0gb2YgY3VycmVudCBzcGVjdHJ1bSAqLworICBpZiAodG90YWxfZ2FpbiAhPSAoRklYUF9EQkwpMCkgeworICAgIHNjYWxlVmFsdWVzV2l0aEZhY3RvcihwU3BlYywgdG90YWxfZ2FpbiwgdGwsIHNwZWNfc2NhbGVbMF0gKyBzY2FsZSk7CisgIH0gZWxzZSB7CisgICAgc2NhbGVWYWx1ZXMocFNwZWMsIHRsLCBzcGVjX3NjYWxlWzBdICsgc2NhbGUpOworICB9CisKKyAgcE91dDEgKz0gZmwgLyAyIC0gMTsKKyAgcEN1cnIgPSBwU3BlYyArIHRsIC0gZmwgLyAyOworCisgIGZvciAoaSA9IDA7IGkgPCBmbCAvIDI7IGkrKykgeworICAgIEZJWFBfREJMIHgxOworCisgICAgLyogRkFDIHNpZ25hbCBpcyBhbHJlYWR5IG9uIHBPdXQxLCBiZWNhdXNlIG9mIHRoYXQgdGhlICs9IG9wZXJhdG9yLiAqLworICAgIHgxID0gZk11bHQoKnBDdXJyKyssIHBXaW5kb3dbaV0udi5yZSk7CisgICAgRkRLX0FTU0VSVCgocE91dDEgPj0gaE1kY3QtPm92ZXJsYXAudGltZSAmJgorICAgICAgICAgICAgICAgIHBPdXQxIDwgaE1kY3QtPm92ZXJsYXAudGltZSArIGhNZGN0LT5vdl9zaXplKSB8fAorICAgICAgICAgICAgICAgKHBPdXQxID49IG91dHB1dCAmJiBwT3V0MSA8IG91dHB1dCArIDEwMjQpKTsKKyAgICAqcE91dDEgKz0gSU1EQ1RfU0NBTEVfREJMKC14MSk7CisgICAgcE91dDEtLTsKKyAgfQorCisgIC8qIE5MIG91dHB1dCBzYW1wbGVzIFRMLzIrRkwvMi4uVEwuIC0gY3VycmVudFtGTC8yLi4wXSAqLworICBwT3V0MSArPSAoZmwgLyAyKSArIDE7CisKKyAgcEZBQ19hbmRfRkFDX1pJUiArPSBmYWNfbGVuZ3RoOyAvKiBzZXQgcG9pbnRlciB0byBiZWdpbm5pbmcgb2YgRkFDIFpJUiAqLworCisgIGlmIChubCA9PSAwKSB7CisgICAgLyogc2F2ZSBwb2ludGVyIHRvIHdyaXRlIEZBQyBaSVIgZGF0YSBsYXRlciAqLworICAgIGhNZGN0LT5wRmFjWmlyID0gcEZBQ19hbmRfRkFDX1pJUjsKKyAgfSBlbHNlIHsKKyAgICBGREtfQVNTRVJUKG5sID49IGZhY19sZW5ndGgpOworICAgIC8qIEZBQyBaSVIgd2lsbCBiZSBhZGRlZCBub3cgLi4uICovCisgICAgaE1kY3QtPnBGYWNaaXIgPSBOVUxMOworICB9CisKKyAgcEYgPSBwRkFDX2FuZF9GQUNfWklSOworICBmX2xlbiA9IGZhY19sZW5ndGg7CisKKyAgcEN1cnIgPSBwU3BlYyArIHRsIC0gZmwgLyAyIC0gMTsKKyAgZm9yIChpID0gMDsgaSA8IG5sOyBpKyspIHsKKyAgICBGSVhQX0RCTCB4ID0gLSgqcEN1cnItLSk7CisgICAgLyogNSkgKGl0ZW0gNCkgU3ludGhlc2lzIGZpbHRlciBaaXIgY29tcG9uZW50LCBGQUMgWklSIChhbm90aGVyIG9uZSkuICovCisgICAgaWYgKGkgPCBmX2xlbikgeworICAgICAgeCArPSAqcEYrKzsKKyAgICB9CisKKyAgICBGREtfQVNTRVJUKChwT3V0MSA+PSBoTWRjdC0+b3ZlcmxhcC50aW1lICYmCisgICAgICAgICAgICAgICAgcE91dDEgPCBoTWRjdC0+b3ZlcmxhcC50aW1lICsgaE1kY3QtPm92X3NpemUpIHx8CisgICAgICAgICAgICAgICAocE91dDEgPj0gb3V0cHV0ICYmIHBPdXQxIDwgb3V0cHV0ICsgMTAyNCkpOworICAgICpwT3V0MSA9IElNRENUX1NDQUxFX0RCTCh4KTsKKyAgICBwT3V0MSsrOworICB9CisKKyAgaE1kY3QtPnByZXZfbnIgPSBucjsKKyAgaE1kY3QtPnByZXZfZnIgPSBmcjsKKyAgaE1kY3QtPnByZXZfd3JzID0gd3JzOworICBoTWRjdC0+cHJldl90bCA9IHRsOworICBoTWRjdC0+cHJldlByZXZBbGlhc1N5bW1ldHJ5ID0gaE1kY3QtPnByZXZBbGlhc1N5bW1ldHJ5OworICBoTWRjdC0+cHJldkFsaWFzU3ltbWV0cnkgPSBjdXJyQWxpYXNpbmdTeW1tZXRyeTsKKyAgZmwgPSBmcjsKKyAgbmwgPSBucjsKKworICBwT3ZsID0gcFNwZWMgKyB0bCAvIDIgLSAxOworICBwT3V0MCA9IHBPdXQxOworCisgIGZvciAodyA9IDE7IHcgPCBuU3BlYzsgdysrKSAvKiBmb3IgQUNFTFAgLT4gRkQgc2hvcnQgKi8KKyAgeworICAgIGNvbnN0IEZJWFBfV1RQICpwV2luZG93X3ByZXY7CisKKyAgICAvKiBTZXR1cCB3aW5kb3cgcG9pbnRlcnMgKi8KKyAgICBwV2luZG93X3ByZXYgPSBoTWRjdC0+cHJldl93cnM7CisKKyAgICAvKiBDdXJyZW50IHNwZWN0cnVtICovCisgICAgcFNwZWMgPSBfcFNwZWMgKyB3ICogdGw7CisKKyAgICBzY2FsZSA9IHRvdGFsX2dhaW5fZTsKKworICAgIC8qIEZvciB0aGUgc2Vjb25kLCB0aGlyZCwgZXRjLiBzaG9ydCBmcmFtZXMgdGhlIGFsaXNhaW5nIHN5bW1ldHJ5IGlzIGVxdWFsLAorICAgICAqIGVpdGhlciAoMCwwKSBvciAoMSwxKSAqLworICAgIGlmIChjdXJyQWxpYXNpbmdTeW1tZXRyeSA9PSAwKSB7CisgICAgICAvKiBEQ1QgSVYgb2YgY3VycmVudCBzcGVjdHJ1bSAqLworICAgICAgZGN0X0lWKHBTcGVjLCB0bCwgJnNjYWxlKTsKKyAgICB9IGVsc2UgeworICAgICAgZHN0X0lWKHBTcGVjLCB0bCwgJnNjYWxlKTsKKyAgICB9CisKKyAgICAvKiBPcHRpb25hbCBzY2FsaW5nIG9mIHRpbWUgZG9tYWluIC0gbm8geWV0IHdpbmRvd2VkIC0gb2YgY3VycmVudCBzcGVjdHJ1bQorICAgICAqLworICAgIC8qIGFuZCBkZS1zY2FsZSBjdXJyZW50IHNwZWN0cnVtIHNpZ25hbCAodGltZSBkb21haW4sIG5vIHlldCB3aW5kb3dlZCkgKi8KKyAgICBpZiAodG90YWxfZ2FpbiAhPSAoRklYUF9EQkwpMCkgeworICAgICAgc2NhbGVWYWx1ZXNXaXRoRmFjdG9yKHBTcGVjLCB0b3RhbF9nYWluLCB0bCwgc3BlY19zY2FsZVt3XSArIHNjYWxlKTsKKyAgICB9IGVsc2UgeworICAgICAgc2NhbGVWYWx1ZXMocFNwZWMsIHRsLCBzcGVjX3NjYWxlW3ddICsgc2NhbGUpOworICAgIH0KKworICAgIGlmIChub091dFNhbXBsZXMgPD0gbnJTYW1wbGVzKSB7CisgICAgICAvKiBEaXZlcnQgb3V0cHV0IGZpcnN0IGhhbGYgdG8gb3ZlcmxhcCBidWZmZXIgaWYgd2UgYWxyZWFkeSBnb3QgZW5vdWdoCisgICAgICAgKiBvdXRwdXQgc2FtcGxlcy4gKi8KKyAgICAgIHBPdXQwID0gaE1kY3QtPm92ZXJsYXAudGltZSArIGhNZGN0LT5vdl9vZmZzZXQ7CisgICAgICBoTWRjdC0+b3Zfb2Zmc2V0ICs9IGhNZGN0LT5wcmV2X25yICsgZmwgLyAyOworICAgIH0gZWxzZSB7CisgICAgICAvKiBBY2NvdW50IG91dHB1dCBzYW1wbGVzICovCisgICAgICBuclNhbXBsZXMgKz0gaE1kY3QtPnByZXZfbnIgKyBmbCAvIDI7CisgICAgfQorCisgICAgLyogTlIgb3V0cHV0IHNhbXBsZXMgMCAuLiBOUi4gLW92ZXJsYXBbVEwvMi4uVEwvMi1OUl0gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaE1kY3QtPnByZXZfbnI7IGkrKykgeworICAgICAgRklYUF9EQkwgeCA9IC0oKnBPdmwtLSk7CisgICAgICAqcE91dDAgPSBJTURDVF9TQ0FMRV9EQkwoeCk7CisgICAgICBwT3V0MCsrOworICAgIH0KKworICAgIGlmIChub091dFNhbXBsZXMgPD0gbnJTYW1wbGVzKSB7CisgICAgICAvKiBEaXZlcnQgb3V0cHV0IHNlY29uZCBoYWxmIHRvIG92ZXJsYXAgYnVmZmVyIGlmIHdlIGFscmVhZHkgZ290IGVub3VnaAorICAgICAgICogb3V0cHV0IHNhbXBsZXMuICovCisgICAgICBwT3V0MSA9IGhNZGN0LT5vdmVybGFwLnRpbWUgKyBoTWRjdC0+b3Zfb2Zmc2V0ICsgZmwgLyAyIC0gMTsKKyAgICAgIGhNZGN0LT5vdl9vZmZzZXQgKz0gZmwgLyAyICsgbmw7CisgICAgfSBlbHNlIHsKKyAgICAgIHBPdXQxID0gcE91dDAgKyAoZmwgLSAxKTsKKyAgICAgIG5yU2FtcGxlcyArPSBmbCAvIDIgKyBubDsKKyAgICB9CisKKyAgICAvKiBvdXRwdXQgc2FtcGxlcyBiZWZvcmUgd2luZG93IGNyb3NzaW5nIHBvaW50IE5SIC4uIFRMLzIuCisgICAgICogLW92ZXJsYXBbVEwvMi1OUi4uVEwvMi1OUi1GTC8yXSArIGN1cnJlbnRbTlIuLlRMLzJdICovCisgICAgLyogb3V0cHV0IHNhbXBsZXMgYWZ0ZXIgd2luZG93IGNyb3NzaW5nIHBvaW50IFRMLzIgLi4gVEwvMitGTC8yLgorICAgICAqIC1vdmVybGFwWzAuLkZMLzJdIC0gY3VycmVudFtUTC8yLi5GTC8yXSAqLworICAgIHBDdXJyID0gcFNwZWMgKyB0bCAtIGZsIC8gMjsKKyAgICBpZiAoY3VyckFsaWFzaW5nU3ltbWV0cnkgPT0gMCkgeworICAgICAgZm9yIChpID0gMDsgaSA8IGZsIC8gMjsgaSsrKSB7CisgICAgICAgIEZJWFBfREJMIHgwLCB4MTsKKworICAgICAgICBjcGx4TXVsdCgmeDEsICZ4MCwgKnBDdXJyKyssIC0qcE92bC0tLCBwV2luZG93X3ByZXZbaV0pOworICAgICAgICAqcE91dDAgPSBJTURDVF9TQ0FMRV9EQkwoeDApOworICAgICAgICAqcE91dDEgPSBJTURDVF9TQ0FMRV9EQkwoLXgxKTsKKyAgICAgICAgcE91dDArKzsKKyAgICAgICAgcE91dDEtLTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGhNZGN0LT5wcmV2UHJldkFsaWFzU3ltbWV0cnkgPT0gMCkgeworICAgICAgICAvKiBKdW1wIERTVCBJSSAtPiBEU1QgSVYgZm9yIHRoZSBzZWNvbmQgd2luZG93ICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmbCAvIDI7IGkrKykgeworICAgICAgICAgIEZJWFBfREJMIHgwLCB4MTsKKworICAgICAgICAgIGNwbHhNdWx0KCZ4MSwgJngwLCAqcEN1cnIrKywgLSpwT3ZsLS0sIHBXaW5kb3dfcHJldltpXSk7CisgICAgICAgICAgKnBPdXQwID0gSU1EQ1RfU0NBTEVfREJMKHgwKTsKKyAgICAgICAgICAqcE91dDEgPSBJTURDVF9TQ0FMRV9EQkwoeDEpOworICAgICAgICAgIHBPdXQwKys7CisgICAgICAgICAgcE91dDEtLTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogSnVtcCBEU1QgSVYgLT4gRFNUIElWIGZyb20gdGhlIHNlY29uZCB3aW5kb3cgb24gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZsIC8gMjsgaSsrKSB7CisgICAgICAgICAgRklYUF9EQkwgeDAsIHgxOworCisgICAgICAgICAgY3BseE11bHQoJngxLCAmeDAsICpwQ3VycisrLCAqcE92bC0tLCBwV2luZG93X3ByZXZbaV0pOworICAgICAgICAgICpwT3V0MCA9IElNRENUX1NDQUxFX0RCTCh4MCk7CisgICAgICAgICAgKnBPdXQxID0gSU1EQ1RfU0NBTEVfREJMKHgxKTsKKyAgICAgICAgICBwT3V0MCsrOworICAgICAgICAgIHBPdXQxLS07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaE1kY3QtPnBGYWNaaXIgIT0gMCkgeworICAgICAgLyogYWRkIEZBQyBaSVIgb2YgcHJldmlvdXMgQUNFTFAgLT4gbWRjdCB0cmFuc2l0aW9uICovCisgICAgICBGSVhQX0RCTCAqcE91dCA9IHBPdXQwIC0gZmwgLyAyOworICAgICAgRkRLX0FTU0VSVChmbCAvIDIgPD0gMTI4KTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBmbCAvIDI7IGkrKykgeworICAgICAgICBwT3V0W2ldICs9IElNRENUX1NDQUxFX0RCTChoTWRjdC0+cEZhY1ppcltpXSk7CisgICAgICB9CisgICAgICBoTWRjdC0+cEZhY1ppciA9IE5VTEw7CisgICAgfQorICAgIHBPdXQwICs9IChmbCAvIDIpOworCisgICAgLyogTkwgb3V0cHV0IHNhbXBsZXMgVEwvMitGTC8yLi5UTC4gLSBjdXJyZW50W0ZMLzIuLjBdICovCisgICAgcE91dDEgKz0gKGZsIC8gMikgKyAxOworICAgIHBDdXJyID0gcFNwZWMgKyB0bCAtIGZsIC8gMiAtIDE7CisgICAgZm9yIChpID0gMDsgaSA8IG5sOyBpKyspIHsKKyAgICAgIEZJWFBfREJMIHggPSAtKCpwQ3Vyci0tKTsKKyAgICAgICpwT3V0MSA9IElNRENUX1NDQUxFX0RCTCh4KTsKKyAgICAgIHBPdXQxKys7CisgICAgfQorCisgICAgLyogU2V0IG92ZXJsYXAgc291cmNlIHBvaW50ZXIgZm9yIG5leHQgd2luZG93IHBPdmwgPSBwU3BlYyArIHRsLzIgLSAxOyAqLworICAgIHBPdmwgPSBwU3BlYyArIHRsIC8gMiAtIDE7CisKKyAgICAvKiBQcmV2aW91cyB3aW5kb3cgdmFsdWVzLiAqLworICAgIGhNZGN0LT5wcmV2X25yID0gbnI7CisgICAgaE1kY3QtPnByZXZfZnIgPSBmcjsKKyAgICBoTWRjdC0+cHJldl90bCA9IHRsOworICAgIGhNZGN0LT5wcmV2X3dycyA9IHBXaW5kb3dfcHJldjsKKyAgICBoTWRjdC0+cHJldlByZXZBbGlhc1N5bW1ldHJ5ID0gaE1kY3QtPnByZXZBbGlhc1N5bW1ldHJ5OworICAgIGhNZGN0LT5wcmV2QWxpYXNTeW1tZXRyeSA9IGN1cnJBbGlhc2luZ1N5bW1ldHJ5OworICB9CisKKyAgLyogU2F2ZSBvdmVybGFwICovCisKKyAgcE92bCA9IGhNZGN0LT5vdmVybGFwLmZyZXEgKyBoTWRjdC0+b3Zfc2l6ZSAtIHRsIC8gMjsKKyAgRkRLX0FTU0VSVChwT3ZsID49IGhNZGN0LT5vdmVybGFwLnRpbWUgKyBoTWRjdC0+b3Zfb2Zmc2V0KTsKKyAgRkRLX0FTU0VSVCh0bCAvIDIgPD0gaE1kY3QtPm92X3NpemUpOworICBmb3IgKGkgPSAwOyBpIDwgdGwgLyAyOyBpKyspIHsKKyAgICBwT3ZsW2ldID0gX3BTcGVjW2kgKyAodyAtIDEpICogdGxdOworICB9CisKKyAgcmV0dXJuIG5yU2FtcGxlczsKK30KZGlmZiAtLWdpdCBhL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19mYWMuaCBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19mYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjEzNTUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX2ZhYy5oCkBAIC0wLDAgKzEsMTkxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCisKKyAgIERlc2NyaXB0aW9uOiBVU0FDIEZBQworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFVTQUNERUNfRkFDX0gKKyNkZWZpbmUgVVNBQ0RFQ19GQUNfSAorCisjaW5jbHVkZSAiY2hhbm5lbGluZm8uaCIKKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisKKy8qKgorICogXGJyaWVmIEdldCB0aGUgYWRkcmVzcyBvZiBhIG1lbW9yeSBhcmVhIG9mIHRoZSBzcGVjdHJhbCBkYXRhIG1lbW9yeSB3ZXJlIHRoZQorICogRkFDIGRhdGEgY2FuIGJlIHN0b3JlZCBpbnRvLgorICogXHBhcmFtIHNwZWMgU1BFQ1RSQUxfUFRSIHBvaW50aW5nIHRvIHRoZSBjdXJyZW50IHNwZWN0cmFsIGRhdGEuCisgKiBccGFyYW0gbW9kIHRoZSBjdXJyZW50IExQRCBtb2QgYXJyYXkuCisgKiBccGFyYW0gcFN0YXRlIHBvaW50ZXIgdG8gYSBwcml2YXRlIHN0YXRlIHZhcmlhYmxlIHdoaWNoIG11c3QgYmUgMCBmb3IgdGhlCisgKiBmaXJzdCBjYWxsIGFuZCBub3QgY2hhbmdlZCBleHRlcm5hbGx5LgorICogXHBhcmFtIGlzRnVsbGJhbmRMUEQgaXMgMSBpZiBmdWxsYmFuZCBMUEQgbW9kZSBpcyBvbiwgb3RoZXJ3aXNlIGl0IGlzIDAuCisgKi8KK0ZJWFBfREJMICpDTHBkX0ZBQ19HZXRNZW1vcnkoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgbW9kW05CX1NVQkZSXSwgaW50ICpwU3RhdGUpOworCisvKioKKyAqIFxicmllZiByZWFkIGEgZmFjIGJpdHN0cmVhbSBkYXRhIGJsb2NrLgorICogXHBhcmFtIGhCcyBhIGJpdCBzdHJlYW0gaGFuZGxlLCB3aGVyZSB0aGUgZmFjIGJpdHN0cmVhbSBkYXRhIGlzIGxvY2F0ZWQuCisgKiBccGFyYW0gcEZhYyBwb2ludGVyIHRvIHdlcmUgdGhlIEZBQyBkYXRhIHdpbGwgYmUgc3RvcmVkIGludG8uCisgKiBccGFyYW0gcEZhY1NjYWxlIHBvaW50ZXIgdG8gd2VyZSB0aGUgRkFDIGRhdGEgc2NhbGUgdmFsdWUgd2lsbCBiZSBzdG9yZWQKKyAqIGludG8uCisgKiBccGFyYW0gdGN4X2dhaW4gdmFsdWUgdG8gYmUgdXNlZCBhcyBGQUMgZ2Fpbi4gSWYgemVybywgcmVhZCBmYWNfZ2FpbiBmcm9tCisgKiBiaXRzdHJlYW0uCisgKiBccGFyYW0gdGN4X2dhaW5fZSBleHBvbmVuIHZhbHVlIG9mIHRjeF9nYWluLgorICogXHBhcmFtIGZyYW1lIHRoZSBzdWJmcmFtZSB0byBiZSBjb25zaWRlcmVkIGZyb20gdGhlIGN1cnJlbnQgc3VwZXJmcmFtZS4KKyAqIEFsd2F5cyAwIGZvciBGRCBjYXNlLgorICogXHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLgorICovCitpbnQgQ0xwZF9GQUNfUmVhZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIEZJWFBfREJMICpwRmFjLCBVQ0hBUiAqcEZhY1NjYWxlLAorICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwgaW50IHVzZV9nYWluLCBpbnQgZnJhbWUpOworCisvKioKKyAqIFxicmllZiBBcHBseSBUQ1ggYW5kIEFMRkQgZ2FpbnMgdG8gRkFDIGRhdGEuCisgKiBccGFyYW0gZmFjX2RhdGEgcG9pbnRlciB0byBGQUMgZGF0YS4KKyAqIFxwYXJhbSBmYWNfbGVuZ3RoIEZBQyBsZW5ndGggKDEyOCBvciA5NikuCisgKiBccGFyYW0gdGN4X2dhaW4gVENYIGdhaW4KKyAqIFxwYXJhbSBhbGZkX2dhaW5zIHBvaW50ZXIgdG8gYWxmZCBnYWlucy4KKyAqIFxwYXJhbSBtb2QgbW9kIHZhbHVlICgxLDIsMykgb2YgVENYIGZyYW1lIHdoZXJlIHRoZSBGQUMgc2lnbmFsIG5lZWRzIHRvIGJlCisgKiBhcHBsaWVkLgorICovCit2b2lkIENGYWNfQXBwbHlHYWlucyhGSVhQX0RCTCBmYWNfZGF0YVtMRkFDXSwgY29uc3QgSU5UIGZhY19sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCB0Y3hfZ2FpbiwgY29uc3QgRklYUF9EQkwgYWxmZF9nYWluc1tdLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG1vZCk7CisKKy8qKgorICogXGJyaWVmIERvIEZBQyB0cmFuc2l0aW9uIGZyb20gZnJlcXVlbmN5IGRvbWFpbiB0byBBQ0VMUCBkb21haW4uCisgKi8KK0lOVCBDTHBkX0ZBQ19NZGN0MkFjZWxwKEhfTURDVCBoTWRjdCwgRklYUF9EQkwgKm91dHB1dCwgRklYUF9EQkwgKnBGYWNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmYWNfZGF0YV9lLCBGSVhQX0xQQyAqQSwgSU5UIEFfZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5yT3V0U2FtcGxlcywgY29uc3QgSU5UIGZhY19sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaXNGZEZhYywgVUNIQVIgcHJldldpbmRvd1NoYXBlKTsKKworLyoqCisgKiBcYnJpZWYgRG8gRkFDIHRyYW5zaXRpb24gZnJvbSBBQ0VMUCBkb21haW4gdG8gZnJlcXVlbmN5IGRvbWFpbi4KKyAqIFxwYXJhbSBoTWRjdCBNRENUIGNvbnRleHQuCisgKiBccGFyYW0gb3V0cHV0IHBvaW50ZXIgZm9yIHRpbWUgZG9tYWluIG91dHB1dC4KKyAqIFxwYXJhbSBwU3BlYyBwb2ludGVyIHRvIE1EQ1Qgc3BlY3RydW0gaW5wdXQuCisgKiBccGFyYW0gc3BlY19zY2FsZSBNRENUIHNwZWN0cnVtIGV4cG9uZW50cy4KKyAqIFxwYXJhbSBuU3BlYyBhbW91bnQgb2YgY29udGlndW9zIE1EQ1Qgc3BlY3RyYS4KKyAqIFxwYXJhbSBwRmFjIHBvaW50ZXIgdG8gRkFDIE1EQ1QgZG9tYWluIGRhdGEuCisgKiBccGFyYW0gZmFjX3NjYWxlIGV4cG9uZW50IG9mIEZBQyBkYXRhLgorICogXHBhcmFtIGZhY19sZW5ndGggbGVuZ3RoIG9mIEZBQyBkYXRhLgorICogXHBhcmFtIG5yU2FtcGxlcyByb29tIGluIHNhbXBsZXMgaW4gb3V0cHV0IGJ1ZmZlci4KKyAqIFxwYXJhbSB0bCBNRENUIHRyYW5zZm9ybSBsZW5ndGggb2YgcFNwZWMuCisgKiBccGFyYW0gd3JzIHJpZ2h0IE1EQ1Qgd2luZG93IHNsb3BlLgorICogXHBhcmFtIGZyIHJpZ2h0IE1EQ1Qgd2luZG93IHNsb3BlIGxlbmd0aC4KKyAqIFxwYXJhbSBBIExQIGRvbWFpbiBmaWx0ZXIgY29lZmZpY2llbnRzLgorICogXHBhcmFtIGRlZW1waF9tZW0gZGVlbXBoYXNpcyBmaWx0ZXIgc3RhdGUuCisgKiBccGFyYW0gZ2FpbiBnYWluIHRvIGJlIGFwcGxpZWQgdG8gRkFDIGRhdGEgYmVmb3JlIG92ZXJsYXAgYWRkLgorICogXHBhcmFtIG9sZF9zeW5fbWVtIFN5bnRoZXNpcyBmaWx0ZXIgc3RhdGUuCisgKiBccGFyYW0gaXNGZEZhYyBpbmRpY2F0ZXMgZmFjIHByb2Nlc3NpbmcgZnJvbSBvciB0byBGRC4KKyAqIFxwYXJhbSBwRmFjRGF0YSBmYWMgZGF0YSBzdG9yZWQgZm9yIGZ1bGxiYW5kIExQRC4KKyAqIFxwYXJhbSBlbEZsYWdzIGVsZW1lbnQgc3BlY2lmaWMgcGFyc2VyIGd1aWRhbmNlIGZsYWdzLgorICogXHBhcmFtIGlzRmFjRm9yRnVsbGJhbmQgaW5kaWNhdGVzIHRoYXQgZmFjIGlzIHByb2Nlc3NlZCBmb3IgZnVsbGJhbmQgTFBELgorICovCitJTlQgQ0xwZF9GQUNfQWNlbHAyTWRjdChIX01EQ1QgaE1kY3QsIEZJWFBfREJMICpvdXRwdXQsIEZJWFBfREJMICpwU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUIHNwZWNfc2NhbGVbXSwgY29uc3QgaW50IG5TcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBGYWNfZGF0YSwgY29uc3QgaW50IGZhY19kYXRhX2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZmFjX2xlbmd0aCwgSU5UIG5yU2FtcGxlcywgY29uc3QgSU5UIHRsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9XVFAgKndycywgY29uc3QgSU5UIGZyLCBGSVhQX0xQQyBBWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCBBX2V4cCwgQ0FjZWxwU3RhdGljTWVtICphY2VscF9tZW0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBnYWluLCBjb25zdCBpbnQgbGFzdF9mcmFtZV9sb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGlzRmRGYWMsIGNvbnN0IFVDSEFSIGxhc3RfbHBkLCBjb25zdCBpbnQgaywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdXJyQWxpYXNpbmdTeW1tZXRyeSk7CisKKyNlbmRpZiAvKiBVU0FDREVDX0ZBQ19IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL3VzYWNkZWNfbHBjLmNwcCBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19scGMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MTQ2M2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfbHBjLmNwcApAQCAtMCwwICsxLDExOTQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hdHRoaWFzIEhpbGRlbmJyYW5kLCBNYW51ZWwgSmFuZGVyCisKKyAgIERlc2NyaXB0aW9uOiBVU0FDIExQQy9BVlEgZGVjb2RlCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2FjZGVjX2xwYy5oIgorCisjaW5jbHVkZSAidXNhY2RlY19yb20uaCIKKyNpbmNsdWRlICJGREtfdHJpZ0ZjdHMuaCIKKworI2RlZmluZSBOUV9NQVggMzYKKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbnMuCisgKi8KKworLyoqCisgKiBcYnJpZWYgUmVhZCB1bmFyeSBjb2RlLgorICogXHBhcmFtIGhCcyBiaXRzdHJlYW0gaGFuZGxlIGFzIGRhdGEgc291cmNlLgorICogXHJldHVybiBkZWNvZGVkIHZhbHVlLgorICovCitzdGF0aWMgaW50IGdldF92bGNsYmYoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzKSB7CisgIGludCByZXN1bHQgPSAwOworCisgIHdoaWxlIChGREtyZWFkQml0cyhoQnMsIDEpICYmIHJlc3VsdCA8PSBOUV9NQVgpIHsKKyAgICByZXN1bHQrKzsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFxicmllZiBSZWFkIGJpdCBjb3VudCBsaW1pdGVkIHVuYXJ5IGNvZGUuCisgKiBccGFyYW0gaEJzIGJpdHN0cmVhbSBoYW5kbGUgYXMgZGF0YSBzb3VyY2UKKyAqIFxwYXJhbSBuIG1heCBhbW91bnQgb2YgYml0cyB0byBiZSByZWFkLgorICogXHJldHVybiBkZWNvZGVkIHZhbHVlLgorICovCitzdGF0aWMgaW50IGdldF92bGNsYmZfbihIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIGludCBuKSB7CisgIGludCByZXN1bHQgPSAwOworCisgIHdoaWxlIChGREtyZWFkQml0cyhoQnMsIDEpKSB7CisgICAgcmVzdWx0Kys7CisgICAgbi0tOworICAgIGlmIChuIDw9IDApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBBbGdlYnJhaWMgVmVjdG9yIFF1YW50aXplcgorICovCisKKy8qIFpGX1NDQUxFIG11c3QgYmUgZ3JlYXRlciB0aGFuIChudW1iZXIgb2YgRklYUF9aRikvMgorICAgYmVjYXVzZSB0aGUgbG9zcyBvZiBwcmVjaXNpb24gY2F1c2VkIGJ5IGZQb3cyRGl2MiBpbiBSRThfUFBWKCkgKi8KKy8vI2RlZmluZSBaRl9TQ0FMRSAoKE5RX01BWC0zKT4+MSkKKyNkZWZpbmUgWkZfU0NBTEUgKChERlJBQ1RfQklUUyAvIDIpKQorI2RlZmluZSBGSVhQX1pGIEZJWFBfREJMCisjZGVmaW5lIElOVDJaRih4LCBzKSAoRklYUF9aRikoKHgpIDw8IChaRl9TQ0FMRSAtIChzKSkpCisjZGVmaW5lIFpGMklOVCh4KSAoSU5UKSgoeCkgPj4gWkZfU0NBTEUpCisKKy8qIDEuMCBpbiBaRiBmb3JtYXQgZm9ybWF0ICovCisjZGVmaW5lIE9ORVpGICgoRklYUF9aRilJTlQyWkYoMSwgMCkpCisKKy8qIHN0YXRpYyAqLwordm9pZCBuZWFyZXN0X25laWdoYm9yXzJEOChGSVhQX1pGIHhbOF0sIGludCB5WzhdKSB7CisgIEZJWFBfWkYgcywgZW0sIGVbOF07CisgIGludCBpLCBqLCBzdW07CisKKyAgLyogcm91bmQgeCBpbnRvIDJaXjggaS5lLiBjb21wdXRlIHk9KHkxLC4uLix5OCkgc3VjaCB0aGF0IHlpID0gMlt4aS8yXQorICAgICB3aGVyZSBbLl0gaXMgdGhlIG5lYXJlc3QgaW50ZWdlciBvcGVyYXRvcgorICAgICBpbiB0aGUgbWVhbiB0aW1lLCBjb21wdXRlIHN1bSA9IHkxKy4uLit5OAorICAqLworICBzdW0gPSAwOworICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgRklYUF9aRiB0bXA7CisgICAgLyogcm91bmQgdG8gLi4uLCAtMiwgMCwgMiwgLi4uIChbLTEuLjFbIC0tPiAwKSAqLworICAgIGlmICh4W2ldIDwgKEZJWFBfWkYpMCkgeworICAgICAgdG1wID0gT05FWkYgLSB4W2ldOworICAgICAgeVtpXSA9IC0yICogKChaRjJJTlQodG1wKSkgPj4gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRtcCA9IE9ORVpGICsgeFtpXTsKKyAgICAgIHlbaV0gPSAyICogKChaRjJJTlQodG1wKSkgPj4gMSk7CisgICAgfQorICAgIHN1bSArPSB5W2ldOworICB9CisgIC8qIGNoZWNrIGlmIHkxKy4uLit5OCBpcyBhIG11bHRpcGxlIG9mIDQKKyAgICAgaWYgbm90LCB5IGlzIG5vdCByb3VuZCB4aiBpbiB0aGUgd3Jvbmcgd2F5IHdoZXJlIGogaXMgZGVmaW5lZCBieQorICAgICAgICBqID0gYXJnIG1heF9pIHwgeGkgLXlpfAorICAgICAodGhpcyBpcyBjYWxsZWQgdGhlIFdhZ25lciBydWxlKQorICAqLworICBpZiAoc3VtICUgNCkgeworICAgIC8qIGZpbmQgaiA9IGFyZyBtYXhfaSB8IHhpIC15aXwgKi8KKyAgICBlbSA9IChGSVhQX1NHTCkwOworICAgIGogPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgIC8qIGNvbXB1dGUgZWkgPSB4aS15aSAqLworICAgICAgZVtpXSA9IHhbaV0gLSBJTlQyWkYoeVtpXSwgMCk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgIC8qIGNvbXB1dGUgfGVpfCA9IHwgeGkteWkgfCAqLworICAgICAgaWYgKGVbaV0gPCAoRklYUF9aRikwKSB7CisgICAgICAgIHMgPSAtZVtpXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHMgPSBlW2ldOworICAgICAgfQorICAgICAgLyogY2hlY2sgaWYgfGVpfCBpcyBtYXhpbWFsLCBpZiBzbywgc2V0IGo9aSAqLworICAgICAgaWYgKGVtIDwgcykgeworICAgICAgICBlbSA9IHM7CisgICAgICAgIGogPSBpOworICAgICAgfQorICAgIH0KKyAgICAvKiByb3VuZCB4aiBpbiB0aGUgIndyb25nIHdheSIgKi8KKyAgICBpZiAoZVtqXSA8IChGSVhQX1pGKTApIHsKKyAgICAgIHlbal0gLT0gMjsKKyAgICB9IGVsc2UgeworICAgICAgeVtqXSArPSAyOworICAgIH0KKyAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFJFOF9QUFYoeCx5KQorICBORUFSRVNUIE5FSUdIQk9SIFNFQVJDSCBJTiBJTkZJTklURSBMQVRUSUNFIFJFOAorICB0aGUgYWxnb3JpdGhtIGlzIGJhc2VkIG9uIHRoZSBkZWZpbml0aW9uIG9mIFJFOCBhcworICAgICAgUkU4ID0gKDJEOCkgVSAoMkQ4K1sxLDEsMSwxLDEsMSwxLDFdKQorICBpdCBhcHBsaWVzIHRoZSBjb3NldCBkZWNvZGluZyBvZiBTbG9hbmUgYW5kIENvbndheQorICAoaSkgeDogcG9pbnQgaW4gUl44IGluIDMyLVpGX1NDQUxFLlpGX1NDQUxFIGZvcm1hdAorICAobykgeTogcG9pbnQgaW4gUkU4ICg4LWRpbWVuc2lvbmFsIGludGVnZXIgdmVjdG9yKQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKy8qIHN0YXRpYyAqLwordm9pZCBSRThfUFBWKEZJWFBfWkYgeFtdLCBTSE9SVCB5W10sIGludCByKSB7CisgIGludCBpLCB5MFs4XSwgeTFbOF07CisgIEZJWFBfWkYgeDFbOF0sIHRtcDsKKyAgRklYUF9EQkwgZTsKKworICAvKiBmaW5kIHRoZSBuZWFyZXN0IG5laWdoYm9yIHkwIG9mIHggaW4gMkQ4ICovCisgIG5lYXJlc3RfbmVpZ2hib3JfMkQ4KHgsIHkwKTsKKyAgLyogZmluZCB0aGUgbmVhcmVzdCBuZWlnaGJvciB5MSBvZiB4IGluIDJEOCsoMSwuLi4sMSkgKGJ5IGNvc2V0IGRlY29kaW5nKSAqLworICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgeDFbaV0gPSB4W2ldIC0gT05FWkY7CisgIH0KKyAgbmVhcmVzdF9uZWlnaGJvcl8yRDgoeDEsIHkxKTsKKyAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgIHkxW2ldICs9IDE7CisgIH0KKworICAvKiBjb21wdXRlIGUwPXx8eC15MHx8XjIgYW5kIGUxPXx8eC15MXx8XjIgKi8KKyAgZSA9IChGSVhQX0RCTCkwOworICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgdG1wID0geFtpXSAtIElOVDJaRih5MFtpXSwgMCk7CisgICAgZSArPSBmUG93MkRpdjIoCisgICAgICAgIHRtcCA8PCByKTsgLyogc2hpZnQgbGVmdCB0byBlbnN1cmUgdGhhdCBubyBmcmFjdCBwYXJ0IGJpdHMgZ2V0IGxvc3QuICovCisgICAgdG1wID0geFtpXSAtIElOVDJaRih5MVtpXSwgMCk7CisgICAgZSAtPSBmUG93MkRpdjIodG1wIDw8IHIpOworICB9CisgIC8qIHNlbGVjdCBiZXN0IGNhbmRpZGF0ZSB5MCBvciB5MSB0byBtaW5pbWl6ZSBkaXN0b3J0aW9uICovCisgIGlmIChlIDwgKEZJWFBfREJMKTApIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICB5W2ldID0geTBbaV07CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgIHlbaV0gPSB5MVtpXTsKKyAgICB9CisgIH0KK30KKworLyogdGFibGUgbG9vay11cCBvZiB1bnNpZ25lZCB2YWx1ZTogZmluZCBpIHdoZXJlIGluZGV4ID49IHRhYmxlW2ldCisgICBOb3RlOiByYW5nZSBtdXN0IGJlID49IDIsIGluZGV4IG11c3QgYmUgPj0gdGFibGVbMF0gKi8KK3N0YXRpYyBpbnQgdGFibGVfbG9va3VwKGNvbnN0IFVTSE9SVCAqdGFibGUsIHVuc2lnbmVkIGludCBpbmRleCwgaW50IHJhbmdlKSB7CisgIGludCBpOworCisgIGZvciAoaSA9IDQ7IGkgPCByYW5nZTsgaSArPSA0KSB7CisgICAgaWYgKGluZGV4IDwgdGFibGVbaV0pIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoaSA+IHJhbmdlKSB7CisgICAgaSA9IHJhbmdlOworICB9CisKKyAgaWYgKGluZGV4IDwgdGFibGVbaSAtIDJdKSB7CisgICAgaSAtPSAyOworICB9CisgIGlmIChpbmRleCA8IHRhYmxlW2kgLSAxXSkgeworICAgIGktLTsKKyAgfQorICBpLS07CisKKyAgcmV0dXJuIChpKTsgLyogaW5kZXggPj0gdGFibGVbaV0gKi8KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICByZThfZGVjb2RlX3Jhbmtfb2ZfcGVybXV0YXRpb24ocmFuaywgeHMsIHgpCisgIERFQ09ESU5HIE9GIFRIRSBSQU5LIE9GIFRIRSBQRVJNVVRBVElPTiBPRiB4cworICAoaSkgcmFuazogaW5kZXggKHJhbmspIG9mIGEgcGVybXV0YXRpb24KKyAgKGkpIHhzOiAgIHNpZ25lZCBsZWFkZXIgaW4gUkU4ICg4LWRpbWVuc2lvbmFsIGludGVnZXIgdmVjdG9yKQorICAobykgeDogICAgcG9pbnQgaW4gUkU4ICg4LWRpbWVuc2lvbmFsIGludGVnZXIgdmVjdG9yKQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgdm9pZCByZThfZGVjb2RlX3Jhbmtfb2ZfcGVybXV0YXRpb24oaW50IHJhbmssIGludCAqeHMsIFNIT1JUIHhbOF0pIHsKKyAgSU5UIGFbOF0sIHdbOF0sIEIsIGZhYywgZmFjX0IsIHRhcmdldDsKKyAgaW50IGksIGo7CisKKyAgLyogLS0tIHByZS1wcm9jZXNzaW5nIGJhc2VkIG9uIHRoZSBzaWduZWQgbGVhZGVyIHhzIC0tLQorICAgICAtIGNvbXB1dGUgdGhlIGFscGhhYmV0IGE9W2FbMF0gLi4uIGFbcS0xXV0gb2YgeCAocSBlbGVtZW50cykKKyAgICAgICBzdWNoIHRoYXQgYVswXSE9Li4uIT1hW3EtMV0KKyAgICAgICBpdCBpcyBhc3N1bWVkIHRoYXQgeHMgaXMgc29ydGVkIGluIHRoZSBmb3JtIG9mIGEgc2lnbmVkIGxlYWRlcgorICAgICAgIHdoaWNoIGNhbiBiZSBzdW1tYXJpemVkIGluIDIgcmVxdWlyZW1lbnRzOgorICAgICAgICAgIGEpIHx4c1swXXwgPj0gfHhzWzFdfCA+PSB8eHNbMl18ID49IC4uLiA+PSB8eHNbN118CisgICAgICAgICAgYikgaWYgfHhzW2ldfD18eHNbaS0xXXwsIHhzW2ldPj14c1tpKzFdCisgICAgICAgd2hlcmUgfC58IGluZGljYXRlcyB0aGUgYWJzb2x1dGUgdmFsdWUgb3BlcmF0b3IKKyAgICAgLSBjb21wdXRlIHEgKHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiB0aGUgYWxwaGFiZXQpCisgICAgIC0gY29tcHV0ZSB3WzAuLnEtMV0gd2hlcmUgd1tqXSBjb3VudHMgdGhlIG51bWJlciBvZiBvY2N1cmVuY2VzIG9mCisgICAgICAgdGhlIHN5bWJvbCBhW2pdIGluIHhzCisgICAgIC0gY29tcHV0ZSBCID0gcHJvZF9qPTAuLnEtMSAod1tqXSEpIHdoZXJlIC4hIGlzIHRoZSBmYWN0b3JpYWwgKi8KKyAgLyogeHNbaV0sIHhzW2ktMV0gYW5kIHB0cl93L2EqLworICBqID0gMDsKKyAgd1tqXSA9IDE7CisgIGFbal0gPSB4c1swXTsKKyAgQiA9IDE7CisgIGZvciAoaSA9IDE7IGkgPCA4OyBpKyspIHsKKyAgICBpZiAoeHNbaV0gIT0geHNbaSAtIDFdKSB7CisgICAgICBqKys7CisgICAgICB3W2pdID0gMTsKKyAgICAgIGFbal0gPSB4c1tpXTsKKyAgICB9IGVsc2UgeworICAgICAgd1tqXSsrOworICAgICAgQiAqPSB3W2pdOworICAgIH0KKyAgfQorCisgIC8qIC0tLSBhY3R1YWwgcmFuayBkZWNvZGluZyAtLS0KKyAgICAgdGhlIHJhbmsgb2YgeCAod2hlcmUgeCBpcyBhIHBlcm11dGF0aW9uIG9mIHhzKSBpcyBiYXNlZCBvbgorICAgICBTY2hhbGt3aWprJ3MgZm9ybXVsYQorICAgICBpdCBpcyBnaXZlbiBieSByYW5rPXN1bV97az0wLi43fSAoQV9rICogZmFjX2svQl9rKQorICAgICB0aGUgZGVjb2Rpbmcgb2YgdGhpcyByYW5rIGlzIHNlcXVlbnRpYWwgYW5kIHJlY29uc3RydWN0cyB4WzAuLjddCisgICAgIGVsZW1lbnQgYnkgZWxlbWVudCBmcm9tIHhbMF0gdG8geFs3XQorICAgICBbdGhlIHRyaWNreSBwYXJ0IGlzIHRoZSBpbmZlcmVuY2Ugb2YgQV9rIGZvciBlYWNoIGsuLi5dCisgICAqLworCisgIGlmICh3WzBdID09IDgpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICB4W2ldID0gYVswXTsgLyogYXZvaWQgZmFjIG9mIDQwMzIwICovCisgICAgfQorICB9IGVsc2UgeworICAgIHRhcmdldCA9IHJhbmsgKiBCOworICAgIGZhY19CID0gMTsKKyAgICAvKiBkZWNvZGUgeCBlbGVtZW50IGJ5IGVsZW1lbnQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICBmYWMgPSBmYWNfQiAqIGZka19kZWNfdGFiX2ZhY3RvcmlhbFtpXTsgLyogZmFjID0gMS4uNTA0MCAqLworICAgICAgaiA9IC0xOworICAgICAgZG8geworICAgICAgICB0YXJnZXQgLT0gd1srK2pdICogZmFjOworICAgICAgfSB3aGlsZSAodGFyZ2V0ID49IDApOyAvKiBtYXggb2YgMzAgdGVzdHMgLyBTViAqLworICAgICAgeFtpXSA9IGFbal07CisgICAgICAvKiB1cGRhdGUgcmFuaywgZGVub21pbmF0b3IgQiAoQl9rKSBhbmQgY291bnRlciB3W2pdICovCisgICAgICB0YXJnZXQgKz0gd1tqXSAqIGZhYzsgLyogdGFyZ2V0ID0gZmFjX0IqQipyYW5rICovCisgICAgICBmYWNfQiAqPSB3W2pdOworICAgICAgd1tqXS0tOworICAgIH0KKyAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHJlOF9kZWNvZGVfYmFzZV9pbmRleChuLCBJLCB5KQorICBERUNPRElORyBPRiBBTiBJTkRFWCBJTiBRbiAobj0wLDIsMyBvciA0KQorICAoaSkgbjogY29kZWJvb2sgbnVtYmVyICgqbiBpcyBhbiBpbnRlZ2VyIGRlZmluZWQgaW4gezAsMiwzLDR9KQorICAoaSkgSTogaW5kZXggb2YgYyAocG9pbnRlciB0byB1bnNpZ25lZCAxNi1iaXQgd29yZCkKKyAgKG8pIHk6IHBvaW50IGluIFJFOCAoOC1kaW1lbnNpb25hbCBpbnRlZ2VyIHZlY3RvcikKKyAgbm90ZTogdGhlIGluZGV4IEkgaXMgZGVmaW5lZCBhcyBhIDMyLWJpdCB3b3JkLCBidXQgb25seQorICAxNiBiaXRzIGFyZSByZXF1aXJlZCAobG9uZyBjYW4gYmUgcmVwbGFjZWQgYnkgdW5zaWduZWQgaW50ZWdlcikKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIHZvaWQgcmU4X2RlY29kZV9iYXNlX2luZGV4KGludCAqbiwgVUlOVCBpbmRleCwgU0hPUlQgeVs4XSkgeworICBpbnQgaSwgaW0sIHQsIHNpZ25fY29kZSwga2EsIGtzLCByYW5rLCBsZWFkZXJbOF07CisKKyAgaWYgKCpuIDwgMikgeworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgIHlbaV0gPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBpbmRleCA9ICh1bnNpZ25lZCBpbnQpKkk7CisgICAgLyogc2VhcmNoIGZvciB0aGUgaWRlbnRpZmllciBrYSBvZiB0aGUgYWJzb2x1dGUgbGVhZGVyICh0YWJsZS1sb29rdXApCisgICAgICAgUTIgaXMgYSBzdWJzZXQgb2YgUTMgLSB0aGUgdHdvIGNhc2VzIGFyZSBjb25zaWRlcmVkIGluIHRoZSBzYW1lIGJyYW5jaAorICAgICAqLworICAgIHN3aXRjaCAoKm4pIHsKKyAgICAgIGNhc2UgMjoKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgaSA9IHRhYmxlX2xvb2t1cChmZGtfZGVjX0kzLCBpbmRleCwgTkJfTERRMyk7CisgICAgICAgIGthID0gZmRrX2RlY19BM1tpXTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ6CisgICAgICAgIGkgPSB0YWJsZV9sb29rdXAoZmRrX2RlY19JNCwgaW5kZXgsIE5CX0xEUTQpOworICAgICAgICBrYSA9IGZka19kZWNfQTRbaV07CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiByZWNvbnN0cnVjdCB0aGUgYWJzb2x1dGUgbGVhZGVyICovCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgbGVhZGVyW2ldID0gZmRrX2RlY19EYVtrYV1baV07CisgICAgfQorICAgIC8qIHNlYXJjaCBmb3IgdGhlIGlkZW50aWZpZXIga3Mgb2YgdGhlIHNpZ25lZCBsZWFkZXIgKHRhYmxlIGxvb2stdXApCisgICAgICAgKHRoaXMgc2VhcmNoIGlzIGZvY3VzZWQgYmFzZWQgb24gdGhlIGlkZW50aWZpZXIga2Egb2YgdGhlIGFic29sdXRlCisgICAgICAgIGxlYWRlcikqLworICAgIHQgPSBmZGtfZGVjX0lhW2thXTsKKyAgICBpbSA9IGZka19kZWNfTnNba2FdOworICAgIGtzID0gdGFibGVfbG9va3VwKGZka19kZWNfSXMgKyB0LCBpbmRleCwgaW0pOworCisgICAgLyogcmVjb25zdHJ1Y3QgdGhlIHNpZ25lZCBsZWFkZXIgZnJvbSBpdHMgc2lnbiBjb2RlICovCisgICAgc2lnbl9jb2RlID0gMiAqIGZka19kZWNfRHNbdCArIGtzXTsKKyAgICBmb3IgKGkgPSA3OyBpID49IDA7IGktLSkgeworICAgICAgbGVhZGVyW2ldICo9ICgxIC0gKHNpZ25fY29kZSAmIDIpKTsKKyAgICAgIHNpZ25fY29kZSA+Pj0gMTsKKyAgICB9CisKKyAgICAvKiBjb21wdXRlIGFuZCBkZWNvZGUgdGhlIHJhbmsgb2YgdGhlIHBlcm11dGF0aW9uICovCisgICAgcmFuayA9IGluZGV4IC0gZmRrX2RlY19Jc1t0ICsga3NdOyAvKiByYW5rID0gaW5kZXggLSBjYXJkaW5hbGl0eSBvZmZzZXQgKi8KKworICAgIHJlOF9kZWNvZGVfcmFua19vZl9wZXJtdXRhdGlvbihyYW5rLCBsZWFkZXIsIHkpOworICB9CisgIHJldHVybjsKK30KKworLyogcmU4X3kyayh5LG0saykKKyAgIFZPUk9OT0kgSU5ERVhJTkcgKElOREVYIERFQ09ESU5HKSBrIC0+IHkKKyAgIChpKSBrOiBWb3Jvbm9pIGluZGV4IGtbMC4uN10KKyAgIChpKSBtOiBWb3Jvbm9pIG1vZHVsbyAobSA9IDJeciA9IDE8PHIsIHdoZXJlIHIgaXMgaW50ZWdlciA+PTIpCisgICAoaSkgcjogVm9yb25vaSBvcmRlciAgKG0gPSAyXnIgPSAxPDxyLCB3aGVyZSByIGlzIGludGVnZXIgPj0yKQorICAgKG8pIHk6IDgtZGltZW5zaW9uYWwgcG9pbnQgeVswLi43XSBpbiBSRTgKKyAqLworc3RhdGljIHZvaWQgcmU4X2syeShpbnQgKmssIGludCByLCBTSE9SVCAqeSkgeworICBpbnQgaSwgdG1wLCBzdW07CisgIFNIT1JUIHZbOF07CisgIEZJWFBfWkYgemZbOF07CisKKyAgRkRLX0FTU0VSVChyIDw9IFpGX1NDQUxFKTsKKworICAvKiBjb21wdXRlIHkgPSBrIE0gYW5kIHo9KHktYSkvbSwgd2hlcmUKKyAgICAgTSA9IFs0ICAgICAgICBdCisgICAgICAgICBbMiAyICAgICAgXQorICAgICAgICAgW3wgICBcICAgIF0KKyAgICAgICAgIFsyICAgICAyICBdCisgICAgICAgICBbMSAxIF8gMSAxXQorICAgICBhPSgyLDAsLi4uLDApCisgICAgIG0gPSAxPDxyCisgICovCisgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICB5W2ldID0ga1s3XTsKKyAgfQorICB6Zls3XSA9IElOVDJaRih5WzddLCByKTsKKyAgc3VtID0gMDsKKyAgZm9yIChpID0gNjsgaSA+PSAxOyBpLS0pIHsKKyAgICB0bXAgPSAyICoga1tpXTsKKyAgICBzdW0gKz0gdG1wOworICAgIHlbaV0gKz0gdG1wOworICAgIHpmW2ldID0gSU5UMlpGKHlbaV0sIHIpOworICB9CisgIHlbMF0gKz0gKDQgKiBrWzBdICsgc3VtKTsKKyAgemZbMF0gPSBJTlQyWkYoeVswXSAtIDIsIHIpOworICAvKiBmaW5kIG5lYXJlc3QgbmVpZ2hib3IgdiBvZiB6IGluIGluZmluaXRlIFJFOCAqLworICBSRThfUFBWKHpmLCB2LCByKTsKKyAgLyogY29tcHV0ZSB5IC09IG0gdiAqLworICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgeVtpXSAtPSAoU0hPUlQpKHZbaV0gPDwgcik7CisgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBSRThfZGVjKG4sIEksIGssIHkpCisgIE1VTFRJLVJBVEUgSU5ERVhJTkcgT0YgQSBQT0lOVCB5IGluIFRIRSBMQVRUSUNFIFJFOCAoSU5ERVggREVDT0RJTkcpCisgIChpKSBuOiBjb2RlYm9vayBudW1iZXIgKCpuIGlzIGFuIGludGVnZXIgZGVmaW5lZCBpbiB7MCwyLDMsNCwuLixuX21heH0pLiBuX21heAorICA9IDM2IChpKSBJOiBpbmRleCBvZiBjIChwb2ludGVyIHRvIHVuc2lnbmVkIDE2LWJpdCB3b3JkKSAoaSkgazogaW5kZXggb2YgdgorICAoOC1kaW1lbnNpb25hbCB2ZWN0b3Igb2YgYmluYXJ5IGluZGljZXMpID0gVm9yb25vaSBpbmRleCAobykgeTogcG9pbnQgaW4gUkU4CisgICg4LWRpbWVuc2lvbmFsIGludGVnZXIgdmVjdG9yKSBub3RlOiB0aGUgaW5kZXggSSBpcyBkZWZpbmVkIGFzIGEgMzItYml0IHdvcmQsCisgIGJ1dCBvbmx5IDE2IGJpdHMgYXJlIHJlcXVpcmVkIChsb25nIGNhbiBiZSByZXBsYWNlZCBieSB1bnNpZ25lZCBpbnRlZ2VyKQorCisgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IFJFOF9kZWMoaW50IG4sIGludCBJLCBpbnQgKmssIEZJWFBfREJMICp5KSB7CisgIFNIT1JUIHZbOF07CisgIFNIT1JUIF95WzhdOworICBVSU5UIHI7CisgIGludCBpOworCisgIC8qIENoZWNrIGJvdW5kIG9mIGNvZGVib29rIHFuICovCisgIGlmIChuID4gTlFfTUFYKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogZGVjb2RlIHRoZSBzdWItaW5kaWNlcyBJIGFuZCBrdltdIGFjY29yZGluZyB0byB0aGUgY29kZWJvb2sgbnVtYmVyIG46CisgICAgIGlmIG49MCwyLDMsNCwgZGVjb2RlIEkgKG5vIFZvcm9ub2kgZXh0ZW5zaW9uKQorICAgICBpZiBuPjQsIFZvcm9ub2kgZXh0ZW5zaW9uIGlzIHVzZWQsIGRlY29kZSBJIGFuZCBrdltdICovCisgIGlmIChuIDw9IDQpIHsKKyAgICByZThfZGVjb2RlX2Jhc2VfaW5kZXgoJm4sIEksIF95KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICB5W2ldID0gKExPTkcpX3lbaV07CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIGNvbXB1dGUgdGhlIFZvcm9ub2kgbW9kdWxvIG0gPSAyXnIgd2hlcmUgciBpcyBleHRlbnNpb24gb3JkZXIgKi8KKyAgICByID0gKChuIC0gMykgPj4gMSk7CisKKyAgICB3aGlsZSAobiA+IDQpIHsKKyAgICAgIG4gLT0gMjsKKyAgICB9CisgICAgLyogZGVjb2RlIGJhc2UgY29kZWJvb2sgaW5kZXggSSBpbnRvIGMgKGMgaXMgYW4gZWxlbWVudCBvZiBRMyBvciBRNCkKKyAgICAgICBbaGVyZSBjIGlzIHN0b3JlZCBpbiB5IHRvIHNhdmUgbWVtb3J5XSAqLworICAgIHJlOF9kZWNvZGVfYmFzZV9pbmRleCgmbiwgSSwgX3kpOworICAgIC8qIGRlY29kZSBWb3Jvbm9pIGluZGV4IGtbXSBpbnRvIHYgKi8KKyAgICByZThfazJ5KGssIHIsIHYpOworICAgIC8qIHJlY29uc3RydWN0IHkgYXMgeSA9IG0gYyArIHYgKHdpdGggbT0yXnIsIHIgaW50ZWdlciA+PTEpICovCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgeVtpXSA9IChMT05HKSgoX3lbaV0gPDwgcikgKyB2W2ldKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHN0YXJ0IExQQyBkZWNvZGUgc3R1ZmYgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vI2RlZmluZSBNICAgICAgICAgMTYKKyNkZWZpbmUgRlJFUV9NQVggNjQwMC4wZgorI2RlZmluZSBGUkVRX0RJViA0MDAuMGYKKyNkZWZpbmUgTFNGX0dBUCA1MC4wZgorCisvKioKKyAqIFxicmllZiBjYWxjdWxhdGUgaW52ZXJzZSB3ZWlnaHRpbmcgZmFjdG9yIGFuZCBhZGQgbm9uLXdlaWdodGVkIHJlc2lkdWFsCisgKiAgICAgICAgTFNGIHZlY3RvciB0byBmaXJzdCBzdGFnZSBMU0YgYXBwcm94aW1hdGlvbgorICogXHBhcmFtIGxzZnEgZmlyc3Qgc3RhZ2UgTFNGIGFwcHJveGltYXRpb24gdmFsdWVzLgorICogXHBhcmFtIHhxIHdlaWdodGVkIHJlc2lkdWFsIExTRiB2ZWN0b3IKKyAqIFxwYXJhbSBua19tb2RlIGNvZGUgYm9vayBudW1iZXIgY29kaW5nIG1vZGUuCisgKi8KK3N0YXRpYyB2b2lkIGxzZl93ZWlnaHRfMnN0KEZJWFBfTFBDICpsc2ZxLCBGSVhQX0RCTCAqeHEsIGludCBua19tb2RlKSB7CisgIEZJWFBfTFBDIGRbTV9MUF9GSUxURVJfT1JERVIgKyAxXTsKKyAgRklYUF9TR0wgZmFjdG9yOworICBMT05HIHc7IC8qIGludmVyc2Ugd2VpZ2h0IGZhY3RvciAqLworICBpbnQgaTsKKworICAvKiBjb21wdXRlIGxzZiBkaXN0YW5jZSAqLworICBkWzBdID0gbHNmcVswXTsKKyAgZFtNX0xQX0ZJTFRFUl9PUkRFUl0gPQorICAgICAgRkwyRlhDT05TVF9MUEMoRlJFUV9NQVggLyAoMSA8PCBMU0ZfU0NBTEUpKSAtIGxzZnFbTV9MUF9GSUxURVJfT1JERVIgLSAxXTsKKyAgZm9yIChpID0gMTsgaSA8IE1fTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICBkW2ldID0gbHNmcVtpXSAtIGxzZnFbaSAtIDFdOworICB9CisKKyAgc3dpdGNoIChua19tb2RlKSB7CisgICAgY2FzZSAwOgorICAgICAgZmFjdG9yID0gRkwyRlhDT05TVF9TR0woMi4wZiAqIDYwLjBmIC8gRlJFUV9ESVYpOworICAgICAgYnJlYWs7IC8qIGFicyAqLworICAgIGNhc2UgMToKKyAgICAgIGZhY3RvciA9IEZMMkZYQ09OU1RfU0dMKDIuMGYgKiA2NS4wZiAvIEZSRVFfRElWKTsKKyAgICAgIGJyZWFrOyAvKiBtaWQgKi8KKyAgICBjYXNlIDI6CisgICAgICBmYWN0b3IgPSBGTDJGWENPTlNUX1NHTCgyLjBmICogNjQuMGYgLyBGUkVRX0RJVik7CisgICAgICBicmVhazsgLyogcmVsMSAqLworICAgIGRlZmF1bHQ6CisgICAgICBmYWN0b3IgPSBGTDJGWENPTlNUX1NHTCgyLjBmICogNjMuMGYgLyBGUkVRX0RJVik7CisgICAgICBicmVhazsgLyogcmVsMiAqLworICB9CisgIC8qIGFkZCBub24td2VpZ2h0ZWQgcmVzaWR1YWwgTFNGIHZlY3RvciB0byBMU0Yxc3QgKi8KKyAgZm9yIChpID0gMDsgaSA8IE1fTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICB3ID0gKExPTkcpZk11bHREaXYyKGZhY3Rvciwgc3FydEZpeHAoZk11bHQoZFtpXSwgZFtpICsgMV0pKSk7CisgICAgbHNmcVtpXSA9IGZBZGRTYXR1cmF0ZShsc2ZxW2ldLCBGWF9EQkwyRlhfTFBDKChGSVhQX0RCTCkodyAqIChMT05HKXhxW2ldKSkpOworICB9CisKKyAgcmV0dXJuOworfQorCisvKioKKyAqIFxicmllZiBkZWNvZGUgbnFuIGFtb3VudCBvZiBjb2RlIGJvb2sgbnVtYmVycy4gVGhlc2UgdmFsdWVzIGRldGVybWluZSB0aGUKKyAqIGFtb3VudCBvZiBmb2xsb3dpbmcgYml0cyBmb3IgbnFuIEFWUSBSRTggdmVjdG9ycy4KKyAqIFxwYXJhbSBua19tb2RlIHF1YW50aXphdGlvbiBtb2RlLgorICogXHBhcmFtIG5xbiBhbW91bnQgY29kZSBib29rIG51bWJlciB0byByZWFkLgorICogXHBhcmFtIHFuIHBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlciB0byBob2xkIGRlY29kZWQgY29kZSBib29rIG51bWJlcnMgcW4uCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9xbihIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIGludCBua19tb2RlLCBpbnQgbnFuLAorICAgICAgICAgICAgICAgICAgICAgIGludCBxbltdKSB7CisgIGludCBuOworCisgIGlmIChua19tb2RlID09IDEpIHsgLyogbmsgbW9kZSAxICovCisgICAgLyogVW5hcnkgY29kZSBmb3IgbWlkIExQQzEvTFBDMyAqLworICAgIC8qIFEwPTAsIFEyPTEwLCBRMz0xMTAsIC4uLiAqLworICAgIGZvciAobiA9IDA7IG4gPCBucW47IG4rKykgeworICAgICAgcW5bbl0gPSBnZXRfdmxjbGJmKGhCcyk7CisgICAgICBpZiAocW5bbl0gPiAwKSB7CisgICAgICAgIHFuW25dKys7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeyAvKiBua19tb2RlIDAsIDMgYW5kIDIgKi8KKyAgICAvKiAyIGJpdHMgdG8gc3BlY2lmeSBRMixRMyxRNCxleHQgKi8KKyAgICBmb3IgKG4gPSAwOyBuIDwgbnFuOyBuKyspIHsKKyAgICAgIHFuW25dID0gMiArIEZES3JlYWRCaXRzKGhCcywgMik7CisgICAgfQorICAgIGlmIChua19tb2RlID09IDIpIHsKKyAgICAgIC8qIFVuYXJ5IGNvZGUgZm9yIHJlbCBMUEMxL0xQQzMgKi8KKyAgICAgIC8qIFEwID0gMCwgUTU9MTAsIFE2PTExMCwgLi4uICovCisgICAgICBmb3IgKG4gPSAwOyBuIDwgbnFuOyBuKyspIHsKKyAgICAgICAgaWYgKHFuW25dID4gNCkgeworICAgICAgICAgIHFuW25dID0gZ2V0X3ZsY2xiZihoQnMpOworICAgICAgICAgIGlmIChxbltuXSA+IDApIHFuW25dICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeyAvKiBua19tb2RlID09ICgwIGFuZCAzKSAqLworICAgICAgLyogVW5hcnkgY29kZSBmb3IgYWJzIGFuZCByZWwgTFBDMC9MUEMyICovCisgICAgICAvKiBRNSA9IDAsIFE2PTEwLCBRMD0xMTAsIFE3PTExMTAsIC4uLiAqLworICAgICAgZm9yIChuID0gMDsgbiA8IG5xbjsgbisrKSB7CisgICAgICAgIGlmIChxbltuXSA+IDQpIHsKKyAgICAgICAgICBxbltuXSA9IGdldF92bGNsYmYoaEJzKTsKKyAgICAgICAgICBzd2l0Y2ggKHFuW25dKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgIHFuW25dID0gNTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgIHFuW25dID0gNjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgIHFuW25dID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBxbltuXSArPSA0OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoqCisgKiBcYnJpZWYgcmVvcmRlciBMU0YgY29lZmZpY2llbnRzIHRvIG1pbmltdW0gZGlzdGFuY2UuCisgKiBccGFyYW0gbHNmIHBvaW50ZXIgdG8gYnVmZmVyIGNvbnRhaW5pbmcgTFNGIGNvZWZmaWNpZW50cyBhbmQgd2hlcmUgcmVvcmRlcmVkCisgKiBMU0YgY29lZmZpY2llbnRzIHdpbGwgYmUgc3RvcmVkIGludG8sIHNjYWxlZCBieSBMU0ZfU0NBTEUuCisgKiBccGFyYW0gbWluX2Rpc3QgbWluIGRpc3RhbmNlIHNjYWxlZCBieSBMU0ZfU0NBTEUKKyAqIFxwYXJhbSBuIG51bWJlciBvZiBMU0YvTFNQIGNvZWZmaWNpZW50cy4KKyAqLworc3RhdGljIHZvaWQgcmVvcmRlcl9sc2YoRklYUF9MUEMgKmxzZiwgRklYUF9MUEMgbWluX2Rpc3QsIGludCBuKSB7CisgIEZJWFBfTFBDIGxzZl9taW47CisgIGludCBpOworCisgIGxzZl9taW4gPSBtaW5fZGlzdDsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIGlmIChsc2ZbaV0gPCBsc2ZfbWluKSB7CisgICAgICBsc2ZbaV0gPSBsc2ZfbWluOworICAgIH0KKyAgICBsc2ZfbWluID0gZkFkZFNhdHVyYXRlKGxzZltpXSwgbWluX2Rpc3QpOworICB9CisKKyAgLyogcmV2ZXJzZSAqLworICBsc2ZfbWluID0gRkwyRlhDT05TVF9MUEMoRlJFUV9NQVggLyAoMSA8PCBMU0ZfU0NBTEUpKSAtIG1pbl9kaXN0OworICBmb3IgKGkgPSBuIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBpZiAobHNmW2ldID4gbHNmX21pbikgeworICAgICAgbHNmW2ldID0gbHNmX21pbjsKKyAgICB9CisKKyAgICBsc2ZfbWluID0gbHNmW2ldIC0gbWluX2Rpc3Q7CisgIH0KK30KKworLyoqCisgKiBcYnJpZWYgRmlyc3Qgc3RhZ2UgYXBwcm94aW1hdGlvbgorICogXHBhcmFtIGhCcyBiaXRzdHJlYW0gaGFuZGxlIGFzIGRhdGEgc291cmNlCisgKiBccGFyYW0gbHNmcSBwb2ludGVyIHRvIG91dHB1dCBidWZmZXIgdG8gaG9sZCBMUEMgY29lZmZpY2llbnRzIHNjYWxlZCBieQorICogTFNGX1NDQUxFLgorICovCitzdGF0aWMgdm9pZCB2bHBjXzFzdF9kZWMoCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCAvKiBpbnB1dDogIGNvZGVib29rIGluZGV4ICAgICAgICAgICAgICAgICAgKi8KKyAgICBGSVhQX0xQQyAqbHNmcSAgICAgICAgICAgIC8qIGkvbzogICAgaTpwcmVkaWN0aW9uICAgbzpxdWFudGl6ZWQgbHNmICAqLworKSB7CisgIGNvbnN0IEZJWFBfTFBDICpwX2RpY287CisgIGludCBpLCBpbmRleDsKKworICBpbmRleCA9IEZES3JlYWRCaXRzKGhCcywgOCk7CisgIHBfZGljbyA9ICZmZGtfZGVjX2RpY29fbHNmX2Fic184YltpbmRleCAqIE1fTFBfRklMVEVSX09SREVSXTsKKyAgZm9yIChpID0gMDsgaSA8IE1fTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICBsc2ZxW2ldID0gcF9kaWNvW2ldOworICB9Cit9CisKKy8qKgorICogXGJyaWVmIERvIGZpcnN0IHN0YWdlIGFwcHJveGltYXRpb24gd2VpZ2h0aW5nIGFuZCBtdWx0aXBseSB3aXRoIEFWUQorICogcmVmaW5lbWVudC4KKyAqIFxwYXJhbSBoQnMgYml0c3RyZWFtIGhhbmRsZSBkYXRhIHNzb3VyY2UuCisgKiBccGFyYW0gbHNmcSBidWZmZXIgaG9sZGluZyAxc3Qgc3RhZ2UgYXBwcm94LCAybmQgc3RhZ2UgYXBwcm94IGlzIGFkZGVkIHRvCisgKiB0aGlzIHZhbHVlcy4KKyAqIFxwYXJhbSBua19tb2RlIHF1YW50aXphdGlvbiBtb2RlLgorICogXHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50IHZscGNfMnN0X2RlYygKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgRklYUF9MUEMgKmxzZnEsIC8qIGkvbzogICAgaToxc3Qgc3RhZ2UgICBvOjFzdCsybmQgc3RhZ2UgICAqLworICAgIGludCBua19tb2RlICAgICAvKiBpbnB1dDogIDA9YWJzLCA+MD1yZWwgICAgICAgICAgICAgICAgICAgKi8KKykgeworICBpbnQgZXJyOworICBGSVhQX0RCTCB4cVtNX0xQX0ZJTFRFUl9PUkRFUl07IC8qIHdlaWdodGVkIHJlc2lkdWFsIExTRiB2ZWN0b3IgKi8KKworICAvKiBEZWNvZGUgQVZRIHJlZmluZW1lbnQgKi8KKyAgeyBlcnIgPSBDTHBjX0RlY29kZUFWUShoQnMsIHhxLCBua19tb2RlLCAyLCA4KTsgfQorICBpZiAoZXJyICE9IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBhZGQgbm9uLXdlaWdodGVkIHJlc2lkdWFsIExTRiB2ZWN0b3IgdG8gTFNGMXN0ICovCisgIGxzZl93ZWlnaHRfMnN0KGxzZnEsIHhxLCBua19tb2RlKTsKKworICAvKiByZW9yZGVyICovCisgIHJlb3JkZXJfbHNmKGxzZnEsIEZMMkZYQ09OU1RfTFBDKExTRl9HQVAgLyAoMSA8PCBMU0ZfU0NBTEUpKSwKKyAgICAgICAgICAgICAgTV9MUF9GSUxURVJfT1JERVIpOworCisgIHJldHVybiAwOworfQorCisvKgorICogRXh0ZXJuYWxseSB2aXNpYmxlIGZ1bmN0aW9ucworICovCisKK2ludCBDTHBjX0RlY29kZUFWUShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIEZJWFBfREJMICpwT3V0cHV0LCBpbnQgbmtfbW9kZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgbm9fcW4sIGludCBsZW5ndGgpIHsKKyAgaW50IGksIGw7CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSA4ICogbm9fcW4pIHsKKyAgICBpbnQgcW5bMl0sIG5rLCBuLCBJOworICAgIGludCBrdls4XSA9IHswfTsKKworICAgIGRlY29kZV9xbihoQnMsIG5rX21vZGUsIG5vX3FuLCBxbik7CisKKyAgICBmb3IgKGwgPSAwOyBsIDwgbm9fcW47IGwrKykgeworICAgICAgaWYgKHFuW2xdID09IDApIHsKKyAgICAgICAgRkRLbWVtY2xlYXIoJnBPdXRwdXRbaSArIGwgKiA4XSwgOCAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgfQorCisgICAgICAvKiBWb3Jvbm9pIGV4dGVuc2lvbiBvcmRlciAoIG5rICkgKi8KKyAgICAgIG5rID0gMDsKKyAgICAgIG4gPSBxbltsXTsKKyAgICAgIGlmIChxbltsXSA+IDQpIHsKKyAgICAgICAgbmsgPSAocW5bbF0gLSAzKSA+PiAxOworICAgICAgICBuID0gcW5bbF0gLSBuayAqIDI7CisgICAgICB9CisKKyAgICAgIC8qIEJhc2UgY29kZWJvb2sgaW5kZXgsIGluIHJldmVyc2UgYml0IGdyb3VwIG9yZGVyICghKSAqLworICAgICAgSSA9IEZES3JlYWRCaXRzKGhCcywgNCAqIG4pOworCisgICAgICBpZiAobmsgPiAwKSB7CisgICAgICAgIGludCBqOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKyAgICAgICAgICBrdltqXSA9IEZES3JlYWRCaXRzKGhCcywgbmspOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChSRThfZGVjKHFuW2xdLCBJLCBrdiwgJnBPdXRwdXRbaSArIGwgKiA4XSkgIT0gMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitpbnQgQ0xwY19SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgRklYUF9MUEMgbHNwW11bTV9MUF9GSUxURVJfT1JERVJdLAorICAgICAgICAgICAgICBGSVhQX0xQQyBscGM0X2xzZltNX0xQX0ZJTFRFUl9PUkRFUl0sCisgICAgICAgICAgICAgIEZJWFBfTFBDIGxzZl9hZGFwdGl2ZV9tZWFuX2NhbmRbTV9MUF9GSUxURVJfT1JERVJdLAorICAgICAgICAgICAgICBGSVhQX1NHTCBwU3RhYmlsaXR5W10sIFVDSEFSICptb2QsIGludCBmaXJzdF9scGRfZmxhZywKKyAgICAgICAgICAgICAgaW50IGxhc3RfbHBjX2xvc3QsIGludCBsYXN0X2ZyYW1lX29rKSB7CisgIGludCBpLCBrLCBlcnI7CisgIGludCBtb2RlX2xwY19iaW4gPSAwOyAvKiBtb2RlX2xwYyBiaXRzdHJlYW0gcmVwcmVzZW50YXRpb24gKi8KKyAgaW50IGxwY19wcmVzZW50WzVdID0gezAsIDAsIDAsIDAsIDB9OworICBpbnQgbHBjMF9hdmFpbGFibGUgPSAxOworICBpbnQgcyA9IDA7CisgIGludCBsID0gMzsKKyAgY29uc3QgaW50IG5iRGl2ID0gTkJfRElWOworCisgIGxwY19wcmVzZW50WzQgPj4gc10gPSAxOyAvKiBMUEM0ICovCisKKyAgLyogRGVjb2RlIExQQyBmaWx0ZXJzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6IExQQyA0LDAsMiwxLDMgKi8KKworICAvKioqIERlY29kZSBMUEM0ICoqKi8KKyAgdmxwY18xc3RfZGVjKGhCcywgbHNwWzQgPj4gc10pOworICBlcnIgPSB2bHBjXzJzdF9kZWMoaEJzLCBsc3BbNCA+PiBzXSwgMCk7IC8qIG5rX21vZGUgPSAwICovCisgIGlmIChlcnIgIT0gMCkgeworICAgIHJldHVybiBlcnI7CisgIH0KKworICAvKioqIERlY29kZSBMUEMwIGFuZCBMUEMyICoqKi8KKyAgayA9IDA7CisgIGlmICghZmlyc3RfbHBkX2ZsYWcpIHsKKyAgICBscGNfcHJlc2VudFswXSA9IDE7CisgICAgbHBjMF9hdmFpbGFibGUgPSAhbGFzdF9scGNfbG9zdDsKKyAgICAvKiBvbGQgTFBDNCBpcyBuZXcgTFBDMCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBNX0xQX0ZJTFRFUl9PUkRFUjsgaSsrKSB7CisgICAgICBsc3BbMF1baV0gPSBscGM0X2xzZltpXTsKKyAgICB9CisgICAgLyogc2tpcCBMUEMwIGFuZCBjb250aW51ZSB3aXRoIExQQzIgKi8KKyAgICBrID0gMjsKKyAgfQorCisgIGZvciAoOyBrIDwgbDsgayArPSAyKSB7CisgICAgaW50IG5rX21vZGUgPSAwOworCisgICAgaWYgKChrID09IDIpICYmIChtb2RbMF0gPT0gMykpIHsKKyAgICAgIGJyZWFrOyAvKiBza2lwIExQQzIgKi8KKyAgICB9CisKKyAgICBscGNfcHJlc2VudFtrID4+IHNdID0gMTsKKworICAgIG1vZGVfbHBjX2JpbiA9IEZES3JlYWRCaXQoaEJzKTsKKworICAgIGlmIChtb2RlX2xwY19iaW4gPT0gMCkgeworICAgICAgLyogTFBDMC9MUEMyOiBBYnMgKi8KKyAgICAgIHZscGNfMXN0X2RlYyhoQnMsIGxzcFtrID4+IHNdKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogTFBDMC9MUEMyOiBSZWxSICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgTV9MUF9GSUxURVJfT1JERVI7IGkrKykgeworICAgICAgICBsc3BbayA+PiBzXVtpXSA9IGxzcFs0ID4+IHNdW2ldOworICAgICAgfQorICAgICAgbmtfbW9kZSA9IDM7CisgICAgfQorCisgICAgZXJyID0gdmxwY18yc3RfZGVjKGhCcywgbHNwW2sgPj4gc10sIG5rX21vZGUpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgIH0KKworICAvKioqIERlY29kZSBMUEMxICoqKi8KKyAgaWYgKG1vZFswXSA8IDIpIHsgLyogZWxzZTogc2tpcCBMUEMxICovCisgICAgbHBjX3ByZXNlbnRbMV0gPSAxOworICAgIG1vZGVfbHBjX2JpbiA9IGdldF92bGNsYmZfbihoQnMsIDIpOworCisgICAgc3dpdGNoIChtb2RlX2xwY19iaW4pIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgLyogTFBDMTogYWJzICovCisgICAgICAgIHZscGNfMXN0X2RlYyhoQnMsIGxzcFsxXSk7CisgICAgICAgIGVyciA9IHZscGNfMnN0X2RlYyhoQnMsIGxzcFsxXSwgMCk7CisgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIC8qIExQQzE6IG1pZDAgKG5vIHNlY29uZCBzdGFnZSBBVlEgcXVhbnRpemVyIGluIHRoaXMgY2FzZSkgKi8KKyAgICAgICAgaWYgKGxwYzBfYXZhaWxhYmxlKSB7IC8qIExQQzAvbHNmWzBdIG1pZ2h0IGJlIHplcm8gc29tZSB0aW1lcyAqLworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNX0xQX0ZJTFRFUl9PUkRFUjsgaSsrKSB7CisgICAgICAgICAgICBsc3BbMV1baV0gPSAobHNwWzBdW2ldID4+IDEpICsgKGxzcFsyXVtpXSA+PiAxKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1fTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICAgICAgICAgIGxzcFsxXVtpXSA9IGxzcFsyXVtpXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDA6CisgICAgICAgIC8qIExQQzE6IFJlbFIgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1fTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICAgICAgICBsc3BbMV1baV0gPSBsc3BbMl1baV07CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gdmxwY18yc3RfZGVjKGhCcywgbHNwWzFdLCAyIDw8IHMpOworICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qKiogRGVjb2RlIExQQzMgKioqLworICBpZiAoKG1vZFsyXSA8IDIpKSB7IC8qIGVsc2U6IHNraXAgTFBDMyAqLworICAgIGludCBua19tb2RlID0gMDsKKyAgICBscGNfcHJlc2VudFszXSA9IDE7CisKKyAgICBtb2RlX2xwY19iaW4gPSBnZXRfdmxjbGJmX24oaEJzLCAzKTsKKworICAgIHN3aXRjaCAobW9kZV9scGNfYmluKSB7CisgICAgICBjYXNlIDE6CisgICAgICAgIC8qIExQQzM6IGFicyAqLworICAgICAgICB2bHBjXzFzdF9kZWMoaEJzLCBsc3BbM10pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgLyogTFBDMzogbWlkICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNX0xQX0ZJTFRFUl9PUkRFUjsgaSsrKSB7CisgICAgICAgICAgbHNwWzNdW2ldID0gKGxzcFsyXVtpXSA+PiAxKSArIChsc3BbNF1baV0gPj4gMSk7CisgICAgICAgIH0KKyAgICAgICAgbmtfbW9kZSA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICAvKiBMUEMzOiByZWxMICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNX0xQX0ZJTFRFUl9PUkRFUjsgaSsrKSB7CisgICAgICAgICAgbHNwWzNdW2ldID0gbHNwWzJdW2ldOworICAgICAgICB9CisgICAgICAgIG5rX21vZGUgPSAyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgLyogTFBDMzogcmVsUiAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTV9MUF9GSUxURVJfT1JERVI7IGkrKykgeworICAgICAgICAgIGxzcFszXVtpXSA9IGxzcFs0XVtpXTsKKyAgICAgICAgfQorICAgICAgICBua19tb2RlID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGVyciA9IHZscGNfMnN0X2RlYyhoQnMsIGxzcFszXSwgbmtfbW9kZSk7CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgfQorCisgIGlmICghbHBjMF9hdmFpbGFibGUgJiYgIWxhc3RfZnJhbWVfb2spIHsKKyAgICAvKiBMUEMoMCkgd2FzIGxvc3QuIFVzZSBuZXh0IGF2YWlsYWJsZSBMUEMoaykgaW5zdGVhZCAqLworICAgIGZvciAoayA9IDE7IGsgPCAobmJEaXYgKyAxKTsgaysrKSB7CisgICAgICBpZiAobHBjX3ByZXNlbnRba10pIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1fTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyNkZWZpbmUgTFNGX0lOSVRfVElMVCAoMC4yNWYpCisgICAgICAgICAgaWYgKG1vZFswXSA+IDApIHsKKyAgICAgICAgICAgIGxzcFswXVtpXSA9IEZYX0RCTDJGWF9MUEMoCisgICAgICAgICAgICAgICAgZk11bHQobHNwW2tdW2ldLCBGTDJGWENPTlNUX1NHTCgxLjBmIC0gTFNGX0lOSVRfVElMVCkpICsKKyAgICAgICAgICAgICAgICBmTXVsdChmZGtfZGVjX2xzZl9pbml0W2ldLCBGTDJGWENPTlNUX1NHTChMU0ZfSU5JVF9USUxUKSkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsc3BbMF1baV0gPSBsc3Bba11baV07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBNX0xQX0ZJTFRFUl9PUkRFUjsgaSsrKSB7CisgICAgbHBjNF9sc2ZbaV0gPSBsc3BbNCA+PiBzXVtpXTsKKyAgfQorCisgIHsKKyAgICBGSVhQX0RCTCBkaXZGYWM7CisgICAgaW50IGxhc3QsIG51bUxwYyA9IDA7CisKKyAgICBpID0gbmJEaXY7CisgICAgZG8geworICAgICAgbnVtTHBjICs9IGxwY19wcmVzZW50W2ktLV07CisgICAgfSB3aGlsZSAoaSA+PSAwICYmIG51bUxwYyA8IDMpOworCisgICAgbGFzdCA9IGk7CisKKyAgICBzd2l0Y2ggKG51bUxwYykgeworICAgICAgY2FzZSAzOgorICAgICAgICBkaXZGYWMgPSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gMy4wZik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBkaXZGYWMgPSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gMi4wZik7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZGl2RmFjID0gRkwyRlhDT05TVF9EQkwoMS4wZik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIGdldCB0aGUgYWRhcHRpdmUgbWVhbiBmb3IgdGhlIG5leHQgKGJhZCkgZnJhbWUgKi8KKyAgICBmb3IgKGsgPSAwOyBrIDwgTV9MUF9GSUxURVJfT1JERVI7IGsrKykgeworICAgICAgRklYUF9EQkwgdG1wID0gKEZJWFBfREJMKTA7CisgICAgICBmb3IgKGkgPSBuYkRpdjsgaSA+IGxhc3Q7IGktLSkgeworICAgICAgICBpZiAobHBjX3ByZXNlbnRbaV0pIHsKKyAgICAgICAgICB0bXAgPSBmTXVsdEFkZCh0bXAgPj4gMSwgbHNwW2ldW2tdLCBkaXZGYWMpOworICAgICAgICB9CisgICAgICB9CisgICAgICBsc2ZfYWRhcHRpdmVfbWVhbl9jYW5kW2tdID0gRlhfREJMMkZYX0xQQyh0bXApOworICAgIH0KKyAgfQorCisgIC8qIGNhbGN1bGF0ZSBzdGFiaWxpdHkgZmFjdG9yIFRoZXRhLiBOZWVkZWQgZm9yIEFDRUxQIGRlY29kZXIgYW5kIGNvbmNlYWxtZW50CisgICAqLworICB7CisgICAgRklYUF9MUEMgKmxzZl9wcmV2LCAqbHNmX2N1cnI7CisgICAgayA9IDA7CisKKyAgICBGREtfQVNTRVJUKGxwY19wcmVzZW50WzBdID09IDEgJiYgbHBjX3ByZXNlbnRbNCA+PiBzXSA9PSAxKTsKKyAgICBsc2ZfcHJldiA9IGxzcFswXTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgKG5iRGl2ICsgMSk7IGkrKykgeworICAgICAgaWYgKGxwY19wcmVzZW50W2ldKSB7CisgICAgICAgIEZJWFBfREJMIHRtcCA9IChGSVhQX0RCTCkwOworICAgICAgICBpbnQgajsKKyAgICAgICAgbHNmX2N1cnIgPSBsc3BbaV07CisKKyAgICAgICAgLyogc3VtID0gdG1wICogMl4oTFNGX1NDQUxFKjIgKyA0KSAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgTV9MUF9GSUxURVJfT1JERVI7IGorKykgeworICAgICAgICAgIHRtcCArPSBmUG93MkRpdjIoKEZJWFBfU0dMKShsc2ZfY3VycltqXSAtIGxzZl9wcmV2W2pdKSkgPj4gMzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHRtcCA9IChmbG9hdCkoRkwyRlhDT05TVF9EQkwoMS4yNWYpIC0gZk11bHQodG1wLAorICAgICAgICAgKiBGTDJGWENPTlNUX0RCTCgxLzQwMDAwMC4wZikpKTsgKi8KKyAgICAgICAgdG1wID0gRkwyRlhDT05TVF9EQkwoMS4yNWYgLyAoMSA8PCBMU0ZfU0NBTEUpKSAtCisgICAgICAgICAgICAgIGZNdWx0KHRtcCwgRkwyRlhDT05TVF9EQkwoKDEgPDwgKExTRl9TQ0FMRSArIDQpKSAvIDQwMDAwMC4wZikpOworICAgICAgICBpZiAodG1wID49IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoMSA8PCBMU0ZfU0NBTEUpKSkgeworICAgICAgICAgIHBTdGFiaWxpdHlba10gPSBGTDJGWENPTlNUX1NHTCgxLjBmIC8gMi4wZik7CisgICAgICAgIH0gZWxzZSBpZiAodG1wIDwgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgICAgICBwU3RhYmlsaXR5W2tdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcFN0YWJpbGl0eVtrXSA9IEZYX0RCTDJGWF9TR0wodG1wIDw8IChMU0ZfU0NBTEUgLSAxKSk7CisgICAgICAgIH0KKworICAgICAgICBsc2ZfcHJldiA9IGxzZl9jdXJyOworICAgICAgICBrID0gaTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIE1hcmsgc3RhYmlsaXR5IHZhbHVlIGFzIHVuZGVmaW5lZC4gKi8KKyAgICAgICAgcFN0YWJpbGl0eVtpXSA9IChGSVhQX1NHTCktMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBjb252ZXJ0IGludG8gTFNQIGRvbWFpbiAqLworICBmb3IgKGkgPSAwOyBpIDwgKG5iRGl2ICsgMSk7IGkrKykgeworICAgIGlmIChscGNfcHJlc2VudFtpXSkgeworICAgICAgZm9yIChrID0gMDsgayA8IE1fTFBfRklMVEVSX09SREVSOyBrKyspIHsKKyAgICAgICAgbHNwW2ldW2tdID0gRlhfREJMMkZYX0xQQygKKyAgICAgICAgICAgIGZpeHBfY29zKGZNdWx0KGxzcFtpXVtrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfU0dMKCgxIDw8IExTUEFSR19TQ0FMRSkgKiBNX1BJIC8gNjQwMC4wKSksCisgICAgICAgICAgICAgICAgICAgICBMU0ZfU0NBTEUgLSBMU1BBUkdfU0NBTEUpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKwordm9pZCBDTHBjX0NvbmNlYWwoRklYUF9MUEMgbHNwW11bTV9MUF9GSUxURVJfT1JERVJdLAorICAgICAgICAgICAgICAgICAgRklYUF9MUEMgbHBjNF9sc2ZbTV9MUF9GSUxURVJfT1JERVJdLAorICAgICAgICAgICAgICAgICAgRklYUF9MUEMgbHNmX2FkYXB0aXZlX21lYW5bTV9MUF9GSUxURVJfT1JERVJdLAorICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZpcnN0X2xwZF9mbGFnKSB7CisgIGludCBpLCBqOworCisjZGVmaW5lIEJFVEEgKEZMMkZYQ09OU1RfU0dMKDAuMjVmKSkKKyNkZWZpbmUgT05FX0JFVEEgKEZMMkZYQ09OU1RfU0dMKDAuNzVmKSkKKyNkZWZpbmUgQkZJX0ZBQyAoRkwyRlhDT05TVF9TR0woMC45MGYpKQorI2RlZmluZSBPTkVfQkZJX0ZBQyAoRkwyRlhDT05TVF9TR0woMC4xMGYpKQorCisgIC8qIEZyYW1lIGxvc3MgY29uY2VhbG1lbnQgKGNvdWxkIGJlIGltcHJvdmVkKSAqLworCisgIGlmIChmaXJzdF9scGRfZmxhZykgeworICAgIC8qIFJlc2V0IHBhc3QgTFNGIHZhbHVlcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBNX0xQX0ZJTFRFUl9PUkRFUjsgaSsrKSB7CisgICAgICBsc3BbMF1baV0gPSBscGM0X2xzZltpXSA9IGZka19kZWNfbHNmX2luaXRbaV07CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIG9sZCBMUEM0IGlzIG5ldyBMUEMwICovCisgICAgZm9yIChpID0gMDsgaSA8IE1fTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICAgIGxzcFswXVtpXSA9IGxwYzRfbHNmW2ldOworICAgIH0KKyAgfQorCisgIC8qIExQQzEgKi8KKyAgZm9yIChpID0gMDsgaSA8IE1fTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICBGSVhQX0xQQyBsc2ZfbWVhbiA9IEZYX0RCTDJGWF9MUEMoZk11bHQoQkVUQSwgZmRrX2RlY19sc2ZfaW5pdFtpXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChPTkVfQkVUQSwgbHNmX2FkYXB0aXZlX21lYW5baV0pKTsKKworICAgIGxzcFsxXVtpXSA9IEZYX0RCTDJGWF9MUEMoZk11bHQoQkZJX0ZBQywgbHBjNF9sc2ZbaV0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KE9ORV9CRklfRkFDLCBsc2ZfbWVhbikpOworICB9CisKKyAgLyogTFBDMiAtIExQQzQgKi8KKyAgZm9yIChqID0gMjsgaiA8PSA0OyBqKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTV9MUF9GSUxURVJfT1JERVI7IGkrKykgeworICAgICAgLyogbHNmX21lYW5baV0gPSAgRlhfREJMMkZYX0xQQyhmTXVsdCgoRklYUF9MUEMpKEJFVEEgKyBqICoKKyAgICAgICAgIEZMMkZYQ09OU1RfTFBDKDAuMWYpKSwgZmRrX2RlY19sc2ZfaW5pdFtpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZk11bHQoKEZJWFBfTFBDKShPTkVfQkVUQSAtIGogKgorICAgICAgICAgRkwyRlhDT05TVF9MUEMoMC4xZikpLCBsc2ZfYWRhcHRpdmVfbWVhbltpXSkpOyAqLworCisgICAgICBGSVhQX0xQQyBsc2ZfbWVhbiA9IEZYX0RCTDJGWF9MUEMoCisgICAgICAgICAgZk11bHQoKEZJWFBfU0dMKShCRVRBICsgKEZJWFBfU0dMKShqICogKElOVClGTDJGWENPTlNUX1NHTCgwLjFmKSkpLAorICAgICAgICAgICAgICAgIChGSVhQX1NHTClmZGtfZGVjX2xzZl9pbml0W2ldKSArCisgICAgICAgICAgZk11bHQoCisgICAgICAgICAgICAgIChGSVhQX1NHTCkoT05FX0JFVEEgLSAoRklYUF9TR0wpKGogKiAoSU5UKUZMMkZYQ09OU1RfU0dMKDAuMWYpKSksCisgICAgICAgICAgICAgIGxzZl9hZGFwdGl2ZV9tZWFuW2ldKSk7CisKKyAgICAgIGxzcFtqXVtpXSA9IEZYX0RCTDJGWF9MUEMoZk11bHQoQkZJX0ZBQywgbHNwW2ogLSAxXVtpXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChPTkVfQkZJX0ZBQywgbHNmX21lYW4pKTsKKyAgICB9CisgIH0KKworICAvKiBVcGRhdGUgcGFzdCB2YWx1ZXMgZm9yIHRoZSBmdXR1cmUgKi8KKyAgZm9yIChpID0gMDsgaSA8IE1fTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICBscGM0X2xzZltpXSA9IGxzcFs0XVtpXTsKKyAgfQorCisgIC8qIGNvbnZlcnQgaW50byBMU1AgZG9tYWluICovCisgIGZvciAoaiA9IDA7IGogPCA1OyBqKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTV9MUF9GSUxURVJfT1JERVI7IGkrKykgeworICAgICAgbHNwW2pdW2ldID0gRlhfREJMMkZYX0xQQyhmaXhwX2NvcygKKyAgICAgICAgICBmTXVsdChsc3Bbal1baV0sIEZMMkZYQ09OU1RfU0dMKCgxIDw8IExTUEFSR19TQ0FMRSkgKiBNX1BJIC8gNjQwMC4wKSksCisgICAgICAgICAgTFNGX1NDQUxFIC0gTFNQQVJHX1NDQUxFKSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgRV9MUENfYV93ZWlnaHQoRklYUF9MUEMgKndBLCBjb25zdCBGSVhQX0xQQyAqQSwgaW50IG0pIHsKKyAgRklYUF9EQkwgZjsKKyAgaW50IGk7CisKKyAgZiA9IEZMMkZYQ09OU1RfREJMKDAuOTJmKTsKKyAgZm9yIChpID0gMDsgaSA8IG07IGkrKykgeworICAgIHdBW2ldID0gRlhfREJMMkZYX0xQQyhmTXVsdChBW2ldLCBmKSk7CisgICAgZiA9IGZNdWx0KGYsIEZMMkZYQ09OU1RfREJMKDAuOTJmKSk7CisgIH0KK30KKwordm9pZCBDTHBkX0RlY29kZUdhaW4oRklYUF9EQkwgKmdhaW4sIElOVCAqZ2Fpbl9lLCBpbnQgZ2Fpbl9jb2RlKSB7CisgIC8qIGdhaW4gKiAyXihnYWluX2UpID0gMTBeKGdhaW5fY29kZS8yOCkgKi8KKyAgKmdhaW4gPSBmTGRQb3coCisgICAgICBGTDJGWENPTlNUX0RCTCgzLjMyMTkyODA5NDg4NzM2MjM0Nzg3MDMxOTQyOTQ4OTQgLyA0LjApLCAvKiBsb2cyKDEwKSovCisgICAgICAyLAorICAgICAgZk11bHREaXYyKChGSVhQX0RCTClnYWluX2NvZGUgPDwgKERGUkFDVF9CSVRTIC0gMSAtIDcpLAorICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDIuMGYgLyAyOC4wZikpLAorICAgICAgNywgZ2Fpbl9lKTsKK30KKworICAvKioKKyAgICogXGJyaWVmICogICBGaW5kIHRoZSBwb2x5bm9taWFsIEYxKHopIG9yIEYyKHopIGZyb20gdGhlIExTUHMuCisgICAqIFRoaXMgaXMgcGVyZm9ybWVkIGJ5IGV4cGFuZGluZyB0aGUgcHJvZHVjdCBwb2x5bm9taWFsczoKKyAgICoKKyAgICogRjEoeikgPSAgIHByb2R1Y3QgICAoIDEgLSAyIExTUF9pIHpeLTEgKyB6Xi0yICkKKyAgICogICAgICAgICBpPTAsMiw0LDYsOAorICAgKiBGMih6KSA9ICAgcHJvZHVjdCAgICggMSAtIDIgTFNQX2kgel4tMSArIHpeLTIgKQorICAgKiAgICAgICAgIGk9MSwzLDUsNyw5CisgICAqCisgICAqIHdoZXJlIExTUF9pIGFyZSB0aGUgTFNQcyBpbiB0aGUgY29zaW5lIGRvbWFpbi4KKyAgICogUi5BLlNhbGFtaSAgICBPY3RvYmVyIDE5OTAKKyAgICogXHBhcmFtIGxzcCBpbnB1dCwgbGluZSBzcGVjdHJhbCBmcmVxLiAoY29zaW5lIGRvbWFpbikKKyAgICogXHBhcmFtIGYgb3V0cHV0LCB0aGUgY29lZmZpY2llbnRzIG9mIEYxIG9yIEYyLCBzY2FsZWQgYnkgOCBiaXRzCisgICAqIFxwYXJhbSBuIG5vIG9mIGNvZWZmaWNpZW50cyAobS8yKQorICAgKiBccGFyYW0gZmxhZyAxIDogRjEoeikgOyAyIDogRjIoeikKKyAgICovCisKKyNkZWZpbmUgU0ZfRiA4CisKK3N0YXRpYyB2b2lkIGdldF9sc3Bwb2woRklYUF9MUEMgbHNwW10sIEZJWFBfREJMIGZbXSwgaW50IG4sIGludCBmbGFnKSB7CisgIEZJWFBfREJMIGI7CisgIEZJWFBfTFBDICpwbHNwOworICBpbnQgaSwgajsKKworICBwbHNwID0gbHNwICsgZmxhZyAtIDE7CisgIGZbMF0gPSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKDEgPDwgU0ZfRikpOworICBiID0gLUZYX0xQQzJGWF9EQkwoKnBsc3ApOworICBmWzFdID0gYiA+PiAoU0ZfRiAtIDEpOworICBmb3IgKGkgPSAyOyBpIDw9IG47IGkrKykgeworICAgIHBsc3AgKz0gMjsKKyAgICBiID0gLUZYX0xQQzJGWF9EQkwoKnBsc3ApOworICAgIGZbaV0gPSAoKGZNdWx0RGl2MihiLCBmW2kgLSAxXSkgPDwgMSkgKyAoZltpIC0gMl0pKSA8PCAxOworICAgIGZvciAoaiA9IGkgLSAxOyBqID4gMTsgai0tKSB7CisgICAgICBmW2pdID0gZltqXSArIChmTXVsdERpdjIoYiwgZltqIC0gMV0pIDw8IDIpICsgZltqIC0gMl07CisgICAgfQorICAgIGZbMV0gPSBmWzFdICsgKGIgPj4gKFNGX0YgLSAxKSk7CisgIH0KKyAgcmV0dXJuOworfQorCisjZGVmaW5lIE5DIE1fTFBfRklMVEVSX09SREVSIC8gMgorCisvKioKKyAqIFxicmllZiBsc3AgaW5wdXQgTFNQIHZlY3RvcgorICogXGJyaWVmIGEgb3V0cHV0IExQIGZpbHRlciBjb2VmZmljaWVudCB2ZWN0b3Igc2NhbGVkIGJ5IFNGX0FfQ09FRkZTLgorICovCit2b2lkIEVfTFBDX2ZfbHNwX2FfY29udmVyc2lvbihGSVhQX0xQQyAqbHNwLCBGSVhQX0xQQyAqYSwgSU5UICphX2V4cCkgeworICBGSVhQX0RCTCBmMVtOQyArIDFdLCBmMltOQyArIDFdOworICBpbnQgaSwgazsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICAgKiAgRmluZCB0aGUgcG9seW5vbWlhbHMgRjEoeikgYW5kIEYyKHopICAgICAgICAgICAgICAgKgorICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICBnZXRfbHNwcG9sKGxzcCwgZjEsIE5DLCAxKTsKKyAgZ2V0X2xzcHBvbChsc3AsIGYyLCBOQywgMik7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgICogIE11bHRpcGx5IEYxKHopIGJ5ICgxK3peLTEpIGFuZCBGMih6KSBieSAoMS16Xi0xKSAgICoKKyAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGZvciAoaSA9IE5DOyBpID4gMDsgaS0tKSB7CisgICAgZjFbaV0gKz0gZjFbaSAtIDFdOworICAgIGYyW2ldIC09IGYyW2kgLSAxXTsKKyAgfQorCisgIEZJWFBfREJMIGFEQkxbTV9MUF9GSUxURVJfT1JERVJdOworCisgIGZvciAoaSA9IDEsIGsgPSBNX0xQX0ZJTFRFUl9PUkRFUiAtIDE7IGkgPD0gTkM7IGkrKywgay0tKSB7CisgICAgRklYUF9EQkwgdG1wMSwgdG1wMjsKKworICAgIHRtcDEgPSBmMVtpXSA+PiAxOworICAgIHRtcDIgPSBmMltpXSA+PiAxOworCisgICAgYURCTFtpIC0gMV0gPSAodG1wMSArIHRtcDIpOworICAgIGFEQkxba10gPSAodG1wMSAtIHRtcDIpOworICB9CisKKyAgaW50IGhlYWRyb29tX2EgPSBnZXRTY2FsZWZhY3RvcihhREJMLCBNX0xQX0ZJTFRFUl9PUkRFUik7CisKKyAgZm9yIChpID0gMDsgaSA8IE1fTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICBhW2ldID0gRlhfREJMMkZYX0xQQyhhREJMW2ldIDw8IGhlYWRyb29tX2EpOworICB9CisKKyAgKmFfZXhwID0gOCAtIGhlYWRyb29tX2E7Cit9CmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL3VzYWNkZWNfbHBjLmggYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfbHBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY3MTNjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19scGMuaApAQCAtMCwwICsxLDE5MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWF0dGhpYXMgSGlsZGVuYnJhbmQsIE1hbnVlbCBKYW5kZXIKKworICAgRGVzY3JpcHRpb246IFVTQUMgTFBDL0FWUSBkZWNvZGUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBVU0FDREVDX0xQQ19ICisjZGVmaW5lIFVTQUNERUNfTFBDX0gKKworI2luY2x1ZGUgImNoYW5uZWxpbmZvLmgiCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJ1c2FjZGVjX3JvbS5oIgorCisjZGVmaW5lIExTUEFSR19TQ0FMRSAxMAorCisvKioKKyAqIFxicmllZiBBVlEgKHJlZmluZW1lbnQpIGRlY29kZQorICogXHBhcmFtIGhCcyBiaXRzdHJlYW0gaGFuZGxlCisgKiBccGFyYW0gbHNmcSBidWZmZXIgZm9yIEFWUSBkZWNvZGUgb3V0cHV0LgorICogXHBhcmFtIG5rX21vZGUgcXVhbnRpemF0aW9uIG1vZGUuCisgKiBccGFyYW0gbnFuIGFtb3VudCBvZiBzcGxpdC9pbnRlcmxlYXZlZCBSRTggdmVjdG9ycy4KKyAqIFxwYXJhbSB0b3RhbCBhbW91bnQgb2YgaW5kaXZpZHVhbCBkYXRhIHZhbHVlcyB0byBkZWNvZGUuCisgKiBccmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IuCisgKi8KK2ludCBDTHBjX0RlY29kZUFWUShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIEZJWFBfREJMICpsc2ZxLCBpbnQgbmtfbW9kZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgbnFuLCBpbnQgbGVuZ3RoKTsKKworLyoqCisgKiBcYnJpZWYgUmVhZCBhbmQgZGVjb2RlIExQQyBjb2VmaWNpZW50IHNldHMuIEZpcnN0IHN0YWdlIGFwcHJveGltYXRpb24gKyBBVlEKKyAqIGRlY29kZS4KKyAqIFxwYXJhbVtpbl0gIGhCcyBiaXRzdHJlYW0gaGFuZGxlIHRvIHJlYWQgZGF0YSBmcm9tLgorICogXHBhcmFtW291dF0gbHNwIGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSBkZWNvZGVkIExTUCBjb2VmZmljaWVudHMgd2lsbCBiZSBzdG9yZWQKKyAqIGludG8uCisgKiBccGFyYW1baW4sb3V0XSBscGM0X2xzZiBidWZmZXIgaW50byB3aGljaCB0aGUgZGVjb2RlZCBMQ1A0IExTRiBjb2VmZmljaWVudHMKKyAqIHdpbGwgYmUgc3RvcmVkIGludG8gKHBlcnNpc3RlbnQpLgorICogXHBhcmFtW291dF0gbHNmX2FkYXB0aXZlX21lYW5fY2FuZCBsc2YgYWRhcHRpdmUgbWVhbiB2ZWN0b3IgbmVlZGVkIGZvcgorICogY29uY2VhbG1lbnQuCisgKiBccGFyYW1bb3V0XSBwU3RhYmlsaXR5IGFycmF5IHdpdGggc3RhYmlsaXR5IHZhbHVlcyBmb3IgdGhlIEFDRUxQIGRlY29kZXIgKGFuZAorICogY29uY2VhbG1lbnQpLgorICogXHBhcmFtW2luXSAgbW9kIGFycmF5IHdoaWNoIGRlZmluZXMgbW9kZXMgKEFDRUxQLCBUQ1gyMHw0MHw4MCkgYXJlIHVzZWQgaW4KKyAqIHRoZSBjdXJyZW50IHN1cGVyZnJhbWUuCisgKiBccGFyYW1baW5dICBmaXJzdF9scGRfZmxhZyBpbmRpY2F0ZXMgdGhlIHByZXNlbmNlIG9mIExQQzAKKyAqIFxwYXJhbVtpbl0gIGxhc3RfbHBjX2xvc3QgaW5kaWNhdGUgdGhhdCBMUEM0IG9mIHByZXZpb3VzIGZyYW1lIHdhcyBsb3N0LgorICogXHBhcmFtW2luXSAgbGFzdF9mcmFtZV9vayBpbmRpY2F0ZSB0aGF0IHRoZSBsYXN0IGZyYW1lIHdhcyBvay4KKyAqIFxyZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvci4KKyAqLworaW50IENMcGNfUmVhZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIEZJWFBfTFBDIGxzcFtdW01fTFBfRklMVEVSX09SREVSXSwKKyAgICAgICAgICAgICAgRklYUF9MUEMgbHBjNF9sc2ZbTV9MUF9GSUxURVJfT1JERVJdLAorICAgICAgICAgICAgICBGSVhQX0xQQyBsc2ZfYWRhcHRpdmVfbWVhbl9jYW5kW01fTFBfRklMVEVSX09SREVSXSwKKyAgICAgICAgICAgICAgRklYUF9TR0wgcFN0YWJpbGl0eVtdLCBVQ0hBUiAqbW9kLCBpbnQgZmlyc3RfbHBkX2ZsYWcsCisgICAgICAgICAgICAgIGludCBsYXN0X2xwY19sb3N0LCBpbnQgbGFzdF9mcmFtZV9vayk7CisKKy8qKgorICogXGJyaWVmIEdlbmVyYXRlIExQQyBjb2VmZmljaWVudCBzZXRzIGluIGNhc2UgZnJhbWUgbG9zcy4KKyAqIFxwYXJhbSBsc3AgYnVmZmVyIGludG8gd2hpY2ggdGhlIGRlY29kZWQgTFNQIGNvZWZmaWNpZW50cyB3aWxsIGJlIHN0b3JlZAorICogaW50by4KKyAqIFxwYXJhbSBscGM0X2xzZiBidWZmZXIgaW50byB3aGljaCB0aGUgZGVjb2RlZCBMQ1A0IExTRiBjb2VmZmljaWVudHMgd2lsbCBiZQorICogc3RvcmVkIGludG8gKHBlcnNpc3RlbnQpLgorICogXHBhcmFtIGlzZl9hZGFwdGl2ZV9tZWFuCisgKiBccGFyYW0gZmlyc3RfbHBkX2ZsYWcgaW5kaWNhdGVzIHRoZSBwcmV2aW91cyBMU0Y0IGNvZWZmaWNpZW50cyBscGM0X2xzZltdIGFyZQorICogbm90IHZhbGlkLgorICovCit2b2lkIENMcGNfQ29uY2VhbChGSVhQX0xQQyBsc3BbXVtNX0xQX0ZJTFRFUl9PUkRFUl0sCisgICAgICAgICAgICAgICAgICBGSVhQX0xQQyBscGM0X2xzZltNX0xQX0ZJTFRFUl9PUkRFUl0sCisgICAgICAgICAgICAgICAgICBGSVhQX0xQQyBpc2ZfYWRhcHRpdmVfbWVhbltNX0xQX0ZJTFRFUl9PUkRFUl0sCisgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZmlyc3RfbHBkX2ZsYWcpOworCisvKioKKyAqIFxicmllZiBhcHBseSBhYnNvbHV0ZSB3ZWlnaHRpbmcKKyAqIFxwYXJhbSBBIHdlaWdodGVkIExQQyBjb2VmZmljaWVudCB2ZWN0b3Igb3V0cHV0LiBUaGUgZmlyc3QgY29lZmZjaWVudCBpcworICogaW1wbGljaXRseSAxLjAKKyAqIFxwYXJhbSBBIExQQyBjb2VmZmljaWVudCB2ZWN0b3IuIFRoZSBmaXJzdCBjb2VmZmNpZW50IGlzIGltcGxpY2l0bHkgMS4wCisgKiBccGFyYW0gbSBsZW5ndGggb2YgdmVjdG9yIEEKKyAqLworLyogc3RhdGljICovCit2b2lkIEVfTFBDX2Ffd2VpZ2h0KEZJWFBfTFBDICp3QSwgY29uc3QgRklYUF9MUEMgKkEsIGNvbnN0IGludCBtKTsKKworLyoqCisgKiBcYnJpZWYgZGVjb2RlIFRDWC9GQUMgZ2Fpbi4gSW4gY2FzZSBvZiBUQ1ggdGhlIGxnL3NxcnQocm1zKSBwYXJ0CisgKiAgICAgICAgbXVzdCBzdGlsbCBiZSBhcHBsaWVkIHRvIG9idGFpbiB0aGUgZ2FpbiB2YWx1ZS4KKyAqIFxwYXJhbSBnYWluIChvKSBwb2ludGVyIHdlcmUgdGhlIGdhaW4gbWFudGlzc2EgaXMgc3RvcmVkIGludG8uCisgKiBccGFyYW0gZ2Fpbl9lIChvKSBwb2ludGVyIHdlcmUgdGhlIGdhaW4gZXhwb25lbnQgaXMgc3RvcmVkIGludG8uCisgKiBccGFyYW0gZ2Fpbl9jb2RlIChpKSB0aGUgNyBiaXQgYmluYXJ5IHdvcmQgZnJvbSB0aGUgYml0c3RyZWFtCisgKiAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRpbmcgdGhlIGdhaW4uCisgKi8KK3ZvaWQgQ0xwZF9EZWNvZGVHYWluKEZJWFBfREJMICpnYWluLCBJTlQgKmdhaW5fZSwgaW50IGdhaW5fY29kZSk7CisKKy8qKgorICogXGJyaWVmIGNvbnZlcnQgTFNQIGNvZWZmaWNpZW50cyBpbnRvIExQIGRvbWFpbi4KKyAqLwordm9pZCBFX0xQQ19mX2xzcF9hX2NvbnZlcnNpb24oRklYUF9MUEMgKmxzcCwgRklYUF9MUEMgKmEsIElOVCAqYV9leHApOworCisjZW5kaWYgLyogVVNBQ0RFQ19MUENfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy91c2FjZGVjX2xwZC5jcHAgYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfbHBkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjA2OWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX2xwZC5jcHAKQEAgLTAsMCArMSwyMDI5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCisKKyAgIERlc2NyaXB0aW9uOiBVU0FDIExpbmVhciBQcmVkaWN0aW9uIERvbWFpbiBjb2RpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzYWNkZWNfbHBkLmgiCisKKyNpbmNsdWRlICJ1c2FjZGVjX3JvbS5oIgorI2luY2x1ZGUgInVzYWNkZWNfZmFjLmgiCisjaW5jbHVkZSAidXNhY2RlY19scGMuaCIKKyNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCisjaW5jbHVkZSAiZmZ0LmgiCisjaW5jbHVkZSAibWRjdC5oIgorI2luY2x1ZGUgInVzYWNkZWNfYWNlbHAuaCIKKyNpbmNsdWRlICJvdmVybGFwYWRkLmgiCisKKyNpbmNsdWRlICJjb25jZWFsLmgiCisKKyNpbmNsdWRlICJibG9jay5oIgorCisjZGVmaW5lIFNGX1BJVENIX1RSQUNLIDYKKyNkZWZpbmUgU0ZfR0FJTiAzCisjZGVmaW5lIE1JTl9WQUwgRkwyRlhDT05TVF9EQkwoMC4wZikKKyNkZWZpbmUgTUFYX1ZBTCAoRklYUF9EQkwpIE1BWFZBTF9EQkwKKworI2luY2x1ZGUgImFjX2FyaXRoX2NvZGVyLmgiCisKK3ZvaWQgZmlsdExQKGNvbnN0IEZJWFBfREJMICpzeW4sIEZJWFBfUENNICpzeW5fb3V0LCBGSVhQX0RCTCAqbm9pc2UsCisgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCAqZmlsdCwgSU5UIHN0b3AsIGludCBsZW4pIHsKKyAgSU5UIGksIGo7CisgIEZJWFBfREJMIHRtcDsKKworICBmb3IgKGkgPSAwOyBpIDwgc3RvcDsgaSsrKSB7CisgICAgdG1wID0gZk11bHREaXYyKG5vaXNlW2ldLCBmaWx0WzBdKTsgIC8vIEZpbHQgaW4gUS0xLjE2CisgICAgZm9yIChqID0gMTsgaiA8PSBsZW47IGorKykgeworICAgICAgdG1wICs9IGZNdWx0RGl2Migobm9pc2VbaSAtIGpdICsgbm9pc2VbaSArIGpdKSwgZmlsdFtqXSk7CisgICAgfQorICAgIHN5bl9vdXRbaV0gPSAoRklYUF9QQ00pKElNRENUX1NDQUxFKHN5bltpXSAtIHRtcCkpOworICB9Cit9CisKK3ZvaWQgYmFzc19wZl8xc2ZfZGVsYXkoCisgICAgRklYUF9EQkwgKnN5biwgICAvKiAoaSkgOiAxMi44a0h6IHN5bnRoZXNpcyB0byBwb3N0ZmlsdGVyICAgICAgICAgICAgICAqLworICAgIGNvbnN0IElOVCAqVF9zZiwgLyogKGkpIDogUGl0Y2ggcGVyaW9kIGZvciBhbGwgc3ViZnJhbWVzIChUX3NmWzE2XSkgICAgKi8KKyAgICBGSVhQX0RCTCAqcGl0X2dhaW4sCisgICAgY29uc3QgaW50IGZyYW1lX2xlbmd0aCwgLyogKGkpIDogZnJhbWUgbGVuZ3RoIChzaG91bGQgYmUgNzY4fDEwMjQpICovCisgICAgY29uc3QgSU5UIGxfZnJhbWUsCisgICAgY29uc3QgSU5UIGxfbmV4dCwgLyogKGkpIDogbG9vayBhaGVhZCBmb3Igc3ltbWV0cmljIGZpbHRlcmluZyAgICAgICAgICAgKi8KKyAgICBGSVhQX1BDTSAqc3ludGhfb3V0LCAvKiAobykgOiBmaWx0ZXJlZCBzeW50aGVzaXMgKHdpdGggZGVsYXkgb2YgMSBzdWJmcikgKi8KKyAgICBGSVhQX0RCTCBtZW1fYnBmW10pIC8qIGkvbyA6IG1lbW9yeSBzdGF0ZSBbTF9GSUxUK0xfU1VCRlJdICAgICAgICAgICAgICAgICovCit7CisgIElOVCBpLCBzZiwgaV9zdWJmciwgVCwgVDIsIGxnOworCisgIEZJWFBfREJMIHRtcCwgZW5lciwgY29yciwgZ2FpbjsKKyAgRklYUF9EQkwgKm5vaXNlLCAqbm9pc2VfaW47CisgIEZJWFBfREJMCisgIG5vaXNlX2J1ZltMX0ZJTFQgKyAoMiAqIExfU1VCRlIpXTsgIC8vIExfRklMVCA9IDEyLCBMX1NVQkZSID0gNjQgPT4gMTQwCisgIGNvbnN0IEZJWFBfREJMICp4LCAqeTsKKworICB7CisgICAgbm9pc2UgPSBub2lzZV9idWYgKyBMX0ZJTFQ7ICAvLyBMX0ZJTFQgPSAxMiBkZWxheSBvZiB1cHNhbXBsaW5nIGZpbHRlcgorICAgIG5vaXNlX2luID0gbm9pc2VfYnVmICsgTF9GSUxUICsgTF9TVUJGUjsKKyAgICAvKiBJbnB1dCBzY2FsaW5nIG9mIHRoZSBCUEYgbWVtb3J5ICovCisgICAgc2NhbGVWYWx1ZXMobWVtX2JwZiwgKExfRklMVCArIExfU1VCRlIpLCAxKTsKKyAgfQorCisgIGludCBnYWluX2V4cCA9IDE3OworCisgIHNmID0gMDsKKyAgZm9yIChpX3N1YmZyID0gMDsgaV9zdWJmciA8IGxfZnJhbWU7IGlfc3ViZnIgKz0gTF9TVUJGUiwgc2YrKykgeworICAgIFQgPSBUX3NmW3NmXTsKKyAgICBnYWluID0gcGl0X2dhaW5bc2ZdOworCisgICAgLyogR2FpbiBpcyBpbiBRMTcuMTQgKi8KKyAgICAvKiBJZiBnYWluID4gMSBzZXQgdG8gMSAqLworICAgIGlmIChnYWluID4gKEZJWFBfREJMKSgxIDw8IDE0KSkgZ2FpbiA9IChGSVhQX0RCTCkoMSA8PCAxNCk7CisKKyAgICAvKiBJZiBnYWluIDwgMCBzZXQgdG8gMCAqLworICAgIGlmIChnYWluIDwgKEZJWFBfREJMKTApIGdhaW4gPSAoRklYUF9EQkwpMDsKKworICAgIGlmIChnYWluID4gKEZJWFBfREJMKTApIHsKKyAgICAgIC8qIHBpdGNoIHRyYWNrZXI6IHRlc3QgcGl0Y2gvMiB0byBhdm9pZCBjb250aW51b3VzIHBpdGNoIGRvdWJsaW5nICovCisgICAgICAvKiBOb3RlOiBwaXRjaCBpcyBsaW1pdGVkIHRvIFBJVF9NSU4gKDM0ID0gMzc2SHopIGF0IHRoZSBlbmNvZGVyICAqLworICAgICAgVDIgPSBUID4+IDE7CisgICAgICB4ID0gJnN5bltpX3N1YmZyIC0gTF9FWFRSQV07CisgICAgICB5ID0gJnN5bltpX3N1YmZyIC0gVDIgLSBMX0VYVFJBXTsKKworICAgICAgZW5lciA9IChGSVhQX0RCTCkwOworICAgICAgY29yciA9IChGSVhQX0RCTCkwOworICAgICAgdG1wID0gKEZJWFBfREJMKTA7CisKKyAgICAgIGludCBoZWFkcm9vbV94ID0gZ2V0U2NhbGVmYWN0b3IoeCwgTF9TVUJGUiArIExfRVhUUkEpOworICAgICAgaW50IGhlYWRyb29tX3kgPSBnZXRTY2FsZWZhY3Rvcih5LCBMX1NVQkZSICsgTF9FWFRSQSk7CisKKyAgICAgIGludCB3aWR0aF9zaGlmdCA9IDc7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAoTF9TVUJGUiArIExfRVhUUkEpOyBpKyspIHsKKyAgICAgICAgZW5lciArPSBmUG93MkRpdjIoKHhbaV0gPDwgaGVhZHJvb21feCkpID4+IHdpZHRoX3NoaWZ0OworICAgICAgICBjb3JyICs9IGZNdWx0RGl2MigoeFtpXSA8PCBoZWFkcm9vbV94KSwgKHlbaV0gPDwgaGVhZHJvb21feSkpID4+CisgICAgICAgICAgICAgICAgd2lkdGhfc2hpZnQ7CisgICAgICAgIHRtcCArPSBmUG93MkRpdjIoKHlbaV0gPDwgaGVhZHJvb21feSkpID4+IHdpZHRoX3NoaWZ0OworICAgICAgfQorCisgICAgICBpbnQgZXhwX2VuZXIgPSAoKDE3IC0gaGVhZHJvb21feCkgPDwgMSkgKyB3aWR0aF9zaGlmdCArIDE7CisgICAgICBpbnQgZXhwX2NvcnIgPSAoMTcgLSBoZWFkcm9vbV94KSArICgxNyAtIGhlYWRyb29tX3kpICsgd2lkdGhfc2hpZnQgKyAxOworICAgICAgaW50IGV4cF90bXAgPSAoKDE3IC0gaGVhZHJvb21feSkgPDwgMSkgKyB3aWR0aF9zaGlmdCArIDE7CisKKyAgICAgIC8qIEFkZCAwLjAxIHRvICJlbmVyIi4gQWRqdXN0IGV4cG9uZW50cyAqLworICAgICAgRklYUF9EQkwgcG9pbnRfemVyb19vbmUgPSAoRklYUF9EQkwpMHg1MWViODUxZjsgLyogSW4gUS02LjM3ICovCisgICAgICBpbnQgZGlmZjsKKyAgICAgIGVuZXIgPSBmQWRkTm9ybShlbmVyLCBleHBfZW5lciwgcG9pbnRfemVyb19vbmUsIC02LCAmZXhwX2VuZXIpOworICAgICAgY29yciA9IGZBZGROb3JtKGNvcnIsIGV4cF9jb3JyLCBwb2ludF96ZXJvX29uZSwgLTYsICZleHBfY29ycik7CisgICAgICB0bXAgPSBmQWRkTm9ybSh0bXAsIGV4cF90bXAsIHBvaW50X3plcm9fb25lLCAtNiwgJmV4cF90bXApOworCisgICAgICAvKiB1c2UgVDIgaWYgbm9ybWFsaXplZCBjb3JyZWxhdGlvbiA+IDAuOTUgKi8KKyAgICAgIElOVCBzMSwgczI7CisgICAgICBzMSA9IENudExlYWRpbmdaZXJvcyhlbmVyKSAtIDE7CisgICAgICBzMiA9IENudExlYWRpbmdaZXJvcyh0bXApIC0gMTsKKworICAgICAgRklYUF9EQkwgZW5lcl9ieV90bXAgPSBmTXVsdERpdjIoZW5lciA8PCBzMSwgdG1wIDw8IHMyKTsKKyAgICAgIGludCBlbmVyX2J5X3RtcF9leHAgPSAoZXhwX2VuZXIgLSBzMSkgKyAoZXhwX3RtcCAtIHMyKSArIDE7CisKKyAgICAgIGlmIChlbmVyX2J5X3RtcF9leHAgJiAxKSB7CisgICAgICAgIGVuZXJfYnlfdG1wIDw8PSAxOworICAgICAgICBlbmVyX2J5X3RtcF9leHAgLT0gMTsKKyAgICAgIH0KKworICAgICAgaW50IHRlbXBfZXhwID0gMDsKKworICAgICAgRklYUF9EQkwgdGVtcDEgPSBpbnZTcXJ0Tm9ybTIoZW5lcl9ieV90bXAsICZ0ZW1wX2V4cCk7CisKKyAgICAgIGludCB0ZW1wMV9leHAgPSB0ZW1wX2V4cCAtIChlbmVyX2J5X3RtcF9leHAgPj4gMSk7CisKKyAgICAgIEZJWFBfREJMIHRtcF9yZXN1bHQgPSBmTXVsdChjb3JyLCB0ZW1wMSk7CisKKyAgICAgIGludCB0bXBfcmVzdWx0X2V4cCA9IGV4cF9jb3JyICsgdGVtcDFfZXhwOworCisgICAgICBkaWZmID0gdG1wX3Jlc3VsdF9leHAgLSAwOworICAgICAgRklYUF9EQkwgcG9pbnQ5NSA9IEZMMkZYQ09OU1RfREJMKDAuOTVmKTsKKyAgICAgIGlmIChkaWZmID49IDApIHsKKyAgICAgICAgZGlmZiA9IGZNaW4oZGlmZiwgMzEpOworICAgICAgICBwb2ludDk1ID0gRkwyRlhDT05TVF9EQkwoMC45NWYpID4+IGRpZmY7CisgICAgICB9IGVsc2UgeworICAgICAgICBkaWZmID0gZk1heChkaWZmLCAtMzEpOworICAgICAgICB0bXBfcmVzdWx0ID4+PSAoLWRpZmYpOworICAgICAgfQorCisgICAgICBpZiAodG1wX3Jlc3VsdCA+IHBvaW50OTUpIFQgPSBUMjsKKworICAgICAgLyogcHJldmVudCB0aGF0IG5vaXNlIGNhbGN1bGF0aW9uIGJlbG93IHJlYWNoZXMgaW50byBub3QgZGVmaW5lZCBzaWduYWwKKyAgICAgICAgIHBhcnRzIGF0IHRoZSBlbmQgb2YgdGhlIHN5bnRoX2J1ZiBvciBpbiBvdGhlciB3b3JkcyByZXN0cmljdCB0aGUgYmVsb3cKKyAgICAgICAgIHVzZWQgaW5kZXggKGkraV9zdWJmcitUKSA8IGxfZnJhbWUgKyBsX25leHQKKyAgICAgICovCisgICAgICBsZyA9IGxfZnJhbWUgKyBsX25leHQgLSBUIC0gaV9zdWJmcjsKKworICAgICAgaWYgKGxnID4gTF9TVUJGUikKKyAgICAgICAgbGcgPSBMX1NVQkZSOworICAgICAgZWxzZSBpZiAobGcgPCAwKQorICAgICAgICBsZyA9IDA7CisKKyAgICAgIC8qIGxpbWl0IGdhaW4gdG8gYXZvaWQgcHJvYmxlbSBvbiBidXJzdCAqLworICAgICAgaWYgKGxnID4gMCkgeworICAgICAgICBGSVhQX0RCTCB0bXAxOworCisgICAgICAgIC8qIG1heChsZykgPSA2NCA9PiBzY2FsZSB3aXRoIDYgYml0cyBtaW51cyAxIChmUG93MkRpdjIpICovCisKKyAgICAgICAgczEgPSBnZXRTY2FsZWZhY3Rvcigmc3luW2lfc3ViZnJdLCBsZyk7CisgICAgICAgIHMyID0gZ2V0U2NhbGVmYWN0b3IoJnN5bltpX3N1YmZyICsgVF0sIGxnKTsKKyAgICAgICAgSU5UIHMgPSBmaXhNaW4oczEsIHMyKTsKKworICAgICAgICB0bXAgPSAoRklYUF9EQkwpMDsKKyAgICAgICAgZW5lciA9IChGSVhQX0RCTCkwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGc7IGkrKykgeworICAgICAgICAgIHRtcCArPSBmUG93MkRpdjIoc3luW2kgKyBpX3N1YmZyXSA8PCBzMSkgPj4gKFNGX1BJVENIX1RSQUNLKTsKKyAgICAgICAgICBlbmVyICs9IGZQb3cyRGl2MihzeW5baSArIGlfc3ViZnIgKyBUXSA8PCBzMikgPj4gKFNGX1BJVENIX1RSQUNLKTsKKyAgICAgICAgfQorICAgICAgICB0bXAgPSB0bXAgPj4gZk1pbihERlJBQ1RfQklUUyAtIDEsICgyICogKHMxIC0gcykpKTsKKyAgICAgICAgZW5lciA9IGVuZXIgPj4gZk1pbihERlJBQ1RfQklUUyAtIDEsICgyICogKHMyIC0gcykpKTsKKworICAgICAgICAvKiBlcnJvciByb2J1c3RuZXNzOiBmb3IgdGhlIHNwZWNpZmljIGNhc2Ugc3luWy4uLl0gPT0gLTEuMGYgZm9yIGFsbCA2NAorICAgICAgICAgICBzYW1wbGVzIGVuZXIgb3IgdG1wIG1pZ2h0IG92ZXJmbG93IGFuZCBiZWNvbWUgbmVnYXRpdmUuIEZvciBhbGwgc2FuZQorICAgICAgICAgICBjYXNlcyB3ZSBoYXZlIGVub3VnaCBoZWFkcm9vbS4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKGVuZXIgPD0gKEZJWFBfREJMKTApIHsKKyAgICAgICAgICBlbmVyID0gKEZJWFBfREJMKTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRtcCA8PSAoRklYUF9EQkwpMCkgeworICAgICAgICAgIHRtcCA9IChGSVhQX0RCTCkxOworICAgICAgICB9CisgICAgICAgIEZES19BU1NFUlQoZW5lciA+IChGSVhQX0RCTCkwKTsKKworICAgICAgICAvKiB0bXAgPSBzcXJ0KHRtcC9lbmVyKSAqLworICAgICAgICBpbnQgcmVzdWx0X2UgPSAwOworICAgICAgICB0bXAxID0gZkRpdk5vcm0odG1wLCBlbmVyLCAmcmVzdWx0X2UpOworICAgICAgICBpZiAocmVzdWx0X2UgJiAxKSB7CisgICAgICAgICAgdG1wMSA+Pj0gMTsKKyAgICAgICAgICByZXN1bHRfZSArPSAxOworICAgICAgICB9CisgICAgICAgIHRtcCA9IHNxcnRGaXhwKHRtcDEpOworICAgICAgICByZXN1bHRfZSA+Pj0gMTsKKworICAgICAgICBnYWluX2V4cCA9IDE3OworCisgICAgICAgIGRpZmYgPSByZXN1bHRfZSAtIGdhaW5fZXhwOworCisgICAgICAgIEZJWFBfREJMIGdhaW4xID0gZ2FpbjsKKworICAgICAgICBpZiAoZGlmZiA+PSAwKSB7CisgICAgICAgICAgZGlmZiA9IGZNaW4oZGlmZiwgMzEpOworICAgICAgICAgIGdhaW4xID4+PSBkaWZmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc3VsdF9lICs9ICgtZGlmZik7CisgICAgICAgICAgZGlmZiA9IGZNYXgoZGlmZiwgLTMxKTsKKyAgICAgICAgICB0bXAgPj49ICgtZGlmZik7CisgICAgICAgIH0KKworICAgICAgICBpZiAodG1wIDwgZ2FpbjEpIHsKKyAgICAgICAgICBnYWluID0gdG1wOworICAgICAgICAgIGdhaW5fZXhwID0gcmVzdWx0X2U7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogY2FsY3VsYXRlIG5vaXNlIGJhc2VkIG9uIHZvaWNlZCBwaXRjaCAqLworICAgICAgLyogZk11bHREaXYyKCkgcmVwbGFjZXMgd2VpZ2h0aW5nIG9mIGdhaW4gd2l0aCAwLjUgKi8KKyAgICAgIGRpZmYgPSBnYWluX2V4cCAtIDE3OworICAgICAgaWYgKGRpZmYgPj0gMCkgeworICAgICAgICBnYWluIDw8PSBkaWZmOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2FpbiA+Pj0gKC1kaWZmKTsKKyAgICAgIH0KKworICAgICAgczEgPSBDbnRMZWFkaW5nWmVyb3MoZ2FpbikgLSAxOworICAgICAgczEgLT0gMTY7IC8qIExlYWRpbmcgYml0cyBmb3IgU0dMICovCisKKyAgICAgIEZJWFBfU0dMIGdhaW5TR0wgPSBGWF9EQkwyRlhfU0dMKGdhaW4gPDwgMTYpOworCisgICAgICBnYWluU0dMID0gZ2FpblNHTCA8PCBzMTsKKworICAgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGc7IGkrKykgeworICAgICAgICAgIC8qIHNjYWxlZCB3aXRoIFNGX1NZTlRIICsgZ2Fpbl9zZiArIDEgKi8KKyAgICAgICAgICBub2lzZV9pbltpXSA9CisgICAgICAgICAgICAgIChmTXVsdChnYWluU0dMLCBzeW5baSArIGlfc3ViZnJdIC0gKHN5bltpICsgaV9zdWJmciAtIFRdID4+IDEpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3luW2kgKyBpX3N1YmZyICsgVF0gPj4gMSkpKSA+PgorICAgICAgICAgICAgICBzMTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IGxnOyBpIDwgTF9TVUJGUjsgaSsrKSB7CisgICAgICAgICAgLyogc2NhbGVkIHdpdGggU0ZfU1lOVEggKyBnYWluX3NmICsgMSAqLworICAgICAgICAgIG5vaXNlX2luW2ldID0KKyAgICAgICAgICAgICAgKGZNdWx0KGdhaW5TR0wsIHN5bltpICsgaV9zdWJmcl0gLSBzeW5baSArIGlfc3ViZnIgLSBUXSkpID4+IHMxOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEZES21lbXNldChub2lzZV9pbiwgKEZJWFBfREJMKTAsIExfU1VCRlIgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICB9CisKKyAgICB7CisgICAgICBGREttZW1jcHkobm9pc2VfYnVmLCBtZW1fYnBmLCAoTF9GSUxUICsgTF9TVUJGUikgKiBzaXplb2YoRklYUF9EQkwpKTsKKworICAgICAgRkRLbWVtY3B5KG1lbV9icGYsIG5vaXNlX2J1ZiArIExfU1VCRlIsCisgICAgICAgICAgICAgICAgKExfRklMVCArIExfU1VCRlIpICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgfQorCisgICAgLyogc3Vic3RyYWN0IGZyb20gdm9pY2VkIHNwZWVjaCBsb3ctcGFzcyBmaWx0ZXJlZCBub2lzZSAqLworICAgIC8qIGZpbHRlciBjb2VmZmljaWVudHMgYXJlIHNjYWxlZCB3aXRoIGZhY3RvciBTRl9GSUxUX0xQICgxKSAqLworCisgICAgeworICAgICAgZmlsdExQKCZzeW5baV9zdWJmciAtIExfU1VCRlJdLCAmc3ludGhfb3V0W2lfc3ViZnJdLCBub2lzZSwKKyAgICAgICAgICAgICBmZGtfZGVjX2ZpbHRfbHAsIExfU1VCRlIsIExfRklMVCk7CisgICAgfQorICB9CisKKyAgeworCisgIH0KKworICAvLyBUbyBiZSBkZXRlcm1pbmVkIChpbmZvIGZyb20gQmVuKQorICB7CisgICAgLyogT3V0cHV0IHNjYWxpbmcgb2YgdGhlIEJQRiBtZW1vcnkgKi8KKyAgICBzY2FsZVZhbHVlcyhtZW1fYnBmLCAoTF9GSUxUICsgTF9TVUJGUiksIC0xKTsKKyAgICAvKiBDb3B5IHRoZSByZXN0IG9mIHRoZSBzaWduYWwgKGFmdGVyIHRoZSBmYWMpICovCisgICAgc2NhbGVWYWx1ZXNTYXR1cmF0ZSgoRklYUF9QQ00gKikmc3ludGhfb3V0W2xfZnJhbWVdLAorICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMICopJnN5bltsX2ZyYW1lIC0gTF9TVUJGUl0sCisgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVfbGVuZ3RoIC0gbF9mcmFtZSksIE1EQ1RfT1VUX0hFQURST09NKTsKKyAgfQorCisgIHJldHVybjsKK30KKworLyoKKyAqIEZyZXF1ZW5jeSBEb21haW4gTm9pc2UgU2hhcGluZworICovCisKKy8qKgorICogXGJyaWVmIEFkYXB0aXZlIExvdyBGcmVxdWVuY2llcyBEZWVtcGhhc2lzIG9mIHNwZWN0cmFsIGNvZWZmaWNpZW50cy4KKyAqCisgKiBFbnN1cmUgcXVhbnRpemF0aW9uIG9mIGxvdyBmcmVxdWVuY2llcyBpbiBjYXNlIHdoZXJlIHRoZQorICogc2lnbmFsIGR5bmFtaWMgaXMgaGlnaGVyIHRoYW4gdGhlIExQQyBub2lzZSBzaGFwaW5nLgorICogVGhpcyBpcyB0aGUgaW52ZXJzZSBvcGVyYXRpb24gb2YgYWRhcF9sb3dfZnJlcV9lbXBoKCkuCisgKiBPdXRwdXQgZ2FpbiBvZiBhbGwgYmxvY2tzLgorICoKKyAqIFxwYXJhbSB4IHBvaW50ZXIgdG8gdGhlIHNwZWN0cmFsIGNvZWZmaWNpZW50cywgcmVxdWlyZXMgMSBiaXQgaGVhZHJvb20uCisgKiBccGFyYW0gbGcgbGVuZ3RoIG9mIHguCisgKiBccGFyYW0gYlVzZU5ld0FsZmUgaWYgc2V0LCBhcHBseSBBTEZEIGZvciBmdWxsYmFuZCBscGQuCisgKiBccGFyYW0gZ2FpbkxwYzEgcG9pbnRlciB0byBnYWluIGJhc2VkIG9uIG9sZCBpbnB1dCBMUEMgY29lZmZpY2llbnRzLgorICogXHBhcmFtIGdhaW5McGMyIHBvaW50ZXIgdG8gZ2FpbiBiYXNlZCBvbiBuZXcgaW5wdXQgTFBDIGNvZWZmaWNpZW50cy4KKyAqIFxwYXJhbSBhbGZkX2dhaW5zIHBvaW50ZXIgdG8gb3V0cHV0IGdhaW5zLgorICogXHBhcmFtIHMgY3VycmVudCBzY2FsZSBzaGlmdCBmYWN0b3Igb2YgeC4KKyAqLworI2RlZmluZSBBTEZEUE9XMl9TQ0FMRSAzCisvKnN0YXRpYyovCit2b2lkIENMcGRfQWRhcHRMb3dGcmVxRGVlbXBoKEZJWFBfREJMIHhbXSwgaW50IGxnLCBGSVhQX0RCTCBhbGZkX2dhaW5zW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzKSB7CisgIHsKKyAgICBpbnQgaSwgaiwgaywgaV9tYXg7CisgICAgRklYUF9EQkwgbWF4LCBmYWM7CisgICAgLyogTm90ZTogVGhpcyBzdGFjayBhcnJheSBzYXZlcyB0ZW1wb3JhcnkgYWNjdW11bGF0aW9uIHJlc3VsdHMgdG8gYmUgdXNlZCBpbgorICAgICAqIGEgc2Vjb25kIHJ1biAqLworICAgIC8qICAgICAgIFRoZSBzaXplIHNob3VsZCBiZSBsaW1pdGVkIHRvICgxMDI0LzQpLzg9MzIgKi8KKyAgICBGSVhQX0RCTCB0bXBfcG93MlszMl07CisKKyAgICBzID0gcyAqIDIgKyBBTEZEUE9XMl9TQ0FMRTsKKworICAgIGsgPSA4OworICAgIGlfbWF4ID0gbGcgLyA0OyAvKiBBTEZEIHJhbmdlID0gMTYwMEh6IChsZyA9IDY0MDBIeikgKi8KKworICAgIC8qIGZpbmQgc3BlY3RyYWwgcGVhayAqLworICAgIG1heCA9IEZMMkZYX0RCTCgwLjAxZikgPj4gczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaV9tYXg7IGkgKz0gaykgeworICAgICAgRklYUF9EQkwgdG1wOworCisgICAgICB0bXAgPSBGSVhQX0RCTCgwKTsKKyAgICAgIEZJWFBfREJMICpwWCA9ICZ4W2ldOworCisgICAgICBqID0gODsKKyAgICAgIGRvIHsKKyAgICAgICAgRklYUF9EQkwgeDAgPSAqcFgrKzsKKyAgICAgICAgRklYUF9EQkwgeDEgPSAqcFgrKzsKKyAgICAgICAgeDAgPSBmUG93MkRpdjIoeDApOworICAgICAgICB4MSA9IGZQb3cyRGl2Mih4MSk7CisgICAgICAgIHRtcCA9IHRtcCArICh4MCA+PiAoQUxGRFBPVzJfU0NBTEUgLSAxKSk7CisgICAgICAgIHRtcCA9IHRtcCArICh4MSA+PiAoQUxGRFBPVzJfU0NBTEUgLSAxKSk7CisgICAgICB9IHdoaWxlICgoaiA9IGogLSAyKSAhPSAwKTsKKyAgICAgIHRtcCA9IGZNYXgodG1wLCAoRkwyRlhfREJMKDAuMDFmKSA+PiBzKSk7CisgICAgICB0bXBfcG93MltpID4+IDNdID0gdG1wOworICAgICAgaWYgKHRtcCA+IG1heCkgeworICAgICAgICBtYXggPSB0bXA7CisgICAgICB9CisgICAgfQorCisgICAgLyogZGVlbXBoYXNpcyBvZiBhbGwgYmxvY2tzIGJlbG93IHRoZSBwZWFrICovCisgICAgZmFjID0gRkwyRlhfREJMKDAuMWYpID4+IDE7CisgICAgZm9yIChpID0gMDsgaSA8IGlfbWF4OyBpICs9IGspIHsKKyAgICAgIEZJWFBfREJMIHRtcDsKKyAgICAgIElOVCBzaGlmdGk7CisKKyAgICAgIHRtcCA9IHRtcF9wb3cyW2kgPj4gM107CisKKyAgICAgIC8qIHRtcCA9IChmbG9hdClzcXJ0KHRtcC9tYXgpOyAqLworCisgICAgICAvKiB2YWx1ZSBvZiB0bXAgaXMgYmV0d2VlbiA4LzIqbWF4XjIgYW5kIG1heF4yIC8gMi4gKi8KKyAgICAgIC8qIHJlcXVpcmVkIHNoaWZ0IGZhY3RvciBvZiBkaXZpc2lvbiBjYW4gZ3JvdyB1cCB0byAyNworICAgICAgICAgKGdyb3dzIGV4cG9uZW50aWFsbHkgZm9yIHZhbHVlcyB0b3dhcmQgemVybykKKyAgICAgICAgIHRodXMgdXNpbmcgbm9ybWFsaXplZCBkaXZpc2lvbiB0byBhc3N1cmUgdmFsaWQgcmVzdWx0LiAqLworICAgICAgeworICAgICAgICBJTlQgc2Q7CisKKyAgICAgICAgaWYgKHRtcCAhPSAoRklYUF9EQkwpMCkgeworICAgICAgICAgIHRtcCA9IGZEaXZOb3JtKG1heCwgdG1wLCAmc2QpOworICAgICAgICAgIGlmIChzZCAmIDEpIHsKKyAgICAgICAgICAgIHNkKys7CisgICAgICAgICAgICB0bXAgPj49IDE7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRtcCA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICAgICAgICAgIHNkID0gMDsKKyAgICAgICAgfQorICAgICAgICB0bXAgPSBpbnZTcXJ0Tm9ybTIodG1wLCAmc2hpZnRpKTsKKyAgICAgICAgdG1wID0gc2NhbGVWYWx1ZSh0bXAsIHNoaWZ0aSAtIDEgLSAoc2QgLyAyKSk7CisgICAgICB9CisgICAgICBpZiAodG1wID4gZmFjKSB7CisgICAgICAgIGZhYyA9IHRtcDsKKyAgICAgIH0KKyAgICAgIEZJWFBfREJMICpwWCA9ICZ4W2ldOworCisgICAgICBqID0gODsKKyAgICAgIGRvIHsKKyAgICAgICAgRklYUF9EQkwgeDAgPSBwWFswXTsKKyAgICAgICAgRklYUF9EQkwgeDEgPSBwWFsxXTsKKyAgICAgICAgeDAgPSBmTXVsdERpdjIoeDAsIGZhYyk7CisgICAgICAgIHgxID0gZk11bHREaXYyKHgxLCBmYWMpOworICAgICAgICB4MCA9IHgwIDw8IDI7CisgICAgICAgIHgxID0geDEgPDwgMjsKKyAgICAgICAgKnBYKysgPSB4MDsKKyAgICAgICAgKnBYKysgPSB4MTsKKworICAgICAgfSB3aGlsZSAoKGogPSBqIC0gMikgIT0gMCk7CisgICAgICAvKiBTdG9yZSBnYWlucyBmb3IgRkFDICovCisgICAgICAqYWxmZF9nYWlucysrID0gZmFjOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFxicmllZiBJbnRlcnBvbGF0ZWQgTm9pc2UgU2hhcGluZyBmb3IgbWRjdCBjb2VmZmljaWVudHMuCisgKiBUaGlzIGFsZ29yaXRobSBzaGFwZXMgdGVtcG9yYWxseSB0aGUgc3BlY3RyYWwgbm9pc2UgYmV0d2VlbgorICogdGhlIHR3byBzcGVjdHJhbCBub2lzZSByZXByZXNlbnRpb24gKEZETlNfTlBUUyBvZiByZXNvbHV0aW9uKS4KKyAqIFRoZSBub2lzZSBpcyBzaGFwZWQgbW9ub3RvbmljYWxseSBiZXR3ZWVuIHRoZSB0d28gcG9pbnRzCisgKiB1c2luZyBhIGN1cnZlZCBzaGFwZSB0byBmYXZvciB0aGUgbG93ZXIgZ2FpbiBpbiBtaWQtZnJhbWUuCisgKiBPREZUIGFuZCBhbXBsaXR1ZCBjYWxjdWxhdGlvbiBhcmUgYXBwbGllZCB0byB0aGUgMiBMUEMgY29lZmZpY2llbnRzIGZpcnN0LgorICoKKyAqIFxwYXJhbSByIHBvaW50ZXIgdG8gc3BlY3RydW0gZGF0YS4KKyAqIFxwYXJhbSBybXMgUk1TIG9mIG91dHB1dCBzcGVjdHJ1bS4KKyAqIFxwYXJhbSBsZyBsZW5ndGggb2Ygci4KKyAqIFxwYXJhbSBBMSBwb2ludGVyIHRvIG9sZCBpbnB1dCBMUEMgY29lZmZpY2llbnRzIG9mIGxlbmd0aCBNX0xQX0ZJTFRFUl9PUkRFUgorICogc2NhbGVkIGJ5IFNGX0FfQ09FRkZTLgorICogXHBhcmFtIEEyIHBvaW50ZXIgdG8gbmV3IGlucHV0IExQQyBjb2VmZmljaWVudHMgb2YgbGVuZ3RoIE1fTFBfRklMVEVSX09SREVSCisgKiBzY2FsZWQgYnkgU0ZfQV9DT0VGRlMuCisgKiBccGFyYW0gYkxwYzJNZGN0IGZsYWdzIGNvbnRyb2wgbHBjMm1kY3QgY29udmVyc2lvbiBhbmQgbm9pc2Ugc2hhcGluZy4KKyAqIFxwYXJhbSBnYWluTHBjMSBwb2ludGVyIHRvIGdhaW4gYmFzZWQgb24gb2xkIGlucHV0IExQQyBjb2VmZmljaWVudHMuCisgKiBccGFyYW0gZ2FpbkxwYzIgcG9pbnRlciB0byBnYWluIGJhc2VkIG9uIG5ldyBpbnB1dCBMUEMgY29lZmZpY2llbnRzLgorICogXHBhcmFtIGdMcGNfZSBwb2ludGVyIHRvIGV4cG9uZW50IG9mIGdhaW5McGMxIGFuZCBnYWluTHBjMi4KKyAqLworLyogc3RhdGljICovCisjZGVmaW5lIE5TSEFQRV9TQ0FMRSAoNCkKKworI2RlZmluZSBMUEMyTURDVF9DQUxDICgxKQorI2RlZmluZSBMUEMyTURDVF9HQUlOX0xPQUQgKDIpCisjZGVmaW5lIExQQzJNRENUX0dBSU5fU0FWRSAoNCkKKyNkZWZpbmUgTFBDMk1EQ1RfQVBQTFlfTlNIQVBFICg4KQorCit2b2lkIGxwYzJtZGN0QW5kTm9pc2VTaGFwaW5nKEZJWFBfREJMICpyLCBTSE9SVCAqcFNjYWxlLCBjb25zdCBJTlQgbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBmZG5zX25wdHMsIGNvbnN0IEZJWFBfTFBDICpBMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIEExX2V4cCwgY29uc3QgRklYUF9MUEMgKkEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgQTJfZXhwKSB7CisgIEZJWFBfREJMICp0bXAyID0gTlVMTDsKKyAgRklYUF9EQkwgcnJfbWludXNfb25lOworICBpbnQgaSwgaywgcywgc3RlcDsKKworICBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKHRtcDEsIEZJWFBfREJMLCBGRE5TX05QVFMgKiA4KQorCisgIHsKKyAgICB0bXAyID0gdG1wMSArIGZkbnNfbnB0cyAqIDQ7CisKKyAgICAvKiBscGMybWRjdCgpICovCisKKyAgICAvKiBPREZULiBFX0xQQ19hX3dlaWdodCgpIGZvciBBMSBhbmQgQTIgdmVjdG9ycyBpcyBpbmNsdWRlZCBpbnRvIHRoZSBsb29wCisgICAgICogYmVsb3cuICovCisgICAgRklYUF9EQkwgZiA9IEZMMkZYQ09OU1RfREJMKDAuOTJmKTsKKworICAgIGNvbnN0IEZJWFBfU1RQICpTaW5UYWI7CisgICAgaW50IGtfc3RlcDsKKyAgICAvKiBuZWVkZWQgdmFsdWVzOiBzaW4ocGhpKSwgY29zKHBoaSk7IHBoaSA9IGkqUEkvKDIqZmRuc19ucHRzKSwgaSA9IDAgLi4uCisgICAgICogTV9MUF9GSUxURVJfT1JERVIgKi8KKyAgICBzd2l0Y2ggKGZkbnNfbnB0cykgeworICAgICAgY2FzZSA2NDoKKyAgICAgICAgU2luVGFiID0gU2luZVRhYmxlNTEyOworICAgICAgICBrX3N0ZXAgPSAoNTEyIC8gNjQpOworICAgICAgICBGREtfQVNTRVJUKDUxMiA+PSA2NCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0ODoKKyAgICAgICAgU2luVGFiID0gU2luZVRhYmxlMzg0OworICAgICAgICBrX3N0ZXAgPSAzODQgLyA0ODsKKyAgICAgICAgRkRLX0FTU0VSVCgzODQgPj0gNDgpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwLCBrID0ga19zdGVwOyBpIDwgTV9MUF9GSUxURVJfT1JERVI7IGkrKywgayArPSBrX3N0ZXApIHsKKyAgICAgIEZJWFBfU1RQIGNzID0gU2luVGFiW2tdOworICAgICAgRklYUF9EQkwgd0ExLCB3QTI7CisKKyAgICAgIHdBMSA9IGZNdWx0KEExW2ldLCBmKTsKKyAgICAgIHdBMiA9IGZNdWx0KEEyW2ldLCBmKTsKKworICAgICAgLyogcltpXSA9IEFbaV0qY29zKCkgKi8KKyAgICAgIHRtcDFbMiArIGkgKiAyXSA9IGZNdWx0KHdBMSwgY3Mudi5yZSk7CisgICAgICB0bXAyWzIgKyBpICogMl0gPSBmTXVsdCh3QTIsIGNzLnYucmUpOworICAgICAgLyogaVtpXSA9IEFbaV0qc2luKCkgKi8KKyAgICAgIHRtcDFbMyArIGkgKiAyXSA9IC1mTXVsdCh3QTEsIGNzLnYuaW0pOworICAgICAgdG1wMlszICsgaSAqIDJdID0gLWZNdWx0KHdBMiwgY3Mudi5pbSk7CisKKyAgICAgIGYgPSBmTXVsdChmLCBGTDJGWENPTlNUX0RCTCgwLjkyZikpOworICAgIH0KKworICAgIC8qIEd1YXJhbnRlZSBhdCBsZWFzdCAyIGJpdHMgb2YgaGVhZHJvb20gZm9yIHRoZSBGRlQgKi8KKyAgICAvKiAiMyIgc3RhbmRzIGZvciAxLjAgd2l0aCAyIGJpdHMgb2YgaGVhZHJvb207IChBMV9leHAgKyAyKSBndWFyYW50ZXNzIDIKKyAgICAgKiBiaXRzIG9mIGhlYWRyb29tIGlmIEExX2V4cCA+IDEgKi8KKyAgICBpbnQgQTFfZXhwX2ZpeCA9IGZNYXgoMywgQTFfZXhwICsgMik7CisgICAgaW50IEEyX2V4cF9maXggPSBmTWF4KDMsIEEyX2V4cCArIDIpOworCisgICAgLyogU2V0IDEuMCBpbiB0aGUgcHJvcGVyIGZvcm1hdCAqLworICAgIHRtcDFbMF0gPSAoRklYUF9EQkwpKElOVCkoKFVMT05HKTB4ODAwMDAwMDAgPj4gQTFfZXhwX2ZpeCk7CisgICAgdG1wMlswXSA9IChGSVhQX0RCTCkoSU5UKSgoVUxPTkcpMHg4MDAwMDAwMCA+PiBBMl9leHBfZml4KTsKKworICAgIHRtcDFbMV0gPSB0bXAyWzFdID0gKEZJWFBfREJMKTA7CisKKyAgICAvKiBDbGVhciB0aGUgcmVzdG8gb2YgdGhlIGFycmF5ICovCisgICAgRkRLbWVtY2xlYXIoCisgICAgICAgIHRtcDEgKyAyICogKE1fTFBfRklMVEVSX09SREVSICsgMSksCisgICAgICAgIDIgKiAoZmRuc19ucHRzICogMiAtIChNX0xQX0ZJTFRFUl9PUkRFUiArIDEpKSAqIHNpemVvZihGSVhQX0RCTCkpOworICAgIEZES21lbWNsZWFyKAorICAgICAgICB0bXAyICsgMiAqIChNX0xQX0ZJTFRFUl9PUkRFUiArIDEpLAorICAgICAgICAyICogKGZkbnNfbnB0cyAqIDIgLSAoTV9MUF9GSUxURVJfT1JERVIgKyAxKSkgKiBzaXplb2YoRklYUF9EQkwpKTsKKworICAgIC8qIEd1YXJhbnRlZSAyIGJpdHMgb2YgaGVhZHJvb20gZm9yIEZGVCAqLworICAgIHNjYWxlVmFsdWVzKCZ0bXAxWzJdLCAoMiAqIE1fTFBfRklMVEVSX09SREVSKSwgKEExX2V4cCAtIEExX2V4cF9maXgpKTsKKyAgICBzY2FsZVZhbHVlcygmdG1wMlsyXSwgKDIgKiBNX0xQX0ZJTFRFUl9PUkRFUiksIChBMl9leHAgLSBBMl9leHBfZml4KSk7CisKKyAgICBJTlQgczI7CisgICAgcyA9IEExX2V4cF9maXg7CisgICAgczIgPSBBMl9leHBfZml4OworCisgICAgZmZ0KDIgKiBmZG5zX25wdHMsIHRtcDEsICZzKTsKKyAgICBmZnQoMiAqIGZkbnNfbnB0cywgdG1wMiwgJnMyKTsKKworICAgIC8qIEFkanVzdCB0aGUgZXhwb25lbnRzIG9mIGJvdGggZmZ0IG91dHB1dHMgaWYgbmVjZXNzYXJ5Ki8KKyAgICBpZiAocyA+IHMyKSB7CisgICAgICBzY2FsZVZhbHVlcyh0bXAyLCAyICogZmRuc19ucHRzLCBzMiAtIHMpOworICAgICAgczIgPSBzOworICAgIH0gZWxzZSBpZiAocyA8IHMyKSB7CisgICAgICBzY2FsZVZhbHVlcyh0bXAxLCAyICogZmRuc19ucHRzLCBzIC0gczIpOworICAgICAgcyA9IHMyOworICAgIH0KKworICAgIEZES19BU1NFUlQocyA9PSBzMik7CisgIH0KKworICAvKiBHZXQgYW1wbGl0dWRlIGFuZCBhcHBseSBnYWlucyAqLworICBzdGVwID0gbGcgLyBmZG5zX25wdHM7CisgIHJyX21pbnVzX29uZSA9IChGSVhQX0RCTCkwOworCisgIGZvciAoayA9IDA7IGsgPCBmZG5zX25wdHM7IGsrKykgeworICAgIEZJWFBfREJMIGcxLCBnMiwgaW52X2cxX2cyLCBhLCBiOworICAgIElOVCBpbnZfZzFfZzJfZTsKKyAgICBpbnQgZ19lLCBzaGlmdDsKKworICAgIHsKKyAgICAgIEZJWFBfREJMIHJlYWwsIGltYWc7CisgICAgICBpbnQgc2kxLCBzaTIsIHNJbnB1dDsKKworICAgICAgcmVhbCA9IHRtcDFbayAqIDJdOworICAgICAgaW1hZyA9IHRtcDFbayAqIDIgKyAxXTsKKyAgICAgIHNJbnB1dCA9IGZNYXgoZk1pbihmTm9ybShyZWFsKSwgZk5vcm0oaW1hZykpIC0gMSwgMCk7CisgICAgICByZWFsIDw8PSBzSW5wdXQ7CisgICAgICBpbWFnIDw8PSBzSW5wdXQ7CisgICAgICAvKiBnMV9lID0gc2kxIC0gMipzLzIgKi8KKyAgICAgIGcxID0gaW52U3FydE5vcm0yKGZQb3cyKHJlYWwpICsgZlBvdzIoaW1hZyksICZzaTEpOworICAgICAgc2kxICs9IHNJbnB1dDsKKworICAgICAgcmVhbCA9IHRtcDJbayAqIDJdOworICAgICAgaW1hZyA9IHRtcDJbayAqIDIgKyAxXTsKKyAgICAgIHNJbnB1dCA9IGZNYXgoZk1pbihmTm9ybShyZWFsKSwgZk5vcm0oaW1hZykpIC0gMSwgMCk7CisgICAgICByZWFsIDw8PSBzSW5wdXQ7CisgICAgICBpbWFnIDw8PSBzSW5wdXQ7CisgICAgICAvKiBnMl9lID0gc2kyIC0gMipzLzIgKi8KKyAgICAgIGcyID0gaW52U3FydE5vcm0yKGZQb3cyKHJlYWwpICsgZlBvdzIoaW1hZyksICZzaTIpOworICAgICAgc2kyICs9IHNJbnB1dDsKKworICAgICAgLyogUGljayBhIGNvbW1vbiBzY2FsZSBmYWN0b3IgZm9yIGcxIGFuZCBnMiAqLworICAgICAgaWYgKHNpMSA+IHNpMikgeworICAgICAgICBnMiA+Pj0gc2kxIC0gc2kyOworICAgICAgICBnX2UgPSBzaTEgLSBzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZzEgPj49IHNpMiAtIHNpMTsKKyAgICAgICAgZ19lID0gc2kyIC0gczsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBlbmQgb2YgbHBjMm1kY3QoKSAqLworCisgICAgRkRLX0FTU0VSVChnMSA+PSAoRklYUF9EQkwpMCk7CisgICAgRkRLX0FTU0VSVChnMiA+PSAoRklYUF9EQkwpMCk7CisKKyAgICAvKiBtZGN0X0ludE5vaXNlU2hhcGluZygpICovCisgICAgeworICAgICAgLyogaW52X2cxX2cyICogMl5pbnZfZzFfZzJfZSA9IDEvKGcxK2cyKSAqLworICAgICAgaW52X2cxX2cyID0gKGcxID4+IDEpICsgKGcyID4+IDEpOworICAgICAgaWYgKGludl9nMV9nMiAhPSAoRklYUF9EQkwpMCkgeworICAgICAgICBpbnZfZzFfZzIgPSBmRGl2Tm9ybShGTDJGWENPTlNUX0RCTCgwLjVmKSwgaW52X2cxX2cyLCAmaW52X2cxX2cyX2UpOworICAgICAgICBpbnZfZzFfZzJfZSA9IGludl9nMV9nMl9lIC0gZ19lOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW52X2cxX2cyID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CisgICAgICAgIGludl9nMV9nMl9lID0gMDsKKyAgICAgIH0KKworICAgICAgaWYgKGdfZSA8IDApIHsKKyAgICAgICAgLyogYV9lID0gZ19lICsgaW52X2cxX2cyX2UgKyAxICovCisgICAgICAgIGEgPSBzY2FsZVZhbHVlKGZNdWx0KGZNdWx0KGcxLCBnMiksIGludl9nMV9nMiksIGdfZSk7CisgICAgICAgIC8qIGJfZSA9IGdfZSArIGludl9nMV9nMl9lICovCisgICAgICAgIGIgPSBmTXVsdChnMiAtIGcxLCBpbnZfZzFfZzIpOworICAgICAgICBzaGlmdCA9IGdfZSArIGludl9nMV9nMl9lICsgMSAtIE5TSEFQRV9TQ0FMRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGFfZSA9IChnX2UrZ19lKSArIGludl9nMV9nMl9lICsgMSAqLworICAgICAgICBhID0gZk11bHQoZk11bHQoZzEsIGcyKSwgaW52X2cxX2cyKTsKKyAgICAgICAgLyogYl9lID0gKGdfZStnX2UpICsgaW52X2cxX2cyX2UgKi8KKyAgICAgICAgYiA9IHNjYWxlVmFsdWUoZk11bHQoZzIgLSBnMSwgaW52X2cxX2cyKSwgLWdfZSk7CisgICAgICAgIHNoaWZ0ID0gKGdfZSArIGdfZSkgKyBpbnZfZzFfZzJfZSArIDEgLSBOU0hBUEVfU0NBTEU7CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IGsgKiBzdGVwOyBpIDwgKGsgKyAxKSAqIHN0ZXA7IGkrKykgeworICAgICAgICBGSVhQX0RCTCB0bXA7CisKKyAgICAgICAgLyogcnJbaV0gPSAyKmEqcltpXSArIGIqcnJbaS0xXSAqLworICAgICAgICB0bXAgPSBmTXVsdChhLCByW2ldKTsKKyAgICAgICAgdG1wICs9IHNjYWxlVmFsdWUoZk11bHREaXYyKGIsIHJyX21pbnVzX29uZSksIE5TSEFQRV9TQ0FMRSk7CisgICAgICAgIHRtcCA9IHNjYWxlVmFsdWVTYXR1cmF0ZSh0bXAsIHNoaWZ0KTsKKyAgICAgICAgcnJfbWludXNfb25lID0gdG1wOworICAgICAgICByW2ldID0gdG1wOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGVuZCBvZiBtZGN0X0ludE5vaXNlU2hhcGluZygpICovCisgIHsgKnBTY2FsZSArPSBOU0hBUEVfU0NBTEU7IH0KKworICBDX0FBTExPQ19TQ1JBVENIX0VORCh0bXAxLCBGSVhQX0RCTCwgRkROU19OUFRTICogOCkKK30KKworLyoqCisgKiBcYnJpZWYgQ2FsY3VsYXRlcyB0aGUgZW5lcmd5LgorICogXHBhcmFtIHIgcG9pbnRlciB0byBzcGVjdHJ1bS4KKyAqIFxwYXJhbSBycyBzY2FsZSBmYWN0b3Igb2Ygc3BlY3RydW0gci4KKyAqIFxwYXJhbSBsZyBmcmFtZSBsZW5ndGggaW4gYXVkaW8gc2FtcGxlcy4KKyAqIFxwYXJhbSBybXNfZSBwb2ludGVyIHRvIGV4cG9uZW50IG9mIGVuZXJneSB2YWx1ZS4KKyAqIFxyZXR1cm4gbWFudGlzc2Egb2YgZW5lcmd5IHZhbHVlLgorICovCitzdGF0aWMgRklYUF9EQkwgY2FsY0VuZXJneShjb25zdCBGSVhQX0RCTCAqciwgY29uc3QgU0hPUlQgcnMsIGNvbnN0IElOVCBsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcm1zX2UpIHsKKyAgaW50IGhlYWRyb29tID0gZ2V0U2NhbGVmYWN0b3IociwgbGcpOworCisgIEZJWFBfREJMIHJtc19tID0gMDsKKworICAvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGdyb3d0aCBiaXRzIGR1ZSB0byBhZGRpdGlvbiAqLworICBJTlQgc2hpZnQgPSAoSU5UKShmTm9ybXooKEZJWFBfREJMKWxnKSk7CisgIHNoaWZ0ID0gMzEgLSBzaGlmdDsKKworICAvKiBHZW5lcmF0ZSAxZS0yIGluIFEtNi4zNyAqLworICBjb25zdCBGSVhQX0RCTCB2YWx1ZTBfMDEgPSAweDUxZWI4NTFlOworICBjb25zdCBJTlQgdmFsdWUwXzAxX2V4cCA9IC02OworCisgIC8qIEZpbmQgdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHRpbmcgZW5lcmd5IHZhbHVlICovCisgICpybXNfZSA9ICgocnMgLSBoZWFkcm9vbSkgPDwgMSkgKyBzaGlmdCArIDE7CisKKyAgSU5UIGRlbHRhID0gKnJtc19lIC0gdmFsdWUwXzAxX2V4cDsKKyAgaWYgKGRlbHRhID4gMCkgeworICAgIC8qIExpbWl0IHNoaWZ0X3RvIDMxKi8KKyAgICBkZWx0YSA9IGZNaW4oMzEsIGRlbHRhKTsKKyAgICBybXNfbSA9IHZhbHVlMF8wMSA+PiBkZWx0YTsKKyAgfSBlbHNlIHsKKyAgICBybXNfbSA9IHZhbHVlMF8wMTsKKyAgICAqcm1zX2UgPSB2YWx1ZTBfMDFfZXhwOworICAgIHNoaWZ0ID0gc2hpZnQgLSBkZWx0YTsKKyAgICAvKiBMaW1pdCBzaGlmdF90byAzMSovCisgICAgc2hpZnQgPSBmTWluKDMxLCBzaGlmdCk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGxnOyBpKyspIHsKKyAgICBybXNfbSArPSBmUG93MkRpdjIocltpXSA8PCBoZWFkcm9vbSkgPj4gc2hpZnQ7CisgIH0KKworICByZXR1cm4gcm1zX207Cit9CisKKy8qKgorICogXGJyaWVmIFRDWCBnYWluIGNhbGN1bGF0aW9uLgorICogXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gY2hhbm5lbCBjb250ZXh0IGRhdGEuCisgKiBccGFyYW0gciBvdXRwdXQgc3BlY3RydW0uCisgKiBccGFyYW0gcm1zX2UgcG9pbnRlciB0byBtYW50aXNzYSBvZiBlbmVyZ3kgdmFsdWUuCisgKiBccGFyYW0gcm1zX2UgcG9pbnRlciB0byBleHBvbmVudCBvZiBlbmVyZ3kgdmFsdWUuCisgKiBccGFyYW0gZnJhbWUgdGhlIGZyYW1lIGluZGV4IG9mIHRoZSBMUEQgc3VwZXIgZnJhbWUuCisgKiBccGFyYW0gbGcgdGhlIGZyYW1lIGxlbmd0aCBpbiBhdWRpbyBzYW1wbGVzLgorICogXHBhcmFtIGdhaW5fbSBwb2ludGVyIHRvIG1hbnRpc3NhIG9mIFRDWCBnYWluLgorICogXHBhcmFtIGdhaW5fZSBwb2ludGVyIHRvIGV4cG9uZW50IG9mIFRDWCBnYWluLgorICogXHBhcmFtIGVsRmxhZ3MgZWxlbWVudCBzcGVjaWZpYyBwYXJzZXIgZ3VpZGFuY2UgZmxhZ3MuCisgKiBccGFyYW0gbGdfZmIgdGhlIGZ1bGxiYW5kIGZyYW1lIGxlbmd0aCBpbiBhdWRpbyBzYW1wbGVzLgorICogXHBhcmFtIElHRl9iZ24gdGhlIElHRiBzdGFydCBpbmRleC4KKyAqLworc3RhdGljIHZvaWQgY2FsY1RDWEdhaW4oQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpyLCBGSVhQX0RCTCBybXNfbSwgSU5UIHJtc19lLCBjb25zdCBJTlQgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbGcpIHsKKyAgaWYgKChybXNfbSAhPSAoRklYUF9EQkwpMCkpIHsKKyAgICBGSVhQX0RCTCB0Y3hfZ2Fpbl9tOworICAgIElOVCB0Y3hfZ2Fpbl9lOworCisgICAgQ0xwZF9EZWNvZGVHYWluKCZ0Y3hfZ2Fpbl9tLCAmdGN4X2dhaW5fZSwKKyAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8udXNhYworICAgICAgICAgICAgICAgICAgICAgICAgLnRjeF9nbG9iYWxfZ2FpbltmcmFtZV0pOworCisgICAgLyogcm1zICogMl5ybXNfZSA9IGxnL3NxcnQoc3VtKHNwZWNeMikpICovCisgICAgaWYgKHJtc19lICYgMSkgeworICAgICAgcm1zX20gPj49IDE7CisgICAgICBybXNfZSsrOworICAgIH0KKworICAgIHsKKyAgICAgIEZJWFBfREJMIGZ4X2xnOworICAgICAgSU5UIGZ4X2xnX2UsIHM7CisgICAgICBJTlQgaW52X2U7CisKKyAgICAgIC8qIGxnID0gZnhfbGcgKiAyXmZ4X2xnX2UgKi8KKyAgICAgIHMgPSBmTm9ybSgoRklYUF9EQkwpbGcpOworICAgICAgZnhfbGcgPSAoRklYUF9EQkwpbGcgPDwgczsKKyAgICAgIGZ4X2xnX2UgPSBERlJBQ1RfQklUUyAtIDEgLSBzOworICAgICAgLyogMS9zcXJ0KHJtcykgKi8KKyAgICAgIHJtc19tID0gaW52U3FydE5vcm0yKHJtc19tLCAmaW52X2UpOworICAgICAgcm1zX20gPSBmTXVsdChybXNfbSwgZnhfbGcpOworICAgICAgcm1zX2UgPSBpbnZfZSAtIChybXNfZSA+PiAxKSArIGZ4X2xnX2U7CisgICAgfQorCisgICAgeworICAgICAgaW50IHMgPSBmTm9ybSh0Y3hfZ2Fpbl9tKTsKKyAgICAgIHRjeF9nYWluX20gPSB0Y3hfZ2Fpbl9tIDw8IHM7CisgICAgICB0Y3hfZ2Fpbl9lIC09IHM7CisgICAgfQorCisgICAgdGN4X2dhaW5fbSA9IGZNdWx0RGl2Mih0Y3hfZ2Fpbl9tLCBybXNfbSk7CisgICAgdGN4X2dhaW5fZSA9IHRjeF9nYWluX2UgKyBybXNfZTsKKworICAgIC8qIGdsb2JhbF9nYWluICogMl4oZ2xvYmFsX2dhaW5fZStybXNfZSkgPSAoMTBeKGdsb2JhbF9nYWluLzI4KSkgKiBybXMgKgorICAgICAqIDJecm1zX2UgKi8KKyAgICB7CisgICAgICB7IHRjeF9nYWluX2UgKz0gMTsgfQorICAgIH0KKworICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy50Y3hfZ2FpbltmcmFtZV0gPSB0Y3hfZ2Fpbl9tOworICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy50Y3hfZ2Fpbl9lW2ZyYW1lXSA9IHRjeF9nYWluX2U7CisKKyAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGVbZnJhbWVdICs9IHRjeF9nYWluX2U7CisgIH0KK30KKworLyoqCisgKiBcYnJpZWYgRkROUyBkZWNvZGluZy4KKyAqIFxwYXJhbSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvIGNoYW5uZWwgY29udGV4dCBkYXRhLgorICogXHBhcmFtIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gY2hhbm5lbCBjb250ZXh0IHN0YXRpYyBkYXRhLgorICogXHBhcmFtIHIgb3V0cHV0IHNwZWN0cnVtLgorICogXHBhcmFtIGxnIHRoZSBmcmFtZSBsZW5ndGggaW4gYXVkaW8gc2FtcGxlcy4KKyAqIFxwYXJhbSBmcmFtZSB0aGUgZnJhbWUgaW5kZXggb2YgdGhlIExQRCBzdXBlciBmcmFtZS4KKyAqIFxwYXJhbSBwU2NhbGUgcG9pbnRlciB0byBjdXJyZW50IHNjYWxlIHNoaWZ0IGZhY3RvciBvZiByW10uCisgKiBccGFyYW0gQTEgb2xkIGlucHV0IExQQyBjb2VmZmljaWVudHMgb2YgbGVuZ3RoIE1fTFBfRklMVEVSX09SREVSLgorICogXHBhcmFtIEEyIG5ldyBpbnB1dCBMUEMgY29lZmZpY2llbnRzIG9mIGxlbmd0aCBNX0xQX0ZJTFRFUl9PUkRFUi4KKyAqIFxwYXJhbSBwQWxmZEdhaW5zIHBvaW50ZXIgZm9yIEFMRkQgZ2FpbnMgb3V0cHV0IHNjYWxlZCBieSAxLgorICogXHBhcmFtIGZkbnNfbnB0cyBudW1iZXIgb2YgbGluZXMgKEZETlNfTlBUUykuCisgKiBccGFyYW0gaW5mX21hc2sgcG9pbnRlciB0byBub2lzZSBtYXNrLgorICogXHBhcmFtIElHRl93aW5fbW9kZSBJR0Ygd2luZG93IG1vZGUgKExPTkcsIFNIT1JULCBUQ1gxMCwgVENYMjApLgorICogXHBhcmFtIGZyYW1lVHlwZSAoSUdGX0ZSQU1FX0RJVklTSU9OX0FBQ19PUl9UQ1hfTE9ORyBvcgorICogSUdGX0ZSQU1FX0RJVklTSU9OX1RDWF9TSE9SVF8xKS4KKyAqIFxwYXJhbSBlbEZsYWdzIGVsZW1lbnQgc3BlY2lmaWMgcGFyc2VyIGd1aWRhbmNlIGZsYWdzLgorICogXHBhcmFtIGxnX2ZiIHRoZSBmdWxsYmFuZCBmcmFtZSBsZW5ndGggaW4gYXVkaW8gc2FtcGxlcy4KKyAqIFxwYXJhbSBJR0ZfYmduIHRoZSBJR0Ygc3RhcnQgaW5kZXguCisgKiBccGFyYW0gcm1zX20gbWFudGlzc2Ugb2YgZW5lcmd5LgorICogXHBhcmFtIHJtc19lIGV4cG9uZW50IG9mIGVuZXJneS4KKyAqLworLyogc3RhdGljICovCit2b2lkIENMcGRfRmRuc0RlY29kZShDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHJbXSwgY29uc3QgSU5UIGxnLCBjb25zdCBJTlQgZnJhbWUsIFNIT1JUICpwU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0xQQyBBMVtNX0xQX0ZJTFRFUl9PUkRFUl0sIGNvbnN0IElOVCBBMV9leHAsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0xQQyBBMltNX0xQX0ZJTFRFUl9PUkRFUl0sIGNvbnN0IElOVCBBMl9leHAsCisgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBwQWxmZEdhaW5zW0xGQUMgLyA0XSwgY29uc3QgSU5UIGZkbnNfbnB0cykgeworICAvKiBXZWlnaHQgTFBDIGNvZWZmaWNpZW50cyB1c2luZyBSbSB2YWx1ZXMgKi8KKyAgQ0xwZF9BZGFwdExvd0ZyZXFEZWVtcGgociwgbGcsIHBBbGZkR2FpbnMsICpwU2NhbGUpOworCisgIEZJWFBfREJMIHJtc19tID0gKEZJWFBfREJMKTA7CisgIElOVCBybXNfZSA9IDA7CisgIHsKKyAgICAvKiBDYWxjdWxhdGUgRW5lcmd5ICovCisgICAgcm1zX20gPSBjYWxjRW5lcmd5KHIsICpwU2NhbGUsIGxnLCAmcm1zX2UpOworICB9CisKKyAgY2FsY1RDWEdhaW4ocEFhY0RlY29kZXJDaGFubmVsSW5mbywgciwgcm1zX20sIHJtc19lLCBmcmFtZSwgbGcpOworCisgIC8qIEFwcGx5IE9ERlQgYW5kIE5vaXNlIFNoYXBpbmcuIExQIGNvZWZmaWNpZW50IChBMSwgQTIpIHdlaWdodGluZyBpcyBkb25lCisgICAqIGluc2lkZSBvbiB0aGUgZmx5LiAqLworCisgIGxwYzJtZGN0QW5kTm9pc2VTaGFwaW5nKHIsIHBTY2FsZSwgbGcsIGZkbnNfbnB0cywgQTEsIEExX2V4cCwgQTIsIEEyX2V4cCk7Cit9CisKKy8qKgorICogZmluZCBwaXRjaCBmb3IgVENYMjAgKHRpbWUgZG9tYWluKSBjb25jZWFsbWVudC4KKyAqLworc3RhdGljIGludCBmaW5kX21waXRjaChGSVhQX0RCTCB4cmlbXSwgaW50IGxnKSB7CisgIEZJWFBfREJMIG1heCwgcGl0Y2g7CisgIElOVCBwaXRjaF9lOworICBpbnQgaSwgbjsKKworICBtYXggPSAoRklYUF9EQkwpMDsKKyAgbiA9IDI7CisKKyAgLyogZmluZCBtYXhpbXVtIGJlbG93IDQwMEh6ICovCisgIGZvciAoaSA9IDI7IGkgPCAobGcgPj4gNCk7IGkgKz0gMikgeworICAgIEZJWFBfREJMIHRtcCA9IGZQb3cyRGl2Mih4cmlbaV0pICsgZlBvdzJEaXYyKHhyaVtpICsgMV0pOworICAgIGlmICh0bXAgPiBtYXgpIHsKKyAgICAgIG1heCA9IHRtcDsKKyAgICAgIG4gPSBpOworICAgIH0KKyAgfQorCisgIC8vIHBpdGNoID0gKChmbG9hdClsZzw8MSkvKGZsb2F0KW47CisgIHBpdGNoID0gZkRpdk5vcm0oKEZJWFBfREJMKWxnIDw8IDEsIChGSVhQX0RCTCluLCAmcGl0Y2hfZSk7CisgIHBpdGNoID4+PSBmaXhNYXgoMCwgREZSQUNUX0JJVFMgLSAxIC0gcGl0Y2hfZSAtIDE2KTsKKworICAvKiBmaW5kIHBpdGNoIG11bHRpcGxlIHVuZGVyIDIwbXMgKi8KKyAgaWYgKHBpdGNoID49IChGSVhQX0RCTCkoKDI1NiA8PCAxNikgLSAxKSkgeyAvKjIzMS4wZiovCisgICAgbiA9IDI1NjsKKyAgfSBlbHNlIHsKKyAgICBGSVhQX0RCTCBtcGl0Y2ggPSBwaXRjaDsKKyAgICB3aGlsZSAobXBpdGNoIDwgKEZJWFBfREJMKSgyNTUgPDwgMTYpKSB7CisgICAgICBtcGl0Y2ggKz0gcGl0Y2g7CisgICAgfQorICAgIG4gPSAoaW50KShtcGl0Y2ggLSBwaXRjaCkgPj4gMTY7CisgIH0KKworICByZXR1cm4gKG4pOworfQorCisvKioKKyAqIG51bWJlciBvZiBzcGVjdHJhbCBjb2VmZmljaWVudHMgLyB0aW1lIGRvbWFpbiBzYW1wbGVzIHVzaW5nIGZyYW1lIG1vZGUgYXMKKyAqIGluZGV4LgorICovCitzdGF0aWMgY29uc3QgaW50IGxnX3RhYmxlX2NjZmxbMl1bNF0gPSB7CisgICAgezI1NiwgMjU2LCA1MTIsIDEwMjR9LCAvKiBjb3JlQ29kZXJGcmFtZUxlbmd0aCA9IDEwMjQgKi8KKyAgICB7MTkyLCAxOTIsIDM4NCwgNzY4fSAgIC8qIGNvcmVDb2RlckZyYW1lTGVuZ3RoID0gNzY4ICAqLworfTsKKworLyoqCisgKiBcYnJpZWYgRGVjb2RlIGFuZCByZW5kZXIgb25lIE1EQ1QtVENYIGZyYW1lLgorICogXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gY2hhbm5lbCBjb250ZXh0IGRhdGEuCisgKiBccGFyYW0gbGcgdGhlIGZyYW1lIGxlbmd0aCBpbiBhdWRpbyBzYW1wbGVzLgorICogXHBhcmFtIGZyYW1lIHRoZSBmcmFtZSBpbmRleCBvZiB0aGUgTFBEIHN1cGVyIGZyYW1lLgorICovCitzdGF0aWMgdm9pZCBDTHBkX1RjeERlY29kZSgKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sIFVJTlQgZmxhZ3MsCisgICAgaW50IG1vZCwgaW50IGxhc3RfbW9kLCBpbnQgZnJhbWUsIGludCBmcmFtZU9rKSB7CisgIEZJWFBfREJMICpwQWxmZF9nYWlucyA9IHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfYWxmZF9nYWluczsKKyAgVUxPTkcgKnBTZWVkID0gJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm5mUmFuZG9tU2VlZDsKKyAgaW50IGxnID0gKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGggPT0gMTI4KQorICAgICAgICAgICAgICAgPyBsZ190YWJsZV9jY2ZsWzBdW21vZCArIDBdCisgICAgICAgICAgICAgICA6IGxnX3RhYmxlX2NjZmxbMV1bbW9kICsgMF07CisgIGludCBuZXh0X2ZyYW1lID0gZnJhbWUgKyAoMSA8PCAobW9kIC0gMSkpOworICBpbnQgaXNGdWxsQmFuZExwZCA9IDA7CisKKyAgLyogT2J0YWluIHJbXSB2ZWN0b3IgYnkgY29tYmluaW5nIHRoZSBxdWFudFtdIGFuZCBub2lzZVtdIHZlY3RvcnMgKi8KKyAgeworICAgIEZJWFBfREJMIG5vaXNlX2xldmVsOworICAgIEZJWFBfREJMICpjb2VmZnMgPQorICAgICAgICBTUEVDX1RDWChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCwgZnJhbWUsCisgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGgsIGlzRnVsbEJhbmRMcGQpOworICAgIGludCBzY2FsZSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZVtmcmFtZV07CisgICAgaW50IGksIG5mQmduLCBuZkVuZDsKKyAgICBVQ0hBUiB0Y3hfbm9pc2VfZmFjdG9yID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8udXNhYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRjeF9ub2lzZV9mYWN0b3JbZnJhbWVdOworCisgICAgLyogZmluZCBwaXRjaCBmb3IgYmZpIGNhc2UgKi8KKyAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X3RjeF9waXRjaCA9IGZpbmRfbXBpdGNoKGNvZWZmcywgbGcpOworCisgICAgaWYgKGZyYW1lT2spIHsKKyAgICAgIC8qIHN0b3JlIGZvciBjb25jZWFsbWVudCAqLworICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF90Y3hfbm9pc2VfZmFjdG9yID0gdGN4X25vaXNlX2ZhY3RvcjsKKyAgICB9IGVsc2UgeworICAgICAgLyogcmVzdG9yZSBsYXN0IGZyYW1lcyB2YWx1ZSAqLworICAgICAgdGN4X25vaXNlX2ZhY3RvciA9IHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfdGN4X25vaXNlX2ZhY3RvcjsKKyAgICB9CisKKyAgICBub2lzZV9sZXZlbCA9CisgICAgICAgIChGSVhQX0RCTCkoKExPTkcpRkwyRlhDT05TVF9EQkwoMC4wNjI1ZikgKiAoOCAtIHRjeF9ub2lzZV9mYWN0b3IpKTsKKyAgICBub2lzZV9sZXZlbCA9IHNjYWxlVmFsdWUobm9pc2VfbGV2ZWwsIC1zY2FsZSk7CisKKyAgICBjb25zdCBGSVhQX0RCTCBuZWdfbm9pc2VfbGV2ZWwgPSAtbm9pc2VfbGV2ZWw7CisKKyAgICB7CisgICAgICBuZkJnbiA9IGxnIC8gNjsKKyAgICAgIG5mRW5kID0gbGc7CisgICAgfQorCisgICAgZm9yIChpID0gbmZCZ247IGkgPCBuZkVuZCAtIDc7IGkgKz0gOCkgeworICAgICAgTE9ORyB0bXA7CisKKyAgICAgIC8qIEZpbGwgYWxsIDggY29uc2VjdXRpdmUgemVybyBjb2VmZnMgd2l0aCBub2lzZSAqLworICAgICAgdG1wID0gY29lZmZzW2kgKyAwXSB8IGNvZWZmc1tpICsgMV0gfCBjb2VmZnNbaSArIDJdIHwgY29lZmZzW2kgKyAzXSB8CisgICAgICAgICAgICBjb2VmZnNbaSArIDRdIHwgY29lZmZzW2kgKyA1XSB8IGNvZWZmc1tpICsgNl0gfCBjb2VmZnNbaSArIDddOworCisgICAgICBpZiAodG1wID09IDApIHsKKyAgICAgICAgZm9yIChpbnQgayA9IGk7IGsgPCBpICsgODsgaysrKSB7CisgICAgICAgICAgVXNhY1JhbmRvbVNpZ24ocFNlZWQpID8gKGNvZWZmc1trXSA9IG5lZ19ub2lzZV9sZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoY29lZmZzW2tdID0gbm9pc2VfbGV2ZWwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmICgobmZFbmQgLSBpKSA+CisgICAgICAgIDApIHsgLyogbm9pc2UgZmlsbGluZyBmb3IgbGFzdCAiYmFuZCIgd2l0aCBsZXNzIHRoYW4gOCBiaW5zICovCisgICAgICBMT05HIHRtcCA9IChMT05HKWNvZWZmc1tpXTsKKyAgICAgIGludCBrOworCisgICAgICBGREtfQVNTRVJUKChuZkVuZCAtIGkpIDwgOCk7CisgICAgICBmb3IgKGsgPSAxOyBrIDwgKG5mRW5kIC0gaSk7IGsrKykgeworICAgICAgICB0bXAgfD0gKExPTkcpY29lZmZzW2kgKyBrXTsKKyAgICAgIH0KKyAgICAgIGlmICh0bXAgPT0gMCkgeworICAgICAgICBmb3IgKGsgPSBpOyBrIDwgbmZFbmQ7IGsrKykgeworICAgICAgICAgIFVzYWNSYW5kb21TaWduKHBTZWVkKSA/IChjb2VmZnNba10gPSBuZWdfbm9pc2VfbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGNvZWZmc1trXSA9IG5vaXNlX2xldmVsKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHsKKyAgICAvKiBDb252ZXJ0IExQQyB0byBMUCBkb21haW4gKi8KKyAgICBpZiAobGFzdF9tb2QgPT0gMCkgeworICAgICAgLyogTm90ZTogVGhlIGNhc2Ugd2hlcmUgbGFzdF9tb2QgPT0gMjU1IGlzIGhhbmRsZWQgYnkgb3RoZXIgbWVhbnMKKyAgICAgICAqIGluIENMcGRDaGFubmVsU3RyZWFtX1JlYWQoKSAqLworICAgICAgRV9MUENfZl9sc3BfYV9jb252ZXJzaW9uKAorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5sc3BfY29lZmZbZnJhbWVdLAorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZltmcmFtZV0sCisgICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZl9leHBbZnJhbWVdKTsKKyAgICB9CisKKyAgICBFX0xQQ19mX2xzcF9hX2NvbnZlcnNpb24oCisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5sc3BfY29lZmZbbmV4dF9mcmFtZV0sCisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZltuZXh0X2ZyYW1lXSwKKyAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZl9leHBbbmV4dF9mcmFtZV0pOworCisgICAgLyogRkROUyBkZWNvZGluZyAqLworICAgIENMcGRfRmRuc0RlY29kZSgKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mbywgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICAgICAgU1BFQ19UQ1gocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQsIGZyYW1lLAorICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoLCBpc0Z1bGxCYW5kTHBkKSwKKyAgICAgICAgbGcsIGZyYW1lLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGUgKyBmcmFtZSwKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmW2ZyYW1lXSwKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmX2V4cFtmcmFtZV0sCisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZltuZXh0X2ZyYW1lXSwKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmX2V4cFtuZXh0X2ZyYW1lXSwgcEFsZmRfZ2FpbnMsCisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGggLyAyIC8qID09IEZETlNfTlBUUyhjY2ZsKSAqLworICAgICk7CisgIH0KK30KKworLyoqCisgKiBcYnJpZWYgUmVhZCB0aGUgdGN4X2NvZGluZyBiaXRzdHJlYW0gcGFydAorICogXHBhcmFtIGhCcyBiaXRzdHJlYW0gaGFuZGxlIHRvIHJlYWQgZnJvbS4KKyAqIFxwYXJhbSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvIGNoYW5uZWwgY29udGV4dCBpbmZvIHRvIHN0b3JlIGRhdGEgaW50by4KKyAqIFxwYXJhbSBsZyB0aGUgZnJhbWUgbGVuZ3RoIGluIGF1ZGlvIHNhbXBsZXMuCisgKiBccGFyYW0gZmlyc3RfdGN4X2ZsYWcgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhpcyBpcyB0aGUgZmlyc3QgVENYIGZyYW1lLgorICogXHBhcmFtIGZyYW1lIHRoZSBmcmFtZSBpbmRleCBvZiB0aGUgTFBEIHN1cGVyIGZyYW1lLgorICovCitzdGF0aWMgQUFDX0RFQ09ERVJfRVJST1IgQ0xwZF9UQ1hfUmVhZCgKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywgaW50IGxnLAorICAgIGludCBmaXJzdF90Y3hfZmxhZywgaW50IGZyYW1lLCBVSU5UIGZsYWdzKSB7CisgIEFBQ19ERUNPREVSX0VSUk9SIGVycm9yQUFDID0gQUFDX0RFQ19PSzsKKyAgQVJJVEhfQ09ESU5HX0VSUk9SIGVycm9yID0gQVJJVEhfQ09ERVJfT0s7CisgIEZJWFBfREJMICpwU3BlYzsKKyAgaW50IGFyaXRoX3Jlc2V0X2ZsYWcgPSAwOworICBpbnQgaXNGdWxsQmFuZExwZCA9IDA7CisKKyAgcFNwZWMgPSBTUEVDX1RDWChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wU3BlY3RyYWxDb2VmZmljaWVudCwgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCwgaXNGdWxsQmFuZExwZCk7CisKKyAgLyogVENYIG5vaXNlIGxldmVsICovCisgIHsKKyAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+c3BlY2lmaWNUby51c2FjLnRjeF9ub2lzZV9mYWN0b3JbZnJhbWVdID0KKyAgICAgICAgRkRLcmVhZEJpdHMoaEJzLCAzKTsKKyAgfQorICAvKiBUQ1ggZ2xvYmFsIGdhaW4gKi8KKyAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPnNwZWNpZmljVG8udXNhYy50Y3hfZ2xvYmFsX2dhaW5bZnJhbWVdID0KKyAgICAgIEZES3JlYWRCaXRzKGhCcywgNyk7CisKKyAgLyogQXJpdGhtZXRpYyBjb2RlZCByZXNpZHVhbC9zcGVjdHJ1bSAqLworICBpZiAoZmlyc3RfdGN4X2ZsYWcpIHsKKyAgICBpZiAoZmxhZ3MgJiBBQ19JTkRFUCkgeworICAgICAgYXJpdGhfcmVzZXRfZmxhZyA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGFyaXRoX3Jlc2V0X2ZsYWcgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIH0KKyAgfQorCisgIC8qIENBcmNvX0RlY29kZUFyaXRoRGF0YSgpIG91dHB1dCBzY2FsZSBvZiAicFNwZWMiIGlzIERGUkFDVF9CSVRTLTEgKi8KKyAgZXJyb3IgPSBDQXJjb19EZWNvZGVBcml0aERhdGEocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+aEFyQ28sIGhCcywgcFNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxnLCBsZywgYXJpdGhfcmVzZXRfZmxhZyk7CisKKyAgLyogUmVzY2FsZSByZXNpZHVhbC9zcGVjdHJ1bSAqLworICB7CisgICAgaW50IHNjYWxlID0gZ2V0U2NhbGVmYWN0b3IocFNwZWMsIGxnKSAtIDI7IC8qIExlYXZlIDIgYml0cyBoZWFkcm9vbSAqLworCisgICAgLyogRXhwb25lbnQgb2YgQ0FyY29fRGVjb2RlQXJpdGhEYXRhKCkgb3V0cHV0IGlzIERGUkFDVF9CSVRTOyBpbnRlZ2VyCisgICAgICogdmFsdWVzLiAqLworICAgIHNjYWxlVmFsdWVzKHBTcGVjLCBsZywgc2NhbGUpOworICAgIHNjYWxlID0gREZSQUNUX0JJVFMgLSAxIC0gc2NhbGU7CisKKyAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5zcGVjU2NhbGVbZnJhbWVdID0gc2NhbGU7CisgIH0KKworICBpZiAoZXJyb3IgPT0gQVJJVEhfQ09ERVJfRVJST1IpIGVycm9yQUFDID0gQUFDX0RFQ19VTktOT1dOOworCisgIHJldHVybiBlcnJvckFBQzsKK30KKworLyoqCisgKiBcYnJpZWYgdHJhbnNsYXRlIGxwZF9tb2RlIGludG8gdGhlIG1vZFtdIGFycmF5IHdoaWNoIGRlc2NyaWJlcyB0aGUgbW9kZSBvZgorICogZWFjaCBlYWNoIExQRCBmcmFtZQorICogXHBhcmFtIG1vZFtdIHRoZSBhcnJheSB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIG1vZGUgaW5kZXhlcyBvZiB0aGUKKyAqIGluaWRpdmlkdWFsIGZyYW1lcy4KKyAqIFxwYXJhbSBscGRfbW9kZSB0aGUgbHBkX21vZGUgZmllbGQgcmVhZCBmcm9tIHRoZSBscGRfY2hhbm5lbF9zdHJlYW0KKyAqLworc3RhdGljIEFBQ19ERUNPREVSX0VSUk9SIENMcGRfUmVhZEFuZE1hcExwZE1vZGVUb01vZEFycmF5KAorICAgIFVDSEFSIG1vZFs0XSwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBVSU5UIGVsRmxhZ3MpIHsKKyAgaW50IGxwZF9tb2RlOworCisgIHsKKyAgICBscGRfbW9kZSA9IEZES3JlYWRCaXRzKGhCcywgNSk7CisKKyAgICBpZiAobHBkX21vZGUgPiAyNSB8fCBscGRfbW9kZSA8IDApIHsKKyAgICAgIHJldHVybiBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgIH0KKworICAgIHN3aXRjaCAobHBkX21vZGUpIHsKKyAgICAgIGNhc2UgMjU6CisgICAgICAgIC8qIDEgODBNUyBmcmFtZSAqLworICAgICAgICBtb2RbMF0gPSBtb2RbMV0gPSBtb2RbMl0gPSBtb2RbM10gPSAzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjQ6CisgICAgICAgIC8qIDIgNDBNUyBmcmFtZXMgKi8KKyAgICAgICAgbW9kWzBdID0gbW9kWzFdID0gbW9kWzJdID0gbW9kWzNdID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBzd2l0Y2ggKGxwZF9tb2RlID4+IDIpIHsKKyAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAvKiBscGRfbW9kZSAxOSAtIDE2ICA9PiAxIDQwTVMgYW5kIDIgMjBNUyBmcmFtZXMgKi8KKyAgICAgICAgICAgIG1vZFswXSA9IG1vZFsxXSA9IDI7CisgICAgICAgICAgICBtb2RbMl0gPSAobHBkX21vZGUgJiAxKSA/IDEgOiAwOworICAgICAgICAgICAgbW9kWzNdID0gKGxwZF9tb2RlICYgMikgPyAxIDogMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIC8qIGxwZF9tb2RlIDIzIC0gMjAgPT4gMiAyME1TIGFuZCAxIDQwTVMgZnJhbWVzICovCisgICAgICAgICAgICBtb2RbMl0gPSBtb2RbM10gPSAyOworICAgICAgICAgICAgbW9kWzBdID0gKGxwZF9tb2RlICYgMSkgPyAxIDogMDsKKyAgICAgICAgICAgIG1vZFsxXSA9IChscGRfbW9kZSAmIDIpID8gMSA6IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogbHBkX21vZGUgPCAxNiA9PiA0IDIwTVMgZnJhbWVzICovCisgICAgICAgICAgICBtb2RbMF0gPSAobHBkX21vZGUgJiAxKSA/IDEgOiAwOworICAgICAgICAgICAgbW9kWzFdID0gKGxwZF9tb2RlICYgMikgPyAxIDogMDsKKyAgICAgICAgICAgIG1vZFsyXSA9IChscGRfbW9kZSAmIDQpID8gMSA6IDA7CisgICAgICAgICAgICBtb2RbM10gPSAobHBkX21vZGUgJiA4KSA/IDEgOiAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBBQUNfREVDX09LOworfQorCitzdGF0aWMgdm9pZCBDTHBkX1Jlc2V0KAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICBpbnQga2VlcF9wYXN0X3NpZ25hbCkgeworICBpbnQgaTsKKworICAvKiBSZXNldCBUQ1ggLyBBQ0VMUCBjb21tb24gbWVtb3J5ICovCisgIGlmICgha2VlcF9wYXN0X3NpZ25hbCkgeworICAgIEZES21lbWNsZWFyKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm9sZF9zeW50aCwKKyAgICAgICAgICAgICAgICBzaXplb2YocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+b2xkX3N5bnRoKSk7CisgIH0KKworICAvKiBJbml0aWFsaXplIHRoZSBMU0ZzICovCisgIGZvciAoaSA9IDA7IGkgPCBNX0xQX0ZJTFRFUl9PUkRFUjsgaSsrKSB7CisgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bHBjNF9sc2ZbaV0gPSBmZGtfZGVjX2xzZl9pbml0W2ldOworICB9CisKKyAgLyogUmVzZXQgbWVtb3J5IG5lZWRlZCBieSBiYXNzIHBvc3QtZmlsdGVyICovCisgIEZES21lbWNsZWFyKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm1lbV9icGYsCisgICAgICAgICAgICAgIHNpemVvZihwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5tZW1fYnBmKSk7CisKKyAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+b2xkX2JwZl9jb250cm9sX2luZm8gPSAwOworICBmb3IgKGkgPSAwOyBpIDwgU1lOX1NGRDsgaSsrKSB7CisgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+b2xkX1RfcGZbaV0gPSA2NDsKKyAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5vbGRfZ2Fpbl9wZltpXSA9IChGSVhQX0RCTCkwOworICB9CisKKyAgLyogUmVzZXQgQUNFTFAgbWVtb3J5ICovCisgIENMcGRfQWNlbHBSZXNldCgmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+YWNlbHApOworCisgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfbHBjX2xvc3QgPSAwOyAgICAgIC8qIHByZXZfbHBjX2xvc3QgKi8KKyAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF90Y3hfcGl0Y2ggPSBMX0RJVjsgLyogcGl0Y2hfdGN4ICAgICAqLworICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5udW1Mb3N0THBkRnJhbWVzID0gMDsgICAvKiBuYkxvc3RDbXB0ICAgICovCit9CisKKy8qCisgKiBFeHRlcm5hbGx5IHZpc2libGUgZnVuY3Rpb25zCisgKi8KKworQUFDX0RFQ09ERVJfRVJST1IgQ0xwZENoYW5uZWxTdHJlYW1fUmVhZCgKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICBjb25zdCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywgVUlOVCBmbGFncykgeworICBBQUNfREVDT0RFUl9FUlJPUiBlcnJvciA9IEFBQ19ERUNfT0s7CisgIGludCBmaXJzdF90Y3hfZmxhZzsKKyAgaW50IGssIG5iRGl2LCBmRmFjRGF0YVByZXNlbnQsIGZpcnN0X2xwZF9mbGFnLCBhY2VscF9jb3JlX21vZGUsCisgICAgICBmYWNHZXRNZW1TdGF0ZSA9IDA7CisgIFVDSEFSICptb2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubW9kOworICBpbnQgbHBkX21vZGVfbGFzdCwgcHJldl9mcmFtZV93YXNfbHBkOworICBVU0FDX0NPUkVNT0RFIGNvcmVfbW9kZV9sYXN0OworICBjb25zdCBpbnQgbGdfdGFibGVfb2Zmc2V0ID0gMDsKKyAgY29uc3QgaW50ICpsZ190YWJsZSA9IChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoID09IDEyOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICZsZ190YWJsZV9jY2ZsWzBdW2xnX3RhYmxlX29mZnNldF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICZsZ190YWJsZV9jY2ZsWzFdW2xnX3RhYmxlX29mZnNldF07CisgIGludCBsYXN0X2xwY19sb3N0ID0gcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9scGNfbG9zdDsKKworICBpbnQgbGFzdF9mcmFtZV9vayA9IENDb25jZWFsbWVudF9HZXRMYXN0RnJhbWVPaygKKyAgICAgICZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8sIDEpOworCisgIElOVCBpX29mZnNldDsKKyAgVUlOVCBzYW1wbGluZ1JhdGU7CisKKyAgc2FtcGxpbmdSYXRlID0gcFNhbXBsaW5nUmF0ZUluZm8tPnNhbXBsaW5nUmF0ZTsKKworICBpX29mZnNldCA9CisgICAgICAoSU5UKShzYW1wbGluZ1JhdGUgKiBQSVRfTUlOXzEyazggKyAoRlNDQUxFX0RFTk9NIC8gMikpIC8gRlNDQUxFX0RFTk9NIC0KKyAgICAgIChJTlQpUElUX01JTl8xMms4OworCisgIGlmIChwU2FtcGxpbmdSYXRlSW5mby0+c2FtcGxpbmdSYXRlID4KKyAgICAgIEZBQ19GU0NBTEVfTUFYIC8qIG1heGltdW0gYWxsb3dlZCBjb3JlIHNhbXBsaW5nIGZyZXF1ZW5jeSAqLykgeworICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICBhY2VscF9jb3JlX21vZGUgPSBGREtyZWFkQml0cyhoQnMsIDMpOworCisgIC8qIGxwZF9tb2RlICovCisgIGVycm9yID0gQ0xwZF9SZWFkQW5kTWFwTHBkTW9kZVRvTW9kQXJyYXkobW9kLCBoQnMsIDApOworICBpZiAoZXJyb3IgIT0gQUFDX0RFQ19PSykgeworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIGJwZl9jb250cm9sX2luZm8gKi8KKyAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmJwZl9jb250cm9sX2luZm8gPSBGREtyZWFkQml0KGhCcyk7CisKKyAgLyogbGFzdF9jb3JlX21vZGUgKi8KKyAgcHJldl9mcmFtZV93YXNfbHBkID0gRkRLcmVhZEJpdChoQnMpOworICAvKiBmYWNfZGF0YV9wcmVzZW50ICovCisgIGZGYWNEYXRhUHJlc2VudCA9IEZES3JlYWRCaXQoaEJzKTsKKworICAvKiBTZXQgdmFsaWQgdmFsdWVzIGZyb20KKyAgICogcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+e2xhc3RfY29yZV9tb2RlLGxhc3RfbHBkX21vZGV9ICovCisgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5jb3JlX21vZGVfbGFzdCA9CisgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2NvcmVfbW9kZTsKKyAgbHBkX21vZGVfbGFzdCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scGRfbW9kZV9sYXN0ID0KKyAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfbHBkX21vZGU7CisKKyAgaWYgKHByZXZfZnJhbWVfd2FzX2xwZCA9PSAwKSB7CisgICAgLyogTGFzdCBmcmFtZSB3YXMgRkQgKi8KKyAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuY29yZV9tb2RlX2xhc3QgPSBGRF9MT05HOworICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scGRfbW9kZV9sYXN0ID0gMjU1OworICB9IGVsc2UgeworICAgIC8qIExhc3QgZnJhbWUgd2FzIExQRCAqLworICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5jb3JlX21vZGVfbGFzdCA9IExQRDsKKyAgICBpZiAoKChtb2RbMF0gPT0gMCkgJiYgZkZhY0RhdGFQcmVzZW50KSB8fAorICAgICAgICAoKG1vZFswXSAhPSAwKSAmJiAhZkZhY0RhdGFQcmVzZW50KSkgeworICAgICAgLyogQ3VycmVuZCBtb2QgaXMgQUNFTFAsIGZhYyBkYXRhIHByZXNlbnQgLT4gVENYLCBjdXJyZW50IG1vZCBUQ1gsIG5vIGZhYworICAgICAgICogZGF0YSAtPiBUQ1ggKi8KKyAgICAgIGlmIChscGRfbW9kZV9sYXN0ID09IDApIHsKKyAgICAgICAgLyogQml0IHN0cmVhbSBpbnRlcnJ1cHRpb24gZGV0ZWN0ZWQuIEFzc3VtZSBsYXN0IFRDWCBtb2RlIGFzIFRDWDIwLiAqLworICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBkX21vZGVfbGFzdCA9IDE7CisgICAgICB9CisgICAgICAvKiBFbHNlIGFzc3VtZSB0aGF0IHJlbWVtYmVyZWQgVENYIG1vZGUgaXMgY29ycmVjdC4gKi8KKyAgICB9IGVsc2UgeworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwZF9tb2RlX2xhc3QgPSAwOworICAgIH0KKyAgfQorCisgIGZpcnN0X2xwZF9mbGFnID0gKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5jb3JlX21vZGVfbGFzdCAhPQorICAgICAgICAgICAgICAgICAgICBMUEQpOyAvKiBEZXBlbmRzIG9uIGJpdHN0cmVhbSBjb25maWd1cmF0aW9uICovCisgIGZpcnN0X3RjeF9mbGFnID0gMTsKKworICBpZiAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9jb3JlX21vZGUgIT0KKyAgICAgIExQRCkgeyAvKiBBVFRFTlRJT046IFJlc2V0IGRlcGVuZHMgb24gd2hhdCB3ZSByZW5kZXJlZCBiZWZvcmUhICovCisgICAgQ0xwZF9SZXNldChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLCAwKTsKKworICAgIGlmICghbGFzdF9mcmFtZV9vaykgeworICAgICAgLyogSWYgbGFzdCByZW5kZXJlZCBmcmFtZSB3YXMgbm90IExQRCBhbmQgZmlyc3QgbHBkIGZsYWcgaXMgbm90IHNldCwgdGhpcworICAgICAgICogbXVzdCBiZSBhbiBlcnJvciAtIHNldCBsYXN0X2xwY19sb3N0IGZsYWcgKi8KKyAgICAgIGxhc3RfbHBjX2xvc3QgfD0gKGZpcnN0X2xwZF9mbGFnKSA/IDAgOiAxOworICAgIH0KKyAgfQorCisgIGNvcmVfbW9kZV9sYXN0ID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmNvcmVfbW9kZV9sYXN0OworICBscGRfbW9kZV9sYXN0ID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwZF9tb2RlX2xhc3Q7CisKKyAgbmJEaXYgPSBOQl9ESVY7CisKKyAgLyogayBpcyB0aGUgZnJhbWUgaW5kZXguIElmIGEgZnJhbWUgaXMgb2Ygc2l6ZSA0ME1TIG9yIDgwTVMsCisgICAgIHRoaXMgZnJhbWUgaW5kZXggaXMgaW5jcmVtZW50ZWQgMiBvciA0IGluc3RlYWQgb2YgMSByZXNwZWN0aXZlbHkuICovCisKKyAgayA9IDA7CisgIHdoaWxlIChrIDwgbmJEaXYpIHsKKyAgICAvKiBSZXNldCBGQUMgZGF0YSBwb2ludGVycyBpbiBvcmRlciB0byBhdm9pZCBhcHBseWluZyBvbGQgcmFuZG9tIEZBQyBkYXRhLgorICAgICAqLworICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YVtrXSA9IE5VTEw7CisKKyAgICBpZiAoKGsgPT0gMCAmJiBjb3JlX21vZGVfbGFzdCA9PSBMUEQgJiYgZkZhY0RhdGFQcmVzZW50KSB8fAorICAgICAgICAobHBkX21vZGVfbGFzdCA9PSAwICYmIG1vZFtrXSA+IDApIHx8CisgICAgICAgICgobHBkX21vZGVfbGFzdCAhPSAyNTUpICYmIGxwZF9tb2RlX2xhc3QgPiAwICYmIG1vZFtrXSA9PSAwKSkgeworICAgICAgaW50IGVycjsKKworICAgICAgLyogQXNzaWduIEZBQyBtZW1vcnkgKi8KKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YVtrXSA9CisgICAgICAgICAgQ0xwZF9GQUNfR2V0TWVtb3J5KHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sIG1vZCwgJmZhY0dldE1lbVN0YXRlKTsKKworICAgICAgLyogRkFDIGZvciAoQUNFTFAgLT4gVENYKSBvciAoVENYIC0+IEFDRUxQKSAqLworICAgICAgZXJyID0gQ0xwZF9GQUNfUmVhZCgKKyAgICAgICAgICBoQnMsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YVtrXSwKKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuZmFjX2RhdGFfZSwKKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoLCAvKiA9PSBmYWNfbGVuZ3RoICovCisgICAgICAgICAgMCwgayk7CisgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG1vZFtrXSA9PSAwKSAvKiBhY2VscC1tb2RlICovCisgICAgeworICAgICAgaW50IGVycjsKKyAgICAgIGVyciA9IENMcGRfQWNlbHBSZWFkKAorICAgICAgICAgIGhCcywgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5hY2VscFtrXSwgYWNlbHBfY29yZV9tb2RlLAorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGggKiA4IC8qIGNvcmVDb2RlckZyYW1lTGVuZ3RoICovLAorICAgICAgICAgIGlfb2Zmc2V0KTsKKyAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICBlcnJvciA9IEFBQ19ERUNfUEFSU0VfRVJST1I7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKworICAgICAgbHBkX21vZGVfbGFzdCA9IDA7CisgICAgICBrKys7CisgICAgfSBlbHNlIC8qIG1vZGUgIT0gMCAgPT4gIFRDWCAqLworICAgIHsKKyAgICAgIGVycm9yID0gQ0xwZF9UQ1hfUmVhZChoQnMsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywgbGdfdGFibGVbbW9kW2tdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF90Y3hfZmxhZywgaywgZmxhZ3MpOworCisgICAgICBscGRfbW9kZV9sYXN0ID0gbW9kW2tdOworICAgICAgZmlyc3RfdGN4X2ZsYWcgPSAwOworICAgICAgayArPSAxIDw8IChtb2Rba10gLSAxKTsKKyAgICB9CisgICAgaWYgKGVycm9yICE9IEFBQ19ERUNfT0spIHsKKyAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgIH0KKworICB7CisgICAgaW50IGVycjsKKworICAgIC8qIFJlYWQgTFBDIGNvZWZmaWNpZW50cyAqLworICAgIGVyciA9IENMcGNfUmVhZCgKKyAgICAgICAgaEJzLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHNwX2NvZWZmLAorICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5scGM0X2xzZiwKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxzZl9hZGFwdGl2ZV9tZWFuX2NhbmQsCisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5hU3RhYmlsaXR5LCBtb2QsIGZpcnN0X2xwZF9mbGFnLAorICAgICAgICAvKiBpZiBsYXN0IGxwYzQgaXMgYXZhaWxhYmxlIGZyb20gY29uY2VhbG1lbnQgZG8gbm90IGV4dHJhcG9sYXRlIGxwYzAKKyAgICAgICAgICAgZnJvbSBscGMyICovCisgICAgICAgIChtb2RbMF0gJiAweDMpID8gMAorICAgICAgICAgICAgICAgICAgICAgICA6IChsYXN0X2xwY19sb3N0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfY29yZV9tb2RlICE9IExQRCksCisgICAgICAgIGxhc3RfZnJhbWVfb2spOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgZXJyb3IgPSBBQUNfREVDX1BBUlNFX0VSUk9SOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfQorCisgIC8qIGFkanVzdCBvbGQgbHNwW10gZm9sbG93aW5nIHRvIGEgYmFkIGZyYW1lICh0byBhdm9pZCBvdmVyc2hvb3QpIChyZWY6CisgICAqIGRlY19MUEQuYykgKi8KKyAgaWYgKGxhc3RfbHBjX2xvc3QgJiYgIWxhc3RfZnJhbWVfb2spIHsKKyAgICBpbnQga19uZXh0OworICAgIGsgPSAwOworICAgIHdoaWxlIChrIDwgbmJEaXYpIHsKKyAgICAgIGludCBpOworICAgICAga19uZXh0ID0gayArICgoKG1vZFtrXSAmIDB4MykgPT0gMCkgPyAxIDogKDEgPDwgKG1vZFtrXSAtIDEpKSk7CisgICAgICBGSVhQX0xQQyAqbHNwX29sZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5sc3BfY29lZmZba107CisgICAgICBGSVhQX0xQQyAqbHNwX25ldyA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5sc3BfY29lZmZba19uZXh0XTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IE1fTFBfRklMVEVSX09SREVSOyBpKyspIHsKKyAgICAgICAgaWYgKGxzcF9uZXdbaV0gPCBsc3Bfb2xkW2ldKSB7CisgICAgICAgICAgbHNwX29sZFtpXSA9IGxzcF9uZXdbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGsgPSBrX25leHQ7CisgICAgfQorICB9CisKKyAgaWYgKCFDQ29uY2VhbG1lbnRfR2V0TGFzdEZyYW1lT2soCisgICAgICAgICAgJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbywgMSkpIHsKKyAgICBFX0xQQ19mX2xzcF9hX2NvbnZlcnNpb24oCisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5sc3BfY29lZmZbMF0sCisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZlswXSwKKyAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZl9leHBbMF0pOworICB9IGVsc2UgaWYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfbHBkX21vZGUgIT0gMCkgeworICAgIGlmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xwZF9tb2RlID09IDI1NSkgeworICAgICAgLyogV2UgbmVlZCBpdCBmb3IgVENYIGRlY29kaW5nIG9yIEFDRUxQIGV4Y2l0YXRpb24gdXBkYXRlICovCisgICAgICBFX0xQQ19mX2xzcF9hX2NvbnZlcnNpb24oCisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxzcF9jb2VmZlswXSwKKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZbMF0sCisgICAgICAgICAgJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZl9leHBbMF0pOworICAgIH0gZWxzZSB7IC8qIGxhc3RfbHBkX21vZGUgd2FzIFRDWCAqLworICAgICAgLyogQ29weSBvbGQgTFBDNCBMUCBkb21haW4gY29lZmZpY2llbnRzIHRvIExQQzAgTFAgZG9tYWluIGJ1ZmZlciAodG8gYXZvaWQKKyAgICAgICAqIGNvbnZlcnRpbmcgTFNQIGNvZWZmaWNpZW50cyBhZ2FpbikuICovCisgICAgICBGREttZW1jcHkocEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmWzBdLAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxwX2NvZWZmX29sZFswXSwKKyAgICAgICAgICAgICAgICBNX0xQX0ZJTFRFUl9PUkRFUiAqIHNpemVvZihGSVhQX0xQQykpOworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmX2V4cFswXSA9CisgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bHBfY29lZmZfb2xkX2V4cFswXTsKKyAgICB9CisgIH0gLyogY2FzZSBsYXN0X2xwZF9tb2RlIHdhcyBBQ0VMUCBpcyBoYW5kbGVkIGJ5IENMcGRfVGN4RGVjb2RlKCkgKi8KKworICBpZiAoZkZhY0RhdGFQcmVzZW50ICYmIChjb3JlX21vZGVfbGFzdCAhPSBMUEQpKSB7CisgICAgaW50IHByZXZfZnJhbWVfd2FzX3Nob3J0OworCisgICAgcHJldl9mcmFtZV93YXNfc2hvcnQgPSBGREtyZWFkQml0KGhCcyk7CisKKyAgICBpZiAocHJldl9mcmFtZV93YXNfc2hvcnQpIHsKKyAgICAgIGNvcmVfbW9kZV9sYXN0ID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmNvcmVfbW9kZV9sYXN0ID0KKyAgICAgICAgICBGRF9TSE9SVDsKKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scGRfbW9kZV9sYXN0ID0gMjU1OworCisgICAgICBpZiAoKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfY29yZV9tb2RlICE9IEZEX1NIT1JUKSAmJgorICAgICAgICAgIENDb25jZWFsbWVudF9HZXRMYXN0RnJhbWVPaygKKyAgICAgICAgICAgICAgJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbywgMSkpIHsKKyAgICAgICAgLyogVVNBQyBDb25mb3JtYW5jZSBkb2N1bWVudDoKKyAgICAgICAgICAgc2hvcnRfZmFjX2ZsYWcgICBzaGFsbCBiZSBlbmNvZGVkIHdpdGggYSB2YWx1ZSBvZiAxIGlmIHRoZQorICAgICAgICAgICB3aW5kb3dfc2VxdWVuY2Ugb2YgdGhlIHByZXZpb3VzIGZyYW1lIHdhcyAyIChFSUdIVF9TSE9SVF9TRVFVRU5DRSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIHNob3J0X2ZhY19mbGFnIHNoYWxsIGJlIGVuY29kZWQgd2l0aCBhCisgICAgICAgICAgIHZhbHVlIG9mIDAuICovCisgICAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgIH0KKworICAgIC8qIEFzc2lnbiBtZW1vcnkgKi8KKyAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuZmFjX2RhdGFbMF0gPQorICAgICAgICBDTHBkX0ZBQ19HZXRNZW1vcnkocEFhY0RlY29kZXJDaGFubmVsSW5mbywgbW9kLCAmZmFjR2V0TWVtU3RhdGUpOworCisgICAgeworICAgICAgaW50IGVycjsKKworICAgICAgLyogRkFDIGZvciBGRCAtPiBBQ0VMUCAqLworICAgICAgZXJyID0gQ0xwZF9GQUNfUmVhZCgKKyAgICAgICAgICBoQnMsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YVswXSwKKyAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuZmFjX2RhdGFfZSwKKyAgICAgICAgICBDTHBkX0ZBQ19nZXRMZW5ndGgoY29yZV9tb2RlX2xhc3QgIT0gRkRfU0hPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGgpLAorICAgICAgICAgIDEsIDApOworICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgIH0KKyAgfQorCitiYWlsOgorICBpZiAoZXJyb3IgPT0gQUFDX0RFQ19PSykgeworICAgIC8qIGNoZWNrIGNvbnNpdGVuY3kgb2YgbGFzdCBjb3JlL2xwZCBtb2RlIHZhbHVlcyAqLworICAgIGlmICgocEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmNvcmVfbW9kZV9sYXN0ICE9CisgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2NvcmVfbW9kZSkgJiYKKyAgICAgICAgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfbHBjX2xvc3QgPT0gMCkpIHsKKyAgICAgIC8qIFNvbWV0aGluZyBnb3Qgd3JvbmchICovCisgICAgICAvKiBlcnJvciA9IEFBQ19ERUNfUEFSU0VfRVJST1I7ICovIC8qIFRocm93aW5nIGVycm9ycyBkb2VzIG5vdCBoZWxwICovCisgICAgfSBlbHNlIGlmICgocEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmNvcmVfbW9kZV9sYXN0ID09IExQRCkgJiYKKyAgICAgICAgICAgICAgIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBkX21vZGVfbGFzdCAhPQorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfbHBkX21vZGUpICYmCisgICAgICAgICAgICAgICAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9scGNfbG9zdCA9PSAwKSkgeworICAgICAgLyogU29tZXRoaW5nIGdvdCB3cm9uZyEgKi8KKyAgICAgIC8qIGVycm9yID0gQUFDX0RFQ19QQVJTRV9FUlJPUjsgKi8gLyogVGhyb3dpbmcgZXJyb3JzIGRvZXMgbm90IGhlbHAgKi8KKyAgICB9CisgIH0KKworICByZXR1cm4gZXJyb3I7Cit9CisKK3ZvaWQgQ0xwZENoYW5uZWxTdHJlYW1fRGVjb2RlKAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywgVUlOVCBmbGFncykgeworICBVQ0hBUiAqbW9kID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLm1vZDsKKyAgaW50IGs7CisgIFVDSEFSIGxhc3RfbHBkX21vZGU7CisgIGludCBuYkRpdiA9IE5CX0RJVjsKKworICAvKiBrIGlzIHRoZSBmcmFtZSBpbmRleC4gSWYgYSBmcmFtZSBpcyBvZiBzaXplIDQwTVMgb3IgODBNUywKKyAgICAgdGhpcyBmcmFtZSBpbmRleCBpcyBpbmNyZW1lbnRlZCAyIG9yIDQgaW5zdGVhZCBvZiAxIHJlc3BlY3RpdmVseS4gKi8KKyAgayA9IDA7CisgIGxhc3RfbHBkX21vZGUgPQorICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjCisgICAgICAgICAgLmxwZF9tb2RlX2xhc3Q7IC8qIGNvdWxkIGJlIGRpZmZlcmVudCB0byB3aGF0IGhhcyBiZWVuIHJlbmRlcmVkICovCisgIHdoaWxlIChrIDwgbmJEaXYpIHsKKyAgICBpZiAobW9kW2tdID09IDApIHsKKyAgICAgIC8qIEFDRUxQICovCisKKyAgICAgIC8qIElmIEZBQyAoZmFjX2RhdGFba10gIT0gTlVMTCksIGFuZCBwcmV2aW91cyBmcmFtZSB3YXMgVENYLCBhcHBseSAoVENYKQorICAgICAgICogZ2FpbnMgdG8gRkFDIGRhdGEgKi8KKyAgICAgIGlmIChsYXN0X2xwZF9tb2RlID4gMCAmJiBsYXN0X2xwZF9tb2RlICE9IDI1NSAmJgorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YVtrXSkgeworICAgICAgICBDRmFjX0FwcGx5R2FpbnMocEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmZhY19kYXRhW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+Z3JhbnVsZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfdGN4X2dhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2FsZmRfZ2FpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAobGFzdF9scGRfbW9kZSA8IDQpID8gbGFzdF9scGRfbW9kZSA6IDMpOworCisgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YV9lW2tdICs9CisgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X3RjeF9nYWluX2U7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFRDWCAqLworICAgICAgQ0xwZF9UY3hEZWNvZGUocEFhY0RlY29kZXJDaGFubmVsSW5mbywgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBtb2Rba10sIGxhc3RfbHBkX21vZGUsIGssIDEgLyogZnJhbWVPayA9PSAxICovCisgICAgICApOworCisgICAgICAvKiBTdG9yZSBUQ1ggZ2FpbiBzY2FsZSBmb3IgbmV4dCBwb3NzaWJsZSBGQUMgdHJhbnNpdGlvbi4gKi8KKyAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfdGN4X2dhaW4gPQorICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy50Y3hfZ2FpbltrXTsKKyAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfdGN4X2dhaW5fZSA9CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLnRjeF9nYWluX2Vba107CisKKyAgICAgIC8qIElmIEZBQyAoZmFjX2RhdGFba10gIT0gTlVMTCksIGFwcGx5IGdhaW5zICovCisgICAgICBpZiAobGFzdF9scGRfbW9kZSA9PSAwICYmIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YVtrXSkgeworICAgICAgICBDRmFjX0FwcGx5R2FpbnMoCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuZmFjX2RhdGFba10sCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoIC8qID09IGZhY19sZW5ndGggKi8sCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMudGN4X2dhaW5ba10sCisgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2FsZmRfZ2FpbnMsIG1vZFtrXSk7CisKKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmZhY19kYXRhX2Vba10gKz0KKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy50Y3hfZ2Fpbl9lW2tdOworICAgICAgfQorICAgIH0KKworICAgIC8qIHJlbWVtYmVyIHByZXZpb3VzIG1vZGUgKi8KKyAgICBsYXN0X2xwZF9tb2RlID0gbW9kW2tdOworCisgICAgLyogSW5jcmVhc2UgayB0byBuZXh0IGZyYW1lICovCisgICAgayArPSAobW9kW2tdID09IDApID8gMSA6ICgxIDw8IChtb2Rba10gLSAxKSk7CisgIH0KK30KKworQUFDX0RFQ09ERVJfRVJST1IgQ0xwZF9SZW5kZXJUaW1lU2lnbmFsKAorICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8sCisgICAgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywgRklYUF9QQ00gKnBUaW1lRGF0YSwKKyAgICBJTlQgbEZyYW1lLCBTYW1wbGluZ1JhdGVJbmZvICpwU2FtcGxpbmdSYXRlSW5mbywgVUlOVCBmcmFtZU9rLCBVSU5UIGZsYWdzLAorICAgIFVJTlQgc3RybUZsYWdzKSB7CisgIFVDSEFSICptb2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubW9kOworICBBQUNfREVDT0RFUl9FUlJPUiBlcnJvciA9IEFBQ19ERUNfT0s7CisgIGludCBrLCBpX29mZnNldDsKKyAgaW50IGxhc3RfazsKKyAgaW50IG5yU2FtcGxlcyA9IDA7CisgIGludCBmYWNGQiA9IDE7CisgIGludCBuYkRpdiA9IE5CX0RJVjsKKyAgaW50IGxEaXYgPSBsRnJhbWUgLyBuYkRpdjsgLyogbGVuZ3RoIG9mIGRpdmlzaW9uIChhY2VscCBvciB0Y3gyMCBmcmFtZSkqLworICBpbnQgbEZhYyA9IGxEaXYgLyAyOworICBpbnQgbmJTdWJmciA9CisgICAgICBsRnJhbWUgLyAobmJEaXYgKiBMX1NVQkZSKTsgLyogbnVtYmVyIG9mIHN1YmZyYW1lcyBwZXIgZGl2aXNpb24gKi8KKyAgaW50IG5iU3ViZnJTdXBlcmZyID0gbmJEaXYgKiBuYlN1YmZyOworICBpbnQgc3luU2ZkID0gKG5iU3ViZnJTdXBlcmZyIC8gMikgLSBCUEZfU0ZEOworICBpbnQgU3luRGVsYXkgPSBzeW5TZmQgKiBMX1NVQkZSOworICBpbnQgYWFjRGVsYXkgPSBsRnJhbWUgLyAyOworCisgIC8qCisgICBJbiByZXNwZWN0IHRvIHRoZSByZWZlcmVuY2Ugc29mdHdhcmUsIHRoZSBzeW50aCBwb2ludGVyIGhlcmUgaXMgbGFnZ2luZyBieQorICAgYWFjRGVsYXkgKCA9PSBTWU5fREVMQVkgKyBCUEZfREVMQVkgKSBzYW1wbGVzLiBUaGUgY29ycmVzcG9uZGluZyBvbGQKKyAgIHN5bnRoZXNpcyBzYW1wbGVzIGFyZSBoYW5kbGVkIGJ5IHRoZSBJTURDVCBvdmVybGFwLgorICAgKi8KKworICBGSVhQX0RCTCAqc3ludGhfYnVmID0KKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21TdGF0aWNEYXRhLT5wV29ya0J1ZmZlckNvcmUxLT5zeW50aF9idWY7CisgIEZJWFBfREJMICpzeW50aCA9IHN5bnRoX2J1ZiArIFBJVF9NQVhfTUFYIC0gQlBGX0RFTEFZOworICBVQ0hBUiBsYXN0X2xwZF9tb2RlLCBsYXN0X2xhc3RfbHBkX21vZGUsIGxhc3RfbHBjX2xvc3QsIGxhc3RfZnJhbWVfbG9zdDsKKworICBJTlQgcGl0Y2hbTkJfU1VCRlJfU1VQRVJGUiArIFNZTl9TRkRdOworICBGSVhQX0RCTCBwaXRfZ2FpbltOQl9TVUJGUl9TVVBFUkZSICsgU1lOX1NGRF07CisKKyAgY29uc3QgaW50ICpsZ190YWJsZTsKKyAgaW50IGxnX3RhYmxlX29mZnNldCA9IDA7CisKKyAgVUlOVCBzYW1wbGluZ1JhdGUgPSBwU2FtcGxpbmdSYXRlSW5mby0+c2FtcGxpbmdSYXRlOworCisgIEZES21lbWNsZWFyKHBpdGNoLCAoTkJfU1VCRlJfU1VQRVJGUiArIFNZTl9TRkQpICogc2l6ZW9mKElOVCkpOworCisgIGlmIChmbGFncyAmIEFBQ0RFQ19GTFVTSCkgeworICAgIENMcGRfUmVzZXQocEFhY0RlY29kZXJDaGFubmVsSW5mbywgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICAgICAgICAgICAgIGZsYWdzICYgQUFDREVDX0ZMVVNIKTsKKyAgICBmcmFtZU9rID0gMDsKKyAgfQorCisgIHN3aXRjaCAobEZyYW1lKSB7CisgICAgY2FzZSAxMDI0OgorICAgICAgbGdfdGFibGUgPSAmbGdfdGFibGVfY2NmbFswXVtsZ190YWJsZV9vZmZzZXRdOworICAgICAgYnJlYWs7CisgICAgY2FzZSA3Njg6CisgICAgICBsZ190YWJsZSA9ICZsZ190YWJsZV9jY2ZsWzFdW2xnX3RhYmxlX29mZnNldF07CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiBBQUNfREVDX1VOS05PV047CisgIH0KKworICBsYXN0X2ZyYW1lX2xvc3QgPSAhQ0NvbmNlYWxtZW50X0dldExhc3RGcmFtZU9rKAorICAgICAgJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mbywgMCk7CisKKyAgLyogTWFpbnRhaW4gTFBEIG1vZGUgZnJvbSBwcmV2aW91cyBmcmFtZSAqLworICBpZiAoKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfY29yZV9tb2RlID09IEZEX0xPTkcpIHx8CisgICAgICAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9jb3JlX21vZGUgPT0gRkRfU0hPUlQpKSB7CisgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9scGRfbW9kZSA9IDI1NTsKKyAgfQorCisgIGlmICghZnJhbWVPaykgeworICAgIEZJWFBfREJMIG9sZF90Y3hfZ2FpbjsKKyAgICBGSVhQX1NHTCBvbGRfc3RhYjsKKyAgICBTQ0hBUiBvbGRfdGN4X2dhaW5fZTsKKyAgICBpbnQgbkxvc3RTZjsKKworICAgIGxhc3RfbHBkX21vZGUgPSBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xwZF9tb2RlOworICAgIG9sZF90Y3hfZ2FpbiA9IHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfdGN4X2dhaW47CisgICAgb2xkX3RjeF9nYWluX2UgPSBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X3RjeF9nYWluX2U7CisgICAgb2xkX3N0YWIgPSBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5vbGRTdGFiaWxpdHk7CisgICAgbkxvc3RTZiA9IHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm51bUxvc3RMcGRGcmFtZXM7CisKKyAgICAvKiBwYXRjaCB0aGUgbGFzdCBMUEQgbW9kZSAqLworICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scGRfbW9kZV9sYXN0ID0gbGFzdF9scGRfbW9kZTsKKworICAgIC8qIERvIG1vZGUgZXh0cmFwb2xhdGlvbiBhbmQgcmVwZWF0IHRoZSBwcmV2aW91cyBtb2RlOgorICAgICAgIGlmIHByZXZpb3VzIG1vZGUgPSBBQ0VMUCAgICAgICAgLT4gQUNFTFAKKyAgICAgICBpZiBwcmV2aW91cyBtb2RlID0gVENYLTIwLzQwICAgIC0+IFRDWC0yMAorICAgICAgIGlmIHByZXZpb3VzIG1vZGUgPSBUQ1gtODAgICAgICAgLT4gVENYLTgwCisgICAgICAgbm90ZXM6CisgICAgICAgLSBBQ0VMUCBpcyBub3QgYWxsb3dlZCBhZnRlciBUQ1ggKG5vIHBpdGNoIGluZm9ybWF0aW9uIHRvIHJldXNlKQorICAgICAgIC0gVENYLTQwIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBtb2RlIHJlcGV0aXRpb24gdG8ga2VlcCB0aGUgbG9naWMgc2ltcGxlCisgICAgICovCisgICAgc3dpdGNoIChsYXN0X2xwZF9tb2RlKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIG1vZFswXSA9IG1vZFsxXSA9IG1vZFsyXSA9IG1vZFszXSA9IDA7IC8qIC0+IEFDRUxQIGNvbmNlYWxtZW50ICovCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOgorICAgICAgICBtb2RbMF0gPSBtb2RbMV0gPSBtb2RbMl0gPSBtb2RbM10gPSAzOyAvKiAtPiBUQ1ggRkQgY29uY2VhbG1lbnQgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIG1vZFswXSA9IG1vZFsxXSA9IG1vZFsyXSA9IG1vZFszXSA9IDI7IC8qIC0+IFRDWCBGRCBjb25jZWFsbWVudCAqLworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIG1vZFswXSA9IG1vZFsxXSA9IG1vZFsyXSA9IG1vZFszXSA9IDQ7IC8qIC0+IFRDWCBURCBjb25jZWFsbWVudCAqLworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBMUEMgZXh0cmFwb2xhdGlvbiAqLworICAgIENMcGNfQ29uY2VhbChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHNwX2NvZWZmLAorICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5scGM0X2xzZiwKKyAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bHNmX2FkYXB0aXZlX21lYW4sCisgICAgICAgICAgICAgICAgIC8qKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm51bUxvc3RMcGRGcmFtZXMgPT0gMCkgfHwqLworICAgICAgICAgICAgICAgICAobGFzdF9scGRfbW9kZSA9PSAyNTUpKTsKKworICAgIGlmICgobGFzdF9scGRfbW9kZSA+IDApICYmIChsYXN0X2xwZF9tb2RlIDwgMjU1KSkgeworICAgICAgLyogQ29weSBvbGQgTFBDNCBMUCBkb21haW4gY29lZmZpY2llbnRzIHRvIExQQzAgTFAgZG9tYWluIGJ1ZmZlciAodG8gYXZvaWQKKyAgICAgICAqIGNvbnZlcnRpbmcgTFNQIGNvZWZmaWNpZW50cyBhZ2FpbikuICovCisgICAgICBGREttZW1jcHkocEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmWzBdLAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxwX2NvZWZmX29sZFswXSwKKyAgICAgICAgICAgICAgICBNX0xQX0ZJTFRFUl9PUkRFUiAqIHNpemVvZihGSVhQX0xQQykpOworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmX2V4cFswXSA9CisgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bHBfY29lZmZfb2xkX2V4cFswXTsKKyAgICB9IC8qIGNhc2UgbGFzdF9scGRfbW9kZSB3YXMgQUNFTFAgaXMgaGFuZGxlZCBieSBDTHBkX1RjeERlY29kZSgpICovCisgICAgLyogY2FzZSBsYXN0X2xwZF9tb2RlIHdhcyBUaW1lIGRvbWFpbiBUQ1ggY29uY2VhbG1lbnQgaXMgaGFuZGxlZCBhZnRlciB0aGlzCisgICAgICogImlmICghZnJhbWVPaykiLWJsb2NrICovCisKKyAgICAvKiBrIGlzIHRoZSBmcmFtZSBpbmRleC4gSWYgYSBmcmFtZSBpcyBvZiBzaXplIDQwTVMgb3IgODBNUywKKyAgICAgICB0aGlzIGZyYW1lIGluZGV4IGlzIGluY3JlbWVudGVkIDIgb3IgNCBpbnN0ZWFkIG9mIDEgcmVzcGVjdGl2ZWx5LiAqLworICAgIGsgPSAwOworICAgIHdoaWxlIChrIDwgbmJEaXYpIHsKKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy50Y3hfZ2FpbltrXSA9IG9sZF90Y3hfZ2FpbjsKKyAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy50Y3hfZ2Fpbl9lW2tdID0gb2xkX3RjeF9nYWluX2U7CisKKyAgICAgIC8qIHJlc3RvcmUgc3RhYmlsaXR5IHZhbHVlIGZyb20gbGFzdCBmcmFtZSAqLworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmFTdGFiaWxpdHlba10gPSBvbGRfc3RhYjsKKworICAgICAgLyogSW5jcmVhc2UgayB0byBuZXh0IGZyYW1lICovCisgICAgICBrICs9ICgobW9kW2tdICYgMHgzKSA9PSAwKSA/IDEgOiAoMSA8PCAoKG1vZFtrXSAmIDB4MykgLSAxKSk7CisKKyAgICAgIG5Mb3N0U2YrKzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xwZF9tb2RlID09IDQpICYmIChtb2RbMF0gPiAwKSkgeworICAgICAgLyogQ29weSBvbGQgTFBDNCBMUCBkb21haW4gY29lZmZpY2llbnRzIHRvIExQQzAgTFAgZG9tYWluIGJ1ZmZlciAodG8gYXZvaWQKKyAgICAgICAqIGNvbnZlcnRpbmcgTFNQIGNvZWZmaWNpZW50cyBhZ2FpbikuICovCisgICAgICBGREttZW1jcHkocEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmWzBdLAorICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxwX2NvZWZmX29sZFswXSwKKyAgICAgICAgICAgICAgICBNX0xQX0ZJTFRFUl9PUkRFUiAqIHNpemVvZihGSVhQX0xQQykpOworICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmX2V4cFswXSA9CisgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bHBfY29lZmZfb2xkX2V4cFswXTsKKyAgICB9CisgIH0KKworICBBY2VscF9QcmVQcm9jZXNzaW5nKHN5bnRoX2J1ZiwgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+b2xkX3N5bnRoLCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5vbGRfVF9wZiwgcGl0X2dhaW4sCisgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+b2xkX2dhaW5fcGYsIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAmaV9vZmZzZXQsIGxGcmFtZSwgc3luU2ZkLCBuYlN1YmZyU3VwZXJmcik7CisKKyAgLyogayBpcyB0aGUgZnJhbWUgaW5kZXguIElmIGEgZnJhbWUgaXMgb2Ygc2l6ZSA0ME1TIG9yIDgwTVMsCisgICAgIHRoaXMgZnJhbWUgaW5kZXggaXMgaW5jcmVtZW50ZWQgMiBvciA0IGluc3RlYWQgb2YgMSByZXNwZWN0aXZlbHkuICovCisgIGsgPSAwOworICBsYXN0X2sgPSAtMTsgLyogbWFyayBpbnZhbGlkICovCisgIGxhc3RfbHBkX21vZGUgPSBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xwZF9tb2RlOworICBsYXN0X2xhc3RfbHBkX21vZGUgPSBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xhc3RfbHBkX21vZGU7CisgIGxhc3RfbHBjX2xvc3QgPSBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xwY19sb3N0IHwgbGFzdF9mcmFtZV9sb3N0OworCisgIC8qIFRoaXMgYnVmZmVyIG11c3QgYmUgYXZhbGFibGUgZm9yIHRoZSBjYXNlIG9mIEZELT5BQ0VMUCB0cmFuc2l0aW9uLiBUaGUKKyAgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgaXMgdXNlZCBhZnRlciB0aGUgQlBGIHRvIG92ZXJ3cml0ZSB0aGUgb3V0cHV0IHNpZ25hbC4KKyAgT25seSB0aGUgRkFDIGFyZWEgbXVzdCBiZSBhZmZlY3RlZCBieSB0aGUgQlBGICovCisKKyAgd2hpbGUgKGsgPCBuYkRpdikgeworICAgIGlmIChmcmFtZU9rID09IDApIHsKKyAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm51bUxvc3RMcGRGcmFtZXMrKzsKKyAgICB9IGVsc2UgeworICAgICAgbGFzdF9mcmFtZV9sb3N0IHw9CisgICAgICAgICAgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm51bUxvc3RMcGRGcmFtZXMgPiAwKSA/IDEgOiAwOworICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bnVtTG9zdExwZEZyYW1lcyA9IDA7CisgICAgfQorICAgIGlmIChtb2Rba10gPT0gMCB8fCBtb2Rba10gPT0gNCkgeworICAgICAgLyogQUNFTFAgb3IgVENYIHRpbWUgZG9tYWluIGNvbmNlYWxtZW50ICovCisgICAgICBGSVhQX0RCTCAqYWNlbHBfb3V0OworCisgICAgICAvKiBGQUMgbWFuYWdlbWVudCAqLworICAgICAgaWYgKChsYXN0X2xwZF9tb2RlICE9IDApICYmIChsYXN0X2xwZF9tb2RlICE9IDQpKSAvKiBUQ1ggVEQgY29uY2VhbG1lbnQgKi8KKyAgICAgIHsKKyAgICAgICAgRklYUF9EQkwgKnBGYWNEYXRhID0gTlVMTDsKKworICAgICAgICBpZiAoZnJhbWVPayAmJiAhbGFzdF9mcmFtZV9sb3N0KSB7CisgICAgICAgICAgcEZhY0RhdGEgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuZmFjX2RhdGFba107CisgICAgICAgIH0KKworICAgICAgICBuclNhbXBsZXMgKz0gQ0xwZF9GQUNfTWRjdDJBY2VscCgKKyAgICAgICAgICAgICZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5JTWRjdCwgc3ludGggKyBuclNhbXBsZXMsIHBGYWNEYXRhLAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmZhY19kYXRhX2Vba10sCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZba10sCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZfZXhwW2tdLAorICAgICAgICAgICAgbEZyYW1lIC0gbnJTYW1wbGVzLAorICAgICAgICAgICAgQ0xwZF9GQUNfZ2V0TGVuZ3RoKAorICAgICAgICAgICAgICAgIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2NvcmVfbW9kZSAhPSBGRF9TSE9SVCkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGsgPiAwKSwKKyAgICAgICAgICAgICAgICBsRmFjKSwKKyAgICAgICAgICAgIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2NvcmVfbW9kZSAhPSBMUEQpICYmIChrID09IDApLAorICAgICAgICAgICAgMCk7CisKKyAgICAgICAgRkRLbWVtY3B5KAorICAgICAgICAgICAgc3ludGggKyBuclNhbXBsZXMsIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPklNZGN0Lm92ZXJsYXAudGltZSwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPklNZGN0Lm92X29mZnNldCAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICB7CisgICAgICAgICAgRklYUF9MUEMgKmxwX3ByZXYgPQorICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMKKyAgICAgICAgICAgICAgICAgIC5scF9jb2VmZlswXTsgLyogaW5pdCB2YWx1ZSBkb2VzIG5vdCByZWFsIG1hdHRlciAqLworICAgICAgICAgIElOVCBscF9wcmV2X2V4cCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZl9leHBbMF07CisKKyAgICAgICAgICBpZiAobGFzdF9scGRfbW9kZSAhPSAyNTUpIHsgLyogbGFzdCBtb2RlIHdhcyB0Y3ggKi8KKyAgICAgICAgICAgIGxhc3RfayA9IGsgLSAoMSA8PCAobGFzdF9scGRfbW9kZSAtIDEpKTsKKyAgICAgICAgICAgIGlmIChsYXN0X2sgPCAwKSB7CisgICAgICAgICAgICAgIGxwX3ByZXYgPSBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5scF9jb2VmZl9vbGRbMV07CisgICAgICAgICAgICAgIGxwX3ByZXZfZXhwID0gcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bHBfY29lZmZfb2xkX2V4cFsxXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGxwX3ByZXYgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZbbGFzdF9rXTsKKyAgICAgICAgICAgICAgbHBfcHJldl9leHAgPQorICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmX2V4cFtsYXN0X2tdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIENMcGRfQWNlbHBQcmVwYXJlSW50ZXJuYWxNZW0oCisgICAgICAgICAgICAgIHN5bnRoICsgYWFjRGVsYXkgKyBrICogbERpdiwgbGFzdF9scGRfbW9kZSwKKyAgICAgICAgICAgICAgKGxhc3RfbGFzdF9scGRfbW9kZSA9PSA0KSA/IDAgOiBsYXN0X2xhc3RfbHBkX21vZGUsCisgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZltrXSwKKyAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmX2V4cFtrXSwgbHBfcHJldiwKKyAgICAgICAgICAgICAgbHBfcHJldl9leHAsICZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5hY2VscCwgbEZyYW1lLAorICAgICAgICAgICAgICAobGFzdF9mcmFtZV9sb3N0ICYmIGsgPCAyKSwgbW9kW2tdKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGsgPT0gMCAmJiBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5JTWRjdC5vdl9vZmZzZXQgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbEZyYW1lIC8gZmFjRkIgLyAyKSB7CisgICAgICAgICAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+SU1kY3Qub3Zfb2Zmc2V0ID0gbEZyYW1lIC8gZmFjRkIgLyAyOworICAgICAgICB9CisgICAgICAgIG5yU2FtcGxlcyArPSBpbWRjdF9kcmFpbigmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+SU1kY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50aCArIG5yU2FtcGxlcywgbEZyYW1lIC8gZmFjRkIgLSBuclNhbXBsZXMpOworICAgICAgfQorCisgICAgICBpZiAobnJTYW1wbGVzID49IGxGcmFtZSAvIGZhY0ZCKSB7CisgICAgICAgIC8qIFdyaXRlIEFDRUxQIHRpbWUgZG9tYWluIHNhbXBsZXMgaW50byBJTURDVCBvdmVybGFwIGJ1ZmZlciBhdAorICAgICAgICAgKiBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5JTWRjdC5vdmVybGFwLnRpbWUgKworICAgICAgICAgKiBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5JTWRjdC5vdl9vZmZzZXQKKyAgICAgICAgICovCisgICAgICAgIGFjZWxwX291dCA9IHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPklNZGN0Lm92ZXJsYXAudGltZSArCisgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPklNZGN0Lm92X29mZnNldDsKKworICAgICAgICAvKiBBY2NvdW50IEFDRUxQIHRpbWUgZG9tYWluIG91dHB1dCBzYW1wbGVzIHRvIG92ZXJsYXAgYnVmZmVyICovCisgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPklNZGN0Lm92X29mZnNldCArPSBsRGl2OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogV3JpdGUgQUNFTFAgdGltZSBkb21haW4gc2FtcGxlcyBpbnRvIG91dHB1dCBidWZmZXIgYXQgcFRpbWVEYXRhICsKKyAgICAgICAgICogbnJTYW1wbGVzICovCisgICAgICAgIGFjZWxwX291dCA9IHN5bnRoICsgbnJTYW1wbGVzOworCisgICAgICAgIC8qIEFjY291bnQgQUNFTFAgdGltZSBkb21haW4gb3V0cHV0IHNhbXBsZXMgdG8gb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICBuclNhbXBsZXMgKz0gbERpdjsKKyAgICAgIH0KKworICAgICAgaWYgKG1vZFtrXSA9PSA0KSB7CisgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmFjZWxwLndzeW5fcm1zID0gc2NhbGVWYWx1ZSgKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy50Y3hfZ2FpbltrXSwKKyAgICAgICAgICAgIGZpeE1pbigwLAorICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy50Y3hfZ2Fpbl9lW2tdIC0gU0ZfRVhDKSk7CisgICAgICAgIENMcGRfVGN4VERDb25jZWFsKCZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5hY2VscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxhc3RfdGN4X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHNwX2NvZWZmW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHNwX2NvZWZmW2sgKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmFTdGFiaWxpdHlba10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm51bUxvc3RMcGRGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFjZWxwX291dCwgbEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X3RjeF9ub2lzZV9mYWN0b3IpOworCisgICAgICB9IGVsc2UgeworICAgICAgICBGREtfQVNTRVJUKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5hU3RhYmlsaXR5W2tdID49CisgICAgICAgICAgICAgICAgICAgKEZJWFBfU0dMKTApOworICAgICAgICBDTHBkX0FjZWxwRGVjb2RlKCZwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5hY2VscCwgaV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxzcF9jb2VmZltrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHNwX2NvZWZmW2sgKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuYVN0YWJpbGl0eVtrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmFjZWxwW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm51bUxvc3RMcGRGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9scGNfbG9zdCwgaywgYWNlbHBfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICZwaXRjaFsoayAqIG5iU3ViZnIpICsgc3luU2ZkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcGl0X2dhaW5bKGsgKiBuYlN1YmZyKSArIHN5blNmZF0sIGxGcmFtZSk7CisgICAgICB9CisKKyAgICAgIGlmIChtb2Rba10gIT0gNCkgeworICAgICAgICBpZiAobGFzdF9scGRfbW9kZSAhPSAwICYmCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMKKyAgICAgICAgICAgICAgICAuYnBmX2NvbnRyb2xfaW5mbykgeyAvKiBGRC9UQ1ggLT4gQUNFTFAgdHJhbnNpdGlvbiAqLworICAgICAgICAgIC8qIGJhc3MgcG9zdC1maWx0ZXIgcGFzdCBGQUMgYXJlYSAocGFzdCB0d28gKG9uZSBmb3IgRkQgc2hvcnQpCisgICAgICAgICAgICogc3ViZnJhbWVzKSAqLworICAgICAgICAgIGludCBjdXJyZW50U2YgPSBzeW5TZmQgKyBrICogbmJTdWJmcjsKKworICAgICAgICAgIGlmICgoayA+IDApIHx8IChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2NvcmVfbW9kZSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICBGRF9TSE9SVCkpIHsgLyogVENYIG9yIEZEIGxvbmcgLT4gQUNFTFAgKi8KKyAgICAgICAgICAgIHBpdGNoW2N1cnJlbnRTZiAtIDJdID0gcGl0Y2hbY3VycmVudFNmIC0gMV0gPSBwaXRjaFtjdXJyZW50U2ZdOworICAgICAgICAgICAgcGl0X2dhaW5bY3VycmVudFNmIC0gMl0gPSBwaXRfZ2FpbltjdXJyZW50U2YgLSAxXSA9CisgICAgICAgICAgICAgICAgcGl0X2dhaW5bY3VycmVudFNmXTsKKyAgICAgICAgICB9IGVsc2UgeyAvKiBGRCBzaG9ydCAtPiBBQ0VMUCAqLworICAgICAgICAgICAgcGl0Y2hbY3VycmVudFNmIC0gMV0gPSBwaXRjaFtjdXJyZW50U2ZdOworICAgICAgICAgICAgcGl0X2dhaW5bY3VycmVudFNmIC0gMV0gPSBwaXRfZ2FpbltjdXJyZW50U2ZdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7IC8qIFRDWCAqLworICAgICAgaW50IGxnID0gbGdfdGFibGVbbW9kW2tdXTsKKyAgICAgIGludCBpc0Z1bGxCYW5kTHBkID0gMDsKKworICAgICAgLyogRkFDIG1hbmFnZW1lbnQgKi8KKyAgICAgIGlmICgobGFzdF9scGRfbW9kZSA9PSAwKSB8fCAobGFzdF9scGRfbW9kZSA9PSA0KSkgLyogVENYIFREIGNvbmNlYWxtZW50ICovCisgICAgICB7CisgICAgICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQoZmFjX2J1ZiwgRklYUF9EQkwsIDEwMjQgLyA4KTsKKworICAgICAgICAvKiBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuZmFjX2RhdGFba10gPT0gTlVMTCBtZWFucyBubyBGQUMKKyAgICAgICAgICogZGF0YSBhdmFpbGFibGUuICovCisgICAgICAgIGlmIChsYXN0X2ZyYW1lX2xvc3QgPT0gMSB8fAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmZhY19kYXRhW2tdID09IE5VTEwpIHsKKyAgICAgICAgICBGREttZW1jbGVhcihmYWNfYnVmLCAxMDI0IC8gOCAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5mYWNfZGF0YVtrXSA9IGZhY19idWY7CisgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmZhY19kYXRhX2Vba10gPSAwOworICAgICAgICB9CisKKyAgICAgICAgbnJTYW1wbGVzICs9IENMcGRfRkFDX0FjZWxwMk1kY3QoCisgICAgICAgICAgICAmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+SU1kY3QsIHN5bnRoICsgbnJTYW1wbGVzLAorICAgICAgICAgICAgU1BFQ19UQ1gocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQsIGssCisgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoLCBpc0Z1bGxCYW5kTHBkKSwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZSArIGssIDEsCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuZmFjX2RhdGFba10sCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuZmFjX2RhdGFfZVtrXSwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmdyYW51bGVMZW5ndGggLyogPT0gZmFjX2xlbmd0aCAqLywKKyAgICAgICAgICAgIGxGcmFtZSAtIG5yU2FtcGxlcywgbGcsCisgICAgICAgICAgICBGREtnZXRXaW5kb3dTbG9wZShsRGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0V2luZG93U2hhcGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pKSwKKyAgICAgICAgICAgIGxEaXYsIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZltrXSwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5scF9jb2VmZl9leHBba10sCisgICAgICAgICAgICAmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+YWNlbHAsCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMudGN4X2dhaW5ba10sCisgICAgICAgICAgICAobGFzdF9mcmFtZV9sb3N0IHx8ICFmcmFtZU9rKSwgMCAvKiBpcyBub3QgRkQgRkFDICovCisgICAgICAgICAgICAsCisgICAgICAgICAgICBsYXN0X2xwZF9tb2RlLCBrLAorICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mbworICAgICAgICAgICAgICAgIC0+Y3VyckFsaWFzaW5nU3ltbWV0cnkgLyogTm90ZTogVGhlIGN1cnJlbnQgYWxpYXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bW1ldHJ5IGZvciBhIFRDWCAoaS5lLiBMUEQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBtdXN0IGFsd2F5cyBiZSAwICovCisgICAgICAgICk7CisKKyAgICAgICAgcGl0Y2hbKGsgKiBuYlN1YmZyKSArIHN5blNmZCArIDFdID0gcGl0Y2hbKGsgKiBuYlN1YmZyKSArIHN5blNmZF0gPQorICAgICAgICAgICAgcGl0Y2hbKGsgKiBuYlN1YmZyKSArIHN5blNmZCAtIDFdOworICAgICAgICBwaXRfZ2FpblsoayAqIG5iU3ViZnIpICsgc3luU2ZkICsgMV0gPQorICAgICAgICAgICAgcGl0X2dhaW5bKGsgKiBuYlN1YmZyKSArIHN5blNmZF0gPQorICAgICAgICAgICAgICAgIHBpdF9nYWluWyhrICogbmJTdWJmcikgKyBzeW5TZmQgLSAxXTsKKworICAgICAgICBDX0FBTExPQ19TQ1JBVENIX0VORChmYWNfYnVmLCBGSVhQX0RCTCwgMTAyNCAvIDgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHRsID0gbGc7CisgICAgICAgIGludCBmbCA9IGxEaXY7CisgICAgICAgIGludCBmciA9IGxEaXY7CisKKyAgICAgICAgbnJTYW1wbGVzICs9IGltbHRfYmxvY2soCisgICAgICAgICAgICAmcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+SU1kY3QsIHN5bnRoICsgbnJTYW1wbGVzLAorICAgICAgICAgICAgU1BFQ19UQ1gocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cFNwZWN0cmFsQ29lZmZpY2llbnQsIGssCisgICAgICAgICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5ncmFudWxlTGVuZ3RoLCBpc0Z1bGxCYW5kTHBkKSwKKyAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnNwZWNTY2FsZSArIGssIDEsIGxGcmFtZSAtIG5yU2FtcGxlcywgdGwsCisgICAgICAgICAgICBGREtnZXRXaW5kb3dTbG9wZShmbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFdpbmRvd1NoYXBlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSksCisgICAgICAgICAgICBmbCwKKyAgICAgICAgICAgIEZES2dldFdpbmRvd1Nsb3BlKGZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0V2luZG93U2hhcGUoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pKSwKKyAgICAgICAgICAgIGZyLCBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMudGN4X2dhaW5ba10sCisgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5jdXJyQWxpYXNpbmdTeW1tZXRyeQorICAgICAgICAgICAgICAgID8gTUxUX0ZMQUdfQ1VSUl9BTElBU19TWU1NRVRSWQorICAgICAgICAgICAgICAgIDogMCk7CisgICAgICB9CisgICAgfQorICAgIC8qIHJlbWVtYmVyIHByZXZpb3VzIG1vZGUgKi8KKyAgICBsYXN0X2xhc3RfbHBkX21vZGUgPSBsYXN0X2xwZF9tb2RlOworICAgIGxhc3RfbHBkX21vZGUgPSBtb2Rba107CisgICAgbGFzdF9scGNfbG9zdCA9IChmcmFtZU9rID09IDApID8gMSA6IDA7CisKKyAgICAvKiBJbmNyZWFzZSBrIHRvIG5leHQgZnJhbWUgKi8KKyAgICBsYXN0X2sgPSBrOworICAgIGsgKz0gKChtb2Rba10gJiAweDMpID09IDApID8gMSA6ICgxIDw8IChtb2Rba10gLSAxKSk7CisgIH0KKworICBpZiAoZnJhbWVPaykgeworICAgIC8qIGFzc3VtZSBkYXRhIHdhcyBvayA9PiBzdG9yZSBmb3IgY29uY2VhbG1lbnQgKi8KKyAgICBGREtfQVNTRVJUKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmRhdGEudXNhYy5hU3RhYmlsaXR5W2xhc3Rfa10gPj0KKyAgICAgICAgICAgICAgIChGSVhQX1NHTCkwKTsKKyAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5vbGRTdGFiaWxpdHkgPQorICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuYVN0YWJpbGl0eVtsYXN0X2tdOworICAgIEZES21lbWNweShwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sc2ZfYWRhcHRpdmVfbWVhbiwKKyAgICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxzZl9hZGFwdGl2ZV9tZWFuX2NhbmQsCisgICAgICAgICAgICAgIE1fTFBfRklMVEVSX09SREVSICogc2l6ZW9mKEZJWFBfTFBDKSk7CisgIH0KKworICAvKiBzdG9yZSBwYXN0IGxwIGNvZWZmcyBmb3IgbmV4dCBzdXBlcmZyYW1lICh0aGV5IGFyZSBvbmx5IHZhbGlkIGFuZCBuZWVkZWQgaWYKKyAgICogbGFzdF9scGRfbW9kZSB3YXMgdGN4KSAqLworICBpZiAobGFzdF9scGRfbW9kZSA+IDApIHsKKyAgICBGREttZW1jcHkocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bHBfY29lZmZfb2xkWzBdLAorICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZbbmJEaXZdLAorICAgICAgICAgICAgICBNX0xQX0ZJTFRFUl9PUkRFUiAqIHNpemVvZihGSVhQX0xQQykpOworICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmxwX2NvZWZmX29sZF9leHBbMF0gPQorICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZfZXhwW25iRGl2XTsKKyAgICBGREttZW1jcHkocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bHBfY29lZmZfb2xkWzFdLAorICAgICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMubHBfY29lZmZbbGFzdF9rXSwKKyAgICAgICAgICAgICAgTV9MUF9GSUxURVJfT1JERVIgKiBzaXplb2YoRklYUF9MUEMpKTsKKyAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5scF9jb2VmZl9vbGRfZXhwWzFdID0KKyAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmxwX2NvZWZmX2V4cFtsYXN0X2tdOworICB9CisKKyAgRkRLX0FTU0VSVChuclNhbXBsZXMgPT0gbEZyYW1lKTsKKworICAvKiBjaGVjayB3aGV0aGVyIHVzYWdlIG9mIGJhc3MgcG9zdGZpbHRlciB3YXMgZGUtYWN0aXZhdGVkIGluIHRoZSBiaXRzdHJlYW07CisgICBpZiB5ZXMsIHNldCBwaXRjaCBnYWluIHRvIDAgKi8KKyAgaWYgKCEocEFhY0RlY29kZXJDaGFubmVsSW5mby0+ZGF0YS51c2FjLmJwZl9jb250cm9sX2luZm8pKSB7CisgICAgaWYgKG1vZFswXSAhPSAwICYmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5vbGRfYnBmX2NvbnRyb2xfaW5mbykpIHsKKyAgICAgIGZvciAoaW50IGkgPSAyOyBpIDwgbmJTdWJmclN1cGVyZnI7IGkrKykKKyAgICAgICAgcGl0X2dhaW5bc3luU2ZkICsgaV0gPSAoRklYUF9EQkwpMDsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYlN1YmZyU3VwZXJmcjsgaSsrKQorICAgICAgICBwaXRfZ2FpbltzeW5TZmQgKyBpXSA9IChGSVhQX0RCTCkwOworICAgIH0KKyAgfQorCisgIC8qIGZvciBiYXNzIHBvc3RmaWx0ZXIgKi8KKyAgZm9yIChpbnQgbiA9IDA7IG4gPCBzeW5TZmQ7IG4rKykgeworICAgIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPm9sZF9UX3BmW25dID0gcGl0Y2hbbmJTdWJmclN1cGVyZnIgKyBuXTsKKyAgICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5vbGRfZ2Fpbl9wZltuXSA9IHBpdF9nYWluW25iU3ViZnJTdXBlcmZyICsgbl07CisgIH0KKworICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5vbGRfYnBmX2NvbnRyb2xfaW5mbyA9CisgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5kYXRhLnVzYWMuYnBmX2NvbnRyb2xfaW5mbzsKKworICB7CisgICAgSU5UIGxvb2thaGVhZCA9IC1CUEZfREVMQVk7CisgICAgaW50IGNvcHlTYW1wID0gKG1vZFtuYkRpdiAtIDFdID09IDApID8gKGFhY0RlbGF5KSA6IChhYWNEZWxheSAtIGxGYWMpOworCisgICAgLyogQ29weSBlbm91Z2ggdGltZSBkb21haW4gc2FtcGxlcyBmcm9tIE1EQ1QgdG8gc3ludGhlc2lzIGJ1ZmZlciBhcyBuZWVkZWQKKyAgICAgKiBieSB0aGUgYmFzcyBwb3N0ZmlsdGVyICovCisKKyAgICBsb29rYWhlYWQgKz0gaW1kY3RfY29weV9vdl9hbmRfbnIoJnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPklNZGN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50aCArIG5yU2FtcGxlcywgY29weVNhbXApOworCisgICAgRkRLX0FTU0VSVChsb29rYWhlYWQgPT0gY29weVNhbXAgLSBCUEZfREVMQVkpOworCisgICAgRklYUF9EQkwgKnAyX3N5bnRoID0gc3ludGggKyBCUEZfREVMQVk7CisKKyAgICAvKiByZWNhbGN1bGF0ZSBwaXRjaCBnYWluIHRvIGFsbG93IHBvc3RmaWxlcmluZyBvbiBGQUMgYXJlYSAqLworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmJTdWJmclN1cGVyZnI7IGkrKykgeworICAgICAgaW50IFQgPSBwaXRjaFtpXTsKKyAgICAgIEZJWFBfREJMIGdhaW4gPSBwaXRfZ2FpbltpXTsKKworICAgICAgaWYgKGdhaW4gPiAoRklYUF9EQkwpMCkgeworICAgICAgICBnYWluID0gZ2V0X2dhaW4oJnAyX3N5bnRoW2kgKiBMX1NVQkZSXSwgJnAyX3N5bnRoWyhpICogTF9TVUJGUikgLSBUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExfU1VCRlIpOworICAgICAgICBwaXRfZ2FpbltpXSA9IGdhaW47CisgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgYmFzc19wZl8xc2ZfZGVsYXkocDJfc3ludGgsIHBpdGNoLCBwaXRfZ2FpbiwgbEZyYW1lLCBsRnJhbWUgLyBmYWNGQiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZFtuYkRpdiAtIDFdID8gKFN5bkRlbGF5IC0gKGxEaXYgLyAyKSkgOiBTeW5EZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lRGF0YSwgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bWVtX2JwZik7CisgICAgfQorICB9CisKKyAgQWNlbHBfUG9zdFByb2Nlc3Npbmcoc3ludGhfYnVmLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5vbGRfc3ludGgsCisgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5vbGRfVF9wZiwgbEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBzeW5TZmQsIG5iU3ViZnJTdXBlcmZyKTsKKworICAvKiBTdG9yZSBsYXN0IG1vZGUgZm9yIG5leHQgc3VwZXIgZnJhbWUgKi8KKyAgeyBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2NvcmVfbW9kZSA9IExQRDsgfQorICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xwZF9tb2RlID0gbGFzdF9scGRfbW9kZTsKKyAgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+bGFzdF9sYXN0X2xwZF9tb2RlID0gbGFzdF9sYXN0X2xwZF9tb2RlOworICBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5sYXN0X2xwY19sb3N0ID0gbGFzdF9scGNfbG9zdDsKKworICByZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL3VzYWNkZWNfbHBkLmggYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfbHBkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U3OTM4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19scGQuaApAQCAtMCwwICsxLDE5OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgorCisgICBEZXNjcmlwdGlvbjogVVNBQyBMaW5lYXIgUHJlZGljdGlvbiBEb21haW4gY29kaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVVNBQ0RFQ19MUERfSAorI2RlZmluZSBVU0FDREVDX0xQRF9ICisKKyNpbmNsdWRlICJjaGFubmVsaW5mby5oIgorCisjZGVmaW5lIE9QVElNSVpFX0FWR19QRVJGT1JNQU5DRQorCisvKioKKyAqIFxicmllZiByZWFkIGEgbHBkX2NoYW5uZWxfc3RyZWFtLgorICogXHBhcmFtIGhCcyBhIGJpdCBzdHJlYW0gaGFuZGxlLCB3aGVyZSB0aGUgbHBkX2NoYW5uZWxfc3RyZWFtIGlzIGxvY2F0ZWQuCisgKiBccGFyYW0gcEFhY0RlY29kZXJDaGFubmVsSW5mbyB0aGUgY2hhbm5lbCBjb250ZXh0IHN0cnVjdHVyZSBmb3Igc3RvcmluZyByZWFkCisgKiBkYXRhLgorICogXHBhcmFtIGZsYWdzIGJpdCBzdHJlYW0gc3ludGF4IGZsYWdzLgorICogXHJldHVybiBBQUNfREVDT0RFUl9FUlJPUiBlcnJvciBjb2RlLgorICovCitBQUNfREVDT0RFUl9FUlJPUiBDTHBkQ2hhbm5lbFN0cmVhbV9SZWFkKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvICpwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLAorICAgIGNvbnN0IFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLCBVSU5UIGZsYWdzKTsKKworLyoqCisgKiBcYnJpZWYgZGVjb2RlIG9uZSBscGRfY2hhbm5lbF9zdHJlYW0gYW5kIHJlbmRlciB0aGUgYXVkaW8gb3V0cHV0LgorICogXHBhcmFtIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8gc3RydWN0IGhvbGRpbmcgdGhlIGNoYW5uZWwgaW5mb3JtYXRpb24gdG8gYmUKKyAqIHJlbmRlcmVkLgorICogXHBhcmFtIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gc3RydWN0IGhvbGRpbmcgdGhlIHBlcnNpc3RlbnQgY2hhbm5lbAorICogaW5mb3JtYXRpb24gdG8gYmUgcmVuZGVyZWQuCisgKiBccGFyYW0gcFNhbXBsaW5nUmF0ZUluZm8gaG9sZHMgdGhlIHNhbXBsaW5nIHJhdGUgaW5mb3JtYXRpb24KKyAqIFxwYXJhbSBlbEZsYWdzIGhvbGRzIHRoZSBpbnRlcm5hbCBkZWNvZGVyIGZsYWdzCisgKi8KK3ZvaWQgQ0xwZENoYW5uZWxTdHJlYW1fRGVjb2RlKAorICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywgVUlOVCBmbGFncyk7CisKKy8qKgorICogXGJyaWVmIGdlbmVyYXRlIHRpbWUgZG9tYWluIG91dHB1dCBzaWduYWwgZm9yIExQRCBjaGFubmVsIHN0cmVhbXMKKyAqIFxwYXJhbSBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvCisgKiBccGFyYW0gcEFhY0RlY29kZXJDaGFubmVsSW5mbworICogXHBhcmFtIHBUaW1lRGF0YSBwb2ludGVyIHRvIG91dHB1dCBidWZmZXIKKyAqIFxwYXJhbSBzYW1wbGVzUGVyRnJhbWUgYW1vdW50IG9mIG91dHB1dCBzYW1wbGVzCisgKiBccGFyYW0gcFNhbXBsaW5nUmF0ZUluZm8gaG9sZHMgdGhlIHNhbXBsaW5nIHJhdGUgaW5mb3JtYXRpb24KKyAqIFxwYXJhbSBwV29ya0J1ZmZlcjEgcG9pbnRlciB0byB3b3JrIGJ1ZmZlciBmb3IgdGVtcG9yYWwgZGF0YQorICovCitBQUNfREVDT0RFUl9FUlJPUiBDTHBkX1JlbmRlclRpbWVTaWduYWwoCisgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbywKKyAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCBGSVhQX1BDTSAqcFRpbWVEYXRhLAorICAgIElOVCBzYW1wbGVzUGVyRnJhbWUsIFNhbXBsaW5nUmF0ZUluZm8gKnBTYW1wbGluZ1JhdGVJbmZvLCBVSU5UIGZyYW1lT2ssCisgICAgVUlOVCBmbGFncywgVUlOVCBzdHJtRmxhZ3MpOworCitzdGF0aWMgaW5saW5lIElOVCBDTHBkX0ZBQ19nZXRMZW5ndGgoaW50IGZOb3RTaG9ydEJsb2NrLCBpbnQgZmFjX2xlbmd0aF9sb25nKSB7CisgIGlmIChmTm90U2hvcnRCbG9jaykgeworICAgIHJldHVybiAoZmFjX2xlbmd0aF9sb25nKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFjX2xlbmd0aF9sb25nIC8gMjsKKyAgfQorfQorCit2b2lkIGZpbHRMUChjb25zdCBGSVhQX0RCTCAqc3luLCBGSVhQX1BDTSAqc3luX291dCwgRklYUF9EQkwgKm5vaXNlLAorICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgKmZpbHQsIElOVCBzdG9wLCBpbnQgbGVuKTsKKworLyoqCisgKiBcYnJpZWYgcGVyZm9ybSBhIGxvdy1mcmVxdWVuY3kgcGl0Y2ggZW5oYW5jZW1lbnQgb24gdGltZSBkb21haW4gc2lnbmFsCisgKiBccGFyYW1baW5dIHN5biBwb2ludGVyIHRvIHRpbWUgZG9tYWluIGlucHV0IHNpZ25hbAorICogXHBhcmFtW2luXSBzeW5GQiBwb2ludGVyIHRvIHRpbWUgZG9tYWluIGlucHV0IHNpZ25hbAorICogXHBhcmFtW2luXSB1cHNhbXBsaW5nIGZhY3RvcgorICogXHBhcmFtW2luXSBUX3NmIGFycmF5IHdpdGggcGFzdCBkZWNvZGVkIHBpdGNoIHBlcmlvZCB2YWx1ZXMgZm9yIGVhY2ggc3ViZnJhbWUKKyAqIFxwYXJhbVtpbl0gbm9uX3plcm9fZ2Fpbl9mbGFncyBpbmRpY2F0ZXMgd2hldGhlciBwaXRjaCBnYWlucyBvZiBwYXN0CisgKiBzdWJmcmFtZXMgYXJlIHplcm8gb3Igbm90LCBtc2IgLT4gWzEgQlBGX0RFTEFZIHN1YmZyXVs3IFNZTl9ERUxBWSBzdWJmcl1bMTYKKyAqIG5ldyBzdWJmcl0gPC0gbHNiCisgKiBccGFyYW1baW5dIGxfZnJhbWUgbGVuZ3RoIG9mIGZpbHRlcmluZywgbXVzdCBiZSBtdWx0aXBsZSBvZiBMX1NVQkZSCisgKiBccGFyYW1baW5dIGxfbmV4dCBsZW5ndGggb2YgYWxsb3dlZCBsb29rIGFoZWFkIG9uIHN5bltpXSwgaSA8IGxfZnJhbWUrbF9uZXh0CisgKiBccGFyYW1bb3V0XSBzeW50aF9vdXQgcG9pbnRlciB0byB0aW1lIGRvbWFpbiBvdXRwdXQgc2lnbmFsCisgKiBccGFyYW1baW4sb3V0XSBtZW1fYnBmIHBvaW50ZXIgdG8gZmlsdGVyIG1lbW9yeSAoTF9GSUxUK0xfU1VCRlIpCisgKi8KKwordm9pZCBiYXNzX3BmXzFzZl9kZWxheShGSVhQX0RCTCBzeW5bXSwgY29uc3QgSU5UIFRfc2ZbXSwgRklYUF9EQkwgKnBpdF9nYWluLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZnJhbWVfbGVuZ3RoLCBjb25zdCBJTlQgbF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGxfbmV4dCwgRklYUF9QQ00gKnN5bnRoX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgbWVtX2JwZltdKTsKKworLyoqCisgKiBcYnJpZWYgcmFuZG9tIHNpZ24gZ2VuZXJhdG9yIGZvciBGRCBhbmQgVENYIG5vaXNlIGZpbGxpbmcKKyAqIFxwYXJhbVtpbixvdXRdIHNlZWQgcG9pbnRlciB0byByYW5kb20gc2VlZAorICogXHJldHVybiBpZiByZXR1cm4gdmFsdWUgaXMgemVybyB1c2UgcG9zaXRpdmUgc2lnbgorICogXE5vdGU6IFRoaXMgY29kZSBpcyBhbHNvIGltcGxlbWVudGVkIGFzIGEgY29weSBpbiBibG9jay5jcHAsIGdyZXAgZm9yCisgKiAiVXNhY1JhbmRvbVNpZ24iCisgKi8KK0ZES19JTkxJTkUKK2ludCBVc2FjUmFuZG9tU2lnbihVTE9ORyAqc2VlZCkgeworICAqc2VlZCA9IChVTE9ORykoKFVJTlQ2NCkoKnNlZWQpICogNjkwNjkgKyA1KTsKKworICByZXR1cm4gKGludCkoKCpzZWVkKSAmIDB4MTAwMDApOworfQorCit2b2lkIENGZHBfUmVzZXQoQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyk7CisKKyNlbmRpZiAvKiBVU0FDREVDX0xQRF9IICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL3VzYWNkZWNfcm9tLmNwcCBiL2xpYkFBQ2RlYy9zcmMvdXNhY2RlY19yb20uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOWU5OTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfcm9tLmNwcApAQCAtMCwwICsxLDE1MDQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE0uIEphbmRlcgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzYWNkZWNfcm9tLmgiCisKKyNkZWZpbmUgTkJfU1BIRVJFIDMyCisjZGVmaW5lIE5CX0xFQURFUiAzNworI2RlZmluZSBOQl9MRFNJR04gMjI2CisjZGVmaW5lIE5CX0xEUTMgOQorI2RlZmluZSBOQl9MRFE0IDI4CisKKy8qIEZvciBiYXNzIHBvc3QgZmlsdGVyICovCisjZGVmaW5lIEZMMkZYQ09OU1RfU0dMX0ZJTFQoYSkgRkwyRlhDT05TVF9TR0woYSooMSA8PCBTRl9GSUxUX0xQKSkKKyNkZWZpbmUgU0ZfRklMVF9MUCAxCisKKy8qIHRhYmxlIG9mIGZhY3RvcmlhbCAqLworY29uc3QgVUlOVCBmZGtfZGVjX3RhYl9mYWN0b3JpYWxbOF0gPSB7NTA0MCwgNzIwLCAxMjAsIDI0LCA2LCAyLCAxLCAxfTsKKworLyogIERhIC0gQWJzb2x1dGUgbGVhZGVycyAqLworY29uc3QgVUNIQVIgZmRrX2RlY19EYVtOQl9MRUFERVJdWzhdID0geworICAgIHsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfSwgICB7MiwgMiwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgezIsIDIsIDIsIDIsIDAsIDAsIDAsIDB9LCAgIHszLCAxLCAxLCAxLCAxLCAxLCAxLCAxfSwKKyAgICB7NCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sICAgezIsIDIsIDIsIDIsIDIsIDIsIDAsIDB9LAorICAgIHszLCAzLCAxLCAxLCAxLCAxLCAxLCAxfSwgICB7NCwgMiwgMiwgMCwgMCwgMCwgMCwgMH0sCisgICAgezIsIDIsIDIsIDIsIDIsIDIsIDIsIDJ9LCAgIHszLCAzLCAzLCAxLCAxLCAxLCAxLCAxfSwKKyAgICB7NCwgMiwgMiwgMiwgMiwgMCwgMCwgMH0sICAgezQsIDQsIDAsIDAsIDAsIDAsIDAsIDB9LAorICAgIHs1LCAxLCAxLCAxLCAxLCAxLCAxLCAxfSwgICB7MywgMywgMywgMywgMSwgMSwgMSwgMX0sCisgICAgezQsIDIsIDIsIDIsIDIsIDIsIDIsIDB9LCAgIHs0LCA0LCAyLCAyLCAwLCAwLCAwLCAwfSwKKyAgICB7NSwgMywgMSwgMSwgMSwgMSwgMSwgMX0sICAgezYsIDIsIDAsIDAsIDAsIDAsIDAsIDB9LAorICAgIHs0LCA0LCA0LCAwLCAwLCAwLCAwLCAwfSwgICB7NiwgMiwgMiwgMiwgMCwgMCwgMCwgMH0sCisgICAgezYsIDQsIDIsIDAsIDAsIDAsIDAsIDB9LCAgIHs3LCAxLCAxLCAxLCAxLCAxLCAxLCAxfSwKKyAgICB7OCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sICAgezYsIDYsIDAsIDAsIDAsIDAsIDAsIDB9LAorICAgIHs4LCAyLCAyLCAwLCAwLCAwLCAwLCAwfSwgICB7OCwgNCwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgezksIDEsIDEsIDEsIDEsIDEsIDEsIDF9LCAgIHsxMCwgMiwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgezgsIDgsIDAsIDAsIDAsIDAsIDAsIDB9LCAgIHsxMCwgNiwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgezEyLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwgIHsxMiwgNCwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgezEwLCAxMCwgMCwgMCwgMCwgMCwgMCwgMH0sIHsxNCwgMiwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgezEyLCA4LCAwLCAwLCAwLCAwLCAwLCAwfSwgIHsxNiwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgezIwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfX07CisKKy8qIERzIC0gU2lnbiBjb2RlcyBvZiBhbGwgc2lnbmVkIGxlYWRlcnMgKi8KK2NvbnN0IFVDSEFSIGZka19kZWNfRHNbTkJfTERTSUdOXSA9IHsKKyAgICAwLCAgIDMsICAgMTUsICA2MywgIDI1NSwgMCwgICA2NCwgIDE5MiwgMCwgICAxNiwgIDQ4LCAgMTEyLCAyNDAsIDEsICAgNywKKyAgICAzMSwgIDEyNywgMTI4LCAxMzEsIDE0MywgMTkxLCAwLCAgIDEyOCwgMCwgICA0LCAgIDEyLCAgMjgsICA2MCwgIDEyNCwgMjUyLAorICAgIDAsICAgMywgICAxNSwgIDYzLCAgNjUsICA3MSwgIDk1LCAgMTkyLCAxOTUsIDIwNywgMjU1LCAwLCAgIDMyLCAgOTYsICAxMjgsCisgICAgMTYwLCAyMjQsIDAsICAgMSwgICAzLCAgIDcsICAgMTUsICAzMSwgIDYzLCAgMTI3LCAyNTUsIDEsICAgNywgICAzMSwgIDMyLAorICAgIDM1LCAgNDcsICA5NywgIDEwMywgMTI3LCAyMjQsIDIyNywgMjM5LCAwLCAgIDgsICAgMjQsICA1NiwgIDEyMCwgMTI4LCAxMzYsCisgICAgMTUyLCAxODQsIDI0OCwgMCwgICA2NCwgIDE5MiwgMCwgICAzLCAgIDE1LCAgNjMsICAxMjksIDEzNSwgMTU5LCAyNTUsIDAsCisgICAgMywgICAxNSwgIDE3LCAgMjMsICA0OCwgIDUxLCAgNjMsICAxMTMsIDExOSwgMjQwLCAyNDMsIDI1NSwgMCwgICAyLCAgIDYsCisgICAgMTQsICAzMCwgIDYyLCAgMTI2LCAxMjgsIDEzMCwgMTM0LCAxNDIsIDE1OCwgMTkwLCAyNTQsIDAsICAgMTYsICA0OCwgIDY0LAorICAgIDgwLCAgMTEyLCAxOTIsIDIwOCwgMjQwLCAxLCAgIDcsICAgMzEsICA2NCwgIDY3LCAgNzksICAxMjcsIDEyOCwgMTMxLCAxNDMsCisgICAgMTkxLCAxOTMsIDE5OSwgMjIzLCAwLCAgIDY0LCAgMTI4LCAxOTIsIDAsICAgMzIsICA5NiwgIDIyNCwgMCwgICAxNiwgIDQ4LAorICAgIDExMiwgMTI4LCAxNDQsIDE3NiwgMjQwLCAwLCAgIDMyLCAgNjQsICA5NiwgIDEyOCwgMTYwLCAxOTIsIDIyNCwgMSwgICA3LAorICAgIDMxLCAgMTI3LCAxMjgsIDEzMSwgMTQzLCAxOTEsIDAsICAgMTI4LCAwLCAgIDY0LCAgMTkyLCAwLCAgIDMyLCAgOTYsICAxMjgsCisgICAgMTYwLCAyMjQsIDAsICAgNjQsICAxMjgsIDE5MiwgMCwgICAzLCAgIDE1LCAgNjMsICAxMjksIDEzNSwgMTU5LCAyNTUsIDAsCisgICAgNjQsICAxMjgsIDE5MiwgMCwgICA2NCwgIDE5MiwgMCwgICA2NCwgIDEyOCwgMTkyLCAwLCAgIDEyOCwgMCwgICA2NCwgIDEyOCwKKyAgICAxOTIsIDAsICAgNjQsICAxOTIsIDAsICAgNjQsICAxMjgsIDE5MiwgMCwgICA2NCwgIDEyOCwgMTkyLCAwLCAgIDEyOCwgMCwKKyAgICAxMjh9OworCisvKiBOcyAtIE51bWJlciBvZiBzaWduZWQgbGVhZGVyIGFzc29jaWF0ZWQgdG8gYSBnaXZlbiBhYnNvbHV0ZSBsZWFkZXIgKi8KK2NvbnN0IFVDSEFSIGZka19kZWNfTnNbTkJfTEVBREVSXSA9IHsKKyAgICA1LCAzLCA1LCA4LCAyLCA3LCAxMSwgNiwgOSwgMTIsIDEwLCAzLCA4LCAxMywgMTQsIDksIDE0LCA0LCA0LAorICAgIDgsIDgsIDgsIDIsIDMsIDYsIDQsICA4LCA0LCAzLCAgNCwgIDIsIDQsIDMsICA0LCAgNCwgMiwgIDJ9OworCisvKiBJYSAtIFBvc2l0aW9uIG9mIHRoZSBmaXJzdCBzaWduZWQgbGVhZGVyIGFzc29jaWF0ZWQgdG8gYW4gYWJzb2x1dGUgbGVhZGVyICovCitjb25zdCBVQ0hBUiBmZGtfZGVjX0lhW05CX0xFQURFUl0gPSB7CisgICAgMCwgICA1LCAgIDgsICAgMTMsICAyMSwgIDIzLCAgMzAsICA0MSwgIDQ3LCAgNTYsICA2OCwgIDc4LCAgODEsCisgICAgODksICAxMDIsIDExNiwgMTI1LCAxMzksIDE0MywgMTQ3LCAxNTUsIDE2MywgMTcxLCAxNzMsIDE3NiwgMTgyLAorICAgIDE4NiwgMTk0LCAxOTgsIDIwMSwgMjA1LCAyMDcsIDIxMSwgMjE0LCAyMTgsIDIyMiwgMjI0fTsKKworLyogSXMgLSBDYXJkaW5hbGl0ZSBvZmZzZXQgb2Ygc2lnbmVkIGxlYWRlcnMgKi8KK2NvbnN0IFVTSE9SVCBmZGtfZGVjX0lzW05CX0xEU0lHTl0gPSB7CisgICAgMCwgICAgIDEsICAgICAyOSwgICAgOTksICAgIDEyNywgICAxMjgsICAgMTU2LCAgIDIxMiwgICAyNTYsICAgMzI2LCAgIDYwNiwKKyAgICAxMDI2LCAgMTMwNiwgIDEzNzYsICAxNDMyLCAgMTcxMiwgIDE4ODAsICAxODg4LCAgMTg5NiwgIDIwNjQsICAyMzQ0LCAgMjQwLAorICAgIDI0OCwgICAwLCAgICAgMjgsICAgIDE5NiwgICA2MTYsICAgMTE3NiwgIDE1OTYsICAxNzY0LCAgMTc5MiwgIDE4MjAsICAyMjQwLAorICAgIDI2NjAsICAyNjg4LCAgMzAyNCwgIDQxNDQsICA0NDgwLCAgNDUwOCwgIDQ5MjgsICA1MzQ4LCAgMjQwMCwgIDI1NjgsICAyOTA0LAorICAgIDMwNzIsICAzMjQwLCAgMzU3NiwgIDUzNzYsICA1Mzc3LCAgNTM4NSwgIDU0MTMsICA1NDY5LCAgNTUzOSwgIDU1OTUsICA1NjIzLAorICAgIDU2MzEsICA1NjMyLCAgNTkxMiwgIDY0NzIsICA2NTI4LCAgNjY5NiwgIDgzNzYsICA5MjE2LCAgMTAwNTYsIDExNzM2LCAxMTkwNCwKKyAgICAxMTk2MCwgMTI1MjAsIDEyODAwLCAxMzA4MCwgMTQyMDAsIDE1ODgwLCAxNzAwMCwgMTcyODAsIDE3NTYwLCAxODY4MCwgMjAzNjAsCisgICAgMjE0ODAsIDM3NDQsICAzNzcyLCAgMzgyOCwgIDIxNzYwLCAyMTc2OCwgMjE5MzYsIDIyMjE2LCAyMjI3MiwgMjIzMjgsIDIyNjA4LAorICAgIDIyNzc2LCAyMjc4NCwgMjI4NTQsIDIzMjc0LCAyMzM0NCwgMjQ0NjQsIDI1NTg0LCAyNjAwNCwgMjg1MjQsIDI4OTQ0LCAzMDA2NCwKKyAgICAzMTE4NCwgMzEyNTQsIDMxNjc0LCAzMTc0NCwgMzE4MDAsIDMyMTM2LCAzMjk3NiwgMzQwOTYsIDM0OTM2LCAzNTI3MiwgMzUzMjgsCisgICAgMzUzODQsIDM1NzIwLCAzNjU2MCwgMzc2ODAsIDM4NTIwLCAzODg1NiwgMzg5MTIsIDM5MzMyLCA0MDE3MiwgNDA1OTIsIDQxNDMyLAorICAgIDQzMTEyLCA0Mzk1MiwgNDQzNzIsIDQ1MjEyLCA0NTYzMiwgNDU5NjgsIDQ3MDg4LCA0NzQyNCwgNDc0ODAsIDQ4MzIwLCA0OTE2MCwKKyAgICA0OTIxNiwgNDkyNzIsIDUwMTEyLCA1MDk1MiwgNTEwMDgsIDUxMzQ0LCA1MjQ2NCwgMzg1NiwgIDM5MTIsICAzOTY4LCAgNDAyNCwKKyAgICA1MjgwMCwgNTI4NTYsIDUzMDI0LCA1MzE5MiwgNTMyNDgsIDUzNTI4LCA1NDM2OCwgNTUyMDgsIDU1NDg4LCA1NTc2OCwgNTY2MDgsCisgICAgNTc0NDgsIDU3NzI4LCA1ODA2NCwgNTg0MDAsIDU4NzM2LCA1OTA3MiwgNTk0MDgsIDU5NzQ0LCA2MDA4MCwgNjA0MTYsIDYwNDcyLAorICAgIDYwNzUyLCA2MDkyMCwgNjA5MjgsIDYwOTM2LCA2MTEwNCwgNjEzODQsIDQwODAsICA0MDg4LCAgNjE0NDAsIDYxNDY4LCA2MTUyNCwKKyAgICA2MTU1MiwgNjE3MjAsIDYyMDU2LCA2MjIyNCwgNjIzOTIsIDYyNzI4LCA2Mjg5NiwgNjI5NTIsIDYzMDA4LCA2MzA2NCwgNjMxMjAsCisgICAgNjMxMjgsIDYzMjk2LCA2MzU3NiwgNjM2MzIsIDYzNjg4LCA2Mzk2OCwgNjQxMzYsIDY0MTQ0LCA2NDIwMCwgNjQyNTYsIDY0MzEyLAorICAgIDY0MzY4LCA2NDM5NiwgNjQ0NTIsIDY0NDgwLCA2NDUzNiwgNjQ1OTIsIDY0NjQ4LCA2NDcwNCwgNjQ3MTIsIDY0NzIwLCA2NDc3NiwKKyAgICA2NDgzMiwgNjQ4ODgsIDY0OTQ0LCA2NDk3MiwgNjUwMjgsIDY1MDU2LCA2NTExMiwgNjUxNjgsIDY1MjI0LCA2NTI4MCwgNjUzMzYsCisgICAgNjUzOTIsIDY1NDQ4LCA2NTUwNCwgNjU1MTIsIDY1NTIwLCA2NTUyOH07CisKKy8qIEEzIC0gTnVtYmVyIG9mIHRoZSBhYnNvbHV0ZSBsZWFkZXJzIGluIGNvZGVib29rcyBRMiBhbmQgUTMgKi8KK2NvbnN0IFVDSEFSIGZka19kZWNfQTNbTkJfTERRM10gPSB7MCwgMSwgNCwgMiwgMywgNywgMTEsIDE3LCAyMn07CisKKy8qIEE0IC0gTnVtYmVyIG9mIHRoZSBhYnNvbHV0ZSBsZWFkZXJzIGluIGNvZGVib29rIFE0ICovCitjb25zdCBVQ0hBUiBmZGtfZGVjX0E0W05CX0xEUTRdID0gezUsICA2LCAgOCwgIDksICAxMCwgMTIsIDEzLCAxNCwgMTUsIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCwgMTksIDIwLCAyMSwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2fTsKKworLyogSTMgLSBDYXJkaW5hbGl0eSBvZmZzZXRzIGZvciBhYnNvbHV0ZSBsZWFkZXJzIGluIFEzICovCitjb25zdCBVU0hPUlQgZmRrX2RlY19JM1tOQl9MRFEzXSA9IHswLCAgICAxMjgsICAyNDAsICAyNTYsIDEzNzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwLCAzNzQ0LCAzODU2LCA0MDgwfTsKKworLyogSTQgLSBDYXJkaW5hbGl0eSBvZmZzZXQgZm9yIGFic29sdXRlIGxlYWRlcnMgaW4gUTQgKi8KK2NvbnN0IFVTSE9SVCBmZGtfZGVjX0k0W05CX0xEUTRdID0geworICAgIDAsICAgICAxNzkyLCAgNTM3NiwgIDU2MzIsICAxMjgwMCwgMjE3NjAsIDIyNzg0LCAzMTc0NCwgMzg5MTIsIDQ1NjMyLAorICAgIDUyODAwLCA1MzI0OCwgNTc3MjgsIDYwNDE2LCA2MTQ0MCwgNjE1NTIsIDYyODk2LCA2MzEyMCwgNjQxNDQsIDY0MzY4LAorICAgIDY0NDgwLCA2NDcwNCwgNjQ3MjAsIDY0OTQ0LCA2NTA1NiwgNjUyODAsIDY1NTA0LCA2NTUyMH07CisKKy8qIEluaXRpYWwgSVNGIG1lbW9yeSBmb3IgY29uY2VhbG1lbnQgY2FzZSAqLworI2RlZmluZSBMU0ZJKHgpICgoeCkgPDwgKEZSQUNUX0JJVFMgLSBMU0ZfU0NBTEUgLSAxKSkKKworY29uc3QgRklYUF9MUEMgZmRrX2RlY19sc2ZfaW5pdFsxNl0gPSB7MTUwNiwgIDMwMTIsICA0NTE4LCAgNjAyNCwgIDc1MjksICA5MDM1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA1NDEsIDEyMDQ3LCAxMzU1MywgMTUwNTksIDE2NTY1LCAxODA3MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5NTc2LCAyMTA4MiwgMjI1ODgsIDI0MDk0fTsKKworLyogZGljb19sc2ZfYWJzXzhiIGlzIHNjYWxlZCBieSAxLygxPDwxMykgKi8KKyNkZWZpbmUgRElDTyh4KSBGWF9EQkwyRlhDT05TVF9MUEMoeCA+PiAoTFNGX1NDQUxFIC0gMTMpKQorCitjb25zdCBGSVhQX0xQQyBmZGtfZGVjX2RpY29fbHNmX2Fic184YltdID0geworICAgIERJQ08oMHgwNWU1N2ZlOCksIERJQ08oMHgwYWMwMDgxMCksIERJQ08oMHgxMWVkODUwMCksIERJQ08oMHgxNmQ0MmNlMCksCisgICAgRElDTygweDFiZWIxZTIwKSwgRElDTygweDIxN2VhZjQwKSwgRElDTygweDI3NjhjNzQwKSwgRElDTygweDJkMjZmNjAwKSwKKyAgICBESUNPKDB4MzJmZTY4YzApLCBESUNPKDB4MzhiMWQ5ODApLCBESUNPKDB4M2U5NWJkODApLCBESUNPKDB4NDQ2ZGFiMDApLAorICAgIERJQ08oMHg0YWJmZDI4MCksIERJQ08oMHg1MDk0YjM4MCksIERJQ08oMHg1NmNjYjgwMCksIERJQ08oMHg1YzlhYmEwMCksCisgICAgRElDTygweDA5NjYwY2EwKSwgRElDTygweDEwYWI0YzAwKSwgRElDTygweDE1YTE2ZjIwKSwgRElDTygweDE5ZDNjNzgwKSwKKyAgICBESUNPKDB4MWVlOTkwNjApLCBESUNPKDB4MjQxZDEyMDApLCBESUNPKDB4MjljODM3MDApLCBESUNPKDB4MmYwOThmMDApLAorICAgIERJQ08oMHgzNDgwM2ZjMCksIERJQ08oMHgzYTM3YmMwMCksIERJQ08oMHgzZmY1NTU4MCksIERJQ08oMHg0NWRhOTI4MCksCisgICAgRElDTygweDRiZWM2NzAwKSwgRElDTygweDUxNjllMzAwKSwgRElDTygweDU3Nzk3YzgwKSwgRElDTygweDVkMDlhZTgwKSwKKyAgICBESUNPKDB4MDhhMjAzYjApLCBESUNPKDB4MGQ2ZWQxYTApLCBESUNPKDB4MTUyY2NmMjApLCBESUNPKDB4MTk2MzlkYzApLAorICAgIERJQ08oMHgxZDdlM2U2MCksIERJQ08oMHgyMWY0YTdjMCksIERJQ08oMHgyN2IyZjhjMCksIERJQ08oMHgyZGJiNDQ4MCksCisgICAgRElDTygweDMzZWNkZTgwKSwgRElDTygweDM5ODJlMTAwKSwgRElDTygweDNlYTE2MTAwKSwgRElDTygweDQzYWI2MDgwKSwKKyAgICBESUNPKDB4NDk1MzRhODApLCBESUNPKDB4NGVhN2UxMDApLCBESUNPKDB4NTUwZDYzMDApLCBESUNPKDB4NWJjZGNjODApLAorICAgIERJQ08oMHgwNzJkZDA0OCksIERJQ08oMHgwYzY1NDY5MCksIERJQ08oMHgxNDM2ZTk0MCksIERJQ08oMHgxOTQ1OTY4MCksCisgICAgRElDTygweDFlMDA0MWMwKSwgRElDTygweDIyNDBkYzgwKSwgRElDTygweDI2ZGU0MDQwKSwgRElDTygweDJiNTA5YjAwKSwKKyAgICBESUNPKDB4MzA5ZDg3ODApLCBESUNPKDB4MzYxNTExODApLCBESUNPKDB4M2M2YzEyMDApLCBESUNPKDB4NDJkZjZiODApLAorICAgIERJQ08oMHg0YTE0NDQwMCksIERJQ08oMHg1MDU0MTI4MCksIERJQ08oMHg1NmMzNGI4MCksIERJQ08oMHg1Y2I2YzYwMCksCisgICAgRElDTygweDA1MWZlZjAwKSwgRElDTygweDA2YjlmYjQ4KSwgRElDTygweDBiNGY5Y2MwKSwgRElDTygweDE3ZTI3ODAwKSwKKyAgICBESUNPKDB4MWI4YzczNDApLCBESUNPKDB4MWY3NzJjYTApLCBESUNPKDB4MjQ3OGRjODApLCBESUNPKDB4MjgyNDIyNDApLAorICAgIERJQ08oMHgyZjI3YzY0MCksIERJQ08oMHgzM2IwM2U4MCksIERJQ08oMHgzODFmMjBjMCksIERJQ08oMHgzYzY2MmMwMCksCisgICAgRElDTygweDQ5NTY1MDgwKSwgRElDTygweDUyOWIwZjAwKSwgRElDTygweDU4M2VkMDgwKSwgRElDTygweDVkOGNlYzAwKSwKKyAgICBESUNPKDB4MDcxYzRkMTgpLCBESUNPKDB4MDk3ODUzYjApLCBESUNPKDB4MGYwZjA2OTApLCBESUNPKDB4MTU3YmY5ODApLAorICAgIERJQ08oMHgxODAxZjU4MCksIERJQ08oMHgxZGViMGMyMCksIERJQ08oMHgyNTIzZGE0MCksIERJQ08oMHgyODUzNDYwMCksCisgICAgRElDTygweDJlYjQ5OWMwKSwgRElDTygweDMyZWI1YWMwKSwgRElDTygweDM2NzQ5NTgwKSwgRElDTygweDNhNzQ4MjAwKSwKKyAgICBESUNPKDB4NDMyNWY3MDApLCBESUNPKDB4NTE1ZDgzMDApLCBESUNPKDB4NThhMTg3MDApLCBESUNPKDB4NWQ3MjIxMDApLAorICAgIERJQ08oMHgwNmNiY2Q4OCksIERJQ08oMHgwOGJiNjc0MCksIERJQ08oMHgwZGVhZDMxMCksIERJQ08oMHgxNTJmMGNjMCksCisgICAgRElDTygweDE4NDI3NjQwKSwgRElDTygweDFkOWYyZjIwKSwgRElDTygweDIyYmEzYjQwKSwgRElDTygweDI3MWE2ZTgwKSwKKyAgICBESUNPKDB4MmM2NzdlYzApLCBESUNPKDB4MzEwNjFiMDApLCBESUNPKDB4MzQ5ZWVmNDApLCBESUNPKDB4M2M1MzFiODApLAorICAgIERJQ08oMHg0YWVkMDU4MCksIERJQ08oMHg0ZjhiYmY4MCksIERJQ08oMHg1NGI3NDk4MCksIERJQ08oMHg1YmM5YjcwMCksCisgICAgRElDTygweDA0NjQxMGM4KSwgRElDTygweDA2NTIyYWIwKSwgRElDTygweDBiNjUyOGMwKSwgRElDTygweDBmOTRiZDkwKSwKKyAgICBESUNPKDB4MWE4ZjhiODApLCBESUNPKDB4MWVhNTc4MjApLCBESUNPKDB4MjMzZWUxODApLCBESUNPKDB4MjdiM2FjYzApLAorICAgIERJQ08oMHgyYmQxZDI0MCksIERJQ08oMHgyZmM0YmNjMCksIERJQ08oMHgzYTk4ZWE0MCksIERJQ08oMHg0M2QzZjUwMCksCisgICAgRElDTygweDQ5YjM3NTgwKSwgRElDTygweDRlMmFmZDAwKSwgRElDTygweDU1OTUzMzAwKSwgRElDTygweDVkMzZmNjAwKSwKKyAgICBESUNPKDB4MDVkMGY2YzgpLCBESUNPKDB4MDdlNTZkOTApLCBESUNPKDB4MGJlOTgwODApLCBESUNPKDB4MGY5NTZmMzApLAorICAgIERJQ08oMHgxMjU5YjNjMCksIERJQ08oMHgxZjA4YjI0MCksIERJQ08oMHgyNTAwOGMwMCksIERJQ08oMHgyOTAwYjE4MCksCisgICAgRElDTygweDMxZWE2ZjAwKSwgRElDTygweDM1MmQxZTAwKSwgRElDTygweDNjOTcwYzgwKSwgRElDTygweDQ1MjcxMjAwKSwKKyAgICBESUNPKDB4NGI2MzIyODApLCBESUNPKDB4NTA5OGE0ODApLCBESUNPKDB4NTY3MmZjODApLCBESUNPKDB4NWMxNjMxODApLAorICAgIERJQ08oMHgwNWJkODFhMCksIERJQ08oMHgwN2Q0YjhmMCksIERJQ08oMHgwY2UyMjRiMCksIERJQ08oMHgxMTBhYmUyMCksCisgICAgRElDTygweDEzZGZlYWMwKSwgRElDTygweDE3ZGVkYWUwKSwgRElDTygweDI1MzVjMGMwKSwgRElDTygweDJhMTlkYTgwKSwKKyAgICBESUNPKDB4MmU1MjI0YzApLCBESUNPKDB4MzhkZGVlYzApLCBESUNPKDB4M2RhOTlkODApLCBESUNPKDB4NDI3OTkxMDApLAorICAgIERJQ08oMHg0ODk3M2IwMCksIERJQ08oMHg0ZWE2Mjg4MCksIERJQ08oMHg1M2Y3N2U4MCksIERJQ08oMHg1YmQ5YzEwMCksCisgICAgRElDTygweDAzOTVjZDUwKSwgRElDTygweDA1ODI0NGI4KSwgRElDTygweDBhZjQ1NTIwKSwgRElDTygweDEzMjljZWEwKSwKKyAgICBESUNPKDB4MWEzOTcwYzApLCBESUNPKDB4MWQ5ZjJlMDApLCBESUNPKDB4MjE3MDQ0MDApLCBESUNPKDB4Mjc3YTM0YzApLAorICAgIERJQ08oMHgzMDIxNWI0MCksIERJQ08oMHgzMzg3NTA0MCksIERJQ08oMHgzYzE1OTg0MCksIERJQ08oMHg0NTJmZWEwMCksCisgICAgRElDTygweDQ5ODFkMjAwKSwgRElDTygweDRlMTVhOTgwKSwgRElDTygweDU0ZTg0NzgwKSwgRElDTygweDVjNzllYTAwKSwKKyAgICBESUNPKDB4MDU0MTNiOTgpLCBESUNPKDB4MDgxMzJhODApLCBESUNPKDB4MGRjN2YwNTApLCBESUNPKDB4MTNlMjU0NjApLAorICAgIERJQ08oMHgxNzg0YmY4MCksIERJQ08oMHgxZDYzMDIwMCksIERJQ08oMHgyMzhiYzg4MCksIERJQ08oMHgyOGNjMDg4MCksCisgICAgRElDTygweDMwZGExYTQwKSwgRElDTygweDM5MWUyMjAwKSwgRElDTygweDQxNWQ4ZDAwKSwgRElDTygweDQ4ZjEzMjgwKSwKKyAgICBESUNPKDB4NGUzMDAzMDApLCBESUNPKDB4NTJlNTY1ODApLCBESUNPKDB4NTg0OWZlODApLCBESUNPKDB4NWNkZWY0MDApLAorICAgIERJQ08oMHgwNGEwNThjOCksIERJQ08oMHgwNzU2OWI4OCksIERJQ08oMHgwZWYyNjYxMCksIERJQ08oMHgxMzIwODE0MCksCisgICAgRElDTygweDE2OGMwNTAwKSwgRElDTygweDFhZmVjMDgwKSwgRElDTygweDIyYTBhYmMwKSwgRElDTygweDJhMDU3ODgwKSwKKyAgICBESUNPKDB4MmZkMWM4NDApLCBESUNPKDB4MzcwM2M2ODApLCBESUNPKDB4M2QzMjZiODApLCBESUNPKDB4NDNkZjJlODApLAorICAgIERJQ08oMHg0YTZmOTAwMCksIERJQ08oMHg1MDkwMGQ4MCksIERJQ08oMHg1NmM3M2YwMCksIERJQ08oMHg1Y2MzZGE4MCksCisgICAgRElDTygweDA2NWM5OWU4KSwgRElDTygweDA5MDYwYzUwKSwgRElDTygweDBkMWVmMWMwKSwgRElDTygweDE2YmQ5MDIwKSwKKyAgICBESUNPKDB4MWEwNGRhZTApLCBESUNPKDB4MWUzYzA1ODApLCBESUNPKDB4MjU3ODM3MDApLCBESUNPKDB4Mjk3MTBhYzApLAorICAgIERJQ08oMHgzMDljYmI4MCksIERJQ08oMHgzNmM2NjI4MCksIERJQ08oMHgzYWRiMDU4MCksIERJQ08oMHg0MWIzN2UwMCksCisgICAgRElDTygweDQ5NmNhNzAwKSwgRElDTygweDRkYWI3NjAwKSwgRElDTygweDUyYmU2MjgwKSwgRElDTygweDU4ZmVjNDgwKSwKKyAgICBESUNPKDB4MDQ2NDA4ODApLCBESUNPKDB4MDVhNzVhYjgpLCBESUNPKDB4MGVkYmE0MTApLCBESUNPKDB4MTZlMDc2YTApLAorICAgIERJQ08oMHgxOThhY2VjMCksIERJQ08oMHgxZWI1ZmFlMCksIERJQ08oMHgyMjhjOTAwMCksIERJQ08oMHgyOTk4NmMwMCksCisgICAgRElDTygweDJjNzgwYzgwKSwgRElDTygweDM4MDc4ZGMwKSwgRElDTygweDNmNDJkYzAwKSwgRElDTygweDQ0MWJhOTAwKSwKKyAgICBESUNPKDB4NDkyZjgwODApLCBESUNPKDB4NGVkODVkMDApLCBESUNPKDB4NTQ2MDU4MDApLCBESUNPKDB4NWQxMDZhODApLAorICAgIERJQ08oMHgwNDVjYjk3MCksIERJQ08oMHgwNjI3YTgyOCksIERJQ08oMHgwZGIzNTI5MCksIERJQ08oMHgxNzc4Zjc4MCksCisgICAgRElDTygweDFhMjQzYzYwKSwgRElDTygweDIzYzJkZDQwKSwgRElDTygweDI3YzU3ODQwKSwgRElDTygweDJmNTNjZDgwKSwKKyAgICBESUNPKDB4MzZmNjU2MDApLCBESUNPKDB4M2JjMWIyYzApLCBESUNPKDB4NDBjMzY1MDApLCBESUNPKDB4NDYwNzQxODApLAorICAgIERJQ08oMHg0YjU1MWI4MCksIERJQ08oMHg1MGE5OTcwMCksIERJQ08oMHg1NjliNmM4MCksIERJQ08oMHg1Y2EyNTc4MCksCisgICAgRElDTygweDA1ZWYyODI4KSwgRElDTygweDA3ZDNhZGY4KSwgRElDTygweDBiNTQxNmQwKSwgRElDTygweDBmOWFkYjcwKSwKKyAgICBESUNPKDB4MTI2ZTczNjApLCBESUNPKDB4MWJhZmY0NjApLCBESUNPKDB4MmI1ZGVjYzApLCBESUNPKDB4MzEwMzYyMDApLAorICAgIERJQ08oMHgzNGNhNzUwMCksIERJQ08oMHgzOTY4MTM0MCksIERJQ08oMHgzZGE5NzEwMCksIERJQ08oMHg0MTYxZWUwMCksCisgICAgRElDTygweDQ2YTYyZTgwKSwgRElDTygweDRkMWI5MzgwKSwgRElDTygweDUzMGUwMzAwKSwgRElDTygweDU5ZmYwNDgwKSwKKyAgICBESUNPKDB4MDRmNWJjNTApLCBESUNPKDB4MDZlOTBkMTgpLCBESUNPKDB4MGMyYWY0ODApLCBESUNPKDB4MTIzZjc0MDApLAorICAgIERJQ08oMHgxNTMwYTE2MCksIERJQ08oMHgxOGFhM2RjMCksIERJQ08oMHgxY2MwYTI0MCksIERJQ08oMHgyY2RiMDJjMCksCisgICAgRElDTygweDMyOTA5YTAwKSwgRElDTygweDM2YmFlNjQwKSwgRElDTygweDNjOTE3YTgwKSwgRElDTygweDQwMTIxOTAwKSwKKyAgICBESUNPKDB4NDhhOTBkODApLCBESUNPKDB4NTFjY2MxODApLCBESUNPKDB4NTg4NGVhMDApLCBESUNPKDB4NWRiYzQyODApLAorICAgIERJQ08oMHgwNTc5MTQxMCksIERJQ08oMHgwN2IwZGQ4MCksIERJQ08oMHgwYmVjNDE5MCksIERJQ08oMHgxM2MzMDUyMCksCisgICAgRElDTygweDE3YWMxOTAwKSwgRElDTygweDFiNmYxZDAwKSwgRElDTygweDI2ZTU0ZjQwKSwgRElDTygweDJkNGE4MDQwKSwKKyAgICBESUNPKDB4MzExYzY4NDApLCBESUNPKDB4MzhlYzQxODApLCBESUNPKDB4M2YwYzQzNDApLCBESUNPKDB4NDI3YzViMDApLAorICAgIERJQ08oMHg0ODg2ZTQ4MCksIERJQ08oMHg1MDRhMGIwMCksIERJQ08oMHg1NmQ0ODcwMCksIERJQ08oMHg1YzgwZjYwMCksCisgICAgRElDTygweDA0YjU4ODgwKSwgRElDTygweDA3NDNmMGQ4KSwgRElDTygweDBiZTk1ZTIwKSwgRElDTygweDBmZDBkOWIwKSwKKyAgICBESUNPKDB4MWMyZTExYTApLCBESUNPKDB4MjI0MWFmODApLCBESUNPKDB4Mjk2ZTgzYzApLCBESUNPKDB4MmYxNmFkYzApLAorICAgIERJQ08oMHgzMmNkNmZjMCksIERJQ08oMHgzNzRkZGVjMCksIERJQ08oMHgzZGE5NWY4MCksIERJQ08oMHg0NWQ1NmM4MCksCisgICAgRElDTygweDRjNmFmYTgwKSwgRElDTygweDUxNDFmMzgwKSwgRElDTygweDU2MTZiMzgwKSwgRElDTygweDVjNThmNTgwKSwKKyAgICBESUNPKDB4MDNmNGIzNjgpLCBESUNPKDB4MDU5Mzk4OTApLCBESUNPKDB4MDlkOTU0ODApLCBESUNPKDB4MTIyY2FjNjApLAorICAgIERJQ08oMHgxN2UyN2UwMCksIERJQ08oMHgxZjlkYzY4MCksIERJQ08oMHgyNmUyNjY4MCksIERJQ08oMHgyYWU2NDA0MCksCisgICAgRElDTygweDJkZDZjZjQwKSwgRElDTygweDMyOTVjNDAwKSwgRElDTygweDNlMjNiNDAwKSwgRElDTygweDQ0ZmQwMzgwKSwKKyAgICBESUNPKDB4NGFkN2E3MDApLCBESUNPKDB4NTEyOTVlODApLCBESUNPKDB4NTk0YTk0MDApLCBESUNPKDB4NWU0MWFhMDApLAorICAgIERJQ08oMHgwNDI0YjlkOCksIERJQ08oMHgwNWIzMDUwOCksIERJQ08oMHgwOTM4MGYyMCksIERJQ08oMHgwYzk1MDljMCksCisgICAgRElDTygweDE4NzMwODYwKSwgRElDTygweDIxOWE5ZDQwKSwgRElDTygweDI0ZjY5OWMwKSwgRElDTygweDI4OWIyNjgwKSwKKyAgICBESUNPKDB4MmNiNjIyNDApLCBESUNPKDB4MzZlODgxODApLCBESUNPKDB4M2U5Njg4MDApLCBESUNPKDB4NDgwNTNjODApLAorICAgIERJQ08oMHg0ZDZkY2E4MCksIERJQ08oMHg1MWQ5YTU4MCksIERJQ08oMHg1NjNlNWE4MCksIERJQ08oMHg1YzBiMmI4MCksCisgICAgRElDTygweDAzNDU2YWU4KSwgRElDTygweDA0ZTQ5OTQ4KSwgRElDTygweDA3ZGQwZTg4KSwgRElDTygweDBlZDVjZDMwKSwKKyAgICBESUNPKDB4MWIwNmU5ODApLCBESUNPKDB4MWRlMmI5YzApLCBESUNPKDB4MjExNjA1NDApLCBESUNPKDB4MjcwYTgyNDApLAorICAgIERJQ08oMHgzMzUyYTI4MCksIERJQ08oMHgzYjhiNmMwMCksIERJQ08oMHg0MDI0MTQwMCksIERJQ08oMHg0M2Y2MGY4MCksCisgICAgRElDTygweDRhODk3OTAwKSwgRElDTygweDUxNjkyYTAwKSwgRElDTygweDU3NDQ5ZDAwKSwgRElDTygweDVkNDk3NDgwKSwKKyAgICBESUNPKDB4MDRiOTQyOTApLCBESUNPKDB4MDY3ZTk5ZDApLCBESUNPKDB4MGFiMDY4NDApLCBESUNPKDB4MGU2OTcwNzApLAorICAgIERJQ08oMHgxNzQ1YzQ2MCksIERJQ08oMHgyMmVlODA0MCksIERJQ08oMHgyNjQ3ZThjMCksIERJQ08oMHgyYmMyYzY4MCksCisgICAgRElDTygweDJmZDU3ZDAwKSwgRElDTygweDM3MTg2NjgwKSwgRElDTygweDNkMDc0NTAwKSwgRElDTygweDQxMmIyODAwKSwKKyAgICBESUNPKDB4NDU3OWFmMDApLCBESUNPKDB4NGNhZmY5ODApLCBESUNPKDB4NTU3YWRkMDApLCBESUNPKDB4NWM2YWU3ODApLAorICAgIERJQ08oMHgwNDIzYTA5MCksIERJQ08oMHgwNWI5YmNhMCksIERJQ08oMHgwOTFiNDVkMCksIERJQ08oMHgwYzViNmQ2MCksCisgICAgRElDTygweDE5NGRkMWMwKSwgRElDTygweDFmYzg1MDIwKSwgRElDTygweDI0ODZiMDgwKSwgRElDTygweDI5MjBhZjgwKSwKKyAgICBESUNPKDB4MmRkNGYxNDApLCBESUNPKDB4MzU5OGJlNDApLCBESUNPKDB4M2I5YzE0NDApLCBESUNPKDB4NDJkMTkyODApLAorICAgIERJQ08oMHg0YTMxNDI4MCksIERJQ08oMHg1MGIwMGEwMCksIERJQ08oMHg1NmM1NTQwMCksIERJQ08oMHg1ZDViYTMwMCksCisgICAgRElDTygweDAzZTY4YjI4KSwgRElDTygweDA1YTdiMTkwKSwgRElDTygweDA5MTdmMDAwKSwgRElDTygweDBkMjQ3MDUwKSwKKyAgICBESUNPKDB4MTllNjM3YTApLCBESUNPKDB4MjIyMWE1NDApLCBESUNPKDB4Mjc3N2U1NDApLCBESUNPKDB4MmMxMDMzODApLAorICAgIERJQ08oMHgzMGMyZTA0MCksIERJQ08oMHgzODlmMTI0MCksIERJQ08oMHgzZjRhMmM4MCksIERJQ08oMHg0NTRhNGMwMCksCisgICAgRElDTygweDRiMGFiNjgwKSwgRElDTygweDUwY2Y2MDAwKSwgRElDTygweDU3MWMwNzAwKSwgRElDTygweDVkMmVmNjAwKSwKKyAgICBESUNPKDB4MDQ4ODZmMTgpLCBESUNPKDB4MDY1MTAzZTgpLCBESUNPKDB4MGE2MDdkNDApLCBESUNPKDB4MGRiOTE5NjApLAorICAgIERJQ08oMHgxMzU0NmYyMCksIERJQ08oMHgyMmY1ZTIwMCksIERJQ08oMHgyNzA2NDI0MCksIERJQ08oMHgyZTM3MWQ0MCksCisgICAgRElDTygweDMzNjU5MjQwKSwgRElDTygweDM4YWExYzQwKSwgRElDTygweDQxN2JiMjgwKSwgRElDTygweDQ3Y2E5NDgwKSwKKyAgICBESUNPKDB4NGRkNmZiODApLCBESUNPKDB4NTI4ZTM0ODApLCBESUNPKDB4NTdjNDlkODApLCBESUNPKDB4NWNjOTgxMDApLAorICAgIERJQ08oMHgwMmRiMjM3MCksIERJQ08oMHgwNDM5ODg0OCksIERJQ08oMHgwN2E4ZGEzOCksIERJQ08oMHgxMGI5MDI4MCksCisgICAgRElDTygweDFhMmE0YTIwKSwgRElDTygweDIwYjFmNjQwKSwgRElDTygweDI3NzA5NmMwKSwgRElDTygweDJkYzU2OGMwKSwKKyAgICBESUNPKDB4MzQxYjMzYzApLCBESUNPKDB4M2EwMDA2NDApLCBESUNPKDB4NDAxNTI4ODApLCBESUNPKDB4NDVlZWVlMDApLAorICAgIERJQ08oMHg0YzA4YzQ4MCksIERJQ08oMHg1MWJmMDYwMCksIERJQ08oMHg1Nzk5YTE4MCksIERJQ08oMHg1ZDIzZGI4MCksCisgICAgRElDTygweDA0N2IxNDk4KSwgRElDTygweDA2MDg5ODQ4KSwgRElDTygweDA5MDVhZjIwKSwgRElDTygweDBiZjEzYzIwKSwKKyAgICBESUNPKDB4MTFmY2Y2MjApLCBESUNPKDB4MWY3OWNkMDApLCBESUNPKDB4MjU3ZjZiNDApLCBESUNPKDB4MmNmYzI2MDApLAorICAgIERJQ08oMHgzMTYxMDA0MCksIERJQ08oMHgzNWVhODI4MCksIERJQ08oMHgzYzc3NGJjMCksIERJQ08oMHg0NDQxNzI4MCksCisgICAgRElDTygweDRiNDMyNTAwKSwgRElDTygweDUxMGU5NDgwKSwgRElDTygweDU2ZjJlNDgwKSwgRElDTygweDVkMjgyNzgwKSwKKyAgICBESUNPKDB4MDJjZmQwYjApLCBESUNPKDB4MDQyODQ1ZDgpLCBESUNPKDB4MGExZmE2MTApLCBESUNPKDB4MTU5MTFmYzApLAorICAgIERJQ08oMHgxYmMwN2YwMCksIERJQ08oMHgyMjgxZDY0MCksIERJQ08oMHgyODdhYmNjMCksIERJQ08oMHgyZWM2YjQwMCksCisgICAgRElDTygweDM0YTBkMDQwKSwgRElDTygweDNhYTRkY2MwKSwgRElDTygweDQwNzRkOTgwKSwgRElDTygweDQ2NzI2YjgwKSwKKyAgICBESUNPKDB4NGMzYmY5MDApLCBESUNPKDB4NTIwNTUxMDApLCBESUNPKDB4NTdiMjA1MDApLCBESUNPKDB4NWQzNGRhODApLAorICAgIERJQ08oMHgwNGQ0Zjc2OCksIERJQ08oMHgwNmNhZDgyOCksIERJQ08oMHgwYjUyYTU0MCksIERJQ08oMHgwZWEyMjRlMCksCisgICAgRElDTygweDEzYzNmNDYwKSwgRElDTygweDIzODA4OTAwKSwgRElDTygweDI3ZDFjZWMwKSwgRElDTygweDJkNjA1MWMwKSwKKyAgICBESUNPKDB4MzNjNWZmMDApLCBESUNPKDB4MzdlZjI0NDApLCBESUNPKDB4M2QyYTUzMDApLCBESUNPKDB4NDMyNjYwMDApLAorICAgIERJQ08oMHg0YTUzYTEwMCksIERJQ08oMHg1MGFjY2U4MCksIERJQ08oMHg1NzYxMjEwMCksIERJQ08oMHg1Y2RlZTM4MCksCisgICAgRElDTygweDA0MDM5YTg4KSwgRElDTygweDA2MjZkY2IwKSwgRElDTygweDBjMDU5NjIwKSwgRElDTygweDEyYzNkYjIwKSwKKyAgICBESUNPKDB4MWJiOWViNDApLCBESUNPKDB4MjQwZmRhMDApLCBESUNPKDB4MmJhYWI4NDApLCBESUNPKDB4MzE3N2M1YzApLAorICAgIERJQ08oMHgzNmNmMmU0MCksIERJQ08oMHgzYzAyNTEwMCksIERJQ08oMHg0MGJiOGQwMCksIERJQ08oMHg0NTk2MDgwMCksCisgICAgRElDTygweDRhZGFjYTAwKSwgRElDTygweDUwNWE3MzAwKSwgRElDTygweDU2NmE2NDAwKSwgRElDTygweDVjOGNlMDAwKSwKKyAgICBESUNPKDB4MDYyODkxZTgpLCBESUNPKDB4MDk2ODA4MTApLCBESUNPKDB4MGU5YTExYjApLCBESUNPKDB4MTUyM2UzMjApLAorICAgIERJQ08oMHgxYzU3ZGIwMCksIERJQ08oMHgyMWYyMmM4MCksIERJQ08oMHgyOGFlZWIwMCksIERJQ08oMHgyZTRmZDYwMCksCisgICAgRElDTygweDM0MWNmMDAwKSwgRElDTygweDNhNTAzNGMwKSwgRElDTygweDQwNjAwZjgwKSwgRElDTygweDQ2MWZkZTAwKSwKKyAgICBESUNPKDB4NGMzNjg0ODApLCBESUNPKDB4NTFkYmJjMDApLCBESUNPKDB4NTc3MDk3ODApLCBESUNPKDB4NWNjZTk4ODApLAorICAgIERJQ08oMHgwNWQ0MWY3MCksIERJQ08oMHgwYTY1YmIzMCksIERJQ08oMHgxMzJkZGZhMCksIERJQ08oMHgxN2QyNjgyMCksCisgICAgRElDTygweDFlNmQ4MzgwKSwgRElDTygweDI0ZTY4ZGMwKSwgRElDTygweDJiNjhjNGMwKSwgRElDTygweDMwZmEyODgwKSwKKyAgICBESUNPKDB4MzYxOTk4YzApLCBESUNPKDB4M2FhMWQ2NDApLCBESUNPKDB4M2Y5NDI0MDApLCBESUNPKDB4NDRkMTE2ODApLAorICAgIERJQ08oMHg0YWI4ZTU4MCksIERJQ08oMHg1MDY0M2I4MCksIERJQ08oMHg1Njk3ZmUwMCksIERJQ08oMHg1Y2IzYTc4MCksCisgICAgRElDTygweDA3MDdmYTEwKSwgRElDTygweDBjYjhiZWIwKSwgRElDTygweDE1MDExZDIwKSwgRElDTygweDFhNGFkMzAwKSwKKyAgICBESUNPKDB4MjA5OTcwODApLCBESUNPKDB4MjZkYmUyNDApLCBESUNPKDB4MmQ5MDc4ODApLCBESUNPKDB4MzMwN2EzYzApLAorICAgIERJQ08oMHgzODgxOTc0MCksIERJQ08oMHgzZDNlODljMCksIERJQ08oMHg0MWVhMjMwMCksIERJQ08oMHg0NjljZTIwMCksCisgICAgRElDTygweDRiZTYxNjgwKSwgRElDTygweDUxMjYxYjgwKSwgRElDTygweDU3MTZlZjgwKSwgRElDTygweDVjYmEyOTAwKSwKKyAgICBESUNPKDB4MDg0ZGM4MzApLCBESUNPKDB4MGYxNmY2MTApLCBESUNPKDB4MTZjYTI0MjApLCBESUNPKDB4MWJiNTgzODApLAorICAgIERJQ08oMHgyMmYwMGYwMCksIERJQ08oMHgyOTZiYTRjMCksIERJQ08oMHgzMDZkMjYwMCksIERJQ08oMHgzNjJjYTA4MCksCisgICAgRElDTygweDNiODZkMjgwKSwgRElDTygweDNmZmE5NmMwKSwgRElDTygweDQ0NmE1MzAwKSwgRElDTygweDQ4ZDBmZDAwKSwKKyAgICBESUNPKDB4NGQ4YTA4MDApLCBESUNPKDB4NTI1YmYyMDApLCBESUNPKDB4NTdmNWFhMDApLCBESUNPKDB4NWQ1Njk0ODApLAorICAgIERJQ08oMHgwOGQ2NjRmMCksIERJQ08oMHgxMTBjODUyMCksIERJQ08oMHgxODY1ZmE0MCksIERJQ08oMHgxZWZlMzE2MCksCisgICAgRElDTygweDI2ZjM4NzQwKSwgRElDTygweDJkNDYwOGMwKSwgRElDTygweDMyODYyNTAwKSwgRElDTygweDM3NGY4ODQwKSwKKyAgICBESUNPKDB4M2JmYTk5MDApLCBESUNPKDB4M2ZmNWM4YzApLCBESUNPKDB4NDQ1MGM1MDApLCBESUNPKDB4NDkxOGU2ODApLAorICAgIERJQ08oMHg0ZTFkMGYwMCksIERJQ08oMHg1MzM0MjYwMCksIERJQ08oMHg1OGEzOGUwMCksIERJQ08oMHg1ZGJiZmYwMCksCisgICAgRElDTygweDA5MTQzZmQwKSwgRElDTygweDBmNDAxYzMwKSwgRElDTygweDE2OWMxZWUwKSwgRElDTygweDFiY2ZiMjgwKSwKKyAgICBESUNPKDB4MjE5MGRkMDApLCBESUNPKDB4MjdiZjU2YzApLCBESUNPKDB4MmU4ZTA2NDApLCBESUNPKDB4MzRiNjcwODApLAorICAgIERJQ08oMHgzYjUzNGRjMCksIERJQ08oMHg0MTEzNGMwMCksIERJQ08oMHg0NjdhMzI4MCksIERJQ08oMHg0YmQ2MzYwMCksCisgICAgRElDTygweDUwZGU4NzAwKSwgRElDTygweDU1NjU3NTgwKSwgRElDTygweDVhMGNlZjAwKSwgRElDTygweDVlOGFhMjAwKSwKKyAgICBESUNPKDB4MDZiNWQ4NjApLCBESUNPKDB4MGM4YTUwMDApLCBESUNPKDB4MTMzNDM2MjApLCBESUNPKDB4MTdhMmFiZTApLAorICAgIERJQ08oMHgxY2FmNzM0MCksIERJQ08oMHgyMmEzZjc0MCksIERJQ08oMHgyOTA1OTk4MCksIERJQ08oMHgyZWNmZjg4MCksCisgICAgRElDTygweDM0Y2UwZjAwKSwgRElDTygweDNhZDMyMjgwKSwgRElDTygweDQwZjA4ZDgwKSwgRElDTygweDQ2ZDFkNDAwKSwKKyAgICBESUNPKDB4NGNhOWRmMDApLCBESUNPKDB4NTIzYjk1ODApLCBESUNPKDB4NTdlYTliODApLCBESUNPKDB4NWQ0YTlhMDApLAorICAgIERJQ08oMHgwMzgyMmZlYyksIERJQ08oMHgwNTIyYzY3MCksIERJQ08oMHgwOTlmODlhMCksIERJQ08oMHgxMmRkYzljMCksCisgICAgRElDTygweDE3YzNkMzgwKSwgRElDTygweDFkMjdlYzIwKSwgRElDTygweDIyMTllNDgwKSwgRElDTygweDI1ZmRmNTgwKSwKKyAgICBESUNPKDB4MzI5ZDY1MDApLCBESUNPKDB4MzY4YmEwNDApLCBESUNPKDB4M2FmZWRiMDApLCBESUNPKDB4NDMwZGI5ODApLAorICAgIERJQ08oMHg0YTEwNTM4MCksIERJQ08oMHg1MTIwNTA4MCksIERJQ08oMHg1NjczYjg4MCksIERJQ08oMHg1Y2EyZTUwMCksCisgICAgRElDTygweDA0ZTA3NDA4KSwgRElDTygweDA2YTEzZGMwKSwgRElDTygweDBiMzFjNzgwKSwgRElDTygweDBlNjdmY2QwKSwKKyAgICBESUNPKDB4MTM3MjMyNDApLCBESUNPKDB4MWY4N2E4NDApLCBESUNPKDB4MjMyMWFiMDApLCBESUNPKDB4MmM2MDQ2ODApLAorICAgIERJQ08oMHgzMTBiYzE4MCksIERJQ08oMHgzNTFlZWE0MCksIERJQ08oMHgzYTJkNjQ0MCksIERJQ08oMHgzZTdlYmFjMCksCisgICAgRElDTygweDQ3OThlZjgwKSwgRElDTygweDUwNzIxMTAwKSwgRElDTygweDU3ZmY5ODgwKSwgRElDTygweDVkYzJlMDgwKSwKKyAgICBESUNPKDB4MDVkNjI2YjgpLCBESUNPKDB4MDdlYWYxNDApLCBESUNPKDB4MGM1Njc1YjApLCBESUNPKDB4MGViYTdiMDApLAorICAgIERJQ08oMHgxYTdmMzZjMCksIERJQ08oMHgxZjk2OTIwMCksIERJQ08oMHgyNDRkOGMwMCksIERJQ08oMHgyOTY2NjQ0MCksCisgICAgRElDTygweDJjOTRiMTAwKSwgRElDTygweDMxODY1MzgwKSwgRElDTygweDM3MTNjMDAwKSwgRElDTygweDNjMjI4ZjQwKSwKKyAgICBESUNPKDB4NDI5NmVkODApLCBESUNPKDB4NGRjYmRlMDApLCBESUNPKDB4NTYwNTlhMDApLCBESUNPKDB4NWM5MzJkMDApLAorICAgIERJQ08oMHgwN2RjZWIyMCksIERJQ08oMHgwYjUzM2ZlMCksIERJQ08oMHgwZWIxODg4MCksIERJQ08oMHgxMzEyNDIyMCksCisgICAgRElDTygweDE2N2Y3NGUwKSwgRElDTygweDFhZmJlZTQwKSwgRElDTygweDIyOWUyZjgwKSwgRElDTygweDI2YjA1ZWMwKSwKKyAgICBESUNPKDB4MmM3YjQwNDApLCBESUNPKDB4MzI4MDYxNDApLCBESUNPKDB4MzhkYTY1NDApLCBESUNPKDB4M2U0OTU1NDApLAorICAgIERJQ08oMHg0NDRkMzg4MCksIERJQ08oMHg0ZTc4NDQwMCksIERJQ08oMHg1ODY1ZjU4MCksIERJQ08oMHg1ZTYxNjE4MCksCisgICAgRElDTygweDA2Mzk1NzkwKSwgRElDTygweDA4NGI4ZjIwKSwgRElDTygweDBkMGUyNmEwKSwgRElDTygweDEwODk3YWMwKSwKKyAgICBESUNPKDB4MTRiY2QwODApLCBESUNPKDB4MWM1YmFiZTApLCBESUNPKDB4MjEwOGY5YzApLCBESUNPKDB4Mjc0ZjhlODApLAorICAgIERJQ08oMHgyYjBiYTE4MCksIERJQ08oMHgzMDViODQ4MCksIERJQ08oMHgzODNhZDMwMCksIERJQ08oMHgzZTM0ZjQ0MCksCisgICAgRElDTygweDQ3ZjdhYTAwKSwgRElDTygweDRmZGI1ODgwKSwgRElDTygweDU2YjhjMjgwKSwgRElDTygweDVkMDdkNzAwKSwKKyAgICBESUNPKDB4MDUxZjA4ODApLCBESUNPKDB4MDcxYjhmYTgpLCBESUNPKDB4MGNlNzljOTApLCBESUNPKDB4MTAwNWJkNjApLAorICAgIERJQ08oMHgxNGE0YTA4MCksIERJQ08oMHgxODNkZWY0MCksIERJQ08oMHgxZWU4ZDBhMCksIERJQ08oMHgyYzViOWJjMCksCisgICAgRElDTygweDMwOWY5ZGMwKSwgRElDTygweDM1NjU5MzgwKSwgRElDTygweDNjMDQzOWMwKSwgRElDTygweDQ5NjAzODAwKSwKKyAgICBESUNPKDB4NTAxOGE4MDApLCBESUNPKDB4NTQ4NjIzODApLCBESUNPKDB4NTkzZWRkODApLCBESUNPKDB4NWQ0MTViODApLAorICAgIERJQ08oMHgwNTFjODEwOCksIERJQ08oMHgwNmJkOTdkOCksIERJQ08oMHgwYjQ3ZDAzMCksIERJQ08oMHgwZDljODFhMCksCisgICAgRElDTygweDE3OGYwYmUwKSwgRElDTygweDFjZGY3YzgwKSwgRElDTygweDIxODNkYjQwKSwgRElDTygweDI2ZWM3MTgwKSwKKyAgICBESUNPKDB4MmEzODU2YzApLCBESUNPKDB4MzY2YzliNDApLCBESUNPKDB4M2QzNjExYzApLCBESUNPKDB4NDI3ODgxMDApLAorICAgIERJQ08oMHg0OTgxZjIwMCksIERJQ08oMHg0ZGQ2ODM4MCksIERJQ08oMHg1NTI4NmEwMCksIERJQ08oMHg1Y2M3MjUwMCksCisgICAgRElDTygweDA2ZWU1OGM4KSwgRElDTygweDA5OGIxMzEwKSwgRElDTygweDBjY2JkODgwKSwgRElDTygweDBmOWQ2OGYwKSwKKyAgICBESUNPKDB4MTI3N2FjNDApLCBESUNPKDB4MWQ3MWZhYTApLCBESUNPKDB4MjMwZDk0ODApLCBESUNPKDB4Mjc2YjhjMDApLAorICAgIERJQ08oMHgyZWM3NzAwMCksIERJQ08oMHgzMWYyYTcwMCksIERJQ08oMHgzYmVlMDIwMCksIERJQ08oMHg0MjI1MDcwMCksCisgICAgRElDTygweDQ2NmI3MTAwKSwgRElDTygweDRkZTQxOTgwKSwgRElDTygweDU2YTA4ZDgwKSwgRElDTygweDVkNzAwODgwKSwKKyAgICBESUNPKDB4MDYyZjFkODApLCBESUNPKDB4MDkxYmNkMzApLCBESUNPKDB4MGNkODc1ZTApLCBESUNPKDB4MGZkNDJlNjApLAorICAgIERJQ08oMHgxMzIyYjk4MCksIERJQ08oMHgxZjExYjQ4MCksIERJQ08oMHgyNjUxZTVjMCksIERJQ08oMHgyOWY5YjQ4MCksCisgICAgRElDTygweDJlMjM4ODQwKSwgRElDTygweDMwZmM1OGMwKSwgRElDTygweDM3YWEzMDQwKSwgRElDTygweDNlOWFjNTgwKSwKKyAgICBESUNPKDB4NDRjNmZkMDApLCBESUNPKDB4NGViYTQzMDApLCBESUNPKDB4NTZmZGFkMDApLCBESUNPKDB4NWQ4ODU3MDApLAorICAgIERJQ08oMHgwNDIxM2E3OCksIERJQ08oMHgwNWQwMjhjMCksIERJQ08oMHgwOWExZjllMCksIERJQ08oMHgwZDI4YWU5MCksCisgICAgRElDTygweDE1MTgxOWEwKSwgRElDTygweDFjNzhjODYwKSwgRElDTygweDIxZDc4ZjAwKSwgRElDTygweDI5OTkyY2MwKSwKKyAgICBESUNPKDB4MmZiZGMxODApLCBESUNPKDB4MzZiYWI3MDApLCBESUNPKDB4M2Q0ZGIxYzApLCBESUNPKDB4NDQwMmEyODApLAorICAgIERJQ08oMHg0YTkyMDcwMCksIERJQ08oMHg1MDk4ODYwMCksIERJQ08oMHg1NzE3YzEwMCksIERJQ08oMHg1ZDUyYzIwMCksCisgICAgRElDTygweDAzNmFmNGJjKSwgRElDTygweDA1MTRjZjQwKSwgRElDTygweDA5ZWMyZDMwKSwgRElDTygweDExM2RlMTYwKSwKKyAgICBESUNPKDB4MTk5MWI3MDApLCBESUNPKDB4MjA1OTBiYzApLCBESUNPKDB4MjM4OTJhMDApLCBESUNPKDB4MjY1NGNkMDApLAorICAgIERJQ08oMHgyZmY1YzBjMCksIERJQ08oMHgzODdlZDM4MCksIERJQ08oMHgzZTMwNTMwMCksIERJQ08oMHg0NjEzNzcwMCksCisgICAgRElDTygweDRiYzI5MTAwKSwgRElDTygweDRmOTZkZDgwKSwgRElDTygweDU2NGFjYTAwKSwgRElDTygweDVjNGQ5ZTgwKSwKKyAgICBESUNPKDB4MDQxMDUxYTApLCBESUNPKDB4MDczNGRhZDgpLCBESUNPKDB4MTA2NGU3ODApLCBESUNPKDB4MTRkOGJmMDApLAorICAgIERJQ08oMHgxOTcyN2U0MCksIERJQ08oMHgxZjdiZWRlMCksIERJQ08oMHgyNWI1ZWJjMCksIERJQ08oMHgyYzcxZmQ0MCksCisgICAgRElDTygweDMyODEzNzQwKSwgRElDTygweDM5MzQwYzgwKSwgRElDTygweDNmOTc0ZjQwKSwgRElDTygweDQ1Y2ExNTgwKSwKKyAgICBESUNPKDB4NGJlNjlmMDApLCBESUNPKDB4NTFjOWM5MDApLCBESUNPKDB4NTdhMWNlODApLCBESUNPKDB4NWQwYjJiMDApLAorICAgIERJQ08oMHgwNGI3MzAwOCksIERJQ08oMHgwNjU5OGI2MCksIERJQ08oMHgwYjBhZWUwMCksIERJQ08oMHgxNWFjN2JhMCksCisgICAgRElDTygweDE4YjVlMzQwKSwgRElDTygweDFmNTMwOGMwKSwgRElDTygweDIzY2ZjNGMwKSwgRElDTygweDI3ZDNmZGMwKSwKKyAgICBESUNPKDB4MzAxMzgwODApLCBESUNPKDB4MzQzYzg1YzApLCBESUNPKDB4Mzg5Y2I1NDApLCBESUNPKDB4NDJkZWY5MDApLAorICAgIERJQ08oMHg0YWE2YTAwMCksIERJQ08oMHg0ZjcxOTU4MCksIERJQ08oMHg1NTg1ZDA4MCksIERJQ08oMHg1YmMwM2YwMCksCisgICAgRElDTygweDA1NjAxYjg4KSwgRElDTygweDA3NjE2Yjg4KSwgRElDTygweDBjMjJiYTQwKSwgRElDTygweDE2YmM4MjAwKSwKKyAgICBESUNPKDB4MTkyZWJmODApLCBESUNPKDB4MWY3MWMxMjApLCBESUNPKDB4MjVjNTlkMDApLCBESUNPKDB4MjhmNzZkMDApLAorICAgIERJQ08oMHgzM2RiZGQ4MCksIERJQ08oMHgzOWY0MGQ4MCksIERJQ08oMHgzZGEwYzg4MCksIERJQ08oMHg0MzJjMWUwMCksCisgICAgRElDTygweDRhYTE5ZDgwKSwgRElDTygweDUxMDA2ZjgwKSwgRElDTygweDU2YTYyZTgwKSwgRElDTygweDVjNjdkMDAwKSwKKyAgICBESUNPKDB4MDUzMDk1ZDApLCBESUNPKDB4MDZjNDNmYzgpLCBESUNPKDB4MGY4MGE0NjApLCBESUNPKDB4MTM5YjQ5NjApLAorICAgIERJQ08oMHgxNzY5ZWQ4MCksIERJQ08oMHgxYzgyOGIwMCksIERJQ08oMHgyMTE5NTk4MCksIERJQ08oMHgyNjMyOTgwMCksCisgICAgRElDTygweDI5ZjM1OTAwKSwgRElDTygweDJkYzlkZjgwKSwgRElDTygweDM3OTVmMGMwKSwgRElDTygweDQzMTM5YjAwKSwKKyAgICBESUNPKDB4NGFjYWU2ODApLCBESUNPKDB4NTA0OGRlMDApLCBESUNPKDB4NTdjMTE4ODApLCBESUNPKDB4NWRiMzU5MDApLAorICAgIERJQ08oMHgwNDY2ZTE4MCksIERJQ08oMHgwNWQzMTU1MCksIERJQ08oMHgxMGNhZDIwMCksIERJQ08oMHgxNjhjMmJlMCksCisgICAgRElDTygweDFhNWU5NTgwKSwgRElDTygweDFlZjJkNDgwKSwgRElDTygweDIzOGRiMjQwKSwgRElDTygweDI5MjBjZTgwKSwKKyAgICBESUNPKDB4MmM4MGI0YzApLCBESUNPKDB4MzBiYjI3MDApLCBESUNPKDB4MzhiMjU3YzApLCBESUNPKDB4NDZhYmQ1ODApLAorICAgIERJQ08oMHg0YzMwZGQ4MCksIERJQ08oMHg1MGU1MTg4MCksIERJQ08oMHg1NzgyYWI4MCksIERJQ08oMHg1ZDIzZGE4MCksCisgICAgRElDTygweDA2NzAwZjc4KSwgRElDTygweDA4NWVjMGEwKSwgRElDTygweDBjMDM3MjgwKSwgRElDTygweDE2ZDkwYTYwKSwKKyAgICBESUNPKDB4MWJmNDZjMDApLCBESUNPKDB4MWU2ZjQ3NDApLCBESUNPKDB4MjJjMmMxODApLCBESUNPKDB4MjYzZmEyYzApLAorICAgIERJQ08oMHgyYzRhNzRjMCksIERJQ08oMHgzNjQyYjA0MCksIERJQ08oMHgzYTQ3NjkwMCksIERJQ08oMHgzZWExMjg0MCksCisgICAgRElDTygweDQ2YjZlODgwKSwgRElDTygweDRiNWJhZDgwKSwgRElDTygweDUxNTJhNTAwKSwgRElDTygweDVjMWM2MDgwKSwKKyAgICBESUNPKDB4MDQxZjgxMDgpLCBESUNPKDB4MDVlZjFkOTgpLCBESUNPKDB4MGNlNDMzMDApLCBESUNPKDB4MTE2NDdjYzApLAorICAgIERJQ08oMHgxNmU3N2ZlMCksIERJQ08oMHgxY2RhZmM0MCksIERJQ08oMHgyMTg4MzJjMCksIERJQ08oMHgyNmRkMWI0MCksCisgICAgRElDTygweDJjNzc2MTAwKSwgRElDTygweDM0ZjFlYjgwKSwgRElDTygweDNjYWY2MTAwKSwgRElDTygweDQ1NjMwYTgwKSwKKyAgICBESUNPKDB4NGMwYzUzODApLCBESUNPKDB4NTE3YWU5ODApLCBESUNPKDB4NTY3ZjQyODApLCBESUNPKDB4NWM0YmY5MDApLAorICAgIERJQ08oMHgwNjY3M2YxOCksIERJQ08oMHgwOTFlZTUxMCksIERJQ08oMHgwZDZjY2IxMCksIERJQ08oMHgxMjUwMzI0MCksCisgICAgRElDTygweDE1ODY5NmUwKSwgRElDTygweDFmMDM1NDIwKSwgRElDTygweDI0ZTZlYWMwKSwgRElDTygweDJhMDNiZjQwKSwKKyAgICBESUNPKDB4MzI5YWEwMDApLCBESUNPKDB4Mzc1YWFmYzApLCBESUNPKDB4M2RhMTMzYzApLCBESUNPKDB4NDU2NDU2MDApLAorICAgIERJQ08oMHg0YzQ0N2MwMCksIERJQ08oMHg1MWEyNmIwMCksIERJQ08oMHg1NzkxN2MwMCksIERJQ08oMHg1YzU1NzY4MCksCisgICAgRElDTygweDA0Zjg0YzE4KSwgRElDTygweDA2ZGI0YzMwKSwgRElDTygweDBkNTNhOTQwKSwgRElDTygweDEwOTVjZDIwKSwKKyAgICBESUNPKDB4MTQyYjBiMjApLCBESUNPKDB4MTg0MjI5YzApLCBESUNPKDB4MjAxNDcyODApLCBESUNPKDB4MjUxNTI3NDApLAorICAgIERJQ08oMHgyZGI4OWZjMCksIERJQ08oMHgzNWYzZDIwMCksIERJQ08oMHg0MDBhYTY4MCksIERJQ08oMHg0N2E1MWMwMCksCisgICAgRElDTygweDRkOWM1YzAwKSwgRElDTygweDUyNWQxNjgwKSwgRElDTygweDU4MzJhZjAwKSwgRElDTygweDVkMjdkNTgwKSwKKyAgICBESUNPKDB4MDVjOTczZDApLCBESUNPKDB4MDdjMjU4MTApLCBESUNPKDB4MGU5MjhlNTApLCBESUNPKDB4MTJmNWFkMDApLAorICAgIERJQ08oMHgxNmIyYTgwMCksIERJQ08oMHgxYzJjOWNlMCksIERJQ08oMHgyMGIwZjEwMCksIERJQ08oMHgyOGJlMTk0MCksCisgICAgRElDTygweDJkMGYzYzAwKSwgRElDTygweDMwYTA2ZjQwKSwgRElDTygweDM5OWU0MzQwKSwgRElDTygweDQ2YjQ4MjgwKSwKKyAgICBESUNPKDB4NGJiYmMzMDApLCBESUNPKDB4NTAyODM3MDApLCBESUNPKDB4NTRhMWE4MDApLCBESUNPKDB4NWFiMjBjODApLAorICAgIERJQ08oMHgwM2RmOTM5MCksIERJQ08oMHgwNTVmZjFlMCksIERJQ08oMHgwYmJlYjY0MCksIERJQ08oMHgxN2Q5MDZjMCksCisgICAgRElDTygweDFhYzIwMTQwKSwgRElDTygweDFmZDg0NDQwKSwgRElDTygweDI0NTAyNjAwKSwgRElDTygweDJhOWZlNjQwKSwKKyAgICBESUNPKDB4MmVmNzk3MDApLCBESUNPKDB4MzRjYmVkNDApLCBESUNPKDB4M2M0OGNkMDApLCBESUNPKDB4NDNjY2NlODApLAorICAgIERJQ08oMHg0OWIxZDUwMCksIERJQ08oMHg1MDE0NWUwMCksIERJQ08oMHg1NmYxNmY4MCksIERJQ08oMHg1ZDQ2ZGQ4MCksCisgICAgRElDTygweDA0YTY5ZWYwKSwgRElDTygweDA2NDcwNDgwKSwgRElDTygweDBkZWZiZDAwKSwgRElDTygweDE1OTBlOTAwKSwKKyAgICBESUNPKDB4MTgxMTQwMDApLCBESUNPKDB4MWJkYTZjNjApLCBESUNPKDB4MWY2NGQxNjApLCBESUNPKDB4MjhkOGQ2NDApLAorICAgIERJQ08oMHgyZDRlMjg4MCksIERJQ08oMHgzNGNmZTM4MCksIERJQ08oMHgzYjcwNzdjMCksIERJQ08oMHg0MmYzNmE4MCksCisgICAgRElDTygweDQ5NjE1NTgwKSwgRElDTygweDRmZjlkMjAwKSwgRElDTygweDU2NTdlZjgwKSwgRElDTygweDVjYjkxMzAwKSwKKyAgICBESUNPKDB4MDM4ODkzZGMpLCBESUNPKDB4MDUzNWNkZjApLCBESUNPKDB4MGFhYmZmODApLCBESUNPKDB4MTQ2ZGFhYTApLAorICAgIERJQ08oMHgxODQ4YzcwMCksIERJQ08oMHgxY2U1NzhjMCksIERJQ08oMHgyMTExNjAwMCksIERJQ08oMHgyYjExNmQ0MCksCisgICAgRElDTygweDMyMTEzNTAwKSwgRElDTygweDM3NTFhNDgwKSwgRElDTygweDNlODhjMjAwKSwgRElDTygweDQ0Y2IxODAwKSwKKyAgICBESUNPKDB4NGFmMWMyMDApLCBESUNPKDB4NTEyMmI5ODApLCBESUNPKDB4NTc4MmJjODApLCBESUNPKDB4NWQyMGJlMDApLAorICAgIERJQ08oMHgwMzExODQzNCksIERJQ08oMHgwNGFmZTJlOCksIERJQ08oMHgwOGYxNDRmMCksIERJQ08oMHgxMmM3ODdjMCksCisgICAgRElDTygweDFjMzJlNGUwKSwgRElDTygweDFmNzAxMTgwKSwgRElDTygweDIzNjJmNzQwKSwgRElDTygweDJiOTk1Y2MwKSwKKyAgICBESUNPKDB4MzMyMmM1NDApLCBESUNPKDB4Mzk1MWYyMDApLCBESUNPKDB4M2Y3YzJjODApLCBESUNPKDB4NDU2OWM0ODApLAorICAgIERJQ08oMHg0YjJhNjIwMCksIERJQ08oMHg1MDkwNWU4MCksIERJQ08oMHg1NjIzNjY4MCksIERJQ08oMHg1YzMyZmEwMCksCisgICAgRElDTygweDA0NjBjM2IwKSwgRElDTygweDA2MWUxMzc4KSwgRElDTygweDBiMDdmNjEwKSwgRElDTygweDE2NmUwNjgwKSwKKyAgICBESUNPKDB4MThkMGYwMjApLCBESUNPKDB4MjExMjAzNDApLCBESUNPKDB4MjRkNGMwMDApLCBESUNPKDB4MjliYWZjMDApLAorICAgIERJQ08oMHgzMzhjMDc0MCksIERJQ08oMHgzNmNmYmMwMCksIERJQ08oMHgzZjMxMzkwMCksIERJQ08oMHg0N2JmOWMwMCksCisgICAgRElDTygweDRkZDVkNDgwKSwgRElDTygweDUyODQ4MjAwKSwgRElDTygweDU4NWFkZDAwKSwgRElDTygweDVjZjdiNDgwKSwKKyAgICBESUNPKDB4MDQxYTRiYzgpLCBESUNPKDB4MDVjYTA5MjApLCBESUNPKDB4MGEzYWU1YjApLCBESUNPKDB4MTNmYmI4NDApLAorICAgIERJQ08oMHgxY2RkM2QwMCksIERJQ08oMHgyMDlkNWI4MCksIERJQ08oMHgyN2U3OGU4MCksIERJQ08oMHgyZDFmNGVjMCksCisgICAgRElDTygweDMyZDg0YzgwKSwgRElDTygweDNiOGFhNjgwKSwgRElDTygweDQyODljMTgwKSwgRElDTygweDQ2YzMzNTgwKSwKKyAgICBESUNPKDB4NGMyM2U1ODApLCBESUNPKDB4NTE1ODMxODApLCBESUNPKDB4NTZmNTI2ODApLCBESUNPKDB4NWM3YTNkMDApLAorICAgIERJQ08oMHgwMzA2NzQwNCksIERJQ08oMHgwNTkxNDAzOCksIERJQ08oMHgxMGQzM2U2MCksIERJQ08oMHgxNzM3NzE4MCksCisgICAgRElDTygweDFkN2YzMmEwKSwgRElDTygweDIzODQ4ODgwKSwgRElDTygweDI5ZDMyMjAwKSwgRElDTygweDJmYjE2N2MwKSwKKyAgICBESUNPKDB4MzU2Yzg0ODApLCBESUNPKDB4M2I0MjAyODApLCBESUNPKDB4NDEwNmQwODApLCBESUNPKDB4NDZkMjkyODApLAorICAgIERJQ08oMHg0YzhhMTIwMCksIERJQ08oMHg1MjM4MzMwMCksIERJQ08oMHg1N2RiOGY4MCksIERJQ08oMHg1ZDYxZjIwMCksCisgICAgRElDTygweDA0YmFmMzY4KSwgRElDTygweDA2NjcwYTA4KSwgRElDTygweDBlMGNiZDkwKSwgRElDTygweDEyNjI5OWMwKSwKKyAgICBESUNPKDB4MTdlZDcyMjApLCBESUNPKDB4MWUzNjk5MDApLCBESUNPKDB4MjJkN2QzMDApLCBESUNPKDB4MmMwZjkzMDApLAorICAgIERJQ08oMHgyZjVlN2ZjMCksIERJQ08oMHgzYjdjMGQ0MCksIERJQ08oMHg0MDVhZmY4MCksIERJQ08oMHg0NGYyZWY4MCksCisgICAgRElDTygweDQ5ODJiNDAwKSwgRElDTygweDRlNTAxMzgwKSwgRElDTygweDUzOWRhYTAwKSwgRElDTygweDVjMTE0YjAwKSwKKyAgICBESUNPKDB4MDY5NGMxNzApLCBESUNPKDB4MDkyZDY4OTApLCBESUNPKDB4MGQwZmFlZTApLCBESUNPKDB4MTM4MDBkMDApLAorICAgIERJQ08oMHgxNzBmOGQ4MCksIERJQ08oMHgxYmNkODI0MCksIERJQ08oMHgyNDZhODQ4MCksIERJQ08oMHgyOGJhYjY0MCksCisgICAgRElDTygweDJmNDgyYWMwKSwgRElDTygweDM2ZTczNmMwKSwgRElDTygweDNhYWE2OGMwKSwgRElDTygweDNmYzQzNTAwKSwKKyAgICBESUNPKDB4NDZlMTYwMDApLCBESUNPKDB4NGIzZmJjMDApLCBESUNPKDB4NGZmNjhlODApLCBESUNPKDB4NWFhYmY2MDApLAorICAgIERJQ08oMHgwNWU4NDlhMCksIERJQ08oMHgwYjQ4NWE4MCksIERJQ08oMHgxNGJlNTJjMCksIERJQ08oMHgxYTA3OTM4MCksCisgICAgRElDTygweDFlOGIxY2UwKSwgRElDTygweDIyZmJjYTAwKSwgRElDTygweDI4YzM2YTQwKSwgRElDTygweDJlM2IyYTAwKSwKKyAgICBESUNPKDB4MzQzNjBiODApLCBESUNPKDB4M2EyNGNmMDApLCBESUNPKDB4M2ZmZjYyMDApLCBESUNPKDB4NDVhNmJmMDApLAorICAgIERJQ08oMHg0YmFmNzgwMCksIERJQ08oMHg1MTcyMGU4MCksIERJQ08oMHg1NzU2MGM4MCksIERJQ08oMHg1Y2U1N2UwMCksCisgICAgRElDTygweDA3NTFkYTM4KSwgRElDTygweDBmMDk0OWYwKSwgRElDTygweDE4MTQxODYwKSwgRElDTygweDFkZmNiMmMwKSwKKyAgICBESUNPKDB4MjRhZGJmMDApLCBESUNPKDB4Mjk2YWYyNDApLCBESUNPKDB4MmRiZTYwYzApLCBESUNPKDB4MzE3OWFlNDApLAorICAgIERJQ08oMHgzNWVjNDQwMCksIERJQ08oMHgzYWI3NjQwMCksIERJQ08oMHg0MDM0ZjQwMCksIERJQ08oMHg0NWNmYzcwMCksCisgICAgRElDTygweDRiZWE2YjAwKSwgRElDTygweDUxNmY1ZjAwKSwgRElDTygweDU3NjU1MzAwKSwgRElDTygweDVjZmMwZTAwKSwKKyAgICBESUNPKDB4MDY5OTAwZDApLCBESUNPKDB4MGQzNzk1MjApLCBESUNPKDB4MTc1ZDA1NjApLCBESUNPKDB4MWM0ZDkyYzApLAorICAgIERJQ08oMHgyMTQwNzY4MCksIERJQ08oMHgyNTBkMDM0MCksIERJQ08oMHgyOTgwNDk0MCksIERJQ08oMHgyZGZiOWFjMCksCisgICAgRElDTygweDMzN2ExZjgwKSwgRElDTygweDM5MTA1ZmMwKSwgRElDTygweDNlZmQwMzgwKSwgRElDTygweDQ0YmNlMzgwKSwKKyAgICBESUNPKDB4NGIwN2NjODApLCBESUNPKDB4NTBhZDdkMDApLCBESUNPKDB4NTZkZGNlODApLCBESUNPKDB4NWNiOWEwMDApLAorICAgIERJQ08oMHgwNjljNjk0OCksIERJQ08oMHgwYTU2ZWExMCksIERJQ08oMHgwZjdjY2EyMCksIERJQ08oMHgxMmQxODY4MCksCisgICAgRElDTygweDE3MDM2ZDAwKSwgRElDTygweDFmNGMxZTgwKSwgRElDTygweDI2MmU1NTQwKSwgRElDTygweDJiOTUxZTQwKSwKKyAgICBESUNPKDB4MzQ2OGFkNDApLCBESUNPKDB4M2EyYjIxMDApLCBESUNPKDB4M2YwMmYwYzApLCBESUNPKDB4NDM4M2U0MDApLAorICAgIERJQ08oMHg0ODM3NDE4MCksIERJQ08oMHg0ZDhlZWM4MCksIERJQ08oMHg1NGQ3NDgwMCksIERJQ08oMHg1YzMwOTYwMCksCisgICAgRElDTygweDA1YTUwMTU4KSwgRElDTygweDA3OTdlMzUwKSwgRElDTygweDBjZjFmMjMwKSwgRElDTygweDE0ZjNmYjIwKSwKKyAgICBESUNPKDB4MTc2NzY0MDApLCBESUNPKDB4MjA2MzY3ODApLCBESUNPKDB4MjYxN2VmODApLCBESUNPKDB4MjljYmY3MDApLAorICAgIERJQ08oMHgzMmVkNTdjMCksIERJQ08oMHgzNzRjMzA4MCksIERJQ08oMHgzYjM0OGU0MCksIERJQ08oMHgzZmRlMDE4MCksCisgICAgRElDTygweDQ0ZDM4YzAwKSwgRElDTygweDRhOGM2MTAwKSwgRElDTygweDU1ZjBlNDAwKSwgRElDTygweDVkZmVkMTAwKSwKKyAgICBESUNPKDB4MDRiNzQyMjgpLCBESUNPKDB4MDYyM2QzZTApLCBESUNPKDB4MGFiNGM2NzApLCBESUNPKDB4MWJkZTdmYTApLAorICAgIERJQ08oMHgxZmNiNmFjMCksIERJQ08oMHgyMzQ0YTU0MCksIERJQ08oMHgyNzVmN2M0MCksIERJQ08oMHgyYjdhODMwMCksCisgICAgRElDTygweDMxNDA3NDQwKSwgRElDTygweDM1MjM3NzAwKSwgRElDTygweDM4Nzk4NTQwKSwgRElDTygweDNkMGFmMzQwKSwKKyAgICBESUNPKDB4NDIyNGM5ODApLCBESUNPKDB4NDlhMTc5MDApLCBESUNPKDB4NTc3MDI4ODApLCBESUNPKDB4NWRiYTRjMDApLAorICAgIERJQ08oMHgwM2M4M2M4NCksIERJQ08oMHgwNWNjNTJkOCksIERJQ08oMHgwYjY0NGMxMCksIERJQ08oMHgxMjlhYjlhMCksCisgICAgRElDTygweDFjZWU0NmMwKSwgRElDTygweDIxNTJiMDgwKSwgRElDTygweDI0N2IxYzAwKSwgRElDTygweDI3Njk3MTgwKSwKKyAgICBESUNPKDB4MzA0Zjc1MDApLCBESUNPKDB4Mzg5NWQ4ODApLCBESUNPKDB4M2MzYTE3NDApLCBESUNPKDB4NDEzYWNlODApLAorICAgIERJQ08oMHg0NjJiMDEwMCksIERJQ08oMHg0YWIwN2UwMCksIERJQ08oMHg1MDk2NzU4MCksIERJQ08oMHg1YmE1ZTcwMCksCisgICAgRElDTygweDA2YmNmZGE4KSwgRElDTygweDA4YzhiOTIwKSwgRElDTygweDBkZTIxNTMwKSwgRElDTygweDEwMjhkMzIwKSwKKyAgICBESUNPKDB4MTY4Y2ZlMDApLCBESUNPKDB4MjBmNzhhNDApLCBESUNPKDB4MjQ4NDkzYzApLCBESUNPKDB4MmMzNGJmODApLAorICAgIERJQ08oMHgyZmY4ODU0MCksIERJQ08oMHgzMmQyOGM0MCksIERJQ08oMHgzNmQ5OTY0MCksIERJQ08oMHg0NDM4ZTUwMCksCisgICAgRElDTygweDRiYWNkYjAwKSwgRElDTygweDUwMzQzNzAwKSwgRElDTygweDU2Yjc5MDgwKSwgRElDTygweDViNjk0ZDAwKSwKKyAgICBESUNPKDB4MDY5MTA5YTApLCBESUNPKDB4MGE3M2JjNTApLCBESUNPKDB4MGUzYzgzMzApLCBESUNPKDB4MTMwODI2MjApLAorICAgIERJQ08oMHgxYzNhMzc2MCksIERJQ08oMHgyMDBiNWU4MCksIERJQ08oMHgyNTZhNDg4MCksIERJQ08oMHgyYjI1NmFjMCksCisgICAgRElDTygweDJmMzRhZmMwKSwgRElDTygweDM1NTgwMjAwKSwgRElDTygweDNlMGJkOWMwKSwgRElDTygweDQzZDkyOTAwKSwKKyAgICBESUNPKDB4NDk0ZTZlMDApLCBESUNPKDB4NGYxYTI3ODApLCBESUNPKDB4NTUzMmE5ODApLCBESUNPKDB4NWE4MzVhODApLAorICAgIERJQ08oMHgwNDA1MzQ1MCksIERJQ08oMHgwNWNiOGZlMCksIERJQ08oMHgwOTczODdiMCksIERJQ08oMHgxMTIxYWYwMCksCisgICAgRElDTygweDFhYmY2MmMwKSwgRElDTygweDFlMzliYmUwKSwgRElDTygweDI0M2RlMzAwKSwgRElDTygweDJiNDQwZWMwKSwKKyAgICBESUNPKDB4MmYyYzE0ODApLCBESUNPKDB4MzQ2OTdkODApLCBESUNPKDB4NDA1Zjg2MDApLCBESUNPKDB4NDQwYjZmODApLAorICAgIERJQ08oMHg0NzM3MzEwMCksIERJQ08oMHg0Yzc2NGY4MCksIERJQ08oMHg1NTI5Mzc4MCksIERJQ08oMHg1YzU5YTc4MCksCisgICAgRElDTygweDAzYzViNGE0KSwgRElDTygweDA1NmZiMzgwKSwgRElDTygweDA5YjhmOTEwKSwgRElDTygweDEzODMzZmEwKSwKKyAgICBESUNPKDB4MTg1ZWVkNjApLCBESUNPKDB4MWNlMzNkNDApLCBESUNPKDB4MjQyZTQxMDApLCBESUNPKDB4MjgyZTViODApLAorICAgIERJQ08oMHgyY2ZlNGQ0MCksIERJQ08oMHgzOGEwNmQ4MCksIERJQ08oMHgzZTAwMjI0MCksIERJQ08oMHg0MjNiZTQwMCksCisgICAgRElDTygweDQ5YTVlNjAwKSwgRElDTygweDUwOTJiNzgwKSwgRElDTygweDU3MDIzZDAwKSwgRElDTygweDVkNWY3YzgwKSwKKyAgICBESUNPKDB4MDc3YWRhMzgpLCBESUNPKDB4MDlkNWFjNzApLCBESUNPKDB4MGU1OGJlMzApLCBESUNPKDB4MTRmYjIwNDApLAorICAgIERJQ08oMHgxN2ZjOWRjMCksIERJQ08oMHgxYzJjMzFlMCksIERJQ08oMHgyNmNmMWIwMCksIERJQ08oMHgyYTkxYmE4MCksCisgICAgRElDTygweDJlZDg4MGMwKSwgRElDTygweDM4Y2JmOTAwKSwgRElDTygweDNkMmZjNzAwKSwgRElDTygweDQwNWQyMjgwKSwKKyAgICBESUNPKDB4NDM5YzFkMDApLCBESUNPKDB4NGRkMTY4MDApLCBESUNPKDB4NTY3MmMwODApLCBESUNPKDB4NWQzMTM4ODApLAorICAgIERJQ08oMHgwNDI3MjA5MCksIERJQ08oMHgwNWQ3NmUxOCksIERJQ08oMHgwYjRkODA4MCksIERJQ08oMHgxMjg4M2Y2MCksCisgICAgRElDTygweDE3OTUyMTgwKSwgRElDTygweDIwNDBkNDgwKSwgRElDTygweDIzZThjYzAwKSwgRElDTygweDI4MTljMjAwKSwKKyAgICBESUNPKDB4MmI4NzEwNDApLCBESUNPKDB4MzU3YzhmMDApLCBESUNPKDB4M2NhZjlhYzApLCBESUNPKDB4NDBhMzkzODApLAorICAgIERJQ08oMHg0NWJjMjc4MCksIERJQ08oMHg0ZTRhYTMwMCksIERJQ08oMHg1NjhjMjI4MCksIERJQ08oMHg1Y2FkYzQwMCksCisgICAgRElDTygweDAzNzViMDNjKSwgRElDTygweDA1NmYwYjQwKSwgRElDTygweDBiMGRjOTMwKSwgRElDTygweDEyOGM1MWUwKSwKKyAgICBESUNPKDB4MTg5ZmEzNjApLCBESUNPKDB4MWM4MTk3ZTApLCBESUNPKDB4MWVlZDUyYTApLCBESUNPKDB4MjNlZDQ1MDApLAorICAgIERJQ08oMHgyZTVlYjg0MCksIERJQ08oMHgzNjQxNWE0MCksIERJQ08oMHgzZGNmNjM0MCksIERJQ08oMHg0MzEyNmU4MCksCisgICAgRElDTygweDRhZWI3ZjgwKSwgRElDTygweDUwMWUxMjgwKSwgRElDTygweDU4NTJiMTAwKSwgRElDTygweDVkMDQwZDgwKSwKKyAgICBESUNPKDB4MDYzNTFiODgpLCBESUNPKDB4MDdmOTBhYzApLCBESUNPKDB4MGJhYjRlYTApLCBESUNPKDB4MThkMDRiNDApLAorICAgIERJQ08oMHgxZjFlMTQ4MCksIERJQ08oMHgyMTlhYmNjMCksIERJQ08oMHgyNjFjMzFjMCksIERJQ08oMHgyYTYxMWEwMCksCisgICAgRElDTygweDJlNzI1NDgwKSwgRElDTygweDM2YjUxMWMwKSwgRElDTygweDNkMzYyZjAwKSwgRElDTygweDQwYmU2ZDgwKSwKKyAgICBESUNPKDB4NDU2ZGM0MDApLCBESUNPKDB4NGI3NGM1ODApLCBESUNPKDB4NTVjODI2ODApLCBESUNPKDB4NWUzMTg0ODApLAorICAgIERJQ08oMHgwNDYyMTJkOCksIERJQ08oMHgwNWNhOTVlOCksIERJQ08oMHgwYTAyZDkxMCksIERJQ08oMHgxYWU1OGY0MCksCisgICAgRElDTygweDFlNzNlYzIwKSwgRElDTygweDIxOTdkNjQwKSwgRElDTygweDI1ODFkZjAwKSwgRElDTygweDI5YzgzNzgwKSwKKyAgICBESUNPKDB4MzEyOTQzMDApLCBESUNPKDB4MzU2ZjhhNDApLCBESUNPKDB4M2I5N2QyNDApLCBESUNPKDB4NDUwNWNjODApLAorICAgIERJQ08oMHg0YjQ5NzYwMCksIERJQ08oMHg1MDRlODc4MCksIERJQ08oMHg1NTY0NDQ4MCksIERJQ08oMHg1YmRlZGY4MCksCisgICAgRElDTygweDA1MTRmNzk4KSwgRElDTygweDA2YmQwZDAwKSwgRElDTygweDBmYzMxNTUwKSwgRElDTygweDEzZGZiMWEwKSwKKyAgICBESUNPKDB4MTdkZGE5MDApLCBESUNPKDB4MjA0YThjNDApLCBESUNPKDB4MjMwOTUzMDApLCBESUNPKDB4MmQwZGEwNDApLAorICAgIERJQ08oMHgzMWIyYTU0MCksIERJQ08oMHgzNDYyMDE4MCksIERJQ08oMHgzYWIzZTAwMCksIERJQ08oMHg0NDhhYzMwMCksCisgICAgRElDTygweDRiZTZhNjAwKSwgRElDTygweDUxMTRlMjgwKSwgRElDTygweDU2MmIwNzgwKSwgRElDTygweDViODMzYzAwKSwKKyAgICBESUNPKDB4MDcwZjVlZjApLCBESUNPKDB4MDkxOWMyYjApLCBESUNPKDB4MGU3Nzg3NDApLCBESUNPKDB4MTU0ZGIzMjApLAorICAgIERJQ08oMHgxNzdjZmJlMCksIERJQ08oMHgxZWE2NjA0MCksIERJQ08oMHgyMzY2NjY4MCksIERJQ08oMHgyODM5YzQwMCksCisgICAgRElDTygweDMwY2M0ZWMwKSwgRElDTygweDM0NDRhMjgwKSwgRElDTygweDM4YzkzNTgwKSwgRElDTygweDQyYTgwZTAwKSwKKyAgICBESUNPKDB4NGM0MzM4ODApLCBESUNPKDB4NTE5ZTRmODApLCBESUNPKDB4NTZmZjhmODApLCBESUNPKDB4NWJlMTgyMDApLAorICAgIERJQ08oMHgwNjZjNTk2OCksIERJQ08oMHgwOGE1ODlmMCksIERJQ08oMHgwY2E0ZDdhMCksIERJQ08oMHgwZmZkZWZiMCksCisgICAgRElDTygweDEyOTQzZjQwKSwgRElDTygweDFiZTg0ZWUwKSwgRElDTygweDIxMjc2NTQwKSwgRElDTygweDI2NWE5NTQwKSwKKyAgICBESUNPKDB4MmUwZGUxNDApLCBESUNPKDB4MzI1MTQ4YzApLCBESUNPKDB4M2JkMDVkNDApLCBESUNPKDB4NDFlODE3ODApLAorICAgIERJQ08oMHg0YjdjZjQwMCksIERJQ08oMHg1MzI4OTQwMCksIERJQ08oMHg1OTdkOTAwMCksIERJQ08oMHg1ZTQ1OGUwMCksCisgICAgRElDTygweDA0ZGEzZTQwKSwgRElDTygweDA2ZThlMWIwKSwgRElDTygweDBiOWIxYTIwKSwgRElDTygweDExMjY0YmMwKSwKKyAgICBESUNPKDB4MTRmM2Q3ZTApLCBESUNPKDB4MWNmOWMxMDApLCBESUNPKDB4MjM1NjhmNDApLCBESUNPKDB4MjkyYjUzODApLAorICAgIERJQ08oMHgzMzg3OGQ0MCksIERJQ08oMHgzOGRhYzg0MCksIERJQ08oMHgzZDU3ODIwMCksIERJQ08oMHg0MjIzYTg4MCksCisgICAgRElDTygweDQ3M2ZiNzAwKSwgRElDTygweDRjNzY1NTAwKSwgRElDTygweDU0NmM2NDgwKSwgRElDTygweDVjNzZkMjgwKSwKKyAgICBESUNPKDB4MDVlNjNiYjApLCBESUNPKDB4MDdhMWE0MjgpLCBESUNPKDB4MGVjNGZmMTApLCBESUNPKDB4MTM0OGExMDApLAorICAgIERJQ08oMHgxNjIwNGY0MCksIERJQ08oMHgxYTBhNjQ0MCksIERJQ08oMHgxZTMzZjZjMCksIERJQ08oMHgyYWU4Y2NjMCksCisgICAgRElDTygweDJlZDVlNmMwKSwgRElDTygweDMyNDI3NjAwKSwgRElDTygweDM3OWQ5OTgwKSwgRElDTygweDNjMGY0MDgwKSwKKyAgICBESUNPKDB4NDQxZWE2ODApLCBESUNPKDB4NGU1OTJiMDApLCBESUNPKDB4NTZlMjc3MDApLCBESUNPKDB4NWRhMmUyODApLAorICAgIERJQ08oMHgwNDc0ZGU4MCksIERJQ08oMHgwNjE2NzI0OCksIERJQ08oMHgwY2U2NTBlMCksIERJQ08oMHgxMzViNGFhMCksCisgICAgRElDTygweDE2Y2VhMmEwKSwgRElDTygweDFkMTM4YWMwKSwgRElDTygweDIyMGE4NGMwKSwgRElDTygweDI3NWNhMzgwKSwKKyAgICBESUNPKDB4MmMzMDAzNDApLCBESUNPKDB4MzMzYjNkODApLCBESUNPKDB4MzdhMzUwODApLCBESUNPKDB4NDBiODM4ODApLAorICAgIERJQ08oMHg0OTRjNDc4MCksIERJQ08oMHg0ZmY3MWM4MCksIERJQ08oMHg1NmRiMmQ4MCksIERJQ08oMHg1ZDBhYWMwMCksCisgICAgRElDTygweDA3NDZjZDAwKSwgRElDTygweDA5ZGVmZjEwKSwgRElDTygweDBlNGEzNTYwKSwgRElDTygweDE0ZjAwNWUwKSwKKyAgICBESUNPKDB4MTg2YTRkZTApLCBESUNPKDB4MWNkMGIyNDApLCBESUNPKDB4MjIyODdiYzApLCBESUNPKDB4MjZjZWQ1MDApLAorICAgIERJQ08oMHgyZDU3YzQ0MCksIERJQ08oMHgzMWQ5NDNjMCksIERJQ08oMHgzNjRiMGY4MCksIERJQ08oMHgzYzg1YTA0MCksCisgICAgRElDTygweDQyNDBjYTAwKSwgRElDTygweDRhNjQ4MDgwKSwgRElDTygweDU0ZDEyMjAwKSwgRElDTygweDVkMWExYzAwKSwKKyAgICBESUNPKDB4MDU1MjJlYjApLCBESUNPKDB4MDcwNGVmYjgpLCBESUNPKDB4MGM2NmNkNTApLCBESUNPKDB4MTVhZWZjYTApLAorICAgIERJQ08oMHgxODRmN2IwMCksIERJQ08oMHgxZTRiMjZhMCksIERJQ08oMHgyMjY2NzY0MCksIERJQ08oMHgyODRlNGUwMCksCisgICAgRElDTygweDJkOGJlM2MwKSwgRElDTygweDMxMzc2ZjAwKSwgRElDTygweDM5Y2Q5ODAwKSwgRElDTygweDNlNDZiNzQwKSwKKyAgICBESUNPKDB4NDNhZjAzODApLCBESUNPKDB4NGUxZGVjMDApLCBESUNPKDB4NTYyYWM1MDApLCBESUNPKDB4NWQ0NWY1ODApLAorICAgIERJQ08oMHgwNjJmNTcwOCksIERJQ08oMHgwOGQwNzlhMCksIERJQ08oMHgwYzFiNDkyMCksIERJQ08oMHgxM2YxNDdjMCksCisgICAgRElDTygweDFhZTc3YzgwKSwgRElDTygweDFkMjAwZWEwKSwgRElDTygweDIzNmU0NzQwKSwgRElDTygweDJiOThkMDAwKSwKKyAgICBESUNPKDB4MmVlZmM2MDApLCBESUNPKDB4MzRjNjc0YzApLCBESUNPKDB4M2QzNmY1NDApLCBESUNPKDB4NDExZDhjMDApLAorICAgIERJQ08oMHg0NWM1MDMwMCksIERJQ08oMHg0ZDIwNzQ4MCksIERJQ08oMHg1NTYwMzEwMCksIERJQ08oMHg1YzQ0MmQ4MCksCisgICAgRElDTygweDA1MTBiY2QwKSwgRElDTygweDA2ZWMwMGEwKSwgRElDTygweDBiNjM5NTUwKSwgRElDTygweDE1ZGFhMmMwKSwKKyAgICBESUNPKDB4MThjMGJhNjApLCBESUNPKDB4MWUwZjdkNjApLCBESUNPKDB4MjRiMDVjODApLCBESUNPKDB4MjgwNjM4YzApLAorICAgIERJQ08oMHgzMTRhNjU4MCksIERJQ08oMHgzNWU0YjJjMCksIERJQ08oMHgzYWVmMmJjMCksIERJQ08oMHg0MTU4YzI4MCksCisgICAgRElDTygweDRkMjQ1MTAwKSwgRElDTygweDUzYzY5YTgwKSwgRElDTygweDU5N2YxMDAwKSwgRElDTygweDVkY2IwMDgwKSwKKyAgICBESUNPKDB4MDQyY2I3NDgpLCBESUNPKDB4MDVkNzEwYjApLCBESUNPKDB4MGFmZTYxMzApLCBESUNPKDB4MTI1NmNkYzApLAorICAgIERJQ08oMHgxNWI4Y2QwMCksIERJQ08oMHgxZGM3MmQyMCksIERJQ08oMHgyMjA1ZmMwMCksIERJQ08oMHgyYTNkMGQwMCksCisgICAgRElDTygweDJmM2JhNjAwKSwgRElDTygweDMzYjNkODQwKSwgRElDTygweDNiNWE1NDQwKSwgRElDTygweDQxNmM5ZDAwKSwKKyAgICBESUNPKDB4NDk3Y2RkODApLCBESUNPKDB4NTA0MDVlMDApLCBESUNPKDB4NTcwY2E5ODApLCBESUNPKDB4NWQzYWExODApLAorICAgIERJQ08oMHgwNDQzYjdiOCksIERJQ08oMHgwNjNkODU4OCksIERJQ08oMHgwYzc2ZWYyMCksIERJQ08oMHgxMjcwOWI0MCksCisgICAgRElDTygweDE2NDlmMGEwKSwgRElDTygweDIwYzUyMmMwKSwgRElDTygweDI0Y2RlNDAwKSwgRElDTygweDJiYTc4MjgwKSwKKyAgICBESUNPKDB4MzEwNGMzNDApLCBESUNPKDB4MzYwYjE3NDApLCBESUNPKDB4M2NkNmE2YzApLCBESUNPKDB4NDI1NzM4MDApLAorICAgIERJQ08oMHg0OGIxODQ4MCksIERJQ08oMHg0ZmNhMWUwMCksIERJQ08oMHg1NzAwYzEwMCksIERJQ08oMHg1Y2YxNDQ4MCksCisgICAgRElDTygweDA1MTIzNjI4KSwgRElDTygweDA2YmYxMGIwKSwgRElDTygweDBiZGU3NTcwKSwgRElDTygweDE3NWI3ZWUwKSwKKyAgICBESUNPKDB4MWExMzQ0NjApLCBESUNPKDB4MjBmYTQxMDApLCBESUNPKDB4MjVlZGE0NDApLCBESUNPKDB4MjljM2I1NDApLAorICAgIERJQ08oMHgzMThhMWI0MCksIERJQ08oMHgzNWUwZDUwMCksIERJQ08oMHgzYTE0N2YwMCksIERJQ08oMHgzZjA4ZTk4MCksCisgICAgRElDTygweDQ0NWQ3NTgwKSwgRElDTygweDRlYzQ4YzgwKSwgRElDTygweDU4OGJjZTgwKSwgRElDTygweDVkZmFlMzAwKSwKKyAgICBESUNPKDB4MDRjOWU3NTApLCBESUNPKDB4MDY1MjI0ZjgpLCBESUNPKDB4MGM2ZjFlMzApLCBESUNPKDB4MWEyZmZjYTApLAorICAgIERJQ08oMHgxY2FjNjE0MCksIERJQ08oMHgyMWMyYTY0MCksIERJQ08oMHgyNWZiOGFjMCksIERJQ08oMHgyYWI5MGYwMCksCisgICAgRElDTygweDMzMTg5MjAwKSwgRElDTygweDM4MDg4YWMwKSwgRElDTygweDNiYjdkZTQwKSwgRElDTygweDQwMTgwODAwKSwKKyAgICBESUNPKDB4NDQ1M2MzMDApLCBESUNPKDB4NGNkYmE4ODApLCBESUNPKDB4NTQ5MDI2ODApLCBESUNPKDB4NWJiMjE3MDApLAorICAgIERJQ08oMHgwNjk1ODU3MCksIERJQ08oMHgwOTdmMzJiMCksIERJQ08oMHgwY2I0MThiMCksIERJQ08oMHgxNDFiNjkwMCksCisgICAgRElDTygweDFjOGNmYjAwKSwgRElDTygweDFmYWI3OTIwKSwgRElDTygweDI0NzdjODAwKSwgRElDTygweDJhYWJlZDQwKSwKKyAgICBESUNPKDB4MmViMWEwODApLCBESUNPKDB4MzM5ZjY3YzApLCBESUNPKDB4M2FiY2MyNDApLCBESUNPKDB4M2Y2NjFiMDApLAorICAgIERJQ08oMHg0NTY2MzI4MCksIERJQ08oMHg0YzY4MDgwMCksIERJQ08oMHg1MTcwMzAwMCksIERJQ08oMHg1OGEwZTAwMCksCisgICAgRElDTygweDA2OWY2Yzg4KSwgRElDTygweDA5NWUxNDkwKSwgRElDTygweDBjZjQ0MmIwKSwgRElDTygweDEwZWE4ZDYwKSwKKyAgICBESUNPKDB4MTM3N2I1ODApLCBESUNPKDB4MTk1ZWQ0ODApLCBESUNPKDB4MjY1NDJiMDApLCBESUNPKDB4MmM5ZWE3MDApLAorICAgIERJQ08oMHgzMThkOGFjMCksIERJQ08oMHgzNjRlNWE0MCksIERJQ08oMHgzYTBkYjAwMCksIERJQ08oMHgzZTEwODdjMCksCisgICAgRElDTygweDQ1MGNhMzgwKSwgRElDTygweDRjNzgxZDAwKSwgRElDTygweDUzY2Y3YTAwKSwgRElDTygweDVjN2QxMjgwKSwKKyAgICBESUNPKDB4MDZlNTFkOTgpLCBESUNPKDB4MDllYjhkMzApLCBESUNPKDB4MGU2NjgzZDApLCBESUNPKDB4MTI5NDE4YTApLAorICAgIERJQ08oMHgxNTYyZmM4MCksIERJQ08oMHgxZjcwODY2MCksIERJQ08oMHgyNTNmMTAwMCksIERJQ08oMHgyOTNhMTZjMCksCisgICAgRElDTygweDJlN2MxZDgwKSwgRElDTygweDMxNmU3NWMwKSwgRElDTygweDM1YTdmYmMwKSwgRElDTygweDNiZmJmNzgwKSwKKyAgICBESUNPKDB4NDE2YTkyMDApLCBESUNPKDB4NGJlMzY0MDApLCBESUNPKDB4NTZkYzdhODApLCBESUNPKDB4NWQ2NGVhODApLAorICAgIERJQ08oMHgwNTc0ZDBjOCksIERJQ08oMHgwNzQ4ZWZkMCksIERJQ08oMHgwYjUxMDg2MCksIERJQ08oMHgwZTIxOWUwMCksCisgICAgRElDTygweDEyOTljYzAwKSwgRElDTygweDFlZjcwNmEwKSwgRElDTygweDIyY2EzOGMwKSwgRElDTygweDI4ODIwYTAwKSwKKyAgICBESUNPKDB4MmNjNjM1YzApLCBESUNPKDB4MzFlZjQ3NDApLCBESUNPKDB4M2E1ZTg5YzApLCBESUNPKDB4NDJhY2FhMDApLAorICAgIERJQ08oMHg0YjJiZjUwMCksIERJQ08oMHg1MTVlMDk4MCksIERJQ08oMHg1Nzk0OTQwMCksIERJQ08oMHg1ZDAwMjUwMCksCisgICAgRElDTygweDA3YzcxNWQwKSwgRElDTygweDBiM2ZhMTEwKSwgRElDTygweDBlNzQ1MzcwKSwgRElDTygweDExZTkzNTYwKSwKKyAgICBESUNPKDB4MTRiYWQ2ODApLCBESUNPKDB4MTg5YTA0MDApLCBESUNPKDB4MjQwYjEyNDApLCBESUNPKDB4MmE2YjM1ODApLAorICAgIERJQ08oMHgyZTVlMTM4MCksIERJQ08oMHgzNTIwNzJjMCksIERJQ08oMHgzYTUwMzdjMCksIERJQ08oMHgzZTM3MjZjMCksCisgICAgRElDTygweDQ3MjVlZDgwKSwgRElDTygweDRmODg1OTAwKSwgRElDTygweDU0YzhkNTgwKSwgRElDTygweDViMjYxNjgwKSwKKyAgICBESUNPKDB4MDc1ZjAyYTgpLCBESUNPKDB4MGEyMTQ5MDApLCBESUNPKDB4MGUxODlkZTApLCBESUNPKDB4MTM3NmQ1YTApLAorICAgIERJQ08oMHgxNjNkNWM4MCksIERJQ08oMHgxYTk0YjNlMCksIERJQ08oMHgyMTM3Njk4MCksIERJQ08oMHgyNTljMzE0MCksCisgICAgRElDTygweDJlNjYzYmMwKSwgRElDTygweDMzNzg4NGMwKSwgRElDTygweDNhMDM1YzAwKSwgRElDTygweDQwYjMyYzAwKSwKKyAgICBESUNPKDB4NGIyMWRlMDApLCBESUNPKDB4NTMyOThmMDApLCBESUNPKDB4NTg3ODgwODApLCBESUNPKDB4NWNmYTdjMDApLAorICAgIERJQ08oMHgwNTY1ODk4OCksIERJQ08oMHgwNzk3ZjQ3MCksIERJQ08oMHgwZDI1MDgxMCksIERJQ08oMHgxMDJmYzJhMCksCisgICAgRElDTygweDEzNzM4ZmUwKSwgRElDTygweDE3NDBiYmMwKSwgRElDTygweDI0OTFiMzgwKSwgRElDTygweDI4YmM1ODAwKSwKKyAgICBESUNPKDB4MmM3NWE5NDApLCBESUNPKDB4MzI1Y2I1MDApLCBESUNPKDB4Mzc5NDQ3NDApLCBESUNPKDB4NDA1ZjJkODApLAorICAgIERJQ08oMHg0OGViOGYwMCksIERJQ08oMHg1MDY3NmY4MCksIERJQ08oMHg1NmY3MDM4MCksIERJQ08oMHg1ZDYyYzAwMCksCisgICAgRElDTygweDA1MzFiNTQwKSwgRElDTygweDA2YWU2NGMwKSwgRElDTygweDBjZjdhZDMwKSwgRElDTygweDExYzgzMDAwKSwKKyAgICBESUNPKDB4MTRlZGM5ODApLCBESUNPKDB4MThkNDM2YzApLCBESUNPKDB4MWUxODQwODApLCBESUNPKDB4MjYwM2JiODApLAorICAgIERJQ08oMHgyYTJmMmY4MCksIERJQ08oMHgzM2JkYmUwMCksIERJQ08oMHgzYTEwNjZjMCksIERJQ08oMHg0MmI5ZmYwMCksCisgICAgRElDTygweDRhNjE3NTgwKSwgRElDTygweDUxNjE5NDgwKSwgRElDTygweDU3Y2NkNTAwKSwgRElDTygweDVkNGQxNjAwKSwKKyAgICBESUNPKDB4MDNlNDBiYWMpLCBESUNPKDB4MDVmNTMxNTgpLCBESUNPKDB4MGU3NmQzYjApLCBESUNPKDB4MTdjMTU3YTApLAorICAgIERJQ08oMHgxY2NiNWJjMCksIERJQ08oMHgyNTAxMjljMCksIERJQ08oMHgyYjdkOWQwMCksIERJQ08oMHgzMzIyNGQ4MCksCisgICAgRElDTygweDM5NjZmNjAwKSwgRElDTygweDNmMzk5NDgwKSwgRElDTygweDQ0NDlmYzgwKSwgRElDTygweDQ5NDAxYjgwKSwKKyAgICBESUNPKDB4NGUyYWI1ODApLCBESUNPKDB4NTMxMTcwMDApLCBESUNPKDB4NTg0OGUwODApLCBESUNPKDB4NWQ2NmEyODApLAorICAgIERJQ08oMHgwNDFkNGY2MCksIERJQ08oMHgwNzBlODA4MCksIERJQ08oMHgxMzkwZWM0MCksIERJQ08oMHgxNzdjNDJjMCksCisgICAgRElDTygweDFiZWIxNDAwKSwgRElDTygweDIwOGIwNTgwKSwgRElDTygweDI2NGNiYjQwKSwgRElDTygweDJiZDMwOTQwKSwKKyAgICBESUNPKDB4MzBiMzA4ODApLCBESUNPKDB4MzY5NzhlODApLCBESUNPKDB4M2NiMmExNDApLCBESUNPKDB4NDNmNmIwODApLAorICAgIERJQ08oMHg0YTg4MTAwMCksIERJQ08oMHg1MDVjYTc4MCksIERJQ08oMHg1NjlhNWQ4MCksIERJQ08oMHg1Y2FlMzU4MCksCisgICAgRElDTygweDAzZjNjNzYwKSwgRElDTygweDA1NTY0ZTA4KSwgRElDTygweDA5ZTMxMGQwKSwgRElDTygweDFiOWIzZDAwKSwKKyAgICBESUNPKDB4MjA5MDlhYzApLCBESUNPKDB4MjM4MmVlYzApLCBESUNPKDB4Mjc4YzY3MDApLCBESUNPKDB4MmIzNGQ1MDApLAorICAgIERJQ08oMHgzMGZhMmFjMCksIERJQ08oMHgzNGQyN2Q0MCksIERJQ08oMHgzOGUzMzRjMCksIERJQ08oMHgzZDczMjQ0MCksCisgICAgRElDTygweDQ2ZDA3ODAwKSwgRElDTygweDUxZjRkNDAwKSwgRElDTygweDU3NzQ0ZjgwKSwgRElDTygweDVkNTZiYjgwKSwKKyAgICBESUNPKDB4MDNhYmZkZDgpLCBESUNPKDB4MDUxMmIxNDApLCBESUNPKDB4MTM1Zjc1MDApLCBESUNPKDB4MTlmY2M0YzApLAorICAgIERJQ08oMHgxZDBiMWI4MCksIERJQ08oMHgyMWVjYTU0MCksIERJQ08oMHgyNThmODcwMCksIERJQ08oMHgyOWUyOTJjMCksCisgICAgRElDTygweDJjNTFmZTgwKSwgRElDTygweDMxZTJhMTgwKSwgRElDTygweDNjNjM4NjQwKSwgRElDTygweDQ0ODczYTAwKSwKKyAgICBESUNPKDB4NGJiN2U4MDApLCBESUNPKDB4NTA3OGY3MDApLCBESUNPKDB4NTdmYzliODApLCBESUNPKDB4NWRlZjFjMDApLAorICAgIERJQ08oMHgwNDcyMWVmMCksIERJQ08oMHgwNjY4ODE1OCksIERJQ08oMHgwZjY1YTVkMCksIERJQ08oMHgxNDQ5OTg0MCksCisgICAgRElDTygweDFiZjViOGMwKSwgRElDTygweDFmMzNiNzAwKSwgRElDTygweDI2NGI2OTAwKSwgRElDTygweDJjM2U2NzgwKSwKKyAgICBESUNPKDB4MmVjOGQ0NDApLCBESUNPKDB4MzIzODg1YzApLCBESUNPKDB4MzcxNDMzMDApLCBESUNPKDB4M2JhZmE4MDApLAorICAgIERJQ08oMHg0OTAzMDQ4MCksIERJQ08oMHg1NGMxNmIwMCksIERJQ08oMHg1OGVjNGIwMCksIERJQ08oMHg1ZDcxM2QwMCksCisgICAgRElDTygweDAzZDExNGU0KSwgRElDTygweDA2N2U1YjQwKSwgRElDTygweDEwMzkzNDIwKSwgRElDTygweDE0OTYxMzAwKSwKKyAgICBESUNPKDB4MWE1OWNmYTApLCBESUNPKDB4MjA4NTQyNDApLCBESUNPKDB4MjZiM2YzMDApLCBESUNPKDB4MmUzZTI4NDApLAorICAgIERJQ08oMHgzMjNiZDMwMCksIERJQ08oMHgzN2M0OTI4MCksIERJQ08oMHgzZDc5ZTUwMCksIERJQ08oMHg0MzUyZDg4MCksCisgICAgRElDTygweDQ5ZTE3OTgwKSwgRElDTygweDRmYzcyZjgwKSwgRElDTygweDU1YzBjNjgwKSwgRElDTygweDVjNTNjNzAwKSwKKyAgICBESUNPKDB4MDUzZjVkZTgpLCBESUNPKDB4MDc1MTYyYjgpLCBESUNPKDB4MGZhZTgwNTApLCBESUNPKDB4MTNlYzBlZTApLAorICAgIERJQ08oMHgxN2Y5MjQ0MCksIERJQ08oMHgxZjA1NDQ0MCksIERJQ08oMHgyNGIxNWQ0MCksIERJQ08oMHgyYWRkNDQ4MCksCisgICAgRElDTygweDJlMzA2MzAwKSwgRElDTygweDM1NDIwNjgwKSwgRElDTygweDNjNmI2ZTAwKSwgRElDTygweDQyZmMwMzgwKSwKKyAgICBESUNPKDB4NDczMmUzODApLCBESUNPKDB4NGNlYjIyMDApLCBESUNPKDB4NTIyZWZlMDApLCBESUNPKDB4NWFhMTI2ODApLAorICAgIERJQ08oMHgwNjExMTcyOCksIERJQ08oMHgwODE4M2M4MCksIERJQ08oMHgwZDAyNjY1MCksIERJQ08oMHgxNGI0MTk0MCksCisgICAgRElDTygweDE3ZTM3MzIwKSwgRElDTygweDFjNDBiMTYwKSwgRElDTygweDIxOWM1NDAwKSwgRElDTygweDI2ZDg4ODQwKSwKKyAgICBESUNPKDB4MmJmZGZlMDApLCBESUNPKDB4MzE1YTI4MDApLCBESUNPKDB4MzhjZDcxNDApLCBESUNPKDB4M2RlMjI3NDApLAorICAgIERJQ08oMHg0OGZmMTMwMCksIERJQ08oMHg1M2VmNDE4MCksIERJQ08oMHg1YTQ3OTM4MCksIERJQ08oMHg1ZWExZTM4MCksCisgICAgRElDTygweDA3ZWEwZmE4KSwgRElDTygweDBhODQ0ZWYwKSwgRElDTygweDBlMTAyM2MwKSwgRElDTygweDEyMDhkOTgwKSwKKyAgICBESUNPKDB4MTU4OTEzNjApLCBESUNPKDB4MWJlYmMzODApLCBESUNPKDB4MjA4N2RhNDApLCBESUNPKDB4MjU3YWM5NDApLAorICAgIERJQ08oMHgyY2FlZmEwMCksIERJQ08oMHgzMDBkZWZjMCksIERJQ08oMHgzNzZhYTAwMCksIERJQ08oMHg0MzhhYWQ4MCksCisgICAgRElDTygweDQ5ZjAwNTAwKSwgRElDTygweDRlMDIzNzgwKSwgRElDTygweDUyNGU1ODAwKSwgRElDTygweDVhYmNiOTgwKSwKKyAgICBESUNPKDB4MDc5Y2ZjODgpLCBESUNPKDB4MGEzNjcyNDApLCBESUNPKDB4MGYyMjQzMzApLCBESUNPKDB4MTViNTE1NDApLAorICAgIERJQ08oMHgxOTA2NTQyMCksIERJQ08oMHgxZGRiZTBhMCksIERJQ08oMHgyM2E5OWQ4MCksIERJQ08oMHgyOGMyZDM0MCksCisgICAgRElDTygweDJmNjI3ZTQwKSwgRElDTygweDM0ODdlMDgwKSwgRElDTygweDM4Yjc2YmMwKSwgRElDTygweDNkMTM1NTgwKSwKKyAgICBESUNPKDB4NDM3OTlhODApLCBESUNPKDB4NDg5YTUwMDApLCBESUNPKDB4NGVjZTYyODApLCBESUNPKDB4NWE4MmY1MDApLAorICAgIERJQ08oMHgwNmMzN2U0MCksIERJQ08oMHgwOTNmMDU0MCksIERJQ08oMHgwZTBkMGMzMCksIERJQ08oMHgxNzQ4Nzg2MCksCisgICAgRElDTygweDFiZjc4MDIwKSwgRElDTygweDIwMzE4MDAwKSwgRElDTygweDI2MGI4MzAwKSwgRElDTygweDJjNjE1OTgwKSwKKyAgICBESUNPKDB4MzBjODg0NDApLCBESUNPKDB4MzY0MzNiNDApLCBESUNPKDB4M2JkYjhjNDApLCBESUNPKDB4NDAwNTBjODApLAorICAgIERJQ08oMHg0NDA2MmY4MCksIERJQ08oMHg0OGE4ZDQ4MCksIERJQ08oMHg0ZGQ2NGQwMCksIERJQ08oMHg1NWFiZDM4MCksCisgICAgRElDTygweDA1ZTllODI4KSwgRElDTygweDA3ZjI0MzMwKSwgRElDTygweDBjOGI0ZmUwKSwgRElDTygweDBlY2QyODIwKSwKKyAgICBESUNPKDB4MTdmMDVjMDApLCBESUNPKDB4MWZkYjQ1NjApLCBESUNPKDB4MjRiNGM5NDApLCBESUNPKDB4Mjk2OGQwYzApLAorICAgIERJQ08oMHgyY2JmMzUwMCksIERJQ08oMHgzODFlYWRjMCksIERJQ08oMHgzZDNiYWY0MCksIERJQ08oMHg0MjgyODA4MCksCisgICAgRElDTygweDQ3ZjM2MzAwKSwgRElDTygweDRjOGM2NjAwKSwgRElDTygweDUxZDY2ZjAwKSwgRElDTygweDVhN2UwMzAwKSwKKyAgICBESUNPKDB4MDY1YzVjZjgpLCBESUNPKDB4MDg4ODI1NDApLCBESUNPKDB4MGQ4ODdjNzApLCBESUNPKDB4MTEyYWM1NjApLAorICAgIERJQ08oMHgxNTBjY2RjMCksIERJQ08oMHgxOWU0OWMyMCksIERJQ08oMHgxZWI2NTY4MCksIERJQ08oMHgyYTc2ZTA0MCksCisgICAgRElDTygweDJmNjVmYzAwKSwgRElDTygweDM2ZDc5Y2MwKSwgRElDTygweDNjODVhOTAwKSwgRElDTygweDQwOGRjNjgwKSwKKyAgICBESUNPKDB4NDQ5NjQ3MDApLCBESUNPKDB4NGE5OGViMDApLCBESUNPKDB4NTUyOGI1MDApLCBESUNPKDB4NWQ2NjBmODApLAorICAgIERJQ08oMHgwNmI1NjIzMCksIERJQ08oMHgwOGUzNDBmMCksIERJQ08oMHgwZTFlNDM4MCksIERJQ08oMHgxMTJkMmQ0MCksCisgICAgRElDTygweDE1OGRmZGUwKSwgRElDTygweDIyN2U2MDQwKSwgRElDTygweDI2YmZmN2MwKSwgRElDTygweDJiNzNhMTAwKSwKKyAgICBESUNPKDB4MzIxOTk1ODApLCBESUNPKDB4MzU4NWEyNDApLCBESUNPKDB4Mzk4YTVkNDApLCBESUNPKDB4M2RiOGM2YzApLAorICAgIERJQ08oMHg0MzkwNTYwMCksIERJQ08oMHg0OTQ1ZjgwMCksIERJQ08oMHg0ZjMxMDM4MCksIERJQ08oMHg1YTZkMjQwMCksCisgICAgRElDTygweDA1Y2ZjNmY4KSwgRElDTygweDA4MzJlNjUwKSwgRElDTygweDBkZTgyZjgwKSwgRElDTygweDFhMWFmZTgwKSwKKyAgICBESUNPKDB4MWU5YTFmODApLCBESUNPKDB4MjIxYWNkODApLCBESUNPKDB4MjdmYTAwYzApLCBESUNPKDB4MmM0ZGY5ODApLAorICAgIERJQ08oMHgzMWUwNGJjMCksIERJQ08oMHgzOGM5ZWQ0MCksIERJQ08oMHgzZGI4NjA4MCksIERJQ08oMHg0MjhlYzgwMCksCisgICAgRElDTygweDQ4NTAwNTAwKSwgRElDTygweDRlMWNhNTgwKSwgRElDTygweDUzZDNmNTAwKSwgRElDTygweDVhYTZiZTAwKSwKKyAgICBESUNPKDB4MDUwY2M0ZDApLCBESUNPKDB4MDcwYzIxODApLCBESUNPKDB4MGM0Y2E5ODApLCBESUNPKDB4MGZjZTlmNDApLAorICAgIERJQ08oMHgxNGFmNDE2MCksIERJQ08oMHgyMjA2YTc4MCksIERJQ08oMHgyNTg0OGU4MCksIERJQ08oMHgyYzJiODRjMCksCisgICAgRElDTygweDM1YTM5OTgwKSwgRElDTygweDM5MTRiZDgwKSwgRElDTygweDNjYWZmNTgwKSwgRElDTygweDNmY2IwNjAwKSwKKyAgICBESUNPKDB4NDQyNmIzODApLCBESUNPKDB4NDg2Yzk3MDApLCBESUNPKDB4NGY3MzA0ODApLCBESUNPKDB4NWFmZDM5ODApLAorICAgIERJQ08oMHgwNWU0MDY0MCksIERJQ08oMHgwODMwZGY1MCksIERJQ08oMHgwYjllODNlMCksIERJQ08oMHgxNThiYWNjMCksCisgICAgRElDTygweDFkMDY5MmUwKSwgRElDTygweDIwMjFlMGMwKSwgRElDTygweDI2NTcyZTAwKSwgRElDTygweDJkNThjYzQwKSwKKyAgICBESUNPKDB4MzBkZDBmODApLCBESUNPKDB4MzYxZDY4YzApLCBESUNPKDB4M2UzMDg2YzApLCBESUNPKDB4NDI0NTA4MDApLAorICAgIERJQ08oMHg0NmMyNTgwMCksIERJQ08oMHg0YzQ1Y2YwMCksIERJQ08oMHg1MWRkNDIwMCksIERJQ08oMHg1NzMyNjUwMCksCisgICAgRElDTygweDA0ZDMyZmEwKSwgRElDTygweDA2NGVkMmMwKSwgRElDTygweDBiMDdjZDcwKSwgRElDTygweDFjN2Y2ZGEwKSwKKyAgICBESUNPKDB4MjEzYmMxNDApLCBESUNPKDB4MjUwNTFmYzApLCBESUNPKDB4Mjk1Y2QxYzApLCBESUNPKDB4MmM5ZjRmODApLAorICAgIERJQ08oMHgzMjI3MTU0MCksIERJQ08oMHgzNmE4ZWM4MCksIERJQ08oMHgzYThlNmI0MCksIERJQ08oMHgzZTEzNzU4MCksCisgICAgRElDTygweDQyNzk1NDgwKSwgRElDTygweDQ3NzliNzgwKSwgRElDTygweDRmN2Q5NjAwKSwgRElDTygweDVjMDliMDAwKSwKKyAgICBESUNPKDB4MDQ0YjA3NDgpLCBESUNPKDB4MDVmZWU2ODApLCBESUNPKDB4MDhmNjY5NjApLCBESUNPKDB4MTFkYjU5NDApLAorICAgIERJQ08oMHgyMTllZGU4MCksIERJQ08oMHgyN2ZiOTZjMCksIERJQ08oMHgyYWZmYzk4MCksIERJQ08oMHgyZWFkYzNjMCksCisgICAgRElDTygweDMyODk1NzAwKSwgRElDTygweDM3MTgwZDAwKSwgRElDTygweDNkNGJmODgwKSwgRElDTygweDQxNzQxOTgwKSwKKyAgICBESUNPKDB4NDYwZDgyODApLCBESUNPKDB4NGMzNGJlODApLCBESUNPKDB4NTQ1MzFlODApLCBESUNPKDB4NWM4NzQwMDApLAorICAgIERJQ08oMHgwM2UyNWRjYyksIERJQ08oMHgwNjllODE3MCksIERJQ08oMHgxM2IzZDljMCksIERJQ08oMHgxYTgwMzI2MCksCisgICAgRElDTygweDFlZDNhNGEwKSwgRElDTygweDIzZWE2MzgwKSwgRElDTygweDI4ODNiOTAwKSwgRElDTygweDJlMGNlYWMwKSwKKyAgICBESUNPKDB4MzMwOGU0MDApLCBESUNPKDB4Mzg3OTZkYzApLCBESUNPKDB4M2UzMThlODApLCBESUNPKDB4NDQxZGEwODApLAorICAgIERJQ08oMHg0YTg5MjMwMCksIERJQ08oMHg1MDliOWY4MCksIERJQ08oMHg1NmNhYTM4MCksIERJQ08oMHg1Y2MzOWUwMCksCisgICAgRElDTygweDA1MDIzMDM4KSwgRElDTygweDA2YjZiNGQ4KSwgRElDTygweDBhNDQ5MzcwKSwgRElDTygweDE1Yjg2ZWEwKSwKKyAgICBESUNPKDB4MjI0YTkyMDApLCBESUNPKDB4MjcyZTZmNDApLCBESUNPKDB4MmE2MTc3MDApLCBESUNPKDB4MmU5MTVkMDApLAorICAgIERJQ08oMHgzMjQwYWM0MCksIERJQ08oMHgzNzYzNjMwMCksIERJQ08oMHgzZGQzZWE4MCksIERJQ08oMHg0MjBlMWY4MCksCisgICAgRElDTygweDQ1YmYwNjgwKSwgRElDTygweDRhMjZkOTgwKSwgRElDTygweDRmODJhOTAwKSwgRElDTygweDU2NTc2ODAwKSwKKyAgICBESUNPKDB4MDNkNjMwZjQpLCBESUNPKDB4MDgyMTQwYTApLCBESUNPKDB4MTI2NDQ3MDApLCBESUNPKDB4MTZiODBjYzApLAorICAgIERJQ08oMHgxYmE5MGM0MCksIERJQ08oMHgyMWMzODMwMCksIERJQ08oMHgyN2RkMTQ4MCksIERJQ08oMHgyZTE4ZWUwMCksCisgICAgRElDTygweDMzZmI3MmMwKSwgRElDTygweDM5ZjlkOTgwKSwgRElDTygweDQwMjE5MzAwKSwgRElDTygweDQ2MDdmZDAwKSwKKyAgICBESUNPKDB4NGMwN2U1MDApLCBESUNPKDB4NTFiYThmMDApLCBESUNPKDB4NTdhMjQyODApLCBESUNPKDB4NWQzNjc3MDApLAorICAgIERJQ08oMHgwODBhNTg4MCksIERJQ08oMHgwZWYzZjU3MCksIERJQ08oMHgxNDFmZDZjMCksIERJQ08oMHgxN2MxNjNhMCksCisgICAgRElDTygweDFjMjg0MGEwKSwgRElDTygweDIxMTFmZTAwKSwgRElDTygweDI3Mzc2YmMwKSwgRElDTygweDJjYzdlZGMwKSwKKyAgICBESUNPKDB4MzI5YjAxMDApLCBESUNPKDB4Mzg2ZDNlNDApLCBESUNPKDB4M2VjMWJkYzApLCBESUNPKDB4NDUzZjYyMDApLAorICAgIERJQ08oMHg0YmYxNjA4MCksIERJQ08oMHg1MWJkZWQwMCksIERJQ08oMHg1N2JhNjgwMCksIERJQ08oMHg1ZDJmZmQ4MCksCisgICAgRElDTygweDA4NjQzNTkwKSwgRElDTygweDBlOTExZjAwKSwgRElDTygweDE1OTExMzgwKSwgRElDTygweDFhYjVlMTgwKSwKKyAgICBESUNPKDB4MjA3ZmY2MDApLCBESUNPKDB4MjYzOTliMDApLCBESUNPKDB4MmNhZGFlODApLCBESUNPKDB4MzI3NmNhNDApLAorICAgIERJQ08oMHgzODlkOWNjMCksIERJQ08oMHgzZWIyMjE4MCksIERJQ08oMHg0NDU3MDcwMCksIERJQ08oMHg0OWQxNTgwMCksCisgICAgRElDTygweDRmNTkxMzAwKSwgRElDTygweDU0NTY2YTgwKSwgRElDTygweDU5NjdkYjAwKSwgRElDTygweDVlMzA3NzgwKSwKKyAgICBESUNPKDB4MDcxMjBmYTgpLCBESUNPKDB4MGM3OTFjNjApLCBESUNPKDB4MTEyZDNiNjApLCBESUNPKDB4MTQ5NDUyYTApLAorICAgIERJQ08oMHgxOWQyYzEwMCksIERJQ08oMHgyMDJmMTU0MCksIERJQ08oMHgyNjljMTBjMCksIERJQ08oMHgyYmUyMjg4MCksCisgICAgRElDTygweDMxMmEwN2MwKSwgRElDTygweDM2OTg0ZmMwKSwgRElDTygweDNjN2FjM2MwKSwgRElDTygweDQzNWI1MDAwKSwKKyAgICBESUNPKDB4NGFhNjAyODApLCBESUNPKDB4NTBmNTBjMDApLCBESUNPKDB4NTcxOWY3MDApLCBESUNPKDB4NWNiOTg2ODApLAorICAgIERJQ08oMHgwNTUxN2M4OCksIERJQ08oMHgwNmJhMGE3MCksIERJQ08oMHgwZGExNjdjMCksIERJQ08oMHgxOTkxODQ0MCksCisgICAgRElDTygweDFiYjM3MjIwKSwgRElDTygweDIwNjgxMDgwKSwgRElDTygweDIzZGM2NzQwKSwgRElDTygweDJhMTQwM2MwKSwKKyAgICBESUNPKDB4MzFhNzE1ODApLCBESUNPKDB4MzRmZjA2MDApLCBESUNPKDB4Mzk1YjdjYzApLCBESUNPKDB4NDIwMTkyMDApLAorICAgIERJQ08oMHg0YzgxOGQwMCksIERJQ08oMHg1MTNmZjQwMCksIERJQ08oMHg1NzMxY2UwMCksIERJQ08oMHg1YzVmMTE4MCksCisgICAgRElDTygweDA0Zjc0ZWMwKSwgRElDTygweDA2N2I0NjI4KSwgRElDTygweDBkYzRjOWMwKSwgRElDTygweDE5ZTlmYTQwKSwKKyAgICBESUNPKDB4MWNmMDBhMDApLCBESUNPKDB4MjE2MDJhODApLCBESUNPKDB4MjUzMzRhODApLCBESUNPKDB4MjliM2E4MDApLAorICAgIERJQ08oMHgyZjliMzYwMCksIERJQ08oMHgzMzhjMDU0MCksIERJQ08oMHgzNzBjM2NjMCksIERJQ08oMHgzYWJiYzNjMCksCisgICAgRElDTygweDQwNTNhMDAwKSwgRElDTygweDRmMTRkOTgwKSwgRElDTygweDU3ZTBiNjAwKSwgRElDTygweDVkOTVlNzgwKSwKKyAgICBESUNPKDB4MDVkODQ0YjgpLCBESUNPKDB4MDdhMDU2MDgpLCBESUNPKDB4MGI3ODM3ZjApLCBESUNPKDB4MTYxZmI0NjApLAorICAgIERJQ08oMHgxOWMzMWQwMCksIERJQ08oMHgxY2YzNjI4MCksIERJQ08oMHgyMGNjYzIwMCksIERJQ08oMHgyNGFlMzk4MCksCisgICAgRElDTygweDJlMmI1ODAwKSwgRElDTygweDMzMTZhZjgwKSwgRElDTygweDM3NDMyYjAwKSwgRElDTygweDQwNTBiMjgwKSwKKyAgICBESUNPKDB4NDYwNWJlMDApLCBESUNPKDB4NGNjNzg5MDApLCBESUNPKDB4NTU2ZDIwODApLCBESUNPKDB4NWM1NzgzMDApLAorICAgIERJQ08oMHgwNTUxYjc2OCksIERJQ08oMHgwNzAyNGY2MCksIERJQ08oMHgxMDQ1ZmRlMCksIERJQ08oMHgxNjQ4MDEyMCksCisgICAgRElDTygweDE5OTc0NDIwKSwgRElDTygweDFlYzJiMjgwKSwgRElDTygweDIyOGIzMGMwKSwgRElDTygweDI5NWUwZWMwKSwKKyAgICBESUNPKDB4MmQ4Nzc1YzApLCBESUNPKDB4MzBlZjE0NDApLCBESUNPKDB4MzU5NzgwODApLCBESUNPKDB4M2EyYWI0ODApLAorICAgIERJQ08oMHg0MDIyOTc4MCksIERJQ08oMHg0ZGE0MDk4MCksIERJQ08oMHg1NzE4ZTQ4MCksIERJQ08oMHg1ZDY4ZDQwMCksCisgICAgRElDTygweDAzZjkwM2U0KSwgRElDTygweDA2NzMxNTgwKSwgRElDTygweDBlY2Y0ODUwKSwgRElDTygweDEyZTU3OTIwKSwKKyAgICBESUNPKDB4MWE2OWVjZTApLCBESUNPKDB4MWZlMzI3MDApLCBESUNPKDB4MjU4NWI5YzApLCBESUNPKDB4MmFhMDA2YzApLAorICAgIERJQ08oMHgyZjIwZWE4MCksIERJQ08oMHgzNzI5OGJjMCksIERJQ08oMHgzZGYyYTAwMCksIERJQ08oMHg0NGE2YzYwMCksCisgICAgRElDTygweDRiMTBkZTAwKSwgRElDTygweDUxMGZiODgwKSwgRElDTygweDU3NDljMjgwKSwgRElDTygweDVkMGI5NDgwKSwKKyAgICBESUNPKDB4MDNjNDE4ZmMpLCBESUNPKDB4MDU2YzRjZDApLCBESUNPKDB4MGQwY2YwNzApLCBESUNPKDB4MTkwN2EyYzApLAorICAgIERJQ08oMHgxYmU5YmMwMCksIERJQ08oMHgyMTU5OTQ4MCksIERJQ08oMHgyNTcwMGU0MCksIERJQ08oMHgyYzgzZTI4MCksCisgICAgRElDTygweDMyOWZhN2MwKSwgRElDTygweDM4OWY0Y2MwKSwgRElDTygweDNlZjYwOTAwKSwgRElDTygweDQ0YzE5MzAwKSwKKyAgICBESUNPKDB4NGFmNTZkMDApLCBESUNPKDB4NTEyZWVjODApLCBESUNPKDB4NTc3MmFkMDApLCBESUNPKDB4NWQzN2YzODApLAorICAgIERJQ08oMHgwNGQ1NzkyMCksIERJQ08oMHgwNzE2YjVlMCksIERJQ08oMHgwY2IzYmNjMCksIERJQ08oMHgxMTk3Zjc0MCksCisgICAgRElDTygweDE2M2U1ZmMwKSwgRElDTygweDIxOTRlNDAwKSwgRElDTygweDI3NGJiNjAwKSwgRElDTygweDJmNWQ3MDgwKSwKKyAgICBESUNPKDB4MzYxZWUzNDApLCBESUNPKDB4M2IzYjIyYzApLCBESUNPKDB4M2Y4MDA0MDApLCBESUNPKDB4NDMyN2VmODApLAorICAgIERJQ08oMHg0OGI1ZDIwMCksIERJQ08oMHg1MTE2ZDMwMCksIERJQ08oMHg1OTY1MmU4MCksIERJQ08oMHg1ZTQ0NGQwMCksCisgICAgRElDTygweDA3NTViNmIwKSwgRElDTygweDBiNjhjMmMwKSwgRElDTygweDBmMzQ0MWQwKSwgRElDTygweDEyNGEwMWEwKSwKKyAgICBESUNPKDB4MTg5MTA2MDApLCBESUNPKDB4MjA5MTFiODApLCBESUNPKDB4MjgxZjcxMDApLCBESUNPKDB4MmU0ZGQ2NDApLAorICAgIERJQ08oMHgzMzViZDhjMCksIERJQ08oMHgzN2YxNGE4MCksIERJQ08oMHgzY2FiN2I4MCksIERJQ08oMHg0M2JlMzE4MCksCisgICAgRElDTygweDRiZWVlMTAwKSwgRElDTygweDUyMjkyMTgwKSwgRElDTygweDU3ZWZlYTAwKSwgRElDTygweDVkMTc3MzAwKSwKKyAgICBESUNPKDB4MDcxYTc3NDgpLCBESUNPKDB4MGM2Y2YxYjApLCBESUNPKDB4MTBkYjE1MDApLCBESUNPKDB4MTQzYmNhMDApLAorICAgIERJQ08oMHgxYjg2YTkwMCksIERJQ08oMHgyMmVkMWQ4MCksIERJQ08oMHgyYTFmNjFjMCksIERJQ08oMHgzMDVmMTQwMCksCisgICAgRElDTygweDM2NDVmNTgwKSwgRElDTygweDNiZTQ1YjAwKSwgRElDTygweDQxNjZlYTgwKSwgRElDTygweDQ2YzNmMjAwKSwKKyAgICBESUNPKDB4NGM3NDA0MDApLCBESUNPKDB4NTFlMzBkMDApLCBESUNPKDB4NTdhMzcwMDApLCBESUNPKDB4NWNmYzQ5ODApLAorICAgIERJQ08oMHgwOGNkZDViMCksIERJQ08oMHgwZGFmOTg0MCksIERJQ08oMHgxMWNjMDJhMCksIERJQ08oMHgxNTg4ZWQ0MCksCisgICAgRElDTygweDFjZmVmNWUwKSwgRElDTygweDIzOWYxMmMwKSwgRElDTygweDI5NmQzYjQwKSwgRElDTygweDJlNjFjMjQwKSwKKyAgICBESUNPKDB4MzMzZGM4MDApLCBESUNPKDB4Mzg1ZDAwMDApLCBESUNPKDB4M2UxZTUxODApLCBESUNPKDB4NDQxOTZlMDApLAorICAgIERJQ08oMHg0YTgzMzAwMCksIERJQ08oMHg1MDNkN2I4MCksIERJQ08oMHg1NjU1NjY4MCksIERJQ08oMHg1YzQxMGMwMCksCisgICAgRElDTygweDA3MzcyNDA4KSwgRElDTygweDBkNWM0MWYwKSwgRElDTygweDE1NWRjMTQwKSwgRElDTygweDFhOWEzY2MwKSwKKyAgICBESUNPKDB4MjE3NDA5ODApLCBESUNPKDB4MjcxMzlmNDApLCBESUNPKDB4MmM5NzcwNDApLCBESUNPKDB4MzBjZmU1YzApLAorICAgIERJQ08oMHgzNTM4MTI0MCksIERJQ08oMHgzOWI4MzE0MCksIERJQ08oMHgzZWYzZmU4MCksIERJQ08oMHg0NDU0NzIwMCksCisgICAgRElDTygweDRhODEyODAwKSwgRElDTygweDUwNDZjMjAwKSwgRElDTygweDU2OTU3ZDAwKSwgRElDTygweDVjODVjZDgwKSwKKyAgICBESUNPKDB4MDZkYTY5OTApLCBESUNPKDB4MGJjNDEyNTApLCBESUNPKDB4MTNkNTQ4MDApLCBESUNPKDB4MTk3OWMyMjApLAorICAgIERJQ08oMHgxZmFkMmYwMCksIERJQ08oMHgyNGJiZTBjMCksIERJQ08oMHgyOWMwOGYwMCksIERJQ08oMHgyZTM0Yjk0MCksCisgICAgRElDTygweDMyYzg5ZTQwKSwgRElDTygweDM3NmEyMDQwKSwgRElDTygweDNjZDgxMDgwKSwgRElDTygweDQyNjdiZDAwKSwKKyAgICBESUNPKDB4NDhlOGU4MDApLCBESUNPKDB4NGYxNTAyODApLCBESUNPKDB4NTVjYjE5ODApLCBESUNPKDB4NWM0MjhiODApLAorICAgIERJQ08oMHgwODdkNDVkMCksIERJQ08oMHgwY2YxZWYyMCksIERJQ08oMHgxMzVjYmEyMCksIERJQ08oMHgxNmZjNzQyMCksCisgICAgRElDTygweDFiMjc3MmUwKSwgRElDTygweDFmZDRmZTYwKSwgRElDTygweDI2MGEwYjgwKSwgRElDTygweDJiYzU0YzAwKSwKKyAgICBESUNPKDB4MzE2OTRjYzApLCBESUNPKDB4MzZkMDgwODApLCBESUNPKDB4M2MyNDVjODApLCBESUNPKDB4NDExNzA5MDApLAorICAgIERJQ08oMHg0N2IxODYwMCksIERJQ08oMHg0ZTcwNjE4MCksIERJQ08oMHg1NThkMjAwMCksIERJQ08oMHg1YzQyOGQwMCksCisgICAgRElDTygweDA4MWU2NDkwKSwgRElDTygweDBkMTZhN2QwKSwgRElDTygweDEyNGNjZDIwKSwgRElDTygweDE1NGMyMGMwKSwKKyAgICBESUNPKDB4MTk0NWQ4YzApLCBESUNPKDB4MWVlMGI3MDApLCBESUNPKDB4MjZhMDFmMDApLCBESUNPKDB4MmQ1NTRlNDApLAorICAgIERJQ08oMHgzNDMyZWI4MCksIERJQ08oMHgzYTYwNTUwMCksIERJQ08oMHg0MDFkODk4MCksIERJQ08oMHg0NTczNzY4MCksCisgICAgRElDTygweDRiMDNjYjAwKSwgRElDTygweDUwNjY2NzgwKSwgRElDTygweDU2YTBjZDAwKSwgRElDTygweDVjYjQ2NDgwKSwKKyAgICBESUNPKDB4MDZjNTgyNzgpLCBESUNPKDB4MDkxYjEwYjApLCBESUNPKDB4MGUwZTc0ZjApLCBESUNPKDB4MTFmYWY5ODApLAorICAgIERJQ08oMHgxNGE0ODYwMCksIERJQ08oMHgxZTZmNzUwMCksIERJQ08oMHgyN2Y3NzEwMCksIERJQ08oMHgyYWI0OTk0MCksCisgICAgRElDTygweDMyYTFmNjgwKSwgRElDTygweDM4Y2IyYTgwKSwgRElDTygweDNjM2ZmMTQwKSwgRElDTygweDNmNjgxY2MwKSwKKyAgICBESUNPKDB4NDQzMTA3MDApLCBESUNPKDB4NGZhMjE3MDApLCBESUNPKDB4NTg2YzYxODApLCBESUNPKDB4NWRmNzQyMDApLAorICAgIERJQ08oMHgwNmEzZTQ3OCksIERJQ08oMHgwOTcxNDQwMCksIERJQ08oMHgwZDkwYjdhMCksIERJQ08oMHgxMmRmMjcyMCksCisgICAgRElDTygweDE2MThmMzIwKSwgRElDTygweDFhYzUyODQwKSwgRElDTygweDI3NjEyOTAwKSwgRElDTygweDJlNDM4ZTAwKSwKKyAgICBESUNPKDB4MzIyYjZhYzApLCBESUNPKDB4MzgwMjI5NDApLCBESUNPKDB4M2QyYTUxODApLCBESUNPKDB4NDBkNzZiODApLAorICAgIERJQ08oMHg0NjY3MTUwMCksIERJQ08oMHg0YzViZDQ4MCksIERJQ08oMHg1MTdhMjUwMCksIERJQ08oMHg1Nzc3NWIwMCksCisgICAgRElDTygweDA1NmMyMjMwKSwgRElDTygweDA3YjhmOWQ4KSwgRElDTygweDBiYzZlMDYwKSwgRElDTygweDE2YWMyYzgwKSwKKyAgICBESUNPKDB4MWE5MmZjMDApLCBESUNPKDB4MWUxNWYwMDApLCBESUNPKDB4MjhiNzMyMDApLCBESUNPKDB4MmNkOWU1YzApLAorICAgIERJQ08oMHgzMTk2ZWNjMCksIERJQ08oMHgzYWJhZTM0MCksIERJQ08oMHg0MDQwYzU4MCksIERJQ08oMHg0NGMxOGQ4MCksCisgICAgRElDTygweDRjMDg2ODAwKSwgRElDTygweDUwYjc4NTAwKSwgRElDTygweDU0ZTQyNjAwKSwgRElDTygweDVhNTQ5YTgwKSwKKyAgICBESUNPKDB4MDRmOWZhMTApLCBESUNPKDB4MDc0MTkzNTgpLCBESUNPKDB4MGMzZTE1ZjApLCBESUNPKDB4MTc0YzE4MDApLAorICAgIERJQ08oMHgxYWIxZmU2MCksIERJQ08oMHgyM2ExMjY4MCksIERJQ08oMHgyNzk1NTc4MCksIERJQ08oMHgyZDE0YjFjMCksCisgICAgRElDTygweDM1Y2VmYjAwKSwgRElDTygweDM5NTc2NzAwKSwgRElDTygweDNlODJiNzgwKSwgRElDTygweDQyYjZhNjgwKSwKKyAgICBESUNPKDB4NDc2ZDE4ODApLCBESUNPKDB4NGI2Y2RkMDApLCBESUNPKDB4NTI3NTg2ODApLCBESUNPKDB4NWI2OWU1MDApLAorICAgIERJQ08oMHgwNjBiN2FiMCksIERJQ08oMHgwODFjMDVjMCksIERJQ08oMHgwYjU0MDMwMCksIERJQ08oMHgwZjU2NDI3MCksCisgICAgRElDTygweDEyMTBhYTgwKSwgRElDTygweDE3NzFlMDYwKSwgRElDTygweDI1ZDczMjgwKSwgRElDTygweDJlNDllMzgwKSwKKyAgICBESUNPKDB4MzE5YzExMDApLCBESUNPKDB4Mzc3MWU3MDApLCBESUNPKDB4M2M1MzJmNDApLCBESUNPKDB4NDBjOWE5MDApLAorICAgIERJQ08oMHg0OGNiZjU4MCksIERJQ08oMHg0ZjgxOTk4MCksIERJQ08oMHg1NjZmOTQwMCksIERJQ08oMHg1Y2ZkZDk4MCksCisgICAgRElDTygweDA0ZWZiN2I4KSwgRElDTygweDBiOGEzNzEwKSwgRElDTygweDEyNGZkNTIwKSwgRElDTygweDE4NDZkZGUwKSwKKyAgICBESUNPKDB4MWU3N2E5ZTApLCBESUNPKDB4MjQzZWE4MDApLCBESUNPKDB4MmE0ZTMyODApLCBESUNPKDB4MmZmNTMyYzApLAorICAgIERJQ08oMHgzNWQyNzY4MCksIERJQ08oMHgzYjhjZGIwMCksIERJQ08oMHg0MTQ2MzAwMCksIERJQ08oMHg0NzA2YzcwMCksCisgICAgRElDTygweDRjYTQyZDgwKSwgRElDTygweDUyNWQ5MjAwKSwgRElDTygweDU3ZGFiYjgwKSwgRElDTygweDVkNTlhODAwKSwKKyAgICBESUNPKDB4MDM2MjBkZWMpLCBESUNPKDB4MDk1ODcyZTApLCBESUNPKDB4MTA4ZDQ5MjApLCBESUNPKDB4MTZlOWVhMDApLAorICAgIERJQ08oMHgxZDYwYjJlMCksIERJQ08oMHgyMzVlOWQwMCksIERJQ08oMHgyOTg5M2I4MCksIERJQ08oMHgyZjU5YTNjMCksCisgICAgRElDTygweDM1NTZiODgwKSwgRElDTygweDNiMTBiZGMwKSwgRElDTygweDQwZjQ5NTAwKSwgRElDTygweDQ2OWNjNDgwKSwKKyAgICBESUNPKDB4NGM3NjJkMDApLCBESUNPKDB4NTFmMTY5ODApLCBESUNPKDB4NTc4YzZkMDApLCBESUNPKDB4NWM5YjVhMDApLAorICAgIERJQ08oMHgwNWRkOWJjMCksIERJQ08oMHgwNzljNWIyMCksIERJQ08oMHgwZDMxOWFmMCksIERJQ08oMHgxODk5NzA0MCksCisgICAgRElDTygweDFjMGExOTgwKSwgRElDTygweDIwZTkyNmMwKSwgRElDTygweDI1Y2ExNjQwKSwgRElDTygweDI5ODc5MzQwKSwKKyAgICBESUNPKDB4MzBiMjcwNDApLCBESUNPKDB4MzYwNzczNDApLCBESUNPKDB4MzlhYzNkMDApLCBESUNPKDB4M2Q2ODZjYzApLAorICAgIERJQ08oMHg0MjhlNWYwMCksIERJQ08oMHg0N2MxYmY4MCksIERJQ08oMHg0ZTcyMDgwMCksIERJQ08oMHg1YjQxOTg4MCksCisgICAgRElDTygweDA3Njk0MjU4KSwgRElDTygweDBiNTBkYjkwKSwgRElDTygweDBmMzg0OTUwKSwgRElDTygweDE0MGRhYzQwKSwKKyAgICBESUNPKDB4MTdjNTBkODApLCBESUNPKDB4MWI0OWIzMDApLCBESUNPKDB4MjQ3NDYyMDApLCBESUNPKDB4MmNlOTJmYzApLAorICAgIERJQ08oMHgzMDlmZGFjMCksIERJQ08oMHgzNWMwMmEwMCksIERJQ08oMHgzYWEzZGYwMCksIERJQ08oMHgzZTFlZGIwMCksCisgICAgRElDTygweDQzMWFkMjgwKSwgRElDTygweDRiNTdmNTAwKSwgRElDTygweDUxNDYzOTgwKSwgRElDTygweDU4NmI1MjAwKSwKKyAgICBESUNPKDB4MDY0MDFkZDApLCBESUNPKDB4MDhkM2Q5YjApLCBESUNPKDB4MGNhMGY1MTApLCBESUNPKDB4MTBlZDE5MjApLAorICAgIERJQ08oMHgxNDUxYzJlMCksIERJQ08oMHgyMDgyZjY0MCksIERJQ08oMHgyODcyYzBjMCksIERJQ08oMHgyY2E5ZGEwMCksCisgICAgRElDTygweDMyMTljZDAwKSwgRElDTygweDM1OTc3MzAwKSwgRElDTygweDNhOGJhMWMwKSwgRElDTygweDQzZDVmMjgwKSwKKyAgICBESUNPKDB4NDlhNTFmMDApLCBESUNPKDB4NGRlOWI0MDApLCBESUNPKDB4NTM2MmVmODApLCBESUNPKDB4NTkzODczMDApLAorICAgIERJQ08oMHgwNTg5YzQzMCksIERJQ08oMHgwNzgwOTkxOCksIERJQ08oMHgwZDA4NmY4MCksIERJQ08oMHgxMDM3MWMyMCksCisgICAgRElDTygweDE1MTg0MmMwKSwgRElDTygweDFiZmNiMWMwKSwgRElDTygweDIyNDQxMDQwKSwgRElDTygweDI3MjJiNWMwKSwKKyAgICBESUNPKDB4MmI2MDNmYzApLCBESUNPKDB4MzE0NDY1YzApLCBESUNPKDB4NDAzMDhiMDApLCBESUNPKDB4NDdkNWEyMDApLAorICAgIERJQ08oMHg0YmY3ZTAwMCksIERJQ08oMHg0ZjkzNzIwMCksIERJQ08oMHg1NTg0ZWIwMCksIERJQ08oMHg1Y2IwMjIwMCksCisgICAgRElDTygweDAzYjU5MmYwKSwgRElDTygweDA1NmJhNzM4KSwgRElDTygweDBhOGUyMjUwKSwgRElDTygweDE3MjQzNmMwKSwKKyAgICBESUNPKDB4MWFkMzVkYTApLCBESUNPKDB4MWQ3MmRjODApLCBESUNPKDB4MjBjZDM5MDApLCBESUNPKDB4MmE5NjI5NDApLAorICAgIERJQ08oMHgyZjNiNjcwMCksIERJQ08oMHgzMzMxMmI0MCksIERJQ08oMHgzOGRjNjY4MCksIERJQ08oMHg0MTY1OTIwMCksCisgICAgRElDTygweDRkMzZhMzgwKSwgRElDTygweDUyYjAwOTgwKSwgRElDTygweDU4YzgyODAwKSwgRElDTygweDVkNzQxNjAwKSwKKyAgICBESUNPKDB4MDViZGZlMTApLCBESUNPKDB4MDc1NmRhMjApLCBESUNPKDB4MGNkMzFmZTApLCBESUNPKDB4MTMwZjE4MjApLAorICAgIERJQ08oMHgxNTYxY2FhMCksIERJQ08oMHgxOTYyYWIyMCksIERJQ08oMHgxYzMxMDg0MCksIERJQ08oMHgyOGJmNmY4MCksCisgICAgRElDTygweDJkMmQ0NTAwKSwgRElDTygweDMyMzBmOTAwKSwgRElDTygweDNhYzJlYTgwKSwgRElDTygweDNlYmU3MWMwKSwKKyAgICBESUNPKDB4NDgyODA3MDApLCBESUNPKDB4NTAyNTQ5MDApLCBESUNPKDB4NTg1MGEyMDApLCBESUNPKDB4NWU2ODcyMDApLAorICAgIERJQ08oMHgwNGUyYjdlOCksIERJQ08oMHgwNjdmNTQzMCksIERJQ08oMHgwYTg4OTlhMCksIERJQ08oMHgwZDU3MTU2MCksCisgICAgRElDTygweDFjNDJmNDQwKSwgRElDTygweDIyZTIxZmMwKSwgRElDTygweDI3MDc0MzQwKSwgRElDTygweDJjNDkzMjQwKSwKKyAgICBESUNPKDB4MmY3ZWNlMDApLCBESUNPKDB4MzM5NTllYzApLCBESUNPKDB4MzkyZDMwMDApLCBESUNPKDB4NDU5ZmM4MDApLAorICAgIERJQ08oMHg0YmE1ZjcwMCksIERJQ08oMHg0ZmRlNzc4MCksIERJQ08oMHg1NWY5MDM4MCksIERJQ08oMHg1YzkyOGIwMCksCisgICAgRElDTygweDA1NTdiOTQwKSwgRElDTygweDA3NWYwMTU4KSwgRElDTygweDBiZDhjNTQwKSwgRElDTygweDBmNGVlMzcwKSwKKyAgICBESUNPKDB4MTQxZGM5MDApLCBESUNPKDB4MWIyNDFmMDApLCBESUNPKDB4MjFjMzJhODApLCBESUNPKDB4MjlhMjM5ODApLAorICAgIERJQ08oMHgyZTQ3NTM4MCksIERJQ08oMHgzNjE2ZjljMCksIERJQ08oMHgzYTUyYTUwMCksIERJQ08oMHg0MDM0NWYwMCksCisgICAgRElDTygweDQ3NjNhNTAwKSwgRElDTygweDRlYjViYjgwKSwgRElDTygweDU2MWQ0NDgwKSwgRElDTygweDVkMzg4NTgwKSwKKyAgICBESUNPKDB4MDU3ZDdkMDgpLCBESUNPKDB4MDczOGMyNDApLCBESUNPKDB4MGJmNDZlMTApLCBESUNPKDB4MGVjOTNkYTApLAorICAgIERJQ08oMHgxNGFiM2NjMCksIERJQ08oMHgyM2QwZjVjMCksIERJQ08oMHgyNzFlOTkwMCksIERJQ08oMHgyYzBlZTRjMCksCisgICAgRElDTygweDMwMWQxZjAwKSwgRElDTygweDMzODY4MDQwKSwgRElDTygweDM3Y2RkZTAwKSwgRElDTygweDNjODA1NDQwKSwKKyAgICBESUNPKDB4NDNjNjkyMDApLCBESUNPKDB4NGY1YzlhMDApLCBESUNPKDB4NTZlYjNlODApLCBESUNPKDB4NWNkYWRjODApLAorICAgIERJQ08oMHgwNmNkYmFiMCksIERJQ08oMHgwOTk5ZTYwMCksIERJQ08oMHgwZGYzOTc5MCksIERJQ08oMHgxMmZmYzlhMCksCisgICAgRElDTygweDE1Y2ZlN2EwKSwgRElDTygweDFjNTk5MzAwKSwgRElDTygweDIxYWZkNjAwKSwgRElDTygweDI2ODQyYmMwKSwKKyAgICBESUNPKDB4MzIwNjdjMDApLCBESUNPKDB4MzY4YmIwODApLCBESUNPKDB4M2MzNTBjNDApLCBESUNPKDB4NDRlOGJlMDApLAorICAgIERJQ08oMHg0YWM4NDAwMCksIERJQ08oMHg0ZjljMTI4MCksIERJQ08oMHg1NDQ5ZWMwMCksIERJQ08oMHg1OTRkNTg4MCksCisgICAgRElDTygweDA0OWE2YmQwKSwgRElDTygweDA2ODQ5ZjA4KSwgRElDTygweDEwNTkyYjQwKSwgRElDTygweDE2OGMxOTQwKSwKKyAgICBESUNPKDB4MTk5MmRmNDApLCBESUNPKDB4MWU5MWIzMDApLCBESUNPKDB4MjIzN2UxMDApLCBESUNPKDB4MmNkNzNhODApLAorICAgIERJQ08oMHgzMGU3YzEwMCksIERJQ08oMHgzNjFhNDVjMCksIERJQ08oMHgzY2RkMWY0MCksIERJQ08oMHg0MWQ1ZDEwMCksCisgICAgRElDTygweDQ2Zjc5NDgwKSwgRElDTygweDRlNDRjODgwKSwgRElDTygweDU1ODMwZTgwKSwgRElDTygweDVkN2MwNjgwKSwKKyAgICBESUNPKDB4MDUwODc5NTgpLCBESUNPKDB4MDZmYjdlNDApLCBESUNPKDB4MGFjNWFjZTApLCBESUNPKDB4MTRlOTFkODApLAorICAgIERJQ08oMHgxOWFjNjhjMCksIERJQ08oMHgxZGJmNzYwMCksIERJQ08oMHgyNmY5MTZjMCksIERJQ08oMHgyYmQyYzk4MCksCisgICAgRElDTygweDMwN2Y3OTAwKSwgRElDTygweDM4ZTA3ZTQwKSwgRElDTygweDNkZjdmMWMwKSwgRElDTygweDQxMzIzZDAwKSwKKyAgICBESUNPKDB4NDRkMmY0ODApLCBESUNPKDB4NDhmYjA0ODApLCBESUNPKDB4NTFlMTc5MDApLCBESUNPKDB4NWMxNWQ3MDApLAorICAgIERJQ08oMHgwMzQ2Y2Y0MCksIERJQ08oMHgwNTQyMzQwOCksIERJQ08oMHgwYjY0MGNlMCksIERJQ08oMHgxMzA1NTA2MCksCisgICAgRElDTygweDFhOGMwYjYwKSwgRElDTygweDFkOGQyMjgwKSwgRElDTygweDIxOGI2NTAwKSwgRElDTygweDJjMzg1NzAwKSwKKyAgICBESUNPKDB4MzA5MjdiNDApLCBESUNPKDB4MzVkODI4ODApLCBESUNPKDB4M2FhODdlMDApLCBESUNPKDB4M2RhNDZhNDApLAorICAgIERJQ08oMHg0NWVhNTI4MCksIERJQ08oMHg1MTFlY2I4MCksIERJQ08oMHg1N2I1M2IwMCksIERJQ08oMHg1ZDQ5MTQwMCksCisgICAgRElDTygweDA1NmFhMWM4KSwgRElDTygweDA3NWEwOWEwKSwgRElDTygweDBhNWQ2MWQwKSwgRElDTygweDEzY2I5ZmUwKSwKKyAgICBESUNPKDB4MWY5MjRkYzApLCBESUNPKDB4MjM3YTExYzApLCBESUNPKDB4Mjc3ZDZiODApLCBESUNPKDB4MmMyYmE0NDApLAorICAgIERJQ08oMHgzMDE5NWM4MCksIERJQ08oMHgzNTI1MGNjMCksIERJQ08oMHgzYjcxODIwMCksIERJQ08oMHg0MDExM2M4MCksCisgICAgRElDTygweDQ0ZGYyNjgwKSwgRElDTygweDQ5ZjBlZDgwKSwgRElDTygweDUwNzkxOTgwKSwgRElDTygweDVhYzEwNjAwKSwKKyAgICBESUNPKDB4MDQ2ZjFlNTApLCBESUNPKDB4MDYxZGQ3NTgpLCBESUNPKDB4MTIzNmJlYzApLCBESUNPKDB4MTZjMDczNDApLAorICAgIERJQ08oMHgxYTczOTljMCksIERJQ08oMHgxZjYxZWUyMCksIERJQ08oMHgyNDRiMjI4MCksIERJQ08oMHgyYjgwM2U0MCksCisgICAgRElDTygweDJlZGE1MzAwKSwgRElDTygweDMzMTIxMGMwKSwgRElDTygweDM3NzNiZmMwKSwgRElDTygweDQxMWM4NDAwKSwKKyAgICBESUNPKDB4NDg4ZmYzODApLCBESUNPKDB4NGZhZDI3MDApLCBESUNPKDB4NTU4NDUwMDApLCBESUNPKDB4NWNhNzRjMDApLAorICAgIERJQ08oMHgwNGI0NTZmMCksIERJQ08oMHgwNWZjYTE5OCksIERJQ08oMHgwYWQwNTZkMCksIERJQ08oMHgxOWMzYmZlMCksCisgICAgRElDTygweDFkNDQ2MTAwKSwgRElDTygweDIwZjY3MjAwKSwgRElDTygweDI0YTQwYjQwKSwgRElDTygweDI4ZDQ3MmMwKSwKKyAgICBESUNPKDB4MmRhODEzYzApLCBESUNPKDB4MzE4ODAyMDApLCBESUNPKDB4MzUzNDRmNDApLCBESUNPKDB4M2NhN2YzNDApLAorICAgIERJQ08oMHg0YWE5NDMwMCksIERJQ08oMHg0ZjkyMTUwMCksIERJQ08oMHg1NTE2ZDcwMCksIERJQ08oMHg1YzgzMjg4MCksCisgICAgRElDTygweDA3ZjQ2OGMwKSwgRElDTygweDBiYmI2ZTkwKSwgRElDTygweDBmMGY4NzMwKSwgRElDTygweDE0M2Q2MTgwKSwKKyAgICBESUNPKDB4MTk4Yjg0YzApLCBESUNPKDB4MWM2YjMwYTApLCBESUNPKDB4MjE5YzgwMDApLCBESUNPKDB4Mjg3OTU3ODApLAorICAgIERJQ08oMHgyY2NlM2QwMCksIERJQ08oMHgzMjliMTEwMCksIERJQ08oMHgzYThkMjI0MCksIERJQ08oMHgzZjU3OTA4MCksCisgICAgRElDTygweDQ1YTc0NDAwKSwgRElDTygweDRkMDAwZjgwKSwgRElDTygweDUyYmQ2ODgwKSwgRElDTygweDVhNzQzYTgwKSwKKyAgICBESUNPKDB4MDY5Nzk0OTgpLCBESUNPKDB4MDg4ZmVjZjApLCBESUNPKDB4MGYxZGFjOTApLCBESUNPKDB4MTIwNzcxNjApLAorICAgIERJQ08oMHgxNmQ1YjEyMCksIERJQ08oMHgxYzU0NjVjMCksIERJQ08oMHgyMWFkMTRjMCksIERJQ08oMHgyODJiZTI4MCksCisgICAgRElDTygweDJiNjZhMzgwKSwgRElDTygweDJmYTNmMjAwKSwgRElDTygweDM1YTA2NTAwKSwgRElDTygweDNhNDU4ZDAwKSwKKyAgICBESUNPKDB4NDRhZWZjMDApLCBESUNPKDB4NGU5MmY2MDApLCBESUNPKDB4NTViOWZhODApLCBESUNPKDB4NWNmZTAyODApLAorICAgIERJQ08oMHgwNTUyYjQwOCksIERJQ08oMHgwNmY2Y2UzOCksIERJQ08oMHgwZThmOGQ4MCksIERJQ08oMHgxMzk1ZTkwMCksCisgICAgRElDTygweDE3YzdiNDQwKSwgRElDTygweDFlYzY0ZGMwKSwgRElDTygweDIzNmUyMjAwKSwgRElDTygweDJhYmMwYjgwKSwKKyAgICBESUNPKDB4MmUxMzEyNDApLCBESUNPKDB4MzI5MjExMDApLCBESUNPKDB4MzcyNjMzYzApLCBESUNPKDB4M2NhOTc4NDApLAorICAgIERJQ08oMHg0OTZlNTAwMCksIERJQ08oMHg0Zjg2YTgwMCksIERJQ08oMHg1NDA3MjMwMCksIERJQ08oMHg1YmUzMWM4MCksCisgICAgRElDTygweDA0NzBjMGI4KSwgRElDTygweDA2NjJjNDY4KSwgRElDTygweDBjNDkzZmQwKSwgRElDTygweDFhMTk0OWMwKSwKKyAgICBESUNPKDB4MWZlYmNjMjApLCBESUNPKDB4MjM2NGU5MDApLCBESUNPKDB4MmEwY2NlMDApLCBESUNPKDB4MmY2ZjgxNDApLAorICAgIERJQ08oMHgzNDE4YjAwMCksIERJQ08oMHgzYzVjN2E0MCksIERJQ08oMHg0MmQzOTEwMCksIERJQ08oMHg0NzZjMmIwMCksCisgICAgRElDTygweDRlMTFjMzAwKSwgRElDTygweDUzNjIxNTAwKSwgRElDTygweDU4M2ZkMjgwKSwgRElDTygweDVjZTI2NjAwKSwKKyAgICBESUNPKDB4MDRiMDA2YzApLCBESUNPKDB4MDlhMWVkNDApLCBESUNPKDB4MTM1YWVlMDApLCBESUNPKDB4MTkzYjUxODApLAorICAgIERJQ08oMHgxZjM2NzlhMCksIERJQ08oMHgyNGZkYmNjMCksIERJQ08oMHgyYjgyM2UwMCksIERJQ08oMHgzMTgzNTc4MCksCisgICAgRElDTygweDM3Yzc0Y2MwKSwgRElDTygweDNkZjY2NzgwKSwgRElDTygweDQzYzE4NTgwKSwgRElDTygweDQ5NDY1OTgwKSwKKyAgICBESUNPKDB4NGVkMGNlMDApLCBESUNPKDB4NTNkNmZiODApLCBESUNPKDB4NTkwNjQzMDApLCBESUNPKDB4NWRlYWExMDApLAorICAgIERJQ08oMHgwM2NiYzQ5YyksIERJQ08oMHgwNzczNTkzMCksIERJQ08oMHgxMzhhYWEyMCksIERJQ08oMHgxYTFlNjlhMCksCisgICAgRElDTygweDIxYmU5M2MwKSwgRElDTygweDI5MzZmNzgwKSwgRElDTygweDJmYTc2ZjgwKSwgRElDTygweDM0YWU2YjAwKSwKKyAgICBESUNPKDB4Mzk2YjdiODApLCBESUNPKDB4M2RiYzY3MDApLCBESUNPKDB4NDIxYTkxMDApLCBESUNPKDB4NDZmZDIxODApLAorICAgIERJQ08oMHg0YzVkY2E4MCksIERJQ08oMHg1MTkyM2I4MCksIERJQ08oMHg1NzZkMTMwMCksIERJQ08oMHg1ZDI4ODY4MCksCisgICAgRElDTygweDAzY2FiN2QwKSwgRElDTygweDA1MmM4OGI4KSwgRElDTygweDA5ZWQyNGYwKSwgRElDTygweDFjMjYxODIwKSwKKyAgICBESUNPKDB4MjA5MDk2YzApLCBESUNPKDB4MjM2MWUwODApLCBESUNPKDB4MjcyOTI4MDApLCBESUNPKDB4MmJiZGM2YzApLAorICAgIERJQ08oMHgzMjkyZGE4MCksIERJQ08oMHgzNjg2NmE0MCksIERJQ08oMHgzYzRkNTEwMCksIERJQ08oMHg0NTIzMzQwMCksCisgICAgRElDTygweDRkOTI4YTAwKSwgRElDTygweDUyY2E5ZDAwKSwgRElDTygweDU4MjBkMDAwKSwgRElDTygweDVkOTAzODgwKSwKKyAgICBESUNPKDB4MDNmODM3MTgpLCBESUNPKDB4MDU0MGZhOTApLCBESUNPKDB4MTMwMjgxMjApLCBESUNPKDB4MWFkNmUxNjApLAorICAgIERJQ08oMHgxZDc4NDg4MCksIERJQ08oMHgyMjAyODkwMCksIERJQ08oMHgyNTk3NmI0MCksIERJQ08oMHgyYjI5MzcwMCksCisgICAgRElDTygweDJkZGI4NmMwKSwgRElDTygweDMxN2M0MzQwKSwgRElDTygweDM0ZTYyZWMwKSwgRElDTygweDNiNzFiZDAwKSwKKyAgICBESUNPKDB4NGJjMzQ3ODApLCBESUNPKDB4NTI5ODI0MDApLCBESUNPKDB4NTdmYTI4MDApLCBESUNPKDB4NWYxOWNjMDApLAorICAgIERJQ08oMHgwNDljZWI1MCksIERJQ08oMHgwNmE4ZDRlMCksIERJQ08oMHgwOWRiMjQ3MCksIERJQ08oMHgxMjBlM2U2MCksCisgICAgRElDTygweDFjOGViYjgwKSwgRElDTygweDIxMjIxZDAwKSwgRElDTygweDI2NzliZmMwKSwgRElDTygweDJiMWU3NjAwKSwKKyAgICBESUNPKDB4MmViYmNmODApLCBESUNPKDB4MzJkNWFmYzApLCBESUNPKDB4M2QxYmVmMDApLCBESUNPKDB4NDFiMTFhMDApLAorICAgIERJQ08oMHg0NWJiMmQ4MCksIERJQ08oMHg0Y2I3MDMwMCksIERJQ08oMHg1NzJmZGM4MCksIERJQ08oMHg1ZDg3NmU4MCksCisgICAgRElDTygweDA0YWJkYTY4KSwgRElDTygweDA2Njk4Y2QwKSwgRElDTygweDBjYTg3MjMwKSwgRElDTygweDE1MDg2YTgwKSwKKyAgICBESUNPKDB4MTc2Y2Y0ZTApLCBESUNPKDB4MjI4OTk0NDApLCBESUNPKDB4MjY4ZmM1MDApLCBESUNPKDB4MmJhMmQ5NDApLAorICAgIERJQ08oMHgzMzUwNTk4MCksIERJQ08oMHgzNjk0NGJjMCksIERJQ08oMHgzYjIwYzI4MCksIERJQ08oMHg0MzdlOGYwMCksCisgICAgRElDTygweDRiZjI5ZTgwKSwgRElDTygweDUxNzc2YTgwKSwgRElDTygweDU3YTc3ODAwKSwgRElDTygweDVjZjZjMTgwKSwKKyAgICBESUNPKDB4MDZkN2Y1YzApLCBESUNPKDB4MDhmZDNjYzApLCBESUNPKDB4MGQ4ODA3ZTApLCBESUNPKDB4MTE0MGQ1MDApLAorICAgIERJQ08oMHgxNDZkZmM4MCksIERJQ08oMHgxZTlmYmFhMCksIERJQ08oMHgyM2Q3YmYwMCksIERJQ08oMHgyOGIyYWU4MCksCisgICAgRElDTygweDJlNWE5YjAwKSwgRElDTygweDMyNzAwNWMwKSwgRElDTygweDM3NzM2NjQwKSwgRElDTygweDQwMDFjNTAwKSwKKyAgICBESUNPKDB4NGE4NjJiMDApLCBESUNPKDB4NGY3YTJlMDApLCBESUNPKDB4NTRhMjIwODApLCBESUNPKDB4NWI3NmMzODApLAorICAgIERJQ08oMHgwNjcxZmI2OCksIERJQ08oMHgwOGU0YmYzMCksIERJQ08oMHgwZDgwMTI1MCksIERJQ08oMHgxMTc2YjgyMCksCisgICAgRElDTygweDE1MTI4ODYwKSwgRElDTygweDFlZTIxMTgwKSwgRElDTygweDI0Nzk5NTgwKSwgRElDTygweDI5NDE1YTQwKSwKKyAgICBESUNPKDB4MmVmYTIzODApLCBESUNPKDB4MzNmZTUwNDApLCBESUNPKDB4MzliZjZkMDApLCBESUNPKDB4M2YyOGIzODApLAorICAgIERJQ08oMHg0NDJiMjI4MCksIERJQ08oMHg0OTNkZTY4MCksIERJQ08oMHg1NDM3NzcwMCksIERJQ08oMHg1ZDNhNTQ4MCksCisgICAgRElDTygweDA2NWI3OTcwKSwgRElDTygweDA4NzgyMGIwKSwgRElDTygweDBkOGQ2YWEwKSwgRElDTygweDE2NzE4NjIwKSwKKyAgICBESUNPKDB4MWEzYThmNDApLCBESUNPKDB4MWY0MDk5YzApLCBESUNPKDB4MjRkODdiNDApLCBESUNPKDB4Mjk2ZDg1YzApLAorICAgIERJQ08oMHgyZjg4N2M4MCksIERJQ08oMHgzNDJkMWI0MCksIERJQ08oMHgzODg3ZmM0MCksIERJQ08oMHgzZDc1OGI0MCksCisgICAgRElDTygweDQyNjQxYzgwKSwgRElDTygweDQ3YmY2OTgwKSwgRElDTygweDU1ZjgyOTAwKSwgRElDTygweDVlMTMyYTAwKSwKKyAgICBESUNPKDB4MDVkZGJjMDApLCBESUNPKDB4MDgxZjE3YTApLCBESUNPKDB4MGJmMjNhYzApLCBESUNPKDB4MTJmYzhkNjApLAorICAgIERJQ08oMHgxNzJiYzQ0MCksIERJQ08oMHgxYTgzMzU0MCksIERJQ08oMHgxZTk0MjIwMCksIERJQ08oMHgyMWU0NzdjMCksCisgICAgRElDTygweDJlNzVkYTgwKSwgRElDTygweDM5OWVmYWMwKSwgRElDTygweDNkZmI2OTAwKSwgRElDTygweDQyOGIzNzgwKSwKKyAgICBESUNPKDB4NDkyMmEwODApLCBESUNPKDB4NGQ0YzE3MDApLCBESUNPKDB4NTFiYmVlMDApLCBESUNPKDB4NWI0Y2ZjODApLAorICAgIERJQ08oMHgwNmVjZjM4MCksIERJQ08oMHgwOGY4Mzk5MCksIERJQ08oMHgwY2I1NTY4MCksIERJQ08oMHgxNDBiMjg2MCksCisgICAgRElDTygweDE4MDg0ZDAwKSwgRElDTygweDFhZmY5OTQwKSwgRElDTygweDFmNWY2ZjAwKSwgRElDTygweDIyNGEzZDgwKSwKKyAgICBESUNPKDB4MmIwZjQ5YzApLCBESUNPKDB4MzYxM2IyODApLCBESUNPKDB4MzkxODhmNDApLCBESUNPKDB4M2VmYTM2NDApLAorICAgIERJQ08oMHg0NzcxZTQwMCksIERJQ08oMHg0Y2EzMjM4MCksIERJQ08oMHg1NDYyNzU4MCksIERJQ08oMHg1Y2I5MTAwMCksCisgICAgRElDTygweDA2OWU3Zjk4KSwgRElDTygweDA4NzBjNzYwKSwgRElDTygweDBkN2I3M2EwKSwgRElDTygweDE1YWIxMDQwKSwKKyAgICBESUNPKDB4MThhNGQyMjApLCBESUNPKDB4MWM0YzFmMjApLCBESUNPKDB4MWZmYWYyMDApLCBESUNPKDB4MjQxNDI1ODApLAorICAgIERJQ08oMHgzMGU0NzU0MCksIERJQ08oMHgzNzM0MDIwMCksIERJQ08oMHgzYTY5YWY0MCksIERJQ08oMHgzZWQ0NzFjMCksCisgICAgRElDTygweDQ0MTU3ODgwKSwgRElDTygweDQ4NmI3ZjAwKSwgRElDTygweDUyZWQyYjAwKSwgRElDTygweDVjZTNhOTgwKSwKKyAgICBESUNPKDB4MDQ3ZjEwODApLCBESUNPKDB4MDY0NjMyMzApLCBESUNPKDB4MGI1NjZlODApLCBESUNPKDB4MGVkYjkwODApLAorICAgIERJQ08oMHgxMjhhMmZhMCksIERJQ08oMHgxNzQ4YjM0MCksIERJQ08oMHgyMTBiMmIwMCksIERJQ08oMHgyODA5OWI4MCksCisgICAgRElDTygweDJmNTE5NzQwKSwgRElDTygweDM2ZmU4MmMwKSwgRElDTygweDNkOTI0YjgwKSwgRElDTygweDQzY2QzYzAwKSwKKyAgICBESUNPKDB4NGE3NzQ2ODApLCBESUNPKDB4NTBkMTVmMDApLCBESUNPKDB4NTczYjM1ODApLCBESUNPKDB4NWQ0YzFjMDApLAorICAgIERJQ08oMHgwNWZhNmE2OCksIERJQ08oMHgwODY2ZTRjMCksIERJQ08oMHgwZDEzM2NjMCksIERJQ08oMHgxNTZkNmIyMCksCisgICAgRElDTygweDE4YWJlYmUwKSwgRElDTygweDFkMzc0OTAwKSwgRElDTygweDIzZDIzZDAwKSwgRElDTygweDI3YjM3MGMwKSwKKyAgICBESUNPKDB4MmY2M2VmMDApLCBESUNPKDB4MzUyYTA2MDApLCBESUNPKDB4M2E2NDNhNDApLCBESUNPKDB4M2Y1N2Y5ODApLAorICAgIERJQ08oMHg0NTdhN2YwMCksIERJQ08oMHg1MjBmNjIwMCksIERJQ08oMHg1OTNiMmM4MCksIERJQ08oMHg1ZTE5MmI4MCksCisgICAgRElDTygweDA0ZTRlMGM4KSwgRElDTygweDA2N2MzNDUwKSwgRElDTygweDBhY2FiZTcwKSwgRElDTygweDE4NjVlZWMwKSwKKyAgICBESUNPKDB4MWM1ZTliYzApLCBESUNPKDB4MjAyZmFjYzApLCBESUNPKDB4MjRhNjA5YzApLCBESUNPKDB4MjhkYjdiMDApLAorICAgIERJQ08oMHgyZWZiZDc4MCksIERJQ08oMHgzMzZmZTVjMCksIERJQ08oMHgzODE5YTVjMCksIERJQ08oMHgzZTcwOWI0MCksCisgICAgRElDTygweDQ0MzVmZjgwKSwgRElDTygweDRiZDVmYjgwKSwgRElDTygweDU1NjRhMTAwKSwgRElDTygweDVkMGE0OTgwKSwKKyAgICBESUNPKDB4MDVhNzJmMDApLCBESUNPKDB4MDcwMTk5YjApLCBESUNPKDB4MGU2NTQ3ODApLCBESUNPKDB4MTRmYzc3ODApLAorICAgIERJQ08oMHgxNzQyODNjMCksIERJQ08oMHgxYjIzMTQ4MCksIERJQ08oMHgxZTdiOTAwMCksIERJQ08oMHgyN2EwMTNjMCksCisgICAgRElDTygweDJiNDJmNTAwKSwgRElDTygweDJmZDljYTAwKSwgRElDTygweDM2NzJhMGMwKSwgRElDTygweDNjYzIzZjQwKSwKKyAgICBESUNPKDB4NDgyOTlkODApLCBESUNPKDB4NGY5MmE4MDApLCBESUNPKDB4NTY0ZDc2ODApLCBESUNPKDB4NWQzYWI1ODApLAorICAgIERJQ08oMHgwM2U2Mzc2NCksIERJQ08oMHgwNWJhYTNmMCksIERJQ08oMHgwYWIyYTMwMCksIERJQ08oMHgxMmNjNWY2MCksCisgICAgRElDTygweDE5YThkNWUwKSwgRElDTygweDFlYTc4OGUwKSwgRElDTygweDIyY2Q1MGMwKSwgRElDTygweDI1ZDQ4YTAwKSwKKyAgICBESUNPKDB4Mjk5MjQ1NDApLCBESUNPKDB4MzI3NjJhMDApLCBESUNPKDB4M2JiYTU1YzApLCBESUNPKDB4NDIyMmU4MDApLAorICAgIERJQ08oMHg0YWJhMTI4MCksIERJQ08oMHg1MDFkMGI4MCksIERJQ08oMHg1NzA5MTIwMCksIERJQ08oMHg1ZDZiZjE4MCksCisgICAgRElDTygweDA0N2RhZWIwKSwgRElDTygweDA2OTU0OGI4KSwgRElDTygweDBiMDAyNDEwKSwgRElDTygweDEzZmY3MDYwKSwKKyAgICBESUNPKDB4MTg2YWVjNDApLCBESUNPKDB4MjEwZGIyNDApLCBESUNPKDB4MjZmMWNlODApLCBESUNPKDB4MmI3M2M5YzApLAorICAgIERJQ08oMHgzM2Q1NzI0MCksIERJQ08oMHgzODU4OThjMCksIERJQ08oMHgzZWVhOGNjMCksIERJQ08oMHg0M2M3OWIwMCksCisgICAgRElDTygweDQ5NmVjMjAwKSwgRElDTygweDRlMTUwNzgwKSwgRElDTygweDU0ZGNiNzAwKSwgRElDTygweDVjM2Y3MzgwKSwKKyAgICBESUNPKDB4MDc5ZmQyNTgpLCBESUNPKDB4MGI5M2JkNTApLCBESUNPKDB4MGZmN2Q4YjApLCBESUNPKDB4MTRiZDRlMDApLAorICAgIERJQ08oMHgxOTUzNmFlMCksIERJQ08oMHgxZDhiMTY0MCksIERJQ08oMHgyMzc0N2NjMCksIERJQ08oMHgyODYxZjI4MCksCisgICAgRElDTygweDJkN2QyODgwKSwgRElDTygweDM1ODNiMDQwKSwgRElDTygweDNjM2NhYjAwKSwgRElDTygweDQxYjdiNTgwKSwKKyAgICBESUNPKDB4NDk4Y2ZjODApLCBESUNPKDB4NTA2Y2JkMDApLCBESUNPKDB4NTc4NDc2MDApLCBESUNPKDB4NWQwNWRlODApLAorICAgIERJQ08oMHgwNjQzNGVjMCksIERJQ08oMHgwODA1Y2NkMCksIERJQ08oMHgwYzRiNGMwMCksIERJQ08oMHgxM2Q1NTFjMCksCisgICAgRElDTygweDE2ODVhYmUwKSwgRElDTygweDFhODNlYTYwKSwgRElDTygweDFkZGMzNzAwKSwgRElDTygweDIyYmM0NjAwKSwKKyAgICBESUNPKDB4MmM3Y2E1YzApLCBESUNPKDB4MzBhNTg5YzApLCBESUNPKDB4Mzk1YTg3MDApLCBESUNPKDB4NDBjOTI5MDApLAorICAgIERJQ08oMHg0NzJmYWU4MCksIERJQ08oMHg0ZjZmNmU4MCksIERJQ08oMHg1NzFiM2Y4MCksIERJQ08oMHg1ZDhlNjk4MCksCisgICAgRElDTygweDA1ZWMyMWIwKSwgRElDTygweDA3OWVlMzg4KSwgRElDTygweDBlNGI0NTgwKSwgRElDTygweDExYWJmMTAwKSwKKyAgICBESUNPKDB4MTY1ODhlYzApLCBESUNPKDB4MWM5ODRlYzApLCBESUNPKDB4MjBhMzg0YzApLCBESUNPKDB4MjhkNmJlMDApLAorICAgIERJQ08oMHgyYmNjYTc0MCksIERJQ08oMHgzNjA0YjYwMCksIERJQ08oMHgzZjAyNzI4MCksIERJQ08oMHg0MzRhZjAwMCksCisgICAgRElDTygweDQ4ZGFjMjgwKSwgRElDTygweDRkN2U4YTAwKSwgRElDTygweDUxZjYxODAwKSwgRElDTygweDVhNmQ5MzgwKSwKKyAgICBESUNPKDB4MDU1MmM2YzApLCBESUNPKDB4MDcwYzIyYTApLCBESUNPKDB4MGE0MTFiNTApLCBESUNPKDB4MGUzZTUyNzApLAorICAgIERJQ08oMHgxMTkzYmI2MCksIERJQ08oMHgxYjE3N2UwMCksIERJQ08oMHgyNzViMjUwMCksIERJQ08oMHgyYjQyYmQ4MCksCisgICAgRElDTygweDMyMmQ3ZTQwKSwgRElDTygweDNhMTcwODgwKSwgRElDTygweDNkNjZiNTgwKSwgRElDTygweDQxNDEzMjgwKSwKKyAgICBESUNPKDB4NDZhOWNlODApLCBESUNPKDB4NGU0ZTM4MDApLCBESUNPKDB4NTcxZjgzODApLCBESUNPKDB4NWRkYWUzODApLAorICAgIERJQ08oMHgwNTU2MDJjMCksIERJQ08oMHgwNmU2OTExOCksIERJQ08oMHgwYzlkMTNmMCksIERJQ08oMHgxMDkwZDUwMCksCisgICAgRElDTygweDEzOGQyMjgwKSwgRElDTygweDE3MWJmNTQwKSwgRElDTygweDFiNTg1MTgwKSwgRElDTygweDI4OGI5NzQwKSwKKyAgICBESUNPKDB4MmRiMjAyYzApLCBESUNPKDB4MzUyNWU2ODApLCBESUNPKDB4M2MzMDM5MDApLCBESUNPKDB4NDMxMWRmODApLAorICAgIERJQ08oMHg0OWI5MmMwMCksIERJQ08oMHg1MDlkZTkwMCksIERJQ08oMHg1NmU5YTA4MCksIERJQ08oMHg1ZDUyM2E4MCksCisgICAgRElDTygweDA0ZTc5ODEwKSwgRElDTygweDA2OTYyNmU4KSwgRElDTygweDBhNmNmNjgwKSwgRElDTygweDBkYTY2OGMwKSwKKyAgICBESUNPKDB4MTE1ODcyYTApLCBESUNPKDB4MjAzMmVlYzApLCBESUNPKDB4MjUzNDVkYzApLCBESUNPKDB4MmFlOGVhNDApLAorICAgIERJQ08oMHgzMDIyNDI4MCksIERJQ08oMHgzNTFmZjY0MCksIERJQ08oMHgzY2U2NWE4MCksIERJQ08oMHg0NTRiZmYwMCksCisgICAgRElDTygweDRlZTA4OTgwKSwgRElDTygweDU0M2I0MjgwKSwgRElDTygweDU5YzE5MjgwKSwgRElDTygweDVkZGZiYjAwKSwKKyAgICBESUNPKDB4MDNmMGJiOTgpLCBESUNPKDB4MDU4OGY0ZjApLCBESUNPKDB4MGE4NjJiYzApLCBESUNPKDB4MTRlYzc2ZTApLAorICAgIERJQ08oMHgxODRiOGE4MCksIERJQ08oMHgxZjdiYmQ4MCksIERJQ08oMHgyM2YxYTdjMCksIERJQ08oMHgyYzM2NzkwMCksCisgICAgRElDTygweDMyMzRhZjgwKSwgRElDTygweDM1NDYwYWMwKSwgRElDTygweDM4NTE0YzAwKSwgRElDTygweDNkNWYzNTQwKSwKKyAgICBESUNPKDB4NDgzOTQ5ODApLCBESUNPKDB4NGZiZGQzODApLCBESUNPKDB4NTZkZTAyODApLCBESUNPKDB4NWQ0ZTY1MDApLAorICAgIERJQ08oMHgwNjA1MGYyOCksIERJQ08oMHgwODA3MGFmMCksIERJQ08oMHgwYmUzMTI0MCksIERJQ08oMHgwZjVlNTNlMCksCisgICAgRElDTygweDEyNWYxNzQwKSwgRElDTygweDIxNWIxZmMwKSwgRElDTygweDI4ODNkODgwKSwgRElDTygweDJjMTgxMDgwKSwKKyAgICBESUNPKDB4MzI4MTAyODApLCBESUNPKDB4MzVkNTY4MDApLCBESUNPKDB4M2E5YjA4ODApLCBESUNPKDB4M2ZmYWFmODApLAorICAgIERJQ08oMHg0NGM2NTUwMCksIERJQ08oMHg0YTQ1YWU4MCksIERJQ08oMHg1NmI0ZWQ4MCksIERJQ08oMHg1ZTRhZGMwMCksCisgICAgRElDTygweDAzNzJiYmI0KSwgRElDTygweDA0ZWE0ODQ4KSwgRElDTygweDA5YjhkZTcwKSwgRElDTygweDE1MWI0YTQwKSwKKyAgICBESUNPKDB4MWJlNjVhMDApLCBESUNPKDB4MjA3NjU1YzApLCBESUNPKDB4MjcyMGRkMDApLCBESUNPKDB4MmZjNmNjMDApLAorICAgIERJQ08oMHgzNWIwNjNjMCksIERJQ08oMHgzOWJkMzBjMCksIERJQ08oMHgzZGM1YjU4MCksIERJQ08oMHg0MmFmN2IwMCksCisgICAgRElDTygweDQ4ZDJiZjAwKSwgRElDTygweDRmNDZiYjgwKSwgRElDTygweDU1ZjdjYTgwKSwgRElDTygweDVjYTdlOTgwKSwKKyAgICBESUNPKDB4MDMzZjg2OGMpLCBESUNPKDB4MDRkOWEwZTApLCBESUNPKDB4MGExOGQ2ZDApLCBESUNPKDB4MTNkYTU1ODApLAorICAgIERJQ08oMHgxODFhZTg4MCksIERJQ08oMHgyMDdkODU4MCksIERJQ08oMHgyNjIwMjJjMCksIERJQ08oMHgyYzZkZTA0MCksCisgICAgRElDTygweDMzMjFmMTAwKSwgRElDTygweDM5MjdmMGMwKSwgRElDTygweDNmNzRjZTQwKSwgRElDTygweDQ1NzNlOTgwKSwKKyAgICBESUNPKDB4NGJhNjZjODApLCBESUNPKDB4NTFhMjYxMDApLCBESUNPKDB4NTdkM2E4MDApLCBESUNPKDB4NWQ1MmU3ODApLAorICAgIERJQ08oMHgwNTE4OTg2MCksIERJQ08oMHgwNzIzMTg0OCksIERJQ08oMHgwYjkxNTcxMCksIERJQ08oMHgwZjA1ZDZjMCksCisgICAgRElDTygweDEzYmIwODIwKSwgRElDTygweDIyM2FkZjAwKSwgRElDTygweDI2Y2UxZWMwKSwgRElDTygweDJjZTFhYzAwKSwKKyAgICBESUNPKDB4MzQwMWY2YzApLCBESUNPKDB4M2I4YzIyNDApLCBESUNPKDB4NDBlNGE0MDApLCBESUNPKDB4NDU2NzRmMDApLAorICAgIERJQ08oMHg0YjA0Yjg4MCksIERJQ08oMHg0ZjI1MzIwMCksIERJQ08oMHg1NDE2ODYwMCksIERJQ08oMHg1OGY1Mjc4MCksCisgICAgRElDTygweDAzMzhkMTg0KSwgRElDTygweDA1MjA1NzkwKSwgRElDTygweDA5YWJjZDgwKSwgRElDTygweDBmNTNmZjYwKSwKKyAgICBESUNPKDB4MWE3ZmU5MDApLCBESUNPKDB4MWVmOTM4NjApLCBESUNPKDB4MjM4ZTJkODApLCBESUNPKDB4MmJkODFiYzApLAorICAgIERJQ08oMHgzMzE2MTI0MCksIERJQ08oMHgzNjhjZmI4MCksIERJQ08oMHgzYTI4YjVjMCksIERJQ08oMHg0MGM3YTYwMCksCisgICAgRElDTygweDRiYWM3NzgwKSwgRElDTygweDUyNGI3ODgwKSwgRElDTygweDU4NjM4NDgwKSwgRElDTygweDVkYTA3YjAwKSwKKyAgICBESUNPKDB4MDRkMDZmMzgpLCBESUNPKDB4MDY1ZjE1MTgpLCBESUNPKDB4MGM5YjMxYjApLCBESUNPKDB4MTA1NzBkNDApLAorICAgIERJQ08oMHgxNWU3OTBhMCksIERJQ08oMHgyMGYxNjM4MCksIERJQ08oMHgyNDZmMjNjMCksIERJQ08oMHgyZTIyMjgwMCksCisgICAgRElDTygweDMxOThiZjAwKSwgRElDTygweDM0Yjg0NjQwKSwgRElDTygweDM4ZjViNDQwKSwgRElDTygweDQzMTJkZjgwKSwKKyAgICBESUNPKDB4NGQyZDMwMDApLCBESUNPKDB4NTIwOWVlODApLCBESUNPKDB4NTc5Y2YxODApLCBESUNPKDB4NWNiMzc2ODApLAorICAgIERJQ08oMHgwNDJlNjU2MCksIERJQ08oMHgwNWVhZmYzMCksIERJQ08oMHgwYTA5MGQzMCksIERJQ08oMHgwZDlmMmFiMCksCisgICAgRElDTygweDFhNmYwMjYwKSwgRElDTygweDIwOWUwYzAwKSwgRElDTygweDI1ZGM5NWMwKSwgRElDTygweDI5Zjg5ODQwKSwKKyAgICBESUNPKDB4MmYzNzI4NDApLCBESUNPKDB4M2EzMDE5NDApLCBESUNPKDB4M2YwZTJlODApLCBESUNPKDB4NDQ0NjVjODApLAorICAgIERJQ08oMHg0OTIwNzc4MCksIERJQ08oMHg0ZGZkYWI4MCksIERJQ08oMHg1MzJlYzAwMCksIERJQ08oMHg1YWNlZmQwMCksCisgICAgRElDTygweDA0ZTE4YWQ4KSwgRElDTygweDA2ZDViNjYwKSwgRElDTygweDBiMmEyMmQwKSwgRElDTygweDBlMGU0ZWYwKSwKKyAgICBESUNPKDB4MTk4MzA0YTApLCBESUNPKDB4MWU0YTI1YzApLCBESUNPKDB4MjNkZTM3YzApLCBESUNPKDB4MjkwNjc5YzApLAorICAgIERJQ08oMHgyZDUyM2IwMCksIERJQ08oMHgzMzdkZjk0MCksIERJQ08oMHgzNzk0ODEwMCksIERJQ08oMHgzZGUwNzMwMCksCisgICAgRElDTygweDQ5ZWU2ZTgwKSwgRElDTygweDUwNTc2MTAwKSwgRElDTygweDU1ZmIxZTAwKSwgRElDTygweDVkMDgwNTAwKSwKKyAgICBESUNPKDB4MDUzMTIzMDgpLCBESUNPKDB4MDcwNDYzZjApLCBESUNPKDB4MGRhZmZiYTApLCBESUNPKDB4MTJkOGMzYzApLAorICAgIERJQ08oMHgxNjNhYjdhMCksIERJQ08oMHgyMGM2NGM0MCksIERJQ08oMHgyNGM4ZmU0MCksIERJQ08oMHgyYTZmNjVjMCksCisgICAgRElDTygweDMwNTVlMTAwKSwgRElDTygweDM0NDIwZDgwKSwgRElDTygweDM4OWRlZDAwKSwgRElDTygweDNjYzU3NjQwKSwKKyAgICBESUNPKDB4NDI4MGNkMDApLCBESUNPKDB4NGUwYTRjMDApLCBESUNPKDB4NTc2NzVmMDApLCBESUNPKDB4NWQ4N2Q0ODApLAorICAgIERJQ08oMHgwNDdiZDU5OCksIERJQ08oMHgwNmNiMTQ5OCksIERJQ08oMHgwYzM1OTkzMCksIERJQ08oMHgxMzgxNjVlMCksCisgICAgRElDTygweDFjYWUzNjQwKSwgRElDTygweDIxNjQ3NjQwKSwgRElDTygweDI4MzZmYWMwKSwgRElDTygweDJjZDdiODQwKSwKKyAgICBESUNPKDB4MzBkODM5YzApLCBESUNPKDB4MzYwYzk0NDApLCBESUNPKDB4M2FlNWNhNDApLCBESUNPKDB4NDBhOTNiMDApLAorICAgIERJQ08oMHg0OTQwMWU4MCksIERJQ08oMHg0ZjczOWM4MCksIERJQ08oMHg1NGYzM2MwMCksIERJQ08oMHg1YzE5MDIwMCksCisgICAgRElDTygweDA1MWMwMDAwKSwgRElDTygweDA2YjQ1MjU4KSwgRElDTygweDBhNWVlZTUwKSwgRElDTygweDBkNDZmYzMwKSwKKyAgICBESUNPKDB4MTI1YmJjNjApLCBESUNPKDB4MjUzZDhjYzApLCBESUNPKDB4MmExZmQ2YzApLCBESUNPKDB4MmRmNGNmODApLAorICAgIERJQ08oMHgzMjM5ZTNjMCksIERJQ08oMHgzNWE2ODNjMCksIERJQ08oMHgzYjBiYjk4MCksIERJQ08oMHg0MDliM2QwMCksCisgICAgRElDTygweDQ2NjMzNTgwKSwgRElDTygweDRmMmIwNjAwKSwgRElDTygweDU3N2NlYTgwKSwgRElDTygweDVkODZlZjAwKSwKKyAgICBESUNPKDB4MDNkMTllZWMpLCBESUNPKDB4MDdjY2U2ZDApLCBESUNPKDB4MTQzYjRiMDApLCBESUNPKDB4MWE2NTc4ODApLAorICAgIERJQ08oMHgyMTJlMDI4MCksIERJQ08oMHgyODMxZmJjMCksIERJQ08oMHgyZjhiYTA4MCksIERJQ08oMHgzNWRiODA0MCksCisgICAgRElDTygweDNiZjE3ZjAwKSwgRElDTygweDQxM2ViMTAwKSwgRElDTygweDQ2MTU0OTAwKSwgRElDTygweDRhZTE4MDgwKSwKKyAgICBESUNPKDB4NGY5YmExODApLCBESUNPKDB4NTQyOGJhMDApLCBESUNPKDB4NTkwZTkwODApLCBESUNPKDB4NWRlMGQ4ODApLAorICAgIERJQ08oMHgwOGM3ZTcyMCksIERJQ08oMHgwZmYxNDgxMCksIERJQ08oMHgxNzU4Y2M0MCksIERJQ08oMHgxY2M3NDRjMCksCisgICAgRElDTygweDIzZTQ1Y2MwKSwgRElDTygweDJiNTI3OTQwKSwgRElDTygweDMyMTM4NTgwKSwgRElDTygweDM3Yjc3MzgwKSwKKyAgICBESUNPKDB4M2Q3ZGE0ODApLCBESUNPKDB4NDI3NWE4MDApLCBESUNPKDB4NDczZWNmMDApLCBESUNPKDB4NGJjN2RjODApLAorICAgIERJQ08oMHg1MDUxMjQwMCksIERJQ08oMHg1NGQyYzYwMCksIERJQ08oMHg1OThjZTY4MCksIERJQ08oMHg1ZTFlMDgwMCksCisgICAgRElDTygweDA5MTY3OTEwKSwgRElDTygweDEwNzY0NGEwKSwgRElDTygweDE3MWE1OWUwKSwgRElDTygweDFiZTFlYTYwKSwKKyAgICBESUNPKDB4MjEzNDc2ODApLCBESUNPKDB4MjY1YTViMDApLCBESUNPKDB4MmJlNDFhNDApLCBESUNPKDB4MzExNmU3MDApLAorICAgIERJQ08oMHgzNjhiMDMwMCksIERJQ08oMHgzYzIyNWU4MCksIERJQ08oMHg0MWE2ZTg4MCksIERJQ08oMHg0NzYzMTY4MCksCisgICAgRElDTygweDRkNDdkOTAwKSwgRElDTygweDUyYTI4NDAwKSwgRElDTygweDU4M2YwZTgwKSwgRElDTygweDVkNzdiYzgwKSwKKyAgICBESUNPKDB4MDQwYmRmODgpLCBESUNPKDB4MDViMDYyYTApLCBESUNPKDB4MGI0YTJmNzApLCBESUNPKDB4MWI4Y2Q4ODApLAorICAgIERJQ08oMHgxZWM1OGM0MCksIERJQ08oMHgyMzY2MTg4MCksIERJQ08oMHgyNzkwYmE4MCksIERJQ08oMHgyZDBkNmM0MCksCisgICAgRElDTygweDM0ZjBiYzQwKSwgRElDTygweDNhMzUzZjgwKSwgRElDTygweDNmYzNiYzQwKSwgRElDTygweDQ0OTk4NzAwKSwKKyAgICBESUNPKDB4NDliMTcwODApLCBESUNPKDB4NGYzMWZhMDApLCBESUNPKDB4NTUzMTFjODApLCBESUNPKDB4NWI1YzhmODApLAorICAgIERJQ08oMHgwNDNlMmJkMCksIERJQ08oMHgwNjQ1YjBmMCksIERJQ08oMHgwYWRlNWI5MCksIERJQ08oMHgwZDY1M2E5MCksCisgICAgRElDTygweDFiYzIyNGEwKSwgRElDTygweDFmNjIzZGMwKSwgRElDTygweDI3ZTlhODQwKSwgRElDTygweDJjNzE5YmMwKSwKKyAgICBESUNPKDB4MmYyYWMwNDApLCBESUNPKDB4MzI2ODgzMDApLCBESUNPKDB4MzY2OTVjMDApLCBESUNPKDB4M2I4YWJlNDApLAorICAgIERJQ08oMHg0NzE1M2E4MCksIERJQ08oMHg1MjQ5MWIwMCksIERJQ08oMHg1N2JhNzY4MCksIERJQ08oMHg1Y2U2YzMwMCksCisgICAgRElDTygweDA1Mjk0MGI4KSwgRElDTygweDA2ZjI4MjI4KSwgRElDTygweDBhNzQxYzkwKSwgRElDTygweDBkYWEzMTEwKSwKKyAgICBESUNPKDB4MTEzYmIyZTApLCBESUNPKDB4MjAxMGI2NDApLCBESUNPKDB4MjYxMGYzODApLCBESUNPKDB4MmE1Yzc3NDApLAorICAgIERJQ08oMHgyZjc3MDNjMCksIERJQ08oMHgzMzg4ZDA4MCksIERJQ08oMHgzY2VhYmU0MCksIERJQ08oMHg0MjQ2MmE4MCksCisgICAgRElDTygweDQ3ZmIwZTAwKSwgRElDTygweDRmN2FjNDgwKSwgRElDTygweDU3MDZmNTgwKSwgRElDTygweDVkOTJiODAwKSwKKyAgICBESUNPKDB4MDNhMTM0YTQpLCBESUNPKDB4MDU2MjM0NzApLCBESUNPKDB4MDkwYTBmZTApLCBESUNPKDB4MTJmN2QzZTApLAorICAgIERJQ08oMHgxZDYzZTQ0MCksIERJQ08oMHgyMGU2YWM4MCksIERJQ08oMHgyNDdkYThjMCksIERJQ08oMHgyN2Q5OTYwMCksCisgICAgRElDTygweDMxMmU5OWMwKSwgRElDTygweDM2OGZiMzgwKSwgRElDTygweDNiM2UzZWMwKSwgRElDTygweDQwZmVhZDgwKSwKKyAgICBESUNPKDB4NDg4OGZhMDApLCBESUNPKDB4NGZiZDU2MDApLCBESUNPKDB4NTc5NWE0ODApLCBESUNPKDB4NWQ5NzMwMDApLAorICAgIERJQ08oMHgwNTY5Nzk5MCksIERJQ08oMHgwNmYzMzgwMCksIERJQ08oMHgwYjI5ODI5MCksIERJQ08oMHgwZGU0N2E2MCksCisgICAgRElDTygweDEyZWY2MmEwKSwgRElDTygweDIxZTMwYTAwKSwgRElDTygweDI1ZjhmZjAwKSwgRElDTygweDJiMjI4N2MwKSwKKyAgICBESUNPKDB4MmYxMWZjMDApLCBESUNPKDB4MzMxMzgwMDApLCBESUNPKDB4MzdiNDlmODApLCBESUNPKDB4NDEzMjUxMDApLAorICAgIERJQ08oMHg0YWI2MjgwMCksIERJQ08oMHg1MDFlYWU4MCksIERJQ08oMHg1NjIyODc4MCksIERJQ08oMHg1YzVkODMwMCksCisgICAgRElDTygweDA2MzgzMGQ4KSwgRElDTygweDA4YTc2YTMwKSwgRElDTygweDBkMzc2ODkwKSwgRElDTygweDExN2QzYTAwKSwKKyAgICBESUNPKDB4MTQ3NmU1YzApLCBESUNPKDB4MWUyMTU3MjApLCBESUNPKDB4MjRiY2Q2ODApLCBESUNPKDB4Mjk2NzRhYzApLAorICAgIERJQ08oMHgyZmFhYjM0MCksIERJQ08oMHgzMzg0M2EwMCksIERJQ08oMHgzODIyZTkwMCksIERJQ08oMHgzZDMwYjZjMCksCisgICAgRElDTygweDQ5Y2Q1NDgwKSwgRElDTygweDUzMTg3ZDAwKSwgRElDTygweDU5MWZlMTAwKSwgRElDTygweDVkYjMwZjgwKSwKKyAgICBESUNPKDB4MDVjZGMzNzgpLCBESUNPKDB4MDc1YzUwYzgpLCBESUNPKDB4MGUwMWY4MzApLCBESUNPKDB4MTJiNzA0ODApLAorICAgIERJQ08oMHgxNWUzMzNlMCksIERJQ08oMHgxOTJjOWY0MCksIERJQ08oMHgxZDJkNmI4MCksIERJQ08oMHgyYzA5Y2E0MCksCisgICAgRElDTygweDJlZWE1Y2MwKSwgRElDTygweDMyYzg5MzgwKSwgRElDTygweDM3NmE1YjQwKSwgRElDTygweDQyYTQyNjAwKSwKKyAgICBESUNPKDB4NGM2OTU5MDApLCBESUNPKDB4NTI2OWUzODApLCBESUNPKDB4NTg2ZDZjODApLCBESUNPKDB4NWNlYmRiODApLAorICAgIERJQ08oMHgwNTJiYmI4MCksIERJQ08oMHgwNzAyZTI2OCksIERJQ08oMHgwY2ExOTZkMCksIERJQ08oMHgwZjQ4Y2VmMCksCisgICAgRElDTygweDE5ZDI4YjYwKSwgRElDTygweDFlYzQ0YTQwKSwgRElDTygweDI0ZDQwZjAwKSwgRElDTygweDI5ZTFlYWMwKSwKKyAgICBESUNPKDB4MmNhZmFhODApLCBESUNPKDB4MzAxYmQ0YzApLCBESUNPKDB4MzU3ZWMyMDApLCBESUNPKDB4NDIyNTQ0ODApLAorICAgIERJQ08oMHg0YmUzMjAwMCksIERJQ08oMHg0ZjdhNGEwMCksIERJQ08oMHg1NDQ3ZmMwMCksIERJQ08oMHg1Y2NhNmEwMCksCisgICAgRElDTygweDA1MGZkZDE4KSwgRElDTygweDA2Yzc3ZTEwKSwgRElDTygweDEwNTYxMTQwKSwgRElDTygweDE1NjRjMzQwKSwKKyAgICBESUNPKDB4MTg2N2FiZTApLCBESUNPKDB4MWYwMGZiYTApLCBESUNPKDB4MjJjMDYyNDApLCBESUNPKDB4MmFlZDc2ODApLAorICAgIERJQ08oMHgyZWNjMjRjMCksIERJQ08oMHgzMmFiYjMwMCksIERJQ08oMHgzNmI0MjM0MCksIERJQ08oMHgzZWQ4ZjQ4MCksCisgICAgRElDTygweDRiYmRmZTgwKSwgRElDTygweDUxNmJmODAwKSwgRElDTygweDU4Njg4YjAwKSwgRElDTygweDVkZDQ0OTgwKSwKKyAgICBESUNPKDB4MDU4YWExMzApLCBESUNPKDB4MDdkNjliYTgpLCBESUNPKDB4MGQ1MjFmNDApLCBESUNPKDB4MGZmMzdiYTApLAorICAgIERJQ08oMHgxODEyNWVjMCksIERJQ08oMHgxZjNhNDUyMCksIERJQ08oMHgyMzM0OTg0MCksIERJQ08oMHgyYzc1OTU4MCksCisgICAgRElDTygweDJmYzIxYzAwKSwgRElDTygweDMzYTQyZmMwKSwgRElDTygweDNkYzkyOTAwKSwgRElDTygweDQ3YmVmZDAwKSwKKyAgICBESUNPKDB4NGNjZDI0ODApLCBESUNPKDB4NTE5N2EyMDApLCBESUNPKDB4NTZhMmVhMDApLCBESUNPKDB4NWJkZmE5MDApLAorICAgIERJQ08oMHgwNWFjODY0MCksIERJQ08oMHgwNzZhZWM4OCksIERJQ08oMHgwZTJlMzIzMCksIERJQ08oMHgxMTRiNmY0MCksCisgICAgRElDTygweDE1NWQxMGEwKSwgRElDTygweDE5YmFjNjAwKSwgRElDTygweDFmYmQ3NWMwKSwgRElDTygweDI0NTljMGMwKSwKKyAgICBESUNPKDB4MjgyMjliODApLCBESUNPKDB4MmY1ODZmYzApLCBESUNPKDB4M2QwNjk3YzApLCBESUNPKDB4NDJhN2E1MDApLAorICAgIERJQ08oMHg0OWIwYmI4MCksIERJQ08oMHg0ZTY0MmU4MCksIERJQ08oMHg1NTc3NDI4MCksIERJQ08oMHg1ZDFhNzkwMCksCisgICAgRElDTygweDA1ZWZiNDcwKSwgRElDTygweDA4MzFjOGEwKSwgRElDTygweDBkMzVlY2UwKSwgRElDTygweDEzZWRjNDAwKSwKKyAgICBESUNPKDB4MTZjOGZlYzApLCBESUNPKDB4MWJiMjU4NjApLCBESUNPKDB4MjA0ZjMxNDApLCBESUNPKDB4Mjc3YjhhNDApLAorICAgIERJQ08oMHgyZmU5YTAwMCksIERJQ08oMHgzM2FmN2M0MCksIERJQ08oMHgzYjdkMjkwMCksIERJQ08oMHg0MTljOWE4MCksCisgICAgRElDTygweDQ1OTFkYzgwKSwgRElDTygweDRiZGFmZDAwKSwgRElDTygweDU1NjM4ODgwKSwgRElDTygweDVjZWYyMzAwKSwKKyAgICBESUNPKDB4MDVjZjQ5ODgpLCBESUNPKDB4MDc4ZmE4YzApLCBESUNPKDB4MGMyOTE5NTApLCBESUNPKDB4MTJlMDUzMjApLAorICAgIERJQ08oMHgxNTU5OTdlMCksIERJQ08oMHgxOTVkZjU0MCksIERJQ08oMHgxYzFiODJjMCksIERJQ08oMHgyMmMyOTQwMCksCisgICAgRElDTygweDMwN2VkZWMwKSwgRElDTygweDM0ZTgyOWMwKSwgRElDTygweDNiMWI1MDQwKSwgRElDTygweDQzNGRlNDAwKSwKKyAgICBESUNPKDB4NDk2Yjk5MDApLCBESUNPKDB4NGZmODgwODApLCBESUNPKDB4NTYwNGM0ODApLCBESUNPKDB4NWM4NGIwODApLAorICAgIERJQ08oMHgwMzY3OWZhNCksIERJQ08oMHgwNTBkNGEyMCksIERJQ08oMHgwOWZlZWMxMCksIERJQ08oMHgxMDBhMjFlMCksCisgICAgRElDTygweDE0ODNiMjYwKSwgRElDTygweDFkNzZjNzgwKSwgRElDTygweDI0ZTc1YzgwKSwgRElDTygweDJiZDYyODgwKSwKKyAgICBESUNPKDB4MzIzNTBhNDApLCBESUNPKDB4MzhiZTAxYzApLCBESUNPKDB4M2YwNWEyODApLCBESUNPKDB4NDUyOTVlODApLAorICAgIERJQ08oMHg0YjU1NDgwMCksIERJQ08oMHg1MTYxODg4MCksIERJQ08oMHg1NzVhMTUwMCksIERJQ08oMHg1ZDEwOWQ4MCksCisgICAgRElDTygweDAzNGZmZDA4KSwgRElDTygweDA0ZGNjZWE4KSwgRElDTygweDA3ZTI4OWI4KSwgRElDTygweDBkNjk1MGQwKSwKKyAgICBESUNPKDB4MTg5YWNlYzApLCBESUNPKDB4MWUzYmYyNDApLCBESUNPKDB4MjUzNWFhNDApLCBESUNPKDB4MmI4OGQxNDApLAorICAgIERJQ08oMHgzMjliYmIwMCksIERJQ08oMHgzODZjMzUwMCksIERJQ08oMHgzZTk1MDgwMCksIERJQ08oMHg0NGM0M2YwMCksCisgICAgRElDTygweDRiMDg5NzgwKSwgRElDTygweDUxMjIzMjgwKSwgRElDTygweDU3NGM5NzgwKSwgRElDTygweDVkMzY2NDAwKSwKKyAgICBESUNPKDB4MDM2ZDhkYjgpLCBESUNPKDB4MDRmZDg4YjgpLCBESUNPKDB4MDk3MDBhNzApLCBESUNPKDB4MTE2YjczYzApLAorICAgIERJQ08oMHgxNzI1OGM0MCksIERJQ08oMHgxZmQwMzAwMCksIERJQ08oMHgyM2ZkZjQwMCksIERJQ08oMHgyOGUwOGRjMCksCisgICAgRElDTygweDMyZDY4OGMwKSwgRElDTygweDM3OTIwYjAwKSwgRElDTygweDNkYWFhMDgwKSwgRElDTygweDQ2YTE2YzAwKSwKKyAgICBESUNPKDB4NGY4YzMxMDApLCBESUNPKDB4NTRhMTM3MDApLCBESUNPKDB4NTlkMjRiODApLCBESUNPKDB4NWNlYTRkODApLAorICAgIERJQ08oMHgwNTc5N2M4OCksIERJQ08oMHgwODBkYzhmMCksIERJQ08oMHgwYmQyMTUyMCksIERJQ08oMHgxMDk1YjU0MCksCisgICAgRElDTygweDEzOGZkNDAwKSwgRElDTygweDFhZWQxOWMwKSwgRElDTygweDI5ZmVhZDAwKSwgRElDTygweDJmNzBjZWMwKSwKKyAgICBESUNPKDB4MzMyN2RmMDApLCBESUNPKDB4M2E4MTJkMDApLCBESUNPKDB4NDAwYTgzODApLCBESUNPKDB4NDQ5ZGFhMDApLAorICAgIERJQ08oMHg0Y2Q2YjYwMCksIERJQ08oMHg1MWYxMjQwMCksIERJQ08oMHg1NmJkZmQ4MCksIERJQ08oMHg1YmUwYTEwMCksCisgICAgRElDTygweDA0ZGU2ZDc4KSwgRElDTygweDA3MmFlZDQwKSwgRElDTygweDBjNmZjNDYwKSwgRElDTygweDBmMjYwMjIwKSwKKyAgICBESUNPKDB4MTc5ZDAwYzApLCBESUNPKDB4MWU4MjQ0ZTApLCBESUNPKDB4MjM4NjcyNDApLCBESUNPKDB4MmJhZjc2ODApLAorICAgIERJQ08oMHgyZmE2ZDI0MCksIERJQ08oMHgzN2U4M2Q0MCksIERJQ08oMHgzZDFjYmZjMCksIERJQ08oMHg0MzlkMGEwMCksCisgICAgRElDTygweDQ5ZmQzZTAwKSwgRElDTygweDUwMDk1ZTgwKSwgRElDTygweDU1OWYyMDgwKSwgRElDTygweDViODg5YTAwKSwKKyAgICBESUNPKDB4MDQyZjVjMTApLCBESUNPKDB4MDYxYWIzZTgpLCBESUNPKDB4MGRkOGYxNjApLCBESUNPKDB4MTI2ZTBiNDApLAorICAgIERJQ08oMHgxNmVhOTA0MCksIERJQ08oMHgyMGEzMTcwMCksIERJQ08oMHgyNDYwODE0MCksIERJQ08oMHgyZWM2NTA4MCksCisgICAgRElDTygweDMzNGUxYTQwKSwgRElDTygweDM4MjUyMTAwKSwgRElDTygweDNmZmYwOTAwKSwgRElDTygweDQ2NTE5YTgwKSwKKyAgICBESUNPKDB4NGM1ZTBkODApLCBESUNPKDB4NTE4YzU4MDApLCBESUNPKDB4NTZjNWIwODApLCBESUNPKDB4NWM2ZWJiODApLAorICAgIERJQ08oMHgwNDVjZTIzMCksIERJQ08oMHgwNjc1NDdiMCksIERJQ08oMHgwYTIxYzY3MCksIERJQ08oMHgxNDA4YjgyMCksCisgICAgRElDTygweDFjMDUwNWMwKSwgRElDTygweDFlODA2YzgwKSwgRElDTygweDI2ZDNjNjQwKSwgRElDTygweDJjYTU3M2MwKSwKKyAgICBESUNPKDB4MzAxNGQ4ODApLCBESUNPKDB4Mzc3MTA4YzApLCBESUNPKDB4M2YzNWNmODApLCBESUNPKDB4NDM1NjYxMDApLAorICAgIERJQ08oMHg0YTYxMjkwMCksIERJQ08oMHg1MTYwYzc4MCksIERJQ08oMHg1N2QzZTMwMCksIERJQ08oMHg1ZDQxNGI4MCksCisgICAgRElDTygweDA0YzhlZGE4KSwgRElDTygweDA2YTMyMzIwKSwgRElDTygweDA5YWIyNTkwKSwgRElDTygweDE0MjMwNzYwKSwKKyAgICBESUNPKDB4MjBmYjIzYzApLCBESUNPKDB4MjRhYTI4ODApLCBESUNPKDB4Mjg1YTI1ODApLCBESUNPKDB4MmM0NjRhYzApLAorICAgIERJQ08oMHgzMDA5ODI4MCksIERJQ08oMHgzNjIzMjc4MCksIERJQ08oMHgzZTQyOGQ0MCksIERJQ08oMHg0Mjk4MjI4MCksCisgICAgRElDTygweDQ3ZTYwZDgwKSwgRElDTygweDRlMWVjYzAwKSwgRElDTygweDU1ZWI5MjAwKSwgRElDTygweDVjODFlZDAwKSwKKyAgICBESUNPKDB4MDQwZDBiOTApLCBESUNPKDB4MDU4NmM1YzApLCBESUNPKDB4MGJlYTIxOTApLCBESUNPKDB4MWRjOGRkNjApLAorICAgIERJQ08oMHgyMGEwN2M0MCksIERJQ08oMHgyNDM3ZTU4MCksIERJQ08oMHgyN2NhNWZjMCksIERJQ08oMHgyZDAxNzk4MCksCisgICAgRElDTygweDM0MTAwMDQwKSwgRElDTygweDM4ZDNhZmMwKSwgRElDTygweDNkYTliNzAwKSwgRElDTygweDQyMDgyNDgwKSwKKyAgICBESUNPKDB4NDY1ODZmMDApLCBESUNPKDB4NGUzYzNkODApLCBESUNPKDB4NTVlMWVlMDApLCBESUNPKDB4NWM5MzhkMDApLAorICAgIERJQ08oMHgwM2QxOGM2NCksIERJQ08oMHgwNTk0MWQ2MCksIERJQ08oMHgxMTZiMjU2MCksIERJQ08oMHgxOWNjODgyMCksCisgICAgRElDTygweDFjZTkzMGMwKSwgRElDTygweDIyNjI2MDgwKSwgRElDTygweDI2ZDJjZjgwKSwgRElDTygweDJjZTJjOTgwKSwKKyAgICBESUNPKDB4MzA1MzYxYzApLCBESUNPKDB4MzRiNjU5MDApLCBESUNPKDB4MzllZTViNDApLCBESUNPKDB4NDE1MDg0MDApLAorICAgIERJQ08oMHg0N2VlMWU4MCksIERJQ08oMHg1MDMxMTE4MCksIERJQ08oMHg1NmNiMGMwMCksIERJQ08oMHg1ZDU2MTY4MCksCisgICAgRElDTygweDBhZjIyY2YwKSwgRElDTygweDE1NGUxYzYwKSwgRElDTygweDFiNDRmZjYwKSwgRElDTygweDIwODdkMGMwKSwKKyAgICBESUNPKDB4MjUyZjczODApLCBESUNPKDB4MjhmZTY2YzApLCBESUNPKDB4MmQwZTk4MDApLCBESUNPKDB4MzBmN2VlMDApLAorICAgIERJQ08oMHgzNjA2ZDY0MCksIERJQ08oMHgzYmFjMGE0MCksIERJQ08oMHg0MTdjMzcwMCksIERJQ08oMHg0NzBjMjkwMCksCisgICAgRElDTygweDRjYzIwZDAwKSwgRElDTygweDUxZTU1ZTgwKSwgRElDTygweDU3NmJjMjAwKSwgRElDTygweDVjYWE3MDgwKSwKKyAgICBESUNPKDB4MDQzMzE0ZTApLCBESUNPKDB4MDVjYjQ3YjApLCBESUNPKDB4MDk4NWRmMjApLCBESUNPKDB4MTg1YTIyYzApLAorICAgIERJQ08oMHgxZWE2ODMwMCksIERJQ08oMHgyMWFmOTEwMCksIERJQ08oMHgyNWNkY2I0MCksIERJQ08oMHgyOTdlMGE4MCksCisgICAgRElDTygweDMxNDJhYzgwKSwgRElDTygweDM1OGJiMDQwKSwgRElDTygweDNhMTM0NWMwKSwgRElDTygweDQwMmNhNTgwKSwKKyAgICBESUNPKDB4NGQ5NjQ3ODApLCBESUNPKDB4NTQyMGNmODApLCBESUNPKDB4NTkyYWRmODApLCBESUNPKDB4NWRmZTdhODApLAorICAgIERJQ08oMHgwNGM3MGUyMCksIERJQ08oMHgwNjJmZDZmMCksIERJQ08oMHgxMTNjNjBhMCksIERJQ08oMHgxNTllOTkwMCksCisgICAgRElDTygweDE5MzNlNWEwKSwgRElDTygweDFkZWNmZmEwKSwgRElDTygweDIyMzczNDAwKSwgRElDTygweDI3ZWQ3MTgwKSwKKyAgICBESUNPKDB4MmE4MzQ5YzApLCBESUNPKDB4MmY3OGY5NDApLCBESUNPKDB4M2Q1Yzg1NDApLCBESUNPKDB4NDI5YzM1MDApLAorICAgIERJQ08oMHg0OTM2ZTMwMCksIERJQ08oMHg0ZGUwOGQwMCksIERJQ08oMHg1MjYyNzcwMCksIERJQ08oMHg1ZDgyMjY4MCksCisgICAgRElDTygweDA0OTgyNzcwKSwgRElDTygweDA2YWIxYWQ4KSwgRElDTygweDBjYmExMDkwKSwgRElDTygweDEwODM5ZDYwKSwKKyAgICBESUNPKDB4MWFjZDZhNjApLCBESUNPKDB4MWY1NTQ1NjApLCBESUNPKDB4MjQzMWMxYzApLCBESUNPKDB4Mjk1ZGI4MDApLAorICAgIERJQ08oMHgyZDM3NGMwMCksIERJQ08oMHgzMWYyZmQ4MCksIERJQ08oMHgzYTIwMDQ4MCksIERJQ08oMHg0MTZiZWE4MCksCisgICAgRElDTygweDRiYTFjZTAwKSwgRElDTygweDUyYTg4MDAwKSwgRElDTygweDU4ZDBkYjAwKSwgRElDTygweDVkM2U1ODAwKSwKKyAgICBESUNPKDB4MDU5ZTBlNzApLCBESUNPKDB4MDgxNjZiYTApLCBESUNPKDB4MGM5ZGY1OTApLCBESUNPKDB4MTFkZTVmNDApLAorICAgIERJQ08oMHgxNGMwOGVhMCksIERJQ08oMHgxYzVhZDZlMCksIERJQ08oMHgyNDE3OGVjMCksIERJQ08oMHgyOGViNzY0MCksCisgICAgRElDTygweDMxNjI2MjgwKSwgRElDTygweDM1ZDQzMTAwKSwgRElDTygweDNjYWQxMGMwKSwgRElDTygweDQyMmUxNDgwKSwKKyAgICBESUNPKDB4NDliYWVlMDApLCBESUNPKDB4NTNkZDcxODApLCBESUNPKDB4NWExN2JiODApLCBESUNPKDB4NWU0YmIxODApLAorICAgIERJQ08oMHgwM2M2NGQwMCksIERJQ08oMHgwNWRlMGIyOCksIERJQ08oMHgwY2NiODJiMCksIERJQ08oMHgxNDRiMWMwMCksCisgICAgRElDTygweDE5ZTM5ZWMwKSwgRElDTygweDIxZTc5NWMwKSwgRElDTygweDI4MTQ5MzgwKSwgRElDTygweDJmMWZmN2MwKSwKKyAgICBESUNPKDB4MzViN2M5MDApLCBESUNPKDB4M2M1ZjQ4MDApLCBESUNPKDB4NDI3OTljMDApLCBESUNPKDB4NDg3NDYxODApLAorICAgIERJQ08oMHg0ZThmNGQwMCksIERJQ08oMHg1M2I5ODM4MCksIERJQ08oMHg1OGQ2MDAwMCksIERJQ08oMHg1ZDcxYTAwMCksCisgICAgRElDTygweDA1MGEyOTkwKSwgRElDTygweDA3MWJkYjg4KSwgRElDTygweDBmMGQ3NmIwKSwgRElDTygweDE3YTc4ZGUwKSwKKyAgICBESUNPKDB4MWFhMjA3MjApLCBESUNPKDB4MjJlZWEzYzApLCBESUNPKDB4Mjc2ZTk2NDApLCBESUNPKDB4MmVjYzRkODApLAorICAgIERJQ08oMHgzMzVmNzkwMCksIERJQ08oMHgzNzgzODY0MCksIERJQ08oMHgzYzgxYmU4MCksIERJQ08oMHg0MWE0ZTQwMCksCisgICAgRElDTygweDQ3NmZhMjgwKSwgRElDTygweDRmMmFiNzgwKSwgRElDTygweDU2ZTg3YjgwKSwgRElDTygweDVjYmYyOTAwKSwKKyAgICBESUNPKDB4MDY3MjRjOTgpLCBESUNPKDB4MDk5ZjVlMjApLCBESUNPKDB4MTE5YmNlYzApLCBESUNPKDB4MTZiZTExYTApLAorICAgIERJQ08oMHgxOWQ1M2IwMCksIERJQ08oMHgxZWI1MTM2MCksIERJQ08oMHgyMzAyYzMwMCksIERJQ08oMHgyOWMyMGQ0MCksCisgICAgRElDTygweDMwZGQ1MjAwKSwgRElDTygweDM2NTc2YTgwKSwgRElDTygweDNlM2U3NTQwKSwgRElDTygweDQ1YWE5ZjgwKSwKKyAgICBESUNPKDB4NGM4MzMzMDApLCBESUNPKDB4NTFkN2VkMDApLCBESUNPKDB4NTdhNGEzODApLCBESUNPKDB4NWNjZTkxMDApLAorICAgIERJQ08oMHgwNTU4OGI2MCksIERJQ08oMHgwNzVhNzBhMCksIERJQ08oMHgwZWY5NmUzMCksIERJQ08oMHgxMmFjMTEwMCksCisgICAgRElDTygweDE2NDlkZGUwKSwgRElDTygweDFhNTBjZGMwKSwgRElDTygweDIyNDg2MTQwKSwgRElDTygweDI3YzdjODAwKSwKKyAgICBESUNPKDB4MmUwOGJkODApLCBESUNPKDB4MzU1ZDIwYzApLCBESUNPKDB4MzkyNWE5YzApLCBESUNPKDB4NDRlMmI0ODApLAorICAgIERJQ08oMHg0ZmE0ZTY4MCksIERJQ08oMHg1NDcwZTE4MCksIERJQ08oMHg1OTVmZWU4MCksIERJQ08oMHg1ZDY3MmYwMCksCisgICAgRElDTygweDA0YTc4MWMwKSwgRElDTygweDA2MGE4OWYwKSwgRElDTygweDExMWY1NmEwKSwgRElDTygweDE2YjkzYmUwKSwKKyAgICBESUNPKDB4MTljZTkxMjApLCBESUNPKDB4MWUxZmRhNjApLCBESUNPKDB4MjI1OWY4ODApLCBESUNPKDB4Mjg1Y2FkODApLAorICAgIERJQ08oMHgyYjE0MGVjMCksIERJQ08oMHgyZjA2OTk0MCksIERJQ08oMHgzM2JiY2U0MCksIERJQ08oMHgzZGQzZTZjMCksCisgICAgRElDTygweDQ5MTU0ODgwKSwgRElDTygweDUwMDhlMzgwKSwgRElDTygweDU2OGM0NjgwKSwgRElDTygweDVkYTQzNzgwKSwKKyAgICBESUNPKDB4MDUzYWRlMzgpLCBESUNPKDB4MDcwOGEyMDApLCBESUNPKDB4MGJhZDQzZDApLCBESUNPKDB4MTg2MGNmNDApLAorICAgIERJQ08oMHgxYzQwZGJlMCksIERJQ08oMHgxZjVhMDEyMCksIERJQ08oMHgyNWJjZjdjMCksIERJQ08oMHgyOWUwYzg0MCksCisgICAgRElDTygweDJmMjIzODQwKSwgRElDTygweDM5MGM4OTQwKSwgRElDTygweDNlMWQ3MzQwKSwgRElDTygweDQxYzZhMDAwKSwKKyAgICBESUNPKDB4NDZjYzI4ODApLCBESUNPKDB4NTAwNmUyODApLCBESUNPKDB4NTc0NGUxODApLCBESUNPKDB4NWQyOTc3ODApLAorICAgIERJQ08oMHgwNDAxYTNmMCksIERJQ08oMHgwN2JlNGEwOCksIERJQ08oMHgxNGY1ZjFhMCksIERJQ08oMHgxYzM0ODA4MCksCisgICAgRElDTygweDIyNjc1M2MwKSwgRElDTygweDI3NGIxYjgwKSwgRElDTygweDJjMTFhMzAwKSwgRElDTygweDMwNzk4YzAwKSwKKyAgICBESUNPKDB4MzU1OThjODApLCBESUNPKDB4M2FhYjE4YzApLCBESUNPKDB4NDAzMGYzODApLCBESUNPKDB4NDVjN2I0MDApLAorICAgIERJQ08oMHg0YmU1YmUwMCksIERJQ08oMHg1MTgwZGI4MCksIERJQ08oMHg1NzYxM2IwMCksIERJQ08oMHg1Y2ZmZmY4MCksCisgICAgRElDTygweDA4NGIzMDkwKSwgRElDTygweDBmZTViM2IwKSwgRElDTygweDE2ZGZkNDgwKSwgRElDTygweDFkMGFhNzAwKSwKKyAgICBESUNPKDB4MjRlMDgxODApLCBESUNPKDB4MmI0OTg2NDApLCBESUNPKDB4MzA4ODViODApLCBESUNPKDB4MzRjY2M0ODApLAorICAgIERJQ08oMHgzOGZlZGVjMCksIERJQ08oMHgzY2RmOWM0MCksIERJQ08oMHg0MTczNzYwMCksIERJQ08oMHg0NmFiOTgwMCksCisgICAgRElDTygweDRjNzcyZTgwKSwgRElDTygweDUxZTViOTgwKSwgRElDTygweDU3ZGY5OTAwKSwgRElDTygweDVkNWQ3MTgwKSwKKyAgICBESUNPKDB4MDk1NDlmMDApLCBESUNPKDB4MTJiODRkYTApLCBESUNPKDB4MWFlYWYxYzApLCBESUNPKDB4MjE0MmE5YzApLAorICAgIERJQ08oMHgyNzVjOWEwMCksIERJQ08oMHgyYzI2MGM4MCksIERJQ08oMHgzMDM4YzcwMCksIERJQ08oMHgzNDA4MWQwMCksCisgICAgRElDTygweDM4NjEyZjQwKSwgRElDTygweDNkMGJmOGMwKSwgRElDTygweDQyNDczZTAwKSwgRElDTygweDQ3ZWNhZDgwKSwKKyAgICBESUNPKDB4NGRiMzQzODApLCBESUNPKDB4NTJmMGFiMDApLCBESUNPKDB4NTg0Y2M5ODApLCBESUNPKDB4NWQ2MmFlODApLAorICAgIERJQ08oMHgwYWVjYTFlMCksIERJQ08oMHgxNDM1NDcwMCksIERJQ08oMHgxOTk1NWJhMCksIERJQ08oMHgxZGUzMzFlMCksCisgICAgRElDTygweDIxY2Q2MGMwKSwgRElDTygweDI1ZTcyZDgwKSwgRElDTygweDJhNDAyODgwKSwgRElDTygweDJlZmE2NGMwKSwKKyAgICBESUNPKDB4MzQ3OGQ5YzApLCBESUNPKDB4M2E4ODllODApLCBESUNPKDB4NDA3NDRlMDApLCBESUNPKDB4NDYyNmZlODApLAorICAgIERJQ08oMHg0YmQ4MDkwMCksIERJQ08oMHg1MTEyMGYwMCksIERJQ08oMHg1NmQ4ZDI4MCksIERJQ08oMHg1YzY1NDQwMCksCisgICAgRElDTygweDA3YTQwYWY4KSwgRElDTygweDBlNjVlYzIwKSwgRElDTygweDE0Yzc2NzgwKSwgRElDTygweDE5YjM1YTYwKSwKKyAgICBESUNPKDB4MWY3NmI3YzApLCBESUNPKDB4MjRmNTEyYzApLCBESUNPKDB4MmFlODlmMDApLCBESUNPKDB4MzAzNmMzYzApLAorICAgIERJQ08oMHgzNjA0MTgwMCksIERJQ08oMHgzYmM0ZGY4MCksIERJQ08oMHg0MWFkYjA4MCksIERJQ08oMHg0NzdmYmI4MCksCisgICAgRElDTygweDRkNWFhNDgwKSwgRElDTygweDUyY2IwNjAwKSwgRElDTygweDU4NmY3MjgwKSwgRElDTygweDVkYjQwMTgwKSwKKyAgICBESUNPKDB4MDM5OTc2MTApLCBESUNPKDB4MDYxNzVkYjApLCBESUNPKDB4MGVhOGM5YzApLCBESUNPKDB4MTQzOTcwMDApLAorICAgIERJQ08oMHgxYmEzNGY2MCksIERJQ08oMHgyMjM0NjY4MCksIERJQ08oMHgyODk1ODA4MCksIERJQ08oMHgyZWE3Njg0MCksCisgICAgRElDTygweDMzZWU2OGMwKSwgRElDTygweDM5ZTc2OWMwKSwgRElDTygweDNmODYyNTAwKSwgRElDTygweDQ1NzliMDgwKSwKKyAgICBESUNPKDB4NGI0OWNkMDApLCBESUNPKDB4NTEwN2RhODApLCBESUNPKDB4NTczY2RlMDApLCBESUNPKDB4NWQwOTA3ODApLAorICAgIERJQ08oMHgwNDZmYzJmOCksIERJQ08oMHgwNjQwZGJjMCksIERJQ08oMHgwOWRhN2FiMCksIERJQ08oMHgxNzRlNDIyMCksCisgICAgRElDTygweDIzZGM4Y2MwKSwgRElDTygweDI3MDE2MjAwKSwgRElDTygweDJhOWE1MjQwKSwgRElDTygweDJlNmNjN2MwKSwKKyAgICBESUNPKDB4MzIxY2VkNDApLCBESUNPKDB4MzhjYTJkMDApLCBESUNPKDB4NDE0ODI2ODApLCBESUNPKDB4NDUxZTM3MDApLAorICAgIERJQ08oMHg0YjkwZDgwMCksIERJQ08oMHg1MGQwYmE4MCksIERJQ08oMHg1NTYwMmU4MCksIERJQ08oMHg1YTQ2NTIwMCksCisgICAgRElDTygweDAzY2E3ZTI4KSwgRElDTygweDA1N2M5ZGQwKSwgRElDTygweDBjOWZmMGUwKSwgRElDTygweDE5NTdmYWUwKSwKKyAgICBESUNPKDB4MWZlZjc4NjApLCBESUNPKDB4Mjc5MjBjODApLCBESUNPKDB4MmNiMjMzYzApLCBESUNPKDB4MzIwMTVjODApLAorICAgIERJQ08oMHgzNmFmNGY0MCksIERJQ08oMHgzYWMxODI0MCksIERJQ08oMHgzZjkzZDhjMCksIERJQ08oMHg0NGVhZWY4MCksCisgICAgRElDTygweDRhYWI1ZDgwKSwgRElDTygweDUwODQwZTgwKSwgRElDTygweDU2YzRjYzgwKSwgRElDTygweDVjYjI2NjAwKSwKKyAgICBESUNPKDB4MDM4ZDUzZjgpLCBESUNPKDB4MDUwZDExMTgpLCBESUNPKDB4MGJjMTQ2OTApLCBESUNPKDB4MTg5MTgwMDApLAorICAgIERJQ08oMHgxZTJhNmVlMCksIERJQ08oMHgyNGNjMGMwMCksIERJQ08oMHgyYTc2N2Q0MCksIERJQ08oMHgyZTYxNDk0MCksCisgICAgRElDTygweDMyODU5YzQwKSwgRElDTygweDM3N2ZkOTQwKSwgRElDTygweDNkM2EzZTQwKSwgRElDTygweDQzZTgxMzgwKSwKKyAgICBESUNPKDB4NGFhYWMwODApLCBESUNPKDB4NTA5ZTc4MDApLCBESUNPKDB4NTcwMjNhMDApLCBESUNPKDB4NWQ3MzNjMDApLAorICAgIERJQ08oMHgwNGNmYTVlMCksIERJQ08oMHgwNmRlZWIzOCksIERJQ08oMHgwYTUwMWM0MCksIERJQ08oMHgxMzZkOGFhMCksCisgICAgRElDTygweDE3ZjE2ZTQwKSwgRElDTygweDFjMTE5MzAwKSwgRElDTygweDI2MTU0YjAwKSwgRElDTygweDJhMGRhMTAwKSwKKyAgICBESUNPKDB4MmY1OTM1YzApLCBESUNPKDB4MzcxMDhkNDApLCBESUNPKDB4M2FlZjA3YzApLCBESUNPKDB4M2ZjY2YzNDApLAorICAgIERJQ08oMHg0N2U0YTA4MCksIERJQ08oMHg0ZDhkZTEwMCksIERJQ08oMHg1NGViNjk4MCksIERJQ08oMHg1Y2RiNTM4MCl9OworCisvKiBBQ0VMUDogdGFibGUgZm9yIGRlY29kaW5nCisgICBhZGFwdGl2ZSBjb2RlYm9vayBnYWluIGdfcCAobGVmdCBjb2x1bW4pLiBTY2FsZWQgYnkgMi4wZi4KKyAgIGlubm92YXRpdmUgY29kZWJvb2sgZ2FpbiBnX2MgKHJpZ2h0IGNvbHVtbikuIFNjYWxlZCBieSAxNi4wZi4KKyovCitjb25zdCBGSVhQX1NHTCB0X3F1YV9nYWluN2JbMTI4ICogMl0gPSB7CisgICAgMjA0LCAgIDQ0MSwgICA0NjQsICAgMTk3NywgIDg2OSwgICAxMDc3LCAgMTA3MiwgIDMwNjIsICAxMjgxLCAgNDc1OSwgIDE2NDcsCisgICAgMTUzOSwgIDE4NDUsICA3MDIwLCAgMTg1MywgIDYzNCwgICAxOTk1LCAgMjMzNiwgIDIzNTEsICAxNTQwMCwgMjY2MSwgIDExNjUsCisgICAgMjcwMiwgIDM5MDAsICAyNzEwLCAgMTAxMzMsIDMxOTUsICAxNzUyLCAgMzQ5OCwgIDI2MjQsICAzNjYzLCAgODQ5LCAgIDM5ODQsCisgICAgNTY5NywgIDQyMTQsICAzMzk5LCAgNDQxNSwgIDEzMDQsICA0Njk1LCAgMjA1NiwgIDUzNzYsICA0NTU4LCAgNTM4NiwgIDY3NiwKKyAgICA1NTE4LCAgMjM1NTQsIDU1NjcsICA3Nzk0LCAgNTY0NCwgIDMwNjEsICA1NjcyLCAgMTUxMywgIDU5NTcsICAyMzM4LCAgNjUzMywKKyAgICAxMDYwLCAgNjgwNCwgIDU5OTgsICA2ODIwLCAgMTc2NywgIDY5MzcsICAzODM3LCAgNzI3NywgIDQxNCwgICA3MzA1LCAgMjY2NSwKKyAgICA3NDY2LCAgMTEzMDQsIDc5NDIsICA3OTQsICAgODAwNywgIDE5ODIsICA4MDA3LCAgMTM2NiwgIDgzMjYsICAzMTA1LCAgODMzNiwKKyAgICA0ODEwLCAgODcwOCwgIDc5NTQsICA4OTg5LCAgMjI3OSwgIDkwMzEsICAxMDU1LCAgOTI0NywgIDM1NjgsICA5MjgzLCAgMTYzMSwKKyAgICA5NjU0LCAgNjMxMSwgIDk4MTEsICAyNjA1LCAgMTAxMjAsIDY4MywgICAxMDE0MywgNDE3OSwgIDEwMjQ1LCAxOTQ2LCAgMTAzMzUsCisgICAgMTIxOCwgIDEwNDY4LCA5OTYwLCAgMTA2NTEsIDMwMDAsICAxMDk1MSwgMTUzMCwgIDEwOTY5LCA1MjkwLCAgMTEyMDMsIDIzMDUsCisgICAgMTEzMjUsIDM1NjIsICAxMTc3MSwgNjc1NCwgIDExODM5LCAxODQ5LCAgMTE5NDEsIDQ0OTUsICAxMTk1NCwgMTI5OCwgIDExOTc1LAorICAgIDE1MjIzLCAxMTk3NywgODgzLCAgIDExOTg2LCAyODQyLCAgMTI0MzgsIDIxNDEsICAxMjU5MywgMzY2NSwgIDEyNjM2LCA4MzY3LAorICAgIDEyNjU4LCAxNTk0LCAgMTI4ODYsIDI2MjgsICAxMjk4NCwgNDk0MiwgIDEzMTQ2LCAxMTE1LCAgMTMyMjQsIDUyNCwgICAxMzM0MSwKKyAgICAzMTYzLCAgMTMzOTksIDE5MjMsICAxMzU0OSwgNTk2MSwgIDEzNjA2LCAxNDAxLCAgMTM2NTUsIDIzOTksICAxMzc4MiwgMzkwOSwKKyAgICAxMzg2OCwgMTA5MjMsIDE0MjI2LCAxNzIzLCAgMTQyMzIsIDI5MzksICAxNDI3OCwgNzUyOCwgIDE0NDM5LCA0NTk4LCAgMTQ0NTEsCisgICAgOTg0LCAgIDE0NDU4LCAyMjY1LCAgMTQ3OTIsIDE0MDMsICAxNDgxOCwgMzQ0NSwgIDE0ODk5LCA1NzA5LCAgMTUwMTcsIDE1MzYyLAorICAgIDE1MDQ4LCAxOTQ2LCAgMTUwNjksIDI2NTUsICAxNTQwNSwgOTU5MSwgIDE1NDA1LCA0MDc5LCAgMTU1NzAsIDcxODMsICAxNTY4NywKKyAgICAyMjg2LCAgMTU2OTEsIDE2MjQsICAxNTY5OSwgMzA2OCwgIDE1NzcyLCA1MTQ5LCAgMTU4NjgsIDEyMDUsICAxNTk3MCwgNjk2LAorICAgIDE2MjQ5LCAzNTg0LCAgMTYzMzgsIDE5MTcsICAxNjQyNCwgMjU2MCwgIDE2NDgzLCA0NDM4LCAgMTY1MjksIDY0MTAsICAxNjYyMCwKKyAgICAxMTk2NiwgMTY4MzksIDg3ODAsICAxNzAzMCwgMzA1MCwgIDE3MDMzLCAxODMyNSwgMTcwOTIsIDE1NjgsICAxNzEyMywgNTE5NywKKyAgICAxNzM1MSwgMjExMywgIDE3Mzc0LCA5ODAsICAgMTc1NjYsIDI2MjE0LCAxNzYwOSwgMzkxMiwgIDE3NjM5LCAzMjc2NywgMTgxNTEsCisgICAgNzg3MSwgIDE4MTk3LCAyNTE2LCAgMTgyMDIsIDU2NDksICAxODY3OSwgMzI4MywgIDE4OTMwLCAxMzcwLCAgMTkyNzEsIDEzNzU3LAorICAgIDE5MzE3LCA0MTIwLCAgMTk0NjAsIDE5NzMsICAxOTY1NCwgMTAwMTgsIDE5NzY0LCA2NzkyLCAgMTk5MTIsIDUxMzUsICAyMDA0MCwKKyAgICAyODQxLCAgMjEyMzQsIDE5ODMzfTsKKworLyogQUNFTFA6IGZhY3RvciB0YWJsZSBmb3IgaW50ZXJwb2xhdGlvbiBvZiBMUEMgY29lZmZzIGluIExTUCBkb21haW4gKi8KK2NvbnN0IEZJWFBfU0dMIGxzcF9pbnRlcnBvbF9mYWN0b3JbMl1bTkJfU1VCRlJdID0geworICAgIHtGTDJGWENPTlNUX1NHTCgwLjEyNWYpLCBGTDJGWENPTlNUX1NHTCgwLjM3NWYpLCBGTDJGWENPTlNUX1NHTCgwLjYyNWYpLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjg3NWYpfSwgLyogZm9yIGNvcmVDb2RlckZyYW1lTGVuZ3RoID0gMTAyNCAqLworICAgIHtGTDJGWENPTlNUX1NHTCgwLjE2NjY2N2YpLCBGTDJGWENPTlNUX1NHTCgwLjVmKSwgRkwyRlhDT05TVF9TR0woMC44MzMzMzNmKSwKKyAgICAgMHgwfSAvKiBmb3IgY29yZUNvZGVyRnJhbWVMZW5ndGggPSA3NjggICovCit9OworCisvKiBGb3IgYmFzcyBwb3N0IGZpbHRlciAqLworI2lmbmRlZiBUQUJMRV9maWx0X2xwCitjb25zdCBGSVhQX1NHTCBmZGtfZGVjX2ZpbHRfbHBbMSArIExfRklMVF0gPSB7CisgICAgRkwyRlhDT05TVF9TR0xfRklMVCgwLjA4ODI1MGYpLCBGTDJGWENPTlNUX1NHTF9GSUxUKDAuMDg2NDEwZiksCisgICAgRkwyRlhDT05TVF9TR0xfRklMVCgwLjA4MTA3NGYpLCBGTDJGWENPTlNUX1NHTF9GSUxUKDAuMDcyNzY4ZiksCisgICAgRkwyRlhDT05TVF9TR0xfRklMVCgwLjA2MjI5NGYpLCBGTDJGWENPTlNUX1NHTF9GSUxUKDAuMDUwNjIzZiksCisgICAgRkwyRlhDT05TVF9TR0xfRklMVCgwLjAzODc3NGYpLCBGTDJGWENPTlNUX1NHTF9GSUxUKDAuMDI3NjkyZiksCisgICAgRkwyRlhDT05TVF9TR0xfRklMVCgwLjAxODEzMGYpLCBGTDJGWENPTlNUX1NHTF9GSUxUKDAuMDEwNTc4ZiksCisgICAgRkwyRlhDT05TVF9TR0xfRklMVCgwLjAwNTIyMWYpLCBGTDJGWENPTlNUX1NHTF9GSUxUKDAuMDAxOTQ2ZiksCisgICAgRkwyRlhDT05TVF9TR0xfRklMVCgwLjAwMDM4NWYpfTsKKyNlbmRpZgorCisvKiBGQUMgd2luZG93IHRhYmxlcyBmb3IgY29yZUNvZGVyRnJhbWVMZW5ndGggPSAxMDI0ICovCitjb25zdCBGSVhQX1dUQiBGYWNXaW5kb3dTeW50aDEyOFtdID0geworICAgIFdUQygweDdmZmY2MjE2KSwgV1RDKDB4N2ZmYTcyZDEpLCBXVEMoMHg3ZmYwOTQ3OCksIFdUQygweDdmZTFjNzZiKSwKKyAgICBXVEMoMHg3ZmNlMGMzZSksIFdUQygweDdmYjU2M2IzKSwgV1RDKDB4N2Y5N2NlYmQpLCBXVEMoMHg3Zjc1NGU4MCksCisgICAgV1RDKDB4N2Y0ZGU0NTEpLCBXVEMoMHg3ZjIxOTFiNCksIFdUQygweDdlZjA1ODYwKSwgV1RDKDB4N2ViYTNhMzkpLAorICAgIFdUQygweDdlN2YzOTU3KSwgV1RDKDB4N2UzZjU3ZmYpLCBXVEMoMHg3ZGZhOThhOCksIFdUQygweDdkYjBmZGY4KSwKKyAgICBXVEMoMHg3ZDYyOGFjNiksIFdUQygweDdkMGY0MjE4KSwgV1RDKDB4N2NiNzI3MjQpLCBXVEMoMHg3YzVhM2Q1MCksCisgICAgV1RDKDB4N2JmODg4MzApLCBXVEMoMHg3YjkyMGI4OSksIFdUQygweDdiMjZjYjRmKSwgV1RDKDB4N2FiNmNiYTQpLAorICAgIFdUQygweDdhNDIxMGQ4KSwgV1RDKDB4NzljODlmNmUpLCBXVEMoMHg3OTRhN2MxMiksIFdUQygweDc4YzdhYmEyKSwKKyAgICBXVEMoMHg3ODQwMzMyOSksIFdUQygweDc3YjQxN2RmKSwgV1RDKDB4NzcyMzVmMmQpLCBXVEMoMHg3NjhlMGVhNiksCisgICAgV1RDKDB4NzVmNDJjMGIpLCBXVEMoMHg3NTU1YmQ0YyksIFdUQygweDc0YjJjODg0KSwgV1RDKDB4NzQwYjUzZmIpLAorICAgIFdUQygweDczNWY2NjI2KSwgV1RDKDB4NzJhZjA1YTcpLCBXVEMoMHg3MWZhMzk0OSksIFdUQygweDcxNDEwODA1KSwKKyAgICBXVEMoMHg3MDgzNzhmZiksIFdUQygweDZmYzE5Mzg1KSwgV1RDKDB4NmVmYjVmMTIpLCBXVEMoMHg2ZTMwZTM0YSksCisgICAgV1RDKDB4NmQ2MjI3ZmEpLCBXVEMoMHg2YzhmMzUxYyksIFdUQygweDZiYjgxMmQxKSwgV1RDKDB4NmFkY2M5NjQpLAorICAgIFdUQygweDY5ZmQ2MTRhKSwgV1RDKDB4NjkxOWUzMjApLCBXVEMoMHg2ODMyNTdhYiksIFdUQygweDY3NDZjN2Q4KSwKKyAgICBXVEMoMHg2NjU3M2NiYiksIFdUQygweDY1NjNiZjkyKSwgV1RDKDB4NjQ2YzU5YmYpLCBXVEMoMHg2MzcxMTRjYyksCisgICAgV1RDKDB4NjI3MWZhNjkpLCBXVEMoMHg2MTZmMTQ2YyksIFdUQygweDYwNjg2Y2NmKSwgV1RDKDB4NWY1ZTBkYjMpLAorICAgIFdUQygweDVlNTAwMTVkKSwgV1RDKDB4NWQzZTUyMzcpLCBXVEMoMHg1YzI5MGFjYyksIFdUQygweDViMTAzNWNmKSwKKyAgICBXVEMoMHg1OWYzZGUxMiksIFdUQygweDU4ZDQwZThjKSwgV1RDKDB4NTdiMGQyNTYpLCBXVEMoMHg1NjhhMzRhOSksCisgICAgV1RDKDB4NTU2MDQwZTIpLCBXVEMoMHg1NDMzMDI3ZCksIFdUQygweDUzMDI4NTE4KSwgV1RDKDB4NTFjZWQ0NmUpLAorICAgIFdUQygweDUwOTdmYzVlKSwgV1RDKDB4NGY1ZTA4ZTMpLCBXVEMoMHg0ZTIxMDYxNyksIFdUQygweDRjZTEwMDM0KSwKKyAgICBXVEMoMHg0YjllMDM5MCksIFdUQygweDRhNTgxYzllKSwgV1RDKDB4NDkwZjU3ZWUpLCBXVEMoMHg0N2MzYzIyZiksCisgICAgV1RDKDB4NDY3NTY4MjgpLCBXVEMoMHg0NTI0NTZiZCksIFdUQygweDQzZDA5YWVkKSwgV1RDKDB4NDI3YTQxZDApLAorICAgIFdUQygweDQxMjE1ODliKSwgV1RDKDB4M2ZjNWVjOTgpLCBXVEMoMHgzZTY4MGIyYyksIFdUQygweDNkMDdjMWQ2KSwKKyAgICBXVEMoMHgzYmE1MWUyOSksIFdUQygweDNhNDAyZGQyKSwgV1RDKDB4MzhkOGZlOTMpLCBXVEMoMHgzNzZmOWU0NiksCisgICAgV1RDKDB4MzYwNDFhZDkpLCBXVEMoMHgzNDk2ODI1MCksIFdUQygweDMzMjZlMmMzKSwgV1RDKDB4MzFiNTRhNWUpLAorICAgIFdUQygweDMwNDFjNzYxKSwgV1RDKDB4MmVjYzY4MWUpLCBXVEMoMHgyZDU1M2FmYyksIFdUQygweDJiZGM0ZTZmKSwKKyAgICBXVEMoMHgyYTYxYjEwMSksIFdUQygweDI4ZTU3MTRiKSwgV1RDKDB4Mjc2NzlkZjQpLCBXVEMoMHgyNWU4NDViNiksCisgICAgV1RDKDB4MjQ2Nzc3NTgpLCBXVEMoMHgyMmU1NDFhZiksIFdUQygweDIxNjFiM2EwKSwgV1RDKDB4MWZkY2RjMWIpLAorICAgIFdUQygweDFlNTZjYTFlKSwgV1RDKDB4MWNjZjhjYjMpLCBXVEMoMHgxYjQ3MzJlZiksIFdUQygweDE5YmRjYmYzKSwKKyAgICBXVEMoMHgxODMzNjZlOSksIFdUQygweDE2YTgxMzA1KSwgV1RDKDB4MTUxYmRmODYpLCBXVEMoMHgxMzhlZGJiMSksCisgICAgV1RDKDB4MTIwMTE2ZDUpLCBXVEMoMHgxMDcyYTA0OCksIFdUQygweDBlZTM4NzY2KSwgV1RDKDB4MGQ1M2RiOTIpLAorICAgIFdUQygweDBiYzNhYzM1KSwgV1RDKDB4MGEzMzA4YmQpLCBXVEMoMHgwOGEyMDA5YSksIFdUQygweDA3MTBhMzQ1KSwKKyAgICBXVEMoMHgwNTdmMDAzNSksIFdUQygweDAzZWQyNmU2KSwgV1RDKDB4MDI1YjI2ZDcpLCBXVEMoMHgwMGM5MGY4OCksCit9OworY29uc3QgRklYUF9XVEIgRmFjV2luZG93WmlyMTI4W10gPSB7CisgICAgV1RDKDB4N2YzNmYwNzgpLCBXVEMoMHg3ZGE0ZDkyOSksIFdUQygweDdjMTJkOTFhKSwgV1RDKDB4N2E4MGZmY2IpLAorICAgIFdUQygweDc4ZWY1Y2JiKSwgV1RDKDB4Nzc1ZGZmNjYpLCBXVEMoMHg3NWNjZjc0MyksIFdUQygweDc0M2M1M2NiKSwKKyAgICBXVEMoMHg3MmFjMjQ2ZSksIFdUQygweDcxMWM3ODlhKSwgV1RDKDB4NmY4ZDVmYjgpLCBXVEMoMHg2ZGZlZTkyYiksCisgICAgV1RDKDB4NmM3MTI0NGYpLCBXVEMoMHg2YWU0MjA3YSksIFdUQygweDY5NTdlY2ZiKSwgV1RDKDB4NjdjYzk5MTcpLAorICAgIFdUQygweDY2NDIzNDBkKSwgV1RDKDB4NjRiOGNkMTEpLCBXVEMoMHg2MzMwNzM0ZCksIFdUQygweDYxYTkzNWUyKSwKKyAgICBXVEMoMHg2MDIzMjNlNSksIFdUQygweDVlOWU0YzYwKSwgV1RDKDB4NWQxYWJlNTEpLCBXVEMoMHg1Yjk4ODhhOCksCisgICAgV1RDKDB4NWExN2JhNGEpLCBXVEMoMHg1ODk4NjIwYyksIFdUQygweDU3MWE4ZWI1KSwgV1RDKDB4NTU5ZTRlZmYpLAorICAgIFdUQygweDU0MjNiMTkxKSwgV1RDKDB4NTJhYWM1MDQpLCBXVEMoMHg1MTMzOTdlMiksIFdUQygweDRmYmUzODlmKSwKKyAgICBXVEMoMHg0ZTRhYjVhMiksIFdUQygweDRjZDkxZDNkKSwgV1RDKDB4NGI2OTdkYjApLCBXVEMoMHg0OWZiZTUyNyksCisgICAgV1RDKDB4NDg5MDYxYmEpLCBXVEMoMHg0NzI3MDE2ZCksIFdUQygweDQ1YmZkMjJlKSwgV1RDKDB4NDQ1YWUxZDcpLAorICAgIFdUQygweDQyZjgzZTJhKSwgV1RDKDB4NDE5N2Y0ZDQpLCBXVEMoMHg0MDNhMTM2OCksIFdUQygweDNlZGVhNzY1KSwKKyAgICBXVEMoMHgzZDg1YmUzMCksIFdUQygweDNjMmY2NTEzKSwgV1RDKDB4M2FkYmE5NDMpLCBXVEMoMHgzOThhOTdkOCksCisgICAgV1RDKDB4MzgzYzNkZDEpLCBXVEMoMHgzNmYwYTgxMiksIFdUQygweDM1YTdlMzYyKSwgV1RDKDB4MzQ2MWZjNzApLAorICAgIFdUQygweDMzMWVmZmNjKSwgV1RDKDB4MzFkZWY5ZTkpLCBXVEMoMHgzMGExZjcxZCksIFdUQygweDJmNjgwM2EyKSwKKyAgICBXVEMoMHgyZTMxMmI5MiksIFdUQygweDJjZmQ3YWU4KSwgV1RDKDB4MmJjY2ZkODMpLCBXVEMoMHgyYTlmYmYxZSksCisgICAgV1RDKDB4Mjk3NWNiNTcpLCBXVEMoMHgyODRmMmRhYSksIFdUQygweDI3MmJmMTc0KSwgV1RDKDB4MjYwYzIxZWUpLAorICAgIFdUQygweDI0ZWZjYTMxKSwgV1RDKDB4MjNkNmY1MzQpLCBXVEMoMHgyMmMxYWRjOSksIFdUQygweDIxYWZmZWEzKSwKKyAgICBXVEMoMHgyMGExZjI0ZCksIFdUQygweDFmOTc5MzMxKSwgV1RDKDB4MWU5MGViOTQpLCBXVEMoMHgxZDhlMDU5NyksCisgICAgV1RDKDB4MWM4ZWViMzQpLCBXVEMoMHgxYjkzYTY0MSksIFdUQygweDFhOWM0MDZlKSwgV1RDKDB4MTlhOGMzNDUpLAorICAgIFdUQygweDE4YjkzODI4KSwgV1RDKDB4MTdjZGE4NTUpLCBXVEMoMHgxNmU2MWNlMCksIFdUQygweDE2MDI5ZWI2KSwKKyAgICBXVEMoMHgxNTIzMzY5YyksIFdUQygweDE0NDdlZDJmKSwgV1RDKDB4MTM3MGNhZTQpLCBXVEMoMHgxMjlkZDgwNiksCisgICAgV1RDKDB4MTFjZjFjYjYpLCBXVEMoMHgxMTA0YTBlZSksIFdUQygweDEwM2U2YzdiKSwgV1RDKDB4MGY3Yzg3MDEpLAorICAgIFdUQygweDBlYmVmN2ZiKSwgV1RDKDB4MGUwNWM2YjcpLCBXVEMoMHgwZDUwZmE1OSksIFdUQygweDBjYTA5OWRhKSwKKyAgICBXVEMoMHgwYmY0YWMwNSksIFdUQygweDBiNGQzNzdjKSwgV1RDKDB4MGFhYTQyYjQpLCBXVEMoMHgwYTBiZDNmNSksCisgICAgV1RDKDB4MDk3MWYxNWEpLCBXVEMoMHgwOGRjYTBkMyksIFdUQygweDA4NGJlODIxKSwgV1RDKDB4MDdiZmNjZDcpLAorICAgIFdUQygweDA3Mzg1NDVlKSwgV1RDKDB4MDZiNTgzZWUpLCBXVEMoMHgwNjM3NjA5MiksIFdUQygweDA1YmRlZjI4KSwKKyAgICBXVEMoMHgwNTQ5MzQ1YyksIFdUQygweDA0ZDkzNGIxKSwgV1RDKDB4MDQ2ZGY0NzcpLCBXVEMoMHgwNDA3NzdkMCksCisgICAgV1RDKDB4MDNhNWMyYjApLCBXVEMoMHgwMzQ4ZDhkYyksIFdUQygweDAyZjBiZGU4KSwgV1RDKDB4MDI5ZDc1M2EpLAorICAgIFdUQygweDAyNGYwMjA4KSwgV1RDKDB4MDIwNTY3NTgpLCBXVEMoMHgwMWMwYTgwMSksIFdUQygweDAxODBjNmE5KSwKKyAgICBXVEMoMHgwMTQ1YzVjNyksIFdUQygweDAxMGZhN2EwKSwgV1RDKDB4MDBkZTZlNGMpLCBXVEMoMHgwMGIyMWJhZiksCisgICAgV1RDKDB4MDA4YWIxODApLCBXVEMoMHgwMDY4MzE0MyksIFdUQygweDAwNGE5YzRkKSwgV1RDKDB4MDAzMWYzYzIpLAorICAgIFdUQygweDAwMWUzODk1KSwgV1RDKDB4MDAwZjZiODgpLCBXVEMoMHgwMDA1OGQyZiksIFdUQygweDAwMDA5ZGVhKSwKK307Citjb25zdCBGSVhQX1dUQiBGYWNXaW5kb3dTeW50aDY0W10gPSB7CisgICAgV1RDKDB4N2ZmZDg4NWEpLCBXVEMoMHg3ZmU5Y2JjMCksIFdUQygweDdmYzI1NTk2KSwgV1RDKDB4N2Y4NzJiZjMpLAorICAgIFdUQygweDdmMzg1N2Y2KSwgV1RDKDB4N2VkNWU1YzYpLCBXVEMoMHg3ZTVmZTQ5MyksIFdUQygweDdkZDY2NjhmKSwKKyAgICBXVEMoMHg3ZDM5ODBlYyksIFdUQygweDdjODk0YmRlKSwgV1RDKDB4N2JjNWUyOTApLCBXVEMoMHg3YWVmNjMyMyksCisgICAgV1RDKDB4N2EwNWVlYWQpLCBXVEMoMHg3OTA5YTkyZCksIFdUQygweDc3ZmFiOTg5KSwgV1RDKDB4NzZkOTQ5ODkpLAorICAgIFdUQygweDc1YTU4NWNmKSwgV1RDKDB4NzQ1ZjlkZDEpLCBXVEMoMHg3MzA3YzNkMCksIFdUQygweDcxOWUyY2QyKSwKKyAgICBXVEMoMHg3MDIzMTA5YSksIFdUQygweDZlOTZhOTlkKSwgV1RDKDB4NmNmOTM0ZmMpLCBXVEMoMHg2YjRhZjI3OSksCisgICAgV1RDKDB4Njk4YzI0NmMpLCBXVEMoMHg2N2JkMGZiZCksIFdUQygweDY1ZGRmYmQzKSwgV1RDKDB4NjNlZjMyOTApLAorICAgIFdUQygweDYxZjEwMDNmKSwgV1RDKDB4NWZlM2IzOGQpLCBXVEMoMHg1ZGM3OWQ3YyksIFdUQygweDViOWQxMTU0KSwKKyAgICBXVEMoMHg1OTY0NjQ5OCksIFdUQygweDU3MWRlZWZhKSwgV1RDKDB4NTRjYTBhNGIpLCBXVEMoMHg1MjY5MTI2ZSksCisgICAgV1RDKDB4NGZmYjY1NGQpLCBXVEMoMHg0ZDgxNjJjNCksIFdUQygweDRhZmI2Yzk4KSwgV1RDKDB4NDg2OWU2NjUpLAorICAgIFdUQygweDQ1Y2QzNThmKSwgV1RDKDB4NDMyNWMxMzUpLCBXVEMoMHg0MDczZjIxZCksIFdUQygweDNkYjgzMmE2KSwKKyAgICBXVEMoMHgzYWYyZWViNyksIFdUQygweDM4MjQ5M2IwKSwgV1RDKDB4MzU0ZDkwNTcpLCBXVEMoMHgzMjZlNTRjNyksCisgICAgV1RDKDB4MmY4NzUyNjIpLCBXVEMoMHgyYzk4ZmJiYSksIFdUQygweDI5YTNjNDg1KSwgV1RDKDB4MjZhODIxODYpLAorICAgIFdUQygweDIzYTY4ODdmKSwgV1RDKDB4MjA5ZjcwMWMpLCBXVEMoMHgxZDkzNGZlNSksIFdUQygweDFhODJhMDI2KSwKKyAgICBXVEMoMHgxNzZkZDlkZSksIFdUQygweDE0NTU3NmIxKSwgV1RDKDB4MTEzOWYwY2YpLCBXVEMoMHgwZTFiYzJlNCksCisgICAgV1RDKDB4MGFmYjY4MDUpLCBXVEMoMHgwN2Q5NWI5ZSksIFdUQygweDA0YjYxOTVkKSwgV1RDKDB4MDE5MjFkMjApLAorfTsKK2NvbnN0IEZJWFBfV1RCIEZhY1dpbmRvd1ppcjY0W10gPSB7CisgICAgV1RDKDB4N2U2ZGUyZTApLCBXVEMoMHg3YjQ5ZTZhMyksIFdUQygweDc4MjZhNDYyKSwgV1RDKDB4NzUwNDk3ZmIpLAorICAgIFdUQygweDcxZTQzZDFjKSwgV1RDKDB4NmVjNjBmMzEpLCBXVEMoMHg2YmFhODk0ZiksIFdUQygweDY4OTIyNjIyKSwKKyAgICBXVEMoMHg2NTdkNWZkYSksIFdUQygweDYyNmNiMDFiKSwgV1RDKDB4NWY2MDhmZTQpLCBXVEMoMHg1YzU5Nzc4MSksCisgICAgV1RDKDB4NTk1N2RlN2EpLCBXVEMoMHg1NjVjM2I3YiksIFdUQygweDUzNjcwNDQ2KSwgV1RDKDB4NTA3OGFkOWUpLAorICAgIFdUQygweDRkOTFhYjM5KSwgV1RDKDB4NGFiMjZmYTkpLCBXVEMoMHg0N2RiNmM1MCksIFdUQygweDQ1MGQxMTQ5KSwKKyAgICBXVEMoMHg0MjQ3Y2Q1YSksIFdUQygweDNmOGMwZGUzKSwgV1RDKDB4M2NkYTNlY2IpLCBXVEMoMHgzYTMyY2E3MSksCisgICAgV1RDKDB4Mzc5NjE5OWIpLCBXVEMoMHgzNTA0OTM2OCksIFdUQygweDMyN2U5ZDNjKSwgV1RDKDB4MzAwNDlhYjMpLAorICAgIFdUQygweDJkOTZlZDkyKSwgV1RDKDB4MmIzNWY1YjUpLCBXVEMoMHgyOGUyMTEwNiksIFdUQygweDI2OWI5YjY4KSwKKyAgICBXVEMoMHgyNDYyZWVhYyksIFdUQygweDIyMzg2Mjg0KSwgV1RDKDB4MjAxYzRjNzMpLCBXVEMoMHgxZTBlZmZjMSksCisgICAgV1RDKDB4MWMxMGNkNzApLCBXVEMoMHgxYTIyMDQyZCksIFdUQygweDE4NDJmMDQzKSwgV1RDKDB4MTY3M2RiOTQpLAorICAgIFdUQygweDE0YjUwZDg3KSwgV1RDKDB4MTMwNmNiMDQpLCBXVEMoMHgxMTY5NTY2MyksIFdUQygweDBmZGNlZjY2KSwKKyAgICBXVEMoMHgwZTYxZDMyZSksIFdUQygweDBjZjgzYzMwKSwgV1RDKDB4MGJhMDYyMmYpLCBXVEMoMHgwYTVhN2EzMSksCisgICAgV1RDKDB4MDkyNmI2NzcpLCBXVEMoMHgwODA1NDY3NyksIFdUQygweDA2ZjY1NmQzKSwgV1RDKDB4MDVmYTExNTMpLAorICAgIFdUQygweDA1MTA5Y2RkKSwgV1RDKDB4MDQzYTFkNzApLCBXVEMoMHgwMzc2YjQyMiksIFdUQygweDAyYzY3ZjE0KSwKKyAgICBXVEMoMHgwMjI5OTk3MSksIFdUQygweDAxYTAxYjZkKSwgV1RDKDB4MDEyYTFhM2EpLCBXVEMoMHgwMGM3YTgwYSksCisgICAgV1RDKDB4MDA3OGQ0MGQpLCBXVEMoMHgwMDNkYWE2YSksIFdUQygweDAwMTYzNDQwKSwgV1RDKDB4MDAwMjc3YTYpLAorfTsKK2NvbnN0IEZJWFBfV1RCIEZhY1dpbmRvd1N5bnRoMzJbXSA9IHsKKyAgICBXVEMoMHg3ZmY2MjE4MiksIFdUQygweDdmYTczNmI0KSwgV1RDKDB4N2YwOTkxYzQpLCBXVEMoMHg3ZTFkOTNlYSksCisgICAgV1RDKDB4N2NlM2NlYjIpLCBXVEMoMHg3YjVkMDM5ZSksIFdUQygweDc5OGEyM2IxKSwgV1RDKDB4Nzc2YzRlZGIpLAorICAgIFdUQygweDc1MDRkMzQ1KSwgV1RDKDB4NzI1NTJjODUpLCBXVEMoMHg2ZjVmMDJiMiksIFdUQygweDZjMjQyOTYwKSwKKyAgICBXVEMoMHg2OGE2OWU4MSksIFdUQygweDY0ZTg4OTI2KSwgV1RDKDB4NjBlYzM4MzApLCBXVEMoMHg1Y2I0MjBlMCksCisgICAgV1RDKDB4NTg0MmRkNTQpLCBXVEMoMHg1MzliMmFmMCksIFdUQygweDRlYmZlOGE1KSwgV1RDKDB4NDliNDE1MzMpLAorICAgIFdUQygweDQ0N2FjZDUwKSwgV1RDKDB4M2YxNzQ5YjgpLCBXVEMoMHgzOThjZGQzMiksIFdUQygweDMzZGVmMjg3KSwKKyAgICBXVEMoMHgyZTExMGE2MiksIFdUQygweDI4MjZiOTI4KSwgV1RDKDB4MjIyM2E0YzUpLCBXVEMoMHgxYzBiODI2YSksCisgICAgV1RDKDB4MTVlMjE0NDUpLCBXVEMoMHgwZmFiMjcyYiksIFdUQygweDA5NmE5MDQ5KSwgV1RDKDB4MDMyNDJhYmYpLAorfTsKK2NvbnN0IEZJWFBfV1RCIEZhY1dpbmRvd1ppcjMyW10gPSB7CisgICAgV1RDKDB4N2NkYmQ1NDEpLCBXVEMoMHg3Njk1NmZiNyksIFdUQygweDcwNTRkOGQ1KSwgV1RDKDB4NmExZGViYmIpLAorICAgIFdUQygweDYzZjQ3ZDk2KSwgV1RDKDB4NWRkYzViM2IpLCBXVEMoMHg1N2Q5NDZkOCksIFdUQygweDUxZWVmNTllKSwKKyAgICBXVEMoMHg0YzIxMGQ3OSksIFdUQygweDQ2NzMyMmNlKSwgV1RDKDB4NDBlOGI2NDgpLCBXVEMoMHgzYjg1MzJiMCksCisgICAgV1RDKDB4MzY0YmVhY2QpLCBXVEMoMHgzMTQwMTc1YiksIFdUQygweDJjNjRkNTEwKSwgV1RDKDB4MjdiZDIyYWMpLAorICAgIFdUQygweDIzNGJkZjIwKSwgV1RDKDB4MWYxM2M3ZDApLCBXVEMoMHgxYjE3NzZkYSksIFdUQygweDE3NTk2MTdmKSwKKyAgICBXVEMoMHgxM2RiZDZhMCksIFdUQygweDEwYTBmZDRlKSwgV1RDKDB4MGRhYWQzN2IpLCBXVEMoMHgwYWZiMmNiYiksCisgICAgV1RDKDB4MDg5M2IxMjUpLCBXVEMoMHgwNjc1ZGM0ZiksIFdUQygweDA0YTJmYzYyKSwgV1RDKDB4MDMxYzMxNGUpLAorICAgIFdUQygweDAxZTI2YzE2KSwgV1RDKDB4MDBmNjZlM2MpLCBXVEMoMHgwMDU4Yzk0YyksIFdUQygweDAwMDlkZTdlKSwKK307CisKKy8qIEZBQyB3aW5kb3cgdGFibGVzIGZvciBjb3JlQ29kZXJGcmFtZUxlbmd0aCA9IDc2OCAqLworY29uc3QgRklYUF9XVEIgRmFjV2luZG93U3ludGg5NltdID0geworICAgIFdUQygweDdmZmVlNzQ0KSwgV1RDKDB4N2ZmNjIxODIpLCBXVEMoMHg3ZmU0OTY5OCksIFdUQygweDdmY2E0N2I5KSwKKyAgICBXVEMoMHg3ZmE3MzZiNCksIFdUQygweDdmN2I2NWVmKSwgV1RDKDB4N2Y0NmQ4NmMpLCBXVEMoMHg3ZjA5OTFjNCksCisgICAgV1RDKDB4N2VjMzk2MmEpLCBXVEMoMHg3ZTc0ZWE2YSksIFdUQygweDdlMWQ5M2VhKSwgV1RDKDB4N2RiZDk4YTQpLAorICAgIFdUQygweDdkNTRmZjJlKSwgV1RDKDB4N2NlM2NlYjIpLCBXVEMoMHg3YzZhMGVmMiksIFdUQygweDdiZTdjODQ3KSwKKyAgICBXVEMoMHg3YjVkMDM5ZSksIFdUQygweDdhYzljYTdhKSwgV1RDKDB4N2EyZTI2ZjIpLCBXVEMoMHg3OThhMjNiMSksCisgICAgV1RDKDB4NzhkZGNiZjUpLCBXVEMoMHg3ODI5MmI4ZCksIFdUQygweDc3NmM0ZWRiKSwgV1RDKDB4NzZhNzQyZDEpLAorICAgIFdUQygweDc1ZGExNGVmKSwgV1RDKDB4NzUwNGQzNDUpLCBXVEMoMHg3NDI3OGM3MiksIFdUQygweDczNDI0ZmEwKSwKKyAgICBXVEMoMHg3MjU1MmM4NSksIFdUQygweDcxNjAzMzYxKSwgV1RDKDB4NzA2Mzc0ZmYpLCBXVEMoMHg2ZjVmMDJiMiksCisgICAgV1RDKDB4NmU1MmVlNTIpLCBXVEMoMHg2ZDNmNGE0MCksIFdUQygweDZjMjQyOTYwKSwgV1RDKDB4NmIwMTlmMWEpLAorICAgIFdUQygweDY5ZDdiZjU3KSwgV1RDKDB4NjhhNjllODEpLCBXVEMoMHg2NzZlNTE4MyksIFdUQygweDY2MmVlZGMzKSwKKyAgICBXVEMoMHg2NGU4ODkyNiksIFdUQygweDYzOWIzYTBiKSwgV1RDKDB4NjI0NzE3NDkpLCBXVEMoMHg2MGVjMzgzMCksCisgICAgV1RDKDB4NWY4YWI0ODcpLCBXVEMoMHg1ZTIyYTQ4NyksIFdUQygweDVjYjQyMGUwKSwgV1RDKDB4NWIzZjQyYWUpLAorICAgIFdUQygweDU5YzQyMzgxKSwgV1RDKDB4NTg0MmRkNTQpLCBXVEMoMHg1NmJiOGE5MCksIFdUQygweDU1MmU0NjA1KSwKKyAgICBXVEMoMHg1MzliMmFmMCksIFdUQygweDUyMDI1NGVmKSwgV1RDKDB4NTA2M2UwMDgpLCBXVEMoMHg0ZWJmZThhNSksCisgICAgV1RDKDB4NGQxNjhiOGIpLCBXVEMoMHg0YjY3ZTVlNCksIFdUQygweDQ5YjQxNTMzKSwgV1RDKDB4NDdmYjM3NTcpLAorICAgIFdUQygweDQ2M2Q2YTg3KSwgV1RDKDB4NDQ3YWNkNTApLCBXVEMoMHg0MmIzN2U5NiksIFdUQygweDQwZTc5ZDhjKSwKKyAgICBXVEMoMHgzZjE3NDliOCksIFdUQygweDNkNDJhMmVjKSwgV1RDKDB4M2I2OWM5NDcpLCBXVEMoMHgzOThjZGQzMiksCisgICAgV1RDKDB4MzdhYmZmNWQpLCBXVEMoMHgzNWM3NTBiYyksIFdUQygweDMzZGVmMjg3KSwgV1RDKDB4MzFmMzA2MzgpLAorICAgIFdUQygweDMwMDNhZDg1KSwgV1RDKDB4MmUxMTBhNjIpLCBXVEMoMHgyYzFiM2VmYiksIFdUQygweDJhMjI2ZGI1KSwKKyAgICBXVEMoMHgyODI2YjkyOCksIFdUQygweDI2Mjg0NDIyKSwgV1RDKDB4MjQyNzMxOWQpLCBXVEMoMHgyMjIzYTRjNSksCisgICAgV1RDKDB4MjAxZGMwZWYpLCBXVEMoMHgxZTE1YTk5YSksIFdUQygweDFjMGI4MjZhKSwgV1RDKDB4MTlmZjZmMmEpLAorICAgIFdUQygweDE3ZjE5M2M1KSwgV1RDKDB4MTVlMjE0NDUpLCBXVEMoMHgxM2QxMTRkMCksIFdUQygweDExYmViOWFhKSwKKyAgICBXVEMoMHgwZmFiMjcyYiksIFdUQygweDBkOTY4MWMyKSwgV1RDKDB4MGI4MGVkZjEpLCBXVEMoMHgwOTZhOTA0OSksCisgICAgV1RDKDB4MDc1MzhkNmIpLCBXVEMoMHgwNTNjMGEwMSksIFdUQygweDAzMjQyYWJmKSwgV1RDKDB4MDEwYzE0NjApLAorfTsKK2NvbnN0IEZJWFBfV1RCIEZhY1dpbmRvd1ppcjk2W10gPSB7CisgICAgV1RDKDB4N2VmM2ViYTApLCBXVEMoMHg3Y2RiZDU0MSksIFdUQygweDdhYzNmNWZmKSwgV1RDKDB4NzhhYzcyOTUpLAorICAgIFdUQygweDc2OTU2ZmI3KSwgV1RDKDB4NzQ3ZjEyMGYpLCBXVEMoMHg3MjY5N2UzZSksIFdUQygweDcwNTRkOGQ1KSwKKyAgICBXVEMoMHg2ZTQxNDY1NiksIFdUQygweDZjMmVlYjMwKSwgV1RDKDB4NmExZGViYmIpLCBXVEMoMHg2ODBlNmMzYiksCisgICAgV1RDKDB4NjYwMDkwZDYpLCBXVEMoMHg2M2Y0N2Q5NiksIFdUQygweDYxZWE1NjY2KSwgV1RDKDB4NWZlMjNmMTEpLAorICAgIFdUQygweDVkZGM1YjNiKSwgV1RDKDB4NWJkOGNlNjMpLCBXVEMoMHg1OWQ3YmJkZSksIFdUQygweDU3ZDk0NmQ4KSwKKyAgICBXVEMoMHg1NWRkOTI0YiksIFdUQygweDUzZTRjMTA1KSwgV1RDKDB4NTFlZWY1OWUpLCBXVEMoMHg0ZmZjNTI3YiksCisgICAgV1RDKDB4NGUwY2Y5YzgpLCBXVEMoMHg0YzIxMGQ3OSksIFdUQygweDRhMzhhZjQ0KSwgV1RDKDB4NDg1NDAwYTMpLAorICAgIFdUQygweDQ2NzMyMmNlKSwgV1RDKDB4NDQ5NjM2YjkpLCBXVEMoMHg0MmJkNWQxNCksIFdUQygweDQwZThiNjQ4KSwKKyAgICBXVEMoMHgzZjE4NjI3NCksIFdUQygweDNkNGM4MTZhKSwgV1RDKDB4M2I4NTMyYjApLCBXVEMoMHgzOWMyOTU3OSksCisgICAgV1RDKDB4MzgwNGM4YTkpLCBXVEMoMHgzNjRiZWFjZCksIFdUQygweDM0OTgxYTFjKSwgV1RDKDB4MzJlOTc0NzUpLAorICAgIFdUQygweDMxNDAxNzViKSwgV1RDKDB4MmY5YzFmZjgpLCBXVEMoMHgyZGZkYWIxMSksIFdUQygweDJjNjRkNTEwKSwKKyAgICBXVEMoMHgyYWQxYjlmYiksIFdUQygweDI5NDQ3NTcwKSwgV1RDKDB4MjdiZDIyYWMpLCBXVEMoMHgyNjNiZGM3ZiksCisgICAgV1RDKDB4MjRjMGJkNTIpLCBXVEMoMHgyMzRiZGYyMCksIFdUQygweDIxZGQ1Yjc5KSwgV1RDKDB4MjA3NTRiNzkpLAorICAgIFdUQygweDFmMTNjN2QwKSwgV1RDKDB4MWRiOGU4YjcpLCBXVEMoMHgxYzY0YzVmNSksIFdUQygweDFiMTc3NmRhKSwKKyAgICBXVEMoMHgxOWQxMTIzZCksIFdUQygweDE4OTFhZTdkKSwgV1RDKDB4MTc1OTYxN2YpLCBXVEMoMHgxNjI4NDBhOSksCisgICAgV1RDKDB4MTRmZTYwZTYpLCBXVEMoMHgxM2RiZDZhMCksIFdUQygweDEyYzBiNWMwKSwgV1RDKDB4MTFhZDExYWUpLAorICAgIFdUQygweDEwYTBmZDRlKSwgV1RDKDB4MGY5YzhiMDEpLCBXVEMoMHgwZTlmY2M5ZiksIFdUQygweDBkYWFkMzdiKSwKKyAgICBXVEMoMHgwY2JkYjA2MCksIFdUQygweDBiZDg3MzhlKSwgV1RDKDB4MGFmYjJjYmIpLCBXVEMoMHgwYTI1ZWIxMSksCisgICAgV1RDKDB4MDk1OGJkMmYpLCBXVEMoMHgwODkzYjEyNSksIFdUQygweDA3ZDZkNDczKSwgV1RDKDB4MDcyMjM0MGIpLAorICAgIFdUQygweDA2NzVkYzRmKSwgV1RDKDB4MDVkMWQ5MGUpLCBXVEMoMHgwNTM2MzU4NiksIFdUQygweDA0YTJmYzYyKSwKKyAgICBXVEMoMHgwNDE4MzdiOSksIFdUQygweDAzOTVmMTBlKSwgV1RDKDB4MDMxYzMxNGUpLCBXVEMoMHgwMmFiMDBkMiksCisgICAgV1RDKDB4MDI0MjY3NWMpLCBXVEMoMHgwMWUyNmMxNiksIFdUQygweDAxOGIxNTk2KSwgV1RDKDB4MDEzYzY5ZDYpLAorICAgIFdUQygweDAwZjY2ZTNjKSwgV1RDKDB4MDBiOTI3OTQpLCBXVEMoMHgwMDg0OWExMSksIFdUQygweDAwNThjOTRjKSwKKyAgICBXVEMoMHgwMDM1Yjg0NyksIFdUQygweDAwMWI2OTY4KSwgV1RDKDB4MDAwOWRlN2UpLCBXVEMoMHgwMDAxMThiYyksCit9OworY29uc3QgRklYUF9XVEIgRmFjV2luZG93U3ludGg0OFtdID0geworICAgIFdUQygweDdmZmI5ZDE1KSwgV1RDKDB4N2ZkODg3OGUpLCBXVEMoMHg3ZjkyNjYxZCksIFdUQygweDdmMjk0YmZkKSwKKyAgICBXVEMoMHg3ZTlkNTVmYyksIFdUQygweDdkZWVhYTdhKSwgV1RDKDB4N2QxZDc5NTgpLCBXVEMoMHg3YzI5ZmJlZSksCisgICAgV1RDKDB4N2IxNDc0ZmQpLCBXVEMoMHg3OWRkMzA5OCksIFdUQygweDc4ODQ4NDE0KSwgV1RDKDB4NzcwYWNkZWMpLAorICAgIFdUQygweDc1NzA3NWFjKSwgV1RDKDB4NzNiNWViZDEpLCBXVEMoMHg3MWRiYTlhYiksIFdUQygweDZmZTIzMTNjKSwKKyAgICBXVEMoMHg2ZGNhMGQxNCksIFdUQygweDZiOTNkMDJlKSwgV1RDKDB4Njk0MDE1YzMpLCBXVEMoMHg2NmNmODEyMCksCisgICAgV1RDKDB4NjQ0MmJkN2UpLCBXVEMoMHg2MTlhN2RjZSksIFdUQygweDVlZDc3YzhhKSwgV1RDKDB4NWJmYTdiODIpLAorICAgIFdUQygweDU5MDQ0M2E3KSwgV1RDKDB4NTVmNWE0ZDIpLCBXVEMoMHg1MmNmNzU4ZiksIFdUQygweDRmOTI5MmRjKSwKKyAgICBXVEMoMHg0YzNmZGZmNCksIFdUQygweDQ4ZDg0NjA5KSwgV1RDKDB4NDU1Y2I0MGMpLCBXVEMoMHg0MWNlMWU2NSksCisgICAgV1RDKDB4M2UyZDdlYjEpLCBXVEMoMHgzYTdiZDM4MiksIFdUQygweDM2YmEyMDE0KSwgV1RDKDB4MzJlOTZjMDkpLAorICAgIFdUQygweDJmMGFjMzIwKSwgV1RDKDB4MmIxZjM0ZWIpLCBXVEMoMHgyNzI3ZDQ4NiksIFdUQygweDIzMjViODQ3KSwKKyAgICBXVEMoMHgxZjE5Zjk3YiksIFdUQygweDFiMDViNDBmKSwgV1RDKDB4MTZlYTA2NDYpLCBXVEMoMHgxMmM4MTA2ZiksCisgICAgV1RDKDB4MGVhMGY0OGMpLCBXVEMoMHgwYTc1ZDYwZSksIFdUQygweDA2NDdkOTdjKSwgV1RDKDB4MDIxODI0MjcpLAorfTsKK2NvbnN0IEZJWFBfV1RCIEZhY1dpbmRvd1ppcjQ4W10gPSB7CisgICAgV1RDKDB4N2RlN2RiZDkpLCBXVEMoMHg3OWI4MjY4NCksIFdUQygweDc1OGEyOWYyKSwgV1RDKDB4NzE1ZjBiNzQpLAorICAgIFdUQygweDZkMzdlZjkxKSwgV1RDKDB4NjkxNWY5YmEpLCBXVEMoMHg2NGZhNGJmMSksIFdUQygweDYwZTYwNjg1KSwKKyAgICBXVEMoMHg1Y2RhNDdiOSksIFdUQygweDU4ZDgyYjdhKSwgV1RDKDB4NTRlMGNiMTUpLCBXVEMoMHg1MGY1M2NlMCksCisgICAgV1RDKDB4NGQxNjkzZjcpLCBXVEMoMHg0OTQ1ZGZlYyksIFdUQygweDQ1ODQyYzdlKSwgV1RDKDB4NDFkMjgxNGYpLAorICAgIFdUQygweDNlMzFlMTliKSwgV1RDKDB4M2FhMzRiZjQpLCBXVEMoMHgzNzI3YjlmNyksIFdUQygweDMzYzAyMDBjKSwKKyAgICBXVEMoMHgzMDZkNmQyNCksIFdUQygweDJkMzA4YTcxKSwgV1RDKDB4MmEwYTViMmUpLCBXVEMoMHgyNmZiYmM1OSksCisgICAgV1RDKDB4MjQwNTg0N2UpLCBXVEMoMHgyMTI4ODM3NiksIFdUQygweDFlNjU4MjMyKSwgV1RDKDB4MWJiZDQyODIpLAorICAgIFdUQygweDE5MzA3ZWUwKSwgV1RDKDB4MTZiZmVhM2QpLCBXVEMoMHgxNDZjMmZkMiksIFdUQygweDEyMzVmMmVjKSwKKyAgICBXVEMoMHgxMDFkY2VjNCksIFdUQygweDBlMjQ1NjU1KSwgV1RDKDB4MGM0YTE0MmYpLCBXVEMoMHgwYThmOGE1NCksCisgICAgV1RDKDB4MDhmNTMyMTQpLCBXVEMoMHgwNzdiN2JlYyksIFdUQygweDA2MjJjZjY4KSwgV1RDKDB4MDRlYjhiMDMpLAorICAgIFdUQygweDAzZDYwNDEyKSwgV1RDKDB4MDJlMjg2YTgpLCBXVEMoMHgwMjExNTU4NiksIFdUQygweDAxNjJhYTA0KSwKKyAgICBXVEMoMHgwMGQ2YjQwMyksIFdUQygweDAwNmQ5OWUzKSwgV1RDKDB4MDAyNzc4NzIpLCBXVEMoMHgwMDA0NjJlYiksCit9OwpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy91c2FjZGVjX3JvbS5oIGIvbGliQUFDZGVjL3NyYy91c2FjZGVjX3JvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZDRjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJBQUNkZWMvc3JjL3VzYWNkZWNfcm9tLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE0uIEphbmRlcgorCisgICBEZXNjcmlwdGlvbjogcmU4LmgKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBVU0FDREVDX1JPTV9ICisjZGVmaW5lIFVTQUNERUNfUk9NX0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKyNpbmNsdWRlICJGREtfbHBjLmgiCisKKyNpbmNsdWRlICJ1c2FjZGVjX2NvbnN0LmgiCisKKy8qIFJFOCBsYXR0aWNlIHF1YW50aXNlciBjb25zdGFudHMgKi8KKyNkZWZpbmUgTkJfU1BIRVJFIDMyCisjZGVmaW5lIE5CX0xFQURFUiAzNworI2RlZmluZSBOQl9MRFNJR04gMjI2CisjZGVmaW5lIE5CX0xEUTMgOQorI2RlZmluZSBOQl9MRFE0IDI4CisKKyNkZWZpbmUgTFNGX1NDQUxFIDEzCisKKy8qIFJFOCBsYXR0aWNlIHF1YW50aXNlciB0YWJsZXMgKi8KK2V4dGVybiBjb25zdCBVSU5UIGZka19kZWNfdGFiX2ZhY3RvcmlhbFs4XTsKK2V4dGVybiBjb25zdCBVQ0hBUiBmZGtfZGVjX0lhW05CX0xFQURFUl07CitleHRlcm4gY29uc3QgVUNIQVIgZmRrX2RlY19Ec1tOQl9MRFNJR05dOworZXh0ZXJuIGNvbnN0IFVTSE9SVCBmZGtfZGVjX0lzW05CX0xEU0lHTl07CitleHRlcm4gY29uc3QgVUNIQVIgZmRrX2RlY19Oc1tdLCBmZGtfZGVjX0EzW10sIGZka19kZWNfQTRbXTsKK2V4dGVybiBjb25zdCBVQ0hBUiBmZGtfZGVjX0RhW11bOF07CitleHRlcm4gY29uc3QgVVNIT1JUIGZka19kZWNfSTNbXSwgZmRrX2RlY19JNFtdOworCisvKiB0ZW1wIGZsb2F0IHRhYmxlcyBmb3IgTFBDIGRlY29kaW5nICovCitleHRlcm4gY29uc3QgRklYUF9MUEMgZmRrX2RlY19sc2ZfaW5pdFsxNl07CitleHRlcm4gY29uc3QgRklYUF9MUEMgZmRrX2RlY19kaWNvX2xzZl9hYnNfOGJbMTYgKiAyNTZdOworCisvKiBBQ0VMUCB0YWJsZXMgKi8KKyNkZWZpbmUgU0ZfUVVBX0dBSU43QiA0CitleHRlcm4gY29uc3QgRklYUF9TR0wgdF9xdWFfZ2FpbjdiWzEyOCAqIDJdOworZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIGxzcF9pbnRlcnBvbF9mYWN0b3JbMl1bTkJfU1VCRlJdOworCisvKiBGb3IgYmFzcyBwb3N0IGZpbHRlciAqLworI2RlZmluZSBMX0ZJTFQgMTIgLyogRGVsYXkgb2YgdXAtc2FtcGxpbmcgZmlsdGVyICAgICAgICAgICAgICAgICovCisKK2V4dGVybiBjb25zdCBGSVhQX1NHTCBmZGtfZGVjX2ZpbHRfbHBbMSArIExfRklMVF07CisKK2V4dGVybiBjb25zdCBGSVhQX1dUQiBGYWNXaW5kb3dTeW50aDEyOFsxMjhdOworZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIEZhY1dpbmRvd1ppcjEyOFsxMjhdOworZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIEZhY1dpbmRvd1N5bnRoNjRbNjRdOworZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIEZhY1dpbmRvd1ppcjY0WzY0XTsKK2V4dGVybiBjb25zdCBGSVhQX1dUQiBGYWNXaW5kb3dTeW50aDMyWzMyXTsKK2V4dGVybiBjb25zdCBGSVhQX1dUQiBGYWNXaW5kb3daaXIzMlszMl07CitleHRlcm4gY29uc3QgRklYUF9XVEIgRmFjV2luZG93U3ludGg5Nls5Nl07CitleHRlcm4gY29uc3QgRklYUF9XVEIgRmFjV2luZG93WmlyOTZbOTZdOworZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIEZhY1dpbmRvd1N5bnRoNDhbNDhdOworZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIEZhY1dpbmRvd1ppcjQ4WzQ4XTsKKworI2VuZGlmIC8qIFVTQUNERUNfUk9NX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9pbmNsdWRlL2FhY2VuY19saWIuaCBiL2xpYkFBQ2VuYy9pbmNsdWRlL2FhY2VuY19saWIuaAppbmRleCA4MjhhOTE3Li4yZTQ3NTcxIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvaW5jbHVkZS9hYWNlbmNfbGliLmgKKysrIGIvbGliQUFDZW5jL2luY2x1ZGUvYWFjZW5jX2xpYi5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDEyICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUctNCBIRS1BQUMgRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gTG9od2Fzc2VyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyCisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioKICAqIFxmaWxlICAgYWFjZW5jX2xpYi5oCkBAIC05NCw4NyArMTA4LDEwNiBAQAogCiBcc2VjdGlvbiBTY29wZQogCi1UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgaGlnaC1sZXZlbCBpbnRlcmZhY2UgYW5kIHVzYWdlIG9mIHRoZSBJU08vTVBFRy0yLzQgQUFDIEVuY29kZXIKLWxpYnJhcnkgZGV2ZWxvcGVkIGJ5IHRoZSBGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyAoSUlTKS4KK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBoaWdoLWxldmVsIGludGVyZmFjZSBhbmQgdXNhZ2Ugb2YgdGhlIElTTy9NUEVHLTIvNAorQUFDIEVuY29kZXIgbGlicmFyeSBkZXZlbG9wZWQgYnkgdGhlIEZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkCitDaXJjdWl0cyAoSUlTKS4KIAotVGhlIGxpYnJhcnkgaW1wbGVtZW50cyBlbmNvZGluZyBvbiB0aGUgYmFzaXMgb2YgdGhlIE1QRUctMiBhbmQgTVBFRy00IEFBQyBMb3ctQ29tcGxleGl0eQotc3RhbmRhcmQsIGFuZCBkZXBlbmRpbmcgb24gdGhlIGxpYnJhcnkncyBjb25maWd1cmF0aW9uLCBNUEVHLTQgSGlnaC1FZmZpY2llbmN5IEFBQyB2MiBhbmQvb3IgQUFDLUVMRCBzdGFuZGFyZC4KK1RoZSBsaWJyYXJ5IGltcGxlbWVudHMgZW5jb2Rpbmcgb24gdGhlIGJhc2lzIG9mIHRoZSBNUEVHLTIgYW5kIE1QRUctNCBBQUMKK0xvdy1Db21wbGV4aXR5IHN0YW5kYXJkLCBhbmQgZGVwZW5kaW5nIG9uIHRoZSBsaWJyYXJ5J3MgY29uZmlndXJhdGlvbiwgTVBFRy00CitIaWdoLUVmZmljaWVuY3kgQUFDIHYyIGFuZC9vciBBQUMtRUxEIHN0YW5kYXJkLgogCi1BbGwgcmVmZXJlbmNlcyB0byBTQlIgKFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24pIGFyZSBvbmx5IGFwcGxpY2FibGUgdG8gSEUtQUFDIG9yIEFBQy1FTEQgdmVyc2lvbnMKLW9mIHRoZSBsaWJyYXJ5LiBBbGwgcmVmZXJlbmNlcyB0byBQUyAoUGFyYW1ldHJpYyBTdGVyZW8pIGFyZSBvbmx5IGFwcGxpY2FibGUgdG8gSEUtQUFDIHYyCi12ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS4KK0FsbCByZWZlcmVuY2VzIHRvIFNCUiAoU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbikgYXJlIG9ubHkgYXBwbGljYWJsZSB0byBIRS1BQUMKK29yIEFBQy1FTEQgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkuIEFsbCByZWZlcmVuY2VzIHRvIFBTIChQYXJhbWV0cmljIFN0ZXJlbykgYXJlCitvbmx5IGFwcGxpY2FibGUgdG8gSEUtQUFDIHYyIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5LgogCiBcc2VjdGlvbiBlbmNCYXNpY3MgRW5jb2RlciBCYXNpY3MKIAotVGhpcyBkb2N1bWVudCBjYW4gb25seSBnaXZlIGEgcm91Z2ggb3ZlcnZpZXcgYWJvdXQgdGhlIElTTy9NUEVHLTIgYW5kIElTTy9NUEVHLTQgQUFDIGF1ZGlvIGNvZGluZwotc3RhbmRhcmQuIFRvIHVuZGVyc3RhbmQgYWxsIHRoZSB0ZXJtcyBpbiB0aGlzIGRvY3VtZW50LCB5b3UgYXJlIGVuY291cmFnZWQgdG8gcmVhZCB0aGUgZm9sbG93aW5nIGRvY3VtZW50cy4KK1RoaXMgZG9jdW1lbnQgY2FuIG9ubHkgZ2l2ZSBhIHJvdWdoIG92ZXJ2aWV3IGFib3V0IHRoZSBJU08vTVBFRy0yIGFuZCBJU08vTVBFRy00CitBQUMgYXVkaW8gY29kaW5nIHN0YW5kYXJkLiBUbyB1bmRlcnN0YW5kIGFsbCB0aGUgdGVybXMgaW4gdGhpcyBkb2N1bWVudCwgeW91IGFyZQorZW5jb3VyYWdlZCB0byByZWFkIHRoZSBmb2xsb3dpbmcgZG9jdW1lbnRzLgogCi0tIElTTy9JRUMgMTM4MTgtNyAoTVBFRy0yIEFBQyksIHdoaWNoIGRlZmluZXMgdGhlIHN5bnRheCBvZiBNUEVHLTIgQUFDIGF1ZGlvIGJpdHN0cmVhbXMuCi0tIElTTy9JRUMgMTQ0OTYtMyAoTVBFRy00IEFBQywgc3VicGFydHMgMSBhbmQgNCksIHdoaWNoIGRlZmluZXMgdGhlIHN5bnRheCBvZiBNUEVHLTQgQUFDIGF1ZGlvIGJpdHN0cmVhbXMuCi0tIEx1dHpreSwgU2NodWxsZXIsIEdheWVyLCBLciZhdW1sO21lciwgV2FibmlrLCAiQSBndWlkZWxpbmUgdG8gYXVkaW8gY29kZWMgZGVsYXkiLCAxMTZ0aCBBRVMgQ29udmVudGlvbiwgTWF5IDgsIDIwMDQKKy0gSVNPL0lFQyAxMzgxOC03IChNUEVHLTIgQUFDKSwgd2hpY2ggZGVmaW5lcyB0aGUgc3ludGF4IG9mIE1QRUctMiBBQUMgYXVkaW8KK2JpdHN0cmVhbXMuCistIElTTy9JRUMgMTQ0OTYtMyAoTVBFRy00IEFBQywgc3VicGFydHMgMSBhbmQgNCksIHdoaWNoIGRlZmluZXMgdGhlIHN5bnRheCBvZgorTVBFRy00IEFBQyBhdWRpbyBiaXRzdHJlYW1zLgorLSBMdXR6a3ksIFNjaHVsbGVyLCBHYXllciwgS3ImYXVtbDttZXIsIFdhYm5paywgIkEgZ3VpZGVsaW5lIHRvIGF1ZGlvIGNvZGVjCitkZWxheSIsIDExNnRoIEFFUyBDb252ZW50aW9uLCBNYXkgOCwgMjAwNAogCi1NUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyBpcyBiYXNlZCBvbiBhIHRpbWUtdG8tZnJlcXVlbmN5IG1hcHBpbmcgb2YgdGhlIHNpZ25hbC4gVGhlIHNpZ25hbCBpcwotcGFydGl0aW9uZWQgaW50byBvdmVybGFwcGluZyBwb3J0aW9ucyBhbmQgdHJhbnNmb3JtZWQgaW50byBmcmVxdWVuY3kgZG9tYWluLiBUaGUgc3BlY3RyYWwgY29tcG9uZW50cwotYXJlIHRoZW4gcXVhbnRpemVkIGFuZCBjb2RlZC4gXG4KLUFuIE1QRUctMiBvciBNUEVHLTQgQUFDIGF1ZGlvIGJpdHN0cmVhbSBpcyBjb21wb3NlZCBvZiBmcmFtZXMuIENvbnRyYXJ5IHRvIE1QRUctMS8yIExheWVyLTMgKG1wMyksIHRoZQotbGVuZ3RoIG9mIGluZGl2aWR1YWwgZnJhbWVzIGlzIG5vdCByZXN0cmljdGVkIHRvIGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzLCBidXQgY2FuIHRha2Ugb24gYW55IGxlbmd0aAotYmV0d2VlbiAxIGFuZCA3NjggYnl0ZXMuCitNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyBpcyBiYXNlZCBvbiBhIHRpbWUtdG8tZnJlcXVlbmN5IG1hcHBpbmcgb2YgdGhlCitzaWduYWwuIFRoZSBzaWduYWwgaXMgcGFydGl0aW9uZWQgaW50byBvdmVybGFwcGluZyBwb3J0aW9ucyBhbmQgdHJhbnNmb3JtZWQgaW50bworZnJlcXVlbmN5IGRvbWFpbi4gVGhlIHNwZWN0cmFsIGNvbXBvbmVudHMgYXJlIHRoZW4gcXVhbnRpemVkIGFuZCBjb2RlZC4gXG4gQW4KK01QRUctMiBvciBNUEVHLTQgQUFDIGF1ZGlvIGJpdHN0cmVhbSBpcyBjb21wb3NlZCBvZiBmcmFtZXMuIENvbnRyYXJ5IHRvIE1QRUctMS8yCitMYXllci0zIChtcDMpLCB0aGUgbGVuZ3RoIG9mIGluZGl2aWR1YWwgZnJhbWVzIGlzIG5vdCByZXN0cmljdGVkIHRvIGEgZml4ZWQKK251bWJlciBvZiBieXRlcywgYnV0IGNhbiB0YWtlIG9uIGFueSBsZW5ndGggYmV0d2VlbiAxIGFuZCA3NjggYnl0ZXMuCiAKIAogXHBhZ2UgTElCVVNFIExpYnJhcnkgVXNhZ2UKIAogXHNlY3Rpb24gSW50ZXJmYWNlRGVzY3JpcHRpb24gQVBJIEZpbGVzCiAKLUFsbCBBUEkgaGVhZGVyIGZpbGVzIGFyZSBsb2NhdGVkIGluIHRoZSBmb2xkZXIgL2luY2x1ZGUgb2YgdGhlIHJlbGVhc2UgcGFja2FnZS4gQWxsIGhlYWRlciBmaWxlcwotYXJlIHByb3ZpZGVkIGZvciB1c2FnZSBpbiBDL0MrKyBwcm9ncmFtcy4gVGhlIEFBQyBlbmNvZGVyIGxpYnJhcnkgQVBJIGZ1bmN0aW9ucyBhcmUgbG9jYXRlZCBhdAotYWFjZW5jX2xpYi5oLgorQWxsIEFQSSBoZWFkZXIgZmlsZXMgYXJlIGxvY2F0ZWQgaW4gdGhlIGZvbGRlciAvaW5jbHVkZSBvZiB0aGUgcmVsZWFzZSBwYWNrYWdlLgorQWxsIGhlYWRlciBmaWxlcyBhcmUgcHJvdmlkZWQgZm9yIHVzYWdlIGluIEMvQysrIHByb2dyYW1zLiBUaGUgQUFDIGVuY29kZXIKK2xpYnJhcnkgQVBJIGZ1bmN0aW9ucyBhcmUgbG9jYXRlZCBpbiBhYWNlbmNfbGliLmguCiAKLUluIGJpbmFyeSByZWxlYXNlcyB0aGUgZW5jb2RlciBjb3JlIHJlc2lkZXMgaW4gc3RhdGljYWxseSBsaW5rYWJsZSBsaWJyYXJpZXMgY2FsbGVkIGZvciBleGFtcGxlCi1saWJBQUNlbmMuYS9saWJGREsuYSAoTElOVVgpIG9yIEZES19mYXN0YWFjbGliLmxpYiAoTVMgVmlzdWFsIEMrKykgZm9yIHRoZSBwbGFpbiBBQUMtTEMgY29yZSBlbmNvZGVyCi1hbmQgbGliU0JSZW5jLmEgKExJTlVYKSBvciBGREtfc2JyRW5jTGliLmxpYiAoTVMgVmlzdWFsIEMrKykgZm9yIHRoZSBTQlIgKFNwZWN0cmFsIEJhbmQKLVJlcGxpY2F0aW9uKSBhbmQgUFMgKFBhcmFtZXRyaWMgU3RlcmVvKSBtb2R1bGVzLgorSW4gYmluYXJ5IHJlbGVhc2VzIHRoZSBlbmNvZGVyIGNvcmUgcmVzaWRlcyBpbiBzdGF0aWNhbGx5IGxpbmthYmxlIGxpYnJhcmllcworY2FsbGVkIGZvciBleGFtcGxlIGxpYkFBQ2VuYy5hL2xpYkZESy5hIChMSU5VWCkgb3IgRkRLX2Zhc3RhYWNsaWIubGliIChNUyBWaXN1YWwKK0MrKykgZm9yIHRoZSBwbGFpbiBBQUMtTEMgY29yZSBlbmNvZGVyIGFuZCBsaWJTQlJlbmMuYSAoTElOVVgpIG9yCitGREtfc2JyRW5jTGliLmxpYiAoTVMgVmlzdWFsIEMrKykgZm9yIHRoZSBTQlIgKFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24pIGFuZCBQUworKFBhcmFtZXRyaWMgU3RlcmVvKSBtb2R1bGVzLgogCiBcc2VjdGlvbiBDYWxsaW5nU2VxdWVuY2UgQ2FsbGluZyBTZXF1ZW5jZQogCi1Gb3IgZW5jb2Rpbmcgb2YgSVNPL01QRUctMi80IEFBQyBiaXRzdHJlYW1zIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2UgaXMgbWFuZGF0b3J5LiBJbnB1dCByZWFkIGFuZCBvdXRwdXQKLXdyaXRlIGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIHRoZSBjb3JyZXNwb25kaW5nIG9wZW4gYW5kIGNsb3NlIGZ1bmN0aW9ucyBhcmUgbGVmdCBvdXQsIHNpbmNlIHRoZXkgbWF5IGJlCi1pbXBsZW1lbnRlZCBkaWZmZXJlbnRseSBhY2NvcmRpbmcgdG8gdGhlIHVzZXIncyBzcGVjaWZpYyByZXF1aXJlbWVudHMuIFRoZSBleGFtcGxlIGltcGxlbWVudGF0aW9uIGluCi1tYWluLmNwcCB1c2VzIGZpbGUtYmFzZWQgaW5wdXQvb3V0cHV0LgorRm9yIGVuY29kaW5nIG9mIElTTy9NUEVHLTIvNCBBQUMgYml0c3RyZWFtcyB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIGlzIG1hbmRhdG9yeS4KK0lucHV0IHJlYWQgYW5kIG91dHB1dCB3cml0ZSBmdW5jdGlvbnMgYXMgd2VsbCBhcyB0aGUgY29ycmVzcG9uZGluZyBvcGVuIGFuZAorY2xvc2UgZnVuY3Rpb25zIGFyZSBsZWZ0IG91dCwgc2luY2UgdGhleSBtYXkgYmUgaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkKK2FjY29yZGluZyB0byB0aGUgdXNlcidzIHNwZWNpZmljIHJlcXVpcmVtZW50cy4gVGhlIGV4YW1wbGUgaW1wbGVtZW50YXRpb24gdXNlcworZmlsZS1iYXNlZCBpbnB1dC9vdXRwdXQuCiAKLS0jIENhbGwgYWFjRW5jT3BlbigpIHRvIGFsbG9jYXRlIGVuY29kZXIgaW5zdGFuY2Ugd2l0aCByZXF1aXJlZCBccmVmIGVuY09wZW4gImNvbmZpZ3VyYXRpb24iLlxuCi1cZG9udGluY2x1ZGUgbWFpbi5jcHAKLVxza2lwbGluZSBoQWFjRW5jb2RlciA9Ci1cc2tpcGxpbmUgYWFjRW5jT3BlbgotLSMgQ2FsbCBhYWNFbmNvZGVyX1NldFBhcmFtKCkgZm9yIGVhY2ggcGFyYW1ldGVyIHRvIGJlIHNldC4gQU9ULCBzYW1wbGluZ3JhdGUsIGNoYW5uZWxNb2RlLCBiaXRyYXRlIGFuZCB0cmFuc3BvcnQgdHlwZSBhcmUgXHJlZiBlbmNQYXJhbXMgIm1hbmRhdG9yeSIuCi1cY29kZQotICAgIEVycm9yU3RhdHVzID0gYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgcGFyYW1ldGVyLCB2YWx1ZSk7CistIyBDYWxsIGFhY0VuY09wZW4oKSB0byBhbGxvY2F0ZSBlbmNvZGVyIGluc3RhbmNlIHdpdGggcmVxdWlyZWQgXHJlZiBlbmNPcGVuCisiY29uZmlndXJhdGlvbiIuIFxjb2RlIEhBTkRMRV9BQUNFTkNPREVSIGhBYWNFbmNvZGVyID0gTlVMTDsgaWYgKCAoRXJyb3JTdGF0dXMgPQorYWFjRW5jT3BlbigmaEFhY0VuY29kZXIsMCwwKSkgIT0gQUFDRU5DX09LICkgeyBcZW5kY29kZQorLSMgQ2FsbCBhYWNFbmNvZGVyX1NldFBhcmFtKCkgZm9yIGVhY2ggcGFyYW1ldGVyIHRvIGJlIHNldC4gQU9ULCBzYW1wbGluZ3JhdGUsCitjaGFubmVsTW9kZSwgYml0cmF0ZSBhbmQgdHJhbnNwb3J0IHR5cGUgYXJlIFxyZWYgZW5jUGFyYW1zICJtYW5kYXRvcnkiLiBcY29kZQorRXJyb3JTdGF0dXMgPSBhYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBwYXJhbWV0ZXIsIHZhbHVlKTsKIFxlbmRjb2RlCi0tIyBDYWxsIGFhY0VuY0VuY29kZSgpIHdpdGggTlVMTCBwYXJhbWV0ZXJzIHRvIFxyZWYgZW5jUmVjb25mICJpbml0aWFsaXplIiBlbmNvZGVyIGluc3RhbmNlIHdpdGggcHJlc2VudCBwYXJhbWV0ZXIgc2V0LgotXHNraXBsaW5lIGFhY0VuY0VuY29kZQotLSMgQ2FsbCBhYWNFbmNJbmZvKCkgdG8gcmV0cmlldmUgYSBjb25maWd1cmF0aW9uIGRhdGEgYmxvY2sgdG8gYmUgdHJhbnNtaXR0ZWQgb3V0IG9mIGJhbmQuIFRoaXMgaXMgcmVxdWlyZWQgd2hlbiB1c2luZyBSRkMzNjQwIG9yIFJGQzMwMTYgbGlrZSB0cmFuc3BvcnQuCi1cZG9udGluY2x1ZGUgbWFpbi5jcHAKLVxza2lwbGluZSBlbmNJbmZvCi1cc2tpcGxpbmUgYWFjRW5jSW5mbworLSMgQ2FsbCBhYWNFbmNFbmNvZGUoKSB3aXRoIE5VTEwgcGFyYW1ldGVycyB0byBccmVmIGVuY1JlY29uZiAiaW5pdGlhbGl6ZSIKK2VuY29kZXIgaW5zdGFuY2Ugd2l0aCBwcmVzZW50IHBhcmFtZXRlciBzZXQuIFxjb2RlIEVycm9yU3RhdHVzID0KK2FhY0VuY0VuY29kZShoQWFjRW5jb2RlciwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7IFxlbmRjb2RlCistIyBDYWxsIGFhY0VuY0luZm8oKSB0byByZXRyaWV2ZSBhIGNvbmZpZ3VyYXRpb24gZGF0YSBibG9jayB0byBiZSB0cmFuc21pdHRlZAorb3V0IG9mIGJhbmQuIFRoaXMgaXMgcmVxdWlyZWQgd2hlbiB1c2luZyBSRkMzNjQwIG9yIFJGQzMwMTYgbGlrZSB0cmFuc3BvcnQuCitcY29kZQorQUFDRU5DX0luZm9TdHJ1Y3QgZW5jSW5mbzsKK2FhY0VuY0luZm8oaEFhY0VuY29kZXIsICZlbmNJbmZvKTsKK1xlbmRjb2RlCiAtIyBFbmNvZGUgaW5wdXQgYXVkaW8gZGF0YSBpbiBsb29wLgotXHNraXAgRW5jb2RlIGFzIGxvbmcgYXMKLVxza2lwbGluZSBkbwotXHVudGlsIHsKLUZlZWQgXHJlZiBmZWVkSW5CdWYgImlucHV0IGJ1ZmZlciIgd2l0aCBuZXcgYXVkaW8gZGF0YSBhbmQgcHJvdmlkZSBpbnB1dC9vdXRwdXQgXHJlZiBidWZEZXMgImFyZ3VtZW50cyIgdG8gYWFjRW5jRW5jb2RlKCkuCi1cc2tpcGxpbmUgYWFjRW5jRW5jb2RlCi1cdW50aWwgOwotV3JpdGUgXHJlZiB3cml0ZU91dERhdGEgIm91dHB1dCBkYXRhIiB0byBmaWxlIG9yIGF1ZGlvIGRldmljZS4gXHNraXBsaW5lIHdoaWxlCitcY29kZQorZG8KK3sKK1xlbmRjb2RlCitGZWVkIFxyZWYgZmVlZEluQnVmICJpbnB1dCBidWZmZXIiIHdpdGggbmV3IGF1ZGlvIGRhdGEgYW5kIHByb3ZpZGUgaW5wdXQvb3V0cHV0CitccmVmIGJ1ZkRlcyAiYXJndW1lbnRzIiB0byBhYWNFbmNFbmNvZGUoKS4gXGNvZGUgRXJyb3JTdGF0dXMgPQorYWFjRW5jRW5jb2RlKGhBYWNFbmNvZGVyLCAmaW5CdWZEZXNjLCAmb3V0QnVmRGVzYywgJmluYXJncywgJm91dGFyZ3MpOyBcZW5kY29kZQorV3JpdGUgXHJlZiB3cml0ZU91dERhdGEgIm91dHB1dCBkYXRhIiB0byBmaWxlIG9yIGF1ZGlvIGRldmljZS4KK1xjb2RlCit9IHdoaWxlIChFcnJvclN0YXR1cz09QUFDRU5DX09LKTsKK1xlbmRjb2RlCiAtIyBDYWxsIGFhY0VuY0Nsb3NlKCkgYW5kIGRlc3Ryb3kgZW5jb2RlciBpbnN0YW5jZS4KLVxza2lwbGluZSBhYWNFbmNDbG9zZQorXGNvZGUKK2FhY0VuY0Nsb3NlKCZoQWFjRW5jb2Rlcik7CitcZW5kY29kZQorCiAKIFxzZWN0aW9uIGVuY09wZW4gRW5jb2RlciBJbnN0YW5jZSBBbGxvY2F0aW9uCiAKLVRoZSBhc3NpZ25tZW50IG9mIHRoZSBhYWNFbmNPcGVuKCkgZnVuY3Rpb24gaXMgdmVyeSBmbGV4aWJsZSBhbmQgY2FuIGJlIHVzZWQgaW4gdGhlIGZvbGxvd2luZyB3YXkuCi0tIElmIHRoZSBhbW91bnQgb2YgbWVtb3J5IGNvbnN1bXB0aW9uIGlzIG5vdCBhbiBpc3N1ZSwgdGhlIGVuY29kZXIgaW5zdGFuY2UgY2FuIGJlIGFsbG9jYXRlZAotZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwb3NzaWJsZSBhdWRpbyBjaGFubmVscyAoZm9yIGV4YW1wbGUgNiBvciA4KSB3aXRoIHRoZSBmdWxsIGZ1bmN0aW9uYWwgcmFuZ2Ugc3VwcG9ydGVkIGJ5IHRoZSBsaWJyYXJ5LgotVGhpcyBpcyB0aGUgZGVmYXVsdCBvcGVuIHByb2NlZHVyZSBmb3IgdGhlIEFBQyBlbmNvZGVyIGlmIG1lbW9yeSBjb25zdW1wdGlvbiBkb2VzIG5vdCBuZWVkIHRvIGJlIG1pbmltaXplZC4KLVxjb2RlIGFhY0VuY09wZW4oJmhBYWNFbmNvZGVyLDAsMCkgXGVuZGNvZGUKLS0gSWYgdGhlIHJlcXVpcmVkIE1QRUctNCBBT1RzIGRvIG5vdCBjYWxsIGZvciB0aGUgZnVsbCBmdW5jdGlvbmFsIHJhbmdlIG9mIHRoZSBsaWJyYXJ5LCBlbmNvZGVyIG1vZHVsZXMgY2FuIGJlIGFsbG9jYXRlZCBzZWxlY3RpdmVseS4KLVx2ZXJiYXRpbQorVGhlIGFzc2lnbm1lbnQgb2YgdGhlIGFhY0VuY09wZW4oKSBmdW5jdGlvbiBpcyB2ZXJ5IGZsZXhpYmxlIGFuZCBjYW4gYmUgdXNlZCBpbgordGhlIGZvbGxvd2luZyB3YXkuCistIElmIHRoZSBhbW91bnQgb2YgbWVtb3J5IGNvbnN1bXB0aW9uIGlzIG5vdCBhbiBpc3N1ZSwgdGhlIGVuY29kZXIgaW5zdGFuY2UgY2FuCitiZSBhbGxvY2F0ZWQgZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwb3NzaWJsZSBhdWRpbyBjaGFubmVscyAoZm9yIGV4YW1wbGUgNiBvcgorOCkgd2l0aCB0aGUgZnVsbCBmdW5jdGlvbmFsIHJhbmdlIHN1cHBvcnRlZCBieSB0aGUgbGlicmFyeS4gVGhpcyBpcyB0aGUgZGVmYXVsdAorb3BlbiBwcm9jZWR1cmUgZm9yIHRoZSBBQUMgZW5jb2RlciBpZiBtZW1vcnkgY29uc3VtcHRpb24gZG9lcyBub3QgbmVlZCB0byBiZQorbWluaW1pemVkLiBcY29kZSBhYWNFbmNPcGVuKCZoQWFjRW5jb2RlciwwLDApIFxlbmRjb2RlCistIElmIHRoZSByZXF1aXJlZCBNUEVHLTQgQU9UcyBkbyBub3QgY2FsbCBmb3IgdGhlIGZ1bGwgZnVuY3Rpb25hbCByYW5nZSBvZiB0aGUKK2xpYnJhcnksIGVuY29kZXIgbW9kdWxlcyBjYW4gYmUgYWxsb2NhdGVkIHNlbGVjdGl2ZWx5LiBcdmVyYmF0aW0KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIEFBQyB8IFNCUiB8ICBQUyB8IE1EIHwgICAgICAgICBGTEFHUyAgICAgICAgIHwgdmFsdWUKIC0tLS0tKy0tLS0tKy0tLS0tKy0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLQpAQCAtMTkxLDEyOSArMjI0LDE3OCBAQAogIC0gTUQ6IEFsbG9jYXRlIE1ldGEgRGF0YSBtb2R1bGUgd2l0aGluIEFBQyBlbmNvZGVyLgogXGVuZHZlcmJhdGltCiBcY29kZSBhYWNFbmNPcGVuKCZoQWFjRW5jb2Rlcix2YWx1ZSwwKSBcZW5kY29kZQotLSBTcGVjaWZ5aW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyB0byBiZSBzdXBwb3J0ZWQgaW4gdGhlIGVuY29kZXIgaW5zdGFuY2UgY2FuIGJlIGRvbmUgYXMgZm9sbG93cy4KLSAtIEZvciBleGFtcGxlIGFsbG9jYXRlIGFuIGVuY29kZXIgaW5zdGFuY2Ugd2hpY2ggc3VwcG9ydHMgMiBjaGFubmVscyBmb3IgYWxsIHN1cHBvcnRlZCBBT1RzLgotICAgVGhlIGxpYnJhcnkgaXRzZWxmIG1heSBiZSBjYXBhYmxlIG9mIGVuY29kaW5nIHVwIHRvIDYgb3IgOCBjaGFubmVscyBidXQgaW4gdGhpcyBleGFtcGxlIG9ubHkgMiBjaGFubmVsIGVuY29kaW5nIGlzIHJlcXVpcmVkIGFuZCB0aHVzIG9ubHkgYnVmZmVycyBmb3IgMiBjaGFubmVscyBhcmUgYWxsb2NhdGVkIHRvIHNhdmUgZGF0YSBtZW1vcnkuCi1cY29kZSBhYWNFbmNPcGVuKCZoQWFjRW5jb2RlciwwLDIpIFxlbmRjb2RlCi0gLSBBZGRpdGlvbmFsbHkgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBjaGFubmVscyBpbiB0aGUgU0JSIG1vZHVsZSBjYW4gYmUgZGVub3RlZCBzZXBhcmF0ZWx5LlxuCi0gICBJbiB0aGlzIGV4YW1wbGUgdGhlIGVuY29kZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBtYXhpbXVtIG9mIDYgY2hhbm5lbHMgb3V0IG9mIHdoaWNoIHVwIHRvIDIgY2hhbm5lbHMgc3VwcG9ydCBTQlIuCi0gICBUaGlzIGVuY29kZXIgaW5zdGFuY2UgY2FuIHByb2R1Y2UgZm9yIGV4YW1wbGUgNS4xIGNoYW5uZWwgQUFDLUxDIHN0cmVhbXMgb3Igc3RlcmVvIEhFLUFBQyAodjIpIHN0cmVhbXMuCi0gICBIRS1BQUMgNS4xIG11bHRpIGNoYW5uZWwgaXMgbm90IHBvc3NpYmxlIHNpbmNlIG9ubHkgMiBvdXQgb2YgNiBjaGFubmVscyBzdXBwb3J0IFNCUiwgd2hpY2ggc2F2ZXMgZGF0YSBtZW1vcnkuCi1cY29kZSBhYWNFbmNPcGVuKCZoQWFjRW5jb2RlciwwLDZ8KDI8PDgpKSBcZW5kY29kZQotXG4KKy0gU3BlY2lmeWluZyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgdG8gYmUgc3VwcG9ydGVkIGluIHRoZSBlbmNvZGVyCitpbnN0YW5jZSBjYW4gYmUgZG9uZSBhcyBmb2xsb3dzLgorIC0gRm9yIGV4YW1wbGUgYWxsb2NhdGUgYW4gZW5jb2RlciBpbnN0YW5jZSB3aGljaCBzdXBwb3J0cyAyIGNoYW5uZWxzIGZvciBhbGwKK3N1cHBvcnRlZCBBT1RzLiBUaGUgbGlicmFyeSBpdHNlbGYgbWF5IGJlIGNhcGFibGUgb2YgZW5jb2RpbmcgdXAgdG8gNiBvciA4CitjaGFubmVscyBidXQgaW4gdGhpcyBleGFtcGxlIG9ubHkgMiBjaGFubmVsIGVuY29kaW5nIGlzIHJlcXVpcmVkIGFuZCB0aHVzIG9ubHkKK2J1ZmZlcnMgZm9yIDIgY2hhbm5lbHMgYXJlIGFsbG9jYXRlZCB0byBzYXZlIGRhdGEgbWVtb3J5LiBcY29kZQorYWFjRW5jT3BlbigmaEFhY0VuY29kZXIsMCwyKSBcZW5kY29kZQorIC0gQWRkaXRpb25hbGx5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQgY2hhbm5lbHMgaW4gdGhlIFNCUiBtb2R1bGUgY2FuCitiZSBkZW5vdGVkIHNlcGFyYXRlbHkuXG4gSW4gdGhpcyBleGFtcGxlIHRoZSBlbmNvZGVyIGluc3RhbmNlIHByb3ZpZGVzIGEgbWF4aW11bQorb2YgNiBjaGFubmVscyBvdXQgb2Ygd2hpY2ggdXAgdG8gMiBjaGFubmVscyBzdXBwb3J0IFNCUi4gVGhpcyBlbmNvZGVyIGluc3RhbmNlCitjYW4gcHJvZHVjZSBmb3IgZXhhbXBsZSA1LjEgY2hhbm5lbCBBQUMtTEMgc3RyZWFtcyBvciBzdGVyZW8gSEUtQUFDICh2MikKK3N0cmVhbXMuIEhFLUFBQyA1LjEgbXVsdGkgY2hhbm5lbCBpcyBub3QgcG9zc2libGUgc2luY2Ugb25seSAyIG91dCBvZiA2IGNoYW5uZWxzCitzdXBwb3J0IFNCUiwgd2hpY2ggc2F2ZXMgZGF0YSBtZW1vcnkuIFxjb2RlIGFhY0VuY09wZW4oJmhBYWNFbmNvZGVyLDAsNnwoMjw8OCkpCitcZW5kY29kZSBcbgogCiBcc2VjdGlvbiBidWZEZXMgSW5wdXQvT3V0cHV0IEFyZ3VtZW50cwogCiBcc3Vic2VjdGlvbiBhbGxvY0lPQnVmcyBQcm92aWRlIEJ1ZmZlciBEZXNjcmlwdG9ycwotSW4gdGhlIHByZXNlbnQgZW5jb2RlciBBUEksIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIGRlc2NyaWJlZCB3aXRoIFxyZWYgQUFDRU5DX0J1ZkRlc2MgImJ1ZmZlciBkZXNjcmlwdG9ycyIuIFRoaXMgbWVjaGFuaXNtIGFsbG93cyBhIGZsZXhpYmxlIGhhbmRsaW5nCi1vZiBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgd2l0aG91dCBpbXBhY3QgdG8gdGhlIGFjdHVhbCBlbmNvZGluZyBjYWxsLiBPcHRpb25hbCBidWZmZXJzIGFyZSBuZWNlc3NhcnkgZS5nLiBmb3IgYW5jaWxsYXJ5IGRhdGEsIG1ldGEgZGF0YSBpbnB1dCBvciBhZGRpdGlvbmFsIG91dHB1dAotYnVmZmVycyBkZXNjcmliaW5nIHN1cGVyZnJhbWluZyBkYXRhIGluIERBQisgb3IgRFJNKy5cbgotQXQgbGVhc3Qgb25lIGlucHV0IGJ1ZmZlciBmb3IgYXVkaW8gaW5wdXQgZGF0YSBhbmQgb25lIG91dHB1dCBidWZmZXIgZm9yIGJpdHN0cmVhbSBkYXRhIG11c3QgYmUgYWxsb2NhdGVkLiBUaGUgaW5wdXQgYnVmZmVyIHNpemUgY2FuIGJlIGEgdXNlciBkZWZpbmVkIG11bHRpcGxlCi1vZiB0aGUgbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzLiBQQ00gaW5wdXQgZGF0YSB3aWxsIGJlIGNvcGllZCBmcm9tIHRoZSB1c2VyIGRlZmluZWQgUENNIGJ1ZmZlciB0byBhbiBpbnRlcm5hbCBpbnB1dCBidWZmZXIgYW5kIHNvIGlucHV0IGRhdGEgY2FuIGJlIGxlc3MgdGhhbiBvbmUgQUFDIGF1ZGlvIGZyYW1lLgotVGhlIG91dHB1dCBidWZmZXIgc2l6ZSBzaG91bGQgYmUgNjE0NCBiaXRzIHBlciBjaGFubmVsIGV4Y2x1ZGluZyB0aGUgTEZFIGNoYW5uZWwuCi1JZiB0aGUgb3V0cHV0IGRhdGEgZG9lcyBub3QgZml0IGludG8gdGhlIHByb3ZpZGVkIGJ1ZmZlciwgYW4gQUFDRU5DX0VSUk9SIHdpbGwgYmUgcmV0dXJuZWQgYnkgYWFjRW5jRW5jb2RlKCkuCi1cZG9udGluY2x1ZGUgbWFpbi5jcHAKLVxza2lwbGluZSBpbnB1dEJ1ZmZlcgotXHVudGlsIG91dHB1dEJ1ZmZlcgorSW4gdGhlIHByZXNlbnQgZW5jb2RlciBBUEksIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIGRlc2NyaWJlZCB3aXRoIFxyZWYKK0FBQ0VOQ19CdWZEZXNjICJidWZmZXIgZGVzY3JpcHRvcnMiLiBUaGlzIG1lY2hhbmlzbSBhbGxvd3MgYSBmbGV4aWJsZSBoYW5kbGluZworb2YgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIHdpdGhvdXQgaW1wYWN0IHRvIHRoZSBhY3R1YWwgZW5jb2RpbmcgY2FsbC4gT3B0aW9uYWwKK2J1ZmZlcnMgYXJlIG5lY2Vzc2FyeSBlLmcuIGZvciBhbmNpbGxhcnkgZGF0YSwgbWV0YSBkYXRhIGlucHV0IG9yIGFkZGl0aW9uYWwKK291dHB1dCBidWZmZXJzIGRlc2NyaWJpbmcgc3VwZXJmcmFtaW5nIGRhdGEgaW4gREFCKyBvciBEUk0rLlxuIEF0IGxlYXN0IG9uZQoraW5wdXQgYnVmZmVyIGZvciBhdWRpbyBpbnB1dCBkYXRhIGFuZCBvbmUgb3V0cHV0IGJ1ZmZlciBmb3IgYml0c3RyZWFtIGRhdGEgbXVzdAorYmUgYWxsb2NhdGVkLiBUaGUgaW5wdXQgYnVmZmVyIHNpemUgY2FuIGJlIGEgdXNlciBkZWZpbmVkIG11bHRpcGxlIG9mIHRoZSBudW1iZXIKK29mIGlucHV0IGNoYW5uZWxzLiBQQ00gaW5wdXQgZGF0YSB3aWxsIGJlIGNvcGllZCBmcm9tIHRoZSB1c2VyIGRlZmluZWQgUENNCitidWZmZXIgdG8gYW4gaW50ZXJuYWwgaW5wdXQgYnVmZmVyIGFuZCBzbyBpbnB1dCBkYXRhIGNhbiBiZSBsZXNzIHRoYW4gb25lIEFBQworYXVkaW8gZnJhbWUuIFRoZSBvdXRwdXQgYnVmZmVyIHNpemUgc2hvdWxkIGJlIDYxNDQgYml0cyBwZXIgY2hhbm5lbCBleGNsdWRpbmcKK3RoZSBMRkUgY2hhbm5lbC4gSWYgdGhlIG91dHB1dCBkYXRhIGRvZXMgbm90IGZpdCBpbnRvIHRoZSBwcm92aWRlZCBidWZmZXIsIGFuCitBQUNFTkNfRVJST1Igd2lsbCBiZSByZXR1cm5lZCBieSBhYWNFbmNFbmNvZGUoKS4gXGNvZGUgc3RhdGljIElOVF9QQ00KK2lucHV0QnVmZmVyWzgqMjA0OF07IHN0YXRpYyBVQ0hBUiAgICAgICAgICAgIGFuY2lsbGFyeUJ1ZmZlcls1MF07IHN0YXRpYworQUFDRU5DX01ldGFEYXRhICBtZXRhRGF0YVNldHVwOyBzdGF0aWMgVUNIQVIgICAgICAgICAgICBvdXRwdXRCdWZmZXJbODE5Ml07CitcZW5kY29kZQorCiBBbGwgaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgbXVzdCBiZSBjbHVzdGVyZWQgaW4gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgYXJyYXlzLgotXHNraXBsaW5lIGluQnVmZmVyCi1cdW50aWwgb3V0QnVmZmVyRWxTaXplCitcY29kZQorc3RhdGljIHZvaWQqIGluQnVmZmVyW10gICAgICAgID0geyBpbnB1dEJ1ZmZlciwgYW5jaWxsYXJ5QnVmZmVyLCAmbWV0YURhdGFTZXR1cAorfTsgc3RhdGljIElOVCAgIGluQnVmZmVySWRzW10gICAgID0geyBJTl9BVURJT19EQVRBLCBJTl9BTkNJTExSWV9EQVRBLAorSU5fTUVUQURBVEFfU0VUVVAgfTsgc3RhdGljIElOVCAgIGluQnVmZmVyU2l6ZVtdICAgID0geyBzaXplb2YoaW5wdXRCdWZmZXIpLAorc2l6ZW9mKGFuY2lsbGFyeUJ1ZmZlciksIHNpemVvZihtZXRhRGF0YVNldHVwKSB9OyBzdGF0aWMgSU5UICAgaW5CdWZmZXJFbFNpemVbXQorPSB7IHNpemVvZihJTlRfUENNKSwgc2l6ZW9mKFVDSEFSKSwgc2l6ZW9mKEFBQ0VOQ19NZXRhRGF0YSkgfTsKKworc3RhdGljIHZvaWQqIG91dEJ1ZmZlcltdICAgICAgID0geyBvdXRwdXRCdWZmZXIgfTsKK3N0YXRpYyBJTlQgICBvdXRCdWZmZXJJZHNbXSAgICA9IHsgT1VUX0JJVFNUUkVBTV9EQVRBIH07CitzdGF0aWMgSU5UICAgb3V0QnVmZmVyU2l6ZVtdICAgPSB7IHNpemVvZihvdXRwdXRCdWZmZXIpIH07CitzdGF0aWMgSU5UICAgb3V0QnVmZmVyRWxTaXplW10gPSB7IHNpemVvZihVQ0hBUikgfTsKK1xlbmRjb2RlCisKIEFsbG9jYXRlIGJ1ZmZlciBkZXNjcmlwdG9ycwotXHNraXBsaW5lIEFBQ0VOQ19CdWZEZXNjCi1cc2tpcGxpbmUgQUFDRU5DX0J1ZkRlc2MKK1xjb2RlCitBQUNFTkNfQnVmRGVzYyBpbkJ1ZkRlc2M7CitBQUNFTkNfQnVmRGVzYyBvdXRCdWZEZXNjOworXGVuZGNvZGUKKwogSW5pdGlhbGl6ZSBpbnB1dCBidWZmZXIgZGVzY3JpcHRvcgotXHNraXBsaW5lIGluQnVmRGVzYwotXHVudGlsIGJ1ZkVsU2l6ZXMKK1xjb2RlCitpbkJ1ZkRlc2MubnVtQnVmcyAgICAgICAgICAgID0gc2l6ZW9mKGluQnVmZmVyKS9zaXplb2Yodm9pZCopOworaW5CdWZEZXNjLmJ1ZnMgICAgICAgICAgICAgID0gKHZvaWQqKikmaW5CdWZmZXI7CitpbkJ1ZkRlc2MuYnVmZmVySWRlbnRpZmllcnMgPSBpbkJ1ZmZlcklkczsKK2luQnVmRGVzYy5idWZTaXplcyAgICAgICAgICA9IGluQnVmZmVyU2l6ZTsKK2luQnVmRGVzYy5idWZFbFNpemVzICAgICAgICA9IGluQnVmZmVyRWxTaXplOworXGVuZGNvZGUKKwogSW5pdGlhbGl6ZSBvdXRwdXQgYnVmZmVyIGRlc2NyaXB0b3IKLVxza2lwbGluZSBvdXRCdWZEZXNjCi1cdW50aWwgYnVmRWxTaXplcworXGNvZGUKK291dEJ1ZkRlc2MubnVtQnVmcyAgICAgICAgICAgPSBzaXplb2Yob3V0QnVmZmVyKS9zaXplb2Yodm9pZCopOworb3V0QnVmRGVzYy5idWZzICAgICAgICAgICAgICA9ICh2b2lkKiopJm91dEJ1ZmZlcjsKK291dEJ1ZkRlc2MuYnVmZmVySWRlbnRpZmllcnMgPSBvdXRCdWZmZXJJZHM7CitvdXRCdWZEZXNjLmJ1ZlNpemVzICAgICAgICAgID0gb3V0QnVmZmVyU2l6ZTsKK291dEJ1ZkRlc2MuYnVmRWxTaXplcyAgICAgICAgPSBvdXRCdWZmZXJFbFNpemU7CitcZW5kY29kZQogCiBcc3Vic2VjdGlvbiBhcmdMaXN0cyBQcm92aWRlIElucHV0L091dHB1dCBBcmd1bWVudCBMaXN0cwotVGhlIGlucHV0IGFuZCBvdXRwdXQgYXJndW1lbnRzIG9mIGFuIGFhY0VuY0VuY29kZSgpIGNhbGwgYXJlIGRlc2NyaWJlZCBpbiBhcmd1bWVudCBzdHJ1Y3R1cmVzLgotXGRvbnRpbmNsdWRlIG1haW4uY3BwCi1cc2tpcGxpbmUgQUFDRU5DX0luQXJncwotXHNraXBsaW5lIEFBQ0VOQ19PdXRBcmdzCitUaGUgaW5wdXQgYW5kIG91dHB1dCBhcmd1bWVudHMgb2YgYW4gYWFjRW5jRW5jb2RlKCkgY2FsbCBhcmUgZGVzY3JpYmVkIGluCithcmd1bWVudCBzdHJ1Y3R1cmVzLiBcY29kZSBBQUNFTkNfSW5BcmdzICAgICBpbmFyZ3M7IEFBQ0VOQ19PdXRBcmdzICAgIG91dGFyZ3M7CitcZW5kY29kZQogCiBcc2VjdGlvbiBmZWVkSW5CdWYgRmVlZCBJbnB1dCBCdWZmZXIKLVRoZSBpbnB1dCBidWZmZXIgc2hvdWxkIGJlIGhhbmRsZWQgYXMgYSBtb2R1bG8gYnVmZmVyLiBOZXcgYXVkaW8gZGF0YSBpbiB0aGUgZm9ybSBvZiBwdWxzZS1jb2RlLQotbW9kdWxhdGVkIHNhbXBsZXMgKFBDTSkgbXVzdCBiZSByZWFkIGZyb20gZXh0ZXJuYWwgYW5kIGJlIGZlZCB0byB0aGUgaW5wdXQgYnVmZmVyIGRlcGVuZGluZyBvbiBpdHMKLWZpbGwgbGV2ZWwuIFRoZSByZXF1aXJlZCBzYW1wbGUgYml0cmF0ZSAocmVwcmVzZW50ZWQgYnkgdGhlIGRhdGEgdHlwZSBJTlRfUENNIHdoaWNoIGlzIDE2LCAyNCBvciAzMgotYml0cyB3aWRlKSBpcyBmaXhlZCBhbmQgZGVwZW5kcyBvbiBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gKHVzdWFsbHkgMTYgYml0KS4KK1RoZSBpbnB1dCBidWZmZXIgc2hvdWxkIGJlIGhhbmRsZWQgYXMgYSBtb2R1bG8gYnVmZmVyLiBOZXcgYXVkaW8gZGF0YSBpbiB0aGUKK2Zvcm0gb2YgcHVsc2UtY29kZS0gbW9kdWxhdGVkIHNhbXBsZXMgKFBDTSkgbXVzdCBiZSByZWFkIGZyb20gZXh0ZXJuYWwgYW5kIGJlCitmZWQgdG8gdGhlIGlucHV0IGJ1ZmZlciBkZXBlbmRpbmcgb24gaXRzIGZpbGwgbGV2ZWwuIFRoZSByZXF1aXJlZCBzYW1wbGUgYml0cmF0ZQorKHJlcHJlc2VudGVkIGJ5IHRoZSBkYXRhIHR5cGUgSU5UX1BDTSB3aGljaCBpcyAxNiwgMjQgb3IgMzIgYml0cyB3aWRlKSBpcyBmaXhlZAorYW5kIGRlcGVuZHMgb24gbGlicmFyeSBjb25maWd1cmF0aW9uICh1c3VhbGx5IDE2IGJpdCkuIFxjb2RlIGluYXJncy5udW1JblNhbXBsZXMKKys9IFdBVl9JbnB1dFJlYWQgKCB3YXZJbiwgJmlucHV0QnVmZmVyW2luYXJncy5udW1JblNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLbWluKGVuY0luZm8uaW5wdXRDaGFubmVscyplbmNJbmZvLmZyYW1lTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnB1dEJ1ZmZlcikgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihJTlRfUENNKS1pbmFyZ3MubnVtSW5TYW1wbGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTVBMRV9CSVRTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKK1xlbmRjb2RlCiAKLVxkb250aW5jbHVkZSBtYWluLmNwcAotXHNraXBsaW5lIFdBVl9JbnB1dFJlYWQKLVx1bnRpbCA7Ci1BZnRlciB0aGUgZW5jb2RlcidzIGludGVybmFsIGJ1ZmZlciBpcyBmZWQgd2l0aCBpbmNvbWluZyBhdWRpbyBzYW1wbGVzLCBhbmQgYWFjRW5jRW5jb2RlKCkKLXByb2Nlc3NlZCB0aGUgbmV3IGlucHV0IGRhdGEsIHVwZGF0ZS9tb3ZlIHJlbWFpbmluZyBzYW1wbGVzIGluIGlucHV0IGJ1ZmZlciwgc2ltdWxhdGluZyBhIG1vZHVsbyBidWZmZXI6Ci1cc2tpcGxpbmUgb3V0YXJncy5udW1JblNhbXBsZXM+MAotXHVudGlsIH0KK0FmdGVyIHRoZSBlbmNvZGVyJ3MgaW50ZXJuYWwgYnVmZmVyIGlzIGZlZCB3aXRoIGluY29taW5nIGF1ZGlvIHNhbXBsZXMsIGFuZAorYWFjRW5jRW5jb2RlKCkgcHJvY2Vzc2VkIHRoZSBuZXcgaW5wdXQgZGF0YSwgdXBkYXRlL21vdmUgcmVtYWluaW5nIHNhbXBsZXMgaW4KK2lucHV0IGJ1ZmZlciwgc2ltdWxhdGluZyBhIG1vZHVsbyBidWZmZXI6IFxjb2RlIGlmIChvdXRhcmdzLm51bUluU2FtcGxlcz4wKSB7CisgICAgRkRLbWVtbW92ZSggaW5wdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgJmlucHV0QnVmZmVyW291dGFyZ3MubnVtSW5TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICBzaXplb2YoSU5UX1BDTSkqKGluYXJncy5udW1JblNhbXBsZXMtb3V0YXJncy5udW1JblNhbXBsZXMpICk7CisgICAgaW5hcmdzLm51bUluU2FtcGxlcyAtPSBvdXRhcmdzLm51bUluU2FtcGxlczsKK30KK1xlbmRjb2RlCiAKIFxzZWN0aW9uIHdyaXRlT3V0RGF0YSBPdXRwdXQgQml0c3RyZWFtIERhdGEKLUlmIGFueSBBQUMgYml0c3RyZWFtIGRhdGEgaXMgYXZhaWxhYmxlLCB3cml0ZSBpdCB0byBvdXRwdXQgZmlsZSBvciBkZXZpY2UuIFRoaXMgY2FuIGJlIGRvbmUgb25jZSB0aGUKLWZvbGxvd2luZyBjb25kaXRpb24gaXMgdHJ1ZToKLVxkb250aW5jbHVkZSBtYWluLmNwcAotXHNraXAgVmFsaWQgYml0c3RyZWFtIGF2YWlsYWJsZQotXHNraXBsaW5lIG91dGFyZ3MKK0lmIGFueSBBQUMgYml0c3RyZWFtIGRhdGEgaXMgYXZhaWxhYmxlLCB3cml0ZSBpdCB0byBvdXRwdXQgZmlsZSBvciBkZXZpY2UuIFRoaXMKK2NhbiBiZSBkb25lIG9uY2UgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gaXMgdHJ1ZTogXGNvZGUgaWYKKyhvdXRhcmdzLm51bU91dEJ5dGVzPjApIHsKIAotXHNraXBsaW5lIG91dEJ5dGVzPjAKK30KK1xlbmRjb2RlCiAKLUlmIHlvdSB1c2UgZmlsZSBJL08gdGhlbiBmb3IgZXhhbXBsZSBjYWxsIG1wZWdGaWxlV3JpdGVfV3JpdGUoKSBmcm9tIHRoZSBsaWJyYXJ5IGxpYk1wZWdGaWxlV3JpdGUKLQotXGRvbnRpbmNsdWRlIG1haW4uY3BwCi1cc2tpcGxpbmUgbXBlZ0ZpbGVXcml0ZV9Xcml0ZQorSWYgeW91IHVzZSBmaWxlIEkvTyB0aGVuIGZvciBleGFtcGxlIGNhbGwgbXBlZ0ZpbGVXcml0ZV9Xcml0ZSgpIGZyb20gdGhlIGxpYnJhcnkKK2xpYk1wZWdGaWxlV3JpdGUgXGNvZGUgbXBlZ0ZpbGVXcml0ZV9Xcml0ZShoTXBlZ0ZpbGUsIG91dHB1dEJ1ZmZlciwKK291dGFyZ3MubnVtT3V0Qnl0ZXMsIGFhY0VuY29kZXJfR2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19HUkFOVUxFX0xFTkdUSCkpOworXGVuZGNvZGUKIAogXHNlY3Rpb24gY2ZnTWV0YURhdGEgTWV0YSBEYXRhIENvbmZpZ3VyYXRpb24KIAotSWYgdGhlIHByZXNlbnQgbGlicmFyeSBpcyBjb25maWd1cmVkIHdpdGggTWV0YWRhdGEgc3VwcG9ydCwgaXQgaXMgcG9zc2libGUgdG8gaW5zZXJ0IG1ldGEgZGF0YSBzaWRlIGluZm8gaW50byB0aGUgZ2VuZXJhdGVkCi1hdWRpbyBiaXRzdHJlYW0gd2hpbGUgZW5jb2RpbmcuCitJZiB0aGUgcHJlc2VudCBsaWJyYXJ5IGlzIGNvbmZpZ3VyZWQgd2l0aCBNZXRhZGF0YSBzdXBwb3J0LCBpdCBpcyBwb3NzaWJsZSB0bworaW5zZXJ0IG1ldGEgZGF0YSBzaWRlIGluZm8gaW50byB0aGUgZ2VuZXJhdGVkIGF1ZGlvIGJpdHN0cmVhbSB3aGlsZSBlbmNvZGluZy4KIAotVG8gd29yayB3aXRoIG1ldGEgZGF0YSB0aGUgZW5jb2RlciBpbnN0YW5jZSBoYXMgdG8gYmUgXHJlZiBlbmNPcGVuICJhbGxvY2F0ZWQiIHdpdGggbWV0YSBkYXRhIHN1cHBvcnQuIFRoZSBtZXRhIGRhdGEgbW9kZSBtdXN0IGJlIGJlIGNvbmZpZ3VyZWQgd2l0aAotdGhlIDo6QUFDRU5DX01FVEFEQVRBX01PREUgcGFyYW1ldGVyIGFuZCBhYWNFbmNvZGVyX1NldFBhcmFtKCkgZnVuY3Rpb24uCi1cY29kZSBhYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBBQUNFTkNfTUVUQURBVEFfTU9ERSwgMC0yKTsgXGVuZGNvZGUKK1RvIHdvcmsgd2l0aCBtZXRhIGRhdGEgdGhlIGVuY29kZXIgaW5zdGFuY2UgaGFzIHRvIGJlIFxyZWYgZW5jT3BlbiAiYWxsb2NhdGVkIgord2l0aCBtZXRhIGRhdGEgc3VwcG9ydC4gVGhlIG1ldGEgZGF0YSBtb2RlIG11c3QgYmUgYmUgY29uZmlndXJlZCB3aXRoIHRoZQorOjpBQUNFTkNfTUVUQURBVEFfTU9ERSBwYXJhbWV0ZXIgYW5kIGFhY0VuY29kZXJfU2V0UGFyYW0oKSBmdW5jdGlvbi4gXGNvZGUKK2FhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19NRVRBREFUQV9NT0RFLCAwLTMpOyBcZW5kY29kZQogCi1UaGlzIGNvbmZpZ3VyYXRpb24gaW5kaWNhdGVzIGhvdyB0byBlbWJlZCBtZXRhIGRhdGEgaW50byBiaXRzdHJlbS4gRWl0aGVyIG5vIGluc2VydGlvbiwgTVBFRyBvciBFVFNJIHN0eWxlLgotVGhlIG1ldGEgZGF0YSBpdHNlbGYgbXVzdCBiZSBzcGVjaWZpZWQgd2l0aGluIHRoZSBtZXRhIGRhdGEgc2V0dXAgc3RydWN0dXJlIEFBQ0VOQ19NZXRhRGF0YS4KK1RoaXMgY29uZmlndXJhdGlvbiBpbmRpY2F0ZXMgaG93IHRvIGVtYmVkIG1ldGEgZGF0YSBpbnRvIGJpdHN0cmVtLiBFaXRoZXIgbm8KK2luc2VydGlvbiwgTVBFRyBvciBFVFNJIHN0eWxlLiBUaGUgbWV0YSBkYXRhIGl0c2VsZiBtdXN0IGJlIHNwZWNpZmllZCB3aXRoaW4gdGhlCittZXRhIGRhdGEgc2V0dXAgc3RydWN0dXJlIEFBQ0VOQ19NZXRhRGF0YS4KIAotQ2hhbmdpbmcgb25lIG9mIHRoZSBBQUNFTkNfTWV0YURhdGEgc2V0dXAgcGFyYW1ldGVycyBjYW4gYmUgYWNoaWV2ZWQgZnJvbSBvdXRzaWRlIHRoZSBsaWJyYXJ5IHdpdGhpbiA6OklOX01FVEFEQVRBX1NFVFVQIGlucHV0Ci1idWZmZXIuIFRoZXJlIGlzIG5vIG5lZWQgdG8gc3VwcGx5IG1ldGEgZGF0YSBzZXR1cCBzdHJ1Y3R1cmUgZXZlcnkgZnJhbWUuIElmIHRoZXJlIGlzIG5vIG5ldyBtZXRhIHNldHVwIGRhdGEgYXZhaWxhYmxlLCB0aGUKLWVuY29kZXIgdXNlcyB0aGUgcHJldmlvdXMgc2V0dXAgb3IgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpbiBpbml0aWFsIHN0YXRlLgorQ2hhbmdpbmcgb25lIG9mIHRoZSBBQUNFTkNfTWV0YURhdGEgc2V0dXAgcGFyYW1ldGVycyBjYW4gYmUgYWNoaWV2ZWQgZnJvbQorb3V0c2lkZSB0aGUgbGlicmFyeSB3aXRoaW4gOjpJTl9NRVRBREFUQV9TRVRVUCBpbnB1dCBidWZmZXIuIFRoZXJlIGlzIG5vIG5lZWQgdG8KK3N1cHBseSBtZXRhIGRhdGEgc2V0dXAgc3RydWN0dXJlIGV2ZXJ5IGZyYW1lLiBJZiB0aGVyZSBpcyBubyBuZXcgbWV0YSBzZXR1cCBkYXRhCithdmFpbGFibGUsIHRoZSBlbmNvZGVyIHVzZXMgdGhlIHByZXZpb3VzIHNldHVwIG9yIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaW4KK2luaXRpYWwgc3RhdGUuCiAKLUluIGdlbmVyYWwgdGhlIGF1ZGlvIGNvbXByZXNzb3IgYW5kIGxpbWl0ZXIgd2l0aGluIHRoZSBlbmNvZGVyIGxpYnJhcnkgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgOjpBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEUgcGFyYW1ldGVyCitJbiBnZW5lcmFsIHRoZSBhdWRpbyBjb21wcmVzc29yIGFuZCBsaW1pdGVyIHdpdGhpbiB0aGUgZW5jb2RlciBsaWJyYXJ5IGNhbiBiZQorY29uZmlndXJlZCB3aXRoIHRoZSA6OkFBQ0VOQ19NRVRBREFUQV9EUkNfUFJPRklMRSBwYXJhbWV0ZXIKIEFBQ0VOQ19NZXRhRGF0YTo6ZHJjX3Byb2ZpbGUgYW5kIGFuZCBBQUNFTkNfTWV0YURhdGE6OmNvbXBfcHJvZmlsZS4KIFxuCiAKIFxzZWN0aW9uIGVuY1JlY29uZiBFbmNvZGVyIFJlY29uZmlndXJhdGlvbgogCi1UaGUgZW5jb2RlciBsaWJyYXJ5IGFsbG93cyByZWNvbmZpZ3VyYXRpb24gb2YgdGhlIGVuY29kZXIgaW5zdGFuY2Ugd2l0aCBuZXcgc2V0dGluZ3MKLWNvbnRpbnVvdXNseSBiZXR3ZWVuIGVuY29kaW5nIGZyYW1lcy4gRWFjaCBwYXJhbWV0ZXIgdG8gYmUgY2hhbmdlZCBtdXN0IGJlIHNldCB3aXRoCi1hIHNpbmdsZSBhYWNFbmNvZGVyX1NldFBhcmFtKCkgY2FsbC4gVGhlIGludGVybmFsIHN0YXR1cyBvZiBlYWNoIHBhcmFtZXRlciBjYW4gYmUKLXJldHJpZXZlZCB3aXRoIGFuIGFhY0VuY29kZXJfR2V0UGFyYW0oKSBjYWxsLlxuCi1UaGVyZSBpcyBubyBzdGFuZC1hbG9uZSByZWNvbmZpZ3VyYXRpb24gZnVuY3Rpb24gYXZhaWxhYmxlLiBXaGVuIHBhcmFtZXRlcnMgd2VyZQotbW9kaWZpZWQgZnJvbSBvdXRzaWRlIHRoZSBsaWJyYXJ5LCBhbiBpbnRlcm5hbCBjb250cm9sIG1lY2hhbmlzbSB0cmlnZ2VycyB0aGUgbmVjZXNzYXJ5CitUaGUgZW5jb2RlciBsaWJyYXJ5IGFsbG93cyByZWNvbmZpZ3VyYXRpb24gb2YgdGhlIGVuY29kZXIgaW5zdGFuY2Ugd2l0aCBuZXcKK3NldHRpbmdzIGNvbnRpbnVvdXNseSBiZXR3ZWVuIGVuY29kaW5nIGZyYW1lcy4gRWFjaCBwYXJhbWV0ZXIgdG8gYmUgY2hhbmdlZCBtdXN0CitiZSBzZXQgd2l0aCBhIHNpbmdsZSBhYWNFbmNvZGVyX1NldFBhcmFtKCkgY2FsbC4gVGhlIGludGVybmFsIHN0YXR1cyBvZiBlYWNoCitwYXJhbWV0ZXIgY2FuIGJlIHJldHJpZXZlZCB3aXRoIGFuIGFhY0VuY29kZXJfR2V0UGFyYW0oKSBjYWxsLlxuIFRoZXJlIGlzIG5vCitzdGFuZC1hbG9uZSByZWNvbmZpZ3VyYXRpb24gZnVuY3Rpb24gYXZhaWxhYmxlLiBXaGVuIHBhcmFtZXRlcnMgd2VyZSBtb2RpZmllZAorZnJvbSBvdXRzaWRlIHRoZSBsaWJyYXJ5LCBhbiBpbnRlcm5hbCBjb250cm9sIG1lY2hhbmlzbSB0cmlnZ2VycyB0aGUgbmVjZXNzYXJ5CiByZWNvbmZpZ3VyYXRpb24gcHJvY2VzcyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZm9sbG93aW5nCi1hYWNFbmNFbmNvZGUoKSBjYWxsLiBUaGlzIHN0YXRlIGNhbiBiZSBvYnNlcnZlZCBmcm9tIGV4dGVybmFsIHZpYSB0aGUgQUFDRU5DX0lOSVRfU1RBVFVTCi1hbmQgYWFjRW5jb2Rlcl9HZXRQYXJhbSgpIGZ1bmN0aW9uLiBUaGUgcmVjb25maWd1cmF0aW9uIHByb2Nlc3MgY2FuIGFsc28gYmUgYXBwbGllZAotaW1tZWRpYXRlbHkgd2hlbiBhbGwgcGFyYW1ldGVycyBvZiBhbiBhYWNFbmNFbmNvZGUoKSBjYWxsIGFyZSBOVUxMIHdpdGggYSB2YWxpZCBlbmNvZGVyCi1oYW5kbGUuXG5cbgotVGhlIGludGVybmFsIHJlY29uZmlndXJhdGlvbiBwcm9jZXNzIGNhbiBiZSBjb250cm9sbGVkIGZyb20gZXh0ZXJuIHdpdGggdGhlIGZvbGxvd2luZyBhY2Nlc3MuCi1cY29kZSBhYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBBQUNFTkNfQ09OVFJPTF9TVEFURSwgQUFDRU5DX0NUUkxGTEFHUyk7IFxlbmRjb2RlCithYWNFbmNFbmNvZGUoKSBjYWxsLiBUaGlzIHN0YXRlIGNhbiBiZSBvYnNlcnZlZCBmcm9tIGV4dGVybmFsIHZpYSB0aGUKK0FBQ0VOQ19JTklUX1NUQVRVUyBhbmQgYWFjRW5jb2Rlcl9HZXRQYXJhbSgpIGZ1bmN0aW9uLiBUaGUgcmVjb25maWd1cmF0aW9uCitwcm9jZXNzIGNhbiBhbHNvIGJlIGFwcGxpZWQgaW1tZWRpYXRlbHkgd2hlbiBhbGwgcGFyYW1ldGVycyBvZiBhbiBhYWNFbmNFbmNvZGUoKQorY2FsbCBhcmUgTlVMTCB3aXRoIGEgdmFsaWQgZW5jb2RlciBoYW5kbGUuXG5cbiBUaGUgaW50ZXJuYWwgcmVjb25maWd1cmF0aW9uCitwcm9jZXNzIGNhbiBiZSBjb250cm9sbGVkIGZyb20gZXh0ZXJuIHdpdGggdGhlIGZvbGxvd2luZyBhY2Nlc3MuIFxjb2RlCithYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBBQUNFTkNfQ09OVFJPTF9TVEFURSwgQUFDRU5DX0NUUkxGTEFHUyk7CitcZW5kY29kZQogCiAKIFxzZWN0aW9uIGVuY1BhcmFtcyBFbmNvZGVyIFBhcmFtZXRyaXphdGlvbgogCi1BbGwgcGFyYW1ldGVyZXMgbGlzdGVkIGluIDo6QUFDRU5DX1BBUkFNIGNhbiBiZSBtb2RpZmllZCB3aXRoaW4gYW4gZW5jb2RlciBpbnN0YW5jZS4KK0FsbCBwYXJhbWV0ZXJlcyBsaXN0ZWQgaW4gOjpBQUNFTkNfUEFSQU0gY2FuIGJlIG1vZGlmaWVkIHdpdGhpbiBhbiBlbmNvZGVyCitpbnN0YW5jZS4KIAogXHN1YnNlY3Rpb24gZW5jTWFuZGF0b3J5IE1hbmRhdG9yeSBFbmNvZGVyIFBhcmFtZXRlcnMKLVRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZSBlbmNvZGVyIGluc3RhbmNlIGlzIGluaXRpYWxpemVkLgotXGNvZGUKLWFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19BT1QsIHZhbHVlKTsKK1RoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZSBlbmNvZGVyIGluc3RhbmNlIGlzCitpbml0aWFsaXplZC4gXGNvZGUgYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0FPVCwgdmFsdWUpOwogYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0JJVFJBVEUsIHZhbHVlKTsKIGFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19TQU1QTEVSQVRFLCB2YWx1ZSk7CiBhYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBBQUNFTkNfQ0hBTk5FTE1PREUsIHZhbHVlKTsKIFxlbmRjb2RlCi1CZXlvbmQgdGhhdCBpcyBhbiBpbnRlcm5hbCBhdXRvIG1vZGUgd2hpY2ggcHJlaW5pdGl6aWFsaXplcyB0aGUgOjpBQUNFTkNfQklUUkFURSBwYXJhbWV0ZXIKLWlmIHRoZSBwYXJhbWV0ZXIgd2FzIG5vdCBzZXQgZnJvbSBleHRlcm4uIFRoZSBiaXRyYXRlIGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBlZmZlY3RpdmUKLWNoYW5uZWxzIGFuZCBzYW1wbGluZyByYXRlIGFuZCBpcyBkZXRlcm1pbmVkIGFzIGZvbGxvd3MuCitCZXlvbmQgdGhhdCBpcyBhbiBpbnRlcm5hbCBhdXRvIG1vZGUgd2hpY2ggcHJlaW5pdGl6aWFsaXplcyB0aGUgOjpBQUNFTkNfQklUUkFURQorcGFyYW1ldGVyIGlmIHRoZSBwYXJhbWV0ZXIgd2FzIG5vdCBzZXQgZnJvbSBleHRlcm4uIFRoZSBiaXRyYXRlIGRlcGVuZHMgb24gdGhlCitudW1iZXIgb2YgZWZmZWN0aXZlIGNoYW5uZWxzIGFuZCBzYW1wbGluZyByYXRlIGFuZCBpcyBkZXRlcm1pbmVkIGFzIGZvbGxvd3MuCiBcY29kZQogQUFDLUxDIChBT1RfQUFDX0xDKTogMS41IGJpdHMgcGVyIHNhbXBsZQogSEUtQUFDIChBT1RfU0JSKTogMC42MjUgYml0cyBwZXIgc2FtcGxlIChkdWFscmF0ZSBzYnIpCkBAIC0zMjMsMTA4ICs0MDUsMjY2IEBACiAKIFxzdWJzZWN0aW9uIGNoYW5uZWxNb2RlIENoYW5uZWwgTW9kZSBDb25maWd1cmF0aW9uCiBUaGUgaW5wdXQgYXVkaW8gZGF0YSBpcyBkZXNjcmliZWQgd2l0aCB0aGUgOjpBQUNFTkNfQ0hBTk5FTE1PREUgcGFyYW1ldGVyIGluIHRoZQotYWFjRW5jb2Rlcl9TZXRQYXJhbSgpIGNhbGwuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgdGhlIGVuY29kZXIgaW5zdGFuY2Ugd2l0aCBhICdudW1iZXIgb2YKLWlucHV0IGNoYW5uZWxzJyBhcmd1bWVudC4gSW5zdGVhZCwgdGhlIGNoYW5uZWxNb2RlIG11c3QgYmUgc2V0IGFzIGZvbGxvd3MuCi1cY29kZSBhYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBBQUNFTkNfQ0hBTk5FTE1PREUsIHZhbHVlKTsgXGVuZGNvZGUKLVRoZSBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIGluIDo6Q0hBTk5FTF9NT0RFIGFuZCBjYW4gYmUgbWFwcGVkIGZyb20gdGhlIG51bWJlciBvZiBpbnB1dCBjaGFubmVscwotaW4gdGhlIGZvbGxvd2luZyB3YXkuCi1cZG9udGluY2x1ZGUgbWFpbi5jcHAKLVxza2lwIENIQU5ORUxfTU9ERSBjaE1vZGUgPSBNT0RFX0lOVkFMSUQ7Ci1cdW50aWwgcmV0dXJuCithYWNFbmNvZGVyX1NldFBhcmFtKCkgY2FsbC4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSB0aGUgZW5jb2RlciBpbnN0YW5jZSB3aXRoCithICdudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMnIGFyZ3VtZW50LiBJbnN0ZWFkLCB0aGUgY2hhbm5lbE1vZGUgbXVzdCBiZSBzZXQgYXMKK2ZvbGxvd3MuIFxjb2RlIGFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19DSEFOTkVMTU9ERSwgdmFsdWUpOworXGVuZGNvZGUgVGhlIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgaW4gOjpDSEFOTkVMX01PREUgYW5kIGNhbiBiZSBtYXBwZWQgZnJvbSB0aGUKK251bWJlciBvZiBpbnB1dCBjaGFubmVscyBpbiB0aGUgZm9sbG93aW5nIHdheS4gXGNvZGUgQ0hBTk5FTF9NT0RFIGNoTW9kZSA9CitNT0RFX0lOVkFMSUQ7CisKK3N3aXRjaCAobkNoYW5uZWxzKSB7CisgIGNhc2UgMTogIGNoTW9kZSA9IE1PREVfMTsgICAgICAgICAgYnJlYWs7CisgIGNhc2UgMjogIGNoTW9kZSA9IE1PREVfMjsgICAgICAgICAgYnJlYWs7CisgIGNhc2UgMzogIGNoTW9kZSA9IE1PREVfMV8yOyAgICAgICAgYnJlYWs7CisgIGNhc2UgNDogIGNoTW9kZSA9IE1PREVfMV8yXzE7ICAgICAgYnJlYWs7CisgIGNhc2UgNTogIGNoTW9kZSA9IE1PREVfMV8yXzI7ICAgICAgYnJlYWs7CisgIGNhc2UgNjogIGNoTW9kZSA9IE1PREVfMV8yXzJfMTsgICAgYnJlYWs7CisgIGNhc2UgNzogIGNoTW9kZSA9IE1PREVfNl8xOyAgICAgICAgYnJlYWs7CisgIGNhc2UgODogIGNoTW9kZSA9IE1PREVfN18xX0JBQ0s7ICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgY2hNb2RlID0gTU9ERV9JTlZBTElEOworfQorcmV0dXJuIGNoTW9kZTsKK1xlbmRjb2RlCisKK1xzdWJzZWN0aW9uIGJpdHJlc2Vydm9pciBCaXRyZXNlcnZvaXIgQ29uZmlndXJhdGlvbgorSW4gQUFDLCB0aGUgZGVmYXVsdCBiaXRyZXNlcnZvaXIgY29uZmlndXJhdGlvbiBkZXBlbmRzIG9uIHRoZSBjaG9zZW4gYml0cmF0ZSBwZXIKK2ZyYW1lIGFuZCB0aGUgbnVtYmVyIG9mIGVmZmVjdGl2ZSBjaGFubmVscy4gVGhlIHNpemUgY2FuIGJlIGRldGVybWluZWQgYXMgYmVsb3cuCitcZlsKK2JpdHJlc2Vydm9pciA9IG5FZmZDaGFubmVscyo2MTQ0IC0gKGJpdHJhdGUqZnJhbWVsZW5ndGgvc2FtcGxlcmF0ZSkKK1xmXQorRHVlIHRvIGF1ZGlvIHF1YWxpdHkgY29uY2VybnMgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGNoYW5nZSB0aGUgYml0cmVzZXJ2b2lyCitzaXplIHRvIGEgbG93ZXIgdmFsdWUgdGhhbiB0aGUgZGVmYXVsdCBzZXR0aW5nISBIb3dldmVyLCBmb3IgbWluaW1pemluZyB0aGUKK2RlbGF5IGZvciBzdHJlYW1pbmcgYXBwbGljYXRpb25zIG9yIGZvciBhY2hpZXZpbmcgYSBjb25zdGFudCBzaXplIG9mIHRoZQorYml0c3RyZWFtIHBhY2thZ2VzIGluIGVhY2ggZnJhbWUsIGl0IG1heSBiZSBuZWNlc3NhcmF5IHRvIGNoYW5nZSB0aGUKK2JpdHJlc2Vydm9pciBzaXplLiBUaGlzIGNhbiBiZSBkb25lIHdpdGggdGhlIDo6QUFDRU5DX1BFQUtfQklUUkFURSBwYXJhbWV0ZXIuCitcY29kZQorYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX1BFQUtfQklUUkFURSwgdmFsdWUpOworXGVuZGNvZGUKK0J5IHNldHRpbmcgOjpBQUNFTkNfQklUUkFURU1PREUgdG8gZml4ZWQgZnJhbWluZywgdGhlIGJpdHJlc2Vydm9pciBpcyBkaXNhYmxlZC4KK0EgZGlzYWJsZWQgYml0cmVzZXJ2b2lyIHJlc3VsdHMgaW4gYSBjb25zdGFudCBzaXplIGZvciBlYWNoIGJpdHN0cmVhbSBwYWNrYWdlLgorUGxlYXNlIG5vdGUgdGhhdCBlc3BlY2lhbGx5IGF0IGxvd2VyIGJpdHJhdGVzIGEgZGlzYWJsZWQgYml0cmVzZXJ2b2lyIGNhbgorZG93bmdyYWRlIHRoZSBhdWRpbyBxdWFsaXR5IGNvbnNpZGVyYWJseSEgVGhlIGRlZmF1bHQgYml0cmVzZXJ2b2lyIGNvbmZpZ3VyYXRpb24KK2NhbiBiZSBhY2hpZXZlZCBhcyBmb2xsb3dzLiBcY29kZSBhYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLAorQUFDRU5DX0JJVFJFU0VSVk9JUiwgLTEpOyBcZW5kY29kZQorCitUbyBhY2hpZXZlIGFjY2VwdGFibGUgYXVkaW8gcXVhbGl0eSB3aXRoIGEgcmVkdWNlZCBiaXRyZXNlcnZvaXIgc2l6ZSBzZXR0aW5nIGF0CitsZWFzdCAxMDAwIGJpdHMgcGVyIGF1ZGlvIGNoYW5uZWwgaXMgcmVjb21tZW5kZWQuIEZvciBhIG11bHRpY2hhbm5lbCBhdWRpbyBmaWxlCit3aXRoIDUuMSBjaGFubmVscyB0aGUgYml0cmVzZXJ2b2lyIHJlZHVjZWQgdG8gNTAwMCBiaXRzIHJlc3VsdHMgaW4gYWNjZXB0YWJsZQorYXVkaW8gcXVhbGl0eS4KKworCitcc3Vic2VjdGlvbiB2YnJtb2RlIFZhcmlhYmxlIEJpdHJhdGUgTW9kZQorVGhlIGVuY29kZXIgcHJvdmlkZXMgdmFyaW91cyBWYXJpYWJsZSBCaXRyYXRlIE1vZGVzIHRoYXQgZGlmZmVyIGluIGF1ZGlvIHF1YWxpdHkKK2FuZCBhdmVyYWdlIG92ZXJhbGwgYml0cmF0ZS4gVGhlIGdpdmVuIHZhbHVlcyBhcmUgYXZlcmFnZXMgb3ZlciB0aW1lLCBkaWZmZXJlbnQKK2VuY29kZXIgc2V0dGluZ3MgYW5kIHN0cm9uZ2x5IGRlcGVuZCBvbiB0aGUgdHlwZSBvZiBhdWRpbyBzaWduYWwuIFRoZSBWQlIKK2NvbmZpZ3VyYXRpb25zIGNhbiBiZSBhZGp1c3RlZCB2aWEgOjpBQUNFTkNfQklUUkFURU1PREUgZW5jb2RlciBwYXJhbWV0ZXIuCitcdmVyYmF0aW0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgVkJSX01PREUgfCBBcHByb3guIEJpdHJhdGUgaW4ga2Jwcy9jaGFubmVsCisgICAgICAgICAgfCAgICAgQUFDLUxDICAgIHwgIEFBQy1MRC9BQ19FTEQKKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tCisgICAgVkJSXzEgfCAgICAzMiAtICA0OCAgIHwgICAgICAzMiAtICA1NgorICAgIFZCUl8yIHwgICAgNDAgLSAgNTYgICB8ICAgICAgNDAgLSAgNjQKKyAgICBWQlJfMyB8ICAgIDQ4IC0gIDY0ICAgfCAgICAgIDQ4IC0gIDcyCisgICAgVkJSXzQgfCAgICA2NCAtICA4MCAgIHwgICAgICA2NCAtICA4OAorICAgIFZCUl81IHwgICAgOTYgLSAxMjAgICB8ICAgICAxMTIgLSAxNDQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitcZW5kdmVyYmF0aW0KK1RoZSBiaXRyYXRlIHJhbmdlcyBhcHBseSBmb3IgaW5kaXZpZHVhbCBhdWRpbyBjaGFubmVscy4gSW4gY2FzZSBvZiBtdWx0aWNoYW5uZWwKK2NvbmZpZ3VyYXRpb25zIHRoZSBhdmVyYWdlIGJpdHJhdGUgbWlnaHQgYmUgZXN0aW1hdGVkIGJ5IG11bHRpcGx5aW5nIHdpdGggdGhlCitudW1iZXIgb2YgZWZmZWN0aXZlIGNoYW5uZWxzLiBUaGlzIGNvcnJlc3BvbmRzIHRvIGFsbCBhdWRpbyBpbnB1dCBjaGFubmVscworZXhjbHVzaXZlbHkgdGhlIGxvdyBmcmVxdWVuY3kgY2hhbm5lbC4gQXQgY29uZmlndXJhdGlvbnMgd2hpY2ggYXJlIG1ha2luZyB1c2Ugb2YKK2Rvd25taXggbW9kdWxlcyB0aGUgQUFDIGNvcmUgY2hhbm5lbHMgcmVzcGVjdGl2ZWx5IGRvd25taXggY2hhbm5lbHMgc2hhbGwgYmUKK2NvbnNpZGVyZWQuIEZvciA6OkFBQ0VOQ19BT1Qgd2hpY2ggYXJlIHVzaW5nIFNCUiwgdGhlIGF2ZXJhZ2UgYml0cmF0ZSBjYW4gYmUKK2VzdGltYXRlZCBieSB1c2luZyB0aGUgcmF0aW8gb2YgMC41IGZvciBkdWFscmF0ZSBTQlIgYW5kIDAuNzUgZm9yIGRvd25zYW1wbGVkCitTQlIgY29uZmlndXJhdGlvbnMuCisKIAogXHN1YnNlY3Rpb24gZW5jUXVhbCBBdWRpbyBRdWFsaXR5IENvbnNpZGVyYXRpb25zCi1UaGUgZGVmYXVsdCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gaXMgc3VnZ2VzdGVkIHRvIGJlIHVzZWQuIEVuY29kZXIgdG9vbHMgc3VjaCBhcyBUTlMgYW5kIFBOUwotYXJlIGFjdGl2YXRlZCBieSBkZWZhdWx0IGFuZCBhcmUgaW50ZXJuYWxseSBjb250cm9sbGVkIChzZWUgXHJlZiBCRUhBVklPVVJfVE9PTFMpLgorVGhlIGRlZmF1bHQgZW5jb2RlciBjb25maWd1cmF0aW9uIGlzIHN1Z2dlc3RlZCB0byBiZSB1c2VkLiBFbmNvZGVyIHRvb2xzIHN1Y2ggYXMKK1ROUyBhbmQgUE5TIGFyZSBhY3RpdmF0ZWQgYnkgZGVmYXVsdCBhbmQgYXJlIGludGVybmFsbHkgY29udHJvbGxlZCAoc2VlIFxyZWYKK0JFSEFWSU9VUl9UT09MUykuCiAKLVRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcXVhbGl0eSBwYXJhbWV0ZXIgY2FsbGVkIDo6QUFDRU5DX0FGVEVSQlVSTkVSLiBJbiB0aGUgZGVmYXVsdAotY29uZmlndXJhdGlvbiB0aGlzIHF1YWxpdHkgc3dpdGNoIGlzIGRlYWN0aXZhdGVkIGJlY2F1c2UgaXQgd291bGQgY2F1c2UgYSB3b3JrbG9hZAotaW5jcmVhc2Ugd2hpY2ggbWlnaHQgYmUgc2lnbmlmaWNhbnQuIElmIHdvcmtsb2FkIGlzIG5vdCBhbiBpc3N1ZSBpbiB0aGUgYXBwbGljYXRpb24KLXdlIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIHRoaXMgZmVhdHVyZS4KLVxjb2RlIGFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19BRlRFUkJVUk5FUiwgMSk7IFxlbmRjb2RlCitUaGVyZSBpcyBhbiBhZGRpdGlvbmFsIHF1YWxpdHkgcGFyYW1ldGVyIGNhbGxlZCA6OkFBQ0VOQ19BRlRFUkJVUk5FUi4gSW4gdGhlCitkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdGhpcyBxdWFsaXR5IHN3aXRjaCBpcyBkZWFjdGl2YXRlZCBiZWNhdXNlIGl0IHdvdWxkIGNhdXNlCithIHdvcmtsb2FkIGluY3JlYXNlIHdoaWNoIG1pZ2h0IGJlIHNpZ25pZmljYW50LiBJZiB3b3JrbG9hZCBpcyBub3QgYW4gaXNzdWUgaW4KK3RoZSBhcHBsaWNhdGlvbiB3ZSByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSB0aGlzIGZlYXR1cmUuIFxjb2RlCithYWNFbmNvZGVyX1NldFBhcmFtKGhBYWNFbmNvZGVyLCBBQUNFTkNfQUZURVJCVVJORVIsIDAvMSk7IFxlbmRjb2RlCiAKIFxzdWJzZWN0aW9uIGVuY0VMRCBFTEQgQXV0byBDb25maWd1cmF0aW9uIE1vZGUKLUZvciBFTEQgY29uZmlndXJhdGlvbiBhIHNvIGNhbGxlZCBhdXRvIGNvbmZpZ3VyYXRvciBpcyBhdmFpbGFibGUgd2hpY2ggY29uZmlndXJlcyBTQlIgYW5kIHRoZSBTQlIgcmF0aW8gYnkgaXRzZWxmLgotVGhlIGNvbmZpZ3VyYXRvciBpcyB1c2VkIHdoZW4gdGhlIGVuY29kZXIgcGFyYW1ldGVyIDo6QUFDRU5DX1NCUl9NT0RFIGFuZCA6OkFBQ0VOQ19TQlJfUkFUSU8gYXJlIG5vdCBzZXQgZXhwbGljaXRlbHkuCitGb3IgRUxEIGNvbmZpZ3VyYXRpb24gYSBzbyBjYWxsZWQgYXV0byBjb25maWd1cmF0b3IgaXMgYXZhaWxhYmxlIHdoaWNoCitjb25maWd1cmVzIFNCUiBhbmQgdGhlIFNCUiByYXRpbyBieSBpdHNlbGYuIFRoZSBjb25maWd1cmF0b3IgaXMgdXNlZCB3aGVuIHRoZQorZW5jb2RlciBwYXJhbWV0ZXIgOjpBQUNFTkNfU0JSX01PREUgYW5kIDo6QUFDRU5DX1NCUl9SQVRJTyBhcmUgbm90IHNldAorZXhwbGljaXRseS4KIAotQmFzZWQgb24gc2FtcGxpbmcgcmF0ZSBhbmQgY2hvc2VuIGJpdHJhdGUgcGVyIGNoYW5uZWwgYSByZWFzb25hYmxlIFNCUiBjb25maWd1cmF0aW9uIHdpbGwgYmUgdXNlZC4KLVx2ZXJiYXRpbQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIFNhbXBsaW5nIFJhdGUgIHwgQ2hhbm5lbCBCaXRyYXRlIHwgIFNCUiB8ICAgICAgIFNCUiBSYXRpbwotLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tCi0gXW1pbiwgMTZdIGtIeiAgIHwgICAgIG1pbiAtIDI3OTk5IHwgICBvbiB8IGRvd25zYW1wbGVkIFNCUgotICAgICAgICAgICAgICAgICB8ICAgMjgwMDAgLSAgIG1heCB8ICBvZmYgfCAgICAgICAgICAgICAtLS0KLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLQotIF0xNiAtIDI0XSBrSHogICB8ICAgICBtaW4gLSAzOTk5OSB8ICAgb24gfCBkb3duc2FtcGxlZCBTQlIKLSAgICAgICAgICAgICAgICAgfCAgIDQwMDAwIC0gICBtYXggfCAgb2ZmIHwgICAgICAgICAgICAgLS0tCi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0KLSBdMjQgLSAzMl0ga0h6ICAgfCAgICAgbWluIC0gMjc5OTkgfCAgIG9uIHwgICAgZHVhbHJhdGUgU0JSCi0gICAgICAgICAgICAgICAgIHwgICAyODAwMCAtIDU1OTk5IHwgICBvbiB8IGRvd25zYW1wbGVkIFNCUgotICAgICAgICAgICAgICAgICB8ICAgNTYwMDAgLSAgIG1heCB8ICBvZmYgfCAgICAgICAgICAgICAtLS0KLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLQotIF0zMiAtIDQ0LjFdIGtIeiB8ICAgICBtaW4gLSA2Mzk5OSB8ICAgb24gfCAgICBkdWFscmF0ZSBTQlIKLSAgICAgICAgICAgICAgICAgfCAgIDY0MDAwIC0gICBtYXggfCAgb2ZmIHwgICAgICAgICAgICAgLS0tCi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0KLSBdNDQuMSAtIDQ4XSBrSHogfCAgICAgbWluIC0gNjM5OTkgfCAgIG9uIHwgICAgZHVhbHJhdGUgU0JSCi0gICAgICAgICAgICAgICAgIHwgICA2NDAwMCAtIG1heCAgIHwgIG9mZiB8ICAgICAgICAgICAgIC0tLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitCYXNlZCBvbiBzYW1wbGluZyByYXRlIGFuZCBjaG9zZW4gYml0cmF0ZSBhIHJlYXNvbmFibGUgU0JSIGNvbmZpZ3VyYXRpb24gd2lsbCBiZQordXNlZC4gXHZlcmJhdGltCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTYW1wbGluZyBSYXRlIHwgICBUb3RhbCBCaXRyYXRlIHwgTm8uIG9mIHwgU0JSIHwgICAgICAgU0JSIFJhdGlvCisgICAgIFtrSHpdICAgICB8ICAgICAgW2JpdC9zXSAgICB8ICBDaGFuICB8ICAgICB8CisgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgICB8ICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgXW1pbiwgMTZbIHwgICAgbWluIC0gICAgbWF4IHwgICAgICAxIHwgb2ZmIHwgICAgICAgICAgICAgLS0tCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICBbMTZdIHwgICAgbWluIC0gIDI3OTk5IHwgICAgICAxIHwgIG9uIHwgZG93bnNhbXBsZWQgU0JSCisgICAgICAgICAgICAgICB8ICAyODAwMCAtICAgIG1heCB8ICAgICAgMSB8IG9mZiB8ICAgICAgICAgICAgIC0tLQorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tCisgICAgIF0xNiAtIDI0XSB8ICAgIG1pbiAtICAzOTk5OSB8ICAgICAgMSB8ICBvbiB8IGRvd25zYW1wbGVkIFNCUgorICAgICAgICAgICAgICAgfCAgNDAwMDAgLSAgICBtYXggfCAgICAgIDEgfCBvZmYgfCAgICAgICAgICAgICAtLS0KKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLQorICAgICBdMjQgLSAzMl0gfCAgICBtaW4gLSAgMjc5OTkgfCAgICAgIDEgfCAgb24gfCAgICBkdWFscmF0ZSBTQlIKKyAgICAgICAgICAgICAgIHwgIDI4MDAwIC0gIDU1OTk5IHwgICAgICAxIHwgIG9uIHwgZG93bnNhbXBsZWQgU0JSCisgICAgICAgICAgICAgICB8ICA1NjAwMCAtICAgIG1heCB8ICAgICAgMSB8IG9mZiB8ICAgICAgICAgICAgIC0tLQorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tCisgICBdMzIgLSA0NC4xXSB8ICAgIG1pbiAtICA2Mzk5OSB8ICAgICAgMSB8ICBvbiB8ICAgIGR1YWxyYXRlIFNCUgorICAgICAgICAgICAgICAgfCAgNjQwMDAgLSAgICBtYXggfCAgICAgIDEgfCBvZmYgfCAgICAgICAgICAgICAtLS0KKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLQorICAgXTQ0LjEgLSA0OF0gfCAgICBtaW4gLSAgNjM5OTkgfCAgICAgIDEgfCAgb24gfCAgICBkdWFscmF0ZSBTQlIKKyAgICAgICAgICAgICAgIHwgIDY0MDAwIC0gIG1heCAgIHwgICAgICAxIHwgb2ZmIHwgICAgICAgICAgICAgLS0tCisgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgICB8ICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgXW1pbiwgMTZbIHwgICAgbWluIC0gICAgbWF4IHwgICAgICAyIHwgb2ZmIHwgICAgICAgICAgICAgLS0tCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICBbMTZdIHwgICAgbWluIC0gIDMxOTk5IHwgICAgICAyIHwgIG9uIHwgZG93bnNhbXBsZWQgU0JSCisgICAgICAgICAgICAgICB8ICAzMjAwMCAtICA2Mzk5OSB8ICAgICAgMiB8ICBvbiB8IGRvd25zYW1wbGVkIFNCUgorICAgICAgICAgICAgICAgfCAgNjQwMDAgLSAgICBtYXggfCAgICAgIDIgfCBvZmYgfCAgICAgICAgICAgICAtLS0KKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLQorICAgICBdMTYgLSAyNF0gfCAgICBtaW4gLSAgNDc5OTkgfCAgICAgIDIgfCAgb24gfCBkb3duc2FtcGxlZCBTQlIKKyAgICAgICAgICAgICAgIHwgIDQ4MDAwIC0gIDc5OTk5IHwgICAgICAyIHwgIG9uIHwgZG93bnNhbXBsZWQgU0JSCisgICAgICAgICAgICAgICB8ICA4MDAwMCAtICAgIG1heCB8ICAgICAgMiB8IG9mZiB8ICAgICAgICAgICAgIC0tLQorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tCisgICAgIF0yNCAtIDMyXSB8ICAgIG1pbiAtICAzMTk5OSB8ICAgICAgMiB8ICBvbiB8ICAgIGR1YWxyYXRlIFNCUgorICAgICAgICAgICAgICAgfCAgMzIwMDAgLSAgNjc5OTkgfCAgICAgIDIgfCAgb24gfCAgICBkdWFscmF0ZSBTQlIKKyAgICAgICAgICAgICAgIHwgIDY4MDAwIC0gIDk1OTk5IHwgICAgICAyIHwgIG9uIHwgZG93bnNhbXBsZWQgU0JSCisgICAgICAgICAgICAgICB8ICA5NjAwMCAtICAgIG1heCB8ICAgICAgMiB8IG9mZiB8ICAgICAgICAgICAgIC0tLQorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tCisgICBdMzIgLSA0NC4xXSB8ICAgIG1pbiAtICA0Mzk5OSB8ICAgICAgMiB8ICBvbiB8ICAgIGR1YWxyYXRlIFNCUgorICAgICAgICAgICAgICAgfCAgNDQwMDAgLSAxMjc5OTkgfCAgICAgIDIgfCAgb24gfCAgICBkdWFscmF0ZSBTQlIKKyAgICAgICAgICAgICAgIHwgMTI4MDAwIC0gICAgbWF4IHwgICAgICAyIHwgb2ZmIHwgICAgICAgICAgICAgLS0tCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0KKyAgIF00NC4xIC0gNDhdIHwgICAgbWluIC0gIDQzOTk5IHwgICAgICAyIHwgIG9uIHwgICAgZHVhbHJhdGUgU0JSCisgICAgICAgICAgICAgICB8ICA0NDAwMCAtIDEyNzk5OSB8ICAgICAgMiB8ICBvbiB8ICAgIGR1YWxyYXRlIFNCUgorICAgICAgICAgICAgICAgfCAxMjgwMDAgLSAgbWF4ICAgfCAgICAgIDIgfCBvZmYgfCAgICAgICAgICAgICAtLS0KKyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogXGVuZHZlcmJhdGltCiAKK1xzdWJzZWN0aW9uIGVuY0RzRUxEIFJlZHVjZWQgRGVsYXkgKERvd25zY2FsZWQpIE1vZGUKK1RoZSBkb3duc2NhbGVkIG1vZGUgb2YgQUFDLUVMRCByZWR1Y2VzIHRoZSBhbGdvcml0aG1pYyBkZWxheSBvZiBBQUMtRUxEIGJ5Cit2aXJ0dWFsbHkgaW5jcmVhc2luZyB0aGUgc2FtcGxpbmcgcmF0ZS4gV2hlbiB1c2luZyB0aGUgZG93bnNjYWxlZCBtb2RlLCB0aGUKK2JpdHJhdGUgc2hvdWxkIGJlIGluY3JlYXNlZCBmb3Iga2VlcGluZyB0aGUgc2FtZSBhdWRpbyBxdWFsaXR5IGxldmVsLiBGb3IgY29tbW9uCitzaWduYWxzLCB0aGUgYml0cmF0ZSBzaG91bGQgYmUgaW5jcmVhc2VkIGJ5IDI1JSBmb3IgYSBkb3duc2NhbGUgZmFjdG9yIG9mIDIuCisKK0N1cnJlbnRseSwgZG93bnNjYWxpbmcgZmFjdG9ycyAyIGFuZCA0IGFyZSBzdXBwb3J0ZWQuCitUbyBlbmFibGUgdGhlIGRvd25zY2FsZWQgbW9kZSBpbiB0aGUgZW5jb2RlciwgdGhlIGZyYW1lbGVuZ3RoIHBhcmFtZXRlcgorQUFDRU5DX0dSQU5VTEVfTEVOR1RIIG11c3QgYmUgc2V0IGFjY29yZGluZ2x5IHRvIDI1NiBvciAyNDAgZm9yIGEgZG93bnNjYWxlCitmYWN0b3Igb2YgMiBvciAxMjggb3IgMTIwIGZvciBhIGRvd25zY2FsZSBmYWN0b3Igb2YgNC4gVGhlIGRlZmF1bHQgdmFsdWVzIG9mIDUxMgorb3IgNDgwIG1lYW4gdGhhdCBubyBkb3duc2NhbGluZyBpcyBhcHBsaWVkLiBcY29kZQorYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0dSQU5VTEVfTEVOR1RILCAyNTYpOworYWFjRW5jb2Rlcl9TZXRQYXJhbShoQWFjRW5jb2RlciwgQUFDRU5DX0dSQU5VTEVfTEVOR1RILCAxMjgpOworXGVuZGNvZGUKKworRG93bnNjYWxlZCBiaXRzdHJlYW1zIGFyZSBmdWxseSBiYWNrd2FyZHMgY29tcGF0aWJsZS4gSG93ZXZlciwgdGhlIGxlZ2FjeQorZGVjb2RlciBuZWVkcyB0byBzdXBwb3J0IGhpZ2ggc2FtcGxlIHJhdGUsIGUuZy4gOTZrSHouIFRoZSBzaWduYWxlZCBzYW1wbGluZworcmF0ZSBpcyBtdWx0aXBsaWVkIGJ5IHRoZSBkb3duc2NhbGUgZmFjdG9yLiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIGRvd25zY2FsaW5nCitzaG91bGQgYmUgYXBwbGllZCB3aGVuIGRlY29kaW5nIGRvd25zY2FsZWQgYml0c3RyZWFtcy4gSXQgcmVkdWNlcyBDUFUgd29ya2xvYWQKK2FuZCB0aGUgb3V0cHV0IHdpbGwgaGF2ZSB0aGUgc2FtZSBzYW1wbGluZyByYXRlIGFzIHRoZSBpbnB1dC4gSW4gYW4gaWRlYWwKK2NvbmZpZ3VyYXRpb24gYm90aCBlbmNvZGVyIGFuZCBkZWNvZGVyIHNob3VsZCBydW4gd2l0aCB0aGUgc2FtZSBkb3duc2NhbGUKK2ZhY3Rvci4KKworVGhlIGZvbGxvd2luZyB0YWJsZSBzaG93cyBhcHByb3hpbWF0ZSBmaWx0ZXIgYmFuayBkZWxheXMgaW4gbXMgZm9yIGNvbW1vbgorc2FtcGxpbmcgcmF0ZXMoc3IpIGF0IGZyYW1lc2l6ZShmcyksIGFuZCBkb3duc2NhbGUgZmFjdG9yKGRzZiksIGJhc2VkIG9uIHRoaXMKK2Zvcm11bGE6IFxmWyAxMDAwICogZnMgLyAoZHNmICogc3IpIFxmXQorCitcdmVyYmF0aW0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICB8IDUxMi8yIHwgNTEyLzQgfCA0ODAvMiB8IDQ4MC80CistLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLQorMjIwNTAgfCAxNy40MSB8ICA4LjcxIHwgMTYuMzMgfCAgOC4xNgorMzIwMDAgfCAxMi4wMCB8ICA2LjAwIHwgMTEuMjUgfCAgNS42MgorNDQxMDAgfCAgOC43MSB8ICA0LjM1IHwgIDguMTYgfCAgNC4wOAorNDgwMDAgfCAgOC4wMCB8ICA0LjAwIHwgIDcuNTAgfCAgMy43NQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1xlbmR2ZXJiYXRpbQogCiBcc2VjdGlvbiBhdWRpb2NoQ2ZnIEF1ZGlvIENoYW5uZWwgQ29uZmlndXJhdGlvbgotVGhlIE1QRUcgc3RhbmRhcmQgcmVmZXJzIG9mdGVuIHRvIHRoZSBzby1jYWxsZWQgQ2hhbm5lbCBDb25maWd1cmF0aW9uLiBUaGlzIENoYW5uZWwgQ29uZmlndXJhdGlvbiBpcyB1c2VkIGZvciBhIGZpeGVkIENoYW5uZWwKLU1hcHBpbmcuIFRoZSBjb25maWd1cmF0aW9ucyAxLTcgYXJlIHByZWRlZmluZWQgaW4gTVBFRyBzdGFuZGFyZCBhbmQgdXNlZCBmb3IgaW1wbGljaXQgc2lnbmFsbGluZyB3aXRoaW4gdGhlIGVuY29kZWQgYml0c3RyZWFtLgotRm9yIHVzZXIgZGVmaW5lZCBDb25maWd1cmF0aW9ucyB0aGUgQ2hhbm5lbCBDb25maWd1cmF0aW9uIGlzIHNldCB0byAwIGFuZCB0aGUgQ2hhbm5lbCBNYXBwaW5nIG11c3QgYmUgZXhwbGVjaXRseSBkZXNjcmliZWQgd2l0aCBhbiBhcHByb3ByaWF0ZQotUHJvZ3JhbSBDb25maWcgRWxlbWVudC4gVGhlIHByZXNlbnQgRW5jb2RlciBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBhbGxvdyB0aGUgdXNlciB0byBjb25maWd1cmUgdGhpcyBDaGFubmVsIENvbmZpZ3VyYXRpb24gZnJvbQotZXh0ZXJuLiBUaGUgRW5jb2RlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBmaXhlZCBDaGFubmVsIE1vZGVzIHdoaWNoIGFyZSBtYXBwZWQgdG8gQ2hhbm5lbCBDb25maWd1cmF0aW9uIGFzIGZvbGxvdy4KLVx2ZXJiYXRpbQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIENoYW5uZWxNb2RlICAgICAgICAgICB8IENoQ2ZnICB8IGZyb250X0VsICAgICAgfCBzaWRlX0VsICB8IGJhY2tfRWwgIHwgbGZlX0VsCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tCi1NT0RFXzEgICAgICAgICAgICAgICAgIHwgICAgICAxIHwgU0NFICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfAotTU9ERV8yICAgICAgICAgICAgICAgICB8ICAgICAgMiB8IENQRSAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKLU1PREVfMV8yICAgICAgICAgICAgICAgfCAgICAgIDMgfCBTQ0UsIENQRSAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8Ci1NT0RFXzFfMl8xICAgICAgICAgICAgIHwgICAgICA0IHwgU0NFLCBDUEUgICAgICB8ICAgICAgICAgIHwgU0NFICAgICAgfAotTU9ERV8xXzJfMiAgICAgICAgICAgICB8ICAgICAgNSB8IFNDRSwgQ1BFICAgICAgfCAgICAgICAgICB8IENQRSAgICAgIHwKLU1PREVfMV8yXzJfMSAgICAgICAgICAgfCAgICAgIDYgfCBTQ0UsIENQRSAgICAgIHwgICAgICAgICAgfCBDUEUgICAgICB8IExGRQotTU9ERV8xXzJfMl8yXzEgICAgICAgICB8ICAgICAgNyB8IFNDRSwgQ1BFLCBDUEUgfCAgICAgICAgICB8IENQRSAgICAgIHwgTEZFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tCi1NT0RFXzdfMV9SRUFSX1NVUlJPVU5EIHwgICAgICAwIHwgU0NFLCBDUEUgICAgICB8ICAgICAgICAgIHwgQ1BFLCBDUEUgfCBMRkUKLU1PREVfN18xX0ZST05UX0NFTlRFUiAgfCAgICAgIDAgfCBTQ0UsIENQRSwgQ1BFIHwgICAgICAgICAgfCBDUEUgICAgICB8IExGRQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIC0gU0NFOiBTaW5nbGUgQ2hhbm5lbCBFbGVtZW50LgotIC0gQ1BFOiBDaGFubmVsIFBhaXIuCi0gLSBTQ0U6IExvdyBGcmVxdWVuY3kgRWxlbWVudC4KLVxlbmR2ZXJiYXRpbQorVGhlIE1QRUcgc3RhbmRhcmQgcmVmZXJzIG9mdGVuIHRvIHRoZSBzby1jYWxsZWQgQ2hhbm5lbCBDb25maWd1cmF0aW9uLiBUaGlzCitDaGFubmVsIENvbmZpZ3VyYXRpb24gaXMgdXNlZCBmb3IgYSBmaXhlZCBDaGFubmVsIE1hcHBpbmcuIFRoZSBjb25maWd1cmF0aW9ucworMS03IGFuZCAxMSwxMiwxNCBhcmUgcHJlZGVmaW5lZCBpbiBNUEVHIHN0YW5kYXJkIGFuZCB1c2VkIGZvciBpbXBsaWNpdAorc2lnbmFsbGluZyB3aXRoaW4gdGhlIGVuY29kZWQgYml0c3RyZWFtLiBGb3IgdXNlciBkZWZpbmVkIENvbmZpZ3VyYXRpb25zIHRoZQorQ2hhbm5lbCBDb25maWd1cmF0aW9uIGlzIHNldCB0byAwIGFuZCB0aGUgQ2hhbm5lbCBNYXBwaW5nIG11c3QgYmUgZXhwbGVjaXRseQorZGVzY3JpYmVkIHdpdGggYW4gYXBwcm9wcmlhdGUgUHJvZ3JhbSBDb25maWcgRWxlbWVudC4gVGhlIHByZXNlbnQgRW5jb2RlcgoraW1wbGVtZW50YXRpb24gZG9lcyBub3QgYWxsb3cgdGhlIHVzZXIgdG8gY29uZmlndXJlIHRoaXMgQ2hhbm5lbCBDb25maWd1cmF0aW9uCitmcm9tIGV4dGVybi4gVGhlIEVuY29kZXIgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgZml4ZWQgQ2hhbm5lbCBNb2RlcyB3aGljaCBhcmUKK21hcHBlZCB0byBDaGFubmVsIENvbmZpZ3VyYXRpb24gYXMgZm9sbG93LiBcdmVyYmF0aW0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDaGFubmVsTW9kZSAgICAgICAgICAgfCBDaENmZyB8IEhlaWdodCB8IGZyb250X0VsICAgICAgfCBzaWRlX0VsICB8IGJhY2tfRWwgIHwKK2xmZV9FbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLQorTU9ERV8xICAgICAgICAgICAgICAgICB8ICAgICAxIHwgTk9STSAgIHwgU0NFICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfAorTU9ERV8yICAgICAgICAgICAgICAgICB8ICAgICAyIHwgTk9STSAgIHwgQ1BFICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfAorTU9ERV8xXzIgICAgICAgICAgICAgICB8ICAgICAzIHwgTk9STSAgIHwgU0NFLCBDUEUgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfAorTU9ERV8xXzJfMSAgICAgICAgICAgICB8ICAgICA0IHwgTk9STSAgIHwgU0NFLCBDUEUgICAgICB8ICAgICAgICAgIHwgU0NFICAgICAgfAorTU9ERV8xXzJfMiAgICAgICAgICAgICB8ICAgICA1IHwgTk9STSAgIHwgU0NFLCBDUEUgICAgICB8ICAgICAgICAgIHwgQ1BFICAgICAgfAorTU9ERV8xXzJfMl8xICAgICAgICAgICB8ICAgICA2IHwgTk9STSAgIHwgU0NFLCBDUEUgICAgICB8ICAgICAgICAgIHwgQ1BFICAgICAgfAorTEZFIE1PREVfMV8yXzJfMl8xICAgICAgICAgfCAgICAgNyB8IE5PUk0gICB8IFNDRSwgQ1BFLCBDUEUgfCAgICAgICAgICB8IENQRQorfCBMRkUgTU9ERV82XzEgICAgICAgICAgICAgICB8ICAgIDExIHwgTk9STSAgIHwgU0NFLCBDUEUgICAgICB8ICAgICAgICAgIHwgQ1BFLAorU0NFIHwgTEZFIE1PREVfN18xX0JBQ0sgICAgICAgICAgfCAgICAxMiB8IE5PUk0gICB8IFNDRSwgQ1BFICAgICAgfCAgICAgICAgICB8CitDUEUsIENQRSB8IExGRQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLQorTU9ERV83XzFfVE9QX0ZST05UICAgICB8ICAgIDE0IHwgTk9STSAgIHwgU0NFLCBDUEUgICAgICB8ICAgICAgICAgIHwgQ1BFICAgICAgfAorTEZFIHwgICAgICAgfCBUT1AgICAgfCBDUEUgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tCitNT0RFXzdfMV9SRUFSX1NVUlJPVU5EIHwgICAgIDAgfCBOT1JNICAgfCBTQ0UsIENQRSAgICAgIHwgICAgICAgICAgfCBDUEUsIENQRSB8CitMRkUgTU9ERV83XzFfRlJPTlRfQ0VOVEVSICB8ICAgICAwIHwgTk9STSAgIHwgU0NFLCBDUEUsIENQRSB8ICAgICAgICAgIHwgQ1BFCit8IExGRQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLSBOT1JNOiBOb3JtYWwgSGVpZ2h0IExheWVyLiAgICAgLSBUT1A6IFRvcCBIZWlnaHQgTGF5ZXIuICAtIEJUTTogQm90dG9tIEhlaWdodAorTGF5ZXIuCistIFNDRTogU2luZ2xlIENoYW5uZWwgRWxlbWVudC4gICAtIENQRTogQ2hhbm5lbCBQYWlyLiAgICAgIC0gTEZFOiBMb3cgRnJlcXVlbmN5CitFbGVtZW50LiBcZW5kdmVyYmF0aW0KIAotTW9yZW92ZXIsIHRoZSBUYWJsZSBkZXNjcmliZXMgYWxsIGZpeGVkIENoYW5uZWwgRWxlbWVudHMgZm9yIGVhY2ggQ2hhbm5lbCBNb2RlIHdoaWNoIGFyZSBhc3NpZ25lZCB0byBhIHNwZWFrZXIgYXJyYW5nZW1lbnQuIFRoZQotYXJyYW5nZW1lbnQgaW5jbHVkZXMgZnJvbnQsIHNpZGUsIGJhY2sgYW5kIGxmZSBBdWRpbyBDaGFubmVsIEVsZW1lbnRzLlxuCi1UaGlzIG1hcHBpbmcgb2YgQXVkaW8gQ2hhbm5lbCBFbGVtZW50cyBpcyBkZWZpbmVkIGluIE1QRUcgc3RhbmRhcmQgZm9yIENoYW5uZWwgQ29uZmlnIDEtNy4gVGhlIENoYW5uZWwgYXNzaWdubWVudCBmb3IgTU9ERV8xXzEsCi1NT0RFXzJfMiBhbmQgTU9ERV8yXzEgaXMgdXNlZCBmcm9tIHRoZSBBUklCIHN0YW5kYXJkLiBBbGwgb3RoZXIgY29uZmlndXJhdGlvbnMgYXJlIGRlZmluZWQgYXMgc3VnZ2VzdGVkIGluIE1QRUcuXG4KLUluIGNhc2Ugb2YgQ2hhbm5lbCBDb25maWcgMCBvciB3cml0aW5nIG1hdHJpeCBtaXhkb3duIGNvZWZmaWNpZW50cywgdGhlIGVuY29kZXIgZW5hYmxlcyB0aGUgd3JpdGluZyBvZiBQcm9ncmFtIENvbmZpZyBFbGVtZW50Ci1pdHNlbGYgYXMgZGVzY3JpYmVkIGluIFxyZWYgZW5jUENFLiBUaGUgY29uZmlndXJhdGlvbiB1c2VkIGluIFByb2dyYW0gQ29uZmlnIEVsZW1lbnQgcmVmZXJzIHRvIHRoZSBkZW5vdGVkIFRhYmxlLlxuCi1CZXNpZGUgdGhlIENoYW5uZWwgRWxlbWVudCBhc3NpZ25tZW50IHRoZSBDaGFubmVsIE1vZGVzIGFyZSByZXNwb3NpYmxlIGZvciBhdWRpbyBpbnB1dCBkYXRhIGNoYW5uZWwgbWFwcGluZy4gVGhlIENoYW5uZWwgTWFwcGluZwotb2YgdGhlIGF1ZGlvIGRhdGEgZGVwZW5kcyBvbiB0aGUgc2VsZWN0ZWQgOjpBQUNFTkNfQ0hBTk5FTE9SREVSIHdoaWNoIGNhbiBiZSBNUEVHIG9yIFdBViBsaWtlIG9yZGVyLlxuCi1Gb2xsb3dpbmcgVGFibGUgZGVzY3JpYmVzIHRoZSBjb21wbGV0ZSBjaGFubmVsIG1hcHBpbmcgZm9yIGJvdGggQ2hhbm5lbCBPcmRlciBjb25maWd1cmF0aW9ucy4KK1RoZSBUYWJsZSBkZXNjcmliZXMgYWxsIGZpeGVkIENoYW5uZWwgRWxlbWVudHMgZm9yIGVhY2ggQ2hhbm5lbCBNb2RlIHdoaWNoIGFyZQorYXNzaWduZWQgdG8gYSBzcGVha2VyIGFycmFuZ2VtZW50LiBUaGUgYXJyYW5nZW1lbnQgaW5jbHVkZXMgZnJvbnQsIHNpZGUsIGJhY2sKK2FuZCBsZmUgQXVkaW8gQ2hhbm5lbCBFbGVtZW50cyBpbiB0aGUgbm9ybWFsIGhlaWdodCBsYXllciwgcG9zc2libHkgZm9sbG93ZWQgYnkKK2Zyb250LCBzaWRlLCBhbmQgYmFjayBlbGVtZW50cyBpbiB0aGUgdG9wIGFuZCBib3R0b20gbGF5ZXIgKENoYW5uZWwKK0NvbmZpZ3VyYXRpb24gMTQpLiBcbiBUaGlzIG1hcHBpbmcgb2YgQXVkaW8gQ2hhbm5lbCBFbGVtZW50cyBpcyBkZWZpbmVkIGluIE1QRUcKK3N0YW5kYXJkIGZvciBDaGFubmVsIENvbmZpZyAxLTcgYW5kIDExLDEyLDE0LlxuIEluIGNhc2Ugb2YgQ2hhbm5lbCBDb25maWcgMCBvcgord3JpdGluZyBtYXRyaXggbWl4ZG93biBjb2VmZmljaWVudHMsIHRoZSBlbmNvZGVyIGVuYWJsZXMgdGhlIHdyaXRpbmcgb2YgUHJvZ3JhbQorQ29uZmlnIEVsZW1lbnQgaXRzZWxmIGFzIGRlc2NyaWJlZCBpbiBccmVmIGVuY1BDRS4gVGhlIGNvbmZpZ3VyYXRpb24gdXNlZCBpbgorUHJvZ3JhbSBDb25maWcgRWxlbWVudCByZWZlcnMgdG8gdGhlIGRlbm90ZWQgVGFibGUuXG4gQmVzaWRlIHRoZSBDaGFubmVsIEVsZW1lbnQKK2Fzc2lnbm1lbnQgdGhlIENoYW5uZWwgTW9kZXMgYXJlIHJlc3Bvc2libGUgZm9yIGF1ZGlvIGlucHV0IGRhdGEgY2hhbm5lbAorbWFwcGluZy4gVGhlIENoYW5uZWwgTWFwcGluZyBvZiB0aGUgYXVkaW8gZGF0YSBkZXBlbmRzIG9uIHRoZSBzZWxlY3RlZAorOjpBQUNFTkNfQ0hBTk5FTE9SREVSIHdoaWNoIGNhbiBiZSBNUEVHIG9yIFdBViBsaWtlIG9yZGVyLlxuIEZvbGxvd2luZyB0YWJsZQorZGVzY3JpYmVzIHRoZSBjb21wbGV0ZSBjaGFubmVsIG1hcHBpbmcgZm9yIGJvdGggQ2hhbm5lbCBPcmRlciBjb25maWd1cmF0aW9ucy4KIFx2ZXJiYXRpbQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBDaGFubmVsTW9kZSAgICAgICAgICAgIHwgIE1QRUctQ2hhbm5lbG9yZGVyICAgICAgICAgICAgfCAgV0FWLUNoYW5uZWxvcmRlcgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tCi1NT0RFXzEgICAgICAgICAgICAgICAgIHwgMCB8ICAgfCAgIHwgICB8ICAgfCAgIHwgICB8ICAgfCAwIHwgICB8ICAgfCAgIHwgICB8ICAgfCAgIHwKLU1PREVfMiAgICAgICAgICAgICAgICAgfCAwIHwgMSB8ICAgfCAgIHwgICB8ICAgfCAgIHwgICB8IDAgfCAxIHwgICB8ICAgfCAgIHwgICB8ICAgfAotTU9ERV8xXzIgICAgICAgICAgICAgICB8IDAgfCAxIHwgMiB8ICAgfCAgIHwgICB8ICAgfCAgIHwgMiB8IDAgfCAxIHwgICB8ICAgfCAgIHwgICB8Ci1NT0RFXzFfMl8xICAgICAgICAgICAgIHwgMCB8IDEgfCAyIHwgMyB8ICAgfCAgIHwgICB8ICAgfCAyIHwgMCB8IDEgfCAzIHwgICB8ICAgfCAgIHwKLU1PREVfMV8yXzIgICAgICAgICAgICAgfCAwIHwgMSB8IDIgfCAzIHwgNCB8ICAgfCAgIHwgICB8IDIgfCAwIHwgMSB8IDMgfCA0IHwgICB8ICAgfAotTU9ERV8xXzJfMl8xICAgICAgICAgICB8IDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB8ICAgfCAgIHwgMiB8IDAgfCAxIHwgNCB8IDUgfCAzIHwgICB8Ci1NT0RFXzFfMl8yXzJfMSAgICAgICAgIHwgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8IDcgfCAyIHwgNiB8IDcgfCAwIHwgMSB8IDQgfCA1IHwgMworTU9ERV8xICAgICAgICAgICAgICAgICB8IDAgfCAgIHwgICB8ICAgfCAgIHwgICB8ICAgfCAgIHwgMCB8ICAgfCAgIHwgICB8ICAgfCAgIHwKK3wgTU9ERV8yICAgICAgICAgICAgICAgICB8IDAgfCAxIHwgICB8ICAgfCAgIHwgICB8ICAgfCAgIHwgMCB8IDEgfCAgIHwgICB8ICAgfAorfCAgIHwgTU9ERV8xXzIgICAgICAgICAgICAgICB8IDAgfCAxIHwgMiB8ICAgfCAgIHwgICB8ICAgfCAgIHwgMiB8IDAgfCAxIHwgICB8Cit8ICAgfCAgIHwgTU9ERV8xXzJfMSAgICAgICAgICAgICB8IDAgfCAxIHwgMiB8IDMgfCAgIHwgICB8ICAgfCAgIHwgMiB8IDAgfCAxIHwgMworfCAgIHwgICB8ICAgfCBNT0RFXzFfMl8yICAgICAgICAgICAgIHwgMCB8IDEgfCAyIHwgMyB8IDQgfCAgIHwgICB8ICAgfCAyIHwgMCB8IDEKK3wgMyB8IDQgfCAgIHwgICB8IE1PREVfMV8yXzJfMSAgICAgICAgICAgfCAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCAgIHwgICB8IDIgfCAwCit8IDEgfCA0IHwgNSB8IDMgfCAgIHwgTU9ERV8xXzJfMl8yXzEgICAgICAgICB8IDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB8IDYgfCA3IHwgMgorfCA2IHwgNyB8IDAgfCAxIHwgNCB8IDUgfCAzIE1PREVfNl8xICAgICAgICAgICAgICAgfCAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwKK3wgMiB8IDAgfCAxIHwgNCB8IDUgfCA2IHwgMyB8IE1PREVfN18xX0JBQ0sgICAgICAgICAgfCAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2Cit8IDcgfCAyIHwgMCB8IDEgfCA2IHwgNyB8IDQgfCA1IHwgMyBNT0RFXzdfMV9UT1BfRlJPTlQgICAgIHwgMCB8IDEgfCAyIHwgMyB8IDQgfAorNSB8IDYgfCA3IHwgMiB8IDAgfCAxIHwgNCB8IDUgfCAzIHwgNiB8IDcKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLQotTU9ERV83XzFfUkVBUl9TVVJST1VORCB8IDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB8IDYgfCA3IHwgMiB8IDAgfCAxIHwgNiB8IDcgfCA0IHwgNSB8IDMKLU1PREVfN18xX0ZST05UX0NFTlRFUiAgfCAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB8IDIgfCA2IHwgNyB8IDAgfCAxIHwgNCB8IDUgfCAzCitNT0RFXzdfMV9SRUFSX1NVUlJPVU5EIHwgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8IDcgfCAyIHwgMCB8IDEgfCA2IHwgNyB8IDQgfAorNSB8IDMgTU9ERV83XzFfRlJPTlRfQ0VOVEVSICB8IDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB8IDYgfCA3IHwgMiB8IDYgfCA3IHwgMCB8IDEKK3wgNCB8IDUgfCAzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFxlbmR2ZXJiYXRpbQogCi1UaGUgZGVub3RlZCBtYXBwaW5nIGlzIGltcG9ydGFudCBmb3IgY29ycmVjdCBhdWRpbyBjaGFubmVsIGFzc2lnbm1lbnQgd2hlbiB1c2luZyBNUEVHIG9yIFdBViBvcmRlcmluZy4gVGhlIGluY29taW5nIGF1ZGlvCi1jaGFubmVscyBhcmUgZGlzdHJpYnV0ZWQgTVBFRyBsaWtlIHN0YXJ0aW5nIGF0IHRoZSBmcm9udCBjaGFubmVscyBhbmQgZW5kaW5nIGF0IHRoZSBiYWNrIGNoYW5uZWxzLiBUaGUgZGlzdHJpYnV0aW9uIGlzIHVzZWQgYXMKLWRlc2NyaWJlZCBpbiBUYWJsZSBjb25jZXJpbmcgQ2hhbm5lbCBDb25maWcgYW5kIGZpeCBjaGFubmVsIGVsZW1lbnRzLiBQbGVhc2Ugc2VlIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBmb3IgY2xhcmlmaWNhdGlvbi4KK1RoZSBkZW5vdGVkIG1hcHBpbmcgaXMgaW1wb3J0YW50IGZvciBjb3JyZWN0IGF1ZGlvIGNoYW5uZWwgYXNzaWdubWVudCB3aGVuIHVzaW5nCitNUEVHIG9yIFdBViBvcmRlcmluZy4gVGhlIGluY29taW5nIGF1ZGlvIGNoYW5uZWxzIGFyZSBkaXN0cmlidXRlZCBNUEVHIGxpa2UKK3N0YXJ0aW5nIGF0IHRoZSBmcm9udCBjaGFubmVscyBhbmQgZW5kaW5nIGF0IHRoZSBiYWNrIGNoYW5uZWxzLiBUaGUgZGlzdHJpYnV0aW9uCitpcyB1c2VkIGFzIGRlc2NyaWJlZCBpbiBUYWJsZSBjb25jZXJpbmcgQ2hhbm5lbCBDb25maWcgYW5kIGZpeCBjaGFubmVsIGVsZW1lbnRzLgorUGxlYXNlIHNlZSB0aGUgZm9sbG93aW5nIGV4YW1wbGUgZm9yIGNsYXJpZmljYXRpb24uCiAKIFx2ZXJiYXRpbQogRXhhbXBsZTogTU9ERV8xXzJfMl8xIC0gV0FWLUNoYW5uZWxvcmRlciA1LjEKQEAgLTQ0NCwyMDEgKzY4NCwyNzYgQEAKIFxzZWN0aW9uIHN1cHBCaXRyYXRlcyBTdXBwb3J0ZWQgQml0cmF0ZXMKIAogVGhlIEZESyBBQUMgRW5jb2RlciBwcm92aWRlcyBhIHdpZGUgcmFuZ2Ugb2Ygc3VwcG9ydGVkIGJpdHJhdGVzLgotVGhlIG1pbmltdW0gYW5kIG1heGltdW0gYWxsb3dlZCBiaXRyYXRlIGRlcGVuZHMgb24gdGhlIEF1ZGlvIE9iamVjdCBUeXBlLiBGb3IgQUFDLUxDIHRoZSBtaW5pbXVtCi1iaXRyYXRlIGlzIHRoZSBiaXRyYXRlIHRoYXQgaXMgcmVxdWlyZWQgdG8gd3JpdGUgdGhlIG1vc3QgYmFzaWMgYW5kIG1pbmltYWwgdmFsaWQgYml0c3RyZWFtLgotSXQgY29uc2lzdHMgb2YgdGhlIGJpdHN0cmVhbSBmb3JtYXQgaGVhZGVyIGluZm9ybWF0aW9uIGFuZCBvdGhlciBzdGF0aWMvbWFuZGF0b3J5IGluZm9ybWF0aW9uCi13aXRoaW4gdGhlIEFBQyBwYXlsb2FkLiBUaGUgbWF4aW11bSBBQUMgZnJhbWVzaXplIGFsbG93ZWQgYnkgdGhlIE1QRUctNCBzdGFuZGFyZAotZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBhbGxvd2VkIGJpdHJhdGUgZm9yIEFBQy1MQy4gRm9yIEhFLUFBQyBhbmQgSEUtQUFDIHYyIGEgbGlicmFyeSBpbnRlcm5hbAotbG9vay11cCB0YWJsZSBpcyB1c2VkLgorVGhlIG1pbmltdW0gYW5kIG1heGltdW0gYWxsb3dlZCBiaXRyYXRlIGRlcGVuZHMgb24gdGhlIEF1ZGlvIE9iamVjdCBUeXBlLiBGb3IKK0FBQy1MQyB0aGUgbWluaW11bSBiaXRyYXRlIGlzIHRoZSBiaXRyYXRlIHRoYXQgaXMgcmVxdWlyZWQgdG8gd3JpdGUgdGhlIG1vc3QKK2Jhc2ljIGFuZCBtaW5pbWFsIHZhbGlkIGJpdHN0cmVhbS4gSXQgY29uc2lzdHMgb2YgdGhlIGJpdHN0cmVhbSBmb3JtYXQgaGVhZGVyCitpbmZvcm1hdGlvbiBhbmQgb3RoZXIgc3RhdGljL21hbmRhdG9yeSBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIEFBQyBwYXlsb2FkLiBUaGUKK21heGltdW0gQUFDIGZyYW1lc2l6ZSBhbGxvd2VkIGJ5IHRoZSBNUEVHLTQgc3RhbmRhcmQgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bQorYWxsb3dlZCBiaXRyYXRlIGZvciBBQUMtTEMuIEZvciBIRS1BQUMgYW5kIEhFLUFBQyB2MiBhIGxpYnJhcnkgaW50ZXJuYWwgbG9vay11cAordGFibGUgaXMgdXNlZC4KIAotQSBnb29kIHdvcmtpbmcgcG9pbnQgaW4gdGVybXMgb2YgYXVkaW8gcXVhbGl0eSwgc2FtcGxpbmcgcmF0ZSBhbmQgYml0cmF0ZSwgaXMgYXQgMSB0byAxLjUKLWJpdHMvYXVkaW8gc2FtcGxlIGZvciBBQUMtTEMsIDAuNjI1IGJpdHMvYXVkaW8gc2FtcGxlIGZvciBkdWFscmF0ZSBIRS1BQUMsIDEuMTI1IGJpdHMvYXVkaW8gc2FtcGxlCi1mb3IgZG93bnNhbXBsZWQgSEUtQUFDIGFuZCAwLjUgYml0cy9hdWRpbyBzYW1wbGUgZm9yIEhFLUFBQyB2Mi4KLUZvciBleGFtcGxlIGZvciBvbmUgY2hhbm5lbCB3aXRoIGEgc2FtcGxpbmcgZnJlcXVlbmN5IG9mIDQ4IGtIeiwgdGhlIHJhbmdlIGZyb20KLTQ4IGtiaXQvcyB0byA3MiBrYml0L3MgYWNoaWV2ZXMgcmVhc29uYWJsZSBhdWRpbyBxdWFsaXR5IGZvciBBQUMtTEMuCitBIGdvb2Qgd29ya2luZyBwb2ludCBpbiB0ZXJtcyBvZiBhdWRpbyBxdWFsaXR5LCBzYW1wbGluZyByYXRlIGFuZCBiaXRyYXRlLCBpcyBhdAorMSB0byAxLjUgYml0cy9hdWRpbyBzYW1wbGUgZm9yIEFBQy1MQywgMC42MjUgYml0cy9hdWRpbyBzYW1wbGUgZm9yIGR1YWxyYXRlCitIRS1BQUMsIDEuMTI1IGJpdHMvYXVkaW8gc2FtcGxlIGZvciBkb3duc2FtcGxlZCBIRS1BQUMgYW5kIDAuNSBiaXRzL2F1ZGlvIHNhbXBsZQorZm9yIEhFLUFBQyB2Mi4gRm9yIGV4YW1wbGUgZm9yIG9uZSBjaGFubmVsIHdpdGggYSBzYW1wbGluZyBmcmVxdWVuY3kgb2YgNDgga0h6LAordGhlIHJhbmdlIGZyb20gNDgga2JpdC9zIHRvIDcyIGtiaXQvcyBhY2hpZXZlcyByZWFzb25hYmxlIGF1ZGlvIHF1YWxpdHkgZm9yCitBQUMtTEMuCiAKLUZvciBIRS1BQUMgYW5kIEhFLUFBQyB2MiB0aGUgbG93ZXN0IHBvc3NpYmxlIGF1ZGlvIGlucHV0IHNhbXBsaW5nIGZyZXF1ZW5jeSBpcyAxNiBrSHogYmVjYXVzZSB0aGVuIHRoZQotQUFDLUxDIGNvcmUgZW5jb2RlciBvcGVyYXRlcyBpbiBkdWFsIHJhdGUgbW9kZSBhdCBpdHMgbG93ZXN0IHBvc3NpYmxlIHNhbXBsaW5nIGZyZXF1ZW5jeSwgd2hpY2ggaXMgOCBrSHouCi1IRS1BQUMgdjIgcmVxdWlyZXMgc3RlcmVvIGlucHV0IGF1ZGlvIGRhdGEuCitGb3IgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdGhlIGxvd2VzdCBwb3NzaWJsZSBhdWRpbyBpbnB1dCBzYW1wbGluZyBmcmVxdWVuY3kgaXMKKzE2IGtIeiBiZWNhdXNlIHRoZW4gdGhlIEFBQy1MQyBjb3JlIGVuY29kZXIgb3BlcmF0ZXMgaW4gZHVhbCByYXRlIG1vZGUgYXQgaXRzCitsb3dlc3QgcG9zc2libGUgc2FtcGxpbmcgZnJlcXVlbmN5LCB3aGljaCBpcyA4IGtIei4gSEUtQUFDIHYyIHJlcXVpcmVzIHN0ZXJlbworaW5wdXQgYXVkaW8gZGF0YS4KIAotUGxlYXNlIG5vdGUgdGhhdCBpbiBIRS1BQUMgb3IgSEUtQUFDIHYyIG1vZGUgdGhlIGVuY29kZXIgc3VwcG9ydHMgbXVjaCBoaWdoZXIgYml0cmF0ZXMgdGhhbiBhcmUKLWFwcHJvcHJpYXRlIGZvciBIRS1BQUMgb3IgSEUtQUFDIHYyLiBGb3IgZXhhbXBsZSwgYXQgYSBiaXRyYXRlIG9mIG1vcmUgdGhhbiA2NCBrYml0L3MgZm9yIGEgc3RlcmVvCi1hdWRpbyBzaWduYWwgYXQgNDQuMSBrSHogaXQgdXN1YWxseSBtYWtlcyBzZW5zZSB0byB1c2UgQUFDLUxDLCB3aGljaCB3aWxsIHByb2R1Y2UgYmV0dGVyIGF1ZGlvCi1xdWFsaXR5IGF0IHRoYXQgYml0cmF0ZSB0aGFuIEhFLUFBQyBvciBIRS1BQUMgdjIuCitQbGVhc2Ugbm90ZSB0aGF0IGluIEhFLUFBQyBvciBIRS1BQUMgdjIgbW9kZSB0aGUgZW5jb2RlciBzdXBwb3J0cyBtdWNoIGhpZ2hlcgorYml0cmF0ZXMgdGhhbiBhcmUgYXBwcm9wcmlhdGUgZm9yIEhFLUFBQyBvciBIRS1BQUMgdjIuIEZvciBleGFtcGxlLCBhdCBhIGJpdHJhdGUKK29mIG1vcmUgdGhhbiA2NCBrYml0L3MgZm9yIGEgc3RlcmVvIGF1ZGlvIHNpZ25hbCBhdCA0NC4xIGtIeiBpdCB1c3VhbGx5IG1ha2VzCitzZW5zZSB0byB1c2UgQUFDLUxDLCB3aGljaCB3aWxsIHByb2R1Y2UgYmV0dGVyIGF1ZGlvIHF1YWxpdHkgYXQgdGhhdCBiaXRyYXRlCit0aGFuIEhFLUFBQyBvciBIRS1BQUMgdjIuCiAKIFxzZWN0aW9uIHJlb21tZW5kZWRDb25maWcgUmVjb21tZW5kZWQgU2FtcGxpbmcgUmF0ZSBhbmQgQml0cmF0ZSBDb21iaW5hdGlvbnMKIAotVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyBhbiBvdmVydmlldyBvZiByZWNvbW1lbmRlZCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwotd2hpY2ggd2UgZGV0ZXJtaW5lZCBieSB2aXJ0dWUgb2YgbnVtZXJvdXMgbGlzdGVuaW5nIHRlc3RzLgorVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyBhbiBvdmVydmlldyBvZiByZWNvbW1lbmRlZCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24KK3BhcmFtZXRlcnMgd2hpY2ggd2UgZGV0ZXJtaW5lZCBieSB2aXJ0dWUgb2YgbnVtZXJvdXMgbGlzdGVuaW5nIHRlc3RzLgogCiBcc3Vic2VjdGlvbiByZW9tbWVuZGVkQ29uZmlnTEMgQUFDLUxDLCBIRS1BQUMsIEhFLUFBQ3YyIGluIER1YWxyYXRlIFNCUiBtb2RlLgogXHZlcmJhdGltCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQXVkaW8gT2JqZWN0IFR5cGUgIHwgIEJpdCBSYXRlIFJhbmdlICB8ICAgICAgICAgICAgU3VwcG9ydGVkICB8IFByZWZlcnJlZCAgfCBOby4gb2YKLSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgW2JpdC9zXSAgfCAgICAgICBTYW1wbGluZyBSYXRlcyAgfCAgICBTYW1wbC4gIHwgIENoYW4uCi0gICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW2tIel0gIHwgICAgICBSYXRlICB8Ci0gICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIFtrSHpdICB8CitBdWRpbyBPYmplY3QgVHlwZSAgfCAgQml0IFJhdGUgUmFuZ2UgIHwgICAgICAgICAgICBTdXBwb3J0ZWQgIHwgUHJlZmVycmVkICB8IE5vLgorb2YgfCAgICAgICAgIFtiaXQvc10gIHwgICAgICAgU2FtcGxpbmcgUmF0ZXMgIHwgICAgU2FtcGwuICB8ICBDaGFuLiB8Cit8ICAgICAgICAgICAgICAgIFtrSHpdICB8ICAgICAgUmF0ZSAgfCB8ICAgICAgICAgICAgICAgICAgfAorfCAgICAgW2tIel0gIHwKIC0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCi1BQUMgTEMgKyBTQlIgKyBQUyAgfCAgIDgwMDAgLSAgMTE5OTkgIHwgICAgICAgICAyMi4wNSwgMjQuMDAgIHwgICAgIDI0LjAwICB8ICAgICAgMgotQUFDIExDICsgU0JSICsgUFMgIHwgIDEyMDAwIC0gIDE3OTk5ICB8ICAgICAgICAgICAgICAgIDMyLjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDIKLUFBQyBMQyArIFNCUiArIFBTICB8ICAxODAwMCAtICAzOTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAyCi1BQUMgTEMgKyBTQlIgKyBQUyAgfCAgNDAwMDAgLSAgNTYwMDAgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgMgorQUFDIExDICsgU0JSICsgUFMgIHwgICA4MDAwIC0gIDExOTk5ICB8ICAgICAgICAgMjIuMDUsIDI0LjAwICB8ICAgICAyNC4wMCAgfCAyCitBQUMgTEMgKyBTQlIgKyBQUyAgfCAgMTIwMDAgLSAgMTc5OTkgIHwgICAgICAgICAgICAgICAgMzIuMDAgIHwgICAgIDMyLjAwICB8IDIKK0FBQyBMQyArIFNCUiArIFBTICB8ICAxODAwMCAtICAzOTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgMgorQUFDIExDICsgU0JSICsgUFMgIHwgIDQwMDAwIC0gIDY0MDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAyCiAtLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQotQUFDIExDICsgU0JSICAgICAgIHwgICA4MDAwIC0gIDExOTk5ICB8ICAgICAgICAgMjIuMDUsIDI0LjAwICB8ICAgICAyNC4wMCAgfCAgICAgIDEKLUFBQyBMQyArIFNCUiAgICAgICB8ICAxMjAwMCAtICAxNzk5OSAgfCAgICAgICAgICAgICAgICAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAxCi1BQUMgTEMgKyBTQlIgICAgICAgfCAgMTgwMDAgLSAgMzk5OTkgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDQ0LjEwICB8ICAgICAgMQotQUFDIExDICsgU0JSICAgICAgIHwgIDQwMDAwIC0gIDU2MDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDEKLUFBQyBMQyArIFNCUiAgICAgICB8ICAxNjAwMCAtICAyNzk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAyCi1BQUMgTEMgKyBTQlIgICAgICAgfCAgMjgwMDAgLSAgNjM5OTkgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDQ0LjEwICB8ICAgICAgMgotQUFDIExDICsgU0JSICAgICAgIHwgIDY0MDAwIC0gMTI4MDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDIKK0FBQyBMQyArIFNCUiAgICAgICB8ICAgODAwMCAtICAxMTk5OSAgfCAgICAgICAgIDIyLjA1LCAyNC4wMCAgfCAgICAgMjQuMDAgIHwgMQorQUFDIExDICsgU0JSICAgICAgIHwgIDEyMDAwIC0gIDE3OTk5ICB8ICAgICAgICAgICAgICAgIDMyLjAwICB8ICAgICAzMi4wMCAgfCAxCitBQUMgTEMgKyBTQlIgICAgICAgfCAgMTgwMDAgLSAgMzk5OTkgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDQ0LjEwICB8IDEKK0FBQyBMQyArIFNCUiAgICAgICB8ICA0MDAwMCAtICA2NDAwMCAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDguMDAgIHwgMQogLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KLUFBQyBMQyArIFNCUiAgICAgICB8ICA2NDAwMCAtICA2OTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgMzIuMDAgIHwgNSwgNS4xCi1BQUMgTEMgKyBTQlIgICAgICAgfCAgNzAwMDAgLSAxNTk5OTkgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDQ0LjEwICB8IDUsIDUuMQotQUFDIExDICsgU0JSICAgICAgIHwgMTYwMDAwIC0gMjQ1OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDUKLUFBQyBMQyArIFNCUiAgICAgICB8IDE2MDAwMCAtIDI2NTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgNS4xCitBQUMgTEMgKyBTQlIgICAgICAgfCAgMTYwMDAgLSAgMjc5OTkgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDMyLjAwICB8IDIKK0FBQyBMQyArIFNCUiAgICAgICB8ICAyODAwMCAtICA2Mzk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgMgorQUFDIExDICsgU0JSICAgICAgIHwgIDY0MDAwIC0gMTI4MDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAyCiAtLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQotQUFDIExDICAgICAgICAgICAgIHwgICA4MDAwIC0gIDE1OTk5ICB8IDExLjAyNSwgMTIuMDAsIDE2LjAwICB8ICAgICAxMi4wMCAgfCAgICAgIDEKLUFBQyBMQyAgICAgICAgICAgICB8ICAxNjAwMCAtICAyMzk5OSAgfCAgICAgICAgICAgICAgICAxNi4wMCAgfCAgICAgMTYuMDAgIHwgICAgICAxCi1BQUMgTEMgICAgICAgICAgICAgfCAgMjQwMDAgLSAgMzE5OTkgIHwgIDE2LjAwLCAyMi4wNSwgMjQuMDAgIHwgICAgIDI0LjAwICB8ICAgICAgMQotQUFDIExDICAgICAgICAgICAgIHwgIDMyMDAwIC0gIDU1OTk5ICB8ICAgICAgICAgICAgICAgIDMyLjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDEKLUFBQyBMQyAgICAgICAgICAgICB8ICA1NjAwMCAtIDE2MDAwMCAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAxCi1BQUMgTEMgICAgICAgICAgICAgfCAxNjAwMDEgLSAyODgwMDAgIHwgICAgICAgICAgICAgICAgNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgMQorQUFDIExDICsgU0JSICAgICAgIHwgIDY0MDAwIC0gIDY5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICAzMi4wMCAgfAorNSwgNS4xIEFBQyBMQyArIFNCUiAgICAgICB8ICA3MDAwMCAtIDIzOTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAKK3wgNSwgNS4xIEFBQyBMQyArIFNCUiAgICAgICB8IDI0MDAwMCAtIDMxOTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfAorNDguMDAgIHwgNSwgNS4xCiAtLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQotQUFDIExDICAgICAgICAgICAgIHwgIDE2MDAwIC0gIDIzOTk5ICB8IDExLjAyNSwgMTIuMDAsIDE2LjAwICB8ICAgICAxMi4wMCAgfCAgICAgIDIKLUFBQyBMQyAgICAgICAgICAgICB8ICAyNDAwMCAtICAzMTk5OSAgfCAgICAgICAgICAgICAgICAxNi4wMCAgfCAgICAgMTYuMDAgIHwgICAgICAyCi1BQUMgTEMgICAgICAgICAgICAgfCAgMzIwMDAgLSAgMzk5OTkgIHwgIDE2LjAwLCAyMi4wNSwgMjQuMDAgIHwgICAgIDIyLjA1ICB8ICAgICAgMgotQUFDIExDICAgICAgICAgICAgIHwgIDQwMDAwIC0gIDk1OTk5ICB8ICAgICAgICAgICAgICAgIDMyLjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDIKLUFBQyBMQyAgICAgICAgICAgICB8ICA5NjAwMCAtIDExMTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAyCi1BQUMgTEMgICAgICAgICAgICAgfCAxMTIwMDAgLSAzMjAwMDEgIHwgIDMyLjAwLCA0NC4xMCwgNDguMDAgIHwgICAgIDQ0LjEwICB8ICAgICAgMgotQUFDIExDICAgICAgICAgICAgIHwgMzIwMDAyIC0gNTc2MDAwICB8ICAgICAgICAgICAgICAgIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDIKK0FBQyBMQyAgICAgICAgICAgICB8ICAgODAwMCAtICAxNTk5OSAgfCAxMS4wMjUsIDEyLjAwLCAxNi4wMCAgfCAgICAgMTIuMDAgIHwgMQorQUFDIExDICAgICAgICAgICAgIHwgIDE2MDAwIC0gIDIzOTk5ICB8ICAgICAgICAgICAgICAgIDE2LjAwICB8ICAgICAxNi4wMCAgfCAxCitBQUMgTEMgICAgICAgICAgICAgfCAgMjQwMDAgLSAgMzE5OTkgIHwgIDE2LjAwLCAyMi4wNSwgMjQuMDAgIHwgICAgIDI0LjAwICB8IDEKK0FBQyBMQyAgICAgICAgICAgICB8ICAzMjAwMCAtICA1NTk5OSAgfCAgICAgICAgICAgICAgICAzMi4wMCAgfCAgICAgMzIuMDAgIHwgMQorQUFDIExDICAgICAgICAgICAgIHwgIDU2MDAwIC0gMTYwMDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAxCitBQUMgTEMgICAgICAgICAgICAgfCAxNjAwMDEgLSAyODgwMDAgIHwgICAgICAgICAgICAgICAgNDguMDAgIHwgICAgIDQ4LjAwICB8IDEKIC0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCi1BQUMgTEMgICAgICAgICAgICAgfCAxNjAwMDAgLSAyMzk5OTkgIHwgICAgICAgICAgICAgICAgMzIuMDAgIHwgICAgIDMyLjAwICB8IDUsIDUuMQotQUFDIExDICAgICAgICAgICAgIHwgMjQwMDAwIC0gMjc5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICAzMi4wMCAgfCA1LCA1LjEKLUFBQyBMQyAgICAgICAgICAgICB8IDI4MDAwMCAtIDgwMDAwMCAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgNDQuMTAgIHwgNSwgNS4xCitBQUMgTEMgICAgICAgICAgICAgfCAgMTYwMDAgLSAgMjM5OTkgIHwgMTEuMDI1LCAxMi4wMCwgMTYuMDAgIHwgICAgIDEyLjAwICB8IDIKK0FBQyBMQyAgICAgICAgICAgICB8ICAyNDAwMCAtICAzMTk5OSAgfCAgICAgICAgICAgICAgICAxNi4wMCAgfCAgICAgMTYuMDAgIHwgMgorQUFDIExDICAgICAgICAgICAgIHwgIDMyMDAwIC0gIDM5OTk5ICB8ICAxNi4wMCwgMjIuMDUsIDI0LjAwICB8ICAgICAyMi4wNSAgfCAyCitBQUMgTEMgICAgICAgICAgICAgfCAgNDAwMDAgLSAgOTU5OTkgIHwgICAgICAgICAgICAgICAgMzIuMDAgIHwgICAgIDMyLjAwICB8IDIKK0FBQyBMQyAgICAgICAgICAgICB8ICA5NjAwMCAtIDExMTk5OSAgfCAgMzIuMDAsIDQ0LjEwLCA0OC4wMCAgfCAgICAgMzIuMDAgIHwgMgorQUFDIExDICAgICAgICAgICAgIHwgMTEyMDAwIC0gMzIwMDAxICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAyCitBQUMgTEMgICAgICAgICAgICAgfCAzMjAwMDIgLSA1NzYwMDAgIHwgICAgICAgICAgICAgICAgNDguMDAgIHwgICAgIDQ4LjAwICB8IDIKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCitBQUMgTEMgICAgICAgICAgICAgfCAxNjAwMDAgLSAyMzk5OTkgIHwgICAgICAgICAgICAgICAgMzIuMDAgIHwgICAgIDMyLjAwICB8Cis1LCA1LjEgQUFDIExDICAgICAgICAgICAgIHwgMjQwMDAwIC0gMjc5OTk5ICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8ICAgICAzMi4wMAorfCA1LCA1LjEgQUFDIExDICAgICAgICAgICAgIHwgMjgwMDAwIC0gODAwMDAwICB8ICAzMi4wMCwgNDQuMTAsIDQ4LjAwICB8Cis0NC4xMCAgfCA1LCA1LjEKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBcZW5kdmVyYmF0aW0gXG4KIAotXHN1YnNlY3Rpb24gcmVvbW1lbmRlZENvbmZpZ0xEIEFBQy1MRCwgQUFDLUVMRCwgQUFDLUVMRCB3aXRoIFNCUiBpbiBEdWFscmF0ZSBTQlIgbW9kZS4KLVx2ZXJiYXRpbQorXHN1YnNlY3Rpb24gcmVvbW1lbmRlZENvbmZpZ0xEIEFBQy1MRCwgQUFDLUVMRCwgQUFDLUVMRCB3aXRoIFNCUiBpbiBEdWFscmF0ZSBTQlIKK21vZGUuIFVubGlrZSB0byBIRS1BQUMgY29uZmlndXJhdGlvbiB0aGUgU0JSIGlzIG5vdCBjb3ZlcmVkIGJ5IEVMRCBhdWRpbyBvYmplY3QKK3R5cGUgYW5kIG5lZWRzIHRvIGJlIGVuYWJsZWQgZXhwbGljaXRseS4gVXNlIDo6QUFDRU5DX1NCUl9NT0RFIHRvIGNvbmZpZ3VyZSBTQlIKK2FuZCBpdHMgc2FtcGxpbmdyYXRlIHJhdGlvIHdpdGggOjpBQUNFTkNfU0JSX1JBVElPIHBhcmFtZXRlci4gXHZlcmJhdGltCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQXVkaW8gT2JqZWN0IFR5cGUgIHwgIEJpdCBSYXRlIFJhbmdlICB8ICAgICAgICAgICAgU3VwcG9ydGVkICB8IFByZWZlcnJlZCAgfCBOby4gb2YKLSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgW2JpdC9zXSAgfCAgICAgICBTYW1wbGluZyBSYXRlcyAgfCAgICBTYW1wbC4gIHwgIENoYW4uCi0gICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW2tIel0gIHwgICAgICBSYXRlICB8Ci0gICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIFtrSHpdICB8CitBdWRpbyBPYmplY3QgVHlwZSAgfCAgQml0IFJhdGUgUmFuZ2UgIHwgICAgICAgICAgICBTdXBwb3J0ZWQgIHwgUHJlZmVycmVkICB8IE5vLgorb2YgfCAgICAgICAgIFtiaXQvc10gIHwgICAgICAgU2FtcGxpbmcgUmF0ZXMgIHwgICAgU2FtcGwuICB8ICBDaGFuLiB8Cit8ICAgICAgICAgICAgICAgIFtrSHpdICB8ICAgICAgUmF0ZSAgfCB8ICAgICAgICAgICAgICAgICAgfAorfCAgICAgW2tIel0gIHwKIC0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCi1FTEQgKyBTQlIgICAgICAgICAgfCAgMTgwMDAgLSAgMjQ5OTkgIHwgICAgICAgIDMyLjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8ICAgICAgMQotRUxEICsgU0JSICAgICAgICAgIHwgIDI1MDAwIC0gIDMxOTk5ICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDEKLUVMRCArIFNCUiAgICAgICAgICB8ICAzMjAwMCAtICA2NDAwMCAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAxCitFTEQgKyBTQlIgICAgICAgICAgfCAgMTgwMDAgLSAgMjQ5OTkgIHwgICAgICAgIDMyLjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8IDEKK0VMRCArIFNCUiAgICAgICAgICB8ICAyNTAwMCAtICAzMTk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgMzIuMDAgIHwgMQorRUxEICsgU0JSICAgICAgICAgIHwgIDMyMDAwIC0gIDY0MDAwICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAxCiAtLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQotRUxEICsgU0JSICAgICAgICAgIHwgIDMyMDAwIC0gIDUxOTk5ICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDIKLUVMRCArIFNCUiAgICAgICAgICB8ICA1MjAwMCAtIDEyODAwMCAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAyCitFTEQgKyBTQlIgICAgICAgICAgfCAgMzIwMDAgLSAgNTE5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ0LjEwICB8IDIKK0VMRCArIFNCUiAgICAgICAgICB8ICA1MjAwMCAtIDEyODAwMCAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgMgogLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KLUVMRCArIFNCUiAgICAgICAgICB8ICA3MjAwMCAtIDE2MDAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAzCitFTEQgKyBTQlIgICAgICAgICAgfCAgNzgwMDAgLSAxNjAwMDAgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8IDMKIC0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCi1FTEQgKyBTQlIgICAgICAgICAgfCAgOTYwMDAgLSAyMTIwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgNAorRUxEICsgU0JSICAgICAgICAgIHwgMTA0MDAwIC0gMjEyMDAwICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCA0CiAtLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQotRUxEICsgU0JSICAgICAgICAgIHwgMTIwMDAwIC0gMjQ2MDAwICB8ICAgICAgICA0NC4xMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDUKK0VMRCArIFNCUiAgICAgICAgICB8IDEzMDAwMCAtIDI0NjAwMCAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwKKzUsIDUuMQogLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KLUVMRCArIFNCUiAgICAgICAgICB8IDEyMDAwMCAtIDI2NjAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgNS4xCitMRCwgRUxEICAgICAgICAgICAgfCAgMTYwMDAgLSAgMTk5OTkgIHwgICAgICAgIDE2LjAwIC0gMjQuMDAgIHwgICAgIDE2LjAwICB8IDEKK0xELCBFTEQgICAgICAgICAgICB8ICAyMDAwMCAtICAzOTk5OSAgfCAgICAgICAgMTYuMDAgLSAzMi4wMCAgfCAgICAgMjQuMDAgIHwgMQorTEQsIEVMRCAgICAgICAgICAgIHwgIDQwMDAwIC0gIDQ5OTk5ICB8ICAgICAgICAyMi4wNSAtIDMyLjAwICB8ICAgICAzMi4wMCAgfCAxCitMRCwgRUxEICAgICAgICAgICAgfCAgNTAwMDAgLSAgNjE5OTkgIHwgICAgICAgIDI0LjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8IDEKK0xELCBFTEQgICAgICAgICAgICB8ICA2MjAwMCAtICA4NDk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgMQorTEQsIEVMRCAgICAgICAgICAgIHwgIDg1MDAwIC0gMTkyMDAwICB8ICAgICAgICA0NC4xMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAxCiAtLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQotTEQsIEVMRCAgICAgICAgICAgIHwgIDE2MDAwIC0gIDE5OTk5ICB8ICAgICAgICAxNi4wMCAtIDI0LjAwICB8ICAgICAxNi4wMCAgfCAgICAgIDEKLUxELCBFTEQgICAgICAgICAgICB8ICAyMDAwMCAtICAzOTk5OSAgfCAgICAgICAgMTYuMDAgLSAzMi4wMCAgfCAgICAgMjQuMDAgIHwgICAgICAxCi1MRCwgRUxEICAgICAgICAgICAgfCAgNDAwMDAgLSAgNDk5OTkgIHwgICAgICAgIDIyLjA1IC0gMzIuMDAgIHwgICAgIDMyLjAwICB8ICAgICAgMQotTEQsIEVMRCAgICAgICAgICAgIHwgIDUwMDAwIC0gIDYxOTk5ICB8ICAgICAgICAyNC4wMCAtIDQ0LjEwICB8ICAgICAzMi4wMCAgfCAgICAgIDEKLUxELCBFTEQgICAgICAgICAgICB8ICA2MjAwMCAtICA4NDk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICAxCi1MRCwgRUxEICAgICAgICAgICAgfCAgODUwMDAgLSAxOTIwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgMQorTEQsIEVMRCAgICAgICAgICAgIHwgIDY0MDAwIC0gIDc1OTk5ICB8ICAgICAgICAyNC4wMCAtIDMyLjAwICB8ICAgICAzMi4wMCAgfCAyCitMRCwgRUxEICAgICAgICAgICAgfCAgNzYwMDAgLSAgOTc5OTkgIHwgICAgICAgIDI0LjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8IDIKK0xELCBFTEQgICAgICAgICAgICB8ICA5ODAwMCAtIDEzNTk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgMgorTEQsIEVMRCAgICAgICAgICAgIHwgMTM2MDAwIC0gMzg0MDAwICB8ICAgICAgICA0NC4xMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAyCiAtLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQotTEQsIEVMRCAgICAgICAgICAgIHwgIDY0MDAwIC0gIDc1OTk5ICB8ICAgICAgICAyNC4wMCAtIDMyLjAwICB8ICAgICAzMi4wMCAgfCAgICAgIDIKLUxELCBFTEQgICAgICAgICAgICB8ICA3NjAwMCAtICA5Nzk5OSAgfCAgICAgICAgMjQuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgICAgICAyCi1MRCwgRUxEICAgICAgICAgICAgfCAgOTgwMDAgLSAxMzU5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ0LjEwICB8ICAgICAgMgotTEQsIEVMRCAgICAgICAgICAgIHwgMTM2MDAwIC0gMzg0MDAwICB8ICAgICAgICA0NC4xMCAtIDQ4LjAwICB8ICAgICA0OC4wMCAgfCAgICAgIDIKK0xELCBFTEQgICAgICAgICAgICB8ICA5NjAwMCAtIDExMzk5OSAgfCAgICAgICAgMjQuMDAgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgMworTEQsIEVMRCAgICAgICAgICAgIHwgMTE0MDAwIC0gMTQ2OTk5ICB8ICAgICAgICAyNC4wMCAtIDQ0LjEwICB8ICAgICAzMi4wMCAgfCAzCitMRCwgRUxEICAgICAgICAgICAgfCAxNDcwMDAgLSAyMDM5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ0LjEwICB8IDMKK0xELCBFTEQgICAgICAgICAgICB8IDIwNDAwMCAtIDU3NjAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgMwogLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KLUxELCBFTEQgICAgICAgICAgICB8ICA5NjAwMCAtIDExMzk5OSAgfCAgICAgICAgMjQuMDAgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAzCi1MRCwgRUxEICAgICAgICAgICAgfCAxMTQwMDAgLSAxNDY5OTkgIHwgICAgICAgIDI0LjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8ICAgICAgMwotTEQsIEVMRCAgICAgICAgICAgIHwgMTQ3MDAwIC0gMjAzOTk5ICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDMKLUxELCBFTEQgICAgICAgICAgICB8IDIwNDAwMCAtIDU3NjAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICAzCitMRCwgRUxEICAgICAgICAgICAgfCAxMjgwMDAgLSAxNTE5OTkgIHwgICAgICAgIDI0LjAwIC0gMzIuMDAgIHwgICAgIDMyLjAwICB8IDQKK0xELCBFTEQgICAgICAgICAgICB8IDE1MjAwMCAtIDE5NTk5OSAgfCAgICAgICAgMjQuMDAgLSA0NC4xMCAgfCAgICAgMzIuMDAgIHwgNAorTEQsIEVMRCAgICAgICAgICAgIHwgMTk2MDAwIC0gMjcxOTk5ICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICA0NC4xMCAgfCA0CitMRCwgRUxEICAgICAgICAgICAgfCAyNzIwMDAgLSA3NjgwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8IDQKIC0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCi1MRCwgRUxEICAgICAgICAgICAgfCAxMjgwMDAgLSAxNTE5OTkgIHwgICAgICAgIDI0LjAwIC0gMzIuMDAgIHwgICAgIDMyLjAwICB8ICAgICAgNAotTEQsIEVMRCAgICAgICAgICAgIHwgMTUyMDAwIC0gMTk1OTk5ICB8ICAgICAgICAyNC4wMCAtIDQ0LjEwICB8ICAgICAzMi4wMCAgfCAgICAgIDQKLUxELCBFTEQgICAgICAgICAgICB8IDE5NjAwMCAtIDI3MTk5OSAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDQuMTAgIHwgICAgICA0Ci1MRCwgRUxEICAgICAgICAgICAgfCAyNzIwMDAgLSA3NjgwMDAgIHwgICAgICAgIDQ0LjEwIC0gNDguMDAgIHwgICAgIDQ4LjAwICB8ICAgICAgNAotLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KLUxELCBFTEQgICAgICAgICAgICB8IDE2MDAwMCAtIDE4OTk5OSAgfCAgICAgICAgMjQuMDAgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgICAgICA1Ci1MRCwgRUxEICAgICAgICAgICAgfCAxOTAwMDAgLSAyNDQ5OTkgIHwgICAgICAgIDI0LjAwIC0gNDQuMTAgIHwgICAgIDMyLjAwICB8ICAgICAgNQotTEQsIEVMRCAgICAgICAgICAgIHwgMjQ1MDAwIC0gMzM5OTk5ICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8ICAgICA0NC4xMCAgfCAgICAgIDUKLUxELCBFTEQgICAgICAgICAgICB8IDM0MDAwMCAtIDk2MDAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgICAgICA1CitMRCwgRUxEICAgICAgICAgICAgfCAxNjAwMDAgLSAxODk5OTkgIHwgICAgICAgIDI0LjAwIC0gMzIuMDAgIHwgICAgIDMyLjAwICB8Cis1LCA1LjEgTEQsIEVMRCAgICAgICAgICAgIHwgMTkwMDAwIC0gMjQ0OTk5ICB8ICAgICAgICAyNC4wMCAtIDQ0LjEwICB8ICAgICAzMi4wMAorfCA1LCA1LjEgTEQsIEVMRCAgICAgICAgICAgIHwgMjQ1MDAwIC0gMzM5OTk5ICB8ICAgICAgICAzMi4wMCAtIDQ4LjAwICB8Cis0NC4xMCAgfCA1LCA1LjEgTEQsIEVMRCAgICAgICAgICAgIHwgMzQwMDAwIC0gOTYwMDAwICB8ICAgICAgICA0NC4xMCAtIDQ4LjAwICB8Cis0OC4wMCAgfCA1LCA1LjEKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBcZW5kdmVyYmF0aW0gXG4KIAogXHN1YnNlY3Rpb24gcmVvbW1lbmRlZENvbmZpZ0VMRCBBQUMtRUxEIHdpdGggU0JSIGluIERvd25zYW1wbGVkIFNCUiBtb2RlLgogXHZlcmJhdGltCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQXVkaW8gT2JqZWN0IFR5cGUgIHwgIEJpdCBSYXRlIFJhbmdlICB8ICAgICAgICAgICAgU3VwcG9ydGVkICB8IFByZWZlcnJlZCAgfCBOby4gb2YKLSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgW2JpdC9zXSAgfCAgICAgICBTYW1wbGluZyBSYXRlcyAgfCAgICBTYW1wbC4gIHwgIENoYW4uCi0gICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgW2tIel0gIHwgICAgICBSYXRlICB8Ci0gICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIFtrSHpdICB8CitBdWRpbyBPYmplY3QgVHlwZSAgfCAgQml0IFJhdGUgUmFuZ2UgIHwgICAgICAgICAgICBTdXBwb3J0ZWQgIHwgUHJlZmVycmVkICB8IE5vLgorb2YgfCAgICAgICAgIFtiaXQvc10gIHwgICAgICAgU2FtcGxpbmcgUmF0ZXMgIHwgICAgU2FtcGwuICB8ICBDaGFuLiB8Cit8ICAgICAgICAgICAgICAgIFtrSHpdICB8ICAgICAgUmF0ZSAgfCB8ICAgICAgICAgICAgICAgICAgfAorfCAgICAgW2tIel0gIHwKIC0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCi1FTEQgKyBTQlIgICAgICAgICAgfCAgMTgwMDAgLSAgMjQ5OTkgIHwgICAgICAgIDE2LjAwIC0gMjIuMDUgIHwgICAgIDIyLjA1ICB8ICAgICAgMQotKGRvd25zYW1wbGVkIFNCUikgIHwgIDI1MDAwIC0gIDM1OTk5ICB8ICAgICAgICAyMi4wNSAtIDMyLjAwICB8ICAgICAyNC4wMCAgfCAgICAgIDEKLSAgICAgICAgICAgICAgICAgICB8ICAzNjAwMCAtICA2NDAwMCAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgMzIuMDAgIHwgICAgICAxCitFTEQgKyBTQlIgICAgICAgICAgfCAgMTgwMDAgLSAyNDk5OSAgIHwgICAgICAgIDE2LjAwIC0gMjIuMDUgIHwgICAgIDIyLjA1ICB8IDEKKyhkb3duc2FtcGxlZCBTQlIpICB8ICAyNTAwMCAtIDMxOTk5ICAgfCAgICAgICAgMTYuMDAgLSAyNC4wMCAgfCAgICAgMjQuMDAgIHwgMQorICAgICAgICAgICAgICAgICAgIHwgIDMyMDAwIC0gNDc5OTkgICB8ICAgICAgICAyMi4wNSAtIDMyLjAwICB8ICAgICAzMi4wMCAgfCAxCisgICAgICAgICAgICAgICAgICAgfCAgNDgwMDAgLSA2NDAwMCAgIHwgICAgICAgIDIyLjA1IC0gNDguMDAgIHwgICAgIDMyLjAwICB8IDEKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCitFTEQgKyBTQlIgICAgICAgICAgfCAgMzIwMDAgLSA1MTk5OSAgIHwgICAgICAgIDE2LjAwIC0gMjQuMDAgIHwgICAgIDI0LjAwICB8IDIKKyhkb3duc2FtcGxlZCBTQlIpICB8ICA1MjAwMCAtIDU5OTk5ICAgfCAgICAgICAgMjIuMDUgLSAyNC4wMCAgfCAgICAgMjQuMDAgIHwgMgorICAgICAgICAgICAgICAgICAgIHwgIDYwMDAwIC0gOTU5OTkgICB8ICAgICAgICAyMi4wNSAtIDMyLjAwICB8ICAgICAzMi4wMCAgfCAyCisgICAgICAgICAgICAgICAgICAgfCAgOTYwMDAgLSAxMjgwMDAgIHwgICAgICAgIDIyLjA1IC0gNDguMDAgIHwgICAgIDMyLjAwICB8IDIKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCitFTEQgKyBTQlIgICAgICAgICAgfCAgNzgwMDAgLSAgOTk5OTkgIHwgICAgICAgIDIyLjA1IC0gMjQuMDAgIHwgICAgIDI0LjAwICB8IDMKKyhkb3duc2FtcGxlZCBTQlIpICB8IDEwMDAwMCAtIDE0Mzk5OSAgfCAgICAgICAgMjIuMDUgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgMworICAgICAgICAgICAgICAgICAgIHwgMTQ0MDAwIC0gMTU5OTk5ICB8ICAgICAgICAyMi4wNSAtIDQ4LjAwICB8ICAgICAzMi4wMCAgfCAzCisgICAgICAgICAgICAgICAgICAgfCAxNjAwMDAgLSAxOTIwMDAgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDMyLjAwICB8IDMKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCitFTEQgKyBTQlIgICAgICAgICAgfCAxMDQwMDAgLSAxNDk5OTkgIHwgICAgICAgIDIyLjA1IC0gMjQuMDAgIHwgICAgIDI0LjAwICB8IDQKKyhkb3duc2FtcGxlZCBTQlIpICB8IDE1MDAwMCAtIDE5MTk5OSAgfCAgICAgICAgMjIuMDUgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgNAorICAgICAgICAgICAgICAgICAgIHwgMTkyMDAwIC0gMjExOTk5ICB8ICAgICAgICAyMi4wNSAtIDQ4LjAwICB8ICAgICAzMi4wMCAgfCA0CisgICAgICAgICAgICAgICAgICAgfCAyMTIwMDAgLSAyNTYwMDAgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDMyLjAwICB8IDQKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tCitFTEQgKyBTQlIgICAgICAgICAgfCAxMzAwMDAgLSAxNzE5OTkgIHwgICAgICAgIDIyLjA1IC0gMjQuMDAgIHwgICAgIDI0LjAwICB8Cis1LCA1LjEgKGRvd25zYW1wbGVkIFNCUikgIHwgMTcyMDAwIC0gMjM5OTk5ICB8ICAgICAgICAyMi4wNSAtIDMyLjAwICB8ICAgICAzMi4wMAorfCA1LCA1LjEgfCAyNDAwMDAgLSAzMjAwMDAgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDMyLjAwICB8IDUsIDUuMQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFxlbmR2ZXJiYXRpbSBcbgogCitcc3Vic2VjdGlvbiByZW9tbWVuZGVkQ29uZmlnRUxEdjIgQUFDLUVMRCB2MiwgQUFDLUVMRCB2MiB3aXRoIFNCUi4KK1RoZSBFTEQgdjIgMjEyIGNvbmZpZ3VyYXRpb24gbXVzdCBiZSBjb25maWd1cmVkIGV4cGxpY2l0bHkgd2l0aAorOjpBQUNFTkNfQ0hBTk5FTE1PREUgcGFyYW1ldGVyIGFjY29yZGluZyBNT0RFXzIxMiB2YWx1ZS4gU0JSIGNhbiBiZSBjb25maWd1cmVkCitzZXBhcmF0ZWx5IHRocm91Z2ggOjpBQUNFTkNfU0JSX01PREUgYW5kIDo6QUFDRU5DX1NCUl9SQVRJTyBwYXJhbWV0ZXIuIEZvbGxvd2luZworY29uZmlndXJhdGlvbnMgc2hhbGwgYXBwbHkgdG8gYm90aCBmcmFtZWxlbmd0aHMgNDgwIGFuZCA1MTIuIEZvciBFTEQgdjIKK2NvbmZpZ3VyYXRpb24gd2l0aG91dCBTQlIgYW5kIGZyYW1lbGVuZ3RoIDQ4MCB0aGUgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGUgaXMKK3Jlc3RyaWN0ZWQgdG8gdGhlIHJhbmdlIGZyb20gMTYga0h6IHVwIHRvIDI0IGtIei4gXHZlcmJhdGltCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQXVkaW8gT2JqZWN0IFR5cGUgIHwgIEJpdCBSYXRlIFJhbmdlICB8ICAgICAgICAgICAgU3VwcG9ydGVkICB8IFByZWZlcnJlZCAgfCBOby4KK29mIHwgICAgICAgICBbYml0L3NdICB8ICAgICAgIFNhbXBsaW5nIFJhdGVzICB8ICAgIFNhbXBsLiAgfCAgQ2hhbi4gfAorfCAgICAgICAgICAgICAgICBba0h6XSAgfCAgICAgIFJhdGUgIHwgfCAgICAgICAgICAgICAgICAgIHwKK3wgICAgIFtrSHpdICB8CistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLQorRUxELTIxMiAgICAgICAgICAgIHwgIDE2MDAwIC0gIDE5OTk5ICB8ICAgICAgICAxNi4wMCAtIDI0LjAwICB8ICAgICAxNi4wMCAgfCAyCisod2l0aG91dCBTQlIpICAgICAgfCAgMjAwMDAgLSAgMzk5OTkgIHwgICAgICAgIDE2LjAwIC0gMzIuMDAgIHwgICAgIDI0LjAwICB8IDIKKyAgICAgICAgICAgICAgICAgICB8ICA0MDAwMCAtICA0OTk5OSAgfCAgICAgICAgMjIuMDUgLSAzMi4wMCAgfCAgICAgMzIuMDAgIHwgMgorICAgICAgICAgICAgICAgICAgIHwgIDUwMDAwIC0gIDYxOTk5ICB8ICAgICAgICAyNC4wMCAtIDQ0LjEwICB8ICAgICAzMi4wMCAgfCAyCisgICAgICAgICAgICAgICAgICAgfCAgNjIwMDAgLSAgODQ5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ0LjEwICB8IDIKKyAgICAgICAgICAgICAgICAgICB8ICA4NTAwMCAtIDE5MjAwMCAgfCAgICAgICAgNDQuMTAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgMgorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KK0VMRC0yMTIgKyBTQlIgICAgICB8ICAxODAwMCAtICAyMDk5OSAgfCAgICAgICAgICAgICAgICAzMi4wMCAgfCAgICAgMzIuMDAgIHwgMgorKGR1YWxyYXRlIFNCUikgICAgIHwgIDIxMDAwIC0gIDI1OTk5ICB8ICAgICAgICAzMi4wMCAtIDQ0LjEwICB8ICAgICAzMi4wMCAgfCAyCisgICAgICAgICAgICAgICAgICAgfCAgMjYwMDAgLSAgMzE5OTkgIHwgICAgICAgIDMyLjAwIC0gNDguMDAgIHwgICAgIDQ0LjEwICB8IDIKKyAgICAgICAgICAgICAgICAgICB8ICAzMjAwMCAtICA2NDAwMCAgfCAgICAgICAgMzIuMDAgLSA0OC4wMCAgfCAgICAgNDguMDAgIHwgMgorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KK0VMRC0yMTIgKyBTQlIgICAgICB8ICAxODAwMCAtICAxOTk5OSAgfCAgICAgICAgMTYuMDAgLSAyMi4wNSAgfCAgICAgMjIuMDUgIHwgMgorKGRvd25zYW1wbGVkIFNCUikgIHwgIDIwMDAwIC0gIDI0OTk5ICB8ICAgICAgICAxNi4wMCAtIDI0LjAwICB8ICAgICAyMi4wNSAgfCAyCisgICAgICAgICAgICAgICAgICAgfCAgMjUwMDAgLSAgMzE5OTkgIHwgICAgICAgIDE2LjAwIC0gMjQuMDAgIHwgICAgIDI0LjAwICB8IDIKKyAgICAgICAgICAgICAgICAgICB8ICAzMjAwMCAtICA2NDAwMCAgfCAgICAgICAgMjQuMDAgLSAyNC4wMCAgfCAgICAgMjQuMDAgIHwgMgorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0KK1xlbmR2ZXJiYXRpbSBcbgogCiBccGFnZSBFTkNPREVSQkVIQVZJT1VSIEVuY29kZXIgQmVoYXZpb3VyCiAKIFxzZWN0aW9uIEJFSEFWSU9VUl9CQU5EV0lEVEggQmFuZHdpZHRoCiAKLVRoZSBGREsgQUFDIGVuY29kZXIgdXN1YWxseSBkb2VzIG5vdCB1c2UgdGhlIGZ1bGwgZnJlcXVlbmN5IHJhbmdlIG9mIHRoZSBpbnB1dCBzaWduYWwsIGJ1dCByZXN0cmljdHMgdGhlIGJhbmR3aWR0aAotYWNjb3JkaW5nIHRvIGNlcnRhaW4gbGlicmFyeS1pbnRlcm5hbCBzZXR0aW5ncy4gVGhleSBjYW4gYmUgY2hhbmdlZCBpbiB0aGUgdGFibGUgImJhbmRXaWR0aFRhYmxlIiBpbiB0aGUKLWZpbGUgYmFuZHdpZHRoLmNwcCAoaWYgYXZhaWxhYmxlKS4KK1RoZSBGREsgQUFDIGVuY29kZXIgdXN1YWxseSBkb2VzIG5vdCB1c2UgdGhlIGZ1bGwgZnJlcXVlbmN5IHJhbmdlIG9mIHRoZSBpbnB1dAorc2lnbmFsLCBidXQgcmVzdHJpY3RzIHRoZSBiYW5kd2lkdGggYWNjb3JkaW5nIHRvIGNlcnRhaW4gbGlicmFyeS1pbnRlcm5hbAorc2V0dGluZ3MuIFRoZXkgY2FuIGJlIGNoYW5nZWQgaW4gdGhlIHRhYmxlICJiYW5kV2lkdGhUYWJsZSIgaW4gdGhlIGZpbGUKK2JhbmR3aWR0aC5jcHAgKGlmIGF2YWlsYWJsZSkuCiAKLVRoZSBlbmNvZGVyIEFQSSBwcm92aWRlcyB0aGUgOjpBQUNFTkNfQkFORFdJRFRIIHBhcmFtZXRlciB0byBhZGp1c3QgdGhlIGJhbmR3aWR0aCBleHBsaWNpdGx5LgotXGNvZGUKLWFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19CQU5EV0lEVEgsIHZhbHVlKTsKLVxlbmRjb2RlCitUaGUgZW5jb2RlciBBUEkgcHJvdmlkZXMgdGhlIDo6QUFDRU5DX0JBTkRXSURUSCBwYXJhbWV0ZXIgdG8gYWRqdXN0IHRoZQorYmFuZHdpZHRoIGV4cGxpY2l0bHkuIFxjb2RlIGFhY0VuY29kZXJfU2V0UGFyYW0oaEFhY0VuY29kZXIsIEFBQ0VOQ19CQU5EV0lEVEgsCit2YWx1ZSk7IFxlbmRjb2RlCiAKLUhvd2V2ZXIgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGNoYW5nZSB0aGVzZSBzZXR0aW5ncywgYmVjYXVzZSB0aGV5IGFyZSBiYXNlZCBvbiBudW1lcmlvdXMgbGlzdGVuaW5nCi10ZXN0cyBhbmQgY2FyZWZ1bCB0d2Vha3MgdG8gZW5zdXJlIHRoZSBiZXN0IG92ZXJhbGwgZW5jb2RpbmcgcXVhbGl0eS4KK0hvd2V2ZXIgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGNoYW5nZSB0aGVzZSBzZXR0aW5ncywgYmVjYXVzZSB0aGV5IGFyZSBiYXNlZAorb24gbnVtZXJvdXMgbGlzdGVuaW5nIHRlc3RzIGFuZCBjYXJlZnVsIHR3ZWFrcyB0byBlbnN1cmUgdGhlIGJlc3Qgb3ZlcmFsbAorZW5jb2RpbmcgcXVhbGl0eS4gQWxzbywgdGhlIG1heGltdW0gYmFuZHdpZHRoIHRoYXQgY2FuIGJlIHNldCBtYW51YWxseSBieSB0aGUKK3VzZXIgaXMgMjBrSHogb3IgZnMvMiwgd2hpY2hldmVyIHZhbHVlIGlzIHNtYWxsZXIuCiAKLVRoZW9yZXRpY2FsbHkgYSBzaWduYWwgb2YgZm9yIGV4YW1wbGUgNDgga0h6IGNhbiBjb250YWluIGZyZXF1ZW5jaWVzIHVwIHRvIDI0IGtIeiwgYnV0IHRvIHVzZSB0aGlzIGZ1bGwgcmFuZ2UKLWluIGFuIGF1ZGlvIGVuY29kZXIgdXN1YWxseSBkb2VzIG5vdCBtYWtlIHNlbnNlLiBVc3VhbGx5IHRoZSBlbmNvZGVyIGhhcyBhIHZlcnkgbGltaXRlZCBhbW91bnQgb2YKLWJpdHMgdG8gc3BlbmQgKHR5cGljYWxseSAxMjgga2JpdC9zIGZvciBzdGVyZW8gNDgga0h6IGNvbnRlbnQpIGFuZCB0byBhbGxvdyBmdWxsIHJhbmdlIGJhbmR3aWR0aCB3b3VsZAotd2FzdGUgYSBsb3Qgb2YgdGhlc2UgYml0cyBmb3IgZnJlcXVlbmNpZXMgdGhlIGh1bWFuIGVhciBpcyBoYXJkbHkgYWJsZSB0byBwZXJjZWl2ZSBhbnl3YXksIGlmIGF0IGFsbC4gSGVuY2UgaXQKLWlzIHdpc2UgdG8gdXNlIHRoZSBhdmFpbGFibGUgYml0cyBmb3IgdGhlIHJlYWxseSBpbXBvcnRhbnQgZnJlcXVlbmN5IHJhbmdlIGFuZCBqdXN0IHNraXAgdGhlIHJlc3QuCi1BdCBsb3dlciBiaXRyYXRlcyAoZS4gZy4gPD0gODAga2JpdC9zIGZvciBzdGVyZW8gNDgga0h6IGNvbnRlbnQpIHRoZSBlbmNvZGVyIHdpbGwgY2hvb3NlIGFuIGV2ZW4gc21hbGxlcgotYmFuZHdpZHRoLCBiZWNhdXNlIGFuIGVuY29kZWQgc2lnbmFsIHdpdGggc21hbGxlciBiYW5kd2lkdGggYW5kIGhlbmNlIGxlc3MgYXJ0aWZhY3RzIHNvdW5kcyBiZXR0ZXIgdGhhbiBhIHNpZ25hbAotd2l0aCBoaWdoZXIgYmFuZHdpZHRoIGJ1dCB0aGVuIG1vcmUgY29kaW5nIGFydGVmYWN0cyBhY3Jvc3MgYWxsIGZyZXF1ZW5jaWVzLiBUaGVzZSBhcnRlZmFjdHMgd291bGQgb2NjdXIgaWYKLXNtYWxsIGJpdHJhdGVzIGFuZCBoaWdoIGJhbmR3aWR0aHMgYXJlIGNob3NlbiBiZWNhdXNlIHRoZSBhdmFpbGFibGUgYml0cyBhcmUganVzdCBub3QgZW5vdWdoIHRvIGVuY29kZSBhbGwKLWZyZXF1ZW5jaWVzIHdlbGwuCitUaGVvcmV0aWNhbGx5IGEgc2lnbmFsIG9mIGZvciBleGFtcGxlIDQ4IGtIeiBjYW4gY29udGFpbiBmcmVxdWVuY2llcyB1cCB0byAyNAora0h6LCBidXQgdG8gdXNlIHRoaXMgZnVsbCByYW5nZSBpbiBhbiBhdWRpbyBlbmNvZGVyIHVzdWFsbHkgZG9lcyBub3QgbWFrZSBzZW5zZS4KK1VzdWFsbHkgdGhlIGVuY29kZXIgaGFzIGEgdmVyeSBsaW1pdGVkIGFtb3VudCBvZiBiaXRzIHRvIHNwZW5kICh0eXBpY2FsbHkgMTI4CitrYml0L3MgZm9yIHN0ZXJlbyA0OCBrSHogY29udGVudCkgYW5kIHRvIGFsbG93IGZ1bGwgcmFuZ2UgYmFuZHdpZHRoIHdvdWxkIHdhc3RlCithIGxvdCBvZiB0aGVzZSBiaXRzIGZvciBmcmVxdWVuY2llcyB0aGUgaHVtYW4gZWFyIGlzIGhhcmRseSBhYmxlIHRvIHBlcmNlaXZlCithbnl3YXksIGlmIGF0IGFsbC4gSGVuY2UgaXQgaXMgd2lzZSB0byB1c2UgdGhlIGF2YWlsYWJsZSBiaXRzIGZvciB0aGUgcmVhbGx5CitpbXBvcnRhbnQgZnJlcXVlbmN5IHJhbmdlIGFuZCBqdXN0IHNraXAgdGhlIHJlc3QuIEF0IGxvd2VyIGJpdHJhdGVzIChlLiBnLiA8PSA4MAora2JpdC9zIGZvciBzdGVyZW8gNDgga0h6IGNvbnRlbnQpIHRoZSBlbmNvZGVyIHdpbGwgY2hvb3NlIGFuIGV2ZW4gc21hbGxlcgorYmFuZHdpZHRoLCBiZWNhdXNlIGFuIGVuY29kZWQgc2lnbmFsIHdpdGggc21hbGxlciBiYW5kd2lkdGggYW5kIGhlbmNlIGxlc3MKK2FydGlmYWN0cyBzb3VuZHMgYmV0dGVyIHRoYW4gYSBzaWduYWwgd2l0aCBoaWdoZXIgYmFuZHdpZHRoIGJ1dCB0aGVuIG1vcmUgY29kaW5nCithcnRlZmFjdHMgYWNyb3NzIGFsbCBmcmVxdWVuY2llcy4gVGhlc2UgYXJ0ZWZhY3RzIHdvdWxkIG9jY3VyIGlmIHNtYWxsIGJpdHJhdGVzCithbmQgaGlnaCBiYW5kd2lkdGhzIGFyZSBjaG9zZW4gYmVjYXVzZSB0aGUgYXZhaWxhYmxlIGJpdHMgYXJlIGp1c3Qgbm90IGVub3VnaCB0bworZW5jb2RlIGFsbCBmcmVxdWVuY2llcyB3ZWxsLgogCi1VbmZvcnR1bmF0ZWx5IHNvbWUgcGVvcGxlIGV2YWx1YXRlIGVuY29kaW5nIHF1YWxpdHkgYmFzZWQgb24gcG9zc2libGUgYmFuZHdpZHRoIGFzIHdlbGwsIGJ1dCBpdCBpcyBhIHR3by1zaWRlZAotc3dvcmQgY29uc2lkZXJpbmcgdGhlIHRyYWRlLW9mZiBkZXNjcmliZWQgYWJvdmUuCitVbmZvcnR1bmF0ZWx5IHNvbWUgcGVvcGxlIGV2YWx1YXRlIGVuY29kaW5nIHF1YWxpdHkgYmFzZWQgb24gcG9zc2libGUgYmFuZHdpZHRoCithcyB3ZWxsLCBidXQgaXQgaXMgYSBkb3VibGUtZWRnZWQgc3dvcmQgY29uc2lkZXJpbmcgdGhlIHRyYWRlLW9mZiBkZXNjcmliZWQKK2Fib3ZlLgogCi1Bbm90aGVyIGFzcGVjdCBpcyB3b3JrbG9hZCBjb25zdW1wdGlvbi4gVGhlIGhpZ2hlciB0aGUgYWxsb3dlZCBiYW5kd2lkdGgsIHRoZSBtb3JlIGZyZXF1ZW5jeSBsaW5lcyBoYXZlIHRvIGJlCi1wcm9jZXNzZWQsIHdoaWNoIGluIHR1cm4gaW5jcmVhc2VzIHRoZSB3b3JrbG9hZC4KK0Fub3RoZXIgYXNwZWN0IGlzIHdvcmtsb2FkIGNvbnN1bXB0aW9uLiBUaGUgaGlnaGVyIHRoZSBhbGxvd2VkIGJhbmR3aWR0aCwgdGhlCittb3JlIGZyZXF1ZW5jeSBsaW5lcyBoYXZlIHRvIGJlIHByb2Nlc3NlZCwgd2hpY2ggaW4gdHVybiBpbmNyZWFzZXMgdGhlIHdvcmtsb2FkLgogCiBcc2VjdGlvbiBGUkFNRVNJWkVTX0FORF9CSVRfUkVTRVJWT0lSIEZyYW1lIFNpemVzICYgQml0IFJlc2Vydm9pcgogCiBGb3IgQUFDIHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGNvbnN0YW50IGJpdCByYXRlIGFuZCBjb25zdGFudCBmcmFtZQotbGVuZ3RoIGR1ZSB0byB0aGUgc28tY2FsbGVkIGJpdCByZXNlcnZvaXIgdGVjaG5pcXVlLCB3aGljaCBhbGxvd3MgdGhlIGVuY29kZXIgdG8gdXNlIGxlc3MKLWJpdHMgaW4gYW4gQUFDIGZyYW1lIGZvciB0aG9zZSBhdWRpbyBzaWduYWwgc2VjdGlvbnMgd2hpY2ggYXJlIGVhc3kgdG8gZW5jb2RlLAotYW5kIHRoZW4gc3BlbmQgdGhlbSBhdCBhIGxhdGVyIHBvaW50IGluCi10aW1lIGZvciBtb3JlIGNvbXBsZXggYXVkaW8gc2VjdGlvbnMuIFRoZSBleHRlbnQgdG8gd2hpY2ggdGhpcyAiYml0IGV4Y2hhbmdlIgotaXMgZG9uZSBpcyBsaW1pdGVkIHRvIGFsbG93IGZvciByZWxpYWJsZSBhbmQgcmVsYXRpdmVseSBsb3cgZGVsYXkgcmVhbCB0aW1lCi1zdHJlYW1pbmcuCitsZW5ndGggZHVlIHRvIHRoZSBzby1jYWxsZWQgYml0IHJlc2Vydm9pciB0ZWNobmlxdWUsIHdoaWNoIGFsbG93cyB0aGUgZW5jb2RlciB0bwordXNlIGxlc3MgYml0cyBpbiBhbiBBQUMgZnJhbWUgZm9yIHRob3NlIGF1ZGlvIHNpZ25hbCBzZWN0aW9ucyB3aGljaCBhcmUgZWFzeSB0bworZW5jb2RlLCBhbmQgdGhlbiBzcGVuZCB0aGVtIGF0IGEgbGF0ZXIgcG9pbnQgaW4gdGltZSBmb3IgbW9yZSBjb21wbGV4IGF1ZGlvCitzZWN0aW9ucy4gVGhlIGV4dGVudCB0byB3aGljaCB0aGlzICJiaXQgZXhjaGFuZ2UiIGlzIGRvbmUgaXMgbGltaXRlZCB0byBhbGxvdworZm9yIHJlbGlhYmxlIGFuZCByZWxhdGl2ZWx5IGxvdyBkZWxheSByZWFsIHRpbWUgc3RyZWFtaW5nLiBUaGVyZWZvcmUsIGZvcgorQUFDLUVMRCwgdGhlIGJpdHJlc2Vydm9pciBpcyBsaW1pdGVkLiBJdCB2YXJpZXMgYmV0d2VlbiA1MDAgYW5kIDQwMDAgYml0cy9mcmFtZSwKK2RlcGVuZGluZyBvbiB0aGUgYml0cmF0ZS9jaGFubmVsLgorLSBGb3IgYSBiaXRyYXRlIG9mIDEya2Jwcy9jaGFubmVsIGFuZCBiZWxvdywgdGhlIEFBQy1FTEQgYml0cmVzZXJ2b2lyIGlzIDUwMAorYml0cy9mcmFtZS4KKy0gRm9yIGEgYml0cmF0ZSBvZiA3MGticHMvY2hhbm5lbCBhbmQgYWJvdmUsIHRoZSBBQUMtRUxEIGJpdHJlc2Vydm9pciBpcyA0MDAwCitiaXRzL2ZyYW1lLgorLSBCZXR3ZWVuIDEya2Jwcy9jaGFubmVsIGFuZCA3MGticHMvY2hhbm5lbCwgdGhlIEFBQy1FTEQgYml0cmVydm9pciBpcyBpbmNyZWFzZWQKK2xpbmVhcmx5LgorLSBGb3IgQUFDLUxDLCB0aGUgYml0cmF0ZSBpcyBvbmx5IGxpbWl0ZWQgYnkgdGhlIG1heGltdW0gQUFDIGZyYW1lIGxlbmd0aC4gSXQKK2lzLCByZWdhcmRsZXNzIG9mIHRoZSBhdmFpbGFibGUgYml0IHJlc2Vydm9pciwgZGVmaW5lZCBhcyA2MTQ0IGJpdHMgcGVyIGNoYW5uZWwuCisKIE92ZXIgYSBsb25nZXIgcGVyaW9kIGluIHRpbWUgdGhlIGJpdHJhdGUgd2lsbCBiZSBjb25zdGFudCBpbiB0aGUgQUFDIGNvbnN0YW50CiBiaXRyYXRlIG1vZGUsIGUuZy4gZm9yIElTRE4gdHJhbnNtaXNzaW9uLiBUaGlzIG1lYW5zIHRoYXQgaW4gQUFDIGVhY2ggYml0c3RyZWFtCiBmcmFtZSB3aWxsIGluIGdlbmVyYWwgaGF2ZSBhIGRpZmZlcmVudCBsZW5ndGggaW4gYnl0ZXMgYnV0IG92ZXIgdGltZSBpdAotd2lsbCByZWFjaCB0aGUgdGFyZ2V0IGJpdHJhdGUuIE9uZSBjb3VsZCBhbHNvIG1ha2UgYW4gTVBFRyBjb21wbGlhbnQKK3dpbGwgcmVhY2ggdGhlIHRhcmdldCBiaXRyYXRlLgorCisKK09uZSBjb3VsZCBhbHNvIG1ha2UgYW4gTVBFRyBjb21wbGlhbnQKIEFBQyBlbmNvZGVyIHdoaWNoIGFsd2F5cyBwcm9kdWNlcyBjb25zdGFudCBsZW5ndGggcGFja2FnZXMgZm9yIGVhY2ggQUFDIGZyYW1lLAogYnV0IHRoZSBhdWRpbyBxdWFsaXR5IHdvdWxkIGJlIGNvbnNpZGVyYWJseSB3b3JzZSBzaW5jZSB0aGUgYml0IHJlc2Vydm9pcgogdGVjaG5pcXVlIHdvdWxkIGhhdmUgdG8gYmUgc3dpdGNoZWQgb2ZmIGNvbXBsZXRlbHkuIEEgaGlnaGVyIGJpdCByYXRlIHdvdWxkIGhhdmUKIHRvIGJlIHVzZWQgdG8gZ2V0IHRoZSBzYW1lIGF1ZGlvIHF1YWxpdHkgYXMgd2l0aCBhbiBlbmFibGVkIGJpdCByZXNlcnZvaXIuCiAKLVRoZSBtYXhpbXVtIEFBQyBmcmFtZSBsZW5ndGgsIHJlZ2FyZGxlc3Mgb2YgdGhlIGF2YWlsYWJsZSBiaXQgcmVzZXJ2b2lyLCBpcyBkZWZpbmVkCi1hcyA2MTQ0IGJpdHMgcGVyIGNoYW5uZWwuCi0KIEZvciBtcDMgYnkgdGhlIHdheSwgdGhlIHNhbWUgYml0IHJlc2Vydm9pciB0ZWNobmlxdWUgZXhpc3RzLCBidXQgdGhlcmUgZWFjaCBiaXQKIHN0cmVhbSBmcmFtZSBoYXMgYSBjb25zdGFudCBsZW5ndGggZm9yIGEgZ2l2ZW4gYml0IHJhdGUgKGlnbm9yaW5nIHRoZQogcGFkZGluZyBieXRlKS4gSW4gbXAzIHRoZXJlIGlzIGEgc28tY2FsbGVkICJiYWNrIHBvaW50ZXIiIHdoaWNoIHRlbGxzCkBAIC02NTMsOCArOTY4LDggQEAKIFxzdWJzZWN0aW9uIEJFSEFWSU9VUl9FU1RJTV9BVkdfRlJBTUVTSVpFUyBFc3RpbWF0aW5nIEF2ZXJhZ2UgRnJhbWUgU2l6ZXMKIAogQSBIRS1BQUMgdjEgb3IgdjIgYXVkaW8gZnJhbWUgY29udGFpbnMgMjA0OCBQQ00gc2FtcGxlcyBwZXIgY2hhbm5lbCAodGhlcmUgaXMKLWFsc28gb25lIG1vZGUgd2l0aCAxOTIwIHNhbXBsZXMgcGVyIGNoYW5uZWwgYnV0IHRoaXMgaXMgb25seSBmb3Igc3BlY2lhbCBwdXJwb3Nlcwotc3VjaCBhcyBEQUIrIGRpZ2l0YWwgcmFkaW8pLgorYWxzbyBvbmUgbW9kZSB3aXRoIDE5MjAgc2FtcGxlcyBwZXIgY2hhbm5lbCBidXQgdGhpcyBpcyBvbmx5IGZvciBzcGVjaWFsCitwdXJwb3NlcyBzdWNoIGFzIERBQisgZGlnaXRhbCByYWRpbykuCiAKIFRoZSBudW1iZXIgb2YgSEUtQUFDIGZyYW1lcyBcZiROXF9GUkFNRVNcZiQgcGVyIHNlY29uZCBhdCA0NC4xIGtIeiBpczoKIApAQCAtNjYyLDcgKzk3Nyw4IEBACiBOXF9GUkFNRVMgPSA0NDEwMCAvIDIwNDggPSAyMS41MzMyCiBcZl0KIAotQXQgYSBiaXQgcmF0ZSBvZiA4IGticHMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGJpdHMgcGVyIGZyYW1lIFxmJE5cX0JJVFNcX1BFUlxfRlJBTUVcZiQgaXM6CitBdCBhIGJpdCByYXRlIG9mIDgga2JwcyB0aGUgYXZlcmFnZSBudW1iZXIgb2YgYml0cyBwZXIgZnJhbWUKK1xmJE5cX0JJVFNcX1BFUlxfRlJBTUVcZiQgaXM6CiAKIFxmWwogTlxfQklUU1xfUEVSXF9GUkFNRSA9IDgwMDAgLyAyMS41MzMyID0gMzcxLjUyCkBAIC02NzAsNyArOTg2LDggQEAKIAogd2hpY2ggaXMgYWJvdXQgNDYuNDQgYnl0ZXMgcGVyIGVuY29kZWQgZnJhbWUuCiAKLUF0IGEgYml0IHJhdGUgb2YgMzIga2Jwcywgd2hpY2ggaXMgcXVpdGUgaGlnaCBmb3Igc2luZ2xlIGNoYW5uZWwgSEUtQUFDIHYxLCBpdCBpczoKK0F0IGEgYml0IHJhdGUgb2YgMzIga2Jwcywgd2hpY2ggaXMgcXVpdGUgaGlnaCBmb3Igc2luZ2xlIGNoYW5uZWwgSEUtQUFDIHYxLCBpdAoraXM6CiAKIFxmWwogTlxfQklUU1xfUEVSXF9GUkFNRSA9IDMyMDAwIC8gMjEuNTMzMiA9IDE0ODYKQEAgLTY3OCwzODUgKzk5NSw1NTEgQEAKIAogd2hpY2ggaXMgYWJvdXQgMTg1Ljc2IGJ5dGVzIHBlciBlbmNvZGVkIGZyYW1lLgogCi1UaGVzZSBiaXRzL2ZyYW1lIGZpZ3VyZXMgYXJlIGF2ZXJhZ2UgZmlndXJlcyB3aGVyZSBlYWNoIEFBQyBmcmFtZSBnZW5lcmFsbHkgaGFzIGEgZGlmZmVyZW50Ci1zaXplIGluIGJ5dGVzLiBUbyBjYWxjdWxhdGUgdGhlIHNhbWUgZm9yIEFBQy1MQyBqdXN0IHVzZSAxMDI0IGluc3RlYWQgb2YgMjA0OCBQQ00gc2FtcGxlcyBwZXIKLWZyYW1lIGFuZCBjaGFubmVsLgotRm9yIEFBQy1MRC9FTEQgaXQgaXMgZWl0aGVyIDQ4MCBvciA1MTIgUENNIHNhbXBsZXMgcGVyIGZyYW1lIGFuZCBjaGFubmVsLgorVGhlc2UgYml0cy9mcmFtZSBmaWd1cmVzIGFyZSBhdmVyYWdlIGZpZ3VyZXMgd2hlcmUgZWFjaCBBQUMgZnJhbWUgZ2VuZXJhbGx5IGhhcworYSBkaWZmZXJlbnQgc2l6ZSBpbiBieXRlcy4gVG8gY2FsY3VsYXRlIHRoZSBzYW1lIGZvciBBQUMtTEMganVzdCB1c2UgMTAyNAoraW5zdGVhZCBvZiAyMDQ4IFBDTSBzYW1wbGVzIHBlciBmcmFtZSBhbmQgY2hhbm5lbC4gRm9yIEFBQy1MRC9FTEQgaXQgaXMgZWl0aGVyCis0ODAgb3IgNTEyIFBDTSBzYW1wbGVzIHBlciBmcmFtZSBhbmQgY2hhbm5lbC4KIAogCiBcc2VjdGlvbiBCRUhBVklPVVJfVE9PTFMgRW5jb2RlciBUb29scwogCi1UaGUgQUFDIGVuY29kZXIgc3VwcG9ydHMgVE5TLCBQTlMsIE1TLCBJbnRlbnNpdHkgYW5kIGFjdGl2YXRlcyB0aGVzZSB0b29scyBkZXBlbmRpbmcgb24gdGhlIGF1ZGlvIHNpZ25hbCBhbmQKLXRoZSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gKGkuZS4gYml0cmF0ZSBvciBBT1QpLiBJdCBpcyBub3QgcmVxdWlyZWQgdG8gY29uZmlndXJlIHRoZXNlIHRvb2xzIG1hbnVhbGx5LgorVGhlIEFBQyBlbmNvZGVyIHN1cHBvcnRzIFROUywgUE5TLCBNUywgSW50ZW5zaXR5IGFuZCBhY3RpdmF0ZXMgdGhlc2UgdG9vbHMKK2RlcGVuZGluZyBvbiB0aGUgYXVkaW8gc2lnbmFsIGFuZCB0aGUgZW5jb2RlciBjb25maWd1cmF0aW9uIChpLmUuIGJpdHJhdGUgb3IKK0FPVCkuIEl0IGlzIG5vdCByZXF1aXJlZCB0byBjb25maWd1cmUgdGhlc2UgdG9vbHMgbWFudWFsbHkuCiAKLVBOUyBpbXByb3ZlcyBlbmNvZGluZyBxdWFsaXR5IG9ubHkgZm9yIGNlcnRhaW4gYml0cmF0ZXMuIFRoZXJlZm9yZSBpdCBtYWtlcyBzZW5zZSB0byBhY3RpdmF0ZSBQTlMgb25seSBmb3IKLXRoZXNlIGJpdHJhdGVzIGFuZCBzYXZlIHRoZSBwcm9jZXNzaW5nIHBvd2VyIHJlcXVpcmVkIGZvciBQTlMgKGFib3V0IDEwICUgb2YgdGhlIGVuY29kZXIpIHdoZW4gdXNpbmcgb3RoZXIKLWJpdHJhdGVzLiBUaGlzIGlzIGRvbmUgYXV0b21hdGljYWxseSBpbnNpZGUgdGhlIGVuY29kZXIgbGlicmFyeS4gUE5TIGlzIGRpc2FibGVkIGluc2lkZSB0aGUgZW5jb2RlciBsaWJyYXJ5IGlmCi1hbiBNUEVHLTIgQU9UIGlzIGNob29zZW4gc2luY2UgUE5TIGlzIGFuIE1QRUctNCBBQUMgZmVhdHVyZS4KK1BOUyBpbXByb3ZlcyBlbmNvZGluZyBxdWFsaXR5IG9ubHkgZm9yIGNlcnRhaW4gYml0cmF0ZXMuIFRoZXJlZm9yZSBpdCBtYWtlcworc2Vuc2UgdG8gYWN0aXZhdGUgUE5TIG9ubHkgZm9yIHRoZXNlIGJpdHJhdGVzIGFuZCBzYXZlIHRoZSBwcm9jZXNzaW5nIHBvd2VyCityZXF1aXJlZCBmb3IgUE5TIChhYm91dCAxMCAlIG9mIHRoZSBlbmNvZGVyKSB3aGVuIHVzaW5nIG90aGVyIGJpdHJhdGVzLiBUaGlzIGlzCitkb25lIGF1dG9tYXRpY2FsbHkgaW5zaWRlIHRoZSBlbmNvZGVyIGxpYnJhcnkuIFBOUyBpcyBkaXNhYmxlZCBpbnNpZGUgdGhlCitlbmNvZGVyIGxpYnJhcnkgaWYgYW4gTVBFRy0yIEFPVCBpcyBjaG9vc2VuIHNpbmNlIFBOUyBpcyBhbiBNUEVHLTQgQUFDIGZlYXR1cmUuCiAKLUlmIFNCUiBpcyBhY3RpdmF0ZWQsIHRoZSBlbmNvZGVyIGF1dG9tYXRpY2FsbHkgZGVhY3RpdmF0ZXMgUE5TIGludGVybmFsbHkuIElmIFROUyBpcyBkaXNhYmxlZCBidXQgUE5TIGlzIGFsbG93ZWQsCi10aGUgZW5jb2RlciBkZWFjdGl2YXRlcyBQTlMgY2FsY3VsYXRpb24gaW50ZXJuYWxseS4KK0lmIFNCUiBpcyBhY3RpdmF0ZWQsIHRoZSBlbmNvZGVyIGF1dG9tYXRpY2FsbHkgZGVhY3RpdmF0ZXMgUE5TIGludGVybmFsbHkuIElmCitUTlMgaXMgZGlzYWJsZWQgYnV0IFBOUyBpcyBhbGxvd2VkLCB0aGUgZW5jb2RlciBkZWFjdGl2YXRlcyBQTlMgY2FsY3VsYXRpb24KK2ludGVybmFsbHkuCiAKICovCiAKLSNpZm5kZWYgX0FBQ19FTkNfTElCX0hfCi0jZGVmaW5lIF9BQUNfRU5DX0xJQl9IXworI2lmbmRlZiBBQUNFTkNfTElCX0gKKyNkZWZpbmUgQUFDRU5DX0xJQl9ICiAKICNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKICNpbmNsdWRlICJGREtfYXVkaW8uaCIKIAotCiAvKioKICAqICBBQUMgZW5jb2RlciBlcnJvciBjb2Rlcy4KICAqLwogdHlwZWRlZiBlbnVtIHsKLSAgICBBQUNFTkNfT0sgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMCwgIC8qITwgTm8gZXJyb3IgaGFwcGVuZWQuIEFsbCBmaW5lLiAqLworICBBQUNFTkNfT0sgPSAweDAwMDAsIC8qITwgTm8gZXJyb3IgaGFwcGVuZWQuIEFsbCBmaW5lLiAqLwogCi0gICAgQUFDRU5DX0lOVkFMSURfSEFORExFICAgICAgICAgPSAweDAwMjAsICAvKiE8IEhhbmRsZSBwYXNzZWQgdG8gZnVuY3Rpb24gY2FsbCB3YXMgaW52YWxpZC4gKi8KLSAgICBBQUNFTkNfTUVNT1JZX0VSUk9SICAgICAgICAgICA9IDB4MDAyMSwgIC8qITwgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiAqLwotICAgIEFBQ0VOQ19VTlNVUFBPUlRFRF9QQVJBTUVURVIgID0gMHgwMDIyLCAgLyohPCBQYXJhbWV0ZXIgbm90IGF2YWlsYWJsZS4gKi8KLSAgICBBQUNFTkNfSU5WQUxJRF9DT05GSUcgICAgICAgICA9IDB4MDAyMywgIC8qITwgQ29uZmlndXJhdGlvbiBub3QgcHJvdmlkZWQuICovCisgIEFBQ0VOQ19JTlZBTElEX0hBTkRMRSA9CisgICAgICAweDAwMjAsIC8qITwgSGFuZGxlIHBhc3NlZCB0byBmdW5jdGlvbiBjYWxsIHdhcyBpbnZhbGlkLiAqLworICBBQUNFTkNfTUVNT1JZX0VSUk9SID0gMHgwMDIxLCAgICAgICAgICAvKiE8IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gKi8KKyAgQUFDRU5DX1VOU1VQUE9SVEVEX1BBUkFNRVRFUiA9IDB4MDAyMiwgLyohPCBQYXJhbWV0ZXIgbm90IGF2YWlsYWJsZS4gKi8KKyAgQUFDRU5DX0lOVkFMSURfQ09ORklHID0gMHgwMDIzLCAgICAgICAgLyohPCBDb25maWd1cmF0aW9uIG5vdCBwcm92aWRlZC4gKi8KIAotICAgIEFBQ0VOQ19JTklUX0VSUk9SICAgICAgICAgICAgID0gMHgwMDQwLCAgLyohPCBHZW5lcmFsIGluaXRpYWxpemF0aW9uIGVycm9yLiAqLwotICAgIEFBQ0VOQ19JTklUX0FBQ19FUlJPUiAgICAgICAgID0gMHgwMDQxLCAgLyohPCBBQUMgbGlicmFyeSBpbml0aWFsaXphdGlvbiBlcnJvci4gKi8KLSAgICBBQUNFTkNfSU5JVF9TQlJfRVJST1IgICAgICAgICA9IDB4MDA0MiwgIC8qITwgU0JSIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gZXJyb3IuICovCi0gICAgQUFDRU5DX0lOSVRfVFBfRVJST1IgICAgICAgICAgPSAweDAwNDMsICAvKiE8IFRyYW5zcG9ydCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGVycm9yLiAqLwotICAgIEFBQ0VOQ19JTklUX01FVEFfRVJST1IgICAgICAgID0gMHgwMDQ0LCAgLyohPCBNZXRhIGRhdGEgbGlicmFyeSBpbml0aWFsaXphdGlvbiBlcnJvci4gKi8KKyAgQUFDRU5DX0lOSVRfRVJST1IgPSAweDAwNDAsICAgICAvKiE8IEdlbmVyYWwgaW5pdGlhbGl6YXRpb24gZXJyb3IuICovCisgIEFBQ0VOQ19JTklUX0FBQ19FUlJPUiA9IDB4MDA0MSwgLyohPCBBQUMgbGlicmFyeSBpbml0aWFsaXphdGlvbiBlcnJvci4gKi8KKyAgQUFDRU5DX0lOSVRfU0JSX0VSUk9SID0gMHgwMDQyLCAvKiE8IFNCUiBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGVycm9yLiAqLworICBBQUNFTkNfSU5JVF9UUF9FUlJPUiA9IDB4MDA0MywgLyohPCBUcmFuc3BvcnQgbGlicmFyeSBpbml0aWFsaXphdGlvbiBlcnJvci4gKi8KKyAgQUFDRU5DX0lOSVRfTUVUQV9FUlJPUiA9CisgICAgICAweDAwNDQsIC8qITwgTWV0YSBkYXRhIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gZXJyb3IuICovCisgIEFBQ0VOQ19JTklUX01QU19FUlJPUiA9IDB4MDA0NSwgLyohPCBNUFMgbGlicmFyeSBpbml0aWFsaXphdGlvbiBlcnJvci4gKi8KIAotICAgIEFBQ0VOQ19FTkNPREVfRVJST1IgICAgICAgICAgID0gMHgwMDYwLCAgLyohPCBUaGUgZW5jb2RpbmcgcHJvY2VzcyB3YXMgaW50ZXJydXB0ZWQgYnkgYW4gdW5leHBlY3RlZCBlcnJvci4gKi8KKyAgQUFDRU5DX0VOQ09ERV9FUlJPUiA9IDB4MDA2MCwgLyohPCBUaGUgZW5jb2RpbmcgcHJvY2VzcyB3YXMgaW50ZXJydXB0ZWQgYnkgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZCBlcnJvci4gKi8KIAotICAgIEFBQ0VOQ19FTkNPREVfRU9GICAgICAgICAgICAgID0gMHgwMDgwICAgLyohPCBFbmQgb2YgZmlsZSByZWFjaGVkLiAqLworICBBQUNFTkNfRU5DT0RFX0VPRiA9IDB4MDA4MCAvKiE8IEVuZCBvZiBmaWxlIHJlYWNoZWQuICovCiAKIH0gQUFDRU5DX0VSUk9SOwogCi0KIC8qKgogICogIEFBQyBlbmNvZGVyIGJ1ZmZlciBkZXNjcmlwdG9ycyBpZGVudGlmaWVyLgotICogIFRoaXMgaWRlbnRpZmllciBhcmUgdXNlZCB3aXRoaW4gYnVmZmVyIGRlc2NyaXB0b3JzIEFBQ0VOQ19CdWZEZXNjOjpidWZmZXJJZGVudGlmaWVycy4KKyAqICBUaGlzIGlkZW50aWZpZXIgYXJlIHVzZWQgd2l0aGluIGJ1ZmZlciBkZXNjcmlwdG9ycworICogQUFDRU5DX0J1ZkRlc2M6OmJ1ZmZlcklkZW50aWZpZXJzLgogICovCiB0eXBlZGVmIGVudW0gewotICAgIC8qIElucHV0IGJ1ZmZlciBpZGVudGlmaWVyLiAqLwotICAgIElOX0FVRElPX0RBVEEgICAgICA9IDAsICAgICAgICAgICAgICAgICAgLyohPCBBdWRpbyBpbnB1dCBidWZmZXIsIGludGVybGVhdmVkIElOVF9QQ00gc2FtcGxlcy4gKi8KLSAgICBJTl9BTkNJTExSWV9EQVRBICAgPSAxLCAgICAgICAgICAgICAgICAgIC8qITwgQW5jaWxsYXJ5IGRhdGEgdG8gYmUgZW1iZWRkZWQgaW50byBiaXRzdHJlYW0uICovCi0gICAgSU5fTUVUQURBVEFfU0VUVVAgID0gMiwgICAgICAgICAgICAgICAgICAvKiE8IFNldHVwIHN0cnVjdHVyZSBmb3IgZW1iZWRkaW5nIG1ldGEgZGF0YS4gKi8KKyAgLyogSW5wdXQgYnVmZmVyIGlkZW50aWZpZXIuICovCisgIElOX0FVRElPX0RBVEEgPSAwLCAgICAvKiE8IEF1ZGlvIGlucHV0IGJ1ZmZlciwgaW50ZXJsZWF2ZWQgSU5UX1BDTSBzYW1wbGVzLiAqLworICBJTl9BTkNJTExSWV9EQVRBID0gMSwgLyohPCBBbmNpbGxhcnkgZGF0YSB0byBiZSBlbWJlZGRlZCBpbnRvIGJpdHN0cmVhbS4gKi8KKyAgSU5fTUVUQURBVEFfU0VUVVAgPSAyLCAvKiE8IFNldHVwIHN0cnVjdHVyZSBmb3IgZW1iZWRkaW5nIG1ldGEgZGF0YS4gKi8KIAotICAgIC8qIE91dHB1dCBidWZmZXIgaWRlbnRpZmllci4gKi8KLSAgICBPVVRfQklUU1RSRUFNX0RBVEEgPSAzLCAgICAgICAgICAgICAgICAgIC8qITwgQnVmZmVyIGhvbGRzIGJpdHN0cmVhbSBvdXRwdXQgZGF0YS4gKi8KLSAgICBPVVRfQVVfU0laRVMgICAgICAgPSA0ICAgICAgICAgICAgICAgICAgIC8qITwgQnVmZmVyIGNvbnRhaW5zIHNpemVzIG9mIGVhY2ggYWNjZXNzIHVuaXQuIFRoaXMgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbmVjZXNzYXJ5IGZvciBzdXBlcmZyYW1pbmcuICovCisgIC8qIE91dHB1dCBidWZmZXIgaWRlbnRpZmllci4gKi8KKyAgT1VUX0JJVFNUUkVBTV9EQVRBID0gMywgLyohPCBCdWZmZXIgaG9sZHMgYml0c3RyZWFtIG91dHB1dCBkYXRhLiAqLworICBPVVRfQVVfU0laRVMgPQorICAgICAgNCAvKiE8IEJ1ZmZlciBjb250YWlucyBzaXplcyBvZiBlYWNoIGFjY2VzcyB1bml0LiBUaGlzIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgaXMgbmVjZXNzYXJ5IGZvciBzdXBlcmZyYW1pbmcuICovCiAKIH0gQUFDRU5DX0J1ZmZlcklkZW50aWZpZXI7CiAKLQogLyoqCiAgKiAgQUFDIGVuY29kZXIgaGFuZGxlLgogICovCiB0eXBlZGVmIHN0cnVjdCBBQUNFTkNPREVSICpIQU5ETEVfQUFDRU5DT0RFUjsKIAotCiAvKioKICAqICBQcm92aWRlcyBzb21lIGluZm8gYWJvdXQgdGhlIGVuY29kZXIgY29uZmlndXJhdGlvbi4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgeworICBVSU5UIG1heE91dEJ1ZkJ5dGVzOyAvKiE8IE1heGltdW0gbnVtYmVyIG9mIGVuY29kZXIgYml0c3RyZWFtIGJ5dGVzIHdpdGhpbiBvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuIFNpemUgZGVwZW5kcyBvbiBtYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgaW4gZW5jb2RlciBpbnN0YW5jZS4gRm9yIHN1cGVyZnJhbWluZyAoYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBmb3IgZXhhbXBsZSBpbiBEQUIrKSwgc2l6ZSBoYXMgdG8gYmUgYSBtdWx0aXBsZQorICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvcmRpbmdseS4gKi8KIAotICAgIFVJTlQgICAgICAgICAgICAgICAgbWF4T3V0QnVmQnl0ZXM7ICAgICAgLyohPCBNYXhpbXVtIG51bWJlciBvZiBlbmNvZGVyIGJpdHN0cmVhbSBieXRlcyB3aXRoaW4gb25lIGZyYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplIGRlcGVuZHMgb24gbWF4aW11bSBudW1iZXIgb2Ygc3VwcG9ydGVkIGNoYW5uZWxzIGluIGVuY29kZXIgaW5zdGFuY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBzdXBlcmZyYW1pbmcgKGFzIHVzZWQgZm9yIGV4YW1wbGUgaW4gREFCKyksIHNpemUgaGFzIHRvIGJlIGEgbXVsdGlwbGUgYWNjb3JkaW5nbHkuICovCisgIFVJTlQgbWF4QW5jQnl0ZXM7IC8qITwgTWF4aW11bSBudW1iZXIgb2YgYW5jaWxsYXJ5IGRhdGEgYnl0ZXMgd2hpY2ggY2FuIGJlCisgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGVkIGludG8gYml0c3RyZWFtIHdpdGhpbiBvbmUgZnJhbWUuICovCiAKLSAgICBVSU5UICAgICAgICAgICAgICAgIG1heEFuY0J5dGVzOyAgICAgICAgIC8qITwgTWF4aW11bSBudW1iZXIgb2YgYW5jaWxsYXJ5IGRhdGEgYnl0ZXMgd2hpY2ggY2FuIGJlIGluc2VydGVkIGludG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtIHdpdGhpbiBvbmUgZnJhbWUuICovCisgIFVJTlQgaW5CdWZGaWxsTGV2ZWw7IC8qITwgSW50ZXJuYWwgaW5wdXQgYnVmZmVyIGZpbGwgbGV2ZWwgaW4gc2FtcGxlcyBwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC4gVGhpcyBwYXJhbWV0ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNsZWFyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2FtcGxpbmdyYXRlIG9yIGNoYW5uZWwoTW9kZS9PcmRlcikgY2hhbmdlcy4gKi8KIAotICAgIFVJTlQgICAgICAgICAgICAgICAgaW5CdWZGaWxsTGV2ZWw7ICAgICAgLyohPCBJbnRlcm5hbCBpbnB1dCBidWZmZXIgZmlsbCBsZXZlbCBpbiBzYW1wbGVzIHBlciBjaGFubmVsLiBUaGlzIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2xlYXJlZCBpZiBzYW1wbGluZ3JhdGUgb3IgY2hhbm5lbChNb2RlL09yZGVyKSBjaGFuZ2VzLiAqLworICBVSU5UIGlucHV0Q2hhbm5lbHM7IC8qITwgTnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzIGV4cGVjdGVkIGluIGVuY29kaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy4gKi8KIAotICAgIFVJTlQgICAgICAgICAgICAgICAgaW5wdXRDaGFubmVsczsgICAgICAgLyohPCBOdW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMgZXhwZWN0ZWQgaW4gZW5jb2RpbmcgcHJvY2Vzcy4gKi8KKyAgVUlOVCBmcmFtZUxlbmd0aDsgLyohPCBBbW91bnQgb2YgaW5wdXQgYXVkaW8gc2FtcGxlcyBjb25zdW1lZCBlYWNoIGZyYW1lIHBlcgorICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLCBkZXBlbmRpbmcgb24gYXVkaW8gb2JqZWN0IHR5cGUgY29uZmlndXJhdGlvbi4gKi8KIAotICAgIFVJTlQgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGg7ICAgICAgICAgLyohPCBBbW91bnQgb2YgaW5wdXQgYXVkaW8gc2FtcGxlcyBjb25zdW1lZCBlYWNoIGZyYW1lIHBlciBjaGFubmVsLCBkZXBlbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gYXVkaW8gb2JqZWN0IHR5cGUgY29uZmlndXJhdGlvbi4gKi8KKyAgVUlOVCBuRGVsYXk7IC8qITwgQ29kZWMgZGVsYXkgaW4gUENNIHNhbXBsZXMvY2hhbm5lbC4gRGVwZW5kcyBvbiBmcmFtZWxlbmd0aAorICAgICAgICAgICAgICAgICAgYW5kIEFPVC4gRG9lcyBub3QgaW5jbHVkZSBmcmFtaW5nIGRlbGF5IGZvciBmaWxsaW5nIHVwIGVuY29kZXIKKyAgICAgICAgICAgICAgICAgIFBDTSBpbnB1dCBidWZmZXIuICovCiAKLSAgICBVSU5UICAgICAgICAgICAgICAgIGVuY29kZXJEZWxheTsgICAgICAgIC8qITwgQ29kZWMgZGVsYXkgaW4gUENNIHNhbXBsZXMvY2hhbm5lbC4gRGVwZW5kcyBvbiBmcmFtZWxlbmd0aCBhbmQgQU9ULiBEb2VzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIGZyYW1pbmcgZGVsYXkgZm9yIGZpbGxpbmcgdXAgZW5jb2RlciBQQ00gaW5wdXQgYnVmZmVyLiAqLworICBVSU5UIG5EZWxheUNvcmU7IC8qITwgQ29kZWMgZGVsYXkgaW4gUENNIHNhbXBsZXMvY2hhbm5lbCwgdy9vIGRlbGF5IGNhdXNlZCBieQorICAgICAgICAgICAgICAgICAgICAgIHRoZSBkZWNvZGVyIFNCUiBtb2R1bGUuIFRoaXMgZGVsYXkgaXMgbmVlZGVkIHRvIGNvcnJlY3RseQorICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIGVkaXQgbGlzdHMgZm9yIGdhcGxlc3MgcGxheWJhY2suIFRoZSBkZWNvZGVyIG1heSBub3QKKyAgICAgICAgICAgICAgICAgICAgICBrbm93IGhvdyBtdWNoIGRlbGF5IGlzIGludHJvZGN1ZWQgYnkgU0JSLCBzaW5jZSBpdCBtYXkgbm90CisgICAgICAgICAgICAgICAgICAgICAga25vdyBpZiBTQlIgaXMgYWN0aXZlIGF0IGFsbCAoaW1wbGljaXQgc2lnbmFsaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICB0aGVyZWZvcmUgdGhlIGRlb2NkZXIgbXVzdCB0YWtlIGludG8gYWNjb3VudCBhbnkgZGVsYXkKKyAgICAgICAgICAgICAgICAgICAgICBjYXVzZWQgYnkgdGhlIFNCUiBtb2R1bGUuICovCiAKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIGNvbmZCdWZbNjRdOyAgICAgICAgIC8qITwgQ29uZmlndXJhdGlvbiBidWZmZXIgaW4gYmluYXJ5IGZvcm1hdCBhcyBhbiBBdWRpb1NwZWNpZmljQ29uZmlnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIFN0cmVhbU11eENvbmZpZyBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIHRyYW5zcG9ydCB0eXBlLiAqLworICBVQ0hBUiBjb25mQnVmWzY0XTsgLyohPCBDb25maWd1cmF0aW9uIGJ1ZmZlciBpbiBiaW5hcnkgZm9ybWF0IGFzIGFuCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1NwZWNpZmljQ29uZmlnIG9yIFN0cmVhbU11eENvbmZpZyBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCB0cmFuc3BvcnQgdHlwZS4gKi8KIAotICAgIFVJTlQgICAgICAgICAgICAgICAgY29uZlNpemU7ICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdmFsaWQgYnl0ZXMgaW4gY29uZkJ1Zi4gKi8KKyAgVUlOVCBjb25mU2l6ZTsgLyohPCBOdW1iZXIgb2YgdmFsaWQgYnl0ZXMgaW4gY29uZkJ1Zi4gKi8KIAogfSBBQUNFTkNfSW5mb1N0cnVjdDsKIAotCiAvKioKICAqICBEZXNjcmliZXMgdGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBmb3IgYW4gYWFjRW5jRW5jb2RlKCkgY2FsbC4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgewotICAgIElOVCAgICAgICAgICAgICAgICAgbnVtQnVmczsgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYnVmZmVycy4gKi8KLSAgICB2b2lkICAgICAgICAgICAgICAqKmJ1ZnM7ICAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byB2ZWN0b3IgY29udGFpbmluZyBidWZmZXIgYWRkcmVzc2VzLiAqLwotICAgIElOVCAgICAgICAgICAgICAgICAqYnVmZmVySWRlbnRpZmllcnM7ICAgLyohPCBJZGVudGlmaWVyIG9mIGVhY2ggYnVmZmVyIGVsZW1lbnQuIFNlZSA6OkFBQ0VOQ19CdWZmZXJJZGVudGlmaWVyLiAqLwotICAgIElOVCAgICAgICAgICAgICAgICAqYnVmU2l6ZXM7ICAgICAgICAgICAgLyohPCBTaXplIG9mIGVhY2ggYnVmZmVyIGluIDgtYml0IGJ5dGVzLiAqLwotICAgIElOVCAgICAgICAgICAgICAgICAqYnVmRWxTaXplczsgICAgICAgICAgLyohPCBTaXplIG9mIGVhY2ggYnVmZmVyIGVsZW1lbnQgaW4gYnl0ZXMuICovCisgIElOVCBudW1CdWZzOyAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGJ1ZmZlcnMuICovCisgIHZvaWQgKipidWZzOyAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byB2ZWN0b3IgY29udGFpbmluZyBidWZmZXIgYWRkcmVzc2VzLiAqLworICBJTlQgKmJ1ZmZlcklkZW50aWZpZXJzOyAvKiE8IElkZW50aWZpZXIgb2YgZWFjaCBidWZmZXIgZWxlbWVudC4gU2VlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6QUFDRU5DX0J1ZmZlcklkZW50aWZpZXIuICovCisgIElOVCAqYnVmU2l6ZXM7ICAgICAgICAgIC8qITwgU2l6ZSBvZiBlYWNoIGJ1ZmZlciBpbiA4LWJpdCBieXRlcy4gKi8KKyAgSU5UICpidWZFbFNpemVzOyAgICAgICAgLyohPCBTaXplIG9mIGVhY2ggYnVmZmVyIGVsZW1lbnQgaW4gYnl0ZXMuICovCiAKIH0gQUFDRU5DX0J1ZkRlc2M7CiAKLQogLyoqCiAgKiAgRGVmaW5lcyB0aGUgaW5wdXQgYXJndW1lbnRzIGZvciBhbiBhYWNFbmNFbmNvZGUoKSBjYWxsLgogICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgSU5UICAgICAgICAgICAgICAgICBudW1JblNhbXBsZXM7ICAgICAgICAvKiE8IE51bWJlciBvZiB2YWxpZCBpbnB1dCBhdWRpbyBzYW1wbGVzIChtdWx0aXBsZSBvZiBpbnB1dCBjaGFubmVscykuICovCi0gICAgSU5UICAgICAgICAgICAgICAgICBudW1BbmNCeXRlczsgICAgICAgICAvKiE8IE51bWJlciBvZiBhbmNpbGxhcnkgZGF0YSBieXRlcyB0byBiZSBlbmNvZGVkLiAqLworICBJTlQgbnVtSW5TYW1wbGVzOyAvKiE8IE51bWJlciBvZiB2YWxpZCBpbnB1dCBhdWRpbyBzYW1wbGVzIChtdWx0aXBsZSBvZiBpbnB1dAorICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscykuICovCisgIElOVCBudW1BbmNCeXRlczsgIC8qITwgTnVtYmVyIG9mIGFuY2lsbGFyeSBkYXRhIGJ5dGVzIHRvIGJlIGVuY29kZWQuICovCiAKIH0gQUFDRU5DX0luQXJnczsKIAotCiAvKioKICAqICBEZWZpbmVzIHRoZSBvdXRwdXQgYXJndW1lbnRzIGZvciBhbiBhYWNFbmNFbmNvZGUoKSBjYWxsLgogICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgSU5UICAgICAgICAgICAgICAgICBudW1PdXRCeXRlczsgICAgICAgICAvKiE8IE51bWJlciBvZiB2YWxpZCBiaXRzdHJlYW0gYnl0ZXMgZ2VuZXJhdGVkIGR1cmluZyBhYWNFbmNFbmNvZGUoKS4gKi8KLSAgICBJTlQgICAgICAgICAgICAgICAgIG51bUluU2FtcGxlczsgICAgICAgIC8qITwgTnVtYmVyIG9mIGlucHV0IGF1ZGlvIHNhbXBsZXMgY29uc3VtZWQgYnkgdGhlIGVuY29kZXIuICovCi0gICAgSU5UICAgICAgICAgICAgICAgICBudW1BbmNCeXRlczsgICAgICAgICAvKiE8IE51bWJlciBvZiBhbmNpbGxhcnkgZGF0YSBieXRlcyBjb25zdW1lZCBieSB0aGUgZW5jb2Rlci4gKi8KKyAgSU5UIG51bU91dEJ5dGVzOyAgLyohPCBOdW1iZXIgb2YgdmFsaWQgYml0c3RyZWFtIGJ5dGVzIGdlbmVyYXRlZCBkdXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgYWFjRW5jRW5jb2RlKCkuICovCisgIElOVCBudW1JblNhbXBsZXM7IC8qITwgTnVtYmVyIG9mIGlucHV0IGF1ZGlvIHNhbXBsZXMgY29uc3VtZWQgYnkgdGhlIGVuY29kZXIuCisgICAgICAgICAgICAgICAgICAgICAqLworICBJTlQgbnVtQW5jQnl0ZXM7ICAvKiE8IE51bWJlciBvZiBhbmNpbGxhcnkgZGF0YSBieXRlcyBjb25zdW1lZCBieSB0aGUgZW5jb2Rlci4KKyAgICAgICAgICAgICAgICAgICAgICovCisgIElOVCBiaXRSZXNTdGF0ZTsgIC8qITwgU3RhdGUgb2YgdGhlIGJpdCByZXNlcnZvaXIgaW4gYml0cy4gKi8KIAogfSBBQUNFTkNfT3V0QXJnczsKIAotCiAvKioKICAqICBNZXRhIERhdGEgQ29tcHJlc3Npb24gUHJvZmlsZXMuCiAgKi8KIHR5cGVkZWYgZW51bSB7Ci0gICAgQUFDRU5DX01FVEFEQVRBX0RSQ19OT05FICAgICAgICAgID0gMCwgICAvKiE8IE5vbmUuICovCi0gICAgQUFDRU5DX01FVEFEQVRBX0RSQ19GSUxNU1RBTkRBUkQgID0gMSwgICAvKiE8IEZpbG0gc3RhbmRhcmQuICovCi0gICAgQUFDRU5DX01FVEFEQVRBX0RSQ19GSUxNTElHSFQgICAgID0gMiwgICAvKiE8IEZpbG0gbGlnaHQuICovCi0gICAgQUFDRU5DX01FVEFEQVRBX0RSQ19NVVNJQ1NUQU5EQVJEID0gMywgICAvKiE8IE11c2ljIHN0YW5kYXJkLiAqLwotICAgIEFBQ0VOQ19NRVRBREFUQV9EUkNfTVVTSUNMSUdIVCAgICA9IDQsICAgLyohPCBNdXNpYyBsaWdodC4gKi8KLSAgICBBQUNFTkNfTUVUQURBVEFfRFJDX1NQRUVDSCAgICAgICAgPSA1ICAgIC8qITwgU3BlZWNoLiAqLworICBBQUNFTkNfTUVUQURBVEFfRFJDX05PTkUgPSAwLCAgICAgICAgICAvKiE8IE5vbmUuICovCisgIEFBQ0VOQ19NRVRBREFUQV9EUkNfRklMTVNUQU5EQVJEID0gMSwgIC8qITwgRmlsbSBzdGFuZGFyZC4gKi8KKyAgQUFDRU5DX01FVEFEQVRBX0RSQ19GSUxNTElHSFQgPSAyLCAgICAgLyohPCBGaWxtIGxpZ2h0LiAqLworICBBQUNFTkNfTUVUQURBVEFfRFJDX01VU0lDU1RBTkRBUkQgPSAzLCAvKiE8IE11c2ljIHN0YW5kYXJkLiAqLworICBBQUNFTkNfTUVUQURBVEFfRFJDX01VU0lDTElHSFQgPSA0LCAgICAvKiE8IE11c2ljIGxpZ2h0LiAqLworICBBQUNFTkNfTUVUQURBVEFfRFJDX1NQRUVDSCA9IDUsICAgICAgICAvKiE8IFNwZWVjaC4gKi8KKyAgQUFDRU5DX01FVEFEQVRBX0RSQ19OT1RfUFJFU0VOVCA9CisgICAgICAyNTYgLyohPCBEaXNhYmxlIHdyaXRpbmcgZ2FpbiBmYWN0b3IgKHVzZWQgZm9yIGNvbXBfcHJvZmlsZSBvbmx5KS4gKi8KIAogfSBBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEU7CiAKLQogLyoqCiAgKiAgTWV0YSBEYXRhIHNldHVwIHN0cnVjdHVyZS4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgeworICBBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEUKKyAgZHJjX3Byb2ZpbGU7IC8qITwgTVBFRyBEUkMgY29tcHJlc3Npb24gcHJvZmlsZS4gU2VlCisgICAgICAgICAgICAgICAgICA6OkFBQ0VOQ19NRVRBREFUQV9EUkNfUFJPRklMRS4gKi8KKyAgQUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFCisgIGNvbXBfcHJvZmlsZTsgLyohPCBFVFNJIGhlYXZ5IGNvbXByZXNzaW9uIHByb2ZpbGUuIFNlZQorICAgICAgICAgICAgICAgICAgIDo6QUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFLiAqLwogCi0gIEFBQ0VOQ19NRVRBREFUQV9EUkNfUFJPRklMRSBkcmNfcHJvZmlsZTsgICAgICAgICAgICAgLyohPCBNUEVHIERSQyBjb21wcmVzc2lvbiBwcm9maWxlLiBTZWUgOjpBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEUuICovCi0gIEFBQ0VOQ19NRVRBREFUQV9EUkNfUFJPRklMRSBjb21wX3Byb2ZpbGU7ICAgICAgICAgICAgLyohPCBFVFNJIGhlYXZ5IGNvbXByZXNzaW9uIHByb2ZpbGUuIFNlZSA6OkFBQ0VOQ19NRVRBREFUQV9EUkNfUFJPRklMRS4gKi8KKyAgSU5UIGRyY19UYXJnZXRSZWZMZXZlbDsgIC8qITwgVXNlZCB0byBkZWZpbmUgZXhwZWN0ZWQgbGV2ZWwgdG86CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxlZCB3aXRoIDE2IGJpdC4geCoyXjE2LiAqLworICBJTlQgY29tcF9UYXJnZXRSZWZMZXZlbDsgLyohPCBBZGp1c3QgbGltaXRlciB0byBhdm9pZCBvdmVybG9hZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGVkIHdpdGggMTYgYml0LiB4KjJeMTYuICovCiAKLSAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgIGRyY19UYXJnZXRSZWZMZXZlbDsgICAgICAvKiE8IFVzZWQgdG8gZGVmaW5lIGV4cGVjdGVkIGxldmVsIHRvOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGVkIHdpdGggMTYgYml0LiB4KjJeMTYuICovCi0gIElOVCAgICAgICAgICAgICAgICAgICAgICAgICBjb21wX1RhcmdldFJlZkxldmVsOyAgICAgLyohPCBBZGp1c3QgbGltaXRlciB0byBhdm9pZCBvdmVybG9hZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxlZCB3aXRoIDE2IGJpdC4geCoyXjE2LiAqLworICBJTlQgcHJvZ19yZWZfbGV2ZWxfcHJlc2VudDsgLyohPCBGbGFnLCBpZiBwcm9nX3JlZl9sZXZlbCBpcyBwcmVzZW50ICovCisgIElOVCBwcm9nX3JlZl9sZXZlbDsgICAgICAgICAvKiE8IFByb2dyYW1tZSBSZWZlcmVuY2UgTGV2ZWwgPSBEaWFsb2d1ZSBMZXZlbDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMxLjc1ZEIgLi4gMCBkQiA7IHN0ZXBzaXplOiAwLjI1ZEIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGVkIHdpdGggMTYgYml0LiB4KjJeMTYuKi8KIAotICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ19yZWZfbGV2ZWxfcHJlc2VudDsgIC8qITwgRmxhZywgaWYgcHJvZ19yZWZfbGV2ZWwgaXMgcHJlc2VudCAqLwotICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ19yZWZfbGV2ZWw7ICAgICAgICAgIC8qITwgUHJvZ3JhbW1lIFJlZmVyZW5jZSBMZXZlbCA9IERpYWxvZ3VlIExldmVsOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMxLjc1ZEIgLi4gMCBkQiA7IHN0ZXBzaXplOiAwLjI1ZEIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxlZCB3aXRoIDE2IGJpdC4geCoyXjE2LiovCisgIFVDSEFSIFBDRV9taXhkb3duX2lkeF9wcmVzZW50OyAvKiE8IEZsYWcsIGlmIGRteC1pZHggc2hvdWxkIGJlIHdyaXR0ZW4gaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW1tZSBjb25maWcgZWxlbWVudCAqLworICBVQ0hBUiBFVFNJX0RteEx2bF9wcmVzZW50OyAgICAgLyohPCBGbGFnLCBpZiBkbXgtbHZsIHNob3VsZCBiZSB3cml0dGVuIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVFNJLWFuY0RhdGEgKi8KIAotICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgUENFX21peGRvd25faWR4X3ByZXNlbnQ7IC8qITwgRmxhZywgaWYgZG14LWlkeCBzaG91bGQgYmUgd3JpdHRlbiBpbiBwcm9ncmFtbWUgY29uZmlnIGVsZW1lbnQgKi8KLSAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgIEVUU0lfRG14THZsX3ByZXNlbnQ7ICAgICAvKiE8IEZsYWcsIGlmIGRteC1sdmwgc2hvdWxkIGJlIHdyaXR0ZW4gaW4gRVRTSS1hbmNEYXRhICovCisgIFNDSEFSIGNlbnRlck1peExldmVsOyAvKiE8IENlbnRlciBkb3dubWl4IGxldmVsICgwLi4uNywgYWNjb3JkaW5nIHRvIHRhYmxlKSAqLworICBTQ0hBUiBzdXJyb3VuZE1peExldmVsOyAvKiE8IFN1cnJvdW5kIGRvd25taXggbGV2ZWwgKDAuLi43LCBhY2NvcmRpbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUpICovCiAKLSAgU0NIQVIgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlck1peExldmVsOyAgICAgICAgICAvKiE8IENlbnRlciBkb3dubWl4IGxldmVsICgwLi4uNywgYWNjb3JkaW5nIHRvIHRhYmxlKSAqLwotICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgc3Vycm91bmRNaXhMZXZlbDsgICAgICAgIC8qITwgU3Vycm91bmQgZG93bm1peCBsZXZlbCAoMC4uLjcsIGFjY29yZGluZyB0byB0YWJsZSkgKi8KKyAgVUNIQVIKKyAgZG9sYnlTdXJyb3VuZE1vZGU7IC8qITwgSW5kaWNhdGlvbiBmb3IgRG9sYnkgU3Vycm91bmQgRW5jb2RpbmcgTW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBEb2xieSBTdXJyb3VuZCBtb2RlIG5vdCBpbmRpY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiAyLWNoIGF1ZGlvIHBhcnQgaXMgbm90IERvbGJ5IHN1cnJvdW5kIGVuY29kZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyOiAyLWNoIGF1ZGlvIHBhcnQgaXMgRG9sYnkgc3Vycm91bmQgZW5jb2RlZCAqLwogCi0gIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICBkb2xieVN1cnJvdW5kTW9kZTsgICAgICAgLyohPCBJbmRpY2F0aW9uIGZvciBEb2xieSBTdXJyb3VuZCBFbmNvZGluZyBNb2RlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBEb2xieSBTdXJyb3VuZCBtb2RlIG5vdCBpbmRpY2F0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogMi1jaCBhdWRpbyBwYXJ0IGlzIG5vdCBEb2xieSBzdXJyb3VuZCBlbmNvZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IDItY2ggYXVkaW8gcGFydCBpcyBEb2xieSBzdXJyb3VuZCBlbmNvZGVkICovCisgIFVDSEFSIGRyY1ByZXNlbnRhdGlvbk1vZGU7IC8qITwgSW5kaWNhdGluIGZvciBEUkMgUHJlc2VudGF0aW9uIE1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBQcmVzZW50YXRpb24gbW9kZSBub3QgaW50aWNhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBQcmVzZW50YXRpb24gbW9kZSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyOiBQcmVzZW50YXRpb24gbW9kZSAyICovCisKKyAgc3RydWN0IHsKKyAgICAvKiBleHRlbmRlZCBhbmNpbGxhcnkgZGF0YSAqLworICAgIFVDSEFSIGV4dEFuY0RhdGFFbmFibGU7IC8qPCBJbmRpY2F0ZXMgaWYgTVBFRzRfZXh0X2FuY2lsbGFyeV9kYXRhKCkgZXhpc3RzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IE5vIE1QRUc0X2V4dF9hbmNpbGxhcnlfZGF0YSgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IEluc2VydCBNUEVHNF9leHRfYW5jaWxsYXJ5X2RhdGEoKS4gKi8KKworICAgIFVDSEFSCisgICAgZXh0RG93bm1peExldmVsRW5hYmxlOyAgIC8qPCBJbmRpY2F0ZXMgaWYgZXh0X2Rvd25taXhpbmdfbGV2ZWxzKCkgZXhpc3RzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBObyBleHRfZG93bm1peGluZ19sZXZlbHMoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogSW5zZXJ0IGV4dF9kb3dubWl4aW5nX2xldmVscygpLiAqLworICAgIFVDSEFSIGV4dERvd25taXhMZXZlbF9BOyAvKjwgRG93bm1peCBsZXZlbCBpbmRleCBBICgwLi4uNywgYWNjb3JkaW5nIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlKSAqLworICAgIFVDSEFSIGV4dERvd25taXhMZXZlbF9COyAvKjwgRG93bm1peCBsZXZlbCBpbmRleCBCICgwLi4uNywgYWNjb3JkaW5nIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlKSAqLworCisgICAgVUNIQVIgZG14R2FpbkVuYWJsZTsgLyo8IEluZGljYXRlcyBpZiBleHRfZG93bm1peGluZ19nbG9iYWxfZ2FpbnMoKSBleGlzdHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogTm8gZXh0X2Rvd25taXhpbmdfZ2xvYmFsX2dhaW5zKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogSW5zZXJ0IGV4dF9kb3dubWl4aW5nX2dsb2JhbF9nYWlucygpLiAqLworICAgIElOVCBkbXhHYWluNTsgICAgICAgIC8qPCBHYWluIGZhY3RvciBmb3IgZG93bm1peCB0byA1IGNoYW5uZWxzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE1Ljc1ZEIgLi4gLTE1Ljc1ZEI7IHN0ZXBzaXplOiAwLjI1ZEIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxlZCB3aXRoIDE2IGJpdC4geCoyXjE2LiovCisgICAgSU5UIGRteEdhaW4yOyAgICAgICAgLyo8IEdhaW4gZmFjdG9yIGZvciBkb3dubWl4IHRvIDIgY2hhbm5lbHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTUuNzVkQiAuLiAtMTUuNzVkQjsgc3RlcHNpemU6IDAuMjVkQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGVkIHdpdGggMTYgYml0LiB4KjJeMTYuKi8KKworICAgIFVDSEFSIGxmZURteEVuYWJsZTsgLyo8IEluZGljYXRlcyBpZiBleHRfZG93bm1peGluZ19sZmVfbGV2ZWwoKSBleGlzdHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBObyBleHRfZG93bm1peGluZ19sZmVfbGV2ZWwoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IEluc2VydCBleHRfZG93bm1peGluZ19sZmVfbGV2ZWwoKS4gKi8KKyAgICBVQ0hBUiBsZmVEbXhMZXZlbDsgIC8qPCBEb3dubWl4IGxldmVsIGluZGV4IGZvciBMRkUgKDAuLjE1LCBhY2NvcmRpbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlKSAqLworCisgIH0gRXh0TWV0YURhdGE7CisKIH0gQUFDRU5DX01ldGFEYXRhOwogCi0KIC8qKgogICogQUFDIGVuY29kZXIgY29udHJvbCBmbGFncy4KICAqCi0gKiBJbiBpbnRlcmFjdGlvbiB3aXRoIHRoZSA6OkFBQ0VOQ19DT05UUk9MX1NUQVRFIHBhcmFtZXRlciBpdCBpcyBwb3NzaWJsZSB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVybmFsCi0gKiBpbml0aWFsaXphdGlvbiBwcm9jZXNzLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG92ZXJ3cml0ZSB0aGUgaW50ZXJuYWwgc3RhdGUgZnJvbSBleHRlcm4gd2hlbiBuZWNlc3NhcnkuCisgKiBJbiBpbnRlcmFjdGlvbiB3aXRoIHRoZSA6OkFBQ0VOQ19DT05UUk9MX1NUQVRFIHBhcmFtZXRlciBpdCBpcyBwb3NzaWJsZSB0bworICogZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnRlcm5hbCBpbml0aWFsaXphdGlvbiBwcm9jZXNzLiBJdCBpcyBhbHNvCisgKiBwb3NzaWJsZSB0byBvdmVyd3JpdGUgdGhlIGludGVybmFsIHN0YXRlIGZyb20gZXh0ZXJuIHdoZW4gbmVjZXNzYXJ5LgogICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBBQUNFTkNfSU5JVF9OT05FICAgICAgICAgICAgICA9IDB4MDAwMCwgIC8qITwgRG8gbm90IHRyaWdnZXIgaW5pdGlhbGl6YXRpb24uICovCi0gICAgQUFDRU5DX0lOSVRfQ09ORklHICAgICAgICAgICAgPSAweDAwMDEsICAvKiE8IEluaXRpYWxpemUgYWxsIGVuY29kZXIgbW9kdWxlcyBjb25maWd1cmF0aW9uLiAqLwotICAgIEFBQ0VOQ19JTklUX1NUQVRFUyAgICAgICAgICAgID0gMHgwMDAyLCAgLyohPCBSZXNldCBhbGwgZW5jb2RlciBtb2R1bGVzIGhpc3RvcnkgYnVmZmVyLiAqLwotICAgIEFBQ0VOQ19JTklUX1RSQU5TUE9SVCAgICAgICAgID0gMHgxMDAwLCAgLyohPCBJbml0aWFsaXplIHRyYW5zcG9ydCBsaWIgd2l0aCBuZXcgcGFyYW1ldGVycy4gKi8KLSAgICBBQUNFTkNfUkVTRVRfSU5CVUZGRVIgICAgICAgICA9IDB4MjAwMCwgIC8qITwgUmVzZXQgZmlsbCBsZXZlbCBvZiBpbnRlcm5hbCBpbnB1dCBidWZmZXIuICovCi0gICAgQUFDRU5DX0lOSVRfQUxMICAgICAgICAgICAgICAgPSAweEZGRkYgICAvKiE8IEluaXRpYWxpemUgYWxsLiAqLwotfQotQUFDRU5DX0NUUkxGTEFHUzsKLQordHlwZWRlZiBlbnVtIHsKKyAgQUFDRU5DX0lOSVRfTk9ORSA9IDB4MDAwMCwgLyohPCBEbyBub3QgdHJpZ2dlciBpbml0aWFsaXphdGlvbi4gKi8KKyAgQUFDRU5DX0lOSVRfQ09ORklHID0KKyAgICAgIDB4MDAwMSwgLyohPCBJbml0aWFsaXplIGFsbCBlbmNvZGVyIG1vZHVsZXMgY29uZmlndXJhdGlvbi4gKi8KKyAgQUFDRU5DX0lOSVRfU1RBVEVTID0gMHgwMDAyLCAvKiE8IFJlc2V0IGFsbCBlbmNvZGVyIG1vZHVsZXMgaGlzdG9yeSBidWZmZXIuICovCisgIEFBQ0VOQ19JTklUX1RSQU5TUE9SVCA9CisgICAgICAweDEwMDAsIC8qITwgSW5pdGlhbGl6ZSB0cmFuc3BvcnQgbGliIHdpdGggbmV3IHBhcmFtZXRlcnMuICovCisgIEFBQ0VOQ19SRVNFVF9JTkJVRkZFUiA9CisgICAgICAweDIwMDAsICAgICAgICAgICAgICAvKiE8IFJlc2V0IGZpbGwgbGV2ZWwgb2YgaW50ZXJuYWwgaW5wdXQgYnVmZmVyLiAqLworICBBQUNFTkNfSU5JVF9BTEwgPSAweEZGRkYgLyohPCBJbml0aWFsaXplIGFsbC4gKi8KK30gQUFDRU5DX0NUUkxGTEFHUzsKIAogLyoqCiAgKiBcYnJpZWYgIEFBQyBlbmNvZGVyIHNldHRpbmcgcGFyYW1ldGVycy4KICAqCi0gKiBVc2UgYWFjRW5jb2Rlcl9TZXRQYXJhbSgpIGZ1bmN0aW9uIHRvIGNvbmZpZ3VyZSwgb3IgdXNlIGFhY0VuY29kZXJfR2V0UGFyYW0oKSBmdW5jdGlvbiB0byByZWFkCi0gKiB0aGUgaW50ZXJuYWwgc3RhdHVzIG9mIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycy4KKyAqIFVzZSBhYWNFbmNvZGVyX1NldFBhcmFtKCkgZnVuY3Rpb24gdG8gY29uZmlndXJlLCBvciB1c2UgYWFjRW5jb2Rlcl9HZXRQYXJhbSgpCisgKiBmdW5jdGlvbiB0byByZWFkIHRoZSBpbnRlcm5hbCBzdGF0dXMgb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzLgogICovCi10eXBlZGVmIGVudW0KLXsKLSAgQUFDRU5DX0FPVCAgICAgICAgICAgICAgICAgICAgICA9IDB4MDEwMCwgIC8qITwgQXVkaW8gb2JqZWN0IHR5cGUuIFNlZSA6OkFVRElPX09CSkVDVF9UWVBFIGluIEZES19hdWRpby5oLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IE1QRUctNCBBQUMgTG93IENvbXBsZXhpdHkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gNTogTVBFRy00IEFBQyBMb3cgQ29tcGxleGl0eSB3aXRoIFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24gKEhFLUFBQykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjk6IE1QRUctNCBBQUMgTG93IENvbXBsZXhpdHkgd2l0aCBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uIGFuZCBQYXJhbWV0cmljIFN0ZXJlbyAoSEUtQUFDIHYyKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjb25maWd1cmF0aW9uIGNhbiBiZSB1c2VkIG9ubHkgd2l0aCBzdGVyZW8gaW5wdXQgYXVkaW8gZGF0YS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyMzogTVBFRy00IEFBQyBMb3ctRGVsYXkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMzk6IE1QRUctNCBBQUMgRW5oYW5jZWQgTG93LURlbGF5LiBTaW5jZSB0aGVyZSBpcyBubyA6OkFVRElPX09CSkVDVF9UWVBFIGZvciBFTEQgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluYXRpb24gd2l0aCBTQlIgZGVmaW5lZCwgZW5hYmxlIFNCUiBleHBsaWNpdGVseSBieSA6OkFBQ0VOQ19TQlJfTU9ERSBwYXJhbWV0ZXIuICovCit0eXBlZGVmIGVudW0geworICBBQUNFTkNfQU9UID0KKyAgICAgIDB4MDEwMCwgLyohPCBBdWRpbyBvYmplY3QgdHlwZS4gU2VlIDo6QVVESU9fT0JKRUNUX1RZUEUgaW4gRkRLX2F1ZGlvLmguCisgICAgICAgICAgICAgICAgICAgLSAyOiBNUEVHLTQgQUFDIExvdyBDb21wbGV4aXR5LgorICAgICAgICAgICAgICAgICAgIC0gNTogTVBFRy00IEFBQyBMb3cgQ29tcGxleGl0eSB3aXRoIFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24KKyAgICAgICAgICAgICAgICAgKEhFLUFBQykuCisgICAgICAgICAgICAgICAgICAgLSAyOTogTVBFRy00IEFBQyBMb3cgQ29tcGxleGl0eSB3aXRoIFNwZWN0cmFsIEJhbmQKKyAgICAgICAgICAgICAgICAgUmVwbGljYXRpb24gYW5kIFBhcmFtZXRyaWMgU3RlcmVvIChIRS1BQUMgdjIpLiBUaGlzCisgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHVzZWQgb25seSB3aXRoIHN0ZXJlbyBpbnB1dCBhdWRpbyBkYXRhLgorICAgICAgICAgICAgICAgICAgIC0gMjM6IE1QRUctNCBBQUMgTG93LURlbGF5LgorICAgICAgICAgICAgICAgICAgIC0gMzk6IE1QRUctNCBBQUMgRW5oYW5jZWQgTG93LURlbGF5LiBTaW5jZSB0aGVyZSBpcyBubworICAgICAgICAgICAgICAgICA6OkFVRElPX09CSkVDVF9UWVBFIGZvciBFTEQgaW4gY29tYmluYXRpb24gd2l0aCBTQlIgZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgZW5hYmxlIFNCUiBleHBsaWNpdGVseSBieSA6OkFBQ0VOQ19TQlJfTU9ERSBwYXJhbWV0ZXIuIFRoZSBFTEQKKyAgICAgICAgICAgICAgICAgdjIgMjEyIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGNvbmZpZ3VyZWQgYnkgOjpBQUNFTkNfQ0hBTk5FTE1PREUKKyAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLgorICAgICAgICAgICAgICAgICAgIC0gMTI5OiBNUEVHLTIgQUFDIExvdyBDb21wbGV4aXR5LgorICAgICAgICAgICAgICAgICAgIC0gMTMyOiBNUEVHLTIgQUFDIExvdyBDb21wbGV4aXR5IHdpdGggU3BlY3RyYWwgQmFuZAorICAgICAgICAgICAgICAgICBSZXBsaWNhdGlvbiAoSEUtQUFDKS4KIAotICBBQUNFTkNfQklUUkFURSAgICAgICAgICAgICAgICAgID0gMHgwMTAxLCAgLyohPCBUb3RhbCBlbmNvZGVyIGJpdHJhdGUuIFRoaXMgcGFyYW1ldGVyIGlzIG1hbmRhdG9yeSBhbmQgaW50ZXJhY3RzIHdpdGggOjpBQUNFTkNfQklUUkFURU1PREUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQ0JSOiBCaXRyYXRlIGluIGJpdHMvc2Vjb25kLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBccmVmIHN1cHBCaXRyYXRlcyBmb3IgZGV0YWlscy4gKi8KKyAgICAgICAgICAgICAgICAgICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSB2aXJ0dWFsIE1QRUctMiBBT1QncyBiYXNpY2FsbHkgZGlzYWJsZXMKKyAgICAgICAgICAgICAgICAgbm9uLWV4aXN0aW5nIFBlcmNlcHR1YWwgTm9pc2UgU3Vic3RpdHV0aW9uIHRvb2wgaW4gQUFDIGVuY29kZXIKKyAgICAgICAgICAgICAgICAgYW5kIGNvbnRyb2xzIHRoZSBNUEVHX0lEIGZsYWcgaW4gYWR0cyBoZWFkZXIuIFRoZSB2aXJ0dWFsCisgICAgICAgICAgICAgICAgIE1QRUctMiBBT1QgZG9lc24ndCBwcm9oaWJpdCBzcGVjaWZpYyB0cmFuc3BvcnQgZm9ybWF0cy4gKi8KIAotICBBQUNFTkNfQklUUkFURU1PREUgICAgICAgICAgICAgID0gMHgwMTAyLCAgLyohPCBCaXRyYXRlIG1vZGUuIENvbmZpZ3VyYXRpb24gY2FuIGJlIGRpZmZlcmVudCBraW5kIG9mIGJpdHJhdGUgY29uZmlndXJhdGlvbnM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogQ29uc3RhbnQgYml0cmF0ZSwgdXNlIGJpdHJhdGUgYWNjb3JkaW5nIHRvIDo6QUFDRU5DX0JJVFJBVEUuIChkZWZhdWx0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpdGhpbiBub25lIExEL0VMRCA6OkFVRElPX09CSkVDVF9UWVBFLCB0aGUgQ0JSIG1vZGUgbWFrZXMgdXNlIG9mIGZ1bGwgYWxsb3dlZCBiaXRyZXNlcnZvaXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gY29udHJhc3QsIGF0IExvdy1EZWxheSA6OkFVRElPX09CSkVDVF9UWVBFIHRoZSBiaXRyZXNlcnZvaXIgaXMga2VwdCB2ZXJ5IHNtYWxsLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDg6IExEL0VMRCBmdWxsIGJpdHJlc2Vydm9pciBmb3IgcGFja2V0IGJhc2VkIHRyYW5zbWlzc2lvbi4gKi8KKyAgQUFDRU5DX0JJVFJBVEUgPSAweDAxMDEsIC8qITwgVG90YWwgZW5jb2RlciBiaXRyYXRlLiBUaGlzIHBhcmFtZXRlciBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuZGF0b3J5IGFuZCBpbnRlcmFjdHMgd2l0aCA6OkFBQ0VOQ19CSVRSQVRFTU9ERS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBDQlI6IEJpdHJhdGUgaW4gYml0cy9zZWNvbmQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVkJSOiBWYXJpYWJsZSBiaXRyYXRlLiBCaXRyYXRlIGFyZ3VtZW50IHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGlnbm9yZWQuIFNlZSBccmVmIHN1cHBCaXRyYXRlcyBmb3IgZGV0YWlscy4gKi8KIAotICBBQUNFTkNfU0FNUExFUkFURSAgICAgICAgICAgICAgID0gMHgwMTAzLCAgLyohPCBBdWRpbyBpbnB1dCBkYXRhIHNhbXBsaW5nIHJhdGUuIEVuY29kZXIgc3VwcG9ydHMgZm9sbG93aW5nIHNhbXBsaW5nIHJhdGVzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAsIDY0MDAwLCA4ODIwMCwgOTYwMDAgKi8KKyAgQUFDRU5DX0JJVFJBVEVNT0RFID0gMHgwMTAyLCAvKiE8IEJpdHJhdGUgbW9kZS4gQ29uZmlndXJhdGlvbiBjYW4gYmUgZGlmZmVyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZCBvZiBiaXRyYXRlIGNvbmZpZ3VyYXRpb25zOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBDb25zdGFudCBiaXRyYXRlLCB1c2UgYml0cmF0ZSBhY2NvcmRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byA6OkFBQ0VOQ19CSVRSQVRFLiAoZGVmYXVsdCkgV2l0aGluIG5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRC9FTEQgOjpBVURJT19PQkpFQ1RfVFlQRSwgdGhlIENCUiBtb2RlIG1ha2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlIG9mIGZ1bGwgYWxsb3dlZCBiaXRyZXNlcnZvaXIuIEluIGNvbnRyYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IExvdy1EZWxheSA6OkFVRElPX09CSkVDVF9UWVBFIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJlc2Vydm9pciBpcyBrZXB0IHZlcnkgc21hbGwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IFZhcmlhYmxlIGJpdHJhdGUgbW9kZSwgXHJlZiB2YnJtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnkgbG93IGJpdHJhdGUiLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyOiBWYXJpYWJsZSBiaXRyYXRlIG1vZGUsIFxyZWYgdmJybW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb3cgYml0cmF0ZSIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDM6IFZhcmlhYmxlIGJpdHJhdGUgbW9kZSwgXHJlZiB2YnJtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lZGl1bSBiaXRyYXRlIi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gNDogVmFyaWFibGUgYml0cmF0ZSBtb2RlLCBccmVmIHZicm1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlnaCBiaXRyYXRlIi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gNTogVmFyaWFibGUgYml0cmF0ZSBtb2RlLCBccmVmIHZicm1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyeSBoaWdoIGJpdHJhdGUiLiAqLwogCi0gIEFBQ0VOQ19TQlJfTU9ERSAgICAgICAgICAgICAgICAgPSAweDAxMDQsICAvKiE8IENvbmZpZ3VyZSBTQlIgaW5kZXBlbmRlbnRseSBvZiB0aGUgY2hvc2VuIEF1ZGlvIE9iamVjdCBUeXBlIDo6QVVESU9fT0JKRUNUX1RZUEUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIGZvciBFTEQgYXVkaW8gb2JqZWN0IHR5cGUgb25seS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAtMTogVXNlIEVMRCBTQlIgYXV0byBjb25maWd1cmF0b3IgKGRlZmF1bHQpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IERpc2FibGUgU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBFbmFibGUgU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbi4gKi8KKyAgQUFDRU5DX1NBTVBMRVJBVEUgPSAweDAxMDMsIC8qITwgQXVkaW8gaW5wdXQgZGF0YSBzYW1wbGluZyByYXRlLiBFbmNvZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cyBmb2xsb3dpbmcgc2FtcGxpbmcgcmF0ZXM6IDgwMDAsIDExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLCA2NDAwMCwgODgyMDAsIDk2MDAwICovCiAKLSAgQUFDRU5DX0dSQU5VTEVfTEVOR1RIICAgICAgICAgICA9IDB4MDEwNSwgIC8qITwgQ29yZSBlbmNvZGVyIChBQUMpIGF1ZGlvIGZyYW1lIGxlbmd0aCBpbiBzYW1wbGVzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEwMjQ6IERlZmF1bHQgY29uZmlndXJhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSA1MTI6IERlZmF1bHQgTEQvRUxEIGNvbmZpZ3VyYXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gNDgwOiBPcHRpb25hbCBsZW5ndGggaW4gTEQvRUxEIGNvbmZpZ3VyYXRpb24uICovCisgIEFBQ0VOQ19TQlJfTU9ERSA9IDB4MDEwNCwgLyohPCBDb25maWd1cmUgU0JSIGluZGVwZW5kZW50bHkgb2YgdGhlIGNob3NlbiBBdWRpbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBUeXBlIDo6QVVESU9fT0JKRUNUX1RZUEUuIFRoaXMgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZm9yIEVMRCBhdWRpbyBvYmplY3QgdHlwZSBvbmx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAtMTogVXNlIEVMRCBTQlIgYXV0byBjb25maWd1cmF0b3IgKGRlZmF1bHQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBEaXNhYmxlIFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IEVuYWJsZSBTcGVjdHJhbCBCYW5kIFJlcGxpY2F0aW9uLiAqLwogCi0gIEFBQ0VOQ19DSEFOTkVMTU9ERSAgICAgICAgICAgICAgPSAweDAxMDYsICAvKiE8IFNldCBleHBsaWNpdCBjaGFubmVsIG1vZGUuIENoYW5uZWwgbW9kZSBtdXN0IG1hdGNoIHdpdGggbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEtNyBhbmQgMzMsMzQ6IE1QRUcgY2hhbm5lbCBtb2RlcyBzdXBwb3J0ZWQsIHNlZSA6OkNIQU5ORUxfTU9ERSBpbiBGREtfYXVkaW8uaC4gKi8KKyAgQUFDRU5DX0dSQU5VTEVfTEVOR1RIID0KKyAgICAgIDB4MDEwNSwgLyohPCBDb3JlIGVuY29kZXIgKEFBQykgYXVkaW8gZnJhbWUgbGVuZ3RoIGluIHNhbXBsZXM6CisgICAgICAgICAgICAgICAgICAgLSAxMDI0OiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICAgICAgICAgLSA1MTI6IERlZmF1bHQgbGVuZ3RoIGluIExEL0VMRCBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgICAgICAgIC0gNDgwOiBMZW5ndGggaW4gTEQvRUxEIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICAgICAgICAgLSAyNTY6IExlbmd0aCBmb3IgRUxEIHJlZHVjZWQgZGVsYXkgbW9kZSAoeDIpLgorICAgICAgICAgICAgICAgICAgIC0gMjQwOiBMZW5ndGggZm9yIEVMRCByZWR1Y2VkIGRlbGF5IG1vZGUgKHgyKS4KKyAgICAgICAgICAgICAgICAgICAtIDEyODogTGVuZ3RoIGZvciBFTEQgcmVkdWNlZCBkZWxheSBtb2RlICh4NCkuCisgICAgICAgICAgICAgICAgICAgLSAxMjA6IExlbmd0aCBmb3IgRUxEIHJlZHVjZWQgZGVsYXkgbW9kZSAoeDQpLiAqLwogCi0gIEFBQ0VOQ19DSEFOTkVMT1JERVIgICAgICAgICAgICAgPSAweDAxMDcsICAvKiE8IElucHV0IGF1ZGlvIGRhdGEgY2hhbm5lbCBvcmRlcmluZyBzY2hlbWU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogTVBFRyBjaGFubmVsIG9yZGVyaW5nIChlLiBnLiA1LjE6IEMsIEwsIFIsIFNMLCBTUiwgTEZFKS4gKGRlZmF1bHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogV0FWRSBmaWxlIGZvcm1hdCBjaGFubmVsIG9yZGVyaW5nIChlLiBnLiA1LjE6IEwsIFIsIEMsIExGRSwgU0wsIFNSKS4gKi8KKyAgQUFDRU5DX0NIQU5ORUxNT0RFID0gMHgwMTA2LCAvKiE8IFNldCBleHBsaWNpdCBjaGFubmVsIG1vZGUuIENoYW5uZWwgbW9kZSBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggd2l0aCBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEtNywgMTEsMTIsMTQgYW5kIDMzLDM0OiBNUEVHIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlcyBzdXBwb3J0ZWQsIHNlZSA6OkNIQU5ORUxfTU9ERSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES19hdWRpby5oLiAqLwogCi0gIEFBQ0VOQ19TQlJfUkFUSU8gICAgICAgICAgICAgICAgPSAweDAxMDgsICAvKiE8ICBDb250cm9scyBhY3RpdmF0aW9uIG9mIGRvd25zYW1wbGVkIFNCUi4gV2l0aCBkb3duc2FtcGxlZCBTQlIsIHRoZSBkZWxheSB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydGVyLiBPbiB0aGUgb3RoZXIgaGFuZCwgZm9yIGFjaGlldmluZyB0aGUgc2FtZSBxdWFsaXR5IGxldmVsLCBkb3duc2FtcGxlZCBTQlIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzIG1vcmUgYml0cyB0aGFuIGR1YWwtcmF0ZSBTQlIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXRoIGRvd25zYW1wbGVkIFNCUiwgdGhlIEFBQyBlbmNvZGVyIHdpbGwgd29yayBhdCB0aGUgc2FtZSBzYW1wbGluZyByYXRlIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSIGVuY29kZXIgKHNpbmdsZSByYXRlKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvd25zYW1wbGVkIFNCUiBpcyBzdXBwb3J0ZWQgZm9yIEFBQy1FTEQgYW5kIEhFLUFBQ3YxLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBEb3duc2FtcGxlZCBTQlIgKGRlZmF1bHQgZm9yIEVMRCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IER1YWwtcmF0ZSBTQlIgICAoZGVmYXVsdCBmb3IgSEUtQUFDKS4gKi8KKyAgQUFDRU5DX0NIQU5ORUxPUkRFUiA9CisgICAgICAweDAxMDcsIC8qITwgSW5wdXQgYXVkaW8gZGF0YSBjaGFubmVsIG9yZGVyaW5nIHNjaGVtZToKKyAgICAgICAgICAgICAgICAgICAtIDA6IE1QRUcgY2hhbm5lbCBvcmRlcmluZyAoZS4gZy4gNS4xOiBDLCBMLCBSLCBTTCwgU1IsIExGRSkuCisgICAgICAgICAgICAgICAgIChkZWZhdWx0KQorICAgICAgICAgICAgICAgICAgIC0gMTogV0FWRSBmaWxlIGZvcm1hdCBjaGFubmVsIG9yZGVyaW5nIChlLiBnLiA1LjE6IEwsIFIsIEMsCisgICAgICAgICAgICAgICAgIExGRSwgU0wsIFNSKS4gKi8KIAotICBBQUNFTkNfQUZURVJCVVJORVIgICAgICAgICAgICAgID0gMHgwMjAwLCAgLyohPCBUaGlzIHBhcmFtZXRlciBjb250cm9scyB0aGUgdXNlIG9mIHRoZSBhZnRlcmJ1cm5lciBmZWF0dXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYWZ0ZXJidXJuZXIgaXMgYSB0eXBlIG9mIGFuYWx5c2lzIGJ5IHN5bnRoZXNpcyBhbGdvcml0aG0gd2hpY2ggaW5jcmVhc2VzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBxdWFsaXR5IGJ1dCBhbHNvIHRoZSByZXF1aXJlZCBwcm9jZXNzaW5nIHBvd2VyLiBJdCBpcyByZWNvbW1lbmRlZCB0byBhbHdheXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGUgdGhpcyBpZiBhZGRpdGlvbmFsIG1lbW9yeSBjb25zdW1wdGlvbiBhbmQgcHJvY2Vzc2luZyBwb3dlciBjb25zdW1wdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgYSBwcm9ibGVtLiBJZiBpbmNyZWFzZWQgTUh6IGFuZCBtZW1vcnkgY29uc3VtcHRpb24gYXJlIGFuIGlzc3VlIHRoZW4gdGhlIE1IegotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbWVtb3J5IGNvc3Qgb2YgdGhpcyBvcHRpb25hbCBtb2R1bGUgbmVlZCB0byBiZSBldmFsdWF0ZWQgYWdhaW5zdCB0aGUgaW1wcm92ZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYXVkaW8gcXVhbGl0eSBvbiBhIGNhc2UgYnkgY2FzZSBiYXNpcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBEaXNhYmxlIGFmdGVyYnVybmVyIChkZWZhdWx0KS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBFbmFibGUgYWZ0ZXJidXJuZXIuICovCisgIEFBQ0VOQ19TQlJfUkFUSU8gPQorICAgICAgMHgwMTA4LCAvKiE8ICBDb250cm9scyBhY3RpdmF0aW9uIG9mIGRvd25zYW1wbGVkIFNCUi4gV2l0aCBkb3duc2FtcGxlZAorICAgICAgICAgICAgICAgICBTQlIsIHRoZSBkZWxheSB3aWxsIGJlIHNob3J0ZXIuIE9uIHRoZSBvdGhlciBoYW5kLCBmb3IKKyAgICAgICAgICAgICAgICAgYWNoaWV2aW5nIHRoZSBzYW1lIHF1YWxpdHkgbGV2ZWwsIGRvd25zYW1wbGVkIFNCUiBuZWVkcyBtb3JlCisgICAgICAgICAgICAgICAgIGJpdHMgdGhhbiBkdWFsLXJhdGUgU0JSLiBXaXRoIGRvd25zYW1wbGVkIFNCUiwgdGhlIEFBQyBlbmNvZGVyCisgICAgICAgICAgICAgICAgIHdpbGwgd29yayBhdCB0aGUgc2FtZSBzYW1wbGluZyByYXRlIGFzIHRoZSBTQlIgZW5jb2RlciAoc2luZ2xlCisgICAgICAgICAgICAgICAgIHJhdGUpLiBEb3duc2FtcGxlZCBTQlIgaXMgc3VwcG9ydGVkIGZvciBBQUMtRUxEIGFuZCBIRS1BQUN2MS4KKyAgICAgICAgICAgICAgICAgICAgLSAxOiBEb3duc2FtcGxlZCBTQlIgKGRlZmF1bHQgZm9yIEVMRCkuCisgICAgICAgICAgICAgICAgICAgIC0gMjogRHVhbC1yYXRlIFNCUiAgIChkZWZhdWx0IGZvciBIRS1BQUMpLiAqLwogCi0gIEFBQ0VOQ19CQU5EV0lEVEggICAgICAgICAgICAgICAgPSAweDAyMDMsICAvKiE8IENvcmUgZW5jb2RlciBhdWRpbyBiYW5kd2lkdGg6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogRGV0ZXJtaW5lIGJhbmR3aWR0aCBpbnRlcm5hbGx5IChkZWZhdWx0LCBzZWUgY2hhcHRlciBccmVmIEJFSEFWSU9VUl9CQU5EV0lEVEgpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEgdG8gZnMvMjogRnJlcXVlbmN5IGJhbmR3aWR0aCBpbiBIZXJ0ei4gKEV4cGVydHMgb25seSwgYmV0dGVyIGRvIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG91Y2ggdGhpcyB2YWx1ZSB0byBhdm9pZCBkZWdyYWRlZCBhdWRpbyBxdWFsaXR5KSAqLworICBBQUNFTkNfQUZURVJCVVJORVIgPQorICAgICAgMHgwMjAwLCAvKiE8IFRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIHRoZSB1c2Ugb2YgdGhlIGFmdGVyYnVybmVyIGZlYXR1cmUuCisgICAgICAgICAgICAgICAgICAgVGhlIGFmdGVyYnVybmVyIGlzIGEgdHlwZSBvZiBhbmFseXNpcyBieSBzeW50aGVzaXMgYWxnb3JpdGhtCisgICAgICAgICAgICAgICAgIHdoaWNoIGluY3JlYXNlcyB0aGUgYXVkaW8gcXVhbGl0eSBidXQgYWxzbyB0aGUgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyBwb3dlci4gSXQgaXMgcmVjb21tZW5kZWQgdG8gYWx3YXlzIGFjdGl2YXRlIHRoaXMgaWYKKyAgICAgICAgICAgICAgICAgYWRkaXRpb25hbCBtZW1vcnkgY29uc3VtcHRpb24gYW5kIHByb2Nlc3NpbmcgcG93ZXIgY29uc3VtcHRpb24KKyAgICAgICAgICAgICAgICAgICBpcyBub3QgYSBwcm9ibGVtLiBJZiBpbmNyZWFzZWQgTUh6IGFuZCBtZW1vcnkgY29uc3VtcHRpb24gYXJlCisgICAgICAgICAgICAgICAgIGFuIGlzc3VlIHRoZW4gdGhlIE1IeiBhbmQgbWVtb3J5IGNvc3Qgb2YgdGhpcyBvcHRpb25hbCBtb2R1bGUKKyAgICAgICAgICAgICAgICAgbmVlZCB0byBiZSBldmFsdWF0ZWQgYWdhaW5zdCB0aGUgaW1wcm92ZW1lbnQgaW4gYXVkaW8gcXVhbGl0eQorICAgICAgICAgICAgICAgICBvbiBhIGNhc2UgYnkgY2FzZSBiYXNpcy4KKyAgICAgICAgICAgICAgICAgICAtIDA6IERpc2FibGUgYWZ0ZXJidXJuZXIgKGRlZmF1bHQpLgorICAgICAgICAgICAgICAgICAgIC0gMTogRW5hYmxlIGFmdGVyYnVybmVyLiAqLwogCi0gIEFBQ0VOQ19QRUFLX0JJVFJBVEUgICAgICAgICAgICAgPSAweDAyMDcsICAvKiE8IFBlYWsgYml0cmF0ZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciB0byBhZGp1c3QgbWF4aW11bSBiaXRzIHBlciBhdWRpbyBmcmFtZS4gQml0cmF0ZSBpcyBpbiBiaXRzL3NlY29uZC4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBwZWFrIGJpdHJhdGUgd2lsbCBpbnRlcm5hbGx5IGJlIGxpbWl0ZWQgdG8gdGhlIGNob3NlbiBiaXRyYXRlIDo6QUFDRU5DX0JJVFJBVEUgYXMgbG93ZXIgbGltaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBudW1iZXJfb2ZfZWZmZWN0aXZlX2NoYW5uZWxzKjYxNDQgYml0IGFzIHVwcGVyIGxpbWl0LgorICBBQUNFTkNfQkFORFdJRFRIID0gMHgwMjAzLCAvKiE8IENvcmUgZW5jb2RlciBhdWRpbyBiYW5kd2lkdGg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBEZXRlcm1pbmUgYXVkaW8gYmFuZHdpZHRoIGludGVybmFsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQsIHNlZSBjaGFwdGVyIFxyZWYgQkVIQVZJT1VSX0JBTkRXSURUSCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxIHRvIGZzLzI6IEF1ZGlvIGJhbmR3aWR0aCBpbiBIZXJ0ei4gTGltaXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byAyMGtIeiBtYXguIE5vdCB1c2FibGUgaWYgU0JSIGlzIGFjdGl2ZS4gVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nIGlzIGZvciBleHBlcnRzIG9ubHksIGJldHRlciBkbyBub3QgdG91Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB2YWx1ZSB0byBhdm9pZCBkZWdyYWRlZCBhdWRpbyBxdWFsaXR5LiAqLwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmcgdGhlIHBlYWsgYml0cmF0ZSBlcXVhbCB0byA6OkFBQ0VOQ19CSVRSQVRFIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCB0aGUgYXVkaW8gZnJhbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgb2YgY29uc3RhbnQgc2l6ZS4gU2luY2UgdGhlIHBlYWsgYml0YXRlIGlzIGluIGJpdHMvc2Vjb25kLCB0aGUgZnJhbWUgc2l6ZXMgY2FuIHZhcnkgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIGJ5dGUgaW4gb25lIG9yIHRoZSBvdGhlciBkaXJlY3Rpb24gb3ZlciB2YXJpb3VzIGZyYW1lcy4gSG93ZXZlciwgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIHJlZHVjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGVhayBwaXRyYXRlIHRvIDo6QUFDRU5DX0JJVFJBVEUgLSBpdCB3b3VsZCBkaXNhYmxlIHRoZSBiaXRyZXNlcnZvaXIsIHdoaWNoIHdvdWxkIGFmZmVjdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gcXVhbGl0eSBieSBhIGxhcmdlIGFtb3VudC4gKi8KKyAgQUFDRU5DX1BFQUtfQklUUkFURSA9CisgICAgICAweDAyMDcsIC8qITwgUGVhayBiaXRyYXRlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHRvIGFkanVzdCBtYXhpbXVtIGJpdHMKKyAgICAgICAgICAgICAgICAgcGVyIGF1ZGlvIGZyYW1lLiBCaXRyYXRlIGlzIGluIGJpdHMvc2Vjb25kLiBUaGUgcGVhayBiaXRyYXRlCisgICAgICAgICAgICAgICAgIHdpbGwgaW50ZXJuYWxseSBiZSBsaW1pdGVkIHRvIHRoZSBjaG9zZW4gYml0cmF0ZQorICAgICAgICAgICAgICAgICA6OkFBQ0VOQ19CSVRSQVRFIGFzIGxvd2VyIGxpbWl0IGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2VmZmVjdGl2ZV9jaGFubmVscyo2MTQ0IGJpdCBhcyB1cHBlciBsaW1pdC4KIAotICBBQUNFTkNfVFJBTlNNVVggICAgICAgICAgICAgICAgID0gMHgwMzAwLCAgLyohPCBUcmFuc3BvcnQgdHlwZSB0byBiZSB1c2VkLiBTZWUgOjpUUkFOU1BPUlRfVFlQRSBpbiBGREtfYXVkaW8uaC4gRm9sbG93aW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzIGNhbiBiZSBjb25maWd1cmVkIGluIGVuY29kZXIgbGlicmFyeToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiByYXcgYWNjZXNzIHVuaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogQURJRiBiaXRzdHJlYW0gZm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjogQURUUyBiaXRzdHJlYW0gZm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gNjogQXVkaW8gTXV4IEVsZW1lbnRzIChMQVRNKSB3aXRoIG11eENvbmZpZ1ByZXNlbnQgPSAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gNzogQXVkaW8gTXV4IEVsZW1lbnRzIChMQVRNKSB3aXRoIG11eENvbmZpZ1ByZXNlbnQgPSAwLCBvdXQgb2YgYmFuZCBTdHJlYW1NdXhDb25maWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxMDogQXVkaW8gU3luYyBTdHJlYW0gKExPQVMpICovCisgICAgICAgICAgICAgICAgICAgU2V0dGluZyB0aGUgcGVhayBiaXRyYXRlIGVxdWFsIHRvIDo6QUFDRU5DX0JJVFJBVEUgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgbWVhbiB0aGF0IHRoZSBhdWRpbyBmcmFtZXMgd2lsbCBiZSBvZiBjb25zdGFudAorICAgICAgICAgICAgICAgICBzaXplLiBTaW5jZSB0aGUgcGVhayBiaXRhdGUgaXMgaW4gYml0cy9zZWNvbmQsIHRoZSBmcmFtZSBzaXplcworICAgICAgICAgICAgICAgICBjYW4gdmFyeSBieSBvbmUgYnl0ZSBpbiBvbmUgb3IgdGhlIG90aGVyIGRpcmVjdGlvbiBvdmVyIHZhcmlvdXMKKyAgICAgICAgICAgICAgICAgZnJhbWVzLiBIb3dldmVyLCBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gcmVkdWNlIHRoZSBwZWFrCisgICAgICAgICAgICAgICAgIHBpdHJhdGUgdG8gOjpBQUNFTkNfQklUUkFURSAtIGl0IHdvdWxkIGRpc2FibGUgdGhlCisgICAgICAgICAgICAgICAgIGJpdHJlc2Vydm9pciwgd2hpY2ggd291bGQgYWZmZWN0IHRoZSBhdWRpbyBxdWFsaXR5IGJ5IGEgbGFyZ2UKKyAgICAgICAgICAgICAgICAgYW1vdW50LiAqLwogCi0gIEFBQ0VOQ19IRUFERVJfUEVSSU9EICAgICAgICAgICAgPSAweDAzMDEsICAvKiE8IEZyYW1lIGNvdW50IHBlcmlvZCBmb3Igc2VuZGluZyBpbi1iYW5kIGNvbmZpZ3VyYXRpb24gYnVmZmVycyB3aXRoaW4gTEFUTS9MT0FTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCBsYXllci4gQWRkaXRpb25hbGx5IHRoaXMgcGFyYW1ldGVyIGNvbmZpZ3VyZXMgdGhlIFBDRSByZXBldGl0aW9uIHBlcmlvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiByYXdfZGF0YV9ibG9jaygpLiBTZWUgXHJlZiBlbmNQQ0UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMHhGRjogYXV0by1tb2RlIGRlZmF1bHQgMTAgZm9yIFRUX01QNF9BRFRTLCBUVF9NUDRfTE9BUyBhbmQgVFRfTVA0X0xBVE1fTUNQMSwgb3RoZXJ3aXNlIDAuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbjogRnJhbWUgY291bnQgcGVyaW9kLiAqLworICBBQUNFTkNfVFJBTlNNVVggPSAweDAzMDAsIC8qITwgVHJhbnNwb3J0IHR5cGUgdG8gYmUgdXNlZC4gU2VlIDo6VFJBTlNQT1JUX1RZUEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBGREtfYXVkaW8uaC4gRm9sbG93aW5nIHR5cGVzIGNhbiBiZSBjb25maWd1cmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gZW5jb2RlciBsaWJyYXJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiByYXcgYWNjZXNzIHVuaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IEFESUYgYml0c3RyZWFtIGZvcm1hdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyOiBBRFRTIGJpdHN0cmVhbSBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gNjogQXVkaW8gTXV4IEVsZW1lbnRzIChMQVRNKSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV4Q29uZmlnUHJlc2VudCA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gNzogQXVkaW8gTXV4IEVsZW1lbnRzIChMQVRNKSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV4Q29uZmlnUHJlc2VudCA9IDAsIG91dCBvZiBiYW5kIFN0cmVhbU11eENvbmZpZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxMDogQXVkaW8gU3luYyBTdHJlYW0gKExPQVMpICovCiAKLSAgQUFDRU5DX1NJR05BTElOR19NT0RFICAgICAgICAgICA9IDB4MDMwMiwgIC8qITwgU2lnbmFsaW5nIG1vZGUgb2YgdGhlIGV4dGVuc2lvbiBBT1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogSW1wbGljaXQgYmFja3dhcmQgY29tcGF0aWJsZSBzaWduYWxpbmcgKGRlZmF1bHQgZm9yIG5vbi1NUEVHLTQgYmFzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBT1QncyBhbmQgZm9yIHRoZSB0cmFuc3BvcnQgZm9ybWF0cyBBRElGIGFuZCBBRFRTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQSBzdHJlYW0gdGhhdCB1c2VzIGltcGxpY2l0IHNpZ25hbGluZyBjYW4gYmUgZGVjb2RlZCBieSBldmVyeSBBQUMgZGVjb2RlciwgZXZlbiBBQUMtTEMtb25seSBkZWNvZGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQW4gQUFDLUxDLW9ubHkgZGVjb2RlciB3aWxsIG9ubHkgZGVjb2RlIHRoZSBsb3ctZnJlcXVlbmN5IHBhcnQgb2YgdGhlIHN0cmVhbSwgcmVzdWx0aW5nIGluIGEgYmFuZC1saW1pdGVkIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhpcyBtZXRob2Qgd29ya3Mgd2l0aCBhbGwgdHJhbnNwb3J0IGZvcm1hdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgd2l0aCBkb3duc2FtcGxlZCBTQlIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBFeHBsaWNpdCBiYWNrd2FyZCBjb21wYXRpYmxlIHNpZ25hbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQSBzdHJlYW0gdGhhdCB1c2VzIGV4cGxpY2l0IGJhY2t3YXJkIGNvbXBhdGlibGUgc2lnbmFsaW5nIGNhbiBiZSBkZWNvZGVkIGJ5IGV2ZXJ5IEFBQyBkZWNvZGVyLCBldmVuIEFBQy1MQy1vbmx5IGRlY29kZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBBbiBBQUMtTEMtb25seSBkZWNvZGVyIHdpbGwgb25seSBkZWNvZGUgdGhlIGxvdy1mcmVxdWVuY3kgcGFydCBvZiB0aGUgc3RyZWFtLCByZXN1bHRpbmcgaW4gYSBiYW5kLWxpbWl0ZWQgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBBIGRlY29kZXIgbm90IGNhcGFibGUgb2YgZGVjb2RpbmcgUFMgd2lsbCBvbmx5IGRlY29kZSB0aGUgQUFDLUxDK1NCUiBwYXJ0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHN0cmVhbSBjb250YWluZWQgUFMsIHRoZSByZXN1bHQgd2lsbCBiZSBhIGEgZGVjb2RlZCBtb25vIGRvd25taXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgd2l0aCBBRElGIG9yIEFEVFMuIEZvciBMT0FTL0xBVE0sIGl0IG9ubHkgd29ya3Mgd2l0aCBBdWRpb011eFZlcnNpb249PTEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIGRvZXMgd29yayB3aXRoIGRvd25zYW1wbGVkIFNCUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IEV4cGxpY2l0IGhpZXJhcmNoaWNhbCBzaWduYWxpbmcgKGRlZmF1bHQgZm9yIE1QRUctNCBiYXNlZCBBT1QncyBhbmQgZm9yIGFsbCB0cmFuc3BvcnQgZm9ybWF0cyBleGNsdWRpbmcgQURJRiBhbmQgQURUUykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEEgc3RyZWFtIHRoYXQgdXNlcyBleHBsaWNpdCBoaWVyYXJjaGljYWwgc2lnbmFsaW5nIGNhbiBiZSBkZWNvZGVkIG9ubHkgYnkgSEUtQUFDIGRlY29kZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBBbiBBQUMtTEMtb25seSBkZWNvZGVyIHdpbGwgbm90IGRlY29kZSBhIHN0cmVhbSB0aGF0IHVzZXMgZXhwbGljaXQgaGllcmFyY2hpY2FsIHNpZ25hbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQSBkZWNvZGVyIG5vdCBjYXBhYmxlIG9mIGRlY29kaW5nIFBTIHdpbGwgbm90IGRlY29kZSB0aGUgc3RyZWFtIGF0IGFsbCBpZiBpdCBjb250YWluZWQgUFMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgd2l0aCBBRElGIG9yIEFEVFMuIEl0IHdvcmtzIHdpdGggTE9BUy9MQVRNIGFuZCB0aGUgTVBFRy00IEZpbGUgZm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBUaGlzIG1ldGhvZCBkb2VzIHdvcmsgd2l0aCBkb3duc2FtcGxlZCBTQlIKKyAgQUFDRU5DX0hFQURFUl9QRVJJT0QgPQorICAgICAgMHgwMzAxLCAvKiE8IEZyYW1lIGNvdW50IHBlcmlvZCBmb3Igc2VuZGluZyBpbi1iYW5kIGNvbmZpZ3VyYXRpb24gYnVmZmVycworICAgICAgICAgICAgICAgICB3aXRoaW4gTEFUTS9MT0FTIHRyYW5zcG9ydCBsYXllci4gQWRkaXRpb25hbGx5IHRoaXMgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZXMgdGhlIFBDRSByZXBldGl0aW9uIHBlcmlvZCBpbiByYXdfZGF0YV9ibG9jaygpLiBTZWUKKyAgICAgICAgICAgICAgICAgXHJlZiBlbmNQQ0UuCisgICAgICAgICAgICAgICAgICAgLSAweEZGOiBhdXRvLW1vZGUgZGVmYXVsdCAxMCBmb3IgVFRfTVA0X0FEVFMsIFRUX01QNF9MT0FTIGFuZAorICAgICAgICAgICAgICAgICBUVF9NUDRfTEFUTV9NQ1AxLCBvdGhlcndpc2UgMC4KKyAgICAgICAgICAgICAgICAgICAtIG46IEZyYW1lIGNvdW50IHBlcmlvZC4gKi8KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIG1ha2luZyBzdXJlIHRoYXQgdGhlIGxpc3RlbmVyIGFsd2F5cyBleHBlcmllbmNlcyB0aGUgYmVzdCBhdWRpbyBxdWFsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwbGljaXQgaGllcmFyY2hpY2FsIHNpZ25hbGluZyBzaG91bGQgYmUgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG9ubHkgYSBmdWxsIEhFLUFBQy1jYXBhYmxlIGRlY29kZXIgd2lsbCBkZWNvZGUgdGhvc2Ugc3RyZWFtcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBhdWRpbyBpcyBwbGF5ZWQgYXQgZnVsbCBiYW5kd2lkdGguCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYmVzdCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgaXQgaXMgcmVjb21tZW5kZWQgdG8gZW5jb2RlIHdpdGggaW1wbGljaXQgU0JSIHNpZ25hbGluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgZGVjb2RlciBjYXBhYmxlIG9mIEFBQy1MQyBvbmx5IHdpbGwgdGhlbiBvbmx5IGRlY29kZSB0aGUgQUFDIHBhcnQsIHdoaWNoIG1lYW5zIHRoZSBkZWNvZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyB3aWxsIHNvdW5kIGJhbmQtbGltaXRlZC4KKyAgQUFDRU5DX1NJR05BTElOR19NT0RFID0KKyAgICAgIDB4MDMwMiwgLyohPCBTaWduYWxpbmcgbW9kZSBvZiB0aGUgZXh0ZW5zaW9uIEFPVDoKKyAgICAgICAgICAgICAgICAgICAtIDA6IEltcGxpY2l0IGJhY2t3YXJkIGNvbXBhdGlibGUgc2lnbmFsaW5nIChkZWZhdWx0IGZvcgorICAgICAgICAgICAgICAgICBub24tTVBFRy00IGJhc2VkIEFPVCdzIGFuZCBmb3IgdGhlIHRyYW5zcG9ydCBmb3JtYXRzIEFESUYgYW5kCisgICAgICAgICAgICAgICAgIEFEVFMpCisgICAgICAgICAgICAgICAgICAgICAgICAtIEEgc3RyZWFtIHRoYXQgdXNlcyBpbXBsaWNpdCBzaWduYWxpbmcgY2FuIGJlIGRlY29kZWQKKyAgICAgICAgICAgICAgICAgYnkgZXZlcnkgQUFDIGRlY29kZXIsIGV2ZW4gQUFDLUxDLW9ubHkgZGVjb2RlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIC0gQW4gQUFDLUxDLW9ubHkgZGVjb2RlciB3aWxsIG9ubHkgZGVjb2RlIHRoZQorICAgICAgICAgICAgICAgICBsb3ctZnJlcXVlbmN5IHBhcnQgb2YgdGhlIHN0cmVhbSwgcmVzdWx0aW5nIGluIGEgYmFuZC1saW1pdGVkCisgICAgICAgICAgICAgICAgIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgLSBUaGlzIG1ldGhvZCB3b3JrcyB3aXRoIGFsbCB0cmFuc3BvcnQgZm9ybWF0cworICAgICAgICAgICAgICAgICAgICAgICAgLSBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIHdpdGggZG93bnNhbXBsZWQgU0JSCisgICAgICAgICAgICAgICAgICAgLSAxOiBFeHBsaWNpdCBiYWNrd2FyZCBjb21wYXRpYmxlIHNpZ25hbGluZworICAgICAgICAgICAgICAgICAgICAgICAgLSBBIHN0cmVhbSB0aGF0IHVzZXMgZXhwbGljaXQgYmFja3dhcmQgY29tcGF0aWJsZQorICAgICAgICAgICAgICAgICBzaWduYWxpbmcgY2FuIGJlIGRlY29kZWQgYnkgZXZlcnkgQUFDIGRlY29kZXIsIGV2ZW4gQUFDLUxDLW9ubHkKKyAgICAgICAgICAgICAgICAgZGVjb2RlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIC0gQW4gQUFDLUxDLW9ubHkgZGVjb2RlciB3aWxsIG9ubHkgZGVjb2RlIHRoZQorICAgICAgICAgICAgICAgICBsb3ctZnJlcXVlbmN5IHBhcnQgb2YgdGhlIHN0cmVhbSwgcmVzdWx0aW5nIGluIGEgYmFuZC1saW1pdGVkCisgICAgICAgICAgICAgICAgIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgLSBBIGRlY29kZXIgbm90IGNhcGFibGUgb2YgZGVjb2RpbmcgUFMgd2lsbCBvbmx5IGRlY29kZQorICAgICAgICAgICAgICAgICB0aGUgQUFDLUxDK1NCUiBwYXJ0LiBJZiB0aGUgc3RyZWFtIGNvbnRhaW5lZCBQUywgdGhlIHJlc3VsdAorICAgICAgICAgICAgICAgICB3aWxsIGJlIGEgYSBkZWNvZGVkIG1vbm8gZG93bm1peAorICAgICAgICAgICAgICAgICAgICAgICAgLSBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIHdpdGggQURJRiBvciBBRFRTLiBGb3IKKyAgICAgICAgICAgICAgICAgTE9BUy9MQVRNLCBpdCBvbmx5IHdvcmtzIHdpdGggQXVkaW9NdXhWZXJzaW9uPT0xCisgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgbWV0aG9kIGRvZXMgd29yayB3aXRoIGRvd25zYW1wbGVkIFNCUgorICAgICAgICAgICAgICAgICAgIC0gMjogRXhwbGljaXQgaGllcmFyY2hpY2FsIHNpZ25hbGluZyAoZGVmYXVsdCBmb3IgTVBFRy00CisgICAgICAgICAgICAgICAgIGJhc2VkIEFPVCdzIGFuZCBmb3IgYWxsIHRyYW5zcG9ydCBmb3JtYXRzIGV4Y2x1ZGluZyBBRElGIGFuZAorICAgICAgICAgICAgICAgICBBRFRTKQorICAgICAgICAgICAgICAgICAgICAgICAgLSBBIHN0cmVhbSB0aGF0IHVzZXMgZXhwbGljaXQgaGllcmFyY2hpY2FsIHNpZ25hbGluZyBjYW4KKyAgICAgICAgICAgICAgICAgYmUgZGVjb2RlZCBvbmx5IGJ5IEhFLUFBQyBkZWNvZGVycworICAgICAgICAgICAgICAgICAgICAgICAgLSBBbiBBQUMtTEMtb25seSBkZWNvZGVyIHdpbGwgbm90IGRlY29kZSBhIHN0cmVhbSB0aGF0CisgICAgICAgICAgICAgICAgIHVzZXMgZXhwbGljaXQgaGllcmFyY2hpY2FsIHNpZ25hbGluZworICAgICAgICAgICAgICAgICAgICAgICAgLSBBIGRlY29kZXIgbm90IGNhcGFibGUgb2YgZGVjb2RpbmcgUFMgd2lsbCBub3QgZGVjb2RlCisgICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gYXQgYWxsIGlmIGl0IGNvbnRhaW5lZCBQUworICAgICAgICAgICAgICAgICAgICAgICAgLSBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIHdpdGggQURJRiBvciBBRFRTLiBJdCB3b3JrcworICAgICAgICAgICAgICAgICB3aXRoIExPQVMvTEFUTSBhbmQgdGhlIE1QRUctNCBGaWxlIGZvcm1hdAorICAgICAgICAgICAgICAgICAgICAgICAgLSBUaGlzIG1ldGhvZCBkb2VzIHdvcmsgd2l0aCBkb3duc2FtcGxlZCBTQlIKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIE1QRUctMiB0cmFuc3BvcnQgdHlwZXMgKEFEVFMsQURJRiksIG9ubHkgaW1wbGljaXQgc2lnbmFsaW5nIGlzIHBvc3NpYmxlLgorICAgICAgICAgICAgICAgICAgICBGb3IgbWFraW5nIHN1cmUgdGhhdCB0aGUgbGlzdGVuZXIgYWx3YXlzIGV4cGVyaWVuY2VzIHRoZQorICAgICAgICAgICAgICAgICBiZXN0IGF1ZGlvIHF1YWxpdHksIGV4cGxpY2l0IGhpZXJhcmNoaWNhbCBzaWduYWxpbmcgc2hvdWxkIGJlCisgICAgICAgICAgICAgICAgIHVzZWQuIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG9ubHkgYSBmdWxsIEhFLUFBQy1jYXBhYmxlIGRlY29kZXIKKyAgICAgICAgICAgICAgICAgd2lsbCBkZWNvZGUgdGhvc2Ugc3RyZWFtcy4gVGhlIGF1ZGlvIGlzIHBsYXllZCBhdCBmdWxsCisgICAgICAgICAgICAgICAgIGJhbmR3aWR0aC4gRm9yIGJlc3QgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGl0IGlzIHJlY29tbWVuZGVkCisgICAgICAgICAgICAgICAgIHRvIGVuY29kZSB3aXRoIGltcGxpY2l0IFNCUiBzaWduYWxpbmcuIEEgZGVjb2RlciBjYXBhYmxlIG9mCisgICAgICAgICAgICAgICAgIEFBQy1MQyBvbmx5IHdpbGwgdGhlbiBvbmx5IGRlY29kZSB0aGUgQUFDIHBhcnQsIHdoaWNoIG1lYW5zIHRoZQorICAgICAgICAgICAgICAgICBkZWNvZGVkIGF1ZGlvIHdpbGwgc291bmQgYmFuZC1saW1pdGVkLgogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgTE9BUyBhbmQgTEFUTSwgZXhwbGljaXQgYmFja3dhcmRzIGNvbXBhdGlibGUgc2lnbmFsaW5nIG9ubHkgd29ya3MgdG9nZXRoZXIgd2l0aCBBdWRpb011eFZlcnNpb249PTEuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVhc29uIGlzIHRoYXQsIGZvciBleHBsaWNpdCBiYWNrd2FyZHMgY29tcGF0aWJsZSBzaWduYWxpbmcsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgQVNDLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBkZWNvZGVyIHRoYXQgaXMgb25seSBjYXBhYmxlIG9mIGRlY29kaW5nIEFBQy1MQyB3aWxsIHNraXAgdGhpcyBwYXJ0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV2ZXJ0aGVsZXNzLCBmb3IganVtcGluZyB0byB0aGUgZW5kIG9mIHRoZSBBU0MsIGl0IG5lZWRzIHRvIGtub3cgdGhlIEFTQyBsZW5ndGguCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc21pdHRpbmcgdGhlIGxlbmd0aCBvZiB0aGUgQVNDIGlzIGEgZmVhdHVyZSBvZiBBdWRpb011eFZlcnNpb249PTEsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB0cmFuc21pdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCBvZiB0aGUgQVNDIHdpdGggQXVkaW9NdXhWZXJzaW9uPT0wLCB0aGVyZWZvcmUgYW4gQUFDLUxDLW9ubHkgZGVjb2RlciB3aWxsIG5vdCBiZSBhYmxlIHRvIHBhcnNlIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQVMvTEFUTSBzdHJlYW0gdGhhdCB3YXMgYmVpbmcgZW5jb2RlZCB3aXRoIEF1ZGlvTXV4VmVyc2lvbj09MC4KKyAgICAgICAgICAgICAgICAgICAgRm9yIE1QRUctMiB0cmFuc3BvcnQgdHlwZXMgKEFEVFMsQURJRiksIG9ubHkgaW1wbGljaXQKKyAgICAgICAgICAgICAgICAgc2lnbmFsaW5nIGlzIHBvc3NpYmxlLgogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgZG93bnNhbXBsZWQgU0JSLCBleHBsaWNpdCBzaWduYWxpbmcgaXMgbWFuZGF0b3J5LiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24gc2FtcGxpbmcgZnJlcXVlbmN5ICh3aGljaCBpcyBpbiBjYXNlIG9mIFNCUiB0aGUgc2FtcGxpbmcgZnJlcXVxbmN5IG9mIHRoZSBTQlIgcGFydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBvbmx5IGJlIHNpZ25hbGVkIGluIGV4cGxpY2l0IG1vZGUuCisgICAgICAgICAgICAgICAgICAgIEZvciBMT0FTIGFuZCBMQVRNLCBleHBsaWNpdCBiYWNrd2FyZHMgY29tcGF0aWJsZSBzaWduYWxpbmcKKyAgICAgICAgICAgICAgICAgb25seSB3b3JrcyB0b2dldGhlciB3aXRoIEF1ZGlvTXV4VmVyc2lvbj09MS4gVGhlIHJlYXNvbiBpcworICAgICAgICAgICAgICAgICB0aGF0LCBmb3IgZXhwbGljaXQgYmFja3dhcmRzIGNvbXBhdGlibGUgc2lnbmFsaW5nLCBhZGRpdGlvbmFsCisgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIEFTQy4gQSBkZWNvZGVyIHRoYXQgaXMgb25seQorICAgICAgICAgICAgICAgICBjYXBhYmxlIG9mIGRlY29kaW5nIEFBQy1MQyB3aWxsIHNraXAgdGhpcyBwYXJ0LiBOZXZlcnRoZWxlc3MsCisgICAgICAgICAgICAgICAgIGZvciBqdW1waW5nIHRvIHRoZSBlbmQgb2YgdGhlIEFTQywgaXQgbmVlZHMgdG8ga25vdyB0aGUgQVNDCisgICAgICAgICAgICAgICAgIGxlbmd0aC4gVHJhbnNtaXR0aW5nIHRoZSBsZW5ndGggb2YgdGhlIEFTQyBpcyBhIGZlYXR1cmUgb2YKKyAgICAgICAgICAgICAgICAgQXVkaW9NdXhWZXJzaW9uPT0xLCBpdCBpcyBub3QgcG9zc2libGUgdG8gdHJhbnNtaXQgdGhlIGxlbmd0aAorICAgICAgICAgICAgICAgICBvZiB0aGUgQVNDIHdpdGggQXVkaW9NdXhWZXJzaW9uPT0wLCB0aGVyZWZvcmUgYW4gQUFDLUxDLW9ubHkKKyAgICAgICAgICAgICAgICAgZGVjb2RlciB3aWxsIG5vdCBiZSBhYmxlIHRvIHBhcnNlIGEgTE9BUy9MQVRNIHN0cmVhbSB0aGF0IHdhcworICAgICAgICAgICAgICAgICBiZWluZyBlbmNvZGVkIHdpdGggQXVkaW9NdXhWZXJzaW9uPT0wLgogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgQUFDLUVMRCwgdGhlIFNCUiBpbmZvcm1hdGlvbiBpcyB0cmFuc21pdHRlZCBpbiB0aGUgRUxEU3BlY2lmaWMgQ29uZmlnLCB3aGljaCBpcyBwYXJ0IG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TcGVjaWZpY0NvbmZpZy4gVGhlcmVmb3JlLCB0aGUgc2V0dGluZ3MgaGVyZSB3aWxsIGhhdmUgbm8gZWZmZWN0IG9uIEFBQy1FTEQuKi8KKyAgICAgICAgICAgICAgICAgICAgRm9yIGRvd25zYW1wbGVkIFNCUiwgZXhwbGljaXQgc2lnbmFsaW5nIGlzIG1hbmRhdG9yeS4gVGhlCisgICAgICAgICAgICAgICAgIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoZSBleHRlbnNpb24gc2FtcGxpbmcgZnJlcXVlbmN5ICh3aGljaAorICAgICAgICAgICAgICAgICBpcyBpbiBjYXNlIG9mIFNCUiB0aGUgc2FtcGxpbmcgZnJlcXVxbmN5IG9mIHRoZSBTQlIgcGFydCkgY2FuCisgICAgICAgICAgICAgICAgIG9ubHkgYmUgc2lnbmFsZWQgaW4gZXhwbGljaXQgbW9kZS4KIAotICBBQUNFTkNfVFBTVUJGUkFNRVMgICAgICAgICAgICAgID0gMHgwMzAzLCAgLyohPCBOdW1iZXIgb2Ygc3ViIGZyYW1lcyBpbiBhIHRyYW5zcG9ydCBmcmFtZSBmb3IgTE9BUy9MQVRNIG9yIEFEVFMgKGRlZmF1bHQgMSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQURUUzogTWF4aW11bSBudW1iZXIgb2Ygc3ViIGZyYW1lcyByZXN0cmljdGVkIHRvIDQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gTE9BUy9MQVRNOiBNYXhpbXVtIG51bWJlciBvZiBzdWIgZnJhbWVzIHJlc3RyaWN0ZWQgdG8gMi4qLworICAgICAgICAgICAgICAgICAgICBGb3IgQUFDLUVMRCwgdGhlIFNCUiBpbmZvcm1hdGlvbiBpcyB0cmFuc21pdHRlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgRUxEU3BlY2lmaWMgQ29uZmlnLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBBdWRpb1NwZWNpZmljQ29uZmlnLgorICAgICAgICAgICAgICAgICBUaGVyZWZvcmUsIHRoZSBzZXR0aW5ncyBoZXJlIHdpbGwgaGF2ZSBubyBlZmZlY3Qgb24gQUFDLUVMRC4qLwogCi0gIEFBQ0VOQ19BVURJT01VWFZFUiAgICAgICAgICAgICAgPSAweDAzMDQsICAvKiE8IEF1ZGlvTXV4VmVyc2lvbiB0byBiZSB1c2VkIGZvciBMQVRNLiAoQXVkaW9NdXhWZXJzaW9uQSwgY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogRGVmYXVsdCwgbm8gdHJhbnNtaXNzaW9uIG9mIHRhcmEgQnVmZmVyIGZ1bGxuZXNzLCBubyBBU0MgbGVuZ3RoIGFuZCBpbmNsdWRpbmcgYWN0dWFsIGxhdG0gQnVmZmVyIGZ1bGxuZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogVHJhbnNtaXNzaW9uIG9mIHRhcmEgQnVmZmVyIGZ1bGxuZXNzLCBBU0MgbGVuZ3RoIGFuZCBhY3R1YWwgbGF0bSBCdWZmZXIgZnVsbG5lc3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjogVHJhbnNtaXNzaW9uIG9mIHRhcmEgQnVmZmVyIGZ1bGxuZXNzLCBBU0MgbGVuZ3RoIGFuZCBtYXhpbXVtIGxldmVsIG9mIGxhdG0gQnVmZmVyIGZ1bGxuZXNzLiAqLworICBBQUNFTkNfVFBTVUJGUkFNRVMgPQorICAgICAgMHgwMzAzLCAvKiE8IE51bWJlciBvZiBzdWIgZnJhbWVzIGluIGEgdHJhbnNwb3J0IGZyYW1lIGZvciBMT0FTL0xBVE0gb3IKKyAgICAgICAgICAgICAgICAgQURUUyAoZGVmYXVsdCAxKS4KKyAgICAgICAgICAgICAgICAgICAtIEFEVFM6IE1heGltdW0gbnVtYmVyIG9mIHN1YiBmcmFtZXMgcmVzdHJpY3RlZCB0byA0LgorICAgICAgICAgICAgICAgICAgIC0gTE9BUy9MQVRNOiBNYXhpbXVtIG51bWJlciBvZiBzdWIgZnJhbWVzIHJlc3RyaWN0ZWQgdG8gMi4qLwogCi0gIEFBQ0VOQ19QUk9URUNUSU9OICAgICAgICAgICAgICAgPSAweDAzMDYsICAvKiE8IENvbmZpZ3VyZSBwcm90ZWN0aW9uIGluIHRyYW5wc29ydCBsYXllcjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBObyBwcm90ZWN0aW9uLiAoZGVmYXVsdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBDUkMgYWN0aXZlIGZvciBBRFRTIGJpdHN0cmVhbSBmb3JtYXQuICovCisgIEFBQ0VOQ19BVURJT01VWFZFUiA9CisgICAgICAweDAzMDQsIC8qITwgQXVkaW9NdXhWZXJzaW9uIHRvIGJlIHVzZWQgZm9yIExBVE0uIChBdWRpb011eFZlcnNpb25BLAorICAgICAgICAgICAgICAgICBjdXJyZW50bHkgbm90IGltcGxlbWVudGVkKToKKyAgICAgICAgICAgICAgICAgICAtIDA6IERlZmF1bHQsIG5vIHRyYW5zbWlzc2lvbiBvZiB0YXJhIEJ1ZmZlciBmdWxsbmVzcywgbm8gQVNDCisgICAgICAgICAgICAgICAgIGxlbmd0aCBhbmQgaW5jbHVkaW5nIGFjdHVhbCBsYXRtIEJ1ZmZlciBmdWxsbmVzLgorICAgICAgICAgICAgICAgICAgIC0gMTogVHJhbnNtaXNzaW9uIG9mIHRhcmEgQnVmZmVyIGZ1bGxuZXNzLCBBU0MgbGVuZ3RoIGFuZAorICAgICAgICAgICAgICAgICBhY3R1YWwgbGF0bSBCdWZmZXIgZnVsbG5lc3MuCisgICAgICAgICAgICAgICAgICAgLSAyOiBUcmFuc21pc3Npb24gb2YgdGFyYSBCdWZmZXIgZnVsbG5lc3MsIEFTQyBsZW5ndGggYW5kCisgICAgICAgICAgICAgICAgIG1heGltdW0gbGV2ZWwgb2YgbGF0bSBCdWZmZXIgZnVsbG5lc3MuICovCiAKLSAgQUFDRU5DX0FOQ0lMTEFSWV9CSVRSQVRFICAgICAgICA9IDB4MDUwMCwgIC8qITwgQ29uc3RhbnQgYW5jaWxsYXJ5IGRhdGEgYml0cmF0ZSBpbiBiaXRzL3NlY29uZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBFaXRoZXIgbm8gYW5jaWxsYXJ5IGRhdGEgb3IgaW5zZXJ0IGV4YWN0IG51bWJlciBvZiBieXRlcywgZGVub3RlZCB2aWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBwYXJhbWV0ZXIsIG51bUFuY0J5dGVzIGluIEFBQ0VOQ19JbkFyZ3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZWxzZTogSW5zZXJ0IGFuY2lsbGFyeSBkYXRhIHdpdGggc3BlY2lmaWVkIGJpdHJhdGUuICovCisgIEFBQ0VOQ19QUk9URUNUSU9OID0gMHgwMzA2LCAvKiE8IENvbmZpZ3VyZSBwcm90ZWN0aW9uIGluIHRyYW5zcG9ydCBsYXllcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBObyBwcm90ZWN0aW9uLiAoZGVmYXVsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBDUkMgYWN0aXZlIGZvciBBRFRTIHRyYW5zcG9ydCBmb3JtYXQuICovCiAKLSAgQUFDRU5DX01FVEFEQVRBX01PREUgICAgICAgICAgICA9IDB4MDYwMCwgIC8qITwgQ29uZmlndXJlIE1ldGEgRGF0YS4gU2VlIDo6QUFDRU5DX01ldGFEYXRhIGZvciBmdXJ0aGVyIGRldGFpbHM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogRG8gbm90IGVtYmVkIGFueSBtZXRhZGF0YS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBFbWJlZCBNUEVHIGRlZmluZWQgbWV0YWRhdGEgb25seS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyOiBFbWJlZCBhbGwgbWV0YWRhdGEuICovCisgIEFBQ0VOQ19BTkNJTExBUllfQklUUkFURSA9CisgICAgICAweDA1MDAsIC8qITwgQ29uc3RhbnQgYW5jaWxsYXJ5IGRhdGEgYml0cmF0ZSBpbiBiaXRzL3NlY29uZC4KKyAgICAgICAgICAgICAgICAgICAtIDA6IEVpdGhlciBubyBhbmNpbGxhcnkgZGF0YSBvciBpbnNlcnQgZXhhY3QgbnVtYmVyIG9mCisgICAgICAgICAgICAgICAgIGJ5dGVzLCBkZW5vdGVkIHZpYSBpbnB1dCBwYXJhbWV0ZXIsIG51bUFuY0J5dGVzIGluCisgICAgICAgICAgICAgICAgIEFBQ0VOQ19JbkFyZ3MuCisgICAgICAgICAgICAgICAgICAgLSBlbHNlOiBJbnNlcnQgYW5jaWxsYXJ5IGRhdGEgd2l0aCBzcGVjaWZpZWQgYml0cmF0ZS4gKi8KIAotICBBQUNFTkNfQ09OVFJPTF9TVEFURSAgICAgICAgICAgID0gMHhGRjAwLCAgLyohPCBUaGVyZSBpcyBhbiBhdXRvbWF0aWMgcHJvY2VzcyB3aGljaCBpbnRlcm5hbGx5IHJlY29uZmlndXJlcyB0aGUgZW5jb2RlciBpbnN0YW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgY2hhbmdlZCBvciBhbiBlcnJvciBvY2N1cmVkLiBUaGlzIHBhcmFtZXJ0ZXIgYWxsb3dzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0aW5nIG9yIGdldHRpbmcgdGhlIGNvbnRyb2wgc3RhdHVzIG9mIHRoaXMgcHJvY2Vzcy4gU2VlIDo6QUFDRU5DX0NUUkxGTEFHUy4gKi8KKyAgQUFDRU5DX01FVEFEQVRBX01PREUgPSAweDA2MDAsIC8qITwgQ29uZmlndXJlIE1ldGEgRGF0YS4gU2VlIDo6QUFDRU5DX01ldGFEYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZnVydGhlciBkZXRhaWxzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDA6IERvIG5vdCBlbWJlZCBhbnkgbWV0YWRhdGEuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTogRW1iZWQgZHluYW1pY19yYW5nZV9pbmZvIG1ldGFkYXRhLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IEVtYmVkIGR5bmFtaWNfcmFuZ2VfaW5mbyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2lsbGFyeV9kYXRhIG1ldGFkYXRhLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDM6IEVtYmVkIGFuY2lsbGFyeV9kYXRhIG1ldGFkYXRhLiAqLwogCi0gIEFBQ0VOQ19OT05FICAgICAgICAgICAgICAgICAgICAgPSAweEZGRkYgICAvKiE8IC0tLS0tLSAqLworICBBQUNFTkNfQ09OVFJPTF9TVEFURSA9CisgICAgICAweEZGMDAsIC8qITwgVGhlcmUgaXMgYW4gYXV0b21hdGljIHByb2Nlc3Mgd2hpY2ggaW50ZXJuYWxseSByZWNvbmZpZ3VyZXMKKyAgICAgICAgICAgICAgICAgdGhlIGVuY29kZXIgaW5zdGFuY2Ugd2hlbiBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGNoYW5nZWQgb3IKKyAgICAgICAgICAgICAgICAgYW4gZXJyb3Igb2NjdXJlZC4gVGhpcyBwYXJhbWVydGVyIGFsbG93cyBvdmVyd3JpdGluZyBvciBnZXR0aW5nCisgICAgICAgICAgICAgICAgIHRoZSBjb250cm9sIHN0YXR1cyBvZiB0aGlzIHByb2Nlc3MuIFNlZSA6OkFBQ0VOQ19DVFJMRkxBR1MuICovCisKKyAgQUFDRU5DX05PTkUgPSAweEZGRkYgLyohPCAtLS0tLS0gKi8KIAogfSBBQUNFTkNfUEFSQU07CiAKLQogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgpAQCAtMTA2NCwzMyArMTU0Nyw0MCBAQAogLyoqCiAgKiBcYnJpZWYgIE9wZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGVuY29kZXIuCiAgKgotICogQWxsb2NhdGUgbWVtb3J5IGZvciBhbiBlbmNvZGVyIGluc3RhbmNlIHdpdGggYSBmdW5jdGlvbmFsIHJhbmdlIGRlbm90ZWQgYnkgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCi0gKiBQcmVpbml0aWFsaXplIGVuY29kZXIgaW5zdGFuY2Ugd2l0aCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uCisgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIGVuY29kZXIgaW5zdGFuY2Ugd2l0aCBhIGZ1bmN0aW9uYWwgcmFuZ2UgZGVub3RlZCBieQorICogdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuIFByZWluaXRpYWxpemUgZW5jb2RlciBpbnN0YW5jZSB3aXRoIGRlZmF1bHQKKyAqIGNvbmZpZ3VyYXRpb24uCiAgKgogICogXHBhcmFtIHBoQWFjRW5jb2RlciAgQSBwb2ludGVyIHRvIGFuIGVuY29kZXIgaGFuZGxlLiBJbml0aWFsaXplZCBvbiByZXR1cm4uCi0gKiBccGFyYW0gZW5jTW9kdWxlcyAgICBTcGVjaWZ5IGVuY29kZXIgbW9kdWxlcyB0byBiZSBzdXBwb3J0ZWQgaW4gdGhpcyBlbmNvZGVyIGluc3RhbmNlOgotICogICAgICAgICAgICAgICAgICAgICAgLSAweDA6IEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIGF2YWlsYWJsZSBlbmNvZGVyIG1vZHVsZXMuCi0gKiAgICAgICAgICAgICAgICAgICAgICAtIGVsc2U6IFNlbGVjdCBtZW1vcnkgYWxsb2NhdGlvbiByZWdhcmRpbmcgZW5jb2RlciBtb2R1bGVzLiBGb2xsb3dpbmcgZmxhZ3MgYXJlIHBvc3NpYmxlIGFuZCBjYW4gYmUgY29tYmluZWQuCisgKiBccGFyYW0gZW5jTW9kdWxlcyAgICBTcGVjaWZ5IGVuY29kZXIgbW9kdWxlcyB0byBiZSBzdXBwb3J0ZWQgaW4gdGhpcyBlbmNvZGVyCisgKiBpbnN0YW5jZToKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gMHgwOiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBhdmFpbGFibGUgZW5jb2RlcgorICogbW9kdWxlcy4KKyAqICAgICAgICAgICAgICAgICAgICAgIC0gZWxzZTogU2VsZWN0IG1lbW9yeSBhbGxvY2F0aW9uIHJlZ2FyZGluZyBlbmNvZGVyCisgKiBtb2R1bGVzLiBGb2xsb3dpbmcgZmxhZ3MgYXJlIHBvc3NpYmxlIGFuZCBjYW4gYmUgY29tYmluZWQuCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMHgwMTogQUFDIG1vZHVsZS4KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAweDAyOiBTQlIgbW9kdWxlLgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDB4MDQ6IFBTIG1vZHVsZS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAweDA4OiBNUFMgbW9kdWxlLgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDB4MTA6IE1ldGFkYXRhIG1vZHVsZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBleGFtcGxlOiAoMHgwMXwweDAyfDB4MDR8MHgxMCkgYWxsb2NhdGVzIGFsbCBtb2R1bGVzIGFuZCBpcyBlcXVpdmFsZW50IHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBkZW5vdGV0IGJ5IDB4MC4KLSAqIFxwYXJhbSBtYXhDaGFubmVscyAgIE51bWJlciBvZiBjaGFubmVscyB0byBiZSBhbGxvY2F0ZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIGluIGRpZmZlcmVudCB3YXlzOgotICogICAgICAgICAgICAgICAgICAgICAgLSAwOiBBbGxvY2F0ZSBtYXhpbXVtIG51bWJlciBvZiBBQUMgYW5kIFNCUiBjaGFubmVscyBhcyBzdXBwb3J0ZWQgYnkgdGhlIGxpYnJhcnkuCi0gKiAgICAgICAgICAgICAgICAgICAgICAtIG5DaGFubmVsczogVXNlIHNhbWUgbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgZm9yIGFsbG9jYXRpbmcgbWVtb3J5IGluIEFBQyBhbmQgU0JSIG1vZHVsZS4KLSAqICAgICAgICAgICAgICAgICAgICAgIC0gbkNoYW5uZWxzIHwgKG5TYnJDaDw8OCk6IE51bWJlciBvZiBTQlIgY2hhbm5lbHMgY2FuIGJlIGRpZmZlcmVudCB0byBBQUMgY2hhbm5lbHMgdG8gc2F2ZSBkYXRhIG1lbW9yeS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBleGFtcGxlOiAoMHgwMXwweDAyfDB4MDR8MHgwOHwweDEwKSBhbGxvY2F0ZXMKKyAqIGFsbCBtb2R1bGVzIGFuZCBpcyBlcXVpdmFsZW50IHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBkZW5vdGV0IGJ5IDB4MC4KKyAqIFxwYXJhbSBtYXhDaGFubmVscyAgIE51bWJlciBvZiBjaGFubmVscyB0byBiZSBhbGxvY2F0ZWQuIFRoaXMgcGFyYW1ldGVyIGNhbgorICogYmUgdXNlZCBpbiBkaWZmZXJlbnQgd2F5czoKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gMDogQWxsb2NhdGUgbWF4aW11bSBudW1iZXIgb2YgQUFDIGFuZCBTQlIgY2hhbm5lbHMgYXMKKyAqIHN1cHBvcnRlZCBieSB0aGUgbGlicmFyeS4KKyAqICAgICAgICAgICAgICAgICAgICAgIC0gbkNoYW5uZWxzOiBVc2Ugc2FtZSBtYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyBmb3IKKyAqIGFsbG9jYXRpbmcgbWVtb3J5IGluIEFBQyBhbmQgU0JSIG1vZHVsZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIC0gbkNoYW5uZWxzIHwgKG5TYnJDaDw8OCk6IE51bWJlciBvZiBTQlIgY2hhbm5lbHMgY2FuIGJlCisgKiBkaWZmZXJlbnQgdG8gQUFDIGNoYW5uZWxzIHRvIHNhdmUgZGF0YSBtZW1vcnkuCiAgKgogICogXHJldHVybgogICogICAgICAgICAgLSBBQUNFTkNfT0ssIG9uIHN1Y2Nlcy4KLSAqICAgICAgICAgIC0gQUFDRU5DX0lOVkFMSURfSEFORExFLCBBQUNFTkNfTUVNT1JZX0VSUk9SLCBBQUNFTkNfSU5WQUxJRF9DT05GSUcsIG9uIGZhaWx1cmUuCisgKiAgICAgICAgICAtIEFBQ0VOQ19JTlZBTElEX0hBTkRMRSwgQUFDRU5DX01FTU9SWV9FUlJPUiwgQUFDRU5DX0lOVkFMSURfQ09ORklHLAorICogb24gZmFpbHVyZS4KICAqLwotQUFDRU5DX0VSUk9SIGFhY0VuY09wZW4oCi0gICAgICAgIEhBTkRMRV9BQUNFTkNPREVSICAgICAgICAqcGhBYWNFbmNvZGVyLAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgIGVuY01vZHVsZXMsCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgbWF4Q2hhbm5lbHMKLSAgICAgICAgKTsKLQorQUFDRU5DX0VSUk9SIGFhY0VuY09wZW4oSEFORExFX0FBQ0VOQ09ERVIgKnBoQWFjRW5jb2RlciwgY29uc3QgVUlOVCBlbmNNb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBtYXhDaGFubmVscyk7CiAKIC8qKgogICogXGJyaWVmICBDbG9zZSB0aGUgZW5jb2RlciBpbnN0YW5jZS4KQEAgLTExMDMsNjMgKzE1OTMsNzIgQEAKICAqICAgICAgICAgIC0gQUFDRU5DX09LLCBvbiBzdWNjZXNzLgogICogICAgICAgICAgLSBBQUNFTkNfSU5WQUxJRF9IQU5ETEUsIG9uIGZhaWx1cmUuCiAgKi8KLUFBQ0VOQ19FUlJPUiBhYWNFbmNDbG9zZSgKLSAgICAgICAgSEFORExFX0FBQ0VOQ09ERVIgICAgICAgICpwaEFhY0VuY29kZXIKLSAgICAgICAgKTsKLQorQUFDRU5DX0VSUk9SIGFhY0VuY0Nsb3NlKEhBTkRMRV9BQUNFTkNPREVSICpwaEFhY0VuY29kZXIpOwogCiAvKioKICAqIFxicmllZiBFbmNvZGUgYXVkaW8gZGF0YS4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIG1haW5seSBmb3IgZW5jb2RpbmcgYXVkaW8gZGF0YS4gSW4gYWRkaXRpb24gdGhlIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbiBlbmNvZGVyIChyZSljb25maWd1cmF0aW9uCi0gKiBwcm9jZXNzLgotICogLSBQQ00gaW5wdXQgZGF0YSB3aWxsIGJlIHJldHJpZXZlZCBmcm9tIGV4dGVybmFsIGlucHV0IGJ1ZmZlciB1bnRpbCB0aGUgZmlsbCBsZXZlbCBhbGxvd3MgZW5jb2RpbmcgYSBzaW5nbGUgZnJhbWUuCi0gKiAgIFRoaXMgZnVuY3Rpb25hbGl0eSBhbGxvd3MgYW4gZXh0ZXJuYWwgYnVmZmVyIHdpdGggcmVkdWNlZCBzaXplIGluIGNvbXBhcmlzb24gdG8gdGhlIEFBQyBvciBIRS1BQUMgYXVkaW8gZnJhbWUgbGVuZ3RoLgotICogLSBJZiB0aGUgdmFsdWUgb2YgdGhlIGlucHV0IHNhbXBsZXMgYXJndW1lbnQgaXMgemVybywganVzdCBpbnRlcm5hbCByZWluaXRpYWxpemF0aW9uIHdpbGwgYmUgYXBwbGllZCBpZiBpdCBpcwotICogICByZXF1ZXN0ZWQuCi0gKiAtIEF0IHRoZSBlbmQgb2YgYSBmaWxlIHRoZSBmbHVzaGluZyBwcm9jZXNzIGNhbiBiZSB0cmlnZ2VyZCB2aWEgc2V0dGluZyB0aGUgdmFsdWUgb2YgdGhlIGlucHV0IHNhbXBsZXMgYXJndW1lbnQgdG8gLTEuCi0gKiAgIFRoZSBlbmNvZGVyIGRlbGF5IGxpbmVzIGFyZSBmdWxseSBmbHVzaGVkIHdoZW4gdGhlIGVuY29kZXIgcmV0dXJucyBubyB2YWxpZCBiaXRzdHJlYW0gZGF0YSBBQUNFTkNfT3V0QXJnczo6bnVtT3V0Qnl0ZXMuCi0gKiAgIEZ1cnRoZXJtb3JlIHRoZSBlbmQgb2YgZmlsZSBpcyBzaWduYWxlZCBieSB0aGUgcmV0dXJuIHZhbHVlIEFBQ0VOQ19FTkNPREVfRU9GLgotICogLSBJZiBhbiBlcnJvciBvY2N1cmVkIGluIHRoZSBwcmV2aW91cyBmcmFtZSBvciBhbnkgb2YgdGhlIGVuY29kZXIgcGFyYW1ldGVycyBjaGFuZ2VkLCBhbiBpbnRlcm5hbCByZWluaXRpYWxpemF0aW9uCi0gKiAgIHByb2Nlc3Mgd2lsbCBiZSBhcHBsaWVkIGJlZm9yZSBlbmNvZGluZyB0aGUgaW5jb21pbmcgYXVkaW8gc2FtcGxlcy4KLSAqIC0gVGhlIGZ1bmN0aW9uIGNhbiBhbHNvIGJlIHVzZWQgZm9yIGFuIGluZGVwZW5kZW50IHJlY29uZmlndXJhdGlvbiBwcm9jZXNzIHdpdGhvdXQgZW5jb2RpbmcuIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaGFzIHRvIGJlIGEKLSAqICAgdmFsaWQgZW5jb2RlciBoYW5kbGUgYW5kIGFsbCBvdGhlciBwYXJhbWV0ZXJzIGNhbiBiZSBzZXQgdG8gTlVMTC4KLSAqIC0gSWYgdGhlIHNpemUgb2YgdGhlIGV4dGVybmFsIGJpdGJ1ZmZlciBpbiBvdXRCdWZEZXNjIGlzIG5vdCBzdWZmaWNpZW50IGZvciB3cml0aW5nIHRoZSB3aG9sZSBiaXRzdHJlYW0sIGFuIGludGVybmFsCi0gKiAgIGVycm9yIHdpbGwgYmUgdGhlIHJldHVybiB2YWx1ZSBhbmQgYSByZWNvbmZpZ3VyYXRpb24gd2lsbCBiZSB0cmlnZ2VyZWQuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG1haW5seSBmb3IgZW5jb2RpbmcgYXVkaW8gZGF0YS4gSW4gYWRkaXRpb24gdGhlIGZ1bmN0aW9uIGNhbgorICogYmUgdXNlZCBmb3IgYW4gZW5jb2RlciAocmUpY29uZmlndXJhdGlvbiBwcm9jZXNzLgorICogLSBQQ00gaW5wdXQgZGF0YSB3aWxsIGJlIHJldHJpZXZlZCBmcm9tIGV4dGVybmFsIGlucHV0IGJ1ZmZlciB1bnRpbCB0aGUgZmlsbAorICogbGV2ZWwgYWxsb3dzIGVuY29kaW5nIGEgc2luZ2xlIGZyYW1lLiBUaGlzIGZ1bmN0aW9uYWxpdHkgYWxsb3dzIGFuIGV4dGVybmFsCisgKiBidWZmZXIgd2l0aCByZWR1Y2VkIHNpemUgaW4gY29tcGFyaXNvbiB0byB0aGUgQUFDIG9yIEhFLUFBQyBhdWRpbyBmcmFtZQorICogbGVuZ3RoLgorICogLSBJZiB0aGUgdmFsdWUgb2YgdGhlIGlucHV0IHNhbXBsZXMgYXJndW1lbnQgaXMgemVybywganVzdCBpbnRlcm5hbAorICogcmVpbml0aWFsaXphdGlvbiB3aWxsIGJlIGFwcGxpZWQgaWYgaXQgaXMgcmVxdWVzdGVkLgorICogLSBBdCB0aGUgZW5kIG9mIGEgZmlsZSB0aGUgZmx1c2hpbmcgcHJvY2VzcyBjYW4gYmUgdHJpZ2dlcmQgdmlhIHNldHRpbmcgdGhlCisgKiB2YWx1ZSBvZiB0aGUgaW5wdXQgc2FtcGxlcyBhcmd1bWVudCB0byAtMS4gVGhlIGVuY29kZXIgZGVsYXkgbGluZXMgYXJlIGZ1bGx5CisgKiBmbHVzaGVkIHdoZW4gdGhlIGVuY29kZXIgcmV0dXJucyBubyB2YWxpZCBiaXRzdHJlYW0gZGF0YQorICogQUFDRU5DX091dEFyZ3M6Om51bU91dEJ5dGVzLiBGdXJ0aGVybW9yZSB0aGUgZW5kIG9mIGZpbGUgaXMgc2lnbmFsZWQgYnkgdGhlCisgKiByZXR1cm4gdmFsdWUgQUFDRU5DX0VOQ09ERV9FT0YuCisgKiAtIElmIGFuIGVycm9yIG9jY3VyZWQgaW4gdGhlIHByZXZpb3VzIGZyYW1lIG9yIGFueSBvZiB0aGUgZW5jb2RlciBwYXJhbWV0ZXJzCisgKiBjaGFuZ2VkLCBhbiBpbnRlcm5hbCByZWluaXRpYWxpemF0aW9uIHByb2Nlc3Mgd2lsbCBiZSBhcHBsaWVkIGJlZm9yZSBlbmNvZGluZworICogdGhlIGluY29taW5nIGF1ZGlvIHNhbXBsZXMuCisgKiAtIFRoZSBmdW5jdGlvbiBjYW4gYWxzbyBiZSB1c2VkIGZvciBhbiBpbmRlcGVuZGVudCByZWNvbmZpZ3VyYXRpb24gcHJvY2VzcworICogd2l0aG91dCBlbmNvZGluZy4gVGhlIGZpcnN0IHBhcmFtZXRlciBoYXMgdG8gYmUgYSB2YWxpZCBlbmNvZGVyIGhhbmRsZSBhbmQKKyAqIGFsbCBvdGhlciBwYXJhbWV0ZXJzIGNhbiBiZSBzZXQgdG8gTlVMTC4KKyAqIC0gSWYgdGhlIHNpemUgb2YgdGhlIGV4dGVybmFsIGJpdGJ1ZmZlciBpbiBvdXRCdWZEZXNjIGlzIG5vdCBzdWZmaWNpZW50IGZvcgorICogd3JpdGluZyB0aGUgd2hvbGUgYml0c3RyZWFtLCBhbiBpbnRlcm5hbCBlcnJvciB3aWxsIGJlIHRoZSByZXR1cm4gdmFsdWUgYW5kIGEKKyAqIHJlY29uZmlndXJhdGlvbiB3aWxsIGJlIHRyaWdnZXJlZC4KICAqCiAgKiBccGFyYW0gaEFhY0VuY29kZXIgICAgICAgICAgIEEgdmFsaWQgQUFDIGVuY29kZXIgaGFuZGxlLgogICogXHBhcmFtIGluQnVmRGVzYyAgICAgICAgICAgICBJbnB1dCBidWZmZXIgZGVzY3JpcHRvciwgc2VlIEFBQ0VOQ19CdWZEZXNjOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEF0IGxlYXN0IG9uZSBpbnB1dCBidWZmZXIgd2l0aCBhdWRpbyBkYXRhIGlzIGV4cGVjdGVkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIE9wdGlvbmFsbHkgYSBzZWNvbmQgaW5wdXQgYnVmZmVyIHdpdGggYW5jaWxsYXJ5IGRhdGEgY2FuIGJlIGZlZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBBdCBsZWFzdCBvbmUgaW5wdXQgYnVmZmVyIHdpdGggYXVkaW8gZGF0YSBpcworICogZXhwZWN0ZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gT3B0aW9uYWxseSBhIHNlY29uZCBpbnB1dCBidWZmZXIgd2l0aAorICogYW5jaWxsYXJ5IGRhdGEgY2FuIGJlIGZlZC4KICAqIFxwYXJhbSBvdXRCdWZEZXNjICAgICAgICAgICAgT3V0cHV0IGJ1ZmZlciBkZXNjcmlwdG9yLCBzZWUgQUFDRU5DX0J1ZkRlc2M6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUHJvdmlkZSBvbmUgb3V0cHV0IGJ1ZmZlciBmb3IgdGhlIGVuY29kZWQgYml0c3RyZWFtLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFByb3ZpZGUgb25lIG91dHB1dCBidWZmZXIgZm9yIHRoZSBlbmNvZGVkCisgKiBiaXRzdHJlYW0uCiAgKiBccGFyYW0gaW5hcmdzICAgICAgICAgICAgICAgIElucHV0IGFyZ3VtZW50cywgc2VlIEFBQ0VOQ19JbkFyZ3MuCiAgKiBccGFyYW0gb3V0YXJncyAgICAgICAgICAgICAgIE91dHB1dCBhcmd1bWVudHMsIEFBQ0VOQ19PdXRBcmdzLgogICoKICAqIFxyZXR1cm4KICAqICAgICAgICAgIC0gQUFDRU5DX09LLCBvbiBzdWNjZXNzLgotICogICAgICAgICAgLSBBQUNFTkNfSU5WQUxJRF9IQU5ETEUsIEFBQ0VOQ19FTkNPREVfRVJST1IsIG9uIGZhaWx1cmUgaW4gZW5jb2RpbmcgcHJvY2Vzcy4KLSAqICAgICAgICAgIC0gQUFDRU5DX0lOVkFMSURfQ09ORklHLCBBQUNFTkNfSU5JVF9FUlJPUiwgQUFDRU5DX0lOSVRfQUFDX0VSUk9SLCBBQUNFTkNfSU5JVF9TQlJfRVJST1IsIEFBQ0VOQ19JTklUX1RQX0VSUk9SLAotICogICAgICAgICAgICBBQUNFTkNfSU5JVF9NRVRBX0VSUk9SLCBvbiBmYWlsdXJlIGluIGVuY29kZXIgaW5pdGlhbGl6YXRpb24uCisgKiAgICAgICAgICAtIEFBQ0VOQ19JTlZBTElEX0hBTkRMRSwgQUFDRU5DX0VOQ09ERV9FUlJPUiwgb24gZmFpbHVyZSBpbiBlbmNvZGluZworICogcHJvY2Vzcy4KKyAqICAgICAgICAgIC0gQUFDRU5DX0lOVkFMSURfQ09ORklHLCBBQUNFTkNfSU5JVF9FUlJPUiwgQUFDRU5DX0lOSVRfQUFDX0VSUk9SLAorICogQUFDRU5DX0lOSVRfU0JSX0VSUk9SLCBBQUNFTkNfSU5JVF9UUF9FUlJPUiwgQUFDRU5DX0lOSVRfTUVUQV9FUlJPUiwKKyAqIEFBQ0VOQ19JTklUX01QU19FUlJPUiwgb24gZmFpbHVyZSBpbiBlbmNvZGVyIGluaXRpYWxpemF0aW9uLgorICogICAgICAgICAgLSBBQUNFTkNfVU5TVVBQT1JURURfUEFSQU1FVEVSLCBvbiBpbmNvcnJlY3QgaW5wdXQgb3Igb3V0cHV0IGJ1ZmZlcgorICogZGVzY3JpcHRvciBpbml0aWFsaXphdGlvbi4KICAqICAgICAgICAgIC0gQUFDRU5DX0VOQ09ERV9FT0YsIHdoZW4gZmx1c2hpbmcgZnVsbHkgY29uY2x1ZGVkLgogICovCi1BQUNFTkNfRVJST1IgYWFjRW5jRW5jb2RlKAotICAgICAgICBjb25zdCBIQU5ETEVfQUFDRU5DT0RFUiAgIGhBYWNFbmNvZGVyLAotICAgICAgICBjb25zdCBBQUNFTkNfQnVmRGVzYyAgICAgKmluQnVmRGVzYywKLSAgICAgICAgY29uc3QgQUFDRU5DX0J1ZkRlc2MgICAgICpvdXRCdWZEZXNjLAotICAgICAgICBjb25zdCBBQUNFTkNfSW5BcmdzICAgICAgKmluYXJncywKLSAgICAgICAgQUFDRU5DX091dEFyZ3MgICAgICAgICAgICpvdXRhcmdzCi0gICAgICAgICk7Ci0KK0FBQ0VOQ19FUlJPUiBhYWNFbmNFbmNvZGUoY29uc3QgSEFORExFX0FBQ0VOQ09ERVIgaEFhY0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFBQ0VOQ19CdWZEZXNjICppbkJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFBQ0VOQ19CdWZEZXNjICpvdXRCdWZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBQUNFTkNfSW5BcmdzICppbmFyZ3MsIEFBQ0VOQ19PdXRBcmdzICpvdXRhcmdzKTsKIAogLyoqCiAgKiBcYnJpZWYgIEFjcXVpcmUgaW5mbyBhYm91dCBwcmVzZW50IGVuY29kZXIgaW5zdGFuY2UuCiAgKgotICogVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgaW5mb3JtYXRpb24gb2YgdGhlIGVuY29kZXIgY29uZmlndXJhdGlvbi4gSW4gYWRkaXRpb24gdG8gaW5mb3JtYXRpdmUgaW50ZXJuYWwgc3RhdGVzLAotICogYSBjb25maWd1cmF0aW9uIGRhdGEgYmxvY2sgb2YgdGhlIGN1cnJlbnQgZW5jb2RlciBzZXR0aW5ncyB3aWxsIGJlIHJldHVybmVkLiBUaGUgZm9ybWF0IGlzIGVpdGhlciBBdWRpbyBTcGVjaWZpYyBDb25maWcKLSAqIGluIGNhc2Ugb2YgUmF3IFBhY2tldHMgdHJhbnNwb3J0IGZvcm1hdCBvciBTdHJlYW1NdXhDb25maWcgaW4gY2FzZSBvZiBMT0FTL0xBVE0gdHJhbnNwb3J0IGZvcm1hdC4gVGhlIGNvbmZpZ3VyYXRpb24KLSAqIGRhdGEgYmxvY2sgaXMgYmluYXJ5IGNvZGVkIGFzIHNwZWNpZmllZCBpbiBJU08vSUVDIDE0NDk2LTMgKE1QRUctNCBhdWRpbyksIHRvIGJlIHVzZWQgZGlyZWN0bHkgZm9yIE1QRUctNCBGaWxlIEZvcm1hdAotICogb3IgUkZDMzAxNiBvciBSRkMzNjQwIGFwcGxpY2F0aW9ucy4KKyAqIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIGluZm9ybWF0aW9uIG9mIHRoZSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24uIEluIGFkZGl0aW9uCisgKiB0byBpbmZvcm1hdGl2ZSBpbnRlcm5hbCBzdGF0ZXMsIGEgY29uZmlndXJhdGlvbiBkYXRhIGJsb2NrIG9mIHRoZSBjdXJyZW50CisgKiBlbmNvZGVyIHNldHRpbmdzIHdpbGwgYmUgcmV0dXJuZWQuIFRoZSBmb3JtYXQgaXMgZWl0aGVyIEF1ZGlvIFNwZWNpZmljIENvbmZpZworICogaW4gY2FzZSBvZiBSYXcgUGFja2V0cyB0cmFuc3BvcnQgZm9ybWF0IG9yIFN0cmVhbU11eENvbmZpZyBpbiBjYXNlIG9mCisgKiBMT0FTL0xBVE0gdHJhbnNwb3J0IGZvcm1hdC4gVGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBibG9jayBpcyBiaW5hcnkgY29kZWQgYXMKKyAqIHNwZWNpZmllZCBpbiBJU08vSUVDIDE0NDk2LTMgKE1QRUctNCBhdWRpbyksIHRvIGJlIHVzZWQgZGlyZWN0bHkgZm9yIE1QRUctNAorICogRmlsZSBGb3JtYXQgb3IgUkZDMzAxNiBvciBSRkMzNjQwIGFwcGxpY2F0aW9ucy4KICAqCiAgKiBccGFyYW0gaEFhY0VuY29kZXIgICAgICAgICAgIEEgdmFsaWQgQUFDIGVuY29kZXIgaGFuZGxlLgogICogXHBhcmFtIHBJbmZvICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIEFBQ0VOQ19JbmZvU3RydWN0LiBGaWxsZWQgb24gcmV0dXJuLgpAQCAtMTE2OCw1MCArMTY2Nyw0NSBAQAogICogICAgICAgICAgLSBBQUNFTkNfT0ssIG9uIHN1Y2Nlcy4KICAqICAgICAgICAgIC0gQUFDRU5DX0lOSVRfRVJST1IsIG9uIGZhaWx1cmUuCiAgKi8KLUFBQ0VOQ19FUlJPUiBhYWNFbmNJbmZvKAotICAgICAgICBjb25zdCBIQU5ETEVfQUFDRU5DT0RFUiAgIGhBYWNFbmNvZGVyLAotICAgICAgICBBQUNFTkNfSW5mb1N0cnVjdCAgICAgICAgKnBJbmZvCi0gICAgICAgICk7Ci0KK0FBQ0VOQ19FUlJPUiBhYWNFbmNJbmZvKGNvbnN0IEhBTkRMRV9BQUNFTkNPREVSIGhBYWNFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgQUFDRU5DX0luZm9TdHJ1Y3QgKnBJbmZvKTsKIAogLyoqCiAgKiBcYnJpZWYgIFNldCBvbmUgc2luZ2xlIEFBQyBlbmNvZGVyIHBhcmFtZXRlci4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjb25maWd1cmF0aW9uIG9mIGFsbCBlbmNvZGVyIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIDo6QUFDRU5DX1BBUkFNLiBFYWNoIHBhcmFtZXRlciBtdXN0IGJlCi0gKiBzZXQgd2l0aCBhIHNlcGFyYXRlIGZ1bmN0aW9uIGNhbGwuIEFuIGludGVybmFsIHZhbGlkYXRpb24gb2YgdGhlIGNvbmZpZ3VyYXRpb24gdmFsdWUgcmFuZ2Ugd2lsbCBiZSBkb25lIGFuZCBhbgotICogaW50ZXJuYWwgcmVjb25maWd1cmF0aW9uIHdpbGwgYmUgc2lnbmFsZWQuIFRoZSBhY3R1YWwgY29uZmlndXJhdGlvbiBhZG9wdGlvbiBpcyBwYXJ0IG9mIHRoZSBzdWJzZXF1ZW50IGFhY0VuY0VuY29kZSgpIGNhbGwuCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjb25maWd1cmF0aW9uIG9mIGFsbCBlbmNvZGVyIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluCisgKiA6OkFBQ0VOQ19QQVJBTS4gRWFjaCBwYXJhbWV0ZXIgbXVzdCBiZSBzZXQgd2l0aCBhIHNlcGFyYXRlIGZ1bmN0aW9uIGNhbGwuIEFuCisgKiBpbnRlcm5hbCB2YWxpZGF0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uIHZhbHVlIHJhbmdlIHdpbGwgYmUgZG9uZSBhbmQgYW4KKyAqIGludGVybmFsIHJlY29uZmlndXJhdGlvbiB3aWxsIGJlIHNpZ25hbGVkLiBUaGUgYWN0dWFsIGNvbmZpZ3VyYXRpb24gYWRvcHRpb24KKyAqIGlzIHBhcnQgb2YgdGhlIHN1YnNlcXVlbnQgYWFjRW5jRW5jb2RlKCkgY2FsbC4KICAqCiAgKiBccGFyYW0gaEFhY0VuY29kZXIgICAgICAgICAgIEEgdmFsaWQgQUFDIGVuY29kZXIgaGFuZGxlLgogICogXHBhcmFtIHBhcmFtICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgdG8gYmUgc2V0LiBTZWUgOjpBQUNFTkNfUEFSQU0uCi0gKiBccGFyYW0gdmFsdWUgICAgICAgICAgICAgICAgIFBhcmFtZXRlciB2YWx1ZS4gU2VlIHBhcmFtZXRlciBkZXNjcmlwdGlvbiBpbiA6OkFBQ0VOQ19QQVJBTS4KKyAqIFxwYXJhbSB2YWx1ZSAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHZhbHVlLiBTZWUgcGFyYW1ldGVyIGRlc2NyaXB0aW9uIGluCisgKiA6OkFBQ0VOQ19QQVJBTS4KICAqCiAgKiBccmV0dXJuCiAgKiAgICAgICAgICAtIEFBQ0VOQ19PSywgb24gc3VjY2Vzcy4KLSAqICAgICAgICAgIC0gQUFDRU5DX0lOVkFMSURfSEFORExFLCBBQUNFTkNfVU5TVVBQT1JURURfUEFSQU1FVEVSLCBBQUNFTkNfSU5WQUxJRF9DT05GSUcsIG9uIGZhaWx1cmUuCisgKiAgICAgICAgICAtIEFBQ0VOQ19JTlZBTElEX0hBTkRMRSwgQUFDRU5DX1VOU1VQUE9SVEVEX1BBUkFNRVRFUiwKKyAqIEFBQ0VOQ19JTlZBTElEX0NPTkZJRywgb24gZmFpbHVyZS4KICAqLwotQUFDRU5DX0VSUk9SIGFhY0VuY29kZXJfU2V0UGFyYW0oCi0gICAgICAgIGNvbnN0IEhBTkRMRV9BQUNFTkNPREVSICAgaEFhY0VuY29kZXIsCi0gICAgICAgIGNvbnN0IEFBQ0VOQ19QQVJBTSAgICAgICAgcGFyYW0sCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgdmFsdWUKLSAgICAgICAgKTsKLQorQUFDRU5DX0VSUk9SIGFhY0VuY29kZXJfU2V0UGFyYW0oY29uc3QgSEFORExFX0FBQ0VOQ09ERVIgaEFhY0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBQUNFTkNfUEFSQU0gcGFyYW0sIGNvbnN0IFVJTlQgdmFsdWUpOwogCiAvKioKICAqIFxicmllZiAgR2V0IG9uZSBzaW5nbGUgQUFDIGVuY29kZXIgcGFyYW1ldGVyLgogICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGNvbXBsZW1lbnQgdG8gYWFjRW5jb2Rlcl9TZXRQYXJhbSgpLiBBZnRlciBlbmNvZGVyIHJlaW5pdGlhbGl6YXRpb24gd2l0aCB1c2VyIGRlZmluZWQgc2V0dGluZ3MsCi0gKiB0aGUgaW50ZXJuYWwgc3RhdHVzIGNhbiBiZSBvYnRhaW5lZCBvZiBlYWNoIHBhcmFtZXRlciwgc3BlY2lmaWVkIHdpdGggOjpBQUNFTkNfUEFSQU0uCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBjb21wbGVtZW50IHRvIGFhY0VuY29kZXJfU2V0UGFyYW0oKS4gQWZ0ZXIgZW5jb2RlcgorICogcmVpbml0aWFsaXphdGlvbiB3aXRoIHVzZXIgZGVmaW5lZCBzZXR0aW5ncywgdGhlIGludGVybmFsIHN0YXR1cyBjYW4gYmUKKyAqIG9idGFpbmVkIG9mIGVhY2ggcGFyYW1ldGVyLCBzcGVjaWZpZWQgd2l0aCA6OkFBQ0VOQ19QQVJBTS4KICAqCiAgKiBccGFyYW0gaEFhY0VuY29kZXIgICAgICAgICAgIEEgdmFsaWQgQUFDIGVuY29kZXIgaGFuZGxlLgogICogXHBhcmFtIHBhcmFtICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgdG8gYmUgcmV0dXJuZWQuIFNlZSA6OkFBQ0VOQ19QQVJBTS4KICAqCiAgKiBccmV0dXJuICBJbnRlcm5hbCBjb25maWd1cmF0aW9uIHZhbHVlIG9mIHNwZWNpZmVkIHBhcmFtZXRlciA6OkFBQ0VOQ19QQVJBTS4KICAqLwotVUlOVCBhYWNFbmNvZGVyX0dldFBhcmFtKAotICAgICAgICBjb25zdCBIQU5ETEVfQUFDRU5DT0RFUiAgIGhBYWNFbmNvZGVyLAotICAgICAgICBjb25zdCBBQUNFTkNfUEFSQU0gICAgICAgIHBhcmFtCi0gICAgICAgICk7Ci0KK1VJTlQgYWFjRW5jb2Rlcl9HZXRQYXJhbShjb25zdCBIQU5ETEVfQUFDRU5DT0RFUiBoQWFjRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBQUNFTkNfUEFSQU0gcGFyYW0pOwogCiAvKioKICAqIFxicmllZiAgR2V0IGluZm9ybWF0aW9uIGFib3V0IGVuY29kZXIgbGlicmFyeSBidWlsZC4KQEAgLTEyMjQsMTMgKzE3MTgsMTAgQEAKICAqICAgICAgICAgIC0gQUFDRU5DX09LLCBvbiBzdWNjZXNzLgogICogICAgICAgICAgLSBBQUNFTkNfSU5WQUxJRF9IQU5ETEUsIEFBQ0VOQ19JTklUX0VSUk9SLCBvbiBmYWlsdXJlLgogICovCi1BQUNFTkNfRVJST1IgYWFjRW5jR2V0TGliSW5mbygKLSAgICAgICAgTElCX0lORk8gICAgICAgICAgICAgICAgICppbmZvCi0gICAgICAgICk7Ci0KK0FBQ0VOQ19FUlJPUiBhYWNFbmNHZXRMaWJJbmZvKExJQl9JTkZPICppbmZvKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKIAotI2VuZGlmICAgLyogX0FBQ19FTkNfTElCX0hfICovCisjZW5kaWYgLyogQUFDRU5DX0xJQl9IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2FhY0VuY19yYW0uY3BwIGIvbGliQUFDZW5jL3NyYy9hYWNFbmNfcmFtLmNwcAppbmRleCBiZTNlZWEyLi43N2IxMTMxIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2FhY0VuY19yYW0uY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvYWFjRW5jX3JhbS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDE2IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3JzOiAgICAgIE0uIExvaHdhc3NlciwgTS4gR2F5ZXIKLSAgIENvbnRlbnRzL2Rlc2NyaXB0aW9uOgorICAgQXV0aG9yKHMpOiAgIE0uIExvaHdhc3NlciwgTS4gR2F5ZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIC8qIQogICBcZmlsZQogICBcYnJpZWYgIE1lbW9yeSBsYXlvdXQKQEAgLTk1LDEwMCArMTA4LDEwMSBAQAogCiAjaW5jbHVkZSAiYWFjRW5jX3JhbS5oIgogCi0gIENfQUFMTE9DX01FTSAoQUFDZHluYW1pY19SQU0sIEZJWFBfREJMLCBBQUNfRU5DX0RZTl9SQU1fU0laRS9zaXplb2YoRklYUF9EQkwpKQorQ19BQUxMT0NfTUVNKEFBQ2R5bmFtaWNfUkFNLCBGSVhQX0RCTCwgQUFDX0VOQ19EWU5fUkFNX1NJWkUgLyBzaXplb2YoRklYUF9EQkwpKQogCiAvKgotICBTdGF0aWMgbWVtb3J5IGFyZWFzLCBtdXN0IG5vdCBiZSBvdmVyd3JpdHRlbiBpbiBvdGhlciBzZWN0aW9ucyBvZiB0aGUgZGVjb2RlciAhCisgIFN0YXRpYyBtZW1vcnkgYXJlYXMsIG11c3Qgbm90IGJlIG92ZXJ3cml0dGVuIGluIG90aGVyIHNlY3Rpb25zIG9mIHRoZSBkZWNvZGVyCisgICEKICovCiAKIC8qCiAgVGhlIHN0cnVjdHVyZSBBYWNFbmNvZGVyIGNvbnRhaW5zIGFsbCBFbmNvZGVyIHN0cnVjdHVyZXMuCiAqLwogCi1DX0FMTE9DX01FTSAoUmFtX2FhY0VuY19BYWNFbmNvZGVyLCAgICAgICAgICAgQUFDX0VOQywgICAgICAgICAgMSkKLQorQ19BTExPQ19NRU0oUmFtX2FhY0VuY19BYWNFbmNvZGVyLCBzdHJ1Y3QgQUFDX0VOQywgMSkKIAogLyoKICAgIFRoZSBzdHJ1Y3R1cmUgUFNZX0lOVEVSTkFsIGNvbnRhaW5zIGFsbCBwc3ljaCBjb25maWd1cmF0aW9uIGFuZCBkYXRhIHBvaW50ZXIuCiAgICAqIFBzeVN0YXRpYyBob2xkcyBsYXN0IGFuZCBjdXJyZW50IFBzeWNoIGRhdGEuCi0gICAqIFBzeUlucHV0QnVmZmVyIGNvbnRhaW5zIHRpbWUgaW5wdXQuIFNpZ25hbCBpcyBuZWVkZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBQc3ljaC4KLSAgICAgTWVtb3J5IGNhbiBiZSByZXVzZWQgYWZ0ZXIgc2lnbmFsIGlzIGluIHRpbWUgZG9tYWluLgotICAgKiBQc3lEYXRhIGNvbnRhaW5zIHNwZWN0cmFsLCBucmcgYW5kIHRocmVzaG9sZCBpbmZvcm1hdGlvbi4gTmVjZXNzYXJ5IGRhdGEgYXJlCi0gICAgIGNvcGllZCBpbnRvIFBzeU91dCwgc28gbWVtb3J5IGlzIGF2YWlsYWJsZSBhZnRlciBsZWF2aW5nIHBzeWNoLgotICAgKiBUbnNEYXRhLCBDaGFvc01lYXN1cmUsIFBuc0RhdGEgYXJlIHRlbXBvcmFyaWx5IG5lY2Vzc2FyeSwgZS5nLiB1c2UgbWVtb3J5IGZyb20KLSAgICAgUHN5SW5wdXRCdWZmZXIuCisgICAqIFBzeUlucHV0QnVmZmVyIGNvbnRhaW5zIHRpbWUgaW5wdXQuIFNpZ25hbCBpcyBuZWVkZWQgYXQgdGhlIGJlZ2lubmluZyBvZgorICAgUHN5Y2guIE1lbW9yeSBjYW4gYmUgcmV1c2VkIGFmdGVyIHNpZ25hbCBpcyBpbiB0aW1lIGRvbWFpbi4KKyAgICogUHN5RGF0YSBjb250YWlucyBzcGVjdHJhbCwgbnJnIGFuZCB0aHJlc2hvbGQgaW5mb3JtYXRpb24uIE5lY2Vzc2FyeSBkYXRhCisgICBhcmUgY29waWVkIGludG8gUHN5T3V0LCBzbyBtZW1vcnkgaXMgYXZhaWxhYmxlIGFmdGVyIGxlYXZpbmcgcHN5Y2guCisgICAqIFRuc0RhdGEsIENoYW9zTWVhc3VyZSwgUG5zRGF0YSBhcmUgdGVtcG9yYXJpbHkgbmVjZXNzYXJ5LCBlLmcuIHVzZSBtZW1vcnkKKyAgIGZyb20gUHN5SW5wdXRCdWZmZXIuCiAqLwogCi1DX0FMTE9DX01FTTIgKFJhbV9hYWNFbmNfUHN5RWxlbWVudCwgUFNZX0VMRU1FTlQsIDEsICg4KSkKK0NfQUxMT0NfTUVNMihSYW1fYWFjRW5jX1BzeUVsZW1lbnQsIFBTWV9FTEVNRU5ULCAxLCAoKDgpKSkKIAotQ19BTExPQ19NRU0gIChSYW1fYWFjRW5jX1BzeUludGVybmFsLCBQU1lfSU5URVJOQUwsIDEpCi1DX0FMTE9DX01FTTIgKFJhbV9hYWNFbmNfUHN5U3RhdGljLCAgIFBTWV9TVEFUSUMsICAgMSwgKDgpKQorQ19BTExPQ19NRU0oUmFtX2FhY0VuY19Qc3lJbnRlcm5hbCwgUFNZX0lOVEVSTkFMLCAxKQorQ19BTExPQ19NRU0yKFJhbV9hYWNFbmNfUHN5U3RhdGljLCBQU1lfU1RBVElDLCAxLCAoOCkpCiAKLUNfQUxMT0NfTUVNMiAoUmFtX2FhY0VuY19Qc3lJbnB1dEJ1ZmZlciwgSU5UX1BDTSwgTUFYX0lOUFVUX0JVRkZFUl9TSVpFLCAoOCkpCitDX0FMTE9DX01FTTIoUmFtX2FhY0VuY19Qc3lJbnB1dEJ1ZmZlciwgSU5UX1BDTSwgTUFYX0lOUFVUX0JVRkZFUl9TSVpFLCAoOCkpCiAKLSAgUFNZX0RZTkFNSUMgKkdldFJhbV9hYWNFbmNfUHN5RHluYW1pYyAoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSkgewotICAgICAgRkRLX0FTU0VSVChkeW5hbWljX1JBTSE9MCk7Ci0gICAgICByZXR1cm4gKChQU1lfRFlOQU1JQyopIChkeW5hbWljX1JBTSArIFBfQlVGXzEgKyBuKnNpemVvZihQU1lfRFlOQU1JQykpKTsKLSAgfQotCi0gIENfQUxMT0NfTUVNIChSYW1fYnNPdXRidWZmZXIsIFVDSEFSLCBPVVRQVVRCVUZGRVJfU0laRSkKK1BTWV9EWU5BTUlDICpHZXRSYW1fYWFjRW5jX1BzeUR5bmFtaWMoaW50IG4sIFVDSEFSICpkeW5hbWljX1JBTSkgeworICBGREtfQVNTRVJUKGR5bmFtaWNfUkFNICE9IDApOworICAvKiBUaGUgcmVpbnRlcnByZXRfY2FzdCBpcyB1c2VkIHRvIHN1cHByZXNzIGEgY29tcGlsZXIgd2FybmluZy4gV2Uga25vdyB0aGF0CisgICAqIChkeW5hbWljX1JBTSArIFBfQlVGXzEgKyBuKnNpemVvZihQU1lfRFlOQU1JQykpIGlzIHN1ZmZpY2llbnRseSBhbGlnbmVkLCBzbworICAgKiB0aGUgY2FzdCBpcyBzYWZlICovCisgIHJldHVybiByZWludGVycHJldF9jYXN0PFBTWV9EWU5BTUlDICo+KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPigKKyAgICAgIGR5bmFtaWNfUkFNICsgUF9CVUZfMSArIG4gKiBzaXplb2YoUFNZX0RZTkFNSUMpKSk7Cit9CiAKIC8qCiAgICBUaGUgc3RydWN0dXJlIFBTWV9PVVQgaG9sZHMgYWxsIHBzeWNob2FjY291c3RpYyBkYXRhIG5lZWRlZAogICAgaW4gcXVhbnRpemF0aW9uIG1vZHVsZQogKi8KLUNfQUxMT0NfTUVNMiAoUmFtX2FhY0VuY19Qc3lPdXQsICAgICAgICAgUFNZX09VVCwgMSwgKDEpKQorQ19BTExPQ19NRU0yKFJhbV9hYWNFbmNfUHN5T3V0LCBQU1lfT1VULCAxLCAoMSkpCiAKLUNfQUxMT0NfTUVNMiAoUmFtX2FhY0VuY19Qc3lPdXRFbGVtZW50cywgUFNZX09VVF9FTEVNRU5ULCAxLCAoMSkqKDgpKQotQ19BTExPQ19NRU0yIChSYW1fYWFjRW5jX1BzeU91dENoYW5uZWwsICBQU1lfT1VUX0NIQU5ORUwsIDEsICgxKSooOCkpCi0KK0NfQUxMT0NfTUVNMihSYW1fYWFjRW5jX1BzeU91dEVsZW1lbnRzLCBQU1lfT1VUX0VMRU1FTlQsIDEsICgxKSAqICgoOCkpKQorQ19BTExPQ19NRU0yKFJhbV9hYWNFbmNfUHN5T3V0Q2hhbm5lbCwgUFNZX09VVF9DSEFOTkVMLCAxLCAoMSkgKiAoOCkpCiAKIC8qCi0gICBUaGUgc3RydWN0dXJlIFFDX1NUQVRFIGNvbnRhaW5zIHByZWluaXRpYWxpemVkIHNldHRpbmdzIGFuZCBxdWFudGl6ZXIgc3RydWN0dXJlcy4KKyAgIFRoZSBzdHJ1Y3R1cmUgUUNfU1RBVEUgY29udGFpbnMgcHJlaW5pdGlhbGl6ZWQgc2V0dGluZ3MgYW5kIHF1YW50aXplcgorICAgc3RydWN0dXJlcy4KICAgICogQWRqdXN0VGhyZXNob2xkIHN0cnVjdHVyZSBjb250YWlucyBlbGVtZW50LXdpc2Ugc2V0dGluZ3MuCiAgICAqIEVsZW1lbnRCaXRzIGNvbnRhaW5zIGVsZW1udC13aXNlIGJpdCBjb25zdW1wdGlvbiBzZXR0aW5ncy4KICAgICogV2hlbiBDUkMgaXMgYWN0aXZlLCBsb29rdXAgdGFibGUgaXMgbmVjZXNzYXJ5IGZvciBmYXN0IGNyYyBjYWxjdWxhdGlvbi4KLSAgICogQml0Y291bnRlciBjb250YWlucyBidWZmZXIgdG8gZmluZCBvcHRpbWFsIGNvZGVib29rcyBhbmQgbWluaW1hbCBiaXQgY29uc3VtcHRpb24uCi0gICAgIFZhbHVlcyBhcmUgdGVtcG9yYXJpbHksIHNvIGR5bmFtaWMgbWVtb3J5IGNhbiBiZSB1c2VkLgorICAgKiBCaXRjb3VudGVyIGNvbnRhaW5zIGJ1ZmZlciB0byBmaW5kIG9wdGltYWwgY29kZWJvb2tzIGFuZCBtaW5pbWFsIGJpdAorICAgY29uc3VtcHRpb24uIFZhbHVlcyBhcmUgdGVtcG9yYXJpbHksIHNvIGR5bmFtaWMgbWVtb3J5IGNhbiBiZSB1c2VkLgogKi8KIAotQ19BTExPQ19NRU0gKFJhbV9hYWNFbmNfUUNzdGF0ZSwgUUNfU1RBVEUsIDEpCi1DX0FMTE9DX01FTSAoUmFtX2FhY0VuY19BZGp1c3RUaHJlc2hvbGQsIEFESl9USFJfU1RBVEUsIDEpCitDX0FMTE9DX01FTShSYW1fYWFjRW5jX1FDc3RhdGUsIFFDX1NUQVRFLCAxKQorQ19BTExPQ19NRU0oUmFtX2FhY0VuY19BZGp1c3RUaHJlc2hvbGQsIEFESl9USFJfU1RBVEUsIDEpCiAKLUNfQUxMT0NfTUVNMiAoUmFtX2FhY0VuY19BZGpUaHJTdGF0ZUVsZW1lbnQsIEFUU19FTEVNRU5ULCAxLCAoOCkpCi1DX0FMTE9DX01FTTIgKFJhbV9hYWNFbmNfRWxlbWVudEJpdHMsIEVMRU1FTlRfQklUUywgMSwgKDgpKQotQ19BTExPQ19NRU0gKFJhbV9hYWNFbmNfQml0Q250clN0YXRlLCBCSVRDTlRSX1NUQVRFLCAxKQorQ19BTExPQ19NRU0yKFJhbV9hYWNFbmNfQWRqVGhyU3RhdGVFbGVtZW50LCBBVFNfRUxFTUVOVCwgMSwgKCg4KSkpCitDX0FMTE9DX01FTTIoUmFtX2FhY0VuY19FbGVtZW50Qml0cywgRUxFTUVOVF9CSVRTLCAxLCAoKDgpKSkKK0NfQUxMT0NfTUVNKFJhbV9hYWNFbmNfQml0Q250clN0YXRlLCBzdHJ1Y3QgQklUQ05UUl9TVEFURSwgMSkKIAotICBJTlQgKkdldFJhbV9hYWNFbmNfQml0TG9va1VwKGludCBuLCBVQ0hBUiogZHluYW1pY19SQU0pIHsKLSAgICBGREtfQVNTRVJUKGR5bmFtaWNfUkFNIT0wKTsKLSAgICByZXR1cm4gKChJTlQqKSAoZHluYW1pY19SQU0gKyBQX0JVRl8xKSk7Ci0gIH0KLSAgSU5UICpHZXRSYW1fYWFjRW5jX01lcmdlR2Fpbkxvb2tVcChpbnQgbiwgVUNIQVIqIGR5bmFtaWNfUkFNKSB7Ci0gICAgRkRLX0FTU0VSVChkeW5hbWljX1JBTSE9MCk7Ci0gICAgcmV0dXJuICgoSU5UKikgKGR5bmFtaWNfUkFNICsgUF9CVUZfMSArIHNpemVvZihJTlQpKihNQVhfU0ZCX0xPTkcqKENPREVfQk9PS19FU0NfTkRYKzEpKSkpOwotICB9Ci0KK0lOVCAqR2V0UmFtX2FhY0VuY19CaXRMb29rVXAoaW50IG4sIFVDSEFSICpkeW5hbWljX1JBTSkgeworICBGREtfQVNTRVJUKGR5bmFtaWNfUkFNICE9IDApOworICAvKiBUaGUgcmVpbnRlcnByZXRfY2FzdCBpcyB1c2VkIHRvIHN1cHByZXNzIGEgY29tcGlsZXIgd2FybmluZy4gV2Uga25vdyB0aGF0CisgICAqIChkeW5hbWljX1JBTSArIFBfQlVGXzEpIGlzIHN1ZmZpY2llbnRseSBhbGlnbmVkLCBzbyB0aGUgY2FzdCBpcyBzYWZlICovCisgIHJldHVybiByZWludGVycHJldF9jYXN0PElOVCAqPigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihkeW5hbWljX1JBTSArIFBfQlVGXzEpKTsKK30KK0lOVCAqR2V0UmFtX2FhY0VuY19NZXJnZUdhaW5Mb29rVXAoaW50IG4sIFVDSEFSICpkeW5hbWljX1JBTSkgeworICBGREtfQVNTRVJUKGR5bmFtaWNfUkFNICE9IDApOworICAvKiBUaGUgcmVpbnRlcnByZXRfY2FzdCBpcyB1c2VkIHRvIHN1cHByZXNzIGEgY29tcGlsZXIgd2FybmluZy4gV2Uga25vdyB0aGF0CisgICAqIChkeW5hbWljX1JBTSArIFBfQlVGXzEgKyBzaXplb2YoSU5UKSooTUFYX1NGQl9MT05HKihDT0RFX0JPT0tfRVNDX05EWCsxKSkpCisgICAqIGlzIHN1ZmZpY2llbnRseSBhbGlnbmVkLCBzbyB0aGUgY2FzdCBpcyBzYWZlICovCisgIHJldHVybiByZWludGVycHJldF9jYXN0PElOVCAqPihyZWludGVycHJldF9jYXN0PHZvaWQgKj4oCisgICAgICBkeW5hbWljX1JBTSArIFBfQlVGXzEgKworICAgICAgc2l6ZW9mKElOVCkgKiAoTUFYX1NGQl9MT05HICogKENPREVfQk9PS19FU0NfTkRYICsgMSkpKSk7Cit9CiAKIC8qCi0gICBUaGUgc3RydWN0dXJlIFFDX09VVCBjb250YWlucyBzZXR0aW5ncyBhbmQgc3RydWN0dXJlcyBob2xkaW5nIGFsbCBuZWNlc3NhcnkgaW5mb3JtYXRpb24KLSAgIG5lZWRlZCBpbiBiaXRzdHJlYW13cml0ZXIuCisgICBUaGUgc3RydWN0dXJlIFFDX09VVCBjb250YWlucyBzZXR0aW5ncyBhbmQgc3RydWN0dXJlcyBob2xkaW5nIGFsbCBuZWNlc3NhcnkKKyAgIGluZm9ybWF0aW9uIG5lZWRlZCBpbiBiaXRzdHJlYW13cml0ZXIuCiAqLwogCi1DX0FMTE9DX01FTTIgKFJhbV9hYWNFbmNfUUNvdXQsIFFDX09VVCwgMSwgKDEpKQotQ19BTExPQ19NRU0yIChSYW1fYWFjRW5jX1FDZWxlbWVudCwgUUNfT1VUX0VMRU1FTlQsICgxKSwgKDgpKQotICBRQ19PVVRfQ0hBTk5FTCAqR2V0UmFtX2FhY0VuY19RQ2NoYW5uZWwgKGludCBuLCBVQ0hBUiogZHluYW1pY19SQU0pIHsKLSAgICAgIEZES19BU1NFUlQoZHluYW1pY19SQU0hPTApOwotICAgICAgcmV0dXJuICgoUUNfT1VUX0NIQU5ORUwqKSAoZHluYW1pY19SQU0gKyBQX0JVRl8wICsgbipzaXplb2YoUUNfT1VUX0NIQU5ORUwpKSk7Ci0gIH0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KK0NfQUxMT0NfTUVNMihSYW1fYWFjRW5jX1FDb3V0LCBRQ19PVVQsIDEsICgxKSkKK0NfQUxMT0NfTUVNMihSYW1fYWFjRW5jX1FDZWxlbWVudCwgUUNfT1VUX0VMRU1FTlQsIDEsICgxKSAqICgoOCkpKQorUUNfT1VUX0NIQU5ORUwgKkdldFJhbV9hYWNFbmNfUUNjaGFubmVsKGludCBuLCBVQ0hBUiAqZHluYW1pY19SQU0pIHsKKyAgRkRLX0FTU0VSVChkeW5hbWljX1JBTSAhPSAwKTsKKyAgLyogVGhlIHJlaW50ZXJwcmV0X2Nhc3QgaXMgdXNlZCB0byBzdXBwcmVzcyBhIGNvbXBpbGVyIHdhcm5pbmcuIFdlIGtub3cgdGhhdAorICAgKiAoZHluYW1pY19SQU0gKyBQX0JVRl8wICsgbipzaXplb2YoUUNfT1VUX0NIQU5ORUwpKSBpcyBzdWZmaWNpZW50bHkgYWxpZ25lZCwKKyAgICogc28gdGhlIGNhc3QgaXMgc2FmZSAqLworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxRQ19PVVRfQ0hBTk5FTCAqPihyZWludGVycHJldF9jYXN0PHZvaWQgKj4oCisgICAgICBkeW5hbWljX1JBTSArIFBfQlVGXzAgKyBuICogc2l6ZW9mKFFDX09VVF9DSEFOTkVMKSkpOworfQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9hYWNFbmNfcmFtLmggYi9saWJBQUNlbmMvc3JjL2FhY0VuY19yYW0uaAppbmRleCBjZjdkYTdjLi4wNzc1YWFlIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2FhY0VuY19yYW0uaAorKysgYi9saWJBQUNlbmMvc3JjL2FhY0VuY19yYW0uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyMyArOTAsMjQgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcnM6ICAgICAgTS4gTG9od2Fzc2VyLCBNLiBHYXllcgotICAgQ29udGVudHMvZGVzY3JpcHRpb246CisgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyLCBNLiBHYXllcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgTWVtb3J5IGxheW91dCAgIAorICBcYnJpZWYgIE1lbW9yeSBsYXlvdXQKICAgXGF1dGhvciBNYXJrdXMgTG9od2Fzc2VyCiAqLwogCi0jaWZuZGVmIEFBQ19FTkNfUkFNX0gKLSNkZWZpbmUgQUFDX0VOQ19SQU1fSAorI2lmbmRlZiBBQUNFTkNfUkFNX0gKKyNkZWZpbmUgQUFDRU5DX1JBTV9ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKQEAgLTEwNywzMiArMTE5LDM1IEBACiAjaW5jbHVkZSAiYml0X2NudC5oIgogI2luY2x1ZGUgInBzeV9jb25zdC5oIgogCi0gICNkZWZpbmUgIE9VVFBVVEJVRkZFUl9TSVpFICAgICg4MTkyKSAgLyohPCBPdXRwdXQgYnVmZmVyIHNpemUgaGFzIHRvIGJlIGF0IGxlYXN0IDYxNDQgYml0cyBwZXIgY2hhbm5lbCAoNzY4IGJ5dGVzKS4gRkRLIGJpdGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiBleHBlY3RzIGJ1ZmZlciBvZiBzaXplIDJebi4gKi8KLQorI2RlZmluZSBPVVRQVVRCVUZGRVJfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICg4MTkyKSAvKiE8IE91dHB1dCBidWZmZXIgc2l6ZSBoYXMgdG8gYmUgYXQgbGVhc3QgNjE0NCBiaXRzIHBlciBjaGFubmVsIFwKKyAgICAgICAgICAgICg3NjggYnl0ZXMpLiBGREsgYml0YnVmZmVyIGltcGxlbWVudGF0aW9uIGV4cGVjdHMgYnVmZmVyIG9mICAgXAorICAgICAgICAgICAgc2l6ZSAyXm4uICovCiAKIC8qCi0gIE1vdmVkIEFBQ19FTkMgc3RydWN0IGRlZmluaXRpb24gZnJvbSBhYWNfZW5jLmNwcCBpbnRvIGFhY0VuY19yYW0uaCB0byBnZXQgc2l6ZSBhbmQgcmVzcGVjdGl2ZQotICBzdGF0aWMgbWVtb3J5IGluIGFhY0VuY19yYW0uY3BwLgotICBhYWNfZW5jLmggaXMgdGhlIG91dHdhcmQgdmlzaWJsZSBoZWFkZXIgZmlsZSBhbmQgcHV0dGluZyB0aGUgc3RydWN0IGludG8gd291bGQgY2F1c2UgbmVjZXNzaXR5Ci0gIG9mIGFkZGl0aW9uYWwgdmlzaWJsZSBoZWFkZXIgZmlsZXMgb3V0c2lkZSBsaWJyYXJ5LgorICBNb3ZlZCBBQUNfRU5DIHN0cnVjdCBkZWZpbml0aW9uIGZyb20gYWFjX2VuYy5jcHAgaW50byBhYWNFbmNfcmFtLmggdG8gZ2V0IHNpemUKKyAgYW5kIHJlc3BlY3RpdmUgc3RhdGljIG1lbW9yeSBpbiBhYWNFbmNfcmFtLmNwcC4gYWFjX2VuYy5oIGlzIHRoZSBvdXR3YXJkCisgIHZpc2libGUgaGVhZGVyIGZpbGUgYW5kIHB1dHRpbmcgdGhlIHN0cnVjdCBpbnRvIHdvdWxkIGNhdXNlIG5lY2Vzc2l0eSBvZgorICBhZGRpdGlvbmFsIHZpc2libGUgaGVhZGVyIGZpbGVzIG91dHNpZGUgbGlicmFyeS4KICovCiAKIC8qIGRlZmluZSBoQml0c3RyZWFtIHNpemU6IG1heCBBQUMgZnJhbWVsZW5ndGggaXMgNjE0NCBiaXRzL2NoYW5uZWwgKi8KLS8qI2RlZmluZSBCVUZGRVJfQklUU1RSX1NJWkUgKCg2NDAwKig4KS9iYldvcmRTaXplKSAgICArKChiYldvcmRTaXplIC0gMSkgLyBiYldvcmRTaXplKSkqLworLyojZGVmaW5lIEJVRkZFUl9CSVRTVFJfU0laRSAoKDY0MDAqKDgpL2JiV29yZFNpemUpICAgICsoKGJiV29yZFNpemUgLSAxKSAvCisgKiBiYldvcmRTaXplKSkqLwogCiBzdHJ1Y3QgQUFDX0VOQyB7CisgIEFBQ0VOQ19DT05GSUcgKmNvbmZpZzsKIAotICBBQUNFTkNfQ09ORklHICAgICpjb25maWc7CisgIElOVCBhbmNpbGxhcnlCaXRzUGVyRnJhbWU7IC8qIGFuY2lsbGFyeSBiaXRzIHBlciBmcmFtZSBjYWxjdWxhdGVkIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaWxsYXJ5IHJhdGUgKi8KIAotICBJTlQgICAgICAgICAgICAgICBhbmNpbGxhcnlCaXRzUGVyRnJhbWU7ICAgICAgICAgICAgICAvKiBhbmNpbGxhcnkgYml0cyBwZXIgZnJhbWUgY2FsY3VsYXRlZCBmcm9tIGFuY2lsbGFyeSByYXRlICovCisgIENIQU5ORUxfTUFQUElORyBjaGFubmVsTWFwcGluZzsKIAotICBDSEFOTkVMX01BUFBJTkcgICBjaGFubmVsTWFwcGluZzsKKyAgUUNfU1RBVEUgKnFjS2VybmVsOworICBRQ19PVVQgKnFjT3V0WygxKV07CiAKLSAgUUNfU1RBVEUgICAgICAgICAqcWNLZXJuZWw7Ci0gIFFDX09VVCAgICAgICAgICAgKnFjT3V0WygxKV07Ci0KLSAgUFNZX09VVCAgICAgICAgICAqcHN5T3V0WygxKV07Ci0gIFBTWV9JTlRFUk5BTCAgICAgKnBzeUtlcm5lbDsKKyAgUFNZX09VVCAqcHN5T3V0WygxKV07CisgIFBTWV9JTlRFUk5BTCAqcHN5S2VybmVsOwogCiAgIC8qIGxpZmV0aW1lIHZhcnMgKi8KIApAQCAtMTQwLDUwICsxNTUsNjEgQEAKICAgSU5UIGJhbmR3aWR0aDkwZEI7CiAgIEFBQ0VOQ19CSVRSQVRFX01PREUgYml0cmF0ZU1vZGU7CiAKLSAgSU5UICAgIGRvbnRXcml0ZUFkaWY7ICAgICAgLyogdXNlOiB3cml0ZSBBRElGIGhlYWRlciBvbmx5IGJlZm9yZSAxc3QgZnJhbWUgKi8KKyAgSU5UIGRvbnRXcml0ZUFkaWY7IC8qIHVzZTogd3JpdGUgQURJRiBoZWFkZXIgb25seSBiZWZvcmUgMXN0IGZyYW1lICovCiAKLSAgRklYUF9EQkwgICpkeW5hbWljX1JBTTsKKyAgRklYUF9EQkwgKmR5bmFtaWNfUkFNOwogCi0KLSAgSU5UIG1heENoYW5uZWxzOyAgICAgICAgICAgLyogdXNlZCB3aGlsZSBhbGxvY2F0aW9uICovCisgIElOVCBtYXhDaGFubmVsczsgLyogdXNlZCB3aGlsZSBhbGxvY2F0aW9uICovCiAgIElOVCBtYXhFbGVtZW50czsKICAgSU5UIG1heEZyYW1lczsKIAotICBBVURJT19PQkpFQ1RfVFlQRSBhb3Q7ICAgIC8qIEFPVCB0byBiZSB1c2VkIHdoaWxlIGVuY29kaW5nLiAgKi8KKyAgQVVESU9fT0JKRUNUX1RZUEUgYW90OyAvKiBBT1QgdG8gYmUgdXNlZCB3aGlsZSBlbmNvZGluZy4gICovCit9OwogCi19IDsKKyNkZWZpbmUgbWF4U2l6ZShhLCBiKSAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCiAKLSNkZWZpbmUgbWF4U2l6ZShhLGIpICggKChhKT4oYikpID8gKGEpIDogKGIpICkKKyNkZWZpbmUgQklUX0xPT0tfVVBfU0laRSBcCisgIChzaXplb2YoSU5UKSAqIChNQVhfU0ZCX0xPTkcgKiAoQ09ERV9CT09LX0VTQ19ORFggKyAxKSkpCisjZGVmaW5lIE1FUkdFX0dBSU5fTE9PS19VUF9TSVpFIChzaXplb2YoSU5UKSAqIE1BWF9TRkJfTE9ORykKIAotI2RlZmluZSBCSVRfTE9PS19VUF9TSVpFICAgICAgICAgKCBzaXplb2YoSU5UKSooTUFYX1NGQl9MT05HKihDT0RFX0JPT0tfRVNDX05EWCsxKSkgKQotI2RlZmluZSBNRVJHRV9HQUlOX0xPT0tfVVBfU0laRSAgKCBzaXplb2YoSU5UKSpNQVhfU0ZCX0xPTkcgKQotCi0KKy8qIFNpemUgb2YgQWhGbGFnIGJ1ZmZlciBpbiBmdW5jdGlvbiBGREthYWNFbmNfYWRhcHRUaHJlc2hvbGRzVG9QZSgpICovCisjZGVmaW5lIEFESl9USFJfQUhfRkxBR19TSVpFIChzaXplb2YoVUNIQVIpICogKCg4KSkgKiAoMikgKiBNQVhfR1JPVVBFRF9TRkIpCisvKiBTaXplIG9mIFRockV4cCBidWZmZXIgaW4gZnVuY3Rpb24gRkRLYWFjRW5jX2FkYXB0VGhyZXNob2xkc1RvUGUoKSAqLworI2RlZmluZSBBREpfVEhSX1RIUl9FWFBfU0laRSAoc2l6ZW9mKEZJWFBfREJMKSAqICgoOCkpICogKDIpICogTUFYX0dST1VQRURfU0ZCKQorLyogU2l6ZSBvZiBzZmJOQWN0aXZlTGluZXNMZERhdGEgYnVmZmVyIGluIGZ1bmN0aW9uIEZES2FhY0VuY19jb3JyZWN0VGhyZXNoKCkgKi8KKyNkZWZpbmUgQURKX1RIUl9BQ1RfTElOX0xEX0RBVEFfU0laRSBcCisgIChzaXplb2YoRklYUF9EQkwpICogKCg4KSkgKiAoMikgKiBNQVhfR1JPVVBFRF9TRkIpCisvKiBUb3RhbCBhbW91bnQgb2YgZHluYW1pYyBidWZmZXIgbmVlZGVkIGluIGFkanVzdCB0aHJlc2hvbGRzIGZ1bmN0aW9uYWxpdHkgKi8KKyNkZWZpbmUgQURKX1RIUl9TSVpFIFwKKyAgKEFESl9USFJfQUhfRkxBR19TSVpFICsgQURKX1RIUl9USFJfRVhQX1NJWkUgKyBBREpfVEhSX0FDVF9MSU5fTERfREFUQV9TSVpFKQogCiAvKiBEeW5hbWljIFJBTSAtIEFsbG9jYXRpb24gKi8KIC8qCi0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKLSB8ICAgUF9CVUZfMCAgIHwgICAgICAgICBQX0JVRl8xICAgICAgICAgICAgfAotICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCi0gfCAgUUNfT1VUX0NIICB8ICAgICAgICAgUFNZX0RZTiAgICAgICAgICAgIHwKLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwotIHwgICAgICAgICAgICAgfCBCaXRMb29rVXArTWVyZ2VHYWluTG9va1VwICB8Ci0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKLSB8ICAgICAgICAgICAgIHwgIEJpdHN0cmVhbSBvdXRwdXQgYnVmZmVyICAgfAotICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyB8ICAgUF9CVUZfMCAgIHwgICAgICAgICAgICAgICBQX0JVRl8xICAgICAgICAgICAgICAgfAorICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisgfCAgUUNfT1VUX0NIICB8ICAgICAgICAgICAgICAgUFNZX0RZTiAgICAgICAgICAgICAgIHwKKyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworIHwgICAgICAgICAgICAgfCAgICAgICBCaXRMb29rVXArTWVyZ2VHYWluTG9va1VwICAgICB8CisgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyB8ICAgICAgICAgICAgIHwgQUhfRkxBRyB8IFRIUl9FWFAgfCBBQ1RfTElOX0xEX0RBVEEgfAorICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisgfCAgICAgICAgICAgICB8ICAgICAgIEJpdHN0cmVhbSBvdXRwdXQgYnVmZmVyICAgICAgIHwKKyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogKi8KIAotI2RlZmluZSBCVUZfU0laRV8wICAgICAgICggQUxJR05fU0laRShzaXplb2YoUUNfT1VUX0NIQU5ORUwpKig4KSkgKQotI2RlZmluZSBCVUZfU0laRV8xICAgICAgICggQUxJR05fU0laRShtYXhTaXplKHNpemVvZihQU1lfRFlOQU1JQyksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVF9MT09LX1VQX1NJWkUrTUVSR0VfR0FJTl9MT09LX1VQX1NJWkUpKSkgKQorI2RlZmluZSBCVUZfU0laRV8wIChBTElHTl9TSVpFKHNpemVvZihRQ19PVVRfQ0hBTk5FTCkgKiAoOCkpKQorI2RlZmluZSBCVUZfU0laRV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChBTElHTl9TSVpFKG1heFNpemUobWF4U2l6ZShzaXplb2YoUFNZX0RZTkFNSUMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRfTE9PS19VUF9TSVpFICsgTUVSR0VfR0FJTl9MT09LX1VQX1NJWkUpKSwgXAorICAgICAgICAgICAgICAgICAgICAgIEFESl9USFJfU0laRSkpKQogCi0jZGVmaW5lIFBfQlVGXzAgICAgICAgICAgKCAwICkKLSNkZWZpbmUgUF9CVUZfMSAgICAgICAgICAoIFBfQlVGXzAgKyBCVUZfU0laRV8wICkKKyNkZWZpbmUgUF9CVUZfMCAoMCkKKyNkZWZpbmUgUF9CVUZfMSAoUF9CVUZfMCArIEJVRl9TSVpFXzApCiAKLSNkZWZpbmUgQUFDX0VOQ19EWU5fUkFNX1NJWkUgICggQlVGX1NJWkVfMCArIEJVRl9TSVpFXzEgKQorI2RlZmluZSBBQUNfRU5DX0RZTl9SQU1fU0laRSAoQlVGX1NJWkVfMCArIEJVRl9TSVpFXzEpCiAKLQotICBIX0FMTE9DX01FTSAoQUFDZHluYW1pY19SQU0sIEZJWFBfREJMKQorSF9BTExPQ19NRU0oQUFDZHluYW1pY19SQU0sIEZJWFBfREJMKQogLyoKICArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBFTkQgLSBEeW5hbWljIFJBTSAtIEFsbG9jYXRpb24gKi8KQEAgLTE5MSwzNiArMjE3LDMzIEBACiAvKgogICBTZWUgZnVydGhlciBNZW1vcnkgQWxsb2NhdGlvbiBkZXRhaWxzIGluIGFhY0VuY19yYW0uY3BwCiAqLwotICBIX0FMTE9DX01FTSAoUmFtX2FhY0VuY19BYWNFbmNvZGVyLCBBQUNfRU5DKQorSF9BTExPQ19NRU0oUmFtX2FhY0VuY19BYWNFbmNvZGVyLCBBQUNfRU5DKQogCi0gIEhfQUxMT0NfTUVNIChSYW1fYWFjRW5jX1BzeUVsZW1lbnQsIFBTWV9FTEVNRU5UKQorSF9BTExPQ19NRU0oUmFtX2FhY0VuY19Qc3lFbGVtZW50LCBQU1lfRUxFTUVOVCkKIAotICBIX0FMTE9DX01FTSAoUmFtX2FhY0VuY19Qc3lJbnRlcm5hbCwgUFNZX0lOVEVSTkFMKQotICBIX0FMTE9DX01FTSAoUmFtX2FhY0VuY19Qc3lTdGF0aWMsIFBTWV9TVEFUSUMpCi0gIEhfQUxMT0NfTUVNIChSYW1fYWFjRW5jX1BzeUlucHV0QnVmZmVyLCBJTlRfUENNKQorSF9BTExPQ19NRU0oUmFtX2FhY0VuY19Qc3lJbnRlcm5hbCwgUFNZX0lOVEVSTkFMKQorSF9BTExPQ19NRU0oUmFtX2FhY0VuY19Qc3lTdGF0aWMsIFBTWV9TVEFUSUMpCitIX0FMTE9DX01FTShSYW1fYWFjRW5jX1BzeUlucHV0QnVmZmVyLCBJTlRfUENNKQogCi0gIFBTWV9EWU5BTUlDICpHZXRSYW1fYWFjRW5jX1BzeUR5bmFtaWMgKGludCBuLCBVQ0hBUiogZHluYW1pY19SQU0pOwotICBIX0FMTE9DX01FTSAoUmFtX2JzT3V0YnVmZmVyLCBVQ0hBUikKK1BTWV9EWU5BTUlDICpHZXRSYW1fYWFjRW5jX1BzeUR5bmFtaWMoaW50IG4sIFVDSEFSICpkeW5hbWljX1JBTSk7CiAKLSAgSF9BTExPQ19NRU0gKFJhbV9hYWNFbmNfUHN5T3V0Q2hhbm5lbCwgUFNZX09VVF9DSEFOTkVMKQorSF9BTExPQ19NRU0oUmFtX2FhY0VuY19Qc3lPdXRDaGFubmVsLCBQU1lfT1VUX0NIQU5ORUwpCiAKLSAgSF9BTExPQ19NRU0gKFJhbV9hYWNFbmNfUHN5T3V0LCBQU1lfT1VUKQotICBIX0FMTE9DX01FTSAoUmFtX2FhY0VuY19Qc3lPdXRFbGVtZW50cywgUFNZX09VVF9FTEVNRU5UKQorSF9BTExPQ19NRU0oUmFtX2FhY0VuY19Qc3lPdXQsIFBTWV9PVVQpCitIX0FMTE9DX01FTShSYW1fYWFjRW5jX1BzeU91dEVsZW1lbnRzLCBQU1lfT1VUX0VMRU1FTlQpCiAKLSAgSF9BTExPQ19NRU0gKFJhbV9hYWNFbmNfUUNzdGF0ZSwgUUNfU1RBVEUpCi0gIEhfQUxMT0NfTUVNIChSYW1fYWFjRW5jX0FkanVzdFRocmVzaG9sZCwgQURKX1RIUl9TVEFURSkKK0hfQUxMT0NfTUVNKFJhbV9hYWNFbmNfUUNzdGF0ZSwgUUNfU1RBVEUpCitIX0FMTE9DX01FTShSYW1fYWFjRW5jX0FkanVzdFRocmVzaG9sZCwgQURKX1RIUl9TVEFURSkKIAotICBIX0FMTE9DX01FTSAoUmFtX2FhY0VuY19BZGpUaHJTdGF0ZUVsZW1lbnQsIEFUU19FTEVNRU5UKQotICBIX0FMTE9DX01FTSAoUmFtX2FhY0VuY19FbGVtZW50Qml0cywgRUxFTUVOVF9CSVRTKQotICBIX0FMTE9DX01FTSAoUmFtX2FhY0VuY19CaXRDbnRyU3RhdGUsIEJJVENOVFJfU1RBVEUpCitIX0FMTE9DX01FTShSYW1fYWFjRW5jX0FkalRoclN0YXRlRWxlbWVudCwgQVRTX0VMRU1FTlQpCitIX0FMTE9DX01FTShSYW1fYWFjRW5jX0VsZW1lbnRCaXRzLCBFTEVNRU5UX0JJVFMpCitIX0FMTE9DX01FTShSYW1fYWFjRW5jX0JpdENudHJTdGF0ZSwgQklUQ05UUl9TVEFURSkKIAotICBJTlQgKkdldFJhbV9hYWNFbmNfQml0TG9va1VwKGludCBuLCBVQ0hBUiogZHluYW1pY19SQU0pOwotICBJTlQgKkdldFJhbV9hYWNFbmNfTWVyZ2VHYWluTG9va1VwKGludCBuLCBVQ0hBUiogZHluYW1pY19SQU0pOwotICBRQ19PVVRfQ0hBTk5FTCAqR2V0UmFtX2FhY0VuY19RQ2NoYW5uZWwgKGludCBuLCBVQ0hBUiogZHluYW1pY19SQU0pOworSU5UICpHZXRSYW1fYWFjRW5jX0JpdExvb2tVcChpbnQgbiwgVUNIQVIgKmR5bmFtaWNfUkFNKTsKK0lOVCAqR2V0UmFtX2FhY0VuY19NZXJnZUdhaW5Mb29rVXAoaW50IG4sIFVDSEFSICpkeW5hbWljX1JBTSk7CitRQ19PVVRfQ0hBTk5FTCAqR2V0UmFtX2FhY0VuY19RQ2NoYW5uZWwoaW50IG4sIFVDSEFSICpkeW5hbWljX1JBTSk7CiAKLSAgSF9BTExPQ19NRU0gKFJhbV9hYWNFbmNfUUNvdXQsIFFDX09VVCkKLSAgSF9BTExPQ19NRU0gKFJhbV9hYWNFbmNfUUNlbGVtZW50LCBRQ19PVVRfRUxFTUVOVCkKK0hfQUxMT0NfTUVNKFJhbV9hYWNFbmNfUUNvdXQsIFFDX09VVCkKK0hfQUxMT0NfTUVNKFJhbV9hYWNFbmNfUUNlbGVtZW50LCBRQ19PVVRfRUxFTUVOVCkKIAotCi0jZW5kaWYgLyogI2lmbmRlZiBBQUNfRU5DX1JBTV9IICovCi0KKyNlbmRpZiAvKiAjaWZuZGVmIEFBQ0VOQ19SQU1fSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9hYWNFbmNfcm9tLmNwcCBiL2xpYkFBQ2VuYy9zcmMvYWFjRW5jX3JvbS5jcHAKaW5kZXggYzY0NzdlMy4uYWMwZmE5ZCAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9hYWNFbmNfcm9tLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL2FhY0VuY19yb20uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDU3NCArOTAsNzIzIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3JzOiAgICAgIE0uIExvaHdhc3NlciwgTS4gR2F5ZXIKLSAgIENvbnRlbnRzL2Rlc2NyaXB0aW9uOgorICAgQXV0aG9yKHMpOiAgIE0uIExvaHdhc3NlciwgTS4gR2F5ZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJhYWNFbmNfcm9tLmgiCiAKIC8qCiAgICBIdWZmbWFuIFRhYmxlcwogKi8KLWNvbnN0IFVMT05HIEZES2FhY0VuY19odWZmX2x0YWIxXzJbM11bM11bM11bM109Ci17Ci0gIHsKLSAgICB7IHsweDAwMGIwMDA5LDB4MDAwOTAwMDcsMHgwMDBiMDAwOX0sIHsweDAwMGEwMDA4LDB4MDAwNzAwMDYsMHgwMDBhMDAwOH0sIHsweDAwMGIwMDA5LDB4MDAwOTAwMDgsMHgwMDBiMDAwOX0gfSwKLSAgICB7IHsweDAwMGEwMDA4LDB4MDAwNzAwMDYsMHgwMDBhMDAwN30sIHsweDAwMDcwMDA2LDB4MDAwNTAwMDUsMHgwMDA3MDAwNn0sIHsweDAwMDkwMDA3LDB4MDAwNzAwMDYsMHgwMDBhMDAwOH0gfSwKLSAgICB7IHsweDAwMGIwMDA5LDB4MDAwOTAwMDcsMHgwMDBiMDAwOH0sIHsweDAwMDkwMDA4LDB4MDAwNzAwMDYsMHgwMDA5MDAwOH0sIHsweDAwMGIwMDA5LDB4MDAwOTAwMDcsMHgwMDBiMDAwOX0gfQotICB9LAotICB7Ci0gICAgeyB7MHgwMDA5MDAwOCwweDAwMDcwMDA2LDB4MDAwOTAwMDd9LCB7MHgwMDA3MDAwNiwweDAwMDUwMDA1LDB4MDAwNzAwMDZ9LCB7MHgwMDA5MDAwNywweDAwMDcwMDA2LDB4MDAwOTAwMDh9IH0sCi0gICAgeyB7MHgwMDA3MDAwNiwweDAwMDUwMDA1LDB4MDAwNzAwMDZ9LCB7MHgwMDA1MDAwNSwweDAwMDEwMDAzLDB4MDAwNTAwMDV9LCB7MHgwMDA3MDAwNiwweDAwMDUwMDA1LDB4MDAwNzAwMDZ9IH0sCi0gICAgeyB7MHgwMDA5MDAwOCwweDAwMDcwMDA2LDB4MDAwOTAwMDd9LCB7MHgwMDA3MDAwNiwweDAwMDUwMDA1LDB4MDAwNzAwMDZ9LCB7MHgwMDA5MDAwOCwweDAwMDcwMDA2LDB4MDAwOTAwMDh9IH0KLSAgfSwKLSAgewotICAgIHsgezB4MDAwYjAwMDksMHgwMDA5MDAwNywweDAwMGIwMDA5fSwgezB4MDAwOTAwMDgsMHgwMDA3MDAwNiwweDAwMDkwMDA4fSwgezB4MDAwYjAwMDgsMHgwMDA5MDAwNywweDAwMGIwMDA5fSB9LAotICAgIHsgezB4MDAwYTAwMDgsMHgwMDA3MDAwNiwweDAwMDkwMDA3fSwgezB4MDAwNzAwMDYsMHgwMDA1MDAwNCwweDAwMDcwMDA2fSwgezB4MDAwOTAwMDgsMHgwMDA3MDAwNiwweDAwMGEwMDA3fSB9LAotICAgIHsgezB4MDAwYjAwMDksMHgwMDA5MDAwNywweDAwMGIwMDA5fSwgezB4MDAwYTAwMDcsMHgwMDA3MDAwNiwweDAwMDkwMDA4fSwgezB4MDAwYjAwMDksMHgwMDA5MDAwNywweDAwMGIwMDA5fSB9Ci0gIH0KLX07Citjb25zdCBVTE9ORyBGREthYWNFbmNfaHVmZl9sdGFiMV8yWzNdWzNdWzNdWzNdID0geworICAgIHt7ezB4MDAwYjAwMDksIDB4MDAwOTAwMDcsIDB4MDAwYjAwMDl9LAorICAgICAgezB4MDAwYTAwMDgsIDB4MDAwNzAwMDYsIDB4MDAwYTAwMDh9LAorICAgICAgezB4MDAwYjAwMDksIDB4MDAwOTAwMDgsIDB4MDAwYjAwMDl9fSwKKyAgICAge3sweDAwMGEwMDA4LCAweDAwMDcwMDA2LCAweDAwMGEwMDA3fSwKKyAgICAgIHsweDAwMDcwMDA2LCAweDAwMDUwMDA1LCAweDAwMDcwMDA2fSwKKyAgICAgIHsweDAwMDkwMDA3LCAweDAwMDcwMDA2LCAweDAwMGEwMDA4fX0sCisgICAgIHt7MHgwMDBiMDAwOSwgMHgwMDA5MDAwNywgMHgwMDBiMDAwOH0sCisgICAgICB7MHgwMDA5MDAwOCwgMHgwMDA3MDAwNiwgMHgwMDA5MDAwOH0sCisgICAgICB7MHgwMDBiMDAwOSwgMHgwMDA5MDAwNywgMHgwMDBiMDAwOX19fSwKKyAgICB7e3sweDAwMDkwMDA4LCAweDAwMDcwMDA2LCAweDAwMDkwMDA3fSwKKyAgICAgIHsweDAwMDcwMDA2LCAweDAwMDUwMDA1LCAweDAwMDcwMDA2fSwKKyAgICAgIHsweDAwMDkwMDA3LCAweDAwMDcwMDA2LCAweDAwMDkwMDA4fX0sCisgICAgIHt7MHgwMDA3MDAwNiwgMHgwMDA1MDAwNSwgMHgwMDA3MDAwNn0sCisgICAgICB7MHgwMDA1MDAwNSwgMHgwMDAxMDAwMywgMHgwMDA1MDAwNX0sCisgICAgICB7MHgwMDA3MDAwNiwgMHgwMDA1MDAwNSwgMHgwMDA3MDAwNn19LAorICAgICB7ezB4MDAwOTAwMDgsIDB4MDAwNzAwMDYsIDB4MDAwOTAwMDd9LAorICAgICAgezB4MDAwNzAwMDYsIDB4MDAwNTAwMDUsIDB4MDAwNzAwMDZ9LAorICAgICAgezB4MDAwOTAwMDgsIDB4MDAwNzAwMDYsIDB4MDAwOTAwMDh9fX0sCisgICAge3t7MHgwMDBiMDAwOSwgMHgwMDA5MDAwNywgMHgwMDBiMDAwOX0sCisgICAgICB7MHgwMDA5MDAwOCwgMHgwMDA3MDAwNiwgMHgwMDA5MDAwOH0sCisgICAgICB7MHgwMDBiMDAwOCwgMHgwMDA5MDAwNywgMHgwMDBiMDAwOX19LAorICAgICB7ezB4MDAwYTAwMDgsIDB4MDAwNzAwMDYsIDB4MDAwOTAwMDd9LAorICAgICAgezB4MDAwNzAwMDYsIDB4MDAwNTAwMDQsIDB4MDAwNzAwMDZ9LAorICAgICAgezB4MDAwOTAwMDgsIDB4MDAwNzAwMDYsIDB4MDAwYTAwMDd9fSwKKyAgICAge3sweDAwMGIwMDA5LCAweDAwMDkwMDA3LCAweDAwMGIwMDA5fSwKKyAgICAgIHsweDAwMGEwMDA3LCAweDAwMDcwMDA2LCAweDAwMDkwMDA4fSwKKyAgICAgIHsweDAwMGIwMDA5LCAweDAwMDkwMDA3LCAweDAwMGIwMDA5fX19fTsKIAorY29uc3QgVUxPTkcgRkRLYWFjRW5jX2h1ZmZfbHRhYjNfNFszXVszXVszXVszXSA9IHsKKyAgICB7e3sweDAwMDEwMDA0LCAweDAwMDQwMDA1LCAweDAwMDgwMDA4fSwKKyAgICAgIHsweDAwMDQwMDA1LCAweDAwMDUwMDA0LCAweDAwMDgwMDA4fSwKKyAgICAgIHsweDAwMDkwMDA5LCAweDAwMDkwMDA4LCAweDAwMGEwMDBifX0sCisgICAgIHt7MHgwMDA0MDAwNSwgMHgwMDA2MDAwNSwgMHgwMDA5MDAwOH0sCisgICAgICB7MHgwMDA2MDAwNSwgMHgwMDA2MDAwNCwgMHgwMDA5MDAwOH0sCisgICAgICB7MHgwMDA5MDAwOCwgMHgwMDA5MDAwNywgMHgwMDBhMDAwYX19LAorICAgICB7ezB4MDAwOTAwMDksIDB4MDAwYTAwMDgsIDB4MDAwZDAwMGJ9LAorICAgICAgezB4MDAwOTAwMDgsIDB4MDAwOTAwMDgsIDB4MDAwYjAwMGF9LAorICAgICAgezB4MDAwYjAwMGIsIDB4MDAwYTAwMGEsIDB4MDAwYzAwMGJ9fX0sCisgICAge3t7MHgwMDA0MDAwNCwgMHgwMDA2MDAwNSwgMHgwMDBhMDAwOH0sCisgICAgICB7MHgwMDA2MDAwNCwgMHgwMDA3MDAwNCwgMHgwMDBhMDAwOH0sCisgICAgICB7MHgwMDBhMDAwOCwgMHgwMDBhMDAwOCwgMHgwMDBjMDAwYX19LAorICAgICB7ezB4MDAwNTAwMDQsIDB4MDAwNzAwMDQsIDB4MDAwYjAwMDh9LAorICAgICAgezB4MDAwNjAwMDQsIDB4MDAwNzAwMDQsIDB4MDAwYTAwMDd9LAorICAgICAgezB4MDAwOTAwMDgsIDB4MDAwOTAwMDcsIDB4MDAwYjAwMDl9fSwKKyAgICAge3sweDAwMDkwMDA4LCAweDAwMGEwMDA4LCAweDAwMGQwMDBhfSwKKyAgICAgIHsweDAwMDgwMDA3LCAweDAwMDkwMDA3LCAweDAwMGMwMDA5fSwKKyAgICAgIHsweDAwMGEwMDBhLCAweDAwMGIwMDA5LCAweDAwMGMwMDBhfX19LAorICAgIHt7ezB4MDAwODAwMDgsIDB4MDAwYTAwMDgsIDB4MDAwZjAwMGJ9LAorICAgICAgezB4MDAwOTAwMDgsIDB4MDAwYjAwMDcsIDB4MDAwZjAwMGF9LAorICAgICAgezB4MDAwZDAwMGIsIDB4MDAwZTAwMGEsIDB4MDAxMDAwMGN9fSwKKyAgICAge3sweDAwMDgwMDA4LCAweDAwMGEwMDA3LCAweDAwMGUwMDBhfSwKKyAgICAgIHsweDAwMDkwMDA3LCAweDAwMGEwMDA3LCAweDAwMGUwMDA5fSwKKyAgICAgIHsweDAwMGMwMDBhLCAweDAwMGMwMDA5LCAweDAwMGYwMDBifX0sCisgICAgIHt7MHgwMDBiMDAwYiwgMHgwMDBjMDAwYSwgMHgwMDEwMDAwY30sCisgICAgICB7MHgwMDBhMDAwYSwgMHgwMDBiMDAwOSwgMHgwMDBmMDAwYn0sCisgICAgICB7MHgwMDBjMDAwYiwgMHgwMDBjMDAwYSwgMHgwMDBmMDAwYn19fX07CiAKLWNvbnN0IFVMT05HIEZES2FhY0VuY19odWZmX2x0YWIzXzRbM11bM11bM11bM109Ci17Ci0gIHsKLSAgICB7IHsweDAwMDEwMDA0LDB4MDAwNDAwMDUsMHgwMDA4MDAwOH0sIHsweDAwMDQwMDA1LDB4MDAwNTAwMDQsMHgwMDA4MDAwOH0sIHsweDAwMDkwMDA5LDB4MDAwOTAwMDgsMHgwMDBhMDAwYn0gfSwKLSAgICB7IHsweDAwMDQwMDA1LDB4MDAwNjAwMDUsMHgwMDA5MDAwOH0sIHsweDAwMDYwMDA1LDB4MDAwNjAwMDQsMHgwMDA5MDAwOH0sIHsweDAwMDkwMDA4LDB4MDAwOTAwMDcsMHgwMDBhMDAwYX0gfSwKLSAgICB7IHsweDAwMDkwMDA5LDB4MDAwYTAwMDgsMHgwMDBkMDAwYn0sIHsweDAwMDkwMDA4LDB4MDAwOTAwMDgsMHgwMDBiMDAwYX0sIHsweDAwMGIwMDBiLDB4MDAwYTAwMGEsMHgwMDBjMDAwYn0gfQotICB9LAotICB7Ci0gICAgeyB7MHgwMDA0MDAwNCwweDAwMDYwMDA1LDB4MDAwYTAwMDh9LCB7MHgwMDA2MDAwNCwweDAwMDcwMDA0LDB4MDAwYTAwMDh9LCB7MHgwMDBhMDAwOCwweDAwMGEwMDA4LDB4MDAwYzAwMGF9IH0sCi0gICAgeyB7MHgwMDA1MDAwNCwweDAwMDcwMDA0LDB4MDAwYjAwMDh9LCB7MHgwMDA2MDAwNCwweDAwMDcwMDA0LDB4MDAwYTAwMDd9LCB7MHgwMDA5MDAwOCwweDAwMDkwMDA3LDB4MDAwYjAwMDl9IH0sCi0gICAgeyB7MHgwMDA5MDAwOCwweDAwMGEwMDA4LDB4MDAwZDAwMGF9LCB7MHgwMDA4MDAwNywweDAwMDkwMDA3LDB4MDAwYzAwMDl9LCB7MHgwMDBhMDAwYSwweDAwMGIwMDA5LDB4MDAwYzAwMGF9IH0KLSAgfSwKLSAgewotICAgIHsgezB4MDAwODAwMDgsMHgwMDBhMDAwOCwweDAwMGYwMDBifSwgezB4MDAwOTAwMDgsMHgwMDBiMDAwNywweDAwMGYwMDBhfSwgezB4MDAwZDAwMGIsMHgwMDBlMDAwYSwweDAwMTAwMDBjfSB9LAotICAgIHsgezB4MDAwODAwMDgsMHgwMDBhMDAwNywweDAwMGUwMDBhfSwgezB4MDAwOTAwMDcsMHgwMDBhMDAwNywweDAwMGUwMDA5fSwgezB4MDAwYzAwMGEsMHgwMDBjMDAwOSwweDAwMGYwMDBifSB9LAotICAgIHsgezB4MDAwYjAwMGIsMHgwMDBjMDAwYSwweDAwMTAwMDBjfSwgezB4MDAwYTAwMGEsMHgwMDBiMDAwOSwweDAwMGYwMDBifSwgezB4MDAwYzAwMGIsMHgwMDBjMDAwYSwweDAwMGYwMDBifSB9Ci0gIH0KLX07Citjb25zdCBVTE9ORyBGREthYWNFbmNfaHVmZl9sdGFiNV82WzldWzldID0geworICAgIHsweDAwMGQwMDBiLCAweDAwMGMwMDBhLCAweDAwMGIwMDA5LCAweDAwMGIwMDA5LCAweDAwMGEwMDA5LCAweDAwMGIwMDA5LAorICAgICAweDAwMGIwMDA5LCAweDAwMGMwMDBhLCAweDAwMGQwMDBifSwKKyAgICB7MHgwMDBjMDAwYSwgMHgwMDBiMDAwOSwgMHgwMDBhMDAwOCwgMHgwMDA5MDAwNywgMHgwMDA4MDAwNywgMHgwMDA5MDAwNywKKyAgICAgMHgwMDBhMDAwOCwgMHgwMDBiMDAwOSwgMHgwMDBjMDAwYX0sCisgICAgezB4MDAwYzAwMDksIDB4MDAwYTAwMDgsIDB4MDAwOTAwMDYsIDB4MDAwODAwMDYsIDB4MDAwNzAwMDYsIDB4MDAwODAwMDYsCisgICAgIDB4MDAwOTAwMDYsIDB4MDAwYTAwMDgsIDB4MDAwYjAwMDl9LAorICAgIHsweDAwMGIwMDA5LCAweDAwMDkwMDA3LCAweDAwMDgwMDA2LCAweDAwMDUwMDA0LCAweDAwMDQwMDA0LCAweDAwMDUwMDA0LAorICAgICAweDAwMDgwMDA2LCAweDAwMDkwMDA3LCAweDAwMGIwMDA5fSwKKyAgICB7MHgwMDBhMDAwOSwgMHgwMDA4MDAwNywgMHgwMDA3MDAwNiwgMHgwMDA0MDAwNCwgMHgwMDAxMDAwNCwgMHgwMDA0MDAwNCwKKyAgICAgMHgwMDA3MDAwNiwgMHgwMDA4MDAwNywgMHgwMDBiMDAwOX0sCisgICAgezB4MDAwYjAwMDksIDB4MDAwOTAwMDcsIDB4MDAwODAwMDYsIDB4MDAwNTAwMDQsIDB4MDAwNDAwMDQsIDB4MDAwNTAwMDQsCisgICAgIDB4MDAwODAwMDYsIDB4MDAwOTAwMDcsIDB4MDAwYjAwMDl9LAorICAgIHsweDAwMGIwMDA5LCAweDAwMGEwMDA4LCAweDAwMDkwMDA2LCAweDAwMDgwMDA2LCAweDAwMDcwMDA2LCAweDAwMDgwMDA2LAorICAgICAweDAwMDkwMDA2LCAweDAwMGEwMDA4LCAweDAwMGIwMDA5fSwKKyAgICB7MHgwMDBjMDAwYSwgMHgwMDBiMDAwOSwgMHgwMDBhMDAwOCwgMHgwMDA5MDAwNywgMHgwMDA4MDAwNywgMHgwMDA5MDAwNywKKyAgICAgMHgwMDBhMDAwNywgMHgwMDBiMDAwOCwgMHgwMDBjMDAwYX0sCisgICAgezB4MDAwZDAwMGIsIDB4MDAwYzAwMGEsIDB4MDAwYzAwMDksIDB4MDAwYjAwMDksIDB4MDAwYTAwMDksIDB4MDAwYTAwMDksCisgICAgIDB4MDAwYjAwMDksIDB4MDAwYzAwMGEsIDB4MDAwZDAwMGJ9fTsKIAotY29uc3QgVUxPTkcgRkRLYWFjRW5jX2h1ZmZfbHRhYjVfNls5XVs5XT0KLXsKLSAgezB4MDAwZDAwMGIsIDB4MDAwYzAwMGEsIDB4MDAwYjAwMDksIDB4MDAwYjAwMDksIDB4MDAwYTAwMDksIDB4MDAwYjAwMDksIDB4MDAwYjAwMDksIDB4MDAwYzAwMGEsIDB4MDAwZDAwMGJ9LAotICB7MHgwMDBjMDAwYSwgMHgwMDBiMDAwOSwgMHgwMDBhMDAwOCwgMHgwMDA5MDAwNywgMHgwMDA4MDAwNywgMHgwMDA5MDAwNywgMHgwMDBhMDAwOCwgMHgwMDBiMDAwOSwgMHgwMDBjMDAwYX0sCi0gIHsweDAwMGMwMDA5LCAweDAwMGEwMDA4LCAweDAwMDkwMDA2LCAweDAwMDgwMDA2LCAweDAwMDcwMDA2LCAweDAwMDgwMDA2LCAweDAwMDkwMDA2LCAweDAwMGEwMDA4LCAweDAwMGIwMDA5fSwKLSAgezB4MDAwYjAwMDksIDB4MDAwOTAwMDcsIDB4MDAwODAwMDYsIDB4MDAwNTAwMDQsIDB4MDAwNDAwMDQsIDB4MDAwNTAwMDQsIDB4MDAwODAwMDYsIDB4MDAwOTAwMDcsIDB4MDAwYjAwMDl9LAotICB7MHgwMDBhMDAwOSwgMHgwMDA4MDAwNywgMHgwMDA3MDAwNiwgMHgwMDA0MDAwNCwgMHgwMDAxMDAwNCwgMHgwMDA0MDAwNCwgMHgwMDA3MDAwNiwgMHgwMDA4MDAwNywgMHgwMDBiMDAwOX0sCi0gIHsweDAwMGIwMDA5LCAweDAwMDkwMDA3LCAweDAwMDgwMDA2LCAweDAwMDUwMDA0LCAweDAwMDQwMDA0LCAweDAwMDUwMDA0LCAweDAwMDgwMDA2LCAweDAwMDkwMDA3LCAweDAwMGIwMDA5fSwKLSAgezB4MDAwYjAwMDksIDB4MDAwYTAwMDgsIDB4MDAwOTAwMDYsIDB4MDAwODAwMDYsIDB4MDAwNzAwMDYsIDB4MDAwODAwMDYsIDB4MDAwOTAwMDYsIDB4MDAwYTAwMDgsIDB4MDAwYjAwMDl9LAotICB7MHgwMDBjMDAwYSwgMHgwMDBiMDAwOSwgMHgwMDBhMDAwOCwgMHgwMDA5MDAwNywgMHgwMDA4MDAwNywgMHgwMDA5MDAwNywgMHgwMDBhMDAwNywgMHgwMDBiMDAwOCwgMHgwMDBjMDAwYX0sCi0gIHsweDAwMGQwMDBiLCAweDAwMGMwMDBhLCAweDAwMGMwMDA5LCAweDAwMGIwMDA5LCAweDAwMGEwMDA5LCAweDAwMGEwMDA5LCAweDAwMGIwMDA5LCAweDAwMGMwMDBhLCAweDAwMGQwMDBifQotfTsKK2NvbnN0IFVMT05HIEZES2FhY0VuY19odWZmX2x0YWI3XzhbOF1bOF0gPSB7CisgICAgezB4MDAwMTAwMDUsIDB4MDAwMzAwMDQsIDB4MDAwNjAwMDUsIDB4MDAwNzAwMDYsIDB4MDAwODAwMDcsIDB4MDAwOTAwMDgsCisgICAgIDB4MDAwYTAwMDksIDB4MDAwYjAwMGF9LAorICAgIHsweDAwMDMwMDA0LCAweDAwMDQwMDAzLCAweDAwMDYwMDA0LCAweDAwMDcwMDA1LCAweDAwMDgwMDA2LCAweDAwMDgwMDA3LAorICAgICAweDAwMDkwMDA3LCAweDAwMDkwMDA4fSwKKyAgICB7MHgwMDA2MDAwNSwgMHgwMDA2MDAwNCwgMHgwMDA3MDAwNCwgMHgwMDA4MDAwNSwgMHgwMDA4MDAwNiwgMHgwMDA5MDAwNywKKyAgICAgMHgwMDA5MDAwNywgMHgwMDBhMDAwOH0sCisgICAgezB4MDAwNzAwMDYsIDB4MDAwNzAwMDUsIDB4MDAwODAwMDUsIDB4MDAwODAwMDYsIDB4MDAwOTAwMDYsIDB4MDAwOTAwMDcsCisgICAgIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDh9LAorICAgIHsweDAwMDgwMDA3LCAweDAwMDgwMDA2LCAweDAwMDkwMDA2LCAweDAwMDkwMDA2LCAweDAwMGEwMDA3LCAweDAwMGEwMDA3LAorICAgICAweDAwMGEwMDA4LCAweDAwMGIwMDA5fSwKKyAgICB7MHgwMDA5MDAwOCwgMHgwMDA4MDAwNywgMHgwMDA5MDAwNiwgMHgwMDA5MDAwNywgMHgwMDBhMDAwNywgMHgwMDBhMDAwOCwKKyAgICAgMHgwMDBiMDAwOCwgMHgwMDBiMDAwYX0sCisgICAgezB4MDAwYTAwMDksIDB4MDAwOTAwMDcsIDB4MDAwOTAwMDcsIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDgsIDB4MDAwYjAwMDgsCisgICAgIDB4MDAwYzAwMDksIDB4MDAwYzAwMDl9LAorICAgIHsweDAwMGIwMDBhLCAweDAwMGEwMDA4LCAweDAwMGEwMDA4LCAweDAwMGEwMDA4LCAweDAwMGIwMDA5LCAweDAwMGIwMDA5LAorICAgICAweDAwMGMwMDA5LCAweDAwMGMwMDBhfX07CiAKLWNvbnN0IFVMT05HIEZES2FhY0VuY19odWZmX2x0YWI3XzhbOF1bOF09Ci17Ci0gIHsweDAwMDEwMDA1LCAweDAwMDMwMDA0LCAweDAwMDYwMDA1LCAweDAwMDcwMDA2LCAweDAwMDgwMDA3LCAweDAwMDkwMDA4LCAweDAwMGEwMDA5LCAweDAwMGIwMDBhfSwKLSAgezB4MDAwMzAwMDQsIDB4MDAwNDAwMDMsIDB4MDAwNjAwMDQsIDB4MDAwNzAwMDUsIDB4MDAwODAwMDYsIDB4MDAwODAwMDcsIDB4MDAwOTAwMDcsIDB4MDAwOTAwMDh9LAotICB7MHgwMDA2MDAwNSwgMHgwMDA2MDAwNCwgMHgwMDA3MDAwNCwgMHgwMDA4MDAwNSwgMHgwMDA4MDAwNiwgMHgwMDA5MDAwNywgMHgwMDA5MDAwNywgMHgwMDBhMDAwOH0sCi0gIHsweDAwMDcwMDA2LCAweDAwMDcwMDA1LCAweDAwMDgwMDA1LCAweDAwMDgwMDA2LCAweDAwMDkwMDA2LCAweDAwMDkwMDA3LCAweDAwMGEwMDA4LCAweDAwMGEwMDA4fSwKLSAgezB4MDAwODAwMDcsIDB4MDAwODAwMDYsIDB4MDAwOTAwMDYsIDB4MDAwOTAwMDYsIDB4MDAwYTAwMDcsIDB4MDAwYTAwMDcsIDB4MDAwYTAwMDgsIDB4MDAwYjAwMDl9LAotICB7MHgwMDA5MDAwOCwgMHgwMDA4MDAwNywgMHgwMDA5MDAwNiwgMHgwMDA5MDAwNywgMHgwMDBhMDAwNywgMHgwMDBhMDAwOCwgMHgwMDBiMDAwOCwgMHgwMDBiMDAwYX0sCi0gIHsweDAwMGEwMDA5LCAweDAwMDkwMDA3LCAweDAwMDkwMDA3LCAweDAwMGEwMDA4LCAweDAwMGEwMDA4LCAweDAwMGIwMDA4LCAweDAwMGMwMDA5LCAweDAwMGMwMDA5fSwKLSAgezB4MDAwYjAwMGEsIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDgsIDB4MDAwYjAwMDksIDB4MDAwYjAwMDksIDB4MDAwYzAwMDksIDB4MDAwYzAwMGF9Ci19OworY29uc3QgVUxPTkcgRkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbMTNdWzEzXSA9IHsKKyAgICB7MHgwMDAxMDAwNiwgMHgwMDAzMDAwNSwgMHgwMDA2MDAwNiwgMHgwMDA4MDAwNiwgMHgwMDA5MDAwNywgMHgwMDBhMDAwOCwKKyAgICAgMHgwMDBhMDAwOSwgMHgwMDBiMDAwYSwgMHgwMDBiMDAwYSwgMHgwMDBjMDAwYSwgMHgwMDBjMDAwYiwgMHgwMDBkMDAwYiwKKyAgICAgMHgwMDBkMDAwY30sCisgICAgezB4MDAwMzAwMDUsIDB4MDAwNDAwMDQsIDB4MDAwNjAwMDQsIDB4MDAwNzAwMDUsIDB4MDAwODAwMDYsIDB4MDAwODAwMDcsCisgICAgIDB4MDAwOTAwMDcsIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDksIDB4MDAwYjAwMGEsIDB4MDAwYzAwMGEsCisgICAgIDB4MDAwYzAwMGJ9LAorICAgIHsweDAwMDYwMDA2LCAweDAwMDYwMDA0LCAweDAwMDcwMDA1LCAweDAwMDgwMDA1LCAweDAwMDgwMDA2LCAweDAwMDkwMDA2LAorICAgICAweDAwMGEwMDA3LCAweDAwMGEwMDA4LCAweDAwMGEwMDA4LCAweDAwMGIwMDA5LCAweDAwMGMwMDA5LCAweDAwMGMwMDBhLAorICAgICAweDAwMGMwMDBhfSwKKyAgICB7MHgwMDA4MDAwNiwgMHgwMDA3MDAwNSwgMHgwMDA4MDAwNSwgMHgwMDA5MDAwNSwgMHgwMDA5MDAwNiwgMHgwMDBhMDAwNywKKyAgICAgMHgwMDBhMDAwNywgMHgwMDBiMDAwOCwgMHgwMDBiMDAwOCwgMHgwMDBiMDAwOSwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwYSwKKyAgICAgMHgwMDBkMDAwYX0sCisgICAgezB4MDAwOTAwMDcsIDB4MDAwODAwMDYsIDB4MDAwOTAwMDYsIDB4MDAwOTAwMDYsIDB4MDAwYTAwMDYsIDB4MDAwYTAwMDcsCisgICAgIDB4MDAwYjAwMDcsIDB4MDAwYjAwMDgsIDB4MDAwYjAwMDgsIDB4MDAwYzAwMDksIDB4MDAwYzAwMDksIDB4MDAwYzAwMGEsCisgICAgIDB4MDAwZDAwMGF9LAorICAgIHsweDAwMGEwMDA4LCAweDAwMDkwMDA3LCAweDAwMDkwMDA2LCAweDAwMGEwMDA3LCAweDAwMGIwMDA3LCAweDAwMGIwMDA3LAorICAgICAweDAwMGIwMDA4LCAweDAwMGMwMDA4LCAweDAwMGIwMDA4LCAweDAwMGMwMDA5LCAweDAwMGMwMDBhLCAweDAwMGQwMDBhLAorICAgICAweDAwMGQwMDBifSwKKyAgICB7MHgwMDBiMDAwOSwgMHgwMDA5MDAwNywgMHgwMDBhMDAwNywgMHgwMDBiMDAwNywgMHgwMDBiMDAwNywgMHgwMDBiMDAwOCwKKyAgICAgMHgwMDBjMDAwOCwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwOSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYSwKKyAgICAgMHgwMDBkMDAwYn0sCisgICAgezB4MDAwYjAwMDksIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDgsIDB4MDAwYjAwMDgsIDB4MDAwYjAwMDgsIDB4MDAwYzAwMDgsCisgICAgIDB4MDAwYzAwMDksIDB4MDAwZDAwMDksIDB4MDAwZDAwMDksIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGIsCisgICAgIDB4MDAwZDAwMGJ9LAorICAgIHsweDAwMGIwMDA5LCAweDAwMGEwMDA4LCAweDAwMGEwMDA4LCAweDAwMGIwMDA4LCAweDAwMGIwMDA4LCAweDAwMGIwMDA4LAorICAgICAweDAwMGMwMDA5LCAweDAwMGMwMDA5LCAweDAwMGQwMDBhLCAweDAwMGQwMDBhLCAweDAwMGUwMDBhLCAweDAwMGQwMDBiLAorICAgICAweDAwMGUwMDBifSwKKyAgICB7MHgwMDBiMDAwYSwgMHgwMDBhMDAwOSwgMHgwMDBiMDAwOSwgMHgwMDBiMDAwOSwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwOSwKKyAgICAgMHgwMDBjMDAwOSwgMHgwMDBjMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBlMDAwYiwgMHgwMDBlMDAwYiwKKyAgICAgMHgwMDBlMDAwY30sCisgICAgezB4MDAwYzAwMGEsIDB4MDAwYjAwMDksIDB4MDAwYjAwMDksIDB4MDAwYzAwMDksIDB4MDAwYzAwMDksIDB4MDAwYzAwMGEsCisgICAgIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZTAwMGIsIDB4MDAwZTAwMGIsIDB4MDAwZTAwMGIsCisgICAgIDB4MDAwZjAwMGN9LAorICAgIHsweDAwMGMwMDBiLCAweDAwMGIwMDBhLCAweDAwMGMwMDA5LCAweDAwMGMwMDBhLCAweDAwMGMwMDBhLCAweDAwMGQwMDBhLAorICAgICAweDAwMGQwMDBhLCAweDAwMGQwMDBhLCAweDAwMGQwMDBiLCAweDAwMGUwMDBiLCAweDAwMGUwMDBiLCAweDAwMGYwMDBiLAorICAgICAweDAwMGYwMDBjfSwKKyAgICB7MHgwMDBkMDAwYiwgMHgwMDBjMDAwYSwgMHgwMDBjMDAwYSwgMHgwMDBjMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYSwKKyAgICAgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYiwgMHgwMDBlMDAwYiwgMHgwMDBlMDAwYywgMHgwMDBlMDAwYywgMHgwMDBlMDAwYywKKyAgICAgMHgwMDBmMDAwY319OwogCi1jb25zdCBVTE9ORyBGREthYWNFbmNfaHVmZl9sdGFiOV8xMFsxM11bMTNdPQotewotICB7MHgwMDAxMDAwNiwgMHgwMDAzMDAwNSwgMHgwMDA2MDAwNiwgMHgwMDA4MDAwNiwgMHgwMDA5MDAwNywgMHgwMDBhMDAwOCwgMHgwMDBhMDAwOSwgMHgwMDBiMDAwYSwgMHgwMDBiMDAwYSwgMHgwMDBjMDAwYSwgMHgwMDBjMDAwYiwgMHgwMDBkMDAwYiwgMHgwMDBkMDAwY30sCi0gIHsweDAwMDMwMDA1LCAweDAwMDQwMDA0LCAweDAwMDYwMDA0LCAweDAwMDcwMDA1LCAweDAwMDgwMDA2LCAweDAwMDgwMDA3LCAweDAwMDkwMDA3LCAweDAwMGEwMDA4LCAweDAwMGEwMDA4LCAweDAwMGEwMDA5LCAweDAwMGIwMDBhLCAweDAwMGMwMDBhLCAweDAwMGMwMDBifSwKLSAgezB4MDAwNjAwMDYsIDB4MDAwNjAwMDQsIDB4MDAwNzAwMDUsIDB4MDAwODAwMDUsIDB4MDAwODAwMDYsIDB4MDAwOTAwMDYsIDB4MDAwYTAwMDcsIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDgsIDB4MDAwYjAwMDksIDB4MDAwYzAwMDksIDB4MDAwYzAwMGEsIDB4MDAwYzAwMGF9LAotICB7MHgwMDA4MDAwNiwgMHgwMDA3MDAwNSwgMHgwMDA4MDAwNSwgMHgwMDA5MDAwNSwgMHgwMDA5MDAwNiwgMHgwMDBhMDAwNywgMHgwMDBhMDAwNywgMHgwMDBiMDAwOCwgMHgwMDBiMDAwOCwgMHgwMDBiMDAwOSwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwYSwgMHgwMDBkMDAwYX0sCi0gIHsweDAwMDkwMDA3LCAweDAwMDgwMDA2LCAweDAwMDkwMDA2LCAweDAwMDkwMDA2LCAweDAwMGEwMDA2LCAweDAwMGEwMDA3LCAweDAwMGIwMDA3LCAweDAwMGIwMDA4LCAweDAwMGIwMDA4LCAweDAwMGMwMDA5LCAweDAwMGMwMDA5LCAweDAwMGMwMDBhLCAweDAwMGQwMDBhfSwKLSAgezB4MDAwYTAwMDgsIDB4MDAwOTAwMDcsIDB4MDAwOTAwMDYsIDB4MDAwYTAwMDcsIDB4MDAwYjAwMDcsIDB4MDAwYjAwMDcsIDB4MDAwYjAwMDgsIDB4MDAwYzAwMDgsIDB4MDAwYjAwMDgsIDB4MDAwYzAwMDksIDB4MDAwYzAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGJ9LAotICB7MHgwMDBiMDAwOSwgMHgwMDA5MDAwNywgMHgwMDBhMDAwNywgMHgwMDBiMDAwNywgMHgwMDBiMDAwNywgMHgwMDBiMDAwOCwgMHgwMDBjMDAwOCwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwOSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYn0sCi0gIHsweDAwMGIwMDA5LCAweDAwMGEwMDA4LCAweDAwMGEwMDA4LCAweDAwMGIwMDA4LCAweDAwMGIwMDA4LCAweDAwMGMwMDA4LCAweDAwMGMwMDA5LCAweDAwMGQwMDA5LCAweDAwMGQwMDA5LCAweDAwMGQwMDBhLCAweDAwMGQwMDBhLCAweDAwMGQwMDBiLCAweDAwMGQwMDBifSwKLSAgezB4MDAwYjAwMDksIDB4MDAwYTAwMDgsIDB4MDAwYTAwMDgsIDB4MDAwYjAwMDgsIDB4MDAwYjAwMDgsIDB4MDAwYjAwMDgsIDB4MDAwYzAwMDksIDB4MDAwYzAwMDksIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZTAwMGEsIDB4MDAwZDAwMGIsIDB4MDAwZTAwMGJ9LAotICB7MHgwMDBiMDAwYSwgMHgwMDBhMDAwOSwgMHgwMDBiMDAwOSwgMHgwMDBiMDAwOSwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwOSwgMHgwMDBjMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBlMDAwYiwgMHgwMDBlMDAwYiwgMHgwMDBlMDAwY30sCi0gIHsweDAwMGMwMDBhLCAweDAwMGIwMDA5LCAweDAwMGIwMDA5LCAweDAwMGMwMDA5LCAweDAwMGMwMDA5LCAweDAwMGMwMDBhLCAweDAwMGQwMDBhLCAweDAwMGQwMDBhLCAweDAwMGQwMDBhLCAweDAwMGUwMDBiLCAweDAwMGUwMDBiLCAweDAwMGUwMDBiLCAweDAwMGYwMDBjfSwKLSAgezB4MDAwYzAwMGIsIDB4MDAwYjAwMGEsIDB4MDAwYzAwMDksIDB4MDAwYzAwMGEsIDB4MDAwYzAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGEsIDB4MDAwZDAwMGIsIDB4MDAwZTAwMGIsIDB4MDAwZTAwMGIsIDB4MDAwZjAwMGIsIDB4MDAwZjAwMGN9LAotICB7MHgwMDBkMDAwYiwgMHgwMDBjMDAwYSwgMHgwMDBjMDAwYSwgMHgwMDBjMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYSwgMHgwMDBkMDAwYiwgMHgwMDBlMDAwYiwgMHgwMDBlMDAwYywgMHgwMDBlMDAwYywgMHgwMDBlMDAwYywgMHgwMDBmMDAwY30KLX07Citjb25zdCBVQ0hBUiBGREthYWNFbmNfaHVmZl9sdGFiMTFbMTddWzE3XSA9IHsKKyAgICB7MHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYiwgMHgwYiwKKyAgICAgMHgwYywgMHgwYiwgMHgwYywgMHgwYywgMHgwYX0sCisgICAgezB4MDUsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDcsIDB4MDgsIDB4MDgsIDB4MDksIDB4MDksIDB4MDksIDB4MGEsCisgICAgIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGIsIDB4MDh9LAorICAgIHsweDA2LCAweDA1LCAweDA1LCAweDA2LCAweDA3LCAweDA3LCAweDA4LCAweDA4LCAweDA4LCAweDA5LCAweDA5LCAweDA5LAorICAgICAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDA4fSwKKyAgICB7MHgwNywgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNywgMHgwNywgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOSwgMHgwOSwKKyAgICAgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwOH0sCisgICAgezB4MDgsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDksIDB4MDksIDB4MDksCisgICAgIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MDh9LAorICAgIHsweDA4LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA4LCAweDA4LCAweDA4LCAweDA5LCAweDA5LCAweDA5LCAweDA5LAorICAgICAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDA4fSwKKyAgICB7MHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwYSwKKyAgICAgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwOH0sCisgICAgezB4MDksIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDksIDB4MDksIDB4MDksIDB4MGEsIDB4MGEsCisgICAgIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MDh9LAorICAgIHsweDBhLCAweDA5LCAweDA4LCAweDA4LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDBhLCAweDBhLCAweDBhLAorICAgICAweDBhLCAweDBhLCAweDBhLCAweDBiLCAweDA4fSwKKyAgICB7MHgwYSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwKKyAgICAgMHgwYSwgMHgwYSwgMHgwYiwgMHgwYiwgMHgwOH0sCisgICAgezB4MGIsIDB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsCisgICAgIDB4MGIsIDB4MGEsIDB4MGIsIDB4MGIsIDB4MDh9LAorICAgIHsweDBiLCAweDBhLCAweDA5LCAweDA5LCAweDBhLCAweDA5LCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBiLAorICAgICAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDA4fSwKKyAgICB7MHgwYiwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYiwKKyAgICAgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwOX0sCisgICAgezB4MGIsIDB4MGEsIDB4MDksIDB4MDksIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGIsIDB4MGIsCisgICAgIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MDl9LAorICAgIHsweDBiLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBiLCAweDBiLAorICAgICAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDA5fSwKKyAgICB7MHgwYywgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwKKyAgICAgMHgwYiwgMHgwYiwgMHgwYywgMHgwYywgMHgwOX0sCisgICAgezB4MDksIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsCisgICAgIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDksIDB4MDV9fTsKIAotY29uc3QgVUNIQVIgRkRLYWFjRW5jX2h1ZmZfbHRhYjExWzE3XVsxN109Ci17Ci0gIHsweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA4LCAweDA5LCAweDBhLCAweDBhLCAweDBhLCAweDBiLCAweDBiLCAweDBjLCAweDBiLCAweDBjLCAweDBjLCAweDBhfSwKLSAgezB4MDUsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDcsIDB4MDgsIDB4MDgsIDB4MDksIDB4MDksIDB4MDksIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGIsIDB4MDh9LAotICB7MHgwNiwgMHgwNSwgMHgwNSwgMHgwNiwgMHgwNywgMHgwNywgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwOH0sCi0gIHsweDA3LCAweDA2LCAweDA2LCAweDA2LCAweDA3LCAweDA3LCAweDA4LCAweDA4LCAweDA4LCAweDA5LCAweDA5LCAweDA5LCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDA4fSwKLSAgezB4MDgsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDksIDB4MDksIDB4MDksIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MDh9LAotICB7MHgwOCwgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwOH0sCi0gIHsweDA5LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA5LCAweDA5LCAweDA5LCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDA4fSwKLSAgezB4MDksIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDksIDB4MDksIDB4MDksIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MDh9LAotICB7MHgwYSwgMHgwOSwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYiwgMHgwOH0sCi0gIHsweDBhLCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBiLCAweDBiLCAweDA4fSwKLSAgezB4MGIsIDB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGIsIDB4MGEsIDB4MGIsIDB4MGIsIDB4MDh9LAotICB7MHgwYiwgMHgwYSwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwOH0sCi0gIHsweDBiLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDA5fSwKLSAgezB4MGIsIDB4MGEsIDB4MDksIDB4MDksIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MDl9LAotICB7MHgwYiwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwOX0sCi0gIHsweDBjLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBjLCAweDBjLCAweDA5fSwKLSAgezB4MDksIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDksIDB4MDV9Ci19OworY29uc3QgVUNIQVIgRkRLYWFjRW5jX2h1ZmZfbHRhYnNjZlsxMjFdID0geworICAgIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsCisgICAgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMiwgMHgxMywgMHgxMiwKKyAgICAweDExLCAweDExLCAweDEwLCAweDExLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDBmLCAweDBmLCAweDBlLAorICAgIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGQsIDB4MGQsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGIsCisgICAgMHgwYywgMHgwYiwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwOSwgMHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwNywKKyAgICAweDA2LCAweDA2LCAweDA1LCAweDA0LCAweDAzLCAweDAxLCAweDA0LCAweDA0LCAweDA1LCAweDA2LCAweDA2LAorICAgIDB4MDcsIDB4MDcsIDB4MDgsIDB4MDgsIDB4MDksIDB4MDksIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGIsIDB4MGIsCisgICAgMHgwYiwgMHgwYiwgMHgwYywgMHgwYywgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZSwgMHgwZSwgMHgxMCwgMHgwZiwKKyAgICAweDEwLCAweDBmLCAweDEyLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAorICAgIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsCisgICAgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxM307CiAKLWNvbnN0IFVDSEFSIEZES2FhY0VuY19odWZmX2x0YWJzY2ZbMTIxXT0KLXsKLSAgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywKLSAgMHgxMywgMHgxMywgMHgxMywgMHgxMiwgMHgxMywgMHgxMiwgMHgxMSwgMHgxMSwgMHgxMCwgMHgxMSwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgwZiwgMHgwZiwKLSAgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZCwgMHgwZCwgMHgwYywgMHgwYywgMHgwYywgMHgwYiwgMHgwYywgMHgwYiwgMHgwYSwgMHgwYSwKLSAgMHgwYSwgMHgwOSwgMHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwNywgMHgwNiwgMHgwNiwgMHgwNSwgMHgwNCwgMHgwMywgMHgwMSwgMHgwNCwgMHgwNCwgMHgwNSwKLSAgMHgwNiwgMHgwNiwgMHgwNywgMHgwNywgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYywKLSAgMHgwYywgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZSwgMHgwZSwgMHgxMCwgMHgwZiwgMHgxMCwgMHgwZiwgMHgxMiwgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywKLSAgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywKLSAgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMwotfTsKK2NvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiMVszXVszXVszXVszXSA9IHt7e3sweDA3ZjgsIDB4MDFmMSwgMHgwN2ZkfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAzZjUsIDB4MDA2OCwgMHgwM2YwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDA3ZjcsIDB4MDFlYywgMHgwN2Y1fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MHgwM2YxLCAweDAwNzIsIDB4MDNmNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDc0LCAweDAwMTEsIDB4MDA3Nn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMWViLCAweDAwNmMsIDB4MDNmNn19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezB4MDdmYywgMHgwMWUxLCAweDA3ZjF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDFmMCwgMHgwMDYxLCAweDAxZjZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDdmMiwgMHgwMWVhLCAweDA3ZmJ9fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t7MHgwMWYyLCAweDAwNjksIDB4MDFlZH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDc3LCAweDAwMTcsIDB4MDA2Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMWU2LCAweDAwNjQsIDB4MDFlNX19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezB4MDA2NywgMHgwMDE1LCAweDAwNjJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAxMiwgMHgwMDAwLCAweDAwMTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDA2NSwgMHgwMDE2LCAweDAwNmR9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sweDAxZTksIDB4MDA2MywgMHgwMWU0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwNmIsIDB4MDAxMywgMHgwMDcxfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAxZTMsIDB4MDA3MCwgMHgwMWYzfX19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ezB4MDdmZSwgMHgwMWU3LCAweDA3ZjN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDFlZiwgMHgwMDYwLCAweDAxZWV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDdmMCwgMHgwMWUyLCAweDA3ZmF9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sweDAzZjMsIDB4MDA2YSwgMHgwMWU4fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwNzUsIDB4MDAxMCwgMHgwMDczfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAxZjQsIDB4MDA2ZSwgMHgwM2Y3fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MHgwN2Y2LCAweDAxZTAsIDB4MDdmOX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwM2YyLCAweDAwNjYsIDB4MDFmNX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwN2ZmLCAweDAxZjcsIDB4MDdmNH19fX07CiAKK2NvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiMlszXVszXVszXVszXSA9IHt7e3sweDAxZjMsIDB4MDA2ZiwgMHgwMWZkfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwZWIsIDB4MDAyMywgMHgwMGVhfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAxZjcsIDB4MDBlOCwgMHgwMWZhfX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MHgwMGYyLCAweDAwMmQsIDB4MDA3MH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDIwLCAweDAwMDYsIDB4MDAyYn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDZlLCAweDAwMjgsIDB4MDBlOX19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezB4MDFmOSwgMHgwMDY2LCAweDAwZjh9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDBlNywgMHgwMDFiLCAweDAwZjF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDFmNCwgMHgwMDZiLCAweDAxZjV9fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t7MHgwMGVjLCAweDAwMmEsIDB4MDA2Y30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDJjLCAweDAwMGEsIDB4MDAyN30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDY3LCAweDAwMWEsIDB4MDBmNX19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezB4MDAyNCwgMHgwMDA4LCAweDAwMWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwOSwgMHgwMDAwLCAweDAwMDd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAxZCwgMHgwMDBiLCAweDAwMzB9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sweDAwZWYsIDB4MDAxYywgMHgwMDY0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwMWUsIDB4MDAwYywgMHgwMDI5fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwZjMsIDB4MDAyZiwgMHgwMGYwfX19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ezB4MDFmYywgMHgwMDcxLCAweDAxZjJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDBmNCwgMHgwMDIxLCAweDAwZTZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDBmNywgMHgwMDY4LCAweDAxZjh9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sweDAwZWUsIDB4MDAyMiwgMHgwMDY1fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwMzEsIDB4MDAwMiwgMHgwMDI2fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwZWQsIDB4MDAyNSwgMHgwMDZhfX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MHgwMWZiLCAweDAwNzIsIDB4MDFmZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDY5LCAweDAwMmUsIDB4MDBmNn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMWZmLCAweDAwNmQsIDB4MDFmNn19fX07CiAKLWNvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiMVszXVszXVszXVszXT0KLXsKLSAgewotICAgIHsgezB4MDdmOCwweDAxZjEsMHgwN2ZkfSwgezB4MDNmNSwweDAwNjgsMHgwM2YwfSwgezB4MDdmNywweDAxZWMsMHgwN2Y1fSB9LAotICAgIHsgezB4MDNmMSwweDAwNzIsMHgwM2Y0fSwgezB4MDA3NCwweDAwMTEsMHgwMDc2fSwgezB4MDFlYiwweDAwNmMsMHgwM2Y2fSB9LAotICAgIHsgezB4MDdmYywweDAxZTEsMHgwN2YxfSwgezB4MDFmMCwweDAwNjEsMHgwMWY2fSwgezB4MDdmMiwweDAxZWEsMHgwN2ZifSB9Ci0gIH0sCi0gIHsKLSAgICB7IHsweDAxZjIsMHgwMDY5LDB4MDFlZH0sIHsweDAwNzcsMHgwMDE3LDB4MDA2Zn0sIHsweDAxZTYsMHgwMDY0LDB4MDFlNX0gfSwKLSAgICB7IHsweDAwNjcsMHgwMDE1LDB4MDA2Mn0sIHsweDAwMTIsMHgwMDAwLDB4MDAxNH0sIHsweDAwNjUsMHgwMDE2LDB4MDA2ZH0gfSwKLSAgICB7IHsweDAxZTksMHgwMDYzLDB4MDFlNH0sIHsweDAwNmIsMHgwMDEzLDB4MDA3MX0sIHsweDAxZTMsMHgwMDcwLDB4MDFmM30gfQotICB9LAotICB7Ci0gICAgeyB7MHgwN2ZlLDB4MDFlNywweDA3ZjN9LCB7MHgwMWVmLDB4MDA2MCwweDAxZWV9LCB7MHgwN2YwLDB4MDFlMiwweDA3ZmF9IH0sCi0gICAgeyB7MHgwM2YzLDB4MDA2YSwweDAxZTh9LCB7MHgwMDc1LDB4MDAxMCwweDAwNzN9LCB7MHgwMWY0LDB4MDA2ZSwweDAzZjd9IH0sCi0gICAgeyB7MHgwN2Y2LDB4MDFlMCwweDA3Zjl9LCB7MHgwM2YyLDB4MDA2NiwweDAxZjV9LCB7MHgwN2ZmLDB4MDFmNywweDA3ZjR9IH0KLSAgfQotfTsKK2NvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiM1szXVszXVszXVszXSA9IHt7e3sweDAwMDAsIDB4MDAwOSwgMHgwMGVmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwMGIsIDB4MDAxOSwgMHgwMGYwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAxZWIsIDB4MDFlNiwgMHgwM2YyfX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MHgwMDBhLCAweDAwMzUsIDB4MDFlZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDM0LCAweDAwMzcsIDB4MDFlOX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMWVkLCAweDAxZTcsIDB4MDNmM319LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezB4MDFlZSwgMHgwM2VkLCAweDFmZmF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDFlYywgMHgwMWYyLCAweDA3Zjl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDdmOCwgMHgwM2Y4LCAweDBmZjh9fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t7MHgwMDA4LCAweDAwMzgsIDB4MDNmNn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDM2LCAweDAwNzUsIDB4MDNmMX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwM2ViLCAweDAzZWMsIDB4MGZmNH19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezB4MDAxOCwgMHgwMDc2LCAweDA3ZjR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAzOSwgMHgwMDc0LCAweDAzZWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDFmMywgMHgwMWY0LCAweDA3ZjZ9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sweDAxZTgsIDB4MDNlYSwgMHgxZmZjfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwZjIsIDB4MDFmMSwgMHgwZmZifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAzZjUsIDB4MDdmMywgMHgwZmZjfX19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ezB4MDBlZSwgMHgwM2Y3LCAweDdmZmV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDFmMCwgMHgwN2Y1LCAweDdmZmR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MWZmYiwgMHgzZmZhLCAweGZmZmZ9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sweDAwZjEsIDB4MDNmMCwgMHgzZmZjfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAxZWEsIDB4MDNlZSwgMHgzZmZifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDBmZjYsIDB4MGZmYSwgMHg3ZmZjfX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MHgwN2YyLCAweDBmZjUsIDB4ZmZmZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwM2Y0LCAweDA3ZjcsIDB4N2ZmYn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwZmY3LCAweDBmZjksIDB4N2ZmYX19fX07CiAKLWNvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiMlszXVszXVszXVszXT0KLXsKLSAgewotICAgIHsgezB4MDFmMywweDAwNmYsMHgwMWZkfSwgezB4MDBlYiwweDAwMjMsMHgwMGVhfSwgezB4MDFmNywweDAwZTgsMHgwMWZhfSB9LAotICAgIHsgezB4MDBmMiwweDAwMmQsMHgwMDcwfSwgezB4MDAyMCwweDAwMDYsMHgwMDJifSwgezB4MDA2ZSwweDAwMjgsMHgwMGU5fSB9LAotICAgIHsgezB4MDFmOSwweDAwNjYsMHgwMGY4fSwgezB4MDBlNywweDAwMWIsMHgwMGYxfSwgezB4MDFmNCwweDAwNmIsMHgwMWY1fSB9Ci0gIH0sCi0gIHsKLSAgICB7IHsweDAwZWMsMHgwMDJhLDB4MDA2Y30sIHsweDAwMmMsMHgwMDBhLDB4MDAyN30sIHsweDAwNjcsMHgwMDFhLDB4MDBmNX0gfSwKLSAgICB7IHsweDAwMjQsMHgwMDA4LDB4MDAxZn0sIHsweDAwMDksMHgwMDAwLDB4MDAwN30sIHsweDAwMWQsMHgwMDBiLDB4MDAzMH0gfSwKLSAgICB7IHsweDAwZWYsMHgwMDFjLDB4MDA2NH0sIHsweDAwMWUsMHgwMDBjLDB4MDAyOX0sIHsweDAwZjMsMHgwMDJmLDB4MDBmMH0gfQotICB9LAotICB7Ci0gICAgeyB7MHgwMWZjLDB4MDA3MSwweDAxZjJ9LCB7MHgwMGY0LDB4MDAyMSwweDAwZTZ9LCB7MHgwMGY3LDB4MDA2OCwweDAxZjh9IH0sCi0gICAgeyB7MHgwMGVlLDB4MDAyMiwweDAwNjV9LCB7MHgwMDMxLDB4MDAwMiwweDAwMjZ9LCB7MHgwMGVkLDB4MDAyNSwweDAwNmF9IH0sCi0gICAgeyB7MHgwMWZiLDB4MDA3MiwweDAxZmV9LCB7MHgwMDY5LDB4MDAyZSwweDAwZjZ9LCB7MHgwMWZmLDB4MDA2ZCwweDAxZjZ9IH0KLSAgfQotfTsKK2NvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiNFszXVszXVszXVszXSA9IHt7e3sweDAwMDcsIDB4MDAxNiwgMHgwMGY2fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwMTgsIDB4MDAwOCwgMHgwMGVmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAxZWYsIDB4MDBmMywgMHgwN2Y4fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MHgwMDE5LCAweDAwMTcsIDB4MDBlZH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDE1LCAweDAwMDEsIDB4MDBlMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMGYwLCAweDAwNzAsIDB4MDNmMH19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezB4MDFlZSwgMHgwMGYxLCAweDA3ZmF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDBlZSwgMHgwMGU0LCAweDAzZjJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDdmNiwgMHgwM2VmLCAweDA3ZmR9fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t7MHgwMDA1LCAweDAwMTQsIDB4MDBmMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDA5LCAweDAwMDQsIDB4MDBlNX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMGY0LCAweDAwZTgsIDB4MDNmNH19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ezB4MDAwNiwgMHgwMDAyLCAweDAwZTd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwMywgMHgwMDAwLCAweDAwNmJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDBlMywgMHgwMDY5LCAweDAxZjN9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sweDAwZWIsIDB4MDBlNiwgMHgwM2Y2fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwNmUsIDB4MDA2YSwgMHgwMWY0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAzZWMsIDB4MDFmMCwgMHgwM2Y5fX19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ezB4MDBmNSwgMHgwMGVjLCAweDA3ZmJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDBlYSwgMHgwMDZmLCAweDAzZjd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDdmOSwgMHgwM2YzLCAweDBmZmZ9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sweDAwZTksIDB4MDA2ZCwgMHgwM2Y4fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwNmMsIDB4MDA2OCwgMHgwMWY1fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAzZWUsIDB4MDFmMiwgMHgwN2Y0fX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7MHgwN2Y3LCAweDAzZjEsIDB4MGZmZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwM2VkLCAweDAxZjEsIDB4MDdmNX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwN2ZlLCAweDAzZjUsIDB4MDdmY319fX07CiAKLWNvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiM1szXVszXVszXVszXT0KLXsKLSAgewotICAgIHsgezB4MDAwMCwweDAwMDksMHgwMGVmfSwgezB4MDAwYiwweDAwMTksMHgwMGYwfSwgezB4MDFlYiwweDAxZTYsMHgwM2YyfSB9LAotICAgIHsgezB4MDAwYSwweDAwMzUsMHgwMWVmfSwgezB4MDAzNCwweDAwMzcsMHgwMWU5fSwgezB4MDFlZCwweDAxZTcsMHgwM2YzfSB9LAotICAgIHsgezB4MDFlZSwweDAzZWQsMHgxZmZhfSwgezB4MDFlYywweDAxZjIsMHgwN2Y5fSwgezB4MDdmOCwweDAzZjgsMHgwZmY4fSB9Ci0gIH0sCi0gIHsKLSAgICB7IHsweDAwMDgsMHgwMDM4LDB4MDNmNn0sIHsweDAwMzYsMHgwMDc1LDB4MDNmMX0sIHsweDAzZWIsMHgwM2VjLDB4MGZmNH0gfSwKLSAgICB7IHsweDAwMTgsMHgwMDc2LDB4MDdmNH0sIHsweDAwMzksMHgwMDc0LDB4MDNlZn0sIHsweDAxZjMsMHgwMWY0LDB4MDdmNn0gfSwKLSAgICB7IHsweDAxZTgsMHgwM2VhLDB4MWZmY30sIHsweDAwZjIsMHgwMWYxLDB4MGZmYn0sIHsweDAzZjUsMHgwN2YzLDB4MGZmY30gfQotICB9LAotICB7Ci0gICAgeyB7MHgwMGVlLDB4MDNmNywweDdmZmV9LCB7MHgwMWYwLDB4MDdmNSwweDdmZmR9LCB7MHgxZmZiLDB4M2ZmYSwweGZmZmZ9IH0sCi0gICAgeyB7MHgwMGYxLDB4MDNmMCwweDNmZmN9LCB7MHgwMWVhLDB4MDNlZSwweDNmZmJ9LCB7MHgwZmY2LDB4MGZmYSwweDdmZmN9IH0sCi0gICAgeyB7MHgwN2YyLDB4MGZmNSwweGZmZmV9LCB7MHgwM2Y0LDB4MDdmNywweDdmZmJ9LCB7MHgwZmY3LDB4MGZmOSwweDdmZmF9IH0KLSAgfQotfTsKK2NvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiNVs5XVs5XSA9IHsKKyAgICB7MHgxZmZmLCAweDBmZjcsIDB4MDdmNCwgMHgwN2U4LCAweDAzZjEsIDB4MDdlZSwgMHgwN2Y5LCAweDBmZjgsIDB4MWZmZH0sCisgICAgezB4MGZmZCwgMHgwN2YxLCAweDAzZTgsIDB4MDFlOCwgMHgwMGYwLCAweDAxZWMsIDB4MDNlZSwgMHgwN2YyLCAweDBmZmF9LAorICAgIHsweDBmZjQsIDB4MDNlZiwgMHgwMWYyLCAweDAwZTgsIDB4MDA3MCwgMHgwMGVjLCAweDAxZjAsIDB4MDNlYSwgMHgwN2YzfSwKKyAgICB7MHgwN2ViLCAweDAxZWIsIDB4MDBlYSwgMHgwMDFhLCAweDAwMDgsIDB4MDAxOSwgMHgwMGVlLCAweDAxZWYsIDB4MDdlZH0sCisgICAgezB4MDNmMCwgMHgwMGYyLCAweDAwNzMsIDB4MDAwYiwgMHgwMDAwLCAweDAwMGEsIDB4MDA3MSwgMHgwMGYzLCAweDA3ZTl9LAorICAgIHsweDA3ZWYsIDB4MDFlZSwgMHgwMGVmLCAweDAwMTgsIDB4MDAwOSwgMHgwMDFiLCAweDAwZWIsIDB4MDFlOSwgMHgwN2VjfSwKKyAgICB7MHgwN2Y2LCAweDAzZWIsIDB4MDFmMywgMHgwMGVkLCAweDAwNzIsIDB4MDBlOSwgMHgwMWYxLCAweDAzZWQsIDB4MDdmN30sCisgICAgezB4MGZmNiwgMHgwN2YwLCAweDAzZTksIDB4MDFlZCwgMHgwMGYxLCAweDAxZWEsIDB4MDNlYywgMHgwN2Y4LCAweDBmZjl9LAorICAgIHsweDFmZmMsIDB4MGZmYywgMHgwZmY1LCAweDA3ZWEsIDB4MDNmMywgMHgwM2YyLCAweDA3ZjUsIDB4MGZmYiwgMHgxZmZlfX07CiAKLWNvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiNFszXVszXVszXVszXT0KLXsKLSAgewotICAgIHsgezB4MDAwNywweDAwMTYsMHgwMGY2fSwgezB4MDAxOCwweDAwMDgsMHgwMGVmfSwgezB4MDFlZiwweDAwZjMsMHgwN2Y4fSB9LAotICAgIHsgezB4MDAxOSwweDAwMTcsMHgwMGVkfSwgezB4MDAxNSwweDAwMDEsMHgwMGUyfSwgezB4MDBmMCwweDAwNzAsMHgwM2YwfSB9LAotICAgIHsgezB4MDFlZSwweDAwZjEsMHgwN2ZhfSwgezB4MDBlZSwweDAwZTQsMHgwM2YyfSwgezB4MDdmNiwweDAzZWYsMHgwN2ZkfSB9Ci0gIH0sCi0gIHsKLSAgICB7IHsweDAwMDUsMHgwMDE0LDB4MDBmMn0sIHsweDAwMDksMHgwMDA0LDB4MDBlNX0sIHsweDAwZjQsMHgwMGU4LDB4MDNmNH0gfSwKLSAgICB7IHsweDAwMDYsMHgwMDAyLDB4MDBlN30sIHsweDAwMDMsMHgwMDAwLDB4MDA2Yn0sIHsweDAwZTMsMHgwMDY5LDB4MDFmM30gfSwKLSAgICB7IHsweDAwZWIsMHgwMGU2LDB4MDNmNn0sIHsweDAwNmUsMHgwMDZhLDB4MDFmNH0sIHsweDAzZWMsMHgwMWYwLDB4MDNmOX0gfQotICB9LAotICB7Ci0gICAgeyB7MHgwMGY1LDB4MDBlYywweDA3ZmJ9LCB7MHgwMGVhLDB4MDA2ZiwweDAzZjd9LCB7MHgwN2Y5LDB4MDNmMywweDBmZmZ9IH0sCi0gICAgeyB7MHgwMGU5LDB4MDA2ZCwweDAzZjh9LCB7MHgwMDZjLDB4MDA2OCwweDAxZjV9LCB7MHgwM2VlLDB4MDFmMiwweDA3ZjR9IH0sCi0gICAgeyB7MHgwN2Y3LDB4MDNmMSwweDBmZmV9LCB7MHgwM2VkLDB4MDFmMSwweDA3ZjV9LCB7MHgwN2ZlLDB4MDNmNSwweDA3ZmN9IH0KLSAgfQotfTsKLWNvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiNVs5XVs5XT0KLXsKLSAgezB4MWZmZiwgMHgwZmY3LCAweDA3ZjQsIDB4MDdlOCwgMHgwM2YxLCAweDA3ZWUsIDB4MDdmOSwgMHgwZmY4LCAweDFmZmR9LAotICB7MHgwZmZkLCAweDA3ZjEsIDB4MDNlOCwgMHgwMWU4LCAweDAwZjAsIDB4MDFlYywgMHgwM2VlLCAweDA3ZjIsIDB4MGZmYX0sCi0gIHsweDBmZjQsIDB4MDNlZiwgMHgwMWYyLCAweDAwZTgsIDB4MDA3MCwgMHgwMGVjLCAweDAxZjAsIDB4MDNlYSwgMHgwN2YzfSwKLSAgezB4MDdlYiwgMHgwMWViLCAweDAwZWEsIDB4MDAxYSwgMHgwMDA4LCAweDAwMTksIDB4MDBlZSwgMHgwMWVmLCAweDA3ZWR9LAotICB7MHgwM2YwLCAweDAwZjIsIDB4MDA3MywgMHgwMDBiLCAweDAwMDAsIDB4MDAwYSwgMHgwMDcxLCAweDAwZjMsIDB4MDdlOX0sCi0gIHsweDA3ZWYsIDB4MDFlZSwgMHgwMGVmLCAweDAwMTgsIDB4MDAwOSwgMHgwMDFiLCAweDAwZWIsIDB4MDFlOSwgMHgwN2VjfSwKLSAgezB4MDdmNiwgMHgwM2ViLCAweDAxZjMsIDB4MDBlZCwgMHgwMDcyLCAweDAwZTksIDB4MDFmMSwgMHgwM2VkLCAweDA3Zjd9LAotICB7MHgwZmY2LCAweDA3ZjAsIDB4MDNlOSwgMHgwMWVkLCAweDAwZjEsIDB4MDFlYSwgMHgwM2VjLCAweDA3ZjgsIDB4MGZmOX0sCi0gIHsweDFmZmMsIDB4MGZmYywgMHgwZmY1LCAweDA3ZWEsIDB4MDNmMywgMHgwM2YyLCAweDA3ZjUsIDB4MGZmYiwgMHgxZmZlfQotfTsKK2NvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiNls5XVs5XSA9IHsKKyAgICB7MHgwN2ZlLCAweDAzZmQsIDB4MDFmMSwgMHgwMWViLCAweDAxZjQsIDB4MDFlYSwgMHgwMWYwLCAweDAzZmMsIDB4MDdmZH0sCisgICAgezB4MDNmNiwgMHgwMWU1LCAweDAwZWEsIDB4MDA2YywgMHgwMDcxLCAweDAwNjgsIDB4MDBmMCwgMHgwMWU2LCAweDAzZjd9LAorICAgIHsweDAxZjMsIDB4MDBlZiwgMHgwMDMyLCAweDAwMjcsIDB4MDAyOCwgMHgwMDI2LCAweDAwMzEsIDB4MDBlYiwgMHgwMWY3fSwKKyAgICB7MHgwMWU4LCAweDAwNmYsIDB4MDAyZSwgMHgwMDA4LCAweDAwMDQsIDB4MDAwNiwgMHgwMDI5LCAweDAwNmIsIDB4MDFlZX0sCisgICAgezB4MDFlZiwgMHgwMDcyLCAweDAwMmQsIDB4MDAwMiwgMHgwMDAwLCAweDAwMDMsIDB4MDAyZiwgMHgwMDczLCAweDAxZmF9LAorICAgIHsweDAxZTcsIDB4MDA2ZSwgMHgwMDJiLCAweDAwMDcsIDB4MDAwMSwgMHgwMDA1LCAweDAwMmMsIDB4MDA2ZCwgMHgwMWVjfSwKKyAgICB7MHgwMWY5LCAweDAwZWUsIDB4MDAzMCwgMHgwMDI0LCAweDAwMmEsIDB4MDAyNSwgMHgwMDMzLCAweDAwZWMsIDB4MDFmMn0sCisgICAgezB4MDNmOCwgMHgwMWU0LCAweDAwZWQsIDB4MDA2YSwgMHgwMDcwLCAweDAwNjksIDB4MDA3NCwgMHgwMGYxLCAweDAzZmF9LAorICAgIHsweDA3ZmYsIDB4MDNmOSwgMHgwMWY2LCAweDAxZWQsIDB4MDFmOCwgMHgwMWU5LCAweDAxZjUsIDB4MDNmYiwgMHgwN2ZjfX07CiAKLWNvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiNls5XVs5XT0KLXsKLSAgezB4MDdmZSwgMHgwM2ZkLCAweDAxZjEsIDB4MDFlYiwgMHgwMWY0LCAweDAxZWEsIDB4MDFmMCwgMHgwM2ZjLCAweDA3ZmR9LAotICB7MHgwM2Y2LCAweDAxZTUsIDB4MDBlYSwgMHgwMDZjLCAweDAwNzEsIDB4MDA2OCwgMHgwMGYwLCAweDAxZTYsIDB4MDNmN30sCi0gIHsweDAxZjMsIDB4MDBlZiwgMHgwMDMyLCAweDAwMjcsIDB4MDAyOCwgMHgwMDI2LCAweDAwMzEsIDB4MDBlYiwgMHgwMWY3fSwKLSAgezB4MDFlOCwgMHgwMDZmLCAweDAwMmUsIDB4MDAwOCwgMHgwMDA0LCAweDAwMDYsIDB4MDAyOSwgMHgwMDZiLCAweDAxZWV9LAotICB7MHgwMWVmLCAweDAwNzIsIDB4MDAyZCwgMHgwMDAyLCAweDAwMDAsIDB4MDAwMywgMHgwMDJmLCAweDAwNzMsIDB4MDFmYX0sCi0gIHsweDAxZTcsIDB4MDA2ZSwgMHgwMDJiLCAweDAwMDcsIDB4MDAwMSwgMHgwMDA1LCAweDAwMmMsIDB4MDA2ZCwgMHgwMWVjfSwKLSAgezB4MDFmOSwgMHgwMGVlLCAweDAwMzAsIDB4MDAyNCwgMHgwMDJhLCAweDAwMjUsIDB4MDAzMywgMHgwMGVjLCAweDAxZjJ9LAotICB7MHgwM2Y4LCAweDAxZTQsIDB4MDBlZCwgMHgwMDZhLCAweDAwNzAsIDB4MDA2OSwgMHgwMDc0LCAweDAwZjEsIDB4MDNmYX0sCi0gIHsweDA3ZmYsIDB4MDNmOSwgMHgwMWY2LCAweDAxZWQsIDB4MDFmOCwgMHgwMWU5LCAweDAxZjUsIDB4MDNmYiwgMHgwN2ZjfQotfTsKK2NvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiN1s4XVs4XSA9IHsKKyAgICB7MHgwMDAwLCAweDAwMDUsIDB4MDAzNywgMHgwMDc0LCAweDAwZjIsIDB4MDFlYiwgMHgwM2VkLCAweDA3Zjd9LAorICAgIHsweDAwMDQsIDB4MDAwYywgMHgwMDM1LCAweDAwNzEsIDB4MDBlYywgMHgwMGVlLCAweDAxZWUsIDB4MDFmNX0sCisgICAgezB4MDAzNiwgMHgwMDM0LCAweDAwNzIsIDB4MDBlYSwgMHgwMGYxLCAweDAxZTksIDB4MDFmMywgMHgwM2Y1fSwKKyAgICB7MHgwMDczLCAweDAwNzAsIDB4MDBlYiwgMHgwMGYwLCAweDAxZjEsIDB4MDFmMCwgMHgwM2VjLCAweDAzZmF9LAorICAgIHsweDAwZjMsIDB4MDBlZCwgMHgwMWU4LCAweDAxZWYsIDB4MDNlZiwgMHgwM2YxLCAweDAzZjksIDB4MDdmYn0sCisgICAgezB4MDFlZCwgMHgwMGVmLCAweDAxZWEsIDB4MDFmMiwgMHgwM2YzLCAweDAzZjgsIDB4MDdmOSwgMHgwN2ZjfSwKKyAgICB7MHgwM2VlLCAweDAxZWMsIDB4MDFmNCwgMHgwM2Y0LCAweDAzZjcsIDB4MDdmOCwgMHgwZmZkLCAweDBmZmV9LAorICAgIHsweDA3ZjYsIDB4MDNmMCwgMHgwM2YyLCAweDAzZjYsIDB4MDdmYSwgMHgwN2ZkLCAweDBmZmMsIDB4MGZmZn19OwogCi1jb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjdbOF1bOF09Ci17Ci0gIHsweDAwMDAsIDB4MDAwNSwgMHgwMDM3LCAweDAwNzQsIDB4MDBmMiwgMHgwMWViLCAweDAzZWQsIDB4MDdmN30sCi0gIHsweDAwMDQsIDB4MDAwYywgMHgwMDM1LCAweDAwNzEsIDB4MDBlYywgMHgwMGVlLCAweDAxZWUsIDB4MDFmNX0sCi0gIHsweDAwMzYsIDB4MDAzNCwgMHgwMDcyLCAweDAwZWEsIDB4MDBmMSwgMHgwMWU5LCAweDAxZjMsIDB4MDNmNX0sCi0gIHsweDAwNzMsIDB4MDA3MCwgMHgwMGViLCAweDAwZjAsIDB4MDFmMSwgMHgwMWYwLCAweDAzZWMsIDB4MDNmYX0sCi0gIHsweDAwZjMsIDB4MDBlZCwgMHgwMWU4LCAweDAxZWYsIDB4MDNlZiwgMHgwM2YxLCAweDAzZjksIDB4MDdmYn0sCi0gIHsweDAxZWQsIDB4MDBlZiwgMHgwMWVhLCAweDAxZjIsIDB4MDNmMywgMHgwM2Y4LCAweDA3ZjksIDB4MDdmY30sCi0gIHsweDAzZWUsIDB4MDFlYywgMHgwMWY0LCAweDAzZjQsIDB4MDNmNywgMHgwN2Y4LCAweDBmZmQsIDB4MGZmZX0sCi0gIHsweDA3ZjYsIDB4MDNmMCwgMHgwM2YyLCAweDAzZjYsIDB4MDdmYSwgMHgwN2ZkLCAweDBmZmMsIDB4MGZmZn0KLX07Citjb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjhbOF1bOF0gPSB7CisgICAgezB4MDAwZSwgMHgwMDA1LCAweDAwMTAsIDB4MDAzMCwgMHgwMDZmLCAweDAwZjEsIDB4MDFmYSwgMHgwM2ZlfSwKKyAgICB7MHgwMDAzLCAweDAwMDAsIDB4MDAwNCwgMHgwMDEyLCAweDAwMmMsIDB4MDA2YSwgMHgwMDc1LCAweDAwZjh9LAorICAgIHsweDAwMGYsIDB4MDAwMiwgMHgwMDA2LCAweDAwMTQsIDB4MDAyZSwgMHgwMDY5LCAweDAwNzIsIDB4MDBmNX0sCisgICAgezB4MDAyZiwgMHgwMDExLCAweDAwMTMsIDB4MDAyYSwgMHgwMDMyLCAweDAwNmMsIDB4MDBlYywgMHgwMGZhfSwKKyAgICB7MHgwMDcxLCAweDAwMmIsIDB4MDAyZCwgMHgwMDMxLCAweDAwNmQsIDB4MDA3MCwgMHgwMGYyLCAweDAxZjl9LAorICAgIHsweDAwZWYsIDB4MDA2OCwgMHgwMDMzLCAweDAwNmIsIDB4MDA2ZSwgMHgwMGVlLCAweDAwZjksIDB4MDNmY30sCisgICAgezB4MDFmOCwgMHgwMDc0LCAweDAwNzMsIDB4MDBlZCwgMHgwMGYwLCAweDAwZjYsIDB4MDFmNiwgMHgwMWZkfSwKKyAgICB7MHgwM2ZkLCAweDAwZjMsIDB4MDBmNCwgMHgwMGY3LCAweDAxZjcsIDB4MDFmYiwgMHgwMWZjLCAweDAzZmZ9fTsKIAotY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWI4WzhdWzhdPQotewotICB7MHgwMDBlLCAweDAwMDUsIDB4MDAxMCwgMHgwMDMwLCAweDAwNmYsIDB4MDBmMSwgMHgwMWZhLCAweDAzZmV9LAotICB7MHgwMDAzLCAweDAwMDAsIDB4MDAwNCwgMHgwMDEyLCAweDAwMmMsIDB4MDA2YSwgMHgwMDc1LCAweDAwZjh9LAotICB7MHgwMDBmLCAweDAwMDIsIDB4MDAwNiwgMHgwMDE0LCAweDAwMmUsIDB4MDA2OSwgMHgwMDcyLCAweDAwZjV9LAotICB7MHgwMDJmLCAweDAwMTEsIDB4MDAxMywgMHgwMDJhLCAweDAwMzIsIDB4MDA2YywgMHgwMGVjLCAweDAwZmF9LAotICB7MHgwMDcxLCAweDAwMmIsIDB4MDAyZCwgMHgwMDMxLCAweDAwNmQsIDB4MDA3MCwgMHgwMGYyLCAweDAxZjl9LAotICB7MHgwMGVmLCAweDAwNjgsIDB4MDAzMywgMHgwMDZiLCAweDAwNmUsIDB4MDBlZSwgMHgwMGY5LCAweDAzZmN9LAotICB7MHgwMWY4LCAweDAwNzQsIDB4MDA3MywgMHgwMGVkLCAweDAwZjAsIDB4MDBmNiwgMHgwMWY2LCAweDAxZmR9LAotICB7MHgwM2ZkLCAweDAwZjMsIDB4MDBmNCwgMHgwMGY3LCAweDAxZjcsIDB4MDFmYiwgMHgwMWZjLCAweDAzZmZ9Ci19OworY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWI5WzEzXVsxM10gPSB7CisgICAgezB4MDAwMCwgMHgwMDA1LCAweDAwMzcsIDB4MDBlNywgMHgwMWRlLCAweDAzY2UsIDB4MDNkOSwgMHgwN2M4LCAweDA3Y2QsCisgICAgIDB4MGZjOCwgMHgwZmRkLCAweDFmZTQsIDB4MWZlY30sCisgICAgezB4MDAwNCwgMHgwMDBjLCAweDAwMzUsIDB4MDA3MiwgMHgwMGVhLCAweDAwZWQsIDB4MDFlMiwgMHgwM2QxLCAweDAzZDMsCisgICAgIDB4MDNlMCwgMHgwN2Q4LCAweDBmY2YsIDB4MGZkNX0sCisgICAgezB4MDAzNiwgMHgwMDM0LCAweDAwNzEsIDB4MDBlOCwgMHgwMGVjLCAweDAxZTEsIDB4MDNjZiwgMHgwM2RkLCAweDAzZGIsCisgICAgIDB4MDdkMCwgMHgwZmM3LCAweDBmZDQsIDB4MGZlNH0sCisgICAgezB4MDBlNiwgMHgwMDcwLCAweDAwZTksIDB4MDFkZCwgMHgwMWUzLCAweDAzZDIsIDB4MDNkYywgMHgwN2NjLCAweDA3Y2EsCisgICAgIDB4MDdkZSwgMHgwZmQ4LCAweDBmZWEsIDB4MWZkYn0sCisgICAgezB4MDFkZiwgMHgwMGViLCAweDAxZGMsIDB4MDFlNiwgMHgwM2Q1LCAweDAzZGUsIDB4MDdjYiwgMHgwN2RkLCAweDA3ZGMsCisgICAgIDB4MGZjZCwgMHgwZmUyLCAweDBmZTcsIDB4MWZlMX0sCisgICAgezB4MDNkMCwgMHgwMWUwLCAweDAxZTQsIDB4MDNkNiwgMHgwN2M1LCAweDA3ZDEsIDB4MDdkYiwgMHgwZmQyLCAweDA3ZTAsCisgICAgIDB4MGZkOSwgMHgwZmViLCAweDFmZTMsIDB4MWZlOX0sCisgICAgezB4MDdjNCwgMHgwMWU1LCAweDAzZDcsIDB4MDdjNiwgMHgwN2NmLCAweDA3ZGEsIDB4MGZjYiwgMHgwZmRhLCAweDBmZTMsCisgICAgIDB4MGZlOSwgMHgxZmU2LCAweDFmZjMsIDB4MWZmN30sCisgICAgezB4MDdkMywgMHgwM2Q4LCAweDAzZTEsIDB4MDdkNCwgMHgwN2Q5LCAweDBmZDMsIDB4MGZkZSwgMHgxZmRkLCAweDFmZDksCisgICAgIDB4MWZlMiwgMHgxZmVhLCAweDFmZjEsIDB4MWZmNn0sCisgICAgezB4MDdkMiwgMHgwM2Q0LCAweDAzZGEsIDB4MDdjNywgMHgwN2Q3LCAweDA3ZTIsIDB4MGZjZSwgMHgwZmRiLCAweDFmZDgsCisgICAgIDB4MWZlZSwgMHgzZmYwLCAweDFmZjQsIDB4M2ZmMn0sCisgICAgezB4MDdlMSwgMHgwM2RmLCAweDA3YzksIDB4MDdkNiwgMHgwZmNhLCAweDBmZDAsIDB4MGZlNSwgMHgwZmU2LCAweDFmZWIsCisgICAgIDB4MWZlZiwgMHgzZmYzLCAweDNmZjQsIDB4M2ZmNX0sCisgICAgezB4MGZlMCwgMHgwN2NlLCAweDA3ZDUsIDB4MGZjNiwgMHgwZmQxLCAweDBmZTEsIDB4MWZlMCwgMHgxZmU4LCAweDFmZjAsCisgICAgIDB4M2ZmMSwgMHgzZmY4LCAweDNmZjYsIDB4N2ZmY30sCisgICAgezB4MGZlOCwgMHgwN2RmLCAweDBmYzksIDB4MGZkNywgMHgwZmRjLCAweDFmZGMsIDB4MWZkZiwgMHgxZmVkLCAweDFmZjUsCisgICAgIDB4M2ZmOSwgMHgzZmZiLCAweDdmZmQsIDB4N2ZmZX0sCisgICAgezB4MWZlNywgMHgwZmNjLCAweDBmZDYsIDB4MGZkZiwgMHgxZmRlLCAweDFmZGEsIDB4MWZlNSwgMHgxZmYyLCAweDNmZmEsCisgICAgIDB4M2ZmNywgMHgzZmZjLCAweDNmZmQsIDB4N2ZmZn19OwogCi1jb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjlbMTNdWzEzXT0KLXsKLSAgezB4MDAwMCwgMHgwMDA1LCAweDAwMzcsIDB4MDBlNywgMHgwMWRlLCAweDAzY2UsIDB4MDNkOSwgMHgwN2M4LCAweDA3Y2QsIDB4MGZjOCwgMHgwZmRkLCAweDFmZTQsIDB4MWZlY30sCi0gIHsweDAwMDQsIDB4MDAwYywgMHgwMDM1LCAweDAwNzIsIDB4MDBlYSwgMHgwMGVkLCAweDAxZTIsIDB4MDNkMSwgMHgwM2QzLCAweDAzZTAsIDB4MDdkOCwgMHgwZmNmLCAweDBmZDV9LAotICB7MHgwMDM2LCAweDAwMzQsIDB4MDA3MSwgMHgwMGU4LCAweDAwZWMsIDB4MDFlMSwgMHgwM2NmLCAweDAzZGQsIDB4MDNkYiwgMHgwN2QwLCAweDBmYzcsIDB4MGZkNCwgMHgwZmU0fSwKLSAgezB4MDBlNiwgMHgwMDcwLCAweDAwZTksIDB4MDFkZCwgMHgwMWUzLCAweDAzZDIsIDB4MDNkYywgMHgwN2NjLCAweDA3Y2EsIDB4MDdkZSwgMHgwZmQ4LCAweDBmZWEsIDB4MWZkYn0sCi0gIHsweDAxZGYsIDB4MDBlYiwgMHgwMWRjLCAweDAxZTYsIDB4MDNkNSwgMHgwM2RlLCAweDA3Y2IsIDB4MDdkZCwgMHgwN2RjLCAweDBmY2QsIDB4MGZlMiwgMHgwZmU3LCAweDFmZTF9LAotICB7MHgwM2QwLCAweDAxZTAsIDB4MDFlNCwgMHgwM2Q2LCAweDA3YzUsIDB4MDdkMSwgMHgwN2RiLCAweDBmZDIsIDB4MDdlMCwgMHgwZmQ5LCAweDBmZWIsIDB4MWZlMywgMHgxZmU5fSwKLSAgezB4MDdjNCwgMHgwMWU1LCAweDAzZDcsIDB4MDdjNiwgMHgwN2NmLCAweDA3ZGEsIDB4MGZjYiwgMHgwZmRhLCAweDBmZTMsIDB4MGZlOSwgMHgxZmU2LCAweDFmZjMsIDB4MWZmN30sCi0gIHsweDA3ZDMsIDB4MDNkOCwgMHgwM2UxLCAweDA3ZDQsIDB4MDdkOSwgMHgwZmQzLCAweDBmZGUsIDB4MWZkZCwgMHgxZmQ5LCAweDFmZTIsIDB4MWZlYSwgMHgxZmYxLCAweDFmZjZ9LAotICB7MHgwN2QyLCAweDAzZDQsIDB4MDNkYSwgMHgwN2M3LCAweDA3ZDcsIDB4MDdlMiwgMHgwZmNlLCAweDBmZGIsIDB4MWZkOCwgMHgxZmVlLCAweDNmZjAsIDB4MWZmNCwgMHgzZmYyfSwKLSAgezB4MDdlMSwgMHgwM2RmLCAweDA3YzksIDB4MDdkNiwgMHgwZmNhLCAweDBmZDAsIDB4MGZlNSwgMHgwZmU2LCAweDFmZWIsIDB4MWZlZiwgMHgzZmYzLCAweDNmZjQsIDB4M2ZmNX0sCi0gIHsweDBmZTAsIDB4MDdjZSwgMHgwN2Q1LCAweDBmYzYsIDB4MGZkMSwgMHgwZmUxLCAweDFmZTAsIDB4MWZlOCwgMHgxZmYwLCAweDNmZjEsIDB4M2ZmOCwgMHgzZmY2LCAweDdmZmN9LAotICB7MHgwZmU4LCAweDA3ZGYsIDB4MGZjOSwgMHgwZmQ3LCAweDBmZGMsIDB4MWZkYywgMHgxZmRmLCAweDFmZWQsIDB4MWZmNSwgMHgzZmY5LCAweDNmZmIsIDB4N2ZmZCwgMHg3ZmZlfSwKLSAgezB4MWZlNywgMHgwZmNjLCAweDBmZDYsIDB4MGZkZiwgMHgxZmRlLCAweDFmZGEsIDB4MWZlNSwgMHgxZmYyLCAweDNmZmEsIDB4M2ZmNywgMHgzZmZjLCAweDNmZmQsIDB4N2ZmZn0KLX07Citjb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjEwWzEzXVsxM10gPSB7CisgICAgezB4MDAyMiwgMHgwMDA4LCAweDAwMWQsIDB4MDAyNiwgMHgwMDVmLCAweDAwZDMsIDB4MDFjZiwgMHgwM2QwLCAweDAzZDcsCisgICAgIDB4MDNlZCwgMHgwN2YwLCAweDA3ZjYsIDB4MGZmZH0sCisgICAgezB4MDAwNywgMHgwMDAwLCAweDAwMDEsIDB4MDAwOSwgMHgwMDIwLCAweDAwNTQsIDB4MDA2MCwgMHgwMGQ1LCAweDAwZGMsCisgICAgIDB4MDFkNCwgMHgwM2NkLCAweDAzZGUsIDB4MDdlN30sCisgICAgezB4MDAxYywgMHgwMDAyLCAweDAwMDYsIDB4MDAwYywgMHgwMDFlLCAweDAwMjgsIDB4MDA1YiwgMHgwMGNkLCAweDAwZDksCisgICAgIDB4MDFjZSwgMHgwMWRjLCAweDAzZDksIDB4MDNmMX0sCisgICAgezB4MDAyNSwgMHgwMDBiLCAweDAwMGEsIDB4MDAwZCwgMHgwMDI0LCAweDAwNTcsIDB4MDA2MSwgMHgwMGNjLCAweDAwZGQsCisgICAgIDB4MDFjYywgMHgwMWRlLCAweDAzZDMsIDB4MDNlN30sCisgICAgezB4MDA1ZCwgMHgwMDIxLCAweDAwMWYsIDB4MDAyMywgMHgwMDI3LCAweDAwNTksIDB4MDA2NCwgMHgwMGQ4LCAweDAwZGYsCisgICAgIDB4MDFkMiwgMHgwMWUyLCAweDAzZGQsIDB4MDNlZX0sCisgICAgezB4MDBkMSwgMHgwMDU1LCAweDAwMjksIDB4MDA1NiwgMHgwMDU4LCAweDAwNjIsIDB4MDBjZSwgMHgwMGUwLCAweDAwZTIsCisgICAgIDB4MDFkYSwgMHgwM2Q0LCAweDAzZTMsIDB4MDdlYn0sCisgICAgezB4MDFjOSwgMHgwMDVlLCAweDAwNWEsIDB4MDA1YywgMHgwMDYzLCAweDAwY2EsIDB4MDBkYSwgMHgwMWM3LCAweDAxY2EsCisgICAgIDB4MDFlMCwgMHgwM2RiLCAweDAzZTgsIDB4MDdlY30sCisgICAgezB4MDFlMywgMHgwMGQyLCAweDAwY2IsIDB4MDBkMCwgMHgwMGQ3LCAweDAwZGIsIDB4MDFjNiwgMHgwMWQ1LCAweDAxZDgsCisgICAgIDB4MDNjYSwgMHgwM2RhLCAweDA3ZWEsIDB4MDdmMX0sCisgICAgezB4MDFlMSwgMHgwMGQ0LCAweDAwY2YsIDB4MDBkNiwgMHgwMGRlLCAweDAwZTEsIDB4MDFkMCwgMHgwMWQ2LCAweDAzZDEsCisgICAgIDB4MDNkNSwgMHgwM2YyLCAweDA3ZWUsIDB4MDdmYn0sCisgICAgezB4MDNlOSwgMHgwMWNkLCAweDAxYzgsIDB4MDFjYiwgMHgwMWQxLCAweDAxZDcsIDB4MDFkZiwgMHgwM2NmLCAweDAzZTAsCisgICAgIDB4MDNlZiwgMHgwN2U2LCAweDA3ZjgsIDB4MGZmYX0sCisgICAgezB4MDNlYiwgMHgwMWRkLCAweDAxZDMsIDB4MDFkOSwgMHgwMWRiLCAweDAzZDIsIDB4MDNjYywgMHgwM2RjLCAweDAzZWEsCisgICAgIDB4MDdlZCwgMHgwN2YzLCAweDA3ZjksIDB4MGZmOX0sCisgICAgezB4MDdmMiwgMHgwM2NlLCAweDAxZTQsIDB4MDNjYiwgMHgwM2Q4LCAweDAzZDYsIDB4MDNlMiwgMHgwM2U1LCAweDA3ZTgsCisgICAgIDB4MDdmNCwgMHgwN2Y1LCAweDA3ZjcsIDB4MGZmYn0sCisgICAgezB4MDdmYSwgMHgwM2VjLCAweDAzZGYsIDB4MDNlMSwgMHgwM2U0LCAweDAzZTYsIDB4MDNmMCwgMHgwN2U5LCAweDA3ZWYsCisgICAgIDB4MGZmOCwgMHgwZmZlLCAweDBmZmMsIDB4MGZmZn19OwogCi1jb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjEwWzEzXVsxM109Ci17Ci0gIHsweDAwMjIsIDB4MDAwOCwgMHgwMDFkLCAweDAwMjYsIDB4MDA1ZiwgMHgwMGQzLCAweDAxY2YsIDB4MDNkMCwgMHgwM2Q3LCAweDAzZWQsIDB4MDdmMCwgMHgwN2Y2LCAweDBmZmR9LAotICB7MHgwMDA3LCAweDAwMDAsIDB4MDAwMSwgMHgwMDA5LCAweDAwMjAsIDB4MDA1NCwgMHgwMDYwLCAweDAwZDUsIDB4MDBkYywgMHgwMWQ0LCAweDAzY2QsIDB4MDNkZSwgMHgwN2U3fSwKLSAgezB4MDAxYywgMHgwMDAyLCAweDAwMDYsIDB4MDAwYywgMHgwMDFlLCAweDAwMjgsIDB4MDA1YiwgMHgwMGNkLCAweDAwZDksIDB4MDFjZSwgMHgwMWRjLCAweDAzZDksIDB4MDNmMX0sCi0gIHsweDAwMjUsIDB4MDAwYiwgMHgwMDBhLCAweDAwMGQsIDB4MDAyNCwgMHgwMDU3LCAweDAwNjEsIDB4MDBjYywgMHgwMGRkLCAweDAxY2MsIDB4MDFkZSwgMHgwM2QzLCAweDAzZTd9LAotICB7MHgwMDVkLCAweDAwMjEsIDB4MDAxZiwgMHgwMDIzLCAweDAwMjcsIDB4MDA1OSwgMHgwMDY0LCAweDAwZDgsIDB4MDBkZiwgMHgwMWQyLCAweDAxZTIsIDB4MDNkZCwgMHgwM2VlfSwKLSAgezB4MDBkMSwgMHgwMDU1LCAweDAwMjksIDB4MDA1NiwgMHgwMDU4LCAweDAwNjIsIDB4MDBjZSwgMHgwMGUwLCAweDAwZTIsIDB4MDFkYSwgMHgwM2Q0LCAweDAzZTMsIDB4MDdlYn0sCi0gIHsweDAxYzksIDB4MDA1ZSwgMHgwMDVhLCAweDAwNWMsIDB4MDA2MywgMHgwMGNhLCAweDAwZGEsIDB4MDFjNywgMHgwMWNhLCAweDAxZTAsIDB4MDNkYiwgMHgwM2U4LCAweDA3ZWN9LAotICB7MHgwMWUzLCAweDAwZDIsIDB4MDBjYiwgMHgwMGQwLCAweDAwZDcsIDB4MDBkYiwgMHgwMWM2LCAweDAxZDUsIDB4MDFkOCwgMHgwM2NhLCAweDAzZGEsIDB4MDdlYSwgMHgwN2YxfSwKLSAgezB4MDFlMSwgMHgwMGQ0LCAweDAwY2YsIDB4MDBkNiwgMHgwMGRlLCAweDAwZTEsIDB4MDFkMCwgMHgwMWQ2LCAweDAzZDEsIDB4MDNkNSwgMHgwM2YyLCAweDA3ZWUsIDB4MDdmYn0sCi0gIHsweDAzZTksIDB4MDFjZCwgMHgwMWM4LCAweDAxY2IsIDB4MDFkMSwgMHgwMWQ3LCAweDAxZGYsIDB4MDNjZiwgMHgwM2UwLCAweDAzZWYsIDB4MDdlNiwgMHgwN2Y4LCAweDBmZmF9LAotICB7MHgwM2ViLCAweDAxZGQsIDB4MDFkMywgMHgwMWQ5LCAweDAxZGIsIDB4MDNkMiwgMHgwM2NjLCAweDAzZGMsIDB4MDNlYSwgMHgwN2VkLCAweDA3ZjMsIDB4MDdmOSwgMHgwZmY5fSwKLSAgezB4MDdmMiwgMHgwM2NlLCAweDAxZTQsIDB4MDNjYiwgMHgwM2Q4LCAweDAzZDYsIDB4MDNlMiwgMHgwM2U1LCAweDA3ZTgsIDB4MDdmNCwgMHgwN2Y1LCAweDA3ZjcsIDB4MGZmYn0sCi0gIHsweDA3ZmEsIDB4MDNlYywgMHgwM2RmLCAweDAzZTEsIDB4MDNlNCwgMHgwM2U2LCAweDAzZjAsIDB4MDdlOSwgMHgwN2VmLCAweDBmZjgsIDB4MGZmZSwgMHgwZmZjLCAweDBmZmZ9Ci19OworY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWIxMVsyMV1bMTddID0geworICAgIHsweDAwMDAsIDB4MDAwNiwgMHgwMDE5LCAweDAwM2QsIDB4MDA5YywgMHgwMGM2LCAweDAxYTcsIDB4MDM5MCwgMHgwM2MyLAorICAgICAweDAzZGYsIDB4MDdlNiwgMHgwN2YzLCAweDBmZmIsIDB4MDdlYywgMHgwZmZhLCAweDBmZmUsIDB4MDM4ZX0sCisgICAgezB4MDAwNSwgMHgwMDAxLCAweDAwMDgsIDB4MDAxNCwgMHgwMDM3LCAweDAwNDIsIDB4MDA5MiwgMHgwMGFmLCAweDAxOTEsCisgICAgIDB4MDFhNSwgMHgwMWI1LCAweDAzOWUsIDB4MDNjMCwgMHgwM2EyLCAweDAzY2QsIDB4MDdkNiwgMHgwMGFlfSwKKyAgICB7MHgwMDE3LCAweDAwMDcsIDB4MDAwOSwgMHgwMDE4LCAweDAwMzksIDB4MDA0MCwgMHgwMDhlLCAweDAwYTMsIDB4MDBiOCwKKyAgICAgMHgwMTk5LCAweDAxYWMsIDB4MDFjMSwgMHgwM2IxLCAweDAzOTYsIDB4MDNiZSwgMHgwM2NhLCAweDAwOWR9LAorICAgIHsweDAwM2MsIDB4MDAxNSwgMHgwMDE2LCAweDAwMWEsIDB4MDAzYiwgMHgwMDQ0LCAweDAwOTEsIDB4MDBhNSwgMHgwMGJlLAorICAgICAweDAxOTYsIDB4MDFhZSwgMHgwMWI5LCAweDAzYTEsIDB4MDM5MSwgMHgwM2E1LCAweDAzZDUsIDB4MDA5NH0sCisgICAgezB4MDA5YSwgMHgwMDM2LCAweDAwMzgsIDB4MDAzYSwgMHgwMDQxLCAweDAwOGMsIDB4MDA5YiwgMHgwMGIwLCAweDAwYzMsCisgICAgIDB4MDE5ZSwgMHgwMWFiLCAweDAxYmMsIDB4MDM5ZiwgMHgwMzhmLCAweDAzYTksIDB4MDNjZiwgMHgwMDkzfSwKKyAgICB7MHgwMGJmLCAweDAwM2UsIDB4MDAzZiwgMHgwMDQzLCAweDAwNDUsIDB4MDA5ZSwgMHgwMGE3LCAweDAwYjksIDB4MDE5NCwKKyAgICAgMHgwMWEyLCAweDAxYmEsIDB4MDFjMywgMHgwM2E2LCAweDAzYTcsIDB4MDNiYiwgMHgwM2Q0LCAweDAwOWZ9LAorICAgIHsweDAxYTAsIDB4MDA4ZiwgMHgwMDhkLCAweDAwOTAsIDB4MDA5OCwgMHgwMGE2LCAweDAwYjYsIDB4MDBjNCwgMHgwMTlmLAorICAgICAweDAxYWYsIDB4MDFiZiwgMHgwMzk5LCAweDAzYmYsIDB4MDNiNCwgMHgwM2M5LCAweDAzZTcsIDB4MDBhOH0sCisgICAgezB4MDFiNiwgMHgwMGFiLCAweDAwYTQsIDB4MDBhYSwgMHgwMGIyLCAweDAwYzIsIDB4MDBjNSwgMHgwMTk4LCAweDAxYTQsCisgICAgIDB4MDFiOCwgMHgwMzhjLCAweDAzYTQsIDB4MDNjNCwgMHgwM2M2LCAweDAzZGQsIDB4MDNlOCwgMHgwMGFkfSwKKyAgICB7MHgwM2FmLCAweDAxOTIsIDB4MDBiZCwgMHgwMGJjLCAweDAxOGUsIDB4MDE5NywgMHgwMTlhLCAweDAxYTMsIDB4MDFiMSwKKyAgICAgMHgwMzhkLCAweDAzOTgsIDB4MDNiNywgMHgwM2QzLCAweDAzZDEsIDB4MDNkYiwgMHgwN2RkLCAweDAwYjR9LAorICAgIHsweDAzZGUsIDB4MDFhOSwgMHgwMTliLCAweDAxOWMsIDB4MDFhMSwgMHgwMWFhLCAweDAxYWQsIDB4MDFiMywgMHgwMzhiLAorICAgICAweDAzYjIsIDB4MDNiOCwgMHgwM2NlLCAweDAzZTEsIDB4MDNlMCwgMHgwN2QyLCAweDA3ZTUsIDB4MDBiN30sCisgICAgezB4MDdlMywgMHgwMWJiLCAweDAxYTgsIDB4MDFhNiwgMHgwMWIwLCAweDAxYjIsIDB4MDFiNywgMHgwMzliLCAweDAzOWEsCisgICAgIDB4MDNiYSwgMHgwM2I1LCAweDAzZDYsIDB4MDdkNywgMHgwM2U0LCAweDA3ZDgsIDB4MDdlYSwgMHgwMGJhfSwKKyAgICB7MHgwN2U4LCAweDAzYTAsIDB4MDFiZCwgMHgwMWI0LCAweDAzOGEsIDB4MDFjNCwgMHgwMzkyLCAweDAzYWEsIDB4MDNiMCwKKyAgICAgMHgwM2JjLCAweDAzZDcsIDB4MDdkNCwgMHgwN2RjLCAweDA3ZGIsIDB4MDdkNSwgMHgwN2YwLCAweDAwYzF9LAorICAgIHsweDA3ZmIsIDB4MDNjOCwgMHgwM2EzLCAweDAzOTUsIDB4MDM5ZCwgMHgwM2FjLCAweDAzYWUsIDB4MDNjNSwgMHgwM2Q4LAorICAgICAweDAzZTIsIDB4MDNlNiwgMHgwN2U0LCAweDA3ZTcsIDB4MDdlMCwgMHgwN2U5LCAweDA3ZjcsIDB4MDE5MH0sCisgICAgezB4MDdmMiwgMHgwMzkzLCAweDAxYmUsIDB4MDFjMCwgMHgwMzk0LCAweDAzOTcsIDB4MDNhZCwgMHgwM2MzLCAweDAzYzEsCisgICAgIDB4MDNkMiwgMHgwN2RhLCAweDA3ZDksIDB4MDdkZiwgMHgwN2ViLCAweDA3ZjQsIDB4MDdmYSwgMHgwMTk1fSwKKyAgICB7MHgwN2Y4LCAweDAzYmQsIDB4MDM5YywgMHgwM2FiLCAweDAzYTgsIDB4MDNiMywgMHgwM2I5LCAweDAzZDAsIDB4MDNlMywKKyAgICAgMHgwM2U1LCAweDA3ZTIsIDB4MDdkZSwgMHgwN2VkLCAweDA3ZjEsIDB4MDdmOSwgMHgwN2ZjLCAweDAxOTN9LAorICAgIHsweDBmZmQsIDB4MDNkYywgMHgwM2I2LCAweDAzYzcsIDB4MDNjYywgMHgwM2NiLCAweDAzZDksIDB4MDNkYSwgMHgwN2QzLAorICAgICAweDA3ZTEsIDB4MDdlZSwgMHgwN2VmLCAweDA3ZjUsIDB4MDdmNiwgMHgwZmZjLCAweDBmZmYsIDB4MDE5ZH0sCisgICAgezB4MDFjMiwgMHgwMGI1LCAweDAwYTEsIDB4MDA5NiwgMHgwMDk3LCAweDAwOTUsIDB4MDA5OSwgMHgwMGEwLCAweDAwYTIsCisgICAgIDB4MDBhYywgMHgwMGE5LCAweDAwYjEsIDB4MDBiMywgMHgwMGJiLCAweDAwYzAsIDB4MDE4ZiwgMHgwMDA0fSwKKyAgICB7MHgwMDE4LCAweDAwMmUsIDB4MDAwMCwgMHgwMDVhLCAweDAwYTUsIDB4MDBmOCwgMHgwMGI3LCAweDAwOTQsIDB4MDBmOSwKKyAgICAgMHgwMDRkLCAweDAwMjEsIDB4MDAyYiwgMHgwMDRmLCAweDAwN2IsIDB4MDBiYywgMHgwMDQ2LCAweDAwMTV9LAorICAgIHsweDAwNDIsIDB4MDAzNywgMHgwMDc4LCAweDAwMGQsIDB4MDA2OCwgMHgwMDVmLCAweDAwMGQsIDB4MDA1ZSwgMHgwMDVhLAorICAgICAweDAwYmUsIDB4MDA2MywgMHgwMDdlLCAweDAwMWYsIDB4MDA5MiwgMHgwMDFhLCAweDAwYWIsIDB4MDAzMn0sCisgICAgezB4MDBlNiwgMHgwMDM3LCAweDAwMDAsIDB4MDA1OCwgMHgwMDBiLCAweDAwNWEsIDB4MDBlMSwgMHgwMDVkLCAweDAwMjksCisgICAgIDB4MDAxNywgMHgwMDdlLCAweDAwNjksIDB4MDBhYSwgMHgwMDU0LCAweDAwMjksIDB4MDAzMiwgMHgwMDQxfSwKKyAgICB7MHgwMDQ2LCAweDAwZWEsIDB4MDAzNCwgMHgwMGVhLCAweDAwMTEsIDB4MDAxYiwgMHgwMGE5LCAweDAwOTQsIDB4MDBlMiwKKyAgICAgMHgwMDMxLCAweDAwZDAsIDB4MDBlNSwgMHgwMDA3LCAweDAwNzAsIDB4MDA2OSwgMHgwMDNlLCAweDAwMjF9fTsKIAotY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWIxMVsyMV1bMTddPQotewotICB7MHgwMDAwLCAweDAwMDYsIDB4MDAxOSwgMHgwMDNkLCAweDAwOWMsIDB4MDBjNiwgMHgwMWE3LCAweDAzOTAsIDB4MDNjMiwgMHgwM2RmLCAweDA3ZTYsIDB4MDdmMywgMHgwZmZiLCAweDA3ZWMsIDB4MGZmYSwgMHgwZmZlLCAweDAzOGV9LAotICB7MHgwMDA1LCAweDAwMDEsIDB4MDAwOCwgMHgwMDE0LCAweDAwMzcsIDB4MDA0MiwgMHgwMDkyLCAweDAwYWYsIDB4MDE5MSwgMHgwMWE1LCAweDAxYjUsIDB4MDM5ZSwgMHgwM2MwLCAweDAzYTIsIDB4MDNjZCwgMHgwN2Q2LCAweDAwYWV9LAotICB7MHgwMDE3LCAweDAwMDcsIDB4MDAwOSwgMHgwMDE4LCAweDAwMzksIDB4MDA0MCwgMHgwMDhlLCAweDAwYTMsIDB4MDBiOCwgMHgwMTk5LCAweDAxYWMsIDB4MDFjMSwgMHgwM2IxLCAweDAzOTYsIDB4MDNiZSwgMHgwM2NhLCAweDAwOWR9LAotICB7MHgwMDNjLCAweDAwMTUsIDB4MDAxNiwgMHgwMDFhLCAweDAwM2IsIDB4MDA0NCwgMHgwMDkxLCAweDAwYTUsIDB4MDBiZSwgMHgwMTk2LCAweDAxYWUsIDB4MDFiOSwgMHgwM2ExLCAweDAzOTEsIDB4MDNhNSwgMHgwM2Q1LCAweDAwOTR9LAotICB7MHgwMDlhLCAweDAwMzYsIDB4MDAzOCwgMHgwMDNhLCAweDAwNDEsIDB4MDA4YywgMHgwMDliLCAweDAwYjAsIDB4MDBjMywgMHgwMTllLCAweDAxYWIsIDB4MDFiYywgMHgwMzlmLCAweDAzOGYsIDB4MDNhOSwgMHgwM2NmLCAweDAwOTN9LAotICB7MHgwMGJmLCAweDAwM2UsIDB4MDAzZiwgMHgwMDQzLCAweDAwNDUsIDB4MDA5ZSwgMHgwMGE3LCAweDAwYjksIDB4MDE5NCwgMHgwMWEyLCAweDAxYmEsIDB4MDFjMywgMHgwM2E2LCAweDAzYTcsIDB4MDNiYiwgMHgwM2Q0LCAweDAwOWZ9LAotICB7MHgwMWEwLCAweDAwOGYsIDB4MDA4ZCwgMHgwMDkwLCAweDAwOTgsIDB4MDBhNiwgMHgwMGI2LCAweDAwYzQsIDB4MDE5ZiwgMHgwMWFmLCAweDAxYmYsIDB4MDM5OSwgMHgwM2JmLCAweDAzYjQsIDB4MDNjOSwgMHgwM2U3LCAweDAwYTh9LAotICB7MHgwMWI2LCAweDAwYWIsIDB4MDBhNCwgMHgwMGFhLCAweDAwYjIsIDB4MDBjMiwgMHgwMGM1LCAweDAxOTgsIDB4MDFhNCwgMHgwMWI4LCAweDAzOGMsIDB4MDNhNCwgMHgwM2M0LCAweDAzYzYsIDB4MDNkZCwgMHgwM2U4LCAweDAwYWR9LAotICB7MHgwM2FmLCAweDAxOTIsIDB4MDBiZCwgMHgwMGJjLCAweDAxOGUsIDB4MDE5NywgMHgwMTlhLCAweDAxYTMsIDB4MDFiMSwgMHgwMzhkLCAweDAzOTgsIDB4MDNiNywgMHgwM2QzLCAweDAzZDEsIDB4MDNkYiwgMHgwN2RkLCAweDAwYjR9LAotICB7MHgwM2RlLCAweDAxYTksIDB4MDE5YiwgMHgwMTljLCAweDAxYTEsIDB4MDFhYSwgMHgwMWFkLCAweDAxYjMsIDB4MDM4YiwgMHgwM2IyLCAweDAzYjgsIDB4MDNjZSwgMHgwM2UxLCAweDAzZTAsIDB4MDdkMiwgMHgwN2U1LCAweDAwYjd9LAotICB7MHgwN2UzLCAweDAxYmIsIDB4MDFhOCwgMHgwMWE2LCAweDAxYjAsIDB4MDFiMiwgMHgwMWI3LCAweDAzOWIsIDB4MDM5YSwgMHgwM2JhLCAweDAzYjUsIDB4MDNkNiwgMHgwN2Q3LCAweDAzZTQsIDB4MDdkOCwgMHgwN2VhLCAweDAwYmF9LAotICB7MHgwN2U4LCAweDAzYTAsIDB4MDFiZCwgMHgwMWI0LCAweDAzOGEsIDB4MDFjNCwgMHgwMzkyLCAweDAzYWEsIDB4MDNiMCwgMHgwM2JjLCAweDAzZDcsIDB4MDdkNCwgMHgwN2RjLCAweDA3ZGIsIDB4MDdkNSwgMHgwN2YwLCAweDAwYzF9LAotICB7MHgwN2ZiLCAweDAzYzgsIDB4MDNhMywgMHgwMzk1LCAweDAzOWQsIDB4MDNhYywgMHgwM2FlLCAweDAzYzUsIDB4MDNkOCwgMHgwM2UyLCAweDAzZTYsIDB4MDdlNCwgMHgwN2U3LCAweDA3ZTAsIDB4MDdlOSwgMHgwN2Y3LCAweDAxOTB9LAotICB7MHgwN2YyLCAweDAzOTMsIDB4MDFiZSwgMHgwMWMwLCAweDAzOTQsIDB4MDM5NywgMHgwM2FkLCAweDAzYzMsIDB4MDNjMSwgMHgwM2QyLCAweDA3ZGEsIDB4MDdkOSwgMHgwN2RmLCAweDA3ZWIsIDB4MDdmNCwgMHgwN2ZhLCAweDAxOTV9LAotICB7MHgwN2Y4LCAweDAzYmQsIDB4MDM5YywgMHgwM2FiLCAweDAzYTgsIDB4MDNiMywgMHgwM2I5LCAweDAzZDAsIDB4MDNlMywgMHgwM2U1LCAweDA3ZTIsIDB4MDdkZSwgMHgwN2VkLCAweDA3ZjEsIDB4MDdmOSwgMHgwN2ZjLCAweDAxOTN9LAotICB7MHgwZmZkLCAweDAzZGMsIDB4MDNiNiwgMHgwM2M3LCAweDAzY2MsIDB4MDNjYiwgMHgwM2Q5LCAweDAzZGEsIDB4MDdkMywgMHgwN2UxLCAweDA3ZWUsIDB4MDdlZiwgMHgwN2Y1LCAweDA3ZjYsIDB4MGZmYywgMHgwZmZmLCAweDAxOWR9LAotICB7MHgwMWMyLCAweDAwYjUsIDB4MDBhMSwgMHgwMDk2LCAweDAwOTcsIDB4MDA5NSwgMHgwMDk5LCAweDAwYTAsIDB4MDBhMiwgMHgwMGFjLCAweDAwYTksIDB4MDBiMSwgMHgwMGIzLCAweDAwYmIsIDB4MDBjMCwgMHgwMThmLCAweDAwMDR9LAotICB7MHgwMDE4LCAweDAwMmUsIDB4MDAwMCwgMHgwMDVhLCAweDAwYTUsIDB4MDBmOCwgMHgwMGI3LCAweDAwOTQsIDB4MDBmOSwgMHgwMDRkLCAweDAwMjEsIDB4MDAyYiwgMHgwMDRmLCAweDAwN2IsIDB4MDBiYywgMHgwMDQ2LCAweDAwMTV9LAotICB7MHgwMDQyLCAweDAwMzcsIDB4MDA3OCwgMHgwMDBkLCAweDAwNjgsIDB4MDA1ZiwgMHgwMDBkLCAweDAwNWUsIDB4MDA1YSwgMHgwMGJlLCAweDAwNjMsIDB4MDA3ZSwgMHgwMDFmLCAweDAwOTIsIDB4MDAxYSwgMHgwMGFiLCAweDAwMzJ9LAotICB7MHgwMGU2LCAweDAwMzcsIDB4MDAwMCwgMHgwMDU4LCAweDAwMGIsIDB4MDA1YSwgMHgwMGUxLCAweDAwNWQsIDB4MDAyOSwgMHgwMDE3LCAweDAwN2UsIDB4MDA2OSwgMHgwMGFhLCAweDAwNTQsIDB4MDAyOSwgMHgwMDMyLCAweDAwNDF9LAotICB7MHgwMDQ2LCAweDAwZWEsIDB4MDAzNCwgMHgwMGVhLCAweDAwMTEsIDB4MDAxYiwgMHgwMGE5LCAweDAwOTQsIDB4MDBlMiwgMHgwMDMxLCAweDAwZDAsIDB4MDBlNSwgMHgwMDA3LCAweDAwNzAsIDB4MDA2OSwgMHgwMDNlLCAweDAwMjF9Ci19OwotCi1jb25zdCBVTE9ORyBGREthYWNFbmNfaHVmZl9jdGFic2NmWzEyMV09Ci17Ci0gIDB4MDAwM2ZmZTgsIDB4MDAwM2ZmZTYsIDB4MDAwM2ZmZTcsIDB4MDAwM2ZmZTUsIDB4MDAwN2ZmZjUsIDB4MDAwN2ZmZjEsIDB4MDAwN2ZmZWQsIDB4MDAwN2ZmZjYsCi0gIDB4MDAwN2ZmZWUsIDB4MDAwN2ZmZWYsIDB4MDAwN2ZmZjAsIDB4MDAwN2ZmZmMsIDB4MDAwN2ZmZmQsIDB4MDAwN2ZmZmYsIDB4MDAwN2ZmZmUsIDB4MDAwN2ZmZjcsCi0gIDB4MDAwN2ZmZjgsIDB4MDAwN2ZmZmIsIDB4MDAwN2ZmZjksIDB4MDAwM2ZmZTQsIDB4MDAwN2ZmZmEsIDB4MDAwM2ZmZTMsIDB4MDAwMWZmZWYsIDB4MDAwMWZmZjAsCi0gIDB4MDAwMGZmZjUsIDB4MDAwMWZmZWUsIDB4MDAwMGZmZjIsIDB4MDAwMGZmZjMsIDB4MDAwMGZmZjQsIDB4MDAwMGZmZjEsIDB4MDAwMDdmZjYsIDB4MDAwMDdmZjcsCi0gIDB4MDAwMDNmZjksIDB4MDAwMDNmZjUsIDB4MDAwMDNmZjcsIDB4MDAwMDNmZjMsIDB4MDAwMDNmZjYsIDB4MDAwMDNmZjIsIDB4MDAwMDFmZjcsIDB4MDAwMDFmZjUsCi0gIDB4MDAwMDBmZjksIDB4MDAwMDBmZjcsIDB4MDAwMDBmZjYsIDB4MDAwMDA3ZjksIDB4MDAwMDBmZjQsIDB4MDAwMDA3ZjgsIDB4MDAwMDAzZjksIDB4MDAwMDAzZjcsCi0gIDB4MDAwMDAzZjUsIDB4MDAwMDAxZjgsIDB4MDAwMDAxZjcsIDB4MDAwMDAwZmEsIDB4MDAwMDAwZjgsIDB4MDAwMDAwZjYsIDB4MDAwMDAwNzksIDB4MDAwMDAwM2EsCi0gIDB4MDAwMDAwMzgsIDB4MDAwMDAwMWEsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGEsIDB4MDAwMDAwMGMsIDB4MDAwMDAwMWIsCi0gIDB4MDAwMDAwMzksIDB4MDAwMDAwM2IsIDB4MDAwMDAwNzgsIDB4MDAwMDAwN2EsIDB4MDAwMDAwZjcsIDB4MDAwMDAwZjksIDB4MDAwMDAxZjYsIDB4MDAwMDAxZjksCi0gIDB4MDAwMDAzZjQsIDB4MDAwMDAzZjYsIDB4MDAwMDAzZjgsIDB4MDAwMDA3ZjUsIDB4MDAwMDA3ZjQsIDB4MDAwMDA3ZjYsIDB4MDAwMDA3ZjcsIDB4MDAwMDBmZjUsCi0gIDB4MDAwMDBmZjgsIDB4MDAwMDFmZjQsIDB4MDAwMDFmZjYsIDB4MDAwMDFmZjgsIDB4MDAwMDNmZjgsIDB4MDAwMDNmZjQsIDB4MDAwMGZmZjAsIDB4MDAwMDdmZjQsCi0gIDB4MDAwMGZmZjYsIDB4MDAwMDdmZjUsIDB4MDAwM2ZmZTIsIDB4MDAwN2ZmZDksIDB4MDAwN2ZmZGEsIDB4MDAwN2ZmZGIsIDB4MDAwN2ZmZGMsIDB4MDAwN2ZmZGQsCi0gIDB4MDAwN2ZmZGUsIDB4MDAwN2ZmZDgsIDB4MDAwN2ZmZDIsIDB4MDAwN2ZmZDMsIDB4MDAwN2ZmZDQsIDB4MDAwN2ZmZDUsIDB4MDAwN2ZmZDYsIDB4MDAwN2ZmZjIsCi0gIDB4MDAwN2ZmZGYsIDB4MDAwN2ZmZTcsIDB4MDAwN2ZmZTgsIDB4MDAwN2ZmZTksIDB4MDAwN2ZmZWEsIDB4MDAwN2ZmZWIsIDB4MDAwN2ZmZTYsIDB4MDAwN2ZmZTAsCi0gIDB4MDAwN2ZmZTEsIDB4MDAwN2ZmZTIsIDB4MDAwN2ZmZTMsIDB4MDAwN2ZmZTQsIDB4MDAwN2ZmZTUsIDB4MDAwN2ZmZDcsIDB4MDAwN2ZmZWMsIDB4MDAwN2ZmZjQsCi0gIDB4MDAwN2ZmZjMKLX07Citjb25zdCBVTE9ORyBGREthYWNFbmNfaHVmZl9jdGFic2NmWzEyMV0gPSB7CisgICAgMHgwMDAzZmZlOCwgMHgwMDAzZmZlNiwgMHgwMDAzZmZlNywgMHgwMDAzZmZlNSwgMHgwMDA3ZmZmNSwgMHgwMDA3ZmZmMSwKKyAgICAweDAwMDdmZmVkLCAweDAwMDdmZmY2LCAweDAwMDdmZmVlLCAweDAwMDdmZmVmLCAweDAwMDdmZmYwLCAweDAwMDdmZmZjLAorICAgIDB4MDAwN2ZmZmQsIDB4MDAwN2ZmZmYsIDB4MDAwN2ZmZmUsIDB4MDAwN2ZmZjcsIDB4MDAwN2ZmZjgsIDB4MDAwN2ZmZmIsCisgICAgMHgwMDA3ZmZmOSwgMHgwMDAzZmZlNCwgMHgwMDA3ZmZmYSwgMHgwMDAzZmZlMywgMHgwMDAxZmZlZiwgMHgwMDAxZmZmMCwKKyAgICAweDAwMDBmZmY1LCAweDAwMDFmZmVlLCAweDAwMDBmZmYyLCAweDAwMDBmZmYzLCAweDAwMDBmZmY0LCAweDAwMDBmZmYxLAorICAgIDB4MDAwMDdmZjYsIDB4MDAwMDdmZjcsIDB4MDAwMDNmZjksIDB4MDAwMDNmZjUsIDB4MDAwMDNmZjcsIDB4MDAwMDNmZjMsCisgICAgMHgwMDAwM2ZmNiwgMHgwMDAwM2ZmMiwgMHgwMDAwMWZmNywgMHgwMDAwMWZmNSwgMHgwMDAwMGZmOSwgMHgwMDAwMGZmNywKKyAgICAweDAwMDAwZmY2LCAweDAwMDAwN2Y5LCAweDAwMDAwZmY0LCAweDAwMDAwN2Y4LCAweDAwMDAwM2Y5LCAweDAwMDAwM2Y3LAorICAgIDB4MDAwMDAzZjUsIDB4MDAwMDAxZjgsIDB4MDAwMDAxZjcsIDB4MDAwMDAwZmEsIDB4MDAwMDAwZjgsIDB4MDAwMDAwZjYsCisgICAgMHgwMDAwMDA3OSwgMHgwMDAwMDAzYSwgMHgwMDAwMDAzOCwgMHgwMDAwMDAxYSwgMHgwMDAwMDAwYiwgMHgwMDAwMDAwNCwKKyAgICAweDAwMDAwMDAwLCAweDAwMDAwMDBhLCAweDAwMDAwMDBjLCAweDAwMDAwMDFiLCAweDAwMDAwMDM5LCAweDAwMDAwMDNiLAorICAgIDB4MDAwMDAwNzgsIDB4MDAwMDAwN2EsIDB4MDAwMDAwZjcsIDB4MDAwMDAwZjksIDB4MDAwMDAxZjYsIDB4MDAwMDAxZjksCisgICAgMHgwMDAwMDNmNCwgMHgwMDAwMDNmNiwgMHgwMDAwMDNmOCwgMHgwMDAwMDdmNSwgMHgwMDAwMDdmNCwgMHgwMDAwMDdmNiwKKyAgICAweDAwMDAwN2Y3LCAweDAwMDAwZmY1LCAweDAwMDAwZmY4LCAweDAwMDAxZmY0LCAweDAwMDAxZmY2LCAweDAwMDAxZmY4LAorICAgIDB4MDAwMDNmZjgsIDB4MDAwMDNmZjQsIDB4MDAwMGZmZjAsIDB4MDAwMDdmZjQsIDB4MDAwMGZmZjYsIDB4MDAwMDdmZjUsCisgICAgMHgwMDAzZmZlMiwgMHgwMDA3ZmZkOSwgMHgwMDA3ZmZkYSwgMHgwMDA3ZmZkYiwgMHgwMDA3ZmZkYywgMHgwMDA3ZmZkZCwKKyAgICAweDAwMDdmZmRlLCAweDAwMDdmZmQ4LCAweDAwMDdmZmQyLCAweDAwMDdmZmQzLCAweDAwMDdmZmQ0LCAweDAwMDdmZmQ1LAorICAgIDB4MDAwN2ZmZDYsIDB4MDAwN2ZmZjIsIDB4MDAwN2ZmZGYsIDB4MDAwN2ZmZTcsIDB4MDAwN2ZmZTgsIDB4MDAwN2ZmZTksCisgICAgMHgwMDA3ZmZlYSwgMHgwMDA3ZmZlYiwgMHgwMDA3ZmZlNiwgMHgwMDA3ZmZlMCwgMHgwMDA3ZmZlMSwgMHgwMDA3ZmZlMiwKKyAgICAweDAwMDdmZmUzLCAweDAwMDdmZmU0LCAweDAwMDdmZmU1LCAweDAwMDdmZmQ3LCAweDAwMDdmZmVjLCAweDAwMDdmZmY0LAorICAgIDB4MDAwN2ZmZjN9OwogCiAvKgogICB0YWJsZSBvZiAoMC41MDAwMC4uLjEuMDAwMDApIF4wLjc1CiAqLwotY29uc3QgRklYUF9RVEQgRkRLYWFjRW5jX21UYWJfM180W01BTlRfU0laRV0gPQotewotICBRVEMoMHg0YzFiZjgyOSksIFFUQygweDRjMzg4MGRlKSwgUVRDKDB4NGM1NTA2MDMpLCBRVEMoMHg0YzcxODc5YyksIFFUQygweDRjOGUwNWFhKSwgUVRDKDB4NGNhYTgwMzApLCBRVEMoMHg0Y2M2ZjcyZiksIFFUQygweDRjZTM2YWFiKSwKLSAgUVRDKDB4NGNmZmRhYTQpLCBRVEMoMHg0ZDFjNDcxZCksIFFUQygweDRkMzhiMDE5KSwgUVRDKDB4NGQ1NTE1OWEpLCBRVEMoMHg0ZDcxNzdhMSksIFFUQygweDRkOGRkNjMxKSwgUVRDKDB4NGRhYTMxNGIpLCBRVEMoMHg0ZGM2ODhmMyksCi0gIFFUQygweDRkZTJkZDJhKSwgUVRDKDB4NGRmZjJkZjIpLCBRVEMoMHg0ZTFiN2I0ZCksIFFUQygweDRlMzdjNTNkKSwgUVRDKDB4NGU1NDBiYzUpLCBRVEMoMHg0ZTcwNGVlNiksIFFUQygweDRlOGM4ZWEzKSwgUVRDKDB4NGVhOGNhZmQpLAotICBRVEMoMHg0ZWM1MDNmNyksIFFUQygweDRlZTEzOTkyKSwgUVRDKDB4NGVmZDZiZDApLCBRVEMoMHg0ZjE5OWFiNCksIFFUQygweDRmMzVjNjQwKSwgUVRDKDB4NGY1MWVlNzUpLCBRVEMoMHg0ZjZlMTM1NiksIFFUQygweDRmOGEzNGU0KSwKLSAgUVRDKDB4NGZhNjUzMjEpLCBRVEMoMHg0ZmMyNmUxMCksIFFUQygweDRmZGU4NWIyKSwgUVRDKDB4NGZmYTlhMGEpLCBRVEMoMHg1MDE2YWIxOCksIFFUQygweDUwMzJiOGUwKSwgUVRDKDB4NTA0ZWMzNjIpLCBRVEMoMHg1MDZhY2FhMSksCi0gIFFUQygweDUwODZjZWEwKSwgUVRDKDB4NTBhMmNmNWUpLCBRVEMoMHg1MGJlY2NlMCksIFFUQygweDUwZGFjNzI1KSwgUVRDKDB4NTBmNmJlMzEpLCBRVEMoMHg1MTEyYjIwNSksIFFUQygweDUxMmVhMmEzKSwgUVRDKDB4NTE0YTkwMGQpLAotICBRVEMoMHg1MTY2N2E0NSksIFFUQygweDUxODI2MTRjKSwgUVRDKDB4NTE5ZTQ1MjQpLCBRVEMoMHg1MWJhMjVjZiksIFFUQygweDUxZDYwMzUwKSwgUVRDKDB4NTFmMWRkYTcpLCBRVEMoMHg1MjBkYjRkNiksIFFUQygweDUyMjk4OGUwKSwKLSAgUVRDKDB4NTI0NTU5YzYpLCBRVEMoMHg1MjYxMjc4OSksIFFUQygweDUyN2NmMjJkKSwgUVRDKDB4NTI5OGI5YjEpLCBRVEMoMHg1MmI0N2UxOSksIFFUQygweDUyZDAzZjY1KSwgUVRDKDB4NTJlYmZkOTgpLCBRVEMoMHg1MzA3YjhiNCksCi0gIFFUQygweDUzMjM3MGI5KSwgUVRDKDB4NTMzZjI1YWEpLCBRVEMoMHg1MzVhZDc4OSksIFFUQygweDUzNzY4NjU2KSwgUVRDKDB4NTM5MjMyMTUpLCBRVEMoMHg1M2FkZGFjNiksIFFUQygweDUzYzk4MDZiKSwgUVRDKDB4NTNlNTIzMDYpLAotICBRVEMoMHg1NDAwYzI5OCksIFFUQygweDU0MWM1ZjI0KSwgUVRDKDB4NTQzN2Y4YWIpLCBRVEMoMHg1NDUzOGYyZSksIFFUQygweDU0NmYyMmFmKSwgUVRDKDB4NTQ4YWIzMzApLCBRVEMoMHg1NGE2NDBiMyksIFFUQygweDU0YzFjYjM4KSwKLSAgUVRDKDB4NTRkZDUyYzIpLCBRVEMoMHg1NGY4ZDc1MyksIFFUQygweDU1MTQ1OGViKSwgUVRDKDB4NTUyZmQ3OGQpLCBRVEMoMHg1NTRiNTMzOSksIFFUQygweDU1NjZjYmYzKSwgUVRDKDB4NTU4MjQxYmIpLCBRVEMoMHg1NTlkYjQ5MiksCi0gIFFUQygweDU1YjkyNDdiKSwgUVRDKDB4NTVkNDkxNzcpLCBRVEMoMHg1NWVmZmI4NyksIFFUQygweDU2MGI2MmFkKSwgUVRDKDB4NTYyNmM2ZWIpLCBRVEMoMHg1NjQyMjg0MiksIFFUQygweDU2NWQ4NmI0KSwgUVRDKDB4NTY3OGUyNDIpLAotICBRVEMoMHg1Njk0M2FlZSksIFFUQygweDU2YWY5MGI5KSwgUVRDKDB4NTZjYWUzYTQpLCBRVEMoMHg1NmU2MzNiMiksIFFUQygweDU3MDE4MGU0KSwgUVRDKDB4NTcxY2NiM2IpLCBRVEMoMHg1NzM4MTJiOCksIFFUQygweDU3NTM1NzVlKSwKLSAgUVRDKDB4NTc2ZTk5MmUpLCBRVEMoMHg1Nzg5ZDgyOSksIFFUQygweDU3YTUxNDUwKSwgUVRDKDB4NTdjMDRkYTYpLCBRVEMoMHg1N2RiODQyYiksIFFUQygweDU3ZjZiN2UxKSwgUVRDKDB4NTgxMWU4YzkpLCBRVEMoMHg1ODJkMTZlNiksCi0gIFFUQygweDU4NDg0MjM4KSwgUVRDKDB4NTg2MzZhYzApLCBRVEMoMHg1ODdlOTA4MSksIFFUQygweDU4OTliMzdjKSwgUVRDKDB4NThiNGQzYjEpLCBRVEMoMHg1OGNmZjEyMyksIFFUQygweDU4ZWIwYmQzKSwgUVRDKDB4NTkwNjIzYzIpLAotICBRVEMoMHg1OTIxMzhmMiksIFFUQygweDU5M2M0YjYzKSwgUVRDKDB4NTk1NzViMTkpLCBRVEMoMHg1OTcyNjgxMiksIFFUQygweDU5OGQ3MjUzKSwgUVRDKDB4NTlhODc5ZGEpLCBRVEMoMHg1OWMzN2VhYiksIFFUQygweDU5ZGU4MGM2KSwKLSAgUVRDKDB4NTlmOTgwMmQpLCBRVEMoMHg1YTE0N2NlMCksIFFUQygweDVhMmY3NmUyKSwgUVRDKDB4NWE0YTZlMzQpLCBRVEMoMHg1YTY1NjJkNiksIFFUQygweDVhODA1NGNiKSwgUVRDKDB4NWE5YjQ0MTQpLCBRVEMoMHg1YWI2MzBiMiksCi0gIFFUQygweDVhZDExYWE2KSwgUVRDKDB4NWFlYzAxZjEpLCBRVEMoMHg1YjA2ZTY5NiksIFFUQygweDViMjFjODk1KSwgUVRDKDB4NWIzY2E3ZWYpLCBRVEMoMHg1YjU3ODRhNiksIFFUQygweDViNzI1ZWJjKSwgUVRDKDB4NWI4ZDM2MzEpLAotICBRVEMoMHg1YmE4MGIwNiksIFFUQygweDViYzJkZDNlKSwgUVRDKDB4NWJkZGFjZDkpLCBRVEMoMHg1YmY4NzlkOCksIFFUQygweDVjMTM0NDNkKSwgUVRDKDB4NWMyZTBjMDkpLCBRVEMoMHg1YzQ4ZDEzZSksIFFUQygweDVjNjM5M2RjKSwKLSAgUVRDKDB4NWM3ZTUzZTUpLCBRVEMoMHg1Yzk5MTE1YSksIFFUQygweDVjYjNjYzNjKSwgUVRDKDB4NWNjZTg0OGQpLCBRVEMoMHg1Y2U5M2E0ZSksIFFUQygweDVkMDNlZDgwKSwgUVRDKDB4NWQxZTllMjQpLCBRVEMoMHg1ZDM5NGMzYiksCi0gIFFUQygweDVkNTNmN2M3KSwgUVRDKDB4NWQ2ZWEwYzkpLCBRVEMoMHg1ZDg5NDc0MiksIFFUQygweDVkYTNlYjMzKSwgUVRDKDB4NWRiZThjOWUpLCBRVEMoMHg1ZGQ5MmI4NCksIFFUQygweDVkZjNjN2U1KSwgUVRDKDB4NWUwZTYxYzMpLAotICBRVEMoMHg1ZTI4ZjkyMCksIFFUQygweDVlNDM4ZGZjKSwgUVRDKDB4NWU1ZTIwNTkpLCBRVEMoMHg1ZTc4YjAzNyksIFFUQygweDVlOTMzZDk5KSwgUVRDKDB4NWVhZGM4N2UpLCBRVEMoMHg1ZWM4NTBlOSksIFFUQygweDVlZTJkNmRhKSwKLSAgUVRDKDB4NWVmZDVhNTMpLCBRVEMoMHg1ZjE3ZGI1NCksIFFUQygweDVmMzI1OWUwKSwgUVRDKDB4NWY0Y2Q1ZjYpLCBRVEMoMHg1ZjY3NGY5OSksIFFUQygweDVmODFjNmM4KSwgUVRDKDB4NWY5YzNiODcpLCBRVEMoMHg1ZmI2YWRkNCksCi0gIFFUQygweDVmZDExZGIzKSwgUVRDKDB4NWZlYjhiMjMpLCBRVEMoMHg2MDA1ZjYyNiksIFFUQygweDYwMjA1ZWJkKSwgUVRDKDB4NjAzYWM0ZTkpLCBRVEMoMHg2MDU1MjhhYyksIFFUQygweDYwNmY4YTA1KSwgUVRDKDB4NjA4OWU4ZjcpLAotICBRVEMoMHg2MGE0NDU4MyksIFFUQygweDYwYmU5ZmE5KSwgUVRDKDB4NjBkOGY3NmIpLCBRVEMoMHg2MGYzNGNjYSksIFFUQygweDYxMGQ5ZmM3KSwgUVRDKDB4NjEyN2YwNjIpLCBRVEMoMHg2MTQyM2U5ZSksIFFUQygweDYxNWM4YTdhKSwKLSAgUVRDKDB4NjE3NmQzZjkpLCBRVEMoMHg2MTkxMWIxYiksIFFUQygweDYxYWI1ZmUxKSwgUVRDKDB4NjFjNWEyNGQpLCBRVEMoMHg2MWRmZTI1ZiksIFFUQygweDYxZmEyMDE4KSwgUVRDKDB4NjIxNDViN2EpLCBRVEMoMHg2MjJlOTQ4NSksCi0gIFFUQygweDYyNDhjYjNiKSwgUVRDKDB4NjI2MmZmOWQpLCBRVEMoMHg2MjdkMzFhYiksIFFUQygweDYyOTc2MTY3KSwgUVRDKDB4NjJiMThlZDEpLCBRVEMoMHg2MmNiYjllYiksIFFUQygweDYyZTVlMmI2KSwgUVRDKDB4NjMwMDA5MzMpLAotICBRVEMoMHg2MzFhMmQ2MiksIFFUQygweDYzMzQ0ZjQ1KSwgUVRDKDB4NjM0ZTZlZGQpLCBRVEMoMHg2MzY4OGMyYiksIFFUQygweDYzODJhNzMwKSwgUVRDKDB4NjM5Y2JmZWMpLCBRVEMoMHg2M2I2ZDY2MSksIFFUQygweDYzZDBlYTkwKSwKLSAgUVRDKDB4NjNlYWZjN2EpLCBRVEMoMHg2NDA1MGMxZiksIFFUQygweDY0MWYxOTgyKSwgUVRDKDB4NjQzOTI0YTIpLCBRVEMoMHg2NDUzMmQ4MCksIFFUQygweDY0NmQzNDFmKSwgUVRDKDB4NjQ4NzM4N2UpLCBRVEMoMHg2NGExM2E5ZSksCi0gIFFUQygweDY0YmIzYTgxKSwgUVRDKDB4NjRkNTM4MjgpLCBRVEMoMHg2NGVmMzM5MyksIFFUQygweDY1MDkyY2M0KSwgUVRDKDB4NjUyMzIzYmIpLCBRVEMoMHg2NTNkMTg3OSksIFFUQygweDY1NTcwYjAwKSwgUVRDKDB4NjU3MGZiNTApLAotICBRVEMoMHg2NThhZTk2YiksIFFUQygweDY1YTRkNTUwKSwgUVRDKDB4NjViZWJmMDEpLCBRVEMoMHg2NWQ4YTY4MCksIFFUQygweDY1ZjI4YmNjKSwgUVRDKDB4NjYwYzZlZTgpLCBRVEMoMHg2NjI2NGZkMyksIFFUQygweDY2NDAyZThmKSwKLSAgUVRDKDB4NjY1YTBiMWMpLCBRVEMoMHg2NjczZTU3ZCksIFFUQygweDY2OGRiZGIwKSwgUVRDKDB4NjZhNzkzYjgpLCBRVEMoMHg2NmMxNjc5NSksIFFUQygweDY2ZGIzOTQ5KSwgUVRDKDB4NjZmNTA4ZDQpLCBRVEMoMHg2NzBlZDYzNiksCi0gIFFUQygweDY3MjhhMTcyKSwgUVRDKDB4Njc0MjZhODcpLCBRVEMoMHg2NzVjMzE3NyksIFFUQygweDY3NzVmNjQzKSwgUVRDKDB4Njc4ZmI4ZWIpLCBRVEMoMHg2N2E5Nzk3MSksIFFUQygweDY3YzMzN2Q1KSwgUVRDKDB4NjdkY2Y0MTgpLAotICBRVEMoMHg2N2Y2YWUzYiksIFFUQygweDY4MTA2NjNmKSwgUVRDKDB4NjgyYTFjMjUpLCBRVEMoMHg2ODQzY2ZlZCksIFFUQygweDY4NWQ4MTk5KSwgUVRDKDB4Njg3NzMxMjkpLCBRVEMoMHg2ODkwZGU5ZiksIFFUQygweDY4YWE4OWZhKSwKLSAgUVRDKDB4NjhjNDMzM2QpLCBRVEMoMHg2OGRkZGE2NyksIFFUQygweDY4Zjc3ZjdhKSwgUVRDKDB4NjkxMTIyNzcpLCBRVEMoMHg2OTJhYzM1ZSksIFFUQygweDY5NDQ2MjMwKSwgUVRDKDB4Njk1ZGZlZWUpLCBRVEMoMHg2OTc3OTk5YSksCi0gIFFUQygweDY5OTEzMjMyKSwgUVRDKDB4NjlhYWM4YmEpLCBRVEMoMHg2OWM0NWQzMSksIFFUQygweDY5ZGRlZjk4KSwgUVRDKDB4NjlmNzdmZjApLCBRVEMoMHg2YTExMGUzYSksIFFUQygweDZhMmE5YTc3KSwgUVRDKDB4NmE0NDI0YTgpLAotICBRVEMoMHg2YTVkYWNjYyksIFFUQygweDZhNzczMmU2KSwgUVRDKDB4NmE5MGI2ZjYpLCBRVEMoMHg2YWFhMzhmZCksIFFUQygweDZhYzNiOGZiKSwgUVRDKDB4NmFkZDM2ZjIpLCBRVEMoMHg2YWY2YjJlMiksIFFUQygweDZiMTAyY2NkKSwKLSAgUVRDKDB4NmIyOWE0YjIpLCBRVEMoMHg2YjQzMWE5MiksIFFUQygweDZiNWM4ZTZmKSwgUVRDKDB4NmI3NjAwNGEpLCBRVEMoMHg2YjhmNzAyMiksIFFUQygweDZiYThkZGY5KSwgUVRDKDB4NmJjMjQ5ZDApLCBRVEMoMHg2YmRiYjNhNyksCi0gIFFUQygweDZiZjUxYjgwKSwgUVRDKDB4NmMwZTgxNWEpLCBRVEMoMHg2YzI3ZTUzNyksIFFUQygweDZjNDE0NzE4KSwgUVRDKDB4NmM1YWE2ZmQpLCBRVEMoMHg2Yzc0MDRlNyksIFFUQygweDZjOGQ2MGQ3KSwgUVRDKDB4NmNhNmJhY2UpLAotICBRVEMoMHg2Y2MwMTJjYyksIFFUQygweDZjZDk2OGQyKSwgUVRDKDB4NmNmMmJjZTEpLCBRVEMoMHg2ZDBjMGVmOSksIFFUQygweDZkMjU1ZjFkKSwgUVRDKDB4NmQzZWFkNGIpLCBRVEMoMHg2ZDU3Zjk4NSksIFFUQygweDZkNzE0M2NjKSwKLSAgUVRDKDB4NmQ4YThjMjEpLCBRVEMoMHg2ZGEzZDI4MyksIFFUQygweDZkYmQxNmY1KSwgUVRDKDB4NmRkNjU5NzYpLCBRVEMoMHg2ZGVmOWEwOCksIFFUQygweDZlMDhkOGFiKSwgUVRDKDB4NmUyMjE1NjApLCBRVEMoMHg2ZTNiNTAyNyksCi0gIFFUQygweDZlNTQ4OTAyKSwgUVRDKDB4NmU2ZGJmZjEpLCBRVEMoMHg2ZTg2ZjRmNSksIFFUQygweDZlYTAyODBlKSwgUVRDKDB4NmViOTU5M2UpLCBRVEMoMHg2ZWQyODg4NSksIFFUQygweDZlZWJiNWUzKSwgUVRDKDB4NmYwNGUxNWEpLAotICBRVEMoMHg2ZjFlMGFlYSksIFFUQygweDZmMzczMjk0KSwgUVRDKDB4NmY1MDU4NTkpLCBRVEMoMHg2ZjY5N2MzOSksIFFUQygweDZmODI5ZTM1KSwgUVRDKDB4NmY5YmJlNGUpLCBRVEMoMHg2ZmI0ZGM4NSksIFFUQygweDZmY2RmOGQ5KSwKLSAgUVRDKDB4NmZlNzEzNGQpLCBRVEMoMHg3MDAwMmJlMCksIFFUQygweDcwMTk0MjkzKSwgUVRDKDB4NzAzMjU3NjcpLCBRVEMoMHg3MDRiNmE1ZCksIFFUQygweDcwNjQ3Yjc2KSwgUVRDKDB4NzA3ZDhhYjEpLCBRVEMoMHg3MDk2OTgxMSksCi0gIFFUQygweDcwYWZhMzk0KSwgUVRDKDB4NzBjOGFkM2QpLCBRVEMoMHg3MGUxYjUwYyksIFFUQygweDcwZmFiYjAxKSwgUVRDKDB4NzExM2JmMWQpLCBRVEMoMHg3MTJjYzE2MSksIFFUQygweDcxNDVjMWNlKSwgUVRDKDB4NzE1ZWMwNjQpLAotICBRVEMoMHg3MTc3YmQyNCksIFFUQygweDcxOTBiODBmKSwgUVRDKDB4NzFhOWIxMjQpLCBRVEMoMHg3MWMyYTg2NiksIFFUQygweDcxZGI5ZGQ0KSwgUVRDKDB4NzFmNDkxNzApLCBRVEMoMHg3MjBkODMzOSksIFFUQygweDcyMjY3MzMxKSwKLSAgUVRDKDB4NzIzZjYxNTkpLCBRVEMoMHg3MjU4NGRiMCksIFFUQygweDcyNzEzODM4KSwgUVRDKDB4NzI4YTIwZjEpLCBRVEMoMHg3MmEzMDdkYiksIFFUQygweDcyYmJlY2Y5KSwgUVRDKDB4NzJkNGQwNDkpLCBRVEMoMHg3MmVkYjFjZSksCi0gIFFUQygweDczMDY5MTg3KSwgUVRDKDB4NzMxZjZmNzUpLCBRVEMoMHg3MzM4NGI5OCksIFFUQygweDczNTEyNWYzKSwgUVRDKDB4NzM2OWZlODQpLCBRVEMoMHg3MzgyZDU0ZCksIFFUQygweDczOWJhYTRlKSwgUVRDKDB4NzNiNDdkODkpLAotICBRVEMoMHg3M2NkNGVmZCksIFFUQygweDczZTYxZWFiKSwgUVRDKDB4NzNmZWVjOTQpLCBRVEMoMHg3NDE3YjhiOCksIFFUQygweDc0MzA4MzE5KSwgUVRDKDB4NzQ0OTRiYjYpLCBRVEMoMHg3NDYyMTI5MSksIFFUQygweDc0N2FkN2FhKSwKLSAgUVRDKDB4NzQ5MzliMDIpLCBRVEMoMHg3NGFjNWM5OCksIFFUQygweDc0YzUxYzZmKSwgUVRDKDB4NzRkZGRhODYpLCBRVEMoMHg3NGY2OTZkZSksIFFUQygweDc1MGY1MTc4KSwgUVRDKDB4NzUyODBhNTQpLCBRVEMoMHg3NTQwYzE3NCksCi0gIFFUQygweDc1NTk3NmQ3KSwgUVRDKDB4NzU3MjJhN2UpLCBRVEMoMHg3NThhZGM2OSksIFFUQygweDc1YTM4YzliKSwgUVRDKDB4NzViYzNiMTIpLCBRVEMoMHg3NWQ0ZTdjZiksIFFUQygweDc1ZWQ5MmQ0KSwgUVRDKDB4NzYwNjNjMjEpLAotICBRVEMoMHg3NjFlZTNiNiksIFFUQygweDc2Mzc4OTk0KSwgUVRDKDB4NzY1MDJkYmMpLCBRVEMoMHg3NjY4ZDAyZSksIFFUQygweDc2ODE3MGViKSwgUVRDKDB4NzY5YTBmZjMpLCBRVEMoMHg3NmIyYWQ0NyksIFFUQygweDc2Y2I0OGU3KSwKLSAgUVRDKDB4NzZlM2UyZDUpLCBRVEMoMHg3NmZjN2IxMCksIFFUQygweDc3MTUxMTlhKSwgUVRDKDB4NzcyZGE2NzMpLCBRVEMoMHg3NzQ2Mzk5YiksIFFUQygweDc3NWVjYjEzKSwgUVRDKDB4Nzc3NzVhZGMpLCBRVEMoMHg3NzhmZThmNiksCi0gIFFUQygweDc3YTg3NTYxKSwgUVRDKDB4NzdjMTAwMWYpLCBRVEMoMHg3N2Q5ODkzMCksIFFUQygweDc3ZjIxMDk1KSwgUVRDKDB4NzgwYTk2NGQpLCBRVEMoMHg3ODIzMWE1YiksIFFUQygweDc4M2I5Y2JkKSwgUVRDKDB4Nzg1NDFkNzUpLAotICBRVEMoMHg3ODZjOWM4NCksIFFUQygweDc4ODUxOWU5KSwgUVRDKDB4Nzg5ZDk1YTYpLCBRVEMoMHg3OGI2MGZiYiksIFFUQygweDc4Y2U4ODI4KSwgUVRDKDB4NzhlNmZlZWYpLCBRVEMoMHg3OGZmNzQwZiksIFFUQygweDc5MTdlNzhhKSwKLSAgUVRDKDB4NzkzMDU5NWYpLCBRVEMoMHg3OTQ4Yzk5MCksIFFUQygweDc5NjEzODFkKSwgUVRDKDB4Nzk3OWE1MDYpLCBRVEMoMHg3OTkyMTA0YyksIFFUQygweDc5YWE3OWYwKSwgUVRDKDB4NzljMmUxZjEpLCBRVEMoMHg3OWRiNDg1MiksCi0gIFFUQygweDc5ZjNhZDExKSwgUVRDKDB4N2EwYzEwMzEpLCBRVEMoMHg3YTI0NzFiMCksIFFUQygweDdhM2NkMTkxKSwgUVRDKDB4N2E1NTJmZDMpLCBRVEMoMHg3YTZkOGM3NiksIFFUQygweDdhODVlNzdkKSwgUVRDKDB4N2E5ZTQwZTYpLAotICBRVEMoMHg3YWI2OThiMiksIFFUQygweDdhY2VlZWUzKSwgUVRDKDB4N2FlNzQzNzgpLCBRVEMoMHg3YWZmOTY3MyksIFFUQygweDdiMTdlN2QyKSwgUVRDKDB4N2IzMDM3OTkpLCBRVEMoMHg3YjQ4ODVjNSksIFFUQygweDdiNjBkMjU5KSwKLSAgUVRDKDB4N2I3OTFkNTUpLCBRVEMoMHg3YjkxNjZiOSksIFFUQygweDdiYTlhZTg2KSwgUVRDKDB4N2JjMWY0YmMpLCBRVEMoMHg3YmRhMzk1YyksIFFUQygweDdiZjI3YzY2KSwgUVRDKDB4N2MwYWJkZGIpLCBRVEMoMHg3YzIyZmRiYiksCi0gIFFUQygweDdjM2IzYzA3KSwgUVRDKDB4N2M1Mzc4YzApLCBRVEMoMHg3YzZiYjNlNSksIFFUQygweDdjODNlZDc4KSwgUVRDKDB4N2M5YzI1NzkpLCBRVEMoMHg3Y2I0NWJlOSksIFFUQygweDdjY2M5MGM3KSwgUVRDKDB4N2NlNGM0MTQpLAotICBRVEMoMHg3Y2ZjZjVkMiksIFFUQygweDdkMTUyNjAwKSwgUVRDKDB4N2QyZDU0OWYpLCBRVEMoMHg3ZDQ1ODFiMCksIFFUQygweDdkNWRhZDMyKSwgUVRDKDB4N2Q3NWQ3MjcpLCBRVEMoMHg3ZDhkZmY4ZiksIFFUQygweDdkYTYyNjZhKSwKLSAgUVRDKDB4N2RiZTRiYmEpLCBRVEMoMHg3ZGQ2NmY3ZCksIFFUQygweDdkZWU5MWI2KSwgUVRDKDB4N2UwNmIyNjQpLCBRVEMoMHg3ZTFlZDE4OCksIFFUQygweDdlMzZlZjIyKSwgUVRDKDB4N2U0ZjBiMzQpLCBRVEMoMHg3ZTY3MjViZCksCi0gIFFUQygweDdlN2YzZWJkKSwgUVRDKDB4N2U5NzU2MzYpLCBRVEMoMHg3ZWFmNmMyOCksIFFUQygweDdlYzc4MDkzKSwgUVRDKDB4N2VkZjkzNzgpLCBRVEMoMHg3ZWY3YTRkNyksIFFUQygweDdmMGZiNGIxKSwgUVRDKDB4N2YyN2MzMDcpLAotICBRVEMoMHg3ZjNmY2ZkOCksIFFUQygweDdmNTdkYjI1KSwgUVRDKDB4N2Y2ZmU0ZWYpLCBRVEMoMHg3Zjg3ZWQzNiksIFFUQygweDdmOWZmM2ZiKSwgUVRDKDB4N2ZiN2Y5M2UpLCBRVEMoMHg3ZmNmZmNmZiksIFFUQygweDdmZTdmZjQwKQotfTsKK2NvbnN0IEZJWFBfUVREIEZES2FhY0VuY19tVGFiXzNfNFtNQU5UX1NJWkVdID0geworICAgIFFUQygweDRjMWJmODI5KSwgUVRDKDB4NGMzODgwZGUpLCBRVEMoMHg0YzU1MDYwMyksIFFUQygweDRjNzE4NzljKSwKKyAgICBRVEMoMHg0YzhlMDVhYSksIFFUQygweDRjYWE4MDMwKSwgUVRDKDB4NGNjNmY3MmYpLCBRVEMoMHg0Y2UzNmFhYiksCisgICAgUVRDKDB4NGNmZmRhYTQpLCBRVEMoMHg0ZDFjNDcxZCksIFFUQygweDRkMzhiMDE5KSwgUVRDKDB4NGQ1NTE1OWEpLAorICAgIFFUQygweDRkNzE3N2ExKSwgUVRDKDB4NGQ4ZGQ2MzEpLCBRVEMoMHg0ZGFhMzE0YiksIFFUQygweDRkYzY4OGYzKSwKKyAgICBRVEMoMHg0ZGUyZGQyYSksIFFUQygweDRkZmYyZGYyKSwgUVRDKDB4NGUxYjdiNGQpLCBRVEMoMHg0ZTM3YzUzZCksCisgICAgUVRDKDB4NGU1NDBiYzUpLCBRVEMoMHg0ZTcwNGVlNiksIFFUQygweDRlOGM4ZWEzKSwgUVRDKDB4NGVhOGNhZmQpLAorICAgIFFUQygweDRlYzUwM2Y3KSwgUVRDKDB4NGVlMTM5OTIpLCBRVEMoMHg0ZWZkNmJkMCksIFFUQygweDRmMTk5YWI0KSwKKyAgICBRVEMoMHg0ZjM1YzY0MCksIFFUQygweDRmNTFlZTc1KSwgUVRDKDB4NGY2ZTEzNTYpLCBRVEMoMHg0ZjhhMzRlNCksCisgICAgUVRDKDB4NGZhNjUzMjEpLCBRVEMoMHg0ZmMyNmUxMCksIFFUQygweDRmZGU4NWIyKSwgUVRDKDB4NGZmYTlhMGEpLAorICAgIFFUQygweDUwMTZhYjE4KSwgUVRDKDB4NTAzMmI4ZTApLCBRVEMoMHg1MDRlYzM2MiksIFFUQygweDUwNmFjYWExKSwKKyAgICBRVEMoMHg1MDg2Y2VhMCksIFFUQygweDUwYTJjZjVlKSwgUVRDKDB4NTBiZWNjZTApLCBRVEMoMHg1MGRhYzcyNSksCisgICAgUVRDKDB4NTBmNmJlMzEpLCBRVEMoMHg1MTEyYjIwNSksIFFUQygweDUxMmVhMmEzKSwgUVRDKDB4NTE0YTkwMGQpLAorICAgIFFUQygweDUxNjY3YTQ1KSwgUVRDKDB4NTE4MjYxNGMpLCBRVEMoMHg1MTllNDUyNCksIFFUQygweDUxYmEyNWNmKSwKKyAgICBRVEMoMHg1MWQ2MDM1MCksIFFUQygweDUxZjFkZGE3KSwgUVRDKDB4NTIwZGI0ZDYpLCBRVEMoMHg1MjI5ODhlMCksCisgICAgUVRDKDB4NTI0NTU5YzYpLCBRVEMoMHg1MjYxMjc4OSksIFFUQygweDUyN2NmMjJkKSwgUVRDKDB4NTI5OGI5YjEpLAorICAgIFFUQygweDUyYjQ3ZTE5KSwgUVRDKDB4NTJkMDNmNjUpLCBRVEMoMHg1MmViZmQ5OCksIFFUQygweDUzMDdiOGI0KSwKKyAgICBRVEMoMHg1MzIzNzBiOSksIFFUQygweDUzM2YyNWFhKSwgUVRDKDB4NTM1YWQ3ODkpLCBRVEMoMHg1Mzc2ODY1NiksCisgICAgUVRDKDB4NTM5MjMyMTUpLCBRVEMoMHg1M2FkZGFjNiksIFFUQygweDUzYzk4MDZiKSwgUVRDKDB4NTNlNTIzMDYpLAorICAgIFFUQygweDU0MDBjMjk4KSwgUVRDKDB4NTQxYzVmMjQpLCBRVEMoMHg1NDM3ZjhhYiksIFFUQygweDU0NTM4ZjJlKSwKKyAgICBRVEMoMHg1NDZmMjJhZiksIFFUQygweDU0OGFiMzMwKSwgUVRDKDB4NTRhNjQwYjMpLCBRVEMoMHg1NGMxY2IzOCksCisgICAgUVRDKDB4NTRkZDUyYzIpLCBRVEMoMHg1NGY4ZDc1MyksIFFUQygweDU1MTQ1OGViKSwgUVRDKDB4NTUyZmQ3OGQpLAorICAgIFFUQygweDU1NGI1MzM5KSwgUVRDKDB4NTU2NmNiZjMpLCBRVEMoMHg1NTgyNDFiYiksIFFUQygweDU1OWRiNDkyKSwKKyAgICBRVEMoMHg1NWI5MjQ3YiksIFFUQygweDU1ZDQ5MTc3KSwgUVRDKDB4NTVlZmZiODcpLCBRVEMoMHg1NjBiNjJhZCksCisgICAgUVRDKDB4NTYyNmM2ZWIpLCBRVEMoMHg1NjQyMjg0MiksIFFUQygweDU2NWQ4NmI0KSwgUVRDKDB4NTY3OGUyNDIpLAorICAgIFFUQygweDU2OTQzYWVlKSwgUVRDKDB4NTZhZjkwYjkpLCBRVEMoMHg1NmNhZTNhNCksIFFUQygweDU2ZTYzM2IyKSwKKyAgICBRVEMoMHg1NzAxODBlNCksIFFUQygweDU3MWNjYjNiKSwgUVRDKDB4NTczODEyYjgpLCBRVEMoMHg1NzUzNTc1ZSksCisgICAgUVRDKDB4NTc2ZTk5MmUpLCBRVEMoMHg1Nzg5ZDgyOSksIFFUQygweDU3YTUxNDUwKSwgUVRDKDB4NTdjMDRkYTYpLAorICAgIFFUQygweDU3ZGI4NDJiKSwgUVRDKDB4NTdmNmI3ZTEpLCBRVEMoMHg1ODExZThjOSksIFFUQygweDU4MmQxNmU2KSwKKyAgICBRVEMoMHg1ODQ4NDIzOCksIFFUQygweDU4NjM2YWMwKSwgUVRDKDB4NTg3ZTkwODEpLCBRVEMoMHg1ODk5YjM3YyksCisgICAgUVRDKDB4NThiNGQzYjEpLCBRVEMoMHg1OGNmZjEyMyksIFFUQygweDU4ZWIwYmQzKSwgUVRDKDB4NTkwNjIzYzIpLAorICAgIFFUQygweDU5MjEzOGYyKSwgUVRDKDB4NTkzYzRiNjMpLCBRVEMoMHg1OTU3NWIxOSksIFFUQygweDU5NzI2ODEyKSwKKyAgICBRVEMoMHg1OThkNzI1MyksIFFUQygweDU5YTg3OWRhKSwgUVRDKDB4NTljMzdlYWIpLCBRVEMoMHg1OWRlODBjNiksCisgICAgUVRDKDB4NTlmOTgwMmQpLCBRVEMoMHg1YTE0N2NlMCksIFFUQygweDVhMmY3NmUyKSwgUVRDKDB4NWE0YTZlMzQpLAorICAgIFFUQygweDVhNjU2MmQ2KSwgUVRDKDB4NWE4MDU0Y2IpLCBRVEMoMHg1YTliNDQxNCksIFFUQygweDVhYjYzMGIyKSwKKyAgICBRVEMoMHg1YWQxMWFhNiksIFFUQygweDVhZWMwMWYxKSwgUVRDKDB4NWIwNmU2OTYpLCBRVEMoMHg1YjIxYzg5NSksCisgICAgUVRDKDB4NWIzY2E3ZWYpLCBRVEMoMHg1YjU3ODRhNiksIFFUQygweDViNzI1ZWJjKSwgUVRDKDB4NWI4ZDM2MzEpLAorICAgIFFUQygweDViYTgwYjA2KSwgUVRDKDB4NWJjMmRkM2UpLCBRVEMoMHg1YmRkYWNkOSksIFFUQygweDViZjg3OWQ4KSwKKyAgICBRVEMoMHg1YzEzNDQzZCksIFFUQygweDVjMmUwYzA5KSwgUVRDKDB4NWM0OGQxM2UpLCBRVEMoMHg1YzYzOTNkYyksCisgICAgUVRDKDB4NWM3ZTUzZTUpLCBRVEMoMHg1Yzk5MTE1YSksIFFUQygweDVjYjNjYzNjKSwgUVRDKDB4NWNjZTg0OGQpLAorICAgIFFUQygweDVjZTkzYTRlKSwgUVRDKDB4NWQwM2VkODApLCBRVEMoMHg1ZDFlOWUyNCksIFFUQygweDVkMzk0YzNiKSwKKyAgICBRVEMoMHg1ZDUzZjdjNyksIFFUQygweDVkNmVhMGM5KSwgUVRDKDB4NWQ4OTQ3NDIpLCBRVEMoMHg1ZGEzZWIzMyksCisgICAgUVRDKDB4NWRiZThjOWUpLCBRVEMoMHg1ZGQ5MmI4NCksIFFUQygweDVkZjNjN2U1KSwgUVRDKDB4NWUwZTYxYzMpLAorICAgIFFUQygweDVlMjhmOTIwKSwgUVRDKDB4NWU0MzhkZmMpLCBRVEMoMHg1ZTVlMjA1OSksIFFUQygweDVlNzhiMDM3KSwKKyAgICBRVEMoMHg1ZTkzM2Q5OSksIFFUQygweDVlYWRjODdlKSwgUVRDKDB4NWVjODUwZTkpLCBRVEMoMHg1ZWUyZDZkYSksCisgICAgUVRDKDB4NWVmZDVhNTMpLCBRVEMoMHg1ZjE3ZGI1NCksIFFUQygweDVmMzI1OWUwKSwgUVRDKDB4NWY0Y2Q1ZjYpLAorICAgIFFUQygweDVmNjc0Zjk5KSwgUVRDKDB4NWY4MWM2YzgpLCBRVEMoMHg1ZjljM2I4NyksIFFUQygweDVmYjZhZGQ0KSwKKyAgICBRVEMoMHg1ZmQxMWRiMyksIFFUQygweDVmZWI4YjIzKSwgUVRDKDB4NjAwNWY2MjYpLCBRVEMoMHg2MDIwNWViZCksCisgICAgUVRDKDB4NjAzYWM0ZTkpLCBRVEMoMHg2MDU1MjhhYyksIFFUQygweDYwNmY4YTA1KSwgUVRDKDB4NjA4OWU4ZjcpLAorICAgIFFUQygweDYwYTQ0NTgzKSwgUVRDKDB4NjBiZTlmYTkpLCBRVEMoMHg2MGQ4Zjc2YiksIFFUQygweDYwZjM0Y2NhKSwKKyAgICBRVEMoMHg2MTBkOWZjNyksIFFUQygweDYxMjdmMDYyKSwgUVRDKDB4NjE0MjNlOWUpLCBRVEMoMHg2MTVjOGE3YSksCisgICAgUVRDKDB4NjE3NmQzZjkpLCBRVEMoMHg2MTkxMWIxYiksIFFUQygweDYxYWI1ZmUxKSwgUVRDKDB4NjFjNWEyNGQpLAorICAgIFFUQygweDYxZGZlMjVmKSwgUVRDKDB4NjFmYTIwMTgpLCBRVEMoMHg2MjE0NWI3YSksIFFUQygweDYyMmU5NDg1KSwKKyAgICBRVEMoMHg2MjQ4Y2IzYiksIFFUQygweDYyNjJmZjlkKSwgUVRDKDB4NjI3ZDMxYWIpLCBRVEMoMHg2Mjk3NjE2NyksCisgICAgUVRDKDB4NjJiMThlZDEpLCBRVEMoMHg2MmNiYjllYiksIFFUQygweDYyZTVlMmI2KSwgUVRDKDB4NjMwMDA5MzMpLAorICAgIFFUQygweDYzMWEyZDYyKSwgUVRDKDB4NjMzNDRmNDUpLCBRVEMoMHg2MzRlNmVkZCksIFFUQygweDYzNjg4YzJiKSwKKyAgICBRVEMoMHg2MzgyYTczMCksIFFUQygweDYzOWNiZmVjKSwgUVRDKDB4NjNiNmQ2NjEpLCBRVEMoMHg2M2QwZWE5MCksCisgICAgUVRDKDB4NjNlYWZjN2EpLCBRVEMoMHg2NDA1MGMxZiksIFFUQygweDY0MWYxOTgyKSwgUVRDKDB4NjQzOTI0YTIpLAorICAgIFFUQygweDY0NTMyZDgwKSwgUVRDKDB4NjQ2ZDM0MWYpLCBRVEMoMHg2NDg3Mzg3ZSksIFFUQygweDY0YTEzYTllKSwKKyAgICBRVEMoMHg2NGJiM2E4MSksIFFUQygweDY0ZDUzODI4KSwgUVRDKDB4NjRlZjMzOTMpLCBRVEMoMHg2NTA5MmNjNCksCisgICAgUVRDKDB4NjUyMzIzYmIpLCBRVEMoMHg2NTNkMTg3OSksIFFUQygweDY1NTcwYjAwKSwgUVRDKDB4NjU3MGZiNTApLAorICAgIFFUQygweDY1OGFlOTZiKSwgUVRDKDB4NjVhNGQ1NTApLCBRVEMoMHg2NWJlYmYwMSksIFFUQygweDY1ZDhhNjgwKSwKKyAgICBRVEMoMHg2NWYyOGJjYyksIFFUQygweDY2MGM2ZWU4KSwgUVRDKDB4NjYyNjRmZDMpLCBRVEMoMHg2NjQwMmU4ZiksCisgICAgUVRDKDB4NjY1YTBiMWMpLCBRVEMoMHg2NjczZTU3ZCksIFFUQygweDY2OGRiZGIwKSwgUVRDKDB4NjZhNzkzYjgpLAorICAgIFFUQygweDY2YzE2Nzk1KSwgUVRDKDB4NjZkYjM5NDkpLCBRVEMoMHg2NmY1MDhkNCksIFFUQygweDY3MGVkNjM2KSwKKyAgICBRVEMoMHg2NzI4YTE3MiksIFFUQygweDY3NDI2YTg3KSwgUVRDKDB4Njc1YzMxNzcpLCBRVEMoMHg2Nzc1ZjY0MyksCisgICAgUVRDKDB4Njc4ZmI4ZWIpLCBRVEMoMHg2N2E5Nzk3MSksIFFUQygweDY3YzMzN2Q1KSwgUVRDKDB4NjdkY2Y0MTgpLAorICAgIFFUQygweDY3ZjZhZTNiKSwgUVRDKDB4NjgxMDY2M2YpLCBRVEMoMHg2ODJhMWMyNSksIFFUQygweDY4NDNjZmVkKSwKKyAgICBRVEMoMHg2ODVkODE5OSksIFFUQygweDY4NzczMTI5KSwgUVRDKDB4Njg5MGRlOWYpLCBRVEMoMHg2OGFhODlmYSksCisgICAgUVRDKDB4NjhjNDMzM2QpLCBRVEMoMHg2OGRkZGE2NyksIFFUQygweDY4Zjc3ZjdhKSwgUVRDKDB4NjkxMTIyNzcpLAorICAgIFFUQygweDY5MmFjMzVlKSwgUVRDKDB4Njk0NDYyMzApLCBRVEMoMHg2OTVkZmVlZSksIFFUQygweDY5Nzc5OTlhKSwKKyAgICBRVEMoMHg2OTkxMzIzMiksIFFUQygweDY5YWFjOGJhKSwgUVRDKDB4NjljNDVkMzEpLCBRVEMoMHg2OWRkZWY5OCksCisgICAgUVRDKDB4NjlmNzdmZjApLCBRVEMoMHg2YTExMGUzYSksIFFUQygweDZhMmE5YTc3KSwgUVRDKDB4NmE0NDI0YTgpLAorICAgIFFUQygweDZhNWRhY2NjKSwgUVRDKDB4NmE3NzMyZTYpLCBRVEMoMHg2YTkwYjZmNiksIFFUQygweDZhYWEzOGZkKSwKKyAgICBRVEMoMHg2YWMzYjhmYiksIFFUQygweDZhZGQzNmYyKSwgUVRDKDB4NmFmNmIyZTIpLCBRVEMoMHg2YjEwMmNjZCksCisgICAgUVRDKDB4NmIyOWE0YjIpLCBRVEMoMHg2YjQzMWE5MiksIFFUQygweDZiNWM4ZTZmKSwgUVRDKDB4NmI3NjAwNGEpLAorICAgIFFUQygweDZiOGY3MDIyKSwgUVRDKDB4NmJhOGRkZjkpLCBRVEMoMHg2YmMyNDlkMCksIFFUQygweDZiZGJiM2E3KSwKKyAgICBRVEMoMHg2YmY1MWI4MCksIFFUQygweDZjMGU4MTVhKSwgUVRDKDB4NmMyN2U1MzcpLCBRVEMoMHg2YzQxNDcxOCksCisgICAgUVRDKDB4NmM1YWE2ZmQpLCBRVEMoMHg2Yzc0MDRlNyksIFFUQygweDZjOGQ2MGQ3KSwgUVRDKDB4NmNhNmJhY2UpLAorICAgIFFUQygweDZjYzAxMmNjKSwgUVRDKDB4NmNkOTY4ZDIpLCBRVEMoMHg2Y2YyYmNlMSksIFFUQygweDZkMGMwZWY5KSwKKyAgICBRVEMoMHg2ZDI1NWYxZCksIFFUQygweDZkM2VhZDRiKSwgUVRDKDB4NmQ1N2Y5ODUpLCBRVEMoMHg2ZDcxNDNjYyksCisgICAgUVRDKDB4NmQ4YThjMjEpLCBRVEMoMHg2ZGEzZDI4MyksIFFUQygweDZkYmQxNmY1KSwgUVRDKDB4NmRkNjU5NzYpLAorICAgIFFUQygweDZkZWY5YTA4KSwgUVRDKDB4NmUwOGQ4YWIpLCBRVEMoMHg2ZTIyMTU2MCksIFFUQygweDZlM2I1MDI3KSwKKyAgICBRVEMoMHg2ZTU0ODkwMiksIFFUQygweDZlNmRiZmYxKSwgUVRDKDB4NmU4NmY0ZjUpLCBRVEMoMHg2ZWEwMjgwZSksCisgICAgUVRDKDB4NmViOTU5M2UpLCBRVEMoMHg2ZWQyODg4NSksIFFUQygweDZlZWJiNWUzKSwgUVRDKDB4NmYwNGUxNWEpLAorICAgIFFUQygweDZmMWUwYWVhKSwgUVRDKDB4NmYzNzMyOTQpLCBRVEMoMHg2ZjUwNTg1OSksIFFUQygweDZmNjk3YzM5KSwKKyAgICBRVEMoMHg2ZjgyOWUzNSksIFFUQygweDZmOWJiZTRlKSwgUVRDKDB4NmZiNGRjODUpLCBRVEMoMHg2ZmNkZjhkOSksCisgICAgUVRDKDB4NmZlNzEzNGQpLCBRVEMoMHg3MDAwMmJlMCksIFFUQygweDcwMTk0MjkzKSwgUVRDKDB4NzAzMjU3NjcpLAorICAgIFFUQygweDcwNGI2YTVkKSwgUVRDKDB4NzA2NDdiNzYpLCBRVEMoMHg3MDdkOGFiMSksIFFUQygweDcwOTY5ODExKSwKKyAgICBRVEMoMHg3MGFmYTM5NCksIFFUQygweDcwYzhhZDNkKSwgUVRDKDB4NzBlMWI1MGMpLCBRVEMoMHg3MGZhYmIwMSksCisgICAgUVRDKDB4NzExM2JmMWQpLCBRVEMoMHg3MTJjYzE2MSksIFFUQygweDcxNDVjMWNlKSwgUVRDKDB4NzE1ZWMwNjQpLAorICAgIFFUQygweDcxNzdiZDI0KSwgUVRDKDB4NzE5MGI4MGYpLCBRVEMoMHg3MWE5YjEyNCksIFFUQygweDcxYzJhODY2KSwKKyAgICBRVEMoMHg3MWRiOWRkNCksIFFUQygweDcxZjQ5MTcwKSwgUVRDKDB4NzIwZDgzMzkpLCBRVEMoMHg3MjI2NzMzMSksCisgICAgUVRDKDB4NzIzZjYxNTkpLCBRVEMoMHg3MjU4NGRiMCksIFFUQygweDcyNzEzODM4KSwgUVRDKDB4NzI4YTIwZjEpLAorICAgIFFUQygweDcyYTMwN2RiKSwgUVRDKDB4NzJiYmVjZjkpLCBRVEMoMHg3MmQ0ZDA0OSksIFFUQygweDcyZWRiMWNlKSwKKyAgICBRVEMoMHg3MzA2OTE4NyksIFFUQygweDczMWY2Zjc1KSwgUVRDKDB4NzMzODRiOTgpLCBRVEMoMHg3MzUxMjVmMyksCisgICAgUVRDKDB4NzM2OWZlODQpLCBRVEMoMHg3MzgyZDU0ZCksIFFUQygweDczOWJhYTRlKSwgUVRDKDB4NzNiNDdkODkpLAorICAgIFFUQygweDczY2Q0ZWZkKSwgUVRDKDB4NzNlNjFlYWIpLCBRVEMoMHg3M2ZlZWM5NCksIFFUQygweDc0MTdiOGI4KSwKKyAgICBRVEMoMHg3NDMwODMxOSksIFFUQygweDc0NDk0YmI2KSwgUVRDKDB4NzQ2MjEyOTEpLCBRVEMoMHg3NDdhZDdhYSksCisgICAgUVRDKDB4NzQ5MzliMDIpLCBRVEMoMHg3NGFjNWM5OCksIFFUQygweDc0YzUxYzZmKSwgUVRDKDB4NzRkZGRhODYpLAorICAgIFFUQygweDc0ZjY5NmRlKSwgUVRDKDB4NzUwZjUxNzgpLCBRVEMoMHg3NTI4MGE1NCksIFFUQygweDc1NDBjMTc0KSwKKyAgICBRVEMoMHg3NTU5NzZkNyksIFFUQygweDc1NzIyYTdlKSwgUVRDKDB4NzU4YWRjNjkpLCBRVEMoMHg3NWEzOGM5YiksCisgICAgUVRDKDB4NzViYzNiMTIpLCBRVEMoMHg3NWQ0ZTdjZiksIFFUQygweDc1ZWQ5MmQ0KSwgUVRDKDB4NzYwNjNjMjEpLAorICAgIFFUQygweDc2MWVlM2I2KSwgUVRDKDB4NzYzNzg5OTQpLCBRVEMoMHg3NjUwMmRiYyksIFFUQygweDc2NjhkMDJlKSwKKyAgICBRVEMoMHg3NjgxNzBlYiksIFFUQygweDc2OWEwZmYzKSwgUVRDKDB4NzZiMmFkNDcpLCBRVEMoMHg3NmNiNDhlNyksCisgICAgUVRDKDB4NzZlM2UyZDUpLCBRVEMoMHg3NmZjN2IxMCksIFFUQygweDc3MTUxMTlhKSwgUVRDKDB4NzcyZGE2NzMpLAorICAgIFFUQygweDc3NDYzOTliKSwgUVRDKDB4Nzc1ZWNiMTMpLCBRVEMoMHg3Nzc3NWFkYyksIFFUQygweDc3OGZlOGY2KSwKKyAgICBRVEMoMHg3N2E4NzU2MSksIFFUQygweDc3YzEwMDFmKSwgUVRDKDB4NzdkOTg5MzApLCBRVEMoMHg3N2YyMTA5NSksCisgICAgUVRDKDB4NzgwYTk2NGQpLCBRVEMoMHg3ODIzMWE1YiksIFFUQygweDc4M2I5Y2JkKSwgUVRDKDB4Nzg1NDFkNzUpLAorICAgIFFUQygweDc4NmM5Yzg0KSwgUVRDKDB4Nzg4NTE5ZTkpLCBRVEMoMHg3ODlkOTVhNiksIFFUQygweDc4YjYwZmJiKSwKKyAgICBRVEMoMHg3OGNlODgyOCksIFFUQygweDc4ZTZmZWVmKSwgUVRDKDB4NzhmZjc0MGYpLCBRVEMoMHg3OTE3ZTc4YSksCisgICAgUVRDKDB4NzkzMDU5NWYpLCBRVEMoMHg3OTQ4Yzk5MCksIFFUQygweDc5NjEzODFkKSwgUVRDKDB4Nzk3OWE1MDYpLAorICAgIFFUQygweDc5OTIxMDRjKSwgUVRDKDB4NzlhYTc5ZjApLCBRVEMoMHg3OWMyZTFmMSksIFFUQygweDc5ZGI0ODUyKSwKKyAgICBRVEMoMHg3OWYzYWQxMSksIFFUQygweDdhMGMxMDMxKSwgUVRDKDB4N2EyNDcxYjApLCBRVEMoMHg3YTNjZDE5MSksCisgICAgUVRDKDB4N2E1NTJmZDMpLCBRVEMoMHg3YTZkOGM3NiksIFFUQygweDdhODVlNzdkKSwgUVRDKDB4N2E5ZTQwZTYpLAorICAgIFFUQygweDdhYjY5OGIyKSwgUVRDKDB4N2FjZWVlZTMpLCBRVEMoMHg3YWU3NDM3OCksIFFUQygweDdhZmY5NjczKSwKKyAgICBRVEMoMHg3YjE3ZTdkMiksIFFUQygweDdiMzAzNzk5KSwgUVRDKDB4N2I0ODg1YzUpLCBRVEMoMHg3YjYwZDI1OSksCisgICAgUVRDKDB4N2I3OTFkNTUpLCBRVEMoMHg3YjkxNjZiOSksIFFUQygweDdiYTlhZTg2KSwgUVRDKDB4N2JjMWY0YmMpLAorICAgIFFUQygweDdiZGEzOTVjKSwgUVRDKDB4N2JmMjdjNjYpLCBRVEMoMHg3YzBhYmRkYiksIFFUQygweDdjMjJmZGJiKSwKKyAgICBRVEMoMHg3YzNiM2MwNyksIFFUQygweDdjNTM3OGMwKSwgUVRDKDB4N2M2YmIzZTUpLCBRVEMoMHg3YzgzZWQ3OCksCisgICAgUVRDKDB4N2M5YzI1NzkpLCBRVEMoMHg3Y2I0NWJlOSksIFFUQygweDdjY2M5MGM3KSwgUVRDKDB4N2NlNGM0MTQpLAorICAgIFFUQygweDdjZmNmNWQyKSwgUVRDKDB4N2QxNTI2MDApLCBRVEMoMHg3ZDJkNTQ5ZiksIFFUQygweDdkNDU4MWIwKSwKKyAgICBRVEMoMHg3ZDVkYWQzMiksIFFUQygweDdkNzVkNzI3KSwgUVRDKDB4N2Q4ZGZmOGYpLCBRVEMoMHg3ZGE2MjY2YSksCisgICAgUVRDKDB4N2RiZTRiYmEpLCBRVEMoMHg3ZGQ2NmY3ZCksIFFUQygweDdkZWU5MWI2KSwgUVRDKDB4N2UwNmIyNjQpLAorICAgIFFUQygweDdlMWVkMTg4KSwgUVRDKDB4N2UzNmVmMjIpLCBRVEMoMHg3ZTRmMGIzNCksIFFUQygweDdlNjcyNWJkKSwKKyAgICBRVEMoMHg3ZTdmM2ViZCksIFFUQygweDdlOTc1NjM2KSwgUVRDKDB4N2VhZjZjMjgpLCBRVEMoMHg3ZWM3ODA5MyksCisgICAgUVRDKDB4N2VkZjkzNzgpLCBRVEMoMHg3ZWY3YTRkNyksIFFUQygweDdmMGZiNGIxKSwgUVRDKDB4N2YyN2MzMDcpLAorICAgIFFUQygweDdmM2ZjZmQ4KSwgUVRDKDB4N2Y1N2RiMjUpLCBRVEMoMHg3ZjZmZTRlZiksIFFUQygweDdmODdlZDM2KSwKKyAgICBRVEMoMHg3ZjlmZjNmYiksIFFUQygweDdmYjdmOTNlKSwgUVRDKDB4N2ZjZmZjZmYpLCBRVEMoMHg3ZmU3ZmY0MCl9OwogCiAvKgogICB0YWJsZSBvZiBwb3coMi4wLDAuMjUqcSkvMi4wLCBxWzAuLjQpCiAqLwotY29uc3QgRklYUF9RVEQgRkRLYWFjRW5jX3F1YW50VGFibGVRWzRdID0geyBRVEMoMHg0MDAwMDAwMCksIFFUQygweDRjMWJmN2ZmKSwgUVRDKDB4NWE4Mjc5N2YpLCBRVEMoMHg2YmEyN2U3ZikgfTsKK2NvbnN0IEZJWFBfUVREIEZES2FhY0VuY19xdWFudFRhYmxlUVs0XSA9IHtRVEMoMHg0MDAwMDAwMCksIFFUQygweDRjMWJmN2ZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVEMoMHg1YTgyNzk3ZiksIFFUQygweDZiYTI3ZTdmKX07CiAKIC8qCiAgIHRhYmxlIG9mIHBvdygyLjAsMC43NSplKS84LjAsIGVbMC4uNCkKICovCi1jb25zdCBGSVhQX1FURCBGREthYWNFbmNfcXVhbnRUYWJsZUVbNF0gPSB7IFFUQygweDEwMDAwMDAwKSwgUVRDKDB4MWFlODlmOTkpLCBRVEMoMHgyZDQxM2NjZCksIFFUQygweDRjMWJmODI4KSB9OwotCitjb25zdCBGSVhQX1FURCBGREthYWNFbmNfcXVhbnRUYWJsZUVbNF0gPSB7UVRDKDB4MTAwMDAwMDApLCBRVEMoMHgxYWU4OWY5OSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVRDKDB4MmQ0MTNjY2QpLCBRVEMoMHg0YzFiZjgyOCl9OwogCiAvKgogICB0YWJsZSB0byBjb3VudCB1c2VkIG51bWJlciBvZiBiaXRzCiAqLwotY29uc3QgU0hPUlQgRkRLYWFjRW5jX3NpZGVJbmZvVGFiTG9uZ1tNQVhfU0ZCX0xPTkcgKyAxXSA9Ci17Ci0gIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LAotICAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwKLSAgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksCi0gIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDBlLAotICAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwKLSAgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsCi0gIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZQotfTsKK2NvbnN0IFNIT1JUIEZES2FhY0VuY19zaWRlSW5mb1RhYkxvbmdbXSA9IHsKKyAgICAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LAorICAgIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksCisgICAgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwOSwKKyAgICAweDAwMDksIDB4MDAwOSwgMHgwMDA5LCAweDAwMDksIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLAorICAgIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsCisgICAgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlfTsKIAotCi1jb25zdCBTSE9SVCBGREthYWNFbmNfc2lkZUluZm9UYWJTaG9ydFtNQVhfU0ZCX1NIT1JUICsgMV0gPQotewotICAweDAwMDcsIDB4MDAwNywgMHgwMDA3LCAweDAwMDcsIDB4MDAwNywgMHgwMDA3LCAweDAwMDcsIDB4MDAwYSwKLSAgMHgwMDBhLCAweDAwMGEsIDB4MDAwYSwgMHgwMDBhLCAweDAwMGEsIDB4MDAwYSwgMHgwMDBkLCAweDAwMGQKLX07Ci0KLQotCi0KLQorY29uc3QgU0hPUlQgRkRLYWFjRW5jX3NpZGVJbmZvVGFiU2hvcnRbXSA9IHsKKyAgICAweDAwMDcsIDB4MDAwNywgMHgwMDA3LCAweDAwMDcsIDB4MDAwNywgMHgwMDA3LCAweDAwMDcsIDB4MDAwYSwKKyAgICAweDAwMGEsIDB4MDAwYSwgMHgwMDBhLCAweDAwMGEsIDB4MDAwYSwgMHgwMDBhLCAweDAwMGQsIDB4MDAwZH07CiAKIC8qCiAgIFBzeSBDb25maWd1cmF0aW9uIGNvbnN0YW50cwogKi8KIAogY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfODAwMF9sb25nXzEwMjQgPSB7Ci0gICAgNDAsCi0gICAgeyAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCi0gICAgICAyMCwgMjAsIDIwLCAyMCwgMjQsIDI0LCAyNCwgMjgsIDI4LCAzMiwgMzYsIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgODAgfQotfTsKKyAgICA0MCwgezEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxNiwKKyAgICAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDIwLCAyMCwgMjAsIDIwLCAyNCwgMjQsIDI0LCAyOCwKKyAgICAgICAgIDI4LCAzMiwgMzYsIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgODB9fTsKIGNvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY184MDAwX3Nob3J0XzEyOCA9IHsKLSAgICAxNSwKLSAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgMTIsIDE2LCAyMCwgMjAgfQotfTsKKyAgICAxNSwgezQsIDQsIDQsIDQsIDQsIDQsIDQsIDgsIDgsIDgsIDgsIDEyLCAxNiwgMjAsIDIwfX07CiAKIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfRkRLYWFjRW5jXzExMDI1X2xvbmdfMTAyNCA9IHsKLSAgICA0MywKLSAgICB7ICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKLSAgICAgIDE2LCAxNiwgMTYsIDE2LCAyMCwgMjAsIDIwLCAyNCwgMjQsIDI4LCAyOCwgMzIsIDM2LCA0MCwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwKLSAgICAgIDY0LCA2NCwgNjQgfQotfTsKKyAgICA0MywgezgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgMTIsIDEyLCAxMiwgMTIsCisgICAgICAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMTYsIDE2LCAyMCwgMjAsIDIwLCAyNCwgMjQsIDI4LAorICAgICAgICAgMjgsIDMyLCAzNiwgNDAsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCA2NCwgNjR9fTsKIGNvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY18xMTAyNV9zaG9ydF8xMjggPSB7Ci0gICAgMTUsCi0gICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgMTIsIDEyLCAxNiwgMjAsIDIwIH0KLX07CisgICAgMTUsIHs0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA4LCA4LCAxMiwgMTIsIDE2LCAyMCwgMjB9fTsKIAogY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfMTIwMDBfbG9uZ18xMDI0ID0gewotICAgIDQzLAotICAgIHsgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAotICAgICAgMTYsIDE2LCAxNiwgMTYsIDIwLCAyMCwgMjAsIDI0LCAyNCwgMjgsIDI4LCAzMiwgMzYsIDQwLCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLAotICAgICAgNjQsIDY0LCA2NCB9Ci19OworICAgIDQzLCB7OCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICAxMiwgMTIsIDEyLCAxMiwKKyAgICAgICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTYsIDE2LCAxNiwgMTYsIDIwLCAyMCwgMjAsIDI0LCAyNCwgMjgsCisgICAgICAgICAyOCwgMzIsIDM2LCA0MCwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDY0LCA2NH19OwogY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzEyMDAwX3Nob3J0XzEyOCA9IHsKLSAgICAxNSwKLSAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAxMiwgMTIsIDE2LCAyMCwgMjAgfQotfTsKKyAgICAxNSwgezQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDgsIDgsIDEyLCAxMiwgMTYsIDIwLCAyMH19OwogCiBjb25zdCBTRkJfUEFSQU1fTE9ORyBwX0ZES2FhY0VuY18xNjAwMF9sb25nXzEwMjQgPSB7Ci0gICAgNDMsCi0gICAgeyAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCi0gICAgICAxNiwgMTYsIDE2LCAxNiwgMjAsIDIwLCAyMCwgMjQsIDI0LCAyOCwgMjgsIDMyLCAzNiwgNDAsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsCi0gICAgICA2NCwgNjQsIDY0IH0KLX07CisgICAgNDMsIHs4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDEyLCAxMiwgMTIsIDEyLAorICAgICAgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxNiwgMTYsIDE2LCAxNiwgMjAsIDIwLCAyMCwgMjQsIDI0LCAyOCwKKyAgICAgICAgIDI4LCAzMiwgMzYsIDQwLCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgNjQsIDY0fX07CiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfMTYwMDBfc2hvcnRfMTI4ID0gewotICAgIDE1LAotICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsIDEyLCAxMiwgMTYsIDIwLCAyMCB9Ci19OworICAgIDE1LCB7NCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgOCwgOCwgMTIsIDEyLCAxNiwgMjAsIDIwfX07CiBjb25zdCBTRkJfUEFSQU1fTE9ORyBwX0ZES2FhY0VuY18yMjA1MF9sb25nXzEwMjQgPSB7Ci0gICAgNDcsCi0gICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCi0gICAgICAgOCwgMTIsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMTYsIDIwLCAyMCwgMjQsIDI0LCAyOCwgMjgsIDMyLCAzNiwgMzYsIDQwLCA0NCwgNDgsCi0gICAgICA1MiwgNTIsIDY0LCA2NCwgNjQsIDY0LCA2NCB9Ci19OworICAgIDQ3LCB7NCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgICAgICAgIDgsICA4LCAgOCwgIDgsICA4LCAgMTIsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMTYsIDIwLCAyMCwgMjQsIDI0LAorICAgICAgICAgMjgsIDI4LCAzMiwgMzYsIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTIsIDY0LCA2NCwgNjQsIDY0LCA2NH19OwogY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzIyMDUwX3Nob3J0XzEyOCA9IHsKLSAgICAxNSwKLSAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAxMiwgMTIsIDE2LCAxNiwgMjAgfQotfTsKKyAgICAxNSwgezQsIDQsIDQsIDQsIDQsIDQsIDQsIDgsIDgsIDgsIDEyLCAxMiwgMTYsIDE2LCAyMH19OwogY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfMjQwMDBfbG9uZ18xMDI0ID0gewotICAgIDQ3LAotICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAotICAgICAgIDgsIDEyLCAxMiwgMTIsIDEyLCAxNiwgMTYsIDE2LCAyMCwgMjAsIDI0LCAyNCwgMjgsIDI4LCAzMiwgMzYsIDM2LCA0MCwgNDQsIDQ4LAotICAgICAgNTIsIDUyLCA2NCwgNjQsIDY0LCA2NCwgNjQgfQotfTsKKyAgICA0NywgezQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDEyLCAxMiwgMTIsIDEyLCAxNiwgMTYsIDE2LCAyMCwgMjAsIDI0LCAyNCwKKyAgICAgICAgIDI4LCAyOCwgMzIsIDM2LCAzNiwgNDAsIDQ0LCA0OCwgNTIsIDUyLCA2NCwgNjQsIDY0LCA2NCwgNjR9fTsKIGNvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY18yNDAwMF9zaG9ydF8xMjggPSB7Ci0gICAgMTUsCi0gICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgMTIsIDEyLCAxNiwgMTYsIDIwIH0KLX07CisgICAgMTUsIHs0LCA0LCA0LCA0LCA0LCA0LCA0LCA4LCA4LCA4LCAxMiwgMTIsIDE2LCAxNiwgMjB9fTsKIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfRkRLYWFjRW5jXzMyMDAwX2xvbmdfMTAyNCA9IHsKLSAgICA1MSwKLSAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgMTIsIDEyLCAxMiwKLSAgICAgIDEyLCAxNiwgMTYsIDIwLCAyMCwgMjQsIDI0LCAyOCwgMjgsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKLSAgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiB9Ci19OworICAgIDUxLCB7NCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgICAgICAxMiwgMTIsIDEyLCAxMiwgMTYsIDE2LCAyMCwgMjAsIDI0LCAyNCwgMjgsIDI4LCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzJ9fTsKIGNvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY18zMjAwMF9zaG9ydF8xMjggPSB7Ci0gICAgMTQsCi0gICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMTYgfQotfTsKKyAgICAxNCwgezQsIDQsIDQsIDQsIDQsIDgsIDgsIDgsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMTZ9fTsKIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfRkRLYWFjRW5jXzQ0MTAwX2xvbmdfMTAyNCA9IHsKLSAgICA0OSwKLSAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgMTIsIDEyLCAxMiwKLSAgICAgIDEyLCAxNiwgMTYsIDIwLCAyMCwgMjQsIDI0LCAyOCwgMjgsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKLSAgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgOTYgfQotfTsKKyAgICA0OSwgezQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICAgICAgICAgMTIsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMjAsIDIwLCAyNCwgMjQsIDI4LCAyOCwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCA5Nn19OwogY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzQ0MTAwX3Nob3J0XzEyOCA9IHsKLSAgICAxNCwKLSAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgMTIsIDEyLCAxMiwgMTYsIDE2LCAxNiB9Ci19OworICAgIDE0LCB7NCwgNCwgNCwgNCwgNCwgOCwgOCwgOCwgMTIsIDEyLCAxMiwgMTYsIDE2LCAxNn19OwogY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfNDgwMDBfbG9uZ18xMDI0ID0gewotICAgIDQ5LAotICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAxMiwgMTIsIDEyLAotICAgICAgMTIsIDE2LCAxNiwgMjAsIDIwLCAyNCwgMjQsIDI4LCAyOCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAotICAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCA5NiB9Ci19OworICAgIDQ5LCB7NCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgICAgICAxMiwgMTIsIDEyLCAxMiwgMTYsIDE2LCAyMCwgMjAsIDI0LCAyNCwgMjgsIDI4LCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDk2fX07CiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfNDgwMDBfc2hvcnRfMTI4ID0gewotICAgIDE0LAotICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAxMiwgMTIsIDEyLCAxNiwgMTYsIDE2IH0KLX07CisgICAgMTQsIHs0LCA0LCA0LCA0LCA0LCA4LCA4LCA4LCAxMiwgMTIsIDEyLCAxNiwgMTYsIDE2fX07CiBjb25zdCBTRkJfUEFSQU1fTE9ORyBwX0ZES2FhY0VuY182NDAwMF9sb25nXzEwMjQgPSB7Ci0gICAgNDcsCi0gICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsICA4LCAxMiwgMTIsCi0gICAgICAxMiwgMTYsIDE2LCAxNiwgMjAsIDI0LCAyNCwgMjgsIDM2LCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsCi0gICAgICA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCB9Ci19OworICAgIDQ3LCB7NCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwKKyAgICAgICAgIDgsICA4LCAgMTIsIDEyLCAxMiwgMTYsIDE2LCAxNiwgMjAsIDI0LCAyNCwgMjgsIDM2LCA0MCwgNDAsIDQwLAorICAgICAgICAgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MH19OwogY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzY0MDAwX3Nob3J0XzEyOCA9IHsKLSAgICAxMiwKLSAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsIDE2LCAyOCwgMzYgfQotfTsKKyAgICAxMiwgezQsIDQsIDQsIDQsIDQsIDQsIDgsIDgsIDgsIDE2LCAyOCwgMzZ9fTsKIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfRkRLYWFjRW5jXzg4MjAwX2xvbmdfMTAyNCA9IHsKLSAgICA0MSwKLSAgICB7ICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsICA4LCAxMiwKLSAgICAgIDEyLCAxMiwgMTIsIDEyLCAxNiwgMTYsIDI0LCAyOCwgMzYsIDQ0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwKLSAgICAgIDY0IH0KLX07CisgICAgNDEsIHs0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKKyAgICAgICAgIDgsICA4LCAgOCwgIDgsICA4LCAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxNiwgMTYsIDI0LCAyOCwKKyAgICAgICAgIDM2LCA0NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0fX07CiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfODgyMDBfc2hvcnRfMTI4ID0gewotICAgIDEyLAotICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgMTYsIDI4LCAzNiB9Ci19OworICAgIDEyLCB7NCwgNCwgNCwgNCwgNCwgNCwgOCwgOCwgOCwgMTYsIDI4LCAzNn19OwogY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfOTYwMDBfbG9uZ18xMDI0ID0gewotICAgIDQxLAotICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgIDgsIDEyLAotICAgICAgMTIsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMjQsIDI4LCAzNiwgNDQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LAotICAgICAgNjQgfQotfTsKKyAgICA0MSwgezQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LAorICAgICAgICAgOCwgIDgsICA4LCAgOCwgIDgsICAxMiwgMTIsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMjQsIDI4LAorICAgICAgICAgMzYsIDQ0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjR9fTsKIGNvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY185NjAwMF9zaG9ydF8xMjggPSB7Ci0gICAgMTIsCi0gICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAxNiwgMjgsIDM2IH0KLX07Ci0KKyAgICAxMiwgezQsIDQsIDQsIDQsIDQsIDQsIDgsIDgsIDgsIDE2LCAyOCwgMzZ9fTsKIAogLyoKICAgVE5TIGZpbHRlciBjb2VmZmljaWVudHMKQEAgLTY1NSw1NzggKzgxNSwxNjcyIEBACiAvKgogICAzIGJpdCByZXNvbHV0aW9uCiAqLwotY29uc3QgRklYUF9EQkwgRkRLYWFjRW5jX3Ruc0VuY0NvZWZmM1s4XT0KLXsKLSAgKEZJWFBfREJMKTB4ODFmMWQyMDEsIChGSVhQX0RCTCkweDkxMjYxNDgxLCAoRklYUF9EQkwpMHhhZGI5MjMwMSwgKEZJWFBfREJMKTB4ZDQzOGFmMDAsIChGSVhQX0RCTCkweDAwMDAwMDAwLCAoRklYUF9EQkwpMHgzNzg5ODA4MCwgKEZJWFBfREJMKTB4NjQxMzBkZmYsIChGSVhQX0RCTCkweDdjY2E2ZmZmCi19OwotY29uc3QgRklYUF9EQkwgRkRLYWFjRW5jX3Ruc0NvZWZmM0JvcmRlcnNbOF09ewotICAoRklYUF9EQkwpMHg4MDAwMDAwMSAvKi00Ki8sICAoRklYUF9EQkwpMHg4N2I4MjZkZiAvKi0zKi8sICAoRklYUF9EQkwpMHg5ZGYyNDE1NCAvKi0yKi8sICAoRklYUF9EQkwpMHhiZmZmZmZlNSAvKi0xKi8sCi0gIChGSVhQX0RCTCkweGU5YzVlNTc4IC8qIDAqLywgIChGSVhQX0RCTCkweDFjN2I5MGYwIC8qIDEqLywgIChGSVhQX0RCTCkweDRmY2U4M2E5IC8qIDIqLywgIChGSVhQX0RCTCkweDczNTJmMmMzIC8qIDMqLworY29uc3QgRklYUF9MUEMgRkRLYWFjRW5jX3Ruc0VuY0NvZWZmM1s4XSA9IHsKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHg4MWYxZDIwMSksIEZYX0RCTDJGWENPTlNUX0xQQygweDkxMjYxNDgxKSwKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHhhZGI5MjMwMSksIEZYX0RCTDJGWENPTlNUX0xQQygweGQ0MzhhZjAwKSwKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHgwMDAwMDAwMCksIEZYX0RCTDJGWENPTlNUX0xQQygweDM3ODk4MDgwKSwKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHg2NDEzMGRmZiksIEZYX0RCTDJGWENPTlNUX0xQQygweDdjY2E2ZmZmKX07Citjb25zdCBGSVhQX0xQQyBGREthYWNFbmNfdG5zQ29lZmYzQm9yZGVyc1s4XSA9IHsKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHg4MDAwMDAwMSkgLyotNCovLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDg3YjgyNmRmKSAvKi0zKi8sCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4OWRmMjQxNTQpIC8qLTIqLywKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHhiZmZmZmZlNSkgLyotMSovLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweGU5YzVlNTc4KSAvKiAwKi8sCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4MWM3YjkwZjApIC8qIDEqLywKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHg0ZmNlODNhOSkgLyogMiovLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDczNTJmMmMzKSAvKiAzKi8KIH07CiAKIC8qCiAgIDQgYml0IHJlc29sdXRpb24KICovCi1jb25zdCBGSVhQX0RCTCBGREthYWNFbmNfdG5zRW5jQ29lZmY0WzE2XT0KLXsKLSAgKEZJWFBfREJMKTB4ODA4YmM4ODEsIChGSVhQX0RCTCkweDg0ZTJlNTgxLCAoRklYUF9EQkwpMHg4ZDZiNGEwMSwgKEZJWFBfREJMKTB4OTlkYTkyMDEsIChGSVhQX0RCTCkweGE5YzQ1NzAxLCAoRklYUF9EQkwpMHhiYzlkZGU4MSwgKEZJWFBfREJMKTB4ZDFjMmQ1MDAsIChGSVhQX0RCTCkweGU4N2FlNTQwLAotICAoRklYUF9EQkwpMHgwMDAwMDAwMCwgKEZJWFBfREJMKTB4MWE5Y2Q5YzAsIChGSVhQX0RCTCkweDM0MGZmMjQwLCAoRklYUF9EQkwpMHg0YjNjOGJmZiwgKEZJWFBfREJMKTB4NWYxZjVlN2YsIChGSVhQX0RCTCkweDZlZDllYjdmLCAoRklYUF9EQkwpMHg3OWJjMzg3ZiwgKEZJWFBfREJMKTB4N2Y0YzdlN2YKK2NvbnN0IEZJWFBfTFBDIEZES2FhY0VuY190bnNFbmNDb2VmZjRbMTZdID0geworICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDgwOGJjODgxKSwgRlhfREJMMkZYQ09OU1RfTFBDKDB4ODRlMmU1ODEpLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDhkNmI0YTAxKSwgRlhfREJMMkZYQ09OU1RfTFBDKDB4OTlkYTkyMDEpLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweGE5YzQ1NzAxKSwgRlhfREJMMkZYQ09OU1RfTFBDKDB4YmM5ZGRlODEpLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweGQxYzJkNTAwKSwgRlhfREJMMkZYQ09OU1RfTFBDKDB4ZTg3YWU1NDApLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDAwMDAwMDAwKSwgRlhfREJMMkZYQ09OU1RfTFBDKDB4MWE5Y2Q5YzApLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDM0MGZmMjQwKSwgRlhfREJMMkZYQ09OU1RfTFBDKDB4NGIzYzhiZmYpLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDVmMWY1ZTdmKSwgRlhfREJMMkZYQ09OU1RfTFBDKDB4NmVkOWViN2YpLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDc5YmMzODdmKSwgRlhfREJMMkZYQ09OU1RfTFBDKDB4N2Y0YzdlN2YpfTsKK2NvbnN0IEZJWFBfTFBDIEZES2FhY0VuY190bnNDb2VmZjRCb3JkZXJzWzE2XSA9IHsKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHg4MDAwMDAwMSkgLyotOCovLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDgyMmRlZmYwKSAvKi03Ki8sCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4ODhhNGJmZTYpIC8qLTYqLywKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHg5MzJjMTU5ZCkgLyotNSovLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweGExNjgyN2MyKSAvKi00Ki8sCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4YjJkY2RlMjcpIC8qLTMqLywKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHhjNmYyMGI5MSkgLyotMiovLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweGRjZjg5YzY0KSAvKi0xKi8sCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4ZjQzMDhjZTEpIC8qIDAqLywKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHgwZDYxMzA1NCkgLyogMSovLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDI3OGRkZTgwKSAvKiAyKi8sCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4NDAwMDAwMWIpIC8qIDMqLywKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHg1NWE2MTI3YikgLyogNCovLAorICAgIEZYX0RCTDJGWENPTlNUX0xQQygweDY3OGRkZThmKSAvKiA1Ki8sCisgICAgRlhfREJMMkZYQ09OU1RfTFBDKDB4NzRlZjBlZDcpIC8qIDYqLywKKyAgICBGWF9EQkwyRlhDT05TVF9MUEMoMHg3ZDMzZjBkYSkgLyogNyovCiB9OwotY29uc3QgRklYUF9EQkwgRkRLYWFjRW5jX3Ruc0NvZWZmNEJvcmRlcnNbMTZdPQotewotICAoRklYUF9EQkwpMHg4MDAwMDAwMSAvKi04Ki8sICAoRklYUF9EQkwpMHg4MjJkZWZmMCAvKi03Ki8sICAoRklYUF9EQkwpMHg4OGE0YmZlNiAvKi02Ki8sICAoRklYUF9EQkwpMHg5MzJjMTU5ZCAvKi01Ki8sCi0gIChGSVhQX0RCTCkweGExNjgyN2MyIC8qLTQqLywgIChGSVhQX0RCTCkweGIyZGNkZTI3IC8qLTMqLywgIChGSVhQX0RCTCkweGM2ZjIwYjkxIC8qLTIqLywgIChGSVhQX0RCTCkweGRjZjg5YzY0IC8qLTEqLywKLSAgKEZJWFBfREJMKTB4ZjQzMDhjZTEgLyogMCovLCAgKEZJWFBfREJMKTB4MGQ2MTMwNTQgLyogMSovLCAgKEZJWFBfREJMKTB4Mjc4ZGRlODAgLyogMiovLCAgKEZJWFBfREJMKTB4NDAwMDAwMWIgLyogMyovLAotICAoRklYUF9EQkwpMHg1NWE2MTI3YiAvKiA0Ki8sICAoRklYUF9EQkwpMHg2NzhkZGU4ZiAvKiA1Ki8sICAoRklYUF9EQkwpMHg3NGVmMGVkNyAvKiA2Ki8sICAoRklYUF9EQkwpMHg3ZDMzZjBkYSAvKiA3Ki8KLX07Ci1jb25zdCBGSVhQX0RCTCBGREthYWNFbmNfbVRhYl80XzNFbGNbNTEyXT17Ci0gIEZMMkZYQ09OU1RfREJMKDAuMzk2ODUwMjYyOTkyMDQ5OSksRkwyRlhDT05TVF9EQkwoMC4zOTc4ODQwNjM0ODY4MzM1KSxGTDJGWENPTlNUX0RCTCgwLjM5ODkxODUzNTkzNTQ3MTEpLEZMMkZYQ09OU1RfREJMKDAuMzk5OTUzNjc5NDY2MTQzMiksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDAwOTg5NDkzMjA5ODUzMSksRkwyRlhDT05TVF9EQkwoMC40MDIwMjU5NzYzMDA0MTE1KSxGTDJGWENPTlNUX0RCTCgwLjQwMzA2MzEyNzg3NDQyMjcpLEZMMkZYQ09OU1RfREJMKDAuNDA0MTAwOTQ3MDcxMjY5NSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDA1MTM5NDMzMDMzMDk5NiksRkwyRlhDT05TVF9EQkwoMC40MDYxNzg1ODQ5MDQ4MTEwKSxGTDJGWENPTlNUX0RCTCgwLjQwNzIxODQwMTgzNDAzODApLEZMMkZYQ09OU1RfREJMKDAuNDA4MjU4ODgyOTcxMTM3MiksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDA5MzAwMDI3NDY5MTczOSksRkwyRlhDT05TVF9EQkwoMC40MTAzNDE4MzQ0ODM5MDc4KSxGTDJGWENPTlNUX0RCTCgwLjQxMTM4NDMwMzE3Mzc3OTgpLEZMMkZYQ09OU1RfREJMKDAuNDEyNDI3NDMyNjk5ODk4MCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDEzNDcxMjIyMjI2MDI0NSksRkwyRlhDT05TVF9EQkwoMC40MTQ1MTU2NzA5MTg1NjIwKSxGTDJGWENPTlNUX0RCTCgwLjQxNTU2MDc3Nzk0NjU0MDApLEZMMkZYQ09OU1RfREJMKDAuNDE2NjA2NTQyNDgxNjAyMiksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDE3NjUyOTYzNjk3OTkzMiksRkwyRlhDT05TVF9EQkwoMC40MTg3MDAwNDA3NzI1NDUyKSxGTDJGWENPTlNUX0RCTCgwLjQxOTc0Nzc3Mjg4NDY2NTIpLEZMMkZYQ09OU1RfREJMKDAuNDIwNzk2MTU5MjE2MzIyMiksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDIxODQ1MTk4OTUyMDM0NSksRkwyRlhDT05TVF9EQkwoMC40MjI4OTQ4OTEyNzg4NTY3KSxGTDJGWENPTlNUX0RCTCgwLjQyMzk0NTIzNTM4NjM2NzMpLEZMMkZYQ09OU1RfREJMKDAuNDI0OTk2MjMwNDY2NjU2NCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDI2MDQ3ODc1NzE0MzEzMCksRkwyRlhDT05TVF9EQkwoMC40MjcxMDAxNzAzMjY0MTI0KSxGTDJGWENPTlNUX0RCTCgwLjQyODE1MzExMzUwMjUwNDYpLEZMMkZYQ09OU1RfREJMKDAuNDI5MjA2NzA0NDQ0NjAxNyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDMwMjYwOTQyMzU3MTY1OCksRkwyRlhDT05TVF9EQkwoMC40MzEzMTU4MjY0NDcwOTcwKSxGTDJGWENPTlNUX0RCTCgwLjQzMjM3MTM1NTkyMzcyMTYpLEZMMkZYQ09OU1RfREJMKDAuNDMzNDI3NTI5OTk4NzgwMyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDM0NDg0MzQ3ODg2NDE2MSksRkwyRlhDT05TVF9EQkwoMC40MzU1NDE4MDg4MDMxNjMwKSxGTDJGWENPTlNUX0RCTCgwLjQzNjU5OTkxMTk2NzkzMzkpLEZMMkZYQ09OU1RfREJMKDAuNDM3NjU4NjU2NjAyMDA5NiksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDM4NzE4MDQxOTI5MDI3MiksRkwyRlhDT05TVF9EQkwoMC40Mzk3NzgwNjcxNzQ5NjgzKSxGTDJGWENPTlNUX0RCTCgwLjQ0MDgzODczMTU2ODE0ODApLEZMMkZYQ09OU1RfREJMKDAuNDQxOTAwMDM0MzM5MjAzOSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDQyOTYxOTc0NzIxMDg0NyksRkwyRlhDT05TVF9EQkwoMC40NDQwMjQ1NTE5NDkwMzg4KSxGTDJGWENPTlNUX0RCTCgwLjQ0NTA4Nzc2NTI2MDYwMzgpLEZMMkZYQ09OU1RfREJMKDAuNDQ2MTUxNjEzODk1NTk1MyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDQ3MjE2MDk3MDk2MDk2MyksRkwyRlhDT05TVF9EQkwoMC40NDgyODEyMTQxMDY0NDU4KSxGTDJGWENPTlNUX0RCTCgwLjQ0OTM0Njk2NDE3MzIyODYpLEZMMkZYQ09OU1RfREJMKDAuNDUwNDEzMzQ2NTQ1MjY0OCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDUxNDgwMzYwNDczNTk4NCksRkwyRlhDT05TVF9EQkwoMC40NTI1NDgwMDUyMTE0ODc1KSxGTDJGWENPTlNUX0RCTCgwLjQ1MzYxNjI4MDAxNDM5MzkpLEZMMkZYQ09OU1RfREJMKDAuNDU0Njg1MTg0MTM5OTcxOSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDU1NzU0NzE2ODQ4MDU5MSksRkwyRlhDT05TVF9EQkwoMC40NTY4MjQ4Nzc0MDA2NjUyKSxGTDJGWENPTlNUX0RCTCgwLjQ1Nzg5NTY2NTA2MTk2MjMpLEZMMkZYQ09OU1RfREJMKDAuNDU4OTY3MDc5MDk4Mjc0NiksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDYwMDM5MTE4Nzc4MDY4OCksRkwyRlhDT05TVF9EQkwoMC40NjExMTE3ODMzNzE5NDMwKSxGTDJGWENPTlNUX0RCTCgwLjQ2MjE4NTA3MjE1MjYxODQpLEZMMkZYQ09OU1RfREJMKDAuNDYzMjU4OTg0Mzk0OTI3OCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDY0MzMzNTE5Mzc1ODA2OSksRkwyRlhDT05TVF9EQkwoMC40NjU0MDg2NzYzNzQyODQyKSxGTDJGWENPTlNUX0RCTCgwLjQ2NjQ4NDQ1NDY3MTQ3MTMpLEZMMkZYQ09OU1RfREJMKDAuNDY3NTYwODUzNTUwNTUzMiksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDY4NjM3ODcyMjk2Nzc5MCksRkwyRlhDT05TVF9EQkwoMC40Njk3MTU1MTAxOTc0NTIyKSxGTDJGWENPTlNUX0RCTCgwLjQ3MDc5Mzc2NjU0MTkyMTYpLEZMMkZYQ09OU1RfREJMKDAuNDcxODcyNjQwNjIxNTcxMyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDcyOTUyMTMxNzI5ODExOCksRkwyRlhDT05TVF9EQkwoMC40NzQwMzIyMzkxNjIwNzExKSxGTDJGWENPTlNUX0RCTCgwLjQ3NTExMjk2MjIxNTc4NDUpLEZMMkZYQ09OU1RfREJMKDAuNDc2MTk0MzAwMTkwMzg2NyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDc3Mjc2MjUyMzg3MzAxNSksRkwyRlhDT05TVF9EQkwoMC40NzgzNTg4MTgxMDk5MzM4KSxGTDJGWENPTlNUX0RCTCgwLjQ3OTQ0MTk5NjY2MzY1OTkpLEZMMkZYQ09OU1RfREJMKDAuNDgwNTI1Nzg3MzU1ODE5MCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDgxNjEwMTg5NDk1NzA0MiksRkwyRlhDT05TVF9EQkwoMC40ODI2OTUyMDIzOTQ1NTM3KSxGTDJGWENPTlNUX0RCTCgwLjQ4Mzc4MDgyNTM2NTU0MjEpLEZMMkZYQ09OU1RfREJMKDAuNDg0ODY3MDU3NzIzNzcxNCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDg1OTUzODk4Nzg2MjYzMiksRkwyRlhDT05TVF9EQkwoMC40ODcwNDEzNDc4NzE5NDg4KSxGTDJGWENPTlNUX0RCTCgwLjQ4ODEyOTQwNDMwMTY2MjEpLEZMMkZYQ09OU1RfREJMKDAuNDg5MjE4MDY3Mzk4MTI5OCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDkwMzA3MzM2NDg1OTY0MCksRkwyRlhDT05TVF9EQkwoMC40OTEzOTcyMTA4OTE2NTMzKSxGTDJGWENPTlNUX0RCTCgwLjQ5MjQ4NzY4OTk0MzU1NDUpLEZMMkZYQ09OU1RfREJMKDAuNDkzNTc4NzcyOTcxODg0NCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDk0NjcwNDU5MzA4NzExNiksRkwyRlhDT05TVF9EQkwoMC40OTU3NjI3NDgyODc5NDg0KSxGTDJGWENPTlNUX0RCTCgwLjQ5Njg1NTYzOTI0NTM0MjMpLEZMMkZYQ09OU1RfREJMKDAuNDk3OTQ5MTMxNTE4NDY4NCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNDk5MDQzMjI0NDQ2NzIxMSksRkwyRlhDT05TVF9EQkwoMC41MDAxMzc5MTczNzEzMDYyKSxGTDJGWENPTlNUX0RCTCgwLjUwMTIzMzIwOTYzNTIzMjgpLEZMMkZYQ09OU1RfREJMKDAuNTAyMzI5MTAwNTgzMzA1NiksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTAzNDI1NTg5NTYyMTE3MSksRkwyRlhDT05TVF9EQkwoMC41MDQ1MjI2NzU5MjAwMzk5KSxGTDJGWENPTlNUX0RCTCgwLjUwNTYyMDM1OTAwNzIxODEpLEZMMkZYQ09OU1RfREJMKDAuNTA2NzE4NjM4MTc1NTYxMSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTA3ODE3NTEyNzc4NzM0NiksRkwyRlhDT05TVF9EQkwoMC41MDg5MTY5ODIxNzIxNTM2KSxGTDJGWENPTlNUX0RCTCgwLjUxMDAxNzA0NTcxMjk3NDkpLEZMMkZYQ09OU1RfREJMKDAuNTExMTE3NzAyNzYwMDg5MyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTEyMjE4OTUyNjc0MTE0MyksRkwyRlhDT05TVF9EQkwoMC41MTMzMjA3OTQ4MTczODY4KSxGTDJGWENPTlNUX0RCTCgwLjUxNDQyMzIyODU1Mzk1NTIpLEZMMkZYQ09OU1RfREJMKDAuNTE1NTI2MjUzMjQ5NTcyNiksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTE2NjI5ODY4MjcxNjg5NCksRkwyRlhDT05TVF9EQkwoMC41MTc3MzQwNzI5ODk0NDYwKSxGTDJGWENPTlNUX0RCTCgwLjUxODgzODg2Njc3MzY2NTIpLEZMMkZYQ09OU1RfREJMKDAuNTE5OTQ0MjQ4OTk2ODQ1NyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTIxMDUwMjE5MDMzMTU0NCksRkwyRlhDT05TVF9EQkwoMC41MjIxNTY3NzYyNTg0MTk4KSxGTDJGWENPTlNUX0RCTCgwLjUyMzI2MzkyMDA1MDEyNDcpLEZMMkZYQ09OU1RfREJMKDAuNTI0MzcxNjQ5Nzg3Mzk4OSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTI1NDc5OTY0ODUxMDEzMCksRkwyRlhDT05TVF9EQkwoMC41MjY1ODg4NjQ2MjMzNzA1KSxGTDJGWENPTlNUX0RCTCgwLjUyNzY5ODM0ODQ4ODUwMjEpLEZMMkZYQ09OU1RfREJMKDAuNTI4ODA4NDE1ODMyMDU3NCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTI5OTE5MDY2MDQxMjk5NSksRkwyRlhDT05TVF9EQkwoMC41MzEwMzAyOTg1MDUwOTc1KSxGTDJGWENPTlNUX0RCTCgwLjUzMjE0MjExMjYxMzkxOTgpLEZMMkZYQ09OU1RfREJMKDAuNTMzMjU0NTA3NzU5ODI3NCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTM0MzY3NDgzMzM2NDY3OCksRkwyRlhDT05TVF9EQkwoMC41MzU0ODEwMzg3MzkwNjc1KSxGTDJGWENPTlNUX0RCTCgwLjUzNjU5NTE3MzM2NDQyNjIpLEZMMkZYQ09OU1RfREJMKDAuNTM3NzA5ODg2NjEwOTA5NyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTM4ODI1MTc3ODc4NDQzOCksRkwyRlhDT05TVF9EQkwoMC41Mzk5NDEwNDY1Njg1MDc1KSxGTDJGWENPTlNUX0RCTCgwLjU0MTA1NzQ5MjA4NDEyNzIpLEZMMkZYQ09OU1RfREJMKDAuNTQyMTc0NTEzODI5ODY5NSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTQzMjkyMTExMjExODM1MyksRkwyRlhDT05TVF9EQkwoMC41NDQ0MTAyODM2Mzc2NTM0KSxGTDJGWENPTlNUX0RCTCgwLjU0NTUyOTAzMDUxNjQ3NDQpLEZMMkZYQ09OU1RfREJMKDAuNTQ2NjQ4MzUxMjU4OTY0MiksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTQ3NzY4MjQ1Mjc3Mjk3NiksRkwyRlhDT05TVF9EQkwoMC41NDg4ODg3MTE5ODUxNTI5KSxGTDJGWENPTlNUX0RCTCgwLjU1MDAwOTc1MDc5NzcwNTApLEZMMkZYQ09OU1RfREJMKDAuNTUxMTMxMzYxMTMxNjE5NCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTUyMjUzNTQyNDA1MDQ2NyksRkwyRlhDT05TVF9EQkwoMC41NTMzNzYyOTQwMzc2MTU4KSxGTDJGWENPTlNUX0RCTCgwLjU1NDQ5OTYxNTQ1MDQyODQpLEZMMkZYQ09OU1RfREJMKDAuNTU1NjIzNTA2MDY2MDUyOCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTU2NzQ3OTY1MzA4NTE4MyksRkwyRlhDT05TVF9EQkwoMC41NTc4NzI5OTI2MDMzMDg3KSxGTDJGWENPTlNUX0RCTCgwLjU1ODk5ODU4NzM3NzM1NjkpLEZMMkZYQ09OU1RfREJMKDAuNTYwMTI0NzQ5MDU5MDM4OSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTYxMjUxNDc3MDc4MTY4MyksRkwyRlhDT05TVF9EQkwoMC41NjIzNzg3NzA4NjU5ODk4KSxGTDJGWENPTlNUX0RCTCgwLjU2MzUwNjYyOTg1NTE3NDIpLEZMMkZYQ09OU1RfREJMKDAuNTY0NjM1MDUzNDc5ODEyNSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTY1NzY0MDQxMTc1NDA5NyksRkwyRlhDT05TVF9EQkwoMC41NjY4OTM1OTIzNzg4Nzk5KSxGTDJGWENPTlNUX0RCTCgwLjU2ODAyMzcwNjUyODU0MDQpLEZMMkZYQ09OU1RfREJMKDAuNTY5MTU0MzgzMDY0MTA1OSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTcwMjg1NjIxNDI2NjgzMiksRkwyRlhDT05TVF9EQkwoMC41NzE0MTc0MjEwNTg3NjU1KSxGTDJGWENPTlNUX0RCTCgwLjU3MjU0OTc4MTQwNDIyNzEpLEZMMkZYQ09OU1RfREJMKDAuNTczNjgyNzAxOTA4MzE3NyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTc0ODE2MTgyMDE3NjU3MyksRkwyRlhDT05TVF9EQkwoMC41NzU5NTAyMjExODAyMzA0KSxGTDJGWENPTlNUX0RCTCgwLjU3NzA4NDgxODg0NTM4MTApLEZMMkZYQ09OU1RfREJMKDAuNTc4MjE5OTc0NDYzODA2NyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTc5MzU1Njg3NDg3NTU0MiksRkwyRlhDT05TVF9EQkwoMC41ODA0OTE5NTczNzAwMTMxKSxGTDJGWENPTlNUX0RCTCgwLjU4MTYyODc4MzU2NTkxMTYpLEZMMkZYQ09OU1RfREJMKDAuNTgyNzY2MTY1NTMxMzEwNCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTgzOTA0MTAyNzIzNTk3OSksRkwyRlhDT05TVF9EQkwoMC41ODUwNDI1OTQ2MDE0ODUwKSxGTDJGWENPTlNUX0RCTCgwLjU4NjE4MTY0MDYyNTAwMDApLEZMMkZYQ09OU1RfREJMKDAuNTg3MzIxMjQwMjU1NDgzNCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTg4NDYxMzkyOTU1NTgyNiksRkwyRlhDT05TVF9EQkwoMC41ODk2MDIwOTgxODkyNDc0KSxGTDJGWENPTlNUX0RCTCgwLjU5MDc0MzM1NTQyMTcyNDIpLEZMMkZYQ09OU1RfREJMKDAuNTkxODg1MTY0MTE5NTUxNyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTkzMDI3NTIzNzUwNTU1NiksRkwyRlhDT05TVF9EQkwoMC41OTQxNzA0MzM3ODM4NDM0KSxGTDJGWENPTlNUX0RCTCgwLjU5NTMxMzg5MzY4OTc5OTkpLEZMMkZYQ09OU1RfREJMKDAuNTk2NDU3OTAyOTQwMDgxOSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNTk3NjAyNDYxMDA3NjEzOSksRkwyRlhDT05TVF9EQkwoMC41OTg3NDc1NjczNjY1ODI1KSxGTDJGWENPTlNUX0RCTCgwLjU5OTg5MzIyMTQ5MjQzMjEpLEZMMkZYQ09OU1RfREJMKDAuNjAxMDM5NDIyODYxODU5NyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjAyMTg2MTcwOTUyODEwNiksRkwyRlhDT05TVF9EQkwoMC42MDMzMzM0NjUyNDQ0NzMzKSxGTDJGWENPTlNUX0RCTCgwLjYwNDQ4MTMwNTIxNzI3NDgpLEZMMkZYQ09OU1RfREJMKDAuNjA1NjI5NjkwMzUyODc2MSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjA2Nzc4NjIwMTM0MTY3MSksRkwyRlhDT05TVF9EQkwoMC42MDc5MjgwOTQwNDUyNjI1KSxGTDJGWENPTlNUX0RCTCgwLjYwOTA3ODExMTU3MTQ5NjYpLEZMMkZYQ09OU1RfREJMKDAuNjEwMjI4NjcyMTk5NDE5MiksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjExMzc5Nzc1NDE2NzkwOCksRkwyRlhDT05TVF9EQkwoMC42MTI1MzE0MjA3MTI1Nzc3KSxGTDJGWENPTlNUX0RCTCgwLjYxMzY4MzYwNzU3Njk0ODIpLEZMMkZYQ09OU1RfREJMKDAuNjE0ODM2MzM1NTAxMjY3NCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjE1OTg5NjAzOTc4MDkyOSksRkwyRlhDT05TVF9EQkwoMC42MTcxNDM0MTI1MDExNzA4KSxGTDJGWENPTlNUX0RCTCgwLjYxODI5Nzc2MDU2NTQzMDUpLEZMMkZYQ09OU1RfREJMKDAuNjE5NDUyNjQ3NjY2OTgwOCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjIwNjA4MDczMzAzMTA1NCksRkwyRlhDT05TVF9EQkwoMC42MjE3NjQwMzY5NzIyNTg0KSxGTDJGWENPTlNUX0RCTCgwLjYyMjkyMDUzODE3NDA1OTgpLEZMMkZYQ09OU1RfREJMKDAuNjI0MDc3NTc2NDA5MjkxOSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjI1MjM1MTUxMTc5ODkzOSksRkwyRlhDT05TVF9EQkwoMC42MjYzOTMyNjE5ODg5NTg2KSxGTDJGWENPTlNUX0RCTCgwLjYyNzU1MTkwODM0MDcyNzUpLEZMMkZYQ09OU1RfREJMKDAuNjI4NzExMDg5NzQwNTg2OSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjI5ODcwODA1Njk1MDYzNSksRkwyRlhDT05TVF9EQkwoMC42MzEwMzEwNTU3MTE4MjAzKSxGTDJGWENPTlNUX0RCTCgwLjYzMjE5MTgzOTI5OTY1MjMpLEZMMkZYQ09OU1RfREJMKDAuNjMzMzUzMTU1OTY4NDgyMyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjM0NTE1MDA1MjI5MzU3MSksRkwyRlhDT05TVF9EQkwoMC42MzU2NzczODY1OTQ0NDMyKSxGTDJGWENPTlNUX0RCTCgwLjYzNjg0MDI5OTU3NzAyMjQpLEZMMkZYQ09OU1RfREJMKDAuNjM4MDAzNzQzNjkxNDg4MSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjM5MTY3NzE4NDUzMzQxMSksRkwyRlhDT05TVF9EQkwoMC42NDAzMzIyMjMzNzkxODU2KSxGTDJGWENPTlNUX0RCTCgwLjY0MTQ5NzI1Nzk4NjcyNTQpLEZMMkZYQ09OU1RfREJMKDAuNjQyNjYyODIxNzk0NzU5NCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjQzODI4OTE0MzIzMTc3OSksRkwyRlhDT05TVF9EQkwoMC42NDQ5OTU1MzUwOTI5NTg4KSxGTDJGWENPTlNUX0RCTCgwLjY0NjE2MjY4MzYyNjE2MzYpLEZMMkZYQ09OU1RfREJMKDAuNjQ3MzMwMzU5NDQ1OTMzMCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjQ4NDk4NTYyMDc2NDgzOSksRkwyRlhDT05TVF9EQkwoMC42NDk2NjcyOTEwNDMxMDQ3KSxGTDJGWENPTlNUX0RCTCgwLjY1MDgzNjU0NTg3MjE1MTgpLEZMMkZYQ09OU1RfREJMKDAuNjUyMDA2MzI2MDkxMDQ1OSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjUzMTc2NjMxMjI4MjY3OSksRkwyRlhDT05TVF9EQkwoMC42NTQzNDc0NjA4MTMzNTUyKSxGTDJGWENPTlNUX0RCTCgwLjY1NTUxODgxNDM3Njg5NzkpLEZMMkZYQ09OU1RfREJMKDAuNjU2NjkwNjkxNDUwNTM0OSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjU3ODYzMDkxNTY2OTUwOSksRkwyRlhDT05TVF9EQkwoMC42NTkwMzYwMTQyNTk4NzE1KSxGTDJGWENPTlNUX0RCTCgwLjY2MDIwOTQ1OTA2NDA2MDMpLEZMMkZYQ09OU1RfREJMKDAuNjYxMzgzNDI1NTE1MzE0OSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjYyNTU3OTEzMTUwNDYzNSksRkwyRlhDT05TVF9EQkwoMC42NjM3MzI5MjE1MDczNjEwKSxGTDJGWENPTlNUX0RCTCgwLjY2NDkwODQ1MDEyNDg4NTEpLEZMMkZYQ09OU1RfREJMKDAuNjY2MDg0NDk4NTQyOTMzNSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjY3MjYxMDY2MzAyNDE5NyksRkwyRlhDT05TVF9EQkwoMC42Njg0MzgxNTI5NDUyNjkxKSxGTDJGWENPTlNUX0RCTCgwLjY2OTYxNTc1ODAxNDQxNjMpLEZMMkZYQ09OU1RfREJMKDAuNjcwNzkzODgxMDUzODAxMSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjcxOTcyNTIxNjA4MzY0NiksRkwyRlhDT05TVF9EQkwoMC42NzMxNTE2NzkyMjQwNDY1KSxGTDJGWENPTlNUX0RCTCgwLjY3NDMzMTM1MzQ0Nzc4MDcpLEZMMkZYQ09OU1RfREJMKDAuNjc1NTExNTQzODI3NDkyNyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjc2NjkyMjQ5OTEyMDk1NSksRkwyRlhDT05TVF9EQkwoMC42Nzc4NzM0NzEyNTE0ODY1KSxGTDJGWENPTlNUX0RCTCgwLjY3OTA1NTIwNzM5NjU0MzUpLEZMMkZYQ09OU1RfREJMKDAuNjgwMjM3NDU3ODk5MTIyMyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjgxNDIwMjIyMzEyMDUyNCksRkwyRlhDT05TVF9EQkwoMC42ODI2MDM1MDAxODkxMzQwKSxGTDJGWENPTlNUX0RCTCgwLjY4Mzc4NzI5MTA4NTEzNDUpLEZMMkZYQ09OU1RfREJMKDAuNjg0OTcxNTk0NTU1Nzg1MyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjg2MTU2NDEwMTU3Nzc4NCksRkwyRlhDT05TVF9EQkwoMC42ODczNDE3Mzc0NDg3NjI5KSxGTDJGWENPTlNUX0RCTCgwLjY4ODUyNzU3NTk4NzM0MjApLEZMMkZYQ09OU1RfREJMKDAuNjg5NzEzOTI1MzMzMDY5NyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjkwOTAwNzg1MDQ2NDQ3MyksRkwyRlhDT05TVF9EQkwoMC42OTIwODgxNTQ2ODg5MTk4KSxGTDJGWENPTlNUX0RCTCgwLjY5MzI3NjAzMzgyMjg3MzcpLEZMMkZYQ09OU1RfREJMKDAuNjk0NDY0NDIyMDExNjMzMiksCi0gIEZMMkZYQ09OU1RfREJMKDAuNjk1NjUzMzE4ODE5NDU2NSksRkwyRlhDT05TVF9EQkwoMC42OTY4NDI3MjM4MTE1MzMyKSxGTDJGWENPTlNUX0RCTCgwLjY5ODAzMjYzNjU1Mzk4MTMpLEZMMkZYQ09OU1RfREJMKDAuNjk5MjIzMDU2NjEzODQzNSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzAwNDEzOTgzNTU5MDg0NSksRkwyRlhDT05TVF9EQkwoMC43MDE2MDU0MTY5NTg1ODY5KSxGTDJGWENPTlNUX0RCTCgwLjcwMjc5NzM1NjM4MjE0OTkpLEZMMkZYQ09OU1RfREJMKDAuNzAzOTg5ODAxNDAwNDg0MyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzA1MTgyNzUxNTg1MjEwNiksRkwyRlhDT05TVF9EQkwoMC43MDYzNzYyMDY1MDg4NTU0KSxGTDJGWENPTlNUX0RCTCgwLjcwNzU3MDE2NTc0NDg0ODMpLEZMMkZYQ09OU1RfREJMKDAuNzA4NzY0NjI4ODY3NTE5NiksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzA5OTU5NTk1NDUyMDk2MCksRkwyRlhDT05TVF9EQkwoMC43MTExNTUwNjUwNzQ2OTg4KSxGTDJGWENPTlNUX0RCTCgwLjcxMjM1MTAzNzMxMjM0MDIpLEZMMkZYQ09OU1RfREJMKDAuNzEzNTQ3NTExNzQyOTIwMiksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzE0NzQ0NDg3OTQ1MjI0NCksRkwyRlhDT05TVF9EQkwoMC43MTU5NDE5NjU0OTg5MjAwKSxGTDJGWENPTlNUX0RCTCgwLjcxNzEzOTk0Mzk4NDU1MzgpLEZMMkZYQ09OU1RfREJMKDAuNzE4MzM4NDIyOTgzNTQ4NiksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzE5NTM3NDAyMDc4MjAwNSksRkwyRlhDT05TVF9EQkwoMC43MjA3MzY4ODA4NTE2NzYyKSxGTDJGWENPTlNUX0RCTCgwLjcyMTkzNjg1ODg4ODAwOTcpLEZMMkZYQ09OU1RfREJMKDAuNzIzMTM3MzM1NzcyMDk5NyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzI0MzM4MzExMDg5NzA2NiksRkwyRlhDT05TVF9EQkwoMC43MjU1Mzk3ODQ0Mjc0NDk2KSxGTDJGWENPTlNUX0RCTCgwLjcyNjc0MTc1NTM3MjgwNDMpLEZMMkZYQ09OU1RfREJMKDAuNzI3OTQ0MjIzNTE0MDk5MiksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzI5MTQ3MTg4NDQwNTEzMCksRkwyRlhDT05TVF9EQkwoMC43MzAzNTA2NDk3NDIwNzI0KSxGTDJGWENPTlNUX0RCTCgwLjczMTU1NDYwNzAwOTY0ODcpLEZMMkZYQ09OU1RfREJMKDAuNzMyNzU5MDU5ODM0OTU1MyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzMzOTY0MDA3ODEwNTQ0NSksRkwyRlhDT05TVF9EQkwoMC43MzUxNjk0NTA1Mjk4MDU1KSxGTDJGWENPTlNUX0RCTCgwLjczNjM3NTM4NzU4Njk2MTApLEZMMkZYQ09OU1RfREJMKDAuNzM3NTgxODE4NTc3MDY0NyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzM4Nzg4NzQzMDk1OTk4NyksRkwyRlhDT05TVF9EQkwoMC43Mzk5OTYxNjA3NDA0NzA2KSxGTDJGWENPTlNUX0RCTCgwLjc0MTIwNDA3MTEwODAxMDgpLEZMMkZYQ09OU1RfREJMKDAuNzQyNDEyNDczNzk2OTcwMSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzQzNjIxMzY4NDA2NTE2NiksRkwyRlhDT05TVF9EQkwoMC43NDQ4MzA3NTQ1MzY2MzM0KSxGTDJGWENPTlNUX0RCTCgwLjc0NjA0MDYzMTc4ODExNTgpLEZMMkZYQ09OU1RfREJMKDAuNzQ3MjUwOTk5NzYyNTY4NiksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzQ4NDYxODU4MDYyNDAzNiksRkwyRlhDT05TVF9EQkwoMC43NDk2NzMyMDYyOTA4MzcyKSxGTDJGWENPTlNUX0RCTCgwLjc1MDg4NTA0NDA1MTg4NzIpLEZMMkZYQ09OU1RfREJMKDAuNzUyMDk3MzcwOTUwMzcwNCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzUzMzEwMTg2NTkxOTAwOSksRkwyRlhDT05TVF9EQkwoMC43NTQ1MjM0OTA1ODI4ODYyKSxGTDJGWENPTlNUX0RCTCgwLjc1NTczNzI4MjUzMDUyNTIpLEZMMkZYQ09OU1RfREJMKDAuNzU2OTUxNTYyMDQyODA2MiksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzU4MTY2MzI4NzI4NTAzNSksRkwyRlhDT05TVF9EQkwoMC43NTkzODE1ODIxOTcxNzU2KSxGTDJGWENPTlNUX0RCTCgwLjc2MDU5NzMyMjA1OTE2MTkpLEZMMkZYQ09OU1RfREJMKDAuNzYxODEzNTQ3OTI1NTgxMCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzYzMDMwMjU5NDA4MzI3NyksRkwyRlhDT05TVF9EQkwoMC43NjQyNDc0NTYxMjAwNzA4KSxGTDJGWENPTlNUX0RCTCgwLjc2NTQ2NTEzNzY3NDI1MDUpLEZMMkZYQ09OU1RfREJMKDAuNzY2NjgzMzAzNjg1MDc2MCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzY3OTAxOTUzNzY3NTIyNyksRkwyRlhDT05TVF9EQkwoMC43NjkxMjEwODc1MzczMzA3KSxGTDJGWENPTlNUX0RCTCgwLjc3MDM0MDcwNDYxMTAwMTEpLEZMMkZYQ09OU1RfREJMKDAuNzcxNTYwODA0NjA1Nzk0OCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzcyNzgxMzg3MTM5NzI5MyksRkwyRlhDT05TVF9EQkwoMC43NzQwMDI0NTE4MzE1NzY1KSxGTDJGWENPTlNUX0RCTCgwLjc3NTIyMzk5ODMwMDg2MDUpLEZMMkZYQ09OU1RfREJMKDAuNzc2NDQ2MDI2MTY3ODU1MSksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzc3NjY4NTM1MDUzNTgxNCksRkwyRlhDT05TVF9EQkwoMC43Nzg4OTE1MjQ1Nzk4MDU0KSxGTDJGWENPTlNUX0RCTCgwLjc4MDExNDk5NDM2OTAzNjApLEZMMkZYQ09OU1RfREJMKDAuNzgxMzM4OTQ0MDQ0NTIyMyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzgyNTYzMzczMjMwMjUxMyksRkwyRlhDT05TVF9EQkwoMC43ODM3ODgyODE1NTA5NDU4KSxGTDJGWENPTlNUX0RCTCgwLjc4NTAxMzY2ODYzMjA2MjEpLEZMMkZYQ09OU1RfREJMKDAuNzg2MjM5NTM0MDk5Nzg3NCksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzg3NDY1ODc3NTgxMDM3OCksRkwyRlhDT05TVF9EQkwoMC43ODg2OTI2OTg3MDM0NTU5KSxGTDJGWENPTlNUX0RCTCgwLjc4OTkxOTk5NzA5NTQwODgpLEZMMkZYQ09OU1RfREJMKDAuNzkxMTQ3NzcyMzg1OTg1MyksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzkyMzc2MDI0MjA0OTk0NCksRkwyRlhDT05TVF9EQkwoMC43OTM2MDQ3NTIxODI5NjIzKSxGTDJGWENPTlNUX0RCTCgwLjc5NDgzMzk1NTk1MTEzMDgpLEZMMkZYQ09OU1RfREJMKDAuNzk2MDYzNjM1MTQxNDU0NiksCi0gIEZMMkZYQ09OU1RfREJMKDAuNzk3MjkzNzg5Mzg2NTk5NSksRkwyRlhDT05TVF9EQkwoMC43OTg1MjQ0MTgzMTk5Mzk5KSxGTDJGWENPTlNUX0RCTCgwLjc5OTc1NTUyMTU3NTU1NzApLEZMMkZYQ09OU1RfREJMKDAuODAwOTg3MDk4Nzg4MjM1OSksCi0gIEZMMkZYQ09OU1RfREJMKDAuODAyMjE5MTQ5NTkzNDY0NCksRkwyRlhDT05TVF9EQkwoMC44MDM0NTE2NzM2Mjc0MzAxKSxGTDJGWENPTlNUX0RCTCgwLjgwNDY4NDY3MDUyNzAxODUpLEZMMkZYQ09OU1RfREJMKDAuODA1OTE4MTM5OTI5ODExMCksCi0gIEZMMkZYQ09OU1RfREJMKDAuODA3MTUyMDgxNDc0MDgyMiksRkwyRlhDT05TVF9EQkwoMC44MDgzODY0OTQ3OTg3OTg5KSxGTDJGWENPTlNUX0RCTCgwLjgwOTYyMTM3OTU0MzYxNjYpLEZMMkZYQ09OU1RfREJMKDAuODEwODU2NzM1MzQ4ODc4NCksCi0gIEZMMkZYQ09OU1RfREJMKDAuODEyMDkyNTYxODU1NjEyNyksRkwyRlhDT05TVF9EQkwoMC44MTMzMjg4NTg3MDU1MzA4KSxGTDJGWENPTlNUX0RCTCgwLjgxNDU2NTYyNTU0MTAyNTMpLEZMMkZYQ09OU1RfREJMKDAuODE1ODAyODYyMDA1MTY3NCksCi0gIEZMMkZYQ09OU1RfREJMKDAuODE3MDQwNTY3NzQxNzA1MyksRkwyRlhDT05TVF9EQkwoMC44MTgyNzg3NDIzOTUwNjIyKSxGTDJGWENPTlNUX0RCTCgwLjgxOTUxNzM4NTYxMDMzNDEpLEZMMkZYQ09OU1RfREJMKDAuODIwNzU2NDk3MDMzMjg3NSksCi0gIEZMMkZYQ09OU1RfREJMKDAuODIxOTk2MDc2MzEwMzU4MCksRkwyRlhDT05TVF9EQkwoMC44MjMyMzYxMjMwODg2NDc3KSxGTDJGWENPTlNUX0RCTCgwLjgyNDQ3NjYzNzAxNTkyMzQpLEZMMkZYQ09OU1RfREJMKDAuODI1NzE3NjE3NzQwNjE1MCksCi0gIEZMMkZYQ09OU1RfREJMKDAuODI2OTU5MDY0OTExODEyNSksRkwyRlhDT05TVF9EQkwoMC44MjgyMDA5NzgxNzkyNjUwKSxGTDJGWENPTlNUX0RCTCgwLjgyOTQ0MzM1NzE5MzM3ODQpLEZMMkZYQ09OU1RfREJMKDAuODMwNjg2MjAxNjA1MjEzMiksCi0gIEZMMkZYQ09OU1RfREJMKDAuODMxOTI5NTExMDY2NDgzMSksRkwyRlhDT05TVF9EQkwoMC44MzMxNzMyODUyMjk1NTIwKSxGTDJGWENPTlNUX0RCTCgwLjgzNDQxNzUyMzc0NzQzMzYpLEZMMkZYQ09OU1RfREJMKDAuODM1NjYyMjI2MjczNzg3OCksCi0gIEZMMkZYQ09OU1RfREJMKDAuODM2OTA3MzkyNDYyOTIwMiksRkwyRlhDT05TVF9EQkwoMC44MzgxNTMwMjE5Njk3NzkzKSxGTDJGWENPTlNUX0RCTCgwLjgzOTM5OTExNDQ0OTk1NDUpLEZMMkZYQ09OU1RfREJMKDAuODQwNjQ1NjY5NTU5Njc1MiksCi0gIEZMMkZYQ09OU1RfREJMKDAuODQxODkyNjg2OTU1ODA3OSksRkwyRlhDT05TVF9EQkwoMC44NDMxNDAxNjYyOTU4NTQ0KSxGTDJGWENPTlNUX0RCTCgwLjg0NDM4ODEwNzIzNzk1MDcpLEZMMkZYQ09OU1RfREJMKDAuODQ1NjM2NTA5NDQwODY0MiksCi0gIEZMMkZYQ09OU1RfREJMKDAuODQ2ODg1MzcyNTYzOTkyMyksRkwyRlhDT05TVF9EQkwoMC44NDgxMzQ2OTYyNjczNjA2KSxGTDJGWENPTlNUX0RCTCgwLjg0OTM4NDQ4MDIxMTYyMDgpLEZMMkZYQ09OU1RfREJMKDAuODUwNjM0NzI0MDU4MDQ5MiksCi0gIEZMMkZYQ09OU1RfREJMKDAuODUxODg1NDI3NDY4NTQ0MiksRkwyRlhDT05TVF9EQkwoMC44NTMxMzY1OTAxMDU2MjUzKSxGTDJGWENPTlNUX0RCTCgwLjg1NDM4ODIxMTYzMjQzMDcpLEZMMkZYQ09OU1RfREJMKDAuODU1NjQwMjkxNzEyNzE1NyksCi0gIEZMMkZYQ09OU1RfREJMKDAuODU2ODkyODMwMDEwODUxMiksRkwyRlhDT05TVF9EQkwoMC44NTgxNDU4MjYxOTE4MjA5KSxGTDJGWENPTlNUX0RCTCgwLjg1OTM5OTI3OTkyMTIyMDcpLEZMMkZYQ09OU1RfREJMKDAuODYwNjUzMTkwODY1MjU2MyksCi0gIEZMMkZYQ09OU1RfREJMKDAuODYxOTA3NTU4NjkwNzQxNCksRkwyRlhDT05TVF9EQkwoMC44NjMxNjIzODMwNjUwOTYyKSxGTDJGWENPTlNUX0RCTCgwLjg2NDQxNzY2MzY1NjM0NTIpLEZMMkZYQ09OU1RfREJMKDAuODY1NjczNDAwMTMzMTE2MSksCi0gIEZMMkZYQ09OU1RfREJMKDAuODY2OTI5NTkyMTY0NjM3NSksRkwyRlhDT05TVF9EQkwoMC44NjgxODYyMzk0MjA3MzcxKSxGTDJGWENPTlNUX0RCTCgwLjg2OTQ0MzM0MTU3MTg0MDcpLEZMMkZYQ09OU1RfREJMKDAuODcwNzAwODk4Mjg4OTY5NSksCi0gIEZMMkZYQ09OU1RfREJMKDAuODcxOTU4OTA5MjQzNzM5MSksRkwyRlhDT05TVF9EQkwoMC44NzMyMTczNzQxMDgzNTc0KSxGTDJGWENPTlNUX0RCTCgwLjg3NDQ3NjI5MjU1NTYyMzIpLEZMMkZYQ09OU1RfREJMKDAuODc1NzM1NjY0MjU4OTI0MSksCi0gIEZMMkZYQ09OU1RfREJMKDAuODc2OTk1NDg4ODkyMjM1MiksRkwyRlhDT05TVF9EQkwoMC44NzgyNTU3NjYxMzAxMTcxKSxGTDJGWENPTlNUX0RCTCgwLjg3OTUxNjQ5NTY0NzcxNDYpLEZMMkZYQ09OU1RfREJMKDAuODgwNzc3Njc3MTIwNzU0NSksCi0gIEZMMkZYQ09OU1RfREJMKDAuODgyMDM5MzEwMjI1NTQ0MyksRkwyRlhDT05TVF9EQkwoMC44ODMzMDEzOTQ2Mzg5NzA0KSxGTDJGWENPTlNUX0RCTCgwLjg4NDU2MzkzMDAzODQ5NjkpLEZMMkZYQ09OU1RfREJMKDAuODg1ODI2OTE2MTAyMTYyOSksCi0gIEZMMkZYQ09OU1RfREJMKDAuODg3MDkwMzUyNTA4NTgxOSksRkwyRlhDT05TVF9EQkwoMC44ODgzNTQyMzg5MzY5Mzk5KSxGTDJGWENPTlNUX0RCTCgwLjg4OTYxODU3NTA2Njk5MzMpLEZMMkZYQ09OU1RfREJMKDAuODkwODgzMzYwNTc5MDY3OCksCi0gIEZMMkZYQ09OU1RfREJMKDAuODkyMTQ4NTk1MTU0MDU2NSksRkwyRlhDT05TVF9EQkwoMC44OTM0MTQyNzg0NzM0MTg3KSxGTDJGWENPTlNUX0RCTCgwLjg5NDY4MDQxMDIxOTE3NzYpLEZMMkZYQ09OU1RfREJMKDAuODk1OTQ2OTkwMDczOTE5MSksCi0gIEZMMkZYQ09OU1RfREJMKDAuODk3MjE0MDE3NzIwNzkwNiksRkwyRlhDT05TVF9EQkwoMC44OTg0ODE0OTI4NDM0OTg1KSxGTDJGWENPTlNUX0RCTCgwLjg5OTc0OTQxNTEyNjMwNzcpLEZMMkZYQ09OU1RfREJMKDAuOTAxMDE3Nzg0MjU0MDM5MCksCi0gIEZMMkZYQ09OU1RfREJMKDAuOTAyMjg2NTk5OTEyMDY4MiksRkwyRlhDT05TVF9EQkwoMC45MDM1NTU4NjE3ODYzMjQyKSxGTDJGWENPTlNUX0RCTCgwLjkwNDgyNTU2OTU2MzI4NzgpLEZMMkZYQ09OU1RfREJMKDAuOTA2MDk1NzIyOTI5OTg5NSksCi0gIEZMMkZYQ09OU1RfREJMKDAuOTA3MzY2MzIxNTc0MDA5MiksRkwyRlhDT05TVF9EQkwoMC45MDg2MzczNjUxODM0NzI5KSxGTDJGWENPTlNUX0RCTCgwLjkwOTkwODg1MzQ0NzA1MjgpLEZMMkZYQ09OU1RfREJMKDAuOTExMTgwNzg2MDUzOTY0NyksCi0gIEZMMkZYQ09OU1RfREJMKDAuOTEyNDUzMTYyNjkzOTY3MiksRkwyRlhDT05TVF9EQkwoMC45MTM3MjU5ODMwNTczNTk0KSxGTDJGWENPTlNUX0RCTCgwLjkxNDk5OTI0NjgzNDk4MDUpLEZMMkZYQ09OU1RfREJMKDAuOTE2MjcyOTUzNzE4MjA3MSksCi0gIEZMMkZYQ09OU1RfREJMKDAuOTE3NTQ3MTAzMzk4OTUyNCksRkwyRlhDT05TVF9EQkwoMC45MTg4MjE2OTU1Njk2NjQ4KSxGTDJGWENPTlNUX0RCTCgwLjkyMDA5NjcyOTkyMzMyNTgpLEZMMkZYQ09OU1RfREJMKDAuOTIxMzcyMjA2MTUzNDQ5NCksCi0gIEZMMkZYQ09OU1RfREJMKDAuOTIyNjQ4MTIzOTU0MDc5NSksRkwyRlhDT05TVF9EQkwoMC45MjM5MjQ0ODMwMTk3ODk2KSxGTDJGWENPTlNUX0RCTCgwLjkyNTIwMTI4MzA0NTY4MDUpLEZMMkZYQ09OU1RfREJMKDAuOTI2NDc4NTIzNzI3Mzc5MyksCi0gIEZMMkZYQ09OU1RfREJMKDAuOTI3NzU2MjA0NzYxMDM3NiksRkwyRlhDT05TVF9EQkwoMC45MjkwMzQzMjU4NDMzMzA1KSxGTDJGWENPTlNUX0RCTCgwLjkzMDMxMjg4NjY3MTQ1NDcpLEZMMkZYQ09OU1RfREJMKDAuOTMxNTkxODg2OTQzMTI3NSksCi0gIEZMMkZYQ09OU1RfREJMKDAuOTMyODcxMzI2MzU2NTg0OCksRkwyRlhDT05TVF9EQkwoMC45MzQxNTEyMDQ2MTA1ODAyKSxGTDJGWENPTlNUX0RCTCgwLjkzNTQzMTUyMTQwNDM4MzYpLEZMMkZYQ09OU1RfREJMKDAuOTM2NzEyMjc2NDM3Nzc5MiksCi0gIEZMMkZYQ09OU1RfREJMKDAuOTM3OTkzNDY5NDExMDY0OCksRkwyRlhDT05TVF9EQkwoMC45MzkyNzUxMDAwMjUwNDk3KSxGTDJGWENPTlNUX0RCTCgwLjk0MDU1NzE2Nzk4MTA1NDIpLEZMMkZYQ09OU1RfREJMKDAuOTQxODM5NjcyOTgwOTA3MiksCi0gIEZMMkZYQ09OU1RfREJMKDAuOTQzMTIyNjE0NzI2OTQ1NiksRkwyRlhDT05TVF9EQkwoMC45NDQ0MDU5OTI5MjIwMTI0KSxGTDJGWENPTlNUX0RCTCgwLjk0NTY4OTgwNzI2OTQ1NTgpLEZMMkZYQ09OU1RfREJMKDAuOTQ2OTc0MDU3NDczMTI3NSksCi0gIEZMMkZYQ09OU1RfREJMKDAuOTQ4MjU4NzQzMjM3MzgxMCksRkwyRlhDT05TVF9EQkwoMC45NDk1NDM4NjQyNjcwNzEzKSxGTDJGWENPTlNUX0RCTCgwLjk1MDgyOTQyMDI2NzU1MjIpLEZMMkZYQ09OU1RfREJMKDAuOTUyMTE1NDEwOTQ0Njc2MyksCi0gIEZMMkZYQ09OU1RfREJMKDAuOTUzNDAxODM2MDA0NzkyNiksRkwyRlhDT05TVF9EQkwoMC45NTQ2ODg2OTUxNTQ3NDU1KSxGTDJGWENPTlNUX0RCTCgwLjk1NTk3NTk4ODEwMTg3MzgpLEZMMkZYQ09OU1RfREJMKDAuOTU3MjYzNzE0NTU0MDA4NyksCi0gIEZMMkZYQ09OU1RfREJMKDAuOTU4NTUxODc0MjE5NDczMiksRkwyRlhDT05TVF9EQkwoMC45NTk4NDA0NjY4MDcwODAyKSxGTDJGWENPTlNUX0RCTCgwLjk2MTEyOTQ5MjAyNjEzMTcpLEZMMkZYQ09OU1RfREJMKDAuOTYyNDE4OTQ5NTg2NDE2OCksCi0gIEZMMkZYQ09OU1RfREJMKDAuOTYzNzA4ODM5MTk4MjExMCksRkwyRlhDT05TVF9EQkwoMC45NjQ5OTkxNjA1NzIyNzUwKSxGTDJGWENPTlNUX0RCTCgwLjk2NjI4OTkxMzQxOTg1MjQpLEZMMkZYQ09OU1RfREJMKDAuOTY3NTgxMDk3NDUyNjY5NyksCi0gIEZMMkZYQ09OU1RfREJMKDAuOTY4ODcyNzEyMzgyOTM0MyksRkwyRlhDT05TVF9EQkwoMC45NzAxNjQ3NTc5MjMzMzMwKSxGTDJGWENPTlNUX0RCTCgwLjk3MTQ1NzIzMzc4NzAzMTYpLEZMMkZYQ09OU1RfREJMKDAuOTcyNzUwMTM5Njg3NjcyNyksCi0gIEZMMkZYQ09OU1RfREJMKDAuOTc0MDQzNDc1MzM5Mzc0OSksRkwyRlhDT05TVF9EQkwoMC45NzUzMzcyNDA0NTY3MzEzKSxGTDJGWENPTlNUX0RCTCgwLjk3NjYzMTQzNDc1NDgwODcpLEZMMkZYQ09OU1RfREJMKDAuOTc3OTI2MDU3OTQ5MTQ2MCksCi0gIEZMMkZYQ09OU1RfREJMKDAuOTc5MjIxMTA5NzU1NzUyNyksRkwyRlhDT05TVF9EQkwoMC45ODA1MTY1ODk4OTExMDgxKSxGTDJGWENPTlNUX0RCTCgwLjk4MTgxMjQ5ODA3MjE2MDApLEZMMkZYQ09OU1RfREJMKDAuOTgzMTA4ODM0MDE2MzIzMiksCi0gIEZMMkZYQ09OU1RfREJMKDAuOTg0NDA1NTk3NDQxNDc4NiksRkwyRlhDT05TVF9EQkwoMC45ODU3MDI3ODgwNjU5NzE2KSxGTDJGWENPTlNUX0RCTCgwLjk4NzAwMDQwNTYwODYxMTEpLEZMMkZYQ09OU1RfREJMKDAuOTg4Mjk4NDQ5Nzg4NjY4NCksCi0gIEZMMkZYQ09OU1RfREJMKDAuOTg5NTk2OTIwMzI1ODc1OSksRkwyRlhDT05TVF9EQkwoMC45OTA4OTU4MTY5NDA0MjU1KSxGTDJGWENPTlNUX0RCTCgwLjk5MjE5NTEzOTM1Mjk2ODApLEZMMkZYQ09OU1RfREJMKDAuOTkzNDk0ODg3Mjg0NjExNiksCi0gIEZMMkZYQ09OU1RfREJMKDAuOTk0Nzk1MDYwNDU2OTIwNiksRkwyRlhDT05TVF9EQkwoMC45OTYwOTU2NTg1OTE5MTQ0KSxGTDJGWENPTlNUX0RCTCgwLjk5NzM5NjY4MTQxMjA2NjUpLEZMMkZYQ09OU1RfREJMKDAuOTk4Njk4MTI4NjQwMzAyNSkKLX07Citjb25zdCBGSVhQX0RCTCBGREthYWNFbmNfbVRhYl80XzNFbGNbNTEyXSA9IHsKKyAgICBGTDJGWENPTlNUX0RCTCgwLjM5Njg1MDI2Mjk5MjA0OTkpLCBGTDJGWENPTlNUX0RCTCgwLjM5Nzg4NDA2MzQ4NjgzMzUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuMzk4OTE4NTM1OTM1NDcxMSksIEZMMkZYQ09OU1RfREJMKDAuMzk5OTUzNjc5NDY2MTQzMiksCisgICAgRkwyRlhDT05TVF9EQkwoMC40MDA5ODk0OTMyMDk4NTMxKSwgRkwyRlhDT05TVF9EQkwoMC40MDIwMjU5NzYzMDA0MTE1KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQwMzA2MzEyNzg3NDQyMjcpLCBGTDJGWENPTlNUX0RCTCgwLjQwNDEwMDk0NzA3MTI2OTUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDA1MTM5NDMzMDMzMDk5NiksIEZMMkZYQ09OU1RfREJMKDAuNDA2MTc4NTg0OTA0ODExMCksCisgICAgRkwyRlhDT05TVF9EQkwoMC40MDcyMTg0MDE4MzQwMzgwKSwgRkwyRlhDT05TVF9EQkwoMC40MDgyNTg4ODI5NzExMzcyKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQwOTMwMDAyNzQ2OTE3MzkpLCBGTDJGWENPTlNUX0RCTCgwLjQxMDM0MTgzNDQ4MzkwNzgpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDExMzg0MzAzMTczNzc5OCksIEZMMkZYQ09OU1RfREJMKDAuNDEyNDI3NDMyNjk5ODk4MCksCisgICAgRkwyRlhDT05TVF9EQkwoMC40MTM0NzEyMjIyMjYwMjQ1KSwgRkwyRlhDT05TVF9EQkwoMC40MTQ1MTU2NzA5MTg1NjIwKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQxNTU2MDc3Nzk0NjU0MDApLCBGTDJGWENPTlNUX0RCTCgwLjQxNjYwNjU0MjQ4MTYwMjIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDE3NjUyOTYzNjk3OTkzMiksIEZMMkZYQ09OU1RfREJMKDAuNDE4NzAwMDQwNzcyNTQ1MiksCisgICAgRkwyRlhDT05TVF9EQkwoMC40MTk3NDc3NzI4ODQ2NjUyKSwgRkwyRlhDT05TVF9EQkwoMC40MjA3OTYxNTkyMTYzMjIyKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQyMTg0NTE5ODk1MjAzNDUpLCBGTDJGWENPTlNUX0RCTCgwLjQyMjg5NDg5MTI3ODg1NjcpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDIzOTQ1MjM1Mzg2MzY3MyksIEZMMkZYQ09OU1RfREJMKDAuNDI0OTk2MjMwNDY2NjU2NCksCisgICAgRkwyRlhDT05TVF9EQkwoMC40MjYwNDc4NzU3MTQzMTMwKSwgRkwyRlhDT05TVF9EQkwoMC40MjcxMDAxNzAzMjY0MTI0KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQyODE1MzExMzUwMjUwNDYpLCBGTDJGWENPTlNUX0RCTCgwLjQyOTIwNjcwNDQ0NDYwMTcpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDMwMjYwOTQyMzU3MTY1OCksIEZMMkZYQ09OU1RfREJMKDAuNDMxMzE1ODI2NDQ3MDk3MCksCisgICAgRkwyRlhDT05TVF9EQkwoMC40MzIzNzEzNTU5MjM3MjE2KSwgRkwyRlhDT05TVF9EQkwoMC40MzM0Mjc1Mjk5OTg3ODAzKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQzNDQ4NDM0Nzg4NjQxNjEpLCBGTDJGWENPTlNUX0RCTCgwLjQzNTU0MTgwODgwMzE2MzApLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDM2NTk5OTExOTY3OTMzOSksIEZMMkZYQ09OU1RfREJMKDAuNDM3NjU4NjU2NjAyMDA5NiksCisgICAgRkwyRlhDT05TVF9EQkwoMC40Mzg3MTgwNDE5MjkwMjcyKSwgRkwyRlhDT05TVF9EQkwoMC40Mzk3NzgwNjcxNzQ5NjgzKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ0MDgzODczMTU2ODE0ODApLCBGTDJGWENPTlNUX0RCTCgwLjQ0MTkwMDAzNDMzOTIwMzkpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDQyOTYxOTc0NzIxMDg0NyksIEZMMkZYQ09OU1RfREJMKDAuNDQ0MDI0NTUxOTQ5MDM4OCksCisgICAgRkwyRlhDT05TVF9EQkwoMC40NDUwODc3NjUyNjA2MDM4KSwgRkwyRlhDT05TVF9EQkwoMC40NDYxNTE2MTM4OTU1OTUzKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ0NzIxNjA5NzA5NjA5NjMpLCBGTDJGWENPTlNUX0RCTCgwLjQ0ODI4MTIxNDEwNjQ0NTgpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDQ5MzQ2OTY0MTczMjI4NiksIEZMMkZYQ09OU1RfREJMKDAuNDUwNDEzMzQ2NTQ1MjY0OCksCisgICAgRkwyRlhDT05TVF9EQkwoMC40NTE0ODAzNjA0NzM1OTg0KSwgRkwyRlhDT05TVF9EQkwoMC40NTI1NDgwMDUyMTE0ODc1KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ1MzYxNjI4MDAxNDM5MzkpLCBGTDJGWENPTlNUX0RCTCgwLjQ1NDY4NTE4NDEzOTk3MTkpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDU1NzU0NzE2ODQ4MDU5MSksIEZMMkZYQ09OU1RfREJMKDAuNDU2ODI0ODc3NDAwNjY1MiksCisgICAgRkwyRlhDT05TVF9EQkwoMC40NTc4OTU2NjUwNjE5NjIzKSwgRkwyRlhDT05TVF9EQkwoMC40NTg5NjcwNzkwOTgyNzQ2KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ2MDAzOTExODc3ODA2ODgpLCBGTDJGWENPTlNUX0RCTCgwLjQ2MTExMTc4MzM3MTk0MzApLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDYyMTg1MDcyMTUyNjE4NCksIEZMMkZYQ09OU1RfREJMKDAuNDYzMjU4OTg0Mzk0OTI3OCksCisgICAgRkwyRlhDT05TVF9EQkwoMC40NjQzMzM1MTkzNzU4MDY5KSwgRkwyRlhDT05TVF9EQkwoMC40NjU0MDg2NzYzNzQyODQyKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ2NjQ4NDQ1NDY3MTQ3MTMpLCBGTDJGWENPTlNUX0RCTCgwLjQ2NzU2MDg1MzU1MDU1MzIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDY4NjM3ODcyMjk2Nzc5MCksIEZMMkZYQ09OU1RfREJMKDAuNDY5NzE1NTEwMTk3NDUyMiksCisgICAgRkwyRlhDT05TVF9EQkwoMC40NzA3OTM3NjY1NDE5MjE2KSwgRkwyRlhDT05TVF9EQkwoMC40NzE4NzI2NDA2MjE1NzEzKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ3Mjk1MjEzMTcyOTgxMTgpLCBGTDJGWENPTlNUX0RCTCgwLjQ3NDAzMjIzOTE2MjA3MTEpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDc1MTEyOTYyMjE1Nzg0NSksIEZMMkZYQ09OU1RfREJMKDAuNDc2MTk0MzAwMTkwMzg2NyksCisgICAgRkwyRlhDT05TVF9EQkwoMC40NzcyNzYyNTIzODczMDE1KSwgRkwyRlhDT05TVF9EQkwoMC40NzgzNTg4MTgxMDk5MzM4KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ3OTQ0MTk5NjY2MzY1OTkpLCBGTDJGWENPTlNUX0RCTCgwLjQ4MDUyNTc4NzM1NTgxOTApLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDgxNjEwMTg5NDk1NzA0MiksIEZMMkZYQ09OU1RfREJMKDAuNDgyNjk1MjAyMzk0NTUzNyksCisgICAgRkwyRlhDT05TVF9EQkwoMC40ODM3ODA4MjUzNjU1NDIxKSwgRkwyRlhDT05TVF9EQkwoMC40ODQ4NjcwNTc3MjM3NzE0KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ4NTk1Mzg5ODc4NjI2MzIpLCBGTDJGWENPTlNUX0RCTCgwLjQ4NzA0MTM0Nzg3MTk0ODgpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDg4MTI5NDA0MzAxNjYyMSksIEZMMkZYQ09OU1RfREJMKDAuNDg5MjE4MDY3Mzk4MTI5OCksCisgICAgRkwyRlhDT05TVF9EQkwoMC40OTAzMDczMzY0ODU5NjQwKSwgRkwyRlhDT05TVF9EQkwoMC40OTEzOTcyMTA4OTE2NTMzKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ5MjQ4NzY4OTk0MzU1NDUpLCBGTDJGWENPTlNUX0RCTCgwLjQ5MzU3ODc3Mjk3MTg4NDQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDk0NjcwNDU5MzA4NzExNiksIEZMMkZYQ09OU1RfREJMKDAuNDk1NzYyNzQ4Mjg3OTQ4NCksCisgICAgRkwyRlhDT05TVF9EQkwoMC40OTY4NTU2MzkyNDUzNDIzKSwgRkwyRlhDT05TVF9EQkwoMC40OTc5NDkxMzE1MTg0Njg0KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQ5OTA0MzIyNDQ0NjcyMTEpLCBGTDJGWENPTlNUX0RCTCgwLjUwMDEzNzkxNzM3MTMwNjIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTAxMjMzMjA5NjM1MjMyOCksIEZMMkZYQ09OU1RfREJMKDAuNTAyMzI5MTAwNTgzMzA1NiksCisgICAgRkwyRlhDT05TVF9EQkwoMC41MDM0MjU1ODk1NjIxMTcxKSwgRkwyRlhDT05TVF9EQkwoMC41MDQ1MjI2NzU5MjAwMzk5KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjUwNTYyMDM1OTAwNzIxODEpLCBGTDJGWENPTlNUX0RCTCgwLjUwNjcxODYzODE3NTU2MTEpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTA3ODE3NTEyNzc4NzM0NiksIEZMMkZYQ09OU1RfREJMKDAuNTA4OTE2OTgyMTcyMTUzNiksCisgICAgRkwyRlhDT05TVF9EQkwoMC41MTAwMTcwNDU3MTI5NzQ5KSwgRkwyRlhDT05TVF9EQkwoMC41MTExMTc3MDI3NjAwODkzKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjUxMjIxODk1MjY3NDExNDMpLCBGTDJGWENPTlNUX0RCTCgwLjUxMzMyMDc5NDgxNzM4NjgpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTE0NDIzMjI4NTUzOTU1MiksIEZMMkZYQ09OU1RfREJMKDAuNTE1NTI2MjUzMjQ5NTcyNiksCisgICAgRkwyRlhDT05TVF9EQkwoMC41MTY2Mjk4NjgyNzE2ODk0KSwgRkwyRlhDT05TVF9EQkwoMC41MTc3MzQwNzI5ODk0NDYwKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjUxODgzODg2Njc3MzY2NTIpLCBGTDJGWENPTlNUX0RCTCgwLjUxOTk0NDI0ODk5Njg0NTcpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTIxMDUwMjE5MDMzMTU0NCksIEZMMkZYQ09OU1RfREJMKDAuNTIyMTU2Nzc2MjU4NDE5OCksCisgICAgRkwyRlhDT05TVF9EQkwoMC41MjMyNjM5MjAwNTAxMjQ3KSwgRkwyRlhDT05TVF9EQkwoMC41MjQzNzE2NDk3ODczOTg5KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjUyNTQ3OTk2NDg1MTAxMzApLCBGTDJGWENPTlNUX0RCTCgwLjUyNjU4ODg2NDYyMzM3MDUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTI3Njk4MzQ4NDg4NTAyMSksIEZMMkZYQ09OU1RfREJMKDAuNTI4ODA4NDE1ODMyMDU3NCksCisgICAgRkwyRlhDT05TVF9EQkwoMC41Mjk5MTkwNjYwNDEyOTk1KSwgRkwyRlhDT05TVF9EQkwoMC41MzEwMzAyOTg1MDUwOTc1KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjUzMjE0MjExMjYxMzkxOTgpLCBGTDJGWENPTlNUX0RCTCgwLjUzMzI1NDUwNzc1OTgyNzQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTM0MzY3NDgzMzM2NDY3OCksIEZMMkZYQ09OU1RfREJMKDAuNTM1NDgxMDM4NzM5MDY3NSksCisgICAgRkwyRlhDT05TVF9EQkwoMC41MzY1OTUxNzMzNjQ0MjYyKSwgRkwyRlhDT05TVF9EQkwoMC41Mzc3MDk4ODY2MTA5MDk3KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjUzODgyNTE3Nzg3ODQ0MzgpLCBGTDJGWENPTlNUX0RCTCgwLjUzOTk0MTA0NjU2ODUwNzUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTQxMDU3NDkyMDg0MTI3MiksIEZMMkZYQ09OU1RfREJMKDAuNTQyMTc0NTEzODI5ODY5NSksCisgICAgRkwyRlhDT05TVF9EQkwoMC41NDMyOTIxMTEyMTE4MzUzKSwgRkwyRlhDT05TVF9EQkwoMC41NDQ0MTAyODM2Mzc2NTM0KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU0NTUyOTAzMDUxNjQ3NDQpLCBGTDJGWENPTlNUX0RCTCgwLjU0NjY0ODM1MTI1ODk2NDIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTQ3NzY4MjQ1Mjc3Mjk3NiksIEZMMkZYQ09OU1RfREJMKDAuNTQ4ODg4NzExOTg1MTUyOSksCisgICAgRkwyRlhDT05TVF9EQkwoMC41NTAwMDk3NTA3OTc3MDUwKSwgRkwyRlhDT05TVF9EQkwoMC41NTExMzEzNjExMzE2MTk0KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU1MjI1MzU0MjQwNTA0NjcpLCBGTDJGWENPTlNUX0RCTCgwLjU1MzM3NjI5NDAzNzYxNTgpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTU0NDk5NjE1NDUwNDI4NCksIEZMMkZYQ09OU1RfREJMKDAuNTU1NjIzNTA2MDY2MDUyOCksCisgICAgRkwyRlhDT05TVF9EQkwoMC41NTY3NDc5NjUzMDg1MTgzKSwgRkwyRlhDT05TVF9EQkwoMC41NTc4NzI5OTI2MDMzMDg3KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU1ODk5ODU4NzM3NzM1NjkpLCBGTDJGWENPTlNUX0RCTCgwLjU2MDEyNDc0OTA1OTAzODkpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTYxMjUxNDc3MDc4MTY4MyksIEZMMkZYQ09OU1RfREJMKDAuNTYyMzc4NzcwODY1OTg5OCksCisgICAgRkwyRlhDT05TVF9EQkwoMC41NjM1MDY2Mjk4NTUxNzQyKSwgRkwyRlhDT05TVF9EQkwoMC41NjQ2MzUwNTM0Nzk4MTI1KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU2NTc2NDA0MTE3NTQwOTcpLCBGTDJGWENPTlNUX0RCTCgwLjU2Njg5MzU5MjM3ODg3OTkpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTY4MDIzNzA2NTI4NTQwNCksIEZMMkZYQ09OU1RfREJMKDAuNTY5MTU0MzgzMDY0MTA1OSksCisgICAgRkwyRlhDT05TVF9EQkwoMC41NzAyODU2MjE0MjY2ODMyKSwgRkwyRlhDT05TVF9EQkwoMC41NzE0MTc0MjEwNTg3NjU1KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU3MjU0OTc4MTQwNDIyNzEpLCBGTDJGWENPTlNUX0RCTCgwLjU3MzY4MjcwMTkwODMxNzcpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTc0ODE2MTgyMDE3NjU3MyksIEZMMkZYQ09OU1RfREJMKDAuNTc1OTUwMjIxMTgwMjMwNCksCisgICAgRkwyRlhDT05TVF9EQkwoMC41NzcwODQ4MTg4NDUzODEwKSwgRkwyRlhDT05TVF9EQkwoMC41NzgyMTk5NzQ0NjM4MDY3KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU3OTM1NTY4NzQ4NzU1NDIpLCBGTDJGWENPTlNUX0RCTCgwLjU4MDQ5MTk1NzM3MDAxMzEpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTgxNjI4NzgzNTY1OTExNiksIEZMMkZYQ09OU1RfREJMKDAuNTgyNzY2MTY1NTMxMzEwNCksCisgICAgRkwyRlhDT05TVF9EQkwoMC41ODM5MDQxMDI3MjM1OTc5KSwgRkwyRlhDT05TVF9EQkwoMC41ODUwNDI1OTQ2MDE0ODUwKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU4NjE4MTY0MDYyNTAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjU4NzMyMTI0MDI1NTQ4MzQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTg4NDYxMzkyOTU1NTgyNiksIEZMMkZYQ09OU1RfREJMKDAuNTg5NjAyMDk4MTg5MjQ3NCksCisgICAgRkwyRlhDT05TVF9EQkwoMC41OTA3NDMzNTU0MjE3MjQyKSwgRkwyRlhDT05TVF9EQkwoMC41OTE4ODUxNjQxMTk1NTE3KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU5MzAyNzUyMzc1MDU1NTYpLCBGTDJGWENPTlNUX0RCTCgwLjU5NDE3MDQzMzc4Mzg0MzQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTk1MzEzODkzNjg5Nzk5OSksIEZMMkZYQ09OU1RfREJMKDAuNTk2NDU3OTAyOTQwMDgxOSksCisgICAgRkwyRlhDT05TVF9EQkwoMC41OTc2MDI0NjEwMDc2MTM5KSwgRkwyRlhDT05TVF9EQkwoMC41OTg3NDc1NjczNjY1ODI1KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU5OTg5MzIyMTQ5MjQzMjEpLCBGTDJGWENPTlNUX0RCTCgwLjYwMTAzOTQyMjg2MTg1OTcpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjAyMTg2MTcwOTUyODEwNiksIEZMMkZYQ09OU1RfREJMKDAuNjAzMzMzNDY1MjQ0NDczMyksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MDQ0ODEzMDUyMTcyNzQ4KSwgRkwyRlhDT05TVF9EQkwoMC42MDU2Mjk2OTAzNTI4NzYxKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYwNjc3ODYyMDEzNDE2NzEpLCBGTDJGWENPTlNUX0RCTCgwLjYwNzkyODA5NDA0NTI2MjUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjA5MDc4MTExNTcxNDk2NiksIEZMMkZYQ09OU1RfREJMKDAuNjEwMjI4NjcyMTk5NDE5MiksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MTEzNzk3NzU0MTY3OTA4KSwgRkwyRlhDT05TVF9EQkwoMC42MTI1MzE0MjA3MTI1Nzc3KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYxMzY4MzYwNzU3Njk0ODIpLCBGTDJGWENPTlNUX0RCTCgwLjYxNDgzNjMzNTUwMTI2NzQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjE1OTg5NjAzOTc4MDkyOSksIEZMMkZYQ09OU1RfREJMKDAuNjE3MTQzNDEyNTAxMTcwOCksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MTgyOTc3NjA1NjU0MzA1KSwgRkwyRlhDT05TVF9EQkwoMC42MTk0NTI2NDc2NjY5ODA4KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYyMDYwODA3MzMwMzEwNTQpLCBGTDJGWENPTlNUX0RCTCgwLjYyMTc2NDAzNjk3MjI1ODQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjIyOTIwNTM4MTc0MDU5OCksIEZMMkZYQ09OU1RfREJMKDAuNjI0MDc3NTc2NDA5MjkxOSksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MjUyMzUxNTExNzk4OTM5KSwgRkwyRlhDT05TVF9EQkwoMC42MjYzOTMyNjE5ODg5NTg2KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYyNzU1MTkwODM0MDcyNzUpLCBGTDJGWENPTlNUX0RCTCgwLjYyODcxMTA4OTc0MDU4NjkpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjI5ODcwODA1Njk1MDYzNSksIEZMMkZYQ09OU1RfREJMKDAuNjMxMDMxMDU1NzExODIwMyksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MzIxOTE4MzkyOTk2NTIzKSwgRkwyRlhDT05TVF9EQkwoMC42MzMzNTMxNTU5Njg0ODIzKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYzNDUxNTAwNTIyOTM1NzEpLCBGTDJGWENPTlNUX0RCTCgwLjYzNTY3NzM4NjU5NDQ0MzIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjM2ODQwMjk5NTc3MDIyNCksIEZMMkZYQ09OU1RfREJMKDAuNjM4MDAzNzQzNjkxNDg4MSksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MzkxNjc3MTg0NTMzNDExKSwgRkwyRlhDT05TVF9EQkwoMC42NDAzMzIyMjMzNzkxODU2KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY0MTQ5NzI1Nzk4NjcyNTQpLCBGTDJGWENPTlNUX0RCTCgwLjY0MjY2MjgyMTc5NDc1OTQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjQzODI4OTE0MzIzMTc3OSksIEZMMkZYQ09OU1RfREJMKDAuNjQ0OTk1NTM1MDkyOTU4OCksCisgICAgRkwyRlhDT05TVF9EQkwoMC42NDYxNjI2ODM2MjYxNjM2KSwgRkwyRlhDT05TVF9EQkwoMC42NDczMzAzNTk0NDU5MzMwKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY0ODQ5ODU2MjA3NjQ4MzkpLCBGTDJGWENPTlNUX0RCTCgwLjY0OTY2NzI5MTA0MzEwNDcpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjUwODM2NTQ1ODcyMTUxOCksIEZMMkZYQ09OU1RfREJMKDAuNjUyMDA2MzI2MDkxMDQ1OSksCisgICAgRkwyRlhDT05TVF9EQkwoMC42NTMxNzY2MzEyMjgyNjc5KSwgRkwyRlhDT05TVF9EQkwoMC42NTQzNDc0NjA4MTMzNTUyKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY1NTUxODgxNDM3Njg5NzkpLCBGTDJGWENPTlNUX0RCTCgwLjY1NjY5MDY5MTQ1MDUzNDkpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjU3ODYzMDkxNTY2OTUwOSksIEZMMkZYQ09OU1RfREJMKDAuNjU5MDM2MDE0MjU5ODcxNSksCisgICAgRkwyRlhDT05TVF9EQkwoMC42NjAyMDk0NTkwNjQwNjAzKSwgRkwyRlhDT05TVF9EQkwoMC42NjEzODM0MjU1MTUzMTQ5KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY2MjU1NzkxMzE1MDQ2MzUpLCBGTDJGWENPTlNUX0RCTCgwLjY2MzczMjkyMTUwNzM2MTApLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjY0OTA4NDUwMTI0ODg1MSksIEZMMkZYQ09OU1RfREJMKDAuNjY2MDg0NDk4NTQyOTMzNSksCisgICAgRkwyRlhDT05TVF9EQkwoMC42NjcyNjEwNjYzMDI0MTk3KSwgRkwyRlhDT05TVF9EQkwoMC42Njg0MzgxNTI5NDUyNjkxKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY2OTYxNTc1ODAxNDQxNjMpLCBGTDJGWENPTlNUX0RCTCgwLjY3MDc5Mzg4MTA1MzgwMTEpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjcxOTcyNTIxNjA4MzY0NiksIEZMMkZYQ09OU1RfREJMKDAuNjczMTUxNjc5MjI0MDQ2NSksCisgICAgRkwyRlhDT05TVF9EQkwoMC42NzQzMzEzNTM0NDc3ODA3KSwgRkwyRlhDT05TVF9EQkwoMC42NzU1MTE1NDM4Mjc0OTI3KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY3NjY5MjI0OTkxMjA5NTUpLCBGTDJGWENPTlNUX0RCTCgwLjY3Nzg3MzQ3MTI1MTQ4NjUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjc5MDU1MjA3Mzk2NTQzNSksIEZMMkZYQ09OU1RfREJMKDAuNjgwMjM3NDU3ODk5MTIyMyksCisgICAgRkwyRlhDT05TVF9EQkwoMC42ODE0MjAyMjIzMTIwNTI0KSwgRkwyRlhDT05TVF9EQkwoMC42ODI2MDM1MDAxODkxMzQwKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY4Mzc4NzI5MTA4NTEzNDUpLCBGTDJGWENPTlNUX0RCTCgwLjY4NDk3MTU5NDU1NTc4NTMpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjg2MTU2NDEwMTU3Nzc4NCksIEZMMkZYQ09OU1RfREJMKDAuNjg3MzQxNzM3NDQ4NzYyOSksCisgICAgRkwyRlhDT05TVF9EQkwoMC42ODg1Mjc1NzU5ODczNDIwKSwgRkwyRlhDT05TVF9EQkwoMC42ODk3MTM5MjUzMzMwNjk3KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY5MDkwMDc4NTA0NjQ0NzMpLCBGTDJGWENPTlNUX0RCTCgwLjY5MjA4ODE1NDY4ODkxOTgpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjkzMjc2MDMzODIyODczNyksIEZMMkZYQ09OU1RfREJMKDAuNjk0NDY0NDIyMDExNjMzMiksCisgICAgRkwyRlhDT05TVF9EQkwoMC42OTU2NTMzMTg4MTk0NTY1KSwgRkwyRlhDT05TVF9EQkwoMC42OTY4NDI3MjM4MTE1MzMyKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjY5ODAzMjYzNjU1Mzk4MTMpLCBGTDJGWENPTlNUX0RCTCgwLjY5OTIyMzA1NjYxMzg0MzUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzAwNDEzOTgzNTU5MDg0NSksIEZMMkZYQ09OU1RfREJMKDAuNzAxNjA1NDE2OTU4NTg2OSksCisgICAgRkwyRlhDT05TVF9EQkwoMC43MDI3OTczNTYzODIxNDk5KSwgRkwyRlhDT05TVF9EQkwoMC43MDM5ODk4MDE0MDA0ODQzKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjcwNTE4Mjc1MTU4NTIxMDYpLCBGTDJGWENPTlNUX0RCTCgwLjcwNjM3NjIwNjUwODg1NTQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzA3NTcwMTY1NzQ0ODQ4MyksIEZMMkZYQ09OU1RfREJMKDAuNzA4NzY0NjI4ODY3NTE5NiksCisgICAgRkwyRlhDT05TVF9EQkwoMC43MDk5NTk1OTU0NTIwOTYwKSwgRkwyRlhDT05TVF9EQkwoMC43MTExNTUwNjUwNzQ2OTg4KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjcxMjM1MTAzNzMxMjM0MDIpLCBGTDJGWENPTlNUX0RCTCgwLjcxMzU0NzUxMTc0MjkyMDIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzE0NzQ0NDg3OTQ1MjI0NCksIEZMMkZYQ09OU1RfREJMKDAuNzE1OTQxOTY1NDk4OTIwMCksCisgICAgRkwyRlhDT05TVF9EQkwoMC43MTcxMzk5NDM5ODQ1NTM4KSwgRkwyRlhDT05TVF9EQkwoMC43MTgzMzg0MjI5ODM1NDg2KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjcxOTUzNzQwMjA3ODIwMDUpLCBGTDJGWENPTlNUX0RCTCgwLjcyMDczNjg4MDg1MTY3NjIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzIxOTM2ODU4ODg4MDA5NyksIEZMMkZYQ09OU1RfREJMKDAuNzIzMTM3MzM1NzcyMDk5NyksCisgICAgRkwyRlhDT05TVF9EQkwoMC43MjQzMzgzMTEwODk3MDY2KSwgRkwyRlhDT05TVF9EQkwoMC43MjU1Mzk3ODQ0Mjc0NDk2KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjcyNjc0MTc1NTM3MjgwNDMpLCBGTDJGWENPTlNUX0RCTCgwLjcyNzk0NDIyMzUxNDA5OTIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzI5MTQ3MTg4NDQwNTEzMCksIEZMMkZYQ09OU1RfREJMKDAuNzMwMzUwNjQ5NzQyMDcyNCksCisgICAgRkwyRlhDT05TVF9EQkwoMC43MzE1NTQ2MDcwMDk2NDg3KSwgRkwyRlhDT05TVF9EQkwoMC43MzI3NTkwNTk4MzQ5NTUzKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjczMzk2NDAwNzgxMDU0NDUpLCBGTDJGWENPTlNUX0RCTCgwLjczNTE2OTQ1MDUyOTgwNTUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzM2Mzc1Mzg3NTg2OTYxMCksIEZMMkZYQ09OU1RfREJMKDAuNzM3NTgxODE4NTc3MDY0NyksCisgICAgRkwyRlhDT05TVF9EQkwoMC43Mzg3ODg3NDMwOTU5OTg3KSwgRkwyRlhDT05TVF9EQkwoMC43Mzk5OTYxNjA3NDA0NzA2KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc0MTIwNDA3MTEwODAxMDgpLCBGTDJGWENPTlNUX0RCTCgwLjc0MjQxMjQ3Mzc5Njk3MDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzQzNjIxMzY4NDA2NTE2NiksIEZMMkZYQ09OU1RfREJMKDAuNzQ0ODMwNzU0NTM2NjMzNCksCisgICAgRkwyRlhDT05TVF9EQkwoMC43NDYwNDA2MzE3ODgxMTU4KSwgRkwyRlhDT05TVF9EQkwoMC43NDcyNTA5OTk3NjI1Njg2KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc0ODQ2MTg1ODA2MjQwMzYpLCBGTDJGWENPTlNUX0RCTCgwLjc0OTY3MzIwNjI5MDgzNzIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzUwODg1MDQ0MDUxODg3MiksIEZMMkZYQ09OU1RfREJMKDAuNzUyMDk3MzcwOTUwMzcwNCksCisgICAgRkwyRlhDT05TVF9EQkwoMC43NTMzMTAxODY1OTE5MDA5KSwgRkwyRlhDT05TVF9EQkwoMC43NTQ1MjM0OTA1ODI4ODYyKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc1NTczNzI4MjUzMDUyNTIpLCBGTDJGWENPTlNUX0RCTCgwLjc1Njk1MTU2MjA0MjgwNjIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzU4MTY2MzI4NzI4NTAzNSksIEZMMkZYQ09OU1RfREJMKDAuNzU5MzgxNTgyMTk3MTc1NiksCisgICAgRkwyRlhDT05TVF9EQkwoMC43NjA1OTczMjIwNTkxNjE5KSwgRkwyRlhDT05TVF9EQkwoMC43NjE4MTM1NDc5MjU1ODEwKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc2MzAzMDI1OTQwODMyNzcpLCBGTDJGWENPTlNUX0RCTCgwLjc2NDI0NzQ1NjEyMDA3MDgpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzY1NDY1MTM3Njc0MjUwNSksIEZMMkZYQ09OU1RfREJMKDAuNzY2NjgzMzAzNjg1MDc2MCksCisgICAgRkwyRlhDT05TVF9EQkwoMC43Njc5MDE5NTM3Njc1MjI3KSwgRkwyRlhDT05TVF9EQkwoMC43NjkxMjEwODc1MzczMzA3KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc3MDM0MDcwNDYxMTAwMTEpLCBGTDJGWENPTlNUX0RCTCgwLjc3MTU2MDgwNDYwNTc5NDgpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzcyNzgxMzg3MTM5NzI5MyksIEZMMkZYQ09OU1RfREJMKDAuNzc0MDAyNDUxODMxNTc2NSksCisgICAgRkwyRlhDT05TVF9EQkwoMC43NzUyMjM5OTgzMDA4NjA1KSwgRkwyRlhDT05TVF9EQkwoMC43NzY0NDYwMjYxNjc4NTUxKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc3NzY2ODUzNTA1MzU4MTQpLCBGTDJGWENPTlNUX0RCTCgwLjc3ODg5MTUyNDU3OTgwNTQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzgwMTE0OTk0MzY5MDM2MCksIEZMMkZYQ09OU1RfREJMKDAuNzgxMzM4OTQ0MDQ0NTIyMyksCisgICAgRkwyRlhDT05TVF9EQkwoMC43ODI1NjMzNzMyMzAyNTEzKSwgRkwyRlhDT05TVF9EQkwoMC43ODM3ODgyODE1NTA5NDU4KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc4NTAxMzY2ODYzMjA2MjEpLCBGTDJGWENPTlNUX0RCTCgwLjc4NjIzOTUzNDA5OTc4NzQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzg3NDY1ODc3NTgxMDM3OCksIEZMMkZYQ09OU1RfREJMKDAuNzg4NjkyNjk4NzAzNDU1OSksCisgICAgRkwyRlhDT05TVF9EQkwoMC43ODk5MTk5OTcwOTU0MDg4KSwgRkwyRlhDT05TVF9EQkwoMC43OTExNDc3NzIzODU5ODUzKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc5MjM3NjAyNDIwNDk5NDQpLCBGTDJGWENPTlNUX0RCTCgwLjc5MzYwNDc1MjE4Mjk2MjMpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzk0ODMzOTU1OTUxMTMwOCksIEZMMkZYQ09OU1RfREJMKDAuNzk2MDYzNjM1MTQxNDU0NiksCisgICAgRkwyRlhDT05TVF9EQkwoMC43OTcyOTM3ODkzODY1OTk1KSwgRkwyRlhDT05TVF9EQkwoMC43OTg1MjQ0MTgzMTk5Mzk5KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc5OTc1NTUyMTU3NTU1NzApLCBGTDJGWENPTlNUX0RCTCgwLjgwMDk4NzA5ODc4ODIzNTkpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODAyMjE5MTQ5NTkzNDY0NCksIEZMMkZYQ09OU1RfREJMKDAuODAzNDUxNjczNjI3NDMwMSksCisgICAgRkwyRlhDT05TVF9EQkwoMC44MDQ2ODQ2NzA1MjcwMTg1KSwgRkwyRlhDT05TVF9EQkwoMC44MDU5MTgxMzk5Mjk4MTEwKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjgwNzE1MjA4MTQ3NDA4MjIpLCBGTDJGWENPTlNUX0RCTCgwLjgwODM4NjQ5NDc5ODc5ODkpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODA5NjIxMzc5NTQzNjE2NiksIEZMMkZYQ09OU1RfREJMKDAuODEwODU2NzM1MzQ4ODc4NCksCisgICAgRkwyRlhDT05TVF9EQkwoMC44MTIwOTI1NjE4NTU2MTI3KSwgRkwyRlhDT05TVF9EQkwoMC44MTMzMjg4NTg3MDU1MzA4KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjgxNDU2NTYyNTU0MTAyNTMpLCBGTDJGWENPTlNUX0RCTCgwLjgxNTgwMjg2MjAwNTE2NzQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODE3MDQwNTY3NzQxNzA1MyksIEZMMkZYQ09OU1RfREJMKDAuODE4Mjc4NzQyMzk1MDYyMiksCisgICAgRkwyRlhDT05TVF9EQkwoMC44MTk1MTczODU2MTAzMzQxKSwgRkwyRlhDT05TVF9EQkwoMC44MjA3NTY0OTcwMzMyODc1KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjgyMTk5NjA3NjMxMDM1ODApLCBGTDJGWENPTlNUX0RCTCgwLjgyMzIzNjEyMzA4ODY0NzcpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODI0NDc2NjM3MDE1OTIzNCksIEZMMkZYQ09OU1RfREJMKDAuODI1NzE3NjE3NzQwNjE1MCksCisgICAgRkwyRlhDT05TVF9EQkwoMC44MjY5NTkwNjQ5MTE4MTI1KSwgRkwyRlhDT05TVF9EQkwoMC44MjgyMDA5NzgxNzkyNjUwKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjgyOTQ0MzM1NzE5MzM3ODQpLCBGTDJGWENPTlNUX0RCTCgwLjgzMDY4NjIwMTYwNTIxMzIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODMxOTI5NTExMDY2NDgzMSksIEZMMkZYQ09OU1RfREJMKDAuODMzMTczMjg1MjI5NTUyMCksCisgICAgRkwyRlhDT05TVF9EQkwoMC44MzQ0MTc1MjM3NDc0MzM2KSwgRkwyRlhDT05TVF9EQkwoMC44MzU2NjIyMjYyNzM3ODc4KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjgzNjkwNzM5MjQ2MjkyMDIpLCBGTDJGWENPTlNUX0RCTCgwLjgzODE1MzAyMTk2OTc3OTMpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODM5Mzk5MTE0NDQ5OTU0NSksIEZMMkZYQ09OU1RfREJMKDAuODQwNjQ1NjY5NTU5Njc1MiksCisgICAgRkwyRlhDT05TVF9EQkwoMC44NDE4OTI2ODY5NTU4MDc5KSwgRkwyRlhDT05TVF9EQkwoMC44NDMxNDAxNjYyOTU4NTQ0KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg0NDM4ODEwNzIzNzk1MDcpLCBGTDJGWENPTlNUX0RCTCgwLjg0NTYzNjUwOTQ0MDg2NDIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODQ2ODg1MzcyNTYzOTkyMyksIEZMMkZYQ09OU1RfREJMKDAuODQ4MTM0Njk2MjY3MzYwNiksCisgICAgRkwyRlhDT05TVF9EQkwoMC44NDkzODQ0ODAyMTE2MjA4KSwgRkwyRlhDT05TVF9EQkwoMC44NTA2MzQ3MjQwNTgwNDkyKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg1MTg4NTQyNzQ2ODU0NDIpLCBGTDJGWENPTlNUX0RCTCgwLjg1MzEzNjU5MDEwNTYyNTMpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODU0Mzg4MjExNjMyNDMwNyksIEZMMkZYQ09OU1RfREJMKDAuODU1NjQwMjkxNzEyNzE1NyksCisgICAgRkwyRlhDT05TVF9EQkwoMC44NTY4OTI4MzAwMTA4NTEyKSwgRkwyRlhDT05TVF9EQkwoMC44NTgxNDU4MjYxOTE4MjA5KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg1OTM5OTI3OTkyMTIyMDcpLCBGTDJGWENPTlNUX0RCTCgwLjg2MDY1MzE5MDg2NTI1NjMpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODYxOTA3NTU4NjkwNzQxNCksIEZMMkZYQ09OU1RfREJMKDAuODYzMTYyMzgzMDY1MDk2MiksCisgICAgRkwyRlhDT05TVF9EQkwoMC44NjQ0MTc2NjM2NTYzNDUyKSwgRkwyRlhDT05TVF9EQkwoMC44NjU2NzM0MDAxMzMxMTYxKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg2NjkyOTU5MjE2NDYzNzUpLCBGTDJGWENPTlNUX0RCTCgwLjg2ODE4NjIzOTQyMDczNzEpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODY5NDQzMzQxNTcxODQwNyksIEZMMkZYQ09OU1RfREJMKDAuODcwNzAwODk4Mjg4OTY5NSksCisgICAgRkwyRlhDT05TVF9EQkwoMC44NzE5NTg5MDkyNDM3MzkxKSwgRkwyRlhDT05TVF9EQkwoMC44NzMyMTczNzQxMDgzNTc0KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg3NDQ3NjI5MjU1NTYyMzIpLCBGTDJGWENPTlNUX0RCTCgwLjg3NTczNTY2NDI1ODkyNDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODc2OTk1NDg4ODkyMjM1MiksIEZMMkZYQ09OU1RfREJMKDAuODc4MjU1NzY2MTMwMTE3MSksCisgICAgRkwyRlhDT05TVF9EQkwoMC44Nzk1MTY0OTU2NDc3MTQ2KSwgRkwyRlhDT05TVF9EQkwoMC44ODA3Nzc2NzcxMjA3NTQ1KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg4MjAzOTMxMDIyNTU0NDMpLCBGTDJGWENPTlNUX0RCTCgwLjg4MzMwMTM5NDYzODk3MDQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODg0NTYzOTMwMDM4NDk2OSksIEZMMkZYQ09OU1RfREJMKDAuODg1ODI2OTE2MTAyMTYyOSksCisgICAgRkwyRlhDT05TVF9EQkwoMC44ODcwOTAzNTI1MDg1ODE5KSwgRkwyRlhDT05TVF9EQkwoMC44ODgzNTQyMzg5MzY5Mzk5KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg4OTYxODU3NTA2Njk5MzMpLCBGTDJGWENPTlNUX0RCTCgwLjg5MDg4MzM2MDU3OTA2NzgpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODkyMTQ4NTk1MTU0MDU2NSksIEZMMkZYQ09OU1RfREJMKDAuODkzNDE0Mjc4NDczNDE4NyksCisgICAgRkwyRlhDT05TVF9EQkwoMC44OTQ2ODA0MTAyMTkxNzc2KSwgRkwyRlhDT05TVF9EQkwoMC44OTU5NDY5OTAwNzM5MTkxKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg5NzIxNDAxNzcyMDc5MDYpLCBGTDJGWENPTlNUX0RCTCgwLjg5ODQ4MTQ5Mjg0MzQ5ODUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODk5NzQ5NDE1MTI2MzA3NyksIEZMMkZYQ09OU1RfREJMKDAuOTAxMDE3Nzg0MjU0MDM5MCksCisgICAgRkwyRlhDT05TVF9EQkwoMC45MDIyODY1OTk5MTIwNjgyKSwgRkwyRlhDT05TVF9EQkwoMC45MDM1NTU4NjE3ODYzMjQyKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjkwNDgyNTU2OTU2MzI4NzgpLCBGTDJGWENPTlNUX0RCTCgwLjkwNjA5NTcyMjkyOTk4OTUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTA3MzY2MzIxNTc0MDA5MiksIEZMMkZYQ09OU1RfREJMKDAuOTA4NjM3MzY1MTgzNDcyOSksCisgICAgRkwyRlhDT05TVF9EQkwoMC45MDk5MDg4NTM0NDcwNTI4KSwgRkwyRlhDT05TVF9EQkwoMC45MTExODA3ODYwNTM5NjQ3KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjkxMjQ1MzE2MjY5Mzk2NzIpLCBGTDJGWENPTlNUX0RCTCgwLjkxMzcyNTk4MzA1NzM1OTQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTE0OTk5MjQ2ODM0OTgwNSksIEZMMkZYQ09OU1RfREJMKDAuOTE2MjcyOTUzNzE4MjA3MSksCisgICAgRkwyRlhDT05TVF9EQkwoMC45MTc1NDcxMDMzOTg5NTI0KSwgRkwyRlhDT05TVF9EQkwoMC45MTg4MjE2OTU1Njk2NjQ4KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjkyMDA5NjcyOTkyMzMyNTgpLCBGTDJGWENPTlNUX0RCTCgwLjkyMTM3MjIwNjE1MzQ0OTQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTIyNjQ4MTIzOTU0MDc5NSksIEZMMkZYQ09OU1RfREJMKDAuOTIzOTI0NDgzMDE5Nzg5NiksCisgICAgRkwyRlhDT05TVF9EQkwoMC45MjUyMDEyODMwNDU2ODA1KSwgRkwyRlhDT05TVF9EQkwoMC45MjY0Nzg1MjM3MjczNzkzKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjkyNzc1NjIwNDc2MTAzNzYpLCBGTDJGWENPTlNUX0RCTCgwLjkyOTAzNDMyNTg0MzMzMDUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTMwMzEyODg2NjcxNDU0NyksIEZMMkZYQ09OU1RfREJMKDAuOTMxNTkxODg2OTQzMTI3NSksCisgICAgRkwyRlhDT05TVF9EQkwoMC45MzI4NzEzMjYzNTY1ODQ4KSwgRkwyRlhDT05TVF9EQkwoMC45MzQxNTEyMDQ2MTA1ODAyKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjkzNTQzMTUyMTQwNDM4MzYpLCBGTDJGWENPTlNUX0RCTCgwLjkzNjcxMjI3NjQzNzc3OTIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTM3OTkzNDY5NDExMDY0OCksIEZMMkZYQ09OU1RfREJMKDAuOTM5Mjc1MTAwMDI1MDQ5NyksCisgICAgRkwyRlhDT05TVF9EQkwoMC45NDA1NTcxNjc5ODEwNTQyKSwgRkwyRlhDT05TVF9EQkwoMC45NDE4Mzk2NzI5ODA5MDcyKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjk0MzEyMjYxNDcyNjk0NTYpLCBGTDJGWENPTlNUX0RCTCgwLjk0NDQwNTk5MjkyMjAxMjQpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTQ1Njg5ODA3MjY5NDU1OCksIEZMMkZYQ09OU1RfREJMKDAuOTQ2OTc0MDU3NDczMTI3NSksCisgICAgRkwyRlhDT05TVF9EQkwoMC45NDgyNTg3NDMyMzczODEwKSwgRkwyRlhDT05TVF9EQkwoMC45NDk1NDM4NjQyNjcwNzEzKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjk1MDgyOTQyMDI2NzU1MjIpLCBGTDJGWENPTlNUX0RCTCgwLjk1MjExNTQxMDk0NDY3NjMpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTUzNDAxODM2MDA0NzkyNiksIEZMMkZYQ09OU1RfREJMKDAuOTU0Njg4Njk1MTU0NzQ1NSksCisgICAgRkwyRlhDT05TVF9EQkwoMC45NTU5NzU5ODgxMDE4NzM4KSwgRkwyRlhDT05TVF9EQkwoMC45NTcyNjM3MTQ1NTQwMDg3KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjk1ODU1MTg3NDIxOTQ3MzIpLCBGTDJGWENPTlNUX0RCTCgwLjk1OTg0MDQ2NjgwNzA4MDIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTYxMTI5NDkyMDI2MTMxNyksIEZMMkZYQ09OU1RfREJMKDAuOTYyNDE4OTQ5NTg2NDE2OCksCisgICAgRkwyRlhDT05TVF9EQkwoMC45NjM3MDg4MzkxOTgyMTEwKSwgRkwyRlhDT05TVF9EQkwoMC45NjQ5OTkxNjA1NzIyNzUwKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjk2NjI4OTkxMzQxOTg1MjQpLCBGTDJGWENPTlNUX0RCTCgwLjk2NzU4MTA5NzQ1MjY2OTcpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTY4ODcyNzEyMzgyOTM0MyksIEZMMkZYQ09OU1RfREJMKDAuOTcwMTY0NzU3OTIzMzMzMCksCisgICAgRkwyRlhDT05TVF9EQkwoMC45NzE0NTcyMzM3ODcwMzE2KSwgRkwyRlhDT05TVF9EQkwoMC45NzI3NTAxMzk2ODc2NzI3KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjk3NDA0MzQ3NTMzOTM3NDkpLCBGTDJGWENPTlNUX0RCTCgwLjk3NTMzNzI0MDQ1NjczMTMpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTc2NjMxNDM0NzU0ODA4NyksIEZMMkZYQ09OU1RfREJMKDAuOTc3OTI2MDU3OTQ5MTQ2MCksCisgICAgRkwyRlhDT05TVF9EQkwoMC45NzkyMjExMDk3NTU3NTI3KSwgRkwyRlhDT05TVF9EQkwoMC45ODA1MTY1ODk4OTExMDgxKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjk4MTgxMjQ5ODA3MjE2MDApLCBGTDJGWENPTlNUX0RCTCgwLjk4MzEwODgzNDAxNjMyMzIpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTg0NDA1NTk3NDQxNDc4NiksIEZMMkZYQ09OU1RfREJMKDAuOTg1NzAyNzg4MDY1OTcxNiksCisgICAgRkwyRlhDT05TVF9EQkwoMC45ODcwMDA0MDU2MDg2MTExKSwgRkwyRlhDT05TVF9EQkwoMC45ODgyOTg0NDk3ODg2Njg0KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjk4OTU5NjkyMDMyNTg3NTkpLCBGTDJGWENPTlNUX0RCTCgwLjk5MDg5NTgxNjk0MDQyNTUpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTkyMTk1MTM5MzUyOTY4MCksIEZMMkZYQ09OU1RfREJMKDAuOTkzNDk0ODg3Mjg0NjExNiksCisgICAgRkwyRlhDT05TVF9EQkwoMC45OTQ3OTUwNjA0NTY5MjA2KSwgRkwyRlhDT05TVF9EQkwoMC45OTYwOTU2NTg1OTE5MTQ0KSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjk5NzM5NjY4MTQxMjA2NjUpLCBGTDJGWENPTlNUX0RCTCgwLjk5ODY5ODEyODY0MDMwMjUpfTsKIAotY29uc3QgRklYUF9EQkwgRkRLYWFjRW5jX3NwZWNFeHBNYW50VGFibGVDb21iRWxjWzRdWzE0XSA9Ci17Ci0gIHtGTDJGWENPTlNUX0RCTCgwLjUwMDAwMDAwMDAwMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjYyOTk2MDUyNDk0NzQzNjYpLCBGTDJGWENPTlNUX0RCTCgwLjc5MzcwMDUyNTk4NDA5OTgpLCBGTDJGWENPTlNUX0RCTCgwLjUwMDAwMDAwMDAwMDAwMDApLAotICAgRkwyRlhDT05TVF9EQkwoMC42Mjk5NjA1MjQ5NDc0MzY2KSwgRkwyRlhDT05TVF9EQkwoMC43OTM3MDA1MjU5ODQwOTk4KSwgRkwyRlhDT05TVF9EQkwoMC41MDAwMDAwMDAwMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC42Mjk5NjA1MjQ5NDc0MzY2KSwKLSAgIEZMMkZYQ09OU1RfREJMKDAuNzkzNzAwNTI1OTg0MDk5OCksIEZMMkZYQ09OU1RfREJMKDAuNTAwMDAwMDAwMDAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuNjI5OTYwNTI0OTQ3NDM2NiksIEZMMkZYQ09OU1RfREJMKDAuNzkzNzAwNTI1OTg0MDk5OCksCi0gICBGTDJGWENPTlNUX0RCTCgwLjUwMDAwMDAwMDAwMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjYyOTk2MDUyNDk0NzQzNjYpfSwKK2NvbnN0IEZJWFBfREJMIEZES2FhY0VuY19zcGVjRXhwTWFudFRhYmxlQ29tYkVsY1s0XVsxNF0gPSB7CisgICAge0ZMMkZYQ09OU1RfREJMKDAuNTAwMDAwMDAwMDAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuNjI5OTYwNTI0OTQ3NDM2NiksCisgICAgIEZMMkZYQ09OU1RfREJMKDAuNzkzNzAwNTI1OTg0MDk5OCksIEZMMkZYQ09OU1RfREJMKDAuNTAwMDAwMDAwMDAwMDAwMCksCisgICAgIEZMMkZYQ09OU1RfREJMKDAuNjI5OTYwNTI0OTQ3NDM2NiksIEZMMkZYQ09OU1RfREJMKDAuNzkzNzAwNTI1OTg0MDk5OCksCisgICAgIEZMMkZYQ09OU1RfREJMKDAuNTAwMDAwMDAwMDAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuNjI5OTYwNTI0OTQ3NDM2NiksCisgICAgIEZMMkZYQ09OU1RfREJMKDAuNzkzNzAwNTI1OTg0MDk5OCksIEZMMkZYQ09OU1RfREJMKDAuNTAwMDAwMDAwMDAwMDAwMCksCisgICAgIEZMMkZYQ09OU1RfREJMKDAuNjI5OTYwNTI0OTQ3NDM2NiksIEZMMkZYQ09OU1RfREJMKDAuNzkzNzAwNTI1OTg0MDk5OCksCisgICAgIEZMMkZYQ09OU1RfREJMKDAuNTAwMDAwMDAwMDAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuNjI5OTYwNTI0OTQ3NDM2Nil9LAogCi0gIHtGTDJGWENPTlNUX0RCTCgwLjU5NDYwMzU1NzUwMTM2MDUpLCBGTDJGWENPTlNUX0RCTCgwLjc0OTE1MzUzODQzODM0MDgpLCBGTDJGWENPTlNUX0RCTCgwLjk0Mzg3NDMxMjY4MTY5MzUpLCBGTDJGWENPTlNUX0RCTCgwLjU5NDYwMzU1NzUwMTM2MDUpLAotICAgRkwyRlhDT05TVF9EQkwoMC43NDkxNTM1Mzg0MzgzNDA4KSwgRkwyRlhDT05TVF9EQkwoMC45NDM4NzQzMTI2ODE2OTM1KSwgRkwyRlhDT05TVF9EQkwoMC41OTQ2MDM1NTc1MDEzNjA1KSwgRkwyRlhDT05TVF9EQkwoMC43NDkxNTM1Mzg0MzgzNDA4KSwKLSAgIEZMMkZYQ09OU1RfREJMKDAuOTQzODc0MzEyNjgxNjkzNSksIEZMMkZYQ09OU1RfREJMKDAuNTk0NjAzNTU3NTAxMzYwNSksIEZMMkZYQ09OU1RfREJMKDAuNzQ5MTUzNTM4NDM4MzQwOCksIEZMMkZYQ09OU1RfREJMKDAuOTQzODc0MzEyNjgxNjkzNSksCi0gICBGTDJGWENPTlNUX0RCTCgwLjU5NDYwMzU1NzUwMTM2MDUpLCBGTDJGWENPTlNUX0RCTCgwLjc0OTE1MzUzODQzODM0MDgpfSwKKyAgICB7RkwyRlhDT05TVF9EQkwoMC41OTQ2MDM1NTc1MDEzNjA1KSwgRkwyRlhDT05TVF9EQkwoMC43NDkxNTM1Mzg0MzgzNDA4KSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC45NDM4NzQzMTI2ODE2OTM1KSwgRkwyRlhDT05TVF9EQkwoMC41OTQ2MDM1NTc1MDEzNjA1KSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC43NDkxNTM1Mzg0MzgzNDA4KSwgRkwyRlhDT05TVF9EQkwoMC45NDM4NzQzMTI2ODE2OTM1KSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC41OTQ2MDM1NTc1MDEzNjA1KSwgRkwyRlhDT05TVF9EQkwoMC43NDkxNTM1Mzg0MzgzNDA4KSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC45NDM4NzQzMTI2ODE2OTM1KSwgRkwyRlhDT05TVF9EQkwoMC41OTQ2MDM1NTc1MDEzNjA1KSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC43NDkxNTM1Mzg0MzgzNDA4KSwgRkwyRlhDT05TVF9EQkwoMC45NDM4NzQzMTI2ODE2OTM1KSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC41OTQ2MDM1NTc1MDEzNjA1KSwgRkwyRlhDT05TVF9EQkwoMC43NDkxNTM1Mzg0MzgzNDA4KX0sCiAKLSAge0ZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTQ3NiksIEZMMkZYQ09OU1RfREJMKDAuODkwODk4NzE4MTQwMzM5MyksIEZMMkZYQ09OU1RfREJMKDAuNTYxMjMxMDI0MTU0Njg2NSksIEZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTQ3NiksCi0gICBGTDJGWENPTlNUX0RCTCgwLjg5MDg5ODcxODE0MDMzOTMpLCBGTDJGWENPTlNUX0RCTCgwLjU2MTIzMTAyNDE1NDY4NjUpLCBGTDJGWENPTlNUX0RCTCgwLjcwNzEwNjc4MTE4NjU0NzYpLCBGTDJGWENPTlNUX0RCTCgwLjg5MDg5ODcxODE0MDMzOTMpLAotICAgRkwyRlhDT05TVF9EQkwoMC41NjEyMzEwMjQxNTQ2ODY1KSwgRkwyRlhDT05TVF9EQkwoMC43MDcxMDY3ODExODY1NDc2KSwgRkwyRlhDT05TVF9EQkwoMC44OTA4OTg3MTgxNDAzMzkzKSwgRkwyRlhDT05TVF9EQkwoMC41NjEyMzEwMjQxNTQ2ODY1KSwKLSAgIEZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTQ3NiksIEZMMkZYQ09OU1RfREJMKDAuODkwODk4NzE4MTQwMzM5Myl9LAorICAgIHtGTDJGWENPTlNUX0RCTCgwLjcwNzEwNjc4MTE4NjU0NzYpLCBGTDJGWENPTlNUX0RCTCgwLjg5MDg5ODcxODE0MDMzOTMpLAorICAgICBGTDJGWENPTlNUX0RCTCgwLjU2MTIzMTAyNDE1NDY4NjUpLCBGTDJGWENPTlNUX0RCTCgwLjcwNzEwNjc4MTE4NjU0NzYpLAorICAgICBGTDJGWENPTlNUX0RCTCgwLjg5MDg5ODcxODE0MDMzOTMpLCBGTDJGWENPTlNUX0RCTCgwLjU2MTIzMTAyNDE1NDY4NjUpLAorICAgICBGTDJGWENPTlNUX0RCTCgwLjcwNzEwNjc4MTE4NjU0NzYpLCBGTDJGWENPTlNUX0RCTCgwLjg5MDg5ODcxODE0MDMzOTMpLAorICAgICBGTDJGWENPTlNUX0RCTCgwLjU2MTIzMTAyNDE1NDY4NjUpLCBGTDJGWENPTlNUX0RCTCgwLjcwNzEwNjc4MTE4NjU0NzYpLAorICAgICBGTDJGWENPTlNUX0RCTCgwLjg5MDg5ODcxODE0MDMzOTMpLCBGTDJGWENPTlNUX0RCTCgwLjU2MTIzMTAyNDE1NDY4NjUpLAorICAgICBGTDJGWENPTlNUX0RCTCgwLjcwNzEwNjc4MTE4NjU0NzYpLCBGTDJGWENPTlNUX0RCTCgwLjg5MDg5ODcxODE0MDMzOTMpfSwKIAotICB7RkwyRlhDT05TVF9EQkwoMC44NDA4OTY0MTUyNTM3MTQ1KSwgRkwyRlhDT05TVF9EQkwoMC41Mjk3MzE1NDcxNzk2NDc3KSwgRkwyRlhDT05TVF9EQkwoMC42Njc0MTk5MjcwODUwMTcyKSwgRkwyRlhDT05TVF9EQkwoMC44NDA4OTY0MTUyNTM3MTQ1KSwKLSAgIEZMMkZYQ09OU1RfREJMKDAuNTI5NzMxNTQ3MTc5NjQ3NyksIEZMMkZYQ09OU1RfREJMKDAuNjY3NDE5OTI3MDg1MDE3MiksIEZMMkZYQ09OU1RfREJMKDAuODQwODk2NDE1MjUzNzE0NSksIEZMMkZYQ09OU1RfREJMKDAuNTI5NzMxNTQ3MTc5NjQ3NyksCi0gICBGTDJGWENPTlNUX0RCTCgwLjY2NzQxOTkyNzA4NTAxNzIpLCBGTDJGWENPTlNUX0RCTCgwLjg0MDg5NjQxNTI1MzcxNDUpLCBGTDJGWENPTlNUX0RCTCgwLjUyOTczMTU0NzE3OTY0NzcpLCBGTDJGWENPTlNUX0RCTCgwLjY2NzQxOTkyNzA4NTAxNzIpLAotICAgRkwyRlhDT05TVF9EQkwoMC44NDA4OTY0MTUyNTM3MTQ1KSwgRkwyRlhDT05TVF9EQkwoMC41Mjk3MzE1NDcxNzk2NDc3KX0KLX07CisgICAge0ZMMkZYQ09OU1RfREJMKDAuODQwODk2NDE1MjUzNzE0NSksIEZMMkZYQ09OU1RfREJMKDAuNTI5NzMxNTQ3MTc5NjQ3NyksCisgICAgIEZMMkZYQ09OU1RfREJMKDAuNjY3NDE5OTI3MDg1MDE3MiksIEZMMkZYQ09OU1RfREJMKDAuODQwODk2NDE1MjUzNzE0NSksCisgICAgIEZMMkZYQ09OU1RfREJMKDAuNTI5NzMxNTQ3MTc5NjQ3NyksIEZMMkZYQ09OU1RfREJMKDAuNjY3NDE5OTI3MDg1MDE3MiksCisgICAgIEZMMkZYQ09OU1RfREJMKDAuODQwODk2NDE1MjUzNzE0NSksIEZMMkZYQ09OU1RfREJMKDAuNTI5NzMxNTQ3MTc5NjQ3NyksCisgICAgIEZMMkZYQ09OU1RfREJMKDAuNjY3NDE5OTI3MDg1MDE3MiksIEZMMkZYQ09OU1RfREJMKDAuODQwODk2NDE1MjUzNzE0NSksCisgICAgIEZMMkZYQ09OU1RfREJMKDAuNTI5NzMxNTQ3MTc5NjQ3NyksIEZMMkZYQ09OU1RfREJMKDAuNjY3NDE5OTI3MDg1MDE3MiksCisgICAgIEZMMkZYQ09OU1RfREJMKDAuODQwODk2NDE1MjUzNzE0NSksIEZMMkZYQ09OU1RfREJMKDAuNTI5NzMxNTQ3MTc5NjQ3Nyl9fTsKIAotY29uc3QgVUNIQVIgRkRLYWFjRW5jX3NwZWNFeHBUYWJsZUNvbWJbNF1bMTRdID0KLXsKLSAgezEsIDIsIDMsIDUsIDYsIDcsIDksIDEwLCAxMSwgMTMsIDE0LCAxNSwgMTcsIDE4fSwKLSAgezEsIDIsIDMsIDUsIDYsIDcsIDksIDEwLCAxMSwgMTMsIDE0LCAxNSwgMTcsIDE4fSwKLSAgezEsIDIsIDQsIDUsIDYsIDgsIDksIDEwLCAxMiwgMTMsIDE0LCAxNiwgMTcsIDE4fSwKLSAgezEsIDMsIDQsIDUsIDcsIDgsIDksIDExLCAxMiwgMTMsIDE1LCAxNiwgMTcsIDE5fQotfTsKLQorY29uc3QgVUNIQVIgRkRLYWFjRW5jX3NwZWNFeHBUYWJsZUNvbWJbNF1bMTRdID0geworICAgIHsxLCAyLCAzLCA1LCA2LCA3LCA5LCAxMCwgMTEsIDEzLCAxNCwgMTUsIDE3LCAxOH0sCisgICAgezEsIDIsIDMsIDUsIDYsIDcsIDksIDEwLCAxMSwgMTMsIDE0LCAxNSwgMTcsIDE4fSwKKyAgICB7MSwgMiwgNCwgNSwgNiwgOCwgOSwgMTAsIDEyLCAxMywgMTQsIDE2LCAxNywgMTh9LAorICAgIHsxLCAzLCA0LCA1LCA3LCA4LCA5LCAxMSwgMTIsIDEzLCAxNSwgMTYsIDE3LCAxOX19OwogCiAjZGVmaW5lIFdUUzAgMQogI2RlZmluZSBXVFMxIDAKICNkZWZpbmUgV1RTMiAtMgogCiBjb25zdCBGSVhQX1dUQiBFTERBbmFseXNpczUxMlsxNTM2XSA9IHsKLSAgLyogcGFydCAwICovCi0gIFdUQzAoMHhmYWM1YTc3MCksIFdUQzAoMHhmYWFmYmFiOCksIFdUQzAoMHhmYTk5NmE0MCksIFdUQzAoMHhmYTgyYmJkMCksIFdUQzAoMHhmYTZiYjUzOCksIFdUQzAoMHhmYTU0NWMzOCksIFdUQzAoMHhmYTNjYjY5OCksIFdUQzAoMHhmYTI0Y2EyOCksIAotICBXVEMwKDB4ZmEwYzljYTgpLCBXVEMwKDB4ZjlmNDMzZTgpLCBXVEMwKDB4ZjlkYjk1ODApLCBXVEMwKDB4ZjljMmMyOTgpLCBXVEMwKDB4ZjlhOWI4MDApLCBXVEMwKDB4Zjk5MDcyNTApLCBXVEMwKDB4Zjk3NmVlMzgpLCBXVEMwKDB4Zjk1ZDJiODgpLCAKLSAgV1RDMCgweGY5NDMyZDEwKSwgV1RDMCgweGY5MjhmNWMwKSwgV1RDMCgweGY5MGU4ODY4KSwgV1RDMCgweGY4ZjNlNDAwKSwgV1RDMCgweGY4ZDkwM2EwKSwgV1RDMCgweGY4YmRlMjM4KSwgV1RDMCgweGY4YTI3YWYwKSwgV1RDMCgweGY4ODZjZGU4KSwgCi0gIFdUQzAoMHhmODZhZTAyMCksIFdUQzAoMHhmODRlYjZjMCksIFdUQzAoMHhmODMyNTZmOCksIFdUQzAoMHhmODE1YzRiOCksIFdUQzAoMHhmN2Y5MDJjMCksIFdUQzAoMHhmN2RjMTNiMCksIFdUQzAoMHhmN2JlZmE2MCksIFdUQzAoMHhmN2ExYmE0MCksIAotICBXVEMwKDB4Zjc4NDU3YzApLCBXVEMwKDB4Zjc2NmQ3ODApLCBXVEMwKDB4Zjc0OTNkOTApLCBXVEMwKDB4ZjcyYjg5OTApLCBXVEMwKDB4ZjcwZGI1ZjApLCBXVEMwKDB4ZjZlZmJkMzApLCBXVEMwKDB4ZjZkMTlhMjApLCBXVEMwKDB4ZjZiMzUyZTApLCAKLSAgV1RDMCgweGY2OTRmOGMwKSwgV1RDMCgweGY2NzY5ZGEwKSwgV1RDMCgweGY2NTg1MzEwKSwgV1RDMCgweGY2M2EyOGQwKSwgV1RDMCgweGY2MWMyYzYwKSwgV1RDMCgweGY1ZmU2YjEwKSwgV1RDMCgweGY1ZTBmMjUwKSwgV1RDMCgweGY1YzNjZWIwKSwgCi0gIFdUQzAoMHhmNWE3MGJlMCksIFdUQzAoMHhmNThhYjVhMCksIFdUQzAoMHhmNTZlZDdiMCksIFdUQzAoMHhmNTUzN2U0MCksIFdUQzAoMHhmNTM4YjYxMCksIFdUQzAoMHhmNTFlOGJmMCksIFdUQzAoMHhmNTA1MGM5MCksIFdUQzAoMHhmNGVjNDMzMCksIAotICBXVEMwKDB4ZjRkNDM5YjApLCBXVEMwKDB4ZjRiY2Y5YjApLCBXVEMwKDB4ZjRhNjhjZTApLCBXVEMwKDB4ZjQ5MGZhODApLCBXVEMwKDB4ZjQ3YzQ3NjApLCBXVEMwKDB4ZjQ2ODc4MzApLCBXVEMwKDB4ZjQ1NThmMDApLCBXVEMwKDB4ZjQ0MzRmYzApLCAKLSAgV1RDMCgweGY0MzE0MDcwKSwgV1RDMCgweGY0MWVlNDUwKSwgV1RDMCgweGY0MGJjMTMwKSwgV1RDMCgweGYzZjc5OWMwKSwgV1RDMCgweGYzZTI2ZDMwKSwgV1RDMCgweGYzY2MzZDcwKSwgV1RDMCgweGYzYjUwYzgwKSwgV1RDMCgweGYzOWNkZDYwKSwgCi0gIFdUQzAoMHhmMzgzYjQ0MCksIFdUQzAoMHhmMzY5OTU1MCksIFdUQzAoMHhmMzRlODRjMCksIFdUQzAoMHhmMzMyODZiMCksIFdUQzAoMHhmMzE1OWYxMCksIFdUQzAoMHhmMmY3ZDFiMCksIFdUQzAoMHhmMmQ5MjI5MCksIFdUQzAoMHhmMmI5OTRkMCksIAotICBXVEMwKDB4ZjI5OTJhZDApLCBXVEMwKDB4ZjI3N2U2ZDApLCBXVEMwKDB4ZjI1NWNiNjApLCBXVEMwKDB4ZjIzMmRkMDApLCBXVEMwKDB4ZjIwZjIyNDApLCBXVEMwKDB4ZjFlYWExZDApLCBXVEMwKDB4ZjFjNTYyNDApLCBXVEMwKDB4ZjE5ZjYzZDApLCAKLSAgV1RDMCgweGYxNzhhMGYwKSwgV1RDMCgweGYxNTExM2EwKSwgV1RDMCgweGYxMjhiNWMwKSwgV1RDMCgweGYwZmY3ZmQwKSwgV1RDMCgweGYwZDU2ODYwKSwgV1RDMCgweGYwYWE2NjEwKSwgV1RDMCgweGYwN2U2ZmQwKSwgV1RDMCgweGYwNTE4MTkwKSwgCi0gIFdUQzAoMHhmMDIzOWNkMCksIFdUQzAoMHhlZmY0YzMyMCksIFdUQzAoMHhlZmM0ZjcyMCksIFdUQzAoMHhlZjk0NTA4MCksIFdUQzAoMHhlZjYyZmNlMCksIFdUQzAoMHhlZjMxMmE0MCksIFdUQzAoMHhlZWZmMDVjMCksIFdUQzAoMHhlZWNjYTJjMCksIAotICBXVEMwKDB4ZWU5OWZhYTApLCBXVEMwKDB4ZWU2NzA1YTApLCBXVEMwKDB4ZWUzM2JiNjApLCBXVEMwKDB4ZWUwMDAwNjApLCBXVEMwKDB4ZWRjYmE2NjApLCBXVEMwKDB4ZWQ5NjdlODApLCBXVEMwKDB4ZWQ2MDViODApLCBXVEMwKDB4ZWQyOTNiNDApLCAKLSAgV1RDMCgweGVjZjE0NmEwKSwgV1RDMCgweGVjYjhhOGEwKSwgV1RDMCgweGVjN2Y4YmMwKSwgV1RDMCgweGVjNDYxMjYwKSwgV1RDMCgweGVjMGM1NzIwKSwgV1RDMCgweGViZDI3NDQwKSwgV1RDMCgweGViOTg4MjIwKSwgV1RDMCgweGViNWU3MDQwKSwgCi0gIFdUQzAoMHhlYjI0MDRjMCksIFdUQzAoMHhlYWU5MDQ0MCksIFdUQzAoMHhlYWFkMzNjMCksIFdUQzAoMHhlYTcwNjZjMCksIFdUQzAoMHhlYTMyN2Y2MCksIFdUQzAoMHhlOWYzNjAwMCksIFdUQzAoMHhlOWIyZWQ2MCksIFdUQzAoMHhlOTcxMzkyMCksIAotICBXVEMwKDB4ZTkyZTgxZTApLCBXVEMwKDB4ZThlYjA4YzApLCBXVEMwKDB4ZThhNzBlNjApLCBXVEMwKDB4ZTg2MmQ4ZTApLCBXVEMwKDB4ZTgxZWIzNDApLCBXVEMwKDB4ZTdkYWU4YTApLCBXVEMwKDB4ZTc5N2MxYTApLCBXVEMwKDB4ZTc1NTRjYTApLCAKLSAgV1RDMCgweGU3MTM1ZGMwKSwgV1RDMCgweGU2ZDFjNmEwKSwgV1RDMCgweGU2OTA1NzIwKSwgV1RDMCgweGU2NGViOWMwKSwgV1RDMCgweGU2MGM3MzAwKSwgV1RDMCgweGU1YzkwNjAwKSwgV1RDMCgweGU1ODNmOTIwKSwgV1RDMCgweGU1M2QxY2UwKSwgCi0gIFdUQzAoMHhlNGY0OGM4MCksIFdUQzAoMHhlNGFhNjY0MCksIFdUQzAoMHhlNDVlY2FhMCksIFdUQzAoMHhlNDEyMGJlMCksIFdUQzAoMHhlM2M0YWU2MCksIFdUQzAoMHhlMzc3Mzg2MCksIFdUQzAoMHhlMzJhMmVhMCksIFdUQzAoMHhlMmRkZWVhMCksIAotICBXVEMwKDB4ZTI5MmFmMDApLCBXVEMwKDB4ZTI0OGE0YTApLCBXVEMwKDB4ZTIwMDAxNDApLCBXVEMwKDB4ZTFiOGI2NDApLCBXVEMwKDB4ZTE3Mjc0NDApLCBXVEMwKDB4ZTEyY2U5MDApLCBXVEMwKDB4ZTBlN2MyODApLCBXVEMwKDB4ZTBhMmI0MjApLCAKLSAgV1RDMCgweGUwNWQ3NmMwKSwgV1RDMCgweGUwMTdjMzYwKSwgV1RDMCgweGRmZDE1NDQwKSwgV1RDMCgweGRmOGEwNTQwKSwgV1RDMCgweGRmNDFkMzAwKSwgV1RDMCgweGRlZjhiYjQwKSwgV1RDMCgweGRlYWViZDQwKSwgV1RDMCgweGRlNjNlN2MwKSwgCi0gIFdUQzAoMHhkZTE4NTk0MCksIFdUQzAoMHhkZGNjMzE4MCksIFdUQzAoMHhkZDdmOTAwMCksIFdUQzAoMHhkZDMyOWU4MCksIFdUQzAoMHhkY2U1OGU4MCksIFdUQzAoMHhkYzk4OTMwMCksIFdUQzAoMHhkYzRiZGU0MCksIFdUQzAoMHhkYmZmOTZjMCksIAotICBXVEMwKDB4ZGJiM2Q3ODApLCBXVEMwKDB4ZGI2OGJiODApLCBXVEMwKDB4ZGIxZTVjODApLCBXVEMwKDB4ZGFkNGMzODApLCBXVEMwKDB4ZGE4YmU4NDApLCBXVEMwKDB4ZGE0M2MxYzApLCBXVEMwKDB4ZDlmYzQ3NDApLCBXVEMwKDB4ZDliNTY2NDApLCAKLSAgV1RDMCgweGQ5NmYwNDQwKSwgV1RDMCgweGQ5MjkwNjAwKSwgV1RDMCgweGQ4ZTM1MDgwKSwgV1RDMCgweGQ4OWRjZDQwKSwgV1RDMCgweGQ4NTg2YjQwKSwgV1RDMCgweGQ4MTMxOTQwKSwgV1RDMCgweGQ3Y2RjNjQwKSwgV1RDMCgweGQ3ODg2MTgwKSwgCi0gIFdUQzAoMHhkNzQyZGM4MCksIFdUQzAoMHhkNmZkMjc4MCksIFdUQzAoMHhkNmI3MzQwMCksIFdUQzAoMHhkNjcwZmQ4MCksIFdUQzAoMHhkNjJhOGE0MCksIFdUQzAoMHhkNWUzZTA4MCksIFdUQzAoMHhkNTlkMDg0MCksIFdUQzAoMHhkNTU2MmI4MCksIAotICBXVEMwKDB4ZDUwZjk1NDApLCBXVEMwKDB4ZDRjOTkyYzApLCBXVEMwKDB4ZDQ4NDZmODApLCBXVEMwKDB4ZDQ0MDVhODApLCBXVEMwKDB4ZDNmZDY1ODApLCBXVEMwKDB4ZDNiYmExNDApLCBXVEMwKDB4ZDM3YjFjODApLCBXVEMwKDB4ZDMzYmI3ODApLCAKLSAgV1RDMCgweGQyZmQyNDAwKSwgV1RDMCgweGQyYmYxMjQwKSwgV1RDMCgweGQyODEzMzAwKSwgV1RDMCgweGQyNDM1YWMwKSwgV1RDMCgweGQyMDU3ZmMwKSwgV1RDMCgweGQxYzc5YTAwKSwgV1RDMCgweGQxODlhMjQwKSwgV1RDMCgweGQxNGI5ZGMwKSwgCi0gIFdUQzAoMHhkMTBkOWUwMCksIFdUQzAoMHhkMGNmYjU4MCksIFdUQzAoMHhkMDkxZjZjMCksIFdUQzAoMHhkMDU0ODEwMCksIFdUQzAoMHhkMDE3N2Y0MCksIFdUQzAoMHhjZmRiMWNjMCksIFdUQzAoMHhjZjlmODRjMCksIFdUQzAoMHhjZjY0ZDc4MCksIAotICBXVEMwKDB4Y2YyYjJiMDApLCBXVEMwKDB4Y2VmMjk0NDApLCBXVEMwKDB4Y2ViYjI2NDApLCBXVEMwKDB4Y2U4NGMwMDApLCBXVEMwKDB4Y2U0ZjBiYzApLCBXVEMwKDB4Y2UxOWIyMDApLCBXVEMwKDB4Y2RlNDVkNDApLCBXVEMwKDB4Y2RhZWVkYzApLCAKLSAgV1RDMCgweGNkNzk3OWMwKSwgV1RDMCgweGNkNDQxOWMwKSwgV1RDMCgweGNkMGVlNmMwKSwgV1RDMCgweGNjZGEwNTQwKSwgV1RDMCgweGNjYTVhNTAwKSwgV1RDMCgweGNjNzFmNjQwKSwgV1RDMCgweGNjM2YyODAwKSwgV1RDMCgweGNjMGQ0MzAwKSwgCi0gIFdUQzAoMHhjYmRjMmEwMCksIFdUQzAoMHhjYmFiYmU4MCksIFdUQzAoMHhjYjdiZTIwMCksIFdUQzAoMHhjYjRjODIwMCksIFdUQzAoMHhjYjFkOTgwMCksIFdUQzAoMHhjYWVmMWQ0MCksIFdUQzAoMHhjYWMxMGJjMCksIFdUQzAoMHhjYTkzNjQ0MCksIAotICBXVEMwKDB4Y2E2NjJkMDApLCBXVEMwKDB4Y2EzOTZkNDApLCBXVEMwKDB4Y2EwZDJiODApLCBXVEMwKDB4YzllMTZmODApLCBXVEMwKDB4YzliNjNmODApLCBXVEMwKDB4Yzk4YmEyYzApLCBXVEMwKDB4Yzk2MWEwMDApLCBXVEMwKDB4YzkzODNlYzApLCAKLSAgV1RDMCgweGM5MGEwNDQwKSwgV1RDMCgweGM4ZTBkMjgwKSwgV1RDMCgweGM4YjczYjgwKSwgV1RDMCgweGM4OGQ0OTAwKSwgV1RDMCgweGM4NjMwNGMwKSwgV1RDMCgweGM4Mzg3OGMwKSwgV1RDMCgweGM4MGRhZTgwKSwgV1RDMCgweGM3ZTJhZmMwKSwgCi0gIFdUQzAoMHhjN2I3ODY0MCksIFdUQzAoMHhjNzhjM2M0MCksIFdUQzAoMHhjNzYwZGE4MCksIFdUQzAoMHhjNzM1NjY0MCksIFdUQzAoMHhjNzA5ZGU0MCksIFdUQzAoMHhjNmRlNDFjMCksIFdUQzAoMHhjNmIyOGZjMCksIFdUQzAoMHhjNjg2YmQ0MCksIAotICBXVEMwKDB4YzY1YWI2MDApLCBXVEMwKDB4YzYyZTY1ODApLCBXVEMwKDB4YzYwMWI4ODApLCBXVEMwKDB4YzVkNGJhYzApLCBXVEMwKDB4YzVhNzk2NDApLCBXVEMwKDB4YzU3YTc2YzApLCBXVEMwKDB4YzU0ZDg3ODApLCBXVEMwKDB4YzUyMGU4NDApLCAKLSAgV1RDMCgweGM0ZjRhY2MwKSwgV1RDMCgweGM0YzhlODgwKSwgV1RDMCgweGM0OWRhZDgwKSwgV1RDMCgweGM0NzJlNjQwKSwgV1RDMCgweGM0NDg1NmMwKSwgV1RDMCgweGM0MWRjMTQwKSwgV1RDMCgweGMzZjJlOTQwKSwgV1RDMCgweGMzYzdiYzAwKSwgCi0gIFdUQzAoMHhjMzljNGYwMCksIFdUQzAoMHhjMzcwYjljMCksIFdUQzAoMHhjMzQ1MTNjMCksIFdUQzAoMHhjMzE5Nzk0MCksIFdUQzAoMHhjMmVlMGEwMCksIFdUQzAoMHhjMmMyZTY0MCksIFdUQzAoMHhjMjk4MmQ4MCksIFdUQzAoMHhjMjZkZjVjMCksIAotICBXVEMwKDB4YzI0NDRiMDApLCBXVEMwKDB4YzIxYjM5NDApLCBXVEMwKDB4YzFmMmNiYzApLCBXVEMwKDB4YzFjYjA1YzApLCBXVEMwKDB4YzFhM2UzNDApLCBXVEMwKDB4YzE3ZDVmMDApLCBXVEMwKDB4YzE1NzczYzApLCBXVEMwKDB4YzEzMjA5NDApLCAKLSAgV1RDMCgweGMxMGNmNDgwKSwgV1RDMCgweGMwZTgwYTAwKSwgV1RDMCgweGMwYzMxZjAwKSwgV1RDMCgweGMwOWUyNjQwKSwgV1RDMCgweGMwNzkyZWMwKSwgV1RDMCgweGMwNTQ0OTQwKSwgV1RDMCgweGMwMmY4NmMwKSwgV1RDMCgweGMwMGIwNGMwKSwgCi0gIFdUQzAoMHhiZmU2ZWQwMSksIFdUQzAoMHhiZmMzNmEwMSksIFdUQzAoMHhiZmEwYTU4MSksIFdUQzAoMHhiZjdlYjU4MSksIFdUQzAoMHhiZjVkOWE4MSksIFdUQzAoMHhiZjNkNTUwMSksIFdUQzAoMHhiZjFkZTYwMSksIFdUQzAoMHhiZWZmNDgwMSksIAotICBXVEMwKDB4YmVlMTcyMDEpLCBXVEMwKDB4YmVjNDU4ODEpLCBXVEMwKDB4YmVhN2YzMDEpLCBXVEMwKDB4YmU4YzM3ODEpLCBXVEMwKDB4YmU3MTIwMDEpLCBXVEMwKDB4YmU1NmEzODEpLCBXVEMwKDB4YmUzY2JjMDEpLCBXVEMwKDB4YmUyMzYwMDEpLCAKLSAgV1RDMCgweGJlMGE4NTgxKSwgV1RDMCgweGJkZjIyMTgxKSwgV1RDMCgweGJkZGEyYTAxKSwgV1RDMCgweGJkYzI5YTgxKSwgV1RDMCgweGJkYWI3MTgxKSwgV1RDMCgweGJkOTRiMDAxKSwgV1RDMCgweGJkN2U1NTgxKSwgV1RDMCgweGJkNjg2NjgxKSwgCi0gIFdUQzAoMHhiZDUyZWIwMSksIFdUQzAoMHhiZDNkZWI4MSksIFdUQzAoMHhiZDI5NzE4MSksIFdUQzAoMHhiZDE1ODgwMSksIFdUQzAoMHhiZDAyM2YwMSksIFdUQzAoMHhiY2VmYTYwMSksIFdUQzAoMHhiY2RkY2M4MSksIFdUQzAoMHhiY2NjYmQwMSksIAotICBXVEMwKDB4YmNiYzdlMDEpLCBXVEMwKDB4YmNhZDE1MDEpLCBXVEMwKDB4YmM5ZTg4MDEpLCBXVEMwKDB4YmM5MGQ0ODEpLCBXVEMwKDB4YmM4M2YyMDEpLCBXVEMwKDB4YmM3N2Q2MDEpLCBXVEMwKDB4YmM2Yzc3ODEpLCBXVEMwKDB4YmM2MWM0MDEpLCAKLSAgV1RDMCgweGJjNTdhMzAxKSwgV1RDMCgweGJjNGRmYjgxKSwgV1RDMCgweGJjNDRiNDgxKSwgV1RDMCgweGJjM2JiYzAxKSwgV1RDMCgweGJjMzMwNzgxKSwgV1RDMCgweGJjMmE4YzgxKSwgV1RDMCgweGJjMjI0MTgxKSwgV1RDMCgweGJjMWEyNDAxKSwgCi0gIFdUQzAoMHhiYzEyM2I4MSksIFdUQzAoMHhiYzBhOGYwMSksIFdUQzAoMHhiYzAzMjYwMSksIFdUQzAoMHhiYmZjMGY4MSksIFdUQzAoMHhiYmY1NjE4MSksIFdUQzAoMHhiYmVmMzMwMSksIFdUQzAoMHhiYmU5OTk4MSksIFdUQzAoMHhiYmU0OWQwMSksIAotICBXVEMwKDB4YmJlMDM4MDEpLCBXVEMwKDB4YmJkYzY0ODEpLCBXVEMwKDB4YmJkOTFiODEpLCBXVEMwKDB4YmJkNjRkMDEpLCBXVEMwKDB4YmJkM2UxMDEpLCBXVEMwKDB4YmJkMWJkODEpLCBXVEMwKDB4YmJjZmNhODEpLCBXVEMwKDB4YmJjZTA2MDEpLCAKLSAgV1RDMCgweGJiY2M4MjAxKSwgV1RDMCgweGJiY2I1MzAxKSwgV1RDMCgweGJiY2E4ZDAxKSwgV1RDMCgweGJiY2E1MDgxKSwgV1RDMCgweGJiY2FjYTAxKSwgV1RDMCgweGJiY2MyNjgxKSwgV1RDMCgweGJiY2U5MTgxKSwgV1RDMCgweGJiZDIxMjgxKSwgCi0gIFdUQzAoMHhiYmQ2OGM4MSksIFdUQzAoMHhiYmRiZTIwMSksIFdUQzAoMHhiYmUxZjQwMSksIFdUQzAoMHhiYmU4OTkwMSksIFdUQzAoMHhiYmVmOWI4MSksIFdUQzAoMHhiYmY2YzYwMSksIFdUQzAoMHhiYmZkZTQ4MSksIFdUQzAoMHhiYzA0ZTM4MSksIAotICBXVEMwKDB4YmMwYmNmODEpLCBXVEMwKDB4YmMxMmI4MDEpLCBXVEMwKDB4YmMxOWFiMDEpLCBXVEMwKDB4YmMyMGFlMDEpLCBXVEMwKDB4YmMyN2JkODEpLCBXVEMwKDB4YmMyZWQ2ODEpLCBXVEMwKDB4YmMzNWY1MDEpLCBXVEMwKDB4YmMzZDE4MDEpLCAKLSAgV1RDMCgweGJjNDQ0MDgxKSwgV1RDMCgweGJjNGI2ZTgxKSwgV1RDMCgweGJjNTJhMzgxKSwgV1RDMCgweGJjNTlkZjgxKSwgV1RDMCgweGJjNjEyMzAxKSwgV1RDMCgweGJjNjg2ZTAxKSwgV1RDMCgweGJjNmZjMTAxKSwgV1RDMCgweGJjNzcxYzAxKSwgCi0gIFdUQzAoMHhiYzdlN2UwMSksIFdUQzAoMHhiYzg1ZTgwMSksIFdUQzAoMHhiYzhkNTkwMSksIFdUQzAoMHhiYzk0ZDIwMSksIFdUQzAoMHhiYzljNTI4MSksIFdUQzAoMHhiY2EzZGIwMSksIFdUQzAoMHhiY2FiNmMwMSksIFdUQzAoMHhiY2IzMDYwMSksIAotICBXVEMwKDB4YmNiYWE4MDEpLCBXVEMwKDB4YmNjMjUxODEpLCBXVEMwKDB4YmNjYTAzMDEpLCBXVEMwKDB4YmNkMWJiODEpLCBXVEMwKDB4YmNkOTdjODEpLCBXVEMwKDB4YmNlMTQ2MDEpLCBXVEMwKDB4YmNlOTE4MDEpLCBXVEMwKDB4YmNmMGYzODEpLCAKLSAgV1RDMCgweGJjZjhkNzgxKSwgV1RDMCgweGJkMDBjMzgxKSwgV1RDMCgweGJkMDhiNzgxKSwgV1RDMCgweGJkMTBiMzgxKSwgV1RDMCgweGJkMThiNzgxKSwgV1RDMCgweGJkMjBjNDAxKSwgV1RDMCgweGJkMjhkOTgxKSwgV1RDMCgweGJkMzBmODgxKSwgCi0gIFdUQzAoMHhiZDM5MWY4MSksIFdUQzAoMHhiZDQxNGYwMSksIFdUQzAoMHhiZDQ5ODYwMSksIFdUQzAoMHhiZDUxYzQ4MSksIFdUQzAoMHhiZDVhMGIwMSksIFdUQzAoMHhiZDYyNTk4MSksIFdUQzAoMHhiZDZhYjEwMSksIFdUQzAoMHhiZDczMTA4MSksIAotICBXVEMwKDB4YmQ3Yjc3ODEpLCBXVEMwKDB4YmQ4M2U2ODEpLCBXVEMwKDB4YmQ4YzVjMDEpLCBXVEMwKDB4YmQ5NGQ4MDEpLCBXVEMwKDB4YmQ5ZDViODEpLCBXVEMwKDB4YmRhNWU2MDEpLCBXVEMwKDB4YmRhZTc4ODEpLCBXVEMwKDB4YmRiNzEyMDEpLCAKLSAgV1RDMCgweGJkYmZiMjgxKSwgV1RDMCgweGJkYzg1OTgxKSwgV1RDMCgweGJkZDEwNjgxKSwgV1RDMCgweGJkZDliOTgxKSwgV1RDMCgweGJkZTI3MjAxKSwgV1RDMCgweGJkZWIzMTAxKSwgV1RDMCgweGJkZjNmNzAxKSwgV1RDMCgweGJkZmNjMzAxKSwgCi0gIFdUQzAoMHhiZTA1OTQ4MSksIFdUQzAoMHhiZTBlNmMwMSksIFdUQzAoMHhiZTE3NDc4MSksIFdUQzAoMHhiZTIwMjgwMSksIFdUQzAoMHhiZTI5MGQwMSksIFdUQzAoMHhiZTMxZjcwMSksIFdUQzAoMHhiZTNhZTYwMSksIFdUQzAoMHhiZTQzZGE4MSksIAotICBXVEMwKDB4YmU0Y2QzODEpLCBXVEMwKDB4YmU1NWQwMDEpLCBXVEMwKDB4YmU1ZWQwODEpLCBXVEMwKDB4YmU2N2QzODEpLCBXVEMwKDB4YmU3MGRhMDEpLCBXVEMwKDB4YmU3OWU0ODEpLCBXVEMwKDB4YmU4MmYzMDEpLCBXVEMwKDB4YmU4YzA1MDEpLCAKLSAgV1RDMCgweGJlOTUxYTgxKSwgV1RDMCgweGJlOWUzMjgxKSwgV1RDMCgweGJlYTc0YzgxKSwgV1RDMCgweGJlYjA2ODgxKSwgV1RDMCgweGJlYjk4NjgxKSwgV1RDMCgweGJlYzJhNzgxKSwgV1RDMCgweGJlY2JjYTgxKSwgV1RDMCgweGJlZDRmMDgxKSwgCi0gIFdUQzAoMHhiZWRlMTkwMSksIFdUQzAoMHhiZWU3NDI4MSksIFdUQzAoMHhiZWYwNmQwMSksIFdUQzAoMHhiZWY5OTkwMSksIFdUQzAoMHhiZjAyYzU4MSksIFdUQzAoMHhiZjBiZjM4MSksIFdUQzAoMHhiZjE1MjM4MSksIFdUQzAoMHhiZjFlNTUwMSksIAotICBXVEMwKDB4YmYyNzg4MDEpLCBXVEMwKDB4YmYzMGJiMDEpLCBXVEMwKDB4YmYzOWVlODEpLCBXVEMwKDB4YmY0MzIyODEpLCBXVEMwKDB4YmY0YzU2ODEpLCBXVEMwKDB4YmY1NThiMDEpLCBXVEMwKDB4YmY1ZWMxMDEpLCBXVEMwKDB4YmY2N2Y4MDEpLCAKLSAgV1RDMCgweGJmNzEyZjAxKSwgV1RDMCgweGJmN2E2NjgxKSwgV1RDMCgweGJmODM5ZDgxKSwgV1RDMCgweGJmOGNkNDgxKSwgV1RDMCgweGJmOTYwYjAxKSwgV1RDMCgweGJmOWY0MTgxKSwgV1RDMCgweGJmYTg3OTAxKSwgV1RDMCgweGJmYjFiMTAxKSwgCi0gIFdUQzAoMHhiZmJhZTk4MSksIFdUQzAoMHhiZmM0MjIwMSksIFdUQzAoMHhiZmNkNWEwMSksIFdUQzAoMHhiZmQ2OTEwMSksIFdUQzAoMHhiZmRmYzc4MSksIFdUQzAoMHhiZmU4ZmMwMSksIFdUQzAoMHhiZmYyMmY4MSksIFdUQzAoMHhiZmZiNjA4MSksIAotICAvKiBwYXJ0IDEgKi8KLSAgV1RDMSgweDgwMDkzZTAxKSwgV1RDMSgweDgwMWI5YjAxKSwgV1RDMSgweDgwMmRmNzAxKSwgV1RDMSgweDgwNDA1MTAxKSwgV1RDMSgweDgwNTJhODgxKSwgV1RDMSgweDgwNjRmYzgxKSwgV1RDMSgweDgwNzc0YzgxKSwgV1RDMSgweDgwODk5ODgxKSwgCi0gIFdUQzEoMHg4MDliZGYwMSksIFdUQzEoMHg4MGFlMWY4MSksIFdUQzEoMHg4MGMwNWEwMSksIFdUQzEoMHg4MGQyOGQ4MSksIFdUQzEoMHg4MGU0YmI4MSksIFdUQzEoMHg4MGY2ZTQ4MSksIFdUQzEoMHg4MTA5MDk4MSksIFdUQzEoMHg4MTFiMjk4MSksIAotICBXVEMxKDB4ODEyZDQ0ODEpLCBXVEMxKDB4ODEzZjU5ODEpLCBXVEMxKDB4ODE1MTY3MDEpLCBXVEMxKDB4ODE2MzZkODEpLCBXVEMxKDB4ODE3NTZkODEpLCBXVEMxKDB4ODE4NzY3ODEpLCBXVEMxKDB4ODE5OTVjMDEpLCBXVEMxKDB4ODFhYjRiMDEpLCAKLSAgV1RDMSgweDgxYmQzNDAxKSwgV1RDMSgweDgxY2YxNTgxKSwgV1RDMSgweDgxZTBlZTgxKSwgV1RDMSgweDgxZjJiZjgxKSwgV1RDMSgweDgyMDQ4ODgxKSwgV1RDMSgweDgyMTY0YTgxKSwgV1RDMSgweDgyMjgwNTgxKSwgV1RDMSgweDgyMzliOTgxKSwgCi0gIFdUQzEoMHg4MjRiNjYwMSksIFdUQzEoMHg4MjVkMDkwMSksIFdUQzEoMHg4MjZlYTIwMSksIFdUQzEoMHg4MjgwMzEwMSksIFdUQzEoMHg4MjkxYjYwMSksIFdUQzEoMHg4MmEzMzI4MSksIFdUQzEoMHg4MmI0YTYwMSksIFdUQzEoMHg4MmM2MTEwMSksIAotICBXVEMxKDB4ODJkNzcyMDEpLCBXVEMxKDB4ODJlOGM4MDEpLCBXVEMxKDB4ODJmYTExODEpLCBXVEMxKDB4ODMwYjRmODEpLCBXVEMxKDB4ODMxYzgxMDEpLCBXVEMxKDB4ODMyZGE3ODEpLCBXVEMxKDB4ODMzZWMzODEpLCBXVEMxKDB4ODM0ZmQ0ODEpLCAKLSAgV1RDMSgweDgzNjBkOTAxKSwgV1RDMSgweDgzNzFkMDgxKSwgV1RDMSgweDgzODJiYTAxKSwgV1RDMSgweDgzOTM5NTAxKSwgV1RDMSgweDgzYTQ2MTgxKSwgV1RDMSgweDgzYjUyMTAxKSwgV1RDMSgweDgzYzVkMzgxKSwgV1RDMSgweDgzZDY3ODgxKSwgCi0gIFdUQzEoMHg4M2U3MGYwMSksIFdUQzEoMHg4M2Y3OTY4MSksIFdUQzEoMHg4NDA4MGQ4MSksIFdUQzEoMHg4NDE4NzQwMSksIFdUQzEoMHg4NDI4Y2EwMSksIFdUQzEoMHg4NDM5MTA4MSksIFdUQzEoMHg4NDQ5NDg4MSksIFdUQzEoMHg4NDU5NzA4MSksIAotICBXVEMxKDB4ODQ2OTg4ODEpLCBXVEMxKDB4ODQ3OThmODEpLCBXVEMxKDB4ODQ4OTg0ODEpLCBXVEMxKDB4ODQ5OTY3MDEpLCBXVEMxKDB4ODRhOTM4MDEpLCBXVEMxKDB4ODRiOGY4MDEpLCBXVEMxKDB4ODRjOGE3MDEpLCBXVEMxKDB4ODRkODQ2MDEpLCAKLSAgV1RDMSgweDg0ZTdkMzgxKSwgV1RDMSgweDg0Zjc0ZTAxKSwgV1RDMSgweDg1MDZiNTgxKSwgV1RDMSgweDg1MTYwOTgxKSwgV1RDMSgweDg1MjU0YTgxKSwgV1RDMSgweDg1MzQ3OTAxKSwgV1RDMSgweDg1NDM5NjAxKSwgV1RDMSgweDg1NTJhMTgxKSwgCi0gIFdUQzEoMHg4NTYxOWEwMSksIFdUQzEoMHg4NTcwN2Y4MSksIFdUQzEoMHg4NTdmNTEwMSksIFdUQzEoMHg4NThlMGUwMSksIFdUQzEoMHg4NTljYjc4MSksIFdUQzEoMHg4NWFiNGYwMSksIFdUQzEoMHg4NWI5ZDQ4MSksIFdUQzEoMHg4NWM4NDgwMSksIAotICBXVEMxKDB4ODVkNmE5ODEpLCBXVEMxKDB4ODVlNGY4MDEpLCBXVEMxKDB4ODVmMzMyODEpLCBXVEMxKDB4ODYwMTU5ODEpLCBXVEMxKDB4ODYwZjZlMDEpLCBXVEMxKDB4ODYxZDcwODEpLCBXVEMxKDB4ODYyYjYyMDEpLCBXVEMxKDB4ODYzOTQzMDEpLCAKLSAgV1RDMSgweDg2NDcxMjgxKSwgV1RDMSgweDg2NTRkMDAxKSwgV1RDMSgweDg2NjI3YjAxKSwgV1RDMSgweDg2NzAxMzgxKSwgV1RDMSgweDg2N2Q5YTgxKSwgV1RDMSgweDg2OGIxMDAxKSwgV1RDMSgweDg2OTg3NTgxKSwgV1RDMSgweDg2YTVjYTgxKSwgCi0gIFdUQzEoMHg4NmIzMGYwMSksIFdUQzEoMHg4NmMwNDM4MSksIFdUQzEoMHg4NmNkNjY4MSksIFdUQzEoMHg4NmRhNzkwMSksIFdUQzEoMHg4NmU3N2I4MSksIFdUQzEoMHg4NmY0NmQ4MSksIFdUQzEoMHg4NzAxNGY4MSksIFdUQzEoMHg4NzBlMjMwMSksIAotICBXVEMxKDB4ODcxYWU5ODEpLCBXVEMxKDB4ODcyN2EzODEpLCBXVEMxKDB4ODczNDUzODEpLCBXVEMxKDB4ODc0MGY2ODEpLCBXVEMxKDB4ODc0ZDg2ODEpLCBXVEMxKDB4ODc1OWZkMDEpLCBXVEMxKDB4ODc2NjU0ODEpLCBXVEMxKDB4ODc3Mjk3MDEpLCAKLSAgV1RDMSgweDg3N2VkZTAxKSwgV1RDMSgweDg3OGI0MzAxKSwgV1RDMSgweDg3OTdkZDgxKSwgV1RDMSgweDg3YTQ4YjAxKSwgV1RDMSgweDg3YjBlZjAxKSwgV1RDMSgweDg3YmNhYjgxKSwgV1RDMSgweDg3Yzc2MjAxKSwgV1RDMSgweDg3ZDBjYTgxKSwgCi0gIFdUQzEoMHg4N2ZkZDc4MSksIFdUQzEoMHg4ODFkZDMwMSksIFdUQzEoMHg4ODQyMzMwMSksIFdUQzEoMHg4ODZhOGE4MSksIFdUQzEoMHg4ODk2Mjk4MSksIFdUQzEoMHg4OGM0NWU4MSksIFdUQzEoMHg4OGY0NzkwMSksIFdUQzEoMHg4OTI1ZjEwMSksIAotICBXVEMxKDB4ODk1ODY5MDEpLCBXVEMxKDB4ODk4YjgzMDEpLCBXVEMxKDB4ODliZWU1ODEpLCBXVEMxKDB4ODlmMjYxMDEpLCBXVEMxKDB4OGEyNWYzMDEpLCBXVEMxKDB4OGE1OTlhODEpLCBXVEMxKDB4OGE4ZDU4MDEpLCBXVEMxKDB4OGFjMTMzODEpLCAKLSAgV1RDMSgweDhhZjUzZTgxKSwgV1RDMSgweDhiMjk4YjgxKSwgV1RDMSgweDhiNWUyYzgxKSwgV1RDMSgweDhiOTMzMDAxKSwgV1RDMSgweDhiYzhhNDAxKSwgV1RDMSgweDhiZmU5NDAxKSwgV1RDMSgweDhjMzUwZDAxKSwgV1RDMSgweDhjNmMxYjAxKSwgCi0gIFdUQzEoMHg4Y2EzY2IwMSksIFdUQzEoMHg4Y2RjMjkwMSksIFdUQzEoMHg4ZDE1NDA4MSksIFdUQzEoMHg4ZDRmMWIwMSksIFdUQzEoMHg4ZDg5YmU4MSksIFdUQzEoMHg4ZGM1MzAwMSksIFdUQzEoMHg4ZTAxNzU4MSksIFdUQzEoMHg4ZTNlOTQ4MSksIAotICBXVEMxKDB4OGU3YzkzMDEpLCBXVEMxKDB4OGViYjc1ODEpLCBXVEMxKDB4OGVmYjQxODEpLCBXVEMxKDB4OGYzYmZiMDEpLCBXVEMxKDB4OGY3ZGE0MDEpLCBXVEMxKDB4OGZjMDNmMDEpLCBXVEMxKDB4OTAwM2NlODEpLCBXVEMxKDB4OTA0ODU0MDEpLCAKLSAgV1RDMSgweDkwOGRkMTAxKSwgV1RDMSgweDkwZDQ0NzgxKSwgV1RDMSgweDkxMWJiOTgxKSwgV1RDMSgweDkxNjQyNzgxKSwgV1RDMSgweDkxYWQ5MjgxKSwgV1RDMSgweDkxZjdmOTgxKSwgV1RDMSgweDkyNDM1ZDAxKSwgV1RDMSgweDkyOGZiZTAxKSwgCi0gIFdUQzEoMHg5MmRkMWIwMSksIFdUQzEoMHg5MzJiNzUwMSksIFdUQzEoMHg5MzdhY2IwMSksIFdUQzEoMHg5M2NiMWM4MSksIFdUQzEoMHg5NDFjNjkwMSksIFdUQzEoMHg5NDZlYWY4MSksIFdUQzEoMHg5NGMxZWUwMSksIFdUQzEoMHg5NTE2MjM4MSksIAotICBXVEMxKDB4OTU2YjRmODEpLCBXVEMxKDB4OTVjMTcwODEpLCBXVEMxKDB4OTYxODg1MDEpLCBXVEMxKDB4OTY3MDhiODEpLCBXVEMxKDB4OTZjOTgzODEpLCBXVEMxKDB4OTcyMzZiMDEpLCBXVEMxKDB4OTc3ZTQxODEpLCBXVEMxKDB4OTdkYTA0ODEpLCAKLSAgV1RDMSgweDk4MzZiMjAxKSwgV1RDMSgweDk4OTQ0OTAxKSwgV1RDMSgweDk4ZjJjNjAxKSwgV1RDMSgweDk5NTIyODAxKSwgV1RDMSgweDk5YjI2YzgxKSwgV1RDMSgweDlhMTM5MTAxKSwgV1RDMSgweDlhNzU5MzAxKSwgV1RDMSgweDlhZDg3MDgxKSwgCi0gIFdUQzEoMHg5YjNjMjgwMSksIFdUQzEoMHg5YmEwYjcwMSksIFdUQzEoMHg5YzA2MWI4MSksIFdUQzEoMHg5YzZjNTQ4MSksIFdUQzEoMHg5Y2QzNWY4MSksIFdUQzEoMHg5ZDNiM2I4MSksIFdUQzEoMHg5ZGEzZTYwMSksIFdUQzEoMHg5ZTBkNWUwMSksIAotICBXVEMxKDB4OWU3NzlmODEpLCBXVEMxKDB4OWVlMmE5MDEpLCBXVEMxKDB4OWY0ZTc4MDEpLCBXVEMxKDB4OWZiYjA5ODEpLCBXVEMxKDB4YTAyODVkODEpLCBXVEMxKDB4YTA5NjcyMDEpLCBXVEMxKDB4YTEwNTQ3MDEpLCBXVEMxKDB4YTE3NGRhODEpLCAKLSAgV1RDMSgweGExZTUyYTgxKSwgV1RDMSgweGEyNTYzNTAxKSwgV1RDMSgweGEyYzdmODAxKSwgV1RDMSgweGEzM2E3MjAxKSwgV1RDMSgweGEzYWRhMjgxKSwgV1RDMSgweGE0MjE4ODAxKSwgV1RDMSgweGE0OTYyMTgxKSwgV1RDMSgweGE1MGI2ZTgxKSwgCi0gIFdUQzEoMHhhNTgxNmU4MSksIFdUQzEoMHhhNWY4MWY4MSksIFdUQzEoMHhhNjZmODIwMSksIFdUQzEoMHhhNmU3OTQwMSksIFdUQzEoMHhhNzYwNTYwMSksIFdUQzEoMHhhN2Q5YzY4MSksIFdUQzEoMHhhODUzZTUwMSksIFdUQzEoMHhhOGNlYjIwMSksIAotICBXVEMxKDB4YTk0YTJjMDEpLCBXVEMxKDB4YTljNjU0MDEpLCBXVEMxKDB4YWE0MzI5ODEpLCBXVEMxKDB4YWFjMGFkMDEpLCBXVEMxKDB4YWIzZWRmMDEpLCBXVEMxKDB4YWJiZGMwMDEpLCBXVEMxKDB4YWMzZDUwMDEpLCBXVEMxKDB4YWNiZDkwODEpLCAKLSAgV1RDMSgweGFkM2U4MTAxKSwgV1RDMSgweGFkYzAyMjgxKSwgV1RDMSgweGFlNDI3NDgxKSwgV1RDMSgweGFlYzU3ODAxKSwgV1RDMSgweGFmNDkyZjAxKSwgV1RDMSgweGFmY2Q5YTgxKSwgV1RDMSgweGIwNTJiYzAxKSwgV1RDMSgweGIwZDg5NDAxKSwgCi0gIFdUQzEoMHhiMTVmMjM4MSksIFdUQzEoMHhiMWU2NmEwMSksIFdUQzEoMHhiMjZlNjg4MSksIFdUQzEoMHhiMmY3MWYwMSksIFdUQzEoMHhiMzgwOGQ4MSksIFdUQzEoMHhiNDBhYjUwMSksIFdUQzEoMHhiNDk1OTUwMSksIFdUQzEoMHhiNTIxMmU4MSksIAotICBXVEMxKDB4NGE2Y2Y2N2YpLCBXVEMxKDB4NDlkZmZlZmYpLCBXVEMxKDB4NDk1MjY1ZmYpLCBXVEMxKDB4NDhjNDI3N2YpLCBXVEMxKDB4NDgzNTQwN2YpLCBXVEMxKDB4NDdhNWFlZmYpLCBXVEMxKDB4NDcxNTcwZmYpLCBXVEMxKDB4NDY4NDg0ZmYpLCAKLSAgV1RDMSgweDQ1ZjJlYWZmKSwgV1RDMSgweDQ1NjBhMmZmKSwgV1RDMSgweDQ0Y2RhZDdmKSwgV1RDMSgweDQ0M2EwYzdmKSwgV1RDMSgweDQzYTVjMDdmKSwgV1RDMSgweDQzMTBjYWZmKSwgV1RDMSgweDQyN2IyYmZmKSwgV1RDMSgweDQxZTRlM2ZmKSwgCi0gIFdUQzEoMHg0MTRkZjJmZiksIFdUQzEoMHg0MGI2NTU3ZiksIFdUQzEoMHg0MDFlMDZmZiksIFdUQzEoMHgzZjg1MDNjMCksIFdUQzEoMHgzZWViNGUwMCksIFdUQzEoMHgzZTUwZWJjMCksIFdUQzEoMHgzZGI1ZTY4MCksIFdUQzEoMHgzZDFhNDY4MCksIAotICBXVEMxKDB4M2M3ZTEwYzApLCBXVEMxKDB4M2JlMTRjYzApLCBXVEMxKDB4M2I0NDAyYzApLCBXVEMxKDB4M2FhNjM4MDApLCBXVEMxKDB4M2EwN2U4NDApLCBXVEMxKDB4Mzk2OTA4ODApLCBXVEMxKDB4MzhjOTg3MDApLCBXVEMxKDB4MzgyOTViNDApLCAKLSAgV1RDMSgweDM3ODg4YTgwKSwgV1RDMSgweDM2ZTcxZDQwKSwgV1RDMSgweDM2NDUxZDgwKSwgV1RDMSgweDM1YTI5NDAwKSwgV1RDMSgweDM0ZmY4ODAwKSwgV1RDMSgweDM0NWMwNGMwKSwgV1RDMSgweDMzYjgxOTQwKSwgV1RDMSgweDMzMTNkMjAwKSwgCi0gIFdUQzEoMHgzMjZmMzgwMCksIFdUQzEoMHgzMWNhNTYwMCksIFdUQzEoMHgzMTI1Mzg0MCksIFdUQzEoMHgzMDdmZThjMCksIFdUQzEoMHgyZmRhNmU0MCksIFdUQzEoMHgyZjM0Y2U0MCksIFdUQzEoMHgyZThmMGU0MCksIFdUQzEoMHgyZGU5MmVjMCksIAotICBXVEMxKDB4MmQ0MzI3ODApLCBXVEMxKDB4MmM5Y2VhNDApLCBXVEMxKDB4MmJmNjYzMDApLCBXVEMxKDB4MmI0Zjg4YzApLCBXVEMxKDB4MmFhODY0YzApLCBXVEMxKDB4MmEwMTAyNDApLCBXVEMxKDB4Mjk1OTZlNDApLCBXVEMxKDB4MjhiMWJhODApLCAKLSAgV1RDMSgweDI4MDlmZjQwKSwgV1RDMSgweDI3NjI1YjgwKSwgV1RDMSgweDI2YmFmNTgwKSwgV1RDMSgweDI2MTNlN2MwKSwgV1RDMSgweDI1NmQzZGMwKSwgV1RDMSgweDI0YzcwMzAwKSwgV1RDMSgweDI0MjE0MzgwKSwgV1RDMSgweDIzN2MwODAwKSwgCi0gIFdUQzEoMHgyMmQ3NTQwMCksIFdUQzEoMHgyMjMzMmE4MCksIFdUQzEoMHgyMThmOGNjMCksIFdUQzEoMHgyMGVjN2U0MCksIFdUQzEoMHgyMDRhMDRjMCksIFdUQzEoMHgxZmE4MjU0MCksIFdUQzEoMHgxZjA2ZTMwMCksIFdUQzEoMHgxZTY2NDAwMCksIAotICBXVEMxKDB4MWRjNjNiYzApLCBXVEMxKDB4MWQyNmQzYzApLCBXVEMxKDB4MWM4ODAzYTApLCBXVEMxKDB4MWJlOWNjNDApLCBXVEMxKDB4MWI0YzM0YzApLCBXVEMxKDB4MWFhZjQ0ODApLCBXVEMxKDB4MWExMzAyNjApLCBXVEMxKDB4MTk3Nzc0YTApLCAKLSAgV1RDMSgweDE4ZGNhMjYwKSwgV1RDMSgweDE4NDI5NGUwKSwgV1RDMSgweDE3YTk1ODQwKSwgV1RDMSgweDE3MTBmZDgwKSwgV1RDMSgweDE2Nzk5Y2UwKSwgV1RDMSgweDE1ZTM1MzQwKSwgV1RDMSgweDE1NGU0MWEwKSwgV1RDMSgweDE0YmE4MzYwKSwgCi0gIFdUQzEoMHgxNDI4MmJlMCksIFdUQzEoMHgxMzk3NTEwMCksIFdUQzEoMHgxMzA4MGFhMCksIFdUQzEoMHgxMjdhNjI0MCksIFdUQzEoMHgxMWVlNTBhMCksIFdUQzEoMHgxMTYzY2M4MCksIFdUQzEoMHgxMGRhY2IyMCksIFdUQzEoMHgxMDUzMzNhMCksIAotICBXVEMxKDB4MGZjY2RiMzApLCBXVEMxKDB4MGY0NzhmNDApLCBXVEMxKDB4MGVjMzE3MDApLCBXVEMxKDB4MGUzZjRlODApLCBXVEMxKDB4MGRiYzI3ZjApLCBXVEMxKDB4MGQzOTkwMDApLCBXVEMxKDB4MGNiNzZkMDApLCBXVEMxKDB4MGMzNTlkNTApLCAKLSAgV1RDMSgweDBiYjNmZDUwKSwgV1RDMSgweDBiMzI2YmQwKSwgV1RDMSgweDBhYjBjYTgwKSwgV1RDMSgweDBhMmYwZGMwKSwgV1RDMSgweDA5YWQ0MGMwKSwgV1RDMSgweDA5MmI3YTkwKSwgV1RDMSgweDA4YTlkYjgwKSwgV1RDMSgweDA4Mjg1YzgwKSwgCi0gIFdUQzEoMHgwN2E2YzdiOCksIFdUQzEoMHgwNzI0ZTRlMCksIFdUQzEoMHgwNmEyN2I4MCksIFdUQzEoMHgwNjFmNTJmOCksIFdUQzEoMHgwNTliMmFkMCksIFdUQzEoMHgwNTE1YjU2OCksIFdUQzEoMHgwNDhlYTA1OCksIFdUQzEoMHgwNDA2NjQwOCksIAotICBXVEMxKDB4MDM3ZTUyZDgpLCBXVEMxKDB4MDJmN2QzYzgpLCBXVEMxKDB4MDI3NDYxNGMpLCBXVEMxKDB4MDFmNjMwMDgpLCBXVEMxKDB4MDE4MDQwM2EpLCBXVEMxKDB4MDExNWM0NDIpLCBXVEMxKDB4MDBiYTA5ZTIpLCBXVEMxKDB4MDA2ZjA3N2MpLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIC8qIHBhcnQgMiAqLwotICBXVEMyKDB4ZmZmMzZiZTEpLCBXVEMyKDB4ZmZkYWZiYzEpLCBXVEMyKDB4ZmZjMjgwMzUpLCBXVEMyKDB4ZmZhOWZlOGEpLCBXVEMyKDB4ZmY5MTdjMDgpLCBXVEMyKDB4ZmY3OGZkZmMpLCBXVEMyKDB4ZmY2MDg5YWYpLCBXVEMyKDB4ZmY0ODI0NmMpLCAKLSAgV1RDMigweGZmMmZkMzdmKSwgV1RDMigweGZmMTc5YzMxKSwgV1RDMigweGZlZmY4M2I2KSwgV1RDMigweGZlZTc4ZDE4KSwgV1RDMigweGZlY2ZiOTNlKSwgV1RDMigweGZlYjgwOGYyKSwgV1RDMigweGZlYTA3ZDA2KSwgV1RDMigweGZlODkxNmI0KSwgCi0gIFdUQzIoMHhmZTcxZDdhMCksIFdUQzIoMHhmZTVhYzE3NCksIFdUQzIoMHhmZTQzZDVkNiksIFdUQzIoMHhmZTJkMTY3ZSksIFdUQzIoMHhmZTE2ODUyZSksIFdUQzIoMHhmZTAwMjNhNiksIFdUQzIoMHhmZGU5ZjNmOCksIFdUQzIoMHhmZGQzZmY3YyksIAotICBXVEMyKDB4ZmRiZTU2YzApLCBXVEMyKDB4ZmRhOTBhYTgpLCBXVEMyKDB4ZmQ5NDJiNzgpLCBXVEMyKDB4ZmQ3ZmJiMjApLCBXVEMyKDB4ZmQ2YmFkNTApLCBXVEMyKDB4ZmQ1N2Y1MTApLCBXVEMyKDB4ZmQ0NDg1N2MpLCBXVEMyKDB4ZmQzMTUzZmMpLCAKLSAgV1RDMigweGZkMWU1ODQwKSwgV1RDMigweGZkMGI4YTBjKSwgV1RDMigweGZjZjhlMTgwKSwgV1RDMigweGZjZTY1ZWVjKSwgV1RDMigweGZjZDQwYWQwKSwgV1RDMigweGZjYzFlZTBjKSwgV1RDMigweGZjYjAxMWU4KSwgV1RDMigweGZjOWU4OTZjKSwgCi0gIFdUQzIoMHhmYzhkNzE2YyksIFdUQzIoMHhmYzdjZTcyMCksIFdUQzIoMHhmYzZkMDcyYyksIFdUQzIoMHhmYzVkZTA5YyksIFdUQzIoMHhmYzRmNzRlOCksIFdUQzIoMHhmYzQxYzRlOCksIFdUQzIoMHhmYzM0ZDBkYyksIFdUQzIoMHhmYzI4OGE2OCksIAotICBXVEMyKDB4ZmMxY2Q0OWMpLCBXVEMyKDB4ZmMxMTkxZTApLCBXVEMyKDB4ZmMwNmE0ZDApLCBXVEMyKDB4ZmJmYmYzZTgpLCBXVEMyKDB4ZmJmMTY5OTApLCBXVEMyKDB4ZmJlNmYwNjgpLCBXVEMyKDB4ZmJkYzc0MjgpLCBXVEMyKDB4ZmJkMWZjNjgpLCAKLSAgV1RDMigweGZiYzdhYzUwKSwgV1RDMigweGZiYmRhODY4KSwgV1RDMigweGZiYjQxNTAwKSwgV1RDMigweGZiYWIxNDM4KSwgV1RDMigweGZiYTJjNWY4KSwgV1RDMigweGZiOWI0YTAwKSwgV1RDMigweGZiOTRiZmE4KSwgV1RDMigweGZiOGYzYjQ4KSwgCi0gIFdUQzIoMHhmYjhhYzYzOCksIFdUQzIoMHhmYjg3Njk3MCksIFdUQzIoMHhmYjg1MmQyMCksIFdUQzIoMHhmYjg0MGFlMCksIFdUQzIoMHhmYjgzZWQ2MCksIFdUQzIoMHhmYjg0YmVjMCksIFdUQzIoMHhmYjg2NjkxOCksIFdUQzIoMHhmYjg4ZDRhOCksIAotICBXVEMyKDB4ZmI4YmU4MTApLCBXVEMyKDB4ZmI4Zjg5ZDApLCBXVEMyKDB4ZmI5M2EwODApLCBXVEMyKDB4ZmI5ODE0MTgpLCBXVEMyKDB4ZmI5Y2NkZjApLCBXVEMyKDB4ZmJhMWI3NzApLCBXVEMyKDB4ZmJhNmJhZTApLCBXVEMyKDB4ZmJhYmQ1YzApLCAKLSAgV1RDMigweGZiYjExOGQ4KSwgV1RDMigweGZiYjY5NWMwKSwgV1RDMigweGZiYmM1ZTkwKSwgV1RDMigweGZiYzI5MDMwKSwgV1RDMigweGZiYzk1MjY4KSwgV1RDMigweGZiZDBjZDc4KSwgV1RDMigweGZiZDkyOWM4KSwgV1RDMigweGZiZTI5NGQwKSwgCi0gIFdUQzIoMHhmYmVkNDEwOCksIFdUQzIoMHhmYmY5NjExOCksIFdUQzIoMHhmYzA3MjZjOCksIFdUQzIoMHhmYzE2YjA2NCksIFdUQzIoMHhmYzI4MDg5MCksIFdUQzIoMHhmYzNiMzkyMCksIFdUQzIoMHhmYzUwNGE5OCksIFdUQzIoMHhmYzY3MjcxYyksIAotICBXVEMyKDB4ZmM3ZjlhNzQpLCBXVEMyKDB4ZmM5OTZmMTgpLCBXVEMyKDB4ZmNiNDZlYjgpLCBXVEMyKDB4ZmNkMDUwYjApLCBXVEMyKDB4ZmNlY2JhMjQpLCBXVEMyKDB4ZmQwOTRmNjQpLCBXVEMyKDB4ZmQyNWI3MjApLCBXVEMyKDB4ZmQ0MWNlNDApLCAKLSAgV1RDMigweGZkNWRhN2Y4KSwgV1RDMigweGZkNzk1OWQ4KSwgV1RDMigweGZkOTRmYjc0KSwgV1RDMigweGZkYjBkM2ZjKSwgV1RDMigweGZkY2Q1YTM0KSwgV1RDMigweGZkZWIwNmU0KSwgV1RDMigweGZlMGE1MTg0KSwgV1RDMigweGZlMmI5MmM0KSwgCi0gIFdUQzIoMHhmZTRmMDQ4NiksIFdUQzIoMHhmZTc0ZGY1NCksIFdUQzIoMHhmZTlkNTg4NiksIFdUQzIoMHhmZWM4NWI5MiksIFdUQzIoMHhmZWY1OGExNiksIFdUQzIoMHhmZjI0ODI3NSksIFdUQzIoMHhmZjU0ZTQwMSksIFdUQzIoMHhmZjg2NjMzMCksIAotICBXVEMyKDB4ZmZiOGM5OWIpLCBXVEMyKDB4ZmZlYmUxYzkpLCBXVEMyKDB4MDAxZjc4NmEpLCBXVEMyKDB4MDA1MzhiZjkpLCBXVEMyKDB4MDA4ODRjYmMpLCBXVEMyKDB4MDBiZGVkMjMpLCBXVEMyKDB4MDBmNDlmNTQpLCBXVEMyKDB4MDEyYzhlZTQpLCAKLSAgV1RDMigweDAxNjVlMGQyKSwgV1RDMigweDAxYTBiOWQ2KSwgV1RDMigweDAxZGQzZDgwKSwgV1RDMigweDAyMWI3NGQ0KSwgV1RDMigweDAyNWI0ZTQ4KSwgV1RDMigweDAyOWNiNzMwKSwgV1RDMigweDAyZGY5ZDBjKSwgV1RDMigweDAzMjNmMWE0KSwgCi0gIFdUQzIoMHgwMzY5YWIwMCksIFdUQzIoMHgwM2IwYmY1YyksIFdUQzIoMHgwM2Y5MjVhMCksIFdUQzIoMHgwNDQyZTNkOCksIFdUQzIoMHgwNDhlMGY0MCksIFdUQzIoMHgwNGRhYmRiMCksIFdUQzIoMHgwNTI5MDQzMCksIFdUQzIoMHgwNTc4ZTQyOCksIAotICBXVEMyKDB4MDVjYTRiNjApLCBXVEMyKDB4MDYxZDI2YzApLCBXVEMyKDB4MDY3MTYzZDgpLCBXVEMyKDB4MDZjNmZmMTApLCBXVEMyKDB4MDcxZTAzYjApLCBXVEMyKDB4MDc3NjdkYTApLCBXVEMyKDB4MDdkMDc5MTgpLCBXVEMyKDB4MDgyYzA4ZTApLCAKLSAgV1RDMigweDA4ODk0NjYwKSwgV1RDMigweDA4ZTg0YjcwKSwgV1RDMigweDA5NDkzMGIwKSwgV1RDMigweDA5YWJmOGQwKSwgV1RDMigweDBhMTA5MDIwKSwgV1RDMigweDBhNzZlMjEwKSwgV1RDMigweDBhZGVkYTUwKSwgV1RDMigweDBiNDg2YjgwKSwgCi0gIFdUQzIoMHgwYmIzOGYwMCksIFdUQzIoMHgwYzIwM2U4MCksIFdUQzIoMHgwYzhlNzNlMCksIFdUQzIoMHgwY2ZlMmMzMCksIFdUQzIoMHgwZDZmNjgyMCksIFdUQzIoMHgwZGUyMjg1MCksIFdUQzIoMHgwZTU2NmQ5MCksIFdUQzIoMHgwZWNjM2RkMCksIAotICBXVEMyKDB4MGY0M2EzYTApLCBXVEMyKDB4MGZiY2E5ZjApLCBXVEMyKDB4MTAzNzViODApLCBXVEMyKDB4MTBiM2JlMjApLCBXVEMyKDB4MTEzMWQyODApLCBXVEMyKDB4MTFiMTk5NjApLCBXVEMyKDB4MTIzMzEzYTApLCBXVEMyKDB4MTJiNjQzODApLCAKLSAgV1RDMigweDEzM2IyZDAwKSwgV1RDMigweDEzYzFkNDQwKSwgV1RDMigweDE0NGEzZDYwKSwgV1RDMigweDE0ZDQ2OTAwKSwgV1RDMigweDE1NjA1NDgwKSwgV1RDMigweDE1ZWRmZDIwKSwgV1RDMigweDE2N2Q2MDQwKSwgV1RDMigweDE3MGU3ZTgwKSwgCi0gIFdUQzIoMHgxN2ExNWI4MCksIFdUQzIoMHgxODM1ZmIwMCksIFdUQzIoMHgxOGNjNjBhMCksIFdUQzIoMHgxOTY0OGRjMCksIFdUQzIoMHgxOWZlODBlMCksIFdUQzIoMHgxYTlhMzhhMCksIFdUQzIoMHgxYjM3YjNlMCksIFdUQzIoMHgxYmQ2ZjQwMCksIAotICBXVEMyKDB4MWM3N2ZkMjApLCBXVEMyKDB4MWQxYWQ0MDApLCBXVEMyKDB4MWRiZjdjODApLCBXVEMyKDB4MWU2NWY4MjApLCBXVEMyKDB4MWYwZTQ1NDApLCBXVEMyKDB4MWZiODYxZTApLCBXVEMyKDB4MjA2NDRjYzApLCBXVEMyKDB4MjExMjA2NDApLCAKLSAgV1RDMigweDIxYzE5MjQwKSwgV1RDMigweDIyNzJmNDgwKSwgV1RDMigweDIzMjYzMDAwKSwgV1RDMigweDIzZGI0NTgwKSwgV1RDMigweDI0OTIzMzQwKSwgV1RDMigweDI1NGFmNzAwKSwgV1RDMigweDI2MDU4ZTgwKSwgV1RDMigweDI2YzFmYTAwKSwgCi0gIFdUQzIoMHgyNzgwM2QwMCksIFdUQzIoMHgyODQwNWE0MCksIFdUQzIoMHgyOTAyNTUwMCksIFdUQzIoMHgyOWM2MmQ0MCksIFdUQzIoMHgyYThiZTBjMCksIFdUQzIoMHgyYjUzNmNjMCksIFdUQzIoMHgyYzFjY2Y4MCksIFdUQzIoMHgyY2U4MDg0MCksIAotICBXVEMyKDB4MmRiNTE5YzApLCBXVEMyKDB4MmU4NDA2MDApLCBXVEMyKDB4MmY1NGNmODApLCBXVEMyKDB4MzAyNzc1YzApLCBXVEMyKDB4MzBmYmY2NDApLCBXVEMyKDB4MzFkMjRlMDApLCBXVEMyKDB4MzJhYTdhMDApLCBXVEMyKDB4MzM4NDc5YzApLCAKLSAgV1RDMigweDM0NjA0ZTQwKSwgV1RDMigweDM1M2RmOTAwKSwgV1RDMigweDM2MWQ3YWMwKSwgV1RDMigweDM2ZmVkMjAwKSwgV1RDMigweDM3ZTFmYjQwKSwgV1RDMigweDM4YzZmMjQwKSwgV1RDMigweDM5YWRiMmMwKSwgV1RDMigweDNhOTYzYTAwKSwgCi0gIFdUQzIoMHgzYjgwODc0MCksIFdUQzIoMHgzYzZjOTg4MCksIFdUQzIoMHgzZDVhNmNjMCksIFdUQzIoMHgzZTRhMDA0MCksIFdUQzIoMHgzZjNiNGJjMCksIFdUQzIoMHg0MDJlNDhmZiksIFdUQzIoMHg0MTIyZjE3ZiksIFdUQzIoMHg0MjE5M2Y3ZiksIAotICBXVEMyKDB4NDMxMTJlZmYpLCBXVEMyKDB4NDQwYWJiZmYpLCBXVEMyKDB4NDUwNWUyZmYpLCBXVEMyKDB4NDYwMjllN2YpLCBXVEMyKDB4NDcwMGU5ZmYpLCBXVEMyKDB4NDgwMGJmZmYpLCBXVEMyKDB4NDkwMjFiZmYpLCBXVEMyKDB4NGEwNTBlZmYpLCAKLSAgV1RDMigweDRiMDliYzdmKSwgV1RDMigweDRjMTA0YWZmKSwgV1RDMigweDRkMThkZjdmKSwgV1RDMigweDRlMjNhMDdmKSwgV1RDMigweDRmMzBiMmZmKSwgV1RDMigweDUwNDAzYzdmKSwgV1RDMigweDUxNTI2MmZmKSwgV1RDMigweDUyNjc0YjdmKSwgCi0gIFdUQzIoMHgwMDE2NzhiMiksIFdUQzIoMHgwMDA2MWEzYiksIFdUQzIoMHhmZmZiNDYyMiksIFdUQzIoMHhmZmY1ZWE5NCksIFdUQzIoMHhmZmY1ZjViOSksIFdUQzIoMHhmZmZiNTViZCksIFdUQzIoMHgwMDA1ZjhjYiksIFdUQzIoMHgwMDE1Y2QwYyksIAotICBXVEMyKDB4MDAyYWMwYWMpLCBXVEMyKDB4MDA0NGMxZDUpLCBXVEMyKDB4MDA2M2JlYjIpLCBXVEMyKDB4MDA4N2E1NmQpLCBXVEMyKDB4MDBiMDY0MzEpLCBXVEMyKDB4MDBkZGU5MjkpLCBXVEMyKDB4MDExMDIyODApLCBXVEMyKDB4MDE0NmZlNWUpLCAKLSAgV1RDMigweDAxODI2YWYyKSwgV1RDMigweDAxYzI1NjYyKSwgV1RDMigweDAyMDZhZWRjKSwgV1RDMigweDAyNGY2Mjg4KSwgV1RDMigweDAyOWM1Zjk0KSwgV1RDMigweDAyZWQ5NDI0KSwgV1RDMigweDAzNDJlZTZjKSwgV1RDMigweDAzOWM1YzkwKSwgCi0gIFdUQzIoMHgwM2Y5Y2NiYyksIFdUQzIoMHgwNDViMmQxOCksIFdUQzIoMHgwNGMwNmJkOCksIFdUQzIoMHgwNTI5NzcxOCksIFdUQzIoMHgwNTk2M2QxMCksIFdUQzIoMHgwNjA2YWJlOCksIFdUQzIoMHgwNjdhYjFjMCksIFdUQzIoMHgwNmYyM2NkMCksIAotICBXVEMyKDB4MDc2ZDNiNDApLCBXVEMyKDB4MDdlYjliMzgpLCBXVEMyKDB4MDg2ZDRhZTApLCBXVEMyKDB4MDhmMjM4NjApLCBXVEMyKDB4MDk3YTUxZjApLCBXVEMyKDB4MGEwNTg1YjApLCBXVEMyKDB4MGE5M2MxZDApLCBXVEMyKDB4MGIyNGY0NzApLCAKLSAgV1RDMigweDBiYjkwYmMwKSwgV1RDMigweDBjNGZmNWYwKSwgV1RDMigweDBjZTlhMTMwKSwgV1RDMigweDBkODVmYjkwKSwgV1RDMigweDBlMjRmMzYwKSwgV1RDMigweDBlYzY3NmIwKSwgV1RDMigweDBmNmE3M2IwKSwgV1RDMigweDEwMTBkODgwKSwgCi0gIFdUQzIoMHgxMGI5OTM2MCksIFdUQzIoMHgxMTY0OTI4MCksIFdUQzIoMHgxMjExYzQwMCksIFdUQzIoMHgxMmMxMTVlMCksIFdUQzIoMHgxMzcyNzZhMCksIFdUQzIoMHgxNDI1ZDQyMCksIFdUQzIoMHgxNGRiMWNhMCksIFdUQzIoMHgxNTkyM2U2MCksIAotICBXVEMyKDB4MTY0YjI3ODApLCBXVEMyKDB4MTcwNWM2MjApLCBXVEMyKDB4MTdjMjA4NjApLCBXVEMyKDB4MTg3ZmRjYTApLCBXVEMyKDB4MTkzZjMwZTApLCBXVEMyKDB4MTlmZmYzNDApLCBXVEMyKDB4MWFjMjEyMDApLCBXVEMyKDB4MWI4NTdiNDApLCAKLSAgV1RDMigweDFjNGExZDQwKSwgV1RDMigweDFkMGZlNjAwKSwgV1RDMigweDFkZDZjM2UwKSwgV1RDMigweDFlOWVhNGUwKSwgV1RDMigweDFmNjc3NzQwKSwgV1RDMigweDIwMzEyOTQwKSwgV1RDMigweDIwZmJhOGMwKSwgV1RDMigweDIxYzZlNDQwKSwgCi0gIFdUQzIoMHgyMjkyYzljMCksIFdUQzIoMHgyMzVmNDc4MCksIFdUQzIoMHgyNDJjNGI4MCksIFdUQzIoMHgyNGY5YzQwMCksIFdUQzIoMHgyNWM3OWY0MCksIFdUQzIoMHgyNjk1Y2I0MCksIFdUQzIoMHgyNzY0MzY4MCksIFdUQzIoMHgyODMyY2VjMCksIAotICBXVEMyKDB4MjkwMTgyNDApLCBXVEMyKDB4MjlkMDNmODApLCBXVEMyKDB4MmE5ZWY0ODApLCBXVEMyKDB4MmI2ZDhmMDApLCBXVEMyKDB4MmMzYmZkYzApLCBXVEMyKDB4MmQwYTJlYzApLCBXVEMyKDB4MmRkODEwMDApLCBXVEMyKDB4MmVhNThmYzApLCAKLSAgV1RDMigweDJmNzI5YzQwKSwgV1RDMigweDMwM2YyMzgwKSwgV1RDMigweDMxMGIxNDAwKSwgV1RDMigweDMxZDY1YjgwKSwgV1RDMigweDMyYTBlODQwKSwgV1RDMigweDMzNmFhOGMwKSwgV1RDMigweDM0MzM4YWMwKSwgV1RDMigweDM0ZmI3Y2MwKSwgCi0gIFdUQzIoMHgzNWMyNmNjMCksIFdUQzIoMHgzNjg4NDkwMCksIFdUQzIoMHgzNzRjZmY4MCksIFdUQzIoMHgzODEwN2U4MCksIFdUQzIoMHgzOGQyYjQ0MCksIFdUQzIoMHgzOTkzOGVjMCksIFdUQzIoMHgzYTUyZmM0MCksIFdUQzIoMHgzYjEwZWIwMCksIAotICBXVEMyKDB4M2JjZDQ5MDApLCBXVEMyKDB4M2M4ODA0ODApLCBXVEMyKDB4M2Q0MTBiYzApLCBXVEMyKDB4M2RmODRkMDApLCBXVEMyKDB4M2VhZGI2MDApLCBXVEMyKDB4M2Y2MTM1NDApLCBXVEMyKDB4NDAxMmI4ZmYpLCBXVEMyKDB4NDBjMjJlZmYpLCAKLSAgV1RDMigweDQxNmY4NWZmKSwgV1RDMigweDQyMWFhYjdmKSwgV1RDMigweDQyYzM4ZTdmKSwgV1RDMigweDQzNmExYzdmKSwgV1RDMigweDQ0MGU0MzdmKSwgV1RDMigweDQ0YWZmMjdmKSwgV1RDMigweDQ1NGYxNjdmKSwgV1RDMigweDQ1ZWI5ZWZmKSwgCi0gIFdUQzIoMHg0Njg1NzhmZiksIFdUQzIoMHg0NzFjOTM3ZiksIFdUQzIoMHg0N2IwZGM3ZiksIFdUQzIoMHg0ODQyNDFmZiksIFdUQzIoMHg0OGQwYjFmZiksIFdUQzIoMHg0OTVjMWE3ZiksIFdUQzIoMHg0OWU0NmE3ZiksIFdUQzIoMHg0YTY5OGY3ZiksIAotICBXVEMyKDB4NGFlYjc3ZmYpLCBXVEMyKDB4NGI2YTExZmYpLCBXVEMyKDB4NGJlNTRiN2YpLCBXVEMyKDB4NGM1ZDEyZmYpLCBXVEMyKDB4NGNkMTU1ZmYpLCBXVEMyKDB4NGQ0MjAzZmYpLCBXVEMyKDB4NGRhZjA5ZmYpLCBXVEMyKDB4NGUxODU2N2YpLCAKLSAgV1RDMigweDRlN2RkNzdmKSwgV1RDMigweDRlZGY3YjdmKSwgV1RDMigweDRmM2QzMDdmKSwgV1RDMigweDRmOTZlNDdmKSwgV1RDMigweDRmZWM4NWZmKSwgV1RDMigweDUwM2UwMmZmKSwgV1RDMigweDUwOGI0OTdmKSwgV1RDMigweDUwZDQ0N2ZmKSwgCi0gIFdUQzIoMHg1MTE4ZWM3ZiksIFdUQzIoMHg1MTU5MjRmZiksIFdUQzIoMHg1MTk0ZGZmZiksIFdUQzIoMHg1MWNjMGI3ZiksIFdUQzIoMHg1MWZlOTVmZiksIFdUQzIoMHg1MjJjNmNmZiksIFdUQzIoMHg1MjU1N2VmZiksIFdUQzIoMHg1Mjc5YjlmZiksIAotICBXVEMyKDB4NTI5OTBjN2YpLCBXVEMyKDB4NTJiMzY0ZmYpLCBXVEMyKDB4NTJjOGIwN2YpLCBXVEMyKDB4NTJkOGRkZmYpLCBXVEMyKDB4NTJlM2RiN2YpLCBXVEMyKDB4NTJlOTk2ZmYpLCBXVEMyKDB4NTJlOWZmN2YpLCBXVEMyKDB4NTJlNTAxZmYpLCAKLSAgV1RDMigweDUyZGE4Y2ZmKSwgV1RDMigweDUyY2E4ZjdmKSwgV1RDMigweDUyYjRmNjdmKSwgV1RDMigweDUyOTliMDdmKSwgV1RDMigweDUyNzhhYzdmKSwgV1RDMigweDUyNTFkNzdmKSwgV1RDMigweDUyMjUxZmZmKSwgV1RDMigweDUxZjI3NGZmKSwgCi0gIFdUQzIoMHg1MWI5YzM3ZiksIFdUQzIoMHg1MTdhZjlmZiksIFdUQzIoMHg1MTM2MDc3ZiksIFdUQzIoMHg1MGVhZDhmZiksIFdUQzIoMHg1MDk5NWNmZiksIFdUQzIoMHg1MDQxODFmZiksIFdUQzIoMHg0ZmUzMzVmZiksIFdUQzIoMHg0ZjdlNjc3ZiksIAotICBXVEMyKDB4NGYxMzAzZmYpLCBXVEMyKDB4NGVhMGY5ZmYpLCBXVEMyKDB4NGUyODM3ZmYpLCBXVEMyKDB4NGRhOGFiN2YpLCBXVEMyKDB4NGQyMjQyZmYpLCBXVEMyKDB4NGM5NGVjZmYpLCBXVEMyKDB4NGMwMDk2ZmYpLCBXVEMyKDB4NGI2NTJmN2YpLCAKLSAgV1RDMigweDRhYzJhNGZmKSwgV1RDMigweDRhMThlNGZmKSwgV1RDMigweDQ5NjdkZGZmKSwgV1RDMigweDQ4YWY3ZTdmKSwgV1RDMigweDQ3ZWZiM2ZmKSwgV1RDMigweDQ3Mjg2Y2ZmKSwgV1RDMigweDQ2NTlhZDdmKSwgV1RDMigweDQ1ODU2ZjdmKSwgCi0gIFdUQzIoMHg0NGFmYTNmZiksIFdUQzIoMHg0M2RjNTA3ZiksIFdUQzIoMHg0MzBmNjU3ZiksIFdUQzIoMHg0MjRhZDQ3ZiksIFdUQzIoMHg0MThlOTI3ZiksIFdUQzIoMHg0MGRhN2JmZiksIFdUQzIoMHg0MDJlNmY3ZiksIFdUQzIoMHgzZjhhMzEwMCksIAotICBXVEMyKDB4M2VlZDZmNDApLCBXVEMyKDB4M2U1N2Q3MDApLCBXVEMyKDB4M2RjOTE0YzApLCBXVEMyKDB4M2Q0MGNjNDApLCBXVEMyKDB4M2NiZTk4YzApLCBXVEMyKDB4M2M0MjE1NDApLCBXVEMyKDB4M2JjYWRiYzApLCBXVEMyKDB4M2I1ODg4ODApLCAKLSAgV1RDMigweDNhZWFiNzgwKSwgV1RDMigweDNhODEwNTQwKSwgV1RDMigweDNhMWIwZTAwKSwgV1RDMigweDM5Yjg2ZDAwKSwgV1RDMigweDM5NThiY2MwKSwgV1RDMigweDM4ZmI5NzAwKSwgV1RDMigweDM4YTA5NWMwKSwgV1RDMigweDM4NDczZDgwKSwgCi0gIFdUQzIoMHgzN2VlZmY0MCksIFdUQzIoMHgzNzk3NGI0MCksIFdUQzIoMHgzNzNmOTUwMCksIFdUQzIoMHgzNmU3YWUwMCksIFdUQzIoMHgzNjhmYzRjMCksIFdUQzIoMHgzNjM4MGI4MCksIFdUQzIoMHgzNWUwYjMwMCksIFdUQzIoMHgzNTg5YzE0MCksIAotICBXVEMyKDB4MzUzMzExODApLCBXVEMyKDB4MzRkYzdjODApLCBXVEMyKDB4MzQ4NWRjODApLCBXVEMyKDB4MzQyZjE2MDApLCBXVEMyKDB4MzNkODE3ODApLCBXVEMyKDB4MzM4MGQwYzApLCBXVEMyKDB4MzMyOTMxMDApLCBXVEMyKDB4MzJkMTE4MDApLCAKLSAgV1RDMigweDMyNzg1NzgwKSwgV1RDMigweDMyMWVjMGMwKSwgV1RDMigweDMxYzQyNjgwKSwgV1RDMigweDMxNjg4NWMwKSwgV1RDMigweDMxMGMwNTgwKSwgV1RDMigweDMwYWVjZWMwKSwgV1RDMigweDMwNTEwOTQwKSwgV1RDMigweDJmZjJiOGMwKSwgCi0gIFdUQzIoMHgyZjkzYmY0MCksIFdUQzIoMHgyZjMzZmMwMCksIFdUQzIoMHgyZWQzNTBjMCksIFdUQzIoMHgyZTcxYmE4MCksIFdUQzIoMHgyZTBmNTM0MCksIFdUQzIoMHgyZGFjMzVjMCksIFdUQzIoMHgyZDQ4N2M4MCksIFdUQzIoMHgyY2U0MzFjMCksIAotICBXVEMyKDB4MmM3ZjRmYzApLCBXVEMyKDB4MmMxOWQwODApLCBXVEMyKDB4MmJiM2FkODApLCBXVEMyKDB4MmI0Y2UwODApLCBXVEMyKDB4MmFlNTYzNDApLCBXVEMyKDB4MmE3ZDJmODApLCBXVEMyKDB4MmExNDNmMDApLCBXVEMyKDB4MjlhYThiNDApIAotfTsKKyAgICAvKiBwYXJ0IDAgKi8KKyAgICBXVEMwKDB4ZmFjNWE3NzApLCBXVEMwKDB4ZmFhZmJhYjgpLCBXVEMwKDB4ZmE5OTZhNDApLCBXVEMwKDB4ZmE4MmJiZDApLAorICAgIFdUQzAoMHhmYTZiYjUzOCksIFdUQzAoMHhmYTU0NWMzOCksIFdUQzAoMHhmYTNjYjY5OCksIFdUQzAoMHhmYTI0Y2EyOCksCisgICAgV1RDMCgweGZhMGM5Y2E4KSwgV1RDMCgweGY5ZjQzM2U4KSwgV1RDMCgweGY5ZGI5NTgwKSwgV1RDMCgweGY5YzJjMjk4KSwKKyAgICBXVEMwKDB4ZjlhOWI4MDApLCBXVEMwKDB4Zjk5MDcyNTApLCBXVEMwKDB4Zjk3NmVlMzgpLCBXVEMwKDB4Zjk1ZDJiODgpLAorICAgIFdUQzAoMHhmOTQzMmQxMCksIFdUQzAoMHhmOTI4ZjVjMCksIFdUQzAoMHhmOTBlODg2OCksIFdUQzAoMHhmOGYzZTQwMCksCisgICAgV1RDMCgweGY4ZDkwM2EwKSwgV1RDMCgweGY4YmRlMjM4KSwgV1RDMCgweGY4YTI3YWYwKSwgV1RDMCgweGY4ODZjZGU4KSwKKyAgICBXVEMwKDB4Zjg2YWUwMjApLCBXVEMwKDB4Zjg0ZWI2YzApLCBXVEMwKDB4ZjgzMjU2ZjgpLCBXVEMwKDB4ZjgxNWM0YjgpLAorICAgIFdUQzAoMHhmN2Y5MDJjMCksIFdUQzAoMHhmN2RjMTNiMCksIFdUQzAoMHhmN2JlZmE2MCksIFdUQzAoMHhmN2ExYmE0MCksCisgICAgV1RDMCgweGY3ODQ1N2MwKSwgV1RDMCgweGY3NjZkNzgwKSwgV1RDMCgweGY3NDkzZDkwKSwgV1RDMCgweGY3MmI4OTkwKSwKKyAgICBXVEMwKDB4ZjcwZGI1ZjApLCBXVEMwKDB4ZjZlZmJkMzApLCBXVEMwKDB4ZjZkMTlhMjApLCBXVEMwKDB4ZjZiMzUyZTApLAorICAgIFdUQzAoMHhmNjk0ZjhjMCksIFdUQzAoMHhmNjc2OWRhMCksIFdUQzAoMHhmNjU4NTMxMCksIFdUQzAoMHhmNjNhMjhkMCksCisgICAgV1RDMCgweGY2MWMyYzYwKSwgV1RDMCgweGY1ZmU2YjEwKSwgV1RDMCgweGY1ZTBmMjUwKSwgV1RDMCgweGY1YzNjZWIwKSwKKyAgICBXVEMwKDB4ZjVhNzBiZTApLCBXVEMwKDB4ZjU4YWI1YTApLCBXVEMwKDB4ZjU2ZWQ3YjApLCBXVEMwKDB4ZjU1MzdlNDApLAorICAgIFdUQzAoMHhmNTM4YjYxMCksIFdUQzAoMHhmNTFlOGJmMCksIFdUQzAoMHhmNTA1MGM5MCksIFdUQzAoMHhmNGVjNDMzMCksCisgICAgV1RDMCgweGY0ZDQzOWIwKSwgV1RDMCgweGY0YmNmOWIwKSwgV1RDMCgweGY0YTY4Y2UwKSwgV1RDMCgweGY0OTBmYTgwKSwKKyAgICBXVEMwKDB4ZjQ3YzQ3NjApLCBXVEMwKDB4ZjQ2ODc4MzApLCBXVEMwKDB4ZjQ1NThmMDApLCBXVEMwKDB4ZjQ0MzRmYzApLAorICAgIFdUQzAoMHhmNDMxNDA3MCksIFdUQzAoMHhmNDFlZTQ1MCksIFdUQzAoMHhmNDBiYzEzMCksIFdUQzAoMHhmM2Y3OTljMCksCisgICAgV1RDMCgweGYzZTI2ZDMwKSwgV1RDMCgweGYzY2MzZDcwKSwgV1RDMCgweGYzYjUwYzgwKSwgV1RDMCgweGYzOWNkZDYwKSwKKyAgICBXVEMwKDB4ZjM4M2I0NDApLCBXVEMwKDB4ZjM2OTk1NTApLCBXVEMwKDB4ZjM0ZTg0YzApLCBXVEMwKDB4ZjMzMjg2YjApLAorICAgIFdUQzAoMHhmMzE1OWYxMCksIFdUQzAoMHhmMmY3ZDFiMCksIFdUQzAoMHhmMmQ5MjI5MCksIFdUQzAoMHhmMmI5OTRkMCksCisgICAgV1RDMCgweGYyOTkyYWQwKSwgV1RDMCgweGYyNzdlNmQwKSwgV1RDMCgweGYyNTVjYjYwKSwgV1RDMCgweGYyMzJkZDAwKSwKKyAgICBXVEMwKDB4ZjIwZjIyNDApLCBXVEMwKDB4ZjFlYWExZDApLCBXVEMwKDB4ZjFjNTYyNDApLCBXVEMwKDB4ZjE5ZjYzZDApLAorICAgIFdUQzAoMHhmMTc4YTBmMCksIFdUQzAoMHhmMTUxMTNhMCksIFdUQzAoMHhmMTI4YjVjMCksIFdUQzAoMHhmMGZmN2ZkMCksCisgICAgV1RDMCgweGYwZDU2ODYwKSwgV1RDMCgweGYwYWE2NjEwKSwgV1RDMCgweGYwN2U2ZmQwKSwgV1RDMCgweGYwNTE4MTkwKSwKKyAgICBXVEMwKDB4ZjAyMzljZDApLCBXVEMwKDB4ZWZmNGMzMjApLCBXVEMwKDB4ZWZjNGY3MjApLCBXVEMwKDB4ZWY5NDUwODApLAorICAgIFdUQzAoMHhlZjYyZmNlMCksIFdUQzAoMHhlZjMxMmE0MCksIFdUQzAoMHhlZWZmMDVjMCksIFdUQzAoMHhlZWNjYTJjMCksCisgICAgV1RDMCgweGVlOTlmYWEwKSwgV1RDMCgweGVlNjcwNWEwKSwgV1RDMCgweGVlMzNiYjYwKSwgV1RDMCgweGVlMDAwMDYwKSwKKyAgICBXVEMwKDB4ZWRjYmE2NjApLCBXVEMwKDB4ZWQ5NjdlODApLCBXVEMwKDB4ZWQ2MDViODApLCBXVEMwKDB4ZWQyOTNiNDApLAorICAgIFdUQzAoMHhlY2YxNDZhMCksIFdUQzAoMHhlY2I4YThhMCksIFdUQzAoMHhlYzdmOGJjMCksIFdUQzAoMHhlYzQ2MTI2MCksCisgICAgV1RDMCgweGVjMGM1NzIwKSwgV1RDMCgweGViZDI3NDQwKSwgV1RDMCgweGViOTg4MjIwKSwgV1RDMCgweGViNWU3MDQwKSwKKyAgICBXVEMwKDB4ZWIyNDA0YzApLCBXVEMwKDB4ZWFlOTA0NDApLCBXVEMwKDB4ZWFhZDMzYzApLCBXVEMwKDB4ZWE3MDY2YzApLAorICAgIFdUQzAoMHhlYTMyN2Y2MCksIFdUQzAoMHhlOWYzNjAwMCksIFdUQzAoMHhlOWIyZWQ2MCksIFdUQzAoMHhlOTcxMzkyMCksCisgICAgV1RDMCgweGU5MmU4MWUwKSwgV1RDMCgweGU4ZWIwOGMwKSwgV1RDMCgweGU4YTcwZTYwKSwgV1RDMCgweGU4NjJkOGUwKSwKKyAgICBXVEMwKDB4ZTgxZWIzNDApLCBXVEMwKDB4ZTdkYWU4YTApLCBXVEMwKDB4ZTc5N2MxYTApLCBXVEMwKDB4ZTc1NTRjYTApLAorICAgIFdUQzAoMHhlNzEzNWRjMCksIFdUQzAoMHhlNmQxYzZhMCksIFdUQzAoMHhlNjkwNTcyMCksIFdUQzAoMHhlNjRlYjljMCksCisgICAgV1RDMCgweGU2MGM3MzAwKSwgV1RDMCgweGU1YzkwNjAwKSwgV1RDMCgweGU1ODNmOTIwKSwgV1RDMCgweGU1M2QxY2UwKSwKKyAgICBXVEMwKDB4ZTRmNDhjODApLCBXVEMwKDB4ZTRhYTY2NDApLCBXVEMwKDB4ZTQ1ZWNhYTApLCBXVEMwKDB4ZTQxMjBiZTApLAorICAgIFdUQzAoMHhlM2M0YWU2MCksIFdUQzAoMHhlMzc3Mzg2MCksIFdUQzAoMHhlMzJhMmVhMCksIFdUQzAoMHhlMmRkZWVhMCksCisgICAgV1RDMCgweGUyOTJhZjAwKSwgV1RDMCgweGUyNDhhNGEwKSwgV1RDMCgweGUyMDAwMTQwKSwgV1RDMCgweGUxYjhiNjQwKSwKKyAgICBXVEMwKDB4ZTE3Mjc0NDApLCBXVEMwKDB4ZTEyY2U5MDApLCBXVEMwKDB4ZTBlN2MyODApLCBXVEMwKDB4ZTBhMmI0MjApLAorICAgIFdUQzAoMHhlMDVkNzZjMCksIFdUQzAoMHhlMDE3YzM2MCksIFdUQzAoMHhkZmQxNTQ0MCksIFdUQzAoMHhkZjhhMDU0MCksCisgICAgV1RDMCgweGRmNDFkMzAwKSwgV1RDMCgweGRlZjhiYjQwKSwgV1RDMCgweGRlYWViZDQwKSwgV1RDMCgweGRlNjNlN2MwKSwKKyAgICBXVEMwKDB4ZGUxODU5NDApLCBXVEMwKDB4ZGRjYzMxODApLCBXVEMwKDB4ZGQ3ZjkwMDApLCBXVEMwKDB4ZGQzMjllODApLAorICAgIFdUQzAoMHhkY2U1OGU4MCksIFdUQzAoMHhkYzk4OTMwMCksIFdUQzAoMHhkYzRiZGU0MCksIFdUQzAoMHhkYmZmOTZjMCksCisgICAgV1RDMCgweGRiYjNkNzgwKSwgV1RDMCgweGRiNjhiYjgwKSwgV1RDMCgweGRiMWU1YzgwKSwgV1RDMCgweGRhZDRjMzgwKSwKKyAgICBXVEMwKDB4ZGE4YmU4NDApLCBXVEMwKDB4ZGE0M2MxYzApLCBXVEMwKDB4ZDlmYzQ3NDApLCBXVEMwKDB4ZDliNTY2NDApLAorICAgIFdUQzAoMHhkOTZmMDQ0MCksIFdUQzAoMHhkOTI5MDYwMCksIFdUQzAoMHhkOGUzNTA4MCksIFdUQzAoMHhkODlkY2Q0MCksCisgICAgV1RDMCgweGQ4NTg2YjQwKSwgV1RDMCgweGQ4MTMxOTQwKSwgV1RDMCgweGQ3Y2RjNjQwKSwgV1RDMCgweGQ3ODg2MTgwKSwKKyAgICBXVEMwKDB4ZDc0MmRjODApLCBXVEMwKDB4ZDZmZDI3ODApLCBXVEMwKDB4ZDZiNzM0MDApLCBXVEMwKDB4ZDY3MGZkODApLAorICAgIFdUQzAoMHhkNjJhOGE0MCksIFdUQzAoMHhkNWUzZTA4MCksIFdUQzAoMHhkNTlkMDg0MCksIFdUQzAoMHhkNTU2MmI4MCksCisgICAgV1RDMCgweGQ1MGY5NTQwKSwgV1RDMCgweGQ0Yzk5MmMwKSwgV1RDMCgweGQ0ODQ2ZjgwKSwgV1RDMCgweGQ0NDA1YTgwKSwKKyAgICBXVEMwKDB4ZDNmZDY1ODApLCBXVEMwKDB4ZDNiYmExNDApLCBXVEMwKDB4ZDM3YjFjODApLCBXVEMwKDB4ZDMzYmI3ODApLAorICAgIFdUQzAoMHhkMmZkMjQwMCksIFdUQzAoMHhkMmJmMTI0MCksIFdUQzAoMHhkMjgxMzMwMCksIFdUQzAoMHhkMjQzNWFjMCksCisgICAgV1RDMCgweGQyMDU3ZmMwKSwgV1RDMCgweGQxYzc5YTAwKSwgV1RDMCgweGQxODlhMjQwKSwgV1RDMCgweGQxNGI5ZGMwKSwKKyAgICBXVEMwKDB4ZDEwZDllMDApLCBXVEMwKDB4ZDBjZmI1ODApLCBXVEMwKDB4ZDA5MWY2YzApLCBXVEMwKDB4ZDA1NDgxMDApLAorICAgIFdUQzAoMHhkMDE3N2Y0MCksIFdUQzAoMHhjZmRiMWNjMCksIFdUQzAoMHhjZjlmODRjMCksIFdUQzAoMHhjZjY0ZDc4MCksCisgICAgV1RDMCgweGNmMmIyYjAwKSwgV1RDMCgweGNlZjI5NDQwKSwgV1RDMCgweGNlYmIyNjQwKSwgV1RDMCgweGNlODRjMDAwKSwKKyAgICBXVEMwKDB4Y2U0ZjBiYzApLCBXVEMwKDB4Y2UxOWIyMDApLCBXVEMwKDB4Y2RlNDVkNDApLCBXVEMwKDB4Y2RhZWVkYzApLAorICAgIFdUQzAoMHhjZDc5NzljMCksIFdUQzAoMHhjZDQ0MTljMCksIFdUQzAoMHhjZDBlZTZjMCksIFdUQzAoMHhjY2RhMDU0MCksCisgICAgV1RDMCgweGNjYTVhNTAwKSwgV1RDMCgweGNjNzFmNjQwKSwgV1RDMCgweGNjM2YyODAwKSwgV1RDMCgweGNjMGQ0MzAwKSwKKyAgICBXVEMwKDB4Y2JkYzJhMDApLCBXVEMwKDB4Y2JhYmJlODApLCBXVEMwKDB4Y2I3YmUyMDApLCBXVEMwKDB4Y2I0YzgyMDApLAorICAgIFdUQzAoMHhjYjFkOTgwMCksIFdUQzAoMHhjYWVmMWQ0MCksIFdUQzAoMHhjYWMxMGJjMCksIFdUQzAoMHhjYTkzNjQ0MCksCisgICAgV1RDMCgweGNhNjYyZDAwKSwgV1RDMCgweGNhMzk2ZDQwKSwgV1RDMCgweGNhMGQyYjgwKSwgV1RDMCgweGM5ZTE2ZjgwKSwKKyAgICBXVEMwKDB4YzliNjNmODApLCBXVEMwKDB4Yzk4YmEyYzApLCBXVEMwKDB4Yzk2MWEwMDApLCBXVEMwKDB4YzkzODNlYzApLAorICAgIFdUQzAoMHhjOTBhMDQ0MCksIFdUQzAoMHhjOGUwZDI4MCksIFdUQzAoMHhjOGI3M2I4MCksIFdUQzAoMHhjODhkNDkwMCksCisgICAgV1RDMCgweGM4NjMwNGMwKSwgV1RDMCgweGM4Mzg3OGMwKSwgV1RDMCgweGM4MGRhZTgwKSwgV1RDMCgweGM3ZTJhZmMwKSwKKyAgICBXVEMwKDB4YzdiNzg2NDApLCBXVEMwKDB4Yzc4YzNjNDApLCBXVEMwKDB4Yzc2MGRhODApLCBXVEMwKDB4YzczNTY2NDApLAorICAgIFdUQzAoMHhjNzA5ZGU0MCksIFdUQzAoMHhjNmRlNDFjMCksIFdUQzAoMHhjNmIyOGZjMCksIFdUQzAoMHhjNjg2YmQ0MCksCisgICAgV1RDMCgweGM2NWFiNjAwKSwgV1RDMCgweGM2MmU2NTgwKSwgV1RDMCgweGM2MDFiODgwKSwgV1RDMCgweGM1ZDRiYWMwKSwKKyAgICBXVEMwKDB4YzVhNzk2NDApLCBXVEMwKDB4YzU3YTc2YzApLCBXVEMwKDB4YzU0ZDg3ODApLCBXVEMwKDB4YzUyMGU4NDApLAorICAgIFdUQzAoMHhjNGY0YWNjMCksIFdUQzAoMHhjNGM4ZTg4MCksIFdUQzAoMHhjNDlkYWQ4MCksIFdUQzAoMHhjNDcyZTY0MCksCisgICAgV1RDMCgweGM0NDg1NmMwKSwgV1RDMCgweGM0MWRjMTQwKSwgV1RDMCgweGMzZjJlOTQwKSwgV1RDMCgweGMzYzdiYzAwKSwKKyAgICBXVEMwKDB4YzM5YzRmMDApLCBXVEMwKDB4YzM3MGI5YzApLCBXVEMwKDB4YzM0NTEzYzApLCBXVEMwKDB4YzMxOTc5NDApLAorICAgIFdUQzAoMHhjMmVlMGEwMCksIFdUQzAoMHhjMmMyZTY0MCksIFdUQzAoMHhjMjk4MmQ4MCksIFdUQzAoMHhjMjZkZjVjMCksCisgICAgV1RDMCgweGMyNDQ0YjAwKSwgV1RDMCgweGMyMWIzOTQwKSwgV1RDMCgweGMxZjJjYmMwKSwgV1RDMCgweGMxY2IwNWMwKSwKKyAgICBXVEMwKDB4YzFhM2UzNDApLCBXVEMwKDB4YzE3ZDVmMDApLCBXVEMwKDB4YzE1NzczYzApLCBXVEMwKDB4YzEzMjA5NDApLAorICAgIFdUQzAoMHhjMTBjZjQ4MCksIFdUQzAoMHhjMGU4MGEwMCksIFdUQzAoMHhjMGMzMWYwMCksIFdUQzAoMHhjMDllMjY0MCksCisgICAgV1RDMCgweGMwNzkyZWMwKSwgV1RDMCgweGMwNTQ0OTQwKSwgV1RDMCgweGMwMmY4NmMwKSwgV1RDMCgweGMwMGIwNGMwKSwKKyAgICBXVEMwKDB4YmZlNmVkMDEpLCBXVEMwKDB4YmZjMzZhMDEpLCBXVEMwKDB4YmZhMGE1ODEpLCBXVEMwKDB4YmY3ZWI1ODEpLAorICAgIFdUQzAoMHhiZjVkOWE4MSksIFdUQzAoMHhiZjNkNTUwMSksIFdUQzAoMHhiZjFkZTYwMSksIFdUQzAoMHhiZWZmNDgwMSksCisgICAgV1RDMCgweGJlZTE3MjAxKSwgV1RDMCgweGJlYzQ1ODgxKSwgV1RDMCgweGJlYTdmMzAxKSwgV1RDMCgweGJlOGMzNzgxKSwKKyAgICBXVEMwKDB4YmU3MTIwMDEpLCBXVEMwKDB4YmU1NmEzODEpLCBXVEMwKDB4YmUzY2JjMDEpLCBXVEMwKDB4YmUyMzYwMDEpLAorICAgIFdUQzAoMHhiZTBhODU4MSksIFdUQzAoMHhiZGYyMjE4MSksIFdUQzAoMHhiZGRhMmEwMSksIFdUQzAoMHhiZGMyOWE4MSksCisgICAgV1RDMCgweGJkYWI3MTgxKSwgV1RDMCgweGJkOTRiMDAxKSwgV1RDMCgweGJkN2U1NTgxKSwgV1RDMCgweGJkNjg2NjgxKSwKKyAgICBXVEMwKDB4YmQ1MmViMDEpLCBXVEMwKDB4YmQzZGViODEpLCBXVEMwKDB4YmQyOTcxODEpLCBXVEMwKDB4YmQxNTg4MDEpLAorICAgIFdUQzAoMHhiZDAyM2YwMSksIFdUQzAoMHhiY2VmYTYwMSksIFdUQzAoMHhiY2RkY2M4MSksIFdUQzAoMHhiY2NjYmQwMSksCisgICAgV1RDMCgweGJjYmM3ZTAxKSwgV1RDMCgweGJjYWQxNTAxKSwgV1RDMCgweGJjOWU4ODAxKSwgV1RDMCgweGJjOTBkNDgxKSwKKyAgICBXVEMwKDB4YmM4M2YyMDEpLCBXVEMwKDB4YmM3N2Q2MDEpLCBXVEMwKDB4YmM2Yzc3ODEpLCBXVEMwKDB4YmM2MWM0MDEpLAorICAgIFdUQzAoMHhiYzU3YTMwMSksIFdUQzAoMHhiYzRkZmI4MSksIFdUQzAoMHhiYzQ0YjQ4MSksIFdUQzAoMHhiYzNiYmMwMSksCisgICAgV1RDMCgweGJjMzMwNzgxKSwgV1RDMCgweGJjMmE4YzgxKSwgV1RDMCgweGJjMjI0MTgxKSwgV1RDMCgweGJjMWEyNDAxKSwKKyAgICBXVEMwKDB4YmMxMjNiODEpLCBXVEMwKDB4YmMwYThmMDEpLCBXVEMwKDB4YmMwMzI2MDEpLCBXVEMwKDB4YmJmYzBmODEpLAorICAgIFdUQzAoMHhiYmY1NjE4MSksIFdUQzAoMHhiYmVmMzMwMSksIFdUQzAoMHhiYmU5OTk4MSksIFdUQzAoMHhiYmU0OWQwMSksCisgICAgV1RDMCgweGJiZTAzODAxKSwgV1RDMCgweGJiZGM2NDgxKSwgV1RDMCgweGJiZDkxYjgxKSwgV1RDMCgweGJiZDY0ZDAxKSwKKyAgICBXVEMwKDB4YmJkM2UxMDEpLCBXVEMwKDB4YmJkMWJkODEpLCBXVEMwKDB4YmJjZmNhODEpLCBXVEMwKDB4YmJjZTA2MDEpLAorICAgIFdUQzAoMHhiYmNjODIwMSksIFdUQzAoMHhiYmNiNTMwMSksIFdUQzAoMHhiYmNhOGQwMSksIFdUQzAoMHhiYmNhNTA4MSksCisgICAgV1RDMCgweGJiY2FjYTAxKSwgV1RDMCgweGJiY2MyNjgxKSwgV1RDMCgweGJiY2U5MTgxKSwgV1RDMCgweGJiZDIxMjgxKSwKKyAgICBXVEMwKDB4YmJkNjhjODEpLCBXVEMwKDB4YmJkYmUyMDEpLCBXVEMwKDB4YmJlMWY0MDEpLCBXVEMwKDB4YmJlODk5MDEpLAorICAgIFdUQzAoMHhiYmVmOWI4MSksIFdUQzAoMHhiYmY2YzYwMSksIFdUQzAoMHhiYmZkZTQ4MSksIFdUQzAoMHhiYzA0ZTM4MSksCisgICAgV1RDMCgweGJjMGJjZjgxKSwgV1RDMCgweGJjMTJiODAxKSwgV1RDMCgweGJjMTlhYjAxKSwgV1RDMCgweGJjMjBhZTAxKSwKKyAgICBXVEMwKDB4YmMyN2JkODEpLCBXVEMwKDB4YmMyZWQ2ODEpLCBXVEMwKDB4YmMzNWY1MDEpLCBXVEMwKDB4YmMzZDE4MDEpLAorICAgIFdUQzAoMHhiYzQ0NDA4MSksIFdUQzAoMHhiYzRiNmU4MSksIFdUQzAoMHhiYzUyYTM4MSksIFdUQzAoMHhiYzU5ZGY4MSksCisgICAgV1RDMCgweGJjNjEyMzAxKSwgV1RDMCgweGJjNjg2ZTAxKSwgV1RDMCgweGJjNmZjMTAxKSwgV1RDMCgweGJjNzcxYzAxKSwKKyAgICBXVEMwKDB4YmM3ZTdlMDEpLCBXVEMwKDB4YmM4NWU4MDEpLCBXVEMwKDB4YmM4ZDU5MDEpLCBXVEMwKDB4YmM5NGQyMDEpLAorICAgIFdUQzAoMHhiYzljNTI4MSksIFdUQzAoMHhiY2EzZGIwMSksIFdUQzAoMHhiY2FiNmMwMSksIFdUQzAoMHhiY2IzMDYwMSksCisgICAgV1RDMCgweGJjYmFhODAxKSwgV1RDMCgweGJjYzI1MTgxKSwgV1RDMCgweGJjY2EwMzAxKSwgV1RDMCgweGJjZDFiYjgxKSwKKyAgICBXVEMwKDB4YmNkOTdjODEpLCBXVEMwKDB4YmNlMTQ2MDEpLCBXVEMwKDB4YmNlOTE4MDEpLCBXVEMwKDB4YmNmMGYzODEpLAorICAgIFdUQzAoMHhiY2Y4ZDc4MSksIFdUQzAoMHhiZDAwYzM4MSksIFdUQzAoMHhiZDA4Yjc4MSksIFdUQzAoMHhiZDEwYjM4MSksCisgICAgV1RDMCgweGJkMThiNzgxKSwgV1RDMCgweGJkMjBjNDAxKSwgV1RDMCgweGJkMjhkOTgxKSwgV1RDMCgweGJkMzBmODgxKSwKKyAgICBXVEMwKDB4YmQzOTFmODEpLCBXVEMwKDB4YmQ0MTRmMDEpLCBXVEMwKDB4YmQ0OTg2MDEpLCBXVEMwKDB4YmQ1MWM0ODEpLAorICAgIFdUQzAoMHhiZDVhMGIwMSksIFdUQzAoMHhiZDYyNTk4MSksIFdUQzAoMHhiZDZhYjEwMSksIFdUQzAoMHhiZDczMTA4MSksCisgICAgV1RDMCgweGJkN2I3NzgxKSwgV1RDMCgweGJkODNlNjgxKSwgV1RDMCgweGJkOGM1YzAxKSwgV1RDMCgweGJkOTRkODAxKSwKKyAgICBXVEMwKDB4YmQ5ZDViODEpLCBXVEMwKDB4YmRhNWU2MDEpLCBXVEMwKDB4YmRhZTc4ODEpLCBXVEMwKDB4YmRiNzEyMDEpLAorICAgIFdUQzAoMHhiZGJmYjI4MSksIFdUQzAoMHhiZGM4NTk4MSksIFdUQzAoMHhiZGQxMDY4MSksIFdUQzAoMHhiZGQ5Yjk4MSksCisgICAgV1RDMCgweGJkZTI3MjAxKSwgV1RDMCgweGJkZWIzMTAxKSwgV1RDMCgweGJkZjNmNzAxKSwgV1RDMCgweGJkZmNjMzAxKSwKKyAgICBXVEMwKDB4YmUwNTk0ODEpLCBXVEMwKDB4YmUwZTZjMDEpLCBXVEMwKDB4YmUxNzQ3ODEpLCBXVEMwKDB4YmUyMDI4MDEpLAorICAgIFdUQzAoMHhiZTI5MGQwMSksIFdUQzAoMHhiZTMxZjcwMSksIFdUQzAoMHhiZTNhZTYwMSksIFdUQzAoMHhiZTQzZGE4MSksCisgICAgV1RDMCgweGJlNGNkMzgxKSwgV1RDMCgweGJlNTVkMDAxKSwgV1RDMCgweGJlNWVkMDgxKSwgV1RDMCgweGJlNjdkMzgxKSwKKyAgICBXVEMwKDB4YmU3MGRhMDEpLCBXVEMwKDB4YmU3OWU0ODEpLCBXVEMwKDB4YmU4MmYzMDEpLCBXVEMwKDB4YmU4YzA1MDEpLAorICAgIFdUQzAoMHhiZTk1MWE4MSksIFdUQzAoMHhiZTllMzI4MSksIFdUQzAoMHhiZWE3NGM4MSksIFdUQzAoMHhiZWIwNjg4MSksCisgICAgV1RDMCgweGJlYjk4NjgxKSwgV1RDMCgweGJlYzJhNzgxKSwgV1RDMCgweGJlY2JjYTgxKSwgV1RDMCgweGJlZDRmMDgxKSwKKyAgICBXVEMwKDB4YmVkZTE5MDEpLCBXVEMwKDB4YmVlNzQyODEpLCBXVEMwKDB4YmVmMDZkMDEpLCBXVEMwKDB4YmVmOTk5MDEpLAorICAgIFdUQzAoMHhiZjAyYzU4MSksIFdUQzAoMHhiZjBiZjM4MSksIFdUQzAoMHhiZjE1MjM4MSksIFdUQzAoMHhiZjFlNTUwMSksCisgICAgV1RDMCgweGJmMjc4ODAxKSwgV1RDMCgweGJmMzBiYjAxKSwgV1RDMCgweGJmMzllZTgxKSwgV1RDMCgweGJmNDMyMjgxKSwKKyAgICBXVEMwKDB4YmY0YzU2ODEpLCBXVEMwKDB4YmY1NThiMDEpLCBXVEMwKDB4YmY1ZWMxMDEpLCBXVEMwKDB4YmY2N2Y4MDEpLAorICAgIFdUQzAoMHhiZjcxMmYwMSksIFdUQzAoMHhiZjdhNjY4MSksIFdUQzAoMHhiZjgzOWQ4MSksIFdUQzAoMHhiZjhjZDQ4MSksCisgICAgV1RDMCgweGJmOTYwYjAxKSwgV1RDMCgweGJmOWY0MTgxKSwgV1RDMCgweGJmYTg3OTAxKSwgV1RDMCgweGJmYjFiMTAxKSwKKyAgICBXVEMwKDB4YmZiYWU5ODEpLCBXVEMwKDB4YmZjNDIyMDEpLCBXVEMwKDB4YmZjZDVhMDEpLCBXVEMwKDB4YmZkNjkxMDEpLAorICAgIFdUQzAoMHhiZmRmYzc4MSksIFdUQzAoMHhiZmU4ZmMwMSksIFdUQzAoMHhiZmYyMmY4MSksIFdUQzAoMHhiZmZiNjA4MSksCisgICAgLyogcGFydCAxICovCisgICAgV1RDMSgweDgwMDkzZTAxKSwgV1RDMSgweDgwMWI5YjAxKSwgV1RDMSgweDgwMmRmNzAxKSwgV1RDMSgweDgwNDA1MTAxKSwKKyAgICBXVEMxKDB4ODA1MmE4ODEpLCBXVEMxKDB4ODA2NGZjODEpLCBXVEMxKDB4ODA3NzRjODEpLCBXVEMxKDB4ODA4OTk4ODEpLAorICAgIFdUQzEoMHg4MDliZGYwMSksIFdUQzEoMHg4MGFlMWY4MSksIFdUQzEoMHg4MGMwNWEwMSksIFdUQzEoMHg4MGQyOGQ4MSksCisgICAgV1RDMSgweDgwZTRiYjgxKSwgV1RDMSgweDgwZjZlNDgxKSwgV1RDMSgweDgxMDkwOTgxKSwgV1RDMSgweDgxMWIyOTgxKSwKKyAgICBXVEMxKDB4ODEyZDQ0ODEpLCBXVEMxKDB4ODEzZjU5ODEpLCBXVEMxKDB4ODE1MTY3MDEpLCBXVEMxKDB4ODE2MzZkODEpLAorICAgIFdUQzEoMHg4MTc1NmQ4MSksIFdUQzEoMHg4MTg3Njc4MSksIFdUQzEoMHg4MTk5NWMwMSksIFdUQzEoMHg4MWFiNGIwMSksCisgICAgV1RDMSgweDgxYmQzNDAxKSwgV1RDMSgweDgxY2YxNTgxKSwgV1RDMSgweDgxZTBlZTgxKSwgV1RDMSgweDgxZjJiZjgxKSwKKyAgICBXVEMxKDB4ODIwNDg4ODEpLCBXVEMxKDB4ODIxNjRhODEpLCBXVEMxKDB4ODIyODA1ODEpLCBXVEMxKDB4ODIzOWI5ODEpLAorICAgIFdUQzEoMHg4MjRiNjYwMSksIFdUQzEoMHg4MjVkMDkwMSksIFdUQzEoMHg4MjZlYTIwMSksIFdUQzEoMHg4MjgwMzEwMSksCisgICAgV1RDMSgweDgyOTFiNjAxKSwgV1RDMSgweDgyYTMzMjgxKSwgV1RDMSgweDgyYjRhNjAxKSwgV1RDMSgweDgyYzYxMTAxKSwKKyAgICBXVEMxKDB4ODJkNzcyMDEpLCBXVEMxKDB4ODJlOGM4MDEpLCBXVEMxKDB4ODJmYTExODEpLCBXVEMxKDB4ODMwYjRmODEpLAorICAgIFdUQzEoMHg4MzFjODEwMSksIFdUQzEoMHg4MzJkYTc4MSksIFdUQzEoMHg4MzNlYzM4MSksIFdUQzEoMHg4MzRmZDQ4MSksCisgICAgV1RDMSgweDgzNjBkOTAxKSwgV1RDMSgweDgzNzFkMDgxKSwgV1RDMSgweDgzODJiYTAxKSwgV1RDMSgweDgzOTM5NTAxKSwKKyAgICBXVEMxKDB4ODNhNDYxODEpLCBXVEMxKDB4ODNiNTIxMDEpLCBXVEMxKDB4ODNjNWQzODEpLCBXVEMxKDB4ODNkNjc4ODEpLAorICAgIFdUQzEoMHg4M2U3MGYwMSksIFdUQzEoMHg4M2Y3OTY4MSksIFdUQzEoMHg4NDA4MGQ4MSksIFdUQzEoMHg4NDE4NzQwMSksCisgICAgV1RDMSgweDg0MjhjYTAxKSwgV1RDMSgweDg0MzkxMDgxKSwgV1RDMSgweDg0NDk0ODgxKSwgV1RDMSgweDg0NTk3MDgxKSwKKyAgICBXVEMxKDB4ODQ2OTg4ODEpLCBXVEMxKDB4ODQ3OThmODEpLCBXVEMxKDB4ODQ4OTg0ODEpLCBXVEMxKDB4ODQ5OTY3MDEpLAorICAgIFdUQzEoMHg4NGE5MzgwMSksIFdUQzEoMHg4NGI4ZjgwMSksIFdUQzEoMHg4NGM4YTcwMSksIFdUQzEoMHg4NGQ4NDYwMSksCisgICAgV1RDMSgweDg0ZTdkMzgxKSwgV1RDMSgweDg0Zjc0ZTAxKSwgV1RDMSgweDg1MDZiNTgxKSwgV1RDMSgweDg1MTYwOTgxKSwKKyAgICBXVEMxKDB4ODUyNTRhODEpLCBXVEMxKDB4ODUzNDc5MDEpLCBXVEMxKDB4ODU0Mzk2MDEpLCBXVEMxKDB4ODU1MmExODEpLAorICAgIFdUQzEoMHg4NTYxOWEwMSksIFdUQzEoMHg4NTcwN2Y4MSksIFdUQzEoMHg4NTdmNTEwMSksIFdUQzEoMHg4NThlMGUwMSksCisgICAgV1RDMSgweDg1OWNiNzgxKSwgV1RDMSgweDg1YWI0ZjAxKSwgV1RDMSgweDg1YjlkNDgxKSwgV1RDMSgweDg1Yzg0ODAxKSwKKyAgICBXVEMxKDB4ODVkNmE5ODEpLCBXVEMxKDB4ODVlNGY4MDEpLCBXVEMxKDB4ODVmMzMyODEpLCBXVEMxKDB4ODYwMTU5ODEpLAorICAgIFdUQzEoMHg4NjBmNmUwMSksIFdUQzEoMHg4NjFkNzA4MSksIFdUQzEoMHg4NjJiNjIwMSksIFdUQzEoMHg4NjM5NDMwMSksCisgICAgV1RDMSgweDg2NDcxMjgxKSwgV1RDMSgweDg2NTRkMDAxKSwgV1RDMSgweDg2NjI3YjAxKSwgV1RDMSgweDg2NzAxMzgxKSwKKyAgICBXVEMxKDB4ODY3ZDlhODEpLCBXVEMxKDB4ODY4YjEwMDEpLCBXVEMxKDB4ODY5ODc1ODEpLCBXVEMxKDB4ODZhNWNhODEpLAorICAgIFdUQzEoMHg4NmIzMGYwMSksIFdUQzEoMHg4NmMwNDM4MSksIFdUQzEoMHg4NmNkNjY4MSksIFdUQzEoMHg4NmRhNzkwMSksCisgICAgV1RDMSgweDg2ZTc3YjgxKSwgV1RDMSgweDg2ZjQ2ZDgxKSwgV1RDMSgweDg3MDE0ZjgxKSwgV1RDMSgweDg3MGUyMzAxKSwKKyAgICBXVEMxKDB4ODcxYWU5ODEpLCBXVEMxKDB4ODcyN2EzODEpLCBXVEMxKDB4ODczNDUzODEpLCBXVEMxKDB4ODc0MGY2ODEpLAorICAgIFdUQzEoMHg4NzRkODY4MSksIFdUQzEoMHg4NzU5ZmQwMSksIFdUQzEoMHg4NzY2NTQ4MSksIFdUQzEoMHg4NzcyOTcwMSksCisgICAgV1RDMSgweDg3N2VkZTAxKSwgV1RDMSgweDg3OGI0MzAxKSwgV1RDMSgweDg3OTdkZDgxKSwgV1RDMSgweDg3YTQ4YjAxKSwKKyAgICBXVEMxKDB4ODdiMGVmMDEpLCBXVEMxKDB4ODdiY2FiODEpLCBXVEMxKDB4ODdjNzYyMDEpLCBXVEMxKDB4ODdkMGNhODEpLAorICAgIFdUQzEoMHg4N2ZkZDc4MSksIFdUQzEoMHg4ODFkZDMwMSksIFdUQzEoMHg4ODQyMzMwMSksIFdUQzEoMHg4ODZhOGE4MSksCisgICAgV1RDMSgweDg4OTYyOTgxKSwgV1RDMSgweDg4YzQ1ZTgxKSwgV1RDMSgweDg4ZjQ3OTAxKSwgV1RDMSgweDg5MjVmMTAxKSwKKyAgICBXVEMxKDB4ODk1ODY5MDEpLCBXVEMxKDB4ODk4YjgzMDEpLCBXVEMxKDB4ODliZWU1ODEpLCBXVEMxKDB4ODlmMjYxMDEpLAorICAgIFdUQzEoMHg4YTI1ZjMwMSksIFdUQzEoMHg4YTU5OWE4MSksIFdUQzEoMHg4YThkNTgwMSksIFdUQzEoMHg4YWMxMzM4MSksCisgICAgV1RDMSgweDhhZjUzZTgxKSwgV1RDMSgweDhiMjk4YjgxKSwgV1RDMSgweDhiNWUyYzgxKSwgV1RDMSgweDhiOTMzMDAxKSwKKyAgICBXVEMxKDB4OGJjOGE0MDEpLCBXVEMxKDB4OGJmZTk0MDEpLCBXVEMxKDB4OGMzNTBkMDEpLCBXVEMxKDB4OGM2YzFiMDEpLAorICAgIFdUQzEoMHg4Y2EzY2IwMSksIFdUQzEoMHg4Y2RjMjkwMSksIFdUQzEoMHg4ZDE1NDA4MSksIFdUQzEoMHg4ZDRmMWIwMSksCisgICAgV1RDMSgweDhkODliZTgxKSwgV1RDMSgweDhkYzUzMDAxKSwgV1RDMSgweDhlMDE3NTgxKSwgV1RDMSgweDhlM2U5NDgxKSwKKyAgICBXVEMxKDB4OGU3YzkzMDEpLCBXVEMxKDB4OGViYjc1ODEpLCBXVEMxKDB4OGVmYjQxODEpLCBXVEMxKDB4OGYzYmZiMDEpLAorICAgIFdUQzEoMHg4ZjdkYTQwMSksIFdUQzEoMHg4ZmMwM2YwMSksIFdUQzEoMHg5MDAzY2U4MSksIFdUQzEoMHg5MDQ4NTQwMSksCisgICAgV1RDMSgweDkwOGRkMTAxKSwgV1RDMSgweDkwZDQ0NzgxKSwgV1RDMSgweDkxMWJiOTgxKSwgV1RDMSgweDkxNjQyNzgxKSwKKyAgICBXVEMxKDB4OTFhZDkyODEpLCBXVEMxKDB4OTFmN2Y5ODEpLCBXVEMxKDB4OTI0MzVkMDEpLCBXVEMxKDB4OTI4ZmJlMDEpLAorICAgIFdUQzEoMHg5MmRkMWIwMSksIFdUQzEoMHg5MzJiNzUwMSksIFdUQzEoMHg5MzdhY2IwMSksIFdUQzEoMHg5M2NiMWM4MSksCisgICAgV1RDMSgweDk0MWM2OTAxKSwgV1RDMSgweDk0NmVhZjgxKSwgV1RDMSgweDk0YzFlZTAxKSwgV1RDMSgweDk1MTYyMzgxKSwKKyAgICBXVEMxKDB4OTU2YjRmODEpLCBXVEMxKDB4OTVjMTcwODEpLCBXVEMxKDB4OTYxODg1MDEpLCBXVEMxKDB4OTY3MDhiODEpLAorICAgIFdUQzEoMHg5NmM5ODM4MSksIFdUQzEoMHg5NzIzNmIwMSksIFdUQzEoMHg5NzdlNDE4MSksIFdUQzEoMHg5N2RhMDQ4MSksCisgICAgV1RDMSgweDk4MzZiMjAxKSwgV1RDMSgweDk4OTQ0OTAxKSwgV1RDMSgweDk4ZjJjNjAxKSwgV1RDMSgweDk5NTIyODAxKSwKKyAgICBXVEMxKDB4OTliMjZjODEpLCBXVEMxKDB4OWExMzkxMDEpLCBXVEMxKDB4OWE3NTkzMDEpLCBXVEMxKDB4OWFkODcwODEpLAorICAgIFdUQzEoMHg5YjNjMjgwMSksIFdUQzEoMHg5YmEwYjcwMSksIFdUQzEoMHg5YzA2MWI4MSksIFdUQzEoMHg5YzZjNTQ4MSksCisgICAgV1RDMSgweDljZDM1ZjgxKSwgV1RDMSgweDlkM2IzYjgxKSwgV1RDMSgweDlkYTNlNjAxKSwgV1RDMSgweDllMGQ1ZTAxKSwKKyAgICBXVEMxKDB4OWU3NzlmODEpLCBXVEMxKDB4OWVlMmE5MDEpLCBXVEMxKDB4OWY0ZTc4MDEpLCBXVEMxKDB4OWZiYjA5ODEpLAorICAgIFdUQzEoMHhhMDI4NWQ4MSksIFdUQzEoMHhhMDk2NzIwMSksIFdUQzEoMHhhMTA1NDcwMSksIFdUQzEoMHhhMTc0ZGE4MSksCisgICAgV1RDMSgweGExZTUyYTgxKSwgV1RDMSgweGEyNTYzNTAxKSwgV1RDMSgweGEyYzdmODAxKSwgV1RDMSgweGEzM2E3MjAxKSwKKyAgICBXVEMxKDB4YTNhZGEyODEpLCBXVEMxKDB4YTQyMTg4MDEpLCBXVEMxKDB4YTQ5NjIxODEpLCBXVEMxKDB4YTUwYjZlODEpLAorICAgIFdUQzEoMHhhNTgxNmU4MSksIFdUQzEoMHhhNWY4MWY4MSksIFdUQzEoMHhhNjZmODIwMSksIFdUQzEoMHhhNmU3OTQwMSksCisgICAgV1RDMSgweGE3NjA1NjAxKSwgV1RDMSgweGE3ZDljNjgxKSwgV1RDMSgweGE4NTNlNTAxKSwgV1RDMSgweGE4Y2ViMjAxKSwKKyAgICBXVEMxKDB4YTk0YTJjMDEpLCBXVEMxKDB4YTljNjU0MDEpLCBXVEMxKDB4YWE0MzI5ODEpLCBXVEMxKDB4YWFjMGFkMDEpLAorICAgIFdUQzEoMHhhYjNlZGYwMSksIFdUQzEoMHhhYmJkYzAwMSksIFdUQzEoMHhhYzNkNTAwMSksIFdUQzEoMHhhY2JkOTA4MSksCisgICAgV1RDMSgweGFkM2U4MTAxKSwgV1RDMSgweGFkYzAyMjgxKSwgV1RDMSgweGFlNDI3NDgxKSwgV1RDMSgweGFlYzU3ODAxKSwKKyAgICBXVEMxKDB4YWY0OTJmMDEpLCBXVEMxKDB4YWZjZDlhODEpLCBXVEMxKDB4YjA1MmJjMDEpLCBXVEMxKDB4YjBkODk0MDEpLAorICAgIFdUQzEoMHhiMTVmMjM4MSksIFdUQzEoMHhiMWU2NmEwMSksIFdUQzEoMHhiMjZlNjg4MSksIFdUQzEoMHhiMmY3MWYwMSksCisgICAgV1RDMSgweGIzODA4ZDgxKSwgV1RDMSgweGI0MGFiNTAxKSwgV1RDMSgweGI0OTU5NTAxKSwgV1RDMSgweGI1MjEyZTgxKSwKKyAgICBXVEMxKDB4NGE2Y2Y2N2YpLCBXVEMxKDB4NDlkZmZlZmYpLCBXVEMxKDB4NDk1MjY1ZmYpLCBXVEMxKDB4NDhjNDI3N2YpLAorICAgIFdUQzEoMHg0ODM1NDA3ZiksIFdUQzEoMHg0N2E1YWVmZiksIFdUQzEoMHg0NzE1NzBmZiksIFdUQzEoMHg0Njg0ODRmZiksCisgICAgV1RDMSgweDQ1ZjJlYWZmKSwgV1RDMSgweDQ1NjBhMmZmKSwgV1RDMSgweDQ0Y2RhZDdmKSwgV1RDMSgweDQ0M2EwYzdmKSwKKyAgICBXVEMxKDB4NDNhNWMwN2YpLCBXVEMxKDB4NDMxMGNhZmYpLCBXVEMxKDB4NDI3YjJiZmYpLCBXVEMxKDB4NDFlNGUzZmYpLAorICAgIFdUQzEoMHg0MTRkZjJmZiksIFdUQzEoMHg0MGI2NTU3ZiksIFdUQzEoMHg0MDFlMDZmZiksIFdUQzEoMHgzZjg1MDNjMCksCisgICAgV1RDMSgweDNlZWI0ZTAwKSwgV1RDMSgweDNlNTBlYmMwKSwgV1RDMSgweDNkYjVlNjgwKSwgV1RDMSgweDNkMWE0NjgwKSwKKyAgICBXVEMxKDB4M2M3ZTEwYzApLCBXVEMxKDB4M2JlMTRjYzApLCBXVEMxKDB4M2I0NDAyYzApLCBXVEMxKDB4M2FhNjM4MDApLAorICAgIFdUQzEoMHgzYTA3ZTg0MCksIFdUQzEoMHgzOTY5MDg4MCksIFdUQzEoMHgzOGM5ODcwMCksIFdUQzEoMHgzODI5NWI0MCksCisgICAgV1RDMSgweDM3ODg4YTgwKSwgV1RDMSgweDM2ZTcxZDQwKSwgV1RDMSgweDM2NDUxZDgwKSwgV1RDMSgweDM1YTI5NDAwKSwKKyAgICBXVEMxKDB4MzRmZjg4MDApLCBXVEMxKDB4MzQ1YzA0YzApLCBXVEMxKDB4MzNiODE5NDApLCBXVEMxKDB4MzMxM2QyMDApLAorICAgIFdUQzEoMHgzMjZmMzgwMCksIFdUQzEoMHgzMWNhNTYwMCksIFdUQzEoMHgzMTI1Mzg0MCksIFdUQzEoMHgzMDdmZThjMCksCisgICAgV1RDMSgweDJmZGE2ZTQwKSwgV1RDMSgweDJmMzRjZTQwKSwgV1RDMSgweDJlOGYwZTQwKSwgV1RDMSgweDJkZTkyZWMwKSwKKyAgICBXVEMxKDB4MmQ0MzI3ODApLCBXVEMxKDB4MmM5Y2VhNDApLCBXVEMxKDB4MmJmNjYzMDApLCBXVEMxKDB4MmI0Zjg4YzApLAorICAgIFdUQzEoMHgyYWE4NjRjMCksIFdUQzEoMHgyYTAxMDI0MCksIFdUQzEoMHgyOTU5NmU0MCksIFdUQzEoMHgyOGIxYmE4MCksCisgICAgV1RDMSgweDI4MDlmZjQwKSwgV1RDMSgweDI3NjI1YjgwKSwgV1RDMSgweDI2YmFmNTgwKSwgV1RDMSgweDI2MTNlN2MwKSwKKyAgICBXVEMxKDB4MjU2ZDNkYzApLCBXVEMxKDB4MjRjNzAzMDApLCBXVEMxKDB4MjQyMTQzODApLCBXVEMxKDB4MjM3YzA4MDApLAorICAgIFdUQzEoMHgyMmQ3NTQwMCksIFdUQzEoMHgyMjMzMmE4MCksIFdUQzEoMHgyMThmOGNjMCksIFdUQzEoMHgyMGVjN2U0MCksCisgICAgV1RDMSgweDIwNGEwNGMwKSwgV1RDMSgweDFmYTgyNTQwKSwgV1RDMSgweDFmMDZlMzAwKSwgV1RDMSgweDFlNjY0MDAwKSwKKyAgICBXVEMxKDB4MWRjNjNiYzApLCBXVEMxKDB4MWQyNmQzYzApLCBXVEMxKDB4MWM4ODAzYTApLCBXVEMxKDB4MWJlOWNjNDApLAorICAgIFdUQzEoMHgxYjRjMzRjMCksIFdUQzEoMHgxYWFmNDQ4MCksIFdUQzEoMHgxYTEzMDI2MCksIFdUQzEoMHgxOTc3NzRhMCksCisgICAgV1RDMSgweDE4ZGNhMjYwKSwgV1RDMSgweDE4NDI5NGUwKSwgV1RDMSgweDE3YTk1ODQwKSwgV1RDMSgweDE3MTBmZDgwKSwKKyAgICBXVEMxKDB4MTY3OTljZTApLCBXVEMxKDB4MTVlMzUzNDApLCBXVEMxKDB4MTU0ZTQxYTApLCBXVEMxKDB4MTRiYTgzNjApLAorICAgIFdUQzEoMHgxNDI4MmJlMCksIFdUQzEoMHgxMzk3NTEwMCksIFdUQzEoMHgxMzA4MGFhMCksIFdUQzEoMHgxMjdhNjI0MCksCisgICAgV1RDMSgweDExZWU1MGEwKSwgV1RDMSgweDExNjNjYzgwKSwgV1RDMSgweDEwZGFjYjIwKSwgV1RDMSgweDEwNTMzM2EwKSwKKyAgICBXVEMxKDB4MGZjY2RiMzApLCBXVEMxKDB4MGY0NzhmNDApLCBXVEMxKDB4MGVjMzE3MDApLCBXVEMxKDB4MGUzZjRlODApLAorICAgIFdUQzEoMHgwZGJjMjdmMCksIFdUQzEoMHgwZDM5OTAwMCksIFdUQzEoMHgwY2I3NmQwMCksIFdUQzEoMHgwYzM1OWQ1MCksCisgICAgV1RDMSgweDBiYjNmZDUwKSwgV1RDMSgweDBiMzI2YmQwKSwgV1RDMSgweDBhYjBjYTgwKSwgV1RDMSgweDBhMmYwZGMwKSwKKyAgICBXVEMxKDB4MDlhZDQwYzApLCBXVEMxKDB4MDkyYjdhOTApLCBXVEMxKDB4MDhhOWRiODApLCBXVEMxKDB4MDgyODVjODApLAorICAgIFdUQzEoMHgwN2E2YzdiOCksIFdUQzEoMHgwNzI0ZTRlMCksIFdUQzEoMHgwNmEyN2I4MCksIFdUQzEoMHgwNjFmNTJmOCksCisgICAgV1RDMSgweDA1OWIyYWQwKSwgV1RDMSgweDA1MTViNTY4KSwgV1RDMSgweDA0OGVhMDU4KSwgV1RDMSgweDA0MDY2NDA4KSwKKyAgICBXVEMxKDB4MDM3ZTUyZDgpLCBXVEMxKDB4MDJmN2QzYzgpLCBXVEMxKDB4MDI3NDYxNGMpLCBXVEMxKDB4MDFmNjMwMDgpLAorICAgIFdUQzEoMHgwMTgwNDAzYSksIFdUQzEoMHgwMTE1YzQ0MiksIFdUQzEoMHgwMGJhMDllMiksIFdUQzEoMHgwMDZmMDc3YyksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIC8qIHBhcnQgMiAqLworICAgIFdUQzIoMHhmZmYzNmJlMSksIFdUQzIoMHhmZmRhZmJjMSksIFdUQzIoMHhmZmMyODAzNSksIFdUQzIoMHhmZmE5ZmU4YSksCisgICAgV1RDMigweGZmOTE3YzA4KSwgV1RDMigweGZmNzhmZGZjKSwgV1RDMigweGZmNjA4OWFmKSwgV1RDMigweGZmNDgyNDZjKSwKKyAgICBXVEMyKDB4ZmYyZmQzN2YpLCBXVEMyKDB4ZmYxNzljMzEpLCBXVEMyKDB4ZmVmZjgzYjYpLCBXVEMyKDB4ZmVlNzhkMTgpLAorICAgIFdUQzIoMHhmZWNmYjkzZSksIFdUQzIoMHhmZWI4MDhmMiksIFdUQzIoMHhmZWEwN2QwNiksIFdUQzIoMHhmZTg5MTZiNCksCisgICAgV1RDMigweGZlNzFkN2EwKSwgV1RDMigweGZlNWFjMTc0KSwgV1RDMigweGZlNDNkNWQ2KSwgV1RDMigweGZlMmQxNjdlKSwKKyAgICBXVEMyKDB4ZmUxNjg1MmUpLCBXVEMyKDB4ZmUwMDIzYTYpLCBXVEMyKDB4ZmRlOWYzZjgpLCBXVEMyKDB4ZmRkM2ZmN2MpLAorICAgIFdUQzIoMHhmZGJlNTZjMCksIFdUQzIoMHhmZGE5MGFhOCksIFdUQzIoMHhmZDk0MmI3OCksIFdUQzIoMHhmZDdmYmIyMCksCisgICAgV1RDMigweGZkNmJhZDUwKSwgV1RDMigweGZkNTdmNTEwKSwgV1RDMigweGZkNDQ4NTdjKSwgV1RDMigweGZkMzE1M2ZjKSwKKyAgICBXVEMyKDB4ZmQxZTU4NDApLCBXVEMyKDB4ZmQwYjhhMGMpLCBXVEMyKDB4ZmNmOGUxODApLCBXVEMyKDB4ZmNlNjVlZWMpLAorICAgIFdUQzIoMHhmY2Q0MGFkMCksIFdUQzIoMHhmY2MxZWUwYyksIFdUQzIoMHhmY2IwMTFlOCksIFdUQzIoMHhmYzllODk2YyksCisgICAgV1RDMigweGZjOGQ3MTZjKSwgV1RDMigweGZjN2NlNzIwKSwgV1RDMigweGZjNmQwNzJjKSwgV1RDMigweGZjNWRlMDljKSwKKyAgICBXVEMyKDB4ZmM0Zjc0ZTgpLCBXVEMyKDB4ZmM0MWM0ZTgpLCBXVEMyKDB4ZmMzNGQwZGMpLCBXVEMyKDB4ZmMyODhhNjgpLAorICAgIFdUQzIoMHhmYzFjZDQ5YyksIFdUQzIoMHhmYzExOTFlMCksIFdUQzIoMHhmYzA2YTRkMCksIFdUQzIoMHhmYmZiZjNlOCksCisgICAgV1RDMigweGZiZjE2OTkwKSwgV1RDMigweGZiZTZmMDY4KSwgV1RDMigweGZiZGM3NDI4KSwgV1RDMigweGZiZDFmYzY4KSwKKyAgICBXVEMyKDB4ZmJjN2FjNTApLCBXVEMyKDB4ZmJiZGE4NjgpLCBXVEMyKDB4ZmJiNDE1MDApLCBXVEMyKDB4ZmJhYjE0MzgpLAorICAgIFdUQzIoMHhmYmEyYzVmOCksIFdUQzIoMHhmYjliNGEwMCksIFdUQzIoMHhmYjk0YmZhOCksIFdUQzIoMHhmYjhmM2I0OCksCisgICAgV1RDMigweGZiOGFjNjM4KSwgV1RDMigweGZiODc2OTcwKSwgV1RDMigweGZiODUyZDIwKSwgV1RDMigweGZiODQwYWUwKSwKKyAgICBXVEMyKDB4ZmI4M2VkNjApLCBXVEMyKDB4ZmI4NGJlYzApLCBXVEMyKDB4ZmI4NjY5MTgpLCBXVEMyKDB4ZmI4OGQ0YTgpLAorICAgIFdUQzIoMHhmYjhiZTgxMCksIFdUQzIoMHhmYjhmODlkMCksIFdUQzIoMHhmYjkzYTA4MCksIFdUQzIoMHhmYjk4MTQxOCksCisgICAgV1RDMigweGZiOWNjZGYwKSwgV1RDMigweGZiYTFiNzcwKSwgV1RDMigweGZiYTZiYWUwKSwgV1RDMigweGZiYWJkNWMwKSwKKyAgICBXVEMyKDB4ZmJiMTE4ZDgpLCBXVEMyKDB4ZmJiNjk1YzApLCBXVEMyKDB4ZmJiYzVlOTApLCBXVEMyKDB4ZmJjMjkwMzApLAorICAgIFdUQzIoMHhmYmM5NTI2OCksIFdUQzIoMHhmYmQwY2Q3OCksIFdUQzIoMHhmYmQ5MjljOCksIFdUQzIoMHhmYmUyOTRkMCksCisgICAgV1RDMigweGZiZWQ0MTA4KSwgV1RDMigweGZiZjk2MTE4KSwgV1RDMigweGZjMDcyNmM4KSwgV1RDMigweGZjMTZiMDY0KSwKKyAgICBXVEMyKDB4ZmMyODA4OTApLCBXVEMyKDB4ZmMzYjM5MjApLCBXVEMyKDB4ZmM1MDRhOTgpLCBXVEMyKDB4ZmM2NzI3MWMpLAorICAgIFdUQzIoMHhmYzdmOWE3NCksIFdUQzIoMHhmYzk5NmYxOCksIFdUQzIoMHhmY2I0NmViOCksIFdUQzIoMHhmY2QwNTBiMCksCisgICAgV1RDMigweGZjZWNiYTI0KSwgV1RDMigweGZkMDk0ZjY0KSwgV1RDMigweGZkMjViNzIwKSwgV1RDMigweGZkNDFjZTQwKSwKKyAgICBXVEMyKDB4ZmQ1ZGE3ZjgpLCBXVEMyKDB4ZmQ3OTU5ZDgpLCBXVEMyKDB4ZmQ5NGZiNzQpLCBXVEMyKDB4ZmRiMGQzZmMpLAorICAgIFdUQzIoMHhmZGNkNWEzNCksIFdUQzIoMHhmZGViMDZlNCksIFdUQzIoMHhmZTBhNTE4NCksIFdUQzIoMHhmZTJiOTJjNCksCisgICAgV1RDMigweGZlNGYwNDg2KSwgV1RDMigweGZlNzRkZjU0KSwgV1RDMigweGZlOWQ1ODg2KSwgV1RDMigweGZlYzg1YjkyKSwKKyAgICBXVEMyKDB4ZmVmNThhMTYpLCBXVEMyKDB4ZmYyNDgyNzUpLCBXVEMyKDB4ZmY1NGU0MDEpLCBXVEMyKDB4ZmY4NjYzMzApLAorICAgIFdUQzIoMHhmZmI4Yzk5YiksIFdUQzIoMHhmZmViZTFjOSksIFdUQzIoMHgwMDFmNzg2YSksIFdUQzIoMHgwMDUzOGJmOSksCisgICAgV1RDMigweDAwODg0Y2JjKSwgV1RDMigweDAwYmRlZDIzKSwgV1RDMigweDAwZjQ5ZjU0KSwgV1RDMigweDAxMmM4ZWU0KSwKKyAgICBXVEMyKDB4MDE2NWUwZDIpLCBXVEMyKDB4MDFhMGI5ZDYpLCBXVEMyKDB4MDFkZDNkODApLCBXVEMyKDB4MDIxYjc0ZDQpLAorICAgIFdUQzIoMHgwMjViNGU0OCksIFdUQzIoMHgwMjljYjczMCksIFdUQzIoMHgwMmRmOWQwYyksIFdUQzIoMHgwMzIzZjFhNCksCisgICAgV1RDMigweDAzNjlhYjAwKSwgV1RDMigweDAzYjBiZjVjKSwgV1RDMigweDAzZjkyNWEwKSwgV1RDMigweDA0NDJlM2Q4KSwKKyAgICBXVEMyKDB4MDQ4ZTBmNDApLCBXVEMyKDB4MDRkYWJkYjApLCBXVEMyKDB4MDUyOTA0MzApLCBXVEMyKDB4MDU3OGU0MjgpLAorICAgIFdUQzIoMHgwNWNhNGI2MCksIFdUQzIoMHgwNjFkMjZjMCksIFdUQzIoMHgwNjcxNjNkOCksIFdUQzIoMHgwNmM2ZmYxMCksCisgICAgV1RDMigweDA3MWUwM2IwKSwgV1RDMigweDA3NzY3ZGEwKSwgV1RDMigweDA3ZDA3OTE4KSwgV1RDMigweDA4MmMwOGUwKSwKKyAgICBXVEMyKDB4MDg4OTQ2NjApLCBXVEMyKDB4MDhlODRiNzApLCBXVEMyKDB4MDk0OTMwYjApLCBXVEMyKDB4MDlhYmY4ZDApLAorICAgIFdUQzIoMHgwYTEwOTAyMCksIFdUQzIoMHgwYTc2ZTIxMCksIFdUQzIoMHgwYWRlZGE1MCksIFdUQzIoMHgwYjQ4NmI4MCksCisgICAgV1RDMigweDBiYjM4ZjAwKSwgV1RDMigweDBjMjAzZTgwKSwgV1RDMigweDBjOGU3M2UwKSwgV1RDMigweDBjZmUyYzMwKSwKKyAgICBXVEMyKDB4MGQ2ZjY4MjApLCBXVEMyKDB4MGRlMjI4NTApLCBXVEMyKDB4MGU1NjZkOTApLCBXVEMyKDB4MGVjYzNkZDApLAorICAgIFdUQzIoMHgwZjQzYTNhMCksIFdUQzIoMHgwZmJjYTlmMCksIFdUQzIoMHgxMDM3NWI4MCksIFdUQzIoMHgxMGIzYmUyMCksCisgICAgV1RDMigweDExMzFkMjgwKSwgV1RDMigweDExYjE5OTYwKSwgV1RDMigweDEyMzMxM2EwKSwgV1RDMigweDEyYjY0MzgwKSwKKyAgICBXVEMyKDB4MTMzYjJkMDApLCBXVEMyKDB4MTNjMWQ0NDApLCBXVEMyKDB4MTQ0YTNkNjApLCBXVEMyKDB4MTRkNDY5MDApLAorICAgIFdUQzIoMHgxNTYwNTQ4MCksIFdUQzIoMHgxNWVkZmQyMCksIFdUQzIoMHgxNjdkNjA0MCksIFdUQzIoMHgxNzBlN2U4MCksCisgICAgV1RDMigweDE3YTE1YjgwKSwgV1RDMigweDE4MzVmYjAwKSwgV1RDMigweDE4Y2M2MGEwKSwgV1RDMigweDE5NjQ4ZGMwKSwKKyAgICBXVEMyKDB4MTlmZTgwZTApLCBXVEMyKDB4MWE5YTM4YTApLCBXVEMyKDB4MWIzN2IzZTApLCBXVEMyKDB4MWJkNmY0MDApLAorICAgIFdUQzIoMHgxYzc3ZmQyMCksIFdUQzIoMHgxZDFhZDQwMCksIFdUQzIoMHgxZGJmN2M4MCksIFdUQzIoMHgxZTY1ZjgyMCksCisgICAgV1RDMigweDFmMGU0NTQwKSwgV1RDMigweDFmYjg2MWUwKSwgV1RDMigweDIwNjQ0Y2MwKSwgV1RDMigweDIxMTIwNjQwKSwKKyAgICBXVEMyKDB4MjFjMTkyNDApLCBXVEMyKDB4MjI3MmY0ODApLCBXVEMyKDB4MjMyNjMwMDApLCBXVEMyKDB4MjNkYjQ1ODApLAorICAgIFdUQzIoMHgyNDkyMzM0MCksIFdUQzIoMHgyNTRhZjcwMCksIFdUQzIoMHgyNjA1OGU4MCksIFdUQzIoMHgyNmMxZmEwMCksCisgICAgV1RDMigweDI3ODAzZDAwKSwgV1RDMigweDI4NDA1YTQwKSwgV1RDMigweDI5MDI1NTAwKSwgV1RDMigweDI5YzYyZDQwKSwKKyAgICBXVEMyKDB4MmE4YmUwYzApLCBXVEMyKDB4MmI1MzZjYzApLCBXVEMyKDB4MmMxY2NmODApLCBXVEMyKDB4MmNlODA4NDApLAorICAgIFdUQzIoMHgyZGI1MTljMCksIFdUQzIoMHgyZTg0MDYwMCksIFdUQzIoMHgyZjU0Y2Y4MCksIFdUQzIoMHgzMDI3NzVjMCksCisgICAgV1RDMigweDMwZmJmNjQwKSwgV1RDMigweDMxZDI0ZTAwKSwgV1RDMigweDMyYWE3YTAwKSwgV1RDMigweDMzODQ3OWMwKSwKKyAgICBXVEMyKDB4MzQ2MDRlNDApLCBXVEMyKDB4MzUzZGY5MDApLCBXVEMyKDB4MzYxZDdhYzApLCBXVEMyKDB4MzZmZWQyMDApLAorICAgIFdUQzIoMHgzN2UxZmI0MCksIFdUQzIoMHgzOGM2ZjI0MCksIFdUQzIoMHgzOWFkYjJjMCksIFdUQzIoMHgzYTk2M2EwMCksCisgICAgV1RDMigweDNiODA4NzQwKSwgV1RDMigweDNjNmM5ODgwKSwgV1RDMigweDNkNWE2Y2MwKSwgV1RDMigweDNlNGEwMDQwKSwKKyAgICBXVEMyKDB4M2YzYjRiYzApLCBXVEMyKDB4NDAyZTQ4ZmYpLCBXVEMyKDB4NDEyMmYxN2YpLCBXVEMyKDB4NDIxOTNmN2YpLAorICAgIFdUQzIoMHg0MzExMmVmZiksIFdUQzIoMHg0NDBhYmJmZiksIFdUQzIoMHg0NTA1ZTJmZiksIFdUQzIoMHg0NjAyOWU3ZiksCisgICAgV1RDMigweDQ3MDBlOWZmKSwgV1RDMigweDQ4MDBiZmZmKSwgV1RDMigweDQ5MDIxYmZmKSwgV1RDMigweDRhMDUwZWZmKSwKKyAgICBXVEMyKDB4NGIwOWJjN2YpLCBXVEMyKDB4NGMxMDRhZmYpLCBXVEMyKDB4NGQxOGRmN2YpLCBXVEMyKDB4NGUyM2EwN2YpLAorICAgIFdUQzIoMHg0ZjMwYjJmZiksIFdUQzIoMHg1MDQwM2M3ZiksIFdUQzIoMHg1MTUyNjJmZiksIFdUQzIoMHg1MjY3NGI3ZiksCisgICAgV1RDMigweDAwMTY3OGIyKSwgV1RDMigweDAwMDYxYTNiKSwgV1RDMigweGZmZmI0NjIyKSwgV1RDMigweGZmZjVlYTk0KSwKKyAgICBXVEMyKDB4ZmZmNWY1YjkpLCBXVEMyKDB4ZmZmYjU1YmQpLCBXVEMyKDB4MDAwNWY4Y2IpLCBXVEMyKDB4MDAxNWNkMGMpLAorICAgIFdUQzIoMHgwMDJhYzBhYyksIFdUQzIoMHgwMDQ0YzFkNSksIFdUQzIoMHgwMDYzYmViMiksIFdUQzIoMHgwMDg3YTU2ZCksCisgICAgV1RDMigweDAwYjA2NDMxKSwgV1RDMigweDAwZGRlOTI5KSwgV1RDMigweDAxMTAyMjgwKSwgV1RDMigweDAxNDZmZTVlKSwKKyAgICBXVEMyKDB4MDE4MjZhZjIpLCBXVEMyKDB4MDFjMjU2NjIpLCBXVEMyKDB4MDIwNmFlZGMpLCBXVEMyKDB4MDI0ZjYyODgpLAorICAgIFdUQzIoMHgwMjljNWY5NCksIFdUQzIoMHgwMmVkOTQyNCksIFdUQzIoMHgwMzQyZWU2YyksIFdUQzIoMHgwMzljNWM5MCksCisgICAgV1RDMigweDAzZjljY2JjKSwgV1RDMigweDA0NWIyZDE4KSwgV1RDMigweDA0YzA2YmQ4KSwgV1RDMigweDA1Mjk3NzE4KSwKKyAgICBXVEMyKDB4MDU5NjNkMTApLCBXVEMyKDB4MDYwNmFiZTgpLCBXVEMyKDB4MDY3YWIxYzApLCBXVEMyKDB4MDZmMjNjZDApLAorICAgIFdUQzIoMHgwNzZkM2I0MCksIFdUQzIoMHgwN2ViOWIzOCksIFdUQzIoMHgwODZkNGFlMCksIFdUQzIoMHgwOGYyMzg2MCksCisgICAgV1RDMigweDA5N2E1MWYwKSwgV1RDMigweDBhMDU4NWIwKSwgV1RDMigweDBhOTNjMWQwKSwgV1RDMigweDBiMjRmNDcwKSwKKyAgICBXVEMyKDB4MGJiOTBiYzApLCBXVEMyKDB4MGM0ZmY1ZjApLCBXVEMyKDB4MGNlOWExMzApLCBXVEMyKDB4MGQ4NWZiOTApLAorICAgIFdUQzIoMHgwZTI0ZjM2MCksIFdUQzIoMHgwZWM2NzZiMCksIFdUQzIoMHgwZjZhNzNiMCksIFdUQzIoMHgxMDEwZDg4MCksCisgICAgV1RDMigweDEwYjk5MzYwKSwgV1RDMigweDExNjQ5MjgwKSwgV1RDMigweDEyMTFjNDAwKSwgV1RDMigweDEyYzExNWUwKSwKKyAgICBXVEMyKDB4MTM3Mjc2YTApLCBXVEMyKDB4MTQyNWQ0MjApLCBXVEMyKDB4MTRkYjFjYTApLCBXVEMyKDB4MTU5MjNlNjApLAorICAgIFdUQzIoMHgxNjRiMjc4MCksIFdUQzIoMHgxNzA1YzYyMCksIFdUQzIoMHgxN2MyMDg2MCksIFdUQzIoMHgxODdmZGNhMCksCisgICAgV1RDMigweDE5M2YzMGUwKSwgV1RDMigweDE5ZmZmMzQwKSwgV1RDMigweDFhYzIxMjAwKSwgV1RDMigweDFiODU3YjQwKSwKKyAgICBXVEMyKDB4MWM0YTFkNDApLCBXVEMyKDB4MWQwZmU2MDApLCBXVEMyKDB4MWRkNmMzZTApLCBXVEMyKDB4MWU5ZWE0ZTApLAorICAgIFdUQzIoMHgxZjY3Nzc0MCksIFdUQzIoMHgyMDMxMjk0MCksIFdUQzIoMHgyMGZiYThjMCksIFdUQzIoMHgyMWM2ZTQ0MCksCisgICAgV1RDMigweDIyOTJjOWMwKSwgV1RDMigweDIzNWY0NzgwKSwgV1RDMigweDI0MmM0YjgwKSwgV1RDMigweDI0ZjljNDAwKSwKKyAgICBXVEMyKDB4MjVjNzlmNDApLCBXVEMyKDB4MjY5NWNiNDApLCBXVEMyKDB4Mjc2NDM2ODApLCBXVEMyKDB4MjgzMmNlYzApLAorICAgIFdUQzIoMHgyOTAxODI0MCksIFdUQzIoMHgyOWQwM2Y4MCksIFdUQzIoMHgyYTllZjQ4MCksIFdUQzIoMHgyYjZkOGYwMCksCisgICAgV1RDMigweDJjM2JmZGMwKSwgV1RDMigweDJkMGEyZWMwKSwgV1RDMigweDJkZDgxMDAwKSwgV1RDMigweDJlYTU4ZmMwKSwKKyAgICBXVEMyKDB4MmY3MjljNDApLCBXVEMyKDB4MzAzZjIzODApLCBXVEMyKDB4MzEwYjE0MDApLCBXVEMyKDB4MzFkNjViODApLAorICAgIFdUQzIoMHgzMmEwZTg0MCksIFdUQzIoMHgzMzZhYThjMCksIFdUQzIoMHgzNDMzOGFjMCksIFdUQzIoMHgzNGZiN2NjMCksCisgICAgV1RDMigweDM1YzI2Y2MwKSwgV1RDMigweDM2ODg0OTAwKSwgV1RDMigweDM3NGNmZjgwKSwgV1RDMigweDM4MTA3ZTgwKSwKKyAgICBXVEMyKDB4MzhkMmI0NDApLCBXVEMyKDB4Mzk5MzhlYzApLCBXVEMyKDB4M2E1MmZjNDApLCBXVEMyKDB4M2IxMGViMDApLAorICAgIFdUQzIoMHgzYmNkNDkwMCksIFdUQzIoMHgzYzg4MDQ4MCksIFdUQzIoMHgzZDQxMGJjMCksIFdUQzIoMHgzZGY4NGQwMCksCisgICAgV1RDMigweDNlYWRiNjAwKSwgV1RDMigweDNmNjEzNTQwKSwgV1RDMigweDQwMTJiOGZmKSwgV1RDMigweDQwYzIyZWZmKSwKKyAgICBXVEMyKDB4NDE2Zjg1ZmYpLCBXVEMyKDB4NDIxYWFiN2YpLCBXVEMyKDB4NDJjMzhlN2YpLCBXVEMyKDB4NDM2YTFjN2YpLAorICAgIFdUQzIoMHg0NDBlNDM3ZiksIFdUQzIoMHg0NGFmZjI3ZiksIFdUQzIoMHg0NTRmMTY3ZiksIFdUQzIoMHg0NWViOWVmZiksCisgICAgV1RDMigweDQ2ODU3OGZmKSwgV1RDMigweDQ3MWM5MzdmKSwgV1RDMigweDQ3YjBkYzdmKSwgV1RDMigweDQ4NDI0MWZmKSwKKyAgICBXVEMyKDB4NDhkMGIxZmYpLCBXVEMyKDB4NDk1YzFhN2YpLCBXVEMyKDB4NDllNDZhN2YpLCBXVEMyKDB4NGE2OThmN2YpLAorICAgIFdUQzIoMHg0YWViNzdmZiksIFdUQzIoMHg0YjZhMTFmZiksIFdUQzIoMHg0YmU1NGI3ZiksIFdUQzIoMHg0YzVkMTJmZiksCisgICAgV1RDMigweDRjZDE1NWZmKSwgV1RDMigweDRkNDIwM2ZmKSwgV1RDMigweDRkYWYwOWZmKSwgV1RDMigweDRlMTg1NjdmKSwKKyAgICBXVEMyKDB4NGU3ZGQ3N2YpLCBXVEMyKDB4NGVkZjdiN2YpLCBXVEMyKDB4NGYzZDMwN2YpLCBXVEMyKDB4NGY5NmU0N2YpLAorICAgIFdUQzIoMHg0ZmVjODVmZiksIFdUQzIoMHg1MDNlMDJmZiksIFdUQzIoMHg1MDhiNDk3ZiksIFdUQzIoMHg1MGQ0NDdmZiksCisgICAgV1RDMigweDUxMThlYzdmKSwgV1RDMigweDUxNTkyNGZmKSwgV1RDMigweDUxOTRkZmZmKSwgV1RDMigweDUxY2MwYjdmKSwKKyAgICBXVEMyKDB4NTFmZTk1ZmYpLCBXVEMyKDB4NTIyYzZjZmYpLCBXVEMyKDB4NTI1NTdlZmYpLCBXVEMyKDB4NTI3OWI5ZmYpLAorICAgIFdUQzIoMHg1Mjk5MGM3ZiksIFdUQzIoMHg1MmIzNjRmZiksIFdUQzIoMHg1MmM4YjA3ZiksIFdUQzIoMHg1MmQ4ZGRmZiksCisgICAgV1RDMigweDUyZTNkYjdmKSwgV1RDMigweDUyZTk5NmZmKSwgV1RDMigweDUyZTlmZjdmKSwgV1RDMigweDUyZTUwMWZmKSwKKyAgICBXVEMyKDB4NTJkYThjZmYpLCBXVEMyKDB4NTJjYThmN2YpLCBXVEMyKDB4NTJiNGY2N2YpLCBXVEMyKDB4NTI5OWIwN2YpLAorICAgIFdUQzIoMHg1Mjc4YWM3ZiksIFdUQzIoMHg1MjUxZDc3ZiksIFdUQzIoMHg1MjI1MWZmZiksIFdUQzIoMHg1MWYyNzRmZiksCisgICAgV1RDMigweDUxYjljMzdmKSwgV1RDMigweDUxN2FmOWZmKSwgV1RDMigweDUxMzYwNzdmKSwgV1RDMigweDUwZWFkOGZmKSwKKyAgICBXVEMyKDB4NTA5OTVjZmYpLCBXVEMyKDB4NTA0MTgxZmYpLCBXVEMyKDB4NGZlMzM1ZmYpLCBXVEMyKDB4NGY3ZTY3N2YpLAorICAgIFdUQzIoMHg0ZjEzMDNmZiksIFdUQzIoMHg0ZWEwZjlmZiksIFdUQzIoMHg0ZTI4MzdmZiksIFdUQzIoMHg0ZGE4YWI3ZiksCisgICAgV1RDMigweDRkMjI0MmZmKSwgV1RDMigweDRjOTRlY2ZmKSwgV1RDMigweDRjMDA5NmZmKSwgV1RDMigweDRiNjUyZjdmKSwKKyAgICBXVEMyKDB4NGFjMmE0ZmYpLCBXVEMyKDB4NGExOGU0ZmYpLCBXVEMyKDB4NDk2N2RkZmYpLCBXVEMyKDB4NDhhZjdlN2YpLAorICAgIFdUQzIoMHg0N2VmYjNmZiksIFdUQzIoMHg0NzI4NmNmZiksIFdUQzIoMHg0NjU5YWQ3ZiksIFdUQzIoMHg0NTg1NmY3ZiksCisgICAgV1RDMigweDQ0YWZhM2ZmKSwgV1RDMigweDQzZGM1MDdmKSwgV1RDMigweDQzMGY2NTdmKSwgV1RDMigweDQyNGFkNDdmKSwKKyAgICBXVEMyKDB4NDE4ZTkyN2YpLCBXVEMyKDB4NDBkYTdiZmYpLCBXVEMyKDB4NDAyZTZmN2YpLCBXVEMyKDB4M2Y4YTMxMDApLAorICAgIFdUQzIoMHgzZWVkNmY0MCksIFdUQzIoMHgzZTU3ZDcwMCksIFdUQzIoMHgzZGM5MTRjMCksIFdUQzIoMHgzZDQwY2M0MCksCisgICAgV1RDMigweDNjYmU5OGMwKSwgV1RDMigweDNjNDIxNTQwKSwgV1RDMigweDNiY2FkYmMwKSwgV1RDMigweDNiNTg4ODgwKSwKKyAgICBXVEMyKDB4M2FlYWI3ODApLCBXVEMyKDB4M2E4MTA1NDApLCBXVEMyKDB4M2ExYjBlMDApLCBXVEMyKDB4MzliODZkMDApLAorICAgIFdUQzIoMHgzOTU4YmNjMCksIFdUQzIoMHgzOGZiOTcwMCksIFdUQzIoMHgzOGEwOTVjMCksIFdUQzIoMHgzODQ3M2Q4MCksCisgICAgV1RDMigweDM3ZWVmZjQwKSwgV1RDMigweDM3OTc0YjQwKSwgV1RDMigweDM3M2Y5NTAwKSwgV1RDMigweDM2ZTdhZTAwKSwKKyAgICBXVEMyKDB4MzY4ZmM0YzApLCBXVEMyKDB4MzYzODBiODApLCBXVEMyKDB4MzVlMGIzMDApLCBXVEMyKDB4MzU4OWMxNDApLAorICAgIFdUQzIoMHgzNTMzMTE4MCksIFdUQzIoMHgzNGRjN2M4MCksIFdUQzIoMHgzNDg1ZGM4MCksIFdUQzIoMHgzNDJmMTYwMCksCisgICAgV1RDMigweDMzZDgxNzgwKSwgV1RDMigweDMzODBkMGMwKSwgV1RDMigweDMzMjkzMTAwKSwgV1RDMigweDMyZDExODAwKSwKKyAgICBXVEMyKDB4MzI3ODU3ODApLCBXVEMyKDB4MzIxZWMwYzApLCBXVEMyKDB4MzFjNDI2ODApLCBXVEMyKDB4MzE2ODg1YzApLAorICAgIFdUQzIoMHgzMTBjMDU4MCksIFdUQzIoMHgzMGFlY2VjMCksIFdUQzIoMHgzMDUxMDk0MCksIFdUQzIoMHgyZmYyYjhjMCksCisgICAgV1RDMigweDJmOTNiZjQwKSwgV1RDMigweDJmMzNmYzAwKSwgV1RDMigweDJlZDM1MGMwKSwgV1RDMigweDJlNzFiYTgwKSwKKyAgICBXVEMyKDB4MmUwZjUzNDApLCBXVEMyKDB4MmRhYzM1YzApLCBXVEMyKDB4MmQ0ODdjODApLCBXVEMyKDB4MmNlNDMxYzApLAorICAgIFdUQzIoMHgyYzdmNGZjMCksIFdUQzIoMHgyYzE5ZDA4MCksIFdUQzIoMHgyYmIzYWQ4MCksIFdUQzIoMHgyYjRjZTA4MCksCisgICAgV1RDMigweDJhZTU2MzQwKSwgV1RDMigweDJhN2QyZjgwKSwgV1RDMigweDJhMTQzZjAwKSwgV1RDMigweDI5YWE4YjQwKX07CiAKIGNvbnN0IEZJWFBfV1RCIEVMREFuYWx5c2lzNDgwWzE0NDBdID0gewotICBXVEMwKDB4ZmFjZmJlZjApLCBXVEMwKDB4ZmFiODhjMTgpLCBXVEMwKDB4ZmFhMGU1MjApLCBXVEMwKDB4ZmE4OGQxMTApLCBXVEMwKDB4ZmE3MDU2ZTgpLCBXVEMwKDB4ZmE1NzdkYjApLCBXVEMwKDB4ZmEzZTRjNzApLCBXVEMwKDB4ZmEyNGNhMjgpLCAKLSAgV1RDMCgweGZhMGFmZGUwKSwgV1RDMCgweGY5ZjBlZWEwKSwgV1RDMCgweGY5ZDZhMmM4KSwgV1RDMCgweGY5YmMxYWI4KSwgV1RDMCgweGY5YTE1MjMwKSwgV1RDMCgweGY5ODY0NTEwKSwgV1RDMCgweGY5NmFmMDU4KSwgV1RDMCgweGY5NGY1NWMwKSwgCi0gIFdUQzAoMHhmOTMzNzhlMCksIFdUQzAoMHhmOTE3NWQ4MCksIFdUQzAoMHhmOGZiMDQ2OCksIFdUQzAoMHhmOGRlNjhiOCksIFdUQzAoMHhmOGMxODQzOCksIFdUQzAoMHhmOGE0NTBkOCksIFdUQzAoMHhmODg2Y2RlOCksIFdUQzAoMHhmODY5MDE0OCksIAotICBXVEMwKDB4Zjg0YWYxNDgpLCBXVEMwKDB4ZjgyY2E0MTApLCBXVEMwKDB4ZjgwZTFlMTgpLCBXVEMwKDB4ZjdlZjYyYTApLCBXVEMwKDB4ZjdkMDc0ZTApLCBXVEMwKDB4ZjdiMTU4NzApLCBXVEMwKDB4Zjc5MjEyNDApLCBXVEMwKDB4Zjc3MmE3YTApLCAKLSAgV1RDMCgweGY3NTMxZTUwKSwgV1RDMCgweGY3MzM3ODIwKSwgV1RDMCgweGY3MTNhZmQwKSwgV1RDMCgweGY2ZjNiZWEwKSwgV1RDMCgweGY2ZDM5ZGMwKSwgV1RDMCgweGY2YjM1MmUwKSwgV1RDMCgweGY2OTJmMjgwKSwgV1RDMCgweGY2NzI5MjUwKSwgCi0gIFdUQzAoMHhmNjUyNDdhMCksIFdUQzAoMHhmNjMyMjRjMCksIFdUQzAoMHhmNjEyM2EwMCksIFdUQzAoMHhmNWYyOTdjMCksIFdUQzAoMHhmNWQzNGRkMCksIFdUQzAoMHhmNWI0NmIxMCksIFdUQzAoMHhmNTk1ZmQ5MCksIFdUQzAoMHhmNTc4MTM5MCksIAotICBXVEMwKDB4ZjU1YWJiYTApLCBXVEMwKDB4ZjUzZTA1MTApLCBXVEMwKDB4ZjUyMWZmNzApLCBXVEMwKDB4ZjUwNmJhMzApLCBXVEMwKDB4ZjRlYzQzMzApLCBXVEMwKDB4ZjRkMmE2ODApLCBXVEMwKDB4ZjRiOWVmZTApLCBXVEMwKDB4ZjRhMjJhYzApLCAKLSAgV1RDMCgweGY0OGI1ZjcwKSwgV1RDMCgweGY0NzU5MzEwKSwgV1RDMCgweGY0NjBjZGUwKSwgV1RDMCgweGY0NGNmY2MwKSwgV1RDMCgweGY0MzlhZmYwKSwgV1RDMCgweGY0MjY0ZTAwKSwgV1RDMCgweGY0MTIzZDkwKSwgV1RDMCgweGYzZmQxMzcwKSwgCi0gIFdUQzAoMHhmM2U2YmUwMCksIFdUQzAoMHhmM2NmNDFhMCksIFdUQzAoMHhmM2I2YTAzMCksIFdUQzAoMHhmMzljZGQ2MCksIFdUQzAoMHhmMzgxZmUwMCksIFdUQzAoMHhmMzY2MDc2MCksIFdUQzAoMHhmMzQ4ZmU3MCksIFdUQzAoMHhmMzJhZTgyMCksIAotICBXVEMwKDB4ZjMwYmM5NDApLCBXVEMwKDB4ZjJlYmE2OTApLCBXVEMwKDB4ZjJjYTg0ODApLCBXVEMwKDB4ZjJhODY2NzApLCBXVEMwKDB4ZjI4NTRmNDApLCBXVEMwKDB4ZjI2MTQxOTApLCBXVEMwKDB4ZjIzYzQxZTApLCBXVEMwKDB4ZjIxNjU3YTApLCAKLSAgV1RDMCgweGYxZWY4YWUwKSwgV1RDMCgweGYxYzdlM2UwKSwgV1RDMCgweGYxOWY2M2QwKSwgV1RDMCgweGYxNzYwNDUwKSwgV1RDMCgweGYxNGJiZGYwKSwgV1RDMCgweGYxMjA4OTYwKSwgV1RDMCgweGYwZjQ1Y2QwKSwgV1RDMCgweGYwYzcyY2UwKSwgCi0gIFdUQzAoMHhmMDk4ZWUwMCksIFdUQzAoMHhmMDY5OTZmMCksIFdUQzAoMHhmMDM5MjYyMCksIFdUQzAoMHhmMDA3OWUxMCksIFdUQzAoMHhlZmQ0ZmZjMCksIFdUQzAoMHhlZmExNWNhMCksIFdUQzAoMHhlZjZjZTYwMCksIFdUQzAoMHhlZjM3ZDQ2MCksIAotICBXVEMwKDB4ZWYwMjVmODApLCBXVEMwKDB4ZWVjY2EyYzApLCBXVEMwKDB4ZWU5Njk3NjApLCBXVEMwKDB4ZWU2MDM0NDApLCBXVEMwKDB4ZWUyOTZkMjApLCBXVEMwKDB4ZWRmMjFjMDApLCBXVEMwKDB4ZWRiYTA3ZTApLCBXVEMwKDB4ZWQ4MGY2NDApLCAKLSAgV1RDMCgweGVkNDZiZjQwKSwgV1RDMCgweGVkMGI3YjAwKSwgV1RDMCgweGVjY2Y1ZmMwKSwgV1RDMCgweGVjOTJhMTIwKSwgV1RDMCgweGVjNTU2ZDYwKSwgV1RDMCgweGVjMTdlNzAwKSwgV1RDMCgweGViZGEyZDQwKSwgV1RDMCgweGViOWM1ZmEwKSwgCi0gIFdUQzAoMHhlYjVlNzA0MCksIFdUQzAoMHhlYjIwMWIyMCksIFdUQzAoMHhlYWUxMTdjMCksIFdUQzAoMHhlYWExMjAwMCksIFdUQzAoMHhlYTYwMDE4MCksIFdUQzAoMHhlYTFkOTk0MCksIFdUQzAoMHhlOWQ5YzE2MCksIFdUQzAoMHhlOTk0NjhhMCksIAotICBXVEMwKDB4ZTk0ZGMwNDApLCBXVEMwKDB4ZTkwNjE5NDApLCBXVEMwKDB4ZThiZGMxNDApLCBXVEMwKDB4ZTg3NTBhZTApLCBXVEMwKDB4ZTgyYzRmYTApLCBXVEMwKDB4ZTdlM2VhNDApLCBXVEMwKDB4ZTc5YzM1ZTApLCBXVEMwKDB4ZTc1NTRjYTApLCAKLSAgV1RDMCgweGU3MGVmYzAwKSwgV1RDMCgweGU2YzkwYzIwKSwgV1RDMCgweGU2ODMzZjAwKSwgV1RDMCgweGU2M2QyMzAwKSwgV1RDMCgweGU1ZjYyMGEwKSwgV1RDMCgweGU1YWQ5ZGMwKSwgV1RDMCgweGU1NjMyMDgwKSwgV1RDMCgweGU1MTY5ZGEwKSwgCi0gIFdUQzAoMHhlNGM4M2U2MCksIFdUQzAoMHhlNDc4MjQwMCksIFdUQzAoMHhlNDI2OTg0MCksIFdUQzAoMHhlM2Q0MmRjMCksIFdUQzAoMHhlMzgxODhjMCksIFdUQzAoMHhlMzJmNGJlMCksIFdUQzAoMHhlMmRkZWVhMCksIFdUQzAoMHhlMjhkYjUyMCksIAotICBXVEMwKDB4ZTIzZWUwMDApLCBXVEMwKDB4ZTFmMWE1ODApLCBXVEMwKDB4ZTFhNWUzYTApLCBXVEMwKDB4ZTE1YjM1YTApLCBXVEMwKDB4ZTExMTM4NjApLCBXVEMwKDB4ZTBjNzhhMDApLCBXVEMwKDB4ZTA3ZGQwZTApLCBXVEMwKDB4ZTAzM2I3YzApLCAKLSAgV1RDMCgweGRmZThlNjgwKSwgV1RDMCgweGRmOWQxZmMwKSwgV1RDMCgweGRmNTA1NWMwKSwgV1RDMCgweGRmMDI4N2MwKSwgV1RDMCgweGRlYjNiMzQwKSwgV1RDMCgweGRlNjNlN2MwKSwgV1RDMCgweGRlMTM0YTAwKSwgV1RDMCgweGRkYzIwMDAwKSwgCi0gIFdUQzAoMHhkZDcwMzE4MCksIFdUQzAoMHhkZDFlMTI4MCksIFdUQzAoMHhkY2NiZTA4MCksIFdUQzAoMHhkYzc5ZDk4MCksIFdUQzAoMHhkYzI4MzYwMCksIFdUQzAoMHhkYmQ3MWUwMCksIFdUQzAoMHhkYjg2YjE0MCksIFdUQzAoMHhkYjM3MTBjMCksIAotICBXVEMwKDB4ZGFlODUwYzApLCBXVEMwKDB4ZGE5YTZiYzApLCBXVEMwKDB4ZGE0ZDU2NDApLCBXVEMwKDB4ZGEwMTA2NDApLCBXVEMwKDB4ZDliNTY2NDApLCBXVEMwKDB4ZDk2YTU3MDApLCBXVEMwKDB4ZDkxZmI3MDApLCBXVEMwKDB4ZDhkNTY2MDApLCAKLSAgV1RDMCgweGQ4OGI0YTQwKSwgV1RDMCgweGQ4NDE0ZjAwKSwgV1RDMCgweGQ3Zjc1ZjgwKSwgV1RDMCgweGQ3YWQ2NzQwKSwgV1RDMCgweGQ3NjM1MmMwKSwgV1RDMCgweGQ3MTkxMDQwKSwgV1RDMCgweGQ2Y2U4YzgwKSwgV1RDMCgweGQ2ODNiZDAwKSwgCi0gIFdUQzAoMHhkNjM4YTVjMCksIFdUQzAoMHhkNWVkNGY4MCksIFdUQzAoMHhkNWExYzI0MCksIFdUQzAoMHhkNTU2MmI4MCksIFdUQzAoMHhkNTBhZTUwMCksIFdUQzAoMHhkNGMwNGM4MCksIFdUQzAoMHhkNDc2YmI0MCksIFdUQzAoMHhkNDJlNjJjMCksIAotICBXVEMwKDB4ZDNlNzU2ODApLCBXVEMwKDB4ZDNhMWFkMDApLCBXVEMwKDB4ZDM1ZDY3ODApLCBXVEMwKDB4ZDMxYTQzMDApLCBXVEMwKDB4ZDJkN2RjMDApLCBXVEMwKDB4ZDI5NWQwODApLCBXVEMwKDB4ZDI1M2Q4YzApLCBXVEMwKDB4ZDIxMWRmNDApLCAKLSAgV1RDMCgweGQxY2ZkYmMwKSwgV1RDMCgweGQxOGRjNDgwKSwgV1RDMCgweGQxNGI5ZGMwKSwgV1RDMCgweGQxMDk3YzgwKSwgV1RDMCgweGQwYzc3NzAwKSwgV1RDMCgweGQwODVhNTAwKSwgV1RDMCgweGQwNDQyZjQwKSwgV1RDMCgweGQwMDM0YTgwKSwgCi0gIFdUQzAoMHhjZmMzMmMwMCksIFdUQzAoMHhjZjg0MDQwMCksIFdUQzAoMHhjZjQ1ZjQwMCksIFdUQzAoMHhjZjA5MTNjMCksIFdUQzAoMHhjZWNkODAwMCksIFdUQzAoMHhjZTkzMmM4MCksIFdUQzAoMHhjZTU5YmY0MCksIFdUQzAoMHhjZTIwY2Q0MCksIAotICBXVEMwKDB4Y2RlN2VjNDApLCBXVEMwKDB4Y2RhZWVkYzApLCBXVEMwKDB4Y2Q3NWVhMDApLCBXVEMwKDB4Y2QzY2ZlYzApLCBXVEMwKDB4Y2QwNDRiNDApLCBXVEMwKDB4Y2NjYmZmMDApLCBXVEMwKDB4Y2M5NDU0ODApLCBXVEMwKDB4Y2M1ZDg3ODApLCAKLSAgV1RDMCgweGNjMjdjM2MwKSwgV1RDMCgweGNiZjJmYzQwKSwgV1RDMCgweGNiYmYwYTAwKSwgV1RDMCgweGNiOGJjN2MwKSwgV1RDMCgweGNiNTkxODgwKSwgV1RDMCgweGNiMjZmMGMwKSwgV1RDMCgweGNhZjU0OTgwKSwgV1RDMCgweGNhYzQxYWMwKSwgCi0gIFdUQzAoMHhjYTkzNjQ0MCksIFdUQzAoMHhjYTYzMmQ4MCksIFdUQzAoMHhjYTMzN2YwMCksIFdUQzAoMHhjYTA0NjE4MCksIFdUQzAoMHhjOWQ1ZGQ0MCksIFdUQzAoMHhjOWE3ZmE4MCksIFdUQzAoMHhjOTdhYzIwMCksIFdUQzAoMHhjOTRlM2MwMCksIAotICBXVEMwKDB4YzkxZDE4NDApLCBXVEMwKDB4YzhmMTU5ODApLCBXVEMwKDB4YzhjNTIzNDApLCBXVEMwKDB4Yzg5ODgxMDApLCBXVEMwKDB4Yzg2YjdmMDApLCBXVEMwKDB4YzgzZTI4YzApLCBXVEMwKDB4YzgxMDhhODApLCBXVEMwKDB4YzdlMmFmYzApLCAKLSAgV1RDMCgweGM3YjRhNDgwKSwgV1RDMCgweGM3ODY3NDgwKSwgV1RDMCgweGM3NTgyYjQwKSwgV1RDMCgweGM3MjljYzgwKSwgV1RDMCgweGM2ZmI1NzAwKSwgV1RDMCgweGM2Y2NjYTQwKSwgV1RDMCgweGM2OWUyMTgwKSwgV1RDMCgweGM2NmY0OWMwKSwgCi0gIFdUQzAoMHhjNjQwMjljMCksIFdUQzAoMHhjNjEwYTc0MCksIFdUQzAoMHhjNWUwYmZjMCksIFdUQzAoMHhjNWIwOWU4MCksIFdUQzAoMHhjNTgwNzkwMCksIFdUQzAoMHhjNTUwODQ0MCksIFdUQzAoMHhjNTIwZTg0MCksIFdUQzAoMHhjNGYxYmRjMCksIAotICBXVEMwKDB4YzRjMzFkMDApLCBXVEMwKDB4YzQ5NTE3ODApLCBXVEMwKDB4YzQ2NzhhMDApLCBXVEMwKDB4YzQzYTI4YzApLCBXVEMwKDB4YzQwY2E4MDApLCBXVEMwKDB4YzNkZWNjYzApLCBXVEMwKDB4YzNiMDk5NDApLCBXVEMwKDB4YzM4MjJjMDApLCAKLSAgV1RDMCgweGMzNTNhMGMwKSwgV1RDMCgweGMzMjUxNzQwKSwgV1RDMCgweGMyZjZiNTAwKSwgV1RDMCgweGMyYzhhMTQwKSwgV1RDMCgweGMyOWIwMmMwKSwgV1RDMCgweGMyNmRmNWMwKSwgV1RDMCgweGMyNDE4OTQwKSwgV1RDMCgweGMyMTVjYmMwKSwgCi0gIFdUQzAoMHhjMWVhY2EwMCksIFdUQzAoMHhjMWMwODY4MCksIFdUQzAoMHhjMTk2ZmIwMCksIFdUQzAoMHhjMTZlMjJjMCksIFdUQzAoMHhjMTQ1ZjA0MCksIFdUQzAoMHhjMTFlM2E4MCksIFdUQzAoMHhjMGY2Y2MwMCksIFdUQzAoMHhjMGNmNmVjMCksIAotICBXVEMwKDB4YzBhODAyYzApLCBXVEMwKDB4YzA4MDkyODApLCBXVEMwKDB4YzA1OTMzNDApLCBXVEMwKDB4YzAzMWY4ODApLCBXVEMwKDB4YzAwYjA0YzApLCBXVEMwKDB4YmZlNDg5ODEpLCBXVEMwKDB4YmZiZWJiODEpLCBXVEMwKDB4YmY5OWNiMDEpLCAKLSAgV1RDMCgweGJmNzVjYzgxKSwgV1RDMCgweGJmNTJjMTAxKSwgV1RDMCgweGJmMzBhOTAxKSwgV1RDMCgweGJmMGY4MzAxKSwgV1RDMCgweGJlZWY0NjAxKSwgV1RDMCgweGJlY2ZlNjAxKSwgV1RDMCgweGJlYjE1NzAxKSwgV1RDMCgweGJlOTM4YzgxKSwgCi0gIFdUQzAoMHhiZTc2N2U4MSksIFdUQzAoMHhiZTVhMjMwMSksIFdUQzAoMHhiZTNlNzIwMSksIFdUQzAoMHhiZTIzNjAwMSksIFdUQzAoMHhiZTA4ZTE4MSksIFdUQzAoMHhiZGVlZTk4MSksIFdUQzAoMHhiZGQ1NmI4MSksIFdUQzAoMHhiZGJjNjM4MSksIAotICBXVEMwKDB4YmRhM2QwODEpLCBXVEMwKDB4YmQ4YmIyODEpLCBXVEMwKDB4YmQ3NDBiODEpLCBXVEMwKDB4YmQ1Y2UyODEpLCBXVEMwKDB4YmQ0NjQyODEpLCBXVEMwKDB4YmQzMDM1ODEpLCBXVEMwKDB4YmQxYWM4MDEpLCBXVEMwKDB4YmQwNjBjODEpLCAKLSAgV1RDMCgweGJjZjIxNjAxKSwgV1RDMCgweGJjZGVmNzAxKSwgV1RDMCgweGJjY2NiZDAxKSwgV1RDMCgweGJjYmI3MDAxKSwgV1RDMCgweGJjYWIxNzgxKSwgV1RDMCgweGJjOWJiOTAxKSwgV1RDMCgweGJjOGQ1MTAxKSwgV1RDMCgweGJjN2ZkMzAxKSwgCi0gIFdUQzAoMHhiYzczMzQwMSksIFdUQzAoMHhiYzY3NjUwMSksIFdUQzAoMHhiYzVjNGM4MSksIFdUQzAoMHhiYzUxY2IwMSksIFdUQzAoMHhiYzQ3YzI4MSksIFdUQzAoMHhiYzNlMTk4MSksIFdUQzAoMHhiYzM0YzA4MSksIFdUQzAoMHhiYzJiYWIwMSksIAotICBXVEMwKDB4YmMyMmNkODEpLCBXVEMwKDB4YmMxYTI0MDEpLCBXVEMwKDB4YmMxMWI2ODEpLCBXVEMwKDB4YmMwOThkODEpLCBXVEMwKDB4YmMwMWIzODEpLCBXVEMwKDB4YmJmYTNjMDEpLCBXVEMwKDB4YmJmMzQyODEpLCBXVEMwKDB4YmJlY2UyODEpLCAKLSAgV1RDMCgweGJiZTczMjAxKSwgV1RDMCgweGJiZTIzMjgxKSwgV1RDMCgweGJiZGRkYjAxKSwgV1RDMCgweGJiZGEyNTAxKSwgV1RDMCgweGJiZDcwMjAxKSwgV1RDMCgweGJiZDQ1NjAxKSwgV1RDMCgweGJiZDIwMzAxKSwgV1RDMCgweGJiY2ZlYTgxKSwgCi0gIFdUQzAoMHhiYmNlMDYwMSksIFdUQzAoMHhiYmNjNmIwMSksIFdUQzAoMHhiYmNiMzIwMSksIFdUQzAoMHhiYmNhNzQ4MSksIFdUQzAoMHhiYmNhNWQwMSksIFdUQzAoMHhiYmNiMjI4MSksIFdUQzAoMHhiYmNjZmM4MSksIFdUQzAoMHhiYmQwMTMwMSksIAotICBXVEMwKDB4YmJkNDU4ODEpLCBXVEMwKDB4YmJkOWE3ODEpLCBXVEMwKDB4YmJkZmRiODEpLCBXVEMwKDB4YmJlNmM4MDEpLCBXVEMwKDB4YmJlZTJmODEpLCBXVEMwKDB4YmJmNWQxODEpLCBXVEMwKDB4YmJmZDZjMDEpLCBXVEMwKDB4YmMwNGUzODEpLCAKLSAgV1RDMCgweGJjMGM0NTgxKSwgV1RDMCgweGJjMTNhNDgxKSwgV1RDMCgweGJjMWIxMDgxKSwgV1RDMCgweGJjMjI4ZjAxKSwgV1RDMCgweGJjMmExYTgxKSwgV1RDMCgweGJjMzFhZjAxKSwgV1RDMCgweGJjMzk0OTAxKSwgV1RDMCgweGJjNDBlODgxKSwgCi0gIFdUQzAoMHhiYzQ4OGU4MSksIFdUQzAoMHhiYzUwM2I4MSksIFdUQzAoMHhiYzU3ZjEwMSksIFdUQzAoMHhiYzVmYWU4MSksIFdUQzAoMHhiYzY3NzUwMSksIFdUQzAoMHhiYzZmNDQwMSksIFdUQzAoMHhiYzc3MWMwMSksIFdUQzAoMHhiYzdlZmM4MSksIAotICBXVEMwKDB4YmM4NmU1ODEpLCBXVEMwKDB4YmM4ZWQ3MDEpLCBXVEMwKDB4YmM5NmQxMDEpLCBXVEMwKDB4YmM5ZWQ0ODEpLCBXVEMwKDB4YmNhNmUxMDEpLCBXVEMwKDB4YmNhZWY3MDEpLCBXVEMwKDB4YmNiNzE3MDEpLCBXVEMwKDB4YmNiZjQwMDEpLCAKLSAgV1RDMCgweGJjYzc3MTgxKSwgV1RDMCgweGJjY2ZhYzAxKSwgV1RDMCgweGJjZDdlZjAxKSwgV1RDMCgweGJjZTAzYjgxKSwgV1RDMCgweGJjZTg5MjgxKSwgV1RDMCgweGJjZjBmMzgxKSwgV1RDMCgweGJjZjk1ZTgxKSwgV1RDMCgweGJkMDFkMjgxKSwgCi0gIFdUQzAoMHhiZDBhNGY4MSksIFdUQzAoMHhiZDEyZDU4MSksIFdUQzAoMHhiZDFiNjUwMSksIFdUQzAoMHhiZDIzZmYwMSksIFdUQzAoMHhiZDJjYTI4MSksIFdUQzAoMHhiZDM1NTA4MSksIFdUQzAoMHhiZDNlMDgwMSksIFdUQzAoMHhiZDQ2YzgwMSksIAotICBXVEMwKDB4YmQ0ZjkxMDEpLCBXVEMwKDB4YmQ1ODYyODEpLCBXVEMwKDB4YmQ2MTNkODEpLCBXVEMwKDB4YmQ2YTIyMDEpLCBXVEMwKDB4YmQ3MzEwODEpLCBXVEMwKDB4YmQ3YzA3ODEpLCBXVEMwKDB4YmQ4NTA3MDEpLCBXVEMwKDB4YmQ4ZTBlMDEpLCAKLSAgV1RDMCgweGJkOTcxYzgxKSwgV1RDMCgweGJkYTAzMzgxKSwgV1RDMCgweGJkYTk1MzAxKSwgV1RDMCgweGJkYjI3YjAxKSwgV1RDMCgweGJkYmJhYjAxKSwgV1RDMCgweGJkYzRlMzAxKSwgV1RDMCgweGJkY2UyMTgxKSwgV1RDMCgweGJkZDc2NzAxKSwgCi0gIFdUQzAoMHhiZGUwYjMwMSksIFdUQzAoMHhiZGVhMDY4MSksIFdUQzAoMHhiZGYzNjEwMSksIFdUQzAoMHhiZGZjYzMwMSksIFdUQzAoMHhiZTA2MmI4MSksIFdUQzAoMHhiZTBmOWEwMSksIFdUQzAoMHhiZTE5MGQ4MSksIFdUQzAoMHhiZTIyODY4MSksIAotICBXVEMwKDB4YmUyYzA1MDEpLCBXVEMwKDB4YmUzNTg5MDEpLCBXVEMwKDB4YmUzZjEzODEpLCBXVEMwKDB4YmU0OGEzMDEpLCBXVEMwKDB4YmU1MjM3ODEpLCBXVEMwKDB4YmU1YmQwMDEpLCBXVEMwKDB4YmU2NTZjMDEpLCBXVEMwKDB4YmU2ZjBjMDEpLCAKLSAgV1RDMCgweGJlNzhiMDAxKSwgV1RDMCgweGJlODI1ODAxKSwgV1RDMCgweGJlOGMwNTAxKSwgV1RDMCgweGJlOTViNTgxKSwgV1RDMCgweGJlOWY2OTAxKSwgV1RDMCgweGJlYTkxZjAxKSwgV1RDMCgweGJlYjJkNjgxKSwgV1RDMCgweGJlYmM5MTgxKSwgCi0gIFdUQzAoMHhiZWM2NGU4MSksIFdUQzAoMHhiZWQwMGY4MSksIFdUQzAoMHhiZWQ5ZDI4MSksIFdUQzAoMHhiZWUzOTgwMSksIFdUQzAoMHhiZWVkNWYwMSksIFdUQzAoMHhiZWY3MjY4MSksIFdUQzAoMHhiZjAwZWY4MSksIFdUQzAoMHhiZjBhYmEwMSksIAotICBXVEMwKDB4YmYxNDg2ODEpLCBXVEMwKDB4YmYxZTU1MDEpLCBXVEMwKDB4YmYyODI1MDEpLCBXVEMwKDB4YmYzMWY1MDEpLCBXVEMwKDB4YmYzYmM2MDEpLCBXVEMwKDB4YmY0NTk2ODEpLCBXVEMwKDB4YmY0ZjY4MDEpLCBXVEMwKDB4YmY1OTNhMDEpLCAKLSAgV1RDMCgweGJmNjMwZDgxKSwgV1RDMCgweGJmNmNlMjAxKSwgV1RDMCgweGJmNzZiNzAxKSwgV1RDMCgweGJmODA4YjgxKSwgV1RDMCgweGJmOGE1ZjgxKSwgV1RDMCgweGJmOTQzMzAxKSwgV1RDMCgweGJmOWUwNzAxKSwgV1RDMCgweGJmYTdkYzAxKSwgCi0gIFdUQzAoMHhiZmIxYjEwMSksIFdUQzAoMHhiZmJiODcwMSksIFdUQzAoMHhiZmM1NWM4MSksIFdUQzAoMHhiZmNmMzE4MSksIFdUQzAoMHhiZmQ5MDYwMSksIFdUQzAoMHhiZmUyZDkwMSksIFdUQzAoMHhiZmVjYWE4MSksIFdUQzAoMHhiZmY2N2EwMSksIAotICAvKiBwYXJ0IDEgKi8KLSAgV1RDMSgweDgwMTMwOTgxKSwgV1RDMSgweDgwMjY5ZjgxKSwgV1RDMSgweDgwM2EzMzgxKSwgV1RDMSgweDgwNGRjNDgxKSwgV1RDMSgweDgwNjE1MjgxKSwgV1RDMSgweDgwNzRkYzAxKSwgV1RDMSgweDgwODg2MDgxKSwgV1RDMSgweDgwOWJkZjAxKSwgCi0gIFdUQzEoMHg4MGFmNTcwMSksIFdUQzEoMHg4MGMyYzc4MSksIFdUQzEoMHg4MGQ2MzEwMSksIFdUQzEoMHg4MGU5OTQwMSksIFdUQzEoMHg4MGZjZjE4MSksIFdUQzEoMHg4MTEwNGEwMSksIFdUQzEoMHg4MTIzOWQ4MSksIFdUQzEoMHg4MTM2ZWEwMSksIAotICBXVEMxKDB4ODE0YTJmODEpLCBXVEMxKDB4ODE1ZDZjMDEpLCBXVEMxKDB4ODE3MGExODEpLCBXVEMxKDB4ODE4M2NmODEpLCBXVEMxKDB4ODE5NmY3ODEpLCBXVEMxKDB4ODFhYTE5ODEpLCBXVEMxKDB4ODFiZDM0MDEpLCBXVEMxKDB4ODFkMDQ2ODEpLCAKLSAgV1RDMSgweDgxZTM0ZjgxKSwgV1RDMSgweDgxZjY0ZjAxKSwgV1RDMSgweDgyMDk0NTgxKSwgV1RDMSgweDgyMWMzNDAxKSwgV1RDMSgweDgyMmYxYjAxKSwgV1RDMSgweDgyNDFmYTAxKSwgV1RDMSgweDgyNTRjZjAxKSwgV1RDMSgweDgyNjc5OTAxKSwgCi0gIFdUQzEoMHg4MjdhNTgwMSksIFdUQzEoMHg4MjhkMGIwMSksIFdUQzEoMHg4MjlmYjQwMSksIFdUQzEoMHg4MmIyNTMwMSksIFdUQzEoMHg4MmM0ZTgwMSksIFdUQzEoMHg4MmQ3NzIwMSksIFdUQzEoMHg4MmU5ZWYwMSksIFdUQzEoMHg4MmZjNWYwMSksIAotICBXVEMxKDB4ODMwZWMwODEpLCBXVEMxKDB4ODMyMTE1MDEpLCBXVEMxKDB4ODMzMzVjODEpLCBXVEMxKDB4ODM0NTk4ODEpLCBXVEMxKDB4ODM1N2M3MDEpLCBXVEMxKDB4ODM2OWU3ODEpLCBXVEMxKDB4ODM3YmY4MDEpLCBXVEMxKDB4ODM4ZGY4MDEpLCAKLSAgV1RDMSgweDgzOWZlODAxKSwgV1RDMSgweDgzYjFjODgxKSwgV1RDMSgweDgzYzM5YTgxKSwgV1RDMSgweDgzZDU1ZDAxKSwgV1RDMSgweDgzZTcwZjAxKSwgV1RDMSgweDgzZjhiMDAxKSwgV1RDMSgweDg0MGEzZTgxKSwgV1RDMSgweDg0MWJiOTgxKSwgCi0gIFdUQzEoMHg4NDJkMjI4MSksIFdUQzEoMHg4NDNlN2E4MSksIFdUQzEoMHg4NDRmYzA4MSksIFdUQzEoMHg4NDYwZjU4MSksIFdUQzEoMHg4NDcyMTcwMSksIFdUQzEoMHg4NDgzMjQ4MSksIFdUQzEoMHg4NDk0MWQ4MSksIFdUQzEoMHg4NGE1MDIwMSksIAotICBXVEMxKDB4ODRiNWQzMDEpLCBXVEMxKDB4ODRjNjkxMDEpLCBXVEMxKDB4ODRkNzNjMDEpLCBXVEMxKDB4ODRlN2QzODEpLCBXVEMxKDB4ODRmODU1ODEpLCBXVEMxKDB4ODUwOGMxODEpLCBXVEMxKDB4ODUxOTE4MDEpLCBXVEMxKDB4ODUyOTU4ODEpLCAKLSAgV1RDMSgweDg1Mzk4NDgxKSwgV1RDMSgweDg1NDk5ZDAxKSwgV1RDMSgweDg1NTlhMDgxKSwgV1RDMSgweDg1Njk4ZTgxKSwgV1RDMSgweDg1Nzk2NjAxKSwgV1RDMSgweDg1ODkyNjgxKSwgV1RDMSgweDg1OThkMDgxKSwgV1RDMSgweDg1YTg2NTgxKSwgCi0gIFdUQzEoMHg4NWI3ZTYwMSksIFdUQzEoMHg4NWM3NTIwMSksIFdUQzEoMHg4NWQ2YTk4MSksIFdUQzEoMHg4NWU1ZWI4MSksIFdUQzEoMHg4NWY1MTY4MSksIFdUQzEoMHg4NjA0MmMwMSksIFdUQzEoMHg4NjEzMmMwMSksIFdUQzEoMHg4NjIyMTgwMSksIAotICBXVEMxKDB4ODYzMGYxODEpLCBXVEMxKDB4ODYzZmI3MDEpLCBXVEMxKDB4ODY0ZTY5MDEpLCBXVEMxKDB4ODY1ZDA1ODEpLCBXVEMxKDB4ODY2YjhkODEpLCBXVEMxKDB4ODY3YTAwODEpLCBXVEMxKDB4ODY4ODYwMDEpLCBXVEMxKDB4ODY5NmFkMDEpLCAKLSAgV1RDMSgweDg2YTRlNzgxKSwgV1RDMSgweDg2YjMwZjAxKSwgV1RDMSgweDg2YzEyNDAxKSwgV1RDMSgweDg2Y2YyNjAxKSwgV1RDMSgweDg2ZGQxNDgxKSwgV1RDMSgweDg2ZWFmMDgxKSwgV1RDMSgweDg2ZjhiYTgxKSwgV1RDMSgweDg3MDY3MjgxKSwgCi0gIFdUQzEoMHg4NzE0MWIwMSksIFdUQzEoMHg4NzIxYjQ4MSksIFdUQzEoMHg4NzJmNDIwMSksIFdUQzEoMHg4NzNjYzIwMSksIFdUQzEoMHg4NzRhMmYwMSksIFdUQzEoMHg4NzU3ODE4MSksIFdUQzEoMHg4NzY0YjEwMSksIFdUQzEoMHg4NzcxYzYwMSksIAotICBXVEMxKDB4ODc3ZWRlMDEpLCBXVEMxKDB4ODc4YzE4ODEpLCBXVEMxKDB4ODc5OThmMDEpLCBXVEMxKDB4ODdhNzBlODEpLCBXVEMxKDB4ODdiNDI0ODEpLCBXVEMxKDB4ODdjMDVlODEpLCBXVEMxKDB4ODdjYjUxMDEpLCBXVEMxKDB4ODdkNGFjODEpLCAKLSAgV1RDMSgweDg3ZTczZDgxKSwgV1RDMSgweDg4MTI0MjgxKSwgV1RDMSgweDg4MzUzNTAxKSwgV1RDMSgweDg4NWY4NDgxKSwgV1RDMSgweDg4OGQzMTgxKSwgV1RDMSgweDg4YmUxNjgxKSwgV1RDMSgweDg4ZjEzODAxKSwgV1RDMSgweDg5MjVmMTAxKSwgCi0gIFdUQzEoMHg4OTViY2QwMSksIFdUQzEoMHg4OTkyNWE4MSksIFdUQzEoMHg4OWM5MmY4MSksIFdUQzEoMHg4YTAwMWYwMSksIFdUQzEoMHg4YTM3Mjg4MSksIFdUQzEoMHg4YTZlNGEwMSksIFdUQzEoMHg4YWE1ODY4MSksIFdUQzEoMHg4YWRjZWUwMSksIAotICBXVEMxKDB4OGIxNDk3MDEpLCBXVEMxKDB4OGI0Yzk3MDEpLCBXVEMxKDB4OGI4NTAyODEpLCBXVEMxKDB4OGJiZGU5ODEpLCBXVEMxKDB4OGJmNzViMDEpLCBXVEMxKDB4OGMzMTY2ODEpLCBXVEMxKDB4OGM2YzFiMDEpLCBXVEMxKDB4OGNhNzg3ODEpLCAKLSAgV1RDMSgweDhjZTNiYTgxKSwgV1RDMSgweDhkMjBjMzAxKSwgV1RDMSgweDhkNWVhYTAxKSwgV1RDMSgweDhkOWQ3NzgxKSwgV1RDMSgweDhkZGQzMjAxKSwgV1RDMSgweDhlMWRlMDAxKSwgV1RDMSgweDhlNWY4ODgxKSwgV1RDMSgweDhlYTIzMjAxKSwgCi0gIFdUQzEoMHg4ZWU1ZTMwMSksIFdUQzEoMHg4ZjJhYTEwMSksIFdUQzEoMHg4ZjcwNmYwMSksIFdUQzEoMHg4ZmI3NGY4MSksIFdUQzEoMHg4ZmZmNDYwMSksIFdUQzEoMHg5MDQ4NTQwMSksIFdUQzEoMHg5MDkyN2I4MSksIFdUQzEoMHg5MGRkYzAwMSksIAotICBXVEMxKDB4OTEyYTIyMDEpLCBXVEMxKDB4OTE3N2EzMDEpLCBXVEMxKDB4OTFjNjQzMDEpLCBXVEMxKDB4OTIxNjAzMDEpLCBXVEMxKDB4OTI2NmUyODEpLCBXVEMxKDB4OTJiOGUxMDEpLCBXVEMxKDB4OTMwYmZmODEpLCBXVEMxKDB4OTM2MDNkMDEpLCAKLSAgV1RDMSgweDkzYjU5OTAxKSwgV1RDMSgweDk0MGMxMjgxKSwgV1RDMSgweDk0NjNhODgxKSwgV1RDMSgweDk0YmM1OTgxKSwgV1RDMSgweDk1MTYyMzgxKSwgV1RDMSgweDk1NzEwNjAxKSwgV1RDMSgweDk1Y2NmZjAxKSwgV1RDMSgweDk2MmEwYzgxKSwgCi0gIFdUQzEoMHg5Njg4MmUwMSksIFdUQzEoMHg5NmU3NjEwMSksIFdUQzEoMHg5NzQ3YTQ4MSksIFdUQzEoMHg5N2E4ZjY4MSksIFdUQzEoMHg5ODBiNTUwMSksIFdUQzEoMHg5ODZlYmQ4MSksIFdUQzEoMHg5OGQzMmQ4MSksIFdUQzEoMHg5OTM4YTI4MSksIAotICBXVEMxKDB4OTk5ZjE5ODEpLCBXVEMxKDB4OWEwNjkwMDEpLCBXVEMxKDB4OWE2ZjAzODEpLCBXVEMxKDB4OWFkODcwODEpLCBXVEMxKDB4OWI0MmQ1ODEpLCBXVEMxKDB4OWJhZTJmODEpLCBXVEMxKDB4OWMxYTdjODEpLCBXVEMxKDB4OWM4N2JhODEpLCAKLSAgV1RDMSgweDljZjVlNzAxKSwgV1RDMSgweDlkNjUwMDgxKSwgV1RDMSgweDlkZDUwNDgxKSwgV1RDMSgweDllNDVmMDgxKSwgV1RDMSgweDllYjdjMTAxKSwgV1RDMSgweDlmMmE3MjgxKSwgV1RDMSgweDlmOWUwMzAxKSwgV1RDMSgweGEwMTI3MDgxKSwgCi0gIFdUQzEoMHhhMDg3Yjk4MSksIFdUQzEoMHhhMGZkZGQ4MSksIFdUQzEoMHhhMTc0ZGE4MSksIFdUQzEoMHhhMWVjYWUwMSksIFdUQzEoMHhhMjY1NTU4MSksIFdUQzEoMHhhMmRlY2U4MSksIFdUQzEoMHhhMzU5MTgwMSksIFdUQzEoMHhhM2Q0MzAwMSksIAotICBXVEMxKDB4YTQ1MDE2MDEpLCBXVEMxKDB4YTRjY2M5MDEpLCBXVEMxKDB4YTU0YTQ3MDEpLCBXVEMxKDB4YTVjODkwMDEpLCBXVEMxKDB4YTY0N2EzMDEpLCBXVEMxKDB4YTZjNzdlMDEpLCBXVEMxKDB4YTc0ODIxMDEpLCBXVEMxKDB4YTdjOThiMDEpLCAKLSAgV1RDMSgweGE4NGJiYjgxKSwgV1RDMSgweGE4Y2ViMjAxKSwgV1RDMSgweGE5NTI2ZDgxKSwgV1RDMSgweGE5ZDZlZjAxKSwgV1RDMSgweGFhNWMzNjAxKSwgV1RDMSgweGFhZTI0MzAxKSwgV1RDMSgweGFiNjkxNjgxKSwgV1RDMSgweGFiZjBiMTgxKSwgCi0gIFdUQzEoMHhhYzc5MTQwMSksIFdUQzEoMHhhZDAyM2YwMSksIFdUQzEoMHhhZDhjMzMwMSksIFdUQzEoMHhhZTE2ZjAwMSksIFdUQzEoMHhhZWEyNzY4MSksIFdUQzEoMHhhZjJlYzkwMSksIFdUQzEoMHhhZmJiZTgwMSksIFdUQzEoMHhiMDQ5ZDYwMSksIAotICBXVEMxKDB4YjBkODk0MDEpLCBXVEMxKDB4YjE2ODIyODEpLCBXVEMxKDB4YjFmODgxODEpLCBXVEMxKDB4YjI4OWIxODEpLCBXVEMxKDB4YjMxYmIzMDEpLCBXVEMxKDB4YjNhZTg2MDEpLCBXVEMxKDB4YjQ0MjJiODEpLCBXVEMxKDB4YjRkNmEzODEpLCAKLSAgV1RDMSgweDRhNWEzMjdmKSwgV1RDMSgweDQ5YzRhZGZmKSwgV1RDMSgweDQ5MmU2MzdmKSwgV1RDMSgweDQ4OTc0ZjdmKSwgV1RDMSgweDQ3ZmY2ZDdmKSwgV1RDMSgweDQ3NjZiYWZmKSwgV1RDMSgweDQ2Y2QzNWZmKSwgV1RDMSgweDQ2MzJkZDdmKSwgCi0gIFdUQzEoMHg0NTk3YjBmZiksIFdUQzEoMHg0NGZiYjFmZiksIFdUQzEoMHg0NDVlZWFmZiksIFdUQzEoMHg0M2MxNjVmZiksIFdUQzEoMHg0MzIzMjI3ZiksIFdUQzEoMHg0Mjg0Mjc3ZiksIFdUQzEoMHg0MWU0OGFmZiksIFdUQzEoMHg0MTQ0NTU3ZiksIAotICBXVEMxKDB4NDBhMzg2N2YpLCBXVEMxKDB4NDAwMWY1ZmYpLCBXVEMxKDB4M2Y1ZjVkODApLCBXVEMxKDB4M2ViYmFkMDApLCBXVEMxKDB4M2UxNmVlNDApLCBXVEMxKDB4M2Q3MTNkMDApLCBXVEMxKDB4M2NjYWI3MDApLCBXVEMxKDB4M2MyMzY1MDApLCAKLSAgV1RDMSgweDNiN2I1ODAwKSwgV1RDMSgweDNhZDJlY2MwKSwgV1RDMSgweDNhMmE2NTQwKSwgV1RDMSgweDM5ODFiN2MwKSwgV1RDMSgweDM4ZDhiYTAwKSwgV1RDMSgweDM4MmYwMWMwKSwgV1RDMSgweDM3ODQ2MjQwKSwgV1RDMSgweDM2ZDhlYjAwKSwgCi0gIFdUQzEoMHgzNjJjOWVjMCksIFdUQzEoMHgzNTdmN2EwMCksIFdUQzEoMHgzNGQxODM0MCksIFdUQzEoMHgzNDIyYzkwMCksIFdUQzEoMHgzMzczNmM0MCksIFdUQzEoMHgzMmMzOTA0MCksIFdUQzEoMHgzMjEzNDI4MCksIFdUQzEoMHgzMTYyOTI4MCksIAotICBXVEMxKDB4MzBiMWEwMDApLCBXVEMxKDB4MzAwMDgzODApLCBXVEMxKDB4MmY0ZjQyNDApLCBXVEMxKDB4MmU5ZGYxODApLCBXVEMxKDB4MmRlY2M3ODApLCBXVEMxKDB4MmQzYmQ2NDApLCBXVEMxKDB4MmM4YjBjYzApLCBXVEMxKDB4MmJkYTMwODApLCAKLSAgV1RDMSgweDJiMjhlYzgwKSwgV1RDMSgweDJhNzczNTAwKSwgV1RDMSgweDI5YzUxYjQwKSwgV1RDMSgweDI5MTI5M2MwKSwgV1RDMSgweDI4NWY5MjgwKSwgV1RDMSgweDI3YWMzNWMwKSwgV1RDMSgweDI2ZjhhYjQwKSwgV1RDMSgweDI2NDU0YzAwKSwgCi0gIFdUQzEoMHgyNTkyNTYwMCksIFdUQzEoMHgyNGRmZDU4MCksIFdUQzEoMHgyNDJkZGQ0MCksIFdUQzEoMHgyMzdjODdjMCksIFdUQzEoMHgyMmNiZTI0MCksIFdUQzEoMHgyMjFiZWY0MCksIFdUQzEoMHgyMTZjYjA0MCksIFdUQzEoMHgyMGJlMjgwMCksIAotICBXVEMxKDB4MjAxMDVjODApLCBXVEMxKDB4MWY2MzUyYTApLCBXVEMxKDB4MWViNzEyNDApLCBXVEMxKDB4MWUwYmExNDApLCBXVEMxKDB4MWQ2MGZlNDApLCBXVEMxKDB4MWNiNzIzZTApLCBXVEMxKDB4MWMwZTAzMDApLCBXVEMxKDB4MWI2NTk2YzApLCAKLSAgV1RDMSgweDFhYmRlOGEwKSwgV1RDMSgweDFhMTZmYmUwKSwgV1RDMSgweDE5NzBjNjgwKSwgV1RDMSgweDE4Y2I0ODQwKSwgV1RDMSgweDE4MjY4ZTIwKSwgV1RDMSgweDE3ODJhMGMwKSwgV1RDMSgweDE2ZGY4OTYwKSwgV1RDMSgweDE2M2Q2MzAwKSwgCi0gIFdUQzEoMHgxNTljNTJjMCksIFdUQzEoMHgxNGZjODdlMCksIFdUQzEoMHgxNDVlMmM4MCksIFdUQzEoMHgxM2MxNWI2MCksIFdUQzEoMHgxMzI2MzI0MCksIFdUQzEoMHgxMjhjZDlhMCksIFdUQzEoMHgxMWY1NjJhMCksIFdUQzEoMHgxMTVmYzFjMCksIAotICBXVEMxKDB4MTBjYmYxNjApLCBXVEMxKDB4MTAzOWYyMDApLCBXVEMxKDB4MGZhOWEwODApLCBXVEMxKDB4MGYxYWJkOTApLCBXVEMxKDB4MGU4ZDAxZDApLCBXVEMxKDB4MGUwMDMzMzApLCBXVEMxKDB4MGQ3NDM1OTApLCBXVEMxKDB4MGNlOGVmNDApLCAKLSAgV1RDMSgweDBjNWUxOTAwKSwgV1RDMSgweDBiZDM1ZDcwKSwgV1RDMSgweDBiNDg4ZWIwKSwgV1RDMSgweDBhYmQ4NDEwKSwgV1RDMSgweDBhMzIwYTAwKSwgV1RDMSgweDA5YTYwZTcwKSwgV1RDMSgweDA5MTlhYjAwKSwgV1RDMSgweDA4OGQwZGUwKSwgCi0gIFdUQzEoMHgwODAwNjVlMCksIFdUQzEoMHgwNzczOTcxMCksIFdUQzEoMHgwNmU2NTgwOCksIFdUQzEoMHgwNjU4ODM0OCksIFdUQzEoMHgwNWNhMGFlMCksIFdUQzEoMHgwNTNhYWFmOCksIFdUQzEoMHgwNGE5ZmFmMCksIFdUQzEoMHgwNDE3ZjY5OCksIAotICBXVEMxKDB4MDM4NTlmZjQpLCBXVEMxKDB4MDJmNDliZTQpLCBXVEMxKDB4MDI2NmI2NjgpLCBXVEMxKDB4MDFkZTU1NGUpLCBXVEMxKDB4MDE1ZjUwY2EpLCBXVEMxKDB4MDBlYjdlNWQpLCBXVEMxKDB4MDA5MDRmMjQpLCBXVEMxKDB4MDAyMTI4ODkpLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgCi0gIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIAotICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCAKLSAgLyogcGFydCAyICovCi0gIFdUQzIoMHhmZmZlY2UwMiksIFdUQzIoMHhmZmU0YzNkZiksIFdUQzIoMHhmZmNhYWE1NSksIFdUQzIoMHhmZmIwODdkMSksIFdUQzIoMHhmZjk2NjJiZiksIFdUQzIoMHhmZjdjNDE4YiksIFdUQzIoMHhmZjYyMmFhMCksIFdUQzIoMHhmZjQ4MjQ2YyksIAotICBXVEMyKDB4ZmYyZTM1NWEpLCBXVEMyKDB4ZmYxNDYzZGIpLCBXVEMyKDB4ZmVmYWI2MDgpLCBXVEMyKDB4ZmVlMTJmMGEpLCBXVEMyKDB4ZmVjN2NmZDIpLCBXVEMyKDB4ZmVhZTk5NWEpLCBXVEMyKDB4ZmU5NThjYzQpLCBXVEMyKDB4ZmU3Y2FiY2UpLCAKLSAgV1RDMigweGZlNjNmODgyKSwgV1RDMigweGZlNGI3NGUwKSwgV1RDMigweGZlMzMyMmY2KSwgV1RDMigweGZlMWIwNGRjKSwgV1RDMigweGZlMDMxY2NjKSwgV1RDMigweGZkZWI2Y2YwKSwgV1RDMigweGZkZDNmZjdjKSwgV1RDMigweGZkYmNlODM0KSwgCi0gIFdUQzIoMHhmZGE2M2JiOCksIFdUQzIoMHhmZDkwMGM2OCksIFdUQzIoMHhmZDdhNTkwYyksIFdUQzIoMHhmZDY1MTFiNCksIFdUQzIoMHhmZDUwMjZjMCksIFdUQzIoMHhmZDNiODk1NCksIFdUQzIoMHhmZDI3MmRmMCksIFdUQzIoMHhmZDEzMGFkYyksIAotICBXVEMyKDB4ZmNmZjE1YWMpLCBXVEMyKDB4ZmNlYjRhNjgpLCBXVEMyKDB4ZmNkN2IxMTApLCBXVEMyKDB4ZmNjNDU0ZDApLCBXVEMyKDB4ZmNiMTQwNjQpLCBXVEMyKDB4ZmM5ZTg5NmMpLCBXVEMyKDB4ZmM4YzUyNjQpLCBXVEMyKDB4ZmM3YWJlZjApLCAKLSAgV1RDMigweGZjNjlmMDc4KSwgV1RDMigweGZjNTlmNWU4KSwgV1RDMigweGZjNGFjZmVjKSwgV1RDMigweGZjM2M4MDYwKSwgV1RDMigweGZjMmYwMjY0KSwgV1RDMigweGZjMjIzYjdjKSwgV1RDMigweGZjMTYwNzE0KSwgV1RDMigweGZjMGE0MTUwKSwgCi0gIFdUQzIoMHhmYmZlYzkyMCksIFdUQzIoMHhmYmYzODMyMCksIFdUQzIoMHhmYmU4NTVkMCksIFdUQzIoMHhmYmRkMjc0MCksIFdUQzIoMHhmYmQxZmM2OCksIFdUQzIoMHhmYmM2ZmVhMCksIFdUQzIoMHhmYmJjNWE0OCksIFdUQzIoMHhmYmIyM2I0OCksIAotICBXVEMyKDB4ZmJhOGNhNzgpLCBXVEMyKDB4ZmJhMDJlNTApLCBXVEMyKDB4ZmI5ODhkZTApLCBXVEMyKDB4ZmI5MjBiNDApLCBXVEMyKDB4ZmI4Y2I4NzApLCBXVEMyKDB4ZmI4ODlmNjgpLCBXVEMyKDB4ZmI4NWNiZTgpLCBXVEMyKDB4ZmI4NDNkZDApLCAKLSAgV1RDMigweGZiODNkZjc4KSwgV1RDMigweGZiODQ5NWQwKSwgV1RDMigweGZiODY0NjYwKSwgV1RDMigweGZiODhkNGE4KSwgV1RDMigweGZiOGMyMWU4KSwgV1RDMigweGZiOTAwZjI4KSwgV1RDMigweGZiOTQ3ZGMwKSwgV1RDMigweGZiOTk1MGMwKSwgCi0gIFdUQzIoMHhmYjllNmQwOCksIFdUQzIoMHhmYmEzYjY1OCksIFdUQzIoMHhmYmE5MTkwOCksIFdUQzIoMHhmYmFlOWUwOCksIFdUQzIoMHhmYmI0NWJkMCksIFdUQzIoMHhmYmJhNjZmOCksIFdUQzIoMHhmYmMwZGNmMCksIFdUQzIoMHhmYmM3ZWFkOCksIAotICBXVEMyKDB4ZmJjZmMyMDApLCBXVEMyKDB4ZmJkODkzMzApLCBXVEMyKDB4ZmJlMjk0ZDApLCBXVEMyKDB4ZmJlZTAzZDApLCBXVEMyKDB4ZmJmYjFkZTgpLCBXVEMyKDB4ZmMwYTFkYTQpLCBXVEMyKDB4ZmMxYjIyZTApLCBXVEMyKDB4ZmMyZTM4ZjApLCAKLSAgV1RDMigweGZjNDM2ZDQ4KSwgV1RDMigweGZjNWFiZjdjKSwgV1RDMigweGZjNzQwMjRjKSwgV1RDMigweGZjOGVmMmU4KSwgV1RDMigweGZjYWI1MWFjKSwgV1RDMigweGZjYzhkMDI0KSwgV1RDMigweGZjZTcwNGYwKSwgV1RDMigweGZkMDU4MGNjKSwgCi0gIFdUQzIoMHhmZDIzZDRkMCksIFdUQzIoMHhmZDQxY2U0MCksIFdUQzIoMHhmZDVmODFiMCksIFdUQzIoMHhmZDdkMDhmMCksIFdUQzIoMHhmZDlhODU2MCksIFdUQzIoMHhmZGI4NTkzOCksIFdUQzIoMHhmZGQ3MTc5OCksIFdUQzIoMHhmZGY3NTNiOCksIAotICBXVEMyKDB4ZmUxOTkzZWUpLCBXVEMyKDB4ZmUzZTMwZjgpLCBXVEMyKDB4ZmU2NTZjYmEpLCBXVEMyKDB4ZmU4ZjhmZGMpLCBXVEMyKDB4ZmViY2E4YTQpLCBXVEMyKDB4ZmVlYzU5MGUpLCBXVEMyKDB4ZmYxZTI4NWMpLCBXVEMyKDB4ZmY1MWEwYjcpLCAKLSAgV1RDMigweGZmODY2MzMwKSwgV1RDMigweGZmYmMyY2JiKSwgV1RDMigweGZmZjJiYmZmKSwgV1RDMigweDAwMjlkNzlkKSwgV1RDMigweDAwNjE4YTIyKSwgV1RDMigweDAwOWExMTg1KSwgV1RDMigweDAwZDNhYThjKSwgV1RDMigweDAxMGU4ZmY2KSwgCi0gIFdUQzIoMHgwMTRhZjI5ZSksIFdUQzIoMHgwMTg4ZmU1NiksIFdUQzIoMHgwMWM4ZTEwOCksIFdUQzIoMHgwMjBhYjNjNCksIFdUQzIoMHgwMjRlNjhhOCksIFdUQzIoMHgwMjkzZTgyNCksIFdUQzIoMHgwMmRiMWJjOCksIFdUQzIoMHgwMzIzZjFhNCksIAotICBXVEMyKDB4MDM2ZTVkNmMpLCBXVEMyKDB4MDNiYTUzMjApLCBXVEMyKDB4MDQwN2M5MzgpLCBXVEMyKDB4MDQ1NmNhZDApLCBXVEMyKDB4MDRhNzcyODgpLCBXVEMyKDB4MDRmOWRiODgpLCBXVEMyKDB4MDU0ZTE4ODgpLCBXVEMyKDB4MDVhNDFlZjApLCAKLSAgV1RDMigweDA1ZmJkNmUwKSwgV1RDMigweDA2NTUyOGMwKSwgV1RDMigweDA2YjAwODM4KSwgV1RDMigweDA3MGM3ZWUwKSwgV1RDMigweDA3NmE5YmIwKSwgV1RDMigweDA3Y2E2ZDEwKSwgV1RDMigweDA4MmMwOGUwKSwgV1RDMigweDA4OGY4ZGEwKSwgCi0gIFdUQzIoMHgwOGY1MWFjMCksIFdUQzIoMHgwOTVjY2MyMCksIFdUQzIoMHgwOWM2OWY3MCksIFdUQzIoMHgwYTMyN2I0MCksIFdUQzIoMHgwYWEwNDZkMCksIFdUQzIoMHgwYjBmZWJiMCksIFdUQzIoMHgwYjgxNWRkMCksIFdUQzIoMHgwYmY0OTYwMCksIAotICBXVEMyKDB4MGM2OThjNTApLCBXVEMyKDB4MGNlMDNiYTApLCBXVEMyKDB4MGQ1OGEzODApLCBXVEMyKDB4MGRkMmM1MTApLCBXVEMyKDB4MGU0ZWExMTApLCBXVEMyKDB4MGVjYzNkZDApLCBXVEMyKDB4MGY0YmE4MDApLCBXVEMyKDB4MGZjY2VkMTApLCAKLSAgV1RDMigweDEwNTAxOTYwKSwgV1RDMigweDEwZDUzMmEwKSwgV1RDMigweDExNWMzOWMwKSwgV1RDMigweDExZTUyZmEwKSwgV1RDMigweDEyNzAxNTYwKSwgV1RDMigweDEyZmNlZjIwKSwgV1RDMigweDEzOGJjMjAwKSwgV1RDMigweDE0MWM5MzAwKSwgCi0gIFdUQzIoMHgxNGFmNjRhMCksIFdUQzIoMHgxNTQ0MzRlMCksIFdUQzIoMHgxNWRiMDAyMCksIFdUQzIoMHgxNjczYzM2MCksIFdUQzIoMHgxNzBlN2U4MCksIFdUQzIoMHgxN2FiMzVlMCksIFdUQzIoMHgxODQ5ZWU0MCksIFdUQzIoMHgxOGVhYWJhMCksIAotICBXVEMyKDB4MTk4ZDZmMDApLCBXVEMyKDB4MWEzMjM2YTApLCBXVEMyKDB4MWFkOTAwODApLCBXVEMyKDB4MWI4MWNjNjApLCBXVEMyKDB4MWMyYzlkYTApLCBXVEMyKDB4MWNkOTc5ODApLCBXVEMyKDB4MWQ4ODY1YzApLCBXVEMyKDB4MWUzOTY1NDApLCAKLSAgV1RDMigweDFlZWM3NzAwKSwgV1RDMigweDFmYTE5OGMwKSwgV1RDMigweDIwNThjODQwKSwgV1RDMigweDIxMTIwNjQwKSwgV1RDMigweDIxY2Q1NzAwKSwgV1RDMigweDIyOGFiZWMwKSwgV1RDMigweDIzNGE0MTgwKSwgV1RDMigweDI0MGJkZjgwKSwgCi0gIFdUQzIoMHgyNGNmOTVjMCksIFdUQzIoMHgyNTk1NjFjMCksIFdUQzIoMHgyNjVkNDIwMCksIFdUQzIoMHgyNzI3Mzg0MCksIFdUQzIoMHgyN2YzNDhjMCksIFdUQzIoMHgyOGMxNzcwMCksIFdUQzIoMHgyOTkxYzUwMCksIFdUQzIoMHgyYTY0MzA4MCksIAotICBXVEMyKDB4MmIzOGI2ODApLCBXVEMyKDB4MmMwZjUzYzApLCBXVEMyKDB4MmNlODA4NDApLCBXVEMyKDB4MmRjMmQ2ODApLCBXVEMyKDB4MmU5ZmMxMDApLCBXVEMyKDB4MmY3ZWNhYzApLCBXVEMyKDB4MzA1ZmYyODApLCBXVEMyKDB4MzE0MzM0YzApLCAKLSAgV1RDMigweDMyMjg4ZTAwKSwgV1RDMigweDMzMGZmYjgwKSwgV1RDMigweDMzZjk3ZDgwKSwgV1RDMigweDM0ZTUxNWMwKSwgV1RDMigweDM1ZDJjNWMwKSwgV1RDMigweDM2YzI4ZDAwKSwgV1RDMigweDM3YjQ2N2MwKSwgV1RDMigweDM4YTg1MDgwKSwgCi0gIFdUQzIoMHgzOTllNDI0MCksIFdUQzIoMHgzYTk2M2EwMCksIFdUQzIoMHgzYjkwMzYwMCksIFdUQzIoMHgzYzhjMzQ4MCksIFdUQzIoMHgzZDhhMzM4MCksIFdUQzIoMHgzZThhMmRjMCksIFdUQzIoMHgzZjhjMWI0MCksIFdUQzIoMHg0MDhmZjJmZiksIAotICBXVEMyKDB4NDE5NWFlN2YpLCBXVEMyKDB4NDI5ZDQ3N2YpLCBXVEMyKDB4NDNhNmI4N2YpLCBXVEMyKDB4NDRiMWZkZmYpLCBXVEMyKDB4NDViZjExZmYpLCBXVEMyKDB4NDZjZGVlN2YpLCBXVEMyKDB4NDdkZThjZmYpLCBXVEMyKDB4NDhmMGU3N2YpLCAKLSAgV1RDMigweDRhMDUwZWZmKSwgV1RDMigweDRiMWIyZGZmKSwgV1RDMigweDRjMzM3MmZmKSwgV1RDMigweDRkNGUwYmZmKSwgV1RDMigweDRlNmIyNTdmKSwgV1RDMigweDRmOGFlZGZmKSwgV1RDMigweDUwYWQ5MmZmKSwgV1RDMigweDUxZDM0MWZmKSwgCi0gIFdUQzIoMHgwMDIwMDZhOSksIFdUQzIoMHgwMDBiZmIzNiksIFdUQzIoMHhmZmZlNDVhYyksIFdUQzIoMHhmZmY2ZDA2NCksIFdUQzIoMHhmZmY1ODViYyksIFdUQzIoMHhmZmZhNTAwZCksIFdUQzIoMHgwMDA1MTliNCksIFdUQzIoMHgwMDE1Y2QwYyksIAotICBXVEMyKDB4MDAyYzU0NzApLCBXVEMyKDB4MDA0ODlhM2IpLCBXVEMyKDB4MDA2YTg4YzgpLCBXVEMyKDB4MDA5MjBhNzQpLCBXVEMyKDB4MDBiZjA5OTkpLCBXVEMyKDB4MDBmMTcwOTIpLCBXVEMyKDB4MDEyOTI5YmMpLCBXVEMyKDB4MDE2NjFmNzApLCAKLSAgV1RDMigweDAxYTgzYzBjKSwgV1RDMigweDAxZWY2OWU4KSwgV1RDMigweDAyM2I5MzY0KSwgV1RDMigweDAyOGNhMmQ0KSwgV1RDMigweDAyZTI4MjljKSwgV1RDMigweDAzM2QxZDEwKSwgV1RDMigweDAzOWM1YzkwKSwgV1RDMigweDA0MDAyYjc4KSwgCi0gIFdUQzIoMHgwNDY4NzQxOCksIFdUQzIoMHgwNGQ1MjBlMCksIFdUQzIoMHgwNTQ2MWMxOCksIFdUQzIoMHgwNWJiNTAyMCksIFdUQzIoMHgwNjM0YTc1OCksIFdUQzIoMHgwNmIyMGMyMCksIFdUQzIoMHgwNzMzNjhjOCksIFdUQzIoMHgwN2I4YTdiMCksIAotICBXVEMyKDB4MDg0MWIzNDApLCBXVEMyKDB4MDhjZTc1YjApLCBXVEMyKDB4MDk1ZWQ5ODApLCBXVEMyKDB4MDlmMmM5MDApLCBXVEMyKDB4MGE4YTJlODApLCBXVEMyKDB4MGIyNGY0NzApLCBXVEMyKDB4MGJjMzA1MTApLCBXVEMyKDB4MGM2NDRhZDApLCAKLSAgV1RDMigweDBkMDhiMDEwKSwgV1RDMigweDBkYjAxZjEwKSwgV1RDMigweDBlNWE4MjUwKSwgV1RDMigweDBmMDdjNDAwKSwgV1RDMigweDBmYjdjZWEwKSwgV1RDMigweDEwNmE4YzgwKSwgV1RDMigweDExMWZlODAwKSwgV1RDMigweDExZDdjYjYwKSwgCi0gIFdUQzIoMHgxMjkyMjEyMCksIFdUQzIoMHgxMzRlZDNhMCksIFdUQzIoMHgxNDBkY2QwMCksIFdUQzIoMHgxNGNlZjdlMCksIFdUQzIoMHgxNTkyM2U2MCksIFdUQzIoMHgxNjU3OGIwMCksIFdUQzIoMHgxNzFlYzgyMCksIFdUQzIoMHgxN2U3ZTAyMCksIAotICBXVEMyKDB4MThiMmJkMjApLCBXVEMyKDB4MTk3ZjQ5YzApLCBXVEMyKDB4MWE0ZDcwNDApLCBXVEMyKDB4MWIxZDFiMDApLCBXVEMyKDB4MWJlZTM0NjApLCBXVEMyKDB4MWNjMGE2YTApLCBXVEMyKDB4MWQ5NDVjNDApLCBXVEMyKDB4MWU2OTNmODApLCAKLSAgV1RDMigweDFmM2YzYWMwKSwgV1RDMigweDIwMTYzODgwKSwgV1RDMigweDIwZWUyMmMwKSwgV1RDMigweDIxYzZlNDQwKSwgV1RDMigweDIyYTA2NzQwKSwgV1RDMigweDIzN2E5NjAwKSwgV1RDMigweDI0NTU1YWMwKSwgV1RDMigweDI1MzBhMDQwKSwgCi0gIFdUQzIoMHgyNjBjNTA4MCksIFdUQzIoMHgyNmU4NTYwMCksIFdUQzIoMHgyN2M0OWIwMCksIFdUQzIoMHgyOGExMGEwMCksIFdUQzIoMHgyOTdkOGQ4MCksIFdUQzIoMHgyYTVhMGY4MCksIFdUQzIoMHgyYjM2N2E4MCksIFdUQzIoMHgyYzEyYjhjMCksIAotICBXVEMyKDB4MmNlZWI1MDApLCBXVEMyKDB4MmRjYTU5NDApLCBXVEMyKDB4MmVhNThmYzApLCBXVEMyKDB4MmY4MDQzNDApLCBXVEMyKDB4MzA1YTVkYzApLCBXVEMyKDB4MzEzM2NhMDApLCBXVEMyKDB4MzIwYzcyMDApLCBXVEMyKDB4MzJlNDQwMDApLCAKLSAgV1RDMigweDMzYmIxZWMwKSwgV1RDMigweDM0OTBmODgwKSwgV1RDMigweDM1NjViN2MwKSwgV1RDMigweDM2Mzk0NjQwKSwgV1RDMigweDM3MGI4ZjAwKSwgV1RDMigweDM3ZGM3YzAwKSwgV1RDMigweDM4YWJmN2MwKSwgV1RDMigweDM5NzllY2MwKSwgCi0gIFdUQzIoMHgzYTQ2NDUwMCksIFdUQzIoMHgzYjEwZWIwMCksIFdUQzIoMHgzYmQ5Yzk0MCksIFdUQzIoMHgzY2EwYzljMCksIFdUQzIoMHgzZDY1ZDc0MCksIFdUQzIoMHgzZTI4ZGMwMCksIFdUQzIoMHgzZWU5YzI0MCksIFdUQzIoMHgzZmE4NzQ4MCksIAotICBXVEMyKDB4NDA2NGRjZmYpLCBXVEMyKDB4NDExZWU2N2YpLCBXVEMyKDB4NDFkNjdhN2YpLCBXVEMyKDB4NDI4Yjg0N2YpLCBXVEMyKDB4NDMzZGVkN2YpLCBXVEMyKDB4NDNlZGEwZmYpLCBXVEMyKDB4NDQ5YTg4N2YpLCBXVEMyKDB4NDU0NDhmN2YpLCAKLSAgV1RDMigweDQ1ZWI5ZWZmKSwgV1RDMigweDQ2OGZhMWZmKSwgV1RDMigweDQ3MzA4MmZmKSwgV1RDMigweDQ3Y2UyYzdmKSwgV1RDMigweDQ4Njg4ODdmKSwgV1RDMigweDQ4ZmY4MGZmKSwgV1RDMigweDQ5OTMwMGZmKSwgV1RDMigweDRhMjJmMmZmKSwgCi0gIFdUQzIoMHg0YWFmNDA3ZiksIFdUQzIoMHg0YjM3ZDQ3ZiksIFdUQzIoMHg0YmJjOTk3ZiksIFdUQzIoMHg0YzNkNzhmZiksIFdUQzIoMHg0Y2JhNWU3ZiksIFdUQzIoMHg0ZDMzMzM3ZiksIFdUQzIoMHg0ZGE3ZTI3ZiksIFdUQzIoMHg0ZTE4NTY3ZiksIAotICBXVEMyKDB4NGU4NDc4ZmYpLCBXVEMyKDB4NGVlYzM0N2YpLCBXVEMyKDB4NGY0ZjczN2YpLCBXVEMyKDB4NGZhZTIwZmYpLCBXVEMyKDB4NTAwODI1ZmYpLCBXVEMyKDB4NTA1ZDZkZmYpLCBXVEMyKDB4NTBhZGUzN2YpLCBXVEMyKDB4NTBmOTZmN2YpLCAKLSAgV1RDMigweDUxM2ZmZGZmKSwgV1RDMigweDUxODE3N2ZmKSwgV1RDMigweDUxYmRjODdmKSwgV1RDMigweDUxZjRkOWZmKSwgV1RDMigweDUyMjY5NjdmKSwgV1RDMigweDUyNTJlODdmKSwgV1RDMigweDUyNzliOWZmKSwgV1RDMigweDUyOWFmNWZmKSwgCi0gIFdUQzIoMHg1MmI2ODY3ZiksIFdUQzIoMHg1MmNjNTVmZiksIFdUQzIoMHg1MmRjNGVmZiksIFdUQzIoMHg1MmU2NWFmZiksIFdUQzIoMHg1MmVhNjU3ZiksIFdUQzIoMHg1MmU4NTdmZiksIFdUQzIoMHg1MmUwMWQ3ZiksIFdUQzIoMHg1MmQxOWZmZiksIAotICBXVEMyKDB4NTJiY2M5ZmYpLCBXVEMyKDB4NTJhMTg1N2YpLCBXVEMyKDB4NTI3ZmJkN2YpLCBXVEMyKDB4NTI1NzViN2YpLCBXVEMyKDB4NTIyODRhN2YpLCBXVEMyKDB4NTFmMjc0ZmYpLCBXVEMyKDB4NTFiNWM0N2YpLCBXVEMyKDB4NTE3MjI0N2YpLCAKLSAgV1RDMigweDUxMjc3ZGZmKSwgV1RDMigweDUwZDViYzdmKSwgV1RDMigweDUwN2NjOWZmKSwgV1RDMigweDUwMWM5MGZmKSwgV1RDMigweDRmYjRmYjdmKSwgV1RDMigweDRmNDVmM2ZmKSwgV1RDMigweDRlY2Y2NGZmKSwgV1RDMigweDRlNTEzOGZmKSwgCi0gIFdUQzIoMHg0ZGNiNTk3ZiksIFdUQzIoMHg0ZDNkYjFmZiksIFdUQzIoMHg0Y2E4MmJmZiksIFdUQzIoMHg0YzBhYjI3ZiksIFdUQzIoMHg0YjY1MmY3ZiksIFdUQzIoMHg0YWI3OGQ3ZiksIFdUQzIoMHg0YTAxYjY3ZiksIFdUQzIoMHg0OTQzOTU3ZiksIAotICBXVEMyKDB4NDg3ZDEyZmYpLCBXVEMyKDB4NDdhZTFmN2YpLCBXVEMyKDB4NDZkNjhmN2YpLCBXVEMyKDB4NDVmNzE4N2YpLCBXVEMyKDB4NDUxMzU5N2YpLCBXVEMyKDB4NDQzMDQ2N2YpLCBXVEMyKDB4NDM1MmQyZmYpLCBXVEMyKDB4NDI3ZTZiZmYpLCAKLSAgV1RDMigweDQxYjM5MGZmKSwgV1RDMigweDQwZjIwNzdmKSwgV1RDMigweDQwMzlhODdmKSwgV1RDMigweDNmOGEzMTAwKSwgV1RDMigweDNlZTMzZTAwKSwgV1RDMigweDNlNDQ2YWMwKSwgV1RDMigweDNkYWQ1MTgwKSwgV1RDMigweDNkMWQ3ZmMwKSwgCi0gIFdUQzIoMHgzYzk0N2IwMCksIFdUQzIoMHgzYzExYzdjMCksIFdUQzIoMHgzYjk0ZWJjMCksIFdUQzIoMHgzYjFkNmRjMCksIFdUQzIoMHgzYWFhZDQ4MCksIFdUQzIoMHgzYTNjYTc0MCksIFdUQzIoMHgzOWQyNmM0MCksIFdUQzIoMHgzOTZiYThjMCksIAotICBXVEMyKDB4MzkwN2UwODApLCBXVEMyKDB4MzhhNjk4MDApLCBXVEMyKDB4Mzg0NzNkODApLCBXVEMyKDB4MzdlOTIzYzApLCBXVEMyKDB4Mzc4YjliODApLCBXVEMyKDB4MzcyZTAzODApLCBXVEMyKDB4MzZkMDNhODApLCBXVEMyKDB4MzY3MjdmMDApLCAKLSAgV1RDMigweDM2MTUwZTQwKSwgV1RDMigweDM1YjgxNTQwKSwgV1RDMigweDM1NWI4MDAwKSwgV1RDMigweDM0ZmYxZGMwKSwgV1RDMigweDM0YTJiZmMwKSwgV1RDMigweDM0NDYzZTgwKSwgV1RDMigweDMzZTk4MmMwKSwgV1RDMigweDMzOGM3ODgwKSwgCi0gIFdUQzIoMHgzMzJmMGJjMCksIFdUQzIoMHgzMmQxMTgwMCksIFdUQzIoMHgzMjcyNjVjMCksIFdUQzIoMHgzMjEyYmJjMCksIFdUQzIoMHgzMWIxZTc0MCksIFdUQzIoMHgzMTRmZWYwMCksIFdUQzIoMHgzMGVkMDU0MCksIFdUQzIoMHgzMDg5NWM4MCksIAotICBXVEMyKDB4MzAyNTE4ODApLCBXVEMyKDB4MmZjMDI4ODApLCBXVEMyKDB4MmY1YTY0ODApLCBXVEMyKDB4MmVmM2E0ODApLCBXVEMyKDB4MmU4YmQ2NDApLCBXVEMyKDB4MmUyMzExMDApLCBXVEMyKDB4MmRiOTc2ODApLCBXVEMyKDB4MmQ0ZjI3MDApLCAKLSAgV1RDMigweDJjZTQzMWMwKSwgV1RDMigweDJjNzg5MDgwKSwgV1RDMigweDJjMGMzYmMwKSwgV1RDMigweDJiOWYyYmMwKSwgV1RDMigweDJiMzE1OTQwKSwgV1RDMigweDJhYzJiYzAwKSwgV1RDMigweDJhNTM0Y2MwKSwgV1RDMigweDI5ZTMwM2MwKQorICAgIFdUQzAoMHhmYWNmYmVmMCksIFdUQzAoMHhmYWI4OGMxOCksIFdUQzAoMHhmYWEwZTUyMCksIFdUQzAoMHhmYTg4ZDExMCksCisgICAgV1RDMCgweGZhNzA1NmU4KSwgV1RDMCgweGZhNTc3ZGIwKSwgV1RDMCgweGZhM2U0YzcwKSwgV1RDMCgweGZhMjRjYTI4KSwKKyAgICBXVEMwKDB4ZmEwYWZkZTApLCBXVEMwKDB4ZjlmMGVlYTApLCBXVEMwKDB4ZjlkNmEyYzgpLCBXVEMwKDB4ZjliYzFhYjgpLAorICAgIFdUQzAoMHhmOWExNTIzMCksIFdUQzAoMHhmOTg2NDUxMCksIFdUQzAoMHhmOTZhZjA1OCksIFdUQzAoMHhmOTRmNTVjMCksCisgICAgV1RDMCgweGY5MzM3OGUwKSwgV1RDMCgweGY5MTc1ZDgwKSwgV1RDMCgweGY4ZmIwNDY4KSwgV1RDMCgweGY4ZGU2OGI4KSwKKyAgICBXVEMwKDB4ZjhjMTg0MzgpLCBXVEMwKDB4ZjhhNDUwZDgpLCBXVEMwKDB4Zjg4NmNkZTgpLCBXVEMwKDB4Zjg2OTAxNDgpLAorICAgIFdUQzAoMHhmODRhZjE0OCksIFdUQzAoMHhmODJjYTQxMCksIFdUQzAoMHhmODBlMWUxOCksIFdUQzAoMHhmN2VmNjJhMCksCisgICAgV1RDMCgweGY3ZDA3NGUwKSwgV1RDMCgweGY3YjE1ODcwKSwgV1RDMCgweGY3OTIxMjQwKSwgV1RDMCgweGY3NzJhN2EwKSwKKyAgICBXVEMwKDB4Zjc1MzFlNTApLCBXVEMwKDB4ZjczMzc4MjApLCBXVEMwKDB4ZjcxM2FmZDApLCBXVEMwKDB4ZjZmM2JlYTApLAorICAgIFdUQzAoMHhmNmQzOWRjMCksIFdUQzAoMHhmNmIzNTJlMCksIFdUQzAoMHhmNjkyZjI4MCksIFdUQzAoMHhmNjcyOTI1MCksCisgICAgV1RDMCgweGY2NTI0N2EwKSwgV1RDMCgweGY2MzIyNGMwKSwgV1RDMCgweGY2MTIzYTAwKSwgV1RDMCgweGY1ZjI5N2MwKSwKKyAgICBXVEMwKDB4ZjVkMzRkZDApLCBXVEMwKDB4ZjViNDZiMTApLCBXVEMwKDB4ZjU5NWZkOTApLCBXVEMwKDB4ZjU3ODEzOTApLAorICAgIFdUQzAoMHhmNTVhYmJhMCksIFdUQzAoMHhmNTNlMDUxMCksIFdUQzAoMHhmNTIxZmY3MCksIFdUQzAoMHhmNTA2YmEzMCksCisgICAgV1RDMCgweGY0ZWM0MzMwKSwgV1RDMCgweGY0ZDJhNjgwKSwgV1RDMCgweGY0YjllZmUwKSwgV1RDMCgweGY0YTIyYWMwKSwKKyAgICBXVEMwKDB4ZjQ4YjVmNzApLCBXVEMwKDB4ZjQ3NTkzMTApLCBXVEMwKDB4ZjQ2MGNkZTApLCBXVEMwKDB4ZjQ0Y2ZjYzApLAorICAgIFdUQzAoMHhmNDM5YWZmMCksIFdUQzAoMHhmNDI2NGUwMCksIFdUQzAoMHhmNDEyM2Q5MCksIFdUQzAoMHhmM2ZkMTM3MCksCisgICAgV1RDMCgweGYzZTZiZTAwKSwgV1RDMCgweGYzY2Y0MWEwKSwgV1RDMCgweGYzYjZhMDMwKSwgV1RDMCgweGYzOWNkZDYwKSwKKyAgICBXVEMwKDB4ZjM4MWZlMDApLCBXVEMwKDB4ZjM2NjA3NjApLCBXVEMwKDB4ZjM0OGZlNzApLCBXVEMwKDB4ZjMyYWU4MjApLAorICAgIFdUQzAoMHhmMzBiYzk0MCksIFdUQzAoMHhmMmViYTY5MCksIFdUQzAoMHhmMmNhODQ4MCksIFdUQzAoMHhmMmE4NjY3MCksCisgICAgV1RDMCgweGYyODU0ZjQwKSwgV1RDMCgweGYyNjE0MTkwKSwgV1RDMCgweGYyM2M0MWUwKSwgV1RDMCgweGYyMTY1N2EwKSwKKyAgICBXVEMwKDB4ZjFlZjhhZTApLCBXVEMwKDB4ZjFjN2UzZTApLCBXVEMwKDB4ZjE5ZjYzZDApLCBXVEMwKDB4ZjE3NjA0NTApLAorICAgIFdUQzAoMHhmMTRiYmRmMCksIFdUQzAoMHhmMTIwODk2MCksIFdUQzAoMHhmMGY0NWNkMCksIFdUQzAoMHhmMGM3MmNlMCksCisgICAgV1RDMCgweGYwOThlZTAwKSwgV1RDMCgweGYwNjk5NmYwKSwgV1RDMCgweGYwMzkyNjIwKSwgV1RDMCgweGYwMDc5ZTEwKSwKKyAgICBXVEMwKDB4ZWZkNGZmYzApLCBXVEMwKDB4ZWZhMTVjYTApLCBXVEMwKDB4ZWY2Y2U2MDApLCBXVEMwKDB4ZWYzN2Q0NjApLAorICAgIFdUQzAoMHhlZjAyNWY4MCksIFdUQzAoMHhlZWNjYTJjMCksIFdUQzAoMHhlZTk2OTc2MCksIFdUQzAoMHhlZTYwMzQ0MCksCisgICAgV1RDMCgweGVlMjk2ZDIwKSwgV1RDMCgweGVkZjIxYzAwKSwgV1RDMCgweGVkYmEwN2UwKSwgV1RDMCgweGVkODBmNjQwKSwKKyAgICBXVEMwKDB4ZWQ0NmJmNDApLCBXVEMwKDB4ZWQwYjdiMDApLCBXVEMwKDB4ZWNjZjVmYzApLCBXVEMwKDB4ZWM5MmExMjApLAorICAgIFdUQzAoMHhlYzU1NmQ2MCksIFdUQzAoMHhlYzE3ZTcwMCksIFdUQzAoMHhlYmRhMmQ0MCksIFdUQzAoMHhlYjljNWZhMCksCisgICAgV1RDMCgweGViNWU3MDQwKSwgV1RDMCgweGViMjAxYjIwKSwgV1RDMCgweGVhZTExN2MwKSwgV1RDMCgweGVhYTEyMDAwKSwKKyAgICBXVEMwKDB4ZWE2MDAxODApLCBXVEMwKDB4ZWExZDk5NDApLCBXVEMwKDB4ZTlkOWMxNjApLCBXVEMwKDB4ZTk5NDY4YTApLAorICAgIFdUQzAoMHhlOTRkYzA0MCksIFdUQzAoMHhlOTA2MTk0MCksIFdUQzAoMHhlOGJkYzE0MCksIFdUQzAoMHhlODc1MGFlMCksCisgICAgV1RDMCgweGU4MmM0ZmEwKSwgV1RDMCgweGU3ZTNlYTQwKSwgV1RDMCgweGU3OWMzNWUwKSwgV1RDMCgweGU3NTU0Y2EwKSwKKyAgICBXVEMwKDB4ZTcwZWZjMDApLCBXVEMwKDB4ZTZjOTBjMjApLCBXVEMwKDB4ZTY4MzNmMDApLCBXVEMwKDB4ZTYzZDIzMDApLAorICAgIFdUQzAoMHhlNWY2MjBhMCksIFdUQzAoMHhlNWFkOWRjMCksIFdUQzAoMHhlNTYzMjA4MCksIFdUQzAoMHhlNTE2OWRhMCksCisgICAgV1RDMCgweGU0YzgzZTYwKSwgV1RDMCgweGU0NzgyNDAwKSwgV1RDMCgweGU0MjY5ODQwKSwgV1RDMCgweGUzZDQyZGMwKSwKKyAgICBXVEMwKDB4ZTM4MTg4YzApLCBXVEMwKDB4ZTMyZjRiZTApLCBXVEMwKDB4ZTJkZGVlYTApLCBXVEMwKDB4ZTI4ZGI1MjApLAorICAgIFdUQzAoMHhlMjNlZTAwMCksIFdUQzAoMHhlMWYxYTU4MCksIFdUQzAoMHhlMWE1ZTNhMCksIFdUQzAoMHhlMTViMzVhMCksCisgICAgV1RDMCgweGUxMTEzODYwKSwgV1RDMCgweGUwYzc4YTAwKSwgV1RDMCgweGUwN2RkMGUwKSwgV1RDMCgweGUwMzNiN2MwKSwKKyAgICBXVEMwKDB4ZGZlOGU2ODApLCBXVEMwKDB4ZGY5ZDFmYzApLCBXVEMwKDB4ZGY1MDU1YzApLCBXVEMwKDB4ZGYwMjg3YzApLAorICAgIFdUQzAoMHhkZWIzYjM0MCksIFdUQzAoMHhkZTYzZTdjMCksIFdUQzAoMHhkZTEzNGEwMCksIFdUQzAoMHhkZGMyMDAwMCksCisgICAgV1RDMCgweGRkNzAzMTgwKSwgV1RDMCgweGRkMWUxMjgwKSwgV1RDMCgweGRjY2JlMDgwKSwgV1RDMCgweGRjNzlkOTgwKSwKKyAgICBXVEMwKDB4ZGMyODM2MDApLCBXVEMwKDB4ZGJkNzFlMDApLCBXVEMwKDB4ZGI4NmIxNDApLCBXVEMwKDB4ZGIzNzEwYzApLAorICAgIFdUQzAoMHhkYWU4NTBjMCksIFdUQzAoMHhkYTlhNmJjMCksIFdUQzAoMHhkYTRkNTY0MCksIFdUQzAoMHhkYTAxMDY0MCksCisgICAgV1RDMCgweGQ5YjU2NjQwKSwgV1RDMCgweGQ5NmE1NzAwKSwgV1RDMCgweGQ5MWZiNzAwKSwgV1RDMCgweGQ4ZDU2NjAwKSwKKyAgICBXVEMwKDB4ZDg4YjRhNDApLCBXVEMwKDB4ZDg0MTRmMDApLCBXVEMwKDB4ZDdmNzVmODApLCBXVEMwKDB4ZDdhZDY3NDApLAorICAgIFdUQzAoMHhkNzYzNTJjMCksIFdUQzAoMHhkNzE5MTA0MCksIFdUQzAoMHhkNmNlOGM4MCksIFdUQzAoMHhkNjgzYmQwMCksCisgICAgV1RDMCgweGQ2MzhhNWMwKSwgV1RDMCgweGQ1ZWQ0ZjgwKSwgV1RDMCgweGQ1YTFjMjQwKSwgV1RDMCgweGQ1NTYyYjgwKSwKKyAgICBXVEMwKDB4ZDUwYWU1MDApLCBXVEMwKDB4ZDRjMDRjODApLCBXVEMwKDB4ZDQ3NmJiNDApLCBXVEMwKDB4ZDQyZTYyYzApLAorICAgIFdUQzAoMHhkM2U3NTY4MCksIFdUQzAoMHhkM2ExYWQwMCksIFdUQzAoMHhkMzVkNjc4MCksIFdUQzAoMHhkMzFhNDMwMCksCisgICAgV1RDMCgweGQyZDdkYzAwKSwgV1RDMCgweGQyOTVkMDgwKSwgV1RDMCgweGQyNTNkOGMwKSwgV1RDMCgweGQyMTFkZjQwKSwKKyAgICBXVEMwKDB4ZDFjZmRiYzApLCBXVEMwKDB4ZDE4ZGM0ODApLCBXVEMwKDB4ZDE0YjlkYzApLCBXVEMwKDB4ZDEwOTdjODApLAorICAgIFdUQzAoMHhkMGM3NzcwMCksIFdUQzAoMHhkMDg1YTUwMCksIFdUQzAoMHhkMDQ0MmY0MCksIFdUQzAoMHhkMDAzNGE4MCksCisgICAgV1RDMCgweGNmYzMyYzAwKSwgV1RDMCgweGNmODQwNDAwKSwgV1RDMCgweGNmNDVmNDAwKSwgV1RDMCgweGNmMDkxM2MwKSwKKyAgICBXVEMwKDB4Y2VjZDgwMDApLCBXVEMwKDB4Y2U5MzJjODApLCBXVEMwKDB4Y2U1OWJmNDApLCBXVEMwKDB4Y2UyMGNkNDApLAorICAgIFdUQzAoMHhjZGU3ZWM0MCksIFdUQzAoMHhjZGFlZWRjMCksIFdUQzAoMHhjZDc1ZWEwMCksIFdUQzAoMHhjZDNjZmVjMCksCisgICAgV1RDMCgweGNkMDQ0YjQwKSwgV1RDMCgweGNjY2JmZjAwKSwgV1RDMCgweGNjOTQ1NDgwKSwgV1RDMCgweGNjNWQ4NzgwKSwKKyAgICBXVEMwKDB4Y2MyN2MzYzApLCBXVEMwKDB4Y2JmMmZjNDApLCBXVEMwKDB4Y2JiZjBhMDApLCBXVEMwKDB4Y2I4YmM3YzApLAorICAgIFdUQzAoMHhjYjU5MTg4MCksIFdUQzAoMHhjYjI2ZjBjMCksIFdUQzAoMHhjYWY1NDk4MCksIFdUQzAoMHhjYWM0MWFjMCksCisgICAgV1RDMCgweGNhOTM2NDQwKSwgV1RDMCgweGNhNjMyZDgwKSwgV1RDMCgweGNhMzM3ZjAwKSwgV1RDMCgweGNhMDQ2MTgwKSwKKyAgICBXVEMwKDB4YzlkNWRkNDApLCBXVEMwKDB4YzlhN2ZhODApLCBXVEMwKDB4Yzk3YWMyMDApLCBXVEMwKDB4Yzk0ZTNjMDApLAorICAgIFdUQzAoMHhjOTFkMTg0MCksIFdUQzAoMHhjOGYxNTk4MCksIFdUQzAoMHhjOGM1MjM0MCksIFdUQzAoMHhjODk4ODEwMCksCisgICAgV1RDMCgweGM4NmI3ZjAwKSwgV1RDMCgweGM4M2UyOGMwKSwgV1RDMCgweGM4MTA4YTgwKSwgV1RDMCgweGM3ZTJhZmMwKSwKKyAgICBXVEMwKDB4YzdiNGE0ODApLCBXVEMwKDB4Yzc4Njc0ODApLCBXVEMwKDB4Yzc1ODJiNDApLCBXVEMwKDB4YzcyOWNjODApLAorICAgIFdUQzAoMHhjNmZiNTcwMCksIFdUQzAoMHhjNmNjY2E0MCksIFdUQzAoMHhjNjllMjE4MCksIFdUQzAoMHhjNjZmNDljMCksCisgICAgV1RDMCgweGM2NDAyOWMwKSwgV1RDMCgweGM2MTBhNzQwKSwgV1RDMCgweGM1ZTBiZmMwKSwgV1RDMCgweGM1YjA5ZTgwKSwKKyAgICBXVEMwKDB4YzU4MDc5MDApLCBXVEMwKDB4YzU1MDg0NDApLCBXVEMwKDB4YzUyMGU4NDApLCBXVEMwKDB4YzRmMWJkYzApLAorICAgIFdUQzAoMHhjNGMzMWQwMCksIFdUQzAoMHhjNDk1MTc4MCksIFdUQzAoMHhjNDY3OGEwMCksIFdUQzAoMHhjNDNhMjhjMCksCisgICAgV1RDMCgweGM0MGNhODAwKSwgV1RDMCgweGMzZGVjY2MwKSwgV1RDMCgweGMzYjA5OTQwKSwgV1RDMCgweGMzODIyYzAwKSwKKyAgICBXVEMwKDB4YzM1M2EwYzApLCBXVEMwKDB4YzMyNTE3NDApLCBXVEMwKDB4YzJmNmI1MDApLCBXVEMwKDB4YzJjOGExNDApLAorICAgIFdUQzAoMHhjMjliMDJjMCksIFdUQzAoMHhjMjZkZjVjMCksIFdUQzAoMHhjMjQxODk0MCksIFdUQzAoMHhjMjE1Y2JjMCksCisgICAgV1RDMCgweGMxZWFjYTAwKSwgV1RDMCgweGMxYzA4NjgwKSwgV1RDMCgweGMxOTZmYjAwKSwgV1RDMCgweGMxNmUyMmMwKSwKKyAgICBXVEMwKDB4YzE0NWYwNDApLCBXVEMwKDB4YzExZTNhODApLCBXVEMwKDB4YzBmNmNjMDApLCBXVEMwKDB4YzBjZjZlYzApLAorICAgIFdUQzAoMHhjMGE4MDJjMCksIFdUQzAoMHhjMDgwOTI4MCksIFdUQzAoMHhjMDU5MzM0MCksIFdUQzAoMHhjMDMxZjg4MCksCisgICAgV1RDMCgweGMwMGIwNGMwKSwgV1RDMCgweGJmZTQ4OTgxKSwgV1RDMCgweGJmYmViYjgxKSwgV1RDMCgweGJmOTljYjAxKSwKKyAgICBXVEMwKDB4YmY3NWNjODEpLCBXVEMwKDB4YmY1MmMxMDEpLCBXVEMwKDB4YmYzMGE5MDEpLCBXVEMwKDB4YmYwZjgzMDEpLAorICAgIFdUQzAoMHhiZWVmNDYwMSksIFdUQzAoMHhiZWNmZTYwMSksIFdUQzAoMHhiZWIxNTcwMSksIFdUQzAoMHhiZTkzOGM4MSksCisgICAgV1RDMCgweGJlNzY3ZTgxKSwgV1RDMCgweGJlNWEyMzAxKSwgV1RDMCgweGJlM2U3MjAxKSwgV1RDMCgweGJlMjM2MDAxKSwKKyAgICBXVEMwKDB4YmUwOGUxODEpLCBXVEMwKDB4YmRlZWU5ODEpLCBXVEMwKDB4YmRkNTZiODEpLCBXVEMwKDB4YmRiYzYzODEpLAorICAgIFdUQzAoMHhiZGEzZDA4MSksIFdUQzAoMHhiZDhiYjI4MSksIFdUQzAoMHhiZDc0MGI4MSksIFdUQzAoMHhiZDVjZTI4MSksCisgICAgV1RDMCgweGJkNDY0MjgxKSwgV1RDMCgweGJkMzAzNTgxKSwgV1RDMCgweGJkMWFjODAxKSwgV1RDMCgweGJkMDYwYzgxKSwKKyAgICBXVEMwKDB4YmNmMjE2MDEpLCBXVEMwKDB4YmNkZWY3MDEpLCBXVEMwKDB4YmNjY2JkMDEpLCBXVEMwKDB4YmNiYjcwMDEpLAorICAgIFdUQzAoMHhiY2FiMTc4MSksIFdUQzAoMHhiYzliYjkwMSksIFdUQzAoMHhiYzhkNTEwMSksIFdUQzAoMHhiYzdmZDMwMSksCisgICAgV1RDMCgweGJjNzMzNDAxKSwgV1RDMCgweGJjNjc2NTAxKSwgV1RDMCgweGJjNWM0YzgxKSwgV1RDMCgweGJjNTFjYjAxKSwKKyAgICBXVEMwKDB4YmM0N2MyODEpLCBXVEMwKDB4YmMzZTE5ODEpLCBXVEMwKDB4YmMzNGMwODEpLCBXVEMwKDB4YmMyYmFiMDEpLAorICAgIFdUQzAoMHhiYzIyY2Q4MSksIFdUQzAoMHhiYzFhMjQwMSksIFdUQzAoMHhiYzExYjY4MSksIFdUQzAoMHhiYzA5OGQ4MSksCisgICAgV1RDMCgweGJjMDFiMzgxKSwgV1RDMCgweGJiZmEzYzAxKSwgV1RDMCgweGJiZjM0MjgxKSwgV1RDMCgweGJiZWNlMjgxKSwKKyAgICBXVEMwKDB4YmJlNzMyMDEpLCBXVEMwKDB4YmJlMjMyODEpLCBXVEMwKDB4YmJkZGRiMDEpLCBXVEMwKDB4YmJkYTI1MDEpLAorICAgIFdUQzAoMHhiYmQ3MDIwMSksIFdUQzAoMHhiYmQ0NTYwMSksIFdUQzAoMHhiYmQyMDMwMSksIFdUQzAoMHhiYmNmZWE4MSksCisgICAgV1RDMCgweGJiY2UwNjAxKSwgV1RDMCgweGJiY2M2YjAxKSwgV1RDMCgweGJiY2IzMjAxKSwgV1RDMCgweGJiY2E3NDgxKSwKKyAgICBXVEMwKDB4YmJjYTVkMDEpLCBXVEMwKDB4YmJjYjIyODEpLCBXVEMwKDB4YmJjY2ZjODEpLCBXVEMwKDB4YmJkMDEzMDEpLAorICAgIFdUQzAoMHhiYmQ0NTg4MSksIFdUQzAoMHhiYmQ5YTc4MSksIFdUQzAoMHhiYmRmZGI4MSksIFdUQzAoMHhiYmU2YzgwMSksCisgICAgV1RDMCgweGJiZWUyZjgxKSwgV1RDMCgweGJiZjVkMTgxKSwgV1RDMCgweGJiZmQ2YzAxKSwgV1RDMCgweGJjMDRlMzgxKSwKKyAgICBXVEMwKDB4YmMwYzQ1ODEpLCBXVEMwKDB4YmMxM2E0ODEpLCBXVEMwKDB4YmMxYjEwODEpLCBXVEMwKDB4YmMyMjhmMDEpLAorICAgIFdUQzAoMHhiYzJhMWE4MSksIFdUQzAoMHhiYzMxYWYwMSksIFdUQzAoMHhiYzM5NDkwMSksIFdUQzAoMHhiYzQwZTg4MSksCisgICAgV1RDMCgweGJjNDg4ZTgxKSwgV1RDMCgweGJjNTAzYjgxKSwgV1RDMCgweGJjNTdmMTAxKSwgV1RDMCgweGJjNWZhZTgxKSwKKyAgICBXVEMwKDB4YmM2Nzc1MDEpLCBXVEMwKDB4YmM2ZjQ0MDEpLCBXVEMwKDB4YmM3NzFjMDEpLCBXVEMwKDB4YmM3ZWZjODEpLAorICAgIFdUQzAoMHhiYzg2ZTU4MSksIFdUQzAoMHhiYzhlZDcwMSksIFdUQzAoMHhiYzk2ZDEwMSksIFdUQzAoMHhiYzllZDQ4MSksCisgICAgV1RDMCgweGJjYTZlMTAxKSwgV1RDMCgweGJjYWVmNzAxKSwgV1RDMCgweGJjYjcxNzAxKSwgV1RDMCgweGJjYmY0MDAxKSwKKyAgICBXVEMwKDB4YmNjNzcxODEpLCBXVEMwKDB4YmNjZmFjMDEpLCBXVEMwKDB4YmNkN2VmMDEpLCBXVEMwKDB4YmNlMDNiODEpLAorICAgIFdUQzAoMHhiY2U4OTI4MSksIFdUQzAoMHhiY2YwZjM4MSksIFdUQzAoMHhiY2Y5NWU4MSksIFdUQzAoMHhiZDAxZDI4MSksCisgICAgV1RDMCgweGJkMGE0ZjgxKSwgV1RDMCgweGJkMTJkNTgxKSwgV1RDMCgweGJkMWI2NTAxKSwgV1RDMCgweGJkMjNmZjAxKSwKKyAgICBXVEMwKDB4YmQyY2EyODEpLCBXVEMwKDB4YmQzNTUwODEpLCBXVEMwKDB4YmQzZTA4MDEpLCBXVEMwKDB4YmQ0NmM4MDEpLAorICAgIFdUQzAoMHhiZDRmOTEwMSksIFdUQzAoMHhiZDU4NjI4MSksIFdUQzAoMHhiZDYxM2Q4MSksIFdUQzAoMHhiZDZhMjIwMSksCisgICAgV1RDMCgweGJkNzMxMDgxKSwgV1RDMCgweGJkN2MwNzgxKSwgV1RDMCgweGJkODUwNzAxKSwgV1RDMCgweGJkOGUwZTAxKSwKKyAgICBXVEMwKDB4YmQ5NzFjODEpLCBXVEMwKDB4YmRhMDMzODEpLCBXVEMwKDB4YmRhOTUzMDEpLCBXVEMwKDB4YmRiMjdiMDEpLAorICAgIFdUQzAoMHhiZGJiYWIwMSksIFdUQzAoMHhiZGM0ZTMwMSksIFdUQzAoMHhiZGNlMjE4MSksIFdUQzAoMHhiZGQ3NjcwMSksCisgICAgV1RDMCgweGJkZTBiMzAxKSwgV1RDMCgweGJkZWEwNjgxKSwgV1RDMCgweGJkZjM2MTAxKSwgV1RDMCgweGJkZmNjMzAxKSwKKyAgICBXVEMwKDB4YmUwNjJiODEpLCBXVEMwKDB4YmUwZjlhMDEpLCBXVEMwKDB4YmUxOTBkODEpLCBXVEMwKDB4YmUyMjg2ODEpLAorICAgIFdUQzAoMHhiZTJjMDUwMSksIFdUQzAoMHhiZTM1ODkwMSksIFdUQzAoMHhiZTNmMTM4MSksIFdUQzAoMHhiZTQ4YTMwMSksCisgICAgV1RDMCgweGJlNTIzNzgxKSwgV1RDMCgweGJlNWJkMDAxKSwgV1RDMCgweGJlNjU2YzAxKSwgV1RDMCgweGJlNmYwYzAxKSwKKyAgICBXVEMwKDB4YmU3OGIwMDEpLCBXVEMwKDB4YmU4MjU4MDEpLCBXVEMwKDB4YmU4YzA1MDEpLCBXVEMwKDB4YmU5NWI1ODEpLAorICAgIFdUQzAoMHhiZTlmNjkwMSksIFdUQzAoMHhiZWE5MWYwMSksIFdUQzAoMHhiZWIyZDY4MSksIFdUQzAoMHhiZWJjOTE4MSksCisgICAgV1RDMCgweGJlYzY0ZTgxKSwgV1RDMCgweGJlZDAwZjgxKSwgV1RDMCgweGJlZDlkMjgxKSwgV1RDMCgweGJlZTM5ODAxKSwKKyAgICBXVEMwKDB4YmVlZDVmMDEpLCBXVEMwKDB4YmVmNzI2ODEpLCBXVEMwKDB4YmYwMGVmODEpLCBXVEMwKDB4YmYwYWJhMDEpLAorICAgIFdUQzAoMHhiZjE0ODY4MSksIFdUQzAoMHhiZjFlNTUwMSksIFdUQzAoMHhiZjI4MjUwMSksIFdUQzAoMHhiZjMxZjUwMSksCisgICAgV1RDMCgweGJmM2JjNjAxKSwgV1RDMCgweGJmNDU5NjgxKSwgV1RDMCgweGJmNGY2ODAxKSwgV1RDMCgweGJmNTkzYTAxKSwKKyAgICBXVEMwKDB4YmY2MzBkODEpLCBXVEMwKDB4YmY2Y2UyMDEpLCBXVEMwKDB4YmY3NmI3MDEpLCBXVEMwKDB4YmY4MDhiODEpLAorICAgIFdUQzAoMHhiZjhhNWY4MSksIFdUQzAoMHhiZjk0MzMwMSksIFdUQzAoMHhiZjllMDcwMSksIFdUQzAoMHhiZmE3ZGMwMSksCisgICAgV1RDMCgweGJmYjFiMTAxKSwgV1RDMCgweGJmYmI4NzAxKSwgV1RDMCgweGJmYzU1YzgxKSwgV1RDMCgweGJmY2YzMTgxKSwKKyAgICBXVEMwKDB4YmZkOTA2MDEpLCBXVEMwKDB4YmZlMmQ5MDEpLCBXVEMwKDB4YmZlY2FhODEpLCBXVEMwKDB4YmZmNjdhMDEpLAorICAgIC8qIHBhcnQgMSAqLworICAgIFdUQzEoMHg4MDEzMDk4MSksIFdUQzEoMHg4MDI2OWY4MSksIFdUQzEoMHg4MDNhMzM4MSksIFdUQzEoMHg4MDRkYzQ4MSksCisgICAgV1RDMSgweDgwNjE1MjgxKSwgV1RDMSgweDgwNzRkYzAxKSwgV1RDMSgweDgwODg2MDgxKSwgV1RDMSgweDgwOWJkZjAxKSwKKyAgICBXVEMxKDB4ODBhZjU3MDEpLCBXVEMxKDB4ODBjMmM3ODEpLCBXVEMxKDB4ODBkNjMxMDEpLCBXVEMxKDB4ODBlOTk0MDEpLAorICAgIFdUQzEoMHg4MGZjZjE4MSksIFdUQzEoMHg4MTEwNGEwMSksIFdUQzEoMHg4MTIzOWQ4MSksIFdUQzEoMHg4MTM2ZWEwMSksCisgICAgV1RDMSgweDgxNGEyZjgxKSwgV1RDMSgweDgxNWQ2YzAxKSwgV1RDMSgweDgxNzBhMTgxKSwgV1RDMSgweDgxODNjZjgxKSwKKyAgICBXVEMxKDB4ODE5NmY3ODEpLCBXVEMxKDB4ODFhYTE5ODEpLCBXVEMxKDB4ODFiZDM0MDEpLCBXVEMxKDB4ODFkMDQ2ODEpLAorICAgIFdUQzEoMHg4MWUzNGY4MSksIFdUQzEoMHg4MWY2NGYwMSksIFdUQzEoMHg4MjA5NDU4MSksIFdUQzEoMHg4MjFjMzQwMSksCisgICAgV1RDMSgweDgyMmYxYjAxKSwgV1RDMSgweDgyNDFmYTAxKSwgV1RDMSgweDgyNTRjZjAxKSwgV1RDMSgweDgyNjc5OTAxKSwKKyAgICBXVEMxKDB4ODI3YTU4MDEpLCBXVEMxKDB4ODI4ZDBiMDEpLCBXVEMxKDB4ODI5ZmI0MDEpLCBXVEMxKDB4ODJiMjUzMDEpLAorICAgIFdUQzEoMHg4MmM0ZTgwMSksIFdUQzEoMHg4MmQ3NzIwMSksIFdUQzEoMHg4MmU5ZWYwMSksIFdUQzEoMHg4MmZjNWYwMSksCisgICAgV1RDMSgweDgzMGVjMDgxKSwgV1RDMSgweDgzMjExNTAxKSwgV1RDMSgweDgzMzM1YzgxKSwgV1RDMSgweDgzNDU5ODgxKSwKKyAgICBXVEMxKDB4ODM1N2M3MDEpLCBXVEMxKDB4ODM2OWU3ODEpLCBXVEMxKDB4ODM3YmY4MDEpLCBXVEMxKDB4ODM4ZGY4MDEpLAorICAgIFdUQzEoMHg4MzlmZTgwMSksIFdUQzEoMHg4M2IxYzg4MSksIFdUQzEoMHg4M2MzOWE4MSksIFdUQzEoMHg4M2Q1NWQwMSksCisgICAgV1RDMSgweDgzZTcwZjAxKSwgV1RDMSgweDgzZjhiMDAxKSwgV1RDMSgweDg0MGEzZTgxKSwgV1RDMSgweDg0MWJiOTgxKSwKKyAgICBXVEMxKDB4ODQyZDIyODEpLCBXVEMxKDB4ODQzZTdhODEpLCBXVEMxKDB4ODQ0ZmMwODEpLCBXVEMxKDB4ODQ2MGY1ODEpLAorICAgIFdUQzEoMHg4NDcyMTcwMSksIFdUQzEoMHg4NDgzMjQ4MSksIFdUQzEoMHg4NDk0MWQ4MSksIFdUQzEoMHg4NGE1MDIwMSksCisgICAgV1RDMSgweDg0YjVkMzAxKSwgV1RDMSgweDg0YzY5MTAxKSwgV1RDMSgweDg0ZDczYzAxKSwgV1RDMSgweDg0ZTdkMzgxKSwKKyAgICBXVEMxKDB4ODRmODU1ODEpLCBXVEMxKDB4ODUwOGMxODEpLCBXVEMxKDB4ODUxOTE4MDEpLCBXVEMxKDB4ODUyOTU4ODEpLAorICAgIFdUQzEoMHg4NTM5ODQ4MSksIFdUQzEoMHg4NTQ5OWQwMSksIFdUQzEoMHg4NTU5YTA4MSksIFdUQzEoMHg4NTY5OGU4MSksCisgICAgV1RDMSgweDg1Nzk2NjAxKSwgV1RDMSgweDg1ODkyNjgxKSwgV1RDMSgweDg1OThkMDgxKSwgV1RDMSgweDg1YTg2NTgxKSwKKyAgICBXVEMxKDB4ODViN2U2MDEpLCBXVEMxKDB4ODVjNzUyMDEpLCBXVEMxKDB4ODVkNmE5ODEpLCBXVEMxKDB4ODVlNWViODEpLAorICAgIFdUQzEoMHg4NWY1MTY4MSksIFdUQzEoMHg4NjA0MmMwMSksIFdUQzEoMHg4NjEzMmMwMSksIFdUQzEoMHg4NjIyMTgwMSksCisgICAgV1RDMSgweDg2MzBmMTgxKSwgV1RDMSgweDg2M2ZiNzAxKSwgV1RDMSgweDg2NGU2OTAxKSwgV1RDMSgweDg2NWQwNTgxKSwKKyAgICBXVEMxKDB4ODY2YjhkODEpLCBXVEMxKDB4ODY3YTAwODEpLCBXVEMxKDB4ODY4ODYwMDEpLCBXVEMxKDB4ODY5NmFkMDEpLAorICAgIFdUQzEoMHg4NmE0ZTc4MSksIFdUQzEoMHg4NmIzMGYwMSksIFdUQzEoMHg4NmMxMjQwMSksIFdUQzEoMHg4NmNmMjYwMSksCisgICAgV1RDMSgweDg2ZGQxNDgxKSwgV1RDMSgweDg2ZWFmMDgxKSwgV1RDMSgweDg2ZjhiYTgxKSwgV1RDMSgweDg3MDY3MjgxKSwKKyAgICBXVEMxKDB4ODcxNDFiMDEpLCBXVEMxKDB4ODcyMWI0ODEpLCBXVEMxKDB4ODcyZjQyMDEpLCBXVEMxKDB4ODczY2MyMDEpLAorICAgIFdUQzEoMHg4NzRhMmYwMSksIFdUQzEoMHg4NzU3ODE4MSksIFdUQzEoMHg4NzY0YjEwMSksIFdUQzEoMHg4NzcxYzYwMSksCisgICAgV1RDMSgweDg3N2VkZTAxKSwgV1RDMSgweDg3OGMxODgxKSwgV1RDMSgweDg3OTk4ZjAxKSwgV1RDMSgweDg3YTcwZTgxKSwKKyAgICBXVEMxKDB4ODdiNDI0ODEpLCBXVEMxKDB4ODdjMDVlODEpLCBXVEMxKDB4ODdjYjUxMDEpLCBXVEMxKDB4ODdkNGFjODEpLAorICAgIFdUQzEoMHg4N2U3M2Q4MSksIFdUQzEoMHg4ODEyNDI4MSksIFdUQzEoMHg4ODM1MzUwMSksIFdUQzEoMHg4ODVmODQ4MSksCisgICAgV1RDMSgweDg4OGQzMTgxKSwgV1RDMSgweDg4YmUxNjgxKSwgV1RDMSgweDg4ZjEzODAxKSwgV1RDMSgweDg5MjVmMTAxKSwKKyAgICBXVEMxKDB4ODk1YmNkMDEpLCBXVEMxKDB4ODk5MjVhODEpLCBXVEMxKDB4ODljOTJmODEpLCBXVEMxKDB4OGEwMDFmMDEpLAorICAgIFdUQzEoMHg4YTM3Mjg4MSksIFdUQzEoMHg4YTZlNGEwMSksIFdUQzEoMHg4YWE1ODY4MSksIFdUQzEoMHg4YWRjZWUwMSksCisgICAgV1RDMSgweDhiMTQ5NzAxKSwgV1RDMSgweDhiNGM5NzAxKSwgV1RDMSgweDhiODUwMjgxKSwgV1RDMSgweDhiYmRlOTgxKSwKKyAgICBXVEMxKDB4OGJmNzViMDEpLCBXVEMxKDB4OGMzMTY2ODEpLCBXVEMxKDB4OGM2YzFiMDEpLCBXVEMxKDB4OGNhNzg3ODEpLAorICAgIFdUQzEoMHg4Y2UzYmE4MSksIFdUQzEoMHg4ZDIwYzMwMSksIFdUQzEoMHg4ZDVlYWEwMSksIFdUQzEoMHg4ZDlkNzc4MSksCisgICAgV1RDMSgweDhkZGQzMjAxKSwgV1RDMSgweDhlMWRlMDAxKSwgV1RDMSgweDhlNWY4ODgxKSwgV1RDMSgweDhlYTIzMjAxKSwKKyAgICBXVEMxKDB4OGVlNWUzMDEpLCBXVEMxKDB4OGYyYWExMDEpLCBXVEMxKDB4OGY3MDZmMDEpLCBXVEMxKDB4OGZiNzRmODEpLAorICAgIFdUQzEoMHg4ZmZmNDYwMSksIFdUQzEoMHg5MDQ4NTQwMSksIFdUQzEoMHg5MDkyN2I4MSksIFdUQzEoMHg5MGRkYzAwMSksCisgICAgV1RDMSgweDkxMmEyMjAxKSwgV1RDMSgweDkxNzdhMzAxKSwgV1RDMSgweDkxYzY0MzAxKSwgV1RDMSgweDkyMTYwMzAxKSwKKyAgICBXVEMxKDB4OTI2NmUyODEpLCBXVEMxKDB4OTJiOGUxMDEpLCBXVEMxKDB4OTMwYmZmODEpLCBXVEMxKDB4OTM2MDNkMDEpLAorICAgIFdUQzEoMHg5M2I1OTkwMSksIFdUQzEoMHg5NDBjMTI4MSksIFdUQzEoMHg5NDYzYTg4MSksIFdUQzEoMHg5NGJjNTk4MSksCisgICAgV1RDMSgweDk1MTYyMzgxKSwgV1RDMSgweDk1NzEwNjAxKSwgV1RDMSgweDk1Y2NmZjAxKSwgV1RDMSgweDk2MmEwYzgxKSwKKyAgICBXVEMxKDB4OTY4ODJlMDEpLCBXVEMxKDB4OTZlNzYxMDEpLCBXVEMxKDB4OTc0N2E0ODEpLCBXVEMxKDB4OTdhOGY2ODEpLAorICAgIFdUQzEoMHg5ODBiNTUwMSksIFdUQzEoMHg5ODZlYmQ4MSksIFdUQzEoMHg5OGQzMmQ4MSksIFdUQzEoMHg5OTM4YTI4MSksCisgICAgV1RDMSgweDk5OWYxOTgxKSwgV1RDMSgweDlhMDY5MDAxKSwgV1RDMSgweDlhNmYwMzgxKSwgV1RDMSgweDlhZDg3MDgxKSwKKyAgICBXVEMxKDB4OWI0MmQ1ODEpLCBXVEMxKDB4OWJhZTJmODEpLCBXVEMxKDB4OWMxYTdjODEpLCBXVEMxKDB4OWM4N2JhODEpLAorICAgIFdUQzEoMHg5Y2Y1ZTcwMSksIFdUQzEoMHg5ZDY1MDA4MSksIFdUQzEoMHg5ZGQ1MDQ4MSksIFdUQzEoMHg5ZTQ1ZjA4MSksCisgICAgV1RDMSgweDllYjdjMTAxKSwgV1RDMSgweDlmMmE3MjgxKSwgV1RDMSgweDlmOWUwMzAxKSwgV1RDMSgweGEwMTI3MDgxKSwKKyAgICBXVEMxKDB4YTA4N2I5ODEpLCBXVEMxKDB4YTBmZGRkODEpLCBXVEMxKDB4YTE3NGRhODEpLCBXVEMxKDB4YTFlY2FlMDEpLAorICAgIFdUQzEoMHhhMjY1NTU4MSksIFdUQzEoMHhhMmRlY2U4MSksIFdUQzEoMHhhMzU5MTgwMSksIFdUQzEoMHhhM2Q0MzAwMSksCisgICAgV1RDMSgweGE0NTAxNjAxKSwgV1RDMSgweGE0Y2NjOTAxKSwgV1RDMSgweGE1NGE0NzAxKSwgV1RDMSgweGE1Yzg5MDAxKSwKKyAgICBXVEMxKDB4YTY0N2EzMDEpLCBXVEMxKDB4YTZjNzdlMDEpLCBXVEMxKDB4YTc0ODIxMDEpLCBXVEMxKDB4YTdjOThiMDEpLAorICAgIFdUQzEoMHhhODRiYmI4MSksIFdUQzEoMHhhOGNlYjIwMSksIFdUQzEoMHhhOTUyNmQ4MSksIFdUQzEoMHhhOWQ2ZWYwMSksCisgICAgV1RDMSgweGFhNWMzNjAxKSwgV1RDMSgweGFhZTI0MzAxKSwgV1RDMSgweGFiNjkxNjgxKSwgV1RDMSgweGFiZjBiMTgxKSwKKyAgICBXVEMxKDB4YWM3OTE0MDEpLCBXVEMxKDB4YWQwMjNmMDEpLCBXVEMxKDB4YWQ4YzMzMDEpLCBXVEMxKDB4YWUxNmYwMDEpLAorICAgIFdUQzEoMHhhZWEyNzY4MSksIFdUQzEoMHhhZjJlYzkwMSksIFdUQzEoMHhhZmJiZTgwMSksIFdUQzEoMHhiMDQ5ZDYwMSksCisgICAgV1RDMSgweGIwZDg5NDAxKSwgV1RDMSgweGIxNjgyMjgxKSwgV1RDMSgweGIxZjg4MTgxKSwgV1RDMSgweGIyODliMTgxKSwKKyAgICBXVEMxKDB4YjMxYmIzMDEpLCBXVEMxKDB4YjNhZTg2MDEpLCBXVEMxKDB4YjQ0MjJiODEpLCBXVEMxKDB4YjRkNmEzODEpLAorICAgIFdUQzEoMHg0YTVhMzI3ZiksIFdUQzEoMHg0OWM0YWRmZiksIFdUQzEoMHg0OTJlNjM3ZiksIFdUQzEoMHg0ODk3NGY3ZiksCisgICAgV1RDMSgweDQ3ZmY2ZDdmKSwgV1RDMSgweDQ3NjZiYWZmKSwgV1RDMSgweDQ2Y2QzNWZmKSwgV1RDMSgweDQ2MzJkZDdmKSwKKyAgICBXVEMxKDB4NDU5N2IwZmYpLCBXVEMxKDB4NDRmYmIxZmYpLCBXVEMxKDB4NDQ1ZWVhZmYpLCBXVEMxKDB4NDNjMTY1ZmYpLAorICAgIFdUQzEoMHg0MzIzMjI3ZiksIFdUQzEoMHg0Mjg0Mjc3ZiksIFdUQzEoMHg0MWU0OGFmZiksIFdUQzEoMHg0MTQ0NTU3ZiksCisgICAgV1RDMSgweDQwYTM4NjdmKSwgV1RDMSgweDQwMDFmNWZmKSwgV1RDMSgweDNmNWY1ZDgwKSwgV1RDMSgweDNlYmJhZDAwKSwKKyAgICBXVEMxKDB4M2UxNmVlNDApLCBXVEMxKDB4M2Q3MTNkMDApLCBXVEMxKDB4M2NjYWI3MDApLCBXVEMxKDB4M2MyMzY1MDApLAorICAgIFdUQzEoMHgzYjdiNTgwMCksIFdUQzEoMHgzYWQyZWNjMCksIFdUQzEoMHgzYTJhNjU0MCksIFdUQzEoMHgzOTgxYjdjMCksCisgICAgV1RDMSgweDM4ZDhiYTAwKSwgV1RDMSgweDM4MmYwMWMwKSwgV1RDMSgweDM3ODQ2MjQwKSwgV1RDMSgweDM2ZDhlYjAwKSwKKyAgICBXVEMxKDB4MzYyYzllYzApLCBXVEMxKDB4MzU3ZjdhMDApLCBXVEMxKDB4MzRkMTgzNDApLCBXVEMxKDB4MzQyMmM5MDApLAorICAgIFdUQzEoMHgzMzczNmM0MCksIFdUQzEoMHgzMmMzOTA0MCksIFdUQzEoMHgzMjEzNDI4MCksIFdUQzEoMHgzMTYyOTI4MCksCisgICAgV1RDMSgweDMwYjFhMDAwKSwgV1RDMSgweDMwMDA4MzgwKSwgV1RDMSgweDJmNGY0MjQwKSwgV1RDMSgweDJlOWRmMTgwKSwKKyAgICBXVEMxKDB4MmRlY2M3ODApLCBXVEMxKDB4MmQzYmQ2NDApLCBXVEMxKDB4MmM4YjBjYzApLCBXVEMxKDB4MmJkYTMwODApLAorICAgIFdUQzEoMHgyYjI4ZWM4MCksIFdUQzEoMHgyYTc3MzUwMCksIFdUQzEoMHgyOWM1MWI0MCksIFdUQzEoMHgyOTEyOTNjMCksCisgICAgV1RDMSgweDI4NWY5MjgwKSwgV1RDMSgweDI3YWMzNWMwKSwgV1RDMSgweDI2ZjhhYjQwKSwgV1RDMSgweDI2NDU0YzAwKSwKKyAgICBXVEMxKDB4MjU5MjU2MDApLCBXVEMxKDB4MjRkZmQ1ODApLCBXVEMxKDB4MjQyZGRkNDApLCBXVEMxKDB4MjM3Yzg3YzApLAorICAgIFdUQzEoMHgyMmNiZTI0MCksIFdUQzEoMHgyMjFiZWY0MCksIFdUQzEoMHgyMTZjYjA0MCksIFdUQzEoMHgyMGJlMjgwMCksCisgICAgV1RDMSgweDIwMTA1YzgwKSwgV1RDMSgweDFmNjM1MmEwKSwgV1RDMSgweDFlYjcxMjQwKSwgV1RDMSgweDFlMGJhMTQwKSwKKyAgICBXVEMxKDB4MWQ2MGZlNDApLCBXVEMxKDB4MWNiNzIzZTApLCBXVEMxKDB4MWMwZTAzMDApLCBXVEMxKDB4MWI2NTk2YzApLAorICAgIFdUQzEoMHgxYWJkZThhMCksIFdUQzEoMHgxYTE2ZmJlMCksIFdUQzEoMHgxOTcwYzY4MCksIFdUQzEoMHgxOGNiNDg0MCksCisgICAgV1RDMSgweDE4MjY4ZTIwKSwgV1RDMSgweDE3ODJhMGMwKSwgV1RDMSgweDE2ZGY4OTYwKSwgV1RDMSgweDE2M2Q2MzAwKSwKKyAgICBXVEMxKDB4MTU5YzUyYzApLCBXVEMxKDB4MTRmYzg3ZTApLCBXVEMxKDB4MTQ1ZTJjODApLCBXVEMxKDB4MTNjMTViNjApLAorICAgIFdUQzEoMHgxMzI2MzI0MCksIFdUQzEoMHgxMjhjZDlhMCksIFdUQzEoMHgxMWY1NjJhMCksIFdUQzEoMHgxMTVmYzFjMCksCisgICAgV1RDMSgweDEwY2JmMTYwKSwgV1RDMSgweDEwMzlmMjAwKSwgV1RDMSgweDBmYTlhMDgwKSwgV1RDMSgweDBmMWFiZDkwKSwKKyAgICBXVEMxKDB4MGU4ZDAxZDApLCBXVEMxKDB4MGUwMDMzMzApLCBXVEMxKDB4MGQ3NDM1OTApLCBXVEMxKDB4MGNlOGVmNDApLAorICAgIFdUQzEoMHgwYzVlMTkwMCksIFdUQzEoMHgwYmQzNWQ3MCksIFdUQzEoMHgwYjQ4OGViMCksIFdUQzEoMHgwYWJkODQxMCksCisgICAgV1RDMSgweDBhMzIwYTAwKSwgV1RDMSgweDA5YTYwZTcwKSwgV1RDMSgweDA5MTlhYjAwKSwgV1RDMSgweDA4OGQwZGUwKSwKKyAgICBXVEMxKDB4MDgwMDY1ZTApLCBXVEMxKDB4MDc3Mzk3MTApLCBXVEMxKDB4MDZlNjU4MDgpLCBXVEMxKDB4MDY1ODgzNDgpLAorICAgIFdUQzEoMHgwNWNhMGFlMCksIFdUQzEoMHgwNTNhYWFmOCksIFdUQzEoMHgwNGE5ZmFmMCksIFdUQzEoMHgwNDE3ZjY5OCksCisgICAgV1RDMSgweDAzODU5ZmY0KSwgV1RDMSgweDAyZjQ5YmU0KSwgV1RDMSgweDAyNjZiNjY4KSwgV1RDMSgweDAxZGU1NTRlKSwKKyAgICBXVEMxKDB4MDE1ZjUwY2EpLCBXVEMxKDB4MDBlYjdlNWQpLCBXVEMxKDB4MDA5MDRmMjQpLCBXVEMxKDB4MDAyMTI4ODkpLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksIFdUQzEoMHgwMDAwMDAwMCksCisgICAgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwgV1RDMSgweDAwMDAwMDAwKSwKKyAgICBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLCBXVEMxKDB4MDAwMDAwMDApLAorICAgIC8qIHBhcnQgMiAqLworICAgIFdUQzIoMHhmZmZlY2UwMiksIFdUQzIoMHhmZmU0YzNkZiksIFdUQzIoMHhmZmNhYWE1NSksIFdUQzIoMHhmZmIwODdkMSksCisgICAgV1RDMigweGZmOTY2MmJmKSwgV1RDMigweGZmN2M0MThiKSwgV1RDMigweGZmNjIyYWEwKSwgV1RDMigweGZmNDgyNDZjKSwKKyAgICBXVEMyKDB4ZmYyZTM1NWEpLCBXVEMyKDB4ZmYxNDYzZGIpLCBXVEMyKDB4ZmVmYWI2MDgpLCBXVEMyKDB4ZmVlMTJmMGEpLAorICAgIFdUQzIoMHhmZWM3Y2ZkMiksIFdUQzIoMHhmZWFlOTk1YSksIFdUQzIoMHhmZTk1OGNjNCksIFdUQzIoMHhmZTdjYWJjZSksCisgICAgV1RDMigweGZlNjNmODgyKSwgV1RDMigweGZlNGI3NGUwKSwgV1RDMigweGZlMzMyMmY2KSwgV1RDMigweGZlMWIwNGRjKSwKKyAgICBXVEMyKDB4ZmUwMzFjY2MpLCBXVEMyKDB4ZmRlYjZjZjApLCBXVEMyKDB4ZmRkM2ZmN2MpLCBXVEMyKDB4ZmRiY2U4MzQpLAorICAgIFdUQzIoMHhmZGE2M2JiOCksIFdUQzIoMHhmZDkwMGM2OCksIFdUQzIoMHhmZDdhNTkwYyksIFdUQzIoMHhmZDY1MTFiNCksCisgICAgV1RDMigweGZkNTAyNmMwKSwgV1RDMigweGZkM2I4OTU0KSwgV1RDMigweGZkMjcyZGYwKSwgV1RDMigweGZkMTMwYWRjKSwKKyAgICBXVEMyKDB4ZmNmZjE1YWMpLCBXVEMyKDB4ZmNlYjRhNjgpLCBXVEMyKDB4ZmNkN2IxMTApLCBXVEMyKDB4ZmNjNDU0ZDApLAorICAgIFdUQzIoMHhmY2IxNDA2NCksIFdUQzIoMHhmYzllODk2YyksIFdUQzIoMHhmYzhjNTI2NCksIFdUQzIoMHhmYzdhYmVmMCksCisgICAgV1RDMigweGZjNjlmMDc4KSwgV1RDMigweGZjNTlmNWU4KSwgV1RDMigweGZjNGFjZmVjKSwgV1RDMigweGZjM2M4MDYwKSwKKyAgICBXVEMyKDB4ZmMyZjAyNjQpLCBXVEMyKDB4ZmMyMjNiN2MpLCBXVEMyKDB4ZmMxNjA3MTQpLCBXVEMyKDB4ZmMwYTQxNTApLAorICAgIFdUQzIoMHhmYmZlYzkyMCksIFdUQzIoMHhmYmYzODMyMCksIFdUQzIoMHhmYmU4NTVkMCksIFdUQzIoMHhmYmRkMjc0MCksCisgICAgV1RDMigweGZiZDFmYzY4KSwgV1RDMigweGZiYzZmZWEwKSwgV1RDMigweGZiYmM1YTQ4KSwgV1RDMigweGZiYjIzYjQ4KSwKKyAgICBXVEMyKDB4ZmJhOGNhNzgpLCBXVEMyKDB4ZmJhMDJlNTApLCBXVEMyKDB4ZmI5ODhkZTApLCBXVEMyKDB4ZmI5MjBiNDApLAorICAgIFdUQzIoMHhmYjhjYjg3MCksIFdUQzIoMHhmYjg4OWY2OCksIFdUQzIoMHhmYjg1Y2JlOCksIFdUQzIoMHhmYjg0M2RkMCksCisgICAgV1RDMigweGZiODNkZjc4KSwgV1RDMigweGZiODQ5NWQwKSwgV1RDMigweGZiODY0NjYwKSwgV1RDMigweGZiODhkNGE4KSwKKyAgICBXVEMyKDB4ZmI4YzIxZTgpLCBXVEMyKDB4ZmI5MDBmMjgpLCBXVEMyKDB4ZmI5NDdkYzApLCBXVEMyKDB4ZmI5OTUwYzApLAorICAgIFdUQzIoMHhmYjllNmQwOCksIFdUQzIoMHhmYmEzYjY1OCksIFdUQzIoMHhmYmE5MTkwOCksIFdUQzIoMHhmYmFlOWUwOCksCisgICAgV1RDMigweGZiYjQ1YmQwKSwgV1RDMigweGZiYmE2NmY4KSwgV1RDMigweGZiYzBkY2YwKSwgV1RDMigweGZiYzdlYWQ4KSwKKyAgICBXVEMyKDB4ZmJjZmMyMDApLCBXVEMyKDB4ZmJkODkzMzApLCBXVEMyKDB4ZmJlMjk0ZDApLCBXVEMyKDB4ZmJlZTAzZDApLAorICAgIFdUQzIoMHhmYmZiMWRlOCksIFdUQzIoMHhmYzBhMWRhNCksIFdUQzIoMHhmYzFiMjJlMCksIFdUQzIoMHhmYzJlMzhmMCksCisgICAgV1RDMigweGZjNDM2ZDQ4KSwgV1RDMigweGZjNWFiZjdjKSwgV1RDMigweGZjNzQwMjRjKSwgV1RDMigweGZjOGVmMmU4KSwKKyAgICBXVEMyKDB4ZmNhYjUxYWMpLCBXVEMyKDB4ZmNjOGQwMjQpLCBXVEMyKDB4ZmNlNzA0ZjApLCBXVEMyKDB4ZmQwNTgwY2MpLAorICAgIFdUQzIoMHhmZDIzZDRkMCksIFdUQzIoMHhmZDQxY2U0MCksIFdUQzIoMHhmZDVmODFiMCksIFdUQzIoMHhmZDdkMDhmMCksCisgICAgV1RDMigweGZkOWE4NTYwKSwgV1RDMigweGZkYjg1OTM4KSwgV1RDMigweGZkZDcxNzk4KSwgV1RDMigweGZkZjc1M2I4KSwKKyAgICBXVEMyKDB4ZmUxOTkzZWUpLCBXVEMyKDB4ZmUzZTMwZjgpLCBXVEMyKDB4ZmU2NTZjYmEpLCBXVEMyKDB4ZmU4ZjhmZGMpLAorICAgIFdUQzIoMHhmZWJjYThhNCksIFdUQzIoMHhmZWVjNTkwZSksIFdUQzIoMHhmZjFlMjg1YyksIFdUQzIoMHhmZjUxYTBiNyksCisgICAgV1RDMigweGZmODY2MzMwKSwgV1RDMigweGZmYmMyY2JiKSwgV1RDMigweGZmZjJiYmZmKSwgV1RDMigweDAwMjlkNzlkKSwKKyAgICBXVEMyKDB4MDA2MThhMjIpLCBXVEMyKDB4MDA5YTExODUpLCBXVEMyKDB4MDBkM2FhOGMpLCBXVEMyKDB4MDEwZThmZjYpLAorICAgIFdUQzIoMHgwMTRhZjI5ZSksIFdUQzIoMHgwMTg4ZmU1NiksIFdUQzIoMHgwMWM4ZTEwOCksIFdUQzIoMHgwMjBhYjNjNCksCisgICAgV1RDMigweDAyNGU2OGE4KSwgV1RDMigweDAyOTNlODI0KSwgV1RDMigweDAyZGIxYmM4KSwgV1RDMigweDAzMjNmMWE0KSwKKyAgICBXVEMyKDB4MDM2ZTVkNmMpLCBXVEMyKDB4MDNiYTUzMjApLCBXVEMyKDB4MDQwN2M5MzgpLCBXVEMyKDB4MDQ1NmNhZDApLAorICAgIFdUQzIoMHgwNGE3NzI4OCksIFdUQzIoMHgwNGY5ZGI4OCksIFdUQzIoMHgwNTRlMTg4OCksIFdUQzIoMHgwNWE0MWVmMCksCisgICAgV1RDMigweDA1ZmJkNmUwKSwgV1RDMigweDA2NTUyOGMwKSwgV1RDMigweDA2YjAwODM4KSwgV1RDMigweDA3MGM3ZWUwKSwKKyAgICBXVEMyKDB4MDc2YTliYjApLCBXVEMyKDB4MDdjYTZkMTApLCBXVEMyKDB4MDgyYzA4ZTApLCBXVEMyKDB4MDg4ZjhkYTApLAorICAgIFdUQzIoMHgwOGY1MWFjMCksIFdUQzIoMHgwOTVjY2MyMCksIFdUQzIoMHgwOWM2OWY3MCksIFdUQzIoMHgwYTMyN2I0MCksCisgICAgV1RDMigweDBhYTA0NmQwKSwgV1RDMigweDBiMGZlYmIwKSwgV1RDMigweDBiODE1ZGQwKSwgV1RDMigweDBiZjQ5NjAwKSwKKyAgICBXVEMyKDB4MGM2OThjNTApLCBXVEMyKDB4MGNlMDNiYTApLCBXVEMyKDB4MGQ1OGEzODApLCBXVEMyKDB4MGRkMmM1MTApLAorICAgIFdUQzIoMHgwZTRlYTExMCksIFdUQzIoMHgwZWNjM2RkMCksIFdUQzIoMHgwZjRiYTgwMCksIFdUQzIoMHgwZmNjZWQxMCksCisgICAgV1RDMigweDEwNTAxOTYwKSwgV1RDMigweDEwZDUzMmEwKSwgV1RDMigweDExNWMzOWMwKSwgV1RDMigweDExZTUyZmEwKSwKKyAgICBXVEMyKDB4MTI3MDE1NjApLCBXVEMyKDB4MTJmY2VmMjApLCBXVEMyKDB4MTM4YmMyMDApLCBXVEMyKDB4MTQxYzkzMDApLAorICAgIFdUQzIoMHgxNGFmNjRhMCksIFdUQzIoMHgxNTQ0MzRlMCksIFdUQzIoMHgxNWRiMDAyMCksIFdUQzIoMHgxNjczYzM2MCksCisgICAgV1RDMigweDE3MGU3ZTgwKSwgV1RDMigweDE3YWIzNWUwKSwgV1RDMigweDE4NDllZTQwKSwgV1RDMigweDE4ZWFhYmEwKSwKKyAgICBXVEMyKDB4MTk4ZDZmMDApLCBXVEMyKDB4MWEzMjM2YTApLCBXVEMyKDB4MWFkOTAwODApLCBXVEMyKDB4MWI4MWNjNjApLAorICAgIFdUQzIoMHgxYzJjOWRhMCksIFdUQzIoMHgxY2Q5Nzk4MCksIFdUQzIoMHgxZDg4NjVjMCksIFdUQzIoMHgxZTM5NjU0MCksCisgICAgV1RDMigweDFlZWM3NzAwKSwgV1RDMigweDFmYTE5OGMwKSwgV1RDMigweDIwNThjODQwKSwgV1RDMigweDIxMTIwNjQwKSwKKyAgICBXVEMyKDB4MjFjZDU3MDApLCBXVEMyKDB4MjI4YWJlYzApLCBXVEMyKDB4MjM0YTQxODApLCBXVEMyKDB4MjQwYmRmODApLAorICAgIFdUQzIoMHgyNGNmOTVjMCksIFdUQzIoMHgyNTk1NjFjMCksIFdUQzIoMHgyNjVkNDIwMCksIFdUQzIoMHgyNzI3Mzg0MCksCisgICAgV1RDMigweDI3ZjM0OGMwKSwgV1RDMigweDI4YzE3NzAwKSwgV1RDMigweDI5OTFjNTAwKSwgV1RDMigweDJhNjQzMDgwKSwKKyAgICBXVEMyKDB4MmIzOGI2ODApLCBXVEMyKDB4MmMwZjUzYzApLCBXVEMyKDB4MmNlODA4NDApLCBXVEMyKDB4MmRjMmQ2ODApLAorICAgIFdUQzIoMHgyZTlmYzEwMCksIFdUQzIoMHgyZjdlY2FjMCksIFdUQzIoMHgzMDVmZjI4MCksIFdUQzIoMHgzMTQzMzRjMCksCisgICAgV1RDMigweDMyMjg4ZTAwKSwgV1RDMigweDMzMGZmYjgwKSwgV1RDMigweDMzZjk3ZDgwKSwgV1RDMigweDM0ZTUxNWMwKSwKKyAgICBXVEMyKDB4MzVkMmM1YzApLCBXVEMyKDB4MzZjMjhkMDApLCBXVEMyKDB4MzdiNDY3YzApLCBXVEMyKDB4MzhhODUwODApLAorICAgIFdUQzIoMHgzOTllNDI0MCksIFdUQzIoMHgzYTk2M2EwMCksIFdUQzIoMHgzYjkwMzYwMCksIFdUQzIoMHgzYzhjMzQ4MCksCisgICAgV1RDMigweDNkOGEzMzgwKSwgV1RDMigweDNlOGEyZGMwKSwgV1RDMigweDNmOGMxYjQwKSwgV1RDMigweDQwOGZmMmZmKSwKKyAgICBXVEMyKDB4NDE5NWFlN2YpLCBXVEMyKDB4NDI5ZDQ3N2YpLCBXVEMyKDB4NDNhNmI4N2YpLCBXVEMyKDB4NDRiMWZkZmYpLAorICAgIFdUQzIoMHg0NWJmMTFmZiksIFdUQzIoMHg0NmNkZWU3ZiksIFdUQzIoMHg0N2RlOGNmZiksIFdUQzIoMHg0OGYwZTc3ZiksCisgICAgV1RDMigweDRhMDUwZWZmKSwgV1RDMigweDRiMWIyZGZmKSwgV1RDMigweDRjMzM3MmZmKSwgV1RDMigweDRkNGUwYmZmKSwKKyAgICBXVEMyKDB4NGU2YjI1N2YpLCBXVEMyKDB4NGY4YWVkZmYpLCBXVEMyKDB4NTBhZDkyZmYpLCBXVEMyKDB4NTFkMzQxZmYpLAorICAgIFdUQzIoMHgwMDIwMDZhOSksIFdUQzIoMHgwMDBiZmIzNiksIFdUQzIoMHhmZmZlNDVhYyksIFdUQzIoMHhmZmY2ZDA2NCksCisgICAgV1RDMigweGZmZjU4NWJjKSwgV1RDMigweGZmZmE1MDBkKSwgV1RDMigweDAwMDUxOWI0KSwgV1RDMigweDAwMTVjZDBjKSwKKyAgICBXVEMyKDB4MDAyYzU0NzApLCBXVEMyKDB4MDA0ODlhM2IpLCBXVEMyKDB4MDA2YTg4YzgpLCBXVEMyKDB4MDA5MjBhNzQpLAorICAgIFdUQzIoMHgwMGJmMDk5OSksIFdUQzIoMHgwMGYxNzA5MiksIFdUQzIoMHgwMTI5MjliYyksIFdUQzIoMHgwMTY2MWY3MCksCisgICAgV1RDMigweDAxYTgzYzBjKSwgV1RDMigweDAxZWY2OWU4KSwgV1RDMigweDAyM2I5MzY0KSwgV1RDMigweDAyOGNhMmQ0KSwKKyAgICBXVEMyKDB4MDJlMjgyOWMpLCBXVEMyKDB4MDMzZDFkMTApLCBXVEMyKDB4MDM5YzVjOTApLCBXVEMyKDB4MDQwMDJiNzgpLAorICAgIFdUQzIoMHgwNDY4NzQxOCksIFdUQzIoMHgwNGQ1MjBlMCksIFdUQzIoMHgwNTQ2MWMxOCksIFdUQzIoMHgwNWJiNTAyMCksCisgICAgV1RDMigweDA2MzRhNzU4KSwgV1RDMigweDA2YjIwYzIwKSwgV1RDMigweDA3MzM2OGM4KSwgV1RDMigweDA3YjhhN2IwKSwKKyAgICBXVEMyKDB4MDg0MWIzNDApLCBXVEMyKDB4MDhjZTc1YjApLCBXVEMyKDB4MDk1ZWQ5ODApLCBXVEMyKDB4MDlmMmM5MDApLAorICAgIFdUQzIoMHgwYThhMmU4MCksIFdUQzIoMHgwYjI0ZjQ3MCksIFdUQzIoMHgwYmMzMDUxMCksIFdUQzIoMHgwYzY0NGFkMCksCisgICAgV1RDMigweDBkMDhiMDEwKSwgV1RDMigweDBkYjAxZjEwKSwgV1RDMigweDBlNWE4MjUwKSwgV1RDMigweDBmMDdjNDAwKSwKKyAgICBXVEMyKDB4MGZiN2NlYTApLCBXVEMyKDB4MTA2YThjODApLCBXVEMyKDB4MTExZmU4MDApLCBXVEMyKDB4MTFkN2NiNjApLAorICAgIFdUQzIoMHgxMjkyMjEyMCksIFdUQzIoMHgxMzRlZDNhMCksIFdUQzIoMHgxNDBkY2QwMCksIFdUQzIoMHgxNGNlZjdlMCksCisgICAgV1RDMigweDE1OTIzZTYwKSwgV1RDMigweDE2NTc4YjAwKSwgV1RDMigweDE3MWVjODIwKSwgV1RDMigweDE3ZTdlMDIwKSwKKyAgICBXVEMyKDB4MThiMmJkMjApLCBXVEMyKDB4MTk3ZjQ5YzApLCBXVEMyKDB4MWE0ZDcwNDApLCBXVEMyKDB4MWIxZDFiMDApLAorICAgIFdUQzIoMHgxYmVlMzQ2MCksIFdUQzIoMHgxY2MwYTZhMCksIFdUQzIoMHgxZDk0NWM0MCksIFdUQzIoMHgxZTY5M2Y4MCksCisgICAgV1RDMigweDFmM2YzYWMwKSwgV1RDMigweDIwMTYzODgwKSwgV1RDMigweDIwZWUyMmMwKSwgV1RDMigweDIxYzZlNDQwKSwKKyAgICBXVEMyKDB4MjJhMDY3NDApLCBXVEMyKDB4MjM3YTk2MDApLCBXVEMyKDB4MjQ1NTVhYzApLCBXVEMyKDB4MjUzMGEwNDApLAorICAgIFdUQzIoMHgyNjBjNTA4MCksIFdUQzIoMHgyNmU4NTYwMCksIFdUQzIoMHgyN2M0OWIwMCksIFdUQzIoMHgyOGExMGEwMCksCisgICAgV1RDMigweDI5N2Q4ZDgwKSwgV1RDMigweDJhNWEwZjgwKSwgV1RDMigweDJiMzY3YTgwKSwgV1RDMigweDJjMTJiOGMwKSwKKyAgICBXVEMyKDB4MmNlZWI1MDApLCBXVEMyKDB4MmRjYTU5NDApLCBXVEMyKDB4MmVhNThmYzApLCBXVEMyKDB4MmY4MDQzNDApLAorICAgIFdUQzIoMHgzMDVhNWRjMCksIFdUQzIoMHgzMTMzY2EwMCksIFdUQzIoMHgzMjBjNzIwMCksIFdUQzIoMHgzMmU0NDAwMCksCisgICAgV1RDMigweDMzYmIxZWMwKSwgV1RDMigweDM0OTBmODgwKSwgV1RDMigweDM1NjViN2MwKSwgV1RDMigweDM2Mzk0NjQwKSwKKyAgICBXVEMyKDB4MzcwYjhmMDApLCBXVEMyKDB4MzdkYzdjMDApLCBXVEMyKDB4MzhhYmY3YzApLCBXVEMyKDB4Mzk3OWVjYzApLAorICAgIFdUQzIoMHgzYTQ2NDUwMCksIFdUQzIoMHgzYjEwZWIwMCksIFdUQzIoMHgzYmQ5Yzk0MCksIFdUQzIoMHgzY2EwYzljMCksCisgICAgV1RDMigweDNkNjVkNzQwKSwgV1RDMigweDNlMjhkYzAwKSwgV1RDMigweDNlZTljMjQwKSwgV1RDMigweDNmYTg3NDgwKSwKKyAgICBXVEMyKDB4NDA2NGRjZmYpLCBXVEMyKDB4NDExZWU2N2YpLCBXVEMyKDB4NDFkNjdhN2YpLCBXVEMyKDB4NDI4Yjg0N2YpLAorICAgIFdUQzIoMHg0MzNkZWQ3ZiksIFdUQzIoMHg0M2VkYTBmZiksIFdUQzIoMHg0NDlhODg3ZiksIFdUQzIoMHg0NTQ0OGY3ZiksCisgICAgV1RDMigweDQ1ZWI5ZWZmKSwgV1RDMigweDQ2OGZhMWZmKSwgV1RDMigweDQ3MzA4MmZmKSwgV1RDMigweDQ3Y2UyYzdmKSwKKyAgICBXVEMyKDB4NDg2ODg4N2YpLCBXVEMyKDB4NDhmZjgwZmYpLCBXVEMyKDB4NDk5MzAwZmYpLCBXVEMyKDB4NGEyMmYyZmYpLAorICAgIFdUQzIoMHg0YWFmNDA3ZiksIFdUQzIoMHg0YjM3ZDQ3ZiksIFdUQzIoMHg0YmJjOTk3ZiksIFdUQzIoMHg0YzNkNzhmZiksCisgICAgV1RDMigweDRjYmE1ZTdmKSwgV1RDMigweDRkMzMzMzdmKSwgV1RDMigweDRkYTdlMjdmKSwgV1RDMigweDRlMTg1NjdmKSwKKyAgICBXVEMyKDB4NGU4NDc4ZmYpLCBXVEMyKDB4NGVlYzM0N2YpLCBXVEMyKDB4NGY0ZjczN2YpLCBXVEMyKDB4NGZhZTIwZmYpLAorICAgIFdUQzIoMHg1MDA4MjVmZiksIFdUQzIoMHg1MDVkNmRmZiksIFdUQzIoMHg1MGFkZTM3ZiksIFdUQzIoMHg1MGY5NmY3ZiksCisgICAgV1RDMigweDUxM2ZmZGZmKSwgV1RDMigweDUxODE3N2ZmKSwgV1RDMigweDUxYmRjODdmKSwgV1RDMigweDUxZjRkOWZmKSwKKyAgICBXVEMyKDB4NTIyNjk2N2YpLCBXVEMyKDB4NTI1MmU4N2YpLCBXVEMyKDB4NTI3OWI5ZmYpLCBXVEMyKDB4NTI5YWY1ZmYpLAorICAgIFdUQzIoMHg1MmI2ODY3ZiksIFdUQzIoMHg1MmNjNTVmZiksIFdUQzIoMHg1MmRjNGVmZiksIFdUQzIoMHg1MmU2NWFmZiksCisgICAgV1RDMigweDUyZWE2NTdmKSwgV1RDMigweDUyZTg1N2ZmKSwgV1RDMigweDUyZTAxZDdmKSwgV1RDMigweDUyZDE5ZmZmKSwKKyAgICBXVEMyKDB4NTJiY2M5ZmYpLCBXVEMyKDB4NTJhMTg1N2YpLCBXVEMyKDB4NTI3ZmJkN2YpLCBXVEMyKDB4NTI1NzViN2YpLAorICAgIFdUQzIoMHg1MjI4NGE3ZiksIFdUQzIoMHg1MWYyNzRmZiksIFdUQzIoMHg1MWI1YzQ3ZiksIFdUQzIoMHg1MTcyMjQ3ZiksCisgICAgV1RDMigweDUxMjc3ZGZmKSwgV1RDMigweDUwZDViYzdmKSwgV1RDMigweDUwN2NjOWZmKSwgV1RDMigweDUwMWM5MGZmKSwKKyAgICBXVEMyKDB4NGZiNGZiN2YpLCBXVEMyKDB4NGY0NWYzZmYpLCBXVEMyKDB4NGVjZjY0ZmYpLCBXVEMyKDB4NGU1MTM4ZmYpLAorICAgIFdUQzIoMHg0ZGNiNTk3ZiksIFdUQzIoMHg0ZDNkYjFmZiksIFdUQzIoMHg0Y2E4MmJmZiksIFdUQzIoMHg0YzBhYjI3ZiksCisgICAgV1RDMigweDRiNjUyZjdmKSwgV1RDMigweDRhYjc4ZDdmKSwgV1RDMigweDRhMDFiNjdmKSwgV1RDMigweDQ5NDM5NTdmKSwKKyAgICBXVEMyKDB4NDg3ZDEyZmYpLCBXVEMyKDB4NDdhZTFmN2YpLCBXVEMyKDB4NDZkNjhmN2YpLCBXVEMyKDB4NDVmNzE4N2YpLAorICAgIFdUQzIoMHg0NTEzNTk3ZiksIFdUQzIoMHg0NDMwNDY3ZiksIFdUQzIoMHg0MzUyZDJmZiksIFdUQzIoMHg0MjdlNmJmZiksCisgICAgV1RDMigweDQxYjM5MGZmKSwgV1RDMigweDQwZjIwNzdmKSwgV1RDMigweDQwMzlhODdmKSwgV1RDMigweDNmOGEzMTAwKSwKKyAgICBXVEMyKDB4M2VlMzNlMDApLCBXVEMyKDB4M2U0NDZhYzApLCBXVEMyKDB4M2RhZDUxODApLCBXVEMyKDB4M2QxZDdmYzApLAorICAgIFdUQzIoMHgzYzk0N2IwMCksIFdUQzIoMHgzYzExYzdjMCksIFdUQzIoMHgzYjk0ZWJjMCksIFdUQzIoMHgzYjFkNmRjMCksCisgICAgV1RDMigweDNhYWFkNDgwKSwgV1RDMigweDNhM2NhNzQwKSwgV1RDMigweDM5ZDI2YzQwKSwgV1RDMigweDM5NmJhOGMwKSwKKyAgICBXVEMyKDB4MzkwN2UwODApLCBXVEMyKDB4MzhhNjk4MDApLCBXVEMyKDB4Mzg0NzNkODApLCBXVEMyKDB4MzdlOTIzYzApLAorICAgIFdUQzIoMHgzNzhiOWI4MCksIFdUQzIoMHgzNzJlMDM4MCksIFdUQzIoMHgzNmQwM2E4MCksIFdUQzIoMHgzNjcyN2YwMCksCisgICAgV1RDMigweDM2MTUwZTQwKSwgV1RDMigweDM1YjgxNTQwKSwgV1RDMigweDM1NWI4MDAwKSwgV1RDMigweDM0ZmYxZGMwKSwKKyAgICBXVEMyKDB4MzRhMmJmYzApLCBXVEMyKDB4MzQ0NjNlODApLCBXVEMyKDB4MzNlOTgyYzApLCBXVEMyKDB4MzM4Yzc4ODApLAorICAgIFdUQzIoMHgzMzJmMGJjMCksIFdUQzIoMHgzMmQxMTgwMCksIFdUQzIoMHgzMjcyNjVjMCksIFdUQzIoMHgzMjEyYmJjMCksCisgICAgV1RDMigweDMxYjFlNzQwKSwgV1RDMigweDMxNGZlZjAwKSwgV1RDMigweDMwZWQwNTQwKSwgV1RDMigweDMwODk1YzgwKSwKKyAgICBXVEMyKDB4MzAyNTE4ODApLCBXVEMyKDB4MmZjMDI4ODApLCBXVEMyKDB4MmY1YTY0ODApLCBXVEMyKDB4MmVmM2E0ODApLAorICAgIFdUQzIoMHgyZThiZDY0MCksIFdUQzIoMHgyZTIzMTEwMCksIFdUQzIoMHgyZGI5NzY4MCksIFdUQzIoMHgyZDRmMjcwMCksCisgICAgV1RDMigweDJjZTQzMWMwKSwgV1RDMigweDJjNzg5MDgwKSwgV1RDMigweDJjMGMzYmMwKSwgV1RDMigweDJiOWYyYmMwKSwKKyAgICBXVEMyKDB4MmIzMTU5NDApLCBXVEMyKDB4MmFjMmJjMDApLCBXVEMyKDB4MmE1MzRjYzApLCBXVEMyKDB4MjllMzAzYzApfTsKKworY29uc3QgRklYUF9XVEIgRUxEQW5hbHlzaXMyNTZbNzY4XSA9IHsKKyAgICBXVEMoMHhmYWJhYmRlOCksIFdUQygweGZhOGUxZTZhKSwgV1RDKDB4ZmE2MDEyYTkpLCBXVEMoMHhmYTMwYzhkZCksCisgICAgV1RDKDB4ZmEwMDZmNGIpLCBXVEMoMHhmOWNmMzJjNCksIFdUQygweGY5OWQxY2M4KSwgV1RDKDB4Zjk2YTE0OGQpLAorICAgIFdUQygweGY5MzYxODRkKSwgV1RDKDB4ZjkwMTNkNWIpLCBXVEMoMHhmOGNiN2I2NyksIFdUQygweGY4OTRhY2UwKSwKKyAgICBXVEMoMHhmODVjZDI4ZSksIFdUQygweGY4MjQxM2Y4KSwgV1RDKDB4ZjdlYTkwYWYpLCBXVEMoMHhmN2IwNWVlNiksCisgICAgV1RDKDB4Zjc3NTliMGIpLCBXVEMoMHhmNzNhNjcxZiksIFdUQygweGY2ZmViZWEzKSwgV1RDKDB4ZjZjMjdhMGUpLAorICAgIFdUQygweGY2ODVjYTMzKSwgV1RDKDB4ZjY0OTM5MDcpLCBXVEMoMHhmNjBkNDM3YiksIFdUQygweGY1ZDI1NTFmKSwKKyAgICBXVEMoMHhmNTk4ZDI3MyksIFdUQygweGY1NjExOTllKSwgV1RDKDB4ZjUyYjhjNmYpLCBXVEMoMHhmNGY4OTA3ZCksCisgICAgV1RDKDB4ZjRjODdmZGYpLCBXVEMoMHhmNDliYTgwNiksIFdUQygweGY0NzI0Mjg2KSwgV1RDKDB4ZjQ0YzYxMjcpLAorICAgIFdUQygweGY0MjgyNDM1KSwgV1RDKDB4ZjQwMWNlYWUpLCBXVEMoMHhmM2Q3NzVhMSksIFdUQygweGYzYTkxNDc3KSwKKyAgICBXVEMoMHhmMzc2YzMzZiksIFdUQygweGYzNDBhMzI4KSwgV1RDKDB4ZjMwNmQ0ZDYpLCBXVEMoMHhmMmM5Nzc1YyksCisgICAgV1RDKDB4ZjI4OGEzZWQpLCBXVEMoMHhmMjQ0NmUyYSksIFdUQygweGYxZmNmYTQ1KSwgV1RDKDB4ZjFiMjdiMmQpLAorICAgIFdUQygweGYxNjRmM2Y0KSwgV1RDKDB4ZjExNDM2NWMpLCBXVEMoMHhmMGMwMDUzMiksIFdUQygweGYwNjgxN2E5KSwKKyAgICBXVEMoMHhmMDBjNGVhNCksIFdUQygweGVmYWNiYzdmKSwgV1RDKDB4ZWY0YTIwNWYpLCBXVEMoMHhlZWU1ZGMzMyksCisgICAgV1RDKDB4ZWU4MDhhMGQpLCBXVEMoMHhlZTE5ZWViMiksIFdUQygweGVkYjEyZjZlKSwgV1RDKDB4ZWQ0NGU4ZWIpLAorICAgIFdUQygweGVjZDUwYTEzKSwgV1RDKDB4ZWM2MmQ4ZGQpLCBXVEMoMHhlYmVmNjhiMiksIFdUQygweGViN2I4MDVjKSwKKyAgICBXVEMoMHhlYjA2OWFmNCksIFdUQygweGVhOGVlZjFjKSwgV1RDKDB4ZWExMzFjODYpLCBXVEMoMHhlOTkyMzRjNiksCisgICAgV1RDKDB4ZTkwY2Q5YzIpLCBXVEMoMHhlODg0ZjY1YiksIFdUQygweGU3ZmNiZDZkKSwgV1RDKDB4ZTc3NjczMDApLAorICAgIFdUQygweGU2ZjI4OWQwKSwgV1RDKDB4ZTY2Zjk1OGEpLCBXVEMoMHhlNWVhZTk5ZiksIFdUQygweGU1NjBjNDAzKSwKKyAgICBXVEMoMHhlNGNmYWFhMSksIFdUQygweGU0Mzg4N2RjKSwgV1RDKDB4ZTM5ZGVkYzQpLCBXVEMoMHhlMzAzZjE5MCksCisgICAgV1RDKDB4ZTI2ZDdmNWQpLCBXVEMoMHhlMWRjMzRmZiksIFdUQygweGUxNGY5Y2VkKSwgV1RDKDB4ZTBjNTNjZDApLAorICAgIFdUQygweGUwM2FiMDg1KSwgV1RDKDB4ZGZhZGM5NDgpLCBXVEMoMHhkZjFkNjQwYyksIFdUQygweGRlODk2YmI2KSwKKyAgICBXVEMoMHhkZGYyNTZhZCksIFdUQygweGRkNTkxZTNkKSwgV1RDKDB4ZGNiZjBhZWMpLCBXVEMoMHhkYzI1YWIwYSksCisgICAgV1RDKDB4ZGI4ZTMzNGMpLCBXVEMoMHhkYWY5Nzc5NCksIFdUQygweGRhNjdiZWQ5KSwgV1RDKDB4ZDlkOGM1MjQpLAorICAgIFdUQygweGQ5NGJmYTYyKSwgV1RDKDB4ZDhjMDg5YjUpLCBXVEMoMHhkODM1YzE1MSksIFdUQygweGQ3YWIxNzA0KSwKKyAgICBXVEMoMHhkNzIwMDkwNiksIFdUQygweGQ2OTQyMGRjKSwgV1RDKDB4ZDYwNzNjMGQpLCBXVEMoMHhkNTc5OTYxNSksCisgICAgV1RDKDB4ZDRlYzdjODcpLCBXVEMoMHhkNDYyNDFjOSksIFdUQygweGQzZGM1YmRlKSwgV1RDKDB4ZDM1YjRhNzkpLAorICAgIFdUQygweGQyZGUxMDMyKSwgV1RDKDB4ZDI2MjQ2ZjUpLCBXVEMoMHhkMWU2OGVkMiksIFdUQygweGQxNmFhMGE0KSwKKyAgICBXVEMoMHhkMGVlYTVkMiksIFdUQygweGQwNzMzMDJiKSwgV1RDKDB4Y2ZmOTM3NDkpLCBXVEMoMHhjZjgyMGY0NSksCisgICAgV1RDKDB4Y2YwZWJiMzApLCBXVEMoMHhjZTlmZDcwMiksIFdUQygweGNlMzQ1OTZjKSwgV1RDKDB4Y2RjOWE4MDMpLAorICAgIFdUQygweGNkNWVjNWQ2KSwgV1RDKDB4Y2NmNDY4ZWMpLCBXVEMoMHhjYzhiYjQxZSksIFdUQygweGNjMjYxOWNjKSwKKyAgICBXVEMoMHhjYmMzZTA5MCksIFdUQygweGNiNjQyMmY1KSwgV1RDKDB4Y2IwNjRkMmYpLCBXVEMoMHhjYWFhMmE2ZCksCisgICAgV1RDKDB4Y2E0ZmJkYzkpLCBXVEMoMHhjOWY3M2M0MyksIFdUQygweGM5YTBkYzliKSwgV1RDKDB4Yzk0Y2RkMDIpLAorICAgIFdUQygweGM4ZjU3OGE0KSwgV1RDKDB4YzhhMjRkMTUpLCBXVEMoMHhjODRkYzcxZiksIFdUQygweGM3ZjgzNTE2KSwKKyAgICBXVEMoMHhjN2ExZTRiOSksIFdUQygweGM3NGIyMmIxKSwgV1RDKDB4YzZmNDEyODQpLCBXVEMoMHhjNjljYWJjMSksCisgICAgV1RDKDB4YzY0NDk4NmQpLCBXVEMoMHhjNWViNDE2NyksIFdUQygweGM1OTEwMzEyKSwgV1RDKDB4YzUzNzJjN2YpLAorICAgIFdUQygweGM0ZGViYTJlKSwgV1RDKDB4YzQ4ODNlY2EpLCBXVEMoMHhjNDMzMTBmMCksIFdUQygweGMzZGQ1YzVhKSwKKyAgICBXVEMoMHhjMzg2ODgwMiksIFdUQygweGMzMmY0MzFkKSwgV1RDKDB4YzJkODZjOWUpLCBXVEMoMHhjMjgzMDBhNiksCisgICAgV1RDKDB4YzIyZmFlMzMpLCBXVEMoMHhjMWRlZDNmNyksIFdUQygweGMxOTA4ZDdkKSwgV1RDKDB4YzE0NGIwZWQpLAorICAgIFdUQygweGMwZmE3Y2VlKSwgV1RDKDB4YzBiMGEzYjUpLCBXVEMoMHhjMDY2YjhkMyksIFdUQygweGMwMWQzYjMyKSwKKyAgICBXVEMoMHhiZmQ1MTYxYyksIFdUQygweGJmOGY5MmFmKSwgV1RDKDB4YmY0ZDVjZWEpLCBXVEMoMHhiZjBlN2Q1ZSksCisgICAgV1RDKDB4YmVkMmNlM2EpLCBXVEMoMHhiZTlhMDA2MiksIFdUQygweGJlNjNjZWMyKSwgV1RDKDB4YmUyZmZkMmYpLAorICAgIFdUQygweGJkZmU0NTY1KSwgV1RDKDB4YmRjZTU1NjgpLCBXVEMoMHhiZGEwMDNkZiksIFdUQygweGJkNzM1MDE4KSwKKyAgICBXVEMoMHhiZDQ4NWIyYyksIFdUQygweGJkMWY2OWJkKSwgV1RDKDB4YmNmOGRiN2MpLCBXVEMoMHhiY2Q1MmIwYSksCisgICAgV1RDKDB4YmNiNGFlNGEpLCBXVEMoMHhiYzk3OTM4MiksIFdUQygweGJjN2RjYmFiKSwgV1RDKDB4YmM2NzA5ZGMpLAorICAgIFdUQygweGJjNTJjMWIxKSwgV1RDKDB4YmM0MDJmMmIpLCBXVEMoMHhiYzJlYzM3YiksIFdUQygweGJjMWUyY2IzKSwKKyAgICBXVEMoMHhiYzBlNWQ1ZiksIFdUQygweGJiZmY4ZjIzKSwgV1RDKDB4YmJmMjM4ZDIpLCBXVEMoMHhiYmU3MDdkNCksCisgICAgV1RDKDB4YmJkZTNjNjMpLCBXVEMoMHhiYmQ3YTY1OCksIFdUQygweGJiZDJjN2YwKSwgV1RDKDB4YmJjZWUxOGIpLAorICAgIFdUQygweGJiY2JkZWJiKSwgV1RDKDB4YmJjYTVhYjEpLCBXVEMoMHhiYmNiNTYyMiksIFdUQygweGJiZDAzMmU0KSwKKyAgICBXVEMoMHhiYmQ5MWQ0ZCksIFdUQygweGJiZTUzNzU3KSwgV1RDKDB4YmJmMzJmNTQpLCBXVEMoMHhiYzAxNjc4MSksCisgICAgV1RDKDB4YmMwZjQzM2EpLCBXVEMoMHhiYzFkMmFhNCksIFdUQygweGJjMmI0OTEyKSwgV1RDKDB4YmMzOTg1ZGYpLAorICAgIFdUQygweGJjNDdkNmI5KSwgV1RDKDB4YmM1NjQwOTkpLCBXVEMoMHhiYzY0Yzc4YSksIFdUQygweGJjNzM2ZDk2KSwKKyAgICBXVEMoMHhiYzgyMzIxMCksIFdUQygweGJjOTExNDg0KSwgV1RDKDB4YmNhMDE1YjgpLCBXVEMoMHhiY2FmMzdlYiksCisgICAgV1RDKDB4YmNiZTdiYzMpLCBXVEMoMHhiY2NkZGU0ZCksIFdUQygweGJjZGQ2MDM3KSwgV1RDKDB4YmNlZDA0OWEpLAorICAgIFdUQygweGJjZmNjYzgxKSwgV1RDKDB4YmQwY2I0ODIpLCBXVEMoMHhiZDFjYmNhYSksIFdUQygweGJkMmNlN2VhKSwKKyAgICBXVEMoMHhiZDNkMzYzYiksIFdUQygweGJkNGRhNDQ1KSwgV1RDKDB4YmQ1ZTMxMmQpLCBXVEMoMHhiZDZlZGZkMSksCisgICAgV1RDKDB4YmQ3ZmFlMTQpLCBXVEMoMHhiZDkwOTkxYiksIFdUQygweGJkYTE5ZmNmKSwgV1RDKDB4YmRiMmM0NjQpLAorICAgIFdUQygweGJkYzQwNTNiKSwgV1RDKDB4YmRkNTVmNGIpLCBXVEMoMHhiZGU2ZDBhMCksIFdUQygweGJkZjg1YzUxKSwKKyAgICBXVEMoMHhiZTA5ZmZhMyksIFdUQygweGJlMWJiNzI0KSwgV1RDKDB4YmUyZDgxNjApLCBXVEMoMHhiZTNmNWY5OCksCisgICAgV1RDKDB4YmU1MTUxNDQpLCBXVEMoMHhiZTYzNTFhOSksIFdUQygweGJlNzU1ZWJkKSwgV1RDKDB4YmU4NzdiOGUpLAorICAgIFdUQygweGJlOTlhNjNkKSwgV1RDKDB4YmVhYmRhNDUpLCBXVEMoMHhiZWJlMTZiMCksIFdUQygweGJlZDA1ZDFjKSwKKyAgICBXVEMoMHhiZWUyYWRhOSksIFdUQygweGJlZjUwMmUyKSwgV1RDKDB4YmYwNzVjNDApLCBXVEMoMHhiZjE5YmMwYiksCisgICAgV1RDKDB4YmYyYzIxN2YpLCBXVEMoMHhiZjNlODg3YSksIFdUQygweGJmNTBmMDlkKSwgV1RDKDB4YmY2MzVjNzcpLAorICAgIFdUQygweGJmNzVjYWMwKSwgV1RDKDB4YmY4ODM5MDUpLCBXVEMoMHhiZjlhYTYyYiksIFdUQygweGJmYWQxNGYxKSwKKyAgICBXVEMoMHhiZmJmODVjNyksIFdUQygweGJmZDFmNTkyKSwgV1RDKDB4YmZlNDYxZmMpLCBXVEMoMHhiZmY2Yzg2YSksCisgICAgV1RDKDB4ODAxMjZjOGQpLCBXVEMoMHg4MDM3MjQ0OCksIFdUQygweDgwNWJkMmZkKSwgV1RDKDB4ODA4MDczMTUpLAorICAgIFdUQygweDgwYTRmZmZhKSwgV1RDKDB4ODBjOTc0OGQpLCBXVEMoMHg4MGVkZDA4YiksIFdUQygweDgxMTIxYTIzKSwKKyAgICBXVEMoMHg4MTM2NGZkZSksIFdUQygweDgxNWE2YjE2KSwgV1RDKDB4ODE3ZTZiMzYpLCBXVEMoMHg4MWEyNTQzMyksCisgICAgV1RDKDB4ODFjNjI1YzgpLCBXVEMoMHg4MWU5ZDgwMSksIFdUQygweDgyMGQ2YTVjKSwgV1RDKDB4ODIzMGUwNjApLAorICAgIFdUQygweDgyNTQzOGMwKSwgV1RDKDB4ODI3NzZhYzcpLCBXVEMoMHg4MjlhNzU1NSksIFdUQygweDgyYmQ1Y2EzKSwKKyAgICBXVEMoMHg4MmUwMWU4MCksIFdUQygweDgzMDJiMjAwKSwgV1RDKDB4ODMyNTE1OTApLCBXVEMoMHg4MzQ3NGQ3OSksCisgICAgV1RDKDB4ODM2OTU2NmYpLCBXVEMoMHg4MzhiMjk1NyksIFdUQygweDgzYWNjMmQ5KSwgV1RDKDB4ODNjZTI3YzEpLAorICAgIFdUQygweDgzZWY1NGI5KSwgV1RDKDB4ODQxMDQyZDEpLCBXVEMoMHg4NDMwZWYxNSksIFdUQygweDg0NTE1ZTg0KSwKKyAgICBXVEMoMHg4NDcxOGUzMiksIFdUQygweDg0OTE3ODA0KSwgV1RDKDB4ODRiMTFhMjUpLCBXVEMoMHg4NGQwNzg4ZCksCisgICAgV1RDKDB4ODRlZjkzMjIpLCBXVEMoMHg4NTBlNjFlYyksIFdUQygweDg1MmNlNDAwKSwgV1RDKDB4ODU0YjFlMGEpLAorICAgIFdUQygweDg1NjkwZjJjKSwgV1RDKDB4ODU4NmIyMDcpLCBXVEMoMHg4NWE0MDU3YiksIFdUQygweDg1YzExMDdkKSwKKyAgICBXVEMoMHg4NWRkZDMzNSksIFdUQygweDg1ZmE0ODVlKSwgV1RDKDB4ODYxNjcxNzIpLCBXVEMoMHg4NjMyNTQ5ZCksCisgICAgV1RDKDB4ODY0ZGYzODgpLCBXVEMoMHg4NjY5NDk3ZSksIFdUQygweDg2ODQ1NzU3KSwgV1RDKDB4ODY5ZjIyMTgpLAorICAgIFdUQygweDg2YjlhYjVhKSwgV1RDKDB4ODZkM2YxYmYpLCBXVEMoMHg4NmVkZjY4ZiksIFdUQygweDg3MDdiYWYxKSwKKyAgICBXVEMoMHg4NzIxNDdlMCksIFdUQygweDg3M2FhNmZjKSwgV1RDKDB4ODc1M2M1NzEpLCBXVEMoMHg4NzZjNzZlNiksCisgICAgV1RDKDB4ODc4NTBhYjcpLCBXVEMoMHg4NzllMzczYiksIFdUQygweDg3YjZlYTM3KSwgV1RDKDB4ODdjYzQxODgpLAorICAgIFdUQygweDg4MGQ0MzAwKSwgV1RDKDB4ODg1NWU5ZmYpLCBXVEMoMHg4OGFjZmNhMCksIFdUQygweDg5MGQwZjk0KSwKKyAgICBXVEMoMHg4OTcxZTdkNSksIFdUQygweDg5ZDhhMGMxKSwgV1RDKDB4OGEzZmM0MjUpLCBXVEMoMHg4YWE3NDEwNSksCisgICAgV1RDKDB4OGIwZjViOTMpLCBXVEMoMHg4Yjc4YTEwNyksIFdUQygweDhiZTM4YmIzKSwgV1RDKDB4OGM1MDgwOTIpLAorICAgIFdUQygweDhjYmZlMzg0KSwgV1RDKDB4OGQzMjE0ZjEpLCBXVEMoMHg4ZGE3NWQyMSksIFdUQygweDhlMWZlOTZjKSwKKyAgICBXVEMoMHg4ZTliZTc2YSksIFdUQygweDhmMWI4MDZjKSwgV1RDKDB4OGY5ZWQzMTQpLCBXVEMoMHg5MDI1ZjI2YSksCisgICAgV1RDKDB4OTBiMGVjZWEpLCBXVEMoMHg5MTNmZDBlYiksIFdUQygweDkxZDJhNjg0KSwgV1RDKDB4OTI2OTZkZWEpLAorICAgIFdUQygweDkzMDQyODY4KSwgV1RDKDB4OTNhMmQ0NTYpLCBXVEMoMHg5NDQ1NmQyMCksIFdUQygweDk0ZWJlOWU1KSwKKyAgICBXVEMoMHg5NTk2NDE3OCksIFdUQygweDk2NDQ2YTA1KSwgV1RDKDB4OTZmNjU5NTgpLCBXVEMoMHg5N2FjMDU5YSksCisgICAgV1RDKDB4OTg2NTYwODkpLCBXVEMoMHg5OTIyNWE4MCksIFdUQygweDk5ZTJlMmU4KSwgV1RDKDB4OWFhNmU2NjYpLAorICAgIFdUQygweDliNmU1NGI4KSwgV1RDKDB4OWMzOTFkOTkpLCBXVEMoMHg5ZDA3MzM4YSksIFdUQygweDlkZDg4ODhkKSwKKyAgICBXVEMoMHg5ZWFkMGI1YyksIFdUQygweDlmODRhODcxKSwgV1RDKDB4YTA1ZjRmYjMpLCBXVEMoMHhhMTNjZjkxMyksCisgICAgV1RDKDB4YTIxZDk4OTEpLCBXVEMoMHhhMzAxMWUyNyksIFdUQygweGEzZTc3ZWI0KSwgV1RDKDB4YTRkMGIxOTApLAorICAgIFdUQygweGE1YmNiMGQ3KSwgV1RDKDB4YTZhYjc1MGMpLCBXVEMoMHhhNzljZjg4NCksIFdUQygweGE4OTEzNWNiKSwKKyAgICBXVEMoMHhhOTg4MmE0NCksIFdUQygweGFhODFkNTc4KSwgV1RDKDB4YWI3ZTM5YTYpLCBXVEMoMHhhYzdkNWEzNiksCisgICAgV1RDKDB4YWQ3ZjNiYTUpLCBXVEMoMHhhZTgzZGZlZCksIFdUQygweGFmOGI0ZTE2KSwgV1RDKDB4YjA5NTkxMWMpLAorICAgIFdUQygweGIxYTJhZmQxKSwgV1RDKDB4YjJiMmFjOWYpLCBXVEMoMHhiM2M1ODgwNyksIFdUQygweGI0ZGI0ZDVlKSwKKyAgICBXVEMoMHg0YTI2OGVhZCksIFdUQygweDQ5MGI1YmE3KSwgV1RDKDB4NDdlZDhkMzApLCBXVEMoMHg0NmNkMTBjNSksCisgICAgV1RDKDB4NDVhOWRjYzEpLCBXVEMoMHg0NDgzZjI2NyksIFdUQygweDQzNWI1YWViKSwgV1RDKDB4NDIzMDFkMTIpLAorICAgIFdUQygweDQxMDIzYTE1KSwgV1RDKDB4M2ZkMTliZjEpLCBXVEMoMHgzZTllMzFlMSksIFdUQygweDNkNjgyOTg2KSwKKyAgICBXVEMoMHgzYzJmYzAwMSksIFdUQygweDNhZjUyZDhmKSwgV1RDKDB4MzliODhiN2QpLCBXVEMoMHgzODc5ODY0MiksCisgICAgV1RDKDB4MzczN2U2ZDMpLCBXVEMoMHgzNWYzZTk4YSksIFdUQygweDM0YWRkNDVjKSwgV1RDKDB4MzM2NjAwODMpLAorICAgIFdUQygweDMyMWNjZjNhKSwgV1RDKDB4MzBkMjk2M2UpLCBXVEMoMHgyZjg3YTI4ZiksIFdUQygweDJlM2MyMmNkKSwKKyAgICBXVEMoMHgyY2YwMTBlNSksIFdUQygweDJiYTJmZmU1KSwgV1RDKDB4MmE1NGJhOTMpLCBXVEMoMHgyOTA1OTZmNSksCisgICAgV1RDKDB4MjdiNjI4MDYpLCBXVEMoMHgyNjY3NjJiOCksIFdUQygweDI1MWExMWIxKSwgV1RDKDB4MjNjZTk0ZjkpLAorICAgIFdUQygweDIyODUyZGRiKSwgV1RDKDB4MjEzZGYzNDApLCBXVEMoMHgxZmY5MDE4NSksIFdUQygweDFlYjY3ZDk0KSwKKyAgICBXVEMoMHgxZDc2NzQ4NSksIFdUQygweDFjMzhkNDc3KSwgV1RDKDB4MWFmZGE3NDcpLCBXVEMoMHgxOWM1MjQ4YiksCisgICAgV1RDKDB4MTg4ZjgyNTkpLCBXVEMoMHgxNzVkMGQ0MCksIFdUQygweDE2MmU1MzIwKSwgV1RDKDB4MTUwNDM2Y2QpLAorICAgIFdUQygweDEzZGY4ZDNmKSwgV1RDKDB4MTJjMTAyZjEpLCBXVEMoMHgxMWE4ZGQ2NSksIFdUQygweDEwOTZkNDkwKSwKKyAgICBXVEMoMHgwZjhhMTc1NSksIFdUQygweDBlODExZGNkKSwgV1RDKDB4MGQ3YWNiOWEpLCBXVEMoMHgwYzc2N2QwMCksCisgICAgV1RDKDB4MGI3MzM0ZDkpLCBXVEMoMHgwYTZmZWYzMSksIFdUQygweDA5NmM1YTg3KSwgV1RDKDB4MDg2OTFhZGIpLAorICAgIFdUQygweDA3NjVlMzk1KSwgV1RDKDB4MDY2MTAzMDkpLCBXVEMoMHgwNTU4YTBkMiksIFdUQygweDA0NGE5NDZjKSwKKyAgICBXVEMoMHgwMzNhY2I1MiksIFdUQygweDAyMzQ3MDZmKSwgV1RDKDB4MDE0OTM5ZGMpLCBXVEMoMHgwMDkyODU3NyksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweGZmZTczNTkzKSwgV1RDKDB4ZmZiNjNmY2YpLCBXVEMoMHhmZjg1M2MxZiksIFdUQygweGZmNTQ1NGQ3KSwKKyAgICBXVEMoMHhmZjIzYjQ0YiksIFdUQygweGZlZjM4NDE3KSwgV1RDKDB4ZmVjM2RjOWEpLCBXVEMoMHhmZTk0YzUxMSksCisgICAgV1RDKDB4ZmU2NjQ3NTMpLCBXVEMoMHhmZTM4NzA4NiksIFdUQygweGZlMGI0ZTYzKSwgV1RDKDB4ZmRkZWYxNWMpLAorICAgIFdUQygweGZkYjNhM2Y2KSwgV1RDKDB4ZmQ4OWU2MTEpLCBXVEMoMHhmZDYxYzc1MCksIFdUQygweGZkM2FlNTg1KSwKKyAgICBXVEMoMHhmZDE0ZWMwOSksIFdUQygweGZjZWY5YjA2KSwgV1RDKDB4ZmNjYWY1MDkpLCBXVEMoMHhmY2E3NDE4MCksCisgICAgV1RDKDB4ZmM4NTE4YTMpLCBXVEMoMHhmYzY1NWM3YSksIFdUQygweGZjNDg4NTQ1KSwgV1RDKDB4ZmMyZTk5OTgpLAorICAgIFdUQygweGZjMTcyNmJiKSwgV1RDKDB4ZmMwMTQ2M2YpLCBXVEMoMHhmYmVjMmM2NCksIFdUQygweGZiZDczNWNlKSwKKyAgICBXVEMoMHhmYmMyOWU4ZSksIFdUQygweGZiYWY4MDQyKSwgV1RDKDB4ZmI5ZWViYTApLCBXVEMoMHhmYjkxZGMwNSksCisgICAgV1RDKDB4ZmI4OGY0MjApLCBXVEMoMHhmYjg0NzllYiksIFdUQygweGZiODQzOThiKSwgV1RDKDB4ZmI4Nzg4NGIpLAorICAgIFdUQygweGZiOGRhOGJmKSwgV1RDKDB4ZmI5NWQwMjApLCBXVEMoMHhmYjlmM2U0OSksIFdUQygweGZiYTk0NDhhKSwKKyAgICBXVEMoMHhmYmIzY2YxMCksIFdUQygweGZiYmY2N2U3KSwgV1RDKDB4ZmJjY2Y2NWQpLCBXVEMoMHhmYmRkYmE1OCksCisgICAgV1RDKDB4ZmJmMzFmNDYpLCBXVEMoMHhmYzBlYjIzNiksIFdUQygweGZjMzE2NGYwKSwgV1RDKDB4ZmM1YjgyNjkpLAorICAgIFdUQygweGZjOGM1YmNkKSwgV1RDKDB4ZmNjMjQ4ZWUpLCBXVEMoMHhmY2ZiMDU2YyksIFdUQygweGZkMzNjYzI2KSwKKyAgICBXVEMoMHhmZDZiODRlZSksIFdUQygweGZkYTJkOWU3KSwgV1RDKDB4ZmRkYzAzZmIpLCBXVEMoMHhmZTFhYWY1NyksCisgICAgV1RDKDB4ZmU2MWEwYWYpLCBXVEMoMHhmZWIyOGRmNyksIFdUQygweGZmMGNkMzQzKSwgV1RDKDB4ZmY2ZDgzODgpLAorICAgIFdUQygweGZmZDI0MzMxKSwgV1RDKDB4MDAzOTZmZTMpLCBXVEMoMHgwMGEyZmIzZSksIFdUQygweDAxMTA3MDUwKSwKKyAgICBXVEMoMHgwMTgzMTkwMCksIFdUQygweDAxZmMyMzc3KSwgV1RDKDB4MDI3YmQxZmMpLCBXVEMoMHgwMzAxOWEyZCksCisgICAgV1RDKDB4MDM4ZDBhODgpLCBXVEMoMHgwNDFkZDg4ZiksIFdUQygweDA0YjQzNDk1KSwgV1RDKDB4MDU1MGMxZWYpLAorICAgIFdUQygweDA1ZjM4YmQ2KSwgV1RDKDB4MDY5YzA1MjMpLCBXVEMoMHgwNzRhMTE0ZSksIFdUQygweDA3ZmUwY2ViKSwKKyAgICBXVEMoMHgwOGI4OGUzMyksIFdUQygweDA5N2E1OTY1KSwgV1RDKDB4MGE0MzgzMTgpLCBXVEMoMHgwYjEzNzA0NiksCisgICAgV1RDKDB4MGJlOWI1YWIpLCBXVEMoMHgwY2M2MWZhOSksIFdUQygweDBkYTg5N2IyKSwgV1RDKDB4MGU5MTIzYjMpLAorICAgIFdUQygweDBmN2ZmMjAwKSwgV1RDKDB4MTA3NTU2OTYpLCBXVEMoMHgxMTcxN2Y5NCksIFdUQygweDEyNzQ3NGEwKSwKKyAgICBXVEMoMHgxMzdlNDg5ZCksIFdUQygweDE0OGYxYjAyKSwgV1RDKDB4MTVhNmYxNWUpLCBXVEMoMHgxNmM1YjdjOSksCisgICAgV1RDKDB4MTdlYjcyYjEpLCBXVEMoMHgxOTE4M2U1MSksIFdUQygweDFhNGMyNDQ0KSwgV1RDKDB4MWI4NzFiMWMpLAorICAgIFdUQygweDFjYzkyZTkyKSwgV1RDKDB4MWUxMjdmZmMpLCBXVEMoMHgxZjYzMTliOSksIFdUQygweDIwYmFlZjc4KSwKKyAgICBXVEMoMHgyMjFhMDg2MSksIFdUQygweDIzODA3Zjk0KSwgV1RDKDB4MjRlZTVhODkpLCBXVEMoMHgyNjYzODk4ZCksCisgICAgV1RDKDB4MjdlMDEwMWUpLCBXVEMoMHgyOTY0MDU4ZCksIFdUQygweDJhZWY2YmNmKSwgV1RDKDB4MmM4MjMwZmMpLAorICAgIFdUQygweDJlMWM1NDViKSwgV1RDKDB4MmZiZGU3MmIpLCBXVEMoMHgzMTY2ZTc2ZiksIFdUQygweDMzMTczZjVkKSwKKyAgICBXVEMoMHgzNGNlZThjMyksIFdUQygweDM2OGRlYmUxKSwgV1RDKDB4Mzg1NDNkNGYpLCBXVEMoMHgzYTIxYmQ5NCksCisgICAgV1RDKDB4M2JmNjU3NmYpLCBXVEMoMHgzZGQxZmYwNyksIFdUQygweDNmYjQ5NDhlKSwgV1RDKDB4NDE5ZGU0MTQpLAorICAgIFdUQygweDQzOGRjMjAyKSwgV1RDKDB4NDU4NDBlN2QpLCBXVEMoMHg0NzgwYTQzNSksIFdUQygweDQ5ODM2MDlmKSwKKyAgICBXVEMoMHg0YjhjYzU0OCksIFdUQygweDRkOWRmNzk2KSwgV1RDKDB4NGZiODFmNDYpLCBXVEMoMHg1MWRjODY5MCksCisgICAgV1RDKDB4MDAwZDk3MGQpLCBXVEMoMHhmZmY3ZWE2NyksIFdUQygweGZmZjdmYzNkKSwgV1RDKDB4MDAwZDNkZTIpLAorICAgIFdUQygweDAwMzcyMGFkKSwgV1RDKDB4MDA3NTE1ZjEpLCBXVEMoMHgwMGM2OGYwNCksIFdUQygweDAxMmFmZDNiKSwKKyAgICBXVEMoMHgwMWExZDFlYyksIFdUQygweDAyMmE3ZTY5KSwgV1RDKDB4MDJjNDc0MDgpLCBXVEMoMHgwMzZmMjQyMCksCisgICAgV1RDKDB4MDQyYTAwMDEpLCBXVEMoMHgwNGY0NzkwNSksIFdUQygweDA1Y2UwMDdlKSwgV1RDKDB4MDZiNjA3YmUpLAorICAgIFdUQygweDA3YWMwMDI4KSwgV1RDKDB4MDhhZjViMDEpLCBXVEMoMHgwOWJmODlhNyksIFdUQygweDBhZGJmZDZkKSwKKyAgICBXVEMoMHgwYzA0Mjc5OCksIFdUQygweDBkMzc3OTk3KSwgV1RDKDB4MGU3NTY0YjUpLCBXVEMoMHgwZmJkNWEzYSksCisgICAgV1RDKDB4MTEwZWNiODUpLCBXVEMoMHgxMjY5MjlmYiksIFdUQygweDEzY2JlNmU2KSwgV1RDKDB4MTUzNjczNzYpLAorICAgIFdUQygweDE2YTg0MTNmKSwgV1RDKDB4MTgyMGMxNWYpLCBXVEMoMHgxOTlmNjU2OCksIFdUQygweDFiMjM5ZTZiKSwKKyAgICBXVEMoMHgxY2FjZGRlMiksIFdUQygweDFlM2E5NTFhKSwgV1RDKDB4MWZjYzM1NmYpLCBXVEMoMHgyMTYxMzAxZiksCisgICAgV1RDKDB4MjJmOGY2YjcpLCBXVEMoMHgyNDkyZmE0YSksIFdUQygweDI2MmVhYzNmKSwgV1RDKDB4MjdjYjdlMjApLAorICAgIFdUQygweDI5NjhlMGM0KSwgV1RDKDB4MmIwNjQ2MjUpLCBXVEMoMHgyY2EzMWYxYSksIFdUQygweDJlM2VkZDJhKSwKKyAgICBXVEMoMHgyZmQ4ZjE5ZiksIFdUQygweDMxNzBjZTAwKSwgV1RDKDB4MzMwNWUzMmMpLCBXVEMoMHgzNDk3YTJkZiksCisgICAgV1RDKDB4MzYyNTdlNzgpLCBXVEMoMHgzN2FlZTcwYiksIFdUQygweDM5MzM0ZTA1KSwgV1RDKDB4M2FiMjI0OTgpLAorICAgIFdUQygweDNjMmFkYzJjKSwgV1RDKDB4M2Q5Y2U2NDUpLCBXVEMoMHgzZjA3YjNlZiksIFdUQygweDQwNmFiNmNhKSwKKyAgICBXVEMoMHg0MWM1NjAwMSksIFdUQygweDQzMTcyMTRhKSwgV1RDKDB4NDQ1ZjZiMzQpLCBXVEMoMHg0NTlkYWY1ZCksCisgICAgV1RDKDB4NDZkMTVmNTYpLCBXVEMoMHg0N2Y5ZWQ3MSksIFdUQygweDQ5MTZkMTFmKSwgV1RDKDB4NGEyNzU3NzApLAorICAgIFdUQygweDRiMmIyZmZmKSwgV1RDKDB4NGMyMTllYWUpLCBXVEMoMHg0ZDBhMjBjYiksIFdUQygweDRkZTQyODhlKSwKKyAgICBXVEMoMHg0ZWFmMjYzZCksIFdUQygweDRmNmE4YmI4KSwgV1RDKDB4NTAxNWNhMzMpLCBXVEMoMHg1MGIwNTJkZCksCisgICAgV1RDKDB4NTEzOTk3NTcpLCBXVEMoMHg1MWIxMDhjNiksIFdUQygweDUyMTYxOTBhKSwgV1RDKDB4NTI2ODM4N2MpLAorICAgIFdUQygweDUyYTZkOTMzKSwgV1RDKDB4NTJkMTZjMTkpLCBXVEMoMHg1MmU3NjI4YiksIFdUQygweDUyZTgyZWEzKSwKKyAgICBXVEMoMHg1MmQzNDA3ZCksIFdUQygweDUyYTgwYTI4KSwgV1RDKDB4NTI2NWZkNDMpLCBXVEMoMHg1MjBjOGExZCksCisgICAgV1RDKDB4NTE5YjIyYzgpLCBXVEMoMHg1MTExMzhlMCksIFdUQygweDUwNmUzYzgyKSwgV1RDKDB4NGZiMWEwMzcpLAorICAgIFdUQygweDRlZGFkNGUzKSwgV1RDKDB4NGRlOTRjMmQpLCBXVEMoMHg0Y2RjNzZkOCksIFdUQygweDRiYjNjNjgzKSwKKyAgICBXVEMoMHg0YTZlYWNkMiksIFdUQygweDQ5MGM5YWJlKSwgV1RDKDB4NDc4ZDA0ZjEpLCBXVEMoMHg0NWYwMDQyMCksCisgICAgV1RDKDB4NDQ0NTY3M2YpLCBXVEMoMHg0MmFjMGQyZSksIFdUQygweDQxMzM4MzY0KSwgV1RDKDB4M2ZkYjViNTgpLAorICAgIFdUQygweDNlYTFjMzBmKSwgV1RDKDB4M2Q4NDI3ODApLCBXVEMoMHgzYzdmYTc2MyksIFdUQygweDNiOTExYjk2KSwKKyAgICBXVEMoMHgzYWI1NjBiZiksIFdUQygweDM5ZTk1OTA4KSwgV1RDKDB4MzkyOWRlYmIpLCBXVEMoMHgzODczYmQ0ZCksCisgICAgV1RDKDB4MzdjMzFkYjIpLCBXVEMoMHgzNzEzYTU5YyksIFdUQygweDM2NjNkZWIyKSwgV1RDKDB4MzViNTJmMjMpLAorICAgIFdUQygweDM1MDdjNjFlKSwgV1RDKDB4MzQ1YTdmNDIpLCBXVEMoMHgzM2FjN2UwYyksIFdUQygweDMyZmQzNjZmKSwKKyAgICBXVEMoMHgzMjRiYWEyOCksIFdUQygweDMxOTY3NGU5KSwgV1RDKDB4MzBkZDdlMWEpLCBXVEMoMHgzMDIxZjNlOCksCisgICAgV1RDKDB4MmY2M2Y5MDMpLCBXVEMoMHgyZWEyYTFhYSksIFdUQygweDJkZGRkOTdiKSwgV1RDKDB4MmQxNjY5ODUpLAorICAgIFdUQygweDJjNGNhNDJmKSwgV1RDKDB4MmI4MDVjY2EpLCBXVEMoMHgyYWIxNjJhYSksIFdUQygweDI5ZGY3YjE3KSwKIH07CiAKK2NvbnN0IEZJWFBfV1RCIEVMREFuYWx5c2lzMjQwWzcyMF0gPSB7CisgICAgV1RDKDB4ZmFiOTQ3N2IpLCBXVEMoMHhmYTg5OTM0NCksIFdUQygweGZhNTg0NWRkKSwgV1RDKDB4ZmEyNTk3NjIpLAorICAgIFdUQygweGY5ZjFjMDA1KSwgV1RDKDB4ZjliY2VmZTYpLCBXVEMoMHhmOTg3MWU4YiksIFdUQygweGY5NTAzMzk3KSwKKyAgICBXVEMoMHhmOTE4M2Y0NyksIFdUQygweGY4ZGY0ZWFjKSwgV1RDKDB4ZjhhNTNiYTcpLCBXVEMoMHhmODY5ZjBiZSksCisgICAgV1RDKDB4ZjgyZDk3NTkpLCBXVEMoMHhmN2YwNTkzZSksIFdUQygweGY3YjI1MjBhKSwgV1RDKDB4Zjc3M2EzN2MpLAorICAgIFdUQygweGY3MzQ3NWNlKSwgV1RDKDB4ZjZmNGJlZGQpLCBXVEMoMHhmNmI0NTVhOCksIFdUQygweGY2NzM5NTI1KSwKKyAgICBXVEMoMHhmNjMzMjUxMCksIFdUQygweGY1ZjM5MzhiKSwgV1RDKDB4ZjViNTYwNzMpLCBXVEMoMHhmNTc5MDBiZCksCisgICAgV1RDKDB4ZjUzZWU4MmQpLCBXVEMoMHhmNTA3OTE0OSksIFdUQygweGY0ZDM2ZmZjKSwgV1RDKDB4ZjRhMmU1MjYpLAorICAgIFdUQygweGY0NzYzZDkxKSwgV1RDKDB4ZjQ0ZDk4NzIpLCBXVEMoMHhmNDI2ZWFlZCksIFdUQygweGYzZmRjMTYxKSwKKyAgICBXVEMoMHhmM2QwMDFmZiksIFdUQygweGYzOWRhZmNjKSwgV1RDKDB4ZjM2NmViNDMpLCBXVEMoMHhmMzJiZGNkYyksCisgICAgV1RDKDB4ZjJlY2FiODApLCBXVEMoMHhmMmE5N2IzNCksIFdUQygweGYyNjI2NWFlKSwgV1RDKDB4ZjIxNzhhNmYpLAorICAgIFdUQygweGYxYzkyNDU4KSwgV1RDKDB4ZjE3NzUyYjkpLCBXVEMoMHhmMTIxZTZhYyksIFdUQygweGYwYzg5YTYzKSwKKyAgICBXVEMoMHhmMDZiMTVlZiksIFdUQygweGYwMDkyZTg2KSwgV1RDKDB4ZWZhMmZkNDIpLCBXVEMoMHhlZjM5N2ViYyksCisgICAgV1RDKDB4ZWVjZTUxYzYpLCBXVEMoMHhlZTYxZThiNiksIFdUQygweGVkZjNkOTJlKSwgV1RDKDB4ZWQ4MmMzMzApLAorICAgIFdUQygweGVkMGQ1OGJiKSwgV1RDKDB4ZWM5NDg5MWIpLCBXVEMoMHhlYzE5ZDQzNSksIFdUQygweGViOWU0ZTRlKSwKKyAgICBXVEMoMHhlYjIyMTAwMCksIFdUQygweGVhYTMyNDIyKSwgV1RDKDB4ZWExZmI0NDApLCBXVEMoMHhlOTk2OTVkMiksCisgICAgV1RDKDB4ZTkwODU5YWIpLCBXVEMoMHhlODc3NTExNCksIFdUQygweGU3ZTYyYjM3KSwgV1RDKDB4ZTc1NzgxNDcpLAorICAgIFdUQygweGU2Y2IzYWMxKSwgV1RDKDB4ZTYzZjU2OTYpLCBXVEMoMHhlNWFmZTkxNiksIFdUQygweGU1MTkwOTBmKSwKKyAgICBXVEMoMHhlNDdhYWIwZCksIFdUQygweGUzZDZjMmQwKSwgV1RDKDB4ZTMzMWRhZTcpLCBXVEMoMHhlMjkwMzFlMSksCisgICAgV1RDKDB4ZTFmNDA5MjYpLCBXVEMoMHhlMTVkODdkMiksIFdUQygweGUwYzlkNzI3KSwgV1RDKDB4ZTAzNjBhZDUpLAorICAgIFdUQygweGRmOWY4MWFmKSwgV1RDKDB4ZGYwNGY5ZjkpLCBXVEMoMHhkZTY2Njk3ZiksIFdUQygweGRkYzQ4Y2ExKSwKKyAgICBXVEMoMHhkZDIwYTQyYSksIFdUQygweGRjN2M2ODUzKSwgV1RDKDB4ZGJkOWE0NzYpLCBXVEMoMHhkYjM5OGE4YyksCisgICAgV1RDKDB4ZGE5Y2Q3YzIpLCBXVEMoMHhkYTAzNjVjZiksIFdUQygweGQ5NmNhZDg1KSwgV1RDKDB4ZDhkN2I3YTMpLAorICAgIFdUQygweGQ4NDM5ZThjKSwgV1RDKDB4ZDdhZmI3M2QpLCBXVEMoMHhkNzFiNjM0NyksIFdUQygweGQ2ODYxNDlhKSwKKyAgICBXVEMoMHhkNWVmYWIyYyksIFdUQygweGQ1NTg4NzdlKSwgV1RDKDB4ZDRjMjlkYmMpLCBXVEMoMHhkNDMwYTBhYSksCisgICAgV1RDKDB4ZDNhM2Q0OTApLCBXVEMoMHhkMzFjNTg4ZiksIFdUQygweGQyOTdlMDc1KSwgV1RDKDB4ZDIxM2VmMzMpLAorICAgIFdUQygweGQxOGZkNTY2KSwgV1RDKDB4ZDEwYjhkM2YpLCBXVEMoMHhkMDg3YjI1MCksIFdUQygweGQwMDU0ZWYyKSwKKyAgICBXVEMoMHhjZjg1Zjk0YSksIFdUQygweGNmMGFmNWY3KSwgV1RDKDB4Y2U5NGZhZjUpLCBXVEMoMHhjZTIyOTQwOSksCisgICAgV1RDKDB4Y2RiMGI1ZjgpLCBXVEMoMHhjZDNlYzU1NCksIFdUQygweGNjY2RiZjU4KSwgV1RDKDB4Y2M1ZjM5ZDUpLAorICAgIFdUQygweGNiZjQ5ZWY1KSwgV1RDKDB4Y2I4ZDVmNzMpLCBXVEMoMHhjYjI4ODAxYyksIFdUQygweGNhYzVhMjY1KSwKKyAgICBXVEMoMHhjYTY0YWQyZSksIFdUQygweGNhMDVkN2ZkKSwgV1RDKDB4YzlhOTY2MDIpLCBXVEMoMHhjOTRmOWY3OSksCisgICAgV1RDKDB4YzhmMmI5NTQpLCBXVEMoMHhjODk5ZTc5NSksIFdUQygweGM4M2Y5NGFhKSwgV1RDKDB4YzdlNDFmNjMpLAorICAgIFdUQygweGM3ODdlNjlmKSwgV1RDKDB4YzcyYjNmZDApLCBXVEMoMHhjNmNlM2YwZiksIFdUQygweGM2NzBjMTc1KSwKKyAgICBXVEMoMHhjNjEyMjRjZiksIFdUQygweGM1YjIxZmVjKSwgV1RDKDB4YzU1MjAyYTQpLCBXVEMoMHhjNGYzMzUzYSksCisgICAgV1RDKDB4YzQ5Njg1OTcpLCBXVEMoMHhjNDNiOTNmMiksIFdUQygweGMzZTAzZDI2KSwgV1RDKDB4YzM4M2EwMTEpLAorICAgIFdUQygweGMzMjY4YWVkKSwgV1RDKDB4YzJjYTEwMzkpLCBXVEMoMHhjMjZmNWJjYyksIFdUQygweGMyMTcyNmM5KSwKKyAgICBXVEMoMHhjMWMxZDViMiksIFdUQygweGMxNmY2NmJhKSwgV1RDKDB4YzExZjc2ZDkpLCBXVEMoMHhjMGQwYTlmNiksCisgICAgV1RDKDB4YzA4MWNkZGIpLCBXVEMoMHhjMDMzMzE4MCksIFdUQygweGJmZTViYjU0KSwgV1RDKDB4YmY5YWVlOTApLAorICAgIFdUQygweGJmNTNkNTg3KSwgV1RDKDB4YmYxMDg4NTUpLCBXVEMoMHhiZWQwZGUwNSksIFdUQygweGJlOTQ3N2Q3KSwKKyAgICBXVEMoMHhiZTViMDMwZiksIFdUQygweGJlMjQzNjQyKSwgV1RDKDB4YmRlZmI3MmYpLCBXVEMoMHhiZGJkMjlkZiksCisgICAgV1RDKDB4YmQ4YzcxYWIpLCBXVEMoMHhiZDVkOTljYiksIFdUQygweGJkMzBlMzc1KSwgV1RDKDB4YmQwNmFmY2MpLAorICAgIFdUQygweGJjZGY4YzdmKSwgV1RDKDB4YmNiYmY3MDQpLCBXVEMoMHhiYzljMzA3ZSksIFdUQygweGJjODAzYjg2KSwKKyAgICBXVEMoMHhiYzY3YzBjNyksIFdUQygweGJjNTIxZDNkKSwgV1RDKDB4YmMzZTY1NjEpLCBXVEMoMHhiYzJiZjJjYiksCisgICAgV1RDKDB4YmMxYTY4NzIpLCBXVEMoMHhiYzA5Y2UxNSksIFdUQygweGJiZmE3NjRmKSwgV1RDKDB4YmJlZDEzNTYpLAorICAgIFdUQygweGJiZTI1N2ZhKSwgV1RDKDB4YmJkYTQwOTkpLCBXVEMoMHhiYmQ0NmEzMSksIFdUQygweGJiY2ZmYTc2KSwKKyAgICBXVEMoMHhiYmNjNzY2ZCksIFdUQygweGJiY2E3ODJmKSwgV1RDKDB4YmJjYjE2YzcpLCBXVEMoMHhiYmNmZjc3YyksCisgICAgV1RDKDB4YmJkOTc4ZTYpLCBXVEMoMHhiYmU2OGU1ZiksIFdUQygweGJiZjU5M2VkKSwgV1RDKDB4YmMwNGE4MzQpLAorICAgIFdUQygweGJjMTM2OTQxKSwgV1RDKDB4YmMyMjUyYzMpLCBXVEMoMHhiYzMxNzIzZCksIFdUQygweGJjNDBhYjkyKSwKKyAgICBXVEMoMHhiYzRmZmUyZCksIFdUQygweGJjNWY3MDcyKSwgV1RDKDB4YmM2ZjA1MjApLCBXVEMoMHhiYzdlYmQyMyksCisgICAgV1RDKDB4YmM4ZTk3NDYpLCBXVEMoMHhiYzllOTQyZiksIFdUQygweGJjYWViNjMzKSwgV1RDKDB4YmNiZWZlOGIpLAorICAgIFdUQygweGJjY2Y2OWJiKSwgV1RDKDB4YmNkZmY5MmUpLCBXVEMoMHhiY2YwYjA0ZiksIFdUQygweGJkMDE4ZWJkKSwKKyAgICBXVEMoMHhiZDEyOTE5MiksIFdUQygweGJkMjNiOWI4KSwgV1RDKDB4YmQzNTBhZmIpLCBXVEMoMHhiZDQ2ODIwZSksCisgICAgV1RDKDB4YmQ1ODFiZmMpLCBXVEMoMHhiZDY5ZGIxMSksIFdUQygweGJkN2JiZjU3KSwgV1RDKDB4YmQ4ZGM1ODQpLAorICAgIFdUQygweGJkOWZlYWFkKSwgV1RDKDB4YmRiMjMxYTQpLCBXVEMoMHhiZGM0OThlYSksIFdUQygweGJkZDcxY2QxKSwKKyAgICBXVEMoMHhiZGU5YmI1NyksIFdUQygweGJkZmM3N2Q5KSwgV1RDKDB4YmUwZjRlOTMpLCBXVEMoMHhiZTIyM2FlNSksCisgICAgV1RDKDB4YmUzNTNjZjUpLCBXVEMoMHhiZTQ4NTY4OSksIFdUQygweGJlNWI4MzI5KSwgV1RDKDB4YmU2ZWJlODgpLAorICAgIFdUQygweGJlODIwYWZkKSwgV1RDKDB4YmU5NTY4MTEpLCBXVEMoMHhiZWE4ZDEwOSksIFdUQygweGJlYmM0MzUyKSwKKyAgICBXVEMoMHhiZWNmYzBmYiksIFdUQygweGJlZTM0YTA3KSwgV1RDKDB4YmVmNmQ4ODQpLCBXVEMoMHhiZjBhNmJiMSksCisgICAgV1RDKDB4YmYxZTA2ODUpLCBXVEMoMHhiZjMxYTY4NSksIFdUQygweGJmNDU0ODNjKSwgV1RDKDB4YmY1OGViNmIpLAorICAgIFdUQygweGJmNmM5Mzc2KSwgV1RDKDB4YmY4MDNjOTApLCBXVEMoMHhiZjkzZTRiOSksIFdUQygweGJmYTc4ZDA1KSwKKyAgICBXVEMoMHhiZmJiMzgzMCksIFdUQygweGJmY2VlMzM5KSwgV1RDKDB4YmZlMjhhYTkpLCBXVEMoMHhiZmY2MmI4OSksCisgICAgV1RDKDB4ODAxM2E1ZjQpLCBXVEMoMHg4MDNhY2ZkNiksIFdUQygweDgwNjFlZWM3KSwgV1RDKDB4ODA4OGZjNzMpLAorICAgIFdUQygweDgwYWZmMjcwKSwgV1RDKDB4ODBkNmNiZTUpLCBXVEMoMHg4MGZkOGMyYSksIFdUQygweDgxMjQzN2E4KSwKKyAgICBXVEMoMHg4MTRhYzk0ZiksIFdUQygweDgxNzEzYWRjKSwgV1RDKDB4ODE5NzkwOTgpLCBXVEMoMHg4MWJkY2NiNyksCisgICAgV1RDKDB4ODFlM2U3MzgpLCBXVEMoMHg4MjA5ZGQwNCksIFdUQygweDgyMmZiMjNhKSwgV1RDKDB4ODI1NTY1YmIpLAorICAgIFdUQygweDgyN2FlZDk0KSwgV1RDKDB4ODJhMDQ5MDkpLCBXVEMoMHg4MmM1N2M4NSksIFdUQygweDgyZWE4MzFjKSwKKyAgICBXVEMoMHg4MzBmNTM5ZCksIFdUQygweDgzMzNlZWJhKSwgV1RDKDB4ODM1ODU4NWEpLCBXVEMoMHg4MzdjODgyZSksCisgICAgV1RDKDB4ODNhMDc3NDIpLCBXVEMoMHg4M2M0MjhhNSksIFdUQygweDgzZTc5YzRjKSwgV1RDKDB4ODQwYWNhNjUpLAorICAgIFdUQygweDg0MmRhZDgxKSwgV1RDKDB4ODQ1MDRhYzApLCBXVEMoMHg4NDcyOWZiMSksIFdUQygweDg0OTRhNGYxKSwKKyAgICBXVEMoMHg4NGI2NTkzMiksIFdUQygweDg0ZDdjMGY4KSwgV1RDKDB4ODRmOGQ5MzYpLCBXVEMoMHg4NTE5OWE1OSksCisgICAgV1RDKDB4ODUzYTA1YTEpLCBXVEMoMHg4NTVhMjAyMyksIFdUQygweDg1NzllNDZlKSwgV1RDKDB4ODU5OTRkNTUpLAorICAgIFdUQygweDg1Yjg2MTkwKSwgV1RDKDB4ODVkNzIzZTYpLCBXVEMoMHg4NWY1OGZhOSksIFdUQygweDg2MTNhM2NlKSwKKyAgICBXVEMoMHg4NjMxNjdiNSksIFdUQygweDg2NGVkZGZlKSwgV1RDKDB4ODY2YzAxMzgpLCBXVEMoMHg4Njg4ZDJlNCksCisgICAgV1RDKDB4ODZhNTU5MDEpLCBXVEMoMHg4NmMxOTQ5NyksIFdUQygweDg2ZGQ4MzkwKSwgV1RDKDB4ODZmOTI4OGYpLAorICAgIFdUQygweDg3MTQ4N2UwKSwgV1RDKDB4ODcyZmFkZDApLCBXVEMoMHg4NzRhOWExZSksIFdUQygweDg3NjUxOWQwKSwKKyAgICBXVEMoMHg4NzdmNDcxZSksIFdUQygweDg3OTlmYjM2KSwgV1RDKDB4ODdiNDhiOTcpLCBXVEMoMHg4N2NiYTAyMSksCisgICAgV1RDKDB4ODgwZjY3YWUpLCBXVEMoMHg4ODVlMGY5MSksIFdUQygweDg4YmM4NGNkKSwgV1RDKDB4ODkyNDQ2NDApLAorICAgIFdUQygweDg5OTBhNDVkKSwgV1RDKDB4ODlmZTY3NjYpLCBXVEMoMHg4YTZjOTA2NSksIFdUQygweDhhZGIzMWU2KSwKKyAgICBXVEMoMHg4YjRhZDViMyksIFdUQygweDhiYmMyMDY4KSwgV1RDKDB4OGMyZjkzZmYpLCBXVEMoMHg4Y2E1YTkyMiksCisgICAgV1RDKDB4OGQxZWQ3MmQpLCBXVEMoMHg4ZDliN2RkYiksIFdUQygweDhlMWJkNmNjKSwgV1RDKDB4OGVhMDE5MjQpLAorICAgIFdUQygweDhmMjg3NzE2KSwgV1RDKDB4OGZiNTE0M2UpLCBXVEMoMHg5MDQ2MDc0ZSksIFdUQygweDkwZGI2MTJiKSwKKyAgICBXVEMoMHg5MTc1MzI2MyksIFdUQygweDkyMTM4MDk0KSwgV1RDKDB4OTJiNjRjZjMpLCBXVEMoMHg5MzVkOTZjOSksCisgICAgV1RDKDB4OTQwOTVhNTYpLCBXVEMoMHg5NGI5OGZkNCksIFdUQygweDk1NmUyYTg3KSwgV1RDKDB4OTYyNzFmZjYpLAorICAgIFdUQygweDk2ZTQ2MzA5KSwgV1RDKDB4OTdhNWU4MGQpLCBXVEMoMHg5ODZiOWU1NSksIFdUQygweDk5MzU3MmFmKSwKKyAgICBXVEMoMHg5YTAzNTBjZSksIFdUQygweDlhZDUyMTU0KSwgV1RDKDB4OWJhYWQxMGYpLCBXVEMoMHg5Yzg0NGNkZCksCisgICAgV1RDKDB4OWQ2MTg0MzcpLCBXVEMoMHg5ZTQyNjViMiksIFdUQygweDlmMjZkOWFkKSwgV1RDKDB4YTAwZWM5YjApLAorICAgIFdUQygweGEwZmEyOTE2KSwgV1RDKDB4YTFlOGVjMjApLCBXVEMoMHhhMmRhZmZhNCksIFdUQygweGEzZDA1NDY4KSwKKyAgICBXVEMoMHhhNGM4ZTAwNyksIFdUQygweGE1YzQ5YWU0KSwgV1RDKDB4YTZjMzdjMjQpLCBXVEMoMHhhN2M1N2QwMyksCisgICAgV1RDKDB4YThjYTk3NTApLCBXVEMoMHhhOWQyYzdmMiksIFdUQygweGFhZGUwZjZmKSwgV1RDKDB4YWJlYzcxNzcpLAorICAgIFdUQygweGFjZmRmMmIxKSwgV1RDKDB4YWUxMjk3NDApLCBXVEMoMHhhZjJhNjMyMSksIFdUQygweGIwNDU2M2E2KSwKKyAgICBXVEMoMHhiMTYzYTJlNiksIFdUQygweGIyODUyNGM0KSwgV1RDKDB4YjNhOWVhZjcpLCBXVEMoMHhiNGQxZmYxYiksCisgICAgV1RDKDB4NGExZDI4ODApLCBXVEMoMHg0OGVlZTU2ZSksIFdUQygweDQ3YmRhODgyKSwgV1RDKDB4NDY4OTVjNzkpLAorICAgIFdUQygweDQ1NTFmOGExKSwgV1RDKDB4NDQxNzgxN2IpLCBXVEMoMHg0MmRhMDIzZCksIFdUQygweDQxOTk4MGNhKSwKKyAgICBXVEMoMHg0MDU1ZjQ2MyksIFdUQygweDNmMGYzYjUxKSwgV1RDKDB4M2RjNTZlMTgpLCBXVEMoMHgzYzc4ZDk0MyksCisgICAgV1RDKDB4M2IyOWJmM2QpLCBXVEMoMHgzOWQ4NGVhMCksIFdUQygweDM4ODQzMzdkKSwgV1RDKDB4MzcyZDIzNzEpLAorICAgIFdUQygweDM1ZDM2NGVhKSwgV1RDKDB4MzQ3NzRjZWYpLCBXVEMoMHgzMzE5NGQzYSksIFdUQygweDMxYjlkNTg2KSwKKyAgICBXVEMoMHgzMDU5NGZjZiksIFdUQygweDJlZjgwYjYzKSwgV1RDKDB4MmQ5NjMwZDUpLCBXVEMoMHgyYzMzN2MwMCksCisgICAgV1RDKDB4MmFjZjZhOWUpLCBXVEMoMHgyOTZhMzIwNSksIFdUQygweDI4MDQ2ODI1KSwgV1RDKDB4MjY5ZjE3NTIpLAorICAgIFdUQygweDI1M2I1MzE0KSwgV1RDKDB4MjNkOTk5M2YpLCBXVEMoMHgyMjdhM2M3NyksIFdUQygweDIxMWQ1OWEwKSwKKyAgICBXVEMoMHgxZmMzMTRmZCksIFdUQygweDFlNmI5ODM0KSwgV1RDKDB4MWQxNmViNTgpLCBXVEMoMHgxYmM0ZjgyZSksCisgICAgV1RDKDB4MWE3NWU0ODEpLCBXVEMoMHgxOTI5ZjM4OSksIFdUQygweDE3ZTE2ZWUzKSwgV1RDKDB4MTY5Y2Q3NTgpLAorICAgIFdUQygweDE1NWQxYWU1KSwgV1RDKDB4MTQyMzUxODIpLCBXVEMoMHgxMmYwNTFkZSksIFdUQygweDExYzQ5OTNiKSwKKyAgICBXVEMoMHgxMDlmZGY0YyksIFdUQygweDBmODEzNTFjKSwgV1RDKDB4MGU2NmM1ZTYpLCBXVEMoMHgwZDRmNGIxNiksCisgICAgV1RDKDB4MGMzOWYwMTMpLCBXVEMoMHgwYjI1NzY1ZCksIFdUQygweDBhMTBjNTFlKSwgV1RDKDB4MDhmYmVlMzUpLAorICAgIFdUQygweDA3ZTc5ODZmKSwgV1RDKDB4MDZkMjVmZTcpLCBXVEMoMHgwNWJhMWI1MiksIFdUQygweDA0OWMzM2I3KSwKKyAgICBXVEMoMHgwMzc5Y2ViOSksIFdUQygweDAyNWVlN2M3KSwgV1RDKDB4MDE1ZWRjMWMpLCBXVEMoMHgwMDk3OGRlYiksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4ZmZlNTk0NzQpLCBXVEMoMHhmZmIxNThmOCksIFdUQygweGZmN2QxMjc1KSwgV1RDKDB4ZmY0OGY0NGMpLAorICAgIFdUQygweGZmMTUzMWUzKSwgV1RDKDB4ZmVlMWZhYTkpLCBXVEMoMHhmZWFmNjI2ZSksIFdUQygweGZlN2Q3MjI3KSwKKyAgICBXVEMoMHhmZTRjMzgzZiksIFdUQygweGZlMWJjNGZmKSwgV1RDKDB4ZmRlYzI5N2YpLCBXVEMoMHhmZGJkOWY2YyksCisgICAgV1RDKDB4ZmQ5MGJiZjApLCBXVEMoMHhmZDY1YmE3MyksIFdUQygweGZkM2MyZDMyKSwgV1RDKDB4ZmQxM2FiMzUpLAorICAgIFdUQygweGZjZWJlODExKSwgV1RDKDB4ZmNjNGVlYWUpLCBXVEMoMHhmYzlmMWQ2NCksIFdUQygweGZjN2I0OGIwKSwKKyAgICBXVEMoMHhmYzVhNzI4MiksIFdUQygweGZjM2NlZjliKSwgV1RDKDB4ZmMyMjlmNGMpLCBXVEMoMHhmYzBhOWUyOSksCisgICAgV1RDKDB4ZmJmM2RjY2IpLCBXVEMoMHhmYmRkODBjMyksIFdUQygweGZiYzc1NTZjKSwgV1RDKDB4ZmJiMjg5Y2YpLAorICAgIFdUQygweGZiYTA2Zjk5KSwgV1RDKDB4ZmI5MjNhY2EpLCBXVEMoMHhmYjg4YmI1NyksIFdUQygweGZiODQ0NTdmKSwKKyAgICBXVEMoMHhmYjg0OGMyZSksIFdUQygweGZiODhiZDI4KSwgV1RDKDB4ZmI4ZmVkYTEpLCBXVEMoMHhmYjk5MjhlYiksCisgICAgV1RDKDB4ZmJhMzhiOWUpLCBXVEMoMHhmYmFlNzExYyksIFdUQygweGZiYmEzNTM4KSwgV1RDKDB4ZmJjN2FmOWQpLAorICAgIFdUQygweGZiZDg0ODVlKSwgV1RDKDB4ZmJlZGEyMzgpLCBXVEMoMHhmYzA5OWRlNCksIFdUQygweGZjMmQ5ODFmKSwKKyAgICBXVEMoMHhmYzU5ZmQwZCksIFdUQygweGZjOGUxNTgzKSwgV1RDKDB4ZmNjN2UwZDcpLCBXVEMoMHhmZDA0OGQwMyksCisgICAgV1RDKDB4ZmQ0MGRmYWYpLCBXVEMoMHhmZDdjMWQzNSksIFdUQygweGZkYjc2N2NjKSwgV1RDKDB4ZmRmNjRhOWYpLAorICAgIFdUQygweGZlM2QwMjQyKSwgV1RDKDB4ZmU4ZTMzMTYpLCBXVEMoMHhmZWVhZDJiOSksIFdUQygweGZmNGZmZjhjKSwKKyAgICBXVEMoMHhmZmJhN2IxMSksIFdUQygweDAwMjgxY2FlKSwgV1RDKDB4MDA5ODQ3ZDEpLCBXVEMoMHgwMTBjYjY1MyksCisgICAgV1RDKDB4MDE4NzA2MzkpLCBXVEMoMHgwMjA4OWRiNSksIFdUQygweDAyOTFiNTcxKSwgV1RDKDB4MDMyMWE0YzEpLAorICAgIFdUQygweDAzYjdlZGEwKSwgV1RDKDB4MDQ1NDRjN2YpLCBXVEMoMHgwNGY3NDEzNCksIFdUQygweDA1YTE2ODEwKSwKKyAgICBXVEMoMHgwNjUyNTgyOSksIFdUQygweDA3MDk5NGQ0KSwgV1RDKDB4MDdjNzY3YmEpLCBXVEMoMHgwODhjNjliOCksCisgICAgV1RDKDB4MDk1OTg2MzQpLCBXVEMoMHgwYTJmMTRjYSksIFdUQygweDBiMGM2NzdiKSwgV1RDKDB4MGJmMGY1NzYpLAorICAgIFdUQygweDBjZGM3ZjczKSwgV1RDKDB4MGRjZWVkNTQpLCBXVEMoMHgwZWM4NGEwMCksIFdUQygweDBmYzhkYjg2KSwKKyAgICBXVEMoMHgxMGQxMDI3OCksIFdUQygweDExZTBlMDVlKSwgV1RDKDB4MTJmODgwY2MpLCBXVEMoMHgxNDE4MDQ5YiksCisgICAgV1RDKDB4MTUzZjg2YjMpLCBXVEMoMHgxNjZlZjVhMyksIFdUQygweDE3YTY0ODc4KSwgV1RDKDB4MThlNTlkZGUpLAorICAgIFdUQygweDFhMmQwODhiKSwgV1RDKDB4MWI3YzdlNDEpLCBXVEMoMHgxY2Q0MGFiNyksIFdUQygweDFlMzNkNTQyKSwKKyAgICBXVEMoMHgxZjliZTdhNSksIFdUQygweDIxMGMzNDRmKSwgV1RDKDB4MjI4NGNiODUpLCBXVEMoMHgyNDA1Y2E0OCksCisgICAgV1RDKDB4MjU4ZjJiN2YpLCBXVEMoMHgyNzIwZTA2MyksIFdUQygweDI4YmFmZDQ5KSwgV1RDKDB4MmE1ZDk1MGMpLAorICAgIFdUQygweDJjMDg5NmU0KSwgV1RDKDB4MmRiYmY3ZDQpLCBXVEMoMHgyZjc3Y2EyOCksIFdUQygweDMxM2MxMjczKSwKKyAgICBXVEMoMHgzMzA4YjdlNCksIFdUQygweDM0ZGRiMGVjKSwgV1RDKDB4MzZiYjA2YjcpLCBXVEMoMHgzOGEwYTkzNSksCisgICAgV1RDKDB4M2E4ZTcyNzApLCBXVEMoMHgzYzg0NGNhOSksIFdUQygweDNlODIyNjdlKSwgV1RDKDB4NDA4N2NjZmEpLAorICAgIFdUQygweDQyOTUwMzUyKSwgV1RDKDB4NDRhOTljZTcpLCBXVEMoMHg0NmM1NzA5MyksIFdUQygweDQ4ZTg0ZGJlKSwKKyAgICBXVEMoMHg0YjEyNzUwNiksIFdUQygweDRkNDUyZDI5KSwgV1RDKDB4NGY4MWUwNjYpLCBXVEMoMHg1MWNhMTFjNCksCisgICAgV1RDKDB4MDAwYzgyZTgpLCBXVEMoMHhmZmY2ZjQwYyksIFdUQygweGZmZmExMjYwKSwgV1RDKDB4MDAxNTMwYmYpLAorICAgIFdUQygweDAwNDdhMjAyKSwgV1RDKDB4MDA5MGI5MDMpLCBXVEMoMHgwMGVmYzg5ZiksIFdUQygweDAxNjQyM2FmKSwKKyAgICBXVEMoMHgwMWVkMWQwZSksIFdUQygweDAyOGEwNzk2KSwgV1RDKDB4MDMzYTM2MjApLCBXVEMoMHgwM2ZjZmI4OSksCisgICAgV1RDKDB4MDRkMWFhYWEpLCBXVEMoMHgwNWI3OTY1YyksIFdUQygweDA2YWUxMTc5KSwgV1RDKDB4MDdiNDZlZTgpLAorICAgIFdUQygweDA4Y2EwMTczKSwgV1RDKDB4MDllZTFjMDApLCBXVEMoMHgwYjIwMTE2MiksIFdUQygweDBjNWYzNDZlKSwKKyAgICBXVEMoMHgwZGFhZDgwOCksIFdUQygweDBmMDI0ZjE3KSwgV1RDKDB4MTA2NGVjNGIpLCBXVEMoMHgxMWQyMDJjNCksCisgICAgV1RDKDB4MTM0OGU1MTQpLCBXVEMoMHgxNGM4ZTYyZiksIFdUQygweDE2NTE1OTBhKSwgV1RDKDB4MTdlMTkwNTEpLAorICAgIFdUQygweDE5NzhkZjI3KSwgV1RDKDB4MWIxNjk4MTIpLCBXVEMoMHgxY2JhMGUxNSksIFdUQygweDFlNjI5NDA3KSwKKyAgICBXVEMoMHgyMDBmN2NkNCksIFdUQygweDIxYzAxYjI5KSwgV1RDKDB4MjM3M2MyMjgpLCBXVEMoMHgyNTI5YzQ1MyksCisgICAgV1RDKDB4MjZlMTc0YjkpLCBXVEMoMHgyODlhMjYyZiksIFdUQygweDJhNTMyYmJhKSwgV1RDKDB4MmMwYmQ3YjIpLAorICAgIFdUQygweDJkYzM3ZDkyKSwgV1RDKDB4MmY3OTZmY2UpLCBXVEMoMHgzMTJkMDE3YSksIFdUQygweDMyZGQ4NTEzKSwKKyAgICBXVEMoMHgzNDhhNGRkZSksIFdUQygweDM2MzJhZWIzKSwgV1RDKDB4MzdkNWZhMjkpLCBXVEMoMHgzOTczODMzNCksCisgICAgV1RDKDB4M2IwYTljOTkpLCBXVEMoMHgzYzlhOTkyNiksIFdUQygweDNlMjJjYzIxKSwgV1RDKDB4M2ZhMjg3ZGMpLAorICAgIFdUQygweDQxMTkxZjg5KSwgV1RDKDB4NDI4NWU1ZmMpLCBXVEMoMHg0M2U4MmUwMiksIFdUQygweDQ1M2Y0YTQwKSwKKyAgICBXVEMoMHg0NjhhOGRkOSksIFdUQygweDQ3Yzk0YzIzKSwgV1RDKDB4NDhmYWRjN2MpLCBXVEMoMHg0YTFlNzVmOSksCisgICAgV1RDKDB4NGIzMzllY2YpLCBXVEMoMHg0YzM5ODFiMSksIFdUQygweDRkMmY3Y2QzKSwgV1RDKDB4NGUxNGUzODEpLAorICAgIFdUQygweDRlZTkwODA0KSwgV1RDKDB4NGZhYjNkNmEpLCBXVEMoMHg1MDVhZDZiZCksIFdUQygweDUwZjcyNmEzKSwKKyAgICBXVEMoMHg1MTdmN2ZlYSksIFdUQygweDUxZjMzNWZkKSwgV1RDKDB4NTI1MTliMGYpLCBXVEMoMHg1MjlhMDFmMiksCisgICAgV1RDKDB4NTJjYmJlMzEpLCBXVEMoMHg1MmU2MjFkOSksIFdUQygweDUyZTg4MGFhKSwgV1RDKDB4NTJkMjJjN2EpLAorICAgIFdUQygweDUyYTI3OGE1KSwgV1RDKDB4NTI1OGI4ODApLCBXVEMoMHg1MWY0M2UxZCksIFdUQygweDUxNzQ1YzM4KSwKKyAgICBXVEMoMHg1MGQ4NjY5ZSksIFdUQygweDUwMWZhZjBlKSwgV1RDKDB4NGY0OTg5N2UpLCBXVEMoMHg0ZTU1NDgwNCksCisgICAgV1RDKDB4NGQ0MjNkOWUpLCBXVEMoMHg0YzBmYmQ4YiksIFdUQygweDRhYmQxYTRkKSwgV1RDKDB4NDk0OWE2OTgpLAorICAgIFdUQygweDQ3YjRiN2Y5KSwgV1RDKDB4NDVmZTJiNmQpLCBXVEMoMHg0NDM3NTAxOSksIFdUQygweDQyODRlOTZlKSwKKyAgICBXVEMoMHg0MGY3ZWZhMiksIFdUQygweDNmOGY4YjMzKSwgV1RDKDB4M2U0OTQzMTEpLCBXVEMoMHgzZDIxZTM1YiksCisgICAgV1RDKDB4M2MxNWM2MjEpLCBXVEMoMHgzYjIxMTVmMyksIFdUQygweDNhNDAwOGFhKSwgV1RDKDB4Mzk2ZWQyYTYpLAorICAgIFdUQygweDM4YTk5YTFkKSwgV1RDKDB4MzdlYzExNzcpLCBXVEMoMHgzNzMwZjE1NCksIFdUQygweDM2NzU2YzE1KSwKKyAgICBXVEMoMHgzNWJhZmIwZCksIFdUQygweDM1MDIwMDkzKSwgV1RDKDB4MzQ0OTIzODEpLCBXVEMoMHgzMzhmNjIyNiksCisgICAgV1RDKDB4MzJkNDBhMzQpLCBXVEMoMHgzMjE1YmQ3MyksIFdUQygweDMxNTMwMmNlKSwgV1RDKDB4MzA4YzdjNDEpLAorICAgIFdUQygweDJmYzM1MzJmKSwgV1RDKDB4MmVmNmRlOGYpLCBXVEMoMHgyZTI2NWE3ZiksIFdUQygweDJkNTI3YmZkKSwKKyAgICBXVEMoMHgyYzdiZjAzNSksIFdUQygweDJiYTI5NzViKSwgV1RDKDB4MmFjNjM1NTIpLCBXVEMoMHgyOWU2ODZjYSksCit9OwogCitjb25zdCBGSVhQX1dUQiBFTERBbmFseXNpczEyOFszODRdID0geworICAgIFdUQygweGZhYTQ5ZTk4KSwgV1RDKDB4ZmE0ODkyOWYpLCBXVEMoMHhmOWU3ZWIzOSksIFdUQygweGY5ODNiODI5KSwKKyAgICBXVEMoMHhmOTFiYzVjYiksIFdUQygweGY4YjAzNzZmKSwgV1RDKDB4Zjg0MDhkNjIpLCBXVEMoMHhmN2NkOGMxZSksCisgICAgV1RDKDB4Zjc1ODBkYTMpLCBXVEMoMHhmNmUwYjBkYyksIFdUQygweGY2Njc3NTNjKSwgV1RDKDB4ZjVlZmE0Y2YpLAorICAgIFdUQygweGY1N2NiNmRlKSwgV1RDKDB4ZjUxMWI2MmIpLCBXVEMoMHhmNGIxYTg2MCksIFdUQygweGY0NWVlOGY4KSwKKyAgICBXVEMoMHhmNDE1NzEwZCksIFdUQygweGYzYzBjNGYzKSwgV1RDKDB4ZjM1YzJhZjkpLCBXVEMoMHhmMmU4OTYyMCksCisgICAgV1RDKDB4ZjI2NmYzY2IpLCBXVEMoMHhmMWQ4MTliZiksIFdUQygweGYxM2NmZjJmKSwgV1RDKDB4ZjA5NDg5ZDIpLAorICAgIFdUQygweGVmZGNmYTgwKSwgV1RDKDB4ZWYxODIwNTkpLCBXVEMoMHhlZTRkNmM2MCksIFdUQygweGVkN2I4ZGE3KSwKKyAgICBXVEMoMHhlYzljMjdiMSksIFdUQygweGViYjU3ZDBkKSwgV1RDKDB4ZWFjYjM5MTgpLCBXVEMoMHhlOWQzNTU5MSksCisgICAgV1RDKDB4ZThjOTE3NmUpLCBXVEMoMHhlN2I5M2U0MiksIFdUQygweGU2YjEwZTQ3KSwgV1RDKDB4ZTVhNmI4NzUpLAorICAgIFdUQygweGU0ODRjMzQ1KSwgV1RDKDB4ZTM1MDlmMWIpLCBXVEMoMHhlMjI0MjU0YyksIFdUQygweGUxMGE0ZTE4KSwKKyAgICBXVEMoMHhkZmY0YTY2OCksIFdUQygweGRlZDNkODgxKSwgV1RDKDB4ZGRhNWVkOTgpLCBXVEMoMHhkYzcyMmQxMyksCisgICAgV1RDKDB4ZGI0MzczNjApLCBXVEMoMHhkYTFmZWZlZCksIFdUQygweGQ5MDYyM2IyKSwgV1RDKDB4ZDdmMDcwZjUpLAorICAgIFdUQygweGQ2ZGEzNjFiKSwgV1RDKDB4ZDVjMDc4NmYpLCBXVEMoMHhkNGE2ZTE4OCksIFdUQygweGQzOWIzN2I0KSwKKyAgICBXVEMoMHhkMmEwMWZmMiksIFdUQygweGQxYThhMDVjKSwgV1RDKDB4ZDBiMGNmNDcpLCBXVEMoMHhjZmJkMzUyNyksCisgICAgV1RDKDB4Y2VkNmI4ZDcpLCBXVEMoMHhjZGZmMGE2NiksIFdUQygweGNkMjk3OGE0KSwgV1RDKDB4Y2M1ODcxODMpLAorICAgIFdUQygweGNiOTNiZmRiKSwgV1RDKDB4Y2FkODA3NzMpLCBXVEMoMHhjYTIzM2MyYiksIFdUQygweGM5NzY4YjVlKSwKKyAgICBXVEMoMHhjOGNjMTMwYyksIFdUQygweGM4MjMxYWNkKSwgV1RDKDB4Yzc3NjhkZTQpLCBXVEMoMHhjNmM4NmJkZiksCisgICAgV1RDKDB4YzYxODFhYTEpLCBXVEMoMHhjNTYzZjZjZSksIFdUQygweGM0YjMzYTJhKSwgV1RDKDB4YzQwODVmY2YpLAorICAgIFdUQygweGMzNWFlNzJlKSwgV1RDKDB4YzJhZDdhZGYpLCBXVEMoMHhjMjA2ZWQ5NCksIFdUQygweGMxNmE1NzQ0KSwKKyAgICBXVEMoMHhjMGQ1OTYyNSksIFdUQygweGMwNDFlMjFiKSwgV1RDKDB4YmZiMWVlMDUpLCBXVEMoMHhiZjJkODJlYSksCisgICAgV1RDKDB4YmViNjBmZTkpLCBXVEMoMHhiZTQ5OWRhOCksIFdUQygweGJkZTYxODkxKSwgV1RDKDB4YmQ4OTc1YjYpLAorICAgIFdUQygweGJkMzM5ZDM2KSwgV1RDKDB4YmNlNmEwOGIpLCBXVEMoMHhiY2E1YjJmOSksIFdUQygweGJjNzIxMDAyKSwKKyAgICBXVEMoMHhiYzQ5NGQ0MSksIFdUQygweGJjMjY2MTYwKSwgV1RDKDB4YmMwNmQxNGYpLCBXVEMoMHhiYmVjNTJjNyksCisgICAgV1RDKDB4YmJkYWFmNzkpLCBXVEMoMHhiYmQwYmU5OSksIFdUQygweGJiY2FlMTM5KSwgV1RDKDB4YmJjZDM1OWMpLAorICAgIFdUQygweGJiZGVkNWQzKSwgV1RDKDB4YmJmYTU4Y2YpLCBXVEMoMHhiYzE2MmY5ZCksIFdUQygweGJjMzI2NTM0KSwKKyAgICBXVEMoMHhiYzRmMDgxYyksIFdUQygweGJjNmMxNjc4KSwgV1RDKDB4YmM4OTlmOTMpLCBXVEMoMHhiY2E3YTI2MyksCisgICAgV1RDKDB4YmNjNjI5NTQpLCBXVEMoMHhiY2U1MmRkYyksIFdUQygweGJkMDRiYzdmKSwgV1RDKDB4YmQyNGNkOGYpLAorICAgIFdUQygweGJkNDU2OTk4KSwgV1RDKDB4YmQ2Njg0MjgpLCBXVEMoMHhiZDg4MjA3YyksIFdUQygweGJkYWEyZTRiKSwKKyAgICBXVEMoMHhiZGNjYWYzZSksIFdUQygweGJkZWY5MzJjKSwgV1RDKDB4YmUxMmQ5MzYpLCBXVEMoMHhiZTM2NmRkNiksCisgICAgV1RDKDB4YmU1YTRmZDkpLCBXVEMoMHhiZTdlNmI0OSksIFdUQygweGJlYTJiZjNmKSwgV1RDKDB4YmVjNzM4YjUpLAorICAgIFdUQygweGJlZWJkNzkxKSwgV1RDKDB4YmYxMDhiNDkpLCBXVEMoMHhiZjM1NTRhYSksIFdUQygweGJmNWEyNWNmKSwKKyAgICBXVEMoMHhiZjdmMDIwYiksIFdUQygweGJmYTNkZDI1KSwgV1RDKDB4YmZjOGJlMWUpLCBXVEMoMHhiZmVkOTVmNiksCisgICAgV1RDKDB4ODAyNGM5MzMpLCBXVEMoMHg4MDZlMjRmYiksIFdUQygweDgwYjczZDk2KSwgV1RDKDB4ODBmZmY3OGMpLAorICAgIFdUQygweDgxNDg2MTJmKSwgV1RDKDB4ODE5MDYyNmUpLCBXVEMoMHg4MWQ4MDMwYSksIFdUQygweDgyMWYyOGUxKSwKKyAgICBXVEMoMHg4MjY1ZDZiZSksIFdUQygweDgyYWJlZDU2KSwgV1RDKDB4ODJmMTZlNDApLCBXVEMoMHg4MzM2MzZkMiksCisgICAgV1RDKDB4ODM3YTQ3MGEpLCBXVEMoMHg4M2JkN2JlNiksIFdUQygweDgzZmZkNDE1KSwgV1RDKDB4ODQ0MTJlNjYpLAorICAgIFdUQygweDg0ODE4YzRmKSwgV1RDKDB4ODRjMGQxOGMpLCBXVEMoMHg4NGZmMDQyOSksIFdUQygweDg1M2MwOWE1KSwKKyAgICBXVEMoMHg4NTc3ZWFjZiksIFdUQygweDg1YjI5NDAyKSwgV1RDKDB4ODVlYzE3YmYpLCBXVEMoMHg4NjI0NmI1MCksCisgICAgV1RDKDB4ODY1YmE3ZDcpLCBXVEMoMHg4NjkxYzRjMCksIFdUQygweDg2YzZkNzJhKSwgV1RDKDB4ODZmYWUwNmMpLAorICAgIFdUQygweDg3MmRmY2QxKSwgV1RDKDB4ODc2MDJjNmEpLCBXVEMoMHg4NzkxOGEyNyksIFdUQygweDg3YzIyZWY4KSwKKyAgICBXVEMoMHg4ODJmN2MyMCksIFdUQygweDg4ZGMzOGFiKSwgV1RDKDB4ODlhNTJmNDcpLCBXVEMoMHg4YTczNzYzNSksCisgICAgV1RDKDB4OGI0M2QwOGQpLCBXVEMoMHg4YzE5YmU5ZiksIFdUQygweDhjZjg5Y2U3KSwgV1RDKDB4OGRlMzM3ZTkpLAorICAgIFdUQygweDhlZGIzZTAyKSwgV1RDKDB4OGZlMWU4MTUpLCBXVEMoMHg5MGY3ZTEwNyksIFdUQygweDkyMWQ4Yjk1KSwKKyAgICBXVEMoMHg5MzUzMDA4YyksIFdUQygweDk0OTgyZmQ3KSwgV1RDKDB4OTVlY2RjNmQpLCBXVEMoMHg5NzUwYjg3ZiksCisgICAgV1RDKDB4OThjMzZhZDYpLCBXVEMoMHg5YTQ0NzY3NCksIFdUQygweDliZDM0ZTljKSwgV1RDKDB4OWQ2Zjc2ZmEpLAorICAgIFdUQygweDlmMTg3ODBkKSwgV1RDKDB4YTBjZGM0ODcpLCBXVEMoMHhhMjhlZmY4ZSksIFdUQygweGE0NWJiZTRiKSwKKyAgICBXVEMoMHhhNjMzYmFhZiksIFdUQygweGE4MTZiZmYwKSwgV1RDKDB4YWEwNGE5MGQpLCBXVEMoMHhhYmZkNzIwNSksCisgICAgV1RDKDB4YWUwMTM1NmIpLCBXVEMoMHhiMDEwMTQ3NyksIFdUQygweGIyMmE1MjQ0KSwgV1RDKDB4YjQ1MDBiMDIpLAorICAgIFdUQygweDQ5OTk0NmYzKSwgV1RDKDB4NDc1ZGE1YWYpLCBXVEMoMHg0NTE3M2RjZSksIFdUQygweDQyYzYxMGFkKSwKKyAgICBXVEMoMHg0MDZhNDRiMCksIFdUQygweDNlMDM3Y2U4KSwgV1RDKDB4M2I5MmI4MDYpLCBXVEMoMHgzOTE5NWNkMCksCisgICAgV1RDKDB4MzY5NjJmMTcpLCBXVEMoMHgzNDBhMWIyOCksIFdUQygweDMxNzdjZGU2KSwgV1RDKDB4MmVlMWYyMGQpLAorICAgIFdUQygweDJjNDliMGQ2KSwgV1RDKDB4MjlhZDNkNzQpLCBXVEMoMHgyNzBlOWVjMSksIFdUQygweDI0NzQxMzJmKSwKKyAgICBXVEMoMHgyMWUxNGEwMSksIFdUQygweDFmNTc3MDRlKSwgV1RDKDB4MWNkNzU4Y2UpLCBXVEMoMHgxYTYxMGQ0OCksCisgICAgV1RDKDB4MTdmNWRiODgpLCBXVEMoMHgxNTk4YTE4OCksIFdUQygweDEzNGY3YTQwKSwgV1RDKDB4MTExZjFjYTApLAorICAgIFdUQygweDBmMDUzYjgzKSwgV1RDKDB4MGNmODcxZGIpLCBXVEMoMHgwYWYxOWU2MCksIFdUQygweDA4ZWFhNTZkKSwKKyAgICBXVEMoMHgwNmUzYzQ3MyksIFdUQygweDA0ZDI1Y2M5KSwgV1RDKDB4MDJiNTliNGQpLCBXVEMoMHgwMGU1YmM0YyksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHhmZmNlYmYxNCksIFdUQygweGZmNmNjMjQ5KSwgV1RDKDB4ZmYwYjhiZGEpLCBXVEMoMHhmZWFjM2U1ZiksCisgICAgV1RDKDB4ZmU0ZjQ2MzgpLCBXVEMoMHhmZGY1MDUyZiksIFdUQygweGZkOWU4Y2Y0KSwgV1RDKDB4ZmQ0ZTM0ZWEpLAorICAgIFdUQygweGZkMDIzMTQyKSwgV1RDKDB4ZmNiOGY2ZjcpLCBXVEMoMHhmYzc0ZTA5MCksIFdUQygweGZjM2IzM2U4KSwKKyAgICBXVEMoMHhmYzBjMTI1NCksIFdUQygweGZiZTFiMmViKSwgV1RDKDB4ZmJiOGNlNzMpLCBXVEMoMHhmYjk3ZTUxMSksCisgICAgV1RDKDB4ZmI4NjI3M2QpLCBXVEMoMHhmYjg1N2EzZSksIFdUQygweGZiOTE4ODEzKSwgV1RDKDB4ZmJhNDM2OTIpLAorICAgIFdUQygweGZiYjk2ZjI0KSwgV1RDKDB4ZmJkNGRjYzMpLCBXVEMoMHhmYzAwMGNkNSksIFdUQygweGZjNDU4NjUzKSwKKyAgICBXVEMoMHhmY2E2Y2Q5OCksIFdUQygweGZkMTc4YzhlKSwgV1RDKDB4ZmQ4NzI5NzkpLCBXVEMoMHhmZGZhNzIxZSksCisgICAgV1RDKDB4ZmU4OGM3N2MpLCBXVEMoMHhmZjNjOGI1YyksIFdUQygweDAwMDU5ZWJjKSwgV1RDKDB4MDBkOTFkYjApLAorICAgIFdUQygweDAxYmVjNTU1KSwgV1RDKDB4MDJiZGZiODApLCBXVEMoMHgwM2Q0Yzg0NiksIFdUQygweDA1MDFhZDUzKSwKKyAgICBXVEMoMHgwNjQ3MTliMiksIFdUQygweDA3YTM0YTJiKSwgV1RDKDB4MDkxODgxNGIpLCBXVEMoMHgwYWFhYWE2YiksCisgICAgV1RDKDB4MGM1NzI4YjkpLCBXVEMoMHgwZTFjMWEwZiksIFdUQygweDBmZjljY2QxKSwgV1RDKDB4MTFmMjFmZmIpLAorICAgIFdUQygweDE0MDVkMDczKSwgV1RDKDB4MTYzNTc3NmIpLCBXVEMoMHgxODgwZjRlNSksIFdUQygweDFhZThiZGNiKSwKKyAgICBXVEMoMHgxZDZjZWRlMyksIFdUQygweDIwMGUxZDkzKSwgV1RDKDB4MjJjYzU2ZmQpLCBXVEMoMHgyNWE4MDg1OCksCisgICAgV1RDKDB4MjhhMTFiZGQpLCBXVEMoMHgyYmI3ZTM2MyksIFdUQygweDJlZWMyZjBmKSwgV1RDKDB4MzIzZTI5OGQpLAorICAgIFdUQygweDM1YWQ3ZjBiKSwgV1RDKDB4MzkzYTE5ODkpLCBXVEMoMHgzY2UzNGE2NSksIFdUQygweDQwYTg2ODNkKSwKKyAgICBXVEMoMHg0NDg4MWM5NCksIFdUQygweDQ4ODEzY2IzKSwgV1RDKDB4NGM5NDUyM2QpLCBXVEMoMHg1MGM4ZWZmMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwNTNhMWVhKSwgV1RDKDB4MDBmNjcwNjYpLAorICAgIFdUQygweDAxZTNmNjFiKSwgV1RDKDB4MDMxN2JkYWYpLCBXVEMoMHgwNDhkNTFjYSksIFdUQygweDA2NDAzZDExKSwKKyAgICBXVEMoMHgwODJjMGEzNCksIFdUQygweDBhNGM0M2QyKSwgV1RDKDB4MGM5Yzc0OGUpLCBXVEMoMHgwZjE4MjcxOCksCisgICAgV1RDKDB4MTFiYWU2MTYpLCBXVEMoMHgxNDgwM2MxYiksIFdUQygweDE3NjNiM2U2KSwgV1RDKDB4MWE2MGQ4MzIpLAorICAgIFdUQygweDFkNzMzMzZiKSwgV1RDKDB4MjA5NjUwNjgpLCBXVEMoMHgyM2M1YjlkNiksIFdUQygweDI2ZmNmYTFhKSwKKyAgICBXVEMoMHgyYTM3OWMzMCksIFdUQygweDJkNzEyYTc1KSwgV1RDKDB4MzBhNTJmYmEpLCBXVEMoMHgzM2NmMzZhOSksCisgICAgV1RDKDB4MzZlYWNhMTUpLCBXVEMoMHgzOWYzNzQzYiksIFdUQygweDNjZTRiZmMyKSwgV1RDKDB4M2ZiYTM3YjgpLAorICAgIFdUQygweDQyNmY2NjcxKSwgV1RDKDB4NDRmZmQ2ZTgpLCBXVEMoMHg0NzY3MTMyNiksIFdUQygweDQ5YTBiMmQwKSwKKyAgICBXVEMoMHg0YmE4MWJlMSksIFdUQygweDRkNzhmZDFlKSwgV1RDKDB4NGYwZWQ1MDMpLCBXVEMoMHg1MDY1MmUyOCksCisgICAgV1RDKDB4NTE3NzkzNTEpLCBXVEMoMHg1MjQxOGZiZSksIFdUQygweDUyYmVhZDc1KSwgV1RDKDB4NTJlYTc2Y2MpLAorICAgIFdUQygweDUyYzA3NzkzKSwgV1RDKDB4NTIzYzM5MTgpLCBXVEMoMHg1MTU5NDcwZSksIFdUQygweDUwMTMyYjM2KSwKKyAgICBXVEMoMHg0ZTY1NzEyOCksIFdUQygweDRjNGJhMzFkKSwgV1RDKDB4NDljMTRiNjApLCBXVEMoMHg0NmMxZTllNCksCisgICAgV1RDKDB4NDM3NGUxNzkpLCBXVEMoMHg0MDgzNzdiMSksIFdUQygweDNlMGZhMGFhKSwgV1RDKDB4M2MwNWQ1ODQpLAorICAgIFdUQygweDNhNGQ5ODg4KSwgV1RDKDB4MzhjZGQ4ZmEpLCBXVEMoMHgzNzZiNzVjNCksIFdUQygweDM2MGM1MWE3KSwKKyAgICBXVEMoMHgzNGIxMmZkYyksIFdUQygweDMzNTUwZDlmKSwgV1RDKDB4MzFmMTk1NWMpLCBXVEMoMHgzMDdmZmNiMiksCisgICAgV1RDKDB4MmYwM2M0NGQpLCBXVEMoMHgyZDdhNmI4NiksIFdUQygweDJiZTZkM2Q0KSwgV1RDKDB4MmE0OGQyMTkpLAorfTsKKworY29uc3QgRklYUF9XVEIgRUxEQW5hbHlzaXMxMjBbMzYwXSA9IHsKKyAgICBXVEMoMHhmYWExYTQwYSksIFdUQygweGZhM2YxNzNkKSwgV1RDKDB4ZjlkNzc2MGMpLCBXVEMoMHhmOTZiY2MxMiksCisgICAgV1RDKDB4ZjhmYmU4MmMpLCBXVEMoMHhmODg3YmIyNiksIFdUQygweGY4MGYxMzFhKSwgV1RDKDB4Zjc5MzBkMDMpLAorICAgIFdUQygweGY3MTRhZWFmKSwgV1RDKDB4ZjY5M2Y1YTEpLCBXVEMoMHhmNjEzMzg1YiksIFdUQygweGY1OTZlZjBlKSwKKyAgICBXVEMoMHhmNTIyZGNjNCksIFdUQygweGY0YmFiMWY2KSwgV1RDKDB4ZjQ2MTcwMGMpLCBXVEMoMHhmNDEyZTFmZSksCisgICAgV1RDKDB4ZjNiNzY5YjEpLCBXVEMoMHhmMzQ5ZWFjYSksIFdUQygweGYyY2I5MTY0KSwgV1RDKDB4ZjIzZDZkN2IpLAorICAgIFdUQygweGYxYTBhYjI4KSwgV1RDKDB4ZjBmNWMyMGYpLCBXVEMoMHhmMDNhYWRkOSksIFdUQygweGVmNmU4YzY2KSwKKyAgICBXVEMoMHhlZTk4NDkxMCksIFdUQygweGVkYmJjYmY4KSwgV1RDKDB4ZWNkMTQzNWIpLCBXVEMoMHhlYmRjMWI3NyksCisgICAgV1RDKDB4ZWFlMzEzMzgpLCBXVEMoMHhlOWRiZWE5YSksIFdUQygweGU4YzAwNWVhKSwgV1RDKDB4ZTc5ZTcwNjgpLAorICAgIFdUQygweGU2ODU2ZGNlKSwgV1RDKDB4ZTU2NTdjNzkpLCBXVEMoMHhlNDI5MjhlOSksIFdUQygweGUyZTA3NTZlKSwKKyAgICBXVEMoMHhlMWE4M2NmNSksIFdUQygweGUwODAxZmFiKSwgV1RDKDB4ZGY1MmJmZWIpLCBXVEMoMHhkZTE1ZDFiMSksCisgICAgV1RDKDB4ZGNjZTcxYmEpLCBXVEMoMHhkYjg5MzFiZiksIFdUQygweGRhNGZiYmU4KSwgV1RDKDB4ZDkyMjBhOTgpLAorICAgIFdUQygweGQ3ZjlhZjBjKSwgV1RDKDB4ZDZkMGUxZGYpLCBXVEMoMHhkNWE0MWYxNSksIFdUQygweGQ0NzkwMzMwKSwKKyAgICBXVEMoMHhkMzVmODRiOCksIFdUQygweGQyNTVlODgxKSwgV1RDKDB4ZDE0ZGFmMDApLCBXVEMoMHhkMDQ2MzhlMiksCisgICAgV1RDKDB4Y2Y0N2RmZjcpLCBXVEMoMHhjZTViODg1MCksIFdUQygweGNkNzdiMWQ2KSwgV1RDKDB4Y2M5NjBlYzApLAorICAgIFdUQygweGNiYzBhNmE0KSwgV1RDKDB4Y2FmNmQ0ZjcpLCBXVEMoMHhjYTM0ZmE3ZCksIFdUQygweGM5N2MyNmMwKSwKKyAgICBXVEMoMHhjOGM2ODY4YSksIFdUQygweGM4MTFmODczKSwgV1RDKDB4Yzc1OTlkYjgpLCBXVEMoMHhjNjlmOTc4MCksCisgICAgV1RDKDB4YzVlMjQwNDMpLCBXVEMoMHhjNTIyNjM4NCksIFdUQygweGM0NjhmNTQ3KSwgV1RDKDB4YzNiMjBiZTkpLAorICAgIFdUQygweGMyZjgyNmYwKSwgV1RDKDB4YzI0MmVhMDIpLCBXVEMoMHhjMTk4NDRhZSksIFdUQygweGMwZjgwNzE0KSwKKyAgICBXVEMoMHhjMDVhNmRhMSksIFdUQygweGJmYmZlNmQzKSwgV1RDKDB4YmYzMWI1YjQpLCBXVEMoMHhiZWIyNDg0MyksCisgICAgV1RDKDB4YmUzZjRjYjQpLCBXVEMoMHhiZGQ2MzU5OSksIFdUQygweGJkNzRjNmIyKSwgV1RDKDB4YmQxYjcxMjgpLAorICAgIFdUQygweGJjY2Q0YjQxKSwgV1RDKDB4YmM4ZGMwOGUpLCBXVEMoMHhiYzVjYTJiZCksIFdUQygweGJjMzUwOWYxKSwKKyAgICBXVEMoMHhiYzExZjkwNCksIFdUQygweGJiZjM3ODQ4KSwgV1RDKDB4YmJkZGZiNmIpLCBXVEMoMHhiYmQyMTRlYSksCisgICAgV1RDKDB4YmJjYjNhMTEpLCBXVEMoMHhiYmNjZTU4MSksIFdUQygweGJiZGZhNmJhKSwgV1RDKDB4YmJmZDJmYTUpLAorICAgIFdUQygweGJjMWFkNTE2KSwgV1RDKDB4YmMzOTBjMTYpLCBXVEMoMHhiYzU3YjMyMyksIFdUQygweGJjNzZkZDFmKSwKKyAgICBXVEMoMHhiYzk2OTE3MiksIFdUQygweGJjYjZkNjExKSwgV1RDKDB4YmNkN2FjOGUpLCBXVEMoMHhiY2Y5MWFmOSksCisgICAgV1RDKDB4YmQxYjIwYmQpLCBXVEMoMHhiZDNkYzFmNSksIFdUQygweGJkNjBmNjc4KSwgV1RDKDB4YmQ4NGJlYzcpLAorICAgIFdUQygweGJkYTkwOWMwKSwgV1RDKDB4YmRjZGQ3NmUpLCBXVEMoMHhiZGYzMTYxYyksIFdUQygweGJlMThjMWU1KSwKKyAgICBXVEMoMHhiZTNlYzZjNSksIFdUQygweGJlNjUxZjE5KSwgV1RDKDB4YmU4YmI3OGIpLCBXVEMoMHhiZWIyODhlMSksCisgICAgV1RDKDB4YmVkOTg0OGIpLCBXVEMoMHhiZjAwYTE2ZiksIFdUQygweGJmMjdkNjgxKSwgV1RDKDB4YmY0ZjE5NTgpLAorICAgIFdUQygweGJmNzY2ODBlKSwgV1RDKDB4YmY5ZGI4NWMpLCBXVEMoMHhiZmM1MGUwOSksIFdUQygweGJmZWM1YmRmKSwKKyAgICBXVEMoMHg4MDI3M2JkYiksIFdUQygweDgwNzU3N2RlKSwgV1RDKDB4ODBjMzYzMGQpLCBXVEMoMHg4MTEwZTRjYiksCisgICAgV1RDKDB4ODE1ZTA1ZGEpLCBXVEMoMHg4MWFhYjIwZiksIFdUQygweDgxZjZlNjhlKSwgV1RDKDB4ODI0MjkwZDApLAorICAgIFdUQygweDgyOGRhMDRjKSwgV1RDKDB4ODJkODA2MWYpLCBXVEMoMHg4MzIxYTc0MCksIFdUQygweDgzNmE3N2Y5KSwKKyAgICBXVEMoMHg4M2IyNTc0ZiksIFdUQygweDgzZjkzY2MxKSwgV1RDKDB4ODQzZjA0YTYpLCBXVEMoMHg4NDgzYWNkMSksCisgICAgV1RDKDB4ODRjNzE2MzkpLCBXVEMoMHg4NTA5NDRkYSksIFdUQygweDg1NGExZDNhKSwgV1RDKDB4ODU4OWE0MzcpLAorICAgIFdUQygweDg1YzdjY2Y5KSwgV1RDKDB4ODYwNGE0MmYpLCBXVEMoMHg4NjQwMmNmYiksIFdUQygweDg2N2E3NDBkKSwKKyAgICBXVEMoMHg4NmIzN2ZmMiksIFdUQygweDg2ZWI1ZjZmKSwgV1RDKDB4ODcyMjIxMDkpLCBXVEMoMHg4NzU3ZWI1ZiksCisgICAgV1RDKDB4ODc4YzgzNDEpLCBXVEMoMHg4N2MwYmU1MSksIFdUQygweDg4MzQ1ZmNhKSwgV1RDKDB4ODhlZjk3ZmIpLAorICAgIFdUQygweDg5Yzc3OGM1KSwgV1RDKDB4OGFhM2NjMjApLCBXVEMoMHg4YjgzM2Q1NiksIFdUQygweDhjNmE0MmE5KSwKKyAgICBXVEMoMHg4ZDVjYjc4NyksIFdUQygweDhlNWQ3Nzg3KSwgV1RDKDB4OGY2ZTNjNWIpLCBXVEMoMHg5MDkwMjY0MCksCisgICAgV1RDKDB4OTFjM2NhMjgpLCBXVEMoMHg5MzA5NjIyZCksIFdUQygweDk0NjBlN2QwKSwgV1RDKDB4OTVjYTFhZDIpLAorICAgIFdUQygweDk3NDQ5ZGZmKSwgV1RDKDB4OThkMDA2MTIpLCBXVEMoMHg5YTZiYmMxOSksIFdUQygweDljMTcxNjRkKSwKKyAgICBXVEMoMHg5ZGQxODBmYyksIFdUQygweDlmOWE2MzA0KSwgV1RDKDB4YTE3MTFmNTYpLCBXVEMoMHhhMzU1NDI1ZSksCisgICAgV1RDKDB4YTU0NjU4NDYpLCBXVEMoMHhhNzQ0MTkwZiksIFdUQygweGE5NGU0Y2E5KSwgV1RDKDB4YWI2NGRjZjApLAorICAgIFdUQygweGFkODdlMDY4KSwgV1RDKDB4YWZiNzdiZmEpLCBXVEMoMHhiMWYzZmIyYiksIFdUQygweGI0M2Q4ODVjKSwKKyAgICBXVEMoMHg0OTg2NjQ1MSksIFdUQygweDQ3MjNlNTZiKSwgV1RDKDB4NDRiNTFlOGQpLCBXVEMoMHg0MjNhMjE4MCksCisgICAgV1RDKDB4M2ZiMmZlMGYpLCBXVEMoMHgzZDFmNzhmMiksIFdUQygweDNhODE1M2I3KSwgV1RDKDB4MzdkOTA2ZmYpLAorICAgIFdUQygweDM1MjU5ZTdlKSwgV1RDKDB4MzI2OWJhMTgpLCBXVEMoMHgyZmE4YzFlYSksIFdUQygweDJjZTRmYmFiKSwKKyAgICBXVEMoMHgyYTFjZWJkNSksIFdUQygweDI3NTE5YWMxKSwgV1RDKDB4MjQ4YTJkZTkpLCBXVEMoMHgyMWNiN2E3OSksCisgICAgV1RDKDB4MWYxNmZjMTMpLCBXVEMoMHgxYzZkOWE1MCksIFdUQygweDE5Y2Y4M2MxKSwgV1RDKDB4MTczZTk5NDMpLAorICAgIFdUQygweDE0YmY2YTcxKSwgV1RDKDB4MTI1OThmNzQpLCBXVEMoMHgxMDBmZTI3ZiksIFdUQygweDBkZGFiNDZhKSwKKyAgICBXVEMoMHgwYmFmYWI5ZCksIFdUQygweDA5ODY0ZmM3KSwgV1RDKDB4MDc1ZDNhYzgpLCBXVEMoMHgwNTJjMGZjMiksCisgICAgV1RDKDB4MDJlYTg0MmIpLCBXVEMoMHgwMGYyMWQxOSksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksCisgICAgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLAorICAgIFdUQygweDAwMDAwMDAwKSwgV1RDKDB4MDAwMDAwMDApLCBXVEMoMHgwMDAwMDAwMCksIFdUQygweDAwMDAwMDAwKSwKKyAgICBXVEMoMHhmZmNiN2I0ZCksIFdUQygweGZmNjJmYjIwKSwgV1RDKDB4ZmVmYjgyZTIpLCBXVEMoMHhmZTk2NTQ4MiksCisgICAgV1RDKDB4ZmUzM2U0YmYpLCBXVEMoMHhmZGQ0YjliNSksIFdUQygweGZkN2IwNGVjKSwgV1RDKDB4ZmQyN2NmZTQpLAorICAgIFdUQygweGZjZDg0Y2ZkKSwgV1RDKDB4ZmM4Y2UxZDQpLCBXVEMoMHhmYzRiNDVlMSksIFdUQygweGZjMTY2NmRhKSwKKyAgICBXVEMoMHhmYmU4YWYyNiksIFdUQygweGZiYmNhZDllKSwgV1RDKDB4ZmI5OGM2YWQpLCBXVEMoMHhmYjg1ZGQ4NyksCisgICAgV1RDKDB4ZmI4NjM1NWIpLCBXVEMoMHhmYjk0NTg5YiksIFdUQygweGZiYThlZDhhKSwgV1RDKDB4ZmJjMGE3MzUpLAorICAgIFdUQygweGZiZTIzZjhkKSwgV1RDKDB4ZmMxYTkyYzQpLCBXVEMoMHhmYzczMzE1ZiksIFdUQygweGZjZTYxMWExKSwKKyAgICBXVEMoMHhmZDVlOTRkOSksIFdUQygweGZkZDYxY2FiKSwgV1RDKDB4ZmU2NDI3ZmQpLCBXVEMoMHhmZjFjOTJkYSksCisgICAgV1RDKDB4ZmZmMTA1NDIpLCBXVEMoMHgwMGQxZDU4YSksIFdUQygweDAxYzZkYWFiKSwgV1RDKDB4MDJkOGRiYzMpLAorICAgIFdUQygweDA0MDU1N2E2KSwgV1RDKDB4MDU0YjZmOTEpLCBXVEMoMHgwNmFkMmIyYiksIFdUQygweDA4MjhmNGM1KSwKKyAgICBXVEMoMHgwOWMzNDhkMSksIFdUQygweDBiN2RjYjU2KSwgV1RDKDB4MGQ1NGQ5OGUpLCBXVEMoMHgwZjQ3YTU5OSksCisgICAgV1RDKDB4MTE1N2ZhMWIpLCBXVEMoMHgxMzg3NDNhZSksIFdUQygweDE1ZDY0MjNmKSwgV1RDKDB4MTg0NGYwYWUpLAorICAgIFdUQygweDFhZDNjMjczKSwgV1RDKDB4MWQ4MmU2NWMpLCBXVEMoMHgyMDUzMDZlMSksIFdUQygweDIzNDQzZDVjKSwKKyAgICBXVEMoMHgyNjU2ZmFlOCksIFdUQygweDI5OGIzYTVhKSwgV1RDKDB4MmNlMTNhN2QpLCBXVEMoMHgzMDU4ZTBlMyksCisgICAgV1RDKDB4MzNmMjI5NTApLCBXVEMoMHgzN2FjZDBiMiksIFdUQygweDNiODg1ZTZiKSwgV1RDKDB4M2Y4NDA0MTIpLAorICAgIFdUQygweDQzOWU2NWVlKSwgV1RDKDB4NDdkNjAxNGUpLCBXVEMoMHg0YzJhYTg1NyksIFdUQygweDUwYTQ2ODc2KSwKKyAgICBXVEMoMHhmZmZlOWIwMiksIFdUQygweDAwMDRhYzYxKSwgV1RDKDB4MDA2OTYzOWQpLCBXVEMoMHgwMTI3NTc4YiksCisgICAgV1RDKDB4MDIzOTFlZmUpLCBXVEMoMHgwMzk5NTBjYyksIFdUQygweDA1NDI4M2JmKSwgV1RDKDB4MDcyZjRlYmEpLAorICAgIFdUQygweDA5NWE0ODhjKSwgV1RDKDB4MGJiZTA4MDIpLCBXVEMoMHgwZTU1MjNmOSksIFdUQygweDExMWEzMzJlKSwKKyAgICBXVEMoMHgxNDA3Y2NhMiksIFdUQygweDE3MTg4NmY1KSwgV1RDKDB4MWE0NmY5MjcpLCBXVEMoMHgxZDhkYjllMSksCisgICAgV1RDKDB4MjBlNzYwMGQpLCBXVEMoMHgyNDRlODJhMyksIFdUQygweDI3YmRiODQ2KSwgV1RDKDB4MmIyZjk3YTgpLAorICAgIFdUQygweDJlOWViN2VhKSwgV1RDKDB4MzIwNWFmZDEpLCBXVEMoMHgzNTVmMTYxYyksIFdUQygweDM4YTU4MWQ3KSwKKyAgICBXVEMoMHgzYmQzODk0YSksIFdUQygweDNlZTNjMzk4KSwgV1RDKDB4NDFkMGM3YWUpLCBXVEMoMHg0NDk1MmNiOCksCisgICAgV1RDKDB4NDcyYjg4NTYpLCBXVEMoMHg0OThlN2VlZSksIFdUQygweDRiYjg4MjQ1KSwgV1RDKDB4NGRhNDRkOWYpLAorICAgIFdUQygweDRmNGM2YjdkKSwgV1RDKDB4NTBhYjcyOTgpLCBXVEMoMHg1MWJiZmExMSksIFdUQygweDUyNzg5OGZiKSwKKyAgICBXVEMoMHg1MmRiZTVmMiksIFdUQygweDUyZTA3Nzc4KSwgV1RDKDB4NTI4MGU1MWYpLCBXVEMoMHg1MWI3YzRmMSksCisgICAgV1RDKDB4NTA3ZmFkYzcpLCBXVEMoMHg0ZWQzMzZkZCksIFdUQygweDRjYWNmNzQ5KSwgV1RDKDB4NGEwNzg1MzQpLAorICAgIFdUQygweDQ2ZGQ2ZGNjKSwgV1RDKDB4NDM1OTllMjIpLCBXVEMoMHg0MDNmNDhkYSksIFdUQygweDNkYjFlZDg5KSwKKyAgICBXVEMoMHgzYjk4YmQyNCksIFdUQygweDM5ZDViMDAzKSwgV1RDKDB4Mzg0YTMyOTIpLCBXVEMoMHgzNmQzMjhmZiksCisgICAgV1RDKDB4MzU1ZTYzYTYpLCBXVEMoMHgzM2VjNjlkOCksIFdUQygweDMyNzU1ZWJkKSwgV1RDKDB4MzBmMDFmY2UpLAorICAgIFdUQygweDJmNWQ5NjQ2KSwgV1RDKDB4MmRiY2M2MTUpLCBXVEMoMHgyYzBmYTE0NSksIFdUQygweDJhNTZjZTUzKSwKK307CmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2FhY0VuY19yb20uaCBiL2xpYkFBQ2VuYy9zcmMvYWFjRW5jX3JvbS5oCmluZGV4IDg2MjQxN2YuLmZkNTBjYWIgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvYWFjRW5jX3JvbS5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvYWFjRW5jX3JvbS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDM5ICs5MCw0MiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yczogICAgICBNLiBMb2h3YXNzZXIsIE0uIEdheWVyCi0gICBDb250ZW50cy9kZXNjcmlwdGlvbjoKKyAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIsIE0uIEdheWVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBNZW1vcnkgbGF5b3V0ICAgCisgIFxicmllZiAgTWVtb3J5IGxheW91dAogICBcYXV0aG9yIE1hcmt1cyBMb2h3YXNzZXIKICovCiAKLSNpZm5kZWYgQUFDX0VOQ19ST01fSAotI2RlZmluZSBBQUNfRU5DX1JPTV9ICisjaWZuZGVmIEFBQ0VOQ19ST01fSAorI2RlZmluZSBBQUNFTkNfUk9NX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAogI2luY2x1ZGUgInBzeV9jb25zdC5oIgogI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgorI2luY2x1ZGUgIkZES19scGMuaCIKIAogLyoKICAgSHVmZm1hbiBUYWJsZXMKICovCi1leHRlcm4gY29uc3QgVUxPTkcgIEZES2FhY0VuY19odWZmX2x0YWIxXzJbM11bM11bM11bM107Ci1leHRlcm4gY29uc3QgVUxPTkcgIEZES2FhY0VuY19odWZmX2x0YWIzXzRbM11bM11bM11bM107Ci1leHRlcm4gY29uc3QgVUxPTkcgIEZES2FhY0VuY19odWZmX2x0YWI1XzZbOV1bOV07Ci1leHRlcm4gY29uc3QgVUxPTkcgIEZES2FhY0VuY19odWZmX2x0YWI3XzhbOF1bOF07Ci1leHRlcm4gY29uc3QgVUxPTkcgIEZES2FhY0VuY19odWZmX2x0YWI5XzEwWzEzXVsxM107Ci1leHRlcm4gY29uc3QgVUNIQVIgIEZES2FhY0VuY19odWZmX2x0YWIxMVsxN11bMTddOwotZXh0ZXJuIGNvbnN0IFVDSEFSICBGREthYWNFbmNfaHVmZl9sdGFic2NmWzEyMV07CitleHRlcm4gY29uc3QgVUxPTkcgRkRLYWFjRW5jX2h1ZmZfbHRhYjFfMlszXVszXVszXVszXTsKK2V4dGVybiBjb25zdCBVTE9ORyBGREthYWNFbmNfaHVmZl9sdGFiM180WzNdWzNdWzNdWzNdOworZXh0ZXJuIGNvbnN0IFVMT05HIEZES2FhY0VuY19odWZmX2x0YWI1XzZbOV1bOV07CitleHRlcm4gY29uc3QgVUxPTkcgRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFs4XVs4XTsKK2V4dGVybiBjb25zdCBVTE9ORyBGREthYWNFbmNfaHVmZl9sdGFiOV8xMFsxM11bMTNdOworZXh0ZXJuIGNvbnN0IFVDSEFSIEZES2FhY0VuY19odWZmX2x0YWIxMVsxN11bMTddOworZXh0ZXJuIGNvbnN0IFVDSEFSIEZES2FhY0VuY19odWZmX2x0YWJzY2ZbMTIxXTsKIGV4dGVybiBjb25zdCBVU0hPUlQgRkRLYWFjRW5jX2h1ZmZfY3RhYjFbM11bM11bM11bM107CiBleHRlcm4gY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWIyWzNdWzNdWzNdWzNdOwogZXh0ZXJuIGNvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiM1szXVszXVszXVszXTsKQEAgLTEyMywxMyArMTM3LDEzIEBACiBleHRlcm4gY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWI5WzEzXVsxM107CiBleHRlcm4gY29uc3QgVVNIT1JUIEZES2FhY0VuY19odWZmX2N0YWIxMFsxM11bMTNdOwogZXh0ZXJuIGNvbnN0IFVTSE9SVCBGREthYWNFbmNfaHVmZl9jdGFiMTFbMjFdWzE3XTsKLWV4dGVybiBjb25zdCBVTE9ORyAgRkRLYWFjRW5jX2h1ZmZfY3RhYnNjZlsxMjFdOworZXh0ZXJuIGNvbnN0IFVMT05HIEZES2FhY0VuY19odWZmX2N0YWJzY2ZbMTIxXTsKIAogLyoKICAgcXVhbnRpemVyCiAqLwogI2RlZmluZSBNQU5UX0RJR0lUUyA5Ci0jZGVmaW5lIE1BTlRfU0laRSAgICgxPDxNQU5UX0RJR0lUUykKKyNkZWZpbmUgTUFOVF9TSVpFICgxIDw8IE1BTlRfRElHSVRTKQogCiAjaWYgZGVmaW5lZChBUkNIX1BSRUZFUl9NVUxUXzMyeDE2KQogI2RlZmluZSBGSVhQX1FURCBGSVhQX1NHTApAQCAtMTQ3LDUwICsxNjEsNDcgQEAKIGV4dGVybiBjb25zdCBGSVhQX0RCTCBGREthYWNFbmNfc3BlY0V4cE1hbnRUYWJsZUNvbWJFbGNbNF1bMTRdOwogZXh0ZXJuIGNvbnN0IFVDSEFSIEZES2FhY0VuY19zcGVjRXhwVGFibGVDb21iWzRdWzE0XTsKIAotCiAvKgogICB0YWJsZSB0byBjb3VudCB1c2VkIG51bWJlciBvZiBiaXRzCiAqLwotZXh0ZXJuIGNvbnN0IFNIT1JUIEZES2FhY0VuY19zaWRlSW5mb1RhYkxvbmdbTUFYX1NGQl9MT05HICsgMV07Ci1leHRlcm4gY29uc3QgU0hPUlQgRkRLYWFjRW5jX3NpZGVJbmZvVGFiU2hvcnRbTUFYX1NGQl9TSE9SVCArIDFdOwotCitleHRlcm4gY29uc3QgU0hPUlQgRkRLYWFjRW5jX3NpZGVJbmZvVGFiTG9uZ1tdOworZXh0ZXJuIGNvbnN0IFNIT1JUIEZES2FhY0VuY19zaWRlSW5mb1RhYlNob3J0W107CiAKIC8qCiAgIFBzeSBDb25maWd1cmF0aW9uIGNvbnN0YW50cwogKi8KLWV4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyAgcF9GREthYWNFbmNfODAwMF9sb25nXzEwMjQ7CitleHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfODAwMF9sb25nXzEwMjQ7CiBleHRlcm4gY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzgwMDBfc2hvcnRfMTI4OwotZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HICBwX0ZES2FhY0VuY18xMTAyNV9sb25nXzEwMjQ7CitleHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfMTEwMjVfbG9uZ18xMDI0OwogZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY18xMTAyNV9zaG9ydF8xMjg7Ci1leHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgIHBfRkRLYWFjRW5jXzEyMDAwX2xvbmdfMTAyNDsKK2V4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyBwX0ZES2FhY0VuY18xMjAwMF9sb25nXzEwMjQ7CiBleHRlcm4gY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzEyMDAwX3Nob3J0XzEyODsKLWV4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyAgcF9GREthYWNFbmNfMTYwMDBfbG9uZ18xMDI0OworZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfRkRLYWFjRW5jXzE2MDAwX2xvbmdfMTAyNDsKIGV4dGVybiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfMTYwMDBfc2hvcnRfMTI4OwotZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HICBwX0ZES2FhY0VuY18yMjA1MF9sb25nXzEwMjQ7CitleHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfMjIwNTBfbG9uZ18xMDI0OwogZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY18yMjA1MF9zaG9ydF8xMjg7Ci1leHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgIHBfRkRLYWFjRW5jXzI0MDAwX2xvbmdfMTAyNDsKK2V4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyBwX0ZES2FhY0VuY18yNDAwMF9sb25nXzEwMjQ7CiBleHRlcm4gY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzI0MDAwX3Nob3J0XzEyODsKLWV4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyAgcF9GREthYWNFbmNfMzIwMDBfbG9uZ18xMDI0OworZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfRkRLYWFjRW5jXzMyMDAwX2xvbmdfMTAyNDsKIGV4dGVybiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfMzIwMDBfc2hvcnRfMTI4OwotZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HICBwX0ZES2FhY0VuY180NDEwMF9sb25nXzEwMjQ7CitleHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfNDQxMDBfbG9uZ18xMDI0OwogZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY180NDEwMF9zaG9ydF8xMjg7Ci1leHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgIHBfRkRLYWFjRW5jXzQ4MDAwX2xvbmdfMTAyNDsKK2V4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyBwX0ZES2FhY0VuY180ODAwMF9sb25nXzEwMjQ7CiBleHRlcm4gY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzQ4MDAwX3Nob3J0XzEyODsKLWV4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyAgcF9GREthYWNFbmNfNjQwMDBfbG9uZ18xMDI0OworZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfRkRLYWFjRW5jXzY0MDAwX2xvbmdfMTAyNDsKIGV4dGVybiBjb25zdCBTRkJfUEFSQU1fU0hPUlQgcF9GREthYWNFbmNfNjQwMDBfc2hvcnRfMTI4OwotZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9MT05HICBwX0ZES2FhY0VuY184ODIwMF9sb25nXzEwMjQ7CitleHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF9GREthYWNFbmNfODgyMDBfbG9uZ18xMDI0OwogZXh0ZXJuIGNvbnN0IFNGQl9QQVJBTV9TSE9SVCBwX0ZES2FhY0VuY184ODIwMF9zaG9ydF8xMjg7Ci1leHRlcm4gY29uc3QgU0ZCX1BBUkFNX0xPTkcgIHBfRkRLYWFjRW5jXzk2MDAwX2xvbmdfMTAyNDsKK2V4dGVybiBjb25zdCBTRkJfUEFSQU1fTE9ORyBwX0ZES2FhY0VuY185NjAwMF9sb25nXzEwMjQ7CiBleHRlcm4gY29uc3QgU0ZCX1BBUkFNX1NIT1JUIHBfRkRLYWFjRW5jXzk2MDAwX3Nob3J0XzEyODsKIAotCiAvKgogICBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cwogKi8KLWV4dGVybiBjb25zdCBGSVhQX0RCTCBGREthYWNFbmNfdG5zRW5jQ29lZmYzWzhdOwotZXh0ZXJuIGNvbnN0IEZJWFBfREJMIEZES2FhY0VuY190bnNDb2VmZjNCb3JkZXJzWzhdOwotZXh0ZXJuIGNvbnN0IEZJWFBfREJMIEZES2FhY0VuY190bnNFbmNDb2VmZjRbMTZdOwotZXh0ZXJuIGNvbnN0IEZJWFBfREJMIEZES2FhY0VuY190bnNDb2VmZjRCb3JkZXJzWzE2XTsKK2V4dGVybiBjb25zdCBGSVhQX0xQQyBGREthYWNFbmNfdG5zRW5jQ29lZmYzWzhdOworZXh0ZXJuIGNvbnN0IEZJWFBfTFBDIEZES2FhY0VuY190bnNDb2VmZjNCb3JkZXJzWzhdOworZXh0ZXJuIGNvbnN0IEZJWFBfTFBDIEZES2FhY0VuY190bnNFbmNDb2VmZjRbMTZdOworZXh0ZXJuIGNvbnN0IEZJWFBfTFBDIEZES2FhY0VuY190bnNDb2VmZjRCb3JkZXJzWzE2XTsKIAogI2RlZmluZSBXVEMwIFdUQwogI2RlZmluZSBXVEMxIFdUQwpAQCAtMTk4LDYgKzIwOSw5IEBACiAKIGV4dGVybiBjb25zdCBGSVhQX1dUQiBFTERBbmFseXNpczUxMlsxNTM2XTsKIGV4dGVybiBjb25zdCBGSVhQX1dUQiBFTERBbmFseXNpczQ4MFsxNDQwXTsKK2V4dGVybiBjb25zdCBGSVhQX1dUQiBFTERBbmFseXNpczI1Nls3NjhdOworZXh0ZXJuIGNvbnN0IEZJWFBfV1RCIEVMREFuYWx5c2lzMjQwWzcyMF07CitleHRlcm4gY29uc3QgRklYUF9XVEIgRUxEQW5hbHlzaXMxMjhbMzg0XTsKK2V4dGVybiBjb25zdCBGSVhQX1dUQiBFTERBbmFseXNpczEyMFszNjBdOwogCi0KLSNlbmRpZiAvKiAjaWZuZGVmIEFBQ19FTkNfUk9NX0ggKi8KKyNlbmRpZiAvKiAjaWZuZGVmIEFBQ0VOQ19ST01fSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9hYWNlbmMuY3BwIGIvbGliQUFDZW5jL3NyYy9hYWNlbmMuY3BwCmluZGV4IDVlOGMwOGQuLjhiOGExYWQgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvYWFjZW5jLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL2FhY2VuYy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRmFzdCBNUEVHIEFBQyBBdWRpbyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gU2NodWcgLyBBLiBHcm9lc2NoZWwKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBmYXN0IGFhYyBjb2RlciBmdW5jdGlvbnMKKyAgIEF1dGhvcihzKTogICBNLiBTY2h1ZyAvIEEuIEdyb2VzY2hlbAogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogZmFzdCBhYWMgY29kZXIgZnVuY3Rpb25zCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJhYWNlbmMuaCIKIApAQCAtMTAyLDc0ICsxMTQsNTMgQEAKIAogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAKKyNkZWZpbmUgQklUUkVTX01BWF9MRCA0MDAwCisjZGVmaW5lIEJJVFJFU19NSU5fTEQgNTAwCisjZGVmaW5lIEJJVFJBVEVfTUFYX0xEIDcwMDAwIC8qIE1heCBhc3N1bWVkIGJpdHJhdGUgZm9yIGJpdHJlcyBjYWxjdWxhdGlvbiAqLworI2RlZmluZSBCSVRSQVRFX01JTl9MRCAxMjAwMCAvKiBNaW4gYXNzdW1lZCBiaXRyYXRlIGZvciBiaXRyZXMgY2FsY3VsYXRpb24gKi8KIAorSU5UIEZES2FhY0VuY19DYWxjQml0c1BlckZyYW1lKGNvbnN0IElOVCBiaXRSYXRlLCBjb25zdCBJTlQgZnJhbWVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZSkgeworICBpbnQgc2hpZnQgPSAwOworICB3aGlsZSAoKGZyYW1lTGVuZ3RoICYgfigoMSA8PCAoc2hpZnQgKyAxKSkgLSAxKSkgPT0gZnJhbWVMZW5ndGggJiYKKyAgICAgICAgIChzYW1wbGluZ1JhdGUgJiB+KCgxIDw8IChzaGlmdCArIDEpKSAtIDEpKSA9PSBzYW1wbGluZ1JhdGUpIHsKKyAgICBzaGlmdCsrOworICB9CiAKLQotI2RlZmluZSBNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4gNjE0NAotCi1JTlQgRkRLYWFjRW5jX0NhbGNCaXRzUGVyRnJhbWUoCi0gICAgICAgIGNvbnN0IElOVCBiaXRSYXRlLAotICAgICAgICBjb25zdCBJTlQgZnJhbWVMZW5ndGgsCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGluZ1JhdGUKLSAgICAgICAgKQotewotICAgIGludCBzaGlmdCA9IDA7Ci0gICAgd2hpbGUgKChmcmFtZUxlbmd0aCAmIH4oKDEgPDwgKHNoaWZ0ICsgMSkpIC0gMSkpID09IGZyYW1lTGVuZ3RoCi0gICAgICAgICYmIChzYW1wbGluZ1JhdGUgJiB+KCgxIDw8IChzaGlmdCArIDEpKSAtIDEpKSA9PSBzYW1wbGluZ1JhdGUpCi0gICAgewotICAgICAgc2hpZnQrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gKGJpdFJhdGUqKGZyYW1lTGVuZ3RoPj5zaGlmdCkpIC8gKHNhbXBsaW5nUmF0ZT4+c2hpZnQpOworICByZXR1cm4gKGJpdFJhdGUgKiAoZnJhbWVMZW5ndGggPj4gc2hpZnQpKSAvIChzYW1wbGluZ1JhdGUgPj4gc2hpZnQpOwogfQogCi1JTlQgRkRLYWFjRW5jX0NhbGNCaXRyYXRlKAotICAgICAgICBjb25zdCBJTlQgYml0c1BlckZyYW1lLAotICAgICAgICBjb25zdCBJTlQgZnJhbWVMZW5ndGgsCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGluZ1JhdGUKLSAgICAgICAgKQotewotICAgIGludCBzaGlmdCA9IDA7Ci0gICAgd2hpbGUgKChmcmFtZUxlbmd0aCAmIH4oKDEgPDwgKHNoaWZ0ICsgMSkpIC0gMSkpID09IGZyYW1lTGVuZ3RoCi0gICAgICAgICYmIChzYW1wbGluZ1JhdGUgJiB+KCgxIDw8IChzaGlmdCArIDEpKSAtIDEpKSA9PSBzYW1wbGluZ1JhdGUpCi0gICAgewotICAgICAgc2hpZnQrKzsKLSAgICB9CitJTlQgRkRLYWFjRW5jX0NhbGNCaXRyYXRlKGNvbnN0IElOVCBiaXRzUGVyRnJhbWUsIGNvbnN0IElOVCBmcmFtZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZSkgeworICBpbnQgc2hpZnQgPSAwOworICB3aGlsZSAoKGZyYW1lTGVuZ3RoICYgfigoMSA8PCAoc2hpZnQgKyAxKSkgLSAxKSkgPT0gZnJhbWVMZW5ndGggJiYKKyAgICAgICAgIChzYW1wbGluZ1JhdGUgJiB+KCgxIDw8IChzaGlmdCArIDEpKSAtIDEpKSA9PSBzYW1wbGluZ1JhdGUpIHsKKyAgICBzaGlmdCsrOworICB9CiAKLSAgICByZXR1cm4gKGJpdHNQZXJGcmFtZSAqIChzYW1wbGluZ1JhdGU+PnNoaWZ0KSkgLyAoIGZyYW1lTGVuZ3RoPj5zaGlmdCkgOwotCisgIHJldHVybiAoYml0c1BlckZyYW1lICogKHNhbXBsaW5nUmF0ZSA+PiBzaGlmdCkpIC8gKGZyYW1lTGVuZ3RoID4+IHNoaWZ0KTsKIH0KIAotc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0Q2hlY2tBbmNpbGxhcnkoSU5UIGJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZnJhbWVsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYW5jaWxsYXJ5UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqYW5jaWxsYXJ5Qml0c1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsZVJhdGUpOworc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0Q2hlY2tBbmNpbGxhcnkoCisgICAgSU5UIGJpdFJhdGUsIElOVCBmcmFtZWxlbmd0aCwgSU5UIGFuY2lsbGFyeVJhdGUsIElOVCAqYW5jaWxsYXJ5Qml0c1BlckZyYW1lLAorICAgIElOVCBzYW1wbGVSYXRlKTsKIAotSU5UIEZES2FhY0VuY19MaW1pdEJpdHJhdGUoCi0gICAgICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAotICAgICAgICBJTlQgY29yZVNhbXBsaW5nUmF0ZSwKLSAgICAgICAgSU5UIGZyYW1lTGVuZ3RoLAotICAgICAgICBJTlQgbkNoYW5uZWxzLAotICAgICAgICBJTlQgbkNoYW5uZWxzRWZmLAotICAgICAgICBJTlQgYml0UmF0ZSwKLSAgICAgICAgSU5UIGF2ZXJhZ2VCaXRzLAotICAgICAgICBJTlQgKnBBdmVyYWdlQml0c1BlckZyYW1lLAotICAgICAgICBJTlQgYml0cmF0ZU1vZGUsCi0gICAgICAgIElOVCBuU3ViRnJhbWVzCi0gICAgICAgICkKLXsKLSAgSU5UIHRyYW5zcG9ydEJpdHMsIHByZXZCaXRSYXRlLCBhdmVyYWdlQml0c1BlckZyYW1lLCBzaGlmdCA9IDAsIGl0ZXI9MDsKLQotICB3aGlsZSAoIChmcmFtZUxlbmd0aCAmIH4oKDE8PChzaGlmdCsxKSktMSkpID09IGZyYW1lTGVuZ3RoCi0gICAgJiYgKGNvcmVTYW1wbGluZ1JhdGUgJiB+KCgxPDwoc2hpZnQrMSkpLTEpKSA9PSBjb3JlU2FtcGxpbmdSYXRlICkKLSAgewotICAgIHNoaWZ0ICsrOworSU5UIEZES2FhY0VuY19MaW1pdEJpdHJhdGUoSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsIEFVRElPX09CSkVDVF9UWVBFIGFvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjb3JlU2FtcGxpbmdSYXRlLCBJTlQgZnJhbWVMZW5ndGgsIElOVCBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbkNoYW5uZWxzRWZmLCBJTlQgYml0UmF0ZSwgSU5UIGF2ZXJhZ2VCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwQXZlcmFnZUJpdHNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0VOQ19CSVRSQVRFX01PREUgYml0cmF0ZU1vZGUsIElOVCBuU3ViRnJhbWVzKSB7CisgIElOVCB0cmFuc3BvcnRCaXRzLCBwcmV2Qml0UmF0ZSwgYXZlcmFnZUJpdHNQZXJGcmFtZSwgbWluQml0cmF0ZSA9IDAsIGl0ZXIgPSAwOworICBJTlQgbWluQml0c1BlckZyYW1lID0gNDAgKiBuQ2hhbm5lbHM7CisgIGlmIChpc0xvd0RlbGF5KGFvdCkpIHsKKyAgICBtaW5CaXRyYXRlID0gODAwMCAqIG5DaGFubmVsc0VmZjsKICAgfQogCiAgIGRvIHsKICAgICBwcmV2Qml0UmF0ZSA9IGJpdFJhdGU7Ci0gICAgIGF2ZXJhZ2VCaXRzUGVyRnJhbWUgPSAoYml0UmF0ZSooZnJhbWVMZW5ndGg+PnNoaWZ0KSkgLyAoY29yZVNhbXBsaW5nUmF0ZT4+c2hpZnQpIC8gblN1YkZyYW1lczsKKyAgICBhdmVyYWdlQml0c1BlckZyYW1lID0KKyAgICAgICAgRkRLYWFjRW5jX0NhbGNCaXRzUGVyRnJhbWUoYml0UmF0ZSwgZnJhbWVMZW5ndGgsIGNvcmVTYW1wbGluZ1JhdGUpIC8KKyAgICAgICAgblN1YkZyYW1lczsKIAogICAgIGlmIChwQXZlcmFnZUJpdHNQZXJGcmFtZSAhPSBOVUxMKSB7CiAgICAgICAqcEF2ZXJhZ2VCaXRzUGVyRnJhbWUgPSBhdmVyYWdlQml0c1BlckZyYW1lOwpAQCAtMTgyLDMyICsxNzMsMzQgQEAKICAgICAgIHRyYW5zcG9ydEJpdHMgPSAyMDg7CiAgICAgfQogCi0gICAgYml0UmF0ZSA9IEZES21heChiaXRSYXRlLCAoKCgoNDAgKiBuQ2hhbm5lbHMpICsgdHJhbnNwb3J0Qml0cykgKiAoY29yZVNhbXBsaW5nUmF0ZSkpIC8gZnJhbWVMZW5ndGgpICk7CisgICAgYml0UmF0ZSA9IGZNYXgoYml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICBmTWF4KG1pbkJpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfQ2FsY0JpdHJhdGUoKG1pbkJpdHNQZXJGcmFtZSArIHRyYW5zcG9ydEJpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoLCBjb3JlU2FtcGxpbmdSYXRlKSkpOwogICAgIEZES19BU1NFUlQoYml0UmF0ZSA+PSAwKTsKIAotICAgIGJpdFJhdGUgPSBGREttaW4oYml0UmF0ZSwgKChuQ2hhbm5lbHNFZmYgKiBNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4pKihjb3JlU2FtcGxpbmdSYXRlPj5zaGlmdCkpIC8gKGZyYW1lTGVuZ3RoPj5zaGlmdCkpIDsKKyAgICBiaXRSYXRlID0gZk1pbihiaXRSYXRlLCBGREthYWNFbmNfQ2FsY0JpdHJhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuQ2hhbm5lbHNFZmYgKiBNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbmd0aCwgY29yZVNhbXBsaW5nUmF0ZSkpOwogICAgIEZES19BU1NFUlQoYml0UmF0ZSA+PSAwKTsKIAotICB9IHdoaWxlIChwcmV2Qml0UmF0ZSAhPSBiaXRSYXRlICYmIGl0ZXIrKyA8IDMpIDsKKyAgfSB3aGlsZSAocHJldkJpdFJhdGUgIT0gYml0UmF0ZSAmJiBpdGVyKysgPCAzKTsKIAogICByZXR1cm4gYml0UmF0ZTsKIH0KIAotCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICBBQUNFTkNfQklUUkFURV9NT0RFIGJpdHJhdGVNb2RlOwogICBpbnQgY2hhbkJpdHJhdGVbMl07IC8qIG1vbm8vc3RlcmVvIHNldHRpbmdzICovCiB9IENPTkZJR19UQUJfRU5UUllfVkJSOwogCiBzdGF0aWMgY29uc3QgQ09ORklHX1RBQl9FTlRSWV9WQlIgY29uZmlnVGFiVkJSW10gPSB7Ci0gIHtBQUNFTkNfQlJfTU9ERV9DQlIsICAgeyAgICAgMCwgICAgIDB9fSAsCi0gIHtBQUNFTkNfQlJfTU9ERV9WQlJfMSwgeyAzMjAwMCwgMjAwMDB9fSAsCi0gIHtBQUNFTkNfQlJfTU9ERV9WQlJfMiwgeyA0MDAwMCwgMzIwMDB9fSAsCi0gIHtBQUNFTkNfQlJfTU9ERV9WQlJfMywgeyA1NjAwMCwgNDgwMDB9fSAsCi0gIHtBQUNFTkNfQlJfTU9ERV9WQlJfNCwgeyA3MjAwMCwgNjQwMDB9fSAsCi0gIHtBQUNFTkNfQlJfTU9ERV9WQlJfNSwgezExMjAwMCwgOTYwMDB9fQotfTsKKyAgICB7QUFDRU5DX0JSX01PREVfQ0JSLCB7MCwgMH19LAorICAgIHtBQUNFTkNfQlJfTU9ERV9WQlJfMSwgezMyMDAwLCAyMDAwMH19LAorICAgIHtBQUNFTkNfQlJfTU9ERV9WQlJfMiwgezQwMDAwLCAzMjAwMH19LAorICAgIHtBQUNFTkNfQlJfTU9ERV9WQlJfMywgezU2MDAwLCA0ODAwMH19LAorICAgIHtBQUNFTkNfQlJfTU9ERV9WQlJfNCwgezcyMDAwLCA2NDAwMH19LAorICAgIHtBQUNFTkNfQlJfTU9ERV9WQlJfNSwgezExMjAwMCwgOTYwMDB9fX07CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMjE4LDMwICsyMTEsMzAgQEAKICAgICAgcmV0dXJuczogICAgICB2YnIgYml0cmF0ZQogCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUlOVCBGREthYWNFbmNfR2V0VkJSQml0cmF0ZShJTlQgYml0cmF0ZU1vZGUsIENIQU5ORUxfTU9ERSBjaGFubmVsTW9kZSkKLXsKK0lOVCBGREthYWNFbmNfR2V0VkJSQml0cmF0ZShBQUNFTkNfQklUUkFURV9NT0RFIGJpdHJhdGVNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTU9ERSBjaGFubmVsTW9kZSkgewogICBJTlQgYml0cmF0ZSA9IDA7CiAgIElOVCBtb25vU3RlcmVvTW9kZSA9IDA7IC8qIGRlZmF1bHQgbW9ubyAqLwogCi0gIGlmIChGREthYWNFbmNfR2V0TW9ub1N0ZXJlb01vZGUoY2hhbm5lbE1vZGUpPT1FTF9NT0RFX1NURVJFTykgewotICAgICAgbW9ub1N0ZXJlb01vZGUgPSAxOworICBpZiAoRkRLYWFjRW5jX0dldE1vbm9TdGVyZW9Nb2RlKGNoYW5uZWxNb2RlKSA9PSBFTF9NT0RFX1NURVJFTykgeworICAgIG1vbm9TdGVyZW9Nb2RlID0gMTsKICAgfQogCi0gIHN3aXRjaCgoQUFDRU5DX0JJVFJBVEVfTU9ERSliaXRyYXRlTW9kZSl7Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzE6Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzI6Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzM6Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzQ6Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzU6Ci0gICAgYml0cmF0ZSA9IGNvbmZpZ1RhYlZCUltiaXRyYXRlTW9kZV0uY2hhbkJpdHJhdGVbbW9ub1N0ZXJlb01vZGVdOwotICAgIGJyZWFrOwotICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0lOVkFMSUQ6Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfQ0JSOgotICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1NGUjoKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9GRjoKLSAgZGVmYXVsdDoKLSAgICBiaXRyYXRlID0gMDsKLSAgICBicmVhazsKKyAgc3dpdGNoIChiaXRyYXRlTW9kZSkgeworICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzE6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMjoKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8zOgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzQ6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNToKKyAgICAgIGJpdHJhdGUgPSBjb25maWdUYWJWQlJbYml0cmF0ZU1vZGVdLmNoYW5CaXRyYXRlW21vbm9TdGVyZW9Nb2RlXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX0JSX01PREVfSU5WQUxJRDoKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0NCUjoKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1NGUjoKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0ZGOgorICAgIGRlZmF1bHQ6CisgICAgICBiaXRyYXRlID0gMDsKKyAgICAgIGJyZWFrOwogICB9CiAKICAgLyogY29udmVydCBjaGFubmVsIGJpdHJhdGUgdG8gb3ZlcmFsbCBiaXRyYXRlKi8KQEAgLTI1NywzOCArMjUwLDM5IEBACiAgKgogICogXHJldHVybiAgQ29ycmVjdGVkIGJpdHJlc2Vydm9pciBsZXZlbCB1c2VkIGluIHRyYW5zcG9ydCBsaWJyYXJ5LgogICovCi1zdGF0aWMgSU5UIEZES2FhY0VuY19FbmNCaXRyZXNUb1RwQml0cmVzKAotICAgICAgICBjb25zdCBIQU5ETEVfQUFDX0VOQyAgICAgIGhBYWNFbmMKLSAgICAgICAgKQotewotICBJTlQgdHJhbnNwb3JCaXRyZXNlcnZvaXIgPSAwOworc3RhdGljIElOVCBGREthYWNFbmNfRW5jQml0cmVzVG9UcEJpdHJlcyhjb25zdCBIQU5ETEVfQUFDX0VOQyBoQWFjRW5jKSB7CisgIElOVCB0cmFuc3BvcnRCaXRyZXNlcnZvaXIgPSAwOwogCiAgIHN3aXRjaCAoaEFhY0VuYy0+Yml0cmF0ZU1vZGUpIHsKICAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0NCUjoKLSAgICAgIHRyYW5zcG9yQml0cmVzZXJ2b2lyID0gaEFhY0VuYy0+cWNLZXJuZWwtPmJpdFJlc1RvdDsgLyogZW5jb2RlciBiaXRyZXNlcnZvaXIgbGV2ZWwgKi8KKyAgICAgIHRyYW5zcG9ydEJpdHJlc2Vydm9pciA9CisgICAgICAgICAgaEFhY0VuYy0+cWNLZXJuZWwtPmJpdFJlc1RvdDsgLyogZW5jb2RlciBiaXRyZXNlcnZvaXIgbGV2ZWwgKi8KICAgICAgIGJyZWFrOwogICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzE6CiAgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMjoKICAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8zOgogICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzQ6CiAgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNToKLSAgICAgIHRyYW5zcG9yQml0cmVzZXJ2b2lyID0gRkRLX0lOVF9NQVg7IC8qIHNpZ25hbCB2YXJpYWJsZSBiaXRyYXRlICovCisgICAgICB0cmFuc3BvcnRCaXRyZXNlcnZvaXIgPSBGREtfSU5UX01BWDsgLyogc2lnbmFsIHZhcmlhYmxlIGJpdHJhdGUgKi8KICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFDRU5DX0JSX01PREVfRkY6CiAgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9TRlI6Ci0gICAgICB0cmFuc3BvckJpdHJlc2Vydm9pciA9IDA7ICAgICAgICAgICAvKiBzdXBlciBmcmFtaW5nIGFuZCBmaXhlZCBmcmFtaW5nICovCi0gICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aXRob3V0IGJpdHJlc2Vydm9pciBzaWduYWxpbmcgKi8KKyAgICAgIHRyYW5zcG9ydEJpdHJlc2Vydm9pciA9IDA7IC8qIHN1cGVyIGZyYW1pbmcgYW5kIGZpeGVkIGZyYW1pbmcgKi8KKyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgIC8qIHdpdGhvdXQgYml0cmVzZXJ2b2lyIHNpZ25hbGluZyAqLwogICAgIGRlZmF1bHQ6CiAgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9JTlZBTElEOgotICAgICAgdHJhbnNwb3JCaXRyZXNlcnZvaXIgPSAwOyAgICAgICAgICAgLyogaW52YWxpZCBjb25maWd1cmF0aW9uKi8KLSAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICB0cmFuc3BvcnRCaXRyZXNlcnZvaXIgPSAwOyAvKiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24qLwogICB9CiAKLSAgaWYgKGhBYWNFbmMtPmNvbmZpZy0+YXVkaW9NdXhWZXJzaW9uPT0yKSB7Ci0gICAgdHJhbnNwb3JCaXRyZXNlcnZvaXIgPSBNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4gKiBoQWFjRW5jLT5jaGFubmVsTWFwcGluZy5uQ2hhbm5lbHNFZmY7CisgIGlmIChoQWFjRW5jLT5jb25maWctPmF1ZGlvTXV4VmVyc2lvbiA9PSAyKSB7CisgICAgdHJhbnNwb3J0Qml0cmVzZXJ2b2lyID0KKyAgICAgICAgTUlOX0JVRlNJWkVfUEVSX0VGRl9DSEFOICogaEFhY0VuYy0+Y2hhbm5lbE1hcHBpbmcubkNoYW5uZWxzRWZmOwogICB9CiAKLSAgcmV0dXJuIHRyYW5zcG9yQml0cmVzZXJ2b2lyOworICByZXR1cm4gdHJhbnNwb3J0Qml0cmVzZXJ2b2lyOworfQorCitJTlQgRkRLYWFjRW5jX0dldEJpdFJlc2Vydm9pclN0YXRlKGNvbnN0IEhBTkRMRV9BQUNfRU5DIGhBYWNFbmNvZGVyKSB7CisgIHJldHVybiBGREthYWNFbmNfRW5jQml0cmVzVG9UcEJpdHJlcyhoQWFjRW5jb2Rlcik7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI5OCw0MCArMjkyLDM5IEBACiAgICAgIHJldHVybnM6ICAgICAgLS0tCiAKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBGREthYWNFbmNfQWFjSW5pdERlZmF1bHRDb25maWcoQUFDRU5DX0NPTkZJRyAqY29uZmlnKQotewotICAgIC8qIG1ha2UgdGhlcHJlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBzdHJ1Y3RzIGZsZXhpYmxlICovCi0gICAgRkRLbWVtY2xlYXIoY29uZmlnLCBzaXplb2YoQUFDRU5DX0NPTkZJRykpOwordm9pZCBGREthYWNFbmNfQWFjSW5pdERlZmF1bHRDb25maWcoQUFDRU5DX0NPTkZJRyAqY29uZmlnKSB7CisgIC8qIG1ha2UgdGhlIHByZWluaXRpYWxpemF0aW9uIG9mIHRoZSBzdHJ1Y3RzIGZsZXhpYmxlICovCisgIEZES21lbWNsZWFyKGNvbmZpZywgc2l6ZW9mKEFBQ0VOQ19DT05GSUcpKTsKIAotICAgIC8qIGRlZmF1bHQgYW5jaWxsYXJ5ICovCi0gICAgY29uZmlnLT5hbmNfUmF0ZSA9IDA7ICAgICAgICAgLyogbm8gYW5jaWxsYXJ5IGRhdGEgKi8KLSAgICBjb25maWctPmFuY0RhdGFCaXRSYXRlID0gMDsgICAvKiBubyBhZGRpdGlvbmFsIGNvbnN1bWVkIGJpdHJhdGUgKi8KKyAgLyogZGVmYXVsdCBhbmNpbGxhcnkgKi8KKyAgY29uZmlnLT5hbmNfUmF0ZSA9IDA7ICAgICAgIC8qIG5vIGFuY2lsbGFyeSBkYXRhICovCisgIGNvbmZpZy0+YW5jRGF0YUJpdFJhdGUgPSAwOyAvKiBubyBhZGRpdGlvbmFsIGNvbnN1bWVkIGJpdHJhdGUgKi8KIAotICAgIC8qIGRlZmF1bHQgY29uZmlndXJhdGlvbnMgKi8KLSAgICBjb25maWctPmJpdFJhdGUgICAgICAgICA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBiaXRyYXRlIG11c3QgYmUgc2V0Ki8KLSAgICBjb25maWctPmF2ZXJhZ2VCaXRzICAgICA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBpbnN0ZWFkIG9mIGJpdHJhdGUvcyB3ZSBjYW4gY29uZmlndXJlIGJpdHMvc3VwZXJmcmFtZSAqLwotICAgIGNvbmZpZy0+Yml0cmF0ZU1vZGUgICAgID0gMDsKLSAgICBjb25maWctPmJhbmRXaWR0aCAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBnZXQgYmFuZHdpZHRoIGZyb20gdGFibGUgKi8KLSAgICBjb25maWctPnVzZVRucyAgICAgICAgICA9IFROU19FTkFCTEVfTUFTSzsgICAgICAvKiB0bnMgZW5hYmxlZCBjb21wbGV0bHkgKi8KLSAgICBjb25maWctPnVzZVBucyAgICAgICAgICA9IDE7ICAgICAgICAgICAgICAgICAgICAvKiBkZXBlbmRpbmcgb24gY2hhbm5lbEJpdHJhdGUgdGhpcyBtaWdodCBiZSBzZXQgdG8gMCBsYXRlciAqLwotICAgIGNvbmZpZy0+dXNlSVMgICAgICAgICAgID0gMTsgICAgICAgICAgICAgICAgICAgIC8qIEludGVuc2l0eSBTdGVyZW8gQ29uZmlndXJhdGlvbiAqLwotICAgIGNvbmZpZy0+ZnJhbWVsZW5ndGggICAgID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIEZyYW1lc2l6ZSBub3QgY29uZmlndXJlZCAqLwotICAgIGNvbmZpZy0+c3ludGF4RmxhZ3MgICAgID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgc3ludGF4IHdpdGggbm8gc3BlY2lhbGl0aWVzICovCi0gICAgY29uZmlnLT5lcENvbmZpZyAgICAgICAgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogbm8gRVIgc3ludGF4IC0+IG5vIGFkZGl0aW9uYWwgZXJyb3IgcHJvdGVjdGlvbiAqLwotICAgIGNvbmZpZy0+blN1YkZyYW1lcyAgICAgID0gMTsgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQsIG5vIHN1YiBmcmFtZXMgKi8KLSAgICBjb25maWctPmNoYW5uZWxPcmRlciAgICA9IENIX09SREVSX01QRUc7ICAgICAgICAvKiBVc2UgTVBFRyBjaGFubmVsIG9yZGVyaW5nLiAqLwotICAgIGNvbmZpZy0+Y2hhbm5lbE1vZGUgICAgID0gTU9ERV9VTktOT1dOOwotICAgIGNvbmZpZy0+bWluQml0c1BlckZyYW1lID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIG1pbnVtIG51bWJlciBvZiBiaXRzIGluIGVhY2ggQVUgKi8KLSAgICBjb25maWctPm1heEJpdHNQZXJGcmFtZSA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBtaW51bSBudW1iZXIgb2YgYml0cyBpbiBlYWNoIEFVICovCi0gICAgY29uZmlnLT5iaXRyZXNlcnZvaXIgICAgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCwgdW5pbml0aWFsaXplZCB2YWx1ZSAqLwotICAgIGNvbmZpZy0+YXVkaW9NdXhWZXJzaW9uID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIGF1ZGlvIG11eCB2ZXJzaW9uIG5vdCBjb25maWd1cmVkICovCi0KLSAgICAvKiBpbml0IHRhYnMgaW4gZml4cG9pbnRfbWF0aCAqLwotICAgIEluaXRMZEludCgpOwotICAgIEluaXRJbnZTcXJ0VGFiKCk7CisgIC8qIGRlZmF1bHQgY29uZmlndXJhdGlvbnMgKi8KKyAgY29uZmlnLT5iaXRSYXRlID0gLTE7IC8qIGJpdHJhdGUgbXVzdCBiZSBzZXQqLworICBjb25maWctPmF2ZXJhZ2VCaXRzID0KKyAgICAgIC0xOyAvKiBpbnN0ZWFkIG9mIGJpdHJhdGUvcyB3ZSBjYW4gY29uZmlndXJlIGJpdHMvc3VwZXJmcmFtZSAqLworICBjb25maWctPmJpdHJhdGVNb2RlID0KKyAgICAgIEFBQ0VOQ19CUl9NT0RFX0NCUjsgICAgICAgICAgIC8qIHNldCBiaXRyYXRlIG1vZGUgdG8gY29uc3RhbnQgYml0cmF0ZSAqLworICBjb25maWctPmJhbmRXaWR0aCA9IDA7ICAgICAgICAgICAgLyogZ2V0IGJhbmR3aWR0aCBmcm9tIHRhYmxlICovCisgIGNvbmZpZy0+dXNlVG5zID0gVE5TX0VOQUJMRV9NQVNLOyAvKiB0bnMgZW5hYmxlZCBjb21wbGV0bHkgKi8KKyAgY29uZmlnLT51c2VQbnMgPQorICAgICAgMTsgLyogZGVwZW5kaW5nIG9uIGNoYW5uZWxCaXRyYXRlIHRoaXMgbWlnaHQgYmUgc2V0IHRvIDAgbGF0ZXIgKi8KKyAgY29uZmlnLT51c2VJUyA9IDE7ICAgICAgICAvKiBJbnRlbnNpdHkgU3RlcmVvIENvbmZpZ3VyYXRpb24gKi8KKyAgY29uZmlnLT51c2VNUyA9IDE7ICAgICAgICAvKiBNUyBTdGVyZW8gdG9vbCAqLworICBjb25maWctPmZyYW1lbGVuZ3RoID0gLTE7IC8qIEZyYW1lc2l6ZSBub3QgY29uZmlndXJlZCAqLworICBjb25maWctPnN5bnRheEZsYWdzID0gMDsgIC8qIGRlZmF1bHQgc3ludGF4IHdpdGggbm8gc3BlY2lhbGl0aWVzICovCisgIGNvbmZpZy0+ZXBDb25maWcgPSAtMTsgICAgLyogbm8gRVIgc3ludGF4IC0+IG5vIGFkZGl0aW9uYWwgZXJyb3IgcHJvdGVjdGlvbiAqLworICBjb25maWctPm5TdWJGcmFtZXMgPSAxOyAgIC8qIGRlZmF1bHQsIG5vIHN1YiBmcmFtZXMgKi8KKyAgY29uZmlnLT5jaGFubmVsT3JkZXIgPSBDSF9PUkRFUl9NUEVHOyAvKiBVc2UgTVBFRyBjaGFubmVsIG9yZGVyaW5nLiAqLworICBjb25maWctPmNoYW5uZWxNb2RlID0gTU9ERV9VTktOT1dOOworICBjb25maWctPm1pbkJpdHNQZXJGcmFtZSA9IC0xOyAvKiBtaW51bSBudW1iZXIgb2YgYml0cyBpbiBlYWNoIEFVICovCisgIGNvbmZpZy0+bWF4Qml0c1BlckZyYW1lID0gLTE7IC8qIG1pbnVtIG51bWJlciBvZiBiaXRzIGluIGVhY2ggQVUgKi8KKyAgY29uZmlnLT5hdWRpb011eFZlcnNpb24gPSAtMTsgLyogYXVkaW8gbXV4IHZlcnNpb24gbm90IGNvbmZpZ3VyZWQgKi8KKyAgY29uZmlnLT5kb3duc2NhbGVGYWN0b3IgPQorICAgICAgMTsgLyogZG93bnNjYWxlIGZhY3RvciBmb3IgRUxEIHJlZHVjZWQgZGVsYXkgbW9kZSwgMSBpcyBub3JtYWwgRUxEICovCiB9CiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX09wZW4KQEAgLTMzOSwxNiArMzMyLDEzIEBACiAgICAgcmV0dXJuczogICAgICBlcnJvciBjb2RlCiAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19PcGVuKEhBTkRMRV9BQUNfRU5DICAqcGhBYWNFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIG5FbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBuU3ViRnJhbWVzKQoteworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX09wZW4oSEFORExFX0FBQ19FTkMgKnBoQWFjRW5jLCBjb25zdCBJTlQgbkVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscywgY29uc3QgSU5UIG5TdWJGcmFtZXMpIHsKICAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7Ci0gIEFBQ19FTkMgICAgICAgICAgICpoQWFjRW5jID0gTlVMTDsKLSAgVUNIQVIgICAgICAgICAgICAgKmR5bmFtaWNSQU0gPSBOVUxMOworICBBQUNfRU5DICpoQWFjRW5jID0gTlVMTDsKKyAgVUNIQVIgKmR5bmFtaWNSQU0gPSBOVUxMOwogCi0gIGlmIChwaEFhY0VuYz09TlVMTCkgeworICBpZiAocGhBYWNFbmMgPT0gTlVMTCkgewogICAgIHJldHVybiBBQUNfRU5DX0lOVkFMSURfSEFORExFOwogICB9CiAKQEAgLTM2MCw4MiArMzUwLDY1IEBACiAgIH0KICAgRkRLbWVtY2xlYXIoaEFhY0VuYywgc2l6ZW9mKEFBQ19FTkMpKTsKIAotICBoQWFjRW5jLT5keW5hbWljX1JBTSA9IEdldEFBQ2R5bmFtaWNfUkFNKCk7Ci0gIGR5bmFtaWNSQU0gPSAoVUNIQVIqKWhBYWNFbmMtPmR5bmFtaWNfUkFNOworICBpZiAoTlVMTCA9PSAoaEFhY0VuYy0+ZHluYW1pY19SQU0gPSBHZXRBQUNkeW5hbWljX1JBTSgpKSkgeworICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CisgICAgZ290byBiYWlsOworICB9CisgIGR5bmFtaWNSQU0gPSAoVUNIQVIgKiloQWFjRW5jLT5keW5hbWljX1JBTTsKIAogICAvKiBhbGxvY2F0ZSB0aGUgUHN5IGF1ZCBQc3kgT3V0IHN0cnVjdHVyZSAqLwotICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfUHN5TmV3KCZoQWFjRW5jLT5wc3lLZXJuZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGR5bmFtaWNSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKLSAgICAgZ290byBiYWlsOworICBFcnJvclN0YXR1cyA9CisgICAgICBGREthYWNFbmNfUHN5TmV3KCZoQWFjRW5jLT5wc3lLZXJuZWwsIG5FbGVtZW50cywgbkNoYW5uZWxzLCBkeW5hbWljUkFNKTsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIGdvdG8gYmFpbDsKIAotICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfUHN5T3V0TmV3KGhBYWNFbmMtPnBzeU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TdWJGcmFtZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxkeW5hbWljUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCi0gICAgIGdvdG8gYmFpbDsKKyAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfUHN5T3V0TmV3KGhBYWNFbmMtPnBzeU91dCwgbkVsZW1lbnRzLCBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuU3ViRnJhbWVzLCBkeW5hbWljUkFNKTsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIGdvdG8gYmFpbDsKIAogICAvKiBhbGxvY2F0ZSB0aGUgUSZDIE91dCBzdHJ1Y3R1cmUgKi8KLSAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfUUNPdXROZXcoaEFhY0VuYy0+cWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5FbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuU3ViRnJhbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGR5bmFtaWNSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCi0gICAgZ290byBiYWlsOworICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19RQ091dE5ldyhoQWFjRW5jLT5xY091dCwgbkVsZW1lbnRzLCBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TdWJGcmFtZXMsIGR5bmFtaWNSQU0pOworICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgZ290byBiYWlsOwogCiAgIC8qIGFsbG9jYXRlIHRoZSBRJkMga2VybmVsICovCi0gIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1FDTmV3KCZoQWFjRW5jLT5xY0tlcm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5FbGVtZW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsZHluYW1pY1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKLSAgICBnb3RvIGJhaWw7CisgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1FDTmV3KCZoQWFjRW5jLT5xY0tlcm5lbCwgbkVsZW1lbnRzLCBkeW5hbWljUkFNKTsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIGdvdG8gYmFpbDsKIAogICBoQWFjRW5jLT5tYXhDaGFubmVscyA9IG5DaGFubmVsczsKICAgaEFhY0VuYy0+bWF4RWxlbWVudHMgPSBuRWxlbWVudHM7Ci0gIGhBYWNFbmMtPm1heEZyYW1lcyAgID0gblN1YkZyYW1lczsKKyAgaEFhY0VuYy0+bWF4RnJhbWVzID0gblN1YkZyYW1lczsKIAogYmFpbDoKICAgKnBoQWFjRW5jID0gaEFhY0VuYzsKICAgcmV0dXJuIEVycm9yU3RhdHVzOwogfQogCi0KLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0aWFsaXplKEhBTkRMRV9BQUNfRU5DICAgICAgaEFhY0VuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0VOQ19DT05GSUcgICAgICAqY29uZmlnLCAgICAgLyogcHJlLWluaXRpYWxpemVkIGNvbmZpZyBzdHJ1Y3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgICAgICAgICAgICAgICBpbml0RmxhZ3MpCi17CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdGlhbGl6ZSgKKyAgICBIQU5ETEVfQUFDX0VOQyBoQWFjRW5jLAorICAgIEFBQ0VOQ19DT05GSUcgKmNvbmZpZywgLyogcHJlLWluaXRpYWxpemVkIGNvbmZpZyBzdHJ1Y3QgKi8KKyAgICBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywgVUxPTkcgaW5pdEZsYWdzKSB7CiAgIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzOwotICBJTlQgcHN5Qml0cmF0ZSwgdG5zTWFzazsgLy9JTlQgcHJvZmlsZSA9IDE7Ci0gIENIQU5ORUxfTUFQUElORyAgICpjbSA9IE5VTEw7CisgIElOVCBwc3lCaXRyYXRlLCB0bnNNYXNrOyAgLy8gSU5UIHByb2ZpbGUgPSAxOworICBDSEFOTkVMX01BUFBJTkcgKmNtID0gTlVMTDsKIAotICBJTlQgcW1iZmFjLCBxYnc7CisgIElOVCBtYmZhY19lLCBxYnc7CiAgIEZJWFBfREJMIG1iZmFjLCBid19yYXRpbzsKICAgUUNfSU5JVCBxY0luaXQ7CiAgIElOVCBhdmVyYWdlQml0c1BlckZyYW1lID0gMDsKKyAgaW50IGJpdHJlc01pbiA9IDA7IC8qIHRoZSBiaXRyZXNlcnZvaXIgaXMgYWx3YXlzIGJpZyBmb3IgQUFDLUxDICovCisgIGNvbnN0IENIQU5ORUxfTU9ERSBwcmV2Q2hhbm5lbE1vZGUgPSBoQWFjRW5jLT5lbmNvZGVyTW9kZTsKIAotICBpZiAoY29uZmlnPT1OVUxMKQotICAgIHJldHVybiBBQUNfRU5DX0lOVkFMSURfSEFORExFOworICBpZiAoY29uZmlnID09IE5VTEwpIHJldHVybiBBQUNfRU5DX0lOVkFMSURfSEFORExFOwogCiAgIC8qKioqKioqKioqKioqKioqKioqIHNhbml0eSBjaGVja3MgKioqKioqKioqKioqKioqKioqKi8KIAogICAvKiBjaGVjayBjb25maWcgc3RydWN0dXJlICovCi0gIGlmIChjb25maWctPm5DaGFubmVscyAgPCAxIHx8IGNvbmZpZy0+bkNoYW5uZWxzID4gKDgpKSB7CisgIGlmIChjb25maWctPm5DaGFubmVscyA8IDEgfHwgY29uZmlnLT5uQ2hhbm5lbHMgPiAoOCkpIHsKICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOwogICB9CiAKICAgLyogY2hlY2sgc2FtcGxlIHJhdGUgKi8KLSAgc3dpdGNoIChjb25maWctPnNhbXBsZVJhdGUpCi0gIHsKKyAgc3dpdGNoIChjb25maWctPnNhbXBsZVJhdGUpIHsKICAgICBjYXNlIDgwMDA6CiAgICAgY2FzZSAxMTAyNToKICAgICBjYXNlIDEyMDAwOgpAQCAtNDU0LDUyICs0MjcsNDQgQEAKICAgfQogCiAgIC8qIGJpdHJhdGUgaGFzIHRvIGJlIHNldCAqLwotICBpZiAoY29uZmlnLT5iaXRSYXRlPT0tMSkgewotICAgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQklUUkFURTsKKyAgaWYgKGNvbmZpZy0+Yml0UmF0ZSA9PSAtMSkgeworICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0JJVFJBVEU7CiAgIH0KIAogICAvKiBjaGVjayBiaXQgcmF0ZSAqLwogCiAgIGlmIChGREthYWNFbmNfTGltaXRCaXRyYXRlKAotICAgICAgICAgIGhUcEVuYywKLSAgICAgICAgICBjb25maWctPnNhbXBsZVJhdGUsCi0gICAgICAgICAgY29uZmlnLT5mcmFtZWxlbmd0aCwKLSAgICAgICAgICBjb25maWctPm5DaGFubmVscywKLSAgICAgICAgICBGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKGNvbmZpZy0+Y2hhbm5lbE1vZGUpLT5uQ2hhbm5lbHNFZmYsCi0gICAgICAgICAgY29uZmlnLT5iaXRSYXRlLAotICAgICAgICAgIGNvbmZpZy0+YXZlcmFnZUJpdHMsCi0gICAgICAgICAmYXZlcmFnZUJpdHNQZXJGcmFtZSwKLSAgICAgICAgICBjb25maWctPmJpdHJhdGVNb2RlLAotICAgICAgICAgIGNvbmZpZy0+blN1YkZyYW1lcwotICAgICAgICAgICkgIT0gY29uZmlnLT5iaXRSYXRlCi0gICAgICAmJiAhKChjb25maWctPmJpdHJhdGVNb2RlPj0xKSAmJiAoY29uZmlnLT5iaXRyYXRlTW9kZTw9NSkpCi0gICAgICkKLSAgeworICAgICAgICAgIGhUcEVuYywgY29uZmlnLT5hdWRpb09iamVjdFR5cGUsIGNvbmZpZy0+c2FtcGxlUmF0ZSwKKyAgICAgICAgICBjb25maWctPmZyYW1lbGVuZ3RoLCBjb25maWctPm5DaGFubmVscywKKyAgICAgICAgICBGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKGNvbmZpZy0+Y2hhbm5lbE1vZGUpCisgICAgICAgICAgICAgIC0+bkNoYW5uZWxzRWZmLAorICAgICAgICAgIGNvbmZpZy0+Yml0UmF0ZSwgY29uZmlnLT5hdmVyYWdlQml0cywgJmF2ZXJhZ2VCaXRzUGVyRnJhbWUsCisgICAgICAgICAgY29uZmlnLT5iaXRyYXRlTW9kZSwgY29uZmlnLT5uU3ViRnJhbWVzKSAhPSBjb25maWctPmJpdFJhdGUgJiYKKyAgICAgICEoQUFDRU5DX0JSX01PREVfSVNfVkJSKGNvbmZpZy0+Yml0cmF0ZU1vZGUpKSkgewogICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0JJVFJBVEU7CiAgIH0KIAogICBpZiAoY29uZmlnLT5zeW50YXhGbGFncyAmIEFDX0VSX1ZDQjExKSB7Ci0gICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9FUl9GT1JNQVQ7CisgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfRVJfRk9STUFUOwogICB9CiAgIGlmIChjb25maWctPnN5bnRheEZsYWdzICYgQUNfRVJfSENSKSB7Ci0gICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9FUl9GT1JNQVQ7CisgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfRVJfRk9STUFUOwogICB9CiAKICAgLyogY2hlY2sgZnJhbWUgbGVuZ3RoICovCi0gIHN3aXRjaCAoY29uZmlnLT5mcmFtZWxlbmd0aCkKLSAgeworICBzd2l0Y2ggKGNvbmZpZy0+ZnJhbWVsZW5ndGgpIHsKICAgICBjYXNlIDEwMjQ6Ci0gICAgICBpZiAoIGNvbmZpZy0+YXVkaW9PYmplY3RUeXBlID09IEFPVF9FUl9BQUNfTEQKLSAgICAgICAgfHwgY29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19FTEQgKQotICAgICAgeworICAgICAgaWYgKGlzTG93RGVsYXkoY29uZmlnLT5hdWRpb09iamVjdFR5cGUpKSB7CiAgICAgICAgIHJldHVybiBBQUNfRU5DX0lOVkFMSURfRlJBTUVfTEVOR1RIOwogICAgICAgfQogICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjg6CisgICAgY2FzZSAyNTY6CiAgICAgY2FzZSA1MTI6CisgICAgY2FzZSAxMjA6CisgICAgY2FzZSAyNDA6CiAgICAgY2FzZSA0ODA6Ci0gICAgICBpZiAoIGNvbmZpZy0+YXVkaW9PYmplY3RUeXBlICE9IEFPVF9FUl9BQUNfTEQKLSAgICAgICAgJiYgY29uZmlnLT5hdWRpb09iamVjdFR5cGUgIT0gQU9UX0VSX0FBQ19FTEQgKQotICAgICAgeworICAgICAgaWYgKCFpc0xvd0RlbGF5KGNvbmZpZy0+YXVkaW9PYmplY3RUeXBlKSkgewogICAgICAgICByZXR1cm4gQUFDX0VOQ19JTlZBTElEX0ZSQU1FX0xFTkdUSDsKICAgICAgIH0KICAgICAgIGJyZWFrOwpAQCAtNTA4LDE4OSArNDczLDI0MSBAQAogICB9CiAKICAgaWYgKGNvbmZpZy0+YW5jX1JhdGUgIT0gMCkgeworICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0luaXRDaGVja0FuY2lsbGFyeSgKKyAgICAgICAgY29uZmlnLT5iaXRSYXRlLCBjb25maWctPmZyYW1lbGVuZ3RoLCBjb25maWctPmFuY19SYXRlLAorICAgICAgICAmaEFhY0VuYy0+YW5jaWxsYXJ5Qml0c1BlckZyYW1lLCBjb25maWctPnNhbXBsZVJhdGUpOworICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKSBnb3RvIGJhaWw7CiAKLSAgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfSW5pdENoZWNrQW5jaWxsYXJ5KGNvbmZpZy0+Yml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+ZnJhbWVsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmFuY19SYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEFhY0VuYy0+YW5jaWxsYXJ5Qml0c1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVSYXRlKTsKLSAgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCi0gICAgICAgZ290byBiYWlsOwotCi0KLSAgICAgLyogdXBkYXRlIGVzdGltYXRlZCBjb25zdW1lZCBiaXRyYXRlICovCi0gICAgIGNvbmZpZy0+YW5jRGF0YUJpdFJhdGUgKz0gKCAoaEFhY0VuYy0+YW5jaWxsYXJ5Qml0c1BlckZyYW1lICogY29uZmlnLT5zYW1wbGVSYXRlKSAvIGNvbmZpZy0+ZnJhbWVsZW5ndGggKTsKLQorICAgIC8qIHVwZGF0ZSBlc3RpbWF0ZWQgY29uc3VtZWQgYml0cmF0ZSAqLworICAgIGNvbmZpZy0+YW5jRGF0YUJpdFJhdGUgKz0KKyAgICAgICAgRkRLYWFjRW5jX0NhbGNCaXRyYXRlKGhBYWNFbmMtPmFuY2lsbGFyeUJpdHNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+ZnJhbWVsZW5ndGgsIGNvbmZpZy0+c2FtcGxlUmF0ZSk7CiAgIH0KIAogICAvKiBtYXhpbWFsIGFsbG93ZWQgRFNFIGJ5dGVzIGluIGZyYW1lICovCi0gIHsKLSAgLyogZml4cG9pbnQgY2FsY3VsYXRpb24qLwotICBJTlQgcV9yZXMsIGVuY0JpdHJhdGUsIHNjOwotICBGSVhQX0RCTCB0bXAgPSBmRGl2Tm9ybShjb25maWctPmZyYW1lbGVuZ3RoLCBjb25maWctPnNhbXBsZVJhdGUsICZxX3Jlcyk7Ci0gIGVuY0JpdHJhdGUgPSAoY29uZmlnLT5iaXRSYXRlLyotY29uZmlnLT5hbmNEYXRhQml0UmF0ZSovKS0gKElOVCkoY29uZmlnLT5uQ2hhbm5lbHMqODAwMCk7Ci0gIHNjID0gQ291bnRMZWFkaW5nQml0cyhlbmNCaXRyYXRlKTsKLSAgY29uZmlnLT5tYXhBbmNCeXRlc1BlckFVID0gRkRLbWluKCAoMjU2KSwgRkRLbWF4KDAsKElOVCkoZk11bHREaXYyKHRtcCwgKEZJWFBfREJMKShlbmNCaXRyYXRlPDxzYykpPj4oLXFfcmVzK3NjLTErMykpKSApOwotICB9CisgIGNvbmZpZy0+bWF4QW5jQnl0ZXNQZXJBVSA9CisgICAgICBmTWluKCgyNTYpLCBmTWF4KDAsIEZES2FhY0VuY19DYWxjQml0c1BlckZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+Yml0UmF0ZSAtIChjb25maWctPm5DaGFubmVscyAqIDgwMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+ZnJhbWVsZW5ndGgsIGNvbmZpZy0+c2FtcGxlUmF0ZSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpKTsKIAogICAvKiBiaW5kIGNvbmZpZyB0byBoQWFjRW5jLT5jb25maWcgKi8KICAgaEFhY0VuYy0+Y29uZmlnID0gY29uZmlnOwogCiAgIC8qIHNldCBoQWFjRW5jLT5iaXRyYXRlTW9kZSAqLwotICBoQWFjRW5jLT5iaXRyYXRlTW9kZSA9IChBQUNFTkNfQklUUkFURV9NT0RFKWNvbmZpZy0+Yml0cmF0ZU1vZGU7CisgIGhBYWNFbmMtPmJpdHJhdGVNb2RlID0gY29uZmlnLT5iaXRyYXRlTW9kZTsKIAogICBoQWFjRW5jLT5lbmNvZGVyTW9kZSA9IGNvbmZpZy0+Y2hhbm5lbE1vZGU7CiAKLSAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfSW5pdENoYW5uZWxNYXBwaW5nKGhBYWNFbmMtPmVuY29kZXJNb2RlLCBjb25maWctPmNoYW5uZWxPcmRlciwgJmhBYWNFbmMtPmNoYW5uZWxNYXBwaW5nKTsKLSAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCi0gICAgZ290byBiYWlsOworICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Jbml0Q2hhbm5lbE1hcHBpbmcoCisgICAgICBoQWFjRW5jLT5lbmNvZGVyTW9kZSwgY29uZmlnLT5jaGFubmVsT3JkZXIsICZoQWFjRW5jLT5jaGFubmVsTWFwcGluZyk7CisgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKSBnb3RvIGJhaWw7CiAKICAgY20gPSAmaEFhY0VuYy0+Y2hhbm5lbE1hcHBpbmc7CiAKLSAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfRGV0ZXJtaW5lQmFuZFdpZHRoKCZoQWFjRW5jLT5jb25maWctPmJhbmRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+YmFuZFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5iaXRSYXRlIC0gY29uZmlnLT5hbmNEYXRhQml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmJpdHJhdGVNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5mcmFtZWxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+ZW5jb2Rlck1vZGUpOwotICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKLSAgICBnb3RvIGJhaWw7CisgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0RldGVybWluZUJhbmRXaWR0aCgKKyAgICAgIGNvbmZpZy0+YmFuZFdpZHRoLCBjb25maWctPmJpdFJhdGUgLSBjb25maWctPmFuY0RhdGFCaXRSYXRlLAorICAgICAgaEFhY0VuYy0+Yml0cmF0ZU1vZGUsIGNvbmZpZy0+c2FtcGxlUmF0ZSwgY29uZmlnLT5mcmFtZWxlbmd0aCwgY20sCisgICAgICBoQWFjRW5jLT5lbmNvZGVyTW9kZSwgJmhBYWNFbmMtPmNvbmZpZy0+YmFuZFdpZHRoKTsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIGdvdG8gYmFpbDsKIAogICBoQWFjRW5jLT5iYW5kd2lkdGg5MGRCID0gKElOVCloQWFjRW5jLT5jb25maWctPmJhbmRXaWR0aDsKIAogICB0bnNNYXNrID0gY29uZmlnLT51c2VUbnMgPyBUTlNfRU5BQkxFX01BU0sgOiAweDA7CiAgIHBzeUJpdHJhdGUgPSBjb25maWctPmJpdFJhdGUgLSBjb25maWctPmFuY0RhdGFCaXRSYXRlOwogCi0gIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX3BzeUluaXQoaEFhY0VuYy0+cHN5S2VybmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnBzeU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5tYXhGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+bWF4Q2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5hdWRpb09iamVjdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20pOwotICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKLSAgICBnb3RvIGJhaWw7CisgIGlmICgoaEFhY0VuYy0+ZW5jb2Rlck1vZGUgIT0gcHJldkNoYW5uZWxNb2RlKSB8fCAoaW5pdEZsYWdzICE9IDApKSB7CisgICAgLyogUmVpbml0aWFsaXplIHBzeWNoIHN0YXRlcyBpbiBjYXNlIG9mIGNoYW5uZWwgY29uZmlndXJhdGlvbiBjaGFuZ2Ugb3JlIGlmCisgICAgICogZnVsbCByZXNldCByZXF1ZXN0ZWQuICovCisgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfcHN5SW5pdChoQWFjRW5jLT5wc3lLZXJuZWwsIGhBYWNFbmMtPnBzeU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPm1heEZyYW1lcywgaEFhY0VuYy0+bWF4Q2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmF1ZGlvT2JqZWN0VHlwZSwgY20pOworICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKSBnb3RvIGJhaWw7CisgIH0KIAotICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19wc3lNYWluSW5pdChoQWFjRW5jLT5wc3lLZXJuZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+YXVkaW9PYmplY3RUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmZyYW1lbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lCaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5iYW5kd2lkdGg5MGRCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnVzZVBucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT51c2VJUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEZsYWdzKTsKLSAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCi0gICAgZ290byBiYWlsOworICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19wc3lNYWluSW5pdCgKKyAgICAgIGhBYWNFbmMtPnBzeUtlcm5lbCwgY29uZmlnLT5hdWRpb09iamVjdFR5cGUsIGNtLCBjb25maWctPnNhbXBsZVJhdGUsCisgICAgICBjb25maWctPmZyYW1lbGVuZ3RoLCBwc3lCaXRyYXRlLCB0bnNNYXNrLCBoQWFjRW5jLT5iYW5kd2lkdGg5MGRCLAorICAgICAgY29uZmlnLT51c2VQbnMsIGNvbmZpZy0+dXNlSVMsIGNvbmZpZy0+dXNlTVMsIGNvbmZpZy0+c3ludGF4RmxhZ3MsCisgICAgICBpbml0RmxhZ3MpOworICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgZ290byBiYWlsOwogCiAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1FDT3V0SW5pdChoQWFjRW5jLT5xY091dCwgaEFhY0VuYy0+bWF4RnJhbWVzLCBjbSk7Ci0gIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQotICAgIGdvdG8gYmFpbDsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIGdvdG8gYmFpbDsKIAorICBxY0luaXQuY2hhbm5lbE1hcHBpbmcgPSAmaEFhY0VuYy0+Y2hhbm5lbE1hcHBpbmc7CisgIHFjSW5pdC5zY2VDcGUgPSAwOwogCisgIGlmIChBQUNFTkNfQlJfTU9ERV9JU19WQlIoY29uZmlnLT5iaXRyYXRlTW9kZSkpIHsKKyAgICBxY0luaXQuYXZlcmFnZUJpdHMgPSAoYXZlcmFnZUJpdHNQZXJGcmFtZSArIDcpICYgfjc7CisgICAgcWNJbml0LmJpdFJlcyA9IE1JTl9CVUZTSVpFX1BFUl9FRkZfQ0hBTiAqIGNtLT5uQ2hhbm5lbHNFZmY7CisgICAgcWNJbml0Lm1heEJpdHMgPSBNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4gKiBjbS0+bkNoYW5uZWxzRWZmOworICAgIHFjSW5pdC5tYXhCaXRzID0gKGNvbmZpZy0+bWF4Qml0c1BlckZyYW1lICE9IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgID8gZml4TWluKHFjSW5pdC5tYXhCaXRzLCBjb25maWctPm1heEJpdHNQZXJGcmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IHFjSW5pdC5tYXhCaXRzOworICAgIHFjSW5pdC5tYXhCaXRzID0gZml4TWF4KHFjSW5pdC5tYXhCaXRzLCAoYXZlcmFnZUJpdHNQZXJGcmFtZSArIDcpICYgfjcpOworICAgIHFjSW5pdC5taW5CaXRzID0KKyAgICAgICAgKGNvbmZpZy0+bWluQml0c1BlckZyYW1lICE9IC0xKSA/IGNvbmZpZy0+bWluQml0c1BlckZyYW1lIDogMDsKKyAgICBxY0luaXQubWluQml0cyA9IGZpeE1pbihxY0luaXQubWluQml0cywgYXZlcmFnZUJpdHNQZXJGcmFtZSAmIH43KTsKKyAgfSBlbHNlIHsKKyAgICBJTlQgYml0cmVzZXJ2b2lyID0gLTE7IC8qIGRlZmF1bHQgYml0cnNlcnZvaXIgc2l6ZSovCisgICAgaWYgKGlzTG93RGVsYXkoY29uZmlnLT5hdWRpb09iamVjdFR5cGUpKSB7CisgICAgICBJTlQgYnJQZXJDaGFubmVsID0gY29uZmlnLT5iaXRSYXRlIC8gY29uZmlnLT5uQ2hhbm5lbHM7CisgICAgICBiclBlckNoYW5uZWwgPSBmTWluKEJJVFJBVEVfTUFYX0xELCBmTWF4KEJJVFJBVEVfTUlOX0xELCBiclBlckNoYW5uZWwpKTsKIAotICBxY0luaXQuY2hhbm5lbE1hcHBpbmcgICAgICA9ICZoQWFjRW5jLT5jaGFubmVsTWFwcGluZzsKLSAgcWNJbml0LnNjZUNwZSAgICAgICAgICAgICAgPSAwOworICAgICAgLyogYml0cmVzZXJ2b2lyICA9CisgICAgICAgKiAobWF4Qml0UmVzLW1pbkJpdFJlcykvKG1heEJpdFJhdGUtbWluQml0cmF0ZSkqKGJpdFJhdGUtbWluQml0cmF0ZSkrbWluQml0UmVzOworICAgICAgICovCisgICAgICBGSVhQX0RCTCBzbG9wZSA9IGZEaXZOb3JtKAorICAgICAgICAgIChiclBlckNoYW5uZWwgLSBCSVRSQVRFX01JTl9MRCksCisgICAgICAgICAgQklUUkFURV9NQVhfTEQgLSBCSVRSQVRFX01JTl9MRCk7IC8qIGNhbGMgc2xvcGUgZm9yIGludGVycG9sYXRpb24gKi8KKyAgICAgIGJpdHJlc2Vydm9pciA9IGZNdWx0SShzbG9wZSwgKElOVCkoQklUUkVTX01BWF9MRCAtIEJJVFJFU19NSU5fTEQpKSArCisgICAgICAgICAgICAgICAgICAgICBCSVRSRVNfTUlOX0xEOyAgICAgLyogaW50ZXJwb2xhdGUgKi8KKyAgICAgIGJpdHJlc2Vydm9pciA9IGJpdHJlc2Vydm9pciAmIH43OyAvKiBhbGlnbiB0byBieXRlcyAqLworICAgICAgYml0cmVzTWluID0gQklUUkVTX01JTl9MRDsKKyAgICB9CiAKLSAgaWYgKChjb25maWctPmJpdHJhdGVNb2RlPj0xKSAmJiAoY29uZmlnLT5iaXRyYXRlTW9kZTw9NSkpIHsKLSAgICAgIHFjSW5pdC5hdmVyYWdlQml0cyAgICAgPSAoYXZlcmFnZUJpdHNQZXJGcmFtZSs3KSZ+NzsKLSAgICAgIHFjSW5pdC5iaXRSZXMgICAgICAgICAgPSBNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4qY20tPm5DaGFubmVsc0VmZjsKLSAgICAgIHFjSW5pdC5tYXhCaXRzICAgICAgICAgPSBNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4qY20tPm5DaGFubmVsc0VmZjsKLSAgICAgIHFjSW5pdC5tYXhCaXRzICAgICAgICAgPSAoY29uZmlnLT5tYXhCaXRzUGVyRnJhbWUhPS0xKSA/IGZpeE1pbihxY0luaXQubWF4Qml0cywgY29uZmlnLT5tYXhCaXRzUGVyRnJhbWUpIDogcWNJbml0Lm1heEJpdHM7Ci0gICAgICBxY0luaXQubWF4Qml0cyAgICAgICAgID0gZml4TWF4KHFjSW5pdC5tYXhCaXRzLCAoYXZlcmFnZUJpdHNQZXJGcmFtZSs3KSZ+Nyk7Ci0gICAgICBxY0luaXQubWluQml0cyAgICAgICAgID0gKGNvbmZpZy0+bWluQml0c1BlckZyYW1lIT0tMSkgPyBjb25maWctPm1pbkJpdHNQZXJGcmFtZSA6IDA7Ci0gICAgICBxY0luaXQubWluQml0cyAgICAgICAgID0gZml4TWluKHFjSW5pdC5taW5CaXRzLCBhdmVyYWdlQml0c1BlckZyYW1lJn43KTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICAgIGludCBtYXhCaXRyZXM7Ci0gICAgICBxY0luaXQuYXZlcmFnZUJpdHMgICAgID0gKGF2ZXJhZ2VCaXRzUGVyRnJhbWUrNykmfjc7Ci0gICAgICBtYXhCaXRyZXMgICAgICAgICAgICAgID0gKE1JTl9CVUZTSVpFX1BFUl9FRkZfQ0hBTipjbS0+bkNoYW5uZWxzRWZmKSAtIHFjSW5pdC5hdmVyYWdlQml0czsKLSAgICAgIHFjSW5pdC5iaXRSZXMgICAgICAgICAgPSAoY29uZmlnLT5iaXRyZXNlcnZvaXIhPS0xKSA/IEZES21pbihjb25maWctPmJpdHJlc2Vydm9pciwgbWF4Qml0cmVzKSA6IG1heEJpdHJlczsKKyAgICBpbnQgbWF4Qml0cmVzOworICAgIHFjSW5pdC5hdmVyYWdlQml0cyA9IChhdmVyYWdlQml0c1BlckZyYW1lICsgNykgJiB+NzsKKyAgICBtYXhCaXRyZXMgPQorICAgICAgICAoTUlOX0JVRlNJWkVfUEVSX0VGRl9DSEFOICogY20tPm5DaGFubmVsc0VmZikgLSBxY0luaXQuYXZlcmFnZUJpdHM7CisgICAgcWNJbml0LmJpdFJlcyA9CisgICAgICAgIChiaXRyZXNlcnZvaXIgIT0gLTEpID8gZk1pbihiaXRyZXNlcnZvaXIsIG1heEJpdHJlcykgOiBtYXhCaXRyZXM7CiAKLSAgICAgIHFjSW5pdC5tYXhCaXRzICAgICAgICAgPSBmaXhNaW4oTUlOX0JVRlNJWkVfUEVSX0VGRl9DSEFOKmNtLT5uQ2hhbm5lbHNFZmYsICgoYXZlcmFnZUJpdHNQZXJGcmFtZSs3KSZ+NykrcWNJbml0LmJpdFJlcyk7Ci0gICAgICBxY0luaXQubWF4Qml0cyAgICAgICAgID0gKGNvbmZpZy0+bWF4Qml0c1BlckZyYW1lIT0tMSkgPyBmaXhNaW4ocWNJbml0Lm1heEJpdHMsIGNvbmZpZy0+bWF4Qml0c1BlckZyYW1lKSA6IHFjSW5pdC5tYXhCaXRzOwotICAgICAgcWNJbml0Lm1heEJpdHMgICAgICAgICA9IGZpeE1pbihNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4qY20tPm5DaGFubmVsc0VmZiwgZml4TWF4KHFjSW5pdC5tYXhCaXRzLCAoYXZlcmFnZUJpdHNQZXJGcmFtZSs3KzgpJn43KSk7CisgICAgcWNJbml0Lm1heEJpdHMgPSBmaXhNaW4oTUlOX0JVRlNJWkVfUEVSX0VGRl9DSEFOICogY20tPm5DaGFubmVsc0VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGF2ZXJhZ2VCaXRzUGVyRnJhbWUgKyA3KSAmIH43KSArIHFjSW5pdC5iaXRSZXMpOworICAgIHFjSW5pdC5tYXhCaXRzID0gKGNvbmZpZy0+bWF4Qml0c1BlckZyYW1lICE9IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgID8gZml4TWluKHFjSW5pdC5tYXhCaXRzLCBjb25maWctPm1heEJpdHNQZXJGcmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IHFjSW5pdC5tYXhCaXRzOworICAgIHFjSW5pdC5tYXhCaXRzID0KKyAgICAgICAgZml4TWluKE1JTl9CVUZTSVpFX1BFUl9FRkZfQ0hBTiAqIGNtLT5uQ2hhbm5lbHNFZmYsCisgICAgICAgICAgICAgICBmaXhNYXgocWNJbml0Lm1heEJpdHMsIChhdmVyYWdlQml0c1BlckZyYW1lICsgNyArIDgpICYgfjcpKTsKIAotICAgICAgcWNJbml0Lm1pbkJpdHMgICAgICAgICA9IGZpeE1heCgwLCAoKGF2ZXJhZ2VCaXRzUGVyRnJhbWUtMSkmfjcpLXFjSW5pdC5iaXRSZXMtdHJhbnNwb3J0RW5jX0dldFN0YXRpY0JpdHMoaFRwRW5jLCAoKGF2ZXJhZ2VCaXRzUGVyRnJhbWUrNykmfjcpK3FjSW5pdC5iaXRSZXMpKTsKLSAgICAgIHFjSW5pdC5taW5CaXRzICAgICAgICAgPSAoY29uZmlnLT5taW5CaXRzUGVyRnJhbWUhPS0xKSA/IGZpeE1heChxY0luaXQubWluQml0cywgY29uZmlnLT5taW5CaXRzUGVyRnJhbWUpIDogcWNJbml0Lm1pbkJpdHM7Ci0gICAgICBxY0luaXQubWluQml0cyAgICAgICAgID0gZml4TWluKHFjSW5pdC5taW5CaXRzLCAoYXZlcmFnZUJpdHNQZXJGcmFtZSAtIHRyYW5zcG9ydEVuY19HZXRTdGF0aWNCaXRzKGhUcEVuYywgcWNJbml0Lm1heEJpdHMpKSZ+Nyk7CisgICAgcWNJbml0Lm1pbkJpdHMgPSBmaXhNYXgoCisgICAgICAgIDAsICgoYXZlcmFnZUJpdHNQZXJGcmFtZSAtIDEpICYgfjcpIC0gcWNJbml0LmJpdFJlcyAtCisgICAgICAgICAgICAgICB0cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cygKKyAgICAgICAgICAgICAgICAgICBoVHBFbmMsICgoYXZlcmFnZUJpdHNQZXJGcmFtZSArIDcpICYgfjcpICsgcWNJbml0LmJpdFJlcykpOworICAgIHFjSW5pdC5taW5CaXRzID0gKGNvbmZpZy0+bWluQml0c1BlckZyYW1lICE9IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgID8gZml4TWF4KHFjSW5pdC5taW5CaXRzLCBjb25maWctPm1pbkJpdHNQZXJGcmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IHFjSW5pdC5taW5CaXRzOworICAgIHFjSW5pdC5taW5CaXRzID0gZml4TWluKAorICAgICAgICBxY0luaXQubWluQml0cywgKGF2ZXJhZ2VCaXRzUGVyRnJhbWUgLQorICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydEVuY19HZXRTdGF0aWNCaXRzKGhUcEVuYywgcWNJbml0Lm1heEJpdHMpKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjcpOwogICB9CiAKLSAgcWNJbml0LnNhbXBsZVJhdGUgICAgICAgICAgPSBjb25maWctPnNhbXBsZVJhdGU7Ci0gIHFjSW5pdC5hZHZhbmNlZEJpdHNUb1BlICAgID0gaXNMb3dEZWxheShjb25maWctPmF1ZGlvT2JqZWN0VHlwZSkgPyAxIDogMCA7Ci0gIHFjSW5pdC5uU3ViRnJhbWVzICAgICAgICAgID0gY29uZmlnLT5uU3ViRnJhbWVzOworICBxY0luaXQuc2FtcGxlUmF0ZSA9IGNvbmZpZy0+c2FtcGxlUmF0ZTsKKyAgcWNJbml0LmlzTG93RGVsYXkgPSBpc0xvd0RlbGF5KGNvbmZpZy0+YXVkaW9PYmplY3RUeXBlKSA/IDEgOiAwOworICBxY0luaXQublN1YkZyYW1lcyA9IGNvbmZpZy0+blN1YkZyYW1lczsKICAgcWNJbml0LnBhZGRpbmcucGFkZGluZ1Jlc3QgPSBjb25maWctPnNhbXBsZVJhdGU7CiAKLSAgLyogQ2FsYyBtZWFuUGU6IHFjSW5pdC5tZWFuUGUgPSAxMC4wZiAqIEZSQU1FX0xFTl9MT05HICogaEFhY0VuYy0+YmFuZHdpZHRoOTBkQi8oY29uZmlnLT5zYW1wbGVSYXRlLzIuMGYpOyAqLwotICBid19yYXRpbyA9IGZEaXZOb3JtKChGSVhQX0RCTCkoMTAqY29uZmlnLT5mcmFtZWxlbmd0aCpoQWFjRW5jLT5iYW5kd2lkdGg5MGRCKSwgKEZJWFBfREJMKShjb25maWctPnNhbXBsZVJhdGUpLCAmcWJ3KTsKLSAgcWNJbml0Lm1lYW5QZSA9IEZES21heCgoSU5UKXNjYWxlVmFsdWUoYndfcmF0aW8sIHFidysxLShERlJBQ1RfQklUUy0xKSksIDEpOwotCi0gIC8qIENhbGMgbWF4Qml0RmFjICovCi0gIG1iZmFjID0gZkRpdk5vcm0oKE1JTl9CVUZTSVpFX1BFUl9FRkZfQ0hBTi03NDQpKmNtLT5uQ2hhbm5lbHNFZmYsIHFjSW5pdC5hdmVyYWdlQml0cy9xY0luaXQublN1YkZyYW1lcywgJnFtYmZhYyk7Ci0gIHFtYmZhYyA9IERGUkFDVF9CSVRTLTEtcW1iZmFjOwotICBxY0luaXQubWF4Qml0RmFjID0gKHFtYmZhYyA+IDI0KSA/IChtYmZhYyA+PiAocW1iZmFjIC0gMjQpKToobWJmYWMgPDwgKDI0IC0gcW1iZmFjKSk7Ci0KLSAgc3dpdGNoKGNvbmZpZy0+Yml0cmF0ZU1vZGUpewotICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0NCUjoKLSAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9DQlI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzE6Ci0gICAgcWNJbml0LmJpdHJhdGVNb2RlID0gUUNEQVRBX0JSX01PREVfVkJSXzE7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzI6Ci0gICAgcWNJbml0LmJpdHJhdGVNb2RlID0gUUNEQVRBX0JSX01PREVfVkJSXzI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzM6Ci0gICAgcWNJbml0LmJpdHJhdGVNb2RlID0gUUNEQVRBX0JSX01PREVfVkJSXzM7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzQ6Ci0gICAgcWNJbml0LmJpdHJhdGVNb2RlID0gUUNEQVRBX0JSX01PREVfVkJSXzQ7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzU6Ci0gICAgcWNJbml0LmJpdHJhdGVNb2RlID0gUUNEQVRBX0JSX01PREVfVkJSXzU7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfU0ZSOgotICAgIHFjSW5pdC5iaXRyYXRlTW9kZSA9IFFDREFUQV9CUl9NT0RFX1NGUjsKLSAgICBicmVhazsKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9GRjoKLSAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9GRjsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfVU5TVVBQT1JURURfQklUUkFURV9NT0RFOwotICAgIGdvdG8gYmFpbDsKKyAgaWYgKHFjSW5pdC5iaXRSZXMgPj0gYml0cmVzTWluICogY29uZmlnLT5uQ2hhbm5lbHMpIHsKKyAgICBxY0luaXQuYml0UmVzTW9kZSA9IEFBQ0VOQ19CUl9NT0RFX0ZVTEw7IC8qIGZ1bGwgYml0cmVzZXJ2b2lyICovCisgIH0gZWxzZSBpZiAocWNJbml0LmJpdFJlcyA+IDApIHsKKyAgICBxY0luaXQuYml0UmVzTW9kZSA9IEFBQ0VOQ19CUl9NT0RFX1JFRFVDRUQ7IC8qIHJlZHVjZWQgYml0cmVzZXJ2b2lyICovCisgIH0gZWxzZSB7CisgICAgcWNJbml0LmJpdFJlc01vZGUgPSBBQUNFTkNfQlJfTU9ERV9ESVNBQkxFRDsgLyogZGlzYWJsZWQgYml0cmVzZXJ2b2lyICovCiAgIH0KIAotICBxY0luaXQuaW52UXVhbnQgPSAoY29uZmlnLT51c2VSZXF1YW50KT8yOjA7CisgIC8qIENvbmZpZ3VyZSBiaXRyYXRlIGRpc3RyaWJ1dGlvbiBzdHJhdGVneS4gKi8KKyAgc3dpdGNoIChjb25maWctPmNoYW5uZWxNb2RlKSB7CisgICAgY2FzZSBNT0RFXzFfMjoKKyAgICBjYXNlIE1PREVfMV8yXzE6CisgICAgY2FzZSBNT0RFXzFfMl8yOgorICAgIGNhc2UgTU9ERV8xXzJfMl8xOgorICAgIGNhc2UgTU9ERV82XzE6CisgICAgY2FzZSBNT0RFXzFfMl8yXzJfMToKKyAgICBjYXNlIE1PREVfN18xX0JBQ0s6CisgICAgY2FzZSBNT0RFXzdfMV9UT1BfRlJPTlQ6CisgICAgY2FzZSBNT0RFXzdfMV9SRUFSX1NVUlJPVU5EOgorICAgIGNhc2UgTU9ERV83XzFfRlJPTlRfQ0VOVEVSOgorICAgICAgcWNJbml0LmJpdERpc3RyaWJ1dGlvbk1vZGUgPSAwOyAvKiBvdmVyIGFsbCBlbGVtZW50cyBiaXRyYXRlIGVzdGltYXRpb24gKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV8xOgorICAgIGNhc2UgTU9ERV8yOgorICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGwgbm9uIG1wZWcgZGVmaW5lZCBjaGFubmVsIG1vZGVzICovCisgICAgICBxY0luaXQuYml0RGlzdHJpYnV0aW9uTW9kZSA9IDE7IC8qIGVsZW1lbnQtd2lzZSBiaXQgYml0cmF0ZSBlc3RpbWF0aW9uICovCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbmZpZy0+Y2hhbm5lbE1vZGUgKi8KIAotICAvKiBtYXhJdGVyYXRpb25zIHNob3VsZCBiZSBzZXQgdG8gdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcXVhbnRpemF0aW9uIGl0ZXJhdGlvbnMgdGhhdCBhcmUKLSAgICogYWxsb3dlZCBiZWZvcmUgdGhlIGNyYXNoIHJlY292ZXJ5IGZ1bmN0aW9uYWxpdHkgaXMgYWN0aXZhdGVkLiBUaGlzIHNldHRpbmcgc2hvdWxkIGJlIGFkanVzdGVkCi0gICAqIHRvIHRoZSBwcm9jZXNzaW5nIHBvd2VyIGF2YWlsYWJsZSwgaS5lLiB0byB0aGUgcHJvY2Vzc2luZyBwb3dlciBoZWFkcm9vbSBpbiBvbmUgZnJhbWUgdGhhdCBpcwotICAgKiBzdGlsbCBsZWZ0IGFmdGVyIG5vcm1hbCBlbmNvZGluZyB3aXRob3V0IHJlcXVhbnRpemF0aW9uLiBQbGVhc2Ugbm90ZSB0aGF0IGlmIGFjdGl2YXRlZCB0aGlzCi0gICAqIGZ1bmN0aW9uYWxpdHkgaXMgdXNlZCBtb3N0IGxpa2VseSBvbmx5IGluIGNhc2VzIHdoZXJlIHRoZSBlbmNvZGVyIGlzIG9wZXJhdGluZyBiZXlvbmQKLSAgICogcmVjb21tZW5kZWQgc2V0dGluZ3MsIGkuZS4gdGhlIGF1ZGlvIHF1YWxpdHkgaXMgc3Vib3B0aW1hbCBhbnl3YXkuIEFjdGl2YXRpbmcgdGhlIGNyYXNoCi0gICAqIHJlY292ZXJ5IGRvZXMgbm90IGZ1cnRoZXIgcmVkdWNlIGF1ZGlvIHF1YWxpdHkgc2lnbmlmaWNhbnRseSBpbiB0aGVzZSBjYXNlcy4gKi8KLSAgaWYgKCAoY29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MRCkgfHwgKGNvbmZpZy0+YXVkaW9PYmplY3RUeXBlID09IEFPVF9FUl9BQUNfRUxEKSApIHsKKyAgLyogQ2FsYyBtZWFuUGU6IHFjSW5pdC5tZWFuUGUgPSAxMC4wZiAqIEZSQU1FX0xFTl9MT05HICoKKyAgICogaEFhY0VuYy0+YmFuZHdpZHRoOTBkQi8oY29uZmlnLT5zYW1wbGVSYXRlLzIuMGYpOyAqLworICBid19yYXRpbyA9CisgICAgICBmRGl2Tm9ybSgoRklYUF9EQkwpKDEwICogY29uZmlnLT5mcmFtZWxlbmd0aCAqIGhBYWNFbmMtPmJhbmR3aWR0aDkwZEIpLAorICAgICAgICAgICAgICAgKEZJWFBfREJMKShjb25maWctPnNhbXBsZVJhdGUpLCAmcWJ3KTsKKyAgcWNJbml0Lm1lYW5QZSA9CisgICAgICBmTWF4KChJTlQpc2NhbGVWYWx1ZShid19yYXRpbywgcWJ3ICsgMSAtIChERlJBQ1RfQklUUyAtIDEpKSwgMSk7CisKKyAgLyogQ2FsYyBtYXhCaXRGYWMsIHNjYWxlIGl0IHRvIDI0IGJpdCBhY2N1cmFjeSAqLworICBtYmZhYyA9IGZEaXZOb3JtKHFjSW5pdC5tYXhCaXRzLCBxY0luaXQuYXZlcmFnZUJpdHMgLyBxY0luaXQublN1YkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAmbWJmYWNfZSk7CisgIHFjSW5pdC5tYXhCaXRGYWMgPSBzY2FsZVZhbHVlKG1iZmFjLCAtKERGUkFDVF9CSVRTIC0gMSAtIDI0IC0gbWJmYWNfZSkpOworCisgIHN3aXRjaCAoY29uZmlnLT5iaXRyYXRlTW9kZSkgeworICAgIGNhc2UgQUFDRU5DX0JSX01PREVfQ0JSOgorICAgICAgcWNJbml0LmJpdHJhdGVNb2RlID0gUUNEQVRBX0JSX01PREVfQ0JSOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMToKKyAgICAgIHFjSW5pdC5iaXRyYXRlTW9kZSA9IFFDREFUQV9CUl9NT0RFX1ZCUl8xOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMjoKKyAgICAgIHFjSW5pdC5iaXRyYXRlTW9kZSA9IFFDREFUQV9CUl9NT0RFX1ZCUl8yOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMzoKKyAgICAgIHFjSW5pdC5iaXRyYXRlTW9kZSA9IFFDREFUQV9CUl9NT0RFX1ZCUl8zOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNDoKKyAgICAgIHFjSW5pdC5iaXRyYXRlTW9kZSA9IFFDREFUQV9CUl9NT0RFX1ZCUl80OworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNToKKyAgICAgIHFjSW5pdC5iaXRyYXRlTW9kZSA9IFFDREFUQV9CUl9NT0RFX1ZCUl81OworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9TRlI6CisgICAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9TRlI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0ZGOgorICAgICAgcWNJbml0LmJpdHJhdGVNb2RlID0gUUNEQVRBX0JSX01PREVfRkY7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX1VOU1VQUE9SVEVEX0JJVFJBVEVfTU9ERTsKKyAgICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIHFjSW5pdC5pbnZRdWFudCA9IChjb25maWctPnVzZVJlcXVhbnQpID8gMiA6IDA7CisKKyAgLyogbWF4SXRlcmF0aW9ucyBzaG91bGQgYmUgc2V0IHRvIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXF1YW50aXphdGlvbgorICAgKiBpdGVyYXRpb25zIHRoYXQgYXJlIGFsbG93ZWQgYmVmb3JlIHRoZSBjcmFzaCByZWNvdmVyeSBmdW5jdGlvbmFsaXR5IGlzCisgICAqIGFjdGl2YXRlZC4gVGhpcyBzZXR0aW5nIHNob3VsZCBiZSBhZGp1c3RlZCB0byB0aGUgcHJvY2Vzc2luZyBwb3dlcgorICAgKiBhdmFpbGFibGUsIGkuZS4gdG8gdGhlIHByb2Nlc3NpbmcgcG93ZXIgaGVhZHJvb20gaW4gb25lIGZyYW1lIHRoYXQgaXMgc3RpbGwKKyAgICogbGVmdCBhZnRlciBub3JtYWwgZW5jb2Rpbmcgd2l0aG91dCByZXF1YW50aXphdGlvbi4gUGxlYXNlIG5vdGUgdGhhdCBpZgorICAgKiBhY3RpdmF0ZWQgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIHVzZWQgbW9zdCBsaWtlbHkgb25seSBpbiBjYXNlcyB3aGVyZSB0aGUKKyAgICogZW5jb2RlciBpcyBvcGVyYXRpbmcgYmV5b25kIHJlY29tbWVuZGVkIHNldHRpbmdzLCBpLmUuIHRoZSBhdWRpbyBxdWFsaXR5IGlzCisgICAqIHN1Ym9wdGltYWwgYW55d2F5LiBBY3RpdmF0aW5nIHRoZSBjcmFzaCByZWNvdmVyeSBkb2VzIG5vdCBmdXJ0aGVyIHJlZHVjZQorICAgKiBhdWRpbyBxdWFsaXR5IHNpZ25pZmljYW50bHkgaW4gdGhlc2UgY2FzZXMuICovCisgIGlmIChpc0xvd0RlbGF5KGNvbmZpZy0+YXVkaW9PYmplY3RUeXBlKSkgewogICAgIHFjSW5pdC5tYXhJdGVyYXRpb25zID0gMjsKLSAgfQotICBlbHNlCi0gIHsKKyAgfSBlbHNlIHsKICAgICBxY0luaXQubWF4SXRlcmF0aW9ucyA9IDU7CiAgIH0KIAogICBxY0luaXQuYml0cmF0ZSA9IGNvbmZpZy0+Yml0UmF0ZSAtIGNvbmZpZy0+YW5jRGF0YUJpdFJhdGU7CiAKLSAgcWNJbml0LnN0YXRpY0JpdHMgPSB0cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cyhoVHBFbmMsIHFjSW5pdC5hdmVyYWdlQml0cy9xY0luaXQublN1YkZyYW1lcyk7CisgIHFjSW5pdC5zdGF0aWNCaXRzID0gdHJhbnNwb3J0RW5jX0dldFN0YXRpY0JpdHMoCisgICAgICBoVHBFbmMsIHFjSW5pdC5hdmVyYWdlQml0cyAvIHFjSW5pdC5uU3ViRnJhbWVzKTsKIAotICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19RQ0luaXQoaEFhY0VuYy0+cWNLZXJuZWwsICZxY0luaXQpOwotICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKLSAgICBnb3RvIGJhaWw7CisgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1FDSW5pdChoQWFjRW5jLT5xY0tlcm5lbCwgJnFjSW5pdCwgaW5pdEZsYWdzKTsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIGdvdG8gYmFpbDsKIAotICBoQWFjRW5jLT5hb3QgPSBoQWFjRW5jLT5jb25maWctPmF1ZGlvT2JqZWN0VHlwZTsKKyAgLyogTWFwIHZpcnR1YWwgYW90J3MgdG8gaW50ZXJuIGFvdCB1c2VkIGluIGJpdHN0cmVhbSB3cml0ZXIuICovCisgIHN3aXRjaCAoaEFhY0VuYy0+Y29uZmlnLT5hdWRpb09iamVjdFR5cGUpIHsKKyAgICBjYXNlIEFPVF9NUDJfQUFDX0xDOgorICAgICAgaEFhY0VuYy0+YW90ID0gQU9UX0FBQ19MQzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQU9UX01QMl9TQlI6CisgICAgICBoQWFjRW5jLT5hb3QgPSBBT1RfU0JSOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGhBYWNFbmMtPmFvdCA9IGhBYWNFbmMtPmNvbmZpZy0+YXVkaW9PYmplY3RUeXBlOworICB9CiAKICAgLyogY29tbW9uIHRoaW5ncyAqLwogCkBAIC03MDEsNyArNzE4LDYgQEAKICAgcmV0dXJuIEVycm9yU3RhdHVzOwogfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19FbmNvZGVGcmFtZQpAQCAtNzA5LDI3NyArNzI1LDIzNSBAQAogICAgIHJldHVybnM6ICAgICAgZXJyb3IgY29kZQogCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfRW5jb2RlRnJhbWUoIEhBTkRMRV9BQUNfRU5DICAgICAgIGhBYWNFbmMsICAgICAgICAgIC8qIGVuY29kZXIgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgIGhUcEVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSogUkVTVFJJQ1QgICAgaW5wdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogICAgICAgICAgICAgICAgIG5PdXRCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDRU5DX0VYVF9QQVlMT0FEICAgZXh0UGF5bG9hZFtNQVhfVE9UQUxfRVhUX1BBWUxPQURTXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzOwotICAgIGludCAgICBlbCwgbiwgYz0wOwotICAgIFVDSEFSICBleHRQYXlsb2FkVXNlZFtNQVhfVE9UQUxfRVhUX1BBWUxPQURTXTsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19FbmNvZGVGcmFtZSgKKyAgICBIQU5ETEVfQUFDX0VOQyBoQWFjRW5jLCAvKiBlbmNvZGVyIGhhbmRsZSAqLworICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLCBJTlRfUENNICpSRVNUUklDVCBpbnB1dEJ1ZmZlciwKKyAgICBjb25zdCBVSU5UIGlucHV0QnVmZmVyQnVmU2l6ZSwgSU5UICpuT3V0Qnl0ZXMsCisgICAgQUFDRU5DX0VYVF9QQVlMT0FEIGV4dFBheWxvYWRbTUFYX1RPVEFMX0VYVF9QQVlMT0FEU10pIHsKKyAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7CisgIGludCBlbCwgbiwgYyA9IDA7CisgIFVDSEFSIGV4dFBheWxvYWRVc2VkW01BWF9UT1RBTF9FWFRfUEFZTE9BRFNdOwogCi0gICAgQ0hBTk5FTF9NQVBQSU5HICpjbSAgICAgID0gJmhBYWNFbmMtPmNoYW5uZWxNYXBwaW5nOworICBDSEFOTkVMX01BUFBJTkcgKmNtID0gJmhBYWNFbmMtPmNoYW5uZWxNYXBwaW5nOwogCisgIFBTWV9PVVQgKnBzeU91dCA9IGhBYWNFbmMtPnBzeU91dFtjXTsKKyAgUUNfT1VUICpxY091dCA9IGhBYWNFbmMtPnFjT3V0W2NdOwogCisgIEZES21lbWNsZWFyKGV4dFBheWxvYWRVc2VkLCBNQVhfVE9UQUxfRVhUX1BBWUxPQURTICogc2l6ZW9mKFVDSEFSKSk7CiAKLSAgICBQU1lfT1VUICpwc3lPdXQgPSBoQWFjRW5jLT5wc3lPdXRbY107Ci0gICAgUUNfT1VUICAqcWNPdXQgID0gaEFhY0VuYy0+cWNPdXRbY107CisgIHFjT3V0LT5lbGVtZW50RXh0Qml0cyA9IDA7IC8qIHN1bSB1cCBhbGwgZXh0ZW5kZWQgYml0IG9mIGVhY2ggZWxlbWVudCAqLworICBxY091dC0+c3RhdGljQml0cyA9IDA7ICAgICAvKiBzdW0gdXAgc2lkZSBpbmZvIGJpdHMgb2YgZWFjaCBlbGVtZW50ICovCisgIHFjT3V0LT50b3RhbE5vUmVkUGUgPSAwOyAgIC8qIHN1bSB1cCBQRSAqLwogCi0gICAgRkRLbWVtY2xlYXIoZXh0UGF5bG9hZFVzZWQsIE1BWF9UT1RBTF9FWFRfUEFZTE9BRFMgKiBzaXplb2YoVUNIQVIpKTsKKyAgLyogYWR2YW5jZSBwc3ljaG9hY291c3RpY3MgKi8KKyAgZm9yIChlbCA9IDA7IGVsIDwgY20tPm5FbGVtZW50czsgZWwrKykgeworICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2VsXTsKIAotICAgIHFjT3V0LT5lbGVtZW50RXh0Qml0cyA9IDA7IC8qIHN1bSB1cCBhbGwgZXh0ZW5kZWQgYml0IG9mIGVhY2ggZWxlbWVudCAqLwotICAgIHFjT3V0LT5zdGF0aWNCaXRzICAgICA9IDA7IC8qIHN1bSB1cCBzaWRlIGluZm8gYml0cyBvZiBlYWNoIGVsZW1lbnQgKi8KLSAgICBxY091dC0+dG90YWxOb1JlZFBlICAgPSAwOyAvKiBzdW0gdXAgUEUgKi8KKyAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8CisgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpIHsKKyAgICAgIGludCBjaDsKIAotICAgIC8qIGFkdmFuY2UgcHN5Y2hvYWNvdXN0aWNzICovCi0gICAgZm9yIChlbD0wOyBlbDxjbS0+bkVsZW1lbnRzOyBlbCsrKSB7Ci0gICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2VsXTsKKyAgICAgIC8qIHVwZGF0ZSBwb2ludGVyISovCisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBlbEluZm8ubkNoYW5uZWxzSW5FbDsgY2grKykgeworICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPQorICAgICAgICAgICAgcHN5T3V0LT5wc3lPdXRFbGVtZW50W2VsXS0+cHN5T3V0Q2hhbm5lbFtjaF07CisgICAgICAgIFFDX09VVF9DSEFOTkVMICpxY091dENoYW4gPSBxY091dC0+cWNFbGVtZW50W2VsXS0+cWNPdXRDaGFubmVsW2NoXTsKIAotICAgICAgICBpZiAoIChlbEluZm8uZWxUeXBlID09IElEX1NDRSkKLSAgICAgICAgICB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpCi0gICAgICAgICAgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjaDsKKyAgICAgICAgcHN5T3V0Q2hhbi0+bWRjdFNwZWN0cnVtID0gcWNPdXRDaGFuLT5tZGN0U3BlY3RydW07CisgICAgICAgIHBzeU91dENoYW4tPnNmYlNwcmVhZEVuZXJneSA9IHFjT3V0Q2hhbi0+c2ZiU3ByZWFkRW5lcmd5OworICAgICAgICBwc3lPdXRDaGFuLT5zZmJFbmVyZ3kgPSBxY091dENoYW4tPnNmYkVuZXJneTsKKyAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGE7CisgICAgICAgIHBzeU91dENoYW4tPnNmYk1pblNuckxkRGF0YSA9IHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhOworICAgICAgICBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGEgPSBxY091dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YTsKKyAgICAgIH0KIAotICAgICAgICAgICAgLyogdXBkYXRlIHBvaW50ZXIhKi8KLSAgICAgICAgICAgIGZvcihjaD0wO2NoPGVsSW5mby5uQ2hhbm5lbHNJbkVsO2NoKyspIHsKLSAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSBwc3lPdXQtPnBzeU91dEVsZW1lbnRbZWxdLT5wc3lPdXRDaGFubmVsW2NoXTsKLSAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAgKnFjT3V0Q2hhbiA9IHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5xY091dENoYW5uZWxbY2hdOworICAgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfcHN5TWFpbigKKyAgICAgICAgICBlbEluZm8ubkNoYW5uZWxzSW5FbCwgaEFhY0VuYy0+cHN5S2VybmVsLT5wc3lFbGVtZW50W2VsXSwKKyAgICAgICAgICBoQWFjRW5jLT5wc3lLZXJuZWwtPnBzeUR5bmFtaWMsIGhBYWNFbmMtPnBzeUtlcm5lbC0+cHN5Q29uZiwKKyAgICAgICAgICBwc3lPdXQtPnBzeU91dEVsZW1lbnRbZWxdLCBpbnB1dEJ1ZmZlciwgaW5wdXRCdWZmZXJCdWZTaXplLAorICAgICAgICAgIGNtLT5lbEluZm9bZWxdLkNoYW5uZWxJbmRleCwgY20tPm5DaGFubmVscyk7CiAKLSAgICAgICAgICAgICAgICBwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW0gICAgICAgPSBxY091dENoYW4tPm1kY3RTcGVjdHJ1bTsKLSAgICAgICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJTcHJlYWRFbmVyZ3kgID0gcWNPdXRDaGFuLT5zZmJTcHJlYWRFbmVyZ3k7Ci0gICAgICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5ICAgICAgICAgID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3k7Ci0gICAgICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhICAgID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGE7Ci0gICAgICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhICAgID0gcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGE7Ci0gICAgICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhID0gcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGE7CisgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgcmV0dXJuIEVycm9yU3RhdHVzOwogCi0gICAgICAgICAgICB9CisgICAgICAvKiBGb3JtRmFjdG9yLCBQZSBhbmQgc3RhdGljQml0RGVtYW5kIGNhbGN1bGF0aW9uICovCisgICAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19RQ01haW5QcmVwYXJlKAorICAgICAgICAgICZlbEluZm8sIGhBYWNFbmMtPnFjS2VybmVsLT5oQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1bZWxdLAorICAgICAgICAgIHBzeU91dC0+cHN5T3V0RWxlbWVudFtlbF0sIHFjT3V0LT5xY0VsZW1lbnRbZWxdLCBoQWFjRW5jLT5hb3QsCisgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5zeW50YXhGbGFncywgaEFhY0VuYy0+Y29uZmlnLT5lcENvbmZpZyk7CiAKLSAgICAgICAgICAgIEZES2FhY0VuY19wc3lNYWluKGVsSW5mby5uQ2hhbm5lbHNJbkVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cHN5S2VybmVsLT5wc3lFbGVtZW50W2VsXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnBzeUtlcm5lbC0+cHN5RHluYW1pYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnBzeUtlcm5lbC0+cHN5Q29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dC0+cHN5T3V0RWxlbWVudFtlbF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLT5lbEluZm9bZWxdLkNoYW5uZWxJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLT5uQ2hhbm5lbHMKKyAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKSByZXR1cm4gRXJyb3JTdGF0dXM7CiAKLSAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotICAgICAgICAgICAgLyogRm9ybUZhY3RvciwgUGUgYW5kIHN0YXRpY0JpdERlbWFuZCBjYWxjdWxhdGlvbiAqLwotICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfUUNNYWluUHJlcGFyZSgmZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cWNLZXJuZWwtPmhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtlbF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXQtPnBzeU91dEVsZW1lbnRbZWxdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXQtPnFjRWxlbWVudFtlbF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5hb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPnN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5lcENvbmZpZyk7CisgICAgICBxY091dC0+cWNFbGVtZW50W2VsXS0+ZXh0Qml0c1VzZWQgPSAwOworICAgICAgcWNPdXQtPnFjRWxlbWVudFtlbF0tPm5FeHRlbnNpb25zID0gMDsKKyAgICAgIC8qIHJlc2V0IGV4dGVuc2lvbiBwYXlsb2FkICovCisgICAgICBGREttZW1jbGVhcigmcWNPdXQtPnFjRWxlbWVudFtlbF0tPmV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICgxKSAqIHNpemVvZihRQ19PVVRfRVhURU5TSU9OKSk7CiAKLSAgICAgICAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQotICAgICAgICAgICAgICByZXR1cm4gRXJyb3JTdGF0dXM7CisgICAgICBmb3IgKG4gPSAwOyBuIDwgTUFYX1RPVEFMX0VYVF9QQVlMT0FEUzsgbisrKSB7CisgICAgICAgIGlmICghZXh0UGF5bG9hZFVzZWRbbl0gJiYgKGV4dFBheWxvYWRbbl0uYXNzb2NpYXRlZENoRWxlbWVudCA9PSBlbCkgJiYKKyAgICAgICAgICAgIChleHRQYXlsb2FkW25dLmRhdGFTaXplID4gMCkgJiYgKGV4dFBheWxvYWRbbl0ucERhdGEgIT0gTlVMTCkpIHsKKyAgICAgICAgICBpbnQgaWR4ID0gcWNPdXQtPnFjRWxlbWVudFtlbF0tPm5FeHRlbnNpb25zKys7CiAKLSAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgICAgICAgICAgcWNPdXQtPnFjRWxlbWVudFtlbF0tPmV4dEJpdHNVc2VkID0gMDsKLSAgICAgICAgICAgIHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5uRXh0ZW5zaW9ucyA9IDA7Ci0gICAgICAgICAgICAvKiByZXNldCBleHRlbnNpb24gcGF5bG9hZCAqLwotICAgICAgICAgICAgRkRLbWVtY2xlYXIoJnFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRlbnNpb24sICgxKSpzaXplb2YoUUNfT1VUX0VYVEVOU0lPTikpOwotCi0gICAgICAgICAgICBmb3IgKCBuID0gMDsgbiA8IE1BWF9UT1RBTF9FWFRfUEFZTE9BRFM7IG4rKyApIHsKLSAgICAgICAgICAgICAgICBpZiAoICFleHRQYXlsb2FkVXNlZFtuXQotICAgICAgICAgICAgICAgICAgJiYgKGV4dFBheWxvYWRbbl0uYXNzb2NpYXRlZENoRWxlbWVudCA9PSBlbCkKLSAgICAgICAgICAgICAgICAgICYmIChleHRQYXlsb2FkW25dLmRhdGFTaXplID4gMCkKLSAgICAgICAgICAgICAgICAgICYmIChleHRQYXlsb2FkW25dLnBEYXRhICE9IE5VTEwpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpZHggPSBxY091dC0+cWNFbGVtZW50W2VsXS0+bkV4dGVuc2lvbnMrKzsKLQotICAgICAgICAgICAgICAgICAgICBxY091dC0+cWNFbGVtZW50W2VsXS0+ZXh0ZW5zaW9uW2lkeF0udHlwZSAgICAgICAgID0gZXh0UGF5bG9hZFtuXS5kYXRhVHlwZTsgICAvKiBQZXJmb3JtIGEgc2FuaXR5IGNoZWNrIG9uIHRoZSB0eXBlPyAqLwotICAgICAgICAgICAgICAgICAgICBxY091dC0+cWNFbGVtZW50W2VsXS0+ZXh0ZW5zaW9uW2lkeF0ublBheWxvYWRCaXRzID0gZXh0UGF5bG9hZFtuXS5kYXRhU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgcWNPdXQtPnFjRWxlbWVudFtlbF0tPmV4dGVuc2lvbltpZHhdLnBQYXlsb2FkID0gZXh0UGF5bG9hZFtuXS5wRGF0YTsKLSAgICAgICAgICAgICAgICAgICAgLyogTm93IGFzayB0aGUgYml0c3RyZWFtIGVuY29kZXIgaG93IG1hbnkgYml0cyB3ZSBuZWVkIHRvIGVuY29kZSB0aGUgZGF0YSB3aXRoIHRoZSBjdXJyZW50IGJpdHN0cmVhbSBzeW50YXg6ICovCi0gICAgICAgICAgICAgICAgICAgIHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRCaXRzVXNlZCArPQotICAgICAgICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhKCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dC0+cWNFbGVtZW50W2VsXS0+ZXh0ZW5zaW9uW2lkeF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+c3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5lcENvbmZpZyApOwotICAgICAgICAgICAgICAgICAgICBleHRQYXlsb2FkVXNlZFtuXSA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBzdW0gdXAgZXh0ZW5zaW9uIGFuZCBzdGF0aWMgYml0cyBmb3IgYWxsIGNoYW5uZWwgZWxlbWVudHMgKi8KLSAgICAgICAgICAgIHFjT3V0LT5lbGVtZW50RXh0Qml0cyArPSBxY091dC0+cWNFbGVtZW50W2VsXS0+ZXh0Qml0c1VzZWQ7Ci0gICAgICAgICAgICBxY091dC0+c3RhdGljQml0cyAgICs9IHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5zdGF0aWNCaXRzVXNlZDsKLQotICAgICAgICAgICAgLyogc3VtIHVwIHBlICovCi0gICAgICAgICAgICBxY091dC0+dG90YWxOb1JlZFBlICs9IHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5wZURhdGEucGU7CisgICAgICAgICAgcWNPdXQtPnFjRWxlbWVudFtlbF0tPmV4dGVuc2lvbltpZHhdLnR5cGUgPQorICAgICAgICAgICAgICBleHRQYXlsb2FkW25dLmRhdGFUeXBlOyAvKiBQZXJmb3JtIGEgc2FuaXR5IGNoZWNrIG9uIHRoZSB0eXBlPyAqLworICAgICAgICAgIHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRlbnNpb25baWR4XS5uUGF5bG9hZEJpdHMgPQorICAgICAgICAgICAgICBleHRQYXlsb2FkW25dLmRhdGFTaXplOworICAgICAgICAgIHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRlbnNpb25baWR4XS5wUGF5bG9hZCA9IGV4dFBheWxvYWRbbl0ucERhdGE7CisgICAgICAgICAgLyogTm93IGFzayB0aGUgYml0c3RyZWFtIGVuY29kZXIgaG93IG1hbnkgYml0cyB3ZSBuZWVkIHRvIGVuY29kZSB0aGUKKyAgICAgICAgICAgKiBkYXRhIHdpdGggdGhlIGN1cnJlbnQgYml0c3RyZWFtIHN5bnRheDogKi8KKyAgICAgICAgICBxY091dC0+cWNFbGVtZW50W2VsXS0+ZXh0Qml0c1VzZWQgKz0gRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uRGF0YSgKKyAgICAgICAgICAgICAgTlVMTCwgJnFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRlbnNpb25baWR4XSwgMCwgMCwKKyAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5zeW50YXhGbGFncywgaEFhY0VuYy0+YW90LAorICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPmVwQ29uZmlnKTsKKyAgICAgICAgICBleHRQYXlsb2FkVXNlZFtuXSA9IDE7CiAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogc3VtIHVwIGV4dGVuc2lvbiBhbmQgc3RhdGljIGJpdHMgZm9yIGFsbCBjaGFubmVsIGVsZW1lbnRzICovCisgICAgICBxY091dC0+ZWxlbWVudEV4dEJpdHMgKz0gcWNPdXQtPnFjRWxlbWVudFtlbF0tPmV4dEJpdHNVc2VkOworICAgICAgcWNPdXQtPnN0YXRpY0JpdHMgKz0gcWNPdXQtPnFjRWxlbWVudFtlbF0tPnN0YXRpY0JpdHNVc2VkOworCisgICAgICAvKiBzdW0gdXAgcGUgKi8KKyAgICAgIHFjT3V0LT50b3RhbE5vUmVkUGUgKz0gcWNPdXQtPnFjRWxlbWVudFtlbF0tPnBlRGF0YS5wZTsKICAgICB9CisgIH0KIAotICAgIHFjT3V0LT5uRXh0ZW5zaW9ucyAgID0gMDsKLSAgICBxY091dC0+Z2xvYmFsRXh0Qml0cyA9IDA7CisgIHFjT3V0LT5uRXh0ZW5zaW9ucyA9IDA7CisgIHFjT3V0LT5nbG9iYWxFeHRCaXRzID0gMDsKIAotICAgIC8qIHJlc2V0IGV4dGVuc2lvbiBwYXlsb2FkICovCi0gICAgRkRLbWVtY2xlYXIoJnFjT3V0LT5leHRlbnNpb24sICgyKzIpKnNpemVvZihRQ19PVVRfRVhURU5TSU9OKSk7CisgIC8qIHJlc2V0IGV4dGVuc2lvbiBwYXlsb2FkICovCisgIEZES21lbWNsZWFyKCZxY091dC0+ZXh0ZW5zaW9uLCAoMiArIDIpICogc2l6ZW9mKFFDX09VVF9FWFRFTlNJT04pKTsKIAotICAgIC8qIEFkZCBleHRlbnNpb24gcGF5bG9hZCBub3QgYXNzaWduZWQgdG8gYW4gY2hhbm5lbCBlbGVtZW50Ci0gICAgICAoQW5jaWxsYXJ5IGRhdGEgaXMgdGhlIG9ubHkgc3VwcG9ydGVkIHR5cGUgdXAgdG8gbm93KSAqLwotICAgIGZvciAoIG4gPSAwOyBuIDwgTUFYX1RPVEFMX0VYVF9QQVlMT0FEUzsgbisrICkgewotICAgICAgICBpZiAoICFleHRQYXlsb2FkVXNlZFtuXQotICAgICAgICAgICYmIChleHRQYXlsb2FkW25dLmFzc29jaWF0ZWRDaEVsZW1lbnQgPT0gLTEpCi0gICAgICAgICAgJiYgKGV4dFBheWxvYWRbbl0ucERhdGEgIT0gTlVMTCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBVSU5UIHBheWxvYWRCaXRzID0gMDsKKyAgLyogQWRkIGV4dGVuc2lvbiBwYXlsb2FkIG5vdCBhc3NpZ25lZCB0byBhbiBjaGFubmVsIGVsZW1lbnQKKyAgICAoQW5jaWxsYXJ5IGRhdGEgaXMgdGhlIG9ubHkgc3VwcG9ydGVkIHR5cGUgdXAgdG8gbm93KSAqLworICBmb3IgKG4gPSAwOyBuIDwgTUFYX1RPVEFMX0VYVF9QQVlMT0FEUzsgbisrKSB7CisgICAgaWYgKCFleHRQYXlsb2FkVXNlZFtuXSAmJiAoZXh0UGF5bG9hZFtuXS5hc3NvY2lhdGVkQ2hFbGVtZW50ID09IC0xKSAmJgorICAgICAgICAoZXh0UGF5bG9hZFtuXS5wRGF0YSAhPSBOVUxMKSkgeworICAgICAgVUlOVCBwYXlsb2FkQml0cyA9IDA7CiAKLSAgICAgICAgICAgIGlmIChleHRQYXlsb2FkW25dLmRhdGFUeXBlID09IEVYVF9EQVRBX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBpZiAoaEFhY0VuYy0+YW5jaWxsYXJ5Qml0c1BlckZyYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGdyYW50ZWQgZnJhbWUgZHNlIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgcGF5bG9hZEJpdHMgPSBoQWFjRW5jLT5hbmNpbGxhcnlCaXRzUGVyRnJhbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBhbmMgZGF0YSBpZiBiaXRyYXRlIGNvbnN0cmFpbnQgZnVsZmlsbGVkICovCi0gICAgICAgICAgICAgICAgICAgIGlmICgoZXh0UGF5bG9hZFtuXS5kYXRhU2l6ZT4+MykgPD0gaEFhY0VuYy0+Y29uZmlnLT5tYXhBbmNCeXRlc1BlckFVKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkQml0cyA9IGV4dFBheWxvYWRbbl0uZGF0YVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGF5bG9hZEJpdHMgPSBmaXhNaW4oIGV4dFBheWxvYWRbbl0uZGF0YVNpemUsIHBheWxvYWRCaXRzICk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBheWxvYWRCaXRzID0gZXh0UGF5bG9hZFtuXS5kYXRhU2l6ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBheWxvYWRCaXRzID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgaWR4ID0gcWNPdXQtPm5FeHRlbnNpb25zKys7Ci0KLSAgICAgICAgICAgICAgICBxY091dC0+ZXh0ZW5zaW9uW2lkeF0udHlwZSAgICAgICAgID0gZXh0UGF5bG9hZFtuXS5kYXRhVHlwZTsgICAvKiBQZXJmb3JtIGEgc2FuaXR5IGNoZWNrIG9uIHRoZSB0eXBlPyAqLwotICAgICAgICAgICAgICAgIHFjT3V0LT5leHRlbnNpb25baWR4XS5uUGF5bG9hZEJpdHMgPSBwYXlsb2FkQml0czsKLSAgICAgICAgICAgICAgICBxY091dC0+ZXh0ZW5zaW9uW2lkeF0ucFBheWxvYWQgPSBleHRQYXlsb2FkW25dLnBEYXRhOwotICAgICAgICAgICAgICAgIC8qIE5vdyBhc2sgdGhlIGJpdHN0cmVhbSBlbmNvZGVyIGhvdyBtYW55IGJpdHMgd2UgbmVlZCB0byBlbmNvZGUgdGhlIGRhdGEgd2l0aCB0aGUgY3VycmVudCBiaXRzdHJlYW0gc3ludGF4OiAqLwotICAgICAgICAgICAgICAgIHFjT3V0LT5nbG9iYWxFeHRCaXRzICs9IEZES2FhY0VuY193cml0ZUV4dGVuc2lvbkRhdGEoIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNPdXQtPmV4dGVuc2lvbltpZHhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5zeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5hb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5lcENvbmZpZyApOwotICAgICAgICAgICAgICAgIGlmIChleHRQYXlsb2FkW25dLmRhdGFUeXBlID09IEVYVF9EQVRBX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogc3Vic3RyYWN0IHRoZSBwcm9jZXNzZWQgYml0cyAqLwotICAgICAgICAgICAgICAgICAgICBleHRQYXlsb2FkW25dLmRhdGFTaXplIC09IHBheWxvYWRCaXRzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBleHRQYXlsb2FkVXNlZFtuXSA9IDE7Ci0gICAgICAgICAgICB9CisgICAgICBpZiAoZXh0UGF5bG9hZFtuXS5kYXRhVHlwZSA9PSBFWFRfREFUQV9FTEVNRU5UKSB7CisgICAgICAgIGlmIChoQWFjRW5jLT5hbmNpbGxhcnlCaXRzUGVyRnJhbWUpIHsKKyAgICAgICAgICAvKiBncmFudGVkIGZyYW1lIGRzZSBiaXRyYXRlICovCisgICAgICAgICAgcGF5bG9hZEJpdHMgPSBoQWFjRW5jLT5hbmNpbGxhcnlCaXRzUGVyRnJhbWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogd3JpdGUgYW5jIGRhdGEgaWYgYml0cmF0ZSBjb25zdHJhaW50IGZ1bGZpbGxlZCAqLworICAgICAgICAgIGlmICgoZXh0UGF5bG9hZFtuXS5kYXRhU2l6ZSA+PiAzKSA8PQorICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPm1heEFuY0J5dGVzUGVyQVUpIHsKKyAgICAgICAgICAgIHBheWxvYWRCaXRzID0gZXh0UGF5bG9hZFtuXS5kYXRhU2l6ZTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9CisgICAgICAgIHBheWxvYWRCaXRzID0gZml4TWluKGV4dFBheWxvYWRbbl0uZGF0YVNpemUsIHBheWxvYWRCaXRzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBheWxvYWRCaXRzID0gZXh0UGF5bG9hZFtuXS5kYXRhU2l6ZTsKKyAgICAgIH0KIAotICAgIGlmICghKGhBYWNFbmMtPmNvbmZpZy0+c3ludGF4RmxhZ3MgJiAoQUNfU0NBTEFCTEV8QUNfRVIpKSkgewotICAgICAgcWNPdXQtPmdsb2JhbEV4dEJpdHMgKz0gRUxfSURfQklUUzsgIC8qIGFkZCBiaXRzIGZvciBJRF9FTkQgKi8KLSAgICB9CisgICAgICBpZiAocGF5bG9hZEJpdHMgPiAwKSB7CisgICAgICAgIGludCBpZHggPSBxY091dC0+bkV4dGVuc2lvbnMrKzsKIAotICAgIC8qIGJ1aWxkIGJpdHN0cmVhbSBhbGwgblN1YkZyYW1lcyAqLwotICAgIHsKLSAgICAgICAgSU5UIHRvdGFsQml0cyAgICA9IDA7ICAgLyogVG90YWwgQVUgYml0cyAqLzsKLSAgICAgICAgSU5UIGF2Z1RvdGFsQml0cyA9IDA7Ci0KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgICAvKiBHZXQgYXZlcmFnZSB0b3RhbCBiaXRzICovCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyogZnJhbWUgd2lzZSBiaXRyYXRlIGFkYXB0aW9uICovCi0gICAgICAgICAgICBGREthYWNFbmNfQWRqdXN0Qml0cmF0ZShoQWFjRW5jLT5xY0tlcm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXZnVG90YWxCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5iaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5zYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5mcmFtZWxlbmd0aCk7Ci0KLSAgICAgICAgICAgIC8qIGFkanVzdCBzdXBlciBmcmFtZSBiaXRyYXRlICovCi0gICAgICAgICAgICBhdmdUb3RhbEJpdHMgKj0gaEFhY0VuYy0+Y29uZmlnLT5uU3ViRnJhbWVzOworICAgICAgICBxY091dC0+ZXh0ZW5zaW9uW2lkeF0udHlwZSA9CisgICAgICAgICAgICBleHRQYXlsb2FkW25dLmRhdGFUeXBlOyAvKiBQZXJmb3JtIGEgc2FuaXR5IGNoZWNrIG9uIHRoZSB0eXBlPyAqLworICAgICAgICBxY091dC0+ZXh0ZW5zaW9uW2lkeF0ublBheWxvYWRCaXRzID0gcGF5bG9hZEJpdHM7CisgICAgICAgIHFjT3V0LT5leHRlbnNpb25baWR4XS5wUGF5bG9hZCA9IGV4dFBheWxvYWRbbl0ucERhdGE7CisgICAgICAgIC8qIE5vdyBhc2sgdGhlIGJpdHN0cmVhbSBlbmNvZGVyIGhvdyBtYW55IGJpdHMgd2UgbmVlZCB0byBlbmNvZGUgdGhlCisgICAgICAgICAqIGRhdGEgd2l0aCB0aGUgY3VycmVudCBiaXRzdHJlYW0gc3ludGF4OiAqLworICAgICAgICBxY091dC0+Z2xvYmFsRXh0Qml0cyArPSBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhKAorICAgICAgICAgICAgTlVMTCwgJnFjT3V0LT5leHRlbnNpb25baWR4XSwgMCwgMCwgaEFhY0VuYy0+Y29uZmlnLT5zeW50YXhGbGFncywKKyAgICAgICAgICAgIGhBYWNFbmMtPmFvdCwgaEFhY0VuYy0+Y29uZmlnLT5lcENvbmZpZyk7CisgICAgICAgIGlmIChleHRQYXlsb2FkW25dLmRhdGFUeXBlID09IEVYVF9EQVRBX0VMRU1FTlQpIHsKKyAgICAgICAgICAvKiBzdWJzdHJhY3QgdGhlIHByb2Nlc3NlZCBiaXRzICovCisgICAgICAgICAgZXh0UGF5bG9hZFtuXS5kYXRhU2l6ZSAtPSBwYXlsb2FkQml0czsKICAgICAgICAgfQorICAgICAgICBleHRQYXlsb2FkVXNlZFtuXSA9IDE7CisgICAgICB9CisgICAgfQorICB9CiAKLSAgICAgICAgLyogTWFrZSBmaXJzdCBlc3RpbWF0ZSBvZiB0cmFuc3BvcnQgaGVhZGVyIG92ZXJoZWFkLgotICAgICAgICAgICBUYWtlIG1heGltdW0gcG9zc2libGUgZnJhbWUgc2l6ZSBpbnRvIGFjY291bnQgdG8gcHJldmVudCBiaXRyZXNlcnZvaXIgdW5kZXJydW4uICovCi0gICAgICAgIGhBYWNFbmMtPnFjS2VybmVsLT5nbG9iSGRyQml0cyA9IHRyYW5zcG9ydEVuY19HZXRTdGF0aWNCaXRzKGhUcEVuYywgYXZnVG90YWxCaXRzICsgaEFhY0VuYy0+cWNLZXJuZWwtPmJpdFJlc1RvdCk7CisgIGlmICghKGhBYWNFbmMtPmNvbmZpZy0+c3ludGF4RmxhZ3MgJiAoQUNfU0NBTEFCTEUgfCBBQ19FUikpKSB7CisgICAgcWNPdXQtPmdsb2JhbEV4dEJpdHMgKz0gRUxfSURfQklUUzsgLyogYWRkIGJpdHMgZm9yIElEX0VORCAqLworICB9CiAKLQotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1FDTWFpbihoQWFjRW5jLT5xY0tlcm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnBzeU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnFjT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnVG90YWxCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGhBYWNFbmMtPmFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+c3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPmVwQ29uZmlnKTsKLQotICAgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKLSAgICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfdXBkYXRlRmlsbEJpdHMoY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnFjS2VybmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5xY0tlcm5lbC0+ZWxlbWVudEJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnFjT3V0KTsKLSAgICAgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCi0gICAgICAgICAgICByZXR1cm4gRXJyb3JTdGF0dXM7Ci0KLSAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0ZpbmFsaXplQml0Q29uc3VtcHRpb24oY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnFjS2VybmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXQtPnFjRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRwRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5hb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+c3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+ZXBDb25maWcpOwotICAgICAgICAgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOwotICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgICAgICAgdG90YWxCaXRzICs9IHFjT3V0LT50b3RhbEJpdHM7Ci0KLQotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgICAgIEZES2FhY0VuY191cGRhdGVCaXRyZXMoY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cWNLZXJuZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cWNPdXQpOwotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgICAgICAvKiBmb3IgKCBhbGwgc3ViIGZyYW1lcyApIC4uLiAqLwotICAgICAgICAgICAgICAvKiB3cml0ZSBiaXRzdHJlYW0gaGVhZGVyICovCi0gICAgICAgICAgICAgIHRyYW5zcG9ydEVuY19Xcml0ZUFjY2Vzc1VuaXQoCi0gICAgICAgICAgICAgICAgICAgIGhUcEVuYywKLSAgICAgICAgICAgICAgICAgICAgdG90YWxCaXRzLAotICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfRW5jQml0cmVzVG9UcEJpdHJlcyhoQWFjRW5jKSwKLSAgICAgICAgICAgICAgICAgICAgY20tPm5DaGFubmVsc0VmZik7Ci0KLSAgICAgICAgICAgICAgLyogd3JpdGUgYml0c3RyZWFtICovCi0gICAgICAgICAgICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1dyaXRlQml0c3RyZWFtKAotICAgICAgICAgICAgICAgICAgICBoVHBFbmMsCi0gICAgICAgICAgICAgICAgICAgIGNtLAotICAgICAgICAgICAgICAgICAgICBxY091dCwKLSAgICAgICAgICAgICAgICAgICAgcHN5T3V0LAotICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5xY0tlcm5lbCwKLSAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+YW90LAotICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPnN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPmVwQ29uZmlnKTsKLQotICAgICAgICAgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JTdGF0dXM7Ci0KLSAgICAgICAgICAgICAgLyogdHJhbnNwb3J0RW5jX0VuZEFjY2Vzc1VuaXQoKSBpcyBiZWluZyBjYWxsZWQgaW5zaWRlIEZES2FhY0VuY19Xcml0ZUJpdHN0cmVhbSgpICovCi0gICAgICAgICAgICAgIHRyYW5zcG9ydEVuY19HZXRGcmFtZShoVHBFbmMsIG5PdXRCeXRlcyk7Ci0KLSAgICB9IC8qIC1lbmQtIGlmIChjdXJGcmFtZT09aEFhY0VuYy0+cWNLZXJuZWwtPm5TdWJGcmFtZXMpICovCi0KKyAgLyogYnVpbGQgYml0c3RyZWFtIGFsbCBuU3ViRnJhbWVzICovCisgIHsKKyAgICBJTlQgdG90YWxCaXRzID0gMDsgLyogVG90YWwgQVUgYml0cyAqLworICAgIDsKKyAgICBJTlQgYXZnVG90YWxCaXRzID0gMDsKIAogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICByZXR1cm4gQUFDX0VOQ19PSzsKKyAgICAvKiBHZXQgYXZlcmFnZSB0b3RhbCBiaXRzICovCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIHsKKyAgICAgIC8qIGZyYW1lIHdpc2UgYml0cmF0ZSBhZGFwdGlvbiAqLworICAgICAgRkRLYWFjRW5jX0FkanVzdEJpdHJhdGUoCisgICAgICAgICAgaEFhY0VuYy0+cWNLZXJuZWwsIGNtLCAmYXZnVG90YWxCaXRzLCBoQWFjRW5jLT5jb25maWctPmJpdFJhdGUsCisgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5zYW1wbGVSYXRlLCBoQWFjRW5jLT5jb25maWctPmZyYW1lbGVuZ3RoKTsKKworICAgICAgLyogYWRqdXN0IHN1cGVyIGZyYW1lIGJpdHJhdGUgKi8KKyAgICAgIGF2Z1RvdGFsQml0cyAqPSBoQWFjRW5jLT5jb25maWctPm5TdWJGcmFtZXM7CisgICAgfQorCisgICAgLyogTWFrZSBmaXJzdCBlc3RpbWF0ZSBvZiB0cmFuc3BvcnQgaGVhZGVyIG92ZXJoZWFkLgorICAgICAgIFRha2UgbWF4aW11bSBwb3NzaWJsZSBmcmFtZSBzaXplIGludG8gYWNjb3VudCB0byBwcmV2ZW50IGJpdHJlc2Vydm9pcgorICAgICAgIHVuZGVycnVuLiAqLworICAgIGhBYWNFbmMtPnFjS2VybmVsLT5nbG9iSGRyQml0cyA9IHRyYW5zcG9ydEVuY19HZXRTdGF0aWNCaXRzKAorICAgICAgICBoVHBFbmMsIGF2Z1RvdGFsQml0cyArIGhBYWNFbmMtPnFjS2VybmVsLT5iaXRSZXNUb3QpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19RQ01haW4oCisgICAgICAgIGhBYWNFbmMtPnFjS2VybmVsLCBoQWFjRW5jLT5wc3lPdXQsIGhBYWNFbmMtPnFjT3V0LCBhdmdUb3RhbEJpdHMsIGNtLAorICAgICAgICBoQWFjRW5jLT5hb3QsIGhBYWNFbmMtPmNvbmZpZy0+c3ludGF4RmxhZ3MsIGhBYWNFbmMtPmNvbmZpZy0+ZXBDb25maWcpOworCisgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIHJldHVybiBFcnJvclN0YXR1czsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfdXBkYXRlRmlsbEJpdHMoCisgICAgICAgIGNtLCBoQWFjRW5jLT5xY0tlcm5lbCwgaEFhY0VuYy0+cWNLZXJuZWwtPmVsZW1lbnRCaXRzLCBoQWFjRW5jLT5xY091dCk7CisgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIHJldHVybiBFcnJvclN0YXR1czsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19GaW5hbGl6ZUJpdENvbnN1bXB0aW9uKAorICAgICAgICBjbSwgaEFhY0VuYy0+cWNLZXJuZWwsIHFjT3V0LCBxY091dC0+cWNFbGVtZW50LCBoVHBFbmMsIGhBYWNFbmMtPmFvdCwKKyAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5zeW50YXhGbGFncywgaEFhY0VuYy0+Y29uZmlnLT5lcENvbmZpZyk7CisgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIHJldHVybiBFcnJvclN0YXR1czsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgdG90YWxCaXRzICs9IHFjT3V0LT50b3RhbEJpdHM7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgRkRLYWFjRW5jX3VwZGF0ZUJpdHJlcyhjbSwgaEFhY0VuYy0+cWNLZXJuZWwsIGhBYWNFbmMtPnFjT3V0KTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIC8qIGZvciAoIGFsbCBzdWIgZnJhbWVzICkgLi4uICovCisgICAgLyogd3JpdGUgYml0c3RyZWFtIGhlYWRlciAqLworICAgIGlmIChUUkFOU1BPUlRFTkNfT0sgIT0KKyAgICAgICAgdHJhbnNwb3J0RW5jX1dyaXRlQWNjZXNzVW5pdChoVHBFbmMsIHRvdGFsQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfRW5jQml0cmVzVG9UcEJpdHJlcyhoQWFjRW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bkNoYW5uZWxzRWZmKSkgeworICAgICAgcmV0dXJuIEFBQ19FTkNfVU5LTk9XTjsKKyAgICB9CisKKyAgICAvKiB3cml0ZSBiaXRzdHJlYW0gKi8KKyAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Xcml0ZUJpdHN0cmVhbSgKKyAgICAgICAgaFRwRW5jLCBjbSwgcWNPdXQsIHBzeU91dCwgaEFhY0VuYy0+cWNLZXJuZWwsIGhBYWNFbmMtPmFvdCwKKyAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5zeW50YXhGbGFncywgaEFhY0VuYy0+Y29uZmlnLT5lcENvbmZpZyk7CisKKyAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgcmV0dXJuIEVycm9yU3RhdHVzOworCisgICAgLyogdHJhbnNwb3J0RW5jX0VuZEFjY2Vzc1VuaXQoKSBpcyBiZWluZyBjYWxsZWQgaW5zaWRlCisgICAgICogRkRLYWFjRW5jX1dyaXRlQml0c3RyZWFtKCkgKi8KKyAgICBpZiAoVFJBTlNQT1JURU5DX09LICE9IHRyYW5zcG9ydEVuY19HZXRGcmFtZShoVHBFbmMsIG5PdXRCeXRlcykpIHsKKyAgICAgIHJldHVybiBBQUNfRU5DX1VOS05PV047CisgICAgfQorCisgIH0gLyogLWVuZC0gaWYgKGN1ckZyYW1lPT1oQWFjRW5jLT5xY0tlcm5lbC0+blN1YkZyYW1lcykgKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIHJldHVybiBBQUNfRU5DX09LOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtOTkwLDI5ICs5NjQsMjcgQEAKIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi12b2lkIEZES2FhY0VuY19DbG9zZSggSEFORExFX0FBQ19FTkMqICBwaEFhY0VuYykgICAvKiBlbmNvZGVyIGhhbmRsZSAqLwordm9pZCBGREthYWNFbmNfQ2xvc2UoSEFORExFX0FBQ19FTkMgKnBoQWFjRW5jKSAvKiBlbmNvZGVyIGhhbmRsZSAqLwogewotICAgIGlmICgqcGhBYWNFbmMgPT0gTlVMTCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBQUNfRU5DICpoQWFjRW5jID0gKEFBQ19FTkMqKSpwaEFhY0VuYzsKKyAgaWYgKCpwaEFhY0VuYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIEFBQ19FTkMgKmhBYWNFbmMgPSAoQUFDX0VOQyAqKSpwaEFhY0VuYzsKIAotICAgaWYgKGhBYWNFbmMtPmR5bmFtaWNfUkFNICE9IE5VTEwpCi0gICAgICAgRnJlZUFBQ2R5bmFtaWNfUkFNKCZoQWFjRW5jLT5keW5hbWljX1JBTSk7CisgIGlmIChoQWFjRW5jLT5keW5hbWljX1JBTSAhPSBOVUxMKSBGcmVlQUFDZHluYW1pY19SQU0oJmhBYWNFbmMtPmR5bmFtaWNfUkFNKTsKIAotICAgIEZES2FhY0VuY19Qc3lDbG9zZSgmaEFhY0VuYy0+cHN5S2VybmVsLGhBYWNFbmMtPnBzeU91dCk7CisgIEZES2FhY0VuY19Qc3lDbG9zZSgmaEFhY0VuYy0+cHN5S2VybmVsLCBoQWFjRW5jLT5wc3lPdXQpOwogCi0gICAgRkRLYWFjRW5jX1FDQ2xvc2UoJmhBYWNFbmMtPnFjS2VybmVsLCBoQWFjRW5jLT5xY091dCk7CisgIEZES2FhY0VuY19RQ0Nsb3NlKCZoQWFjRW5jLT5xY0tlcm5lbCwgaEFhY0VuYy0+cWNPdXQpOwogCi0gICAgRnJlZVJhbV9hYWNFbmNfQWFjRW5jb2RlcihwaEFhY0VuYyk7CisgIEZyZWVSYW1fYWFjRW5jX0FhY0VuY29kZXIocGhBYWNFbmMpOwogfQogCi0KIC8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBpbiB0aGlzIHNvdXJjZSBmaWxlIG9ubHkgZm9yIGNvbnZlbmllbmNlIGFuZCAqLwogLyogbmVlZCBub3QgYmUgdmlzaWJsZSBvdXRzaWRlIG9mIGEgcG9zc2libGUgZW5jb2RlciBsaWJyYXJ5LiAqLwogCiAvKiBiYXNpYyBkZWZpbmVzIGZvciBhbmNpbGxhcnkgZGF0YSAqLwotI2RlZmluZSBNQVhfQU5DUkFURSAxOTIwMCAgICAgICAgICAgIC8qIGFuY2lsbGFyeSByYXRlID49IDE5MjAwIGlzbid0IHZhbGlkICovCisjZGVmaW5lIE1BWF9BTkNSQVRFIDE5MjAwIC8qIGFuY2lsbGFyeSByYXRlID49IDE5MjAwIGlzbid0IHZhbGlkICovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTEwMjEsNDIgKzk5MywzMyBAQAogICAgIHJldHVybjogICAgICAgIGlmIHN1Y2Nlc3Mgb3IgTlVMTCBpZiBlcnJvcgogCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRDaGVja0FuY2lsbGFyeShJTlQgYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBmcmFtZWxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBhbmNpbGxhcnlSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICphbmNpbGxhcnlCaXRzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSkKLXsKLSAgSU5UIGRpZmZUb0J5dGVBbGlnbjsKLQorc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0Q2hlY2tBbmNpbGxhcnkoCisgICAgSU5UIGJpdFJhdGUsIElOVCBmcmFtZWxlbmd0aCwgSU5UIGFuY2lsbGFyeVJhdGUsIElOVCAqYW5jaWxsYXJ5Qml0c1BlckZyYW1lLAorICAgIElOVCBzYW1wbGVSYXRlKSB7CiAgIC8qIGRvbid0IHVzZSBuZWdhdGl2ZSBhbmNpbGxhcnkgcmF0ZXMgKi8KLSAgaWYgKCBhbmNpbGxhcnlSYXRlIDwgLTEgKQotICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0FOQ19CSVRSQVRFOworICBpZiAoYW5jaWxsYXJ5UmF0ZSA8IC0xKSByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9BTkNfQklUUkFURTsKIAogICAvKiBjaGVjayBpZiBhbmNpbGxhcnkgcmF0ZSBpcyBvayAqLwotICBpZiAoIChhbmNpbGxhcnlSYXRlICE9ICgtMSkpICYmIChhbmNpbGxhcnlSYXRlICE9IDApICkgeworICBpZiAoKGFuY2lsbGFyeVJhdGUgIT0gKC0xKSkgJiYgKGFuY2lsbGFyeVJhdGUgIT0gMCkpIHsKICAgICAvKiBhbmNSYXRlIDw9IDE1JSBvZiBiaXRyYXRlICYmIGFuY1JhdGUgPCAxOTIwMCAqLwotICAgIGlmICggKCBhbmNpbGxhcnlSYXRlID49IE1BWF9BTkNSQVRFICkgfHwKLSAgICAgICAgICggKGFuY2lsbGFyeVJhdGUgKiAyMCkgPiAoYml0UmF0ZSAqIDMpICkgKSB7CisgICAgaWYgKChhbmNpbGxhcnlSYXRlID49IE1BWF9BTkNSQVRFKSB8fAorICAgICAgICAoKGFuY2lsbGFyeVJhdGUgKiAyMCkgPiAoYml0UmF0ZSAqIDMpKSkgewogICAgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQU5DX0JJVFJBVEU7CiAgICAgfQotICB9Ci0gIGVsc2UgaWYgKGFuY2lsbGFyeVJhdGUgPT0gLTEpIHsKKyAgfSBlbHNlIGlmIChhbmNpbGxhcnlSYXRlID09IC0xKSB7CiAgICAgLyogaWYgbm8gc3BlY2lhbCBhbmNSYXRlIGlzIHJlcXVlc3RlZCBidXQgYSBhbmNpbGxhcnkgZmlsZSBpcwogICAgICAgIHN0YXRlZCwgdGhlbiBnZW5lcmF0ZSBhIGFuY2lsbGFyeSByYXRlIG1hdGNoaW5nIHRvIHRoZSBiaXRyYXRlICovCiAgICAgaWYgKGJpdFJhdGUgPj0gKE1BWF9BTkNSQVRFICogMTApKSB7CiAgICAgICAvKiBhbmNpbGxhcnkgcmF0ZSBpcyAxOTE5OSAqLwogICAgICAgYW5jaWxsYXJ5UmF0ZSA9IChNQVhfQU5DUkFURSAtIDEpOwotICAgIH0KLSAgICBlbHNlIHsgLyogMTAlIG9mIGJpdHJhdGUgKi8KKyAgICB9IGVsc2UgeyAvKiAxMCUgb2YgYml0cmF0ZSAqLwogICAgICAgYW5jaWxsYXJ5UmF0ZSA9IGJpdFJhdGUgLyAxMDsKICAgICB9CiAgIH0KIAogICAvKiBtYWtlIGFuY2lsbGFyeUJpdHNQZXJGcmFtZSBieXRlIGFsaWduICovCi0gICphbmNpbGxhcnlCaXRzUGVyRnJhbWUgPSAoYW5jaWxsYXJ5UmF0ZSAqIGZyYW1lbGVuZ3RoICkgLyBzYW1wbGVSYXRlOwotICBkaWZmVG9CeXRlQWxpZ24gPSAqYW5jaWxsYXJ5Qml0c1BlckZyYW1lICUgODsKLSAgKmFuY2lsbGFyeUJpdHNQZXJGcmFtZSA9ICphbmNpbGxhcnlCaXRzUGVyRnJhbWUgLSBkaWZmVG9CeXRlQWxpZ247CisgICphbmNpbGxhcnlCaXRzUGVyRnJhbWUgPQorICAgICAgRkRLYWFjRW5jX0NhbGNCaXRzUGVyRnJhbWUoYW5jaWxsYXJ5UmF0ZSwgZnJhbWVsZW5ndGgsIHNhbXBsZVJhdGUpICYgfjB4NzsKIAogICByZXR1cm4gQUFDX0VOQ19PSzsKIH0KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvYWFjZW5jLmggYi9saWJBQUNlbmMvc3JjL2FhY2VuYy5oCmluZGV4IDc5NTI0YjUuLjBlMGQ4YzEgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvYWFjZW5jLmgKKysrIGIvbGliQUFDZW5jL3NyYy9hYWNlbmMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNyArOTAsMTggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiAgRmFzdCBNUEVHIEFBQyBBdWRpbyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gU2NodWcgLyBBLiBHcm9lc2NoZWwKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBmYXN0IGFhYyBjb2RlciBpbnRlcmZhY2UgbGlicmFyeSBmdW5jdGlvbnMKKyAgIEF1dGhvcihzKTogICBNLiBTY2h1ZyAvIEEuIEdyb2VzY2hlbAogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogZmFzdCBhYWMgY29kZXIgaW50ZXJmYWNlIGxpYnJhcnkgZnVuY3Rpb25zCiAKLSNpZm5kZWYgX2FhY2VuY19oXwotI2RlZmluZSBfYWFjZW5jX2hfCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFBQ0VOQ19ICisjZGVmaW5lIEFBQ0VOQ19ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCkBAIC05OCwxMCArMTEwLDcgQEAKIAogI2luY2x1ZGUgInNicl9lbmNvZGVyLmgiCiAKLSNkZWZpbmUgQklUUkVTX01BWF9MRCAgIDQwMDAKLSNkZWZpbmUgQklUUkVTX01JTl9MRCAgICA1MDAKLSNkZWZpbmUgQklUUkFURV9NQVhfTEQgNzAwMDAgLyogTWF4IGFzc3VtZWQgYml0cmF0ZSBmb3IgYml0cmVzIGNhbGN1bGF0aW9uICovCi0jZGVmaW5lIEJJVFJBVEVfTUlOX0xEIDEyMDAwIC8qIE1pbiBhc3N1bWVkIGJpdHJhdGUgZm9yIGJpdHJlcyBjYWxjdWxhdGlvbiAqLworI2RlZmluZSBNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4gNjE0NAogCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewpAQCAtMTExLDE5MiArMTIwLDIxOCBAQAogICogQUFDLUxDIGVycm9yIGNvZGVzLgogICovCiB0eXBlZGVmIGVudW0gewotICBBQUNfRU5DX09LICAgICAgID0gMHgwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBbGwgZmluZS4gKi8KKyAgQUFDX0VOQ19PSyA9IDB4MDAwMCwgLyohPCBBbGwgZmluZS4gKi8KIAotICBBQUNfRU5DX1VOS05PV04gID0gMHgwMDAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFcnJvciBjb25kaXRpb24gaXMgb2YgdW5rbm93biByZWFzb24sIG9yIGZyb20gYW5vdGhlciBtb2R1bGUuICAgICAgICAgICAgICAqLworICBBQUNfRU5DX1VOS05PV04gPSAweDAwMDIsIC8qITwgRXJyb3IgY29uZGl0aW9uIGlzIG9mIHVua25vd24gcmVhc29uLCBvciBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vdGhlciBtb2R1bGUuICAgICAgICAgICAgICAqLwogCiAgIC8qIGluaXRpYWxpemF0aW9uIGVycm9ycyAqLwotICBhYWNfZW5jX2luaXRfZXJyb3Jfc3RhcnQgICAgICA9IDB4MjAwMCwKLSAgQUFDX0VOQ19JTlZBTElEX0hBTkRMRSAgICAgICAgPSAweDIwMjAsICAgICAgICAgICAgIC8qITwgVGhlIGhhbmRsZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIGNhbGwgd2FzIGludmFsaWQgKHByb2JhYmx5IE5VTEwpLiAgICAgICAgKi8KLSAgQUFDX0VOQ19JTlZBTElEX0ZSQU1FX0xFTkdUSCAgPSAweDIwODAsICAgICAgICAgICAgIC8qITwgSW52YWxpZCBmcmFtZSBsZW5ndGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQUFDX0VOQ19JTlZBTElEX05fQ0hBTk5FTFMgICAgPSAweDIwZTAsICAgICAgICAgICAgIC8qITwgSW52YWxpZCBhbW91bnQgb2YgYXVkaW8gaW5wdXQgY2hhbm5lbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQUFDX0VOQ19JTlZBTElEX1NGQl9UQUJMRSAgICAgPSAweDIxNDAsICAgICAgICAgICAgIC8qITwgSW50ZXJuYWwgZW5jb2RlciBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgYWFjX2VuY19pbml0X2Vycm9yX3N0YXJ0ID0gMHgyMDAwLAorICBBQUNfRU5DX0lOVkFMSURfSEFORExFID0gMHgyMDIwLCAvKiE8IFRoZSBoYW5kbGUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcyBpbnZhbGlkIChwcm9iYWJseSBOVUxMKS4gICAgICAgICovCisgIEFBQ19FTkNfSU5WQUxJRF9GUkFNRV9MRU5HVEggPQorICAgICAgMHgyMDgwLCAvKiE8IEludmFsaWQgZnJhbWUgbGVuZ3RoIChtdXN0IGJlIDEwMjQgb3IgOTYwKS4gKi8KKyAgQUFDX0VOQ19JTlZBTElEX05fQ0hBTk5FTFMgPQorICAgICAgMHgyMGUwLCAvKiE8IEludmFsaWQgYW1vdW50IG9mIGF1ZGlvIGlucHV0IGNoYW5uZWxzLiAqLworICBBQUNfRU5DX0lOVkFMSURfU0ZCX1RBQkxFID0gMHgyMTQwLCAvKiE8IEludGVybmFsIGVuY29kZXIgZXJyb3IuICovCiAKLSAgQUFDX0VOQ19VTlNVUFBPUlRFRF9BT1QgICAgICAgICAgICA9IDB4MzAwMCwgICAgICAgIC8qITwgVGhlIEF1ZGlvIE9iamVjdCBUeXBlIChBT1QpIGlzIG5vdCBzdXBwb3J0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQUFDX0VOQ19VTlNVUFBPUlRFRF9CSVRSQVRFICAgICAgICA9IDB4MzAyMCwgICAgICAgIC8qITwgVGhlIGNob3NlbiBiaXRyYXRlIGlzIG5vdCBzdXBwb3J0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQUFDX0VOQ19VTlNVUFBPUlRFRF9CSVRSQVRFX01PREUgICA9IDB4MzAyOCwgICAgICAgIC8qITwgVW5zdXBwb3J0ZWQgYml0IHJhdGUgbW9kZSAoQ0JSIG9yIFZCUikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQUFDX0VOQ19VTlNVUFBPUlRFRF9BTkNfQklUUkFURSAgICA9IDB4MzA0MCwgICAgICAgIC8qITwgVW5zdXBwb3J0ZWQgYW5jaWxsYXkgYml0cmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQUFDX0VOQ19VTlNVUFBPUlRFRF9BTkNfTU9ERSAgICAgICA9IDB4MzA2MCwKLSAgQUFDX0VOQ19VTlNVUFBPUlRFRF9UUkFOU1BPUlRfVFlQRSA9IDB4MzA4MCwgICAgICAgIC8qITwgVGhlIGJpdHN0cmVhbSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQUFDX0VOQ19VTlNVUFBPUlRFRF9FUl9GT1JNQVQgICAgICA9IDB4MzBhMCwgICAgICAgIC8qITwgVGhlIGVycm9yIHJlc2lsaWVuY2UgdG9vbCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQUFDX0VOQ19VTlNVUFBPUlRFRF9FUENPTkZJRyAgICAgICA9IDB4MzBjMCwgICAgICAgIC8qITwgVGhlIGVycm9yIHByb3RlY3Rpb24gZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQUFDX0VOQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHICA9IDB4MzBlMCwgICAgICAgIC8qITwgVGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbiAoZWl0aGVyIG51bWJlciBvciBhcnJhbmdlbWVudCkgaXMgbm90IHN1cHBvcnRlZC4gKi8KLSAgQUFDX0VOQ19VTlNVUFBPUlRFRF9TQU1QTElOR1JBVEUgICA9IDB4MzEwMCwgICAgICAgIC8qITwgU2FtcGxlIHJhdGUgb2YgYXVkaW8gaW5wdXQgaXMgbm90IHN1cHBvcnRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQUFDX0VOQ19OT19NRU1PUlkgICAgICAgICAgICAgICAgICA9IDB4MzEyMCwgICAgICAgIC8qITwgQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeS4gKi8KLSAgQUFDX0VOQ19QRV9JTklUX1RBQkxFX05PVF9GT1VORCAgICA9IDB4MzE0MCwgICAgICAgIC8qITwgSW50ZXJuYWwgZW5jb2RlciBlcnJvci4gICAgKi8KKyAgQUFDX0VOQ19VTlNVUFBPUlRFRF9BT1QgPQorICAgICAgMHgzMDAwLCAvKiE8IFRoZSBBdWRpbyBPYmplY3QgVHlwZSAoQU9UKSBpcyBub3Qgc3VwcG9ydGVkLiAqLworICBBQUNfRU5DX1VOU1VQUE9SVEVEX0ZJTFRFUkJBTksgPQorICAgICAgMHgzMDEwLCAvKiE8IEZpbHRlcmJhbmsgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLiAqLworICBBQUNfRU5DX1VOU1VQUE9SVEVEX0JJVFJBVEUgPQorICAgICAgMHgzMDIwLCAvKiE8IFRoZSBjaG9zZW4gYml0cmF0ZSBpcyBub3Qgc3VwcG9ydGVkLiAqLworICBBQUNfRU5DX1VOU1VQUE9SVEVEX0JJVFJBVEVfTU9ERSA9CisgICAgICAweDMwMjgsIC8qITwgVW5zdXBwb3J0ZWQgYml0IHJhdGUgbW9kZSAoQ0JSIG9yIFZCUikuICovCisgIEFBQ19FTkNfVU5TVVBQT1JURURfQU5DX0JJVFJBVEUgPQorICAgICAgMHgzMDQwLCAvKiE8IFVuc3VwcG9ydGVkIGFuY2lsbGF5IGJpdHJhdGUuICovCisgIEFBQ19FTkNfVU5TVVBQT1JURURfQU5DX01PREUgPSAweDMwNjAsCisgIEFBQ19FTkNfVU5TVVBQT1JURURfVFJBTlNQT1JUX1RZUEUgPQorICAgICAgMHgzMDgwLCAvKiE8IFRoZSBiaXRzdHJlYW0gZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuICovCisgIEFBQ19FTkNfVU5TVVBQT1JURURfRVJfRk9STUFUID0KKyAgICAgIDB4MzBhMCwgLyohPCBUaGUgZXJyb3IgcmVzaWxpZW5jZSB0b29sIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiAqLworICBBQUNfRU5DX1VOU1VQUE9SVEVEX0VQQ09ORklHID0KKyAgICAgIDB4MzBjMCwgLyohPCBUaGUgZXJyb3IgcHJvdGVjdGlvbiBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4gKi8KKyAgQUFDX0VOQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHID0KKyAgICAgIDB4MzBlMCwgLyohPCBUaGUgY2hhbm5lbCBjb25maWd1cmF0aW9uIChlaXRoZXIgbnVtYmVyIG9yIGFycmFuZ2VtZW50KSBpcworICAgICAgICAgICAgICAgICBub3Qgc3VwcG9ydGVkLiAqLworICBBQUNfRU5DX1VOU1VQUE9SVEVEX1NBTVBMSU5HUkFURSA9CisgICAgICAweDMxMDAsIC8qITwgU2FtcGxlIHJhdGUgb2YgYXVkaW8gaW5wdXQgaXMgbm90IHN1cHBvcnRlZC4gKi8KKyAgQUFDX0VOQ19OT19NRU1PUlkgPSAweDMxMjAsICAgICAgICAgICAgICAgLyohPCBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5LiAqLworICBBQUNfRU5DX1BFX0lOSVRfVEFCTEVfTk9UX0ZPVU5EID0gMHgzMTQwLCAvKiE8IEludGVybmFsIGVuY29kZXIgZXJyb3IuICAgICovCiAKICAgYWFjX2VuY19pbml0X2Vycm9yX2VuZCwKIAogICAvKiBlbmNvZGUgZXJyb3JzICovCi0gIGFhY19lbmNfZXJyb3Jfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAwLAotICBBQUNfRU5DX1FVQU5UX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAyMCwgICAgICAgLyohPCBUb28gbWFueSBiaXRzIHVzZWQgaW4gcXVhbnRpemF0aW9uLiAgICAgICAgICAgICAqLwotICBBQUNfRU5DX1dSSVRURU5fQklUU19FUlJPUiAgICAgICAgICAgICAgICA9IDB4NDA0MCwgICAgICAgLyohPCBVbmV4cGVjdGVkIG51bWJlciBvZiB3cml0dGVuIGJpdHMsIGRpZmZlcnMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlZCBudW1iZXIgb2YgYml0cy4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQUFDX0VOQ19QTlNfVEFCTEVfRVJST1IgICAgICAgICAgICAgICAgICAgPSAweDQwNjAsICAgICAgIC8qITwgUE5TIGxldmVsIG91dCBvZiByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQUFDX0VOQ19HTE9CQUxfR0FJTl9UT09fSElHSCAgICAgICAgICAgICAgPSAweDQwODAsICAgICAgIC8qITwgSW50ZXJuYWwgcXVhbnRpemVyIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQUFDX0VOQ19CSVRSRVNfVE9PX0xPVyAgICAgICAgICAgICAgICAgICAgPSAweDQwYTAsICAgICAgIC8qITwgVG9vIGZldyAgYml0cyBpbiBiaXQgcmVzZXJ2b2lyLiAgICAgICAgICAgICAgICAgKi8KLSAgQUFDX0VOQ19CSVRSRVNfVE9PX0hJR0ggICAgICAgICAgICAgICAgICAgPSAweDQwYTEsICAgICAgIC8qITwgVG9vIG1hbnkgYml0cyBpbiBiaXQgcmVzZXJ2b2lyLiAgICAgICAgICAgICAgICAgKi8KLSAgQUFDX0VOQ19JTlZBTElEX0NIQU5ORUxfQklUUkFURSAgICAgICAgICAgPSAweDQxMDAsCi0gIEFBQ19FTkNfSU5WQUxJRF9FTEVNRU5USU5GT19UWVBFICAgICAgICAgID0gMHg0MTIwLCAgICAgICAvKiE8IEludGVybmFsIGVuY29kZXIgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGFhY19lbmNfZXJyb3Jfc3RhcnQgPSAweDQwMDAsCisgIEFBQ19FTkNfUVVBTlRfRVJST1IgPSAweDQwMjAsIC8qITwgVG9vIG1hbnkgYml0cyB1c2VkIGluIHF1YW50aXphdGlvbi4gKi8KKyAgQUFDX0VOQ19XUklUVEVOX0JJVFNfRVJST1IgPQorICAgICAgMHg0MDQwLCAvKiE8IFVuZXhwZWN0ZWQgbnVtYmVyIG9mIHdyaXR0ZW4gYml0cywgZGlmZmVycyB0bworICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWQgbnVtYmVyIG9mIGJpdHMuICAgICAgICAgICAgICAgICAgICAgICovCisgIEFBQ19FTkNfUE5TX1RBQkxFX0VSUk9SID0gMHg0MDYwLCAgICAgIC8qITwgUE5TIGxldmVsIG91dCBvZiByYW5nZS4gICAgICAqLworICBBQUNfRU5DX0dMT0JBTF9HQUlOX1RPT19ISUdIID0gMHg0MDgwLCAvKiE8IEludGVybmFsIHF1YW50aXplciBlcnJvci4gKi8KKyAgQUFDX0VOQ19CSVRSRVNfVE9PX0xPVyA9IDB4NDBhMCwgLyohPCBUb28gZmV3ICBiaXRzIGluIGJpdCByZXNlcnZvaXIuICAgICAgICovCisgIEFBQ19FTkNfQklUUkVTX1RPT19ISUdIID0gMHg0MGExLCAvKiE8IFRvbyBtYW55IGJpdHMgaW4gYml0IHJlc2Vydm9pci4gICAgICAqLworICBBQUNfRU5DX0lOVkFMSURfQ0hBTk5FTF9CSVRSQVRFID0gMHg0MTAwLAorICBBQUNfRU5DX0lOVkFMSURfRUxFTUVOVElORk9fVFlQRSA9IDB4NDEyMCwgLyohPCBJbnRlcm5hbCBlbmNvZGVyIGVycm9yLiAqLwogCi0gIEFBQ19FTkNfV1JJVEVfU0NBTF9FUlJPUiAgICAgICAgICAgICAgICAgID0gMHg0MWUwLCAgICAgICAvKiE8IEVycm9yIHdyaXRpbmcgc2NhbGVmYWNEYXRhLiAgICAgICAgICAgICAgICAgICAgICovCi0gIEFBQ19FTkNfV1JJVEVfU0VDX0VSUk9SICAgICAgICAgICAgICAgICAgID0gMHg0MjAwLCAgICAgICAvKiE8IEVycm9yIHdyaXRpbmcgc2VjdGlvbkRhdGEuICAgICAgICAgICAgICAgICAgICAgICovCi0gIEFBQ19FTkNfV1JJVEVfU1BFQ19FUlJPUiAgICAgICAgICAgICAgICAgID0gMHg0MjIwLCAgICAgICAvKiE8IEVycm9yIHdyaXRpbmcgc3BlY3RyYWxEYXRhLiAgICAgICAgICAgICAgICAgICAgICovCisgIEFBQ19FTkNfV1JJVEVfU0NBTF9FUlJPUiA9IDB4NDFlMCwgLyohPCBFcnJvciB3cml0aW5nIHNjYWxlZmFjRGF0YS4gKi8KKyAgQUFDX0VOQ19XUklURV9TRUNfRVJST1IgPSAweDQyMDAsICAvKiE8IEVycm9yIHdyaXRpbmcgc2VjdGlvbkRhdGEuICAqLworICBBQUNfRU5DX1dSSVRFX1NQRUNfRVJST1IgPSAweDQyMjAsIC8qITwgRXJyb3Igd3JpdGluZyBzcGVjdHJhbERhdGEuICovCiAgIGFhY19lbmNfZXJyb3JfZW5kCiAKIH0gQUFDX0VOQ09ERVJfRVJST1I7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jZGVmaW5lIEFOQ19EQVRBX0JVRkZFUlNJWkUgMTAyNCAgICAgIC8qIGFuY0J1ZmZlciBzaXplICovCisjZGVmaW5lIEFOQ19EQVRBX0JVRkZFUlNJWkUgMTAyNCAvKiBhbmNCdWZmZXIgc2l6ZSAqLwogCi0jZGVmaW5lIE1BWF9UT1RBTF9FWFRfUEFZTE9BRFMgICgoKDgpICogKDEpKSArICgyKzIpKQotCisjZGVmaW5lIE1BWF9UT1RBTF9FWFRfUEFZTE9BRFMgKCgoKDgpKSAqICgxKSkgKyAoMiArIDIpKQogCiB0eXBlZGVmIGVudW0gewotICBBQUNFTkNfQlJfTU9ERV9JTlZBTElEID0gLTEsICAvKiE8IEludmFsaWQgYml0cmF0ZSBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBQUNFTkNfQlJfTU9ERV9DQlIgICAgID0gIDAsICAvKiE8IENvbnN0YW50IGJpdHJhdGUgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBQUNFTkNfQlJfTU9ERV9WQlJfMSAgID0gIDEsICAvKiE8IFZhcmlhYmxlIGJpdHJhdGUgbW9kZSwgYWJvdXQgMzIga2Jwcy9jaGFubmVsLiAgICAqLwotICBBQUNFTkNfQlJfTU9ERV9WQlJfMiAgID0gIDIsICAvKiE8IFZhcmlhYmxlIGJpdHJhdGUgbW9kZSwgYWJvdXQgNDAga2Jwcy9jaGFubmVsLiAgICAqLwotICBBQUNFTkNfQlJfTU9ERV9WQlJfMyAgID0gIDMsICAvKiE8IFZhcmlhYmxlIGJpdHJhdGUgbW9kZSwgYWJvdXQgNDgtNTYga2Jwcy9jaGFubmVsLiAqLwotICBBQUNFTkNfQlJfTU9ERV9WQlJfNCAgID0gIDQsICAvKiE8IFZhcmlhYmxlIGJpdHJhdGUgbW9kZSwgYWJvdXQgNjQga2Jwcy9jaGFubmVsLiAgICAqLwotICBBQUNFTkNfQlJfTU9ERV9WQlJfNSAgID0gIDUsICAvKiE8IFZhcmlhYmxlIGJpdHJhdGUgbW9kZSwgYWJvdXQgODAtOTYga2Jwcy9jaGFubmVsLiAqLwotICBBQUNFTkNfQlJfTU9ERV9GRiAgICAgID0gIDYsICAvKiE8IEZpeGVkIGZyYW1lIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBQUNFTkNfQlJfTU9ERV9TRlIgICAgID0gIDcgICAvKiE8IFN1cGVyZnJhbWUgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBQUNFTkNfQlJfTU9ERV9JTlZBTElEID0gLTEsIC8qITwgSW52YWxpZCBiaXRyYXRlIG1vZGUuICovCisgIEFBQ0VOQ19CUl9NT0RFX0NCUiA9IDAsICAgICAgLyohPCBDb25zdGFudCBiaXRyYXRlIG1vZGUuICAgICAgKi8KKyAgQUFDRU5DX0JSX01PREVfVkJSXzEgPSAxLCAvKiE8IFZhcmlhYmxlIGJpdHJhdGUgbW9kZSwgdmVyeSBsb3cgYml0cmF0ZS4gICAgKi8KKyAgQUFDRU5DX0JSX01PREVfVkJSXzIgPSAyLCAvKiE8IFZhcmlhYmxlIGJpdHJhdGUgbW9kZSwgbG93IGJpdHJhdGUuICAgICovCisgIEFBQ0VOQ19CUl9NT0RFX1ZCUl8zID0gMywgLyohPCBWYXJpYWJsZSBiaXRyYXRlIG1vZGUsIG1lZGl1bSBiaXRyYXRlLiAgICAqLworICBBQUNFTkNfQlJfTU9ERV9WQlJfNCA9IDQsIC8qITwgVmFyaWFibGUgYml0cmF0ZSBtb2RlLCBoaWdoIGJpdHJhdGUuICAgICovCisgIEFBQ0VOQ19CUl9NT0RFX1ZCUl81ID0gNSwgLyohPCBWYXJpYWJsZSBiaXRyYXRlIG1vZGUsIHZlcnkgaGlnaCBiaXRyYXRlLiAgICAqLworICBBQUNFTkNfQlJfTU9ERV9GRiA9IDYsICAgIC8qITwgRml4ZWQgZnJhbWUgbW9kZS4gICAgICAgKi8KKyAgQUFDRU5DX0JSX01PREVfU0ZSID0gNyAgICAvKiE8IFN1cGVyZnJhbWUgbW9kZS4gICAgICAgKi8KIAogfSBBQUNFTkNfQklUUkFURV9NT0RFOwogCisjZGVmaW5lIEFBQ0VOQ19CUl9NT0RFX0lTX1ZCUihick1vZGUpICgoYnJNb2RlID49IDEpICYmIChick1vZGUgPD0gNSkpCisKIHR5cGVkZWYgZW51bSB7CiAKLSAgQ0hfT1JERVJfTVBFRyA9IDAsICAvKiE8IE1QRUcgY2hhbm5lbCBvcmRlcmluZyAoZS4gZy4gNS4xOiBDLCBMLCBSLCBTTCwgU1IsIExGRSkgICAgICAgICAgICovCi0gIENIX09SREVSX1dBViAgICAgICAgLyohPCBXQVYgZmlsZWZvcm1hdCBjaGFubmVsIG9yZGVyaW5nIChlLiBnLiA1LjE6IEwsIFIsIEMsIExGRSwgU0wsIFNSKSAqLworICBDSF9PUkRFUl9NUEVHID0KKyAgICAgIDAsIC8qITwgTVBFRyBjaGFubmVsIG9yZGVyaW5nIChlLiBnLiA1LjE6IEMsIEwsIFIsIFNMLCBTUiwgTEZFKSAgICAgICAqLworICBDSF9PUkRFUl9XQVYgLyohPCBXQVYgZmlsZWZvcm1hdCBjaGFubmVsIG9yZGVyaW5nIChlLiBnLiA1LjE6IEwsIFIsIEMsIExGRSwKKyAgICAgICAgICAgICAgICAgIFNMLCBTUikgKi8KIAogfSBDSEFOTkVMX09SREVSOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0cnVjdHVyZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBzdHJ1Y3QgQUFDRU5DX0NPTkZJRyB7Ci0gIElOVCAgIHNhbXBsZVJhdGU7ICAgICAgICAgICAgIC8qIGVuY29kZXIgc2FtcGxlIHJhdGUgKi8KLSAgSU5UICAgYml0UmF0ZTsgICAgICAgICAgICAgICAgLyogZW5jb2RlciBiaXQgcmF0ZSBpbiBiaXRzL3NlYyAqLwotICBJTlQgICBhbmNEYXRhQml0UmF0ZTsgICAgICAgICAvKiBhZGRpdGlvbmFsIGJpdHMgY29uc3VtZWQgYnkgYW5jIGRhdGEgb3Igc2JyIGhhdmUgdG8gYmUgY29uc2llZGVyZWQgd2hpbGUgY29uZmlndXJhdGlvbiAqLworICBJTlQgc2FtcGxlUmF0ZTsgICAgIC8qIGVuY29kZXIgc2FtcGxlIHJhdGUgKi8KKyAgSU5UIGJpdFJhdGU7ICAgICAgICAvKiBlbmNvZGVyIGJpdCByYXRlIGluIGJpdHMvc2VjICovCisgIElOVCBhbmNEYXRhQml0UmF0ZTsgLyogYWRkaXRpb25hbCBiaXRzIGNvbnN1bWVkIGJ5IGFuYyBkYXRhIG9yIHNiciBoYXZlIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2llZGVyZWQgd2hpbGUgY29uZmlndXJhdGlvbiAqLwogCi0gIElOVCAgIG5TdWJGcmFtZXM7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBmcmFtZXMgaW4gc3VwZXIgZnJhbWUgKG5vdCBBRFRTL0xBVE0gc3ViZnJhbWVzICEpICovCi0gIEFVRElPX09CSkVDVF9UWVBFIGF1ZGlvT2JqZWN0VHlwZTsgICAvKiBBdWRpbyBPYmplY3QgVHlwZSAgKi8KKyAgSU5UIG5TdWJGcmFtZXM7IC8qIG51bWJlciBvZiBmcmFtZXMgaW4gc3VwZXIgZnJhbWUgKG5vdCBBRFRTL0xBVE0gc3ViZnJhbWVzICEpCisgICAgICAgICAgICAgICAgICAgKi8KKyAgQVVESU9fT0JKRUNUX1RZUEUgYXVkaW9PYmplY3RUeXBlOyAvKiBBdWRpbyBPYmplY3QgVHlwZSAgKi8KIAotICBJTlQgICBhdmVyYWdlQml0czsgICAgICAgICAgICAvKiBlbmNvZGVyIGJpdCByYXRlIGluIGJpdHMvc3VwZXJmcmFtZSAqLwotICBJTlQgICBiaXRyYXRlTW9kZTsgICAgICAgICAgICAvKiBlbmNvZGVyIGJpdHJhdGUgbW9kZSAoQ0JSL1ZCUikgKi8KLSAgSU5UICAgbkNoYW5uZWxzOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzIHRvIHByb2Nlc3MgKi8KLSAgQ0hBTk5FTF9PUkRFUiBjaGFubmVsT3JkZXI7ICAgLyogSW5wdXQgQ2hhbm5lbCBvcmRlcmluZyBzY2hlbWUuICovCi0gIElOVCAgIGJhbmRXaWR0aDsgICAgICAgICAgICAgIC8qIHRhcmdldGVkIGF1ZGlvIGJhbmR3aWR0aCBpbiBIeiAqLwotICBDSEFOTkVMX01PREUgIGNoYW5uZWxNb2RlOyAgICAvKiBlbmNvZGVyIGNoYW5uZWwgbW9kZSBjb25maWd1cmF0aW9uICovCi0gIElOVCAgIGZyYW1lbGVuZ3RoOyAgICAgICAgICAgIC8qIHVzZWQgZnJhbWUgc2l6ZSAqLworICBJTlQgYXZlcmFnZUJpdHM7ICAgICAgICAgICAgICAgICAvKiBlbmNvZGVyIGJpdCByYXRlIGluIGJpdHMvc3VwZXJmcmFtZSAqLworICBBQUNFTkNfQklUUkFURV9NT0RFIGJpdHJhdGVNb2RlOyAvKiBlbmNvZGVyIGJpdHJhdGUgbW9kZSAoQ0JSL1ZCUikgKi8KKyAgSU5UIG5DaGFubmVsczsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzIHRvIHByb2Nlc3MgKi8KKyAgQ0hBTk5FTF9PUkRFUiBjaGFubmVsT3JkZXI7ICAgICAgLyogaW5wdXQgQ2hhbm5lbCBvcmRlcmluZyBzY2hlbWUuICovCisgIElOVCBiYW5kV2lkdGg7ICAgICAgICAgICAgICAgICAgIC8qIHRhcmdldGVkIGF1ZGlvIGJhbmR3aWR0aCBpbiBIeiAqLworICBDSEFOTkVMX01PREUgY2hhbm5lbE1vZGU7ICAgICAgICAvKiBlbmNvZGVyIGNoYW5uZWwgbW9kZSBjb25maWd1cmF0aW9uICovCisgIElOVCBmcmFtZWxlbmd0aDsgICAgICAgICAgICAgICAgIC8qIHVzZWQgZnJhbWUgc2l6ZSAqLwogCi0gIFVJTlQgIHN5bnRheEZsYWdzOyAgICAgICAgICAgIC8qIGJpdHN0cmVhbXMgc3ludGF4IGNvbmZpZ3VyYXRpb24gKi8KLSAgU0NIQVIgZXBDb25maWc7ICAgICAgICAgICAgICAgLyogZXJyb3IgcHJvdGVjdGlvbiBjb25maWd1cmF0aW9uICovCisgIFVJTlQgc3ludGF4RmxhZ3M7IC8qIGJpdHN0cmVhbXMgc3ludGF4IGNvbmZpZ3VyYXRpb24gKi8KKyAgU0NIQVIgZXBDb25maWc7ICAgLyogZXJyb3IgcHJvdGVjdGlvbiBjb25maWd1cmF0aW9uICovCiAKLSAgSU5UICAgYW5jX1JhdGU7ICAgICAgICAgICAgICAgLyogYW5jaWxsYXJ5IHJhdGUsIDAgKGRpc2FibGVkKSwgLTEgKGRlZmF1bHQpIGVsc2UgZGVzaXJlZCByYXRlICovCi0gIFVJTlQgIG1heEFuY0J5dGVzUGVyQVU7Ci0gIElOVCAgIG1pbkJpdHNQZXJGcmFtZTsgICAgICAgIC8qIG1pbmltdW0gbnVtYmVyIG9mIGJpdHMgaW4gQVUgKi8KLSAgSU5UICAgbWF4Qml0c1BlckZyYW1lOyAgICAgICAgLyogbWF4aW11bSBudW1iZXIgb2YgYml0cyBpbiBBVSAqLwotICBJTlQgICBiaXRyZXNlcnZvaXI7ICAgICAgICAgICAvKiBzaXplIG9mIGJpdHJlc2Vydm9pciAqLworICBJTlQgYW5jX1JhdGU7IC8qIGFuY2lsbGFyeSByYXRlLCAwIChkaXNhYmxlZCksIC0xIChkZWZhdWx0KSBlbHNlIGRlc2lyZWQgcmF0ZQorICAgICAgICAgICAgICAgICAqLworICBVSU5UIG1heEFuY0J5dGVzUGVyQVU7CisgIElOVCBtaW5CaXRzUGVyRnJhbWU7IC8qIG1pbmltdW0gbnVtYmVyIG9mIGJpdHMgaW4gQVUgKi8KKyAgSU5UIG1heEJpdHNQZXJGcmFtZTsgLyogbWF4aW11bSBudW1iZXIgb2YgYml0cyBpbiBBVSAqLwogCi0gIElOVCAgIGF1ZGlvTXV4VmVyc2lvbjsgICAgICAgIC8qIGF1ZGlvIG11eCB2ZXJzaW9uIGluIGxvYXMvbGF0bSB0cmFuc3BvcnQgZm9ybWF0ICovCisgIElOVCBhdWRpb011eFZlcnNpb247IC8qIGF1ZGlvIG11eCB2ZXJzaW9uIGluIGxvYXMvbGF0bSB0cmFuc3BvcnQgZm9ybWF0ICovCiAKLSAgVUlOVCAgc2JyUmF0aW87ICAgICAgICAgICAgICAgLyogc2JyIHNhbXBsaW5nIHJhdGUgcmF0aW86IGR1YWwtIG9yIHNpbmdsZS1yYXRlICovCisgIFVJTlQgc2JyUmF0aW87IC8qIHNiciBzYW1wbGluZyByYXRlIHJhdGlvOiBkdWFsLSBvciBzaW5nbGUtcmF0ZSAqLwogCi0gIFVDSEFSIHVzZVRuczsgICAgICAgICAgICAgICAgIC8qIGZsYWc6IHVzZSB0ZW1wb3JhbCBub2lzZSBzaGFwaW5nICovCi0gIFVDSEFSIHVzZVBuczsgICAgICAgICAgICAgICAgIC8qIGZsYWc6IHVzZSBwZXJjZXB0dWFsIG5vaXNlIHN1YnN0aXR1dGlvbiAqLwotICBVQ0hBUiB1c2VJUzsgICAgICAgICAgICAgICAgICAvKiBmbGFnOiB1c2UgaW50ZW5zaXR5IGNvZGluZyAqLworICBVQ0hBUiB1c2VUbnM7IC8qIGZsYWc6IHVzZSB0ZW1wb3JhbCBub2lzZSBzaGFwaW5nICovCisgIFVDSEFSIHVzZVBuczsgLyogZmxhZzogdXNlIHBlcmNlcHR1YWwgbm9pc2Ugc3Vic3RpdHV0aW9uICovCisgIFVDSEFSIHVzZUlTOyAgLyogZmxhZzogdXNlIGludGVuc2l0eSBjb2RpbmcgKi8KKyAgVUNIQVIgdXNlTVM7ICAvKiBmbGFnOiB1c2UgbXMgc3RlcmVvIHRvb2wgKi8KIAotICBVQ0hBUiB1c2VSZXF1YW50OyAgICAgICAgICAgICAvKiBmbGFnOiB1c2UgYWZ0ZXJidXJuZXIgKi8KKyAgVUNIQVIgdXNlUmVxdWFudDsgLyogZmxhZzogdXNlIGFmdGVyYnVybmVyICovCisKKyAgVUlOVCBkb3duc2NhbGVGYWN0b3I7CiB9OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIFVDSEFSICAgICAgICAgICAgKnBEYXRhOyAgICAgIC8qIHBvaW50ZXIgdG8gZXh0ZW5zaW9uIHBheWxvYWQgZGF0YSAqLwotICBVSU5UICAgICAgICAgICAgICBkYXRhU2l6ZTsgICAvKiBleHRlbnNpb24gcGF5bG9hZCBkYXRhIHNpemUgaW4gYml0cyAqLwotICBFWFRfUEFZTE9BRF9UWVBFICBkYXRhVHlwZTsgICAvKiBleHRlbnNpb24gcGF5bG9hZCBkYXRhIHR5cGUgKi8KLSAgSU5UICAgICAgICAgICAgICAgYXNzb2NpYXRlZENoRWxlbWVudDsgIC8qIG51bWJlciBvZiB0aGUgY2hhbm5lbCBlbGVtZW50IHRoZSBkYXRhIGlzIGFzc2lnbmVkIHRvICovCisgIFVDSEFSICpwRGF0YTsgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gZXh0ZW5zaW9uIHBheWxvYWQgZGF0YSAqLworICBVSU5UIGRhdGFTaXplOyAgICAgICAgICAgICAvKiBleHRlbnNpb24gcGF5bG9hZCBkYXRhIHNpemUgaW4gYml0cyAqLworICBFWFRfUEFZTE9BRF9UWVBFIGRhdGFUeXBlOyAvKiBleHRlbnNpb24gcGF5bG9hZCBkYXRhIHR5cGUgKi8KKyAgSU5UIGFzc29jaWF0ZWRDaEVsZW1lbnQ7IC8qIG51bWJlciBvZiB0aGUgY2hhbm5lbCBlbGVtZW50IHRoZSBkYXRhIGlzIGFzc2lnbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byAqLwogfSBBQUNFTkNfRVhUX1BBWUxPQUQ7CiAKIHR5cGVkZWYgc3RydWN0IEFBQ19FTkMgKkhBTkRMRV9BQUNfRU5DOwogCiAvKioKLSAqIFxicmllZiBDYWxjdWxhdGUgZnJhbWVzaXplIGluIGJpdHMgZm9yIGdpdmVuIGJpdCByYXRlLCBmcmFtZSBsZW5ndGggYW5kIHNhbXBsaW5nIHJhdGUuCisgKiBcYnJpZWYgQ2FsY3VsYXRlIGZyYW1lc2l6ZSBpbiBiaXRzIGZvciBnaXZlbiBiaXQgcmF0ZSwgZnJhbWUgbGVuZ3RoIGFuZAorICogc2FtcGxpbmcgcmF0ZS4KICAqCiAgKiBccGFyYW0gYml0UmF0ZSAgICAgICAgICAgICAgIFR0YXJnZXQgYml0cmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQuCiAgKiBccGFyYW0gZnJhbWVMZW5ndGggICAgICAgICAgIE51bWJlciBvZiBhdWRpbyBzYW1wbGVzIGluIG9uZSBmcmFtZS4KICAqIFxwYXJhbSBzYW1wbGluZ1JhdGUgICAgICAgICAgU2FtcGxpbmcgcmF0ZSBpbiBIei4KICAqCiAgKiBccmV0dXJuICAgICAgICAgICAgICAgICAgICAgIEZyYW1lc2l6ZSBpbiBiaXRzIHBlciBmcmFtZS4KLSovCi1JTlQgRkRLYWFjRW5jX0NhbGNCaXRzUGVyRnJhbWUoCi0gICAgICAgIGNvbnN0IElOVCBiaXRSYXRlLAotICAgICAgICBjb25zdCBJTlQgZnJhbWVMZW5ndGgsCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGluZ1JhdGUKLSAgICAgICAgKTsKKyAqLworSU5UIEZES2FhY0VuY19DYWxjQml0c1BlckZyYW1lKGNvbnN0IElOVCBiaXRSYXRlLCBjb25zdCBJTlQgZnJhbWVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nUmF0ZSk7CiAKIC8qKgotICogXGJyaWVmIENhbGN1bGF0ZSBiaXRyYXRlIGluIGJpdHMgcGVyIHNlY29uZCBmb3IgZ2l2ZW4gZnJhbWVzaXplLCBmcmFtZSBsZW5ndGggYW5kIHNhbXBsaW5nIHJhdGUuCisgKiBcYnJpZWYgQ2FsY3VsYXRlIGJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kIGZvciBnaXZlbiBmcmFtZXNpemUsIGZyYW1lIGxlbmd0aAorICogYW5kIHNhbXBsaW5nIHJhdGUuCiAgKgotICogXHBhcmFtIGJpdHNQZXJGcmFtZSAgICAgICAgICBGcmFtZXNpemUgaW4gYml0cyBwZXIgZnJhbWUuCisgKiBccGFyYW0gYml0c1BlckZyYW1lICAgICAgICAgIEZyYW1lc2l6ZSBpbiBiaXRzIHBlciBmcmFtZQogICogXHBhcmFtIGZyYW1lTGVuZ3RoICAgICAgICAgICBOdW1iZXIgb2YgYXVkaW8gc2FtcGxlcyBpbiBvbmUgZnJhbWUuCiAgKiBccGFyYW0gc2FtcGxpbmdSYXRlICAgICAgICAgIFNhbXBsaW5nIHJhdGUgaW4gSHouCiAgKgogICogXHJldHVybiAgICAgICAgICAgICAgICAgICAgICBCaXRyYXRlIGluIGJpdHMgcGVyIHNlY29uZC4KLSovCi1JTlQgRkRLYWFjRW5jX0NhbGNCaXRyYXRlKAotICAgICAgICBjb25zdCBJTlQgYml0c1BlckZyYW1lLAotICAgICAgICBjb25zdCBJTlQgZnJhbWVMZW5ndGgsCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGluZ1JhdGUKLSAgICAgICAgKTsKKyAqLworSU5UIEZES2FhY0VuY19DYWxjQml0cmF0ZShjb25zdCBJTlQgYml0c1BlckZyYW1lLCBjb25zdCBJTlQgZnJhbWVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzYW1wbGluZ1JhdGUpOwogCiAvKioKICAqIFxicmllZiBMaW1pdCBnaXZlbiBiaXQgcmF0ZSB0byBhIHZhbGlkIHZhbHVlCiAgKiBccGFyYW0gaFRwRW5jIHRyYW5zcG9ydCBlbmNvZGVyIGhhbmRsZQorICogXHBhcmFtIGFvdCBhdWRpbyBvYmplY3QgdHlwZQogICogXHBhcmFtIGNvcmVTYW1wbGluZ1JhdGUgdGhlIHNhbXBsZSByYXRlIHRvIGJlIHVzZWQgZm9yIHRoZSBBQUMgZW5jb2RlcgogICogXHBhcmFtIGZyYW1lTGVuZ3RoIHRoZSBmcmFtZUxlbmd0aCB0byBiZSB1c2VkIGZvciB0aGUgQUFDIGVuY29kZXIKICAqIFxwYXJhbSBuQ2hhbm5lbHMgbnVtYmVyIG9mIHRvdGFsIGNoYW5uZWxzCiAgKiBccGFyYW0gbkNoYW5uZWxzRWZmIG51bWJlciBvZiBlZmZlY3RpdmUgY2hhbm5lbHMKLSAqIFxwYXJhbSBiaXRSYXRlIHRoZSBpbml0aWFsIGJpdCByYXRlIHZhbHVlIGZvciB3aGljaCB0aGUgY2xvc2VzdCB2YWxpZCBiaXQgcmF0ZSB2YWx1ZSBpcyBzZWFyY2hlZCBmb3IKLSAqIFxwYXJhbSBhdmVyYWdlQml0cyBhdmVyYWdlIGJpdHMgcGVyIGZyYW1lIGZvciBmaXhlZCBmcmFtaW5nLiBTZXQgdG8gLTEgaWYgbm90IGF2YWlsYWJsZS4KKyAqIFxwYXJhbSBiaXRSYXRlIHRoZSBpbml0aWFsIGJpdCByYXRlIHZhbHVlIGZvciB3aGljaCB0aGUgY2xvc2VzdCB2YWxpZCBiaXQKKyAqIHJhdGUgdmFsdWUgaXMgc2VhcmNoZWQgZm9yCisgKiBccGFyYW0gYXZlcmFnZUJpdHMgYXZlcmFnZSBiaXRzIHBlciBmcmFtZSBmb3IgZml4ZWQgZnJhbWluZy4gU2V0IHRvIC0xIGlmIG5vdAorICogYXZhaWxhYmxlLgogICogXHBhcmFtIG9wdGlvbmFsIHBvaW50ZXIgd2hlcmUgdGhlIGN1cnJlbnQgYml0cyBwZXIgZnJhbWUgYXJlIHN0b3JlZCBpbnRvLgogICogXHBhcmFtIGJpdHJhdGVNb2RlIHRoZSBjdXJyZW50IGJpdCByYXRlIG1vZGUKLSAqIFxwYXJhbSBuU3ViRnJhbWVzIG51bWJlciBvZiBzdWIgZnJhbWVzIGZvciBzdXBlciBmcmFtaW5nIChub3QgdHJhbnNwb3J0IGZyYW1lcykuCisgKiBccGFyYW0gblN1YkZyYW1lcyBudW1iZXIgb2Ygc3ViIGZyYW1lcyBmb3Igc3VwZXIgZnJhbWluZyAobm90IHRyYW5zcG9ydAorICogZnJhbWVzKS4KICAqIFxyZXR1cm4gYSB2YWxpZCBiaXQgcmF0ZSB2YWx1ZSBhcyBjbG9zZSBhcyBwb3NzaWJsZSBvciBpZGVudGljYWwgdG8gYml0UmF0ZQogICovCi1JTlQgRkRLYWFjRW5jX0xpbWl0Qml0cmF0ZSgKLSAgICAgICAgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCi0gICAgICAgIElOVCBjb3JlU2FtcGxpbmdSYXRlLAotICAgICAgICBJTlQgZnJhbWVMZW5ndGgsCi0gICAgICAgIElOVCBuQ2hhbm5lbHMsCi0gICAgICAgIElOVCBuQ2hhbm5lbHNFZmYsCi0gICAgICAgIElOVCBiaXRSYXRlLAotICAgICAgICBJTlQgYXZlcmFnZUJpdHMsCi0gICAgICAgIElOVCAqcEF2ZXJhZ2VCaXRzUGVyRnJhbWUsCi0gICAgICAgIElOVCBiaXRyYXRlTW9kZSwKLSAgICAgICAgSU5UIG5TdWJGcmFtZXMKLSAgICAgICAgKTsKK0lOVCBGREthYWNFbmNfTGltaXRCaXRyYXRlKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLCBBVURJT19PQkpFQ1RfVFlQRSBhb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY29yZVNhbXBsaW5nUmF0ZSwgSU5UIGZyYW1lTGVuZ3RoLCBJTlQgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5DaGFubmVsc0VmZiwgSU5UIGJpdFJhdGUsIElOVCBhdmVyYWdlQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcEF2ZXJhZ2VCaXRzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNFTkNfQklUUkFURV9NT0RFIGJpdHJhdGVNb2RlLCBJTlQgblN1YkZyYW1lcyk7CiAKLSAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKioKKyAqIFxicmllZiBHZXQgY3VycmVudCBzdGF0ZSBvZiB0aGUgYml0IHJlc2Vydm9pcgorICogXHBhcmFtIGhBYWNFbmNvZGVyIGVuY29kZXIgaGFuZGxlCisgKiBccmV0dXJuIGJpdCByZXNlcnZvaXIgc3RhdGUgaW4gYml0cworICovCitJTlQgRkRLYWFjRW5jX0dldEJpdFJlc2Vydm9pclN0YXRlKGNvbnN0IEhBTkRMRV9BQUNfRU5DIGhBYWNFbmNvZGVyKTsKIAotICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19HZXRWQlJCaXRyYXRlCi0gICAgIGRlc2NyaXB0aW9uOiAgR2V0IFZCUiBiaXRyYXRlIGZyb20gdmJyIHF1YWxpdHkKLSAgICAgaW5wdXQgcGFyYW1zOiBpbnQgdmJyUXVhbGl0eSAoVkJSMCwgVkJSMSwgVkJSMikKLSAgICAgICAgICAgICAgICAgICBjaGFubmVsTW9kZQotICAgICByZXR1cm5zOiAgICAgIHZiciBiaXRyYXRlCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotIElOVCBGREthYWNFbmNfR2V0VkJSQml0cmF0ZShJTlQgYml0cmF0ZU1vZGUsIENIQU5ORUxfTU9ERSBjaGFubmVsTW9kZSk7CisgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfR2V0VkJSQml0cmF0ZQorICAgIGRlc2NyaXB0aW9uOiAgR2V0IFZCUiBiaXRyYXRlIGZyb20gdmJyIHF1YWxpdHkKKyAgICBpbnB1dCBwYXJhbXM6IGludCB2YnJRdWFsaXR5IChWQlIwLCBWQlIxLCBWQlIyKQorICAgICAgICAgICAgICAgICAgY2hhbm5lbE1vZGUKKyAgICByZXR1cm5zOiAgICAgIHZiciBiaXRyYXRlCiAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitJTlQgRkRLYWFjRW5jX0dldFZCUkJpdHJhdGUoQUFDRU5DX0JJVFJBVEVfTU9ERSBiaXRyYXRlTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01PREUgY2hhbm5lbE1vZGUpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTMwNSwyNiArMzQwLDI3IEBACiAgICAgIHJldHVybnM6ICAgICAgLS0tCiAKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBGREthYWNFbmNfQWFjSW5pdERlZmF1bHRDb25maWcoQUFDRU5DX0NPTkZJRyAgICAgKmNvbmZpZyk7Cit2b2lkIEZES2FhY0VuY19BYWNJbml0RGVmYXVsdENvbmZpZyhBQUNFTkNfQ09ORklHICpjb25maWcpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0JICAgIGZ1bmN0aW9ubmFtZTpGREthYWNFbmNfT3BlbgorICAgIGZ1bmN0aW9ubmFtZTpGREthYWNFbmNfT3BlbgogICAgIGRlc2NyaXB0aW9uOiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBlbmNvZGVyIGluc3RhbmNlCiAgICAgcmV0dXJuczogICAgIDAgaWYgc3VjY2VzcwogCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfT3BlbihIQU5ETEVfQUFDX0VOQyAgKnBoQWFjRW5jLCAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBhbiBlbmNvZGVyIGhhbmRsZSwgaW5pdGlhbGl6ZWQgb24gcmV0dXJuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIG5FbGVtZW50cywgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG1heGltYWwgZWxlbWVudHMgaW4gaW5zdGFuY2UgdG8gc3VwcG9ydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBuQ2hhbm5lbHMsICAgICAgICAgICAgIC8qIG51bWJlciBvZiBtYXhpbWFsIGNoYW5uZWxzIGluIGluc3RhbmNlIHRvIHN1cHBvcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgblN1YkZyYW1lcyk7ICAgICAgICAgICAvKiBzdXBwb3J0IHN1cGVyZnJhbWluZyBpbiBpbnN0YW5jZSAqLworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX09wZW4oCisgICAgSEFORExFX0FBQ19FTkMKKyAgICAgICAgKnBoQWFjRW5jLCAvKiBwb2ludGVyIHRvIGFuIGVuY29kZXIgaGFuZGxlLCBpbml0aWFsaXplZCBvbiByZXR1cm4gKi8KKyAgICBjb25zdCBJTlQgbkVsZW1lbnRzLCAvKiBudW1iZXIgb2YgbWF4aW1hbCBlbGVtZW50cyBpbiBpbnN0YW5jZSB0byBzdXBwb3J0ICovCisgICAgY29uc3QgSU5UIG5DaGFubmVscywgLyogbnVtYmVyIG9mIG1heGltYWwgY2hhbm5lbHMgaW4gaW5zdGFuY2UgdG8gc3VwcG9ydCAqLworICAgIGNvbnN0IElOVCBuU3ViRnJhbWVzKTsgLyogc3VwcG9ydCBzdXBlcmZyYW1pbmcgaW4gaW5zdGFuY2UgKi8KIAotCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdGlhbGl6ZShIQU5ETEVfQUFDX0VOQyAgICAgaEFhY0VuY29kZXIsICAgLyogcG9pbnRlciB0byBhbiBlbmNvZGVyIGhhbmRsZSwgaW5pdGlhbGl6ZWQgb24gcmV0dXJuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNFTkNfQ09ORklHICAgICpjb25maWcsICAgICAgICAgLyogcHJlLWluaXRpYWxpemVkIGNvbmZpZyBzdHJ1Y3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgICAgICAgICAgICAgICBpbml0RmxhZ3MpOwotCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdGlhbGl6ZSgKKyAgICBIQU5ETEVfQUFDX0VOQworICAgICAgICBoQWFjRW5jb2RlciwgLyogcG9pbnRlciB0byBhbiBlbmNvZGVyIGhhbmRsZSwgaW5pdGlhbGl6ZWQgb24gcmV0dXJuICovCisgICAgQUFDRU5DX0NPTkZJRyAqY29uZmlnLCAvKiBwcmUtaW5pdGlhbGl6ZWQgY29uZmlnIHN0cnVjdCAqLworICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLCBVTE9ORyBpbml0RmxhZ3MpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0zMzQsMTIgKzM3MCwxMSBAQAogCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19FbmNvZGVGcmFtZSggSEFORExFX0FBQ19FTkMgICAgICAgaEFhY0VuYywgICAgICAgICAvKiBlbmNvZGVyIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfVFJBTlNQT1JURU5DICBoVHBFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00qICAgICAgICAgICAgIGlucHV0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQqICAgICAgICAgICAgICAgICBudW1PdXRCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDRU5DX0VYVF9QQVlMT0FEICAgZXh0UGF5bG9hZFtNQVhfVE9UQUxfRVhUX1BBWUxPQURTXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19FbmNvZGVGcmFtZSgKKyAgICBIQU5ETEVfQUFDX0VOQyBoQWFjRW5jLCAvKiBlbmNvZGVyIGhhbmRsZSAqLworICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLCBJTlRfUENNICppbnB1dEJ1ZmZlciwKKyAgICBjb25zdCBVSU5UIGlucHV0QnVmZmVyQnVmU2l6ZSwgSU5UICpudW1PdXRCeXRlcywKKyAgICBBQUNFTkNfRVhUX1BBWUxPQUQgZXh0UGF5bG9hZFtNQVhfVE9UQUxfRVhUX1BBWUxPQURTXSk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTM0OSwxMSArMzg0LDEwIEBACiAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdm9pZCBGREthYWNFbmNfQ2xvc2UoIEhBTkRMRV9BQUNfRU5DKiAgcGhBYWNFbmMpOyAgIC8qIGVuY29kZXIgaGFuZGxlICovCit2b2lkIEZES2FhY0VuY19DbG9zZShIQU5ETEVfQUFDX0VOQyAqcGhBYWNFbmMpOyAvKiBlbmNvZGVyIGhhbmRsZSAqLwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgogCi0jZW5kaWYgLyogX2FhY2VuY19oXyAqLwotCisjZW5kaWYgLyogQUFDRU5DX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX2xpYi5jcHAgYi9saWJBQUNlbmMvc3JjL2FhY2VuY19saWIuY3BwCmluZGV4IDY0NDQ1YjkuLjExZGIzZGEgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX2xpYi5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9hYWNlbmNfbGliLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHLTQgSEUtQUFDIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gTG9od2Fzc2VyCi0gIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBGREsgSEUtQUFDIEVuY29kZXIgaW50ZXJmYWNlIGxpYnJhcnkgZnVuY3Rpb25zCisgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogRkRLIEhFLUFBQyBFbmNvZGVyIGludGVyZmFjZSBsaWJyYXJ5IGZ1bmN0aW9ucworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiYWFjZW5jX2xpYi5oIgogI2luY2x1ZGUgIkZES19hdWRpby5oIgpAQCAtOTYsOSArMTA4LDkgQEAKICNpbmNsdWRlICJGREtfY29yZS5oIiAvKiBGREtfdG9vbHMgdmVyc2lvbmluZyBpbmZvICovCiAKIC8qIEVuY29kZXIgbGlicmFyeSBpbmZvICovCi0jZGVmaW5lIEFBQ0VOQ09ERVJfTElCX1ZMMCAzCi0jZGVmaW5lIEFBQ0VOQ09ERVJfTElCX1ZMMSA0Ci0jZGVmaW5lIEFBQ0VOQ09ERVJfTElCX1ZMMiAyMgorI2RlZmluZSBBQUNFTkNPREVSX0xJQl9WTDAgNAorI2RlZmluZSBBQUNFTkNPREVSX0xJQl9WTDEgMAorI2RlZmluZSBBQUNFTkNPREVSX0xJQl9WTDIgMAogI2RlZmluZSBBQUNFTkNPREVSX0xJQl9USVRMRSAiQUFDIEVuY29kZXIiCiAjaWZkZWYgX19BTkRST0lEX18KICNkZWZpbmUgQUFDRU5DT0RFUl9MSUJfQlVJTERfREFURSAiIgpAQCAtMTA4LDkgKzEyMCwxMCBAQAogI2RlZmluZSBBQUNFTkNPREVSX0xJQl9CVUlMRF9USU1FIF9fVElNRV9fCiAjZW5kaWYKIAorI2luY2x1ZGUgInBjbV91dGlscy5oIgogCiAjaW5jbHVkZSAic2JyX2VuY29kZXIuaCIKLSNpbmNsdWRlICIuLi9zcmMvc2JyX3JhbS5oIgorI2luY2x1ZGUgIi4uL3NyYy9zYnJlbmNfcmFtLmgiCiAjaW5jbHVkZSAiY2hhbm5lbF9tYXAuaCIKIAogI2luY2x1ZGUgInBzeV9jb25zdC5oIgpAQCAtMTE5LDI2MCArMTMyLDI5NyBAQAogI2luY2x1ZGUgInRwZW5jX2xpYi5oIgogCiAjaW5jbHVkZSAibWV0YWRhdGFfbWFpbi5oIgorI2luY2x1ZGUgIm1wc19tYWluLmgiCisjaW5jbHVkZSAic2FjZW5jX2xpYi5oIgogCi0jZGVmaW5lIFNCTChmbCkgICAgICAgICAgICAoZmwvOCkgICAgICAgICAgICAgICAgIC8qITwgU2hvcnQgYmxvY2sgbGVuZ3RoIChoYXJkY29kZWQgdG8gOCBzaG9ydCBibG9ja3MgcGVyIGxvbmcgYmxvY2spICovCi0jZGVmaW5lIEJTTEEoZmwpICAgICAgICAgICAoNCpTQkwoZmwpK1NCTChmbCkvMikgIC8qITwgQUFDIGJsb2NrIHN3aXRjaGluZyBsb29rLWFoZWFkICovCi0jZGVmaW5lIERFTEFZX0FBQyhmbCkgICAgICAoZmwrQlNMQShmbCkpICAgICAgICAgIC8qITwgTURDVCArIGJsb2Nrc3dpdGNoaW5nICovCi0jZGVmaW5lIERFTEFZX0FBQ0VMRChmbCkgICAoKGZsKS8yKSAgICAgICAgICAgICAgIC8qITwgRUxEIEZCIGRlbGF5IChubyBmcmFtaW5nIGRlbGF5IGluY2x1ZGVkKSAqLworI2RlZmluZSBTQkwoZmwpIFwKKyAgKGZsIC8gICAgICAgICBcCisgICA4KSAvKiE8IFNob3J0IGJsb2NrIGxlbmd0aCAoaGFyZGNvZGVkIHRvIDggc2hvcnQgYmxvY2tzIHBlciBsb25nIGJsb2NrKSAqLworI2RlZmluZSBCU0xBKGZsKSBcCisgICg0ICogU0JMKGZsKSArIFNCTChmbCkgLyAyKSAgICAgICAgIC8qITwgQUFDIGJsb2NrIHN3aXRjaGluZyBsb29rLWFoZWFkICovCisjZGVmaW5lIERFTEFZX0FBQyhmbCkgKGZsICsgQlNMQShmbCkpIC8qITwgTURDVCArIGJsb2Nrc3dpdGNoaW5nICovCisjZGVmaW5lIERFTEFZX0FBQ0xEKGZsKSAoZmwpIC8qITwgTURDVCBkZWxheSAobm8gZnJhbWluZyBkZWxheSBpbmNsdWRlZCkgKi8KKyNkZWZpbmUgREVMQVlfQUFDRUxEKGZsKSBcCisgICgoZmwpIC8gMikgLyohPCBFTEQgRkIgZGVsYXkgKG5vIGZyYW1pbmcgZGVsYXkgaW5jbHVkZWQpICovCiAKLSNkZWZpbmUgSU5QVVRCVUZGRVJfU0laRSAoMTUzNysxMDArMjA0OCkKKyNkZWZpbmUgTUFYX0RTX0RFTEFZICgxMDApIC8qITwgTWF4aW11bSBkb3duc2FtcGxlciBkZWxheSBpbiBTQlIuICovCisjZGVmaW5lIElOUFVUQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoMiAqICgxMDI0KSArIE1BWF9EU19ERUxBWSArIDE1MzcpIC8qITwgQXVkaW8gaW5wdXQgc2FtcGxlcyArIGRvd25zYW1wbGVyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheSArIHNici9hYWMgZGVsYXkgY29tcGVuc2F0aW9uICovCiAKLSNkZWZpbmUgREVGQVVMVF9IRUFERVJfUEVSSU9EX1JFUEVUSVRJT05fUkFURSAgMTAgLyohPCBEZWZhdWx0IGhlYWRlciByZXBldGl0aW9uIHJhdGUgdXNlZCBpbiB0cmFuc3BvcnQgbGlicmFyeSBhbmQgZm9yIFNCUiBoZWFkZXIuICovCisjZGVmaW5lIERFRkFVTFRfSEVBREVSX1BFUklPRF9SRVBFVElUSU9OX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAxMCAvKiE8IERlZmF1bHQgaGVhZGVyIHJlcGV0aXRpb24gcmF0ZSB1c2VkIGluIHRyYW5zcG9ydCBsaWJyYXJ5IGFuZCBmb3IgU0JSIFwKKyAgICAgICAgaGVhZGVyLiAqLwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8qKgogICogRmxhZ3MgdG8gY2hhcmFjdGVyaXplIGVuY29kZXIgbW9kdWxlcyB0byBiZSBzdXBwb3J0ZWQgaW4gcHJlc2VudCBpbnN0YW5jZS4KICAqLwogZW51bSB7Ci0gICAgRU5DX01PREVfRkxBR19BQUMgID0gMHgwMDAxLAotICAgIEVOQ19NT0RFX0ZMQUdfU0JSICA9IDB4MDAwMiwKLSAgICBFTkNfTU9ERV9GTEFHX1BTICAgPSAweDAwMDQsCi0gICAgRU5DX01PREVfRkxBR19TQUMgID0gMHgwMDA4LAotICAgIEVOQ19NT0RFX0ZMQUdfTUVUQSA9IDB4MDAxMAorICBFTkNfTU9ERV9GTEFHX0FBQyA9IDB4MDAwMSwKKyAgRU5DX01PREVfRkxBR19TQlIgPSAweDAwMDIsCisgIEVOQ19NT0RFX0ZMQUdfUFMgPSAweDAwMDQsCisgIEVOQ19NT0RFX0ZMQUdfU0FDID0gMHgwMDA4LAorICBFTkNfTU9ERV9GTEFHX01FVEEgPSAweDAwMTAKIH07CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogdHlwZWRlZiBzdHJ1Y3QgewotICAgIEFVRElPX09CSkVDVF9UWVBFIHVzZXJBT1Q7ICAgICAgICAgICAgICAgLyohPCBBdWRpbyBPYmplY3QgVHlwZS4gICAgICAgICAgICAgKi8KLSAgICBVSU5UICAgICAgICAgICAgICB1c2VyU2FtcGxlcmF0ZTsgICAgICAgIC8qITwgU2FtcGxpbmcgZnJlcXVlbmN5LiAgICAgICAgICAgICovCi0gICAgVUlOVCAgICAgICAgICAgICAgbkNoYW5uZWxzOyAgICAgICAgICAgICAvKiE8IHdpbGwgYmUgc2V0IHZpYSBjaGFubmVsTW9kZS4gICAqLwotICAgIENIQU5ORUxfTU9ERSAgICAgIHVzZXJDaGFubmVsTW9kZTsKLSAgICBVSU5UICAgICAgICAgICAgICB1c2VyQml0cmF0ZTsKLSAgICBVSU5UICAgICAgICAgICAgICB1c2VyQml0cmF0ZU1vZGU7Ci0gICAgVUlOVCAgICAgICAgICAgICAgdXNlckJhbmR3aWR0aDsKLSAgICBVSU5UICAgICAgICAgICAgICB1c2VyQWZ0ZXJidXJuZXI7Ci0gICAgVUlOVCAgICAgICAgICAgICAgdXNlckZyYW1lbGVuZ3RoOwotICAgIFVJTlQgICAgICAgICAgICAgIHVzZXJBbmNEYXRhUmF0ZTsKLSAgICBVSU5UICAgICAgICAgICAgICB1c2VyUGVha0JpdHJhdGU7CisgIEFVRElPX09CSkVDVF9UWVBFIHVzZXJBT1Q7IC8qITwgQXVkaW8gT2JqZWN0IFR5cGUuICAgICAgICAgICAgICovCisgIFVJTlQgdXNlclNhbXBsZXJhdGU7ICAgICAgIC8qITwgU2FtcGxpbmcgZnJlcXVlbmN5LiAgICAgICAgICAgICovCisgIFVJTlQgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qITwgd2lsbCBiZSBzZXQgdmlhIGNoYW5uZWxNb2RlLiAgICovCisgIENIQU5ORUxfTU9ERSB1c2VyQ2hhbm5lbE1vZGU7CisgIFVJTlQgdXNlckJpdHJhdGU7CisgIFVJTlQgdXNlckJpdHJhdGVNb2RlOworICBVSU5UIHVzZXJCYW5kd2lkdGg7CisgIFVJTlQgdXNlckFmdGVyYnVybmVyOworICBVSU5UIHVzZXJGcmFtZWxlbmd0aDsKKyAgVUlOVCB1c2VyQW5jRGF0YVJhdGU7CisgIFVJTlQgdXNlclBlYWtCaXRyYXRlOwogCi0gICAgVUNIQVIgICAgICAgICAgICAgdXNlclRuczsgICAgICAgICAgICAgICAvKiE8IFVzZSBUTlMgY29kaW5nLiAqLwotICAgIFVDSEFSICAgICAgICAgICAgIHVzZXJQbnM7ICAgICAgICAgICAgICAgLyohPCBVc2UgUE5TIGNvZGluZy4gKi8KLSAgICBVQ0hBUiAgICAgICAgICAgICB1c2VySW50ZW5zaXR5OyAgICAgICAgIC8qITwgVXNlIEludGVuc2l0eSBjb2RpbmcuICovCisgIFVDSEFSIHVzZXJUbnM7ICAgICAgIC8qITwgVXNlIFROUyBjb2RpbmcuICovCisgIFVDSEFSIHVzZXJQbnM7ICAgICAgIC8qITwgVXNlIFBOUyBjb2RpbmcuICovCisgIFVDSEFSIHVzZXJJbnRlbnNpdHk7IC8qITwgVXNlIEludGVuc2l0eSBjb2RpbmcuICovCiAKLSAgICBUUkFOU1BPUlRfVFlQRSAgICB1c2VyVHBUeXBlOyAgICAgICAgICAgIC8qITwgVHJhbnNwb3J0IHR5cGUgKi8KLSAgICBVQ0hBUiAgICAgICAgICAgICB1c2VyVHBTaWduYWxpbmc7ICAgICAgIC8qITwgRXh0ZW5zaW9uIEFPVCBzaWduYWxpbmcgbW9kZS4gKi8KLSAgICBVQ0hBUiAgICAgICAgICAgICB1c2VyVHBOc3ViRnJhbWVzOyAgICAgIC8qITwgTnVtYmVyIG9mIHN1YiBmcmFtZXMgaW4gYSB0cmFuc3BvcnQgZnJhbWUgZm9yIExPQVMvTEFUTSBvciBBRFRTIChkZWZhdWx0IDEpLiAqLwotICAgIFVDSEFSICAgICAgICAgICAgIHVzZXJUcEFteHY7ICAgICAgICAgICAgLyohPCBBdWRpb011eFZlcnNpb24gdG8gYmUgdXNlZCBmb3IgTEFUTSAoZGVmYXVsdCAwKS4gKi8KLSAgICBVQ0hBUiAgICAgICAgICAgICB1c2VyVHBQcm90ZWN0aW9uOwotICAgIFVDSEFSICAgICAgICAgICAgIHVzZXJUcEhlYWRlclBlcmlvZDsgICAgLyohPCBQYXJhbWV0ZXIgdXNlZCB0byBjb25maWd1cmUgTEFUTS9MT0FTIFNNQyByYXRlLiBNb3Jlb3ZlciB0aGlzIHBhcmFtZXRlcnMgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBjb25maWd1cmUgcmVwZXRpdGlvbiByYXRlIG9mIFBDRSBpbiByYXdfZGF0YV9ibG9jay4gKi8KKyAgVFJBTlNQT1JUX1RZUEUgdXNlclRwVHlwZTsgLyohPCBUcmFuc3BvcnQgdHlwZSAqLworICBVQ0hBUiB1c2VyVHBTaWduYWxpbmc7ICAgICAvKiE8IEV4dGVuc2lvbiBBT1Qgc2lnbmFsaW5nIG1vZGUuICovCisgIFVDSEFSIHVzZXJUcE5zdWJGcmFtZXM7ICAgIC8qITwgTnVtYmVyIG9mIHN1YiBmcmFtZXMgaW4gYSB0cmFuc3BvcnQgZnJhbWUgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQVMvTEFUTSBvciBBRFRTIChkZWZhdWx0IDEpLiAqLworICBVQ0hBUiB1c2VyVHBBbXh2OyAvKiE8IEF1ZGlvTXV4VmVyc2lvbiB0byBiZSB1c2VkIGZvciBMQVRNIChkZWZhdWx0IDApLiAqLworICBVQ0hBUiB1c2VyVHBQcm90ZWN0aW9uOworICBVQ0hBUiB1c2VyVHBIZWFkZXJQZXJpb2Q7IC8qITwgUGFyYW1ldGVyIHVzZWQgdG8gY29uZmlndXJlIExBVE0vTE9BUyBTTUMgcmF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb3Jlb3ZlciB0aGlzIHBhcmFtZXRlcnMgaXMgdXNlZCB0byBjb25maWd1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBldGl0aW9uIHJhdGUgb2YgUENFIGluIHJhd19kYXRhX2Jsb2NrLiAqLwogCi0gICAgVUNIQVIgICAgICAgICAgICAgdXNlckVyVG9vbHM7ICAgICAgICAgICAvKiE8IFVzZSBWQ0IxMSwgSENSIGFuZC9vciBSVkxDIEVSIHRvb2wuICovCi0gICAgVUlOVCAgICAgICAgICAgICAgdXNlclBjZUFkZGl0aW9uczsgICAgICAvKiE8IENvbmZpZ3VyZSBhZGRpdGlvbmFsIGJpdHMgaW4gUENFLiAqLworICBVQ0hBUiB1c2VyRXJUb29sczsgICAgIC8qITwgVXNlIFZDQjExLCBIQ1IgYW5kL29yIFJWTEMgRVIgdG9vbC4gKi8KKyAgVUlOVCB1c2VyUGNlQWRkaXRpb25zOyAvKiE8IENvbmZpZ3VyZSBhZGRpdGlvbmFsIGJpdHMgaW4gUENFLiAqLwogCi0gICAgVUNIQVIgICAgICAgICAgICAgdXNlck1ldGFEYXRhTW9kZTsgICAgICAvKiE8IE1ldGEgZGF0YSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uICovCisgIFVDSEFSIHVzZXJNZXRhRGF0YU1vZGU7IC8qITwgTWV0YSBkYXRhIGxpYnJhcnkgY29uZmlndXJhdGlvbi4gKi8KIAotICAgIFVDSEFSICAgICAgICAgICAgIHVzZXJTYnJFbmFibGVkOyAgICAgICAgLyohPCBFbmFibGUgU0JSIGZvciBFTEQuICovCi0gICAgVUlOVCAgICAgICAgICAgICAgdXNlclNiclJhdGlvOyAgICAgICAgICAvKiE8IFNCUiBzYW1wbGluZyByYXRlIHJhdGlvLiBEdWFsLSBvciBzaW5nbGUtcmF0ZS4gKi8KKyAgVUNIQVIgdXNlclNickVuYWJsZWQ7IC8qITwgRW5hYmxlIFNCUiBmb3IgRUxELiAqLworICBVSU5UIHVzZXJTYnJSYXRpbzsgICAgLyohPCBTQlIgc2FtcGxpbmcgcmF0ZSByYXRpby4gRHVhbC0gb3Igc2luZ2xlLXJhdGUuICovCisKKyAgVUlOVCB1c2VyRG93bnNjYWxlRmFjdG9yOwogCiB9IFVTRVJfUEFSQU07CiAKKy8qKgorICogIFNCUiBleHRlbnhpb24gcGF5bG9hZCBzdHJ1Y3QgcHJvdmlkZXMgYnVmZmVycyB0byBiZSBmaWxsZWQgaW4gU0JSIGVuY29kZXIKKyAqIGxpYnJhcnkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgZGF0YVsoMSldWyg4KV1bTUFYX1BBWUxPQURfU0laRV07IC8qITwgZXh0ZW5zaW9uIHBheWxvYWQgZGF0YSBidWZmZXIgKi8KKyAgVUlOVCBkYXRhU2l6ZVsoMSldWyg4KV07IC8qITwgZXh0ZW5zaW9uIHBheWxvYWQgZGF0YSBzaXplIGluIGJpdHMgKi8KK30gU0JSRU5DX0VYVF9QQVlMT0FEOworCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZSBEZWZpbml0aW9ucwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdHlwZWRlZiBzdHJ1Y3QgIEFBQ0VOQ19DT05GSUcgICAgICpIQU5ETEVfQUFDRU5DX0NPTkZJRzsKK3R5cGVkZWYgc3RydWN0IEFBQ0VOQ19DT05GSUcgKkhBTkRMRV9BQUNFTkNfQ09ORklHOwogCitzdHJ1Y3QgQUFDRU5DT0RFUiB7CisgIFVTRVJfUEFSQU0gZXh0UGFyYW07CisgIENPREVSX0NPTkZJRyBjb2RlckNvbmZpZzsKIAotc3RydWN0IEFBQ0VOQ09ERVIKLXsKLSAgICBVU0VSX1BBUkFNICAgICAgICAgICAgICAgZXh0UGFyYW07Ci0gICAgQ09ERVJfQ09ORklHICAgICAgICAgICAgIGNvZGVyQ29uZmlnOworICAvKiBBQUMgKi8KKyAgQUFDRU5DX0NPTkZJRyBhYWNDb25maWc7CisgIEhBTkRMRV9BQUNfRU5DIGhBYWNFbmM7CiAKLSAgICAvKiBBQUMgKi8KLSAgICBBQUNFTkNfQ09ORklHICAgICAgICAgICAgYWFjQ29uZmlnOwotICAgIEhBTkRMRV9BQUNfRU5DICAgICAgICAgICBoQWFjRW5jOworICAvKiBTQlIgKi8KKyAgSEFORExFX1NCUl9FTkNPREVSIGhFbnZFbmM7ICAgICAgLyogU0JSIGVuY29kZXIgKi8KKyAgU0JSRU5DX0VYVF9QQVlMT0FEICpwU2JyUGF5bG9hZDsgLyogU0JSIGV4dGVuc2lvbiBwYXlsb2FkICovCiAKLSAgICAvKiBTQlIgKi8KLSAgICBIQU5ETEVfU0JSX0VOQ09ERVIgICAgICAgaEVudkVuYzsKKyAgLyogTWV0YSBEYXRhICovCisgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiBoTWV0YWRhdGFFbmM7CisgIElOVCBtZXRhRGF0YUFsbG93ZWQ7IC8qIFNpZ25hbCB3aGV0aGVyIGNob3NlbiBjb25maWd1cmF0aW9uIGFsbG93cyBtZXRhZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTmVjZXNzYXJ5IGZvciBkZWxheSBjb21wZW5zYXRpb24uIE1ldGFkYXRhIG1vZGUgaXMgYQorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0ZSBwYXJhbWV0ZXIuICovCiAKLSAgICAvKiBNZXRhIERhdGEgKi8KLSAgICBIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIgIGhNZXRhZGF0YUVuYzsKLSAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhQWxsb3dlZDsgLyogU2lnbmFsIHdoZXRoZXIgY2hvc2VuIGNvbmZpZ3VyYXRpb24gYWxsb3dzIG1ldGFkYXRhLiBOZWNlc3NhcnkgZm9yIGRlbGF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBlbnNhdGlvbi4gTWV0YWRhdGEgbW9kZSBpcyBhIHNlcGFyYXRlIHBhcmFtZXRlci4gKi8KKyAgSEFORExFX01QU19FTkNPREVSIGhNcHNFbmM7CiAKLSAgICAvKiBUcmFuc3BvcnQgKi8KLSAgICBIQU5ETEVfVFJBTlNQT1JURU5DICAgICAgaFRwRW5jOworICAvKiBUcmFuc3BvcnQgKi8KKyAgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmM7CiAKLSAgICAvKiBPdXRwdXQgKi8KLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAqb3V0QnVmZmVyOyAgICAgICAgIC8qIEludGVybmFsIGJpdHN0cmVhbSBidWZmZXIgKi8KLSAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVySW5CeXRlczsgICAvKiBTaXplIG9mIGludGVybmFsIGJpdHN0cmVhbSBidWZmZXIqLworICBJTlRfUENNCisgICppbnB1dEJ1ZmZlcjsgICAgIC8qIEludGVybmFsIGlucHV0IGJ1ZmZlci4gSW5wdXQgc291cmNlIGZvciBBQUMgZW5jb2RlciAqLworICBVQ0hBUiAqb3V0QnVmZmVyOyAvKiBJbnRlcm5hbCBiaXRzdHJlYW0gYnVmZmVyICovCiAKLSAgICAvKiBJbnB1dCAqLwotICAgIElOVF9QQ00gICAgICAgICAgICAgICAgICppbnB1dEJ1ZmZlcjsgICAgICAgIC8qIEludGVybmFsIGlucHV0IGJ1ZmZlci4gSW5wdXQgc291cmNlIGZvciBBQUMgZW5jb2RlciAqLwotICAgIElOVCAgICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlck9mZnNldDsgIC8qIFdoZXJlIHRvIHdyaXRlIG5ldyBpbnB1dCBzYW1wbGVzLiAqLworICBJTlQgaW5wdXRCdWZmZXJTaXplOyAgICAgICAgICAgLyogU2l6ZSBvZiBpbnRlcm5hbCBpbnB1dCBidWZmZXIgKi8KKyAgSU5UIGlucHV0QnVmZmVyU2l6ZVBlckNoYW5uZWw7IC8qIFNpemUgb2YgaW50ZXJuYWwgaW5wdXQgYnVmZmVyIHBlciBjaGFubmVsICovCisgIElOVCBvdXRCdWZmZXJJbkJ5dGVzOyAgICAgICAgICAvKiBTaXplIG9mIGludGVybmFsIGJpdHN0cmVhbSBidWZmZXIqLwogCi0gICAgSU5UICAgICAgICAgICAgICAgICAgICAgIG5TYW1wbGVzVG9SZWFkOyAgICAvKiBudW1iZXIgb2YgaW5wdXQgc2FtcGxlcyBuZWVlZGVkIGZvciBlbmNvZGluZyBvbmUgZnJhbWUgKi8KLSAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgblNhbXBsZXNSZWFkOyAgICAgIC8qIG51bWJlciBvZiBpbnB1dCBzYW1wbGVzIGFscmVhZHkgaW4gaW5wdXQgYnVmZmVyICovCi0gICAgSU5UICAgICAgICAgICAgICAgICAgICAgIG5aZXJvc0FwcGVuZGVkOyAgICAvKiBhcHBlbmRlZCB6ZXJvcyBhdCBlbmQgb2YgZmlsZSovCi0gICAgSU5UICAgICAgICAgICAgICAgICAgICAgIG5EZWxheTsgICAgICAgICAgICAvKiBlbmNvZGVyIGRlbGF5ICovCisgIElOVCBpbnB1dEJ1ZmZlck9mZnNldDsgLyogV2hlcmUgdG8gd3JpdGUgbmV3IGlucHV0IHNhbXBsZXMuICovCiAKLSAgICBBQUNFTkNfRVhUX1BBWUxPQUQgICAgICAgZXh0UGF5bG9hZCBbTUFYX1RPVEFMX0VYVF9QQVlMT0FEU107Ci0gICAgLyogRXh0ZW5zaW9uIHBheWxvYWQgKi8KLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgZXh0UGF5bG9hZERhdGEgWygxKV1bKDgpXVtNQVhfUEFZTE9BRF9TSVpFXTsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgZXh0UGF5bG9hZFNpemUgWygxKV1bKDgpXTsgLyogcGF5bG9hZCBzaXplcyBpbiBiaXRzICovCisgIElOVCBuU2FtcGxlc1RvUmVhZDsgLyogbnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgbmVlZWRlZCBmb3IgZW5jb2Rpbmcgb25lIGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICovCisgIElOVCBuU2FtcGxlc1JlYWQ7ICAgLyogbnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgYWxyZWFkeSBpbiBpbnB1dCBidWZmZXIgKi8KKyAgSU5UIG5aZXJvc0FwcGVuZGVkOyAvKiBhcHBlbmRlZCB6ZXJvcyBhdCBlbmQgb2YgZmlsZSovCisgIElOVCBuRGVsYXk7ICAgICAgICAgLyogY29kZWMgZGVsYXkgKi8KKyAgSU5UIG5EZWxheUNvcmU7ICAgICAvKiBjb2RlYyBkZWxheSwgdy9vIHRoZSBTQlIgZGVjb2RlciBkZWxheSAqLwogCi0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgIEluaXRGbGFnczsgICAgICAgICAvKiBpbnRlcm5hbCBzdGF0dXMgdG8gdHJlZ2dpZXIgcmUtaW5pdGlhbGl6YXRpb24gKi8KKyAgQUFDRU5DX0VYVF9QQVlMT0FEIGV4dFBheWxvYWRbTUFYX1RPVEFMX0VYVF9QQVlMT0FEU107CiAKKyAgVUxPTkcgSW5pdEZsYWdzOyAvKiBpbnRlcm5hbCBzdGF0dXMgdG8gdHJlZ2dpZXIgcmUtaW5pdGlhbGl6YXRpb24gKi8KIAotICAgLyogTWVtb3J5IGFsbG9jYXRpb24gaW5mby4gKi8KLSAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgbk1heEFhY0VsZW1lbnRzOwotICAgSU5UICAgICAgICAgICAgICAgICAgICAgICBuTWF4QWFjQ2hhbm5lbHM7Ci0gICBJTlQgICAgICAgICAgICAgICAgICAgICAgIG5NYXhTYnJFbGVtZW50czsKLSAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgbk1heFNickNoYW5uZWxzOwotICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICBuTWF4U3ViRnJhbWVzOworICAvKiBNZW1vcnkgYWxsb2NhdGlvbiBpbmZvLiAqLworICBJTlQgbk1heEFhY0VsZW1lbnRzOworICBJTlQgbk1heEFhY0NoYW5uZWxzOworICBJTlQgbk1heFNickVsZW1lbnRzOworICBJTlQgbk1heFNickNoYW5uZWxzOwogCi0gICBVSU5UICAgICAgICAgICAgICAgICAgICAgIGVuY29kZXJfbW9kaXM7CisgIFVJTlQgZW5jb2Rlcl9tb2RpczsKIAotICAgLyogQ2FwYWJpbGl0eSBmbGFncyAqLwotICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICBDQVBGX3RwRW5jOworICAvKiBDYXBhYmlsaXR5IGZsYWdzICovCisgIFVJTlQgQ0FQRl90cEVuYzsKK307CiAKLX0gOwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBpbnB1dCAqLworICBVTE9ORyBuQ2hhbm5lbHM7ICAgIC8qITwgTnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzLiAqLworICBVTE9ORyBzYW1wbGluZ1JhdGU7IC8qITwgRW5jb2RlciBvdXRwdXQgc2FtcGxpbmcgcmF0ZS4gKi8KKyAgVUxPTkcgYml0cmF0ZVJhbmdlOyAvKiE8IExvd2VyIGJpdHJhdGUgcmFuZ2UgZm9yIGNvbmZpZyBlbnRyeS4gKi8KIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBVTE9ORyAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZTsgICAvKiE8IEVuY29kZXIgb3V0cHV0IHNhbXBsaW5nIHJhdGUuICovCi0gICAgVUxPTkcgICAgICAgICAgICAgICBiaXRyYXRlUmFuZ2U7ICAgLyohPCBMb3dlciBiaXRyYXRlIHJhbmdlIGZvciBjb25maWcgZW50cnkuICovCi0KLSAgICBVQ0hBUiAgICAgICAgICAgICAgIGxvd0RlbGF5U2JyOyAgICAvKiE8IDA6IEVMRCBzYnIgb2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogRUxEIHNiciBvbiAqLwotCi0gICAgVUNIQVIgICAgICAgICAgICAgICBkb3duc2FtcGxlZFNicjsgLyohPCAwOiBFTEQgd2l0aCBkdWFscmF0ZSBzYnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBFTEQgd2l0aCBkb3duc2FtcGxlZCBzYnIgKi8KKyAgLyogb3V0cHV0Ki8KKyAgVUNIQVIgc2JyTW9kZTsgICAgICAgLyohPCAwOiBFTEQgc2JyIG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBFTEQgd2l0aCBkb3duc2FtcGxlZCBzYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogRUxEIHdpdGggZHVhbHJhdGUgc2JyLiAqLworICBDSEFOTkVMX01PREUgY2hNb2RlOyAvKiE8IENoYW5uZWwgbW9kZS4gKi8KIAogfSBFTERfU0JSX0NPTkZJR1VSQVRPUjsKIAogLyoqCiAgKiBcYnJpZWYgIFRoaXMgdGFibGUgZGVmaW5lcyBFTEQvU0JSIGRlZmF1bHQgY29uZmlndXJhdGlvbnMuCiAgKi8KLXN0YXRpYyBjb25zdCBFTERfU0JSX0NPTkZJR1VSQVRPUiBlbGRTYnJBdXRvQ29uZmlnVGFiW10gPQotewotICB7IDQ4MDAwLCAgICAgMCwgMSwgMCB9LAotICB7IDQ4MDAwLCA2NDAwMSwgMCwgMCB9LAorc3RhdGljIGNvbnN0IEVMRF9TQlJfQ09ORklHVVJBVE9SIGVsZFNickF1dG9Db25maWdUYWJbXSA9IHsKKyAgICB7MSwgNDgwMDAsIDAsIDIsIE1PREVfMX0sICAgICAgezEsIDQ4MDAwLCA2NDAwMCwgMCwgTU9ERV8xfSwKIAotICB7IDQ0MTAwLCAgICAgMCwgMSwgMCB9LAotICB7IDQ0MTAwLCA2NDAwMSwgMCwgMCB9LAorICAgIHsxLCA0NDEwMCwgMCwgMiwgTU9ERV8xfSwgICAgICB7MSwgNDQxMDAsIDY0MDAwLCAwLCBNT0RFXzF9LAogCi0gIHsgMzIwMDAsICAgICAwLCAxLCAwIH0sCi0gIHsgMzIwMDAsIDI4MDAwLCAxLCAxIH0sCi0gIHsgMzIwMDAsIDU2MDAwLCAwLCAwIH0sCisgICAgezEsIDMyMDAwLCAwLCAyLCBNT0RFXzF9LCAgICAgIHsxLCAzMjAwMCwgMjgwMDAsIDEsIE1PREVfMX0sCisgICAgezEsIDMyMDAwLCA1NjAwMCwgMCwgTU9ERV8xfSwKIAotICB7IDI0MDAwLCAgICAgMCwgMSwgMSB9LAotICB7IDI0MDAwLCA0MDAwMCwgMCwgMCB9LAorICAgIHsxLCAyNDAwMCwgMCwgMSwgTU9ERV8xfSwgICAgICB7MSwgMjQwMDAsIDQwMDAwLCAwLCBNT0RFXzF9LAogCi0gIHsgMTYwMDAsICAgICAwLCAxLCAxIH0sCi0gIHsgMTYwMDAsIDI4MDAwLCAwLCAwIH0KKyAgICB7MSwgMTYwMDAsIDAsIDEsIE1PREVfMX0sICAgICAgezEsIDE2MDAwLCAyODAwMCwgMCwgTU9ERV8xfSwKKworICAgIHsxLCAxNTk5OSwgMCwgMCwgTU9ERV8xfSwKKworICAgIHsyLCA0ODAwMCwgMCwgMiwgTU9ERV8yfSwgICAgICB7MiwgNDgwMDAsIDQ0MDAwLCAyLCBNT0RFXzJ9LAorICAgIHsyLCA0ODAwMCwgMTI4MDAwLCAwLCBNT0RFXzJ9LAorCisgICAgezIsIDQ0MTAwLCAwLCAyLCBNT0RFXzJ9LCAgICAgIHsyLCA0NDEwMCwgNDQwMDAsIDIsIE1PREVfMn0sCisgICAgezIsIDQ0MTAwLCAxMjgwMDAsIDAsIE1PREVfMn0sCisKKyAgICB7MiwgMzIwMDAsIDAsIDIsIE1PREVfMn0sICAgICAgezIsIDMyMDAwLCAzMjAwMCwgMiwgTU9ERV8yfSwKKyAgICB7MiwgMzIwMDAsIDY4MDAwLCAxLCBNT0RFXzJ9LCAgezIsIDMyMDAwLCA5NjAwMCwgMCwgTU9ERV8yfSwKKworICAgIHsyLCAyNDAwMCwgMCwgMSwgTU9ERV8yfSwgICAgICB7MiwgMjQwMDAsIDQ4MDAwLCAxLCBNT0RFXzJ9LAorICAgIHsyLCAyNDAwMCwgODAwMDAsIDAsIE1PREVfMn0sCisKKyAgICB7MiwgMTYwMDAsIDAsIDEsIE1PREVfMn0sICAgICAgezIsIDE2MDAwLCAzMjAwMCwgMSwgTU9ERV8yfSwKKyAgICB7MiwgMTYwMDAsIDY0MDAwLCAwLCBNT0RFXzJ9LAorCisgICAgezIsIDE1OTk5LCAwLCAwLCBNT0RFXzJ9CiAKIH07CiAKIC8qCiAgKiBcYnJpZWYgIENvbmZpZ3VyZSBTQlIgZm9yIEVMRCBjb25maWd1cmF0aW9uLgogICoKLSAqIFRoaXMgZnVuY3Rpb24gZmluZHMgZGVmYXVsdCBTQlIgY29uZmlndXJhdGlvbiBmb3IgRUxEIGJhc2VkIG9uIHNhbXBsaW5nIHJhdGUgYW5kIGNoYW5uZWwgYml0cmF0ZS4KLSAqIE91dHB1dHBhcmFtZXRlcnMgYXJlIFNCUiBvbi9vZmYsIGFuZCBTQlIgcmF0aW8uCisgKiBUaGlzIGZ1bmN0aW9uIGZpbmRzIGRlZmF1bHQgU0JSIGNvbmZpZ3VyYXRpb24gZm9yIEVMRCBiYXNlZCBvbiBudW1iZXIgb2YKKyAqIGNoYW5uZWxzLCBzYW1wbGluZyByYXRlIGFuZCBiaXRyYXRlLgogICoKKyAqIFxwYXJhbSBuQ2hhbm5lbHMgICAgICAgICAgICAgTnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzLgogICogXHBhcmFtIHNhbXBsaW5nUmF0ZSAgICAgICAgICBBdWRpbyBzaWduYWwgc2FtcGxpbmcgcmF0ZS4KLSAqIFxwYXJhbSBjaGFubmVsTW9kZSAgICAgICAgICAgQ2hhbm5lbCBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQuCi0gKiBccGFyYW0gdG90YWxCaXRyYXRlICAgICAgICAgIE92ZXJhbGwgYml0cmF0ZS4KLSAqIFxwYXJhbSBlbGRTYnIgICAgICAgICAgICAgICAgUG9pbnRlciB0byBlbGRTYnIgcGFyYW1ldGVyLCBmaWxsZWQgb24gcmV0dXJuLgotICogXHBhcmFtIGVsZFNiclJhdGlvICAgICAgICAgICBQb2ludGVyIHRvIGVsZFNiclJhdGlvIHBhcmFtZXRlciwgZmlsbGVkIG9uIHJldHVybi4KKyAqIFxwYXJhbSBiaXRyYXRlICAgICAgICAgICAgICAgRW5jb2RlciBiaXRyYXRlLgogICoKLSAqIFxyZXR1cm4gLSBBQUNFTkNfT0ssIGFsbCBmaW5lLgotICogICAgICAgICAtIEFBQ0VOQ19JTlZBTElEX0NPTkZJRywgb24gZmFpbHVyZS4KKyAqIFxyZXR1cm4gLSBwb2ludGVyIHRvIGVsZCBzYnIgY29uZmlndXJhdGlvbi4KKyAqICAgICAgICAgLSBOVUxMLCBvbiBmYWlsdXJlLgogICovCi1zdGF0aWMgQUFDRU5DX0VSUk9SIGVsZFNickNvbmZpZ3VyYXRvcigKLSAgICAgICAgY29uc3QgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAotICAgICAgICBjb25zdCBDSEFOTkVMX01PREUgICAgICAgICAgICAgICBjaGFubmVsTW9kZSwKLSAgICAgICAgY29uc3QgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgdG90YWxCaXRyYXRlLAotICAgICAgICBVSU5UICogY29uc3QgICAgICAgICAgICAgICAgICAgICBlbGRTYnIsCi0gICAgICAgIFVJTlQgKiBjb25zdCAgICAgICAgICAgICAgICAgICAgIGVsZFNiclJhdGlvCi0gICAgICAgICkKLXsKLSAgICBBQUNFTkNfRVJST1IgZXJyID0gQUFDRU5DX09LOwotICAgIGludCBpLCBjZmdJZHggPSAtMTsKLSAgICBjb25zdCBVTE9ORyBjaGFubmVsQml0cmF0ZSA9IHRvdGFsQml0cmF0ZSAvIEZES2FhY0VuY19HZXRDaGFubmVsTW9kZUNvbmZpZ3VyYXRpb24oY2hhbm5lbE1vZGUpLT5uQ2hhbm5lbHNFZmY7CitzdGF0aWMgY29uc3QgRUxEX1NCUl9DT05GSUdVUkFUT1IgKmVsZFNickNvbmZpZ3VyYXRvcihjb25zdCBVTE9ORyBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVTE9ORyBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVTE9ORyBiaXRyYXRlKSB7CisgIGludCBpOworICBjb25zdCBFTERfU0JSX0NPTkZJR1VSQVRPUiAqcFNldHVwID0gTlVMTDsKIAotICAgIGZvciAoaT0wOyBpPChpbnQpKHNpemVvZihlbGRTYnJBdXRvQ29uZmlnVGFiKS9zaXplb2YoRUxEX1NCUl9DT05GSUdVUkFUT1IpKTsgaSsrKSB7Ci0gICAgICBpZiAoIChzYW1wbGluZ1JhdGUgPD0gZWxkU2JyQXV0b0NvbmZpZ1RhYltpXS5zYW1wbGluZ1JhdGUpCi0gICAgICAgICYmIChjaGFubmVsQml0cmF0ZSA+PSBlbGRTYnJBdXRvQ29uZmlnVGFiW2ldLmJpdHJhdGVSYW5nZSkgKQotICAgICAgewotICAgICAgICBjZmdJZHggPSBpOwotICAgICAgfQorICBmb3IgKGkgPSAwOworICAgICAgIGkgPCAoaW50KShzaXplb2YoZWxkU2JyQXV0b0NvbmZpZ1RhYikgLyBzaXplb2YoRUxEX1NCUl9DT05GSUdVUkFUT1IpKTsKKyAgICAgICBpKyspIHsKKyAgICBpZiAoKG5DaGFubmVscyA9PSBlbGRTYnJBdXRvQ29uZmlnVGFiW2ldLm5DaGFubmVscykgJiYKKyAgICAgICAgKHNhbXBsaW5nUmF0ZSA8PSBlbGRTYnJBdXRvQ29uZmlnVGFiW2ldLnNhbXBsaW5nUmF0ZSkgJiYKKyAgICAgICAgKGJpdHJhdGUgPj0gZWxkU2JyQXV0b0NvbmZpZ1RhYltpXS5iaXRyYXRlUmFuZ2UpKSB7CisgICAgICBwU2V0dXAgPSAmZWxkU2JyQXV0b0NvbmZpZ1RhYltpXTsKICAgICB9CisgIH0KIAotICAgIGlmIChjZmdJZHggIT0gLTEpIHsKLSAgICAgICplbGRTYnIgICAgICA9IChlbGRTYnJBdXRvQ29uZmlnVGFiW2NmZ0lkeF0ubG93RGVsYXlTYnI9PTApID8gMCA6IDE7Ci0gICAgICAqZWxkU2JyUmF0aW8gPSAoZWxkU2JyQXV0b0NvbmZpZ1RhYltjZmdJZHhdLmRvd25zYW1wbGVkU2JyPT0wKSA/IDIgOiAxOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsgLyogbm8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciBlbGQtc2JyIGF2YWlsYWJsZS4gKi8KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOworICByZXR1cm4gcFNldHVwOwogfQogCi1zdGF0aWMgaW5saW5lIElOVCBpc1NickFjdGl2ZShjb25zdCBIQU5ETEVfQUFDRU5DX0NPTkZJRyBoQWFjQ29uZmlnKQotewotICAgIElOVCBzYnJVc2VkID0gMDsKK3N0YXRpYyBpbmxpbmUgSU5UIGlzU2JyQWN0aXZlKGNvbnN0IEhBTkRMRV9BQUNFTkNfQ09ORklHIGhBYWNDb25maWcpIHsKKyAgSU5UIHNiclVzZWQgPSAwOwogCi0gICAgaWYgKCAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlPT1BT1RfU0JSKSB8fCAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlPT1BT1RfUFMpICkKLSAgICB7Ci0gICAgICAgIHNiclVzZWQgPSAxOwotICAgIH0KLSAgICBpZiAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlID09IEFPVF9FUl9BQUNfRUxEICYmIChoQWFjQ29uZmlnLT5zeW50YXhGbGFncyAmIEFDX1NCUl9QUkVTRU5UKSkKLSAgICB7Ci0gICAgICAgIHNiclVzZWQgPSAxOwotICAgIH0KKyAgLyogTm90ZTogRXZlbiBpZiBpbXBsaWNpdCBzaWduYWxsaW5nIHdhcyBzZWxlY3RlZCwgVGhlIEFPVCBpdHNlbGYgaGVyZSBpcyBub3QKKyAgICogQU9UX0FBQ19MQyAqLworICBpZiAoKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfU0JSKSB8fAorICAgICAgKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfUFMpIHx8CisgICAgICAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlID09IEFPVF9NUDJfU0JSKSkgeworICAgIHNiclVzZWQgPSAxOworICB9CisgIGlmIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19FTEQgJiYKKyAgICAgIChoQWFjQ29uZmlnLT5zeW50YXhGbGFncyAmIEFDX1NCUl9QUkVTRU5UKSkgeworICAgIHNiclVzZWQgPSAxOworICB9CiAKLSAgICByZXR1cm4gKCBzYnJVc2VkICk7CisgIHJldHVybiAoc2JyVXNlZCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgSU5UIGlzUHNBY3RpdmUoY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgYXVkaW9PYmplY3RUeXBlKQotewotICAgIElOVCBwc1VzZWQgPSAwOworc3RhdGljIGlubGluZSBJTlQgaXNQc0FjdGl2ZShjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb09iamVjdFR5cGUpIHsKKyAgSU5UIHBzVXNlZCA9IDA7CiAKLSAgICBpZiAoIChhdWRpb09iamVjdFR5cGU9PUFPVF9QUykgKQotICAgIHsKLSAgICAgICAgcHNVc2VkID0gMTsKLSAgICB9CisgIGlmIChhdWRpb09iamVjdFR5cGUgPT0gQU9UX1BTKSB7CisgICAgcHNVc2VkID0gMTsKKyAgfQogCi0gICAgcmV0dXJuICggcHNVc2VkICk7CisgIHJldHVybiAocHNVc2VkKTsKK30KKworc3RhdGljIENIQU5ORUxfTU9ERSBHZXRDb3JlQ2hhbm5lbE1vZGUoCisgICAgY29uc3QgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlLCBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb09iamVjdFR5cGUpIHsKKyAgQ0hBTk5FTF9NT0RFIG1hcHBlZENoYW5uZWxNb2RlID0gY2hhbm5lbE1vZGU7CisgIGlmICgoaXNQc0FjdGl2ZShhdWRpb09iamVjdFR5cGUpICYmIChjaGFubmVsTW9kZSA9PSBNT0RFXzIpKSB8fAorICAgICAgKGNoYW5uZWxNb2RlID09IE1PREVfMjEyKSkgeworICAgIG1hcHBlZENoYW5uZWxNb2RlID0gTU9ERV8xOworICB9CisgIHJldHVybiBtYXBwZWRDaGFubmVsTW9kZTsKIH0KIAogc3RhdGljIFNCUl9QU19TSUdOQUxJTkcgZ2V0U2JyU2lnbmFsaW5nTW9kZSgKLSAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgICAgICAgICAgYXVkaW9PYmplY3RUeXBlLAotICAgICAgICBjb25zdCBUUkFOU1BPUlRfVFlQRSAgICAgICAgICAgICB0cmFuc3BvcnRUeXBlLAotICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRTaWduYWxpbmcsCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICAgICAgIHNiclJhdGlvCi0gICAgICAgICkKKyAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb09iamVjdFR5cGUsIGNvbnN0IFRSQU5TUE9SVF9UWVBFIHRyYW5zcG9ydFR5cGUsCisgICAgY29uc3QgVUNIQVIgdHJhbnNwb3J0U2lnbmFsaW5nLCBjb25zdCBVSU5UIHNiclJhdGlvKQogCiB7CiAgIFNCUl9QU19TSUdOQUxJTkcgc2JyU2lnbmFsaW5nOwogCi0gIGlmICh0cmFuc3BvcnRUeXBlPT1UVF9VTktOT1dOIHx8IHNiclJhdGlvPT0wKSB7CisgIGlmICh0cmFuc3BvcnRUeXBlID09IFRUX1VOS05PV04gfHwgc2JyUmF0aW8gPT0gMCkgewogICAgIHNiclNpZ25hbGluZyA9IFNJR19VTktOT1dOOyAvKiBOZWVkZWQgcGFyYW1ldGVycyBoYXZlIG5vdCBiZWVuIHNldCAqLwogICAgIHJldHVybiBzYnJTaWduYWxpbmc7CiAgIH0gZWxzZSB7Ci0gICAgc2JyU2lnbmFsaW5nID0gU0lHX0lNUExJQ0lUOyAvKiBkZWZhdWx0OiBpbXBsaWNpdCBzaWduYWxpbmcgKi8KKyAgICBzYnJTaWduYWxpbmcgPQorICAgICAgICBTSUdfRVhQTElDSVRfSElFUkFSQ0hJQ0FMOyAvKiBkZWZhdWx0OiBleHBsaWNpdCBoaWVyYXJjaGljYWwgc2lnbmFsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICB9CiAKLSAgaWYgKCAoYXVkaW9PYmplY3RUeXBlPT1BT1RfQUFDX0xDKSB8fCAoYXVkaW9PYmplY3RUeXBlPT1BT1RfU0JSKSB8fCAoYXVkaW9PYmplY3RUeXBlPT1BT1RfUFMpICkgeworICBpZiAoKGF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfQUFDX0xDKSB8fCAoYXVkaW9PYmplY3RUeXBlID09IEFPVF9TQlIpIHx8CisgICAgICAoYXVkaW9PYmplY3RUeXBlID09IEFPVF9QUykgfHwgKGF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfTVAyX0FBQ19MQykgfHwKKyAgICAgIChhdWRpb09iamVjdFR5cGUgPT0gQU9UX01QMl9TQlIpKSB7CiAgICAgc3dpdGNoICh0cmFuc3BvcnRUeXBlKSB7CiAgICAgICBjYXNlIFRUX01QNF9BRElGOgogICAgICAgY2FzZSBUVF9NUDRfQURUUzoKLSAgICAgICAgc2JyU2lnbmFsaW5nID0gU0lHX0lNUExJQ0lUOyAvKiBGb3IgTVBFRy0yIHRyYW5zcG9ydCB0eXBlcywgb25seSBpbXBsaWNpdCBzaWduYWxpbmcgaXMgcG9zc2libGUgKi8KKyAgICAgICAgc2JyU2lnbmFsaW5nID0gU0lHX0lNUExJQ0lUOyAvKiBGb3IgTVBFRy0yIHRyYW5zcG9ydCB0eXBlcywgb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0IHNpZ25hbGluZyBpcyBwb3NzaWJsZSAqLwogICAgICAgICBicmVhazsKIAogICAgICAgY2FzZSBUVF9NUDRfUkFXOgpAQCAtMzgwLDE2ICs0MzAsMTMgQEAKICAgICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMDoKICAgICAgIGNhc2UgVFRfTVA0X0xPQVM6CiAgICAgICBkZWZhdWx0OgotICAgICAgICBpZiAoIHRyYW5zcG9ydFNpZ25hbGluZz09MHhGRiApIHsKKyAgICAgICAgaWYgKHRyYW5zcG9ydFNpZ25hbGluZyA9PSAweEZGKSB7CiAgICAgICAgICAgLyogRGVmYXVsdHMgKi8KLSAgICAgICAgICBpZiAoIHNiclJhdGlvPT0xICkgewotICAgICAgICAgICAgc2JyU2lnbmFsaW5nID0gU0lHX0VYUExJQ0lUX0hJRVJBUkNISUNBTDsgLyogRm9yIGRvd25zYW1wbGVkIFNCUiwgZXhwbGljaXQgc2lnbmFsaW5nIGlzIG1hbmRhdG9yeSAqLwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYnJTaWduYWxpbmcgPSBTSUdfSU1QTElDSVQ7IC8qIEZvciBkdWFsLXJhdGUgU0JSLCBpbXBsaWNpdCBzaWduYWxpbmcgaXMgZGVmYXVsdCAqLwotICAgICAgICAgIH0KKyAgICAgICAgICBzYnJTaWduYWxpbmcgPSBTSUdfRVhQTElDSVRfSElFUkFSQ0hJQ0FMOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIC8qIFVzZXIgc2V0IHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAvKiBBdHRlbnRpb246IEJhY2t3YXJkIGNvbXBhdGlibGUgZXhwbGljaXQgc2lnbmFsaW5nIGRvZXMgb25seSB3b3JrIHdpdGggQU1WMSBmb3IgTEFUTS9MT0FTICovCisgICAgICAgICAgLyogQXR0ZW50aW9uOiBCYWNrd2FyZCBjb21wYXRpYmxlIGV4cGxpY2l0IHNpZ25hbGluZyBkb2VzIG9ubHkgd29yaworICAgICAgICAgICAqIHdpdGggQU1WMSBmb3IgTEFUTS9MT0FTICovCiAgICAgICAgICAgc2JyU2lnbmFsaW5nID0gKFNCUl9QU19TSUdOQUxJTkcpdHJhbnNwb3J0U2lnbmFsaW5nOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwpAQCAtNDAzLDc4ICs0NTAsOTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0ZSBFbmNvZGVyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1IX0FMTE9DX01FTSAoX0FhY0VuY29kZXIsIEFBQ0VOQ09ERVIpCi1DX0FMTE9DX01FTSAoX0FhY0VuY29kZXIsIEFBQ0VOQ09ERVIsIDEpCi0KLQotCitIX0FMTE9DX01FTShfQWFjRW5jb2RlciwgQUFDRU5DT0RFUikKK0NfQUxMT0NfTUVNKF9BYWNFbmNvZGVyLCBzdHJ1Y3QgQUFDRU5DT0RFUiwgMSkKIAogLyoKICAqIE1hcCBFbmNvZGVyIHNwZWNpZmljIGNvbmZpZyBzdHJ1Y3R1cmVzIHRvIENPREVSX0NPTkZJRy4KICAqLwotc3RhdGljIHZvaWQgRkRLYWFjRW5jX01hcENvbmZpZygKLSAgICAgICAgQ09ERVJfQ09ORklHICpjb25zdCAgICAgICAgICAgICAgY2MsCi0gICAgICAgIGNvbnN0IFVTRVJfUEFSQU0gKmNvbnN0ICAgICAgICAgIGV4dENmZywKLSAgICAgICAgY29uc3QgU0JSX1BTX1NJR05BTElORyAgICAgICAgICAgc2JyU2lnbmFsaW5nLAotICAgICAgICBjb25zdCBIQU5ETEVfQUFDRU5DX0NPTkZJRyAgICAgICBoQWFjQ29uZmlnCi0gICAgICAgICkKLXsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19NYXBDb25maWcoQ09ERVJfQ09ORklHICpjb25zdCBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVNFUl9QQVJBTSAqY29uc3QgZXh0Q2ZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQlJfUFNfU0lHTkFMSU5HIHNiclNpZ25hbGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSEFORExFX0FBQ0VOQ19DT05GSUcgaEFhY0NvbmZpZykgewogICBBVURJT19PQkpFQ1RfVFlQRSB0cmFuc3BvcnRfQU9UID0gQU9UX05VTExfT0JKRUNUOwogICBGREttZW1jbGVhcihjYywgc2l6ZW9mKENPREVSX0NPTkZJRykpOwogCiAgIGNjLT5mbGFncyA9IDA7CiAKLSAgdHJhbnNwb3J0X0FPVCA9IGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZTsKKyAgY2MtPnNhbXBsZXNQZXJGcmFtZSA9IGhBYWNDb25maWctPmZyYW1lbGVuZ3RoOworICBjYy0+c2FtcGxpbmdSYXRlID0gaEFhY0NvbmZpZy0+c2FtcGxlUmF0ZTsKKyAgY2MtPmV4dFNhbXBsaW5nUmF0ZSA9IGV4dENmZy0+dXNlclNhbXBsZXJhdGU7CisKKyAgLyogTWFwIHZpcnR1YWwgYW90IHRvIHRyYW5zcG9ydCBhb3QuICovCisgIHN3aXRjaCAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlKSB7CisgICAgY2FzZSBBT1RfTVAyX0FBQ19MQzoKKyAgICAgIHRyYW5zcG9ydF9BT1QgPSBBT1RfQUFDX0xDOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBT1RfTVAyX1NCUjoKKyAgICAgIHRyYW5zcG9ydF9BT1QgPSBBT1RfU0JSOworICAgICAgY2MtPmZsYWdzIHw9IENDX1NCUjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0cmFuc3BvcnRfQU9UID0gaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlOworICB9CiAKICAgaWYgKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0VMRCkgewogICAgIGNjLT5mbGFncyB8PSAoaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgJiBBQ19TQlJfUFJFU0VOVCkgPyBDQ19TQlIgOiAwOworICAgIGNjLT5mbGFncyB8PSAoaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgJiBBQ19MRF9NUFMpID8gQ0NfU0FDIDogMDsKICAgfQogCiAgIC8qIHRyYW5zcG9ydCB0eXBlIGlzIHVzdWFsbHkgQUFDLUxDLiAqLwotICBpZiAoICh0cmFuc3BvcnRfQU9UID09IEFPVF9TQlIpIHx8ICh0cmFuc3BvcnRfQU9UID09IEFPVF9QUykgKSB7Ci0gICAgY2MtPmFvdCAgICAgICAgICAgPSBBT1RfQUFDX0xDOwotICB9Ci0gIGVsc2UgewotICAgIGNjLT5hb3QgICAgICAgICAgID0gdHJhbnNwb3J0X0FPVDsKKyAgaWYgKCh0cmFuc3BvcnRfQU9UID09IEFPVF9TQlIpIHx8ICh0cmFuc3BvcnRfQU9UID09IEFPVF9QUykpIHsKKyAgICBjYy0+YW90ID0gQU9UX0FBQ19MQzsKKyAgfSBlbHNlIHsKKyAgICBjYy0+YW90ID0gdHJhbnNwb3J0X0FPVDsKICAgfQogCiAgIC8qIENvbmZpZ3VyZSBleHRlbnNpb24gYW90LiAqLwotICBpZiAoc2JyU2lnbmFsaW5nPT1TSUdfSU1QTElDSVQpIHsKLSAgICBjYy0+ZXh0QU9UID0gQU9UX05VTExfT0JKRUNUOyAgLyogaW1wbGljaXQgKi8KLSAgfQotICBlbHNlIHsKLSAgICBpZiAoIChzYnJTaWduYWxpbmc9PVNJR19FWFBMSUNJVF9CV19DT01QQVRJQkxFKSAmJiAoICh0cmFuc3BvcnRfQU9UPT1BT1RfU0JSKSB8fCAodHJhbnNwb3J0X0FPVD09QU9UX1BTKSApICkgewotICAgICAgY2MtPmV4dEFPVCA9IEFPVF9TQlI7ICAgICAgICAvKiBleHBsaWNpdCBiYWNrd2FyZCBjb21wYXRpYmxlICovCi0gICAgfQotICAgIGVsc2UgewotICAgICAgY2MtPmV4dEFPVCA9IHRyYW5zcG9ydF9BT1Q7ICAvKiBleHBsaWNpdCBoaWVyYXJjaGljYWwgKi8KKyAgaWYgKHNiclNpZ25hbGluZyA9PSBTSUdfSU1QTElDSVQpIHsKKyAgICBjYy0+ZXh0QU9UID0gQU9UX05VTExfT0JKRUNUOyAvKiBpbXBsaWNpdCAqLworICB9IGVsc2UgeworICAgIGlmICgoc2JyU2lnbmFsaW5nID09IFNJR19FWFBMSUNJVF9CV19DT01QQVRJQkxFKSAmJgorICAgICAgICAoKHRyYW5zcG9ydF9BT1QgPT0gQU9UX1NCUikgfHwgKHRyYW5zcG9ydF9BT1QgPT0gQU9UX1BTKSkpIHsKKyAgICAgIGNjLT5leHRBT1QgPSBBT1RfU0JSOyAvKiBleHBsaWNpdCBiYWNrd2FyZCBjb21wYXRpYmxlICovCisgICAgfSBlbHNlIHsKKyAgICAgIGNjLT5leHRBT1QgPSB0cmFuc3BvcnRfQU9UOyAvKiBleHBsaWNpdCBoaWVyYXJjaGljYWwgKi8KICAgICB9CiAgIH0KIAotICBpZiAoICh0cmFuc3BvcnRfQU9UPT1BT1RfU0JSKSB8fCAodHJhbnNwb3J0X0FPVD09QU9UX1BTKSApIHsKLSAgICBjYy0+c2JyUHJlc2VudD0xOwotICAgIGlmICh0cmFuc3BvcnRfQU9UPT1BT1RfUFMpIHsKLSAgICAgIGNjLT5wc1ByZXNlbnQ9MTsKKyAgaWYgKCh0cmFuc3BvcnRfQU9UID09IEFPVF9TQlIpIHx8ICh0cmFuc3BvcnRfQU9UID09IEFPVF9QUykpIHsKKyAgICBjYy0+c2JyUHJlc2VudCA9IDE7CisgICAgaWYgKHRyYW5zcG9ydF9BT1QgPT0gQU9UX1BTKSB7CisgICAgICBjYy0+cHNQcmVzZW50ID0gMTsKICAgICB9CiAgIH0KLSAgY2MtPnNiclNpZ25hbGluZyAgICA9IHNiclNpZ25hbGluZzsKKyAgY2MtPnNiclNpZ25hbGluZyA9IHNiclNpZ25hbGluZzsKIAotICBjYy0+ZXh0U2FtcGxpbmdSYXRlID0gZXh0Q2ZnLT51c2VyU2FtcGxlcmF0ZTsKLSAgY2MtPmJpdFJhdGUgICAgICAgICA9IGhBYWNDb25maWctPmJpdFJhdGU7Ci0gIGNjLT5ub0NoYW5uZWxzICAgICAgPSBoQWFjQ29uZmlnLT5uQ2hhbm5lbHM7Ci0gIGNjLT5mbGFncyAgICAgICAgICB8PSBDQ19JU19CQVNFTEFZRVI7Ci0gIGNjLT5jaGFubmVsTW9kZSAgICAgPSBoQWFjQ29uZmlnLT5jaGFubmVsTW9kZTsKKyAgaWYgKGhBYWNDb25maWctPmRvd25zY2FsZUZhY3RvciA+IDEpIHsKKyAgICBjYy0+ZG93bnNjYWxlU2FtcGxpbmdSYXRlID0gY2MtPnNhbXBsaW5nUmF0ZTsKKyAgICBjYy0+c2FtcGxpbmdSYXRlICo9IGhBYWNDb25maWctPmRvd25zY2FsZUZhY3RvcjsKKyAgICBjYy0+ZXh0U2FtcGxpbmdSYXRlICo9IGhBYWNDb25maWctPmRvd25zY2FsZUZhY3RvcjsKKyAgfQorCisgIGNjLT5iaXRSYXRlID0gaEFhY0NvbmZpZy0+Yml0UmF0ZTsKKyAgY2MtPm5vQ2hhbm5lbHMgPSBoQWFjQ29uZmlnLT5uQ2hhbm5lbHM7CisgIGNjLT5mbGFncyB8PSBDQ19JU19CQVNFTEFZRVI7CisgIGNjLT5jaGFubmVsTW9kZSA9IGhBYWNDb25maWctPmNoYW5uZWxNb2RlOwogCiAgIGNjLT5uU3ViRnJhbWVzID0gKGhBYWNDb25maWctPm5TdWJGcmFtZXMgPiAxICYmIGV4dENmZy0+dXNlclRwTnN1YkZyYW1lcyA9PSAxKQotICAgICAgICAgICAgICAgICA/IGhBYWNDb25maWctPm5TdWJGcmFtZXMKLSAgICAgICAgICAgICAgICAgOiBleHRDZmctPnVzZXJUcE5zdWJGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgID8gaEFhY0NvbmZpZy0+blN1YkZyYW1lcworICAgICAgICAgICAgICAgICAgICAgICA6IGV4dENmZy0+dXNlclRwTnN1YkZyYW1lczsKIAotICBjYy0+ZmxhZ3MgICAgICAgICAgfD0gKGV4dENmZy0+dXNlclRwUHJvdGVjdGlvbikgPyBDQ19QUk9URUNUSU9OIDogMDsKKyAgY2MtPmZsYWdzIHw9IChleHRDZmctPnVzZXJUcFByb3RlY3Rpb24pID8gQ0NfUFJPVEVDVElPTiA6IDA7CiAKLSAgaWYgKGV4dENmZy0+dXNlclRwSGVhZGVyUGVyaW9kIT0weEZGKSB7Ci0gICAgY2MtPmhlYWRlclBlcmlvZCAgICA9IGV4dENmZy0+dXNlclRwSGVhZGVyUGVyaW9kOwotICB9Ci0gIGVsc2UgeyAvKiBhdXRvLW1vZGUgKi8KKyAgaWYgKGV4dENmZy0+dXNlclRwSGVhZGVyUGVyaW9kICE9IDB4RkYpIHsKKyAgICBjYy0+aGVhZGVyUGVyaW9kID0gZXh0Q2ZnLT51c2VyVHBIZWFkZXJQZXJpb2Q7CisgIH0gZWxzZSB7IC8qIGF1dG8tbW9kZSAqLwogICAgIHN3aXRjaCAoZXh0Q2ZnLT51c2VyVHBUeXBlKSB7CiAgICAgICBjYXNlIFRUX01QNF9BRFRTOgogICAgICAgY2FzZSBUVF9NUDRfTE9BUzoKQEAgLTQ4NiwyNyArNTQ1LDY1IEBACiAgICAgfQogICB9CiAKLSAgY2MtPnNhbXBsZXNQZXJGcmFtZSA9IGhBYWNDb25maWctPmZyYW1lbGVuZ3RoOwotICBjYy0+c2FtcGxpbmdSYXRlICAgID0gaEFhY0NvbmZpZy0+c2FtcGxlUmF0ZTsKLQogICAvKiBNcGVnLTQgc2lnbmFsaW5nIGZvciB0cmFuc3BvcnQgbGlicmFyeS4gKi8KLSAgY2MtPmZsYWdzIHw9IENDX01QRUdfSUQ7CisgIHN3aXRjaCAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlKSB7CisgICAgY2FzZSBBT1RfTVAyX0FBQ19MQzoKKyAgICBjYXNlIEFPVF9NUDJfU0JSOgorICAgICAgY2MtPmZsYWdzICY9IH5DQ19NUEVHX0lEOyAvKiBSZXF1aXJlZCBmb3IgQURUUy4gKi8KKyAgICAgIGNjLT5leHRBT1QgPSBBT1RfTlVMTF9PQkpFQ1Q7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgY2MtPmZsYWdzIHw9IENDX01QRUdfSUQ7CisgIH0KIAogICAvKiBFUi10b29scyBzaWduYWxpbmcuICovCi0gIGNjLT5mbGFncyAgICAgfD0gKGhBYWNDb25maWctPnN5bnRheEZsYWdzICYgQUNfRVJfVkNCMTEpID8gQ0NfVkNCMTEgOiAwOwotICBjYy0+ZmxhZ3MgICAgIHw9IChoQWFjQ29uZmlnLT5zeW50YXhGbGFncyAmIEFDX0VSX0hDUikgICA/IENDX0hDUiA6IDA7Ci0gIGNjLT5mbGFncyAgICAgfD0gKGhBYWNDb25maWctPnN5bnRheEZsYWdzICYgQUNfRVJfUlZMQykgID8gQ0NfUlZMQyA6IDA7CisgIGNjLT5mbGFncyB8PSAoaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgJiBBQ19FUl9WQ0IxMSkgPyBDQ19WQ0IxMSA6IDA7CisgIGNjLT5mbGFncyB8PSAoaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgJiBBQ19FUl9IQ1IpID8gQ0NfSENSIDogMDsKKyAgY2MtPmZsYWdzIHw9IChoQWFjQ29uZmlnLT5zeW50YXhGbGFncyAmIEFDX0VSX1JWTEMpID8gQ0NfUlZMQyA6IDA7CiAKICAgLyogTWF0cml4IG1peGRvd24gY29lZmZpY2llbnQgY29uZmlndXJhdGlvbi4gKi8KLSAgaWYgKCAoZXh0Q2ZnLT51c2VyUGNlQWRkaXRpb25zJjB4MSkgJiYgKGhBYWNDb25maWctPmVwQ29uZmlnPT0tMSkKLSAgICAgICYmICgoY2MtPmNoYW5uZWxNb2RlPT1NT0RFXzFfMl8yKXx8KGNjLT5jaGFubmVsTW9kZT09TU9ERV8xXzJfMl8xKSkgKQotICB7Ci0gICAgY2MtPm1hdHJpeE1peGRvd25BICAgICAgID0gKChleHRDZmctPnVzZXJQY2VBZGRpdGlvbnM+PjEpJjB4MykrMTsKLSAgICBjYy0+ZmxhZ3MgfD0gKGV4dENmZy0+dXNlclBjZUFkZGl0aW9ucz4+MykmMHgxID8gQ0NfUFNFVURPX1NVUlJPVU5EIDogMDsKLSAgfQotICBlbHNlIHsKKyAgaWYgKChleHRDZmctPnVzZXJQY2VBZGRpdGlvbnMgJiAweDEpICYmIChoQWFjQ29uZmlnLT5lcENvbmZpZyA9PSAtMSkgJiYKKyAgICAgICgoY2MtPmNoYW5uZWxNb2RlID09IE1PREVfMV8yXzIpIHx8IChjYy0+Y2hhbm5lbE1vZGUgPT0gTU9ERV8xXzJfMl8xKSkpIHsKKyAgICBjYy0+bWF0cml4TWl4ZG93bkEgPSAoKGV4dENmZy0+dXNlclBjZUFkZGl0aW9ucyA+PiAxKSAmIDB4MykgKyAxOworICAgIGNjLT5mbGFncyB8PSAoZXh0Q2ZnLT51c2VyUGNlQWRkaXRpb25zID4+IDMpICYgMHgxID8gQ0NfUFNFVURPX1NVUlJPVU5EIDogMDsKKyAgfSBlbHNlIHsKICAgICBjYy0+bWF0cml4TWl4ZG93bkEgPSAwOwogICB9CisKKyAgY2MtPmNoYW5uZWxDb25maWdaZXJvID0gMDsKK30KKworLyoKKyAqIFZhbGlkYXRlIHByZWZpbGxlZCBwb2ludGVycyB3aXRoaW4gYnVmZmVyIGRlc2NyaXB0b3IuCisgKgorICogXHBhcmFtIHBCdWZEZXNjICAgICAgICAgICAgICBQb2ludGVyIHRvIGJ1ZmZlciBkZXNjcmlwdG9yCisKKyAqIFxyZXR1cm4gLSBBQUNFTkNfT0ssIGFsbCBmaW5lLgorICogICAgICAgICAtIEFBQ0VOQ19JTlZBTElEX0hBTkRMRSwgb24gbWlzc2luZyBwb2ludGVyIGluaXRpYWxpemlhdGlvbi4KKyAqICAgICAgICAgLSBBQUNFTkNfVU5TVVBQT1JURURfUEFSQU1FVEVSLCBvbiBpbmNvcnJlY3QgYnVmZmVyIGRlc2NyaXB0b3IKKyBpbml0aWFsaXphdGlvbi4KKyAqLworc3RhdGljIEFBQ0VOQ19FUlJPUiB2YWxpZGF0ZUJ1ZkRlc2MoY29uc3QgQUFDRU5DX0J1ZkRlc2MgKnBCdWZEZXNjKSB7CisgIEFBQ0VOQ19FUlJPUiBlcnIgPSBBQUNFTkNfT0s7CisKKyAgaWYgKHBCdWZEZXNjICE9IE5VTEwpIHsKKyAgICBpbnQgaTsKKyAgICBpZiAoKHBCdWZEZXNjLT5idWZmZXJJZGVudGlmaWVycyA9PSBOVUxMKSB8fCAocEJ1ZkRlc2MtPmJ1ZlNpemVzID09IE5VTEwpIHx8CisgICAgICAgIChwQnVmRGVzYy0+YnVmRWxTaXplcyA9PSBOVUxMKSB8fCAocEJ1ZkRlc2MtPmJ1ZnMgPT0gTlVMTCkpIHsKKyAgICAgIGVyciA9IEFBQ0VOQ19VTlNVUFBPUlRFRF9QQVJBTUVURVI7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBwQnVmRGVzYy0+bnVtQnVmczsgaSsrKSB7CisgICAgICBpZiAocEJ1ZkRlc2MtPmJ1ZnNbaV0gPT0gTlVMTCkgeworICAgICAgICBlcnIgPSBBQUNFTkNfVU5TVVBQT1JURURfUEFSQU1FVEVSOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfQorYmFpbDoKKyAgcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTUxOCwxOTUgKzYxNSwxNzIgQEAKICAqIFxyZXR1cm4gLSBCdWZmZXIgZGVzY3JpcHRvciBpbmRleC4KICAqICAgICAgICAgLTEsIGlmIHRoZXJlIGlzIG5vIGVudHJ5IGF2YWlsYWJsZS4KICAqLwotc3RhdGljIElOVCBnZXRCdWZEZXNjSWR4KAotICAgICAgICBjb25zdCBBQUNFTkNfQnVmRGVzYyAgICAgICAgICpwQnVmRGVzYywKLSAgICAgICAgY29uc3QgQUFDRU5DX0J1ZmZlcklkZW50aWZpZXIgaWRlbnRpZmllcgotKQotewotICAgIElOVCBpLCBpZHggPSAtMTsKK3N0YXRpYyBJTlQgZ2V0QnVmRGVzY0lkeChjb25zdCBBQUNFTkNfQnVmRGVzYyAqcEJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFDRU5DX0J1ZmZlcklkZW50aWZpZXIgaWRlbnRpZmllcikgeworICBJTlQgaSwgaWR4ID0gLTE7CiAKLSAgICBmb3IgKGk9MDsgaTxwQnVmRGVzYy0+bnVtQnVmczsgaSsrKSB7Ci0gICAgICBpZiAoIChBQUNFTkNfQnVmZmVySWRlbnRpZmllcilwQnVmRGVzYy0+YnVmZmVySWRlbnRpZmllcnNbaV0gPT0gaWRlbnRpZmllciApIHsKKyAgaWYgKHBCdWZEZXNjICE9IE5VTEwpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcEJ1ZkRlc2MtPm51bUJ1ZnM7IGkrKykgeworICAgICAgaWYgKChBQUNFTkNfQnVmZmVySWRlbnRpZmllcilwQnVmRGVzYy0+YnVmZmVySWRlbnRpZmllcnNbaV0gPT0KKyAgICAgICAgICBpZGVudGlmaWVyKSB7CiAgICAgICAgIGlkeCA9IGk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gaWR4OworICB9CisgIHJldHVybiBpZHg7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gRGVjbGFyYXRpb25zCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBBQUNfRU5DT0RFUl9FUlJPUiBhYWNFbmNEZWZhdWx0Q29uZmlnKEhBTkRMRV9BQUNFTkNfQ09ORklHIGhBYWNDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRVJfUEFSQU0gKmNvbmZpZykKLXsKLSAgICAvKiBtYWtlIHJlYXNvbmFibGUgZGVmYXVsdCBzZXR0aW5ncyAqLwotICAgIEZES2FhY0VuY19BYWNJbml0RGVmYXVsdENvbmZpZyAoaEFhY0NvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRVJfUEFSQU0gKmNvbmZpZykgeworICAvKiBtYWtlIHJlYXNvbmFibGUgZGVmYXVsdCBzZXR0aW5ncyAqLworICBGREthYWNFbmNfQWFjSW5pdERlZmF1bHRDb25maWcoaEFhY0NvbmZpZyk7CiAKLSAgICAvKiBjbGVhciBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBhbmQgY29weSBkZWZhdWx0IHNldHRpbmdzICovCi0gICAgRkRLbWVtY2xlYXIoY29uZmlnLCBzaXplb2YoVVNFUl9QQVJBTSkpOworICAvKiBjbGVhciBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBhbmQgY29weSBkZWZhdWx0IHNldHRpbmdzICovCisgIEZES21lbWNsZWFyKGNvbmZpZywgc2l6ZW9mKFVTRVJfUEFSQU0pKTsKIAotICAgIC8qIGNvcHkgZW5jb2RlciBjb25maWd1cmF0aW9uIHNldHRpbmdzICovCi0gICAgY29uZmlnLT5uQ2hhbm5lbHMgICAgICAgPSBoQWFjQ29uZmlnLT5uQ2hhbm5lbHM7Ci0gICAgY29uZmlnLT51c2VyQU9UID0gaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlID0gQU9UX0FBQ19MQzsKLSAgICBjb25maWctPnVzZXJTYW1wbGVyYXRlICA9IGhBYWNDb25maWctPnNhbXBsZVJhdGU7Ci0gICAgY29uZmlnLT51c2VyQ2hhbm5lbE1vZGUgPSBoQWFjQ29uZmlnLT5jaGFubmVsTW9kZTsKLSAgICBjb25maWctPnVzZXJCaXRyYXRlICAgICA9IGhBYWNDb25maWctPmJpdFJhdGU7Ci0gICAgY29uZmlnLT51c2VyQml0cmF0ZU1vZGUgPSBoQWFjQ29uZmlnLT5iaXRyYXRlTW9kZTsKLSAgICBjb25maWctPnVzZXJQZWFrQml0cmF0ZSA9IChVSU5UKS0xOwotICAgIGNvbmZpZy0+dXNlckJhbmR3aWR0aCAgID0gaEFhY0NvbmZpZy0+YmFuZFdpZHRoOwotICAgIGNvbmZpZy0+dXNlclRucyAgICAgICAgID0gaEFhY0NvbmZpZy0+dXNlVG5zOwotICAgIGNvbmZpZy0+dXNlclBucyAgICAgICAgID0gaEFhY0NvbmZpZy0+dXNlUG5zOwotICAgIGNvbmZpZy0+dXNlckludGVuc2l0eSAgID0gaEFhY0NvbmZpZy0+dXNlSVM7Ci0gICAgY29uZmlnLT51c2VyQWZ0ZXJidXJuZXIgPSBoQWFjQ29uZmlnLT51c2VSZXF1YW50OwotICAgIGNvbmZpZy0+dXNlckZyYW1lbGVuZ3RoID0gKFVJTlQpLTE7CisgIC8qIGNvcHkgZW5jb2RlciBjb25maWd1cmF0aW9uIHNldHRpbmdzICovCisgIGNvbmZpZy0+bkNoYW5uZWxzID0gaEFhY0NvbmZpZy0+bkNoYW5uZWxzOworICBjb25maWctPnVzZXJBT1QgPSBoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgPSBBT1RfQUFDX0xDOworICBjb25maWctPnVzZXJTYW1wbGVyYXRlID0gaEFhY0NvbmZpZy0+c2FtcGxlUmF0ZTsKKyAgY29uZmlnLT51c2VyQ2hhbm5lbE1vZGUgPSBoQWFjQ29uZmlnLT5jaGFubmVsTW9kZTsKKyAgY29uZmlnLT51c2VyQml0cmF0ZSA9IGhBYWNDb25maWctPmJpdFJhdGU7CisgIGNvbmZpZy0+dXNlckJpdHJhdGVNb2RlID0gaEFhY0NvbmZpZy0+Yml0cmF0ZU1vZGU7CisgIGNvbmZpZy0+dXNlclBlYWtCaXRyYXRlID0gKFVJTlQpLTE7CisgIGNvbmZpZy0+dXNlckJhbmR3aWR0aCA9IGhBYWNDb25maWctPmJhbmRXaWR0aDsKKyAgY29uZmlnLT51c2VyVG5zID0gaEFhY0NvbmZpZy0+dXNlVG5zOworICBjb25maWctPnVzZXJQbnMgPSBoQWFjQ29uZmlnLT51c2VQbnM7CisgIGNvbmZpZy0+dXNlckludGVuc2l0eSA9IGhBYWNDb25maWctPnVzZUlTOworICBjb25maWctPnVzZXJBZnRlcmJ1cm5lciA9IGhBYWNDb25maWctPnVzZVJlcXVhbnQ7CisgIGNvbmZpZy0+dXNlckZyYW1lbGVuZ3RoID0gKFVJTlQpLTE7CiAKLSAgICBpZiAoaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgJiBBQ19FUl9WQ0IxMSkgewotICAgICAgY29uZmlnLT51c2VyRXJUb29scyAgfD0gMHgwMTsKLSAgICB9Ci0gICAgaWYgKGhBYWNDb25maWctPnN5bnRheEZsYWdzICYgQUNfRVJfSENSKSB7Ci0gICAgICBjb25maWctPnVzZXJFclRvb2xzICB8PSAweDAyOwotICAgIH0KKyAgY29uZmlnLT51c2VyRG93bnNjYWxlRmFjdG9yID0gMTsKIAotICAgIC8qIGluaXRpYWxpemUgdHJhbnNwb3J0IHBhcmFtZXRlcnMgKi8KLSAgICBjb25maWctPnVzZXJUcFR5cGUgICAgICAgICA9IFRUX1VOS05PV047Ci0gICAgY29uZmlnLT51c2VyVHBBbXh2ICAgICAgICAgPSAwOwotICAgIGNvbmZpZy0+dXNlclRwU2lnbmFsaW5nICAgID0gMHhGRjsgICAgLyogY2hvb3NlIHNpZ25hbGluZyBhdXRvbWF0aWNhbGx5ICovCi0gICAgY29uZmlnLT51c2VyVHBOc3ViRnJhbWVzICAgPSAxOwotICAgIGNvbmZpZy0+dXNlclRwUHJvdGVjdGlvbiAgID0gMDsgICAgLyogbm90IGNyYyBwcm90ZWN0ZWQqLwotICAgIGNvbmZpZy0+dXNlclRwSGVhZGVyUGVyaW9kID0gMHhGRjsgLyogaGVhZGVyIHBlcmlvZCBpbiBhdXRvIG1vZGUgKi8KLSAgICBjb25maWctPnVzZXJQY2VBZGRpdGlvbnMgICA9IDA7ICAgIC8qIG5vIG1hdHJpeCBtaXhkb3duIGNvZWZmaWNpZW50ICovCi0gICAgY29uZmlnLT51c2VyTWV0YURhdGFNb2RlICAgPSAwOyAgICAvKiBkbyBub3QgZW1iZWQgYW55IG1ldGEgZGF0YSBpbmZvICovCisgIC8qIGluaXRpYWxpemUgdHJhbnNwb3J0IHBhcmFtZXRlcnMgKi8KKyAgY29uZmlnLT51c2VyVHBUeXBlID0gVFRfVU5LTk9XTjsKKyAgY29uZmlnLT51c2VyVHBBbXh2ID0gMDsKKyAgY29uZmlnLT51c2VyVHBTaWduYWxpbmcgPSAweEZGOyAvKiBjaG9vc2Ugc2lnbmFsaW5nIGF1dG9tYXRpY2FsbHkgKi8KKyAgY29uZmlnLT51c2VyVHBOc3ViRnJhbWVzID0gMTsKKyAgY29uZmlnLT51c2VyVHBQcm90ZWN0aW9uID0gMDsgICAgICAvKiBub3QgY3JjIHByb3RlY3RlZCovCisgIGNvbmZpZy0+dXNlclRwSGVhZGVyUGVyaW9kID0gMHhGRjsgLyogaGVhZGVyIHBlcmlvZCBpbiBhdXRvIG1vZGUgKi8KKyAgY29uZmlnLT51c2VyUGNlQWRkaXRpb25zID0gMDsgICAgICAvKiBubyBtYXRyaXggbWl4ZG93biBjb2VmZmljaWVudCAqLworICBjb25maWctPnVzZXJNZXRhRGF0YU1vZGUgPSAwOyAgICAgIC8qIGRvIG5vdCBlbWJlZCBhbnkgbWV0YSBkYXRhIGluZm8gKi8KIAotICAgIGNvbmZpZy0+dXNlckFuY0RhdGFSYXRlICAgID0gMDsKKyAgY29uZmlnLT51c2VyQW5jRGF0YVJhdGUgPSAwOwogCi0gICAgLyogU0JSIHJhdGUgaXMgc2V0IHRvIDAgaGVyZSwgd2hpY2ggbWVhbnMgaXQgc2hvdWxkIGJlIHNldCBhdXRvbWF0aWNhbGx5Ci0gICAgICAgaW4gRkRLYWFjRW5jX0FkanVzdEVuY1NldHRpbmdzKCkgaWYgdGhlIHVzZXIgZGlkIG5vdCBzZXQgYSByYXRlCi0gICAgICAgZXhwaWxpY2l0ZWx5LiAqLwotICAgIGNvbmZpZy0+dXNlclNiclJhdGlvID0gMDsKKyAgLyogU0JSIHJhdGUgaXMgc2V0IHRvIDAgaGVyZSwgd2hpY2ggbWVhbnMgaXQgc2hvdWxkIGJlIHNldCBhdXRvbWF0aWNhbGx5CisgICAgIGluIEZES2FhY0VuY19BZGp1c3RFbmNTZXR0aW5ncygpIGlmIHRoZSB1c2VyIGRpZCBub3Qgc2V0IGEgcmF0ZQorICAgICBleHBpbGljaXRlbHkuICovCisgIGNvbmZpZy0+dXNlclNiclJhdGlvID0gMDsKIAotICAgIC8qIFNCUiBlbmFibGUgc2V0IHRvIC0xIG1lYW5zIHRvIGlucXVpcmUgRUxEIGF1ZGlvIGNvbmZpZ3VyYXRvciBmb3IgcmVhc29uYWJsZSBjb25maWd1cmF0aW9uLiAqLwotICAgIGNvbmZpZy0+dXNlclNickVuYWJsZWQgICAgID0gLTE7CisgIC8qIFNCUiBlbmFibGUgc2V0IHRvIC0xIG1lYW5zIHRvIGlucXVpcmUgRUxEIGF1ZGlvIGNvbmZpZ3VyYXRvciBmb3IgcmVhc29uYWJsZQorICAgKiBjb25maWd1cmF0aW9uLiAqLworICBjb25maWctPnVzZXJTYnJFbmFibGVkID0gKFVDSEFSKS0xOwogCi0gICAgcmV0dXJuIEFBQ19FTkNfT0s7CisgIHJldHVybiBBQUNfRU5DX09LOwogfQogCi1zdGF0aWMKLXZvaWQgYWFjRW5jRGlzdHJpYnV0ZVNickJpdHMoQ0hBTk5FTF9NQVBQSU5HICpjaGFubmVsTWFwcGluZywgU0JSX0VMRU1FTlRfSU5GTyAqc2JyRWxJbmZvLCBJTlQgYml0UmF0ZSkKLXsKK3N0YXRpYyB2b2lkIGFhY0VuY0Rpc3RyaWJ1dGVTYnJCaXRzKENIQU5ORUxfTUFQUElORyAqY2hhbm5lbE1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfRUxFTUVOVF9JTkZPICpzYnJFbEluZm8sIElOVCBiaXRSYXRlKSB7CiAgIElOVCBjb2RlYml0cyA9IGJpdFJhdGU7CiAgIGludCBlbDsKIAogICAvKiBDb3B5IEVsZW1lbnQgaW5mbyAqLwotICBmb3IgKGVsPTA7IGVsPGNoYW5uZWxNYXBwaW5nLT5uRWxlbWVudHM7IGVsKyspIHsKLSAgICAgIHNickVsSW5mb1tlbF0uQ2hhbm5lbEluZGV4WzBdID0gY2hhbm5lbE1hcHBpbmctPmVsSW5mb1tlbF0uQ2hhbm5lbEluZGV4WzBdOwotICAgICAgc2JyRWxJbmZvW2VsXS5DaGFubmVsSW5kZXhbMV0gPSBjaGFubmVsTWFwcGluZy0+ZWxJbmZvW2VsXS5DaGFubmVsSW5kZXhbMV07Ci0gICAgICBzYnJFbEluZm9bZWxdLmVsVHlwZSAgICAgICAgICA9IGNoYW5uZWxNYXBwaW5nLT5lbEluZm9bZWxdLmVsVHlwZTsKLSAgICAgIHNickVsSW5mb1tlbF0uYml0UmF0ZSAgICAgICAgID0gKElOVCkoZk11bHROb3JtKGNoYW5uZWxNYXBwaW5nLT5lbEluZm9bZWxdLnJlbGF0aXZlQml0cywgKEZJWFBfREJMKWJpdFJhdGUpKTsKLSAgICAgIHNickVsSW5mb1tlbF0uaW5zdGFuY2VUYWcgICAgID0gY2hhbm5lbE1hcHBpbmctPmVsSW5mb1tlbF0uaW5zdGFuY2VUYWc7Ci0gICAgICBzYnJFbEluZm9bZWxdLm5DaGFubmVsc0luRWwgICA9IGNoYW5uZWxNYXBwaW5nLT5lbEluZm9bZWxdLm5DaGFubmVsc0luRWw7CisgIGZvciAoZWwgPSAwOyBlbCA8IGNoYW5uZWxNYXBwaW5nLT5uRWxlbWVudHM7IGVsKyspIHsKKyAgICBzYnJFbEluZm9bZWxdLkNoYW5uZWxJbmRleFswXSA9IGNoYW5uZWxNYXBwaW5nLT5lbEluZm9bZWxdLkNoYW5uZWxJbmRleFswXTsKKyAgICBzYnJFbEluZm9bZWxdLkNoYW5uZWxJbmRleFsxXSA9IGNoYW5uZWxNYXBwaW5nLT5lbEluZm9bZWxdLkNoYW5uZWxJbmRleFsxXTsKKyAgICBzYnJFbEluZm9bZWxdLmVsVHlwZSA9IGNoYW5uZWxNYXBwaW5nLT5lbEluZm9bZWxdLmVsVHlwZTsKKyAgICBzYnJFbEluZm9bZWxdLmJpdFJhdGUgPQorICAgICAgICBmTXVsdElmbG9vcihjaGFubmVsTWFwcGluZy0+ZWxJbmZvW2VsXS5yZWxhdGl2ZUJpdHMsIGJpdFJhdGUpOworICAgIHNickVsSW5mb1tlbF0uaW5zdGFuY2VUYWcgPSBjaGFubmVsTWFwcGluZy0+ZWxJbmZvW2VsXS5pbnN0YW5jZVRhZzsKKyAgICBzYnJFbEluZm9bZWxdLm5DaGFubmVsc0luRWwgPSBjaGFubmVsTWFwcGluZy0+ZWxJbmZvW2VsXS5uQ2hhbm5lbHNJbkVsOworICAgIHNickVsSW5mb1tlbF0uZlBhcmFtZXRyaWNTdGVyZW8gPSAwOworICAgIHNickVsSW5mb1tlbF0uZkR1YWxNb25vID0gMDsKIAotICAgICAgY29kZWJpdHMgLT0gc2JyRWxJbmZvW2VsXS5iaXRSYXRlOworICAgIGNvZGViaXRzIC09IHNickVsSW5mb1tlbF0uYml0UmF0ZTsKICAgfQogICBzYnJFbEluZm9bMF0uYml0UmF0ZSArPSBjb2RlYml0czsKIH0KIAotCi1zdGF0aWMKLUlOVCBhYWNFbmNvZGVyX0xpbWl0Qml0cmF0ZSgKLSAgICAgICAgY29uc3QgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGluZ1JhdGUsCi0gICAgICAgIGNvbnN0IElOVCBmcmFtZUxlbmd0aCwKLSAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscywKLSAgICAgICAgY29uc3QgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlLAotICAgICAgICBJTlQgYml0UmF0ZSwKLSAgICAgICAgY29uc3QgSU5UIG5TdWJGcmFtZXMsCi0gICAgICAgIGNvbnN0IElOVCBzYnJBY3RpdmUsCi0gICAgICAgIGNvbnN0IElOVCBzYnJEb3duU2FtcGxlUmF0ZSwKLSAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgYW90Ci0gICAgICAgICkKLXsKK3N0YXRpYyBJTlQgYWFjRW5jb2Rlcl9MaW1pdEJpdHJhdGUoY29uc3QgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBmcmFtZUxlbmd0aCwgY29uc3QgSU5UIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlLCBJTlQgYml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5TdWJGcmFtZXMsIGNvbnN0IElOVCBzYnJBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzYnJEb3duU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBzeW50YXhGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgYW90KSB7CiAgIElOVCBjb3JlU2FtcGxpbmdSYXRlOwogICBDSEFOTkVMX01BUFBJTkcgY207CiAKICAgRkRLYWFjRW5jX0luaXRDaGFubmVsTWFwcGluZyhjaGFubmVsTW9kZSwgQ0hfT1JERVJfTVBFRywgJmNtKTsKIAogICBpZiAoc2JyQWN0aXZlKSB7Ci0gICAgY29yZVNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZSA+PiAgKHNickVuY29kZXJfSXNTaW5nbGVSYXRlUG9zc2libGUoYW90KSA/IChzYnJEb3duU2FtcGxlUmF0ZS0xKToxKTsKKyAgICBjb3JlU2FtcGxpbmdSYXRlID0KKyAgICAgICAgc2FtcGxpbmdSYXRlID4+CisgICAgICAgIChzYnJFbmNvZGVyX0lzU2luZ2xlUmF0ZVBvc3NpYmxlKGFvdCkgPyAoc2JyRG93blNhbXBsZVJhdGUgLSAxKSA6IDEpOwogICB9IGVsc2UgewogICAgIGNvcmVTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CiAgIH0KIAotICAvKiBDb25zaWRlciBiYW5kd2lkdGggY2hhbm5lbCBiaXQgcmF0ZSBsaW1pdCAoc2VlIGJhbmR3aWR0aC5jcHA6IEdldEJhbmR3aWR0aEVudHJ5KCkpICovCi0gIGlmIChhb3QgPT0gQU9UX0VSX0FBQ19MRCB8fCBhb3QgPT0gQU9UX0VSX0FBQ19FTEQpIHsKLSAgICBiaXRSYXRlID0gRkRLbWluKDM2MDAwMCpuQ2hhbm5lbHMsIGJpdFJhdGUpOwotICAgIGJpdFJhdGUgPSBGREttYXgoODAwMCpuQ2hhbm5lbHMsIGJpdFJhdGUpOwotICB9Ci0KLSAgaWYgKGFvdCA9PSBBT1RfQUFDX0xDIHx8IGFvdCA9PSBBT1RfU0JSIHx8IGFvdCA9PSBBT1RfUFMpICB7Ci0gICAgYml0UmF0ZSA9IEZES21pbig1NzYwMDAqbkNoYW5uZWxzLCBiaXRSYXRlKTsKLSAgICAvKmJpdFJhdGUgPSBGREttYXgoMCpuQ2hhbm5lbHMsIGJpdFJhdGUpOyovCi0gIH0KLQotCiAgIC8qIExpbWl0IGJpdCByYXRlIGluIHJlc3BlY3QgdG8gdGhlIGNvcmUgY29kZXIgKi8KLSAgYml0UmF0ZSA9IEZES2FhY0VuY19MaW1pdEJpdHJhdGUoCi0gICAgICAgICAgaFRwRW5jLAotICAgICAgICAgIGNvcmVTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgZnJhbWVMZW5ndGgsCi0gICAgICAgICAgbkNoYW5uZWxzLAotICAgICAgICAgIGNtLm5DaGFubmVsc0VmZiwKLSAgICAgICAgICBiaXRSYXRlLAotICAgICAgICAgIC0xLAotICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgLTEsCi0gICAgICAgICAgblN1YkZyYW1lcwotICAgICAgICAgICk7CisgIGJpdFJhdGUgPSBGREthYWNFbmNfTGltaXRCaXRyYXRlKGhUcEVuYywgYW90LCBjb3JlU2FtcGxpbmdSYXRlLCBmcmFtZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLCBjbS5uQ2hhbm5lbHNFZmYsIGJpdFJhdGUsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBBQUNFTkNfQlJfTU9ERV9JTlZBTElELCBuU3ViRnJhbWVzKTsKIAogICAvKiBMaW1pdCBiaXQgcmF0ZSBpbiByZXNwZWN0IHRvIGF2YWlsYWJsZSBTQlIgbW9kZXMgaWYgYWN0aXZlICovCi0gIGlmIChzYnJBY3RpdmUpCi0gIHsKKyAgaWYgKHNickFjdGl2ZSkgewogICAgIGludCBudW1JdGVyYXRpb25zID0gMDsKICAgICBJTlQgaW5pdGlhbEJpdHJhdGUsIGFkanVzdGVkQml0cmF0ZTsKLSAgICBpbml0aWFsQml0cmF0ZSA9IGFkanVzdGVkQml0cmF0ZSA9IGJpdFJhdGU7CisgICAgYWRqdXN0ZWRCaXRyYXRlID0gYml0UmF0ZTsKIAotICAgIC8qIEZpbmQgdG90YWwgYml0cmF0ZSB3aGljaCBwcm92aWRlcyB2YWxpZCBjb25maWd1cmF0aW9uIGZvciBlYWNoIFNCUiBlbGVtZW50LiAqLworICAgIC8qIEZpbmQgdG90YWwgYml0cmF0ZSB3aGljaCBwcm92aWRlcyB2YWxpZCBjb25maWd1cmF0aW9uIGZvciBlYWNoIFNCUgorICAgICAqIGVsZW1lbnQuICovCiAgICAgZG8gewogICAgICAgaW50IGU7Ci0gICAgICBTQlJfRUxFTUVOVF9JTkZPIHNickVsSW5mb1soOCldOwotICAgICAgRkRLX0FTU0VSVChjbS5uRWxlbWVudHMgPD0gKDgpKTsKKyAgICAgIFNCUl9FTEVNRU5UX0lORk8gc2JyRWxJbmZvWygoOCkpXTsKKyAgICAgIEZES19BU1NFUlQoY20ubkVsZW1lbnRzIDw9ICgoOCkpKTsKIAogICAgICAgaW5pdGlhbEJpdHJhdGUgPSBhZGp1c3RlZEJpdHJhdGU7CiAKICAgICAgIC8qIEdldCBiaXQgcmF0ZSBmb3IgZWFjaCBTQlIgZWxlbWVudCAqLwogICAgICAgYWFjRW5jRGlzdHJpYnV0ZVNickJpdHMoJmNtLCBzYnJFbEluZm8sIGluaXRpYWxCaXRyYXRlKTsKIAotICAgICAgZm9yIChlPTA7IGU8Y20ubkVsZW1lbnRzOyBlKyspCi0gICAgICB7CisgICAgICBmb3IgKGUgPSAwOyBlIDwgY20ubkVsZW1lbnRzOyBlKyspIHsKICAgICAgICAgSU5UIHNickVsZW1lbnRCaXRSYXRlSW4sIHNickJpdFJhdGVPdXQ7CiAKICAgICAgICAgaWYgKGNtLmVsSW5mb1tlXS5lbFR5cGUgIT0gSURfU0NFICYmIGNtLmVsSW5mb1tlXS5lbFR5cGUgIT0gSURfQ1BFKSB7CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgc2JyRWxlbWVudEJpdFJhdGVJbiA9IHNickVsSW5mb1tlXS5iaXRSYXRlOwotICAgICAgICBzYnJCaXRSYXRlT3V0ID0gc2JyRW5jb2Rlcl9MaW1pdEJpdFJhdGUoc2JyRWxlbWVudEJpdFJhdGVJbiAsIGNtLmVsSW5mb1tlXS5uQ2hhbm5lbHNJbkVsLCBjb3JlU2FtcGxpbmdSYXRlLCBhb3QpOworCisgICAgICAgIHNickJpdFJhdGVPdXQgPSBzYnJFbmNvZGVyX0xpbWl0Qml0UmF0ZShzYnJFbGVtZW50Qml0UmF0ZUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20uZWxJbmZvW2VdLm5DaGFubmVsc0luRWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlU2FtcGxpbmdSYXRlLCBhb3QpOworCiAgICAgICAgIGlmIChzYnJCaXRSYXRlT3V0ID09IDApIHsKICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogCi0gICAgICAgIC8qIElmIGJpdHJhdGVzIGRvbid0IG1hdGNoLCBkaXN0cmlidXRpb24gYW5kIGxpbWl0aW5nIG5lZWRzIHRvIGJlIGRldGVybWluZWQgYWdhaW4uCi0gICAgICAgICAgIEFib3J0IGVsZW1lbnQgbG9vcCBhbmQgcmVzdGFydCB3aXRoIGFkYXB0ZWQgYml0cmF0ZS4gKi8KKyAgICAgICAgLyogSWYgYml0cmF0ZXMgZG9uJ3QgbWF0Y2gsIGRpc3RyaWJ1dGlvbiBhbmQgbGltaXRpbmcgbmVlZHMgdG8gYmUKKyAgICAgICAgICAgZGV0ZXJtaW5lZCBhZ2Fpbi4gQWJvcnQgZWxlbWVudCBsb29wIGFuZCByZXN0YXJ0IHdpdGggYWRhcHRlZAorICAgICAgICAgICBiaXRyYXRlLiAqLwogICAgICAgICBpZiAoc2JyRWxlbWVudEJpdFJhdGVJbiAhPSBzYnJCaXRSYXRlT3V0KSB7Ci0KICAgICAgICAgICBpZiAoc2JyRWxlbWVudEJpdFJhdGVJbiA8IHNickJpdFJhdGVPdXQpIHsKLSAgICAgICAgICAgIGFkanVzdGVkQml0cmF0ZSA9IGZNYXgoaW5pdGlhbEJpdHJhdGUsIChJTlQpZkRpdk5vcm0oKEZJWFBfREJMKShzYnJCaXRSYXRlT3V0KzgpLCBjbS5lbEluZm9bZV0ucmVsYXRpdmVCaXRzKSk7CisgICAgICAgICAgICBhZGp1c3RlZEJpdHJhdGUgPSBmTWF4KGluaXRpYWxCaXRyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UKWZEaXZOb3JtKChGSVhQX0RCTCkoc2JyQml0UmF0ZU91dCArIDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLmVsSW5mb1tlXS5yZWxhdGl2ZUJpdHMpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KIAogICAgICAgICAgIGlmIChzYnJFbGVtZW50Qml0UmF0ZUluID4gc2JyQml0UmF0ZU91dCkgewotICAgICAgICAgICAgYWRqdXN0ZWRCaXRyYXRlID0gZk1pbihpbml0aWFsQml0cmF0ZSwgKElOVClmRGl2Tm9ybSgoRklYUF9EQkwpKHNickJpdFJhdGVPdXQtOCksIGNtLmVsSW5mb1tlXS5yZWxhdGl2ZUJpdHMpKTsKKyAgICAgICAgICAgIGFkanVzdGVkQml0cmF0ZSA9IGZNaW4oaW5pdGlhbEJpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQpZkRpdk5vcm0oKEZJWFBfREJMKShzYnJCaXRSYXRlT3V0IC0gOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20uZWxJbmZvW2VdLnJlbGF0aXZlQml0cykpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQogCkBAIC03MTYsMjg5ICs3OTAsNDIyIEBACiAKICAgICAgIG51bUl0ZXJhdGlvbnMrKzsgLyogcmVzdHJpY3QgaXRlcmF0aW9uIHRvIHdvcnN0IGNhc2Ugb2YgbnVtIGVsZW1lbnRzICovCiAKLSAgICB9IHdoaWxlICggKGluaXRpYWxCaXRyYXRlIT1hZGp1c3RlZEJpdHJhdGUpICYmIChudW1JdGVyYXRpb25zPD1jbS5uRWxlbWVudHMpICk7CisgICAgfSB3aGlsZSAoKGluaXRpYWxCaXRyYXRlICE9IGFkanVzdGVkQml0cmF0ZSkgJiYKKyAgICAgICAgICAgICAobnVtSXRlcmF0aW9ucyA8PSBjbS5uRWxlbWVudHMpKTsKIAogICAgIC8qIFVuZXF1YWwgYml0cmF0ZXMgbWVhbiB0aGF0IG5vIHJlYXNvbmFibGUgYml0cmF0ZSBjb25maWd1cmF0aW9uIGZvdW5kLiAqLwotICAgIGJpdFJhdGUgPSAoaW5pdGlhbEJpdHJhdGU9PWFkanVzdGVkQml0cmF0ZSkgPyBhZGp1c3RlZEJpdHJhdGUgOiAwOworICAgIGJpdFJhdGUgPSAoaW5pdGlhbEJpdHJhdGUgPT0gYWRqdXN0ZWRCaXRyYXRlKSA/IGFkanVzdGVkQml0cmF0ZSA6IDA7CiAgIH0KIAotICBGREtfQVNTRVJUKGJpdFJhdGUgPiAwKTsKKyAgLyogTGltaXQgYml0IHJhdGUgaW4gcmVzcGVjdCB0byBhdmFpbGFibGUgTVBTIG1vZGVzIGlmIGFjdGl2ZSAqLworICBpZiAoKGFvdCA9PSBBT1RfRVJfQUFDX0VMRCkgJiYgKHN5bnRheEZsYWdzICYgQUNfTERfTVBTKSAmJgorICAgICAgKGNoYW5uZWxNb2RlID09IE1PREVfMSkpIHsKKyAgICBiaXRSYXRlID0gRkRLX01wZWdzRW5jX0dldENsb3Nlc3RCaXRSYXRlKAorICAgICAgICBhb3QsIE1PREVfMjEyLCBzYW1wbGluZ1JhdGUsIChzYnJBY3RpdmUpID8gc2JyRG93blNhbXBsZVJhdGUgOiAwLAorICAgICAgICBiaXRSYXRlKTsKKyAgfQogCiAgIHJldHVybiBiaXRSYXRlOwogfQogCiAvKgorICogXGJyaWVmIEdldCBDQlIgYml0cmF0ZQorICoKKyAqIFxoQWFjQ29uZmlnIEludGVybmFsIGVuY29kZXIgY29uZmlnCisgKiBccmV0dXJuICAgICBCaXRyYXRlCisgKi8KK3N0YXRpYyBJTlQgRkRLYWFjRW5jX0dldENCUkJpdHJhdGUoY29uc3QgSEFORExFX0FBQ0VOQ19DT05GSUcgaEFhY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHVzZXJTYnJSYXRpbykgeworICBJTlQgYml0cmF0ZSA9IEZES2FhY0VuY19HZXRDaGFubmVsTW9kZUNvbmZpZ3VyYXRpb24oaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUpCisgICAgICAgICAgICAgICAgICAgIC0+bkNoYW5uZWxzRWZmICoKKyAgICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5zYW1wbGVSYXRlOworCisgIGlmIChpc1BzQWN0aXZlKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSkpIHsKKyAgICBiaXRyYXRlID0gMSAqIGJpdHJhdGU7IC8qIDAuNSBiaXQgcGVyIHNhbXBsZSAqLworICB9IGVsc2UgaWYgKGlzU2JyQWN0aXZlKGhBYWNDb25maWcpKSB7CisgICAgaWYgKCh1c2VyU2JyUmF0aW8gPT0gMikgfHwKKyAgICAgICAgKCh1c2VyU2JyUmF0aW8gPT0gMCkgJiYKKyAgICAgICAgIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgIT0gQU9UX0VSX0FBQ19FTEQpKSkgeworICAgICAgYml0cmF0ZSA9IChiaXRyYXRlICsgKGJpdHJhdGUgPj4gMikpID4+IDE7IC8qIDAuNjI1IGJpdHMgcGVyIHNhbXBsZSAqLworICAgIH0KKyAgICBpZiAoKHVzZXJTYnJSYXRpbyA9PSAxKSB8fAorICAgICAgICAoKHVzZXJTYnJSYXRpbyA9PSAwKSAmJgorICAgICAgICAgKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0VMRCkpKSB7CisgICAgICBiaXRyYXRlID0gKGJpdHJhdGUgKyAoYml0cmF0ZSA+PiAzKSk7IC8qIDEuMTI1IGJpdHMgcGVyIHNhbXBsZSAqLworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBiaXRyYXRlID0gYml0cmF0ZSArIChiaXRyYXRlID4+IDEpOyAvKiAxLjUgYml0cyBwZXIgc2FtcGxlICovCisgIH0KKworICByZXR1cm4gYml0cmF0ZTsKK30KKworLyoKICAqIFxicmllZiBDb25zaXN0ZW5jeSBjaGVjayBvZiBnaXZlbiBVU0VSX1BBUkFNIHN0cnVjdCBhbmQKICAqICAgY29weSBiYWNrIGNvbmZpZ3VyYXRpb24gZnJvbSBwdWJsaWMgc3RydWN0IGludG8gaW50ZXJuYWwKICAqICAgZW5jb2RlciBjb25maWd1cmF0aW9uIHN0cnVjdC4KICAqCiAgKiBcaEFhY0VuY29kZXIgSW50ZXJuYWwgZW5jb2RlciBjb25maWcgd2hpY2ggaXMgdG8gYmUgdXBkYXRlZAogICogXHBhcmFtIGNvbmZpZyBVc2VyIHByb3ZpZGVkIGNvbmZpZyAocHVibGljIHN0cnVjdCkKLSAqIFxyZXR1cm4gtHJldHVybnMgYWx3YXlzIEFBQ19FTkNfT0sKKyAqIFxyZXR1cm4gcmV0dXJucyBhbHdheXMgQUFDX0VOQ19PSwogICovCi1zdGF0aWMKLUFBQ0VOQ19FUlJPUiBGREthYWNFbmNfQWRqdXN0RW5jU2V0dGluZ3MoSEFORExFX0FBQ0VOQ09ERVIgaEFhY0VuY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRVJfUEFSQU0gKmNvbmZpZykKLXsKLSAgICBBQUNFTkNfRVJST1IgZXJyID0gQUFDRU5DX09LOworc3RhdGljIEFBQ0VOQ19FUlJPUiBGREthYWNFbmNfQWRqdXN0RW5jU2V0dGluZ3MoSEFORExFX0FBQ0VOQ09ERVIgaEFhY0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VSX1BBUkFNICpjb25maWcpIHsKKyAgQUFDRU5DX0VSUk9SIGVyciA9IEFBQ0VOQ19PSzsKIAotICAgIC8qIEdldCBzdHJ1Y3QgcG9pbnRlcnMuICovCi0gICAgSEFORExFX0FBQ0VOQ19DT05GSUcgICAgaEFhY0NvbmZpZyA9ICZoQWFjRW5jb2Rlci0+YWFjQ29uZmlnOworICAvKiBHZXQgc3RydWN0IHBvaW50ZXJzLiAqLworICBIQU5ETEVfQUFDRU5DX0NPTkZJRyBoQWFjQ29uZmlnID0gJmhBYWNFbmNvZGVyLT5hYWNDb25maWc7CiAKLSAgICBoQWFjQ29uZmlnLT5uQ2hhbm5lbHMgICAgICAgPSBjb25maWctPm5DaGFubmVsczsKKyAgLyogRW5jb2RlciBzZXR0aW5ncyB1cGRhdGUuICovCisgIGhBYWNDb25maWctPnNhbXBsZVJhdGUgPSBjb25maWctPnVzZXJTYW1wbGVyYXRlOworICBpZiAoY29uZmlnLT51c2VyRG93bnNjYWxlRmFjdG9yID4gMSkgeworICAgIGhBYWNDb25maWctPnVzZVRucyA9IDA7CisgICAgaEFhY0NvbmZpZy0+dXNlUG5zID0gMDsKKyAgICBoQWFjQ29uZmlnLT51c2VJUyA9IDA7CisgIH0gZWxzZSB7CisgICAgaEFhY0NvbmZpZy0+dXNlVG5zID0gY29uZmlnLT51c2VyVG5zOworICAgIGhBYWNDb25maWctPnVzZVBucyA9IGNvbmZpZy0+dXNlclBuczsKKyAgICBoQWFjQ29uZmlnLT51c2VJUyA9IGNvbmZpZy0+dXNlckludGVuc2l0eTsKKyAgfQogCi0gICAgLyogRW5jb2RlciBzZXR0aW5ncyB1cGRhdGUuICovCi0gICAgaEFhY0NvbmZpZy0+c2FtcGxlUmF0ZSAgICAgID0gY29uZmlnLT51c2VyU2FtcGxlcmF0ZTsKLSAgICBoQWFjQ29uZmlnLT51c2VUbnMgICAgICAgICAgPSBjb25maWctPnVzZXJUbnM7Ci0gICAgaEFhY0NvbmZpZy0+dXNlUG5zICAgICAgICAgID0gY29uZmlnLT51c2VyUG5zOwotICAgIGhBYWNDb25maWctPnVzZUlTICAgICAgICAgICA9IGNvbmZpZy0+dXNlckludGVuc2l0eTsKLSAgICBoQWFjQ29uZmlnLT5iaXRSYXRlICAgICAgICAgPSBjb25maWctPnVzZXJCaXRyYXRlOwotICAgIGhBYWNDb25maWctPmNoYW5uZWxNb2RlICAgICA9IGNvbmZpZy0+dXNlckNoYW5uZWxNb2RlOwotICAgIGhBYWNDb25maWctPmJpdHJhdGVNb2RlICAgICA9IGNvbmZpZy0+dXNlckJpdHJhdGVNb2RlOwotICAgIGhBYWNDb25maWctPmJhbmRXaWR0aCAgICAgICA9IGNvbmZpZy0+dXNlckJhbmR3aWR0aDsKLSAgICBoQWFjQ29uZmlnLT51c2VSZXF1YW50ICAgICAgPSBjb25maWctPnVzZXJBZnRlcmJ1cm5lcjsKKyAgaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlID0gY29uZmlnLT51c2VyQU9UOworICBoQWFjQ29uZmlnLT5jaGFubmVsTW9kZSA9CisgICAgICBHZXRDb3JlQ2hhbm5lbE1vZGUoY29uZmlnLT51c2VyQ2hhbm5lbE1vZGUsIGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSk7CisgIGhBYWNDb25maWctPm5DaGFubmVscyA9CisgICAgICBGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKGhBYWNDb25maWctPmNoYW5uZWxNb2RlKS0+bkNoYW5uZWxzOworICBoQWFjQ29uZmlnLT5iaXRyYXRlTW9kZSA9IChBQUNFTkNfQklUUkFURV9NT0RFKWNvbmZpZy0+dXNlckJpdHJhdGVNb2RlOworICBoQWFjQ29uZmlnLT5iYW5kV2lkdGggPSBjb25maWctPnVzZXJCYW5kd2lkdGg7CisgIGhBYWNDb25maWctPnVzZVJlcXVhbnQgPSBjb25maWctPnVzZXJBZnRlcmJ1cm5lcjsKIAotICAgIGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9IGNvbmZpZy0+dXNlckFPVDsKLSAgICBoQWFjQ29uZmlnLT5hbmNfUmF0ZSAgICAgICAgPSBjb25maWctPnVzZXJBbmNEYXRhUmF0ZTsKLSAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyAgICAgPSAwOwotICAgIGhBYWNDb25maWctPmVwQ29uZmlnICAgICAgICA9IC0xOworICBoQWFjQ29uZmlnLT5hbmNfUmF0ZSA9IGNvbmZpZy0+dXNlckFuY0RhdGFSYXRlOworICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyA9IDA7CisgIGhBYWNDb25maWctPmVwQ29uZmlnID0gLTE7CiAKLSAgICBpZiAoY29uZmlnLT51c2VyVHBUeXBlPT1UVF9NUDRfTEFUTV9NQ1AxIHx8IGNvbmZpZy0+dXNlclRwVHlwZT09VFRfTVA0X0xBVE1fTUNQMCB8fCBjb25maWctPnVzZXJUcFR5cGU9PVRUX01QNF9MT0FTKSB7Ci0gICAgICBoQWFjQ29uZmlnLT5hdWRpb011eFZlcnNpb24gPSBjb25maWctPnVzZXJUcEFteHY7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgaEFhY0NvbmZpZy0+YXVkaW9NdXhWZXJzaW9uID0gLTE7Ci0gICAgfQorICBpZiAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlICE9IEFPVF9FUl9BQUNfRUxEICYmCisgICAgICBjb25maWctPnVzZXJEb3duc2NhbGVGYWN0b3IgPiAxKSB7CisgICAgcmV0dXJuIEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsgLyogZG93bnNjYWxpbmcgb25seSBhbGxvd2VkIGZvciBBT1RfRVJfQUFDX0VMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB9CisgIGlmIChjb25maWctPnVzZXJEb3duc2NhbGVGYWN0b3IgPiAxICYmIGNvbmZpZy0+dXNlclNickVuYWJsZWQgPT0gMSkgeworICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7IC8qIGRvd25zY2FsaW5nIG9ubHkgYWxsb3dlZCBmb3IgQU9UX0VSX0FBQ19FTEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3L28gU0JSICovCisgIH0KKyAgaWYgKGNvbmZpZy0+dXNlckRvd25zY2FsZUZhY3RvciA+IDEgJiYgY29uZmlnLT51c2VyQ2hhbm5lbE1vZGUgPT0gMTI4KSB7CisgICAgcmV0dXJuIEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsgLyogZGlzYWxsb3cgZG93bnNjYWxpbmcgZm9yIEFBQy1FTER2MiAqLworICB9CiAKLSAgICAvKiBBZGFwdCBpbnRlcm5hbCBBT1Qgd2hlbiBuZWNlc3NhcnkuICovCi0gICAgc3dpdGNoICggaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlICkgewotICAgICAgY2FzZSBBT1RfQUFDX0xDOgotICAgICAgY2FzZSBBT1RfU0JSOgotICAgICAgY2FzZSBBT1RfUFM6Ci0gICAgICAgICAgY29uZmlnLT51c2VyVHBUeXBlID0gKGNvbmZpZy0+dXNlclRwVHlwZSE9VFRfVU5LTk9XTikgPyBjb25maWctPnVzZXJUcFR5cGUgOiBUVF9NUDRfQURUUzsKLSAgICAgICAgICBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCA9IChjb25maWctPnVzZXJGcmFtZWxlbmd0aCE9KFVJTlQpLTEpID8gY29uZmlnLT51c2VyRnJhbWVsZW5ndGggOiAxMDI0OwotICAgICAgICAgIGlmIChoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCAhPSAxMDI0KSB7Ci0gICAgICAgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKLSAgICAgICAgICBoQWFjQ29uZmlnLT5lcENvbmZpZyA9IDA7Ci0gICAgICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gQUNfRVJ8QUNfTEQ7Ci0gICAgICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gKChjb25maWctPnVzZXJFclRvb2xzICYgMHgxKSA/IEFDX0VSX1ZDQjExIDogMCk7Ci0gICAgICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gKChjb25maWctPnVzZXJFclRvb2xzICYgMHgyKSA/IEFDX0VSX0hDUiA6IDApOwotICAgICAgICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzIHw9ICgoY29uZmlnLT51c2VyRXJUb29scyAmIDB4NCkgPyBBQ19FUl9SVkxDIDogMCk7Ci0gICAgICAgICAgY29uZmlnLT51c2VyVHBUeXBlID0gKGNvbmZpZy0+dXNlclRwVHlwZSE9VFRfVU5LTk9XTikgPyBjb25maWctPnVzZXJUcFR5cGUgOiBUVF9NUDRfTE9BUzsKLSAgICAgICAgICBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCA9IChjb25maWctPnVzZXJGcmFtZWxlbmd0aCE9KFVJTlQpLTEpID8gY29uZmlnLT51c2VyRnJhbWVsZW5ndGggOiA1MTI7Ci0gICAgICAgICAgaWYgKGhBYWNDb25maWctPmZyYW1lbGVuZ3RoICE9IDUxMiAmJiBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCAhPSA0ODApIHsKLSAgICAgICAgICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKLSAgICAgICAgICBoQWFjQ29uZmlnLT5lcENvbmZpZyA9IDA7Ci0gICAgICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gQUNfRVJ8QUNfRUxEOwotICAgICAgICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzIHw9ICgoY29uZmlnLT51c2VyRXJUb29scyAmIDB4MSkgPyBBQ19FUl9WQ0IxMSA6IDApOwotICAgICAgICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzIHw9ICgoY29uZmlnLT51c2VyRXJUb29scyAmIDB4MikgPyBBQ19FUl9IQ1IgOiAwKTsKLSAgICAgICAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyB8PSAoKGNvbmZpZy0+dXNlckVyVG9vbHMgJiAweDQpID8gQUNfRVJfUlZMQyA6IDApOwotICAgICAgICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzIHw9ICgoY29uZmlnLT51c2VyU2JyRW5hYmxlZD09MSkgID8gQUNfU0JSX1BSRVNFTlQgOiAwKTsKLSAgICAgICAgICBjb25maWctPnVzZXJUcFR5cGUgPSAoY29uZmlnLT51c2VyVHBUeXBlIT1UVF9VTktOT1dOKSA/IGNvbmZpZy0+dXNlclRwVHlwZSA6IFRUX01QNF9MT0FTOwotICAgICAgICAgIGhBYWNDb25maWctPmZyYW1lbGVuZ3RoID0gKGNvbmZpZy0+dXNlckZyYW1lbGVuZ3RoIT0oVUlOVCktMSkgPyBjb25maWctPnVzZXJGcmFtZWxlbmd0aCA6IDUxMjsKLSAgICAgICAgICBpZiAoaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGggIT0gNTEyICYmIGhBYWNDb25maWctPmZyYW1lbGVuZ3RoICE9IDQ4MCkgewotICAgICAgICAgICAgcmV0dXJuIEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAgIGJyZWFrOwotICAgIH0KKyAgaWYgKGNvbmZpZy0+dXNlclRwVHlwZSA9PSBUVF9NUDRfTEFUTV9NQ1AxIHx8CisgICAgICBjb25maWctPnVzZXJUcFR5cGUgPT0gVFRfTVA0X0xBVE1fTUNQMCB8fAorICAgICAgY29uZmlnLT51c2VyVHBUeXBlID09IFRUX01QNF9MT0FTKSB7CisgICAgaEFhY0NvbmZpZy0+YXVkaW9NdXhWZXJzaW9uID0gY29uZmlnLT51c2VyVHBBbXh2OworICB9IGVsc2UgeworICAgIGhBYWNDb25maWctPmF1ZGlvTXV4VmVyc2lvbiA9IC0xOworICB9CiAKLSAgICBzd2l0Y2ggKCBoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgKSB7Ci0gICAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6Ci0gICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgotICAgICAgICBpZiAoY29uZmlnLT51c2VyQml0cmF0ZU1vZGU9PTApIHsKLSAgICAgICAgICAvKiBiaXRyZXNlcnZvaXIgID0gKG1heEJpdFJlcy1taW5CaXRSZXMpLyhtYXhCaXRSYXRlLW1pbkJpdHJhdGUpKihiaXRSYXRlLW1pbkJpdHJhdGUpK21pbkJpdFJlczsgKi8KLSAgICAgICAgICBpZiAoIGlzTG93RGVsYXkoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlKSApIHsKLSAgICAgICAgICAgIElOVCBiaXRyZXNlcnZvaXI7Ci0gICAgICAgICAgICBJTlQgYnJQZXJDaGFubmVsID0gaEFhY0NvbmZpZy0+Yml0UmF0ZS9oQWFjQ29uZmlnLT5uQ2hhbm5lbHM7Ci0gICAgICAgICAgICBiclBlckNoYW5uZWwgICAgID0gZk1pbihCSVRSQVRFX01BWF9MRCwgZk1heChCSVRSQVRFX01JTl9MRCwgYnJQZXJDaGFubmVsKSk7Ci0gICAgICAgICAgICBGSVhQX0RCTCBzbG9wZSAgID0gZkRpdk5vcm0oKGJyUGVyQ2hhbm5lbC1CSVRSQVRFX01JTl9MRCksIEJJVFJBVEVfTUFYX0xELUJJVFJBVEVfTUlOX0xEKTsgLyogY2FsYyBzbG9wZSBmb3IgaW50ZXJwb2xhdGlvbiAqLwotICAgICAgICAgICAgYml0cmVzZXJ2b2lyICAgICA9IGZNdWx0SShzbG9wZSwgKElOVCkoQklUUkVTX01BWF9MRC1CSVRSRVNfTUlOX0xEKSkgKyBCSVRSRVNfTUlOX0xEOyAvKiBpbnRlcnBvbGF0ZSAqLwotICAgICAgICAgICAgaEFhY0NvbmZpZy0+Yml0cmVzZXJ2b2lyID0gYml0cmVzZXJ2b2lyICYgfjc7IC8qIGFsaWduIHRvIGJ5dGVzICovCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChoQWFjQ29uZmlnLT5iaXRyYXRlTW9kZSE9MCkgewotICAgICAgICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBoQWFjQ29uZmlnLT5iaXRSYXRlID0gY29uZmlnLT51c2VyQml0cmF0ZTsKLQotICAgIC8qIGdldCBiaXRyYXRlIGluIFZCUiBjb25maWd1cmF0aW9uICovCi0gICAgaWYgKCAoaEFhY0NvbmZpZy0+Yml0cmF0ZU1vZGU+PTEpICYmIChoQWFjQ29uZmlnLT5iaXRyYXRlTW9kZTw9NSkgKSB7Ci0gICAgICAgIC8qIEluIFZCUiBtb2RlOyBTQlItbW9kdWwgZGVwZW5kcyBvbiBiaXRyYXRlLCBjb3JlIGVuY29kZXIgb24gYml0cmF0ZU1vZGUuICovCi0gICAgICAgIGhBYWNDb25maWctPmJpdFJhdGUgPSBGREthYWNFbmNfR2V0VkJSQml0cmF0ZShoQWFjQ29uZmlnLT5iaXRyYXRlTW9kZSwgaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUpOwotICAgIH0KLQotCi0KLSAgICAvKiBTZXQgZGVmYXVsdCBiaXRyYXRlIGlmIG5vIGV4dGVybmFsIGJpdHJhdGUgZGVjbGFyZWQuICovCi0gICAgaWYgKCAoaEFhY0NvbmZpZy0+Yml0cmF0ZU1vZGU9PTApICYmIChjb25maWctPnVzZXJCaXRyYXRlPT0oVUlOVCktMSkgKSB7Ci0gICAgICAgIElOVCBiaXRyYXRlID0gRkRLYWFjRW5jX0dldENoYW5uZWxNb2RlQ29uZmlndXJhdGlvbihoQWFjQ29uZmlnLT5jaGFubmVsTW9kZSktPm5DaGFubmVsc0VmZiAqIGhBYWNDb25maWctPnNhbXBsZVJhdGU7Ci0KLSAgICAgICAgaWYgKCBpc1BzQWN0aXZlKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSkgKSB7Ci0gICAgICAgICAgaEFhY0NvbmZpZy0+Yml0UmF0ZSA9IChiaXRyYXRlPj4xKTsgICAgICAgICAgICAgICAgICAvKiAwLjUgYml0IHBlciBzYW1wbGUgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggaXNTYnJBY3RpdmUoaEFhY0NvbmZpZykgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCAoY29uZmlnLT51c2VyU2JyUmF0aW89PTIpIHx8ICgoY29uZmlnLT51c2VyU2JyUmF0aW89PTApJiYoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlIT1BT1RfRVJfQUFDX0VMRCkpICkgewotICAgICAgICAgICAgaEFhY0NvbmZpZy0+Yml0UmF0ZSA9IChiaXRyYXRlICsgKGJpdHJhdGU+PjIpKT4+MTsgLyogMC42MjUgYml0cyBwZXIgc2FtcGxlICovCi0gICAgICAgICAgfQotICAgICAgICAgIGlmICggKGNvbmZpZy0+dXNlclNiclJhdGlvPT0xKSB8fCAoKGNvbmZpZy0+dXNlclNiclJhdGlvPT0wKSYmKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZT09QU9UX0VSX0FBQ19FTEQpKSApIHsKLSAgICAgICAgICAgIGhBYWNDb25maWctPmJpdFJhdGUgPSAoYml0cmF0ZSArIChiaXRyYXRlPj4zKSk7ICAgIC8qIDEuMTI1IGJpdHMgcGVyIHNhbXBsZSAqLwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5iaXRSYXRlID0gYml0cmF0ZSArIChiaXRyYXRlPj4xKTsgICAgICAgIC8qIDEuNSBiaXRzIHBlciBzYW1wbGUgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICgoaEFhY0NvbmZpZy0+Yml0cmF0ZU1vZGUgPj0gMCkgJiYgKGhBYWNDb25maWctPmJpdHJhdGVNb2RlIDw9IDUpKSB7Ci0gICAgICBpZiAoKElOVCljb25maWctPnVzZXJQZWFrQml0cmF0ZSAhPSAtMSkgewotICAgICAgICBoQWFjQ29uZmlnLT5tYXhCaXRzUGVyRnJhbWUgPSAoRkRLYWFjRW5jX0NhbGNCaXRzUGVyRnJhbWUoZk1heChoQWFjQ29uZmlnLT5iaXRSYXRlLCAoSU5UKWNvbmZpZy0+dXNlclBlYWtCaXRyYXRlKSwgaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGgsIGhBYWNDb25maWctPnNhbXBsZVJhdGUpICsgNykmfjc7CisgIC8qIEFkYXB0IGludGVybmFsIEFPVCB3aGVuIG5lY2Vzc2FyeS4gKi8KKyAgc3dpdGNoIChjb25maWctPnVzZXJBT1QpIHsKKyAgICBjYXNlIEFPVF9NUDJfQUFDX0xDOgorICAgIGNhc2UgQU9UX01QMl9TQlI6CisgICAgICBoQWFjQ29uZmlnLT51c2VQbnMgPSAwOworICAgIGNhc2UgQU9UX0FBQ19MQzoKKyAgICBjYXNlIEFPVF9TQlI6CisgICAgY2FzZSBBT1RfUFM6CisgICAgICBjb25maWctPnVzZXJUcFR5cGUgPQorICAgICAgICAgIChjb25maWctPnVzZXJUcFR5cGUgIT0gVFRfVU5LTk9XTikgPyBjb25maWctPnVzZXJUcFR5cGUgOiBUVF9NUDRfQURUUzsKKyAgICAgIGhBYWNDb25maWctPmZyYW1lbGVuZ3RoID0gKGNvbmZpZy0+dXNlckZyYW1lbGVuZ3RoICE9IChVSU5UKS0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjb25maWctPnVzZXJGcmFtZWxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxMDI0OworICAgICAgaWYgKGhBYWNDb25maWctPmZyYW1lbGVuZ3RoICE9IDEwMjQgJiYgaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGggIT0gOTYwKSB7CisgICAgICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CiAgICAgICB9Ci0gICAgICBlbHNlIHsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKKyAgICAgIGhBYWNDb25maWctPmVwQ29uZmlnID0gMDsKKyAgICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzIHw9IEFDX0VSIHwgQUNfTEQ7CisgICAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyB8PQorICAgICAgICAgICgoY29uZmlnLT51c2VyRXJUb29scyAmIDB4MSkgPyBBQ19FUl9WQ0IxMSA6IDApOworICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gKChjb25maWctPnVzZXJFclRvb2xzICYgMHgyKSA/IEFDX0VSX0hDUiA6IDApOworICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gKChjb25maWctPnVzZXJFclRvb2xzICYgMHg0KSA/IEFDX0VSX1JWTEMgOiAwKTsKKyAgICAgIGNvbmZpZy0+dXNlclRwVHlwZSA9CisgICAgICAgICAgKGNvbmZpZy0+dXNlclRwVHlwZSAhPSBUVF9VTktOT1dOKSA/IGNvbmZpZy0+dXNlclRwVHlwZSA6IFRUX01QNF9MT0FTOworICAgICAgaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGggPQorICAgICAgICAgIChjb25maWctPnVzZXJGcmFtZWxlbmd0aCAhPSAoVUlOVCktMSkgPyBjb25maWctPnVzZXJGcmFtZWxlbmd0aCA6IDUxMjsKKyAgICAgIGlmIChoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCAhPSA1MTIgJiYgaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGggIT0gNDgwKSB7CisgICAgICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgICAgaEFhY0NvbmZpZy0+ZXBDb25maWcgPSAwOworICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gQUNfRVIgfCBBQ19FTEQ7CisgICAgICBoQWFjQ29uZmlnLT5zeW50YXhGbGFncyB8PQorICAgICAgICAgICgoY29uZmlnLT51c2VyRXJUb29scyAmIDB4MSkgPyBBQ19FUl9WQ0IxMSA6IDApOworICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gKChjb25maWctPnVzZXJFclRvb2xzICYgMHgyKSA/IEFDX0VSX0hDUiA6IDApOworICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gKChjb25maWctPnVzZXJFclRvb2xzICYgMHg0KSA/IEFDX0VSX1JWTEMgOiAwKTsKKyAgICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzIHw9CisgICAgICAgICAgKChjb25maWctPnVzZXJTYnJFbmFibGVkID09IDEpID8gQUNfU0JSX1BSRVNFTlQgOiAwKTsKKyAgICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzIHw9CisgICAgICAgICAgKChjb25maWctPnVzZXJDaGFubmVsTW9kZSA9PSBNT0RFXzIxMikgPyBBQ19MRF9NUFMgOiAwKTsKKyAgICAgIGNvbmZpZy0+dXNlclRwVHlwZSA9CisgICAgICAgICAgKGNvbmZpZy0+dXNlclRwVHlwZSAhPSBUVF9VTktOT1dOKSA/IGNvbmZpZy0+dXNlclRwVHlwZSA6IFRUX01QNF9MT0FTOworICAgICAgaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGggPQorICAgICAgICAgIChjb25maWctPnVzZXJGcmFtZWxlbmd0aCAhPSAoVUlOVCktMSkgPyBjb25maWctPnVzZXJGcmFtZWxlbmd0aCA6IDUxMjsKKworICAgICAgaEFhY0NvbmZpZy0+ZG93bnNjYWxlRmFjdG9yID0gY29uZmlnLT51c2VyRG93bnNjYWxlRmFjdG9yOworCisgICAgICBzd2l0Y2ggKGNvbmZpZy0+dXNlckRvd25zY2FsZUZhY3RvcikgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzIHw9IEFDX0VMRF9ET1dOU0NBTEU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgIH0KKworICAgICAgaWYgKGhBYWNDb25maWctPmZyYW1lbGVuZ3RoICE9IDUxMiAmJiBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCAhPSA0ODAgJiYKKyAgICAgICAgICBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCAhPSAyNTYgJiYgaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGggIT0gMjQwICYmCisgICAgICAgICAgaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGggIT0gMTI4ICYmIGhBYWNDb25maWctPmZyYW1lbGVuZ3RoICE9IDEyMCkgeworICAgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogSW5pdGlhbGl6ZSBTQlIgcGFyYW1ldGVycyAqLworICBpZiAoKGNvbmZpZy0+dXNlclNiclJhdGlvID09IDApICYmIChpc1NickFjdGl2ZShoQWFjQ29uZmlnKSkpIHsKKyAgICAvKiBBdXRvbWF0aWMgU0JSIHJhdGlvIGNvbmZpZ3VyYXRpb24KKyAgICAgKiAtIGRvd25zYW1wbGVkIFNCUiBmb3IgRUxECisgICAgICogLSBvdGhlcndpc2UgYWx3YXlzIGR1YWxyYXRlIFNCUgorICAgICAqLworICAgIGlmIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19FTEQpIHsKKyAgICAgIGhBYWNDb25maWctPnNiclJhdGlvID0gKChoQWFjQ29uZmlnLT5zeW50YXhGbGFncyAmIEFDX0xEX01QUykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoQWFjQ29uZmlnLT5zYW1wbGVSYXRlID49IDI3NzEzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworICAgIH0gZWxzZSB7CisgICAgICBoQWFjQ29uZmlnLT5zYnJSYXRpbyA9IDI7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIFNCUiByYXRpbyBoYXMgYmVlbiBzZXQgYnkgdGhlIHVzZXIsIHNvIHVzZSBpdC4gKi8KKyAgICBoQWFjQ29uZmlnLT5zYnJSYXRpbyA9IGlzU2JyQWN0aXZlKGhBYWNDb25maWcpID8gY29uZmlnLT51c2VyU2JyUmF0aW8gOiAwOworICB9CisKKyAgLyogU2V0IGRlZmF1bHQgYml0cmF0ZSAqLworICBoQWFjQ29uZmlnLT5iaXRSYXRlID0gY29uZmlnLT51c2VyQml0cmF0ZTsKKworICBzd2l0Y2ggKGhBYWNDb25maWctPmJpdHJhdGVNb2RlKSB7CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9DQlI6CisgICAgICAvKiBTZXQgZGVmYXVsdCBiaXRyYXRlIGlmIG5vIGV4dGVybmFsIGJpdHJhdGUgZGVjbGFyZWQuICovCisgICAgICBpZiAoY29uZmlnLT51c2VyQml0cmF0ZSA9PSAoVUlOVCktMSkgeworICAgICAgICBoQWFjQ29uZmlnLT5iaXRSYXRlID0KKyAgICAgICAgICAgIEZES2FhY0VuY19HZXRDQlJCaXRyYXRlKGhBYWNDb25maWcsIGNvbmZpZy0+dXNlclNiclJhdGlvKTsKKyAgICAgIH0KKyAgICAgIGhBYWNDb25maWctPmF2ZXJhZ2VCaXRzID0gLTE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8xOgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzI6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMzoKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl80OgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzU6CisgICAgICAvKiBHZXQgYml0cmF0ZSBpbiBWQlIgY29uZmlndXJhdGlvbiAqLworICAgICAgLyogSW4gVkJSIG1vZGU7IFNCUi1tb2R1bCBkZXBlbmRzIG9uIGJpdHJhdGUsIGNvcmUgZW5jb2RlciBvbiBiaXRyYXRlTW9kZS4KKyAgICAgICAqLworICAgICAgaEFhY0NvbmZpZy0+Yml0UmF0ZSA9IEZES2FhY0VuY19HZXRWQlJCaXRyYXRlKGhBYWNDb25maWctPmJpdHJhdGVNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNDb25maWctPmNoYW5uZWxNb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICB9CisKKyAgLyogc2V0IGJpdHJlc2Vydm9pciBzaXplICovCisgIHN3aXRjaCAoaEFhY0NvbmZpZy0+Yml0cmF0ZU1vZGUpIHsKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8xOgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzI6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMzoKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl80OgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzU6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9DQlI6CisgICAgICBpZiAoKElOVCljb25maWctPnVzZXJQZWFrQml0cmF0ZSAhPSAtMSkgeworICAgICAgICBoQWFjQ29uZmlnLT5tYXhCaXRzUGVyRnJhbWUgPQorICAgICAgICAgICAgKEZES2FhY0VuY19DYWxjQml0c1BlckZyYW1lKAorICAgICAgICAgICAgICAgICBmTWF4KGhBYWNDb25maWctPmJpdFJhdGUsIChJTlQpY29uZmlnLT51c2VyUGVha0JpdHJhdGUpLAorICAgICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCwgaEFhY0NvbmZpZy0+c2FtcGxlUmF0ZSkgKworICAgICAgICAgICAgIDcpICYKKyAgICAgICAgICAgIH43OworICAgICAgfSBlbHNlIHsKICAgICAgICAgaEFhY0NvbmZpZy0+bWF4Qml0c1BlckZyYW1lID0gLTE7CiAgICAgICB9Ci0gICAgICBpZiAoaEFhY0NvbmZpZy0+YXVkaW9NdXhWZXJzaW9uPT0yKSB7Ci0gICAgICAgIGhBYWNDb25maWctPm1pbkJpdHNQZXJGcmFtZSA9IGZNaW4oMzIqOCwgRkRLYWFjRW5jX0NhbGNCaXRzUGVyRnJhbWUoaEFhY0NvbmZpZy0+Yml0UmF0ZSwgaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGgsIGhBYWNDb25maWctPnNhbXBsZVJhdGUpKSZ+NzsKKyAgICAgIGlmIChoQWFjQ29uZmlnLT5hdWRpb011eFZlcnNpb24gPT0gMikgeworICAgICAgICBoQWFjQ29uZmlnLT5taW5CaXRzUGVyRnJhbWUgPQorICAgICAgICAgICAgZk1pbigzMiAqIDgsIEZES2FhY0VuY19DYWxjQml0c1BlckZyYW1lKGhBYWNDb25maWctPmJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0NvbmZpZy0+c2FtcGxlUmF0ZSkpICYKKyAgICAgICAgICAgIH43OwogICAgICAgfQotICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICB9CiAKLSAgICAvKiBJbml0aWFsaXplIFNCUiBwYXJhbWV0ZXJzICovCi0gICAgaWYgKCAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlPT1BT1RfRVJfQUFDX0VMRCkKLSAgICAgICYmIChjb25maWctPnVzZXJTYnJFbmFibGVkID09IChVQ0hBUiktMSkgJiYgKGNvbmZpZy0+dXNlclNiclJhdGlvPT0wKSApCi0gICAgewotICAgICAgVUlOVCBlbGRTYnIgPSAwOwotICAgICAgVUlOVCBlbGRTYnJSYXRpbyA9IDA7Ci0KLSAgICAgIGlmICggQUFDRU5DX09LIT0oZXJyPWVsZFNickNvbmZpZ3VyYXRvcigKLSAgICAgICAgICAgIGhBYWNDb25maWctPnNhbXBsZVJhdGUsCi0gICAgICAgICAgICBoQWFjQ29uZmlnLT5jaGFubmVsTW9kZSwKLSAgICAgICAgICAgIGhBYWNDb25maWctPmJpdFJhdGUsCi0gICAgICAgICAgICZlbGRTYnIsCi0gICAgICAgICAgICZlbGRTYnJSYXRpbykpICkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgIH0KLQotICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gKChlbGRTYnIpID8gQUNfU0JSX1BSRVNFTlQgOiAwKTsKLSAgICAgIGhBYWNDb25maWctPnNiclJhdGlvID0gZWxkU2JyUmF0aW87Ci0gICAgfQotICAgIGVsc2UKLSAgICBpZiAoIChjb25maWctPnVzZXJTYnJSYXRpbz09MCkgJiYgKGlzU2JyQWN0aXZlKGhBYWNDb25maWcpKSApIHsKLSAgICAgIC8qIEF1dG9tYXRpYyBTQlIgcmF0aW8gY29uZmlndXJhdGlvbgotICAgICAgICogLSBkb3duc2FtcGxlZCBTQlIgZm9yIEVMRAotICAgICAgICogLSBvdGhlcndpc2UgYWx3YXlzIGR1YWxyYXRlIFNCUgotICAgICAgICovCi0gICAgICAgIGhBYWNDb25maWctPnNiclJhdGlvID0gKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZT09QU9UX0VSX0FBQ19FTEQpID8gMSA6IDI7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgLyogU0JSIHJhdGlvIGhhcyBiZWVuIHNldCBieSB0aGUgdXNlciwgc28gdXNlIGl0LiAqLwotICAgICAgaEFhY0NvbmZpZy0+c2JyUmF0aW8gPSBpc1NickFjdGl2ZShoQWFjQ29uZmlnKSA/IGNvbmZpZy0+dXNlclNiclJhdGlvIDogMDsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICBVQ0hBUiB0cFNpZ25hbGluZz1nZXRTYnJTaWduYWxpbmdNb2RlKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSwgY29uZmlnLT51c2VyVHBUeXBlLCBjb25maWctPnVzZXJUcFNpZ25hbGluZywgaEFhY0NvbmZpZy0+c2JyUmF0aW8pOwotCi0gICAgICBpZiAoIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGU9PUFPVF9BQUNfTEMgfHwgaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlPT1BT1RfU0JSIHx8IGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZT09QU9UX1BTKSAmJgotICAgICAgICAgICAoY29uZmlnLT51c2VyVHBUeXBlPT1UVF9NUDRfTEFUTV9NQ1AxIHx8IGNvbmZpZy0+dXNlclRwVHlwZT09VFRfTVA0X0xBVE1fTUNQMCB8fCBjb25maWctPnVzZXJUcFR5cGU9PVRUX01QNF9MT0FTKSAmJgotICAgICAgICAgICAodHBTaWduYWxpbmc9PTEpICYmIChjb25maWctPnVzZXJUcEFteHY9PTApICkgewotICAgICAgICAgICAgIC8qIEZvciBiYWNrd2FyZCBjb21wYXRpYmxlIGV4cGxpY2l0IHNpZ25hbGluZywgQU1WMSBoYXMgdG8gYmUgYWN0aXZlICovCi0gICAgICAgICAgICAgcmV0dXJuIEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKLSAgICAgIH0KLQotICAgICAgaWYgKCAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlPT1BT1RfQUFDX0xDIHx8IGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZT09QU9UX1NCUiB8fCBoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGU9PUFPVF9QUykgJiYKLSAgICAgICAgICAgKHRwU2lnbmFsaW5nPT0wKSAmJiAoaEFhY0NvbmZpZy0+c2JyUmF0aW89PTEpKSB7Ci0gICAgICAgICAgICAgLyogRG93bnNhbXBsZWQgU0JSIGhhcyB0byBiZSBzaWduYWxlZCBleHBsaWNpdGVseSAoZm9yIHRyYW5zbWlzc2lvbiBvZiBTQlIgc2FtcGxpbmcgZmVxdWVuY3kpICovCi0gICAgICAgICAgICAgcmV0dXJuIEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKLSAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAgLyogV2UgbmVlZCB0aGUgZnJhbWUgbGVuZ3RoIHRvIGNhbGwgYWFjRW5jb2Rlcl9MaW1pdEJpdHJhdGUoKSAqLwotICAgIGhBYWNDb25maWctPmJpdFJhdGUgPSBhYWNFbmNvZGVyX0xpbWl0Qml0cmF0ZSgKLSAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgaEFhY0NvbmZpZy0+c2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGgsCi0gICAgICAgICAgICAgIGhBYWNDb25maWctPm5DaGFubmVscywKLSAgICAgICAgICAgICAgaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUsCi0gICAgICAgICAgICAgIGhBYWNDb25maWctPmJpdFJhdGUsCi0gICAgICAgICAgICAgIGhBYWNDb25maWctPm5TdWJGcmFtZXMsCi0gICAgICAgICAgICAgIGlzU2JyQWN0aXZlKGhBYWNDb25maWcpLAotICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5zYnJSYXRpbywKLSAgICAgICAgICAgICAgaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlCi0gICAgICAgICAgICAgICk7Ci0KLSAgICAvKiBDb25maWd1cmUgUE5TICovCi0gICAgaWYgKCAoKGhBYWNDb25maWctPmJpdHJhdGVNb2RlPj0xKSAmJiAoaEFhY0NvbmZpZy0+Yml0cmF0ZU1vZGU8PTUpKSAvKiBWQlIgd2l0aG91dCBQTlMuICovCi0gICAgICAgIHx8IChoQWFjQ29uZmlnLT51c2VUbnMgPT0gMCkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUTlMgcmVxdWlyZWQuICovCi0gICAgewotICAgICAgICBoQWFjQ29uZmlnLT51c2VQbnMgPSAwOwotICAgIH0KLQotICAgIGlmIChoQWFjQ29uZmlnLT5lcENvbmZpZyA+PSAwKSB7Ci0gICAgICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzIHw9IEFDX0VSOwotICAgICAgICAgaWYgKCgoSU5UKWhBYWNDb25maWctPmNoYW5uZWxNb2RlIDwgMSkgfHwgKChJTlQpaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUgPiA3KSkgewotICAgICAgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOyAgICAgICAgLyogQ2FubmVsIGNvbmZpZyAwIG5vdCBzdXBwb3J0ZWQuICovCi0gICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBGREthYWNFbmNfRGV0ZXJtaW5lRW5jb2Rlck1vZGUoJmhBYWNDb25maWctPmNoYW5uZWxNb2RlLCBoQWFjQ29uZmlnLT5uQ2hhbm5lbHMpICE9IEFBQ19FTkNfT0spIHsKLSAgICAgICAgcmV0dXJuIEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsgICAgICAgIC8qIG5DaGFubmVscyBkb2Vzbid0IG1hdGNoIGNoTW9kZSwgdGhpcyBpcyBqdXN0IGEgY2hlY2stdXAgKi8KLSAgICB9Ci0KLSAgICBpZiAoIChoQWFjQ29uZmlnLT5uQ2hhbm5lbHMgPiBoQWFjRW5jb2Rlci0+bk1heEFhY0NoYW5uZWxzKQotICAgICAgfHwgKCAoRkRLYWFjRW5jX0dldENoYW5uZWxNb2RlQ29uZmlndXJhdGlvbihoQWFjQ29uZmlnLT5jaGFubmVsTW9kZSktPm5DaGFubmVsc0VmZiA+IGhBYWNFbmNvZGVyLT5uTWF4U2JyQ2hhbm5lbHMpICYmCi0gICAgICAgICAgICBpc1NickFjdGl2ZShoQWFjQ29uZmlnKSApCi0gICAgICAgICApCi0gICAgewotICAgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOyAgICAgIC8qIG5vdCBlbm91Z2ggY2hhbm5lbHMgYWxsb2NhdGVkICovCi0gICAgfQotCi0gICAgLyogTWV0YSBkYXRhIHJlc3RyaWN0aW9uLiAqLwotICAgIHN3aXRjaCAoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlKQotICAgIHsKLSAgICAgIC8qIEFsbG93IG1ldGFkYXRhIHN1cHBvcnQgKi8KLSAgICAgIGNhc2UgQU9UX0FBQ19MQzoKLSAgICAgIGNhc2UgQU9UX1NCUjoKLSAgICAgIGNhc2UgQU9UX1BTOgotICAgICAgICBoQWFjRW5jb2Rlci0+bWV0YURhdGFBbGxvd2VkID0gMTsKLSAgICAgICAgaWYgKCgoSU5UKWhBYWNDb25maWctPmNoYW5uZWxNb2RlIDwgMSkgfHwgKChJTlQpaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUgPiA3KSkgewotICAgICAgICAgIGNvbmZpZy0+dXNlck1ldGFEYXRhTW9kZSA9IDA7Ci0gICAgICAgIH0KKyAgLyogTWF4IGJpdHMgcGVyIGZyYW1lIGxpbWl0YXRpb24gZGVwZW5kaW5nIG9uIHRyYW5zcG9ydCBmb3JtYXQuICovCisgIGlmICgoY29uZmlnLT51c2VyVHBOc3ViRnJhbWVzID4gMSkpIHsKKyAgICBpbnQgbWF4RnJhbWVMZW5ndGggPSA4ICogaEFhY0VuY29kZXItPm91dEJ1ZmZlckluQnl0ZXM7CisgICAgc3dpdGNoIChjb25maWctPnVzZXJUcFR5cGUpIHsKKyAgICAgIGNhc2UgVFRfTVA0X0xPQVM6CisgICAgICAgIG1heEZyYW1lTGVuZ3RoID0KKyAgICAgICAgICAgIGZNaW4obWF4RnJhbWVMZW5ndGgsIDggKiAoMSA8PCAxMykpIC8gY29uZmlnLT51c2VyVHBOc3ViRnJhbWVzOwogICAgICAgICBicmVhazsKLSAgICAgIC8qIFByb2hpYml0IG1ldGFkYXRhIHN1cHBvcnQgKi8KKyAgICAgIGNhc2UgVFRfTVA0X0FEVFM6CisgICAgICAgIG1heEZyYW1lTGVuZ3RoID0gZk1pbihtYXhGcmFtZUxlbmd0aCwgOCAqICgoMSA8PCAxMykgLSAxKSkgLworICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+dXNlclRwTnN1YkZyYW1lczsKKyAgICAgICAgYnJlYWs7CiAgICAgICBkZWZhdWx0OgotICAgICAgICBoQWFjRW5jb2Rlci0+bWV0YURhdGFBbGxvd2VkID0gMDsKKyAgICAgICAgbWF4RnJhbWVMZW5ndGggPSAtMTsKKyAgICB9CisgICAgaWYgKG1heEZyYW1lTGVuZ3RoICE9IC0xKSB7CisgICAgICBpZiAoaEFhY0NvbmZpZy0+bWF4Qml0c1BlckZyYW1lID4gbWF4RnJhbWVMZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgIH0gZWxzZSBpZiAoaEFhY0NvbmZpZy0+bWF4Qml0c1BlckZyYW1lID09IC0xKSB7CisgICAgICAgIGhBYWNDb25maWctPm1heEJpdHNQZXJGcmFtZSA9IG1heEZyYW1lTGVuZ3RoOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmICgoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlID09IEFPVF9FUl9BQUNfRUxEKSAmJgorICAgICAgIShoQWFjQ29uZmlnLT5zeW50YXhGbGFncyAmIEFDX0VMRF9ET1dOU0NBTEUpICYmCisgICAgICAoY29uZmlnLT51c2VyU2JyRW5hYmxlZCA9PSAoVUNIQVIpLTEpICYmIChjb25maWctPnVzZXJTYnJSYXRpbyA9PSAwKSAmJgorICAgICAgKChoQWFjQ29uZmlnLT5zeW50YXhGbGFncyAmIEFDX0xEX01QUykgPT0gMCkpIHsKKyAgICBjb25zdCBFTERfU0JSX0NPTkZJR1VSQVRPUiAqcENvbmZpZyA9IE5VTEw7CisKKyAgICBpZiAoTlVMTCAhPQorICAgICAgICAocENvbmZpZyA9IGVsZFNickNvbmZpZ3VyYXRvcigKKyAgICAgICAgICAgICBGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKGhBYWNDb25maWctPmNoYW5uZWxNb2RlKQorICAgICAgICAgICAgICAgICAtPm5DaGFubmVscywKKyAgICAgICAgICAgICBoQWFjQ29uZmlnLT5zYW1wbGVSYXRlLCBoQWFjQ29uZmlnLT5iaXRSYXRlKSkpIHsKKyAgICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzIHw9IChwQ29uZmlnLT5zYnJNb2RlID09IDApID8gMCA6IEFDX1NCUl9QUkVTRU5UOworICAgICAgaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgfD0gKHBDb25maWctPmNoTW9kZSA9PSBNT0RFXzIxMikgPyBBQ19MRF9NUFMgOiAwOworICAgICAgaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUgPQorICAgICAgICAgIEdldENvcmVDaGFubmVsTW9kZShwQ29uZmlnLT5jaE1vZGUsIGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSk7CisgICAgICBoQWFjQ29uZmlnLT5uQ2hhbm5lbHMgPQorICAgICAgICAgIEZES2FhY0VuY19HZXRDaGFubmVsTW9kZUNvbmZpZ3VyYXRpb24oaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUpCisgICAgICAgICAgICAgIC0+bkNoYW5uZWxzOworICAgICAgaEFhY0NvbmZpZy0+c2JyUmF0aW8gPQorICAgICAgICAgIChwQ29uZmlnLT5zYnJNb2RlID09IDApID8gMCA6IChwQ29uZmlnLT5zYnJNb2RlID09IDEpID8gMSA6IDI7CisgICAgfQorICB9CisKKyAgeworICAgIFVDSEFSIHRwU2lnbmFsaW5nID0KKyAgICAgICAgZ2V0U2JyU2lnbmFsaW5nTW9kZShoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUsIGNvbmZpZy0+dXNlclRwVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnVzZXJUcFNpZ25hbGluZywgaEFhY0NvbmZpZy0+c2JyUmF0aW8pOworCisgICAgaWYgKChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX0FBQ19MQyB8fAorICAgICAgICAgaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlID09IEFPVF9TQlIgfHwKKyAgICAgICAgIGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfUFMpICYmCisgICAgICAgIChjb25maWctPnVzZXJUcFR5cGUgPT0gVFRfTVA0X0xBVE1fTUNQMSB8fAorICAgICAgICAgY29uZmlnLT51c2VyVHBUeXBlID09IFRUX01QNF9MQVRNX01DUDAgfHwKKyAgICAgICAgIGNvbmZpZy0+dXNlclRwVHlwZSA9PSBUVF9NUDRfTE9BUykgJiYKKyAgICAgICAgKHRwU2lnbmFsaW5nID09IDEpICYmIChjb25maWctPnVzZXJUcEFteHYgPT0gMCkpIHsKKyAgICAgIC8qIEZvciBiYWNrd2FyZCBjb21wYXRpYmxlIGV4cGxpY2l0IHNpZ25hbGluZywgQU1WMSBoYXMgdG8gYmUgYWN0aXZlICovCisgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOwogICAgIH0KIAotICAgIHJldHVybiBlcnI7CisgICAgaWYgKChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX0FBQ19MQyB8fAorICAgICAgICAgaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlID09IEFPVF9TQlIgfHwKKyAgICAgICAgIGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfUFMpICYmCisgICAgICAgICh0cFNpZ25hbGluZyA9PSAwKSAmJiAoaEFhY0NvbmZpZy0+c2JyUmF0aW8gPT0gMSkpIHsKKyAgICAgIC8qIERvd25zYW1wbGVkIFNCUiBoYXMgdG8gYmUgc2lnbmFsZWQgZXhwbGljaXRlbHkgKGZvciB0cmFuc21pc3Npb24gb2YgU0JSCisgICAgICAgKiBzYW1wbGluZyBmZXF1ZW5jeSkgKi8KKyAgICAgIHJldHVybiBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgfQorICB9CisKKyAgc3dpdGNoIChoQWFjQ29uZmlnLT5iaXRyYXRlTW9kZSkgeworICAgIGNhc2UgQUFDRU5DX0JSX01PREVfQ0JSOgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzE6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMjoKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8zOgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzQ6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNToKKyAgICAgIC8qIFdlIG5lZWQgdGhlIGZyYW1lIGxlbmd0aCB0byBjYWxsIGFhY0VuY29kZXJfTGltaXRCaXRyYXRlKCkgKi8KKyAgICAgIGlmICgwID49IChoQWFjQ29uZmlnLT5iaXRSYXRlID0gYWFjRW5jb2Rlcl9MaW1pdEJpdHJhdGUoCisgICAgICAgICAgICAgICAgICAgIE5VTEwsIGhBYWNDb25maWctPnNhbXBsZVJhdGUsIGhBYWNDb25maWctPmZyYW1lbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5uQ2hhbm5lbHMsIGhBYWNDb25maWctPmNoYW5uZWxNb2RlLAorICAgICAgICAgICAgICAgICAgICBoQWFjQ29uZmlnLT5iaXRSYXRlLCBoQWFjQ29uZmlnLT5uU3ViRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICBpc1NickFjdGl2ZShoQWFjQ29uZmlnKSwgaEFhY0NvbmZpZy0+c2JyUmF0aW8sCisgICAgICAgICAgICAgICAgICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzLCBoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUpKSkgeworICAgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogQ29uZmlndXJlIFBOUyAqLworICBpZiAoQUFDRU5DX0JSX01PREVfSVNfVkJSKGhBYWNDb25maWctPmJpdHJhdGVNb2RlKSAvKiBWQlIgd2l0aG91dCBQTlMuICovCisgICAgICB8fCAoaEFhY0NvbmZpZy0+dXNlVG5zID09IDApKSAgICAgICAgICAgICAgICAgIC8qIFROUyByZXF1aXJlZC4gICAgKi8KKyAgeworICAgIGhBYWNDb25maWctPnVzZVBucyA9IDA7CisgIH0KKworICBpZiAoaEFhY0NvbmZpZy0+ZXBDb25maWcgPj0gMCkgeworICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzIHw9IEFDX0VSOworICAgIGlmICgoKElOVCloQWFjQ29uZmlnLT5jaGFubmVsTW9kZSA8IDEpIHx8CisgICAgICAgICgoSU5UKWhBYWNDb25maWctPmNoYW5uZWxNb2RlID4gMTQpKSB7CisgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOyAvKiBDaGFubmVsIGNvbmZpZyAwIG5vdCBzdXBwb3J0ZWQuICovCisgICAgfQorICB9CisKKyAgaWYgKChoQWFjQ29uZmlnLT5zeW50YXhGbGFncyAmIEFDX0xEX01QUykgPT0gMCkgeworICAgIGlmIChGREthYWNFbmNfRGV0ZXJtaW5lRW5jb2Rlck1vZGUoJmhBYWNDb25maWctPmNoYW5uZWxNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0NvbmZpZy0+bkNoYW5uZWxzKSAhPSBBQUNfRU5DX09LKSB7CisgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOyAvKiBuQ2hhbm5lbHMgZG9lc24ndCBtYXRjaCBjaE1vZGUsIHRoaXMgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3QgYSBjaGVjay11cCAqLworICAgIH0KKyAgfQorCisgIGlmICgoaEFhY0NvbmZpZy0+bkNoYW5uZWxzID4gaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVscykgfHwKKyAgICAgICgoRkRLYWFjRW5jX0dldENoYW5uZWxNb2RlQ29uZmlndXJhdGlvbihoQWFjQ29uZmlnLT5jaGFubmVsTW9kZSkKKyAgICAgICAgICAgIC0+bkNoYW5uZWxzRWZmID4gaEFhY0VuY29kZXItPm5NYXhTYnJDaGFubmVscykgJiYKKyAgICAgICBpc1NickFjdGl2ZShoQWFjQ29uZmlnKSkpIHsKKyAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOyAvKiBub3QgZW5vdWdoIGNoYW5uZWxzIGFsbG9jYXRlZCAqLworICB9CisKKyAgLyogTWV0YSBkYXRhIHJlc3RyaWN0aW9uLiAqLworICBzd2l0Y2ggKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSkgeworICAgIC8qIEFsbG93IG1ldGFkYXRhIHN1cHBvcnQgKi8KKyAgICBjYXNlIEFPVF9BQUNfTEM6CisgICAgY2FzZSBBT1RfU0JSOgorICAgIGNhc2UgQU9UX1BTOgorICAgIGNhc2UgQU9UX01QMl9BQUNfTEM6CisgICAgY2FzZSBBT1RfTVAyX1NCUjoKKyAgICAgIGhBYWNFbmNvZGVyLT5tZXRhRGF0YUFsbG93ZWQgPSAxOworICAgICAgaWYgKCEoKCgoSU5UKWhBYWNDb25maWctPmNoYW5uZWxNb2RlID49IDEpICYmCisgICAgICAgICAgICAgKChJTlQpaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUgPD0gMTQpKSB8fAorICAgICAgICAgICAgKE1PREVfN18xX1JFQVJfU1VSUk9VTkQgPT0gaEFhY0NvbmZpZy0+Y2hhbm5lbE1vZGUpIHx8CisgICAgICAgICAgICAoTU9ERV83XzFfRlJPTlRfQ0VOVEVSID09IGhBYWNDb25maWctPmNoYW5uZWxNb2RlKSkpIHsKKyAgICAgICAgY29uZmlnLT51c2VyTWV0YURhdGFNb2RlID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIC8qIFByb2hpYml0IG1ldGFkYXRhIHN1cHBvcnQgKi8KKyAgICBkZWZhdWx0OgorICAgICAgaEFhY0VuY29kZXItPm1ldGFEYXRhQWxsb3dlZCA9IDA7CisgIH0KKworICByZXR1cm4gZXJyOwogfQogCi1zdGF0aWMKLUlOVCBhYWNlbmNfU2JyQ2FsbGJhY2soCi0gICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgIHNlbGYsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgIGhCcywKLSAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGVJbiwKLSAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGVPdXQsCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKLSAgICAgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgICAgZWxlbWVudElELAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICBlbGVtZW50SW5kZXgKLSAgICAgICAgKQoteworc3RhdGljIElOVCBhYWNlbmNfU2JyQ2FsbGJhY2sodm9pZCAqc2VsZiwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGVJbiwgY29uc3QgSU5UIHNhbXBsZVJhdGVPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgZWxlbWVudElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGVsZW1lbnRJbmRleCwgY29uc3QgVUNIQVIgaGFybW9uaWNTYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBzdGVyZW9Db25maWdJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIGNvbmZpZ01vZGUsIFVDSEFSICpjb25maWdDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGRvd25zY2FsZUZhY3RvcikgewogICBIQU5ETEVfQUFDRU5DT0RFUiBoQWFjRW5jb2RlciA9IChIQU5ETEVfQUFDRU5DT0RFUilzZWxmOwogCiAgIHNickVuY29kZXJfR2V0SGVhZGVyKGhBYWNFbmNvZGVyLT5oRW52RW5jLCBoQnMsIGVsZW1lbnRJbmRleCwgMCk7CkBAIC0xMDA2LDcyNSArMTIxMyw4MzUgQEAKICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBBQUNFTkNfRVJST1IgYWFjRW5jSW5pdChIQU5ETEVfQUFDRU5DT0RFUiAgaEFhY0VuY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgICAgICAgICAgICAgIEluaXRGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VSX1BBUkFNICAgICAgICAqY29uZmlnKQotewotICAgIEFBQ0VOQ19FUlJPUiBlcnIgPSBBQUNFTkNfT0s7CitJTlQgYWFjZW5jX1NzY0NhbGxiYWNrKHZvaWQgKnNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2FtcGxpbmdSYXRlLCBjb25zdCBJTlQgc3RlcmVvQ29uZmlnSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBjb3JlU2JyRnJhbWVMZW5ndGhJbmRleCwgY29uc3QgSU5UIGNvbmZpZ0J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBjb25maWdNb2RlLCBVQ0hBUiAqY29uZmlnQ2hhbmdlZCkgeworICBIQU5ETEVfQUFDRU5DT0RFUiBoQWFjRW5jb2RlciA9IChIQU5ETEVfQUFDRU5DT0RFUilzZWxmOwogCi0gICAgSU5UIGFhY0J1ZmZlck9mZnNldCA9IDA7Ci0gICAgSEFORExFX1NCUl9FTkNPREVSICAgICAqaFNickVuY29kZXIgPSAmaEFhY0VuY29kZXItPmhFbnZFbmM7Ci0gICAgSEFORExFX0FBQ0VOQ19DT05GSUcgICAgaEFhY0NvbmZpZyAgPSAmaEFhY0VuY29kZXItPmFhY0NvbmZpZzsKLQotICAgIGhBYWNFbmNvZGVyLT5uWmVyb3NBcHBlbmRlZCA9IDA7ICAgICAgICAgIC8qIGNvdW50IGFwcGVuZGVkIHplcm9zICovCi0KLSAgICBJTlQgZnJhbWVMZW5ndGggPSBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aDsKLQotICAgIGlmICggKEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX0NPTkZJRykgKQotICAgIHsKLSAgICAgICAgQ0hBTk5FTF9NT0RFIHByZXZDaE1vZGUgPSBoQWFjQ29uZmlnLT5jaGFubmVsTW9kZTsKLQotICAgICAgICAvKiBWZXJpZnkgc2V0dGluZ3MgYW5kIHVwZGF0ZTogY29uZmlnIC0+IGhlQWFjRW5jb2RlciAqLwotICAgICAgICBpZiAoIChlcnI9RkRLYWFjRW5jX0FkanVzdEVuY1NldHRpbmdzKGhBYWNFbmNvZGVyLCBjb25maWcpKSAhPSBBQUNFTkNfT0sgKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGZyYW1lTGVuZ3RoID0gaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGg7IC8qIGFkYXB0IHRlbXBvcmFsIGZyYW1lbGVuZ3RoICovCi0KLSAgICAgICAgLyogU2VhbWxlc3MgY2hhbm5lbCByZWNvbmZpZ3VyYXRpb24gaW4gc2JyIG5vdCBmdWxseSBpbXBsZW1lbnRlZCAqLwotICAgICAgICBpZiAoIChwcmV2Q2hNb2RlIT1oQWFjQ29uZmlnLT5jaGFubmVsTW9kZSkgJiYgaXNTYnJBY3RpdmUoaEFhY0NvbmZpZykgKSB7Ci0gICAgICAgICAgICBJbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfU1RBVEVTOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ2xlYXIgaW5wdXQgYnVmZmVyICovCi0gICAgaWYgKCBJbml0RmxhZ3MgPT0gQUFDRU5DX0lOSVRfQUxMICkgewotICAgICAgICBGREttZW1jbGVhcihoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXIsIHNpemVvZihJTlRfUENNKSpoQWFjRW5jb2Rlci0+bk1heEFhY0NoYW5uZWxzKklOUFVUQlVGRkVSX1NJWkUpOwotICAgIH0KLQotICAgIGlmICggKEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX0NPTkZJRykgKQotICAgIHsKLSAgICAgICAgYWFjQnVmZmVyT2Zmc2V0ID0gMDsKLSAgICAgICAgaWYgKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0VMRCkgewotICAgICAgICAgICAgaEFhY0VuY29kZXItPm5EZWxheSA9IERFTEFZX0FBQ0VMRChoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBoQWFjRW5jb2Rlci0+bkRlbGF5ID0gREVMQVlfQUFDKGhBYWNDb25maWctPmZyYW1lbGVuZ3RoKTsgLyogQUFDIGVuY29kZXIgZGVsYXkgKi8KLSAgICAgICAgfQotICAgICAgICBoQWFjQ29uZmlnLT5hbmNEYXRhQml0UmF0ZSA9IDA7Ci0gICAgfQotCi0gICAgaWYgKCBpc1NickFjdGl2ZShoQWFjQ29uZmlnKSAmJgotICAgICAgICAoKEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX0NPTkZJRykgfHwgKEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX1NUQVRFUykpICkKLSAgICB7Ci0gICAgICAgIElOVCBzYnJFcnJvcjsKLSAgICAgICAgU0JSX0VMRU1FTlRfSU5GTyBzYnJFbEluZm9bKDgpXTsKLSAgICAgICAgQ0hBTk5FTF9NQVBQSU5HIGNoYW5uZWxNYXBwaW5nOwotCi0gICAgICAgIGlmICggRkRLYWFjRW5jX0luaXRDaGFubmVsTWFwcGluZyhoQWFjQ29uZmlnLT5jaGFubmVsTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNDb25maWctPmNoYW5uZWxPcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxNYXBwaW5nKSAhPSBBQUNfRU5DX09LICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEFBQ0VOQ19JTklUX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2hlY2sgcmV0dXJuIHZhbHVlIGFuZCBpZiB0aGUgU0JSIGVuY29kZXIgY2FuIGhhbmRsZSBlbm91Z2ggZWxlbWVudHMgKi8KLSAgICAgICAgaWYgKGNoYW5uZWxNYXBwaW5nLm5FbGVtZW50cyA+ICg4KSkgewotICAgICAgICAgICAgcmV0dXJuIEFBQ0VOQ19JTklUX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgYWFjRW5jRGlzdHJpYnV0ZVNickJpdHMoJmNoYW5uZWxNYXBwaW5nLCBzYnJFbEluZm8sIGhBYWNDb25maWctPmJpdFJhdGUpOwotCi0gICAgICAgIFVJTlQgaW5pdEZsYWcgPSAwOwotICAgICAgICBpbml0RmxhZyArPSAoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfU1RBVEVTKSA/IDEgOiAwOwotCi0gICAgICAgIC8qIExldCB0aGUgU0JSIGVuY29kZXIgdGFrZSBhIGxvb2sgYXQgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIGNoYW5nZSBpZiByZXF1aXJlZC4gKi8KLSAgICAgICAgc2JyRXJyb3IgPSBzYnJFbmNvZGVyX0luaXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoU2JyRW5jb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLm5FbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhBYWNDb25maWctPmJhbmRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFhY0J1ZmZlck9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhBYWNDb25maWctPm5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhBYWNDb25maWctPnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoQWFjQ29uZmlnLT5zYnJSYXRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEFhY0VuY29kZXItPm5EZWxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19FTEQpID8gMSA6IFRSQU5TX0ZBQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25maWctPnVzZXJUcEhlYWRlclBlcmlvZCE9MHhGRikgPyBjb25maWctPnVzZXJUcEhlYWRlclBlcmlvZCA6IERFRkFVTFRfSEVBREVSX1BFUklPRF9SRVBFVElUSU9OX1JBVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0RmxhZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotCi0gICAgICAgIC8qIFN1cHByZXNzIEFPVCByZWNvbmZpZ3VyYXRpb24gYW5kIGNoZWNrIGVycm9yIHN0YXR1cy4gKi8KLSAgICAgICAgaWYgKHNickVycm9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gQUFDRU5DX0lOSVRfU0JSX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhBYWNDb25maWctPm5DaGFubmVscyA9PSAxKSB7Ci0gICAgICAgICAgICBoQWFjQ29uZmlnLT5jaGFubmVsTW9kZSA9IE1PREVfMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIE5ldmVyIHVzZSBQTlMgaWYgU0JSIGlzIGFjdGl2ZSAqLwotICAgICAgICBpZiAoIGhBYWNDb25maWctPnVzZVBucyApIHsKLSAgICAgICAgICAgaEFhY0NvbmZpZy0+dXNlUG5zID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGVzdGltYXRlZCBiaXRyYXRlIGNvbnN1bWVkIGJ5IFNCUiBvciBQUyAqLwotICAgICAgICBoQWFjQ29uZmlnLT5hbmNEYXRhQml0UmF0ZSA9IHNickVuY29kZXJfR2V0RXN0aW1hdGVCaXRyYXRlKCpoU2JyRW5jb2RlcikgOwotCi0gICAgfSAvKiBzYnIgaW5pdGlhbGl6YXRpb24gKi8KLQotCi0gICAgLyoKLSAgICAgKiBJbml0aWFsaXplIFRyYW5zcG9ydCAtIE1vZHVsZS4KLSAgICAgKi8KLSAgICBpZiAoIChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9UUkFOU1BPUlQpICkKLSAgICB7Ci0gICAgICAgIFVJTlQgZmxhZ3MgPSAwOwotCi0gICAgICAgIEZES2FhY0VuY19NYXBDb25maWcoCi0gICAgICAgICAgICAgICAgJmhBYWNFbmNvZGVyLT5jb2RlckNvbmZpZywKLSAgICAgICAgICAgICAgICBjb25maWcsCi0gICAgICAgICAgICAgICAgZ2V0U2JyU2lnbmFsaW5nTW9kZShoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUsIGNvbmZpZy0+dXNlclRwVHlwZSwgY29uZmlnLT51c2VyVHBTaWduYWxpbmcsIGhBYWNDb25maWctPnNiclJhdGlvKSwKLSAgICAgICAgICAgICAgICBoQWFjQ29uZmlnKTsKLQotICAgICAgICAvKiBjcmVhdGUgZmxhZ3MgZm9yIHRyYW5zcG9ydCBlbmNvZGVyICovCi0gICAgICAgIGlmIChjb25maWctPnVzZXJUcEFteHYgIT0gMCkgewotICAgICAgICAgICAgZmxhZ3MgfD0gVFBfRkxBR19MQVRNX0FNVjsKLSAgICAgICAgfQotICAgICAgICAvKiBDbGVhciBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIEZES21lbWNsZWFyKGhBYWNFbmNvZGVyLT5vdXRCdWZmZXIsIGhBYWNFbmNvZGVyLT5vdXRCdWZmZXJJbkJ5dGVzKnNpemVvZihVQ0hBUikpOwotCi0gICAgICAgIC8qIEluaXRpYWxpemUgQml0c3RyZWFtIGVuY29kZXIgKi8KLSAgICAgICAgaWYgKCB0cmFuc3BvcnRFbmNfSW5pdChoQWFjRW5jb2Rlci0+aFRwRW5jLCBoQWFjRW5jb2Rlci0+b3V0QnVmZmVyLCBoQWFjRW5jb2Rlci0+b3V0QnVmZmVySW5CeXRlcywgY29uZmlnLT51c2VyVHBUeXBlLCAmaEFhY0VuY29kZXItPmNvZGVyQ29uZmlnLCBmbGFncykgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEFBQ0VOQ19JTklUX1RQX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICB9IC8qIHRyYW5zcG9ydCBpbml0aWFsaXphdGlvbiAqLwotCi0gICAgLyoKLSAgICAgKiBJbml0aWFsaXplIEFBQyAtIENvcmUuCi0gICAgICovCi0gICAgaWYgKCAoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfQ09ORklHKSB8fAotICAgICAgICAgKEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX1NUQVRFUykgKQotICAgIHsKLSAgICAgICAgQUFDX0VOQ09ERVJfRVJST1IgZXJyOwotICAgICAgICBlcnIgPSBGREthYWNFbmNfSW5pdGlhbGl6ZShoQWFjRW5jb2Rlci0+aEFhY0VuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmhUcEVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX1NUQVRFUykgPyAxIDogMCk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBBQUNfRU5DX09LKSB7Ci0gICAgICAgICAgICByZXR1cm4gQUFDRU5DX0lOSVRfQUFDX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICB9IC8qIGFhYyBpbml0aWFsaXphdGlvbiAqLwotCi0gICAgLyoKLSAgICAgKiBJbml0aWFsaXplIE1ldGEgRGF0YSAtIEVuY29kZXIuCi0gICAgICovCi0gICAgaWYgKCBoQWFjRW5jb2Rlci0+aE1ldGFkYXRhRW5jICYmIChoQWFjRW5jb2Rlci0+bWV0YURhdGFBbGxvd2VkIT0wKSAmJgotICAgICAgICAoKEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX0NPTkZJRykgfHwoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfU1RBVEVTKSkgKQotICAgIHsKLSAgICAgICAgSU5UIGlucHV0RGF0YURlbGF5ID0gREVMQVlfQUFDKGhBYWNDb25maWctPmZyYW1lbGVuZ3RoKTsKLQotICAgICAgICBpZiAoIGlzU2JyQWN0aXZlKGhBYWNDb25maWcpICYmIGhTYnJFbmNvZGVyIT1OVUxMKSB7Ci0gICAgICAgICAgaW5wdXREYXRhRGVsYXkgPSBoQWFjQ29uZmlnLT5zYnJSYXRpbyppbnB1dERhdGFEZWxheSArIHNickVuY29kZXJfR2V0SW5wdXREYXRhRGVsYXkoKmhTYnJFbmNvZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggRkRLX01ldGFkYXRhRW5jX0luaXQoaEFhY0VuY29kZXItPmhNZXRhZGF0YUVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSW5pdEZsYWdzJkFBQ0VOQ19JTklUX1NUQVRFUykgPyAxIDogMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT51c2VyTWV0YURhdGFNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YURlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+dXNlclNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5uQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT51c2VyQ2hhbm5lbE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0NvbmZpZy0+Y2hhbm5lbE9yZGVyKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQUFDRU5DX0lOSVRfTUVUQV9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGhBYWNFbmNvZGVyLT5uRGVsYXkgKz0gRkRLX01ldGFkYXRhRW5jX0dldERlbGF5KGhBYWNFbmNvZGVyLT5oTWV0YWRhdGFFbmMpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVXBkYXRlIHBvaW50ZXIgdG8gd29ya2luZyBidWZmZXIuCi0gICAgICovCi0gICAgaWYgKCAoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfQ09ORklHKSApCi0gICAgewotICAgICAgICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXJPZmZzZXQgPSBhYWNCdWZmZXJPZmZzZXQ7Ci0KLSAgICAgICAgaEFhY0VuY29kZXItPm5TYW1wbGVzVG9SZWFkID0gZnJhbWVMZW5ndGggKiBjb25maWctPm5DaGFubmVsczsKLQotICAgICAgICAvKiBNYWtlIG5EZWxheSBjb21wYXJpc29uIGNvbXBhdGlibGUgd2l0aCBjb25maWctPm5TYW1wbGVzUmVhZCAqLwotICAgICAgICBoQWFjRW5jb2Rlci0+bkRlbGF5ICo9IGNvbmZpZy0+bkNoYW5uZWxzOwotCi0gICAgfSAvKiBwYXJhbWV0ZXIgY2hhbmdlZCAqLwotCi0gICAgcmV0dXJuIEFBQ0VOQ19PSzsKKyAgcmV0dXJuIChGREtfTXBlZ3NFbmNfV3JpdGVTcGF0aWFsU3BlY2lmaWNDb25maWcoaEFhY0VuY29kZXItPmhNcHNFbmMsIGhCcykpOwogfQogCitzdGF0aWMgQUFDRU5DX0VSUk9SIGFhY0VuY0luaXQoSEFORExFX0FBQ0VOQ09ERVIgaEFhY0VuY29kZXIsIFVMT05HIEluaXRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VSX1BBUkFNICpjb25maWcpIHsKKyAgQUFDRU5DX0VSUk9SIGVyciA9IEFBQ0VOQ19PSzsKIAotQUFDRU5DX0VSUk9SIGFhY0VuY09wZW4oCi0gICAgICAgIEhBTkRMRV9BQUNFTkNPREVSICAgICAgICAqcGhBYWNFbmNvZGVyLAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgIGVuY01vZHVsZXMsCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgbWF4Q2hhbm5lbHMKLSAgICAgICAgKQotewotICAgIEFBQ0VOQ19FUlJPUiBlcnIgPSBBQUNFTkNfT0s7Ci0gICAgSEFORExFX0FBQ0VOQ09ERVIgIGhBYWNFbmNvZGVyID0gTlVMTDsKKyAgSU5UIGFhY0J1ZmZlck9mZnNldCA9IDA7CisgIEhBTkRMRV9TQlJfRU5DT0RFUiAqaFNickVuY29kZXIgPSAmaEFhY0VuY29kZXItPmhFbnZFbmM7CisgIEhBTkRMRV9BQUNFTkNfQ09ORklHIGhBYWNDb25maWcgPSAmaEFhY0VuY29kZXItPmFhY0NvbmZpZzsKIAotICAgIGlmIChwaEFhY0VuY29kZXIgPT0gTlVMTCkgewotICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9IQU5ETEU7Ci0gICAgICAgIGdvdG8gYmFpbDsKKyAgaEFhY0VuY29kZXItPm5aZXJvc0FwcGVuZGVkID0gMDsgLyogY291bnQgYXBwZW5kZWQgemVyb3MgKi8KKworICBJTlQgZnJhbWVMZW5ndGggPSBoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aDsKKworICBpZiAoKEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX0NPTkZJRykpIHsKKyAgICBDSEFOTkVMX01PREUgcHJldkNoTW9kZSA9IGhBYWNDb25maWctPmNoYW5uZWxNb2RlOworCisgICAgLyogVmVyaWZ5IHNldHRpbmdzIGFuZCB1cGRhdGU6IGNvbmZpZyAtPiBoZUFhY0VuY29kZXIgKi8KKyAgICBpZiAoKGVyciA9IEZES2FhY0VuY19BZGp1c3RFbmNTZXR0aW5ncyhoQWFjRW5jb2RlciwgY29uZmlnKSkgIT0gQUFDRU5DX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBmcmFtZUxlbmd0aCA9IGhBYWNDb25maWctPmZyYW1lbGVuZ3RoOyAvKiBhZGFwdCB0ZW1wb3JhbCBmcmFtZWxlbmd0aCAqLworCisgICAgLyogU2VhbWxlc3MgY2hhbm5lbCByZWNvbmZpZ3VyYXRpb24gaW4gc2JyIG5vdCBmdWxseSBpbXBsZW1lbnRlZCAqLworICAgIGlmICgocHJldkNoTW9kZSAhPSBoQWFjQ29uZmlnLT5jaGFubmVsTW9kZSkgJiYgaXNTYnJBY3RpdmUoaEFhY0NvbmZpZykpIHsKKyAgICAgIEluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9TVEFURVM7CisgICAgfQorICB9CisKKyAgLyogQ2xlYXIgaW5wdXQgYnVmZmVyICovCisgIGlmIChJbml0RmxhZ3MgPT0gQUFDRU5DX0lOSVRfQUxMKSB7CisgICAgRkRLbWVtY2xlYXIoaEFhY0VuY29kZXItPmlucHV0QnVmZmVyLAorICAgICAgICAgICAgICAgIHNpemVvZihJTlRfUENNKSAqIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlclNpemUpOworICB9CisKKyAgaWYgKChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9DT05GSUcpKSB7CisgICAgYWFjQnVmZmVyT2Zmc2V0ID0gMDsKKyAgICBzd2l0Y2ggKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSkgeworICAgICAgY2FzZSBBT1RfRVJfQUFDX0xEOgorICAgICAgICBoQWFjRW5jb2Rlci0+bkRlbGF5ID0gREVMQVlfQUFDTEQoaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6CisgICAgICAgIGhBYWNFbmNvZGVyLT5uRGVsYXkgPSBERUxBWV9BQUNFTEQoaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGgpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGhBYWNFbmNvZGVyLT5uRGVsYXkgPQorICAgICAgICAgICAgREVMQVlfQUFDKGhBYWNDb25maWctPmZyYW1lbGVuZ3RoKTsgLyogQUFDIGVuY29kZXIgZGVsYXkgKi8KICAgICB9CiAKLSAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KLSAgICBoQWFjRW5jb2RlciA9IEdldF9BYWNFbmNvZGVyKCk7CisgICAgaEFhY0NvbmZpZy0+YW5jRGF0YUJpdFJhdGUgPSAwOworICB9CiAKLSAgICBpZiAoaEFhY0VuY29kZXIgPT0gTlVMTCkgewotICAgICAgICBlcnIgPSBBQUNFTkNfTUVNT1JZX0VSUk9SOwotICAgICAgICBnb3RvIGJhaWw7CisgIGlmICgoTlVMTCAhPSBoQWFjRW5jb2Rlci0+aEVudkVuYykgJiYgaXNTYnJBY3RpdmUoaEFhY0NvbmZpZykgJiYKKyAgICAgICgoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfQ09ORklHKSB8fCAoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfU1RBVEVTKSkpIHsKKyAgICBJTlQgc2JyRXJyb3I7CisgICAgVUlOVCBpbml0RmxhZyA9IDA7CisgICAgU0JSX0VMRU1FTlRfSU5GTyBzYnJFbEluZm9bKDgpXTsKKyAgICBDSEFOTkVMX01BUFBJTkcgY2hhbm5lbE1hcHBpbmc7CisgICAgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlID0gaXNQc0FjdGl2ZShoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY29uZmlnLT51c2VyQ2hhbm5lbE1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBoQWFjQ29uZmlnLT5jaGFubmVsTW9kZTsKKyAgICBJTlQgbnVtQ2hhbm5lbHMgPSBpc1BzQWN0aXZlKGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjb25maWctPm5DaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICA6IGhBYWNDb25maWctPm5DaGFubmVsczsKKworICAgIGlmIChGREthYWNFbmNfSW5pdENoYW5uZWxNYXBwaW5nKGNoYW5uZWxNb2RlLCBoQWFjQ29uZmlnLT5jaGFubmVsT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxNYXBwaW5nKSAhPSBBQUNfRU5DX09LKSB7CisgICAgICByZXR1cm4gQUFDRU5DX0lOSVRfRVJST1I7CiAgICAgfQogCi0gICAgRkRLbWVtY2xlYXIoaEFhY0VuY29kZXIsIHNpemVvZihBQUNFTkNPREVSKSk7Ci0KLSAgICAvKiBTcGVjaWZ5IGVuY29kZXIgbW9kdWxlcyB0byBiZSBhbGxvY2F0ZWQuICovCi0gICAgaWYgKGVuY01vZHVsZXM9PTApIHsKLSAgICAgICAgaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMgPSBFTkNfTU9ERV9GTEFHX0FBQzsKLSAgICAgICAgaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMgfD0gRU5DX01PREVfRkxBR19TQlI7Ci0gICAgICAgIGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzIHw9IEVOQ19NT0RFX0ZMQUdfUFM7Ci0gICAgICAgIGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzIHw9IEVOQ19NT0RFX0ZMQUdfTUVUQTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgLyogY29uc2lkZXIgU0FDIGFuZCBQUyBtb2R1bGUgKi8KLSAgICAgICAgaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMgPSBlbmNNb2R1bGVzOworICAgIC8qIENoZWNrIHJldHVybiB2YWx1ZSBhbmQgaWYgdGhlIFNCUiBlbmNvZGVyIGNhbiBoYW5kbGUgZW5vdWdoIGVsZW1lbnRzICovCisgICAgaWYgKGNoYW5uZWxNYXBwaW5nLm5FbGVtZW50cyA+ICg4KSkgeworICAgICAgcmV0dXJuIEFBQ0VOQ19JTklUX0VSUk9SOwogICAgIH0KIAotICAgIC8qIERldGVybWluZSBtYXggY2hhbm5lbCBjb25maWd1cmF0aW9uLiAqLwotICAgIGlmIChtYXhDaGFubmVscz09MCkgewotICAgICAgICBoQWFjRW5jb2Rlci0+bk1heEFhY0NoYW5uZWxzID0gKDgpOwotICAgICAgICBoQWFjRW5jb2Rlci0+bk1heFNickNoYW5uZWxzID0gKDgpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVscyA9IChtYXhDaGFubmVscyYweDAwRkYpOwotICAgICAgICBpZiAoIChoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyZFTkNfTU9ERV9GTEFHX1NCUikgKSB7Ci0gICAgICAgICAgICBoQWFjRW5jb2Rlci0+bk1heFNickNoYW5uZWxzID0gKG1heENoYW5uZWxzJjB4RkYwMCkgPyAobWF4Q2hhbm5lbHM+PjgpIDogaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVsczsKLSAgICAgICAgfQorICAgIGFhY0VuY0Rpc3RyaWJ1dGVTYnJCaXRzKCZjaGFubmVsTWFwcGluZywgc2JyRWxJbmZvLCBoQWFjQ29uZmlnLT5iaXRSYXRlKTsKIAotICAgICAgICBpZiAoIChoQWFjRW5jb2Rlci0+bk1heEFhY0NoYW5uZWxzPig4KSkgfHwgKGhBYWNFbmNvZGVyLT5uTWF4U2JyQ2hhbm5lbHM+KDgpKSApIHsKLSAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgfQotICAgIH0gLyogbWF4Q2hhbm5lbHM9PTAgKi8KKyAgICBpbml0RmxhZyArPSAoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfU1RBVEVTKSA/IDEgOiAwOwogCi0gICAgLyogTWF4IG51bWJlciBvZiBlbGVtZW50cyBjb3VsZCBiZSB0dW5lZCBhbnkgbW9yZS4gKi8KLSAgICBoQWFjRW5jb2Rlci0+bk1heEFhY0VsZW1lbnRzID0gZml4TWluKCg4KSwgaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVscyk7Ci0gICAgaEFhY0VuY29kZXItPm5NYXhTYnJFbGVtZW50cyA9IGZpeE1pbigoOCksIGhBYWNFbmNvZGVyLT5uTWF4U2JyQ2hhbm5lbHMpOwotICAgIGhBYWNFbmNvZGVyLT5uTWF4U3ViRnJhbWVzID0gKDEpOworICAgIC8qIExldCB0aGUgU0JSIGVuY29kZXIgdGFrZSBhIGxvb2sgYXQgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIGNoYW5nZSBpZgorICAgICAqIHJlcXVpcmVkLiAqLworICAgIHNickVycm9yID0gc2JyRW5jb2Rlcl9Jbml0KAorICAgICAgICAqaFNickVuY29kZXIsIHNickVsSW5mbywgY2hhbm5lbE1hcHBpbmcubkVsZW1lbnRzLAorICAgICAgICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXIsIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlclNpemVQZXJDaGFubmVsLAorICAgICAgICAmaEFhY0NvbmZpZy0+YmFuZFdpZHRoLCAmYWFjQnVmZmVyT2Zmc2V0LCAmbnVtQ2hhbm5lbHMsCisgICAgICAgIGhBYWNDb25maWctPnN5bnRheEZsYWdzLCAmaEFhY0NvbmZpZy0+c2FtcGxlUmF0ZSwgJmhBYWNDb25maWctPnNiclJhdGlvLAorICAgICAgICAmZnJhbWVMZW5ndGgsIGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSwgJmhBYWNFbmNvZGVyLT5uRGVsYXksCisgICAgICAgIChoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19FTEQpID8gMSA6IFRSQU5TX0ZBQywKKyAgICAgICAgKGNvbmZpZy0+dXNlclRwSGVhZGVyUGVyaW9kICE9IDB4RkYpCisgICAgICAgICAgICA/IGNvbmZpZy0+dXNlclRwSGVhZGVyUGVyaW9kCisgICAgICAgICAgICA6IERFRkFVTFRfSEVBREVSX1BFUklPRF9SRVBFVElUSU9OX1JBVEUsCisgICAgICAgIGluaXRGbGFnKTsKIAotCi0gICAgLyogSW4gY2FzZSBvZiBtZW1vcnkgb3ZlcmxheSwgYWxsb2NhdGUgbWVtb3J5IG91dCBvZiBsaWJyYXJpZXMgKi8KLQotICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlciA9IChJTlRfUENNKilGREtjYWxsb2MoaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVscypJTlBVVEJVRkZFUl9TSVpFLCBzaXplb2YoSU5UX1BDTSkpOwotCi0gICAgLyogT3BlbiBTQlIgRW5jb2RlciAqLwotICAgIGlmIChoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyZFTkNfTU9ERV9GTEFHX1NCUikgewotICAgICAgICBpZiAoIHNickVuY29kZXJfT3BlbigmaEFhY0VuY29kZXItPmhFbnZFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+bk1heFNickVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPm5NYXhTYnJDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzJkVOQ19NT0RFX0ZMQUdfUFMpID8gMSA6IDAgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnIgPSBBQUNFTkNfTUVNT1JZX0VSUk9SOwotICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgfQotICAgIH0gLyogKGVuY29kZXJfbW9kaXMmRU5DX01PREVfRkxBR19TQlIpICovCi0KLQotICAgIC8qIE9wZW4gQWFjIEVuY29kZXIgKi8KLSAgICBpZiAoIEZES2FhY0VuY19PcGVuKCZoQWFjRW5jb2Rlci0+aEFhY0VuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+bk1heEFhY0VsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5uTWF4QWFjQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKDEpKSAhPSBBQUNfRU5DX09LICkKLSAgICB7Ci0gICAgICAgIGVyciA9IEFBQ0VOQ19NRU1PUllfRVJST1I7Ci0gICAgICAgIGdvdG8gYmFpbDsKKyAgICAvKiBTdXBwcmVzcyBBT1QgcmVjb25maWd1cmF0aW9uIGFuZCBjaGVjayBlcnJvciBzdGF0dXMuICovCisgICAgaWYgKChzYnJFcnJvcikgfHwgKG51bUNoYW5uZWxzICE9IGhBYWNDb25maWctPm5DaGFubmVscykpIHsKKyAgICAgIHJldHVybiBBQUNFTkNfSU5JVF9TQlJfRVJST1I7CiAgICAgfQogCi0gICAgeyAvKiBHZXQgYml0c3RyZWFtIG91dHB1dGJ1ZmZlciBzaXplICovCi0gICAgICBVSU5UIGxkX007Ci0gICAgICBmb3IgKGxkX009MTsgKFVJTlQpKDE8PGxkX00pIDwgKGhBYWNFbmNvZGVyLT5uTWF4U3ViRnJhbWVzKmhBYWNFbmNvZGVyLT5uTWF4QWFjQ2hhbm5lbHMqNjE0NCk+PjM7IGxkX00rKykgOwotICAgICAgaEFhY0VuY29kZXItPm91dEJ1ZmZlckluQnl0ZXMgPSAoMTw8bGRfTSk7ICAvKiBidWZmZXIgaGFzIHRvIGJlIDJebiAqLworICAgIGlmIChudW1DaGFubmVscyA9PSAxKSB7CisgICAgICBoQWFjQ29uZmlnLT5jaGFubmVsTW9kZSA9IE1PREVfMTsKICAgICB9Ci0gICAgaEFhY0VuY29kZXItPm91dEJ1ZmZlciA9IEdldFJhbV9ic091dGJ1ZmZlcigpOwotICAgIGlmIChPVVRQVVRCVUZGRVJfU0laRSA8IGhBYWNFbmNvZGVyLT5vdXRCdWZmZXJJbkJ5dGVzICkgeworCisgICAgLyogTmV2ZXIgdXNlIFBOUyBpZiBTQlIgaXMgYWN0aXZlICovCisgICAgaWYgKGhBYWNDb25maWctPnVzZVBucykgeworICAgICAgaEFhY0NvbmZpZy0+dXNlUG5zID0gMDsKKyAgICB9CisKKyAgICAvKiBlc3RpbWF0ZWQgYml0cmF0ZSBjb25zdW1lZCBieSBTQlIgb3IgUFMgKi8KKyAgICBoQWFjQ29uZmlnLT5hbmNEYXRhQml0UmF0ZSA9IHNickVuY29kZXJfR2V0RXN0aW1hdGVCaXRyYXRlKCpoU2JyRW5jb2Rlcik7CisKKyAgfSAvKiBzYnIgaW5pdGlhbGl6YXRpb24gKi8KKworICBpZiAoKGhBYWNFbmNvZGVyLT5oTXBzRW5jICE9IE5VTEwpICYmIChoQWFjQ29uZmlnLT5zeW50YXhGbGFncyAmIEFDX0xEX01QUykpIHsKKyAgICBpbnQgY29yZUNvZGVyRGVsYXkgPSBERUxBWV9BQUNFTEQoaEFhY0NvbmZpZy0+ZnJhbWVsZW5ndGgpOworCisgICAgaWYgKGlzU2JyQWN0aXZlKGhBYWNDb25maWcpKSB7CisgICAgICBjb3JlQ29kZXJEZWxheSA9IGhBYWNDb25maWctPnNiclJhdGlvICogY29yZUNvZGVyRGVsYXkgKworICAgICAgICAgICAgICAgICAgICAgICBzYnJFbmNvZGVyX0dldElucHV0RGF0YURlbGF5KCpoU2JyRW5jb2Rlcik7CisgICAgfQorCisgICAgaWYgKE1QU19FTkNPREVSX09LICE9CisgICAgICAgIEZES19NcGVnc0VuY19Jbml0KGhBYWNFbmNvZGVyLT5oTXBzRW5jLCBoQWFjQ29uZmlnLT5hdWRpb09iamVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+dXNlclNhbXBsZXJhdGUsIGhBYWNDb25maWctPmJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2JyQWN0aXZlKGhBYWNDb25maWcpID8gaEFhY0NvbmZpZy0+c2JyUmF0aW8gOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbmd0aCwgLyogZm9yIGR1YWwgcmF0ZSBzYnIgdGhpcyB2YWx1ZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBtdWx0aXBsaWVkIGJ5IDIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyU2l6ZVBlckNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVDb2RlckRlbGF5KSkgeworICAgICAgcmV0dXJuIEFBQ0VOQ19JTklUX01QU19FUlJPUjsKKyAgICB9CisgIH0KKyAgaEFhY0VuY29kZXItPm5EZWxheSA9CisgICAgICBmTWF4KEZES19NcGVnc0VuY19HZXREZWxheShoQWFjRW5jb2Rlci0+aE1wc0VuYyksIGhBYWNFbmNvZGVyLT5uRGVsYXkpOworCisgIC8qCisgICAqIEluaXRpYWxpemUgVHJhbnNwb3J0IC0gTW9kdWxlLgorICAgKi8KKyAgaWYgKChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9UUkFOU1BPUlQpKSB7CisgICAgVUlOVCBmbGFncyA9IDA7CisKKyAgICBGREthYWNFbmNfTWFwQ29uZmlnKAorICAgICAgICAmaEFhY0VuY29kZXItPmNvZGVyQ29uZmlnLCBjb25maWcsCisgICAgICAgIGdldFNiclNpZ25hbGluZ01vZGUoaEFhY0NvbmZpZy0+YXVkaW9PYmplY3RUeXBlLCBjb25maWctPnVzZXJUcFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT51c2VyVHBTaWduYWxpbmcsIGhBYWNDb25maWctPnNiclJhdGlvKSwKKyAgICAgICAgaEFhY0NvbmZpZyk7CisKKyAgICAvKiBjcmVhdGUgZmxhZ3MgZm9yIHRyYW5zcG9ydCBlbmNvZGVyICovCisgICAgaWYgKGNvbmZpZy0+dXNlclRwQW14diAhPSAwKSB7CisgICAgICBmbGFncyB8PSBUUF9GTEFHX0xBVE1fQU1WOworICAgIH0KKyAgICAvKiBDbGVhciBvdXRwdXQgYnVmZmVyICovCisgICAgRkRLbWVtY2xlYXIoaEFhY0VuY29kZXItPm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+b3V0QnVmZmVySW5CeXRlcyAqIHNpemVvZihVQ0hBUikpOworCisgICAgLyogSW5pdGlhbGl6ZSBCaXRzdHJlYW0gZW5jb2RlciAqLworICAgIGlmICh0cmFuc3BvcnRFbmNfSW5pdChoQWFjRW5jb2Rlci0+aFRwRW5jLCBoQWFjRW5jb2Rlci0+b3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+b3V0QnVmZmVySW5CeXRlcywgY29uZmlnLT51c2VyVHBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaEFhY0VuY29kZXItPmNvZGVyQ29uZmlnLCBmbGFncykgIT0gMCkgeworICAgICAgcmV0dXJuIEFBQ0VOQ19JTklUX1RQX0VSUk9SOworICAgIH0KKworICB9IC8qIHRyYW5zcG9ydCBpbml0aWFsaXphdGlvbiAqLworCisgIC8qCisgICAqIEluaXRpYWxpemUgQUFDIC0gQ29yZS4KKyAgICovCisgIGlmICgoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfQ09ORklHKSB8fCAoSW5pdEZsYWdzICYgQUFDRU5DX0lOSVRfU1RBVEVTKSkgeworICAgIGlmIChGREthYWNFbmNfSW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5oQWFjRW5jLCBoQWFjQ29uZmlnLCBoQWFjRW5jb2Rlci0+aFRwRW5jLAorICAgICAgICAgICAgKEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX1NUQVRFUykgPyAxIDogMCkgIT0gQUFDX0VOQ19PSykgeworICAgICAgcmV0dXJuIEFBQ0VOQ19JTklUX0FBQ19FUlJPUjsKKyAgICB9CisKKyAgfSAvKiBhYWMgaW5pdGlhbGl6YXRpb24gKi8KKworICAvKgorICAgKiBJbml0aWFsaXplIE1ldGEgRGF0YSAtIEVuY29kZXIuCisgICAqLworICBpZiAoaEFhY0VuY29kZXItPmhNZXRhZGF0YUVuYyAmJiAoaEFhY0VuY29kZXItPm1ldGFEYXRhQWxsb3dlZCAhPSAwKSAmJgorICAgICAgKChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9DT05GSUcpIHx8IChJbml0RmxhZ3MgJiBBQUNFTkNfSU5JVF9TVEFURVMpKSkgeworICAgIElOVCBpbnB1dERhdGFEZWxheSA9IERFTEFZX0FBQyhoQWFjQ29uZmlnLT5mcmFtZWxlbmd0aCk7CisKKyAgICBpZiAoaXNTYnJBY3RpdmUoaEFhY0NvbmZpZykgJiYgaFNickVuY29kZXIgIT0gTlVMTCkgeworICAgICAgaW5wdXREYXRhRGVsYXkgPSBoQWFjQ29uZmlnLT5zYnJSYXRpbyAqIGlucHV0RGF0YURlbGF5ICsKKyAgICAgICAgICAgICAgICAgICAgICAgc2JyRW5jb2Rlcl9HZXRJbnB1dERhdGFEZWxheSgqaFNickVuY29kZXIpOworICAgIH0KKworICAgIGlmIChGREtfTWV0YWRhdGFFbmNfSW5pdChoQWFjRW5jb2Rlci0+aE1ldGFkYXRhRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX1NUQVRFUykgPyAxIDogMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+dXNlck1ldGFEYXRhTW9kZSwgaW5wdXREYXRhRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoLCBjb25maWctPnVzZXJTYW1wbGVyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPm5DaGFubmVscywgY29uZmlnLT51c2VyQ2hhbm5lbE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNDb25maWctPmNoYW5uZWxPcmRlcikgIT0gMCkgeworICAgICAgcmV0dXJuIEFBQ0VOQ19JTklUX01FVEFfRVJST1I7CisgICAgfQorCisgICAgaEFhY0VuY29kZXItPm5EZWxheSArPSBGREtfTWV0YWRhdGFFbmNfR2V0RGVsYXkoaEFhY0VuY29kZXItPmhNZXRhZGF0YUVuYyk7CisgIH0KKworICAvKiBHZXQgY3VzdG9tIGRlbGF5LCBpLmUuIHRoZSBjb2RlYyBkZWxheSB3L28gdGhlIGRlY29kZXIncyBTQlItIG9yIE1QUyBkZWxheQorICAgKi8KKyAgaWYgKChoQWFjRW5jb2Rlci0+aE1wc0VuYyAhPSBOVUxMKSAmJiAoaEFhY0NvbmZpZy0+c3ludGF4RmxhZ3MgJiBBQ19MRF9NUFMpKSB7CisgICAgaEFhY0VuY29kZXItPm5EZWxheUNvcmUgPQorICAgICAgICBoQWFjRW5jb2Rlci0+bkRlbGF5IC0KKyAgICAgICAgZk1heCgwLCBGREtfTXBlZ3NFbmNfR2V0RGVjRGVsYXkoaEFhY0VuY29kZXItPmhNcHNFbmMpKTsKKyAgfSBlbHNlIGlmIChpc1NickFjdGl2ZShoQWFjQ29uZmlnKSAmJiBoU2JyRW5jb2RlciAhPSBOVUxMKSB7CisgICAgaEFhY0VuY29kZXItPm5EZWxheUNvcmUgPQorICAgICAgICBoQWFjRW5jb2Rlci0+bkRlbGF5IC0KKyAgICAgICAgZk1heCgwLCBzYnJFbmNvZGVyX0dldFNickRlY0RlbGF5KGhBYWNFbmNvZGVyLT5oRW52RW5jKSk7CisgIH0gZWxzZSB7CisgICAgaEFhY0VuY29kZXItPm5EZWxheUNvcmUgPSBoQWFjRW5jb2Rlci0+bkRlbGF5OworICB9CisKKyAgLyoKKyAgICogVXBkYXRlIHBvaW50ZXIgdG8gd29ya2luZyBidWZmZXIuCisgICAqLworICBpZiAoKEluaXRGbGFncyAmIEFBQ0VOQ19JTklUX0NPTkZJRykpIHsKKyAgICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXJPZmZzZXQgPSBhYWNCdWZmZXJPZmZzZXQ7CisKKyAgICBoQWFjRW5jb2Rlci0+blNhbXBsZXNUb1JlYWQgPSBmcmFtZUxlbmd0aCAqIGNvbmZpZy0+bkNoYW5uZWxzOworCisgIH0gLyogcGFyYW1ldGVyIGNoYW5nZWQgKi8KKworICByZXR1cm4gQUFDRU5DX09LOworfQorCitBQUNFTkNfRVJST1IgYWFjRW5jT3BlbihIQU5ETEVfQUFDRU5DT0RFUiAqcGhBYWNFbmNvZGVyLCBjb25zdCBVSU5UIGVuY01vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG1heENoYW5uZWxzKSB7CisgIEFBQ0VOQ19FUlJPUiBlcnIgPSBBQUNFTkNfT0s7CisgIEhBTkRMRV9BQUNFTkNPREVSIGhBYWNFbmNvZGVyID0gTlVMTDsKKworICBpZiAocGhBYWNFbmNvZGVyID09IE5VTEwpIHsKKyAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogYWxsb2NhdGUgbWVtb3J5ICovCisgIGhBYWNFbmNvZGVyID0gR2V0X0FhY0VuY29kZXIoKTsKKworICBpZiAoaEFhY0VuY29kZXIgPT0gTlVMTCkgeworICAgIGVyciA9IEFBQ0VOQ19NRU1PUllfRVJST1I7CisgICAgZ290byBiYWlsOworICB9CisKKyAgRkRLbWVtY2xlYXIoaEFhY0VuY29kZXIsIHNpemVvZihBQUNFTkNPREVSKSk7CisKKyAgLyogU3BlY2lmeSBlbmNvZGVyIG1vZHVsZXMgdG8gYmUgYWxsb2NhdGVkLiAqLworICBpZiAoZW5jTW9kdWxlcyA9PSAwKSB7CisgICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKF9wTGliSW5mbywgTElCX0lORk8sIEZES19NT0RVTEVfTEFTVCkKKyAgICBMSUJfSU5GTygqcExpYkluZm8pCisgICAgW0ZES19NT0RVTEVfTEFTVF0gPSAoTElCX0lORk8oKilbRkRLX01PRFVMRV9MQVNUXSlfcExpYkluZm87CisgICAgRkRLaW5pdExpYkluZm8oKnBMaWJJbmZvKTsKKyAgICBhYWNFbmNHZXRMaWJJbmZvKCpwTGliSW5mbyk7CisKKyAgICBoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyA9IEVOQ19NT0RFX0ZMQUdfQUFDOworICAgIGlmIChGREtsaWJJbmZvX2dldENhcGFiaWxpdGllcygqcExpYkluZm8sIEZES19TQlJFTkMpICYgQ0FQRl9TQlJfSFEpIHsKKyAgICAgIGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzIHw9IEVOQ19NT0RFX0ZMQUdfU0JSOworICAgIH0KKyAgICBpZiAoRkRLbGliSW5mb19nZXRDYXBhYmlsaXRpZXMoKnBMaWJJbmZvLCBGREtfU0JSRU5DKSAmIENBUEZfU0JSX1BTX01QRUcpIHsKKyAgICAgIGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzIHw9IEVOQ19NT0RFX0ZMQUdfUFM7CisgICAgfQorICAgIGlmIChGREtsaWJJbmZvX2dldENhcGFiaWxpdGllcygqcExpYkluZm8sIEZES19BQUNFTkMpICYgQ0FQRl9BQUNfRFJDKSB7CisgICAgICBoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyB8PSBFTkNfTU9ERV9GTEFHX01FVEE7CisgICAgfQorICAgIGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzIHw9IEVOQ19NT0RFX0ZMQUdfU0FDOworCisgICAgQ19BTExPQ19TQ1JBVENIX0VORChfcExpYkluZm8sIExJQl9JTkZPLCBGREtfTU9EVUxFX0xBU1QpCisgIH0gZWxzZSB7CisgICAgaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMgPSBlbmNNb2R1bGVzOworICB9CisKKyAgLyogRGV0ZXJtaW5lIG1heCBjaGFubmVsIGNvbmZpZ3VyYXRpb24uICovCisgIGlmIChtYXhDaGFubmVscyA9PSAwKSB7CisgICAgaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVscyA9ICg4KTsKKyAgICBoQWFjRW5jb2Rlci0+bk1heFNickNoYW5uZWxzID0gKDgpOworICB9IGVsc2UgeworICAgIGhBYWNFbmNvZGVyLT5uTWF4QWFjQ2hhbm5lbHMgPSAobWF4Q2hhbm5lbHMgJiAweDAwRkYpOworICAgIGlmICgoaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMgJiBFTkNfTU9ERV9GTEFHX1NCUikpIHsKKyAgICAgIGhBYWNFbmNvZGVyLT5uTWF4U2JyQ2hhbm5lbHMgPSAobWF4Q2hhbm5lbHMgJiAweEZGMDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKG1heENoYW5uZWxzID4+IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVsczsKKyAgICB9CisKKyAgICBpZiAoKGhBYWNFbmNvZGVyLT5uTWF4QWFjQ2hhbm5lbHMgPiAoOCkpIHx8CisgICAgICAgIChoQWFjRW5jb2Rlci0+bk1heFNickNoYW5uZWxzID4gKDgpKSkgeworICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfSAvKiBtYXhDaGFubmVscz09MCAqLworCisgIC8qIE1heCBudW1iZXIgb2YgZWxlbWVudHMgY291bGQgYmUgdHVuZWQgYW55IG1vcmUuICovCisgIGhBYWNFbmNvZGVyLT5uTWF4QWFjRWxlbWVudHMgPSBmaXhNaW4oKCg4KSksIGhBYWNFbmNvZGVyLT5uTWF4QWFjQ2hhbm5lbHMpOworICBoQWFjRW5jb2Rlci0+bk1heFNickVsZW1lbnRzID0gZml4TWluKCg4KSwgaEFhY0VuY29kZXItPm5NYXhTYnJDaGFubmVscyk7CisKKyAgLyogSW4gY2FzZSBvZiBtZW1vcnkgb3ZlcmxheSwgYWxsb2NhdGUgbWVtb3J5IG91dCBvZiBsaWJyYXJpZXMgKi8KKworICBpZiAoaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMgJiAoRU5DX01PREVfRkxBR19TQlIgfCBFTkNfTU9ERV9GTEFHX1BTKSkKKyAgICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbCA9IElOUFVUQlVGRkVSX1NJWkU7CisgIGVsc2UKKyAgICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbCA9ICgxMDI0KTsKKworICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXJTaXplID0KKyAgICAgIGhBYWNFbmNvZGVyLT5uTWF4QWFjQ2hhbm5lbHMgKiBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbDsKKworICBpZiAoTlVMTCA9PSAoaEFhY0VuY29kZXItPmlucHV0QnVmZmVyID0gKElOVF9QQ00gKilGREtjYWxsb2MoCisgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyU2l6ZSwgc2l6ZW9mKElOVF9QQ00pKSkpIHsKKyAgICBlcnIgPSBBQUNFTkNfTUVNT1JZX0VSUk9SOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIE9wZW4gU0JSIEVuY29kZXIgKi8KKyAgaWYgKGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzICYgRU5DX01PREVfRkxBR19TQlIpIHsKKyAgICBpZiAoc2JyRW5jb2Rlcl9PcGVuKAorICAgICAgICAgICAgJmhBYWNFbmNvZGVyLT5oRW52RW5jLCBoQWFjRW5jb2Rlci0+bk1heFNickVsZW1lbnRzLAorICAgICAgICAgICAgaEFhY0VuY29kZXItPm5NYXhTYnJDaGFubmVscywKKyAgICAgICAgICAgIChoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyAmIEVOQ19NT0RFX0ZMQUdfUFMpID8gMSA6IDApKSB7CiAgICAgICBlcnIgPSBBQUNFTkNfTUVNT1JZX0VSUk9SOwogICAgICAgZ290byBiYWlsOwogICAgIH0KIAotICAgIC8qIE9wZW4gTWV0YSBEYXRhIEVuY29kZXIgKi8KLSAgICBpZiAoaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMmRU5DX01PREVfRkxBR19NRVRBKSB7Ci0gICAgICBpZiAoIEZES19NZXRhZGF0YUVuY19PcGVuKCZoQWFjRW5jb2Rlci0+aE1ldGFkYXRhRW5jKSApCi0gICAgICB7Ci0gICAgICAgIGVyciA9IEFBQ0VOQ19NRU1PUllfRVJST1I7CisgICAgaWYgKE5VTEwgPT0gKGhBYWNFbmNvZGVyLT5wU2JyUGF5bG9hZCA9IChTQlJFTkNfRVhUX1BBWUxPQUQgKilGREtjYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAxLCBzaXplb2YoU0JSRU5DX0VYVF9QQVlMT0FEKSkpKSB7CisgICAgICBlcnIgPSBBQUNFTkNfTUVNT1JZX0VSUk9SOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfSAvKiAoZW5jb2Rlcl9tb2RpcyZFTkNfTU9ERV9GTEFHX1NCUikgKi8KKworICAvKiBPcGVuIEFhYyBFbmNvZGVyICovCisgIGlmIChGREthYWNFbmNfT3BlbigmaEFhY0VuY29kZXItPmhBYWNFbmMsIGhBYWNFbmNvZGVyLT5uTWF4QWFjRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+bk1heEFhY0NoYW5uZWxzLCAoMSkpICE9IEFBQ19FTkNfT0spIHsKKyAgICBlcnIgPSBBQUNFTkNfTUVNT1JZX0VSUk9SOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIEJpdHN0cmVhbSBvdXRwdXQgYnVmZmVyICovCisgIGhBYWNFbmNvZGVyLT5vdXRCdWZmZXJJbkJ5dGVzID0KKyAgICAgIDEgPDwgKERGUkFDVF9CSVRTIC0gQ250TGVhZGluZ1plcm9zKGZpeE1heCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICgoMSkgKiBoQWFjRW5jb2Rlci0+bk1heEFhY0NoYW5uZWxzICogNjE0NCkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKSkpOyAvKiBidWZmZXIgaGFzIHRvIGJlIDJebiAqLworICBpZiAoTlVMTCA9PSAoaEFhY0VuY29kZXItPm91dEJ1ZmZlciA9IChVQ0hBUiAqKUZES2NhbGxvYygKKyAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+b3V0QnVmZmVySW5CeXRlcywgc2l6ZW9mKFVDSEFSKSkpKSB7CisgICAgZXJyID0gQUFDRU5DX01FTU9SWV9FUlJPUjsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICAvKiBPcGVuIE1ldGEgRGF0YSBFbmNvZGVyICovCisgIGlmIChoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyAmIEVOQ19NT0RFX0ZMQUdfTUVUQSkgeworICAgIGlmIChGREtfTWV0YWRhdGFFbmNfT3BlbigmaEFhY0VuY29kZXItPmhNZXRhZGF0YUVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQpaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVscykpIHsKKyAgICAgIGVyciA9IEFBQ0VOQ19NRU1PUllfRVJST1I7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICB9IC8qIChlbmNvZGVyX21vZGlzJkVOQ19NT0RFX0ZMQUdfTUVUQSkgKi8KKworICAvKiBPcGVuIE1QRUcgU3Vycm91bmQgRW5jb2RlciAqLworICBpZiAoaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMgJiBFTkNfTU9ERV9GTEFHX1NBQykgeworICAgIGlmIChNUFNfRU5DT0RFUl9PSyAhPSBGREtfTXBlZ3NFbmNfT3BlbigmaEFhY0VuY29kZXItPmhNcHNFbmMpKSB7CisgICAgICBlcnIgPSBBQUNFTkNfTUVNT1JZX0VSUk9SOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfSAvKiAoaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMmRU5DX01PREVfRkxBR19TQUMpICovCisKKyAgLyogT3BlbiBUcmFuc3BvcnQgRW5jb2RlciAqLworICBpZiAodHJhbnNwb3J0RW5jX09wZW4oJmhBYWNFbmNvZGVyLT5oVHBFbmMpICE9IDApIHsKKyAgICBlcnIgPSBBQUNFTkNfTUVNT1JZX0VSUk9SOworICAgIGdvdG8gYmFpbDsKKyAgfSBlbHNlIHsKKyAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoX3BMaWJJbmZvLCBMSUJfSU5GTywgRkRLX01PRFVMRV9MQVNUKQorCisgICAgTElCX0lORk8oKnBMaWJJbmZvKQorICAgIFtGREtfTU9EVUxFX0xBU1RdID0gKExJQl9JTkZPKCopW0ZES19NT0RVTEVfTEFTVF0pX3BMaWJJbmZvOworCisgICAgRkRLaW5pdExpYkluZm8oKnBMaWJJbmZvKTsKKyAgICB0cmFuc3BvcnRFbmNfR2V0TGliSW5mbygqcExpYkluZm8pOworCisgICAgLyogR2V0IGNhcGFiaWx0eSBmbGFnIGZvciB0cmFuc3BvcnQgZW5jb2Rlci4gKi8KKyAgICBoQWFjRW5jb2Rlci0+Q0FQRl90cEVuYyA9IEZES2xpYkluZm9fZ2V0Q2FwYWJpbGl0aWVzKCpwTGliSW5mbywgRkRLX1RQRU5DKTsKKworICAgIENfQUxMT0NfU0NSQVRDSF9FTkQoX3BMaWJJbmZvLCBMSUJfSU5GTywgRkRLX01PRFVMRV9MQVNUKQorICB9CisgIGlmICh0cmFuc3BvcnRFbmNfUmVnaXN0ZXJTYnJDYWxsYmFjayhoQWFjRW5jb2Rlci0+aFRwRW5jLCBhYWNlbmNfU2JyQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2RlcikgIT0gMCkgeworICAgIGVyciA9IEFBQ0VOQ19JTklUX1RQX0VSUk9SOworICAgIGdvdG8gYmFpbDsKKyAgfQorICBpZiAodHJhbnNwb3J0RW5jX1JlZ2lzdGVyU3NjQ2FsbGJhY2soaEFhY0VuY29kZXItPmhUcEVuYywgYWFjZW5jX1NzY0NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXIpICE9IDApIHsKKyAgICBlcnIgPSBBQUNFTkNfSU5JVF9UUF9FUlJPUjsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICAvKiBJbml0aWFsaXplIGVuY29kZXIgaW5zdGFuY2Ugd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMuICovCisgIGFhY0VuY0RlZmF1bHRDb25maWcoJmhBYWNFbmNvZGVyLT5hYWNDb25maWcsICZoQWFjRW5jb2Rlci0+ZXh0UGFyYW0pOworCisgIC8qIEluaXRpYWxpemUgaGVhZGVyUGVyaW9kIGluIGNvZGVyQ29uZmlnIGZvciBhYWNFbmNvZGVyX0dldFBhcmFtKCkuICovCisgIGhBYWNFbmNvZGVyLT5jb2RlckNvbmZpZy5oZWFkZXJQZXJpb2QgPQorICAgICAgaEFhY0VuY29kZXItPmV4dFBhcmFtLnVzZXJUcEhlYWRlclBlcmlvZDsKKworICAvKiBBbGwgZW5jb2RlciBtb2R1bGVzIGhhdmUgdG8gYmUgaW5pdGlhbGl6ZWQgKi8KKyAgaEFhY0VuY29kZXItPkluaXRGbGFncyA9IEFBQ0VOQ19JTklUX0FMTDsKKworICAvKiBSZXR1cm4gZW5jb2RlciBpbnN0YW5jZSAqLworICAqcGhBYWNFbmNvZGVyID0gaEFhY0VuY29kZXI7CisKKyAgcmV0dXJuIGVycjsKKworYmFpbDoKKyAgYWFjRW5jQ2xvc2UoJmhBYWNFbmNvZGVyKTsKKworICByZXR1cm4gZXJyOworfQorCitBQUNFTkNfRVJST1IgYWFjRW5jQ2xvc2UoSEFORExFX0FBQ0VOQ09ERVIgKnBoQWFjRW5jb2RlcikgeworICBBQUNFTkNfRVJST1IgZXJyID0gQUFDRU5DX09LOworCisgIGlmIChwaEFhY0VuY29kZXIgPT0gTlVMTCkgeworICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICBpZiAoKnBoQWFjRW5jb2RlciAhPSBOVUxMKSB7CisgICAgSEFORExFX0FBQ0VOQ09ERVIgaEFhY0VuY29kZXIgPSAqcGhBYWNFbmNvZGVyOworCisgICAgaWYgKGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICBGREtmcmVlKGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlcik7CisgICAgICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXIgPSBOVUxMOworICAgIH0KKyAgICBpZiAoaEFhY0VuY29kZXItPm91dEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICBGREtmcmVlKGhBYWNFbmNvZGVyLT5vdXRCdWZmZXIpOworICAgICAgaEFhY0VuY29kZXItPm91dEJ1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGhBYWNFbmNvZGVyLT5oRW52RW5jKSB7CisgICAgICBzYnJFbmNvZGVyX0Nsb3NlKCZoQWFjRW5jb2Rlci0+aEVudkVuYyk7CisgICAgfQorICAgIGlmIChoQWFjRW5jb2Rlci0+cFNiclBheWxvYWQgIT0gTlVMTCkgeworICAgICAgRkRLZnJlZShoQWFjRW5jb2Rlci0+cFNiclBheWxvYWQpOworICAgICAgaEFhY0VuY29kZXItPnBTYnJQYXlsb2FkID0gTlVMTDsKKyAgICB9CisgICAgaWYgKGhBYWNFbmNvZGVyLT5oQWFjRW5jKSB7CisgICAgICBGREthYWNFbmNfQ2xvc2UoJmhBYWNFbmNvZGVyLT5oQWFjRW5jKTsKKyAgICB9CisKKyAgICB0cmFuc3BvcnRFbmNfQ2xvc2UoJmhBYWNFbmNvZGVyLT5oVHBFbmMpOworCisgICAgaWYgKGhBYWNFbmNvZGVyLT5oTWV0YWRhdGFFbmMpIHsKKyAgICAgIEZES19NZXRhZGF0YUVuY19DbG9zZSgmaEFhY0VuY29kZXItPmhNZXRhZGF0YUVuYyk7CisgICAgfQorICAgIGlmIChoQWFjRW5jb2Rlci0+aE1wc0VuYykgeworICAgICAgRkRLX01wZWdzRW5jX0Nsb3NlKCZoQWFjRW5jb2Rlci0+aE1wc0VuYyk7CisgICAgfQorCisgICAgRnJlZV9BYWNFbmNvZGVyKHBoQWFjRW5jb2Rlcik7CisgIH0KKworYmFpbDoKKyAgcmV0dXJuIGVycjsKK30KKworQUFDRU5DX0VSUk9SIGFhY0VuY0VuY29kZShjb25zdCBIQU5ETEVfQUFDRU5DT0RFUiBoQWFjRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFDRU5DX0J1ZkRlc2MgKmluQnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFDRU5DX0J1ZkRlc2MgKm91dEJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFBQ0VOQ19JbkFyZ3MgKmluYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDRU5DX091dEFyZ3MgKm91dGFyZ3MpIHsKKyAgQUFDRU5DX0VSUk9SIGVyciA9IEFBQ0VOQ19PSzsKKyAgSU5UIGksIG5Cc0J5dGVzID0gMDsKKyAgSU5UIG91dEJ5dGVzWygxKV07CisgIGludCBuRXh0ZW5zaW9ucyA9IDA7CisgIGludCBhbmNEYXRhRXh0SWR4ID0gLTE7CisKKyAgLyogZGVhbCB3aXRoIHZhbGlkIGVuY29kZXIgaGFuZGxlICovCisgIGlmIChoQWFjRW5jb2RlciA9PSBOVUxMKSB7CisgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfSEFORExFOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qCisgICAqIEFkanVzdCB1c2VyIHNldHRpbmdzIGFuZCB0cmlnZ2VyIHJlaW5pdGlhbGl6YXRpb24uCisgICAqLworICBpZiAoaEFhY0VuY29kZXItPkluaXRGbGFncyAhPSAwKSB7CisgICAgZXJyID0KKyAgICAgICAgYWFjRW5jSW5pdChoQWFjRW5jb2RlciwgaEFhY0VuY29kZXItPkluaXRGbGFncywgJmhBYWNFbmNvZGVyLT5leHRQYXJhbSk7CisKKyAgICBpZiAoZXJyICE9IEFBQ0VOQ19PSykgeworICAgICAgLyoga2VlcCBpbml0IGZsYWdzIGFsaXZlISAqLworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzID0gQUFDRU5DX0lOSVRfTk9ORTsKKyAgfQorCisgIGlmIChvdXRhcmdzICE9IE5VTEwpIHsKKyAgICBGREttZW1jbGVhcihvdXRhcmdzLCBzaXplb2YoQUFDRU5DX091dEFyZ3MpKTsKKyAgfQorCisgIGlmIChvdXRCdWZEZXNjICE9IE5VTEwpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgb3V0QnVmRGVzYy0+bnVtQnVmczsgaSsrKSB7CisgICAgICBpZiAob3V0QnVmRGVzYy0+YnVmc1tpXSAhPSBOVUxMKSB7CisgICAgICAgIEZES21lbWNsZWFyKG91dEJ1ZkRlc2MtPmJ1ZnNbaV0sIG91dEJ1ZkRlc2MtPmJ1ZlNpemVzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKgorICAgKiBJZiBvbmx5IGVuY29kZXIgaGFuZGxlIGdpdmVuLCBpbmRlcGVuZGVudCAocmUpaW5pdGlhbGl6YXRpb24gY2FuIGJlCisgICAqIHRyaWdnZXJlZC4KKyAgICovCisgIGlmICgoaW5CdWZEZXNjID09IE5VTEwpICYmIChvdXRCdWZEZXNjID09IE5VTEwpICYmIChpbmFyZ3MgPT0gTlVMTCkgJiYKKyAgICAgIChvdXRhcmdzID09IE5VTEwpKSB7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogY2hlY2sgaWYgYnVmZmVyIGRlc2NyaXB0b3JzIGFyZSBmaWxsZWQgb3V0IHByb3Blcmx5LiAqLworICBpZiAoKEFBQ0VOQ19PSyAhPSB2YWxpZGF0ZUJ1ZkRlc2MoaW5CdWZEZXNjKSkgfHwKKyAgICAgIChBQUNFTkNfT0sgIT0gdmFsaWRhdGVCdWZEZXNjKG91dEJ1ZkRlc2MpKSB8fCAoaW5hcmdzID09IE5VTEwpIHx8CisgICAgICAob3V0YXJncyA9PSBOVUxMKSkgeworICAgIGVyciA9IEFBQ0VOQ19VTlNVUFBPUlRFRF9QQVJBTUVURVI7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogcmVzZXQgYnVmZmVyIHdpY2ggc2lnbmFscyBudW1iZXIgb2YgdmFsaWQgYnl0ZXMgaW4gb3V0cHV0IGJpdHN0cmVhbSBidWZmZXIKKyAgICovCisgIEZES21lbWNsZWFyKG91dEJ5dGVzLCBoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLm5TdWJGcmFtZXMgKiBzaXplb2YoSU5UKSk7CisKKyAgLyoKKyAgICogTWFuYWdlIGluY29taW5nIGF1ZGlvIHNhbXBsZXMuCisgICAqLworICBpZiAoKGluQnVmRGVzYyAhPSBOVUxMKSAmJiAoaW5hcmdzLT5udW1JblNhbXBsZXMgPiAwKSAmJgorICAgICAgKGdldEJ1ZkRlc2NJZHgoaW5CdWZEZXNjLCBJTl9BVURJT19EQVRBKSAhPSAtMSkpIHsKKyAgICAvKiBGZXRjaCBkYXRhIHVudGlsIG5TYW1wbGVzVG9SZWFkIHJlYWNoZWQgKi8KKyAgICBJTlQgaWR4ID0gZ2V0QnVmRGVzY0lkeChpbkJ1ZkRlc2MsIElOX0FVRElPX0RBVEEpOworICAgIElOVCBuZXdTYW1wbGVzID0KKyAgICAgICAgZml4TWF4KDAsIGZpeE1pbihpbmFyZ3MtPm51bUluU2FtcGxlcywgaEFhY0VuY29kZXItPm5TYW1wbGVzVG9SZWFkIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQpKTsKKyAgICBJTlRfUENNICpwSW4gPQorICAgICAgICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXIgKworICAgICAgICAoaEFhY0VuY29kZXItPmlucHV0QnVmZmVyT2Zmc2V0ICsgaEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZCkgLworICAgICAgICAgICAgaEFhY0VuY29kZXItPmFhY0NvbmZpZy5uQ2hhbm5lbHM7CisKKyAgICAvKiBDb3B5IG5ldyBpbnB1dCBzYW1wbGVzIHRvIGludGVybmFsIGJ1ZmZlciAqLworICAgIGlmIChpbkJ1ZkRlc2MtPmJ1ZkVsU2l6ZXNbaWR4XSA9PSAoSU5UKXNpemVvZihJTlRfUENNKSkgeworICAgICAgRkRLX2RlaW50ZXJsZWF2ZSgoSU5UX1BDTSAqKWluQnVmRGVzYy0+YnVmc1tpZHhdLCBwSW4sCisgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXJhbS5uQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgIG5ld1NhbXBsZXMgLyBoQWFjRW5jb2Rlci0+ZXh0UGFyYW0ubkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbCk7CisgICAgfSBlbHNlIGlmIChpbkJ1ZkRlc2MtPmJ1ZkVsU2l6ZXNbaWR4XSA+IChJTlQpc2l6ZW9mKElOVF9QQ00pKSB7CisgICAgICBGREtfZGVpbnRlcmxlYXZlKChMT05HICopaW5CdWZEZXNjLT5idWZzW2lkeF0sIHBJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmV4dFBhcmFtLm5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3U2FtcGxlcyAvIGhBYWNFbmNvZGVyLT5leHRQYXJhbS5uQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlclNpemVQZXJDaGFubmVsKTsKKyAgICB9IGVsc2UgeworICAgICAgRkRLX2RlaW50ZXJsZWF2ZSgoU0hPUlQgKilpbkJ1ZkRlc2MtPmJ1ZnNbaWR4XSwgcEluLAorICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGFyYW0ubkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICBuZXdTYW1wbGVzIC8gaEFhY0VuY29kZXItPmV4dFBhcmFtLm5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyU2l6ZVBlckNoYW5uZWwpOworICAgIH0KKyAgICBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkICs9IG5ld1NhbXBsZXM7CisKKyAgICAvKiBOdW1iZXIgb2YgZmV0Y2hlZCBpbnB1dCBidWZmZXIgc2FtcGxlcy4gKi8KKyAgICBvdXRhcmdzLT5udW1JblNhbXBsZXMgPSBuZXdTYW1wbGVzOworICB9CisKKyAgLyogaW5wdXQgYnVmZmVyIGNvbXBsZXRlbHkgZmlsbGVkID8gKi8KKyAgaWYgKGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQgPCBoQWFjRW5jb2Rlci0+blNhbXBsZXNUb1JlYWQpIHsKKyAgICAvKiAtIGVvZiByZWFjaGVkIGFuZCBmbHVzaGluZyBlbmFibGVkLCBvcgorICAgICAgIC0gcmV0dXJuIHRvIG1haW4gYW5kIHdhaXQgZm9yIGZ1cnRoZXIgaW5jb21pbmcgYXVkaW8gc2FtcGxlcyAqLworICAgIGlmIChpbmFyZ3MtPm51bUluU2FtcGxlcyA9PSAtMSkgeworICAgICAgaWYgKChoQWFjRW5jb2Rlci0+blplcm9zQXBwZW5kZWQgPCBoQWFjRW5jb2Rlci0+bkRlbGF5KSkgeworICAgICAgICBpbnQgblplcm9zID0gKGhBYWNFbmNvZGVyLT5uU2FtcGxlc1RvUmVhZCAtIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQpIC8KKyAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXJhbS5uQ2hhbm5lbHM7CisKKyAgICAgICAgRkRLX0FTU0VSVChuWmVyb3MgPj0gMCk7CisKKyAgICAgICAgLyogY2xlYXIgb3V0IHVudGlsIGVuZC1vZi1idWZmZXIgKi8KKyAgICAgICAgaWYgKG5aZXJvcykgeworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KWhBYWNFbmNvZGVyLT5leHRQYXJhbS5uQ2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgRkRLbWVtY2xlYXIoaEFhY0VuY29kZXItPmlucHV0QnVmZmVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICogaEFhY0VuY29kZXItPmlucHV0QnVmZmVyU2l6ZVBlckNoYW5uZWwgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXJPZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXJhbS5uQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSU5UX1BDTSkgKiBuWmVyb3MpOworICAgICAgICAgIH0KKyAgICAgICAgICBoQWFjRW5jb2Rlci0+blplcm9zQXBwZW5kZWQgKz0gblplcm9zOworICAgICAgICAgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQgPSBoQWFjRW5jb2Rlci0+blNhbXBsZXNUb1JlYWQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgIC8qIGZsdXNoaW5nIGNvbXBsZXRlZCAqLworICAgICAgICBlcnIgPSBBQUNFTkNfRU5DT0RFX0VPRjsgLyogZW9mIHJlYWNoZWQgKi8KICAgICAgICAgZ290byBiYWlsOwogICAgICAgfQotICAgIH0gLyogKGVuY29kZXJfbW9kaXMmRU5DX01PREVfRkxBR19NRVRBKSAqLwotCi0gICAgLyogT3BlbiBUcmFuc3BvcnQgRW5jb2RlciAqLwotICAgIGlmICggdHJhbnNwb3J0RW5jX09wZW4oJmhBYWNFbmNvZGVyLT5oVHBFbmMpICE9IDAgKQotICAgIHsKLSAgICAgICAgZXJyID0gQUFDRU5DX01FTU9SWV9FUlJPUjsKLSAgICAgICAgZ290byBiYWlsOworICAgIH0gZWxzZSB7ICAgICAvKiBpbmFyZ3MtPm51bUluU2FtcGxlcyE9IC0xICovCisgICAgICBnb3RvIGJhaWw7IC8qIG5vdCBlbm91Z2ggc2FtcGxlcyBpbiBpbnB1dCBidWZmZXIgYW5kIG5vIGZsdXNoaW5nIGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICovCiAgICAgfQotICAgIGVsc2UgewotICAgICAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocExpYkluZm8sIExJQl9JTkZPLCBGREtfTU9EVUxFX0xBU1QpOworICB9CiAKLSAgICAgICAgRkRLaW5pdExpYkluZm8oIHBMaWJJbmZvKTsKLSAgICAgICAgdHJhbnNwb3J0RW5jX0dldExpYkluZm8oIHBMaWJJbmZvICk7CisgIC8qIGluaXQgcGF5bG9hZCAqLworICBGREttZW1jbGVhcihoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZCwKKyAgICAgICAgICAgICAgc2l6ZW9mKEFBQ0VOQ19FWFRfUEFZTE9BRCkgKiBNQVhfVE9UQUxfRVhUX1BBWUxPQURTKTsKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9UT1RBTF9FWFRfUEFZTE9BRFM7IGkrKykgeworICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW2ldLmFzc29jaWF0ZWRDaEVsZW1lbnQgPSAtMTsKKyAgfQorICBpZiAoaEFhY0VuY29kZXItPnBTYnJQYXlsb2FkICE9IE5VTEwpIHsKKyAgICBGREttZW1jbGVhcihoQWFjRW5jb2Rlci0+cFNiclBheWxvYWQsIHNpemVvZigqaEFhY0VuY29kZXItPnBTYnJQYXlsb2FkKSk7CisgIH0KIAotICAgICAgICAvKiBHZXQgY2FwYWJpbHR5IGZsYWcgZm9yIHRyYW5zcG9ydCBlbmNvZGVyLiAqLwotICAgICAgICBoQWFjRW5jb2Rlci0+Q0FQRl90cEVuYyA9IEZES2xpYkluZm9fZ2V0Q2FwYWJpbGl0aWVzKCBwTGliSW5mbywgRkRLX1RQRU5DKTsKKyAgLyoKKyAgICogQ2FsY3VsYXRlIE1ldGEgRGF0YSBpbmZvLgorICAgKi8KKyAgaWYgKChoQWFjRW5jb2Rlci0+aE1ldGFkYXRhRW5jICE9IE5VTEwpICYmCisgICAgICAoaEFhY0VuY29kZXItPm1ldGFEYXRhQWxsb3dlZCAhPSAwKSkgeworICAgIGNvbnN0IEFBQ0VOQ19NZXRhRGF0YSAqcE1ldGFEYXRhID0gTlVMTDsKKyAgICBBQUNFTkNfRVhUX1BBWUxPQUQgKnBNZXRhRGF0YUV4dFBheWxvYWQgPSBOVUxMOworICAgIFVJTlQgbk1ldGFEYXRhRXh0ZW5zaW9ucyA9IDA7CisgICAgSU5UIG1hdHJpeF9taXhkb3duX2lkeCA9IDA7CiAKLSAgICAgICAgQ19BTExPQ19TQ1JBVENIX0VORChwTGliSW5mbywgTElCX0lORk8sIEZES19NT0RVTEVfTEFTVCk7CisgICAgLyogTmV3IG1ldGEgZGF0YSBpbmZvIGF2YWlsYWJsZSA/ICovCisgICAgaWYgKGdldEJ1ZkRlc2NJZHgoaW5CdWZEZXNjLCBJTl9NRVRBREFUQV9TRVRVUCkgIT0gLTEpIHsKKyAgICAgIHBNZXRhRGF0YSA9CisgICAgICAgICAgKEFBQ0VOQ19NZXRhRGF0YSAqKQorICAgICAgICAgICAgICBpbkJ1ZkRlc2MtPmJ1ZnNbZ2V0QnVmRGVzY0lkeChpbkJ1ZkRlc2MsIElOX01FVEFEQVRBX1NFVFVQKV07CiAgICAgfQotICAgIGlmICggdHJhbnNwb3J0RW5jX1JlZ2lzdGVyU2JyQ2FsbGJhY2soaEFhY0VuY29kZXItPmhUcEVuYywgYWFjZW5jX1NickNhbGxiYWNrLCBoQWFjRW5jb2RlcikgIT0gMCApIHsKLSAgICAgIGVyciA9IEFBQ0VOQ19JTklUX1RQX0VSUk9SOworCisgICAgRkRLX01ldGFkYXRhRW5jX1Byb2Nlc3MoCisgICAgICAgIGhBYWNFbmNvZGVyLT5oTWV0YWRhdGFFbmMsCisgICAgICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlciArIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlck9mZnNldCAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+Y29kZXJDb25maWcubm9DaGFubmVscywKKyAgICAgICAgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyU2l6ZVBlckNoYW5uZWwsIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQsCisgICAgICAgIHBNZXRhRGF0YSwgJnBNZXRhRGF0YUV4dFBheWxvYWQsICZuTWV0YURhdGFFeHRlbnNpb25zLAorICAgICAgICAmbWF0cml4X21peGRvd25faWR4KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAoSU5UKW5NZXRhRGF0YUV4dGVuc2lvbnM7CisgICAgICAgICBpKyspIHsgLyogR2V0IG1ldGEgZGF0YSBleHRlbnNpb24gcGF5bG9hZC4gKi8KKyAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW25FeHRlbnNpb25zKytdID0gcE1ldGFEYXRhRXh0UGF5bG9hZFtpXTsKKyAgICB9CisKKyAgICBpZiAoKG1hdHJpeF9taXhkb3duX2lkeCAhPSAtMSkgJiYKKyAgICAgICAgKChoQWFjRW5jb2Rlci0+ZXh0UGFyYW0udXNlckNoYW5uZWxNb2RlID09IE1PREVfMV8yXzIpIHx8CisgICAgICAgICAoaEFhY0VuY29kZXItPmV4dFBhcmFtLnVzZXJDaGFubmVsTW9kZSA9PSBNT0RFXzFfMl8yXzEpKSkgeworICAgICAgLyogU2V0IG1hdHJpeCBtaXhkb3duIGNvZWZmaWNpZW50LiAqLworICAgICAgVUlOVCBwY2VWYWx1ZSA9IChVSU5UKSgoMCA8PCAzKSB8ICgobWF0cml4X21peGRvd25faWR4ICYgMHgzKSA8PCAxKSB8IDEpOworICAgICAgaWYgKGhBYWNFbmNvZGVyLT5leHRQYXJhbS51c2VyUGNlQWRkaXRpb25zICE9IHBjZVZhbHVlKSB7CisgICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXJhbS51c2VyUGNlQWRkaXRpb25zID0gcGNlVmFsdWU7CisgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qCisgICAqIEVuY29kZSBNUFMgZGF0YS4KKyAgICovCisgIGlmICgoaEFhY0VuY29kZXItPmhNcHNFbmMgIT0gTlVMTCkgJiYKKyAgICAgIChoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLnN5bnRheEZsYWdzICYgQUNfTERfTVBTKSkgeworICAgIEFBQ0VOQ19FWFRfUEFZTE9BRCBtcHNFeHRlbnNpb25QYXlsb2FkOworICAgIEZES21lbWNsZWFyKCZtcHNFeHRlbnNpb25QYXlsb2FkLCBzaXplb2YoQUFDRU5DX0VYVF9QQVlMT0FEKSk7CisKKyAgICBpZiAoTVBTX0VOQ09ERVJfT0sgIT0KKyAgICAgICAgRkRLX01wZWdzRW5jX1Byb2Nlc3MoCisgICAgICAgICAgICBoQWFjRW5jb2Rlci0+aE1wc0VuYywKKyAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlciArIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlck9mZnNldCAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmNvZGVyQ29uZmlnLm5vQ2hhbm5lbHMsCisgICAgICAgICAgICBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkLCAmbXBzRXh0ZW5zaW9uUGF5bG9hZCkpIHsKKyAgICAgIGVyciA9IEFBQ0VOQ19FTkNPREVfRVJST1I7CiAgICAgICBnb3RvIGJhaWw7CiAgICAgfQogCi0gICAgLyogSW5pdGlhbGl6ZSBlbmNvZGVyIGluc3RhbmNlIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzLiAqLwotICAgIGFhY0VuY0RlZmF1bHRDb25maWcoJmhBYWNFbmNvZGVyLT5hYWNDb25maWcsICZoQWFjRW5jb2Rlci0+ZXh0UGFyYW0pOwotCi0gICAgLyogSW5pdGlhbGl6ZSBoZWFkZXJQZXJpb2QgaW4gY29kZXJDb25maWcgZm9yIGFhY0VuY29kZXJfR2V0UGFyYW0oKS4gKi8KLSAgICBoQWFjRW5jb2Rlci0+Y29kZXJDb25maWcuaGVhZGVyUGVyaW9kID0gaEFhY0VuY29kZXItPmV4dFBhcmFtLnVzZXJUcEhlYWRlclBlcmlvZDsKLQotICAgIC8qIEFsbCBlbmNvZGVyIG1vZHVsZXMgaGF2ZSB0byBiZSBpbml0aWFsaXplZCAqLwotICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgPSBBQUNFTkNfSU5JVF9BTEw7Ci0KLSAgICAvKiBSZXR1cm4gZW5jb2RlciBpbnN0YW5jZSAqLwotICAgICpwaEFhY0VuY29kZXIgPSBoQWFjRW5jb2RlcjsKLQotICAgIHJldHVybiBlcnI7Ci0KLWJhaWw6Ci0gICAgYWFjRW5jQ2xvc2UoJmhBYWNFbmNvZGVyKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotCi1BQUNFTkNfRVJST1IgYWFjRW5jQ2xvc2UoSEFORExFX0FBQ0VOQ09ERVIgKnBoQWFjRW5jb2RlcikKLXsKLSAgICBBQUNFTkNfRVJST1IgZXJyID0gQUFDRU5DX09LOwotCi0gICAgaWYgKHBoQWFjRW5jb2RlciA9PSBOVUxMKSB7Ci0gICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0hBTkRMRTsKLSAgICAgICAgZ290byBiYWlsOworICAgIGlmICgobXBzRXh0ZW5zaW9uUGF5bG9hZC5wRGF0YSAhPSBOVUxMKSAmJgorICAgICAgICAoKG1wc0V4dGVuc2lvblBheWxvYWQuZGF0YVNpemUgIT0gMCkpKSB7CisgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFtuRXh0ZW5zaW9ucysrXSA9IG1wc0V4dGVuc2lvblBheWxvYWQ7CiAgICAgfQorICB9CiAKLSAgICBpZiAoKnBoQWFjRW5jb2RlciAhPSBOVUxMKSB7Ci0gICAgICAgIEhBTkRMRV9BQUNFTkNPREVSIGhBYWNFbmNvZGVyID0gKnBoQWFjRW5jb2RlcjsKLQotCi0gICAgICAgaWYgKGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlciE9TlVMTCkgewotICAgICAgICAgICBGREtmcmVlKGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlcik7Ci0gICAgICAgICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgfQotCi0gICAgICAgaWYgKGhBYWNFbmNvZGVyLT5vdXRCdWZmZXIpIHsKLSAgICAgICAgIEZyZWVSYW1fYnNPdXRidWZmZXIoJmhBYWNFbmNvZGVyLT5vdXRCdWZmZXIpOwotICAgICAgIH0KLQotICAgICAgICBpZiAoaEFhY0VuY29kZXItPmhFbnZFbmMpIHsKLSAgICAgICAgICAgIHNickVuY29kZXJfQ2xvc2UgKCZoQWFjRW5jb2Rlci0+aEVudkVuYyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhBYWNFbmNvZGVyLT5oQWFjRW5jKSB7Ci0gICAgICAgICAgICBGREthYWNFbmNfQ2xvc2UgKCZoQWFjRW5jb2Rlci0+aEFhY0VuYyk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cmFuc3BvcnRFbmNfQ2xvc2UoJmhBYWNFbmNvZGVyLT5oVHBFbmMpOwotCi0gICAgICAgIGlmIChoQWFjRW5jb2Rlci0+aE1ldGFkYXRhRW5jKSB7Ci0gICAgICAgICAgICBGREtfTWV0YWRhdGFFbmNfQ2xvc2UgKCZoQWFjRW5jb2Rlci0+aE1ldGFkYXRhRW5jKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZyZWVfQWFjRW5jb2RlcihwaEFhY0VuY29kZXIpOwotICAgIH0KLQotYmFpbDoKLSAgICByZXR1cm4gZXJyOwotfQotCi1BQUNFTkNfRVJST1IgYWFjRW5jRW5jb2RlKAotICAgICAgICBjb25zdCBIQU5ETEVfQUFDRU5DT0RFUiAgIGhBYWNFbmNvZGVyLAotICAgICAgICBjb25zdCBBQUNFTkNfQnVmRGVzYyAgICAgKmluQnVmRGVzYywKLSAgICAgICAgY29uc3QgQUFDRU5DX0J1ZkRlc2MgICAgICpvdXRCdWZEZXNjLAotICAgICAgICBjb25zdCBBQUNFTkNfSW5BcmdzICAgICAgKmluYXJncywKLSAgICAgICAgQUFDRU5DX091dEFyZ3MgICAgICAgICAgICpvdXRhcmdzCi0gICAgICAgICkKLXsKLSAgICBBQUNFTkNfRVJST1IgZXJyID0gQUFDRU5DX09LOwotICAgIElOVCBpLCBuQnNCeXRlcyA9IDA7Ci0gICAgSU5UICBvdXRCeXRlc1soMSldOwotICAgIGludCAgbkV4dGVuc2lvbnMgPSAwOwotICAgIGludCAgYW5jRGF0YUV4dElkeCA9IC0xOwotCi0gICAgLyogZGVhbCB3aXRoIHZhbGlkIGVuY29kZXIgaGFuZGxlICovCi0gICAgaWYgKGhBYWNFbmNvZGVyPT1OVUxMKSB7Ci0gICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0hBTkRMRTsKLSAgICAgICAgZ290byBiYWlsOwotICAgIH0KLQorICBpZiAoKE5VTEwgIT0gaEFhY0VuY29kZXItPmhFbnZFbmMpICYmIChOVUxMICE9IGhBYWNFbmNvZGVyLT5wU2JyUGF5bG9hZCkgJiYKKyAgICAgIGlzU2JyQWN0aXZlKCZoQWFjRW5jb2Rlci0+YWFjQ29uZmlnKSkgeworICAgIElOVCBuUGF5bG9hZCA9IDA7CiAKICAgICAvKgotICAgICAqIEFkanVzdCB1c2VyIHNldHRpbmdzIGFuZCB0cmlnZ2VyIHJlaW5pdGlhbGl6YXRpb24uCisgICAgICogRW5jb2RlIFNCUiBkYXRhLgogICAgICAqLwotICAgIGlmIChoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIT0wKSB7Ci0KLSAgICAgICAgZXJyID0gYWFjRW5jSW5pdChoQWFjRW5jb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgJmhBYWNFbmNvZGVyLT5leHRQYXJhbSk7Ci0KLSAgICAgICAgaWYgKGVyciE9QUFDRU5DX09LKSB7Ci0gICAgICAgICAgICAvKiBrZWVwIGluaXQgZmxhZ3MgYWxpdmUhICovCi0gICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgaWYgKHNickVuY29kZXJfRW5jb2RlRnJhbWUoaEFhY0VuY29kZXItPmhFbnZFbmMsIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+cFNiclBheWxvYWQtPmRhdGFTaXplW25QYXlsb2FkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+cFNiclBheWxvYWQtPmRhdGFbblBheWxvYWRdKSkgeworICAgICAgZXJyID0gQUFDRU5DX0VOQ09ERV9FUlJPUjsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9IGVsc2UgeworICAgICAgLyogQWRkIFNCUiBleHRlbnNpb24gcGF5bG9hZCAqLworICAgICAgZm9yIChpID0gMDsgaSA8ICg4KTsgaSsrKSB7CisgICAgICAgIGlmIChoQWFjRW5jb2Rlci0+cFNiclBheWxvYWQtPmRhdGFTaXplW25QYXlsb2FkXVtpXSA+IDApIHsKKyAgICAgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFtuRXh0ZW5zaW9uc10ucERhdGEgPQorICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+cFNiclBheWxvYWQtPmRhdGFbblBheWxvYWRdW2ldOworICAgICAgICAgIHsKKyAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW25FeHRlbnNpb25zXS5kYXRhU2l6ZSA9CisgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPnBTYnJQYXlsb2FkLT5kYXRhU2l6ZVtuUGF5bG9hZF1baV07CisgICAgICAgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFtuRXh0ZW5zaW9uc10uYXNzb2NpYXRlZENoRWxlbWVudCA9IGk7CisgICAgICAgICAgfQorICAgICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW25FeHRlbnNpb25zXS5kYXRhVHlwZSA9CisgICAgICAgICAgICAgIEVYVF9TQlJfREFUQTsgLyogT25jZSBTQlIgRW5jb2RlciBzdXBwb3J0cyBTQlIgQ1JDIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVF9TQlJfREFUQV9DUkMgKi8KKyAgICAgICAgICBuRXh0ZW5zaW9ucysrOyAgICAvKiBvciBFWFRfU0JSX0RBVEEgYWNjb3JkaW5nIHRvIGNvbmZpZ3VyYXRpb24uICovCisgICAgICAgICAgRkRLX0FTU0VSVChuRXh0ZW5zaW9ucyA8PSBNQVhfVE9UQUxfRVhUX1BBWUxPQURTKTsKICAgICAgICAgfQotICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzID0gQUFDRU5DX0lOSVRfTk9ORTsKKyAgICAgIH0KKyAgICAgIG5QYXlsb2FkKys7CiAgICAgfQorICB9IC8qIHNickVuYWJsZWQgKi8KIAotICAgIGlmIChvdXRhcmdzIT1OVUxMKSB7Ci0gICAgICAgIEZES21lbWNsZWFyKG91dGFyZ3MsIHNpemVvZihBQUNFTkNfT3V0QXJncykpOwotICAgIH0KKyAgaWYgKChpbmFyZ3MtPm51bUFuY0J5dGVzID4gMCkgJiYKKyAgICAgIChnZXRCdWZEZXNjSWR4KGluQnVmRGVzYywgSU5fQU5DSUxMUllfREFUQSkgIT0gLTEpKSB7CisgICAgSU5UIGlkeCA9IGdldEJ1ZkRlc2NJZHgoaW5CdWZEZXNjLCBJTl9BTkNJTExSWV9EQVRBKTsKKyAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFtuRXh0ZW5zaW9uc10uZGF0YVNpemUgPSBpbmFyZ3MtPm51bUFuY0J5dGVzICogODsKKyAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFtuRXh0ZW5zaW9uc10ucERhdGEgPSAoVUNIQVIgKilpbkJ1ZkRlc2MtPmJ1ZnNbaWR4XTsKKyAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFtuRXh0ZW5zaW9uc10uZGF0YVR5cGUgPSBFWFRfREFUQV9FTEVNRU5UOworICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW25FeHRlbnNpb25zXS5hc3NvY2lhdGVkQ2hFbGVtZW50ID0gLTE7CisgICAgYW5jRGF0YUV4dElkeCA9IG5FeHRlbnNpb25zOyAvKiBzdG9yZSBpbmRleCAqLworICAgIG5FeHRlbnNpb25zKys7CisgIH0KIAotICAgIGlmIChvdXRCdWZEZXNjIT1OVUxMKSB7Ci0gICAgICBmb3IgKGk9MDsgaTxvdXRCdWZEZXNjLT5udW1CdWZzOyBpKyspIHsKLSAgICAgICAgaWYgKG91dEJ1ZkRlc2MtPmJ1ZnNbaV0hPU5VTEwpIHsKLSAgICAgICAgICBGREttZW1jbGVhcihvdXRCdWZEZXNjLT5idWZzW2ldLCBvdXRCdWZEZXNjLT5idWZTaXplc1tpXSk7Ci0gICAgICAgIH0KKyAgLyoKKyAgICogRW5jb2RlIEFBQyAtIENvcmUuCisgICAqLworICBpZiAoRkRLYWFjRW5jX0VuY29kZUZyYW1lKGhBYWNFbmNvZGVyLT5oQWFjRW5jLCBoQWFjRW5jb2Rlci0+aFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbCwgb3V0Qnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmV4dFBheWxvYWQpICE9IEFBQ19FTkNfT0spIHsKKyAgICBlcnIgPSBBQUNFTkNfRU5DT0RFX0VSUk9SOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIGlmIChhbmNEYXRhRXh0SWR4ID49IDApIHsKKyAgICBvdXRhcmdzLT5udW1BbmNCeXRlcyA9CisgICAgICAgIGluYXJncy0+bnVtQW5jQnl0ZXMgLQorICAgICAgICAoaEFhY0VuY29kZXItPmV4dFBheWxvYWRbYW5jRGF0YUV4dElkeF0uZGF0YVNpemUgPj4gMyk7CisgIH0KKworICAvKiBzYW1wbGVzIGV4aGF1c3RlZCAqLworICBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkIC09IGhBYWNFbmNvZGVyLT5uU2FtcGxlc1RvUmVhZDsKKworICAvKgorICAgKiBEZWxheSBiYWxhbmNpbmcgYnVmZmVyIGhhbmRsaW5nCisgICAqLworICBpZiAoaXNTYnJBY3RpdmUoJmhBYWNFbmNvZGVyLT5hYWNDb25maWcpKSB7CisgICAgc2JyRW5jb2Rlcl9VcGRhdGVCdWZmZXJzKGhBYWNFbmNvZGVyLT5oRW52RW5jLCBoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlclNpemVQZXJDaGFubmVsKTsKKyAgfQorCisgIC8qCisgICAqIE1ha2UgYml0c3RyZWFtIHB1YmxpYworICAgKi8KKyAgaWYgKChvdXRCdWZEZXNjICE9IE5VTEwpICYmIChvdXRCdWZEZXNjLT5udW1CdWZzID49IDEpKSB7CisgICAgSU5UIGJzSWR4ID0gZ2V0QnVmRGVzY0lkeChvdXRCdWZEZXNjLCBPVVRfQklUU1RSRUFNX0RBVEEpOworICAgIElOVCBhdUlkeCA9IGdldEJ1ZkRlc2NJZHgob3V0QnVmRGVzYywgT1VUX0FVX1NJWkVTKTsKKworICAgIGZvciAoaSA9IDAsIG5Cc0J5dGVzID0gMDsgaSA8IGhBYWNFbmNvZGVyLT5hYWNDb25maWcublN1YkZyYW1lczsgaSsrKSB7CisgICAgICBuQnNCeXRlcyArPSBvdXRCeXRlc1tpXTsKKworICAgICAgaWYgKGF1SWR4ICE9IC0xKSB7CisgICAgICAgICgoSU5UICopb3V0QnVmRGVzYy0+YnVmc1thdUlkeF0pW2ldID0gb3V0Qnl0ZXNbaV07CiAgICAgICB9CiAgICAgfQogCi0gICAgLyoKLSAgICAgKiBJZiBvbmx5IGVuY29kZXIgaGFuZGxlIGdpdmVuLCBpbmRlcGVuZGVudCAocmUpaW5pdGlhbGl6YXRpb24gY2FuIGJlIHRyaWdnZXJlZC4KLSAgICAgKi8KLSAgICBpZiAoIChoQWFjRW5jb2RlciE9TlVMTCkgJiAoaW5CdWZEZXNjPT1OVUxMKSAmJiAob3V0QnVmRGVzYz09TlVMTCkgJiYgKGluYXJncz09TlVMTCkgJiYgKG91dGFyZ3M9PU5VTEwpICkgewotICAgICAgICBnb3RvIGJhaWw7CisgICAgaWYgKChic0lkeCAhPSAtMSkgJiYgKG91dEJ1ZkRlc2MtPmJ1ZlNpemVzW2JzSWR4XSA+PSBuQnNCeXRlcykpIHsKKyAgICAgIEZES21lbWNweShvdXRCdWZEZXNjLT5idWZzW2JzSWR4XSwgaEFhY0VuY29kZXItPm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICBzaXplb2YoVUNIQVIpICogbkJzQnl0ZXMpOworICAgICAgb3V0YXJncy0+bnVtT3V0Qnl0ZXMgPSBuQnNCeXRlczsKKyAgICAgIG91dGFyZ3MtPmJpdFJlc1N0YXRlID0KKyAgICAgICAgICBGREthYWNFbmNfR2V0Qml0UmVzZXJ2b2lyU3RhdGUoaEFhY0VuY29kZXItPmhBYWNFbmMpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBvdXRwdXQgYnVmZmVyIHRvbyBzbWFsbCwgY2FuJ3Qgd3JpdGUgdmFsaWQgYml0c3RyZWFtICovCisgICAgICBlcnIgPSBBQUNFTkNfRU5DT0RFX0VSUk9SOworICAgICAgZ290byBiYWlsOwogICAgIH0KLQotICAgIC8qIHJlc2V0IGJ1ZmZlciB3aWNoIHNpZ25hbHMgbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGluIG91dHB1dCBiaXRzdHJlYW0gYnVmZmVyICovCi0gICAgRkRLbWVtY2xlYXIob3V0Qnl0ZXMsIGhBYWNFbmNvZGVyLT5hYWNDb25maWcublN1YkZyYW1lcypzaXplb2YoSU5UKSk7Ci0KLSAgICAvKgotICAgICAqIE1hbmFnZSBpbmNvbWluZyBhdWRpbyBzYW1wbGVzLgotICAgICAqLwotICAgIGlmICggKGluYXJncy0+bnVtSW5TYW1wbGVzID4gMCkgJiYgKGdldEJ1ZkRlc2NJZHgoaW5CdWZEZXNjLElOX0FVRElPX0RBVEEpICE9IC0xKSApCi0gICAgewotICAgICAgICAvKiBGZXRjaCBkYXRhIHVudGlsIG5TYW1wbGVzVG9SZWFkIHJlYWNoZWQgKi8KLSAgICAgICAgSU5UIGlkeCA9IGdldEJ1ZkRlc2NJZHgoaW5CdWZEZXNjLElOX0FVRElPX0RBVEEpOwotICAgICAgICBJTlQgbmV3U2FtcGxlcyA9IGZpeE1heCgwLGZpeE1pbihpbmFyZ3MtPm51bUluU2FtcGxlcywgaEFhY0VuY29kZXItPm5TYW1wbGVzVG9SZWFkLWhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQpKTsKLSAgICAgICAgSU5UX1BDTSAqcEluID0gaEFhY0VuY29kZXItPmlucHV0QnVmZmVyK2hBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlck9mZnNldCtoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkOwotCi0gICAgICAgIC8qIENvcHkgbmV3IGlucHV0IHNhbXBsZXMgdG8gaW50ZXJuYWwgYnVmZmVyICovCi0gICAgICAgIGlmIChpbkJ1ZkRlc2MtPmJ1ZkVsU2l6ZXNbaWR4XT09KElOVClzaXplb2YoSU5UX1BDTSkpIHsKLSAgICAgICAgICAgIEZES21lbWNweShwSW4sIChJTlRfUENNKilpbkJ1ZkRlc2MtPmJ1ZnNbaWR4XSwgbmV3U2FtcGxlcypzaXplb2YoSU5UX1BDTSkpOyAgLyogRmFzdCBjb3B5LiAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGluQnVmRGVzYy0+YnVmRWxTaXplc1tpZHhdPihJTlQpc2l6ZW9mKElOVF9QQ00pKSB7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTxuZXdTYW1wbGVzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBwSW5baV0gPSAoSU5UX1BDTSkoKChMT05HKilpbkJ1ZkRlc2MtPmJ1ZnNbaWR4XSlbaV0+PjE2KTsgICAgICAgICAgICAgICAgLyogQ29udmVydCAzMiB0byAxNiBiaXQuICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTxuZXdTYW1wbGVzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBwSW5baV0gPSAoKElOVF9QQ00pKCgoU0hPUlQqKWluQnVmRGVzYy0+YnVmc1tpZHhdKVtpXSkpPDwxNjsgICAgICAgICAgICAgLyogQ29udmVydCAxNiB0byAzMiBiaXQuICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZCArPSBuZXdTYW1wbGVzOwotCi0gICAgICAgIC8qIE51bWJlciBvZiBmZXRjaGVkIGlucHV0IGJ1ZmZlciBzYW1wbGVzLiAqLwotICAgICAgICBvdXRhcmdzLT5udW1JblNhbXBsZXMgPSBuZXdTYW1wbGVzOwotICAgIH0KLQotICAgIC8qIGlucHV0IGJ1ZmZlciBjb21wbGV0ZWx5IGZpbGxlZCA/ICovCi0gICAgaWYgKGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQgPCBoQWFjRW5jb2Rlci0+blNhbXBsZXNUb1JlYWQpCi0gICAgewotICAgICAgICAvKiAtIGVvZiByZWFjaGVkIGFuZCBmbHVzaGluZyBlbmFibGVkLCBvcgotICAgICAgICAgICAtIHJldHVybiB0byBtYWluIGFuZCB3YWl0IGZvciBmdXJ0aGVyIGluY29taW5nIGF1ZGlvIHNhbXBsZXMgKi8KLSAgICAgICAgaWYgKGluYXJncy0+bnVtSW5TYW1wbGVzPT0tMSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCAoaEFhY0VuY29kZXItPm5aZXJvc0FwcGVuZGVkIDwgaEFhY0VuY29kZXItPm5EZWxheSkKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGludCBuWmVyb3MgPSBoQWFjRW5jb2Rlci0+blNhbXBsZXNUb1JlYWQgLSBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkOwotCi0gICAgICAgICAgICAgIEZES19BU1NFUlQoblplcm9zID49IDApOwotCi0gICAgICAgICAgICAgIC8qIGNsZWFyIG91dCB1bnRpbCBlbmQtb2YtYnVmZmVyICovCi0gICAgICAgICAgICAgIGlmIChuWmVyb3MpIHsKLSAgICAgICAgICAgICAgICBGREttZW1jbGVhcihoQWFjRW5jb2Rlci0+aW5wdXRCdWZmZXIraEFhY0VuY29kZXItPmlucHV0QnVmZmVyT2Zmc2V0K2hBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQsIHNpemVvZihJTlRfUENNKSpuWmVyb3MgKTsKLSAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+blplcm9zQXBwZW5kZWQgKz0gblplcm9zOwotICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQgPSBoQWFjRW5jb2Rlci0+blNhbXBsZXNUb1JlYWQ7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgeyAvKiBmbHVzaGluZyBjb21wbGV0ZWQgKi8KLSAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0VOQ09ERV9FT0Y7IC8qIGVvZiByZWFjaGVkICovCi0gICAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsgLyogaW5hcmdzLT5udW1JblNhbXBsZXMhPSAtMSAqLwotICAgICAgICAgICAgZ290byBiYWlsOyAvKiBub3QgZW5vdWdoIHNhbXBsZXMgaW4gaW5wdXQgYnVmZmVyIGFuZCBubyBmbHVzaGluZyBlbmFibGVkICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBpbml0IHBheWxvYWQgKi8KLSAgICBGREttZW1jbGVhcihoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZCwgc2l6ZW9mKEFBQ0VOQ19FWFRfUEFZTE9BRCkgKiBNQVhfVE9UQUxfRVhUX1BBWUxPQURTKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1RPVEFMX0VYVF9QQVlMT0FEUzsgaSsrKSB7Ci0gICAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFtpXS5hc3NvY2lhdGVkQ2hFbGVtZW50ID0gLTE7Ci0gICAgfQotICAgIEZES21lbWNsZWFyKGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkRGF0YSwgc2l6ZW9mKGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkRGF0YSkpOwotICAgIEZES21lbWNsZWFyKGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkU2l6ZSwgc2l6ZW9mKGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkU2l6ZSkpOwotCi0KLSAgICAvKgotICAgICAqIENhbGN1bGF0ZSBNZXRhIERhdGEgaW5mby4KLSAgICAgKi8KLSAgICBpZiAoIChoQWFjRW5jb2Rlci0+aE1ldGFkYXRhRW5jIT1OVUxMKSAmJiAoaEFhY0VuY29kZXItPm1ldGFEYXRhQWxsb3dlZCE9MCkgKSB7Ci0KLSAgICAgICAgY29uc3QgQUFDRU5DX01ldGFEYXRhICpwTWV0YURhdGEgPSBOVUxMOwotICAgICAgICBBQUNFTkNfRVhUX1BBWUxPQUQgKnBNZXRhRGF0YUV4dFBheWxvYWQgPSBOVUxMOwotICAgICAgICBVSU5UIG5NZXRhRGF0YUV4dGVuc2lvbnMgPSAwOwotICAgICAgICBJTlQgIG1hdHJpeF9taXhkb3duX2lkeCA9IDA7Ci0KLSAgICAgICAgLyogTmV3IG1ldGEgZGF0YSBpbmZvIGF2YWlsYWJsZSA/ICovCi0gICAgICAgIGlmICggZ2V0QnVmRGVzY0lkeChpbkJ1ZkRlc2MsSU5fTUVUQURBVEFfU0VUVVApICE9IC0xICkgewotICAgICAgICAgIHBNZXRhRGF0YSA9IChBQUNFTkNfTWV0YURhdGEqKWluQnVmRGVzYy0+YnVmc1tnZXRCdWZEZXNjSWR4KGluQnVmRGVzYyxJTl9NRVRBREFUQV9TRVRVUCldOwotICAgICAgICB9Ci0KLSAgICAgICAgRkRLX01ldGFkYXRhRW5jX1Byb2Nlc3MoaEFhY0VuY29kZXItPmhNZXRhZGF0YUVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmlucHV0QnVmZmVyK2hBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlck9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1ldGFEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwTWV0YURhdGFFeHRQYXlsb2FkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuTWV0YURhdGFFeHRlbnNpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXRyaXhfbWl4ZG93bl9pZHgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotICAgICAgICBmb3IgKGk9MDsgaTwoSU5UKW5NZXRhRGF0YUV4dGVuc2lvbnM7IGkrKykgeyAgLyogR2V0IG1ldGEgZGF0YSBleHRlbnNpb24gcGF5bG9hZC4gKi8KLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW25FeHRlbnNpb25zKytdID0gcE1ldGFEYXRhRXh0UGF5bG9hZFtpXTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggKG1hdHJpeF9taXhkb3duX2lkeCE9LTEpCi0gICAgICAgICAgJiYgKChoQWFjRW5jb2Rlci0+ZXh0UGFyYW0udXNlckNoYW5uZWxNb2RlPT1NT0RFXzFfMl8yKXx8KGhBYWNFbmNvZGVyLT5leHRQYXJhbS51c2VyQ2hhbm5lbE1vZGU9PU1PREVfMV8yXzJfMSkpICkKLSAgICAgICAgewotICAgICAgICAgIC8qIFNldCBtYXRyaXggbWl4ZG93biBjb2VmZmljaWVudC4gKi8KLSAgICAgICAgICBVSU5UIHBjZVZhbHVlID0gKFVJTlQpKCAoMDw8MykgfCAoKG1hdHJpeF9taXhkb3duX2lkeCYweDMpPDwxKSB8IDEgKTsKLSAgICAgICAgICBpZiAoaEFhY0VuY29kZXItPmV4dFBhcmFtLnVzZXJQY2VBZGRpdGlvbnMgIT0gcGNlVmFsdWUpIHsKLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXJhbS51c2VyUGNlQWRkaXRpb25zID0gcGNlVmFsdWU7Ci0gICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIGlmICggaXNTYnJBY3RpdmUoJmhBYWNFbmNvZGVyLT5hYWNDb25maWcpICkgewotCi0gICAgICAgIElOVCBuUGF5bG9hZCA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogRW5jb2RlIFNCUiBkYXRhLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHNickVuY29kZXJfRW5jb2RlRnJhbWUoaEFhY0VuY29kZXItPmhFbnZFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmV4dFBhcmFtLm5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmV4dFBheWxvYWRTaXplW25QYXlsb2FkXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmV4dFBheWxvYWREYXRhW25QYXlsb2FkXQotI2lmIGRlZmluZWQoRVZBTF9QQUNLQUdFX1NJTEVOQ0UpIHx8IGRlZmluZWQoRVZBTF9QQUNLQUdFX1NCUl9TSUxFTkNFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxoQWFjRW5jb2Rlci0+aEFhY0VuYy0+Y2xlYXJPdXRwdXQKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19FTkNPREVfRVJST1I7Ci0gICAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiBBZGQgU0JSIGV4dGVuc2lvbiBwYXlsb2FkICovCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKDgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaEFhY0VuY29kZXItPmV4dFBheWxvYWRTaXplW25QYXlsb2FkXVtpXSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmV4dFBheWxvYWRbbkV4dGVuc2lvbnNdLnBEYXRhICAgID0gaEFhY0VuY29kZXItPmV4dFBheWxvYWREYXRhW25QYXlsb2FkXVtpXTsKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW25FeHRlbnNpb25zXS5kYXRhU2l6ZSA9IGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkU2l6ZVtuUGF5bG9hZF1baV07Ci0gICAgICAgICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPmV4dFBheWxvYWRbbkV4dGVuc2lvbnNdLmFzc29jaWF0ZWRDaEVsZW1lbnQgPSBpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW25FeHRlbnNpb25zXS5kYXRhVHlwZSA9IEVYVF9TQlJfREFUQTsgIC8qIE9uY2UgU0JSIEVuY29kZXIgc3VwcG9ydHMgU0JSIENSQyBzZXQgRVhUX1NCUl9EQVRBX0NSQyAqLwotICAgICAgICAgICAgICAgICAgICBuRXh0ZW5zaW9ucysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvciBFWFRfU0JSX0RBVEEgYWNjb3JkaW5nIHRvIGNvbmZpZ3VyYXRpb24uICovCi0gICAgICAgICAgICAgICAgICAgIEZES19BU1NFUlQobkV4dGVuc2lvbnM8PU1BWF9UT1RBTF9FWFRfUEFZTE9BRFMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5QYXlsb2FkKys7Ci0gICAgICAgIH0KLSAgICB9IC8qIHNickVuYWJsZWQgKi8KLQotICAgIGlmICggKGluYXJncy0+bnVtQW5jQnl0ZXMgPiAwKSAmJiAoIGdldEJ1ZkRlc2NJZHgoaW5CdWZEZXNjLElOX0FOQ0lMTFJZX0RBVEEpIT0tMSApICkgewotICAgICAgICBJTlQgaWR4ID0gZ2V0QnVmRGVzY0lkeChpbkJ1ZkRlc2MsSU5fQU5DSUxMUllfREFUQSk7Ci0gICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW25FeHRlbnNpb25zXS5kYXRhU2l6ZSA9IGluYXJncy0+bnVtQW5jQnl0ZXMgKiA4OwotICAgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFtuRXh0ZW5zaW9uc10ucERhdGEgICAgPSAoVUNIQVIqKWluQnVmRGVzYy0+YnVmc1tpZHhdOwotICAgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFtuRXh0ZW5zaW9uc10uZGF0YVR5cGUgPSBFWFRfREFUQV9FTEVNRU5UOwotICAgICAgICBoQWFjRW5jb2Rlci0+ZXh0UGF5bG9hZFtuRXh0ZW5zaW9uc10uYXNzb2NpYXRlZENoRWxlbWVudCA9IC0xOwotICAgICAgICBhbmNEYXRhRXh0SWR4ID0gbkV4dGVuc2lvbnM7IC8qIHN0b3JlIGluZGV4ICovCi0gICAgICAgIG5FeHRlbnNpb25zKys7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBFbmNvZGUgQUFDIC0gQ29yZS4KLSAgICAgKi8KLSAgICBpZiAoIEZES2FhY0VuY19FbmNvZGVGcmFtZSggaEFhY0VuY29kZXItPmhBYWNFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5oVHBFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Qnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgIT0gQUFDX0VOQ19PSyApCi0gICAgewotICAgICAgICBlcnIgPSBBQUNFTkNfRU5DT0RFX0VSUk9SOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgfQotCi0gICAgaWYgKGFuY0RhdGFFeHRJZHggPj0gMCkgewotICAgICAgb3V0YXJncy0+bnVtQW5jQnl0ZXMgPSBpbmFyZ3MtPm51bUFuY0J5dGVzIC0gKGhBYWNFbmNvZGVyLT5leHRQYXlsb2FkW2FuY0RhdGFFeHRJZHhdLmRhdGFTaXplPj4zKTsKLSAgICB9Ci0KLSAgICAvKiBzYW1wbGVzIGV4aGF1c3RlZCAqLwotICAgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1JlYWQgLT0gaEFhY0VuY29kZXItPm5TYW1wbGVzVG9SZWFkOwotCi0gICAgLyoKLSAgICAgKiBEZWxheSBiYWxhbmNpbmcgYnVmZmVyIGhhbmRsaW5nCi0gICAgICovCi0gICAgaWYgKGlzU2JyQWN0aXZlKCZoQWFjRW5jb2Rlci0+YWFjQ29uZmlnKSkgewotICAgICAgICBzYnJFbmNvZGVyX1VwZGF0ZUJ1ZmZlcnMoaEFhY0VuY29kZXItPmhFbnZFbmMsIGhBYWNFbmNvZGVyLT5pbnB1dEJ1ZmZlcik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBNYWtlIGJpdHN0cmVhbSBwdWJsaWMKLSAgICAgKi8KLSAgICBpZiAob3V0QnVmRGVzYy0+bnVtQnVmcz49MSkgewotCi0gICAgICAgIElOVCBic0lkeCA9IGdldEJ1ZkRlc2NJZHgob3V0QnVmRGVzYyxPVVRfQklUU1RSRUFNX0RBVEEpOwotICAgICAgICBJTlQgYXVJZHggPSBnZXRCdWZEZXNjSWR4KG91dEJ1ZkRlc2MsT1VUX0FVX1NJWkVTKTsKLQotICAgICAgICBmb3IgKGk9MCxuQnNCeXRlcz0wOyBpPGhBYWNFbmNvZGVyLT5hYWNDb25maWcublN1YkZyYW1lczsgaSsrKSB7Ci0gICAgICAgICAgbkJzQnl0ZXMgKz0gb3V0Qnl0ZXNbaV07Ci0KLSAgICAgICAgICBpZiAoYXVJZHghPS0xKSB7Ci0gICAgICAgICAgICgoSU5UKilvdXRCdWZEZXNjLT5idWZzW2F1SWR4XSlbaV0gPSBvdXRCeXRlc1tpXTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIChic0lkeCE9LTEpICYmIChvdXRCdWZEZXNjLT5idWZTaXplc1tic0lkeF0+PW5Cc0J5dGVzKSApIHsKLSAgICAgICAgICBGREttZW1jcHkob3V0QnVmRGVzYy0+YnVmc1tic0lkeF0sIGhBYWNFbmNvZGVyLT5vdXRCdWZmZXIsIHNpemVvZihVQ0hBUikqbkJzQnl0ZXMpOwotICAgICAgICAgIG91dGFyZ3MtPm51bU91dEJ5dGVzID0gbkJzQnl0ZXM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgLyogb3V0cHV0IGJ1ZmZlciB0b28gc21hbGwsIGNhbid0IHdyaXRlIHZhbGlkIGJpdHN0cmVhbSAqLwotICAgICAgICAgIGVyciA9IEFBQ0VOQ19FTkNPREVfRVJST1I7Ci0gICAgICAgICAgZ290byBiYWlsOwotICAgICAgICB9Ci0gICAgfQorICB9CiAKIGJhaWw6Ci0gICAgaWYgKGVyciA9PSBBQUNFTkNfRU5DT0RFX0VSUk9SKSB7Ci0gICAgICAgIC8qIEFsbCBlbmNvZGVyIG1vZHVsZXMgaGF2ZSB0byBiZSBpbml0aWFsaXplZCAqLwotICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzID0gQUFDRU5DX0lOSVRfQUxMOwotICAgIH0KKyAgaWYgKGVyciA9PSBBQUNFTkNfRU5DT0RFX0VSUk9SKSB7CisgICAgLyogQWxsIGVuY29kZXIgbW9kdWxlcyBoYXZlIHRvIGJlIGluaXRpYWxpemVkICovCisgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyA9IEFBQ0VOQ19JTklUX0FMTDsKKyAgfQogCi0gICAgcmV0dXJuIGVycjsKKyAgcmV0dXJuIGVycjsKIH0KIAotc3RhdGljCi1BQUNfRU5DT0RFUl9FUlJPUiBhYWNFbmNHZXRDb25mKEhBTkRMRV9BQUNFTkNPREVSICBoQWFjRW5jb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgKnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICpjb25mQnVmZmVyKQotewotICAgIEZES19CSVRTVFJFQU0gdG1wQ29uZjsKLSAgICBVSU5UIGNvbmZUeXBlOwotICAgIFVDSEFSIGJ1Zls2NF07Ci0gICAgaW50IGVycjsKK3N0YXRpYyBBQUNfRU5DT0RFUl9FUlJPUiBhYWNFbmNHZXRDb25mKEhBTkRMRV9BQUNFTkNPREVSIGhBYWNFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqc2l6ZSwgVUNIQVIgKmNvbmZCdWZmZXIpIHsKKyAgRkRLX0JJVFNUUkVBTSB0bXBDb25mOworICBVSU5UIGNvbmZUeXBlOworICBVQ0hBUiBidWZbNjRdOworICBpbnQgZXJyOwogCi0gICAgLyogSW5pdCBiaXQgYnVmZmVyICovCi0gICAgRkRLaW5pdEJpdFN0cmVhbSgmdG1wQ29uZiwgYnVmLCA2NCwgMCwgQlNfV1JJVEVSKTsKKyAgLyogSW5pdCBiaXQgYnVmZmVyICovCisgIEZES2luaXRCaXRTdHJlYW0oJnRtcENvbmYsIGJ1ZiwgNjQsIDAsIEJTX1dSSVRFUik7CiAKLSAgICAvKiB3cml0ZSBjb25mIGluIHRtcCBidWZmZXIgKi8KLSAgICBlcnIgPSB0cmFuc3BvcnRFbmNfR2V0Q29uZihoQWFjRW5jb2Rlci0+aFRwRW5jLCAmaEFhY0VuY29kZXItPmNvZGVyQ29uZmlnLCAmdG1wQ29uZiwgJmNvbmZUeXBlKTsKKyAgLyogd3JpdGUgY29uZiBpbiB0bXAgYnVmZmVyICovCisgIGVyciA9IHRyYW5zcG9ydEVuY19HZXRDb25mKGhBYWNFbmNvZGVyLT5oVHBFbmMsICZoQWFjRW5jb2Rlci0+Y29kZXJDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBDb25mLCAmY29uZlR5cGUpOwogCi0gICAgLyogY29weSBkYXRhIHRvIG91dGJ1ZmZlcjogbGVuZ3RoIGluIGJ5dGVzICovCi0gICAgRkRLYnl0ZUFsaWduKCZ0bXBDb25mLCAwKTsKKyAgLyogY29weSBkYXRhIHRvIG91dGJ1ZmZlcjogbGVuZ3RoIGluIGJ5dGVzICovCisgIEZES2J5dGVBbGlnbigmdG1wQ29uZiwgMCk7CiAKLSAgICAvKiBDaGVjayBidWZmZXIgc2l6ZSAqLwotICAgIGlmIChGREtnZXRWYWxpZEJpdHMoJnRtcENvbmYpID4gKCgqc2l6ZSk8PDMpKQotICAgICAgcmV0dXJuIEFBQ19FTkNfVU5LTk9XTjsKKyAgLyogQ2hlY2sgYnVmZmVyIHNpemUgKi8KKyAgaWYgKEZES2dldFZhbGlkQml0cygmdG1wQ29uZikgPiAoKCpzaXplKSA8PCAzKSkgcmV0dXJuIEFBQ19FTkNfVU5LTk9XTjsKIAotICAgIEZES2ZldGNoQnVmZmVyKCZ0bXBDb25mLCBjb25mQnVmZmVyLCBzaXplKTsKKyAgRkRLZmV0Y2hCdWZmZXIoJnRtcENvbmYsIGNvbmZCdWZmZXIsIHNpemUpOwogCi0gICAgaWYgKGVyciAhPSAwKQotICAgICAgcmV0dXJuIEFBQ19FTkNfVU5LTk9XTjsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gQUFDX0VOQ19PSzsKKyAgaWYgKGVyciAhPSAwKQorICAgIHJldHVybiBBQUNfRU5DX1VOS05PV047CisgIGVsc2UKKyAgICByZXR1cm4gQUFDX0VOQ19PSzsKIH0KIAotCi1BQUNFTkNfRVJST1IgYWFjRW5jR2V0TGliSW5mbyhMSUJfSU5GTyAqaW5mbykKLXsKK0FBQ0VOQ19FUlJPUiBhYWNFbmNHZXRMaWJJbmZvKExJQl9JTkZPICppbmZvKSB7CiAgIGludCBpID0gMDsKIAogICBpZiAoaW5mbyA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIEFBQ0VOQ19JTlZBTElEX0hBTkRMRTsKICAgfQogCi0gIEZES190b29sc0dldExpYkluZm8oIGluZm8gKTsKLSAgdHJhbnNwb3J0RW5jX0dldExpYkluZm8oIGluZm8gKTsKLQotICBzYnJFbmNvZGVyX0dldExpYkluZm8oIGluZm8gKTsKKyAgRkRLX3Rvb2xzR2V0TGliSW5mbyhpbmZvKTsKKyAgdHJhbnNwb3J0RW5jX0dldExpYkluZm8oaW5mbyk7CisgIHNickVuY29kZXJfR2V0TGliSW5mbyhpbmZvKTsKKyAgRkRLX01wZWdzRW5jX0dldExpYkluZm8oaW5mbyk7CiAKICAgLyogc2VhcmNoIGZvciBuZXh0IGZyZWUgdGFiICovCiAgIGZvciAoaSA9IDA7IGkgPCBGREtfTU9EVUxFX0xBU1Q7IGkrKykgewpAQCAtMTczNSw0MDUgKzIwNTIsNDUxIEBACiAgIH0KIAogICBpbmZvW2ldLm1vZHVsZV9pZCA9IEZES19BQUNFTkM7Ci0gIGluZm9baV0uYnVpbGRfZGF0ZSA9IChjaGFyKilBQUNFTkNPREVSX0xJQl9CVUlMRF9EQVRFOwotICBpbmZvW2ldLmJ1aWxkX3RpbWUgPSAoY2hhciopQUFDRU5DT0RFUl9MSUJfQlVJTERfVElNRTsKLSAgaW5mb1tpXS50aXRsZSA9IChjaGFyKilBQUNFTkNPREVSX0xJQl9USVRMRTsKLSAgaW5mb1tpXS52ZXJzaW9uID0gTElCX1ZFUlNJT04oQUFDRU5DT0RFUl9MSUJfVkwwLCBBQUNFTkNPREVSX0xJQl9WTDEsIEFBQ0VOQ09ERVJfTElCX1ZMMik7OworICBpbmZvW2ldLmJ1aWxkX2RhdGUgPSBBQUNFTkNPREVSX0xJQl9CVUlMRF9EQVRFOworICBpbmZvW2ldLmJ1aWxkX3RpbWUgPSBBQUNFTkNPREVSX0xJQl9CVUlMRF9USU1FOworICBpbmZvW2ldLnRpdGxlID0gQUFDRU5DT0RFUl9MSUJfVElUTEU7CisgIGluZm9baV0udmVyc2lvbiA9CisgICAgICBMSUJfVkVSU0lPTihBQUNFTkNPREVSX0xJQl9WTDAsIEFBQ0VOQ09ERVJfTElCX1ZMMSwgQUFDRU5DT0RFUl9MSUJfVkwyKTsKKyAgOwogICBMSUJfVkVSU0lPTl9TVFJJTkcoJmluZm9baV0pOwogCiAgIC8qIENhcGFiaWxpdHkgZmxhZ3MgKi8KLSAgaW5mb1tpXS5mbGFncyA9IDAKLSAgICB8IENBUEZfQUFDXzEwMjQgfCBDQVBGX0FBQ19MQwotICAgIHwgQ0FQRl9BQUNfNTEyCi0gICAgfCBDQVBGX0FBQ180ODAKLSAgICB8IENBUEZfQUFDX0RSQwotICAgICAgOworICBpbmZvW2ldLmZsYWdzID0gMCB8IENBUEZfQUFDXzEwMjQgfCBDQVBGX0FBQ19MQyB8IENBUEZfQUFDXzUxMiB8CisgICAgICAgICAgICAgICAgICBDQVBGX0FBQ180ODAgfCBDQVBGX0FBQ19EUkMgfCBDQVBGX0FBQ19FTERfRE9XTlNDQUxFOwogICAvKiBFbmQgb2YgZmxhZ3MgKi8KIAogICByZXR1cm4gQUFDRU5DX09LOwogfQogCi1BQUNFTkNfRVJST1IgYWFjRW5jb2Rlcl9TZXRQYXJhbSgKLSAgICAgICAgY29uc3QgSEFORExFX0FBQ0VOQ09ERVIgICBoQWFjRW5jb2RlciwKLSAgICAgICAgY29uc3QgQUFDRU5DX1BBUkFNICAgICAgICBwYXJhbSwKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICB2YWx1ZQotICAgICAgICApCi17Ci0gICAgQUFDRU5DX0VSUk9SIGVyciA9IEFBQ0VOQ19PSzsKLSAgICBVU0VSX1BBUkFNICpzZXR0aW5ncyA9ICZoQWFjRW5jb2Rlci0+ZXh0UGFyYW07CitBQUNFTkNfRVJST1IgYWFjRW5jb2Rlcl9TZXRQYXJhbShjb25zdCBIQU5ETEVfQUFDRU5DT0RFUiBoQWFjRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFBQ0VOQ19QQVJBTSBwYXJhbSwgY29uc3QgVUlOVCB2YWx1ZSkgeworICBBQUNFTkNfRVJST1IgZXJyID0gQUFDRU5DX09LOworICBVU0VSX1BBUkFNICpzZXR0aW5ncyA9ICZoQWFjRW5jb2Rlci0+ZXh0UGFyYW07CiAKLSAgICAvKiBjaGVjayBlbmNvZGVyIGhhbmRsZSAqLwotICAgIGlmIChoQWFjRW5jb2RlciA9PSBOVUxMKSB7Ci0gICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0hBTkRMRTsKLSAgICAgICAgZ290byBiYWlsOwotICAgIH0KKyAgLyogY2hlY2sgZW5jb2RlciBoYW5kbGUgKi8KKyAgaWYgKGhBYWNFbmNvZGVyID09IE5VTEwpIHsKKyAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgICAgZ290byBiYWlsOworICB9CiAKLSAgICAvKiBhcHBseSBwYXJhbSB2YWx1ZSAqLwotICAgIHN3aXRjaCAocGFyYW0pCi0gICAgeworICAvKiBhcHBseSBwYXJhbSB2YWx1ZSAqLworICBzd2l0Y2ggKHBhcmFtKSB7CiAgICAgY2FzZSBBQUNFTkNfQU9UOgotICAgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJBT1QgIT0gKEFVRElPX09CSkVDVF9UWVBFKXZhbHVlKSB7Ci0gICAgICAgICAgICAvKiBjaGVjayBpZiBBT1QgbWF0Y2hlcyB0aGUgYWxsb2NhdGVkIG1vZHVsZXMgKi8KLSAgICAgICAgICAgIHN3aXRjaCAoIHZhbHVlICkgewotICAgICAgICAgICAgICBjYXNlIEFPVF9QUzoKLSAgICAgICAgICAgICAgICBpZiAoIShoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyAmIChFTkNfTU9ERV9GTEFHX1BTKSkpIHsKLSAgICAgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKLSAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhc2UgQU9UX1NCUjoKLSAgICAgICAgICAgICAgICBpZiAoIShoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyAmIChFTkNfTU9ERV9GTEFHX1NCUikpKSB7Ci0gICAgICAgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7Ci0gICAgICAgICAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjYXNlIEFPVF9BQUNfTEM6Ci0gICAgICAgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKLSAgICAgICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKLSAgICAgICAgICAgICAgICBpZiAoIShoQWFjRW5jb2Rlci0+ZW5jb2Rlcl9tb2RpcyAmIChFTkNfTU9ERV9GTEFHX0FBQykpKSB7Ci0gICAgICAgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7Ci0gICAgICAgICAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKLSAgICAgICAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgICAgICB9Lyogc3dpdGNoIHZhbHVlICovCi0gICAgICAgICAgICBzZXR0aW5ncy0+dXNlckFPVCA9IChBVURJT19PQkpFQ1RfVFlQRSl2YWx1ZTsKLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfQ09ORklHIHwgQUFDRU5DX0lOSVRfU1RBVEVTIHwgQUFDRU5DX0lOSVRfVFJBTlNQT1JUOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgaWYgKHNldHRpbmdzLT51c2VyQU9UICE9IChBVURJT19PQkpFQ1RfVFlQRSl2YWx1ZSkgeworICAgICAgICAvKiBjaGVjayBpZiBBT1QgbWF0Y2hlcyB0aGUgYWxsb2NhdGVkIG1vZHVsZXMgKi8KKyAgICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICAgIGNhc2UgQU9UX1BTOgorICAgICAgICAgICAgaWYgKCEoaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMgJiAoRU5DX01PREVfRkxBR19QUykpKSB7CisgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgQU9UX1NCUjoKKyAgICAgICAgICBjYXNlIEFPVF9NUDJfU0JSOgorICAgICAgICAgICAgaWYgKCEoaEFhY0VuY29kZXItPmVuY29kZXJfbW9kaXMgJiAoRU5DX01PREVfRkxBR19TQlIpKSkgeworICAgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEFPVF9BQUNfTEM6CisgICAgICAgICAgY2FzZSBBT1RfTVAyX0FBQ19MQzoKKyAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKKyAgICAgICAgICAgIGlmICghKGhBYWNFbmNvZGVyLT5lbmNvZGVyX21vZGlzICYgKEVOQ19NT0RFX0ZMQUdfQUFDKSkpIHsKKyAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9IC8qIHN3aXRjaCB2YWx1ZSAqLworICAgICAgICBzZXR0aW5ncy0+dXNlckFPVCA9IChBVURJT19PQkpFQ1RfVFlQRSl2YWx1ZTsKKyAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PQorICAgICAgICAgICAgQUFDRU5DX0lOSVRfQ09ORklHIHwgQUFDRU5DX0lOSVRfU1RBVEVTIHwgQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgY2FzZSBBQUNFTkNfQklUUkFURToKLSAgICAgICAgaWYgKHNldHRpbmdzLT51c2VyQml0cmF0ZSAhPSB2YWx1ZSkgewotICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJCaXRyYXRlID0gdmFsdWU7Ci0gICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX0NPTkZJRyB8IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgIGlmIChzZXR0aW5ncy0+dXNlckJpdHJhdGUgIT0gdmFsdWUpIHsKKyAgICAgICAgc2V0dGluZ3MtPnVzZXJCaXRyYXRlID0gdmFsdWU7CisgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfQ09ORklHIHwgQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgY2FzZSBBQUNFTkNfQklUUkFURU1PREU6Ci0gICAgICAgIGlmIChzZXR0aW5ncy0+dXNlckJpdHJhdGVNb2RlICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCB2YWx1ZSApIHsKLSAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICBjYXNlIDE6IGNhc2UgMjogY2FzZSAzOiBjYXNlIDQ6IGNhc2UgNToKLSAgICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgIHNldHRpbmdzLT51c2VyQml0cmF0ZU1vZGUgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX0NPTkZJRyB8IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IC8qIHN3aXRjaCB2YWx1ZSAqLwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgaWYgKHNldHRpbmdzLT51c2VyQml0cmF0ZU1vZGUgIT0gdmFsdWUpIHsKKyAgICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJCaXRyYXRlTW9kZSA9IHZhbHVlOworICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PQorICAgICAgICAgICAgICAgIEFBQ0VOQ19JTklUX0NPTkZJRyB8IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSAvKiBzd2l0Y2ggdmFsdWUgKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIGNhc2UgQUFDRU5DX1NBTVBMRVJBVEU6Ci0gICAgICAgIGlmIChzZXR0aW5ncy0+dXNlclNhbXBsZXJhdGUgIT0gdmFsdWUpIHsKLSAgICAgICAgICAgIGlmICggISggKHZhbHVlPT04MDAwKSB8fCAodmFsdWU9PTExMDI1KSB8fCAodmFsdWU9PTEyMDAwKSB8fCAodmFsdWU9PTE2MDAwKSB8fCAodmFsdWU9PTIyMDUwKSB8fCAodmFsdWU9PTI0MDAwKSB8fAotICAgICAgICAgICAgICAgICAgICh2YWx1ZT09MzIwMDApIHx8ICh2YWx1ZT09NDQxMDApIHx8ICh2YWx1ZT09NDgwMDApIHx8ICh2YWx1ZT09NjQwMDApIHx8ICh2YWx1ZT09ODgyMDApIHx8ICh2YWx1ZT09OTYwMDApICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldHRpbmdzLT51c2VyU2FtcGxlcmF0ZSA9IHZhbHVlOwotICAgICAgICAgICAgaEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZCA9IDA7IC8qIHJlc2V0IGludGVybmFsIGlucHV0YnVmZmVyICovCi0gICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX0NPTkZJRyB8IEFBQ0VOQ19JTklUX1NUQVRFUyB8IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgIGlmIChzZXR0aW5ncy0+dXNlclNhbXBsZXJhdGUgIT0gdmFsdWUpIHsKKyAgICAgICAgaWYgKCEoKHZhbHVlID09IDgwMDApIHx8ICh2YWx1ZSA9PSAxMTAyNSkgfHwgKHZhbHVlID09IDEyMDAwKSB8fAorICAgICAgICAgICAgICAodmFsdWUgPT0gMTYwMDApIHx8ICh2YWx1ZSA9PSAyMjA1MCkgfHwgKHZhbHVlID09IDI0MDAwKSB8fAorICAgICAgICAgICAgICAodmFsdWUgPT0gMzIwMDApIHx8ICh2YWx1ZSA9PSA0NDEwMCkgfHwgKHZhbHVlID09IDQ4MDAwKSB8fAorICAgICAgICAgICAgICAodmFsdWUgPT0gNjQwMDApIHx8ICh2YWx1ZSA9PSA4ODIwMCkgfHwgKHZhbHVlID09IDk2MDAwKSkpIHsKKyAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgIHNldHRpbmdzLT51c2VyU2FtcGxlcmF0ZSA9IHZhbHVlOworICAgICAgICBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkID0gMDsgLyogcmVzZXQgaW50ZXJuYWwgaW5wdXRidWZmZXIgKi8KKyAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PQorICAgICAgICAgICAgQUFDRU5DX0lOSVRfQ09ORklHIHwgQUFDRU5DX0lOSVRfU1RBVEVTIHwgQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgY2FzZSBBQUNFTkNfQ0hBTk5FTE1PREU6Ci0gICAgICAgIGlmIChzZXR0aW5ncy0+dXNlckNoYW5uZWxNb2RlICE9IChDSEFOTkVMX01PREUpdmFsdWUpIHsKLSAgICAgICAgICAgIGNvbnN0IENIQU5ORUxfTU9ERV9DT05GSUdfVEFCKiBwQ29uZmlnID0gRkRLYWFjRW5jX0dldENoYW5uZWxNb2RlQ29uZmlndXJhdGlvbigoQ0hBTk5FTF9NT0RFKXZhbHVlKTsKLSAgICAgICAgICAgIGlmIChwQ29uZmlnPT1OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCAocENvbmZpZy0+bkVsZW1lbnRzID4gaEFhY0VuY29kZXItPm5NYXhBYWNFbGVtZW50cykKLSAgICAgICAgICAgICAgfHwgKHBDb25maWctPm5DaGFubmVsc0VmZiA+IGhBYWNFbmNvZGVyLT5uTWF4QWFjQ2hhbm5lbHMpCi0gICAgICAgICAgICAgIHx8ICEoKCh2YWx1ZT49MSkgJiYgKHZhbHVlPD03KSl8fCgodmFsdWU+PTMzKSAmJiAodmFsdWU8PTM0KSkpCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJDaGFubmVsTW9kZSA9IChDSEFOTkVMX01PREUpdmFsdWU7Ci0gICAgICAgICAgICBzZXR0aW5ncy0+bkNoYW5uZWxzID0gcENvbmZpZy0+bkNoYW5uZWxzOwotICAgICAgICAgICAgaEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZCA9IDA7IC8qIHJlc2V0IGludGVybmFsIGlucHV0YnVmZmVyICovCi0gICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX0NPTkZJRyB8IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFBQ0VOQ19CQU5EV0lEVEg6Ci0gICAgICAgIGlmIChzZXR0aW5ncy0+dXNlckJhbmR3aWR0aCAhPSB2YWx1ZSkgewotICAgICAgICAgIHNldHRpbmdzLT51c2VyQmFuZHdpZHRoID0gdmFsdWU7Ci0gICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9DT05GSUc7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQUNFTkNfQ0hBTk5FTE9SREVSOgotICAgICAgICBpZiAoaEFhY0VuY29kZXItPmFhY0NvbmZpZy5jaGFubmVsT3JkZXIgIT0gKENIQU5ORUxfT1JERVIpdmFsdWUpIHsKLSAgICAgICAgICAgIGlmICghICgodmFsdWU9PTApIHx8ICh2YWx1ZT09MSkpICkgewotICAgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5hYWNDb25maWcuY2hhbm5lbE9yZGVyID0gKENIQU5ORUxfT1JERVIpdmFsdWU7Ci0gICAgICAgICAgICBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkID0gMDsgLyogcmVzZXQgaW50ZXJuYWwgaW5wdXRidWZmZXIgKi8KLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfQ09ORklHIHwgQUFDRU5DX0lOSVRfU1RBVEVTIHwgQUFDRU5DX0lOSVRfVFJBTlNQT1JUOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFDRU5DX0FGVEVSQlVSTkVSOgotICAgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJBZnRlcmJ1cm5lciAhPSB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKCEgKCh2YWx1ZT09MCkgfHwgKHZhbHVlPT0xKSkgKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJBZnRlcmJ1cm5lciA9IHZhbHVlOwotICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9DT05GSUc7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQUNFTkNfR1JBTlVMRV9MRU5HVEg6Ci0gICAgICAgIGlmIChzZXR0aW5ncy0+dXNlckZyYW1lbGVuZ3RoICE9IHZhbHVlKSB7Ci0gICAgICAgICAgc3dpdGNoICh2YWx1ZSkgewotICAgICAgICAgICAgY2FzZSAxMDI0OgotICAgICAgICAgICAgY2FzZSA1MTI6Ci0gICAgICAgICAgICBjYXNlIDQ4MDoKLSAgICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJGcmFtZWxlbmd0aCA9IHZhbHVlOwotICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX0NPTkZJRyB8IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7Ci0gICAgICAgICAgICAgIGJyZWFrOworICAgICAgaWYgKHNldHRpbmdzLT51c2VyQ2hhbm5lbE1vZGUgIT0gKENIQU5ORUxfTU9ERSl2YWx1ZSkgeworICAgICAgICBpZiAoKChDSEFOTkVMX01PREUpdmFsdWUgPT0gTU9ERV8yMTIpICYmCisgICAgICAgICAgICAoTlVMTCAhPSBoQWFjRW5jb2Rlci0+aE1wc0VuYykpIHsKKyAgICAgICAgICBzZXR0aW5ncy0+dXNlckNoYW5uZWxNb2RlID0gKENIQU5ORUxfTU9ERSl2YWx1ZTsKKyAgICAgICAgICBzZXR0aW5ncy0+bkNoYW5uZWxzID0gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb25zdCBDSEFOTkVMX01PREVfQ09ORklHX1RBQiAqcENvbmZpZyA9CisgICAgICAgICAgICAgIEZES2FhY0VuY19HZXRDaGFubmVsTW9kZUNvbmZpZ3VyYXRpb24oKENIQU5ORUxfTU9ERSl2YWx1ZSk7CisgICAgICAgICAgaWYgKHBDb25maWcgPT0gTlVMTCkgeworICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQorICAgICAgICAgIGlmICgocENvbmZpZy0+bkVsZW1lbnRzID4gaEFhY0VuY29kZXItPm5NYXhBYWNFbGVtZW50cykgfHwKKyAgICAgICAgICAgICAgKHBDb25maWctPm5DaGFubmVsc0VmZiA+IGhBYWNFbmNvZGVyLT5uTWF4QWFjQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzZXR0aW5ncy0+dXNlckNoYW5uZWxNb2RlID0gKENIQU5ORUxfTU9ERSl2YWx1ZTsKKyAgICAgICAgICBzZXR0aW5ncy0+bkNoYW5uZWxzID0gcENvbmZpZy0+bkNoYW5uZWxzOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkID0gMDsgLyogcmVzZXQgaW50ZXJuYWwgaW5wdXRidWZmZXIgKi8KKyAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9DT05GSUcgfCBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICAgIGlmICghKCh2YWx1ZSA+PSAxKSAmJiAodmFsdWUgPD0gNikpKSB7CisgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9TVEFURVM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX0JBTkRXSURUSDoKKyAgICAgIGlmIChzZXR0aW5ncy0+dXNlckJhbmR3aWR0aCAhPSB2YWx1ZSkgeworICAgICAgICBzZXR0aW5ncy0+dXNlckJhbmR3aWR0aCA9IHZhbHVlOworICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX0NPTkZJRzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX0NIQU5ORUxPUkRFUjoKKyAgICAgIGlmIChoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmNoYW5uZWxPcmRlciAhPSAoQ0hBTk5FTF9PUkRFUil2YWx1ZSkgeworICAgICAgICBpZiAoISgodmFsdWUgPT0gMCkgfHwgKHZhbHVlID09IDEpKSkgeworICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmNoYW5uZWxPcmRlciA9IChDSEFOTkVMX09SREVSKXZhbHVlOworICAgICAgICBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkID0gMDsgLyogcmVzZXQgaW50ZXJuYWwgaW5wdXRidWZmZXIgKi8KKyAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PQorICAgICAgICAgICAgQUFDRU5DX0lOSVRfQ09ORklHIHwgQUFDRU5DX0lOSVRfU1RBVEVTIHwgQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQUZURVJCVVJORVI6CisgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJBZnRlcmJ1cm5lciAhPSB2YWx1ZSkgeworICAgICAgICBpZiAoISgodmFsdWUgPT0gMCkgfHwgKHZhbHVlID09IDEpKSkgeworICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzZXR0aW5ncy0+dXNlckFmdGVyYnVybmVyID0gdmFsdWU7CisgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfQ09ORklHOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfR1JBTlVMRV9MRU5HVEg6CisgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJGcmFtZWxlbmd0aCAhPSB2YWx1ZSkgeworICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgY2FzZSAxMDI0OgorICAgICAgICAgIGNhc2UgNTEyOgorICAgICAgICAgIGNhc2UgNDgwOgorICAgICAgICAgIGNhc2UgMjU2OgorICAgICAgICAgIGNhc2UgMjQwOgorICAgICAgICAgIGNhc2UgMTI4OgorICAgICAgICAgIGNhc2UgMTIwOgorICAgICAgICAgICAgaWYgKCh2YWx1ZSA8PCAxKSA9PSA0ODAgfHwgKHZhbHVlIDw8IDEpID09IDUxMikgeworICAgICAgICAgICAgICBzZXR0aW5ncy0+dXNlckRvd25zY2FsZUZhY3RvciA9IDI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCh2YWx1ZSA8PCAyKSA9PSA0ODAgfHwgKHZhbHVlIDw8IDIpID09IDUxMikgeworICAgICAgICAgICAgICBzZXR0aW5ncy0+dXNlckRvd25zY2FsZUZhY3RvciA9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXR0aW5ncy0+dXNlckZyYW1lbGVuZ3RoID0gdmFsdWU7CisgICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9CisgICAgICAgICAgICAgICAgQUFDRU5DX0lOSVRfQ09ORklHIHwgQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKICAgICBjYXNlIEFBQ0VOQ19TQlJfUkFUSU86Ci0gICAgICAgIGlmIChzZXR0aW5ncy0+dXNlclNiclJhdGlvICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoISAoKHZhbHVlPT0wKSB8fCAodmFsdWU9PTEpIHx8ICh2YWx1ZT09MikpICkgewotICAgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJTYnJSYXRpbyA9IHZhbHVlOwotICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9DT05GSUcgfCBBQUNFTkNfSU5JVF9TVEFURVMgfCBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJTYnJSYXRpbyAhPSB2YWx1ZSkgeworICAgICAgICBpZiAoISgodmFsdWUgPT0gMCkgfHwgKHZhbHVlID09IDEpIHx8ICh2YWx1ZSA9PSAyKSkpIHsKKyAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgIHNldHRpbmdzLT51c2VyU2JyUmF0aW8gPSB2YWx1ZTsKKyAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PQorICAgICAgICAgICAgQUFDRU5DX0lOSVRfQ09ORklHIHwgQUFDRU5DX0lOSVRfU1RBVEVTIHwgQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgY2FzZSBBQUNFTkNfU0JSX01PREU6Ci0gICAgICAgIGlmIChzZXR0aW5ncy0+dXNlclNickVuYWJsZWQgIT0gdmFsdWUpIHsKLSAgICAgICAgICAgIHNldHRpbmdzLT51c2VyU2JyRW5hYmxlZCA9IHZhbHVlOwotICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9DT05GSUcgfCBBQUNFTkNfSU5JVF9TVEFURVMgfCBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICBpZiAoKHNldHRpbmdzLT51c2VyU2JyRW5hYmxlZCAhPSB2YWx1ZSkgJiYKKyAgICAgICAgICAoTlVMTCAhPSBoQWFjRW5jb2Rlci0+aEVudkVuYykpIHsKKyAgICAgICAgc2V0dGluZ3MtPnVzZXJTYnJFbmFibGVkID0gdmFsdWU7CisgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0KKyAgICAgICAgICAgIEFBQ0VOQ19JTklUX0NPTkZJRyB8IEFBQ0VOQ19JTklUX1NUQVRFUyB8IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIGNhc2UgQUFDRU5DX1RSQU5TTVVYOgotICAgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJUcFR5cGUgIT0gKFRSQU5TUE9SVF9UWVBFKXZhbHVlKSB7CisgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJUcFR5cGUgIT0gKFRSQU5TUE9SVF9UWVBFKXZhbHVlKSB7CisgICAgICAgIFRSQU5TUE9SVF9UWVBFIHR5cGUgPSAoVFJBTlNQT1JUX1RZUEUpdmFsdWU7CisgICAgICAgIFVJTlQgZmxhZ3MgPSBoQWFjRW5jb2Rlci0+Q0FQRl90cEVuYzsKIAotICAgICAgICAgICAgVFJBTlNQT1JUX1RZUEUgIHR5cGUgID0gKFRSQU5TUE9SVF9UWVBFKXZhbHVlOwotICAgICAgICAgICAgVUlOVCAgICAgICAgICAgIGZsYWdzID0gaEFhY0VuY29kZXItPkNBUEZfdHBFbmM7Ci0KLSAgICAgICAgICAgIGlmICggISggKCh0eXBlPT1UVF9NUDRfQURJRikgICAgICAmJiAgKGZsYWdzJkNBUEZfQURJRikpCi0gICAgICAgICAgICAgICAgIHx8ICgodHlwZT09VFRfTVA0X0FEVFMpICAgICAgJiYgIChmbGFncyZDQVBGX0FEVFMpKQotICAgICAgICAgICAgICAgICB8fCAoKHR5cGU9PVRUX01QNF9MQVRNX01DUDApICYmICgoZmxhZ3MmQ0FQRl9MQVRNKSAmJiAoZmxhZ3MmQ0FQRl9SQVdQQUNLRVRTKSkpCi0gICAgICAgICAgICAgICAgIHx8ICgodHlwZT09VFRfTVA0X0xBVE1fTUNQMSkgJiYgKChmbGFncyZDQVBGX0xBVE0pICYmIChmbGFncyZDQVBGX1JBV1BBQ0tFVFMpKSkKLSAgICAgICAgICAgICAgICAgfHwgKCh0eXBlPT1UVF9NUDRfTE9BUykgICAgICAmJiAgKGZsYWdzJkNBUEZfTE9BUykpCi0gICAgICAgICAgICAgICAgIHx8ICgodHlwZT09VFRfTVA0X1JBVykgICAgICAgJiYgIChmbGFncyZDQVBGX1JBV1BBQ0tFVFMpKQotICAgICAgICAgICAgICAgICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldHRpbmdzLT51c2VyVHBUeXBlID0gKFRSQU5TUE9SVF9UWVBFKXZhbHVlOwotICAgICAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICAgIGlmICghKCgodHlwZSA9PSBUVF9NUDRfQURJRikgJiYgKGZsYWdzICYgQ0FQRl9BRElGKSkgfHwKKyAgICAgICAgICAgICAgKCh0eXBlID09IFRUX01QNF9BRFRTKSAmJiAoZmxhZ3MgJiBDQVBGX0FEVFMpKSB8fAorICAgICAgICAgICAgICAoKHR5cGUgPT0gVFRfTVA0X0xBVE1fTUNQMCkgJiYKKyAgICAgICAgICAgICAgICgoZmxhZ3MgJiBDQVBGX0xBVE0pICYmIChmbGFncyAmIENBUEZfUkFXUEFDS0VUUykpKSB8fAorICAgICAgICAgICAgICAoKHR5cGUgPT0gVFRfTVA0X0xBVE1fTUNQMSkgJiYKKyAgICAgICAgICAgICAgICgoZmxhZ3MgJiBDQVBGX0xBVE0pICYmIChmbGFncyAmIENBUEZfUkFXUEFDS0VUUykpKSB8fAorICAgICAgICAgICAgICAoKHR5cGUgPT0gVFRfTVA0X0xPQVMpICYmIChmbGFncyAmIENBUEZfTE9BUykpIHx8CisgICAgICAgICAgICAgICgodHlwZSA9PSBUVF9NUDRfUkFXKSAmJiAoZmxhZ3MgJiBDQVBGX1JBV1BBQ0tFVFMpKSkpIHsKKyAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgIHNldHRpbmdzLT51c2VyVHBUeXBlID0gKFRSQU5TUE9SVF9UWVBFKXZhbHVlOworICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIGNhc2UgQUFDRU5DX1NJR05BTElOR19NT0RFOgotICAgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJUcFNpZ25hbGluZyAhPSB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKCAhKCh2YWx1ZT09MCkgfHwgKHZhbHVlPT0xKSB8fCAodmFsdWU9PTIpKSApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBBQUNFTkNfSU5WQUxJRF9DT05GSUc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXR0aW5ncy0+dXNlclRwU2lnbmFsaW5nID0gdmFsdWU7Ci0gICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgIGlmIChzZXR0aW5ncy0+dXNlclRwU2lnbmFsaW5nICE9IHZhbHVlKSB7CisgICAgICAgIGlmICghKCh2YWx1ZSA9PSAwKSB8fCAodmFsdWUgPT0gMSkgfHwgKHZhbHVlID09IDIpKSkgeworICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgICAgc2V0dGluZ3MtPnVzZXJUcFNpZ25hbGluZyA9IHZhbHVlOworICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIGNhc2UgQUFDRU5DX1BST1RFQ1RJT046Ci0gICAgICAgIGlmIChzZXR0aW5ncy0+dXNlclRwUHJvdGVjdGlvbiAhPSB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKCAhKCh2YWx1ZT09MCkgfHwgKHZhbHVlPT0xKSkgKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJUcFByb3RlY3Rpb24gPSB2YWx1ZTsKLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgaWYgKHNldHRpbmdzLT51c2VyVHBQcm90ZWN0aW9uICE9IHZhbHVlKSB7CisgICAgICAgIGlmICghKCh2YWx1ZSA9PSAwKSB8fCAodmFsdWUgPT0gMSkpKSB7CisgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICBzZXR0aW5ncy0+dXNlclRwUHJvdGVjdGlvbiA9IHZhbHVlOworICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIGNhc2UgQUFDRU5DX0hFQURFUl9QRVJJT0Q6Ci0gICAgICAgIGlmIChzZXR0aW5ncy0+dXNlclRwSGVhZGVyUGVyaW9kICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICBzZXR0aW5ncy0+dXNlclRwSGVhZGVyUGVyaW9kID0gdmFsdWU7Ci0gICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgIGlmIChzZXR0aW5ncy0+dXNlclRwSGVhZGVyUGVyaW9kICE9IHZhbHVlKSB7CisgICAgICAgIGlmICghKCgoSU5UKXZhbHVlID49IDApICYmICh2YWx1ZSA8PSAyNTUpKSkgeworICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgICAgc2V0dGluZ3MtPnVzZXJUcEhlYWRlclBlcmlvZCA9IHZhbHVlOworICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIGNhc2UgQUFDRU5DX0FVRElPTVVYVkVSOgotICAgICAgICBpZiAoc2V0dGluZ3MtPnVzZXJUcEFteHYgIT0gdmFsdWUpIHsKLSAgICAgICAgICAgIGlmICggISgodmFsdWU9PTApIHx8ICh2YWx1ZT09MSkgfHwgKHZhbHVlPT0yKSkgKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJUcEFteHYgPSB2YWx1ZTsKLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfVFJBTlNQT1JUOworICAgICAgaWYgKHNldHRpbmdzLT51c2VyVHBBbXh2ICE9IHZhbHVlKSB7CisgICAgICAgIGlmICghKCh2YWx1ZSA9PSAwKSB8fCAodmFsdWUgPT0gMSkgfHwgKHZhbHVlID09IDIpKSkgeworICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgICAgc2V0dGluZ3MtPnVzZXJUcEFteHYgPSB2YWx1ZTsKKyAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICB9CisgICAgICBicmVhazsKICAgICBjYXNlIEFBQ0VOQ19UUFNVQkZSQU1FUzoKLSAgICAgICAgaWYgKHNldHRpbmdzLT51c2VyVHBOc3ViRnJhbWVzICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoISAoICh2YWx1ZT49MSkgJiYgKHZhbHVlPD00KSApICkgewotICAgICAgICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldHRpbmdzLT51c2VyVHBOc3ViRnJhbWVzID0gdmFsdWU7Ci0gICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKKyAgICAgIGlmIChzZXR0aW5ncy0+dXNlclRwTnN1YkZyYW1lcyAhPSB2YWx1ZSkgeworICAgICAgICBpZiAoISgodmFsdWUgPj0gMSkgJiYgKHZhbHVlIDw9IDQpKSkgeworICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgICAgc2V0dGluZ3MtPnVzZXJUcE5zdWJGcmFtZXMgPSB2YWx1ZTsKKyAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICB9CisgICAgICBicmVhazsKICAgICBjYXNlIEFBQ0VOQ19BTkNJTExBUllfQklUUkFURToKLSAgICAgICAgaWYgKHNldHRpbmdzLT51c2VyQW5jRGF0YVJhdGUgIT0gdmFsdWUpIHsKLSAgICAgICAgICAgIHNldHRpbmdzLT51c2VyQW5jRGF0YVJhdGUgPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgIGlmIChzZXR0aW5ncy0+dXNlckFuY0RhdGFSYXRlICE9IHZhbHVlKSB7CisgICAgICAgIHNldHRpbmdzLT51c2VyQW5jRGF0YVJhdGUgPSB2YWx1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIGNhc2UgQUFDRU5DX0NPTlRST0xfU1RBVEU6Ci0gICAgICAgIGlmIChoQWFjRW5jb2Rlci0+SW5pdEZsYWdzICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUmQUFDRU5DX1JFU0VUX0lOQlVGRkVSKSB7Ci0gICAgICAgICAgICAgICAgaEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzID0gdmFsdWU7CisgICAgICBpZiAoaEFhY0VuY29kZXItPkluaXRGbGFncyAhPSB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgJiBBQUNFTkNfUkVTRVRfSU5CVUZGRVIpIHsKKyAgICAgICAgICBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkID0gMDsKICAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyA9IHZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgY2FzZSBBQUNFTkNfTUVUQURBVEFfTU9ERToKLSAgICAgICAgaWYgKChVSU5UKXNldHRpbmdzLT51c2VyTWV0YURhdGFNb2RlICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoICEoKChJTlQpdmFsdWU+PTApICYmICgoSU5UKXZhbHVlPD0yKSkgKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gQUFDRU5DX0lOVkFMSURfQ09ORklHOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0dGluZ3MtPnVzZXJNZXRhRGF0YU1vZGUgPSB2YWx1ZTsKLSAgICAgICAgICAgIGhBYWNFbmNvZGVyLT5Jbml0RmxhZ3MgfD0gQUFDRU5DX0lOSVRfQ09ORklHOworICAgICAgaWYgKChVSU5UKXNldHRpbmdzLT51c2VyTWV0YURhdGFNb2RlICE9IHZhbHVlKSB7CisgICAgICAgIGlmICghKCgoSU5UKXZhbHVlID49IDApICYmICgoSU5UKXZhbHVlIDw9IDMpKSkgeworICAgICAgICAgIGVyciA9IEFBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgICAgc2V0dGluZ3MtPnVzZXJNZXRhRGF0YU1vZGUgPSB2YWx1ZTsKKyAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9DT05GSUc7CisgICAgICB9CisgICAgICBicmVhazsKICAgICBjYXNlIEFBQ0VOQ19QRUFLX0JJVFJBVEU6Ci0gICAgICAgIGlmIChzZXR0aW5ncy0+dXNlclBlYWtCaXRyYXRlICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICBzZXR0aW5ncy0+dXNlclBlYWtCaXRyYXRlID0gdmFsdWU7Ci0gICAgICAgICAgICBoQWFjRW5jb2Rlci0+SW5pdEZsYWdzIHw9IEFBQ0VOQ19JTklUX0NPTkZJRyB8IEFBQ0VOQ19JTklUX1RSQU5TUE9SVDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgIGlmIChzZXR0aW5ncy0+dXNlclBlYWtCaXRyYXRlICE9IHZhbHVlKSB7CisgICAgICAgIHNldHRpbmdzLT51c2VyUGVha0JpdHJhdGUgPSB2YWx1ZTsKKyAgICAgICAgaEFhY0VuY29kZXItPkluaXRGbGFncyB8PSBBQUNFTkNfSU5JVF9DT05GSUcgfCBBQUNFTkNfSU5JVF9UUkFOU1BPUlQ7CisgICAgICB9CisgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgZXJyID0gQUFDRU5DX1VOU1VQUE9SVEVEX1BBUkFNRVRFUjsKICAgICAgIGJyZWFrOwotICAgIH0gIC8qIHN3aXRjaChwYXJhbSkgKi8KKyAgfSAvKiBzd2l0Y2gocGFyYW0pICovCiAKIGJhaWw6Ci0gICAgcmV0dXJuIGVycjsKKyAgcmV0dXJuIGVycjsKIH0KIAotVUlOVCBhYWNFbmNvZGVyX0dldFBhcmFtKAotICAgICAgICBjb25zdCBIQU5ETEVfQUFDRU5DT0RFUiAgIGhBYWNFbmNvZGVyLAotICAgICAgICBjb25zdCBBQUNFTkNfUEFSQU0gICAgICAgIHBhcmFtCi0gICAgICAgICkKLXsKLSAgICBVSU5UIHZhbHVlID0gMDsKLSAgICBVU0VSX1BBUkFNICpzZXR0aW5ncyA9ICZoQWFjRW5jb2Rlci0+ZXh0UGFyYW07CitVSU5UIGFhY0VuY29kZXJfR2V0UGFyYW0oY29uc3QgSEFORExFX0FBQ0VOQ09ERVIgaEFhY0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFDRU5DX1BBUkFNIHBhcmFtKSB7CisgIFVJTlQgdmFsdWUgPSAwOworICBVU0VSX1BBUkFNICpzZXR0aW5ncyA9ICZoQWFjRW5jb2Rlci0+ZXh0UGFyYW07CiAKLSAgICAvKiBjaGVjayBlbmNvZGVyIGhhbmRsZSAqLwotICAgIGlmIChoQWFjRW5jb2RlciA9PSBOVUxMKSB7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9CisgIC8qIGNoZWNrIGVuY29kZXIgaGFuZGxlICovCisgIGlmIChoQWFjRW5jb2RlciA9PSBOVUxMKSB7CisgICAgZ290byBiYWlsOworICB9CiAKLSAgICAvKiBhcHBseSBwYXJhbSB2YWx1ZSAqLwotICAgIHN3aXRjaCAocGFyYW0pCi0gICAgeworICAvKiBhcHBseSBwYXJhbSB2YWx1ZSAqLworICBzd2l0Y2ggKHBhcmFtKSB7CiAgICAgY2FzZSBBQUNFTkNfQU9UOgotICAgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5hYWNDb25maWcuYXVkaW9PYmplY3RUeXBlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFBQ0VOQ19CSVRSQVRFOgotICAgICAgICB2YWx1ZSA9IChVSU5UKSgoaEFhY0VuY29kZXItPmFhY0NvbmZpZy5iaXRyYXRlTW9kZT09QUFDRU5DX0JSX01PREVfQ0JSKSA/IGhBYWNFbmNvZGVyLT5hYWNDb25maWcuYml0UmF0ZSA6IC0xKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQUNFTkNfQklUUkFURU1PREU6Ci0gICAgICAgIHZhbHVlID0gKFVJTlQpaEFhY0VuY29kZXItPmFhY0NvbmZpZy5iaXRyYXRlTW9kZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQUNFTkNfU0FNUExFUkFURToKLSAgICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+Y29kZXJDb25maWcuZXh0U2FtcGxpbmdSYXRlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFBQ0VOQ19DSEFOTkVMTU9ERToKLSAgICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmNoYW5uZWxNb2RlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFBQ0VOQ19CQU5EV0lEVEg6Ci0gICAgICAgIHZhbHVlID0gKFVJTlQpaEFhY0VuY29kZXItPmFhY0NvbmZpZy5iYW5kV2lkdGg7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFDRU5DX0NIQU5ORUxPUkRFUjoKLSAgICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmNoYW5uZWxPcmRlcjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQUNFTkNfQUZURVJCVVJORVI6Ci0gICAgICAgIHZhbHVlID0gKFVJTlQpaEFhY0VuY29kZXItPmFhY0NvbmZpZy51c2VSZXF1YW50OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFBQ0VOQ19HUkFOVUxFX0xFTkdUSDoKLSAgICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmZyYW1lbGVuZ3RoOwotICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFDRU5DX1NCUl9SQVRJTzoKLSAgICAgICAgdmFsdWUgPSBpc1NickFjdGl2ZSgmaEFhY0VuY29kZXItPmFhY0NvbmZpZykgPyBoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLnNiclJhdGlvIDogMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQUNFTkNfU0JSX01PREU6Ci0gICAgICAgIHZhbHVlID0gKFVJTlQpIChoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLnN5bnRheEZsYWdzICYgQUNfU0JSX1BSRVNFTlQpID8gMSA6IDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFDRU5DX1RSQU5TTVVYOgotICAgICAgICB2YWx1ZSA9IChVSU5UKXNldHRpbmdzLT51c2VyVHBUeXBlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFBQ0VOQ19TSUdOQUxJTkdfTU9ERToKLSAgICAgICAgdmFsdWUgPSAoVUlOVClnZXRTYnJTaWduYWxpbmdNb2RlKGhBYWNFbmNvZGVyLT5hYWNDb25maWcuYXVkaW9PYmplY3RUeXBlLCBzZXR0aW5ncy0+dXNlclRwVHlwZSwgc2V0dGluZ3MtPnVzZXJUcFNpZ25hbGluZywgaEFhY0VuY29kZXItPmFhY0NvbmZpZy5zYnJSYXRpbyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFDRU5DX1BST1RFQ1RJT046Ci0gICAgICAgIHZhbHVlID0gKFVJTlQpc2V0dGluZ3MtPnVzZXJUcFByb3RlY3Rpb247Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFDRU5DX0hFQURFUl9QRVJJT0Q6Ci0gICAgICAgIHZhbHVlID0gKFVJTlQpaEFhY0VuY29kZXItPmNvZGVyQ29uZmlnLmhlYWRlclBlcmlvZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQUNFTkNfQVVESU9NVVhWRVI6Ci0gICAgICAgIHZhbHVlID0gKFVJTlQpaEFhY0VuY29kZXItPmFhY0NvbmZpZy5hdWRpb011eFZlcnNpb247Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFDRU5DX1RQU1VCRlJBTUVTOgotICAgICAgICB2YWx1ZSA9IChVSU5UKXNldHRpbmdzLT51c2VyVHBOc3ViRnJhbWVzOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFBQ0VOQ19BTkNJTExBUllfQklUUkFURToKLSAgICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmFuY19SYXRlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFBQ0VOQ19DT05UUk9MX1NUQVRFOgotICAgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5Jbml0RmxhZ3M7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFDRU5DX01FVEFEQVRBX01PREU6Ci0gICAgICAgIHZhbHVlID0gKGhBYWNFbmNvZGVyLT5tZXRhRGF0YUFsbG93ZWQ9PTApID8gMCA6IChVSU5UKXNldHRpbmdzLT51c2VyTWV0YURhdGFNb2RlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFBQ0VOQ19QRUFLX0JJVFJBVEU6Ci0gICAgICAgIHZhbHVlID0gKFVJTlQpLTE7IC8qIHBlYWsgYml0cmF0ZSBwYXJhbWV0ZXIgaXMgbWVhbmluZ2xlc3MgKi8KLSAgICAgICAgaWYgKCAoKElOVCloQWFjRW5jb2Rlci0+ZXh0UGFyYW0udXNlclBlYWtCaXRyYXRlIT0tMSkgKSB7Ci0gICAgICAgICAgdmFsdWUgPSAoVUlOVCkoZk1heCgoSU5UKWhBYWNFbmNvZGVyLT5leHRQYXJhbS51c2VyUGVha0JpdHJhdGUsIGhBYWNFbmNvZGVyLT5hYWNDb25maWcuYml0UmF0ZSkpOyAvKiBwZWFrIGJpdHJhdGUgcGFyYW1ldGVyIGlzIGluIHVzZSAqLwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvL2VyciA9IE1QU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgIHZhbHVlID0gKFVJTlQpaEFhY0VuY29kZXItPmFhY0NvbmZpZy5hdWRpb09iamVjdFR5cGU7CiAgICAgICBicmVhazsKLSAgICB9ICAvKiBzd2l0Y2gocGFyYW0pICovCisgICAgY2FzZSBBQUNFTkNfQklUUkFURToKKyAgICAgIHN3aXRjaCAoaEFhY0VuY29kZXItPmFhY0NvbmZpZy5iaXRyYXRlTW9kZSkgeworICAgICAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0NCUjoKKyAgICAgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5hYWNDb25maWcuYml0UmF0ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB2YWx1ZSA9IChVSU5UKS0xOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQklUUkFURU1PREU6CisgICAgICB2YWx1ZSA9IChVSU5UKSgoaEFhY0VuY29kZXItPmFhY0NvbmZpZy5iaXRyYXRlTW9kZSAhPSBBQUNFTkNfQlJfTU9ERV9GRikKKyAgICAgICAgICAgICAgICAgICAgICAgICA/IGhBYWNFbmNvZGVyLT5hYWNDb25maWcuYml0cmF0ZU1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IEFBQ0VOQ19CUl9NT0RFX0NCUik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19TQU1QTEVSQVRFOgorICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+Y29kZXJDb25maWcuZXh0U2FtcGxpbmdSYXRlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQ0hBTk5FTE1PREU6CisgICAgICBpZiAoKE1PREVfMSA9PSBoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmNoYW5uZWxNb2RlKSAmJgorICAgICAgICAgIChoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLnN5bnRheEZsYWdzICYgQUNfTERfTVBTKSkgeworICAgICAgICB2YWx1ZSA9IE1PREVfMjEyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmNoYW5uZWxNb2RlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQkFORFdJRFRIOgorICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+YWFjQ29uZmlnLmJhbmRXaWR0aDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX0NIQU5ORUxPUkRFUjoKKyAgICAgIHZhbHVlID0gKFVJTlQpaEFhY0VuY29kZXItPmFhY0NvbmZpZy5jaGFubmVsT3JkZXI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19BRlRFUkJVUk5FUjoKKyAgICAgIHZhbHVlID0gKFVJTlQpaEFhY0VuY29kZXItPmFhY0NvbmZpZy51c2VSZXF1YW50OworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfR1JBTlVMRV9MRU5HVEg6CisgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5hYWNDb25maWcuZnJhbWVsZW5ndGg7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19TQlJfUkFUSU86CisgICAgICB2YWx1ZSA9IGlzU2JyQWN0aXZlKCZoQWFjRW5jb2Rlci0+YWFjQ29uZmlnKQorICAgICAgICAgICAgICAgICAgPyBoQWFjRW5jb2Rlci0+YWFjQ29uZmlnLnNiclJhdGlvCisgICAgICAgICAgICAgICAgICA6IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19TQlJfTU9ERToKKyAgICAgIHZhbHVlID0KKyAgICAgICAgICAoVUlOVCkoaEFhY0VuY29kZXItPmFhY0NvbmZpZy5zeW50YXhGbGFncyAmIEFDX1NCUl9QUkVTRU5UKSA/IDEgOiAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfVFJBTlNNVVg6CisgICAgICB2YWx1ZSA9IChVSU5UKXNldHRpbmdzLT51c2VyVHBUeXBlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfU0lHTkFMSU5HX01PREU6CisgICAgICB2YWx1ZSA9IChVSU5UKWdldFNiclNpZ25hbGluZ01vZGUoCisgICAgICAgICAgaEFhY0VuY29kZXItPmFhY0NvbmZpZy5hdWRpb09iamVjdFR5cGUsIHNldHRpbmdzLT51c2VyVHBUeXBlLAorICAgICAgICAgIHNldHRpbmdzLT51c2VyVHBTaWduYWxpbmcsIGhBYWNFbmNvZGVyLT5hYWNDb25maWcuc2JyUmF0aW8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfUFJPVEVDVElPTjoKKyAgICAgIHZhbHVlID0gKFVJTlQpc2V0dGluZ3MtPnVzZXJUcFByb3RlY3Rpb247CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19IRUFERVJfUEVSSU9EOgorICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+Y29kZXJDb25maWcuaGVhZGVyUGVyaW9kOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQVVESU9NVVhWRVI6CisgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5hYWNDb25maWcuYXVkaW9NdXhWZXJzaW9uOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfVFBTVUJGUkFNRVM6CisgICAgICB2YWx1ZSA9IChVSU5UKXNldHRpbmdzLT51c2VyVHBOc3ViRnJhbWVzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfQU5DSUxMQVJZX0JJVFJBVEU6CisgICAgICB2YWx1ZSA9IChVSU5UKWhBYWNFbmNvZGVyLT5hYWNDb25maWcuYW5jX1JhdGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19DT05UUk9MX1NUQVRFOgorICAgICAgdmFsdWUgPSAoVUlOVCloQWFjRW5jb2Rlci0+SW5pdEZsYWdzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfTUVUQURBVEFfTU9ERToKKyAgICAgIHZhbHVlID0gKGhBYWNFbmNvZGVyLT5tZXRhRGF0YUFsbG93ZWQgPT0gMCkKKyAgICAgICAgICAgICAgICAgID8gMAorICAgICAgICAgICAgICAgICAgOiAoVUlOVClzZXR0aW5ncy0+dXNlck1ldGFEYXRhTW9kZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX1BFQUtfQklUUkFURToKKyAgICAgIHZhbHVlID0gKFVJTlQpLTE7IC8qIHBlYWsgYml0cmF0ZSBwYXJhbWV0ZXIgaXMgbWVhbmluZ2xlc3MgKi8KKyAgICAgIGlmICgoKElOVCloQWFjRW5jb2Rlci0+ZXh0UGFyYW0udXNlclBlYWtCaXRyYXRlICE9IC0xKSkgeworICAgICAgICB2YWx1ZSA9CisgICAgICAgICAgICAoVUlOVCkoZk1heCgoSU5UKWhBYWNFbmNvZGVyLT5leHRQYXJhbS51c2VyUGVha0JpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jb2Rlci0+YWFjQ29uZmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJpdFJhdGUpKTsgLyogcGVhayBiaXRyYXRlIHBhcmFtZXRlciBpcyBpbiB1c2UgKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8vIGVyciA9IE1QU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgIGJyZWFrOworICB9IC8qIHN3aXRjaChwYXJhbSkgKi8KIAogYmFpbDoKLSAgICByZXR1cm4gdmFsdWU7CisgIHJldHVybiB2YWx1ZTsKIH0KIAotQUFDRU5DX0VSUk9SIGFhY0VuY0luZm8oCi0gICAgICAgIGNvbnN0IEhBTkRMRV9BQUNFTkNPREVSICAgaEFhY0VuY29kZXIsCi0gICAgICAgIEFBQ0VOQ19JbmZvU3RydWN0ICAgICAgICAqcEluZm8KLSAgICAgICAgKQotewotICAgIEFBQ0VOQ19FUlJPUiBlcnIgPSBBQUNFTkNfT0s7CitBQUNFTkNfRVJST1IgYWFjRW5jSW5mbyhjb25zdCBIQU5ETEVfQUFDRU5DT0RFUiBoQWFjRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0VOQ19JbmZvU3RydWN0ICpwSW5mbykgeworICBBQUNFTkNfRVJST1IgZXJyID0gQUFDRU5DX09LOwogCi0gICAgRkRLbWVtY2xlYXIocEluZm8sIHNpemVvZihBQUNFTkNfSW5mb1N0cnVjdCkpOwotICAgIHBJbmZvLT5jb25mU2l6ZSA9IDY0OyAvKiBwcmUtaW5pdGlhbGl6ZSAqLworICBGREttZW1jbGVhcihwSW5mbywgc2l6ZW9mKEFBQ0VOQ19JbmZvU3RydWN0KSk7CisgIHBJbmZvLT5jb25mU2l6ZSA9IDY0OyAvKiBwcmUtaW5pdGlhbGl6ZSAqLwogCi0gICAgcEluZm8tPm1heE91dEJ1ZkJ5dGVzICAgID0gKChoQWFjRW5jb2Rlci0+bk1heEFhY0NoYW5uZWxzKjYxNDQpKzcpPj4zOwotICAgIHBJbmZvLT5tYXhBbmNCeXRlcyAgICAgICA9IGhBYWNFbmNvZGVyLT5hYWNDb25maWcubWF4QW5jQnl0ZXNQZXJBVTsKLSAgICBwSW5mby0+aW5CdWZGaWxsTGV2ZWwgICAgPSBoQWFjRW5jb2Rlci0+blNhbXBsZXNSZWFkL2hBYWNFbmNvZGVyLT5leHRQYXJhbS5uQ2hhbm5lbHM7Ci0gICAgcEluZm8tPmlucHV0Q2hhbm5lbHMgICAgID0gaEFhY0VuY29kZXItPmV4dFBhcmFtLm5DaGFubmVsczsKLSAgICBwSW5mby0+ZnJhbWVMZW5ndGggICAgICAgPSBoQWFjRW5jb2Rlci0+blNhbXBsZXNUb1JlYWQvaEFhY0VuY29kZXItPmV4dFBhcmFtLm5DaGFubmVsczsKLSAgICBwSW5mby0+ZW5jb2RlckRlbGF5ICAgICAgPSBoQWFjRW5jb2Rlci0+bkRlbGF5L2hBYWNFbmNvZGVyLT5leHRQYXJhbS5uQ2hhbm5lbHM7CisgIHBJbmZvLT5tYXhPdXRCdWZCeXRlcyA9ICgoaEFhY0VuY29kZXItPm5NYXhBYWNDaGFubmVscyAqIDYxNDQpICsgNykgPj4gMzsKKyAgcEluZm8tPm1heEFuY0J5dGVzID0gaEFhY0VuY29kZXItPmFhY0NvbmZpZy5tYXhBbmNCeXRlc1BlckFVOworICBwSW5mby0+aW5CdWZGaWxsTGV2ZWwgPQorICAgICAgaEFhY0VuY29kZXItPm5TYW1wbGVzUmVhZCAvIGhBYWNFbmNvZGVyLT5leHRQYXJhbS5uQ2hhbm5lbHM7CisgIHBJbmZvLT5pbnB1dENoYW5uZWxzID0gaEFhY0VuY29kZXItPmV4dFBhcmFtLm5DaGFubmVsczsKKyAgcEluZm8tPmZyYW1lTGVuZ3RoID0KKyAgICAgIGhBYWNFbmNvZGVyLT5uU2FtcGxlc1RvUmVhZCAvIGhBYWNFbmNvZGVyLT5leHRQYXJhbS5uQ2hhbm5lbHM7CisgIHBJbmZvLT5uRGVsYXkgPSBoQWFjRW5jb2Rlci0+bkRlbGF5OworICBwSW5mby0+bkRlbGF5Q29yZSA9IGhBYWNFbmNvZGVyLT5uRGVsYXlDb3JlOwogCi0gICAgLyogR2V0IGVuY29kZXIgY29uZmlndXJhdGlvbiAqLwotICAgIGlmICggYWFjRW5jR2V0Q29uZihoQWFjRW5jb2RlciwgJnBJbmZvLT5jb25mU2l6ZSwgJnBJbmZvLT5jb25mQnVmWzBdKSAhPSBBQUNfRU5DX09LKSB7Ci0gICAgICAgIGVyciA9IEFBQ0VOQ19JTklUX0VSUk9SOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgfQorICAvKiBHZXQgZW5jb2RlciBjb25maWd1cmF0aW9uICovCisgIGlmIChhYWNFbmNHZXRDb25mKGhBYWNFbmNvZGVyLCAmcEluZm8tPmNvbmZTaXplLCAmcEluZm8tPmNvbmZCdWZbMF0pICE9CisgICAgICBBQUNfRU5DX09LKSB7CisgICAgZXJyID0gQUFDRU5DX0lOSVRfRVJST1I7CisgICAgZ290byBiYWlsOworICB9CiBiYWlsOgotICAgIHJldHVybiBlcnI7CisgIHJldHVybiBlcnI7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX3Bucy5jcHAgYi9saWJBQUNlbmMvc3JjL2FhY2VuY19wbnMuY3BwCmluZGV4IGI5NjQwZDkuLmYwNTcxZDYgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX3Bucy5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9hYWNlbmNfcG5zLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw0MyArOTAsMzcgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gTG9od2Fzc2VyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogcG5zLmMKKyAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IHBucy5jCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJhYWNlbmNfcG5zLmgiCisKICNpbmNsdWRlICJwc3lfZGF0YS5oIgogI2luY2x1ZGUgInBuc3BhcmFtLmgiCiAjaW5jbHVkZSAibm9pc2VkZXQuaCIKICNpbmNsdWRlICJiaXRfY250LmgiCiAjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCiAKLQogLyogbWluQ29ycmVsYXRpb25FbmVyZ3kgPSAoMS4wZS0xMGYpXjIgfiAyXi02NyA9IDJeLTQ3ICogMl4tMjAgKi8KLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBtaW5Db3JyZWxhdGlvbkVuZXJneSA9IEZMMkZYQ09OU1RfREJMKDAuMCk7IC8qIEZMMkZYQ09OU1RfREJMKChmbG9hdClGREtwb3coMi4wLC00NykpOyAqLworc3RhdGljIGNvbnN0IEZJWFBfREJMIG1pbkNvcnJlbGF0aW9uRW5lcmd5ID0KKyAgICBGTDJGWENPTlNUX0RCTCgwLjApOyAvKiBGTDJGWENPTlNUX0RCTCgoZmxvYXQpRkRLcG93KDIuMCwtNDcpKTsgKi8KIC8qIG5vaXNlQ29ycmVsYXRpb25UaHJlc2ggPSAwLjZeMiAqLwogc3RhdGljIGNvbnN0IEZJWFBfREJMIG5vaXNlQ29ycmVsYXRpb25UaHJlc2ggPSBGTDJGWENPTlNUX0RCTCgwLjM2KTsKIAotc3RhdGljIHZvaWQgRkRLYWFjRW5jX0ZES2FhY0VuY19ub2lzZURldGVjdGlvbiggUE5TX0NPTkZJRyAgKnBuc0NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5TX0RBVEEgICAgKnBuc0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgc2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgIHRuc09yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIHRuc1ByZWRpY3Rpb25HYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIHRuc0FjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICpzZmJNYXhTY2FsZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgICAgKnNmYnRvbmFsaXR5ICk7CitzdGF0aWMgdm9pZCBGREthYWNFbmNfRkRLYWFjRW5jX25vaXNlRGV0ZWN0aW9uKAorICAgIFBOU19DT05GSUcgKnBuc0NvbmYsIFBOU19EQVRBICpwbnNEYXRhLCBjb25zdCBJTlQgc2ZiQWN0aXZlLAorICAgIGNvbnN0IElOVCAqc2ZiT2Zmc2V0LCBJTlQgdG5zT3JkZXIsIElOVCB0bnNQcmVkaWN0aW9uR2FpbiwgSU5UIHRuc0FjdGl2ZSwKKyAgICBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLCBJTlQgKnNmYk1heFNjYWxlU3BlYywgRklYUF9TR0wgKnNmYnRvbmFsaXR5KTsKIAotc3RhdGljIHZvaWQgRkRLYWFjRW5jX0NhbGNOb2lzZU5yZ3MoIGNvbnN0IElOVCAgIHNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICpwbnNGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKnNmYkVuZXJneUxkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICpub2lzZU5yZyApOworc3RhdGljIHZvaWQgRkRLYWFjRW5jX0NhbGNOb2lzZU5yZ3MoY29uc3QgSU5UIHNmYkFjdGl2ZSwgSU5UICpwbnNGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNmYkVuZXJneUxkRGF0YSwgSU5UICpub2lzZU5yZyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCkBAIC0xMjksMjggKzEzNCwxNSBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRQbnNDb25maWd1cmF0aW9uKFBOU19DT05GSUcgKnBuc0NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIHVzZVBucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG51bUNoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgaXNMQykKLXsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0UG5zQ29uZmlndXJhdGlvbigKKyAgICBQTlNfQ09ORklHICpwbnNDb25mLCBJTlQgYml0UmF0ZSwgSU5UIHNhbXBsZVJhdGUsIElOVCB1c2VQbnMsIElOVCBzZmJDbnQsCisgICAgY29uc3QgSU5UICpzZmJPZmZzZXQsIGNvbnN0IElOVCBudW1DaGFuLCBjb25zdCBJTlQgaXNMQykgewogICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKIAogICAvKiBpbml0IG5vaXNlIGRldGVjdGlvbiAqLwotICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19HZXRQbnNQYXJhbSgmcG5zQ29uZi0+bnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlUG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1DaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xDKTsKLSAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCi0gICAgcmV0dXJuIEVycm9yU3RhdHVzOworICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19HZXRQbnNQYXJhbSgmcG5zQ29uZi0+bnAsIGJpdFJhdGUsIHNhbXBsZVJhdGUsIHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0LCAmdXNlUG5zLCBudW1DaGFuLCBpc0xDKTsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIHJldHVybiBFcnJvclN0YXR1czsKIAogICBwbnNDb25mLT5taW5Db3JyZWxhdGlvbkVuZXJneSA9IG1pbkNvcnJlbGF0aW9uRW5lcmd5OwogICBwbnNDb25mLT5ub2lzZUNvcnJlbGF0aW9uVGhyZXNoID0gbm9pc2VDb3JyZWxhdGlvblRocmVzaDsKQEAgLTE2MCw4ICsxNTIsNiBAQAogICByZXR1cm4gQUFDX0VOQ19PSzsKIH0KIAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfUG5zRGV0ZWN0CkBAIC0xODAsNzMgKzE3MCw1NSBAQAogICAgIG91dHB1dDogICAgICAgcG5zRmxhZyBpbiBwbnMgZGF0YSBzdHJ1Y3R1cmUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEZES2FhY0VuY19QbnNEZXRlY3QoUE5TX0NPTkZJRyAgKnBuc0NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUE5TX0RBVEEgICAgKnBuc0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgIGxhc3RXaW5kb3dTZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgc2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqc2ZiVGhyZXNob2xkTGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqc2ZiTWF4U2NhbGVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICAgICpzZmJ0b25hbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgdG5zT3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgIHRuc1ByZWRpY3Rpb25HYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICB0bnNBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKnNmYkVuZXJneUxkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqbm9pc2VOcmcgKQordm9pZCBGREthYWNFbmNfUG5zRGV0ZWN0KFBOU19DT05GSUcgKnBuc0NvbmYsIFBOU19EQVRBICpwbnNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBsYXN0V2luZG93U2VxdWVuY2UsIGNvbnN0IElOVCBzZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG1heFNmYlBlckdyb3VwLCBGSVhQX0RCTCAqc2ZiVGhyZXNob2xkTGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqc2ZiT2Zmc2V0LCBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2ZiTWF4U2NhbGVTcGVjLCBGSVhQX1NHTCAqc2ZidG9uYWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRuc09yZGVyLCBJTlQgdG5zUHJlZGljdGlvbkdhaW4sIElOVCB0bnNBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNmYkVuZXJneUxkRGF0YSwgSU5UICpub2lzZU5yZykKIAogewogICBpbnQgc2ZiOwogICBpbnQgc3RhcnROb2lzZVNmYjsKIAotICBpZiAocG5zQ29uZi0+bnAuZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3MgJiBJU19MT1dfQ09NTEVYSVRZKSB7Ci0gICAgaWYgKCAoIXBuc0NvbmYtPnVzZVBucykgfHwgICAgICAgICAgICAgIC8qIHBucyBlbmFibGVkPyAqLwotICAgICAgICAgICAobGFzdFdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykgKSAvKiBjdXJyZW50bHkgb25seSBsb25nIGJsb2NrcyAqLwotICAgIHsKLSAgICAgIEZES21lbWNsZWFyKHBuc0RhdGEtPnBuc0ZsYWcsIE1BWF9HUk9VUEVEX1NGQipzaXplb2YoSU5UKSk7IC8qIGNsZWFyIGFsbCBwbnNGbGFncyAqLwotICAgICAgZm9yIChzZmI9MDsgc2ZiPE1BWF9HUk9VUEVEX1NGQjsgc2ZiKyspIHsKLSAgICAgICAgICBub2lzZU5yZ1tzZmJdID0gTk9fTk9JU0VfUE5TOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIG5yZydzIG9mIHByZXZpb3VzIGZyYW1lICovCi0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQorICAvKiBSZXNldCBwbnMgaW5mby4gKi8KKyAgRkRLbWVtY2xlYXIocG5zRGF0YS0+cG5zRmxhZywgc2l6ZW9mKHBuc0RhdGEtPnBuc0ZsYWcpKTsKKyAgZm9yIChzZmIgPSAwOyBzZmIgPCBNQVhfR1JPVVBFRF9TRkI7IHNmYisrKSB7CisgICAgbm9pc2VOcmdbc2ZiXSA9IE5PX05PSVNFX1BOUzsKICAgfQotICBlbHNlIHsKLSAgICBpZighcG5zQ29uZi0+dXNlUG5zKQotICAgICAgcmV0dXJuOwogCi0gICAgLyogUE5TIG9ubHkgZm9yIGxvbmcgV2luZG93cyAqLwotICAgIGlmIChwbnNDb25mLT5ucC5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyAmIEpVU1RfTE9OR19XSU5ET1cpIHsKLSAgICAgIGlmKGxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBMT05HX1dJTkRPVykgewotICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspIHsKLSAgICAgICAgICBwbnNEYXRhLT5wbnNGbGFnW3NmYl0gPSAwOyAgICAvKiBjbGVhciBhbGwgcG5zRmxhZ3MgKi8KLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgICB9CisgIC8qIERpc2FibGUgUE5TIGFuZCBza2lwIGRldGVjdGlvbiBpbiBjZXJ0YWluIGNhc2VzLiAqLworICBpZiAocG5zQ29uZi0+dXNlUG5zID09IDApIHsKKyAgICByZXR1cm47CisgIH0gZWxzZSB7CisgICAgLyogQUFDIC0gTEMgY29yZSBlbmNvZGVyICovCisgICAgaWYgKChwbnNDb25mLT5ucC5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyAmIElTX0xPV19DT01QTEVYSVRZKSAmJgorICAgICAgICAobGFzdFdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogQUFDIC0gKEUpTEQgY29yZSBlbmNvZGVyICovCisgICAgaWYgKCEocG5zQ29uZi0+bnAuZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3MgJiBJU19MT1dfQ09NUExFWElUWSkgJiYKKyAgICAgICAgKHBuc0NvbmYtPm5wLmRldGVjdGlvbkFsZ29yaXRobUZsYWdzICYgSlVTVF9MT05HX1dJTkRPVykgJiYKKyAgICAgICAgKGxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBMT05HX1dJTkRPVykpIHsKKyAgICAgIHJldHVybjsKICAgICB9CiAgIH0KKwogICAvKgogICAgIGNhbGwgbm9pc2UgZGV0ZWN0aW9uCiAgICovCi0gIEZES2FhY0VuY19GREthYWNFbmNfbm9pc2VEZXRlY3Rpb24oIHBuc0NvbmYsCi0gICAgICAgICAgICAgICAgICBwbnNEYXRhLAotICAgICAgICAgICAgICAgICAgc2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgdG5zT3JkZXIsCi0gICAgICAgICAgICAgICAgICB0bnNQcmVkaWN0aW9uR2FpbiwKLSAgICAgICAgICAgICAgICAgIHRuc0FjdGl2ZSwKLSAgICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgIHNmYk1heFNjYWxlU3BlYywKLSAgICAgICAgICAgICAgICAgIHNmYnRvbmFsaXR5ICk7CisgIEZES2FhY0VuY19GREthYWNFbmNfbm9pc2VEZXRlY3Rpb24oCisgICAgICBwbnNDb25mLCBwbnNEYXRhLCBzZmJBY3RpdmUsIHNmYk9mZnNldCwgdG5zT3JkZXIsIHRuc1ByZWRpY3Rpb25HYWluLAorICAgICAgdG5zQWN0aXZlLCBtZGN0U3BlY3RydW0sIHNmYk1heFNjYWxlU3BlYywgc2ZidG9uYWxpdHkpOwogCiAgIC8qIHNldCBzdGFydE5vaXNlU2ZiIChsb25nKSAqLwogICBzdGFydE5vaXNlU2ZiID0gcG5zQ29uZi0+bnAuc3RhcnRTZmI7CiAKICAgLyogU2V0IG5vaXNlIHN1YnN0aXR1dGlvbiBzdGF0dXMgKi8KLSAgZm9yKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspIHsKLQorICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspIHsKICAgICAvKiBObyBQTlMgYmVsb3cgc3RhcnROb2lzZVNmYiAqLwotICAgIGlmKHNmYiA8IHN0YXJ0Tm9pc2VTZmIpeworICAgIGlmIChzZmIgPCBzdGFydE5vaXNlU2ZiKSB7CiAgICAgICBwbnNEYXRhLT5wbnNGbGFnW3NmYl0gPSAwOwogICAgICAgY29udGludWU7CiAgICAgfQpAQCAtMjU4LDE3ICsyMzAsMTcgQEAKICAgICAgIHNpZ25hbCBpbiBjb2RlciBiYW5kIGlzIG5vdCBtYXNrZWQKICAgICAqLwogCi0gICAgaWYoKHBuc0RhdGEtPm5vaXNlRnV6enlNZWFzdXJlW3NmYl0gPiBGTDJGWENPTlNUX1NHTCgwLjUpKSAmJgotICAgICAgICggKHNmYlRocmVzaG9sZExkRGF0YVtzZmJdICsgRkwyRlhDT05TVF9EQkwoMC41ODQ5NjI1Zi82NC4wZikpICAvKiB0aHIgKiAxLjUgPSB0aHJMZCArbGQoMS41KS82NCAqLwotICAgICAgICAgPCBzZmJFbmVyZ3lMZERhdGFbc2ZiXSApICkKLSAgICB7CisgICAgaWYgKChwbnNEYXRhLT5ub2lzZUZ1enp5TWVhc3VyZVtzZmJdID4gRkwyRlhDT05TVF9TR0woMC41KSkgJiYKKyAgICAgICAgKChzZmJUaHJlc2hvbGRMZERhdGFbc2ZiXSArCisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC41ODQ5NjI1ZiAvCisgICAgICAgICAgICAgICAgICAgICAgICAgNjQuMGYpKSAvKiB0aHIgKiAxLjUgPSB0aHJMZCArbGQoMS41KS82NCAqLworICAgICAgICAgPCBzZmJFbmVyZ3lMZERhdGFbc2ZiXSkpIHsKICAgICAgIC8qCiAgICAgICAgIG1hcmsgaW4gcHN5b3V0IGZsYWcgYXJyYXkgdGhhdCB3ZSB3aWxsIGNvZGUKICAgICAgICAgdGhpcyBiYW5kIHdpdGggUE5TCiAgICAgICAqLwogICAgICAgcG5zRGF0YS0+cG5zRmxhZ1tzZmJdID0gMTsgLyogUE5TX09OICovCi0gICAgfQotICAgIGVsc2V7CisgICAgfSBlbHNlIHsKICAgICAgIHBuc0RhdGEtPnBuc0ZsYWdbc2ZiXSA9IDA7IC8qIFBOU19PRkYgKi8KICAgICB9CiAKQEAgLTI3Niw1MCArMjQ4LDQ5IEBACiAgIH0KIAogICAvKiBhdm9pZCBQTlMgaG9sZXMgKi8KLSAgaWYoKHBuc0RhdGEtPm5vaXNlRnV6enlNZWFzdXJlWzBdPkZMMkZYQ09OU1RfU0dMKDAuNWYpKSAmJiAocG5zRGF0YS0+cG5zRmxhZ1sxXSkpIHsKKyAgaWYgKChwbnNEYXRhLT5ub2lzZUZ1enp5TWVhc3VyZVswXSA+IEZMMkZYQ09OU1RfU0dMKDAuNWYpKSAmJgorICAgICAgKHBuc0RhdGEtPnBuc0ZsYWdbMV0pKSB7CiAgICAgcG5zRGF0YS0+cG5zRmxhZ1swXSA9IDE7CiAgIH0KIAotICBmb3Ioc2ZiPTE7IHNmYjxtYXhTZmJQZXJHcm91cC0xOyBzZmIrKykgewotICAgIGlmKChwbnNEYXRhLT5ub2lzZUZ1enp5TWVhc3VyZVtzZmJdPnBuc0NvbmYtPm5wLmdhcEZpbGxUaHIpICYmCi0gICAgICAgKHBuc0RhdGEtPnBuc0ZsYWdbc2ZiLTFdKSAmJiAocG5zRGF0YS0+cG5zRmxhZ1tzZmIrMV0pKSB7CisgIGZvciAoc2ZiID0gMTsgc2ZiIDwgbWF4U2ZiUGVyR3JvdXAgLSAxOyBzZmIrKykgeworICAgIGlmICgocG5zRGF0YS0+bm9pc2VGdXp6eU1lYXN1cmVbc2ZiXSA+IHBuc0NvbmYtPm5wLmdhcEZpbGxUaHIpICYmCisgICAgICAgIChwbnNEYXRhLT5wbnNGbGFnW3NmYiAtIDFdKSAmJiAocG5zRGF0YS0+cG5zRmxhZ1tzZmIgKyAxXSkpIHsKICAgICAgIHBuc0RhdGEtPnBuc0ZsYWdbc2ZiXSA9IDE7CiAgICAgfQogICB9CiAKLSAgaWYobWF4U2ZiUGVyR3JvdXA+MCkgeworICBpZiAobWF4U2ZiUGVyR3JvdXAgPiAwKSB7CiAgICAgLyogYXZvaWQgUE5TIGhvbGUgKi8KLSAgICBpZigocG5zRGF0YS0+bm9pc2VGdXp6eU1lYXN1cmVbbWF4U2ZiUGVyR3JvdXAtMV0+cG5zQ29uZi0+bnAuZ2FwRmlsbFRocikgJiYgKHBuc0RhdGEtPnBuc0ZsYWdbbWF4U2ZiUGVyR3JvdXAtMl0pKSB7Ci0gICAgICBwbnNEYXRhLT5wbnNGbGFnW21heFNmYlBlckdyb3VwLTFdID0gMTsKKyAgICBpZiAoKHBuc0RhdGEtPm5vaXNlRnV6enlNZWFzdXJlW21heFNmYlBlckdyb3VwIC0gMV0gPgorICAgICAgICAgcG5zQ29uZi0+bnAuZ2FwRmlsbFRocikgJiYKKyAgICAgICAgKHBuc0RhdGEtPnBuc0ZsYWdbbWF4U2ZiUGVyR3JvdXAgLSAyXSkpIHsKKyAgICAgIHBuc0RhdGEtPnBuc0ZsYWdbbWF4U2ZiUGVyR3JvdXAgLSAxXSA9IDE7CiAgICAgfQogICAgIC8qIGF2b2lkIHNpbmdsZSBQTlMgYmFuZCAqLwotICAgIGlmKHBuc0RhdGEtPnBuc0ZsYWdbbWF4U2ZiUGVyR3JvdXAtMl09PTApIHsKLSAgICAgIHBuc0RhdGEtPnBuc0ZsYWdbbWF4U2ZiUGVyR3JvdXAtMV0gPSAwOworICAgIGlmIChwbnNEYXRhLT5wbnNGbGFnW21heFNmYlBlckdyb3VwIC0gMl0gPT0gMCkgeworICAgICAgcG5zRGF0YS0+cG5zRmxhZ1ttYXhTZmJQZXJHcm91cCAtIDFdID0gMDsKICAgICB9CiAgIH0KIAogICAvKiBhdm9pZCBzaW5nbGUgUE5TIGJhbmRzICovCi0gIGlmKHBuc0RhdGEtPnBuc0ZsYWdbMV09PTApIHsKKyAgaWYgKHBuc0RhdGEtPnBuc0ZsYWdbMV0gPT0gMCkgewogICAgIHBuc0RhdGEtPnBuc0ZsYWdbMF0gPSAwOwogICB9CiAKLSAgZm9yKHNmYj0xOyBzZmI8bWF4U2ZiUGVyR3JvdXAtMTsgc2ZiKyspIHsKLSAgICBpZigocG5zRGF0YS0+cG5zRmxhZ1tzZmItMV09PTApJiYocG5zRGF0YS0+cG5zRmxhZ1tzZmIrMV09PTApKSB7CisgIGZvciAoc2ZiID0gMTsgc2ZiIDwgbWF4U2ZiUGVyR3JvdXAgLSAxOyBzZmIrKykgeworICAgIGlmICgocG5zRGF0YS0+cG5zRmxhZ1tzZmIgLSAxXSA9PSAwKSAmJiAocG5zRGF0YS0+cG5zRmxhZ1tzZmIgKyAxXSA9PSAwKSkgewogICAgICAgcG5zRGF0YS0+cG5zRmxhZ1tzZmJdID0gMDsKICAgICB9CiAgIH0KIAotCiAgIC8qCiAgICAgY2FsY3VsYXRlIG5vaXNlTnJnJ3MKICAgKi8KLSAgRkRLYWFjRW5jX0NhbGNOb2lzZU5yZ3MoIHNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgcG5zRGF0YS0+cG5zRmxhZywKLSAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5TGREYXRhLAotICAgICAgICAgICAgICAgICBub2lzZU5yZyApOworICBGREthYWNFbmNfQ2FsY05vaXNlTnJncyhzZmJBY3RpdmUsIHBuc0RhdGEtPnBuc0ZsYWcsIHNmYkVuZXJneUxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbm9pc2VOcmcpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOkZES2FhY0VuY19GREthYWNFbmNfbm9pc2VEZXRlY3Rpb24KQEAgLTMzNSw0OSArMzA2LDM2IEBACiAgICAgICAgICAgICAgICAgIGZsYWdzIHRvbmFsIC8gbm9udG9uYWwKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfRkRLYWFjRW5jX25vaXNlRGV0ZWN0aW9uKCBQTlNfQ09ORklHICAqcG5zQ29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfREFUQSAgICAqcG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBzZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgdG5zT3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgdG5zUHJlZGljdGlvbkdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgdG5zQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICptZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgKnNmYk1heFNjYWxlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAgICAqc2ZidG9uYWxpdHkgKQotewotICAgIElOVCBjb25kaXRpb24gPSBUUlVFOwotICAgIGlmICggIShwbnNDb25mLT5ucC5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyAmIElTX0xPV19DT01MRVhJVFkpICkgewotICAgICAgY29uZGl0aW9uID0gKHRuc09yZGVyID4gMyk7Ci0gICAgfQotICAgIC8qCi0gICAgbm8gUE5TIGlmIGhlYXZ5IFROUyBhY3Rpdml0eQotICAgIGNsZWFyIHBuc0RhdGEtPm5vaXNlRnV6enlNZWFzdXJlCi0gICAgKi8KLSAgICBpZigocG5zQ29uZi0+bnAuZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3MgJiBVU0VfVE5TX0dBSU5fVEhSKSAmJgorc3RhdGljIHZvaWQgRkRLYWFjRW5jX0ZES2FhY0VuY19ub2lzZURldGVjdGlvbigKKyAgICBQTlNfQ09ORklHICpwbnNDb25mLCBQTlNfREFUQSAqcG5zRGF0YSwgY29uc3QgSU5UIHNmYkFjdGl2ZSwKKyAgICBjb25zdCBJTlQgKnNmYk9mZnNldCwgaW50IHRuc09yZGVyLCBJTlQgdG5zUHJlZGljdGlvbkdhaW4sIElOVCB0bnNBY3RpdmUsCisgICAgRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSwgSU5UICpzZmJNYXhTY2FsZVNwZWMsIEZJWFBfU0dMICpzZmJ0b25hbGl0eSkgeworICBJTlQgY29uZGl0aW9uID0gVFJVRTsKKyAgaWYgKCEocG5zQ29uZi0+bnAuZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3MgJiBJU19MT1dfQ09NUExFWElUWSkpIHsKKyAgICBjb25kaXRpb24gPSAodG5zT3JkZXIgPiAzKTsKKyAgfQorICAvKgorICBubyBQTlMgaWYgaGVhdnkgVE5TIGFjdGl2aXR5CisgIGNsZWFyIHBuc0RhdGEtPm5vaXNlRnV6enlNZWFzdXJlCisgICovCisgIGlmICgocG5zQ29uZi0+bnAuZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3MgJiBVU0VfVE5TX0dBSU5fVEhSKSAmJgogICAgICAgKHRuc1ByZWRpY3Rpb25HYWluID49IHBuc0NvbmYtPm5wLnRuc0dhaW5UaHJlc2hvbGQpICYmIGNvbmRpdGlvbiAmJgotICAgICAgISgocG5zQ29uZi0+bnAuZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3MgJiBVU0VfVE5TX1BOUykgJiYgKHRuc1ByZWRpY3Rpb25HYWluID49IHBuc0NvbmYtPm5wLnRuc1BOU0dhaW5UaHJlc2hvbGQpICYmICh0bnNBY3RpdmUpKSApCi0gICAgewotICAgICAgICAvKiBjbGVhciBhbGwgbm9pc2VGdXp6eU1lYXN1cmUgKi8KLSAgICAgICAgRkRLbWVtY2xlYXIocG5zRGF0YS0+bm9pc2VGdXp6eU1lYXN1cmUsIHNmYkFjdGl2ZSpzaXplb2YoRklYUF9TR0wpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgY2FsbCBub2lzZSBkZXRlY3Rpb24sIG91dHB1dCBpbiBwbnNEYXRhLT5ub2lzZUZ1enp5TWVhc3VyZSwKLSAgICAgICAgdXNlIHJlYWwgbWRjdCBzcGVjdHJhbCBkYXRhCi0gICAgICAgICovCi0gICAgICAgIEZES2FhY0VuY19ub2lzZURldGVjdCggbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgc2ZiTWF4U2NhbGVTcGVjLAotICAgICAgICAgICAgc2ZiQWN0aXZlLAotICAgICAgICAgICAgc2ZiT2Zmc2V0LAotICAgICAgICAgICAgcG5zRGF0YS0+bm9pc2VGdXp6eU1lYXN1cmUsCi0gICAgICAgICAgICAmcG5zQ29uZi0+bnAsCi0gICAgICAgICAgICBzZmJ0b25hbGl0eSk7Ci0gICAgfQorICAgICAgISgocG5zQ29uZi0+bnAuZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3MgJiBVU0VfVE5TX1BOUykgJiYKKyAgICAgICAgKHRuc1ByZWRpY3Rpb25HYWluID49IHBuc0NvbmYtPm5wLnRuc1BOU0dhaW5UaHJlc2hvbGQpICYmCisgICAgICAgICh0bnNBY3RpdmUpKSkgeworICAgIC8qIGNsZWFyIGFsbCBub2lzZUZ1enp5TWVhc3VyZSAqLworICAgIEZES21lbWNsZWFyKHBuc0RhdGEtPm5vaXNlRnV6enlNZWFzdXJlLCBzZmJBY3RpdmUgKiBzaXplb2YoRklYUF9TR0wpKTsKKyAgfSBlbHNlIHsKKyAgICAvKgorICAgIGNhbGwgbm9pc2UgZGV0ZWN0aW9uLCBvdXRwdXQgaW4gcG5zRGF0YS0+bm9pc2VGdXp6eU1lYXN1cmUsCisgICAgdXNlIHJlYWwgbWRjdCBzcGVjdHJhbCBkYXRhCisgICAgKi8KKyAgICBGREthYWNFbmNfbm9pc2VEZXRlY3QobWRjdFNwZWN0cnVtLCBzZmJNYXhTY2FsZVNwZWMsIHNmYkFjdGl2ZSwgc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwbnNEYXRhLT5ub2lzZUZ1enp5TWVhc3VyZSwgJnBuc0NvbmYtPm5wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJ0b25hbGl0eSk7CisgIH0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTpGREthYWNFbmNfQ2FsY05vaXNlTnJncwpAQCAtMzkxLDIzICszNDksMjEgQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIEZES2FhY0VuY19DYWxjTm9pc2VOcmdzKCBjb25zdCBJTlQgICAgc2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgKlJFU1RSSUNUIHBuc0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqUkVTVFJJQ1Qgc2ZiRW5lcmd5TGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgKlJFU1RSSUNUIG5vaXNlTnJnICkKLXsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19DYWxjTm9pc2VOcmdzKGNvbnN0IElOVCBzZmJBY3RpdmUsIElOVCAqUkVTVFJJQ1QgcG5zRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBzZmJFbmVyZ3lMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKlJFU1RSSUNUIG5vaXNlTnJnKSB7CiAgIGludCBzZmI7Ci0gIElOVCB0bXAgPSAoLUxPR19OT1JNX1BDTSk8PDI7CisgIElOVCB0bXAgPSAoLUxPR19OT1JNX1BDTSkgPDwgMjsKIAotICBmb3Ioc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykgewotICAgIGlmKHBuc0ZsYWdbc2ZiXSkgewotICAgICAgSU5UIG5yZyA9ICgtc2ZiRW5lcmd5TGREYXRhW3NmYl0rRkwyRlhDT05TVF9EQkwoMC41Zi82NC4wZikpPj4oREZSQUNUX0JJVFMtMS03KTsKKyAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKSB7CisgICAgaWYgKHBuc0ZsYWdbc2ZiXSkgeworICAgICAgSU5UIG5yZyA9ICgtc2ZiRW5lcmd5TGREYXRhW3NmYl0gKyBGTDJGWENPTlNUX0RCTCgwLjVmIC8gNjQuMGYpKSA+PgorICAgICAgICAgICAgICAgIChERlJBQ1RfQklUUyAtIDEgLSA3KTsKICAgICAgIG5vaXNlTnJnW3NmYl0gPSB0bXAgLSBucmc7CiAgICAgfQogICB9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6RkRLYWFjRW5jX0NvZGVQbnNDaGFubmVsCkBAIC00MjIsMjAgKzM3OCwxOCBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBGREthYWNFbmNfQ29kZVBuc0NoYW5uZWwoY29uc3QgSU5UICAgICBzZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfQ09ORklHICAgICpwbnNDb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAqUkVTVFJJQ1QgcG5zRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKlJFU1RSSUNUIHNmYkVuZXJneUxkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgKlJFU1RSSUNUIG5vaXNlTnJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqUkVTVFJJQ1Qgc2ZiVGhyZXNob2xkTGREYXRhKQotewordm9pZCBGREthYWNFbmNfQ29kZVBuc0NoYW5uZWwoY29uc3QgSU5UIHNmYkFjdGl2ZSwgUE5TX0NPTkZJRyAqcG5zQ29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqUkVTVFJJQ1QgcG5zRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBzZmJFbmVyZ3lMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKlJFU1RSSUNUIG5vaXNlTnJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHNmYlRocmVzaG9sZExkRGF0YSkgewogICBJTlQgc2ZiOwogICBJTlQgbGFzdGlOb2lzZUVuZXJneSA9IDA7CiAgIElOVCBmaXJzdFBOU2JhbmQgPSAxOyAvKiBUUlVFIGZvciBmaXJzdCBQTlMtY29kZWQgYmFuZCAqLwogCiAgIC8qIG5vIFBOUyAqLwotICBpZighcG5zQ29uZi0+dXNlUG5zKSB7Ci0gICAgZm9yKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspIHsKKyAgaWYgKCFwbnNDb25mLT51c2VQbnMpIHsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspIHsKICAgICAgIC8qIG5vIFBOUyBjb2RpbmcgKi8KICAgICAgIG5vaXNlTnJnW3NmYl0gPSBOT19OT0lTRV9QTlM7CiAgICAgfQpAQCAtNDQzLDM0ICszOTcsMzIgQEAKICAgfQogCiAgIC8qIGNvZGUgUE5TICovCi0gIGZvcihzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKSB7Ci0gICAgaWYocG5zRmxhZ1tzZmJdKSB7CisgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykgeworICAgIGlmIChwbnNGbGFnW3NmYl0pIHsKICAgICAgIC8qIGhpZ2ggc2ZiVGhyZXNob2xkIGNhdXNlcyBwZSA9IDAgKi8KLSAgICAgIGlmKG5vaXNlTnJnW3NmYl0gIT0gTk9fTk9JU0VfUE5TKQotICAgICAgICBzZmJUaHJlc2hvbGRMZERhdGFbc2ZiXSA9IHNmYkVuZXJneUxkRGF0YVtzZmJdICsgRkwyRlhDT05TVF9EQkwoMS4wZi9MRF9EQVRBX1NDQUxJTkcpOworICAgICAgaWYgKG5vaXNlTnJnW3NmYl0gIT0gTk9fTk9JU0VfUE5TKQorICAgICAgICBzZmJUaHJlc2hvbGRMZERhdGFbc2ZiXSA9CisgICAgICAgICAgICBzZmJFbmVyZ3lMZERhdGFbc2ZiXSArIEZMMkZYQ09OU1RfREJMKDEuMGYgLyBMRF9EQVRBX1NDQUxJTkcpOwogCiAgICAgICAvKiBzZXQgbm9pc2VOcmcgaW4gdmFsaWQgcmVnaW9uICovCi0gICAgICBpZighZmlyc3RQTlNiYW5kKSB7CisgICAgICBpZiAoIWZpcnN0UE5TYmFuZCkgewogICAgICAgICBJTlQgZGVsdGFpTm9pc2VFbmVyZ3kgPSBub2lzZU5yZ1tzZmJdIC0gbGFzdGlOb2lzZUVuZXJneTsKIAotICAgICAgICBpZihkZWx0YWlOb2lzZUVuZXJneSA+IENPREVfQk9PS19QTlNfTEFWKQotICAgICAgICAgICAgbm9pc2VOcmdbc2ZiXSAtPSBkZWx0YWlOb2lzZUVuZXJneSAtIENPREVfQk9PS19QTlNfTEFWOwotICAgICAgICBlbHNlIGlmKGRlbHRhaU5vaXNlRW5lcmd5IDwgLUNPREVfQk9PS19QTlNfTEFWKQotICAgICAgICAgICAgbm9pc2VOcmdbc2ZiXSAtPSBkZWx0YWlOb2lzZUVuZXJneSArIENPREVfQk9PS19QTlNfTEFWOwotICAgICAgfQotICAgICAgZWxzZSB7CisgICAgICAgIGlmIChkZWx0YWlOb2lzZUVuZXJneSA+IENPREVfQk9PS19QTlNfTEFWKQorICAgICAgICAgIG5vaXNlTnJnW3NmYl0gLT0gZGVsdGFpTm9pc2VFbmVyZ3kgLSBDT0RFX0JPT0tfUE5TX0xBVjsKKyAgICAgICAgZWxzZSBpZiAoZGVsdGFpTm9pc2VFbmVyZ3kgPCAtQ09ERV9CT09LX1BOU19MQVYpCisgICAgICAgICAgbm9pc2VOcmdbc2ZiXSAtPSBkZWx0YWlOb2lzZUVuZXJneSArIENPREVfQk9PS19QTlNfTEFWOworICAgICAgfSBlbHNlIHsKICAgICAgICAgZmlyc3RQTlNiYW5kID0gMDsKICAgICAgIH0KICAgICAgIGxhc3RpTm9pc2VFbmVyZ3kgPSBub2lzZU5yZ1tzZmJdOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgLyogbm8gUE5TIGNvZGluZyAqLwogICAgICAgbm9pc2VOcmdbc2ZiXSA9IE5PX05PSVNFX1BOUzsKICAgICB9CiAgIH0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTpGREthYWNFbmNfUHJlUHJvY2Vzc1Buc0NoYW5uZWxQYWlyCkBAIC00ODYsMzcgKzQzOCw0MCBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBGREthYWNFbmNfUHJlUHJvY2Vzc1Buc0NoYW5uZWxQYWlyKGNvbnN0IElOVCAgIHNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICpSRVNUUklDVCBzZmJFbmVyZ3lMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKlJFU1RSSUNUIHNmYkVuZXJneVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKlJFU1RSSUNUIHNmYkVuZXJneUxlZnRMRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICpSRVNUUklDVCBzZmJFbmVyZ3lSaWdodExELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKlJFU1RSSUNUIHNmYkVuZXJneU1pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfQ09ORklHICpSRVNUUklDVCBwbnNDb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19EQVRBICAgKnBuc0RhdGFMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19EQVRBICAgKnBuc0RhdGFSaWdodCkKLXsKK3ZvaWQgRkRLYWFjRW5jX1ByZVByb2Nlc3NQbnNDaGFubmVsUGFpcigKKyAgICBjb25zdCBJTlQgc2ZiQWN0aXZlLCBGSVhQX0RCTCAqUkVTVFJJQ1Qgc2ZiRW5lcmd5TGVmdCwKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgc2ZiRW5lcmd5UmlnaHQsIEZJWFBfREJMICpSRVNUUklDVCBzZmJFbmVyZ3lMZWZ0TEQsCisgICAgRklYUF9EQkwgKlJFU1RSSUNUIHNmYkVuZXJneVJpZ2h0TEQsIEZJWFBfREJMICpSRVNUUklDVCBzZmJFbmVyZ3lNaWQsCisgICAgUE5TX0NPTkZJRyAqUkVTVFJJQ1QgcG5zQ29uZiwgUE5TX0RBVEEgKnBuc0RhdGFMZWZ0LAorICAgIFBOU19EQVRBICpwbnNEYXRhUmlnaHQpIHsKICAgSU5UIHNmYjsKICAgRklYUF9EQkwgY2NmOwogCi0gIGlmKCFwbnNDb25mLT51c2VQbnMpCi0gICAgcmV0dXJuOworICBpZiAoIXBuc0NvbmYtPnVzZVBucykgcmV0dXJuOwogCi0gIEZJWFBfREJMICpSRVNUUklDVCBwTm9pc2VFbmVyZ3lDb3JyZWxhdGlvbkwgPSBwbnNEYXRhTGVmdC0+bm9pc2VFbmVyZ3lDb3JyZWxhdGlvbjsKLSAgRklYUF9EQkwgKlJFU1RSSUNUIHBOb2lzZUVuZXJneUNvcnJlbGF0aW9uUiA9IHBuc0RhdGFSaWdodC0+bm9pc2VFbmVyZ3lDb3JyZWxhdGlvbjsKKyAgRklYUF9EQkwgKlJFU1RSSUNUIHBOb2lzZUVuZXJneUNvcnJlbGF0aW9uTCA9CisgICAgICBwbnNEYXRhTGVmdC0+bm9pc2VFbmVyZ3lDb3JyZWxhdGlvbjsKKyAgRklYUF9EQkwgKlJFU1RSSUNUIHBOb2lzZUVuZXJneUNvcnJlbGF0aW9uUiA9CisgICAgICBwbnNEYXRhUmlnaHQtPm5vaXNlRW5lcmd5Q29ycmVsYXRpb247CiAKLSAgZm9yKHNmYj0wO3NmYjwgc2ZiQWN0aXZlO3NmYisrKSB7Ci0gICAgRklYUF9EQkwgcXVvdCA9IChzZmJFbmVyZ3lMZWZ0TERbc2ZiXT4+MSkgKyAoc2ZiRW5lcmd5UmlnaHRMRFtzZmJdPj4xKTsKKyAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKSB7CisgICAgRklYUF9EQkwgcXVvdCA9IChzZmJFbmVyZ3lMZWZ0TERbc2ZiXSA+PiAxKSArIChzZmJFbmVyZ3lSaWdodExEW3NmYl0gPj4gMSk7CiAKLSAgICBpZihxdW90IDwgRkwyRlhDT05TVF9EQkwoLTMyLjBmLyhmbG9hdClMRF9EQVRBX1NDQUxJTkcpKQorICAgIGlmIChxdW90IDwgRkwyRlhDT05TVF9EQkwoLTMyLjBmIC8gKGZsb2F0KUxEX0RBVEFfU0NBTElORykpCiAgICAgICBjY2YgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICBlbHNlIHsKLSAgICAgIEZJWFBfREJMIGFjY3UgPSBzZmJFbmVyZ3lNaWRbc2ZiXS0gKCgoc2ZiRW5lcmd5TGVmdFtzZmJdPj4xKSsoc2ZiRW5lcmd5UmlnaHRbc2ZiXT4+MSkpPj4xKTsKLSAgICAgIElOVCBzaWduID0gKGFjY3UgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgPyAxIDogMCA7CisgICAgICBGSVhQX0RCTCBhY2N1ID0KKyAgICAgICAgICBzZmJFbmVyZ3lNaWRbc2ZiXSAtCisgICAgICAgICAgKCgoc2ZiRW5lcmd5TGVmdFtzZmJdID4+IDEpICsgKHNmYkVuZXJneVJpZ2h0W3NmYl0gPj4gMSkpID4+IDEpOworICAgICAgSU5UIHNpZ24gPSAoYWNjdSA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSA/IDEgOiAwOwogICAgICAgYWNjdSA9IGZpeHBfYWJzKGFjY3UpOwogCi0gICAgICBjY2YgPSBDYWxjTGREYXRhKGFjY3UpICsgRkwyRlhDT05TVF9EQkwoKGZsb2F0KTEuMGYvKGZsb2F0KUxEX0RBVEFfU0NBTElORykgLSBxdW90OyAgIC8qIGxkKGFjY3UqMikgPSBsZChhY2N1KSArIDEgKi8KLSAgICAgIGNjZiA9IChjY2Y+PUZMMkZYQ09OU1RfREJMKDAuMCkpID8gKChGSVhQX0RCTClNQVhWQUxfREJMKSA6IChzaWduKSA/IC1DYWxjSW52TGREYXRhKGNjZikgOiBDYWxjSW52TGREYXRhKGNjZik7CisgICAgICBjY2YgPSBDYWxjTGREYXRhKGFjY3UpICsKKyAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKChmbG9hdCkxLjBmIC8gKGZsb2F0KUxEX0RBVEFfU0NBTElORykgLQorICAgICAgICAgICAgcXVvdDsgLyogbGQoYWNjdSoyKSA9IGxkKGFjY3UpICsgMSAqLworICAgICAgY2NmID0gKGNjZiA+PSBGTDJGWENPTlNUX0RCTCgwLjApKQorICAgICAgICAgICAgICAgID8gKChGSVhQX0RCTClNQVhWQUxfREJMKQorICAgICAgICAgICAgICAgIDogKHNpZ24pID8gLUNhbGNJbnZMZERhdGEoY2NmKSA6IENhbGNJbnZMZERhdGEoY2NmKTsKICAgICB9CiAKICAgICBwTm9pc2VFbmVyZ3lDb3JyZWxhdGlvbkxbc2ZiXSA9IGNjZjsKQEAgLTUyNCw4ICs0NzksNiBAQAogICB9CiB9CiAKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTpGREthYWNFbmNfUG9zdFByb2Nlc3NQbnNDaGFubmVsUGFpcgpAQCAtNTQyLDMzICs0OTUsMjkgQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgRkRLYWFjRW5jX1Bvc3RQcm9jZXNzUG5zQ2hhbm5lbFBhaXIoY29uc3QgSU5UICAgc2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfQ09ORklHICAqcG5zQ29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5TX0RBVEEgICAgKnBuc0RhdGFMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfREFUQSAgICAqcG5zRGF0YVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqUkVTVFJJQ1QgbXNNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqbXNEaWdlc3QgKQotewordm9pZCBGREthYWNFbmNfUG9zdFByb2Nlc3NQbnNDaGFubmVsUGFpcihjb25zdCBJTlQgc2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfQ09ORklHICpwbnNDb25mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfREFUQSAqcG5zRGF0YUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19EQVRBICpwbnNEYXRhUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqUkVTVFJJQ1QgbXNNYXNrLCBJTlQgKm1zRGlnZXN0KSB7CiAgIElOVCBzZmI7CiAKLSAgaWYoIXBuc0NvbmYtPnVzZVBucykKLSAgICByZXR1cm47CisgIGlmICghcG5zQ29uZi0+dXNlUG5zKSByZXR1cm47CiAKLSAgZm9yKHNmYj0wO3NmYjxzZmJBY3RpdmU7c2ZiKyspIHsKKyAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKSB7CiAgICAgLyoKICAgICAgIE1TIHBvc3QgcHJvY2Vzc2luZwogICAgICovCi0gICAgaWYoIG1zTWFza1tzZmJdICkgewotICAgICAgaWYoIChwbnNEYXRhTGVmdC0+cG5zRmxhZ1tzZmJdKSAmJgotICAgICAgICAgIChwbnNEYXRhUmlnaHQtPnBuc0ZsYWdbc2ZiXSkgKSB7CisgICAgaWYgKG1zTWFza1tzZmJdKSB7CisgICAgICBpZiAoKHBuc0RhdGFMZWZ0LT5wbnNGbGFnW3NmYl0pICYmIChwbnNEYXRhUmlnaHQtPnBuc0ZsYWdbc2ZiXSkpIHsKICAgICAgICAgLyogQUFDIG9ubHk6IFN0YW5kYXJkICovCiAgICAgICAgIC8qIGRvIHRoaXMgdG8gYXZvaWQgbXMgZmxhZ3MgaW4gbGF5ZXJzIHRoYXQgc2hvdWxkIG5vdCBoYXZlIGl0ICovCi0gICAgICAgIGlmKHBuc0RhdGFMZWZ0LT5ub2lzZUVuZXJneUNvcnJlbGF0aW9uW3NmYl0gPD0gcG5zQ29uZi0+bm9pc2VDb3JyZWxhdGlvblRocmVzaCl7CisgICAgICAgIGlmIChwbnNEYXRhTGVmdC0+bm9pc2VFbmVyZ3lDb3JyZWxhdGlvbltzZmJdIDw9CisgICAgICAgICAgICBwbnNDb25mLT5ub2lzZUNvcnJlbGF0aW9uVGhyZXNoKSB7CiAgICAgICAgICAgbXNNYXNrW3NmYl0gPSAwOwogICAgICAgICAgICptc0RpZ2VzdCA9IE1TX1NPTUU7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgeworICAgICAgfSBlbHNlIHsKICAgICAgICAgLyoKICAgICAgICAgICBObyBQTlMgY29kaW5nCiAgICAgICAgICovCkBAIC01ODEsOCArNTMwLDkgQEAKICAgICAgIFVzZSBNUyBmbGFnIHRvIHNpZ25hbCBub2lzZSBjb3JyZWxhdGlvbiBpZgogICAgICAgcG5zIGlzIGFjdGl2ZSBpbiBib3RoIGNoYW5uZWxzCiAgICAgKi8KLSAgICBpZiggKHBuc0RhdGFMZWZ0LT5wbnNGbGFnW3NmYl0pICYmIChwbnNEYXRhUmlnaHQtPnBuc0ZsYWdbc2ZiXSkgKSB7Ci0gICAgICBpZihwbnNEYXRhTGVmdC0+bm9pc2VFbmVyZ3lDb3JyZWxhdGlvbltzZmJdID4gcG5zQ29uZi0+bm9pc2VDb3JyZWxhdGlvblRocmVzaCkgeworICAgIGlmICgocG5zRGF0YUxlZnQtPnBuc0ZsYWdbc2ZiXSkgJiYgKHBuc0RhdGFSaWdodC0+cG5zRmxhZ1tzZmJdKSkgeworICAgICAgaWYgKHBuc0RhdGFMZWZ0LT5ub2lzZUVuZXJneUNvcnJlbGF0aW9uW3NmYl0gPgorICAgICAgICAgIHBuc0NvbmYtPm5vaXNlQ29ycmVsYXRpb25UaHJlc2gpIHsKICAgICAgICAgbXNNYXNrW3NmYl0gPSAxOwogICAgICAgICAqbXNEaWdlc3QgPSBNU19TT01FOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9hYWNlbmNfcG5zLmggYi9saWJBQUNlbmMvc3JjL2FhY2VuY19wbnMuaAppbmRleCAzYmRhOWRlLi40OTM4ZmNmIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2FhY2VuY19wbnMuaAorKysgYi9saWJBQUNlbmMvc3JjL2FhY2VuY19wbnMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzNSArOTAsMzUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gTG9od2Fzc2VyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogcG5zLmgKKyAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IHBucy5oCiAKLSNpZm5kZWYgX19QTlNfSAotI2RlZmluZSBfX1BOU19ICisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFBQ0VOQ19QTlNfSAorI2RlZmluZSBBQUNFTkNfUE5TX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKLQogI2luY2x1ZGUgInBuc3BhcmFtLmgiCiAKICNkZWZpbmUgTk9fTk9JU0VfUE5TIEZES19JTlRfTUlOCiAKLXR5cGVkZWYgc3RydWN0ewordHlwZWRlZiBzdHJ1Y3QgewogICBOT0lTRVBBUkFNUyBucDsKICAgRklYUF9EQkwgbWluQ29ycmVsYXRpb25FbmVyZ3k7CiAgIEZJWFBfREJMIG5vaXNlQ29ycmVsYXRpb25UaHJlc2g7Ci0gIElOVCAgICAgIHVzZVBuczsKKyAgSU5UIHVzZVBuczsKIH0gUE5TX0NPTkZJRzsKIAotdHlwZWRlZiBzdHJ1Y3R7Cit0eXBlZGVmIHN0cnVjdCB7CiAgIEZJWFBfU0dMIG5vaXNlRnV6enlNZWFzdXJlW01BWF9HUk9VUEVEX1NGQl07CiAgIEZJWFBfREJMIG5vaXNlRW5lcmd5Q29ycmVsYXRpb25bTUFYX0dST1VQRURfU0ZCXTsKLSAgSU5UICAgICAgcG5zRmxhZ1tNQVhfR1JPVVBFRF9TRkJdOworICBJTlQgcG5zRmxhZ1tNQVhfR1JPVVBFRF9TRkJdOwogfSBQTlNfREFUQTsKIAotI2VuZGlmCisjZW5kaWYgLyogQUFDRU5DX1BOU19IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2FhY2VuY190bnMuY3BwIGIvbGliQUFDZW5jL3NyYy9hYWNlbmNfdG5zLmNwcAppbmRleCA5YTA3ZThmLi40NDYyNjAwIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2FhY2VuY190bnMuY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX3Rucy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIEFsZXggR3JvZXNjaGVsLCBUb2JpYXMgQ2hhbHVwa2EKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBUZW1wb3JhbCBub2lzZSBzaGFwaW5nCisgICBBdXRob3Iocyk6ICAgQWxleCBHcm9lc2NoZWwsIFRvYmlhcyBDaGFsdXBrYQogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogVGVtcG9yYWwgbm9pc2Ugc2hhcGluZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiYWFjZW5jX3Rucy5oIgogI2luY2x1ZGUgInBzeV9jb25zdC5oIgpAQCAtOTQsMTkyICsxMDYsMjEzIEBACiAjaW5jbHVkZSAidG5zX2Z1bmMuaCIKICNpbmNsdWRlICJhYWNFbmNfcm9tLmgiCiAjaW5jbHVkZSAiYWFjZW5jX3Rucy5oIgorI2luY2x1ZGUgIkZES19scGMuaCIKIAogI2RlZmluZSBGSUxURVJfRElSRUNUSU9OIDAgLyogMCA9IHVwLCAxID0gZG93biAqLwogCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgYWNmV2luZG93TG9uZ1sxMiszKzFdID0gewotICAweDdmZmZmZmZmLDB4N2ZiODAwMDAsMHg3ZWUwMDAwMCwweDdkNzgwMDAwLDB4N2I4MDAwMDAsMHg3OGY4MDAwMCwweDc1ZTAwMDAwLDB4NzIzODAwMDAsCi0gIDB4NmUwMDAwMDAsMHg2OTM4MDAwMCwweDYzZTAwMDAwLDB4NWRmODAwMDAsMHg1NzgwMDAwMCwweDUwNzgwMDAwLDB4NDhlMDAwMDAsMHg0MGI4MDAwMAotfTsKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBhY2ZXaW5kb3dMb25nWzEyICsgMyArIDFdID0geworICAgIDB4N2ZmZmZmZmYsIDB4N2ZiODAwMDAsIDB4N2VlMDAwMDAsIDB4N2Q3ODAwMDAsIDB4N2I4MDAwMDAsIDB4NzhmODAwMDAsCisgICAgMHg3NWUwMDAwMCwgMHg3MjM4MDAwMCwgMHg2ZTAwMDAwMCwgMHg2OTM4MDAwMCwgMHg2M2UwMDAwMCwgMHg1ZGY4MDAwMCwKKyAgICAweDU3ODAwMDAwLCAweDUwNzgwMDAwLCAweDQ4ZTAwMDAwLCAweDQwYjgwMDAwfTsKIAotc3RhdGljIGNvbnN0IEZJWFBfREJMIGFjZldpbmRvd1Nob3J0WzQrMysxXSA9IHsKLSAgMHg3ZmZmZmZmZiwweDdlMDAwMDAwLDB4NzgwMDAwMDAsMHg2ZTAwMDAwMCwweDYwMDAwMDAwLDB4NGUwMDAwMDAsMHgzODAwMDAwMCwweDFlMDAwMDAwCi19Oworc3RhdGljIGNvbnN0IEZJWFBfREJMIGFjZldpbmRvd1Nob3J0WzQgKyAzICsgMV0gPSB7CisgICAgMHg3ZmZmZmZmZiwgMHg3ZTAwMDAwMCwgMHg3ODAwMDAwMCwgMHg2ZTAwMDAwMCwKKyAgICAweDYwMDAwMDAwLCAweDRlMDAwMDAwLCAweDM4MDAwMDAwLCAweDFlMDAwMDAwfTsKIAotdHlwZWRlZiBzdHJ1Y3R7Ci0gIElOVCAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlRnJvbVsyXTsgIC8qIG5vbmVTYnI9MCwgdXNlU2JyPTEgKi8KLSAgSU5UICAgICAgICAgICAgICAgICAgICAgIGJpdFJhdGVUb1syXTsgICAgLyogbm9uZVNicj0wLCB1c2VTYnI9MSAqLwotICBUTlNfUEFSQU1FVEVSX1RBQlVMQVRFRCAgcGFyYW1UYWJbMl07ICAgICAvKiBtb25vPTAsIHN0ZXJlbz0xICovCit0eXBlZGVmIHN0cnVjdCB7CisgIElOVCBiaXRSYXRlRnJvbVsyXTsgICAgICAgICAgICAgICAgICAvKiBub25lU2JyPTAsIHVzZVNicj0xICovCisgIElOVCBiaXRSYXRlVG9bMl07ICAgICAgICAgICAgICAgICAgICAvKiBub25lU2JyPTAsIHVzZVNicj0xICovCisgIFROU19QQVJBTUVURVJfVEFCVUxBVEVEIHBhcmFtVGFiWzJdOyAvKiBtb25vPTAsIHN0ZXJlbz0xICovCiAKIH0gVE5TX0lORk9fVEFCOwogCi0jZGVmaW5lIFROU19USU1FUkVTX1NDQUxFICAgICgxKQotI2RlZmluZSBGTDJfVElNRVJFU19GSVgoYSkgICAoIEZMMkZYQ09OU1RfREJMKGEvKGZsb2F0KSgxPDxUTlNfVElNRVJFU19TQ0FMRSkpICkKKyNkZWZpbmUgVE5TX1RJTUVSRVNfU0NBTEUgKDEpCisjZGVmaW5lIEZMMl9USU1FUkVTX0ZJWChhKSAoRkwyRlhDT05TVF9EQkwoYSAvIChmbG9hdCkoMSA8PCBUTlNfVElNRVJFU19TQ0FMRSkpKQogCi1zdGF0aWMgY29uc3QgVE5TX0lORk9fVEFCIHRuc0luZm9UYWJbXSA9Ci17Ci0gIHsKLSAgICB7ICAxNjAwMCwgIDEzNTAwfSwKLSAgICB7ICAzMjAwMCwgIDI4MDAwfSwKLSAgICB7Ci0gICAgICB7IHsxLCAxfSwgezE0MzcsIDE1MDB9LCB7MTQwMCwgNjAwfSwgezEyLCAxMn0sIHtGSUxURVJfRElSRUNUSU9OLCBGSUxURVJfRElSRUNUSU9OfSwgezMsIDF9LCB7RkwyX1RJTUVSRVNfRklYKDAuNGYpLCBGTDJfVElNRVJFU19GSVgoMS4yZil9LCAxIH0sCi0gICAgICB7IHsxLCAxfSwgezE0MzcsIDE1MDB9LCB7MTQwMCwgNjAwfSwgezEyLCAxMn0sIHtGSUxURVJfRElSRUNUSU9OLCBGSUxURVJfRElSRUNUSU9OfSwgezMsIDF9LCB7RkwyX1RJTUVSRVNfRklYKDAuNGYpLCBGTDJfVElNRVJFU19GSVgoMS4yZil9LCAxIH0KLSAgICB9Ci0gIH0sCi0gIHsKLSAgICB7ICAzMjAwMSwgIDI4MDAxfSwKLSAgICB7ICA2MDAwMCwgIDUyMDAwfSwKLSAgICB7Ci0gICAgICB7IHsxLCAxfSwgezE0MzcsIDE1MDB9LCB7MTQwMCwgNjAwfSwgezEyLCAxMH0sIHtGSUxURVJfRElSRUNUSU9OLCBGSUxURVJfRElSRUNUSU9OfSwgezMsIDF9LCB7RkwyX1RJTUVSRVNfRklYKDAuNGYpLCBGTDJfVElNRVJFU19GSVgoMS4wZil9LCAxIH0sCi0gICAgICB7IHsxLCAxfSwgezE0MzcsIDE1MDB9LCB7MTQwMCwgNjAwfSwgezEyLCAxMH0sIHtGSUxURVJfRElSRUNUSU9OLCBGSUxURVJfRElSRUNUSU9OfSwgezMsIDF9LCB7RkwyX1RJTUVSRVNfRklYKDAuNGYpLCBGTDJfVElNRVJFU19GSVgoMS4wZil9LCAxIH0KLSAgICB9Ci0gIH0sCi0gIHsKLSAgICB7ICA2MDAwMSwgIDUyMDAxfSwKLSAgICB7IDM4NDAwMCwgMzg0MDAwfSwKLSAgICB7Ci0gICAgICB7IHsxLCAxfSwgezE0MzcsIDE1MDB9LCB7MTQwMCwgNjAwfSwgezEyLCAgOH0sIHtGSUxURVJfRElSRUNUSU9OLCBGSUxURVJfRElSRUNUSU9OfSwgezMsIDF9LCB7RkwyX1RJTUVSRVNfRklYKDAuNGYpLCBGTDJfVElNRVJFU19GSVgoMS4wZil9LCAxIH0sCi0gICAgICB7IHsxLCAxfSwgezE0MzcsIDE1MDB9LCB7MTQwMCwgNjAwfSwgezEyLCAgOH0sIHtGSUxURVJfRElSRUNUSU9OLCBGSUxURVJfRElSRUNUSU9OfSwgezMsIDF9LCB7RkwyX1RJTUVSRVNfRklYKDAuNGYpLCBGTDJfVElNRVJFU19GSVgoMS4wZil9LCAxIH0KLSAgICB9Ci0gIH0KLX07CitzdGF0aWMgY29uc3QgVE5TX0lORk9fVEFCIHRuc0luZm9UYWJbXSA9IHsKKyAgICB7ezE2MDAwLCAxMzUwMH0sCisgICAgIHszMjAwMCwgMjgwMDB9LAorICAgICB7e3sxLCAxfSwKKyAgICAgICB7MTQzNywgMTUwMH0sCisgICAgICAgezE0MDAsIDYwMH0sCisgICAgICAgezEyLCAxMn0sCisgICAgICAge0ZJTFRFUl9ESVJFQ1RJT04sIEZJTFRFUl9ESVJFQ1RJT059LAorICAgICAgIHszLCAxfSwKKyAgICAgICB7RkwyX1RJTUVSRVNfRklYKDAuNGYpLCBGTDJfVElNRVJFU19GSVgoMS4yZil9LAorICAgICAgIDF9LAorICAgICAge3sxLCAxfSwKKyAgICAgICB7MTQzNywgMTUwMH0sCisgICAgICAgezE0MDAsIDYwMH0sCisgICAgICAgezEyLCAxMn0sCisgICAgICAge0ZJTFRFUl9ESVJFQ1RJT04sIEZJTFRFUl9ESVJFQ1RJT059LAorICAgICAgIHszLCAxfSwKKyAgICAgICB7RkwyX1RJTUVSRVNfRklYKDAuNGYpLCBGTDJfVElNRVJFU19GSVgoMS4yZil9LAorICAgICAgIDF9fX0sCisgICAge3szMjAwMSwgMjgwMDF9LAorICAgICB7NjAwMDAsIDUyMDAwfSwKKyAgICAge3t7MSwgMX0sCisgICAgICAgezE0MzcsIDE1MDB9LAorICAgICAgIHsxNDAwLCA2MDB9LAorICAgICAgIHsxMiwgMTB9LAorICAgICAgIHtGSUxURVJfRElSRUNUSU9OLCBGSUxURVJfRElSRUNUSU9OfSwKKyAgICAgICB7MywgMX0sCisgICAgICAge0ZMMl9USU1FUkVTX0ZJWCgwLjRmKSwgRkwyX1RJTUVSRVNfRklYKDEuMGYpfSwKKyAgICAgICAxfSwKKyAgICAgIHt7MSwgMX0sCisgICAgICAgezE0MzcsIDE1MDB9LAorICAgICAgIHsxNDAwLCA2MDB9LAorICAgICAgIHsxMiwgMTB9LAorICAgICAgIHtGSUxURVJfRElSRUNUSU9OLCBGSUxURVJfRElSRUNUSU9OfSwKKyAgICAgICB7MywgMX0sCisgICAgICAge0ZMMl9USU1FUkVTX0ZJWCgwLjRmKSwgRkwyX1RJTUVSRVNfRklYKDEuMGYpfSwKKyAgICAgICAxfX19LAorICAgIHt7NjAwMDEsIDUyMDAxfSwKKyAgICAgezM4NDAwMCwgMzg0MDAwfSwKKyAgICAge3t7MSwgMX0sCisgICAgICAgezE0MzcsIDE1MDB9LAorICAgICAgIHsxNDAwLCA2MDB9LAorICAgICAgIHsxMiwgOH0sCisgICAgICAge0ZJTFRFUl9ESVJFQ1RJT04sIEZJTFRFUl9ESVJFQ1RJT059LAorICAgICAgIHszLCAxfSwKKyAgICAgICB7RkwyX1RJTUVSRVNfRklYKDAuNGYpLCBGTDJfVElNRVJFU19GSVgoMS4wZil9LAorICAgICAgIDF9LAorICAgICAge3sxLCAxfSwKKyAgICAgICB7MTQzNywgMTUwMH0sCisgICAgICAgezE0MDAsIDYwMH0sCisgICAgICAgezEyLCA4fSwKKyAgICAgICB7RklMVEVSX0RJUkVDVElPTiwgRklMVEVSX0RJUkVDVElPTn0sCisgICAgICAgezMsIDF9LAorICAgICAgIHtGTDJfVElNRVJFU19GSVgoMC40ZiksIEZMMl9USU1FUkVTX0ZJWCgxLjBmKX0sCisgICAgICAgMX19fX07CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgSU5UICAgc2FtcGxpbmdSYXRlOworICBJTlQgc2FtcGxpbmdSYXRlOwogICBTQ0hBUiBtYXhCYW5kc1syXTsgLyogbG9uZz0wOyBzaG9ydD0xICovCiAKIH0gVE5TX01BWF9UQUJfRU5UUlk7CiAKLXN0YXRpYyBjb25zdCBUTlNfTUFYX1RBQl9FTlRSWSB0bnNNYXhCYW5kc1RhYjEwMjRbXSA9Ci17Ci0gIHsgOTYwMDAsIHsgMzEsICA5fX0sCi0gIHsgODgyMDAsIHsgMzEsICA5fX0sCi0gIHsgNjQwMDAsIHsgMzQsIDEwfX0sCi0gIHsgNDgwMDAsIHsgNDAsIDE0fX0sCi0gIHsgNDQxMDAsIHsgNDIsIDE0fX0sCi0gIHsgMzIwMDAsIHsgNTEsIDE0fX0sCi0gIHsgMjQwMDAsIHsgNDYsIDE0fX0sCi0gIHsgMjIwNTAsIHsgNDYsIDE0fX0sCi0gIHsgMTYwMDAsIHsgNDIsIDE0fX0sCi0gIHsgMTIwMDAsIHsgNDIsIDE0fX0sCi0gIHsgMTEwMjUsIHsgNDIsIDE0fX0sCi0gIHsgODAwMCwgIHsgMzksIDE0fX0KK3N0YXRpYyBjb25zdCBUTlNfTUFYX1RBQl9FTlRSWSB0bnNNYXhCYW5kc1RhYjEwMjRbXSA9IHsKKyAgICB7OTYwMDAsIHszMSwgOX19LCAgezg4MjAwLCB7MzEsIDl9fSwgIHs2NDAwMCwgezM0LCAxMH19LCB7NDgwMDAsIHs0MCwgMTR9fSwKKyAgICB7NDQxMDAsIHs0MiwgMTR9fSwgezMyMDAwLCB7NTEsIDE0fX0sIHsyNDAwMCwgezQ2LCAxNH19LCB7MjIwNTAsIHs0NiwgMTR9fSwKKyAgICB7MTYwMDAsIHs0MiwgMTR9fSwgezEyMDAwLCB7NDIsIDE0fX0sIHsxMTAyNSwgezQyLCAxNH19LCB7ODAwMCwgezM5LCAxNH19fTsKKworc3RhdGljIGNvbnN0IFROU19NQVhfVEFCX0VOVFJZIHRuc01heEJhbmRzVGFiMTIwW10gPSB7CisgICAgezQ4MDAwLCB7MTIsIC0xfX0sIC8qIDQ4MDAwICovCisgICAgezQ0MTAwLCB7MTIsIC0xfX0sIC8qIDQ0MTAwICovCisgICAgezMyMDAwLCB7MTUsIC0xfX0sIC8qIDMyMDAwICovCisgICAgezI0MDAwLCB7MTUsIC0xfX0sIC8qIDI0MDAwICovCisgICAgezIyMDUwLCB7MTUsIC0xfX0gIC8qIDIyMDUwICovCiB9OwogCi1zdGF0aWMgY29uc3QgVE5TX01BWF9UQUJfRU5UUlkgdG5zTWF4QmFuZHNUYWI0ODBbXSA9Ci17Ci0gIHsgNDgwMDAsIHsgMzEsIC0xfX0sCi0gIHsgNDQxMDAsIHsgMzIsIC0xfX0sCi0gIHsgMzIwMDAsIHsgMzcsIC0xfX0sCi0gIHsgMjQwMDAsIHsgMzAsIC0xfX0sCi0gIHsgMjIwNTAsIHsgMzAsIC0xfX0KK3N0YXRpYyBjb25zdCBUTlNfTUFYX1RBQl9FTlRSWSB0bnNNYXhCYW5kc1RhYjEyOFtdID0geworICAgIHs0ODAwMCwgezEyLCAtMX19LCAvKiA0ODAwMCAqLworICAgIHs0NDEwMCwgezEyLCAtMX19LCAvKiA0NDEwMCAqLworICAgIHszMjAwMCwgezE1LCAtMX19LCAvKiAzMjAwMCAqLworICAgIHsyNDAwMCwgezE1LCAtMX19LCAvKiAyNDAwMCAqLworICAgIHsyMjA1MCwgezE1LCAtMX19ICAvKiAyMjA1MCAqLwogfTsKIAotc3RhdGljIGNvbnN0IFROU19NQVhfVEFCX0VOVFJZIHRuc01heEJhbmRzVGFiNTEyW10gPQotewotICB7IDQ4MDAwLCB7IDMxLCAtMX19LAotICB7IDQ0MTAwLCB7IDMyLCAtMX19LAotICB7IDMyMDAwLCB7IDM3LCAtMX19LAotICB7IDI0MDAwLCB7IDMxLCAtMX19LAotICB7IDIyMDUwLCB7IDMxLCAtMX19CitzdGF0aWMgY29uc3QgVE5TX01BWF9UQUJfRU5UUlkgdG5zTWF4QmFuZHNUYWIyNDBbXSA9IHsKKyAgICB7OTYwMDAsIHsyMiwgLTF9fSwgLyogOTYwMDAgKi8KKyAgICB7NDgwMDAsIHsyMiwgLTF9fSwgLyogNDgwMDAgKi8KKyAgICB7NDQxMDAsIHsyMiwgLTF9fSwgLyogNDQxMDAgKi8KKyAgICB7MzIwMDAsIHsyMSwgLTF9fSwgLyogMzIwMDAgKi8KKyAgICB7MjQwMDAsIHsyMSwgLTF9fSwgLyogMjQwMDAgKi8KKyAgICB7MjIwNTAsIHsyMSwgLTF9fSAgLyogMjIwNTAgKi8KIH07CiAKLXN0YXRpYyBJTlQgRkRLYWFjRW5jX0F1dG9Ub1BhcmNvcigKLSAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIGlucHV0LAotICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcmVmbENvZWZmLAotICAgICAgICBjb25zdCBJTlQgbnVtT2ZDb2VmZgotICAgICAgICApOworc3RhdGljIGNvbnN0IFROU19NQVhfVEFCX0VOVFJZIHRuc01heEJhbmRzVGFiMjU2W10gPSB7CisgICAgezk2MDAwLCB7MjUsIC0xfX0sIC8qIDk2MDAwICovCisgICAgezQ4MDAwLCB7MjUsIC0xfX0sIC8qIDQ4MDAwICovCisgICAgezQ0MTAwLCB7MjUsIC0xfX0sIC8qIDQ0MTAwICovCisgICAgezMyMDAwLCB7MjQsIC0xfX0sIC8qIDMyMDAwICovCisgICAgezI0MDAwLCB7MjQsIC0xfX0sIC8qIDI0MDAwICovCisgICAgezIyMDUwLCB7MjQsIC0xfX0gIC8qIDIyMDUwICovCit9Oworc3RhdGljIGNvbnN0IFROU19NQVhfVEFCX0VOVFJZIHRuc01heEJhbmRzVGFiNDgwW10gPSB7ezQ4MDAwLCB7MzEsIC0xfX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NDQxMDAsIHszMiwgLTF9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszMjAwMCwgezM3LCAtMX19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezI0MDAwLCB7MzAsIC0xfX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MjIwNTAsIHszMCwgLTF9fX07CiAKLXN0YXRpYyB2b2lkIEZES2FhY0VuY19QYXJjb3IySW5kZXgoCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICpwYXJjb3IsCi0gICAgICAgIElOVCAqUkVTVFJJQ1QgaW5kZXgsCi0gICAgICAgIGNvbnN0IElOVCBvcmRlciwKLSAgICAgICAgY29uc3QgSU5UIGJpdHNQZXJDb2VmZgotICAgICAgICApOworc3RhdGljIGNvbnN0IFROU19NQVhfVEFCX0VOVFJZIHRuc01heEJhbmRzVGFiNTEyW10gPSB7ezQ4MDAwLCB7MzEsIC0xfX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NDQxMDAsIHszMiwgLTF9fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszMjAwMCwgezM3LCAtMX19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezI0MDAwLCB7MzEsIC0xfX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MjIwNTAsIHszMSwgLTF9fX07CiAKLXN0YXRpYyB2b2lkIEZES2FhY0VuY19JbmRleDJQYXJjb3IoCi0gICAgICAgIGNvbnN0IElOVCAqaW5kZXgsCi0gICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwYXJjb3IsCi0gICAgICAgIGNvbnN0IElOVCBvcmRlciwKLSAgICAgICAgY29uc3QgSU5UIGJpdHNQZXJDb2VmZgotICAgICAgICApOworc3RhdGljIHZvaWQgRkRLYWFjRW5jX1BhcmNvcjJJbmRleChjb25zdCBGSVhQX0xQQyAqcGFyY29yLCBJTlQgKlJFU1RSSUNUIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgb3JkZXIsIGNvbnN0IElOVCBiaXRzUGVyQ29lZmYpOwogCi1zdGF0aWMgSU5UIEZES2FhY0VuY19QYXJjb3JUb0xwYygKLSAgICAgICAgY29uc3QgRklYUF9EQkwgKnJlZmxDb2VmZiwKLSAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIExwY0NvZWZmLAotICAgICAgICBjb25zdCBJTlQgbnVtT2ZDb2VmZiwKLSAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHdvcmtCdWZmZXIKLSAgICAgICAgKTsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19JbmRleDJQYXJjb3IoY29uc3QgSU5UICppbmRleCwgRklYUF9MUEMgKlJFU1RSSUNUIHBhcmNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG9yZGVyLCBjb25zdCBJTlQgYml0c1BlckNvZWZmKTsKIAotc3RhdGljIHZvaWQgRkRLYWFjRW5jX0FuYWx5c2lzRmlsdGVyKAotICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgc2lnbmFsLAotICAgICAgICBjb25zdCBJTlQgbnVtT2ZMaW5lcywKLSAgICAgICAgY29uc3QgRklYUF9EQkwgKnByZWRpY3RvckNvZWZmLAotICAgICAgICBjb25zdCBJTlQgb3JkZXIsCi0gICAgICAgIGNvbnN0IElOVCBscGNHYWluRmFjdG9yCi0gICAgICAgICk7CitzdGF0aWMgdm9pZCBGREthYWNFbmNfQ2FsY0dhdXNzV2luZG93KEZJWFBfREJMICp3aW4sIGNvbnN0IGludCB3aW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgdHJhbnNmb3JtUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgdGltZVJlc29sdXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB0aW1lUmVzb2x1dGlvbl9lKTsKIAotc3RhdGljIHZvaWQgRkRLYWFjRW5jX0NhbGNHYXVzc1dpbmRvdygKLSAgICAgICAgRklYUF9EQkwgKndpbiwKLSAgICAgICAgY29uc3QgaW50IHdpblNpemUsCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGluZ1JhdGUsCi0gICAgICAgIGNvbnN0IElOVCB0cmFuc2Zvcm1SZXNvbHV0aW9uLAotICAgICAgICBjb25zdCBGSVhQX0RCTCB0aW1lUmVzb2x1dGlvbiwKLSAgICAgICAgY29uc3QgSU5UIHRpbWVSZXNvbHV0aW9uX2UKLSAgICAgICAgKTsKLQotc3RhdGljIGNvbnN0IFROU19QQVJBTUVURVJfVEFCVUxBVEVEKiBGREthYWNFbmNfR2V0VG5zUGFyYW0oCi0gICAgICAgIGNvbnN0IElOVCBiaXRSYXRlLAotICAgICAgICBjb25zdCBJTlQgY2hhbm5lbHMsCi0gICAgICAgIGNvbnN0IElOVCBzYnJMZAotICAgICAgICApCi17CitzdGF0aWMgY29uc3QgVE5TX1BBUkFNRVRFUl9UQUJVTEFURUQgKkZES2FhY0VuY19HZXRUbnNQYXJhbShjb25zdCBJTlQgYml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzYnJMZCkgewogICBpbnQgaTsKICAgY29uc3QgVE5TX1BBUkFNRVRFUl9UQUJVTEFURUQgKnRuc0NvbmZpZ1RhYiA9IE5VTEw7CiAKLSAgZm9yIChpID0gMDsgaSA8IChpbnQpIChzaXplb2YodG5zSW5mb1RhYikvc2l6ZW9mKFROU19JTkZPX1RBQikpOyBpKyspIHsKLSAgICBpZiAoKGJpdFJhdGUgPj0gdG5zSW5mb1RhYltpXS5iaXRSYXRlRnJvbVtzYnJMZD8xOjBdKSAmJgotICAgICAgICAgYml0UmF0ZSA8PSB0bnNJbmZvVGFiW2ldLmJpdFJhdGVUb1tzYnJMZD8xOjBdKQotICAgIHsKLSAgICAgIHRuc0NvbmZpZ1RhYiA9ICZ0bnNJbmZvVGFiW2ldLnBhcmFtVGFiWyhjaGFubmVscz09MSk/MDoxXTsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpKHNpemVvZih0bnNJbmZvVGFiKSAvIHNpemVvZihUTlNfSU5GT19UQUIpKTsgaSsrKSB7CisgICAgaWYgKChiaXRSYXRlID49IHRuc0luZm9UYWJbaV0uYml0UmF0ZUZyb21bc2JyTGQgPyAxIDogMF0pICYmCisgICAgICAgIGJpdFJhdGUgPD0gdG5zSW5mb1RhYltpXS5iaXRSYXRlVG9bc2JyTGQgPyAxIDogMF0pIHsKKyAgICAgIHRuc0NvbmZpZ1RhYiA9ICZ0bnNJbmZvVGFiW2ldLnBhcmFtVGFiWyhjaGFubmVscyA9PSAxKSA/IDAgOiAxXTsKICAgICB9CiAgIH0KIAogICByZXR1cm4gdG5zQ29uZmlnVGFiOwogfQogCi0KLXN0YXRpYyBJTlQgZ2V0VG5zTWF4QmFuZHMoCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGVSYXRlLAotICAgICAgICBjb25zdCBJTlQgZ3JhbnVsZUxlbmd0aCwKLSAgICAgICAgY29uc3QgSU5UIGlzU2hvcnRCbG9jawotICAgICAgICApCi17CitzdGF0aWMgSU5UIGdldFRuc01heEJhbmRzKGNvbnN0IElOVCBzYW1wbGVSYXRlLCBjb25zdCBJTlQgZ3JhbnVsZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGlzU2hvcnRCbG9jaykgewogICBpbnQgaTsKICAgSU5UIG51bUJhbmRzID0gLTE7CiAgIGNvbnN0IFROU19NQVhfVEFCX0VOVFJZICpwTWF4QmFuZHNUYWIgPSBOVUxMOwogICBpbnQgbWF4QmFuZHNUYWJTaXplID0gMDsKIAogICBzd2l0Y2ggKGdyYW51bGVMZW5ndGgpIHsKKyAgICBjYXNlIDk2MDoKICAgICBjYXNlIDEwMjQ6CiAgICAgICBwTWF4QmFuZHNUYWIgPSB0bnNNYXhCYW5kc1RhYjEwMjQ7Ci0gICAgICBtYXhCYW5kc1RhYlNpemUgPSBzaXplb2YodG5zTWF4QmFuZHNUYWIxMDI0KS9zaXplb2YoVE5TX01BWF9UQUJfRU5UUlkpOworICAgICAgbWF4QmFuZHNUYWJTaXplID0gc2l6ZW9mKHRuc01heEJhbmRzVGFiMTAyNCkgLyBzaXplb2YoVE5TX01BWF9UQUJfRU5UUlkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjA6CisgICAgICBwTWF4QmFuZHNUYWIgPSB0bnNNYXhCYW5kc1RhYjEyMDsKKyAgICAgIG1heEJhbmRzVGFiU2l6ZSA9IHNpemVvZih0bnNNYXhCYW5kc1RhYjEyMCkgLyBzaXplb2YoVE5TX01BWF9UQUJfRU5UUlkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjg6CisgICAgICBwTWF4QmFuZHNUYWIgPSB0bnNNYXhCYW5kc1RhYjEyODsKKyAgICAgIG1heEJhbmRzVGFiU2l6ZSA9IHNpemVvZih0bnNNYXhCYW5kc1RhYjEyOCkgLyBzaXplb2YoVE5TX01BWF9UQUJfRU5UUlkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDA6CisgICAgICBwTWF4QmFuZHNUYWIgPSB0bnNNYXhCYW5kc1RhYjI0MDsKKyAgICAgIG1heEJhbmRzVGFiU2l6ZSA9IHNpemVvZih0bnNNYXhCYW5kc1RhYjI0MCkgLyBzaXplb2YoVE5TX01BWF9UQUJfRU5UUlkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNTY6CisgICAgICBwTWF4QmFuZHNUYWIgPSB0bnNNYXhCYW5kc1RhYjI1NjsKKyAgICAgIG1heEJhbmRzVGFiU2l6ZSA9IHNpemVvZih0bnNNYXhCYW5kc1RhYjI1NikgLyBzaXplb2YoVE5TX01BWF9UQUJfRU5UUlkpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSA0ODA6CiAgICAgICBwTWF4QmFuZHNUYWIgPSB0bnNNYXhCYW5kc1RhYjQ4MDsKLSAgICAgIG1heEJhbmRzVGFiU2l6ZSA9IHNpemVvZih0bnNNYXhCYW5kc1RhYjQ4MCkvc2l6ZW9mKFROU19NQVhfVEFCX0VOVFJZKTsKKyAgICAgIG1heEJhbmRzVGFiU2l6ZSA9IHNpemVvZih0bnNNYXhCYW5kc1RhYjQ4MCkgLyBzaXplb2YoVE5TX01BWF9UQUJfRU5UUlkpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSA1MTI6CiAgICAgICBwTWF4QmFuZHNUYWIgPSB0bnNNYXhCYW5kc1RhYjUxMjsKLSAgICAgIG1heEJhbmRzVGFiU2l6ZSA9IHNpemVvZih0bnNNYXhCYW5kc1RhYjUxMikvc2l6ZW9mKFROU19NQVhfVEFCX0VOVFJZKTsKKyAgICAgIG1heEJhbmRzVGFiU2l6ZSA9IHNpemVvZih0bnNNYXhCYW5kc1RhYjUxMikgLyBzaXplb2YoVE5TX01BWF9UQUJfRU5UUlkpOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIG51bUJhbmRzID0gLTE7CiAgIH0KIAotICBpZiAocE1heEJhbmRzVGFiIT1OVUxMKSB7Ci0gICAgZm9yIChpPTA7IGk8bWF4QmFuZHNUYWJTaXplOyBpKyspIHsKLSAgICAgIG51bUJhbmRzID0gcE1heEJhbmRzVGFiW2ldLm1heEJhbmRzWyghaXNTaG9ydEJsb2NrKT8wOjFdOworICBpZiAocE1heEJhbmRzVGFiICE9IE5VTEwpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWF4QmFuZHNUYWJTaXplOyBpKyspIHsKKyAgICAgIG51bUJhbmRzID0gcE1heEJhbmRzVGFiW2ldLm1heEJhbmRzWyghaXNTaG9ydEJsb2NrKSA/IDAgOiAxXTsKICAgICAgIGlmIChzYW1wbGVSYXRlID49IHBNYXhCYW5kc1RhYltpXS5zYW1wbGluZ1JhdGUpIHsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CkBAIC0yOTEsNyArMzI0LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQotICBcYnJpZWYgICAgIEZES2FhY0VuY19GcmVxVG9CYW5kV2l0aFJvdW5kaW5nCisgIFxicmllZiAgICAgRkRLYWFjRW5jX0ZyZXFUb0JhbmRXaWR0aFJvdW5kaW5nCiAKICAgUmV0dXJucyBpbmRleCBvZiBuZWFyZXN0IGJhbmQgYm9yZGVyCiAKQEAgLTMwMywzOCArMzM2LDMxIEBACiAgIFxyZXR1cm4gYmFuZCBib3JkZXIKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUlOVCBGREthYWNFbmNfRnJlcVRvQmFuZFdpdGhSb3VuZGluZygKLSAgICAgICAgY29uc3QgSU5UIGZyZXEsCi0gICAgICAgIGNvbnN0IElOVCBmcywKLSAgICAgICAgY29uc3QgSU5UIG51bU9mQmFuZHMsCi0gICAgICAgIGNvbnN0IElOVCAqYmFuZFN0YXJ0T2Zmc2V0Ci0gICAgICAgICkKLXsKK0lOVCBGREthYWNFbmNfRnJlcVRvQmFuZFdpZHRoUm91bmRpbmcoY29uc3QgSU5UIGZyZXEsIGNvbnN0IElOVCBmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG51bU9mQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqYmFuZFN0YXJ0T2Zmc2V0KSB7CiAgIElOVCBsaW5lTnVtYmVyLCBiYW5kOwogCiAgIC8qICBhc3NlcnQoZnJlcSA+PSAwKTsgICovCi0gIGxpbmVOdW1iZXIgPSAoZnJlcSpiYW5kU3RhcnRPZmZzZXRbbnVtT2ZCYW5kc10qNC9mcysxKS8yOworICBsaW5lTnVtYmVyID0gKGZyZXEgKiBiYW5kU3RhcnRPZmZzZXRbbnVtT2ZCYW5kc10gKiA0IC8gZnMgKyAxKSAvIDI7CiAKICAgLyogZnJlcSA+IGZzLzIgKi8KLSAgaWYgKGxpbmVOdW1iZXIgPj0gYmFuZFN0YXJ0T2Zmc2V0W251bU9mQmFuZHNdKQotICAgIHJldHVybiBudW1PZkJhbmRzOworICBpZiAobGluZU51bWJlciA+PSBiYW5kU3RhcnRPZmZzZXRbbnVtT2ZCYW5kc10pIHJldHVybiBudW1PZkJhbmRzOwogCiAgIC8qIGZpbmQgYmFuZCB0aGUgbGluZSBudW1iZXIgbGllcyBpbiAqLwotICBmb3IgKGJhbmQ9MDsgYmFuZDxudW1PZkJhbmRzOyBiYW5kKyspIHsKLSAgICBpZiAoYmFuZFN0YXJ0T2Zmc2V0W2JhbmQrMV0+bGluZU51bWJlcikgYnJlYWs7CisgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBudW1PZkJhbmRzOyBiYW5kKyspIHsKKyAgICBpZiAoYmFuZFN0YXJ0T2Zmc2V0W2JhbmQgKyAxXSA+IGxpbmVOdW1iZXIpIGJyZWFrOwogICB9CiAKICAgLyogcm91bmQgdG8gbmVhcmVzdCBiYW5kIGJvcmRlciAqLwogICBpZiAobGluZU51bWJlciAtIGJhbmRTdGFydE9mZnNldFtiYW5kXSA+Ci0gICAgICBiYW5kU3RhcnRPZmZzZXRbYmFuZCsxXSAtIGxpbmVOdW1iZXIgKQotICAgIHsKLSAgICAgIGJhbmQrKzsKLSAgICB9CisgICAgICBiYW5kU3RhcnRPZmZzZXRbYmFuZCArIDFdIC0gbGluZU51bWJlcikgeworICAgIGJhbmQrKzsKKyAgfQogCi0gIHJldHVybihiYW5kKTsKKyAgcmV0dXJuIChiYW5kKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0luaXRUbnNDb25maWd1cmF0aW9uCkBAIC0zNDgsMTEzICszNzQsMTMyIEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0VG5zQ29uZmlndXJhdGlvbihJTlQgYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJsb2NrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZ3JhbnVsZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgaXNMb3dEZWxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbGRTYnJQcmVzZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19DT05GSUcgKnRDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB1c2VUbnNQZWFrKQoteworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRUbnNDb25maWd1cmF0aW9uKAorICAgIElOVCBiaXRSYXRlLCBJTlQgc2FtcGxlUmF0ZSwgSU5UIGNoYW5uZWxzLCBJTlQgYmxvY2tUeXBlLCBJTlQgZ3JhbnVsZUxlbmd0aCwKKyAgICBJTlQgaXNMb3dEZWxheSwgSU5UIGxkU2JyUHJlc2VudCwgVE5TX0NPTkZJRyAqdEMsIFBTWV9DT05GSUdVUkFUSU9OICpwQywKKyAgICBJTlQgYWN0aXZlLCBJTlQgdXNlVG5zUGVhaykgewogICBpbnQgaTsKLSAgLy9mbG9hdCBhY2ZUaW1lUmVzICAgPSAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVykgPyAwLjEyNWYgOiAwLjA0Njg3NWY7CisgIC8vIGZsb2F0IGFjZlRpbWVSZXMgICA9IChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKSA/IDAuMTI1ZiA6IDAuMDQ2ODc1ZjsKIAotICBpZiAoY2hhbm5lbHMgPD0gMCkKLSAgICByZXR1cm4gKEFBQ19FTkNPREVSX0VSUk9SKTE7CisgIGlmIChjaGFubmVscyA8PSAwKSByZXR1cm4gKEFBQ19FTkNPREVSX0VSUk9SKTE7CiAKICAgdEMtPmlzTG93RGVsYXkgPSBpc0xvd0RlbGF5OwogCi0gIC8qIGluaXRpYWxpemUgVE5TIGZpbHRlciBmbGFnLCBvcmRlciwgYW5kIGNvZWZmaWNpZW50IHJlc29sdXRpb24gKGluIGJpdHMgcGVyIGNvZWZmKSAqLwotICB0Qy0+dG5zQWN0aXZlICAgICAgPSAoYWN0aXZlKSA/IFRSVUUgOiBGQUxTRTsKLSAgdEMtPm1heE9yZGVyICAgICAgID0gKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpID8gNSA6IDEyOyAgLyogbWF4aW11bTogNywgMjAgKi8KLSAgaWYgKGJpdFJhdGUgPCAxNjAwMCkKLSAgICB0Qy0+bWF4T3JkZXIgLT0gMjsKLSAgdEMtPmNvZWZSZXMgICAgICAgID0gKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpID8gMyA6IDQ7CisgIC8qIGluaXRpYWxpemUgVE5TIGZpbHRlciBmbGFnLCBvcmRlciwgYW5kIGNvZWZmaWNpZW50IHJlc29sdXRpb24gKGluIGJpdHMgcGVyCisgICAqIGNvZWZmKSAqLworICB0Qy0+dG5zQWN0aXZlID0gKGFjdGl2ZSkgPyBUUlVFIDogRkFMU0U7CisgIHRDLT5tYXhPcmRlciA9IChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKSA/IDUgOiAxMjsgLyogbWF4aW11bTogNywgMjAgKi8KKyAgaWYgKGJpdFJhdGUgPCAxNjAwMCkgdEMtPm1heE9yZGVyIC09IDI7CisgIHRDLT5jb2VmUmVzID0gKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpID8gMyA6IDQ7CiAKLSAgLyogTFBDIHN0b3AgbGluZTogaGlnaGVzdCBNRENUIGxpbmUgdG8gYmUgY29kZWQsIGJ1dCBkbyBub3QgZ28gYmV5b25kIFROU19NQVhfQkFORFMhICovCi0gIHRDLT5scGNTdG9wQmFuZCA9IGdldFRuc01heEJhbmRzKHNhbXBsZVJhdGUsIGdyYW51bGVMZW5ndGgsIChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKSA/IDEgOiAwKTsKKyAgLyogTFBDIHN0b3AgbGluZTogaGlnaGVzdCBNRENUIGxpbmUgdG8gYmUgY29kZWQsIGJ1dCBkbyBub3QgZ28gYmV5b25kCisgICAqIFROU19NQVhfQkFORFMhICovCisgIHRDLT5scGNTdG9wQmFuZCA9IGdldFRuc01heEJhbmRzKHNhbXBsZVJhdGUsIGdyYW51bGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKSA/IDEgOiAwKTsKIAogICBpZiAodEMtPmxwY1N0b3BCYW5kIDwgMCkgewogICAgIHJldHVybiAoQUFDX0VOQ09ERVJfRVJST1IpMTsKICAgfQogCi0gIHRDLT5scGNTdG9wQmFuZCA9IEZES21pbih0Qy0+bHBjU3RvcEJhbmQsIHBDLT5zZmJBY3RpdmUpOwotICB0Qy0+bHBjU3RvcExpbmUgICAgPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdG9wQmFuZF07CisgIHRDLT5scGNTdG9wQmFuZCA9IGZNaW4odEMtPmxwY1N0b3BCYW5kLCBwQy0+c2ZiQWN0aXZlKTsKKyAgdEMtPmxwY1N0b3BMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RvcEJhbmRdOwogCiAgIHN3aXRjaCAoZ3JhbnVsZUxlbmd0aCkgeworICAgIGNhc2UgOTYwOgogICAgIGNhc2UgMTAyNDoKLSAgICAgIC8qIFROUyBzdGFydCBsaW5lOiBza2lwIGxvd2VyIE1EQ1QgbGluZXMgdG8gcHJldmVudCBhcnRpZmFjdHMgZHVlIHRvIGZpbHRlciBtaXNtYXRjaCAqLwotICAgICAgdEMtPmxwY1N0YXJ0QmFuZFtMT0ZJTFRdICAgPSAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVykgPyAwIDogKChzYW1wbGVSYXRlIDwgMTg3ODMpID8gNCA6IDgpOwotICAgICAgdEMtPmxwY1N0YXJ0TGluZVtMT0ZJTFRdICAgPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdGFydEJhbmRbTE9GSUxUXV07CisgICAgICAvKiBUTlMgc3RhcnQgbGluZTogc2tpcCBsb3dlciBNRENUIGxpbmVzIHRvIHByZXZlbnQgYXJ0aWZhY3RzIGR1ZSB0bworICAgICAgICogZmlsdGVyIG1pc21hdGNoICovCisgICAgICBpZiAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVykgeworICAgICAgICB0Qy0+bHBjU3RhcnRCYW5kW0xPRklMVF0gPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdEMtPmxwY1N0YXJ0QmFuZFtMT0ZJTFRdID0KKyAgICAgICAgICAgIChzYW1wbGVSYXRlIDwgOTM5MSkgPyAyIDogKChzYW1wbGVSYXRlIDwgMTg3ODMpID8gNCA6IDgpOworICAgICAgfQorICAgICAgdEMtPmxwY1N0YXJ0TGluZVtMT0ZJTFRdID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RhcnRCYW5kW0xPRklMVF1dOwogCiAgICAgICBpID0gdEMtPmxwY1N0b3BCYW5kOwotICAgICAgd2hpbGUgKHBDLT5zZmJPZmZzZXRbaV0gPiAodEMtPmxwY1N0YXJ0TGluZVtMT0ZJTFRdICsgKHRDLT5scGNTdG9wTGluZSAtIHRDLT5scGNTdGFydExpbmVbTE9GSUxUXSkgLyA0KSkgaS0tOwotICAgICAgdEMtPmxwY1N0YXJ0QmFuZFtISUZJTFRdICAgPSBpOwotICAgICAgdEMtPmxwY1N0YXJ0TGluZVtISUZJTFRdICAgPSBwQy0+c2ZiT2Zmc2V0W2ldOworICAgICAgd2hpbGUgKHBDLT5zZmJPZmZzZXRbaV0gPgorICAgICAgICAgICAgICh0Qy0+bHBjU3RhcnRMaW5lW0xPRklMVF0gKworICAgICAgICAgICAgICAodEMtPmxwY1N0b3BMaW5lIC0gdEMtPmxwY1N0YXJ0TGluZVtMT0ZJTFRdKSAvIDQpKQorICAgICAgICBpLS07CisgICAgICB0Qy0+bHBjU3RhcnRCYW5kW0hJRklMVF0gPSBpOworICAgICAgdEMtPmxwY1N0YXJ0TGluZVtISUZJTFRdID0gcEMtPnNmYk9mZnNldFtpXTsKIAogICAgICAgdEMtPmNvbmZUYWIudGhyZXNoT25bSElGSUxUXSA9IDE0Mzc7CiAgICAgICB0Qy0+Y29uZlRhYi50aHJlc2hPbltMT0ZJTFRdID0gMTUwMDsKIAogICAgICAgdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltISUZJTFRdID0gdEMtPm1heE9yZGVyOwotICAgICAgdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltMT0ZJTFRdID0gdEMtPm1heE9yZGVyIC0gNzsKKyAgICAgIHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbTE9GSUxUXSA9IGZNYXgoMCwgdEMtPm1heE9yZGVyIC0gNyk7CiAKICAgICAgIHRDLT5jb25mVGFiLnRuc0ZpbHRlckRpcmVjdGlvbltISUZJTFRdID0gRklMVEVSX0RJUkVDVElPTjsKICAgICAgIHRDLT5jb25mVGFiLnRuc0ZpbHRlckRpcmVjdGlvbltMT0ZJTFRdID0gRklMVEVSX0RJUkVDVElPTjsKIAotICAgICAgdEMtPmNvbmZUYWIuYWNmU3BsaXRbSElGSUxUXSA9IC0xOyAgLyogc2lnbmFsIE1lcmdlZDR0bzJRdWFydGVyc0F1dG9Db3JyZWxhdGlvbiBpbiBGREthYWNFbmNfTWVyZ2VkQXV0b0NvcnJlbGF0aW9uKi8KLSAgICAgIHRDLT5jb25mVGFiLmFjZlNwbGl0W0xPRklMVF0gPSAtMTsgIC8qIHNpZ25hbCBNZXJnZWQ0dG8yUXVhcnRlcnNBdXRvQ29ycmVsYXRpb24gaW4gRkRLYWFjRW5jX01lcmdlZEF1dG9Db3JyZWxhdGlvbiAqLworICAgICAgdEMtPmNvbmZUYWIuYWNmU3BsaXRbSElGSUxUXSA9CisgICAgICAgICAgLTE7IC8qIHNpZ25hbCBNZXJnZWQ0dG8yUXVhcnRlcnNBdXRvQ29ycmVsYXRpb24gaW4KKyAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX01lcmdlZEF1dG9Db3JyZWxhdGlvbiovCisgICAgICB0Qy0+Y29uZlRhYi5hY2ZTcGxpdFtMT0ZJTFRdID0KKyAgICAgICAgICAtMTsgLyogc2lnbmFsIE1lcmdlZDR0bzJRdWFydGVyc0F1dG9Db3JyZWxhdGlvbiBpbgorICAgICAgICAgICAgICAgICBGREthYWNFbmNfTWVyZ2VkQXV0b0NvcnJlbGF0aW9uICovCiAKICAgICAgIHRDLT5jb25mVGFiLmZpbHRlckVuYWJsZWRbSElGSUxUXSA9IDE7CiAgICAgICB0Qy0+Y29uZlRhYi5maWx0ZXJFbmFibGVkW0xPRklMVF0gPSAxOwogICAgICAgdEMtPmNvbmZUYWIuc2VwZXJhdGVGaWx0ZXJzQWxsb3dlZCA9IDE7CiAKLSAgICAgIC8qIGNvbXB1dGUgYXV0b2NvcnJlbGF0aW9uIHdpbmRvdyBiYXNlZCBvbiBtYXhpbXVtIGZpbHRlciBvcmRlciBmb3IgZ2l2ZW4gYmxvY2sgdHlwZSAqLworICAgICAgLyogY29tcHV0ZSBhdXRvY29ycmVsYXRpb24gd2luZG93IGJhc2VkIG9uIG1heGltdW0gZmlsdGVyIG9yZGVyIGZvciBnaXZlbgorICAgICAgICogYmxvY2sgdHlwZSAqLwogICAgICAgLyogZm9yIChpID0gMDsgaSA8PSB0Qy0+bWF4T3JkZXIgKyAzOyBpKyspIHsKICAgICAgICAgICAgZmxvYXQgYWNmV2luVGVtcCA9IGFjZlRpbWVSZXMgKiBpOwogICAgICAgICAgICBhY2ZXaW5kb3dbaV0gPSBGTDJGWENPTlNUX0RCTCgxLjBmIC0gYWNmV2luVGVtcCAqIGFjZldpblRlbXApOwogICAgICAgICAgfQogICAgICAgKi8KICAgICAgIGlmIChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKSB7Ci0gICAgICAgIEZES21lbWNweSh0Qy0+YWNmV2luZG93W0hJRklMVF0sIGFjZldpbmRvd1Nob3J0LCBGREttaW4oc2l6ZW9mKGFjZldpbmRvd1Nob3J0KSwgc2l6ZW9mKHRDLT5hY2ZXaW5kb3dbSElGSUxUXSkpKTsKLSAgICAgICAgRkRLbWVtY3B5KHRDLT5hY2ZXaW5kb3dbTE9GSUxUXSwgYWNmV2luZG93U2hvcnQsIEZES21pbihzaXplb2YoYWNmV2luZG93U2hvcnQpLCBzaXplb2YodEMtPmFjZldpbmRvd1tISUZJTFRdKSkpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIEZES21lbWNweSh0Qy0+YWNmV2luZG93W0hJRklMVF0sIGFjZldpbmRvd0xvbmcsIEZES21pbihzaXplb2YoYWNmV2luZG93TG9uZyksIHNpemVvZih0Qy0+YWNmV2luZG93W0hJRklMVF0pKSk7Ci0gICAgICAgIEZES21lbWNweSh0Qy0+YWNmV2luZG93W0xPRklMVF0sIGFjZldpbmRvd0xvbmcsIEZES21pbihzaXplb2YoYWNmV2luZG93TG9uZyksIHNpemVvZih0Qy0+YWNmV2luZG93W0hJRklMVF0pKSk7CisgICAgICAgIEZES21lbWNweSh0Qy0+YWNmV2luZG93W0hJRklMVF0sIGFjZldpbmRvd1Nob3J0LAorICAgICAgICAgICAgICAgICAgZk1pbigoTE9ORylzaXplb2YoYWNmV2luZG93U2hvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAoTE9ORylzaXplb2YodEMtPmFjZldpbmRvd1tISUZJTFRdKSkpOworICAgICAgICBGREttZW1jcHkodEMtPmFjZldpbmRvd1tMT0ZJTFRdLCBhY2ZXaW5kb3dTaG9ydCwKKyAgICAgICAgICAgICAgICAgIGZNaW4oKExPTkcpc2l6ZW9mKGFjZldpbmRvd1Nob3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgKExPTkcpc2l6ZW9mKHRDLT5hY2ZXaW5kb3dbSElGSUxUXSkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZES21lbWNweSh0Qy0+YWNmV2luZG93W0hJRklMVF0sIGFjZldpbmRvd0xvbmcsCisgICAgICAgICAgICAgICAgICBmTWluKChMT05HKXNpemVvZihhY2ZXaW5kb3dMb25nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKExPTkcpc2l6ZW9mKHRDLT5hY2ZXaW5kb3dbSElGSUxUXSkpKTsKKyAgICAgICAgRkRLbWVtY3B5KHRDLT5hY2ZXaW5kb3dbTE9GSUxUXSwgYWNmV2luZG93TG9uZywKKyAgICAgICAgICAgICAgICAgIGZNaW4oKExPTkcpc2l6ZW9mKGFjZldpbmRvd0xvbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAoTE9ORylzaXplb2YodEMtPmFjZldpbmRvd1tISUZJTFRdKSkpOwogICAgICAgfQogICAgICAgYnJlYWs7CiAgICAgY2FzZSA0ODA6Ci0gICAgY2FzZSA1MTI6Ci0gICAgICB7Ci0gICAgICAgIGNvbnN0IFROU19QQVJBTUVURVJfVEFCVUxBVEVEKiBwQ2ZnID0gRkRLYWFjRW5jX0dldFRuc1BhcmFtKGJpdFJhdGUsIGNoYW5uZWxzLCBsZFNiclByZXNlbnQpOworICAgIGNhc2UgNTEyOiB7CisgICAgICBjb25zdCBUTlNfUEFSQU1FVEVSX1RBQlVMQVRFRCAqcENmZyA9CisgICAgICAgICAgRkRLYWFjRW5jX0dldFRuc1BhcmFtKGJpdFJhdGUsIGNoYW5uZWxzLCBsZFNiclByZXNlbnQpOworICAgICAgaWYgKHBDZmcgIT0gTlVMTCkgeworICAgICAgICBGREttZW1jcHkoJih0Qy0+Y29uZlRhYiksIHBDZmcsIHNpemVvZih0Qy0+Y29uZlRhYikpOwogCi0gICAgICAgIGlmICggcENmZyAhPSBOVUxMICkgeworICAgICAgICB0Qy0+bHBjU3RhcnRCYW5kW0hJRklMVF0gPSBGREthYWNFbmNfRnJlcVRvQmFuZFdpZHRoUm91bmRpbmcoCisgICAgICAgICAgICBwQ2ZnLT5maWx0ZXJTdGFydEZyZXFbSElGSUxUXSwgc2FtcGxlUmF0ZSwgcEMtPnNmYkNudCwKKyAgICAgICAgICAgIHBDLT5zZmJPZmZzZXQpOworICAgICAgICB0Qy0+bHBjU3RhcnRMaW5lW0hJRklMVF0gPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdGFydEJhbmRbSElGSUxUXV07CisgICAgICAgIHRDLT5scGNTdGFydEJhbmRbTE9GSUxUXSA9IEZES2FhY0VuY19GcmVxVG9CYW5kV2lkdGhSb3VuZGluZygKKyAgICAgICAgICAgIHBDZmctPmZpbHRlclN0YXJ0RnJlcVtMT0ZJTFRdLCBzYW1wbGVSYXRlLCBwQy0+c2ZiQ250LAorICAgICAgICAgICAgcEMtPnNmYk9mZnNldCk7CisgICAgICAgIHRDLT5scGNTdGFydExpbmVbTE9GSUxUXSA9IHBDLT5zZmJPZmZzZXRbdEMtPmxwY1N0YXJ0QmFuZFtMT0ZJTFRdXTsKIAotICAgICAgICAgIEZES21lbWNweSgmKHRDLT5jb25mVGFiKSwgcENmZywgc2l6ZW9mKHRDLT5jb25mVGFiKSk7Ci0KLSAgICAgICAgICB0Qy0+bHBjU3RhcnRCYW5kW0hJRklMVF0gICAgICAgICA9IEZES2FhY0VuY19GcmVxVG9CYW5kV2l0aFJvdW5kaW5nKHBDZmctPmZpbHRlclN0YXJ0RnJlcVtISUZJTFRdLCBzYW1wbGVSYXRlLCBwQy0+c2ZiQ250LCBwQy0+c2ZiT2Zmc2V0KTsKLSAgICAgICAgICB0Qy0+bHBjU3RhcnRMaW5lW0hJRklMVF0gICAgICAgICA9IHBDLT5zZmJPZmZzZXRbdEMtPmxwY1N0YXJ0QmFuZFtISUZJTFRdXTsKLSAgICAgICAgICB0Qy0+bHBjU3RhcnRCYW5kW0xPRklMVF0gICAgICAgICA9IEZES2FhY0VuY19GcmVxVG9CYW5kV2l0aFJvdW5kaW5nKHBDZmctPmZpbHRlclN0YXJ0RnJlcVtMT0ZJTFRdLCBzYW1wbGVSYXRlLCBwQy0+c2ZiQ250LCBwQy0+c2ZiT2Zmc2V0KTsKLSAgICAgICAgICB0Qy0+bHBjU3RhcnRMaW5lW0xPRklMVF0gICAgICAgICA9IHBDLT5zZmJPZmZzZXRbdEMtPmxwY1N0YXJ0QmFuZFtMT0ZJTFRdXTsKLQotICAgICAgICAgIEZES2FhY0VuY19DYWxjR2F1c3NXaW5kb3codEMtPmFjZldpbmRvd1tISUZJTFRdLCB0Qy0+bWF4T3JkZXIrMSwgc2FtcGxlUmF0ZSwgZ3JhbnVsZUxlbmd0aCwgcENmZy0+dG5zVGltZVJlc29sdXRpb25bSElGSUxUXSwgVE5TX1RJTUVSRVNfU0NBTEUpOwotICAgICAgICAgIEZES2FhY0VuY19DYWxjR2F1c3NXaW5kb3codEMtPmFjZldpbmRvd1tMT0ZJTFRdLCB0Qy0+bWF4T3JkZXIrMSwgc2FtcGxlUmF0ZSwgZ3JhbnVsZUxlbmd0aCwgcENmZy0+dG5zVGltZVJlc29sdXRpb25bTE9GSUxUXSwgVE5TX1RJTUVSRVNfU0NBTEUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIHRDLT50bnNBY3RpdmUgPSBGQUxTRTsgLyogbm8gY29uZmlndXJhdGlvbiBhdmFpbGFibGUsIGRpc2FibGUgdG5zIHRvb2wgKi8KLSAgICAgICAgfQorICAgICAgICBGREthYWNFbmNfQ2FsY0dhdXNzV2luZG93KAorICAgICAgICAgICAgdEMtPmFjZldpbmRvd1tISUZJTFRdLCB0Qy0+bWF4T3JkZXIgKyAxLCBzYW1wbGVSYXRlLCBncmFudWxlTGVuZ3RoLAorICAgICAgICAgICAgcENmZy0+dG5zVGltZVJlc29sdXRpb25bSElGSUxUXSwgVE5TX1RJTUVSRVNfU0NBTEUpOworICAgICAgICBGREthYWNFbmNfQ2FsY0dhdXNzV2luZG93KAorICAgICAgICAgICAgdEMtPmFjZldpbmRvd1tMT0ZJTFRdLCB0Qy0+bWF4T3JkZXIgKyAxLCBzYW1wbGVSYXRlLCBncmFudWxlTGVuZ3RoLAorICAgICAgICAgICAgcENmZy0+dG5zVGltZVJlc29sdXRpb25bTE9GSUxUXSwgVE5TX1RJTUVSRVNfU0NBTEUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdEMtPnRuc0FjdGl2ZSA9CisgICAgICAgICAgICBGQUxTRTsgLyogbm8gY29uZmlndXJhdGlvbiBhdmFpbGFibGUsIGRpc2FibGUgdG5zIHRvb2wgKi8KICAgICAgIH0KLSAgICAgIGJyZWFrOworICAgIH0gYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIHRDLT50bnNBY3RpdmUgPSBGQUxTRTsgLyogbm8gY29uZmlndXJhdGlvbiBhdmFpbGFibGUsIGRpc2FibGUgdG5zIHRvb2wgKi8KICAgfQogCiAgIHJldHVybiBBQUNfRU5DX09LOwotCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00NzEsMjkgKzUxNiwyNSBAQAogICBccmV0dXJuIHNjYWxlIGZhY3RvcgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlubGluZSBJTlQgRkRLYWFjRW5jX1NjYWxlVXBTcGVjdHJ1bSgKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICpkZXN0LAotICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAgICAgICAgKnNyYywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBzdGFydExpbmUsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgc3RvcExpbmUKLSAgICAgICAgKQotewotICAgIElOVCBpLCBzY2FsZTsKK3N0YXRpYyBpbmxpbmUgSU5UIEZES2FhY0VuY19TY2FsZVVwU3BlY3RydW0oRklYUF9EQkwgKmRlc3QsIGNvbnN0IEZJWFBfREJMICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzdGFydExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzdG9wTGluZSkgeworICBJTlQgaSwgc2NhbGU7CiAKLSAgICBGSVhQX0RCTCBtYXhWYWwgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICBGSVhQX0RCTCBtYXhWYWwgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogCi0gICAgLyogR2V0IGhpZ2hlc3QgdmFsdWUgaW4gZ2l2ZW4gc3BlY3RydW0gKi8KLSAgICBmb3IgKGk9c3RhcnRMaW5lOyBpPHN0b3BMaW5lOyBpKyspIHsKLSAgICAgIG1heFZhbCA9IGZpeE1heChtYXhWYWwsZml4cF9hYnMoc3JjW2ldKSk7Ci0gICAgfQotICAgIHNjYWxlID0gQ291bnRMZWFkaW5nQml0cyhtYXhWYWwpOworICAvKiBHZXQgaGlnaGVzdCB2YWx1ZSBpbiBnaXZlbiBzcGVjdHJ1bSAqLworICBmb3IgKGkgPSBzdGFydExpbmU7IGkgPCBzdG9wTGluZTsgaSsrKSB7CisgICAgbWF4VmFsID0gZml4TWF4KG1heFZhbCwgZml4cF9hYnMoc3JjW2ldKSk7CisgIH0KKyAgc2NhbGUgPSBDb3VudExlYWRpbmdCaXRzKG1heFZhbCk7CiAKLSAgICAvKiBTY2FsZSBzcGVjdHJ1bSBhY2NvcmRpbmcgdG8gaGlnaGVzdCB2YWx1ZSAqLwotICAgIGZvciAoaT1zdGFydExpbmU7IGk8c3RvcExpbmU7IGkrKykgewotICAgICAgZGVzdFtpXSA9IHNyY1tpXTw8c2NhbGU7Ci0gICAgfQorICAvKiBTY2FsZSBzcGVjdHJ1bSBhY2NvcmRpbmcgdG8gaGlnaGVzdCB2YWx1ZSAqLworICBmb3IgKGkgPSBzdGFydExpbmU7IGkgPCBzdG9wTGluZTsgaSsrKSB7CisgICAgZGVzdFtpXSA9IHNyY1tpXSA8PCBzY2FsZTsKKyAgfQogCi0gICAgcmV0dXJuIHNjYWxlOworICByZXR1cm4gc2NhbGU7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01MDksMjkgKzU1MCwyNyBAQAogICBccGFyYW0gc2NhbGluZyBvZiB0aGUgbGFnCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW5saW5lIEZJWFBfREJMIEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZSgKLSAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICpzcGVjdHJ1bSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBzdGFydExpbmUsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgc3RvcExpbmUsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgbGFnLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHNjYWxlCi0gICAgICAgICkKLXsKLSAgICBpbnQgaTsKLSAgICBGSVhQX0RCTCByZXN1bHQgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworc3RhdGljIGlubGluZSBGSVhQX0RCTCBGREthYWNFbmNfQ2FsY0F1dG9Db3JyVmFsdWUoY29uc3QgRklYUF9EQkwgKnNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHN0YXJ0TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzdG9wTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2NhbGUpIHsKKyAgaW50IGk7CisgIEZJWFBfREJMIHJlc3VsdCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAKLSAgICBpZiAobGFnPT0wKSB7Ci0gICAgICBmb3IgKGk9c3RhcnRMaW5lOyBpPHN0b3BMaW5lOyBpKyspIHsKLSAgICAgICAgcmVzdWx0ICs9IChmUG93MihzcGVjdHJ1bVtpXSk+PnNjYWxlKTsKLSAgICAgIH0KKyAgLyogVGhpcyB2ZXJzaW9ucyBhbGxvd3MgdG8gc2F2ZSBtZW1vcnkgYWNjZXNzZXMsIHdoZW4gY29tcHV0aW5nIHBvdzIgKi8KKyAgLyogSXQgaXMgb2YgaW50ZXJlc3QgZm9yIEFSTSwgWFRFTlNBIHdpdGhvdXQgcGFyYWxsZWwgbWVtb3J5IGFjY2VzcyAgKi8KKyAgaWYgKGxhZyA9PSAwKSB7CisgICAgZm9yIChpID0gc3RhcnRMaW5lOyBpIDwgc3RvcExpbmU7IGkrKykgeworICAgICAgcmVzdWx0ICs9IChmUG93MihzcGVjdHJ1bVtpXSkgPj4gc2NhbGUpOwogICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGZvciAoaT1zdGFydExpbmU7IGk8KHN0b3BMaW5lLWxhZyk7IGkrKykgewotICAgICAgICByZXN1bHQgKz0gKGZNdWx0KHNwZWN0cnVtW2ldLCBzcGVjdHJ1bVtpK2xhZ10pPj5zY2FsZSk7Ci0gICAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gc3RhcnRMaW5lOyBpIDwgKHN0b3BMaW5lIC0gbGFnKTsgaSsrKSB7CisgICAgICByZXN1bHQgKz0gKGZNdWx0KHNwZWN0cnVtW2ldLCBzcGVjdHJ1bVtpICsgbGFnXSkgPj4gc2NhbGUpOwogICAgIH0KKyAgfQogCi0gICAgcmV0dXJuIHJlc3VsdDsKKyAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTU0NSwxNzIgKzU4NCwxNzMgQEAKICAgXHBhcmFtIGZpbHRlciBzdGFydCBsaW5lCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW5saW5lIEZJWFBfREJMIEZES2FhY0VuY19BdXRvQ29yck5vcm1GYWMoCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAgdmFsdWUsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgc2NhbGUsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAqc2MKLSAgICAgICAgKQotewotICAgICNkZWZpbmUgSExNX01JTl9OUkcgMC4wMDAwMDAwMDM3MjUyOTAyOTg0NjE5MTQwNjI1ZiAvKiAyXi0yOCAqLwotICAgICNkZWZpbmUgTUFYX0lOVl9OUkdGQUMgKDEuZi9ITE1fTUlOX05SRykKK3N0YXRpYyBpbmxpbmUgRklYUF9EQkwgRkRLYWFjRW5jX0F1dG9Db3JyTm9ybUZhYyhjb25zdCBGSVhQX0RCTCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2NhbGUsIElOVCAqc2MpIHsKKyNkZWZpbmUgSExNX01JTl9OUkcgMC4wMDAwMDAwMDM3MjUyOTAyOTg0NjE5MTQwNjI1ZiAvKiAyXi0yOCAqLworI2RlZmluZSBNQVhfSU5WX05SR0ZBQyAoMS5mIC8gSExNX01JTl9OUkcpCiAKLSAgICBGSVhQX0RCTCByZXRWYWx1ZTsKLSAgICBGSVhQX0RCTCBBLCBCOworICBGSVhQX0RCTCByZXRWYWx1ZTsKKyAgRklYUF9EQkwgQSwgQjsKIAotICAgIGlmIChzY2FsZT49MCkgewotICAgICAgQSA9IHZhbHVlOwotICAgICAgQiA9IEZMMkZYQ09OU1RfREJMKEhMTV9NSU5fTlJHKT4+Zml4TWluKERGUkFDVF9CSVRTLTEsc2NhbGUpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIEEgPSB2YWx1ZT4+Zml4TWluKERGUkFDVF9CSVRTLTEsKC1zY2FsZSkpOwotICAgICAgQiA9IEZMMkZYQ09OU1RfREJMKEhMTV9NSU5fTlJHKTsKLSAgICB9CisgIGlmIChzY2FsZSA+PSAwKSB7CisgICAgQSA9IHZhbHVlOworICAgIEIgPSBGTDJGWENPTlNUX0RCTChITE1fTUlOX05SRykgPj4gZml4TWluKERGUkFDVF9CSVRTIC0gMSwgc2NhbGUpOworICB9IGVsc2UgeworICAgIEEgPSB2YWx1ZSA+PiBmaXhNaW4oREZSQUNUX0JJVFMgLSAxLCAoLXNjYWxlKSk7CisgICAgQiA9IEZMMkZYQ09OU1RfREJMKEhMTV9NSU5fTlJHKTsKKyAgfQogCi0gICAgaWYgKEEgPiBCKSB7Ci0gICAgICBpbnQgc2hpZnQgPSAwOwotICAgICAgRklYUF9EQkwgdG1wID0gaW52U3FydE5vcm0yKHZhbHVlLCZzaGlmdCk7CisgIGlmIChBID4gQikgeworICAgIGludCBzaGlmdCA9IDA7CisgICAgRklYUF9EQkwgdG1wID0gaW52U3FydE5vcm0yKHZhbHVlLCAmc2hpZnQpOwogCi0gICAgICByZXRWYWx1ZSA9IGZNdWx0KHRtcCx0bXApOwotICAgICAgKnNjICs9ICgyKnNoaWZ0KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvKiBNQVhfSU5WX05SR0ZBQypGREtwb3coMiwtMjgpID0gMS8yXi0yOCAqIDJeLTI4ID0gMS4wICovCi0gICAgICByZXRWYWx1ZSA9IC8qRkwyRlhDT05TVF9EQkwoTUFYX0lOVl9OUkdGQUMqRkRLcG93KDIsLTI4KSkqLyAoRklYUF9EQkwpTUFYVkFMX0RCTDsKLSAgICAgICpzYyArPSBzY2FsZSsyODsKLSAgICB9CisgICAgcmV0VmFsdWUgPSBmTXVsdCh0bXAsIHRtcCk7CisgICAgKnNjICs9ICgyICogc2hpZnQpOworICB9IGVsc2UgeworICAgIC8qIE1BWF9JTlZfTlJHRkFDKkZES3BvdygyLC0yOCkgPSAxLzJeLTI4ICogMl4tMjggPSAxLjAgKi8KKyAgICByZXRWYWx1ZSA9CisgICAgICAgIC8qRkwyRlhDT05TVF9EQkwoTUFYX0lOVl9OUkdGQUMqRkRLcG93KDIsLTI4KSkqLyAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKyAgICAqc2MgKz0gc2NhbGUgKyAyODsKKyAgfQogCi0gICAgcmV0dXJuIHJldFZhbHVlOworICByZXR1cm4gcmV0VmFsdWU7CiB9CiAKIHN0YXRpYyB2b2lkIEZES2FhY0VuY19NZXJnZWRBdXRvQ29ycmVsYXRpb24oCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAqc3BlY3RydW0sCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgaXNMb3dEZWxheSwKLSAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICBhY2ZXaW5kb3dbTUFYX05VTV9PRl9GSUxURVJTXVtUTlNfTUFYX09SREVSKzMrMV0sCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgbHBjU3RhcnRMaW5lW01BWF9OVU1fT0ZfRklMVEVSU10sCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgbHBjU3RvcExpbmUsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgbWF4T3JkZXIsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgYWNmU3BsaXRbTUFYX05VTV9PRl9GSUxURVJTXSwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICpfcnh4MSwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICpfcnh4MgotICAgICAgICApCi17Ci0gICAgaW50IGksIGlkeDAsIGlkeDEsIGlkeDIsIGlkeDMsIGlkeDQsIGxhZzsKLSAgICBGSVhQX0RCTCByeHgxXzAsIHJ4eDJfMCwgcnh4M18wLCByeHg0XzA7CisgICAgY29uc3QgRklYUF9EQkwgKnNwZWN0cnVtLCBjb25zdCBJTlQgaXNMb3dEZWxheSwKKyAgICBjb25zdCBGSVhQX0RCTCBhY2ZXaW5kb3dbTUFYX05VTV9PRl9GSUxURVJTXVtUTlNfTUFYX09SREVSICsgMyArIDFdLAorICAgIGNvbnN0IElOVCBscGNTdGFydExpbmVbTUFYX05VTV9PRl9GSUxURVJTXSwgY29uc3QgSU5UIGxwY1N0b3BMaW5lLAorICAgIGNvbnN0IElOVCBtYXhPcmRlciwgY29uc3QgSU5UIGFjZlNwbGl0W01BWF9OVU1fT0ZfRklMVEVSU10sIEZJWFBfREJMICpfcnh4MSwKKyAgICBGSVhQX0RCTCAqX3J4eDIpIHsKKyAgaW50IGksIGlkeDAsIGlkeDEsIGlkeDIsIGlkeDMsIGlkeDQsIGxhZzsKKyAgRklYUF9EQkwgcnh4MV8wLCByeHgyXzAsIHJ4eDNfMCwgcnh4NF8wOwogCi0gICAgLyogYnVmZmVyIGZvciB0ZW1wb3JhbCBzcGVjdHJ1bSAqLwotICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChwU3BlY3RydW0sIEZJWFBfREJMLCAoMTAyNCkpOworICAvKiBidWZmZXIgZm9yIHRlbXBvcmFsIHNwZWN0cnVtICovCisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChwU3BlY3RydW0sIEZJWFBfREJMLCAoMTAyNCkpCiAKLSAgICAvKiBwcmUtaW5pdGlhbGl6YXRpb24gb3V0cHV0ICovCi0gICAgRkRLbWVtY2xlYXIoJl9yeHgxWzBdLCBzaXplb2YoRklYUF9EQkwpKihtYXhPcmRlcisxKSk7Ci0gICAgRkRLbWVtY2xlYXIoJl9yeHgyWzBdLCBzaXplb2YoRklYUF9EQkwpKihtYXhPcmRlcisxKSk7CisgIC8qIE1EQ1QgbGluZSBpbmRpY2VzIHNlcGFyYXRpbmcgdGhlIDFzdCwgMm5kLCAzcmQsIGFuZCA0dGggYW5hbHlzaXMgcXVhcnRlcnMKKyAgICovCisgIGlmICgoYWNmU3BsaXRbTE9GSUxUXSA9PSAtMSkgfHwgKGFjZlNwbGl0W0hJRklMVF0gPT0gLTEpKSB7CisgICAgLyogYXV0b2NvcnJlbGF0aW9uIGZ1bmN0aW9uIGZvciAxc3QsIDJuZCwgM3JkLCBhbmQgNHRoIHF1YXJ0ZXIgb2YgdGhlCisgICAgICogc3BlY3RydW0gKi8KKyAgICBpZHgwID0gbHBjU3RhcnRMaW5lW0xPRklMVF07CisgICAgaSA9IGxwY1N0b3BMaW5lIC0gbHBjU3RhcnRMaW5lW0xPRklMVF07CisgICAgaWR4MSA9IGlkeDAgKyBpIC8gNDsKKyAgICBpZHgyID0gaWR4MCArIGkgLyAyOworICAgIGlkeDMgPSBpZHgwICsgaSAqIDMgLyA0OworICAgIGlkeDQgPSBscGNTdG9wTGluZTsKKyAgfSBlbHNlIHsKKyAgICBGREtfQVNTRVJUKGFjZlNwbGl0W0xPRklMVF0gPT0gMSk7CisgICAgRkRLX0FTU0VSVChhY2ZTcGxpdFtISUZJTFRdID09IDMpOworICAgIGkgPSAobHBjU3RvcExpbmUgLSBscGNTdGFydExpbmVbSElGSUxUXSkgLyAzOworICAgIGlkeDAgPSBscGNTdGFydExpbmVbTE9GSUxUXTsKKyAgICBpZHgxID0gbHBjU3RhcnRMaW5lW0hJRklMVF07CisgICAgaWR4MiA9IGlkeDEgKyBpOworICAgIGlkeDMgPSBpZHgyICsgaTsKKyAgICBpZHg0ID0gbHBjU3RvcExpbmU7CisgIH0KIAotICAgIGlkeDAgPSBpZHgxID0gaWR4MiA9IGlkeDMgPSBpZHg0ID0gMDsKKyAgLyogY29weSBzcGVjdHJ1bSB0byB0ZW1wb3JhbCBidWZmZXIgYW5kIHNjYWxlIHVwIGFzIG11Y2ggYXMgcG9zc2libGUgKi8KKyAgSU5UIHNjMSA9IEZES2FhY0VuY19TY2FsZVVwU3BlY3RydW0ocFNwZWN0cnVtLCBzcGVjdHJ1bSwgaWR4MCwgaWR4MSk7CisgIElOVCBzYzIgPSBGREthYWNFbmNfU2NhbGVVcFNwZWN0cnVtKHBTcGVjdHJ1bSwgc3BlY3RydW0sIGlkeDEsIGlkeDIpOworICBJTlQgc2MzID0gRkRLYWFjRW5jX1NjYWxlVXBTcGVjdHJ1bShwU3BlY3RydW0sIHNwZWN0cnVtLCBpZHgyLCBpZHgzKTsKKyAgSU5UIHNjNCA9IEZES2FhY0VuY19TY2FsZVVwU3BlY3RydW0ocFNwZWN0cnVtLCBzcGVjdHJ1bSwgaWR4MywgaWR4NCk7CiAKLSAgICAvKiBNRENUIGxpbmUgaW5kaWNlcyBzZXBhcmF0aW5nIHRoZSAxc3QsIDJuZCwgM3JkLCBhbmQgNHRoIGFuYWx5c2lzIHF1YXJ0ZXJzICovCi0gICAgaWYgKCAoYWNmU3BsaXRbTE9GSUxUXT09LTEpIHx8IChhY2ZTcGxpdFtISUZJTFRdPT0tMSkgKSB7Ci0gICAgICAvKiBhdXRvY29ycmVsYXRpb24gZnVuY3Rpb24gZm9yIDFzdCwgMm5kLCAzcmQsIGFuZCA0dGggcXVhcnRlciBvZiB0aGUgc3BlY3RydW0gKi8KLSAgICAgIGlkeDAgPSBscGNTdGFydExpbmVbTE9GSUxUXTsKLSAgICAgIGkgICAgPSBscGNTdG9wTGluZSAtIGxwY1N0YXJ0TGluZVtMT0ZJTFRdOwotICAgICAgaWR4MSA9IGlkeDAgKyBpIC8gNDsKLSAgICAgIGlkeDIgPSBpZHgwICsgaSAvIDI7Ci0gICAgICBpZHgzID0gaWR4MCArIGkgKiAzIC8gNDsKLSAgICAgIGlkeDQgPSBscGNTdG9wTGluZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBGREtfQVNTRVJUKGFjZlNwbGl0W0xPRklMVF09PTEpOwotICAgICAgRkRLX0FTU0VSVChhY2ZTcGxpdFtISUZJTFRdPT0zKTsKLSAgICAgIGkgICAgPSAobHBjU3RvcExpbmUgLSBscGNTdGFydExpbmVbSElGSUxUXSkgLyAzOwotICAgICAgaWR4MCA9IGxwY1N0YXJ0TGluZVtMT0ZJTFRdOwotICAgICAgaWR4MSA9IGxwY1N0YXJ0TGluZVtISUZJTFRdOwotICAgICAgaWR4MiA9IGlkeDEgKyBpOwotICAgICAgaWR4MyA9IGlkeDIgKyBpOwotICAgICAgaWR4NCA9IGxwY1N0b3BMaW5lOwotICAgIH0KKyAgLyogZ2V0IHNjYWxpbmcgdmFsdWVzIGZvciBzdW1tYXRpb24gKi8KKyAgSU5UIG5zYzEsIG5zYzIsIG5zYzMsIG5zYzQ7CisgIGZvciAobnNjMSA9IDE7ICgxIDw8IG5zYzEpIDwgKGlkeDEgLSBpZHgwKTsgbnNjMSsrKQorICAgIDsKKyAgZm9yIChuc2MyID0gMTsgKDEgPDwgbnNjMikgPCAoaWR4MiAtIGlkeDEpOyBuc2MyKyspCisgICAgOworICBmb3IgKG5zYzMgPSAxOyAoMSA8PCBuc2MzKSA8IChpZHgzIC0gaWR4Mik7IG5zYzMrKykKKyAgICA7CisgIGZvciAobnNjNCA9IDE7ICgxIDw8IG5zYzQpIDwgKGlkeDQgLSBpZHgzKTsgbnNjNCsrKQorICAgIDsKIAotICAgIC8qIGNvcHkgc3BlY3RydW0gdG8gdGVtcG9yYWwgYnVmZmVyIGFuZCBzY2FsZSB1cCBhcyBtdWNoIGFzIHBvc3NpYmxlICovCi0gICAgSU5UIHNjMSA9IEZES2FhY0VuY19TY2FsZVVwU3BlY3RydW0ocFNwZWN0cnVtLCBzcGVjdHJ1bSwgaWR4MCwgaWR4MSk7Ci0gICAgSU5UIHNjMiA9IEZES2FhY0VuY19TY2FsZVVwU3BlY3RydW0ocFNwZWN0cnVtLCBzcGVjdHJ1bSwgaWR4MSwgaWR4Mik7Ci0gICAgSU5UIHNjMyA9IEZES2FhY0VuY19TY2FsZVVwU3BlY3RydW0ocFNwZWN0cnVtLCBzcGVjdHJ1bSwgaWR4MiwgaWR4Myk7Ci0gICAgSU5UIHNjNCA9IEZES2FhY0VuY19TY2FsZVVwU3BlY3RydW0ocFNwZWN0cnVtLCBzcGVjdHJ1bSwgaWR4MywgaWR4NCk7CisgIC8qIGNvbXB1dGUgYXV0b2NvcnJlbGF0aW9uIHZhbHVlIGF0IGxhZyB6ZXJvLCBpLiBlLiBlbmVyZ3ksIGZvciBlYWNoIHF1YXJ0ZXIKKyAgICovCisgIHJ4eDFfMCA9IEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShwU3BlY3RydW0sIGlkeDAsIGlkeDEsIDAsIG5zYzEpOworICByeHgyXzAgPSBGREthYWNFbmNfQ2FsY0F1dG9Db3JyVmFsdWUocFNwZWN0cnVtLCBpZHgxLCBpZHgyLCAwLCBuc2MyKTsKKyAgcnh4M18wID0gRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKHBTcGVjdHJ1bSwgaWR4MiwgaWR4MywgMCwgbnNjMyk7CisgIHJ4eDRfMCA9IEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShwU3BlY3RydW0sIGlkeDMsIGlkeDQsIDAsIG5zYzQpOwogCi0gICAgLyogZ2V0IHNjYWxpbmcgdmFsdWVzIGZvciBzdW1tYXRpb24gKi8KLSAgICBJTlQgbnNjMSwgbnNjMiwgbnNjMywgbnNjNDsKLSAgICBmb3IgKG5zYzE9MTsgKDE8PG5zYzEpPChpZHgxLWlkeDApOyBuc2MxKyspOwotICAgIGZvciAobnNjMj0xOyAoMTw8bnNjMik8KGlkeDItaWR4MSk7IG5zYzIrKyk7Ci0gICAgZm9yIChuc2MzPTE7ICgxPDxuc2MzKTwoaWR4My1pZHgyKTsgbnNjMysrKTsKLSAgICBmb3IgKG5zYzQ9MTsgKDE8PG5zYzQpPChpZHg0LWlkeDMpOyBuc2M0KyspOworICAvKiBjb21wdXRlIGVuZXJneSBub3JtYWxpemF0aW9uIGZhY3RvcnMsIGkuIGUuIDEvZW5lcmd5IChzYXZlcyBzb21lIGRpdmlzaW9ucykKKyAgICovCisgIGlmIChyeHgxXzAgIT0gRkwyRlhDT05TVF9EQkwoMC5mKSkgeworICAgIElOVCBzY19mYWMxID0gLTE7CisgICAgRklYUF9EQkwgZmFjMSA9CisgICAgICAgIEZES2FhY0VuY19BdXRvQ29yck5vcm1GYWMocnh4MV8wLCAoKC0yICogc2MxKSArIG5zYzEpLCAmc2NfZmFjMSk7CisgICAgX3J4eDFbMF0gPSBzY2FsZVZhbHVlKGZNdWx0KHJ4eDFfMCwgZmFjMSksIHNjX2ZhYzEpOwogCi0gICAgLyogY29tcHV0ZSBhdXRvY29ycmVsYXRpb24gdmFsdWUgYXQgbGFnIHplcm8sIGkuIGUuIGVuZXJneSwgZm9yIGVhY2ggcXVhcnRlciAqLwotICAgIHJ4eDFfMCA9IEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShwU3BlY3RydW0sIGlkeDAsIGlkeDEsIDAsIG5zYzEpOwotICAgIHJ4eDJfMCA9IEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShwU3BlY3RydW0sIGlkeDEsIGlkeDIsIDAsIG5zYzIpOwotICAgIHJ4eDNfMCA9IEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShwU3BlY3RydW0sIGlkeDIsIGlkeDMsIDAsIG5zYzMpOwotICAgIHJ4eDRfMCA9IEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShwU3BlY3RydW0sIGlkeDMsIGlkeDQsIDAsIG5zYzQpOwotCi0gICAgLyogY29tcHV0ZSBlbmVyZ3kgbm9ybWFsaXphdGlvbiBmYWN0b3JzLCBpLiBlLiAxL2VuZXJneSAoc2F2ZXMgc29tZSBkaXZpc2lvbnMpICovCi0gICAgaWYgKHJ4eDFfMCAhPSBGTDJGWENPTlNUX0RCTCgwLmYpKQotICAgIHsKLSAgICAgIElOVCBzY19mYWMxID0gLTE7Ci0gICAgICBGSVhQX0RCTCBmYWMxID0gRkRLYWFjRW5jX0F1dG9Db3JyTm9ybUZhYyhyeHgxXzAsICgoLTIqc2MxKStuc2MxKSwgJnNjX2ZhYzEpOwotICAgICAgX3J4eDFbMF0gPSBzY2FsZVZhbHVlKGZNdWx0KHJ4eDFfMCxmYWMxKSxzY19mYWMxKTsKLQotICAgICAgaWYgKGlzTG93RGVsYXkpCi0gICAgICB7Ci0gICAgICAgIGZvciAobGFnID0gMTsgbGFnIDw9IG1heE9yZGVyOyBsYWcrKykgewotICAgICAgICAgIC8qIGNvbXB1dGUgZW5lcmd5LW5vcm1hbGl6ZWQgYW5kIHdpbmRvd2VkIGF1dG9jb3JyZWxhdGlvbiB2YWx1ZXMgYXQgdGhpcyBsYWcgKi8KLSAgICAgICAgICBGSVhQX0RCTCB4MSA9IEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShwU3BlY3RydW0sIGlkeDAsIGlkeDEsIGxhZywgbnNjMSk7Ci0gICAgICAgICAgX3J4eDFbbGFnXSA9IGZNdWx0KHNjYWxlVmFsdWUoZk11bHQoeDEsZmFjMSksc2NfZmFjMSksIGFjZldpbmRvd1tMT0ZJTFRdW2xhZ10pOwotICAgICAgICB9CisgICAgaWYgKGlzTG93RGVsYXkpIHsKKyAgICAgIGZvciAobGFnID0gMTsgbGFnIDw9IG1heE9yZGVyOyBsYWcrKykgeworICAgICAgICAvKiBjb21wdXRlIGVuZXJneS1ub3JtYWxpemVkIGFuZCB3aW5kb3dlZCBhdXRvY29ycmVsYXRpb24gdmFsdWVzIGF0IHRoaXMKKyAgICAgICAgICogbGFnICovCisgICAgICAgIEZJWFBfREJMIHgxID0KKyAgICAgICAgICAgIEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShwU3BlY3RydW0sIGlkeDAsIGlkeDEsIGxhZywgbnNjMSk7CisgICAgICAgIF9yeHgxW2xhZ10gPQorICAgICAgICAgICAgZk11bHQoc2NhbGVWYWx1ZShmTXVsdCh4MSwgZmFjMSksIHNjX2ZhYzEpLCBhY2ZXaW5kb3dbTE9GSUxUXVtsYWddKTsKICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZm9yIChsYWcgPSAxOyBsYWcgPD0gbWF4T3JkZXI7IGxhZysrKSB7Ci0gICAgICAgICAgaWYgKCgzICogbGFnKSA8PSBtYXhPcmRlciArIDMpIHsKLSAgICAgICAgICAgICAgRklYUF9EQkwgeDEgPSBGREthYWNFbmNfQ2FsY0F1dG9Db3JyVmFsdWUocFNwZWN0cnVtLCBpZHgwLCBpZHgxLCBsYWcsIG5zYzEpOwotICAgICAgICAgICAgICBfcnh4MVtsYWddID0gZk11bHQoc2NhbGVWYWx1ZShmTXVsdCh4MSxmYWMxKSxzY19mYWMxKSwgYWNmV2luZG93W0xPRklMVF1bMypsYWddKTsKLSAgICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAobGFnID0gMTsgbGFnIDw9IG1heE9yZGVyOyBsYWcrKykgeworICAgICAgICBpZiAoKDMgKiBsYWcpIDw9IG1heE9yZGVyICsgMykgeworICAgICAgICAgIEZJWFBfREJMIHgxID0KKyAgICAgICAgICAgICAgRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKHBTcGVjdHJ1bSwgaWR4MCwgaWR4MSwgbGFnLCBuc2MxKTsKKyAgICAgICAgICBfcnh4MVtsYWddID0gZk11bHQoc2NhbGVWYWx1ZShmTXVsdCh4MSwgZmFjMSksIHNjX2ZhYzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2ZXaW5kb3dbTE9GSUxUXVszICogbGFnXSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CisgIH0KIAotICAgIC8qIGF1dG8gY29yciBvdmVyIHVwcGVyIDMvNCBvZiBzcGVjdHJ1bSAqLwotICAgIGlmICggISgocnh4Ml8wID09IEZMMkZYQ09OU1RfREJMKDAuZikpICYmIChyeHgzXzAgPT0gRkwyRlhDT05TVF9EQkwoMC5mKSkgJiYgKHJ4eDRfMCA9PSBGTDJGWENPTlNUX0RCTCgwLmYpKSkgKQotICAgIHsKLSAgICAgICAgRklYUF9EQkwgZmFjMiwgZmFjMywgZmFjNDsKLSAgICAgICAgZmFjMiA9IGZhYzMgPSBmYWM0ID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKLSAgICAgICAgSU5UIHNjX2ZhYzIsIHNjX2ZhYzMsIHNjX2ZhYzQ7Ci0gICAgICAgIHNjX2ZhYzIgPSBzY19mYWMzID0gc2NfZmFjNCA9IDA7CisgIC8qIGF1dG8gY29yciBvdmVyIHVwcGVyIDMvNCBvZiBzcGVjdHJ1bSAqLworICBpZiAoISgocnh4Ml8wID09IEZMMkZYQ09OU1RfREJMKDAuZikpICYmIChyeHgzXzAgPT0gRkwyRlhDT05TVF9EQkwoMC5mKSkgJiYKKyAgICAgICAgKHJ4eDRfMCA9PSBGTDJGWENPTlNUX0RCTCgwLmYpKSkpIHsKKyAgICBGSVhQX0RCTCBmYWMyLCBmYWMzLCBmYWM0OworICAgIGZhYzIgPSBmYWMzID0gZmFjNCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgSU5UIHNjX2ZhYzIsIHNjX2ZhYzMsIHNjX2ZhYzQ7CisgICAgc2NfZmFjMiA9IHNjX2ZhYzMgPSBzY19mYWM0ID0gMDsKIAotICAgICAgICBpZiAocnh4Ml8wIT1GTDJGWENPTlNUX0RCTCgwLmYpKSB7Ci0gICAgICAgICAgZmFjMiA9IEZES2FhY0VuY19BdXRvQ29yck5vcm1GYWMocnh4Ml8wLCAoKC0yKnNjMikrbnNjMiksICZzY19mYWMyKTsKLSAgICAgICAgICBzY19mYWMyIC09IDI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJ4eDNfMCE9RkwyRlhDT05TVF9EQkwoMC5mKSkgewotICAgICAgICAgIGZhYzMgPSBGREthYWNFbmNfQXV0b0NvcnJOb3JtRmFjKHJ4eDNfMCwgKCgtMipzYzMpK25zYzMpLCAmc2NfZmFjMyk7Ci0gICAgICAgICAgc2NfZmFjMyAtPSAyOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyeHg0XzAhPUZMMkZYQ09OU1RfREJMKDAuZikpIHsKLSAgICAgICAgICBmYWM0ID0gRkRLYWFjRW5jX0F1dG9Db3JyTm9ybUZhYyhyeHg0XzAsICgoLTIqc2M0KStuc2M0KSwgJnNjX2ZhYzQpOwotICAgICAgICAgIHNjX2ZhYzQgLT0gMjsKLSAgICAgICAgfQotCi0gICAgICAgIF9yeHgyWzBdID0gc2NhbGVWYWx1ZShmTXVsdChyeHgyXzAsZmFjMiksc2NfZmFjMikgKwotICAgICAgICAgICAgICAgICAgIHNjYWxlVmFsdWUoZk11bHQocnh4M18wLGZhYzMpLHNjX2ZhYzMpICsKLSAgICAgICAgICAgICAgICAgICBzY2FsZVZhbHVlKGZNdWx0KHJ4eDRfMCxmYWM0KSxzY19mYWM0KTsKLQotICAgICAgICBmb3IgKGxhZyA9IDE7IGxhZyA8PSBtYXhPcmRlcjsgbGFnKyspIHsKLSAgICAgICAgICAvKiBtZXJnZSBxdWFydGVycyAyLCAzLCA0IGludG8gb25lIGF1dG9jb3JyZWxhdGlvbjsgcXVhcnRlciAxIHN0YXlzIHNlcGFyYXRlICovCi0gICAgICAgICAgRklYUF9EQkwgeDIgPSBzY2FsZVZhbHVlKGZNdWx0KEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZShwU3BlY3RydW0sIGlkeDEsIGlkeDIsIGxhZywgbnNjMiksIGZhYzIpLHNjX2ZhYzIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlVmFsdWUoZk11bHQoRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKHBTcGVjdHJ1bSwgaWR4MiwgaWR4MywgbGFnLCBuc2MzKSwgZmFjMyksc2NfZmFjMykgKwotICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShmTXVsdChGREthYWNFbmNfQ2FsY0F1dG9Db3JyVmFsdWUocFNwZWN0cnVtLCBpZHgzLCBpZHg0LCBsYWcsIG5zYzQpLCBmYWM0KSxzY19mYWM0KTsKLQotICAgICAgICAgIF9yeHgyW2xhZ10gPSBmTXVsdCh4MiwgYWNmV2luZG93W0hJRklMVF1bbGFnXSk7Ci0gICAgICAgIH0KKyAgICBpZiAocnh4Ml8wICE9IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICAgIGZhYzIgPSBGREthYWNFbmNfQXV0b0NvcnJOb3JtRmFjKHJ4eDJfMCwgKCgtMiAqIHNjMikgKyBuc2MyKSwgJnNjX2ZhYzIpOworICAgICAgc2NfZmFjMiAtPSAyOworICAgIH0KKyAgICBpZiAocnh4M18wICE9IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICAgIGZhYzMgPSBGREthYWNFbmNfQXV0b0NvcnJOb3JtRmFjKHJ4eDNfMCwgKCgtMiAqIHNjMykgKyBuc2MzKSwgJnNjX2ZhYzMpOworICAgICAgc2NfZmFjMyAtPSAyOworICAgIH0KKyAgICBpZiAocnh4NF8wICE9IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICAgIGZhYzQgPSBGREthYWNFbmNfQXV0b0NvcnJOb3JtRmFjKHJ4eDRfMCwgKCgtMiAqIHNjNCkgKyBuc2M0KSwgJnNjX2ZhYzQpOworICAgICAgc2NfZmFjNCAtPSAyOwogICAgIH0KIAotICAgIENfQUxMT0NfU0NSQVRDSF9FTkQocFNwZWN0cnVtLCBGSVhQX0RCTCwgKDEwMjQpKTsKKyAgICBfcnh4MlswXSA9IHNjYWxlVmFsdWUoZk11bHQocnh4Ml8wLCBmYWMyKSwgc2NfZmFjMikgKworICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShmTXVsdChyeHgzXzAsIGZhYzMpLCBzY19mYWMzKSArCisgICAgICAgICAgICAgICBzY2FsZVZhbHVlKGZNdWx0KHJ4eDRfMCwgZmFjNCksIHNjX2ZhYzQpOworCisgICAgZm9yIChsYWcgPSAxOyBsYWcgPD0gbWF4T3JkZXI7IGxhZysrKSB7CisgICAgICAvKiBtZXJnZSBxdWFydGVycyAyLCAzLCA0IGludG8gb25lIGF1dG9jb3JyZWxhdGlvbjsgcXVhcnRlciAxIHN0YXlzCisgICAgICAgKiBzZXBhcmF0ZSAqLworICAgICAgRklYUF9EQkwgeDIgPSBzY2FsZVZhbHVlKGZNdWx0KEZES2FhY0VuY19DYWxjQXV0b0NvcnJWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwZWN0cnVtLCBpZHgxLCBpZHgyLCBsYWcsIG5zYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhYzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjX2ZhYzIpICsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShmTXVsdChGREthYWNFbmNfQ2FsY0F1dG9Db3JyVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcGVjdHJ1bSwgaWR4MiwgaWR4MywgbGFnLCBuc2MzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWMzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY19mYWMzKSArCisgICAgICAgICAgICAgICAgICAgIHNjYWxlVmFsdWUoZk11bHQoRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3BlY3RydW0sIGlkeDMsIGlkeDQsIGxhZywgbnNjNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NfZmFjNCk7CisKKyAgICAgIF9yeHgyW2xhZ10gPSBmTXVsdCh4MiwgYWNmV2luZG93W0hJRklMVF1bbGFnXSk7CisgICAgfQorICB9CisKKyAgQ19BTExPQ19TQ1JBVENIX0VORChwU3BlY3RydW0sIEZJWFBfREJMLCAoMTAyNCkpCiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfVG5zRGV0ZWN0CiAgICAgZGVzY3JpcHRpb246ICBkbyBkZWNpc2lvbiwgaWYgVE5TIHNoYWxsIGJlIHVzZWQgb3Igbm90CkBAIC03MjMsNjkgKzc2Myw3MCBAQAogICAgICAgICAgICAgICAgICAgc2ZiLXdpc2UgZW5lcmd5LgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUlOVCBGREthYWNFbmNfVG5zRGV0ZWN0KAotICAgICAgICAgICAgICBUTlNfREFUQSAqdG5zRGF0YSwKLSAgICAgICAgICAgICAgY29uc3QgVE5TX0NPTkZJRyAqdEMsCi0gICAgICAgICAgICAgIFROU19JTkZPKiB0bnNJbmZvLAotICAgICAgICAgICAgICBJTlQgc2ZiQ250LAotICAgICAgICAgICAgICBGSVhQX0RCTCAqc3BlY3RydW0sCi0gICAgICAgICAgICAgIElOVCBzdWJCbG9ja051bWJlciwKLSAgICAgICAgICAgICAgSU5UIGJsb2NrVHlwZQotICAgICAgICAgICAgICApCi17Ci0gIC8qIGF1dG9jb3JyZWxhdGlvbiBmdW5jdGlvbiBmb3IgMXN0LCAybmQsIDNyZCwgYW5kIDR0aCBxdWFydGVyIG9mIHRoZSBzcGVjdHJ1bS4gKi8KLSAgRklYUF9EQkwgcnh4MVtUTlNfTUFYX09SREVSKzFdOyAvKiBoaWdoZXIgcGFydCAqLwotICBGSVhQX0RCTCByeHgyW1ROU19NQVhfT1JERVIrMV07IC8qIGxvd2VyIHBhcnQgKi8KLSAgRklYUF9EQkwgcGFyY29yX3RtcFtUTlNfTUFYX09SREVSXTsKK0lOVCBGREthYWNFbmNfVG5zRGV0ZWN0KFROU19EQVRBICp0bnNEYXRhLCBjb25zdCBUTlNfQ09ORklHICp0QywKKyAgICAgICAgICAgICAgICAgICAgICAgIFROU19JTkZPICp0bnNJbmZvLCBJTlQgc2ZiQ250LCBjb25zdCBGSVhQX0RCTCAqc3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3ViQmxvY2tOdW1iZXIsIElOVCBibG9ja1R5cGUpIHsKKyAgLyogYXV0b2NvcnJlbGF0aW9uIGZ1bmN0aW9uIGZvciAxc3QsIDJuZCwgM3JkLCBhbmQgNHRoIHF1YXJ0ZXIgb2YgdGhlCisgICAqIHNwZWN0cnVtLiAqLworICBGSVhQX0RCTCByeHgxW1ROU19NQVhfT1JERVIgKyAxXTsgLyogaGlnaGVyIHBhcnQgKi8KKyAgRklYUF9EQkwgcnh4MltUTlNfTUFYX09SREVSICsgMV07IC8qIGxvd2VyIHBhcnQgKi8KKyAgRklYUF9MUEMgcGFyY29yX3RtcFtUTlNfTUFYX09SREVSXTsKIAogICBpbnQgaTsKIAotICBUTlNfU1VCQkxPQ0tfSU5GTyAqdHNiaSA9IChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKQotICAgID8gJnRuc0RhdGEtPmRhdGFSYXcuU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXQotICAgIDogJnRuc0RhdGEtPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm87CisgIEZES21lbWNsZWFyKHJ4eDEsIHNpemVvZihyeHgxKSk7CisgIEZES21lbWNsZWFyKHJ4eDIsIHNpemVvZihyeHgyKSk7CiAKLSAgdG5zRGF0YS0+ZmlsdGVyc01lcmdlZCAgPSBGQUxTRTsKKyAgVE5TX1NVQkJMT0NLX0lORk8gKnRzYmkgPQorICAgICAgKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpCisgICAgICAgICAgPyAmdG5zRGF0YS0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdCisgICAgICAgICAgOiAmdG5zRGF0YS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mbzsKIAotICB0c2JpLT50bnNBY3RpdmVbSElGSUxUXSAgICAgICAgID0gRkFMU0U7Ci0gIHRzYmktPnByZWRpY3Rpb25HYWluW0hJRklMVF0gICAgPSAxMDAwOwotICB0c2JpLT50bnNBY3RpdmVbTE9GSUxUXSAgICAgICAgID0gRkFMU0U7Ci0gIHRzYmktPnByZWRpY3Rpb25HYWluW0xPRklMVF0gICAgPSAxMDAwOworICB0bnNEYXRhLT5maWx0ZXJzTWVyZ2VkID0gRkFMU0U7CisKKyAgdHNiaS0+dG5zQWN0aXZlW0hJRklMVF0gPSBGQUxTRTsKKyAgdHNiaS0+cHJlZGljdGlvbkdhaW5bSElGSUxUXSA9IDEwMDA7CisgIHRzYmktPnRuc0FjdGl2ZVtMT0ZJTFRdID0gRkFMU0U7CisgIHRzYmktPnByZWRpY3Rpb25HYWluW0xPRklMVF0gPSAxMDAwOwogCiAgIHRuc0luZm8tPm51bU9mRmlsdGVyc1tzdWJCbG9ja051bWJlcl0gPSAwOwotICB0bnNJbmZvLT5jb2VmUmVzW3N1YkJsb2NrTnVtYmVyXSAgICAgID0gdEMtPmNvZWZSZXM7CisgIHRuc0luZm8tPmNvZWZSZXNbc3ViQmxvY2tOdW1iZXJdID0gdEMtPmNvZWZSZXM7CiAgIGZvciAoaSA9IDA7IGkgPCB0Qy0+bWF4T3JkZXI7IGkrKykgewotICAgIHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF1baV0gPSB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdW2ldID0gMDsKKyAgICB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdW2ldID0KKyAgICAgICAgdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bTE9GSUxUXVtpXSA9IDA7CiAgIH0KIAotICB0bnNJbmZvLT5sZW5ndGhbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0gPSB0bnNJbmZvLT5sZW5ndGhbc3ViQmxvY2tOdW1iZXJdW0xPRklMVF0gPSAwOwotICB0bnNJbmZvLT5vcmRlciBbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0gPSB0bnNJbmZvLT5vcmRlciBbc3ViQmxvY2tOdW1iZXJdW0xPRklMVF0gPSAwOworICB0bnNJbmZvLT5sZW5ndGhbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0gPQorICAgICAgdG5zSW5mby0+bGVuZ3RoW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdID0gMDsKKyAgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0gPQorICAgICAgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdW0xPRklMVF0gPSAwOwogCi0gIGlmICggKHRDLT50bnNBY3RpdmUpICYmICh0Qy0+bWF4T3JkZXI+MCkgKQotICB7CisgIGlmICgodEMtPnRuc0FjdGl2ZSkgJiYgKHRDLT5tYXhPcmRlciA+IDApKSB7CiAgICAgaW50IHN1bVNxckNvZWY7CiAKICAgICBGREthYWNFbmNfTWVyZ2VkQXV0b0NvcnJlbGF0aW9uKAotICAgICAgICAgIHNwZWN0cnVtLAotICAgICAgICAgIHRDLT5pc0xvd0RlbGF5LAotICAgICAgICAgIHRDLT5hY2ZXaW5kb3csCi0gICAgICAgICAgdEMtPmxwY1N0YXJ0TGluZSwKLSAgICAgICAgICB0Qy0+bHBjU3RvcExpbmUsCi0gICAgICAgICAgdEMtPm1heE9yZGVyLAotICAgICAgICAgIHRDLT5jb25mVGFiLmFjZlNwbGl0LAotICAgICAgICAgIHJ4eDEsCi0gICAgICAgICAgcnh4Mik7CisgICAgICAgIHNwZWN0cnVtLCB0Qy0+aXNMb3dEZWxheSwgdEMtPmFjZldpbmRvdywgdEMtPmxwY1N0YXJ0TGluZSwKKyAgICAgICAgdEMtPmxwY1N0b3BMaW5lLCB0Qy0+bWF4T3JkZXIsIHRDLT5jb25mVGFiLmFjZlNwbGl0LCByeHgxLCByeHgyKTsKIAotICAgIC8qIGNvbXB1dGUgaGlnaGVyIFROUyBmaWx0ZXIgaW4gbGF0dGljZSAoUGFyQ29yKSBmb3JtIHdpdGggTGVSb3V4LUd1ZWd1ZW4gYWxnb3JpdGhtICovCi0gICAgdHNiaS0+cHJlZGljdGlvbkdhaW5bSElGSUxUXSA9IEZES2FhY0VuY19BdXRvVG9QYXJjb3Iocnh4MiwgcGFyY29yX3RtcCwgdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltISUZJTFRdKTsKKyAgICAvKiBjb21wdXRlIGhpZ2hlciBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyBpbiBsYXR0aWNlIGZvcm0gKFBhckNvcikgd2l0aAorICAgICAqIExlUm91eC1HdWVndWVuL1NjaHVyIGFsZ29yaXRobSAqLworICAgIHsKKyAgICAgIEZJWFBfREJMIHByZWRpY3Rpb25HYWluX207CisgICAgICBJTlQgcHJlZGljdGlvbkdhaW5fZTsKIAotICAgIC8qIG5vbi1saW5lYXIgcXVhbnRpemF0aW9uIG9mIFROUyBsYXR0aWNlIGNvZWZmaWNpZW50cyB3aXRoIGdpdmVuIHJlc29sdXRpb24gKi8KLSAgICBGREthYWNFbmNfUGFyY29yMkluZGV4KAotICAgICAgICAgICAgcGFyY29yX3RtcCwKLSAgICAgICAgICAgIHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0sCi0gICAgICAgICAgICB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0hJRklMVF0sCi0gICAgICAgICAgICB0Qy0+Y29lZlJlcyk7CisgICAgICBDTHBjX0F1dG9Ub1BhcmNvcihyeHgyLCAwLCBwYXJjb3JfdG1wLCB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0hJRklMVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAmcHJlZGljdGlvbkdhaW5fbSwgJnByZWRpY3Rpb25HYWluX2UpOworICAgICAgdHNiaS0+cHJlZGljdGlvbkdhaW5bSElGSUxUXSA9CisgICAgICAgICAgKElOVClmTXVsdE5vcm0ocHJlZGljdGlvbkdhaW5fbSwgcHJlZGljdGlvbkdhaW5fZSwgMTAwMCwgMzEsIDMxKTsKKyAgICB9CiAKLSAgICAvKiByZWR1Y2UgZmlsdGVyIG9yZGVyIGJ5IHRydW5jYXRpbmcgdHJhaWxpbmcgemVyb3MsIGNvbXB1dGUgc3VtKGFicyhjb2VmcykpICovCisgICAgLyogbm9uLWxpbmVhciBxdWFudGl6YXRpb24gb2YgVE5TIGxhdHRpY2UgY29lZmZpY2llbnRzIHdpdGggZ2l2ZW4gcmVzb2x1dGlvbgorICAgICAqLworICAgIEZES2FhY0VuY19QYXJjb3IySW5kZXgocGFyY29yX3RtcCwgdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bSElGSUxUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbSElGSUxUXSwgdEMtPmNvZWZSZXMpOworCisgICAgLyogcmVkdWNlIGZpbHRlciBvcmRlciBieSB0cnVuY2F0aW5nIHRyYWlsaW5nIHplcm9zLCBjb21wdXRlIHN1bShhYnMoY29lZnMpKQorICAgICAqLwogICAgIGZvciAoaSA9IHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbSElGSUxUXSAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICBpZiAodG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bSElGSUxUXVtpXSAhPSAwKSB7CiAgICAgICAgIGJyZWFrOwpAQCAtNzk2LDM1ICs4MzcsNDkgQEAKIAogICAgIHN1bVNxckNvZWYgPSAwOwogICAgIGZvciAoOyBpID49IDA7IGktLSkgewotICAgICAgc3VtU3FyQ29lZiArPSB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdW2ldICogdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bSElGSUxUXVtpXTsKKyAgICAgIHN1bVNxckNvZWYgKz0gdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bSElGSUxUXVtpXSAqCisgICAgICAgICAgICAgICAgICAgIHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF1baV07CiAgICAgfQogCi0gICAgdG5zSW5mby0+ZGlyZWN0aW9uW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdID0gdEMtPmNvbmZUYWIudG5zRmlsdGVyRGlyZWN0aW9uW0hJRklMVF07CisgICAgdG5zSW5mby0+ZGlyZWN0aW9uW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdID0KKyAgICAgICAgdEMtPmNvbmZUYWIudG5zRmlsdGVyRGlyZWN0aW9uW0hJRklMVF07CiAgICAgdG5zSW5mby0+bGVuZ3RoW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdID0gc2ZiQ250IC0gdEMtPmxwY1N0YXJ0QmFuZFtISUZJTFRdOwogCi0gICAgLyogZGlzYWJsZSBUTlMgaWYgcHJlZGljdGlvbkdhaW4gaXMgbGVzcyB0aGFuIDNkQiBvciBzdW1TcXJDb2VmIGlzIHRvbyBzbWFsbCAqLwotICAgIGlmICgodHNiaS0+cHJlZGljdGlvbkdhaW5bSElGSUxUXSA+IHRDLT5jb25mVGFiLnRocmVzaE9uW0hJRklMVF0pIHx8IChzdW1TcXJDb2VmID4gKHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbSElGSUxUXS8yICsgMikpKQotICAgIHsKKyAgICAvKiBkaXNhYmxlIFROUyBpZiBwcmVkaWN0aW9uR2FpbiBpcyBsZXNzIHRoYW4gM2RCIG9yIHN1bVNxckNvZWYgaXMgdG9vIHNtYWxsCisgICAgICovCisgICAgaWYgKCh0c2JpLT5wcmVkaWN0aW9uR2FpbltISUZJTFRdID4gdEMtPmNvbmZUYWIudGhyZXNoT25bSElGSUxUXSkgfHwKKyAgICAgICAgKHN1bVNxckNvZWYgPiAodEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltISUZJTFRdIC8gMiArIDIpKSkgewogICAgICAgdHNiaS0+dG5zQWN0aXZlW0hJRklMVF0gPSBUUlVFOwogICAgICAgdG5zSW5mby0+bnVtT2ZGaWx0ZXJzW3N1YkJsb2NrTnVtYmVyXSsrOwogCi0gICAgICAvKiBjb21wdXRlIHNlY29uZCBmaWx0ZXIgZm9yIGxvd2VyIHF1YXJ0ZXI7IG9ubHkgYWxsb3dlZCBmb3IgbG9uZyB3aW5kb3dzISAqLwotICAgICAgaWYgKCAoYmxvY2tUeXBlICE9IFNIT1JUX1dJTkRPVykgJiYKLSAgICAgICAgICAgKHRDLT5jb25mVGFiLmZpbHRlckVuYWJsZWRbTE9GSUxUXSkgJiYgKHRDLT5jb25mVGFiLnNlcGVyYXRlRmlsdGVyc0FsbG93ZWQpICkKLSAgICAgIHsKKyAgICAgIC8qIGNvbXB1dGUgc2Vjb25kIGZpbHRlciBmb3IgbG93ZXIgcXVhcnRlcjsgb25seSBhbGxvd2VkIGZvciBsb25nIHdpbmRvd3MhCisgICAgICAgKi8KKyAgICAgIGlmICgoYmxvY2tUeXBlICE9IFNIT1JUX1dJTkRPVykgJiYgKHRDLT5jb25mVGFiLmZpbHRlckVuYWJsZWRbTE9GSUxUXSkgJiYKKyAgICAgICAgICAodEMtPmNvbmZUYWIuc2VwZXJhdGVGaWx0ZXJzQWxsb3dlZCkpIHsKICAgICAgICAgLyogY29tcHV0ZSBzZWNvbmQgZmlsdGVyIGZvciBsb3dlciBmcmVxdWVuY2llcyAqLwogCi0gICAgICAgIC8qIGNvbXB1dGUgVE5TIGZpbHRlciBpbiBsYXR0aWNlIChQYXJDb3IpIGZvcm0gd2l0aCBMZVJvdXgtR3VlZ3VlbiBhbGdvcml0aG0gKi8KLSAgICAgICAgSU5UIHByZWRHYWluID0gRkRLYWFjRW5jX0F1dG9Ub1BhcmNvcihyeHgxLCBwYXJjb3JfdG1wLCB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0xPRklMVF0pOworICAgICAgICAvKiBjb21wdXRlIFROUyBmaWx0ZXIgaW4gbGF0dGljZSAoUGFyQ29yKSBmb3JtIHdpdGggTGVSb3V4LUd1ZWd1ZW4KKyAgICAgICAgICogYWxnb3JpdGhtICovCisgICAgICAgIElOVCBwcmVkR2FpbjsKKyAgICAgICAgeworICAgICAgICAgIEZJWFBfREJMIHByZWRpY3Rpb25HYWluX207CisgICAgICAgICAgSU5UIHByZWRpY3Rpb25HYWluX2U7CiAKLSAgICAgICAgLyogbm9uLWxpbmVhciBxdWFudGl6YXRpb24gb2YgVE5TIGxhdHRpY2UgY29lZmZpY2llbnRzIHdpdGggZ2l2ZW4gcmVzb2x1dGlvbiAqLwotICAgICAgICBGREthYWNFbmNfUGFyY29yMkluZGV4KAotICAgICAgICAgICAgICAgIHBhcmNvcl90bXAsCi0gICAgICAgICAgICAgICAgdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bTE9GSUxUXSwKLSAgICAgICAgICAgICAgICB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0xPRklMVF0sCi0gICAgICAgICAgICAgICAgdEMtPmNvZWZSZXMpOworICAgICAgICAgIENMcGNfQXV0b1RvUGFyY29yKHJ4eDEsIDAsIHBhcmNvcl90bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltMT0ZJTFRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVkaWN0aW9uR2Fpbl9tLCAmcHJlZGljdGlvbkdhaW5fZSk7CisgICAgICAgICAgcHJlZEdhaW4gPQorICAgICAgICAgICAgICAoSU5UKWZNdWx0Tm9ybShwcmVkaWN0aW9uR2Fpbl9tLCBwcmVkaWN0aW9uR2Fpbl9lLCAxMDAwLCAzMSwgMzEpOworICAgICAgICB9CiAKLSAgICAgICAgLyogcmVkdWNlIGZpbHRlciBvcmRlciBieSB0cnVuY2F0aW5nIHRyYWlsaW5nIHplcm9zLCBjb21wdXRlIHN1bShhYnMoY29lZnMpKSAqLworICAgICAgICAvKiBub24tbGluZWFyIHF1YW50aXphdGlvbiBvZiBUTlMgbGF0dGljZSBjb2VmZmljaWVudHMgd2l0aCBnaXZlbgorICAgICAgICAgKiByZXNvbHV0aW9uICovCisgICAgICAgIEZES2FhY0VuY19QYXJjb3IySW5kZXgocGFyY29yX3RtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbTE9GSUxUXSwgdEMtPmNvZWZSZXMpOworCisgICAgICAgIC8qIHJlZHVjZSBmaWx0ZXIgb3JkZXIgYnkgdHJ1bmNhdGluZyB0cmFpbGluZyB6ZXJvcywgY29tcHV0ZQorICAgICAgICAgKiBzdW0oYWJzKGNvZWZzKSkgKi8KICAgICAgICAgZm9yIChpID0gdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltMT0ZJTFRdIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICBpZiAodG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bTE9GSUxUXVtpXSAhPSAwKSB7CiAgICAgICAgICAgICBicmVhazsKQEAgLTgzNCwyOSArODg5LDM3IEBACiAKICAgICAgICAgc3VtU3FyQ29lZiA9IDA7CiAgICAgICAgIGZvciAoOyBpID49IDA7IGktLSkgewotICAgICAgICAgIHN1bVNxckNvZWYgKz0gdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bTE9GSUxUXVtpXSAqIHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0xPRklMVF1baV07CisgICAgICAgICAgc3VtU3FyQ29lZiArPSB0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdW2ldICoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0xPRklMVF1baV07CiAgICAgICAgIH0KIAotICAgICAgICB0bnNJbmZvLT5kaXJlY3Rpb25bc3ViQmxvY2tOdW1iZXJdW0xPRklMVF0gPSB0Qy0+Y29uZlRhYi50bnNGaWx0ZXJEaXJlY3Rpb25bTE9GSUxUXTsKLSAgICAgICAgdG5zSW5mby0+bGVuZ3RoW3N1YkJsb2NrTnVtYmVyXVtMT0ZJTFRdID0gdEMtPmxwY1N0YXJ0QmFuZFtISUZJTFRdIC0gdEMtPmxwY1N0YXJ0QmFuZFtMT0ZJTFRdOworICAgICAgICB0bnNJbmZvLT5kaXJlY3Rpb25bc3ViQmxvY2tOdW1iZXJdW0xPRklMVF0gPQorICAgICAgICAgICAgdEMtPmNvbmZUYWIudG5zRmlsdGVyRGlyZWN0aW9uW0xPRklMVF07CisgICAgICAgIHRuc0luZm8tPmxlbmd0aFtzdWJCbG9ja051bWJlcl1bTE9GSUxUXSA9CisgICAgICAgICAgICB0Qy0+bHBjU3RhcnRCYW5kW0hJRklMVF0gLSB0Qy0+bHBjU3RhcnRCYW5kW0xPRklMVF07CiAKLSAgICAgICAgLyogZmlsdGVyIGxvd2VyIHF1YXJ0ZXIgaWYgZ2FpbiBpcyBoaWdoIGVub3VnaCwgYnV0IG5vdCBpZiBpdCdzIHRvbyBoaWdoICovCi0gICAgICAgIGlmICggKCAocHJlZEdhaW4gPiB0Qy0+Y29uZlRhYi50aHJlc2hPbltMT0ZJTFRdKSAmJiAocHJlZEdhaW4gPCAoMTYwMDAgKiB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0xPRklMVF0pKSApCi0gICAgICAgICAgfHwgKCAoc3VtU3FyQ29lZiA+IDkpICAmJiAoc3VtU3FyQ29lZiA8IDIyICogdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltMT0ZJTFRdKSApICkKLSAgICAgICAgewotICAgICAgICAgIC8qIGNvbXBhcmUgbG93ZXIgdG8gdXBwZXIgZmlsdGVyOyBpZiB0aGV5IGFyZSB2ZXJ5IHNpbWlsYXIsIG1lcmdlIHRoZW0gKi8KKyAgICAgICAgLyogZmlsdGVyIGxvd2VyIHF1YXJ0ZXIgaWYgZ2FpbiBpcyBoaWdoIGVub3VnaCwgYnV0IG5vdCBpZiBpdCdzIHRvbyBoaWdoCisgICAgICAgICAqLworICAgICAgICBpZiAoKChwcmVkR2FpbiA+IHRDLT5jb25mVGFiLnRocmVzaE9uW0xPRklMVF0pICYmCisgICAgICAgICAgICAgKHByZWRHYWluIDwgKDE2MDAwICogdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltMT0ZJTFRdKSkpIHx8CisgICAgICAgICAgICAoKHN1bVNxckNvZWYgPiA5KSAmJgorICAgICAgICAgICAgIChzdW1TcXJDb2VmIDwgMjIgKiB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0xPRklMVF0pKSkgeworICAgICAgICAgIC8qIGNvbXBhcmUgbG93ZXIgdG8gdXBwZXIgZmlsdGVyOyBpZiB0aGV5IGFyZSB2ZXJ5IHNpbWlsYXIsIG1lcmdlIHRoZW0KKyAgICAgICAgICAgKi8KICAgICAgICAgICB0c2JpLT50bnNBY3RpdmVbTE9GSUxUXSA9IFRSVUU7CiAgICAgICAgICAgc3VtU3FyQ29lZiA9IDA7CiAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbTE9GSUxUXTsgaSsrKSB7Ci0gICAgICAgICAgICBzdW1TcXJDb2VmICs9IEZES2Ficyh0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdW2ldIC0gdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bTE9GSUxUXVtpXSk7CisgICAgICAgICAgICBzdW1TcXJDb2VmICs9IGZBYnModG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bSElGSUxUXVtpXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bTE9GSUxUXVtpXSk7CiAgICAgICAgICAgfQotICAgICAgICAgIGlmICggKHN1bVNxckNvZWYgPCAyKSAmJgotICAgICAgICAgICAgICAgKHRuc0luZm8tPmRpcmVjdGlvbltzdWJCbG9ja051bWJlcl1bTE9GSUxUXSA9PSB0bnNJbmZvLT5kaXJlY3Rpb25bc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0pICkKLSAgICAgICAgICB7CisgICAgICAgICAgaWYgKChzdW1TcXJDb2VmIDwgMikgJiYKKyAgICAgICAgICAgICAgKHRuc0luZm8tPmRpcmVjdGlvbltzdWJCbG9ja051bWJlcl1bTE9GSUxUXSA9PQorICAgICAgICAgICAgICAgdG5zSW5mby0+ZGlyZWN0aW9uW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdKSkgewogICAgICAgICAgICAgdG5zRGF0YS0+ZmlsdGVyc01lcmdlZCA9IFRSVUU7Ci0gICAgICAgICAgICB0bnNJbmZvLT5sZW5ndGhbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0gPSBzZmJDbnQgLSB0Qy0+bHBjU3RhcnRCYW5kW0xPRklMVF07CisgICAgICAgICAgICB0bnNJbmZvLT5sZW5ndGhbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0gPQorICAgICAgICAgICAgICAgIHNmYkNudCAtIHRDLT5scGNTdGFydEJhbmRbTE9GSUxUXTsKICAgICAgICAgICAgIGZvciAoOyBpIDwgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF07IGkrKykgewotICAgICAgICAgICAgICBpZiAoRkRLYWJzKHRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF1baV0pID4gMSkgeworICAgICAgICAgICAgICBpZiAoZkFicyh0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdW2ldKSA+IDEpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtODY4LDIyICs5MzEsMTkgQEAKICAgICAgICAgICAgIGlmIChpIDwgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0pIHsKICAgICAgICAgICAgICAgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdW0hJRklMVF0gPSBpICsgMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRuc0luZm8tPm51bU9mRmlsdGVyc1tzdWJCbG9ja051bWJlcl0rKzsKICAgICAgICAgICB9CiAgICAgICAgIH0gLyogZmlsdGVyIGxvd2VyIHBhcnQgKi8KLSAgICAgICAgdHNiaS0+cHJlZGljdGlvbkdhaW5bTE9GSUxUXT1wcmVkR2FpbjsKKyAgICAgICAgdHNiaS0+cHJlZGljdGlvbkdhaW5bTE9GSUxUXSA9IHByZWRHYWluOwogCiAgICAgICB9IC8qIHNlY29uZCBmaWx0ZXIgYWxsb3dlZCAgKi8KLSAgICB9IC8qIGlmIHByZWRpY3Rpb25HYWluID4gMTQzNyAuLi4gKi8KLSAgfSAvKiBtYXhPcmRlciA+IDAgJiYgdG5zQWN0aXZlICovCisgICAgfSAgIC8qIGlmIHByZWRpY3Rpb25HYWluID4gMTQzNyAuLi4gKi8KKyAgfSAgICAgLyogbWF4T3JkZXIgPiAwICYmIHRuc0FjdGl2ZSAqLwogCiAgIHJldHVybiAwOwotCiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQogICBcYnJpZWYgICAgIEZES2FhY0xkRW5jX1Ruc1N5bmMKQEAgLTg5OCw3OSArOTU4LDc3IEBACiAKICAgXHJldHVybiB2b2lkCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBGREthYWNFbmNfVG5zU3luYygKLSAgICAgICAgICAgICBUTlNfREFUQSAqdG5zRGF0YURlc3QsCi0gICAgICAgICAgICAgY29uc3QgVE5TX0RBVEEgKnRuc0RhdGFTcmMsCi0gICAgICAgICAgICAgVE5TX0lORk8gKnRuc0luZm9EZXN0LAotICAgICAgICAgICAgIFROU19JTkZPICp0bnNJbmZvU3JjLAotICAgICAgICAgICAgIGNvbnN0IElOVCBibG9ja1R5cGVEZXN0LAotICAgICAgICAgICAgIGNvbnN0IElOVCBibG9ja1R5cGVTcmMsCi0gICAgICAgICAgICAgY29uc3QgVE5TX0NPTkZJRyAqdEMKLSAgICAgICAgICAgICApCi17Cit2b2lkIEZES2FhY0VuY19UbnNTeW5jKFROU19EQVRBICp0bnNEYXRhRGVzdCwgY29uc3QgVE5TX0RBVEEgKnRuc0RhdGFTcmMsCisgICAgICAgICAgICAgICAgICAgICAgIFROU19JTkZPICp0bnNJbmZvRGVzdCwgVE5TX0lORk8gKnRuc0luZm9TcmMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBibG9ja1R5cGVEZXN0LCBjb25zdCBJTlQgYmxvY2tUeXBlU3JjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTlNfQ09ORklHICp0QykgewogICBpbnQgaSwgdywgYWJzRGlmZiwgbldpbmRvd3M7CiAgIFROU19TVUJCTE9DS19JTkZPICpzYkluZm9EZXN0OwogICBjb25zdCBUTlNfU1VCQkxPQ0tfSU5GTyAqc2JJbmZvU3JjOwogCi0gIC8qIGlmIG9uZSBjaGFubmVsIGNvbnRhaW5zIHNob3J0IGJsb2NrcyBhbmQgdGhlIG90aGVyIG5vdCwgZG8gbm90IHN5bmNocm9uaXplICovCi0gIGlmICggKGJsb2NrVHlwZVNyYyA9PSBTSE9SVF9XSU5ET1cgJiYgYmxvY2tUeXBlRGVzdCAhPSBTSE9SVF9XSU5ET1cpIHx8Ci0gICAgICAgKGJsb2NrVHlwZURlc3QgPT0gU0hPUlRfV0lORE9XICYmIGJsb2NrVHlwZVNyYyAhPSBTSE9SVF9XSU5ET1cpICkKLSAgeworICAvKiBpZiBvbmUgY2hhbm5lbCBjb250YWlucyBzaG9ydCBibG9ja3MgYW5kIHRoZSBvdGhlciBub3QsIGRvIG5vdCBzeW5jaHJvbml6ZQorICAgKi8KKyAgaWYgKChibG9ja1R5cGVTcmMgPT0gU0hPUlRfV0lORE9XICYmIGJsb2NrVHlwZURlc3QgIT0gU0hPUlRfV0lORE9XKSB8fAorICAgICAgKGJsb2NrVHlwZURlc3QgPT0gU0hPUlRfV0lORE9XICYmIGJsb2NrVHlwZVNyYyAhPSBTSE9SVF9XSU5ET1cpKSB7CiAgICAgcmV0dXJuOwogICB9CiAKICAgaWYgKGJsb2NrVHlwZURlc3QgIT0gU0hPUlRfV0lORE9XKSB7CiAgICAgc2JJbmZvRGVzdCA9ICZ0bnNEYXRhRGVzdC0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mbzsKLSAgICBzYkluZm9TcmMgID0gJnRuc0RhdGFTcmMtPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm87Ci0gICAgbldpbmRvd3MgICA9IDE7CisgICAgc2JJbmZvU3JjID0gJnRuc0RhdGFTcmMtPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm87CisgICAgbldpbmRvd3MgPSAxOwogICB9IGVsc2UgewogICAgIHNiSW5mb0Rlc3QgPSAmdG5zRGF0YURlc3QtPmRhdGFSYXcuU2hvcnQuc3ViQmxvY2tJbmZvWzBdOwotICAgIHNiSW5mb1NyYyAgPSAmdG5zRGF0YVNyYy0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bMF07Ci0gICAgbldpbmRvd3MgICA9IDg7CisgICAgc2JJbmZvU3JjID0gJnRuc0RhdGFTcmMtPmRhdGFSYXcuU2hvcnQuc3ViQmxvY2tJbmZvWzBdOworICAgIG5XaW5kb3dzID0gODsKICAgfQogCi0gIGZvciAodz0wOyB3PG5XaW5kb3dzOyB3KyspIHsKLSAgICAgIGNvbnN0IFROU19TVUJCTE9DS19JTkZPICpwU2JJbmZvU3JjVyAgPSBzYkluZm9TcmMgICsgdzsKLSAgICAgIFROU19TVUJCTE9DS19JTkZPICAgICAgICpwU2JJbmZvRGVzdFcgPSBzYkluZm9EZXN0ICsgdzsKLSAgICAgIElOVCBkb1N5bmMgPSAxLCBhYnNEaWZmU3VtID0gMDsKKyAgZm9yICh3ID0gMDsgdyA8IG5XaW5kb3dzOyB3KyspIHsKKyAgICBjb25zdCBUTlNfU1VCQkxPQ0tfSU5GTyAqcFNiSW5mb1NyY1cgPSBzYkluZm9TcmMgKyB3OworICAgIFROU19TVUJCTE9DS19JTkZPICpwU2JJbmZvRGVzdFcgPSBzYkluZm9EZXN0ICsgdzsKKyAgICBJTlQgZG9TeW5jID0gMSwgYWJzRGlmZlN1bSA9IDA7CiAKLSAgICAgIC8qIGlmIFROUyBpcyBhY3RpdmUgaW4gYXQgbGVhc3Qgb25lIGNoYW5uZWwsIGNoZWNrIGlmIFBhckNvciBjb2VmZmljaWVudHMgb2YgaGlnaGVyIGZpbHRlciBhcmUgc2ltaWxhciAqLwotICAgICAgaWYgKHBTYkluZm9EZXN0Vy0+dG5zQWN0aXZlW0hJRklMVF0gfHwgcFNiSW5mb1NyY1ctPnRuc0FjdGl2ZVtISUZJTFRdKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0Qy0+bWF4T3JkZXI7IGkrKykgewotICAgICAgICAgIGFic0RpZmYgPSBGREthYnModG5zSW5mb0Rlc3QtPmNvZWZbd11bSElGSUxUXVtpXSAtIHRuc0luZm9TcmMtPmNvZWZbd11bSElGSUxUXVtpXSk7Ci0gICAgICAgICAgYWJzRGlmZlN1bSArPSBhYnNEaWZmOwotICAgICAgICAgIC8qIGlmIGNvZWZmaWNpZW50cyBkaXZlcmdlIHRvbyBtdWNoIGJldHdlZW4gY2hhbm5lbHMsIGRvIG5vdCBzeW5jaHJvbml6ZSAqLwotICAgICAgICAgIGlmICgoYWJzRGlmZiA+IDEpIHx8IChhYnNEaWZmU3VtID4gMikpIHsKLSAgICAgICAgICAgIGRvU3luYyA9IDA7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAvKiBpZiBUTlMgaXMgYWN0aXZlIGluIGF0IGxlYXN0IG9uZSBjaGFubmVsLCBjaGVjayBpZiBQYXJDb3IgY29lZmZpY2llbnRzIG9mCisgICAgICogaGlnaGVyIGZpbHRlciBhcmUgc2ltaWxhciAqLworICAgIGlmIChwU2JJbmZvRGVzdFctPnRuc0FjdGl2ZVtISUZJTFRdIHx8IHBTYkluZm9TcmNXLT50bnNBY3RpdmVbSElGSUxUXSkgeworICAgICAgZm9yIChpID0gMDsgaSA8IHRDLT5tYXhPcmRlcjsgaSsrKSB7CisgICAgICAgIGFic0RpZmYgPSBmQWJzKHRuc0luZm9EZXN0LT5jb2VmW3ddW0hJRklMVF1baV0gLQorICAgICAgICAgICAgICAgICAgICAgICB0bnNJbmZvU3JjLT5jb2VmW3ddW0hJRklMVF1baV0pOworICAgICAgICBhYnNEaWZmU3VtICs9IGFic0RpZmY7CisgICAgICAgIC8qIGlmIGNvZWZmaWNpZW50cyBkaXZlcmdlIHRvbyBtdWNoIGJldHdlZW4gY2hhbm5lbHMsIGRvIG5vdCBzeW5jaHJvbml6ZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChhYnNEaWZmID4gMSkgfHwgKGFic0RpZmZTdW0gPiAyKSkgeworICAgICAgICAgIGRvU3luYyA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGRvU3luYykgeworICAgICAgICAvKiBpZiBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIHdhcyBkZXRlY3RlZCwgc3luY2hyb25pemUgY29lZmZpY2llbnQKKyAgICAgICAgICogc2V0cyAqLworICAgICAgICBpZiAocFNiSW5mb1NyY1ctPnRuc0FjdGl2ZVtISUZJTFRdKSB7CisgICAgICAgICAgLyogbm8gZGVzdCBmaWx0ZXIsIG9yIG1vcmUgZGVzdCB0aGFuIHNvdXJjZSBmaWx0ZXJzOiB1c2Ugb25lIGRlc3QKKyAgICAgICAgICAgKiBmaWx0ZXIgKi8KKyAgICAgICAgICBpZiAoKCFwU2JJbmZvRGVzdFctPnRuc0FjdGl2ZVtISUZJTFRdKSB8fAorICAgICAgICAgICAgICAoKHBTYkluZm9EZXN0Vy0+dG5zQWN0aXZlW0hJRklMVF0pICYmCisgICAgICAgICAgICAgICAodG5zSW5mb0Rlc3QtPm51bU9mRmlsdGVyc1t3XSA+IHRuc0luZm9TcmMtPm51bU9mRmlsdGVyc1t3XSkpKSB7CisgICAgICAgICAgICBwU2JJbmZvRGVzdFctPnRuc0FjdGl2ZVtISUZJTFRdID0gdG5zSW5mb0Rlc3QtPm51bU9mRmlsdGVyc1t3XSA9IDE7CiAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgICAgdG5zRGF0YURlc3QtPmZpbHRlcnNNZXJnZWQgPSB0bnNEYXRhU3JjLT5maWx0ZXJzTWVyZ2VkOworICAgICAgICAgIHRuc0luZm9EZXN0LT5vcmRlclt3XVtISUZJTFRdID0gdG5zSW5mb1NyYy0+b3JkZXJbd11bSElGSUxUXTsKKyAgICAgICAgICB0bnNJbmZvRGVzdC0+bGVuZ3RoW3ddW0hJRklMVF0gPSB0bnNJbmZvU3JjLT5sZW5ndGhbd11bSElGSUxUXTsKKyAgICAgICAgICB0bnNJbmZvRGVzdC0+ZGlyZWN0aW9uW3ddW0hJRklMVF0gPSB0bnNJbmZvU3JjLT5kaXJlY3Rpb25bd11bSElGSUxUXTsKKyAgICAgICAgICB0bnNJbmZvRGVzdC0+Y29lZkNvbXByZXNzW3ddW0hJRklMVF0gPQorICAgICAgICAgICAgICB0bnNJbmZvU3JjLT5jb2VmQ29tcHJlc3Nbd11bSElGSUxUXTsKIAotICAgICAgICBpZiAoZG9TeW5jKSB7Ci0gICAgICAgICAgICAvKiBpZiBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIHdhcyBkZXRlY3RlZCwgc3luY2hyb25pemUgY29lZmZpY2llbnQgc2V0cyAqLwotICAgICAgICAgICAgaWYgKHBTYkluZm9TcmNXLT50bnNBY3RpdmVbSElGSUxUXSkgewotICAgICAgICAgICAgICAvKiBubyBkZXN0IGZpbHRlciwgb3IgbW9yZSBkZXN0IHRoYW4gc291cmNlIGZpbHRlcnM6IHVzZSBvbmUgZGVzdCBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgaWYgKCghcFNiSW5mb0Rlc3RXLT50bnNBY3RpdmVbSElGSUxUXSkgfHwKLSAgICAgICAgICAgICAgICAgICgocFNiSW5mb0Rlc3RXLT50bnNBY3RpdmVbSElGSUxUXSkgJiYgKHRuc0luZm9EZXN0LT5udW1PZkZpbHRlcnNbd10gPiB0bnNJbmZvU3JjLT5udW1PZkZpbHRlcnNbd10pKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBTYkluZm9EZXN0Vy0+dG5zQWN0aXZlW0hJRklMVF0gPSB0bnNJbmZvRGVzdC0+bnVtT2ZGaWx0ZXJzW3ddID0gMTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB0bnNEYXRhRGVzdC0+ZmlsdGVyc01lcmdlZCA9IHRuc0RhdGFTcmMtPmZpbHRlcnNNZXJnZWQ7Ci0gICAgICAgICAgICAgIHRuc0luZm9EZXN0LT5vcmRlciAgICAgICBbd11bSElGSUxUXSA9IHRuc0luZm9TcmMtPm9yZGVyICAgICAgIFt3XVtISUZJTFRdOwotICAgICAgICAgICAgICB0bnNJbmZvRGVzdC0+bGVuZ3RoICAgICAgW3ddW0hJRklMVF0gPSB0bnNJbmZvU3JjLT5sZW5ndGggICAgICBbd11bSElGSUxUXTsKLSAgICAgICAgICAgICAgdG5zSW5mb0Rlc3QtPmRpcmVjdGlvbiAgIFt3XVtISUZJTFRdID0gdG5zSW5mb1NyYy0+ZGlyZWN0aW9uICAgW3ddW0hJRklMVF07Ci0gICAgICAgICAgICAgIHRuc0luZm9EZXN0LT5jb2VmQ29tcHJlc3Nbd11bSElGSUxUXSA9IHRuc0luZm9TcmMtPmNvZWZDb21wcmVzc1t3XVtISUZJTFRdOwotCi0gICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0Qy0+bWF4T3JkZXI7IGkrKykgewotICAgICAgICAgICAgICAgIHRuc0luZm9EZXN0LT5jb2VmW3ddW0hJRklMVF1baV0gPSB0bnNJbmZvU3JjLT5jb2VmW3ddW0hJRklMVF1baV07Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgcFNiSW5mb0Rlc3RXLT50bnNBY3RpdmVbSElGSUxUXSA9IHRuc0luZm9EZXN0LT5udW1PZkZpbHRlcnNbd10gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdEMtPm1heE9yZGVyOyBpKyspIHsKKyAgICAgICAgICAgIHRuc0luZm9EZXN0LT5jb2VmW3ddW0hJRklMVF1baV0gPSB0bnNJbmZvU3JjLT5jb2VmW3ddW0hJRklMVF1baV07CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICBwU2JJbmZvRGVzdFctPnRuc0FjdGl2ZVtISUZJTFRdID0gdG5zSW5mb0Rlc3QtPm51bU9mRmlsdGVyc1t3XSA9IDA7CisgICAgICB9CiAgICAgfQorICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05OTAsMjE4ICsxMDQ4LDEzMCBAQAogCiAgIFxyZXR1cm4gRVJST1IgU1RBVFVTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UIEZES2FhY0VuY19UbnNFbmNvZGUoCi0gICAgICAgIFROU19JTkZPKiB0bnNJbmZvLAotICAgICAgICBUTlNfREFUQSogdG5zRGF0YSwKLSAgICAgICAgY29uc3QgSU5UIG51bU9mU2ZiLAotICAgICAgICBjb25zdCBUTlNfQ09ORklHICp0QywKLSAgICAgICAgY29uc3QgSU5UIGxvd1Bhc3NMaW5lLAotICAgICAgICBGSVhQX0RCTCogc3BlY3RydW0sCi0gICAgICAgIGNvbnN0IElOVCBzdWJCbG9ja051bWJlciwKLSAgICAgICAgY29uc3QgSU5UIGJsb2NrVHlwZQotICAgICAgICApCi17Ci0gICAgSU5UIGksIHN0YXJ0TGluZSwgc3RvcExpbmU7CitJTlQgRkRLYWFjRW5jX1Ruc0VuY29kZShUTlNfSU5GTyAqdG5zSW5mbywgVE5TX0RBVEEgKnRuc0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbnVtT2ZTZmIsIGNvbnN0IFROU19DT05GSUcgKnRDLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGxvd1Bhc3NMaW5lLCBGSVhQX0RCTCAqc3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc3ViQmxvY2tOdW1iZXIsIGNvbnN0IElOVCBibG9ja1R5cGUpIHsKKyAgSU5UIGksIHN0YXJ0TGluZSwgc3RvcExpbmU7CiAKLSAgICBpZiAoICggKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpICYmICghdG5zRGF0YS0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdLnRuc0FjdGl2ZVtISUZJTFRdKSApCi0gICAgICB8fCAoIChibG9ja1R5cGUgIT0gU0hPUlRfV0lORE9XKSAmJiAoIXRuc0RhdGEtPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlW0hJRklMVF0pICkgKQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KKyAgaWYgKCgoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVykgJiYKKyAgICAgICAoIXRuc0RhdGEtPmRhdGFSYXcuU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXQorICAgICAgICAgICAgIC50bnNBY3RpdmVbSElGSUxUXSkpIHx8CisgICAgICAoKGJsb2NrVHlwZSAhPSBTSE9SVF9XSU5ET1cpICYmCisgICAgICAgKCF0bnNEYXRhLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZVtISUZJTFRdKSkpIHsKKyAgICByZXR1cm4gMTsKKyAgfQogCi0gICAgc3RhcnRMaW5lID0gKHRuc0RhdGEtPmZpbHRlcnNNZXJnZWQpID8gdEMtPmxwY1N0YXJ0TGluZVtMT0ZJTFRdIDogdEMtPmxwY1N0YXJ0TGluZVtISUZJTFRdOwotICAgIHN0b3BMaW5lICA9IHRDLT5scGNTdG9wTGluZTsKKyAgc3RhcnRMaW5lID0gKHRuc0RhdGEtPmZpbHRlcnNNZXJnZWQpID8gdEMtPmxwY1N0YXJ0TGluZVtMT0ZJTFRdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRDLT5scGNTdGFydExpbmVbSElGSUxUXTsKKyAgc3RvcExpbmUgPSB0Qy0+bHBjU3RvcExpbmU7CiAKLSAgICBmb3IgKGk9MDsgaTx0bnNJbmZvLT5udW1PZkZpbHRlcnNbc3ViQmxvY2tOdW1iZXJdOyBpKyspIHsKKyAgZm9yIChpID0gMDsgaSA8IHRuc0luZm8tPm51bU9mRmlsdGVyc1tzdWJCbG9ja051bWJlcl07IGkrKykgeworICAgIElOVCBscGNHYWluRmFjdG9yOworICAgIEZJWFBfTFBDIExwY0NvZWZmW1ROU19NQVhfT1JERVJdOworICAgIEZJWFBfREJMIHdvcmtCdWZmZXJbVE5TX01BWF9PUkRFUl07CisgICAgRklYUF9MUEMgcGFyY29yX3RtcFtUTlNfTUFYX09SREVSXTsKIAotICAgICAgICBJTlQgbHBjR2FpbkZhY3RvcjsKLSAgICAgICAgRklYUF9EQkwgTHBjQ29lZmZbVE5TX01BWF9PUkRFUl07Ci0gICAgICAgIEZJWFBfREJMIHdvcmtCdWZmZXJbVE5TX01BWF9PUkRFUl07Ci0gICAgICAgIEZJWFBfREJMIHBhcmNvcl90bXBbVE5TX01BWF9PUkRFUl07CisgICAgRkRLYWFjRW5jX0luZGV4MlBhcmNvcih0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtpXSwgcGFyY29yX3RtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0luZm8tPm9yZGVyW3N1YkJsb2NrTnVtYmVyXVtpXSwgdEMtPmNvZWZSZXMpOwogCi0gICAgICAgIEZES2FhY0VuY19JbmRleDJQYXJjb3IoCi0gICAgICAgICAgICAgICAgdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1baV0sCi0gICAgICAgICAgICAgICAgcGFyY29yX3RtcCwKLSAgICAgICAgICAgICAgICB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl1baV0sCi0gICAgICAgICAgICAgICAgdEMtPmNvZWZSZXMpOworICAgIGxwY0dhaW5GYWN0b3IgPSBDTHBjX1BhcmNvclRvTHBjKAorICAgICAgICBwYXJjb3JfdG1wLCBMcGNDb2VmZiwgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdW2ldLCB3b3JrQnVmZmVyKTsKIAotICAgICAgICBscGNHYWluRmFjdG9yID0gRkRLYWFjRW5jX1BhcmNvclRvTHBjKAotICAgICAgICAgICAgICAgIHBhcmNvcl90bXAsCi0gICAgICAgICAgICAgICAgTHBjQ29lZmYsCi0gICAgICAgICAgICAgICAgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdW2ldLAotICAgICAgICAgICAgICAgIHdvcmtCdWZmZXIpOworICAgIEZES21lbWNsZWFyKHdvcmtCdWZmZXIsIFROU19NQVhfT1JERVIgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICBDTHBjX0FuYWx5c2lzKCZzcGVjdHJ1bVtzdGFydExpbmVdLCBzdG9wTGluZSAtIHN0YXJ0TGluZSwgTHBjQ29lZmYsCisgICAgICAgICAgICAgICAgICBscGNHYWluRmFjdG9yLCB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl1baV0sIHdvcmtCdWZmZXIsCisgICAgICAgICAgICAgICAgICBOVUxMKTsKIAotICAgICAgICBGREthYWNFbmNfQW5hbHlzaXNGaWx0ZXIoCi0gICAgICAgICAgICAgICAgJnNwZWN0cnVtW3N0YXJ0TGluZV0sCi0gICAgICAgICAgICAgICAgc3RvcExpbmUgLSBzdGFydExpbmUsCi0gICAgICAgICAgICAgICAgTHBjQ29lZmYsCi0gICAgICAgICAgICAgICAgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdW2ldLAotICAgICAgICAgICAgICAgIGxwY0dhaW5GYWN0b3IpOworICAgIC8qIHVwZGF0ZSBmb3Igc2Vjb25kIGZpbHRlciAqLworICAgIHN0YXJ0TGluZSA9IHRDLT5scGNTdGFydExpbmVbTE9GSUxUXTsKKyAgICBzdG9wTGluZSA9IHRDLT5scGNTdGFydExpbmVbSElGSUxUXTsKKyAgfQogCi0gICAgICAgIC8qIHVwZGF0ZSBmb3Igc2Vjb25kIGZpbHRlciAqLwotICAgICAgICBzdGFydExpbmUgPSB0Qy0+bHBjU3RhcnRMaW5lW0xPRklMVF07Ci0gICAgICAgIHN0b3BMaW5lICA9IHRDLT5scGNTdGFydExpbmVbSElGSUxUXTsKLSAgICB9Ci0KLSAgICByZXR1cm4oMCk7Ci0KKyAgcmV0dXJuICgwKTsKIH0KIAotc3RhdGljIHZvaWQgRkRLYWFjRW5jX0NhbGNHYXVzc1dpbmRvdygKLSAgICAgICAgRklYUF9EQkwgKndpbiwKLSAgICAgICAgY29uc3QgaW50IHdpblNpemUsCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGluZ1JhdGUsCi0gICAgICAgIGNvbnN0IElOVCB0cmFuc2Zvcm1SZXNvbHV0aW9uLAotICAgICAgICBjb25zdCBGSVhQX0RCTCB0aW1lUmVzb2x1dGlvbiwKLSAgICAgICAgY29uc3QgSU5UIHRpbWVSZXNvbHV0aW9uX2UKLSAgICAgICAgKQotewotICAjZGVmaW5lIFBJX0UgICAgICAgICAgICgyKQotICAjZGVmaW5lIFBJX00gICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDMuMTQxNmYvKGZsb2F0KSgxPDxQSV9FKSkKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19DYWxjR2F1c3NXaW5kb3coRklYUF9EQkwgKndpbiwgY29uc3QgaW50IHdpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB0cmFuc2Zvcm1SZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCB0aW1lUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHRpbWVSZXNvbHV0aW9uX2UpIHsKKyNkZWZpbmUgUElfRSAoMikKKyNkZWZpbmUgUElfTSBGTDJGWENPTlNUX0RCTCgzLjE0MTZmIC8gKGZsb2F0KSgxIDw8IFBJX0UpKQogCi0gICNkZWZpbmUgRVVMRVJfRSAgICAgICAgKDIpCi0gICNkZWZpbmUgRVVMRVJfTSAgICAgICAgRkwyRlhDT05TVF9EQkwoMi43MTgzLyhmbG9hdCkoMTw8RVVMRVJfRSkpCisjZGVmaW5lIEVVTEVSX0UgKDIpCisjZGVmaW5lIEVVTEVSX00gRkwyRlhDT05TVF9EQkwoMi43MTgzIC8gKGZsb2F0KSgxIDw8IEVVTEVSX0UpKQogCi0gICNkZWZpbmUgQ09FRkZfTE9PUF9TQ0FMRSAoNCkKKyNkZWZpbmUgQ09FRkZfTE9PUF9TQ0FMRSAoNCkKIAogICBJTlQgaSwgZTEsIGUyLCBnYXVzc0V4cF9lOwogICBGSVhQX0RCTCBnYXVzc0V4cF9tOwogCiAgIC8qIGNhbGMuIHdpbmRvdyBleHBvbmVudCBmcm9tIHRpbWUgcmVzb2x1dGlvbjoKICAgICoKLSAgICogICBnYXVzc0V4cCA9IFBJICogc2FtcGxpbmdSYXRlICogMC4wMDFmICogdGltZVJlc29sdXRpb24gLyB0cmFuc2Zvcm1SZXNvbHV0aW9uOwotICAgKiAgIGdhdXNzRXhwID0gLTAuNWYgKiBnYXVzc0V4cCAqIGdhdXNzRXhwOworICAgKiAgIGdhdXNzRXhwID0gUEkgKiBzYW1wbGluZ1JhdGUgKiAwLjAwMWYgKiB0aW1lUmVzb2x1dGlvbiAvCisgICAqIHRyYW5zZm9ybVJlc29sdXRpb247IGdhdXNzRXhwID0gLTAuNWYgKiBnYXVzc0V4cCAqIGdhdXNzRXhwOwogICAgKi8KLSAgZ2F1c3NFeHBfbSA9IGZNdWx0Tm9ybSh0aW1lUmVzb2x1dGlvbiwgZk11bHQoUElfTSwgZkRpdk5vcm0oIChGSVhQX0RCTCkoc2FtcGxpbmdSYXRlKSwgKEZJWFBfREJMKShMT05HKSh0cmFuc2Zvcm1SZXNvbHV0aW9uKjEwMDAuZiksICZlMSkpLCAmZTIpOworICBnYXVzc0V4cF9tID0gZk11bHROb3JtKAorICAgICAgdGltZVJlc29sdXRpb24sCisgICAgICBmTXVsdChQSV9NLAorICAgICAgICAgICAgZkRpdk5vcm0oKEZJWFBfREJMKShzYW1wbGluZ1JhdGUpLAorICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKShMT05HKSh0cmFuc2Zvcm1SZXNvbHV0aW9uICogMTAwMC5mKSwgJmUxKSksCisgICAgICAmZTIpOwogICBnYXVzc0V4cF9tID0gLWZQb3cyRGl2MihnYXVzc0V4cF9tKTsKLSAgZ2F1c3NFeHBfZSA9IDIqKGUxK2UyK3RpbWVSZXNvbHV0aW9uX2UrUElfRSk7CisgIGdhdXNzRXhwX2UgPSAyICogKGUxICsgZTIgKyB0aW1lUmVzb2x1dGlvbl9lICsgUElfRSk7CiAKLSAgRkRLX0FTU0VSVCggd2luU2l6ZSA8ICgxPDxDT0VGRl9MT09QX1NDQUxFKSApOworICBGREtfQVNTRVJUKHdpblNpemUgPCAoMSA8PCBDT0VGRl9MT09QX1NDQUxFKSk7CiAKICAgLyogY2FsYy4gd2luZG93IGNvZWZmaWNpZW50cwogICAgKiAgIHdpbltpXSA9IChmbG9hdClleHAoIGdhdXNzRXhwICogKGkrMC41KSAqIChpKzAuNSkgKTsKICAgICovCi0gIGZvciggaT0wOyBpPHdpblNpemU7IGkrKykgewotCisgIGZvciAoaSA9IDA7IGkgPCB3aW5TaXplOyBpKyspIHsKICAgICB3aW5baV0gPSBmUG93KAotICAgICAgICAgICAgRVVMRVJfTSwKLSAgICAgICAgICAgIEVVTEVSX0UsCi0gICAgICAgICAgICBmTXVsdChnYXVzc0V4cF9tLCBmUG93MigoaSpGTDJGWENPTlNUX0RCTCgxLmYvKGZsb2F0KSgxPDxDT0VGRl9MT09QX1NDQUxFKSkgKyBGTDJGWENPTlNUX0RCTCguNWYvKGZsb2F0KSgxPDxDT0VGRl9MT09QX1NDQUxFKSkpKSksCi0gICAgICAgICAgICBnYXVzc0V4cF9lICsgMipDT0VGRl9MT09QX1NDQUxFLAotICAgICAgICAgICAmZTEpOworICAgICAgICBFVUxFUl9NLCBFVUxFUl9FLAorICAgICAgICBmTXVsdChnYXVzc0V4cF9tLAorICAgICAgICAgICAgICBmUG93MigoaSAqIEZMMkZYQ09OU1RfREJMKDEuZiAvIChmbG9hdCkoMSA8PCBDT0VGRl9MT09QX1NDQUxFKSkgKworICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoLjVmIC8gKGZsb2F0KSgxIDw8IENPRUZGX0xPT1BfU0NBTEUpKSkpKSwKKyAgICAgICAgZ2F1c3NFeHBfZSArIDIgKiBDT0VGRl9MT09QX1NDQUxFLCAmZTEpOwogCiAgICAgd2luW2ldID0gc2NhbGVWYWx1ZVNhdHVyYXRlKHdpbltpXSwgZTEpOwogICB9CiB9CiAKK3N0YXRpYyBJTlQgRkRLYWFjRW5jX1NlYXJjaDMoRklYUF9MUEMgcGFyY29yKSB7CisgIElOVCBpLCBpbmRleCA9IDA7CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiEKLSAgXGJyaWVmICAgICBGREthYWNFbmNfQXV0b1RvUGFyY29yCi0KLSAgY29udmVyc2lvbiBhdXRvY29ycmVsYXRpb24gdG8gcmVmbGVjdGlvbiBjb2VmZmljaWVudHMKLQotICBccGFyYW0gcG9pbnRlciB0byBpbnB1dCAoYWNmKQotICBccGFyYW0gcG9pbnRlciB0byBvdXRwdXQgKHJlZmxlY3Rpb24gY29lZmZpY2llbnRzKQotICBccGFyYW0gbnVtYmVyIG9mIGNvZWZmaWNpZW50cwotCi0gIFxyZXR1cm4gcHJlZGljdGlvbiBnYWluCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVCBGREthYWNFbmNfQXV0b1RvUGFyY29yKAotICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgaW5wdXQsCi0gICAgICAgIEZJWFBfREJMICpSRVNUUklDVCByZWZsQ29lZmYsCi0gICAgICAgIGNvbnN0IElOVCBudW1PZkNvZWZmCi0gICAgICAgICkKLXsKLSAgSU5UICAgICAgIGksIGosIHNjYWxlPTA7Ci0gIEZJWFBfREJMICB0bXAsIHBhcmNvcldvcmtCdWZmZXJbVE5TX01BWF9PUkRFUl07Ci0gIElOVCAgICAgICBwcmVkaWN0aW9uR2FpbiA9IChJTlQpKFROU19QUkVER0FJTl9TQ0FMRSk7Ci0KLSAgRklYUF9EQkwgKlJFU1RSSUNUIHdvcmtCdWZmZXIgPSBwYXJjb3JXb3JrQnVmZmVyOwotICBjb25zdCBGSVhQX0RCTCAgYXV0b0NvcnJfMCA9IGlucHV0WzBdOwotCi0gIEZES21lbWNsZWFyKHJlZmxDb2VmZixudW1PZkNvZWZmKnNpemVvZihGSVhQX0RCTCkpOwotCi0gIGlmKChGSVhQX0RCTClpbnB1dFswXSA9PSBGTDJGWENPTlNUX0RCTCgwLjApKSB7Ci0gICAgcmV0dXJuKHByZWRpY3Rpb25HYWluKTsKKyAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgIGlmIChwYXJjb3IgPiBGREthYWNFbmNfdG5zQ29lZmYzQm9yZGVyc1tpXSkgaW5kZXggPSBpOwogICB9Ci0KLSAgRkRLbWVtY3B5KHdvcmtCdWZmZXIsJmlucHV0WzFdLG51bU9mQ29lZmYqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gIGZvcihpPTA7IGk8bnVtT2ZDb2VmZjsgaSsrKSB7Ci0gICAgTE9ORyBzaWduID0gKChMT05HKXdvcmtCdWZmZXJbMF0gPj4gKERGUkFDVF9CSVRTLTEpKTsKLSAgICB0bXAgPSAoRklYUF9EQkwpKChMT05HKXdvcmtCdWZmZXJbMF1ec2lnbik7Ci0KLSAgICBpZihpbnB1dFswXTx0bXApCi0gICAgICBicmVhazsKLQotICAgIHRtcCA9IChGSVhQX0RCTCkoKExPTkcpc2NodXJfZGl2KHRtcCwgaW5wdXRbMF0sIEZSQUNUX0JJVFMpXih+c2lnbikpOwotICAgIHJlZmxDb2VmZltpXSA9IHRtcDsKLQotICAgIGZvcihqPW51bU9mQ29lZmYtaS0xOyBqPj0wOyBqLS0pIHsKLSAgICAgIEZJWFBfREJMIGFjY3UxID0gZk11bHQodG1wLCBpbnB1dFtqXSk7Ci0gICAgICBGSVhQX0RCTCBhY2N1MiA9IGZNdWx0KHRtcCwgd29ya0J1ZmZlcltqXSk7Ci0gICAgICB3b3JrQnVmZmVyW2pdICs9IGFjY3UxOwotICAgICAgaW5wdXRbal0gKz0gYWNjdTI7Ci0gICAgfQotCi0gICAgd29ya0J1ZmZlcisrOwotICB9Ci0KLSAgdG1wID0gZk11bHQoKEZJWFBfREJMKSgoTE9ORylUTlNfUFJFREdBSU5fU0NBTEU8PDIxKSwgZkRpdk5vcm0oZkFicyhhdXRvQ29ycl8wKSwgZkFicyhpbnB1dFswXSksICZzY2FsZSkpOwotICBpZiAoIGZNdWx0RGl2MihhdXRvQ29ycl8wLCBpbnB1dFswXSk8RkwyRlhDT05TVF9EQkwoMC4wZikgKSB7Ci0gICAgdG1wID0gLXRtcDsKLSAgfQotICBwcmVkaWN0aW9uR2FpbiA9IChMT05HKXNjYWxlVmFsdWUodG1wLHNjYWxlLTIxKTsKLQotICByZXR1cm4gKHByZWRpY3Rpb25HYWluKTsKKyAgcmV0dXJuIChpbmRleCAtIDQpOwogfQogCitzdGF0aWMgSU5UIEZES2FhY0VuY19TZWFyY2g0KEZJWFBfTFBDIHBhcmNvcikgeworICBJTlQgaSwgaW5kZXggPSAwOwogCi1zdGF0aWMgSU5UIEZES2FhY0VuY19TZWFyY2gzKEZJWFBfREJMIHBhcmNvcikKLXsKLSAgSU5UIGksIGluZGV4PTA7Ci0KLSAgZm9yKGk9MDtpPDg7aSsrKXsKLSAgICBpZihwYXJjb3IgPiBGREthYWNFbmNfdG5zQ29lZmYzQm9yZGVyc1tpXSkKLSAgICAgIGluZGV4PWk7CisgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgaWYgKHBhcmNvciA+IEZES2FhY0VuY190bnNDb2VmZjRCb3JkZXJzW2ldKSBpbmRleCA9IGk7CiAgIH0KLSAgcmV0dXJuKGluZGV4LTQpOworICByZXR1cm4gKGluZGV4IC0gOCk7CiB9CiAKLXN0YXRpYyBJTlQgRkRLYWFjRW5jX1NlYXJjaDQoRklYUF9EQkwgcGFyY29yKQotewotICBJTlQgaSwgaW5kZXg9MDsKLQotICBmb3IoaT0wO2k8MTY7aSsrKXsKLSAgICBpZihwYXJjb3IgPiBGREthYWNFbmNfdG5zQ29lZmY0Qm9yZGVyc1tpXSkKLSAgICAgIGluZGV4PWk7Ci0gIH0KLSAgcmV0dXJuKGluZGV4LTgpOwotfQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfUGFyY29yMkluZGV4CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRkRLYWFjRW5jX1BhcmNvcjJJbmRleCgKLSAgICAgICAgY29uc3QgRklYUF9EQkwgKnBhcmNvciwKLSAgICAgICAgSU5UICpSRVNUUklDVCBpbmRleCwKLSAgICAgICAgY29uc3QgSU5UIG9yZGVyLAotICAgICAgICBjb25zdCBJTlQgYml0c1BlckNvZWZmCi0gICAgICAgICkKLXsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19QYXJjb3IySW5kZXgoY29uc3QgRklYUF9MUEMgKnBhcmNvciwgSU5UICpSRVNUUklDVCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG9yZGVyLCBjb25zdCBJTlQgYml0c1BlckNvZWZmKSB7CiAgIElOVCBpOwotICBmb3IoaT0wOyBpPG9yZGVyOyBpKyspIHsKLSAgICBpZihiaXRzUGVyQ29lZmYgPT0gMykKKyAgZm9yIChpID0gMDsgaSA8IG9yZGVyOyBpKyspIHsKKyAgICBpZiAoYml0c1BlckNvZWZmID09IDMpCiAgICAgICBpbmRleFtpXSA9IEZES2FhY0VuY19TZWFyY2gzKHBhcmNvcltpXSk7CiAgICAgZWxzZQogICAgICAgaW5kZXhbaV0gPSBGREthYWNFbmNfU2VhcmNoNChwYXJjb3JbaV0pOwogICB9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19JbmRleDJQYXJjb3IKQEAgLTEyMTIsMTMwICsxMTgyLDEwIEBACiAgICAgb3V0cHV0OiAgICAgICByZWZsZWN0aW9uIGNvZWZmaWNpZW50cwogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19JbmRleDJQYXJjb3IoCi0gICAgICAgIGNvbnN0IElOVCAqaW5kZXgsCi0gICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwYXJjb3IsCi0gICAgICAgIGNvbnN0IElOVCBvcmRlciwKLSAgICAgICAgY29uc3QgSU5UIGJpdHNQZXJDb2VmZgotICAgICAgICApCi17CitzdGF0aWMgdm9pZCBGREthYWNFbmNfSW5kZXgyUGFyY29yKGNvbnN0IElOVCAqaW5kZXgsIEZJWFBfTFBDICpSRVNUUklDVCBwYXJjb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBvcmRlciwgY29uc3QgSU5UIGJpdHNQZXJDb2VmZikgewogICBJTlQgaTsKLSAgZm9yKGk9MDsgaTxvcmRlcjsgaSsrKQotICAgIHBhcmNvcltpXSA9IGJpdHNQZXJDb2VmZiA9PSA0ID8gRkRLYWFjRW5jX3Ruc0VuY0NvZWZmNFtpbmRleFtpXSs4XSA6IEZES2FhY0VuY190bnNFbmNDb2VmZjNbaW5kZXhbaV0rNF07CisgIGZvciAoaSA9IDA7IGkgPCBvcmRlcjsgaSsrKQorICAgIHBhcmNvcltpXSA9IGJpdHNQZXJDb2VmZiA9PSA0ID8gRkRLYWFjRW5jX3Ruc0VuY0NvZWZmNFtpbmRleFtpXSArIDhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGREthYWNFbmNfdG5zRW5jQ29lZmYzW2luZGV4W2ldICsgNF07CiB9Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19QYXJjb3JUb0xwYwotICAgIGRlc2NyaXB0aW9uOiAgY29udmVyc2lvbiByZWZsZWN0aW9uIGNvZWZmaWNpZW50cyB0byBMUEMgY29lZmZpY2llbnRzCi0gICAgcmV0dXJuczogICAgICBHYWluIGZhY3RvcgotICAgIGlucHV0OiAgICAgICAgcmVmbGVjdGlvbiBjb2VmZmljaWVudHMsIG5vLiBvZiByZWZsZWN0aW9uIGNvZWZmaWNpZW50cyA8b3JkZXI+LAotICAgICAgICAgICAgICAgICAgcHRyLiB0byB3b3JrIGJ1ZmZlciAocmVxdWlyZWQgc2l6ZTogb3JkZXIpCi0gICAgb3V0cHV0OiAgICAgICA8b3JkZXI+IExQQyBjb2VmZmljaWVudHMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UIEZES2FhY0VuY19QYXJjb3JUb0xwYygKLSAgICAgICAgY29uc3QgRklYUF9EQkwgKnJlZmxDb2VmZiwKLSAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIExwY0NvZWZmLAotICAgICAgICBjb25zdCBJTlQgbnVtT2ZDb2VmZiwKLSAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHdvcmtCdWZmZXIKLSAgICAgICAgKQotewotICBJTlQgaSwgajsKLSAgSU5UIHNoaWZ0dmFsLCBwYXIyTHBjU2hpZnRWYWwgPSA2OyAgLyogNiBzaG91bGQgYmUgZW5vdWdoLCBiZWMuIG1heChudW1PZkNvZWZmKSA9IDIwICovCi0gIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotCi0gIExwY0NvZWZmWzBdID0gcmVmbENvZWZmWzBdID4+IHBhcjJMcGNTaGlmdFZhbDsKLSAgZm9yKGk9MTsgaTxudW1PZkNvZWZmOyBpKyspIHsKLSAgICBmb3Ioaj0wOyBqPGk7IGorKykgewotICAgICAgICB3b3JrQnVmZmVyW2pdID0gTHBjQ29lZmZbaS0xLWpdOwotICAgIH0KLQotICAgIGZvcihqPTA7IGo8aTsgaisrKSB7Ci0gICAgICAgIExwY0NvZWZmW2pdICs9IGZNdWx0KHJlZmxDb2VmZltpXSx3b3JrQnVmZmVyW2pdKTsKLSAgICB9Ci0KLSAgICBMcGNDb2VmZltpXSA9IHJlZmxDb2VmZltpXSA+PiBwYXIyTHBjU2hpZnRWYWw7Ci0gIH0KLQotICAvKiBub3JtYWxpemUgTHBjQ29lZmYgYW5kIGNhbGMgc2hpZnRmYWN0b3IgKi8KLSAgZm9yKGk9MDsgaTxudW1PZkNvZWZmOyBpKyspIHsKLSAgICAgIG1heFZhbCA9IGZpeE1heChtYXhWYWwsKEZJWFBfREJMKWZpeHBfYWJzKExwY0NvZWZmW2ldKSk7Ci0gIH0KLQotICBzaGlmdHZhbCA9IENvdW50TGVhZGluZ0JpdHMobWF4VmFsKTsKLSAgc2hpZnR2YWwgPSAoc2hpZnR2YWw+PXBhcjJMcGNTaGlmdFZhbCkgPyBwYXIyTHBjU2hpZnRWYWwgOiBzaGlmdHZhbDsKLQotICBmb3IoaT0wOyBpPG51bU9mQ29lZmY7IGkrKykKLSAgICAgIExwY0NvZWZmW2ldID0gTHBjQ29lZmZbaV08PHNoaWZ0dmFsOwotCi0gIHJldHVybiAocGFyMkxwY1NoaWZ0VmFsIC0gc2hpZnR2YWwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyohCi0gIFxicmllZiAgICAgRkRLYWFjRW5jX0FuYWx5c2lzRmlsdGVyCi0KLSAgVE5TIGFuYWx5c2lzIGZpbHRlciAoYWxsLXplcm8gZmlsdGVyKQotCi0gIFxwYXJhbSBwb2ludGVyIHRvIHNpZ25hbCBzcGVjdHJ1bQotICBccGFyYW0gbnVtYmVyIG9mIGxpbmVzCi0gIFxwYXJhbSBwb2ludGVyIHRvIGxwYyBjb2VmZmljaWVudHMKLSAgXHBhcmFtIGZpbHRlciBvcmRlcgotICBccGFyYW0gbHBjIGdhaW4gZmFjdG9yCi0KLSAgXHJldHVybiB2b2lkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogTm90ZTogaW4tcGxhY2UgY29tcHV0YXRpb24gcG9zc2libGUgKi8KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19BbmFseXNpc0ZpbHRlcigKLSAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHNpZ25hbCwKLSAgICAgICAgY29uc3QgSU5UIG51bU9mTGluZXMsCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICpwcmVkaWN0b3JDb2VmZiwKLSAgICAgICAgY29uc3QgSU5UIG9yZGVyLAotICAgICAgICBjb25zdCBJTlQgbHBjR2FpbkZhY3RvcgotICAgICAgICApCi17Ci0gIEZJWFBfREJMIHN0YXR1c1ZhcltUTlNfTUFYX09SREVSXTsKLSAgSU5UIGksIGo7Ci0gIGNvbnN0IElOVCBzaGlmdCA9IGxwY0dhaW5GYWN0b3IgKyAxOyAgICAgIC8qICsxLCBiZWNhdXNlIGZNdWx0RGl2MiAqLwotICBGSVhQX0RCTCB0bXA7Ci0KLSAgaWYgKG9yZGVyPjApIHsKLQotICAgIElOVCBpZHggPSAwOwotCi0gICAgLyoga2VlcCBmaWx0ZXIgY29lZmZpY2llbnRzIHR3aWNlIGFuZCBzYXZlIG1lbW9yeSBjb3B5IG9wZXJhdGlvbiBpbgotICAgICAgIG1vZHVsbyBzdGF0ZSBidWZmZXIgKi8KLSNpZiBkZWZpbmVkKEFSQ0hfUFJFRkVSX01VTFRfMzJ4MTYpCi0gICAgRklYUF9TR0wgIGNvZWZmWzIqVE5TX01BWF9PUkRFUl07Ci0gICAgY29uc3QgRklYUF9TR0wgKnBDb2VmZjsKLSAgICBmb3IoaT0wO2k8b3JkZXI7aSsrKSB7Ci0gICAgICBjb2VmZltpXSAgICAgICA9IEZYX0RCTDJGWF9TR0wocHJlZGljdG9yQ29lZmZbaV0pOwotICAgIH0KLSAgICBGREttZW1jcHkoJmNvZWZmW29yZGVyXSwgY29lZmYsIG9yZGVyKnNpemVvZihGSVhQX1NHTCkpOwotI2Vsc2UKLSAgICBGSVhQX0RCTCAgY29lZmZbMipUTlNfTUFYX09SREVSXTsKLSAgICBjb25zdCBGSVhQX0RCTCAqcENvZWZmOwotICAgIEZES21lbWNweSgmY29lZmZbMF0sICAgICBwcmVkaWN0b3JDb2VmZiwgb3JkZXIqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgRkRLbWVtY3B5KCZjb2VmZltvcmRlcl0sIHByZWRpY3RvckNvZWZmLCBvcmRlcipzaXplb2YoRklYUF9EQkwpKTsKLSNlbmRpZgotICAgIEZES21lbWNsZWFyKHN0YXR1c1Zhciwgb3JkZXIqc2l6ZW9mKEZJWFBfREJMKSk7Ci0KLSAgICBmb3Ioaj0wOyBqPG51bU9mTGluZXM7IGorKykgewotICAgICAgcENvZWZmID0gJmNvZWZmWyhvcmRlci1pZHgpXTsKLSAgICAgIHRtcCA9IEZMMkZYQ09OU1RfREJMKDApOwotICAgICAgZm9yKGk9MDsgaTxvcmRlcjsgaSsrKSB7Ci0gICAgICAgICAgdG1wID0gZk11bHRBZGREaXYyKHRtcCwgcENvZWZmW2ldLCBzdGF0dXNWYXJbaV0pIDsKLSAgICAgIH0KLQotICAgICAgaWYoLS1pZHg8MCkgeyBpZHggPSBvcmRlci0xOyB9Ci0gICAgICBzdGF0dXNWYXJbaWR4XSA9IHNpZ25hbFtqXTsKLQotICAgICAgRkRLX0FTU0VSVChscGNHYWluRmFjdG9yPj0wKTsKLSAgICAgIHNpZ25hbFtqXSA9ICh0bXA8PHNoaWZ0KSArIHNpZ25hbFtqXTsKLSAgICB9Ci0gIH0KLX0KLQotCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2FhY2VuY190bnMuaCBiL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX3Rucy5oCmluZGV4IDI4MjRjYmMuLmEzN2Y5NzggMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX3Rucy5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX3Rucy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDI1ICs5MCwyNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBBbGV4IEdyb2VzY2hlbAotICAgY29udGVudHMvZGVzY3JpcHRpb246IFRlbXBvcmFsIG5vaXNlIHNoYXBpbmcKKyAgIEF1dGhvcihzKTogICBBbGV4IEdyb2VzY2hlbAogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogVGVtcG9yYWwgbm9pc2Ugc2hhcGluZwogCi0jaWZuZGVmIF9UTlNfSAotI2RlZmluZSBfVE5TX0gKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQUFDRU5DX1ROU19ICisjZGVmaW5lIEFBQ0VOQ19UTlNfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCiAjaW5jbHVkZSAicHN5X2NvbnN0LmgiCiAKLQogI2lmbmRlZiBQSQotI2RlZmluZSBQSSAgICAgICAgICAgIDMuMTQxNTkyNjUzNTg5NzkzMWYKKyNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1ODk3OTMxZgogI2VuZGlmCiAKIC8qKgpAQCAtMTE0LDMyICsxMjUsMzMgQEAKIC8qIFROUyBtYXggZmlsdGVyIG9yZGVyIGZvciBMb3cgQ29tcGxleGl0eSBNUEVHNCBwcm9maWxlICovCiAjZGVmaW5lIFROU19NQVhfT1JERVIgMTIKIAotCiAjZGVmaW5lIE1BWF9OVU1fT0ZfRklMVEVSUyAyCiAKLSNkZWZpbmUgSElGSUxUIDAgICAgICAgICAgIC8qIGluZGV4IG9mIGhpZ2hlciBmaWx0ZXIgICAqLwotI2RlZmluZSBMT0ZJTFQgMSAgICAgICAgICAgLyogaW5kZXggb2YgbG93ZXIgZmlsdGVyICAgICovCisjZGVmaW5lIEhJRklMVCAwIC8qIGluZGV4IG9mIGhpZ2hlciBmaWx0ZXIgICAqLworI2RlZmluZSBMT0ZJTFQgMSAvKiBpbmRleCBvZiBsb3dlciBmaWx0ZXIgICAgKi8KIAotCi10eXBlZGVmIHN0cnVjdHsgLyogc3R1ZmYgdGhhdCBpcyB0YWJ1bGF0ZWQgZGVwZW5kZW50IG9uIGJpdHJhdGUgZXRjLiAqLwotICBJTlQgICAgICBmaWx0ZXJFbmFibGVkW01BWF9OVU1fT0ZfRklMVEVSU107Ci0gIElOVCAgICAgIHRocmVzaE9uW01BWF9OVU1fT0ZfRklMVEVSU107ICAgICAgICAgICAgICAgIC8qIG1pbi4gcHJlZGljdGlvbiBnYWluIGZvciB1c2luZyB0bnMgVEFCVUwqLwotICBJTlQgICAgICBmaWx0ZXJTdGFydEZyZXFbTUFYX05VTV9PRl9GSUxURVJTXTsgICAgICAgICAvKiBsb3dlc3QgZnJlcSBmb3IgbHBjIFRBQlVMKi8KLSAgSU5UICAgICAgdG5zTGltaXRPcmRlcltNQVhfTlVNX09GX0ZJTFRFUlNdOyAgICAgICAgICAgLyogTGltaXQgZm9yIFROUyBvcmRlciBUQUJVTCovCi0gIElOVCAgICAgIHRuc0ZpbHRlckRpcmVjdGlvbltNQVhfTlVNX09GX0ZJTFRFUlNdOyAgICAgIC8qIEZpbHRlcmluZyBkaXJlY3Rpb24sIDA9dXAsIDE9ZG93biBUQUJVTCAqLwotICBJTlQgICAgICBhY2ZTcGxpdFtNQVhfTlVNX09GX0ZJTFRFUlNdOwotICBGSVhQX0RCTCB0bnNUaW1lUmVzb2x1dGlvbltNQVhfTlVNX09GX0ZJTFRFUlNdOyAgICAgICAvKiBUTlMgbWF4LiB0aW1lIHJlc29sdXRpb24gVEFCVUwuIFNob3VsZCBiZSBmcmFjdCBidXQgTVNWQyB3b24ndCBjb21waWxlIHRoZW4gKi8KLSAgSU5UICAgICAgc2VwZXJhdGVGaWx0ZXJzQWxsb3dlZDsKK3R5cGVkZWYgc3RydWN0IHsgLyogc3R1ZmYgdGhhdCBpcyB0YWJ1bGF0ZWQgZGVwZW5kZW50IG9uIGJpdHJhdGUgZXRjLiAqLworICBJTlQgZmlsdGVyRW5hYmxlZFtNQVhfTlVNX09GX0ZJTFRFUlNdOworICBJTlQgdGhyZXNoT25bTUFYX05VTV9PRl9GSUxURVJTXTsgICAgICAgIC8qIG1pbi4gcHJlZGljdGlvbiBnYWluIGZvciB1c2luZyB0bnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUJVTCovCisgIElOVCBmaWx0ZXJTdGFydEZyZXFbTUFYX05VTV9PRl9GSUxURVJTXTsgLyogbG93ZXN0IGZyZXEgZm9yIGxwYyBUQUJVTCovCisgIElOVCB0bnNMaW1pdE9yZGVyW01BWF9OVU1fT0ZfRklMVEVSU107ICAgLyogTGltaXQgZm9yIFROUyBvcmRlciBUQUJVTCovCisgIElOVCB0bnNGaWx0ZXJEaXJlY3Rpb25bTUFYX05VTV9PRl9GSUxURVJTXTsgLyogRmlsdGVyaW5nIGRpcmVjdGlvbiwgMD11cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPWRvd24gVEFCVUwgKi8KKyAgSU5UIGFjZlNwbGl0W01BWF9OVU1fT0ZfRklMVEVSU107CisgIEZJWFBfREJMIHRuc1RpbWVSZXNvbHV0aW9uW01BWF9OVU1fT0ZfRklMVEVSU107IC8qIFROUyBtYXguIHRpbWUgcmVzb2x1dGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUJVTC4gU2hvdWxkIGJlIGZyYWN0IGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU1ZDIHdvbid0IGNvbXBpbGUgdGhlbiAqLworICBJTlQgc2VwZXJhdGVGaWx0ZXJzQWxsb3dlZDsKIH0gVE5TX1BBUkFNRVRFUl9UQUJVTEFURUQ7CiAKLQotdHlwZWRlZiBzdHJ1Y3QgeyAgIC8qYXNzaWduZWQgYXQgSW5pdFRpbWUqLwordHlwZWRlZiBzdHJ1Y3QgeyAvKmFzc2lnbmVkIGF0IEluaXRUaW1lKi8KICAgVE5TX1BBUkFNRVRFUl9UQUJVTEFURUQgY29uZlRhYjsKICAgSU5UIGlzTG93RGVsYXk7CiAgIElOVCB0bnNBY3RpdmU7Ci0gIElOVCBtYXhPcmRlcjsgICAgICAgICAgICAgICAgLyogbWF4LiBvcmRlciBvZiB0bnMgZmlsdGVyICovCisgIElOVCBtYXhPcmRlcjsgLyogbWF4LiBvcmRlciBvZiB0bnMgZmlsdGVyICovCiAgIElOVCBjb2VmUmVzOwotICBGSVhQX0RCTCBhY2ZXaW5kb3dbTUFYX05VTV9PRl9GSUxURVJTXVtUTlNfTUFYX09SREVSKzMrMV07CisgIEZJWFBfREJMIGFjZldpbmRvd1tNQVhfTlVNX09GX0ZJTFRFUlNdW1ROU19NQVhfT1JERVIgKyAzICsgMV07CiAgIC8qIG5vdyBzb21lIHRoaW5ncyB0aGF0IG9ubHkgcHJvYmFibHkgY2FuIGJlIGRvbmUgYXQgSW5pdCB0aW1lOwogICAgICBjb3VsZCBiZSB0aGV5IGhhdmUgdG8gYmUgc3BsaXQgdXAgZm9yIGVhY2ggaW5kaXZpZHVhbCAoc2hvcnQpIHdpbmRvdyBvcgogICAgICBldmVuIGZpbHRlci4gICovCkBAIC0xNDgsNTUgKzE2MCw1NCBAQAogICBJTlQgbHBjU3RvcEJhbmQ7CiAgIElOVCBscGNTdG9wTGluZTsKIAotfVROU19DT05GSUc7Ci0KK30gVE5TX0NPTkZJRzsKIAogdHlwZWRlZiBzdHJ1Y3QgewotICBJTlQgICB0bnNBY3RpdmVbTUFYX05VTV9PRl9GSUxURVJTXTsKLSAgSU5UICAgcHJlZGljdGlvbkdhaW5bTUFYX05VTV9PRl9GSUxURVJTXTsKKyAgSU5UIHRuc0FjdGl2ZVtNQVhfTlVNX09GX0ZJTFRFUlNdOworICBJTlQgcHJlZGljdGlvbkdhaW5bTUFYX05VTV9PRl9GSUxURVJTXTsKIH0gVE5TX1NVQkJMT0NLX0lORk87CiAKLXR5cGVkZWYgc3RydWN0eyAgIC8qY2hhbmdlZCBhdCBydW5UaW1lKi8KK3R5cGVkZWYgc3RydWN0IHsgLypjaGFuZ2VkIGF0IHJ1blRpbWUqLwogICBUTlNfU1VCQkxPQ0tfSU5GTyBzdWJCbG9ja0luZm9bVFJBTlNfRkFDXTsKICAgRklYUF9EQkwgcmF0aW9NdWx0VGFibGVbVFJBTlNfRkFDXVtNQVhfU0ZCX1NIT1JUXTsKIH0gVE5TX0RBVEFfU0hPUlQ7CiAKLXR5cGVkZWYgc3RydWN0eyAgIC8qY2hhbmdlZCBhdCBydW5UaW1lKi8KK3R5cGVkZWYgc3RydWN0IHsgLypjaGFuZ2VkIGF0IHJ1blRpbWUqLwogICBUTlNfU1VCQkxPQ0tfSU5GTyBzdWJCbG9ja0luZm87CiAgIEZJWFBfREJMIHJhdGlvTXVsdFRhYmxlW01BWF9TRkJfTE9OR107CiB9IFROU19EQVRBX0xPTkc7CiAKIC8qIGNhbiBiZSBpbXBsZW1lbnRlZCBhcyB1bmlvbiAqLwotdHlwZWRlZiBzaG91bGRCZVVuaW9uewordHlwZWRlZiBzaG91bGRCZVVuaW9uIHsKICAgVE5TX0RBVEFfTE9ORyBMb25nOwogICBUTlNfREFUQV9TSE9SVCBTaG9ydDsKLX1UTlNfREFUQV9SQVc7Cit9CitUTlNfREFUQV9SQVc7CiAKLXR5cGVkZWYgc3RydWN0ewordHlwZWRlZiBzdHJ1Y3QgewogICBJTlQgbnVtT2ZTdWJibG9ja3M7CiAgIFROU19EQVRBX1JBVyBkYXRhUmF3OwogICBJTlQgdG5zTWF4U2NhbGVTcGVjOwogICBJTlQgZmlsdGVyc01lcmdlZDsKLX1UTlNfREFUQTsKK30gVE5TX0RBVEE7CiAKLXR5cGVkZWYgc3RydWN0ewordHlwZWRlZiBzdHJ1Y3QgewogICBJTlQgbnVtT2ZGaWx0ZXJzW1RSQU5TX0ZBQ107CiAgIElOVCBjb2VmUmVzW1RSQU5TX0ZBQ107CiAgIElOVCBsZW5ndGhbVFJBTlNfRkFDXVtNQVhfTlVNX09GX0ZJTFRFUlNdOwogICBJTlQgb3JkZXJbVFJBTlNfRkFDXVtNQVhfTlVNX09GX0ZJTFRFUlNdOwogICBJTlQgZGlyZWN0aW9uW1RSQU5TX0ZBQ11bTUFYX05VTV9PRl9GSUxURVJTXTsKICAgSU5UIGNvZWZDb21wcmVzc1tUUkFOU19GQUNdW01BWF9OVU1fT0ZfRklMVEVSU107Ci0gICAgLyogZm9yIExvbmc6IGxlbmd0aCBUTlNfTUFYX09SREVSICgxMiBmb3IgTEMpIGlzIHJlcXVpcmVkIC0+IDEyICovCi0gICAgLyogZm9yIFNob3J0OiBsZW5ndGggVFJBTlNfRkFDKlROU19NQVhfT1JERVIgKG9ubHkgNSBmb3Igc2hvcnQgTEMpIGlzIHJlcXVpcmVkIC0+IDgqNT00MCAqLwotICAgIC8qIEN1cnJlbnRseSBUUkFOU19GQUMqVE5TX01BWF9PUkRFUiA9IDgqMTIgPSA5NiAoZm9yIExDKSBpcyB1c2VkIChwZXIgY2hhbm5lbCkhIE1lbW9yeSBjb3VsZCBiZSBzYXZlZCBoZXJlISAqLworICAvKiBmb3IgTG9uZzogbGVuZ3RoIFROU19NQVhfT1JERVIgKDEyIGZvciBMQykgaXMgcmVxdWlyZWQgLT4gMTIgKi8KKyAgLyogZm9yIFNob3J0OiBsZW5ndGggVFJBTlNfRkFDKlROU19NQVhfT1JERVIgKG9ubHkgNSBmb3Igc2hvcnQgTEMpIGlzIHJlcXVpcmVkCisgICAqIC0+IDgqNT00MCAqLworICAvKiBDdXJyZW50bHkgVFJBTlNfRkFDKlROU19NQVhfT1JERVIgPSA4KjEyID0gOTYgKGZvciBMQykgaXMgdXNlZCAocGVyCisgICAqIGNoYW5uZWwpISBNZW1vcnkgY291bGQgYmUgc2F2ZWQgaGVyZSEgKi8KICAgSU5UIGNvZWZbVFJBTlNfRkFDXVtNQVhfTlVNX09GX0ZJTFRFUlNdW1ROU19NQVhfT1JERVJdOwotfVROU19JTkZPOworfSBUTlNfSU5GTzsKIAotSU5UIEZES2FhY0VuY19GcmVxVG9CYW5kV2l0aFJvdW5kaW5nKAotICAgICAgICBjb25zdCBJTlQgZnJlcSwKLSAgICAgICAgY29uc3QgSU5UIGZzLAotICAgICAgICBjb25zdCBJTlQgbnVtT2ZCYW5kcywKLSAgICAgICAgY29uc3QgSU5UICpiYW5kU3RhcnRPZmZzZXQKLSAgICAgICAgKTsKK0lOVCBGREthYWNFbmNfRnJlcVRvQmFuZFdpZHRoUm91bmRpbmcoY29uc3QgSU5UIGZyZXEsIGNvbnN0IElOVCBmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG51bU9mQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqYmFuZFN0YXJ0T2Zmc2V0KTsKIAotI2VuZGlmIC8qIF9UTlNfSCAqLworI2VuZGlmIC8qIEFBQ0VOQ19UTlNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9hZGpfdGhyLmNwcCBiL2xpYkFBQ2VuYy9zcmMvYWRqX3Roci5jcHAKaW5kZXggMDk1ODRmNC4uNmUxOTY4MCAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9hZGpfdGhyLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL2Fkal90aHIuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDg4OSArOTAsMTAxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gV2VybmVyCi0gICAgY29udGVudHMvZGVzY3JpcHRpb246IFRocmVzaG9sZCBjb21wZW5zYXRpb24KKyAgIEF1dGhvcihzKTogICBNLiBXZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFRocmVzaG9sZCBjb21wZW5zYXRpb24KIAotI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpbmNsdWRlICJhZGpfdGhyX2RhdGEuaCIKICNpbmNsdWRlICJhZGpfdGhyLmgiCi0jaW5jbHVkZSAicWNfZGF0YS5oIgogI2luY2x1ZGUgInNmX2VzdGltLmgiCiAjaW5jbHVkZSAiYWFjRW5jX3JhbS5oIgogCisjZGVmaW5lIE5VTV9OUkdfTEVWUyAoOCkKKyNkZWZpbmUgSU5WX0lOVF9UQUJfU0laRSAoOCkKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBpbnZJbnRbSU5WX0lOVF9UQUJfU0laRV0gPSB7CisgICAgMHg3ZmZmZmZmZiwgMHg3ZmZmZmZmZiwgMHg0MDAwMDAwMCwgMHgyYWFhYWFhYSwKKyAgICAweDIwMDAwMDAwLCAweDE5OTk5OTk5LCAweDE1NTU1NTU1LCAweDEyNDkyNDkyfTsKIAotCi0KLSNkZWZpbmUgSU5WX0lOVF9UQUJfU0laRSAgKDgpCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgaW52SW50W0lOVl9JTlRfVEFCX1NJWkVdID0KLXsKLSAgMHg3ZmZmZmZmZiwgMHg3ZmZmZmZmZiwgMHg0MDAwMDAwMCwgMHgyYWFhYWFhYSwgMHgyMDAwMDAwMCwgMHgxOTk5OTk5OSwgMHgxNTU1NTU1NSwgMHgxMjQ5MjQ5MgotfTsKLQotCi0jZGVmaW5lIElOVl9TUVJUNF9UQUJfU0laRSAgKDgpCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgaW52U3FydDRbSU5WX1NRUlQ0X1RBQl9TSVpFXSA9Ci17Ci0gIDB4N2ZmZmZmZmYsIDB4N2ZmZmZmZmYsIDB4NmJhMjdlNjUsIDB4NjE0MjRiYjUsIDB4NWE4Mjc5OTksIDB4NTU5OTQ4NDUsIDB4NTFjOGUzM2MsIDB4NGViMTYwZDEKLX07Ci0KKyNkZWZpbmUgSU5WX1NRUlQ0X1RBQl9TSVpFICg4KQorc3RhdGljIGNvbnN0IEZJWFBfREJMIGludlNxcnQ0W0lOVl9TUVJUNF9UQUJfU0laRV0gPSB7CisgICAgMHg3ZmZmZmZmZiwgMHg3ZmZmZmZmZiwgMHg2YmEyN2U2NSwgMHg2MTQyNGJiNSwKKyAgICAweDVhODI3OTk5LCAweDU1OTk0ODQ1LCAweDUxYzhlMzNjLCAweDRlYjE2MGQxfTsKIAogLypzdGF0aWMgY29uc3QgSU5UICAgICAgaW52UmVkRXhwID0gNDsqLwotc3RhdGljIGNvbnN0IEZJWFBfREJMICBTbnJMZE1pbjEgPSAoRklYUF9EQkwpMHhmY2FkMGRkZjsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMC4zMTYpL0ZES2xvZygyLjApL0xEX0RBVEFfU0NBTElORyk7Ki8KLXN0YXRpYyBjb25zdCBGSVhQX0RCTCAgU25yTGRNaW4yID0gKEZJWFBfREJMKTB4MDM1MWUxYTI7IC8qRkwyRlhDT05TVF9EQkwoRkRLbG9nKDMuMTYpIC9GREtsb2coMi4wKS9MRF9EQVRBX1NDQUxJTkcpOyovCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgIFNuckxkRmFjICA9IChGSVhQX0RCTCkweGZmNWIyYzNlOyAvKkZMMkZYQ09OU1RfREJMKEZES2xvZygwLjgpICAvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLworc3RhdGljIGNvbnN0IEZJWFBfREJMIFNuckxkTWluMSA9CisgICAgKEZJWFBfREJMKTB4ZmNhZDBkZGY7IC8qRkwyRlhDT05TVF9EQkwoRkRLbG9nKDAuMzE2KS9GREtsb2coMi4wKS9MRF9EQVRBX1NDQUxJTkcpOyovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgU25yTGRNaW4yID0KKyAgICAoRklYUF9EQkwpMHgwMzUxZTFhMjsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMy4xNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL0ZES2xvZygyLjApL0xEX0RBVEFfU0NBTElORyk7Ki8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBTbnJMZEZhYyA9CisgICAgKEZJWFBfREJMKTB4ZmY1YjJjM2U7IC8qRkwyRlhDT05TVF9EQkwoRkRLbG9nKDAuOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL0ZES2xvZygyLjApL0xEX0RBVEFfU0NBTElORyk7Ki8KIAotc3RhdGljIGNvbnN0IEZJWFBfREJMICBTbnJMZE1pbjMgPSAoRklYUF9EQkwpMHhmZTAwMDAwMDsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMC41KSAgL0ZES2xvZygyLjApL0xEX0RBVEFfU0NBTElORyk7Ki8KLXN0YXRpYyBjb25zdCBGSVhQX0RCTCAgU25yTGRNaW40ID0gKEZJWFBfREJMKTB4MDIwMDAwMDA7IC8qRkwyRlhDT05TVF9EQkwoRkRLbG9nKDIuMCkgIC9GREtsb2coMi4wKS9MRF9EQVRBX1NDQUxJTkcpOyovCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgIFNuckxkTWluNSA9IChGSVhQX0RCTCkweGZjMDAwMDAwOyAvKkZMMkZYQ09OU1RfREJMKEZES2xvZygwLjI1KSAvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLwotCitzdGF0aWMgY29uc3QgRklYUF9EQkwgU25yTGRNaW4zID0KKyAgICAoRklYUF9EQkwpMHhmZTAwMDAwMDsgLypGTDJGWENPTlNUX0RCTChGREtsb2coMC41KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLworc3RhdGljIGNvbnN0IEZJWFBfREJMIFNuckxkTWluNCA9CisgICAgKEZJWFBfREJMKTB4MDIwMDAwMDA7IC8qRkwyRlhDT05TVF9EQkwoRkRLbG9nKDIuMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL0ZES2xvZygyLjApL0xEX0RBVEFfU0NBTElORyk7Ki8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBTbnJMZE1pbjUgPQorICAgIChGSVhQX0RCTCkweGZjMDAwMDAwOyAvKkZMMkZYQ09OU1RfREJMKEZES2xvZygwLjI1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvRkRLbG9nKDIuMCkvTERfREFUQV9TQ0FMSU5HKTsqLwogCiAvKgogVGhlIGJpdHMyUGUgZmFjdG9ycyBhcmUgY2hvb3NlbiBmb3IgdGhlIGNhc2UgdGhhdCBzb21lIHRpbWVzCiB0aGUgY3Jhc2ggcmVjb3Zlcnkgc3RyYXRlZ3kgd2lsbCBiZSBhY3RpdmF0ZWQgb25jZS4KICovCisjZGVmaW5lIEFGVEVSQlVSTkVSX1NUQVRJIDIKKyNkZWZpbmUgTUFYX0FMTE9XRURfRUxfQ0hBTk5FTFMgMgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIElOVCAgICAgICAgICAgICAgICAgYml0cmF0ZTsKLSAgVUxPTkcgICAgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX21vbm87Ci0gIFVMT05HICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9tb25vX3Nsb3BlOwotICBVTE9ORyAgICAgICAgICAgICAgIGJpdHMyUGVGYWN0b3Jfc3RlcmVvOwotICBVTE9ORyAgICAgICAgICAgICAgIGJpdHMyUGVGYWN0b3Jfc3RlcmVvX3Nsb3BlOwotICBVTE9ORyAgICAgICAgICAgICAgIGJpdHMyUGVGYWN0b3JfbW9ub19zY2ZPcHQ7Ci0gIFVMT05HICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9tb25vX3NjZk9wdF9zbG9wZTsKLSAgVUxPTkcgICAgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX3N0ZXJlb19zY2ZPcHQ7Ci0gIFVMT05HICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9zdGVyZW9fc2NmT3B0X3Nsb3BlOwotCisgIElOVCBiaXRyYXRlOworICBGSVhQX0RCTCBiaXRzMlBlRmFjdG9yW0FGVEVSQlVSTkVSX1NUQVRJXVtNQVhfQUxMT1dFRF9FTF9DSEFOTkVMU107CiB9IEJJVF9QRV9TRkFDOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IElOVCAgICAgICAgICAgc2FtcGxlUmF0ZTsKLSAgY29uc3QgQklUX1BFX1NGQUMgKiBwUGVUYWI7Ci0gIGNvbnN0IElOVCAgICAgICAgICAgbkVudHJpZXM7CisgIElOVCBzYW1wbGVSYXRlOworICBjb25zdCBCSVRfUEVfU0ZBQyAqcFBlVGFiOworICBJTlQgbkVudHJpZXM7CiAKIH0gQklUUzJQRV9DRkdfVEFCOwogCisjZGVmaW5lIEZMMkIyUEUodmFsdWUpIEZMMkZYQ09OU1RfREJMKCh2YWx1ZSkgLyAoMSA8PCAyKSkKKwogc3RhdGljIGNvbnN0IEJJVF9QRV9TRkFDIFNfQml0czJQZVRhYjE2MDAwW10gPSB7Ci0gIHsgMTAwMDAsIDB4MjI4RjVDMjksIDB4MDJGRUY1NUQsIDB4MUQ3MEEzRDcsIDB4MDlCQzlENkQsIDB4MjI4RjVDMjksIDB4MDJGRUY1NUQsIDB4MUMyOEY1QzMsIDB4MENCQjkyQ0F9LAotICB7IDI0MDAwLCAweDIzRDcwQTNELCAweDAyOUYxNkIxLCAweDIxOTk5OTlBLCAweDA3REQ0NDEzLCAweDIzRDcwQTNELCAweDAyOUYxNkIxLCAweDIxOTk5OTlBLCAweDA3REQ0NDEzfSwKLSAgeyAzMjAwMCwgMHgyNDdBRTE0OCwgMHgxMUIxRDkyQiwgMHgyMzg1MUVCOCwgMHgwMUY3NTEwNSwgMHgyNDdBRTE0OCwgMHgxMTBBMTM3RiwgMHgyMzg1MUVCOCwgMHgwMUY3NTEwNX0sCi0gIHsgNDgwMDAsIDB4MkQxRUI4NTIsIDB4NjgzM0M2MDAsIDB4MjQ3QUUxNDgsIDB4MDE0RjhCNTksIDB4MkNDQ0NDQ0QsIDB4NjhEQjhCQUMsIDB4MjQ3QUUxNDgsIDB4MDFGNzUxMDV9LAotICB7IDY0MDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI1MUVCODUyLCAweDAxNDgwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI1NzBBM0Q3LCAweDAxNDgwMDAwfSwKLSAgeyA5NjAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNjAwMDAwMCwgMHgwMTAwMDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNjAwMDAwMCwgMHgwMTAwMDAwMH0sCi0gIHsxMjgwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjcwYTNkODAsIDB4MDEwMDAwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjcwYTNkODAsIDB4MDEwMDAwMDB9LAotICB7MTQ4MDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI4MDAwMDAwLCAweDAwMDAwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI4MDAwMDAwLCAweDAwMDAwMDAwfQotfTsKKyAgICAvKiBiaXRyYXRlfCAgIGFmdGVyYnVybmVyIG9mZiAgICAgICAgICAgICAgfCAgIGFmdGVyYnVybmVyIG9uIHwgfCAgIG5DaD0xCisgICAgICAgfCAgIG5DaD0yICAgICAgIHwgICBuQ2g9MSAgICAgICB8ICAgbkNoPTIgICAgICAgICovCisgICAgezEwMDAwLAorICAgICB7e0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDAuMDBmKX0sIHtGTDJCMlBFKDEuNDBmKSwgRkwyQjJQRSgwLjAwZil9fX0sCisgICAgezI0MDAwLAorICAgICB7e0ZMMkIyUEUoMS44MGYpLCBGTDJCMlBFKDEuNDBmKX0sIHtGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjIwZil9fX0sCisgICAgezMyMDAwLAorICAgICB7e0ZMMkIyUEUoMS44MGYpLCBGTDJCMlBFKDEuNjBmKX0sIHtGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjQwZil9fX0sCisgICAgezQ4MDAwLAorICAgICB7e0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuODBmKX0sIHtGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjYwZil9fX0sCisgICAgezY0MDAwLAorICAgICB7e0ZMMkIyUEUoMS4yMGYpLCBGTDJCMlBFKDEuNjBmKX0sIHtGTDJCMlBFKDEuMjBmKSwgRkwyQjJQRSgxLjYwZil9fX0sCisgICAgezk2MDAwLAorICAgICB7e0ZMMkIyUEUoMS40MGYpLCBGTDJCMlBFKDEuODBmKX0sIHtGTDJCMlBFKDEuNDBmKSwgRkwyQjJQRSgxLjYwZil9fX0sCisgICAgezEyODAwMCwKKyAgICAge3tGTDJCMlBFKDEuNDBmKSwgRkwyQjJQRSgxLjgwZil9LCB7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMS44MGYpfX19LAorICAgIHsxNDgwMDAsCisgICAgIHt7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMS44MGYpfSwge0ZMMkIyUEUoMS40MGYpLCBGTDJCMlBFKDEuNDBmKX19fX07CiAKIHN0YXRpYyBjb25zdCBCSVRfUEVfU0ZBQyBTX0JpdHMyUGVUYWIyMjA1MFtdID0gewotICB7IDE2MDAwLCAweDFhOGY1YzI5LCAweDE3OTdjYzNhLCAweDEyOGY1YzI5LCAweDE4ZTc1NzkzLCAweDE3NWMyOGY2LCAweDIyMTQyNmZlLCAweDAwMDAwMDAwLCAweDVhNzA4ZWRlfSwKLSAgeyAyNDAwMCwgMHgyMDUxZWI4NSwgMHgwOTJjY2Y2YywgMHgxOGEzZDcwYSwgMHgxM2E5MmEzMCwgMHgxZmFlMTQ3YiwgMHhiY2JlNjFkLCAgMHgxNjE0N2FlMSwgMHgxOGU3NTc5M30sCi0gIHsgMzIwMDAsIDB4MjI4ZjVjMjksIDB4MDI5ZjE2YjEsIDB4MWQ3MGEzZDcsIDB4MDg4NTA5YzAsIDB4MjI4ZjVjMjksIDB4MjlmMTZiMSwgIDB4MWMyOGY1YzMsIDB4MGIyNDIwNzF9LAotICB7IDQ4MDAwLCAweDIzZDcwYTNkLCAweDAxNGY4YjU5LCAweDIxOTk5OTlhLCAweDAzZWVhMjBhLCAweDIzZDcwYTNkLCAweDE0ZjhiNTksICAweDIxOTk5OTlhLCAweDAzZWVhMjBhfSwKLSAgeyA2NDAwMCwgMHgyNDdhZTE0OCwgMHgwOGQ4ZWM5NiwgMHgyMzg1MWViOCwgMHgwMGZiYTg4MiwgMHgyNDdhZTE0OCwgMHg4ODUwOWMwLCAgMHgyMzg1MWViOCwgMHgwMGZiYTg4Mn0sCi0gIHsgOTYwMDAsIDB4MmQxZWI4NTIsIDB4MzQxOWUzMDAsIDB4MjQ3YWUxNDgsIDB4MDBhN2M1YWMsIDB4MmNjY2NjY2QsIDB4MzQ2ZGM1ZDYsIDB4MjQ3YWUxNDgsIDB4MDBmYmE4ODJ9LAotICB7MTI4MDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI1MWViODUyLCAweDAyOWYxNmIxLCAweDYwMDAwMDAwLCAweDI1YzI4ZjQwLCAweDI1NzBhM2Q3LCAweDAwOWYxNmIxfSwKLSAgezE0ODAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNmI4NTFlYywgMHgwMDAwMDAwMCwgMHg2MDAwMDAwMCwgMHgyNWMyOGY0MCwgMHgyNzBhM2Q3MSwgMHgwMDAwMDAwMH0KLX07CisgICAgLyogYml0cmF0ZXwgICBhZnRlcmJ1cm5lciBvZmYgICAgICAgICAgICAgIHwgICBhZnRlcmJ1cm5lciBvbiB8IHwgICBuQ2g9MQorICAgICAgIHwgICBuQ2g9MiAgICAgICB8ICAgbkNoPTEgICAgICAgfCAgIG5DaD0yICAgICAgICAqLworICAgIHsxNjAwMCwKKyAgICAge3tGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjQwZil9LCB7RkwyQjJQRSgxLjIwZiksIEZMMkIyUEUoMC44MGYpfX19LAorICAgIHsyNDAwMCwKKyAgICAge3tGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjQwZil9LCB7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMS4wMGYpfX19LAorICAgIHszMjAwMCwKKyAgICAge3tGTDJCMlBFKDEuNDBmKSwgRkwyQjJQRSgxLjQwZil9LCB7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMS4yMGYpfX19LAorICAgIHs0ODAwMCwKKyAgICAge3tGTDJCMlBFKDEuMjBmKSwgRkwyQjJQRSgxLjYwZil9LCB7RkwyQjJQRSgxLjIwZiksIEZMMkIyUEUoMS40MGYpfX19LAorICAgIHs2NDAwMCwKKyAgICAge3tGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjYwZil9LCB7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS40MGYpfX19LAorICAgIHs5NjAwMCwKKyAgICAge3tGTDJCMlBFKDEuODBmKSwgRkwyQjJQRSgxLjYwZil9LCB7RkwyQjJQRSgxLjgwZiksIEZMMkIyUEUoMS42MGYpfX19LAorICAgIHsxMjgwMDAsCisgICAgIHt7RkwyQjJQRSgxLjgwZiksIEZMMkIyUEUoMS44MGYpfSwge0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNjBmKX19fSwKKyAgICB7MTQ4MDAwLAorICAgICB7e0ZMMkIyUEUoMS40MGYpLCBGTDJCMlBFKDEuODBmKX0sIHtGTDJCMlBFKDEuNDBmKSwgRkwyQjJQRSgxLjYwZil9fX19OwogCiBzdGF0aWMgY29uc3QgQklUX1BFX1NGQUMgU19CaXRzMlBlVGFiMjQwMDBbXSA9IHsKLSAgeyAxNjAwMCwgMHgxOWViODUxZiwgMHgxM2E5MmEzMCwgMHgxMTQ3YWUxNCwgMHgxNjQ4NDBlMSwgMHgxOTk5OTk5YSwgMHgxMjU5OWVkOCwgMHgwMDAwMDAwMCwgMHg0NmM3NjRhZX0sCi0gIHsgMjQwMDAsIDB4MWViODUxZWMsIDB4MGQxYjcxNzYsIDB4MTZiODUxZWMsIDB4MThlNzU3OTMsIDB4MWUxNDdhZTEsIDB4MGZiYTg4MjcsIDB4MTE0N2FlMTQsIDB4MmM5MDgxYzN9LAotICB7IDMyMDAwLCAweDIxZWI4NTFmLCAweDA0OTY2N2I2LCAweDFjY2NjY2NkLCAweDA3MzU3ZTY3LCAweDIxZWI4NTFmLCAweDAzZWVhMjBhLCAweDFjMjhmNWMzLCAweDA3MzU3ZTY3fSwKLSAgeyA0ODAwMCwgMHgyNDI4ZjVjMywgMHgwMTRmOGI1OSwgMHgyMDUxZWI4NSwgMHgwNTNlMmQ2MiwgMHgyM2Q3MGEzZCwgMHgwMWY3NTEwNSwgMHgxZmFlMTQ3YiwgMHgwNzM1N2U2N30sCi0gIHsgNjQwMDAsIDB4MjRjY2NjY2QsIDB4MDVlNWYzMGUsIDB4MjJlMTQ3YWUsIDB4MDFhMzZlMmYsIDB4MjRjY2NjY2QsIDB4MDVlNWYzMGUsIDB4MjMzMzMzMzMsIDB4MDE0ZjhiNTl9LAotICB7IDk2MDAwLCAweDJhOGY1YzI5LCAweDI0YjMzZGIwLCAweDI0N2FlMTQ4LCAweDAwZmJhODgyLCAweDJhOGY1YzI5LCAweDI2ZmU3MThiLCAweDI0N2FlMTQ4LCAweDAwZmJhODgyfSwKLSAgezEyODAwMCwgMHg0ZTY2NjY2NiwgMHgxY2Q1Zjk5YywgMHgyNTcwYTNkNywgMHgwMTBjNmY3YSwgMHg1MGEzZDcwYSwgMHgxOTJhNzM3MSwgMHgyNTcwYTNkNywgMHgwMTBjNmY3YX0sCi0gIHsxNDgwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjYxNDdhZTEsIDB4MDAwMDAwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjYxNDdhZTEsIDB4MDAwMDAwMDB9Ci19OworICAgIC8qIGJpdHJhdGV8ICAgYWZ0ZXJidXJuZXIgb2ZmICAgICAgICAgICAgICB8ICAgYWZ0ZXJidXJuZXIgb24gfCB8ICAgbkNoPTEKKyAgICAgICB8ICAgbkNoPTIgICAgICAgfCAgIG5DaD0xICAgICAgfCAgIG5DaD0yICAgICAgICAgKi8KKyAgICB7MTYwMDAsCisgICAgIHt7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMS40MGYpfSwge0ZMMkIyUEUoMS4yMGYpLCBGTDJCMlBFKDAuODBmKX19fSwKKyAgICB7MjQwMDAsCisgICAgIHt7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS4yMGYpfSwge0ZMMkIyUEUoMS40MGYpLCBGTDJCMlBFKDEuMDBmKX19fSwKKyAgICB7MzIwMDAsCisgICAgIHt7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMS4yMGYpfSwge0ZMMkIyUEUoMS40MGYpLCBGTDJCMlBFKDAuODBmKX19fSwKKyAgICB7NDgwMDAsCisgICAgIHt7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMS42MGYpfSwge0ZMMkIyUEUoMS40MGYpLCBGTDJCMlBFKDEuNDBmKX19fSwKKyAgICB7NjQwMDAsCisgICAgIHt7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS42MGYpfSwge0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNDBmKX19fSwKKyAgICB7OTYwMDAsCisgICAgIHt7RkwyQjJQRSgxLjgwZiksIEZMMkIyUEUoMS42MGYpfSwge0ZMMkIyUEUoMS44MGYpLCBGTDJCMlBFKDEuNjBmKX19fSwKKyAgICB7MTI4MDAwLAorICAgICB7e0ZMMkIyUEUoMS40MGYpLCBGTDJCMlBFKDEuNjBmKX0sIHtGTDJCMlBFKDEuODBmKSwgRkwyQjJQRSgxLjgwZil9fX0sCisgICAgezE0ODAwMCwKKyAgICAge3tGTDJCMlBFKDEuNDBmKSwgRkwyQjJQRSgxLjYwZil9LCB7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMS44MGYpfX19fTsKIAogc3RhdGljIGNvbnN0IEJJVF9QRV9TRkFDIFNfQml0czJQZVRhYjMyMDAwW10gPSB7Ci0gIHsgMTYwMDAsIDB4MjQ3YWUxNDAsIDB4RkZGRkFDMUUsIDB4MjcwYTNkODAsIDB4RkZGRTlCN0MsIDB4MTRjY2NjYzAsIDB4MDAwMTEwQTEsIDB4MTVjMjhmNjAsIDB4RkZGRUVGNUZ9LAotICB7IDI0MDAwLCAweDIzMzMzMzQwLCAweDBmYmE4ODI3LCAweDIxOTk5OTgwLCAweDFiODY2ZTQ0LCAweDE4ZjVjMjgwLCAweDBmYmE4ODI3LCAweDExOTk5OWEwLCAweDRkNTUxZDY5fSwKLSAgeyAzMjAwMCwgMHgxZDcwYTNkNywgMHgwNzM1N2U2NywgMHgxN2FlMTQ3YiwgMHgwOWQ0OTUxOCwgMHgxYjg1MWViOCwgMHgwYTdjNWFjNCwgMHgxMmUxNDdhZSwgMHgxMTBhMTM3Zn0sCi0gIHsgNDgwMDAsIDB4MjBmNWMyOGYsIDB4MDQ5NjY3YjYsIDB4MWM3YWUxNDgsIDB4MDUzZTJkNjIsIDB4MjBhM2Q3MGEsIDB4MDUzZTJkNjIsIDB4MWIzMzMzMzMsIDB4MDVlNWYzMGV9LAotICB7IDY0MDAwLCAweDIzMzMzMzMzLCAweDAyOWYxNmIxLCAweDFmMGEzZDcxLCAweDAyZjJmOTg3LCAweDIzMzMzMzMzLCAweDAyOWYxNmIxLCAweDFlMTQ3YWUxLCAweDAzZWVhMjBhfSwKLSAgeyA5NjAwMCwgMHgyNWMyOGY1YywgMHgyYzNjOWVlZCwgMHgyMWViODUxZiwgMHgwMWY3NTEwNSwgMHgyNWMyOGY1YywgMHgwYTdjNWFjNCwgMHgyMWViODUxZiwgMHgwMWEzNmUyZn0sCi0gIHsxMjgwMDAsIDB4NTBmNWMyOGYsIDB4MThhNDNiYjQsIDB4MjNkNzBhM2QsIDB4MDEwYzZmN2EsIDB4MzAwMDAwMDAsIDB4MTY4YjVjYzAsIDB4MjM4NTFlYjgsIDB4MDE5MmE3Mzd9LAotICB7MTQ4MDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI0N2FlMTQ4LCAweDAwZGZiMjNiLCAweDNkYzI4ZjVjLCAweDMwMGY0YWFmLCAweDI0N2FlMTQ4LCAweDAxYmY2NDc2fSwKLSAgezE2MDAwMCwgMHgyNWMyOGY0MCwgMHhiMTViNTc0MCwgMHgyNGNjY2NjZCwgMHgwNTNlMmQ2MiwgMHg0ZjVjMjhmNiwgMHhiZWZkMDA3MiwgMHgyNTFlYjg1MiwgMHgwNGZiMTE4NH0sCi0gIHsyMDAwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MmIzMzMzMzMsIDB4MDgzNmJlOTEsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MmIzMzMzMzMsIDB4MDg5MDM5MGZ9LAotICB7MzIwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDQ5NDdhZTE0LCAweDAwMDAwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDRhOGY1YzI5LCAweDAwMDAwMDAwfQotfTsKKyAgICAvKiBiaXRyYXRlfCAgIGFmdGVyYnVybmVyIG9mZiAgICAgICAgICAgICAgfCAgIGFmdGVyYnVybmVyIG9uIHwgfCAgIG5DaD0xCisgICAgICAgfCAgIG5DaD0yICAgICAgIHwgICBuQ2g9MSAgICAgICB8ICAgbkNoPTIgICAgICAgICovCisgICAgezE2MDAwLAorICAgICB7e0ZMMkIyUEUoMS4yMGYpLCBGTDJCMlBFKDEuNDBmKX0sIHtGTDJCMlBFKDAuODBmKSwgRkwyQjJQRSgwLjgwZil9fX0sCisgICAgezI0MDAwLAorICAgICB7e0ZMMkIyUEUoMS40MGYpLCBGTDJCMlBFKDEuMjBmKX0sIHtGTDJCMlBFKDEuMDBmKSwgRkwyQjJQRSgwLjYwZil9fX0sCisgICAgezMyMDAwLAorICAgICB7e0ZMMkIyUEUoMS4yMGYpLCBGTDJCMlBFKDEuMjBmKX0sIHtGTDJCMlBFKDEuMDBmKSwgRkwyQjJQRSgwLjgwZil9fX0sCisgICAgezQ4MDAwLAorICAgICB7e0ZMMkIyUEUoMS40MGYpLCBGTDJCMlBFKDEuNDBmKX0sIHtGTDJCMlBFKDEuMjBmKSwgRkwyQjJQRSgxLjIwZil9fX0sCisgICAgezY0MDAwLAorICAgICB7e0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNDBmKX0sIHtGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjIwZil9fX0sCisgICAgezk2MDAwLAorICAgICB7e0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNDBmKX0sIHtGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjQwZil9fX0sCisgICAgezEyODAwMCwKKyAgICAge3tGTDJCMlBFKDEuODBmKSwgRkwyQjJQRSgxLjYwZil9LCB7RkwyQjJQRSgxLjgwZiksIEZMMkIyUEUoMS42MGYpfX19LAorICAgIHsxNDgwMDAsCisgICAgIHt7RkwyQjJQRSgxLjgwZiksIEZMMkIyUEUoMS42MGYpfSwge0ZMMkIyUEUoMS44MGYpLCBGTDJCMlBFKDEuNjBmKX19fSwKKyAgICB7MTYwMDAwLAorICAgICB7e0ZMMkIyUEUoMS44MGYpLCBGTDJCMlBFKDEuNjBmKX0sIHtGTDJCMlBFKDEuODBmKSwgRkwyQjJQRSgxLjYwZil9fX0sCisgICAgezIwMDAwMCwKKyAgICAge3tGTDJCMlBFKDEuNDBmKSwgRkwyQjJQRSgxLjYwZil9LCB7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMS42MGYpfX19LAorICAgIHszMjAwMDAsCisgICAgIHt7RkwyQjJQRSgzLjIwZiksIEZMMkIyUEUoMS44MGYpfSwge0ZMMkIyUEUoMy4yMGYpLCBGTDJCMlBFKDEuODBmKX19fX07CiAKIHN0YXRpYyBjb25zdCBCSVRfUEVfU0ZBQyBTX0JpdHMyUGVUYWI0NDEwMFtdID0gewotICB7IDE2MDAwLCAweDEwYTNkNzBhLCAweDE3OTdjYzNhLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDU5MjEwMzg2LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKLSAgeyAyNDAwMCwgMHgxNjY2NjY2NiwgMHgxNzk3Y2MzYSwgMHgwMDAwMDAwMCwgMHg2MzlkNWU0YSwgMHgxNWMyOGY1YywgMHgxMjU5OWVkOCwgMHgwMDAwMDAwMCwgMHg1YmMwMWEzN30sCi0gIHsgMzIwMDAsIDB4MWMyOGY1YzMsIDB4MDQ5NjY3YjYsIDB4MTg1MWViODUsIDB4MDQ5NjY3YjYsIDB4MWEzZDcwYTQsIDB4MDg4NTA5YzAsIDB4MTY2NjY2NjYsIDB4MDUzZTJkNjJ9LAotICB7IDQ4MDAwLCAweDFlNjY2NjY2LCAweDA1ZTVmMzBlLCAweDFhOGY1YzI5LCAweDA0OTY2N2I2LCAweDFlNjY2NjY2LCAweDA1ZTVmMzBlLCAweDE4ZjVjMjhmLCAweDA1ZTVmMzBlfSwKLSAgeyA2NDAwMCwgMHgyMTQ3YWUxNCwgMHgwMzQ2ZGM1ZCwgMHgxY2NjY2NjZCwgMHgwMmYyZjk4NywgMHgyMTQ3YWUxNCwgMHgwMmYyZjk4NywgMHgxYmQ3MGEzZCwgMHgwMzlhYmYzNH0sCi0gIHsgOTYwMDAsIDB4MjQ3YWUxNDgsIDB4MDY4ZGI4YmIsIDB4MWZhZTE0N2IsIDB4MDI5ZjE2YjEsIDB4MjQyOGY1YzMsIDB4MDYzOWQ1ZTUsIDB4MWY1YzI4ZjYsIDB4MDI5ZjE2YjF9LAotICB7MTI4MDAwLCAweDJhZTE0N2FlLCAweDFiNDM1MjY1LCAweDIyM2Q3MGE0LCAweDAxOTJhNzM3LCAweDJhM2Q3MGE0LCAweDEwNDBiZmU0LCAweDIxZWI4NTFmLCAweDAxOTJhNzM3fSwKLSAgezE0ODAwMCwgMHgzYjg1MWViOCwgMHgyODMyMDY5YywgMHgyMzMzMzMzMywgMHgwMGRmYjIzYiwgMHgzNDI4ZjVjMywgMHgyMDU0YzI4OCwgMHgyMmUxNDdhZSwgMHgwMGRmYjIzYn0sCi0gIHsxNjAwMDAsIDB4NGEzZDcwYTQsIDB4YzMyZWJlNWEsIDB4MjM4NTFlYjgsIDB4MDFkNWMzMTYsIDB4NDAwMDAwMDAsIDB4Y2I5MjNhMmIsIDB4MjMzMzMzMzMsIDB4MDFkNWMzMTZ9LAotICB7MjAwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI1YzI4ZjVjLCAweDA3MTNmMDc4LCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI1NzBhM2Q3LCAweDA3MmE0ZjE3fSwKLSAgezMyMDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgzZmFlMTQ3YiwgMHgwMDAwMDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgzZmFlMTQ3YiwgMHgwMDAwMDAwMH0KLX07CisgICAgLyogYml0cmF0ZXwgICBhZnRlcmJ1cm5lciBvZmYgICAgICAgICAgICAgIHwgICBhZnRlcmJ1cm5lciBvbiB8IHwgICBuQ2g9MQorICAgICAgIHwgICBuQ2g9MiAgICAgICB8ICAgbkNoPTEgICAgICAgfCAgIG5DaD0yICAgICAgICAqLworICAgIHsxNjAwMCwKKyAgICAge3tGTDJCMlBFKDEuMjBmKSwgRkwyQjJQRSgxLjYwZil9LCB7RkwyQjJQRSgwLjgwZiksIEZMMkIyUEUoMS4wMGYpfX19LAorICAgIHsyNDAwMCwKKyAgICAge3tGTDJCMlBFKDEuMDBmKSwgRkwyQjJQRSgxLjIwZil9LCB7RkwyQjJQRSgxLjAwZiksIEZMMkIyUEUoMC44MGYpfX19LAorICAgIHszMjAwMCwKKyAgICAge3tGTDJCMlBFKDEuMjBmKSwgRkwyQjJQRSgxLjIwZil9LCB7RkwyQjJQRSgwLjgwZiksIEZMMkIyUEUoMC42MGYpfX19LAorICAgIHs0ODAwMCwKKyAgICAge3tGTDJCMlBFKDEuMjBmKSwgRkwyQjJQRSgxLjIwZil9LCB7RkwyQjJQRSgxLjIwZiksIEZMMkIyUEUoMC44MGYpfX19LAorICAgIHs2NDAwMCwKKyAgICAge3tGTDJCMlBFKDEuNDBmKSwgRkwyQjJQRSgxLjIwZil9LCB7RkwyQjJQRSgxLjIwZiksIEZMMkIyUEUoMS4wMGYpfX19LAorICAgIHs5NjAwMCwKKyAgICAge3tGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjIwZil9LCB7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS4yMGYpfX19LAorICAgIHsxMjgwMDAsCisgICAgIHt7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS42MGYpfSwge0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNDBmKX19fSwKKyAgICB7MTQ4MDAwLAorICAgICB7e0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNjBmKX0sIHtGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjYwZil9fX0sCisgICAgezE2MDAwMCwKKyAgICAge3tGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjYwZil9LCB7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS42MGYpfX19LAorICAgIHsyMDAwMDAsCisgICAgIHt7RkwyQjJQRSgxLjgwZiksIEZMMkIyUEUoMS42MGYpfSwge0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNjBmKX19fSwKKyAgICB7MzIwMDAwLAorICAgICB7e0ZMMkIyUEUoMy4yMGYpLCBGTDJCMlBFKDEuNjBmKX0sIHtGTDJCMlBFKDMuMjBmKSwgRkwyQjJQRSgxLjYwZil9fX19OwogCiBzdGF0aWMgY29uc3QgQklUX1BFX1NGQUMgU19CaXRzMlBlVGFiNDgwMDBbXSA9IHsKLSAgeyAxNjAwMCwgMHgwZjVjMjhmNiwgMHgzMWNlYWYyNSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg3NGE3NzFjOSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCi0gIHsgMjQwMDAsIDB4MWI4NTFlYjgsIDB4MDI5ZjE2YjEsIDB4MDAwMDAwMDAsIDB4NjYzYzc0ZmIsIDB4MWM3YWUxNDgsIDB4ZTQ3OTkxYmQsIDB4MDAwMDAwMDAsIDB4NDk2NjdiNWZ9LAotICB7IDMyMDAwLCAweDFjMjhmNWMzLCAweDAyOWYxNmIxLCAweDE4ZjVjMjhmLCAweDA3MzU3ZTY3LCAweDE1YzI4ZjVjLCAweDBmMTJjMjdhLCAweDExZWI4NTFmLCAweDEzMDE2NDg0fSwKLSAgeyA0ODAwMCwgMHgxZDcwYTNkNywgMHgwNTNlMmQ2MiwgMHgxYzdhZTE0OCwgMHhmZTA4YWVmYywgMHgxZDFlYjg1MiwgMHgwNjhkYjhiYiwgMHgxYjMzMzMzMywgMHhmZWIwNzRhOH0sCi0gIHsgNjQwMDAsIDB4MjAwMDAwMDAsIDB4MDNlZWEyMGEsIDB4MWI4NTFlYjgsIDB4MDM0NmRjNWQsIDB4MjA1MWViODUsIDB4MDM0NmRjNWQsIDB4MWE4ZjVjMjksIDB4MDM5YWJmMzR9LAotICB7IDk2MDAwLCAweDIzZDcwYTNkLCAweDA1M2UyZDYyLCAweDFlYjg1MWVjLCAweDAyOWYxNmIxLCAweDIzODUxZWI4LCAweDA0ZWE0YThjLCAweDFlMTQ3YWUxLCAweDAyZjJmOTg3fSwKLSAgezEyODAwMCwgMHgyOGY1YzI4ZiwgMHgxNDcyN2RjYywgMHgyMTQ3YWUxNCwgMHgwMjE4ZGVmNCwgMHgyODUxZWI4NSwgMHgwZTI3ZTBmMCwgMHgyMGY1YzI4ZiwgMHgwMjE4ZGVmNH0sCi0gIHsxNDgwMDAsIDB4MzU3MGEzZDcsIDB4MWNkNWY5OWMsIDB4MjI4ZjVjMjksIDB4MDFiZjY0NzYsIDB4MzBmNWMyOGYsIDB4MTg3NzdlNzUsIDB4MjIzZDcwYTQsIDB4MDFiZjY0NzZ9LAotICB7MTYwMDAwLCAweDQwMDAwMDAwLCAweGNiOTIzYTJiLCAweDIzMzMzMzMzLCAweDAxOTJhNzM3LCAweDM5ZWI4NTFmLCAweGQwOGQ0YmFlLCAweDIyZTE0N2FlLCAweDAxOTJhNzM3fSwKLSAgezIwMDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNTFlYjg1MiwgMHgwNjc3NWExYiwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNGNjY2NjZCwgMHgwNmE0MTc1YX0sCi0gIHszMjAwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4M2NjY2NjY2QsIDB4MDAwMDAwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4M2QxZWI4NTIsIDB4MDAwMDAwMDB9Ci19OworICAgIC8qIGJpdHJhdGV8ICAgYWZ0ZXJidXJuZXIgb2ZmICAgICAgICAgICAgICB8ICAgYWZ0ZXJidXJuZXIgb24gfCB8ICAgbkNoPTEKKyAgICAgICB8ICAgbkNoPTIgICAgICAgfCAgIG5DaD0xICAgICAgIHwgICBuQ2g9MiAgICAgICAgKi8KKyAgICB7MTYwMDAsCisgICAgIHt7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMC4wMGYpfSwge0ZMMkIyUEUoMC44MGYpLCBGTDJCMlBFKDAuMDBmKX19fSwKKyAgICB7MjQwMDAsCisgICAgIHt7RkwyQjJQRSgxLjQwZiksIEZMMkIyUEUoMS4yMGYpfSwge0ZMMkIyUEUoMS4wMGYpLCBGTDJCMlBFKDAuODBmKX19fSwKKyAgICB7MzIwMDAsCisgICAgIHt7RkwyQjJQRSgxLjAwZiksIEZMMkIyUEUoMS4yMGYpfSwge0ZMMkIyUEUoMC42MGYpLCBGTDJCMlBFKDAuODBmKX19fSwKKyAgICB7NDgwMDAsCisgICAgIHt7RkwyQjJQRSgxLjIwZiksIEZMMkIyUEUoMS4wMGYpfSwge0ZMMkIyUEUoMC44MGYpLCBGTDJCMlBFKDAuODBmKX19fSwKKyAgICB7NjQwMDAsCisgICAgIHt7RkwyQjJQRSgxLjIwZiksIEZMMkIyUEUoMS4yMGYpfSwge0ZMMkIyUEUoMS4yMGYpLCBGTDJCMlBFKDEuMDBmKX19fSwKKyAgICB7OTYwMDAsCisgICAgIHt7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS40MGYpfSwge0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuMjBmKX19fSwKKyAgICB7MTI4MDAwLAorICAgICB7e0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNjBmKX0sIHtGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjQwZil9fX0sCisgICAgezE0ODAwMCwKKyAgICAge3tGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjYwZil9LCB7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS40MGYpfX19LAorICAgIHsxNjAwMDAsCisgICAgIHt7RkwyQjJQRSgxLjYwZiksIEZMMkIyUEUoMS42MGYpfSwge0ZMMkIyUEUoMS42MGYpLCBGTDJCMlBFKDEuNDBmKX19fSwKKyAgICB7MjAwMDAwLAorICAgICB7e0ZMMkIyUEUoMS4yMGYpLCBGTDJCMlBFKDEuNjBmKX0sIHtGTDJCMlBFKDEuNjBmKSwgRkwyQjJQRSgxLjQwZil9fX0sCisgICAgezMyMDAwMCwKKyAgICAge3tGTDJCMlBFKDMuMjBmKSwgRkwyQjJQRSgxLjYwZil9LCB7RkwyQjJQRSgzLjIwZiksIEZMMkIyUEUoMS42MGYpfX19fTsKIAogc3RhdGljIGNvbnN0IEJJVFMyUEVfQ0ZHX1RBQiBiaXRzMlBlQ29uZmlnVGFiW10gPSB7Ci0gIHsgMTYwMDAsIFNfQml0czJQZVRhYjE2MDAwLCBzaXplb2YoU19CaXRzMlBlVGFiMTYwMDApL3NpemVvZihCSVRfUEVfU0ZBQykgfSwKLSAgeyAyMjA1MCwgU19CaXRzMlBlVGFiMjIwNTAsIHNpemVvZihTX0JpdHMyUGVUYWIyMjA1MCkvc2l6ZW9mKEJJVF9QRV9TRkFDKSB9LAotICB7IDI0MDAwLCBTX0JpdHMyUGVUYWIyNDAwMCwgc2l6ZW9mKFNfQml0czJQZVRhYjI0MDAwKS9zaXplb2YoQklUX1BFX1NGQUMpIH0sCi0gIHsgMzIwMDAsIFNfQml0czJQZVRhYjMyMDAwLCBzaXplb2YoU19CaXRzMlBlVGFiMzIwMDApL3NpemVvZihCSVRfUEVfU0ZBQykgfSwKLSAgeyA0NDEwMCwgU19CaXRzMlBlVGFiNDQxMDAsIHNpemVvZihTX0JpdHMyUGVUYWI0NDEwMCkvc2l6ZW9mKEJJVF9QRV9TRkFDKSB9LAotICB7IDQ4MDAwLCBTX0JpdHMyUGVUYWI0ODAwMCwgc2l6ZW9mKFNfQml0czJQZVRhYjQ4MDAwKS9zaXplb2YoQklUX1BFX1NGQUMpIH0KLX07Ci0KLQorICAgIHsxNjAwMCwgU19CaXRzMlBlVGFiMTYwMDAsIHNpemVvZihTX0JpdHMyUGVUYWIxNjAwMCkgLyBzaXplb2YoQklUX1BFX1NGQUMpfSwKKyAgICB7MjIwNTAsIFNfQml0czJQZVRhYjIyMDUwLCBzaXplb2YoU19CaXRzMlBlVGFiMjIwNTApIC8gc2l6ZW9mKEJJVF9QRV9TRkFDKX0sCisgICAgezI0MDAwLCBTX0JpdHMyUGVUYWIyNDAwMCwgc2l6ZW9mKFNfQml0czJQZVRhYjI0MDAwKSAvIHNpemVvZihCSVRfUEVfU0ZBQyl9LAorICAgIHszMjAwMCwgU19CaXRzMlBlVGFiMzIwMDAsIHNpemVvZihTX0JpdHMyUGVUYWIzMjAwMCkgLyBzaXplb2YoQklUX1BFX1NGQUMpfSwKKyAgICB7NDQxMDAsIFNfQml0czJQZVRhYjQ0MTAwLCBzaXplb2YoU19CaXRzMlBlVGFiNDQxMDApIC8gc2l6ZW9mKEJJVF9QRV9TRkFDKX0sCisgICAgezQ4MDAwLCBTX0JpdHMyUGVUYWI0ODAwMCwKKyAgICAgc2l6ZW9mKFNfQml0czJQZVRhYjQ4MDAwKSAvIHNpemVvZihCSVRfUEVfU0ZBQyl9fTsKIAogLyogdmFsdWVzIGZvciBhdm9pZCBob2xlIGZsYWcgKi8KLWVudW0gX2F2b2lkX2hvbGVfc3RhdGUgewotICAgIE5PX0FIICAgICAgICAgICAgICA9MCwKLSAgICBBSF9JTkFDVElWRSAgICAgICAgPTEsCi0gICAgQUhfQUNUSVZFICAgICAgICAgID0yCi19OwotCitlbnVtIF9hdm9pZF9ob2xlX3N0YXRlIHsgTk9fQUggPSAwLCBBSF9JTkFDVElWRSA9IDEsIEFIX0FDVElWRSA9IDIgfTsKIAogLyogIFEgZm9ybWF0IGRlZmluaXRpb25zICovCi0jZGVmaW5lIFFfQklURkFDICAgICgyNCkgICAvKiBRIHNjYWxpbmcgdXNlZCBpbiBGREthYWNFbmNfYml0cmVzQ2FsY0JpdEZhYygpIGNhbGN1bGF0aW9uICovCi0jZGVmaW5lIFFfQVZHQklUUyAgICgxNykgICAvKiBzY2FsZSBiaXQgdmFsdWVzICovCi0KKyNkZWZpbmUgUV9CSVRGQUMgXAorICAoMjQpIC8qIFEgc2NhbGluZyB1c2VkIGluIEZES2FhY0VuY19iaXRyZXNDYWxjQml0RmFjKCkgY2FsY3VsYXRpb24gKi8KKyNkZWZpbmUgUV9BVkdCSVRTICgxNykgLyogc2NhbGUgYml0IHZhbHVlcyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19Jbml0Qml0czJQZUZhY3RvcgogICAgIGRlc2NyaXB0aW9uOiAgcmV0cmlldmUgYml0czJQZUZhY3RvciBmcm9tIHRhYmxlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIEZES2FhY0VuY19Jbml0Qml0czJQZUZhY3RvcigKLSAgICAgICAgRklYUF9EQkwgKmJpdHMyUGVGYWN0b3JfbSwKLSAgICAgICAgSU5UICpiaXRzMlBlRmFjdG9yX2UsCi0gICAgICAgIGNvbnN0IElOVCBiaXRSYXRlLAotICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzLAotICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZSwKLSAgICAgICAgY29uc3QgSU5UIGFkdmFuY2VkQml0c1RvUGUsCi0gICAgICAgIGNvbnN0IElOVCBkWm9uZVF1YW50RW5hYmxlLAotICAgICAgICBjb25zdCBJTlQgaW52UXVhbnQKLSAgICAgICAgKQotewotICAvKiBkZWZhdWx0IGJpdHMycGUgZmFjdG9yICovCi0gIEZJWFBfREJMIGJpdDJQRV9tID0gRkwyRlhDT05TVF9EQkwoMS4xOGYvKDE8PCgxKSkpOwotICBJTlQgICAgICBiaXQyUEVfZSA9IDE7CisgICAgRklYUF9EQkwgKmJpdHMyUGVGYWN0b3JfbSwgSU5UICpiaXRzMlBlRmFjdG9yX2UsIGNvbnN0IElOVCBiaXRSYXRlLAorICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsIGNvbnN0IElOVCBzYW1wbGVSYXRlLCBjb25zdCBJTlQgYWR2YW5jZWRCaXRzVG9QZSwKKyAgICBjb25zdCBJTlQgZFpvbmVRdWFudEVuYWJsZSwgY29uc3QgSU5UIGludlF1YW50KSB7CisgIC8qKioqIDEpIFNldCBkZWZhdWx0IGJpdHMycGUgZmFjdG9yICoqKiovCisgIEZJWFBfREJMIGJpdDJQRV9tID0gRkwyRlhDT05TVF9EQkwoMS4xOGYgLyAoMSA8PCAoMSkpKTsKKyAgSU5UIGJpdDJQRV9lID0gMTsKIAotICAvKiBtYWtlIHVzZSBvZiBhZHZhbmNlZCBiaXRzIHRvIHBlIGZhY3RvciB0YWJsZSAqLwotICBpZiAoYWR2YW5jZWRCaXRzVG9QZSkgewotCisgIC8qKioqIDIpIEZvciBBQUMtKEUpTEQsIG1ha2UgdXNlIG9mIGFkdmFuY2VkIGJpdHMgdG8gcGUgZmFjdG9yIHRhYmxlICoqKiovCisgIGlmIChhZHZhbmNlZEJpdHNUb1BlICYmIG5DaGFubmVscyA8PSAoMikpIHsKICAgICBpbnQgaTsKICAgICBjb25zdCBCSVRfUEVfU0ZBQyAqcGVUYWIgPSBOVUxMOwogICAgIElOVCBzaXplID0gMDsKIAotCi0gICAgLyogR2V0IGNvcnJlY3QgdGFibGUgZW50cnkgKi8KLSAgICBmb3IgKGk9MDsgaTwoSU5UKShzaXplb2YoYml0czJQZUNvbmZpZ1RhYikvc2l6ZW9mKEJJVFMyUEVfQ0ZHX1RBQikpOyBpKyspIHsKKyAgICAvKioqIDIuMSkgR2V0IGNvcnJlY3QgdGFibGUgZW50cnkgKioqLworICAgIGZvciAoaSA9IDA7IGkgPCAoSU5UKShzaXplb2YoYml0czJQZUNvbmZpZ1RhYikgLyBzaXplb2YoQklUUzJQRV9DRkdfVEFCKSk7CisgICAgICAgICBpKyspIHsKICAgICAgIGlmIChzYW1wbGVSYXRlID49IGJpdHMyUGVDb25maWdUYWJbaV0uc2FtcGxlUmF0ZSkgewogICAgICAgICBwZVRhYiA9IGJpdHMyUGVDb25maWdUYWJbaV0ucFBlVGFiOwotICAgICAgICBzaXplICA9IGJpdHMyUGVDb25maWdUYWJbaV0ubkVudHJpZXM7CisgICAgICAgIHNpemUgPSBiaXRzMlBlQ29uZmlnVGFiW2ldLm5FbnRyaWVzOwogICAgICAgfQogICAgIH0KIAotICAgIGlmICggKHBlVGFiIT1OVUxMKSAmJiAoc2l6ZSE9MCkgKSB7CisgICAgaWYgKChwZVRhYiAhPSBOVUxMKSAmJiAoc2l6ZSAhPSAwKSkgeworICAgICAgSU5UIHN0YXJ0QiA9IC0xOyAvKiBiaXRyYXRlIGVudHJ5IGluIHRhYmxlIHRoYXQgaXMgdGhlIG5leHQtbG93ZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsIGJpdHJhdGUgICovCisgICAgICBJTlQgc3RvcEIgPSAtMTsgIC8qIGJpdHJhdGUgZW50cnkgaW4gdGFibGUgdGhhdCBpcyB0aGUgbmV4dC1oaWdoZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsIGJpdHJhdGUgKi8KKyAgICAgIEZJWFBfREJMIHN0YXJ0UEYgPQorICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMGYpOyAvKiBiaXRzMlBFIGZhY3RvciBlbnRyeSBpbiB0YWJsZSB0aGF0IGlzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LWxvd2VyIHRvIGFjdHVhbCBiaXRzMlBFIGZhY3RvciAgKi8KKyAgICAgIEZJWFBfREJMIHN0b3BQRiA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOyAvKiBiaXRzMlBFIGZhY3RvciBlbnRyeSBpbiB0YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgaXMgdGhlIG5leHQtaGlnaGVyIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsIGJpdHMyUEUgZmFjdG9yICovCisgICAgICBGSVhQX0RCTCBzbG9wZSA9IEZMMkZYQ09OU1RfREJMKAorICAgICAgICAgIDAuMGYpOyAvKiB0aGUgc2xvcGUgZnJvbSB0aGUgc3RhcnQgYml0czJQZSBlbnRyeSB0byB0aGUgbmV4dCBvbmUgKi8KKyAgICAgIGNvbnN0IGludCBxdWFsaXR5SWR4ID0gKGludlF1YW50ID09IDApID8gMCA6IDE7CiAKLSAgICAgIElOVCBzdGFydEIgICAgICA9IC0xOwotICAgICAgTE9ORyBzdGFydFBGICAgID0gMDsKLSAgICAgIExPTkcgcGVTbG9wZSAgICA9IDA7Ci0KLSAgICAgIC8qIHN0ZXJlbyBvciBtb25vIG1vZGUgYW5kIGludlF1YW50IHVzZWQgb3Igbm90ICovCi0gICAgICBmb3IgKGk9MDsgaTxzaXplLTE7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKChwZVRhYltpXS5iaXRyYXRlPD1iaXRSYXRlKSAmJiAoKHBlVGFiW2krMV0uYml0cmF0ZT5iaXRSYXRlKSB8fCAoKGk9PXNpemUtMikpICkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobkNoYW5uZWxzPT0xKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN0YXJ0UEYgPSAoIWludlF1YW50KSA/IHBlVGFiW2ldLmJpdHMyUGVGYWN0b3JfbW9ubyAgIDogcGVUYWJbaV0uYml0czJQZUZhY3Rvcl9tb25vX3NjZk9wdDsKLSAgICAgICAgICAgIHBlU2xvcGUgPSAoIWludlF1YW50KSA/IHBlVGFiW2ldLmJpdHMyUGVGYWN0b3JfbW9ub19zbG9wZSA6IHBlVGFiW2ldLmJpdHMyUGVGYWN0b3JfbW9ub19zY2ZPcHRfc2xvcGU7Ci0gICAgICAgICAgICAvKmVuZFBGICAgPSAoIWludlF1YW50KSA/IHBlVGFiW2krMV0uYml0czJQZUZhY3Rvcl9tb25vIDogcGVUYWJbaSsxXS5iaXRzMlBlRmFjdG9yX21vbm9fc2NmT3B0OwotICAgICAgICAgICAgZW5kQj1wZVRhYltpKzFdLmJpdHJhdGU7Ki8KLSAgICAgICAgICAgIHN0YXJ0Qj1wZVRhYltpXS5iaXRyYXRlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzdGFydFBGID0gKCFpbnZRdWFudCkgPyBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX3N0ZXJlbyAgIDogcGVUYWJbaV0uYml0czJQZUZhY3Rvcl9zdGVyZW9fc2NmT3B0OwotICAgICAgICAgICAgcGVTbG9wZSA9ICghaW52UXVhbnQpID8gcGVUYWJbaV0uYml0czJQZUZhY3Rvcl9zdGVyZW9fc2xvcGUgOiBwZVRhYltpXS5iaXRzMlBlRmFjdG9yX3N0ZXJlb19zY2ZPcHRfc2xvcGU7Ci0gICAgICAgICAgICAvKmVuZFBGICAgPSAoIWludlF1YW50KSA/IHBlVGFiW2krMV0uYml0czJQZUZhY3Rvcl9zdGVyZW8gOiBwZVRhYltpKzFdLmJpdHMyUGVGYWN0b3Jfc3RlcmVvX3NjZk9wdDsKLSAgICAgICAgICAgIGVuZEI9cGVUYWJbaSsxXS5iaXRyYXRlOyovCi0gICAgICAgICAgICBzdGFydEI9cGVUYWJbaV0uYml0cmF0ZTsKKyAgICAgIGlmIChiaXRSYXRlID49IHBlVGFiW3NpemUgLSAxXS5iaXRyYXRlKSB7CisgICAgICAgIC8qIENob3NlbiBiaXRyYXRlIGlzIGhpZ2hlciB0aGFuIHRoZSBoaWdoZXN0IGJpdHJhdGUgaW4gdGFibGUuCisgICAgICAgICAgIFRoZSBzbG9wZSBmb3IgZXh0cmFwb2xhdGluZyB0aGUgYml0czJQRSBmYWN0b3IgbXVzdCBiZSB6ZXJvLgorICAgICAgICAgICBWYWx1ZXMgYXJlIHNldCBhY2NvcmRpbmdseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBzdGFydEIgPSBwZVRhYltzaXplIC0gMV0uYml0cmF0ZTsKKyAgICAgICAgc3RvcEIgPQorICAgICAgICAgICAgYml0UmF0ZSArCisgICAgICAgICAgICAxOyAvKiBDYW4gYmUgYW4gYXJiaXRyYXJ5IHZhbHVlIGdyZWF0ZXIgdGhhbiBzdGFydEIgYW5kIGJpdHJhdGUuICovCisgICAgICAgIHN0YXJ0UEYgPSBwZVRhYltzaXplIC0gMV0uYml0czJQZUZhY3RvcltxdWFsaXR5SWR4XVtuQ2hhbm5lbHMgLSAxXTsKKyAgICAgICAgc3RvcFBGID0gcGVUYWJbc2l6ZSAtIDFdLmJpdHMyUGVGYWN0b3JbcXVhbGl0eUlkeF1bbkNoYW5uZWxzIC0gMV07CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZSAtIDE7IGkrKykgeworICAgICAgICAgIGlmICgocGVUYWJbaV0uYml0cmF0ZSA8PSBiaXRSYXRlKSAmJgorICAgICAgICAgICAgICAocGVUYWJbaSArIDFdLmJpdHJhdGUgPiBiaXRSYXRlKSkgeworICAgICAgICAgICAgc3RhcnRCID0gcGVUYWJbaV0uYml0cmF0ZTsKKyAgICAgICAgICAgIHN0b3BCID0gcGVUYWJbaSArIDFdLmJpdHJhdGU7CisgICAgICAgICAgICBzdGFydFBGID0gcGVUYWJbaV0uYml0czJQZUZhY3RvcltxdWFsaXR5SWR4XVtuQ2hhbm5lbHMgLSAxXTsKKyAgICAgICAgICAgIHN0b3BQRiA9IHBlVGFiW2kgKyAxXS5iaXRzMlBlRmFjdG9yW3F1YWxpdHlJZHhdW25DaGFubmVscyAtIDFdOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICB9IC8qIGZvciBpICovCisgICAgICB9CiAKLSAgICAgIC8qIGlmIGEgY29uZmlndXJhdGlvbiBpcyBhdmFpbGFibGUgKi8KLSAgICAgIGlmIChzdGFydEIhPS0xKSB7Ci0gICAgICAgIC8qIGxpbmVhciBpbnRlcnBvbGF0ZSB0byBhY3R1YWwgUEVmYWN0b3IgKi8KLSAgICAgICAgRklYUF9EQkwgcGVGYWMgPSBmTXVsdCgoRklYUF9EQkwpKGJpdFJhdGUtc3RhcnRCKTw8MTQsIChGSVhQX0RCTClwZVNsb3BlKSA8PCAyOwotICAgICAgICBGSVhQX0RCTCBiaXQyUEUgPSBwZUZhYyArIChGSVhQX0RCTClzdGFydFBGOyAvKiBzdGFydFBGX2Zsb2F0ID0gc3RhcnRQRiA8PCAyICovCisgICAgICAvKioqIDIuMikgQ29uZmlndXJhdGlvbiBhdmFpbGFibGU/ICoqKi8KKyAgICAgIGlmIChzdGFydEIgIT0gLTEpIHsKKyAgICAgICAgLyoqIDIuMi4xKSBsaW5lYXIgaW50ZXJwb2xhdGUgdG8gYWN0dWFsIFBFZmFjdG9yICoqLworICAgICAgICBGSVhQX0RCTCBiaXQyUEUgPSAwOwogCi0gICAgICAgIC8qIHNhbml0eSBjaGVjayBpZiBiaXRzMnBlIHZhbHVlIGlzIGhpZ2ggZW5vdWdoICovCi0gICAgICAgIGlmICggYml0MlBFID49IChGTDJGWENPTlNUX0RCTCgwLjM1ZikgPj4gMikgKSB7CisgICAgICAgIGNvbnN0IEZJWFBfREJMIG1heEJpdDJQRSA9IEZMMkZYQ09OU1RfREJMKDMuZiAvIDQuZik7CisKKyAgICAgICAgLyogYml0MlBFID0gKChzdG9wUEYtc3RhcnRQRikvKHN0b3BCLXN0YXJ0QikpKihiaXRSYXRlLXN0YXJ0Qikrc3RhcnRQRjsKKyAgICAgICAgICovCisgICAgICAgIHNsb3BlID0gZkRpdk5vcm0oYml0UmF0ZSAtIHN0YXJ0Qiwgc3RvcEIgLSBzdGFydEIpOworICAgICAgICBiaXQyUEUgPSBmTXVsdChzbG9wZSwgc3RvcFBGIC0gc3RhcnRQRikgKyBzdGFydFBGOworCisgICAgICAgIGJpdDJQRSA9IGZNaW4obWF4Qml0MlBFLCBiaXQyUEUpOworCisgICAgICAgIC8qKiAyLjIuMikgc2FuaXR5IGNoZWNrIGlmIGJpdHMycGUgdmFsdWUgaXMgaGlnaCBlbm91Z2ggKiovCisgICAgICAgIGlmIChiaXQyUEUgPj0gKEZMMkZYQ09OU1RfREJMKDAuMzVmKSA+PiAyKSkgewogICAgICAgICAgIGJpdDJQRV9tID0gYml0MlBFOwogICAgICAgICAgIGJpdDJQRV9lID0gMjsgLyogIHRhYmxlIGlzIGZpeGVkIHNjYWxlZCAqLwogICAgICAgICB9CiAgICAgICB9IC8qIGJyICovCi0gICAgfSAvKiBzciAqLwotICB9IC8qIGFkdmFuY2VkQml0c1RvUGUgKi8KKyAgICB9ICAgLyogc3IgKi8KKyAgfSAgICAgLyogYWR2YW5jZWRCaXRzVG9QZSAqLwogCi0KLSAgaWYgKGRab25lUXVhbnRFbmFibGUpCi0gIHsKLSAgICBpZihiaXQyUEVfbSA+PSAoRkwyRlhDT05TVF9EQkwoMC42ZikpPj5iaXQyUEVfZSkKLSAgICB7CisgIGlmIChkWm9uZVF1YW50RW5hYmxlKSB7CisgICAgaWYgKGJpdDJQRV9tID49IChGTDJGWENPTlNUX0RCTCgwLjZmKSkgPj4gYml0MlBFX2UpIHsKICAgICAgIC8qIEFkZGl0aW9uYWwgaGVhZHJvb20gZm9yIGFkZGl0aW9uICovCiAgICAgICBiaXQyUEVfbSA+Pj0gMTsKLSAgICAgIGJpdDJQRV9lICArPSAxOworICAgICAgYml0MlBFX2UgKz0gMTsKICAgICB9CiAKLSAgICAvKiB0aGUgcXVhbnRUZW5kZW5jeUNvbXBlbnNhdG9yIGNvbXBlbnNhdGVzIGEgbG93ZXIgYml0IGNvbnN1bXB0aW9uIGR1ZSB0byBpbmNyZWFzaW5nIHRoZSB0ZW5kZW5jeSB0byBxdWFudGl6ZSBsb3cgc3BlY3RyYWwgdmFsdWVzIHRvIHRoZSBsb3dlciBxdWFudGl6ZXIgYm9yZGVyIGZvciBiaXRyYXRlcyBiZWxvdyBhIGNlcnRhaW4gYml0cmF0ZSB0aHJlc2hvbGQgLS0+IHNlZSBhbHNvIGZ1bmN0aW9uIGNhbGNTZmJEaXN0TEQgaW4gcXVhbnRpemUuYyAqLwotICAgIGlmICgoYml0UmF0ZS9uQ2hhbm5lbHMgPiAzMjAwMCkgJiYgKGJpdFJhdGUvbkNoYW5uZWxzIDw9IDQwMDAwKSkgewotICAgICAgYml0MlBFX20gKz0gKEZMMkZYQ09OU1RfREJMKDAuNGYpKT4+Yml0MlBFX2U7Ci0gICAgfQotICAgIGVsc2UgaWYgKGJpdFJhdGUvbkNoYW5uZWxzID4gMjAwMDApIHsKLSAgICAgIGJpdDJQRV9tICs9IChGTDJGWENPTlNUX0RCTCgwLjNmKSk+PmJpdDJQRV9lOwotICAgIH0KLSAgICBlbHNlIGlmIChiaXRSYXRlL25DaGFubmVscyA+PSAxNjAwMCkgewotICAgICAgYml0MlBFX20gKz0gKEZMMkZYQ09OU1RfREJMKDAuM2YpKT4+Yml0MlBFX2U7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgYml0MlBFX20gKz0gKEZMMkZYQ09OU1RfREJMKDAuMGYpKT4+Yml0MlBFX2U7CisgICAgLyogdGhlIHF1YW50VGVuZGVuY3lDb21wZW5zYXRvciBjb21wZW5zYXRlcyBhIGxvd2VyIGJpdCBjb25zdW1wdGlvbiBkdWUgdG8KKyAgICAgKiBpbmNyZWFzaW5nIHRoZSB0ZW5kZW5jeSB0byBxdWFudGl6ZSBsb3cgc3BlY3RyYWwgdmFsdWVzIHRvIHRoZSBsb3dlcgorICAgICAqIHF1YW50aXplciBib3JkZXIgZm9yIGJpdHJhdGVzIGJlbG93IGEgY2VydGFpbiBiaXRyYXRlIHRocmVzaG9sZCAtLT4gc2VlCisgICAgICogYWxzbyBmdW5jdGlvbiBjYWxjU2ZiRGlzdExEIGluIHF1YW50aXplLmMgKi8KKyAgICBpZiAoKGJpdFJhdGUgLyBuQ2hhbm5lbHMgPiAzMjAwMCkgJiYgKGJpdFJhdGUgLyBuQ2hhbm5lbHMgPD0gNDAwMDApKSB7CisgICAgICBiaXQyUEVfbSArPSAoRkwyRlhDT05TVF9EQkwoMC40ZikpID4+IGJpdDJQRV9lOworICAgIH0gZWxzZSBpZiAoYml0UmF0ZSAvIG5DaGFubmVscyA+IDIwMDAwKSB7CisgICAgICBiaXQyUEVfbSArPSAoRkwyRlhDT05TVF9EQkwoMC4zZikpID4+IGJpdDJQRV9lOworICAgIH0gZWxzZSBpZiAoYml0UmF0ZSAvIG5DaGFubmVscyA+PSAxNjAwMCkgeworICAgICAgYml0MlBFX20gKz0gKEZMMkZYQ09OU1RfREJMKDAuM2YpKSA+PiBiaXQyUEVfZTsKKyAgICB9IGVsc2UgeworICAgICAgYml0MlBFX20gKz0gKEZMMkZYQ09OU1RfREJMKDAuMGYpKSA+PiBiaXQyUEVfZTsKICAgICB9CiAgIH0KIAotCiAgIC8qKioqKiAzLikgUmV0dXJuIGJpdHMycGUgZmFjdG9yICoqKioqLwogICAqYml0czJQZUZhY3Rvcl9tID0gYml0MlBFX207CiAgICpiaXRzMlBlRmFjdG9yX2UgPSBiaXQyUEVfZTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2JpdHMycGUyCiBkZXNjcmlwdGlvbjogIGNvbnZlcnQgZnJvbSBiaXRzIHRvIHBlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQgRkRLYWFjRW5jX2JpdHMycGUyKAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGJpdHMsCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAgZmFjdG9yX20sCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgZmFjdG9yX2UKLSAgICAgICAgKQotewotICAgcmV0dXJuIChJTlQpKGZNdWx0KGZhY3Rvcl9tLCAoRklYUF9EQkwpKGJpdHM8PFFfQVZHQklUUykpID4+IChRX0FWR0JJVFMtZmFjdG9yX2UpKTsKK0ZES19JTkxJTkUgSU5UIEZES2FhY0VuY19iaXRzMnBlMihjb25zdCBJTlQgYml0cywgY29uc3QgRklYUF9EQkwgZmFjdG9yX20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGZhY3Rvcl9lKSB7CisgIHJldHVybiAoSU5UKShmTXVsdChmYWN0b3JfbSwgKEZJWFBfREJMKShiaXRzIDw8IFFfQVZHQklUUykpID4+CisgICAgICAgICAgICAgICAoUV9BVkdCSVRTIC0gZmFjdG9yX2UpKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jYWxjVGhyZXNoRXhwCiBkZXNjcmlwdGlvbjogIGxvdWRuZXNzIGNhbGN1bGF0aW9uICh0aHJlc2hvbGQgdG8gdGhlIHBvd2VyIG9mIHJlZEV4cCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NhbGNUaHJlc2hFeHAoRklYUF9EQkwgdGhyRXhwWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwqICBxY091dENoYW5uZWxbKDIpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiAgcHN5T3V0Q2hhbm5lbFsoMildLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzKQotewotICAgSU5UIGNoLCBzZmIsIHNmYkdycDsKLSAgIEZJWFBfREJMIHRockV4cExkRGF0YTsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jYWxjVGhyZXNoRXhwKAorICAgIEZJWFBfREJMIHRockV4cFsoMildW01BWF9HUk9VUEVEX1NGQl0sCisgICAgY29uc3QgUUNfT1VUX0NIQU5ORUwgKmNvbnN0IHFjT3V0Q2hhbm5lbFsoMildLAorICAgIGNvbnN0IFBTWV9PVVRfQ0hBTk5FTCAqY29uc3QgcHN5T3V0Q2hhbm5lbFsoMildLCBjb25zdCBJTlQgbkNoYW5uZWxzKSB7CisgIElOVCBjaCwgc2ZiLCBzZmJHcnA7CisgIEZJWFBfREJMIHRockV4cExkRGF0YTsKIAotICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKLSAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgICAgdGhyRXhwTGREYXRhID0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXT4+MiA7Ci0gICAgICAgICB0aHJFeHBbY2hdW3NmYkdycCtzZmJdID0gQ2FsY0ludkxkRGF0YSh0aHJFeHBMZERhdGEpOwotICAgICAgIH0KLSAgICAgfQotICAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2FkYXB0TWluU25yCi0gICAgZGVzY3JpcHRpb246ICByZWR1Y2UgbWluU25yIHJlcXVpcmVtZW50cyBmb3IgYmFuZHMgd2l0aCByZWxhdGl2ZSBsb3cgZW5lcmdpZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRkRLYWFjRW5jX2FkYXB0TWluU25yKFFDX09VVF9DSEFOTkVMICAgICAqcWNPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICAgICpwc3lPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOU05SX0FEQVBUX1BBUkFNICptc2FQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIG5DaGFubmVscykKLXsKLSAgSU5UIGNoLCBzZmIsIHNmYkdycCwgblNmYjsKLSAgRklYUF9EQkwgYXZnRW5MRDY0LCBkYlJhdGlvLCBtaW5TbnJSZWQ7Ci0gIEZJWFBfREJMIG1pblNuckxpbWl0TEQ2NCA9IEZMMkZYQ09OU1RfREJMKC0wLjAwNTAzMDEyNjQ4MjYyZik7IC8qIGxkNjQoMC44ZikgKi8KLSAgRklYUF9EQkwgblNmYkxENjQ7Ci0gIEZJWFBfREJMIGFjY3U7Ci0KLSAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICAvKiBjYWxjIGF2ZXJhZ2UgZW5lcmd5IHBlciBzY2FsZWZhY3RvciBiYW5kICovCi0gICAgblNmYiA9IDA7Ci0gICAgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotCi0gICAgZm9yIChzZmJHcnA9MDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKLSAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgIGFjY3UgKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneVtzZmJHcnArc2ZiXT4+NjsKLQkJCQkgblNmYisrOwotCQkJIH0KLSAgICB9Ci0KLSAgICBpZiAoKGFjY3UgPT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHx8IChuU2ZiID09IDApKSB7Ci0gICAgICBhdmdFbkxENjQgPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgblNmYkxENjQgID0gQ2FsY0xkSW50KG5TZmIpOwotICAgICAgYXZnRW5MRDY0ID0gQ2FsY0xkRGF0YShhY2N1KTsKLSAgICAgIGF2Z0VuTEQ2NCA9IGF2Z0VuTEQ2NCArIEZMMkZYQ09OU1RfREJMKDAuMDkzNzVmKSAtIG5TZmJMRDY0OyAgLyogMC4wOTM3NWY6IGNvbXBlbnNhdGUgc2hpZnQgd2l0aCA2ICovCi0gICAgfQotCi0gICAgLyogcmVkdWNlIG1pblNuciByZXF1aXJlbWVudCBieSBtaW5TbnJebWluU25yUmVkIGRlcGVuZGVudCBvbiBhdmdFbi9zZmJFbiAqLwotICAgIGZvciAoc2ZiR3JwPTA7IHNmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7Ci0gICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgICBpZiAoIChtc2FQYXJhbS0+c3RhcnRSYXRpbyArIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSkgPCBhdmdFbkxENjQgKSB7Ci0gICAgICAgICAgZGJSYXRpbyA9IGZNdWx0KChhdmdFbkxENjQgLSBxY091dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0pLEZMMkZYQ09OU1RfREJMKDAuMzAxMDI5OTk1NmYpKTsgLyogc2NhbGVkIGJ5ICgxLjBmLygxMC4wZio2NC4wZikpICovCi0gICAgICAgICAgbWluU25yUmVkID0gbXNhUGFyYW0tPnJlZE9mZnMgKyBmTXVsdChtc2FQYXJhbS0+cmVkUmF0aW9GYWMsZGJSYXRpbyk7IC8qIHNjYWxlZCBieSAxLjBmLzY0LjBmKi8KLSAgICAgICAgICBtaW5TbnJSZWQgPSBmaXhNYXgobWluU25yUmVkLCBtc2FQYXJhbS0+bWF4UmVkKTsgLyogc2NhbGVkIGJ5IDEuMGYvNjQuMGYqLwotICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA9IChmTXVsdChxY091dENoYW5uZWxbY2hdLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0sbWluU25yUmVkKSkgPDwgNjsKLSAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPSBmaXhNaW4obWluU25yTGltaXRMRDY0LCBxY091dENoYW5uZWxbY2hdLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0pOwotICAgICAgICB9CisgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsKKyAgICAgICAgIHNmYkdycCArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKKyAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICB0aHJFeHBMZERhdGEgPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCArIHNmYl0gPj4gMjsKKyAgICAgICAgdGhyRXhwW2NoXVtzZmJHcnAgKyBzZmJdID0gQ2FsY0ludkxkRGF0YSh0aHJFeHBMZERhdGEpOwogICAgICAgfQogICAgIH0KICAgfQogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19hZGFwdE1pblNucgorICAgIGRlc2NyaXB0aW9uOiAgcmVkdWNlIG1pblNuciByZXF1aXJlbWVudHMgZm9yIGJhbmRzIHdpdGggcmVsYXRpdmUgbG93CitlbmVyZ2llcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBGREthYWNFbmNfYWRhcHRNaW5TbnIoCisgICAgUUNfT1VUX0NIQU5ORUwgKmNvbnN0IHFjT3V0Q2hhbm5lbFsoMildLAorICAgIGNvbnN0IFBTWV9PVVRfQ0hBTk5FTCAqY29uc3QgcHN5T3V0Q2hhbm5lbFsoMildLAorICAgIGNvbnN0IE1JTlNOUl9BREFQVF9QQVJBTSAqY29uc3QgbXNhUGFyYW0sIGNvbnN0IElOVCBuQ2hhbm5lbHMpIHsKKyAgSU5UIGNoLCBzZmIsIHNmYkdycCwgblNmYjsKKyAgRklYUF9EQkwgYXZnRW5MRDY0LCBkYlJhdGlvLCBtaW5TbnJSZWQ7CisgIEZJWFBfREJMIG1pblNuckxpbWl0TEQ2NCA9CisgICAgICBGTDJGWENPTlNUX0RCTCgtMC4wMDUwMzAxMjY0ODI2MmYpOyAvKiBsZDY0KDAuOGYpICovCisgIEZJWFBfREJMIG5TZmJMRDY0OworICBGSVhQX0RCTCBhY2N1OworCisgIEZJWFBfREJMIG1zYVBhcmFtX21heFJlZCA9IG1zYVBhcmFtLT5tYXhSZWQ7CisgIEZJWFBfREJMIG1zYVBhcmFtX3N0YXJ0UmF0aW8gPSBtc2FQYXJhbS0+c3RhcnRSYXRpbzsKKyAgRklYUF9EQkwgbXNhUGFyYW1fcmVkUmF0aW9GYWMgPQorICAgICAgZk11bHQobXNhUGFyYW0tPnJlZFJhdGlvRmFjLCBGTDJGWENPTlNUX0RCTCgwLjMwMTAyOTk5NTZmKSk7CisgIEZJWFBfREJMIG1zYVBhcmFtX3JlZE9mZnMgPSBtc2FQYXJhbS0+cmVkT2ZmczsKKworICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAvKiBjYWxjIGF2ZXJhZ2UgZW5lcmd5IHBlciBzY2FsZWZhY3RvciBiYW5kICovCisgICAgblNmYiA9IDA7CisgICAgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworCisgICAgRFdPUkRfQUxJR05FRChwc3lPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5KTsKKworICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsKKyAgICAgICAgIHNmYkdycCArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKKyAgICAgIGludCBtYXhTZmJQZXJHcm91cCA9IHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsKKyAgICAgIG5TZmIgKz0gbWF4U2ZiUGVyR3JvdXA7CisgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICBhY2N1ICs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3lbc2ZiR3JwICsgc2ZiXSA+PiA2OworICAgICAgfQorICAgIH0KKworICAgIGlmICgoYWNjdSA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgfHwgKG5TZmIgPT0gMCkpIHsKKyAgICAgIGF2Z0VuTEQ2NCA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKKyAgICB9IGVsc2UgeworICAgICAgblNmYkxENjQgPSBDYWxjTGRJbnQoblNmYik7CisgICAgICBhdmdFbkxENjQgPSBDYWxjTGREYXRhKGFjY3UpOworICAgICAgYXZnRW5MRDY0ID0gYXZnRW5MRDY0ICsgRkwyRlhDT05TVF9EQkwoMC4wOTM3NWYpIC0KKyAgICAgICAgICAgICAgICAgIG5TZmJMRDY0OyAvKiAwLjA5Mzc1ZjogY29tcGVuc2F0ZSBzaGlmdCB3aXRoIDYgKi8KKyAgICB9CisKKyAgICAvKiByZWR1Y2UgbWluU25yIHJlcXVpcmVtZW50IGJ5IG1pblNucl5taW5TbnJSZWQgZGVwZW5kZW50IG9uIGF2Z0VuL3NmYkVuICovCisgICAgaW50IG1heFNmYlBlckdyb3VwID0gcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOworICAgIGludCBzZmJDbnQgPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OworICAgIGludCBzZmJQZXJHcm91cCA9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cDsKKworICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgc2ZiQ250OyBzZmJHcnAgKz0gc2ZiUGVyR3JvdXApIHsKKyAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwc2ZiRW5lcmd5TGREYXRhID0KKyAgICAgICAgICAmcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycF07CisgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcHNmYk1pblNuckxkRGF0YSA9CisgICAgICAgICAgJnFjT3V0Q2hhbm5lbFtjaF0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnBdOworICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBtYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgRklYUF9EQkwgc2ZiRW5lcmd5TGREYXRhID0gKnBzZmJFbmVyZ3lMZERhdGErKzsKKyAgICAgICAgRklYUF9EQkwgc2ZiTWluU25yTGREYXRhID0gKnBzZmJNaW5TbnJMZERhdGE7CisgICAgICAgIGRiUmF0aW8gPSBhdmdFbkxENjQgLSBzZmJFbmVyZ3lMZERhdGE7CisgICAgICAgIGludCB1cGRhdGUgPSAobXNhUGFyYW1fc3RhcnRSYXRpbyA8IGRiUmF0aW8pID8gMSA6IDA7CisgICAgICAgIG1pblNuclJlZCA9IG1zYVBhcmFtX3JlZE9mZnMgKyBmTXVsdChtc2FQYXJhbV9yZWRSYXRpb0ZhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiUmF0aW8pOyAvKiBzY2FsZWQgYnkgMS4wZi82NC4wZiovCisgICAgICAgIG1pblNuclJlZCA9CisgICAgICAgICAgICBmaXhNYXgobWluU25yUmVkLCBtc2FQYXJhbV9tYXhSZWQpOyAvKiBzY2FsZWQgYnkgMS4wZi82NC4wZiovCisgICAgICAgIG1pblNuclJlZCA9IChmTXVsdChzZmJNaW5TbnJMZERhdGEsIG1pblNuclJlZCkpIDw8IDY7CisgICAgICAgIG1pblNuclJlZCA9IGZpeE1pbihtaW5TbnJMaW1pdExENjQsIG1pblNuclJlZCk7CisgICAgICAgICpwc2ZiTWluU25yTGREYXRhKysgPSB1cGRhdGUgPyBtaW5TbnJSZWQgOiBzZmJNaW5TbnJMZERhdGE7CisgICAgICB9CisgICAgfQorICB9Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfaW5pdEF2b2lkSG9sZUZsYWcKIGRlc2NyaXB0aW9uOiAgZGV0ZXJtaW5lIGJhbmRzIHdoZXJlIGF2b2lkIGhvbGUgaXMgbm90IG5lY2Vzc2FyeSByZXNwLiBwb3NzaWJsZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfaW5pdEF2b2lkSG9sZUZsYWcoUUNfT1VUX0NIQU5ORUwgICpxY091dENoYW5uZWxbKDIpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbm5lbFsoMildLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgYWhGbGFnWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBUT09MU0lORk8gKnRvb2xzSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQRV9EQVRBICpwZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSF9QQVJBTSAqYWhQYXJhbSkKLXsKLSAgIElOVCBjaCwgc2ZiLCBzZmJHcnA7Ci0gICBGSVhQX0RCTCBzZmJFbiwgc2ZiRW5tMTsKLSAgIEZJWFBfREJMIHNmYkVuTGREYXRhOwotICAgRklYUF9EQkwgYXZnRW5MZERhdGE7CitzdGF0aWMgdm9pZCBGREthYWNFbmNfaW5pdEF2b2lkSG9sZUZsYWcoCisgICAgUUNfT1VUX0NIQU5ORUwgKmNvbnN0IHFjT3V0Q2hhbm5lbFsoMildLAorICAgIGNvbnN0IFBTWV9PVVRfQ0hBTk5FTCAqY29uc3QgcHN5T3V0Q2hhbm5lbFsoMildLAorICAgIFVDSEFSIGFoRmxhZ1soMildW01BWF9HUk9VUEVEX1NGQl0sIGNvbnN0IHN0cnVjdCBUT09MU0lORk8gKmNvbnN0IHRvb2xzSW5mbywKKyAgICBjb25zdCBJTlQgbkNoYW5uZWxzLCBjb25zdCBBSF9QQVJBTSAqY29uc3QgYWhQYXJhbSkgeworICBJTlQgY2gsIHNmYiwgc2ZiR3JwOworICBGSVhQX0RCTCBzZmJFbiwgc2ZiRW5tMTsKKyAgRklYUF9EQkwgc2ZiRW5MZERhdGE7CisgIEZJWFBfREJMIGF2Z0VuTGREYXRhOwogCi0gICAvKiBkZWNyZWFzZSBzcHJlYWQgZW5lcmd5IGJ5IDNkQiBmb3IgbG9uZyBibG9ja3MsIHJlc3AuIDJkQiBmb3Igc2hvcnRzCi0gICAgICAoYXZvaWQgbW9yZSBob2xlcyBpbiBsb25nIGJsb2NrcykgKi8KLSAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICBJTlQgc2ZiR3JwLCBzZmI7Ci0gICAgICBRQ19PVVRfQ0hBTk5FTCogIHFjT3V0Q2hhbiAgPSBxY091dENoYW5uZWxbY2hdOworICAvKiBkZWNyZWFzZSBzcHJlYWQgZW5lcmd5IGJ5IDNkQiBmb3IgbG9uZyBibG9ja3MsIHJlc3AuIDJkQiBmb3Igc2hvcnRzCisgICAgIChhdm9pZCBtb3JlIGhvbGVzIGluIGxvbmcgYmxvY2tzKSAqLworICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBRQ19PVVRfQ0hBTk5FTCAqY29uc3QgcWNPdXRDaGFuID0gcWNPdXRDaGFubmVsW2NoXTsKIAotICAgICAgaWYgKHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKSB7Ci0gICAgICAgICBmb3IgKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApCi0gICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKQotICAgICAgICAgICAgICBxY091dENoYW4tPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSA+Pj0gMSA7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgIGZvciAoc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkKLSAgICAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspCi0gICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCtzZmJdID0KLSAgICAgICAgICAgICAgICAgICBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjYzZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJTcHJlYWRFbmVyZ3lbc2ZiR3JwK3NmYl0pIDsKLSAgICAgIH0KLSAgIH0KKyAgICBpZiAocHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpIHsKKyAgICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsKKyAgICAgICAgICAgc2ZiR3JwICs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkKKyAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKQorICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCArIHNmYl0gPj49IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsKKyAgICAgICAgICAgc2ZiR3JwICs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkKKyAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKQorICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCArIHNmYl0gPSBmTXVsdCgKKyAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC42M2YpLCBxY091dENoYW4tPnNmYlNwcmVhZEVuZXJneVtzZmJHcnAgKyBzZmJdKTsKKyAgICB9CisgIH0KIAotICAgLyogaW5jcmVhc2UgbWluU25yIGZvciBsb2NhbCBwZWFrcywgZGVjcmVhc2UgaXQgZm9yIHZhbGxleXMgKi8KLSAgIGlmIChhaFBhcmFtLT5tb2RpZnlNaW5TbnIpIHsKLSAgICAgIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgIFFDX09VVF9DSEFOTkVMKiAgcWNPdXRDaGFuICA9IHFjT3V0Q2hhbm5lbFtjaF07Ci0gICAgICAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCl7Ci0gICAgICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgICAgICAgICAgRklYUF9EQkwgc2ZiRW5wMSwgYXZnRW47Ci0gICAgICAgICAgICAgICBpZiAoc2ZiID4gMCkKLSAgICAgICAgICAgICAgICAgIHNmYkVubTEgPSBxY091dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiLTFdOwotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgc2ZiRW5tMSA9IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdOworICAvKiBpbmNyZWFzZSBtaW5TbnIgZm9yIGxvY2FsIHBlYWtzLCBkZWNyZWFzZSBpdCBmb3IgdmFsbGV5cyAqLworICBpZiAoYWhQYXJhbS0+bW9kaWZ5TWluU25yKSB7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgICBRQ19PVVRfQ0hBTk5FTCAqY29uc3QgcWNPdXRDaGFuID0gcWNPdXRDaGFubmVsW2NoXTsKKyAgICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsKKyAgICAgICAgICAgc2ZiR3JwICs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgeworICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgICBGSVhQX0RCTCBzZmJFbnAxLCBhdmdFbjsKKyAgICAgICAgICBpZiAoc2ZiID4gMCkKKyAgICAgICAgICAgIHNmYkVubTEgPSBxY091dENoYW4tPnNmYkVuZXJneVtzZmJHcnAgKyBzZmIgLSAxXTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzZmJFbm0xID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwICsgc2ZiXTsKIAotICAgICAgICAgICAgICAgaWYgKHNmYiA8IHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cC0xKQotICAgICAgICAgICAgICAgICAgc2ZiRW5wMSA9IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmIrMV07Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBzZmJFbnAxID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl07CisgICAgICAgICAgaWYgKHNmYiA8IHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cCAtIDEpCisgICAgICAgICAgICBzZmJFbnAxID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwICsgc2ZiICsgMV07CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc2ZiRW5wMSA9IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCArIHNmYl07CiAKLSAgICAgICAgICAgICAgIGF2Z0VuID0gKHNmYkVubTE+PjEpICsgKHNmYkVucDE+PjEpOwotICAgICAgICAgICAgICAgYXZnRW5MZERhdGEgPSBDYWxjTGREYXRhKGF2Z0VuKTsKLSAgICAgICAgICAgICAgIHNmYkVuID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl07Ci0gICAgICAgICAgICAgICBzZmJFbkxkRGF0YSA9IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdOwotICAgICAgICAgICAgICAgLyogcGVhayA/ICovCi0gICAgICAgICAgICAgICBpZiAoc2ZiRW4gPiBhdmdFbikgewotICAgICAgICAgICAgICAgICAgRklYUF9EQkwgdG1wTWluU25yTGREYXRhOwotICAgICAgICAgICAgICAgICAgaWYgKHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2U9PUxPTkdfV0lORE9XKQotICAgICAgICAgICAgICAgICAgICAgdG1wTWluU25yTGREYXRhID0gZml4TWF4KCBTbnJMZEZhYyArIChGSVhQX0RCTCkoYXZnRW5MZERhdGEgLSBzZmJFbkxkRGF0YSksIChGSVhQX0RCTClTbnJMZE1pbjEgKSA7Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICB0bXBNaW5TbnJMZERhdGEgPSBmaXhNYXgoIFNuckxkRmFjICsgKEZJWFBfREJMKShhdmdFbkxkRGF0YSAtIHNmYkVuTGREYXRhKSwgKEZJWFBfREJMKVNuckxkTWluMyApIDsKKyAgICAgICAgICBhdmdFbiA9IChzZmJFbm0xID4+IDEpICsgKHNmYkVucDEgPj4gMSk7CisgICAgICAgICAgYXZnRW5MZERhdGEgPSBDYWxjTGREYXRhKGF2Z0VuKTsKKyAgICAgICAgICBzZmJFbiA9IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCArIHNmYl07CisgICAgICAgICAgc2ZiRW5MZERhdGEgPSBxY091dENoYW4tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnAgKyBzZmJdOworICAgICAgICAgIC8qIHBlYWsgPyAqLworICAgICAgICAgIGlmIChzZmJFbiA+IGF2Z0VuKSB7CisgICAgICAgICAgICBGSVhQX0RCTCB0bXBNaW5TbnJMZERhdGE7CisgICAgICAgICAgICBpZiAocHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBMT05HX1dJTkRPVykKKyAgICAgICAgICAgICAgdG1wTWluU25yTGREYXRhID0KKyAgICAgICAgICAgICAgICAgIGZpeE1heChTbnJMZEZhYyArIChGSVhQX0RCTCkoYXZnRW5MZERhdGEgLSBzZmJFbkxkRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKVNuckxkTWluMSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHRtcE1pblNuckxkRGF0YSA9CisgICAgICAgICAgICAgICAgICBmaXhNYXgoU25yTGRGYWMgKyAoRklYUF9EQkwpKGF2Z0VuTGREYXRhIC0gc2ZiRW5MZERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTClTbnJMZE1pbjMpOwogCi0gICAgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA9Ci0gICAgICAgICAgICAgICAgICAgICBmaXhNaW4ocWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0sIHRtcE1pblNuckxkRGF0YSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAvKiB2YWxsZXkgPyAqLwotICAgICAgICAgICAgICAgaWYgKCAoKHNmYkVuTGREYXRhKyhGSVhQX0RCTClTbnJMZE1pbjQpIDwgKEZJWFBfREJMKWF2Z0VuTGREYXRhKSAmJiAoc2ZiRW4gPiBGTDJGWENPTlNUX0RCTCgwLjApKSApIHsKLSAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHRtcE1pblNuckxkRGF0YSA9IGF2Z0VuTGREYXRhIC0gc2ZiRW5MZERhdGEgLShGSVhQX0RCTClTbnJMZE1pbjQgKyBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXTsKLSAgICAgICAgICAgICAgICAgIHRtcE1pblNuckxkRGF0YSA9IGZpeE1pbigoRklYUF9EQkwpU25yTGRGYWMsIHRtcE1pblNuckxkRGF0YSk7Ci0gICAgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA9IGZpeE1pbih0bXBNaW5TbnJMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdICsgU25yTGRNaW4yICkpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgfQotCi0gICAvKiBzdGVyZW86IGFkYXB0IHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50cyBzZmJNaW5TbnIgb2YgbWlkIGFuZAotICAgICAgc2lkZSBjaGFubmVscyB0byBhdm9pZCBzcGVuZGluZyB1bm5vdGljYWJsZSBiaXRzICovCi0gICBpZiAobkNoYW5uZWxzID09IDIpIHsKLSAgICAgIFFDX09VVF9DSEFOTkVMKiAgcWNPdXRDaGFuTSAgPSBxY091dENoYW5uZWxbMF07Ci0gICAgICBRQ19PVVRfQ0hBTk5FTCogIHFjT3V0Q2hhblMgID0gcWNPdXRDaGFubmVsWzFdOwotICAgICAgUFNZX09VVF9DSEFOTkVMKiAgcHN5T3V0Q2hhbk0gID0gcHN5T3V0Q2hhbm5lbFswXTsKLSAgICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5NLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbk0tPnNmYlBlckdyb3VwKXsKLSAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5NLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgICAgICBpZiAodG9vbHNJbmZvLT5tc01hc2tbc2ZiR3JwK3NmYl0pIHsKLSAgICAgICAgICAgICBGSVhQX0RCTCBtYXhTZmJFbkxkID0gZml4TWF4KHFjT3V0Q2hhbk0tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSxxY091dENoYW5TLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0pOwotICAgICAgICAgICAgIEZJWFBfREJMIG1heFRockxkLCBzZmJNaW5TbnJUbXBMZDsKLQotICAgICAgICAgICAgIGlmICggKChTbnJMZE1pbjU+PjEpICsgKG1heFNmYkVuTGQ+PjEpICsgKHFjT3V0Q2hhbk0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXT4+MSkpIDw9IEZMMkZYQ09OU1RfREJMKC0wLjVmKSkKLSAgICAgICAgICAgICAgIG1heFRockxkID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpIDsKLSAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBtYXhUaHJMZCA9IFNuckxkTWluNSArIG1heFNmYkVuTGQgKyBxY091dENoYW5NLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl07Ci0KLSAgICAgICAgICAgICBpZiAocWNPdXRDaGFuTS0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdID4gRkwyRlhDT05TVF9EQkwoMC4wZikpCi0gICAgICAgICAgICAgICBzZmJNaW5TbnJUbXBMZCA9IG1heFRockxkIC0gcWNPdXRDaGFuTS0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdOwotICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHNmYk1pblNuclRtcExkID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0KLSAgICAgICAgICAgICBxY091dENoYW5NLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPSBmaXhNYXgocWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdLHNmYk1pblNuclRtcExkKTsKLQotICAgICAgICAgICAgIGlmIChxY091dENoYW5NLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPD0gRkwyRlhDT05TVF9EQkwoMC4wZikpCi0gICAgICAgICAgICAgICAgcWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdID0gZml4TWluKHFjT3V0Q2hhbk0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSwgKEZJWFBfREJMKVNuckxkRmFjKTsKLQotICAgICAgICAgICAgIGlmIChxY091dENoYW5TLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0gPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkKLSAgICAgICAgICAgICAgIHNmYk1pblNuclRtcExkID0gbWF4VGhyTGQgLSBxY091dENoYW5TLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl07Ci0gICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgc2ZiTWluU25yVG1wTGQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLQotICAgICAgICAgICAgIHFjT3V0Q2hhblMtPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA9IGZpeE1heChxY091dENoYW5TLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0sc2ZiTWluU25yVG1wTGQpOwotCi0gICAgICAgICAgICAgaWYgKHFjT3V0Q2hhblMtPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA8PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkKLSAgICAgICAgICAgICAgICBxY091dENoYW5TLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPSBmaXhNaW4ocWNPdXRDaGFuUy0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdLChGSVhQX0RCTClTbnJMZEZhYyk7Ci0KLSAgICAgICAgICAgICBpZiAocWNPdXRDaGFuTS0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdPnFjT3V0Q2hhbk0tPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSkKLSAgICAgICAgICAgICAgICBxY091dENoYW5TLT5zZmJTcHJlYWRFbmVyZ3lbc2ZiR3JwK3NmYl0gPQotICAgICAgICAgICAgICAgICAgIGZNdWx0KHFjT3V0Q2hhblMtPnNmYkVuZXJneVtzZmJHcnArc2ZiXSwgRkwyRlhDT05TVF9EQkwoMC45ZikpOwotCi0gICAgICAgICAgICAgaWYgKHFjT3V0Q2hhblMtPnNmYkVuZXJneVtzZmJHcnArc2ZiXT5xY091dENoYW5TLT5zZmJTcHJlYWRFbmVyZ3lbc2ZiR3JwK3NmYl0pCi0gICAgICAgICAgICAgICAgcWNPdXRDaGFuTS0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCtzZmJdID0KLSAgICAgICAgICAgICAgICAgICBmTXVsdChxY091dENoYW5NLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0sIEZMMkZYQ09OU1RfREJMKDAuOWYpKTsKKyAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCArIHNmYl0gPSBmaXhNaW4oCisgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSwgdG1wTWluU25yTGREYXRhKTsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogdmFsbGV5ID8gKi8KKyAgICAgICAgICBpZiAoKChzZmJFbkxkRGF0YSArIChGSVhQX0RCTClTbnJMZE1pbjQpIDwgKEZJWFBfREJMKWF2Z0VuTGREYXRhKSAmJgorICAgICAgICAgICAgICAoc2ZiRW4gPiBGTDJGWENPTlNUX0RCTCgwLjApKSkgeworICAgICAgICAgICAgRklYUF9EQkwgdG1wTWluU25yTGREYXRhID0gYXZnRW5MZERhdGEgLSBzZmJFbkxkRGF0YSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpU25yTGRNaW40ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCArIHNmYl07CisgICAgICAgICAgICB0bXBNaW5TbnJMZERhdGEgPSBmaXhNaW4oKEZJWFBfREJMKVNuckxkRmFjLCB0bXBNaW5TbnJMZERhdGEpOworICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSA9CisgICAgICAgICAgICAgICAgZml4TWluKHRtcE1pblNuckxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKShxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnAgKyBzZmJdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbnJMZE1pbjIpKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KLSAgIH0KKyAgICB9CisgIH0KIAotICAgLyogaW5pdCBhaEZsYWcgKDA6IG5vIGFoIG5lY2Vzc2FyeSwgMTogYWggcG9zc2libGUsIDI6IGFoIGFjdGl2ZSAqLwotICAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgICAgUUNfT1VUX0NIQU5ORUwgICpxY091dENoYW4gID0gcWNPdXRDaGFubmVsW2NoXTsKLSAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgKnBzeU91dENoYW4gID0gcHN5T3V0Q2hhbm5lbFtjaF07Ci0gICAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApewotICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgICAgaWYgKChxY091dENoYW4tPnNmYlNwcmVhZEVuZXJneVtzZmJHcnArc2ZiXSA+IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdKQotICAgICAgICAgICAgICB8fCAocWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkpIHsKLSAgICAgICAgICAgICBhaEZsYWdbY2hdW3NmYkdycCtzZmJdID0gTk9fQUg7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgIGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gPSBBSF9JTkFDVElWRTsKLSAgICAgICAgICB9CisgIC8qIHN0ZXJlbzogYWRhcHQgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnRzIHNmYk1pblNuciBvZiBtaWQgYW5kCisgICAgIHNpZGUgY2hhbm5lbHMgdG8gYXZvaWQgc3BlbmRpbmcgdW5ub3RpY2FibGUgYml0cyAqLworICBpZiAobkNoYW5uZWxzID09IDIpIHsKKyAgICBRQ19PVVRfQ0hBTk5FTCAqcWNPdXRDaGFuTSA9IHFjT3V0Q2hhbm5lbFswXTsKKyAgICBRQ19PVVRfQ0hBTk5FTCAqcWNPdXRDaGFuUyA9IHFjT3V0Q2hhbm5lbFsxXTsKKyAgICBjb25zdCBQU1lfT1VUX0NIQU5ORUwgKmNvbnN0IHBzeU91dENoYW5NID0gcHN5T3V0Q2hhbm5lbFswXTsKKyAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeU91dENoYW5NLT5zZmJDbnQ7CisgICAgICAgICBzZmJHcnAgKz0gcHN5T3V0Q2hhbk0tPnNmYlBlckdyb3VwKSB7CisgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeU91dENoYW5NLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgaWYgKHRvb2xzSW5mby0+bXNNYXNrW3NmYkdycCArIHNmYl0pIHsKKyAgICAgICAgICBGSVhQX0RCTCBtYXhTZmJFbkxkID0KKyAgICAgICAgICAgICAgZml4TWF4KHFjT3V0Q2hhbk0tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnAgKyBzZmJdLAorICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFuUy0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCArIHNmYl0pOworICAgICAgICAgIEZJWFBfREJMIG1heFRockxkLCBzZmJNaW5TbnJUbXBMZDsKKworICAgICAgICAgIGlmICgoKFNuckxkTWluNSA+PiAxKSArIChtYXhTZmJFbkxkID4+IDEpICsKKyAgICAgICAgICAgICAgIChxY091dENoYW5NLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSA+PiAxKSkgPD0KKyAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoLTAuNWYpKQorICAgICAgICAgICAgbWF4VGhyTGQgPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbWF4VGhyTGQgPSBTbnJMZE1pbjUgKyBtYXhTZmJFbkxkICsKKyAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCArIHNmYl07CisKKyAgICAgICAgICBpZiAocWNPdXRDaGFuTS0+c2ZiRW5lcmd5W3NmYkdycCArIHNmYl0gPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkKKyAgICAgICAgICAgIHNmYk1pblNuclRtcExkID0KKyAgICAgICAgICAgICAgICBtYXhUaHJMZCAtIHFjT3V0Q2hhbk0tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnAgKyBzZmJdOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNmYk1pblNuclRtcExkID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisKKyAgICAgICAgICBxY091dENoYW5NLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSA9CisgICAgICAgICAgICAgIGZpeE1heChxY091dENoYW5NLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSwgc2ZiTWluU25yVG1wTGQpOworCisgICAgICAgICAgaWYgKHFjT3V0Q2hhbk0tPnNmYk1pblNuckxkRGF0YVtzZmJHcnAgKyBzZmJdIDw9IEZMMkZYQ09OU1RfREJMKDAuMGYpKQorICAgICAgICAgICAgcWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCArIHNmYl0gPSBmaXhNaW4oCisgICAgICAgICAgICAgICAgcWNPdXRDaGFuTS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCArIHNmYl0sIChGSVhQX0RCTClTbnJMZEZhYyk7CisKKyAgICAgICAgICBpZiAocWNPdXRDaGFuUy0+c2ZiRW5lcmd5W3NmYkdycCArIHNmYl0gPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkKKyAgICAgICAgICAgIHNmYk1pblNuclRtcExkID0KKyAgICAgICAgICAgICAgICBtYXhUaHJMZCAtIHFjT3V0Q2hhblMtPnNmYkVuZXJneUxkRGF0YVtzZmJHcnAgKyBzZmJdOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNmYk1pblNuclRtcExkID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisKKyAgICAgICAgICBxY091dENoYW5TLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSA9CisgICAgICAgICAgICAgIGZpeE1heChxY091dENoYW5TLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSwgc2ZiTWluU25yVG1wTGQpOworCisgICAgICAgICAgaWYgKHFjT3V0Q2hhblMtPnNmYk1pblNuckxkRGF0YVtzZmJHcnAgKyBzZmJdIDw9IEZMMkZYQ09OU1RfREJMKDAuMGYpKQorICAgICAgICAgICAgcWNPdXRDaGFuUy0+c2ZiTWluU25yTGREYXRhW3NmYkdycCArIHNmYl0gPSBmaXhNaW4oCisgICAgICAgICAgICAgICAgcWNPdXRDaGFuUy0+c2ZiTWluU25yTGREYXRhW3NmYkdycCArIHNmYl0sIChGSVhQX0RCTClTbnJMZEZhYyk7CisKKyAgICAgICAgICBpZiAocWNPdXRDaGFuTS0+c2ZiRW5lcmd5W3NmYkdycCArIHNmYl0gPgorICAgICAgICAgICAgICBxY091dENoYW5NLT5zZmJTcHJlYWRFbmVyZ3lbc2ZiR3JwICsgc2ZiXSkKKyAgICAgICAgICAgIHFjT3V0Q2hhblMtPnNmYlNwcmVhZEVuZXJneVtzZmJHcnAgKyBzZmJdID0gZk11bHQoCisgICAgICAgICAgICAgICAgcWNPdXRDaGFuUy0+c2ZiRW5lcmd5W3NmYkdycCArIHNmYl0sIEZMMkZYQ09OU1RfREJMKDAuOWYpKTsKKworICAgICAgICAgIGlmIChxY091dENoYW5TLT5zZmJFbmVyZ3lbc2ZiR3JwICsgc2ZiXSA+CisgICAgICAgICAgICAgIHFjT3V0Q2hhblMtPnNmYlNwcmVhZEVuZXJneVtzZmJHcnAgKyBzZmJdKQorICAgICAgICAgICAgcWNPdXRDaGFuTS0+c2ZiU3ByZWFkRW5lcmd5W3NmYkdycCArIHNmYl0gPSBmTXVsdCgKKyAgICAgICAgICAgICAgICBxY091dENoYW5NLT5zZmJFbmVyZ3lbc2ZiR3JwICsgc2ZiXSwgRkwyRlhDT05TVF9EQkwoMC45ZikpOworCisgICAgICAgIH0gLyogaWYgKHRvb2xzSW5mby0+bXNNYXNrW3NmYkdycCtzZmJdKSAqLworICAgICAgfSAgIC8qIHNmYiAqLworICAgIH0gICAgIC8qIHNmYkdycCAqLworICB9ICAgICAgIC8qIG5DaGFubmVscz09MiAqLworCisgIC8qIGluaXQgYWhGbGFnICgwOiBubyBhaCBuZWNlc3NhcnksIDE6IGFoIHBvc3NpYmxlLCAyOiBhaCBhY3RpdmUgKi8KKyAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbiA9IHFjT3V0Q2hhbm5lbFtjaF07CisgICAgY29uc3QgUFNZX09VVF9DSEFOTkVMICpjb25zdCBwc3lPdXRDaGFuID0gcHN5T3V0Q2hhbm5lbFtjaF07CisgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7CisgICAgICAgICBzZmJHcnAgKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApIHsKKyAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgIGlmICgocWNPdXRDaGFuLT5zZmJTcHJlYWRFbmVyZ3lbc2ZiR3JwICsgc2ZiXSA+CisgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwICsgc2ZiXSkgfHwKKyAgICAgICAgICAgIChxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnAgKyBzZmJdID4gRkwyRlhDT05TVF9EQkwoMC4wZikpKSB7CisgICAgICAgICAgYWhGbGFnW2NoXVtzZmJHcnAgKyBzZmJdID0gTk9fQUg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYWhGbGFnW2NoXVtzZmJHcnAgKyBzZmJdID0gQUhfSU5BQ1RJVkU7CiAgICAgICAgIH0KICAgICAgIH0KLSAgIH0KKyAgICB9CisgIH0KIH0KIAotCi0KIC8qKgotICogXGJyaWVmICBDYWxjdWxhdGUgY29uc3RhbnRzIHRoYXQgZG8gbm90IGNoYW5nZSBkdXJpbmcgc3VjY2Vzc2l2ZSBwZSBjYWxjdWxhdGlvbnMuCisgKiBcYnJpZWYgIENhbGN1bGF0ZSBjb25zdGFudHMgdGhhdCBkbyBub3QgY2hhbmdlIGR1cmluZyBzdWNjZXNzaXZlIHBlCisgKiBjYWxjdWxhdGlvbnMuCiAgKgotICogXHBhcmFtIHBlRGF0YSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHN0cnVjdHVyZSBjb250YWluaW5nIFBFIGRhdGEgb2YgY3VycmVudCBlbGVtZW50LgotICogXHBhcmFtIHBzeU91dENoYW5uZWwgICAgICAgICBQb2ludGVyIHRvIFBTWV9PVVRfQ0hBTk5FTCBzdHJ1Y3QgaG9sZGluZyBuQ2hhbm5lbHMgZWxlbWVudHMuCi0gKiBccGFyYW0gcWNPdXRDaGFubmVsICAgICAgICAgIFBvaW50ZXIgdG8gUUNfT1VUX0NIQU5ORUwgc3RydWN0IGhvbGRpbmcgbkNoYW5uZWxzIGVsZW1lbnRzLgorICogXHBhcmFtIHBlRGF0YSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHN0cnVjdHVyZSBjb250YWluaW5nIFBFIGRhdGEgb2YKKyAqIGN1cnJlbnQgZWxlbWVudC4KKyAqIFxwYXJhbSBwc3lPdXRDaGFubmVsICAgICAgICAgUG9pbnRlciB0byBQU1lfT1VUX0NIQU5ORUwgc3RydWN0IGhvbGRpbmcKKyAqIG5DaGFubmVscyBlbGVtZW50cy4KKyAqIFxwYXJhbSBxY091dENoYW5uZWwgICAgICAgICAgUG9pbnRlciB0byBRQ19PVVRfQ0hBTk5FTCBzdHJ1Y3QgaG9sZGluZworICogbkNoYW5uZWxzIGVsZW1lbnRzLgogICogXHBhcmFtIG5DaGFubmVscyAgICAgICAgICAgICBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gZWxlbWVudC4KLSAqIFxwYXJhbSBwZU9mZnNldCAgICAgICAgICAgICAgRml4ZWQgUEUgb2Zmc2V0IGRlZmluZWQgd2hpbGUgRkRLYWFjRW5jX0FkalRockluaXQoKSBkZXBlbmRpbmcgb24gYml0cmF0ZS4KKyAqIFxwYXJhbSBwZU9mZnNldCAgICAgICAgICAgICAgRml4ZWQgUEUgb2Zmc2V0IGRlZmluZWQgd2hpbGUKKyAqIEZES2FhY0VuY19BZGpUaHJJbml0KCkgZGVwZW5kaW5nIG9uIGJpdHJhdGUuCiAgKgogICogXHJldHVybiAgdm9pZAogICovCi1zdGF0aWMKLXZvaWQgRkRLYWFjRW5jX3ByZXBhcmVQZShQRV9EQVRBICpwZURhdGEsCi0gICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbKDIpXSwKLSAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoYW5uZWxbKDIpXSwKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICBjb25zdCBJTlQgcGVPZmZzZXQpCi17Ci0gICAgSU5UIGNoOworc3RhdGljIHZvaWQgRkRLYWFjRW5jX3ByZXBhcmVQZShQRV9EQVRBICpjb25zdCBwZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTWV9PVVRfQ0hBTk5FTCAqY29uc3QgcHN5T3V0Q2hhbm5lbFsoMildLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRQ19PVVRfQ0hBTk5FTCAqY29uc3QgcWNPdXRDaGFubmVsWygyKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsIGNvbnN0IElOVCBwZU9mZnNldCkgeworICBJTlQgY2g7CiAKLSAgICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9IHBzeU91dENoYW5uZWxbY2hdOwotICAgICAgICBGREthYWNFbmNfcHJlcGFyZVNmYlBlKCZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLAotICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhLAotICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhLAotICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRm9ybUZhY3RvckxkRGF0YSwKLSAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYk9mZnNldHMsCi0gICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJDbnQsCi0gICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCwKLSAgICAgICAgICAgIHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwKTsKLSAgICB9Ci0gICAgcGVEYXRhLT5vZmZzZXQgPSBwZU9mZnNldDsKKyAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgY29uc3QgUFNZX09VVF9DSEFOTkVMICpjb25zdCBwc3lPdXRDaGFuID0gcHN5T3V0Q2hhbm5lbFtjaF07CisgICAgRkRLYWFjRW5jX3ByZXBhcmVTZmJQZSgKKyAgICAgICAgJnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0sIHBzeU91dENoYW4tPnNmYkVuZXJneUxkRGF0YSwKKyAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhLCBxY091dENoYW5uZWxbY2hdLT5zZmJGb3JtRmFjdG9yTGREYXRhLAorICAgICAgICBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzLCBwc3lPdXRDaGFuLT5zZmJDbnQsIHBzeU91dENoYW4tPnNmYlBlckdyb3VwLAorICAgICAgICBwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cCk7CisgIH0KKyAgcGVEYXRhLT5vZmZzZXQgPSBwZU9mZnNldDsKIH0KIAogLyoqCiAgKiBcYnJpZWYgIENhbGN1bGF0ZSB3ZWlnaHRpbmcgZmFjdG9yIGZvciB0aHJlc2hvbGQgYWRqdXN0bWVudC4KICAqCi0gKiBDYWxjdWxhdGUgd2VpZ2h0aW5nIGZhY3RvciB0byBiZSBhcHBsaWVkIGF0IGVuZXJnaWVzIGFuZCB0aHJlc2hvbGRzIGluIGxkNjQgZm9ybWF0LgorICogQ2FsY3VsYXRlIHdlaWdodGluZyBmYWN0b3IgdG8gYmUgYXBwbGllZCBhdCBlbmVyZ2llcyBhbmQgdGhyZXNob2xkcyBpbiBsZDY0CisgKiBmb3JtYXQuCiAgKgogICogXHBhcmFtIHBlRGF0YSwgICAgICAgICAgICAgICBQb2ludGVyIHRvIFBFIGRhdGEgaW4gY3VycmVudCBlbGVtZW50LgotICogXHBhcmFtIHBzeU91dENoYW5uZWwgICAgICAgICBQb2ludGVyIHRvIFBTWV9PVVRfQ0hBTk5FTCBzdHJ1Y3QgaG9sZGluZyBuQ2hhbm5lbHMgZWxlbWVudHMuCi0gKiBccGFyYW0gcWNPdXRDaGFubmVsICAgICAgICAgIFBvaW50ZXIgdG8gUUNfT1VUX0NIQU5ORUwgc3RydWN0IGhvbGRpbmcgbkNoYW5uZWxzIGVsZW1lbnRzLgorICogXHBhcmFtIHBzeU91dENoYW5uZWwgICAgICAgICBQb2ludGVyIHRvIFBTWV9PVVRfQ0hBTk5FTCBzdHJ1Y3QgaG9sZGluZworICogbkNoYW5uZWxzIGVsZW1lbnRzLgorICogXHBhcmFtIHFjT3V0Q2hhbm5lbCAgICAgICAgICBQb2ludGVyIHRvIFFDX09VVF9DSEFOTkVMIHN0cnVjdCBob2xkaW5nCisgKiBuQ2hhbm5lbHMgZWxlbWVudHMuCiAgKiBccGFyYW0gdG9vbHNJbmZvICAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9vbHMgaW5mbyBzdHJ1Y3Qgb2YgY3VycmVudCBlbGVtZW50LgotICogXHBhcmFtIGFkalRoclN0YXRlRWxlbWVudCAgICBQb2ludGVyIHRvIEFUU19FTEVNRU5UIGhvbGRpbmcgZW5GYWNQYXRjaCBzdGF0ZXMuCisgKiBccGFyYW0gYWRqVGhyU3RhdGVFbGVtZW50ICAgIFBvaW50ZXIgdG8gQVRTX0VMRU1FTlQgaG9sZGluZyBlbkZhY1BhdGNoCisgKiBzdGF0ZXMuCiAgKiBccGFyYW0gbkNoYW5uZWxzICAgICAgICAgICAgIE51bWJlciBvZiBjaGFubmVscyBpbiBlbGVtZW50LgogICogXHBhcmFtIHVzZVBhdGNoVG9vbCAgICAgICAgICBBcHBseSB0aGUgd2VpZ2h0aW5nIHRvb2wgMCAobm8pIGVsc2UgKHllcykuCiAgKgogICogXHJldHVybiAgdm9pZAogICovCi1zdGF0aWMKLXZvaWQgRkRLYWFjRW5jX2NhbGNXZWlnaHRpbmcoUEVfREFUQSAqcGVEYXRhLAotICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICBzdHJ1Y3QgVE9PTFNJTkZPICp0b29sc0luZm8sCi0gICAgICAgICAgICAgICBBVFNfRUxFTUVOVCogYWRqVGhyU3RhdGVFbGVtZW50LAotICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscywKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCB1c2VQYXRjaFRvb2wpCi17Ci0gICAgaW50IGNoLCBub1Nob3J0V2luZG93SW5GcmFtZSA9IFRSVUU7Ci0gICAgSU5UIGV4ZVBhdGNoTSA9IDA7CitzdGF0aWMgdm9pZCBGREthYWNFbmNfY2FsY1dlaWdodGluZygKKyAgICBjb25zdCBQRV9EQVRBICpjb25zdCBwZURhdGEsCisgICAgY29uc3QgUFNZX09VVF9DSEFOTkVMICpjb25zdCBwc3lPdXRDaGFubmVsWygyKV0sCisgICAgUUNfT1VUX0NIQU5ORUwgKmNvbnN0IHFjT3V0Q2hhbm5lbFsoMildLAorICAgIGNvbnN0IHN0cnVjdCBUT09MU0lORk8gKmNvbnN0IHRvb2xzSW5mbywKKyAgICBBVFNfRUxFTUVOVCAqY29uc3QgYWRqVGhyU3RhdGVFbGVtZW50LCBjb25zdCBJTlQgbkNoYW5uZWxzLAorICAgIGNvbnN0IElOVCB1c2VQYXRjaFRvb2wpIHsKKyAgaW50IGNoLCBub1Nob3J0V2luZG93SW5GcmFtZSA9IFRSVUU7CisgIElOVCBleGVQYXRjaE0gPSAwOwogCi0gICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgaWYgKHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSB7Ci0gICAgICAgICAgICBub1Nob3J0V2luZG93SW5GcmFtZSA9IEZBTFNFOworICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBpZiAocHN5T3V0Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpIHsKKyAgICAgIG5vU2hvcnRXaW5kb3dJbkZyYW1lID0gRkFMU0U7CisgICAgfQorICAgIEZES21lbWNsZWFyKHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuRmFjTGQsCisgICAgICAgICAgICAgICAgTUFYX0dST1VQRURfU0ZCICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIH0KKworICBpZiAodXNlUGF0Y2hUb29sID09IDApIHsKKyAgICByZXR1cm47IC8qIHRvb2wgaXMgZGlzYWJsZWQgKi8KKyAgfQorCisgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworICAgIGNvbnN0IFBTWV9PVVRfQ0hBTk5FTCAqY29uc3QgcHN5T3V0Q2hhbiA9IHBzeU91dENoYW5uZWxbY2hdOworCisgICAgaWYgKG5vU2hvcnRXaW5kb3dJbkZyYW1lKSB7IC8qIHJldGFpbiBlbmVyZ3kgcmF0aW8gYmV0d2VlbiBibG9ja3Mgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGxlbmd0aCAqLworCisgICAgICBGSVhQX0RCTCBucmdTdW0xNCwgbnJnU3VtMTIsIG5yZ1N1bTM0LCBucmdUb3RhbDsKKyAgICAgIEZJWFBfREJMIG5yZ0ZhY0xkXzE0LCBucmdGYWNMZF8xMiwgbnJnRmFjTGRfMzQ7CisgICAgICBJTlQgdXNlUGF0Y2gsIGV4ZVBhdGNoOworICAgICAgaW50IHNmYiwgc2ZiR3JwLCBuTGluZXNTdW0gPSAwOworCisgICAgICBucmdTdW0xNCA9IG5yZ1N1bTEyID0gbnJnU3VtMzQgPSBucmdUb3RhbCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisKKyAgICAgIC8qIGNhbGN1bGF0ZSBmbGF0bmVzcyBvZiBhdWRpYmxlIHNwZWN0cnVtLCBpLmUuIHNwZWN0cnVtIGFib3ZlIG1hc2tpbmcKKyAgICAgICAqIHRocmVzaG9sZC4gKi8KKyAgICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsKKyAgICAgICAgICAgc2ZiR3JwICs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgeworICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgICBGSVhQX0RCTCBucmdGYWMxMiA9IENhbGNJbnZMZERhdGEoCisgICAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnAgKyBzZmJdID4+IDEpOyAvKiBucmdeKDEvMikgKi8KKyAgICAgICAgICBGSVhQX0RCTCBucmdGYWMxNCA9IENhbGNJbnZMZERhdGEoCisgICAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnAgKyBzZmJdID4+IDIpOyAvKiBucmdeKDEvNCkgKi8KKworICAgICAgICAgIC8qIG1heGltYWwgbnVtYmVyIG9mIGJhbmRzIGlzIDY0LCByZXN1bHRzIHNjYWxpbmcgZmFjdG9yIDYgKi8KKyAgICAgICAgICBuTGluZXNTdW0gKz0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNmYk5MaW5lc1tzZmJHcnAgKyBzZmJdOyAvKiByZWxldmFudCBsaW5lcyAqLworICAgICAgICAgIG5yZ1RvdGFsICs9CisgICAgICAgICAgICAgIChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwICsgc2ZiXSA+PiA2KTsgLyogc3VtIHVwIG5yZyAqLworICAgICAgICAgIG5yZ1N1bTEyICs9IChucmdGYWMxMiA+PiA2KTsgICAgICAgICAgICAgICAgICAgIC8qIHN1bSB1cCBucmdeKDIvNCkgKi8KKyAgICAgICAgICBucmdTdW0xNCArPSAobnJnRmFjMTQgPj4gNik7ICAgICAgICAgICAgICAgICAgICAvKiBzdW0gdXAgbnJnXigxLzQpICovCisgICAgICAgICAgbnJnU3VtMzQgKz0gKGZNdWx0KG5yZ0ZhYzE0LCBucmdGYWMxMikgPj4gNik7ICAgLyogc3VtIHVwIG5yZ14oMy80KSAqLwogICAgICAgICB9Ci0gICAgICAgIEZES21lbWNsZWFyKHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuRmFjTGQsIE1BWF9HUk9VUEVEX1NGQipzaXplb2YoRklYUF9EQkwpKTsKLSAgICB9CisgICAgICB9CiAKLSAgICBpZiAodXNlUGF0Y2hUb29sPT0wKSB7Ci0gICAgICAgIHJldHVybjsgLyogdG9vbCBpcyBkaXNhYmxlZCAqLwotICAgIH0KKyAgICAgIG5yZ1RvdGFsID0gQ2FsY0xkRGF0YShucmdUb3RhbCk7IC8qIGdldCBsZDY0IG9mIHRvdGFsIG5yZyAqLwogCi0gICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIG5yZ0ZhY0xkXzE0ID0KKyAgICAgICAgICBDYWxjTGREYXRhKG5yZ1N1bTE0KSAtIG5yZ1RvdGFsOyAvKiBsZDY0KG5yZ1N1bTE0L25yZ1RvdGFsKSAqLworICAgICAgbnJnRmFjTGRfMTIgPQorICAgICAgICAgIENhbGNMZERhdGEobnJnU3VtMTIpIC0gbnJnVG90YWw7IC8qIGxkNjQobnJnU3VtMTIvbnJnVG90YWwpICovCisgICAgICBucmdGYWNMZF8zNCA9CisgICAgICAgICAgQ2FsY0xkRGF0YShucmdTdW0zNCkgLSBucmdUb3RhbDsgLyogbGQ2NChucmdTdW0zNC9ucmdUb3RhbCkgKi8KIAotICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSBwc3lPdXRDaGFubmVsW2NoXTsKKyAgICAgIC8qIE5vdGU6IG5MaW5lc1N1bSBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiB0b3RhbCBsaW5lcywgdGhhdHMKKyAgICAgICAqIHRha2VuIGNhcmUgb2YgaW4gbGluZV9wZS5jcHAgRkRLYWFjRW5jX3ByZXBhcmVTZmJQZSgpICovCisgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQtPmNoYW9zTWVhc3VyZUVuRmFjW2NoXSA9CisgICAgICAgICAgZk1heChGTDJGWENPTlNUX0RCTCgwLjE4NzVmKSwKKyAgICAgICAgICAgICAgIGZEaXZOb3JtKG5MaW5lc1N1bSwgcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1twc3lPdXRDaGFuLT5zZmJDbnRdKSk7CiAKLSAgICAgICAgaWYgKG5vU2hvcnRXaW5kb3dJbkZyYW1lKSB7IC8qIHJldGFpbiBlbmVyZ3kgcmF0aW8gYmV0d2VlbiBibG9ja3Mgb2YgZGlmZmVyZW50IGxlbmd0aCAqLworICAgICAgdXNlUGF0Y2ggPSAoYWRqVGhyU3RhdGVFbGVtZW50LT5jaGFvc01lYXN1cmVFbkZhY1tjaF0gPgorICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC43ODEyNWYpKTsKKyAgICAgIGV4ZVBhdGNoID0gKCh1c2VQYXRjaCkgJiYgKGFkalRoclN0YXRlRWxlbWVudC0+bGFzdEVuRmFjUGF0Y2hbY2hdKSk7CiAKLSAgICAgICAgICAgIEZJWFBfREJMIG5yZ1N1bTE0LCBucmdTdW0xMiwgbnJnU3VtMzQsIG5yZ1RvdGFsOwotICAgICAgICAgICAgRklYUF9EQkwgbnJnRmFjTGRfMTQsIG5yZ0ZhY0xkXzEyLCBucmdGYWNMZF8zNDsKLSAgICAgICAgICAgIElOVCB1c2VQYXRjaCwgZXhlUGF0Y2g7Ci0gICAgICAgICAgICBpbnQgc2ZiLCBzZmJHcnAsIG5MaW5lc1N1bSA9IDA7CisgICAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7CisgICAgICAgICAgIHNmYkdycCArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKKyAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgICAgSU5UIHNmYkV4ZVBhdGNoOworICAgICAgICAgIC8qIGZvciBNUyBjb3VwbGVkIFNGQnMsIGFsc28gZXhlY3V0ZSBwYXRjaCBpbiBzaWRlIGNoYW5uZWwgaWYgZG9uZSBpbgorICAgICAgICAgICAqIG1pZCBjaGFubmVsICovCisgICAgICAgICAgaWYgKChjaCA9PSAxKSAmJiAodG9vbHNJbmZvLT5tc01hc2tbc2ZiR3JwICsgc2ZiXSkpIHsKKyAgICAgICAgICAgIHNmYkV4ZVBhdGNoID0gZXhlUGF0Y2hNOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZmJFeGVQYXRjaCA9IGV4ZVBhdGNoOworICAgICAgICAgIH0KIAotICAgICAgICAgICAgbnJnU3VtMTQgPSBucmdTdW0xMiA9IG5yZ1N1bTM0ID0gbnJnVG90YWwgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwotCi0gICAgICAgICAgICAvKiBjYWxjdWxhdGUgZmxhdG5lc3Mgb2YgYXVkaWJsZSBzcGVjdHJ1bSwgaS5lLiBzcGVjdHJ1bSBhYm92ZSBtYXNraW5nIHRocmVzaG9sZC4gKi8KLSAgICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgewotICAgICAgICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgICAgICAgICAgIEZJWFBfREJMIG5yZ0ZhYzEyID0gQ2FsY0ludkxkRGF0YShwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0+PjEpOyAvKiBucmdeKDEvMikgKi8KLSAgICAgICAgICAgICAgICBGSVhQX0RCTCBucmdGYWMxNCA9IENhbGNJbnZMZERhdGEocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdPj4yKTsgLyogbnJnXigxLzQpICovCi0KLSAgICAgICAgICAgICAgICAvKiBtYXhpbWFsIG51bWJlciBvZiBiYW5kcyBpcyA2NCwgcmVzdWx0cyBzY2FsaW5nIGZhY3RvciA2ICovCi0gICAgICAgICAgICAgICAgbkxpbmVzU3VtICs9IHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiTkxpbmVzW3NmYkdycCtzZmJdOyAgICAgICAgICAgICAvKiByZWxldmFudCBsaW5lcyAqLwotICAgICAgICAgICAgICAgIG5yZ1RvdGFsICArPSAoIHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXSA+PiA2ICk7ICAgICAgICAgICAgICAgICAgLyogc3VtIHVwIG5yZyAqLwotICAgICAgICAgICAgICAgIG5yZ1N1bTEyICArPSAoIG5yZ0ZhYzEyID4+IDYgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VtIHVwIG5yZ14oMi80KSAqLwotICAgICAgICAgICAgICAgIG5yZ1N1bTE0ICArPSAoIG5yZ0ZhYzE0ID4+IDYgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VtIHVwIG5yZ14oMS80KSAqLwotICAgICAgICAgICAgICAgIG5yZ1N1bTM0ICArPSAoIGZNdWx0KG5yZ0ZhYzE0LCBucmdGYWMxMikgPj4gNiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VtIHVwIG5yZ14oMy80KSAqLwotICAgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKChzZmJFeGVQYXRjaCkgJiYKKyAgICAgICAgICAgICAgKHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnAgKyBzZmJdID4gRkwyRlhDT05TVF9EQkwoMC5mKSkpIHsKKyAgICAgICAgICAgIC8qIGV4ZWN1dGUgcGF0Y2ggYmFzZWQgb24gc3BlY3RyYWwgZmxhdG5lc3MgY2FsY3VsYXRlZCBhYm92ZSAqLworICAgICAgICAgICAgaWYgKGFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlRW5GYWNbY2hdID4KKyAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjgxMjVmKSkgeworICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJFbkZhY0xkW3NmYkdycCArIHNmYl0gPQorICAgICAgICAgICAgICAgICAgKChucmdGYWNMZF8xNCArCisgICAgICAgICAgICAgICAgICAgIChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwICsgc2ZiXSArCisgICAgICAgICAgICAgICAgICAgICAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCArIHNmYl0gPj4gMSkpKSA+PgorICAgICAgICAgICAgICAgICAgIDEpOyAvKiBzZmJFbmVyZ3leKDMvNCkgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWRqVGhyU3RhdGVFbGVtZW50LT5jaGFvc01lYXN1cmVFbkZhY1tjaF0gPgorICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjc5Njg3NWYpKSB7CisgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuRmFjTGRbc2ZiR3JwICsgc2ZiXSA9CisgICAgICAgICAgICAgICAgICAoKG5yZ0ZhY0xkXzEyICsgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCArIHNmYl0pID4+CisgICAgICAgICAgICAgICAgICAgMSk7IC8qIHNmYkVuZXJneV4oMi80KSAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5GYWNMZFtzZmJHcnAgKyBzZmJdID0KKyAgICAgICAgICAgICAgICAgICgobnJnRmFjTGRfMzQgKworICAgICAgICAgICAgICAgICAgICAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCArIHNmYl0gPj4gMSkpID4+CisgICAgICAgICAgICAgICAgICAgMSk7IC8qIHNmYkVuZXJneV4oMS80KSAqLwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBucmdUb3RhbCA9IENhbGNMZERhdGEobnJnVG90YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgbGQ2NCBvZiB0b3RhbCBucmcgKi8KLQotICAgICAgICAgICAgbnJnRmFjTGRfMTQgPSBDYWxjTGREYXRhKG5yZ1N1bTE0KSAtIG5yZ1RvdGFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGQ2NChucmdTdW0xNC9ucmdUb3RhbCkgKi8KLSAgICAgICAgICAgIG5yZ0ZhY0xkXzEyID0gQ2FsY0xkRGF0YShucmdTdW0xMikgLSBucmdUb3RhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxkNjQobnJnU3VtMTIvbnJnVG90YWwpICovCi0gICAgICAgICAgICBucmdGYWNMZF8zNCA9IENhbGNMZERhdGEobnJnU3VtMzQpIC0gbnJnVG90YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZDY0KG5yZ1N1bTM0L25yZ1RvdGFsKSAqLwotCi0gICAgICAgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQtPmNoYW9zTWVhc3VyZUVuRmFjW2NoXSA9IEZES21heCggRkwyRlhDT05TVF9EQkwoMC4xODc1ZiksIGZEaXZOb3JtKG5MaW5lc1N1bSxwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3BzeU91dENoYW4tPnNmYkNudF0pICk7Ci0KLSAgICAgICAgICAgIHVzZVBhdGNoID0gKGFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlRW5GYWNbY2hdID4gRkwyRlhDT05TVF9EQkwoMC43ODEyNWYpKTsKLSAgICAgICAgICAgIGV4ZVBhdGNoID0gKCh1c2VQYXRjaCkgJiYgKGFkalRoclN0YXRlRWxlbWVudC0+bGFzdEVuRmFjUGF0Y2hbY2hdKSk7Ci0KLSAgICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgewotICAgICAgICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotCi0gICAgICAgICAgICAgICAgSU5UIHNmYkV4ZVBhdGNoOwotCi0gICAgICAgICAgICAgICAgLyogZm9yIE1TIGNvdXBsZWQgU0ZCcywgYWxzbyBleGVjdXRlIHBhdGNoIGluIHNpZGUgY2hhbm5lbCBpZiBkb25lIGluIG1pZCBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgaWYgKChjaCA9PSAxKSAmJiAodG9vbHNJbmZvLT5tc01hc2tbc2ZiR3JwK3NmYl0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNmYkV4ZVBhdGNoID0gZXhlUGF0Y2hNOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2ZiRXhlUGF0Y2ggPSBleGVQYXRjaDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIChzZmJFeGVQYXRjaCkgJiYgKHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXT5GTDJGWENPTlNUX0RCTCgwLmYpKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBleGVjdXRlIHBhdGNoIGJhc2VkIG9uIHNwZWN0cmFsIGZsYXRuZXNzIGNhbGN1bGF0ZWQgYWJvdmUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlRW5GYWNbY2hdID4gRkwyRlhDT05TVF9EQkwoMC44MTI1ZikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuRmFjTGRbc2ZiR3JwK3NmYl0gPSAoIChucmdGYWNMZF8xNCArIChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0rKHBzeU91dENoYW4tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXT4+MSkpKT4+MSApOyAvKiBzZmJFbmVyZ3leKDMvNCkgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhZGpUaHJTdGF0ZUVsZW1lbnQtPmNoYW9zTWVhc3VyZUVuRmFjW2NoXSA+IEZMMkZYQ09OU1RfREJMKDAuNzk2ODc1ZikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuRmFjTGRbc2ZiR3JwK3NmYl0gPSAoIChucmdGYWNMZF8xMiArIHBzeU91dENoYW4tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSk+PjEgKTsgICAgICAgICAgLyogc2ZiRW5lcmd5XigyLzQpICovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJFbkZhY0xkW3NmYkdycCtzZmJdID0gKCAobnJnRmFjTGRfMzQgKyAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdPj4xKSk+PjEgKTsgICAgIC8qIHNmYkVuZXJneV4oMS80KSAqLwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkVuRmFjTGRbc2ZiR3JwK3NmYl0gPSBmaXhNaW4ocWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5GYWNMZFtzZmJHcnArc2ZiXSwoRklYUF9EQkwpMCk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gLyogc2ZiIGxvb3AgKi8KLQotICAgICAgICAgICAgYWRqVGhyU3RhdGVFbGVtZW50LT5sYXN0RW5GYWNQYXRjaFtjaF0gPSB1c2VQYXRjaDsKLSAgICAgICAgICAgIGV4ZVBhdGNoTSA9IGV4ZVBhdGNoOworICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5GYWNMZFtzZmJHcnAgKyBzZmJdID0KKyAgICAgICAgICAgICAgICBmaXhNaW4ocWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5GYWNMZFtzZmJHcnAgKyBzZmJdLCAoRklYUF9EQkwpMCk7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyogIW5vU2hvcnRXaW5kb3dJbkZyYW1lICovCi0gICAgICAgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQtPmNoYW9zTWVhc3VyZUVuRmFjW2NoXSA9IEZMMkZYQ09OU1RfREJMKDAuNzVmKTsKLSAgICAgICAgICAgIGFkalRoclN0YXRlRWxlbWVudC0+bGFzdEVuRmFjUGF0Y2hbY2hdID0gVFJVRTsgLyogYWxsb3cgdXNlIG9mIHNmYkVuRmFjIHBhdGNoIGluIHVwY29taW5nIGZyYW1lICovCi0gICAgICAgIH0KKyAgICAgIH0gLyogc2ZiIGxvb3AgKi8KIAotICAgIH0gLyogY2ggbG9vcCAqLworICAgICAgYWRqVGhyU3RhdGVFbGVtZW50LT5sYXN0RW5GYWNQYXRjaFtjaF0gPSB1c2VQYXRjaDsKKyAgICAgIGV4ZVBhdGNoTSA9IGV4ZVBhdGNoOworICAgIH0gZWxzZSB7CisgICAgICAvKiAhbm9TaG9ydFdpbmRvd0luRnJhbWUgKi8KKyAgICAgIGFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlRW5GYWNbY2hdID0gRkwyRlhDT05TVF9EQkwoMC43NWYpOworICAgICAgYWRqVGhyU3RhdGVFbGVtZW50LT5sYXN0RW5GYWNQYXRjaFtjaF0gPQorICAgICAgICAgIFRSVUU7IC8qIGFsbG93IHVzZSBvZiBzZmJFbkZhYyBwYXRjaCBpbiB1cGNvbWluZyBmcmFtZSAqLworICAgIH0KIAorICB9IC8qIGNoIGxvb3AgKi8KIH0KIAotCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jYWxjUGUKIGRlc2NyaXB0aW9uOiAgY2FsY3VsYXRlIHBlIGZvciBib3RoIGNoYW5uZWxzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYwotdm9pZCBGREthYWNFbmNfY2FsY1BlKFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildLAotICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHFjT3V0Q2hhbm5lbFsoMildLAotICAgICAgICAgICAgUEVfREFUQSAqcGVEYXRhLAotICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscykKLXsKLSAgIElOVCBjaDsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jYWxjUGUoY29uc3QgUFNZX09VVF9DSEFOTkVMICpjb25zdCBwc3lPdXRDaGFubmVsWygyKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFDX09VVF9DSEFOTkVMICpjb25zdCBxY091dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVfREFUQSAqY29uc3QgcGVEYXRhLCBjb25zdCBJTlQgbkNoYW5uZWxzKSB7CisgIElOVCBjaDsKIAotICAgcGVEYXRhLT5wZSA9IHBlRGF0YS0+b2Zmc2V0OwotICAgcGVEYXRhLT5jb25zdFBhcnQgPSAwOwotICAgcGVEYXRhLT5uQWN0aXZlTGluZXMgPSAwOwotICAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgICAgUEVfQ0hBTk5FTF9EQVRBICpwZUNoYW5EYXRhID0gJnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF07Ci0gICAgICBGREthYWNFbmNfY2FsY1NmYlBlKCZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLAotICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhLAotICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YSwKLSAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250LAotICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPmlzQm9vaywKLSAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+aXNTY2FsZSk7CisgIHBlRGF0YS0+cGUgPSBwZURhdGEtPm9mZnNldDsKKyAgcGVEYXRhLT5jb25zdFBhcnQgPSAwOworICBwZURhdGEtPm5BY3RpdmVMaW5lcyA9IDA7CisgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworICAgIFBFX0NIQU5ORUxfREFUQSAqcGVDaGFuRGF0YSA9ICZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdOwogCi0gICAgICBwZURhdGEtPnBlICs9IHBlQ2hhbkRhdGEtPnBlOwotICAgICAgcGVEYXRhLT5jb25zdFBhcnQgKz0gcGVDaGFuRGF0YS0+Y29uc3RQYXJ0OwotICAgICAgcGVEYXRhLT5uQWN0aXZlTGluZXMgKz0gcGVDaGFuRGF0YS0+bkFjdGl2ZUxpbmVzOwotICAgfQorICAgIEZES2FhY0VuY19jYWxjU2ZiUGUoCisgICAgICAgIHBlQ2hhbkRhdGEsIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhLAorICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGEsIHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQsCisgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCwgcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwLAorICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+aXNCb29rLCBwc3lPdXRDaGFubmVsW2NoXS0+aXNTY2FsZSk7CisKKyAgICBwZURhdGEtPnBlICs9IHBlQ2hhbkRhdGEtPnBlOworICAgIHBlRGF0YS0+Y29uc3RQYXJ0ICs9IHBlQ2hhbkRhdGEtPmNvbnN0UGFydDsKKyAgICBwZURhdGEtPm5BY3RpdmVMaW5lcyArPSBwZUNoYW5EYXRhLT5uQWN0aXZlTGluZXM7CisgIH0KIH0KIAotdm9pZCBGREthYWNFbmNfcGVDYWxjdWxhdGlvbihQRV9EQVRBICpwZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBUT09MU0lORk8gKnRvb2xzSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQqIGFkalRoclN0YXRlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscykKLXsKK3ZvaWQgRkRLYWFjRW5jX3BlQ2FsY3VsYXRpb24oUEVfREFUQSAqY29uc3QgcGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU1lfT1VUX0NIQU5ORUwgKmNvbnN0IHBzeU91dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgKmNvbnN0IHFjT3V0Q2hhbm5lbFsoMildLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgVE9PTFNJTkZPICpjb25zdCB0b29sc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU19FTEVNRU5UICpjb25zdCBhZGpUaHJTdGF0ZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMpIHsKICAgLyogY29uc3RhbnRzIHRoYXQgd2lsbCBub3QgY2hhbmdlIGR1cmluZyBzdWNjZXNzaXZlIHBlIGNhbGN1bGF0aW9ucyAqLwotICBGREthYWNFbmNfcHJlcGFyZVBlKHBlRGF0YSwgcHN5T3V0Q2hhbm5lbCwgcWNPdXRDaGFubmVsLCBuQ2hhbm5lbHMsIGFkalRoclN0YXRlRWxlbWVudC0+cGVPZmZzZXQpOworICBGREthYWNFbmNfcHJlcGFyZVBlKHBlRGF0YSwgcHN5T3V0Q2hhbm5lbCwgcWNPdXRDaGFubmVsLCBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgYWRqVGhyU3RhdGVFbGVtZW50LT5wZU9mZnNldCk7CiAKICAgLyogY2FsY3VsYXRlIHdlaWdodGluZyBmYWN0b3IgZm9yIHRocmVzaG9sZCBhZGp1c3RtZW50ICovCi0gIEZES2FhY0VuY19jYWxjV2VpZ2h0aW5nKHBlRGF0YSwgcHN5T3V0Q2hhbm5lbCwgcWNPdXRDaGFubmVsLCB0b29sc0luZm8sIGFkalRoclN0YXRlRWxlbWVudCwgbkNoYW5uZWxzLCAxKTsKLXsKKyAgRkRLYWFjRW5jX2NhbGNXZWlnaHRpbmcocGVEYXRhLCBwc3lPdXRDaGFubmVsLCBxY091dENoYW5uZWwsIHRvb2xzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqVGhyU3RhdGVFbGVtZW50LCBuQ2hhbm5lbHMsIDEpOworICB7CiAgICAgLyogbm8gd2VpZ2h0aW5nIG9mIHRocmVob2xkcyBhbmQgZW5lcmdpZXMgZm9yIG1sb3V0ICovCiAgICAgLyogd2VpZ2h0IGVuZXJnaWVzIGFuZCB0aHJlc2hvbGRzICovCiAgICAgaW50IGNoOwotICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgICBpbnQgc2ZiLCBzZmJHcnA7CisgICAgICBRQ19PVVRfQ0hBTk5FTCAqcFFjT3V0Q2ggPSBxY091dENoYW5uZWxbY2hdOwogCi0gICAgICAgIGludCBzZmIsIHNmYkdycDsKLSAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHBRY091dENoID0gcWNPdXRDaGFubmVsW2NoXTsKLQotICAgICAgICBmb3IgKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKLSAgICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgICAgICAgcFFjT3V0Q2gtPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYitzZmJHcnBdID0gcFFjT3V0Q2gtPnNmYkVuZXJneUxkRGF0YVtzZmIrc2ZiR3JwXSAtIHBRY091dENoLT5zZmJFbkZhY0xkW3NmYitzZmJHcnBdOwotICAgICAgICAgICAgcFFjT3V0Q2gtPnNmYlRocmVzaG9sZExkRGF0YVtzZmIrc2ZiR3JwXSAgICAgLT0gcFFjT3V0Q2gtPnNmYkVuRmFjTGRbc2ZiK3NmYkdycF07Ci0gICAgICAgICAgfQorICAgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OworICAgICAgICAgICBzZmJHcnAgKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7CisgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICAgIHBRY091dENoLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmIgKyBzZmJHcnBdID0KKyAgICAgICAgICAgICAgcFFjT3V0Q2gtPnNmYkVuZXJneUxkRGF0YVtzZmIgKyBzZmJHcnBdIC0KKyAgICAgICAgICAgICAgcFFjT3V0Q2gtPnNmYkVuRmFjTGRbc2ZiICsgc2ZiR3JwXTsKKyAgICAgICAgICBwUWNPdXRDaC0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYiArIHNmYkdycF0gLT0KKyAgICAgICAgICAgICAgcFFjT3V0Q2gtPnNmYkVuRmFjTGRbc2ZiICsgc2ZiR3JwXTsKICAgICAgICAgfQorICAgICAgfQogICAgIH0KLX0KKyAgfQogCiAgIC8qIHBlIHdpdGhvdXQgcmVkdWN0aW9uICovCiAgIEZES2FhY0VuY19jYWxjUGUocHN5T3V0Q2hhbm5lbCwgcWNPdXRDaGFubmVsLCBwZURhdGEsIG5DaGFubmVscyk7CiB9CiAKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0ZES2FhY0VuY19jYWxjUGVOb0FICiBkZXNjcmlwdGlvbjogIHN1bSB0aGUgcGUgZGF0YSBvbmx5IGZvciBiYW5kcyB3aGVyZSBhdm9pZCBob2xlIGlzIGluYWN0aXZlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19GREthYWNFbmNfY2FsY1BlTm9BSChJTlQgKnBlLAotICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmNvbnN0UGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICpuQWN0aXZlTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIFBFX0RBVEEgKnBlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgYWhGbGFnWygyKV1bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMpCi17Ci0gICAgSU5UIGNoLCBzZmIsc2ZiR3JwOworI2RlZmluZSBDT05TVFBBUlRfSEVBRFJPT00gNAorc3RhdGljIHZvaWQgRkRLYWFjRW5jX0ZES2FhY0VuY19jYWxjUGVOb0FIKAorICAgIElOVCAqY29uc3QgcGUsIElOVCAqY29uc3QgY29uc3RQYXJ0LCBJTlQgKmNvbnN0IG5BY3RpdmVMaW5lcywKKyAgICBjb25zdCBQRV9EQVRBICpjb25zdCBwZURhdGEsIGNvbnN0IFVDSEFSIGFoRmxhZ1soMildW01BWF9HUk9VUEVEX1NGQl0sCisgICAgY29uc3QgUFNZX09VVF9DSEFOTkVMICpjb25zdCBwc3lPdXRDaGFubmVsWygyKV0sIGNvbnN0IElOVCBuQ2hhbm5lbHMpIHsKKyAgSU5UIGNoLCBzZmIsIHNmYkdycDsKIAotICAgIElOVCBwZV90bXAgPSBwZURhdGEtPm9mZnNldDsKLSAgICBJTlQgY29uc3RQYXJ0X3RtcCA9IDA7Ci0gICAgSU5UIG5BY3RpdmVMaW5lc190bXAgPSAwOwotICAgIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgUEVfQ0hBTk5FTF9EQVRBICpwZUNoYW5EYXRhID0gJnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF07Ci0gICAgICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKXsKLSAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgICAgICAgICAgaWYoYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSA8IEFIX0FDVElWRSkgewotICAgICAgICAgICAgICAgICAgICBwZV90bXAgKz0gcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl07Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0UGFydF90bXAgKz0gcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdOwotICAgICAgICAgICAgICAgICAgICBuQWN0aXZlTGluZXNfdG1wICs9IHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgIElOVCBwZV90bXAgPSBwZURhdGEtPm9mZnNldDsKKyAgSU5UIGNvbnN0UGFydF90bXAgPSAwOworICBJTlQgbkFjdGl2ZUxpbmVzX3RtcCA9IDA7CisgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworICAgIGNvbnN0IFBFX0NIQU5ORUxfREFUQSAqY29uc3QgcGVDaGFuRGF0YSA9ICZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdOworICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsKKyAgICAgICAgIHNmYkdycCArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKKyAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICBpZiAoYWhGbGFnW2NoXVtzZmJHcnAgKyBzZmJdIDwgQUhfQUNUSVZFKSB7CisgICAgICAgICAgcGVfdG1wICs9IHBlQ2hhbkRhdGEtPnNmYlBlW3NmYkdycCArIHNmYl07CisgICAgICAgICAgY29uc3RQYXJ0X3RtcCArPQorICAgICAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJDb25zdFBhcnRbc2ZiR3JwICsgc2ZiXSA+PiBDT05TVFBBUlRfSEVBRFJPT007CisgICAgICAgICAgbkFjdGl2ZUxpbmVzX3RtcCArPSBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwICsgc2ZiXTsKICAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICAvKiBjb3JyZWN0IHNjYWxlZCBwZSBhbmQgY29uc3RQYXJ0IHZhbHVlcyAqLwotICAgICpwZSA9IHBlX3RtcCA+PiBQRV9DT05TVFBBUlRfU0hJRlQ7Ci0gICAgKmNvbnN0UGFydCA9IGNvbnN0UGFydF90bXAgPj4gUEVfQ09OU1RQQVJUX1NISUZUOworICB9CisgIC8qIGNvcnJlY3Qgc2NhbGVkIHBlIGFuZCBjb25zdFBhcnQgdmFsdWVzICovCisgICpwZSA9IHBlX3RtcCA+PiBQRV9DT05TVFBBUlRfU0hJRlQ7CisgICpjb25zdFBhcnQgPSBjb25zdFBhcnRfdG1wID4+IChQRV9DT05TVFBBUlRfU0hJRlQgLSBDT05TVFBBUlRfSEVBRFJPT00pOwogCi0JKm5BY3RpdmVMaW5lcyA9IG5BY3RpdmVMaW5lc190bXA7CisgICpuQWN0aXZlTGluZXMgPSBuQWN0aXZlTGluZXNfdG1wOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc0NCUgogZGVzY3JpcHRpb246ICBhcHBseSByZWR1Y3Rpb24gZm9ybXVsYQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgbGltaXRUaHJSZWR1Y2VkTGREYXRhID0gKEZJWFBfREJMKTB4MDAwMDgwMDA7IC8qRkwyRlhDT05TVF9EQkwoRkRLcG93KDIuMCwtTERfREFUQV9TQ0FMSU5HLzQuMCkpOyovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgbGltaXRUaHJSZWR1Y2VkTGREYXRhID0KKyAgICAoRklYUF9EQkwpMHgwMDAwODAwMDsgLypGTDJGWENPTlNUX0RCTChGREtwb3coMi4wLC1MRF9EQVRBX1NDQUxJTkcvNC4wKSk7Ki8KIAotc3RhdGljIHZvaWQgRkRLYWFjRW5jX3JlZHVjZVRocmVzaG9sZHNDQlIoUUNfT1VUX0NIQU5ORUwqICBxY091dENoYW5uZWxbKDIpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFoRmxhZ1soMildW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHRockV4cFsoMildW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIHJlZFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NIQVIgcmVkVmFsU2NhbGluZykKLXsKLSAgIElOVCBjaCwgc2ZiLCBzZmJHcnA7Ci0gICBGSVhQX0RCTCBzZmJFbkxkRGF0YSwgc2ZiVGhyTGREYXRhLCBzZmJUaHJSZWR1Y2VkTGREYXRhOwotICAgRklYUF9EQkwgc2ZiVGhyRXhwOworc3RhdGljIHZvaWQgRkRLYWFjRW5jX3JlZHVjZVRocmVzaG9sZHNDQlIoCisgICAgUUNfT1VUX0NIQU5ORUwgKmNvbnN0IHFjT3V0Q2hhbm5lbFsoMildLAorICAgIGNvbnN0IFBTWV9PVVRfQ0hBTk5FTCAqY29uc3QgcHN5T3V0Q2hhbm5lbFsoMildLAorICAgIFVDSEFSIGFoRmxhZ1soMildW01BWF9HUk9VUEVEX1NGQl0sCisgICAgY29uc3QgRklYUF9EQkwgdGhyRXhwWygyKV1bTUFYX0dST1VQRURfU0ZCXSwgY29uc3QgSU5UIG5DaGFubmVscywKKyAgICBjb25zdCBGSVhQX0RCTCByZWRWYWxfbSwgY29uc3QgU0NIQVIgcmVkVmFsX2UpIHsKKyAgSU5UIGNoLCBzZmIsIHNmYkdycDsKKyAgRklYUF9EQkwgc2ZiRW5MZERhdGEsIHNmYlRockxkRGF0YSwgc2ZiVGhyUmVkdWNlZExkRGF0YTsKKyAgRklYUF9EQkwgc2ZiVGhyRXhwOwogCi0gICAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgICAgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbiA9IHFjT3V0Q2hhbm5lbFtjaF07Ci0gICAgICBmb3Ioc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsgc2ZiR3JwKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKXsKLSAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgICAgIHNmYkVuTGREYXRhICA9IHFjT3V0Q2hhbi0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl07Ci0gICAgICAgICBzZmJUaHJMZERhdGEgPSBxY091dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXTsKLSAgICAgICAgIHNmYlRockV4cCAgICA9IHRockV4cFtjaF1bc2ZiR3JwK3NmYl07Ci0gICAgICAgICBpZiAoKHNmYkVuTGREYXRhID4gc2ZiVGhyTGREYXRhKSAmJiAoYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSAhPSBBSF9BQ1RJVkUpKSB7CisgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworICAgIFFDX09VVF9DSEFOTkVMICpxY091dENoYW4gPSBxY091dENoYW5uZWxbY2hdOworICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsKKyAgICAgICAgIHNmYkdycCArPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKKyAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICBzZmJFbkxkRGF0YSA9IHFjT3V0Q2hhbi0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwICsgc2ZiXTsKKyAgICAgICAgc2ZiVGhyTGREYXRhID0gcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwICsgc2ZiXTsKKyAgICAgICAgc2ZiVGhyRXhwID0gdGhyRXhwW2NoXVtzZmJHcnAgKyBzZmJdOworICAgICAgICBpZiAoKHNmYkVuTGREYXRhID4gc2ZiVGhyTGREYXRhKSAmJgorICAgICAgICAgICAgKGFoRmxhZ1tjaF1bc2ZiR3JwICsgc2ZiXSAhPSBBSF9BQ1RJVkUpKSB7CisgICAgICAgICAgLyogdGhyZXNob2xkIHJlZHVjdGlvbiBmb3JtdWxhOgorICAgICAgICAgICBmbG9hdCB0bXAgPSB0aHJFeHBbY2hdW3NmYl0rcmVkVmFsOworICAgICAgICAgICB0bXAgKj0gdG1wOworICAgICAgICAgICBzZmJUaHJSZWR1Y2VkID0gdG1wKnRtcDsKKyAgICAgICAgICAqLworICAgICAgICAgIGludCBtaW5TY2FsZSA9IGZpeE1pbihDb3VudExlYWRpbmdCaXRzKHNmYlRockV4cCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50TGVhZGluZ0JpdHMocmVkVmFsX20pIC0gcmVkVmFsX2UpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAxOwogCi0gICAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVkdWN0aW9uIGZvcm11bGE6Ci0gICAgICAgICAgICAgZmxvYXQgdG1wID0gdGhyRXhwW2NoXVtzZmJdK3JlZFZhbDsKLSAgICAgICAgICAgICB0bXAgKj0gdG1wOwotICAgICAgICAgICAgIHNmYlRoclJlZHVjZWQgPSB0bXAqdG1wOwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGludCBtaW5TY2FsZSA9IGZpeE1pbihDb3VudExlYWRpbmdCaXRzKHNmYlRockV4cCksIENvdW50TGVhZGluZ0JpdHMocmVkVmFsKSAtIChERlJBQ1RfQklUUy0xLXJlZFZhbFNjYWxpbmcpICktMTsKKyAgICAgICAgICAvKiA0KmxvZyggc2ZiVGhyRXhwICsgcmVkVmFsICkgKi8KKyAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0KKyAgICAgICAgICAgICAgQ2FsY0xkRGF0YShmQWJzKHNjYWxlVmFsdWUoc2ZiVGhyRXhwLCBtaW5TY2FsZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShyZWRWYWxfbSwgcmVkVmFsX2UgKyBtaW5TY2FsZSkpKSAtCisgICAgICAgICAgICAgIChGSVhQX0RCTCkobWluU2NhbGUgPDwgKERGUkFDVF9CSVRTIC0gMSAtIExEX0RBVEFfU0hJRlQpKTsKKyAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhIDw8PSAyOwogCi0gICAgICAgICAgICAvKiA0KmxvZyggc2ZiVGhyRXhwICsgcmVkVmFsICkgKi8KLSAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBDYWxjTGREYXRhKGZBYnMoc2NhbGVWYWx1ZShzZmJUaHJFeHAsIG1pblNjYWxlKSArIHNjYWxlVmFsdWUocmVkVmFsLChERlJBQ1RfQklUUy0xLXJlZFZhbFNjYWxpbmcpK21pblNjYWxlKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIChGSVhQX0RCTCkobWluU2NhbGU8PChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQpKTsKLSAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPDw9IDI7CisgICAgICAgICAgLyogYXZvaWQgaG9sZXMgKi8KKyAgICAgICAgICBpZiAoKHNmYlRoclJlZHVjZWRMZERhdGEgPgorICAgICAgICAgICAgICAgKHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCArIHNmYl0gKyBzZmJFbkxkRGF0YSkpICYmCisgICAgICAgICAgICAgIChhaEZsYWdbY2hdW3NmYkdycCArIHNmYl0gIT0gTk9fQUgpKSB7CisgICAgICAgICAgICBpZiAocWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSA+CisgICAgICAgICAgICAgICAgKEZMMkZYQ09OU1RfREJMKC0xLjBmKSAtIHNmYkVuTGREYXRhKSkgeworICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gZml4TWF4KAorICAgICAgICAgICAgICAgICAgKHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCArIHNmYl0gKyBzZmJFbkxkRGF0YSksCisgICAgICAgICAgICAgICAgICBzZmJUaHJMZERhdGEpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBzZmJUaHJMZERhdGE7CisgICAgICAgICAgICBhaEZsYWdbY2hdW3NmYkdycCArIHNmYl0gPSBBSF9BQ1RJVkU7CisgICAgICAgICAgfQogCi0gICAgICAgICAgICAvKiBhdm9pZCBob2xlcyAqLwotICAgICAgICAgICAgaWYgKCAoKHNmYlRoclJlZHVjZWRMZERhdGEgLSBzZmJFbkxkRGF0YSkgPiBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSApCi0gICAgICAgICAgICAgICAgICAgICYmIChhaEZsYWdbY2hdW3NmYkdycCtzZmJdICE9IE5PX0FIKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSAgPiAoRkwyRlhDT05TVF9EQkwoLTEuMGYpIC0gc2ZiRW5MZERhdGEpICl7Ci0gICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IGZpeE1heCgocWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gKyBzZmJFbkxkRGF0YSksIHNmYlRockxkRGF0YSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBzZmJUaHJSZWR1Y2VkTGREYXRhID0gc2ZiVGhyTGREYXRhOwotICAgICAgICAgICAgICBhaEZsYWdbY2hdW3NmYkdycCtzZmJdID0gQUhfQUNUSVZFOwotICAgICAgICAgICAgfQorICAgICAgICAgIC8qIG1pbmltdW0gb2YgMjkgZEIgUmF0aW8gZm9yIFRocmVzaG9sZHMgKi8KKyAgICAgICAgICBpZiAoKHNmYkVuTGREYXRhICsgKEZJWFBfREJMKU1BWFZBTF9EQkwpID4KKyAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoOS42MzM2MjA2IC8gTERfREFUQV9TQ0FMSU5HKSkgeworICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IGZpeE1heCgKKyAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhLAorICAgICAgICAgICAgICAgIChzZmJFbkxkRGF0YSAtIEZMMkZYQ09OU1RfREJMKDkuNjMzNjIwNiAvIExEX0RBVEFfU0NBTElORykpKTsKKyAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8qIG1pbmltdW0gb2YgMjkgZEIgUmF0aW8gZm9yIFRocmVzaG9sZHMgKi8KLSAgICAgICAgICAgIGlmICgoc2ZiRW5MZERhdGErKEZJWFBfREJMKU1BWFZBTF9EQkwpID4gRkwyRlhDT05TVF9EQkwoOS42MzM2MjA2L0xEX0RBVEFfU0NBTElORykpewotICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBmaXhNYXgoc2ZiVGhyUmVkdWNlZExkRGF0YSwgKHNmYkVuTGREYXRhIC0gRkwyRlhDT05TVF9EQkwoOS42MzM2MjA2L0xEX0RBVEFfU0NBTElORykpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0gPSBzZmJUaHJSZWR1Y2VkTGREYXRhOwotICAgICAgICAgfQorICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCArIHNmYl0gPSBzZmJUaHJSZWR1Y2VkTGREYXRhOwogICAgICAgICB9CiAgICAgICB9Ci0gICB9CisgICAgfQorICB9CiB9CiAKIC8qIHNpbWlsYXIgdG8gcHJlcGFyZVNmYlBlMSgpICovCi1zdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX2NhbGNDaGFvc01lYXN1cmUoUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICpzZmJGb3JtRmFjdG9yTGREYXRhKQotewotICAjZGVmaW5lIFNDQUxFX0ZPUk1fRkFDICAgICAoNCkgICAgLyogKFNDQUxFX0ZPUk1fRkFDK0ZPUk1fRkFDX1NISUZUKSA+PSBsZChGUkFNRV9MRU5HVEgpKi8KLSAgI2RlZmluZSBTQ0FMRV9OUkdTICAgICAgICAgKDgpCi0gICNkZWZpbmUgU0NBTEVfTkxJTkVTICAgICAgKDE2KQotICAjZGVmaW5lIFNDQUxFX05SR1NfU1FSVDQgICAoMikgICAgLyogMC4yNSAqIFNDQUxFX05SR1MgKi8KLSAgI2RlZmluZSBTQ0FMRV9OTElORVNfUDM0ICAoMTIpICAgIC8qIDAuNzUgKiBTQ0FMRV9OTElORVMgKi8KK3N0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfY2FsY0NoYW9zTWVhc3VyZSgKKyAgICBjb25zdCBQU1lfT1VUX0NIQU5ORUwgKmNvbnN0IHBzeU91dENoYW5uZWwsCisgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHNmYkZvcm1GYWN0b3JMZERhdGEpIHsKKyNkZWZpbmUgU0NBTEVfRk9STV9GQUMgXAorICAoNCkgLyogKFNDQUxFX0ZPUk1fRkFDK0ZPUk1fRkFDX1NISUZUKSA+PSBsZChGUkFNRV9MRU5HVEgpKi8KKyNkZWZpbmUgU0NBTEVfTlJHUyAoOCkKKyNkZWZpbmUgU0NBTEVfTkxJTkVTICgxNikKKyNkZWZpbmUgU0NBTEVfTlJHU19TUVJUNCAoMikgIC8qIDAuMjUgKiBTQ0FMRV9OUkdTICovCisjZGVmaW5lIFNDQUxFX05MSU5FU19QMzQgKDEyKSAvKiAwLjc1ICogU0NBTEVfTkxJTkVTICovCiAKLSAgSU5UICAgc2ZiR3JwLCBzZmI7CisgIElOVCBzZmJHcnAsIHNmYjsKICAgRklYUF9EQkwgY2hhb3NNZWFzdXJlOwogICBJTlQgZnJhbWVOTGluZXMgPSAwOwogICBGSVhQX0RCTCBmcmFtZUZvcm1GYWN0b3IgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogICBGSVhQX0RCTCBmcmFtZUVuZXJneSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAKLSAgZm9yIChzZmJHcnA9MDsgc2ZiR3JwPHBzeU91dENoYW5uZWwtPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFubmVsLT5zZmJQZXJHcm91cCkgewotICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFubmVsLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspewotICAgICAgaWYgKHBzeU91dENoYW5uZWwtPnNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSA+IHBzeU91dENoYW5uZWwtPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSkgewotICAgICAgICBmcmFtZUZvcm1GYWN0b3IgKz0gKENhbGNJbnZMZERhdGEoc2ZiRm9ybUZhY3RvckxkRGF0YVtzZmJHcnArc2ZiXSk+PlNDQUxFX0ZPUk1fRkFDKTsKLSAgICAgICAgZnJhbWVOTGluZXMgICAgICs9IChwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYkdycCtzZmIrMV0gLSBwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYkdycCtzZmJdKTsKLSAgICAgICAgZnJhbWVFbmVyZ3kgICAgICs9IChwc3lPdXRDaGFubmVsLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0+PlNDQUxFX05SR1MpOworICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeU91dENoYW5uZWwtPnNmYkNudDsKKyAgICAgICBzZmJHcnAgKz0gcHN5T3V0Q2hhbm5lbC0+c2ZiUGVyR3JvdXApIHsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeU91dENoYW5uZWwtPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgaWYgKHBzeU91dENoYW5uZWwtPnNmYkVuZXJneUxkRGF0YVtzZmJHcnAgKyBzZmJdID4KKyAgICAgICAgICBwc3lPdXRDaGFubmVsLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwICsgc2ZiXSkgeworICAgICAgICBmcmFtZUZvcm1GYWN0b3IgKz0gKENhbGNJbnZMZERhdGEoc2ZiRm9ybUZhY3RvckxkRGF0YVtzZmJHcnAgKyBzZmJdKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0ZPUk1fRkFDKTsKKyAgICAgICAgZnJhbWVOTGluZXMgKz0gKHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiR3JwICsgc2ZiICsgMV0gLQorICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJHcnAgKyBzZmJdKTsKKyAgICAgICAgZnJhbWVFbmVyZ3kgKz0gKHBzeU91dENoYW5uZWwtPnNmYkVuZXJneVtzZmJHcnAgKyBzZmJdID4+IFNDQUxFX05SR1MpOwogICAgICAgfQogICAgIH0KICAgfQogCi0gIGlmKGZyYW1lTkxpbmVzID4gMCl7Ci0KLSAgICAvKiAgZnJhbWVOQWN0aXZlTGluZXMgPSBmcmFtZUZvcm1GYWN0b3IqMl5GT1JNX0ZBQ19TSElGVCAqICgoZnJhbWVFbmVyZ3kgKjJeU0NBTEVfTlJHUykvZnJhbWVOTGluZXMpXi0wLjI1Ci0gICAgICAgIGNoYW9zTWVhc3VyZSAgICAgID0gZnJhbWVOQWN0aXZlTGluZXMgLyBmcmFtZU5MaW5lcyAqLwotICAgIGNoYW9zTWVhc3VyZSA9Ci0gICAgICAgICAgIENhbGNJbnZMZERhdGEoICgoKENhbGNMZERhdGEoZnJhbWVGb3JtRmFjdG9yKT4+MSkgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDYWxjTGREYXRhKGZyYW1lRW5lcmd5KT4+KDIrMSkpKSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzVmKSxDYWxjTGREYXRhKChGSVhQX0RCTClmcmFtZU5MaW5lczw8KERGUkFDVF9CSVRTLTEtU0NBTEVfTkxJTkVTKSkpIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChGSVhQX0RCTCkoLSgoLVNDQUxFX0ZPUk1fRkFDK1NDQUxFX05SR1NfU1FSVDQtRk9STV9GQUNfU0hJRlQrU0NBTEVfTkxJTkVTX1AzNCkgPDwgKERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCkpKSk+PjEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICApPDwxICk7CisgIGlmIChmcmFtZU5MaW5lcyA+IDApIHsKKyAgICAvKiAgZnJhbWVOQWN0aXZlTGluZXMgPSBmcmFtZUZvcm1GYWN0b3IqMl5GT1JNX0ZBQ19TSElGVCAqICgoZnJhbWVFbmVyZ3kKKyAgICAgICAqMl5TQ0FMRV9OUkdTKS9mcmFtZU5MaW5lcyleLTAuMjUgY2hhb3NNZWFzdXJlICAgICAgPSBmcmFtZU5BY3RpdmVMaW5lcyAvCisgICAgICAgZnJhbWVOTGluZXMgKi8KKyAgICBjaGFvc01lYXN1cmUgPSBDYWxjSW52TGREYXRhKAorICAgICAgICAoKChDYWxjTGREYXRhKGZyYW1lRm9ybUZhY3RvcikgPj4gMSkgLQorICAgICAgICAgIChDYWxjTGREYXRhKGZyYW1lRW5lcmd5KSA+PiAoMiArIDEpKSkgLQorICAgICAgICAgKGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjc1ZiksCisgICAgICAgICAgICAgICAgICAgIENhbGNMZERhdGEoKEZJWFBfREJMKWZyYW1lTkxpbmVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKERGUkFDVF9CSVRTIC0gMSAtIFNDQUxFX05MSU5FUykpKSAtCisgICAgICAgICAgKCgoRklYUF9EQkwpKC0oKC1TQ0FMRV9GT1JNX0ZBQyArIFNDQUxFX05SR1NfU1FSVDQgLSBGT1JNX0ZBQ19TSElGVCArCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX05MSU5FU19QMzQpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKERGUkFDVF9CSVRTIC0gMSAtIExEX0RBVEFfU0hJRlQpKSkpID4+CisgICAgICAgICAgIDEpKSkKKyAgICAgICAgPDwgMSk7CiAgIH0gZWxzZSB7Ci0KICAgICAvKiBhc3N1bWluZyB0b3RhbCBjaGFvcywgaWYgbm8gc2ZiIGlzIGFib3ZlIHRocmVzaG9sZHMgKi8KICAgICBjaGFvc01lYXN1cmUgPSBGTDJGWENPTlNUX0RCTCgxLmYpOwogICB9CkBAIC05NzAsNDcgKzExMDcsNDYgQEAKIH0KIAogLyogYXBwbHkgcmVkdWN0aW9uIGZvcm11bGEgZm9yIFZCUi1tb2RlICovCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc1ZCUihRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBhaEZsYWdbKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCB0aHJFeHBbKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgdmJyUXVhbEZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqIGNoYW9zTWVhc3VyZU9sZCkKLXsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19yZWR1Y2VUaHJlc2hvbGRzVkJSKAorICAgIFFDX09VVF9DSEFOTkVMICpjb25zdCBxY091dENoYW5uZWxbKDIpXSwKKyAgICBjb25zdCBQU1lfT1VUX0NIQU5ORUwgKmNvbnN0IHBzeU91dENoYW5uZWxbKDIpXSwKKyAgICBVQ0hBUiBhaEZsYWdbKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgIGNvbnN0IEZJWFBfREJMIHRockV4cFsoMildW01BWF9HUk9VUEVEX1NGQl0sIGNvbnN0IElOVCBuQ2hhbm5lbHMsCisgICAgY29uc3QgRklYUF9EQkwgdmJyUXVhbEZhY3RvciwgRklYUF9EQkwgKmNvbnN0IGNoYW9zTWVhc3VyZU9sZCkgewogICBJTlQgY2gsIHNmYkdycCwgc2ZiOwotICBGSVhQX0RCTCBjaEdyb3VwRW5lcmd5W1RSQU5TX0ZBQ11bMl07LyplbmVyZ3kgZm9yIGVhY2ggZ3JvdXAgYW5kIGNoYW5uZWwqLworICBGSVhQX0RCTCBjaEdyb3VwRW5lcmd5W1RSQU5TX0ZBQ11bMl07IC8qZW5lcmd5IGZvciBlYWNoIGdyb3VwIGFuZCBjaGFubmVsKi8KICAgRklYUF9EQkwgY2hDaGFvc01lYXN1cmVbMl07CiAgIEZJWFBfREJMIGZyYW1lRW5lcmd5ID0gRkwyRlhDT05TVF9EQkwoMWUtMTBmKTsKICAgRklYUF9EQkwgY2hhb3NNZWFzdXJlID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKICAgRklYUF9EQkwgc2ZiRW5MZERhdGEsIHNmYlRockxkRGF0YSwgc2ZiVGhyRXhwOwogICBGSVhQX0RCTCBzZmJUaHJSZWR1Y2VkTGREYXRhOwogICBGSVhQX0RCTCBjaGFvc01lYXN1cmVBdmc7Ci0gIElOVCBncm91cENudDsgLyogbG9vcCBjb3VudGVyICovCi0gIEZJWFBfREJMIHJlZFZhbFtUUkFOU19GQUNdOyAvKiByZWR1Y3Rpb24gdmFsdWVzOyBpbiBzaG9ydC1ibG9jayBjYXNlIG9uZSByZWRWYWwgZm9yIGVhY2ggZ3JvdXAgKi8KLSAgUUNfT1VUX0NIQU5ORUwgICpxY091dENoYW4gID0gTlVMTDsKLSAgUFNZX09VVF9DSEFOTkVMICAqcHN5T3V0Q2hhbiAgPSBOVUxMOworICBJTlQgZ3JvdXBDbnQ7ICAgICAgICAgICAgICAgLyogbG9vcCBjb3VudGVyICovCisgIEZJWFBfREJMIHJlZFZhbFtUUkFOU19GQUNdOyAvKiByZWR1Y3Rpb24gdmFsdWVzOyBpbiBzaG9ydC1ibG9jayBjYXNlIG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkVmFsIGZvciBlYWNoIGdyb3VwICovCisgIFFDX09VVF9DSEFOTkVMICpxY091dENoYW4gPSBOVUxMOworICBjb25zdCBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSBOVUxMOwogCi0jZGVmaW5lIFNDQUxFX0dST1VQX0VORVJHWSAgICg4KQorI2RlZmluZSBTQ0FMRV9HUk9VUF9FTkVSR1kgKDgpCiAKLSNkZWZpbmUgQ09OU1RfQ0hBT1NfTUVBU19BVkdfRkFDXzAgIChGTDJGWENPTlNUX0RCTCgwLjI1ZikpCi0jZGVmaW5lIENPTlNUX0NIQU9TX01FQVNfQVZHX0ZBQ18xICAoRkwyRlhDT05TVF9EQkwoMS5mLTAuMjVmKSkKKyNkZWZpbmUgQ09OU1RfQ0hBT1NfTUVBU19BVkdfRkFDXzAgKEZMMkZYQ09OU1RfREJMKDAuMjVmKSkKKyNkZWZpbmUgQ09OU1RfQ0hBT1NfTUVBU19BVkdfRkFDXzEgKEZMMkZYQ09OU1RfREJMKDEuZiAtIDAuMjVmKSkKIAotI2RlZmluZSBNSU5fTERUSFJFU0ggICAgICAgICAgICAgICAgKEZMMkZYQ09OU1RfREJMKC0wLjUxNTYyNWYpKQorI2RlZmluZSBNSU5fTERUSFJFU0ggKEZMMkZYQ09OU1RfREJMKC0wLjUxNTYyNWYpKQogCi0KLSAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKyl7Ci0gICAgcWNPdXRDaGFuICA9IHFjT3V0Q2hhbm5lbFtjaF07Ci0gICAgcHN5T3V0Q2hhbiAgPSBwc3lPdXRDaGFubmVsW2NoXTsKKyAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgcHN5T3V0Q2hhbiA9IHBzeU91dENoYW5uZWxbY2hdOwogCiAgICAgLyogYWRkaW5nIHVwIGVuZXJneSBmb3IgZWFjaCBjaGFubmVsIGFuZCBlYWNoIGdyb3VwIHNlcGFyYXRlbHkgKi8KICAgICBGSVhQX0RCTCBjaEVuZXJneSA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0gICAgZ3JvdXBDbnQ9MDsKKyAgICBncm91cENudCA9IDA7CiAKLSAgICBmb3IgKHNmYkdycD0wOyBzZmJHcnA8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW4tPnNmYlBlckdyb3VwLCBncm91cENudCsrKSB7CisgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7CisgICAgICAgICBzZmJHcnAgKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXAsIGdyb3VwQ250KyspIHsKICAgICAgIGNoR3JvdXBFbmVyZ3lbZ3JvdXBDbnRdW2NoXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0gICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKXsKLSAgICAgICAgY2hHcm91cEVuZXJneVtncm91cENudF1bY2hdICs9IChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0+PlNDQUxFX0dST1VQX0VORVJHWSk7CisgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICBjaEdyb3VwRW5lcmd5W2dyb3VwQ250XVtjaF0gKz0KKyAgICAgICAgICAgIChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwICsgc2ZiXSA+PiBTQ0FMRV9HUk9VUF9FTkVSR1kpOwogICAgICAgfQogICAgICAgY2hFbmVyZ3kgKz0gY2hHcm91cEVuZXJneVtncm91cENudF1bY2hdOwogICAgIH0KQEAgLTEwMTgsMTEwICsxMTU0LDEzMyBAQAogCiAgICAgLyogY2hhb3NNZWFzdXJlICovCiAgICAgaWYgKHBzeU91dENoYW5uZWxbMF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpIHsKLSAgICAgIGNoQ2hhb3NNZWFzdXJlW2NoXSA9IEZMMkZYQ09OU1RfREJMKDAuNWYpOyAvKiBhc3N1bWUgYSBjb25zdGFudCBjaGFvcyBtZWFzdXJlIG9mIDAuNWYgZm9yIHNob3J0IGJsb2NrcyAqLworICAgICAgY2hDaGFvc01lYXN1cmVbY2hdID0gRkwyRlhDT05TVF9EQkwoCisgICAgICAgICAgMC41Zik7IC8qIGFzc3VtZSBhIGNvbnN0YW50IGNoYW9zIG1lYXN1cmUgb2YgMC41ZiBmb3Igc2hvcnQgYmxvY2tzICovCiAgICAgfSBlbHNlIHsKLSAgICAgIGNoQ2hhb3NNZWFzdXJlW2NoXSA9IEZES2FhY0VuY19jYWxjQ2hhb3NNZWFzdXJlKHBzeU91dENoYW5uZWxbY2hdLCBxY091dENoYW5uZWxbY2hdLT5zZmJGb3JtRmFjdG9yTGREYXRhKTsKKyAgICAgIGNoQ2hhb3NNZWFzdXJlW2NoXSA9IEZES2FhY0VuY19jYWxjQ2hhb3NNZWFzdXJlKAorICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLCBxY091dENoYW5uZWxbY2hdLT5zZmJGb3JtRmFjdG9yTGREYXRhKTsKICAgICB9CiAgICAgY2hhb3NNZWFzdXJlICs9IGZNdWx0KGNoQ2hhb3NNZWFzdXJlW2NoXSwgY2hFbmVyZ3kpOwogICB9CiAKLSAgaWYoZnJhbWVFbmVyZ3kgPiBjaGFvc01lYXN1cmUpIHsKKyAgaWYgKGZyYW1lRW5lcmd5ID4gY2hhb3NNZWFzdXJlKSB7CiAgICAgSU5UIHNjYWxlID0gQ250TGVhZGluZ1plcm9zKGZyYW1lRW5lcmd5KSAtIDE7Ci0gICAgRklYUF9EQkwgbnVtICAgPSBjaGFvc01lYXN1cmU8PHNjYWxlOwotICAgIEZJWFBfREJMIGRlbnVtID0gZnJhbWVFbmVyZ3k8PHNjYWxlOwotICAgIGNoYW9zTWVhc3VyZSAgID0gc2NodXJfZGl2KG51bSxkZW51bSwxNik7Ci0gIH0KLSAgZWxzZSB7CisgICAgRklYUF9EQkwgbnVtID0gY2hhb3NNZWFzdXJlIDw8IHNjYWxlOworICAgIEZJWFBfREJMIGRlbnVtID0gZnJhbWVFbmVyZ3kgPDwgc2NhbGU7CisgICAgY2hhb3NNZWFzdXJlID0gc2NodXJfZGl2KG51bSwgZGVudW0sIDE2KTsKKyAgfSBlbHNlIHsKICAgICBjaGFvc01lYXN1cmUgPSBGTDJGWENPTlNUX0RCTCgxLmYpOwogICB9CiAKICAgY2hhb3NNZWFzdXJlQXZnID0gZk11bHQoQ09OU1RfQ0hBT1NfTUVBU19BVkdfRkFDXzAsIGNoYW9zTWVhc3VyZSkgKwotICAgICAgICAgICAgICAgICAgICBmTXVsdChDT05TVF9DSEFPU19NRUFTX0FWR19GQUNfMSwgKmNoYW9zTWVhc3VyZU9sZCk7ICAgICAgLyogYXZlcmFnaW5nIGNoYW9zIG1lYXN1cmUgKi8KLSAgKmNoYW9zTWVhc3VyZU9sZCA9IGNoYW9zTWVhc3VyZSA9IChmaXhNaW4oY2hhb3NNZWFzdXJlLCBjaGFvc01lYXN1cmVBdmcpKTsgIC8qIHVzZSBtaW4tdmFsdWUsIHNhZmUgZm9yIG5leHQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgZk11bHQoQ09OU1RfQ0hBT1NfTUVBU19BVkdfRkFDXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICpjaGFvc01lYXN1cmVPbGQpOyAvKiBhdmVyYWdpbmcgY2hhb3MgbWVhc3VyZSAqLworICAqY2hhb3NNZWFzdXJlT2xkID0gY2hhb3NNZWFzdXJlID0gKGZpeE1pbigKKyAgICAgIGNoYW9zTWVhc3VyZSwgY2hhb3NNZWFzdXJlQXZnKSk7IC8qIHVzZSBtaW4tdmFsdWUsIHNhZmUgZm9yIG5leHQgZnJhbWUgKi8KIAogICAvKiBjaGFyYWN0ZXJpc3RpYyBjdXJ2ZQogICAgICBjaGFvc01lYXN1cmUgPSAwLjJmICsgMC43Zi8wLjNmICogKGNoYW9zTWVhc3VyZSAtIDAuMmYpOwogICAgICBjaGFvc01lYXN1cmUgPSBmaXhNaW4oMS4wZiwgZml4TWF4KDAuMWYsIGNoYW9zTWVhc3VyZSkpOwogICAgICBjb25zdGFudHMgc2NhbGVkIGJ5IDQuZgogICAqLwotICBjaGFvc01lYXN1cmUgPSAoKEZMMkZYQ09OU1RfREJMKDAuMmYpPj4yKSArIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuN2YvKDQuZiowLjNmKSksIChjaGFvc01lYXN1cmUgLSBGTDJGWENPTlNUX0RCTCgwLjJmKSkpKTsKLSAgY2hhb3NNZWFzdXJlID0gKGZpeE1pbigoRklYUF9EQkwpKEZMMkZYQ09OU1RfREJMKDEuMGYpPj4yKSwgZml4TWF4KChGSVhQX0RCTCkoRkwyRlhDT05TVF9EQkwoMC4xZik+PjIpLCBjaGFvc01lYXN1cmUpKSk8PDI7CisgIGNoYW9zTWVhc3VyZSA9ICgoRkwyRlhDT05TVF9EQkwoMC4yZikgPj4gMikgKworICAgICAgICAgICAgICAgICAgZk11bHQoRkwyRlhDT05TVF9EQkwoMC43ZiAvICg0LmYgKiAwLjNmKSksCisgICAgICAgICAgICAgICAgICAgICAgICAoY2hhb3NNZWFzdXJlIC0gRkwyRlhDT05TVF9EQkwoMC4yZikpKSk7CisgIGNoYW9zTWVhc3VyZSA9CisgICAgICAoZml4TWluKChGSVhQX0RCTCkoRkwyRlhDT05TVF9EQkwoMS4wZikgPj4gMiksCisgICAgICAgICAgICAgIGZpeE1heCgoRklYUF9EQkwpKEZMMkZYQ09OU1RfREJMKDAuMWYpID4+IDIpLCBjaGFvc01lYXN1cmUpKSkKKyAgICAgIDw8IDI7CiAKICAgLyogY2FsY3VsYXRpb24gb2YgcmVkdWN0aW9uIHZhbHVlICovCi0gIGlmIChwc3lPdXRDaGFubmVsWzBdLT5sYXN0V2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKXsgLyogc2hvcnQtYmxvY2tzICovCi0gICAgRkRLX0FTU0VSVChUUkFOU19GQUM9PTgpOwotICAgICNkZWZpbmUgICBXSU5fVFlQRV9TQ0FMRSAgICgzKQorICBpZiAocHN5T3V0Q2hhbm5lbFswXS0+bGFzdFdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykgeyAvKiBzaG9ydC1ibG9ja3MgKi8KKyAgICBGREtfQVNTRVJUKFRSQU5TX0ZBQyA9PSA4KTsKKyNkZWZpbmUgV0lOX1RZUEVfU0NBTEUgKDMpCiAKLSAgICBJTlQgc2ZiR3JwLCBncm91cENudD0wOwotICAgIGZvciAoc2ZiR3JwPTA7IHNmYkdycDxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXAsZ3JvdXBDbnQrKykgewotCisgICAgZ3JvdXBDbnQgPSAwOworICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiQ250OworICAgICAgICAgc2ZiR3JwICs9IHBzeU91dENoYW5uZWxbMF0tPnNmYlBlckdyb3VwLCBncm91cENudCsrKSB7CiAgICAgICBGSVhQX0RCTCBncm91cEVuZXJneSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAKLSAgICAgIGZvcihjaD0wO2NoPG5DaGFubmVscztjaCsrKXsKLSAgICAgICAgZ3JvdXBFbmVyZ3kgKz0gY2hHcm91cEVuZXJneVtncm91cENudF1bY2hdOyAgIC8qIGFkZGluZyB1cCB0aGUgY2hhbm5lbHMgZ3JvdXBFbmVyZ3kgKi8KKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworICAgICAgICBncm91cEVuZXJneSArPQorICAgICAgICAgICAgY2hHcm91cEVuZXJneVtncm91cENudF0KKyAgICAgICAgICAgICAgICAgICAgICAgICBbY2hdOyAvKiBhZGRpbmcgdXAgdGhlIGNoYW5uZWxzIGdyb3VwRW5lcmd5ICovCiAgICAgICB9CiAKLSAgICAgIEZES19BU1NFUlQocHN5T3V0Q2hhbm5lbFswXS0+Z3JvdXBMZW5bZ3JvdXBDbnRdPD1JTlZfSU5UX1RBQl9TSVpFKTsKLSAgICAgIGdyb3VwRW5lcmd5ID0gZk11bHQoZ3JvdXBFbmVyZ3ksaW52SW50W3BzeU91dENoYW5uZWxbMF0tPmdyb3VwTGVuW2dyb3VwQ250XV0pOyAgLyogY29ycmVjdGlvbiBvZiBncm91cCBlbmVyZ3kgKi8KLSAgICAgIGdyb3VwRW5lcmd5ID0gZml4TWluKGdyb3VwRW5lcmd5LCBmcmFtZUVuZXJneT4+V0lOX1RZUEVfU0NBTEUpOyAgICAgICAgICAgICAgICAgLyogZG8gbm90IGFsbG93IGFuIGhpZ2hlciByZWRWYWwgYXMgY2FsY3VsYXRlZCBmcmFtZXdpc2UgKi8KKyAgICAgIEZES19BU1NFUlQocHN5T3V0Q2hhbm5lbFswXS0+Z3JvdXBMZW5bZ3JvdXBDbnRdIDw9IElOVl9JTlRfVEFCX1NJWkUpOworICAgICAgZ3JvdXBFbmVyZ3kgPSBmTXVsdCgKKyAgICAgICAgICBncm91cEVuZXJneSwKKyAgICAgICAgICBpbnZJbnRbcHN5T3V0Q2hhbm5lbFswXS0+Z3JvdXBMZW5bZ3JvdXBDbnRdXSk7IC8qIGNvcnJlY3Rpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwIGVuZXJneSAqLworICAgICAgZ3JvdXBFbmVyZ3kgPSBmaXhNaW4oZ3JvdXBFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUVuZXJneSA+PiBXSU5fVFlQRV9TQ0FMRSk7IC8qIGRvIG5vdCBhbGxvdyBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoZXIgcmVkVmFsIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWV3aXNlICovCiAKLSAgICAgIGdyb3VwRW5lcmd5Pj49MjsgLyogMipXSU5fVFlQRV9TQ0FMRSA9IDYgPT4gNisyID0gOCA9PT4gOC80ID0gaW50IG51bWJlciAqLworICAgICAgZ3JvdXBFbmVyZ3kgPj49CisgICAgICAgICAgMjsgLyogMipXSU5fVFlQRV9TQ0FMRSA9IDYgPT4gNisyID0gOCA9PT4gOC80ID0gaW50IG51bWJlciAqLwogCi0gICAgICByZWRWYWxbZ3JvdXBDbnRdID0gZk11bHQoZk11bHQodmJyUXVhbEZhY3RvcixjaGFvc01lYXN1cmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGNJbnZMZERhdGEoQ2FsY0xkRGF0YShncm91cEVuZXJneSk+PjIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoaW50KSggKCAyICsgKDIqV0lOX1RZUEVfU0NBTEUpICsgU0NBTEVfR1JPVVBfRU5FUkdZICk+PjIgKSA7Ci0KKyAgICAgIHJlZFZhbFtncm91cENudF0gPQorICAgICAgICAgIGZNdWx0KGZNdWx0KHZiclF1YWxGYWN0b3IsIGNoYW9zTWVhc3VyZSksCisgICAgICAgICAgICAgICAgQ2FsY0ludkxkRGF0YShDYWxjTGREYXRhKGdyb3VwRW5lcmd5KSA+PiAyKSkKKyAgICAgICAgICA8PCAoaW50KSgoMiArICgyICogV0lOX1RZUEVfU0NBTEUpICsgU0NBTEVfR1JPVVBfRU5FUkdZKSA+PiAyKTsKICAgICB9CiAgIH0gZWxzZSB7IC8qIGxvbmctYmxvY2sgKi8KIAotICAgIHJlZFZhbFswXSA9IGZNdWx0KCBmTXVsdCh2YnJRdWFsRmFjdG9yLGNoYW9zTWVhc3VyZSksCi0gICAgICAgICAgICAgICAgICAgICAgIENhbGNJbnZMZERhdGEoQ2FsY0xkRGF0YShmcmFtZUVuZXJneSk+PjIpICkKLSAgICAgICAgICAgICAgICA8PCAoaW50KSggU0NBTEVfR1JPVVBfRU5FUkdZPj4yICkgOworICAgIHJlZFZhbFswXSA9IGZNdWx0KGZNdWx0KHZiclF1YWxGYWN0b3IsIGNoYW9zTWVhc3VyZSksCisgICAgICAgICAgICAgICAgICAgICAgQ2FsY0ludkxkRGF0YShDYWxjTGREYXRhKGZyYW1lRW5lcmd5KSA+PiAyKSkKKyAgICAgICAgICAgICAgICA8PCAoaW50KShTQ0FMRV9HUk9VUF9FTkVSR1kgPj4gMik7CiAgIH0KIAotICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgcWNPdXRDaGFuICA9IHFjT3V0Q2hhbm5lbFtjaF07Ci0gICAgcHN5T3V0Q2hhbiAgPSBwc3lPdXRDaGFubmVsW2NoXTsKKyAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgcWNPdXRDaGFuID0gcWNPdXRDaGFubmVsW2NoXTsKKyAgICBwc3lPdXRDaGFuID0gcHN5T3V0Q2hhbm5lbFtjaF07CiAKLSAgICBmb3IgKHNmYkdycD0wOyBzZmJHcnA8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW4tPnNmYlBlckdyb3VwKSB7Ci0gICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKXsKKyAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDsKKyAgICAgICAgIHNmYkdycCArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCkgeworICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgc2ZiRW5MZERhdGEgPSAocWNPdXRDaGFuLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnAgKyBzZmJdKTsKKyAgICAgICAgc2ZiVGhyTGREYXRhID0gKHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCArIHNmYl0pOworICAgICAgICBzZmJUaHJFeHAgPSB0aHJFeHBbY2hdW3NmYkdycCArIHNmYl07CiAKLSAgICAgICAgc2ZiRW5MZERhdGEgID0gKHFjT3V0Q2hhbi0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0pOwotICAgICAgICBzZmJUaHJMZERhdGEgPSAocWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0pOwotICAgICAgICBzZmJUaHJFeHAgICAgPSB0aHJFeHBbY2hdW3NmYkdycCtzZmJdOwotCi0gICAgICAgIGlmICggKHNmYlRockxkRGF0YT49TUlOX0xEVEhSRVNIKSAmJiAoc2ZiRW5MZERhdGEgPiBzZmJUaHJMZERhdGEpICYmIChhaEZsYWdbY2hdW3NmYkdycCtzZmJdICE9IEFIX0FDVElWRSkpIHsKLQorICAgICAgICBpZiAoKHNmYlRockxkRGF0YSA+PSBNSU5fTERUSFJFU0gpICYmIChzZmJFbkxkRGF0YSA+IHNmYlRockxkRGF0YSkgJiYKKyAgICAgICAgICAgIChhaEZsYWdbY2hdW3NmYkdycCArIHNmYl0gIT0gQUhfQUNUSVZFKSkgewogICAgICAgICAgIC8qIFNob3J0LVdpbmRvdyAqLwogICAgICAgICAgIGlmIChwc3lPdXRDaGFubmVsW2NoXS0+bGFzdFdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykgewotICAgICAgICAgICAgY29uc3QgaW50IGdyb3VwTnVtYmVyID0gKGludCkgc2ZiL3BzeU91dENoYW4tPnNmYlBlckdyb3VwOworICAgICAgICAgICAgY29uc3QgaW50IGdyb3VwTnVtYmVyID0gKGludClzZmIgLyBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cDsKIAotICAgICAgICAgICAgRkRLX0FTU0VSVChJTlZfU1FSVDRfVEFCX1NJWkU+cHN5T3V0Q2hhbi0+Z3JvdXBMZW5bZ3JvdXBOdW1iZXJdKTsKKyAgICAgICAgICAgIEZES19BU1NFUlQoSU5WX1NRUlQ0X1RBQl9TSVpFID4gcHN5T3V0Q2hhbi0+Z3JvdXBMZW5bZ3JvdXBOdW1iZXJdKTsKIAotICAgICAgICAgICAgc2ZiVGhyRXhwID0gZk11bHQoc2ZiVGhyRXhwLCBmTXVsdCggRkwyRlhDT05TVF9EQkwoMi44MmYvNC5mKSwgaW52U3FydDRbcHN5T3V0Q2hhbi0+Z3JvdXBMZW5bZ3JvdXBOdW1iZXJdXSkpPDwyIDsKKyAgICAgICAgICAgIHNmYlRockV4cCA9CisgICAgICAgICAgICAgICAgZk11bHQoc2ZiVGhyRXhwLAorICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KEZMMkZYQ09OU1RfREJMKDIuODJmIC8gNC5mKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZTcXJ0NFtwc3lPdXRDaGFuLT5ncm91cExlbltncm91cE51bWJlcl1dKSkKKyAgICAgICAgICAgICAgICA8PCAyOwogCi0gICAgICAgICAgICBpZiAoIHNmYlRockV4cCA8PSAobGltaXRUaHJSZWR1Y2VkTGREYXRhLXJlZFZhbFtncm91cE51bWJlcl0pICkgewotICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7CisgICAgICAgICAgICBpZiAoc2ZiVGhyRXhwIDw9IChsaW1pdFRoclJlZHVjZWRMZERhdGEgLSByZWRWYWxbZ3JvdXBOdW1iZXJdKSkgeworICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKChGSVhQX0RCTClyZWRWYWxbZ3JvdXBOdW1iZXJdID49CisgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxLjBmKSAtIHNmYlRockV4cCkKKyAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCByZWR1Y3Rpb24gZm9ybXVsYSAqLworICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPQorICAgICAgICAgICAgICAgICAgICBDYWxjTGREYXRhKHNmYlRockV4cCArIHJlZFZhbFtncm91cE51bWJlcl0pOworICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPDw9IDI7CisgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmICgoRklYUF9EQkwpcmVkVmFsW2dyb3VwTnVtYmVyXSA+PSBGTDJGWENPTlNUX0RCTCgxLjBmKS1zZmJUaHJFeHApCi0gICAgICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyogdGhyZXNob2xkIHJlZHVjdGlvbiBmb3JtdWxhICovCi0gICAgICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBDYWxjTGREYXRhKHNmYlRockV4cCArIHJlZFZhbFtncm91cE51bWJlcl0pOwotICAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhIDw8PSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgKz0gKCBDYWxjTGRJbnQocHN5T3V0Q2hhbi0+Z3JvdXBMZW5bZ3JvdXBOdW1iZXJdKSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGSVhQX0RCTCk2PDwoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZUKSkgKTsKKyAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgKz0KKyAgICAgICAgICAgICAgICAoQ2FsY0xkSW50KHBzeU91dENoYW4tPmdyb3VwTGVuW2dyb3VwTnVtYmVyXSkgLQorICAgICAgICAgICAgICAgICAoKEZJWFBfREJMKTYgPDwgKERGUkFDVF9CSVRTIC0gMSAtIExEX0RBVEFfU0hJRlQpKSk7CiAgICAgICAgICAgfQogCiAgICAgICAgICAgLyogTG9uZy1XaW5kb3cgKi8KICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmICgoRklYUF9EQkwpcmVkVmFsWzBdID49IEZMMkZYQ09OU1RfREJMKDEuMGYpLXNmYlRockV4cCkgeworICAgICAgICAgICAgaWYgKChGSVhQX0RCTClyZWRWYWxbMF0gPj0gRkwyRlhDT05TVF9EQkwoMS4wZikgLSBzZmJUaHJFeHApIHsKICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVkdWN0aW9uIGZvcm11bGEgKi8KICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IENhbGNMZERhdGEoc2ZiVGhyRXhwICsgcmVkVmFsWzBdKTsKICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA8PD0gMjsKQEAgLTExMjksMjcgKzEyODgsMzMgQEAKICAgICAgICAgICB9CiAKICAgICAgICAgICAvKiBhdm9pZCBob2xlcyAqLwotICAgICAgICAgIGlmICggKChzZmJUaHJSZWR1Y2VkTGREYXRhIC0gc2ZiRW5MZERhdGEpID4gcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gKQotICAgICAgICAgICAgICAgICAgJiYgKGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gIT0gTk9fQUgpICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0gID4gKEZMMkZYQ09OU1RfREJMKC0xLjBmKSAtIHNmYkVuTGREYXRhKSApewotICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gZml4TWF4KChxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSArIHNmYkVuTGREYXRhKSwgc2ZiVGhyTGREYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2Ugc2ZiVGhyUmVkdWNlZExkRGF0YSA9IHNmYlRockxkRGF0YTsKLSAgICAgICAgICAgIGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gPSBBSF9BQ1RJVkU7CisgICAgICAgICAgaWYgKCgoc2ZiVGhyUmVkdWNlZExkRGF0YSAtIHNmYkVuTGREYXRhKSA+CisgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnAgKyBzZmJdKSAmJgorICAgICAgICAgICAgICAoYWhGbGFnW2NoXVtzZmJHcnAgKyBzZmJdICE9IE5PX0FIKSkgeworICAgICAgICAgICAgaWYgKHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCArIHNmYl0gPgorICAgICAgICAgICAgICAgIChGTDJGWENPTlNUX0RCTCgtMS4wZikgLSBzZmJFbkxkRGF0YSkpIHsKKyAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IGZpeE1heCgKKyAgICAgICAgICAgICAgICAgIChxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnAgKyBzZmJdICsgc2ZiRW5MZERhdGEpLAorICAgICAgICAgICAgICAgICAgc2ZiVGhyTGREYXRhKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gc2ZiVGhyTGREYXRhOworICAgICAgICAgICAgYWhGbGFnW2NoXVtzZmJHcnAgKyBzZmJdID0gQUhfQUNUSVZFOwogICAgICAgICAgIH0KIAotICAgICAgICAgIGlmIChzZmJUaHJSZWR1Y2VkTGREYXRhPEZMMkZYQ09OU1RfREJMKC0wLjVmKSkKLSAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgtMS5mKTsKKyAgICAgICAgICBpZiAoc2ZiVGhyUmVkdWNlZExkRGF0YSA8IEZMMkZYQ09OU1RfREJMKC0wLjVmKSkKKyAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgtMS5mKTsKIAogICAgICAgICAgIC8qIG1pbmltdW0gb2YgMjkgZEIgUmF0aW8gZm9yIFRocmVzaG9sZHMgKi8KLSAgICAgICAgICBpZiAoKHNmYkVuTGREYXRhK0ZMMkZYQ09OU1RfREJMKDEuMGYpKSA+IEZMMkZYQ09OU1RfREJMKDkuNjMzNjIwNi9MRF9EQVRBX1NDQUxJTkcpKXsKLSAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBmaXhNYXgoc2ZiVGhyUmVkdWNlZExkRGF0YSwgc2ZiRW5MZERhdGEgLSBGTDJGWENPTlNUX0RCTCg5LjYzMzYyMDYvTERfREFUQV9TQ0FMSU5HKSk7CisgICAgICAgICAgaWYgKChzZmJFbkxkRGF0YSArIEZMMkZYQ09OU1RfREJMKDEuMGYpKSA+CisgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDkuNjMzNjIwNiAvIExEX0RBVEFfU0NBTElORykpIHsKKyAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBmaXhNYXgoCisgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSwKKyAgICAgICAgICAgICAgICBzZmJFbkxkRGF0YSAtIEZMMkZYQ09OU1RfREJMKDkuNjMzNjIwNiAvIExEX0RBVEFfU0NBTElORykpOwogICAgICAgICAgIH0KIAotICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBmaXhNYXgoTUlOX0xEVEhSRVNILHNmYlRoclJlZHVjZWRMZERhdGEpOworICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBmaXhNYXgoTUlOX0xEVEhSRVNILCBzZmJUaHJSZWR1Y2VkTGREYXRhKTsKIAotICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdID0gc2ZiVGhyUmVkdWNlZExkRGF0YTsKKyAgICAgICAgICBxY091dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnAgKyBzZmJdID0gc2ZiVGhyUmVkdWNlZExkRGF0YTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTExNTgsMTc0ICsxMzIzLDE5NyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NvcnJlY3RUaHJlc2gKLWRlc2NyaXB0aW9uOiAgaWYgcGUgZGlmZmVyZW5jZSBkZWx0YVBlIGJldHdlZW4gZGVzaXJlZCBwZSBhbmQgcmVhbCBwZSBpcyBzbWFsbCBlbm91Z2gsCi10aGUgZGlmZmVyZW5jZSBjYW4gYmUgZGlzdHJpYnV0ZWQgYW1vbmcgdGhlIHNjYWxlIGZhY3RvciBiYW5kcy4KLU5ldyB0aHJlc2hvbGRzIGNhbiBiZSBkZXJpdmVkIGZyb20gdGhpcyBwZS1kaWZmZXJlbmNlCitkZXNjcmlwdGlvbjogIGlmIHBlIGRpZmZlcmVuY2UgZGVsdGFQZSBiZXR3ZWVuIGRlc2lyZWQgcGUgYW5kIHJlYWwgcGUgaXMgc21hbGwKK2Vub3VnaCwgdGhlIGRpZmZlcmVuY2UgY2FuIGJlIGRpc3RyaWJ1dGVkIGFtb25nIHRoZSBzY2FsZSBmYWN0b3IgYmFuZHMuIE5ldwordGhyZXNob2xkcyBjYW4gYmUgZGVyaXZlZCBmcm9tIHRoaXMgcGUtZGlmZmVyZW5jZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfY29ycmVjdFRocmVzaChDSEFOTkVMX01BUFBJTkcqIGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogIHFjRWxlbWVudFsoOCldLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqIHBzeU91dEVsZW1lbnRbKDgpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICBhaEZsYWdbKDgpXVsoMildW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICAgdGhyRXhwWyg4KV1bKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgICAgICAgICAgIEZJWFBfREJMIHJlZFZhbFsoOCldLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgICAgICAgICAgIFNDSEFSIHJlZFZhbFNjYWxpbmdbKDgpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICAgICAgICAgICBJTlQgZGVsdGFQZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICAgICAgICAgICBJTlQgcHJvY2Vzc0VsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgICAgICAgICAgIElOVCBlbGVtZW50T2Zmc2V0KQotewotICAgSU5UIGNoLCBzZmIsIHNmYkdycDsKLSAgIFFDX09VVF9DSEFOTkVMICpxY091dENoYW47Ci0gICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW47Ci0gICBQRV9DSEFOTkVMX0RBVEEgKnBlQ2hhbkRhdGE7Ci0gICBGSVhQX0RCTCB0aHJGYWN0b3JMZERhdGE7Ci0gICBGSVhQX0RCTCBzZmJFbkxkRGF0YSwgc2ZiVGhyTGREYXRhLCBzZmJUaHJSZWR1Y2VkTGREYXRhOwotICAgRklYUF9EQkwgKnNmYlBlRmFjdG9yc0xkRGF0YVsoOCldWygyKV07Ci0gICBGSVhQX0RCTCBzZmJOQWN0aXZlTGluZXNMZERhdGFbKDgpXVsoMildW01BWF9HUk9VUEVEX1NGQl07Ci0gICBJTlQgICAgICBub3JtRmFjdG9ySW50OwotICAgRklYUF9EQkwgbm9ybUZhY3RvckxkRGF0YTsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jb3JyZWN0VGhyZXNoKAorICAgIGNvbnN0IENIQU5ORUxfTUFQUElORyAqY29uc3QgY20sIFFDX09VVF9FTEVNRU5UICpjb25zdCBxY0VsZW1lbnRbKCg4KSldLAorICAgIGNvbnN0IFBTWV9PVVRfRUxFTUVOVCAqY29uc3QgcHN5T3V0RWxlbWVudFsoKDgpKV0sCisgICAgVUNIQVIgYWhGbGFnWygoOCkpXVsoMildW01BWF9HUk9VUEVEX1NGQl0sCisgICAgY29uc3QgRklYUF9EQkwgdGhyRXhwWygoOCkpXVsoMildW01BWF9HUk9VUEVEX1NGQl0sIGNvbnN0IEZJWFBfREJMIHJlZFZhbF9tLAorICAgIGNvbnN0IFNDSEFSIHJlZFZhbF9lLCBjb25zdCBJTlQgZGVsdGFQZSwgY29uc3QgSU5UIHByb2Nlc3NFbGVtZW50cywKKyAgICBjb25zdCBJTlQgZWxlbWVudE9mZnNldCkgeworICBJTlQgY2gsIHNmYiwgc2ZiR3JwOworICBRQ19PVVRfQ0hBTk5FTCAqcWNPdXRDaGFuOworICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW47CisgIFBFX0NIQU5ORUxfREFUQSAqcGVDaGFuRGF0YTsKKyAgRklYUF9EQkwgdGhyRmFjdG9yTGREYXRhOworICBGSVhQX0RCTCBzZmJFbkxkRGF0YSwgc2ZiVGhyTGREYXRhLCBzZmJUaHJSZWR1Y2VkTGREYXRhOworICBGSVhQX0RCTCAqc2ZiUGVGYWN0b3JzTGREYXRhWygoOCkpXVsoMildOworICBGSVhQX0RCTCgqc2ZiTkFjdGl2ZUxpbmVzTGREYXRhKVsoMildW01BWF9HUk9VUEVEX1NGQl07CiAKLSAgIElOVCBuRWxlbWVudHMgPSBlbGVtZW50T2Zmc2V0K3Byb2Nlc3NFbGVtZW50czsKLSAgIElOVCBlbGVtZW50SWQ7CisgIElOVCBub3JtRmFjdG9ySW50OworICBGSVhQX0RCTCBub3JtRmFjdG9yTGREYXRhOwogCi0gICAvKiBzY3JhdGNoIGlzIGVtcHR5OyB1c2UgdGVtcG9yYWwgbWVtb3J5IGZyb20gcXVhbnRTcGVjIGluIFFDX09VVF9DSEFOTkVMICovCi0gICBmb3IoZWxlbWVudElkPWVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgewotICAgICBmb3IoY2g9MDsgY2g8Y20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7IGNoKyspIHsKLSAgICAgICBTSE9SVCogcHRyID0gcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbFtjaF0tPnF1YW50U3BlYzsKLSAgICAgICBzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF0gPSAoRklYUF9EQkwqKXB0cjsKLSAgICAgfQotICAgfQorICBJTlQgbkVsZW1lbnRzID0gZWxlbWVudE9mZnNldCArIHByb2Nlc3NFbGVtZW50czsKKyAgSU5UIGVsZW1lbnRJZDsKIAotICAgLyogZm9yIGVhY2ggc2ZiIGNhbGMgcmVsYXRpdmUgZmFjdG9ycyBmb3IgcGUgY2hhbmdlcyAqLwotICAgbm9ybUZhY3RvckludCA9IDA7CisgIC8qIHNjcmF0Y2ggaXMgZW1wdHk7IHVzZSB0ZW1wb3JhbCBtZW1vcnkgZnJvbSBxdWFudFNwZWMgaW4gUUNfT1VUX0NIQU5ORUwgKi8KKyAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0OyBlbGVtZW50SWQgPCBuRWxlbWVudHM7IGVsZW1lbnRJZCsrKSB7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7IGNoKyspIHsKKyAgICAgIC8qIFRoZSByZWludGVycHJldF9jYXN0IGlzIHVzZWQgdG8gc3VwcHJlc3MgYSBjb21waWxlciB3YXJuaW5nLiBXZSBrbm93CisgICAgICAgKiB0aGF0IHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWxbY2hdLT5xdWFudFNwZWMgaXMgc3VmZmljaWVudGx5CisgICAgICAgKiBhbGlnbmVkLCBzbyB0aGUgY2FzdCBpcyBzYWZlICovCisgICAgICBzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF0gPQorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8RklYUF9EQkwgKj4ocmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KAorICAgICAgICAgICAgICBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsW2NoXS0+cXVhbnRTcGVjKSk7CisgICAgfQorICB9CisgIC8qIFRoZSByZWludGVycHJldF9jYXN0IGlzIHVzZWQgdG8gc3VwcHJlc3MgYSBjb21waWxlciB3YXJuaW5nLiBXZSBrbm93IHRoYXQKKyAgICogcWNFbGVtZW50WzBdLT5keW5NZW1fU2ZiTkFjdGl2ZUxpbmVzTGREYXRhIGlzIHN1ZmZpY2llbnRseSBhbGlnbmVkLCBzbyB0aGUKKyAgICogY2FzdCBpcyBzYWZlICovCisgIHNmYk5BY3RpdmVMaW5lc0xkRGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RklYUF9EQkwoKilbKDIpXVtNQVhfR1JPVVBFRF9TRkJdPigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihxY0VsZW1lbnRbMF0tPmR5bk1lbV9TZmJOQWN0aXZlTGluZXNMZERhdGEpKTsKIAotICAgZm9yKGVsZW1lbnRJZD1lbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKLSAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CisgIC8qIGZvciBlYWNoIHNmYiBjYWxjIHJlbGF0aXZlIGZhY3RvcnMgZm9yIHBlIGNoYW5nZXMgKi8KKyAgbm9ybUZhY3RvckludCA9IDA7CiAKLSAgICAgICBmb3IoY2g9MDsgY2g8Y20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7IGNoKyspIHsKKyAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0OyBlbGVtZW50SWQgPCBuRWxlbWVudHM7IGVsZW1lbnRJZCsrKSB7CisgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgeworICAgICAgICBwc3lPdXRDaGFuID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXTsKKyAgICAgICAgcGVDaGFuRGF0YSA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhLnBlQ2hhbm5lbERhdGFbY2hdOwogCi0gICAgICAgICAgcWNPdXRDaGFuID0gcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbFtjaF07Ci0gICAgICAgICAgcHN5T3V0Q2hhbiA9IHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF07Ci0gICAgICAgICAgcGVDaGFuRGF0YSA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhLnBlQ2hhbm5lbERhdGFbY2hdOworICAgICAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDsKKyAgICAgICAgICAgICBzZmJHcnAgKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApIHsKKyAgICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICAgICAgaWYgKHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnAgKyBzZmJdID09IDApIHsKKyAgICAgICAgICAgICAgc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCArIHNmYl0gPQorICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoLTEuMGYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLyogQm90aCBDYWxjTGRJbnQgYW5kIENhbGNMZERhdGEgY2FuIGJlIHVzZWQhCisgICAgICAgICAgICAgICAqIE5vIG9mZnNldCBoYXMgdG8gYmUgc3VidHJhY3RlZCwgYmVjYXVzZSBzZmJOQWN0aXZlTGluZXNMZERhdGEKKyAgICAgICAgICAgICAgICogaXMgc2hvcnRlZCB3aGlsZSB0aHJGYWN0b3IgY2FsY3VsYXRpb24gKi8KKyAgICAgICAgICAgICAgc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCArIHNmYl0gPQorICAgICAgICAgICAgICAgICAgQ2FsY0xkSW50KHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnAgKyBzZmJdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoKGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnAgKyBzZmJdIDwgQUhfQUNUSVZFKSB8fAorICAgICAgICAgICAgICAgICAoZGVsdGFQZSA+IDApKSAmJgorICAgICAgICAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnAgKyBzZmJdICE9IDApIHsKKyAgICAgICAgICAgICAgaWYgKHRockV4cFtlbGVtZW50SWRdW2NoXVtzZmJHcnAgKyBzZmJdID4gLXJlZFZhbF9tKSB7CisgICAgICAgICAgICAgICAgLyogc2ZiUGVGYWN0b3JzW2NoXVtzZmJHcnArc2ZiXSA9CisgICAgICAgICAgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhyRXhwW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdICsKKyAgICAgICAgICAgICAgICAgICByZWRWYWxbZWxlbWVudElkXSk7ICovCiAKLSAgICAgICAgICBmb3Ioc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7Ci0gICAgICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgICAgICAgICAgaW50IG1pblNjYWxlID0KKyAgICAgICAgICAgICAgICAgICAgZml4TWluKAorICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRMZWFkaW5nQml0cyh0aHJFeHBbZWxlbWVudElkXVtjaF1bc2ZiR3JwICsgc2ZiXSksCisgICAgICAgICAgICAgICAgICAgICAgICBDb3VudExlYWRpbmdCaXRzKHJlZFZhbF9tKSAtIHJlZFZhbF9lKSAtCisgICAgICAgICAgICAgICAgICAgIDE7CiAKLSAgICAgICAgICAgICBpZiAoIHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXSA9PSAwICkgewotICAgICAgICAgICAgICAgIHNmYk5BY3RpdmVMaW5lc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogQm90aCBDYWxjTGRJbnQgYW5kIENhbGNMZERhdGEgY2FuIGJlIHVzZWQhCi0gICAgICAgICAgICAgICAgICogTm8gb2Zmc2V0IGhhcyB0byBiZSBzdWJ0cmFjdGVkLCBiZWNhdXNlIHNmYk5BY3RpdmVMaW5lc0xkRGF0YQotICAgICAgICAgICAgICAgICAqIGlzIHNob3J0ZWQgd2hpbGUgdGhyRmFjdG9yIGNhbGN1bGF0aW9uICovCi0gICAgICAgICAgICAgICAgc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gQ2FsY0xkSW50KHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXSk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmICggKChhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPCBBSF9BQ1RJVkUpIHx8IChkZWx0YVBlID4gMCkpICYmCi0gICAgICAgICAgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdICE9IDAgKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodGhyRXhwW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID4gLXJlZFZhbFtlbGVtZW50SWRdKSB7CisgICAgICAgICAgICAgICAgLyogc3VtbGQgPSBsZDY0KCBzZmJUaHJFeHAgKyByZWRWYWwgKSAqLworICAgICAgICAgICAgICAgIEZJWFBfREJMIHN1bUxkID0KKyAgICAgICAgICAgICAgICAgICAgQ2FsY0xkRGF0YShzY2FsZVZhbHVlKHRockV4cFtlbGVtZW50SWRdW2NoXVtzZmJHcnAgKyBzZmJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluU2NhbGUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVZhbHVlKHJlZFZhbF9tLCByZWRWYWxfZSArIG1pblNjYWxlKSkgLQorICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKG1pblNjYWxlIDw8IChERlJBQ1RfQklUUyAtIDEgLSBMRF9EQVRBX1NISUZUKSk7CiAKLSAgICAgICAgICAgICAgICAgICAvKiBzZmJQZUZhY3RvcnNbY2hdW3NmYkdycCtzZmJdID0gcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhyRXhwW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdICsgcmVkVmFsW2VsZW1lbnRJZF0pOyAqLwotCi0gICAgICAgICAgICAgICAgICAgaW50IG1pblNjYWxlID0gZml4TWluKENvdW50TGVhZGluZ0JpdHModGhyRXhwW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdKSwgQ291bnRMZWFkaW5nQml0cyhyZWRWYWxbZWxlbWVudElkXSkgLSAoREZSQUNUX0JJVFMtMS1yZWRWYWxTY2FsaW5nW2VsZW1lbnRJZF0pICkgLSAxOwotCi0gICAgICAgICAgICAgICAgICAgLyogc3VtbGQgPSBsZDY0KCBzZmJUaHJFeHAgKyByZWRWYWwgKSAqLwotICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHN1bUxkID0gQ2FsY0xkRGF0YShzY2FsZVZhbHVlKHRockV4cFtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSwgbWluU2NhbGUpICsgc2NhbGVWYWx1ZShyZWRWYWxbZWxlbWVudElkXSwgKERGUkFDVF9CSVRTLTEtcmVkVmFsU2NhbGluZ1tlbGVtZW50SWRdKSttaW5TY2FsZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKEZJWFBfREJMKShtaW5TY2FsZTw8KERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCkpOwotCi0gICAgICAgICAgICAgICAgICAgaWYgKHN1bUxkIDwgRkwyRlhDT05TVF9EQkwoMC5mKSkgewotICAgICAgICAgICAgICAgICAgICAgIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9IHNmYk5BY3RpdmVMaW5lc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSAtIHN1bUxkOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmICggc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID4gKEZMMkZYQ09OU1RfREJMKC0xLmYpICsgc3VtTGQpICkgewotICAgICAgICAgICAgICAgICAgICAgICBzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPSBzZmJOQWN0aXZlTGluZXNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gLSBzdW1MZDsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9IHNmYk5BY3RpdmVMaW5lc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICBub3JtRmFjdG9ySW50ICs9IChJTlQpQ2FsY0ludkxkRGF0YShzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0pOworICAgICAgICAgICAgICAgIGlmIChzdW1MZCA8IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICAgICAgICAgICAgICAgIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnAgKyBzZmJdID0KKyAgICAgICAgICAgICAgICAgICAgICBzZmJOQWN0aXZlTGluZXNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwICsgc2ZiXSAtCisgICAgICAgICAgICAgICAgICAgICAgc3VtTGQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGlmIChzZmJOQWN0aXZlTGluZXNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwICsgc2ZiXSA+CisgICAgICAgICAgICAgICAgICAgICAgKEZMMkZYQ09OU1RfREJMKC0xLmYpICsgc3VtTGQpKSB7CisgICAgICAgICAgICAgICAgICAgIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnAgKyBzZmJdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNmYk5BY3RpdmVMaW5lc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnAgKyBzZmJdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN1bUxkOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCArIHNmYl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCArIHNmYl07CisgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2Ugc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gRkwyRlhDT05TVF9EQkwoMS4wZik7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGVsc2Ugc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOwotICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbm9ybUZhY3RvckludCArPSAoSU5UKUNhbGNJbnZMZERhdGEoCisgICAgICAgICAgICAgICAgICAgIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnAgKyBzZmJdKTsKKyAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCArIHNmYl0gPQorICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxLjBmKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICBzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwICsgc2ZiXSA9CisgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgtMS4wZik7CiAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CiAKLSAgIC8qIG5vcm1GYWN0b3JMZERhdGEgPSBsZDY0KGRlbHRhUGUvbm9ybUZhY3RvckludCkgKi8KLSAgIG5vcm1GYWN0b3JMZERhdGEgPSBDYWxjTGREYXRhKChGSVhQX0RCTCkoKGRlbHRhUGU8MCkgPyAoLWRlbHRhUGUpIDogKGRlbHRhUGUpKSkgLSBDYWxjTGREYXRhKChGSVhQX0RCTClub3JtRmFjdG9ySW50KTsKKyAgLyogbm9ybUZhY3RvckxkRGF0YSA9IGxkNjQoZGVsdGFQZS9ub3JtRmFjdG9ySW50KSAqLworICBub3JtRmFjdG9yTGREYXRhID0KKyAgICAgIENhbGNMZERhdGEoKEZJWFBfREJMKSgoZGVsdGFQZSA8IDApID8gKC1kZWx0YVBlKSA6IChkZWx0YVBlKSkpIC0KKyAgICAgIENhbGNMZERhdGEoKEZJWFBfREJMKW5vcm1GYWN0b3JJbnQpOwogCi0gICAvKiBkaXN0cmlidXRlIHRoZSBwZSBkaWZmZXJlbmNlIHRvIHRoZSBzY2FsZWZhY3RvcnMKLSAgICAgIGFuZCBjYWxjdWxhdGUgdGhlIGFjY29yZGluZyB0aHJlc2hvbGRzICovCi0gICBmb3IoZWxlbWVudElkPWVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgewotICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKKyAgLyogZGlzdHJpYnV0ZSB0aGUgcGUgZGlmZmVyZW5jZSB0byB0aGUgc2NhbGVmYWN0b3JzCisgICAgIGFuZCBjYWxjdWxhdGUgdGhlIGFjY29yZGluZyB0aHJlc2hvbGRzICovCisgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDsgZWxlbWVudElkIDwgbkVsZW1lbnRzOyBlbGVtZW50SWQrKykgeworICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgeworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7IGNoKyspIHsKKyAgICAgICAgcWNPdXRDaGFuID0gcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbFtjaF07CisgICAgICAgIHBzeU91dENoYW4gPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdOworICAgICAgICBwZUNoYW5EYXRhID0gJnFjRWxlbWVudFtlbGVtZW50SWRdLT5wZURhdGEucGVDaGFubmVsRGF0YVtjaF07CiAKLSAgICAgICBmb3IoY2g9MDsgY2g8Y20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7IGNoKyspIHsKLSAgICAgICAgICBxY091dENoYW4gPSBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsW2NoXTsKLSAgICAgICAgICBwc3lPdXRDaGFuID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXTsKLSAgICAgICAgICBwZUNoYW5EYXRhID0gJnFjRWxlbWVudFtlbGVtZW50SWRdLT5wZURhdGEucGVDaGFubmVsRGF0YVtjaF07CisgICAgICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250OworICAgICAgICAgICAgIHNmYkdycCArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCkgeworICAgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgICAgICBpZiAocGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCArIHNmYl0gPiAwKSB7CisgICAgICAgICAgICAgIC8qIHBlIGRpZmZlcmVuY2UgZm9yIHRoaXMgc2ZiICovCisgICAgICAgICAgICAgIGlmICgoc2ZiUGVGYWN0b3JzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCArIHNmYl0gPT0KKyAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgtMS4wZikpIHx8CisgICAgICAgICAgICAgICAgICAoZGVsdGFQZSA9PSAwKSkgeworICAgICAgICAgICAgICAgIHRockZhY3RvckxkRGF0YSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogbmV3IHRocmVzaG9sZCAqLworICAgICAgICAgICAgICAgIEZJWFBfREJMIHRtcCA9IENhbGNJbnZMZERhdGEoCisgICAgICAgICAgICAgICAgICAgIHNmYlBlRmFjdG9yc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnAgKyBzZmJdICsKKyAgICAgICAgICAgICAgICAgICAgbm9ybUZhY3RvckxkRGF0YSAtCisgICAgICAgICAgICAgICAgICAgIHNmYk5BY3RpdmVMaW5lc0xkRGF0YVtlbGVtZW50SWRdW2NoXVtzZmJHcnAgKyBzZmJdIC0KKyAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoKGZsb2F0KUxEX0RBVEFfU0hJRlQgLyBMRF9EQVRBX1NDQUxJTkcpKTsKIAotICAgICAgICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7Ci0gICAgICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0KLSAgICAgICAgICAgICAgaWYgKHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXSA+IDApIHsKLQotICAgICAgICAgICAgICAgICAvKiBwZSBkaWZmZXJlbmNlIGZvciB0aGlzIHNmYiAqLwotICAgICAgICAgICAgICAgICBpZiAoIChzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl09PUZMMkZYQ09OU1RfREJMKC0xLjBmKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAoZGVsdGFQZT09MCkgKQotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgdGhyRmFjdG9yTGREYXRhID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAvKiBuZXcgdGhyZXNob2xkICovCi0gICAgICAgICAgICAgICAgICAgRklYUF9EQkwgdG1wID0gQ2FsY0ludkxkRGF0YShzZmJQZUZhY3RvcnNMZERhdGFbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gKyBub3JtRmFjdG9yTGREYXRhIC0gc2ZiTkFjdGl2ZUxpbmVzTGREYXRhW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdIC0gRkwyRlhDT05TVF9EQkwoKGZsb2F0KUxEX0RBVEFfU0hJRlQvTERfREFUQV9TQ0FMSU5HKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAvKiBsaW1pdCB0aHJGYWN0b3IgdG8gNjBkQiAqLwotICAgICAgICAgICAgICAgICAgIHRtcCA9IChkZWx0YVBlPDApID8gdG1wIDogKC10bXApOwotICAgICAgICAgICAgICAgICAgIHRockZhY3RvckxkRGF0YSA9IEZES21pbih0bXAsIEZMMkZYQ09OU1RfREJMKDIwLmYvTERfREFUQV9TQ0FMSU5HKSk7Ci0gICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAvKiBuZXcgdGhyZXNob2xkICovCi0gICAgICAgICAgICAgICAgIHNmYlRockxkRGF0YSA9IHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdOwotICAgICAgICAgICAgICAgICBzZmJFbkxkRGF0YSAgPSBxY091dENoYW4tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdOwotCi0gICAgICAgICAgICAgICAgIGlmICh0aHJGYWN0b3JMZERhdGEgPCBGTDJGWENPTlNUX0RCTCgwLmYpKSB7Ci0gICAgICAgICAgICAgICAgICAgaWYoIHNmYlRockxkRGF0YSA+IChGTDJGWENPTlNUX0RCTCgtMS5mKS10aHJGYWN0b3JMZERhdGEpICkgewotICAgICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IHNmYlRockxkRGF0YSArIHRockZhY3RvckxkRGF0YTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gRkwyRlhDT05TVF9EQkwoLTEuZik7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgIHNmYlRoclJlZHVjZWRMZERhdGEgPSBzZmJUaHJMZERhdGEgKyB0aHJGYWN0b3JMZERhdGE7Ci0gICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAvKiBhdm9pZCBob2xlICovCi0gICAgICAgICAgICAgICAgIGlmICggKHNmYlRoclJlZHVjZWRMZERhdGEgLSBzZmJFbkxkRGF0YSA+IHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdKSAmJgotICAgICAgICAgICAgICAgICAgICAgIChhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gPT0gQUhfSU5BQ1RJVkUpICkKLSAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBzZmJUaHJSZWR1Y2VkID0gbWF4KHBzeU91dENoYW5bY2hdLT5zZmJNaW5TbnJbaV0gKiBzZmJFbiwgc2ZiVGhyKTsgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCBzZmJFbkxkRGF0YSA+IChzZmJUaHJMZERhdGEtcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0pICkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdICsgc2ZiRW5MZERhdGE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gc2ZiVGhyTGREYXRhOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJHcnArc2ZiXSA9IEFIX0FDVElWRTsKLSAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdID0gc2ZiVGhyUmVkdWNlZExkRGF0YTsKKyAgICAgICAgICAgICAgICAvKiBsaW1pdCB0aHJGYWN0b3IgdG8gNjBkQiAqLworICAgICAgICAgICAgICAgIHRtcCA9IChkZWx0YVBlIDwgMCkgPyB0bXAgOiAoLXRtcCk7CisgICAgICAgICAgICAgICAgdGhyRmFjdG9yTGREYXRhID0KKyAgICAgICAgICAgICAgICAgICAgZk1pbih0bXAsIEZMMkZYQ09OU1RfREJMKDIwLmYgLyBMRF9EQVRBX1NDQUxJTkcpKTsKICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIG5ldyB0aHJlc2hvbGQgKi8KKyAgICAgICAgICAgICAgc2ZiVGhyTGREYXRhID0gcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwICsgc2ZiXTsKKyAgICAgICAgICAgICAgc2ZiRW5MZERhdGEgPSBxY091dENoYW4tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYkdycCArIHNmYl07CisKKyAgICAgICAgICAgICAgaWYgKHRockZhY3RvckxkRGF0YSA8IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2ZiVGhyTGREYXRhID4gKEZMMkZYQ09OU1RfREJMKC0xLmYpIC0gdGhyRmFjdG9yTGREYXRhKSkgeworICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IHNmYlRockxkRGF0YSArIHRockZhY3RvckxkRGF0YTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9IEZMMkZYQ09OU1RfREJMKC0xLmYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gc2ZiVGhyTGREYXRhICsgdGhyRmFjdG9yTGREYXRhOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogYXZvaWQgaG9sZSAqLworICAgICAgICAgICAgICBpZiAoKHNmYlRoclJlZHVjZWRMZERhdGEgLSBzZmJFbkxkRGF0YSA+CisgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSkgJiYKKyAgICAgICAgICAgICAgICAgIChhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwICsgc2ZiXSA9PSBBSF9JTkFDVElWRSkpIHsKKyAgICAgICAgICAgICAgICAvKiBzZmJUaHJSZWR1Y2VkID0gbWF4KHBzeU91dENoYW5bY2hdLT5zZmJNaW5TbnJbaV0gKiBzZmJFbiwKKyAgICAgICAgICAgICAgICAgKiBzZmJUaHIpOyAqLworICAgICAgICAgICAgICAgIGlmIChzZmJFbkxkRGF0YSA+CisgICAgICAgICAgICAgICAgICAgIChzZmJUaHJMZERhdGEgLSBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnAgKyBzZmJdKSkgeworICAgICAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZExkRGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwICsgc2ZiXSArIHNmYkVuTGREYXRhOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkTGREYXRhID0gc2ZiVGhyTGREYXRhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwICsgc2ZiXSA9IEFIX0FDVElWRTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCArIHNmYl0gPSBzZmJUaHJSZWR1Y2VkTGREYXRhOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLSAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEzMzMsNjI4ICsxNTIxLDY4OCBAQAogICAgIGRlc2NyaXB0aW9uOiAgaWYgdGhlIGRlc2lyZWQgcGUgY2FuIG5vdCBiZSByZWFjaGVkLCByZWR1Y2UgcGUgYnkKICAgICAgICAgICAgICAgICAgIHJlZHVjaW5nIG1pblNucgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEZES2FhY0VuY19yZWR1Y2VNaW5TbnIoQ0hBTk5FTF9NQVBQSU5HKiBjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogIHFjRWxlbWVudFsoOCldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogcHN5T3V0RWxlbWVudFsoOCldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgYWhGbGFnWyg4KV1bKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgICAgICAgICAgSU5UIGRlc2lyZWRQZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQqICAgICAgICAgICAgIHJlZFBlR2xvYmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgICAgICAgICAgSU5UIHByb2Nlc3NFbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgICAgICAgICAgIElOVCBlbGVtZW50T2Zmc2V0KQorc3RhdGljIHZvaWQgRkRLYWFjRW5jX3JlZHVjZU1pblNucigKKyAgICBjb25zdCBDSEFOTkVMX01BUFBJTkcgKmNvbnN0IGNtLCBRQ19PVVRfRUxFTUVOVCAqY29uc3QgcWNFbGVtZW50WygoOCkpXSwKKyAgICBjb25zdCBQU1lfT1VUX0VMRU1FTlQgKmNvbnN0IHBzeU91dEVsZW1lbnRbKCg4KSldLAorICAgIGNvbnN0IFVDSEFSIGFoRmxhZ1soKDgpKV1bKDIpXVtNQVhfR1JPVVBFRF9TRkJdLCBjb25zdCBJTlQgZGVzaXJlZFBlLAorICAgIElOVCAqY29uc3QgcmVkUGVHbG9iYWwsIGNvbnN0IElOVCBwcm9jZXNzRWxlbWVudHMsIGNvbnN0IElOVCBlbGVtZW50T2Zmc2V0KQogCiB7Ci0gICBJTlQgZWxlbWVudElkOwotICAgSU5UIG5FbGVtZW50cyA9IGVsZW1lbnRPZmZzZXQrcHJvY2Vzc0VsZW1lbnRzOworICBJTlQgY2gsIGVsZW1lbnRJZCwgZ2xvYmFsTWF4U2ZiID0gMDsKKyAgY29uc3QgSU5UIG5FbGVtZW50cyA9IGVsZW1lbnRPZmZzZXQgKyBwcm9jZXNzRWxlbWVudHM7CisgIElOVCBuZXdHbG9iYWxQZSA9ICpyZWRQZUdsb2JhbDsKIAotICAgSU5UIG5ld0dsb2JhbFBlID0gKnJlZFBlR2xvYmFsOworICBpZiAobmV3R2xvYmFsUGUgPD0gZGVzaXJlZFBlKSB7CisgICAgZ290byBiYWlsOworICB9CiAKLSAgIGZvcihlbGVtZW50SWQ9ZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7Ci0gICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgewotICAgICAgIElOVCBjaDsKLSAgICAgICBJTlQgbWF4U2ZiUGVyR3JvdXBbMl07Ci0gICAgICAgSU5UIHNmYkNudFsyXTsKLSAgICAgICBJTlQgc2ZiUGVyR3JvdXBbMl07CisgIC8qIGdsb2JhbCBtYXhpbXVtIG9mIG1heFNmYlBlckdyb3VwICovCisgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDsgZWxlbWVudElkIDwgbkVsZW1lbnRzOyBlbGVtZW50SWQrKykgeworICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgeworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7IGNoKyspIHsKKyAgICAgICAgZ2xvYmFsTWF4U2ZiID0KKyAgICAgICAgICAgIGZNYXgoZ2xvYmFsTWF4U2ZiLAorICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cCk7CisgICAgICB9CisgICAgfQorICB9CiAKLSAgICAgICBmb3IoY2g9MDsgY2g8Y20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7IGNoKyspIHsKLSAgICAgICAgIG1heFNmYlBlckdyb3VwW2NoXSA9IHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwLTE7Ci0gICAgICAgICBzZmJDbnRbY2hdICAgICAgICAgPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7Ci0gICAgICAgICBzZmJQZXJHcm91cFtjaF0gICAgPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cDsKLSAgICAgICB9CisgIC8qIGFzIGxvbmcgYXMgZ2xvYmFsUEUgaXMgYWJvdmUgZGVzaXJlUEUgcmVkdWNlIFNOUiB0byAxLjAgZEIsIHN0YXJ0aW5nIGF0CisgICAqIGhpZ2hlc3QgU0ZCICovCisgIHdoaWxlICgobmV3R2xvYmFsUGUgPiBkZXNpcmVkUGUpICYmICgtLWdsb2JhbE1heFNmYiA+PSAwKSkgeworICAgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDsgZWxlbWVudElkIDwgbkVsZW1lbnRzOyBlbGVtZW50SWQrKykgeworICAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CisgICAgICAgIFBFX0RBVEEgKnBlRGF0YSA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOwogCi0gICAgICAgUEVfREFUQSAqcGVEYXRhID0gJnFjRWxlbWVudFtlbGVtZW50SWRdLT5wZURhdGE7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CisgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbiA9IHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWxbY2hdOworICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9CisgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF07CiAKLSAgICAgICBkbwotICAgICAgIHsKLSAgICAgICAgIGZvcihjaD0wOyBjaDxjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgeworICAgICAgICAgIC8qIHRyeSB0byByZWR1Y2UgU05SIG9mIGNoYW5uZWwncyB1cHBlcm1vc3QgU0ZCKHMpICovCisgICAgICAgICAgaWYgKGdsb2JhbE1heFNmYiA8IHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwKSB7CisgICAgICAgICAgICBJTlQgc2ZiLCBkZWx0YVBlID0gMDsKIAotICAgICAgICAgICAgSU5UIHNmYiwgc2ZiR3JwOwotICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgICpxY091dENoYW4gPSBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsW2NoXTsKLSAgICAgICAgICAgIElOVCBub1JlZHVjdGlvbiA9IDE7CisgICAgICAgICAgICBmb3IgKHNmYiA9IGdsb2JhbE1heFNmYjsgc2ZiIDwgcHN5T3V0Q2hhbi0+c2ZiQ250OworICAgICAgICAgICAgICAgICBzZmIgKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApIHsKKyAgICAgICAgICAgICAgaWYgKGFoRmxhZ1tlbGVtZW50SWRdW2NoXVtzZmJdICE9IE5PX0FIICYmCisgICAgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJdIDwgU25yTGRGYWMgJiYKKyAgICAgICAgICAgICAgICAgIChxY091dENoYW4tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYl0gPgorICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYl0gLSBTbnJMZEZhYykpIHsKKyAgICAgICAgICAgICAgICAvKiBpbmNyZWFzZSB0aHJlc2hvbGQgdG8gbmV3IG1pblNuciBvZiAxZEIgKi8KKyAgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJdID0gU25yTGRGYWM7CisgICAgICAgICAgICAgICAgcWNPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiXSA9CisgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiXSArIFNuckxkRmFjOwogCi0gICAgICAgICAgICBpZiAobWF4U2ZiUGVyR3JvdXBbY2hdPj0wKSB7ICAvKiBzZmIgaW4gbmV4dCBjaGFubmVsICovCi0gICAgICAgICAgICAgIElOVCBkZWx0YVBlID0gMDsKLSAgICAgICAgICAgICAgc2ZiID0gbWF4U2ZiUGVyR3JvdXBbY2hdLS07Ci0gICAgICAgICAgICAgIG5vUmVkdWN0aW9uID0gMDsKKyAgICAgICAgICAgICAgICAvKiBjYWxjIG5ldyBwZSAqLworICAgICAgICAgICAgICAgIC8qIEMyICsgQzMqbGQoMS8wLjgpID0gMS41ICovCisgICAgICAgICAgICAgICAgZGVsdGFQZSAtPSBwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYlBlW3NmYl07CiAKLSAgICAgICAgICAgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBzZmJDbnRbY2hdOyBzZmJHcnAgKz0gc2ZiUGVyR3JvdXBbY2hdKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYWhGbGFnW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdICE9IE5PX0FIICYmCi0gICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdIDwgU25yTGRGYWMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLyogaW5jcmVhc2UgdGhyZXNob2xkIHRvIG5ldyBtaW5TbnIgb2YgMWRCICovCi0gICAgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXSA9IFNuckxkRmFjOwotCi0gICAgICAgICAgICAgICAgICAvKiBzZmJUaHJSZWR1Y2VkID0gbWF4KHBzeU91dENoYW5bY2hdLT5zZmJNaW5TbnJbaV0gKiBzZmJFbiwgc2ZiVGhyKTsgKi8KLSAgICAgICAgICAgICAgICAgIGlmICggcWNPdXRDaGFuLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSA+PSBxY091dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSAtIHFjT3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdICkgewotCi0gICAgICAgICAgICAgICAgICAgICBxY091dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnArc2ZiXSA9IHFjT3V0Q2hhbi0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0gKyBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YVtzZmJHcnArc2ZiXTsKLQotICAgICAgICAgICAgICAgICAgICAgLyogY2FsYyBuZXcgcGUgKi8KLSAgICAgICAgICAgICAgICAgICAgIC8qIEMyICsgQzMqbGQoMS8wLjgpID0gMS41ICovCi0gICAgICAgICAgICAgICAgICAgICBkZWx0YVBlIC09IChwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYlBlW3NmYkdycCtzZmJdPj5QRV9DT05TVFBBUlRfU0hJRlQpOwotCi0gICAgICAgICAgICAgICAgICAgICAvKiBzZmJQZSA9IDEuNSAqIHNmYk5MaW5lcyAqLwotICAgICAgICAgICAgICAgICAgICAgcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJQZVtzZmJHcnArc2ZiXSA9ICgzKnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiTkxpbmVzW3NmYkdycCtzZmJdKSA8PCAoUEVfQ09OU1RQQVJUX1NISUZULTEpOwotICAgICAgICAgICAgICAgICAgICAgZGVsdGFQZSArPSAocGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJQZVtzZmJHcnArc2ZiXT4+UEVfQ09OU1RQQVJUX1NISUZUKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIH0gLyogc2ZiR3JwIGxvb3AgKi8KLQotICAgICAgICAgICAgICBwZURhdGEtPnBlICs9IGRlbHRhUGU7Ci0gICAgICAgICAgICAgIHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0ucGUgKz0gZGVsdGFQZTsKLSAgICAgICAgICAgICAgbmV3R2xvYmFsUGUgKz0gZGVsdGFQZTsKLQotICAgICAgICAgICAgICAvKiBzdG9wIGlmIGVub3VnaCBoYXMgYmVlbiBzYXZlZCAqLwotICAgICAgICAgICAgICBpZiAocGVEYXRhLT5wZSA8PSBkZXNpcmVkUGUpIHsKLSAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICAgICAgLyogc2ZiUGUgPSAxLjUgKiBzZmJOTGluZXMgKi8KKyAgICAgICAgICAgICAgICBwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYlBlW3NmYl0gPQorICAgICAgICAgICAgICAgICAgICAoMyAqIHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiTkxpbmVzW3NmYl0pCisgICAgICAgICAgICAgICAgICAgIDw8IChQRV9DT05TVFBBUlRfU0hJRlQgLSAxKTsKKyAgICAgICAgICAgICAgICBkZWx0YVBlICs9IHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiUGVbc2ZiXTsKICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB9IC8qIHNmYiA+IDAgKi8KKyAgICAgICAgICAgIH0gLyogc2ZiIGxvb3AgKi8KIAotICAgICAgICAgICAgaWYgKCAoY2g9PShjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbC0xKSkgJiYgbm9SZWR1Y3Rpb24gKSB7Ci0gICAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlbHRhUGUgPj49IFBFX0NPTlNUUEFSVF9TSElGVDsKKyAgICAgICAgICAgIHBlRGF0YS0+cGUgKz0gZGVsdGFQZTsKKyAgICAgICAgICAgIHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0ucGUgKz0gZGVsdGFQZTsKKyAgICAgICAgICAgIG5ld0dsb2JhbFBlICs9IGRlbHRhUGU7CiAKLSAgICAgICAgIH0gLyogY2ggbG9vcCAqLworICAgICAgICAgIH0gLyogaWYgZ2xvYmFsTWF4U2ZiIDwgbWF4U2ZiUGVyR3JvdXAgKi8KIAotICAgICAgIH0gd2hpbGUgKCBwZURhdGEtPnBlID4gZGVzaXJlZFBlKTsKKyAgICAgICAgICAvKiBzdG9wIGlmIGVub3VnaCBoYXMgYmVlbiBzYXZlZCAqLworICAgICAgICAgIGlmIChuZXdHbG9iYWxQZSA8PSBkZXNpcmVkUGUpIHsKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICB9CiAKLSAgICAgfSAvKiAhPSBJRF9EU0UgKi8KLSAgIH0gLyogZWxlbWVudCBsb29wICovCi0KKyAgICAgICAgfSAvKiBjaCBsb29wICovCisgICAgICB9ICAgLyogIT0gSURfRFNFICovCisgICAgfSAgICAgLyogZWxlbWVudElkIGxvb3AgKi8KKyAgfSAgICAgICAvKiB3aGlsZSAoIG5ld0dsb2JhbFBlID4gZGVzaXJlZFBlKSAmJiAoLS1nbG9iYWxNYXhTZmIgPj0gMCkgKSAqLwogCiBiYWlsOgotICAgLyogdXBkYXRlIGdsb2JhbCBQRSAqLwotICAgKnJlZFBlR2xvYmFsID0gbmV3R2xvYmFsUGU7CisgIC8qIHVwZGF0ZSBnbG9iYWwgUEUgKi8KKyAgKnJlZFBlR2xvYmFsID0gbmV3R2xvYmFsUGU7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfYWxsb3dNb3JlSG9sZXMKICAgICBkZXNjcmlwdGlvbjogIGlmIHRoZSBkZXNpcmVkIHBlIGNhbiBub3QgYmUgcmVhY2hlZCwgc29tZSBtb3JlIHNjYWxlZmFjdG9yCiAgICAgICAgICAgICAgICAgICBiYW5kcyBoYXZlIHRvIGJlIHF1YW50aXplZCB0byB6ZXJvCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19hbGxvd01vcmVIb2xlcyhDSEFOTkVMX01BUFBJTkcqIGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqICBxY0VsZW1lbnRbKDgpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogcHN5T3V0RWxlbWVudFsoOCldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQqICAgICBBZGpUaHJTdGF0ZUVsZW1lbnRbKDgpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgYWhGbGFnWyg4KV1bKDIpXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBkZXNpcmVkUGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIGN1cnJlbnRQZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgcHJvY2Vzc0VsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICBlbGVtZW50T2Zmc2V0KQoteworc3RhdGljIHZvaWQgRkRLYWFjRW5jX2FsbG93TW9yZUhvbGVzKAorICAgIGNvbnN0IENIQU5ORUxfTUFQUElORyAqY29uc3QgY20sIFFDX09VVF9FTEVNRU5UICpjb25zdCBxY0VsZW1lbnRbKCg4KSldLAorICAgIGNvbnN0IFBTWV9PVVRfRUxFTUVOVCAqY29uc3QgcHN5T3V0RWxlbWVudFsoKDgpKV0sCisgICAgY29uc3QgQVRTX0VMRU1FTlQgKmNvbnN0IEFkalRoclN0YXRlRWxlbWVudFsoKDgpKV0sCisgICAgVUNIQVIgYWhGbGFnWygoOCkpXVsoMildW01BWF9HUk9VUEVEX1NGQl0sIGNvbnN0IElOVCBkZXNpcmVkUGUsCisgICAgY29uc3QgSU5UIGN1cnJlbnRQZSwgY29uc3QgaW50IHByb2Nlc3NFbGVtZW50cywgY29uc3QgaW50IGVsZW1lbnRPZmZzZXQpIHsKICAgSU5UIGVsZW1lbnRJZDsKLSAgSU5UIG5FbGVtZW50cyA9IGVsZW1lbnRPZmZzZXQrcHJvY2Vzc0VsZW1lbnRzOworICBJTlQgbkVsZW1lbnRzID0gZWxlbWVudE9mZnNldCArIHByb2Nlc3NFbGVtZW50czsKICAgSU5UIGFjdFBlID0gY3VycmVudFBlOwogCiAgIGlmIChhY3RQZSA8PSBkZXNpcmVkUGUpIHsKICAgICByZXR1cm47IC8qIG5vdGhpbmcgdG8gZG8gKi8KICAgfQogCi0gIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7CisgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDsgZWxlbWVudElkIDwgbkVsZW1lbnRzOyBlbGVtZW50SWQrKykgewogICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgewotCiAgICAgICBJTlQgY2gsIHNmYiwgc2ZiR3JwOwogCiAgICAgICBQRV9EQVRBICpwZURhdGEgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YTsKICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKIAotICAgICAgUUNfT1VUX0NIQU5ORUwqICBxY091dENoYW5uZWxbKDIpXSA9IHtOVUxMfTsKLSAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildID0ge05VTEx9OworICAgICAgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbm5lbFsoMildID0ge05VTEx9OworICAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFubmVsWygyKV0gPSB7TlVMTH07CiAKLSAgICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0KKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgewogICAgICAgICAvKiBpbml0IHBvaW50ZXJzICovCiAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0gPSBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsW2NoXTsKICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0gPSBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdOwogCi0gICAgICAgIGZvcihzZmJHcnA9MDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsgc2ZiR3JwKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7Ci0gICAgICAgICAgZm9yIChzZmI9cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwOyBzZmI8cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgICAgICAgcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJQZVtzZmJHcnArc2ZiXSA9IDA7CisgICAgICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudDsKKyAgICAgICAgICAgICBzZmJHcnAgKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7CisgICAgICAgICAgZm9yIChzZmIgPSBwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7CisgICAgICAgICAgICAgICBzZmIgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgICAgICBwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYlBlW3NmYkdycCArIHNmYl0gPSAwOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogCiAgICAgICAvKiBmb3IgTVMgYWxsb3cgaG9sZSBpbiB0aGUgY2hhbm5lbCB3aXRoIGxlc3MgZW5lcmd5ICovCi0gICAgICBpZiAoIG5DaGFubmVscz09MiAmJiBwc3lPdXRDaGFubmVsWzBdLT5sYXN0V2luZG93U2VxdWVuY2U9PXBzeU91dENoYW5uZWxbMV0tPmxhc3RXaW5kb3dTZXF1ZW5jZSApIHsKLQotICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbFswXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgICAgZm9yKHNmYkdycD0wOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsWzBdLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbm5lbFswXS0+c2ZiUGVyR3JvdXApIHsKLSAgICAgICAgICAgIGlmIChwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnRvb2xzSW5mby5tc01hc2tbc2ZiR3JwK3NmYl0pIHsKLSAgICAgICAgICAgICAgRklYUF9EQkwgRW5lcmd5TGRfTCA9IHFjT3V0Q2hhbm5lbFswXS0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl07Ci0gICAgICAgICAgICAgIEZJWFBfREJMIEVuZXJneUxkX1IgPSBxY091dENoYW5uZWxbMV0tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdOworICAgICAgaWYgKG5DaGFubmVscyA9PSAyICYmIHBzeU91dENoYW5uZWxbMF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5sYXN0V2luZG93U2VxdWVuY2UpIHsKKyAgICAgICAgZm9yIChzZmIgPSBwc3lPdXRDaGFubmVsWzBdLT5tYXhTZmJQZXJHcm91cCAtIDE7IHNmYiA+PSAwOyBzZmItLSkgeworICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiQ250OworICAgICAgICAgICAgICAgc2ZiR3JwICs9IHBzeU91dENoYW5uZWxbMF0tPnNmYlBlckdyb3VwKSB7CisgICAgICAgICAgICBpZiAocHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT50b29sc0luZm8ubXNNYXNrW3NmYkdycCArIHNmYl0pIHsKKyAgICAgICAgICAgICAgRklYUF9EQkwgRW5lcmd5TGRfTCA9CisgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0tPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYkdycCArIHNmYl07CisgICAgICAgICAgICAgIEZJWFBfREJMIEVuZXJneUxkX1IgPQorICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzFdLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnAgKyBzZmJdOwogCiAgICAgICAgICAgICAgIC8qIGFsbG93IGhvbGUgaW4gc2lkZSBjaGFubmVsID8gKi8KLSAgICAgICAgICAgICAgaWYgKCAoYWhGbGFnW2VsZW1lbnRJZF1bMV1bc2ZiR3JwK3NmYl0gIT0gTk9fQUgpICYmCi0gICAgICAgICAgICAgICAgICAgKCgoRkwyRlhDT05TVF9EQkwoLTAuMDIwNjU1MTI2NDhmKT4+MSkgKyAocWNPdXRDaGFubmVsWzBdLT5zZmJNaW5TbnJMZERhdGFbc2ZiR3JwK3NmYl0+PjEpKQotICAgICAgICAgICAgICAgICAgICAgICAgPiAoKEVuZXJneUxkX1I+PjEpIC0gKEVuZXJneUxkX0w+PjEpKSkgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBhaEZsYWdbZWxlbWVudElkXVsxXVtzZmJHcnArc2ZiXSA9IE5PX0FIOwotICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzFdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0gPSBGTDJGWENPTlNUX0RCTCgwLjAxNTYyNWYpICsgRW5lcmd5TGRfUjsKLSAgICAgICAgICAgICAgICAgIGFjdFBlIC09IHBlRGF0YS0+cGVDaGFubmVsRGF0YVsxXS5zZmJQZVtzZmJHcnArc2ZiXT4+UEVfQ09OU1RQQVJUX1NISUZUOworICAgICAgICAgICAgICBpZiAoKGFoRmxhZ1tlbGVtZW50SWRdWzFdW3NmYkdycCArIHNmYl0gIT0gTk9fQUgpICYmCisgICAgICAgICAgICAgICAgICAoKChGTDJGWENPTlNUX0RCTCgtMC4wMjA2NTUxMjY0OGYpID4+IDEpICsKKyAgICAgICAgICAgICAgICAgICAgKHFjT3V0Q2hhbm5lbFswXS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCArIHNmYl0gPj4gMSkpID4KKyAgICAgICAgICAgICAgICAgICAoKEVuZXJneUxkX1IgPj4gMSkgLSAoRW5lcmd5TGRfTCA+PiAxKSkpKSB7CisgICAgICAgICAgICAgICAgYWhGbGFnW2VsZW1lbnRJZF1bMV1bc2ZiR3JwICsgc2ZiXSA9IE5PX0FIOworICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFsxXS0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCArIHNmYl0gPQorICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjAxNTYyNWYpICsgRW5lcmd5TGRfUjsKKyAgICAgICAgICAgICAgICBhY3RQZSAtPSBwZURhdGEtPnBlQ2hhbm5lbERhdGFbMV0uc2ZiUGVbc2ZiR3JwICsgc2ZiXSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgIFBFX0NPTlNUUEFSVF9TSElGVDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAvKiBhbGxvdyBob2xlIGluIG1pZCBjaGFubmVsID8gKi8KLSAgICAgICAgICAgICAgZWxzZSBpZiAoIChhaEZsYWdbZWxlbWVudElkXVswXVtzZmJHcnArc2ZiXSAhPSBOT19BSCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICgoKEZMMkZYQ09OU1RfREJMKC0wLjAyMDY1NTEyNjQ4Zik+PjEpICsgKHFjT3V0Q2hhbm5lbFsxXS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCtzZmJdPj4xKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAoKEVuZXJneUxkX0w+PjEpIC0gKEVuZXJneUxkX1I+PjEpKSkgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBhaEZsYWdbZWxlbWVudElkXVswXVtzZmJHcnArc2ZiXSA9IE5PX0FIOwotICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0gPSBGTDJGWENPTlNUX0RCTCgwLjAxNTYyNWYpICsgRW5lcmd5TGRfTDsKLSAgICAgICAgICAgICAgICAgIGFjdFBlIC09IHBlRGF0YS0+cGVDaGFubmVsRGF0YVswXS5zZmJQZVtzZmJHcnArc2ZiXT4+UEVfQ09OU1RQQVJUX1NISUZUOworICAgICAgICAgICAgICBlbHNlIGlmICgoYWhGbGFnW2VsZW1lbnRJZF1bMF1bc2ZiR3JwICsgc2ZiXSAhPSBOT19BSCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgKCgoRkwyRlhDT05TVF9EQkwoLTAuMDIwNjU1MTI2NDhmKSA+PiAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKHFjT3V0Q2hhbm5lbFsxXS0+c2ZiTWluU25yTGREYXRhW3NmYkdycCArIHNmYl0gPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgMSkpID4gKChFbmVyZ3lMZF9MID4+IDEpIC0gKEVuZXJneUxkX1IgPj4gMSkpKSkgeworICAgICAgICAgICAgICAgIGFoRmxhZ1tlbGVtZW50SWRdWzBdW3NmYkdycCArIHNmYl0gPSBOT19BSDsKKyAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnAgKyBzZmJdID0KKyAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4wMTU2MjVmKSArIEVuZXJneUxkX0w7CisgICAgICAgICAgICAgICAgYWN0UGUgLT0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhWzBdLnNmYlBlW3NmYkdycCArIHNmYl0gPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICBQRV9DT05TVFBBUlRfU0hJRlQ7CiAgICAgICAgICAgICAgIH0gLyogaWYgKGFoRmxhZykgKi8KLSAgICAgICAgICAgIH0gLyogaWYgTVMgKi8KLSAgICAgICAgICB9IC8qIHNmYkdycCAqLworICAgICAgICAgICAgfSAgIC8qIGlmIE1TICovCisgICAgICAgICAgfSAgICAgLyogc2ZiR3JwICovCiAgICAgICAgICAgaWYgKGFjdFBlIDw9IGRlc2lyZWRQZSkgewogICAgICAgICAgICAgcmV0dXJuOyAvKiBzdG9wIGlmIGVub3VnaCBoYXMgYmVlbiBzYXZlZCAqLwogICAgICAgICAgIH0KICAgICAgICAgfSAvKiBzZmIgKi8KLSAgICAgIH0gLyogTVMgcG9zc2libGUgPyAqLwotCi0gICAgICAvKiBtb3JlIGhvbGVzIG5lY2Vzc2FyeT8gc3Vic2VxdWVudGx5IGVyYXNlIGJhbmRzCi0gICAgICAgICBzdGFydGluZyB3aXRoIGxvdyBlbmVyZ2llcyAqLwotICAgICAgSU5UIHN0YXJ0U2ZiWzJdOwotICAgICAgRklYUF9EQkwgYXZnRW5MRDY0LG1pbkVuTEQ2NDsKLSAgICAgIElOVCBhaENudDsKLSAgICAgIEZJWFBfREJMIGFoQ250TEQ2NDsKLSAgICAgIElOVCBlbklkeDsKLSAgICAgIEZJWFBfREJMIGVuTEQ2NFs0XTsKLSAgICAgIEZJWFBfREJMIGF2Z0VuOwotCi0gICAgICAvKiBkbyBub3QgZ28gYmVsb3cgc3RhcnRTZmIgKi8KLSAgICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgIGlmIChwc3lPdXRDaGFubmVsW2NoXS0+bGFzdFdpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykKLSAgICAgICAgICBzdGFydFNmYltjaF0gPSBBZGpUaHJTdGF0ZUVsZW1lbnRbZWxlbWVudElkXS0+YWhQYXJhbS5zdGFydFNmYkw7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBzdGFydFNmYltjaF0gPSBBZGpUaHJTdGF0ZUVsZW1lbnRbZWxlbWVudElkXS0+YWhQYXJhbS5zdGFydFNmYlM7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNhbGMgYXZnIGFuZCBtaW4gZW5lcmdpZXMgb2YgYmFuZHMgdGhhdCBhdm9pZCBob2xlcyAqLwotICAgICAgYXZnRW4gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgIG1pbkVuTEQ2NCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgYWhDbnQgPSAwOwotCi0gICAgICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotCi0gICAgICAgIHNmYkdycD0wOwotICAgICAgICBzZmI9c3RhcnRTZmJbY2hdOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICBmb3IgKDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgICAgICAgIGlmICgoYWhGbGFnW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdIT1OT19BSCkgJiYKLSAgICAgICAgICAgICAgICAocWNPdXRDaGFubmVsW2NoXS0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0gPiBxY091dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0pKXsKLSAgICAgICAgICAgICAgbWluRW5MRDY0ID0gZml4TWluKG1pbkVuTEQ2NCxxY091dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl0pOwotICAgICAgICAgICAgICBhdmdFbiArPSBxY091dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0gPj4gNjsKLSAgICAgICAgICAgICAgYWhDbnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzZmJHcnAgKz0gcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwOwotICAgICAgICAgIHNmYj0wOwotCi0gICAgICAgIH0gd2hpbGUgKHNmYkdycCA8IHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQpOwotICAgICAgfQotCi0gICAgICBpZiAoIChhdmdFbiA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgfHwgKGFoQ250ID09IDApICkgewotICAgICAgICBhdmdFbkxENjQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBhdmdFbkxENjQgPSBDYWxjTGREYXRhKGF2Z0VuKTsKLSAgICAgICAgYWhDbnRMRDY0ID0gQ2FsY0xkSW50KGFoQ250KTsKLSAgICAgICAgYXZnRW5MRDY0ID0gYXZnRW5MRDY0ICsgRkwyRlhDT05TVF9EQkwoMC4wOTM3NWYpIC0gYWhDbnRMRDY0OyAvKiBjb21wZW5zYXRlIHNoaWZ0IHdpdGggNiAqLwotICAgICAgfQotCi0gICAgICAvKiBjYWxjIHNvbWUgZW5lcmd5IGJvcmRlcnMgYmV0d2VlbiBtaW5FbiBhbmQgYXZnRW4gKi8KLSAgICAgIC8qIGZvciAoZW5JZHg9MDsgZW5JZHg8NDsgZW5JZHgrKykgKi8KLSAgICAgICAgLyogZW5bZW5JZHhdID0gbWluRW4gKiAoZmxvYXQpRkRLcG93KGF2Z0VuLyhtaW5FbitGTFRfTUlOKSwgKDIqZW5JZHgrMSkvNy4wZik7ICovCi0gICAgICBlbkxENjRbMF0gPSBtaW5FbkxENjQgKyBmTXVsdCgoYXZnRW5MRDY0LW1pbkVuTEQ2NCksRkwyRlhDT05TVF9EQkwoMC4xNDI4NTcxNDI4NWYpKTsKLSAgICAgIGVuTEQ2NFsxXSA9IG1pbkVuTEQ2NCArIGZNdWx0KChhdmdFbkxENjQtbWluRW5MRDY0KSxGTDJGWENPTlNUX0RCTCgwLjQyODU3MTQyODU3ZikpOwotICAgICAgZW5MRDY0WzJdID0gbWluRW5MRDY0ICsgZk11bHQoKGF2Z0VuTEQ2NC1taW5FbkxENjQpLEZMMkZYQ09OU1RfREJMKDAuNzE0Mjg1NzE0MjhmKSk7Ci0gICAgICBlbkxENjRbM10gPSBtaW5FbkxENjQgKyAoYXZnRW5MRDY0LW1pbkVuTEQ2NCk7Ci0KLSAgICAgIGZvciAoZW5JZHg9MDsgZW5JZHg8NDsgZW5JZHgrKykgewotICAgICAgICBJTlQgbm9SZWR1Y3Rpb24gPSAxOwotCi0gICAgICAgIElOVCBtYXhTZmJQZXJHcm91cFsyXTsKLSAgICAgICAgSU5UIHNmYkNudFsyXTsKLSAgICAgICAgSU5UIHNmYlBlckdyb3VwWzJdOwotCi0gICAgICAgIGZvcihjaD0wOyBjaDxjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgewotICAgICAgICAgIG1heFNmYlBlckdyb3VwW2NoXSA9IHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwLTE7Ci0gICAgICAgICAgc2ZiQ250W2NoXSAgICAgICAgID0gcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OwotICAgICAgICAgIHNmYlBlckdyb3VwW2NoXSAgICA9IHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwOwotICAgICAgICB9Ci0KLSAgICAgICAgZG8gewotCi0gICAgICAgICAgbm9SZWR1Y3Rpb24gPSAxOwotCi0gICAgICAgICAgZm9yKGNoPTA7IGNoPGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7Ci0KLSAgICAgICAgICAgIElOVCBzZmIsIHNmYkdycDsKLQotICAgICAgICAgICAgLyogc3RhcnQgd2l0aCBsb3dlc3QgZW5lcmd5IGJvcmRlciBhdCBoaWdoZXN0IHNmYiAqLwotICAgICAgICAgICAgaWYgKG1heFNmYlBlckdyb3VwW2NoXT49c3RhcnRTZmJbY2hdKSB7ICAvKiBzZmIgaW4gbmV4dCBjaGFubmVsICovCi0gICAgICAgICAgICAgIHNmYiA9IG1heFNmYlBlckdyb3VwW2NoXS0tOwotICAgICAgICAgICAgICBub1JlZHVjdGlvbiA9IDA7Ci0KLSAgICAgICAgICAgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBzZmJDbnRbY2hdOyBzZmJHcnAgKz0gc2ZiUGVyR3JvdXBbY2hdKSB7Ci0gICAgICAgICAgICAgICAgLyogc2ZiIGVuZXJneSBiZWxvdyBib3JkZXIgPyAqLwotICAgICAgICAgICAgICAgIGlmIChhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwK3NmYl0gIT0gTk9fQUggJiYgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdIDwgZW5MRDY0W2VuSWR4XSkgewotICAgICAgICAgICAgICAgICAgLyogYWxsb3cgaG9sZSAqLwotICAgICAgICAgICAgICAgICAgYWhGbGFnW2VsZW1lbnRJZF1bY2hdW3NmYkdycCtzZmJdID0gTk9fQUg7Ci0gICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0gPSBGTDJGWENPTlNUX0RCTCgwLjAxNTYyNWYpICsgcWNPdXRDaGFubmVsW2NoXS0+c2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbc2ZiR3JwK3NmYl07Ci0gICAgICAgICAgICAgICAgICBhY3RQZSAtPSBwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYlBlW3NmYkdycCtzZmJdPj5QRV9DT05TVFBBUlRfU0hJRlQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9IC8qIHNmYkdycCAgKi8KLQotICAgICAgICAgICAgICBpZiAoYWN0UGUgPD0gZGVzaXJlZFBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOyAvKiBzdG9wIGlmIGVub3VnaCBoYXMgYmVlbiBzYXZlZCAqLwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IC8qIHNmYiA+IDAgKi8KLSAgICAgICAgICB9IC8qIGNoIGxvb3AgKi8KLQotICAgICAgICB9IHdoaWxlKCAobm9SZWR1Y3Rpb24gPT0gMCkgJiYgKGFjdFBlID4gZGVzaXJlZFBlKSApOwotCi0gICAgICAgIGlmIChhY3RQZSA8PSBkZXNpcmVkUGUpIHsKLSAgICAgICAgICByZXR1cm47IC8qIHN0b3AgaWYgZW5vdWdoIGhhcyBiZWVuIHNhdmVkICovCi0gICAgICAgIH0KLQotICAgICAgfSAvKiBlbklkeCBsb29wICovCisgICAgICB9ICAgLyogTVMgcG9zc2libGUgPyAqLwogCiAgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCi0gIH0gLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KKyAgfSAgIC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCiAKKyAgaWYgKGFjdFBlID4gZGVzaXJlZFBlKSB7CisgICAgLyogbW9yZSBob2xlcyBuZWNlc3Nhcnk/IHN1YnNlcXVlbnRseSBlcmFzZSBiYW5kcyBzdGFydGluZyB3aXRoIGxvdyBlbmVyZ2llcworICAgICAqLworICAgIElOVCBjaCwgc2ZiLCBzZmJHcnA7CisgICAgSU5UIG1pblNmYiwgbWF4U2ZiOworICAgIElOVCBlbklkeCwgYWhDbnQsIGRvbmU7CisgICAgSU5UIHN0YXJ0U2ZiWyg4KV07CisgICAgSU5UIHNmYkNudFsoOCldOworICAgIElOVCBzZmJQZXJHcm91cFsoOCldOworICAgIElOVCBtYXhTZmJQZXJHcm91cFsoOCldOworICAgIEZJWFBfREJMIGF2Z0VuOworICAgIEZJWFBfREJMIG1pbkVuTEQ2NDsKKyAgICBGSVhQX0RCTCBhdmdFbkxENjQ7CisgICAgRklYUF9EQkwgZW5MRDY0W05VTV9OUkdfTEVWU107CisgICAgSU5UIGF2Z0VuX2U7CisKKyAgICAvKiBnZXQgdGhlIHNjYWxpbmcgZmFjdG9yIG92ZXIgYWxsIGF1ZGlvIGVsZW1lbnRzIGFuZCBjaGFubmVscyAqLworICAgIG1heFNmYiA9IDA7CisgICAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0OyBlbGVtZW50SWQgPCBuRWxlbWVudHM7IGVsZW1lbnRJZCsrKSB7CisgICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7IGNoKyspIHsKKyAgICAgICAgICBmb3IgKHNmYkdycCA9IDA7CisgICAgICAgICAgICAgICBzZmJHcnAgPCBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7CisgICAgICAgICAgICAgICBzZmJHcnAgKz0KKyAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwKSB7CisgICAgICAgICAgICBtYXhTZmIgKz0KKyAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgYXZnRW5fZSA9CisgICAgICAgIChERlJBQ1RfQklUUyAtIGZpeG5vcm16X0QoKExPTkcpZk1heCgwLCBtYXhTZmIgLSAxKSkpOyAvKiBpbG9nMigpICovCisKKyAgICBhaENudCA9IDA7CisgICAgbWF4U2ZiID0gMDsKKyAgICBtaW5TZmIgPSBNQVhfU0ZCOworICAgIGF2Z0VuID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgbWluRW5MRDY0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisKKyAgICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7IGVsZW1lbnRJZCA8IG5FbGVtZW50czsgZWxlbWVudElkKyspIHsKKyAgICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgeworICAgICAgICAgIGNvbnN0IElOVCBjaElkeCA9IGNtLT5lbEluZm9bZWxlbWVudElkXS5DaGFubmVsSW5kZXhbY2hdOworICAgICAgICAgIFFDX09VVF9DSEFOTkVMICpxY091dENoYW5uZWwgPSBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsW2NoXTsKKyAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5uZWwgPQorICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWxbY2hdOworCisgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hJZHhdID0gcHN5T3V0Q2hhbm5lbC0+bWF4U2ZiUGVyR3JvdXA7CisgICAgICAgICAgc2ZiQ250W2NoSWR4XSA9IHBzeU91dENoYW5uZWwtPnNmYkNudDsKKyAgICAgICAgICBzZmJQZXJHcm91cFtjaElkeF0gPSBwc3lPdXRDaGFubmVsLT5zZmJQZXJHcm91cDsKKworICAgICAgICAgIG1heFNmYiA9IGZNYXgobWF4U2ZiLCBwc3lPdXRDaGFubmVsLT5tYXhTZmJQZXJHcm91cCk7CisKKyAgICAgICAgICBpZiAocHN5T3V0Q2hhbm5lbC0+bGFzdFdpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykgeworICAgICAgICAgICAgc3RhcnRTZmJbY2hJZHhdID0gQWRqVGhyU3RhdGVFbGVtZW50W2VsZW1lbnRJZF0tPmFoUGFyYW0uc3RhcnRTZmJMOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGFydFNmYltjaElkeF0gPSBBZGpUaHJTdGF0ZUVsZW1lbnRbZWxlbWVudElkXS0+YWhQYXJhbS5zdGFydFNmYlM7CisgICAgICAgICAgfQorCisgICAgICAgICAgbWluU2ZiID0gZk1pbihtaW5TZmIsIHN0YXJ0U2ZiW2NoSWR4XSk7CisKKyAgICAgICAgICBzZmJHcnAgPSAwOworICAgICAgICAgIHNmYiA9IHN0YXJ0U2ZiW2NoSWR4XTsKKworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGZvciAoOyBzZmIgPCBwc3lPdXRDaGFubmVsLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgICAgICAgaWYgKChhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwICsgc2ZiXSAhPSBOT19BSCkgJiYKKyAgICAgICAgICAgICAgICAgIChxY091dENoYW5uZWwtPnNmYldlaWdodGVkRW5lcmd5TGREYXRhW3NmYkdycCArIHNmYl0gPgorICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCArIHNmYl0pKSB7CisgICAgICAgICAgICAgICAgbWluRW5MRDY0ID0gZml4TWluKG1pbkVuTEQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwICsgc2ZiXSk7CisgICAgICAgICAgICAgICAgYXZnRW4gKz0gcWNPdXRDaGFubmVsLT5zZmJFbmVyZ3lbc2ZiR3JwICsgc2ZiXSA+PiBhdmdFbl9lOworICAgICAgICAgICAgICAgIGFoQ250Kys7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2ZiR3JwICs9IHBzeU91dENoYW5uZWwtPnNmYlBlckdyb3VwOworICAgICAgICAgICAgc2ZiID0gc3RhcnRTZmJbY2hJZHhdOworCisgICAgICAgICAgfSB3aGlsZSAoc2ZiR3JwIDwgcHN5T3V0Q2hhbm5lbC0+c2ZiQ250KTsKKyAgICAgICAgfQorICAgICAgfSAvKiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpICovCisgICAgfSAgIC8qIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspICovCisKKyAgICBpZiAoKGF2Z0VuID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB8fCAoYWhDbnQgPT0gMCkpIHsKKyAgICAgIGF2Z0VuTEQ2NCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgIH0gZWxzZSB7CisgICAgICBhdmdFbkxENjQgPSBDYWxjTGREYXRhKGF2Z0VuKSArCisgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKGF2Z0VuX2UgPDwgKERGUkFDVF9CSVRTIC0gMSAtIExEX0RBVEFfU0hJRlQpKSAtCisgICAgICAgICAgICAgICAgICBDYWxjTGRJbnQoYWhDbnQpOworICAgIH0KKworICAgIC8qIGNhbGMgc29tZSBlbmVyZ3kgYm9yZGVycyBiZXR3ZWVuIG1pbkVuIGFuZCBhdmdFbiAqLworCisgICAgLyogZm9yIChlbklkeCA9IDA7IGVuSWR4IDwgTlVNX05SR19MRVZTOyBlbklkeCsrKSB7CisgICAgICAgICBlbltlbklkeF0gPSAoMi4wZiplbklkeCsxLjBmKS8oMi4wZipOVU1fTlJHX0xFVlMtMS4wZik7CisgICAgICAgfSAqLworICAgIGVuTEQ2NFswXSA9CisgICAgICAgIG1pbkVuTEQ2NCArIGZNdWx0KChhdmdFbkxENjQgLSBtaW5FbkxENjQpLCBGTDJGWENPTlNUX0RCTCgwLjA2NjY2NjY3ZikpOworICAgIGVuTEQ2NFsxXSA9CisgICAgICAgIG1pbkVuTEQ2NCArIGZNdWx0KChhdmdFbkxENjQgLSBtaW5FbkxENjQpLCBGTDJGWENPTlNUX0RCTCgwLjIwMDAwMDAwZikpOworICAgIGVuTEQ2NFsyXSA9CisgICAgICAgIG1pbkVuTEQ2NCArIGZNdWx0KChhdmdFbkxENjQgLSBtaW5FbkxENjQpLCBGTDJGWENPTlNUX0RCTCgwLjMzMzMzMzM0ZikpOworICAgIGVuTEQ2NFszXSA9CisgICAgICAgIG1pbkVuTEQ2NCArIGZNdWx0KChhdmdFbkxENjQgLSBtaW5FbkxENjQpLCBGTDJGWENPTlNUX0RCTCgwLjQ2NjY2NjY3ZikpOworICAgIGVuTEQ2NFs0XSA9CisgICAgICAgIG1pbkVuTEQ2NCArIGZNdWx0KChhdmdFbkxENjQgLSBtaW5FbkxENjQpLCBGTDJGWENPTlNUX0RCTCgwLjYwMDAwMDAyZikpOworICAgIGVuTEQ2NFs1XSA9CisgICAgICAgIG1pbkVuTEQ2NCArIGZNdWx0KChhdmdFbkxENjQgLSBtaW5FbkxENjQpLCBGTDJGWENPTlNUX0RCTCgwLjczMzMzMzM1ZikpOworICAgIGVuTEQ2NFs2XSA9CisgICAgICAgIG1pbkVuTEQ2NCArIGZNdWx0KChhdmdFbkxENjQgLSBtaW5FbkxENjQpLCBGTDJGWENPTlNUX0RCTCgwLjg2NjY2NjY3ZikpOworICAgIGVuTEQ2NFs3XSA9IG1pbkVuTEQ2NCArIChhdmdFbkxENjQgLSBtaW5FbkxENjQpOworCisgICAgZG9uZSA9IDA7CisgICAgZW5JZHggPSAwOworICAgIHNmYiA9IG1heFNmYiAtIDE7CisKKyAgICB3aGlsZSAoIWRvbmUpIHsKKyAgICAgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDsgZWxlbWVudElkIDwgbkVsZW1lbnRzOyBlbGVtZW50SWQrKykgeworICAgICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKKyAgICAgICAgICBQRV9EQVRBICpwZURhdGEgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YTsKKyAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsgY2grKykgeworICAgICAgICAgICAgY29uc3QgSU5UIGNoSWR4ID0gY20tPmVsSW5mb1tlbGVtZW50SWRdLkNoYW5uZWxJbmRleFtjaF07CisgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAqcWNPdXRDaGFubmVsID0KKyAgICAgICAgICAgICAgICBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsW2NoXTsKKyAgICAgICAgICAgIGlmIChzZmIgPj0gc3RhcnRTZmJbY2hJZHhdICYmIHNmYiA8IG1heFNmYlBlckdyb3VwW2NoSWR4XSkgeworICAgICAgICAgICAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHNmYkNudFtjaElkeF07CisgICAgICAgICAgICAgICAgICAgc2ZiR3JwICs9IHNmYlBlckdyb3VwW2NoSWR4XSkgeworICAgICAgICAgICAgICAgIC8qIHNmYiBlbmVyZ3kgYmVsb3cgYm9yZGVyID8gKi8KKyAgICAgICAgICAgICAgICBpZiAoYWhGbGFnW2VsZW1lbnRJZF1bY2hdW3NmYkdycCArIHNmYl0gIT0gTk9fQUggJiYKKyAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwICsgc2ZiXSA8CisgICAgICAgICAgICAgICAgICAgICAgICBlbkxENjRbZW5JZHhdKSB7CisgICAgICAgICAgICAgICAgICAvKiBhbGxvdyBob2xlICovCisgICAgICAgICAgICAgICAgICBhaEZsYWdbZWxlbWVudElkXVtjaF1bc2ZiR3JwICsgc2ZiXSA9IE5PX0FIOworICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwICsgc2ZiXSA9CisgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4wMTU2MjVmKSArCisgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5zZmJXZWlnaHRlZEVuZXJneUxkRGF0YVtzZmJHcnAgKyBzZmJdOworICAgICAgICAgICAgICAgICAgYWN0UGUgLT0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJQZVtzZmJHcnAgKyBzZmJdID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICBQRV9DT05TVFBBUlRfU0hJRlQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhY3RQZSA8PSBkZXNpcmVkUGUpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybjsgLyogc3RvcCBpZiBlbm91Z2ggaGFzIGJlZW4gc2F2ZWQgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gLyogc2ZiR3JwICovCisgICAgICAgICAgICB9ICAgLyogc2ZiICovCisgICAgICAgICAgfSAgICAgLyogbkNoYW5uZWxzSW5FbCAqLworICAgICAgICB9ICAgICAgIC8qIElEX0RTRSAqLworICAgICAgfSAgICAgICAgIC8qIGVsZW1lbnRJRCAqLworCisgICAgICBzZmItLTsKKyAgICAgIGlmIChzZmIgPCBtaW5TZmIpIHsKKyAgICAgICAgLyogcmVzdGFydCB3aXRoIG5leHQgZW5lcmd5IGJvcmRlciAqLworICAgICAgICBzZmIgPSBtYXhTZmI7CisgICAgICAgIGVuSWR4Kys7CisgICAgICAgIGlmIChlbklkeCA+PSBOVU1fTlJHX0xFVlMpIHsKKyAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gLyogZG9uZSAqLworICB9ICAgLyogKGFjdFBlIDw9IGRlc2lyZWRQZSkgKi8KIH0KIAogLyogcmVzZXQgYXZvaWQgaG9sZSBmbGFncyBmcm9tIEFIX0FDVElWRSB0byBBSF9JTkFDVElWRSAgKi8KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19yZXNldEFIRmxhZ3MoIFVDSEFSIGFoRmxhZ1soMildW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgKnBzeU91dENoYW5uZWxbKDIpXSkKLXsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19yZXNldEFIRmxhZ3MoCisgICAgVUNIQVIgYWhGbGFnWygyKV1bTUFYX0dST1VQRURfU0ZCXSwgY29uc3QgSU5UIG5DaGFubmVscywKKyAgICBjb25zdCBQU1lfT1VUX0NIQU5ORUwgKmNvbnN0IHBzeU91dENoYW5uZWxbKDIpXSkgewogICBpbnQgY2gsIHNmYiwgc2ZiR3JwOwogCi0gIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICBmb3IgKHNmYkdycD0wOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgewotICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5uZWxbY2hdLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgICAgaWYgKCBhaEZsYWdbY2hdW3NmYkdycCtzZmJdID09IEFIX0FDVElWRSkgewotICAgICAgICAgIGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gPSBBSF9JTkFDVElWRTsKKyAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OworICAgICAgICAgc2ZiR3JwICs9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgeworICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgIGlmIChhaEZsYWdbY2hdW3NmYkdycCArIHNmYl0gPT0gQUhfQUNUSVZFKSB7CisgICAgICAgICAgYWhGbGFnW2NoXVtzZmJHcnAgKyBzZmJdID0gQUhfSU5BQ1RJVkU7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KIH0KIAorc3RhdGljIEZJWFBfREJMIENhbGNSZWRWYWxQb3dlcihGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbnVtLCBJTlQgKnNjYWxpbmcpIHsKKyAgRklYUF9EQkwgdmFsdWUgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogCi1zdGF0aWMgRklYUF9EQkwgQ2FsY1JlZFZhbFBvd2VyKEZJWFBfREJMIG51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgZGVudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogICAgIHNjYWxpbmcgKQotewotICAgIEZJWFBfREJMIHZhbHVlID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgaWYgKG51bSA+PSBGTDJGWENPTlNUX0RCTCgwLmYpKSB7CisgICAgdmFsdWUgPSBmRGl2Tm9ybShudW0sIGRlbnVtLCBzY2FsaW5nKTsKKyAgfSBlbHNlIHsKKyAgICB2YWx1ZSA9IC1mRGl2Tm9ybSgtbnVtLCBkZW51bSwgc2NhbGluZyk7CisgIH0KKyAgdmFsdWUgPSBmMlBvdyh2YWx1ZSwgKnNjYWxpbmcsIHNjYWxpbmcpOwogCi0gICAgaWYgKG51bT49RkwyRlhDT05TVF9EQkwoMC5mKSkgewotICAgICAgdmFsdWUgPSBmRGl2Tm9ybSggbnVtLCBkZW51bSwgc2NhbGluZyk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgdmFsdWUgPSAtZkRpdk5vcm0oIC1udW0sIGRlbnVtLCBzY2FsaW5nKTsKLSAgICB9Ci0gICAgdmFsdWUgPSBmMlBvdyh2YWx1ZSwgKnNjYWxpbmcsIHNjYWxpbmcpOwotICAgICpzY2FsaW5nID0gREZSQUNUX0JJVFMtMS0qc2NhbGluZzsKLQotICAgIHJldHVybiB2YWx1ZTsKKyAgcmV0dXJuIHZhbHVlOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfYWRhcHRUaHJlc2hvbGRzVG9QZQotZGVzY3JpcHRpb246ICB0d28gZ3Vlc3NlcyBmb3IgdGhlIHJlZHVjdGlvbiB2YWx1ZSBhbmQgb25lIGZpbmFsIGNvcnJlY3Rpb24gb2YgdGhlIHRocmVzaG9sZHMKK2Rlc2NyaXB0aW9uOiAgdHdvIGd1ZXNzZXMgZm9yIHRoZSByZWR1Y3Rpb24gdmFsdWUgYW5kIG9uZSBmaW5hbCBjb3JyZWN0aW9uIG9mCit0aGUgdGhyZXNob2xkcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfYWRhcHRUaHJlc2hvbGRzVG9QZShDSEFOTkVMX01BUFBJTkcqICBjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQqICAgICAgQWRqVGhyU3RhdGVFbGVtZW50Wyg4KV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgIHFjRWxlbWVudFsoOCldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqICBwc3lPdXRFbGVtZW50Wyg4KV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgIGRlc2lyZWRQZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgbWF4SXRlcjJuZEd1ZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICBwcm9jZXNzRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgIGVsZW1lbnRPZmZzZXQpCi17Ci0gICBGSVhQX0RCTCByZWRWYWx1ZVsoOCldOwotICAgU0NIQVIgICAgcmVkVmFsU2NhbGluZ1soOCldOwotICAgVUNIQVIgICAgcEFoRmxhZ1soOCldWygyKV1bTUFYX0dST1VQRURfU0ZCXTsKLSAgIEZJWFBfREJMIHBUaHJFeHBbKDgpXVsoMildW01BWF9HUk9VUEVEX1NGQl07Ci0gICBpbnQgaXRlcjsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19hZGFwdFRocmVzaG9sZHNUb1BlKAorICAgIGNvbnN0IENIQU5ORUxfTUFQUElORyAqY29uc3QgY20sCisgICAgQVRTX0VMRU1FTlQgKmNvbnN0IEFkalRoclN0YXRlRWxlbWVudFsoKDgpKV0sCisgICAgUUNfT1VUX0VMRU1FTlQgKmNvbnN0IHFjRWxlbWVudFsoKDgpKV0sCisgICAgY29uc3QgUFNZX09VVF9FTEVNRU5UICpjb25zdCBwc3lPdXRFbGVtZW50WygoOCkpXSwgY29uc3QgSU5UIGRlc2lyZWRQZSwKKyAgICBjb25zdCBJTlQgbWF4SXRlcjJuZEd1ZXNzLCBjb25zdCBJTlQgcHJvY2Vzc0VsZW1lbnRzLAorICAgIGNvbnN0IElOVCBlbGVtZW50T2Zmc2V0KSB7CisgIEZJWFBfREJMIHJlZHVjdGlvblZhbHVlX207CisgIFNDSEFSIHJlZHVjdGlvblZhbHVlX2U7CisgIFVDSEFSKCpwQWhGbGFnKVsoMildW01BWF9HUk9VUEVEX1NGQl07CisgIEZJWFBfREJMKCpwVGhyRXhwKVsoMildW01BWF9HUk9VUEVEX1NGQl07CisgIGludCBpdGVyOwogCi0gICBJTlQgY29uc3RQYXJ0R2xvYmFsLCBub1JlZFBlR2xvYmFsLCBuQWN0aXZlTGluZXNHbG9iYWwsIHJlZFBlR2xvYmFsOwotICAgY29uc3RQYXJ0R2xvYmFsID0gbm9SZWRQZUdsb2JhbCA9IG5BY3RpdmVMaW5lc0dsb2JhbCA9IHJlZFBlR2xvYmFsID0gMDsKKyAgSU5UIGNvbnN0UGFydEdsb2JhbCwgbm9SZWRQZUdsb2JhbCwgbkFjdGl2ZUxpbmVzR2xvYmFsLCByZWRQZUdsb2JhbDsKKyAgY29uc3RQYXJ0R2xvYmFsID0gbm9SZWRQZUdsb2JhbCA9IG5BY3RpdmVMaW5lc0dsb2JhbCA9IHJlZFBlR2xvYmFsID0gMDsKIAotICAgaW50IGVsZW1lbnRJZDsKKyAgaW50IGVsZW1lbnRJZDsKIAotICAgaW50IG5FbGVtZW50cyA9IGVsZW1lbnRPZmZzZXQrcHJvY2Vzc0VsZW1lbnRzOwotICAgaWYobkVsZW1lbnRzID4gY20tPm5FbGVtZW50cykgewotICAgICBuRWxlbWVudHMgPSBjbS0+bkVsZW1lbnRzOwotICAgfQorICBpbnQgbkVsZW1lbnRzID0gZWxlbWVudE9mZnNldCArIHByb2Nlc3NFbGVtZW50czsKKyAgaWYgKG5FbGVtZW50cyA+IGNtLT5uRWxlbWVudHMpIHsKKyAgICBuRWxlbWVudHMgPSBjbS0+bkVsZW1lbnRzOworICB9CiAKLSAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgIC8qIFBhcnQgSTogSW5pdGlhbGl6ZSBkYXRhIHN0cnVjdHVyZXMgYW5kIHZhcmlhYmxlcy4uLiAqLwotICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKLSAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CisgIC8qIFRoZSByZWludGVycHJldF9jYXN0IGlzIHVzZWQgdG8gc3VwcHJlc3MgYSBjb21waWxlciB3YXJuaW5nLiBXZSBrbm93IHRoYXQKKyAgICogcWNFbGVtZW50WzBdLT5keW5NZW1fQWhfRmxhZyBpcyBzdWZmaWNpZW50bHkgYWxpZ25lZCwgc28gdGhlIGNhc3QgaXMgc2FmZQorICAgKi8KKyAgcEFoRmxhZyA9IHJlaW50ZXJwcmV0X2Nhc3Q8VUNIQVIoKilbKDIpXVtNQVhfR1JPVVBFRF9TRkJdPigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihxY0VsZW1lbnRbMF0tPmR5bk1lbV9BaF9GbGFnKSk7CisgIC8qIFRoZSByZWludGVycHJldF9jYXN0IGlzIHVzZWQgdG8gc3VwcHJlc3MgYSBjb21waWxlciB3YXJuaW5nLiBXZSBrbm93IHRoYXQKKyAgICogcWNFbGVtZW50WzBdLT5keW5NZW1fVGhyX0V4cCBpcyBzdWZmaWNpZW50bHkgYWxpZ25lZCwgc28gdGhlIGNhc3QgaXMgc2FmZQorICAgKi8KKyAgcFRockV4cCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RklYUF9EQkwoKilbKDIpXVtNQVhfR1JPVVBFRF9TRkJdPigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihxY0VsZW1lbnRbMF0tPmR5bk1lbV9UaHJfRXhwKSk7CiAKLSAgICAgICBJTlQgbkNoYW5uZWxzID0gY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7Ci0gICAgICAgUEVfREFUQSAqcGVEYXRhICAgID0gJnFjRWxlbWVudFtlbGVtZW50SWRdLT5wZURhdGE7CisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgLyogUGFydCBJOiBJbml0aWFsaXplIGRhdGEgc3RydWN0dXJlcyBhbmQgdmFyaWFibGVzLi4uICovCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0OyBlbGVtZW50SWQgPCBuRWxlbWVudHM7IGVsZW1lbnRJZCsrKSB7CisgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CisgICAgICBJTlQgbkNoYW5uZWxzID0gY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7CisgICAgICBQRV9EQVRBICpwZURhdGEgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YTsKIAotICAgICAgIC8qIHRocmVzaG9sZHMgdG8gdGhlIHBvd2VyIG9mIHJlZEV4cCAqLwotICAgICAgIEZES2FhY0VuY19jYWxjVGhyZXNoRXhwKHBUaHJFeHBbZWxlbWVudElkXSwgcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCBuQ2hhbm5lbHMpOworICAgICAgLyogdGhyZXNob2xkcyB0byB0aGUgcG93ZXIgb2YgcmVkRXhwICovCisgICAgICBGREthYWNFbmNfY2FsY1RocmVzaEV4cCgKKyAgICAgICAgICBwVGhyRXhwW2VsZW1lbnRJZF0sIHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsCisgICAgICAgICAgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCBuQ2hhbm5lbHMpOwogCi0gICAgICAgLyogbG93ZXIgdGhlIG1pblNuciByZXF1aXJlbWVudHMgZm9yIGxvdyBlbmVyZ2llcyBjb21wYXJlZCB0byB0aGUgYXZlcmFnZQotICAgICAgICAgIGVuZXJneSBpbiB0aGlzIGZyYW1lICovCi0gICAgICAgRkRLYWFjRW5jX2FkYXB0TWluU25yKHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgJkFkalRoclN0YXRlRWxlbWVudFtlbGVtZW50SWRdLT5taW5TbnJBZGFwdFBhcmFtLCBuQ2hhbm5lbHMpOworICAgICAgLyogbG93ZXIgdGhlIG1pblNuciByZXF1aXJlbWVudHMgZm9yIGxvdyBlbmVyZ2llcyBjb21wYXJlZCB0byB0aGUgYXZlcmFnZQorICAgICAgICAgZW5lcmd5IGluIHRoaXMgZnJhbWUgKi8KKyAgICAgIEZES2FhY0VuY19hZGFwdE1pblNucihxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50W2VsZW1lbnRJZF0tPm1pblNuckFkYXB0UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzKTsKIAotICAgICAgIC8qIGluaXQgYWhGbGFnICgwOiBubyBhaCBuZWNlc3NhcnksIDE6IGFoIHBvc3NpYmxlLCAyOiBhaCBhY3RpdmUgKi8KLSAgICAgICBGREthYWNFbmNfaW5pdEF2b2lkSG9sZUZsYWcocWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCBwQWhGbGFnW2VsZW1lbnRJZF0sICZwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnRvb2xzSW5mbywgbkNoYW5uZWxzLCBwZURhdGEsICZBZGpUaHJTdGF0ZUVsZW1lbnRbZWxlbWVudElkXS0+YWhQYXJhbSk7CisgICAgICAvKiBpbml0IGFoRmxhZyAoMDogbm8gYWggbmVjZXNzYXJ5LCAxOiBhaCBwb3NzaWJsZSwgMjogYWggYWN0aXZlICovCisgICAgICBGREthYWNFbmNfaW5pdEF2b2lkSG9sZUZsYWcoCisgICAgICAgICAgcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwKKyAgICAgICAgICBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsIHBBaEZsYWdbZWxlbWVudElkXSwKKyAgICAgICAgICAmcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT50b29sc0luZm8sIG5DaGFubmVscywKKyAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50W2VsZW1lbnRJZF0tPmFoUGFyYW0pOwogCi0gICAgICAgLyogc3VtIHVwICovCi0gICAgICAgY29uc3RQYXJ0R2xvYmFsICAgICs9IHBlRGF0YS0+Y29uc3RQYXJ0OwotICAgICAgIG5vUmVkUGVHbG9iYWwgICAgICArPSBwZURhdGEtPnBlOwotICAgICAgIG5BY3RpdmVMaW5lc0dsb2JhbCArPSBmaXhNYXgoKElOVClwZURhdGEtPm5BY3RpdmVMaW5lcywgMSk7CisgICAgICAvKiBzdW0gdXAgKi8KKyAgICAgIGNvbnN0UGFydEdsb2JhbCArPSBwZURhdGEtPmNvbnN0UGFydDsKKyAgICAgIG5vUmVkUGVHbG9iYWwgKz0gcGVEYXRhLT5wZTsKKyAgICAgIG5BY3RpdmVMaW5lc0dsb2JhbCArPSBmaXhNYXgoKElOVClwZURhdGEtPm5BY3RpdmVMaW5lcywgMSk7CiAKLSAgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCi0gICB9IC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCisgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCisgIH0gICAvKiBFT0YgZm9yIGFsbCBlbGVtZW50cy4uLiAqLwogCi0gICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgLyogUGFydCBJSTogQ2FsY3VsYXRlIGJpdCBjb25zdW1wdGlvbiBvZiBpbml0aWFsIGJpdCBjb25zdHJhaW50cyBzZXR1cCAqLwotICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7Ci0gICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgewotICAgICAgIC8qCi0gICAgICAgcmVkVmFsID0gKCAyIF4gKCAoY29uc3RQYXJ0R2xvYmFsLWRlc2lyZWRQZSkgLyAoaW52UmVkRXhwKm5BY3RpdmVMaW5lc0dsb2JhbCkgKQotICAgICAgICAgICAgICAgIC0gMiBeICggKGNvbnN0UGFydEdsb2JhbC1ub1JlZFBlR2xvYmFsKSAvIChpbnZSZWRFeHAqbkFjdGl2ZUxpbmVzR2xvYmFsKSApICkKLSAgICAgICAqLworICAvKgorICAgICBGaXJzdCBndWVzcyBvZiByZWR1Y3Rpb24gdmFsdWU6CisgICAgIGF2Z1RockV4cCA9IChmbG9hdClwb3coMi4wZiwgKGNvbnN0UGFydEdsb2JhbCAtIG5vUmVkUGVHbG9iYWwpLyg0LjBmICoKKyAgICAgbkFjdGl2ZUxpbmVzR2xvYmFsKSk7IHJlZFZhbCAgICA9IChmbG9hdClwb3coMi4wZiwgKGNvbnN0UGFydEdsb2JhbCAtCisgICAgIGRlc2lyZWRQZSkvKDQuMGYgKiBuQWN0aXZlTGluZXNHbG9iYWwpKSAtIGF2Z1RockV4cDsgcmVkVmFsICAgID0gbWF4KDAuZiwKKyAgICAgcmVkVmFsKTsKKyAgKi8KKyAgaW50IHJlZFZhbF9lLCBhdmdUaHJFeHBfZSwgcmVzdWx0X2U7CisgIEZJWFBfREJMIHJlZFZhbF9tLCBhdmdUaHJFeHBfbTsKIAorICByZWRWYWxfbSA9IENhbGNSZWRWYWxQb3dlcihjb25zdFBhcnRHbG9iYWwgLSBkZXNpcmVkUGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKiBuQWN0aXZlTGluZXNHbG9iYWwsICZyZWRWYWxfZSk7CisgIGF2Z1RockV4cF9tID0gQ2FsY1JlZFZhbFBvd2VyKGNvbnN0UGFydEdsb2JhbCAtIG5vUmVkUGVHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKiBuQWN0aXZlTGluZXNHbG9iYWwsICZhdmdUaHJFeHBfZSk7CisgIHJlc3VsdF9lID0gZk1heChyZWRWYWxfZSwgYXZnVGhyRXhwX2UpICsgMTsKIAotICAgICAgIElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKLSAgICAgICBQRV9EQVRBICpwZURhdGEgICAgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YTsKKyAgcmVkdWN0aW9uVmFsdWVfbSA9IGZNYXgoRkwyRlhDT05TVF9EQkwoMC5mKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShyZWRWYWxfbSwgcmVkVmFsX2UgLSByZXN1bHRfZSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShhdmdUaHJFeHBfbSwgYXZnVGhyRXhwX2UgLSByZXN1bHRfZSkpOworICByZWR1Y3Rpb25WYWx1ZV9lID0gcmVzdWx0X2U7CiAKLSAgICAgICAvKiBmaXJzdCBndWVzcyBvZiByZWR1Y3Rpb24gdmFsdWUgKi8KLSAgICAgICBpbnQgc2NhbGUwPTAsIHNjYWxlMT0wOwotICAgICAgIEZJWFBfREJMIHRtcDAgPSBDYWxjUmVkVmFsUG93ZXIoIGNvbnN0UGFydEdsb2JhbC1kZXNpcmVkUGUsIDQqbkFjdGl2ZUxpbmVzR2xvYmFsLCAmc2NhbGUwICk7Ci0gICAgICAgRklYUF9EQkwgdG1wMSA9IENhbGNSZWRWYWxQb3dlciggY29uc3RQYXJ0R2xvYmFsLW5vUmVkUGVHbG9iYWwsIDQqbkFjdGl2ZUxpbmVzR2xvYmFsLCAmc2NhbGUxICk7CisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIC8qIFBhcnQgSUk6IENhbGN1bGF0ZSBiaXQgY29uc3VtcHRpb24gb2YgaW5pdGlhbCBiaXQgY29uc3RyYWludHMgc2V0dXAgKi8KKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0OyBlbGVtZW50SWQgPCBuRWxlbWVudHM7IGVsZW1lbnRJZCsrKSB7CisgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CisgICAgICBJTlQgbkNoYW5uZWxzID0gY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7CisgICAgICBQRV9EQVRBICpwZURhdGEgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YTsKIAotICAgICAgIGludCBzY2FsTWluID0gRkRLbWluKHNjYWxlMCwgc2NhbGUxKS0xOworICAgICAgLyogcmVkdWNlIHRocmVzaG9sZHMgKi8KKyAgICAgIEZES2FhY0VuY19yZWR1Y2VUaHJlc2hvbGRzQ0JSKAorICAgICAgICAgIHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsCisgICAgICAgICAgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCBwQWhGbGFnW2VsZW1lbnRJZF0sCisgICAgICAgICAgcFRockV4cFtlbGVtZW50SWRdLCBuQ2hhbm5lbHMsIHJlZHVjdGlvblZhbHVlX20sIHJlZHVjdGlvblZhbHVlX2UpOwogCi0gICAgICAgcmVkVmFsdWVbZWxlbWVudElkXSAgPSBzY2FsZVZhbHVlKHRtcDAsKHNjYWxNaW4tc2NhbGUwKSkgLSBzY2FsZVZhbHVlKHRtcDEsKHNjYWxNaW4tc2NhbGUxKSk7Ci0gICAgICAgcmVkVmFsU2NhbGluZ1tlbGVtZW50SWRdID0gc2NhbE1pbjsKKyAgICAgIC8qIHBlIGFmdGVyIGZpcnN0IGd1ZXNzICovCisgICAgICBGREthYWNFbmNfY2FsY1BlKHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcGVEYXRhLCBuQ2hhbm5lbHMpOwogCi0gICAgICAgLyogcmVkdWNlIHRocmVzaG9sZHMgKi8KLSAgICAgICBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc0NCUihxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsLCBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsIHBBaEZsYWdbZWxlbWVudElkXSwgcFRockV4cFtlbGVtZW50SWRdLCBuQ2hhbm5lbHMsIHJlZFZhbHVlW2VsZW1lbnRJZF0sIHJlZFZhbFNjYWxpbmdbZWxlbWVudElkXSk7CisgICAgICByZWRQZUdsb2JhbCArPSBwZURhdGEtPnBlOworICAgIH0gLyogRU9GIERTRS1zdXBwcmVzc2lvbiAqLworICB9ICAgLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KIAotICAgICAgIC8qIHBlIGFmdGVyIGZpcnN0IGd1ZXNzICovCi0gICAgICAgRkRLYWFjRW5jX2NhbGNQZShwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsIHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsIHBlRGF0YSwgbkNoYW5uZWxzKTsKKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgLyogUGFydCBJSUk6IEl0ZXJhdGUgdW50aWwgYml0IGNvbnN0cmFpbnRzIGFyZSBtZXQgKi8KKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgaXRlciA9IDA7CisgIHdoaWxlICgoZml4cF9hYnMocmVkUGVHbG9iYWwgLSBkZXNpcmVkUGUpID4KKyAgICAgICAgICBmTXVsdEkoRkwyRlhDT05TVF9EQkwoMC4wNWYpLCBkZXNpcmVkUGUpKSAmJgorICAgICAgICAgKGl0ZXIgPCBtYXhJdGVyMm5kR3Vlc3MpKSB7CisgICAgSU5UIGRlc2lyZWRQZU5vQUhHbG9iYWw7CisgICAgSU5UIHJlZFBlTm9BSEdsb2JhbCA9IDA7CisgICAgSU5UIGNvbnN0UGFydE5vQUhHbG9iYWwgPSAwOworICAgIElOVCBuQWN0aXZlTGluZXNOb0FIR2xvYmFsID0gMDsKIAotICAgICAgIHJlZFBlR2xvYmFsICs9IHBlRGF0YS0+cGU7Ci0gICAgIH0gLyogRU9GIERTRS1zdXBwcmVzc2lvbiAqLwotICAgfSAvKiBFT0YgZm9yIGFsbCBlbGVtZW50cy4uLiAqLworICAgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDsgZWxlbWVudElkIDwgbkVsZW1lbnRzOyBlbGVtZW50SWQrKykgeworICAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CisgICAgICAgIElOVCByZWRQZU5vQUgsIGNvbnN0UGFydE5vQUgsIG5BY3RpdmVMaW5lc05vQUg7CisgICAgICAgIElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKKyAgICAgICAgUEVfREFUQSAqcGVEYXRhID0gJnFjRWxlbWVudFtlbGVtZW50SWRdLT5wZURhdGE7CiAKLSAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAvKiBQYXJ0IElJSTogSXRlcmF0ZSB1bnRpbCBiaXQgY29uc3RyYWludHMgYXJlIG1ldCAqLwotICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgIGl0ZXIgPSAwOwotICAgd2hpbGUgKChmaXhwX2FicyhyZWRQZUdsb2JhbCAtIGRlc2lyZWRQZSkgPiBmTXVsdEkoRkwyRlhDT05TVF9EQkwoMC4wNWYpLGRlc2lyZWRQZSkpICYmIChpdGVyIDwgbWF4SXRlcjJuZEd1ZXNzKSkgeworICAgICAgICAvKiBwZSBmb3IgYmFuZHMgd2hlcmUgYXZvaWQgaG9sZSBpcyBpbmFjdGl2ZSAqLworICAgICAgICBGREthYWNFbmNfRkRLYWFjRW5jX2NhbGNQZU5vQUgoCisgICAgICAgICAgICAmcmVkUGVOb0FILCAmY29uc3RQYXJ0Tm9BSCwgJm5BY3RpdmVMaW5lc05vQUgsIHBlRGF0YSwKKyAgICAgICAgICAgIHBBaEZsYWdbZWxlbWVudElkXSwgcHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLAorICAgICAgICAgICAgbkNoYW5uZWxzKTsKIAotICAgICBJTlQgZGVzaXJlZFBlTm9BSEdsb2JhbDsKLSAgICAgSU5UIHJlZFBlTm9BSEdsb2JhbCA9IDA7Ci0gICAgIElOVCBjb25zdFBhcnROb0FIR2xvYmFsID0gMDsKLSAgICAgSU5UIG5BY3RpdmVMaW5lc05vQUhHbG9iYWwgPSAwOworICAgICAgICByZWRQZU5vQUhHbG9iYWwgKz0gcmVkUGVOb0FIOworICAgICAgICBjb25zdFBhcnROb0FIR2xvYmFsICs9IGNvbnN0UGFydE5vQUg7CisgICAgICAgIG5BY3RpdmVMaW5lc05vQUhHbG9iYWwgKz0gbkFjdGl2ZUxpbmVzTm9BSDsKKyAgICAgIH0gLyogRU9GIERTRS1zdXBwcmVzc2lvbiAqLworICAgIH0gICAvKiBFT0YgZm9yIGFsbCBlbGVtZW50cy4uLiAqLwogCi0gICAgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7Ci0gICAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CisgICAgLyogQ2FsY3VsYXRlIG5ldyByZWRWYWwgLi4uICovCisgICAgaWYgKGRlc2lyZWRQZSA8IHJlZFBlR2xvYmFsKSB7CisgICAgICAvKiBuZXcgZGVzaXJlZCBwZSB3aXRob3V0IGJhbmRzIHdoZXJlIGF2b2lkIGhvbGUgaXMgYWN0aXZlICovCisgICAgICBkZXNpcmVkUGVOb0FIR2xvYmFsID0gZGVzaXJlZFBlIC0gKHJlZFBlR2xvYmFsIC0gcmVkUGVOb0FIR2xvYmFsKTsKIAotICAgICAgICAgSU5UIHJlZFBlTm9BSCwgY29uc3RQYXJ0Tm9BSCwgbkFjdGl2ZUxpbmVzTm9BSDsKLSAgICAgICAgIElOVCBuQ2hhbm5lbHMgPSBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbDsKLSAgICAgICAgIFBFX0RBVEEgKnBlRGF0YSAgICA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOworICAgICAgLyogbGltaXQgZGVzaXJlZFBlTm9BSCB0byBwb3NpdGl2ZSB2YWx1ZXMsIGFzIHRoZSBQRSBjYW4gbm90IGJlY29tZQorICAgICAgICogbmVnYXRpdmUgKi8KKyAgICAgIGRlc2lyZWRQZU5vQUhHbG9iYWwgPSBmTWF4KDAsIGRlc2lyZWRQZU5vQUhHbG9iYWwpOwogCi0gICAgICAgICAvKiBwZSBmb3IgYmFuZHMgd2hlcmUgYXZvaWQgaG9sZSBpcyBpbmFjdGl2ZSAqLwotICAgICAgICAgRkRLYWFjRW5jX0ZES2FhY0VuY19jYWxjUGVOb0FIKCZyZWRQZU5vQUgsICZjb25zdFBhcnROb0FILCAmbkFjdGl2ZUxpbmVzTm9BSCwKLSAgICAgICAgICAgICAgICAgICAgcGVEYXRhLCBwQWhGbGFnW2VsZW1lbnRJZF0sIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKKyAgICAgIC8qIHNlY29uZCBndWVzcyAob25seSBpZiB0aGVyZSBhcmUgYmFuZHMgbGVmdCB3aGVyZSBhdm9pZCBob2xlIGlzCisgICAgICAgKiBpbmFjdGl2ZSkqLworICAgICAgaWYgKG5BY3RpdmVMaW5lc05vQUhHbG9iYWwgPiAwKSB7CisgICAgICAgIC8qCisgICAgICAgICAgYXZnVGhyRXhwID0gKGZsb2F0KXBvdygyLjBmLCAoY29uc3RQYXJ0Tm9BSEdsb2JhbCAtIHJlZFBlTm9BSEdsb2JhbCkgLworICAgICAgICAgICg0LjBmICogbkFjdGl2ZUxpbmVzTm9BSEdsb2JhbCkpOyByZWRWYWwgICArPSAoZmxvYXQpcG93KDIuMGYsCisgICAgICAgICAgKGNvbnN0UGFydE5vQUhHbG9iYWwgLSBkZXNpcmVkUGVOb0FIR2xvYmFsKSAvICg0LjBmICoKKyAgICAgICAgICBuQWN0aXZlTGluZXNOb0FIR2xvYmFsKSkgLSBhdmdUaHJFeHA7IHJlZFZhbCAgICA9IG1heCgwLjBmLCByZWRWYWwpOworICAgICAgICAqLwogCi0gICAgICAgICByZWRQZU5vQUhHbG9iYWwgKz0gcmVkUGVOb0FIOwotICAgICAgICAgY29uc3RQYXJ0Tm9BSEdsb2JhbCArPSBjb25zdFBhcnROb0FIOwotICAgICAgICAgbkFjdGl2ZUxpbmVzTm9BSEdsb2JhbCArPSBuQWN0aXZlTGluZXNOb0FIOwotICAgICAgIH0gLyogRU9GIERTRS1zdXBwcmVzc2lvbiAqLwotICAgICB9IC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCisgICAgICAgIHJlZFZhbF9tID0gQ2FsY1JlZFZhbFBvd2VyKGNvbnN0UGFydE5vQUhHbG9iYWwgLSBkZXNpcmVkUGVOb0FIR2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICogbkFjdGl2ZUxpbmVzTm9BSEdsb2JhbCwgJnJlZFZhbF9lKTsKKyAgICAgICAgYXZnVGhyRXhwX20gPSBDYWxjUmVkVmFsUG93ZXIoY29uc3RQYXJ0Tm9BSEdsb2JhbCAtIHJlZFBlTm9BSEdsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAqIG5BY3RpdmVMaW5lc05vQUhHbG9iYWwsICZhdmdUaHJFeHBfZSk7CisgICAgICAgIHJlc3VsdF9lID0gZk1heChyZWR1Y3Rpb25WYWx1ZV9lLCBmTWF4KHJlZFZhbF9lLCBhdmdUaHJFeHBfZSkgKyAxKSArIDE7CiAKLSAgICAgLyogQ2FsY3VsYXRlIG5ldyByZWRWYWwgLi4uICovCi0gICAgIGlmKGRlc2lyZWRQZSA8IHJlZFBlR2xvYmFsKSB7CisgICAgICAgIHJlZHVjdGlvblZhbHVlX20gPQorICAgICAgICAgICAgZk1heChGTDJGWENPTlNUX0RCTCgwLmYpLAorICAgICAgICAgICAgICAgICBzY2FsZVZhbHVlKHJlZHVjdGlvblZhbHVlX20sIHJlZHVjdGlvblZhbHVlX2UgLSByZXN1bHRfZSkgKworICAgICAgICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShyZWRWYWxfbSwgcmVkVmFsX2UgLSByZXN1bHRfZSkgLQorICAgICAgICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShhdmdUaHJFeHBfbSwgYXZnVGhyRXhwX2UgLSByZXN1bHRfZSkpOworICAgICAgICByZWR1Y3Rpb25WYWx1ZV9lID0gcmVzdWx0X2U7CiAKLSAgICAgICAvKiBuZXcgZGVzaXJlZCBwZSB3aXRob3V0IGJhbmRzIHdoZXJlIGF2b2lkIGhvbGUgaXMgYWN0aXZlICovCi0gICAgICAgZGVzaXJlZFBlTm9BSEdsb2JhbCA9IGRlc2lyZWRQZSAtIChyZWRQZUdsb2JhbCAtIHJlZFBlTm9BSEdsb2JhbCk7CisgICAgICB9IC8qIG5BY3RpdmVMaW5lc05vQUhHbG9iYWwgPiAwICovCisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHJlZFZhbCAqPSByZWRQZUdsb2JhbC9kZXNpcmVkUGU7ICovCisgICAgICBpbnQgc2MwLCBzYzE7CisgICAgICByZWR1Y3Rpb25WYWx1ZV9tID0gZk11bHROb3JtKAorICAgICAgICAgIHJlZHVjdGlvblZhbHVlX20sCisgICAgICAgICAgZkRpdk5vcm0oKEZJWFBfREJMKXJlZFBlR2xvYmFsLCAoRklYUF9EQkwpZGVzaXJlZFBlLCAmc2MwKSwgJnNjMSk7CisgICAgICByZWR1Y3Rpb25WYWx1ZV9lICs9IHNjMCArIHNjMTsKIAotICAgICAgIC8qIGxpbWl0IGRlc2lyZWRQZU5vQUggdG8gcG9zaXRpdmUgdmFsdWVzLCBhcyB0aGUgUEUgY2FuIG5vdCBiZWNvbWUgbmVnYXRpdmUgKi8KLSAgICAgICBkZXNpcmVkUGVOb0FIR2xvYmFsID0gRkRLbWF4KDAsZGVzaXJlZFBlTm9BSEdsb2JhbCk7CisgICAgICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7IGVsZW1lbnRJZCA8IG5FbGVtZW50czsgZWxlbWVudElkKyspIHsKKyAgICAgICAgaWYgKGNtLT5lbEluZm9bZWxlbWVudElkXS5lbFR5cGUgIT0gSURfRFNFKSB7CisgICAgICAgICAgRkRLYWFjRW5jX3Jlc2V0QUhGbGFncyhwQWhGbGFnW2VsZW1lbnRJZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+ZWxJbmZvW2VsZW1lbnRJZF0ubkNoYW5uZWxzSW5FbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCk7CisgICAgICAgIH0gLyogRU9GIERTRS1zdXBwcmVzc2lvbiAqLworICAgICAgfSAgIC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCisgICAgfQogCi0gICAgICAgLyogc2Vjb25kIGd1ZXNzIChvbmx5IGlmIHRoZXJlIGFyZSBiYW5kcyBsZWZ0IHdoZXJlIGF2b2lkIGhvbGUgaXMgaW5hY3RpdmUpKi8KLSAgICAgICBpZiAobkFjdGl2ZUxpbmVzTm9BSEdsb2JhbCA+IDApIHsKLSAgICAgICAgIGZvciAoZWxlbWVudElkID0gZWxlbWVudE9mZnNldDtlbGVtZW50SWQ8bkVsZW1lbnRzO2VsZW1lbnRJZCsrKSB7Ci0gICAgICAgICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgewotICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgcmVkVmFsICs9ICggMiBeICggKGNvbnN0UGFydE5vQUhHbG9iYWwtZGVzaXJlZFBlTm9BSEdsb2JhbCkgLyAoaW52UmVkRXhwKm5BY3RpdmVMaW5lc05vQUhHbG9iYWwpICkKLSAgICAgICAgICAgICAgICAgICAgICAgLSAyIF4gKCAoY29uc3RQYXJ0Tm9BSEdsb2JhbC1yZWRQZU5vQUhHbG9iYWwpIC8gKGludlJlZEV4cCpuQWN0aXZlTGluZXNOb0FIR2xvYmFsKSApICkKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgIGludCBzY2FsZTAgPSAwOwotICAgICAgICAgICAgIGludCBzY2FsZTEgPSAwOworICAgIHJlZFBlR2xvYmFsID0gMDsKKyAgICAvKiBDYWxjdWxhdGUgbmV3IHJlZFZhbCdzIFBFLi4uICovCisgICAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0OyBlbGVtZW50SWQgPCBuRWxlbWVudHM7IGVsZW1lbnRJZCsrKSB7CisgICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKKyAgICAgICAgSU5UIG5DaGFubmVscyA9IGNtLT5lbEluZm9bZWxlbWVudElkXS5uQ2hhbm5lbHNJbkVsOworICAgICAgICBQRV9EQVRBICpwZURhdGEgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YTsKIAotICAgICAgICAgICAgIEZJWFBfREJMIHRtcDAgPSBDYWxjUmVkVmFsUG93ZXIoIGNvbnN0UGFydE5vQUhHbG9iYWwtZGVzaXJlZFBlTm9BSEdsb2JhbCwgNCpuQWN0aXZlTGluZXNOb0FIR2xvYmFsLCAmc2NhbGUwICk7Ci0gICAgICAgICAgICAgRklYUF9EQkwgdG1wMSA9IENhbGNSZWRWYWxQb3dlciggY29uc3RQYXJ0Tm9BSEdsb2JhbC1yZWRQZU5vQUhHbG9iYWwsIDQqbkFjdGl2ZUxpbmVzTm9BSEdsb2JhbCwgJnNjYWxlMSApOworICAgICAgICAvKiByZWR1Y2UgdGhyZXNob2xkcyAqLworICAgICAgICBGREthYWNFbmNfcmVkdWNlVGhyZXNob2xkc0NCUigKKyAgICAgICAgICAgIHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsCisgICAgICAgICAgICBwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsIHBBaEZsYWdbZWxlbWVudElkXSwKKyAgICAgICAgICAgIHBUaHJFeHBbZWxlbWVudElkXSwgbkNoYW5uZWxzLCByZWR1Y3Rpb25WYWx1ZV9tLCByZWR1Y3Rpb25WYWx1ZV9lKTsKIAotICAgICAgICAgICAgIGludCBzY2FsTWluID0gRkRLbWluKHNjYWxlMCwgc2NhbGUxKS0xOworICAgICAgICAvKiBwZSBhZnRlciBzZWNvbmQgZ3Vlc3MgKi8KKyAgICAgICAgRkRLYWFjRW5jX2NhbGNQZShwc3lPdXRFbGVtZW50W2VsZW1lbnRJZF0tPnBzeU91dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcGVEYXRhLCBuQ2hhbm5lbHMpOworICAgICAgICByZWRQZUdsb2JhbCArPSBwZURhdGEtPnBlOwogCi0gICAgICAgICAgICAgdG1wMCA9IHNjYWxlVmFsdWUodG1wMCwoc2NhbE1pbi1zY2FsZTApKSAtIHNjYWxlVmFsdWUodG1wMSwoc2NhbE1pbi1zY2FsZTEpKTsKLSAgICAgICAgICAgICBzY2FsZTAgPSBzY2FsTWluOworICAgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCisgICAgfSAgIC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCiAKLSAgICAgICAgICAgICAvKiBvbGQgcmVkdWN0aW9uIHZhbHVlICovCi0gICAgICAgICAgICAgdG1wMSA9IHJlZFZhbHVlW2VsZW1lbnRJZF07Ci0gICAgICAgICAgICAgc2NhbGUxID0gcmVkVmFsU2NhbGluZ1tlbGVtZW50SWRdOworICAgIGl0ZXIrKzsKKyAgfSAvKiBFT0Ygd2hpbGUgKi8KIAotICAgICAgICAgICAgIHNjYWxNaW4gPSBmaXhNaW4oc2NhbGUwLHNjYWxlMSktMTsKLQotICAgICAgICAgICAgIC8qIHN1bSB1cCBvbGQgYW5kIG5ldyByZWR1Y3Rpb24gdmFsdWUgKi8KLSAgICAgICAgICAgICByZWRWYWx1ZVtlbGVtZW50SWRdID0gc2NhbGVWYWx1ZSh0bXAwLChzY2FsTWluLXNjYWxlMCkpICsgc2NhbGVWYWx1ZSh0bXAxLChzY2FsTWluLXNjYWxlMSkpOwotICAgICAgICAgICAgIHJlZFZhbFNjYWxpbmdbZWxlbWVudElkXSA9IHNjYWxNaW47Ci0KLSAgICAgICAgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCi0gICAgICAgICB9IC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCi0gICAgICAgfSAvKiBuQWN0aXZlTGluZXNOb0FIR2xvYmFsID4gMCAqLwotICAgICB9Ci0gICAgIGVsc2UgewotICAgICAgICAvKiBkZXNpcmVkUGUgPj0gcmVkUGVHbG9iYWwgKi8KLSAgICAgICAgZm9yIChlbGVtZW50SWQgPSBlbGVtZW50T2Zmc2V0O2VsZW1lbnRJZDxuRWxlbWVudHM7ZWxlbWVudElkKyspIHsKLSAgICAgICAgICBpZiAoY20tPmVsSW5mb1tlbGVtZW50SWRdLmVsVHlwZSAhPSBJRF9EU0UpIHsKLQotICAgICAgICAgICAgSU5UIHJlZFZhbF9zY2FsZSA9IDA7Ci0gICAgICAgICAgICBGSVhQX0RCTCB0bXAgPSBmRGl2Tm9ybSgoRklYUF9EQkwpcmVkUGVHbG9iYWwsIChGSVhQX0RCTClkZXNpcmVkUGUsICZyZWRWYWxfc2NhbGUpOwotCi0gICAgICAgICAgICAvKiByZWRWYWwgKj0gcmVkUGVHbG9iYWwvZGVzaXJlZFBlOyAqLwotICAgICAgICAgICAgcmVkVmFsdWVbZWxlbWVudElkXSA9IGZNdWx0KHJlZFZhbHVlW2VsZW1lbnRJZF0sIHRtcCk7Ci0gICAgICAgICAgICByZWRWYWxTY2FsaW5nW2VsZW1lbnRJZF0gLT0gcmVkVmFsX3NjYWxlOwotCi0gICAgICAgICAgICBGREthYWNFbmNfcmVzZXRBSEZsYWdzKHBBaEZsYWdbZWxlbWVudElkXSwgY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWwsIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCk7Ci0gICAgICAgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCi0gICAgICAgIH0gLyogRU9GIGZvciBhbGwgZWxlbWVudHMuLi4gKi8KLSAgICAgfQotCi0gICAgIHJlZFBlR2xvYmFsID0gMDsKLSAgICAgLyogQ2FsY3VsYXRlIG5ldyByZWRWYWwncyBQRS4uLiAqLwotICAgICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgewotICAgICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgewotCi0gICAgICAgICBJTlQgbkNoYW5uZWxzID0gY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7Ci0gICAgICAgICBQRV9EQVRBICpwZURhdGEgICAgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YTsKLQotICAgICAgICAgLyogcmVkdWNlIHRocmVzaG9sZHMgKi8KLSAgICAgICAgIEZES2FhY0VuY19yZWR1Y2VUaHJlc2hvbGRzQ0JSKHFjRWxlbWVudFtlbGVtZW50SWRdLT5xY091dENoYW5uZWwsIHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgcEFoRmxhZ1tlbGVtZW50SWRdLCBwVGhyRXhwW2VsZW1lbnRJZF0sIG5DaGFubmVscywgcmVkVmFsdWVbZWxlbWVudElkXSwgcmVkVmFsU2NhbGluZ1tlbGVtZW50SWRdKTsKLQotICAgICAgICAgLyogcGUgYWZ0ZXIgc2Vjb25kIGd1ZXNzICovCi0gICAgICAgICBGREthYWNFbmNfY2FsY1BlKHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwgcWNFbGVtZW50W2VsZW1lbnRJZF0tPnFjT3V0Q2hhbm5lbCwgcGVEYXRhLCBuQ2hhbm5lbHMpOwotICAgICAgICAgcmVkUGVHbG9iYWwgKz0gcGVEYXRhLT5wZTsKLQotICAgICAgIH0gLyogRU9GIERTRS1zdXBwcmVzc2lvbiAqLwotICAgICB9IC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCi0KLSAgICAgaXRlcisrOwotICAgfSAvKiBFT0Ygd2hpbGUgKi8KLQotCi0gICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAvKiBQYXJ0IElWOiBpZiBzdGlsbCByZXF1aXJlZCwgZnVydGhlciByZWR1Y2UgY29uc3RyYWludHMgICovCi0gICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAvKiAgICAgICAgICAgICAgICAgIDEuMCogICAgICAgIDEuMTUqICAgICAgIDEuMjAqCi0gICAgKiAgICAgICAgICAgICAgIGRlc2lyZWRQZSAgIGRlc2lyZWRQZSAgIGRlc2lyZWRQZQotICAgICogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfAotICAgICogLi4uWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYfCAgICAgICAgICAgfAotICAgICogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfFhYWFhYWFhYWFhYLi4uCi0gICAgKiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8WFhYWFhYWFhYWFh8Ci0gICAgKiAgICAgICAgICAgIC0tLSBBIC0tLSAgICAgICAgICB8IC0tLSBCIC0tLSB8IC0tLSBDIC0tLQotICAgICoKLSAgICAqIChYKTogcmVkUGVHbG9iYWwKLSAgICAqIChBKTogRkRLYWFjRW5jX2NvcnJlY3RUaHJlc2goKQotICAgICogKEIpOiBGREthYWNFbmNfYWxsb3dNb3JlSG9sZXMoKQotICAgICogKEMpOiBGREthYWNFbmNfcmVkdWNlTWluU25yKCkKKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAvKiBQYXJ0IElWOiBpZiBzdGlsbCByZXF1aXJlZCwgZnVydGhlciByZWR1Y2UgY29uc3RyYWludHMgICovCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgLyogICAgICAgICAgICAgICAgICAxLjAqICAgICAgICAxLjE1KiAgICAgICAxLjIwKgorICAgKiAgICAgICAgICAgICAgIGRlc2lyZWRQZSAgIGRlc2lyZWRQZSAgIGRlc2lyZWRQZQorICAgKiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICB8CisgICAqIC4uLlhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWHwgICAgICAgICAgIHwKKyAgICogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfFhYWFhYWFhYWFhYLi4uCisgICAqICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHxYWFhYWFhYWFhYWHwKKyAgICogICAgICAgICAgICAtLS0gQSAtLS0gICAgICAgICAgfCAtLS0gQiAtLS0gfCAtLS0gQyAtLS0KKyAgICoKKyAgICogKFgpOiByZWRQZUdsb2JhbAorICAgKiAoQSk6IEZES2FhY0VuY19jb3JyZWN0VGhyZXNoKCkKKyAgICogKEIpOiBGREthYWNFbmNfYWxsb3dNb3JlSG9sZXMoKQorICAgKiAoQyk6IEZES2FhY0VuY19yZWR1Y2VNaW5TbnIoKQogICAgKi8KIAotICAgLyogY29ycmVjdCB0aHJlc2hvbGRzIHRvIGdldCBjbG9zZXIgdG8gdGhlIGRlc2lyZWQgcGUgKi8KLSAgIGlmICggcmVkUGVHbG9iYWwgPiBkZXNpcmVkUGUgKSB7Ci0gICAgIEZES2FhY0VuY19jb3JyZWN0VGhyZXNoKGNtLCBxY0VsZW1lbnQsIHBzeU91dEVsZW1lbnQsIHBBaEZsYWcsIHBUaHJFeHAsIHJlZFZhbHVlLCByZWRWYWxTY2FsaW5nLAotICAgICAgICAgICAgICAgICAgIGRlc2lyZWRQZSAtIHJlZFBlR2xvYmFsLCBwcm9jZXNzRWxlbWVudHMsIGVsZW1lbnRPZmZzZXQpOworICAvKiBjb3JyZWN0IHRocmVzaG9sZHMgdG8gZ2V0IGNsb3NlciB0byB0aGUgZGVzaXJlZCBwZSAqLworICBpZiAocmVkUGVHbG9iYWwgPiBkZXNpcmVkUGUpIHsKKyAgICBGREthYWNFbmNfY29ycmVjdFRocmVzaChjbSwgcWNFbGVtZW50LCBwc3lPdXRFbGVtZW50LCBwQWhGbGFnLCBwVGhyRXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjdGlvblZhbHVlX20sIHJlZHVjdGlvblZhbHVlX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFBlIC0gcmVkUGVHbG9iYWwsIHByb2Nlc3NFbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50T2Zmc2V0KTsKIAotICAgICAvKiB1cGRhdGUgUEUgKi8KLSAgICAgcmVkUGVHbG9iYWwgPSAwOwotICAgICBmb3IoZWxlbWVudElkPWVsZW1lbnRPZmZzZXQ7ZWxlbWVudElkPG5FbGVtZW50cztlbGVtZW50SWQrKykgewotICAgICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgeworICAgIC8qIHVwZGF0ZSBQRSAqLworICAgIHJlZFBlR2xvYmFsID0gMDsKKyAgICBmb3IgKGVsZW1lbnRJZCA9IGVsZW1lbnRPZmZzZXQ7IGVsZW1lbnRJZCA8IG5FbGVtZW50czsgZWxlbWVudElkKyspIHsKKyAgICAgIGlmIChjbS0+ZWxJbmZvW2VsZW1lbnRJZF0uZWxUeXBlICE9IElEX0RTRSkgeworICAgICAgICBJTlQgbkNoYW5uZWxzID0gY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7CisgICAgICAgIFBFX0RBVEEgKnBlRGF0YSA9ICZxY0VsZW1lbnRbZWxlbWVudElkXS0+cGVEYXRhOwogCi0gICAgICAgICBJTlQgbkNoYW5uZWxzID0gY20tPmVsSW5mb1tlbGVtZW50SWRdLm5DaGFubmVsc0luRWw7Ci0gICAgICAgICBQRV9EQVRBICpwZURhdGEgICAgPSAmcWNFbGVtZW50W2VsZW1lbnRJZF0tPnBlRGF0YTsKKyAgICAgICAgLyogcGUgYWZ0ZXIgY29ycmVjdFRocmVzaCAqLworICAgICAgICBGREthYWNFbmNfY2FsY1BlKHBzeU91dEVsZW1lbnRbZWxlbWVudElkXS0+cHN5T3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsLCBwZURhdGEsIG5DaGFubmVscyk7CisgICAgICAgIHJlZFBlR2xvYmFsICs9IHBlRGF0YS0+cGU7CiAKLSAgICAgICAgIC8qIHBlIGFmdGVyIGNvcnJlY3RUaHJlc2ggKi8KLSAgICAgICAgIEZES2FhY0VuY19jYWxjUGUocHN5T3V0RWxlbWVudFtlbGVtZW50SWRdLT5wc3lPdXRDaGFubmVsLCBxY0VsZW1lbnRbZWxlbWVudElkXS0+cWNPdXRDaGFubmVsLCBwZURhdGEsIG5DaGFubmVscyk7Ci0gICAgICAgICByZWRQZUdsb2JhbCArPSBwZURhdGEtPnBlOworICAgICAgfSAvKiBFT0YgRFNFLXN1cHByZXNzaW9uICovCisgICAgfSAgIC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCisgIH0KIAotICAgICAgIH0gLyogRU9GIERTRS1zdXBwcmVzc2lvbiAqLwotICAgICB9IC8qIEVPRiBmb3IgYWxsIGVsZW1lbnRzLi4uICovCi0gICB9CisgIGlmIChyZWRQZUdsb2JhbCA+IGRlc2lyZWRQZSkgeworICAgIC8qIHJlZHVjZSBwZSBieSByZWR1Y2luZyBtaW5TbnIgcmVxdWlyZW1lbnRzICovCisgICAgRkRLYWFjRW5jX3JlZHVjZU1pblNucigKKyAgICAgICAgY20sIHFjRWxlbWVudCwgcHN5T3V0RWxlbWVudCwgcEFoRmxhZywKKyAgICAgICAgKGZNdWx0SShGTDJGWENPTlNUX0RCTCgwLjE1ZiksIGRlc2lyZWRQZSkgKyBkZXNpcmVkUGUpLCAmcmVkUGVHbG9iYWwsCisgICAgICAgIHByb2Nlc3NFbGVtZW50cywgZWxlbWVudE9mZnNldCk7CiAKLSAgIGlmICggcmVkUGVHbG9iYWwgPiBkZXNpcmVkUGUgKSB7Ci0gICAgIC8qIHJlZHVjZSBwZSBieSByZWR1Y2luZyBtaW5TbnIgcmVxdWlyZW1lbnRzICovCi0gICAgIEZES2FhY0VuY19yZWR1Y2VNaW5TbnIoY20sIHFjRWxlbWVudCwgcHN5T3V0RWxlbWVudCwgcEFoRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZk11bHRJKEZMMkZYQ09OU1RfREJMKDAuMTVmKSxkZXNpcmVkUGUpICsgZGVzaXJlZFBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVkUGVHbG9iYWwsIHByb2Nlc3NFbGVtZW50cywgZWxlbWVudE9mZnNldCk7Ci0KLSAgICAgLyogcmVkdWNlIHBlIGJ5IGFsbG93aW5nIGFkZGl0aW9uYWwgc3BlY3RyYWwgaG9sZXMgKi8KLSAgICAgRkRLYWFjRW5jX2FsbG93TW9yZUhvbGVzKGNtLCBxY0VsZW1lbnQsIHBzeU91dEVsZW1lbnQsIEFkalRoclN0YXRlRWxlbWVudCwgcEFoRmxhZywKLSAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFBlLCByZWRQZUdsb2JhbCwgcHJvY2Vzc0VsZW1lbnRzLCBlbGVtZW50T2Zmc2V0KTsKLSAgIH0KLQorICAgIC8qIHJlZHVjZSBwZSBieSBhbGxvd2luZyBhZGRpdGlvbmFsIHNwZWN0cmFsIGhvbGVzICovCisgICAgRkRLYWFjRW5jX2FsbG93TW9yZUhvbGVzKGNtLCBxY0VsZW1lbnQsIHBzeU91dEVsZW1lbnQsIEFkalRoclN0YXRlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFoRmxhZywgZGVzaXJlZFBlLCByZWRQZUdsb2JhbCwgcHJvY2Vzc0VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50T2Zmc2V0KTsKKyAgfQogfQogCiAvKiBzaW1pbGFyIHRvIEZES2FhY0VuY19hZGFwdFRocmVzaG9sZHNUb1BlKCksIGZvciAgVkJSLW1vZGUgKi8KLXZvaWQgRkRLYWFjRW5jX0FkYXB0VGhyZXNob2xkc1ZCUihRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQqIEFkalRoclN0YXRlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgVE9PTFNJTkZPICp0b29sc0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVfREFUQSAqcGVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMpCi17Ci0gICBVQ0hBUiAgICAoKnBBaEZsYWcpW01BWF9HUk9VUEVEX1NGQl07Ci0gICBGSVhQX0RCTCAoKnBUaHJFeHApW01BWF9HUk9VUEVEX1NGQl07CitzdGF0aWMgdm9pZCBGREthYWNFbmNfQWRhcHRUaHJlc2hvbGRzVkJSKAorICAgIFFDX09VVF9DSEFOTkVMICpjb25zdCBxY091dENoYW5uZWxbKDIpXSwKKyAgICBjb25zdCBQU1lfT1VUX0NIQU5ORUwgKmNvbnN0IHBzeU91dENoYW5uZWxbKDIpXSwKKyAgICBBVFNfRUxFTUVOVCAqY29uc3QgQWRqVGhyU3RhdGVFbGVtZW50LAorICAgIGNvbnN0IHN0cnVjdCBUT09MU0lORk8gKmNvbnN0IHRvb2xzSW5mbywgY29uc3QgSU5UIG5DaGFubmVscykgeworICBVQ0hBUigqcEFoRmxhZylbTUFYX0dST1VQRURfU0ZCXTsKKyAgRklYUF9EQkwoKnBUaHJFeHApW01BWF9HUk9VUEVEX1NGQl07CiAKLSAgIC8qIGFsbG9jYXRlIHNjcmF0Y2ggbWVtb3J5ICovCi0gICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoX3BBaEZsYWcsIFVDSEFSLCAoMikqTUFYX0dST1VQRURfU0ZCKQotICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKF9wVGhyRXhwLCBGSVhQX0RCTCwgKDIpKk1BWF9HUk9VUEVEX1NGQikKLSAgIHBBaEZsYWcgPSAoVUNIQVIoKilbTUFYX0dST1VQRURfU0ZCXSlfcEFoRmxhZzsKLSAgIHBUaHJFeHAgPSAoRklYUF9EQkwoKilbTUFYX0dST1VQRURfU0ZCXSlfcFRockV4cDsKKyAgLyogYWxsb2NhdGUgc2NyYXRjaCBtZW1vcnkgKi8KKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKF9wQWhGbGFnLCBVQ0hBUiwgKDIpICogTUFYX0dST1VQRURfU0ZCKQorICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoX3BUaHJFeHAsIEZJWFBfREJMLCAoMikgKiBNQVhfR1JPVVBFRF9TRkIpCisgIHBBaEZsYWcgPSAoVUNIQVIoKilbTUFYX0dST1VQRURfU0ZCXSlfcEFoRmxhZzsKKyAgcFRockV4cCA9IChGSVhQX0RCTCgqKVtNQVhfR1JPVVBFRF9TRkJdKV9wVGhyRXhwOwogCi0gICAvKiB0aHJlc2hvbGRzIHRvIHRoZSBwb3dlciBvZiByZWRFeHAgKi8KLSAgIEZES2FhY0VuY19jYWxjVGhyZXNoRXhwKHBUaHJFeHAsIHFjT3V0Q2hhbm5lbCwgcHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKKyAgLyogdGhyZXNob2xkcyB0byB0aGUgcG93ZXIgb2YgcmVkRXhwICovCisgIEZES2FhY0VuY19jYWxjVGhyZXNoRXhwKHBUaHJFeHAsIHFjT3V0Q2hhbm5lbCwgcHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKIAotICAgLyogbG93ZXIgdGhlIG1pblNuciByZXF1aXJlbWVudHMgZm9yIGxvdyBlbmVyZ2llcyBjb21wYXJlZCB0byB0aGUgYXZlcmFnZQotICAgICAgZW5lcmd5IGluIHRoaXMgZnJhbWUgKi8KLSAgIEZES2FhY0VuY19hZGFwdE1pblNucihxY091dENoYW5uZWwsIHBzeU91dENoYW5uZWwsICZBZGpUaHJTdGF0ZUVsZW1lbnQtPm1pblNuckFkYXB0UGFyYW0sIG5DaGFubmVscyk7CisgIC8qIGxvd2VyIHRoZSBtaW5TbnIgcmVxdWlyZW1lbnRzIGZvciBsb3cgZW5lcmdpZXMgY29tcGFyZWQgdG8gdGhlIGF2ZXJhZ2UKKyAgICAgZW5lcmd5IGluIHRoaXMgZnJhbWUgKi8KKyAgRkRLYWFjRW5jX2FkYXB0TWluU25yKHFjT3V0Q2hhbm5lbCwgcHN5T3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZBZGpUaHJTdGF0ZUVsZW1lbnQtPm1pblNuckFkYXB0UGFyYW0sIG5DaGFubmVscyk7CiAKLSAgIC8qIGluaXQgYWhGbGFnICgwOiBubyBhaCBuZWNlc3NhcnksIDE6IGFoIHBvc3NpYmxlLCAyOiBhaCBhY3RpdmUgKi8KLSAgIEZES2FhY0VuY19pbml0QXZvaWRIb2xlRmxhZyhxY091dENoYW5uZWwsIHBzeU91dENoYW5uZWwsIHBBaEZsYWcsIHRvb2xzSW5mbywKLSAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywgcGVEYXRhLCAmQWRqVGhyU3RhdGVFbGVtZW50LT5haFBhcmFtKTsKKyAgLyogaW5pdCBhaEZsYWcgKDA6IG5vIGFoIG5lY2Vzc2FyeSwgMTogYWggcG9zc2libGUsIDI6IGFoIGFjdGl2ZSAqLworICBGREthYWNFbmNfaW5pdEF2b2lkSG9sZUZsYWcocWNPdXRDaGFubmVsLCBwc3lPdXRDaGFubmVsLCBwQWhGbGFnLCB0b29sc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsICZBZGpUaHJTdGF0ZUVsZW1lbnQtPmFoUGFyYW0pOwogCi0gICAvKiByZWR1Y2UgdGhyZXNob2xkcyAqLwotICAgRkRLYWFjRW5jX3JlZHVjZVRocmVzaG9sZHNWQlIocWNPdXRDaGFubmVsLCBwc3lPdXRDaGFubmVsLCBwQWhGbGFnLCBwVGhyRXhwLCBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+dmJyUXVhbEZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgJkFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlT2xkKTsKKyAgLyogcmVkdWNlIHRocmVzaG9sZHMgKi8KKyAgRkRLYWFjRW5jX3JlZHVjZVRocmVzaG9sZHNWQlIocWNPdXRDaGFubmVsLCBwc3lPdXRDaGFubmVsLCBwQWhGbGFnLCBwVGhyRXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsIEFkalRoclN0YXRlRWxlbWVudC0+dmJyUXVhbEZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFkalRoclN0YXRlRWxlbWVudC0+Y2hhb3NNZWFzdXJlT2xkKTsKIAotICAgLyogZnJlZSBzY3JhdGNoIG1lbW9yeSAqLwotICAgQ19BTExPQ19TQ1JBVENIX0VORChfcFRockV4cCwgRklYUF9EQkwsICgyKSpNQVhfR1JPVVBFRF9TRkIpCi0gICBDX0FMTE9DX1NDUkFUQ0hfRU5EKF9wQWhGbGFnLCBVQ0hBUiwgKDIpKk1BWF9HUk9VUEVEX1NGQikKKyAgLyogZnJlZSBzY3JhdGNoIG1lbW9yeSAqLworICBDX0FMTE9DX1NDUkFUQ0hfRU5EKF9wVGhyRXhwLCBGSVhQX0RCTCwgKDIpICogTUFYX0dST1VQRURfU0ZCKQorICBDX0FMTE9DX1NDUkFUQ0hfRU5EKF9wQWhGbGFnLCBVQ0hBUiwgKDIpICogTUFYX0dST1VQRURfU0ZCKQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NhbGNCaXRTYXZlCkBAIC0xOTc4LDIwICsyMjI2LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwSGlnaCAgICAgIG1heEJpdHJlcwogKi8KIHN0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfY2FsY0JpdFNhdmUoRklYUF9EQkwgZmlsbExldmVsLAotICAgIGNvbnN0IEZJWFBfREJMIGNsaXBMb3csCi0gICAgY29uc3QgRklYUF9EQkwgY2xpcEhpZ2gsCi0gICAgY29uc3QgRklYUF9EQkwgbWluQml0U2F2ZSwKLSAgICBjb25zdCBGSVhQX0RCTCBtYXhCaXRTYXZlLAotICAgIGNvbnN0IEZJWFBfREJMIGJpdHNhdmVfc2xvcGUpCi17Ci0gICAgRklYUF9EQkwgYml0c2F2ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgY2xpcExvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgY2xpcEhpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIG1pbkJpdFNhdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIG1heEJpdFNhdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGJpdHNhdmVfc2xvcGUpIHsKKyAgRklYUF9EQkwgYml0c2F2ZTsKIAotICAgIGZpbGxMZXZlbCA9IGZpeE1heChmaWxsTGV2ZWwsIGNsaXBMb3cpOwotICAgIGZpbGxMZXZlbCA9IGZpeE1pbihmaWxsTGV2ZWwsIGNsaXBIaWdoKTsKKyAgZmlsbExldmVsID0gZml4TWF4KGZpbGxMZXZlbCwgY2xpcExvdyk7CisgIGZpbGxMZXZlbCA9IGZpeE1pbihmaWxsTGV2ZWwsIGNsaXBIaWdoKTsKIAotICAgIGJpdHNhdmUgPSBtYXhCaXRTYXZlIC0gZk11bHQoKGZpbGxMZXZlbC1jbGlwTG93KSwgYml0c2F2ZV9zbG9wZSk7CisgIGJpdHNhdmUgPSBtYXhCaXRTYXZlIC0gZk11bHQoKGZpbGxMZXZlbCAtIGNsaXBMb3cpLCBiaXRzYXZlX3Nsb3BlKTsKIAotICAgIHJldHVybiAoYml0c2F2ZSk7CisgIHJldHVybiAoYml0c2F2ZSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjAxNywyMyArMjI2NCwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwTG93CiAqLwogc3RhdGljIEZJWFBfREJMIEZES2FhY0VuY19jYWxjQml0U3BlbmQoRklYUF9EQkwgZmlsbExldmVsLAotICAgIGNvbnN0IEZJWFBfREJMIGNsaXBMb3csCi0gICAgY29uc3QgRklYUF9EQkwgY2xpcEhpZ2gsCi0gICAgY29uc3QgRklYUF9EQkwgbWluQml0U3BlbmQsCi0gICAgY29uc3QgRklYUF9EQkwgbWF4Qml0U3BlbmQsCi0gICAgY29uc3QgRklYUF9EQkwgYml0c3BlbmRfc2xvcGUpCi17Ci0gICAgRklYUF9EQkwgYml0c3BlbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBjbGlwTG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgY2xpcEhpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBtaW5CaXRTcGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIG1heEJpdFNwZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYml0c3BlbmRfc2xvcGUpIHsKKyAgRklYUF9EQkwgYml0c3BlbmQ7CiAKLSAgICBmaWxsTGV2ZWwgPSBmaXhNYXgoZmlsbExldmVsLCBjbGlwTG93KTsKLSAgICBmaWxsTGV2ZWwgPSBmaXhNaW4oZmlsbExldmVsLCBjbGlwSGlnaCk7CisgIGZpbGxMZXZlbCA9IGZpeE1heChmaWxsTGV2ZWwsIGNsaXBMb3cpOworICBmaWxsTGV2ZWwgPSBmaXhNaW4oZmlsbExldmVsLCBjbGlwSGlnaCk7CiAKLSAgICBiaXRzcGVuZCA9IG1pbkJpdFNwZW5kICsgZk11bHQoZmlsbExldmVsLWNsaXBMb3csIGJpdHNwZW5kX3Nsb3BlKTsKKyAgYml0c3BlbmQgPSBtaW5CaXRTcGVuZCArIGZNdWx0KGZpbGxMZXZlbCAtIGNsaXBMb3csIGJpdHNwZW5kX3Nsb3BlKTsKIAotICAgIHJldHVybiAoYml0c3BlbmQpOworICByZXR1cm4gKGJpdHNwZW5kKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19hZGp1c3RQZU1pbk1heCgpCkBAIC0yMDQzLDUyICsyMjg4LDQ2IEBACiAgIG91dHB1dDogICAgICAgYWRqdXN0ZWQgcGVNaW4vcGVNYXgKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfYWRqdXN0UGVNaW5NYXgoY29uc3QgSU5UIGN1cnJQZSwKLSAgICBJTlQgICAgICAqcGVNaW4sCi0gICAgSU5UICAgICAgKnBlTWF4KQotewotICBGSVhQX0RCTCBtaW5GYWNIaSA9IEZMMkZYQ09OU1RfREJMKDAuM2YpLCBtYXhGYWNIaSA9IChGSVhQX0RCTClNQVhWQUxfREJMLCBtaW5GYWNMbyA9IEZMMkZYQ09OU1RfREJMKDAuMTRmKSwgbWF4RmFjTG8gPSBGTDJGWENPTlNUX0RCTCgwLjA3Zik7Ci0gICAgSU5UIGRpZmY7CitzdGF0aWMgdm9pZCBGREthYWNFbmNfYWRqdXN0UGVNaW5NYXgoY29uc3QgSU5UIGN1cnJQZSwgSU5UICpwZU1pbiwgSU5UICpwZU1heCkgeworICBGSVhQX0RCTCBtaW5GYWNIaSA9IEZMMkZYQ09OU1RfREJMKDAuM2YpLCBtYXhGYWNIaSA9IChGSVhQX0RCTClNQVhWQUxfREJMLAorICAgICAgICAgICBtaW5GYWNMbyA9IEZMMkZYQ09OU1RfREJMKDAuMTRmKSwgbWF4RmFjTG8gPSBGTDJGWENPTlNUX0RCTCgwLjA3Zik7CisgIElOVCBkaWZmOwogCi0gICAgSU5UIG1pbkRpZmZfZml4ID0gZk11bHRJKEZMMkZYQ09OU1RfREJMKDAuMTY2NjY2NjY2N2YpLCBjdXJyUGUpOworICBJTlQgbWluRGlmZl9maXggPSBmTXVsdEkoRkwyRlhDT05TVF9EQkwoMC4xNjY2NjY2NjY3ZiksIGN1cnJQZSk7CiAKLSAgICBpZiAoY3VyclBlID4gKnBlTWF4KQotICAgIHsKLSAgICAgICAgZGlmZiA9IChjdXJyUGUtKnBlTWF4KSA7Ci0gICAgICAgICpwZU1pbiArPSBmTXVsdEkobWluRmFjSGksZGlmZik7Ci0gICAgICAgICpwZU1heCArPSBmTXVsdEkobWF4RmFjSGksZGlmZik7Ci0gICAgfQotICAgIGVsc2UgaWYgKGN1cnJQZSA8ICpwZU1pbikKLSAgICB7Ci0gICAgICAgIGRpZmYgPSAoKnBlTWluLWN1cnJQZSkgOwotICAgICAgICAqcGVNaW4gLT0gZk11bHRJKG1pbkZhY0xvLGRpZmYpOwotICAgICAgICAqcGVNYXggLT0gZk11bHRJKG1heEZhY0xvLGRpZmYpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqcGVNaW4gKz0gZk11bHRJKG1pbkZhY0hpLCAoY3VyclBlIC0gKnBlTWluKSk7Ci0gICAgICAgICpwZU1heCAtPSBmTXVsdEkobWF4RmFjTG8sICgqcGVNYXggLSBjdXJyUGUpKTsKLSAgICB9CisgIGlmIChjdXJyUGUgPiAqcGVNYXgpIHsKKyAgICBkaWZmID0gKGN1cnJQZSAtICpwZU1heCk7CisgICAgKnBlTWluICs9IGZNdWx0SShtaW5GYWNIaSwgZGlmZik7CisgICAgKnBlTWF4ICs9IGZNdWx0SShtYXhGYWNIaSwgZGlmZik7CisgIH0gZWxzZSBpZiAoY3VyclBlIDwgKnBlTWluKSB7CisgICAgZGlmZiA9ICgqcGVNaW4gLSBjdXJyUGUpOworICAgICpwZU1pbiAtPSBmTXVsdEkobWluRmFjTG8sIGRpZmYpOworICAgICpwZU1heCAtPSBmTXVsdEkobWF4RmFjTG8sIGRpZmYpOworICB9IGVsc2UgeworICAgICpwZU1pbiArPSBmTXVsdEkobWluRmFjSGksIChjdXJyUGUgLSAqcGVNaW4pKTsKKyAgICAqcGVNYXggLT0gZk11bHRJKG1heEZhY0xvLCAoKnBlTWF4IC0gY3VyclBlKSk7CisgIH0KIAotICAgIGlmICgoKnBlTWF4IC0gKnBlTWluKSA8IG1pbkRpZmZfZml4KQotICAgIHsKLSAgICAgICAgSU5UIHBlTWF4X2ZpeCA9ICpwZU1heCwgcGVNaW5fZml4ID0gKnBlTWluOwotICAgICAgICBGSVhQX0RCTCBwYXJ0TG9fZml4LCBwYXJ0SGlfZml4OworICBpZiAoKCpwZU1heCAtICpwZU1pbikgPCBtaW5EaWZmX2ZpeCkgeworICAgIElOVCBwZU1heF9maXggPSAqcGVNYXgsIHBlTWluX2ZpeCA9ICpwZU1pbjsKKyAgICBGSVhQX0RCTCBwYXJ0TG9fZml4LCBwYXJ0SGlfZml4OwogCi0gICAgICAgIHBhcnRMb19maXggPSAoRklYUF9EQkwpZml4TWF4KDAsIGN1cnJQZSAtIHBlTWluX2ZpeCk7Ci0gICAgICAgIHBhcnRIaV9maXggPSAoRklYUF9EQkwpZml4TWF4KDAsIHBlTWF4X2ZpeCAtIGN1cnJQZSk7CisgICAgcGFydExvX2ZpeCA9IChGSVhQX0RCTClmaXhNYXgoMCwgY3VyclBlIC0gcGVNaW5fZml4KTsKKyAgICBwYXJ0SGlfZml4ID0gKEZJWFBfREJMKWZpeE1heCgwLCBwZU1heF9maXggLSBjdXJyUGUpOwogCi0gICAgICAgIHBlTWF4X2ZpeCA9IChJTlQpKGN1cnJQZSArIGZNdWx0SShmRGl2Tm9ybShwYXJ0SGlfZml4LCAocGFydExvX2ZpeCtwYXJ0SGlfZml4KSksIG1pbkRpZmZfZml4KSk7Ci0gICAgICAgIHBlTWluX2ZpeCA9IChJTlQpKGN1cnJQZSAtIGZNdWx0SShmRGl2Tm9ybShwYXJ0TG9fZml4LCAocGFydExvX2ZpeCtwYXJ0SGlfZml4KSksIG1pbkRpZmZfZml4KSk7Ci0gICAgICAgIHBlTWluX2ZpeCA9IGZpeE1heCgwLCBwZU1pbl9maXgpOworICAgIHBlTWF4X2ZpeCA9CisgICAgICAgIChJTlQpKGN1cnJQZSArIGZNdWx0SShmRGl2Tm9ybShwYXJ0SGlfZml4LCAocGFydExvX2ZpeCArIHBhcnRIaV9maXgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkRpZmZfZml4KSk7CisgICAgcGVNaW5fZml4ID0KKyAgICAgICAgKElOVCkoY3VyclBlIC0gZk11bHRJKGZEaXZOb3JtKHBhcnRMb19maXgsIChwYXJ0TG9fZml4ICsgcGFydEhpX2ZpeCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluRGlmZl9maXgpKTsKKyAgICBwZU1pbl9maXggPSBmaXhNYXgoMCwgcGVNaW5fZml4KTsKIAotICAgICAgICAqcGVNYXggPSBwZU1heF9maXg7Ci0gICAgICAgICpwZU1pbiA9IHBlTWluX2ZpeDsKLSAgICB9CisgICAgKnBlTWF4ID0gcGVNYXhfZml4OworICAgICpwZU1pbiA9IHBlTWluX2ZpeDsKKyAgfQogfQogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgZnVuY3Rpb25uYW1lOiBCaXRyZXNDYWxjQml0RmFjCkBAIC0yMTE1LDIwNiArMjM1NCwyMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbWluCiAqLwogCi1zdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX2JpdHJlc0NhbGNCaXRGYWMoY29uc3QgSU5UICAgICAgIGJpdHJlc0JpdHMsCi0gICAgY29uc3QgSU5UICAgICAgICBtYXhCaXRyZXNCaXRzLAotICAgIGNvbnN0IElOVCAgICAgICAgcGUsCi0gICAgY29uc3QgSU5UICAgICAgICBsYXN0V2luZG93U2VxdWVuY2UsCi0gICAgY29uc3QgSU5UICAgICAgICBhdmdCaXRzLAotICAgIGNvbnN0IEZJWFBfREJMICAgbWF4Qml0RmFjLAotICAgIEFESl9USFJfU1RBVEUgICAqQWRqVGhyLAotICAgIEFUU19FTEVNRU5UICAgICAqYWRqVGhyQ2hhbikKLXsKLSAgICBCUkVTX1BBUkFNICpicmVzUGFyYW07Ci0gICAgSU5UIHBleDsKK3ZvaWQgRkRLYWFjRW5jX2JpdHJlc0NhbGNCaXRGYWMoY29uc3QgSU5UIGJpdHJlc0JpdHMsIGNvbnN0IElOVCBtYXhCaXRyZXNCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgcGUsIGNvbnN0IElOVCBsYXN0V2luZG93U2VxdWVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBhdmdCaXRzLCBjb25zdCBGSVhQX0RCTCBtYXhCaXRGYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFESl9USFJfU1RBVEUgKmNvbnN0IEFkalRociwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQgKmNvbnN0IGFkalRockNoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb25zdCBwQml0cmVzRmFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmNvbnN0IHBCaXRyZXNGYWNfZSkgeworICBjb25zdCBCUkVTX1BBUkFNICpicmVzUGFyYW07CisgIElOVCBwZXg7CisgIEZJWFBfREJMIGZpbGxMZXZlbDsKKyAgSU5UIGZpbGxMZXZlbF9lID0gMDsKIAotICAgIElOVCBxbWluLCBxYnIsIHFicmVzLCBxbWJyOwotICAgIEZJWFBfREJMIGJpdFNhdmUsIGJpdFNwZW5kOworICBGSVhQX0RCTCBiaXRyZXNGYWM7CisgIElOVCBiaXRyZXNGYWNfZTsKIAotICAgIEZJWFBfREJMIGJpdHJlc0ZhY19maXgsIHRtcF9jc3QsIHRtcF9maXg7Ci0gICAgRklYUF9EQkwgcGVfcGVycywgYml0c19yYXRpbywgbWF4QnJWYWw7Ci0gICAgRklYUF9EQkwgYml0c2F2ZV9zbG9wZSwgYml0c3BlbmRfc2xvcGUsIG1heEJpdEZhY190bXA7Ci0gICAgRklYUF9EQkwgZmlsbExldmVsX2ZpeCA9IChGSVhQX0RCTCkweDdmZmZmZmZmOwotICAgIEZJWFBfREJMIFVOSVRZID0gKEZJWFBfREJMKTB4N2ZmZmZmZmY7Ci0gICAgRklYUF9EQkwgUE9JTlQ3ID0gKEZJWFBfREJMKTB4NTk5OTk5OUE7CisgIEZJWFBfREJMIGJpdFNhdmUsIGJpdFNwZW5kOworICBGSVhQX0RCTCBiaXRzYXZlX3Nsb3BlLCBiaXRzcGVuZF9zbG9wZTsKKyAgRklYUF9EQkwgZmlsbExldmVsX2ZpeCA9IE1BWFZBTF9EQkw7CiAKLSAgICBpZiAobWF4Qml0cmVzQml0cyA+IGJpdHJlc0JpdHMpIHsKLSAgICAgIGZpbGxMZXZlbF9maXggPSBmRGl2Tm9ybShiaXRyZXNCaXRzLCBtYXhCaXRyZXNCaXRzKTsKLSAgICB9CisgIEZJWFBfREJMIHNsb3BlID0gTUFYVkFMX0RCTDsKIAotICAgIGlmIChsYXN0V2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKQotICAgIHsKLSAgICAgICAgYnJlc1BhcmFtID0gJihBZGpUaHItPmJyZXNQYXJhbUxvbmcpOwotICAgICAgICBiaXRzYXZlX3Nsb3BlID0gKEZJWFBfREJMKTB4M0JCQkJCQkM7Ci0gICAgICAgIGJpdHNwZW5kX3Nsb3BlID0gKEZJWFBfREJMKTB4NTU1NTU1NTU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGJyZXNQYXJhbSA9ICYoQWRqVGhyLT5icmVzUGFyYW1TaG9ydCk7Ci0gICAgICAgIGJpdHNhdmVfc2xvcGUgPSAoRklYUF9EQkwpMHgyRThCQTJFOTsKLSAgICAgICAgYml0c3BlbmRfc2xvcGUgPSAoRklYUF9EQkwpMHg3ZmZmZmZmZjsKLSAgICB9CisgIGlmIChsYXN0V2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKSB7CisgICAgYnJlc1BhcmFtID0gJihBZGpUaHItPmJyZXNQYXJhbUxvbmcpOworICAgIGJpdHNhdmVfc2xvcGUgPSBGTDJGWENPTlNUX0RCTCgwLjQ2NjY2NjY2Nik7CisgICAgYml0c3BlbmRfc2xvcGUgPSBGTDJGWENPTlNUX0RCTCgwLjY2NjY2NjY2Nik7CisgIH0gZWxzZSB7CisgICAgYnJlc1BhcmFtID0gJihBZGpUaHItPmJyZXNQYXJhbVNob3J0KTsKKyAgICBiaXRzYXZlX3Nsb3BlID0gKEZJWFBfREJMKTB4MkU4QkEyRTk7CisgICAgYml0c3BlbmRfc2xvcGUgPSAoRklYUF9EQkwpMHg3ZmZmZmZmZjsKKyAgfQogCi0gICAgcGV4ID0gZml4TWF4KHBlLCBhZGpUaHJDaGFuLT5wZU1pbik7Ci0gICAgcGV4ID0gZml4TWluKHBleCwgYWRqVGhyQ2hhbi0+cGVNYXgpOworICAvLyBmaWxsTGV2ZWwgPSAoZmxvYXQpKGJpdHJlc0JpdHMrYXZnQml0cykgLyAoZmxvYXQpKG1heEJpdHJlc0JpdHMgKyBhdmdCaXRzKTsKKyAgaWYgKGJpdHJlc0JpdHMgPCBtYXhCaXRyZXNCaXRzKSB7CisgICAgZmlsbExldmVsX2ZpeCA9IGZEaXZOb3JtKGJpdHJlc0JpdHMsIG1heEJpdHJlc0JpdHMpOworICB9CiAKLSAgICBiaXRTYXZlID0gRkRLYWFjRW5jX2NhbGNCaXRTYXZlKGZpbGxMZXZlbF9maXgsCi0gICAgICAgIGJyZXNQYXJhbS0+Y2xpcFNhdmVMb3csIGJyZXNQYXJhbS0+Y2xpcFNhdmVIaWdoLAotICAgICAgICBicmVzUGFyYW0tPm1pbkJpdFNhdmUsIGJyZXNQYXJhbS0+bWF4Qml0U2F2ZSwgYml0c2F2ZV9zbG9wZSk7CisgIHBleCA9IGZNYXgocGUsIGFkalRockNoYW4tPnBlTWluKTsKKyAgcGV4ID0gZk1pbihwZXgsIGFkalRockNoYW4tPnBlTWF4KTsKIAotICAgIGJpdFNwZW5kID0gRkRLYWFjRW5jX2NhbGNCaXRTcGVuZChmaWxsTGV2ZWxfZml4LAotICAgICAgICBicmVzUGFyYW0tPmNsaXBTcGVuZExvdywgYnJlc1BhcmFtLT5jbGlwU3BlbmRIaWdoLAotICAgICAgICBicmVzUGFyYW0tPm1pbkJpdFNwZW5kLCBicmVzUGFyYW0tPm1heEJpdFNwZW5kLCBiaXRzcGVuZF9zbG9wZSk7CisgIGJpdFNhdmUgPSBGREthYWNFbmNfY2FsY0JpdFNhdmUoCisgICAgICBmaWxsTGV2ZWxfZml4LCBicmVzUGFyYW0tPmNsaXBTYXZlTG93LCBicmVzUGFyYW0tPmNsaXBTYXZlSGlnaCwKKyAgICAgIGJyZXNQYXJhbS0+bWluQml0U2F2ZSwgYnJlc1BhcmFtLT5tYXhCaXRTYXZlLCBiaXRzYXZlX3Nsb3BlKTsKIAotICAgIHBlX3BlcnMgPSAocGV4ID4gYWRqVGhyQ2hhbi0+cGVNaW4pID8gZkRpdk5vcm0ocGV4IC0gYWRqVGhyQ2hhbi0+cGVNaW4sIGFkalRockNoYW4tPnBlTWF4IC0gYWRqVGhyQ2hhbi0+cGVNaW4pIDogMDsKLSAgICB0bXBfZml4ID0gZk11bHQoKChGSVhQX0RCTCliaXRTcGVuZCArIChGSVhQX0RCTCliaXRTYXZlKSwgcGVfcGVycyk7Ci0gICAgYml0cmVzRmFjX2ZpeCA9IChVTklUWT4+MSkgLSAoKEZJWFBfREJMKWJpdFNhdmU+PjEpICsgKHRtcF9maXg+PjEpOyBxYnJlcyA9IChERlJBQ1RfQklUUy0yKTsKKyAgYml0U3BlbmQgPSBGREthYWNFbmNfY2FsY0JpdFNwZW5kKAorICAgICAgZmlsbExldmVsX2ZpeCwgYnJlc1BhcmFtLT5jbGlwU3BlbmRMb3csIGJyZXNQYXJhbS0+Y2xpcFNwZW5kSGlnaCwKKyAgICAgIGJyZXNQYXJhbS0+bWluQml0U3BlbmQsIGJyZXNQYXJhbS0+bWF4Qml0U3BlbmQsIGJpdHNwZW5kX3Nsb3BlKTsKIAotICAgIC8qIChmbG9hdCliaXRyZXNCaXRzLyhmbG9hdClhdmdCaXRzICovCi0gICAgYml0c19yYXRpbyA9IGZEaXZOb3JtKGJpdHJlc0JpdHMsIGF2Z0JpdHMsICZxYnIpOwotICAgIHFiciA9IERGUkFDVF9CSVRTLTEtcWJyOworICBzbG9wZSA9IHNjaHVyX2RpdigocGV4IC0gYWRqVGhyQ2hhbi0+cGVNaW4pLAorICAgICAgICAgICAgICAgICAgICAoYWRqVGhyQ2hhbi0+cGVNYXggLSBhZGpUaHJDaGFuLT5wZU1pbiksIDMxKTsKIAotICAgIC8qIEFkZCAwLjcgaW4gcTMxIHRvIGJpdHNfcmF0aW8gaW4gcWJyICovCi0gICAgLyogMC43ZiArIChmbG9hdCliaXRyZXNCaXRzLyhmbG9hdClhdmdCaXRzICovCi0gICAgcW1pbiA9IGZpeE1pbihxYnIsIChERlJBQ1RfQklUUy0xKSk7Ci0gICAgYml0c19yYXRpbyA9IGJpdHNfcmF0aW8gPj4gKHFiciAtIHFtaW4pOwotICAgIHRtcF9jc3QgPSBQT0lOVDcgPj4gKChERlJBQ1RfQklUUy0xKSAtIHFtaW4pOwotICAgIG1heEJyVmFsID0gKGJpdHNfcmF0aW8+PjEpICsgKHRtcF9jc3Q+PjEpOyBxbWJyID0gcW1pbiAtIDE7CisgIC8qIHNjYWxlIGRvd24gYnkgMSBiaXQgYmVjYXVzZSB0aGUgcmVzdWx0IG9mIHRoZSBmb2xsb3dpbmcgYWRkaXRpb24gY2FuIGJlCisgICAqIGJpZ2dlciB0aGFuIDEgKHRob3VnaCBzbWFsbGVyIHRoYW4gMikgKi8KKyAgYml0cmVzRmFjID0gKChGSVhQX0RCTCkoTUFYVkFMX0RCTCA+PiAxKSAtIChiaXRTYXZlID4+IDEpKTsKKyAgYml0cmVzRmFjX2UgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4cD0xICovCisgIGJpdHJlc0ZhYyA9IGZNdWx0QWRkRGl2MihiaXRyZXNGYWMsIHNsb3BlLCBiaXRTcGVuZCArIGJpdFNhdmUpOyAvKiBleHA9MSAqLwogCi0gICAgLyogYml0cmVzRmFjX2ZpeCA9IGZpeE1pbihiaXRyZXNGYWNfZml4LCAwLjcgKyBiaXRyZXNCaXRzL2F2Z0JpdHMpOyAqLwotICAgIGJpdHJlc0ZhY19maXggPSBiaXRyZXNGYWNfZml4ID4+IChxYnJlcyAtIHFtYnIpOyBxYnJlcyA9IHFtYnI7Ci0gICAgYml0cmVzRmFjX2ZpeCA9IGZpeE1pbihiaXRyZXNGYWNfZml4LCBtYXhCclZhbCk7CisgIC8qKiogbGltaXQgYml0cmVzRmFjIGZvciBzbWFsbCBiaXRyZXNlcnZvaXIgKioqLworICBmaWxsTGV2ZWwgPSBmRGl2Tm9ybShiaXRyZXNCaXRzLCBhdmdCaXRzLCAmZmlsbExldmVsX2UpOworICBpZiAoZmlsbExldmVsX2UgPCAwKSB7CisgICAgZmlsbExldmVsID0gc2NhbGVWYWx1ZShmaWxsTGV2ZWwsIGZpbGxMZXZlbF9lKTsKKyAgICBmaWxsTGV2ZWxfZSA9IDA7CisgIH0KKyAgLyogc2hpZnQgZG93biB2YWx1ZSBieSAxIGJlY2F1c2Ugb2Ygc3VtbWF0aW9uLCAuLi4gKi8KKyAgZmlsbExldmVsID4+PSAxOworICBmaWxsTGV2ZWxfZSArPSAxOworICAvKiAuLi4sIHRoaXMgc3VtbWF0aW9uOiAqLworICBmaWxsTGV2ZWwgKz0gc2NhbGVWYWx1ZShGTDJGWENPTlNUX0RCTCgwLjdmKSwgLWZpbGxMZXZlbF9lKTsKKyAgLyogc2V0IGJpdHJlc2ZhY3RvciB0byBzYW1lIGV4cG9uZW50IGFzIGZpbGxMZXZlbCAqLworICBpZiAoc2NhbGVWYWx1ZShiaXRyZXNGYWMsIC1maWxsTGV2ZWxfZSArIDEpID4gZmlsbExldmVsKSB7CisgICAgYml0cmVzRmFjID0gZmlsbExldmVsOworICAgIGJpdHJlc0ZhY19lID0gZmlsbExldmVsX2U7CisgIH0KIAotICAgIC8qIENvbXBhcmUgd2l0aCBtYXhCaXRGYWMgKi8KLSAgICBxbWluID0gZml4TWluKFFfQklURkFDLCBxYnJlcyk7Ci0gICAgYml0cmVzRmFjX2ZpeCA9IGJpdHJlc0ZhY19maXggPj4gKHFicmVzIC0gcW1pbik7Ci0gICAgbWF4Qml0RmFjX3RtcCA9IG1heEJpdEZhYyA+PiAoUV9CSVRGQUMgLSBxbWluKTsKLSAgICBpZihtYXhCaXRGYWNfdG1wIDwgYml0cmVzRmFjX2ZpeCkKLSAgICB7Ci0gICAgICAgIGJpdHJlc0ZhY19maXggPSBtYXhCaXRGYWM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKHFtaW4gPCBRX0JJVEZBQykKLSAgICAgICAgewotICAgICAgICAgICAgYml0cmVzRmFjX2ZpeCA9IGJpdHJlc0ZhY19maXggPDwgKFFfQklURkFDLXFtaW4pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYml0cmVzRmFjX2ZpeCA9IGJpdHJlc0ZhY19maXggPj4gKHFtaW4tUV9CSVRGQUMpOwotICAgICAgICB9Ci0gICAgfQorICAvKiBsaW1pdCBiaXRyZXNGYWMgZm9yIGhpZ2ggYml0cmF0ZXMgKi8KKyAgaWYgKHNjYWxlVmFsdWUoYml0cmVzRmFjLCBiaXRyZXNGYWNfZSAtIChERlJBQ1RfQklUUyAtIDEgLSAyNCkpID4gbWF4Qml0RmFjKSB7CisgICAgYml0cmVzRmFjID0gbWF4Qml0RmFjOworICAgIGJpdHJlc0ZhY19lID0gKERGUkFDVF9CSVRTIC0gMSAtIDI0KTsKKyAgfQogCi0gICAgRkRLYWFjRW5jX2FkanVzdFBlTWluTWF4KHBlLCAmYWRqVGhyQ2hhbi0+cGVNaW4sICZhZGpUaHJDaGFuLT5wZU1heCk7CisgIEZES2FhY0VuY19hZGp1c3RQZU1pbk1heChwZSwgJmFkalRockNoYW4tPnBlTWluLCAmYWRqVGhyQ2hhbi0+cGVNYXgpOwogCi0gICAgcmV0dXJuIGJpdHJlc0ZhY19maXg7CisgIC8qIG91dHB1dCB2YWx1ZXMgKi8KKyAgKnBCaXRyZXNGYWMgPSBiaXRyZXNGYWM7CisgICpwQml0cmVzRmFjX2UgPSBiaXRyZXNGYWNfZTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0FkalRock5ldwogZGVzY3JpcHRpb246ICBhbGxvY2F0ZSBBREpfVEhSX1NUQVRFCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUlOVCBGREthYWNFbmNfQWRqVGhyTmV3KEFESl9USFJfU1RBVEUqKiBwaEFkalRociwKLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICBuRWxlbWVudHMpCi17Ci0gICAgSU5UIGVyciA9IDA7Ci0gICAgSU5UIGk7Ci0gICAgQURKX1RIUl9TVEFURSogaEFkalRociA9IEdldFJhbV9hYWNFbmNfQWRqdXN0VGhyZXNob2xkKCk7Ci0gICAgaWYgKGhBZGpUaHI9PU5VTEwpIHsKLSAgICAgICAgZXJyID0gMTsKLSAgICAgICAgZ290byBiYWlsOwotICAgIH0KK0lOVCBGREthYWNFbmNfQWRqVGhyTmV3KEFESl9USFJfU1RBVEUgKipwaEFkalRociwgSU5UIG5FbGVtZW50cykgeworICBJTlQgZXJyID0gMDsKKyAgSU5UIGk7CisgIEFESl9USFJfU1RBVEUgKmhBZGpUaHIgPSBHZXRSYW1fYWFjRW5jX0FkanVzdFRocmVzaG9sZCgpOworICBpZiAoaEFkalRociA9PSBOVUxMKSB7CisgICAgZXJyID0gMTsKKyAgICBnb3RvIGJhaWw7CisgIH0KIAotICAgIGZvciAoaT0wOyBpPG5FbGVtZW50czsgaSsrKSB7Ci0gICAgICAgIGhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXSA9ICBHZXRSYW1fYWFjRW5jX0FkalRoclN0YXRlRWxlbWVudChpKTsKLSAgICAgICAgaWYgKGhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXT09TlVMTCkgewotICAgICAgICAgIGVyciA9IDE7Ci0gICAgICAgICAgZ290byBiYWlsOwotICAgICAgICB9CisgIGZvciAoaSA9IDA7IGkgPCBuRWxlbWVudHM7IGkrKykgeworICAgIGhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXSA9IEdldFJhbV9hYWNFbmNfQWRqVGhyU3RhdGVFbGVtZW50KGkpOworICAgIGlmIChoQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV0gPT0gTlVMTCkgeworICAgICAgZXJyID0gMTsKKyAgICAgIGdvdG8gYmFpbDsKICAgICB9CisgIH0KIAogYmFpbDoKLSAgICAqcGhBZGpUaHIgPSBoQWRqVGhyOwotICAgIHJldHVybiBlcnI7CisgICpwaEFkalRociA9IGhBZGpUaHI7CisgIHJldHVybiBlcnI7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19BZGpUaHJJbml0CiBkZXNjcmlwdGlvbjogIGluaXRpYWxpemUgQURKX1RIUl9TVEFURQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIEZES2FhY0VuY19BZGpUaHJJbml0KAotICAgICAgICBBREpfVEhSX1NUQVRFICAgKmhBZGpUaHIsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICBtZWFuUGUsCi0gICAgICAgIEVMRU1FTlRfQklUUyAgICAqZWxCaXRzWyg4KV0sCi0gICAgICAgIElOVCAgICAgICAgICAgICBpbnZRdWFudCwKLSAgICAgICAgSU5UICAgICAgICAgICAgIG5FbGVtZW50cywKLSAgICAgICAgSU5UICAgICAgICAgICAgIG5DaGFubmVsc0VmZiwKLSAgICAgICAgSU5UICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgIElOVCAgICAgICAgICAgICBhZHZhbmNlZEJpdHNUb1BlLAotICAgICAgICBGSVhQX0RCTCAgICAgICAgdmJyUXVhbEZhY3RvciwKLSAgICAgICAgY29uc3QgSU5UICAgICAgIGRab25lUXVhbnRFbmFibGUKLSAgICAgICAgKQoteworICAgIEFESl9USFJfU1RBVEUgKmNvbnN0IGhBZGpUaHIsIGNvbnN0IElOVCBtZWFuUGUsIGNvbnN0IElOVCBpbnZRdWFudCwKKyAgICBjb25zdCBDSEFOTkVMX01BUFBJTkcgKmNvbnN0IGNoYW5uZWxNYXBwaW5nLCBjb25zdCBJTlQgc2FtcGxlUmF0ZSwKKyAgICBjb25zdCBJTlQgdG90YWxCaXRyYXRlLCBjb25zdCBJTlQgaXNMb3dEZWxheSwKKyAgICBjb25zdCBBQUNFTkNfQklUUkVTX01PREUgYml0UmVzTW9kZSwgY29uc3QgSU5UIGRab25lUXVhbnRFbmFibGUsCisgICAgY29uc3QgSU5UIGJpdERpc3RyaWJ1dGlvbk1vZGUsIGNvbnN0IEZJWFBfREJMIHZiclF1YWxGYWN0b3IpIHsKICAgSU5UIGk7CiAKICAgRklYUF9EQkwgUE9JTlQ4ID0gRkwyRlhDT05TVF9EQkwoMC44Zik7CiAgIEZJWFBfREJMIFBPSU5UNiA9IEZMMkZYQ09OU1RfREJMKDAuNmYpOwogCi0gIC8qIE1heCBudW1iZXIgb2YgaXRlcmF0aW9ucyBpbiBzZWNvbmQgZ3Vlc3MgaXMgMyBmb3IgbG93ZGVsYXkgYW90IGFuZCBmb3IgY29uZmlndXJhdGlvbnMgd2l0aAotICAgICBtdWx0aXBsZSBhdWRpbyBlbGVtZW50cyBpbiBnZW5lcmFsLCBvdGhlcndpc2UgaXRlcmF0aW9uIHZhbHVlIGlzIGFsd2F5cyAxLiAqLwotICBoQWRqVGhyLT5tYXhJdGVyMm5kR3Vlc3MgPSAoYWR2YW5jZWRCaXRzVG9QZSE9MCB8fCBuRWxlbWVudHM+MSkgPyAzIDogMTsKKyAgaWYgKGJpdERpc3RyaWJ1dGlvbk1vZGUgPT0gMSkgeworICAgIGhBZGpUaHItPmJpdERpc3RyaWJ1dGlvbk1vZGUgPSBBQUNFTkNfQkRfTU9ERV9JTlRSQV9FTEVNRU5UOworICB9IGVsc2UgeworICAgIGhBZGpUaHItPmJpdERpc3RyaWJ1dGlvbk1vZGUgPSBBQUNFTkNfQkRfTU9ERV9JTlRFUl9FTEVNRU5UOworICB9CisKKyAgLyogTWF4IG51bWJlciBvZiBpdGVyYXRpb25zIGluIHNlY29uZCBndWVzcyBpcyAzIGZvciBsb3dkZWxheSBhb3QgYW5kIGZvcgorICAgICBjb25maWd1cmF0aW9ucyB3aXRoIG11bHRpcGxlIGF1ZGlvIGVsZW1lbnRzIGluIGdlbmVyYWwsIG90aGVyd2lzZSBpdGVyYXRpb24KKyAgICAgdmFsdWUgaXMgYWx3YXlzIDEuICovCisgIGhBZGpUaHItPm1heEl0ZXIybmRHdWVzcyA9CisgICAgICAoaXNMb3dEZWxheSAhPSAwIHx8IGNoYW5uZWxNYXBwaW5nLT5uRWxlbWVudHMgPiAxKSA/IDMgOiAxOwogCiAgIC8qIGNvbW1vbiBmb3IgYWxsIGVsZW1lbnRzOiAqLwogICAvKiBwYXJhbWV0ZXJzIGZvciBiaXRyZXMgY29udHJvbCAqLwotICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLmNsaXBTYXZlTG93ICAgPSAoRklYUF9EQkwpMHgxOTk5OTk5YTsgLyogRkwyRlhDT05TVF9EQkwoMC4yZik7ICovCi0gIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcuY2xpcFNhdmVIaWdoICA9IChGSVhQX0RCTCkweDc5OTk5OTlhOyAvKiBGTDJGWENPTlNUX0RCTCgwLjk1Zik7ICovCi0gIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcubWluQml0U2F2ZSAgICA9IChGSVhQX0RCTCkweGY5OTk5OTlhOyAvKiBGTDJGWENPTlNUX0RCTCgtMC4wNWYpOyAqLwotICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1heEJpdFNhdmUgICAgPSAoRklYUF9EQkwpMHgyNjY2NjY2NjsgLyogRkwyRlhDT05TVF9EQkwoMC4zZik7ICovCi0gIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcuY2xpcFNwZW5kTG93ICA9IChGSVhQX0RCTCkweDE5OTk5OTlhOyAvKiBGTDJGWENPTlNUX0RCTCgwLjJmKTsgKi8KLSAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU3BlbmRIaWdoID0gKEZJWFBfREJMKTB4Nzk5OTk5OWE7IC8qIEZMMkZYQ09OU1RfREJMKDAuOTVmKTsgKi8KLSAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5taW5CaXRTcGVuZCAgID0gKEZJWFBfREJMKTB4ZjMzMzMzMzM7IC8qIEZMMkZYQ09OU1RfREJMKC0wLjEwZik7ICovCi0gIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcubWF4Qml0U3BlbmQgICA9IChGSVhQX0RCTCkweDMzMzMzMzMzOyAvKiBGTDJGWENPTlNUX0RCTCgwLjRmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU2F2ZUxvdyA9CisgICAgICAoRklYUF9EQkwpMHgxOTk5OTk5YTsgLyogRkwyRlhDT05TVF9EQkwoMC4yZik7ICovCisgIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcuY2xpcFNhdmVIaWdoID0KKyAgICAgIChGSVhQX0RCTCkweDc5OTk5OTlhOyAvKiBGTDJGWENPTlNUX0RCTCgwLjk1Zik7ICovCisgIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcubWluQml0U2F2ZSA9CisgICAgICAoRklYUF9EQkwpMHhmOTk5OTk5YTsgLyogRkwyRlhDT05TVF9EQkwoLTAuMDVmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5tYXhCaXRTYXZlID0KKyAgICAgIChGSVhQX0RCTCkweDI2NjY2NjY2OyAvKiBGTDJGWENPTlNUX0RCTCgwLjNmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU3BlbmRMb3cgPQorICAgICAgKEZJWFBfREJMKTB4MTk5OTk5OWE7IC8qIEZMMkZYQ09OU1RfREJMKDAuMmYpOyAqLworICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLmNsaXBTcGVuZEhpZ2ggPQorICAgICAgKEZJWFBfREJMKTB4Nzk5OTk5OWE7IC8qIEZMMkZYQ09OU1RfREJMKDAuOTVmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5taW5CaXRTcGVuZCA9CisgICAgICAoRklYUF9EQkwpMHhmMzMzMzMzMzsgLyogRkwyRlhDT05TVF9EQkwoLTAuMTBmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5tYXhCaXRTcGVuZCA9CisgICAgICAoRklYUF9EQkwpMHgzMzMzMzMzMzsgLyogRkwyRlhDT05TVF9EQkwoMC40Zik7ICovCiAKLSAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNhdmVMb3cgICA9IChGSVhQX0RCTCkweDE5OTk5OWEwOyAvKiBGTDJGWENPTlNUX0RCTCgwLjJmKTsgKi8KLSAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNhdmVIaWdoICA9IChGSVhQX0RCTCkweDVmZmZmZmZmOyAvKiBGTDJGWENPTlNUX0RCTCgwLjc1Zik7ICovCi0gIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1pbkJpdFNhdmUgICAgPSAoRklYUF9EQkwpMHgwMDAwMDAwMDsgLyogRkwyRlhDT05TVF9EQkwoMC4wZik7ICovCi0gIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1heEJpdFNhdmUgICAgPSAoRklYUF9EQkwpMHgxOTk5OTlhMDsgLyogRkwyRlhDT05TVF9EQkwoMC4yZik7ICovCi0gIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0LmNsaXBTcGVuZExvdyAgPSAoRklYUF9EQkwpMHgxOTk5OTlhMDsgLyogRkwyRlhDT05TVF9EQkwoMC4yZik7ICovCi0gIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0LmNsaXBTcGVuZEhpZ2ggPSAoRklYUF9EQkwpMHg1ZmZmZmZmZjsgLyogRkwyRlhDT05TVF9EQkwoMC43NWYpOyAqLwotICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5taW5CaXRTcGVuZCAgID0gKEZJWFBfREJMKTB4Zjk5OTk5OTg7IC8qIEZMMkZYQ09OU1RfREJMKC0wLjA1Zik7ICovCi0gIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1heEJpdFNwZW5kICAgPSAoRklYUF9EQkwpMHg0MDAwMDAwMDsgLyogRkwyRlhDT05TVF9EQkwoMC41Zik7ICovCisgIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0LmNsaXBTYXZlTG93ID0KKyAgICAgIChGSVhQX0RCTCkweDE5OTk5OWEwOyAvKiBGTDJGWENPTlNUX0RCTCgwLjJmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNhdmVIaWdoID0KKyAgICAgIChGSVhQX0RCTCkweDVmZmZmZmZmOyAvKiBGTDJGWENPTlNUX0RCTCgwLjc1Zik7ICovCisgIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1pbkJpdFNhdmUgPQorICAgICAgKEZJWFBfREJMKTB4MDAwMDAwMDA7IC8qIEZMMkZYQ09OU1RfREJMKDAuMGYpOyAqLworICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5tYXhCaXRTYXZlID0KKyAgICAgIChGSVhQX0RCTCkweDE5OTk5OWEwOyAvKiBGTDJGWENPTlNUX0RCTCgwLjJmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNwZW5kTG93ID0KKyAgICAgIChGSVhQX0RCTCkweDE5OTk5OWEwOyAvKiBGTDJGWENPTlNUX0RCTCgwLjJmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNwZW5kSGlnaCA9CisgICAgICAoRklYUF9EQkwpMHg1ZmZmZmZmZjsgLyogRkwyRlhDT05TVF9EQkwoMC43NWYpOyAqLworICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5taW5CaXRTcGVuZCA9CisgICAgICAoRklYUF9EQkwpMHhmOTk5OTk5ODsgLyogRkwyRlhDT05TVF9EQkwoLTAuMDVmKTsgKi8KKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWF4Qml0U3BlbmQgPQorICAgICAgKEZJWFBfREJMKTB4NDAwMDAwMDA7IC8qIEZMMkZYQ09OU1RfREJMKDAuNWYpOyAqLwogCiAgIC8qIHNwZWNpZmljIGZvciBlYWNoIGVsZW1lbnQ6ICovCi0gIGZvciAoaT0wOyBpPG5FbGVtZW50czsgaSsrKSB7Ci0gICAgQVRTX0VMRU1FTlQqIGF0c0VsZW0gPSBoQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV07CisgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsTWFwcGluZy0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICBjb25zdCBGSVhQX0RCTCByZWxhdGl2ZUJpdHMgPSBjaGFubmVsTWFwcGluZy0+ZWxJbmZvW2ldLnJlbGF0aXZlQml0czsKKyAgICBjb25zdCBJTlQgbkNoYW5uZWxzSW5FbGVtZW50ID0gY2hhbm5lbE1hcHBpbmctPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsOworICAgIGNvbnN0IElOVCBiaXRyYXRlSW5FbGVtZW50ID0KKyAgICAgICAgKHJlbGF0aXZlQml0cyAhPSAoRklYUF9EQkwpTUFYVkFMX0RCTCkKKyAgICAgICAgICAgID8gKElOVClmTXVsdE5vcm0ocmVsYXRpdmVCaXRzLCAoRklYUF9EQkwpdG90YWxCaXRyYXRlKQorICAgICAgICAgICAgOiB0b3RhbEJpdHJhdGU7CisgICAgY29uc3QgSU5UIGNoQml0cmF0ZSA9IGJpdHJhdGVJbkVsZW1lbnQgPj4gKG5DaGFubmVsc0luRWxlbWVudCA9PSAxID8gMCA6IDEpOworCisgICAgQVRTX0VMRU1FTlQgKmF0c0VsZW0gPSBoQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV07CiAgICAgTUlOU05SX0FEQVBUX1BBUkFNICptc2FQYXJhbSA9ICZhdHNFbGVtLT5taW5TbnJBZGFwdFBhcmFtOwotICAgIElOVCBjaEJpdHJhdGUgPSBlbEJpdHNbaV0tPmNoQml0cmF0ZUVsOwogCiAgICAgLyogcGFyYW1ldGVycyBmb3IgYml0cmVzIGNvbnRyb2wgKi8KLSAgICBhdHNFbGVtLT5wZU1pbiA9IGZNdWx0SShQT0lOVDgsIG1lYW5QZSkgPj4gMTsKLSAgICBhdHNFbGVtLT5wZU1heCA9IGZNdWx0SShQT0lOVDYsIG1lYW5QZSk7CisgICAgaWYgKGlzTG93RGVsYXkpIHsKKyAgICAgIGF0c0VsZW0tPnBlTWluID0gZk11bHRJKFBPSU5UOCwgbWVhblBlKTsKKyAgICAgIGF0c0VsZW0tPnBlTWF4ID0gZk11bHRJKFBPSU5UNiwgbWVhblBlKSA8PCAxOworICAgIH0gZWxzZSB7CisgICAgICBhdHNFbGVtLT5wZU1pbiA9IGZNdWx0SShQT0lOVDgsIG1lYW5QZSkgPj4gMTsKKyAgICAgIGF0c0VsZW0tPnBlTWF4ID0gZk11bHRJKFBPSU5UNiwgbWVhblBlKTsKKyAgICB9CiAKICAgICAvKiBmb3IgdXNlIGluIEZES2FhY0VuY19yZWR1Y2VUaHJlc2hvbGRzVkJSICovCiAgICAgYXRzRWxlbS0+Y2hhb3NNZWFzdXJlT2xkID0gRkwyRlhDT05TVF9EQkwoMC4zZik7CiAKICAgICAvKiBhZGRpdGlvbmFsIHBlIG9mZnNldCB0byBjb3JyZWN0IHBlMmJpdHMgZm9yIGxvdyBiaXRyYXRlcyAqLworICAgIC8qIC0tLS0gbm8gbG9uZ2VyIG5lY2Vzc2FyeSwgc2V0IGJ5IHRhYmxlIC0tLS0tICovCiAgICAgYXRzRWxlbS0+cGVPZmZzZXQgPSAwOwogCiAgICAgLyogdmJyIGluaXRpYWxpc2F0aW9uICovCiAgICAgYXRzRWxlbS0+dmJyUXVhbEZhY3RvciA9IHZiclF1YWxGYWN0b3I7Ci0gICAgaWYgKGNoQml0cmF0ZSA8IDMyMDAwKQotICAgIHsKLSAgICAgIGF0c0VsZW0tPnBlT2Zmc2V0ID0gZml4TWF4KDUwLCAxMDAtZk11bHRJKChGSVhQX0RCTCkweDY2NjY2NywgY2hCaXRyYXRlKSk7CisgICAgaWYgKGNoQml0cmF0ZSA8IDMyMDAwKSB7CisgICAgICBhdHNFbGVtLT5wZU9mZnNldCA9CisgICAgICAgICAgZml4TWF4KDUwLCAxMDAgLSBmTXVsdEkoKEZJWFBfREJMKTB4NjY2NjY3LCBjaEJpdHJhdGUpKTsKICAgICB9CiAKICAgICAvKiBhdm9pZCBob2xlIHBhcmFtZXRlcnMgKi8KLSAgICBpZiAoY2hCaXRyYXRlID4gMjAwMDApIHsKKyAgICBpZiAoY2hCaXRyYXRlID49IDIwMDAwKSB7CiAgICAgICBhdHNFbGVtLT5haFBhcmFtLm1vZGlmeU1pblNuciA9IFRSVUU7CiAgICAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiTCA9IDE1OwogICAgICAgYXRzRWxlbS0+YWhQYXJhbS5zdGFydFNmYlMgPSAzOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgYXRzRWxlbS0+YWhQYXJhbS5tb2RpZnlNaW5TbnIgPSBGQUxTRTsKICAgICAgIGF0c0VsZW0tPmFoUGFyYW0uc3RhcnRTZmJMID0gMDsKICAgICAgIGF0c0VsZW0tPmFoUGFyYW0uc3RhcnRTZmJTID0gMDsKQEAgLTIzMjcsOSArMjU4MywxMSBAQAogICAgIC8qIG1heGltdW0gbWluU25yIHJlZHVjdGlvbiB0byBtaW5TbnJebWF4UmVkIGlzIHJlYWNoZWQgZm9yCiAgICAgICAgYXZnRW4vc2ZiRW4gPj0gbWF4UmF0aW8gKi8KICAgICAvKiBtc2FQYXJhbS0+bWF4UmF0aW8gPSAxMDAwLjBmOyAqLwotICAgIC8qbXNhUGFyYW0tPnJlZFJhdGlvRmFjID0gKChmbG9hdCkxLjBmIC0gbXNhUGFyYW0tPm1heFJlZCkgLyAoKGZsb2F0KTEwLjBmKmxvZzEwKG1zYVBhcmFtLT5zdGFydFJhdGlvL21zYVBhcmFtLT5tYXhSYXRpbykvbG9nMTAoMi4wZikqKGZsb2F0KTAuMzAxMDI5OTk1NmYpOyovCisgICAgLyptc2FQYXJhbS0+cmVkUmF0aW9GYWMgPSAoKGZsb2F0KTEuMGYgLSBtc2FQYXJhbS0+bWF4UmVkKSAvCisgICAgICogKChmbG9hdCkxMC4wZipsb2cxMChtc2FQYXJhbS0+c3RhcnRSYXRpby9tc2FQYXJhbS0+bWF4UmF0aW8pL2xvZzEwKDIuMGYpKihmbG9hdCkwLjMwMTAyOTk5NTZmKTsqLwogICAgIG1zYVBhcmFtLT5yZWRSYXRpb0ZhYyA9IEZMMkZYQ09OU1RfREJMKC0wLjM3NWYpOyAvKiAtMC4wMzc1ZiAqIDEwLjBmICovCi0gICAgLyptc2FQYXJhbS0+cmVkT2ZmcyA9IChmbG9hdCkxLjBmIC0gbXNhUGFyYW0tPnJlZFJhdGlvRmFjICogKGZsb2F0KTEwLjBmICogbG9nMTAobXNhUGFyYW0tPnN0YXJ0UmF0aW8pL2xvZzEwKDIuMGYpICogKGZsb2F0KTAuMzAxMDI5OTk1NmY7Ki8KKyAgICAvKm1zYVBhcmFtLT5yZWRPZmZzID0gKGZsb2F0KTEuMGYgLSBtc2FQYXJhbS0+cmVkUmF0aW9GYWMgKiAoZmxvYXQpMTAuMGYgKgorICAgICAqIGxvZzEwKG1zYVBhcmFtLT5zdGFydFJhdGlvKS9sb2cxMCgyLjBmKSAqIChmbG9hdCkwLjMwMTAyOTk5NTZmOyovCiAgICAgbXNhUGFyYW0tPnJlZE9mZnMgPSBGTDJGWENPTlNUX0RCTCgwLjAyMTQ4NDM3NSk7IC8qIDEuMzc1Zi82NC4wZiAqLwogCiAgICAgLyogaW5pdCBwZSBjb3JyZWN0aW9uICovCkBAIC0yMzQzLDMyNCArMjYwMSwzMjQgQEAKIAogICAgIC8qIGluaXQgYml0czJQZUZhY3RvciAqLwogICAgIEZES2FhY0VuY19Jbml0Qml0czJQZUZhY3RvcigKLSAgICAgICAgICAgICAgJmF0c0VsZW0tPmJpdHMyUGVGYWN0b3JfbSwKLSAgICAgICAgICAgICAgJmF0c0VsZW0tPmJpdHMyUGVGYWN0b3JfZSwKLSAgICAgICAgICAgICAgY2hCaXRyYXRlKm5DaGFubmVsc0VmZiwgLyogb3ZlcmFsbCBiaXRyYXRlICovCi0gICAgICAgICAgICAgIG5DaGFubmVsc0VmZiwgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgIGFkdmFuY2VkQml0c1RvUGUsCi0gICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUsCi0gICAgICAgICAgICAgIGludlF1YW50Ci0gICAgICAgICAgICAgICk7CisgICAgICAgICZhdHNFbGVtLT5iaXRzMlBlRmFjdG9yX20sICZhdHNFbGVtLT5iaXRzMlBlRmFjdG9yX2UsIGJpdHJhdGVJbkVsZW1lbnQsCisgICAgICAgIG5DaGFubmVsc0luRWxlbWVudCwgc2FtcGxlUmF0ZSwgaXNMb3dEZWxheSwgZFpvbmVRdWFudEVuYWJsZSwgaW52UXVhbnQpOwogCiAgIH0gLyogZm9yIG5FbGVtZW50cyAqLwotCiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfRkRLYWFjRW5jX2NhbGNQZUNvcnJlY3Rpb24KICAgICBkZXNjcmlwdGlvbjogIGNhbGMgZGVzaXJlZCBwZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCBGREthYWNFbmNfRkRLYWFjRW5jX2NhbGNQZUNvcnJlY3Rpb24oCi0gICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgY29ycmVjdGlvbkZhY19tLAotICAgICAgICBJTlQgKmNvbnN0ICAgICAgICAgICAgICAgIGNvcnJlY3Rpb25GYWNfZSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBwZUFjdCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBwZUxhc3QsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgYml0c0xhc3QsCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9tLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGJpdHMyUGVGYWN0b3JfZQotICAgICAgICApCi17Ci0gIGlmICggKGJpdHNMYXN0ID4gMCkgJiYgKHBlQWN0IDwgMS41ZipwZUxhc3QpICYmIChwZUFjdCA+IDAuN2YqcGVMYXN0KSAmJgotICAgICAgIChGREthYWNFbmNfYml0czJwZTIoYml0c0xhc3QsIGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMmYvMi5mKSwgYml0czJQZUZhY3Rvcl9tKSwgYml0czJQZUZhY3Rvcl9lKzEpID4gcGVMYXN0KSAmJgotICAgICAgIChGREthYWNFbmNfYml0czJwZTIoYml0c0xhc3QsIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNjVmKSwgICAgYml0czJQZUZhY3Rvcl9tKSwgYml0czJQZUZhY3Rvcl9lICApIDwgcGVMYXN0KSApCi0gIHsKKyAgICBGSVhQX0RCTCAqY29uc3QgY29ycmVjdGlvbkZhY19tLCBJTlQgKmNvbnN0IGNvcnJlY3Rpb25GYWNfZSwKKyAgICBjb25zdCBJTlQgcGVBY3QsIGNvbnN0IElOVCBwZUxhc3QsIGNvbnN0IElOVCBiaXRzTGFzdCwKKyAgICBjb25zdCBGSVhQX0RCTCBiaXRzMlBlRmFjdG9yX20sIGNvbnN0IElOVCBiaXRzMlBlRmFjdG9yX2UpIHsKKyAgaWYgKChiaXRzTGFzdCA+IDApICYmIChwZUFjdCA8IDEuNWYgKiBwZUxhc3QpICYmIChwZUFjdCA+IDAuN2YgKiBwZUxhc3QpICYmCisgICAgICAoRkRLYWFjRW5jX2JpdHMycGUyKGJpdHNMYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChGTDJGWENPTlNUX0RCTCgxLjJmIC8gMi5mKSwgYml0czJQZUZhY3Rvcl9tKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYml0czJQZUZhY3Rvcl9lICsgMSkgPiBwZUxhc3QpICYmCisgICAgICAoRkRLYWFjRW5jX2JpdHMycGUyKGJpdHNMYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjY1ZiksIGJpdHMyUGVGYWN0b3JfbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMyUGVGYWN0b3JfZSkgPCBwZUxhc3QpKSB7CiAgICAgRklYUF9EQkwgY29yckZhYyA9ICpjb3JyZWN0aW9uRmFjX207CiAKICAgICBpbnQgc2NhbGluZyA9IDA7Ci0gICAgRklYUF9EQkwgZGVudW0gPSAoRklYUF9EQkwpRkRLYWFjRW5jX2JpdHMycGUyKGJpdHNMYXN0LCBiaXRzMlBlRmFjdG9yX20sIGJpdHMyUGVGYWN0b3JfZSk7CisgICAgRklYUF9EQkwgZGVudW0gPSAoRklYUF9EQkwpRkRLYWFjRW5jX2JpdHMycGUyKGJpdHNMYXN0LCBiaXRzMlBlRmFjdG9yX20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMyUGVGYWN0b3JfZSk7CiAgICAgRklYUF9EQkwgbmV3RmFjID0gZkRpdk5vcm0oKEZJWFBfREJMKXBlTGFzdCwgZGVudW0sICZzY2FsaW5nKTsKIAogICAgIC8qIGRlYWQgem9uZSwgbmV3RmFjIGFuZCBjb3JyRmFjIGFyZSBzY2FsZWQgYnkgMC41ICovCiAgICAgaWYgKChGSVhQX0RCTClwZUxhc3QgPD0gZGVudW0pIHsgLyogcmF0aW8gPD0gMS5mICovCi0gICAgICBuZXdGYWMgPSBmaXhNYXgoc2NhbGVWYWx1ZShmaXhNaW4oIGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMWYvMi5mKSwgbmV3RmFjKSwgc2NhbGVWYWx1ZShGTDJGWENPTlNUX0RCTCggIDEuZi8yLmYpLCAtc2NhbGluZykpLCBzY2FsaW5nKSwgRkwyRlhDT05TVF9EQkwoMC44NWYvMi5mKSApOwotICAgIH0KLSAgICBlbHNlIHsgLyogcmF0aW8gPCAxLmYgKi8KLSAgICAgbmV3RmFjID0gZml4TWF4KCBmaXhNaW4oIHNjYWxlVmFsdWUoZk11bHQoRkwyRlhDT05TVF9EQkwoMC45Zi8yLmYpLCBuZXdGYWMpLCBzY2FsaW5nKSwgRkwyRlhDT05TVF9EQkwoMS4xNWYvMi5mKSApLCBGTDJGWENPTlNUX0RCTCggICAxLmYvMi5mKSApOworICAgICAgbmV3RmFjID0gZml4TWF4KAorICAgICAgICAgIHNjYWxlVmFsdWUoZml4TWluKGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMWYgLyAyLmYpLCBuZXdGYWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlVmFsdWUoRkwyRlhDT05TVF9EQkwoMS5mIC8gMi5mKSwgLXNjYWxpbmcpKSwKKyAgICAgICAgICAgICAgICAgICAgIHNjYWxpbmcpLAorICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuODVmIC8gMi5mKSk7CisgICAgfSBlbHNlIHsgLyogcmF0aW8gPCAxLmYgKi8KKyAgICAgIG5ld0ZhYyA9IGZpeE1heCgKKyAgICAgICAgICBmaXhNaW4oc2NhbGVWYWx1ZShmTXVsdChGTDJGWENPTlNUX0RCTCgwLjlmIC8gMi5mKSwgbmV3RmFjKSwgc2NhbGluZyksCisgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEuMTVmIC8gMi5mKSksCisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMS5mIC8gMi5mKSk7CiAgICAgfQogCi0gICAgaWYgKCAgICgobmV3RmFjID4gRkwyRlhDT05TVF9EQkwoMS5mLzIuZikpICYmIChjb3JyRmFjIDwgRkwyRlhDT05TVF9EQkwoMS5mLzIuZikpKQotICAgICAgICB8fCAoKG5ld0ZhYyA8IEZMMkZYQ09OU1RfREJMKDEuZi8yLmYpKSAmJiAoY29yckZhYyA+IEZMMkZYQ09OU1RfREJMKDEuZi8yLmYpKSkpCi0gICAgewotICAgICAgY29yckZhYyA9IEZMMkZYQ09OU1RfREJMKDEuZi8yLmYpOworICAgIGlmICgoKG5ld0ZhYyA+IEZMMkZYQ09OU1RfREJMKDEuZiAvIDIuZikpICYmCisgICAgICAgICAoY29yckZhYyA8IEZMMkZYQ09OU1RfREJMKDEuZiAvIDIuZikpKSB8fAorICAgICAgICAoKG5ld0ZhYyA8IEZMMkZYQ09OU1RfREJMKDEuZiAvIDIuZikpICYmCisgICAgICAgICAoY29yckZhYyA+IEZMMkZYQ09OU1RfREJMKDEuZiAvIDIuZikpKSkgeworICAgICAgY29yckZhYyA9IEZMMkZYQ09OU1RfREJMKDEuZiAvIDIuZik7CiAgICAgfQogCiAgICAgLyogZmFzdGVyIGFkYXB0YXRpb24gdG93YXJkcyAxLjAsIHNsb3dlciBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uICovCi0gICAgaWYgKCAoY29yckZhYyA8IEZMMkZYQ09OU1RfREJMKDEuZi8yLmYpICYmIG5ld0ZhYyA8IGNvcnJGYWMpCi0gICAgICB8fCAoY29yckZhYyA+IEZMMkZYQ09OU1RfREJMKDEuZi8yLmYpICYmIG5ld0ZhYyA+IGNvcnJGYWMpICkKLSAgICB7Ci0gICAgICBjb3JyRmFjID0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC44NWYpLCBjb3JyRmFjKSArIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuMTVmKSwgbmV3RmFjKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBjb3JyRmFjID0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC43ZiksIGNvcnJGYWMpICsgZk11bHQoRkwyRlhDT05TVF9EQkwoMC4zZiksIG5ld0ZhYyk7CisgICAgaWYgKChjb3JyRmFjIDwgRkwyRlhDT05TVF9EQkwoMS5mIC8gMi5mKSAmJiBuZXdGYWMgPCBjb3JyRmFjKSB8fAorICAgICAgICAoY29yckZhYyA+IEZMMkZYQ09OU1RfREJMKDEuZiAvIDIuZikgJiYgbmV3RmFjID4gY29yckZhYykpIHsKKyAgICAgIGNvcnJGYWMgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjg1ZiksIGNvcnJGYWMpICsKKyAgICAgICAgICAgICAgICBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjE1ZiksIG5ld0ZhYyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvcnJGYWMgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjdmKSwgY29yckZhYykgKworICAgICAgICAgICAgICAgIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuM2YpLCBuZXdGYWMpOwogICAgIH0KIAotICAgIGNvcnJGYWMgPSBmaXhNYXgoIGZpeE1pbiggY29yckZhYywgRkwyRlhDT05TVF9EQkwoMS4xNWYvMi5mKSApLCBGTDJGWENPTlNUX0RCTCgwLjg1LzIuZikgKTsKKyAgICBjb3JyRmFjID0gZml4TWF4KGZpeE1pbihjb3JyRmFjLCBGTDJGWENPTlNUX0RCTCgxLjE1ZiAvIDIuZikpLAorICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC44NSAvIDIuZikpOwogCiAgICAgKmNvcnJlY3Rpb25GYWNfbSA9IGNvcnJGYWM7CiAgICAgKmNvcnJlY3Rpb25GYWNfZSA9IDE7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgKmNvcnJlY3Rpb25GYWNfbSA9IEZMMkZYQ09OU1RfREJMKDEuZi8yLmYpOworICB9IGVsc2UgeworICAgICpjb3JyZWN0aW9uRmFjX20gPSBGTDJGWENPTlNUX0RCTCgxLmYgLyAyLmYpOwogICAgICpjb3JyZWN0aW9uRmFjX2UgPSAxOwogICB9CiB9CiAKLQogc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NhbGNQZUNvcnJlY3Rpb25Mb3dCaXRSZXMoCi0gICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgY29ycmVjdGlvbkZhY19tLAotICAgICAgICBJTlQgKmNvbnN0ICAgICAgICAgICAgICAgIGNvcnJlY3Rpb25GYWNfZSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBwZUxhc3QsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgYml0c0xhc3QsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgYml0cmVzTGV2ZWwsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAotICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAgICAgICAgIGJpdHMyUGVGYWN0b3JfbSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBiaXRzMlBlRmFjdG9yX2UKLSAgICAgICAgKQoteworICAgIEZJWFBfREJMICpjb25zdCBjb3JyZWN0aW9uRmFjX20sIElOVCAqY29uc3QgY29ycmVjdGlvbkZhY19lLAorICAgIGNvbnN0IElOVCBwZUxhc3QsIGNvbnN0IElOVCBiaXRzTGFzdCwgY29uc3QgSU5UIGJpdHJlc0xldmVsLAorICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsIGNvbnN0IEZJWFBfREJMIGJpdHMyUGVGYWN0b3JfbSwKKyAgICBjb25zdCBJTlQgYml0czJQZUZhY3Rvcl9lKSB7CiAgIC8qIHR1bmluZyBwYXJhbXMgKi8KLSAgY29uc3QgRklYUF9EQkwgYW1wICAgICA9IEZMMkZYQ09OU1RfREJMKDAuMDA1KTsKKyAgY29uc3QgRklYUF9EQkwgYW1wID0gRkwyRlhDT05TVF9EQkwoMC4wMDUpOwogICBjb25zdCBGSVhQX0RCTCBtYXhEaWZmID0gRkwyRlhDT05TVF9EQkwoMC4yNWYpOwogCiAgIGlmIChiaXRzTGFzdCA+IDApIHsKLQotICAgIC8qIEVzdGltYXRlIGRldmlhdGlvbiBvZiBncmFudGVkIGFuZCB1c2VkIGR5bmFtaWMgYml0cyBpbiBwcmV2aW91cyBmcmFtZSwgaW4gUEUgdW5pdHMgKi8KLSAgICBjb25zdCBpbnQgYml0c0JhbExhc3QgPSBwZUxhc3QgLSBGREthYWNFbmNfYml0czJwZTIoCi0gICAgICAgICAgYml0c0xhc3QsCi0gICAgICAgICAgYml0czJQZUZhY3Rvcl9tLAotICAgICAgICAgIGJpdHMyUGVGYWN0b3JfZSk7CisgICAgLyogRXN0aW1hdGUgZGV2aWF0aW9uIG9mIGdyYW50ZWQgYW5kIHVzZWQgZHluYW1pYyBiaXRzIGluIHByZXZpb3VzIGZyYW1lLCBpbgorICAgICAqIFBFIHVuaXRzICovCisgICAgY29uc3QgaW50IGJpdHNCYWxMYXN0ID0KKyAgICAgICAgcGVMYXN0IC0gRkRLYWFjRW5jX2JpdHMycGUyKGJpdHNMYXN0LCBiaXRzMlBlRmFjdG9yX20sIGJpdHMyUGVGYWN0b3JfZSk7CiAKICAgICAvKiByZXNlcnZlIG4gYml0cyBwZXIgY2hhbm5lbCAqLwotICAgIGludCBoZWFkcm9vbSA9IChiaXRyZXNMZXZlbD49NTAqbkNoYW5uZWxzKSA/IDAgOiAoMTAwKm5DaGFubmVscyk7CisgICAgaW50IGhlYWRyb29tID0gKGJpdHJlc0xldmVsID49IDUwICogbkNoYW5uZWxzKSA/IDAgOiAoMTAwICogbkNoYW5uZWxzKTsKIAogICAgIC8qIGluIFBFIHVuaXRzICovCi0gICAgaGVhZHJvb20gPSBGREthYWNFbmNfYml0czJwZTIoCi0gICAgICAgICAgaGVhZHJvb20sCi0gICAgICAgICAgYml0czJQZUZhY3Rvcl9tLAotICAgICAgICAgIGJpdHMyUGVGYWN0b3JfZSk7CisgICAgaGVhZHJvb20gPSBGREthYWNFbmNfYml0czJwZTIoaGVhZHJvb20sIGJpdHMyUGVGYWN0b3JfbSwgYml0czJQZUZhY3Rvcl9lKTsKIAogICAgIC8qCiAgICAgICogZGlmZiA9IGFtcCAqICgoYml0c0JhbExhc3QgLSBoZWFkcm9vbSkgLyAoYml0cmVzTGV2ZWwgKyBoZWFkcm9vbSkKICAgICAgKiBkaWZmID0gbWF4ICggbWluICggZGlmZiwgbWF4RGlmZiwgLW1heERpZmYpKSAvIDIKICAgICAgKi8KLSAgICBGSVhQX0RCTCBkZW5vbWluYXRvciA9IChGSVhQX0RCTClGREthYWNFbmNfYml0czJwZTIoYml0cmVzTGV2ZWwsIGJpdHMyUGVGYWN0b3JfbSwgYml0czJQZUZhY3Rvcl9lKSArIChGSVhQX0RCTCloZWFkcm9vbTsKKyAgICBGSVhQX0RCTCBkZW5vbWluYXRvciA9IChGSVhQX0RCTClGREthYWNFbmNfYml0czJwZTIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cmVzTGV2ZWwsIGJpdHMyUGVGYWN0b3JfbSwgYml0czJQZUZhY3Rvcl9lKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpaGVhZHJvb207CiAKICAgICBpbnQgc2NhbGluZyA9IDA7Ci0gICAgRklYUF9EQkwgZGlmZiA9IChiaXRzQmFsTGFzdD49aGVhZHJvb20pCi0gICAgICAgICA/ICBmTXVsdChhbXAsIGZEaXZOb3JtKCAoRklYUF9EQkwpKGJpdHNCYWxMYXN0IC0gaGVhZHJvb20pLCBkZW5vbWluYXRvciwgJnNjYWxpbmcpKQotICAgICAgICAgOiAtZk11bHQoYW1wLCBmRGl2Tm9ybSgtKEZJWFBfREJMKShiaXRzQmFsTGFzdCAtIGhlYWRyb29tKSwgZGVub21pbmF0b3IsICZzY2FsaW5nKSkgOworICAgIEZJWFBfREJMIGRpZmYgPQorICAgICAgICAoYml0c0JhbExhc3QgPj0gaGVhZHJvb20pCisgICAgICAgICAgICA/IGZNdWx0KGFtcCwgZkRpdk5vcm0oKEZJWFBfREJMKShiaXRzQmFsTGFzdCAtIGhlYWRyb29tKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW5vbWluYXRvciwgJnNjYWxpbmcpKQorICAgICAgICAgICAgOiAtZk11bHQoYW1wLCBmRGl2Tm9ybSgtKEZJWFBfREJMKShiaXRzQmFsTGFzdCAtIGhlYWRyb29tKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVub21pbmF0b3IsICZzY2FsaW5nKSk7CiAKICAgICBzY2FsaW5nIC09IDE7IC8qIGRpdmlkZSBieSAyICovCiAKLSAgICBkaWZmID0gKHNjYWxpbmc8PTApID8gRkRLbWF4KCBGREttaW4gKGRpZmY+Pigtc2NhbGluZyksIG1heERpZmY+PjEpLCAtbWF4RGlmZj4+MSkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogRkRLbWF4KCBGREttaW4gKGRpZmYsIG1heERpZmY+PigxK3NjYWxpbmcpKSwgLW1heERpZmY+PigxK3NjYWxpbmcpKSA8PCBzY2FsaW5nOworICAgIGRpZmYgPSAoc2NhbGluZyA8PSAwKQorICAgICAgICAgICAgICAgPyBmTWF4KGZNaW4oZGlmZiA+PiAoLXNjYWxpbmcpLCBtYXhEaWZmID4+IDEpLCAtbWF4RGlmZiA+PiAxKQorICAgICAgICAgICAgICAgOiBmTWF4KGZNaW4oZGlmZiwgbWF4RGlmZiA+PiAoMSArIHNjYWxpbmcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAtbWF4RGlmZiA+PiAoMSArIHNjYWxpbmcpKQorICAgICAgICAgICAgICAgICAgICAgPDwgc2NhbGluZzsKIAogICAgIC8qCiAgICAgICogY29yckZhYyArPSBkaWZmCiAgICAgICogY29yckZhYyA9IG1heCAoIG1pbiAoIGNvcnJGYWMvMi5mLCAxLmYvMi5mLCAwLjc1Zi8yLmYgKSApCiAgICAgICovCi0gICAgKmNvcnJlY3Rpb25GYWNfbSA9IEZES21heChGREttaW4oKCpjb3JyZWN0aW9uRmFjX20pK2RpZmYsIEZMMkZYQ09OU1RfREJMKDEuMGYvMi5mKSksIEZMMkZYQ09OU1RfREJMKDAuNzVmLzIuZikpIDsKKyAgICAqY29ycmVjdGlvbkZhY19tID0KKyAgICAgICAgZk1heChmTWluKCgqY29ycmVjdGlvbkZhY19tKSArIGRpZmYsIEZMMkZYQ09OU1RfREJMKDEuMGYgLyAyLmYpKSwKKyAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjc1ZiAvIDIuZikpOwogICAgICpjb3JyZWN0aW9uRmFjX2UgPSAxOwotICB9Ci0gIGVsc2UgewotICAgICpjb3JyZWN0aW9uRmFjX20gPSBGTDJGWENPTlNUX0RCTCgwLjc1LzIuZik7CisgIH0gZWxzZSB7CisgICAgKmNvcnJlY3Rpb25GYWNfbSA9IEZMMkZYQ09OU1RfREJMKDAuNzUgLyAyLmYpOwogICAgICpjb3JyZWN0aW9uRmFjX2UgPSAxOwogICB9CiB9CiAKLXZvaWQgRkRLYWFjRW5jX0Rpc3RyaWJ1dGVCaXRzKEFESl9USFJfU1RBVEUgKmFkalRoclN0YXRlLAotICAgIEFUU19FTEVNRU5UICAgICAgICpBZGpUaHJTdGF0ZUVsZW1lbnQsCi0gICAgUFNZX09VVF9DSEFOTkVMICAgKnBzeU91dENoYW5uZWxbKDIpXSwKLSAgICBQRV9EQVRBICAgICAgICAgICAqcGVEYXRhLAotICAgIElOVCAgICAgICAgICAgICAgICpncmFudGVkUGUsCi0gICAgSU5UICAgICAgICAgICAgICAgKmdyYW50ZWRQZUNvcnIsCi0gICAgY29uc3QgSU5UICAgICAgICAgbkNoYW5uZWxzLAotICAgIGNvbnN0IElOVCAgICAgICAgIGNvbW1vbldpbmRvdywKLSAgICBjb25zdCBJTlQgICAgICAgICBncmFudGVkRHluQml0cywKLSAgICBjb25zdCBJTlQgICAgICAgICBiaXRyZXNCaXRzLAotICAgIGNvbnN0IElOVCAgICAgICAgIG1heEJpdHJlc0JpdHMsCi0gICAgY29uc3QgRklYUF9EQkwgICAgbWF4Qml0RmFjLAotICAgIGNvbnN0IElOVCAgICAgICAgIGJpdERpc3RyaWJ1dGlvbk1vZGUpCi17Cit2b2lkIEZES2FhY0VuY19EaXN0cmlidXRlQml0cygKKyAgICBBREpfVEhSX1NUQVRFICphZGpUaHJTdGF0ZSwgQVRTX0VMRU1FTlQgKkFkalRoclN0YXRlRWxlbWVudCwKKyAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5uZWxbKDIpXSwgUEVfREFUQSAqcGVEYXRhLCBJTlQgKmdyYW50ZWRQZSwKKyAgICBJTlQgKmdyYW50ZWRQZUNvcnIsIGNvbnN0IElOVCBuQ2hhbm5lbHMsIGNvbnN0IElOVCBjb21tb25XaW5kb3csCisgICAgY29uc3QgSU5UIGdyYW50ZWREeW5CaXRzLCBjb25zdCBJTlQgYml0cmVzQml0cywgY29uc3QgSU5UIG1heEJpdHJlc0JpdHMsCisgICAgY29uc3QgRklYUF9EQkwgbWF4Qml0RmFjLCBjb25zdCBBQUNFTkNfQklUUkVTX01PREUgYml0UmVzTW9kZSkgewogICBGSVhQX0RCTCBiaXRGYWN0b3I7CisgIElOVCBiaXRGYWN0b3JfZTsKICAgSU5UIG5vUmVkUGUgPSBwZURhdGEtPnBlOwogCiAgIC8qIHByZWZlciBzaG9ydCB3aW5kb3dzIGZvciBjYWxjdWxhdGlvbiBvZiBiaXRGYWN0b3IgKi8KICAgSU5UIGN1cldpbmRvd1NlcXVlbmNlID0gTE9OR19XSU5ET1c7Ci0gIGlmIChuQ2hhbm5lbHM9PTIpIHsKKyAgaWYgKG5DaGFubmVscyA9PSAyKSB7CiAgICAgaWYgKChwc3lPdXRDaGFubmVsWzBdLT5sYXN0V2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSB8fAogICAgICAgICAocHN5T3V0Q2hhbm5lbFsxXS0+bGFzdFdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykpIHsKLSAgICAgICAgY3VyV2luZG93U2VxdWVuY2UgPSBTSE9SVF9XSU5ET1c7CisgICAgICBjdXJXaW5kb3dTZXF1ZW5jZSA9IFNIT1JUX1dJTkRPVzsKICAgICB9Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgY3VyV2luZG93U2VxdWVuY2UgPSBwc3lPdXRDaGFubmVsWzBdLT5sYXN0V2luZG93U2VxdWVuY2U7CiAgIH0KIAogICBpZiAoZ3JhbnRlZER5bkJpdHMgPj0gMSkgewotICAgIGlmIChiaXREaXN0cmlidXRpb25Nb2RlIT0wKSB7Ci0gICAgICAqZ3JhbnRlZFBlID0gRkRLYWFjRW5jX2JpdHMycGUyKGdyYW50ZWREeW5CaXRzLCBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfbSwgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIC8qIGZhY3RvciBkZXBlbmRlbmQgb24gY3VycmVudCBmaWxsIGxldmVsIGFuZCBwZSAqLwotICAgIGJpdEZhY3RvciA9IEZES2FhY0VuY19iaXRyZXNDYWxjQml0RmFjKGJpdHJlc0JpdHMsIG1heEJpdHJlc0JpdHMsIG5vUmVkUGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJXaW5kb3dTZXF1ZW5jZSwgZ3JhbnRlZER5bkJpdHMsIG1heEJpdEZhYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkalRoclN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIGlmIChiaXRSZXNNb2RlICE9IEFBQ0VOQ19CUl9NT0RFX0ZVTEwpIHsKKyAgICAgIC8qIHNtYWxsIG9yIGRpc2FibGVkIGJpdHJlc2Vydm9pciAqLworICAgICAgKmdyYW50ZWRQZSA9IEZES2FhY0VuY19iaXRzMnBlMihncmFudGVkRHluQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9lKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogZmFjdG9yIGRlcGVuZGVuZCBvbiBjdXJyZW50IGZpbGwgbGV2ZWwgYW5kIHBlICovCisgICAgICBGREthYWNFbmNfYml0cmVzQ2FsY0JpdEZhYygKKyAgICAgICAgICBiaXRyZXNCaXRzLCBtYXhCaXRyZXNCaXRzLCBub1JlZFBlLCBjdXJXaW5kb3dTZXF1ZW5jZSwgZ3JhbnRlZER5bkJpdHMsCisgICAgICAgICAgbWF4Qml0RmFjLCBhZGpUaHJTdGF0ZSwgQWRqVGhyU3RhdGVFbGVtZW50LCAmYml0RmFjdG9yLCAmYml0RmFjdG9yX2UpOwogCi0gICAgLyogZGVzaXJlZCBwZSBmb3IgYWN0dWFsIGZyYW1lICovCi0gICAgLyogV29yc3QgY2FzZSBtYXggb2YgZ3JhbnRlZER5bkJpdHMgaXMgPSAxMDI0ICogNS4yNyAqIDIgKi8KLSAgICAqZ3JhbnRlZFBlID0gRkRLYWFjRW5jX2JpdHMycGUyKGdyYW50ZWREeW5CaXRzLAotICAgICAgICAgICAgICAgICAgICAgZk11bHQoYml0RmFjdG9yLCBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfbSksIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9lKyhERlJBQ1RfQklUUy0xLVFfQklURkFDKQotICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgIC8qIGRlc2lyZWQgcGUgZm9yIGFjdHVhbCBmcmFtZSAqLworICAgICAgLyogV29yc3QgY2FzZSBtYXggb2YgZ3JhbnRlZER5bkJpdHMgaXMgPSAxMDI0ICogNS4yNyAqIDIgKi8KKyAgICAgICpncmFudGVkUGUgPSBGREthYWNFbmNfYml0czJwZTIoCisgICAgICAgICAgZ3JhbnRlZER5bkJpdHMsIGZNdWx0KGJpdEZhY3RvciwgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX20pLAorICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9lICsgYml0RmFjdG9yX2UpOwogICAgIH0KLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICAqZ3JhbnRlZFBlID0gMDsgLyogcHJldmVudCBkaXZzaW9uIGJ5IDAgKi8KICAgfQogCiAgIC8qIGNvcnJlY3Rpb24gb2YgcGUgdmFsdWUgKi8KLSAgc3dpdGNoIChiaXREaXN0cmlidXRpb25Nb2RlKSB7Ci0gIGNhc2UgMjoKLSAgY2FzZSAxOgotICAgIEZES2FhY0VuY19jYWxjUGVDb3JyZWN0aW9uTG93Qml0UmVzKAotICAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3JfbSwKLSAgICAgICAgICAgJkFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yX2UsCi0gICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlTGFzdCwKLSAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+ZHluQml0c0xhc3QsCi0gICAgICAgICAgICBiaXRyZXNCaXRzLAotICAgICAgICAgICAgbkNoYW5uZWxzLAotICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX20sCi0gICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfZQotICAgICAgICApOwotICAgIGJyZWFrOwotICBjYXNlIDA6Ci0gIGRlZmF1bHQ6CisgIHN3aXRjaCAoYml0UmVzTW9kZSkgeworICAgIGNhc2UgQUFDRU5DX0JSX01PREVfRElTQUJMRUQ6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9SRURVQ0VEOgorICAgICAgLyogY29ycmVjdGlvbiBvZiBwZSB2YWx1ZSBmb3IgbG93IGJpdHJlcyAqLworICAgICAgRkRLYWFjRW5jX2NhbGNQZUNvcnJlY3Rpb25Mb3dCaXRSZXMoCisgICAgICAgICAgJkFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yX20sCisgICAgICAgICAgJkFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yX2UsIEFkalRoclN0YXRlRWxlbWVudC0+cGVMYXN0LAorICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+ZHluQml0c0xhc3QsIGJpdHJlc0JpdHMsIG5DaGFubmVscywKKyAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfbSwKKyAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0ZVTEw6CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIGNvcnJlY3Rpb24gb2YgcGUgdmFsdWUgZm9yIGhpZ2ggYml0cmVzICovCiAgICAgICBGREthYWNFbmNfRkRLYWFjRW5jX2NhbGNQZUNvcnJlY3Rpb24oCi0gICAgICAgICAgICZBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlQ29ycmVjdGlvbkZhY3Rvcl9tLAotICAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3JfZSwKLSAgICAgICAgICAgIGZpeE1pbigqZ3JhbnRlZFBlLCBub1JlZFBlKSwKLSAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+cGVMYXN0LAotICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5keW5CaXRzTGFzdCwKLSAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+Yml0czJQZUZhY3Rvcl9tLAotICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5iaXRzMlBlRmFjdG9yX2UKLSAgICAgICAgICAgICk7Ci0gICAgYnJlYWs7CisgICAgICAgICAgJkFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yX20sCisgICAgICAgICAgJkFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yX2UsCisgICAgICAgICAgZml4TWluKCpncmFudGVkUGUsIG5vUmVkUGUpLCBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlTGFzdCwKKyAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmR5bkJpdHNMYXN0LCBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfbSwKKyAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmJpdHMyUGVGYWN0b3JfZSk7CisgICAgICBicmVhazsKICAgfQogCi0gICpncmFudGVkUGVDb3JyID0gKElOVCkoZk11bHQoKEZJWFBfREJMKSgqZ3JhbnRlZFBlPDxRX0FWR0JJVFMpLCBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlQ29ycmVjdGlvbkZhY3Rvcl9tKSA+PiAoUV9BVkdCSVRTLUFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yX2UpKTsKKyAgKmdyYW50ZWRQZUNvcnIgPQorICAgICAgKElOVCkoZk11bHQoKEZJWFBfREJMKSgqZ3JhbnRlZFBlIDw8IFFfQVZHQklUUyksCisgICAgICAgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlQ29ycmVjdGlvbkZhY3Rvcl9tKSA+PgorICAgICAgICAgICAgKFFfQVZHQklUUyAtIEFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yX2UpKTsKIAogICAvKiB1cGRhdGUgbGFzdCBwZSAqLwogICBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlTGFzdCA9ICpncmFudGVkUGU7CiAgIEFkalRoclN0YXRlRWxlbWVudC0+ZHluQml0c0xhc3QgPSAtMTsKLQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0FkanVzdFRocmVzaG9sZHMKIGRlc2NyaXB0aW9uOiAgYWRqdXN0IHRocmVzaG9sZHMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBGREthYWNFbmNfQWRqdXN0VGhyZXNob2xkcyhBVFNfRUxFTUVOVCogICAgICAgIEFkalRoclN0YXRlRWxlbWVudFsoOCldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogICAgIHFjRWxlbWVudFsoOCldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqICAgICAgICAgICAgIHFjT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqICAgIHBzeU91dEVsZW1lbnRbKDgpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICBDQlJiaXRyYXRlTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICBtYXhJdGVyMm5kR3Vlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyogICAgY20pCi17Ci0gICAgaW50IGk7Ci0gICAgaWYgKENCUmJpdHJhdGVNb2RlKQotICAgIHsKLSAgICAgICAgLyogSW4gY2FzZSwgbm8gYml0cyBtdXN0IGJlIHNoaWZ0ZWQgYmV0d2VlbiBkaWZmZXJlbnQgZWxlbWVudHMsICovCi0gICAgICAgIC8qIGFuIGVsZW1lbnQtd2lzZSBleGVjdXRpb24gb2YgdGhlIHBlLWRlcGVuZGVudCB0aHJlc2hvbGQtICovCi0gICAgICAgIC8qIGFkYXB0aW9uIGJlY29tZXMgbmVjZXNzYXJ5Li4uICovCi0gICAgICAgICAgICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07Cit2b2lkIEZES2FhY0VuY19BZGp1c3RUaHJlc2hvbGRzKAorICAgIEFESl9USFJfU1RBVEUgKmNvbnN0IGhBZGpUaHIsIFFDX09VVF9FTEVNRU5UICpjb25zdCBxY0VsZW1lbnRbKCg4KSldLAorICAgIFFDX09VVCAqY29uc3QgcWNPdXQsIGNvbnN0IFBTWV9PVVRfRUxFTUVOVCAqY29uc3QgcHN5T3V0RWxlbWVudFsoKDgpKV0sCisgICAgY29uc3QgSU5UIENCUmJpdHJhdGVNb2RlLCBjb25zdCBDSEFOTkVMX01BUFBJTkcgKmNvbnN0IGNtKSB7CisgIGludCBpOwogCi0gICAgICAgICAgICAgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAotICAgICAgICAgICAgICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogcWNFbGVtZW50W2ldLT5ncmFudGVkUGUgPSAyMDAwOyAqLyAgLyogVXNlIHRoaXMgb25seSBmb3IgZGVidWdnaW5nICovCi0gICAgICAgICAgICAgICAgICAgIC8vaWYgKHRvdGFsR3JhbnRlZFBlQ29yciA8IHRvdGFsTm9SZWRQZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocWNFbGVtZW50W2ldLT5ncmFudGVkUGUgPCBxY0VsZW1lbnRbaV0tPnBlRGF0YS5wZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsYyB0aHJlc2hvbGQgbmVjZXNzYXJ5IGZvciBkZXNpcmVkIHBlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfYWRhcHRUaHJlc2hvbGRzVG9QZShjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtpXS0+Z3JhbnRlZFBlQ29yciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SXRlcjJuZEd1ZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAgICAgICAgIC8qIFByb2Nlc3Mgb25seSAxIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7ICAgICAgICAvKiBQcm9jZXNzIGV4YWN0bHkgVEhJUyBlbGVtZW50ICovCisgIGlmIChDQlJiaXRyYXRlTW9kZSkgeworICAgIC8qIEluIGNhc2UsIG5vIGJpdHMgbXVzdCBiZSBzaGlmdGVkIGJldHdlZW4gZGlmZmVyZW50IGVsZW1lbnRzLCAqLworICAgIC8qIGFuIGVsZW1lbnQtd2lzZSBleGVjdXRpb24gb2YgdGhlIHBlLWRlcGVuZGVudCB0aHJlc2hvbGQtICovCisgICAgLyogYWRhcHRpb24gYmVjb21lcyBuZWNlc3NhcnkuLi4gKi8KKyAgICBpZiAoaEFkalRoci0+Yml0RGlzdHJpYnV0aW9uTW9kZSA9PSBBQUNFTkNfQkRfTU9ERV9JTlRSQV9FTEVNRU5UKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgY20tPm5FbGVtZW50czsgaSsrKSB7CisgICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOwogCi0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAorICAgICAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkgeworICAgICAgICAgIC8qIHFjRWxlbWVudFtpXS0+Z3JhbnRlZFBlID0gMjAwMDsgKi8gLyogVXNlIHRoaXMgb25seSBmb3IgZGVidWdnaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAvLyBpZiAodG90YWxHcmFudGVkUGVDb3JyIDwgdG90YWxOb1JlZFBlKSB7CisgICAgICAgICAgaWYgKHFjRWxlbWVudFtpXS0+Z3JhbnRlZFBlQ29yciA8IHFjRWxlbWVudFtpXS0+cGVEYXRhLnBlKSB7CisgICAgICAgICAgICAvKiBjYWxjIHRocmVzaG9sZCBuZWNlc3NhcnkgZm9yIGRlc2lyZWQgcGUgKi8KKyAgICAgICAgICAgIEZES2FhY0VuY19hZGFwdFRocmVzaG9sZHNUb1BlKAorICAgICAgICAgICAgICAgIGNtLCBoQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW0sIHFjRWxlbWVudCwgcHN5T3V0RWxlbWVudCwKKyAgICAgICAgICAgICAgICBxY0VsZW1lbnRbaV0tPmdyYW50ZWRQZUNvcnIsIGhBZGpUaHItPm1heEl0ZXIybmRHdWVzcywKKyAgICAgICAgICAgICAgICAxLCAvKiBQcm9jZXNzIG9ubHkgMSBlbGVtZW50ICovCisgICAgICAgICAgICAgICAgaSAgLyogUHJvY2VzcyBleGFjdGx5IFRISVMgZWxlbWVudCAqLworICAgICAgICAgICAgKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gLyogIC1lbmQtIGlmKElEX1NDRSB8fCBJRF9DUEUgfHwgSURfTEZFKSAqLworICAgICAgfSAgIC8qIC1lbmQtIGVsZW1lbnQgbG9vcCAqLworICAgIH0gICAgIC8qIEFBQ0VOQ19CRF9NT0RFX0lOVFJBX0VMRU1FTlQgKi8KKyAgICBlbHNlIGlmIChoQWRqVGhyLT5iaXREaXN0cmlidXRpb25Nb2RlID09IEFBQ0VOQ19CRF9NT0RFX0lOVEVSX0VMRU1FTlQpIHsKKyAgICAgIC8qIFVzZSBnbG9iYWwgUGUgdG8gb2J0YWluIHRoZSB0aHJlc2hvbGRzPyAqLworICAgICAgaWYgKHFjT3V0LT50b3RhbEdyYW50ZWRQZUNvcnIgPCBxY091dC0+dG90YWxOb1JlZFBlKSB7CisgICAgICAgIC8qIGFkZCBlcXVhbCBsb2FkbmVzcyBxdWFudGl6YXRpb24gbm9pc2UgdG8gbWF0Y2ggdGhlICovCisgICAgICAgIC8qIGRlc2lyZWQgcGUgY2FsYyB0aHJlc2hvbGQgbmVjZXNzYXJ5IGZvciBkZXNpcmVkIHBlICovCisgICAgICAgIC8qIE5vdyBjYXJyaWVkIG91dCBnbG9iYWxseSB0byBjb3ZlciBhbGwoISkgY2hhbm5lbHMuICovCisgICAgICAgIEZES2FhY0VuY19hZGFwdFRocmVzaG9sZHNUb1BlKGNtLCBoQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW0sIHFjRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudCwgcWNPdXQtPnRvdGFsR3JhbnRlZFBlQ29yciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFkalRoci0+bWF4SXRlcjJuZEd1ZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bkVsZW1lbnRzLCAvKiBQcm9jZXNzIGFsbCBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgLyogUHJvY2VzcyBleGFjdGx5IFRISVMgZWxlbWVudCAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogSW4gY2FzZSBnbG9iYWwgcGUgZG9lc24ndCBuZWVkIHRvIGJlIHJlZHVjZWQgY2hlY2sgZWFjaCBlbGVtZW50IHRvCisgICAgICAgICAgIGhvbGQgZXN0aW1hdGVkIGJpdHJhdGUgYmVsb3cgbWF4aW11bSBlbGVtZW50IGJpdHJhdGUuICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbS0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICBpZiAoKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX1NDRSkgfHwKKyAgICAgICAgICAgICAgKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX0NQRSkgfHwKKyAgICAgICAgICAgICAgKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX0xGRSkpIHsKKyAgICAgICAgICAgIC8qIEVsZW1lbnQgcGUgYXBwbGllcyB0byBkeW5hbWljIGJpdHMgb2YgbWF4aW11bSBlbGVtZW50IGJpdHJhdGUuICovCisgICAgICAgICAgICBjb25zdCBpbnQgbWF4RWxlbWVudFBlID0gRkRLYWFjRW5jX2JpdHMycGUyKAorICAgICAgICAgICAgICAgIChjbS0+ZWxJbmZvW2ldLm5DaGFubmVsc0luRWwgKiBNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4pIC0KKyAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50W2ldLT5zdGF0aWNCaXRzVXNlZCAtIHFjRWxlbWVudFtpXS0+ZXh0Qml0c1VzZWQsCisgICAgICAgICAgICAgICAgaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldLT5iaXRzMlBlRmFjdG9yX20sCisgICAgICAgICAgICAgICAgaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldLT5iaXRzMlBlRmFjdG9yX2UpOwogCi0gICAgICAgICAgICAgICAgfSAgLyogIC1lbmQtIGlmKElEX1NDRSB8fCBJRF9DUEUgfHwgSURfTEZFKSAqLwotCi0gICAgICAgICAgICB9ICAvKiAtZW5kLSBlbGVtZW50IGxvb3AgKi8KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07Ci0KLSAgICAgICAgICAgIGlmICgoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkgfHwKLSAgICAgICAgICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLyogZm9yIFZCUi1tb2RlICovCi0gICAgICAgICAgICAgICAgICBGREthYWNFbmNfQWRhcHRUaHJlc2hvbGRzVkJSKHFjRWxlbWVudFtpXS0+cWNPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnRbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRFbGVtZW50W2ldLT50b29sc0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY0VsZW1lbnRbaV0tPnBlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsKTsKLSAgICAgICAgICAgIH0gIC8qICAtZW5kLSBpZihJRF9TQ0UgfHwgSURfQ1BFIHx8IElEX0xGRSkgKi8KLQotICAgICAgICB9ICAvKiAtZW5kLSBlbGVtZW50IGxvb3AgKi8KLQotICAgIH0KLSAgICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspIHsKLSAgICAgICAgaW50IGNoLHNmYixzZmJHcnA7Ci0gICAgICAgIC8qIG5vIHdlaWdodGluZyBvZiB0aHJlaG9sZHMgYW5kIGVuZXJnaWVzIGZvciBtbG91dCAqLwotICAgICAgICAvKiB3ZWlnaHQgZW5lcmdpZXMgYW5kIHRocmVzaG9sZHMgKi8KLSAgICAgICAgZm9yIChjaD0wOyBjaDxjbS0+ZWxJbmZvW2ldLm5DaGFubmVsc0luRWw7IGNoKyspIHsKLSAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBwUWNPdXRDaCA9IHFjRWxlbWVudFtpXS0+cWNPdXRDaGFubmVsW2NoXTsKLSAgICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OyBzZmJHcnArPXBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCkgewotICAgICAgICAgICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBRY091dENoLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiK3NmYkdycF0gKz0gcFFjT3V0Q2gtPnNmYkVuRmFjTGRbc2ZiK3NmYkdycF07Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1heEVsZW1lbnRQZSA8IHFjRWxlbWVudFtpXS0+cGVEYXRhLnBlKSB7CisgICAgICAgICAgICAgIEZES2FhY0VuY19hZGFwdFRocmVzaG9sZHNUb1BlKAorICAgICAgICAgICAgICAgICAgY20sIGhBZGpUaHItPmFkalRoclN0YXRlRWxlbSwgcWNFbGVtZW50LCBwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgbWF4RWxlbWVudFBlLCBoQWRqVGhyLT5tYXhJdGVyMm5kR3Vlc3MsIDEsIGkpOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQorICAgICAgICAgIH0gLyogIC1lbmQtIGlmKElEX1NDRSB8fCBJRF9DUEUgfHwgSURfTEZFKSAqLworICAgICAgICB9ICAgLyogLWVuZC0gZWxlbWVudCBsb29wICovCisgICAgICB9ICAgICAvKiAocWNPdXQtPnRvdGFsR3JhbnRlZFBlQ29yciA8IHFjT3V0LT50b3RhbE5vUmVkUGUpICovCisgICAgfSAgICAgICAvKiBBQUNFTkNfQkRfTU9ERV9JTlRFUl9FTEVNRU5UICovCisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGNtLT5uRWxlbWVudHM7IGkrKykgeworICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07CiAKLXZvaWQgRkRLYWFjRW5jX0FkalRockNsb3NlKEFESl9USFJfU1RBVEUqKiBwaEFkalRocikKLXsKLSAgICBJTlQgaTsKLSAgICBBREpfVEhSX1NUQVRFKiBoQWRqVGhyID0gKnBoQWRqVGhyOworICAgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAorICAgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpIHsKKyAgICAgICAgLyogZm9yIFZCUi1tb2RlICovCisgICAgICAgIEZES2FhY0VuY19BZGFwdFRocmVzaG9sZHNWQlIoCisgICAgICAgICAgICBxY0VsZW1lbnRbaV0tPnFjT3V0Q2hhbm5lbCwgcHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbCwKKyAgICAgICAgICAgIGhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXSwgJnBzeU91dEVsZW1lbnRbaV0tPnRvb2xzSW5mbywKKyAgICAgICAgICAgIGNtLT5lbEluZm9baV0ubkNoYW5uZWxzSW5FbCk7CisgICAgICB9IC8qICAtZW5kLSBpZihJRF9TQ0UgfHwgSURfQ1BFIHx8IElEX0xGRSkgKi8KIAotICAgIGlmIChoQWRqVGhyIT1OVUxMKSB7Ci0gICAgICBmb3IgKGk9MDsgaTwoOCk7IGkrKykgewotICAgICAgICBpZiAoaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldIT1OVUxMKSB7Ci0gICAgICAgICAgRnJlZVJhbV9hYWNFbmNfQWRqVGhyU3RhdGVFbGVtZW50KCZoQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV0pOworICAgIH0gLyogLWVuZC0gZWxlbWVudCBsb29wICovCisgIH0KKyAgZm9yIChpID0gMDsgaSA8IGNtLT5uRWxlbWVudHM7IGkrKykgeworICAgIGludCBjaCwgc2ZiLCBzZmJHcnA7CisgICAgLyogbm8gd2VpZ2h0aW5nIG9mIHRocmVob2xkcyBhbmQgZW5lcmdpZXMgZm9yIG1sb3V0ICovCisgICAgLyogd2VpZ2h0IGVuZXJnaWVzIGFuZCB0aHJlc2hvbGRzICovCisgICAgZm9yIChjaCA9IDA7IGNoIDwgY20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CisgICAgICBRQ19PVVRfQ0hBTk5FTCAqcFFjT3V0Q2ggPSBxY0VsZW1lbnRbaV0tPnFjT3V0Q2hhbm5lbFtjaF07CisgICAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQ7CisgICAgICAgICAgIHNmYkdycCArPSBwc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXApIHsKKyAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7CisgICAgICAgICAgICAgc2ZiKyspIHsKKyAgICAgICAgICBwUWNPdXRDaC0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYiArIHNmYkdycF0gKz0KKyAgICAgICAgICAgICAgcFFjT3V0Q2gtPnNmYkVuRmFjTGRbc2ZiICsgc2ZiR3JwXTsKICAgICAgICAgfQogICAgICAgfQotICAgICAgRnJlZVJhbV9hYWNFbmNfQWRqdXN0VGhyZXNob2xkKHBoQWRqVGhyKTsKICAgICB9CisgIH0KIH0KIAordm9pZCBGREthYWNFbmNfQWRqVGhyQ2xvc2UoQURKX1RIUl9TVEFURSAqKnBoQWRqVGhyKSB7CisgIElOVCBpOworICBBREpfVEhSX1NUQVRFICpoQWRqVGhyID0gKnBoQWRqVGhyOworCisgIGlmIChoQWRqVGhyICE9IE5VTEwpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKCg4KSk7IGkrKykgeworICAgICAgaWYgKGhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXSAhPSBOVUxMKSB7CisgICAgICAgIEZyZWVSYW1fYWFjRW5jX0FkalRoclN0YXRlRWxlbWVudCgmaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgRnJlZVJhbV9hYWNFbmNfQWRqdXN0VGhyZXNob2xkKHBoQWRqVGhyKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9hZGpfdGhyLmggYi9saWJBQUNlbmMvc3JjL2Fkal90aHIuaAppbmRleCBiZTY4YzZlLi4xZjVmOTk4IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2Fkal90aHIuaAorKysgYi9saWJBQUNlbmMvc3JjL2Fkal90aHIuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3MSArOTAsNzcgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogVGhyZXNob2xkIGNvbXBlbnNhdGlvbgorICAgQXV0aG9yKHMpOiAgIE0uIFdlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogVGhyZXNob2xkIGNvbXBlbnNhdGlvbgogCi0jaWZuZGVmIF9fQURKX1RIUl9ICi0jZGVmaW5lIF9fQURKX1RIUl9ICisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZuZGVmIEFESl9USFJfSAorI2RlZmluZSBBREpfVEhSX0gKIAorI2luY2x1ZGUgImNvbW1vbl9maXguaCIKICNpbmNsdWRlICJhZGpfdGhyX2RhdGEuaCIKICNpbmNsdWRlICJxY19kYXRhLmgiCiAjaW5jbHVkZSAibGluZV9wZS5oIgogI2luY2x1ZGUgImludGVyZmFjZS5oIgogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19wZUNhbGN1bGF0aW9uCisgICAgZGVzY3JpcHRpb246CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRkRLYWFjRW5jX3BlQ2FsY3VsYXRpb24oUEVfREFUQSAqY29uc3QgcGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU1lfT1VUX0NIQU5ORUwgKmNvbnN0IHBzeU91dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgKmNvbnN0IHFjT3V0Q2hhbm5lbFsoMildLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgVE9PTFNJTkZPICpjb25zdCB0b29sc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU19FTEVNRU5UICpjb25zdCBhZGpUaHJTdGF0ZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMpOwogCi12b2lkIEZES2FhY0VuY19wZUNhbGN1bGF0aW9uKAotICAgICAgICBQRV9EQVRBICpwZURhdGEsCi0gICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildLAotICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaGFubmVsWygyKV0sCi0gICAgICAgIHN0cnVjdCBUT09MU0lORk8gKnRvb2xzSW5mbywKLSAgICAgICAgQVRTX0VMRU1FTlQqIGFkalRoclN0YXRlRWxlbWVudCwKLSAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscwotICAgICAgICApOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19BZGpUaHJOZXcKK2Rlc2NyaXB0aW9uOiAgYWxsb2NhdGUgQURKX1RIUl9TVEFURQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQgRkRLYWFjRW5jX0FkalRock5ldyhBREpfVEhSX1NUQVRFICoqcGhBZGpUaHIsIElOVCBuRWxlbWVudHMpOwogCi1JTlQgIEZES2FhY0VuY19BZGpUaHJOZXcoQURKX1RIUl9TVEFURSoqIHBoQWRqVGhyLAotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICBuRWxlbWVudHMpOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19BZGpUaHJJbml0CitkZXNjcmlwdGlvbjogIGluaXRpYWxpemUgQURKX1RIUl9TVEFURQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEZES2FhY0VuY19BZGpUaHJJbml0KAorICAgIEFESl9USFJfU1RBVEUgKmNvbnN0IGhBZGpUaHIsIGNvbnN0IElOVCBtZWFuUGUsIGNvbnN0IElOVCBpbnZRdWFudCwKKyAgICBjb25zdCBDSEFOTkVMX01BUFBJTkcgKmNvbnN0IGNoYW5uZWxNYXBwaW5nLCBjb25zdCBJTlQgc2FtcGxlUmF0ZSwKKyAgICBjb25zdCBJTlQgdG90YWxCaXRyYXRlLCBjb25zdCBJTlQgaXNMb3dEZWxheSwKKyAgICBjb25zdCBBQUNFTkNfQklUUkVTX01PREUgYml0UmVzTW9kZSwgY29uc3QgSU5UIGRab25lUXVhbnRFbmFibGUsCisgICAgY29uc3QgSU5UIGJpdERpc3RyaWJ1dGlvbk1vZGUsIGNvbnN0IEZJWFBfREJMIHZiclF1YWxGYWN0b3IpOwogCi12b2lkIEZES2FhY0VuY19BZGpUaHJJbml0KEFESl9USFJfU1RBVEUgKmhBZGpUaHIsCi0gICAgICAgICAgICAgICAgY29uc3QgSU5UIHBlTWVhbiwKLSAgICAgICAgICAgICAgICBFTEVNRU5UX0JJVFMqIGVsQml0c1soOCldLAotICAgICAgICAgICAgICAgIElOVCBpbnZRdWFudCwKLSAgICAgICAgICAgICAgICBJTlQgbkVsZW1lbnRzLAotICAgICAgICAgICAgICAgIElOVCBuQ2hhbm5lbHNFZmYsCi0gICAgICAgICAgICAgICAgSU5UIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgSU5UIGFkdmFuY2VkQml0c1RvUGUsCi0gICAgICAgICAgICAgICAgRklYUF9EQkwgdmJyUXVhbEZhY3RvciwKLSAgICAgICAgICAgICAgICBjb25zdCBJTlQgZFpvbmVRdWFudEVuYWJsZSk7Ci0gCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2Z1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0Rpc3RyaWJ1dGVCaXRzCitkZXNjcmlwdGlvbjoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBGREthYWNFbmNfRGlzdHJpYnV0ZUJpdHMoCisgICAgQURKX1RIUl9TVEFURSAqYWRqVGhyU3RhdGUsIEFUU19FTEVNRU5UICpBZGpUaHJTdGF0ZUVsZW1lbnQsCisgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFubmVsWygyKV0sIFBFX0RBVEEgKnBlRGF0YSwgSU5UICpncmFudGVkUGUsCisgICAgSU5UICpncmFudGVkUGVDb3JyLCBjb25zdCBJTlQgbkNoYW5uZWxzLCBjb25zdCBJTlQgY29tbW9uV2luZG93LAorICAgIGNvbnN0IElOVCBhdmdCaXRzLCBjb25zdCBJTlQgYml0cmVzQml0cywgY29uc3QgSU5UIG1heEJpdHJlc0JpdHMsCisgICAgY29uc3QgRklYUF9EQkwgbWF4Qml0RmFjLCBjb25zdCBBQUNFTkNfQklUUkVTX01PREUgYml0UmVzTW9kZSk7CiAKLXZvaWQgRkRLYWFjRW5jX0Rpc3RyaWJ1dGVCaXRzKEFESl9USFJfU1RBVEUgKmFkalRoclN0YXRlLAotICAgIEFUU19FTEVNRU5UICAgICAgICpBZGpUaHJTdGF0ZUVsZW1lbnQsCi0gICAgUFNZX09VVF9DSEFOTkVMICAgKnBzeU91dENoYW5uZWxbKDIpXSwKLSAgICBQRV9EQVRBICAgICAgICAgICAqcGVEYXRhLAotICAgIElOVCAgICAgICAgICAgICAgICpncmFudGVkUGUsCi0gICAgSU5UICAgICAgICAgICAgICAgKmdyYW50ZWRQZUNvcnIsCi0gICAgY29uc3QgSU5UICAgICAgICAgbkNoYW5uZWxzLAotICAgIGNvbnN0IElOVCAgICAgICAgIGNvbW1vbldpbmRvdywKLSAgICBjb25zdCBJTlQgICAgICAgICBhdmdCaXRzLAotICAgIGNvbnN0IElOVCAgICAgICAgIGJpdHJlc0JpdHMsCi0gICAgY29uc3QgSU5UICAgICAgICAgbWF4Qml0cmVzQml0cywKLSAgICBjb25zdCBGSVhQX0RCTCAgICBtYXhCaXRGYWMsCi0gICAgY29uc3QgSU5UICAgICAgICAgYml0RGlzdHJpYnV0aW9uTW9kZSk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2Z1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0FkanVzdFRocmVzaG9sZHMKK2Rlc2NyaXB0aW9uOiAgYWRqdXN0IHRocmVzaG9sZHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBGREthYWNFbmNfQWRqdXN0VGhyZXNob2xkcygKKyAgICBBREpfVEhSX1NUQVRFICpjb25zdCBoQWRqVGhyLCBRQ19PVVRfRUxFTUVOVCAqY29uc3QgcWNFbGVtZW50WygoOCkpXSwKKyAgICBRQ19PVVQgKmNvbnN0IHFjT3V0LCBjb25zdCBQU1lfT1VUX0VMRU1FTlQgKmNvbnN0IHBzeU91dEVsZW1lbnRbKCg4KSldLAorICAgIGNvbnN0IElOVCBDQlJiaXRyYXRlTW9kZSwgY29uc3QgQ0hBTk5FTF9NQVBQSU5HICpjb25zdCBjbSk7CiAKLXZvaWQgRkRLYWFjRW5jX0FkanVzdFRocmVzaG9sZHMoQVRTX0VMRU1FTlQqIEFkalRoclN0YXRlRWxlbWVudFsoOCldLAotICAgIFFDX09VVF9FTEVNRU5UKiAgIHFjRWxlbWVudFsoOCldLAotICAgIFFDX09VVCogICAgICAgICAgIHFjT3V0LAotICAgIFBTWV9PVVRfRUxFTUVOVCogIHBzeU91dEVsZW1lbnRbKDgpXSwKLSAgICBJTlQgICAgICAgICAgICAgICBDQlJiaXRyYXRlTW9kZSwKLSAgICBJTlQgICAgICAgICAgICAgICBtYXhJdGVyMm5kR3Vlc3MsCi0gICAgQ0hBTk5FTF9NQVBQSU5HKiAgY20pOwotCi12b2lkIEZES2FhY0VuY19BZGpUaHJDbG9zZShBREpfVEhSX1NUQVRFKiogaEFkalRocik7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2Z1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0FkalRockNsb3NlCitkZXNjcmlwdGlvbjoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBGREthYWNFbmNfQWRqVGhyQ2xvc2UoQURKX1RIUl9TVEFURSAqKmhBZGpUaHIpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvYWRqX3Rocl9kYXRhLmggYi9saWJBQUNlbmMvc3JjL2Fkal90aHJfZGF0YS5oCmluZGV4IDdjM2ExOTEuLjRjZDEyOTkgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvYWRqX3Rocl9kYXRhLmgKKysrIGIvbGliQUFDZW5jL3NyYy9hZGpfdGhyX2RhdGEuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzMSArOTAsNDIgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiAgRmFzdCBNUEVHIEFBQyBBdWRpbyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gU2NodWcgLyBBLiBHcm9lc2NoZWwKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiB0aHJlc2hvbGQgY2FsY3VsYXRpb25zCisgICBBdXRob3Iocyk6ICAgTS4gU2NodWcgLyBBLiBHcm9lc2NoZWwKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IHRocmVzaG9sZCBjYWxjdWxhdGlvbnMKIAotI2lmbmRlZiBfX0FESl9USFJfREFUQV9ICi0jZGVmaW5lIF9fQURKX1RIUl9EQVRBX0gKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZm5kZWYgQURKX1RIUl9EQVRBX0gKKyNkZWZpbmUgQURKX1RIUl9EQVRBX0gKIAogI2luY2x1ZGUgInBzeV9jb25zdC5oIgogCit0eXBlZGVmIGVudW0geworICBBQUNFTkNfQkRfTU9ERV9JTlRFUl9FTEVNRU5UID0gMCwKKyAgQUFDRU5DX0JEX01PREVfSU5UUkFfRUxFTUVOVCA9IDEKK30gQUFDRU5DX0JJVF9ESVNUUklCVVRJT05fTU9ERTsKKwordHlwZWRlZiBlbnVtIHsKKyAgQUFDRU5DX0JSX01PREVfRlVMTCA9IDAsCisgIEFBQ0VOQ19CUl9NT0RFX1JFRFVDRUQgPSAxLAorICBBQUNFTkNfQlJfTU9ERV9ESVNBQkxFRCA9IDIKK30gQUFDRU5DX0JJVFJFU19NT0RFOworCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICBGSVhQX0RCTCBjbGlwU2F2ZUxvdywgY2xpcFNhdmVIaWdoOwotICAgRklYUF9EQkwgbWluQml0U2F2ZSwgbWF4Qml0U2F2ZTsKLSAgIEZJWFBfREJMIGNsaXBTcGVuZExvdywgY2xpcFNwZW5kSGlnaDsKLSAgIEZJWFBfREJMIG1pbkJpdFNwZW5kLCBtYXhCaXRTcGVuZDsKKyAgRklYUF9EQkwgY2xpcFNhdmVMb3csIGNsaXBTYXZlSGlnaDsKKyAgRklYUF9EQkwgbWluQml0U2F2ZSwgbWF4Qml0U2F2ZTsKKyAgRklYUF9EQkwgY2xpcFNwZW5kTG93LCBjbGlwU3BlbmRIaWdoOworICBGSVhQX0RCTCBtaW5CaXRTcGVuZCwgbWF4Qml0U3BlbmQ7CiB9IEJSRVNfUEFSQU07CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgIElOVCBtb2RpZnlNaW5TbnI7Ci0gICBJTlQgc3RhcnRTZmJMLCBzdGFydFNmYlM7CisgIElOVCBtb2RpZnlNaW5TbnI7CisgIElOVCBzdGFydFNmYkwsIHN0YXJ0U2ZiUzsKIH0gQUhfUEFSQU07CiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTExOCwxOSArMTQwLDIwIEBACiAgIC8qIHBhcmFtZXRlcnMgZm9yIGJpdHJlc2Vydm9pciBjb250cm9sICovCiAgIElOVCBwZU1pbiwgcGVNYXg7CiAgIC8qIGNvbnN0YW50IG9mZnNldCB0byBwZSAgICAgICAgICAgICAgICovCi0gIElOVCAgICBwZU9mZnNldDsKKyAgSU5UIHBlT2Zmc2V0OwogICAvKiBjb25zdGFudCBQZUZhY3RvciAqLwogICBGSVhQX0RCTCBiaXRzMlBlRmFjdG9yX207Ci0gIElOVCAgICAgIGJpdHMyUGVGYWN0b3JfZTsKKyAgSU5UIGJpdHMyUGVGYWN0b3JfZTsKICAgLyogYXZvaWQgaG9sZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgKi8KICAgQUhfUEFSQU0gYWhQYXJhbTsKLSAgLyogdmFsdWVzIGZvciBjb3JyZWN0aW9uIG9mIHBlICovCi0gIC8qIHBhcmFtdGVycyBmb3IgYWRhcHRhdGlvbiBvZiBtaW5TbnIgKi8KKyAgLyogcGFyYW1ldGVycyBmb3IgYWRhcHRhdGlvbiBvZiBtaW5TbnIgKi8KICAgTUlOU05SX0FEQVBUX1BBUkFNIG1pblNuckFkYXB0UGFyYW07CisKKyAgLyogdmFsdWVzIGZvciBjb3JyZWN0aW9uIG9mIHBlICovCiAgIElOVCBwZUxhc3Q7CiAgIElOVCBkeW5CaXRzTGFzdDsKICAgRklYUF9EQkwgcGVDb3JyZWN0aW9uRmFjdG9yX207Ci0gIElOVCAgICAgIHBlQ29ycmVjdGlvbkZhY3Rvcl9lOworICBJTlQgcGVDb3JyZWN0aW9uRmFjdG9yX2U7CiAKICAgLyogdmJyIGVuY29kaW5nICovCiAgIEZJWFBfREJMIHZiclF1YWxGYWN0b3I7CkBAIC0xMzgsMTMgKzE2MSwxNCBAQAogCiAgIC8qIHRocmVzaG9sZCB3ZWlnaHRpbmcgKi8KICAgRklYUF9EQkwgY2hhb3NNZWFzdXJlRW5GYWNbKDIpXTsKLSAgSU5UICAgICAgbGFzdEVuRmFjUGF0Y2hbKDIpXTsKKyAgSU5UIGxhc3RFbkZhY1BhdGNoWygyKV07CiAKIH0gQVRTX0VMRU1FTlQ7CiAKIHR5cGVkZWYgc3RydWN0IHsKICAgQlJFU19QQVJBTSBicmVzUGFyYW1Mb25nLCBicmVzUGFyYW1TaG9ydDsKLSAgQVRTX0VMRU1FTlQqIGFkalRoclN0YXRlRWxlbVsoOCldOworICBBVFNfRUxFTUVOVCogYWRqVGhyU3RhdGVFbGVtWygoOCkpXTsKKyAgQUFDRU5DX0JJVF9ESVNUUklCVVRJT05fTU9ERSBiaXREaXN0cmlidXRpb25Nb2RlOwogICBJTlQgbWF4SXRlcjJuZEd1ZXNzOwogfSBBREpfVEhSX1NUQVRFOwogCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2JhbmRfbnJnLmNwcCBiL2xpYkFBQ2VuYy9zcmMvYmFuZF9ucmcuY3BwCmluZGV4IDg2MWY3YTguLmZiMjJkYmIgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvYmFuZF9ucmcuY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvYmFuZF9ucmcuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQxICs5MCw0NCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFdlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IEJhbmQvTGluZSBlbmVyZ3kgY2FsY3VsYXRpb25zCisgICBBdXRob3Iocyk6ICAgTS4gV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBCYW5kL0xpbmUgZW5lcmd5IGNhbGN1bGF0aW9ucworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiYmFuZF9ucmcuaCIKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfQ2FsY1NmYk1heFNjYWxlU3BlYwogICBkZXNjcmlwdGlvbjoKICAgaW5wdXQ6CiAgIG91dHB1dDoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotRkRLYWFjRW5jX0NhbGNTZmJNYXhTY2FsZVNwZWMoY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICpSRVNUUklDVCBiYW5kT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBudW1CYW5kcykKLXsKLSAgSU5UIGksajsKK3ZvaWQgRkRLYWFjRW5jX0NhbGNTZmJNYXhTY2FsZVNwZWMoY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpSRVNUUklDVCBiYW5kT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG51bUJhbmRzKSB7CisgIElOVCBpLCBqOwogICBGSVhQX0RCTCBtYXhTcGMsIHRtcDsKIAotICBmb3IoaT0wOyBpPG51bUJhbmRzOyBpKyspIHsKKyAgZm9yIChpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKICAgICBtYXhTcGMgPSAoRklYUF9EQkwpMDsKLSAgICBmb3IgKGo9YmFuZE9mZnNldFtpXTsgajxiYW5kT2Zmc2V0W2krMV07IGorKykgeworCisgICAgRFdPUkRfQUxJR05FRChtZGN0U3BlY3RydW0pOworCisgICAgZm9yIChqID0gYmFuZE9mZnNldFtpXTsgaiA8IGJhbmRPZmZzZXRbaSArIDFdOyBqKyspIHsKICAgICAgIHRtcCA9IGZpeHBfYWJzKG1kY3RTcGVjdHJ1bVtqXSk7CiAgICAgICBtYXhTcGMgPSBmaXhNYXgobWF4U3BjLCB0bXApOwogICAgIH0KLSAgICBzZmJNYXhTY2FsZVNwZWNbaV0gPSAobWF4U3BjPT0oRklYUF9EQkwpMCkgPyAoREZSQUNUX0JJVFMtMikgOiBDbnRMZWFkaW5nWmVyb3MobWF4U3BjKS0xOwotICAgIC8qIENvdW50TGVhZGluZ0JpdHMoKSBpcyBub3QgbmVjZXNzYXJ5IGhlcmUgc2luY2UgdGVzdCB2YWx1ZSBpcyBhbHdheXMgPiAwICovCisgICAgaiA9IENudExlYWRpbmdaZXJvcyhtYXhTcGMpIC0gMTsKKyAgICBzZmJNYXhTY2FsZVNwZWNbaV0gPSBmaXhNaW4oKERGUkFDVF9CSVRTIC0gMiksIGopOworICAgIC8qIENvdW50TGVhZGluZ0JpdHMoKSBpcyBub3QgbmVjZXNzYXJ5IGhlcmUgc2luY2UgdGVzdCB2YWx1ZSBpcyBhbHdheXMgPiAwCisgICAgICovCiAgIH0KIH0KIApAQCAtMTI0LDQzICsxMzgsNDUgQEAKICAgb3V0cHV0OgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBGSVhQX0RCTAotRkRLYWFjRW5jX0NoZWNrQmFuZEVuZXJneU9wdGltKGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBtZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqUkVTVFJJQ1QgYmFuZE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbnVtQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgKlJFU1RSSUNUIGJhbmRFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgKlJFU1RSSUNUIGJhbmRFbmVyZ3lMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgIG1pblNwZWNTaGlmdCkKLXsKK0ZES2FhY0VuY19DaGVja0JhbmRFbmVyZ3lPcHRpbShjb25zdCBGSVhQX0RCTCAqY29uc3QgUkVTVFJJQ1QgbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqY29uc3QgUkVTVFJJQ1Qgc2ZiTWF4U2NhbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqY29uc3QgUkVTVFJJQ1QgYmFuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbnVtQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIGJhbmRFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIGJhbmRFbmVyZ3lMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG1pblNwZWNTaGlmdCkgewogICBJTlQgaSwgaiwgc2NhbGUsIG5yID0gMDsKICAgRklYUF9EQkwgbWF4TnJnTGQgPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7CiAgIEZJWFBfREJMIG1heE5yZyA9IDA7CiAgIEZJWFBfREJMIHNwZWM7CiAKLSAgZm9yKGk9MDsgaTxudW1CYW5kczsgaSsrKSB7Ci0gICAgc2NhbGUgPSBmaXhNYXgoMCwgc2ZiTWF4U2NhbGVTcGVjW2ldLTQpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgeworICAgIHNjYWxlID0gZml4TWF4KDAsIHNmYk1heFNjYWxlU3BlY1tpXSAtIDQpOwogICAgIEZJWFBfREJMIHRtcCA9IDA7Ci0gICAgZm9yIChqPWJhbmRPZmZzZXRbaV07IGo8YmFuZE9mZnNldFtpKzFdOyBqKyspewotICAgICAgIHNwZWMgPSBtZGN0U3BlY3RydW1bal08PHNjYWxlOwotICAgICAgIHRtcCA9IGZQb3cyQWRkRGl2Mih0bXAsIHNwZWMpOworCisgICAgRFdPUkRfQUxJR05FRChtZGN0U3BlY3RydW0pOworCisgICAgZm9yIChqID0gYmFuZE9mZnNldFtpXTsgaiA8IGJhbmRPZmZzZXRbaSArIDFdOyBqKyspIHsKKyAgICAgIHNwZWMgPSBtZGN0U3BlY3RydW1bal0gPDwgc2NhbGU7CisgICAgICB0bXAgPSBmUG93MkFkZERpdjIodG1wLCBzcGVjKTsKICAgICB9Ci0gICAgYmFuZEVuZXJneVtpXSA9IHRtcDw8MTsKKyAgICBiYW5kRW5lcmd5W2ldID0gdG1wIDw8IDE7CiAKICAgICAvKiBjYWxjdWxhdGUgbGQgb2YgYmFuZE5yZywgc3VidHJhY3Qgc2NhbGluZyAqLwogICAgIGJhbmRFbmVyZ3lMZERhdGFbaV0gPSBDYWxjTGREYXRhKGJhbmRFbmVyZ3lbaV0pOwogICAgIGlmIChiYW5kRW5lcmd5TGREYXRhW2ldICE9IEZMMkZYQ09OU1RfREJMKC0xLjBmKSkgewotICAgICAgYmFuZEVuZXJneUxkRGF0YVtpXSAtPSBzY2FsZSpGTDJGWENPTlNUX0RCTCgyLjAvNjQpOworICAgICAgYmFuZEVuZXJneUxkRGF0YVtpXSAtPSBzY2FsZSAqIEZMMkZYQ09OU1RfREJMKDIuMCAvIDY0KTsKICAgICB9CiAgICAgLyogZmluZCBpbmRleCBvZiBtYXhOcmcgKi8KICAgICBpZiAoYmFuZEVuZXJneUxkRGF0YVtpXSA+IG1heE5yZ0xkKSB7Ci0gICAgICAgIG1heE5yZ0xkID0gYmFuZEVuZXJneUxkRGF0YVtpXTsKLSAgICAgICAgbnIgPSBpOworICAgICAgbWF4TnJnTGQgPSBiYW5kRW5lcmd5TGREYXRhW2ldOworICAgICAgbnIgPSBpOwogICAgIH0KICAgfQogCiAgIC8qIHJldHVybiB1bnNjYWxlZCBtYXhOcmcqLwotICBzY2FsZSA9IGZpeE1heCgwLHNmYk1heFNjYWxlU3BlY1tucl0tNCk7Ci0gIHNjYWxlID0gZml4TWF4KDIqKG1pblNwZWNTaGlmdC1zY2FsZSksLShERlJBQ1RfQklUUy0xKSk7CisgIHNjYWxlID0gZml4TWF4KDAsIHNmYk1heFNjYWxlU3BlY1tucl0gLSA0KTsKKyAgc2NhbGUgPSBmaXhNYXgoMiAqIChtaW5TcGVjU2hpZnQgLSBzY2FsZSksIC0oREZSQUNUX0JJVFMgLSAxKSk7CiAKICAgbWF4TnJnID0gc2NhbGVWYWx1ZShiYW5kRW5lcmd5W25yXSwgc2NhbGUpOwogCkBAIC0xNzMsMTg3ICsxODksMTczIEBACiAgIGlucHV0OgogICBvdXRwdXQ6CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUlOVAotRkRLYWFjRW5jX0NhbGNCYW5kRW5lcmd5T3B0aW1Mb25nKGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBtZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqUkVTVFJJQ1QgYmFuZE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbnVtQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgKlJFU1RSSUNUIGJhbmRFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgKlJFU1RSSUNUIGJhbmRFbmVyZ3lMZERhdGEpCi17CitJTlQgRkRLYWFjRW5jX0NhbGNCYW5kRW5lcmd5T3B0aW1Mb25nKGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBtZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqUkVTVFJJQ1Qgc2ZiTWF4U2NhbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKlJFU1RSSUNUIGJhbmRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBudW1CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIGJhbmRFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBiYW5kRW5lcmd5TGREYXRhKSB7CiAgIElOVCBpLCBqLCBzaGlmdEJpdHMgPSAwOwogICBGSVhQX0RCTCBtYXhOcmdMZCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogCiAgIEZJWFBfREJMIHNwZWM7CiAKLSAgZm9yKGk9MDsgaTxudW1CYW5kczsgaSsrKSB7Ci0gICAgIElOVCBsZWFkaW5nQml0cyA9IHNmYk1heFNjYWxlU3BlY1tpXS00OyAgICAgICAgICAgIC8qIG1heCBzZmJXaWR0aCA9IDk2IDsgMl43PTEyOCA9PiA3LzIgPSA0IChzcGMqc3BjKSAqLwotICAgICBGSVhQX0RCTCB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLjApOwotICAgICAvKiBkb24ndCB1c2Ugc2NhbGVWYWx1ZSgpIGhlcmUsIGl0IGluY3JlYXNlcyB3b3JrbG9hZCBxdWl0ZSBzdWZmaWNpZW50bHkuLi4gKi8KLSAgICAgaWYgKGxlYWRpbmdCaXRzPj0wKSB7Ci0gICAgICAgIGZvciAoaj1iYW5kT2Zmc2V0W2ldO2o8YmFuZE9mZnNldFtpKzFdO2orKykgewotICAgICAgICAgICBzcGVjID0gbWRjdFNwZWN0cnVtW2pdPDxsZWFkaW5nQml0czsKLSAgICAgICAgICAgdG1wID0gZlBvdzJBZGREaXYyKHRtcCwgc3BlYyk7Ci0gICAgICAgIH0KLSAgICAgfSBlbHNlIHsKLSAgICAgICAgSU5UIHNoaWZ0ID0gLWxlYWRpbmdCaXRzOwotICAgICAgICBmb3IgKGo9YmFuZE9mZnNldFtpXTtqPGJhbmRPZmZzZXRbaSsxXTtqKyspewotICAgICAgICAgICBzcGVjID0gbWRjdFNwZWN0cnVtW2pdPj5zaGlmdDsKLSAgICAgICAgICAgdG1wID0gZlBvdzJBZGREaXYyKHRtcCwgc3BlYyk7Ci0gICAgICAgIH0KLSAgICAgfQotICAgICBiYW5kRW5lcmd5W2ldID0gdG1wPDwxOworICBmb3IgKGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgeworICAgIElOVCBsZWFkaW5nQml0cyA9IHNmYk1heFNjYWxlU3BlY1tpXSAtCisgICAgICAgICAgICAgICAgICAgICAgNDsgLyogbWF4IHNmYldpZHRoID0gOTYgOyAyXjc9MTI4ID0+IDcvMiA9IDQgKHNwYypzcGMpICovCisgICAgRklYUF9EQkwgdG1wID0gRkwyRlhDT05TVF9EQkwoMC4wKTsKKyAgICAvKiBkb24ndCB1c2Ugc2NhbGVWYWx1ZSgpIGhlcmUsIGl0IGluY3JlYXNlcyB3b3JrbG9hZCBxdWl0ZSBzdWZmaWNpZW50bHkuLi4KKyAgICAgKi8KKyAgICBpZiAobGVhZGluZ0JpdHMgPj0gMCkgeworICAgICAgZm9yIChqID0gYmFuZE9mZnNldFtpXTsgaiA8IGJhbmRPZmZzZXRbaSArIDFdOyBqKyspIHsKKyAgICAgICAgc3BlYyA9IG1kY3RTcGVjdHJ1bVtqXSA8PCBsZWFkaW5nQml0czsKKyAgICAgICAgdG1wID0gZlBvdzJBZGREaXYyKHRtcCwgc3BlYyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIElOVCBzaGlmdCA9IC1sZWFkaW5nQml0czsKKyAgICAgIGZvciAoaiA9IGJhbmRPZmZzZXRbaV07IGogPCBiYW5kT2Zmc2V0W2kgKyAxXTsgaisrKSB7CisgICAgICAgIHNwZWMgPSBtZGN0U3BlY3RydW1bal0gPj4gc2hpZnQ7CisgICAgICAgIHRtcCA9IGZQb3cyQWRkRGl2Mih0bXAsIHNwZWMpOworICAgICAgfQorICAgIH0KKyAgICBiYW5kRW5lcmd5W2ldID0gdG1wIDw8IDE7CiAgIH0KIAogICAvKiBjYWxjdWxhdGUgbGQgb2YgYmFuZE5yZywgc3VidHJhY3Qgc2NhbGluZyAqLwogICBMZERhdGFWZWN0b3IoYmFuZEVuZXJneSwgYmFuZEVuZXJneUxkRGF0YSwgbnVtQmFuZHMpOwotICBmb3IoaT1udW1CYW5kczsgaS0tIT0wOyApIHsKLSAgICAgIEZJWFBfREJMIHNjYWxlRGlmZiA9IChzZmJNYXhTY2FsZVNwZWNbaV0tNCkqRkwyRlhDT05TVF9EQkwoMi4wLzY0KTsKKyAgZm9yIChpID0gbnVtQmFuZHM7IGktLSAhPSAwOykgeworICAgIEZJWFBfREJMIHNjYWxlRGlmZiA9IChzZmJNYXhTY2FsZVNwZWNbaV0gLSA0KSAqIEZMMkZYQ09OU1RfREJMKDIuMCAvIDY0KTsKIAotICAgICAgYmFuZEVuZXJneUxkRGF0YVtpXSA9IChiYW5kRW5lcmd5TGREYXRhW2ldID49ICgoRkwyRlhDT05TVF9EQkwoLTEuZik+PjEpICsgKHNjYWxlRGlmZj4+MSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJhbmRFbmVyZ3lMZERhdGFbaV0tc2NhbGVEaWZmIDogRkwyRlhDT05TVF9EQkwoLTEuZik7Ci0gICAgICAvKiBmaW5kIG1heE5yZ0xkICovCi0gICAgICBtYXhOcmdMZCA9IGZpeE1heChtYXhOcmdMZCwgYmFuZEVuZXJneUxkRGF0YVtpXSk7CisgICAgYmFuZEVuZXJneUxkRGF0YVtpXSA9IChiYW5kRW5lcmd5TGREYXRhW2ldID49CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMMkZYQ09OU1RfREJMKC0xLmYpID4+IDEpICsgKHNjYWxlRGlmZiA+PiAxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJhbmRFbmVyZ3lMZERhdGFbaV0gLSBzY2FsZURpZmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRkwyRlhDT05TVF9EQkwoLTEuZik7CisgICAgLyogZmluZCBtYXhOcmdMZCAqLworICAgIG1heE5yZ0xkID0gZml4TWF4KG1heE5yZ0xkLCBiYW5kRW5lcmd5TGREYXRhW2ldKTsKICAgfQogCi0gIGlmIChtYXhOcmdMZDw9KEZJWFBfREJMKTApCi0gIHsKLSAgICAgZm9yKGk9bnVtQmFuZHM7IGktLSE9MDsgKQotICAgICB7Ci0gICAgICAgICBJTlQgc2NhbGUgPSBmaXhNaW4oKHNmYk1heFNjYWxlU3BlY1tpXS00KTw8MSwoREZSQUNUX0JJVFMtMSkpOwotICAgICAgICAgYmFuZEVuZXJneVtpXSA9IHNjYWxlVmFsdWUoYmFuZEVuZXJneVtpXSwgLXNjYWxlKTsKLSAgICAgfQotICAgICByZXR1cm4gMDsKLSAgfQotICBlbHNlCi0gIHsgIC8qIHNjYWxlIGRvd24gTlJHcyAqLwotICAgICB3aGlsZSAobWF4TnJnTGQ+RkwyRlhDT05TVF9EQkwoMC4wZikpCi0gICAgIHsKLSAgICAgICAgbWF4TnJnTGQgLT0gIEZMMkZYQ09OU1RfREJMKDIuMC82NCk7Ci0gICAgICAgIHNoaWZ0Qml0cysrOwotICAgICB9Ci0gICAgIGZvcihpPW51bUJhbmRzOyBpLS0hPTA7ICkKLSAgICAgewotICAgICAgICAgSU5UIHNjYWxlID0gZml4TWluKCAoKHNmYk1heFNjYWxlU3BlY1tpXS00KStzaGlmdEJpdHMpPDwxLCAoREZSQUNUX0JJVFMtMSkpOwotICAgICAgICAgYmFuZEVuZXJneUxkRGF0YVtpXSAtPSBzaGlmdEJpdHMqRkwyRlhDT05TVF9EQkwoMi4wLzY0KTsKLSAgICAgICAgIGJhbmRFbmVyZ3lbaV0gPSBzY2FsZVZhbHVlKGJhbmRFbmVyZ3lbaV0sIC1zY2FsZSk7Ci0gICAgIH0KLSAgICAgcmV0dXJuIHNoaWZ0Qml0czsKKyAgaWYgKG1heE5yZ0xkIDw9IChGSVhQX0RCTCkwKSB7CisgICAgZm9yIChpID0gbnVtQmFuZHM7IGktLSAhPSAwOykgeworICAgICAgSU5UIHNjYWxlID0gZml4TWluKChzZmJNYXhTY2FsZVNwZWNbaV0gLSA0KSA8PCAxLCAoREZSQUNUX0JJVFMgLSAxKSk7CisgICAgICBiYW5kRW5lcmd5W2ldID0gc2NhbGVWYWx1ZShiYW5kRW5lcmd5W2ldLCAtc2NhbGUpOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsgLyogc2NhbGUgZG93biBOUkdzICovCisgICAgd2hpbGUgKG1heE5yZ0xkID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgIG1heE5yZ0xkIC09IEZMMkZYQ09OU1RfREJMKDIuMCAvIDY0KTsKKyAgICAgIHNoaWZ0Qml0cysrOworICAgIH0KKyAgICBmb3IgKGkgPSBudW1CYW5kczsgaS0tICE9IDA7KSB7CisgICAgICBJTlQgc2NhbGUgPSBmaXhNaW4oKChzZmJNYXhTY2FsZVNwZWNbaV0gLSA0KSArIHNoaWZ0Qml0cykgPDwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoREZSQUNUX0JJVFMgLSAxKSk7CisgICAgICBiYW5kRW5lcmd5TGREYXRhW2ldIC09IHNoaWZ0Qml0cyAqIEZMMkZYQ09OU1RfREJMKDIuMCAvIDY0KTsKKyAgICAgIGJhbmRFbmVyZ3lbaV0gPSBzY2FsZVZhbHVlKGJhbmRFbmVyZ3lbaV0sIC1zY2FsZSk7CisgICAgfQorICAgIHJldHVybiBzaGlmdEJpdHM7CiAgIH0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfQ2FsY0JhbmRFbmVyZ3lPcHRpbVNob3J0CiAgIGRlc2NyaXB0aW9uOgogICBpbnB1dDoKICAgb3V0cHV0OgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1GREthYWNFbmNfQ2FsY0JhbmRFbmVyZ3lPcHRpbVNob3J0KGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBtZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICpSRVNUUklDVCBiYW5kT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbnVtQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICpSRVNUUklDVCBiYW5kRW5lcmd5KQotewordm9pZCBGREthYWNFbmNfQ2FsY0JhbmRFbmVyZ3lPcHRpbVNob3J0KGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBtZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpSRVNUUklDVCBiYW5kT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBudW1CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgYmFuZEVuZXJneSkgewogICBJTlQgaSwgajsKIAotICBmb3IoaT0wOyBpPG51bUJhbmRzOyBpKyspCi0gIHsKLSAgICBpbnQgbGVhZGluZ0JpdHMgPSBzZmJNYXhTY2FsZVNwZWNbaV0tMzsgICAgICAgICAgICAvKiBtYXggc2ZiV2lkdGggPSAzNiA7IDJeNj02NCA9PiA2LzIgPSAzIChzcGMqc3BjKSAqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgeworICAgIGludCBsZWFkaW5nQml0cyA9IHNmYk1heFNjYWxlU3BlY1tpXSAtCisgICAgICAgICAgICAgICAgICAgICAgMzsgLyogbWF4IHNmYldpZHRoID0gMzYgOyAyXjY9NjQgPT4gNi8yID0gMyAoc3BjKnNwYykgKi8KICAgICBGSVhQX0RCTCB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLjApOwotICAgIGZvciAoaj1iYW5kT2Zmc2V0W2ldO2o8YmFuZE9mZnNldFtpKzFdO2orKykKLSAgICB7Ci0gICAgICAgRklYUF9EQkwgc3BlYyA9IHNjYWxlVmFsdWUobWRjdFNwZWN0cnVtW2pdLGxlYWRpbmdCaXRzKTsKLSAgICAgICB0bXAgPSBmUG93MkFkZERpdjIodG1wLCBzcGVjKTsKKyAgICBmb3IgKGogPSBiYW5kT2Zmc2V0W2ldOyBqIDwgYmFuZE9mZnNldFtpICsgMV07IGorKykgeworICAgICAgRklYUF9EQkwgc3BlYyA9IHNjYWxlVmFsdWUobWRjdFNwZWN0cnVtW2pdLCBsZWFkaW5nQml0cyk7CisgICAgICB0bXAgPSBmUG93MkFkZERpdjIodG1wLCBzcGVjKTsKICAgICB9CiAgICAgYmFuZEVuZXJneVtpXSA9IHRtcDsKICAgfQogCi0gIGZvcihpPTA7IGk8bnVtQmFuZHM7IGkrKykKLSAgewotICAgICAgSU5UIHNjYWxlID0gKDIqKHNmYk1heFNjYWxlU3BlY1tpXS0zKSktMTsgICAgICAgICAvKiBtYXggc2ZiV2lkdGggPSAzNiA7IDJeNj02NCA9PiA2LzIgPSAzIChzcGMqc3BjKSAqLwotICAgICAgc2NhbGUgPSBmaXhNYXgoZml4TWluKHNjYWxlLChERlJBQ1RfQklUUy0xKSksLShERlJBQ1RfQklUUy0xKSk7Ci0gICAgICBiYW5kRW5lcmd5W2ldID0gc2NhbGVWYWx1ZVNhdHVyYXRlKGJhbmRFbmVyZ3lbaV0sIC1zY2FsZSk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgSU5UIHNjYWxlID0gKDIgKiAoc2ZiTWF4U2NhbGVTcGVjW2ldIC0gMykpIC0KKyAgICAgICAgICAgICAgICAxOyAvKiBtYXggc2ZiV2lkdGggPSAzNiA7IDJeNj02NCA9PiA2LzIgPSAzIChzcGMqc3BjKSAqLworICAgIHNjYWxlID0gZml4TWF4KGZpeE1pbihzY2FsZSwgKERGUkFDVF9CSVRTIC0gMSkpLCAtKERGUkFDVF9CSVRTIC0gMSkpOworICAgIGJhbmRFbmVyZ3lbaV0gPSBzY2FsZVZhbHVlU2F0dXJhdGUoYmFuZEVuZXJneVtpXSwgLXNjYWxlKTsKICAgfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19DYWxjQmFuZE5yZ01TT3B0CiAgIGRlc2NyaXB0aW9uOgogICBpbnB1dDoKICAgb3V0cHV0OgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEZES2FhY0VuY19DYWxjQmFuZE5yZ01TT3B0KGNvbnN0IEZJWFBfREJMICAgKlJFU1RSSUNUIG1kY3RTcGVjdHJ1bUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAgKlJFU1RSSUNUIG1kY3RTcGVjdHJ1bVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWNMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWNSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAqUkVTVFJJQ1QgYmFuZE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgbnVtQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICAgKlJFU1RSSUNUIGJhbmRFbmVyZ3lNaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgICAgKlJFU1RSSUNUIGJhbmRFbmVyZ3lTaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICBjYWxjTGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICAgICpSRVNUUklDVCBiYW5kRW5lcmd5TWlkTGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICAgICpSRVNUUklDVCBiYW5kRW5lcmd5U2lkZUxkRGF0YSkKLXsKK3ZvaWQgRkRLYWFjRW5jX0NhbGNCYW5kTnJnTVNPcHQoCisgICAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3RTcGVjdHJ1bUxlZnQsCisgICAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3RTcGVjdHJ1bVJpZ2h0LAorICAgIElOVCAqUkVTVFJJQ1Qgc2ZiTWF4U2NhbGVTcGVjTGVmdCwgSU5UICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWNSaWdodCwKKyAgICBjb25zdCBJTlQgKlJFU1RSSUNUIGJhbmRPZmZzZXQsIGNvbnN0IElOVCBudW1CYW5kcywKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgYmFuZEVuZXJneU1pZCwgRklYUF9EQkwgKlJFU1RSSUNUIGJhbmRFbmVyZ3lTaWRlLAorICAgIElOVCBjYWxjTGREYXRhLCBGSVhQX0RCTCAqUkVTVFJJQ1QgYmFuZEVuZXJneU1pZExkRGF0YSwKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgYmFuZEVuZXJneVNpZGVMZERhdGEpIHsKICAgSU5UIGksIGosIG1pblNjYWxlOwogICBGSVhQX0RCTCBOcmdNaWQsIE5yZ1NpZGUsIHNwZWNtLCBzcGVjczsKIAotICBmb3IgKGk9MDsgaTxudW1CYW5kczsgaSsrKSB7Ci0KKyAgZm9yIChpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKICAgICBOcmdNaWQgPSBOcmdTaWRlID0gRkwyRlhDT05TVF9EQkwoMC4wKTsKLSAgICBtaW5TY2FsZSA9IGZpeE1pbihzZmJNYXhTY2FsZVNwZWNMZWZ0W2ldLCBzZmJNYXhTY2FsZVNwZWNSaWdodFtpXSktNDsKKyAgICBtaW5TY2FsZSA9IGZpeE1pbihzZmJNYXhTY2FsZVNwZWNMZWZ0W2ldLCBzZmJNYXhTY2FsZVNwZWNSaWdodFtpXSkgLSA0OwogICAgIG1pblNjYWxlID0gZml4TWF4KDAsIG1pblNjYWxlKTsKIAogICAgIGlmIChtaW5TY2FsZSA+IDApIHsKLSAgICAgIGZvciAoaj1iYW5kT2Zmc2V0W2ldO2o8YmFuZE9mZnNldFtpKzFdO2orKykgewotICAgICAgICAgIEZJWFBfREJMIHNwZWNMID0gbWRjdFNwZWN0cnVtTGVmdFtqXTw8KG1pblNjYWxlLTEpOwotICAgICAgICAgIEZJWFBfREJMIHNwZWNSID0gbWRjdFNwZWN0cnVtUmlnaHRbal08PChtaW5TY2FsZS0xKTsKLSAgICAgICAgICBzcGVjbSA9IHNwZWNMICsgc3BlY1I7Ci0gICAgICAgICAgc3BlY3MgPSBzcGVjTCAtIHNwZWNSOwotICAgICAgICAgIE5yZ01pZCA9IGZQb3cyQWRkRGl2MihOcmdNaWQsIHNwZWNtKTsKLSAgICAgICAgICBOcmdTaWRlID0gZlBvdzJBZGREaXYyKE5yZ1NpZGUsIHNwZWNzKTsKKyAgICAgIGZvciAoaiA9IGJhbmRPZmZzZXRbaV07IGogPCBiYW5kT2Zmc2V0W2kgKyAxXTsgaisrKSB7CisgICAgICAgIEZJWFBfREJMIHNwZWNMID0gbWRjdFNwZWN0cnVtTGVmdFtqXSA8PCAobWluU2NhbGUgLSAxKTsKKyAgICAgICAgRklYUF9EQkwgc3BlY1IgPSBtZGN0U3BlY3RydW1SaWdodFtqXSA8PCAobWluU2NhbGUgLSAxKTsKKyAgICAgICAgc3BlY20gPSBzcGVjTCArIHNwZWNSOworICAgICAgICBzcGVjcyA9IHNwZWNMIC0gc3BlY1I7CisgICAgICAgIE5yZ01pZCA9IGZQb3cyQWRkRGl2MihOcmdNaWQsIHNwZWNtKTsKKyAgICAgICAgTnJnU2lkZSA9IGZQb3cyQWRkRGl2MihOcmdTaWRlLCBzcGVjcyk7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgIGZvciAoaj1iYW5kT2Zmc2V0W2ldO2o8YmFuZE9mZnNldFtpKzFdO2orKykgewotICAgICAgICAgIEZJWFBfREJMIHNwZWNMID0gbWRjdFNwZWN0cnVtTGVmdFtqXT4+MTsKLSAgICAgICAgICBGSVhQX0RCTCBzcGVjUiA9IG1kY3RTcGVjdHJ1bVJpZ2h0W2pdPj4xOwotICAgICAgICAgIHNwZWNtID0gc3BlY0wgKyBzcGVjUjsKLSAgICAgICAgICBzcGVjcyA9IHNwZWNMIC0gc3BlY1I7Ci0gICAgICAgICAgTnJnTWlkID0gZlBvdzJBZGREaXYyKE5yZ01pZCwgc3BlY20pOwotICAgICAgICAgIE5yZ1NpZGUgPSBmUG93MkFkZERpdjIoTnJnU2lkZSwgc3BlY3MpOworICAgICAgZm9yIChqID0gYmFuZE9mZnNldFtpXTsgaiA8IGJhbmRPZmZzZXRbaSArIDFdOyBqKyspIHsKKyAgICAgICAgRklYUF9EQkwgc3BlY0wgPSBtZGN0U3BlY3RydW1MZWZ0W2pdID4+IDE7CisgICAgICAgIEZJWFBfREJMIHNwZWNSID0gbWRjdFNwZWN0cnVtUmlnaHRbal0gPj4gMTsKKyAgICAgICAgc3BlY20gPSBzcGVjTCArIHNwZWNSOworICAgICAgICBzcGVjcyA9IHNwZWNMIC0gc3BlY1I7CisgICAgICAgIE5yZ01pZCA9IGZQb3cyQWRkRGl2MihOcmdNaWQsIHNwZWNtKTsKKyAgICAgICAgTnJnU2lkZSA9IGZQb3cyQWRkRGl2MihOcmdTaWRlLCBzcGVjcyk7CiAgICAgICB9CiAgICAgfQotICAgIGJhbmRFbmVyZ3lNaWRbaV0gPSBOcmdNaWQ8PDE7Ci0gICAgYmFuZEVuZXJneVNpZGVbaV0gPSBOcmdTaWRlPDwxOworICAgIGJhbmRFbmVyZ3lNaWRbaV0gPSBmTWluKE5yZ01pZCwgKEZJWFBfREJMKU1BWFZBTF9EQkwgPj4gMSkgPDwgMTsKKyAgICBiYW5kRW5lcmd5U2lkZVtpXSA9IGZNaW4oTnJnU2lkZSwgKEZJWFBfREJMKU1BWFZBTF9EQkwgPj4gMSkgPDwgMTsKICAgfQogCi0gIGlmKGNhbGNMZERhdGEpIHsKKyAgaWYgKGNhbGNMZERhdGEpIHsKICAgICBMZERhdGFWZWN0b3IoYmFuZEVuZXJneU1pZCwgYmFuZEVuZXJneU1pZExkRGF0YSwgbnVtQmFuZHMpOwogICAgIExkRGF0YVZlY3RvcihiYW5kRW5lcmd5U2lkZSwgYmFuZEVuZXJneVNpZGVMZERhdGEsIG51bUJhbmRzKTsKICAgfQogCi0gIGZvciAoaT0wOyBpPG51bUJhbmRzOyBpKyspCi0gIHsKLSAgICBJTlQgbWluU2NhbGUgPSBmaXhNaW4oc2ZiTWF4U2NhbGVTcGVjTGVmdFtpXSwgc2ZiTWF4U2NhbGVTcGVjUmlnaHRbaV0pOwotICAgIElOVCBzY2FsZSA9IGZpeE1heCgwLCAyKihtaW5TY2FsZS00KSk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgbWluU2NhbGUgPSBmaXhNaW4oc2ZiTWF4U2NhbGVTcGVjTGVmdFtpXSwgc2ZiTWF4U2NhbGVTcGVjUmlnaHRbaV0pOworICAgIElOVCBzY2FsZSA9IGZpeE1heCgwLCAyICogKG1pblNjYWxlIC0gNCkpOwogCi0gICAgaWYgKGNhbGNMZERhdGEpCi0gICAgewotICAgICAgIC8qIHVzaW5nIHRoZSBtaW5pbWFsIHNjYWxpbmcgb2YgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBjYW4gY2F1c2UgdmVyeSBzbWFsbCBlbmVyZ2llczsKLSAgICAgICBjaGVjayBsZE5yZyBiZWZvcmUgc3VidHJhY3Qgc2NhbGluZyBtdWx0aXBsaWNhdGlvbjogZnJhY3QqSU5UIHdlIGRvbid0IG5lZWQgZk11bHQgKi8KKyAgICBpZiAoY2FsY0xkRGF0YSkgeworICAgICAgLyogdXNpbmcgdGhlIG1pbmltYWwgc2NhbGluZyBvZiBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGNhbiBjYXVzZSB2ZXJ5CisgICAgICBzbWFsbCBlbmVyZ2llczsgY2hlY2sgbGROcmcgYmVmb3JlIHN1YnRyYWN0IHNjYWxpbmcgbXVsdGlwbGljYXRpb246CisgICAgICBmcmFjdCpJTlQgd2UgZG9uJ3QgbmVlZCBmTXVsdCAqLwogCi0gICAgICAgaW50IG1pbnVzID0gc2NhbGUqRkwyRlhDT05TVF9EQkwoMS4wLzY0KTsKKyAgICAgIGludCBtaW51cyA9IHNjYWxlICogRkwyRlhDT05TVF9EQkwoMS4wIC8gNjQpOwogCi0gICAgICAgaWYgKGJhbmRFbmVyZ3lNaWRMZERhdGFbaV0gIT0gRkwyRlhDT05TVF9EQkwoLTEuMGYpKQotICAgICAgICAgYmFuZEVuZXJneU1pZExkRGF0YVtpXSAtPSBtaW51czsKKyAgICAgIGlmIChiYW5kRW5lcmd5TWlkTGREYXRhW2ldICE9IEZMMkZYQ09OU1RfREJMKC0xLjBmKSkKKyAgICAgICAgYmFuZEVuZXJneU1pZExkRGF0YVtpXSAtPSBtaW51czsKIAotICAgICAgIGlmIChiYW5kRW5lcmd5U2lkZUxkRGF0YVtpXSAhPSBGTDJGWENPTlNUX0RCTCgtMS4wZikpCi0gICAgICAgICBiYW5kRW5lcmd5U2lkZUxkRGF0YVtpXSAtPSBtaW51czsKKyAgICAgIGlmIChiYW5kRW5lcmd5U2lkZUxkRGF0YVtpXSAhPSBGTDJGWENPTlNUX0RCTCgtMS4wZikpCisgICAgICAgIGJhbmRFbmVyZ3lTaWRlTGREYXRhW2ldIC09IG1pbnVzOwogICAgIH0KLSAgICBzY2FsZSA9IGZpeE1pbihzY2FsZSwgKERGUkFDVF9CSVRTLTEpKTsKLSAgICBiYW5kRW5lcmd5TWlkW2ldICA+Pj0gc2NhbGU7CisgICAgc2NhbGUgPSBmaXhNaW4oc2NhbGUsIChERlJBQ1RfQklUUyAtIDEpKTsKKyAgICBiYW5kRW5lcmd5TWlkW2ldID4+PSBzY2FsZTsKICAgICBiYW5kRW5lcmd5U2lkZVtpXSA+Pj0gc2NhbGU7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvYmFuZF9ucmcuaCBiL2xpYkFBQ2VuYy9zcmMvYmFuZF9ucmcuaAppbmRleCA1NDBhOGVmLi40MTM3NTY1IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2JhbmRfbnJnLmgKKysrIGIvbGliQUFDZW5jL3NyYy9iYW5kX25yZy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDcxICs5MCw1MyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBNLiBXZXJuZXIKKwogICAgRGVzY3JpcHRpb246IEJhbmQvTGluZSBlbmVyZ3kgY2FsY3VsYXRpb24KIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfQkFORF9OUkdfSAotI2RlZmluZSBfQkFORF9OUkdfSAorI2lmbmRlZiBCQU5EX05SR19ICisjZGVmaW5lIEJBTkRfTlJHX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAotCi12b2lkCi1GREthYWNFbmNfQ2FsY1NmYk1heFNjYWxlU3BlYygKLSAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICptZGN0U3BlY3RydW0sCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAqYmFuZE9mZnNldCwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICpzZmJNYXhTY2FsZVNwZWMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgbnVtQmFuZHMKLSAgICAgICAgKTsKK3ZvaWQgRkRLYWFjRW5jX0NhbGNTZmJNYXhTY2FsZVNwZWMoY29uc3QgRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpiYW5kT2Zmc2V0LCBJTlQgKnNmYk1heFNjYWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG51bUJhbmRzKTsKIAogRklYUF9EQkwKLUZES2FhY0VuY19DaGVja0JhbmRFbmVyZ3lPcHRpbSgKLSAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICptZGN0U3BlY3RydW0sCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAqc2ZiTWF4U2NhbGVTcGVjLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgKmJhbmRPZmZzZXQsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgbnVtQmFuZHMsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAqYmFuZEVuZXJneSwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICpiYW5kRW5lcmd5TGREYXRhLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgIG1pblNwZWNTaGlmdAotICAgICAgICApOworRkRLYWFjRW5jX0NoZWNrQmFuZEVuZXJneU9wdGltKGNvbnN0IEZJWFBfREJMICpjb25zdCBSRVNUUklDVCBtZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpjb25zdCBSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpjb25zdCBSRVNUUklDVCBiYW5kT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBudW1CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgYmFuZEVuZXJneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgYmFuZEVuZXJneUxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbWluU3BlY1NoaWZ0KTsKIAotSU5UCi1GREthYWNFbmNfQ2FsY0JhbmRFbmVyZ3lPcHRpbUxvbmcoCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAqbWRjdFNwZWN0cnVtLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgKnNmYk1heFNjYWxlU3BlYywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICpiYW5kT2Zmc2V0LAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIG51bUJhbmRzLAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgKmJhbmRFbmVyZ3ksCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAqYmFuZEVuZXJneUxkRGF0YQotICAgICAgICApOworSU5UIEZES2FhY0VuY19DYWxjQmFuZEVuZXJneU9wdGltTG9uZyhjb25zdCBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNmYk1heFNjYWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpiYW5kT2Zmc2V0LCBjb25zdCBJTlQgbnVtQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpiYW5kRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqYmFuZEVuZXJneUxkRGF0YSk7CiAKLXZvaWQKLUZES2FhY0VuY19DYWxjQmFuZEVuZXJneU9wdGltU2hvcnQoCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAqbWRjdFNwZWN0cnVtLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgKnNmYk1heFNjYWxlU3BlYywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICpiYW5kT2Zmc2V0LAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIG51bUJhbmRzLAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgKmJhbmRFbmVyZ3kKLSAgICAgICAgKTsKLQordm9pZCBGREthYWNFbmNfQ2FsY0JhbmRFbmVyZ3lPcHRpbVNob3J0KGNvbnN0IEZJWFBfREJMICptZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpzZmJNYXhTY2FsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpiYW5kT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBudW1CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqYmFuZEVuZXJneSk7CiAKIHZvaWQgRkRLYWFjRW5jX0NhbGNCYW5kTnJnTVNPcHQoCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICAgKlJFU1RSSUNUIG1kY3RTcGVjdHJ1bUxlZnQsCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICAgKlJFU1RSSUNUIG1kY3RTcGVjdHJ1bVJpZ2h0LAotICAgICAgICBJTlQgICAgICAgICAgICAgICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWNMZWZ0LAotICAgICAgICBJTlQgICAgICAgICAgICAgICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWNSaWdodCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAqUkVTVFJJQ1QgYmFuZE9mZnNldCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgbnVtQmFuZHMsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgKlJFU1RSSUNUIGJhbmRFbmVyZ3lNaWQsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgKlJFU1RSSUNUIGJhbmRFbmVyZ3lTaWRlLAotICAgICAgICBJTlQgICAgICAgICAgICAgICBjYWxjTGREYXRhLAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICpSRVNUUklDVCBiYW5kRW5lcmd5TWlkTGREYXRhLAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICpSRVNUUklDVCBiYW5kRW5lcmd5U2lkZUxkRGF0YSk7CisgICAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3RTcGVjdHJ1bUxlZnQsCisgICAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3RTcGVjdHJ1bVJpZ2h0LAorICAgIElOVCAqUkVTVFJJQ1Qgc2ZiTWF4U2NhbGVTcGVjTGVmdCwgSU5UICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWNSaWdodCwKKyAgICBjb25zdCBJTlQgKlJFU1RSSUNUIGJhbmRPZmZzZXQsIGNvbnN0IElOVCBudW1CYW5kcywKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgYmFuZEVuZXJneU1pZCwgRklYUF9EQkwgKlJFU1RSSUNUIGJhbmRFbmVyZ3lTaWRlLAorICAgIElOVCBjYWxjTGREYXRhLCBGSVhQX0RCTCAqUkVTVFJJQ1QgYmFuZEVuZXJneU1pZExkRGF0YSwKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgYmFuZEVuZXJneVNpZGVMZERhdGEpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvYmFuZHdpZHRoLmNwcCBiL2xpYkFBQ2VuYy9zcmMvYmFuZHdpZHRoLmNwcAppbmRleCA2OTM3MzYyLi4zNmNkNjRkIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2JhbmR3aWR0aC5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9iYW5kd2lkdGguY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIwICs5MCwyMSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqICBGYXN0IE1QRUcgQUFDIEF1ZGlvIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBTY2h1ZyAvIEEuIEdyb2VzY2hlbAotICAgY29udGVudHMvZGVzY3JpcHRpb246IGJhbmR3aWR0aCBleHBlcnQKKyAgIEF1dGhvcihzKTogICBNLiBTY2h1ZyAvIEEuIEdyb2VzY2hlbAogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogYmFuZHdpZHRoIGV4cGVydAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiY2hhbm5lbF9tYXAuaCIKICNpbmNsdWRlICJiYW5kd2lkdGguaCIKICNpbmNsdWRlICJhYWNFbmNfcmFtLmgiCiAKLXR5cGVkZWYgc3RydWN0ewordHlwZWRlZiBzdHJ1Y3QgewogICBJTlQgY2hhbkJpdFJhdGU7CiAgIElOVCBiYW5kV2lkdGhNb25vOwogICBJTlQgYmFuZFdpZHRoMkFuZE1vcmVDaGFuOwpAQCAtMTAwLDExNCArMTEyLDcxIEBACiB9IEJBTkRXSURUSF9UQUI7CiAKIHN0YXRpYyBjb25zdCBCQU5EV0lEVEhfVEFCIGJhbmRXaWR0aFRhYmxlW10gPSB7Ci0gIHswLCAgICAgIDM3MDAsICA1MDAwfSwKLSAgezEyMDAwLCAgNTAwMCwgIDY0MDB9LAotICB7MjAwMDAsICA2OTAwLCAgOTY0MH0sCi0gIHsyODAwMCwgIDk2MDAsIDEzMDUwfSwKLSAgezQwMDAwLCAxMjA2MCwgMTQyNjB9LAotICB7NTYwMDAsIDEzOTUwLCAxNTUwMH0sCi0gIHs3MjAwMCwgMTQyMDAsIDE2MTIwfSwKLSAgezk2MDAwLCAxNzAwMCwgMTcwMDB9LAotICB7NTc2MDAxLDE3MDAwLCAxNzAwMH0KLX07Ci0KKyAgICB7MCwgMzcwMCwgNTAwMH0sICAgICAgIHsxMjAwMCwgNTAwMCwgNjQwMH0sICAgezIwMDAwLCA2OTAwLCA5NjQwfSwKKyAgICB7MjgwMDAsIDk2MDAsIDEzMDUwfSwgIHs0MDAwMCwgMTIwNjAsIDE0MjYwfSwgezU2MDAwLCAxMzk1MCwgMTU1MDB9LAorICAgIHs3MjAwMCwgMTQyMDAsIDE2MTIwfSwgezk2MDAwLCAxNzAwMCwgMTcwMDB9LCB7NTc2MDAxLCAxNzAwMCwgMTcwMDB9fTsKIAogc3RhdGljIGNvbnN0IEJBTkRXSURUSF9UQUIgYmFuZFdpZHRoVGFibGVfTERfMjIwNTBbXSA9IHsKLSAgeyA4MDAwLCAgMjAwMCwgIDI0MDB9LAotICB7MTIwMDAsICAyNTAwLCAgMjcwMH0sCi0gIHsxNjAwMCwgIDMzMDAsICAzMTAwfSwKLSAgezI0MDAwLCAgNjI1MCwgIDcyMDB9LAotICB7MzIwMDAsICA5MjAwLCAgMTA1MDB9LAotICB7NDAwMDAsICAxNjAwMCwgMTYwMDB9LAotICB7NDgwMDAsICAxNjAwMCwgMTYwMDB9LAotICB7MzYwMDAxLCAxNjAwMCwgMTYwMDB9Ci19OworICAgIHs4MDAwLCAyMDAwLCAyNDAwfSwgICAgezEyMDAwLCAyNTAwLCAyNzAwfSwgICB7MTYwMDAsIDMzMDAsIDMxMDB9LAorICAgIHsyNDAwMCwgNjI1MCwgNzIwMH0sICAgezMyMDAwLCA5MjAwLCAxMDUwMH0sICB7NDAwMDAsIDE2MDAwLCAxNjAwMH0sCisgICAgezQ4MDAwLCAxNjAwMCwgMTYwMDB9LCB7MjgyMjQxLCAxNjAwMCwgMTYwMDB9fTsKIAogc3RhdGljIGNvbnN0IEJBTkRXSURUSF9UQUIgYmFuZFdpZHRoVGFibGVfTERfMjQwMDBbXSA9IHsKLSAgeyA4MDAwLCAgMjAwMCwgIDIwMDB9LAotICB7MTIwMDAsICAyMDAwLCAgMjMwMH0sCi0gIHsxNjAwMCwgIDIyMDAsICAyNTAwfSwKLSAgezI0MDAwLCAgNTY1MCwgIDcyMDB9LAotICB7MzIwMDAsICAxMTYwMCwgMTIwMDB9LAotICB7NDAwMDAsICAxMjAwMCwgMTYwMDB9LAotICB7NDgwMDAsICAxNjAwMCwgMTYwMDB9LAotICB7NjQwMDAsICAxNjAwMCwgMTYwMDB9LAotICB7MzYwMDAxLCAxNjAwMCwgMTYwMDB9Ci19OworICAgIHs4MDAwLCAyMDAwLCAyMDAwfSwgICAgezEyMDAwLCAyMDAwLCAyMzAwfSwgICB7MTYwMDAsIDIyMDAsIDI1MDB9LAorICAgIHsyNDAwMCwgNTY1MCwgNzIwMH0sICAgezMyMDAwLCAxMTYwMCwgMTIwMDB9LCB7NDAwMDAsIDEyMDAwLCAxNjAwMH0sCisgICAgezQ4MDAwLCAxNjAwMCwgMTYwMDB9LCB7NjQwMDAsIDE2MDAwLCAxNjAwMH0sIHszMDcyMDEsIDE2MDAwLCAxNjAwMH19OwogCiBzdGF0aWMgY29uc3QgQkFORFdJRFRIX1RBQiBiYW5kV2lkdGhUYWJsZV9MRF8zMjAwMFtdID0gewotICB7IDgwMDAsICAyMDAwLCAgMjAwMH0sCi0gIHsxMjAwMCwgIDIwMDAsICAyMDAwfSwKLSAgezI0MDAwLCAgNDI1MCwgIDcyMDB9LAotICB7MzIwMDAsICA4NDAwLCAgOTAwMH0sCi0gIHs0MDAwMCwgIDk0MDAsICAxMTMwMH0sCi0gIHs0ODAwMCwgIDExOTAwLCAxNDcwMH0sCi0gIHs2NDAwMCwgIDE0ODAwLCAxNjAwMH0sCi0gIHs3NjAwMCwgIDE2MDAwLCAxNjAwMH0sCi0gIHszNjAwMDEsIDE2MDAwLCAxNjAwMH0KLX07CisgICAgezgwMDAsIDIwMDAsIDIwMDB9LCAgICB7MTIwMDAsIDIwMDAsIDIwMDB9LCAgIHsyNDAwMCwgNDI1MCwgNzIwMH0sCisgICAgezMyMDAwLCA4NDAwLCA5MDAwfSwgICB7NDAwMDAsIDk0MDAsIDExMzAwfSwgIHs0ODAwMCwgMTE5MDAsIDE0NzAwfSwKKyAgICB7NjQwMDAsIDE0ODAwLCAxNjAwMH0sIHs3NjAwMCwgMTYwMDAsIDE2MDAwfSwgezQwOTYwMSwgMTYwMDAsIDE2MDAwfX07CiAKIHN0YXRpYyBjb25zdCBCQU5EV0lEVEhfVEFCIGJhbmRXaWR0aFRhYmxlX0xEXzQ0MTAwW10gPSB7Ci0gIHsgODAwMCwgIDIwMDAsICAyMDAwfSwKLSAgezI0MDAwLCAgMjAwMCwgIDIwMDB9LAotICB7MzIwMDAsICA0NDAwLCAgNTcwMH0sCi0gIHs0MDAwMCwgIDc0MDAsICA4ODAwfSwKLSAgezQ4MDAwLCAgOTAwMCwgIDEwNzAwfSwKLSAgezU2MDAwLCAgMTEwMDAsIDEyOTAwfSwKLSAgezY0MDAwLCAgMTQ0MDAsIDE1NTAwfSwKLSAgezgwMDAwLCAgMTYwMDAsIDE2MjAwfSwKLSAgezk2MDAwLCAgMTY1MDAsIDE2MDAwfSwKLSAgezEyODAwMCwgMTYwMDAsIDE2MDAwfSwKLSAgezM2MDAwMSwgMTYwMDAsIDE2MDAwfQotfTsKKyAgICB7ODAwMCwgMjAwMCwgMjAwMH0sICAgICB7MjQwMDAsIDIwMDAsIDIwMDB9LCAgIHszMjAwMCwgNDQwMCwgNTcwMH0sCisgICAgezQwMDAwLCA3NDAwLCA4ODAwfSwgICAgezQ4MDAwLCA5MDAwLCAxMDcwMH0sICB7NTYwMDAsIDExMDAwLCAxMjkwMH0sCisgICAgezY0MDAwLCAxNDQwMCwgMTU1MDB9LCAgezgwMDAwLCAxNjAwMCwgMTYyMDB9LCB7OTYwMDAsIDE2NTAwLCAxNjAwMH0sCisgICAgezEyODAwMCwgMTYwMDAsIDE2MDAwfSwgezU2NDQ4MSwgMTYwMDAsIDE2MDAwfX07CiAKIHN0YXRpYyBjb25zdCBCQU5EV0lEVEhfVEFCIGJhbmRXaWR0aFRhYmxlX0xEXzQ4MDAwW10gPSB7Ci0gIHsgODAwMCwgIDIwMDAsICAyMDAwfSwKLSAgezI0MDAwLCAgMjAwMCwgIDIwMDB9LAotICB7MzIwMDAsICA0NDAwLCAgNTcwMH0sCi0gIHs0MDAwMCwgIDc0MDAsICA4ODAwfSwKLSAgezQ4MDAwLCAgOTAwMCwgIDEwNzAwfSwKLSAgezU2MDAwLCAgMTEwMDAsIDEyODAwfSwKLSAgezY0MDAwLCAgMTQzMDAsIDE1NDAwfSwKLSAgezgwMDAwLCAgMTYwMDAsIDE2MjAwfSwKLSAgezk2MDAwLCAgMTY1MDAsIDE2MDAwfSwKLSAgezEyODAwMCwgMTYwMDAsIDE2MDAwfSwKLSAgezM2MDAwMSwgMTYwMDAsIDE2MDAwfQotfTsKKyAgICB7ODAwMCwgMjAwMCwgMjAwMH0sICAgICB7MjQwMDAsIDIwMDAsIDIwMDB9LCAgIHszMjAwMCwgNDQwMCwgNTcwMH0sCisgICAgezQwMDAwLCA3NDAwLCA4ODAwfSwgICAgezQ4MDAwLCA5MDAwLCAxMDcwMH0sICB7NTYwMDAsIDExMDAwLCAxMjgwMH0sCisgICAgezY0MDAwLCAxNDMwMCwgMTU0MDB9LCAgezgwMDAwLCAxNjAwMCwgMTYyMDB9LCB7OTYwMDAsIDE2NTAwLCAxNjAwMH0sCisgICAgezEyODAwMCwgMTYwMDAsIDE2MDAwfSwgezYxNDQwMSwgMTYwMDAsIDE2MDAwfX07CiAKLXR5cGVkZWYgc3RydWN0ewordHlwZWRlZiBzdHJ1Y3QgewogICBBQUNFTkNfQklUUkFURV9NT0RFIGJpdHJhdGVNb2RlOwogICBpbnQgYmFuZFdpZHRoTW9ubzsKICAgaW50IGJhbmRXaWR0aDJBbmRNb3JlQ2hhbjsKIH0gQkFORFdJRFRIX1RBQl9WQlI7CiAKLXN0YXRpYyBjb25zdCBCQU5EV0lEVEhfVEFCX1ZCUiBiYW5kV2lkdGhUYWJsZVZCUltdPSB7Ci0gIHtBQUNFTkNfQlJfTU9ERV9DQlIsICAgICAgICAwLCAgICAgMH0sCi0gIHtBQUNFTkNfQlJfTU9ERV9WQlJfMSwgIDEzMDUwLCAxMzA1MH0sCi0gIHtBQUNFTkNfQlJfTU9ERV9WQlJfMiwgIDEzMDUwLCAxMzA1MH0sCi0gIHtBQUNFTkNfQlJfTU9ERV9WQlJfMywgIDE0MjYwLCAxNDI2MH0sCi0gIHtBQUNFTkNfQlJfTU9ERV9WQlJfNCwgIDE1NTAwLCAxNTUwMH0sCi0gIHtBQUNFTkNfQlJfTU9ERV9WQlJfNSwgIDQ4MDAwLCA0ODAwMH0sCi0gIHtBQUNFTkNfQlJfTU9ERV9TRlIsICAgICAgICAwLCAgICAgMH0sCi0gIHtBQUNFTkNfQlJfTU9ERV9GRiwgICAgICAgICAwLCAgICAgMH0KK3N0YXRpYyBjb25zdCBCQU5EV0lEVEhfVEFCX1ZCUiBiYW5kV2lkdGhUYWJsZVZCUltdID0geworICAgIHtBQUNFTkNfQlJfTU9ERV9DQlIsIDAsIDB9LAorICAgIHtBQUNFTkNfQlJfTU9ERV9WQlJfMSwgMTMwNTAsIDEzMDUwfSwKKyAgICB7QUFDRU5DX0JSX01PREVfVkJSXzIsIDEzMDUwLCAxMzA1MH0sCisgICAge0FBQ0VOQ19CUl9NT0RFX1ZCUl8zLCAxNDI2MCwgMTQyNjB9LAorICAgIHtBQUNFTkNfQlJfTU9ERV9WQlJfNCwgMTU1MDAsIDE1NTAwfSwKKyAgICB7QUFDRU5DX0JSX01PREVfVkJSXzUsIDQ4MDAwLCA0ODAwMH0sCisgICAge0FBQ0VOQ19CUl9NT0RFX1NGUiwgMCwgMH0sCisgICAge0FBQ0VOQ19CUl9NT0RFX0ZGLCAwLCAwfQogCiB9OwogCi1zdGF0aWMgSU5UIEdldEJhbmR3aWR0aEVudHJ5KAotICAgICAgICAgICAgY29uc3QgSU5UIGZyYW1lTGVuZ3RoLAotICAgICAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICBjb25zdCBJTlQgY2hhbkJpdFJhdGUsCi0gICAgICAgICAgICBjb25zdCBJTlQgZW50cnlObykKLXsKK3N0YXRpYyBJTlQgR2V0QmFuZHdpZHRoRW50cnkoY29uc3QgSU5UIGZyYW1lTGVuZ3RoLCBjb25zdCBJTlQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGNoYW5CaXRSYXRlLCBjb25zdCBJTlQgZW50cnlObykgewogICBJTlQgYmFuZHdpZHRoID0gLTE7CiAgIGNvbnN0IEJBTkRXSURUSF9UQUIgKnBCd1RhYiA9IE5VTEw7CiAgIElOVCBid1RhYlNpemUgPSAwOwogCiAgIHN3aXRjaCAoZnJhbWVMZW5ndGgpIHsKKyAgICBjYXNlIDk2MDoKICAgICBjYXNlIDEwMjQ6CiAgICAgICBwQndUYWIgPSBiYW5kV2lkdGhUYWJsZTsKLSAgICAgIGJ3VGFiU2l6ZSA9IHNpemVvZihiYW5kV2lkdGhUYWJsZSkvc2l6ZW9mKEJBTkRXSURUSF9UQUIpOworICAgICAgYndUYWJTaXplID0gc2l6ZW9mKGJhbmRXaWR0aFRhYmxlKSAvIHNpemVvZihCQU5EV0lEVEhfVEFCKTsKICAgICAgIGJyZWFrOworICAgIGNhc2UgMTIwOgorICAgIGNhc2UgMTI4OgorICAgIGNhc2UgMjQwOgorICAgIGNhc2UgMjU2OgogICAgIGNhc2UgNDgwOgogICAgIGNhc2UgNTEyOgogICAgICAgc3dpdGNoIChzYW1wbGVSYXRlKSB7CkBAIC0yMTcsMjYgKzE4NiwyNiBAQAogICAgICAgICBjYXNlIDE2MDAwOgogICAgICAgICBjYXNlIDIyMDUwOgogICAgICAgICAgIHBCd1RhYiA9IGJhbmRXaWR0aFRhYmxlX0xEXzIyMDUwOwotICAgICAgICAgIGJ3VGFiU2l6ZSA9IHNpemVvZihiYW5kV2lkdGhUYWJsZV9MRF8yMjA1MCkvc2l6ZW9mKEJBTkRXSURUSF9UQUIpOworICAgICAgICAgIGJ3VGFiU2l6ZSA9IHNpemVvZihiYW5kV2lkdGhUYWJsZV9MRF8yMjA1MCkgLyBzaXplb2YoQkFORFdJRFRIX1RBQik7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjQwMDA6CiAgICAgICAgICAgcEJ3VGFiID0gYmFuZFdpZHRoVGFibGVfTERfMjQwMDA7Ci0gICAgICAgICAgYndUYWJTaXplID0gc2l6ZW9mKGJhbmRXaWR0aFRhYmxlX0xEXzI0MDAwKS9zaXplb2YoQkFORFdJRFRIX1RBQik7CisgICAgICAgICAgYndUYWJTaXplID0gc2l6ZW9mKGJhbmRXaWR0aFRhYmxlX0xEXzI0MDAwKSAvIHNpemVvZihCQU5EV0lEVEhfVEFCKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAzMjAwMDoKICAgICAgICAgICBwQndUYWIgPSBiYW5kV2lkdGhUYWJsZV9MRF8zMjAwMDsKLSAgICAgICAgICBid1RhYlNpemUgPSBzaXplb2YoYmFuZFdpZHRoVGFibGVfTERfMzIwMDApL3NpemVvZihCQU5EV0lEVEhfVEFCKTsKKyAgICAgICAgICBid1RhYlNpemUgPSBzaXplb2YoYmFuZFdpZHRoVGFibGVfTERfMzIwMDApIC8gc2l6ZW9mKEJBTkRXSURUSF9UQUIpOwogICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICg0NDEwMCk6CisgICAgICAgIGNhc2UgNDQxMDA6CiAgICAgICAgICAgcEJ3VGFiID0gYmFuZFdpZHRoVGFibGVfTERfNDQxMDA7Ci0gICAgICAgICAgYndUYWJTaXplID0gc2l6ZW9mKGJhbmRXaWR0aFRhYmxlX0xEXzQ0MTAwKS9zaXplb2YoQkFORFdJRFRIX1RBQik7CisgICAgICAgICAgYndUYWJTaXplID0gc2l6ZW9mKGJhbmRXaWR0aFRhYmxlX0xEXzQ0MTAwKSAvIHNpemVvZihCQU5EV0lEVEhfVEFCKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA0ODAwMDoKICAgICAgICAgY2FzZSA2NDAwMDoKICAgICAgICAgY2FzZSA4ODIwMDoKICAgICAgICAgY2FzZSA5NjAwMDoKICAgICAgICAgICBwQndUYWIgPSBiYW5kV2lkdGhUYWJsZV9MRF80ODAwMDsKLSAgICAgICAgICBid1RhYlNpemUgPSBzaXplb2YoYmFuZFdpZHRoVGFibGVfTERfNDgwMDApL3NpemVvZihCQU5EV0lEVEhfVEFCKTsKKyAgICAgICAgICBid1RhYlNpemUgPSBzaXplb2YoYmFuZFdpZHRoVGFibGVfTERfNDgwMDApIC8gc2l6ZW9mKEJBTkRXSURUSF9UQUIpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgYnJlYWs7CkBAIC0yNDUsMzEgKzIxNCwzOCBAQAogICAgICAgYndUYWJTaXplID0gMDsKICAgfQogCi0gIGlmIChwQndUYWIhPU5VTEwpIHsKKyAgaWYgKHBCd1RhYiAhPSBOVUxMKSB7CiAgICAgaW50IGk7Ci0gICAgZm9yIChpPTA7IGk8YndUYWJTaXplLTE7IGkrKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBid1RhYlNpemUgLSAxOyBpKyspIHsKICAgICAgIGlmIChjaGFuQml0UmF0ZSA+PSBwQndUYWJbaV0uY2hhbkJpdFJhdGUgJiYKLSAgICAgICAgICBjaGFuQml0UmF0ZSA8IHBCd1RhYltpKzFdLmNoYW5CaXRSYXRlKQotICAgICAgeworICAgICAgICAgIGNoYW5CaXRSYXRlIDwgcEJ3VGFiW2kgKyAxXS5jaGFuQml0UmF0ZSkgewogICAgICAgICBzd2l0Y2ggKGZyYW1lTGVuZ3RoKSB7CisgICAgICAgICAgY2FzZSA5NjA6CiAgICAgICAgICAgY2FzZSAxMDI0OgotICAgICAgICAgICAgYmFuZHdpZHRoID0gKGVudHJ5Tm89PTApCi0gICAgICAgICAgICAgID8gcEJ3VGFiW2ldLmJhbmRXaWR0aE1vbm8KLSAgICAgICAgICAgICAgOiBwQndUYWJbaV0uYmFuZFdpZHRoMkFuZE1vcmVDaGFuOworICAgICAgICAgICAgYmFuZHdpZHRoID0gKGVudHJ5Tm8gPT0gMCkgPyBwQndUYWJbaV0uYmFuZFdpZHRoTW9ubworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwQndUYWJbaV0uYmFuZFdpZHRoMkFuZE1vcmVDaGFuOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxMjA6CisgICAgICAgICAgY2FzZSAxMjg6CisgICAgICAgICAgY2FzZSAyNDA6CisgICAgICAgICAgY2FzZSAyNTY6CiAgICAgICAgICAgY2FzZSA0ODA6Ci0gICAgICAgICAgY2FzZSA1MTI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIElOVCBxX3JlcyA9IDA7Ci0gICAgICAgICAgICAgIElOVCBzdGFydEJ3ID0gKGVudHJ5Tm89PTApID8gIHBCd1RhYltpICBdLmJhbmRXaWR0aE1vbm8gOiBwQndUYWJbaSAgXS5iYW5kV2lkdGgyQW5kTW9yZUNoYW47Ci0gICAgICAgICAgICAgIElOVCBlbmRCdyA9ICAgKGVudHJ5Tm89PTApID8gIHBCd1RhYltpKzFdLmJhbmRXaWR0aE1vbm8gOiBwQndUYWJbaSsxXS5iYW5kV2lkdGgyQW5kTW9yZUNoYW47Ci0gICAgICAgICAgICAgIElOVCBzdGFydEJyID0gcEJ3VGFiW2ldLmNoYW5CaXRSYXRlOwotICAgICAgICAgICAgICBJTlQgZW5kQnIgPSBwQndUYWJbaSsxXS5jaGFuQml0UmF0ZTsKKyAgICAgICAgICBjYXNlIDUxMjogeworICAgICAgICAgICAgSU5UIHFfcmVzID0gMDsKKyAgICAgICAgICAgIElOVCBzdGFydEJ3ID0gKGVudHJ5Tm8gPT0gMCkgPyBwQndUYWJbaV0uYmFuZFdpZHRoTW9ubworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBCd1RhYltpXS5iYW5kV2lkdGgyQW5kTW9yZUNoYW47CisgICAgICAgICAgICBJTlQgZW5kQncgPSAoZW50cnlObyA9PSAwKSA/IHBCd1RhYltpICsgMV0uYmFuZFdpZHRoTW9ubworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwQndUYWJbaSArIDFdLmJhbmRXaWR0aDJBbmRNb3JlQ2hhbjsKKyAgICAgICAgICAgIElOVCBzdGFydEJyID0gcEJ3VGFiW2ldLmNoYW5CaXRSYXRlOworICAgICAgICAgICAgSU5UIGVuZEJyID0gcEJ3VGFiW2kgKyAxXS5jaGFuQml0UmF0ZTsKIAotICAgICAgICAgICAgICBGSVhQX0RCTCBid0ZhY19maXggPSBmRGl2Tm9ybShjaGFuQml0UmF0ZS1zdGFydEJyLCBlbmRCci1zdGFydEJyLCAmcV9yZXMpOwotICAgICAgICAgICAgICBiYW5kd2lkdGggPSAoSU5UKXNjYWxlVmFsdWUoZk11bHQoYndGYWNfZml4LCAoRklYUF9EQkwpKGVuZEJ3LXN0YXJ0QncpKSxxX3JlcykgKyBzdGFydEJ3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBGSVhQX0RCTCBid0ZhY19maXggPQorICAgICAgICAgICAgICAgIGZEaXZOb3JtKGNoYW5CaXRSYXRlIC0gc3RhcnRCciwgZW5kQnIgLSBzdGFydEJyLCAmcV9yZXMpOworICAgICAgICAgICAgYmFuZHdpZHRoID0KKyAgICAgICAgICAgICAgICAoSU5UKXNjYWxlVmFsdWUoZk11bHQoYndGYWNfZml4LCAoRklYUF9EQkwpKGVuZEJ3IC0gc3RhcnRCdykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxX3JlcykgKworICAgICAgICAgICAgICAgIHN0YXJ0Qnc7CisgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYmFuZHdpZHRoID0gLTE7CiAgICAgICAgIH0KQEAgLTI4MSw5OSArMjU3LDEwNCBAQAogICByZXR1cm4gYmFuZHdpZHRoOwogfQogCi0KLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19EZXRlcm1pbmVCYW5kV2lkdGgoSU5UKiBiYW5kV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBwcm9wb3NlZEJhbmRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0VOQ19CSVRSQVRFX01PREUgYml0cmF0ZU1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZnJhbWVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyogY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTU9ERSBlbmNvZGVyTW9kZSkKLXsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19EZXRlcm1pbmVCYW5kV2lkdGgoCisgICAgY29uc3QgSU5UIHByb3Bvc2VkQmFuZFdpZHRoLCBjb25zdCBJTlQgYml0cmF0ZSwKKyAgICBjb25zdCBBQUNFTkNfQklUUkFURV9NT0RFIGJpdHJhdGVNb2RlLCBjb25zdCBJTlQgc2FtcGxlUmF0ZSwKKyAgICBjb25zdCBJTlQgZnJhbWVMZW5ndGgsIGNvbnN0IENIQU5ORUxfTUFQUElORyAqY29uc3QgY20sCisgICAgY29uc3QgQ0hBTk5FTF9NT0RFIGVuY29kZXJNb2RlLCBJTlQgKmNvbnN0IGJhbmRXaWR0aCkgewogICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1cyA9IEFBQ19FTkNfT0s7Ci0gIElOVCBjaGFuQml0UmF0ZSA9IGJpdHJhdGUvY20tPm5DaGFubmVsczsKKyAgSU5UIGNoYW5CaXRSYXRlID0gYml0cmF0ZSAvIGNtLT5uQ2hhbm5lbHNFZmY7CiAKLSAgLyogdmJyICovCi0gIHN3aXRjaChiaXRyYXRlTW9kZSl7Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzE6Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzI6Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzM6Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzQ6Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzU6Ci0gICAgaWYgKHByb3Bvc2VkQmFuZFdpZHRoICE9IDApewotICAgICAgLyogdXNlIGdpdmVuIGJ3ICovCi0gICAgICAqYmFuZFdpZHRoID0gcHJvcG9zZWRCYW5kV2lkdGg7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHRha2UgYncgZnJvbSB0YWJsZSAqLwotICAgICAgc3dpdGNoKGVuY29kZXJNb2RlKXsKLSAgICAgIGNhc2UgTU9ERV8xOgotICAgICAgICAqYmFuZFdpZHRoID0gYmFuZFdpZHRoVGFibGVWQlJbYml0cmF0ZU1vZGVdLmJhbmRXaWR0aE1vbm87Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBNT0RFXzI6Ci0gICAgICBjYXNlIE1PREVfMV8yOgotICAgICAgY2FzZSBNT0RFXzFfMl8xOgotICAgICAgY2FzZSBNT0RFXzFfMl8yOgotICAgICAgY2FzZSBNT0RFXzFfMl8yXzE6Ci0gICAgICBjYXNlIE1PREVfMV8yXzJfMl8xOgotICAgICAgY2FzZSBNT0RFXzdfMV9SRUFSX1NVUlJPVU5EOgotICAgICAgY2FzZSBNT0RFXzdfMV9GUk9OVF9DRU5URVI6Ci0gICAgICAgICpiYW5kV2lkdGggPSBiYW5kV2lkdGhUYWJsZVZCUltiaXRyYXRlTW9kZV0uYmFuZFdpZHRoMkFuZE1vcmVDaGFuOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUc7CisgIHN3aXRjaCAoYml0cmF0ZU1vZGUpIHsKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8xOgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzI6CisgICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMzoKKyAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl80OgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzU6CisgICAgICBpZiAocHJvcG9zZWRCYW5kV2lkdGggIT0gMCkgeworICAgICAgICAvKiB1c2UgZ2l2ZW4gYncgKi8KKyAgICAgICAgKmJhbmRXaWR0aCA9IHByb3Bvc2VkQmFuZFdpZHRoOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogdGFrZSBidyBmcm9tIHRhYmxlICovCisgICAgICAgIHN3aXRjaCAoZW5jb2Rlck1vZGUpIHsKKyAgICAgICAgICBjYXNlIE1PREVfMToKKyAgICAgICAgICAgICpiYW5kV2lkdGggPSBiYW5kV2lkdGhUYWJsZVZCUltiaXRyYXRlTW9kZV0uYmFuZFdpZHRoTW9ubzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgTU9ERV8yOgorICAgICAgICAgIGNhc2UgTU9ERV8xXzI6CisgICAgICAgICAgY2FzZSBNT0RFXzFfMl8xOgorICAgICAgICAgIGNhc2UgTU9ERV8xXzJfMjoKKyAgICAgICAgICBjYXNlIE1PREVfMV8yXzJfMToKKyAgICAgICAgICBjYXNlIE1PREVfNl8xOgorICAgICAgICAgIGNhc2UgTU9ERV8xXzJfMl8yXzE6CisgICAgICAgICAgY2FzZSBNT0RFXzdfMV9SRUFSX1NVUlJPVU5EOgorICAgICAgICAgIGNhc2UgTU9ERV83XzFfRlJPTlRfQ0VOVEVSOgorICAgICAgICAgIGNhc2UgTU9ERV83XzFfQkFDSzoKKyAgICAgICAgICBjYXNlIE1PREVfN18xX1RPUF9GUk9OVDoKKyAgICAgICAgICAgICpiYW5kV2lkdGggPSBiYW5kV2lkdGhUYWJsZVZCUltiaXRyYXRlTW9kZV0uYmFuZFdpZHRoMkFuZE1vcmVDaGFuOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUc7CisgICAgICAgIH0KICAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgQUFDRU5DX0JSX01PREVfQ0JSOgotICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1NGUjoKLSAgY2FzZSBBQUNFTkNfQlJfTU9ERV9GRjoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX0JSX01PREVfQ0JSOgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfU0ZSOgorICAgIGNhc2UgQUFDRU5DX0JSX01PREVfRkY6CiAKLSAgICAvKiBiYW5kd2lkdGggbGltaXRpbmcgKi8KLSAgICBpZiAocHJvcG9zZWRCYW5kV2lkdGggIT0gMCkgewotICAgICAgKmJhbmRXaWR0aCA9IEZES21pbihwcm9wb3NlZEJhbmRXaWR0aCwgRkRLbWluKDIwMDAwLCBzYW1wbGVSYXRlPj4xKSk7Ci0gICAgfQotICAgIGVsc2UgeyAvKiBzZWFyY2ggcmVhc29uYWJsZSBiYW5kd2lkdGggKi8KKyAgICAgIC8qIGJhbmR3aWR0aCBsaW1pdGluZyAqLworICAgICAgaWYgKHByb3Bvc2VkQmFuZFdpZHRoICE9IDApIHsKKyAgICAgICAgKmJhbmRXaWR0aCA9IGZNaW4ocHJvcG9zZWRCYW5kV2lkdGgsIGZNaW4oMjAwMDAsIHNhbXBsZVJhdGUgPj4gMSkpOworICAgICAgfSBlbHNlIHsgLyogc2VhcmNoIHJlYXNvbmFibGUgYmFuZHdpZHRoICovCiAKLSAgICAgIGludCBlbnRyeU5vID0gMDsKKyAgICAgICAgaW50IGVudHJ5Tm8gPSAwOwogCi0gICAgICBzd2l0Y2goZW5jb2Rlck1vZGUpewotICAgICAgY2FzZSBNT0RFXzE6ICAgICAgICAvKiBtb25vICAgICAgKi8KLSAgICAgICAgZW50cnlObyA9IDA7ICAgICAgLyogdXNlIG1vbm8gYmFuZHdpdGggc2V0dGluZ3MgKi8KLSAgICAgICAgYnJlYWs7CisgICAgICAgIHN3aXRjaCAoZW5jb2Rlck1vZGUpIHsKKyAgICAgICAgICBjYXNlIE1PREVfMTogICAvKiBtb25vICAgICAgKi8KKyAgICAgICAgICAgIGVudHJ5Tm8gPSAwOyAvKiB1c2UgbW9ubyBiYW5kd2lkdGggc2V0dGluZ3MgKi8KKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIE1PREVfMjogICAgICAgIC8qIHN0ZXJlbyAgICAqLwotICAgICAgY2FzZSBNT0RFXzFfMjogICAgICAvKiBzY2UgKyBjcGUgKi8KLSAgICAgIGNhc2UgTU9ERV8xXzJfMTogICAgLyogc2NlICsgY3BlICsgc2NlICovCi0gICAgICBjYXNlIE1PREVfMV8yXzI6ICAgIC8qIHNjZSArIGNwZSArIGNwZSAqLwotICAgICAgY2FzZSBNT0RFXzFfMl8yXzE6ICAvKiAoNS4xKSBzY2UgKyBjcGUgKyBjcGUgKyBsZmUgKi8KLSAgICAgIGNhc2UgTU9ERV8xXzJfMl8yXzE6IC8qICg3LjEpIHNjZSArIGNwZSArIGNwZSArIGNwZSArIGxmZSAqLwotICAgICAgY2FzZSBNT0RFXzdfMV9SRUFSX1NVUlJPVU5EOgotICAgICAgY2FzZSBNT0RFXzdfMV9GUk9OVF9DRU5URVI6Ci0gICAgICAgIGVudHJ5Tm8gPSAxOyAgICAgIC8qIHVzZSBzdGVyZW8gYmFuZHdpdGggc2V0dGluZ3MgKi8KLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBNT0RFXzI6ICAgICAgIC8qIHN0ZXJlbyAgICAqLworICAgICAgICAgIGNhc2UgTU9ERV8xXzI6ICAgICAvKiBzY2UgKyBjcGUgKi8KKyAgICAgICAgICBjYXNlIE1PREVfMV8yXzE6ICAgLyogc2NlICsgY3BlICsgc2NlICovCisgICAgICAgICAgY2FzZSBNT0RFXzFfMl8yOiAgIC8qIHNjZSArIGNwZSArIGNwZSAqLworICAgICAgICAgIGNhc2UgTU9ERV8xXzJfMl8xOiAvKiAoNS4xKSBzY2UgKyBjcGUgKyBjcGUgKyBsZmUgKi8KKyAgICAgICAgICBjYXNlIE1PREVfNl8xOgorICAgICAgICAgIGNhc2UgTU9ERV8xXzJfMl8yXzE6CisgICAgICAgICAgY2FzZSBNT0RFXzdfMV9SRUFSX1NVUlJPVU5EOgorICAgICAgICAgIGNhc2UgTU9ERV83XzFfRlJPTlRfQ0VOVEVSOgorICAgICAgICAgIGNhc2UgTU9ERV83XzFfQkFDSzoKKyAgICAgICAgICBjYXNlIE1PREVfN18xX1RPUF9GUk9OVDoKKyAgICAgICAgICAgIGVudHJ5Tm8gPSAxOyAvKiB1c2Ugc3RlcmVvIGJhbmR3aWR0aCBzZXR0aW5ncyAqLworICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUc7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUc7CisgICAgICAgIH0KKworICAgICAgICAqYmFuZFdpZHRoID0KKyAgICAgICAgICAgIEdldEJhbmR3aWR0aEVudHJ5KGZyYW1lTGVuZ3RoLCBzYW1wbGVSYXRlLCBjaGFuQml0UmF0ZSwgZW50cnlObyk7CisKKyAgICAgICAgaWYgKCpiYW5kV2lkdGggPT0gLTEpIHsKKyAgICAgICAgICBzd2l0Y2ggKGZyYW1lTGVuZ3RoKSB7CisgICAgICAgICAgICBjYXNlIDEyMDoKKyAgICAgICAgICAgIGNhc2UgMTI4OgorICAgICAgICAgICAgY2FzZSAyNDA6CisgICAgICAgICAgICBjYXNlIDI1NjoKKyAgICAgICAgICAgICAgKmJhbmRXaWR0aCA9IDE2MDAwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19JTlZBTElEX0NIQU5ORUxfQklUUkFURTsKKyAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgIH0KLQotICAgICAgKmJhbmRXaWR0aCA9IEdldEJhbmR3aWR0aEVudHJ5KAotICAgICAgICAgICAgZnJhbWVMZW5ndGgsCi0gICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgY2hhbkJpdFJhdGUsCi0gICAgICAgICAgICBlbnRyeU5vKTsKLQotICAgICAgaWYgKCpiYW5kV2lkdGg9PS0xKSB7Ci0gICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19JTlZBTElEX0NIQU5ORUxfQklUUkFURTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgKmJhbmRXaWR0aCA9IDA7Ci0gICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQklUUkFURV9NT0RFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICpiYW5kV2lkdGggPSAwOworICAgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQklUUkFURV9NT0RFOwogICB9CiAKLSAgKmJhbmRXaWR0aCA9IEZES21pbigqYmFuZFdpZHRoLCBzYW1wbGVSYXRlLzIpOworICAqYmFuZFdpZHRoID0gZk1pbigqYmFuZFdpZHRoLCBzYW1wbGVSYXRlIC8gMik7CiAKLSAgcmV0dXJuIEVycm9yU3RhdHVzOzsKKyAgcmV0dXJuIEVycm9yU3RhdHVzOwogfQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9iYW5kd2lkdGguaCBiL2xpYkFBQ2VuYy9zcmMvYmFuZHdpZHRoLmgKaW5kZXggMmU5MjQ1My4uMDg4ZTgyOSAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9iYW5kd2lkdGguaAorKysgYi9saWJBQUNlbmMvc3JjL2JhbmR3aWR0aC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDI4ICs5MCwyNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqICBGYXN0IE1QRUcgQUFDIEF1ZGlvIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBTY2h1ZyAvIEEuIEdyb2VzY2hlbAotICAgY29udGVudHMvZGVzY3JpcHRpb246IGJhbmR3aWR0aCBleHBlcnQKKyAgIEF1dGhvcihzKTogICBNLiBTY2h1ZyAvIEEuIEdyb2VzY2hlbAogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogYmFuZHdpZHRoIGV4cGVydAogCi0jaWZuZGVmIF9CQU5EV0lEVEhfSAotI2RlZmluZSBfQkFORFdJRFRIX0gKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZm5kZWYgQkFORFdJRFRIX0gKKyNkZWZpbmUgQkFORFdJRFRIX0gKIAogI2luY2x1ZGUgInFjX2RhdGEuaCIKIAotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0RldGVybWluZUJhbmRXaWR0aChJTlQqIGJhbmRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHByb3Bvc2VkQmFuZHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDRU5DX0JJVFJBVEVfTU9ERSBiaXRyYXRlTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBmcmFtZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HKiBjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NT0RFIGVuY29kZXJNb2RlKTsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19EZXRlcm1pbmVCYW5kV2lkdGgoCisgICAgY29uc3QgSU5UIHByb3Bvc2VkQmFuZFdpZHRoLCBjb25zdCBJTlQgYml0cmF0ZSwKKyAgICBjb25zdCBBQUNFTkNfQklUUkFURV9NT0RFIGJpdHJhdGVNb2RlLCBjb25zdCBJTlQgc2FtcGxlUmF0ZSwKKyAgICBjb25zdCBJTlQgZnJhbWVMZW5ndGgsIGNvbnN0IENIQU5ORUxfTUFQUElORyAqY29uc3QgY20sCisgICAgY29uc3QgQ0hBTk5FTF9NT0RFIGVuY29kZXJNb2RlLCBJTlQgKmNvbnN0IGJhbmRXaWR0aCk7CiAKICNlbmRpZiAvKiBCQU5EV0lEVEhfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9iaXRfY250LmNwcCBiL2xpYkFBQ2VuYy9zcmMvYml0X2NudC5jcHAKaW5kZXggOTI2ZWU0OS4uNTc5ZGY4YyAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9iaXRfY250LmNwcAorKysgYi9saWJBQUNlbmMvc3JjL2JpdF9jbnQuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIwICs5MCwyMSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IEh1ZmZtYW4gQml0Y291bnRlciAmIGNvZGVyCisgICBBdXRob3Iocyk6ICAgTS5XZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IEh1ZmZtYW4gQml0Y291bnRlciAmIGNvZGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJiaXRfY250LmgiCiAKICNpbmNsdWRlICJhYWNFbmNfcmFtLmgiCiAKLSNkZWZpbmUgSElfTFRBQihhKSAoYT4+MTYpCisjZGVmaW5lIEhJX0xUQUIoYSkgKGEgPj4gMTYpCiAjZGVmaW5lIExPX0xUQUIoYSkgKGEgJiAweGZmZmYpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTA2LDcyICsxMTgsNjIgQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIEZES2FhY0VuY19jb3VudDFfMl8zXzRfNV82XzdfOF85XzEwXzExKGNvbnN0IFNIT1JUICpSRVNUUklDVCB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAqYml0Q291bnQpCi17Ci0KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jb3VudDFfMl8zXzRfNV82XzdfOF85XzEwXzExKGNvbnN0IFNIT1JUICpjb25zdCB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKlJFU1RSSUNUIGJpdENvdW50KSB7CiAgIElOVCBpOwotICBJTlQgYmMxXzIsYmMzXzQsYmM1XzYsYmM3XzgsYmM5XzEwLGJjMTEsc2M7Ci0gIElOVCB0MCx0MSx0Mix0MzsKLSAgYmMxXzI9MDsKLSAgYmMzXzQ9MDsKLSAgYmM1XzY9MDsKLSAgYmM3Xzg9MDsKLSAgYmM5XzEwPTA7Ci0gIGJjMTE9MDsKLSAgc2M9MDsKKyAgSU5UIGJjMV8yLCBiYzNfNCwgYmM1XzYsIGJjN184LCBiYzlfMTAsIGJjMTEsIHNjOworICBJTlQgdDAsIHQxLCB0MiwgdDM7CisgIGJjMV8yID0gMDsKKyAgYmMzXzQgPSAwOworICBiYzVfNiA9IDA7CisgIGJjN184ID0gMDsKKyAgYmM5XzEwID0gMDsKKyAgYmMxMSA9IDA7CisgIHNjID0gMDsKIAotICBmb3IoaT0wO2k8d2lkdGg7aSs9NCl7CisgIERXT1JEX0FMSUdORUQodmFsdWVzKTsKIAotICAgIHQwPSB2YWx1ZXNbaSswXTsKLSAgICB0MT0gdmFsdWVzW2krMV07Ci0gICAgdDI9IHZhbHVlc1tpKzJdOwotICAgIHQzPSB2YWx1ZXNbaSszXTsKKyAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDQpIHsKKyAgICB0MCA9IHZhbHVlc1tpICsgMF07CisgICAgdDEgPSB2YWx1ZXNbaSArIDFdOworICAgIHQyID0gdmFsdWVzW2kgKyAyXTsKKyAgICB0MyA9IHZhbHVlc1tpICsgM107CiAKLSAgICAvKiAxLDIgKi8KKyAgICBiYzFfMiArPSAoSU5UKUZES2FhY0VuY19odWZmX2x0YWIxXzJbdDAgKyAxXVt0MSArIDFdW3QyICsgMV1bdDMgKyAxXTsKKyAgICBiYzVfNiArPSAoSU5UKUZES2FhY0VuY19odWZmX2x0YWI1XzZbdDAgKyA0XVt0MSArIDRdICsKKyAgICAgICAgICAgICAoSU5UKUZES2FhY0VuY19odWZmX2x0YWI1XzZbdDIgKyA0XVt0MyArIDRdOwogCi0gICAgYmMxXzIrPUZES2FhY0VuY19odWZmX2x0YWIxXzJbdDArMV1bdDErMV1bdDIrMV1bdDMrMV07CisgICAgdDAgPSBmaXhwX2Ficyh0MCk7CisgICAgc2MgKz0gKHQwID4gMCk7CisgICAgdDEgPSBmaXhwX2Ficyh0MSk7CisgICAgc2MgKz0gKHQxID4gMCk7CisgICAgdDIgPSBmaXhwX2Ficyh0Mik7CisgICAgc2MgKz0gKHQyID4gMCk7CisgICAgdDMgPSBmaXhwX2Ficyh0Myk7CisgICAgc2MgKz0gKHQzID4gMCk7CiAKLSAgICAvKiA1LDYgKi8KLSAgICBiYzVfNis9RkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XTsKLSAgICBiYzVfNis9RkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0Mis0XVt0Mys0XTsKLQotICAgIHQwPWZpeHBfYWJzKHQwKTsKLSAgICB0MT1maXhwX2Ficyh0MSk7Ci0gICAgdDI9Zml4cF9hYnModDIpOwotICAgIHQzPWZpeHBfYWJzKHQzKTsKLQotCi0gICAgYmMzXzQrPSBGREthYWNFbmNfaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXTsKLQotICAgIGJjN184Kz1GREthYWNFbmNfaHVmZl9sdGFiN184W3QwXVt0MV07Ci0gICAgYmM3XzgrPUZES2FhY0VuY19odWZmX2x0YWI3XzhbdDJdW3QzXTsKLQotICAgIGJjOV8xMCs9RkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXTsKLSAgICBiYzlfMTArPUZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QyXVt0M107Ci0KLSAgICBiYzExKz0gKElOVCkgRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwXVt0MV07Ci0gICAgYmMxMSs9IChJTlQpIEZES2FhY0VuY19odWZmX2x0YWIxMVt0Ml1bdDNdOwotCi0gICAgc2MrPSh0MD4wKSsodDE+MCkrKHQyPjApKyh0Mz4wKTsKKyAgICBiYzNfNCArPSAoSU5UKUZES2FhY0VuY19odWZmX2x0YWIzXzRbdDBdW3QxXVt0Ml1bdDNdOworICAgIGJjN184ICs9IChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0MF1bdDFdICsKKyAgICAgICAgICAgICAoSU5UKUZES2FhY0VuY19odWZmX2x0YWI3XzhbdDJdW3QzXTsKKyAgICBiYzlfMTAgKz0gKElOVClGREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0MF1bdDFdICsKKyAgICAgICAgICAgICAgKElOVClGREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0Ml1bdDNdOworICAgIGJjMTEgKz0KKyAgICAgICAgKElOVClGREthYWNFbmNfaHVmZl9sdGFiMTFbdDBdW3QxXSArIChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QyXVt0M107CiAgIH0KLQotICBiaXRDb3VudFsxXT1ISV9MVEFCKGJjMV8yKTsKLSAgYml0Q291bnRbMl09TE9fTFRBQihiYzFfMik7Ci0gIGJpdENvdW50WzNdPUhJX0xUQUIoYmMzXzQpK3NjOwotICBiaXRDb3VudFs0XT1MT19MVEFCKGJjM180KStzYzsKLSAgYml0Q291bnRbNV09SElfTFRBQihiYzVfNik7Ci0gIGJpdENvdW50WzZdPUxPX0xUQUIoYmM1XzYpOwotICBiaXRDb3VudFs3XT1ISV9MVEFCKGJjN184KStzYzsKLSAgYml0Q291bnRbOF09TE9fTFRBQihiYzdfOCkrc2M7Ci0gIGJpdENvdW50WzldPUhJX0xUQUIoYmM5XzEwKStzYzsKLSAgYml0Q291bnRbMTBdPUxPX0xUQUIoYmM5XzEwKStzYzsKLSAgYml0Q291bnRbMTFdPWJjMTErc2M7Ci0KKyAgYml0Q291bnRbMV0gPSBISV9MVEFCKGJjMV8yKTsKKyAgYml0Q291bnRbMl0gPSBMT19MVEFCKGJjMV8yKTsKKyAgYml0Q291bnRbM10gPSBISV9MVEFCKGJjM180KSArIHNjOworICBiaXRDb3VudFs0XSA9IExPX0xUQUIoYmMzXzQpICsgc2M7CisgIGJpdENvdW50WzVdID0gSElfTFRBQihiYzVfNik7CisgIGJpdENvdW50WzZdID0gTE9fTFRBQihiYzVfNik7CisgIGJpdENvdW50WzddID0gSElfTFRBQihiYzdfOCkgKyBzYzsKKyAgYml0Q291bnRbOF0gPSBMT19MVEFCKGJjN184KSArIHNjOworICBiaXRDb3VudFs5XSA9IEhJX0xUQUIoYmM5XzEwKSArIHNjOworICBiaXRDb3VudFsxMF0gPSBMT19MVEFCKGJjOV8xMCkgKyBzYzsKKyAgYml0Q291bnRbMTFdID0gYmMxMSArIHNjOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY291bnQzXzRfNV82XzdfOF85XzEwXzExCkBAIC0xODIsNjYgKzE4NCw2MiBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NvdW50M180XzVfNl83XzhfOV8xMF8xMShjb25zdCBTSE9SVCAqUkVTVFJJQ1QgdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICpiaXRDb3VudCkKLXsKLQorc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NvdW50M180XzVfNl83XzhfOV8xMF8xMShjb25zdCBTSE9SVCAqY29uc3QgdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqUkVTVFJJQ1QgYml0Q291bnQpIHsKICAgSU5UIGk7Ci0gIElOVCBiYzNfNCxiYzVfNixiYzdfOCxiYzlfMTAsYmMxMSxzYzsKLSAgSU5UIHQwLHQxLHQyLHQzOworICBJTlQgYmMzXzQsIGJjNV82LCBiYzdfOCwgYmM5XzEwLCBiYzExLCBzYzsKKyAgSU5UIHQwLCB0MSwgdDIsIHQzOwogCi0gIGJjM180PTA7Ci0gIGJjNV82PTA7Ci0gIGJjN184PTA7Ci0gIGJjOV8xMD0wOwotICBiYzExPTA7Ci0gIHNjPTA7CisgIGJjM180ID0gMDsKKyAgYmM1XzYgPSAwOworICBiYzdfOCA9IDA7CisgIGJjOV8xMCA9IDA7CisgIGJjMTEgPSAwOworICBzYyA9IDA7CiAKLSAgZm9yKGk9MDtpPHdpZHRoO2krPTQpeworICBEV09SRF9BTElHTkVEKHZhbHVlcyk7CiAKLSAgICB0MD0gdmFsdWVzW2krMF07Ci0gICAgdDE9IHZhbHVlc1tpKzFdOwotICAgIHQyPSB2YWx1ZXNbaSsyXTsKLSAgICB0Mz0gdmFsdWVzW2krM107CisgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSArPSA0KSB7CisgICAgdDAgPSB2YWx1ZXNbaSArIDBdOworICAgIHQxID0gdmFsdWVzW2kgKyAxXTsKKyAgICB0MiA9IHZhbHVlc1tpICsgMl07CisgICAgdDMgPSB2YWx1ZXNbaSArIDNdOwogCi0gICAgYmM1XzYrPUZES2FhY0VuY19odWZmX2x0YWI1XzZbdDArNF1bdDErNF07Ci0gICAgYmM1XzYrPUZES2FhY0VuY19odWZmX2x0YWI1XzZbdDIrNF1bdDMrNF07CisgICAgYmM1XzYgKz0gKElOVClGREthYWNFbmNfaHVmZl9sdGFiNV82W3QwICsgNF1bdDEgKyA0XSArCisgICAgICAgICAgICAgKElOVClGREthYWNFbmNfaHVmZl9sdGFiNV82W3QyICsgNF1bdDMgKyA0XTsKIAotICAgIHQwPWZpeHBfYWJzKHQwKTsKLSAgICB0MT1maXhwX2Ficyh0MSk7Ci0gICAgdDI9Zml4cF9hYnModDIpOwotICAgIHQzPWZpeHBfYWJzKHQzKTsKKyAgICB0MCA9IGZpeHBfYWJzKHQwKTsKKyAgICBzYyArPSAodDAgPiAwKTsKKyAgICB0MSA9IGZpeHBfYWJzKHQxKTsKKyAgICBzYyArPSAodDEgPiAwKTsKKyAgICB0MiA9IGZpeHBfYWJzKHQyKTsKKyAgICBzYyArPSAodDIgPiAwKTsKKyAgICB0MyA9IGZpeHBfYWJzKHQzKTsKKyAgICBzYyArPSAodDMgPiAwKTsKIAotICAgIGJjM180Kz0gRkRLYWFjRW5jX2h1ZmZfbHRhYjNfNFt0MF1bdDFdW3QyXVt0M107Ci0KLSAgICBiYzdfOCs9RkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0MF1bdDFdOwotICAgIGJjN184Kz1GREthYWNFbmNfaHVmZl9sdGFiN184W3QyXVt0M107Ci0KLSAgICBiYzlfMTArPUZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QwXVt0MV07Ci0gICAgYmM5XzEwKz1GREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0Ml1bdDNdOwotCi0gICAgYmMxMSs9IChJTlQpIEZES2FhY0VuY19odWZmX2x0YWIxMVt0MF1bdDFdOwotICAgIGJjMTErPSAoSU5UKSBGREthYWNFbmNfaHVmZl9sdGFiMTFbdDJdW3QzXTsKLQotICAgIHNjKz0odDA+MCkrKHQxPjApKyh0Mj4wKSsodDM+MCk7CisgICAgYmMzXzQgKz0gKElOVClGREthYWNFbmNfaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXTsKKyAgICBiYzdfOCArPSAoSU5UKUZES2FhY0VuY19odWZmX2x0YWI3XzhbdDBdW3QxXSArCisgICAgICAgICAgICAgKElOVClGREthYWNFbmNfaHVmZl9sdGFiN184W3QyXVt0M107CisgICAgYmM5XzEwICs9IChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXSArCisgICAgICAgICAgICAgIChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDJdW3QzXTsKKyAgICBiYzExICs9CisgICAgICAgIChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwXVt0MV0gKyAoSU5UKUZES2FhY0VuY19odWZmX2x0YWIxMVt0Ml1bdDNdOwogICB9CiAKLSAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbM109SElfTFRBQihiYzNfNCkrc2M7Ci0gIGJpdENvdW50WzRdPUxPX0xUQUIoYmMzXzQpK3NjOwotICBiaXRDb3VudFs1XT1ISV9MVEFCKGJjNV82KTsKLSAgYml0Q291bnRbNl09TE9fTFRBQihiYzVfNik7Ci0gIGJpdENvdW50WzddPUhJX0xUQUIoYmM3XzgpK3NjOwotICBiaXRDb3VudFs4XT1MT19MVEFCKGJjN184KStzYzsKLSAgYml0Q291bnRbOV09SElfTFRBQihiYzlfMTApK3NjOwotICBiaXRDb3VudFsxMF09TE9fTFRBQihiYzlfMTApK3NjOwotICBiaXRDb3VudFsxMV09YmMxMStzYzsKKyAgYml0Q291bnRbMV0gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFsyXSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzNdID0gSElfTFRBQihiYzNfNCkgKyBzYzsKKyAgYml0Q291bnRbNF0gPSBMT19MVEFCKGJjM180KSArIHNjOworICBiaXRDb3VudFs1XSA9IEhJX0xUQUIoYmM1XzYpOworICBiaXRDb3VudFs2XSA9IExPX0xUQUIoYmM1XzYpOworICBiaXRDb3VudFs3XSA9IEhJX0xUQUIoYmM3XzgpICsgc2M7CisgIGJpdENvdW50WzhdID0gTE9fTFRBQihiYzdfOCkgKyBzYzsKKyAgYml0Q291bnRbOV0gPSBISV9MVEFCKGJjOV8xMCkgKyBzYzsKKyAgYml0Q291bnRbMTBdID0gTE9fTFRBQihiYzlfMTApICsgc2M7CisgIGJpdENvdW50WzExXSA9IGJjMTEgKyBzYzsKIH0KIAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY291bnQ1XzZfN184XzlfMTBfMTEKQEAgLTI1Miw1MiArMjUwLDU4IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19jb3VudDVfNl83XzhfOV8xMF8xMShjb25zdCBTSE9SVCAqUkVTVFJJQ1QgdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAqYml0Q291bnQpCi17Ci0KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jb3VudDVfNl83XzhfOV8xMF8xMShjb25zdCBTSE9SVCAqY29uc3QgdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKlJFU1RSSUNUIGJpdENvdW50KSB7CiAgIElOVCBpOwotICBJTlQgYmM1XzYsYmM3XzgsYmM5XzEwLGJjMTEsc2M7Ci0gIElOVCB0MCx0MTsKLSAgYmM1XzY9MDsKLSAgYmM3Xzg9MDsKLSAgYmM5XzEwPTA7Ci0gIGJjMTE9MDsKLSAgc2M9MDsKKyAgSU5UIGJjNV82LCBiYzdfOCwgYmM5XzEwLCBiYzExLCBzYzsKKyAgSU5UIHQwLCB0MSwgdDIsIHQzOworICBiYzVfNiA9IDA7CisgIGJjN184ID0gMDsKKyAgYmM5XzEwID0gMDsKKyAgYmMxMSA9IDA7CisgIHNjID0gMDsKIAotICBmb3IoaT0wO2k8d2lkdGg7aSs9Mil7CisgIERXT1JEX0FMSUdORUQodmFsdWVzKTsKIAotICAgIHQwID0gdmFsdWVzW2krMF07Ci0gICAgdDEgPSB2YWx1ZXNbaSsxXTsKKyAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDQpIHsKKyAgICB0MCA9IHZhbHVlc1tpICsgMF07CisgICAgdDEgPSB2YWx1ZXNbaSArIDFdOworICAgIHQyID0gdmFsdWVzW2kgKyAyXTsKKyAgICB0MyA9IHZhbHVlc1tpICsgM107CiAKLSAgICBiYzVfNis9RkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XTsKKyAgICBiYzVfNiArPSAoSU5UKUZES2FhY0VuY19odWZmX2x0YWI1XzZbdDAgKyA0XVt0MSArIDRdICsKKyAgICAgICAgICAgICAoSU5UKUZES2FhY0VuY19odWZmX2x0YWI1XzZbdDIgKyA0XVt0MyArIDRdOwogCi0gICAgdDA9Zml4cF9hYnModDApOwotICAgIHQxPWZpeHBfYWJzKHQxKTsKKyAgICB0MCA9IGZpeHBfYWJzKHQwKTsKKyAgICBzYyArPSAodDAgPiAwKTsKKyAgICB0MSA9IGZpeHBfYWJzKHQxKTsKKyAgICBzYyArPSAodDEgPiAwKTsKKyAgICB0MiA9IGZpeHBfYWJzKHQyKTsKKyAgICBzYyArPSAodDIgPiAwKTsKKyAgICB0MyA9IGZpeHBfYWJzKHQzKTsKKyAgICBzYyArPSAodDMgPiAwKTsKIAotICAgIGJjN184Kz1GREthYWNFbmNfaHVmZl9sdGFiN184W3QwXVt0MV07Ci0gICAgYmM5XzEwKz1GREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0MF1bdDFdOwotICAgIGJjMTErPSAoSU5UKSBGREthYWNFbmNfaHVmZl9sdGFiMTFbdDBdW3QxXTsKLQotICAgIHNjKz0odDA+MCkrKHQxPjApOworICAgIGJjN184ICs9IChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0MF1bdDFdICsKKyAgICAgICAgICAgICAoSU5UKUZES2FhY0VuY19odWZmX2x0YWI3XzhbdDJdW3QzXTsKKyAgICBiYzlfMTAgKz0gKElOVClGREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0MF1bdDFdICsKKyAgICAgICAgICAgICAgKElOVClGREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0Ml1bdDNdOworICAgIGJjMTEgKz0KKyAgICAgICAgKElOVClGREthYWNFbmNfaHVmZl9sdGFiMTFbdDBdW3QxXSArIChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QyXVt0M107CiAgIH0KLSAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbM109SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNV09SElfTFRBQihiYzVfNik7Ci0gIGJpdENvdW50WzZdPUxPX0xUQUIoYmM1XzYpOwotICBiaXRDb3VudFs3XT1ISV9MVEFCKGJjN184KStzYzsKLSAgYml0Q291bnRbOF09TE9fTFRBQihiYzdfOCkrc2M7Ci0gIGJpdENvdW50WzldPUhJX0xUQUIoYmM5XzEwKStzYzsKLSAgYml0Q291bnRbMTBdPUxPX0xUQUIoYmM5XzEwKStzYzsKLSAgYml0Q291bnRbMTFdPWJjMTErc2M7Ci0KKyAgYml0Q291bnRbMV0gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFsyXSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzNdID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbNF0gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs1XSA9IEhJX0xUQUIoYmM1XzYpOworICBiaXRDb3VudFs2XSA9IExPX0xUQUIoYmM1XzYpOworICBiaXRDb3VudFs3XSA9IEhJX0xUQUIoYmM3XzgpICsgc2M7CisgIGJpdENvdW50WzhdID0gTE9fTFRBQihiYzdfOCkgKyBzYzsKKyAgYml0Q291bnRbOV0gPSBISV9MVEFCKGJjOV8xMCkgKyBzYzsKKyAgYml0Q291bnRbMTBdID0gTE9fTFRBQihiYzlfMTApICsgc2M7CisgIGJpdENvdW50WzExXSA9IGJjMTEgKyBzYzsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2NvdW50N184XzlfMTBfMTEKQEAgLTMwOCw0MiArMzEyLDU0IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfY291bnQ3XzhfOV8xMF8xMShjb25zdCBTSE9SVCAqUkVTVFJJQ1QgdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgKmJpdENvdW50KQotewotCitzdGF0aWMgdm9pZCBGREthYWNFbmNfY291bnQ3XzhfOV8xMF8xMShjb25zdCBTSE9SVCAqY29uc3QgdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpSRVNUUklDVCBiaXRDb3VudCkgewogICBJTlQgaTsKLSAgSU5UIGJjN184LGJjOV8xMCxiYzExLHNjOwotICBJTlQgdDAsdDE7CisgIElOVCBiYzdfOCwgYmM5XzEwLCBiYzExLCBzYzsKKyAgSU5UIHQwLCB0MSwgdDIsIHQzOwogCi0gIGJjN184PTA7Ci0gIGJjOV8xMD0wOwotICBiYzExPTA7Ci0gIHNjPTA7CisgIGJjN184ID0gMDsKKyAgYmM5XzEwID0gMDsKKyAgYmMxMSA9IDA7CisgIHNjID0gMDsKIAotICBmb3IoaT0wO2k8d2lkdGg7aSs9Mil7Ci0gICAgdDA9Zml4cF9hYnModmFsdWVzW2krMF0pOwotICAgIHQxPWZpeHBfYWJzKHZhbHVlc1tpKzFdKTsKKyAgRFdPUkRfQUxJR05FRCh2YWx1ZXMpOwogCi0gICAgYmM3XzgrPUZES2FhY0VuY19odWZmX2x0YWI3XzhbdDBdW3QxXTsKLSAgICBiYzlfMTArPUZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QwXVt0MV07Ci0gICAgYmMxMSs9IChJTlQpIEZES2FhY0VuY19odWZmX2x0YWIxMVt0MF1bdDFdOwotICAgIHNjKz0odDA+MCkrKHQxPjApOworICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkgKz0gNCkgeworICAgIHQwID0gdmFsdWVzW2kgKyAwXTsKKyAgICB0MSA9IHZhbHVlc1tpICsgMV07CisgICAgdDIgPSB2YWx1ZXNbaSArIDJdOworICAgIHQzID0gdmFsdWVzW2kgKyAzXTsKKworICAgIHQwID0gZml4cF9hYnModDApOworICAgIHNjICs9ICh0MCA+IDApOworICAgIHQxID0gZml4cF9hYnModDEpOworICAgIHNjICs9ICh0MSA+IDApOworICAgIHQyID0gZml4cF9hYnModDIpOworICAgIHNjICs9ICh0MiA+IDApOworICAgIHQzID0gZml4cF9hYnModDMpOworICAgIHNjICs9ICh0MyA+IDApOworCisgICAgYmM3XzggKz0gKElOVClGREthYWNFbmNfaHVmZl9sdGFiN184W3QwXVt0MV0gKworICAgICAgICAgICAgIChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0Ml1bdDNdOworICAgIGJjOV8xMCArPSAoSU5UKUZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QwXVt0MV0gKworICAgICAgICAgICAgICAoSU5UKUZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QyXVt0M107CisgICAgYmMxMSArPQorICAgICAgICAoSU5UKUZES2FhY0VuY19odWZmX2x0YWIxMVt0MF1bdDFdICsgKElOVClGREthYWNFbmNfaHVmZl9sdGFiMTFbdDJdW3QzXTsKICAgfQogCi0gIGJpdENvdW50WzFdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzJdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzNdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzRdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzVdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzZdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzddPUhJX0xUQUIoYmM3XzgpK3NjOwotICBiaXRDb3VudFs4XT1MT19MVEFCKGJjN184KStzYzsKLSAgYml0Q291bnRbOV09SElfTFRBQihiYzlfMTApK3NjOwotICBiaXRDb3VudFsxMF09TE9fTFRBQihiYzlfMTApK3NjOwotICBiaXRDb3VudFsxMV09YmMxMStzYzsKLQorICBiaXRDb3VudFsxXSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzJdID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbM10gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs0XSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzVdID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbNl0gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs3XSA9IEhJX0xUQUIoYmM3XzgpICsgc2M7CisgIGJpdENvdW50WzhdID0gTE9fTFRBQihiYzdfOCkgKyBzYzsKKyAgYml0Q291bnRbOV0gPSBISV9MVEFCKGJjOV8xMCkgKyBzYzsKKyAgYml0Q291bnRbMTBdID0gTE9fTFRBQihiYzlfMTApICsgc2M7CisgIGJpdENvdW50WzExXSA9IGJjMTEgKyBzYzsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zNTYsNDMgKzM3Miw1MCBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCi0KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19jb3VudDlfMTBfMTEoY29uc3QgU0hPUlQgKlJFU1RSSUNUIHZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAqYml0Q291bnQpCi17Ci0KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jb3VudDlfMTBfMTEoY29uc3QgU0hPUlQgKmNvbnN0IHZhbHVlcywgY29uc3QgSU5UIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKlJFU1RSSUNUIGJpdENvdW50KSB7CiAgIElOVCBpOwotICBJTlQgYmM5XzEwLGJjMTEsc2M7Ci0gIElOVCB0MCx0MTsKKyAgSU5UIGJjOV8xMCwgYmMxMSwgc2M7CisgIElOVCB0MCwgdDEsIHQyLCB0MzsKIAotICBiYzlfMTA9MDsKLSAgYmMxMT0wOwotICBzYz0wOworICBiYzlfMTAgPSAwOworICBiYzExID0gMDsKKyAgc2MgPSAwOwogCi0gIGZvcihpPTA7aTx3aWR0aDtpKz0yKXsKLSAgICB0MD1maXhwX2Ficyh2YWx1ZXNbaSswXSk7Ci0gICAgdDE9Zml4cF9hYnModmFsdWVzW2krMV0pOworICBEV09SRF9BTElHTkVEKHZhbHVlcyk7CiAKLSAgICBiYzlfMTArPUZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QwXVt0MV07Ci0gICAgYmMxMSs9IChJTlQpIEZES2FhY0VuY19odWZmX2x0YWIxMVt0MF1bdDFdOworICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkgKz0gNCkgeworICAgIHQwID0gdmFsdWVzW2kgKyAwXTsKKyAgICB0MSA9IHZhbHVlc1tpICsgMV07CisgICAgdDIgPSB2YWx1ZXNbaSArIDJdOworICAgIHQzID0gdmFsdWVzW2kgKyAzXTsKIAotICAgIHNjKz0odDA+MCkrKHQxPjApOworICAgIHQwID0gZml4cF9hYnModDApOworICAgIHNjICs9ICh0MCA+IDApOworICAgIHQxID0gZml4cF9hYnModDEpOworICAgIHNjICs9ICh0MSA+IDApOworICAgIHQyID0gZml4cF9hYnModDIpOworICAgIHNjICs9ICh0MiA+IDApOworICAgIHQzID0gZml4cF9hYnModDMpOworICAgIHNjICs9ICh0MyA+IDApOworCisgICAgYmM5XzEwICs9IChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXSArCisgICAgICAgICAgICAgIChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDJdW3QzXTsKKyAgICBiYzExICs9CisgICAgICAgIChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwXVt0MV0gKyAoSU5UKUZES2FhY0VuY19odWZmX2x0YWIxMVt0Ml1bdDNdOwogICB9CiAKLSAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbM109SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNV09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNl09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbN109SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbOF09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbOV09SElfTFRBQihiYzlfMTApK3NjOwotICBiaXRDb3VudFsxMF09TE9fTFRBQihiYzlfMTApK3NjOwotICBiaXRDb3VudFsxMV09YmMxMStzYzsKLQorICBiaXRDb3VudFsxXSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzJdID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbM10gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs0XSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzVdID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbNl0gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs3XSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzhdID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbOV0gPSBISV9MVEFCKGJjOV8xMCkgKyBzYzsKKyAgYml0Q291bnRbMTBdID0gTE9fTFRBQihiYzlfMTApICsgc2M7CisgIGJpdENvdW50WzExXSA9IGJjMTEgKyBzYzsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00MDUsMzUgKzQyOCw0NyBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NvdW50MTEoY29uc3QgU0hPUlQgKlJFU1RSSUNUIHZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAqYml0Q291bnQpCi17Ci0KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jb3VudDExKGNvbnN0IFNIT1JUICpjb25zdCB2YWx1ZXMsIGNvbnN0IElOVCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqUkVTVFJJQ1QgYml0Q291bnQpIHsKICAgSU5UIGk7Ci0gIElOVCBiYzExLHNjOwotICBJTlQgdDAsdDE7CisgIElOVCBiYzExLCBzYzsKKyAgSU5UIHQwLCB0MSwgdDIsIHQzOwogCi0gIGJjMTE9MDsKLSAgc2M9MDsKLSAgZm9yKGk9MDtpPHdpZHRoO2krPTIpewotICAgIHQwPWZpeHBfYWJzKHZhbHVlc1tpKzBdKTsKLSAgICB0MT1maXhwX2Ficyh2YWx1ZXNbaSsxXSk7Ci0gICAgYmMxMSs9IChJTlQpIEZES2FhY0VuY19odWZmX2x0YWIxMVt0MF1bdDFdOwotICAgIHNjKz0odDA+MCkrKHQxPjApOworICBiYzExID0gMDsKKyAgc2MgPSAwOworCisgIERXT1JEX0FMSUdORUQodmFsdWVzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkgKz0gNCkgeworICAgIHQwID0gdmFsdWVzW2kgKyAwXTsKKyAgICB0MSA9IHZhbHVlc1tpICsgMV07CisgICAgdDIgPSB2YWx1ZXNbaSArIDJdOworICAgIHQzID0gdmFsdWVzW2kgKyAzXTsKKworICAgIHQwID0gZml4cF9hYnModDApOworICAgIHNjICs9ICh0MCA+IDApOworICAgIHQxID0gZml4cF9hYnModDEpOworICAgIHNjICs9ICh0MSA+IDApOworICAgIHQyID0gZml4cF9hYnModDIpOworICAgIHNjICs9ICh0MiA+IDApOworICAgIHQzID0gZml4cF9hYnModDMpOworICAgIHNjICs9ICh0MyA+IDApOworCisgICAgYmMxMSArPQorICAgICAgICAoSU5UKUZES2FhY0VuY19odWZmX2x0YWIxMVt0MF1bdDFdICsgKElOVClGREthYWNFbmNfaHVmZl9sdGFiMTFbdDJdW3QzXTsKICAgfQogCi0gIGJpdENvdW50WzFdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzJdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzNdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzRdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzVdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzZdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzddPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzhdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzldPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzEwXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsxMV09YmMxMStzYzsKKyAgYml0Q291bnRbMV0gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFsyXSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzNdID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbNF0gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs1XSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzZdID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbN10gPSBJTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFs4XSA9IElOVkFMSURfQklUQ09VTlQ7CisgIGJpdENvdW50WzldID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbMTBdID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbMTFdID0gYmMxMSArIHNjOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ0Niw2NzcgKzQ4MSw0NzAgQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIEZES2FhY0VuY19jb3VudEVzYyhjb25zdCBTSE9SVCAqUkVTVFJJQ1QgdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAqUkVTVFJJQ1QgYml0Q291bnQpCi17Ci0KK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jb3VudEVzYyhjb25zdCBTSE9SVCAqY29uc3QgdmFsdWVzLCBjb25zdCBJTlQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpSRVNUUklDVCBiaXRDb3VudCkgewogICBJTlQgaTsKLSAgSU5UIGJjMTEsZWMsc2M7Ci0gIElOVCB0MCx0MSx0MDAsdDAxOworICBJTlQgYmMxMSwgZWMsIHNjOworICBJTlQgdDAsIHQxLCB0MDAsIHQwMTsKIAotICBiYzExPTA7Ci0gIHNjPTA7Ci0gIGVjPTA7Ci0gIGZvcihpPTA7aTx3aWR0aDtpKz0yKXsKLSAgICB0MD1maXhwX2Ficyh2YWx1ZXNbaSswXSk7Ci0gICAgdDE9Zml4cF9hYnModmFsdWVzW2krMV0pOworICBiYzExID0gMDsKKyAgc2MgPSAwOworICBlYyA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSArPSAyKSB7CisgICAgdDAgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDBdKTsKKyAgICB0MSA9IGZpeHBfYWJzKHZhbHVlc1tpICsgMV0pOwogCi0gICAgc2MrPSh0MD4wKSsodDE+MCk7CisgICAgc2MgKz0gKHQwID4gMCkgKyAodDEgPiAwKTsKIAotICAgIHQwMCA9IGZpeE1pbih0MCwxNik7Ci0gICAgdDAxID0gZml4TWluKHQxLDE2KTsKLSAgICBiYzExKz0gKElOVCkgRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwMF1bdDAxXTsKKyAgICB0MDAgPSBmaXhNaW4odDAsIDE2KTsKKyAgICB0MDEgPSBmaXhNaW4odDEsIDE2KTsKKyAgICBiYzExICs9IChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwMF1bdDAxXTsKIAotICAgIGlmKHQwPj0xNil7Ci0gICAgICBlYys9NTsKLSAgICAgIHdoaWxlKCh0MD4+PTEpID49IDE2KQotICAgICAgICBlYys9MjsKKyAgICBpZiAodDAgPj0gMTYpIHsKKyAgICAgIGVjICs9IDU7CisgICAgICB3aGlsZSAoKHQwID4+PSAxKSA+PSAxNikgZWMgKz0gMjsKICAgICB9CiAKLSAgICBpZih0MT49MTYpewotICAgICAgZWMrPTU7Ci0gICAgICB3aGlsZSgodDE+Pj0xKSA+PSAxNikKLSAgICAgICAgZWMrPTI7CisgICAgaWYgKHQxID49IDE2KSB7CisgICAgICBlYyArPSA1OworICAgICAgd2hpbGUgKCh0MSA+Pj0gMSkgPj0gMTYpIGVjICs9IDI7CiAgICAgfQogICB9CiAKLSAgZm9yIChpPTA7IGk8MTE7IGkrKykKLSAgICBiaXRDb3VudFtpXT1JTlZBTElEX0JJVENPVU5UOworICBmb3IgKGkgPSAwOyBpIDwgMTE7IGkrKykgYml0Q291bnRbaV0gPSBJTlZBTElEX0JJVENPVU5UOwogCi0gIGJpdENvdW50WzExXT1iYzExK3NjK2VjOworICBiaXRDb3VudFsxMV0gPSBiYzExICsgc2MgKyBlYzsKIH0KIAordHlwZWRlZiB2b2lkICgqQ09VTlRfRlVOQ1RJT04pKGNvbnN0IFNIT1JUICpjb25zdCB2YWx1ZXMsIGNvbnN0IElOVCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKlJFU1RSSUNUIGJpdENvdW50KTsKIAotdHlwZWRlZiB2b2lkICgqQ09VTlRfRlVOQ1RJT04pKGNvbnN0IFNIT1JUICpSRVNUUklDVCB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgKlJFU1RSSUNUIGJpdENvdW50KTsKK3N0YXRpYyBjb25zdCBDT1VOVF9GVU5DVElPTiBjb3VudEZ1bmNUYWJsZVtDT0RFX0JPT0tfRVNDX0xBViArIDFdID0gewogCi1zdGF0aWMgY29uc3QgQ09VTlRfRlVOQ1RJT04gY291bnRGdW5jVGFibGVbQ09ERV9CT09LX0VTQ19MQVYrMV0gPQotewotCi0gRkRLYWFjRW5jX2NvdW50MV8yXzNfNF81XzZfN184XzlfMTBfMTEsICAvKiAwICAqLwotIEZES2FhY0VuY19jb3VudDFfMl8zXzRfNV82XzdfOF85XzEwXzExLCAgLyogMSAgKi8KLSBGREthYWNFbmNfY291bnQzXzRfNV82XzdfOF85XzEwXzExLCAgICAgIC8qIDIgICovCi0gRkRLYWFjRW5jX2NvdW50NV82XzdfOF85XzEwXzExLCAgICAgICAgICAvKiAzICAqLwotIEZES2FhY0VuY19jb3VudDVfNl83XzhfOV8xMF8xMSwgICAgICAgICAgLyogNCAgKi8KLSBGREthYWNFbmNfY291bnQ3XzhfOV8xMF8xMSwgICAgICAgICAgICAgIC8qIDUgICovCi0gRkRLYWFjRW5jX2NvdW50N184XzlfMTBfMTEsICAgICAgICAgICAgICAvKiA2ICAqLwotIEZES2FhY0VuY19jb3VudDdfOF85XzEwXzExLCAgICAgICAgICAgICAgLyogNyAgKi8KLSBGREthYWNFbmNfY291bnQ5XzEwXzExLCAgICAgICAgICAgICAgICAgIC8qIDggICovCi0gRkRLYWFjRW5jX2NvdW50OV8xMF8xMSwgICAgICAgICAgICAgICAgICAvKiA5ICAqLwotIEZES2FhY0VuY19jb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogMTAgKi8KLSBGREthYWNFbmNfY291bnQ5XzEwXzExLCAgICAgICAgICAgICAgICAgIC8qIDExICovCi0gRkRLYWFjRW5jX2NvdW50OV8xMF8xMSwgICAgICAgICAgICAgICAgICAvKiAxMiAqLwotIEZES2FhY0VuY19jb3VudDExLCAgICAgICAgICAgICAgICAgICAgICAgLyogMTMgKi8KLSBGREthYWNFbmNfY291bnQxMSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDE0ICovCi0gRkRLYWFjRW5jX2NvdW50MTEsICAgICAgICAgICAgICAgICAgICAgICAvKiAxNSAqLwotIEZES2FhY0VuY19jb3VudEVzYyAgICAgICAgICAgICAgICAgICAgICAgLyogMTYgKi8KKyAgICBGREthYWNFbmNfY291bnQxXzJfM180XzVfNl83XzhfOV8xMF8xMSwgLyogMCAgKi8KKyAgICBGREthYWNFbmNfY291bnQxXzJfM180XzVfNl83XzhfOV8xMF8xMSwgLyogMSAgKi8KKyAgICBGREthYWNFbmNfY291bnQzXzRfNV82XzdfOF85XzEwXzExLCAgICAgLyogMiAgKi8KKyAgICBGREthYWNFbmNfY291bnQ1XzZfN184XzlfMTBfMTEsICAgICAgICAgLyogMyAgKi8KKyAgICBGREthYWNFbmNfY291bnQ1XzZfN184XzlfMTBfMTEsICAgICAgICAgLyogNCAgKi8KKyAgICBGREthYWNFbmNfY291bnQ3XzhfOV8xMF8xMSwgICAgICAgICAgICAgLyogNSAgKi8KKyAgICBGREthYWNFbmNfY291bnQ3XzhfOV8xMF8xMSwgICAgICAgICAgICAgLyogNiAgKi8KKyAgICBGREthYWNFbmNfY291bnQ3XzhfOV8xMF8xMSwgICAgICAgICAgICAgLyogNyAgKi8KKyAgICBGREthYWNFbmNfY291bnQ5XzEwXzExLCAgICAgICAgICAgICAgICAgLyogOCAgKi8KKyAgICBGREthYWNFbmNfY291bnQ5XzEwXzExLCAgICAgICAgICAgICAgICAgLyogOSAgKi8KKyAgICBGREthYWNFbmNfY291bnQ5XzEwXzExLCAgICAgICAgICAgICAgICAgLyogMTAgKi8KKyAgICBGREthYWNFbmNfY291bnQ5XzEwXzExLCAgICAgICAgICAgICAgICAgLyogMTEgKi8KKyAgICBGREthYWNFbmNfY291bnQ5XzEwXzExLCAgICAgICAgICAgICAgICAgLyogMTIgKi8KKyAgICBGREthYWNFbmNfY291bnQxMSwgICAgICAgICAgICAgICAgICAgICAgLyogMTMgKi8KKyAgICBGREthYWNFbmNfY291bnQxMSwgICAgICAgICAgICAgICAgICAgICAgLyogMTQgKi8KKyAgICBGREthYWNFbmNfY291bnQxMSwgICAgICAgICAgICAgICAgICAgICAgLyogMTUgKi8KKyAgICBGREthYWNFbmNfY291bnRFc2MgICAgICAgICAgICAgICAgICAgICAgLyogMTYgKi8KIH07CiAKLQotCi1JTlQgICAgRkRLYWFjRW5jX2JpdENvdW50KGNvbnN0IFNIT1JUICp2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBtYXhWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgKmJpdENvdW50KQotewotCitJTlQgRkRLYWFjRW5jX2JpdENvdW50KGNvbnN0IFNIT1JUICpjb25zdCB2YWx1ZXMsIGNvbnN0IElOVCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG1heFZhbCwgSU5UICpjb25zdCBSRVNUUklDVCBiaXRDb3VudCkgewogICAvKgogICAgIGNoZWNrIGlmIHdlIGNhbiB1c2UgY29kZWJvb2sgMAogICAqLwogCi0gIGlmKG1heFZhbCA9PSAwKQotICAgIGJpdENvdW50WzBdID0gMDsKLSAgZWxzZQotICAgIGJpdENvdW50WzBdID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbMF0gPSAobWF4VmFsID09IDApID8gMCA6IElOVkFMSURfQklUQ09VTlQ7CiAKLSAgbWF4VmFsID0gZml4TWluKG1heFZhbCwoSU5UKUNPREVfQk9PS19FU0NfTEFWKTsKLSAgY291bnRGdW5jVGFibGVbbWF4VmFsXSh2YWx1ZXMsd2lkdGgsYml0Q291bnQpOwotICByZXR1cm4oMCk7CisgIGNvdW50RnVuY1RhYmxlW2ZpeE1pbihtYXhWYWwsIChJTlQpQ09ERV9CT09LX0VTQ19MQVYpXSh2YWx1ZXMsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0Q291bnQpOworCisgIHJldHVybiAoMCk7CiB9CiAKLQotCi0KIC8qCiAgIGNvdW50IGRpZmZlcmVuY2UgYmV0d2VlbiBhY3R1YWwgYW5kIHplcm9lZCBsaW5lcwogKi8KLUlOVCBGREthYWNFbmNfY291bnRWYWx1ZXMoU0hPUlQgKlJFU1RSSUNUIHZhbHVlcywgSU5UIHdpZHRoLCBJTlQgY29kZUJvb2spCi17CitJTlQgRkRLYWFjRW5jX2NvdW50VmFsdWVzKFNIT1JUICpSRVNUUklDVCB2YWx1ZXMsIElOVCB3aWR0aCwgSU5UIGNvZGVCb29rKSB7CisgIElOVCBpLCB0MCwgdDEsIHQyLCB0MzsKKyAgSU5UIGJpdENudCA9IDA7CiAKLSAgSU5UIGksdDAsdDEsdDIsdDMsdDAwLHQwMTsKLSAgSU5UIGNvZGVMZW5ndGg7Ci0gIElOVCBzaWduTGVuZ3RoOwotICBJTlQgYml0Q250PTA7CisgIHN3aXRjaCAoY29kZUJvb2spIHsKKyAgICBjYXNlIENPREVfQk9PS19aRVJPX05POgorICAgICAgYnJlYWs7CiAKLSAgc3dpdGNoKGNvZGVCb29rKXsKLSAgY2FzZSBDT0RFX0JPT0tfWkVST19OTzoKLSAgICBicmVhazsKKyAgICBjYXNlIENPREVfQk9PS18xX05POgorICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDQpIHsKKyAgICAgICAgdDAgPSB2YWx1ZXNbaSArIDBdOworICAgICAgICB0MSA9IHZhbHVlc1tpICsgMV07CisgICAgICAgIHQyID0gdmFsdWVzW2kgKyAyXTsKKyAgICAgICAgdDMgPSB2YWx1ZXNbaSArIDNdOworICAgICAgICBiaXRDbnQgKz0KKyAgICAgICAgICAgIEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjFfMlt0MCArIDFdW3QxICsgMV1bdDIgKyAxXVt0MyArIDFdKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgQ09ERV9CT09LXzFfTk86Ci0gICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgewotICAgICAgdDAgICAgICAgICA9IHZhbHVlc1tpKzBdOwotICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdOwotICAgICAgdDIgICAgICAgICA9IHZhbHVlc1tpKzJdOwotICAgICAgdDMgICAgICAgICA9IHZhbHVlc1tpKzNdOwotICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjFfMlt0MCsxXVt0MSsxXVt0MisxXVt0MysxXSk7Ci0gICAgICBiaXRDbnQrPSBjb2RlTGVuZ3RoOwotICAgIH0KLSAgICBicmVhazsKKyAgICBjYXNlIENPREVfQk9PS18yX05POgorICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDQpIHsKKyAgICAgICAgdDAgPSB2YWx1ZXNbaSArIDBdOworICAgICAgICB0MSA9IHZhbHVlc1tpICsgMV07CisgICAgICAgIHQyID0gdmFsdWVzW2kgKyAyXTsKKyAgICAgICAgdDMgPSB2YWx1ZXNbaSArIDNdOworICAgICAgICBiaXRDbnQgKz0KKyAgICAgICAgICAgIExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjFfMlt0MCArIDFdW3QxICsgMV1bdDIgKyAxXVt0MyArIDFdKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgQ09ERV9CT09LXzJfTk86Ci0gICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgewotICAgICAgdDAgICAgICAgICA9IHZhbHVlc1tpKzBdOwotICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdOwotICAgICAgdDIgICAgICAgICA9IHZhbHVlc1tpKzJdOwotICAgICAgdDMgICAgICAgICA9IHZhbHVlc1tpKzNdOwotICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjFfMlt0MCsxXVt0MSsxXVt0MisxXVt0MysxXSk7Ci0gICAgICBiaXRDbnQrPSBjb2RlTGVuZ3RoOwotICAgIH0KLSAgICBicmVhazsKKyAgICBjYXNlIENPREVfQk9PS18zX05POgorICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDQpIHsKKyAgICAgICAgdDAgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDBdKTsKKyAgICAgICAgYml0Q250ICs9ICh0MCA+IDApOworICAgICAgICB0MSA9IGZpeHBfYWJzKHZhbHVlc1tpICsgMV0pOworICAgICAgICBiaXRDbnQgKz0gKHQxID4gMCk7CisgICAgICAgIHQyID0gZml4cF9hYnModmFsdWVzW2kgKyAyXSk7CisgICAgICAgIGJpdENudCArPSAodDIgPiAwKTsKKyAgICAgICAgdDMgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDNdKTsKKyAgICAgICAgYml0Q250ICs9ICh0MyA+IDApOworICAgICAgICBiaXRDbnQgKz0gSElfTFRBQihGREthYWNFbmNfaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXSk7CisgICAgICB9CisgICAgICBicmVhazsKIAotICBjYXNlIENPREVfQk9PS18zX05POgotICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTQpIHsKLSAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0gICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICB0MD1maXhwX2Ficyh0MCk7CisgICAgY2FzZSBDT0RFX0JPT0tfNF9OTzoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSArPSA0KSB7CisgICAgICAgIHQwID0gZml4cF9hYnModmFsdWVzW2kgKyAwXSk7CisgICAgICAgIGJpdENudCArPSAodDAgPiAwKTsKKyAgICAgICAgdDEgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDFdKTsKKyAgICAgICAgYml0Q250ICs9ICh0MSA+IDApOworICAgICAgICB0MiA9IGZpeHBfYWJzKHZhbHVlc1tpICsgMl0pOworICAgICAgICBiaXRDbnQgKz0gKHQyID4gMCk7CisgICAgICAgIHQzID0gZml4cF9hYnModmFsdWVzW2kgKyAzXSk7CisgICAgICAgIGJpdENudCArPSAodDMgPiAwKTsKKyAgICAgICAgYml0Q250ICs9IExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjNfNFt0MF1bdDFdW3QyXVt0M10pOwogICAgICAgfQotICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKLSAgICAgIGlmKHQxICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKLSAgICAgIH0KLSAgICAgIHQyID0gdmFsdWVzW2krMl07Ci0gICAgICBpZih0MiAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICB0Mj1maXhwX2Ficyh0Mik7Ci0gICAgICB9Ci0gICAgICB0MyA9IHZhbHVlc1tpKzNdOwotICAgICAgaWYodDMgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgdDM9Zml4cF9hYnModDMpOwotICAgICAgfQorICAgICAgYnJlYWs7CiAKLSAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWIzXzRbdDBdW3QxXVt0Ml1bdDNdKTsKLSAgICAgIGJpdENudCs9Y29kZUxlbmd0aCtzaWduTGVuZ3RoOwotICAgIH0KLSAgICBicmVhazsKKyAgICBjYXNlIENPREVfQk9PS181X05POgorICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDQpIHsKKyAgICAgICAgdDAgPSB2YWx1ZXNbaSArIDBdOworICAgICAgICB0MSA9IHZhbHVlc1tpICsgMV07CisgICAgICAgIHQyID0gdmFsdWVzW2kgKyAyXTsKKyAgICAgICAgdDMgPSB2YWx1ZXNbaSArIDNdOworICAgICAgICBiaXRDbnQgKz0gSElfTFRBQihGREthYWNFbmNfaHVmZl9sdGFiNV82W3QwICsgNF1bdDEgKyA0XSkgKworICAgICAgICAgICAgICAgICAgSElfTFRBQihGREthYWNFbmNfaHVmZl9sdGFiNV82W3QyICsgNF1bdDMgKyA0XSk7CisgICAgICB9CisgICAgICBicmVhazsKIAotICBjYXNlIENPREVfQk9PS180X05POgotICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTQpIHsKLSAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0gICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICB0MD1maXhwX2Ficyh0MCk7CisgICAgY2FzZSBDT0RFX0JPT0tfNl9OTzoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSArPSA0KSB7CisgICAgICAgIHQwID0gdmFsdWVzW2kgKyAwXTsKKyAgICAgICAgdDEgPSB2YWx1ZXNbaSArIDFdOworICAgICAgICB0MiA9IHZhbHVlc1tpICsgMl07CisgICAgICAgIHQzID0gdmFsdWVzW2kgKyAzXTsKKyAgICAgICAgYml0Q250ICs9IExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MCArIDRdW3QxICsgNF0pICsKKyAgICAgICAgICAgICAgICAgIExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MiArIDRdW3QzICsgNF0pOwogICAgICAgfQotICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKLSAgICAgIGlmKHQxICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKLSAgICAgIH0KLSAgICAgIHQyID0gdmFsdWVzW2krMl07Ci0gICAgICBpZih0MiAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICB0Mj1maXhwX2Ficyh0Mik7Ci0gICAgICB9Ci0gICAgICB0MyA9IHZhbHVlc1tpKzNdOwotICAgICAgaWYodDMgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgdDM9Zml4cF9hYnModDMpOwotICAgICAgfQotICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjNfNFt0MF1bdDFdW3QyXVt0M10pOwotICAgICAgYml0Q250Kz1jb2RlTGVuZ3RoK3NpZ25MZW5ndGg7Ci0gICAgfQotICAgIGJyZWFrOworICAgICAgYnJlYWs7CiAKLSAgY2FzZSBDT0RFX0JPT0tfNV9OTzoKLSAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7Ci0gICAgICB0MCAgICAgICAgID0gdmFsdWVzW2krMF07Ci0gICAgICB0MSAgICAgICAgID0gdmFsdWVzW2krMV07Ci0gICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihGREthYWNFbmNfaHVmZl9sdGFiNV82W3QwKzRdW3QxKzRdKTsKLSAgICAgIGJpdENudCs9Y29kZUxlbmd0aDsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBDT0RFX0JPT0tfNl9OTzoKLSAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7Ci0gICAgICB0MCAgICAgICAgID0gdmFsdWVzW2krMF07Ci0gICAgICB0MSAgICAgICAgID0gdmFsdWVzW2krMV07Ci0gICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiNV82W3QwKzRdW3QxKzRdKTsKLSAgICAgIGJpdENudCs9Y29kZUxlbmd0aDsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBDT0RFX0JPT0tfN19OTzoKLSAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKXsKLSAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0gICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICB0MD1maXhwX2Ficyh0MCk7CisgICAgY2FzZSBDT0RFX0JPT0tfN19OTzoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSArPSA0KSB7CisgICAgICAgIHQwID0gZml4cF9hYnModmFsdWVzW2kgKyAwXSk7CisgICAgICAgIGJpdENudCArPSAodDAgPiAwKTsKKyAgICAgICAgdDEgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDFdKTsKKyAgICAgICAgYml0Q250ICs9ICh0MSA+IDApOworICAgICAgICB0MiA9IGZpeHBfYWJzKHZhbHVlc1tpICsgMl0pOworICAgICAgICBiaXRDbnQgKz0gKHQyID4gMCk7CisgICAgICAgIHQzID0gZml4cF9hYnModmFsdWVzW2kgKyAzXSk7CisgICAgICAgIGJpdENudCArPSAodDMgPiAwKTsKKyAgICAgICAgYml0Q250ICs9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0MF1bdDFdKSArCisgICAgICAgICAgICAgICAgICBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWI3XzhbdDJdW3QzXSk7CiAgICAgICB9CisgICAgICBicmVhazsKIAotICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKLSAgICAgIGlmKHQxICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKKyAgICBjYXNlIENPREVfQk9PS184X05POgorICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDQpIHsKKyAgICAgICAgdDAgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDBdKTsKKyAgICAgICAgYml0Q250ICs9ICh0MCA+IDApOworICAgICAgICB0MSA9IGZpeHBfYWJzKHZhbHVlc1tpICsgMV0pOworICAgICAgICBiaXRDbnQgKz0gKHQxID4gMCk7CisgICAgICAgIHQyID0gZml4cF9hYnModmFsdWVzW2kgKyAyXSk7CisgICAgICAgIGJpdENudCArPSAodDIgPiAwKTsKKyAgICAgICAgdDMgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDNdKTsKKyAgICAgICAgYml0Q250ICs9ICh0MyA+IDApOworICAgICAgICBiaXRDbnQgKz0gTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiN184W3QwXVt0MV0pICsKKyAgICAgICAgICAgICAgICAgIExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0Ml1bdDNdKTsKICAgICAgIH0KLSAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWI3XzhbdDBdW3QxXSk7Ci0gICAgICBiaXRDbnQrPWNvZGVMZW5ndGggK3NpZ25MZW5ndGg7Ci0gICAgfQotICAgIGJyZWFrOworICAgICAgYnJlYWs7CiAKLSAgY2FzZSBDT0RFX0JPT0tfOF9OTzoKLSAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7Ci0gICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICB0MCA9IHZhbHVlc1tpKzBdOwotICAgICAgaWYodDAgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgdDA9Zml4cF9hYnModDApOworICAgIGNhc2UgQ09ERV9CT09LXzlfTk86CisgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkgKz0gNCkgeworICAgICAgICB0MCA9IGZpeHBfYWJzKHZhbHVlc1tpICsgMF0pOworICAgICAgICBiaXRDbnQgKz0gKHQwID4gMCk7CisgICAgICAgIHQxID0gZml4cF9hYnModmFsdWVzW2kgKyAxXSk7CisgICAgICAgIGJpdENudCArPSAodDEgPiAwKTsKKyAgICAgICAgdDIgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDJdKTsKKyAgICAgICAgYml0Q250ICs9ICh0MiA+IDApOworICAgICAgICB0MyA9IGZpeHBfYWJzKHZhbHVlc1tpICsgM10pOworICAgICAgICBiaXRDbnQgKz0gKHQzID4gMCk7CisgICAgICAgIGJpdENudCArPSBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QwXVt0MV0pICsKKyAgICAgICAgICAgICAgICAgIEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDJdW3QzXSk7CiAgICAgICB9CisgICAgICBicmVhazsKIAotICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKLSAgICAgIGlmKHQxICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKKyAgICBjYXNlIENPREVfQk9PS18xMF9OTzoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSArPSA0KSB7CisgICAgICAgIHQwID0gZml4cF9hYnModmFsdWVzW2kgKyAwXSk7CisgICAgICAgIGJpdENudCArPSAodDAgPiAwKTsKKyAgICAgICAgdDEgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDFdKTsKKyAgICAgICAgYml0Q250ICs9ICh0MSA+IDApOworICAgICAgICB0MiA9IGZpeHBfYWJzKHZhbHVlc1tpICsgMl0pOworICAgICAgICBiaXRDbnQgKz0gKHQyID4gMCk7CisgICAgICAgIHQzID0gZml4cF9hYnModmFsdWVzW2kgKyAzXSk7CisgICAgICAgIGJpdENudCArPSAodDMgPiAwKTsKKyAgICAgICAgYml0Q250ICs9IExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXSkgKworICAgICAgICAgICAgICAgICAgTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0Ml1bdDNdKTsKICAgICAgIH0KLSAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWI3XzhbdDBdW3QxXSk7Ci0gICAgICBiaXRDbnQrPWNvZGVMZW5ndGggK3NpZ25MZW5ndGg7Ci0gICAgfQotICAgIGJyZWFrOworICAgICAgYnJlYWs7CiAKLSAgY2FzZSBDT0RFX0JPT0tfOV9OTzoKLSAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7Ci0gICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICB0MCA9IHZhbHVlc1tpKzBdOwotICAgICAgaWYodDAgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgdDA9Zml4cF9hYnModDApOwotICAgICAgfQotICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKLSAgICAgIGlmKHQxICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKLSAgICAgIH0KLSAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWI5XzEwW3QwXVt0MV0pOwotICAgICAgYml0Q250Kz1jb2RlTGVuZ3RoICtzaWduTGVuZ3RoOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIENPREVfQk9PS18xMF9OTzoKLSAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7Ci0gICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICB0MCA9IHZhbHVlc1tpKzBdOwotICAgICAgaWYodDAgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgdDA9Zml4cF9hYnModDApOwotICAgICAgfQotCi0gICAgICB0MSA9IHZhbHVlc1tpKzFdOwotICAgICAgaWYodDEgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgdDE9Zml4cF9hYnModDEpOwotICAgICAgfQotICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7Ci0gICAgICBiaXRDbnQrPWNvZGVMZW5ndGggK3NpZ25MZW5ndGg7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgQ09ERV9CT09LX0VTQ19OTzoKLSAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7Ci0gICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICB0MCA9IHZhbHVlc1tpKzBdOwotICAgICAgaWYodDAgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgdDA9Zml4cF9hYnModDApOwotICAgICAgfQotICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKLSAgICAgIGlmKHQxICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKLSAgICAgIH0KLSAgICAgIHQwMCA9IGZpeE1pbih0MCwxNik7Ci0gICAgICB0MDEgPSBmaXhNaW4odDEsMTYpOwotCi0gICAgICBjb2RlTGVuZ3RoID0gKElOVCkgRkRLYWFjRW5jX2h1ZmZfbHRhYjExW3QwMF1bdDAxXTsKLSAgICAgIGJpdENudCs9Y29kZUxlbmd0aCArc2lnbkxlbmd0aDsKLSAgICAgIGlmKHQwID49MTYpewotICAgICAgICBJTlQgbixwOwotICAgICAgICBuPTA7Ci0gICAgICAgIHA9dDA7Ci0gICAgICAgIHdoaWxlKChwPj49MSkgPj0xNil7Ci0gICAgICAgICAgYml0Q250Kys7Ci0gICAgICAgICAgbisrOworICAgIGNhc2UgQ09ERV9CT09LX0VTQ19OTzoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSArPSAyKSB7CisgICAgICAgIHQwID0gZml4cF9hYnModmFsdWVzW2kgKyAwXSk7CisgICAgICAgIGJpdENudCArPSAodDAgPiAwKTsKKyAgICAgICAgdDEgPSBmaXhwX2Ficyh2YWx1ZXNbaSArIDFdKTsKKyAgICAgICAgYml0Q250ICs9ICh0MSA+IDApOworICAgICAgICBiaXRDbnQgKz0gKElOVClGREthYWNFbmNfaHVmZl9sdGFiMTFbZml4TWluKHQwLCAxNildW2ZpeE1pbih0MSwgMTYpXTsKKyAgICAgICAgaWYgKHQwID49IDE2KSB7CisgICAgICAgICAgYml0Q250ICs9IDU7CisgICAgICAgICAgd2hpbGUgKCh0MCA+Pj0gMSkgPj0gMTYpIGJpdENudCArPSAyOwogICAgICAgICB9Ci0gICAgICAgIGJpdENudCs9KG4rNSk7Ci0gICAgICB9Ci0gICAgICBpZih0MSA+PTE2KXsKLSAgICAgICAgSU5UIG4scDsKLSAgICAgICAgbj0wOwotICAgICAgICBwPXQxOwotICAgICAgICB3aGlsZSgocD4+PTEpID49MTYpewotICAgICAgICAgIGJpdENudCsrOwotICAgICAgICAgIG4rKzsKKyAgICAgICAgaWYgKHQxID49IDE2KSB7CisgICAgICAgICAgYml0Q250ICs9IDU7CisgICAgICAgICAgd2hpbGUgKCh0MSA+Pj0gMSkgPj0gMTYpIGJpdENudCArPSAyOwogICAgICAgICB9Ci0gICAgICAgIGJpdENudCs9KG4rNSk7CiAgICAgICB9Ci0gICAgfQotICAgIGJyZWFrOworICAgICAgYnJlYWs7CiAKLSAgZGVmYXVsdDoKLSAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CiAgIH0KIAotICByZXR1cm4oYml0Q250KTsKKyAgcmV0dXJuIChiaXRDbnQpOwogfQogCitJTlQgRkRLYWFjRW5jX2NvZGVWYWx1ZXMoU0hPUlQgKlJFU1RSSUNUIHZhbHVlcywgSU5UIHdpZHRoLCBJTlQgY29kZUJvb2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSkgeworICBJTlQgaSwgdDAsIHQxLCB0MiwgdDMsIHQwMCwgdDAxOworICBJTlQgY29kZVdvcmQsIGNvZGVMZW5ndGg7CisgIElOVCBzaWduLCBzaWduTGVuZ3RoOwogCisgIERXT1JEX0FMSUdORUQodmFsdWVzKTsKIAotSU5UIEZES2FhY0VuY19jb2RlVmFsdWVzKFNIT1JUICpSRVNUUklDVCB2YWx1ZXMsIElOVCB3aWR0aCwgSU5UIGNvZGVCb29rLCAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSkKLXsKKyAgc3dpdGNoIChjb2RlQm9vaykgeworICAgIGNhc2UgQ09ERV9CT09LX1pFUk9fTk86CisgICAgICBicmVhazsKIAotICBJTlQgaSx0MCx0MSx0Mix0Myx0MDAsdDAxOwotICBJTlQgY29kZVdvcmQsY29kZUxlbmd0aDsKLSAgSU5UIHNpZ24sc2lnbkxlbmd0aDsKKyAgICBjYXNlIENPREVfQk9PS18xX05POgorICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDQpIHsKKyAgICAgICAgdDAgPSB2YWx1ZXNbaSArIDBdICsgMTsKKyAgICAgICAgdDEgPSB2YWx1ZXNbaSArIDFdICsgMTsKKyAgICAgICAgdDIgPSB2YWx1ZXNbaSArIDJdICsgMTsKKyAgICAgICAgdDMgPSB2YWx1ZXNbaSArIDNdICsgMTsKKyAgICAgICAgY29kZVdvcmQgPSBGREthYWNFbmNfaHVmZl9jdGFiMVt0MF1bdDFdW3QyXVt0M107CisgICAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWIxXzJbdDBdW3QxXVt0Ml1bdDNdKTsKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sIGNvZGVXb3JkLCBjb2RlTGVuZ3RoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogCi0gIHN3aXRjaChjb2RlQm9vayl7Ci0gIGNhc2UgQ09ERV9CT09LX1pFUk9fTk86Ci0gICAgYnJlYWs7CisgICAgY2FzZSBDT0RFX0JPT0tfMl9OTzoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSArPSA0KSB7CisgICAgICAgIHQwID0gdmFsdWVzW2kgKyAwXSArIDE7CisgICAgICAgIHQxID0gdmFsdWVzW2kgKyAxXSArIDE7CisgICAgICAgIHQyID0gdmFsdWVzW2kgKyAyXSArIDE7CisgICAgICAgIHQzID0gdmFsdWVzW2kgKyAzXSArIDE7CisgICAgICAgIGNvZGVXb3JkID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjJbdDBdW3QxXVt0Ml1bdDNdOworICAgICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiMV8yW3QwXVt0MV1bdDJdW3QzXSk7CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLCBjb2RlV29yZCwgY29kZUxlbmd0aCk7CisgICAgICB9CisgICAgICBicmVhazsKIAotICBjYXNlIENPREVfQk9PS18xX05POgotICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTQpIHsKLSAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXSsxOwotICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdKzE7Ci0gICAgICB0MiAgICAgICAgID0gdmFsdWVzW2krMl0rMTsKLSAgICAgIHQzICAgICAgICAgPSB2YWx1ZXNbaSszXSsxOwotICAgICAgY29kZVdvcmQgICA9IEZES2FhY0VuY19odWZmX2N0YWIxW3QwXVt0MV1bdDJdW3QzXTsKLSAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWIxXzJbdDBdW3QxXVt0Ml1bdDNdKTsKLSAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgIH0KLSAgICBicmVhazsKKyAgICBjYXNlIENPREVfQk9PS18zX05POgorICAgICAgZm9yIChpID0gMDsgaSA8ICh3aWR0aCA+PiAyKTsgaSsrKSB7CisgICAgICAgIHNpZ24gPSAwOworICAgICAgICBzaWduTGVuZ3RoID0gMDsKKyAgICAgICAgaW50IGluZGV4WzRdOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgIGludCB0aSA9ICp2YWx1ZXMrKzsKKyAgICAgICAgICBpbnQgemVybyA9ICh0aSA9PSAwKSA/IDAgOiAxOworICAgICAgICAgIHNpZ25MZW5ndGggKz0gemVybzsKKyAgICAgICAgICBzaWduID0gKHNpZ24gPDwgemVybykgKyAoKFVJTlQpdGkgPj4gMzEpOworICAgICAgICAgIGluZGV4W2pdID0gZml4cF9hYnModGkpOworICAgICAgICB9CisgICAgICAgIGNvZGVXb3JkID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjNbaW5kZXhbMF1dW2luZGV4WzFdXVtpbmRleFsyXV1baW5kZXhbM11dOworICAgICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQigKKyAgICAgICAgICAgIEZES2FhY0VuY19odWZmX2x0YWIzXzRbaW5kZXhbMF1dW2luZGV4WzFdXVtpbmRleFsyXV1baW5kZXhbM11dKTsKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sIChjb2RlV29yZCA8PCBzaWduTGVuZ3RoKSB8IHNpZ24sCisgICAgICAgICAgICAgICAgICAgICBjb2RlTGVuZ3RoICsgc2lnbkxlbmd0aCk7CisgICAgICB9CisgICAgICBicmVhazsKIAotICBjYXNlIENPREVfQk9PS18yX05POgotICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTQpIHsKLSAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXSsxOwotICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdKzE7Ci0gICAgICB0MiAgICAgICAgID0gdmFsdWVzW2krMl0rMTsKLSAgICAgIHQzICAgICAgICAgPSB2YWx1ZXNbaSszXSsxOwotICAgICAgY29kZVdvcmQgICA9IEZES2FhY0VuY19odWZmX2N0YWIyW3QwXVt0MV1bdDJdW3QzXTsKLSAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWIxXzJbdDBdW3QxXVt0Ml1bdDNdKTsKLSAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgIH0KLSAgICBicmVhazsKKyAgICBjYXNlIENPREVfQk9PS180X05POgorICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDQpIHsKKyAgICAgICAgc2lnbiA9IDA7CisgICAgICAgIHNpZ25MZW5ndGggPSAwOworICAgICAgICBpbnQgaW5kZXhbNF07CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgICAgaW50IHRpID0gKnZhbHVlcysrOworICAgICAgICAgIGludCB6ZXJvID0gKHRpID09IDApID8gMCA6IDE7CisgICAgICAgICAgc2lnbkxlbmd0aCArPSB6ZXJvOworICAgICAgICAgIHNpZ24gPSAoc2lnbiA8PCB6ZXJvKSArICgoVUlOVCl0aSA+PiAzMSk7CisgICAgICAgICAgaW5kZXhbal0gPSBmaXhwX2Ficyh0aSk7CisgICAgICAgIH0KKyAgICAgICAgY29kZVdvcmQgPSBGREthYWNFbmNfaHVmZl9jdGFiNFtpbmRleFswXV1baW5kZXhbMV1dW2luZGV4WzJdXVtpbmRleFszXV07CisgICAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKAorICAgICAgICAgICAgRkRLYWFjRW5jX2h1ZmZfbHRhYjNfNFtpbmRleFswXV1baW5kZXhbMV1dW2luZGV4WzJdXVtpbmRleFszXV0pOworICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwgKGNvZGVXb3JkIDw8IHNpZ25MZW5ndGgpIHwgc2lnbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvZGVMZW5ndGggKyBzaWduTGVuZ3RoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgQ09ERV9CT09LXzNfTk86Ci0gICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgewotICAgICAgc2lnbj0wOwotICAgICAgc2lnbkxlbmd0aD0wOwotICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLSAgICAgIGlmKHQwICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHNpZ248PD0xOwotICAgICAgICBpZih0MCA8IDApewotICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgdDA9Zml4cF9hYnModDApOworICAgIGNhc2UgQ09ERV9CT09LXzVfTk86CisgICAgICBmb3IgKGkgPSAwOyBpIDwgKHdpZHRoID4+IDIpOyBpKyspIHsKKyAgICAgICAgdDAgPSAqdmFsdWVzKysgKyA0OworICAgICAgICB0MSA9ICp2YWx1ZXMrKyArIDQ7CisgICAgICAgIHQyID0gKnZhbHVlcysrICsgNDsKKyAgICAgICAgdDMgPSAqdmFsdWVzKysgKyA0OworICAgICAgICBjb2RlV29yZCA9IEZES2FhY0VuY19odWZmX2N0YWI1W3QwXVt0MV07CisgICAgICAgIGNvZGVMZW5ndGggPQorICAgICAgICAgICAgSElfTFRBQihGREthYWNFbmNfaHVmZl9sdGFiNV82W3QyXVt0M10pOyAvKiBsZW5ndGggb2YgMm5kIGN3ICovCisgICAgICAgIGNvZGVXb3JkID0gKGNvZGVXb3JkIDw8IGNvZGVMZW5ndGgpICsgRkRLYWFjRW5jX2h1ZmZfY3RhYjVbdDJdW3QzXTsKKyAgICAgICAgY29kZUxlbmd0aCArPSBISV9MVEFCKEZES2FhY0VuY19odWZmX2x0YWI1XzZbdDBdW3QxXSk7CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLCBjb2RlV29yZCwgY29kZUxlbmd0aCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQ09ERV9CT09LXzZfTk86CisgICAgICBmb3IgKGkgPSAwOyBpIDwgKHdpZHRoID4+IDIpOyBpKyspIHsKKyAgICAgICAgdDAgPSAqdmFsdWVzKysgKyA0OworICAgICAgICB0MSA9ICp2YWx1ZXMrKyArIDQ7CisgICAgICAgIHQyID0gKnZhbHVlcysrICsgNDsKKyAgICAgICAgdDMgPSAqdmFsdWVzKysgKyA0OworICAgICAgICBjb2RlV29yZCA9IEZES2FhY0VuY19odWZmX2N0YWI2W3QwXVt0MV07CisgICAgICAgIGNvZGVMZW5ndGggPQorICAgICAgICAgICAgTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiNV82W3QyXVt0M10pOyAvKiBsZW5ndGggb2YgMm5kIGN3ICovCisgICAgICAgIGNvZGVXb3JkID0gKGNvZGVXb3JkIDw8IGNvZGVMZW5ndGgpICsgRkRLYWFjRW5jX2h1ZmZfY3RhYjZbdDJdW3QzXTsKKyAgICAgICAgY29kZUxlbmd0aCArPSBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWI1XzZbdDBdW3QxXSk7CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLCBjb2RlV29yZCwgY29kZUxlbmd0aCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQ09ERV9CT09LXzdfTk86CisgICAgICBmb3IgKGkgPSAwOyBpIDwgKHdpZHRoID4+IDEpOyBpKyspIHsKKyAgICAgICAgdDAgPSAqdmFsdWVzKys7CisgICAgICAgIHNpZ24gPSAoKFVJTlQpdDAgPj4gMzEpOworICAgICAgICB0MCA9IGZpeHBfYWJzKHQwKTsKKyAgICAgICAgc2lnbkxlbmd0aCA9ICh0MCA9PSAwKSA/IDAgOiAxOworICAgICAgICB0MSA9ICp2YWx1ZXMrKzsKKyAgICAgICAgSU5UIHplcm8gPSAodDEgPT0gMCkgPyAwIDogMTsKKyAgICAgICAgc2lnbkxlbmd0aCArPSB6ZXJvOworICAgICAgICBzaWduID0gKHNpZ24gPDwgemVybykgKyAoKFVJTlQpdDEgPj4gMzEpOworICAgICAgICB0MSA9IGZpeHBfYWJzKHQxKTsKKyAgICAgICAgY29kZVdvcmQgPSBGREthYWNFbmNfaHVmZl9jdGFiN1t0MF1bdDFdOworICAgICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihGREthYWNFbmNfaHVmZl9sdGFiN184W3QwXVt0MV0pOworICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwgKGNvZGVXb3JkIDw8IHNpZ25MZW5ndGgpIHwgc2lnbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvZGVMZW5ndGggKyBzaWduTGVuZ3RoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDT0RFX0JPT0tfOF9OTzoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAod2lkdGggPj4gMSk7IGkrKykgeworICAgICAgICB0MCA9ICp2YWx1ZXMrKzsKKyAgICAgICAgc2lnbiA9ICgoVUlOVCl0MCA+PiAzMSk7CisgICAgICAgIHQwID0gZml4cF9hYnModDApOworICAgICAgICBzaWduTGVuZ3RoID0gKHQwID09IDApID8gMCA6IDE7CisgICAgICAgIHQxID0gKnZhbHVlcysrOworICAgICAgICBJTlQgemVybyA9ICh0MSA9PSAwKSA/IDAgOiAxOworICAgICAgICBzaWduTGVuZ3RoICs9IHplcm87CisgICAgICAgIHNpZ24gPSAoc2lnbiA8PCB6ZXJvKSArICgoVUlOVCl0MSA+PiAzMSk7CisgICAgICAgIHQxID0gZml4cF9hYnModDEpOworICAgICAgICBjb2RlV29yZCA9IEZES2FhY0VuY19odWZmX2N0YWI4W3QwXVt0MV07CisgICAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWI3XzhbdDBdW3QxXSk7CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLCAoY29kZVdvcmQgPDwgc2lnbkxlbmd0aCkgfCBzaWduLAorICAgICAgICAgICAgICAgICAgICAgY29kZUxlbmd0aCArIHNpZ25MZW5ndGgpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENPREVfQk9PS185X05POgorICAgICAgZm9yIChpID0gMDsgaSA8ICh3aWR0aCA+PiAxKTsgaSsrKSB7CisgICAgICAgIHQwID0gKnZhbHVlcysrOworICAgICAgICBzaWduID0gKChVSU5UKXQwID4+IDMxKTsKKyAgICAgICAgdDAgPSBmaXhwX2Ficyh0MCk7CisgICAgICAgIHNpZ25MZW5ndGggPSAodDAgPT0gMCkgPyAwIDogMTsKKyAgICAgICAgdDEgPSAqdmFsdWVzKys7CisgICAgICAgIElOVCB6ZXJvID0gKHQxID09IDApID8gMCA6IDE7CisgICAgICAgIHNpZ25MZW5ndGggKz0gemVybzsKKyAgICAgICAgc2lnbiA9IChzaWduIDw8IHplcm8pICsgKChVSU5UKXQxID4+IDMxKTsKKyAgICAgICAgdDEgPSBmaXhwX2Ficyh0MSk7CisgICAgICAgIGNvZGVXb3JkID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjlbdDBdW3QxXTsKKyAgICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLCAoY29kZVdvcmQgPDwgc2lnbkxlbmd0aCkgfCBzaWduLAorICAgICAgICAgICAgICAgICAgICAgY29kZUxlbmd0aCArIHNpZ25MZW5ndGgpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENPREVfQk9PS18xMF9OTzoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAod2lkdGggPj4gMSk7IGkrKykgeworICAgICAgICB0MCA9ICp2YWx1ZXMrKzsKKyAgICAgICAgc2lnbiA9ICgoVUlOVCl0MCA+PiAzMSk7CisgICAgICAgIHQwID0gZml4cF9hYnModDApOworICAgICAgICBzaWduTGVuZ3RoID0gKHQwID09IDApID8gMCA6IDE7CisgICAgICAgIHQxID0gKnZhbHVlcysrOworICAgICAgICBJTlQgemVybyA9ICh0MSA9PSAwKSA/IDAgOiAxOworICAgICAgICBzaWduTGVuZ3RoICs9IHplcm87CisgICAgICAgIHNpZ24gPSAoc2lnbiA8PCB6ZXJvKSArICgoVUlOVCl0MSA+PiAzMSk7CisgICAgICAgIHQxID0gZml4cF9hYnModDEpOworICAgICAgICBjb2RlV29yZCA9IEZES2FhY0VuY19odWZmX2N0YWIxMFt0MF1bdDFdOworICAgICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihGREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sIChjb2RlV29yZCA8PCBzaWduTGVuZ3RoKSB8IHNpZ24sCisgICAgICAgICAgICAgICAgICAgICBjb2RlTGVuZ3RoICsgc2lnbkxlbmd0aCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQ09ERV9CT09LX0VTQ19OTzoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAod2lkdGggPj4gMSk7IGkrKykgeworICAgICAgICB0MCA9ICp2YWx1ZXMrKzsKKyAgICAgICAgc2lnbiA9ICgoVUlOVCl0MCA+PiAzMSk7CisgICAgICAgIHQwID0gZml4cF9hYnModDApOworICAgICAgICBzaWduTGVuZ3RoID0gKHQwID09IDApID8gMCA6IDE7CisgICAgICAgIHQxID0gKnZhbHVlcysrOworICAgICAgICBJTlQgemVybyA9ICh0MSA9PSAwKSA/IDAgOiAxOworICAgICAgICBzaWduTGVuZ3RoICs9IHplcm87CisgICAgICAgIHNpZ24gPSAoc2lnbiA8PCB6ZXJvKSArICgoVUlOVCl0MSA+PiAzMSk7CisgICAgICAgIHQxID0gZml4cF9hYnModDEpOworCisgICAgICAgIHQwMCA9IGZpeE1pbih0MCwgMTYpOworICAgICAgICB0MDEgPSBmaXhNaW4odDEsIDE2KTsKKworICAgICAgICBjb2RlV29yZCA9IEZES2FhY0VuY19odWZmX2N0YWIxMVt0MDBdW3QwMV07CisgICAgICAgIGNvZGVMZW5ndGggPSAoSU5UKUZES2FhY0VuY19odWZmX2x0YWIxMVt0MDBdW3QwMV07CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLCAoY29kZVdvcmQgPDwgc2lnbkxlbmd0aCkgfCBzaWduLAorICAgICAgICAgICAgICAgICAgICAgY29kZUxlbmd0aCArIHNpZ25MZW5ndGgpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICAgIGlmICh0MCA+PSAxNikgeworICAgICAgICAgICAgSU5UIG4gPSA0LCBwID0gdDA7CisgICAgICAgICAgICBmb3IgKDsgKHAgPj49IDEpID49IDE2OykgbisrOworICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgoMSA8PCAobiAtIDMpKSAtIDIpIDw8IG4pIHwgKHQwIC0gKDEgPDwgbikpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG4gKyBuIC0gMyk7CisgICAgICAgICAgfQorICAgICAgICAgIHQwID0gdDE7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIHQxID0gdmFsdWVzW2krMV07Ci0gICAgICBpZih0MSAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICBzaWduPDw9MTsKLSAgICAgICAgaWYodDEgPCAwKXsKLSAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgdDIgPSB2YWx1ZXNbaSsyXTsKLSAgICAgIGlmKHQyICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHNpZ248PD0xOwotICAgICAgICBpZih0MiA8IDApewotICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgdDI9Zml4cF9hYnModDIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB0MyA9IHZhbHVlc1tpKzNdOwotICAgICAgaWYodDMgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgc2lnbjw8PTE7Ci0gICAgICAgIGlmKHQzIDwgMCl7Ci0gICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICB0Mz1maXhwX2Ficyh0Myk7Ci0gICAgICAgIH0KLSAgICAgIH0KKyAgICAgIGJyZWFrOwogCi0gICAgICBjb2RlV29yZCAgID0gRkRLYWFjRW5jX2h1ZmZfY3RhYjNbdDBdW3QxXVt0Ml1bdDNdOwotICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjNfNFt0MF1bdDFdW3QyXVt0M10pOwotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7Ci0gICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIENPREVfQk9PS180X05POgotICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTQpIHsKLSAgICAgIHNpZ249MDsKLSAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0gICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICBzaWduPDw9MTsKLSAgICAgICAgaWYodDAgPCAwKXsKLSAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgIHQwPWZpeHBfYWJzKHQwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKLSAgICAgIGlmKHQxICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHNpZ248PD0xOwotICAgICAgICBpZih0MSA8IDApewotICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgdDE9Zml4cF9hYnModDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB0MiA9IHZhbHVlc1tpKzJdOwotICAgICAgaWYodDIgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgc2lnbjw8PTE7Ci0gICAgICAgIGlmKHQyIDwgMCl7Ci0gICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICB0Mj1maXhwX2Ficyh0Mik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHQzID0gdmFsdWVzW2krM107Ci0gICAgICBpZih0MyAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICBzaWduPDw9MTsKLSAgICAgICAgaWYodDMgPCAwKXsKLSAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgIHQzPWZpeHBfYWJzKHQzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY29kZVdvcmQgICA9IEZES2FhY0VuY19odWZmX2N0YWI0W3QwXVt0MV1bdDJdW3QzXTsKLSAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKEZES2FhY0VuY19odWZmX2x0YWIzXzRbdDBdW3QxXVt0Ml1bdDNdKTsKLSAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBDT0RFX0JPT0tfNV9OTzoKLSAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7Ci0gICAgICB0MCAgICAgICAgID0gdmFsdWVzW2krMF0rNDsKLSAgICAgIHQxICAgICAgICAgPSB2YWx1ZXNbaSsxXSs0OwotICAgICAgY29kZVdvcmQgICA9IEZES2FhY0VuY19odWZmX2N0YWI1W3QwXVt0MV07Ci0gICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihGREthYWNFbmNfaHVmZl9sdGFiNV82W3QwXVt0MV0pOwotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgQ09ERV9CT09LXzZfTk86Ci0gICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgewotICAgICAgdDAgICAgICAgICA9IHZhbHVlc1tpKzBdKzQ7Ci0gICAgICB0MSAgICAgICAgID0gdmFsdWVzW2krMV0rNDsKLSAgICAgIGNvZGVXb3JkICAgPSBGREthYWNFbmNfaHVmZl9jdGFiNlt0MF1bdDFdOwotICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjVfNlt0MF1bdDFdKTsKLSAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIENPREVfQk9PS183X05POgotICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpewotICAgICAgc2lnbj0wOwotICAgICAgc2lnbkxlbmd0aD0wOwotICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLSAgICAgIGlmKHQwICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHNpZ248PD0xOwotICAgICAgICBpZih0MCA8IDApewotICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgdDA9Zml4cF9hYnModDApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHQxID0gdmFsdWVzW2krMV07Ci0gICAgICBpZih0MSAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICBzaWduPDw9MTsKLSAgICAgICAgaWYodDEgPCAwKXsKLSAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY29kZVdvcmQgICA9IEZES2FhY0VuY19odWZmX2N0YWI3W3QwXVt0MV07Ci0gICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihGREthYWNFbmNfaHVmZl9sdGFiN184W3QwXVt0MV0pOwotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7Ci0gICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIENPREVfQk9PS184X05POgotICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKLSAgICAgIHNpZ249MDsKLSAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0gICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICBzaWduPDw9MTsKLSAgICAgICAgaWYodDAgPCAwKXsKLSAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgIHQwPWZpeHBfYWJzKHQwKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICB0MSA9IHZhbHVlc1tpKzFdOwotICAgICAgaWYodDEgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgc2lnbjw8PTE7Ci0gICAgICAgIGlmKHQxIDwgMCl7Ci0gICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICB0MT1maXhwX2Ficyh0MSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNvZGVXb3JkICAgPSBGREthYWNFbmNfaHVmZl9jdGFiOFt0MF1bdDFdOwotICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjdfOFt0MF1bdDFdKTsKLSAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBDT0RFX0JPT0tfOV9OTzoKLSAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7Ci0gICAgICBzaWduPTA7Ci0gICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICB0MCA9IHZhbHVlc1tpKzBdOwotICAgICAgaWYodDAgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgc2lnbjw8PTE7Ci0gICAgICAgIGlmKHQwIDwgMCl7Ci0gICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICB0MD1maXhwX2Ficyh0MCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHQxID0gdmFsdWVzW2krMV07Ci0gICAgICBpZih0MSAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICBzaWduPDw9MTsKLSAgICAgICAgaWYodDEgPCAwKXsKLSAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY29kZVdvcmQgICA9IEZES2FhY0VuY19odWZmX2N0YWI5W3QwXVt0MV07Ci0gICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihGREthYWNFbmNfaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsKLSAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBDT0RFX0JPT0tfMTBfTk86Ci0gICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgewotICAgICAgc2lnbj0wOwotICAgICAgc2lnbkxlbmd0aD0wOwotICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLSAgICAgIGlmKHQwICE9IDApewotICAgICAgICBzaWduTGVuZ3RoKys7Ci0gICAgICAgIHNpZ248PD0xOwotICAgICAgICBpZih0MCA8IDApewotICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgdDA9Zml4cF9hYnModDApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHQxID0gdmFsdWVzW2krMV07Ci0gICAgICBpZih0MSAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICBzaWduPDw9MTsKLSAgICAgICAgaWYodDEgPCAwKXsKLSAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY29kZVdvcmQgICA9IEZES2FhY0VuY19odWZmX2N0YWIxMFt0MF1bdDFdOwotICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoRkRLYWFjRW5jX2h1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7Ci0gICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKLSAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgQ09ERV9CT09LX0VTQ19OTzoKLSAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7Ci0gICAgICBzaWduPTA7Ci0gICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICB0MCA9IHZhbHVlc1tpKzBdOwotICAgICAgaWYodDAgIT0gMCl7Ci0gICAgICAgIHNpZ25MZW5ndGgrKzsKLSAgICAgICAgc2lnbjw8PTE7Ci0gICAgICAgIGlmKHQwIDwgMCl7Ci0gICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICB0MD1maXhwX2Ficyh0MCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHQxID0gdmFsdWVzW2krMV07Ci0gICAgICBpZih0MSAhPSAwKXsKLSAgICAgICAgc2lnbkxlbmd0aCsrOwotICAgICAgICBzaWduPDw9MTsKLSAgICAgICAgaWYodDEgPCAwKXsKLSAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgIHQxPWZpeHBfYWJzKHQxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgdDAwID0gZml4TWluKHQwLDE2KTsKLSAgICAgIHQwMSA9IGZpeE1pbih0MSwxNik7Ci0KLSAgICAgIGNvZGVXb3JkICAgPSBGREthYWNFbmNfaHVmZl9jdGFiMTFbdDAwXVt0MDFdOwotICAgICAgY29kZUxlbmd0aCA9IChJTlQpIEZES2FhY0VuY19odWZmX2x0YWIxMVt0MDBdW3QwMV07Ci0gICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKLSAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7Ci0gICAgICBpZih0MCA+PTE2KXsKLSAgICAgICAgSU5UIG4scDsKLSAgICAgICAgbj0wOwotICAgICAgICBwPXQwOwotICAgICAgICB3aGlsZSgocD4+PTEpID49MTYpewotICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLDEsMSk7Ci0gICAgICAgICAgbisrOwotICAgICAgICB9Ci0gICAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLDAsMSk7Ci0gICAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLHQwLSgxPDwobis0KSksbis0KTsKLSAgICAgIH0KLSAgICAgIGlmKHQxID49MTYpewotICAgICAgICBJTlQgbixwOwotICAgICAgICBuPTA7Ci0gICAgICAgIHA9dDE7Ci0gICAgICAgIHdoaWxlKChwPj49MSkgPj0xNil7Ci0gICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sMSwxKTsKLSAgICAgICAgICBuKys7Ci0gICAgICAgIH0KLSAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sMCwxKTsKLSAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sdDEtKDE8PChuKzQpKSxuKzQpOwotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLQotICBkZWZhdWx0OgotICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKICAgfQotICByZXR1cm4oMCk7CisgIHJldHVybiAoMCk7CiB9CiAKLUlOVCBGREthYWNFbmNfY29kZVNjYWxlZmFjdG9yRGVsdGEoSU5UIGRlbHRhLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKQotewotICBJTlQgY29kZVdvcmQsY29kZUxlbmd0aDsKK0lOVCBGREthYWNFbmNfY29kZVNjYWxlZmFjdG9yRGVsdGEoSU5UIGRlbHRhLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKSB7CisgIElOVCBjb2RlV29yZCwgY29kZUxlbmd0aDsKIAotICBpZihmaXhwX2FicyhkZWx0YSkgPkNPREVfQk9PS19TQ0ZfTEFWKQotICAgIHJldHVybigxKTsKKyAgaWYgKGZpeHBfYWJzKGRlbHRhKSA+IENPREVfQk9PS19TQ0ZfTEFWKSByZXR1cm4gKDEpOwogCi0gIGNvZGVXb3JkICAgPSBGREthYWNFbmNfaHVmZl9jdGFic2NmW2RlbHRhK0NPREVfQk9PS19TQ0ZfTEFWXTsKLSAgY29kZUxlbmd0aCA9IChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYnNjZltkZWx0YStDT0RFX0JPT0tfU0NGX0xBVl07Ci0gIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICByZXR1cm4oMCk7CisgIGNvZGVXb3JkID0gRkRLYWFjRW5jX2h1ZmZfY3RhYnNjZltkZWx0YSArIENPREVfQk9PS19TQ0ZfTEFWXTsKKyAgY29kZUxlbmd0aCA9IChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYnNjZltkZWx0YSArIENPREVfQk9PS19TQ0ZfTEFWXTsKKyAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sIGNvZGVXb3JkLCBjb2RlTGVuZ3RoKTsKKyAgcmV0dXJuICgwKTsKIH0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvYml0X2NudC5oIGIvbGliQUFDZW5jL3NyYy9iaXRfY250LmgKaW5kZXggN2M0YjU5ZS4uN2Y0YzQ1MCAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9iaXRfY250LmgKKysrIGIvbGliQUFDZW5jL3NyYy9iaXRfY250LmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNDYgKzkwLDQ2IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogSHVmZm1hbiBCaXRjb3VudGVyICYgY29kZXIKKyAgIEF1dGhvcihzKTogICBNLldlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogSHVmZm1hbiBCaXRjb3VudGVyICYgY29kZXIKIAotI2lmbmRlZiBfX0JJVENPVU5UX0gKLSNkZWZpbmUgX19CSVRDT1VOVF9ICisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZuZGVmIEJJVF9DTlRfSAorI2RlZmluZSBCSVRfQ05UX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAjaW5jbHVkZSAiYWFjRW5jX3JvbS5oIgogCi0jZGVmaW5lIElOVkFMSURfQklUQ09VTlQgKEZES19JTlRfTUFYLzQpCisjZGVmaW5lIElOVkFMSURfQklUQ09VTlQgKEZES19JTlRfTUFYIC8gNCkKIAogLyoKICAgY29kZSBib29rIG51bWJlciB0YWJsZQogKi8KIAotZW51bSBjb2RlQm9va05vewotIENPREVfQk9PS19aRVJPX05PPSAgICAgICAgICAgICAgIDAsCi0gQ09ERV9CT09LXzFfTk89ICAgICAgICAgICAgICAgICAgMSwKLSBDT0RFX0JPT0tfMl9OTz0gICAgICAgICAgICAgICAgICAyLAotIENPREVfQk9PS18zX05PPSAgICAgICAgICAgICAgICAgIDMsCi0gQ09ERV9CT09LXzRfTk89ICAgICAgICAgICAgICAgICAgNCwKLSBDT0RFX0JPT0tfNV9OTz0gICAgICAgICAgICAgICAgICA1LAotIENPREVfQk9PS182X05PPSAgICAgICAgICAgICAgICAgIDYsCi0gQ09ERV9CT09LXzdfTk89ICAgICAgICAgICAgICAgICAgNywKLSBDT0RFX0JPT0tfOF9OTz0gICAgICAgICAgICAgICAgICA4LAotIENPREVfQk9PS185X05PPSAgICAgICAgICAgICAgICAgIDksCi0gQ09ERV9CT09LXzEwX05PPSAgICAgICAgICAgICAgICAxMCwKLSBDT0RFX0JPT0tfRVNDX05PPSAgICAgICAgICAgICAgIDExLAotIENPREVfQk9PS19SRVNfTk89ICAgICAgICAgICAgICAgMTIsCi0gQ09ERV9CT09LX1BOU19OTz0gICAgICAgICAgICAgICAxMywKLSBDT0RFX0JPT0tfSVNfT1VUX09GX1BIQVNFX05PPSAgIDE0LAotIENPREVfQk9PS19JU19JTl9QSEFTRV9OTz0gICAgICAgMTUKK2VudW0gY29kZUJvb2tObyB7CisgIENPREVfQk9PS19aRVJPX05PID0gMCwKKyAgQ09ERV9CT09LXzFfTk8gPSAxLAorICBDT0RFX0JPT0tfMl9OTyA9IDIsCisgIENPREVfQk9PS18zX05PID0gMywKKyAgQ09ERV9CT09LXzRfTk8gPSA0LAorICBDT0RFX0JPT0tfNV9OTyA9IDUsCisgIENPREVfQk9PS182X05PID0gNiwKKyAgQ09ERV9CT09LXzdfTk8gPSA3LAorICBDT0RFX0JPT0tfOF9OTyA9IDgsCisgIENPREVfQk9PS185X05PID0gOSwKKyAgQ09ERV9CT09LXzEwX05PID0gMTAsCisgIENPREVfQk9PS19FU0NfTk8gPSAxMSwKKyAgQ09ERV9CT09LX1JFU19OTyA9IDEyLAorICBDT0RFX0JPT0tfUE5TX05PID0gMTMsCisgIENPREVfQk9PS19JU19PVVRfT0ZfUEhBU0VfTk8gPSAxNCwKKyAgQ09ERV9CT09LX0lTX0lOX1BIQVNFX05PID0gMTUKIAogfTsKIApAQCAtMTI2LDYyICsxMzcsNjQgQEAKICAgY29kZSBib29rIGluZGV4IHRhYmxlCiAqLwogCi1lbnVtIGNvZGVCb29rTmR4ewotIENPREVfQk9PS19aRVJPX05EWCwKLSBDT0RFX0JPT0tfMV9ORFgsCi0gQ09ERV9CT09LXzJfTkRYLAotIENPREVfQk9PS18zX05EWCwKLSBDT0RFX0JPT0tfNF9ORFgsCi0gQ09ERV9CT09LXzVfTkRYLAotIENPREVfQk9PS182X05EWCwKLSBDT0RFX0JPT0tfN19ORFgsCi0gQ09ERV9CT09LXzhfTkRYLAotIENPREVfQk9PS185X05EWCwKLSBDT0RFX0JPT0tfMTBfTkRYLAotIENPREVfQk9PS19FU0NfTkRYLAotIENPREVfQk9PS19SRVNfTkRYLAotIENPREVfQk9PS19QTlNfTkRYLAotIENPREVfQk9PS19JU19PVVRfT0ZfUEhBU0VfTkRYLAotIENPREVfQk9PS19JU19JTl9QSEFTRV9ORFgsCi0gTlVNQkVSX09GX0NPREVfQk9PS1MKK2VudW0gY29kZUJvb2tOZHggeworICBDT0RFX0JPT0tfWkVST19ORFgsCisgIENPREVfQk9PS18xX05EWCwKKyAgQ09ERV9CT09LXzJfTkRYLAorICBDT0RFX0JPT0tfM19ORFgsCisgIENPREVfQk9PS180X05EWCwKKyAgQ09ERV9CT09LXzVfTkRYLAorICBDT0RFX0JPT0tfNl9ORFgsCisgIENPREVfQk9PS183X05EWCwKKyAgQ09ERV9CT09LXzhfTkRYLAorICBDT0RFX0JPT0tfOV9ORFgsCisgIENPREVfQk9PS18xMF9ORFgsCisgIENPREVfQk9PS19FU0NfTkRYLAorICBDT0RFX0JPT0tfUkVTX05EWCwKKyAgQ09ERV9CT09LX1BOU19ORFgsCisgIENPREVfQk9PS19JU19PVVRfT0ZfUEhBU0VfTkRYLAorICBDT0RFX0JPT0tfSVNfSU5fUEhBU0VfTkRYLAorICBOVU1CRVJfT0ZfQ09ERV9CT09LUwogfTsKIAogLyoKICAgY29kZSBib29rIGxhdiB0YWJsZQogKi8KIAotZW51bSBjb2RlQm9va0xhdnsKLSBDT0RFX0JPT0tfWkVST19MQVY9MCwKLSBDT0RFX0JPT0tfMV9MQVY9MSwKLSBDT0RFX0JPT0tfMl9MQVY9MSwKLSBDT0RFX0JPT0tfM19MQVY9MiwKLSBDT0RFX0JPT0tfNF9MQVY9MiwKLSBDT0RFX0JPT0tfNV9MQVY9NCwKLSBDT0RFX0JPT0tfNl9MQVY9NCwKLSBDT0RFX0JPT0tfN19MQVY9NywKLSBDT0RFX0JPT0tfOF9MQVY9NywKLSBDT0RFX0JPT0tfOV9MQVY9MTIsCi0gQ09ERV9CT09LXzEwX0xBVj0xMiwKLSBDT0RFX0JPT0tfRVNDX0xBVj0xNiwKLSBDT0RFX0JPT0tfU0NGX0xBVj02MCwKLSBDT0RFX0JPT0tfUE5TX0xBVj02MAotIH07CitlbnVtIGNvZGVCb29rTGF2IHsKKyAgQ09ERV9CT09LX1pFUk9fTEFWID0gMCwKKyAgQ09ERV9CT09LXzFfTEFWID0gMSwKKyAgQ09ERV9CT09LXzJfTEFWID0gMSwKKyAgQ09ERV9CT09LXzNfTEFWID0gMiwKKyAgQ09ERV9CT09LXzRfTEFWID0gMiwKKyAgQ09ERV9CT09LXzVfTEFWID0gNCwKKyAgQ09ERV9CT09LXzZfTEFWID0gNCwKKyAgQ09ERV9CT09LXzdfTEFWID0gNywKKyAgQ09ERV9CT09LXzhfTEFWID0gNywKKyAgQ09ERV9CT09LXzlfTEFWID0gMTIsCisgIENPREVfQk9PS18xMF9MQVYgPSAxMiwKKyAgQ09ERV9CT09LX0VTQ19MQVYgPSAxNiwKKyAgQ09ERV9CT09LX1NDRl9MQVYgPSA2MCwKKyAgQ09ERV9CT09LX1BOU19MQVYgPSA2MAorfTsKIAotSU5UICAgIEZES2FhY0VuY19iaXRDb3VudChjb25zdCBTSE9SVCAqYVF1YW50U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG5vT2ZTcGVjTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG1heFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAqYml0Q291bnRMdXQpOworSU5UIEZES2FhY0VuY19iaXRDb3VudChjb25zdCBTSE9SVCAqYVF1YW50U3BlY3RydW0sIGNvbnN0IElOVCBub09mU3BlY0xpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWF4VmFsLCBJTlQgKmJpdENvdW50THV0KTsKIAotSU5UICAgIEZES2FhY0VuY19jb3VudFZhbHVlcyhTSE9SVCAqdmFsdWVzLCBJTlQgd2lkdGgsIElOVCBjb2RlQm9vayk7CitJTlQgRkRLYWFjRW5jX2NvdW50VmFsdWVzKFNIT1JUICp2YWx1ZXMsIElOVCB3aWR0aCwgSU5UIGNvZGVCb29rKTsKIAotSU5UICAgIEZES2FhY0VuY19jb2RlVmFsdWVzKFNIT1JUICp2YWx1ZXMsIElOVCB3aWR0aCwgSU5UIGNvZGVCb29rLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKTsKK0lOVCBGREthYWNFbmNfY29kZVZhbHVlcyhTSE9SVCAqdmFsdWVzLCBJTlQgd2lkdGgsIElOVCBjb2RlQm9vaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKTsKIAotSU5UICAgIEZES2FhY0VuY19jb2RlU2NhbGVmYWN0b3JEZWx0YShJTlQgc2NhbGVmYWN0b3IsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0pOworSU5UIEZES2FhY0VuY19jb2RlU2NhbGVmYWN0b3JEZWx0YShJTlQgc2NhbGVmYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0pOwogCi1pbmxpbmUgSU5UIEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoY29uc3QgSU5UIGRlbHRhKQotewotICBGREtfQVNTRVJUKCAoMCA8PSAoZGVsdGErQ09ERV9CT09LX1NDRl9MQVYpKSAmJiAgKChkZWx0YStDT0RFX0JPT0tfU0NGX0xBVik8KGludCkoc2l6ZW9mKEZES2FhY0VuY19odWZmX2x0YWJzY2YpL3NpemVvZigoRkRLYWFjRW5jX2h1ZmZfbHRhYnNjZlswXSkpKSkgKTsKLSAgcmV0dXJuKChJTlQpRkRLYWFjRW5jX2h1ZmZfbHRhYnNjZltkZWx0YStDT0RFX0JPT0tfU0NGX0xBVl0pOworaW5saW5lIElOVCBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKGNvbnN0IElOVCBkZWx0YSkgeworICBGREtfQVNTRVJUKCgwIDw9IChkZWx0YSArIENPREVfQk9PS19TQ0ZfTEFWKSkgJiYKKyAgICAgICAgICAgICAoKGRlbHRhICsgQ09ERV9CT09LX1NDRl9MQVYpIDwKKyAgICAgICAgICAgICAgKGludCkoc2l6ZW9mKEZES2FhY0VuY19odWZmX2x0YWJzY2YpIC8KKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKChGREthYWNFbmNfaHVmZl9sdGFic2NmWzBdKSkpKSk7CisgIHJldHVybiAoKElOVClGREthYWNFbmNfaHVmZl9sdGFic2NmW2RlbHRhICsgQ09ERV9CT09LX1NDRl9MQVZdKTsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2JpdGVuYy5jcHAgYi9saWJBQUNlbmMvc3JjL2JpdGVuYy5jcHAKaW5kZXggOGU0NzdhYS4uNjUyZDFmZCAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9iaXRlbmMuY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvYml0ZW5jLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFdlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IEJpdHN0cmVhbSBlbmNvZGVyCisgICBBdXRob3Iocyk6ICAgTS4gV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBCaXRzdHJlYW0gZW5jb2RlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiYml0ZW5jLmgiCiAjaW5jbHVkZSAiYml0X2NudC5oIgpAQCAtOTUsMTQgKzEwNywxMyBAQAogI2luY2x1ZGUgImludGVyZmFjZS5oIgogI2luY2x1ZGUgImFhY0VuY19yYW0uaCIKIAotCiAjaW5jbHVkZSAidHBlbmNfbGliLmgiCiAKLSNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiICAvKiBuZWVkZWQgZm9yIHRoZSBiaXRzdHJlYW0gc3ludGF4IHRhYmxlcyAqLworI2luY2x1ZGUgIkZES190b29sc19yb20uaCIgLyogbmVlZGVkIGZvciB0aGUgYml0c3RyZWFtIHN5bnRheCB0YWJsZXMgKi8KIAogc3RhdGljIGNvbnN0IGludCBnbG9iYWxHYWluT2Zmc2V0ID0gMTAwOwotc3RhdGljIGNvbnN0IGludCBpY3NSZXNlcnZlZEJpdCAgID0gMDsKLXN0YXRpYyBjb25zdCBpbnQgbm9pc2VPZmZzZXQgICAgICA9IDkwOworc3RhdGljIGNvbnN0IGludCBpY3NSZXNlcnZlZEJpdCA9IDA7CitzdGF0aWMgY29uc3QgaW50IG5vaXNlT2Zmc2V0ID0gOTA7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCkBAIC0xMTMsMzAgKzEyNCwyNiBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UIEZES2FhY0VuY19lbmNvZGVTcGVjdHJhbERhdGEoSU5UICAgICAgICAgICAgICAgICAgICAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREFUQSAgICAgICAgICAgKnNlY3Rpb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICAgICAgICAgICAgICAgICAgKnF1YW50U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgaEJpdFN0cmVhbSkKLXsKLSAgSU5UIGksc2ZiOworc3RhdGljIElOVCBGREthYWNFbmNfZW5jb2RlU3BlY3RyYWxEYXRhKElOVCAqc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREFUQSAqc2VjdGlvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkgeworICBJTlQgaSwgc2ZiOwogICBJTlQgZGJnVmFsID0gRkRLZ2V0VmFsaWRCaXRzKGhCaXRTdHJlYW0pOwogCi0gIGZvcihpPTA7aTxzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zO2krKykKLSAgewotICAgIGlmKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayAhPSBDT0RFX0JPT0tfUE5TX05PKQotICAgIHsKKyAgZm9yIChpID0gMDsgaSA8IHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7IGkrKykgeworICAgIGlmIChzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uY29kZUJvb2sgIT0gQ09ERV9CT09LX1BOU19OTykgewogICAgICAgLyogaHVmZmVuY29kZSBzcGVjdHJhbCBkYXRhIGZvciB0aGlzIGh1ZmZzZWN0aW9uICovCi0gICAgICBJTlQgdG1wID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYlN0YXJ0K3NlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJDbnQ7Ci0gICAgICBmb3Ioc2ZiPXNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJTdGFydDsgc2ZiPHRtcDsgc2ZiKyspCi0gICAgICB7Ci0gICAgICAgIEZES2FhY0VuY19jb2RlVmFsdWVzKHF1YW50U3BlY3RydW0rc2ZiT2Zmc2V0W3NmYl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldFtzZmIrMV0tc2ZiT2Zmc2V0W3NmYl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSk7CisgICAgICBJTlQgdG1wID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYlN0YXJ0ICsKKyAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiQ250OworICAgICAgZm9yIChzZmIgPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQ7IHNmYiA8IHRtcDsgc2ZiKyspIHsKKyAgICAgICAgRkRLYWFjRW5jX2NvZGVWYWx1ZXMocXVhbnRTcGVjdHJ1bSArIHNmYk9mZnNldFtzZmJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXRbc2ZiICsgMV0gLSBzZmJPZmZzZXRbc2ZiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rLCBoQml0U3RyZWFtKTsKICAgICAgIH0KICAgICB9CiAgIH0KLSAgcmV0dXJuKEZES2dldFZhbGlkQml0cyhoQml0U3RyZWFtKS1kYmdWYWwpOworICByZXR1cm4gKEZES2dldFZhbGlkQml0cyhoQml0U3RyZWFtKSAtIGRiZ1ZhbCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTQ4LDE4ICsxNTUsMTggQEAKICAgICBvdXRwdXQ6CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVCBGREthYWNFbmNfZW5jb2RlR2xvYmFsR2FpbihJTlQgZ2xvYmFsR2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNjYWxlZmFjLAorc3RhdGljIElOVCBGREthYWNFbmNfZW5jb2RlR2xvYmFsR2FpbihJTlQgZ2xvYmFsR2FpbiwgSU5UIHNjYWxlZmFjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWRjdFNjYWxlKQoteworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWRjdFNjYWxlKSB7CiAgIGlmIChoQml0U3RyZWFtICE9IE5VTEwpIHsKLSAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSxnbG9iYWxHYWluIC0gc2NhbGVmYWMgKyBnbG9iYWxHYWluT2Zmc2V0LTQqKExPR19OT1JNX1BDTS1tZGN0U2NhbGUpLDgpOworICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICBnbG9iYWxHYWluIC0gc2NhbGVmYWMgKyBnbG9iYWxHYWluT2Zmc2V0IC0KKyAgICAgICAgICAgICAgICAgICAgIDQgKiAoTE9HX05PUk1fUENNIC0gbWRjdFNjYWxlKSwKKyAgICAgICAgICAgICAgICAgOCk7CiAgIH0KICAgcmV0dXJuICg4KTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTpGREthYWNFbmNfZW5jb2RlSWNzSW5mbwpAQCAtMTcwLDEzICsxNzcsMTAgQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBJTlQgRkRLYWFjRW5jX2VuY29kZUljc0luZm8oSU5UIGJsb2NrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHdpbmRvd1NoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZ3JvdXBpbmdNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHN5bnRheEZsYWdzKQoteworc3RhdGljIElOVCBGREthYWNFbmNfZW5jb2RlSWNzSW5mbyhJTlQgYmxvY2tUeXBlLCBJTlQgd2luZG93U2hhcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBncm91cGluZ01hc2ssIElOVCBtYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzeW50YXhGbGFncykgewogICBJTlQgc3RhdEJpdHM7CiAKICAgaWYgKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpIHsKQEAgLTE4NCwzOCArMTg4LDM4IEBACiAgIH0gZWxzZSB7CiAgICAgaWYgKHN5bnRheEZsYWdzICYgQUNfRUxEKSB7CiAgICAgICBzdGF0Qml0cyA9IDY7Ci0gICAgfSBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICBzdGF0Qml0cyA9ICghKHN5bnRheEZsYWdzICYgQUNfU0NBTEFCTEUpKSA/IDExIDogMTA7CiAgICAgfQogICB9CiAKICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgewotCi0gICAgaWYgKCEoc3ludGF4RmxhZ3MgJiBBQ19FTEQpKXsKLSAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLGljc1Jlc2VydmVkQml0LDEpOwotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sYmxvY2tUeXBlLDIpOwotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sICh3aW5kb3dTaGFwZSA9PSBMT0xfV0lORE9XKSA/IEtCRF9XSU5ET1cgOiB3aW5kb3dTaGFwZSwxKTsKKyAgICBpZiAoIShzeW50YXhGbGFncyAmIEFDX0VMRCkpIHsKKyAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBpY3NSZXNlcnZlZEJpdCwgMSk7CisgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgYmxvY2tUeXBlLCAyKTsKKyAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICh3aW5kb3dTaGFwZSA9PSBMT0xfV0lORE9XKSA/IEtCRF9XSU5ET1cgOiB3aW5kb3dTaGFwZSwgMSk7CiAgICAgfQogCi0gICAgc3dpdGNoKGJsb2NrVHlwZSl7Ci0gICAgY2FzZSBMT05HX1dJTkRPVzoKLSAgICBjYXNlIFNUQVJUX1dJTkRPVzoKLSAgICBjYXNlIFNUT1BfV0lORE9XOgotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sbWF4U2ZiUGVyR3JvdXAsNik7CisgICAgc3dpdGNoIChibG9ja1R5cGUpIHsKKyAgICAgIGNhc2UgTE9OR19XSU5ET1c6CisgICAgICBjYXNlIFNUQVJUX1dJTkRPVzoKKyAgICAgIGNhc2UgU1RPUF9XSU5ET1c6CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBtYXhTZmJQZXJHcm91cCwgNik7CiAKLSAgICAgIGlmICghKHN5bnRheEZsYWdzICYgKEFDX1NDQUxBQkxFfEFDX0VMRCkpICkgeyAvKiBJZiBub3Qgc2NhbGFibGUgc3ludGF4IHRoZW4gLi4uICovCi0gICAgICAgIC8qIE5vIHByZWRpY3RvciBkYXRhIHByZXNlbnQgKi8KLSAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDEpOwotICAgICAgfQotICAgICAgYnJlYWs7CisgICAgICAgIGlmICghKHN5bnRheEZsYWdzICYKKyAgICAgICAgICAgICAgKEFDX1NDQUxBQkxFIHwgQUNfRUxEKSkpIHsgLyogSWYgbm90IHNjYWxhYmxlIHN5bnRheCB0aGVuIC4uLiAqLworICAgICAgICAgIC8qIE5vIHByZWRpY3RvciBkYXRhIHByZXNlbnQgKi8KKyAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIFNIT1JUX1dJTkRPVzoKLSAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLG1heFNmYlBlckdyb3VwLDQpOworICAgICAgY2FzZSBTSE9SVF9XSU5ET1c6CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBtYXhTZmJQZXJHcm91cCwgNCk7CiAKLSAgICAgIC8qIFdyaXRlIGdyb3VwaW5nIGJpdHMgKi8KLSAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLGdyb3VwaW5nTWFzayxUUkFOU19GQUMtMSk7Ci0gICAgICBicmVhazsKKyAgICAgICAgLyogV3JpdGUgZ3JvdXBpbmcgYml0cyAqLworICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZ3JvdXBpbmdNYXNrLCBUUkFOU19GQUMgLSAxKTsKKyAgICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAKQEAgLTIzNCw0OCArMjM4LDQ0IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBJTlQgRkRLYWFjRW5jX2VuY29kZVNlY3Rpb25EYXRhKFNFQ1RJT05fREFUQSAqc2VjdGlvbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCB1c2VWQ0IxMSkKLXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgdXNlVkNCMTEpIHsKICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgewotICAgIElOVCBzZWN0RXNjYXBlVmFsPTAsc2VjdExlbkJpdHM9MDsKKyAgICBJTlQgc2VjdEVzY2FwZVZhbCA9IDAsIHNlY3RMZW5CaXRzID0gMDsKICAgICBJTlQgc2VjdExlbjsKICAgICBJTlQgaTsKLSAgICBJTlQgZGJnVmFsPUZES2dldFZhbGlkQml0cyhoQml0U3RyZWFtKTsKKyAgICBJTlQgZGJnVmFsID0gRkRLZ2V0VmFsaWRCaXRzKGhCaXRTdHJlYW0pOwogICAgIElOVCBzZWN0Q2JCaXRzID0gNDsKIAotICAgIHN3aXRjaChzZWN0aW9uRGF0YS0+YmxvY2tUeXBlKQotICAgIHsKLSAgICBjYXNlIExPTkdfV0lORE9XOgotICAgIGNhc2UgU1RBUlRfV0lORE9XOgotICAgIGNhc2UgU1RPUF9XSU5ET1c6Ci0gICAgICBzZWN0RXNjYXBlVmFsID0gU0VDVF9FU0NfVkFMX0xPTkc7Ci0gICAgICBzZWN0TGVuQml0cyAgID0gU0VDVF9CSVRTX0xPTkc7Ci0gICAgICBicmVhazsKKyAgICBzd2l0Y2ggKHNlY3Rpb25EYXRhLT5ibG9ja1R5cGUpIHsKKyAgICAgIGNhc2UgTE9OR19XSU5ET1c6CisgICAgICBjYXNlIFNUQVJUX1dJTkRPVzoKKyAgICAgIGNhc2UgU1RPUF9XSU5ET1c6CisgICAgICAgIHNlY3RFc2NhcGVWYWwgPSBTRUNUX0VTQ19WQUxfTE9ORzsKKyAgICAgICAgc2VjdExlbkJpdHMgPSBTRUNUX0JJVFNfTE9ORzsKKyAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIFNIT1JUX1dJTkRPVzoKLSAgICAgIHNlY3RFc2NhcGVWYWwgPSBTRUNUX0VTQ19WQUxfU0hPUlQ7Ci0gICAgICBzZWN0TGVuQml0cyAgID0gU0VDVF9CSVRTX1NIT1JUOwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNIT1JUX1dJTkRPVzoKKyAgICAgICAgc2VjdEVzY2FwZVZhbCA9IFNFQ1RfRVNDX1ZBTF9TSE9SVDsKKyAgICAgICAgc2VjdExlbkJpdHMgPSBTRUNUX0JJVFNfU0hPUlQ7CisgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGZvcihpPTA7aTxzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zO2krKykKLSAgICB7CisgICAgZm9yIChpID0gMDsgaSA8IHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7IGkrKykgewogICAgICAgSU5UIGNvZGVCb29rID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rOwogCi0gICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSxjb2RlQm9vayxzZWN0Q2JCaXRzKTsKKyAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBjb2RlQm9vaywgc2VjdENiQml0cyk7CiAKICAgICAgIHsKICAgICAgICAgc2VjdExlbiA9IHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJDbnQ7CiAKLSAgICAgICAgd2hpbGUoc2VjdExlbiA+PSBzZWN0RXNjYXBlVmFsKQotICAgICAgICB7Ci0gICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sc2VjdEVzY2FwZVZhbCxzZWN0TGVuQml0cyk7Ci0gICAgICAgICAgc2VjdExlbi09c2VjdEVzY2FwZVZhbDsKKyAgICAgICAgd2hpbGUgKHNlY3RMZW4gPj0gc2VjdEVzY2FwZVZhbCkgeworICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzZWN0RXNjYXBlVmFsLCBzZWN0TGVuQml0cyk7CisgICAgICAgICAgc2VjdExlbiAtPSBzZWN0RXNjYXBlVmFsOwogICAgICAgICB9Ci0gICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLHNlY3RMZW4sc2VjdExlbkJpdHMpOworICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2VjdExlbiwgc2VjdExlbkJpdHMpOwogICAgICAgfQogICAgIH0KLSAgICByZXR1cm4oRkRLZ2V0VmFsaWRCaXRzKGhCaXRTdHJlYW0pLWRiZ1ZhbCk7CisgICAgcmV0dXJuIChGREtnZXRWYWxpZEJpdHMoaEJpdFN0cmVhbSkgLSBkYmdWYWwpOwogICB9CiAgIHJldHVybiAoMCk7CiB9CkBAIC0yODksMTYgKzI4OSwxNCBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UIEZES2FhY0VuY19lbmNvZGVTY2FsZUZhY3RvckRhdGEoVUlOVCAgICAgICAgICAgICAgICAgICptYXhWYWx1ZUluU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREFUQSAgICAgICAgICAqc2VjdGlvbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICpzY2FsZWZhYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICpSRVNUUklDVCBub2lzZU5yZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgKmlzU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICBnbG9iYWxHYWluKQoteworc3RhdGljIElOVCBGREthYWNFbmNfZW5jb2RlU2NhbGVGYWN0b3JEYXRhKFVJTlQgKm1heFZhbHVlSW5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDVElPTl9EQVRBICpzZWN0aW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNjYWxlZmFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpSRVNUUklDVCBub2lzZU5yZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKmlzU2NhbGUsIElOVCBnbG9iYWxHYWluKSB7CiAgIGlmIChoQml0U3RyZWFtICE9IE5VTEwpIHsKLSAgICBJTlQgaSxqLGxhc3RWYWxTY2YsZGVsdGFTY2Y7CisgICAgSU5UIGksIGosIGxhc3RWYWxTY2YsIGRlbHRhU2NmOwogICAgIElOVCBkZWx0YVBuczsKICAgICBJTlQgbGFzdFZhbFBucyA9IDA7CiAgICAgSU5UIG5vaXNlUENNRmxhZyA9IFRSVUU7CkBAIC0zMDYsNjUgKzMwNCw2NSBAQAogCiAgICAgSU5UIGRiZ1ZhbCA9IEZES2dldFZhbGlkQml0cyhoQml0U3RyZWFtKTsKIAotICAgIGxhc3RWYWxTY2Y9c2NhbGVmYWNbc2VjdGlvbkRhdGEtPmZpcnN0U2NmXTsKLSAgICBsYXN0VmFsUG5zID0gZ2xvYmFsR2Fpbi1zY2FsZWZhY1tzZWN0aW9uRGF0YS0+Zmlyc3RTY2ZdK2dsb2JhbEdhaW5PZmZzZXQtNCpMT0dfTk9STV9QQ00tbm9pc2VPZmZzZXQ7Ci0gICAgbGFzdFZhbElzICA9IDA7CisgICAgbGFzdFZhbFNjZiA9IHNjYWxlZmFjW3NlY3Rpb25EYXRhLT5maXJzdFNjZl07CisgICAgbGFzdFZhbFBucyA9IGdsb2JhbEdhaW4gLSBzY2FsZWZhY1tzZWN0aW9uRGF0YS0+Zmlyc3RTY2ZdICsKKyAgICAgICAgICAgICAgICAgZ2xvYmFsR2Fpbk9mZnNldCAtIDQgKiBMT0dfTk9STV9QQ00gLSBub2lzZU9mZnNldDsKKyAgICBsYXN0VmFsSXMgPSAwOwogCi0gICAgZm9yKGk9MDsgaTxzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zOyBpKyspeworICAgIGZvciAoaSA9IDA7IGkgPCBzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zOyBpKyspIHsKICAgICAgIGlmIChzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uY29kZUJvb2sgIT0gQ09ERV9CT09LX1pFUk9fTk8pIHsKLQotICAgICAgICBpZiAoKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayA9PSBDT0RFX0JPT0tfSVNfT1VUX09GX1BIQVNFX05PKSB8fAotICAgICAgICAgICAgKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayA9PSBDT0RFX0JPT0tfSVNfSU5fUEhBU0VfTk8pKQotICAgICAgICB7CisgICAgICAgIGlmICgoc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rID09CisgICAgICAgICAgICAgQ09ERV9CT09LX0lTX09VVF9PRl9QSEFTRV9OTykgfHwKKyAgICAgICAgICAgIChzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uY29kZUJvb2sgPT0KKyAgICAgICAgICAgICBDT0RFX0JPT0tfSVNfSU5fUEhBU0VfTk8pKSB7CiAgICAgICAgICAgSU5UIHNmYlN0YXJ0ID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYlN0YXJ0OwogICAgICAgICAgIElOVCB0bXAgPSBzZmJTdGFydCArIHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJDbnQ7Ci0gICAgICAgICAgZm9yKGo9c2ZiU3RhcnQ7IGo8dG1wOyBqKyspIHsKLSAgICAgICAgICAgIElOVCBkZWx0YUlzICAgPSBpc1NjYWxlW2pdLWxhc3RWYWxJczsKKyAgICAgICAgICBmb3IgKGogPSBzZmJTdGFydDsgaiA8IHRtcDsgaisrKSB7CisgICAgICAgICAgICBJTlQgZGVsdGFJcyA9IGlzU2NhbGVbal0gLSBsYXN0VmFsSXM7CiAgICAgICAgICAgICBsYXN0VmFsSXMgPSBpc1NjYWxlW2pdOwotICAgICAgICAgICAgaWYoRkRLYWFjRW5jX2NvZGVTY2FsZWZhY3RvckRlbHRhKGRlbHRhSXMsaEJpdFN0cmVhbSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgICAgICBpZiAoRkRLYWFjRW5jX2NvZGVTY2FsZWZhY3RvckRlbHRhKGRlbHRhSXMsIGhCaXRTdHJlYW0pKSB7CisgICAgICAgICAgICAgIHJldHVybiAoMSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfSAvKiBzZmIgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayA9PSBDT0RFX0JPT0tfUE5TX05PKSB7CisgICAgICAgIH0gZWxzZSBpZiAoc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rID09IENPREVfQk9PS19QTlNfTk8pIHsKICAgICAgICAgICBJTlQgc2ZiU3RhcnQgPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQ7CiAgICAgICAgICAgSU5UIHRtcCA9IHNmYlN0YXJ0ICsgc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYkNudDsKLSAgICAgICAgICBmb3Ioaj1zZmJTdGFydDsgajx0bXA7IGorKykgewotICAgICAgICAgICAgZGVsdGFQbnMgICA9IG5vaXNlTnJnW2pdLWxhc3RWYWxQbnM7CisgICAgICAgICAgZm9yIChqID0gc2ZiU3RhcnQ7IGogPCB0bXA7IGorKykgeworICAgICAgICAgICAgZGVsdGFQbnMgPSBub2lzZU5yZ1tqXSAtIGxhc3RWYWxQbnM7CiAgICAgICAgICAgICBsYXN0VmFsUG5zID0gbm9pc2VOcmdbal07CiAKLSAgICAgICAgICAgIGlmKG5vaXNlUENNRmxhZyl7Ci0gICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLGRlbHRhUG5zKygxPDwoUE5TX1BDTV9CSVRTLTEpKSxQTlNfUENNX0JJVFMpOworICAgICAgICAgICAgaWYgKG5vaXNlUENNRmxhZykgeworICAgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZGVsdGFQbnMgKyAoMSA8PCAoUE5TX1BDTV9CSVRTIC0gMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5TX1BDTV9CSVRTKTsKICAgICAgICAgICAgICAgbm9pc2VQQ01GbGFnID0gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgaWYoRkRLYWFjRW5jX2NvZGVTY2FsZWZhY3RvckRlbHRhKGRlbHRhUG5zLGhCaXRTdHJlYW0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKEZES2FhY0VuY19jb2RlU2NhbGVmYWN0b3JEZWx0YShkZWx0YVBucywgaEJpdFN0cmVhbSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKDEpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfSAvKiBzZmIgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBJTlQgdG1wID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYlN0YXJ0K3NlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJDbnQ7Ci0gICAgICAgICAgZm9yKGo9c2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYlN0YXJ0OyBqPHRtcDsgaisrKXsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBJTlQgdG1wID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYlN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYkNudDsKKyAgICAgICAgICBmb3IgKGogPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQ7IGogPCB0bXA7IGorKykgewogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgY2hlY2sgaWYgd2UgY2FuIHJlcGVhdCB0aGUgbGFzdCB2YWx1ZSB0byBzYXZlIGJpdHMKICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZihtYXhWYWx1ZUluU2ZiW2pdID09IDApCisgICAgICAgICAgICBpZiAobWF4VmFsdWVJblNmYltqXSA9PSAwKQogICAgICAgICAgICAgICBkZWx0YVNjZiA9IDA7Ci0gICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICBkZWx0YVNjZiA9IC0oc2NhbGVmYWNbal0tbGFzdFZhbFNjZik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgZGVsdGFTY2YgPSAtKHNjYWxlZmFjW2pdIC0gbGFzdFZhbFNjZik7CiAgICAgICAgICAgICAgIGxhc3RWYWxTY2YgPSBzY2FsZWZhY1tqXTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKEZES2FhY0VuY19jb2RlU2NhbGVmYWN0b3JEZWx0YShkZWx0YVNjZixoQml0U3RyZWFtKSl7Ci0gICAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgICAgIGlmIChGREthYWNFbmNfY29kZVNjYWxlZmFjdG9yRGVsdGEoZGVsdGFTY2YsIGhCaXRTdHJlYW0pKSB7CisgICAgICAgICAgICAgIHJldHVybiAoMSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfSAvKiBzZmIgKi8KLSAgICAgICAgfSAvKiBjb2RlIHNjYWxlZmFjdG9yICovCi0gICAgICB9IC8qIHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayAhPSBDT0RFX0JPT0tfWkVST19OTyAqLwotICAgIH0gLyogc2VjdGlvbiBsb29wICovCisgICAgICAgIH0gICAvKiBjb2RlIHNjYWxlZmFjdG9yICovCisgICAgICB9ICAgICAvKiBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uY29kZUJvb2sgIT0gQ09ERV9CT09LX1pFUk9fTk8gKi8KKyAgICB9ICAgICAgIC8qIHNlY3Rpb24gbG9vcCAqLwogCi0gICAgcmV0dXJuKEZES2dldFZhbGlkQml0cyhoQml0U3RyZWFtKS1kYmdWYWwpOworICAgIHJldHVybiAoRkRLZ2V0VmFsaWRCaXRzKGhCaXRTdHJlYW0pIC0gZGJnVmFsKTsKICAgfSAvKiBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSAqLwogCiAgIHJldHVybiAoMCk7CkBAIC0zNzksNTMgKzM3Nyw0MyBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UIEZES2FhY0VuY19lbmNvZGVNU0luZm8oSU5UICAgICAgICAgICAgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgIGdycFNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICBtYXhTZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgbXNEaWdlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAqanNGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQoteworc3RhdGljIElOVCBGREthYWNFbmNfZW5jb2RlTVNJbmZvKElOVCBzZmJDbnQsIElOVCBncnBTZmIsIElOVCBtYXhTZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG1zRGlnZXN0LCBJTlQgKmpzRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkgewogICBJTlQgc2ZiLCBzZmJPZmYsIG1zQml0cyA9IDA7CiAKLSAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkKLSAgewotICAgIHN3aXRjaChtc0RpZ2VzdCkKLSAgICB7Ci0gICAgY2FzZSBNU19OT05FOgotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sU0lfTVNfTUFTS19OT05FLDIpOwotICAgICAgbXNCaXRzICs9IDI7Ci0gICAgICBicmVhazsKKyAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgeworICAgIHN3aXRjaCAobXNEaWdlc3QpIHsKKyAgICAgIGNhc2UgTVNfTk9ORToKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIFNJX01TX01BU0tfTk9ORSwgMik7CisgICAgICAgIG1zQml0cyArPSAyOworICAgICAgICBicmVhazsKIAotICAgIGNhc2UgTVNfQUxMOgotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sU0lfTVNfTUFTS19BTEwsMik7Ci0gICAgICBtc0JpdHMgKz0gMjsKLSAgICAgIGJyZWFrOworICAgICAgY2FzZSBNU19BTEw6CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBTSV9NU19NQVNLX0FMTCwgMik7CisgICAgICAgIG1zQml0cyArPSAyOworICAgICAgICBicmVhazsKIAotICAgIGNhc2UgTVNfU09NRToKLSAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLFNJX01TX01BU0tfU09NRSwyKTsKLSAgICAgIG1zQml0cyArPSAyOwotICAgICAgZm9yKHNmYk9mZiA9IDA7IHNmYk9mZiA8IHNmYkNudDsgc2ZiT2ZmKz1ncnBTZmIpCi0gICAgICB7Ci0gICAgICAgIGZvcihzZmI9MDsgc2ZiPG1heFNmYjsgc2ZiKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZihqc0ZsYWdzW3NmYk9mZitzZmJdICYgTVNfT04pewotICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sMSwxKTsKKyAgICAgIGNhc2UgTVNfU09NRToKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIFNJX01TX01BU0tfU09NRSwgMik7CisgICAgICAgIG1zQml0cyArPSAyOworICAgICAgICBmb3IgKHNmYk9mZiA9IDA7IHNmYk9mZiA8IHNmYkNudDsgc2ZiT2ZmICs9IGdycFNmYikgeworICAgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgbWF4U2ZiOyBzZmIrKykgeworICAgICAgICAgICAgaWYgKGpzRmxhZ3Nbc2ZiT2ZmICsgc2ZiXSAmIE1TX09OKSB7CisgICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAxLCAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zQml0cyArPSAxOwogICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlewotICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sMCwxKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbXNCaXRzICs9IDE7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOworICAgICAgICBicmVhazsKICAgICB9Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgbXNCaXRzICs9IDI7CiAgICAgaWYgKG1zRGlnZXN0ID09IE1TX1NPTUUpIHsKLSAgICAgIGZvcihzZmJPZmYgPSAwOyBzZmJPZmYgPCBzZmJDbnQ7IHNmYk9mZis9Z3JwU2ZiKSB7Ci0gICAgICAgIGZvcihzZmI9MDsgc2ZiPG1heFNmYjsgc2ZiKyspIHsKKyAgICAgIGZvciAoc2ZiT2ZmID0gMDsgc2ZiT2ZmIDwgc2ZiQ250OyBzZmJPZmYgKz0gZ3JwU2ZiKSB7CisgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgbWF4U2ZiOyBzZmIrKykgewogICAgICAgICAgIG1zQml0cyArPSAxOwogICAgICAgICB9CiAgICAgICB9CkBAIC00NDMsMjYgKzQzMSwyMyBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UIEZES2FhY0VuY19lbmNvZGVUbnNEYXRhUHJlc2VudChUTlNfSU5GTyAqdG5zSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBibG9ja1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQotewotICBpZiAoIChoQml0U3RyZWFtIT1OVUxMKSAmJiAodG5zSW5mbyE9TlVMTCkgKQotICB7CitzdGF0aWMgSU5UIEZES2FhY0VuY19lbmNvZGVUbnNEYXRhUHJlc2VudChUTlNfSU5GTyAqdG5zSW5mbywgSU5UIGJsb2NrVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pIHsKKyAgaWYgKChoQml0U3RyZWFtICE9IE5VTEwpICYmICh0bnNJbmZvICE9IE5VTEwpKSB7CiAgICAgSU5UIGksIHRuc1ByZXNlbnQgPSAwOwotICAgIElOVCBudW1PZldpbmRvd3MgPSAoYmxvY2tUeXBlPT1TSE9SVF9XSU5ET1c/VFJBTlNfRkFDOjEpOworICAgIElOVCBudW1PZldpbmRvd3MgPSAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVyA/IFRSQU5TX0ZBQyA6IDEpOwogCi0gICAgZm9yIChpPTA7IGk8bnVtT2ZXaW5kb3dzOyBpKyspIHsKLSAgICAgIGlmICh0bnNJbmZvLT5udW1PZkZpbHRlcnNbaV0hPTApIHsKLSAgICAgICAgdG5zUHJlc2VudD0xOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1PZldpbmRvd3M7IGkrKykgeworICAgICAgaWYgKHRuc0luZm8tPm51bU9mRmlsdGVyc1tpXSAhPSAwKSB7CisgICAgICAgIHRuc1ByZXNlbnQgPSAxOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAodG5zUHJlc2VudD09MCkgewotICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sMCwxKTsKKyAgICBpZiAodG5zUHJlc2VudCA9PSAwKSB7CisgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgMSk7CiAgICAgfSBlbHNlIHsKLSAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLDEsMSk7CisgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMSwgMSk7CiAgICAgfQogICB9CiAgIHJldHVybiAoMSk7CkBAIC00NzcsMTA2ICs0NjIsMTA4IEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQgRkRLYWFjRW5jX2VuY29kZVRuc0RhdGEoVE5TX0lORk8gKnRuc0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBibG9ja1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCi17CitzdGF0aWMgSU5UIEZES2FhY0VuY19lbmNvZGVUbnNEYXRhKFROU19JTkZPICp0bnNJbmZvLCBJTlQgYmxvY2tUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKSB7CiAgIElOVCB0bnNCaXRzID0gMDsKIAotICBpZiAodG5zSW5mbyE9TlVMTCkgewotCi0gICAgSU5UIGksaixrOworICBpZiAodG5zSW5mbyAhPSBOVUxMKSB7CisgICAgSU5UIGksIGosIGs7CiAgICAgSU5UIHRuc1ByZXNlbnQgPSAwOwogICAgIElOVCBjb2VmQml0czsKLSAgICBJTlQgbnVtT2ZXaW5kb3dzPShibG9ja1R5cGU9PVNIT1JUX1dJTkRPVz9UUkFOU19GQUM6MSk7CisgICAgSU5UIG51bU9mV2luZG93cyA9IChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XID8gVFJBTlNfRkFDIDogMSk7CiAKLSAgICBmb3IgKGk9MDsgaTxudW1PZldpbmRvd3M7IGkrKykgewotICAgICAgaWYgKHRuc0luZm8tPm51bU9mRmlsdGVyc1tpXSE9MCkgewotICAgICAgICB0bnNQcmVzZW50PTE7CisgICAgZm9yIChpID0gMDsgaSA8IG51bU9mV2luZG93czsgaSsrKSB7CisgICAgICBpZiAodG5zSW5mby0+bnVtT2ZGaWx0ZXJzW2ldICE9IDApIHsKKyAgICAgICAgdG5zUHJlc2VudCA9IDE7CiAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAodG5zUHJlc2VudD09MSkgeyAvKiB0aGVyZSBpcyBkYXRhIHRvIGJlIHdyaXR0ZW4qLwotICAgICAgICBmb3IgKGk9MDsgaTxudW1PZldpbmRvd3M7IGkrKykgewotICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLHRuc0luZm8tPm51bU9mRmlsdGVyc1tpXSwoYmxvY2tUeXBlPT1TSE9SVF9XSU5ET1c/MToyKSk7Ci0gICAgICAgICAgdG5zQml0cyArPSAoYmxvY2tUeXBlPT1TSE9SVF9XSU5ET1c/MToyKTsKKyAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICBpZiAodG5zUHJlc2VudCA9PSAxKSB7IC8qIHRoZXJlIGlzIGRhdGEgdG8gYmUgd3JpdHRlbiovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1PZldpbmRvd3M7IGkrKykgeworICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCB0bnNJbmZvLT5udW1PZkZpbHRlcnNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgIChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XID8gMSA6IDIpKTsKKyAgICAgICAgICB0bnNCaXRzICs9IChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XID8gMSA6IDIpOwogICAgICAgICAgIGlmICh0bnNJbmZvLT5udW1PZkZpbHRlcnNbaV0pIHsKLSAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCh0bnNJbmZvLT5jb2VmUmVzW2ldPT00PzE6MCksMSk7CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgKHRuc0luZm8tPmNvZWZSZXNbaV0gPT0gNCA/IDEgOiAwKSwgMSk7CiAgICAgICAgICAgICB0bnNCaXRzICs9IDE7CiAgICAgICAgICAgfQotICAgICAgICAgIGZvciAoaj0wOyBqPHRuc0luZm8tPm51bU9mRmlsdGVyc1tpXTsgaisrKSB7Ci0gICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSx0bnNJbmZvLT5sZW5ndGhbaV1bal0sKGJsb2NrVHlwZT09U0hPUlRfV0lORE9XPzQ6NikpOwotICAgICAgICAgICAgdG5zQml0cyArPSAoYmxvY2tUeXBlPT1TSE9SVF9XSU5ET1c/NDo2KTsKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdG5zSW5mby0+bnVtT2ZGaWx0ZXJzW2ldOyBqKyspIHsKKyAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCB0bnNJbmZvLT5sZW5ndGhbaV1bal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cgPyA0IDogNikpOworICAgICAgICAgICAgdG5zQml0cyArPSAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVyA/IDQgOiA2KTsKICAgICAgICAgICAgIEZES19BU1NFUlQodG5zSW5mby0+b3JkZXJbaV1bal0gPD0gMTIpOwotICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sdG5zSW5mby0+b3JkZXJbaV1bal0sKGJsb2NrVHlwZT09U0hPUlRfV0lORE9XPzM6NSkpOwotICAgICAgICAgICAgdG5zQml0cyArPSAoYmxvY2tUeXBlPT1TSE9SVF9XSU5ET1c/Mzo1KTsKLSAgICAgICAgICAgIGlmICh0bnNJbmZvLT5vcmRlcltpXVtqXSl7Ci0gICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLHRuc0luZm8tPmRpcmVjdGlvbltpXVtqXSwxKTsKLSAgICAgICAgICAgICAgdG5zQml0cyArPTE7IC8qZGlyZWN0aW9uKi8KLSAgICAgICAgICAgICAgaWYodG5zSW5mby0+Y29lZlJlc1tpXSA9PSA0KSB7CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgdG5zSW5mby0+b3JkZXJbaV1bal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cgPyAzIDogNSkpOworICAgICAgICAgICAgdG5zQml0cyArPSAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVyA/IDMgOiA1KTsKKyAgICAgICAgICAgIGlmICh0bnNJbmZvLT5vcmRlcltpXVtqXSkgeworICAgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgdG5zSW5mby0+ZGlyZWN0aW9uW2ldW2pdLCAxKTsKKyAgICAgICAgICAgICAgdG5zQml0cyArPSAxOyAvKmRpcmVjdGlvbiovCisgICAgICAgICAgICAgIGlmICh0bnNJbmZvLT5jb2VmUmVzW2ldID09IDQpIHsKICAgICAgICAgICAgICAgICBjb2VmQml0cyA9IDM7Ci0gICAgICAgICAgICAgICAgZm9yKGs9MDsgazx0bnNJbmZvLT5vcmRlcltpXVtqXTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICBpZiAodG5zSW5mby0+Y29lZltpXVtqXVtrXT4gMyB8fAotICAgICAgICAgICAgICAgICAgICB0bnNJbmZvLT5jb2VmW2ldW2pdW2tdPCAtNCkgeworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCB0bnNJbmZvLT5vcmRlcltpXVtqXTsgaysrKSB7CisgICAgICAgICAgICAgICAgICBpZiAodG5zSW5mby0+Y29lZltpXVtqXVtrXSA+IDMgfHwKKyAgICAgICAgICAgICAgICAgICAgICB0bnNJbmZvLT5jb2VmW2ldW2pdW2tdIDwgLTQpIHsKICAgICAgICAgICAgICAgICAgICAgY29lZkJpdHMgPSA0OwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgY29lZkJpdHMgPSAyOwotICAgICAgICAgICAgICAgIGZvcihrPTA7IGs8dG5zSW5mby0+b3JkZXJbaV1bal07IGsrKykgewotICAgICAgICAgICAgICAgICAgaWYgKCB0bnNJbmZvLT5jb2VmW2ldW2pdW2tdPiAxCi0gICAgICAgICAgICAgICAgICAgIHx8IHRuc0luZm8tPmNvZWZbaV1bal1ba108IC0yKSB7CisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHRuc0luZm8tPm9yZGVyW2ldW2pdOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgIGlmICh0bnNJbmZvLT5jb2VmW2ldW2pdW2tdID4gMSB8fAorICAgICAgICAgICAgICAgICAgICAgIHRuc0luZm8tPmNvZWZbaV1bal1ba10gPCAtMikgewogICAgICAgICAgICAgICAgICAgICBjb2VmQml0cyA9IDM7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwtKGNvZWZCaXRzIC0gdG5zSW5mby0+Y29lZlJlc1tpXSksMSk7IC8qY29lZl9jb21wcmVzKi8KLSAgICAgICAgICAgICAgdG5zQml0cyArPTE7IC8qY29lZl9jb21wcmVzc2lvbiAqLwotICAgICAgICAgICAgICBmb3IgKGs9MDsgazx0bnNJbmZvLT5vcmRlcltpXVtqXTsgaysrICkgewotICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBJTlQgcm1hc2tbXSA9IHswLDEsMyw3LDE1fTsKLSAgICAgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSx0bnNJbmZvLT5jb2VmW2ldW2pdW2tdICYgcm1hc2tbY29lZkJpdHNdLGNvZWZCaXRzKTsKKyAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIC0oY29lZkJpdHMgLSB0bnNJbmZvLT5jb2VmUmVzW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOyAvKmNvZWZfY29tcHJlcyovCisgICAgICAgICAgICAgIHRuc0JpdHMgKz0gMTsgICAgLypjb2VmX2NvbXByZXNzaW9uICovCisgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCB0bnNJbmZvLT5vcmRlcltpXVtqXTsgaysrKSB7CisgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IElOVCBybWFza1tdID0gezAsIDEsIDMsIDcsIDE1fTsKKyAgICAgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zSW5mby0+Y29lZltpXVtqXVtrXSAmIHJtYXNrW2NvZWZCaXRzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZkJpdHMpOwogICAgICAgICAgICAgICAgIHRuc0JpdHMgKz0gY29lZkJpdHM7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIGlmICh0bnNQcmVzZW50ICE9IDApIHsKLSAgICAgICAgZm9yIChpPTA7IGk8bnVtT2ZXaW5kb3dzOyBpKyspIHsKLSAgICAgICAgICB0bnNCaXRzICs9IChibG9ja1R5cGU9PVNIT1JUX1dJTkRPVz8xOjIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtT2ZXaW5kb3dzOyBpKyspIHsKKyAgICAgICAgICB0bnNCaXRzICs9IChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XID8gMSA6IDIpOwogICAgICAgICAgIGlmICh0bnNJbmZvLT5udW1PZkZpbHRlcnNbaV0pIHsKICAgICAgICAgICAgIHRuc0JpdHMgKz0gMTsKLSAgICAgICAgICAgIGZvciAoaj0wOyBqPHRuc0luZm8tPm51bU9mRmlsdGVyc1tpXTsgaisrKSB7Ci0gICAgICAgICAgICAgIHRuc0JpdHMgKz0gKGJsb2NrVHlwZT09U0hPUlRfV0lORE9XPzQ6Nik7Ci0gICAgICAgICAgICAgIHRuc0JpdHMgKz0gKGJsb2NrVHlwZT09U0hPUlRfV0lORE9XPzM6NSk7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdG5zSW5mby0+bnVtT2ZGaWx0ZXJzW2ldOyBqKyspIHsKKyAgICAgICAgICAgICAgdG5zQml0cyArPSAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVyA/IDQgOiA2KTsKKyAgICAgICAgICAgICAgdG5zQml0cyArPSAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVyA/IDMgOiA1KTsKICAgICAgICAgICAgICAgaWYgKHRuc0luZm8tPm9yZGVyW2ldW2pdKSB7Ci0gICAgICAgICAgICAgICAgdG5zQml0cyArPTE7IC8qZGlyZWN0aW9uKi8KLSAgICAgICAgICAgICAgICB0bnNCaXRzICs9MTsgLypjb2VmX2NvbXByZXNzaW9uICovCisgICAgICAgICAgICAgICAgdG5zQml0cyArPSAxOyAvKmRpcmVjdGlvbiovCisgICAgICAgICAgICAgICAgdG5zQml0cyArPSAxOyAvKmNvZWZfY29tcHJlc3Npb24gKi8KICAgICAgICAgICAgICAgICBpZiAodG5zSW5mby0+Y29lZlJlc1tpXSA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgICBjb2VmQml0cz0zOwotICAgICAgICAgICAgICAgICAgZm9yIChrPTA7IGs8dG5zSW5mby0+b3JkZXJbaV1bal07IGsrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAodG5zSW5mby0+Y29lZltpXVtqXVtrXT4gMyB8fCB0bnNJbmZvLT5jb2VmW2ldW2pdW2tdPCAtNCkgeworICAgICAgICAgICAgICAgICAgY29lZkJpdHMgPSAzOworICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHRuc0luZm8tPm9yZGVyW2ldW2pdOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRuc0luZm8tPmNvZWZbaV1bal1ba10gPiAzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICB0bnNJbmZvLT5jb2VmW2ldW2pdW2tdIDwgLTQpIHsKICAgICAgICAgICAgICAgICAgICAgICBjb2VmQml0cyA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgIGNvZWZCaXRzID0gMjsKLSAgICAgICAgICAgICAgICAgIGZvciAoaz0wOyBrPHRuc0luZm8tPm9yZGVyW2ldW2pdOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRuc0luZm8tPmNvZWZbaV1bal1ba10+IDEgfHwgdG5zSW5mby0+Y29lZltpXVtqXVtrXTwgLTIpIHsKKyAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCB0bnNJbmZvLT5vcmRlcltpXVtqXTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bnNJbmZvLT5jb2VmW2ldW2pdW2tdID4gMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgdG5zSW5mby0+Y29lZltpXVtqXVtrXSA8IC0yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgY29lZkJpdHMgPSAzOwogICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoaz0wOyBrPHRuc0luZm8tPm9yZGVyW2ldW2pdOyBrKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgdG5zSW5mby0+b3JkZXJbaV1bal07IGsrKykgewogICAgICAgICAgICAgICAgICAgdG5zQml0cyArPSBjb2VmQml0czsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KQEAgLTU5OSwxMCArNTg2LDkgQEAKICAgICBvdXRwdXQ6CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVCBGREthYWNFbmNfZW5jb2RlR2FpbkNvbnRyb2xEYXRhKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCi17CitzdGF0aWMgSU5UIEZES2FhY0VuY19lbmNvZGVHYWluQ29udHJvbERhdGEoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkgewogICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7Ci0gICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sMCwxKTsKKyAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgMSk7CiAgIH0KICAgcmV0dXJuICgxKTsKIH0KQEAgLTYxNiwxNSArNjAyLDEzIEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQgRkRLYWFjRW5jX2VuY29kZVB1bHNlRGF0YShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQoteworc3RhdGljIElOVCBGREthYWNFbmNfZW5jb2RlUHVsc2VEYXRhKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pIHsKICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgewotICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLDAsMSk7CisgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDEpOwogICB9CiAgIHJldHVybiAoMSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY193cml0ZUV4dGVuc2lvblBheWxvYWQKQEAgLTYzNCwyMSArNjE4LDE4IEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQgRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uUGF5bG9hZCggSEFORExFX0ZES19CSVRTVFJFQU0gIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVF9QQVlMT0FEX1RZUEUgICAgICBleHRQYXlsb2FkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgICAgICAgICAgKmV4dFBheWxvYWREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgZXh0UGF5bG9hZEJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgI2RlZmluZSBFWFRfVFlQRV9CSVRTICAgICAgICAgKCA0ICkKLSAgI2RlZmluZSBEQVRBX0VMX1ZFUlNJT05fQklUUyAgKCA0ICkKLSAgI2RlZmluZSBGSUxMX05JQkJMRV9CSVRTICAgICAgKCA0ICkKK3N0YXRpYyBJTlQgRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uUGF5bG9hZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVF9QQVlMT0FEX1RZUEUgZXh0UGF5bG9hZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKmV4dFBheWxvYWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBleHRQYXlsb2FkQml0cykgeworI2RlZmluZSBFWFRfVFlQRV9CSVRTICg0KQorI2RlZmluZSBEQVRBX0VMX1ZFUlNJT05fQklUUyAoNCkKKyNkZWZpbmUgRklMTF9OSUJCTEVfQklUUyAoNCkKIAotICBJTlQgIGV4dEJpdHNVc2VkID0gMDsKKyAgSU5UIGV4dEJpdHNVc2VkID0gMDsKIAotICBpZiAoZXh0UGF5bG9hZEJpdHMgPj0gRVhUX1RZUEVfQklUUykKLSAgewotICAgIFVDSEFSICBmaWxsQnl0ZSA9IDB4MDA7ICAvKiBmb3IgRVhUX0ZJTCBhbmQgRVhUX0ZJTExfREFUQSAqLworICBpZiAoZXh0UGF5bG9hZEJpdHMgPj0gRVhUX1RZUEVfQklUUykgeworICAgIFVDSEFSIGZpbGxCeXRlID0gMHgwMDsgLyogZm9yIEVYVF9GSUwgYW5kIEVYVF9GSUxMX0RBVEEgKi8KIAogICAgIGlmIChoQml0U3RyZWFtICE9IE5VTEwpIHsKICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBleHRQYXlsb2FkVHlwZSwgRVhUX1RZUEVfQklUUyk7CkBAIC02NTYsNTAgKzYzNyw1NiBAQAogICAgIGV4dEJpdHNVc2VkICs9IEVYVF9UWVBFX0JJVFM7CiAKICAgICBzd2l0Y2ggKGV4dFBheWxvYWRUeXBlKSB7Ci0gICAgICBjYXNlIEVYVF9EWU5BTUlDX1JBTkdFOgogICAgICAgLyogY2FzZSBFWFRfU0FDX0RBVEE6ICovCisgICAgICBjYXNlIEVYVF9MRFNBQ19EQVRBOgorICAgICAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sICpleHRQYXlsb2FkRGF0YSsrLCA0KTsgLyogbmliYmxlICovCisgICAgICAgIH0KKyAgICAgICAgZXh0Qml0c1VzZWQgKz0gNDsKKyAgICAgIGNhc2UgRVhUX0RZTkFNSUNfUkFOR0U6CiAgICAgICBjYXNlIEVYVF9TQlJfREFUQToKICAgICAgIGNhc2UgRVhUX1NCUl9EQVRBX0NSQzoKICAgICAgICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgewogICAgICAgICAgIGludCBpLCB3cml0ZUJpdHMgPSBleHRQYXlsb2FkQml0czsKLSAgICAgICAgICBmb3IgKGk9MDsgd3JpdGVCaXRzID49IDg7IGkrKykgewotICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGV4dFBheWxvYWREYXRhW2ldLCA4KTsKKyAgICAgICAgICBmb3IgKGkgPSAwOyB3cml0ZUJpdHMgPj0gODsgaSsrKSB7CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgKmV4dFBheWxvYWREYXRhKyssIDgpOwogICAgICAgICAgICAgd3JpdGVCaXRzIC09IDg7CiAgICAgICAgICAgfQogICAgICAgICAgIGlmICh3cml0ZUJpdHMgPiAwKSB7Ci0gICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZXh0UGF5bG9hZERhdGFbaV0+Pig4LXdyaXRlQml0cyksIHdyaXRlQml0cyk7CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgKCpleHRQYXlsb2FkRGF0YSkgPj4gKDggLSB3cml0ZUJpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQml0cyk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGV4dEJpdHNVc2VkICs9IGV4dFBheWxvYWRCaXRzOwogICAgICAgICBicmVhazsKIAotICAgICAgY2FzZSBFWFRfREFUQV9FTEVNRU5UOgotICAgICAgICB7Ci0gICAgICAgICAgSU5UIGRhdGFFbGVtZW50TGVuZ3RoID0gKGV4dFBheWxvYWRCaXRzKzcpPj4zOwotICAgICAgICAgIElOVCBjbnQgPSBkYXRhRWxlbWVudExlbmd0aDsKLSAgICAgICAgICBpbnQgbG9vcENvdW50ZXIgPSAxOworICAgICAgY2FzZSBFWFRfREFUQV9FTEVNRU5UOiB7CisgICAgICAgIElOVCBkYXRhRWxlbWVudExlbmd0aCA9IChleHRQYXlsb2FkQml0cyArIDcpID4+IDM7CisgICAgICAgIElOVCBjbnQgPSBkYXRhRWxlbWVudExlbmd0aDsKKyAgICAgICAgaW50IGxvb3BDb3VudGVyID0gMTsKIAotICAgICAgICAgIHdoaWxlIChkYXRhRWxlbWVudExlbmd0aCA+PSAyNTUpIHsKLSAgICAgICAgICAgIGxvb3BDb3VudGVyKys7Ci0gICAgICAgICAgICBkYXRhRWxlbWVudExlbmd0aCAtPSAyNTU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgewotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMHgwMCwgREFUQV9FTF9WRVJTSU9OX0JJVFMpOyAgLyogZGF0YV9lbGVtZW50X3ZlcnNpb24gPSBBTkNfREFUQSAqLwotCi0gICAgICAgICAgICBmb3IgKGk9MTsgaTxsb29wQ291bnRlcjsgaSsrKSB7Ci0gICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAyNTUsIDgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGRhdGFFbGVtZW50TGVuZ3RoLCA4KTsKLQotICAgICAgICAgICAgZm9yIChpPTA7IGk8Y250OyBpKyspIHsKLSAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGV4dFBheWxvYWREYXRhW2ldLCA4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZXh0Qml0c1VzZWQgKz0gREFUQV9FTF9WRVJTSU9OX0JJVFMgKyAobG9vcENvdW50ZXIqOCkgKyAoY250KjgpOworICAgICAgICB3aGlsZSAoZGF0YUVsZW1lbnRMZW5ndGggPj0gMjU1KSB7CisgICAgICAgICAgbG9vcENvdW50ZXIrKzsKKyAgICAgICAgICBkYXRhRWxlbWVudExlbmd0aCAtPSAyNTU7CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgIGludCBpOworICAgICAgICAgIEZES3dyaXRlQml0cygKKyAgICAgICAgICAgICAgaEJpdFN0cmVhbSwgMHgwMCwKKyAgICAgICAgICAgICAgREFUQV9FTF9WRVJTSU9OX0JJVFMpOyAvKiBkYXRhX2VsZW1lbnRfdmVyc2lvbiA9IEFOQ19EQVRBICovCisKKyAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbG9vcENvdW50ZXI7IGkrKykgeworICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDI1NSwgOCk7CisgICAgICAgICAgfQorICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBkYXRhRWxlbWVudExlbmd0aCwgOCk7CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKKyAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBleHRQYXlsb2FkRGF0YVtpXSwgOCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGV4dEJpdHNVc2VkICs9IERBVEFfRUxfVkVSU0lPTl9CSVRTICsgKGxvb3BDb3VudGVyICogOCkgKyAoY250ICogOCk7CisgICAgICB9IGJyZWFrOwogCiAgICAgICBjYXNlIEVYVF9GSUxMX0RBVEE6CiAgICAgICAgIGZpbGxCeXRlID0gMHhBNTsKQEAgLTcwOCw3ICs2OTUsOCBAQAogICAgICAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7CiAgICAgICAgICAgaW50IHdyaXRlQml0cyA9IGV4dFBheWxvYWRCaXRzOwogICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAweDAwLCBGSUxMX05JQkJMRV9CSVRTKTsKLSAgICAgICAgICB3cml0ZUJpdHMgLT0gODsgIC8qIGFjb3VudCBmb3IgdGhlIGV4dGVuc2lvbiB0eXBlIGFuZCB0aGUgZmlsbCBuaWJibGUgKi8KKyAgICAgICAgICB3cml0ZUJpdHMgLT0KKyAgICAgICAgICAgICAgODsgLyogYWNvdW50IGZvciB0aGUgZXh0ZW5zaW9uIHR5cGUgYW5kIHRoZSBmaWxsIG5pYmJsZSAqLwogICAgICAgICAgIHdoaWxlICh3cml0ZUJpdHMgPj0gOCkgewogICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGZpbGxCeXRlLCA4KTsKICAgICAgICAgICAgIHdyaXRlQml0cyAtPSA4OwpAQCAtNzIyLDcgKzcxMCw2IEBACiAgIHJldHVybiAoZXh0Qml0c1VzZWQpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfd3JpdGVEYXRhU3RyZWFtRWxlbWVudApAQCAtNzMyLDM5ICs3MTksMzcgQEAKICAgICBvdXRwdXQ6CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQgRkRLYWFjRW5jX3dyaXRlRGF0YVN0cmVhbUVsZW1lbnQoIEhBTkRMRV9UUkFOU1BPUlRFTkMgIGhUcEVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICBlbGVtZW50SW5zdGFuY2VUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgZGF0YVBheWxvYWRCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpkYXRhQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgIGFsaWduQW5jaG9yICkKLXsKLSAgI2RlZmluZSBEQVRBX0JZVEVfQUxJR05fRkxBRyAgICAgICggMCApCitzdGF0aWMgSU5UIEZES2FhY0VuY193cml0ZURhdGFTdHJlYW1FbGVtZW50KEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZWxlbWVudEluc3RhbmNlVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZGF0YVBheWxvYWRCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmRhdGFCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYWxpZ25BbmNob3IpIHsKKyNkZWZpbmUgREFUQV9CWVRFX0FMSUdOX0ZMQUcgKDApCiAKLSAgI2RlZmluZSBFTF9JTlNUQU5DRV9UQUdfQklUUyAgICAgICggNCApCi0gICNkZWZpbmUgREFUQV9CWVRFX0FMSUdOX0ZMQUdfQklUUyAoIDEgKQotICAjZGVmaW5lIERBVEFfTEVOX0NPVU5UX0JJVFMgICAgICAgKCA4ICkKLSAgI2RlZmluZSBEQVRBX0xFTl9FU0NfQ09VTlRfQklUUyAgICggOCApCisjZGVmaW5lIEVMX0lOU1RBTkNFX1RBR19CSVRTICg0KQorI2RlZmluZSBEQVRBX0JZVEVfQUxJR05fRkxBR19CSVRTICgxKQorI2RlZmluZSBEQVRBX0xFTl9DT1VOVF9CSVRTICg4KQorI2RlZmluZSBEQVRBX0xFTl9FU0NfQ09VTlRfQklUUyAoOCkKIAotICAjZGVmaW5lIE1BWF9EQVRBX0FMSUdOX0JJVFMgICAgICAgKCA3ICkKLSAgI2RlZmluZSBNQVhfRFNFX0RBVEFfQllURVMgICAgICAgICggNTEwICkKKyNkZWZpbmUgTUFYX0RBVEFfQUxJR05fQklUUyAoNykKKyNkZWZpbmUgTUFYX0RTRV9EQVRBX0JZVEVTICg1MTApCiAKLSAgSU5UICBkc2VCaXRzVXNlZCA9IDA7CisgIElOVCBkc2VCaXRzVXNlZCA9IDA7CiAKLSAgd2hpbGUgKGRhdGFQYXlsb2FkQnl0ZXMgPiAwKQotICB7CisgIHdoaWxlIChkYXRhUGF5bG9hZEJ5dGVzID4gMCkgewogICAgIGludCBlc2NfY291bnQgPSAtMTsKICAgICBpbnQgY250ID0gMDsKICAgICBJTlQgY3JjUmVnID0gLTE7CiAKLSAgICBkc2VCaXRzVXNlZCArPSBFTF9JRF9CSVRTICsgRUxfSU5TVEFOQ0VfVEFHX0JJVFMKLSAgICAgICAgICAgICAgICArICBEQVRBX0JZVEVfQUxJR05fRkxBR19CSVRTICsgREFUQV9MRU5fQ09VTlRfQklUUzsKKyAgICBkc2VCaXRzVXNlZCArPSBFTF9JRF9CSVRTICsgRUxfSU5TVEFOQ0VfVEFHX0JJVFMgKworICAgICAgICAgICAgICAgICAgIERBVEFfQllURV9BTElHTl9GTEFHX0JJVFMgKyBEQVRBX0xFTl9DT1VOVF9CSVRTOwogCiAgICAgaWYgKERBVEFfQllURV9BTElHTl9GTEFHKSB7CiAgICAgICBkc2VCaXRzVXNlZCArPSBNQVhfREFUQV9BTElHTl9CSVRTOwogICAgIH0KIAogICAgIGNudCA9IGZpeE1pbihNQVhfRFNFX0RBVEFfQllURVMsIGRhdGFQYXlsb2FkQnl0ZXMpOwotICAgIGlmICggY250ID49IDI1NSApIHsKKyAgICBpZiAoY250ID49IDI1NSkgewogICAgICAgZXNjX2NvdW50ID0gY250IC0gMjU1OwogICAgICAgZHNlQml0c1VzZWQgKz0gREFUQV9MRU5fRVNDX0NPVU5UX0JJVFM7CiAgICAgfQpAQCAtNzg0LDcgKzc2OSw3IEBACiAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgREFUQV9CWVRFX0FMSUdOX0ZMQUcsIERBVEFfQllURV9BTElHTl9GTEFHX0JJVFMpOwogCiAgICAgICAvKiB3cml0ZSBsZW5ndGggZmllbGQocykgKi8KLSAgICAgIGlmICggZXNjX2NvdW50ID49IDAgKSB7CisgICAgICBpZiAoZXNjX2NvdW50ID49IDApIHsKICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDI1NSwgREFUQV9MRU5fQ09VTlRfQklUUyk7CiAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBlc2NfY291bnQsIERBVEFfTEVOX0VTQ19DT1VOVF9CSVRTKTsKICAgICAgIH0gZWxzZSB7CkBAIC03OTUsMTEgKzc4MCwxMiBAQAogICAgICAgICBJTlQgdG1wID0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJpdFN0cmVhbSk7CiAgICAgICAgIEZES2J5dGVBbGlnbihoQml0U3RyZWFtLCBhbGlnbkFuY2hvcik7CiAgICAgICAgIC8qIGNvdW50IGFjdHVhbCBiaXRzICovCi0gICAgICAgIGRzZUJpdHNVc2VkICs9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCaXRTdHJlYW0pIC0gdG1wIC0gTUFYX0RBVEFfQUxJR05fQklUUzsKKyAgICAgICAgZHNlQml0c1VzZWQgKz0KKyAgICAgICAgICAgIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCaXRTdHJlYW0pIC0gdG1wIC0gTUFYX0RBVEFfQUxJR05fQklUUzsKICAgICAgIH0KIAogICAgICAgLyogd3JpdGUgcGF5bG9hZCAqLwotICAgICAgZm9yIChpPTA7IGk8Y250OyBpKyspIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgewogICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZGF0YUJ1ZmZlcltpXSwgOCk7CiAgICAgICB9CiAgICAgICB0cmFuc3BvcnRFbmNfQ3JjRW5kUmVnKGhUcEVuYywgY3JjUmVnKTsKQEAgLTgwOSw3ICs3OTUsNiBAQAogICByZXR1cm4gKGRzZUJpdHNVc2VkKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uRGF0YQpAQCAtODE5LDE4ICs4MDQsMTUgQEAKICAgICBvdXRwdXQ6CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UIEZES2FhY0VuY193cml0ZUV4dGVuc2lvbkRhdGEoIEhBTkRMRV9UUkFOU1BPUlRFTkMgIGhUcEVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRVhURU5TSU9OICAgICpwRXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgIGVsSW5zdGFuY2VUYWcsIC8qIGZvciBEU0Ugb25seSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgIGFsaWduQW5jaG9yLCAgIC8qIGZvciBEU0Ugb25seSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFICAgIGFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICBlcENvbmZpZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICNkZWZpbmUgRklMTF9FTF9DT1VOVF9CSVRTICAgICAgKCA0ICkKLSAgI2RlZmluZSBGSUxMX0VMX0VTQ19DT1VOVF9CSVRTICAoIDggKQotICAjZGVmaW5lIE1BWF9GSUxMX0RBVEFfQllURVMgICAgICggMjY5ICkKK0lOVCBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VYVEVOU0lPTiAqcEV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBlbEluc3RhbmNlVGFnLCAvKiBmb3IgRFNFIG9ubHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYWxpZ25BbmNob3IsICAvKiBmb3IgRFNFIG9ubHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc3ludGF4RmxhZ3MsIEFVRElPX09CSkVDVF9UWVBFIGFvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSIGVwQ29uZmlnKSB7CisjZGVmaW5lIEZJTExfRUxfQ09VTlRfQklUUyAoNCkKKyNkZWZpbmUgRklMTF9FTF9FU0NfQ09VTlRfQklUUyAoOCkKKyNkZWZpbmUgTUFYX0ZJTExfREFUQV9CWVRFUyAoMjY5KQogCiAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0gPSBOVUxMOwogICBJTlQgcGF5bG9hZEJpdHMgPSBwRXh0ZW5zaW9uLT5uUGF5bG9hZEJpdHM7CkBAIC04NDAsMTA2ICs4MjIsNTMgQEAKICAgICBoQml0U3RyZWFtID0gdHJhbnNwb3J0RW5jX0dldEJpdHN0cmVhbShoVHBFbmMpOwogICB9CiAKLSAgaWYgKHN5bnRheEZsYWdzICYgKEFDX1NDQUxBQkxFfEFDX0VSKSkKLSAgewotICAgIGlmICggc3ludGF4RmxhZ3MgJiBBQ19EUk0gKQotICAgIHsgLyogQ0FVVElPTjogVGhlIGNhbGxlciBoYXMgdG8gYXNzdXJlIHRoYXQgZmlsbAotICAgICAgICAgICAgICAgICAgZGF0YSBpcyB3cml0dGVuIGJlZm9yZSB0aGUgU0JSIHBheWxvYWQuICovCi0gICAgICBVQ0hBUiAqZXh0UGF5bG9hZERhdGEgPSBwRXh0ZW5zaW9uLT5wUGF5bG9hZDsKLQotICAgICAgc3dpdGNoIChwRXh0ZW5zaW9uLT50eXBlKQotICAgICAgewotICAgICAgICBjYXNlIEVYVF9TQlJfREFUQToKLSAgICAgICAgY2FzZSBFWFRfU0JSX0RBVEFfQ1JDOgotICAgICAgICAgIC8qIFNCUiBwYXlsb2FkIGlzIHdyaXR0ZW4gaW4gcmV2ZXJzZSAqLwotICAgICAgICAgIGlmIChoQml0U3RyZWFtICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGludCAgIGksIHdyaXRlQml0cyA9IHBheWxvYWRCaXRzOwotCi0gICAgICAgICAgICBGREtwdXNoRm9yKGhCaXRTdHJlYW0sIHBheWxvYWRCaXRzLTEpOyAgLyogRG9lcyBhIGNhY2hlIHN5bmMgaW50ZXJuYWxseSAqLwotCi0gICAgICAgICAgICBmb3IgKGk9MDsgd3JpdGVCaXRzID49IDg7IGkrKykgewotICAgICAgICAgICAgICBGREt3cml0ZUJpdHNCd2QoaEJpdFN0cmVhbSwgZXh0UGF5bG9hZERhdGFbaV0sIDgpOwotICAgICAgICAgICAgICB3cml0ZUJpdHMgLT0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3cml0ZUJpdHMgPiAwKSB7Ci0gICAgICAgICAgICAgIEZES3dyaXRlQml0c0J3ZChoQml0U3RyZWFtLCBleHRQYXlsb2FkRGF0YVtpXT4+KDgtd3JpdGVCaXRzKSwgd3JpdGVCaXRzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRkRLc3luY0NhY2hlQndkIChoQml0U3RyZWFtKTsKLSAgICAgICAgICAgIEZES3B1c2hGb3IgKGhCaXRTdHJlYW0sIHBheWxvYWRCaXRzKzEpOwotICAgICAgICAgIH0KLSAgICAgICAgICBleHRCaXRzVXNlZCArPSBwYXlsb2FkQml0czsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEVYVF9GSUxMX0RBVEE6Ci0gICAgICAgIGNhc2UgRVhUX0ZJTDoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpbnQgd3JpdGVCaXRzID0gcGF5bG9hZEJpdHM7Ci0gICAgICAgICAgICB3aGlsZSAod3JpdGVCaXRzID49IDgpIHsKLSAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDB4MDAsIDgpOwotICAgICAgICAgICAgICB3cml0ZUJpdHMgLT0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAweDAwLCB3cml0ZUJpdHMpOwotICAgICAgICAgIH0KLSAgICAgICAgICBleHRCaXRzVXNlZCArPSBwYXlsb2FkQml0czsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBpZiAoIChzeW50YXhGbGFncyAmIEFDX0VMRCkgJiYgKChwRXh0ZW5zaW9uLT50eXBlPT1FWFRfU0JSX0RBVEEpIHx8IChwRXh0ZW5zaW9uLT50eXBlPT1FWFRfU0JSX0RBVEFfQ1JDKSkgKSB7Ci0KKyAgaWYgKHN5bnRheEZsYWdzICYgKEFDX1NDQUxBQkxFIHwgQUNfRVIpKSB7CisgICAgeworICAgICAgaWYgKChzeW50YXhGbGFncyAmIEFDX0VMRCkgJiYgKChwRXh0ZW5zaW9uLT50eXBlID09IEVYVF9TQlJfREFUQSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEV4dGVuc2lvbi0+dHlwZSA9PSBFWFRfU0JSX0RBVEFfQ1JDKSkpIHsKICAgICAgICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgewogICAgICAgICAgIGludCBpLCB3cml0ZUJpdHMgPSBwYXlsb2FkQml0czsKICAgICAgICAgICBVQ0hBUiAqZXh0UGF5bG9hZERhdGEgPSBwRXh0ZW5zaW9uLT5wUGF5bG9hZDsKIAotICAgICAgICAgIGZvciAoaT0wOyB3cml0ZUJpdHMgPj0gODsgaSsrKSB7CisgICAgICAgICAgZm9yIChpID0gMDsgd3JpdGVCaXRzID49IDg7IGkrKykgewogICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGV4dFBheWxvYWREYXRhW2ldLCA4KTsKICAgICAgICAgICAgIHdyaXRlQml0cyAtPSA4OwogICAgICAgICAgIH0KICAgICAgICAgICBpZiAod3JpdGVCaXRzID4gMCkgewotICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGV4dFBheWxvYWREYXRhW2ldPj4oOC13cml0ZUJpdHMpLCB3cml0ZUJpdHMpOworICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGV4dFBheWxvYWREYXRhW2ldID4+ICg4IC0gd3JpdGVCaXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUJpdHMpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBleHRCaXRzVXNlZCArPSBwYXlsb2FkQml0czsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIEVSIG9yIHNjYWxhYmxlIHN5bnRheCAtPiB3cml0ZSBleHRlbnNpb24gZW4gYmxvYyAqLwotICAgICAgICBleHRCaXRzVXNlZCArPSBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25QYXlsb2FkKCBoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0ZW5zaW9uLT50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0ZW5zaW9uLT5wUGF5bG9hZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZEJpdHMgKTsKKyAgICAgICAgZXh0Qml0c1VzZWQgKz0gRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uUGF5bG9hZCgKKyAgICAgICAgICAgIGhCaXRTdHJlYW0sIHBFeHRlbnNpb24tPnR5cGUsIHBFeHRlbnNpb24tPnBQYXlsb2FkLCBwYXlsb2FkQml0cyk7CiAgICAgICB9CiAgICAgfQotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIC8qIFdlIGhhdmUgbm9ybWFsIEdBIGJpdHN0cmVhbSBwYXlsb2FkIChBT1QgMiw1LDI5KSBzbyBwYWNrCiAgICAgICAgdGhlIGRhdGEgaW50byBhIGZpbGwgZWxlbWVudHMgb3IgRFNFcyAqLwogCi0gICAgaWYgKCBwRXh0ZW5zaW9uLT50eXBlID09IEVYVF9EQVRBX0VMRU1FTlQgKQotICAgIHsKLSAgICAgIGV4dEJpdHNVc2VkICs9IEZES2FhY0VuY193cml0ZURhdGFTdHJlYW1FbGVtZW50KCBoVHBFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxJbnN0YW5jZVRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0ZW5zaW9uLT5uUGF5bG9hZEJpdHM+PjMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dGVuc2lvbi0+cFBheWxvYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25BbmNob3IgKTsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgaWYgKHBFeHRlbnNpb24tPnR5cGUgPT0gRVhUX0RBVEFfRUxFTUVOVCkgeworICAgICAgZXh0Qml0c1VzZWQgKz0gRkRLYWFjRW5jX3dyaXRlRGF0YVN0cmVhbUVsZW1lbnQoCisgICAgICAgICAgaFRwRW5jLCBlbEluc3RhbmNlVGFnLCBwRXh0ZW5zaW9uLT5uUGF5bG9hZEJpdHMgPj4gMywKKyAgICAgICAgICBwRXh0ZW5zaW9uLT5wUGF5bG9hZCwgYWxpZ25BbmNob3IpOworICAgIH0gZWxzZSB7CiAgICAgICB3aGlsZSAocGF5bG9hZEJpdHMgPj0gKEVMX0lEX0JJVFMgKyBGSUxMX0VMX0NPVU5UX0JJVFMpKSB7Ci0gICAgICAgIElOVCBjbnQsIGVzY19jb3VudD0tMSwgYWxpZ25CaXRzPTc7CisgICAgICAgIElOVCBjbnQsIGVzY19jb3VudCA9IC0xLCBhbGlnbkJpdHMgPSA3OwogCi0gICAgICAgIGlmICggKHBFeHRlbnNpb24tPnR5cGUgPT0gRVhUX0ZJTExfREFUQSkgfHwgKHBFeHRlbnNpb24tPnR5cGUgPT0gRVhUX0ZJTCkgKQotICAgICAgICB7CisgICAgICAgIGlmICgocEV4dGVuc2lvbi0+dHlwZSA9PSBFWFRfRklMTF9EQVRBKSB8fAorICAgICAgICAgICAgKHBFeHRlbnNpb24tPnR5cGUgPT0gRVhUX0ZJTCkpIHsKICAgICAgICAgICBwYXlsb2FkQml0cyAtPSBFTF9JRF9CSVRTICsgRklMTF9FTF9DT1VOVF9CSVRTOwotICAgICAgICAgIGlmIChwYXlsb2FkQml0cyA+PSAxNSo4KSB7CisgICAgICAgICAgaWYgKHBheWxvYWRCaXRzID49IDE1ICogOCkgewogICAgICAgICAgICAgcGF5bG9hZEJpdHMgLT0gRklMTF9FTF9FU0NfQ09VTlRfQklUUzsKLSAgICAgICAgICAgIGVzY19jb3VudCA9IDA7ICAvKiB3cml0ZSBlc2NfY291bnQgZXZlbiBpZiBjbnQgYmVjb21lcyBzbWFsbGVyIDE1ICovCisgICAgICAgICAgICBlc2NfY291bnQgPSAwOyAvKiB3cml0ZSBlc2NfY291bnQgZXZlbiBpZiBjbnQgYmVjb21lcyBzbWFsbGVyIDE1ICovCiAgICAgICAgICAgfQogICAgICAgICAgIGFsaWduQml0cyA9IDA7CiAgICAgICAgIH0KIAotICAgICAgICBjbnQgPSBmaXhNaW4oTUFYX0ZJTExfREFUQV9CWVRFUywgKHBheWxvYWRCaXRzK2FsaWduQml0cyk+PjMpOworICAgICAgICBjbnQgPSBmaXhNaW4oTUFYX0ZJTExfREFUQV9CWVRFUywgKHBheWxvYWRCaXRzICsgYWxpZ25CaXRzKSA+PiAzKTsKIAogICAgICAgICBpZiAoY250ID49IDE1KSB7CiAgICAgICAgICAgZXNjX2NvdW50ID0gY250IC0gMTUgKyAxOwpAQCAtOTU2LDEzICs4ODUsMTIgQEAKICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBleHRCaXRzVXNlZCArPSBFTF9JRF9CSVRTICsgRklMTF9FTF9DT1VOVF9CSVRTICsgKChlc2NfY291bnQ+PTApID8gRklMTF9FTF9FU0NfQ09VTlRfQklUUyA6IDApOworICAgICAgICBleHRCaXRzVXNlZCArPSBFTF9JRF9CSVRTICsgRklMTF9FTF9DT1VOVF9CSVRTICsKKyAgICAgICAgICAgICAgICAgICAgICAgKChlc2NfY291bnQgPj0gMCkgPyBGSUxMX0VMX0VTQ19DT1VOVF9CSVRTIDogMCk7CiAKLSAgICAgICAgY250ID0gZml4TWluKGNudCo4LCBwYXlsb2FkQml0cyk7ICAvKiBjb252ZXJ0IGJhY2sgdG8gYml0cyAqLwotICAgICAgICBleHRCaXRzVXNlZCArPSBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25QYXlsb2FkKCBoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0ZW5zaW9uLT50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0ZW5zaW9uLT5wUGF5bG9hZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250ICk7CisgICAgICAgIGNudCA9IGZpeE1pbihjbnQgKiA4LCBwYXlsb2FkQml0cyk7IC8qIGNvbnZlcnQgYmFjayB0byBiaXRzICovCisgICAgICAgIGV4dEJpdHNVc2VkICs9IEZES2FhY0VuY193cml0ZUV4dGVuc2lvblBheWxvYWQoCisgICAgICAgICAgICBoQml0U3RyZWFtLCBwRXh0ZW5zaW9uLT50eXBlLCBwRXh0ZW5zaW9uLT5wUGF5bG9hZCwgY250KTsKICAgICAgICAgcGF5bG9hZEJpdHMgLT0gY250OwogICAgICAgfQogICAgIH0KQEAgLTk3MSw3ICs4OTksNiBAQAogICByZXR1cm4gKGV4dEJpdHNVc2VkKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0J5dGVBbGlnbm1lbnQKQEAgLTk4MSw1MCArOTA4LDQzIEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19CeXRlQWxpZ25tZW50KEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIGludCBhbGlnbkJpdHMpCi17CitzdGF0aWMgdm9pZCBGREthYWNFbmNfQnl0ZUFsaWdubWVudChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsaWduQml0cykgewogICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgYWxpZ25CaXRzKTsKIH0KIAotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0NoYW5uZWxFbGVtZW50V3JpdGUoIEhBTkRMRV9UUkFOU1BPUlRFTkMgIGhUcEVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX0lORk8gICAgICAgICpwRWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICAgICAgKnFjT3V0Q2hhbm5lbFsoMildLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCAgICAgKnBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICAgICAqcHN5T3V0Q2hhbm5lbFsoMildLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFICAgIGFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICBlcENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpwQml0RGVtYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICAgIG1pbkNudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfQ2hhbm5lbEVsZW1lbnRXcml0ZSgKKyAgICBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywgRUxFTUVOVF9JTkZPICpwRWxJbmZvLAorICAgIFFDX09VVF9DSEFOTkVMICpxY091dENoYW5uZWxbKDIpXSwgUFNZX09VVF9FTEVNRU5UICpwc3lPdXRFbGVtZW50LAorICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbm5lbFsoMildLCBVSU5UIHN5bnRheEZsYWdzLAorICAgIEFVRElPX09CSkVDVF9UWVBFIGFvdCwgU0NIQVIgZXBDb25maWcsIElOVCAqcEJpdERlbWFuZCwgVUNIQVIgbWluQ250KSB7CiAgIEFBQ19FTkNPREVSX0VSUk9SIGVycm9yID0gQUFDX0VOQ19PSzsKICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSA9IE5VTEw7Ci0gIElOVCAgICBiaXREZW1hbmQgPSAwOwotICBjb25zdCAgZWxlbWVudF9saXN0X3QgKmxpc3Q7Ci0gIGludCAgICBpLCBjaCwgZGVjaXNpb25fYml0OwotICBJTlQgICAgY3JjUmVnMSA9IC0xLCBjcmNSZWcyID0gLTE7Ci0gIFVDSEFSICBudW1iZXJPZkNoYW5uZWxzOworICBJTlQgYml0RGVtYW5kID0gMDsKKyAgY29uc3QgZWxlbWVudF9saXN0X3QgKmxpc3Q7CisgIGludCBpLCBjaCwgZGVjaXNpb25fYml0OworICBJTlQgY3JjUmVnMSA9IC0xLCBjcmNSZWcyID0gLTE7CisgIFVDSEFSIG51bWJlck9mQ2hhbm5lbHM7CiAKICAgaWYgKGhUcEVuYyAhPSBOVUxMKSB7CiAgICAgLyogR2V0IGJpdHN0cmVhbSBoYW5kbGUgKi8KICAgICBoQml0U3RyZWFtID0gdHJhbnNwb3J0RW5jX0dldEJpdHN0cmVhbShoVHBFbmMpOwogICB9CiAKLSAgaWYgKCAocEVsSW5mby0+ZWxUeXBlPT1JRF9TQ0UpIHx8IChwRWxJbmZvLT5lbFR5cGU9PUlEX0xGRSkgKSB7CisgIGlmICgocEVsSW5mby0+ZWxUeXBlID09IElEX1NDRSkgfHwgKHBFbEluZm8tPmVsVHlwZSA9PSBJRF9MRkUpKSB7CiAgICAgbnVtYmVyT2ZDaGFubmVscyA9IDE7CiAgIH0gZWxzZSB7CiAgICAgbnVtYmVyT2ZDaGFubmVscyA9IDI7CiAgIH0KIAogICAvKiBHZXQgY2hhbm5lbCBlbGVtZW50IHNlcXVlbmNlIHRhYmxlICovCi0gIGxpc3QgPSBnZXRCaXRzdHJlYW1FbGVtZW50TGlzdChhb3QsIGVwQ29uZmlnLCBudW1iZXJPZkNoYW5uZWxzLCAwKTsKKyAgbGlzdCA9IGdldEJpdHN0cmVhbUVsZW1lbnRMaXN0KGFvdCwgZXBDb25maWcsIG51bWJlck9mQ2hhbm5lbHMsIDAsIDApOwogICBpZiAobGlzdCA9PSBOVUxMKSB7CiAgICAgZXJyb3IgPSBBQUNfRU5DX1VOU1VQUE9SVEVEX0FPVDsKICAgICBnb3RvIGJhaWw7CiAgIH0KIAotICBpZiAoIShzeW50YXhGbGFncyAmIChBQ19TQ0FMQUJMRXxBQ19FUikpKSB7CisgIGlmICghKHN5bnRheEZsYWdzICYgKEFDX1NDQUxBQkxFIHwgQUNfRVIpKSkgewogICAgIGlmIChoQml0U3RyZWFtICE9IE5VTEwpIHsKICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBwRWxJbmZvLT5lbFR5cGUsIEVMX0lEX0JJVFMpOwogICAgIH0KQEAgLTEwMzgsMjI1ICs5NTgsMjA1IEBACiAgIGRvIHsKICAgICAvKiBzb21lIHRtcCB2YWx1ZXMgKi8KICAgICBTRUNUSU9OX0RBVEEgKnBDaFNlY3Rpb25EYXRhID0gTlVMTDsKLSAgICBJTlQgICpwQ2hTY2YgICAgICAgICAgID0gTlVMTDsKKyAgICBJTlQgKnBDaFNjZiA9IE5VTEw7CiAgICAgVUlOVCAqcENoTWF4VmFsdWVJblNmYiA9IE5VTEw7Ci0gICAgVE5TX0lORk8gKnBUbnNJbmZvICAgICA9IE5VTEw7Ci0gICAgSU5UICAgY2hHbG9iYWxHYWluICAgICA9IDA7Ci0gICAgSU5UICAgY2hCbG9ja1R5cGUgICAgICA9IDA7Ci0gICAgSU5UICAgY2hNYXhTZmJQZXJHcnAgICA9IDA7Ci0gICAgSU5UICAgY2hTZmJQZXJHcnAgICAgICA9IDA7Ci0gICAgSU5UICAgY2hTZmJDbnQgICAgICAgICA9IDA7Ci0gICAgSU5UICAgY2hGaXJzdFNjZiAgICAgICA9IDA7CisgICAgVE5TX0lORk8gKnBUbnNJbmZvID0gTlVMTDsKKyAgICBJTlQgY2hHbG9iYWxHYWluID0gMDsKKyAgICBJTlQgY2hCbG9ja1R5cGUgPSAwOworICAgIElOVCBjaE1heFNmYlBlckdycCA9IDA7CisgICAgSU5UIGNoU2ZiUGVyR3JwID0gMDsKKyAgICBJTlQgY2hTZmJDbnQgPSAwOworICAgIElOVCBjaEZpcnN0U2NmID0gMDsKIAotICAgIGlmIChtaW5DbnQ9PTApIHsKLSAgICAgIGlmICggcWNPdXRDaGFubmVsIT1OVUxMICkgewotICAgICAgICBwQ2hTZWN0aW9uRGF0YSAgID0gJihxY091dENoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YSk7Ci0gICAgICAgIHBDaFNjZiAgICAgICAgICAgPSAgcWNPdXRDaGFubmVsW2NoXS0+c2NmOwotICAgICAgICBjaEdsb2JhbEdhaW4gICAgID0gIHFjT3V0Q2hhbm5lbFtjaF0tPmdsb2JhbEdhaW47Ci0gICAgICAgIHBDaE1heFZhbHVlSW5TZmIgPSAgcWNPdXRDaGFubmVsW2NoXS0+bWF4VmFsdWVJblNmYjsKLSAgICAgICAgY2hCbG9ja1R5cGUgICAgICA9ICBwQ2hTZWN0aW9uRGF0YS0+YmxvY2tUeXBlOwotICAgICAgICBjaE1heFNmYlBlckdycCAgID0gIHBDaFNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cDsKLSAgICAgICAgY2hTZmJQZXJHcnAgICAgICA9ICBwQ2hTZWN0aW9uRGF0YS0+c2ZiUGVyR3JvdXA7Ci0gICAgICAgIGNoU2ZiQ250ICAgICAgICAgPSAgcENoU2VjdGlvbkRhdGEtPnNmYkNudDsKLSAgICAgICAgY2hGaXJzdFNjZiAgICAgICA9ICBwQ2hTY2ZbcENoU2VjdGlvbkRhdGEtPmZpcnN0U2NmXTsKLSAgICAgIH0KLSAgICAgIGVsc2UgeworICAgIGlmIChtaW5DbnQgPT0gMCkgeworICAgICAgaWYgKHFjT3V0Q2hhbm5lbCAhPSBOVUxMKSB7CisgICAgICAgIHBDaFNlY3Rpb25EYXRhID0gJihxY091dENoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YSk7CisgICAgICAgIHBDaFNjZiA9IHFjT3V0Q2hhbm5lbFtjaF0tPnNjZjsKKyAgICAgICAgY2hHbG9iYWxHYWluID0gcWNPdXRDaGFubmVsW2NoXS0+Z2xvYmFsR2FpbjsKKyAgICAgICAgcENoTWF4VmFsdWVJblNmYiA9IHFjT3V0Q2hhbm5lbFtjaF0tPm1heFZhbHVlSW5TZmI7CisgICAgICAgIGNoQmxvY2tUeXBlID0gcENoU2VjdGlvbkRhdGEtPmJsb2NrVHlwZTsKKyAgICAgICAgY2hNYXhTZmJQZXJHcnAgPSBwQ2hTZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXA7CisgICAgICAgIGNoU2ZiUGVyR3JwID0gcENoU2VjdGlvbkRhdGEtPnNmYlBlckdyb3VwOworICAgICAgICBjaFNmYkNudCA9IHBDaFNlY3Rpb25EYXRhLT5zZmJDbnQ7CisgICAgICAgIGNoRmlyc3RTY2YgPSBwQ2hTY2ZbcENoU2VjdGlvbkRhdGEtPmZpcnN0U2NmXTsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIGdldCB2YWx1ZXMgZnJvbSBQU1kgKi8KLSAgICAgICAgY2hTZmJDbnQgICAgICAgPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OwotICAgICAgICBjaFNmYlBlckdycCAgICA9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cDsKKyAgICAgICAgY2hTZmJDbnQgPSBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250OworICAgICAgICBjaFNmYlBlckdycCA9IHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cDsKICAgICAgICAgY2hNYXhTZmJQZXJHcnAgPSBwc3lPdXRDaGFubmVsW2NoXS0+bWF4U2ZiUGVyR3JvdXA7CiAgICAgICB9CiAgICAgICBwVG5zSW5mbyA9ICZwc3lPdXRDaGFubmVsW2NoXS0+dG5zSW5mbzsKICAgICB9IC8qIG1pbkNudD09MCAqLwogCi0gICAgaWYgKCBxY091dENoYW5uZWw9PU5VTEwgKSB7Ci0gICAgICBjaEJsb2NrVHlwZSAgICA9IHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2U7CisgICAgaWYgKHFjT3V0Q2hhbm5lbCA9PSBOVUxMKSB7CisgICAgICBjaEJsb2NrVHlwZSA9IHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2U7CiAgICAgfQogCi0gICAgc3dpdGNoIChsaXN0LT5pZFtpXSkKLSAgICB7Ci0gICAgY2FzZSBlbGVtZW50X2luc3RhbmNlX3RhZzoKLSAgICAgIC8qIFdyaXRlIGVsZW1lbnQgaW5zdGFuY2UgdGFnICovCi0gICAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7Ci0gICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBwRWxJbmZvLT5pbnN0YW5jZVRhZywgNCk7Ci0gICAgICB9Ci0gICAgICBiaXREZW1hbmQgKz0gNDsKLSAgICAgIGJyZWFrOworICAgIHN3aXRjaCAobGlzdC0+aWRbaV0pIHsKKyAgICAgIGNhc2UgZWxlbWVudF9pbnN0YW5jZV90YWc6CisgICAgICAgIC8qIFdyaXRlIGVsZW1lbnQgaW5zdGFuY2UgdGFnICovCisgICAgICAgIGlmIChoQml0U3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgcEVsSW5mby0+aW5zdGFuY2VUYWcsIDQpOworICAgICAgICB9CisgICAgICAgIGJpdERlbWFuZCArPSA0OworICAgICAgICBicmVhazsKIAotICAgIGNhc2UgY29tbW9uX3dpbmRvdzoKLSAgICAgIC8qIFdyaXRlIGNvbW1vbiB3aW5kb3cgZmxhZyAqLwotICAgICAgZGVjaXNpb25fYml0ID0gcHN5T3V0RWxlbWVudC0+Y29tbW9uV2luZG93OwotICAgICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkgewotICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgcHN5T3V0RWxlbWVudC0+Y29tbW9uV2luZG93LCAxKTsKLSAgICAgIH0KLSAgICAgIGJpdERlbWFuZCArPSAxOwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIGNvbW1vbl93aW5kb3c6CisgICAgICAgIC8qIFdyaXRlIGNvbW1vbiB3aW5kb3cgZmxhZyAqLworICAgICAgICBkZWNpc2lvbl9iaXQgPSBwc3lPdXRFbGVtZW50LT5jb21tb25XaW5kb3c7CisgICAgICAgIGlmIChoQml0U3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgcHN5T3V0RWxlbWVudC0+Y29tbW9uV2luZG93LCAxKTsKKyAgICAgICAgfQorICAgICAgICBiaXREZW1hbmQgKz0gMTsKKyAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIGljc19pbmZvOgotICAgICAgLyogV3JpdGUgaW5kaXZpZHVhbCBjaGFubmVsIGluZm8gKi8KLSAgICAgIGJpdERlbWFuZCArPSBGREthYWNFbmNfZW5jb2RlSWNzSW5mbyggY2hCbG9ja1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT53aW5kb3dTaGFwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPmdyb3VwaW5nTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hNYXhTZmJQZXJHcnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzKTsKLSAgICAgIGJyZWFrOworICAgICAgY2FzZSBpY3NfaW5mbzoKKyAgICAgICAgLyogV3JpdGUgaW5kaXZpZHVhbCBjaGFubmVsIGluZm8gKi8KKyAgICAgICAgYml0RGVtYW5kICs9CisgICAgICAgICAgICBGREthYWNFbmNfZW5jb2RlSWNzSW5mbyhjaEJsb2NrVHlwZSwgcHN5T3V0Q2hhbm5lbFtjaF0tPndpbmRvd1NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPmdyb3VwaW5nTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoTWF4U2ZiUGVyR3JwLCBoQml0U3RyZWFtLCBzeW50YXhGbGFncyk7CisgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBsdHBfZGF0YV9wcmVzZW50OgotICAgICAgLyogV3JpdGUgTFRQIGRhdGEgcHJlc2VudCBmbGFnICovCi0gICAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7Ci0gICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsKLSAgICAgIH0KLSAgICAgIGJpdERlbWFuZCArPSAxOwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIGx0cF9kYXRhX3ByZXNlbnQ6CisgICAgICAgIC8qIFdyaXRlIExUUCBkYXRhIHByZXNlbnQgZmxhZyAqLworICAgICAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDEpOworICAgICAgICB9CisgICAgICAgIGJpdERlbWFuZCArPSAxOworICAgICAgICBicmVhazsKIAotICAgIGNhc2UgbHRwX2RhdGE6Ci0gICAgICAvKiBQcmVkaWN0b3IgZGF0YSBub3Qgc3VwcG9ydGVkLgotICAgICAgICAgTm90aGluZyB0byBkbyBoZXJlLiAqLwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIGx0cF9kYXRhOgorICAgICAgICAvKiBQcmVkaWN0b3IgZGF0YSBub3Qgc3VwcG9ydGVkLgorICAgICAgICAgICBOb3RoaW5nIHRvIGRvIGhlcmUuICovCisgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBtczoKLSAgICAgIC8qIFdyaXRlIE1TIGluZm8gKi8KLSAgICAgIGJpdERlbWFuZCArPSBGREthYWNFbmNfZW5jb2RlTVNJbmZvKCBjaFNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaFNmYlBlckdycCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaE1heFNmYlBlckdycCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWluQ250PT0wKSA/IHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCA6IE1TX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtKTsKLSAgICAgIGJyZWFrOworICAgICAgY2FzZSBtczoKKyAgICAgICAgLyogV3JpdGUgTVMgaW5mbyAqLworICAgICAgICBiaXREZW1hbmQgKz0gRkRLYWFjRW5jX2VuY29kZU1TSW5mbygKKyAgICAgICAgICAgIGNoU2ZiQ250LCBjaFNmYlBlckdycCwgY2hNYXhTZmJQZXJHcnAsCisgICAgICAgICAgICAobWluQ250ID09IDApID8gcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0IDogTVNfTk9ORSwKKyAgICAgICAgICAgIHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc01hc2ssIGhCaXRTdHJlYW0pOworICAgICAgICBicmVhazsKIAotICAgIGNhc2UgZ2xvYmFsX2dhaW46Ci0gICAgICBiaXREZW1hbmQgKz0gRkRLYWFjRW5jX2VuY29kZUdsb2JhbEdhaW4oIGNoR2xvYmFsR2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hGaXJzdFNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPm1kY3RTY2FsZSApOwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIGdsb2JhbF9nYWluOgorICAgICAgICBiaXREZW1hbmQgKz0gRkRLYWFjRW5jX2VuY29kZUdsb2JhbEdhaW4oCisgICAgICAgICAgICBjaEdsb2JhbEdhaW4sIGNoRmlyc3RTY2YsIGhCaXRTdHJlYW0sIHBzeU91dENoYW5uZWxbY2hdLT5tZGN0U2NhbGUpOworICAgICAgICBicmVhazsKIAotICAgIGNhc2Ugc2VjdGlvbl9kYXRhOgotICAgICAgewotICAgICAgICBJTlQgc2lCaXRzID0gRkRLYWFjRW5jX2VuY29kZVNlY3Rpb25EYXRhKHBDaFNlY3Rpb25EYXRhLCBoQml0U3RyZWFtLCAoc3ludGF4RmxhZ3MgJiBBQ19FUl9WQ0IxMSk/MTowKTsKKyAgICAgIGNhc2Ugc2VjdGlvbl9kYXRhOiB7CisgICAgICAgIElOVCBzaUJpdHMgPSBGREthYWNFbmNfZW5jb2RlU2VjdGlvbkRhdGEoCisgICAgICAgICAgICBwQ2hTZWN0aW9uRGF0YSwgaEJpdFN0cmVhbSwgKHN5bnRheEZsYWdzICYgQUNfRVJfVkNCMTEpID8gMSA6IDApOwogICAgICAgICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7CiAgICAgICAgICAgaWYgKHNpQml0cyAhPSBxY091dENoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5zaWRlSW5mb0JpdHMpIHsKICAgICAgICAgICAgIGVycm9yID0gQUFDX0VOQ19XUklURV9TRUNfRVJST1I7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGJpdERlbWFuZCArPSBzaUJpdHM7Ci0gICAgICB9Ci0gICAgICBicmVhazsKKyAgICAgIH0gYnJlYWs7CiAKLSAgICBjYXNlIHNjYWxlX2ZhY3Rvcl9kYXRhOgotICAgICAgewotICAgICAgICBJTlQgc2ZEYXRhQml0cyA9IEZES2FhY0VuY19lbmNvZGVTY2FsZUZhY3RvckRhdGEoIHBDaE1heFZhbHVlSW5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoU2VjdGlvbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoU2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPm5vaXNlTnJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5pc1NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoR2xvYmFsR2FpbiApOwotICAgICAgICBpZiAoIChoQml0U3RyZWFtICE9IE5VTEwpCi0gICAgICAgICAgJiYgKHNmRGF0YUJpdHMgIT0gKHFjT3V0Q2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLnNjYWxlZmFjQml0cyArIHFjT3V0Q2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLm5vaXNlTnJnQml0cykpICkgewotICAgICAgICAgICBlcnJvciA9IEFBQ19FTkNfV1JJVEVfU0NBTF9FUlJPUjsKKyAgICAgIGNhc2Ugc2NhbGVfZmFjdG9yX2RhdGE6IHsKKyAgICAgICAgSU5UIHNmRGF0YUJpdHMgPSBGREthYWNFbmNfZW5jb2RlU2NhbGVGYWN0b3JEYXRhKAorICAgICAgICAgICAgcENoTWF4VmFsdWVJblNmYiwgcENoU2VjdGlvbkRhdGEsIHBDaFNjZiwgaEJpdFN0cmVhbSwKKyAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5ub2lzZU5yZywgcHN5T3V0Q2hhbm5lbFtjaF0tPmlzU2NhbGUsCisgICAgICAgICAgICBjaEdsb2JhbEdhaW4pOworICAgICAgICBpZiAoKGhCaXRTdHJlYW0gIT0gTlVMTCkgJiYKKyAgICAgICAgICAgIChzZkRhdGFCaXRzICE9IChxY091dENoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5zY2FsZWZhY0JpdHMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLm5vaXNlTnJnQml0cykpKSB7CisgICAgICAgICAgZXJyb3IgPSBBQUNfRU5DX1dSSVRFX1NDQUxfRVJST1I7CiAgICAgICAgIH0KICAgICAgICAgYml0RGVtYW5kICs9IHNmRGF0YUJpdHM7Ci0gICAgICB9Ci0gICAgICBicmVhazsKKyAgICAgIH0gYnJlYWs7CiAKLSAgICBjYXNlIGVzYzJfcnZsYzoKLSAgICAgIGlmIChzeW50YXhGbGFncyAmIEFDX0VSX1JWTEMpIHsKLSAgICAgICAgLyogd3JpdGUgUlZMQyBkYXRhIGludG8gYml0c3RyZWFtIChlcnJvciBzZW5zLiBjYXQuIDIpICovCi0gICAgICAgIGVycm9yID0gQUFDX0VOQ19VTlNVUFBPUlRFRF9BT1Q7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgcHVsc2U6Ci0gICAgICAvKiBXcml0ZSBwdWxzZSBkYXRhICovCi0gICAgICBiaXREZW1hbmQgKz0gRkRLYWFjRW5jX2VuY29kZVB1bHNlRGF0YShoQml0U3RyZWFtKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSB0bnNfZGF0YV9wcmVzZW50OgotICAgICAgLyogV3JpdGUgVE5TIGRhdGEgcHJlc2VudCBmbGFnICovCi0gICAgICBiaXREZW1hbmQgKz0gRkRLYWFjRW5jX2VuY29kZVRuc0RhdGFQcmVzZW50KHBUbnNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaEJsb2NrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRuc19kYXRhOgotICAgICAgLyogV3JpdGUgVE5TIGRhdGEgKi8KLSAgICAgIGJpdERlbWFuZCArPSBGREthYWNFbmNfZW5jb2RlVG5zRGF0YShwVG5zSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaEJsb2NrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBnYWluX2NvbnRyb2xfZGF0YToKLSAgICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQ6Ci0gICAgICBiaXREZW1hbmQgKz0gRkRLYWFjRW5jX2VuY29kZUdhaW5Db250cm9sRGF0YShoQml0U3RyZWFtKTsKLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIGVzYzFfaGNyOgotICAgICAgaWYgKHN5bnRheEZsYWdzICYgQUNfRVJfSENSKQotICAgICAgewotICAgICAgICBlcnJvciA9IEFBQ19FTkNfVU5LTk9XTjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBzcGVjdHJhbF9kYXRhOgotICAgICAgaWYgKGhCaXRTdHJlYW0gIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgSU5UIHNwZWN0cmFsQml0cyA9IDA7Ci0KLSAgICAgICAgICBzcGVjdHJhbEJpdHMgPSBGREthYWNFbmNfZW5jb2RlU3BlY3RyYWxEYXRhKCBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiT2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hTZWN0aW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLT5xdWFudFNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSApOwotCi0gICAgICAgIGlmIChzcGVjdHJhbEJpdHMgIT0gcWNPdXRDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEuaHVmZm1hbkJpdHMpIHsKLSAgICAgICAgICByZXR1cm4gQUFDX0VOQ19XUklURV9TUEVDX0VSUk9SOworICAgICAgY2FzZSBlc2MyX3J2bGM6CisgICAgICAgIGlmIChzeW50YXhGbGFncyAmIEFDX0VSX1JWTEMpIHsKKyAgICAgICAgICAvKiB3cml0ZSBSVkxDIGRhdGEgaW50byBiaXRzdHJlYW0gKGVycm9yIHNlbnMuIGNhdC4gMikgKi8KKyAgICAgICAgICBlcnJvciA9IEFBQ19FTkNfVU5TVVBQT1JURURfQU9UOwogICAgICAgICB9Ci0gICAgICAgIGJpdERlbWFuZCArPSBzcGVjdHJhbEJpdHM7Ci0gICAgICB9Ci0gICAgICBicmVhazsKKyAgICAgICAgYnJlYWs7CiAKLSAgICAgIC8qIE5vbiBkYXRhIGNhc2VzICovCi0gICAgY2FzZSBhZHRzY3JjX3N0YXJ0X3JlZzE6Ci0gICAgICBpZiAoaFRwRW5jICE9IE5VTEwpIHsKLSAgICAgICAgY3JjUmVnMSA9IHRyYW5zcG9ydEVuY19DcmNTdGFydFJlZyhoVHBFbmMsIDE5Mik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGFkdHNjcmNfc3RhcnRfcmVnMjoKLSAgICAgIGlmIChoVHBFbmMgIT0gTlVMTCkgewotICAgICAgICBjcmNSZWcyID0gdHJhbnNwb3J0RW5jX0NyY1N0YXJ0UmVnKGhUcEVuYywgMTI4KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYWR0c2NyY19lbmRfcmVnMToKLSAgICBjYXNlIGRybWNyY19lbmRfcmVnOgotICAgICAgaWYgKGhUcEVuYyAhPSBOVUxMKSB7Ci0gICAgICAgIHRyYW5zcG9ydEVuY19DcmNFbmRSZWcoaFRwRW5jLCBjcmNSZWcxKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYWR0c2NyY19lbmRfcmVnMjoKLSAgICAgIGlmIChoVHBFbmMgIT0gTlVMTCkgewotICAgICAgICB0cmFuc3BvcnRFbmNfQ3JjRW5kUmVnKGhUcEVuYywgY3JjUmVnMik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGRybWNyY19zdGFydF9yZWc6Ci0gICAgICBpZiAoaFRwRW5jICE9IE5VTEwpIHsKLSAgICAgICAgY3JjUmVnMSA9IHRyYW5zcG9ydEVuY19DcmNTdGFydFJlZyhoVHBFbmMsIDApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBuZXh0X2NoYW5uZWw6Ci0gICAgICBjaCA9IChjaCArIDEpICUgbnVtYmVyT2ZDaGFubmVsczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGlua19zZXF1ZW5jZToKLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0W2RlY2lzaW9uX2JpdF07Ci0gICAgICBpPS0xOwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIHB1bHNlOgorICAgICAgICAvKiBXcml0ZSBwdWxzZSBkYXRhICovCisgICAgICAgIGJpdERlbWFuZCArPSBGREthYWNFbmNfZW5jb2RlUHVsc2VEYXRhKGhCaXRTdHJlYW0pOworICAgICAgICBicmVhazsKIAotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvciA9IEFBQ19FTkNfVU5LTk9XTjsKLSAgICAgIGJyZWFrOworICAgICAgY2FzZSB0bnNfZGF0YV9wcmVzZW50OgorICAgICAgICAvKiBXcml0ZSBUTlMgZGF0YSBwcmVzZW50IGZsYWcgKi8KKyAgICAgICAgYml0RGVtYW5kICs9CisgICAgICAgICAgICBGREthYWNFbmNfZW5jb2RlVG5zRGF0YVByZXNlbnQocFRuc0luZm8sIGNoQmxvY2tUeXBlLCBoQml0U3RyZWFtKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRuc19kYXRhOgorICAgICAgICAvKiBXcml0ZSBUTlMgZGF0YSAqLworICAgICAgICBiaXREZW1hbmQgKz0gRkRLYWFjRW5jX2VuY29kZVRuc0RhdGEocFRuc0luZm8sIGNoQmxvY2tUeXBlLCBoQml0U3RyZWFtKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgZ2Fpbl9jb250cm9sX2RhdGE6CisgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZSAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50OgorICAgICAgICBiaXREZW1hbmQgKz0gRkRLYWFjRW5jX2VuY29kZUdhaW5Db250cm9sRGF0YShoQml0U3RyZWFtKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgZXNjMV9oY3I6CisgICAgICAgIGlmIChzeW50YXhGbGFncyAmIEFDX0VSX0hDUikgeworICAgICAgICAgIGVycm9yID0gQUFDX0VOQ19VTktOT1dOOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHNwZWN0cmFsX2RhdGE6CisgICAgICAgIGlmIChoQml0U3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICBJTlQgc3BlY3RyYWxCaXRzID0gMDsKKworICAgICAgICAgIHNwZWN0cmFsQml0cyA9IEZES2FhY0VuY19lbmNvZGVTcGVjdHJhbERhdGEoCisgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJPZmZzZXRzLCBwQ2hTZWN0aW9uRGF0YSwKKyAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+cXVhbnRTcGVjLCBoQml0U3RyZWFtKTsKKworICAgICAgICAgIGlmIChzcGVjdHJhbEJpdHMgIT0gcWNPdXRDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEuaHVmZm1hbkJpdHMpIHsKKyAgICAgICAgICAgIHJldHVybiBBQUNfRU5DX1dSSVRFX1NQRUNfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICAgIGJpdERlbWFuZCArPSBzcGVjdHJhbEJpdHM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogTm9uIGRhdGEgY2FzZXMgKi8KKyAgICAgIGNhc2UgYWR0c2NyY19zdGFydF9yZWcxOgorICAgICAgICBpZiAoaFRwRW5jICE9IE5VTEwpIHsKKyAgICAgICAgICBjcmNSZWcxID0gdHJhbnNwb3J0RW5jX0NyY1N0YXJ0UmVnKGhUcEVuYywgMTkyKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgYWR0c2NyY19zdGFydF9yZWcyOgorICAgICAgICBpZiAoaFRwRW5jICE9IE5VTEwpIHsKKyAgICAgICAgICBjcmNSZWcyID0gdHJhbnNwb3J0RW5jX0NyY1N0YXJ0UmVnKGhUcEVuYywgMTI4KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgYWR0c2NyY19lbmRfcmVnMToKKyAgICAgIGNhc2UgZHJtY3JjX2VuZF9yZWc6CisgICAgICAgIGlmIChoVHBFbmMgIT0gTlVMTCkgeworICAgICAgICAgIHRyYW5zcG9ydEVuY19DcmNFbmRSZWcoaFRwRW5jLCBjcmNSZWcxKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgYWR0c2NyY19lbmRfcmVnMjoKKyAgICAgICAgaWYgKGhUcEVuYyAhPSBOVUxMKSB7CisgICAgICAgICAgdHJhbnNwb3J0RW5jX0NyY0VuZFJlZyhoVHBFbmMsIGNyY1JlZzIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBkcm1jcmNfc3RhcnRfcmVnOgorICAgICAgICBpZiAoaFRwRW5jICE9IE5VTEwpIHsKKyAgICAgICAgICBjcmNSZWcxID0gdHJhbnNwb3J0RW5jX0NyY1N0YXJ0UmVnKGhUcEVuYywgMCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIG5leHRfY2hhbm5lbDoKKyAgICAgICAgY2ggPSAoY2ggKyAxKSAlIG51bWJlck9mQ2hhbm5lbHM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBsaW5rX3NlcXVlbmNlOgorICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dFtkZWNpc2lvbl9iaXRdOworICAgICAgICBpID0gLTE7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBlcnJvciA9IEFBQ19FTkNfVU5LTk9XTjsKKyAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgaWYgKGVycm9yICE9IEFBQ19FTkNfT0spIHsKQEAgLTEyNzUsMjQgKzExNzUsMTkgQEAKICAgcmV0dXJuIGVycm9yOwogfQogCi0KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1dyaXRlQml0c3RyZWFtKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyAqY2hhbm5lbE1hcHBpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUICpxY091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUKiBwc3lPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUICpxY091dCwgUFNZX09VVCAqcHN5T3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX1NUQVRFICpxY0tlcm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgIHN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICBlcENvbmZpZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoteworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGFvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHN5bnRheEZsYWdzLCBTQ0hBUiBlcENvbmZpZykgewogICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSB0cmFuc3BvcnRFbmNfR2V0Qml0c3RyZWFtKGhUcEVuYyk7CiAgIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzID0gQUFDX0VOQ19PSzsKLSAgaW50ICAgaSwgbiwgZG9CeXRlQWxpZ24gPSAxOwotICBJTlQgICBiaXRNYXJrVXA7Ci0gIElOVCAgIGZyYW1lQml0czsKKyAgaW50IGksIG4sIGRvQnl0ZUFsaWduID0gMTsKKyAgSU5UIGJpdE1hcmtVcDsKKyAgSU5UIGZyYW1lQml0czsKICAgLyogR2V0IGZpcnN0IGJpdCBvZiByYXcgZGF0YSBibG9jay4KICAgICAgSW4gY2FzZSBvZiBBRFRTK1BDRSwgQVUgd291bGQgc3RhcnQgYXQgUENFLgogICAgICBUaGlzIGlzIG9rYXkgYmVjYXVzZSBQQ0UgYXNzdXJlcyBhbGlnbm1lbnQuICovCkBAIC0xMzAwLDE2MCArMTE5NSwxMTIgQEAKIAogICBmcmFtZUJpdHMgPSBiaXRNYXJrVXAgPSBhbGlnbkFuY2hvcjsKIAotCiAgIC8qIENoYW5uZWwgZWxlbWVudCBsb29wICovCi0gIGZvciAoaT0wOyBpPGNoYW5uZWxNYXBwaW5nLT5uRWxlbWVudHM7IGkrKykgewotCisgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsTWFwcGluZy0+bkVsZW1lbnRzOyBpKyspIHsKICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY2hhbm5lbE1hcHBpbmctPmVsSW5mb1tpXTsKICAgICBJTlQgZWxlbWVudFVzZWRCaXRzID0gMDsKIAotICAgIHN3aXRjaCAoZWxJbmZvLmVsVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgSURfU0NFOiAgICAgIC8qIHNpbmdsZSBjaGFubmVsICovCi0gICAgICAgIGNhc2UgSURfQ1BFOiAgICAgIC8qIGNoYW5uZWwgcGFpciAqLwotICAgICAgICBjYXNlIElEX0xGRTogICAgICAvKiBsb3cgZnJlcSBlZmZlY3RzIGNoYW5uZWwgKi8KLSAgICAgICAgewotICAgICAgICAgIGlmICggQUFDX0VOQ19PSyAhPSAoRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfQ2hhbm5lbEVsZW1lbnRXcml0ZSggaFRwRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dC0+cWNFbGVtZW50W2ldLT5xY091dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0LT5wc3lPdXRFbGVtZW50W2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dC0+cHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywgICAvKiBzeW50YXhGbGFncyAoRVIgdG9vbHMgLi4uKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvdCwgICAgICAgICAgIC8qIGFvdDogQU9UX0FBQ19MQywgQU9UX1NCUiwgQU9UX1BTICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBDb25maWcsICAgICAgLyogZXBDb25maWcgLTEsIDAsIDEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKSkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKLSAgICAgICAgICB9CisgICAgc3dpdGNoIChlbEluZm8uZWxUeXBlKSB7CisgICAgICBjYXNlIElEX1NDRTogLyogc2luZ2xlIGNoYW5uZWwgKi8KKyAgICAgIGNhc2UgSURfQ1BFOiAvKiBjaGFubmVsIHBhaXIgKi8KKyAgICAgIGNhc2UgSURfTEZFOiAvKiBsb3cgZnJlcSBlZmZlY3RzIGNoYW5uZWwgKi8KKyAgICAgIHsKKyAgICAgICAgaWYgKEFBQ19FTkNfT0sgIT0KKyAgICAgICAgICAgIChFcnJvclN0YXR1cyA9IEZES2FhY0VuY19DaGFubmVsRWxlbWVudFdyaXRlKAorICAgICAgICAgICAgICAgICBoVHBFbmMsICZlbEluZm8sIHFjT3V0LT5xY0VsZW1lbnRbaV0tPnFjT3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgcHN5T3V0LT5wc3lPdXRFbGVtZW50W2ldLAorICAgICAgICAgICAgICAgICBwc3lPdXQtPnBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWwsCisgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLCAvKiBzeW50YXhGbGFncyAoRVIgdG9vbHMgLi4uKSAqLworICAgICAgICAgICAgICAgICBhb3QsICAgICAgICAgLyogYW90OiBBT1RfQUFDX0xDLCBBT1RfU0JSLCBBT1RfUFMgKi8KKyAgICAgICAgICAgICAgICAgZXBDb25maWcsICAgIC8qIGVwQ29uZmlnIC0xLCAwLCAxICovCisgICAgICAgICAgICAgICAgIE5VTEwsIDApKSkgeworICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKKyAgICAgICAgfQogCi0gICAgICAgICAgaWYgKCAhKHN5bnRheEZsYWdzICYgQUNfRVIpICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBXcml0ZSBhc3NvY2lhdGVkIGV4dGVuc2lvbiBwYXlsb2FkICovCi0gICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgcWNPdXQtPnFjRWxlbWVudFtpXS0+bkV4dGVuc2lvbnM7IG4rKykgewotICAgICAgICAgICAgICBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhKCBoVHBFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjT3V0LT5xY0VsZW1lbnRbaV0tPmV4dGVuc2lvbltuXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25BbmNob3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnICk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmICghKHN5bnRheEZsYWdzICYgQUNfRVIpKSB7CisgICAgICAgICAgLyogV3JpdGUgYXNzb2NpYXRlZCBleHRlbnNpb24gcGF5bG9hZCAqLworICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBxY091dC0+cWNFbGVtZW50W2ldLT5uRXh0ZW5zaW9uczsgbisrKSB7CisgICAgICAgICAgICBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhKAorICAgICAgICAgICAgICAgIGhUcEVuYywgJnFjT3V0LT5xY0VsZW1lbnRbaV0tPmV4dGVuc2lvbltuXSwgMCwgYWxpZ25BbmNob3IsCisgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsIGFvdCwgZXBDb25maWcpOwogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgIH0gYnJlYWs7CiAKLSAgICAgICAgLyogSW4gRkRLLCBEU0Ugc2lnbmFsbGluZyBleHBsaWNpdCBkb25lIGluIGVsRFNFLiBTZWUgY2hhbm5lbF9tYXAuY3BwICovCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIEFBQ19FTkNfSU5WQUxJRF9FTEVNRU5USU5GT19UWVBFOworICAgICAgLyogSW4gRkRLLCBEU0Ugc2lnbmFsbGluZyBleHBsaWNpdCBkb25lIGluIGVsRFNFLiBTZWUgY2hhbm5lbF9tYXAuY3BwICovCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQUFDX0VOQ19JTlZBTElEX0VMRU1FTlRJTkZPX1RZUEU7CiAKLSAgICB9ICAgLyogc3dpdGNoICovCisgICAgfSAvKiBzd2l0Y2ggKi8KIAotICAgIGlmKGVsSW5mby5lbFR5cGUgIT0gSURfRFNFKSB7CisgICAgaWYgKGVsSW5mby5lbFR5cGUgIT0gSURfRFNFKSB7CiAgICAgICBlbGVtZW50VXNlZEJpdHMgLT0gYml0TWFya1VwOwotICAgICAgYml0TWFya1VwICAgICAgICA9IEZES2dldFZhbGlkQml0cyhoQnMpOworICAgICAgYml0TWFya1VwID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CiAgICAgICBlbGVtZW50VXNlZEJpdHMgKz0gYml0TWFya1VwOwotICAgICAgZnJhbWVCaXRzICAgICAgICs9IGVsZW1lbnRVc2VkQml0czsKKyAgICAgIGZyYW1lQml0cyArPSBlbGVtZW50VXNlZEJpdHM7CiAgICAgfQogCiAgIH0gLyogZm9yIChpPTA7IGk8Y2hhbm5lbE1hcHBpbmcubkVsZW1lbnRzOyBpKyspICovCiAKLSAgaWYgKCAoc3ludGF4RmxhZ3MgJiBBQ19FUikgJiYgIShzeW50YXhGbGFncyAmIEFDX0RSTSkgKQotICB7Ci0gICAgVUNIQVIgY2hhbm5lbEVsZW1lbnRFeHRlbnNpb25Xcml0dGVuWyg4KV1bKDEpXTsgLyogMDogZXh0ZW5zaW9uIG5vdCB0b3VjaGVkLCAxOiBleHRlbnNpb24gYWxyZWFkeSB3cml0dGVuICovCisgIGlmICgoc3ludGF4RmxhZ3MgJiBBQ19FUikgJiYgIShzeW50YXhGbGFncyAmIEFDX0RSTSkpIHsKKyAgICBVQ0hBUiBjaGFubmVsRWxlbWVudEV4dGVuc2lvbldyaXR0ZW5bKCg4KSldWygKKyAgICAgICAgMSldOyAvKiAwOiBleHRlbnNpb24gbm90IHRvdWNoZWQsIDE6IGV4dGVuc2lvbiBhbHJlYWR5IHdyaXR0ZW4gKi8KIAotICAgIEZES21lbWNsZWFyKGNoYW5uZWxFbGVtZW50RXh0ZW5zaW9uV3JpdHRlbiwgc2l6ZW9mKGNoYW5uZWxFbGVtZW50RXh0ZW5zaW9uV3JpdHRlbikpOworICAgIEZES21lbWNsZWFyKGNoYW5uZWxFbGVtZW50RXh0ZW5zaW9uV3JpdHRlbiwKKyAgICAgICAgICAgICAgICBzaXplb2YoY2hhbm5lbEVsZW1lbnRFeHRlbnNpb25Xcml0dGVuKSk7CiAKLSAgICBpZiAoIHN5bnRheEZsYWdzICYgQUNfRUxEICkgewotCi0gICAgICBmb3IgKGk9MDsgaTxjaGFubmVsTWFwcGluZy0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICBpZiAoc3ludGF4RmxhZ3MgJiBBQ19FTEQpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsTWFwcGluZy0+bkVsZW1lbnRzOyBpKyspIHsKICAgICAgICAgZm9yIChuID0gMDsgbiA8IHFjT3V0LT5xY0VsZW1lbnRbaV0tPm5FeHRlbnNpb25zOyBuKyspIHsKLQotICAgICAgICAgIGlmICggKHFjT3V0LT5xY0VsZW1lbnRbaV0tPmV4dGVuc2lvbltuXS50eXBlPT1FWFRfU0JSX0RBVEEpCi0gICAgICAgICAgICB8fCAocWNPdXQtPnFjRWxlbWVudFtpXS0+ZXh0ZW5zaW9uW25dLnR5cGU9PUVYVF9TQlJfREFUQV9DUkMpICkKLSAgICAgICAgICB7CisgICAgICAgICAgaWYgKChxY091dC0+cWNFbGVtZW50W2ldLT5leHRlbnNpb25bbl0udHlwZSA9PSBFWFRfU0JSX0RBVEEpIHx8CisgICAgICAgICAgICAgIChxY091dC0+cWNFbGVtZW50W2ldLT5leHRlbnNpb25bbl0udHlwZSA9PSBFWFRfU0JSX0RBVEFfQ1JDKSkgewogICAgICAgICAgICAgLyogV3JpdGUgc2JyIGV4dGVuc2lvbiBwYXlsb2FkICovCi0gICAgICAgICAgICBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhKCBoVHBFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dC0+cWNFbGVtZW50W2ldLT5leHRlbnNpb25bbl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25BbmNob3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnICk7CisgICAgICAgICAgICBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhKAorICAgICAgICAgICAgICAgIGhUcEVuYywgJnFjT3V0LT5xY0VsZW1lbnRbaV0tPmV4dGVuc2lvbltuXSwgMCwgYWxpZ25BbmNob3IsCisgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsIGFvdCwgZXBDb25maWcpOwogCiAgICAgICAgICAgICBjaGFubmVsRWxlbWVudEV4dGVuc2lvbldyaXR0ZW5baV1bbl0gPSAxOwogICAgICAgICAgIH0gLyogU0JSICovCi0gICAgICAgIH0gLyogbiAqLwotICAgICAgfSAvKiBpICovCi0gICAgfSAvKiBBQ19FTEQgKi8KKyAgICAgICAgfSAgIC8qIG4gKi8KKyAgICAgIH0gICAgIC8qIGkgKi8KKyAgICB9ICAgICAgIC8qIEFDX0VMRCAqLwogCi0gICAgZm9yIChpPTA7IGk8Y2hhbm5lbE1hcHBpbmctPm5FbGVtZW50czsgaSsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxNYXBwaW5nLT5uRWxlbWVudHM7IGkrKykgewogICAgICAgZm9yIChuID0gMDsgbiA8IHFjT3V0LT5xY0VsZW1lbnRbaV0tPm5FeHRlbnNpb25zOyBuKyspIHsKLQotICAgICAgICBpZiAoY2hhbm5lbEVsZW1lbnRFeHRlbnNpb25Xcml0dGVuW2ldW25dPT0wKQotICAgICAgICB7CisgICAgICAgIGlmIChjaGFubmVsRWxlbWVudEV4dGVuc2lvbldyaXR0ZW5baV1bbl0gPT0gMCkgewogICAgICAgICAgIC8qIFdyaXRlIGFsbCByYW1haW5pbmcgZXh0ZW5zaW9uIHBheWxvYWRzIGluIGVsZW1lbnQgKi8KLSAgICAgICAgICBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhKCBoVHBFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNPdXQtPnFjRWxlbWVudFtpXS0+ZXh0ZW5zaW9uW25dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25BbmNob3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnICk7CisgICAgICAgICAgRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uRGF0YShoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNPdXQtPnFjRWxlbWVudFtpXS0+ZXh0ZW5zaW9uW25dLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25BbmNob3IsIHN5bnRheEZsYWdzLCBhb3QsIGVwQ29uZmlnKTsKICAgICAgICAgfQogICAgICAgfSAvKiBuICovCi0gICAgfSAvKiBpICovCi0gIH0gLyogaWYgQUNfRVIgKi8KKyAgICB9ICAgLyogaSAqLworICB9ICAgICAvKiBpZiBBQ19FUiAqLwogCiAgIC8qIEV4dGVuZCBnbG9iYWwgZXh0ZW5zaW9uIHBheWxvYWQgdGFibGUgd2l0aCBmaWxsIGJpdHMgKi8KLSAgaWYgKCBzeW50YXhGbGFncyAmIEFDX0RSTSApCi0gIHsKLSAgICAvKiBFeGNlcHRpb24gZm9yIERybSAqLwotICAgIGZvciAobiA9IDA7IG4gPCBxY091dC0+bkV4dGVuc2lvbnM7IG4rKykgewotICAgICAgaWYgKCAocWNPdXQtPmV4dGVuc2lvbltuXS50eXBlID09IEVYVF9TQlJfREFUQSkKLSAgICAgICAgfHwgKHFjT3V0LT5leHRlbnNpb25bbl0udHlwZSA9PSBFWFRfU0JSX0RBVEFfQ1JDKSApIHsKLSAgICAgICAgLyogU0JSIGRhdGEgbXVzdCBiZSB0aGUgbGFzdCBleHRlbnNpb24hICovCi0gICAgICAgIEZES21lbWNweSgmcWNPdXQtPmV4dGVuc2lvbltxY091dC0+bkV4dGVuc2lvbnNdLCAmcWNPdXQtPmV4dGVuc2lvbltuXSwgc2l6ZW9mKFFDX09VVF9FWFRFTlNJT04pKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIERvIGJ5dGUgYWxpZ25tZW50IGFmdGVyIEFBQyAoKyBNUFMpIHBheWxvYWQuCi0gICAgICAgQXNzdXJlIHRoYXQgTVBTIGhhcyBiZWVuIHdyaXR0ZW4gYXMgY2hhbm5lbCBhc3NpZ25lZCBleHRlbnNpb24gcGF5bG9hZCEgKi8KLSAgICBpZiAoKChGREtnZXRWYWxpZEJpdHMoaEJzKS1hbGlnbkFuY2hvcisoVUlOVClxY091dC0+dG90RmlsbEJpdHMpJjB4NykhPShVSU5UKXFjT3V0LT5hbGlnbkJpdHMpIHsKLSAgICAgIHJldHVybiBBQUNfRU5DX1dSSVRURU5fQklUU19FUlJPUjsKLSAgICB9Ci0gICAgRkRLYWFjRW5jX0J5dGVBbGlnbm1lbnQoaEJzLCBxY091dC0+YWxpZ25CaXRzKTsKLSAgICBkb0J5dGVBbGlnbiA9IDA7Ci0KLSAgfSAvKiBBQ19EUk0gKi8KKyAgbiA9IHFjT3V0LT5uRXh0ZW5zaW9uczsKIAogICAvKiBBZGQgZmlsbCBkYXRhIC8gc3R1ZmZpbmcgYml0cyAqLwotICBuID0gcWNPdXQtPm5FeHRlbnNpb25zOwogICBxY091dC0+ZXh0ZW5zaW9uW25dLnR5cGUgPSBFWFRfRklMTF9EQVRBOwogICBxY091dC0+ZXh0ZW5zaW9uW25dLm5QYXlsb2FkQml0cyA9IHFjT3V0LT50b3RGaWxsQml0czsKICAgcWNPdXQtPm5FeHRlbnNpb25zKys7CiAKICAgLyogV3JpdGUgZ2xvYmFsIGV4dGVuc2lvbiBwYXlsb2FkIGFuZCBmaWxsIGRhdGEgKi8KLSAgZm9yIChuID0gMDsgKG4gPCBxY091dC0+bkV4dGVuc2lvbnMpICYmIChuIDwgKDIrMikpOyBuKyspCi0gIHsKLSAgICBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhKCBoVHBFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNPdXQtPmV4dGVuc2lvbltuXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduQW5jaG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZyApOworICBmb3IgKG4gPSAwOyAobiA8IHFjT3V0LT5uRXh0ZW5zaW9ucykgJiYgKG4gPCAoMiArIDIpKTsgbisrKSB7CisgICAgRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uRGF0YShoVHBFbmMsICZxY091dC0+ZXh0ZW5zaW9uW25dLCAwLCBhbGlnbkFuY2hvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLCBhb3QsIGVwQ29uZmlnKTsKIAotICAgIC8qIEZvciBFWFRfRklMIG9yIEVYVF9GSUxMX0RBVEEgd2UgY291bGQgZG8gYW4gYWRkaXRpb25hbCBzYW5pdHkgY2hlY2sgaGVyZSAqLworICAgIC8qIEZvciBFWFRfRklMIG9yIEVYVF9GSUxMX0RBVEEgd2UgY291bGQgZG8gYW4gYWRkaXRpb25hbCBzYW5pdHkgY2hlY2sgaGVyZQorICAgICAqLwogICB9CiAKLSAgaWYgKCEoc3ludGF4RmxhZ3MgJiAoQUNfU0NBTEFCTEV8QUNfRVIpKSkgeworICBpZiAoIShzeW50YXhGbGFncyAmIChBQ19TQ0FMQUJMRSB8IEFDX0VSKSkpIHsKICAgICBGREt3cml0ZUJpdHMoaEJzLCBJRF9FTkQsIEVMX0lEX0JJVFMpOwogICB9CiAKICAgaWYgKGRvQnl0ZUFsaWduKSB7CiAgICAgLyogQXNzdXJlIGJ5dGUgYWxpZ25tZW50Ki8KLSAgICBpZiAoKChhbGlnbkFuY2hvci1GREtnZXRWYWxpZEJpdHMoaEJzKSkmMHg3KSE9KFVJTlQpcWNPdXQtPmFsaWduQml0cykgeworICAgIGlmICgoKEZES2dldFZhbGlkQml0cyhoQnMpIC0gYWxpZ25BbmNob3IgKyBxY091dC0+YWxpZ25CaXRzKSAmIDB4NykgIT0gMCkgewogICAgICAgcmV0dXJuIEFBQ19FTkNfV1JJVFRFTl9CSVRTX0VSUk9SOwogICAgIH0KIApAQCAtMTQ2NSwxMCArMTMxMiw5IEBACiAKICAgdHJhbnNwb3J0RW5jX0VuZEFjY2Vzc1VuaXQoaFRwRW5jLCAmZnJhbWVCaXRzKTsKIAotICBpZiAoZnJhbWVCaXRzICE9IHFjT3V0LT50b3RhbEJpdHMgKyBxY0tlcm5lbC0+Z2xvYkhkckJpdHMpeworICBpZiAoZnJhbWVCaXRzICE9IHFjT3V0LT50b3RhbEJpdHMgKyBxY0tlcm5lbC0+Z2xvYkhkckJpdHMpIHsKICAgICByZXR1cm4gQUFDX0VOQ19XUklUVEVOX0JJVFNfRVJST1I7CiAgIH0KIAogICByZXR1cm4gRXJyb3JTdGF0dXM7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvYml0ZW5jLmggYi9saWJBQUNlbmMvc3JjL2JpdGVuYy5oCmluZGV4IDQ5OGJlN2MuLjc1ZGMwNjggMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvYml0ZW5jLmgKKysrIGIvbGliQUFDZW5jL3NyYy9iaXRlbmMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3NCArOTAsNzAgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogQml0c3RyZWFtIGVuY29kZXIKKyAgIEF1dGhvcihzKTogICBNLiBXZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IEJpdHN0cmVhbSBlbmNvZGVyCiAKLSNpZm5kZWYgX0JJVEVOQ19ICi0jZGVmaW5lIF9CSVRFTkNfSAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmbmRlZiBCSVRFTkNfSAorI2RlZmluZSBCSVRFTkNfSAogCiAjaW5jbHVkZSAicWNfZGF0YS5oIgogI2luY2x1ZGUgImFhY2VuY190bnMuaCIKICNpbmNsdWRlICJjaGFubmVsX21hcC5oIgotI2luY2x1ZGUgImludGVyZmFjZS5oIiAgICAvKiBvYnNvbGV0ZSwgd2hlbiBQU1lfT1VUIGlzIHRocm93biBvdXQgb2YgdGhlIFdyaXRCUy1jYWxsISAqLworI2luY2x1ZGUgImludGVyZmFjZS5oIiAvKiBvYnNvbGV0ZSwgd2hlbiBQU1lfT1VUIGlzIHRocm93biBvdXQgb2YgdGhlIFdyaXRCUy1jYWxsISAqLwogI2luY2x1ZGUgIkZES19hdWRpby5oIgogI2luY2x1ZGUgImFhY2VuYy5oIgogCiAjaW5jbHVkZSAidHBlbmNfbGliLmgiCiAKLXR5cGVkZWYgZW51bXsKLSAgTUFYX0VOQ09ERVJfQ0hBTk5FTFMgID0gOSwKLSAgTUFYX0JMT0NLX1RZUEVTICAgICAgID0gNCwKLSAgTUFYX0FBQ19MQVlFUlMgICAgICAgID0gOSwKLSAgTUFYX0xBWUVSUyAgICAgICAgICAgID0gTUFYX0FBQ19MQVlFUlMgICwgLyogb25seSBvbmUgY29yZSBsYXllciBpZiBwcmVzZW50ICovCi0gIEZJUlNUX0xBWSAgICAgICAgICAgICA9IDEgICAvKiBkZWZhdWx0IGxheWVyIG51bWJlciBmb3IgQUFDIG5vbnNjYWxhYmxlICovCit0eXBlZGVmIGVudW0geworICBNQVhfRU5DT0RFUl9DSEFOTkVMUyA9IDksCisgIE1BWF9CTE9DS19UWVBFUyA9IDQsCisgIE1BWF9BQUNfTEFZRVJTID0gOSwKKyAgTUFYX0xBWUVSUyA9IE1BWF9BQUNfTEFZRVJTLCAvKiBvbmx5IG9uZSBjb3JlIGxheWVyIGlmIHByZXNlbnQgKi8KKyAgRklSU1RfTEFZID0gMSAgICAgICAgICAgICAgICAvKiBkZWZhdWx0IGxheWVyIG51bWJlciBmb3IgQUFDIG5vbnNjYWxhYmxlICovCiB9IF9NQVhfQ09OU1Q7CiAKLSNkZWZpbmUgQlVGRkVSX01YX0hVRkZDQl9TSVpFICgzMipzaXplb2YoSU5UKSkgIC8qIG91ciBGREtfYml0YnVmZmVyIG5lZWRzIHNpemUgb2YgcG93ZXIgMiAqLworI2RlZmluZSBCVUZGRVJfTVhfSFVGRkNCX1NJWkUgXAorICAoMzIgKiBzaXplb2YoSU5UKSkgLyogb3VyIEZES19iaXRidWZmZXIgbmVlZHMgc2l6ZSBvZiBwb3dlciAyICovCiAKLSNkZWZpbmUgRUxfSURfQklUUyAgKCAzICkKLQorI2RlZmluZSBFTF9JRF9CSVRTICgzKQogCiAvKioKLSAqIFxicmllZiBBcmJpdHJhcnkgb3JkZXIgYml0c3RyZWFtIHdyaXRlci4gVGhpcyBmdW5jdGlvbiBjYW4gZWl0aGVyIGFzc2VtYmxlIGEgYml0IHN0cmVhbQotICogICAgICAgIGFuZCB3cml0ZSBpbnRvIHRoZSBiaXQgYnVmZmVyIG9mIGhUcEVuYyBvciBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzdGF0aWMgYml0cyAoc2lnbmFsIGluZGVwZW5kZW50KQotICogICAgICAgIFRwRW5jIGhhbmRsZSBtdXN0IGJlIE5VTEwgaW4gdGhpcyBjYXNlLiBPciBhbHNvIENhbGN1bGF0ZSB0aGUgbWluaW11bSBwb3NzaWJsZSBudW1iZXIgb2YKLSAqICAgICAgICBzdGF0aWMgYml0cyB3aGljaCBieSBkaXNhYmxpbmcgYWxsIHRvb2xzIGUuZy4gTVMsIFROUyBhbmQgc2JmQ250PTAuIFRoZSBtaW5DbnQgcGFyYW1ldGVyCi0gKiAgICAgICAgaGFzIHRvIGJlIDEgaW4gdGhpcyBsYXR0ZXIgY2FzZS4KLSAqIFxwYXJhbSBoVHBFbmMgVHJhbnNwb3J0IGVuY29kZXIgaGFuZGxlLiBJZiBOVUxMLCB0aGUgbnVtYmVyIG9mIHN0YXRpYyBiaXRzIHdpbGwgYmUgcmV0dXJuZWQgaW50bwotICogICAgICAgICpwQml0RGVtYW5kLgorICogXGJyaWVmIEFyYml0cmFyeSBvcmRlciBiaXRzdHJlYW0gd3JpdGVyLiBUaGlzIGZ1bmN0aW9uIGNhbiBlaXRoZXIgYXNzZW1ibGUgYQorICogYml0IHN0cmVhbSBhbmQgd3JpdGUgaW50byB0aGUgYml0IGJ1ZmZlciBvZiBoVHBFbmMgb3IgY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YKKyAqIHN0YXRpYyBiaXRzIChzaWduYWwgaW5kZXBlbmRlbnQpIFRwRW5jIGhhbmRsZSBtdXN0IGJlIE5VTEwgaW4gdGhpcworICogY2FzZS4gT3IgYWxzbyBDYWxjdWxhdGUgdGhlIG1pbmltdW0gcG9zc2libGUgbnVtYmVyIG9mIHN0YXRpYyBiaXRzCisgKiB3aGljaCBieSBkaXNhYmxpbmcgYWxsIHRvb2xzIGUuZy4gTVMsIFROUyBhbmQgc2JmQ250PTAuIFRoZSBtaW5DbnQKKyAqIHBhcmFtZXRlciBoYXMgdG8gYmUgMSBpbiB0aGlzIGxhdHRlciBjYXNlLgorICogXHBhcmFtIGhUcEVuYyBUcmFuc3BvcnQgZW5jb2RlciBoYW5kbGUuIElmIE5VTEwsIHRoZSBudW1iZXIgb2Ygc3RhdGljIGJpdHMKKyAqIHdpbGwgYmUgcmV0dXJuZWQgaW50byAqcEJpdERlbWFuZC4KICAqIFxwYXJhbSBwRWxJbmZvCiAgKiBccGFyYW0gcWNPdXRDaGFubmVsCiAgKiBccGFyYW0gaFJlb3JkZXJJbmZvCiAgKiBccGFyYW0gcHN5T3V0RWxlbWVudAogICogXHBhcmFtIHBzeU91dENoYW5uZWwKLSAqIFxwYXJhbSBzeW50YXhGbGFncyBCaXQgc3RyZWFtIHN5bnRheCBmbGFncyBhcyBkZWZpbmVkIGluIEZES19hdWRpby5oIChBdWRpbyBDb2RlYyBmbGFncykuCisgKiBccGFyYW0gc3ludGF4RmxhZ3MgQml0IHN0cmVhbSBzeW50YXggZmxhZ3MgYXMgZGVmaW5lZCBpbiBGREtfYXVkaW8uaCAoQXVkaW8KKyAqIENvZGVjIGZsYWdzKS4KICAqIFxwYXJhbSBhb3QKICAqIFxwYXJhbSBlcENvbmZpZwotICogXHBhcmFtIHBCaXREZW1hbmQgUG9pbnRlciB0byBhbiBpbnQgd2hlcmUgdGhlIGFtb3VudCBvZiBiaXRzIGlzIHJldHVybmVkIGludG8uIFRoZSByZXR1cm5lZCB2YWx1ZQotICogICAgICAgIGRlcGVuZHMgb24gaWYgaFRwRW5jIGlzIE5VTEwgYW5kIG1pbkNudC4KLSAqIFxwYXJhbSBtaW5DbnQgSWYgbm9uLXplcm8gdGhlIHZhbHVlIHJldHVybmVkIGludG8gKnBCaXREZW1hbmQgaXMgdGhlIGFic29sdXRlIG1pbmltdW0gcmVxdWlyZWQgYW1vdW50IG9mCi0gKiAgICAgICAgc3RhdGljIGJpdHMgaW4gb3JkZXIgdG8gd3JpdGUgYSB2YWxpZCBiaXQgc3RyZWFtLgorICogXHBhcmFtIHBCaXREZW1hbmQgUG9pbnRlciB0byBhbiBpbnQgd2hlcmUgdGhlIGFtb3VudCBvZiBiaXRzIGlzIHJldHVybmVkCisgKiBpbnRvLiBUaGUgcmV0dXJuZWQgdmFsdWUgZGVwZW5kcyBvbiBpZiBoVHBFbmMgaXMgTlVMTCBhbmQgbWluQ250LgorICogXHBhcmFtIG1pbkNudCBJZiBub24temVybyB0aGUgdmFsdWUgcmV0dXJuZWQgaW50byAqcEJpdERlbWFuZCBpcyB0aGUgYWJzb2x1dGUKKyAqIG1pbmltdW0gcmVxdWlyZWQgYW1vdW50IG9mIHN0YXRpYyBiaXRzIGluIG9yZGVyIHRvIHdyaXRlIGEgdmFsaWQgYml0IHN0cmVhbS4KICAqIFxyZXR1cm4gQUFDX0VOQ09ERVJfRVJST1IgZXJyb3IgY29kZQogICovCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfQ2hhbm5lbEVsZW1lbnRXcml0ZSggSEFORExFX1RSQU5TUE9SVEVOQyAgaFRwRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyAgICAgICAgKnBFbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgICAgICAqcWNPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICAgICAqcHN5T3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgICAgICpwc3lPdXRDaGFubmVsWygyKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgICAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgICAgIGVwQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgKnBCaXREZW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgbWluQ250Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfQ2hhbm5lbEVsZW1lbnRXcml0ZSgKKyAgICBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywgRUxFTUVOVF9JTkZPICpwRWxJbmZvLAorICAgIFFDX09VVF9DSEFOTkVMICpxY091dENoYW5uZWxbKDIpXSwgUFNZX09VVF9FTEVNRU5UICpwc3lPdXRFbGVtZW50LAorICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbm5lbFsoMildLCBVSU5UIHN5bnRheEZsYWdzLAorICAgIEFVRElPX09CSkVDVF9UWVBFIGFvdCwgU0NIQVIgZXBDb25maWcsIElOVCAqcEJpdERlbWFuZCwgVUNIQVIgbWluQ250KTsKIC8qKgogICogXGJyaWVmIFdyaXRlIGJpdCBzdHJlYW0gb3IgYWNjb3VudCBzdGF0aWMgYml0cwogICogXHBhcmFtIGhUcEVuYyB0cmFuc3BvcnQgZW5jb2RlciBoYW5kbGUuIElmIE5VTEwsIHRoZSBmdW5jdGlvbiB3aWxsCkBAIC0xNjEsMjMgKzE2OCwxNyBAQAogICogXHBhcmFtIHN5bnRheEZsYWdzIEZsYWdzIGluZGljYXRpbmcgZm9ybWF0IHNwZWNpZmljIGRldGFpbAogICogXHBhcmFtIGVwQ29uZmlnIEVycm9yIHByb3RlY3Rpb24gY29uZmlnCiAgKi8KLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Xcml0ZUJpdHN0cmVhbSAoSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyAqY2hhbm5lbE1hcHBpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCogcWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQqIHBzeU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfU1RBVEUqIHFjS2VybmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICBzeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgIGVwQ29uZmlnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Xcml0ZUJpdHN0cmVhbShIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcgKmNoYW5uZWxNYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCAqcWNPdXQsIFBTWV9PVVQgKnBzeU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19TVEFURSAqcWNLZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc3ludGF4RmxhZ3MsIFNDSEFSIGVwQ29uZmlnKTsKIAotSU5UIEZES2FhY0VuY193cml0ZUV4dGVuc2lvbkRhdGEoIEhBTkRMRV9UUkFOU1BPUlRFTkMgIGhUcEVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRVhURU5TSU9OICAgICpwRXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgIGVsSW5zdGFuY2VUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgYWxpZ25BbmNob3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgICAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgICAgIGVwQ29uZmlnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CitJTlQgRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uRGF0YShIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FWFRFTlNJT04gKnBFeHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZWxJbnN0YW5jZVRhZywgVUlOVCBhbGlnbkFuY2hvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc3ludGF4RmxhZ3MsIEFVRElPX09CSkVDVF9UWVBFIGFvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSIGVwQ29uZmlnKTsKIAotI2VuZGlmIC8qIF9CSVRFTkNfSCAqLworI2VuZGlmIC8qIEJJVEVOQ19IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2Jsb2NrX3N3aXRjaC5jcHAgYi9saWJBQUNlbmMvc3JjL2Jsb2NrX3N3aXRjaC5jcHAKaW5kZXggN2IzZTI3NS4uYzEzMjI1MyAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9ibG9ja19zd2l0Y2guY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvYmxvY2tfc3dpdGNoLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw0NjAgKzkwLDQ4OCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIE0uIFdlcm5lciwgVG9iaWFzIENoYWx1cGthCisKICAgIERlc2NyaXB0aW9uOiBCbG9jayBzd2l0Y2hpbmcKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKioqKioqKioqKioqKioqKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImJsb2NrX3N3aXRjaC5oIgogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAKLQogI2RlZmluZSBMT1dPVl9XSU5ET1cgX0xPV09WX1dJTkRPVwogCiAvKioqKioqKioqKioqKioqKiBpbnRlcm5hbCBmdW5jdGlvbiBwcm90b3R5cGVzICoqKioqKioqKioqLwogCi1zdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX0dldFdpbmRvd0VuZXJneShjb25zdCBGSVhQX0RCTCBpbltdLCBjb25zdCBJTlQgYmxTd1duZElkeCk7CitzdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX0dldFdpbmRvd0VuZXJneShjb25zdCBGSVhQX0RCTCBpbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGJsU3dXbmRJZHgpOwogCiBzdGF0aWMgdm9pZCBGREthYWNFbmNfQ2FsY1dpbmRvd0VuZXJneSgKLSAgICAgICAgQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKlJFU1RSSUNUIGJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd0xlbiwKLSAgICAgICAgY29uc3QgSU5UX1BDTSAgICAgICAgICAgKnBUaW1lU2lnbmFsCi0gICAgICAgICk7CisgICAgQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKlJFU1RSSUNUIGJsb2NrU3dpdGNoaW5nQ29udHJvbCwgSU5UIHdpbmRvd0xlbiwKKyAgICBjb25zdCBJTlRfUENNICpwVGltZVNpZ25hbCk7CiAKIC8qKioqKioqKioqKioqKioqKiogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HICAgICAgICAgU1RBUlQgICAgICAgIFNIT1JUICAgICAgICAgU1RPUCAgICAgICAgIExPV09WICAgICAgICAgICAgICAgICAgKi8KLXN0YXRpYyBjb25zdCBJTlQgYmxvY2tUeXBlMndpbmRvd1NoYXBlWzJdWzVdID0geyB7U0lORV9XSU5ET1csIEtCRF9XSU5ET1csICBXUk9OR19XSU5ET1csIFNJTkVfV0lORE9XLCBLQkRfV0lORE9XfSwgICAgIC8qIExEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0tCRF9XSU5ET1csICBTSU5FX1dJTkRPVywgU0lORV9XSU5ET1csICBLQkRfV0lORE9XLCAgV1JPTkdfV0lORE9XfSB9OyAvKiBMQyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HICAgICAgICAgU1RBUlQKKyAqIFNIT1JUICAgICAgICAgU1RPUCAgICAgICAgIExPV09WICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyBjb25zdCBJTlQgYmxvY2tUeXBlMndpbmRvd1NoYXBlWzJdWzVdID0geworICAgIHtTSU5FX1dJTkRPVywgS0JEX1dJTkRPVywgV1JPTkdfV0lORE9XLCBTSU5FX1dJTkRPVywgS0JEX1dJTkRPV30sICAvKiBMRCAqLworICAgIHtLQkRfV0lORE9XLCBTSU5FX1dJTkRPVywgU0lORV9XSU5ET1csIEtCRF9XSU5ET1csIFdST05HX1dJTkRPV319OyAvKiBMQyAqLwogCiAvKiBJSVIgaGlnaCBwYXNzIGNvZWZmcyAqLwogCiAjaWZuZGVmIFNJTkVUQUJMRV8xNkJJVAogCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgaGlQYXNzQ29lZmZbQkxPQ0tfU1dJVENISU5HX0lJUl9MRU5dPQotewotICBGTDJGWENPTlNUX0RCTCgtMC41MDk1KSxGTDJGWENPTlNUX0RCTCgwLjc1NDgpCi19Oworc3RhdGljIGNvbnN0IEZJWFBfREJMIGhpUGFzc0NvZWZmW0JMT0NLX1NXSVRDSElOR19JSVJfTEVOXSA9IHsKKyAgICBGTDJGWENPTlNUX0RCTCgtMC41MDk1KSwgRkwyRlhDT05TVF9EQkwoMC43NTQ4KX07CiAKLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBhY2NXaW5kb3dOcmdGYWMgPSBGTDJGWENPTlNUX0RCTCgwLjNmKTsgICAgICAgICAgICAgICAgICAgLyogZmFjdG9yIGZvciBhY2N1bXVsYXRpbmcgZmlsdGVyZWQgd2luZG93IGVuZXJnaWVzICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgYWNjV2luZG93TnJnRmFjID0KKyAgICBGTDJGWENPTlNUX0RCTCgwLjNmKTsgLyogZmFjdG9yIGZvciBhY2N1bXVsYXRpbmcgZmlsdGVyZWQgd2luZG93IGVuZXJnaWVzICovCiBzdGF0aWMgY29uc3QgRklYUF9EQkwgb25lTWludXNBY2NXaW5kb3dOcmdGYWMgPSBGTDJGWENPTlNUX0RCTCgwLjdmKTsKLS8qIHN0YXRpYyBjb25zdCBmbG9hdCBhdHRhY2tSYXRpbyA9IDEwLjA7ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG93ZXIgcmF0aW8gbGltaXQgZm9yIGF0dGFja3MgKi8KLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBpbnZBdHRhY2tSYXRpbyA9IEZMMkZYQ09OU1RfREJMKDAuMWYpOyAgICAgICAgICAgICAgICAgICAgLyogaW52ZXJ0ZWQgbG93ZXIgcmF0aW8gbGltaXQgZm9yIGF0dGFja3MgKi8KKy8qIHN0YXRpYyBjb25zdCBmbG9hdCBhdHRhY2tSYXRpbyA9IDEwLjA7ICovIC8qIGxvd2VyIHJhdGlvIGxpbWl0IGZvciBhdHRhY2tzICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgaW52QXR0YWNrUmF0aW8gPQorICAgIEZMMkZYQ09OU1RfREJMKDAuMWYpOyAvKiBpbnZlcnRlZCBsb3dlciByYXRpbyBsaW1pdCBmb3IgYXR0YWNrcyAqLwogCi0vKiBUaGUgbmV4dCBjb25zdGFudHMgYXJlIHNjYWxlZCwgYmVjYXVzZSB0aGV5IGFyZSB1c2VkIGZvciBjb21wYXJpc29uIHdpdGggc2NhbGVkIHZhbHVlcyovCisvKiBUaGUgbmV4dCBjb25zdGFudHMgYXJlIHNjYWxlZCwgYmVjYXVzZSB0aGV5IGFyZSB1c2VkIGZvciBjb21wYXJpc29uIHdpdGgKKyAqIHNjYWxlZCB2YWx1ZXMqLwogLyogbWluaW11bSBlbmVyZ3kgZm9yIGF0dGFja3MgKi8KLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBtaW5BdHRhY2tOcmcgPSAoRkwyRlhDT05TVF9EQkwoMWUrNmYqTk9STV9QQ01fRU5FUkdZKT4+QkxPQ0tfU1dJVENIX0VORVJHWV9TSElGVCk7IC8qIG1pbmltdW0gZW5lcmd5IGZvciBhdHRhY2tzICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgbWluQXR0YWNrTnJnID0KKyAgICAoRkwyRlhDT05TVF9EQkwoMWUrNmYgKiBOT1JNX1BDTV9FTkVSR1kpID4+CisgICAgIEJMT0NLX1NXSVRDSF9FTkVSR1lfU0hJRlQpOyAvKiBtaW5pbXVtIGVuZXJneSBmb3IgYXR0YWNrcyAqLwogCiAjZWxzZQogCi1zdGF0aWMgY29uc3QgRklYUF9TR0wgaGlQYXNzQ29lZmZbQkxPQ0tfU1dJVENISU5HX0lJUl9MRU5dPQotewotICBGTDJGWENPTlNUX1NHTCgtMC41MDk1KSxGTDJGWENPTlNUX1NHTCgwLjc1NDgpCi19Oworc3RhdGljIGNvbnN0IEZJWFBfU0dMIGhpUGFzc0NvZWZmW0JMT0NLX1NXSVRDSElOR19JSVJfTEVOXSA9IHsKKyAgICBGTDJGWENPTlNUX1NHTCgtMC41MDk1KSwgRkwyRlhDT05TVF9TR0woMC43NTQ4KX07CiAKLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBhY2NXaW5kb3dOcmdGYWMgPSBGTDJGWENPTlNUX0RCTCgwLjNmKTsgICAgICAgICAgICAgICAgICAgLyogZmFjdG9yIGZvciBhY2N1bXVsYXRpbmcgZmlsdGVyZWQgd2luZG93IGVuZXJnaWVzICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgYWNjV2luZG93TnJnRmFjID0KKyAgICBGTDJGWENPTlNUX0RCTCgwLjNmKTsgLyogZmFjdG9yIGZvciBhY2N1bXVsYXRpbmcgZmlsdGVyZWQgd2luZG93IGVuZXJnaWVzICovCiBzdGF0aWMgY29uc3QgRklYUF9TR0wgb25lTWludXNBY2NXaW5kb3dOcmdGYWMgPSBGTDJGWENPTlNUX1NHTCgwLjdmKTsKLS8qIHN0YXRpYyBjb25zdCBmbG9hdCBhdHRhY2tSYXRpbyA9IDEwLjA7ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG93ZXIgcmF0aW8gbGltaXQgZm9yIGF0dGFja3MgKi8KLXN0YXRpYyBjb25zdCBGSVhQX1NHTCBpbnZBdHRhY2tSYXRpbyA9IEZMMkZYQ09OU1RfU0dMKDAuMWYpOyAgICAgICAgICAgICAgICAgICAgLyogaW52ZXJ0ZWQgbG93ZXIgcmF0aW8gbGltaXQgZm9yIGF0dGFja3MgKi8KKy8qIHN0YXRpYyBjb25zdCBmbG9hdCBhdHRhY2tSYXRpbyA9IDEwLjA7ICovIC8qIGxvd2VyIHJhdGlvIGxpbWl0IGZvciBhdHRhY2tzICovCitzdGF0aWMgY29uc3QgRklYUF9TR0wgaW52QXR0YWNrUmF0aW8gPQorICAgIEZMMkZYQ09OU1RfU0dMKDAuMWYpOyAvKiBpbnZlcnRlZCBsb3dlciByYXRpbyBsaW1pdCBmb3IgYXR0YWNrcyAqLwogLyogbWluaW11bSBlbmVyZ3kgZm9yIGF0dGFja3MgKi8KLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBtaW5BdHRhY2tOcmcgPSAoRkwyRlhDT05TVF9EQkwoMWUrNmYqTk9STV9QQ01fRU5FUkdZKT4+QkxPQ0tfU1dJVENIX0VORVJHWV9TSElGVCk7IC8qIG1pbmltdW0gZW5lcmd5IGZvciBhdHRhY2tzICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgbWluQXR0YWNrTnJnID0KKyAgICAoRkwyRlhDT05TVF9EQkwoMWUrNmYgKiBOT1JNX1BDTV9FTkVSR1kpID4+CisgICAgIEJMT0NLX1NXSVRDSF9FTkVSR1lfU0hJRlQpOyAvKiBtaW5pbXVtIGVuZXJneSBmb3IgYXR0YWNrcyAqLwogCiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKiogaW50ZXJuYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqKioqKioqKioqKi8KIAogLyoqKioqKioqKioqKioqKioqKiBSb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBGREthYWNFbmNfSW5pdEJsb2NrU3dpdGNoaW5nKEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2wsIElOVCBpc0xvd0RlbGF5KQotewotICBGREttZW1jbGVhciAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLCBzaXplb2YoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wpKTsKK3ZvaWQgRkRLYWFjRW5jX0luaXRCbG9ja1N3aXRjaGluZygKKyAgICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sLCBJTlQgaXNMb3dEZWxheSkgeworICBGREttZW1jbGVhcihibG9ja1N3aXRjaGluZ0NvbnRyb2wsIHNpemVvZihCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCkpOwogCi0gIGlmIChpc0xvd0RlbGF5KQotICB7CisgIGlmIChpc0xvd0RlbGF5KSB7CiAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5uQmxvY2tTd2l0Y2hXaW5kb3dzID0gNDsKLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFsbG93U2hvcnRGcmFtZXMgICAgPSAwOwotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dMb29rQWhlYWQgICAgICA9IDA7Ci0gIH0KLSAgZWxzZQotICB7CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hbGxvd1Nob3J0RnJhbWVzID0gMDsKKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFsbG93TG9va0FoZWFkID0gMDsKKyAgfSBlbHNlIHsKICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5CbG9ja1N3aXRjaFdpbmRvd3MgPSA4OwotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dTaG9ydEZyYW1lcyAgICA9IDE7Ci0gICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hbGxvd0xvb2tBaGVhZCAgICAgID0gMTsKKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFsbG93U2hvcnRGcmFtZXMgPSAxOworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dMb29rQWhlYWQgPSAxOwogICB9CiAKLSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ub09mR3JvdXBzICAgICAgICAgICAgPSBNQVhfTk9fT0ZfR1JPVVBTOworICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5vT2ZHcm91cHMgPSBNQVhfTk9fT0ZfR1JPVVBTOwogCiAgIC8qIEluaXRpYWxpemUgc3RhcnR2YWx1ZSBmb3IgYmxvY2t0eXBlICovCi0gIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlICAgID0gTE9OR19XSU5ET1c7Ci0gIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2hhcGUgICAgICAgICAgID0gYmxvY2tUeXBlMndpbmRvd1NoYXBlW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dTaG9ydEZyYW1lc11bYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0V2luZG93U2VxdWVuY2VdOwotCisgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlID0gTE9OR19XSU5ET1c7CisgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2hhcGUgPQorICAgICAgYmxvY2tUeXBlMndpbmRvd1NoYXBlW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dTaG9ydEZyYW1lc10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RXaW5kb3dTZXF1ZW5jZV07CiB9CiAKLXN0YXRpYyBjb25zdCBJTlQgc3VnZ2VzdGVkR3JvdXBpbmdUYWJsZVtUUkFOU19GQUNdW01BWF9OT19PRl9HUk9VUFNdID0KLXsKLSAgICAvKiBBdHRhY2sgaW4gV2luZG93IDAgKi8gezEsICAzLCAgMywgIDF9LAotICAgIC8qIEF0dGFjayBpbiBXaW5kb3cgMSAqLyB7MSwgIDEsICAzLCAgM30sCi0gICAgLyogQXR0YWNrIGluIFdpbmRvdyAyICovIHsyLCAgMSwgIDMsICAyfSwKLSAgICAvKiBBdHRhY2sgaW4gV2luZG93IDMgKi8gezMsICAxLCAgMywgIDF9LAotICAgIC8qIEF0dGFjayBpbiBXaW5kb3cgNCAqLyB7MywgIDEsICAxLCAgM30sCi0gICAgLyogQXR0YWNrIGluIFdpbmRvdyA1ICovIHszLCAgMiwgIDEsICAyfSwKLSAgICAvKiBBdHRhY2sgaW4gV2luZG93IDYgKi8gezMsICAzLCAgMSwgIDF9LAotICAgIC8qIEF0dGFjayBpbiBXaW5kb3cgNyAqLyB7MywgIDMsICAxLCAgMX0KLX07CitzdGF0aWMgY29uc3QgSU5UIHN1Z2dlc3RlZEdyb3VwaW5nVGFibGVbVFJBTlNfRkFDXVtNQVhfTk9fT0ZfR1JPVVBTXSA9IHsKKyAgICAvKiBBdHRhY2sgaW4gV2luZG93IDAgKi8gezEsIDMsIDMsIDF9LAorICAgIC8qIEF0dGFjayBpbiBXaW5kb3cgMSAqLyB7MSwgMSwgMywgM30sCisgICAgLyogQXR0YWNrIGluIFdpbmRvdyAyICovIHsyLCAxLCAzLCAyfSwKKyAgICAvKiBBdHRhY2sgaW4gV2luZG93IDMgKi8gezMsIDEsIDMsIDF9LAorICAgIC8qIEF0dGFjayBpbiBXaW5kb3cgNCAqLyB7MywgMSwgMSwgM30sCisgICAgLyogQXR0YWNrIGluIFdpbmRvdyA1ICovIHszLCAyLCAxLCAyfSwKKyAgICAvKiBBdHRhY2sgaW4gV2luZG93IDYgKi8gezMsIDMsIDEsIDF9LAorICAgIC8qIEF0dGFjayBpbiBXaW5kb3cgNyAqLyB7MywgMywgMSwgMX19OwogCi0vKiBjaGFuZ2UgYmxvY2sgdHlwZSBkZXBlbmRpbmcgb24gY3VycmVudCBibG9ja3R5cGUgYW5kIHdoZXRoZXIgdGhlcmUncyBhbiBhdHRhY2sgKi8KKy8qIGNoYW5nZSBibG9jayB0eXBlIGRlcGVuZGluZyBvbiBjdXJyZW50IGJsb2NrdHlwZSBhbmQgd2hldGhlciB0aGVyZSdzIGFuCisgKiBhdHRhY2sgKi8KIC8qIGFzc3VtZSBubyBsb29rLWFoZWFkICovCi1zdGF0aWMgY29uc3QgSU5UIGNoZ1duZFNxWzJdW05fQkxPQ0tUWVBFU10gPQotewotICAvKiAgICAgICAgICAgICBMT05HIFdJTkRPVyAgIFNUQVJUX1dJTkRPVyAgU0hPUlRfV0lORE9XICBTVE9QX1dJTkRPVywgIExPV09WX1dJTkRPVywgV1JPTkdfV0lORE9XICovCi0gIC8qbm8gYXR0YWNrKi8ge0xPTkdfV0lORE9XLCAgU1RPUF9XSU5ET1csICBXUk9OR19XSU5ET1csIExPTkdfV0lORE9XLCAgU1RPUF9XSU5ET1cgLCBXUk9OR19XSU5ET1cgfSwKLSAgLyphdHRhY2sgICAqLyB7U1RBUlRfV0lORE9XLCBMT1dPVl9XSU5ET1csIFdST05HX1dJTkRPVywgU1RBUlRfV0lORE9XLCBMT1dPVl9XSU5ET1csIFdST05HX1dJTkRPVyB9Ci19Oworc3RhdGljIGNvbnN0IElOVCBjaGdXbmRTcVsyXVtOX0JMT0NLVFlQRVNdID0geworICAgIC8qICAgICAgICAgICAgIExPTkcgV0lORE9XICAgU1RBUlRfV0lORE9XICBTSE9SVF9XSU5ET1cgIFNUT1BfV0lORE9XLAorICAgICAgIExPV09WX1dJTkRPVywgV1JPTkdfV0lORE9XICovCisgICAgLypubyBhdHRhY2sqLyB7TE9OR19XSU5ET1csIFNUT1BfV0lORE9XLCBXUk9OR19XSU5ET1csIExPTkdfV0lORE9XLAorICAgICAgICAgICAgICAgICAgIFNUT1BfV0lORE9XLCBXUk9OR19XSU5ET1d9LAorICAgIC8qYXR0YWNrICAgKi8ge1NUQVJUX1dJTkRPVywgTE9XT1ZfV0lORE9XLCBXUk9OR19XSU5ET1csIFNUQVJUX1dJTkRPVywKKyAgICAgICAgICAgICAgICAgICBMT1dPVl9XSU5ET1csIFdST05HX1dJTkRPV319OwogCi0vKiBjaGFuZ2UgYmxvY2sgdHlwZSBkZXBlbmRpbmcgb24gY3VycmVudCBibG9ja3R5cGUgYW5kIHdoZXRoZXIgdGhlcmUncyBhbiBhdHRhY2sgKi8KKy8qIGNoYW5nZSBibG9jayB0eXBlIGRlcGVuZGluZyBvbiBjdXJyZW50IGJsb2NrdHlwZSBhbmQgd2hldGhlciB0aGVyZSdzIGFuCisgKiBhdHRhY2sgKi8KIC8qIGFzc3VtZSBsb29rLWFoZWFkICovCi1zdGF0aWMgY29uc3QgSU5UIGNoZ1duZFNxTGtBaGRbMl1bMl1bTl9CTE9DS1RZUEVTXSA9Ci17Ci0gIC8qYXR0YWNrICAgICAgICAgTE9ORyBXSU5ET1cgICAgU1RBUlRfV0lORE9XICAgU0hPUlRfV0lORE9XICAgU1RPUF9XSU5ET1cgICBMT1dPVl9XSU5ET1csIFdST05HX1dJTkRPVyAqLyAgLyogbGFzdCBhdHRhY2sgKi8KLSAgLypubyBhdHRhY2sqLyB7IHtMT05HX1dJTkRPVywgICBTSE9SVF9XSU5ET1csICBTVE9QX1dJTkRPVywgICBMT05HX1dJTkRPVywgIFdST05HX1dJTkRPVywgV1JPTkdfV0lORE9XfSwgICAvKiBubyBhdHRhY2sgICAqLwotICAvKmF0dGFjayAgICovICAge1NUQVJUX1dJTkRPVywgIFNIT1JUX1dJTkRPVywgIFNIT1JUX1dJTkRPVywgIFNUQVJUX1dJTkRPVywgV1JPTkdfV0lORE9XLCBXUk9OR19XSU5ET1d9IH0sIC8qIG5vIGF0dGFjayAgICovCi0gIC8qbm8gYXR0YWNrKi8geyB7TE9OR19XSU5ET1csICAgU0hPUlRfV0lORE9XLCAgU0hPUlRfV0lORE9XLCAgTE9OR19XSU5ET1csICBXUk9OR19XSU5ET1csIFdST05HX1dJTkRPV30sICAgLyogYXR0YWNrICAgICAgKi8KLSAgLyphdHRhY2sgICAqLyAgIHtTVEFSVF9XSU5ET1csICBTSE9SVF9XSU5ET1csICBTSE9SVF9XSU5ET1csICBTVEFSVF9XSU5ET1csIFdST05HX1dJTkRPVywgV1JPTkdfV0lORE9XfSB9ICAvKiBhdHRhY2sgICAgICAqLworc3RhdGljIGNvbnN0IElOVCBjaGdXbmRTcUxrQWhkWzJdWzJdW05fQkxPQ0tUWVBFU10gPSB7CisgICAgLyphdHRhY2sgICAgICAgICBMT05HIFdJTkRPVyAgICBTVEFSVF9XSU5ET1cgICBTSE9SVF9XSU5ET1cgICBTVE9QX1dJTkRPVyAgIExPV09WX1dJTkRPVywgV1JPTkdfV0lORE9XICovIC8qIGxhc3QgYXR0YWNrICovCisgICAgLypubyBhdHRhY2sqLyB7CisgICAgICAgIHtMT05HX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTVE9QX1dJTkRPVywgTE9OR19XSU5ET1csIFdST05HX1dJTkRPVywKKyAgICAgICAgIFdST05HX1dJTkRPV30sIC8qIG5vIGF0dGFjayAgICovCisgICAgICAgIC8qYXR0YWNrICAgKi8ge1NUQVJUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNUQVJUX1dJTkRPVywKKyAgICAgICAgICAgICAgICAgICAgICAgV1JPTkdfV0lORE9XLCBXUk9OR19XSU5ET1d9fSwgLyogbm8gYXR0YWNrICAgKi8KKyAgICAvKm5vIGF0dGFjayovIHt7TE9OR19XSU5ET1csIFNIT1JUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBMT05HX1dJTkRPVywKKyAgICAgICAgICAgICAgICAgICAgV1JPTkdfV0lORE9XLCBXUk9OR19XSU5ET1d9LCAvKiBhdHRhY2sgICAgICAqLworICAgICAgICAgICAgICAgICAgIC8qYXR0YWNrICAgKi8ge1NUQVJUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBUlRfV0lORE9XLCBXUk9OR19XSU5ET1csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JPTkdfV0lORE9XfX0gLyogYXR0YWNrICAgICAgKi8KIH07CiAKLWludCBGREthYWNFbmNfQmxvY2tTd2l0Y2hpbmcoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbCwgY29uc3QgSU5UIGdyYW51bGVMZW5ndGgsIGNvbnN0IGludCBpc0xGRSwgY29uc3QgSU5UX1BDTSAqcFRpbWVTaWduYWwpCi17Ci0gICAgVUlOVCBpOwotICAgIEZJWFBfREJMIGVuTTEsIGVuTWF4OworaW50IEZES2FhY0VuY19CbG9ja1N3aXRjaGluZyhCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZ3JhbnVsZUxlbmd0aCwgY29uc3QgaW50IGlzTEZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlRfUENNICpwVGltZVNpZ25hbCkgeworICBVSU5UIGk7CisgIEZJWFBfREJMIGVuTTEsIGVuTWF4OwogCi0gICAgVUlOVCBuQmxvY2tTd2l0Y2hXaW5kb3dzID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5uQmxvY2tTd2l0Y2hXaW5kb3dzOworICBVSU5UIG5CbG9ja1N3aXRjaFdpbmRvd3MgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5CbG9ja1N3aXRjaFdpbmRvd3M7CiAKLSAgICAvKiBmb3IgTEZFIDogb25seSBMT05HIHdpbmRvdyBhbGxvd2VkICovCi0gICAgaWYgKGlzTEZFKSB7CisgIC8qIGZvciBMRkUgOiBvbmx5IExPTkcgd2luZG93IGFsbG93ZWQgKi8KKyAgaWYgKGlzTEZFKSB7CisgICAgLyogY2FzZSBMRkU6ICovCisgICAgLyogb25seSBsb25nIGJsb2NrcywgYWx3YXlzIHVzZSBzaW5lIHdpbmRvd3MgKE1QRUcyIEFBQywgTVBFRzQgQUFDKSAqLworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlID0gTE9OR19XSU5ET1c7CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dTaGFwZSA9IFNJTkVfV0lORE9XOworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bm9PZkdyb3VwcyA9IDE7CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlblswXSA9IDE7CiAKLSAgICAgIC8qIGNhc2UgTEZFOiAqLwotICAgICAgLyogb25seSBsb25nIGJsb2NrcywgYWx3YXlzIHVzZSBzaW5lIHdpbmRvd3MgKE1QRUcyIEFBQywgTVBFRzQgQUFDKSAqLwotICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0V2luZG93U2VxdWVuY2UgPSBMT05HX1dJTkRPVzsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2hhcGUgICAgPSBTSU5FX1dJTkRPVzsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bm9PZkdyb3VwcyAgICAgPSAxOwotICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlblswXSAgICA9IDE7CisgICAgcmV0dXJuICgwKTsKKyAgfTsKIAotICAgICAgcmV0dXJuKDApOwotICAgIH07CisgIC8qIFNhdmUgY3VycmVudCBhdHRhY2sgaW5kZXggYXMgbGFzdCBhdHRhY2sgaW5kZXggKi8KKyAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0YXR0YWNrID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2s7CisgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdEF0dGFja0luZGV4ID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2tJbmRleDsKIAotICAgIC8qIFNhdmUgY3VycmVudCBhdHRhY2sgaW5kZXggYXMgbGFzdCBhdHRhY2sgaW5kZXggKi8KLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RhdHRhY2sgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjazsKLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RBdHRhY2tJbmRleCA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrSW5kZXg7CisgIC8qIFNhdmUgY3VycmVudCB3aW5kb3cgZW5lcmd5IGFzIGxhc3Qgd2luZG93IGVuZXJneSAqLworICBGREttZW1jcHkoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdbMF0sCisgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1sxXSwKKyAgICAgICAgICAgIHNpemVvZihibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1swXSkpOworICBGREttZW1jcHkoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzBdLAorICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdLAorICAgICAgICAgICAgc2l6ZW9mKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlswXSkpOwogCi0gICAgLyogU2F2ZSBjdXJyZW50IHdpbmRvdyBlbmVyZ3kgYXMgbGFzdCB3aW5kb3cgZW5lcmd5ICovCi0gICAgRkRLbWVtY3B5KGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnWzBdLCBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1sxXSwgc2l6ZW9mKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnWzBdKSk7Ci0gICAgRkRLbWVtY3B5KGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlswXSwgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdLCBzaXplb2YoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzBdKSk7CisgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFsbG93U2hvcnRGcmFtZXMpIHsKKyAgICAvKiBDYWxjdWxhdGUgc3VnZ2VzdGVkIGdyb3VwaW5nIGluZm8gZm9yIHRoZSBsYXN0IGZyYW1lICovCiAKLSAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hbGxvd1Nob3J0RnJhbWVzKQotICAgIHsKLSAgICAgIC8qIENhbGN1bGF0ZSBzdWdnZXN0ZWQgZ3JvdXBpbmcgaW5mbyBmb3IgdGhlIGxhc3QgZnJhbWUgKi8KKyAgICAvKiBSZXNldCBncm91cGluZyBpbmZvICovCisgICAgRkRLbWVtY2xlYXIoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlbiwKKyAgICAgICAgICAgICAgICBzaXplb2YoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlbikpOwogCi0gICAgICAvKiBSZXNldCBncm91cGluZyBpbmZvICovCi0gICAgICBGREttZW1jbGVhciAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlbiwgc2l6ZW9mKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW4pKTsKKyAgICAvKiBTZXQgZ3JvdXBpbmcgaW5mbyAqLworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bm9PZkdyb3VwcyA9IE1BWF9OT19PRl9HUk9VUFM7CiAKLSAgICAgIC8qIFNldCBncm91cGluZyBpbmZvICovCi0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5vT2ZHcm91cHMgPSBNQVhfTk9fT0ZfR1JPVVBTOworICAgIEZES21lbWNweShibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuLAorICAgICAgICAgICAgICBzdWdnZXN0ZWRHcm91cGluZ1RhYmxlW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdEF0dGFja0luZGV4XSwKKyAgICAgICAgICAgICAgc2l6ZW9mKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW4pKTsKIAotICAgICAgRkRLbWVtY3B5KGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW4sIHN1Z2dlc3RlZEdyb3VwaW5nVGFibGVbYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0QXR0YWNrSW5kZXhdLCBzaXplb2YoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlbikpOwotCi0gICAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPT0gVFJVRSkKLSAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm1heFdpbmRvd05yZyA9IEZES2FhY0VuY19HZXRXaW5kb3dFbmVyZ3koYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdbMF0sIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdEF0dGFja0luZGV4KTsKLSAgICAgIGVsc2UKLSAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm1heFdpbmRvd05yZyA9IEZMMkZYQ09OU1RfREJMKDAuMCk7Ci0KLSAgICB9Ci0KLQotICAgIC8qIENhbGN1bGF0ZSB1bmZpbHRlcmVkIGFuZCBmaWx0ZXJlZCBlbmVyZ2llcyBpbiBzdWJ3aW5kb3dzIGFuZCBjb21iaW5lIHRvIHNlZ21lbnRzICovCi0gICAgRkRLYWFjRW5jX0NhbGNXaW5kb3dFbmVyZ3koYmxvY2tTd2l0Y2hpbmdDb250cm9sLCBncmFudWxlTGVuZ3RoPj4obkJsb2NrU3dpdGNoV2luZG93cz09ND8gMjozICksIHBUaW1lU2lnbmFsKTsKLQotICAgIC8qIG5vdyBjYWxjdWxhdGUgaWYgdGhlcmUgaXMgYW4gYXR0YWNrICovCi0KLSAgICAvKiByZXNldCBhdHRhY2sgKi8KLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IEZBTFNFOwotCi0gICAgLyogbG9vayBmb3IgYXR0YWNrICovCi0gICAgZW5NYXggPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICBlbk0xID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzBdW25CbG9ja1N3aXRjaFdpbmRvd3MtMV07Ci0KLSAgICBmb3IgKGk9MDsgaTxuQmxvY2tTd2l0Y2hXaW5kb3dzOyBpKyspIHsKLSAgICAgICAgRklYUF9EQkwgdG1wID0gZk11bHREaXYyKG9uZU1pbnVzQWNjV2luZG93TnJnRmFjLCBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFjY1dpbmRvd05yZyk7Ci0gICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWNjV2luZG93TnJnID0gZk11bHRBZGQodG1wLCBhY2NXaW5kb3dOcmdGYWMsIGVuTTEpIDsKLQotICAgICAgICBpZiAoZk11bHQoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW2ldLGludkF0dGFja1JhdGlvKSA+IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWNjV2luZG93TnJnICkgewotICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPSBUUlVFOwotICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2tJbmRleCA9IGk7Ci0gICAgICAgIH0KLSAgICAgICAgZW5NMSA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlsxXVtpXTsKLSAgICAgICAgZW5NYXggPSBmaXhNYXgoZW5NYXgsIGVuTTEpOwotICAgIH0KLQotCi0gICAgaWYgKGVuTWF4IDwgbWluQXR0YWNrTnJnKSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IEZBTFNFOwotCi0gICAgLyogQ2hlY2sgaWYgYXR0YWNrIHNwcmVhZHMgb3ZlciBmcmFtZSBib3JkZXIgKi8KLSAgICBpZigoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPT0gRkFMU0UpICYmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RhdHRhY2sgPT0gVFJVRSkpIHsKLSAgICAgICAgLyogaWYgYXR0YWNrIGlzIGluIGxhc3Qgd2luZG93IHJlcGVhdCBTSE9SVF9XSU5ET1cgKi8KLSAgICAgICAgaWYgKCAoKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlswXVtuQmxvY2tTd2l0Y2hXaW5kb3dzLTFdPj40KSA+IGZNdWx0KChGSVhQX0RCTCkoMTA8PChERlJBQ1RfQklUUy0xLTQpKSwgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdWzFdKSkKLSAgICAgICAgICAgJiYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdEF0dGFja0luZGV4ID09IChJTlQpbkJsb2NrU3dpdGNoV2luZG93cy0xKQotICAgICAgICApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID0gVFJVRTsKLSAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrSW5kZXggPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBpZihibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFsbG93TG9va0FoZWFkKQotICAgIHsKLQotCi0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RXaW5kb3dTZXF1ZW5jZSA9Ci0gICAgICAgIGNoZ1duZFNxTGtBaGRbYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0YXR0YWNrXVtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja11bYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0V2luZG93U2VxdWVuY2VdOwotICAgIH0KKyAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPT0gVFJVRSkKKyAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bWF4V2luZG93TnJnID0KKyAgICAgICAgICBGREthYWNFbmNfR2V0V2luZG93RW5lcmd5KGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0QXR0YWNrSW5kZXgpOwogICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBMb3cgRGVsYXkgKi8KLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlID0KLSAgICAgICAgY2hnV25kU3FbYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2tdW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlXTsKKyAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bWF4V2luZG93TnJnID0gRkwyRlhDT05TVF9EQkwoMC4wKTsKKyAgfQorCisgIC8qIENhbGN1bGF0ZSB1bmZpbHRlcmVkIGFuZCBmaWx0ZXJlZCBlbmVyZ2llcyBpbiBzdWJ3aW5kb3dzIGFuZCBjb21iaW5lIHRvCisgICAqIHNlZ21lbnRzICovCisgIEZES2FhY0VuY19DYWxjV2luZG93RW5lcmd5KAorICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLAorICAgICAgZ3JhbnVsZUxlbmd0aCA+PiAobkJsb2NrU3dpdGNoV2luZG93cyA9PSA0ID8gMiA6IDMpLCBwVGltZVNpZ25hbCk7CisKKyAgLyogbm93IGNhbGN1bGF0ZSBpZiB0aGVyZSBpcyBhbiBhdHRhY2sgKi8KKworICAvKiByZXNldCBhdHRhY2sgKi8KKyAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPSBGQUxTRTsKKworICAvKiBsb29rIGZvciBhdHRhY2sgKi8KKyAgZW5NYXggPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgZW5NMSA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlswXVtuQmxvY2tTd2l0Y2hXaW5kb3dzIC0gMV07CisKKyAgZm9yIChpID0gMDsgaSA8IG5CbG9ja1N3aXRjaFdpbmRvd3M7IGkrKykgeworICAgIEZJWFBfREJMIHRtcCA9CisgICAgICAgIGZNdWx0RGl2MihvbmVNaW51c0FjY1dpbmRvd05yZ0ZhYywgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hY2NXaW5kb3dOcmcpOworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWNjV2luZG93TnJnID0gZk11bHRBZGQodG1wLCBhY2NXaW5kb3dOcmdGYWMsIGVuTTEpOworCisgICAgaWYgKGZNdWx0KGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlsxXVtpXSwgaW52QXR0YWNrUmF0aW8pID4KKyAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hY2NXaW5kb3dOcmcpIHsKKyAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID0gVFJVRTsKKyAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrSW5kZXggPSBpOwogICAgIH0KKyAgICBlbk0xID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW2ldOworICAgIGVuTWF4ID0gZml4TWF4KGVuTWF4LCBlbk0xKTsKKyAgfQogCisgIGlmIChlbk1heCA8IG1pbkF0dGFja05yZykgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPSBGQUxTRTsKIAotICAgIC8qIHVwZGF0ZSB3aW5kb3cgc2hhcGUgKi8KLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd1NoYXBlID0gYmxvY2tUeXBlMndpbmRvd1NoYXBlW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dTaG9ydEZyYW1lc11bYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0V2luZG93U2VxdWVuY2VdOworICAvKiBDaGVjayBpZiBhdHRhY2sgc3ByZWFkcyBvdmVyIGZyYW1lIGJvcmRlciAqLworICBpZiAoKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID09IEZBTFNFKSAmJgorICAgICAgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdGF0dGFjayA9PSBUUlVFKSkgeworICAgIC8qIGlmIGF0dGFjayBpcyBpbiBsYXN0IHdpbmRvdyByZXBlYXQgU0hPUlRfV0lORE9XICovCisgICAgaWYgKCgoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzBdW25CbG9ja1N3aXRjaFdpbmRvd3MgLSAxXSA+PiA0KSA+CisgICAgICAgICBmTXVsdCgoRklYUF9EQkwpKDEwIDw8IChERlJBQ1RfQklUUyAtIDEgLSA0KSksCisgICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV1bMV0pKSAmJgorICAgICAgICAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0QXR0YWNrSW5kZXggPT0KKyAgICAgICAgIChJTlQpbkJsb2NrU3dpdGNoV2luZG93cyAtIDEpKSB7CisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IFRSVUU7CisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja0luZGV4ID0gMDsKKyAgICB9CisgIH0KIAotICAgIHJldHVybigwKTsKKyAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dMb29rQWhlYWQpIHsKKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RXaW5kb3dTZXF1ZW5jZSA9CisgICAgICAgIGNoZ1duZFNxTGtBaGRbYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0YXR0YWNrXQorICAgICAgICAgICAgICAgICAgICAgW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrXQorICAgICAgICAgICAgICAgICAgICAgW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlXTsKKyAgfSBlbHNlIHsKKyAgICAvKiBMb3cgRGVsYXkgKi8KKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RXaW5kb3dTZXF1ZW5jZSA9CisgICAgICAgIGNoZ1duZFNxW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrXQorICAgICAgICAgICAgICAgIFtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RXaW5kb3dTZXF1ZW5jZV07CisgIH0KKworICAvKiB1cGRhdGUgd2luZG93IHNoYXBlICovCisgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2hhcGUgPQorICAgICAgYmxvY2tUeXBlMndpbmRvd1NoYXBlW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dTaG9ydEZyYW1lc10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RXaW5kb3dTZXF1ZW5jZV07CisKKyAgcmV0dXJuICgwKTsKIH0KIAotCi0KLXN0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfR2V0V2luZG93RW5lcmd5KGNvbnN0IEZJWFBfREJMIGluW10sIGNvbnN0IElOVCBibFN3V25kSWR4KQotewotLyogRm9yIGNvaGVyZW5jeSwgY2hhbmdlIEZES2FhY0VuY19HZXRXaW5kb3dFbmVyZ3koKSB0byBjYWxjbHVhdGUgdGhlIGVuZXJneSBmb3IgYSBibG9jayBzd2l0Y2hpbmcgYW5hbHlzaXMgd2luZG93cywKLSAgIG5vdCBmb3IgYSBzaG9ydCBibG9jay4gVGhlIHNhbWUgaXMgZG9uZSBGREthYWNFbmNfQ2FsY1dpbmRvd0VuZXJneSgpLiBUaGUgcmVzdWx0IG9mIEZES2FhY0VuY19HZXRXaW5kb3dFbmVyZ3koKQotICAgaXMgdXNlZCBmb3IgYSBjb21wYXJpc2lvbiBvZiB0aGUgbWF4IGVuZXJneSBvZiBsZWZ0L3JpZ2h0IGNoYW5uZWwuICovCitzdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX0dldFdpbmRvd0VuZXJneShjb25zdCBGSVhQX0RCTCBpbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGJsU3dXbmRJZHgpIHsKKyAgLyogRm9yIGNvaGVyZW5jeSwgY2hhbmdlIEZES2FhY0VuY19HZXRXaW5kb3dFbmVyZ3koKSB0byBjYWxjbHVhdGUgdGhlIGVuZXJneQorICAgICBmb3IgYSBibG9jayBzd2l0Y2hpbmcgYW5hbHlzaXMgd2luZG93cywgbm90IGZvciBhIHNob3J0IGJsb2NrLiBUaGUgc2FtZSBpcworICAgICBkb25lIEZES2FhY0VuY19DYWxjV2luZG93RW5lcmd5KCkuIFRoZSByZXN1bHQgb2YKKyAgICAgRkRLYWFjRW5jX0dldFdpbmRvd0VuZXJneSgpIGlzIHVzZWQgZm9yIGEgY29tcGFyaXNpb24gb2YgdGhlIG1heCBlbmVyZ3kgb2YKKyAgICAgbGVmdC9yaWdodCBjaGFubmVsLiAqLwogCiAgIHJldHVybiBpbltibFN3V25kSWR4XTsKLQogfQogCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfQ2FsY1dpbmRvd0VuZXJneShCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqUkVTVFJJQ1QgYmxvY2tTd2l0Y2hpbmdDb250cm9sLCBJTlQgd2luZG93TGVuLCBjb25zdCBJTlRfUENNICpwVGltZVNpZ25hbCkKLXsKLSAgICBJTlQgIGk7Ci0gICAgVUlOVCB3Oworc3RhdGljIHZvaWQgRkRLYWFjRW5jX0NhbGNXaW5kb3dFbmVyZ3koCisgICAgQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKlJFU1RSSUNUIGJsb2NrU3dpdGNoaW5nQ29udHJvbCwgSU5UIHdpbmRvd0xlbiwKKyAgICBjb25zdCBJTlRfUENNICpwVGltZVNpZ25hbCkgeworICBJTlQgaTsKKyAgVUlOVCB3OwogCi0gICAgRklYUF9TR0wgaGlQYXNzQ29lZmYwID0gaGlQYXNzQ29lZmZbMF07Ci0gICAgRklYUF9TR0wgaGlQYXNzQ29lZmYxID0gaGlQYXNzQ29lZmZbMV07Ci0KLSAgICAvKiBzdW0gdXAgc2NhbGFycHJvZHVjdCBvZiB0aW1lc2lnbmFsIGFzIHdpbmRvd2VkIEVuZXJnaWVzICovCi0gICAgZm9yICh3PTA7IHcgPCBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5CbG9ja1N3aXRjaFdpbmRvd3M7IHcrKykgewotCi0gICAgICAgIEZJWFBfREJMIHRlbXBfd2luZG93TnJnICA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgICBGSVhQX0RCTCB0ZW1wX3dpbmRvd05yZ0YgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgICAgRklYUF9EQkwgdGVtcF9paXJTdGF0ZTAgID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5paXJTdGF0ZXNbMF07Ci0gICAgICAgIEZJWFBfREJMIHRlbXBfaWlyU3RhdGUxICA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzFdOwotCi0gICAgICAgIC8qIHdpbmRvd05yZyA9IHN1bSh0aW1lc2FtcGxlXjIpICovCi0gICAgICAgIGZvcihpPTA7aTx3aW5kb3dMZW47aSsrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIEZJWFBfREJMIHRlbXBVbmZpbHRlcmVkLCB0ZW1wRmlsdHJlZCwgdDEsIHQyOwotICAgICAgICAgICAgLyogdGVtcFVuZmlsdGVyZWQgaXMgc2NhbGVkIHdpdGggMSB0byBwcmV2ZW50IG92ZXJmbG93cyBkdXJpbmcgY2FsY3VsYXRpb24gb2YgdGVtcEZpbHRyZWQgKi8KLSNpZiBTQU1QTEVfQklUUyA9PSBERlJBQ1RfQklUUwotICAgICAgICAgICAgdGVtcFVuZmlsdGVyZWQgPSAoRklYUF9EQkwpICpwVGltZVNpZ25hbCsrID4+IDE7CisjaWZuZGVmIFNJTkVUQUJMRV8xNkJJVAorICBjb25zdCBGSVhQX0RCTCBoaVBhc3NDb2VmZjAgPSBoaVBhc3NDb2VmZlswXTsKKyAgY29uc3QgRklYUF9EQkwgaGlQYXNzQ29lZmYxID0gaGlQYXNzQ29lZmZbMV07CiAjZWxzZQotICAgICAgICAgICAgdGVtcFVuZmlsdGVyZWQgPSAoRklYUF9EQkwpICpwVGltZVNpZ25hbCsrIDw8IChERlJBQ1RfQklUUy1TQU1QTEVfQklUUy0xKTsKKyAgY29uc3QgRklYUF9TR0wgaGlQYXNzQ29lZmYwID0gaGlQYXNzQ29lZmZbMF07CisgIGNvbnN0IEZJWFBfU0dMIGhpUGFzc0NvZWZmMSA9IGhpUGFzc0NvZWZmWzFdOwogI2VuZGlmCi0gICAgICAgICAgICB0MSA9IGZNdWx0RGl2MihoaVBhc3NDb2VmZjEsIHRlbXBVbmZpbHRlcmVkLXRlbXBfaWlyU3RhdGUwKTsKLSAgICAgICAgICAgIHQyID0gZk11bHREaXYyKGhpUGFzc0NvZWZmMCwgdGVtcF9paXJTdGF0ZTEpOwotICAgICAgICAgICAgdGVtcEZpbHRyZWQgPSAodDEgLSB0MikgPDwgMTsKIAotICAgICAgICAgICAgdGVtcF9paXJTdGF0ZTAgPSB0ZW1wVW5maWx0ZXJlZDsKLSAgICAgICAgICAgIHRlbXBfaWlyU3RhdGUxID0gdGVtcEZpbHRyZWQ7CisgIEZJWFBfREJMIHRlbXBfaWlyU3RhdGUwID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5paXJTdGF0ZXNbMF07CisgIEZJWFBfREJMIHRlbXBfaWlyU3RhdGUxID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5paXJTdGF0ZXNbMV07CiAKLSAgICAgICAgICAgIC8qIHN1YnRyYWN0IDIgZnJvbSBvdmVyYWxsc2NhbGluZyAoQkxPQ0tfU1dJVENIX0VORVJHWV9TSElGVCkKLSAgICAgICAgICAgICAqIGJlY2F1c2UgdGVtcFVuZmlsdGVyZWQgd2FzIGFscmVhZHkgc2NhbGVkIHdpdGggMSAoaXMgMiBhZnRlciBzcXVhcmluZykKLSAgICAgICAgICAgICAqIHN1YnRyYWN0IDEgZnJvbSBvdmVyYWxsc2NhbGluZyAoQkxPQ0tfU1dJVENIX0VORVJHWV9TSElGVCkKLSAgICAgICAgICAgICAqIGJlY2F1c2Ugb2YgZk11bHREaXYyIGlzIGRvaW5nIGEgc2NhbGluZyBieSBvbmUgKi8KLSAgICAgICAgICAgIHRlbXBfd2luZG93TnJnICs9IGZQb3cyRGl2Mih0ZW1wVW5maWx0ZXJlZCkgPj4gKEJMT0NLX1NXSVRDSF9FTkVSR1lfU0hJRlQgLSAxIC0gMik7Ci0gICAgICAgICAgICB0ZW1wX3dpbmRvd05yZ0YgKz0gZlBvdzJEaXYyKHRlbXBGaWx0cmVkKSA+PiAoQkxPQ0tfU1dJVENIX0VORVJHWV9TSElGVCAtIDEgLSAyKTsKLSAgICAgICAgfQotICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1sxXVt3XSAgPSB0ZW1wX3dpbmRvd05yZzsKLSAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW3ddID0gdGVtcF93aW5kb3dOcmdGOwotICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1swXSAgICAgPSB0ZW1wX2lpclN0YXRlMDsKLSAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5paXJTdGF0ZXNbMV0gICAgID0gdGVtcF9paXJTdGF0ZTE7CisgIC8qIHN1bSB1cCBzY2FsYXJwcm9kdWN0IG9mIHRpbWVzaWduYWwgYXMgd2luZG93ZWQgRW5lcmdpZXMgKi8KKyAgZm9yICh3ID0gMDsgdyA8IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bkJsb2NrU3dpdGNoV2luZG93czsgdysrKSB7CisgICAgVUxPTkcgdGVtcF93aW5kb3dOcmcgPSAweDA7CisgICAgVUxPTkcgdGVtcF93aW5kb3dOcmdGID0gMHgwOworCisgICAgLyogd2luZG93TnJnID0gc3VtKHRpbWVzYW1wbGVeMikgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgd2luZG93TGVuOyBpKyspIHsKKyAgICAgIEZJWFBfREJMIHRlbXBVbmZpbHRlcmVkLCB0MSwgdDI7CisgICAgICAvKiB0ZW1wVW5maWx0ZXJlZCBpcyBzY2FsZWQgd2l0aCAxIHRvIHByZXZlbnQgb3ZlcmZsb3dzIGR1cmluZyBjYWxjdWxhdGlvbgorICAgICAgICogb2YgdGVtcEZpbHRyZWQgKi8KKyNpZiBTQU1QTEVfQklUUyA9PSBERlJBQ1RfQklUUworICAgICAgdGVtcFVuZmlsdGVyZWQgPSAoRklYUF9EQkwpKnBUaW1lU2lnbmFsKysgPj4gMTsKKyNlbHNlCisgICAgICB0ZW1wVW5maWx0ZXJlZCA9IChGSVhQX0RCTCkqcFRpbWVTaWduYWwrKworICAgICAgICAgICAgICAgICAgICAgICA8PCAoREZSQUNUX0JJVFMgLSBTQU1QTEVfQklUUyAtIDEpOworI2VuZGlmCisgICAgICB0MSA9IGZNdWx0RGl2MihoaVBhc3NDb2VmZjEsIHRlbXBVbmZpbHRlcmVkIC0gdGVtcF9paXJTdGF0ZTApOworICAgICAgdDIgPSBmTXVsdERpdjIoaGlQYXNzQ29lZmYwLCB0ZW1wX2lpclN0YXRlMSk7CisgICAgICB0ZW1wX2lpclN0YXRlMCA9IHRlbXBVbmZpbHRlcmVkOworICAgICAgdGVtcF9paXJTdGF0ZTEgPSAodDEgLSB0MikgPDwgMTsKKworICAgICAgdGVtcF93aW5kb3dOcmcgKz0gKExPTkcpZlBvdzJEaXYyKHRlbXBfaWlyU3RhdGUwKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgKEJMT0NLX1NXSVRDSF9FTkVSR1lfU0hJRlQgLSAxIC0gMik7CisgICAgICB0ZW1wX3dpbmRvd05yZ0YgKz0gKExPTkcpZlBvdzJEaXYyKHRlbXBfaWlyU3RhdGUxKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgIChCTE9DS19TV0lUQ0hfRU5FUkdZX1NISUZUIC0gMSAtIDIpOwogICAgIH0KKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1sxXVt3XSA9CisgICAgICAgIChMT05HKWZNaW4odGVtcF93aW5kb3dOcmcsIChVSU5UKU1BWFZBTF9EQkwpOworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlsxXVt3XSA9CisgICAgICAgIChMT05HKWZNaW4odGVtcF93aW5kb3dOcmdGLCAoVUlOVClNQVhWQUxfREJMKTsKKyAgfQorICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1swXSA9IHRlbXBfaWlyU3RhdGUwOworICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1sxXSA9IHRlbXBfaWlyU3RhdGUxOwogfQogCi0KLXN0YXRpYyBjb25zdCBVQ0hBUiBzeW5jaHJvbml6ZWRCbG9ja1R5cGVUYWJsZVs1XVs1XSA9Ci17Ci0gIC8qICAgICAgICAgICAgICAgICAgTE9OR19XSU5ET1cgICBTVEFSVF9XSU5ET1cgIFNIT1JUX1dJTkRPVyAgU1RPUF9XSU5ET1cgICBMT1dPVl9XSU5ET1cqLwotICAvKiBMT05HX1dJTkRPVyAgKi8ge0xPTkdfV0lORE9XLCAgU1RBUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNUT1BfV0lORE9XLCAgTE9XT1ZfV0lORE9XfSwKLSAgLyogU1RBUlRfV0lORE9XICovIHtTVEFSVF9XSU5ET1csIFNUQVJUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIExPV09WX1dJTkRPV30sCi0gIC8qIFNIT1JUX1dJTkRPVyAqLyB7U0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBXUk9OR19XSU5ET1d9LAotICAvKiBTVE9QX1dJTkRPVyAgKi8ge1NUT1BfV0lORE9XLCAgU0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNUT1BfV0lORE9XLCAgTE9XT1ZfV0lORE9XfSwKLSAgLyogTE9XT1ZfV0lORE9XICovIHtMT1dPVl9XSU5ET1csIExPV09WX1dJTkRPVywgV1JPTkdfV0lORE9XLCBMT1dPVl9XSU5ET1csIExPV09WX1dJTkRPV30sCitzdGF0aWMgY29uc3QgVUNIQVIgc3luY2hyb25pemVkQmxvY2tUeXBlVGFibGVbNV1bNV0gPSB7CisgICAgLyogICAgICAgICAgICAgICAgICBMT05HX1dJTkRPVyAgIFNUQVJUX1dJTkRPVyAgU0hPUlRfV0lORE9XICBTVE9QX1dJTkRPVworICAgICAgIExPV09WX1dJTkRPVyovCisgICAgLyogTE9OR19XSU5ET1cgICovIHtMT05HX1dJTkRPVywgU1RBUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNUT1BfV0lORE9XLAorICAgICAgICAgICAgICAgICAgICAgICAgTE9XT1ZfV0lORE9XfSwKKyAgICAvKiBTVEFSVF9XSU5ET1cgKi8KKyAgICB7U1RBUlRfV0lORE9XLCBTVEFSVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBMT1dPVl9XSU5ET1d9LAorICAgIC8qIFNIT1JUX1dJTkRPVyAqLworICAgIHtTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFdST05HX1dJTkRPV30sCisgICAgLyogU1RPUF9XSU5ET1cgICovCisgICAge1NUT1BfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU1RPUF9XSU5ET1csIExPV09WX1dJTkRPV30sCisgICAgLyogTE9XT1ZfV0lORE9XICovCisgICAge0xPV09WX1dJTkRPVywgTE9XT1ZfV0lORE9XLCBXUk9OR19XSU5ET1csIExPV09WX1dJTkRPVywgTE9XT1ZfV0lORE9XfSwKIH07CiAKLWludCBGREthYWNFbmNfU3luY0Jsb2NrU3dpdGNoaW5nICgKLSAgICAgIEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LAotICAgICAgQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LAotICAgICAgY29uc3QgSU5UIG5DaGFubmVscywKLSAgICAgIGNvbnN0IElOVCBjb21tb25XaW5kb3cgKQoteworaW50IEZES2FhY0VuY19TeW5jQmxvY2tTd2l0Y2hpbmcoCisgICAgQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQsCisgICAgQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LCBjb25zdCBJTlQgbkNoYW5uZWxzLAorICAgIGNvbnN0IElOVCBjb21tb25XaW5kb3cpIHsKICAgVUNIQVIgcGF0Y2hUeXBlID0gTE9OR19XSU5ET1c7CiAKLSAgaWYoIG5DaGFubmVscyA9PSAyICYmIGNvbW1vbldpbmRvdyA9PSBUUlVFKQotICB7CisgIGlmIChuQ2hhbm5lbHMgPT0gMiAmJiBjb21tb25XaW5kb3cgPT0gVFJVRSkgewogICAgIC8qIGNvdWxkIGJlIGJldHRlciB3aXRoIGEgY2hhbm5lbCBsb29wIChuZWVkIGEgaGFuZGxlIHRvIHBzeV9kYXRhKSAqLwogICAgIC8qIGdldCBzdWdnZXN0ZWQgQmxvY2sgVHlwZXMgYW5kIHN5bmNocm9uaXplICovCi0gICAgcGF0Y2hUeXBlID0gc3luY2hyb25pemVkQmxvY2tUeXBlVGFibGVbcGF0Y2hUeXBlXVtibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5sYXN0V2luZG93U2VxdWVuY2VdOwotICAgIHBhdGNoVHlwZSA9IHN5bmNocm9uaXplZEJsb2NrVHlwZVRhYmxlW3BhdGNoVHlwZV1bYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmxhc3RXaW5kb3dTZXF1ZW5jZV07CisgICAgcGF0Y2hUeXBlID0gc3luY2hyb25pemVkQmxvY2tUeXBlVGFibGVbcGF0Y2hUeXBlXVtibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5sYXN0V2luZG93U2VxdWVuY2VdOworICAgIHBhdGNoVHlwZSA9IHN5bmNocm9uaXplZEJsb2NrVHlwZVRhYmxlW3BhdGNoVHlwZV1bYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmxhc3RXaW5kb3dTZXF1ZW5jZV07CiAKLSAgICAvKiBzYW5pdHkgY2hlY2sgKG5vIGNoYW5nZSBmcm9tIGxvdyBvdmVybGFwIHdpbmRvdyB0byBzaG9ydCB3aW5vdyBhbmQgdmljZSB2ZXJzYSkgKi8KLSAgICBpZiAocGF0Y2hUeXBlID09IFdST05HX1dJTkRPVykKLSAgICAgIHJldHVybiAtMTsgLyogbWl4ZWQgdXAgQUFDLUxDIGFuZCBBQUMtTEQgKi8KKyAgICAvKiBzYW5pdHkgY2hlY2sgKG5vIGNoYW5nZSBmcm9tIGxvdyBvdmVybGFwIHdpbmRvdyB0byBzaG9ydCB3aW5vdyBhbmQgdmljZQorICAgICAqIHZlcnNhKSAqLworICAgIGlmIChwYXRjaFR5cGUgPT0gV1JPTkdfV0lORE9XKSByZXR1cm4gLTE7IC8qIG1peGVkIHVwIEFBQy1MQyBhbmQgQUFDLUxEICovCiAKICAgICAvKiBTZXQgc3luY2hyb25pemVkIEJsb2NrdHlwZSAqLwotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmxhc3RXaW5kb3dTZXF1ZW5jZSAgPSBwYXRjaFR5cGU7CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bGFzdFdpbmRvd1NlcXVlbmNlID0gcGF0Y2hUeXBlOwogICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5sYXN0V2luZG93U2VxdWVuY2UgPSBwYXRjaFR5cGU7CiAKICAgICAvKiB1cGRhdGUgd2luZG93IHNoYXBlICovCi0gICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+d2luZG93U2hhcGUgID0gYmxvY2tUeXBlMndpbmRvd1NoYXBlW2Jsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmFsbG93U2hvcnRGcmFtZXNdW2Jsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmxhc3RXaW5kb3dTZXF1ZW5jZV07Ci0gICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPndpbmRvd1NoYXBlID0gYmxvY2tUeXBlMndpbmRvd1NoYXBlW2Jsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmFsbG93U2hvcnRGcmFtZXNdW2Jsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5sYXN0V2luZG93U2VxdWVuY2VdOworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPndpbmRvd1NoYXBlID0KKyAgICAgICAgYmxvY2tUeXBlMndpbmRvd1NoYXBlW2Jsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmFsbG93U2hvcnRGcmFtZXNdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5sYXN0V2luZG93U2VxdWVuY2VdOworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT53aW5kb3dTaGFwZSA9CisgICAgICAgIGJsb2NrVHlwZTJ3aW5kb3dTaGFwZVtibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5hbGxvd1Nob3J0RnJhbWVzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmxhc3RXaW5kb3dTZXF1ZW5jZV07CiAgIH0KIAotICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+YWxsb3dTaG9ydEZyYW1lcykKLSAgeworICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+YWxsb3dTaG9ydEZyYW1lcykgewogICAgIGludCBpOwogCi0gICAgaWYoIG5DaGFubmVscyA9PSAyICkKLSAgICB7Ci0gICAgICBpZiAoY29tbW9uV2luZG93ID09IFRSVUUpCi0gICAgICB7CisgICAgaWYgKG5DaGFubmVscyA9PSAyKSB7CisgICAgICBpZiAoY29tbW9uV2luZG93ID09IFRSVUUpIHsKICAgICAgICAgLyogU3luY2hyb25pemUgZ3JvdXBpbmcgaW5mbyAqLwotICAgICAgICBpbnQgd2luZG93U2VxdWVuY2VMZWZ0T2xkICA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmxhc3RXaW5kb3dTZXF1ZW5jZTsKLSAgICAgICAgaW50IHdpbmRvd1NlcXVlbmNlUmlnaHRPbGQgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bGFzdFdpbmRvd1NlcXVlbmNlOworICAgICAgICBpbnQgd2luZG93U2VxdWVuY2VMZWZ0T2xkID0KKyAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmxhc3RXaW5kb3dTZXF1ZW5jZTsKKyAgICAgICAgaW50IHdpbmRvd1NlcXVlbmNlUmlnaHRPbGQgPQorICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmxhc3RXaW5kb3dTZXF1ZW5jZTsKIAogICAgICAgICAvKiBMb25nIEJsb2NrcyAqLwotICAgICAgICBpZihwYXRjaFR5cGUgIT0gU0hPUlRfV0lORE9XKSB7CisgICAgICAgIGlmIChwYXRjaFR5cGUgIT0gU0hPUlRfV0lORE9XKSB7CiAgICAgICAgICAgLyogU2V0IGdyb3VwaW5nIGluZm8gKi8KLSAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzICAgPSAxOwotICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzICA9IDE7Ci0gICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5bMF0gID0gMTsKKyAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzID0gMTsKKyAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwcyA9IDE7CisgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5bMF0gPSAxOwogICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlblswXSA9IDE7CiAKLSAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTUFYX05PX09GX0dST1VQUzsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldICA9IDA7CisgICAgICAgICAgZm9yIChpID0gMTsgaSA8IE1BWF9OT19PRl9HUk9VUFM7IGkrKykgeworICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV0gPSAwOwogICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldID0gMDsKICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvKiBTaG9ydCBCbG9ja3MgKi8KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgLyogaW4gY2FzZSBhbGwgdHdvIGNoYW5uZWxzIHdlcmUgZGV0ZWN0ZWQgYXMgc2hvcnQtYmxvY2tzIGJlZm9yZSBzeW5jaW5nLCB1c2UgdGhlIGdyb3VwaW5nIG9mIGNoYW5uZWwgd2l0aCBoaWdoZXIgbWF4V2luZG93TnJnICovCi0gICAgICAgICAgaWYoICh3aW5kb3dTZXF1ZW5jZUxlZnRPbGQgID09IFNIT1JUX1dJTkRPVykgJiYKLQkgICAgICAgICAgICAod2luZG93U2VxdWVuY2VSaWdodE9sZCA9PSBTSE9SVF9XSU5ET1cpICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZihibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5tYXhXaW5kb3dOcmcgPiBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bWF4V2luZG93TnJnKSB7Ci0JICAgICAgICAgICAgLyogTGVmdCBDaGFubmVsIHdpbnMgKi8KLQkgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwcyA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHM7Ci0JICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OT19PRl9HUk9VUFM7IGkrKyl7Ci0JICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5baV0gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXTsKLQkgICAgICAgICAgICB9CisgICAgICAgICAgLyogaW4gY2FzZSBhbGwgdHdvIGNoYW5uZWxzIHdlcmUgZGV0ZWN0ZWQgYXMgc2hvcnQtYmxvY2tzIGJlZm9yZQorICAgICAgICAgICAqIHN5bmNpbmcsIHVzZSB0aGUgZ3JvdXBpbmcgb2YgY2hhbm5lbCB3aXRoIGhpZ2hlciBtYXhXaW5kb3dOcmcgKi8KKyAgICAgICAgICBpZiAoKHdpbmRvd1NlcXVlbmNlTGVmdE9sZCA9PSBTSE9SVF9XSU5ET1cpICYmCisgICAgICAgICAgICAgICh3aW5kb3dTZXF1ZW5jZVJpZ2h0T2xkID09IFNIT1JUX1dJTkRPVykpIHsKKyAgICAgICAgICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5tYXhXaW5kb3dOcmcgPgorICAgICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5tYXhXaW5kb3dOcmcpIHsKKyAgICAgICAgICAgICAgLyogTGVmdCBDaGFubmVsIHdpbnMgKi8KKyAgICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHMgPQorICAgICAgICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwczsKKyAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OT19PRl9HUk9VUFM7IGkrKykgeworICAgICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlbltpXSA9CisgICAgICAgICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvKiBSaWdodCBDaGFubmVsIHdpbnMgKi8KKyAgICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwcyA9CisgICAgICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwczsKKyAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OT19PRl9HUk9VUFM7IGkrKykgeworICAgICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldID0KKyAgICAgICAgICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldOworICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLQkgICAgICAgICAgICAvKiBSaWdodCBDaGFubmVsIHdpbnMgKi8KLQkgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHM7Ci0JICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OT19PRl9HUk9VUFM7IGkrKyl7Ci0JICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXSA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlbltpXTsKLQkgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKCAod2luZG93U2VxdWVuY2VMZWZ0T2xkICA9PSBTSE9SVF9XSU5ET1cpICYmCi0gICAgICAgICAgICAgICAgICAgICh3aW5kb3dTZXF1ZW5jZVJpZ2h0T2xkICE9IFNIT1JUX1dJTkRPVykgKQotICAgICAgICAgIHsKKyAgICAgICAgICB9IGVsc2UgaWYgKCh3aW5kb3dTZXF1ZW5jZUxlZnRPbGQgPT0gU0hPUlRfV0lORE9XKSAmJgorICAgICAgICAgICAgICAgICAgICAgKHdpbmRvd1NlcXVlbmNlUmlnaHRPbGQgIT0gU0hPUlRfV0lORE9XKSkgewogICAgICAgICAgICAgLyogZWxzZSB1c2UgZ3JvdXBpbmcgb2Ygc2hvcnQtYmxvY2sgY2hhbm5lbCAqLwotICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHMgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OT19PRl9HUk9VUFM7IGkrKyl7Ci0gICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlbltpXSA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldOworICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHMgPQorICAgICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHM7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05PX09GX0dST1VQUzsgaSsrKSB7CisgICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlbltpXSA9CisgICAgICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoICh3aW5kb3dTZXF1ZW5jZVJpZ2h0T2xkID09IFNIT1JUX1dJTkRPVykgJiYKLQkJICAgICAgICAgICAgICAgICh3aW5kb3dTZXF1ZW5jZUxlZnRPbGQgICE9IFNIT1JUX1dJTkRPVykgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHMgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwczsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTk9fT0ZfR1JPVVBTOyBpKyspewotICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXSA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlbltpXTsKKyAgICAgICAgICB9IGVsc2UgaWYgKCh3aW5kb3dTZXF1ZW5jZVJpZ2h0T2xkID09IFNIT1JUX1dJTkRPVykgJiYKKyAgICAgICAgICAgICAgICAgICAgICh3aW5kb3dTZXF1ZW5jZUxlZnRPbGQgIT0gU0hPUlRfV0lORE9XKSkgeworICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwcyA9CisgICAgICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHM7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05PX09GX0dST1VQUzsgaSsrKSB7CisgICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldID0KKyAgICAgICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlbltpXTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogc3luY2luZyBhIHN0YXJ0IGFuZCBzdG9wIHdpbmRvdyAuLi4gKi8KLSAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHMgID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHMgID0gMjsKLSAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuWzBdID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuWzBdID0gNDsKLSAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuWzFdID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuWzFdID0gNDsKKyAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHMgPQorICAgICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzID0gMjsKKyAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuWzBdID0KKyAgICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5bMF0gPSA0OworICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5bMV0gPQorICAgICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlblsxXSA9IDQ7CiAgICAgICAgICAgfQogICAgICAgICB9IC8qIFNob3J0IEJsb2NrcyAqLwotICAgICAgfQotICAgICAgZWxzZSB7CisgICAgICB9IGVsc2UgewogICAgICAgICAvKiBzdGVyZW8sIG5vIGNvbW1vbiB3aW5kb3cgKi8KLSAgICAgICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmxhc3RXaW5kb3dTZXF1ZW5jZSE9U0hPUlRfV0lORE9XKXsKLSAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzICA9IDE7CisgICAgICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5sYXN0V2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKSB7CisgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwcyA9IDE7CiAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5bMF0gPSAxOwotICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBNQVhfTk9fT0ZfR1JPVVBTOyBpKyspCi0gICAgICAgICAgeworICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBNQVhfTk9fT0ZfR1JPVVBTOyBpKyspIHsKICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldID0gMDsKICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5sYXN0V2luZG93U2VxdWVuY2UhPVNIT1JUX1dJTkRPVyl7Ci0gICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHMgID0gMTsKKyAgICAgICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5sYXN0V2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKSB7CisgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHMgPSAxOwogICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlblswXSA9IDE7Ci0gICAgICAgICAgZm9yIChpID0gMTsgaSA8IE1BWF9OT19PRl9HUk9VUFM7IGkrKykKLSAgICAgICAgICB7CisgICAgICAgICAgZm9yIChpID0gMTsgaSA8IE1BWF9OT19PRl9HUk9VUFM7IGkrKykgewogICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldID0gMDsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0gLyogY29tbW9uIHdpbmRvdyAqLwogICAgIH0gZWxzZSB7CiAgICAgICAvKiBNb25vICovCi0gICAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bGFzdFdpbmRvd1NlcXVlbmNlIT1TSE9SVF9XSU5ET1cpewotICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzICA9IDE7CisgICAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bGFzdFdpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykgeworICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzID0gMTsKICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5bMF0gPSAxOwogCi0gICAgICAgIGZvciAoaSA9IDE7IGkgPCBNQVhfTk9fT0ZfR1JPVVBTOyBpKyspCi0gICAgICAgIHsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IE1BWF9OT19PRl9HUk9VUFM7IGkrKykgewogICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldID0gMDsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfSAvKiBhbGxvd1Nob3J0RnJhbWVzICovCiAKLQogICAvKiBUcmFuc2xhdGUgTE9XT1ZfV0lORE9XIGJsb2NrIHR5cGUgdG8gYSBtZWFuaW5nZnVsIHdpbmRvdyBzaGFwZS4gKi8KLSAgaWYgKCAhIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmFsbG93U2hvcnRGcmFtZXMgKSB7Ci0gICAgaWYgKCBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5sYXN0V2luZG93U2VxdWVuY2UgIT0gTE9OR19XSU5ET1cKLSAgICAgICYmIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTVE9QX1dJTkRPVyApCi0gICAgeworICBpZiAoIWJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmFsbG93U2hvcnRGcmFtZXMpIHsKKyAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bGFzdFdpbmRvd1NlcXVlbmNlICE9IExPTkdfV0lORE9XICYmCisgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTVE9QX1dJTkRPVykgewogICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bGFzdFdpbmRvd1NlcXVlbmNlID0gTE9OR19XSU5ET1c7CiAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT53aW5kb3dTaGFwZSA9IExPTF9XSU5ET1c7CiAgICAgfQogICB9CiAgIGlmIChuQ2hhbm5lbHMgPT0gMikgewotICAgIGlmICggISBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+YWxsb3dTaG9ydEZyYW1lcyApIHsKLSAgICAgIGlmICggYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBMT05HX1dJTkRPVwotICAgICAgICAmJiBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bGFzdFdpbmRvd1NlcXVlbmNlICE9IFNUT1BfV0lORE9XICkKLSAgICAgIHsKKyAgICBpZiAoIWJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5hbGxvd1Nob3J0RnJhbWVzKSB7CisgICAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBMT05HX1dJTkRPVyAmJgorICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5sYXN0V2luZG93U2VxdWVuY2UgIT0gU1RPUF9XSU5ET1cpIHsKICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmxhc3RXaW5kb3dTZXF1ZW5jZSA9IExPTkdfV0lORE9XOwogICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+d2luZG93U2hhcGUgPSBMT0xfV0lORE9XOwogICAgICAgfQpAQCAtNTQxLDUgKzU4MCwzIEBACiAKICAgcmV0dXJuIDA7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9ibG9ja19zd2l0Y2guaCBiL2xpYkFBQ2VuYy9zcmMvYmxvY2tfc3dpdGNoLmgKaW5kZXggZTk0YjZmNS4uZmYyMGY4NCAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9ibG9ja19zd2l0Y2guaAorKysgYi9saWJBQUNlbmMvc3JjL2Jsb2NrX3N3aXRjaC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDY4ICs5MCw3MyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIE0uIFdlcm5lcgorCiAgICBEZXNjcmlwdGlvbjogQmxvY2sgc3dpdGNoaW5nCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgX0JMT0NLX1NXSVRDSF9ICi0jZGVmaW5lIF9CTE9DS19TV0lUQ0hfSAorI2lmbmRlZiBCTE9DS19TV0lUQ0hfSAorI2RlZmluZSBCTE9DS19TV0lUQ0hfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCiAjaW5jbHVkZSAicHN5X2NvbnN0LmgiCiAKIC8qKioqKioqKioqKioqKioqKiogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICNkZWZpbmUgQkxPQ0tfU1dJVENIX1dJTkRPV1MgICAgOCAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygd2luZG93cyBmb3IgZW5lcmd5IGNhbGN1bGF0aW9uICovCisjZGVmaW5lIEJMT0NLX1NXSVRDSF9XSU5ET1dTIDggLyogbnVtYmVyIG9mIHdpbmRvd3MgZm9yIGVuZXJneSBjYWxjdWxhdGlvbiAqLwogCi0jZGVmaW5lIEJMT0NLX1NXSVRDSElOR19JSVJfTEVOICAgIDIgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgSGlnaFBhc3MtSUlSLUZpbHRlciBmb3IgQXR0YWNrLURldGVjdGlvbiAqLwotI2RlZmluZSBCTE9DS19TV0lUQ0hfRU5FUkdZX1NISUZUICA3ICAgICAgICAgICAgICAgICAgLyogc2hvdWxkIGJlIGxvZ0R1YWxpcyhCTE9DS19TV0lUQ0hfV0lORE9XX0xFTikgdG8gYXZvaWQgb3ZlcmZsb3cgaW4gd2luZG93TnJncy4gKi8KKyNkZWZpbmUgQkxPQ0tfU1dJVENISU5HX0lJUl9MRU4gXAorICAyIC8qIExlbmd0aCBvZiBIaWdoUGFzcy1JSVItRmlsdGVyIGZvciBBdHRhY2stRGV0ZWN0aW9uICovCisjZGVmaW5lIEJMT0NLX1NXSVRDSF9FTkVSR1lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA3IC8qIHNob3VsZCBiZSBsb2dEdWFsaXMoQkxPQ0tfU1dJVENIX1dJTkRPV19MRU4pIHRvIGF2b2lkIG92ZXJmbG93IGluIFwKKyAgICAgICB3aW5kb3dOcmdzLiAqLwogCiAjZGVmaW5lIExBU1RfV0lORE9XIDAKICNkZWZpbmUgVEhJU19XSU5ET1cgMQogCi0KIC8qKioqKioqKioqKioqKioqKiogU3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdHsKLSAgSU5UICAgbGFzdFdpbmRvd1NlcXVlbmNlOwotICBJTlQgICB3aW5kb3dTaGFwZTsKLSAgSU5UICAgbGFzdFdpbmRvd1NoYXBlOwotICBVSU5UICBuQmxvY2tTd2l0Y2hXaW5kb3dzOyAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHdpbmRvd3MgZm9yIGVuZXJneSBjYWxjdWxhdGlvbiAqLwotICBJTlQgICBhdHRhY2s7Ci0gIElOVCAgIGxhc3RhdHRhY2s7Ci0gIElOVCAgIGF0dGFja0luZGV4OwotICBJTlQgICBsYXN0QXR0YWNrSW5kZXg7Ci0gIElOVCAgIGFsbG93U2hvcnRGcmFtZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgTG93IERlbGF5LCBkb24ndCBhbGxvdyBzaG9ydCBmcmFtZXMgKi8KLSAgSU5UICAgYWxsb3dMb29rQWhlYWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBMb3cgRGVsYXksIGRvbid0IGRvIGxvb2stYWhlYWQgKi8KLSAgSU5UICAgbm9PZkdyb3VwczsKLSAgSU5UICAgZ3JvdXBMZW5bTUFYX05PX09GX0dST1VQU107Ci0gIEZJWFBfREJMIG1heFdpbmRvd05yZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXggZW5lcmd5IGluIHN1YndpbmRvd3MgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UIGxhc3RXaW5kb3dTZXF1ZW5jZTsKKyAgSU5UIHdpbmRvd1NoYXBlOworICBJTlQgbGFzdFdpbmRvd1NoYXBlOworICBVSU5UIG5CbG9ja1N3aXRjaFdpbmRvd3M7IC8qIG51bWJlciBvZiB3aW5kb3dzIGZvciBlbmVyZ3kgY2FsY3VsYXRpb24gKi8KKyAgSU5UIGF0dGFjazsKKyAgSU5UIGxhc3RhdHRhY2s7CisgIElOVCBhdHRhY2tJbmRleDsKKyAgSU5UIGxhc3RBdHRhY2tJbmRleDsKKyAgSU5UIGFsbG93U2hvcnRGcmFtZXM7IC8qIGZvciBMb3cgRGVsYXksIGRvbid0IGFsbG93IHNob3J0IGZyYW1lcyAqLworICBJTlQgYWxsb3dMb29rQWhlYWQ7ICAgLyogZm9yIExvdyBEZWxheSwgZG9uJ3QgZG8gbG9vay1haGVhZCAqLworICBJTlQgbm9PZkdyb3VwczsKKyAgSU5UIGdyb3VwTGVuW01BWF9OT19PRl9HUk9VUFNdOworICBGSVhQX0RCTCBtYXhXaW5kb3dOcmc7IC8qIG1heCBlbmVyZ3kgaW4gc3Vid2luZG93cyAqLwogCi0gIEZJWFBfREJMIHdpbmRvd05yZ1syXVtCTE9DS19TV0lUQ0hfV0lORE9XU107ICAgICAvKiB0aW1lIHNpZ25hbCBlbmVyZ3kgaW4gU3Vid2luZG93cyAobGFzdCBhbmQgY3VycmVudCkgKi8KLSAgRklYUF9EQkwgd2luZG93TnJnRlsyXVtCTE9DS19TV0lUQ0hfV0lORE9XU107ICAgIC8qIGZpbHRlcmVkIHRpbWUgc2lnbmFsIGVuZXJneSBpbiBzZWdtZW50cyAobGFzdCBhbmQgY3VycmVudCkgKi8KLSAgRklYUF9EQkwgYWNjV2luZG93TnJnOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlY3Vyc2l2ZWx5IGFjY3VtdWxhdGVkIHdpbmRvd05yZ0YgKi8KKyAgRklYUF9EQkwKKyAgd2luZG93TnJnWzJdW0JMT0NLX1NXSVRDSF9XSU5ET1dTXTsgLyogdGltZSBzaWduYWwgZW5lcmd5IGluIFN1YndpbmRvd3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhc3QgYW5kIGN1cnJlbnQpICovCisgIEZJWFBfREJMIHdpbmRvd05yZ0ZbMl1bQkxPQ0tfU1dJVENIX1dJTkRPV1NdOyAvKiBmaWx0ZXJlZCB0aW1lIHNpZ25hbCBlbmVyZ3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHNlZ21lbnRzIChsYXN0IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCkgKi8KKyAgRklYUF9EQkwgYWNjV2luZG93TnJnOyAvKiByZWN1cnNpdmVseSBhY2N1bXVsYXRlZCB3aW5kb3dOcmdGICovCiAKLSAgRklYUF9EQkwgaWlyU3RhdGVzW0JMT0NLX1NXSVRDSElOR19JSVJfTEVOXTsgICAgIC8qIGZpbHRlciBkZWxheS1saW5lICovCisgIEZJWFBfREJMIGlpclN0YXRlc1tCTE9DS19TV0lUQ0hJTkdfSUlSX0xFTl07IC8qIGZpbHRlciBkZWxheS1saW5lICovCiAKIH0gQkxPQ0tfU1dJVENISU5HX0NPTlRST0w7CiAKK3ZvaWQgRkRLYWFjRW5jX0luaXRCbG9ja1N3aXRjaGluZygKKyAgICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sLCBJTlQgaXNMb3dEZWxheSk7CiAKLQotCi0KLXZvaWQgRkRLYWFjRW5jX0luaXRCbG9ja1N3aXRjaGluZyhCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sLCBJTlQgaXNMb3dEZWxheSk7Ci0KLWludCBGREthYWNFbmNfQmxvY2tTd2l0Y2hpbmcoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbCwgY29uc3QgSU5UIGdyYW51bGVMZW5ndGgsIGNvbnN0IGludCBpc0xGRSwgY29uc3QgSU5UX1BDTSAqcFRpbWVTaWduYWwpOworaW50IEZES2FhY0VuY19CbG9ja1N3aXRjaGluZyhCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZ3JhbnVsZUxlbmd0aCwgY29uc3QgaW50IGlzTEZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlRfUENNICpwVGltZVNpZ25hbCk7CiAKIGludCBGREthYWNFbmNfU3luY0Jsb2NrU3dpdGNoaW5nKAotICAgICAgQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQsCi0gICAgICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQsCi0gICAgICBjb25zdCBJTlQgbm9PZkNoYW5uZWxzLAotICAgICAgY29uc3QgSU5UIGNvbW1vbldpbmRvdyk7CisgICAgQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQsCisgICAgQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LCBjb25zdCBJTlQgbm9PZkNoYW5uZWxzLAorICAgIGNvbnN0IElOVCBjb21tb25XaW5kb3cpOwogCi0jZW5kaWYgIC8qICNpZm5kZWYgX0JMT0NLX1NXSVRDSF9IICovCisjZW5kaWYgLyogI2lmbmRlZiBCTE9DS19TV0lUQ0hfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9jaGFubmVsX21hcC5jcHAgYi9saWJBQUNlbmMvc3JjL2NoYW5uZWxfbWFwLmNwcAppbmRleCA1NTlhNGNlLi42ZWU5MWQ1IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2NoYW5uZWxfbWFwLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL2NoYW5uZWxfbWFwLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyMSArOTAsMjIgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiAgRmFzdCBNUEVHIEFBQyBBdWRpbyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgQS4gR3JvZXNjaGVsCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogY2hhbm5lbCBtYXBwaW5nIGZ1bmN0aW9uYWxpdHkKKyAgIEF1dGhvcihzKTogICBBLiBHcm9lc2NoZWwKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IGNoYW5uZWwgbWFwcGluZyBmdW5jdGlvbmFsaXR5CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJjaGFubmVsX21hcC5oIgogI2luY2x1ZGUgImJpdGVuYy5oIgogI2luY2x1ZGUgInBzeV9jb25zdC5oIgogI2luY2x1ZGUgInFjX2RhdGEuaCIKICNpbmNsdWRlICJhYWNFbmNfcmFtLmgiCi0KKyNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCiAKIC8qIGNoYW5uZWxfYXNzaWdubWVudCB0cmVhdHMgdGhlIHJlbGF0aW9uc2hpcCBvZiBJbnB1dCBmaWxlIGNoYW5uZWxzCiAgICB0byB0aGUgZW5jb2RlciBjaGFubmVscy4KQEAgLTEyMSwzNjkgKzEzMyw0NjQgQEAKICAgIExGRSAgICAgICAgICAgICAzICAgICAgICAgICAgICAgIDUgKExGRSkKICovCiAKLXR5cGVkZWYgc3RydWN0IHsKLQotICBDSEFOTkVMX01PREUgIGVuY29kZXJNb2RlOwotICBJTlQgICAgICAgICAgIGNoYW5uZWxfYXNzaWdubWVudFsvKig4KSovMTJdOwotCi19IENIQU5ORUxfQVNTSUdOTUVOVF9JTkZPX1RBQjsKLQotCi1zdGF0aWMgY29uc3QgQ0hBTk5FTF9BU1NJR05NRU5UX0lORk9fVEFCIGFzc2lnbm1lbnRJbmZvVGFiTXBlZ1tdID0KLXsKLSAgICAgeyBNT0RFX0lOVkFMSUQsICAgICAgICAgICAgICAgICB7LTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTF9IH0sICAvKiAgaW52YWxpZCAgICovCi0gICAgIHsgTU9ERV8xLCAgICAgICAgICAgICAgICAgICAgICAgeyAwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xfSB9LCAgLyogIG1vbm8gICAgICAqLwotICAgICB7IE1PREVfMiwgICAgICAgICAgICAgICAgICAgICAgIHsgMCwgMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICBzdGVyZW8gICAgKi8KLSAgICAgeyBNT0RFXzFfMiwgICAgICAgICAgICAgICAgICAgICB7IDAsIDEsIDIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTF9IH0sICAvKiAgM2NoICAgICAgICovCi0gICAgIHsgTU9ERV8xXzJfMSwgICAgICAgICAgICAgICAgICAgeyAwLCAxLCAyLCAzLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xfSB9LCAgLyogIDRjaCAgICAgICAqLwotICAgICB7IE1PREVfMV8yXzIsICAgICAgICAgICAgICAgICAgIHsgMCwgMSwgMiwgMywgNCwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICA1Y2ggICAgICAgKi8KLSAgICAgeyBNT0RFXzFfMl8yXzEsICAgICAgICAgICAgICAgICB7IDAsIDEsIDIsIDMsIDQsIDUsLTEsLTEsLTEsLTEsLTEsLTF9IH0sICAvKiAgNS4xY2ggICAgICovCi0gICAgIHsgTU9ERV8xXzJfMl8yXzEsICAgICAgICAgICAgICAgeyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LC0xLC0xLC0xLC0xfSB9LCAgLyogIDcuMWNoICAgICAqLwotICAgICB7IE1PREVfN18xX1JFQVJfU1VSUk9VTkQsICAgICAgIHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywtMSwtMSwtMSwtMX0gfSwgIC8qICA3LjFjaCAgICAgKi8KLSAgICAgeyBNT0RFXzdfMV9GUk9OVF9DRU5URVIsICAgICAgICB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsLTEsLTEsLTEsLTF9IH0gICAvKiAgNy4xY2ggICAgICovCi19OwotCi1zdGF0aWMgY29uc3QgQ0hBTk5FTF9BU1NJR05NRU5UX0lORk9fVEFCIGFzc2lnbm1lbnRJbmZvVGFiV2F2W10gPQotewotICAgICB7IE1PREVfSU5WQUxJRCwgICAgICAgICAgICAgICAgIHstMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICBpbnZhbGlkICAgKi8KLSAgICAgeyBNT0RFXzEsICAgICAgICAgICAgICAgICAgICAgICB7IDAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTF9IH0sICAvKiAgbW9ubyAgICAgICovCi0gICAgIHsgTU9ERV8yLCAgICAgICAgICAgICAgICAgICAgICAgeyAwLCAxLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xfSB9LCAgLyogIHN0ZXJlbyAgICAqLwotICAgICB7IE1PREVfMV8yLCAgICAgICAgICAgICAgICAgICAgIHsgMiwgMCwgMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICAzY2ggICAgICAgKi8KLSAgICAgeyBNT0RFXzFfMl8xLCAgICAgICAgICAgICAgICAgICB7IDIsIDAsIDEsIDMsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTF9IH0sICAvKiAgNGNoICAgICAgICovCi0gICAgIHsgTU9ERV8xXzJfMiwgICAgICAgICAgICAgICAgICAgeyAyLCAwLCAxLCAzLCA0LC0xLC0xLC0xLC0xLC0xLC0xLC0xfSB9LCAgLyogIDVjaCAgICAgICAqLwotICAgICB7IE1PREVfMV8yXzJfMSwgICAgICAgICAgICAgICAgIHsgMiwgMCwgMSwgNCwgNSwgMywtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICA1LjFjaCAgICAgKi8KLSAgICAgeyBNT0RFXzFfMl8yXzJfMSwgICAgICAgICAgICAgICB7IDIsIDYsIDcsIDAsIDEsIDQsIDUsIDMsLTEsLTEsLTEsLTF9IH0sICAvKiAgNy4xY2ggICAgICovCi0gICAgIHsgTU9ERV83XzFfUkVBUl9TVVJST1VORCwgICAgICAgeyAyLCAwLCAxLCA2LCA3LCA0LCA1LCAzLC0xLC0xLC0xLC0xfSB9LCAgLyogIDcuMWNoICAgICAqLwotICAgICB7IE1PREVfN18xX0ZST05UX0NFTlRFUiwgICAgICAgIHsgMiwgNiwgNywgMCwgMSwgNCwgNSwgMywtMSwtMSwtMSwtMX0gfSwgIC8qICA3LjFjaCAgICAgKi8KLX07Ci0KIC8qIENoYW5uZWwgbW9kZSBjb25maWd1cmF0aW9uIHRhYiBwcm92aWRlcywKICAgIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIGNoYW5uZWxzIGFuZCBlbGVtZW50cwogKi8KLXN0YXRpYyBjb25zdCBDSEFOTkVMX01PREVfQ09ORklHX1RBQiBjaGFubmVsTW9kZUNvbmZpZ1tdID0KLXsKLSAgIHsgTU9ERV8xLCAgICAgICAgICAgICAgICAgICAgICAgIDEsICAxLCAgMSB9LCAgIC8qIFNDRSAgICAgICAgICAgICAgICAgKi8KLSAgIHsgTU9ERV8yLCAgICAgICAgICAgICAgICAgICAgICAgIDIsICAyLCAgMSB9LCAgIC8qIENQRSAgICAgICAgICAgICAgICAgKi8KLSAgIHsgTU9ERV8xXzIsICAgICAgICAgICAgICAgICAgICAgIDMsICAzLCAgMiB9LCAgIC8qIFNDRSxDUEUgICAgICAgICAgICAgKi8KLSAgIHsgTU9ERV8xXzJfMSwgICAgICAgICAgICAgICAgICAgIDQsICA0LCAgMyB9LCAgIC8qIFNDRSxDUEUsU0NFICAgICAgICAgKi8KLSAgIHsgTU9ERV8xXzJfMiwgICAgICAgICAgICAgICAgICAgIDUsICA1LCAgMyB9LCAgIC8qIFNDRSxDUEUsQ1BFICAgICAgICAgKi8KLSAgIHsgTU9ERV8xXzJfMl8xLCAgICAgICAgICAgICAgICAgIDYsICA1LCAgNCB9LCAgIC8qIFNDRSxDUEUsQ1BFLExGRSAgICAgKi8KLSAgIHsgTU9ERV8xXzJfMl8yXzEsICAgICAgICAgICAgICAgIDgsICA3LCAgNSB9LCAgIC8qIFNDRSxDUEUsQ1BFLENQRSxMRkUgKi8KLSAgIHsgTU9ERV83XzFfUkVBUl9TVVJST1VORCwgICAgICAgIDgsICA3LCAgNSB9LAotICAgeyBNT0RFXzdfMV9GUk9OVF9DRU5URVIsICAgICAgICAgOCwgIDcsICA1IH0sCitzdGF0aWMgY29uc3QgQ0hBTk5FTF9NT0RFX0NPTkZJR19UQUIgY2hhbm5lbE1vZGVDb25maWdbXSA9IHsKKyAgICB7TU9ERV8xLCAxLCAxLCAxfSwgICAgICAgICAgICAgLyogY2hDZmcgIDEsIFNDRSAgICAgICAgICAgICAgICAgKi8KKyAgICB7TU9ERV8yLCAyLCAyLCAxfSwgICAgICAgICAgICAgLyogY2hDZmcgIDIsIENQRSAgICAgICAgICAgICAgICAgKi8KKyAgICB7TU9ERV8xXzIsIDMsIDMsIDJ9LCAgICAgICAgICAgLyogY2hDZmcgIDMsIFNDRSxDUEUgICAgICAgICAgICAgKi8KKyAgICB7TU9ERV8xXzJfMSwgNCwgNCwgM30sICAgICAgICAgLyogY2hDZmcgIDQsIFNDRSxDUEUsU0NFICAgICAgICAgKi8KKyAgICB7TU9ERV8xXzJfMiwgNSwgNSwgM30sICAgICAgICAgLyogY2hDZmcgIDUsIFNDRSxDUEUsQ1BFICAgICAgICAgKi8KKyAgICB7TU9ERV8xXzJfMl8xLCA2LCA1LCA0fSwgICAgICAgLyogY2hDZmcgIDYsIFNDRSxDUEUsQ1BFLExGRSAgICAgKi8KKyAgICB7TU9ERV8xXzJfMl8yXzEsIDgsIDcsIDV9LCAgICAgLyogY2hDZmcgIDcsIFNDRSxDUEUsQ1BFLENQRSxMRkUgKi8KKyAgICB7TU9ERV82XzEsIDcsIDYsIDV9LCAgICAgICAgICAgLyogY2hDZmcgMTEsIFNDRSxDUEUsQ1BFLFNDRSxMRkUgKi8KKyAgICB7TU9ERV83XzFfQkFDSywgOCwgNywgNX0sICAgICAgLyogY2hDZmcgMTIsIFNDRSxDUEUsQ1BFLENQRSxMRkUgKi8KKyAgICB7TU9ERV83XzFfVE9QX0ZST05ULCA4LCA3LCA1fSwgLyogY2hDZmcgMTQsIFNDRSxDUEUsQ1BFLExGRSxDUEUgKi8KKyAgICB7TU9ERV83XzFfUkVBUl9TVVJST1VORCwgOCwgNywKKyAgICAgNX0sIC8qIHNhbWUgYXMgTU9ERV83XzFfQkFDSywgIFNDRSxDUEUsQ1BFLENQRSxMRkUgKi8KKyAgICB7TU9ERV83XzFfRlJPTlRfQ0VOVEVSLCA4LCA3LAorICAgICA1fSwgLyogc2FtZSBhcyBNT0RFXzFfMl8yXzJfMSwgU0NFLENQRSxDUEUsQ1BFLExGRSAqLworCiB9OwogCi0jZGVmaW5lIE1BWF9NT0RFUyAoc2l6ZW9mKGFzc2lnbm1lbnRJbmZvVGFiV2F2KS9zaXplb2YoQ0hBTk5FTF9BU1NJR05NRU5UX0lORk9fVEFCKSkKLQotY29uc3QgSU5UKiBGREthYWNFbmNfZ2V0Q2hhbm5lbEFzc2lnbm1lbnQoQ0hBTk5FTF9NT0RFIGVuY01vZGUsIENIQU5ORUxfT1JERVIgY28pCi17Ci0gIGNvbnN0IENIQU5ORUxfQVNTSUdOTUVOVF9JTkZPX1RBQiAqcFRhYjsKLSAgaW50IGk7Ci0KLSAgaWYgKGNvID09IENIX09SREVSX01QRUcpCi0gICAgcFRhYiA9IGFzc2lnbm1lbnRJbmZvVGFiTXBlZzsKLSAgZWxzZQotICAgIHBUYWIgPSBhc3NpZ25tZW50SW5mb1RhYldhdjsKLQotICBmb3IoaT1NQVhfTU9ERVMtMTsgaT4wOyBpLS0pIHsKLSAgICBpZiAoZW5jTW9kZT09IHBUYWJbaV0uZW5jb2Rlck1vZGUpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gKHBUYWJbaV0uY2hhbm5lbF9hc3NpZ25tZW50KTsKLX0KLQotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0RldGVybWluZUVuY29kZXJNb2RlKENIQU5ORUxfTU9ERSogbW9kZSwgSU5UIG5DaGFubmVscykKLXsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19EZXRlcm1pbmVFbmNvZGVyTW9kZShDSEFOTkVMX01PREUqIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5DaGFubmVscykgewogICBJTlQgaTsKICAgQ0hBTk5FTF9NT0RFIGVuY01vZGUgPSBNT0RFX0lOVkFMSUQ7CiAKLSAgaWYgKCptb2RlPT1NT0RFX1VOS05PV04pIHsKLSAgICBmb3IgKGk9MDsgaTwoSU5UKXNpemVvZihjaGFubmVsTW9kZUNvbmZpZykvKElOVClzaXplb2YoQ0hBTk5FTF9NT0RFX0NPTkZJR19UQUIpOyBpKyspIHsKLSAgICAgIGlmIChjaGFubmVsTW9kZUNvbmZpZ1tpXS5uQ2hhbm5lbHM9PW5DaGFubmVscykgewotICAgICAgICAgIGVuY01vZGUgPSBjaGFubmVsTW9kZUNvbmZpZ1tpXS5lbmNNb2RlOwotICAgICAgICAgIGJyZWFrOworICBpZiAoKm1vZGUgPT0gTU9ERV9VTktOT1dOKSB7CisgICAgZm9yIChpID0gMDsgaSA8IChJTlQpc2l6ZW9mKGNoYW5uZWxNb2RlQ29uZmlnKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAoSU5UKXNpemVvZihDSEFOTkVMX01PREVfQ09ORklHX1RBQik7CisgICAgICAgICBpKyspIHsKKyAgICAgIGlmIChjaGFubmVsTW9kZUNvbmZpZ1tpXS5uQ2hhbm5lbHMgPT0gbkNoYW5uZWxzKSB7CisgICAgICAgIGVuY01vZGUgPSBjaGFubmVsTW9kZUNvbmZpZ1tpXS5lbmNNb2RlOworICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgICAgKm1vZGUgPSBlbmNNb2RlOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIC8qIGNoZWNrIGlmIHZhbGlkIGNoYW5uZWwgY29uZmlndXJhdGlvbiAqLwotICAgIGlmIChGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKCptb2RlKS0+bkNoYW5uZWxzPT1uQ2hhbm5lbHMpIHsKLSAgICAgICAgZW5jTW9kZSA9ICptb2RlOworICAgIGlmIChGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKCptb2RlKS0+bkNoYW5uZWxzID09IG5DaGFubmVscykgeworICAgICAgZW5jTW9kZSA9ICptb2RlOwogICAgIH0KICAgfQogCi0gIGlmIChlbmNNb2RlPT1NT0RFX0lOVkFMSUQpIHsKKyAgaWYgKGVuY01vZGUgPT0gTU9ERV9JTlZBTElEKSB7CiAgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKICAgfQogCiAgIHJldHVybiBBQUNfRU5DX09LOwogfQogCi1zdGF0aWMgSU5UIEZES2FhY0VuY19pbml0RWxlbWVudCAoRUxFTUVOVF9JTkZPKiBlbEluZm8sIE1QNF9FTEVNRU5UX0lEIGVsVHlwZSwgSU5UKiBjbnQsIENIQU5ORUxfTU9ERSBtb2RlLCBDSEFOTkVMX09SREVSIGNvLCBJTlQqIGl0X2NudCwgY29uc3QgRklYUF9EQkwgcmVsQml0cykgeworc3RhdGljIElOVCBGREthYWNFbmNfaW5pdEVsZW1lbnQoRUxFTUVOVF9JTkZPKiBlbEluZm8sIE1QNF9FTEVNRU5UX0lEIGVsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogY250LCBGREtfY2hhbm5lbE1hcERlc2NyKiBtYXBEZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgbWFwSWR4LCBJTlQqIGl0X2NudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIHJlbEJpdHMpIHsKKyAgSU5UIGVycm9yID0gMDsKKyAgSU5UIGNvdW50ZXIgPSAqY250OwogCi0gIElOVCBlcnJvcj0wOwotICBJTlQgY291bnRlciA9KmNudDsKLQotICBjb25zdCBJTlQgKmFzc2lnbiA9IEZES2FhY0VuY19nZXRDaGFubmVsQXNzaWdubWVudChtb2RlLCBjbyk7Ci0KLSAgZWxJbmZvLT5lbFR5cGU9ZWxUeXBlOworICBlbEluZm8tPmVsVHlwZSA9IGVsVHlwZTsKICAgZWxJbmZvLT5yZWxhdGl2ZUJpdHMgPSByZWxCaXRzOwogCi0gIHN3aXRjaChlbEluZm8tPmVsVHlwZSkgewotICBjYXNlIElEX1NDRTogY2FzZSBJRF9MRkU6IGNhc2UgSURfQ0NFOgotICAgIGVsSW5mby0+bkNoYW5uZWxzSW5FbD0xOwotICAgIGVsSW5mby0+Q2hhbm5lbEluZGV4WzBdPWFzc2lnbltjb3VudGVyKytdOwotICAgIGVsSW5mby0+aW5zdGFuY2VUYWc9aXRfY250W2VsVHlwZV0rKzsKLQotICAgIGJyZWFrOwotICBjYXNlIElEX0NQRToKLSAgICBlbEluZm8tPm5DaGFubmVsc0luRWw9MjsKLSAgICBlbEluZm8tPkNoYW5uZWxJbmRleFswXT1hc3NpZ25bY291bnRlcisrXTsKLSAgICBlbEluZm8tPkNoYW5uZWxJbmRleFsxXT1hc3NpZ25bY291bnRlcisrXTsKLSAgICBlbEluZm8tPmluc3RhbmNlVGFnPWl0X2NudFtlbFR5cGVdKys7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSURfRFNFOgotICAgIGVsSW5mby0+bkNoYW5uZWxzSW5FbD0wOwotICAgIGVsSW5mby0+Q2hhbm5lbEluZGV4WzBdPTA7Ci0gICAgZWxJbmZvLT5DaGFubmVsSW5kZXhbMV09MDsKLSAgICBlbEluZm8tPmluc3RhbmNlVGFnPWl0X2NudFtlbFR5cGVdKys7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6IGVycm9yPTE7CisgIHN3aXRjaCAoZWxJbmZvLT5lbFR5cGUpIHsKKyAgICBjYXNlIElEX1NDRToKKyAgICBjYXNlIElEX0xGRToKKyAgICBjYXNlIElEX0NDRToKKyAgICAgIGVsSW5mby0+bkNoYW5uZWxzSW5FbCA9IDE7CisgICAgICBlbEluZm8tPkNoYW5uZWxJbmRleFswXSA9CisgICAgICAgICAgRkRLX2NoTWFwRGVzY3JfZ2V0TWFwVmFsdWUobWFwRGVzY3IsIGNvdW50ZXIrKywgbWFwSWR4KTsKKyAgICAgIGVsSW5mby0+aW5zdGFuY2VUYWcgPSBpdF9jbnRbZWxUeXBlXSsrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJRF9DUEU6CisgICAgICBlbEluZm8tPm5DaGFubmVsc0luRWwgPSAyOworICAgICAgZWxJbmZvLT5DaGFubmVsSW5kZXhbMF0gPQorICAgICAgICAgIEZES19jaE1hcERlc2NyX2dldE1hcFZhbHVlKG1hcERlc2NyLCBjb3VudGVyKyssIG1hcElkeCk7CisgICAgICBlbEluZm8tPkNoYW5uZWxJbmRleFsxXSA9CisgICAgICAgICAgRkRLX2NoTWFwRGVzY3JfZ2V0TWFwVmFsdWUobWFwRGVzY3IsIGNvdW50ZXIrKywgbWFwSWR4KTsKKyAgICAgIGVsSW5mby0+aW5zdGFuY2VUYWcgPSBpdF9jbnRbZWxUeXBlXSsrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJRF9EU0U6CisgICAgICBlbEluZm8tPm5DaGFubmVsc0luRWwgPSAwOworICAgICAgZWxJbmZvLT5DaGFubmVsSW5kZXhbMF0gPSAwOworICAgICAgZWxJbmZvLT5DaGFubmVsSW5kZXhbMV0gPSAwOworICAgICAgZWxJbmZvLT5pbnN0YW5jZVRhZyA9IGl0X2NudFtlbFR5cGVdKys7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3IgPSAxOwogICB9OwogICAqY250ID0gY291bnRlcjsKICAgcmV0dXJuIGVycm9yOwotCiB9CiAKLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0Q2hhbm5lbE1hcHBpbmcoQ0hBTk5FTF9NT0RFIG1vZGUsIENIQU5ORUxfT1JERVIgY28sIENIQU5ORUxfTUFQUElORyogY20pCi17Ci0gIElOVCBjb3VudD0wOyAvKiBjb3VudCB0aHJvdWdoIGNvZGVyIGNoYW5uZWxzICovCi0gIElOVCBpdF9jbnRbSURfRU5EKzFdOworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRDaGFubmVsTWFwcGluZyhDSEFOTkVMX01PREUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PUkRFUiBjbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HKiBjbSkgeworICBJTlQgY291bnQgPSAwOyAvKiBjb3VudCB0aHJvdWdoIGNvZGVyIGNoYW5uZWxzICovCisgIElOVCBpdF9jbnRbSURfRU5EICsgMV07CiAgIElOVCBpOworICBVSU5UIG1hcElkeDsKKyAgRkRLX2NoYW5uZWxNYXBEZXNjciBtYXBEZXNjcjsKIAotICBmb3IgKGk9MDsgaTxJRF9FTkQ7IGkrKykKLSAgICBpdF9jbnRbaV09MDsKKyAgZm9yIChpID0gMDsgaSA8IElEX0VORDsgaSsrKSBpdF9jbnRbaV0gPSAwOwogCiAgIEZES21lbWNsZWFyKGNtLCBzaXplb2YoQ0hBTk5FTF9NQVBQSU5HKSk7CiAKICAgLyogaW5pdCBjaGFubmVsIG1hcHBpbmcqLwotICBmb3IgKGk9MDsgaTwoSU5UKXNpemVvZihjaGFubmVsTW9kZUNvbmZpZykvKElOVClzaXplb2YoQ0hBTk5FTF9NT0RFX0NPTkZJR19UQUIpOyBpKyspIHsKLSAgICBpZiAoY2hhbm5lbE1vZGVDb25maWdbaV0uZW5jTW9kZT09bW9kZSkKLSAgICB7Ci0gICAgICAgIGNtLT5lbmNNb2RlICAgICAgPSBjaGFubmVsTW9kZUNvbmZpZ1tpXS5lbmNNb2RlOwotICAgICAgICBjbS0+bkNoYW5uZWxzICAgID0gY2hhbm5lbE1vZGVDb25maWdbaV0ubkNoYW5uZWxzOwotICAgICAgICBjbS0+bkNoYW5uZWxzRWZmID0gY2hhbm5lbE1vZGVDb25maWdbaV0ubkNoYW5uZWxzRWZmOwotICAgICAgICBjbS0+bkVsZW1lbnRzICAgID0gY2hhbm5lbE1vZGVDb25maWdbaV0ubkVsZW1lbnRzOworICBmb3IgKGkgPSAwOyBpIDwgKElOVClzaXplb2YoY2hhbm5lbE1vZGVDb25maWcpIC8KKyAgICAgICAgICAgICAgICAgICAgICAoSU5UKXNpemVvZihDSEFOTkVMX01PREVfQ09ORklHX1RBQik7CisgICAgICAgaSsrKSB7CisgICAgaWYgKGNoYW5uZWxNb2RlQ29uZmlnW2ldLmVuY01vZGUgPT0gbW9kZSkgeworICAgICAgY20tPmVuY01vZGUgPSBjaGFubmVsTW9kZUNvbmZpZ1tpXS5lbmNNb2RlOworICAgICAgY20tPm5DaGFubmVscyA9IGNoYW5uZWxNb2RlQ29uZmlnW2ldLm5DaGFubmVsczsKKyAgICAgIGNtLT5uQ2hhbm5lbHNFZmYgPSBjaGFubmVsTW9kZUNvbmZpZ1tpXS5uQ2hhbm5lbHNFZmY7CisgICAgICBjbS0+bkVsZW1lbnRzID0gY2hhbm5lbE1vZGVDb25maWdbaV0ubkVsZW1lbnRzOwogCi0gICAgICAgIGJyZWFrOworICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAKKyAgLyogaW5pdCBtYXAgZGVzY3JpcHRvciAqLworICBGREtfY2hNYXBEZXNjcl9pbml0KCZtYXBEZXNjciwgTlVMTCwgMCwgKGNvID09IENIX09SREVSX01QRUcpID8gMSA6IDApOworICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIE1PREVfN18xX1JFQVJfU1VSUk9VTkQ6IC8qIE1PREVfN18xX1JFQVJfU1VSUk9VTkQgaXMgZXF1aXZhbGVudCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9ERV83XzFfQkFDSyAqLworICAgICAgbWFwSWR4ID0gKElOVClNT0RFXzdfMV9CQUNLOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFXzdfMV9GUk9OVF9DRU5URVI6IC8qIE1PREVfN18xX0ZST05UX0NFTlRFUiBpcyBlcXVpdmFsZW50IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PREVfMV8yXzJfMl8xICovCisgICAgICBtYXBJZHggPSAoSU5UKU1PREVfMV8yXzJfMl8xOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG1hcElkeCA9CisgICAgICAgICAgKElOVCltb2RlID4gMTQKKyAgICAgICAgICAgICAgPyAwCisgICAgICAgICAgICAgIDogKElOVCkKKyAgICAgICAgICAgICAgICAgICAgbW9kZTsgLyogaWYgY2hhbm5lbCBjb25maWcgPiAxNCBNUEVHIG1hcHBpbmcgd2lsbCBiZSB1c2VkICovCisgIH0KKwogICAvKiBpbml0IGVsZW1lbnQgaW5mbyBzdHJ1Y3QgKi8KLSAgc3dpdGNoKG1vZGUpIHsKKyAgc3dpdGNoIChtb2RlKSB7CiAgICAgY2FzZSBNT0RFXzE6CiAgICAgICAvKiAobW9ubykgc2NlICAqLwotICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9TQ0UsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgKEZJWFBfREJMKU1BWFZBTF9EQkwpOworICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9TQ0UsICZjb3VudCwgJm1hcERlc2NyLCBtYXBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY250LCAoRklYUF9EQkwpTUFYVkFMX0RCTCk7CiAgICAgICBicmVhazsKICAgICBjYXNlIE1PREVfMjoKICAgICAgIC8qIChzdGVyZW8pIGNwZSAqLwotICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9DUEUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgKEZJWFBfREJMKU1BWFZBTF9EQkwpOworICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9DUEUsICZjb3VudCwgJm1hcERlc2NyLCBtYXBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY250LCAoRklYUF9EQkwpTUFYVkFMX0RCTCk7CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgTU9ERV8xXzI6CiAgICAgICAvKiBzY2UgKyBjcGUgKi8KLSAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1swXSwgSURfU0NFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuNGYpKTsKLSAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1sxXSwgSURfQ1BFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuNmYpKTsKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1swXSwgSURfU0NFLCAmY291bnQsICZtYXBEZXNjciwgbWFwSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC40ZikpOworICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzFdLCBJRF9DUEUsICZjb3VudCwgJm1hcERlc2NyLCBtYXBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjZmKSk7CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgTU9ERV8xXzJfMToKICAgICAgIC8qIHNjZSArIGNwZSArIHNjZSAqLwotICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9TQ0UsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4zZikpOwotICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzFdLCBJRF9DUEUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC40ZikpOwotICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzJdLCBJRF9TQ0UsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4zZikpOworICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9TQ0UsICZjb3VudCwgJm1hcERlc2NyLCBtYXBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjNmKSk7CisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMV0sIElEX0NQRSwgJmNvdW50LCAmbWFwRGVzY3IsIG1hcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuNGYpKTsKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1syXSwgSURfU0NFLCAmY291bnQsICZtYXBEZXNjciwgbWFwSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4zZikpOwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIE1PREVfMV8yXzI6CiAgICAgICAvKiBzY2UgKyBjcGUgKyBjcGUgKi8KLSAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1swXSwgSURfU0NFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMjZmKSk7Ci0gICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMV0sIElEX0NQRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjM3ZikpOwotICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzJdLCBJRF9DUEUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4zN2YpKTsKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1swXSwgSURfU0NFLCAmY291bnQsICZtYXBEZXNjciwgbWFwSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4yNmYpKTsKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1sxXSwgSURfQ1BFLCAmY291bnQsICZtYXBEZXNjciwgbWFwSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4zN2YpKTsKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1syXSwgSURfQ1BFLCAmY291bnQsICZtYXBEZXNjciwgbWFwSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4zN2YpKTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBNT0RFXzFfMl8yXzE6CiAgICAgICAvKiAoNS4xKSBzY2UgKyBjcGUgKyBjcGUgKyBsZmUgKi8KLSAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1swXSwgSURfU0NFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMjRmKSk7Ci0gICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMV0sIElEX0NQRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjM1ZikpOwotICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzJdLCBJRF9DUEUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4zNWYpKTsKLSAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1szXSwgSURfTEZFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMDZmKSk7CisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMF0sIElEX1NDRSwgJmNvdW50LCAmbWFwRGVzY3IsIG1hcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMjRmKSk7CisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMV0sIElEX0NQRSwgJmNvdW50LCAmbWFwRGVzY3IsIG1hcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMzVmKSk7CisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMl0sIElEX0NQRSwgJmNvdW50LCAmbWFwRGVzY3IsIG1hcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMzVmKSk7CisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bM10sIElEX0xGRSwgJmNvdW50LCAmbWFwRGVzY3IsIG1hcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMDZmKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTU9ERV82XzE6CisgICAgICAvKiAoNi4xKSBzY2UgKyBjcGUgKyBjcGUgKyBzY2UgKyBsZmUgKi8KKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1swXSwgSURfU0NFLCAmY291bnQsICZtYXBEZXNjciwgbWFwSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4yZikpOworICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzFdLCBJRF9DUEUsICZjb3VudCwgJm1hcERlc2NyLCBtYXBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjI3NWYpKTsKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1syXSwgSURfQ1BFLCAmY291bnQsICZtYXBEZXNjciwgbWFwSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4yNzVmKSk7CisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bM10sIElEX1NDRSwgJmNvdW50LCAmbWFwRGVzY3IsIG1hcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMmYpKTsKKyAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1s0XSwgSURfTEZFLCAmY291bnQsICZtYXBEZXNjciwgbWFwSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4wNWYpKTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBNT0RFXzFfMl8yXzJfMToKKyAgICBjYXNlIE1PREVfN18xX0JBQ0s6CisgICAgY2FzZSBNT0RFXzdfMV9UT1BfRlJPTlQ6CiAgICAgY2FzZSBNT0RFXzdfMV9SRUFSX1NVUlJPVU5EOgotICAgIGNhc2UgTU9ERV83XzFfRlJPTlRfQ0VOVEVSOgorICAgIGNhc2UgTU9ERV83XzFfRlJPTlRfQ0VOVEVSOiB7CiAgICAgICAvKiAoNy4xKSBzY2UgKyBjcGUgKyBjcGUgKyBjcGUgKyBsZmUgKi8KLSAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1swXSwgSURfU0NFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMThmKSk7Ci0gICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMV0sIElEX0NQRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjI2ZikpOwotICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzJdLCBJRF9DUEUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4yNmYpKTsKLSAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1szXSwgSURfQ1BFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMjZmKSk7Ci0gICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bNF0sIElEX0xGRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjA0ZikpOworICAgICAgLyogKDcuMSB0b3ApIHNjZSArIGNwZSArIGNwZSArIGxmZSArIGNwZSAqLworCisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMF0sIElEX1NDRSwgJmNvdW50LCAmbWFwRGVzY3IsIG1hcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMThmKSk7CisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMV0sIElEX0NQRSwgJmNvdW50LCAmbWFwRGVzY3IsIG1hcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMjZmKSk7CisgICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMl0sIElEX0NQRSwgJmNvdW50LCAmbWFwRGVzY3IsIG1hcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMjZmKSk7CisgICAgICBpZiAobW9kZSAhPSBNT0RFXzdfMV9UT1BfRlJPTlQpIHsKKyAgICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzNdLCBJRF9DUEUsICZjb3VudCwgJm1hcERlc2NyLCBtYXBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMjZmKSk7CisgICAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1s0XSwgSURfTEZFLCAmY291bnQsICZtYXBEZXNjciwgbWFwSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjA0ZikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzNdLCBJRF9MRkUsICZjb3VudCwgJm1hcERlc2NyLCBtYXBJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMDRmKSk7CisgICAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1s0XSwgSURfQ1BFLCAmY291bnQsICZtYXBEZXNjciwgbWFwSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjI2ZikpOworICAgICAgfQogICAgICAgYnJlYWs7CisgICAgfQorCiAgICAgZGVmYXVsdDoKICAgICAgIC8vKmNoTWFwPTA7CiAgICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOwogICB9OwogCi0KLSAgRkRLX0FTU0VSVChjbS0+bkVsZW1lbnRzPD0oOCkpOwotCisgIEZES19BU1NFUlQoY20tPm5FbGVtZW50cyA8PSAoKDgpKSk7CiAKICAgcmV0dXJuIEFBQ19FTkNfT0s7CiB9CiAKLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0RWxlbWVudEJpdHMoUUNfU1RBVEUgKmhRQywKLSAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HICpjbSwKLSAgICAgICAgICAgICAgICAgICAgSU5UIGJpdHJhdGVUb3QsCi0gICAgICAgICAgICAgICAgICAgIElOVCBhdmVyYWdlQml0c1RvdCwKLSAgICAgICAgICAgICAgICAgICAgSU5UIG1heENoYW5uZWxCaXRzKQoteworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRFbGVtZW50Qml0cyhRQ19TVEFURSogaFFDLCBDSEFOTkVMX01BUFBJTkcqIGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYml0cmF0ZVRvdCwgSU5UIGF2ZXJhZ2VCaXRzVG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWF4Q2hhbm5lbEJpdHMpIHsKICAgaW50IHNjX2JyVG90ID0gQ291bnRMZWFkaW5nQml0cyhiaXRyYXRlVG90KTsKIAotICBzd2l0Y2goY20tPmVuY01vZGUpIHsKLSAgY2FzZSBNT0RFXzE6Ci0gICAgaFFDLT5lbGVtZW50Qml0c1swXS0+Y2hCaXRyYXRlRWwgICAgICA9IGJpdHJhdGVUb3Q7CisgIHN3aXRjaCAoY20tPmVuY01vZGUpIHsKKyAgICBjYXNlIE1PREVfMToKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPmNoQml0cmF0ZUVsID0gYml0cmF0ZVRvdDsKIAotICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCAgICAgICAgPSBtYXhDaGFubmVsQml0czsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCA9IG1heENoYW5uZWxCaXRzOwogCi0gICAgaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgICA9IGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOwotICAgIGJyZWFrOworICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgTU9ERV8yOgotICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPmNoQml0cmF0ZUVsICAgICAgPSBiaXRyYXRlVG90Pj4xOworICAgIGNhc2UgTU9ERV8yOgorICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+Y2hCaXRyYXRlRWwgPSBiaXRyYXRlVG90ID4+IDE7CiAKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5tYXhCaXRzRWwgICAgICAgID0gMiptYXhDaGFubmVsQml0czsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCA9IDIgKiBtYXhDaGFubmVsQml0czsKIAotICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsICAgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKLSAgICBicmVhazsKLSAgY2FzZSBNT0RFXzFfMjogewotICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKLSAgICBGSVhQX0RCTCBzY2VSYXRlID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7Ci0gICAgRklYUF9EQkwgY3BlUmF0ZSA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOworICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV8xXzI6IHsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOworICAgICAgRklYUF9EQkwgc2NlUmF0ZSA9IGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOworICAgICAgRklYUF9EQkwgY3BlUmF0ZSA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOwogCi0gICAgaFFDLT5lbGVtZW50Qml0c1swXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KHNjZVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+c2NfYnJUb3Q7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KGNwZVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+KHNjX2JyVG90KzEpOworICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+Y2hCaXRyYXRlRWwgPQorICAgICAgICAgIGZNdWx0KHNjZVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdCA8PCBzY19iclRvdCkpID4+IHNjX2JyVG90OworICAgICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+Y2hCaXRyYXRlRWwgPQorICAgICAgICAgIGZNdWx0KGNwZVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdCA8PCBzY19iclRvdCkpID4+IChzY19iclRvdCArIDEpOwogCi0gICAgaFFDLT5lbGVtZW50Qml0c1swXS0+bWF4Qml0c0VsICAgICAgICA9IG1heENoYW5uZWxCaXRzOwotICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPm1heEJpdHNFbCAgICAgICAgPSAyKm1heENoYW5uZWxCaXRzOwotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgTU9ERV8xXzJfMTogewotICAgIC8qIHNjZSArIGNwZSArIHNjZSAqLwotICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMl0ucmVsYXRpdmVCaXRzOwotICAgIEZJWFBfREJMIHNjZTFSYXRlID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7Ci0gICAgRklYUF9EQkwgY3BlUmF0ZSAgPSBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKLSAgICBGSVhQX0RCTCBzY2UyUmF0ZSA9IGNtLT5lbEluZm9bMl0ucmVsYXRpdmVCaXRzOworICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+bWF4Qml0c0VsID0gbWF4Q2hhbm5lbEJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5tYXhCaXRzRWwgPSAyICogbWF4Q2hhbm5lbEJpdHM7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBNT0RFXzFfMl8xOiB7CisgICAgICAvKiBzY2UgKyBjcGUgKyBzY2UgKi8KKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOworICAgICAgaFFDLT5lbGVtZW50Qml0c1syXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzJdLnJlbGF0aXZlQml0czsKKyAgICAgIEZJWFBfREJMIHNjZTFSYXRlID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7CisgICAgICBGSVhQX0RCTCBjcGVSYXRlID0gY20tPmVsSW5mb1sxXS5yZWxhdGl2ZUJpdHM7CisgICAgICBGSVhQX0RCTCBzY2UyUmF0ZSA9IGNtLT5lbEluZm9bMl0ucmVsYXRpdmVCaXRzOwogCi0gICAgaFFDLT5lbGVtZW50Qml0c1swXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KHNjZTFSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PnNjX2JyVG90OwotICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChjcGVSYXRlLCAgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj4oc2NfYnJUb3QrMSk7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1syXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KHNjZTJSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PnNjX2JyVG90OworICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+Y2hCaXRyYXRlRWwgPQorICAgICAgICAgIGZNdWx0KHNjZTFSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3QgPDwgc2NfYnJUb3QpKSA+PiBzY19iclRvdDsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPmNoQml0cmF0ZUVsID0KKyAgICAgICAgICBmTXVsdChjcGVSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3QgPDwgc2NfYnJUb3QpKSA+PiAoc2NfYnJUb3QgKyAxKTsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPmNoQml0cmF0ZUVsID0KKyAgICAgICAgICBmTXVsdChzY2UyUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90IDw8IHNjX2JyVG90KSkgPj4gc2NfYnJUb3Q7CiAKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5tYXhCaXRzRWwgICAgICAgID0gbWF4Q2hhbm5lbEJpdHM7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+bWF4Qml0c0VsICAgICAgICA9IDIqbWF4Q2hhbm5lbEJpdHM7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1syXS0+bWF4Qml0c0VsICAgICAgICA9IG1heENoYW5uZWxCaXRzOwotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgTU9ERV8xXzJfMjogewotICAgIC8qIHNjZSArIGNwZSArIGNwZSAqLwotICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMl0ucmVsYXRpdmVCaXRzOwotICAgIEZJWFBfREJMIHNjZVJhdGUgID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7Ci0gICAgRklYUF9EQkwgY3BlMVJhdGUgPSBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKLSAgICBGSVhQX0RCTCBjcGUyUmF0ZSA9IGNtLT5lbEluZm9bMl0ucmVsYXRpdmVCaXRzOworICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+bWF4Qml0c0VsID0gbWF4Q2hhbm5lbEJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5tYXhCaXRzRWwgPSAyICogbWF4Q2hhbm5lbEJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5tYXhCaXRzRWwgPSBtYXhDaGFubmVsQml0czsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE1PREVfMV8yXzI6IHsKKyAgICAgIC8qIHNjZSArIGNwZSArIGNwZSAqLworICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1sxXS5yZWxhdGl2ZUJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMl0ucmVsYXRpdmVCaXRzOworICAgICAgRklYUF9EQkwgc2NlUmF0ZSA9IGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOworICAgICAgRklYUF9EQkwgY3BlMVJhdGUgPSBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKKyAgICAgIEZJWFBfREJMIGNwZTJSYXRlID0gY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7CiAKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5jaEJpdHJhdGVFbCAgICAgID0gZk11bHQoc2NlUmF0ZSwgIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+c2NfYnJUb3Q7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KGNwZTFSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PihzY19iclRvdCsxKTsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5jaEJpdHJhdGVFbCAgICAgID0gZk11bHQoY3BlMlJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+KHNjX2JyVG90KzEpOworICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+Y2hCaXRyYXRlRWwgPQorICAgICAgICAgIGZNdWx0KHNjZVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdCA8PCBzY19iclRvdCkpID4+IHNjX2JyVG90OworICAgICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+Y2hCaXRyYXRlRWwgPQorICAgICAgICAgIGZNdWx0KGNwZTFSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3QgPDwgc2NfYnJUb3QpKSA+PiAoc2NfYnJUb3QgKyAxKTsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPmNoQml0cmF0ZUVsID0KKyAgICAgICAgICBmTXVsdChjcGUyUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90IDw8IHNjX2JyVG90KSkgPj4gKHNjX2JyVG90ICsgMSk7CiAKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5tYXhCaXRzRWwgICAgICAgID0gbWF4Q2hhbm5lbEJpdHM7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+bWF4Qml0c0VsICAgICAgICA9IDIqbWF4Q2hhbm5lbEJpdHM7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1syXS0+bWF4Qml0c0VsICAgICAgICA9IDIqbWF4Q2hhbm5lbEJpdHM7Ci0gICAgYnJlYWs7Ci0gIH0KKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCA9IG1heENoYW5uZWxCaXRzOworICAgICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+bWF4Qml0c0VsID0gMiAqIG1heENoYW5uZWxCaXRzOworICAgICAgaFFDLT5lbGVtZW50Qml0c1syXS0+bWF4Qml0c0VsID0gMiAqIG1heENoYW5uZWxCaXRzOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgTU9ERV8xXzJfMl8xOiB7CisgICAgICAvKiAoNS4xKSBzY2UgKyBjcGUgKyBjcGUgKyBsZmUgKi8KKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOworICAgICAgaFFDLT5lbGVtZW50Qml0c1syXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzJdLnJlbGF0aXZlQml0czsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbM10tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1szXS5yZWxhdGl2ZUJpdHM7CisgICAgICBGSVhQX0RCTCBzY2VSYXRlID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7CisgICAgICBGSVhQX0RCTCBjcGUxUmF0ZSA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOworICAgICAgRklYUF9EQkwgY3BlMlJhdGUgPSBjbS0+ZWxJbmZvWzJdLnJlbGF0aXZlQml0czsKKyAgICAgIEZJWFBfREJMIGxmZVJhdGUgPSBjbS0+ZWxJbmZvWzNdLnJlbGF0aXZlQml0czsKIAotICBjYXNlIE1PREVfMV8yXzJfMTogewotICAgIC8qICg1LjEpIHNjZSArIGNwZSArIGNwZSArIGxmZSAqLwotICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMl0ucmVsYXRpdmVCaXRzOwotICAgIGhRQy0+ZWxlbWVudEJpdHNbM10tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1szXS5yZWxhdGl2ZUJpdHM7Ci0gICAgRklYUF9EQkwgc2NlUmF0ZSAgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKLSAgICBGSVhQX0RCTCBjcGUxUmF0ZSA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOwotICAgIEZJWFBfREJMIGNwZTJSYXRlID0gY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7Ci0gICAgRklYUF9EQkwgbGZlUmF0ZSAgPSBjbS0+ZWxJbmZvWzNdLnJlbGF0aXZlQml0czsKKyAgICAgIGludCBtYXhCaXRzVG90ID0KKyAgICAgICAgICBtYXhDaGFubmVsQml0cyAqIDU7IC8qIExGRSBkb2VzIG5vdCBhZGQgdG8gYml0IHJlc2Vydm9pciAqLworICAgICAgaW50IHNjID0gQ291bnRMZWFkaW5nQml0cyhmaXhNYXgobWF4Q2hhbm5lbEJpdHMsIGF2ZXJhZ2VCaXRzVG90KSk7CisgICAgICBpbnQgbWF4TGZlQml0cyA9IChpbnQpZk1heCgKKyAgICAgICAgICAoSU5UKSgoZk11bHQobGZlUmF0ZSwgKEZJWFBfREJMKShtYXhDaGFubmVsQml0cyA8PCBzYykpID4+IHNjKSA8PCAxKSwKKyAgICAgICAgICAoSU5UKSgoZk11bHQoRkwyRlhDT05TVF9EQkwoMS4xZiAvIDIuZiksCisgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGxmZVJhdGUsIChGSVhQX0RCTCkoYXZlcmFnZUJpdHNUb3QgPDwgc2MpKSkKKyAgICAgICAgICAgICAgICAgPDwgMSkgPj4KKyAgICAgICAgICAgICAgICBzYykpOwogCi0gICAgaW50IG1heEJpdHNUb3QgPSBtYXhDaGFubmVsQml0cyAqIDU7IC8qIExGRSBkb2VzIG5vdCBhZGQgdG8gYml0IHJlc2Vydm9pciAqLwotICAgIGludCBzYyA9IENvdW50TGVhZGluZ0JpdHMoZml4TWF4KG1heENoYW5uZWxCaXRzLGF2ZXJhZ2VCaXRzVG90KSk7Ci0gICAgaW50IG1heExmZUJpdHMgPSAoaW50KSBGREttYXggKCAoSU5UKSgoZk11bHQobGZlUmF0ZSwoRklYUF9EQkwpKG1heENoYW5uZWxCaXRzPDxzYykpPj5zYyk8PDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElOVCkoKGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMWYvMi5mKSxmTXVsdChsZmVSYXRlLChGSVhQX0RCTCkoYXZlcmFnZUJpdHNUb3Q8PHNjKSkpPDwxKT4+c2MpICk7CisgICAgICBtYXhDaGFubmVsQml0cyA9IChtYXhCaXRzVG90IC0gbWF4TGZlQml0cyk7CisgICAgICBzYyA9IENvdW50TGVhZGluZ0JpdHMobWF4Q2hhbm5lbEJpdHMpOwogCi0gICAgbWF4Q2hhbm5lbEJpdHMgPSAobWF4Qml0c1RvdCAtIG1heExmZUJpdHMpOwotICAgIHNjID0gQ291bnRMZWFkaW5nQml0cyhtYXhDaGFubmVsQml0cyk7CisgICAgICBtYXhDaGFubmVsQml0cyA9CisgICAgICAgICAgZk11bHQoKEZJWFBfREJMKW1heENoYW5uZWxCaXRzIDw8IHNjLCBHZXRJbnZJbnQoNSkpID4+IHNjOwogCi0gICAgbWF4Q2hhbm5lbEJpdHMgPSBmTXVsdCgoRklYUF9EQkwpbWF4Q2hhbm5lbEJpdHM8PHNjLEdldEludkludCg1KSk+PnNjOworICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+Y2hCaXRyYXRlRWwgPQorICAgICAgICAgIGZNdWx0KHNjZVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdCA8PCBzY19iclRvdCkpID4+IHNjX2JyVG90OworICAgICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+Y2hCaXRyYXRlRWwgPQorICAgICAgICAgIGZNdWx0KGNwZTFSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3QgPDwgc2NfYnJUb3QpKSA+PiAoc2NfYnJUb3QgKyAxKTsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPmNoQml0cmF0ZUVsID0KKyAgICAgICAgICBmTXVsdChjcGUyUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90IDw8IHNjX2JyVG90KSkgPj4gKHNjX2JyVG90ICsgMSk7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzNdLT5jaEJpdHJhdGVFbCA9CisgICAgICAgICAgZk11bHQobGZlUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90IDw8IHNjX2JyVG90KSkgPj4gc2NfYnJUb3Q7CiAKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5jaEJpdHJhdGVFbCAgICAgID0gZk11bHQoc2NlUmF0ZSwgIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+c2NfYnJUb3Q7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KGNwZTFSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PihzY19iclRvdCsxKTsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5jaEJpdHJhdGVFbCAgICAgID0gZk11bHQoY3BlMlJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+KHNjX2JyVG90KzEpOwotICAgIGhRQy0+ZWxlbWVudEJpdHNbM10tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChsZmVSYXRlLCAgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj5zY19iclRvdDsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCA9IG1heENoYW5uZWxCaXRzOworICAgICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+bWF4Qml0c0VsID0gMiAqIG1heENoYW5uZWxCaXRzOworICAgICAgaFFDLT5lbGVtZW50Qml0c1syXS0+bWF4Qml0c0VsID0gMiAqIG1heENoYW5uZWxCaXRzOworICAgICAgaFFDLT5lbGVtZW50Qml0c1szXS0+bWF4Qml0c0VsID0gbWF4TGZlQml0czsKIAotICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCAgICAgICAgPSBtYXhDaGFubmVsQml0czsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5tYXhCaXRzRWwgICAgICAgID0gMiptYXhDaGFubmVsQml0czsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5tYXhCaXRzRWwgICAgICAgID0gMiptYXhDaGFubmVsQml0czsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzNdLT5tYXhCaXRzRWwgICAgICAgID0gbWF4TGZlQml0czsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE1PREVfNl8xOiB7CisgICAgICAvKiAoNi4xKSBzY2UgKyBjcGUgKyBjcGUgKyBzY2UgKyBsZmUgKi8KKyAgICAgIEZJWFBfREJMIHNjZVJhdGUgPSBoUUMtPmVsZW1lbnRCaXRzWzBdLT5yZWxhdGl2ZUJpdHNFbCA9CisgICAgICAgICAgY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7CisgICAgICBGSVhQX0RCTCBjcGUxUmF0ZSA9IGhRQy0+ZWxlbWVudEJpdHNbMV0tPnJlbGF0aXZlQml0c0VsID0KKyAgICAgICAgICBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKKyAgICAgIEZJWFBfREJMIGNwZTJSYXRlID0gaFFDLT5lbGVtZW50Qml0c1syXS0+cmVsYXRpdmVCaXRzRWwgPQorICAgICAgICAgIGNtLT5lbEluZm9bMl0ucmVsYXRpdmVCaXRzOworICAgICAgRklYUF9EQkwgc2NlMlJhdGUgPSBoUUMtPmVsZW1lbnRCaXRzWzNdLT5yZWxhdGl2ZUJpdHNFbCA9CisgICAgICAgICAgY20tPmVsSW5mb1szXS5yZWxhdGl2ZUJpdHM7CisgICAgICBGSVhQX0RCTCBsZmVSYXRlID0gaFFDLT5lbGVtZW50Qml0c1s0XS0+cmVsYXRpdmVCaXRzRWwgPQorICAgICAgICAgIGNtLT5lbEluZm9bNF0ucmVsYXRpdmVCaXRzOwogCi0gICAgYnJlYWs7Ci0gIH0KLSAgY2FzZSBNT0RFXzdfMV9SRUFSX1NVUlJPVU5EOgotICBjYXNlIE1PREVfN18xX0ZST05UX0NFTlRFUjoKLSAgY2FzZSBNT0RFXzFfMl8yXzJfMTogewotICAgIGludCBjcGUzSWR4ID0gMzsKLSAgICBpbnQgbGZlSWR4ICA9IDQ7CisgICAgICBpbnQgbWF4Qml0c1RvdCA9CisgICAgICAgICAgbWF4Q2hhbm5lbEJpdHMgKiA2OyAvKiBMRkUgZG9lcyBub3QgYWRkIHRvIGJpdCByZXNlcnZvaXIgKi8KKyAgICAgIGludCBzYyA9IENvdW50TGVhZGluZ0JpdHMoZml4TWF4KG1heENoYW5uZWxCaXRzLCBhdmVyYWdlQml0c1RvdCkpOworICAgICAgaW50IG1heExmZUJpdHMgPSAoaW50KWZNYXgoCisgICAgICAgICAgKElOVCkoKGZNdWx0KGxmZVJhdGUsIChGSVhQX0RCTCkobWF4Q2hhbm5lbEJpdHMgPDwgc2MpKSA+PiBzYykgPDwgMSksCisgICAgICAgICAgKElOVCkoKGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMWYgLyAyLmYpLAorICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChsZmVSYXRlLCAoRklYUF9EQkwpKGF2ZXJhZ2VCaXRzVG90IDw8IHNjKSkpCisgICAgICAgICAgICAgICAgIDw8IDEpID4+CisgICAgICAgICAgICAgICAgc2MpKTsKIAotICAgIC8qICg3LjEpIHNjZSArIGNwZSArIGNwZSArIGNwZSArIGxmZSAqLwotICAgIEZJWFBfREJMIHNjZVJhdGUgID0gaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKLSAgICBGSVhQX0RCTCBjcGUxUmF0ZSA9IGhRQy0+ZWxlbWVudEJpdHNbMV0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1sxXS5yZWxhdGl2ZUJpdHM7Ci0gICAgRklYUF9EQkwgY3BlMlJhdGUgPSBoUUMtPmVsZW1lbnRCaXRzWzJdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMl0ucmVsYXRpdmVCaXRzOwotICAgIEZJWFBfREJMIGNwZTNSYXRlID0gaFFDLT5lbGVtZW50Qml0c1tjcGUzSWR4XS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvW2NwZTNJZHhdLnJlbGF0aXZlQml0czsKLSAgICBGSVhQX0RCTCBsZmVSYXRlICA9IGhRQy0+ZWxlbWVudEJpdHNbbGZlSWR4XS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvW2xmZUlkeF0ucmVsYXRpdmVCaXRzOworICAgICAgbWF4Q2hhbm5lbEJpdHMgPSAobWF4Qml0c1RvdCAtIG1heExmZUJpdHMpIC8gNjsKIAotICAgIGludCBtYXhCaXRzVG90ID0gbWF4Q2hhbm5lbEJpdHMgKiA3OyAvKiBMRkUgZG9lcyBub3QgYWRkIHRvIGJpdCByZXNlcnZvaXIgKi8KLSAgICBpbnQgc2MgPSBDb3VudExlYWRpbmdCaXRzKGZpeE1heChtYXhDaGFubmVsQml0cyxhdmVyYWdlQml0c1RvdCkpOwotICAgIGludCBtYXhMZmVCaXRzID0gKGludCkgRkRLbWF4ICggKElOVCkoKGZNdWx0KGxmZVJhdGUsKEZJWFBfREJMKShtYXhDaGFubmVsQml0czw8c2MpKT4+c2MpPDwxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQpKChmTXVsdChGTDJGWENPTlNUX0RCTCgxLjFmLzIuZiksZk11bHQobGZlUmF0ZSwoRklYUF9EQkwpKGF2ZXJhZ2VCaXRzVG90PDxzYykpKTw8MSk+PnNjKSApOworICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+Y2hCaXRyYXRlRWwgPQorICAgICAgICAgIGZNdWx0KHNjZVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdCA8PCBzY19iclRvdCkpID4+IHNjX2JyVG90OworICAgICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+Y2hCaXRyYXRlRWwgPQorICAgICAgICAgIGZNdWx0KGNwZTFSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3QgPDwgc2NfYnJUb3QpKSA+PiAoc2NfYnJUb3QgKyAxKTsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPmNoQml0cmF0ZUVsID0KKyAgICAgICAgICBmTXVsdChjcGUyUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90IDw8IHNjX2JyVG90KSkgPj4gKHNjX2JyVG90ICsgMSk7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzNdLT5jaEJpdHJhdGVFbCA9CisgICAgICAgICAgZk11bHQoc2NlMlJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdCA8PCBzY19iclRvdCkpID4+IChzY19iclRvdCArIDEpOworICAgICAgaFFDLT5lbGVtZW50Qml0c1s0XS0+Y2hCaXRyYXRlRWwgPQorICAgICAgICAgIGZNdWx0KGxmZVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdCA8PCBzY19iclRvdCkpID4+IHNjX2JyVG90OwogCi0gICAgbWF4Q2hhbm5lbEJpdHMgPSAobWF4Qml0c1RvdCAtIG1heExmZUJpdHMpIC8gNzsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCA9IG1heENoYW5uZWxCaXRzOworICAgICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+bWF4Qml0c0VsID0gMiAqIG1heENoYW5uZWxCaXRzOworICAgICAgaFFDLT5lbGVtZW50Qml0c1syXS0+bWF4Qml0c0VsID0gMiAqIG1heENoYW5uZWxCaXRzOworICAgICAgaFFDLT5lbGVtZW50Qml0c1szXS0+bWF4Qml0c0VsID0gbWF4Q2hhbm5lbEJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzRdLT5tYXhCaXRzRWwgPSBtYXhMZmVCaXRzOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgTU9ERV83XzFfVE9QX0ZST05UOgorICAgIGNhc2UgTU9ERV83XzFfQkFDSzoKKyAgICBjYXNlIE1PREVfN18xX1JFQVJfU1VSUk9VTkQ6CisgICAgY2FzZSBNT0RFXzdfMV9GUk9OVF9DRU5URVI6CisgICAgY2FzZSBNT0RFXzFfMl8yXzJfMTogeworICAgICAgaW50IGNwZTNJZHggPSAoY20tPmVuY01vZGUgIT0gTU9ERV83XzFfVE9QX0ZST05UKSA/IDMgOiA0OworICAgICAgaW50IGxmZUlkeCA9IChjbS0+ZW5jTW9kZSAhPSBNT0RFXzdfMV9UT1BfRlJPTlQpID8gNCA6IDM7CiAKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5jaEJpdHJhdGVFbCA9IGZNdWx0KHNjZVJhdGUsICAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PnNjX2JyVG90OwotICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPmNoQml0cmF0ZUVsID0gZk11bHQoY3BlMVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+KHNjX2JyVG90KzEpOwotICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPmNoQml0cmF0ZUVsID0gZk11bHQoY3BlMlJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+KHNjX2JyVG90KzEpOwotICAgIGhRQy0+ZWxlbWVudEJpdHNbY3BlM0lkeF0tPmNoQml0cmF0ZUVsID0gZk11bHQoY3BlM1JhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+KHNjX2JyVG90KzEpOwotICAgIGhRQy0+ZWxlbWVudEJpdHNbbGZlSWR4XS0+Y2hCaXRyYXRlRWwgPSBmTXVsdChsZmVSYXRlLCAgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj5zY19iclRvdDsKKyAgICAgIC8qICg3LjEpIHNjZSArIGNwZSArIGNwZSArIGNwZSArIGxmZSAqLworICAgICAgRklYUF9EQkwgc2NlUmF0ZSA9IGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsID0KKyAgICAgICAgICBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKKyAgICAgIEZJWFBfREJMIGNwZTFSYXRlID0gaFFDLT5lbGVtZW50Qml0c1sxXS0+cmVsYXRpdmVCaXRzRWwgPQorICAgICAgICAgIGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOworICAgICAgRklYUF9EQkwgY3BlMlJhdGUgPSBoUUMtPmVsZW1lbnRCaXRzWzJdLT5yZWxhdGl2ZUJpdHNFbCA9CisgICAgICAgICAgY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7CisgICAgICBGSVhQX0RCTCBjcGUzUmF0ZSA9IGhRQy0+ZWxlbWVudEJpdHNbY3BlM0lkeF0tPnJlbGF0aXZlQml0c0VsID0KKyAgICAgICAgICBjbS0+ZWxJbmZvW2NwZTNJZHhdLnJlbGF0aXZlQml0czsKKyAgICAgIEZJWFBfREJMIGxmZVJhdGUgPSBoUUMtPmVsZW1lbnRCaXRzW2xmZUlkeF0tPnJlbGF0aXZlQml0c0VsID0KKyAgICAgICAgICBjbS0+ZWxJbmZvW2xmZUlkeF0ucmVsYXRpdmVCaXRzOwogCi0gICAgaFFDLT5lbGVtZW50Qml0c1swXS0+bWF4Qml0c0VsID0gbWF4Q2hhbm5lbEJpdHM7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+bWF4Qml0c0VsID0gMiptYXhDaGFubmVsQml0czsKLSAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5tYXhCaXRzRWwgPSAyKm1heENoYW5uZWxCaXRzOwotICAgIGhRQy0+ZWxlbWVudEJpdHNbY3BlM0lkeF0tPm1heEJpdHNFbCA9IDIqbWF4Q2hhbm5lbEJpdHM7Ci0gICAgaFFDLT5lbGVtZW50Qml0c1tsZmVJZHhdLT5tYXhCaXRzRWwgPSBtYXhMZmVCaXRzOwotICAgIGJyZWFrOwotICB9Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKKyAgICAgIGludCBtYXhCaXRzVG90ID0KKyAgICAgICAgICBtYXhDaGFubmVsQml0cyAqIDc7IC8qIExGRSBkb2VzIG5vdCBhZGQgdG8gYml0IHJlc2Vydm9pciAqLworICAgICAgaW50IHNjID0gQ291bnRMZWFkaW5nQml0cyhmaXhNYXgobWF4Q2hhbm5lbEJpdHMsIGF2ZXJhZ2VCaXRzVG90KSk7CisgICAgICBpbnQgbWF4TGZlQml0cyA9IChpbnQpZk1heCgKKyAgICAgICAgICAoSU5UKSgoZk11bHQobGZlUmF0ZSwgKEZJWFBfREJMKShtYXhDaGFubmVsQml0cyA8PCBzYykpID4+IHNjKSA8PCAxKSwKKyAgICAgICAgICAoSU5UKSgoZk11bHQoRkwyRlhDT05TVF9EQkwoMS4xZiAvIDIuZiksCisgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGxmZVJhdGUsIChGSVhQX0RCTCkoYXZlcmFnZUJpdHNUb3QgPDwgc2MpKSkKKyAgICAgICAgICAgICAgICAgPDwgMSkgPj4KKyAgICAgICAgICAgICAgICBzYykpOworCisgICAgICBtYXhDaGFubmVsQml0cyA9IChtYXhCaXRzVG90IC0gbWF4TGZlQml0cykgLyA3OworCisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5jaEJpdHJhdGVFbCA9CisgICAgICAgICAgZk11bHQoc2NlUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90IDw8IHNjX2JyVG90KSkgPj4gc2NfYnJUb3Q7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5jaEJpdHJhdGVFbCA9CisgICAgICAgICAgZk11bHQoY3BlMVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdCA8PCBzY19iclRvdCkpID4+IChzY19iclRvdCArIDEpOworICAgICAgaFFDLT5lbGVtZW50Qml0c1syXS0+Y2hCaXRyYXRlRWwgPQorICAgICAgICAgIGZNdWx0KGNwZTJSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3QgPDwgc2NfYnJUb3QpKSA+PiAoc2NfYnJUb3QgKyAxKTsKKyAgICAgIGhRQy0+ZWxlbWVudEJpdHNbY3BlM0lkeF0tPmNoQml0cmF0ZUVsID0KKyAgICAgICAgICBmTXVsdChjcGUzUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90IDw8IHNjX2JyVG90KSkgPj4gKHNjX2JyVG90ICsgMSk7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzW2xmZUlkeF0tPmNoQml0cmF0ZUVsID0KKyAgICAgICAgICBmTXVsdChsZmVSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3QgPDwgc2NfYnJUb3QpKSA+PiBzY19iclRvdDsKKworICAgICAgaFFDLT5lbGVtZW50Qml0c1swXS0+bWF4Qml0c0VsID0gbWF4Q2hhbm5lbEJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5tYXhCaXRzRWwgPSAyICogbWF4Q2hhbm5lbEJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5tYXhCaXRzRWwgPSAyICogbWF4Q2hhbm5lbEJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzW2NwZTNJZHhdLT5tYXhCaXRzRWwgPSAyICogbWF4Q2hhbm5lbEJpdHM7CisgICAgICBoUUMtPmVsZW1lbnRCaXRzW2xmZUlkeF0tPm1heEJpdHNFbCA9IG1heExmZUJpdHM7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKICAgfQogCiAgIHJldHVybiBBQUNfRU5DX09LOwpAQCAtNDkxLDYxICs1OTgsNjYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZnVuY3Rpb246ICAgIEdldE1vbm9TdGVyZW9NT0RFKGNvbnN0IENIQU5ORUxfTU9ERSBtb2RlKSAgICAgICAgICAgICAgICAgICAgICAqLworLyogZnVuY3Rpb246ICAgIEdldE1vbm9TdGVyZW9NT0RFKGNvbnN0IENIQU5ORUxfTU9ERSBtb2RlKSAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZGVzY3JpcHRpb246IERldGVybWluZXMgZW5jb2RlciBzZXR0aW5nIGZyb20gY2hhbm5lbCBtb2RlLiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgIE11bHRpY2hhbm5lbCBtb2RlcyBhcmUgbWFwcGVkIHRvIG1vbm8gb3Igc3RlcmVvIG1vZGVzICAgICAgICAgICAqLworLyogZGVzY3JpcHRpb246IERldGVybWluZXMgZW5jb2RlciBzZXR0aW5nIGZyb20gY2hhbm5lbCBtb2RlLiAqLworLyogICAgICAgICAgICAgIE11bHRpY2hhbm5lbCBtb2RlcyBhcmUgbWFwcGVkIHRvIG1vbm8gb3Igc3RlcmVvIG1vZGVzICovCiAvKiAgICAgICAgICAgICAgcmV0dXJucyBNT0RFX01PTk8gaW4gY2FzZSBvZiBtb25vLCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICBNT0RFX1NURVJFTyBpbiBjYXNlIG9mIHN0ZXJlbyAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICBNT0RFX0lOVkFMSUQgaW4gY2FzZSBvZiBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBpbnB1dDogICAgICAgQ0hBTk5FTF9NT0RFIG1vZGU6IEVuY29kZXIgbW9kZSAoc2VlIHFjX2RhdGEuaCkuICAgICAgICAgICAgICAgICovCi0vKiBvdXRwdXQ6ICAgICAgcmV0dXJuOiBDTV9TVEVSRU9fTU9ERSBtb25vU3RlcmVvU2V0dGluZyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBpbnB1dDogICAgICAgQ0hBTk5FTF9NT0RFIG1vZGU6IEVuY29kZXIgbW9kZSAoc2VlIHFjX2RhdGEuaCkuICovCisvKiBvdXRwdXQ6ICAgICAgcmV0dXJuOiBDTV9TVEVSRU9fTU9ERSBtb25vU3RlcmVvU2V0dGluZyAqLwogLyogICAgICAgICAgICAgIChNT0RFX0lOVkFMSUQ6IGVycm9yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICBNT0RFX01PTk86ICAgIG1vbm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICBNT0RFX1NURVJFTzogIHN0ZXJlbykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogbWlzYzogICAgICAgIE5vIG1lbW9yeSBpcyBhbGxvY2F0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogbWlzYzogICAgICAgIE5vIG1lbW9yeSBpcyBhbGxvY2F0ZWQuICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUVMRU1FTlRfTU9ERSBGREthYWNFbmNfR2V0TW9ub1N0ZXJlb01vZGUoY29uc3QgQ0hBTk5FTF9NT0RFIG1vZGUpewotCitFTEVNRU5UX01PREUgRkRLYWFjRW5jX0dldE1vbm9TdGVyZW9Nb2RlKGNvbnN0IENIQU5ORUxfTU9ERSBtb2RlKSB7CiAgIEVMRU1FTlRfTU9ERSBtb25vU3RlcmVvU2V0dGluZyA9IEVMX01PREVfSU5WQUxJRDsKIAotICBzd2l0Y2gobW9kZSl7Ci0gIGNhc2UgTU9ERV8xOiAgICAgICAgLyogbW9ubyBzZXR1cHMgKi8KLSAgICBtb25vU3RlcmVvU2V0dGluZyA9IEVMX01PREVfTU9OTzsKLSAgICBicmVhazsKLSAgY2FzZSBNT0RFXzI6ICAgICAgICAvKiBzdGVyZW8gc2V0dXBzICovCi0gIGNhc2UgTU9ERV8xXzI6Ci0gIGNhc2UgTU9ERV8xXzJfMToKLSAgY2FzZSBNT0RFXzFfMl8yOgotICBjYXNlIE1PREVfMV8yXzJfMToKLSAgY2FzZSBNT0RFXzFfMl8yXzJfMToKLSAgY2FzZSBNT0RFXzdfMV9SRUFSX1NVUlJPVU5EOgotICBjYXNlIE1PREVfN18xX0ZST05UX0NFTlRFUjoKLSAgICBtb25vU3RlcmVvU2V0dGluZyA9IEVMX01PREVfU1RFUkVPOwotICAgIGJyZWFrOwotICBkZWZhdWx0OiAgICAgICAgICAgIC8qIGVycm9yICovCi0gICAgbW9ub1N0ZXJlb1NldHRpbmcgPSBFTF9NT0RFX0lOVkFMSUQ7Ci0gICAgYnJlYWs7CisgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgTU9ERV8xOiAvKiBtb25vIHNldHVwcyAqLworICAgICAgbW9ub1N0ZXJlb1NldHRpbmcgPSBFTF9NT0RFX01PTk87CisgICAgICBicmVhazsKKworICAgIGNhc2UgTU9ERV8yOiAvKiBzdGVyZW8gc2V0dXBzICovCisgICAgY2FzZSBNT0RFXzFfMjoKKyAgICBjYXNlIE1PREVfMV8yXzE6CisgICAgY2FzZSBNT0RFXzFfMl8yOgorICAgIGNhc2UgTU9ERV8xXzJfMl8xOgorICAgIGNhc2UgTU9ERV82XzE6CisgICAgY2FzZSBNT0RFXzFfMl8yXzJfMToKKyAgICBjYXNlIE1PREVfN18xX1JFQVJfU1VSUk9VTkQ6CisgICAgY2FzZSBNT0RFXzdfMV9GUk9OVF9DRU5URVI6CisgICAgY2FzZSBNT0RFXzdfMV9CQUNLOgorICAgIGNhc2UgTU9ERV83XzFfVE9QX0ZST05UOgorICAgICAgbW9ub1N0ZXJlb1NldHRpbmcgPSBFTF9NT0RFX1NURVJFTzsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDogLyogZXJyb3IgKi8KKyAgICAgIG1vbm9TdGVyZW9TZXR0aW5nID0gRUxfTU9ERV9JTlZBTElEOworICAgICAgYnJlYWs7CiAgIH0KIAogICByZXR1cm4gbW9ub1N0ZXJlb1NldHRpbmc7CiB9CiAKLWNvbnN0IENIQU5ORUxfTU9ERV9DT05GSUdfVEFCKiBGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKGNvbnN0IENIQU5ORUxfTU9ERSBtb2RlKQoteworY29uc3QgQ0hBTk5FTF9NT0RFX0NPTkZJR19UQUIqIEZES2FhY0VuY19HZXRDaGFubmVsTW9kZUNvbmZpZ3VyYXRpb24oCisgICAgY29uc3QgQ0hBTk5FTF9NT0RFIG1vZGUpIHsKICAgSU5UIGk7Ci0gIGNvbnN0IENIQU5ORUxfTU9ERV9DT05GSUdfVEFCICpjbV9jb25maWcgPSBOVUxMOworICBjb25zdCBDSEFOTkVMX01PREVfQ09ORklHX1RBQiogY21fY29uZmlnID0gTlVMTDsKIAogICAvKiBnZXQgY2hhbm5lbCBtb2RlIGNvbmZpZyAqLwotICBmb3IgKGk9MDsgaTwoSU5UKXNpemVvZihjaGFubmVsTW9kZUNvbmZpZykvKElOVClzaXplb2YoQ0hBTk5FTF9NT0RFX0NPTkZJR19UQUIpOyBpKyspIHsKLSAgICBpZiAoY2hhbm5lbE1vZGVDb25maWdbaV0uZW5jTW9kZT09bW9kZSkKLSAgICB7Ci0gICAgICAgIGNtX2NvbmZpZyA9ICZjaGFubmVsTW9kZUNvbmZpZ1tpXTsKLSAgICAgICAgYnJlYWs7CisgIGZvciAoaSA9IDA7IGkgPCAoSU5UKXNpemVvZihjaGFubmVsTW9kZUNvbmZpZykgLworICAgICAgICAgICAgICAgICAgICAgIChJTlQpc2l6ZW9mKENIQU5ORUxfTU9ERV9DT05GSUdfVEFCKTsKKyAgICAgICBpKyspIHsKKyAgICBpZiAoY2hhbm5lbE1vZGVDb25maWdbaV0uZW5jTW9kZSA9PSBtb2RlKSB7CisgICAgICBjbV9jb25maWcgPSAmY2hhbm5lbE1vZGVDb25maWdbaV07CisgICAgICBicmVhazsKICAgICB9CiAgIH0KICAgcmV0dXJuIGNtX2NvbmZpZzsKZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvY2hhbm5lbF9tYXAuaCBiL2xpYkFBQ2VuYy9zcmMvY2hhbm5lbF9tYXAuaAppbmRleCAyY2ZiNDg2Li5mOTE1NGNkIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2NoYW5uZWxfbWFwLmgKKysrIGIvbGliQUFDZW5jL3NyYy9jaGFubmVsX21hcC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE4ICs5MCwxOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqICBGYXN0IE1QRUcgQUFDIEF1ZGlvIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBBLiBHcm9lc2NoZWwKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBjaGFubmVsIG1hcHBpbmcgZnVuY3Rpb25hbGl0eQorICAgQXV0aG9yKHMpOiAgIEEuIEdyb2VzY2hlbAogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogY2hhbm5lbCBtYXBwaW5nIGZ1bmN0aW9uYWxpdHkKIAotI2lmbmRlZiBfQ0hBTk5FTF9NQVBfSAotI2RlZmluZSBfQ0hBTk5FTF9NQVBfSAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmbmRlZiBDSEFOTkVMX01BUF9ICisjZGVmaW5lIENIQU5ORUxfTUFQX0gKIAogI2luY2x1ZGUgImFhY2VuYy5oIgogI2luY2x1ZGUgInBzeV9jb25zdC5oIgpAQCAtMTAzLDE0ICsxMTQsOCBAQAogICBJTlQgbkVsZW1lbnRzOwogfSBDSEFOTkVMX01PREVfQ09ORklHX1RBQjsKIAotCiAvKiBFbGVtZW50IG1vZGUgKi8KLXR5cGVkZWYgZW51bSB7Ci0gIEVMX01PREVfSU5WQUxJRCA9IDAsCi0gIEVMX01PREVfTU9OTywKLSAgRUxfTU9ERV9TVEVSRU8KLX0gRUxFTUVOVF9NT0RFOwotCit0eXBlZGVmIGVudW0geyBFTF9NT0RFX0lOVkFMSUQgPSAwLCBFTF9NT0RFX01PTk8sIEVMX01PREVfU1RFUkVPIH0gRUxFTUVOVF9NT0RFOwogCiBBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfRGV0ZXJtaW5lRW5jb2Rlck1vZGUoQ0hBTk5FTF9NT0RFKiBtb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuQ2hhbm5lbHMpOwpAQCAtMTE5LDE0ICsxMjQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9PUkRFUiBjbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HKiBjaE1hcCk7CiAKLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0RWxlbWVudEJpdHMoUUNfU1RBVEUgKmhRQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HICpjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJpdHJhdGVUb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBhdmVyYWdlQml0c1RvdCwKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0RWxlbWVudEJpdHMoUUNfU1RBVEUqIGhRQywgQ0hBTk5FTF9NQVBQSU5HKiBjbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJpdHJhdGVUb3QsIElOVCBhdmVyYWdlQml0c1RvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG1heENoYW5uZWxCaXRzKTsKIAogRUxFTUVOVF9NT0RFIEZES2FhY0VuY19HZXRNb25vU3RlcmVvTW9kZShjb25zdCBDSEFOTkVMX01PREUgbW9kZSk7CiAKLWNvbnN0IENIQU5ORUxfTU9ERV9DT05GSUdfVEFCKiBGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKGNvbnN0IENIQU5ORUxfTU9ERSBtb2RlKTsKK2NvbnN0IENIQU5ORUxfTU9ERV9DT05GSUdfVEFCKiBGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKAorICAgIGNvbnN0IENIQU5ORUxfTU9ERSBtb2RlKTsKIAogI2VuZGlmIC8qIENIQU5ORUxfTUFQX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvY2hhb3NtZWFzdXJlLmNwcCBiL2xpYkFBQ2VuYy9zcmMvY2hhb3NtZWFzdXJlLmNwcAppbmRleCA0ZTU2ZTllLi42NjQyODRiIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2NoYW9zbWVhc3VyZS5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9jaGFvc21lYXN1cmUuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBXZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBDaGFvcyBtZWFzdXJlIGNhbGN1bGF0aW9uCisgICBBdXRob3Iocyk6ICAgTS4gV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBDaGFvcyBtZWFzdXJlIGNhbGN1bGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJjaGFvc21lYXN1cmUuaCIKIApAQCAtOTQsNDAgKzEwNiw2MyBAQAogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0ZES2FhY0VuY19DYWxjdWxhdGVDaGFvc01lYXN1cmVQZWFrRmFzdAogICAgIGRlc2NyaXB0aW9uOiAgRWJlcmxlaW4gbWV0aG9kIG9mIGNoYW9zIG1lYXN1cmUgY2FsY3VsYXRpb24gYnkgaGlnaC1wYXNzCiAgICAgICAgICAgICAgICAgICBmaWx0ZXJpbmcgYW1wbGl0dWRlIHNwZWN0cnVtCi0gICAgICAgICAgICAgICAgICBBIHNwZWNpYWwgY2FzZSBvZiBGREthYWNFbmNfQ2FsY3VsYXRlQ2hhb3NNZWFzdXJlVG9uYWxHZW5lcmljIC0tCi0gICAgICAgICAgICAgICAgICBoaWdobHkgb3B0aW1pemVkCisgICAgICAgICAgICAgICAgICBBIHNwZWNpYWwgY2FzZSBvZiBGREthYWNFbmNfQ2FsY3VsYXRlQ2hhb3NNZWFzdXJlVG9uYWxHZW5lcmljCistLSBoaWdobHkgb3B0aW1pemVkCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1GREthYWNFbmNfRkRLYWFjRW5jX0NhbGN1bGF0ZUNoYW9zTWVhc3VyZVBlYWtGYXN0KCBGSVhQX0RCTCAgKlJFU1RSSUNUIHBhTURDVERhdGFOTTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICBudW1iZXJPZkxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqUkVTVFJJQ1QgY2hhb3NNZWFzdXJlICkKLXsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19GREthYWNFbmNfQ2FsY3VsYXRlQ2hhb3NNZWFzdXJlUGVha0Zhc3QoCisgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBhTURDVERhdGFOTTAsIElOVCBudW1iZXJPZkxpbmVzLAorICAgIEZJWFBfREJMICpSRVNUUklDVCBjaGFvc01lYXN1cmUpIHsKICAgSU5UIGksIGo7CiAKICAgLyogY2FsY3VsYXRlIGNoYW9zIG1lYXN1cmUgYnkgInBlYWsgZmlsdGVyIiAqLwotICBmb3IgKGk9MDsgaTwyOyBpKyspIHsKLSAgICAvKiBtYWtlIGV2ZW4gYW5kIG9kZCBwYXNzIHRocm91Z2ggZGF0YSAqLwotICAgIEZJWFBfREJMIGxlZnQsY2VudGVyOyAvKiBsZWZ0LCBjZW50ZXIgdGFwIG9mIGZpbHRlciAqLworICAvKiBtYWtlIGV2ZW4gYW5kIG9kZCBwYXNzIHRocm91Z2ggZGF0YSAqLworICBGSVhQX0RCTCBsZWZ0XzBfZGl2MiwKKyAgICAgIGNlbnRlcl8wOyAvKiBsZWZ0LCBjZW50ZXIgdGFwIG9mIGZpbHRlciwgZXZlbiBudW1iZXJlZCAqLworICBGSVhQX0RCTCBsZWZ0XzFfZGl2MiwgY2VudGVyXzE7IC8qIGxlZnQsIGNlbnRlciB0YXAgb2YgZmlsdGVyLCBvZGQgbnVtYmVyZWQgKi8KIAotICAgIGxlZnQgICA9IChGSVhQX0RCTCkoKExPTkcpcGFNRENURGF0YU5NMFtpXV4oKExPTkcpcGFNRENURGF0YU5NMFtpXT4+KERGUkFDVF9CSVRTLTEpKSk7Ci0gICAgY2VudGVyID0gKEZJWFBfREJMKSgoTE9ORylwYU1EQ1REYXRhTk0wW2krMl1eKChMT05HKXBhTURDVERhdGFOTTBbaSsyXT4+KERGUkFDVF9CSVRTLTEpKSk7CisgIGxlZnRfMF9kaXYyID0gKEZJWFBfREJMKSgoKExPTkcpcGFNRENURGF0YU5NMFswXSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMT05HKXBhTURDVERhdGFOTTBbMF0gPj4gKERGUkFDVF9CSVRTIC0gMSkpKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgIGxlZnRfMV9kaXYyID0gKEZJWFBfREJMKSgoKExPTkcpcGFNRENURGF0YU5NMFsxXSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMT05HKXBhTURDVERhdGFOTTBbMV0gPj4gKERGUkFDVF9CSVRTIC0gMSkpKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgIGNlbnRlcl8wID0gKEZJWFBfREJMKSgoTE9ORylwYU1EQ1REYXRhTk0wWzJdIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICgoTE9ORylwYU1EQ1REYXRhTk0wWzJdID4+IChERlJBQ1RfQklUUyAtIDEpKSk7CisgIGNlbnRlcl8xID0gKEZJWFBfREJMKSgoTE9ORylwYU1EQ1REYXRhTk0wWzNdIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICgoTE9ORylwYU1EQ1REYXRhTk0wWzNdID4+IChERlJBQ1RfQklUUyAtIDEpKSk7CiAKLSAgICBmb3IgKGogPSBpKzI7IGogPCBudW1iZXJPZkxpbmVzIC0gMjsgais9MikgewotICAgICAgRklYUF9EQkwgcmlnaHQgPSAoRklYUF9EQkwpKChMT05HKXBhTURDVERhdGFOTTBbaisyXV4oKExPTkcpcGFNRENURGF0YU5NMFtqKzJdPj4oREZSQUNUX0JJVFMtMSkpKTsKLSAgICAgIEZJWFBfREJMIHRtcCA9IChsZWZ0Pj4xKSsocmlnaHQ+PjEpOworICBmb3IgKGogPSAyOyBqIDwgbnVtYmVyT2ZMaW5lcyAtIDI7IGogKz0gMikgeworICAgIEZJWFBfREJMIHJpZ2h0XzAgPQorICAgICAgICAoRklYUF9EQkwpKChMT05HKXBhTURDVERhdGFOTTBbaiArIDJdIF4KKyAgICAgICAgICAgICAgICAgICAoKExPTkcpcGFNRENURGF0YU5NMFtqICsgMl0gPj4gKERGUkFDVF9CSVRTIC0gMSkpKTsKKyAgICBGSVhQX0RCTCB0bXBfMCA9IGxlZnRfMF9kaXYyICsgKHJpZ2h0XzAgPj4gMSk7CisgICAgRklYUF9EQkwgcmlnaHRfMSA9CisgICAgICAgIChGSVhQX0RCTCkoKExPTkcpcGFNRENURGF0YU5NMFtqICsgM10gXgorICAgICAgICAgICAgICAgICAgICgoTE9ORylwYU1EQ1REYXRhTk0wW2ogKyAzXSA+PiAoREZSQUNUX0JJVFMgLSAxKSkpOworICAgIEZJWFBfREJMIHRtcF8xID0gbGVmdF8xX2RpdjIgKyAocmlnaHRfMSA+PiAxKTsKIAotICAgICAgaWYgKHRtcCA8IGNlbnRlciApIHsKLSAgICAgICAgIElOVCBsZWFkaW5nQml0cyA9IENudExlYWRpbmdaZXJvcyhjZW50ZXIpLTE7Ci0gICAgICAgICB0bXAgPSBzY2h1cl9kaXYodG1wPDxsZWFkaW5nQml0cywgY2VudGVyPDxsZWFkaW5nQml0cywgOCk7Ci0gICAgICAgICBjaGFvc01lYXN1cmVbal0gPSBmTXVsdCh0bXAsdG1wKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAgY2hhb3NNZWFzdXJlW2pdID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7Ci0gICAgICB9Ci0KLSAgICAgIGxlZnQgICA9IGNlbnRlcjsKLSAgICAgIGNlbnRlciA9IHJpZ2h0OworICAgIGlmICh0bXBfMCA8IGNlbnRlcl8wKSB7CisgICAgICBJTlQgbGVhZGluZ0JpdHMgPSBDbnRMZWFkaW5nWmVyb3MoY2VudGVyXzApIC0gMTsKKyAgICAgIHRtcF8wID0gc2NodXJfZGl2KHRtcF8wIDw8IGxlYWRpbmdCaXRzLCBjZW50ZXJfMCA8PCBsZWFkaW5nQml0cywgOCk7CisgICAgICB0bXBfMCA9IGZNdWx0KHRtcF8wLCB0bXBfMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRtcF8wID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CiAgICAgfQorICAgIGNoYW9zTWVhc3VyZVtqICsgMF0gPSB0bXBfMDsKKyAgICBsZWZ0XzBfZGl2MiA9IGNlbnRlcl8wID4+IDE7CisgICAgY2VudGVyXzAgPSByaWdodF8wOworCisgICAgaWYgKHRtcF8xIDwgY2VudGVyXzEpIHsKKyAgICAgIElOVCBsZWFkaW5nQml0cyA9IENudExlYWRpbmdaZXJvcyhjZW50ZXJfMSkgLSAxOworICAgICAgdG1wXzEgPSBzY2h1cl9kaXYodG1wXzEgPDwgbGVhZGluZ0JpdHMsIGNlbnRlcl8xIDw8IGxlYWRpbmdCaXRzLCA4KTsKKyAgICAgIHRtcF8xID0gZk11bHQodG1wXzEsIHRtcF8xKTsKKyAgICB9IGVsc2UgeworICAgICAgdG1wXzEgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKyAgICB9CisKKyAgICBsZWZ0XzFfZGl2MiA9IGNlbnRlcl8xID4+IDE7CisgICAgY2VudGVyXzEgPSByaWdodF8xOworICAgIGNoYW9zTWVhc3VyZVtqICsgMV0gPSB0bXBfMTsKICAgfQogCiAgIC8qIHByb3ZpZGUgY2hhb3MgbWVhc3VyZSBmb3IgZmlyc3QgZmV3IGxpbmVzICovCkBAIC0xMzUsMTEgKzE3MCwxMCBAQAogICBjaGFvc01lYXN1cmVbMV0gPSBjaGFvc01lYXN1cmVbMl07CiAKICAgLyogcHJvdmlkZSBjaGFvcyBtZWFzdXJlIGZvciBsYXN0IGZldyBsaW5lcyAqLwotICBmb3IgKGkgPSAobnVtYmVyT2ZMaW5lcy0zKTsgaSA8IG51bWJlck9mTGluZXM7IGkrKykKKyAgZm9yIChpID0gKG51bWJlck9mTGluZXMgLSAzKTsgaSA8IG51bWJlck9mTGluZXM7IGkrKykKICAgICBjaGFvc01lYXN1cmVbaV0gPSBGTDJGWENPTlNUX0RCTCgwLjUpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0NhbGN1bGF0ZUNoYW9zTWVhc3VyZQogICAgIGRlc2NyaXB0aW9uOiAgY2FsY3VsYXRlcyBhIGNoYW9zbWVhc3VyZSBmb3IgZXZlcnkgbGluZSwgZGlmZmVyZW50IG1ldGhvZHMKQEAgLTE0OCwxNCArMTgyLDEwIEBACiAgICAgaW5wdXQ6ICAgICAgICBNRENUIGRhdGEsIG51bWJlciBvZiBsaW5lcwogICAgIG91dHB1dDogICAgICAgY2hhb3NNZWFzdXJlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLUZES2FhY0VuY19DYWxjdWxhdGVDaGFvc01lYXN1cmUoIEZJWFBfREJMICAgICpwYU1EQ1REYXRhTk0wLAotICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgbnVtYmVyT2ZMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKmNoYW9zTWVhc3VyZSApCit2b2lkIEZES2FhY0VuY19DYWxjdWxhdGVDaGFvc01lYXN1cmUoRklYUF9EQkwgKnBhTURDVERhdGFOTTAsIElOVCBudW1iZXJPZkxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjaGFvc01lYXN1cmUpCiAKIHsKLSAgICBGREthYWNFbmNfRkRLYWFjRW5jX0NhbGN1bGF0ZUNoYW9zTWVhc3VyZVBlYWtGYXN0KCBwYU1EQ1REYXRhTk0wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZkxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFvc01lYXN1cmUgKTsKKyAgRkRLYWFjRW5jX0ZES2FhY0VuY19DYWxjdWxhdGVDaGFvc01lYXN1cmVQZWFrRmFzdCgKKyAgICAgIHBhTURDVERhdGFOTTAsIG51bWJlck9mTGluZXMsIGNoYW9zTWVhc3VyZSk7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvY2hhb3NtZWFzdXJlLmggYi9saWJBQUNlbmMvc3JjL2NoYW9zbWVhc3VyZS5oCmluZGV4IDQ0MzAxYzUuLjYwZDQxMzcgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvY2hhb3NtZWFzdXJlLmgKKysrIGIvbGliQUFDZW5jL3NyYy9jaGFvc21lYXN1cmUuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyNSArOTAsMjMgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogQ2hhb3MgbWVhc3VyZSBjYWxjdWxhdGlvbgorICAgQXV0aG9yKHMpOiAgIE0uIFdlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogQ2hhb3MgbWVhc3VyZSBjYWxjdWxhdGlvbgogCi0jaWZuZGVmIF9fQ0hBT1NNRUFTVVJFX0gKLSNkZWZpbmUgX19DSEFPU01FQVNVUkVfSAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBDSEFPU01FQVNVUkVfSAorI2RlZmluZSBDSEFPU01FQVNVUkVfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgotCiAjaW5jbHVkZSAicHN5X2NvbnN0LmgiCiAKLXZvaWQKLUZES2FhY0VuY19DYWxjdWxhdGVDaGFvc01lYXN1cmUoIEZJWFBfREJMICAgICpwYU1EQ1REYXRhTk0wLAotICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBudW1iZXJPZkxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqY2hhb3NNZWFzdXJlICk7Cit2b2lkIEZES2FhY0VuY19DYWxjdWxhdGVDaGFvc01lYXN1cmUoRklYUF9EQkwgKnBhTURDVERhdGFOTTAsIElOVCBudW1iZXJPZkxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjaGFvc01lYXN1cmUpOwogCi0jZW5kaWYKKyNlbmRpZiAvKiBDSEFPU01FQVNVUkVfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9keW5fYml0cy5jcHAgYi9saWJBQUNlbmMvc3JjL2R5bl9iaXRzLmNwcAppbmRleCAwYzA3MTA5Li43NGJhZWI4IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2R5bl9iaXRzLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL2R5bl9iaXRzLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBOb2lzZWxlc3MgY29kZXIgbW9kdWxlCisgICBBdXRob3Iocyk6ICAgTS5XZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IE5vaXNlbGVzcyBjb2RlciBtb2R1bGUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImR5bl9iaXRzLmgiCiAjaW5jbHVkZSAiYml0X2NudC5oIgpAQCAtOTcsMTggKzEwOSwxNSBAQAogCiB0eXBlZGVmIElOVCAoKmxvb2tVcFRhYmxlKVtDT0RFX0JPT0tfRVNDX05EWCArIDFdOwogCi1zdGF0aWMgSU5UIEZES2FhY0VuY19nZXRTaWRlSW5mb0JpdHMoCi0gICAgICAgIGNvbnN0IFNFQ1RJT05fSU5GTyogY29uc3QgaHVmZnNlY3Rpb24sCi0gICAgICAgIGNvbnN0IFNIT1JUKiBjb25zdCAgICAgICAgc2lkZUluZm9UYWIsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgdXNlSENSCi0gICAgICAgICkKLXsKK3N0YXRpYyBJTlQgRkRLYWFjRW5jX2dldFNpZGVJbmZvQml0cyhjb25zdCBTRUNUSU9OX0lORk8qIGNvbnN0IGh1ZmZzZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUKiBjb25zdCBzaWRlSW5mb1RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgdXNlSENSKSB7CiAgIElOVCBzaWRlSW5mb0JpdHM7CiAKLSAgaWYgKCB1c2VIQ1IgJiYgKChodWZmc2VjdGlvbi0+Y29kZUJvb2sgPT0gMTEpIHx8IChodWZmc2VjdGlvbi0+Y29kZUJvb2sgPj0gMTYpKSApIHsKKyAgaWYgKHVzZUhDUiAmJgorICAgICAgKChodWZmc2VjdGlvbi0+Y29kZUJvb2sgPT0gMTEpIHx8IChodWZmc2VjdGlvbi0+Y29kZUJvb2sgPj0gMTYpKSkgewogICAgIHNpZGVJbmZvQml0cyA9IDU7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgc2lkZUluZm9CaXRzID0gc2lkZUluZm9UYWJbaHVmZnNlY3Rpb24tPnNmYkNudF07CiAgIH0KIApAQCAtMTE3LDQzICsxMjYsMzIgQEAKIAogLyogY291bnQgYml0cyB1c2luZyBhbGwgcG9zc2libGUgdGFibGVzICovCiBzdGF0aWMgdm9pZCBGREthYWNFbmNfYnVpbGRCaXRMb29rVXAoCi0gICAgICAgIGNvbnN0IFNIT1JUKiBjb25zdCAgICAgICAgcXVhbnRTcGVjdHJ1bSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBtYXhTZmIsCi0gICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgc2ZiT2Zmc2V0LAotICAgICAgICBjb25zdCBVSU5UKiBjb25zdCAgICAgICAgIHNmYk1heCwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLAotICAgICAgICBTRUNUSU9OX0lORk8qIGNvbnN0ICAgICAgIGh1ZmZzZWN0aW9uCi0gICAgICAgICkKLXsKKyAgICBjb25zdCBTSE9SVCogY29uc3QgcXVhbnRTcGVjdHJ1bSwgY29uc3QgSU5UIG1heFNmYiwKKyAgICBjb25zdCBJTlQqIGNvbnN0IHNmYk9mZnNldCwgY29uc3QgVUlOVCogY29uc3Qgc2ZiTWF4LAorICAgIElOVCBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLAorICAgIFNFQ1RJT05fSU5GTyogY29uc3QgaHVmZnNlY3Rpb24pIHsKICAgSU5UIGksIHNmYldpZHRoOwogCi0gIGZvciAoaSA9IDA7IGkgPCBtYXhTZmI7IGkrKykKLSAgeworICBmb3IgKGkgPSAwOyBpIDwgbWF4U2ZiOyBpKyspIHsKICAgICBodWZmc2VjdGlvbltpXS5zZmJDbnQgPSAxOwogICAgIGh1ZmZzZWN0aW9uW2ldLnNmYlN0YXJ0ID0gaTsKICAgICBodWZmc2VjdGlvbltpXS5zZWN0aW9uQml0cyA9IElOVkFMSURfQklUQ09VTlQ7CiAgICAgaHVmZnNlY3Rpb25baV0uY29kZUJvb2sgPSAtMTsKICAgICBzZmJXaWR0aCA9IHNmYk9mZnNldFtpICsgMV0gLSBzZmJPZmZzZXRbaV07Ci0gICAgRkRLYWFjRW5jX2JpdENvdW50KHF1YW50U3BlY3RydW0gKyBzZmJPZmZzZXRbaV0sIHNmYldpZHRoLCBzZmJNYXhbaV0sIGJpdExvb2tVcFtpXSk7CisgICAgRkRLYWFjRW5jX2JpdENvdW50KHF1YW50U3BlY3RydW0gKyBzZmJPZmZzZXRbaV0sIHNmYldpZHRoLCBzZmJNYXhbaV0sCisgICAgICAgICAgICAgICAgICAgICAgIGJpdExvb2tVcFtpXSk7CiAgIH0KIH0KIAogLyogZXNzZW50aWFsIGhlbHBlciBmdW5jdGlvbnMgKi8KLXN0YXRpYyBJTlQgRkRLYWFjRW5jX2ZpbmRCZXN0Qm9vaygKLSAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICBiYywKLSAgICAgICAgSU5UKiBjb25zdCAgICAgICAgICAgICAgICBib29rLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHVzZVZDQjExCi0gICAgICAgICkKLXsKK3N0YXRpYyBpbmxpbmUgSU5UIEZES2FhY0VuY19maW5kQmVzdEJvb2soY29uc3QgSU5UKiBjb25zdCBiYywgSU5UKiBjb25zdCBib29rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgdXNlVkNCMTEpIHsKICAgSU5UIG1pbkJpdHMgPSBJTlZBTElEX0JJVENPVU5ULCBqOwogCiAgIGludCBlbmQgPSBDT0RFX0JPT0tfRVNDX05EWDsKIAotCi0gIGZvciAoaiA9IDA7IGogPD0gZW5kOyBqKyspCi0gIHsKLSAgICBpZiAoYmNbal0gPCBtaW5CaXRzKQotICAgIHsKKyAgZm9yIChqID0gMDsgaiA8PSBlbmQ7IGorKykgeworICAgIGlmIChiY1tqXSA8IG1pbkJpdHMpIHsKICAgICAgIG1pbkJpdHMgPSBiY1tqXTsKICAgICAgICpib29rID0gajsKICAgICB9CkBAIC0xNjEsMTE0ICsxNTksOTQgQEAKICAgcmV0dXJuIChtaW5CaXRzKTsKIH0KIAotc3RhdGljIElOVCBGREthYWNFbmNfZmluZE1pbk1lcmdlQml0cygKLSAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICBiYzEsCi0gICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgYmMyLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHVzZVZDQjExCi0gICAgICAgICkKLXsKK3N0YXRpYyBpbmxpbmUgSU5UIEZES2FhY0VuY19maW5kTWluTWVyZ2VCaXRzKGNvbnN0IElOVCogY29uc3QgYmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UKiBjb25zdCBiYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgdXNlVkNCMTEpIHsKICAgSU5UIG1pbkJpdHMgPSBJTlZBTElEX0JJVENPVU5ULCBqOwogCi0gIGludCBlbmQgPSBDT0RFX0JPT0tfRVNDX05EWDsKKyAgRFdPUkRfQUxJR05FRChiYzEpOworICBEV09SRF9BTElHTkVEKGJjMik7CiAKLQotICBmb3IgKGogPSAwOyBqIDw9IGVuZDsgaisrKQotICB7Ci0gICAgaWYgKGJjMVtqXSArIGJjMltqXSA8IG1pbkJpdHMpCi0gICAgewotICAgICAgbWluQml0cyA9IGJjMVtqXSArIGJjMltqXTsKLSAgICB9CisgIGZvciAoaiA9IDA7IGogPD0gQ09ERV9CT09LX0VTQ19ORFg7IGorKykgeworICAgIG1pbkJpdHMgPSBmaXhNaW4obWluQml0cywgYmMxW2pdICsgYmMyW2pdKTsKICAgfQogICByZXR1cm4gKG1pbkJpdHMpOwogfQogCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfbWVyZ2VCaXRMb29rVXAoCi0gICAgICAgIElOVCogY29uc3QgICAgICAgICAgICAgICAgYmMxLAotICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgIGJjMgotICAgICAgICApCi17CitzdGF0aWMgaW5saW5lIHZvaWQgRkRLYWFjRW5jX21lcmdlQml0TG9va1VwKElOVCogY29uc3QgUkVTVFJJQ1QgYmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQqIGNvbnN0IFJFU1RSSUNUIGJjMikgewogICBpbnQgajsKIAotICBmb3IgKGogPSAwOyBqIDw9IENPREVfQk9PS19FU0NfTkRYOyBqKyspCi0gIHsKKyAgZm9yIChqID0gMDsgaiA8PSBDT0RFX0JPT0tfRVNDX05EWDsgaisrKSB7CisgICAgRkRLX0FTU0VSVChJTlZBTElEX0JJVENPVU5UID09IDB4MUZGRkZGRkYpOwogICAgIGJjMVtqXSA9IGZpeE1pbihiYzFbal0gKyBiYzJbal0sIElOVkFMSURfQklUQ09VTlQpOwogICB9CiB9CiAKLXN0YXRpYyBJTlQgRkRLYWFjRW5jX2ZpbmRNYXhNZXJnZSgKLSAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICBtZXJnZUdhaW5Mb29rVXAsCi0gICAgICAgIGNvbnN0IFNFQ1RJT05fSU5GTyogY29uc3QgIGh1ZmZzZWN0aW9uLAotICAgICAgICBjb25zdCBJTlQgbWF4U2ZiLAotICAgICAgICBJTlQqIGNvbnN0ICAgICAgICAgICAgICAgIG1heE5keAotICAgICAgICApCi17CitzdGF0aWMgaW5saW5lIElOVCBGREthYWNFbmNfZmluZE1heE1lcmdlKGNvbnN0IElOVCogY29uc3QgbWVyZ2VHYWluTG9va1VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRUNUSU9OX0lORk8qIGNvbnN0IGh1ZmZzZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbWF4U2ZiLCBJTlQqIGNvbnN0IG1heE5keCkgewogICBJTlQgaSwgbWF4TWVyZ2VHYWluID0gMDsKKyAgaW50IGxhc3RNYXhOZHggPSAwOwogCi0gIGZvciAoaSA9IDA7IGkgKyBodWZmc2VjdGlvbltpXS5zZmJDbnQgPCBtYXhTZmI7IGkgKz0gaHVmZnNlY3Rpb25baV0uc2ZiQ250KQotICB7Ci0gICAgaWYgKG1lcmdlR2Fpbkxvb2tVcFtpXSA+IG1heE1lcmdlR2FpbikKLSAgICB7CisgIGZvciAoaSA9IDA7IGkgKyBodWZmc2VjdGlvbltpXS5zZmJDbnQgPCBtYXhTZmI7IGkgKz0gaHVmZnNlY3Rpb25baV0uc2ZiQ250KSB7CisgICAgaWYgKG1lcmdlR2Fpbkxvb2tVcFtpXSA+IG1heE1lcmdlR2FpbikgewogICAgICAgbWF4TWVyZ2VHYWluID0gbWVyZ2VHYWluTG9va1VwW2ldOwotICAgICAgKm1heE5keCA9IGk7CisgICAgICBsYXN0TWF4TmR4ID0gaTsKICAgICB9CiAgIH0KKyAgKm1heE5keCA9IGxhc3RNYXhOZHg7CiAgIHJldHVybiAobWF4TWVyZ2VHYWluKTsKIH0KIAotc3RhdGljIElOVCBGREthYWNFbmNfQ2FsY01lcmdlR2FpbigKLSAgICAgICAgY29uc3QgU0VDVElPTl9JTkZPKiBjb25zdCBodWZmc2VjdGlvbiwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLAotICAgICAgICBjb25zdCBTSE9SVCogY29uc3QgICAgICAgIHNpZGVJbmZvVGFiLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIG5keDEsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgbmR4MiwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICB1c2VWQ0IxMQotICAgICAgICApCi17CitzdGF0aWMgaW5saW5lIElOVCBGREthYWNFbmNfQ2FsY01lcmdlR2FpbigKKyAgICBjb25zdCBTRUNUSU9OX0lORk8qIGNvbnN0IGh1ZmZzZWN0aW9uLAorICAgIGNvbnN0IElOVCBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLAorICAgIGNvbnN0IFNIT1JUKiBjb25zdCBzaWRlSW5mb1RhYiwgY29uc3QgSU5UIG5keDEsIGNvbnN0IElOVCBuZHgyLAorICAgIGNvbnN0IElOVCB1c2VWQ0IxMSkgewogICBJTlQgTWVyZ2VHYWluLCBNZXJnZUJpdHMsIFNwbGl0Qml0czsKIAotICBNZXJnZUJpdHMgPSBzaWRlSW5mb1RhYltodWZmc2VjdGlvbltuZHgxXS5zZmJDbnQgKyBodWZmc2VjdGlvbltuZHgyXS5zZmJDbnRdICsgRkRLYWFjRW5jX2ZpbmRNaW5NZXJnZUJpdHMoYml0TG9va1VwW25keDFdLCBiaXRMb29rVXBbbmR4Ml0sIHVzZVZDQjExKTsKLSAgU3BsaXRCaXRzID0gaHVmZnNlY3Rpb25bbmR4MV0uc2VjdGlvbkJpdHMgKyBodWZmc2VjdGlvbltuZHgyXS5zZWN0aW9uQml0czsgLyogQml0IGFtb3VudCBmb3Igc3BsaXR0ZWQgaHVmZnNlY3Rpb25zICovCisgIE1lcmdlQml0cyA9CisgICAgICBzaWRlSW5mb1RhYltodWZmc2VjdGlvbltuZHgxXS5zZmJDbnQgKyBodWZmc2VjdGlvbltuZHgyXS5zZmJDbnRdICsKKyAgICAgIEZES2FhY0VuY19maW5kTWluTWVyZ2VCaXRzKGJpdExvb2tVcFtuZHgxXSwgYml0TG9va1VwW25keDJdLCB1c2VWQ0IxMSk7CisgIFNwbGl0Qml0cyA9CisgICAgICBodWZmc2VjdGlvbltuZHgxXS5zZWN0aW9uQml0cyArCisgICAgICBodWZmc2VjdGlvbltuZHgyXS5zZWN0aW9uQml0czsgLyogQml0IGFtb3VudCBmb3Igc3BsaXR0ZWQgaHVmZnNlY3Rpb25zICovCiAgIE1lcmdlR2FpbiA9IFNwbGl0Qml0cyAtIE1lcmdlQml0czsKIAotICBpZiAoIChodWZmc2VjdGlvbltuZHgxXS5jb2RlQm9vaz09Q09ERV9CT09LX1BOU19OTyl8fChodWZmc2VjdGlvbltuZHgyXS5jb2RlQm9vaz09Q09ERV9CT09LX1BOU19OTykKLSAgICB8fCAoaHVmZnNlY3Rpb25bbmR4MV0uY29kZUJvb2s9PUNPREVfQk9PS19JU19PVVRfT0ZfUEhBU0VfTk8pfHwoaHVmZnNlY3Rpb25bbmR4Ml0uY29kZUJvb2s9PUNPREVfQk9PS19JU19PVVRfT0ZfUEhBU0VfTk8pCi0gICAgfHwgKGh1ZmZzZWN0aW9uW25keDFdLmNvZGVCb29rPT1DT0RFX0JPT0tfSVNfSU5fUEhBU0VfTk8pfHwoaHVmZnNlY3Rpb25bbmR4Ml0uY29kZUJvb2s9PUNPREVfQk9PS19JU19JTl9QSEFTRV9OTykKLSAgICApCi0gIHsKKyAgaWYgKChodWZmc2VjdGlvbltuZHgxXS5jb2RlQm9vayA9PSBDT0RFX0JPT0tfUE5TX05PKSB8fAorICAgICAgKGh1ZmZzZWN0aW9uW25keDJdLmNvZGVCb29rID09IENPREVfQk9PS19QTlNfTk8pIHx8CisgICAgICAoaHVmZnNlY3Rpb25bbmR4MV0uY29kZUJvb2sgPT0gQ09ERV9CT09LX0lTX09VVF9PRl9QSEFTRV9OTykgfHwKKyAgICAgIChodWZmc2VjdGlvbltuZHgyXS5jb2RlQm9vayA9PSBDT0RFX0JPT0tfSVNfT1VUX09GX1BIQVNFX05PKSB8fAorICAgICAgKGh1ZmZzZWN0aW9uW25keDFdLmNvZGVCb29rID09IENPREVfQk9PS19JU19JTl9QSEFTRV9OTykgfHwKKyAgICAgIChodWZmc2VjdGlvbltuZHgyXS5jb2RlQm9vayA9PSBDT0RFX0JPT0tfSVNfSU5fUEhBU0VfTk8pKSB7CiAgICAgTWVyZ2VHYWluID0gLTE7CiAgIH0KIAogICByZXR1cm4gKE1lcmdlR2Fpbik7CiB9CiAKLQogLyogc2VjdGlvbmluZyBTdGFnZSAwOmZpbmQgbWluaW11bSBjb2Rib29rcyAqLwogc3RhdGljIHZvaWQgRkRLYWFjRW5jX2dtU3RhZ2UwKAotICAgICAgICBTRUNUSU9OX0lORk8qIGNvbnN0IFJFU1RSSUNUIGh1ZmZzZWN0aW9uLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgIGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgbWF4U2ZiLAotICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIG5vaXNlTnJnLAotICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIGlzQm9vawotICAgICAgICApCi17CisgICAgU0VDVElPTl9JTkZPKiBjb25zdCBSRVNUUklDVCBodWZmc2VjdGlvbiwKKyAgICBjb25zdCBJTlQgYml0TG9va1VwW01BWF9TRkJfTE9OR11bQ09ERV9CT09LX0VTQ19ORFggKyAxXSwgY29uc3QgSU5UIG1heFNmYiwKKyAgICBjb25zdCBJTlQqIGNvbnN0IG5vaXNlTnJnLCBjb25zdCBJTlQqIGNvbnN0IGlzQm9vaykgewogICBJTlQgaTsKIAotICBmb3IgKGkgPSAwOyBpIDwgbWF4U2ZiOyBpKyspCi0gIHsKKyAgZm9yIChpID0gMDsgaSA8IG1heFNmYjsgaSsrKSB7CiAgICAgLyogU2lkZS1JbmZvIGJpdHMgd2lsbCBiZSBjYWxjdWxhdGVkIGluIFN0YWdlIDEhICovCi0gICAgaWYgKGh1ZmZzZWN0aW9uW2ldLnNlY3Rpb25CaXRzID09IElOVkFMSURfQklUQ09VTlQpCi0gICAgeworICAgIGlmIChodWZmc2VjdGlvbltpXS5zZWN0aW9uQml0cyA9PSBJTlZBTElEX0JJVENPVU5UKSB7CiAgICAgICAvKiBpbnRlbnNpdHkgYW5kIHBucyBjb2RlYm9va3MgYXJlIGFscmVhZHkgYWxsb2NhdGVkIGluIGJpdGNvdW50LmMgKi8KLSAgICAgIGlmKG5vaXNlTnJnW2ldICE9IE5PX05PSVNFX1BOUyl7Ci0gICAgICAgIGh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rPUNPREVfQk9PS19QTlNfTk87CisgICAgICBpZiAobm9pc2VOcmdbaV0gIT0gTk9fTk9JU0VfUE5TKSB7CisgICAgICAgIGh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rID0gQ09ERV9CT09LX1BOU19OTzsKICAgICAgICAgaHVmZnNlY3Rpb25baV0uc2VjdGlvbkJpdHMgPSAwOwotICAgICAgfQotICAgICAgZWxzZSBpZiggaXNCb29rW2ldICkgewotICAgICAgICBodWZmc2VjdGlvbltpXS5jb2RlQm9vaz1pc0Jvb2tbaV07CisgICAgICB9IGVsc2UgaWYgKGlzQm9va1tpXSkgeworICAgICAgICBodWZmc2VjdGlvbltpXS5jb2RlQm9vayA9IGlzQm9va1tpXTsKICAgICAgICAgaHVmZnNlY3Rpb25baV0uc2VjdGlvbkJpdHMgPSAwOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGh1ZmZzZWN0aW9uW2ldLnNlY3Rpb25CaXRzID0gRkRLYWFjRW5jX2ZpbmRCZXN0Qm9vayhiaXRMb29rVXBbaV0sICYoaHVmZnNlY3Rpb25baV0uY29kZUJvb2spLCAwKTsgLyogdXNlVkNCMTEgbXVzdCBiZSAwISEhICovCisgICAgICB9IGVsc2UgeworICAgICAgICBodWZmc2VjdGlvbltpXS5zZWN0aW9uQml0cyA9CisgICAgICAgICAgICBGREthYWNFbmNfZmluZEJlc3RCb29rKGJpdExvb2tVcFtpXSwgJihodWZmc2VjdGlvbltpXS5jb2RlQm9vayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvKiB1c2VWQ0IxMSBtdXN0IGJlIDAhISEgKi8KICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTI3OSwyNCArMjU3LDE4IEBACiAgICBjYWxjdWxhdGUgc2lkZSBpbmZvCiAgKi8KIHN0YXRpYyB2b2lkIEZES2FhY0VuY19nbVN0YWdlMSgKLSAgICAgICAgU0VDVElPTl9JTkZPKiBjb25zdCBSRVNUUklDVCBodWZmc2VjdGlvbiwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgIG1heFNmYiwKLSAgICAgICAgY29uc3QgU0hPUlQqIGNvbnN0ICAgICAgICAgICBzaWRlSW5mb1RhYiwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICB1c2VWQ0IxMQotICAgICAgICApCi17CisgICAgU0VDVElPTl9JTkZPKiBjb25zdCBSRVNUUklDVCBodWZmc2VjdGlvbiwKKyAgICBJTlQgYml0TG9va1VwW01BWF9TRkJfTE9OR11bQ09ERV9CT09LX0VTQ19ORFggKyAxXSwgY29uc3QgSU5UIG1heFNmYiwKKyAgICBjb25zdCBTSE9SVCogY29uc3Qgc2lkZUluZm9UYWIsIGNvbnN0IElOVCB1c2VWQ0IxMSkgewogICBJTlQgbWVyZ2VTdGFydCA9IDAsIG1lcmdlRW5kOwogCi0gIGRvCi0gIHsKLSAgICBmb3IgKG1lcmdlRW5kID0gbWVyZ2VTdGFydCArIDE7IG1lcmdlRW5kIDwgbWF4U2ZiOyBtZXJnZUVuZCsrKQotICAgIHsKKyAgZG8geworICAgIGZvciAobWVyZ2VFbmQgPSBtZXJnZVN0YXJ0ICsgMTsgbWVyZ2VFbmQgPCBtYXhTZmI7IG1lcmdlRW5kKyspIHsKICAgICAgIGlmIChodWZmc2VjdGlvblttZXJnZVN0YXJ0XS5jb2RlQm9vayAhPSBodWZmc2VjdGlvblttZXJnZUVuZF0uY29kZUJvb2spCiAgICAgICAgIGJyZWFrOwogCi0KLSAgICAgIC8qIHdlIGNhbiBtZXJnZS4gdXBkYXRlIHRhYmxlcywgc2lkZSBpbmZvIGJpdHMgd2lsbCBiZSB1cGRhdGVkIG91dHNpZGUgb2YgdGhpcyBsb29wICovCisgICAgICAvKiB3ZSBjYW4gbWVyZ2UuIHVwZGF0ZSB0YWJsZXMsIHNpZGUgaW5mbyBiaXRzIHdpbGwgYmUgdXBkYXRlZCBvdXRzaWRlIG9mCisgICAgICAgKiB0aGlzIGxvb3AgKi8KICAgICAgIGh1ZmZzZWN0aW9uW21lcmdlU3RhcnRdLnNmYkNudCsrOwogICAgICAgaHVmZnNlY3Rpb25bbWVyZ2VTdGFydF0uc2VjdGlvbkJpdHMgKz0gaHVmZnNlY3Rpb25bbWVyZ2VFbmRdLnNlY3Rpb25CaXRzOwogCkBAIC0zMDUsOCArMjc3LDEwIEBACiAgICAgfQogCiAgICAgLyogYWRkIHNpZGUgaW5mbyBpbmZvIGJpdHMgKi8KLSAgICBodWZmc2VjdGlvblttZXJnZVN0YXJ0XS5zZWN0aW9uQml0cyArPSBGREthYWNFbmNfZ2V0U2lkZUluZm9CaXRzKCZodWZmc2VjdGlvblttZXJnZVN0YXJ0XSwgc2lkZUluZm9UYWIsIHVzZVZDQjExKTsKLSAgICBodWZmc2VjdGlvblttZXJnZUVuZCAtIDFdLnNmYlN0YXJ0ID0gaHVmZnNlY3Rpb25bbWVyZ2VTdGFydF0uc2ZiU3RhcnQ7ICAgICAgLyogc3BlZWQgdXAgcHJldiBzZWFyY2ggKi8KKyAgICBodWZmc2VjdGlvblttZXJnZVN0YXJ0XS5zZWN0aW9uQml0cyArPSBGREthYWNFbmNfZ2V0U2lkZUluZm9CaXRzKAorICAgICAgICAmaHVmZnNlY3Rpb25bbWVyZ2VTdGFydF0sIHNpZGVJbmZvVGFiLCB1c2VWQ0IxMSk7CisgICAgaHVmZnNlY3Rpb25bbWVyZ2VFbmQgLSAxXS5zZmJTdGFydCA9CisgICAgICAgIGh1ZmZzZWN0aW9uW21lcmdlU3RhcnRdLnNmYlN0YXJ0OyAvKiBzcGVlZCB1cCBwcmV2IHNlYXJjaCAqLwogCiAgICAgbWVyZ2VTdGFydCA9IG1lcmdlRW5kOwogCkBAIC0zMTcsMTMyICsyOTEsMTAxIEBACiAgICBzZWN0aW9uaW5nIFN0YWdlIDI6Z3JlZWR5IG1lcmdlIGFsZ29yaXRobSwgbWVyZ2UgY29ubmVjdGVkIHNlY3Rpb25zIHdpdGgKICAgIG1heGltdW0gYml0IGdhaW4gdW50aWwgbm8gbW9yZSBnYWluIGlzIHBvc3NpYmxlCiAgKi8KLXN0YXRpYyB2b2lkCi1GREthYWNFbmNfZ21TdGFnZTIoCi0gICAgICAgIFNFQ1RJT05fSU5GTyogY29uc3QgUkVTVFJJQ1QgaHVmZnNlY3Rpb24sCi0gICAgICAgIElOVCogY29uc3QgUkVTVFJJQ1QgICAgICAgICAgbWVyZ2VHYWluTG9va1VwLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgbWF4U2ZiLAotICAgICAgICBjb25zdCBTSE9SVCogY29uc3QgICAgICAgICAgIHNpZGVJbmZvVGFiLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgIHVzZVZDQjExCi0gICAgICAgICkKLXsKK3N0YXRpYyBpbmxpbmUgdm9pZCBGREthYWNFbmNfZ21TdGFnZTIoCisgICAgU0VDVElPTl9JTkZPKiBjb25zdCBSRVNUUklDVCBodWZmc2VjdGlvbiwKKyAgICBJTlQqIGNvbnN0IFJFU1RSSUNUIG1lcmdlR2Fpbkxvb2tVcCwKKyAgICBJTlQgYml0TG9va1VwW01BWF9TRkJfTE9OR11bQ09ERV9CT09LX0VTQ19ORFggKyAxXSwgY29uc3QgSU5UIG1heFNmYiwKKyAgICBjb25zdCBTSE9SVCogY29uc3Qgc2lkZUluZm9UYWIsIGNvbnN0IElOVCB1c2VWQ0IxMSkgewogICBJTlQgaTsKIAotICBmb3IgKGkgPSAwOyBpICsgaHVmZnNlY3Rpb25baV0uc2ZiQ250IDwgbWF4U2ZiOyBpICs9IGh1ZmZzZWN0aW9uW2ldLnNmYkNudCkKLSAgewotICAgIG1lcmdlR2Fpbkxvb2tVcFtpXSA9IEZES2FhY0VuY19DYWxjTWVyZ2VHYWluKGh1ZmZzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0TG9va1VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkZUluZm9UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArIGh1ZmZzZWN0aW9uW2ldLnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVZDQjExKTsKKyAgZm9yIChpID0gMDsgaSArIGh1ZmZzZWN0aW9uW2ldLnNmYkNudCA8IG1heFNmYjsgaSArPSBodWZmc2VjdGlvbltpXS5zZmJDbnQpIHsKKyAgICBtZXJnZUdhaW5Mb29rVXBbaV0gPQorICAgICAgICBGREthYWNFbmNfQ2FsY01lcmdlR2FpbihodWZmc2VjdGlvbiwgYml0TG9va1VwLCBzaWRlSW5mb1RhYiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArIGh1ZmZzZWN0aW9uW2ldLnNmYkNudCwgdXNlVkNCMTEpOwogICB9CiAKLSAgd2hpbGUgKFRSVUUpCi0gIHsKLSAgICBJTlQgbWF4TWVyZ2VHYWluLCBtYXhOZHggPSAwLCBtYXhOZHhOZXh0LCBtYXhOZHhMYXN0OworICB3aGlsZSAoVFJVRSkgeworICAgIElOVCBtYXhNZXJnZUdhaW4sIG1heE5keCwgbWF4TmR4TmV4dCwgbWF4TmR4TGFzdDsKIAotICAgIG1heE1lcmdlR2FpbiA9IEZES2FhY0VuY19maW5kTWF4TWVyZ2UobWVyZ2VHYWluTG9va1VwLCBodWZmc2VjdGlvbiwgbWF4U2ZiLCAmbWF4TmR4KTsKKyAgICBtYXhNZXJnZUdhaW4gPQorICAgICAgICBGREthYWNFbmNfZmluZE1heE1lcmdlKG1lcmdlR2Fpbkxvb2tVcCwgaHVmZnNlY3Rpb24sIG1heFNmYiwgJm1heE5keCk7CiAKICAgICAvKiBleGl0IHdoaWxlIGxvb3AgaWYgbm8gbW9yZSBnYWluIGlzIHBvc3NpYmxlICovCi0gICAgaWYgKG1heE1lcmdlR2FpbiA8PSAwKQotICAgICAgYnJlYWs7CisgICAgaWYgKG1heE1lcmdlR2FpbiA8PSAwKSBicmVhazsKIAogICAgIG1heE5keE5leHQgPSBtYXhOZHggKyBodWZmc2VjdGlvblttYXhOZHhdLnNmYkNudDsKIAogICAgIC8qIG1lcmdlIHNlY3Rpb25zIHdpdGggbWF4aW11bSBiaXQgZ2FpbiAqLwogICAgIGh1ZmZzZWN0aW9uW21heE5keF0uc2ZiQ250ICs9IGh1ZmZzZWN0aW9uW21heE5keE5leHRdLnNmYkNudDsKLSAgICBodWZmc2VjdGlvblttYXhOZHhdLnNlY3Rpb25CaXRzICs9IGh1ZmZzZWN0aW9uW21heE5keE5leHRdLnNlY3Rpb25CaXRzIC0gbWF4TWVyZ2VHYWluOworICAgIGh1ZmZzZWN0aW9uW21heE5keF0uc2VjdGlvbkJpdHMgKz0KKyAgICAgICAgaHVmZnNlY3Rpb25bbWF4TmR4TmV4dF0uc2VjdGlvbkJpdHMgLSBtYXhNZXJnZUdhaW47CiAKICAgICAvKiB1cGRhdGUgYml0IGxvb2sgdXAgdGFibGUgZm9yIG1lcmdlZCBodWZmc2VjdGlvbiAgKi8KICAgICBGREthYWNFbmNfbWVyZ2VCaXRMb29rVXAoYml0TG9va1VwW21heE5keF0sIGJpdExvb2tVcFttYXhOZHhOZXh0XSk7CiAKICAgICAvKiB1cGRhdGUgbWVyZ2VMb29rVXBUYWJsZSAqLwotICAgIGlmIChtYXhOZHggIT0gMCkKLSAgICB7CisgICAgaWYgKG1heE5keCAhPSAwKSB7CiAgICAgICBtYXhOZHhMYXN0ID0gaHVmZnNlY3Rpb25bbWF4TmR4IC0gMV0uc2ZiU3RhcnQ7Ci0gICAgICBtZXJnZUdhaW5Mb29rVXBbbWF4TmR4TGFzdF0gPSBGREthYWNFbmNfQ2FsY01lcmdlR2FpbihodWZmc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0TG9va1VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlSW5mb1RhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TmR4TGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TmR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VWQ0IxMSk7Ci0KKyAgICAgIG1lcmdlR2Fpbkxvb2tVcFttYXhOZHhMYXN0XSA9IEZES2FhY0VuY19DYWxjTWVyZ2VHYWluKAorICAgICAgICAgIGh1ZmZzZWN0aW9uLCBiaXRMb29rVXAsIHNpZGVJbmZvVGFiLCBtYXhOZHhMYXN0LCBtYXhOZHgsIHVzZVZDQjExKTsKICAgICB9CiAgICAgbWF4TmR4TmV4dCA9IG1heE5keCArIGh1ZmZzZWN0aW9uW21heE5keF0uc2ZiQ250OwogCiAgICAgaHVmZnNlY3Rpb25bbWF4TmR4TmV4dCAtIDFdLnNmYlN0YXJ0ID0gaHVmZnNlY3Rpb25bbWF4TmR4XS5zZmJTdGFydDsKIAogICAgIGlmIChtYXhOZHhOZXh0IDwgbWF4U2ZiKQotICAgICAgbWVyZ2VHYWluTG9va1VwW21heE5keF0gPSBGREthYWNFbmNfQ2FsY01lcmdlR2FpbihodWZmc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRMb29rVXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkZUluZm9UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TmR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE5keE5leHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlVkNCMTEpOwotCisgICAgICBtZXJnZUdhaW5Mb29rVXBbbWF4TmR4XSA9IEZES2FhY0VuY19DYWxjTWVyZ2VHYWluKAorICAgICAgICAgIGh1ZmZzZWN0aW9uLCBiaXRMb29rVXAsIHNpZGVJbmZvVGFiLCBtYXhOZHgsIG1heE5keE5leHQsIHVzZVZDQjExKTsKICAgfQogfQogCiAvKiBjb3VudCBiaXRzIHVzZWQgYnkgdGhlIG5vaXNlbGVzcyBjb2RlciAqLwogc3RhdGljIHZvaWQgRkRLYWFjRW5jX25vaXNlbGVzc0NvdW50ZXIoCi0gICAgICAgIFNFQ1RJT05fREFUQSogY29uc3QgUkVTVFJJQ1Qgc2VjdGlvbkRhdGEsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VHYWluTG9va1VwW01BWF9TRkJfTE9OR10sCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgYml0TG9va1VwW01BWF9TRkJfTE9OR11bQ09ERV9CT09LX0VTQ19ORFggKyAxXSwKLSAgICAgICAgY29uc3QgU0hPUlQqIGNvbnN0ICAgICAgICAgICBxdWFudFNwZWN0cnVtLAotICAgICAgICBjb25zdCBVSU5UKiBjb25zdCAgICAgICAgICAgIG1heFZhbHVlSW5TZmIsCi0gICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgICAgc2ZiT2Zmc2V0LAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgIGJsb2NrVHlwZSwKLSAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICAgICBub2lzZU5yZywKLSAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICAgICBpc0Jvb2ssCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgdXNlVkNCMTEKLSAgICAgICAgKQoteworICAgIFNFQ1RJT05fREFUQSogY29uc3QgUkVTVFJJQ1Qgc2VjdGlvbkRhdGEsIElOVCBtZXJnZUdhaW5Mb29rVXBbTUFYX1NGQl9MT05HXSwKKyAgICBJTlQgYml0TG9va1VwW01BWF9TRkJfTE9OR11bQ09ERV9CT09LX0VTQ19ORFggKyAxXSwKKyAgICBjb25zdCBTSE9SVCogY29uc3QgcXVhbnRTcGVjdHJ1bSwgY29uc3QgVUlOVCogY29uc3QgbWF4VmFsdWVJblNmYiwKKyAgICBjb25zdCBJTlQqIGNvbnN0IHNmYk9mZnNldCwgY29uc3QgSU5UIGJsb2NrVHlwZSwgY29uc3QgSU5UKiBjb25zdCBub2lzZU5yZywKKyAgICBjb25zdCBJTlQqIGNvbnN0IGlzQm9vaywgY29uc3QgSU5UIHVzZVZDQjExKSB7CiAgIElOVCBncnBOZHgsIGk7Ci0gIGNvbnN0IFNIT1JUICpzaWRlSW5mb1RhYiA9IE5VTEw7Ci0gIFNFQ1RJT05fSU5GTyAqaHVmZnNlY3Rpb247CisgIGNvbnN0IFNIT1JUKiBzaWRlSW5mb1RhYiA9IE5VTEw7CisgIFNFQ1RJT05fSU5GTyogaHVmZnNlY3Rpb247CiAKICAgLyogdXNlIGFwcHJvcHJpYXRlIHNpZGUgaW5mbyB0YWJsZSAqLwotICBzd2l0Y2ggKGJsb2NrVHlwZSkKLSAgewotICBjYXNlIExPTkdfV0lORE9XOgotICBjYXNlIFNUQVJUX1dJTkRPVzoKLSAgY2FzZSBTVE9QX1dJTkRPVzoKLSAgICBzaWRlSW5mb1RhYiA9IEZES2FhY0VuY19zaWRlSW5mb1RhYkxvbmc7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgU0hPUlRfV0lORE9XOgotICAgIHNpZGVJbmZvVGFiID0gRkRLYWFjRW5jX3NpZGVJbmZvVGFiU2hvcnQ7Ci0gICAgYnJlYWs7CisgIHN3aXRjaCAoYmxvY2tUeXBlKSB7CisgICAgY2FzZSBMT05HX1dJTkRPVzoKKyAgICBjYXNlIFNUQVJUX1dJTkRPVzoKKyAgICBjYXNlIFNUT1BfV0lORE9XOgorICAgIGRlZmF1bHQ6CisgICAgICBzaWRlSW5mb1RhYiA9IEZES2FhY0VuY19zaWRlSW5mb1RhYkxvbmc7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNIT1JUX1dJTkRPVzoKKyAgICAgIHNpZGVJbmZvVGFiID0gRkRLYWFjRW5jX3NpZGVJbmZvVGFiU2hvcnQ7CisgICAgICBicmVhazsKICAgfQogCiAgIHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnMgPSAwOwogICBzZWN0aW9uRGF0YS0+aHVmZm1hbkJpdHMgPSAwOwogICBzZWN0aW9uRGF0YS0+c2lkZUluZm9CaXRzID0gMDsKIAotCi0gIGlmIChzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAgPT0gMCkKLSAgICByZXR1cm47CisgIGlmIChzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAgPT0gMCkgcmV0dXJuOwogCiAgIC8qIGxvb3AgdHJvdWdoIGdyb3VwcyAqLwotICBmb3IgKGdycE5keCA9IDA7IGdycE5keCA8IHNlY3Rpb25EYXRhLT5zZmJDbnQ7IGdycE5keCArPSBzZWN0aW9uRGF0YS0+c2ZiUGVyR3JvdXApCi0gIHsKKyAgZm9yIChncnBOZHggPSAwOyBncnBOZHggPCBzZWN0aW9uRGF0YS0+c2ZiQ250OworICAgICAgIGdycE5keCArPSBzZWN0aW9uRGF0YS0+c2ZiUGVyR3JvdXApIHsKICAgICBodWZmc2VjdGlvbiA9IHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbiArIHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7CiAKICAgICAvKiBjb3VudCBiaXRzIGluIHRoaXMgZ3JvdXAgKi8KLSAgICBGREthYWNFbmNfYnVpbGRCaXRMb29rVXAocXVhbnRTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0ICsgZ3JwTmR4LAotICAgICAgICAgICAgICAgICAgIG1heFZhbHVlSW5TZmIgKyBncnBOZHgsCi0gICAgICAgICAgICAgICAgICAgYml0TG9va1VwLAotICAgICAgICAgICAgICAgICAgIGh1ZmZzZWN0aW9uKTsKKyAgICBGREthYWNFbmNfYnVpbGRCaXRMb29rVXAocXVhbnRTcGVjdHJ1bSwgc2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQgKyBncnBOZHgsIG1heFZhbHVlSW5TZmIgKyBncnBOZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdExvb2tVcCwgaHVmZnNlY3Rpb24pOwogCiAgICAgLyogMC5TdGFnZSA6RmluZCBtaW5pbXVtIENvZGVib29rcyAqLwotICAgIEZES2FhY0VuY19nbVN0YWdlMChodWZmc2VjdGlvbiwgYml0TG9va1VwLCBzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAsIG5vaXNlTnJnK2dycE5keCwgaXNCb29rK2dycE5keCk7CisgICAgRkRLYWFjRW5jX2dtU3RhZ2UwKGh1ZmZzZWN0aW9uLCBiaXRMb29rVXAsIHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgbm9pc2VOcmcgKyBncnBOZHgsIGlzQm9vayArIGdycE5keCk7CiAKICAgICAvKiAxLlN0YWdlIDpNZXJnZSBhbGwgY29ubmVjdGVkIHJlZ2lvbnMgd2l0aCB0aGUgc2FtZSBjb2RlIGJvb2sgKi8KLSAgICBGREthYWNFbmNfZ21TdGFnZTEoaHVmZnNlY3Rpb24sIGJpdExvb2tVcCwgc2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwLCBzaWRlSW5mb1RhYiwgdXNlVkNCMTEpOwotCisgICAgRkRLYWFjRW5jX2dtU3RhZ2UxKGh1ZmZzZWN0aW9uLCBiaXRMb29rVXAsIHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2lkZUluZm9UYWIsIHVzZVZDQjExKTsKIAogICAgIC8qCiAgICAgICAgMi5TdGFnZQpAQCAtNDUwLDE0ICszOTMsOCBAQAogICAgICAgIGdhaW4gdW50aWwgbm8gbW9yZSBnYWluIGlzIHBvc3NpYmxlCiAgICAgICovCiAKLSAgICBGREthYWNFbmNfZ21TdGFnZTIoaHVmZnNlY3Rpb24sCi0gICAgICAgICAgICAgbWVyZ2VHYWluTG9va1VwLAotICAgICAgICAgICAgIGJpdExvb2tVcCwKLSAgICAgICAgICAgICBzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgc2lkZUluZm9UYWIsCi0gICAgICAgICAgICAgdXNlVkNCMTEpOwotCi0KKyAgICBGREthYWNFbmNfZ21TdGFnZTIoaHVmZnNlY3Rpb24sIG1lcmdlR2Fpbkxvb2tVcCwgYml0TG9va1VwLAorICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAsIHNpZGVJbmZvVGFiLCB1c2VWQ0IxMSk7CiAKICAgICAvKgogICAgICAgIGNvbXByZXNzIG91dHB1dCwgY2FsY3VsYXRlIHRvdGFsIGh1ZmYgYW5kIHNpZGUgYml0cwpAQCAtNDY1LDMxICs0MDIsMzMgQEAKICAgICAgICB0byBzYXZlIHRpbWUsIHdlIG11c3Qgc2V0IGl0IGhlcmUgZm9yIGxhdGVyIHVzZSBpbiBiaXRlbmMKICAgICAgKi8KIAotICAgIGZvciAoaSA9IDA7IGkgPCBzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXA7IGkgKz0gaHVmZnNlY3Rpb25baV0uc2ZiQ250KQotICAgIHsKLSAgICAgIGlmICgoaHVmZnNlY3Rpb25baV0uY29kZUJvb2s9PUNPREVfQk9PS19QTlNfTk8pIHx8Ci0gICAgICAgICAgKGh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rPT1DT0RFX0JPT0tfSVNfT1VUX09GX1BIQVNFX05PKSB8fAotICAgICAgICAgIChodWZmc2VjdGlvbltpXS5jb2RlQm9vaz09Q09ERV9CT09LX0lTX0lOX1BIQVNFX05PKSkKLSAgICAgIHsKLSAgICAgICAgaHVmZnNlY3Rpb25baV0uc2VjdGlvbkJpdHM9MDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwOyBpICs9IGh1ZmZzZWN0aW9uW2ldLnNmYkNudCkgeworICAgICAgaWYgKChodWZmc2VjdGlvbltpXS5jb2RlQm9vayA9PSBDT0RFX0JPT0tfUE5TX05PKSB8fAorICAgICAgICAgIChodWZmc2VjdGlvbltpXS5jb2RlQm9vayA9PSBDT0RFX0JPT0tfSVNfT1VUX09GX1BIQVNFX05PKSB8fAorICAgICAgICAgIChodWZmc2VjdGlvbltpXS5jb2RlQm9vayA9PSBDT0RFX0JPT0tfSVNfSU5fUEhBU0VfTk8pKSB7CisgICAgICAgIGh1ZmZzZWN0aW9uW2ldLnNlY3Rpb25CaXRzID0gMDsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIHRoZSBzZWN0aW9ucyBpbiB0aGUgc2VjdGlvbkRhdGEgYXJlIG5vdyBtYXJrZWQgd2l0aCB0aGUgb3B0aW1hbCBjb2RlIGJvb2sgKi8KKyAgICAgICAgLyogdGhlIHNlY3Rpb25zIGluIHRoZSBzZWN0aW9uRGF0YSBhcmUgbm93IG1hcmtlZCB3aXRoIHRoZSBvcHRpbWFsIGNvZGUKKyAgICAgICAgICogYm9vayAqLwogCi0gICAgICAgICAgRkRLYWFjRW5jX2ZpbmRCZXN0Qm9vayhiaXRMb29rVXBbaV0sICYoaHVmZnNlY3Rpb25baV0uY29kZUJvb2spLCB1c2VWQ0IxMSk7CisgICAgICAgIEZES2FhY0VuY19maW5kQmVzdEJvb2soYml0TG9va1VwW2ldLCAmKGh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VWQ0IxMSk7CiAKLSAgICAgICAgc2VjdGlvbkRhdGEtPmh1ZmZtYW5CaXRzICs9IGh1ZmZzZWN0aW9uW2ldLnNlY3Rpb25CaXRzIC0gRkRLYWFjRW5jX2dldFNpZGVJbmZvQml0cygmaHVmZnNlY3Rpb25baV0sIHNpZGVJbmZvVGFiLCB1c2VWQ0IxMSk7CisgICAgICAgIHNlY3Rpb25EYXRhLT5odWZmbWFuQml0cyArPQorICAgICAgICAgICAgaHVmZnNlY3Rpb25baV0uc2VjdGlvbkJpdHMgLQorICAgICAgICAgICAgRkRLYWFjRW5jX2dldFNpZGVJbmZvQml0cygmaHVmZnNlY3Rpb25baV0sIHNpZGVJbmZvVGFiLCB1c2VWQ0IxMSk7CiAgICAgICB9CiAKICAgICAgIGh1ZmZzZWN0aW9uW2ldLnNmYlN0YXJ0ICs9IGdycE5keDsKIAogICAgICAgLyogc3VtIHVwIHNpZGUgaW5mbyBiaXRzIChzZWN0aW9uIGRhdGEgYml0cykgKi8KLSAgICAgIHNlY3Rpb25EYXRhLT5zaWRlSW5mb0JpdHMgKz0gRkRLYWFjRW5jX2dldFNpZGVJbmZvQml0cygmaHVmZnNlY3Rpb25baV0sIHNpZGVJbmZvVGFiLCB1c2VWQ0IxMSk7CisgICAgICBzZWN0aW9uRGF0YS0+c2lkZUluZm9CaXRzICs9CisgICAgICAgICAgRkRLYWFjRW5jX2dldFNpZGVJbmZvQml0cygmaHVmZnNlY3Rpb25baV0sIHNpZGVJbmZvVGFiLCB1c2VWQ0IxMSk7CiAgICAgICBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25bc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucysrXSA9IGh1ZmZzZWN0aW9uW2ldOwogICAgIH0KICAgfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfc2NmQ291bnQKQEAgLTUyNSw4MCArNDY0LDY4IEBACiAgICAgICAgICAgICAgICAgICBzY2FsZmFjR2FpbiAoNzUpIGFuZCB0aGUgZnV0dXJlIHNjYWxlZmFjR2FpbiAoNSkgaXMgNzAuCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRkRLYWFjRW5jX3NjZkNvdW50KAotICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIHNjYWxlZmFjR2FpbiwKLSAgICAgICAgY29uc3QgVUlOVCogY29uc3QgICAgICAgICAgICBtYXhWYWx1ZUluU2ZiLAotICAgICAgICBTRUNUSU9OX0RBVEEqIGNvbnN0IFJFU1RSSUNUIHNlY3Rpb25EYXRhLAotICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIGlzU2NhbGUKLSAgICAgICAgKQoteworc3RhdGljIHZvaWQgRkRLYWFjRW5jX3NjZkNvdW50KGNvbnN0IElOVCogY29uc3Qgc2NhbGVmYWNHYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQqIGNvbnN0IG1heFZhbHVlSW5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDVElPTl9EQVRBKiBjb25zdCBSRVNUUklDVCBzZWN0aW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQqIGNvbnN0IGlzU2NhbGUpIHsKICAgSU5UIGksIGosIGssIG0sIG47CiAKLSAgSU5UIGxhc3RWYWxTY2YgICAgID0gMDsKLSAgSU5UIGRlbHRhU2NmICAgICAgID0gMDsKLSAgSU5UIGZvdW5kICAgICAgICAgID0gMDsKKyAgSU5UIGxhc3RWYWxTY2YgPSAwOworICBJTlQgZGVsdGFTY2YgPSAwOworICBJTlQgZm91bmQgPSAwOwogICBJTlQgc2NmU2tpcENvdW50ZXIgPSAwOwotICBJTlQgbGFzdFZhbElzICAgICAgPSAwOworICBJTlQgbGFzdFZhbElzID0gMDsKIAogICBzZWN0aW9uRGF0YS0+c2NhbGVmYWNCaXRzID0gMDsKIAotICBpZiAoc2NhbGVmYWNHYWluID09IE5VTEwpCi0gICAgcmV0dXJuOworICBpZiAoc2NhbGVmYWNHYWluID09IE5VTEwpIHJldHVybjsKIAogICBzZWN0aW9uRGF0YS0+Zmlyc3RTY2YgPSAwOwogCi0gIGZvciAoaT0wOyBpPHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7IGkrKykKLSAgewotICAgIGlmIChzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uY29kZUJvb2sgIT0gQ09ERV9CT09LX1pFUk9fTk8pCi0gICAgeworICBmb3IgKGkgPSAwOyBpIDwgc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9uczsgaSsrKSB7CisgICAgaWYgKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayAhPSBDT0RFX0JPT0tfWkVST19OTykgewogICAgICAgc2VjdGlvbkRhdGEtPmZpcnN0U2NmID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYlN0YXJ0OwogICAgICAgbGFzdFZhbFNjZiA9IHNjYWxlZmFjR2FpbltzZWN0aW9uRGF0YS0+Zmlyc3RTY2ZdOwogICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAKLSAgZm9yIChpPTA7IGk8c2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9uczsgaSsrKQotICB7Ci0gICAgaWYgKChzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uY29kZUJvb2sgPT0gQ09ERV9CT09LX0lTX09VVF9PRl9QSEFTRV9OTykgfHwKLSAgICAgICAgKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayA9PSBDT0RFX0JPT0tfSVNfSU5fUEhBU0VfTk8pKQotICAgIHsKKyAgZm9yIChpID0gMDsgaSA8IHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7IGkrKykgeworICAgIGlmICgoc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rID09CisgICAgICAgICBDT0RFX0JPT0tfSVNfT1VUX09GX1BIQVNFX05PKSB8fAorICAgICAgICAoc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rID09IENPREVfQk9PS19JU19JTl9QSEFTRV9OTykpIHsKICAgICAgIGZvciAoaiA9IHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJTdGFydDsKLSAgICAgICAgICAgaiA8IHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJTdGFydCArIHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJDbnQ7Ci0gICAgICAgICAgIGorKykKLSAgICAgIHsKLSAgICAgICAgSU5UIGRlbHRhSXMgPSBpc1NjYWxlW2pdLWxhc3RWYWxJczsKLSAgICAgICAgbGFzdFZhbElzICAgPSBpc1NjYWxlW2pdOwotICAgICAgICBzZWN0aW9uRGF0YS0+c2NhbGVmYWNCaXRzKz1GREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKGRlbHRhSXMpOworICAgICAgICAgICBqIDwgc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYlN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiQ250OworICAgICAgICAgICBqKyspIHsKKyAgICAgICAgSU5UIGRlbHRhSXMgPSBpc1NjYWxlW2pdIC0gbGFzdFZhbElzOworICAgICAgICBsYXN0VmFsSXMgPSBpc1NjYWxlW2pdOworICAgICAgICBzZWN0aW9uRGF0YS0+c2NhbGVmYWNCaXRzICs9CisgICAgICAgICAgICBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKGRlbHRhSXMpOwogICAgICAgfQogICAgIH0gLyogSW50ZW5zaXR5ICovCiAgICAgZWxzZSBpZiAoKHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5jb2RlQm9vayAhPSBDT0RFX0JPT0tfWkVST19OTykgJiYKLSAgICAgICAgICAgICAoc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLmNvZGVCb29rICE9IENPREVfQk9PS19QTlNfTk8pKQotICAgIHsKLSAgICAgIElOVCB0bXAgPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQgKyBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiQ250OwotICAgICAgZm9yIChqID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYlN0YXJ0OyBqPHRtcDsgaisrKQotICAgICAgeworICAgICAgICAgICAgIChzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uY29kZUJvb2sgIT0gQ09ERV9CT09LX1BOU19OTykpIHsKKyAgICAgIElOVCB0bXAgPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQgKworICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvbltpXS5zZmJDbnQ7CisgICAgICBmb3IgKGogPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uc2ZiU3RhcnQ7IGogPCB0bXA7IGorKykgewogICAgICAgICAvKiBjaGVjayBpZiB3ZSBjYW4gcmVwZWF0IHRoZSBsYXN0IHZhbHVlIHRvIHNhdmUgYml0cyAqLwotICAgICAgICBpZiAobWF4VmFsdWVJblNmYltqXSA9PSAwKQotICAgICAgICB7CisgICAgICAgIGlmIChtYXhWYWx1ZUluU2ZiW2pdID09IDApIHsKICAgICAgICAgICBmb3VuZCA9IDA7CiAgICAgICAgICAgLyogYXJlIHNjYWxlZmFjdG9ycyBza2lwcGVkPyAqLwotICAgICAgICAgIGlmIChzY2ZTa2lwQ291bnRlciA9PSAwKQotICAgICAgICAgIHsKKyAgICAgICAgICBpZiAoc2NmU2tpcENvdW50ZXIgPT0gMCkgewogICAgICAgICAgICAgLyogZW5kIG9mIHNlY3Rpb24gKi8KLSAgICAgICAgICAgIGlmIChqID09ICh0bXAgLSAxKSApCi0gICAgICAgICAgICAgIGZvdW5kID0gMDsgIC8qIHNlYXJjaCBpbiBvdGhlciBzZWN0aW9ucyBmb3IgbWF4VmFsdWVJblNmYiAhPSAwICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoaiA9PSAodG1wIC0gMSkpCisgICAgICAgICAgICAgIGZvdW5kID0gMDsgLyogc2VhcmNoIGluIG90aGVyIHNlY3Rpb25zIGZvciBtYXhWYWx1ZUluU2ZiICE9IDAgKi8KKyAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAvKiBzZWFyY2ggaW4gdGhpcyBzZWN0aW9uIGZvciB0aGUgbmV4dCBtYXhWYWx1ZUluU2ZiW10gIT0gMCAqLwotICAgICAgICAgICAgICBmb3IgKGsgPSAoaisxKTsgayA8IHRtcDsgaysrKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG1heFZhbHVlSW5TZmJba10gIT0gMCkKLSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZvciAoayA9IChqICsgMSk7IGsgPCB0bXA7IGsrKykgeworICAgICAgICAgICAgICAgIGlmIChtYXhWYWx1ZUluU2ZiW2tdICE9IDApIHsKICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICAgIGlmICggKGZpeHBfYWJzKHNjYWxlZmFjR2FpbltrXSAtIGxhc3RWYWxTY2YpKSA8PSBDT0RFX0JPT0tfU0NGX0xBVikKLSAgICAgICAgICAgICAgICAgICAgIGRlbHRhU2NmID0gMDsgLyogc2F2ZSBiaXRzICovCi0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoKGZpeHBfYWJzKHNjYWxlZmFjR2FpbltrXSAtIGxhc3RWYWxTY2YpKSA8PQorICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWKQorICAgICAgICAgICAgICAgICAgICBkZWx0YVNjZiA9IDA7IC8qIHNhdmUgYml0cyAqLworICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8qIGRvIG5vdCBzYXZlIGJpdHMgKi8KICAgICAgICAgICAgICAgICAgICAgZGVsdGFTY2YgPSBsYXN0VmFsU2NmIC0gc2NhbGVmYWNHYWluW2pdOwogICAgICAgICAgICAgICAgICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNHYWluW2pdOwpAQCAtNjEyLDIwICs1MzksMTkgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogc2VhcmNoIGZvciB0aGUgbmV4dCBtYXhWYWx1ZUluU2ZiW10gIT0gMCBpbiBhbGwgb3RoZXIgc2VjdGlvbnMgKi8KLSAgICAgICAgICAgIGZvciAobT0oaSsxKTsgKG0gPCBzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zKSAmJiAoZm91bmQgPT0gMCk7IG0rKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKChzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25bbV0uY29kZUJvb2sgIT0gQ09ERV9CT09LX1pFUk9fTk8pICYmIChzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25bbV0uY29kZUJvb2sgIT0gQ09ERV9CT09LX1BOU19OTykpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJTlQgZW5kID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW21dLnNmYlN0YXJ0ICsgc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW21dLnNmYkNudDsKLSAgICAgICAgICAgICAgICBmb3IgKG4gPSBzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25bbV0uc2ZiU3RhcnQ7IG48ZW5kOyBuKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKG1heFZhbHVlSW5TZmJbbl0gIT0gMCkKLSAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAobSA9IChpICsgMSk7IChtIDwgc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucykgJiYgKGZvdW5kID09IDApOworICAgICAgICAgICAgICAgICBtKyspIHsKKyAgICAgICAgICAgICAgaWYgKChzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25bbV0uY29kZUJvb2sgIT0gQ09ERV9CT09LX1pFUk9fTk8pICYmCisgICAgICAgICAgICAgICAgICAoc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW21dLmNvZGVCb29rICE9IENPREVfQk9PS19QTlNfTk8pKSB7CisgICAgICAgICAgICAgICAgSU5UIGVuZCA9IHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvblttXS5zZmJTdGFydCArCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhLT5odWZmc2VjdGlvblttXS5zZmJDbnQ7CisgICAgICAgICAgICAgICAgZm9yIChuID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW21dLnNmYlN0YXJ0OyBuIDwgZW5kOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgIGlmIChtYXhWYWx1ZUluU2ZiW25dICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoZml4cF9hYnMoc2NhbGVmYWNHYWluW25dIC0gbGFzdFZhbFNjZikgPD0gQ09ERV9CT09LX1NDRl9MQVYpCi0gICAgICAgICAgICAgICAgICAgICAgZGVsdGFTY2YgPSAwOyAgLyogc2F2ZSBiaXRzICovCi0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZml4cF9hYnMoc2NhbGVmYWNHYWluW25dIC0gbGFzdFZhbFNjZikgPD0KKyAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWKQorICAgICAgICAgICAgICAgICAgICAgIGRlbHRhU2NmID0gMDsgLyogc2F2ZSBiaXRzICovCisgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIG5vdCBzYXZlIGJpdHMgKi8KICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVNjZiA9IGxhc3RWYWxTY2YgLSBzY2FsZWZhY0dhaW5bal07CiAgICAgICAgICAgICAgICAgICAgICAgbGFzdFZhbFNjZiA9IHNjYWxlZmFjR2FpbltqXTsKQEAgLTYzOSw2NCArNTY1LDI5IEBACiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8qIG5vIG1heFZhbHVlSW5TZmJbXSAhPSAwIGZvdW5kICovCi0gICAgICAgICAgICBpZiAoZm91bmQgPT0gMCkKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmb3VuZCA9PSAwKSB7CiAgICAgICAgICAgICAgIGRlbHRhU2NmID0gMDsKICAgICAgICAgICAgICAgc2NmU2tpcENvdW50ZXIgPSAwOwogICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogY29uc2lkZXIgc2tpcHBlZCBzY2FsZWZhY3RvcnMgKi8KICAgICAgICAgICAgIGRlbHRhU2NmID0gMDsKICAgICAgICAgICAgIHNjZlNraXBDb3VudGVyLS07CiAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgIGRlbHRhU2NmID0gbGFzdFZhbFNjZiAtIHNjYWxlZmFjR2FpbltqXTsKICAgICAgICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNHYWluW2pdOwogICAgICAgICB9Ci0gICAgICAgIHNlY3Rpb25EYXRhLT5zY2FsZWZhY0JpdHMgKz0gRkRLYWFjRW5jX2JpdENvdW50U2NhbGVmYWN0b3JEZWx0YShkZWx0YVNjZik7CisgICAgICAgIHNlY3Rpb25EYXRhLT5zY2FsZWZhY0JpdHMgKz0KKyAgICAgICAgICAgIEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoZGVsdGFTY2YpOwogICAgICAgfQogICAgIH0KICAgfSAvKiBmb3IgKGk9MDsgaTxzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zOyBpKyspICovCiB9CiAKLSNpZmRlZiBQTlNfUFJFQ09VTlRfRU5BQkxFCi0vKgotICBwcmVDb3VudCBiaXRzIHVzZWQgcG5zCi0qLwotLyogZXN0aW1hdGUgYml0cyB1c2VkIGJ5IHBucyBmb3IgY29ycmVjdGlvbiBvZiBzdGF0aWMgYml0cyAqLwotLyogbm8gY29kZWJvb2sgc3dpdGNoIGVzdGltYXRpb24sIHNlZSBBQUMgTEQgRkFTVEVOQyAqLwotSU5UIG5vaXNlUHJlQ291bnQoY29uc3QgSU5UICpub2lzZU5yZywgSU5UIG1heFNmYikKLXsKLSAgSU5UICAgbm9pc2VQQ01GbGFnID0gVFJVRTsKLSAgSU5UICAgbGFzdFZhbFBucyA9IDAsIGRlbHRhUG5zOwotICBpbnQgICBpLCBiaXRzPTA7Ci0KLSBmb3IgKGkgPSAwOyBpIDwgbWF4U2ZiOyBpKyspIHsKLSAgIGlmIChub2lzZU5yZ1tpXSAhPSBOT19OT0lTRV9QTlMpIHsKLQotICAgICBpZiAobm9pc2VQQ01GbGFnKSB7Ci0gICAgICAgYml0cys9UE5TX1BDTV9CSVRTOwotICAgICAgIGxhc3RWYWxQbnMgICA9IG5vaXNlTnJnW2ldOwotICAgICAgIG5vaXNlUENNRmxhZyA9IEZBTFNFOwotICAgICB9ZWxzZSB7Ci0gICAgICAgZGVsdGFQbnMgICAgID0gbm9pc2VOcmdbaV0tbGFzdFZhbFBuczsKLSAgICAgICBsYXN0VmFsUG5zICAgPSBub2lzZU5yZ1tpXTsKLSAgICAgICBiaXRzKz1GREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKGRlbHRhUG5zKTsKLSAgICAgfQotICAgfQotIH0KLSByZXR1cm4gKCBiaXRzICk7Ci19Ci0jZW5kaWYgLyogUE5TX1BSRUNPVU5UX0VOQUJMRSAqLwotCiAvKiBjb3VudCBiaXRzIHVzZWQgYnkgcG5zICovCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfbm9pc2VDb3VudCgKLSAgICAgICAgU0VDVElPTl9EQVRBKiBjb25zdCBSRVNUUklDVCBzZWN0aW9uRGF0YSwKLSAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICAgICBub2lzZU5yZwotICAgICAgICApCi17CitzdGF0aWMgdm9pZCBGREthYWNFbmNfbm9pc2VDb3VudChTRUNUSU9OX0RBVEEqIGNvbnN0IFJFU1RSSUNUIHNlY3Rpb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UKiBjb25zdCBub2lzZU5yZykgewogICBJTlQgbm9pc2VQQ01GbGFnID0gVFJVRTsKICAgSU5UIGxhc3RWYWxQbnMgPSAwLCBkZWx0YVBuczsKICAgaW50IGksIGo7CkBAIC03MDcsOTkgKzU5OCw2NiBAQAogICAgIGlmIChzZWN0aW9uRGF0YS0+aHVmZnNlY3Rpb25baV0uY29kZUJvb2sgPT0gQ09ERV9CT09LX1BOU19OTykgewogICAgICAgaW50IHNmYlN0YXJ0ID0gc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYlN0YXJ0OwogICAgICAgaW50IHNmYkVuZCA9IHNmYlN0YXJ0ICsgc2VjdGlvbkRhdGEtPmh1ZmZzZWN0aW9uW2ldLnNmYkNudDsKLSAgICAgIGZvciAoaj1zZmJTdGFydDsgajxzZmJFbmQ7IGorKykgewotCisgICAgICBmb3IgKGogPSBzZmJTdGFydDsgaiA8IHNmYkVuZDsgaisrKSB7CiAgICAgICAgIGlmIChub2lzZVBDTUZsYWcpIHsKLSAgICAgICAgICBzZWN0aW9uRGF0YS0+bm9pc2VOcmdCaXRzKz1QTlNfUENNX0JJVFM7Ci0gICAgICAgICAgbGFzdFZhbFBucyAgID0gbm9pc2VOcmdbal07CisgICAgICAgICAgc2VjdGlvbkRhdGEtPm5vaXNlTnJnQml0cyArPSBQTlNfUENNX0JJVFM7CisgICAgICAgICAgbGFzdFZhbFBucyA9IG5vaXNlTnJnW2pdOwogICAgICAgICAgIG5vaXNlUENNRmxhZyA9IEZBTFNFOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGRlbHRhUG5zICAgICA9IG5vaXNlTnJnW2pdLWxhc3RWYWxQbnM7Ci0gICAgICAgICAgbGFzdFZhbFBucyAgID0gbm9pc2VOcmdbal07Ci0gICAgICAgICAgc2VjdGlvbkRhdGEtPm5vaXNlTnJnQml0cys9RkRLYWFjRW5jX2JpdENvdW50U2NhbGVmYWN0b3JEZWx0YShkZWx0YVBucyk7CisgICAgICAgICAgZGVsdGFQbnMgPSBub2lzZU5yZ1tqXSAtIGxhc3RWYWxQbnM7CisgICAgICAgICAgbGFzdFZhbFBucyA9IG5vaXNlTnJnW2pdOworICAgICAgICAgIHNlY3Rpb25EYXRhLT5ub2lzZU5yZ0JpdHMgKz0KKyAgICAgICAgICAgICAgRkRLYWFjRW5jX2JpdENvdW50U2NhbGVmYWN0b3JEZWx0YShkZWx0YVBucyk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KIH0KIAotSU5UIEZES2FhY0VuY19keW5CaXRDb3VudCgKLSAgICAgICAgQklUQ05UUl9TVEFURSogY29uc3QgICAgICAgICBoQkMsCi0gICAgICAgIGNvbnN0IFNIT1JUKiBjb25zdCAgICAgICAgICAgcXVhbnRTcGVjdHJ1bSwKLSAgICAgICAgY29uc3QgVUlOVCogY29uc3QgICAgICAgICAgICBtYXhWYWx1ZUluU2ZiLAotICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIHNjYWxlZmFjLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgIGJsb2NrVHlwZSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICBzZmJDbnQsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgc2ZiUGVyR3JvdXAsCi0gICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgICAgc2ZiT2Zmc2V0LAotICAgICAgICBTRUNUSU9OX0RBVEEqIGNvbnN0IFJFU1RSSUNUIHNlY3Rpb25EYXRhLAotICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIG5vaXNlTnJnLAotICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIGlzQm9vaywKLSAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICAgICBpc1NjYWxlLAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzCi0gICAgICAgICkKLXsKLSAgc2VjdGlvbkRhdGEtPmJsb2NrVHlwZSAgICAgID0gYmxvY2tUeXBlOwotICBzZWN0aW9uRGF0YS0+c2ZiQ250ICAgICAgICAgPSBzZmJDbnQ7Ci0gIHNlY3Rpb25EYXRhLT5zZmJQZXJHcm91cCAgICA9IHNmYlBlckdyb3VwOwotICBzZWN0aW9uRGF0YS0+bm9PZkdyb3VwcyAgICAgPSBzZmJDbnQgLyBzZmJQZXJHcm91cDsKK0lOVCBGREthYWNFbmNfZHluQml0Q291bnQoQklUQ05UUl9TVEFURSogY29uc3QgaEJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCogY29uc3QgcXVhbnRTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCogY29uc3QgbWF4VmFsdWVJblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UKiBjb25zdCBzY2FsZWZhYywgY29uc3QgSU5UIGJsb2NrVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNmYkNudCwgY29uc3QgSU5UIG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2ZiUGVyR3JvdXAsIGNvbnN0IElOVCogY29uc3Qgc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RBVEEqIGNvbnN0IFJFU1RSSUNUIHNlY3Rpb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQqIGNvbnN0IG5vaXNlTnJnLCBjb25zdCBJTlQqIGNvbnN0IGlzQm9vaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UKiBjb25zdCBpc1NjYWxlLCBjb25zdCBVSU5UIHN5bnRheEZsYWdzKSB7CisgIHNlY3Rpb25EYXRhLT5ibG9ja1R5cGUgPSBibG9ja1R5cGU7CisgIHNlY3Rpb25EYXRhLT5zZmJDbnQgPSBzZmJDbnQ7CisgIHNlY3Rpb25EYXRhLT5zZmJQZXJHcm91cCA9IHNmYlBlckdyb3VwOworICBzZWN0aW9uRGF0YS0+bm9PZkdyb3VwcyA9IHNmYkNudCAvIHNmYlBlckdyb3VwOwogICBzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAgPSBtYXhTZmJQZXJHcm91cDsKIAotICBGREthYWNFbmNfbm9pc2VsZXNzQ291bnRlcigKLSAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICBoQkMtPm1lcmdlR2Fpbkxvb2tVcCwKLSAgICAgICAgICAgICAgICAgICAobG9va1VwVGFibGUpaEJDLT5iaXRMb29rVXAsCi0gICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZUluU2ZiLAotICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICBibG9ja1R5cGUsCi0gICAgICAgICAgICAgICAgICAgbm9pc2VOcmcsCi0gICAgICAgICAgICAgICAgICAgaXNCb29rLAotICAgICAgICAgICAgICAgICAgIChzeW50YXhGbGFncyAmIEFDX0VSX1ZDQjExKT8xOjApOworICBGREthYWNFbmNfbm9pc2VsZXNzQ291bnRlcihzZWN0aW9uRGF0YSwgaEJDLT5tZXJnZUdhaW5Mb29rVXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb29rVXBUYWJsZSloQkMtPmJpdExvb2tVcCwgcXVhbnRTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVJblNmYiwgc2ZiT2Zmc2V0LCBibG9ja1R5cGUsIG5vaXNlTnJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Jvb2ssIChzeW50YXhGbGFncyAmIEFDX0VSX1ZDQjExKSA/IDEgOiAwKTsKIAotICBGREthYWNFbmNfc2NmQ291bnQoCi0gICAgICAgICAgIHNjYWxlZmFjLAotICAgICAgICAgICBtYXhWYWx1ZUluU2ZiLAotICAgICAgICAgICBzZWN0aW9uRGF0YSwKLSAgICAgICAgICAgaXNTY2FsZSk7CisgIEZES2FhY0VuY19zY2ZDb3VudChzY2FsZWZhYywgbWF4VmFsdWVJblNmYiwgc2VjdGlvbkRhdGEsIGlzU2NhbGUpOwogCi0gIEZES2FhY0VuY19ub2lzZUNvdW50KHNlY3Rpb25EYXRhLAotICAgICAgICAgICAgIG5vaXNlTnJnKTsKKyAgRkRLYWFjRW5jX25vaXNlQ291bnQoc2VjdGlvbkRhdGEsIG5vaXNlTnJnKTsKIAotICByZXR1cm4gKHNlY3Rpb25EYXRhLT5odWZmbWFuQml0cyArCi0gICAgICAgICAgc2VjdGlvbkRhdGEtPnNpZGVJbmZvQml0cyArCi0gICAgICAgICAgc2VjdGlvbkRhdGEtPnNjYWxlZmFjQml0cyArCi0gICAgICAgICAgc2VjdGlvbkRhdGEtPm5vaXNlTnJnQml0cyk7CisgIHJldHVybiAoc2VjdGlvbkRhdGEtPmh1ZmZtYW5CaXRzICsgc2VjdGlvbkRhdGEtPnNpZGVJbmZvQml0cyArCisgICAgICAgICAgc2VjdGlvbkRhdGEtPnNjYWxlZmFjQml0cyArIHNlY3Rpb25EYXRhLT5ub2lzZU5yZ0JpdHMpOwogfQogCi1JTlQgRkRLYWFjRW5jX0JDTmV3KEJJVENOVFJfU1RBVEUgKipwaEJDCi0gICAgICAgICAsVUNIQVIqIGR5bmFtaWNfUkFNCi0gICAgICAgICApCi17Ci0gIEJJVENOVFJfU1RBVEUgKmhCQyA9ICBHZXRSYW1fYWFjRW5jX0JpdENudHJTdGF0ZSgpOworSU5UIEZES2FhY0VuY19CQ05ldyhCSVRDTlRSX1NUQVRFKiogcGhCQywgVUNIQVIqIGR5bmFtaWNfUkFNKSB7CisgIEJJVENOVFJfU1RBVEUqIGhCQyA9IEdldFJhbV9hYWNFbmNfQml0Q250clN0YXRlKCk7CiAKLSAgaWYgKGhCQykKLSAgeworICBpZiAoaEJDKSB7CiAgICAgKnBoQkMgPSBoQkM7Ci0gICAgaEJDLT5iaXRMb29rVXAgICAgICAgPSBHZXRSYW1fYWFjRW5jX0JpdExvb2tVcCgwLGR5bmFtaWNfUkFNKTsKLSAgICBoQkMtPm1lcmdlR2Fpbkxvb2tVcCA9IEdldFJhbV9hYWNFbmNfTWVyZ2VHYWluTG9va1VwKDAsZHluYW1pY19SQU0pOwotICAgIGlmIChoQkMtPmJpdExvb2tVcCAgICAgICA9PSAwIHx8Ci0gICAgICAgIGhCQy0+bWVyZ2VHYWluTG9va1VwID09IDApCi0gICAgeworICAgIGhCQy0+Yml0TG9va1VwID0gR2V0UmFtX2FhY0VuY19CaXRMb29rVXAoMCwgZHluYW1pY19SQU0pOworICAgIGhCQy0+bWVyZ2VHYWluTG9va1VwID0gR2V0UmFtX2FhY0VuY19NZXJnZUdhaW5Mb29rVXAoMCwgZHluYW1pY19SQU0pOworICAgIGlmIChoQkMtPmJpdExvb2tVcCA9PSAwIHx8IGhCQy0+bWVyZ2VHYWluTG9va1VwID09IDApIHsKICAgICAgIHJldHVybiAxOwogICAgIH0KICAgfQogICByZXR1cm4gKGhCQyA9PSAwKSA/IDEgOiAwOwogfQogCi12b2lkIEZES2FhY0VuY19CQ0Nsb3NlKEJJVENOVFJfU1RBVEUgKipwaEJDKQotewotICBpZiAoKnBoQkMhPU5VTEwpIHsKLQordm9pZCBGREthYWNFbmNfQkNDbG9zZShCSVRDTlRSX1NUQVRFKiogcGhCQykgeworICBpZiAoKnBoQkMgIT0gTlVMTCkgewogICAgIEZyZWVSYW1fYWFjRW5jX0JpdENudHJTdGF0ZShwaEJDKTsKICAgfQogfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9keW5fYml0cy5oIGIvbGliQUFDZW5jL3NyYy9keW5fYml0cy5oCmluZGV4IGFlNzhhNGMuLmE3MjdhMzAgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvZHluX2JpdHMuaAorKysgYi9saWJBQUNlbmMvc3JjL2R5bl9iaXRzLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNDIgKzkwLDQwIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogTm9pc2VsZXNzIGNvZGVyIG1vZHVsZQorICAgQXV0aG9yKHMpOiAgIE0uV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBOb2lzZWxlc3MgY29kZXIgbW9kdWxlCiAKLSNpZm5kZWYgX19EWU5fQklUU19ICi0jZGVmaW5lIF9fRFlOX0JJVFNfSAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBEWU5fQklUU19ICisjZGVmaW5lIERZTl9CSVRTX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAogI2luY2x1ZGUgInBzeV9jb25zdC5oIgogI2luY2x1ZGUgImFhY2VuY190bnMuaCIKIAotI2RlZmluZSBNQVhfU0VDVElPTlMgICAgICAgICAgTUFYX0dST1VQRURfU0ZCCi0jZGVmaW5lIFNFQ1RfRVNDX1ZBTF9MT05HICAgIDMxCi0jZGVmaW5lIFNFQ1RfRVNDX1ZBTF9TSE9SVCAgICA3Ci0jZGVmaW5lIENPREVfQk9PS19CSVRTICAgICAgICA0Ci0jZGVmaW5lIFNFQ1RfQklUU19MT05HICAgICAgICA1Ci0jZGVmaW5lIFNFQ1RfQklUU19TSE9SVCAgICAgICAzCi0jZGVmaW5lIFBOU19QQ01fQklUUyAgICAgICAgICA5CisjZGVmaW5lIE1BWF9TRUNUSU9OUyBNQVhfR1JPVVBFRF9TRkIKKyNkZWZpbmUgU0VDVF9FU0NfVkFMX0xPTkcgMzEKKyNkZWZpbmUgU0VDVF9FU0NfVkFMX1NIT1JUIDcKKyNkZWZpbmUgQ09ERV9CT09LX0JJVFMgNAorI2RlZmluZSBTRUNUX0JJVFNfTE9ORyA1CisjZGVmaW5lIFNFQ1RfQklUU19TSE9SVCAzCisjZGVmaW5lIFBOU19QQ01fQklUUyA5CiAKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgIElOVCBjb2RlQm9vazsKICAgSU5UIHNmYlN0YXJ0OwogICBJTlQgc2ZiQ250OwotICBJTlQgc2VjdGlvbkJpdHM7ICAgICAgICAgICAgICAvKiBodWZmICsgc2kgISAqLworICBJTlQgc2VjdGlvbkJpdHM7IC8qIGh1ZmYgKyBzaSAhICovCiB9IFNFQ1RJT05fSU5GTzsKIAotCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICBJTlQgYmxvY2tUeXBlOwogICBJTlQgbm9PZkdyb3VwczsKICAgSU5UIHNmYkNudDsKQEAgLTEyMiw0NiArMTMxLDMwIEBACiAgIElOVCBzZmJQZXJHcm91cDsKICAgSU5UIG5vT2ZTZWN0aW9uczsKICAgU0VDVElPTl9JTkZPIGh1ZmZzZWN0aW9uW01BWF9TRUNUSU9OU107Ci0gIElOVCBzaWRlSW5mb0JpdHM7ICAgICAgICAgICAgIC8qIHNlY3Rpb25pbmcgYml0cyAgICAgICAqLwotICBJTlQgaHVmZm1hbkJpdHM7ICAgICAgICAgICAgICAvKiBodWZmbWFuICAgIGNvZGVkIGJpdHMgKi8KLSAgSU5UIHNjYWxlZmFjQml0czsgICAgICAgICAgICAgLyogc2NhbGVmYWMgICBjb2RlZCBiaXRzICovCi0gIElOVCBub2lzZU5yZ0JpdHM7ICAgICAgICAgICAgIC8qIG5vaXNlRW5lcmd5IGNvZGVkIGJpdHMgKi8KLSAgSU5UIGZpcnN0U2NmOyAgICAgICAgICAgICAgICAgLyogZmlyc3Qgc2NmIHRvIGJlIGNvZGVkICovCisgIElOVCBzaWRlSW5mb0JpdHM7IC8qIHNlY3Rpb25pbmcgYml0cyAgICAgICAqLworICBJTlQgaHVmZm1hbkJpdHM7ICAvKiBodWZmbWFuICAgIGNvZGVkIGJpdHMgKi8KKyAgSU5UIHNjYWxlZmFjQml0czsgLyogc2NhbGVmYWMgICBjb2RlZCBiaXRzICovCisgIElOVCBub2lzZU5yZ0JpdHM7IC8qIG5vaXNlRW5lcmd5IGNvZGVkIGJpdHMgKi8KKyAgSU5UIGZpcnN0U2NmOyAgICAgLyogZmlyc3Qgc2NmIHRvIGJlIGNvZGVkICovCiB9IFNFQ1RJT05fREFUQTsKIAotCi1zdHJ1Y3QgQklUQ05UUl9TVEFURQotewotICBJTlQgKmJpdExvb2tVcDsKLSAgSU5UICptZXJnZUdhaW5Mb29rVXA7CitzdHJ1Y3QgQklUQ05UUl9TVEFURSB7CisgIElOVCogYml0TG9va1VwOworICBJTlQqIG1lcmdlR2Fpbkxvb2tVcDsKIH07CiAKK0lOVCBGREthYWNFbmNfQkNOZXcoQklUQ05UUl9TVEFURSoqIHBoQkMsIFVDSEFSKiBkeW5hbWljX1JBTSk7CiAKLUlOVCAgRkRLYWFjRW5jX0JDTmV3KEJJVENOVFJfU1RBVEUgKipwaEJDCi0gICAgICAgICAgLFVDSEFSKiBkeW5hbWljX1JBTQotICAgICAgICAgICk7Cit2b2lkIEZES2FhY0VuY19CQ0Nsb3NlKEJJVENOVFJfU1RBVEUqKiBwaEJDKTsKIAotdm9pZCBGREthYWNFbmNfQkNDbG9zZShCSVRDTlRSX1NUQVRFICoqcGhCQyk7Ci0KLSNpZiBkZWZpbmVkKFBOU19QUkVDT1VOVF9FTkFCTEUpCi1JTlQgIG5vaXNlUHJlQ291bnQoY29uc3QgSU5UICpub2lzZU5yZywgSU5UIG1heFNmYik7Ci0jZW5kaWYKLQotSU5UIEZES2FhY0VuY19keW5CaXRDb3VudCgKLSAgICAgICAgQklUQ05UUl9TVEFURSogY29uc3QgICAgICAgICBoQkMsCi0gICAgICAgIGNvbnN0IFNIT1JUKiBjb25zdCAgICAgICAgICAgcXVhbnRTcGVjdHJ1bSwKLSAgICAgICAgY29uc3QgVUlOVCogY29uc3QgICAgICAgICAgICBtYXhWYWx1ZUluU2ZiLAotICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIHNjYWxlZmFjLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgIGJsb2NrVHlwZSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICBzZmJDbnQsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgc2ZiUGVyR3JvdXAsCi0gICAgICAgIGNvbnN0IElOVCogY29uc3QgICAgICAgICAgICAgc2ZiT2Zmc2V0LAotICAgICAgICBTRUNUSU9OX0RBVEEqIGNvbnN0IFJFU1RSSUNUIHNlY3Rpb25EYXRhLAotICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIG5vaXNlTnJnLAotICAgICAgICBjb25zdCBJTlQqIGNvbnN0ICAgICAgICAgICAgIGlzQm9vaywKLSAgICAgICAgY29uc3QgSU5UKiBjb25zdCAgICAgICAgICAgICBpc1NjYWxlLAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzCi0gICAgICAgICk7CitJTlQgRkRLYWFjRW5jX2R5bkJpdENvdW50KEJJVENOVFJfU1RBVEUqIGNvbnN0IGhCQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQqIGNvbnN0IHF1YW50U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQqIGNvbnN0IG1heFZhbHVlSW5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCogY29uc3Qgc2NhbGVmYWMsIGNvbnN0IElOVCBibG9ja1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzZmJDbnQsIGNvbnN0IElOVCBtYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNmYlBlckdyb3VwLCBjb25zdCBJTlQqIGNvbnN0IHNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDVElPTl9EQVRBKiBjb25zdCBSRVNUUklDVCBzZWN0aW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UKiBjb25zdCBub2lzZU5yZywgY29uc3QgSU5UKiBjb25zdCBpc0Jvb2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCogY29uc3QgaXNTY2FsZSwgY29uc3QgVUlOVCBzeW50YXhGbGFncyk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9ncnBfZGF0YS5jcHAgYi9saWJBQUNlbmMvc3JjL2dycF9kYXRhLmNwcAppbmRleCA0NjU4NjVmLi5iYzlkODVmIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2dycF9kYXRhLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL2dycF9kYXRhLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxOTQgKzkwLDE3NSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IFNob3J0IGJsb2NrIGdyb3VwaW5nCisgICBBdXRob3Iocyk6ICAgTS5XZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFNob3J0IGJsb2NrIGdyb3VwaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKICNpbmNsdWRlICJwc3lfY29uc3QuaCIKICNpbmNsdWRlICJpbnRlcmZhY2UuaCIKIAogLyoKLSogdGhpcyByb3V0aW5lIGRvZXMgbm90IHdvcmsgaW4tcGxhY2UKLSovCisgKiB0aGlzIHJvdXRpbmUgZG9lcyBub3Qgd29yayBpbi1wbGFjZQorICovCiAKKy8qCisgKiBEb24ndCB1c2UgZkFkZFNhdHVyYXRlMigpIGJlY2F1c2UgaXQgbG9vc2VzIG9uZSBiaXQgYWNjdXJhY3kgd2hpY2ggaXMKKyAqIHVzZWZ1bGwgZm9yIHF1YWxpdHkuCisgKi8KIHN0YXRpYyBpbmxpbmUgRklYUF9EQkwgbnJnQWRkU2F0dXJhdGUoY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikgewotICByZXR1cm4gKCAoYT49KEZJWFBfREJMKU1BWFZBTF9EQkwtYikgPyAoRklYUF9EQkwpTUFYVkFMX0RCTCA6IChhICsgYikgKTsKKyAgcmV0dXJuICgoYSA+PSAoRklYUF9EQkwpTUFYVkFMX0RCTCAtIGIpID8gKEZJWFBfREJMKU1BWFZBTF9EQkwgOiAoYSArIGIpKTsKIH0KIAotdm9pZAotRkRLYWFjRW5jX2dyb3VwU2hvcnREYXRhKEZJWFBfREJMICAgICAgKm1kY3RTcGVjdHJ1bSwgICAgIC8qIGluLW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBTRkJfVEhSRVNIT0xEICpzZmJUaHJlc2hvbGQsICAgICAvKiBpbi1vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAqc2ZiRW5lcmd5LCAgICAgICAgLyogaW4tb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgKnNmYkVuZXJneU1TLCAgICAgIC8qIGluLW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBTRkJfRU5FUkdZICAgICpzZmJTcHJlYWRFbmVyZ3ksCi0gICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICBzZmJDbnQsCi0gICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICBzZmJBY3RpdmUsCi0gICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqc2ZiTWluU25yTGREYXRhLAotICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAqZ3JvdXBlZFNmYk9mZnNldCwgICAgICAgLyogb3V0ICovCi0gICAgICAgICAgICAgICBJTlQgICAgICAgICAgICptYXhTZmJQZXJHcm91cCwgICAgICAgICAvKiBvdXQgKi8KLSAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKmdyb3VwZWRTZmJNaW5TbnJMZERhdGEsCi0gICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICBub09mR3JvdXBzLAotICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAqZ3JvdXBMZW4sCi0gICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICBncmFudWxlTGVuZ3RoKQotewotICBJTlQgaSxqOwotICBJTlQgbGluZTsgICAgICAgLyogY291bnRzIHRocm91Z2ggbGluZXMgICAgICAgICAgICAgICovCi0gIElOVCBzZmI7ICAgICAgICAvKiBjb3VudHMgdGhyb3VnaCBzY2FsZWZhY3RvciBiYW5kcyAgKi8KLSAgSU5UIGdycDsgICAgICAgIC8qIGNvdW50cyB0aHJvdWdoIGdyb3VwcyAgICAgICAgICAgICAqLwotICBJTlQgd25kOyAgICAgICAgLyogY291bnRzIHRocm91Z2ggd2luZG93cyBpbiBhIGdyb3VwICovCi0gIElOVCBvZmZzZXQ7ICAgICAvKiBuZWVkZWQgaW4gc2ZiT2Zmc2V0IGdyb3VwaW5nICAgICAgKi8KK3ZvaWQgRkRLYWFjRW5jX2dyb3VwU2hvcnREYXRhKEZJWFBfREJMICptZGN0U3BlY3RydW0sICAgICAgLyogaW4tb3V0ICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNGQl9USFJFU0hPTEQgKnNmYlRocmVzaG9sZCwgLyogaW4tb3V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRkJfRU5FUkdZICpzZmJFbmVyZ3ksICAgICAgIC8qIGluLW91dCAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAqc2ZiRW5lcmd5TVMsICAgICAvKiBpbi1vdXQgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRkJfRU5FUkdZICpzZmJTcHJlYWRFbmVyZ3ksIGNvbnN0IElOVCBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2ZiQWN0aXZlLCBjb25zdCBJTlQgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpzZmJNaW5TbnJMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmdyb3VwZWRTZmJPZmZzZXQsIC8qIG91dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICptYXhTZmJQZXJHcm91cCwgICAvKiBvdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpncm91cGVkU2ZiTWluU25yTGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5vT2ZHcm91cHMsIGNvbnN0IElOVCAqZ3JvdXBMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZ3JhbnVsZUxlbmd0aCkgeworICBJTlQgaSwgajsKKyAgSU5UIGxpbmU7ICAgLyogY291bnRzIHRocm91Z2ggbGluZXMgICAgICAgICAgICAgICovCisgIElOVCBzZmI7ICAgIC8qIGNvdW50cyB0aHJvdWdoIHNjYWxlZmFjdG9yIGJhbmRzICAqLworICBJTlQgZ3JwOyAgICAvKiBjb3VudHMgdGhyb3VnaCBncm91cHMgICAgICAgICAgICAgKi8KKyAgSU5UIHduZDsgICAgLyogY291bnRzIHRocm91Z2ggd2luZG93cyBpbiBhIGdyb3VwICovCisgIElOVCBvZmZzZXQ7IC8qIG5lZWRlZCBpbiBzZmJPZmZzZXQgZ3JvdXBpbmcgICAgICAqLwogICBJTlQgaGlnaGVzdFNmYjsKKyAgSU5UIGdyYW51bGVMZW5ndGhfc2hvcnQgPSBncmFudWxlTGVuZ3RoIC8gVFJBTlNfRkFDOwogCi0gIElOVCBncmFudWxlTGVuZ3RoX3Nob3J0ID0gZ3JhbnVsZUxlbmd0aC9UUkFOU19GQUM7CisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVCh0bXBTcGVjdHJ1bSwgRklYUF9EQkwsICgxMDI0KSkKIAogICAvKiBmb3Igc2hvcnQgYmxvY2tzOiByZWdyb3VwIHNwZWN0cnVtIGFuZCAqLwogICAvKiBncm91cCBlbmVyZ2llcyBhbmQgdGhyZXNob2xkcyBhY2NvcmRpbmcgdG8gZ3JvdXBpbmcgKi8KLSAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHRtcFNwZWN0cnVtLCBGSVhQX0RCTCwgKDEwMjQpKTsKIAogICAvKiBjYWxjdWxhdGUgbWF4U2ZiUGVyR3JvdXAgKi8KICAgaGlnaGVzdFNmYiA9IDA7Ci0gIGZvciAod25kID0gMDsgd25kIDwgVFJBTlNfRkFDOyB3bmQrKykKLSAgewotICAgIGZvciAoc2ZiID0gc2ZiQWN0aXZlLTE7IHNmYiA+PSBoaWdoZXN0U2ZiOyBzZmItLSkKLSAgICB7Ci0gICAgICBmb3IgKGxpbmUgPSBzZmJPZmZzZXRbc2ZiKzFdLTE7IGxpbmUgPj0gc2ZiT2Zmc2V0W3NmYl07IGxpbmUtLSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBtZGN0U3BlY3RydW1bd25kKmdyYW51bGVMZW5ndGhfc2hvcnQrbGluZV0gIT0gRkwyRlhDT05TVF9TUEMoMC4wKSApIGJyZWFrOyAvKiB0aGlzIGJhbmQgaXMgbm90IGNvbXBsZXRlbHkgemVybyAqLworICBmb3IgKHduZCA9IDA7IHduZCA8IFRSQU5TX0ZBQzsgd25kKyspIHsKKyAgICBmb3IgKHNmYiA9IHNmYkFjdGl2ZSAtIDE7IHNmYiA+PSBoaWdoZXN0U2ZiOyBzZmItLSkgeworICAgICAgZm9yIChsaW5lID0gc2ZiT2Zmc2V0W3NmYiArIDFdIC0gMTsgbGluZSA+PSBzZmJPZmZzZXRbc2ZiXTsgbGluZS0tKSB7CisgICAgICAgIGlmIChtZGN0U3BlY3RydW1bd25kICogZ3JhbnVsZUxlbmd0aF9zaG9ydCArIGxpbmVdICE9CisgICAgICAgICAgICBGTDJGWENPTlNUX1NQQygwLjApKQorICAgICAgICAgIGJyZWFrOyAvKiB0aGlzIGJhbmQgaXMgbm90IGNvbXBsZXRlbHkgemVybyAqLwogICAgICAgfQotICAgICAgaWYgKGxpbmUgPj0gc2ZiT2Zmc2V0W3NmYl0pIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBiYW5kIHdhcyBub3QgY29tcGxldGVseSB6ZXJvICovCisgICAgICBpZiAobGluZSA+PSBzZmJPZmZzZXRbc2ZiXSkgYnJlYWs7IC8qIHRoaXMgYmFuZCB3YXMgbm90IGNvbXBsZXRlbHkgemVybyAqLwogICAgIH0KICAgICBoaWdoZXN0U2ZiID0gZml4TWF4KGhpZ2hlc3RTZmIsIHNmYik7CiAgIH0KICAgaGlnaGVzdFNmYiA9IGhpZ2hlc3RTZmIgPiAwID8gaGlnaGVzdFNmYiA6IDA7Ci0gICptYXhTZmJQZXJHcm91cCA9IGhpZ2hlc3RTZmIrMTsKKyAgKm1heFNmYlBlckdyb3VwID0gaGlnaGVzdFNmYiArIDE7CiAKICAgLyogY2FsY3VsYXRlIGdyb3VwZWRTZmJPZmZzZXQgKi8KICAgaSA9IDA7CiAgIG9mZnNldCA9IDA7Ci0gIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspCi0gIHsKLSAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlKzE7IHNmYisrKQotICAgICAgewotICAgICAgICAgIGdyb3VwZWRTZmJPZmZzZXRbaSsrXSA9IG9mZnNldCArIHNmYk9mZnNldFtzZmJdICogZ3JvdXBMZW5bZ3JwXTsKLSAgICAgIH0KLSAgICAgIGkgKz0gIHNmYkNudC1zZmI7Ci0gICAgICBvZmZzZXQgKz0gZ3JvdXBMZW5bZ3JwXSAqIGdyYW51bGVMZW5ndGhfc2hvcnQ7CisgIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspIHsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZSArIDE7IHNmYisrKSB7CisgICAgICBncm91cGVkU2ZiT2Zmc2V0W2krK10gPSBvZmZzZXQgKyBzZmJPZmZzZXRbc2ZiXSAqIGdyb3VwTGVuW2dycF07CisgICAgfQorICAgIGkgKz0gc2ZiQ250IC0gc2ZiOworICAgIG9mZnNldCArPSBncm91cExlbltncnBdICogZ3JhbnVsZUxlbmd0aF9zaG9ydDsKICAgfQogICBncm91cGVkU2ZiT2Zmc2V0W2krK10gPSBncmFudWxlTGVuZ3RoOwogCiAgIC8qIGNhbGN1bGF0ZSBncm91cGVkU2ZiTWluU25yICovCiAgIGkgPSAwOwotICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKQotICB7Ci0gICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKQotICAgIHsKKyAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykgewogICAgICAgZ3JvdXBlZFNmYk1pblNuckxkRGF0YVtpKytdID0gc2ZiTWluU25yTGREYXRhW3NmYl07CiAgICAgfQotICAgIGkgKz0gIHNmYkNudC1zZmI7CisgICAgaSArPSBzZmJDbnQgLSBzZmI7CiAgIH0KIAogICAvKiBzdW0gdXAgc2ZiVGhyZXNob2xkcyAqLwogICB3bmQgPSAwOwogICBpID0gMDsKLSAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykKLSAgewotICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykKLSAgICB7CisgIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspIHsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspIHsKICAgICAgIEZJWFBfREJMIHRocmVzaCA9IHNmYlRocmVzaG9sZC0+U2hvcnRbd25kXVtzZmJdOwotICAgICAgZm9yIChqPTE7IGo8Z3JvdXBMZW5bZ3JwXTsgaisrKQotICAgICAgewotICAgICAgICB0aHJlc2ggPSBucmdBZGRTYXR1cmF0ZSh0aHJlc2gsIHNmYlRocmVzaG9sZC0+U2hvcnRbd25kK2pdW3NmYl0pOworICAgICAgZm9yIChqID0gMTsgaiA8IGdyb3VwTGVuW2dycF07IGorKykgeworICAgICAgICB0aHJlc2ggPSBucmdBZGRTYXR1cmF0ZSh0aHJlc2gsIHNmYlRocmVzaG9sZC0+U2hvcnRbd25kICsgal1bc2ZiXSk7CiAgICAgICB9CiAgICAgICBzZmJUaHJlc2hvbGQtPkxvbmdbaSsrXSA9IHRocmVzaDsKICAgICB9Ci0gICAgaSArPSAgc2ZiQ250LXNmYjsKKyAgICBpICs9IHNmYkNudCAtIHNmYjsKICAgICB3bmQgKz0gZ3JvdXBMZW5bZ3JwXTsKICAgfQogCiAgIC8qIHN1bSB1cCBzZmJFbmVyZ2llcyBsZWZ0L3JpZ2h0ICovCiAgIHduZCA9IDA7CiAgIGkgPSAwOwotICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKQotICB7Ci0gICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKQotICAgIHsKKyAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykgewogICAgICAgRklYUF9EQkwgZW5lcmd5ID0gc2ZiRW5lcmd5LT5TaG9ydFt3bmRdW3NmYl07Ci0gICAgICBmb3IgKGo9MTsgajxncm91cExlbltncnBdOyBqKyspCi0gICAgICB7Ci0gICAgICAgIGVuZXJneSA9IG5yZ0FkZFNhdHVyYXRlKGVuZXJneSwgc2ZiRW5lcmd5LT5TaG9ydFt3bmQral1bc2ZiXSk7CisgICAgICBmb3IgKGogPSAxOyBqIDwgZ3JvdXBMZW5bZ3JwXTsgaisrKSB7CisgICAgICAgIGVuZXJneSA9IG5yZ0FkZFNhdHVyYXRlKGVuZXJneSwgc2ZiRW5lcmd5LT5TaG9ydFt3bmQgKyBqXVtzZmJdKTsKICAgICAgIH0KICAgICAgIHNmYkVuZXJneS0+TG9uZ1tpKytdID0gZW5lcmd5OwogICAgIH0KLSAgICBpICs9ICBzZmJDbnQtc2ZiOworICAgIGkgKz0gc2ZiQ250IC0gc2ZiOwogICAgIHduZCArPSBncm91cExlbltncnBdOwogICB9CiAKICAgLyogc3VtIHVwIHNmYkVuZXJnaWVzIG1pZC9zaWRlICovCiAgIHduZCA9IDA7CiAgIGkgPSAwOwotICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKQotICB7Ci0gICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKQotICAgIHsKKyAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykgewogICAgICAgRklYUF9EQkwgZW5lcmd5ID0gc2ZiRW5lcmd5TVMtPlNob3J0W3duZF1bc2ZiXTsKLSAgICAgIGZvciAoaj0xOyBqPGdyb3VwTGVuW2dycF07IGorKykKLSAgICAgIHsKLSAgICAgICAgZW5lcmd5ID0gbnJnQWRkU2F0dXJhdGUoZW5lcmd5LCBzZmJFbmVyZ3lNUy0+U2hvcnRbd25kK2pdW3NmYl0pOworICAgICAgZm9yIChqID0gMTsgaiA8IGdyb3VwTGVuW2dycF07IGorKykgeworICAgICAgICBlbmVyZ3kgPSBucmdBZGRTYXR1cmF0ZShlbmVyZ3ksIHNmYkVuZXJneU1TLT5TaG9ydFt3bmQgKyBqXVtzZmJdKTsKICAgICAgIH0KICAgICAgIHNmYkVuZXJneU1TLT5Mb25nW2krK10gPSBlbmVyZ3k7CiAgICAgfQotICAgIGkgKz0gIHNmYkNudC1zZmI7CisgICAgaSArPSBzZmJDbnQgLSBzZmI7CiAgICAgd25kICs9IGdyb3VwTGVuW2dycF07CiAgIH0KIAogICAvKiBzdW0gdXAgc2ZiU3ByZWFkRW5lcmdpZXMgKi8KICAgd25kID0gMDsKICAgaSA9IDA7Ci0gIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspCi0gIHsKLSAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspCi0gICAgeworICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKSB7CiAgICAgICBGSVhQX0RCTCBlbmVyZ3kgPSBzZmJTcHJlYWRFbmVyZ3ktPlNob3J0W3duZF1bc2ZiXTsKLSAgICAgIGZvciAoaj0xOyBqPGdyb3VwTGVuW2dycF07IGorKykKLSAgICAgIHsKLSAgICAgICAgIGVuZXJneSA9IG5yZ0FkZFNhdHVyYXRlKGVuZXJneSwgc2ZiU3ByZWFkRW5lcmd5LT5TaG9ydFt3bmQral1bc2ZiXSk7CisgICAgICBmb3IgKGogPSAxOyBqIDwgZ3JvdXBMZW5bZ3JwXTsgaisrKSB7CisgICAgICAgIGVuZXJneSA9IG5yZ0FkZFNhdHVyYXRlKGVuZXJneSwgc2ZiU3ByZWFkRW5lcmd5LT5TaG9ydFt3bmQgKyBqXVtzZmJdKTsKICAgICAgIH0KICAgICAgIHNmYlNwcmVhZEVuZXJneS0+TG9uZ1tpKytdID0gZW5lcmd5OwogICAgIH0KLSAgICBpICs9ICBzZmJDbnQtc2ZiOworICAgIGkgKz0gc2ZiQ250IC0gc2ZiOwogICAgIHduZCArPSBncm91cExlbltncnBdOwogICB9CiAKICAgLyogcmUtZ3JvdXAgc3BlY3RydW0gKi8KICAgd25kID0gMDsKICAgaSA9IDA7Ci0gIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspCi0gIHsKLSAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspCi0gICAgewotICAgICAgaW50IHdpZHRoID0gc2ZiT2Zmc2V0W3NmYisxXS1zZmJPZmZzZXRbc2ZiXTsKLSAgICAgIEZJWFBfREJMICpwTWRjdFNwZWN0cnVtID0gJm1kY3RTcGVjdHJ1bVtzZmJPZmZzZXRbc2ZiXV0gKyB3bmQqZ3JhbnVsZUxlbmd0aF9zaG9ydDsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBncm91cExlbltncnBdOyBqKyspCi0gICAgICB7CisgIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspIHsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkFjdGl2ZTsgc2ZiKyspIHsKKyAgICAgIGludCB3aWR0aCA9IHNmYk9mZnNldFtzZmIgKyAxXSAtIHNmYk9mZnNldFtzZmJdOworICAgICAgRklYUF9EQkwgKnBNZGN0U3BlY3RydW0gPQorICAgICAgICAgICZtZGN0U3BlY3RydW1bc2ZiT2Zmc2V0W3NmYl1dICsgd25kICogZ3JhbnVsZUxlbmd0aF9zaG9ydDsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBncm91cExlbltncnBdOyBqKyspIHsKICAgICAgICAgRklYUF9EQkwgKnBUbXAgPSBwTWRjdFNwZWN0cnVtOwotICAgICAgICBmb3IgKGxpbmUgPSB3aWR0aDsgbGluZSA+IDA7IGxpbmUtLSkKLSAgICAgICAgeworICAgICAgICBmb3IgKGxpbmUgPSB3aWR0aDsgbGluZSA+IDA7IGxpbmUtLSkgewogICAgICAgICAgIHRtcFNwZWN0cnVtW2krK10gPSAqcFRtcCsrOwogICAgICAgICB9CiAgICAgICAgIHBNZGN0U3BlY3RydW0gKz0gZ3JhbnVsZUxlbmd0aF9zaG9ydDsKICAgICAgIH0KICAgICB9Ci0gICAgaSArPSAgKGdyb3VwTGVuW2dycF0qKHNmYk9mZnNldFtzZmJDbnRdLXNmYk9mZnNldFtzZmJdKSk7CisgICAgaSArPSAoZ3JvdXBMZW5bZ3JwXSAqIChzZmJPZmZzZXRbc2ZiQ250XSAtIHNmYk9mZnNldFtzZmJdKSk7CiAgICAgd25kICs9IGdyb3VwTGVuW2dycF07CiAgIH0KIAotICBGREttZW1jcHkobWRjdFNwZWN0cnVtLCB0bXBTcGVjdHJ1bSwgZ3JhbnVsZUxlbmd0aCpzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY3B5KG1kY3RTcGVjdHJ1bSwgdG1wU3BlY3RydW0sIGdyYW51bGVMZW5ndGggKiBzaXplb2YoRklYUF9EQkwpKTsKIAogICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHRtcFNwZWN0cnVtLCBGSVhQX0RCTCwgKDEwMjQpKQogfQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9ncnBfZGF0YS5oIGIvbGliQUFDZW5jL3NyYy9ncnBfZGF0YS5oCmluZGV4IGYwNjE4NTUuLjNlMWE3MDggMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvZ3JwX2RhdGEuaAorKysgYi9saWJBQUNlbmMvc3JjL2dycF9kYXRhLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMzcgKzkwLDM0IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogU2hvcnQgYmxvY2sgZ3JvdXBpbmcKKyAgIEF1dGhvcihzKTogICBNLldlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fR1JQX0RBVEFfSF9fCi0jZGVmaW5lIF9fR1JQX0RBVEFfSF9fCisgICBEZXNjcmlwdGlvbjogU2hvcnQgYmxvY2sgZ3JvdXBpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBHUlBfREFUQV9ICisjZGVmaW5lIEdSUF9EQVRBX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAogI2luY2x1ZGUgInBzeV9kYXRhLmgiCiAKLQotdm9pZAotRkRLYWFjRW5jX2dyb3VwU2hvcnREYXRhKEZJWFBfREJMICAgICAgKm1kY3RTcGVjdHJ1bSwgICAgICAgICAvKiBpbi1vdXQgKi8KLSAgICAgICAgICAgICAgIFNGQl9USFJFU0hPTEQgKnNmYlRocmVzaG9sZCwgICAgICAgICAvKiBpbi1vdXQgKi8KLSAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgKnNmYkVuZXJneSwgICAgICAgICAgICAvKiBpbi1vdXQgKi8KLSAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgKnNmYkVuZXJneU1TLCAgICAgICAgICAvKiBpbi1vdXQgKi8KLSAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgKnNmYlNwcmVhZEVuZXJneSwKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgIHNmYkNudCwKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgIHNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpzZmJNaW5TbnJMZERhdGEsCi0gICAgICAgICAgICAgICBJTlQgICAgICAgICAgICpncm91cGVkU2ZiT2Zmc2V0LCAgICAgLyogb3V0ICovCi0gICAgICAgICAgICAgICBJTlQgICAgICAgICAgICptYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKmdyb3VwZWRTZmJNaW5TbnJMZERhdGEsCi0gICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICBub09mR3JvdXBzLAotICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAqZ3JvdXBMZW4sCi0gICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICBncmFudWxlTGVuZ3RoKTsKK3ZvaWQgRkRLYWFjRW5jX2dyb3VwU2hvcnREYXRhKEZJWFBfREJMICptZGN0U3BlY3RydW0sICAgICAgLyogaW4tb3V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRkJfVEhSRVNIT0xEICpzZmJUaHJlc2hvbGQsIC8qIGluLW91dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAqc2ZiRW5lcmd5LCAgICAgICAvKiBpbi1vdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgKnNmYkVuZXJneU1TLCAgICAgLyogaW4tb3V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRkJfRU5FUkdZICpzZmJTcHJlYWRFbmVyZ3ksIGNvbnN0IElOVCBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2ZiQWN0aXZlLCBjb25zdCBJTlQgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpzZmJNaW5TbnJMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmdyb3VwZWRTZmJPZmZzZXQsIC8qIG91dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICptYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpncm91cGVkU2ZiTWluU25yTGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5vT2ZHcm91cHMsIGNvbnN0IElOVCAqZ3JvdXBMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZ3JhbnVsZUxlbmd0aCk7CiAKICNlbmRpZiAvKiBfSU5URVJGQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvaW50ZW5zaXR5LmNwcCBiL2xpYkFBQ2VuYy9zcmMvaW50ZW5zaXR5LmNwcAppbmRleCBiNDViMjdiLi5hMTYwYTRmIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2ludGVuc2l0eS5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9pbnRlbnNpdHkuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDgyICs5MCw5NCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBBLiBIb3JuZGFzY2ggKGNvZGUgb3JpZ2luYWxseSBmcm9tIGx3cikgLyBKb3NlZiBIb2VwZmwgKEZESykKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBpbnRlbnNpdHkgc3RlcmVvIHByb2Nlc3NpbmcKKyAgIEF1dGhvcihzKTogICBBLiBIb3JuZGFzY2ggKGNvZGUgb3JpZ2luYWxseSBmcm9tIGx3cikgLyBKb3NlZiBIb2VwZmwgKEZESykKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IGludGVuc2l0eSBzdGVyZW8gcHJvY2Vzc2luZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiaW50ZW5zaXR5LmgiCisKICNpbmNsdWRlICJpbnRlcmZhY2UuaCIKICNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgInBzeV9jb25zdC5oIgogI2luY2x1ZGUgInFjX21haW4uaCIKICNpbmNsdWRlICJiaXRfY250LmgiCiAKLS8qIG9ubHkgc2V0IGFuIElTIHNlZWQgaXQgbGVmdC9yaWdodCBjaGFubmVsIGNvcnJlbGF0aW9uIGlzIGFib3ZlIElTX0NPUlJfVEhSRVNIICovCi0jZGVmaW5lIElTX0NPUlJfVEhSRVNIICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuOTVmKQorLyogb25seSBzZXQgYW4gSVMgc2VlZCBpdCBsZWZ0L3JpZ2h0IGNoYW5uZWwgY29ycmVsYXRpb24gaXMgYWJvdmUgSVNfQ09SUl9USFJFU0gKKyAqLworI2RlZmluZSBJU19DT1JSX1RIUkVTSCBGTDJGWENPTlNUX0RCTCgwLjk1ZikKIAogLyogd2hlbiBleHBhbmRpbmcgdGhlIElTIHJlZ2lvbiB0byBtb3JlIFNGQnMgb25seSBhY2NlcHQgYW4gZXJyb3IgdGhhdCBpcwogICogbm90IG1vcmUgdGhhbiBJU19UT1RBTF9FUlJPUl9USFJFU0ggb3ZlcmFsbCBhbmQKICAqIG5vdCBtb3JlIHRoYW4gSVNfTE9DQUxfRVJST1JfVEhSRVNIIGZvciB0aGUgY3VycmVudCBTRkIgKi8KLSNkZWZpbmUgSVNfVE9UQUxfRVJST1JfVEhSRVNIICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4wNGYpCi0jZGVmaW5lIElTX0xPQ0FMX0VSUk9SX1RIUkVTSCAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMDFmKQorI2RlZmluZSBJU19UT1RBTF9FUlJPUl9USFJFU0ggRkwyRlhDT05TVF9EQkwoMC4wNGYpCisjZGVmaW5lIElTX0xPQ0FMX0VSUk9SX1RIUkVTSCBGTDJGWENPTlNUX0RCTCgwLjAxZikKIAotLyogdGhlIG1heGltdW0gYWxsb3dlZCBjaGFuZ2Ugb2YgdGhlIGludGVuc2l0eSBkaXJlY3Rpb24gKHVuaXQ6IElTIHNjYWxlKSAtIHNjYWxlZCB3aXRoIGZhY3RvciAwLjI1IC0gKi8KKy8qIHRoZSBtYXhpbXVtIGFsbG93ZWQgY2hhbmdlIG9mIHRoZSBpbnRlbnNpdHkgZGlyZWN0aW9uICh1bml0OiBJUyBzY2FsZSkgLQorICogc2NhbGVkIHdpdGggZmFjdG9yIDAuMjUgLSAqLwogI2RlZmluZSBJU19ESVJFQ1RJT05fREVWSUFUSU9OX1RIUkVTSF9TRiAyCi0jZGVmaW5lIElTX0RJUkVDVElPTl9ERVZJQVRJT05fVEhSRVNIIEZMMkZYQ09OU1RfREJMKDIuMGYvKDE8PElTX0RJUkVDVElPTl9ERVZJQVRJT05fVEhSRVNIX1NGKSkKKyNkZWZpbmUgSVNfRElSRUNUSU9OX0RFVklBVElPTl9USFJFU0ggXAorICBGTDJGWENPTlNUX0RCTCgyLjBmIC8gKDEgPDwgSVNfRElSRUNUSU9OX0RFVklBVElPTl9USFJFU0hfU0YpKQogCi0vKiBJUyByZWdpb25zIG5lZWQgdG8gaGF2ZSBhIG1pbmltYWwgcGVyY2VudGFnZSBvZiB0aGUgb3ZlcmFsbCBsb3VkbmVzcywgZS5nLiAwLjA2ID09IDYlICovCi0jZGVmaW5lIElTX1JFR0lPTl9NSU5fTE9VRE5FU1MgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMWYpCisvKiBJUyByZWdpb25zIG5lZWQgdG8gaGF2ZSBhIG1pbmltYWwgcGVyY2VudGFnZSBvZiB0aGUgb3ZlcmFsbCBsb3VkbmVzcywgZS5nLgorICogMC4wNiA9PSA2JSAqLworI2RlZmluZSBJU19SRUdJT05fTUlOX0xPVURORVNTIEZMMkZYQ09OU1RfREJMKDAuMWYpCiAKIC8qIG9ubHkgcGVyZm9ybSBJUyBpZiBJU19NSU5fU0ZCUyBuZWlnaGJvcmluZyBTRkJzIGNhbiBiZSBwcm9jZXNzZWQgKi8KLSNkZWZpbmUgSVNfTUlOX1NGQlMgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBJU19NSU5fU0ZCUyA2CiAKIC8qIG9ubHkgZG8gSVMgaWYKLSAqIGlmIElTX0xFRlRfUklHSFRfUkFUSU9fVEhSRVNIIDwgc2ZiRW5lcmd5TGVmdFtzZmJdL3NmYkVuZXJneVJpZ2h0W3NmYl0gPCAxIC8gSVNfTEVGVF9SSUdIVF9SQVRJT19USFJFU0gKKyAqIGlmIElTX0xFRlRfUklHSFRfUkFUSU9fVEhSRVNIIDwgc2ZiRW5lcmd5TGVmdFtzZmJdL3NmYkVuZXJneVJpZ2h0W3NmYl0gPCAxIC8KKyAqIElTX0xFRlRfUklHSFRfUkFUSU9fVEhSRVNICiAgKiAtPiBubyBJUyBpZiB0aGUgcGFubmluZyBhbmdsZSBpcyBub3QgZmFyIGZyb20gdGhlIG1pZGRsZSwgTVMgd2lsbCBkbyAqLwogLyogdGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgc2NhbGUgb2YgKy8tMS4wMjkxNDYzNDU2NiAqLwotI2RlZmluZSBJU19MRUZUX1JJR0hUX1JBVElPX1RIUkVTSCAgICBGTDJGWENPTlNUX0RCTCgwLjdmKQorI2RlZmluZSBJU19MRUZUX1JJR0hUX1JBVElPX1RIUkVTSCBGTDJGWENPTlNUX0RCTCgwLjdmKQogCiAvKiBzY2FsZWZhY3RvciBvZiByZWFsU2NhbGUgKi8KLSNkZWZpbmUgUkVBTF9TQ0FMRV9TRiAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSRUFMX1NDQUxFX1NGIDEKIAogLyogc2NhbGVmYWN0b3Igb3ZlcmFsbExvdWRuZXNzICovCi0jZGVmaW5lIE9WRVJBTExfTE9VRE5FU1NfU0YgICAgICAgICAgICAgIDYKKyNkZWZpbmUgT1ZFUkFMTF9MT1VETkVTU19TRiA2CiAKIC8qIHNjYWxlZmFjdG9yIGZvciBzdW0gb3ZlciBtYXggc2FtcGxlcyBwZXIgZ291cCAqLwotI2RlZmluZSBNQVhfU0ZCX1BFUl9HUk9VUF9TRiAgICAgICAgICAgICA2CisjZGVmaW5lIE1BWF9TRkJfUEVSX0dST1VQX1NGIDYKIAogLyogc2NhbGVmYWN0b3IgZm9yIHN1bSBvZiBtZGN0IHNwZWN0cnVtICovCi0jZGVmaW5lIE1EQ1RfU1BFQ19TRiAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgTURDVF9TUEVDX1NGIDYKIAordHlwZWRlZiBzdHJ1Y3QgeworICBGSVhQX0RCTCBjb3JyX3RocmVzaDsgLyohPCBPbmx5IHNldCBhbiBJUyBzZWVkIGl0IGxlZnQvcmlnaHQgY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gaXMgYWJvdmUgY29ycl90aHJlc2ggKi8KIAotdHlwZWRlZiBzdHJ1Y3QKLXsKKyAgRklYUF9EQkwgdG90YWxfZXJyb3JfdGhyZXNoOyAvKiE8IFdoZW4gZXhwYW5kaW5nIHRoZSBJUyByZWdpb24gdG8gbW9yZSBTRkJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seSBhY2NlcHQgYW4gZXJyb3IgdGhhdCBpcyBub3QgbW9yZSB0aGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RvdGFsX2Vycm9yX3RocmVzaCcgb3ZlcmFsbC4gKi8KIAotICBGSVhQX0RCTCBjb3JyX3RocmVzaDsgICAgICAgICAgICAgICAgIC8qITwgT25seSBzZXQgYW4gSVMgc2VlZCBpdCBsZWZ0L3JpZ2h0IGNoYW5uZWwgY29ycmVsYXRpb24gaXMgYWJvdmUgY29ycl90aHJlc2ggKi8KKyAgRklYUF9EQkwgbG9jYWxfZXJyb3JfdGhyZXNoOyAvKiE8IFdoZW4gZXhwYW5kaW5nIHRoZSBJUyByZWdpb24gdG8gbW9yZSBTRkJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seSBhY2NlcHQgYW4gZXJyb3IgdGhhdCBpcyBub3QgbW9yZSB0aGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvY2FsX2Vycm9yX3RocmVzaCcgZm9yIHRoZSBjdXJyZW50IFNGQi4gKi8KIAotICBGSVhQX0RCTCB0b3RhbF9lcnJvcl90aHJlc2g7ICAgICAgICAgIC8qITwgV2hlbiBleHBhbmRpbmcgdGhlIElTIHJlZ2lvbiB0byBtb3JlIFNGQnMgb25seSBhY2NlcHQgYW4gZXJyb3IgdGhhdCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IG1vcmUgdGhhbiAndG90YWxfZXJyb3JfdGhyZXNoJyBvdmVyYWxsLiAqLworICBGSVhQX0RCTCBkaXJlY3Rpb25fZGV2aWF0aW9uX3RocmVzaDsgLyohPCBUaGUgbWF4aW11bSBhbGxvd2VkIGNoYW5nZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVuc2l0eSBkaXJlY3Rpb24gKHVuaXQ6IElTIHNjYWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLSAgRklYUF9EQkwgbG9jYWxfZXJyb3JfdGhyZXNoOyAgICAgICAgICAvKiE8IFdoZW4gZXhwYW5kaW5nIHRoZSBJUyByZWdpb24gdG8gbW9yZSBTRkJzIG9ubHkgYWNjZXB0IGFuIGVycm9yIHRoYXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBtb3JlIHRoYW4gJ2xvY2FsX2Vycm9yX3RocmVzaCcgZm9yIHRoZSBjdXJyZW50IFNGQi4gKi8KKyAgRklYUF9EQkwgaXNfcmVnaW9uX21pbl9sb3VkbmVzczsgLyohPCBJUyByZWdpb25zIG5lZWQgdG8gaGF2ZSBhIG1pbmltYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZSBvZiB0aGUgb3ZlcmFsbCBsb3VkbmVzcywgZS5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA2ID09IDYlICovCiAKLSAgRklYUF9EQkwgZGlyZWN0aW9uX2RldmlhdGlvbl90aHJlc2g7ICAvKiE8IFRoZSBtYXhpbXVtIGFsbG93ZWQgY2hhbmdlIG9mIHRoZSBpbnRlbnNpdHkgZGlyZWN0aW9uICh1bml0OiBJUyBzY2FsZSkgKi8KKyAgSU5UIG1pbl9pc19zZmJzOyAvKiE8IE9ubHkgcGVyZm9ybSBJUyBpZiAnbWluX2lzX3NmYnMnIG5laWdoYm9yaW5nIFNGQnMgY2FuIGJlCisgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkICovCiAKLSAgRklYUF9EQkwgaXNfcmVnaW9uX21pbl9sb3VkbmVzczsgICAgICAvKiE8IElTIHJlZ2lvbnMgbmVlZCB0byBoYXZlIGEgbWluaW1hbCBwZXJjZW50YWdlIG9mIHRoZSBvdmVyYWxsIGxvdWRuZXNzLCBlLmcuIDAuMDYgPT0gNiUgKi8KLQotICBJTlQgICAgICBtaW5faXNfc2ZiczsgICAgICAgICAgICAgICAgIC8qITwgT25seSBwZXJmb3JtIElTIGlmICdtaW5faXNfc2ZicycgbmVpZ2hib3JpbmcgU0ZCcyBjYW4gYmUgcHJvY2Vzc2VkICovCi0KLSAgRklYUF9EQkwgbGVmdF9yaWdodF9yYXRpb190aHJlc2hvbGQ7ICAvKiE8IE5vIElTIGlmIHRoZSBwYW5uaW5nIGFuZ2xlIGlzIG5vdCBmYXIgZnJvbSB0aGUgbWlkZGxlLCBNUyB3aWxsIGRvICovCisgIEZJWFBfREJMIGxlZnRfcmlnaHRfcmF0aW9fdGhyZXNob2xkOyAvKiE8IE5vIElTIGlmIHRoZSBwYW5uaW5nIGFuZ2xlIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFyIGZyb20gdGhlIG1pZGRsZSwgTVMgd2lsbCBkbyAqLwogCiB9IElOVEVOU0lUWV9QQVJBTUVURVJTOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBjYWxjU2ZiTWF4U2NhbGUKQEAgLTE3MCwyNSArMTkzLDIyIEBACiAgICAgcmV0dXJuczogICAgICBzY2FsZWZhY3RvcgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQKLWNhbGNTZmJNYXhTY2FsZShjb25zdCBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBsMSwKLSAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbDIpCi17CitzdGF0aWMgSU5UIGNhbGNTZmJNYXhTY2FsZShjb25zdCBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLCBjb25zdCBJTlQgbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbDIpIHsKICAgSU5UIGk7CiAgIElOVCBzZmJNYXhTY2FsZTsKICAgRklYUF9EQkwgbWF4U3BjOwogCiAgIG1heFNwYyA9IEZMMkZYQ09OU1RfREJMKDAuMCk7Ci0gIGZvciAoaT1sMTsgaTxsMjsgaSsrKSB7CisgIGZvciAoaSA9IGwxOyBpIDwgbDI7IGkrKykgewogICAgIEZJWFBfREJMIHRtcCA9IGZpeHBfYWJzKChGSVhQX0RCTCltZGN0U3BlY3RydW1baV0pOwogICAgIG1heFNwYyA9IGZpeE1heChtYXhTcGMsIHRtcCk7CiAgIH0KLSAgc2ZiTWF4U2NhbGUgPSAobWF4U3BjPT1GTDJGWENPTlNUX0RCTCgwLjApKSA/IChERlJBQ1RfQklUUy0yKSA6IENudExlYWRpbmdaZXJvcyhtYXhTcGMpLTE7CisgIHNmYk1heFNjYWxlID0gKG1heFNwYyA9PSBGTDJGWENPTlNUX0RCTCgwLjApKSA/IChERlJBQ1RfQklUUyAtIDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENudExlYWRpbmdaZXJvcyhtYXhTcGMpIC0gMTsKIAogICByZXR1cm4gc2ZiTWF4U2NhbGU7Ci0gfQotCit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCkBAIC0yMDMsMTkgKzIyMywxNiBAQAogICAgIHJldHVybnM6ICAgICAgbm9uZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1GREthYWNFbmNfaW5pdElzUGFyYW1zKElOVEVOU0lUWV9QQVJBTUVURVJTICppc1BhcmFtcykKLXsKLSAgaXNQYXJhbXMtPmNvcnJfdGhyZXNoICAgICAgICAgICAgICAgID0gSVNfQ09SUl9USFJFU0g7Ci0gIGlzUGFyYW1zLT50b3RhbF9lcnJvcl90aHJlc2ggICAgICAgICA9IElTX1RPVEFMX0VSUk9SX1RIUkVTSDsKLSAgaXNQYXJhbXMtPmxvY2FsX2Vycm9yX3RocmVzaCAgICAgICAgID0gSVNfTE9DQUxfRVJST1JfVEhSRVNIOworc3RhdGljIHZvaWQgRkRLYWFjRW5jX2luaXRJc1BhcmFtcyhJTlRFTlNJVFlfUEFSQU1FVEVSUyAqaXNQYXJhbXMpIHsKKyAgaXNQYXJhbXMtPmNvcnJfdGhyZXNoID0gSVNfQ09SUl9USFJFU0g7CisgIGlzUGFyYW1zLT50b3RhbF9lcnJvcl90aHJlc2ggPSBJU19UT1RBTF9FUlJPUl9USFJFU0g7CisgIGlzUGFyYW1zLT5sb2NhbF9lcnJvcl90aHJlc2ggPSBJU19MT0NBTF9FUlJPUl9USFJFU0g7CiAgIGlzUGFyYW1zLT5kaXJlY3Rpb25fZGV2aWF0aW9uX3RocmVzaCA9IElTX0RJUkVDVElPTl9ERVZJQVRJT05fVEhSRVNIOwotICBpc1BhcmFtcy0+aXNfcmVnaW9uX21pbl9sb3VkbmVzcyAgICAgPSBJU19SRUdJT05fTUlOX0xPVURORVNTOwotICBpc1BhcmFtcy0+bWluX2lzX3NmYnMgICAgICAgICAgICAgICAgPSBJU19NSU5fU0ZCUzsKKyAgaXNQYXJhbXMtPmlzX3JlZ2lvbl9taW5fbG91ZG5lc3MgPSBJU19SRUdJT05fTUlOX0xPVURORVNTOworICBpc1BhcmFtcy0+bWluX2lzX3NmYnMgPSBJU19NSU5fU0ZCUzsKICAgaXNQYXJhbXMtPmxlZnRfcmlnaHRfcmF0aW9fdGhyZXNob2xkID0gSVNfTEVGVF9SSUdIVF9SQVRJT19USFJFU0g7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19wcmVwYXJlSW50ZW5zaXR5RGVjaXNpb24KQEAgLTIzOCwyNCArMjU1LDE0IEBACiAgICAgcmV0dXJuczogICAgICBub25lCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLUZES2FhY0VuY19wcmVwYXJlSW50ZW5zaXR5RGVjaXNpb24oY29uc3QgRklYUF9EQkwgICAgKnNmYkVuZXJneUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAgICpzZmJFbmVyZ3lSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICAgKnNmYkVuZXJneUxkRGF0YUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAgICpzZmJFbmVyZ3lMZERhdGFSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICAgKm1kY3RTcGVjdHJ1bUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAgICptZGN0U3BlY3RydW1SaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5URU5TSVRZX1BBUkFNRVRFUlMgKmlzUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqaHJyRXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqaXNNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqcmVhbFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqbm9ybVNmYkxvdWRuZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgKnNmYk9mZnNldCkKLXsKLSAgSU5UIGosc2ZiLHNmYm9mZnM7CitzdGF0aWMgdm9pZCBGREthYWNFbmNfcHJlcGFyZUludGVuc2l0eURlY2lzaW9uKAorICAgIGNvbnN0IEZJWFBfREJMICpzZmJFbmVyZ3lMZWZ0LCBjb25zdCBGSVhQX0RCTCAqc2ZiRW5lcmd5UmlnaHQsCisgICAgY29uc3QgRklYUF9EQkwgKnNmYkVuZXJneUxkRGF0YUxlZnQsIGNvbnN0IEZJWFBfREJMICpzZmJFbmVyZ3lMZERhdGFSaWdodCwKKyAgICBjb25zdCBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtTGVmdCwgY29uc3QgRklYUF9EQkwgKm1kY3RTcGVjdHJ1bVJpZ2h0LAorICAgIGNvbnN0IElOVEVOU0lUWV9QQVJBTUVURVJTICppc1BhcmFtcywgRklYUF9EQkwgKmhyckVyciwgSU5UICppc01hc2ssCisgICAgRklYUF9EQkwgKnJlYWxTY2FsZSwgRklYUF9EQkwgKm5vcm1TZmJMb3VkbmVzcywgY29uc3QgSU5UIHNmYkNudCwKKyAgICBjb25zdCBJTlQgc2ZiUGVyR3JvdXAsIGNvbnN0IElOVCBtYXhTZmJQZXJHcm91cCwgY29uc3QgSU5UICpzZmJPZmZzZXQpIHsKKyAgSU5UIGosIHNmYiwgc2Zib2ZmczsKICAgSU5UIGdycENvdW50ZXI7CiAKICAgLyogdGVtcG9yYXJ5IHZhcmlhYmxlcyB0byBjb21wdXRlIGxvdWRuZXNzICovCkBAIC0yNjksMTQ5ICsyNzYsMTkyIEBACiAgIEZJWFBfREJMIHRtcF9sLCB0bXBfcjsKICAgRklYUF9EQkwgaW52X247CiAKLSAgRkRLbWVtY2xlYXIoY2hhbm5lbENvcnIsICAgICBNQVhfR1JPVVBFRF9TRkIqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gIEZES21lbWNsZWFyKG5vcm1TZmJMb3VkbmVzcywgTUFYX0dST1VQRURfU0ZCKnNpemVvZihGSVhQX0RCTCkpOwotICBGREttZW1jbGVhcihvdmVyYWxsTG91ZG5lc3MsIE1BWF9OT19PRl9HUk9VUFMqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gIEZES21lbWNsZWFyKHJlYWxTY2FsZSwgICAgICAgTUFYX0dST1VQRURfU0ZCKnNpemVvZihGSVhQX0RCTCkpOworICBGREttZW1jbGVhcihjaGFubmVsQ29yciwgTUFYX0dST1VQRURfU0ZCICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNsZWFyKG5vcm1TZmJMb3VkbmVzcywgTUFYX0dST1VQRURfU0ZCICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNsZWFyKG92ZXJhbGxMb3VkbmVzcywgTUFYX05PX09GX0dST1VQUyAqIHNpemVvZihGSVhQX0RCTCkpOworICBGREttZW1jbGVhcihyZWFsU2NhbGUsIE1BWF9HUk9VUEVEX1NGQiAqIHNpemVvZihGSVhQX0RCTCkpOwogCi0gIGZvciAoZ3JwQ291bnRlciA9IDAsIHNmYm9mZnMgPSAwOyBzZmJvZmZzIDwgc2ZiQ250OyBzZmJvZmZzICs9IHNmYlBlckdyb3VwLCBncnBDb3VudGVyKyspIHsKKyAgZm9yIChncnBDb3VudGVyID0gMCwgc2Zib2ZmcyA9IDA7IHNmYm9mZnMgPCBzZmJDbnQ7CisgICAgICAgc2Zib2ZmcyArPSBzZmJQZXJHcm91cCwgZ3JwQ291bnRlcisrKSB7CiAgICAgb3ZlcmFsbExvdWRuZXNzW2dycENvdW50ZXJdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBtYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgIElOVCBzTCxzUixzOwotICAgICAgRklYUF9EQkwgaXNWYWx1ZSA9IHNmYkVuZXJneUxkRGF0YUxlZnRbc2ZiK3NmYm9mZnNdLXNmYkVuZXJneUxkRGF0YVJpZ2h0W3NmYitzZmJvZmZzXTsKKyAgICAgIElOVCBzTCwgc1IsIHM7CisgICAgICBGSVhQX0RCTCBpc1ZhbHVlID0gc2ZiRW5lcmd5TGREYXRhTGVmdFtzZmIgKyBzZmJvZmZzXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5TGREYXRhUmlnaHRbc2ZiICsgc2Zib2Zmc107CiAKICAgICAgIC8qIGRlbGltaXRhdGUgaW50ZW5zaXR5IHNjYWxlIHZhbHVlIHRvIHJlcHJlc2VudGFibGUgcmFuZ2UgKi8KLSAgICAgIHJlYWxTY2FsZVtzZmIgKyBzZmJvZmZzXSA9IGZpeE1pbihGTDJGWENPTlNUX0RCTCg2MC5mLygxPDwoUkVBTF9TQ0FMRV9TRitMRF9EQVRBX1NISUZUKSkpLCBmaXhNYXgoRkwyRlhDT05TVF9EQkwoLTYwLmYvKDE8PChSRUFMX1NDQUxFX1NGK0xEX0RBVEFfU0hJRlQpKSksIGlzVmFsdWUpKTsKKyAgICAgIHJlYWxTY2FsZVtzZmIgKyBzZmJvZmZzXSA9IGZpeE1pbigKKyAgICAgICAgICBGTDJGWENPTlNUX0RCTCg2MC5mIC8gKDEgPDwgKFJFQUxfU0NBTEVfU0YgKyBMRF9EQVRBX1NISUZUKSkpLAorICAgICAgICAgIGZpeE1heChGTDJGWENPTlNUX0RCTCgtNjAuZiAvICgxIDw8IChSRUFMX1NDQUxFX1NGICsgTERfREFUQV9TSElGVCkpKSwKKyAgICAgICAgICAgICAgICAgaXNWYWx1ZSkpOwogCi0gICAgICBzTCA9IGZpeE1heCgwLChDbnRMZWFkaW5nWmVyb3Moc2ZiRW5lcmd5TGVmdFtzZmIgKyBzZmJvZmZzXSktMSkpOwotICAgICAgc1IgPSBmaXhNYXgoMCwoQ250TGVhZGluZ1plcm9zKHNmYkVuZXJneVJpZ2h0W3NmYiArIHNmYm9mZnNdKS0xKSk7Ci0gICAgICBzICA9IChmaXhNaW4oc0wsc1IpPj4yKTw8MjsKLSAgICAgIG5vcm1TZmJMb3VkbmVzc1tzZmIgKyBzZmJvZmZzXSA9IHNxcnRGaXhwKHNxcnRGaXhwKCgoc2ZiRW5lcmd5TGVmdFtzZmIgKyBzZmJvZmZzXTw8cykgPj4gMSkgKyAoKHNmYkVuZXJneVJpZ2h0W3NmYiArIHNmYm9mZnNdPDxzKSA+PiAxKSkpID4+IChzPj4yKTsKKyAgICAgIHNMID0gZml4TWF4KDAsIChDbnRMZWFkaW5nWmVyb3Moc2ZiRW5lcmd5TGVmdFtzZmIgKyBzZmJvZmZzXSkgLSAxKSk7CisgICAgICBzUiA9IGZpeE1heCgwLCAoQ250TGVhZGluZ1plcm9zKHNmYkVuZXJneVJpZ2h0W3NmYiArIHNmYm9mZnNdKSAtIDEpKTsKKyAgICAgIHMgPSAoZml4TWluKHNMLCBzUikgPj4gMikgPDwgMjsKKyAgICAgIG5vcm1TZmJMb3VkbmVzc1tzZmIgKyBzZmJvZmZzXSA9CisgICAgICAgICAgc3FydEZpeHAoc3FydEZpeHAoKChzZmJFbmVyZ3lMZWZ0W3NmYiArIHNmYm9mZnNdIDw8IHMpID4+IDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNmYkVuZXJneVJpZ2h0W3NmYiArIHNmYm9mZnNdIDw8IHMpID4+IDEpKSkgPj4KKyAgICAgICAgICAocyA+PiAyKTsKIAotICAgICAgb3ZlcmFsbExvdWRuZXNzW2dycENvdW50ZXJdICs9IG5vcm1TZmJMb3VkbmVzc1tzZmIgKyBzZmJvZmZzXSA+PiBPVkVSQUxMX0xPVURORVNTX1NGOworICAgICAgb3ZlcmFsbExvdWRuZXNzW2dycENvdW50ZXJdICs9CisgICAgICAgICAgbm9ybVNmYkxvdWRuZXNzW3NmYiArIHNmYm9mZnNdID4+IE9WRVJBTExfTE9VRE5FU1NfU0Y7CiAgICAgICAvKiBkb24ndCBkbyBpbnRlbnNpdHkgaWYKICAgICAgICAqIC0gcGFubmluZyBhbmdsZSBpcyB0b28gY2xvc2UgdG8gdGhlIG1pZGRsZSBvcgogICAgICAgICogLSBvbmUgY2hhbm5lbCBpcyBub24tZXhpc3RlbnQgb3IKICAgICAgICAqIC0gaWYgaXQgaXMgZHVhbCBtb25vICovCi0gICAgICBpZiggICAoc2ZiRW5lcmd5TGVmdFtzZmIgKyBzZmJvZmZzXSA+PSBmTXVsdChpc1BhcmFtcy0+bGVmdF9yaWdodF9yYXRpb190aHJlc2hvbGQsc2ZiRW5lcmd5UmlnaHRbc2ZiICsgc2Zib2Zmc10pKQotICAgICAgICAgJiYgKGZNdWx0KGlzUGFyYW1zLT5sZWZ0X3JpZ2h0X3JhdGlvX3RocmVzaG9sZCxzZmJFbmVyZ3lMZWZ0W3NmYiArIHNmYm9mZnNdKSA8PSBzZmJFbmVyZ3lSaWdodFtzZmIgKyBzZmJvZmZzXSkgKSB7Ci0KLSAgICAgICAgLyogdGhpcyB3aWxsIHByZXZlbnQgcG9zdCBwcm9jZXNzaW5nIGZyb20gY29uc2lkZXJpbmcgdGhpcyBTRkIgZm9yIG1lcmdpbmcgKi8KLSAgICAgICAgaHJyRXJyW3NmYiArIHNmYm9mZnNdID0gRkwyRlhDT05TVF9EQkwoMS4wLzguMCk7CisgICAgICBpZiAoKHNmYkVuZXJneUxlZnRbc2ZiICsgc2Zib2Zmc10gPj0KKyAgICAgICAgICAgZk11bHQoaXNQYXJhbXMtPmxlZnRfcmlnaHRfcmF0aW9fdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lSaWdodFtzZmIgKyBzZmJvZmZzXSkpICYmCisgICAgICAgICAgKGZNdWx0KGlzUGFyYW1zLT5sZWZ0X3JpZ2h0X3JhdGlvX3RocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5TGVmdFtzZmIgKyBzZmJvZmZzXSkgPD0KKyAgICAgICAgICAgc2ZiRW5lcmd5UmlnaHRbc2ZiICsgc2Zib2Zmc10pKSB7CisgICAgICAgIC8qIHRoaXMgd2lsbCBwcmV2ZW50IHBvc3QgcHJvY2Vzc2luZyBmcm9tIGNvbnNpZGVyaW5nIHRoaXMgU0ZCIGZvcgorICAgICAgICAgKiBtZXJnaW5nICovCisgICAgICAgIGhyckVycltzZmIgKyBzZmJvZmZzXSA9IEZMMkZYQ09OU1RfREJMKDEuMCAvIDguMCk7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgZm9yIChncnBDb3VudGVyID0gMCwgc2Zib2ZmcyA9IDA7IHNmYm9mZnMgPCBzZmJDbnQ7IHNmYm9mZnMgKz0gc2ZiUGVyR3JvdXAsIGdycENvdW50ZXIrKykgeworICBmb3IgKGdycENvdW50ZXIgPSAwLCBzZmJvZmZzID0gMDsgc2Zib2ZmcyA8IHNmYkNudDsKKyAgICAgICBzZmJvZmZzICs9IHNmYlBlckdyb3VwLCBncnBDb3VudGVyKyspIHsKICAgICBJTlQgaW52T3ZlcmFsbExvdWRuZXNzU0Y7CiAgICAgRklYUF9EQkwgaW52T3ZlcmFsbExvdWRuZXNzOwogCiAgICAgaWYgKG92ZXJhbGxMb3VkbmVzc1tncnBDb3VudGVyXSA9PSBGTDJGWENPTlNUX0RCTCgwLjApKSB7CiAgICAgICBpbnZPdmVyYWxsTG91ZG5lc3MgPSBGTDJGWENPTlNUX0RCTCgwLjApOwogICAgICAgaW52T3ZlcmFsbExvdWRuZXNzU0YgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBpbnZPdmVyYWxsTG91ZG5lc3MgPQorICAgICAgICAgIGZEaXZOb3JtKChGSVhQX0RCTClNQVhWQUxfREJMLCBvdmVyYWxsTG91ZG5lc3NbZ3JwQ291bnRlcl0sCisgICAgICAgICAgICAgICAgICAgJmludk92ZXJhbGxMb3VkbmVzc1NGKTsKKyAgICAgIGludk92ZXJhbGxMb3VkbmVzc1NGID0KKyAgICAgICAgICBpbnZPdmVyYWxsTG91ZG5lc3NTRiAtIE9WRVJBTExfTE9VRE5FU1NfU0YgKworICAgICAgICAgIDE7IC8qICsxOiBjb21wZW5zYXRlIGZNdWx0RGl2MigpIGluIHN1YnNlcXVlbnQgbG9vcCAqLwogICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGludk92ZXJhbGxMb3VkbmVzcyA9IGZEaXZOb3JtKChGSVhQX0RCTClNQVhWQUxfREJMLCBvdmVyYWxsTG91ZG5lc3NbZ3JwQ291bnRlcl0sJmludk92ZXJhbGxMb3VkbmVzc1NGKTsKLSAgICAgIGludk92ZXJhbGxMb3VkbmVzc1NGID0gaW52T3ZlcmFsbExvdWRuZXNzU0YgLSBPVkVSQUxMX0xPVURORVNTX1NGICsgMTsgLyogKzE6IGNvbXBlbnNhdGUgZk11bHREaXYyKCkgaW4gc3Vic2VxdWVudCBsb29wICovCi0gICAgfQotICAgIGludk92ZXJhbGxMb3VkbmVzc1NGID0gZml4TWluKGZpeE1heChpbnZPdmVyYWxsTG91ZG5lc3NTRiwtKERGUkFDVF9CSVRTLTEpKSxERlJBQ1RfQklUUy0xKTsKKyAgICBpbnZPdmVyYWxsTG91ZG5lc3NTRiA9IGZpeE1pbigKKyAgICAgICAgZml4TWF4KGludk92ZXJhbGxMb3VkbmVzc1NGLCAtKERGUkFDVF9CSVRTIC0gMSkpLCBERlJBQ1RfQklUUyAtIDEpOwogCiAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBtYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgIEZJWFBfREJMIHRtcDsKIAotICAgICAgdG1wID0gZk11bHREaXYyKChub3JtU2ZiTG91ZG5lc3Nbc2ZiICsgc2Zib2Zmc10+Pk9WRVJBTExfTE9VRE5FU1NfU0YpPDxPVkVSQUxMX0xPVURORVNTX1NGLGludk92ZXJhbGxMb3VkbmVzcyk7CisgICAgICB0bXAgPSBmTXVsdERpdjIoKG5vcm1TZmJMb3VkbmVzc1tzZmIgKyBzZmJvZmZzXSA+PiBPVkVSQUxMX0xPVURORVNTX1NGKQorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBPVkVSQUxMX0xPVURORVNTX1NGLAorICAgICAgICAgICAgICAgICAgICAgIGludk92ZXJhbGxMb3VkbmVzcyk7CiAKICAgICAgIG5vcm1TZmJMb3VkbmVzc1tzZmIgKyBzZmJvZmZzXSA9IHNjYWxlVmFsdWUodG1wLCBpbnZPdmVyYWxsTG91ZG5lc3NTRik7CiAKICAgICAgIGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKICAgICAgIC8qIG1heCB3aWR0aCBvZiBzY2FsZWZhY3RvcmJhbmQgaXMgOTY7IHdpZHRoJ3MgYXJlIGFsd2F5cyBldmVuICovCi0gICAgICAvKiBpbnZfbiBpcyBzY2FsZWQgd2l0aCBmYWN0b3IgMiB0byBjb21wZW5zYXRlIGZNdWx0RGl2MigpIGluIHN1YnNlcXVlbnQgbG9vcHMgKi8KLSAgICAgIGludl9uID0gR2V0SW52SW50KChzZmJPZmZzZXRbc2ZiICsgc2Zib2ZmcyArIDFdIC0gc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnNdKT4+MSk7CisgICAgICAvKiBpbnZfbiBpcyBzY2FsZWQgd2l0aCBmYWN0b3IgMiB0byBjb21wZW5zYXRlIGZNdWx0RGl2MigpIGluIHN1YnNlcXVlbnQKKyAgICAgICAqIGxvb3BzICovCisgICAgICBpbnZfbiA9IEdldEludkludCgKKyAgICAgICAgICAoc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnMgKyAxXSAtIHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzXSkgPj4gMSk7CiAKICAgICAgIGlmIChpbnZfbiA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7Ci0gICAgICAgIElOVCBzLHNMLHNSOworICAgICAgICBJTlQgcywgc0wsIHNSOwogCiAgICAgICAgIC8qIGNvcnJlbGF0aW9uIDo9IFBlYXJzb24ncyBwcm9kdWN0LW1vbWVudCBjb2VmZmljaWVudCAqLwotICAgICAgICAvKiBjb21wdXRlIGNvcnJlbGF0aW9uIGJldHdlZW4gY2hhbm5lbHMgYW5kIGNoZWNrIGlmIGl0IGlzIG92ZXIgdGhyZXNob2xkICovCi0gICAgICAgIG1sICAgICAgID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICAgIG1yICAgICAgID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICAgIHByb2RfbHIgID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICAgIC8qIGNvbXB1dGUgY29ycmVsYXRpb24gYmV0d2VlbiBjaGFubmVscyBhbmQgY2hlY2sgaWYgaXQgaXMgb3ZlcgorICAgICAgICAgKiB0aHJlc2hvbGQgKi8KKyAgICAgICAgbWwgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgbXIgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgcHJvZF9sciA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgICBzcXVhcmVfbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgICBzcXVhcmVfciA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogCi0gICAgICAgIHNMID0gY2FsY1NmYk1heFNjYWxlKG1kY3RTcGVjdHJ1bUxlZnQsc2ZiT2Zmc2V0W3NmYitzZmJvZmZzXSxzZmJPZmZzZXRbc2ZiK3NmYm9mZnMrMV0pOwotICAgICAgICBzUiA9IGNhbGNTZmJNYXhTY2FsZShtZGN0U3BlY3RydW1SaWdodCxzZmJPZmZzZXRbc2ZiK3NmYm9mZnNdLHNmYk9mZnNldFtzZmIrc2Zib2ZmcysxXSk7Ci0gICAgICAgIHMgPSBmaXhNaW4oc0wsc1IpOworICAgICAgICBzTCA9IGNhbGNTZmJNYXhTY2FsZShtZGN0U3BlY3RydW1MZWZ0LCBzZmJPZmZzZXRbc2ZiICsgc2Zib2Zmc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV0pOworICAgICAgICBzUiA9IGNhbGNTZmJNYXhTY2FsZShtZGN0U3BlY3RydW1SaWdodCwgc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXRbc2ZiICsgc2Zib2ZmcyArIDFdKTsKKyAgICAgICAgcyA9IGZpeE1pbihzTCwgc1IpOwogCi0gICAgICAgIGZvciAoaiA9IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzXTsgaiA8IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV07IGorKykgewotICAgICAgICAgIG1sICs9IGZNdWx0RGl2MigobWRjdFNwZWN0cnVtTGVmdFtqXSAgPDwgcyksaW52X24pOyAgICAgICAgICAgICAvLyBzY2FsZWQgd2l0aCBtZGN0U2NhbGUgLSBzICsgaW52X24KLSAgICAgICAgICBtciArPSBmTXVsdERpdjIoKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdIDw8IHMpLGludl9uKTsgICAgICAgICAgICAgLy8gc2NhbGVkIHdpdGggbWRjdFNjYWxlIC0gcyArIGludl9uCisgICAgICAgIGZvciAoaiA9IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzXTsgaiA8IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV07CisgICAgICAgICAgICAgaisrKSB7CisgICAgICAgICAgbWwgKz0gZk11bHREaXYyKChtZGN0U3BlY3RydW1MZWZ0W2pdIDw8IHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZfbik7ICAvLyBzY2FsZWQgd2l0aCBtZGN0U2NhbGUgLSBzICsgaW52X24KKyAgICAgICAgICBtciArPSBmTXVsdERpdjIoKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdIDw8IHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZfbik7ICAvLyBzY2FsZWQgd2l0aCBtZGN0U2NhbGUgLSBzICsgaW52X24KICAgICAgICAgfQotICAgICAgICBtbCA9IGZNdWx0RGl2MihtbCxpbnZfbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZWQgd2l0aCBtZGN0U2NhbGUgLSBzICsgaW52X24KLSAgICAgICAgbXIgPSBmTXVsdERpdjIobXIsaW52X24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGVkIHdpdGggbWRjdFNjYWxlIC0gcyArIGludl9uCisgICAgICAgIG1sID0gZk11bHREaXYyKG1sLCBpbnZfbik7ICAvLyBzY2FsZWQgd2l0aCBtZGN0U2NhbGUgLSBzICsgaW52X24KKyAgICAgICAgbXIgPSBmTXVsdERpdjIobXIsIGludl9uKTsgIC8vIHNjYWxlZCB3aXRoIG1kY3RTY2FsZSAtIHMgKyBpbnZfbgogCi0gICAgICAgIGZvciAoaiA9IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzXTsgaiA8IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV07IGorKykgewotICAgICAgICAgIHRtcF9sID0gZk11bHREaXYyKChtZGN0U3BlY3RydW1MZWZ0W2pdICA8PCBzKSxpbnZfbikgLSBtbDsgICAgICAvLyBzY2FsZWQgd2l0aCBtZGN0U2NhbGUgLSBzICsgaW52X24KLSAgICAgICAgICB0bXBfciA9IGZNdWx0RGl2MigobWRjdFNwZWN0cnVtUmlnaHRbal0gPDwgcyksaW52X24pIC0gbXI7ICAgICAgLy8gc2NhbGVkIHdpdGggbWRjdFNjYWxlIC0gcyArIGludl9uCisgICAgICAgIGZvciAoaiA9IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzXTsgaiA8IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV07CisgICAgICAgICAgICAgaisrKSB7CisgICAgICAgICAgdG1wX2wgPSBmTXVsdERpdjIoKG1kY3RTcGVjdHJ1bUxlZnRbal0gPDwgcyksIGludl9uKSAtCisgICAgICAgICAgICAgICAgICBtbDsgIC8vIHNjYWxlZCB3aXRoIG1kY3RTY2FsZSAtIHMgKyBpbnZfbgorICAgICAgICAgIHRtcF9yID0gZk11bHREaXYyKChtZGN0U3BlY3RydW1SaWdodFtqXSA8PCBzKSwgaW52X24pIC0KKyAgICAgICAgICAgICAgICAgIG1yOyAgLy8gc2NhbGVkIHdpdGggbWRjdFNjYWxlIC0gcyArIGludl9uCiAKLSAgICAgICAgICBwcm9kX2xyICArPSBmTXVsdERpdjIodG1wX2wsdG1wX3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGVkIHdpdGggMioobWRjdFNjYWxlIC0gcyArIGludl9uKSArIDEKLSAgICAgICAgICBzcXVhcmVfbCArPSBmUG93MkRpdjIodG1wX2wpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGVkIHdpdGggMioobWRjdFNjYWxlIC0gcyArIGludl9uKSArIDEKLSAgICAgICAgICBzcXVhcmVfciArPSBmUG93MkRpdjIodG1wX3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGVkIHdpdGggMioobWRjdFNjYWxlIC0gcyArIGludl9uKSArIDEKKyAgICAgICAgICBwcm9kX2xyICs9IGZNdWx0RGl2MigKKyAgICAgICAgICAgICAgdG1wX2wsIHRtcF9yKTsgIC8vIHNjYWxlZCB3aXRoIDIqKG1kY3RTY2FsZSAtIHMgKyBpbnZfbikgKyAxCisgICAgICAgICAgc3F1YXJlX2wgKz0KKyAgICAgICAgICAgICAgZlBvdzJEaXYyKHRtcF9sKTsgIC8vIHNjYWxlZCB3aXRoIDIqKG1kY3RTY2FsZSAtIHMgKyBpbnZfbikgKyAxCisgICAgICAgICAgc3F1YXJlX3IgKz0KKyAgICAgICAgICAgICAgZlBvdzJEaXYyKHRtcF9yKTsgIC8vIHNjYWxlZCB3aXRoIDIqKG1kY3RTY2FsZSAtIHMgKyBpbnZfbikgKyAxCiAgICAgICAgIH0KLSAgICAgICAgcHJvZF9sciAgPSBwcm9kX2xyICA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGVkIHdpdGggMioobWRjdFNjYWxlIC0gcyArIGludl9uKQotICAgICAgICBzcXVhcmVfbCA9IHNxdWFyZV9sIDw8IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZWQgd2l0aCAyKihtZGN0U2NhbGUgLSBzICsgaW52X24pCi0gICAgICAgIHNxdWFyZV9yID0gc3F1YXJlX3IgPDwgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxlZCB3aXRoIDIqKG1kY3RTY2FsZSAtIHMgKyBpbnZfbikKKyAgICAgICAgcHJvZF9sciA9IHByb2RfbHIgPDwgMTsgICAgLy8gc2NhbGVkIHdpdGggMioobWRjdFNjYWxlIC0gcyArIGludl9uKQorICAgICAgICBzcXVhcmVfbCA9IHNxdWFyZV9sIDw8IDE7ICAvLyBzY2FsZWQgd2l0aCAyKihtZGN0U2NhbGUgLSBzICsgaW52X24pCisgICAgICAgIHNxdWFyZV9yID0gc3F1YXJlX3IgPDwgMTsgIC8vIHNjYWxlZCB3aXRoIDIqKG1kY3RTY2FsZSAtIHMgKyBpbnZfbikKIAotICAgICAgICBpZiAoc3F1YXJlX2wgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSAmJiBzcXVhcmVfciA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICAgIGlmIChzcXVhcmVfbCA+IEZMMkZYQ09OU1RfREJMKDAuMGYpICYmCisgICAgICAgICAgICBzcXVhcmVfciA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CiAgICAgICAgICAgSU5UIGNoYW5uZWxDb3JyU0YgPSAwOwogCi0gICAgICAgICAgLyogbG9jYWwgc2NhbGluZyBvZiBzcXVhcmVfbCBhbmQgc3F1YXJlX3IgaXMgY29tcGVuc2F0ZWQgYWZ0ZXIgc3FydCBjYWxjdWxhdGlvbiAqLwotICAgICAgICAgIHNMICA9IGZpeE1heCgwLChDbnRMZWFkaW5nWmVyb3Moc3F1YXJlX2wpLTEpKTsKLSAgICAgICAgICBzUiAgPSBmaXhNYXgoMCwoQ250TGVhZGluZ1plcm9zKHNxdWFyZV9yKS0xKSk7Ci0gICAgICAgICAgcyAgID0gKChzTCArIHNSKT4+MSk8PDE7Ci0gICAgICAgICAgc0wgID0gZml4TWluKHNMLHMpOwotICAgICAgICAgIHNSICA9IHMtc0w7Ci0gICAgICAgICAgdG1wID0gZk11bHQoc3F1YXJlX2w8PHNMLHNxdWFyZV9yPDxzUik7CisgICAgICAgICAgLyogbG9jYWwgc2NhbGluZyBvZiBzcXVhcmVfbCBhbmQgc3F1YXJlX3IgaXMgY29tcGVuc2F0ZWQgYWZ0ZXIgc3FydAorICAgICAgICAgICAqIGNhbGN1bGF0aW9uICovCisgICAgICAgICAgc0wgPSBmaXhNYXgoMCwgKENudExlYWRpbmdaZXJvcyhzcXVhcmVfbCkgLSAxKSk7CisgICAgICAgICAgc1IgPSBmaXhNYXgoMCwgKENudExlYWRpbmdaZXJvcyhzcXVhcmVfcikgLSAxKSk7CisgICAgICAgICAgcyA9ICgoc0wgKyBzUikgPj4gMSkgPDwgMTsKKyAgICAgICAgICBzTCA9IGZpeE1pbihzTCwgcyk7CisgICAgICAgICAgc1IgPSBzIC0gc0w7CisgICAgICAgICAgdG1wID0gZk11bHQoc3F1YXJlX2wgPDwgc0wsIHNxdWFyZV9yIDw8IHNSKTsKICAgICAgICAgICB0bXAgPSBzcXJ0Rml4cCh0bXApOwogCiAgICAgICAgICAgRkRLX0FTU0VSVCh0bXAgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSk7CiAKICAgICAgICAgICAvKiBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIGhhdmUgdGhlIHNhbWUgc2NhbGluZyAqLwotICAgICAgICAgIGlmIChwcm9kX2xyIDwgRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7Ci0gICAgICAgICAgICBjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSA9IC0oZkRpdk5vcm0oLXByb2RfbHIsdG1wLCZjaGFubmVsQ29yclNGKSk7CisgICAgICAgICAgaWYgKHByb2RfbHIgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgICAgICAgY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10gPQorICAgICAgICAgICAgICAgIC0oZkRpdk5vcm0oLXByb2RfbHIsIHRtcCwgJmNoYW5uZWxDb3JyU0YpKTsKIAorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSA9CisgICAgICAgICAgICAgICAgKGZEaXZOb3JtKHByb2RfbHIsIHRtcCwgJmNoYW5uZWxDb3JyU0YpKTsKICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSA9ICAoZkRpdk5vcm0oIHByb2RfbHIsdG1wLCZjaGFubmVsQ29yclNGKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNoYW5uZWxDb3JyU0YgPSBmaXhNaW4oZml4TWF4KCggY2hhbm5lbENvcnJTRiArICgoc0wrc1IpPj4xKSksLShERlJBQ1RfQklUUy0xKSksREZSQUNUX0JJVFMtMSk7CisgICAgICAgICAgY2hhbm5lbENvcnJTRiA9IGZpeE1pbigKKyAgICAgICAgICAgICAgZml4TWF4KChjaGFubmVsQ29yclNGICsgKChzTCArIHNSKSA+PiAxKSksIC0oREZSQUNUX0JJVFMgLSAxKSksCisgICAgICAgICAgICAgIERGUkFDVF9CSVRTIC0gMSk7CiAKICAgICAgICAgICBpZiAoY2hhbm5lbENvcnJTRiA8IDApIHsKLSAgICAgICAgICAgIGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdID0gY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10gPj4gKC1jaGFubmVsQ29yclNGKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSA9CisgICAgICAgICAgICAgICAgY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10gPj4gKC1jaGFubmVsQ29yclNGKTsKKyAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogYXZvaWQgb3ZlcmZsb3dzIGR1ZSB0byBsaW1pdGVkIGNvbXB1dGF0aW9uYWwgYWNjdXJhY3kgKi8KLSAgICAgICAgICAgIGlmICggZkFicyhjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSkgPiAoKChGSVhQX0RCTClNQVhWQUxfREJMKT4+Y2hhbm5lbENvcnJTRikgKSB7CisgICAgICAgICAgICBpZiAoZkFicyhjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSkgPgorICAgICAgICAgICAgICAgICgoKEZJWFBfREJMKU1BWFZBTF9EQkwpID4+IGNoYW5uZWxDb3JyU0YpKSB7CiAgICAgICAgICAgICAgIGlmIChjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKQotICAgICAgICAgICAgICAgIGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdID0gLShGSVhQX0RCTCkgTUFYVkFMX0RCTDsKKyAgICAgICAgICAgICAgICBjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSA9IC0oRklYUF9EQkwpTUFYVkFMX0RCTDsKICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdID0gIChGSVhQX0RCTCkgTUFYVkFMX0RCTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICBjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSA9IGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdIDw8IGNoYW5uZWxDb3JyU0Y7CisgICAgICAgICAgICAgICAgY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10gPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGNoYW5uZWxDb3JyW3NmYiArIHNmYm9mZnNdID0gY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBjaGFubmVsQ29yclNGOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogCi0gICAgICAvKiBmb3IgcG9zdCBwcm9jZXNzaW5nOiBocnJFcnIgaXMgdGhlIGVycm9yIGluIHRlcm1zIG9mICh0b28gbGl0dGxlKSBjb3JyZWxhdGlvbgotICAgICAgICogd2VpZ2h0ZWQgd2l0aCB0aGUgbG91ZG5lc3Mgb2YgdGhlIFNGQjsgU0ZCcyB3aXRoIHNtYWxsIGhyckVyciBjYW4gYmUgbWVyZ2VkICovCi0gICAgICBpZiAoaHJyRXJyW3NmYiArIHNmYm9mZnNdID09IEZMMkZYQ09OU1RfREJMKDEuMC84LjApKSB7CisgICAgICAvKiBmb3IgcG9zdCBwcm9jZXNzaW5nOiBocnJFcnIgaXMgdGhlIGVycm9yIGluIHRlcm1zIG9mICh0b28gbGl0dGxlKQorICAgICAgICogY29ycmVsYXRpb24gd2VpZ2h0ZWQgd2l0aCB0aGUgbG91ZG5lc3Mgb2YgdGhlIFNGQjsgU0ZCcyB3aXRoIHNtYWxsCisgICAgICAgKiBocnJFcnIgY2FuIGJlIG1lcmdlZCAqLworICAgICAgaWYgKGhyckVycltzZmIgKyBzZmJvZmZzXSA9PSBGTDJGWENPTlNUX0RCTCgxLjAgLyA4LjApKSB7CiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogCi0gICAgICBocnJFcnJbc2ZiICsgc2Zib2Zmc10gPSBmTXVsdERpdjIoKEZMMkZYQ09OU1RfREJMKDAuMjVmKS0oY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10+PjIpKSxub3JtU2ZiTG91ZG5lc3Nbc2ZiICsgc2Zib2Zmc10pOworICAgICAgaHJyRXJyW3NmYiArIHNmYm9mZnNdID0KKyAgICAgICAgICBmTXVsdERpdjIoKEZMMkZYQ09OU1RfREJMKDAuMjVmKSAtIChjaGFubmVsQ29ycltzZmIgKyBzZmJvZmZzXSA+PiAyKSksCisgICAgICAgICAgICAgICAgICAgIG5vcm1TZmJMb3VkbmVzc1tzZmIgKyBzZmJvZmZzXSk7CiAKICAgICAgIC8qIHNldCBJUyBtYXNrL3ZlY3RvciB0byAxLCBpZiBjb3JyZWxhdGlvbiBpcyBoaWdoIGVub3VnaCAqLwogICAgICAgaWYgKGZBYnMoY2hhbm5lbENvcnJbc2ZiICsgc2Zib2Zmc10pID49IGlzUGFyYW1zLT5jb3JyX3RocmVzaCkgewpAQCAtNDIxLDcgKzQ3MSw2IEBACiAgIH0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2ZpbmFsaXplSW50ZW5zaXR5RGVjaXNpb24KQEAgLTQzOCwxNyArNDg3LDExIEBACiAgICAgcmV0dXJuczogICAgICBub25lCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLUZES2FhY0VuY19maW5hbGl6ZUludGVuc2l0eURlY2lzaW9uKGNvbnN0IEZJWFBfREJMICpocnJFcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAqaXNNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnJlYWxJc1NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKm5vcm1TZmJMb3VkbmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVEVOU0lUWV9QQVJBTUVURVJTICppc1BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbWF4U2ZiUGVyR3JvdXApCi17Ci0gIElOVCBzZmIsc2Zib2ZmcywgajsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19maW5hbGl6ZUludGVuc2l0eURlY2lzaW9uKAorICAgIGNvbnN0IEZJWFBfREJMICpocnJFcnIsIElOVCAqaXNNYXNrLCBjb25zdCBGSVhQX0RCTCAqcmVhbElzU2NhbGUsCisgICAgY29uc3QgRklYUF9EQkwgKm5vcm1TZmJMb3VkbmVzcywgY29uc3QgSU5URU5TSVRZX1BBUkFNRVRFUlMgKmlzUGFyYW1zLAorICAgIGNvbnN0IElOVCBzZmJDbnQsIGNvbnN0IElOVCBzZmJQZXJHcm91cCwgY29uc3QgSU5UIG1heFNmYlBlckdyb3VwKSB7CisgIElOVCBzZmIsIHNmYm9mZnMsIGo7CiAgIEZJWFBfREJMIGlzU2NhbGVMYXN0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgIElOVCBpc1N0YXJ0VmFsdWVGb3VuZCA9IDA7CiAKQEAgLTQ2NCwyNiArNTA3LDMwIEBACiAgICAgICAgIGlmIChjdXJyZW50SXNTZmJDb3VudCA9PSAwKSB7CiAgICAgICAgICAgc3RhcnRJc1NmYiA9IHNmYm9mZnMgKyBzZmI7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlzU3RhcnRWYWx1ZUZvdW5kPT0wKSB7CisgICAgICAgIGlmIChpc1N0YXJ0VmFsdWVGb3VuZCA9PSAwKSB7CiAgICAgICAgICAgaXNTY2FsZUxhc3QgPSByZWFsSXNTY2FsZVtzZmJvZmZzICsgc2ZiXTsKICAgICAgICAgICBpc1N0YXJ0VmFsdWVGb3VuZCA9IDE7CiAgICAgICAgIH0KICAgICAgICAgaW5Jc0Jsb2NrID0gMTsKICAgICAgICAgY3VycmVudElzU2ZiQ291bnQrKzsKLSAgICAgICAgb3ZlcmFsbEhyckVycm9yICArPSBocnJFcnJbc2Zib2ZmcyArIHNmYl0gPj4gKE1BWF9TRkJfUEVSX0dST1VQX1NGLTMpOwotICAgICAgICBpc1JlZ2lvbkxvdWRuZXNzICs9IG5vcm1TZmJMb3VkbmVzc1tzZmJvZmZzICsgc2ZiXSA+PiBNQVhfU0ZCX1BFUl9HUk9VUF9TRjsKLSAgICAgIH0KLSAgICAgIGVsc2UgeworICAgICAgICBvdmVyYWxsSHJyRXJyb3IgKz0gaHJyRXJyW3NmYm9mZnMgKyBzZmJdID4+IChNQVhfU0ZCX1BFUl9HUk9VUF9TRiAtIDMpOworICAgICAgICBpc1JlZ2lvbkxvdWRuZXNzICs9CisgICAgICAgICAgICBub3JtU2ZiTG91ZG5lc3Nbc2Zib2ZmcyArIHNmYl0gPj4gTUFYX1NGQl9QRVJfR1JPVVBfU0Y7CisgICAgICB9IGVsc2UgewogICAgICAgICAvKiBiYXNlZCBvbiBjb3JyZWxhdGlvbiwgSVMgc2hvdWxkIG5vdCBiZSB1c2VkCiAgICAgICAgICAqIC0+IHVzZSBpdCBhbnl3YXksIGlmIG92ZXJhbGwgZXJyb3IgaXMgYmVsb3cgdGhyZXNob2xkCiAgICAgICAgICAqICAgIGFuZCBpZiBsb2NhbCBlcnJvciBkb2VzIG5vdCBleGNlZWQgdGhyZXNob2xkCiAgICAgICAgICAqIG90aGVyd2lzZTogY2hlY2sgaWYgdGhlcmUgYXJlIGVub3VnaCBJUyBTRkJzCiAgICAgICAgICAqLwogICAgICAgICBpZiAoaW5Jc0Jsb2NrKSB7Ci0gICAgICAgICAgb3ZlcmFsbEhyckVycm9yICArPSBocnJFcnJbc2Zib2ZmcyArIHNmYl0gPj4gKE1BWF9TRkJfUEVSX0dST1VQX1NGLTMpOwotICAgICAgICAgIGlzUmVnaW9uTG91ZG5lc3MgKz0gbm9ybVNmYkxvdWRuZXNzW3NmYm9mZnMgKyBzZmJdID4+IE1BWF9TRkJfUEVSX0dST1VQX1NGOworICAgICAgICAgIG92ZXJhbGxIcnJFcnJvciArPQorICAgICAgICAgICAgICBocnJFcnJbc2Zib2ZmcyArIHNmYl0gPj4gKE1BWF9TRkJfUEVSX0dST1VQX1NGIC0gMyk7CisgICAgICAgICAgaXNSZWdpb25Mb3VkbmVzcyArPQorICAgICAgICAgICAgICBub3JtU2ZiTG91ZG5lc3Nbc2Zib2ZmcyArIHNmYl0gPj4gTUFYX1NGQl9QRVJfR1JPVVBfU0Y7CiAKLSAgICAgICAgICBpZiAoIChocnJFcnJbc2Zib2ZmcyArIHNmYl0gPCAoaXNQYXJhbXMtPmxvY2FsX2Vycm9yX3RocmVzaD4+MykpICYmIChvdmVyYWxsSHJyRXJyb3IgPCAoaXNQYXJhbXMtPnRvdGFsX2Vycm9yX3RocmVzaD4+TUFYX1NGQl9QRVJfR1JPVVBfU0YpKSApIHsKKyAgICAgICAgICBpZiAoKGhyckVycltzZmJvZmZzICsgc2ZiXSA8IChpc1BhcmFtcy0+bG9jYWxfZXJyb3JfdGhyZXNoID4+IDMpKSAmJgorICAgICAgICAgICAgICAob3ZlcmFsbEhyckVycm9yIDwKKyAgICAgICAgICAgICAgIChpc1BhcmFtcy0+dG90YWxfZXJyb3JfdGhyZXNoID4+IE1BWF9TRkJfUEVSX0dST1VQX1NGKSkpIHsKICAgICAgICAgICAgIGN1cnJlbnRJc1NmYkNvdW50Kys7CiAgICAgICAgICAgICAvKiBvdmVyd3JpdGUgY29ycmVsYXRpb24gYmFzZWQgZGVjaXNpb24gKi8KICAgICAgICAgICAgIGlzTWFza1tzZmJvZmZzICsgc2ZiXSA9IDE7CkBAIC00OTQsMTAgKzU0MSwxMiBAQAogICAgICAgfQogICAgICAgLyogY2hlY2sgZm9yIGxhcmdlIGRpcmVjdGlvbiBkZXZpYXRpb24gKi8KICAgICAgIGlmIChpbklzQmxvY2spIHsKLSAgICAgICAgaWYoIGZBYnMoaXNTY2FsZUxhc3QtcmVhbElzU2NhbGVbc2Zib2ZmcyArIHNmYl0pIDwgKGlzUGFyYW1zLT5kaXJlY3Rpb25fZGV2aWF0aW9uX3RocmVzaD4+KFJFQUxfU0NBTEVfU0YrTERfREFUQV9TSElGVC1JU19ESVJFQ1RJT05fREVWSUFUSU9OX1RIUkVTSF9TRikpICkgeworICAgICAgICBpZiAoZkFicyhpc1NjYWxlTGFzdCAtIHJlYWxJc1NjYWxlW3NmYm9mZnMgKyBzZmJdKSA8CisgICAgICAgICAgICAoaXNQYXJhbXMtPmRpcmVjdGlvbl9kZXZpYXRpb25fdGhyZXNoID4+CisgICAgICAgICAgICAgKFJFQUxfU0NBTEVfU0YgKyBMRF9EQVRBX1NISUZUIC0KKyAgICAgICAgICAgICAgSVNfRElSRUNUSU9OX0RFVklBVElPTl9USFJFU0hfU0YpKSkgewogICAgICAgICAgIGlzU2NhbGVMYXN0ID0gcmVhbElzU2NhbGVbc2Zib2ZmcyArIHNmYl07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZXsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBpc01hc2tbc2Zib2ZmcyArIHNmYl0gPSAwOwogICAgICAgICAgIGluSXNCbG9jayA9IDA7CiAgICAgICAgICAgY3VycmVudElzU2ZiQ291bnQtLTsKQEAgLTUwNiwxNCArNTU1LDE2IEBACiAKICAgICAgIGlmIChjdXJyZW50SXNTZmJDb3VudCA+IDAgJiYgKCFpbklzQmxvY2sgfHwgc2ZiID09IG1heFNmYlBlckdyb3VwIC0gMSkpIHsKICAgICAgICAgLyogbm90IGVub3VnaCBTRkJzIC0+IGRvIG5vdCB1c2UgSVMgKi8KLSAgICAgICAgaWYgKGN1cnJlbnRJc1NmYkNvdW50IDwgaXNQYXJhbXMtPm1pbl9pc19zZmJzIHx8IChpc1JlZ2lvbkxvdWRuZXNzIDwgaXNQYXJhbXMtPmlzX3JlZ2lvbl9taW5fbG91ZG5lc3M+Pk1BWF9TRkJfUEVSX0dST1VQX1NGKSkgewotICAgICAgICAgIGZvcihqID0gc3RhcnRJc1NmYjsgaiA8PSBzZmJvZmZzICsgc2ZiOyBqKyspIHsKKyAgICAgICAgaWYgKGN1cnJlbnRJc1NmYkNvdW50IDwgaXNQYXJhbXMtPm1pbl9pc19zZmJzIHx8CisgICAgICAgICAgICAoaXNSZWdpb25Mb3VkbmVzczxpc1BhcmFtcy0+aXNfcmVnaW9uX21pbl9sb3VkbmVzcz4+CisgICAgICAgICAgICAgTUFYX1NGQl9QRVJfR1JPVVBfU0YpKSB7CisgICAgICAgICAgZm9yIChqID0gc3RhcnRJc1NmYjsgaiA8PSBzZmJvZmZzICsgc2ZiOyBqKyspIHsKICAgICAgICAgICAgIGlzTWFza1tqXSA9IDA7CiAgICAgICAgICAgfQogICAgICAgICAgIGlzU2NhbGVMYXN0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICAgICAgaXNTdGFydFZhbHVlRm91bmQgPSAwOwotICAgICAgICAgIGZvciAoaj0wOyBqIDwgc3RhcnRJc1NmYjsgaisrKSB7Ci0gICAgICAgICAgICBpZiAoaXNNYXNrW2pdIT0wKSB7CisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHN0YXJ0SXNTZmI7IGorKykgeworICAgICAgICAgICAgaWYgKGlzTWFza1tqXSAhPSAwKSB7CiAgICAgICAgICAgICAgIGlzU2NhbGVMYXN0ID0gcmVhbElzU2NhbGVbal07CiAgICAgICAgICAgICAgIGlzU3RhcnRWYWx1ZUZvdW5kID0gMTsKICAgICAgICAgICAgIH0KQEAgLTUyNyw3ICs1NzgsNiBAQAogICB9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19JbnRlbnNpdHlTdGVyZW9Qcm9jZXNzaW5nCkBAIC01NTUsMzYgKzYwNSwyMyBAQAogICAgICAgICAgICAgICAgICAgc2ZiU3ByZWFkRW5SaWdodCAgICAgICB6ZXJvZWQgd2hlcmUgaXNCb29rIT0wCiAgICAgICAgICAgICAgICAgICBzZmJUaHJlc2hvbGRSaWdodCAgICAgICAgemVyb2VkIHdoZXJlIGlzQm9vayE9MAogICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5TGREYXRhUmlnaHQgICAgIEZMMkZYQ09OU1RfREJMKC0xLjApIHdoZXJlIGlzQm9vayE9MAotICAgICAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkTGREYXRhUmlnaHQgIEZMMkZYQ09OU1RfREJMKC0wLjUxNTYyNWYpIHdoZXJlIGlzQm9vayE9MAorICAgICAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkTGREYXRhUmlnaHQgIEZMMkZYQ09OU1RfREJMKC0wLjUxNTYyNWYpIHdoZXJlCitpc0Jvb2shPTAKIAogICAgIHJldHVybnM6ICAgICAgbm9uZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgRkRLYWFjRW5jX0ludGVuc2l0eVN0ZXJlb1Byb2Nlc3NpbmcoCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYkVuZXJneUxlZnQsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYkVuZXJneVJpZ2h0LAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICptZGN0U3BlY3RydW1MZWZ0LAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICptZGN0U3BlY3RydW1SaWdodCwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqc2ZiVGhyZXNob2xkTGVmdCwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqc2ZiVGhyZXNob2xkUmlnaHQsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYlRocmVzaG9sZExkRGF0YVJpZ2h0LAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICpzZmJTcHJlYWRFbkxlZnQsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYlNwcmVhZEVuUmlnaHQsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYkVuZXJneUxkRGF0YUxlZnQsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYkVuZXJneUxkRGF0YVJpZ2h0LAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICptc0RpZ2VzdCwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAqbXNNYXNrLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBzZmJDbnQsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIHNmYlBlckdyb3VwLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAqc2ZiT2Zmc2V0LAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBhbGxvd0lTLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICppc0Jvb2ssCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgKmlzU2NhbGUsCi0gICAgICAgIFBOU19EQVRBICAgICAgICAgKlJFU1RSSUNUIHBuc0RhdGFbMl0KLSAgICAgICAgKQotewotICBJTlQgc2ZiLHNmYm9mZnMsIGo7CisgICAgRklYUF9EQkwgKnNmYkVuZXJneUxlZnQsIEZJWFBfREJMICpzZmJFbmVyZ3lSaWdodCwKKyAgICBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtTGVmdCwgRklYUF9EQkwgKm1kY3RTcGVjdHJ1bVJpZ2h0LAorICAgIEZJWFBfREJMICpzZmJUaHJlc2hvbGRMZWZ0LCBGSVhQX0RCTCAqc2ZiVGhyZXNob2xkUmlnaHQsCisgICAgRklYUF9EQkwgKnNmYlRocmVzaG9sZExkRGF0YVJpZ2h0LCBGSVhQX0RCTCAqc2ZiU3ByZWFkRW5MZWZ0LAorICAgIEZJWFBfREJMICpzZmJTcHJlYWRFblJpZ2h0LCBGSVhQX0RCTCAqc2ZiRW5lcmd5TGREYXRhTGVmdCwKKyAgICBGSVhQX0RCTCAqc2ZiRW5lcmd5TGREYXRhUmlnaHQsIElOVCAqbXNEaWdlc3QsIElOVCAqbXNNYXNrLAorICAgIGNvbnN0IElOVCBzZmJDbnQsIGNvbnN0IElOVCBzZmJQZXJHcm91cCwgY29uc3QgSU5UIG1heFNmYlBlckdyb3VwLAorICAgIGNvbnN0IElOVCAqc2ZiT2Zmc2V0LCBjb25zdCBJTlQgYWxsb3dJUywgSU5UICppc0Jvb2ssIElOVCAqaXNTY2FsZSwKKyAgICBQTlNfREFUQSAqUkVTVFJJQ1QgcG5zRGF0YVsyXSkgeworICBJTlQgc2ZiLCBzZmJvZmZzLCBqOwogICBGSVhQX0RCTCBzY2FsZTsKICAgRklYUF9EQkwgbHI7CiAgIEZJWFBfREJMIGhyckVycltNQVhfR1JPVVBFRF9TRkJdOwpAQCAtNTkzLDE0ICs2MzAsMTMgQEAKICAgSU5URU5TSVRZX1BBUkFNRVRFUlMgaXNQYXJhbXM7CiAgIElOVCBpc01hc2tbTUFYX0dST1VQRURfU0ZCXTsKIAotICBGREttZW1jbGVhcigodm9pZCopaXNCb29rLHNmYkNudCpzaXplb2YoSU5UKSk7Ci0gIEZES21lbWNsZWFyKCh2b2lkKilpc01hc2ssc2ZiQ250KnNpemVvZihJTlQpKTsKLSAgRkRLbWVtY2xlYXIoKHZvaWQqKXJlYWxJc1NjYWxlLHNmYkNudCpzaXplb2YoRklYUF9EQkwpKTsKLSAgRkRLbWVtY2xlYXIoKHZvaWQqKWlzU2NhbGUsc2ZiQ250KnNpemVvZihJTlQpKTsKLSAgRkRLbWVtY2xlYXIoKHZvaWQqKWhyckVycixzZmJDbnQqc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNsZWFyKCh2b2lkICopaXNCb29rLCBzZmJDbnQgKiBzaXplb2YoSU5UKSk7CisgIEZES21lbWNsZWFyKCh2b2lkICopaXNNYXNrLCBzZmJDbnQgKiBzaXplb2YoSU5UKSk7CisgIEZES21lbWNsZWFyKCh2b2lkICopcmVhbElzU2NhbGUsIHNmYkNudCAqIHNpemVvZihGSVhQX0RCTCkpOworICBGREttZW1jbGVhcigodm9pZCAqKWlzU2NhbGUsIHNmYkNudCAqIHNpemVvZihJTlQpKTsKKyAgRkRLbWVtY2xlYXIoKHZvaWQgKilocnJFcnIsIHNmYkNudCAqIHNpemVvZihGSVhQX0RCTCkpOwogCi0gIGlmICghYWxsb3dJUykKLSAgICByZXR1cm47CisgIGlmICghYWxsb3dJUykgcmV0dXJuOwogCiAgIEZES2FhY0VuY19pbml0SXNQYXJhbXMoJmlzUGFyYW1zKTsKIApAQCAtNjExLDE1MCArNjQ3LDE2NCBAQAogICAgKiAgICsgbm9ybWFsaXphdGlvbjogZGl2aXNpb24gYnkgc3VtIG9mIGFsbCBTRkIgbG91ZG5lc3NlcwogICAgKiAtIGlzTWFzayAoaXMgc2V0IHRvIDAgaWYgY2hhbm5lbHMgYXJlIHRoZSBzYW1lIG9yIG9uZSBpcyAwKQogICAgKi8KLSAgIEZES2FhY0VuY19wcmVwYXJlSW50ZW5zaXR5RGVjaXNpb24oc2ZiRW5lcmd5TGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5UmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkVuZXJneUxkRGF0YUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkVuZXJneUxkRGF0YVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZGN0U3BlY3RydW1MZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZGN0U3BlY3RydW1SaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocnJFcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbElzU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1TZmJMb3VkbmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldCk7CisgIEZES2FhY0VuY19wcmVwYXJlSW50ZW5zaXR5RGVjaXNpb24oCisgICAgICBzZmJFbmVyZ3lMZWZ0LCBzZmJFbmVyZ3lSaWdodCwgc2ZiRW5lcmd5TGREYXRhTGVmdCwgc2ZiRW5lcmd5TGREYXRhUmlnaHQsCisgICAgICBtZGN0U3BlY3RydW1MZWZ0LCBtZGN0U3BlY3RydW1SaWdodCwgJmlzUGFyYW1zLCBocnJFcnIsIGlzTWFzaywKKyAgICAgIHJlYWxJc1NjYWxlLCBub3JtU2ZiTG91ZG5lc3MsIHNmYkNudCwgc2ZiUGVyR3JvdXAsIG1heFNmYlBlckdyb3VwLAorICAgICAgc2ZiT2Zmc2V0KTsKIAotICBGREthYWNFbmNfZmluYWxpemVJbnRlbnNpdHlEZWNpc2lvbihocnJFcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbElzU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1TZmJMb3VkbmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cCk7CisgIEZES2FhY0VuY19maW5hbGl6ZUludGVuc2l0eURlY2lzaW9uKGhyckVyciwgaXNNYXNrLCByZWFsSXNTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybVNmYkxvdWRuZXNzLCAmaXNQYXJhbXMsIHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiUGVyR3JvdXAsIG1heFNmYlBlckdyb3VwKTsKIAotICBmb3IgKHNmYj0wOyBzZmI8c2ZiQ250OyBzZmIrPXNmYlBlckdyb3VwKSB7Ci0gICAgZm9yIChzZmJvZmZzPTA7IHNmYm9mZnM8bWF4U2ZiUGVyR3JvdXA7IHNmYm9mZnMrKykgeworICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiICs9IHNmYlBlckdyb3VwKSB7CisgICAgZm9yIChzZmJvZmZzID0gMDsgc2Zib2ZmcyA8IG1heFNmYlBlckdyb3VwOyBzZmJvZmZzKyspIHsKICAgICAgIElOVCBzTCwgc1I7CiAgICAgICBGSVhQX0RCTCBpbnZfbjsKIAotICAgICAgbXNNYXNrW3NmYitzZmJvZmZzXSA9IDA7Ci0gICAgICBpZiAoaXNNYXNrW3NmYitzZmJvZmZzXSA9PSAwKSB7CisgICAgICBtc01hc2tbc2ZiICsgc2Zib2Zmc10gPSAwOworICAgICAgaWYgKGlzTWFza1tzZmIgKyBzZmJvZmZzXSA9PSAwKSB7CiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogCi0gICAgICBpZiAoICAgKHNmYkVuZXJneUxlZnRbc2ZiK3NmYm9mZnNdIDwgc2ZiVGhyZXNob2xkTGVmdFtzZmIrc2Zib2Zmc10pCi0gICAgICAgICAgJiYoZk11bHQoRkwyRlhDT05TVF9EQkwoMS4wZi8xLjVmKSxzZmJFbmVyZ3lSaWdodFtzZmIrc2Zib2Zmc10pID4gc2ZiVGhyZXNob2xkUmlnaHRbc2ZiK3NmYm9mZnNdKSApIHsKKyAgICAgIGlmICgoc2ZiRW5lcmd5TGVmdFtzZmIgKyBzZmJvZmZzXSA8IHNmYlRocmVzaG9sZExlZnRbc2ZiICsgc2Zib2Zmc10pICYmCisgICAgICAgICAgKGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMGYgLyAxLjVmKSwgc2ZiRW5lcmd5UmlnaHRbc2ZiICsgc2Zib2Zmc10pID4KKyAgICAgICAgICAgc2ZiVGhyZXNob2xkUmlnaHRbc2ZiICsgc2Zib2Zmc10pKSB7CiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogICAgICAgLyogTkVXOiBpZiB0aGVyZSBpcyBhIGJpZy1lbm91Z2ggSVMgcmVnaW9uLCBzd2l0Y2ggb2ZmIFBOUyAqLwogICAgICAgaWYgKHBuc0RhdGFbMF0pIHsKLSAgICAgICAgaWYocG5zRGF0YVswXS0+cG5zRmxhZ1tzZmIrc2Zib2Zmc10pIHsKLSAgICAgICAgICBwbnNEYXRhWzBdLT5wbnNGbGFnW3NmYitzZmJvZmZzXSA9IDA7CisgICAgICAgIGlmIChwbnNEYXRhWzBdLT5wbnNGbGFnW3NmYiArIHNmYm9mZnNdKSB7CisgICAgICAgICAgcG5zRGF0YVswXS0+cG5zRmxhZ1tzZmIgKyBzZmJvZmZzXSA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgaWYocG5zRGF0YVsxXS0+cG5zRmxhZ1tzZmIrc2Zib2Zmc10pIHsKLSAgICAgICAgICBwbnNEYXRhWzFdLT5wbnNGbGFnW3NmYitzZmJvZmZzXSA9IDA7CisgICAgICAgIGlmIChwbnNEYXRhWzFdLT5wbnNGbGFnW3NmYiArIHNmYm9mZnNdKSB7CisgICAgICAgICAgcG5zRGF0YVsxXS0+cG5zRmxhZ1tzZmIgKyBzZmJvZmZzXSA9IDA7CiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgaW52X24gPSBHZXRJbnZJbnQoKHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV0gLSBzZmJPZmZzZXRbc2ZiICsgc2Zib2Zmc10pPj4xKTsgIC8vIHNjYWxlZCB3aXRoIDIgdG8gY29tcGVuc2F0ZSBmTXVsdERpdjIoKSBpbiBzdWJzZXF1ZW50IGxvb3AKLSAgICAgIHNMID0gY2FsY1NmYk1heFNjYWxlKG1kY3RTcGVjdHJ1bUxlZnQsc2ZiT2Zmc2V0W3NmYitzZmJvZmZzXSxzZmJPZmZzZXRbc2ZiK3NmYm9mZnMrMV0pOwotICAgICAgc1IgPSBjYWxjU2ZiTWF4U2NhbGUobWRjdFNwZWN0cnVtUmlnaHQsc2ZiT2Zmc2V0W3NmYitzZmJvZmZzXSxzZmJPZmZzZXRbc2ZiK3NmYm9mZnMrMV0pOworICAgICAgaW52X24gPSBHZXRJbnZJbnQoCisgICAgICAgICAgKHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV0gLSBzZmJPZmZzZXRbc2ZiICsgc2Zib2Zmc10pID4+CisgICAgICAgICAgMSk7ICAvLyBzY2FsZWQgd2l0aCAyIHRvIGNvbXBlbnNhdGUgZk11bHREaXYyKCkgaW4gc3Vic2VxdWVudCBsb29wCisgICAgICBzTCA9IGNhbGNTZmJNYXhTY2FsZShtZGN0U3BlY3RydW1MZWZ0LCBzZmJPZmZzZXRbc2ZiICsgc2Zib2Zmc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXRbc2ZiICsgc2Zib2ZmcyArIDFdKTsKKyAgICAgIHNSID0gY2FsY1NmYk1heFNjYWxlKG1kY3RTcGVjdHJ1bVJpZ2h0LCBzZmJPZmZzZXRbc2ZiICsgc2Zib2Zmc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXRbc2ZiICsgc2Zib2ZmcyArIDFdKTsKIAogICAgICAgbHIgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgIGZvciAoaj1zZmJPZmZzZXRbc2ZiK3NmYm9mZnNdOyBqPHNmYk9mZnNldFtzZmIrc2Zib2ZmcysxXTsgaisrKQotICAgICAgICBsciArPSBmTXVsdERpdjIoZk11bHREaXYyKG1kY3RTcGVjdHJ1bUxlZnRbal08PHNMLG1kY3RTcGVjdHJ1bVJpZ2h0W2pdPDxzUiksaW52X24pOwotICAgICAgbHIgPSBscjw8MTsKKyAgICAgIGZvciAoaiA9IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzXTsgaiA8IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV07IGorKykKKyAgICAgICAgbHIgKz0gZk11bHREaXYyKAorICAgICAgICAgICAgZk11bHREaXYyKG1kY3RTcGVjdHJ1bUxlZnRbal0gPDwgc0wsIG1kY3RTcGVjdHJ1bVJpZ2h0W2pdIDw8IHNSKSwKKyAgICAgICAgICAgIGludl9uKTsKKyAgICAgIGxyID0gbHIgPDwgMTsKIAogICAgICAgaWYgKGxyIDwgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKICAgICAgICAgLyogVGhpcyBtZWFucyBPVVQgT0YgcGhhc2UgaW50ZW5zaXR5IHN0ZXJlbywgY2YuIHN0YW5kYXJkICovCiAgICAgICAgIElOVCBzMCwgczEsIHMyOwogICAgICAgICBGSVhQX0RCTCB0bXAsIGQsIGVkID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKLSAgICAgICAgczAgPSBmaXhNaW4oc0wsc1IpOwotICAgICAgICBmb3IgKGo9c2ZiT2Zmc2V0W3NmYitzZmJvZmZzXTsgajxzZmJPZmZzZXRbc2ZiK3NmYm9mZnMrMV07IGorKykgewotICAgICAgICAgIGQgPSAoKG1kY3RTcGVjdHJ1bUxlZnRbal08PHMwKT4+MSkgLSAoKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdPDxzMCk+PjEpOwotICAgICAgICAgIGVkICs9IGZNdWx0RGl2MihkLGQpPj4oTURDVF9TUEVDX1NGLTEpOworICAgICAgICBzMCA9IGZpeE1pbihzTCwgc1IpOworICAgICAgICBmb3IgKGogPSBzZmJPZmZzZXRbc2ZiICsgc2Zib2Zmc107IGogPCBzZmJPZmZzZXRbc2ZiICsgc2Zib2ZmcyArIDFdOworICAgICAgICAgICAgIGorKykgeworICAgICAgICAgIGQgPSAoKG1kY3RTcGVjdHJ1bUxlZnRbal0gPDwgczApID4+IDEpIC0KKyAgICAgICAgICAgICAgKChtZGN0U3BlY3RydW1SaWdodFtqXSA8PCBzMCkgPj4gMSk7CisgICAgICAgICAgZWQgKz0gZk11bHREaXYyKGQsIGQpID4+IChNRENUX1NQRUNfU0YgLSAxKTsKICAgICAgICAgfQotICAgICAgICBtc01hc2tbc2ZiK3NmYm9mZnNdID0gMTsKLSAgICAgICAgdG1wID0gZkRpdk5vcm0oc2ZiRW5lcmd5TGVmdFtzZmIrc2Zib2Zmc10sZWQsJnMxKTsKLSAgICAgICAgczIgPSAoczEpICsgKDIqczApIC0gMiAtIE1EQ1RfU1BFQ19TRjsKKyAgICAgICAgbXNNYXNrW3NmYiArIHNmYm9mZnNdID0gMTsKKyAgICAgICAgdG1wID0gZkRpdk5vcm0oc2ZiRW5lcmd5TGVmdFtzZmIgKyBzZmJvZmZzXSwgZWQsICZzMSk7CisgICAgICAgIHMyID0gKHMxKSArICgyICogczApIC0gMiAtIE1EQ1RfU1BFQ19TRjsKICAgICAgICAgaWYgKHMyICYgMSkgewotICAgICAgICAgIHRtcCA9IHRtcD4+MTsKLSAgICAgICAgICBzMiA9IHMyKzE7Ci0gICAgICAgIH0KLSAgICAgICAgczIgPSAoczI+PjEpICsgMTsgIC8vICsxIGNvbXBlbnNhdGUgZk11bHREaXYyKCkgaW4gc3Vic2VxdWVudCBsb29wCi0gICAgICAgIHMyID0gZml4TWluKGZpeE1heChzMiwtKERGUkFDVF9CSVRTLTEpKSwoREZSQUNUX0JJVFMtMSkpOwotICAgICAgICBzY2FsZSA9IHNxcnRGaXhwKHRtcCk7Ci0gICAgICAgIGlmIChzMiA8IDApIHsKLSAgICAgICAgICBzMiA9IC1zMjsKLSAgICAgICAgICBmb3IgKGo9c2ZiT2Zmc2V0W3NmYitzZmJvZmZzXTsgajxzZmJPZmZzZXRbc2ZiK3NmYm9mZnMrMV07IGorKykgewotICAgICAgICAgICAgbWRjdFNwZWN0cnVtTGVmdFtqXSA9IChmTXVsdERpdjIobWRjdFNwZWN0cnVtTGVmdFtqXSxzY2FsZSkgLSBmTXVsdERpdjIobWRjdFNwZWN0cnVtUmlnaHRbal0sc2NhbGUpKSA+PiBzMjsKLSAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGZvciAoaj1zZmJPZmZzZXRbc2ZiK3NmYm9mZnNdOyBqPHNmYk9mZnNldFtzZmIrc2Zib2ZmcysxXTsgaisrKSB7Ci0gICAgICAgICAgICBtZGN0U3BlY3RydW1MZWZ0W2pdID0gKGZNdWx0RGl2MihtZGN0U3BlY3RydW1MZWZ0W2pdLHNjYWxlKSAtIGZNdWx0RGl2MihtZGN0U3BlY3RydW1SaWdodFtqXSxzY2FsZSkpIDw8IHMyOwotICAgICAgICAgICAgbWRjdFNwZWN0cnVtUmlnaHRbal0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAvKiBUaGlzIG1lYW5zIElOIHBoYXNlIGludGVuc2l0eSBzdGVyZW8sIGNmLiBzdGFuZGFyZCAqLwotICAgICAgICBJTlQgczAsczEsczI7Ci0gICAgICAgIEZJWFBfREJMIHRtcCwgcywgZXMgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLQotICAgICAgICBzMCA9IGZpeE1pbihzTCxzUik7Ci0gICAgICAgIGZvciAoaj1zZmJPZmZzZXRbc2ZiK3NmYm9mZnNdOyBqPHNmYk9mZnNldFtzZmIrc2Zib2ZmcysxXTsgaisrKSB7Ci0gICAgICAgICAgcyAgID0gKChtZGN0U3BlY3RydW1MZWZ0W2pdPDxzMCk+PjEpICsgKChtZGN0U3BlY3RydW1SaWdodFtqXTw8czApPj4xKTsKLSAgICAgICAgICBlcyArPSBmTXVsdERpdjIocyxzKT4+KE1EQ1RfU1BFQ19TRi0xKTsgICAgIC8vIHNjYWxlZCAyKihtZGN0U2NhbGUgLSBzMCArIDEpICsgTURDVF9TUEVDX1NGCi0gICAgICAgIH0KLSAgICAgICAgbXNNYXNrW3NmYitzZmJvZmZzXSA9IDA7Ci0gICAgICAgIHRtcCA9IGZEaXZOb3JtKHNmYkVuZXJneUxlZnRbc2ZiK3NmYm9mZnNdLGVzLCZzMSk7Ci0gICAgICAgIHMyID0gKHMxKSArICgyKnMwKSAtIDIgLSBNRENUX1NQRUNfU0Y7Ci0gICAgICAgIGlmIChzMiAmIDEpIHsKLSAgICAgICAgICB0bXAgPSB0bXA+PjE7CisgICAgICAgICAgdG1wID0gdG1wID4+IDE7CiAgICAgICAgICAgczIgPSBzMiArIDE7CiAgICAgICAgIH0KLSAgICAgICAgczIgPSAoczI+PjEpICsgMTsgLy8gKzEgY29tcGVuc2F0ZSBmTXVsdERpdjIoKSBpbiBzdWJzZXF1ZW50IGxvb3AKLSAgICAgICAgczIgPSBmaXhNaW4oZml4TWF4KHMyLC0oREZSQUNUX0JJVFMtMSkpLChERlJBQ1RfQklUUy0xKSk7CisgICAgICAgIHMyID0gKHMyID4+IDEpICsgMTsgIC8vICsxIGNvbXBlbnNhdGUgZk11bHREaXYyKCkgaW4gc3Vic2VxdWVudCBsb29wCisgICAgICAgIHMyID0gZml4TWluKGZpeE1heChzMiwgLShERlJBQ1RfQklUUyAtIDEpKSwgKERGUkFDVF9CSVRTIC0gMSkpOwogICAgICAgICBzY2FsZSA9IHNxcnRGaXhwKHRtcCk7CiAgICAgICAgIGlmIChzMiA8IDApIHsKICAgICAgICAgICBzMiA9IC1zMjsKLSAgICAgICAgICBmb3IgKGo9c2ZiT2Zmc2V0W3NmYitzZmJvZmZzXTsgajxzZmJPZmZzZXRbc2ZiK3NmYm9mZnMrMV07IGorKykgewotICAgICAgICAgICAgbWRjdFNwZWN0cnVtTGVmdFtqXSA9IChmTXVsdERpdjIobWRjdFNwZWN0cnVtTGVmdFtqXSxzY2FsZSkgKyBmTXVsdERpdjIobWRjdFNwZWN0cnVtUmlnaHRbal0sc2NhbGUpKSA+PiBzMjsKKyAgICAgICAgICBmb3IgKGogPSBzZmJPZmZzZXRbc2ZiICsgc2Zib2Zmc107IGogPCBzZmJPZmZzZXRbc2ZiICsgc2Zib2ZmcyArIDFdOworICAgICAgICAgICAgICAgaisrKSB7CisgICAgICAgICAgICBtZGN0U3BlY3RydW1MZWZ0W2pdID0gKGZNdWx0RGl2MihtZGN0U3BlY3RydW1MZWZ0W2pdLCBzY2FsZSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdERpdjIobWRjdFNwZWN0cnVtUmlnaHRbal0sIHNjYWxlKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMjsKKyAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAoaiA9IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzXTsgaiA8IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV07CisgICAgICAgICAgICAgICBqKyspIHsKKyAgICAgICAgICAgIG1kY3RTcGVjdHJ1bUxlZnRbal0gPSAoZk11bHREaXYyKG1kY3RTcGVjdHJ1bUxlZnRbal0sIHNjYWxlKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihtZGN0U3BlY3RydW1SaWdodFtqXSwgc2NhbGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHMyOwogICAgICAgICAgICAgbWRjdFNwZWN0cnVtUmlnaHRbal0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgZm9yIChqPXNmYk9mZnNldFtzZmIrc2Zib2Zmc107IGo8c2ZiT2Zmc2V0W3NmYitzZmJvZmZzKzFdOyBqKyspIHsKLSAgICAgICAgICAgIG1kY3RTcGVjdHJ1bUxlZnRbal0gPSAoZk11bHREaXYyKG1kY3RTcGVjdHJ1bUxlZnRbal0sc2NhbGUpICsgZk11bHREaXYyKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdLHNjYWxlKSkgPDwgczI7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBUaGlzIG1lYW5zIElOIHBoYXNlIGludGVuc2l0eSBzdGVyZW8sIGNmLiBzdGFuZGFyZCAqLworICAgICAgICBJTlQgczAsIHMxLCBzMjsKKyAgICAgICAgRklYUF9EQkwgdG1wLCBzLCBlcyA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworCisgICAgICAgIHMwID0gZml4TWluKHNMLCBzUik7CisgICAgICAgIGZvciAoaiA9IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzXTsgaiA8IHNmYk9mZnNldFtzZmIgKyBzZmJvZmZzICsgMV07CisgICAgICAgICAgICAgaisrKSB7CisgICAgICAgICAgcyA9ICgobWRjdFNwZWN0cnVtTGVmdFtqXSA8PCBzMCkgPj4gMSkgKworICAgICAgICAgICAgICAoKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdIDw8IHMwKSA+PiAxKTsKKyAgICAgICAgICBlcyArPSBmTXVsdERpdjIocywgcykgPj4KKyAgICAgICAgICAgICAgICAoTURDVF9TUEVDX1NGIC0KKyAgICAgICAgICAgICAgICAgMSk7ICAvLyBzY2FsZWQgMioobWRjdFNjYWxlIC0gczAgKyAxKSArIE1EQ1RfU1BFQ19TRgorICAgICAgICB9CisgICAgICAgIG1zTWFza1tzZmIgKyBzZmJvZmZzXSA9IDA7CisgICAgICAgIHRtcCA9IGZEaXZOb3JtKHNmYkVuZXJneUxlZnRbc2ZiICsgc2Zib2Zmc10sIGVzLCAmczEpOworICAgICAgICBzMiA9IChzMSkgKyAoMiAqIHMwKSAtIDIgLSBNRENUX1NQRUNfU0Y7CisgICAgICAgIGlmIChzMiAmIDEpIHsKKyAgICAgICAgICB0bXAgPSB0bXAgPj4gMTsKKyAgICAgICAgICBzMiA9IHMyICsgMTsKKyAgICAgICAgfQorICAgICAgICBzMiA9IChzMiA+PiAxKSArIDE7ICAvLyArMSBjb21wZW5zYXRlIGZNdWx0RGl2MigpIGluIHN1YnNlcXVlbnQgbG9vcAorICAgICAgICBzMiA9IGZpeE1pbihmaXhNYXgoczIsIC0oREZSQUNUX0JJVFMgLSAxKSksIChERlJBQ1RfQklUUyAtIDEpKTsKKyAgICAgICAgc2NhbGUgPSBzcXJ0Rml4cCh0bXApOworICAgICAgICBpZiAoczIgPCAwKSB7CisgICAgICAgICAgczIgPSAtczI7CisgICAgICAgICAgZm9yIChqID0gc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnNdOyBqIDwgc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnMgKyAxXTsKKyAgICAgICAgICAgICAgIGorKykgeworICAgICAgICAgICAgbWRjdFNwZWN0cnVtTGVmdFtqXSA9IChmTXVsdERpdjIobWRjdFNwZWN0cnVtTGVmdFtqXSwgc2NhbGUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHREaXYyKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdLCBzY2FsZSkpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczI7CisgICAgICAgICAgICBtZGN0U3BlY3RydW1SaWdodFtqXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKGogPSBzZmJPZmZzZXRbc2ZiICsgc2Zib2Zmc107IGogPCBzZmJPZmZzZXRbc2ZiICsgc2Zib2ZmcyArIDFdOworICAgICAgICAgICAgICAgaisrKSB7CisgICAgICAgICAgICBtZGN0U3BlY3RydW1MZWZ0W2pdID0gKGZNdWx0RGl2MihtZGN0U3BlY3RydW1MZWZ0W2pdLCBzY2FsZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdERpdjIobWRjdFNwZWN0cnVtUmlnaHRbal0sIHNjYWxlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzMjsKICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAKLSAgICAgIGlzQm9va1tzZmIrc2Zib2Zmc10gPSBDT0RFX0JPT0tfSVNfSU5fUEhBU0VfTk87CisgICAgICBpc0Jvb2tbc2ZiICsgc2Zib2Zmc10gPSBDT0RFX0JPT0tfSVNfSU5fUEhBU0VfTk87CiAKLSAgICAgIGlmICggcmVhbElzU2NhbGVbc2ZiK3NmYm9mZnNdIDwgRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7Ci0gICAgICAgIGlzU2NhbGVbc2ZiK3NmYm9mZnNdID0gKElOVCkoKChyZWFsSXNTY2FsZVtzZmIrc2Zib2Zmc10+PjEpLUZMMkZYQ09OU1RfREJMKDAuNWYvKDE8PChSRUFMX1NDQUxFX1NGK0xEX0RBVEFfU0hJRlQrMSkpKSk+PihERlJBQ1RfQklUUy0xLVJFQUxfU0NBTEVfU0YtTERfREFUQV9TSElGVC0xKSkgKyAxOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGlzU2NhbGVbc2ZiK3NmYm9mZnNdID0gKElOVCkoKChyZWFsSXNTY2FsZVtzZmIrc2Zib2Zmc10+PjEpK0ZMMkZYQ09OU1RfREJMKDAuNWYvKDE8PChSRUFMX1NDQUxFX1NGK0xEX0RBVEFfU0hJRlQrMSkpKSk+PihERlJBQ1RfQklUUy0xLVJFQUxfU0NBTEVfU0YtTERfREFUQV9TSElGVC0xKSk7CisgICAgICBpZiAocmVhbElzU2NhbGVbc2ZiICsgc2Zib2Zmc10gPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgICBpc1NjYWxlW3NmYiArIHNmYm9mZnNdID0KKyAgICAgICAgICAgIChJTlQpKCgocmVhbElzU2NhbGVbc2ZiICsgc2Zib2Zmc10gPj4gMSkgLQorICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKAorICAgICAgICAgICAgICAgICAgICAgICAwLjVmIC8gKDEgPDwgKFJFQUxfU0NBTEVfU0YgKyBMRF9EQVRBX1NISUZUICsgMSkpKSkgPj4KKyAgICAgICAgICAgICAgICAgIChERlJBQ1RfQklUUyAtIDEgLSBSRUFMX1NDQUxFX1NGIC0gTERfREFUQV9TSElGVCAtIDEpKSArCisgICAgICAgICAgICAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaXNTY2FsZVtzZmIgKyBzZmJvZmZzXSA9CisgICAgICAgICAgICAoSU5UKSgoKHJlYWxJc1NjYWxlW3NmYiArIHNmYm9mZnNdID4+IDEpICsKKyAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgKKyAgICAgICAgICAgICAgICAgICAgICAgMC41ZiAvICgxIDw8IChSRUFMX1NDQUxFX1NGICsgTERfREFUQV9TSElGVCArIDEpKSkpID4+CisgICAgICAgICAgICAgICAgICAoREZSQUNUX0JJVFMgLSAxIC0gUkVBTF9TQ0FMRV9TRiAtIExEX0RBVEFfU0hJRlQgLSAxKSk7CiAgICAgICB9CiAKLSAgICAgIHNmYkVuZXJneVJpZ2h0W3NmYitzZmJvZmZzXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgc2ZiRW5lcmd5TGREYXRhUmlnaHRbc2ZiK3NmYm9mZnNdID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOwotICAgICAgc2ZiVGhyZXNob2xkUmlnaHRbc2ZiK3NmYm9mZnNdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICBzZmJUaHJlc2hvbGRMZERhdGFSaWdodFtzZmIrc2Zib2Zmc10gPSBGTDJGWENPTlNUX0RCTCgtMC41MTU2MjVmKTsKLSAgICAgIHNmYlNwcmVhZEVuUmlnaHRbc2ZiK3NmYm9mZnNdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICBzZmJFbmVyZ3lSaWdodFtzZmIgKyBzZmJvZmZzXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgc2ZiRW5lcmd5TGREYXRhUmlnaHRbc2ZiICsgc2Zib2Zmc10gPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7CisgICAgICBzZmJUaHJlc2hvbGRSaWdodFtzZmIgKyBzZmJvZmZzXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgc2ZiVGhyZXNob2xkTGREYXRhUmlnaHRbc2ZiICsgc2Zib2Zmc10gPSBGTDJGWENPTlNUX0RCTCgtMC41MTU2MjVmKTsKKyAgICAgIHNmYlNwcmVhZEVuUmlnaHRbc2ZiICsgc2Zib2Zmc10gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKIAogICAgICAgKm1zRGlnZXN0ID0gTVNfU09NRTsKICAgICB9CiAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9pbnRlbnNpdHkuaCBiL2xpYkFBQ2VuYy9zcmMvaW50ZW5zaXR5LmgKaW5kZXggMmFjYzI5Mi4uNzBmMjNkNSAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9pbnRlbnNpdHkuaAorKysgYi9saWJBQUNlbmMvc3JjL2ludGVuc2l0eS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQ0ICs5MCwzMiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBBLiBIb3JuZGFzY2ggKGNvZGUgb3JpZ2luYWxseSBmcm9tIGx3ciBhbmQgcnRiKSAvIEpvc2VmIEj2cGZsIChGREspCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogaW50ZW5zaXR5IHN0ZXJlbyBwcm90b3R5cGUKKyAgIEF1dGhvcihzKTogICBBLiBIb3JuZGFzY2ggKGNvZGUgb3JpZ2luYWxseSBmcm9tIGx3ciBhbmQgcnRiKSAvIEpvc2VmIEhvZXBmbAorKEZESykKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IGludGVuc2l0eSBzdGVyZW8gcHJvdG90eXBlCiAKLSNpZm5kZWYgX0lOVEVOU0lUWV9ICi0jZGVmaW5lIF9JTlRFTlNJVFlfSAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBJTlRFTlNJVFlfSAorI2RlZmluZSBJTlRFTlNJVFlfSAogCiAjaW5jbHVkZSAiYWFjZW5jX3Bucy5oIgotCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCiB2b2lkIEZES2FhY0VuY19JbnRlbnNpdHlTdGVyZW9Qcm9jZXNzaW5nKAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICpzZmJFbmVyZ3lMZWZ0LAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICpzZmJFbmVyZ3lSaWdodCwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqbWRjdFNwZWN0cnVtTGVmdCwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqbWRjdFNwZWN0cnVtUmlnaHQsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYlRocmVzaG9sZExlZnQsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgKnNmYlRocmVzaG9sZFJpZ2h0LAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICpzZmJUaHJlc2hvbGRMZERhdGFSaWdodCwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAqc2ZiU3ByZWFkRW5MZWZ0LAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICpzZmJTcHJlYWRFblJpZ2h0LAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICpzZmJFbmVyZ3lMZERhdGFMZWZ0LAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICpzZmJFbmVyZ3lMZERhdGFSaWdodCwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAqbXNEaWdlc3QsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgKm1zTWFzaywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgc2ZiQ250LAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBzZmJQZXJHcm91cCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgKnNmYk9mZnNldCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgYWxsb3dJUywKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAqaXNCb29rLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICppc1NjYWxlLAotICAgICAgICBQTlNfREFUQSAgICAgICAgICpSRVNUUklDVCBwbnNEYXRhWzJdCi0gICAgICAgICk7CisgICAgRklYUF9EQkwgKnNmYkVuZXJneUxlZnQsIEZJWFBfREJMICpzZmJFbmVyZ3lSaWdodCwKKyAgICBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtTGVmdCwgRklYUF9EQkwgKm1kY3RTcGVjdHJ1bVJpZ2h0LAorICAgIEZJWFBfREJMICpzZmJUaHJlc2hvbGRMZWZ0LCBGSVhQX0RCTCAqc2ZiVGhyZXNob2xkUmlnaHQsCisgICAgRklYUF9EQkwgKnNmYlRocmVzaG9sZExkRGF0YVJpZ2h0LCBGSVhQX0RCTCAqc2ZiU3ByZWFkRW5MZWZ0LAorICAgIEZJWFBfREJMICpzZmJTcHJlYWRFblJpZ2h0LCBGSVhQX0RCTCAqc2ZiRW5lcmd5TGREYXRhTGVmdCwKKyAgICBGSVhQX0RCTCAqc2ZiRW5lcmd5TGREYXRhUmlnaHQsIElOVCAqbXNEaWdlc3QsIElOVCAqbXNNYXNrLAorICAgIGNvbnN0IElOVCBzZmJDbnQsIGNvbnN0IElOVCBzZmJQZXJHcm91cCwgY29uc3QgSU5UIG1heFNmYlBlckdyb3VwLAorICAgIGNvbnN0IElOVCAqc2ZiT2Zmc2V0LCBjb25zdCBJTlQgYWxsb3dJUywgSU5UICppc0Jvb2ssIElOVCAqaXNTY2FsZSwKKyAgICBQTlNfREFUQSAqUkVTVFJJQ1QgcG5zRGF0YVsyXSk7CiAKLSNlbmRpZiAvKiBfSU5URU5TSVRZX0ggKi8KLQorI2VuZGlmIC8qIElOVEVOU0lUWV9IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2ludGVyZmFjZS5oIGIvbGliQUFDZW5jL3NyYy9pbnRlcmZhY2UuaAppbmRleCA1MWZiNzJhLi5iMWEzMWVmIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2ludGVyZmFjZS5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvaW50ZXJmYWNlLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTcgKzkwLDE4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogSW50ZXJmYWNlIHBzeWNob2FjY291c3RpYy9xdWFudGl6ZXIKKyAgIEF1dGhvcihzKTogICBNLldlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogSW50ZXJmYWNlIHBzeWNob2FjY291c3RpYy9xdWFudGl6ZXIKIAotI2lmbmRlZiBfSU5URVJGQUNFX0gKLSNkZWZpbmUgX0lOVEVSRkFDRV9ICisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIElOVEVSRkFDRV9ICisjZGVmaW5lIElOVEVSRkFDRV9ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCkBAIC05Nyw3MyArMTA5LDYwIEBACiAjaW5jbHVkZSAicHN5X2RhdGEuaCIKICNpbmNsdWRlICJhYWNlbmNfdG5zLmgiCiAKLWVudW0KLXsKLSAgTVNfTk9ORSA9IDAsCi0gIE1TX1NPTUUgPSAxLAotICBNU19BTEwgID0gMgotfTsKK2VudW0geyBNU19OT05FID0gMCwgTVNfU09NRSA9IDEsIE1TX0FMTCA9IDIgfTsKIAotZW51bQotewotICBNU19PTiA9IDEKLX07CitlbnVtIHsgTVNfT04gPSAxIH07CiAKIHN0cnVjdCBUT09MU0lORk8gewotICBJTlQgbXNEaWdlc3Q7ICAgICAvKiAwID0gbm8gTVM7IDEgPSBzb21lIE1TLCAyID0gYWxsIE1TICovCisgIElOVCBtc0RpZ2VzdDsgLyogMCA9IG5vIE1TOyAxID0gc29tZSBNUywgMiA9IGFsbCBNUyAqLwogICBJTlQgbXNNYXNrW01BWF9HUk9VUEVEX1NGQl07CiB9OwogCit0eXBlZGVmIHN0cnVjdCB7CisgIElOVCBzZmJDbnQ7CisgIElOVCBzZmJQZXJHcm91cDsKKyAgSU5UIG1heFNmYlBlckdyb3VwOworICBJTlQgbGFzdFdpbmRvd1NlcXVlbmNlOworICBJTlQgd2luZG93U2hhcGU7CisgIElOVCBncm91cGluZ01hc2s7CisgIElOVCBzZmJPZmZzZXRzW01BWF9HUk9VUEVEX1NGQiArIDFdOwogCi10eXBlZGVmIHN0cnVjdCAgewotICBJTlQgICAgICAgc2ZiQ250OwotICBJTlQgICAgICAgc2ZiUGVyR3JvdXA7Ci0gIElOVCAgICAgICBtYXhTZmJQZXJHcm91cDsKLSAgSU5UICAgICAgIGxhc3RXaW5kb3dTZXF1ZW5jZTsKLSAgSU5UICAgICAgIHdpbmRvd1NoYXBlOwotICBJTlQgICAgICAgZ3JvdXBpbmdNYXNrOwotICBJTlQgICAgICAgc2ZiT2Zmc2V0c1tNQVhfR1JPVVBFRF9TRkIrMV07CisgIElOVCBtZGN0U2NhbGU7IC8qIG51bWJlciBvZiB0cmFuc2Zvcm0gc2hpZnRzICovCisgIElOVCBncm91cExlbltNQVhfTk9fT0ZfR1JPVVBTXTsKIAotICBJTlQgICAgICAgbWRjdFNjYWxlOyAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgdHJhbnNmb3JtIHNoaWZ0cyAqLwotICBJTlQgICAgICAgZ3JvdXBMZW5bTUFYX05PX09GX0dST1VQU107Ci0KLSAgVE5TX0lORk8gIHRuc0luZm87Ci0gIElOVCAgICAgICBub2lzZU5yZ1tNQVhfR1JPVVBFRF9TRkJdOwotICBJTlQgICAgICAgaXNCb29rW01BWF9HUk9VUEVEX1NGQl07Ci0gIElOVCAgICAgICBpc1NjYWxlW01BWF9HUk9VUEVEX1NGQl07CisgIFROU19JTkZPIHRuc0luZm87CisgIElOVCBub2lzZU5yZ1tNQVhfR1JPVVBFRF9TRkJdOworICBJTlQgaXNCb29rW01BWF9HUk9VUEVEX1NGQl07CisgIElOVCBpc1NjYWxlW01BWF9HUk9VUEVEX1NGQl07CiAKICAgLyogbWVtb3J5IGxvY2F0ZWQgaW4gUUNfT1VUX0NIQU5ORUwgKi8KLSAgRklYUF9EQkwgICptZGN0U3BlY3RydW07Ci0gIEZJWFBfREJMICAqc2ZiRW5lcmd5OwotICBGSVhQX0RCTCAgKnNmYlNwcmVhZEVuZXJneTsKLSAgRklYUF9EQkwgICpzZmJUaHJlc2hvbGRMZERhdGE7Ci0gIEZJWFBfREJMICAqc2ZiTWluU25yTGREYXRhOwotICBGSVhQX0RCTCAgKnNmYkVuZXJneUxkRGF0YTsKKyAgRklYUF9EQkwgKm1kY3RTcGVjdHJ1bTsKKyAgRklYUF9EQkwgKnNmYkVuZXJneTsKKyAgRklYUF9EQkwgKnNmYlNwcmVhZEVuZXJneTsKKyAgRklYUF9EQkwgKnNmYlRocmVzaG9sZExkRGF0YTsKKyAgRklYUF9EQkwgKnNmYk1pblNuckxkRGF0YTsKKyAgRklYUF9EQkwgKnNmYkVuZXJneUxkRGF0YTsKIAotCi0gfVBTWV9PVVRfQ0hBTk5FTDsKK30gUFNZX09VVF9DSEFOTkVMOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0KICAgLyogaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gZWFjaCBjaGFubmVsICovCi0gIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsoMildOworICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5uZWxbKDIpXTsKIAogICAvKiBpbmZvcm1hdGlvbiBzaGFyZWQgYnkgYm90aCBjaGFubmVscyAgKi8KLSAgSU5UICAgICAgIGNvbW1vbldpbmRvdzsKKyAgSU5UIGNvbW1vbldpbmRvdzsKICAgc3RydWN0IFRPT0xTSU5GTyB0b29sc0luZm87CiAKIH0gUFNZX09VVF9FTEVNRU5UOwogCiB0eXBlZGVmIHN0cnVjdCB7CisgIFBTWV9PVVRfRUxFTUVOVCAqcHN5T3V0RWxlbWVudFsoKDgpKV07CisgIFBTWV9PVVRfQ0hBTk5FTCAqcFBzeU91dENoYW5uZWxzWyg4KV07CiAKLSAgUFNZX09VVF9FTEVNRU5UKiBwc3lPdXRFbGVtZW50Wyg4KV07Ci0gIFBTWV9PVVRfQ0hBTk5FTCogcFBzeU91dENoYW5uZWxzWyg4KV07Cit9IFBTWV9PVVQ7CiAKLX1QU1lfT1VUOwotCi1pbmxpbmUgaW50IGlzTG93RGVsYXkoIEFVRElPX09CSkVDVF9UWVBFIGFvdCApCi17Ci0gIHJldHVybiAoYW90PT1BT1RfRVJfQUFDX0xEIHx8IGFvdD09QU9UX0VSX0FBQ19FTEQpOworaW5saW5lIGludCBpc0xvd0RlbGF5KEFVRElPX09CSkVDVF9UWVBFIGFvdCkgeworICByZXR1cm4gKGFvdCA9PSBBT1RfRVJfQUFDX0xEIHx8IGFvdCA9PSBBT1RfRVJfQUFDX0VMRCk7CiB9CiAKLSNlbmRpZiAvKiBfSU5URVJGQUNFX0ggKi8KKyNlbmRpZiAvKiBJTlRFUkZBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9saW5lX3BlLmNwcCBiL2xpYkFBQ2VuYy9zcmMvbGluZV9wZS5jcHAKaW5kZXggZjNjMGRhYi4uNDc3MzRlNSAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9saW5lX3BlLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL2xpbmVfcGUuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBXZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBQZXJjZXB0dWFsIGVudHJvcGllIG1vZHVsZQorICAgQXV0aG9yKHMpOiAgIE0uIFdlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogUGVyY2VwdHVhbCBlbnRyb3BpZSBtb2R1bGUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImxpbmVfcGUuaCIKICNpbmNsdWRlICJzZl9lc3RpbS5oIgpAQCAtOTQsNDIgKzEwNiw0NyBAQAogCiAjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKIAotc3RhdGljIGNvbnN0IEZJWFBfREJMIEMxTGREYXRhID0gRkwyRlhDT05TVF9EQkwoMy4wL0xEX0RBVEFfU0NBTElORyk7ICAgICAgICAvKiBDMSA9IDMuMCA9IGxvZyg4LjApL2xvZygyKSAqLwotc3RhdGljIGNvbnN0IEZJWFBfREJMIEMyTGREYXRhID0gRkwyRlhDT05TVF9EQkwoMS4zMjE5MjgxL0xEX0RBVEFfU0NBTElORyk7ICAvKiBDMiA9IDEuMzIxOTI4MSA9IGxvZygyLjUpL2xvZygyKSAqLwotc3RhdGljIGNvbnN0IEZJWFBfREJMIEMzTGREYXRhID0gRkwyRlhDT05TVF9EQkwoMC41NTkzNTczKTsgICAgICAgICAgICAgICAgICAvKiAxLUMyL0MxICovCi0KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBDMUxkRGF0YSA9CisgICAgRkwyRlhDT05TVF9EQkwoMy4wIC8gTERfREFUQV9TQ0FMSU5HKTsgLyogQzEgPSAzLjAgPSBsb2coOC4wKS9sb2coMikgKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBDMkxkRGF0YSA9IEZMMkZYQ09OU1RfREJMKAorICAgIDEuMzIxOTI4MSAvIExEX0RBVEFfU0NBTElORyk7IC8qIEMyID0gMS4zMjE5MjgxID0gbG9nKDIuNSkvbG9nKDIpICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgQzNMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgwLjU1OTM1NzMpOyAvKiAxLUMyL0MxICovCiAKIC8qIGNvbnN0YW50cyB0aGF0IGRvIG5vdCBjaGFuZ2UgZHVyaW5nIHN1Y2Nlc3NpdmUgcGUgY2FsY3VsYXRpb25zICovCi12b2lkIEZES2FhY0VuY19wcmVwYXJlU2ZiUGUoUEVfQ0hBTk5FTF9EQVRBICpwZUNoYW5EYXRhLAotICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICpzZmJFbmVyZ3lMZERhdGEsCi0gICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgKnNmYlRocmVzaG9sZExkRGF0YSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAqc2ZiRm9ybUZhY3RvckxkRGF0YSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBtYXhTZmJQZXJHcm91cCkKLXsKLSAgIElOVCBzZmJHcnAsc2ZiOwotICAgSU5UIHNmYldpZHRoOwotICAgRklYUF9EQkwgYXZnRm9ybUZhY3RvckxkRGF0YTsKLSAgIGNvbnN0IEZJWFBfREJMIGZvcm1GYWNTY2FsaW5nID0gRkwyRlhDT05TVF9EQkwoKGZsb2F0KUZPUk1fRkFDX1NISUZUL0xEX0RBVEFfU0NBTElORyk7Cit2b2lkIEZES2FhY0VuY19wcmVwYXJlU2ZiUGUoUEVfQ0hBTk5FTF9EQVRBICpSRVNUUklDVCBjb25zdCBwZUNoYW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBjb25zdCBzZmJFbmVyZ3lMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIGNvbnN0IHNmYlRocmVzaG9sZExkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgY29uc3Qgc2ZiRm9ybUZhY3RvckxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKlJFU1RSSUNUIGNvbnN0IHNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2ZiQ250LCBjb25zdCBJTlQgc2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG1heFNmYlBlckdyb3VwKSB7CisgIElOVCBzZmJHcnAsIHNmYjsKKyAgSU5UIHNmYldpZHRoOworICBGSVhQX0RCTCBhdmdGb3JtRmFjdG9yTGREYXRhOworICBjb25zdCBGSVhQX0RCTCBmb3JtRmFjU2NhbGluZyA9CisgICAgICBGTDJGWENPTlNUX0RCTCgoZmxvYXQpRk9STV9GQUNfU0hJRlQgLyBMRF9EQVRBX1NDQUxJTkcpOwogCi0gICBmb3IgKHNmYkdycCA9IDA7c2ZiR3JwIDwgc2ZiQ250O3NmYkdycCs9c2ZiUGVyR3JvdXApIHsKLSAgICBmb3IgKHNmYj0wOyBzZmI8bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICBpZiAoKEZJWFBfREJMKXNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSA+IChGSVhQX0RCTClzZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0pIHsKLSAgICAgICAgIHNmYldpZHRoID0gc2ZiT2Zmc2V0W3NmYkdycCtzZmIrMV0gLSBzZmJPZmZzZXRbc2ZiR3JwK3NmYl07Ci0gICAgICAgICAvKiBlc3RpbWF0ZSBudW1iZXIgb2YgYWN0aXZlIGxpbmVzICovCi0gICAgICAgICBhdmdGb3JtRmFjdG9yTGREYXRhID0gKCgtc2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdPj4xKSArIChDYWxjTGRJbnQoc2ZiV2lkdGgpPj4xKSk+PjE7Ci0gICAgICAgICBwZUNoYW5EYXRhLT5zZmJOTGluZXNbc2ZiR3JwK3NmYl0gPQotICAgICAgICAgICAoSU5UKUNhbGNJbnZMZERhdGEoIChzZmJGb3JtRmFjdG9yTGREYXRhW3NmYkdycCtzZmJdICsgZm9ybUZhY1NjYWxpbmcpICsgYXZnRm9ybUZhY3RvckxkRGF0YSk7Ci0gICAgICAgICAvKiBNYWtlIHN1cmUgc2ZiTkxpbmVzIGlzIG5ldmVyIGdyZWF0ZXIgdGhhbiBzZmJXaWR0aCBkdWUgdG8gdW5hY2N1cmFjaWVzIChlLmcuIHNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSA9IDB4ODAwMDAwMDApICovCi0gICAgICAgICBwZUNoYW5EYXRhLT5zZmJOTGluZXNbc2ZiR3JwK3NmYl0gPSBmTWluKHNmYldpZHRoLCBwZUNoYW5EYXRhLT5zZmJOTGluZXNbc2ZiR3JwK3NmYl0pOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgICBwZUNoYW5EYXRhLT5zZmJOTGluZXNbc2ZiR3JwK3NmYl0gPSAwOworICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHNmYkNudDsgc2ZiR3JwICs9IHNmYlBlckdyb3VwKSB7CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBtYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgIGlmICgoRklYUF9EQkwpc2ZiRW5lcmd5TGREYXRhW3NmYkdycCArIHNmYl0gPgorICAgICAgICAgIChGSVhQX0RCTClzZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwICsgc2ZiXSkgeworICAgICAgICBzZmJXaWR0aCA9IHNmYk9mZnNldFtzZmJHcnAgKyBzZmIgKyAxXSAtIHNmYk9mZnNldFtzZmJHcnAgKyBzZmJdOworICAgICAgICAvKiBlc3RpbWF0ZSBudW1iZXIgb2YgYWN0aXZlIGxpbmVzICovCisgICAgICAgIGF2Z0Zvcm1GYWN0b3JMZERhdGEgPSAoKC1zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwICsgc2ZiXSA+PiAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENhbGNMZEludChzZmJXaWR0aCkgPj4gMSkpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOworICAgICAgICBwZUNoYW5EYXRhLT5zZmJOTGluZXNbc2ZiR3JwICsgc2ZiXSA9IChJTlQpQ2FsY0ludkxkRGF0YSgKKyAgICAgICAgICAgIChzZmJGb3JtRmFjdG9yTGREYXRhW3NmYkdycCArIHNmYl0gKyBmb3JtRmFjU2NhbGluZykgKworICAgICAgICAgICAgYXZnRm9ybUZhY3RvckxkRGF0YSk7CisgICAgICAgIC8qIE1ha2Ugc3VyZSBzZmJOTGluZXMgaXMgbmV2ZXIgZ3JlYXRlciB0aGFuIHNmYldpZHRoIGR1ZSB0bworICAgICAgICAgKiB1bmFjY3VyYWNpZXMgKGUuZy4gc2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdID0gMHg4MDAwMDAwMCkgKi8KKyAgICAgICAgcGVDaGFuRGF0YS0+c2ZiTkxpbmVzW3NmYkdycCArIHNmYl0gPQorICAgICAgICAgICAgZk1pbihzZmJXaWR0aCwgcGVDaGFuRGF0YS0+c2ZiTkxpbmVzW3NmYkdycCArIHNmYl0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGVDaGFuRGF0YS0+c2ZiTkxpbmVzW3NmYkdycCArIHNmYl0gPSAwOwogICAgICAgfQogICAgIH0KLSAgIH0KKyAgfQogfQogCiAvKgpAQCAtMTQxLDY5ICsxNTgsNzcgQEAKIAogICAgY29uc3RQYXJ0IGlzIHNmYlBlIHdpdGhvdXQgdGhlIHRocmVzaG9sZCBwYXJ0IG4qbGQodGhyKSBvciBuKkMzKmxkKHRocikKICovCi12b2lkIEZES2FhY0VuY19jYWxjU2ZiUGUoUEVfQ0hBTk5FTF9EQVRBICAqUkVTVFJJQ1QgcGVDaGFuRGF0YSwKLSAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAgKlJFU1RSSUNUIHNmYkVuZXJneUxkRGF0YSwKLSAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAgKlJFU1RSSUNUIHNmYlRocmVzaG9sZExkRGF0YSwKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgc2ZiQ250LAotICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgKmlzQm9vaywKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAqaXNTY2FsZSkKLXsKLSAgIElOVCBzZmJHcnAsc2ZiOwotICAgSU5UIG5MaW5lczsKLSAgIEZJWFBfREJMIGxvZ0RhdGFSYXRpbzsKLSAgIElOVCBsYXN0VmFsSXMgPSAwOwordm9pZCBGREthYWNFbmNfY2FsY1NmYlBlKFBFX0NIQU5ORUxfREFUQSAqUkVTVFJJQ1QgY29uc3QgcGVDaGFuRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgY29uc3Qgc2ZiRW5lcmd5TGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBjb25zdCBzZmJUaHJlc2hvbGRMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNmYkNudCwgY29uc3QgSU5UIHNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBtYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKlJFU1RSSUNUIGNvbnN0IGlzQm9vaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKlJFU1RSSUNUIGNvbnN0IGlzU2NhbGUpIHsKKyAgSU5UIHNmYkdycCwgc2ZiLCB0aGlzU2ZiOworICBJTlQgbkxpbmVzOworICBGSVhQX0RCTCBsb2dEYXRhUmF0aW87CisgIEZJWFBfREJMIHNjYWxlTGQgPSAoRklYUF9EQkwpMDsKKyAgSU5UIGxhc3RWYWxJcyA9IDA7CiAKLSAgIHBlQ2hhbkRhdGEtPnBlID0gMDsKLSAgIHBlQ2hhbkRhdGEtPmNvbnN0UGFydCA9IDA7Ci0gICBwZUNoYW5EYXRhLT5uQWN0aXZlTGluZXMgPSAwOworICBGSVhQX0RCTCBwZSA9IDA7CisgIEZJWFBfREJMIGNvbnN0UGFydCA9IDA7CisgIEZJWFBfREJMIG5BY3RpdmVMaW5lcyA9IDA7CiAKLSAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHNmYkNudDtzZmJHcnArPXNmYlBlckdyb3VwKXsKLSAgICBmb3IgKHNmYj0wOyBzZmI8bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICBpZiAoKEZJWFBfREJMKXNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSA+IChGSVhQX0RCTClzZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwK3NmYl0pIHsKLSAgICAgICAgIGxvZ0RhdGFSYXRpbyA9IChGSVhQX0RCTCkoc2ZiRW5lcmd5TGREYXRhW3NmYkdycCtzZmJdIC0gc2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdKTsKLSAgICAgICAgIG5MaW5lcyA9IHBlQ2hhbkRhdGEtPnNmYk5MaW5lc1tzZmJHcnArc2ZiXTsKLSAgICAgICAgIGlmIChsb2dEYXRhUmF0aW8gPj0gQzFMZERhdGEpIHsKLSAgICAgICAgICAgIC8qIHNjYWxlIHNmYlBlIGFuZCBzZmJDb25zdFBhcnQgd2l0aCBQRV9DT05TVFBBUlRfU0hJRlQgKi8KLSAgICAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYlBlW3NmYkdycCtzZmJdID0gZk11bHREaXYyKGxvZ0RhdGFSYXRpbywgKEZJWFBfREJMKShuTGluZXM8PChMRF9EQVRBX1NISUZUK1BFX0NPTlNUUEFSVF9TSElGVCsxKSkpOwotICAgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdID0KLSAgICAgICAgICAgICAgICAgICAgZk11bHREaXYyKHNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSwgKEZJWFBfREJMKShuTGluZXM8PChMRF9EQVRBX1NISUZUK1BFX0NPTlNUUEFSVF9TSElGVCsxKSkpOyA7CisgIEZJWFBfREJMIHRtcFBlLCB0bXBDb25zdFBhcnQsIHRtcE5BY3RpdmVMaW5lczsKIAotICAgICAgICAgfQotICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiBzY2FsZSBzZmJQZSBhbmQgc2ZiQ29uc3RQYXJ0IHdpdGggUEVfQ09OU1RQQVJUX1NISUZUICovCi0gICAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJQZVtzZmJHcnArc2ZiXSA9Ci0gICAgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoKChGSVhQX0RCTClDMkxkRGF0YSArIGZNdWx0KEMzTGREYXRhLGxvZ0RhdGFSYXRpbykpLCAoRklYUF9EQkwpKG5MaW5lczw8KExEX0RBVEFfU0hJRlQrUEVfQ09OU1RQQVJUX1NISUZUKzEpKSk7CisgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgc2ZiQ250OyBzZmJHcnAgKz0gc2ZiUGVyR3JvdXApIHsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgdG1wUGUgPSAoRklYUF9EQkwpMDsKKyAgICAgIHRtcENvbnN0UGFydCA9IChGSVhQX0RCTCkwOworICAgICAgdG1wTkFjdGl2ZUxpbmVzID0gKEZJWFBfREJMKTA7CiAKLSAgICAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYkNvbnN0UGFydFtzZmJHcnArc2ZiXSA9Ci0gICAgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoKChGSVhQX0RCTClDMkxkRGF0YSArIGZNdWx0KEMzTGREYXRhLHNmYkVuZXJneUxkRGF0YVtzZmJHcnArc2ZiXSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKShuTGluZXM8PChMRF9EQVRBX1NISUZUK1BFX0NPTlNUUEFSVF9TSElGVCsxKSkpIDsKKyAgICAgIHRoaXNTZmIgPSBzZmJHcnAgKyBzZmI7CiAKLSAgICAgICAgICAgIG5MaW5lcyA9IGZNdWx0SShDM0xkRGF0YSwgbkxpbmVzKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXSA9IG5MaW5lczsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoIGlzQm9va1tzZmJHcnArc2ZiXSApIHsKKyAgICAgIGlmIChzZmJFbmVyZ3lMZERhdGFbdGhpc1NmYl0gPiBzZmJUaHJlc2hvbGRMZERhdGFbdGhpc1NmYl0pIHsKKyAgICAgICAgbG9nRGF0YVJhdGlvID0gc2ZiRW5lcmd5TGREYXRhW3RoaXNTZmJdIC0gc2ZiVGhyZXNob2xkTGREYXRhW3RoaXNTZmJdOworICAgICAgICBuTGluZXMgPSBwZUNoYW5EYXRhLT5zZmJOTGluZXNbdGhpc1NmYl07CisKKyAgICAgICAgRklYUF9EQkwgZmFjdG9yID0gbkxpbmVzIDw8IChMRF9EQVRBX1NISUZUICsgUEVfQ09OU1RQQVJUX1NISUZUICsgMSk7CisgICAgICAgIGlmIChsb2dEYXRhUmF0aW8gPj0gQzFMZERhdGEpIHsKKyAgICAgICAgICAvKiBzY2FsZSBzZmJQZSBhbmQgc2ZiQ29uc3RQYXJ0IHdpdGggUEVfQ09OU1RQQVJUX1NISUZUICovCisgICAgICAgICAgdG1wUGUgPSBmTXVsdERpdjIobG9nRGF0YVJhdGlvLCBmYWN0b3IpOworICAgICAgICAgIHRtcENvbnN0UGFydCA9IGZNdWx0RGl2MihzZmJFbmVyZ3lMZERhdGFbdGhpc1NmYl0gKyBzY2FsZUxkLCBmYWN0b3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIHNjYWxlIHNmYlBlIGFuZCBzZmJDb25zdFBhcnQgd2l0aCBQRV9DT05TVFBBUlRfU0hJRlQgKi8KKyAgICAgICAgICB0bXBQZSA9IGZNdWx0RGl2MigKKyAgICAgICAgICAgICAgKChGSVhQX0RCTClDMkxkRGF0YSArIGZNdWx0KEMzTGREYXRhLCBsb2dEYXRhUmF0aW8pKSwgZmFjdG9yKTsKKyAgICAgICAgICB0bXBDb25zdFBhcnQgPQorICAgICAgICAgICAgICBmTXVsdERpdjIoKChGSVhQX0RCTClDMkxkRGF0YSArCisgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQoQzNMZERhdGEsIHNmYkVuZXJneUxkRGF0YVt0aGlzU2ZiXSArIHNjYWxlTGQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcik7CisKKyAgICAgICAgICBuTGluZXMgPSBmTXVsdEkoQzNMZERhdGEsIG5MaW5lcyk7CisgICAgICAgIH0KKyAgICAgICAgdG1wTkFjdGl2ZUxpbmVzID0gKEZJWFBfREJMKW5MaW5lczsKKyAgICAgIH0gZWxzZSBpZiAoaXNCb29rW3RoaXNTZmJdKSB7CiAgICAgICAgIC8qIHByb3ZpZGUgZm9yIGNvc3Qgb2Ygc2NhbGUgZmFjdG9yIGZvciBJbnRlbnNpdHkgKi8KLSAgICAgICAgSU5UIGRlbHRhID0gaXNTY2FsZVtzZmJHcnArc2ZiXSAtIGxhc3RWYWxJczsKLSAgICAgICAgbGFzdFZhbElzID0gaXNTY2FsZVtzZmJHcnArc2ZiXTsKLSAgICAgICAgcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl0gPSBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKGRlbHRhKTw8UEVfQ09OU1RQQVJUX1NISUZUOwotICAgICAgICBwZUNoYW5EYXRhLT5zZmJDb25zdFBhcnRbc2ZiR3JwK3NmYl0gPSAwOwotICAgICAgICBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl0gPSAwOworICAgICAgICBJTlQgZGVsdGEgPSBpc1NjYWxlW3RoaXNTZmJdIC0gbGFzdFZhbElzOworICAgICAgICBsYXN0VmFsSXMgPSBpc1NjYWxlW3RoaXNTZmJdOworICAgICAgICBwZUNoYW5EYXRhLT5zZmJQZVt0aGlzU2ZiXSA9IEZES2FhY0VuY19iaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoZGVsdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgUEVfQ09OU1RQQVJUX1NISUZUOworICAgICAgICBwZUNoYW5EYXRhLT5zZmJDb25zdFBhcnRbdGhpc1NmYl0gPSAwOworICAgICAgICBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbdGhpc1NmYl0gPSAwOwogICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgICBwZUNoYW5EYXRhLT5zZmJQZVtzZmJHcnArc2ZiXSA9IDA7Ci0gICAgICAgICBwZUNoYW5EYXRhLT5zZmJDb25zdFBhcnRbc2ZiR3JwK3NmYl0gPSAwOwotICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdID0gMDsKLSAgICAgIH0KKyAgICAgIHBlQ2hhbkRhdGEtPnNmYlBlW3RoaXNTZmJdID0gdG1wUGU7CisgICAgICBwZUNoYW5EYXRhLT5zZmJDb25zdFBhcnRbdGhpc1NmYl0gPSB0bXBDb25zdFBhcnQ7CisgICAgICBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbdGhpc1NmYl0gPSB0bXBOQWN0aXZlTGluZXM7CisKICAgICAgIC8qIHN1bSB1cCBwZUNoYW5EYXRhIHZhbHVlcyAqLwotICAgICAgcGVDaGFuRGF0YS0+cGUgKz0gcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl07Ci0gICAgICBwZUNoYW5EYXRhLT5jb25zdFBhcnQgKz0gcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdOwotICAgICAgcGVDaGFuRGF0YS0+bkFjdGl2ZUxpbmVzICs9IHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXTsKKyAgICAgIHBlICs9IHRtcFBlOworICAgICAgY29uc3RQYXJ0ICs9IHRtcENvbnN0UGFydDsKKyAgICAgIG5BY3RpdmVMaW5lcyArPSB0bXBOQWN0aXZlTGluZXM7CiAgICAgfQotICAgfQotICAgLyogY29ycmVjdCBzY2FsZWQgcGUgYW5kIGNvbnN0UGFydCB2YWx1ZXMgKi8KLSAgIHBlQ2hhbkRhdGEtPnBlPj49UEVfQ09OU1RQQVJUX1NISUZUOwotICAgcGVDaGFuRGF0YS0+Y29uc3RQYXJ0Pj49UEVfQ09OU1RQQVJUX1NISUZUOworICB9CisKKyAgLyogY29ycmVjdCBzY2FsZWQgcGUgYW5kIGNvbnN0UGFydCB2YWx1ZXMgKi8KKyAgcGVDaGFuRGF0YS0+cGUgPSBwZSA+PiBQRV9DT05TVFBBUlRfU0hJRlQ7CisgIHBlQ2hhbkRhdGEtPmNvbnN0UGFydCA9IGNvbnN0UGFydCA+PiBQRV9DT05TVFBBUlRfU0hJRlQ7CisKKyAgcGVDaGFuRGF0YS0+bkFjdGl2ZUxpbmVzID0gbkFjdGl2ZUxpbmVzOwogfQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9saW5lX3BlLmggYi9saWJBQUNlbmMvc3JjL2xpbmVfcGUuaAppbmRleCAzZDVjZmQ1Li5lY2MyMzg4IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2xpbmVfcGUuaAorKysgYi9saWJBQUNlbmMvc3JjL2xpbmVfcGUuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw2MSArOTAsNTkgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogUGVyY2VwdHVhbCBlbnRyb3BpZSBtb2R1bGUKKyAgIEF1dGhvcihzKTogICBNLiBXZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX0xJTkVfUEVfSAotI2RlZmluZSBfX0xJTkVfUEVfSAorICAgRGVzY3JpcHRpb246IFBlcmNlcHR1YWwgZW50cm9waWUgbW9kdWxlCiAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTElORV9QRV9ICisjZGVmaW5lIExJTkVfUEVfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCiAjaW5jbHVkZSAicHN5X2NvbnN0LmgiCiAKLSNkZWZpbmUgUEVfQ09OU1RQQVJUX1NISUZUICBGUkFDVF9CSVRTCisjZGVmaW5lIFBFX0NPTlNUUEFSVF9TSElGVCBGUkFDVF9CSVRTCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgIC8qIGNhbGN1bGF0ZWQgYnkgRkRLYWFjRW5jX3ByZXBhcmVTZmJQZSAqLwotICAgSU5UICAgICAgc2ZiTkxpbmVzW01BWF9HUk9VUEVEX1NGQl07ICAgICAgICAgICAgIC8qIG51bWJlciBvZiByZWxldmFudCBsaW5lcyBpbiBzZmIgKi8KLSAgIC8qIHRoZSByZXN0IGlzIGNhbGN1bGF0ZWQgYnkgRkRLYWFjRW5jX2NhbGNTZmJQZSAqLwotICAgSU5UICAgICAgc2ZiUGVbTUFYX0dST1VQRURfU0ZCXTsgICAgICAgICAgICAgICAgIC8qIHBlIGZvciBlYWNoIHNmYiAqLwotICAgSU5UICAgICAgc2ZiQ29uc3RQYXJ0W01BWF9HUk9VUEVEX1NGQl07ICAgICAgICAgIC8qIGNvbnN0YW50IHBhcnQgZm9yIGVhY2ggc2ZiICovCi0gICBJTlQgICAgICBzZmJOQWN0aXZlTGluZXNbTUFYX0dST1VQRURfU0ZCXTsgICAgICAgLyogbnVtYmVyIG9mIGFjdGl2ZSBsaW5lcyBpbiBzZmIgKi8KLSAgIElOVCAgICAgIHBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gb2Ygc2ZiUGUgKi8KLSAgIElOVCAgICAgIGNvbnN0UGFydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gb2Ygc2ZiQ29uc3RQYXJ0ICovCi0gICBJTlQgICAgICBuQWN0aXZlTGluZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VtIG9mIHNmYk5BY3RpdmVMaW5lcyAqLworICAvKiBjYWxjdWxhdGVkIGJ5IEZES2FhY0VuY19wcmVwYXJlU2ZiUGUgKi8KKyAgSU5UIHNmYk5MaW5lc1tNQVhfR1JPVVBFRF9TRkJdOyAvKiBudW1iZXIgb2YgcmVsZXZhbnQgbGluZXMgaW4gc2ZiICovCisgIC8qIHRoZSByZXN0IGlzIGNhbGN1bGF0ZWQgYnkgRkRLYWFjRW5jX2NhbGNTZmJQZSAqLworICBJTlQgc2ZiUGVbTUFYX0dST1VQRURfU0ZCXTsgICAgICAgICAgIC8qIHBlIGZvciBlYWNoIHNmYiAqLworICBJTlQgc2ZiQ29uc3RQYXJ0W01BWF9HUk9VUEVEX1NGQl07ICAgIC8qIGNvbnN0YW50IHBhcnQgZm9yIGVhY2ggc2ZiICovCisgIElOVCBzZmJOQWN0aXZlTGluZXNbTUFYX0dST1VQRURfU0ZCXTsgLyogbnVtYmVyIG9mIGFjdGl2ZSBsaW5lcyBpbiBzZmIgKi8KKyAgSU5UIHBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gb2Ygc2ZiUGUgKi8KKyAgSU5UIGNvbnN0UGFydDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gb2Ygc2ZiQ29uc3RQYXJ0ICovCisgIElOVCBuQWN0aXZlTGluZXM7ICAgICAgICAgICAgICAgICAgICAgLyogc3VtIG9mIHNmYk5BY3RpdmVMaW5lcyAqLwogfSBQRV9DSEFOTkVMX0RBVEE7CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBQRV9DSEFOTkVMX0RBVEEgcGVDaGFubmVsRGF0YVsoMildOwotICAgIElOVCAgICBwZTsKLSAgICBJTlQgICAgY29uc3RQYXJ0OwotICAgIElOVCAgICBuQWN0aXZlTGluZXM7Ci0gICAgSU5UICAgIG9mZnNldDsKKyAgUEVfQ0hBTk5FTF9EQVRBIHBlQ2hhbm5lbERhdGFbKDIpXTsKKyAgSU5UIHBlOworICBJTlQgY29uc3RQYXJ0OworICBJTlQgbkFjdGl2ZUxpbmVzOworICBJTlQgb2Zmc2V0OwogfSBQRV9EQVRBOwogCit2b2lkIEZES2FhY0VuY19wcmVwYXJlU2ZiUGUoUEVfQ0hBTk5FTF9EQVRBICpSRVNUUklDVCBjb25zdCBwZUNoYW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBjb25zdCBzZmJFbmVyZ3lMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIGNvbnN0IHNmYlRocmVzaG9sZExkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgY29uc3Qgc2ZiRm9ybUZhY3RvckxkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKlJFU1RSSUNUIGNvbnN0IHNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2ZiQ250LCBjb25zdCBJTlQgc2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG1heFNmYlBlckdyb3VwKTsKIAotdm9pZCBGREthYWNFbmNfcHJlcGFyZVNmYlBlKFBFX0NIQU5ORUxfREFUQSAgICpwZUNoYW5EYXRhLAotICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICAgKnNmYkVuZXJneUxkRGF0YSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICAgICpzZmJUaHJlc2hvbGRMZERhdGEsCi0gICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAqc2ZiRm9ybUZhY3RvckxkRGF0YSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgIG1heFNmYlBlckdyb3VwKTsKLQotdm9pZCBGREthYWNFbmNfY2FsY1NmYlBlKFBFX0NIQU5ORUxfREFUQSAgKlJFU1RSSUNUIHBlQ2hhbkRhdGEsCi0gICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgICpSRVNUUklDVCBzZmJFbmVyZ3lMZERhdGEsCi0gICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgICpSRVNUUklDVCBzZmJUaHJlc2hvbGRMZERhdGEsCi0gICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIHNmYkNudCwKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIG1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICppc0Jvb2ssCi0gICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgKmlzU2NhbGUpOwordm9pZCBGREthYWNFbmNfY2FsY1NmYlBlKFBFX0NIQU5ORUxfREFUQSAqUkVTVFJJQ1QgY29uc3QgcGVDaGFuRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgY29uc3Qgc2ZiRW5lcmd5TGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBjb25zdCBzZmJUaHJlc2hvbGRMZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNmYkNudCwgY29uc3QgSU5UIHNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBtYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKlJFU1RSSUNUIGNvbnN0IGlzQm9vaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKlJFU1RSSUNUIGNvbnN0IGlzU2NhbGUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvbWV0YWRhdGFfY29tcHJlc3Nvci5jcHAgYi9saWJBQUNlbmMvc3JjL21ldGFkYXRhX2NvbXByZXNzb3IuY3BwCmluZGV4IDY4YTY0YWUuLmJkYWM4MGEgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvbWV0YWRhdGFfY29tcHJlc3Nvci5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9tZXRhZGF0YV9jb21wcmVzc29yLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw1MCArOTAsMzkgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIEFBQyBFbmNvZGVyIGxpYiAgKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBBdXRob3Iocyk6IE0uIE5ldXNpbmdlcgorICAgQXV0aG9yKHMpOiAgIE0uIE5ldXNpbmdlcgorCiAgICBEZXNjcmlwdGlvbjogQ29tcHJlc3NvciBmb3IgQUFDIE1ldGFkYXRhIEdlbmVyYXRvcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJtZXRhZGF0YV9jb21wcmVzc29yLmgiCiAjaW5jbHVkZSAiY2hhbm5lbF9tYXAuaCIKIAotCi0jZGVmaW5lIExPRzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjY5MzE0NzE4MDU2ZiAgLyogbmF0dXJhbCBsb2dhcml0aG0gb2YgMiAqLwotI2RlZmluZSBJTE9HMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NDI2OTUwNDFmICAgIC8qIDEvTE9HMiAqLwotI2RlZmluZSBGSVhQX0lMT0cyX0RJVjIgICAgICAgICAgICAgICAgICAgICAgICAgKEZMMkZYQ09OU1RfREJMKElMT0cyLzIpKQorI2RlZmluZSBMT0cyIDAuNjkzMTQ3MTgwNTZmIC8qIG5hdHVyYWwgbG9nYXJpdGhtIG9mIDIgKi8KKyNkZWZpbmUgSUxPRzIgMS40NDI2OTUwNDFmICAvKiAxL0xPRzIgKi8KKyNkZWZpbmUgRklYUF9JTE9HMl9ESVYyIChGTDJGWENPTlNUX0RCTChJTE9HMiAvIDIpKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNkZWZpbmUgTUFYX0RSQ19DSEFOTkVMUyAgICAgICAgKDgpICAgICAgICAgIC8qITwgTWF4IG51bWJlciBvZiBhdWRpbyBpbnB1dCBjaGFubmVscy4gKi8KLSNkZWZpbmUgRE9XTk1JWF9TSElGVCAgICAgICAgICAgKDMpICAgICAgICAgIC8qITwgTWF4IDggY2hhbm5lbC4gKi8KLSNkZWZpbmUgV0VJR0hUSU5HX0ZJTFRFUl9TSElGVCAgKDIpICAgICAgICAgIC8qITwgU2NhbGluZyB1c2VkIGluIHdlaWdodGluZyBmaWx0ZXIuICovCisjZGVmaW5lIE1BWF9EUkNfQ0hBTk5FTFMgKDgpICAgICAgIC8qITwgTWF4IG51bWJlciBvZiBhdWRpbyBpbnB1dCBjaGFubmVscy4gKi8KKyNkZWZpbmUgRE9XTk1JWF9TSElGVCAoMykgICAgICAgICAgLyohPCBNYXggOCBjaGFubmVsLiAqLworI2RlZmluZSBXRUlHSFRJTkdfRklMVEVSX1NISUZUICgyKSAvKiE8IFNjYWxpbmcgdXNlZCBpbiB3ZWlnaHRpbmcgZmlsdGVyLiAqLwogCi0jZGVmaW5lIE1FVEFEQVRBX0lOVF9CSVRTICAgICAgMTAKLSNkZWZpbmUgTUVUQURBVEFfTElOVF9CSVRTICAgICAyMAotI2RlZmluZSBNRVRBREFUQV9JTlRfU0NBTEUgICAgIChJTlQ2NCgxKTw8KE1FVEFEQVRBX0lOVF9CSVRTKSkKLSNkZWZpbmUgTUVUQURBVEFfRlJBQ1RfQklUUyAgICAoREZSQUNUX0JJVFMtMS1NRVRBREFUQV9JTlRfQklUUykKLSNkZWZpbmUgTUVUQURBVEFfRlJBQ1RfU0NBTEUgICAoSU5UNjQoMSk8PChNRVRBREFUQV9GUkFDVF9CSVRTKSkKKyNkZWZpbmUgTUVUQURBVEFfSU5UX0JJVFMgMTAKKyNkZWZpbmUgTUVUQURBVEFfTElOVF9CSVRTIDIwCisjZGVmaW5lIE1FVEFEQVRBX0lOVF9TQ0FMRSAoSU5UNjQoMSkgPDwgKE1FVEFEQVRBX0lOVF9CSVRTKSkKKyNkZWZpbmUgTUVUQURBVEFfRlJBQ1RfQklUUyAoREZSQUNUX0JJVFMgLSAxIC0gTUVUQURBVEFfSU5UX0JJVFMpCisjZGVmaW5lIE1FVEFEQVRBX0ZSQUNUX1NDQUxFIChJTlQ2NCgxKSA8PCAoTUVUQURBVEFfRlJBQ1RfQklUUykpCiAKIC8qKgogICogIEVudW0gZm9yIGNoYW5uZWwgYXNzaWdubWVudC4KICAqLwotZW51bSB7Ci0gICAgTCAgID0gMCwKLSAgICBSICAgPSAxLAotICAgIEMgICA9IDIsCi0gICAgTEZFID0gMywKLSAgICBMUyAgPSA0LAotICAgIFJTICA9IDUsCi0gICAgUyAgID0gNiwKLSAgICBMUzIgPSA3LAotICAgIFJTMiA9IDgKLX07CitlbnVtIHsgTCA9IDAsIFIgPSAxLCBDID0gMiwgTEZFID0gMywgTFMgPSA0LCBSUyA9IDUsIFMgPSA2LCBMUzIgPSA3LCBSUzIgPSA4IH07CiAKIC8qLS0tLS0tLS0tLS0tLS0tIHN0cnVjdHVyZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTEzMCw2MSArMTMwLDYyIEBACiAgKiAgU3RydWN0dXJlIGhvbGRzIHdlaWdodGluZyBmaWx0ZXIgZmlsdGVyIHN0YXRlcy4KICAqLwogc3RydWN0IFdFSUdIVElOR19TVEFURVMgewotICAgIEZJWFBfREJMIHgxOwotICAgIEZJWFBfREJMIHgyOwotICAgIEZJWFBfREJMIHkxOwotICAgIEZJWFBfREJMIHkyOworICBGSVhQX0RCTCB4MTsKKyAgRklYUF9EQkwgeDI7CisgIEZJWFBfREJMIHkxOworICBGSVhQX0RCTCB5MjsKIH07CiAKIC8qKgogICogIER5bmFtaWMgUmFuZ2UgQ29udHJvbCBjb21wcmVzc29yIHN0cnVjdHVyZS4KICAqLwogc3RydWN0IERSQ19DT01QIHsKKyAgRklYUF9EQkwgbWF4Qm9vc3RUaHJbMl07IC8qITwgTWF4IGJvb3N0IHRocmVzaG9sZC4gKi8KKyAgRklYUF9EQkwgYm9vc3RUaHJbMl07ICAgIC8qITwgQm9vc3QgdGhyZXNob2xkLiAqLworICBGSVhQX0RCTCBlYXJseUN1dFRoclsyXTsgLyohPCBFYXJseSBjdXQgdGhyZXNob2xkLiAqLworICBGSVhQX0RCTCBjdXRUaHJbMl07ICAgICAgLyohPCBDdXQgdGhyZXNob2xkLiAqLworICBGSVhQX0RCTCBtYXhDdXRUaHJbMl07ICAgLyohPCBNYXggY3V0IHRocmVzaG9sZC4gKi8KIAotICAgIEZJWFBfREJMICAgICBtYXhCb29zdFRoclsyXTsgICAgICAgICAgICAgLyohPCBNYXggYm9vc3QgdGhyZXNob2xkLiAqLwotICAgIEZJWFBfREJMICAgICBib29zdFRoclsyXTsgICAgICAgICAgICAgICAgLyohPCBCb29zdCB0aHJlc2hvbGQuICovCi0gICAgRklYUF9EQkwgICAgIGVhcmx5Q3V0VGhyWzJdOyAgICAgICAgICAgICAvKiE8IEVhcmx5IGN1dCB0aHJlc2hvbGQuICovCi0gICAgRklYUF9EQkwgICAgIGN1dFRoclsyXTsgICAgICAgICAgICAgICAgICAvKiE8IEN1dCB0aHJlc2hvbGQuICovCi0gICAgRklYUF9EQkwgICAgIG1heEN1dFRoclsyXTsgICAgICAgICAgICAgICAvKiE8IE1heCBjdXQgdGhyZXNob2xkLiAqLworICBGSVhQX0RCTCBib29zdEZhY1syXTsgLyohPCBQcmVjYWxjdWxhdGVkIGZhY3RvciBmb3IgYm9vc3QgY29tcHJlc3Npb24uICovCisgIEZJWFBfREJMCisgIGVhcmx5Q3V0RmFjWzJdOyAgICAgLyohPCBQcmVjYWxjdWxhdGVkIGZhY3RvciBmb3IgZWFybHkgY3V0IGNvbXByZXNzaW9uLiAqLworICBGSVhQX0RCTCBjdXRGYWNbMl07IC8qITwgUHJlY2FsY3VsYXRlZCBmYWN0b3IgZm9yIGN1dCBjb21wcmVzc2lvbi4gKi8KIAotICAgIEZJWFBfREJMICAgICBib29zdEZhY1syXTsgICAgICAgICAgICAgICAgLyohPCBQcmVjYWxjdWxhdGVkIGZhY3RvciBmb3IgYm9vc3QgY29tcHJlc3Npb24uICovCi0gICAgRklYUF9EQkwgICAgIGVhcmx5Q3V0RmFjWzJdOyAgICAgICAgICAgICAvKiE8IFByZWNhbGN1bGF0ZWQgZmFjdG9yIGZvciBlYXJseSBjdXQgY29tcHJlc3Npb24uICovCi0gICAgRklYUF9EQkwgICAgIGN1dEZhY1syXTsgICAgICAgICAgICAgICAgICAvKiE8IFByZWNhbGN1bGF0ZWQgZmFjdG9yIGZvciBjdXQgY29tcHJlc3Npb24uICovCisgIEZJWFBfREJMIG1heEJvb3N0WzJdOyAgICAvKiE8IE1heGltdW0gYm9vc3QuICovCisgIEZJWFBfREJMIG1heEN1dFsyXTsgICAgICAvKiE8IE1heGltdW0gY3V0LiAqLworICBGSVhQX0RCTCBtYXhFYXJseUN1dFsyXTsgLyohPCBNYXhpbXVtIGVhcmx5IGN1dC4gKi8KIAotICAgIEZJWFBfREJMICAgICBtYXhCb29zdFsyXTsgICAgICAgICAgICAgICAgLyohPCBNYXhpbXVtIGJvb3N0LiAqLwotICAgIEZJWFBfREJMICAgICBtYXhDdXRbMl07ICAgICAgICAgICAgICAgICAgLyohPCBNYXhpbXVtIGN1dC4gKi8KLSAgICBGSVhQX0RCTCAgICAgbWF4RWFybHlDdXRbMl07ICAgICAgICAgICAgIC8qITwgTWF4aW11bSBlYXJseSBjdXQuICovCisgIEZJWFBfREJMIGZhc3RBdHRhY2tbMl07IC8qITwgRmFzdCBhdHRhY2sgY29lZmZpY2llbnQuICovCisgIEZJWFBfREJMIGZhc3REZWNheVsyXTsgIC8qITwgRmFzdCByZWxlYXNlIGNvZWZmaWNpZW50LiAqLworICBGSVhQX0RCTCBzbG93QXR0YWNrWzJdOyAvKiE8IFNsb3cgYXR0YWNrIGNvZWZmaWNpZW50LiAqLworICBGSVhQX0RCTCBzbG93RGVjYXlbMl07ICAvKiE8IFNsb3cgcmVsZWFzZSBjb2VmZmljaWVudC4gKi8KKyAgVUlOVCBob2xkT2ZmWzJdOyAgICAgICAgLyohPCBIb2xkIHRpbWUgaW4gYmxvY2tzLiAqLwogCi0gICAgRklYUF9EQkwgICAgIGZhc3RBdHRhY2tbMl07ICAgICAgICAgICAgICAvKiE8IEZhc3QgYXR0YWNrIGNvZWZmaWNpZW50LiAqLwotICAgIEZJWFBfREJMICAgICBmYXN0RGVjYXlbMl07ICAgICAgICAgICAgICAgLyohPCBGYXN0IHJlbGVhc2UgY29lZmZpY2llbnQuICovCi0gICAgRklYUF9EQkwgICAgIHNsb3dBdHRhY2tbMl07ICAgICAgICAgICAgICAvKiE8IFNsb3cgYXR0YWNrIGNvZWZmaWNpZW50LiAqLwotICAgIEZJWFBfREJMICAgICBzbG93RGVjYXlbMl07ICAgICAgICAgICAgICAgLyohPCBTbG93IHJlbGVhc2UgY29lZmZpY2llbnQuICovCi0gICAgVUlOVCAgICAgICAgIGhvbGRPZmZbMl07ICAgICAgICAgICAgICAgICAvKiE8IEhvbGQgdGltZSBpbiBibG9ja3MuICovCisgIEZJWFBfREJMIGF0dGFja1RoclsyXTsgLyohPCBTbG93L2Zhc3QgYXR0YWNrIHRocmVzaG9sZC4gKi8KKyAgRklYUF9EQkwgZGVjYXlUaHJbMl07ICAvKiE8IFNsb3cvZmFzdCByZWxlYXNlIHRocmVzaG9sZC4gKi8KIAotICAgIEZJWFBfREJMICAgICBhdHRhY2tUaHJbMl07ICAgICAgICAgICAgICAgLyohPCBTbG93L2Zhc3QgYXR0YWNrIHRocmVzaG9sZC4gKi8KLSAgICBGSVhQX0RCTCAgICAgZGVjYXlUaHJbMl07ICAgICAgICAgICAgICAgIC8qITwgU2xvdy9mYXN0IHJlbGVhc2UgdGhyZXNob2xkLiAqLworICBEUkNfUFJPRklMRSBwcm9maWxlWzJdOyAgLyohPCBEUkMgcHJvZmlsZS4gKi8KKyAgSU5UIGJsb2NrTGVuZ3RoOyAgICAgICAgIC8qITwgQmxvY2sgbGVuZ3RoIGluIHNhbXBsZXMuICovCisgIFVJTlQgc2FtcGxlUmF0ZTsgICAgICAgICAvKiE8IFNhbXBsZSByYXRlLiAqLworICBDSEFOTkVMX01PREUgY2hhbkNvbmZpZzsgLyohPCBDaGFubmVsIGNvbmZpZ3VyYXRpb24uICovCiAKLSAgICBEUkNfUFJPRklMRSAgcHJvZmlsZVsyXTsgICAgICAgICAgICAgICAgIC8qITwgRFJDIHByb2ZpbGUuICovCi0gICAgSU5UICAgICAgICAgIGJsb2NrTGVuZ3RoOyAgICAgICAgICAgICAgICAvKiE8IEJsb2NrIGxlbmd0aCBpbiBzYW1wbGVzLiAqLwotICAgIFVJTlQgICAgICAgICBzYW1wbGVSYXRlOyAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGUgcmF0ZS4gKi8KLSAgICBDSEFOTkVMX01PREUgY2hhbkNvbmZpZzsgICAgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCBjb25maWd1cmF0aW9uLiAqLworICBVQ0hBUiB1c2VXZWlnaHRpbmc7IC8qITwgVXNlIHdlaWdodGluZyBmaWx0ZXIuICovCiAKLSAgICBVQ0hBUiAgICAgICAgdXNlV2VpZ2h0aW5nOyAgICAgICAgICAgICAgIC8qITwgVXNlIHdlaWdodGluZyBmaWx0ZXIuICovCisgIFVJTlQgY2hhbm5lbHM7ICAgICAvKiE8IE51bWJlciBvZiBjaGFubmVscy4gKi8KKyAgVUlOVCBmdWxsQ2hhbm5lbHM7IC8qITwgTnVtYmVyIG9mIGZ1bGwgcmFuZ2UgY2hhbm5lbHMuICovCisgIElOVCBjaGFubmVsSWR4WzldOyAvKiE8IE9mZnNldHMgb2YgaW50ZXJsZWF2ZWQgY2hhbm5lbCBzYW1wbGVzIChMLCBSLCBDLCBMRkUsCisgICAgICAgICAgICAgICAgICAgICAgICBMcywgUnMsIFMsIExzMiwgUnMyKS4gKi8KIAotICAgIFVJTlQgICAgICAgICBjaGFubmVsczsgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgY2hhbm5lbHMuICovCi0gICAgVUlOVCAgICAgICAgIGZ1bGxDaGFubmVsczsgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBmdWxsIHJhbmdlIGNoYW5uZWxzLiAqLwotICAgIElOVCAgICAgICAgICBjaGFubmVsSWR4WzldOyAgICAgICAgICAgICAgLyohPCBPZmZzZXRzIG9mIGludGVybGVhdmVkIGNoYW5uZWwgc2FtcGxlcyAoTCwgUiwgQywgTEZFLCBMcywgUnMsIFMsIExzMiwgUnMyKS4gKi8KKyAgRklYUF9EQkwgc21vb3RoTGV2ZWxbMl07IC8qITwgbGV2ZWwgc21vb3RoaW5nIHN0YXRlcyAqLworICBGSVhQX0RCTCBzbW9vdGhHYWluWzJdOyAgLyohPCBnYWluIHNtb290aGluZyBzdGF0ZXMgKi8KKyAgVUlOVCBob2xkQ250WzJdOyAgICAgICAgIC8qITwgaG9sZCBjb3VudGVyICovCiAKLSAgICBGSVhQX0RCTCAgICAgc21vb3RoTGV2ZWxbMl07ICAgICAgICAgICAgIC8qITwgbGV2ZWwgc21vb3RoaW5nIHN0YXRlcyAqLwotICAgIEZJWFBfREJMICAgICBzbW9vdGhHYWluWzJdOyAgICAgICAgICAgICAgLyohPCBnYWluIHNtb290aGluZyBzdGF0ZXMgKi8KLSAgICBVSU5UICAgICAgICAgaG9sZENudFsyXTsgICAgICAgICAgICAgICAgIC8qITwgaG9sZCBjb3VudGVyICovCisgIEZJWFBfREJMIGxpbUdhaW5bMl07ICAvKiE8IGxpbWl0ZXIgZ2FpbiAqLworICBGSVhQX0RCTCBsaW1EZWNheTsgICAgLyohPCBsaW1pdGVyIGRlY2F5IChsaW5lYXIpICovCisgIEZJWFBfREJMIHByZXZQZWFrWzJdOyAvKiE8IG1heCBwZWFrIG9mIHByZXZpb3VzIGJsb2NrIChzdGVyZW8vbW9ubykqLwogCi0gICAgRklYUF9EQkwgICAgIGxpbUdhaW5bMl07ICAgICAgICAgICAgICAgICAvKiE8IGxpbWl0ZXIgZ2FpbiAqLwotICAgIEZJWFBfREJMICAgICBsaW1EZWNheTsgICAgICAgICAgICAgICAgICAgLyohPCBsaW1pdGVyIGRlY2F5IChsaW5lYXIpICovCi0gICAgRklYUF9EQkwgICAgIHByZXZQZWFrWzJdOyAgICAgICAgICAgICAgICAvKiE8IG1heCBwZWFrIG9mIHByZXZpb3VzIGJsb2NrIChzdGVyZW8vbW9ubykqLwotCi0gICAgV0VJR0hUSU5HX1NUQVRFUyBmaWx0ZXJbTUFYX0RSQ19DSEFOTkVMU107IC8qITwgYXJyYXkgaG9sZHMgd2VpZ2h0aW5nIGZpbHRlciBzdGF0ZXMgKi8KLQorICBXRUlHSFRJTkdfU1RBVEVTCisgIGZpbHRlcltNQVhfRFJDX0NIQU5ORUxTXTsgLyohPCBhcnJheSBob2xkcyB3ZWlnaHRpbmcgZmlsdGVyIHN0YXRlcyAqLwogfTsKIAogLyotLS0tLS0tLS0tLS0tLS0tIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xOTMsMTQzICsxOTQsMTEwIEBACiAgKiAgUHJvZmlsZSB0YWJsZXMuCiAgKi8KIHN0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJNYXhCb29zdFRocltdID0gewotICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTQzPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS01Mzw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktNTU8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTY1PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS01MDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktNDA8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpCi19OworICAgIChGSVhQX0RCTCkoLSg0MyA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSksCisgICAgKEZJWFBfREJMKSgtKDUzIDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpKSwKKyAgICAoRklYUF9EQkwpKC0oNTUgPDwgTUVUQURBVEFfRlJBQ1RfQklUUykpLAorICAgIChGSVhQX0RCTCkoLSg2NSA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSksCisgICAgKEZJWFBfREJMKSgtKDUwIDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpKSwKKyAgICAoRklYUF9EQkwpKC0oNDAgPDwgTUVUQURBVEFfRlJBQ1RfQklUUykpfTsKIHN0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJCb29zdFRocltdID0gewotICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTMxPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS00MTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktMzE8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTQxPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS0zMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktMzE8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpCi19OworICAgIChGSVhQX0RCTCkoLSgzMSA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSksCisgICAgKEZJWFBfREJMKSgtKDQxIDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpKSwKKyAgICAoRklYUF9EQkwpKC0oMzEgPDwgTUVUQURBVEFfRlJBQ1RfQklUUykpLAorICAgIChGSVhQX0RCTCkoLSg0MSA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSksCisgICAgKEZJWFBfREJMKSgtKDMxIDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpKSwKKyAgICAoRklYUF9EQkwpKC0oMzEgPDwgTUVUQURBVEFfRlJBQ1RfQklUUykpfTsKIHN0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJFYXJseUN1dFRocltdID0gewotICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTI2PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS0yMTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktMjY8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTIxPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS0yNjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktMjA8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpCi19Owotc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkN1dFRocltdICAgICAgPSB7Ci0gICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktMTY8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTExPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS0xNjw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKShpbnQpKCh1bnNpZ25lZCktMjE8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoaW50KSgodW5zaWduZWQpLTE2PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS0xMDw8TUVUQURBVEFfRlJBQ1RfQklUUykKLX07Ci1zdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiTWF4Q3V0VGhyW10gICA9IHsKLSAgICAoRklYUF9EQkwpKDQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoOTw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKSg0PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKDk8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoNDw8TUVUQURBVEFfRlJBQ1RfQklUUyksCi0gICAgKEZJWFBfREJMKSg0PDxNRVRBREFUQV9GUkFDVF9CSVRTKQotfTsKKyAgICAoRklYUF9EQkwpKC0oMjYgPDwgTUVUQURBVEFfRlJBQ1RfQklUUykpLAorICAgIChGSVhQX0RCTCkoLSgyMSA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSksCisgICAgKEZJWFBfREJMKSgtKDI2IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpKSwKKyAgICAoRklYUF9EQkwpKC0oMjEgPDwgTUVUQURBVEFfRlJBQ1RfQklUUykpLAorICAgIChGSVhQX0RCTCkoLSgyNiA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSksCisgICAgKEZJWFBfREJMKSgtKDIwIDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpKX07CitzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiQ3V0VGhyW10gPSB7KEZJWFBfREJMKSgtKDE2IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKC0oMTEgPDwgTUVUQURBVEFfRlJBQ1RfQklUUykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoLSgxNiA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgtKDIxIDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKC0oMTYgPDwgTUVUQURBVEFfRlJBQ1RfQklUUykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoLSgxMCA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSl9Oworc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYk1heEN1dFRocltdID0geworICAgIChGSVhQX0RCTCkoNCA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSwgKEZJWFBfREJMKSg5IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgIChGSVhQX0RCTCkoNCA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSwgKEZJWFBfREJMKSg5IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgIChGSVhQX0RCTCkoNCA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSwgKEZJWFBfREJMKSg0IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpfTsKIHN0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJCb29zdFJhdGlvW10gPSB7Ci0gICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLzIuZikgLSAxLmYpICksCi0gICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLzIuZikgLSAxLmYpICksCi0gICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLzIuZikgLSAxLmYpICksCi0gICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLzIuZikgLSAxLmYpICksCi0gICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLzUuZikgLSAxLmYpICksCi0gICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLzUuZikgLSAxLmYpICkKLX07CisgICAgRkwyRlhDT05TVF9EQkwoKCgxLmYgLyAyLmYpIC0gMS5mKSksIEZMMkZYQ09OU1RfREJMKCgoMS5mIC8gMi5mKSAtIDEuZikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgoMS5mIC8gMi5mKSAtIDEuZikpLCBGTDJGWENPTlNUX0RCTCgoKDEuZiAvIDIuZikgLSAxLmYpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoKDEuZiAvIDUuZikgLSAxLmYpKSwgRkwyRlhDT05TVF9EQkwoKCgxLmYgLyA1LmYpIC0gMS5mKSl9Owogc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkVhcmx5Q3V0UmF0aW9bXSA9IHsKLSAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKSwKLSAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKSwKLSAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKSwKLSAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMS5mKSAtIDEuZikgKSwKLSAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKSwKLSAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMi5mKSAtIDEuZikgKQotfTsKLXN0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJDdXRSYXRpb1tdICAgICAgPSB7Ci0gICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLzIwLmYpIC0gMS5mKSApLAotICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yMC5mKSAtIDEuZikgKSwKLSAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMjAuZikgLSAxLmYpICksCi0gICAgRkwyRlhDT05TVF9EQkwoICgoMS5mLyAyLmYpIC0gMS5mKSApLAotICAgIEZMMkZYQ09OU1RfREJMKCAoKDEuZi8yMC5mKSAtIDEuZikgKSwKLSAgICBGTDJGWENPTlNUX0RCTCggKCgxLmYvMjAuZikgLSAxLmYpICkKLX07Ci1zdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiTWF4Qm9vc3RbXSA9IHsKLSAgICAoRklYUF9EQkwpKCA2PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKCA2PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKDEyPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKDEyPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKDE1PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKDE1PDxNRVRBREFUQV9GUkFDVF9CSVRTKQotfTsKLXN0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJNYXhDdXRbXSAgID0gewotICAgIChGSVhQX0RCTCkoMjQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoMjQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoMjQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoMTU8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoMjQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoMjQ8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpCi19OworICAgIEZMMkZYQ09OU1RfREJMKCgoMS5mIC8gMi5mKSAtIDEuZikpLCBGTDJGWENPTlNUX0RCTCgoKDEuZiAvIDIuZikgLSAxLmYpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoKDEuZiAvIDIuZikgLSAxLmYpKSwgRkwyRlhDT05TVF9EQkwoKCgxLmYgLyAxLmYpIC0gMS5mKSksCisgICAgRkwyRlhDT05TVF9EQkwoKCgxLmYgLyAyLmYpIC0gMS5mKSksIEZMMkZYQ09OU1RfREJMKCgoMS5mIC8gMi5mKSAtIDEuZikpfTsKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJDdXRSYXRpb1tdID0geworICAgIEZMMkZYQ09OU1RfREJMKCgoMS5mIC8gMjAuZikgLSAxLmYpKSwgRkwyRlhDT05TVF9EQkwoKCgxLmYgLyAyMC5mKSAtIDEuZikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgoMS5mIC8gMjAuZikgLSAxLmYpKSwgRkwyRlhDT05TVF9EQkwoKCgxLmYgLyAyLmYpIC0gMS5mKSksCisgICAgRkwyRlhDT05TVF9EQkwoKCgxLmYgLyAyMC5mKSAtIDEuZikpLCBGTDJGWENPTlNUX0RCTCgoKDEuZiAvIDIwLmYpIC0gMS5mKSl9Oworc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYk1heEJvb3N0W10gPSB7KEZJWFBfREJMKSg2IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSg2IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgxMiA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoMTIgPDwgTUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKDE1IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgxNSA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKX07CitzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiTWF4Q3V0W10gPSB7KEZJWFBfREJMKSgyNCA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKDI0IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoMjQgPDwgTUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgxNSA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKDI0IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoMjQgPDwgTUVUQURBVEFfRlJBQ1RfQklUUyl9Owogc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkZhc3RBdHRhY2tbXSA9IHsKLSAgICBGTDJGWENPTlNUX0RCTCgoMTAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCi0gICAgRkwyRlhDT05TVF9EQkwoKDEwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAotICAgIEZMMkZYQ09OU1RfREJMKCgxMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKLSAgICBGTDJGWENPTlNUX0RCTCgoMTAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCi0gICAgRkwyRlhDT05TVF9EQkwoKDEwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAotICAgIEZMMkZYQ09OU1RfREJMKCAoMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKQotfTsKLXN0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJGYXN0RGVjYXlbXSAgPSB7Ci0gICAgRkwyRlhDT05TVF9EQkwoKDEwMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCi0gICAgRkwyRlhDT05TVF9EQkwoKDEwMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCi0gICAgRkwyRlhDT05TVF9EQkwoKDEwMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCi0gICAgRkwyRlhDT05TVF9EQkwoKDEwMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCi0gICAgRkwyRlhDT05TVF9EQkwoICgyMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCi0gICAgRkwyRlhDT05TVF9EQkwoICAgKDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSkKLX07CisgICAgRkwyRlhDT05TVF9EQkwoKDEwLmYgLyAxMDAwLmYpIC8gTUVUQURBVEFfSU5UX1NDQUxFKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTAuZiAvIDEwMDAuZikgLyBNRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxMC5mIC8gMTAwMC5mKSAvIE1FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoKDEwLmYgLyAxMDAwLmYpIC8gTUVUQURBVEFfSU5UX1NDQUxFKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTAuZiAvIDEwMDAuZikgLyBNRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCgwLmYgLyAxMDAwLmYpIC8gTUVUQURBVEFfSU5UX1NDQUxFKX07CitzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiRmFzdERlY2F5W10gPSB7CisgICAgRkwyRlhDT05TVF9EQkwoKDEwMDAuZiAvIDEwMDAuZikgLyBNRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxMDAwLmYgLyAxMDAwLmYpIC8gTUVUQURBVEFfSU5UX1NDQUxFKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTAwMC5mIC8gMTAwMC5mKSAvIE1FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoKDEwMDAuZiAvIDEwMDAuZikgLyBNRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCgyMDAuZiAvIDEwMDAuZikgLyBNRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCgwLmYgLyAxMDAwLmYpIC8gTUVUQURBVEFfSU5UX1NDQUxFKX07CiBzdGF0aWMgY29uc3QgRklYUF9EQkwgdGFiU2xvd0F0dGFja1tdID0gewotICAgIEZMMkZYQ09OU1RfREJMKCgxMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCi0gICAgRkwyRlhDT05TVF9EQkwoKDEwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKLSAgICBGTDJGWENPTlNUX0RCTCgoMTAwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAotICAgIEZMMkZYQ09OU1RfREJMKCgxMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCi0gICAgRkwyRlhDT05TVF9EQkwoKDEwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKLSAgICBGTDJGWENPTlNUX0RCTCggICgwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpCi19Owotc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYlNsb3dEZWNheVtdICA9IHsKLSAgICBGTDJGWENPTlNUX0RCTCggKDMwMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCi0gICAgRkwyRlhDT05TVF9EQkwoICgzMDAwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAotICAgIEZMMkZYQ09OU1RfREJMKCgxMDAwMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKSwKLSAgICBGTDJGWENPTlNUX0RCTCggKDMwMDAuZi8xMDAwLmYpL01FVEFEQVRBX0lOVF9TQ0FMRSksCi0gICAgRkwyRlhDT05TVF9EQkwoICgxMDAwLmYvMTAwMC5mKS9NRVRBREFUQV9JTlRfU0NBTEUpLAotICAgIEZMMkZYQ09OU1RfREJMKCAgICAoMC5mLzEwMDAuZikvTUVUQURBVEFfSU5UX1NDQUxFKQotfTsKKyAgICBGTDJGWENPTlNUX0RCTCgoMTAwLmYgLyAxMDAwLmYpIC8gTUVUQURBVEFfSU5UX1NDQUxFKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTAwLmYgLyAxMDAwLmYpIC8gTUVUQURBVEFfSU5UX1NDQUxFKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTAwLmYgLyAxMDAwLmYpIC8gTUVUQURBVEFfSU5UX1NDQUxFKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTAwLmYgLyAxMDAwLmYpIC8gTUVUQURBVEFfSU5UX1NDQUxFKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTAwLmYgLyAxMDAwLmYpIC8gTUVUQURBVEFfSU5UX1NDQUxFKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMC5mIC8gMTAwMC5mKSAvIE1FVEFEQVRBX0lOVF9TQ0FMRSl9Oworc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYlNsb3dEZWNheVtdID0geworICAgIEZMMkZYQ09OU1RfREJMKCgzMDAwLmYgLyAxMDAwLmYpIC8gTUVUQURBVEFfSU5UX1NDQUxFKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMzAwMC5mIC8gMTAwMC5mKSAvIE1FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoKDEwMDAwLmYgLyAxMDAwLmYpIC8gTUVUQURBVEFfSU5UX1NDQUxFKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMzAwMC5mIC8gMTAwMC5mKSAvIE1FVEFEQVRBX0lOVF9TQ0FMRSksCisgICAgRkwyRlhDT05TVF9EQkwoKDEwMDAuZiAvIDEwMDAuZikgLyBNRVRBREFUQV9JTlRfU0NBTEUpLAorICAgIEZMMkZYQ09OU1RfREJMKCgwLmYgLyAxMDAwLmYpIC8gTUVUQURBVEFfSU5UX1NDQUxFKX07CiAKLXN0YXRpYyBjb25zdCBJTlQgdGFiSG9sZE9mZltdICAgID0geyAxMCwgMTAsIDEwLCAxMCwgMTAsIDAgfTsKK3N0YXRpYyBjb25zdCBJTlQgdGFiSG9sZE9mZltdID0gezEwLCAxMCwgMTAsIDEwLCAxMCwgMH07CiAKLXN0YXRpYyBjb25zdCBGSVhQX0RCTCB0YWJBdHRhY2tUaHJbXSA9IHsKLSAgICAoRklYUF9EQkwpKDE1PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKDE1PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKDE1PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKDE1PDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKDEwPDxNRVRBREFUQV9GUkFDVF9CSVRTKSwKLSAgICAoRklYUF9EQkwpKDA8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpCi19Owotc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkRlY2F5VGhyW10gID0gewotICAgIChGSVhQX0RCTCkoMjA8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoMjA8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoMjA8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoMjA8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoMTA8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAotICAgIChGSVhQX0RCTCkoIDA8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpCi19Oworc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkF0dGFja1RocltdID0geyhGSVhQX0RCTCkoMTUgPDwgTUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgxNSA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKDE1IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoMTUgPDwgTUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgxMCA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKDAgPDwgTUVUQURBVEFfRlJBQ1RfQklUUyl9Oworc3RhdGljIGNvbnN0IEZJWFBfREJMIHRhYkRlY2F5VGhyW10gPSB7KEZJWFBfREJMKSgyMCA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoMjAgPDwgTUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKDIwIDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKSgyMCA8PCBNRVRBREFUQV9GUkFDVF9CSVRTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoMTAgPDwgTUVUQURBVEFfRlJBQ1RfQklUUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKDAgPDwgTUVUQURBVEFfRlJBQ1RfQklUUyl9OwogCiAvKioKICAqICBXZWlnaHRpbmcgZmlsdGVyIGNvZWZmaWNpZW50cyAoYmlxdWFkIGJhbmRwYXNzKS4KICAqLwotc3RhdGljIGNvbnN0IEZJWFBfREJMIGIwID0gRkwyRlhDT05TVF9EQkwoMC41MzA1MDY2MmYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYjEgPSAwLCBiMiA9IC1iMCAqLwotc3RhdGljIGNvbnN0IEZJWFBfREJMIGExID0gRkwyRlhDT05TVF9EQkwoLTAuOTUyMzc5ODNmKSwgYTIgPSBGTDJGWENPTlNUX0RCTCgtMC4wMjI0ODgzNmYpOyAgLyogYTAgPSAxICovCi0KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBiMCA9IEZMMkZYQ09OU1RfREJMKDAuNTMwNTA2NjJmKTsgLyogYjEgPSAwLCBiMiA9IC1iMCAqLworc3RhdGljIGNvbnN0IEZJWFBfREJMIGExID0gRkwyRlhDT05TVF9EQkwoLTAuOTUyMzc5ODNmKSwKKyAgICAgICAgICAgICAgICAgICAgICBhMiA9IEZMMkZYQ09OU1RfREJMKC0wLjAyMjQ4ODM2Zik7IC8qIGEwID0gMSAqLwogCiAvKi0tLS0tLS0tLS0tLS0gZnVuY3Rpb24gZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTM0MCwxNCArMzA4LDEyIEBACiAgKgogICogXHJldHVybiAgICBzaGlmdEZhY3RvcgogICovCi1zdGF0aWMgVUlOVCBnZXRTaGlmdEZhY3RvcigKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICBsZW5ndGgKLSAgICAgICAgKQotewotICAgIFVJTlQgbGROOwotICAgIGZvcihsZE49MTsoKChVSU5UKTEpPDxsZE4pIDwgbGVuZ3RoO2xkTisrKTsKK3N0YXRpYyBVSU5UIGdldFNoaWZ0RmFjdG9yKGNvbnN0IFVJTlQgbGVuZ3RoKSB7CisgIFVJTlQgbGROOworICBmb3IgKGxkTiA9IDE7ICgoKFVJTlQpMSkgPDwgbGROKSA8IGxlbmd0aDsgbGROKyspCisgICAgOwogCi0gICAgcmV0dXJuIGxkTjsKKyAgcmV0dXJuIGxkTjsKIH0KIAogLyoqCkBAIC0zNTUsMjggKzMyMSwyNiBAQAogICoKICAqIFxwYXJhbSB2YWx1ZTEgICAgICAgIEZpcnN0IGlucHV0IHZhbHVlLgogICogXHBhcmFtIHExICAgICAgICAgICAgU2NhbGluZyBmYWN0b3Igb2YgZmlyc3QgaW5wdXQgdmFsdWUuCi0gKiBccGFyYW0gcFZhbHVlMiAgICAgICBQb2ludGVyIHRvIHNlY29uZCBpbnB1dCB2YWx1ZSwgd2lsbCBiZSBtb2RpZmllZCBvbiByZXR1cm4uCi0gKiBccGFyYW0gcFEyICAgICAgICAgICBQb2ludGVyIHRvIHNlY29uZCBzY2FsaW5nIGZhY3Rvciwgd2lsbCBiZSBtb2RpZmllZCBvbiByZXR1cm4uCisgKiBccGFyYW0gcFZhbHVlMiAgICAgICBQb2ludGVyIHRvIHNlY29uZCBpbnB1dCB2YWx1ZSwgd2lsbCBiZSBtb2RpZmllZCBvbgorICogcmV0dXJuLgorICogXHBhcmFtIHBRMiAgICAgICAgICAgUG9pbnRlciB0byBzZWNvbmQgc2NhbGluZyBmYWN0b3IsIHdpbGwgYmUgbW9kaWZpZWQgb24KKyAqIHJldHVybi4KICAqCiAgKiBccmV0dXJuICAgIHZvaWQKICAqLwotc3RhdGljIHZvaWQgZml4cEFkZCgKLSAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICAgICAgICB2YWx1ZTEsCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgICAgICAgcTEsCi0gICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgICAgICAgcFZhbHVlMiwKLSAgICAgICAgaW50ICpjb25zdCAgICAgICAgICAgICAgICAgICAgICBwUTIKLSAgICAgICAgKQotewotICBjb25zdCBpbnQgaGVhZHJvb20xID0gZk5vcm16KGZpeHBfYWJzKHZhbHVlMSkpLTE7Ci0gIGNvbnN0IGludCBoZWFkcm9vbTIgPSBmTm9ybXooZml4cF9hYnMoKnBWYWx1ZTIpKS0xOwotICBpbnQgcmVzdWx0U2NhbGUgPSBmaXhNYXgocTEtaGVhZHJvb20xLCAoKnBRMiktaGVhZHJvb20yKTsKK3N0YXRpYyB2b2lkIGZpeHBBZGQoY29uc3QgRklYUF9EQkwgdmFsdWUxLCBjb25zdCBpbnQgcTEsCisgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiBjb25zdCBwVmFsdWUyLCBpbnQqIGNvbnN0IHBRMikgeworICBjb25zdCBpbnQgaGVhZHJvb20xID0gZk5vcm16KGZpeHBfYWJzKHZhbHVlMSkpIC0gMTsKKyAgY29uc3QgaW50IGhlYWRyb29tMiA9IGZOb3JteihmaXhwX2FicygqcFZhbHVlMikpIC0gMTsKKyAgaW50IHJlc3VsdFNjYWxlID0gZml4TWF4KHExIC0gaGVhZHJvb20xLCAoKnBRMikgLSBoZWFkcm9vbTIpOwogCi0gIGlmICggKHZhbHVlMSE9RkwyRlhDT05TVF9EQkwoMC5mKSkgJiYgKCpwVmFsdWUyIT1GTDJGWENPTlNUX0RCTCgwLmYpKSApIHsKKyAgaWYgKCh2YWx1ZTEgIT0gRkwyRlhDT05TVF9EQkwoMC5mKSkgJiYgKCpwVmFsdWUyICE9IEZMMkZYQ09OU1RfREJMKDAuZikpKSB7CiAgICAgcmVzdWx0U2NhbGUrKzsKICAgfQogCi0gICpwVmFsdWUyID0gc2NhbGVWYWx1ZSh2YWx1ZTEsIHExLXJlc3VsdFNjYWxlKSArIHNjYWxlVmFsdWUoKnBWYWx1ZTIsICgqcFEyKS1yZXN1bHRTY2FsZSk7Ci0gICpwUTIgPSAoKnBWYWx1ZTIhPShGSVhQX0RCTCkwKSA/IHJlc3VsdFNjYWxlIDogREZSQUNUX0JJVFMtMTsKKyAgKnBWYWx1ZTIgPSBzY2FsZVZhbHVlKHZhbHVlMSwgcTEgLSByZXN1bHRTY2FsZSkgKworICAgICAgICAgICAgIHNjYWxlVmFsdWUoKnBWYWx1ZTIsICgqcFEyKSAtIHJlc3VsdFNjYWxlKTsKKyAgKnBRMiA9ICgqcFZhbHVlMiAhPSAoRklYUF9EQkwpMCkgPyByZXN1bHRTY2FsZSA6IERGUkFDVF9CSVRTIC0gMTsKIH0KIAogLyoqCkBAIC0zODgsNjUxICszNTIsMTIyOCBAQAogICoKICAqIFxyZXR1cm4gICAgcmVzdWx0ID0gMS4wIC0gZXhwKC0xLjAvKCh0KSAqIChmKSkpCiAgKi8KLXN0YXRpYyBGSVhQX0RCTCB0YzJDb2VmZigKLSAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICB0LAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgYmxvY2tMZW5ndGgKLSAgICAgICAgKQotewotICAgRklYUF9EQkwgc2FtcGxlUmF0ZUZyYWN0OwotICAgRklYUF9EQkwgYmxvY2tMZW5ndGhGcmFjdDsKLSAgIEZJWFBfREJMIGYsIHByb2R1Y3Q7Ci0gICBGSVhQX0RCTCBleHBvbmVudCwgcmVzdWx0OwotICAgSU5UIGVfcmVzOworc3RhdGljIEZJWFBfREJMIHRjMkNvZWZmKGNvbnN0IEZJWFBfREJMIHQsIGNvbnN0IElOVCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBibG9ja0xlbmd0aCkgeworICBGSVhQX0RCTCBzYW1wbGVSYXRlRnJhY3Q7CisgIEZJWFBfREJMIGJsb2NrTGVuZ3RoRnJhY3Q7CisgIEZJWFBfREJMIGYsIHByb2R1Y3Q7CisgIEZJWFBfREJMIGV4cG9uZW50LCByZXN1bHQ7CisgIElOVCBlX3JlczsKIAotICAgLyogZiA9IHNhbXBsZVJhdGUvYmxvY2tMZW5ndGggKi8KLSAgIHNhbXBsZVJhdGVGcmFjdCA9IChGSVhQX0RCTCkoc2FtcGxlUmF0ZTw8KERGUkFDVF9CSVRTLTEtTUVUQURBVEFfTElOVF9CSVRTKSk7Ci0gICBibG9ja0xlbmd0aEZyYWN0ID0gKEZJWFBfREJMKShibG9ja0xlbmd0aDw8KERGUkFDVF9CSVRTLTEtTUVUQURBVEFfTElOVF9CSVRTKSk7Ci0gICBmID0gZkRpdk5vcm0oc2FtcGxlUmF0ZUZyYWN0LCBibG9ja0xlbmd0aEZyYWN0LCAmZV9yZXMpOwotICAgZiA9IHNjYWxlVmFsdWUoZiwgZV9yZXMtTUVUQURBVEFfSU5UX0JJVFMpOyAvKiBjb252ZXJ0IHRvIE1FVEFEQVRBX0ZSQUNUICovCisgIC8qIGYgPSBzYW1wbGVSYXRlL2Jsb2NrTGVuZ3RoICovCisgIHNhbXBsZVJhdGVGcmFjdCA9CisgICAgICAoRklYUF9EQkwpKHNhbXBsZVJhdGUgPDwgKERGUkFDVF9CSVRTIC0gMSAtIE1FVEFEQVRBX0xJTlRfQklUUykpOworICBibG9ja0xlbmd0aEZyYWN0ID0KKyAgICAgIChGSVhQX0RCTCkoYmxvY2tMZW5ndGggPDwgKERGUkFDVF9CSVRTIC0gMSAtIE1FVEFEQVRBX0xJTlRfQklUUykpOworICBmID0gZkRpdk5vcm0oc2FtcGxlUmF0ZUZyYWN0LCBibG9ja0xlbmd0aEZyYWN0LCAmZV9yZXMpOworICBmID0gc2NhbGVWYWx1ZShmLCBlX3JlcyAtIE1FVEFEQVRBX0lOVF9CSVRTKTsgLyogY29udmVydCB0byBNRVRBREFUQV9GUkFDVCAqLwogCi0gICAvKiBwcm9kdWN0ID0gdCpmICovCi0gICBwcm9kdWN0ID0gZk11bHROb3JtKHQsIGYsICZlX3Jlcyk7Ci0gICBwcm9kdWN0ID0gc2NhbGVWYWx1ZShwcm9kdWN0LCBlX3JlcytNRVRBREFUQV9JTlRfQklUUyk7IC8qIGNvbnZlcnQgdG8gTUVUQURBVEFfRlJBQ1QgKi8KKyAgLyogcHJvZHVjdCA9IHQqZiAqLworICBwcm9kdWN0ID0gZk11bHROb3JtKHQsIGYsICZlX3Jlcyk7CisgIHByb2R1Y3QgPSBzY2FsZVZhbHVlKAorICAgICAgcHJvZHVjdCwgZV9yZXMgKyBNRVRBREFUQV9JTlRfQklUUyk7IC8qIGNvbnZlcnQgdG8gTUVUQURBVEFfRlJBQ1QgKi8KIAotICAgLyogZXhwb25lbnQgPSAoLTEuMC8oKHQpICogKGYpKSkgKi8KLSAgIGV4cG9uZW50ID0gZkRpdk5vcm0oTUVUQURBVEFfRlJBQ1RfU0NBTEUsIHByb2R1Y3QsICZlX3Jlcyk7Ci0gICBleHBvbmVudCA9IHNjYWxlVmFsdWUoZXhwb25lbnQsIGVfcmVzLU1FVEFEQVRBX0lOVF9CSVRTKTsgLyogY29udmVydCB0byBNRVRBREFUQV9GUkFDVCAqLworICAvKiBleHBvbmVudCA9ICgtMS4wLygodCkgKiAoZikpKSAqLworICBleHBvbmVudCA9IGZEaXZOb3JtKE1FVEFEQVRBX0ZSQUNUX1NDQUxFLCBwcm9kdWN0LCAmZV9yZXMpOworICBleHBvbmVudCA9IHNjYWxlVmFsdWUoCisgICAgICBleHBvbmVudCwgZV9yZXMgLSBNRVRBREFUQV9JTlRfQklUUyk7IC8qIGNvbnZlcnQgdG8gTUVUQURBVEFfRlJBQ1QgKi8KIAotICAgLyogZXhwb25lbnQgKiBsZChlKSAqLwotICAgZXhwb25lbnQgPSBmTXVsdChleHBvbmVudCxGSVhQX0lMT0cyX0RJVjIpPDwxOyAvKiBlXih4KSA9IDJeKHgqbGQoZSkpICovCisgIC8qIGV4cG9uZW50ICogbGQoZSkgKi8KKyAgZXhwb25lbnQgPSBmTXVsdChleHBvbmVudCwgRklYUF9JTE9HMl9ESVYyKSA8PCAxOyAvKiBlXih4KSA9IDJeKHgqbGQoZSkpICovCiAKLSAgIC8qIGV4cCgtMS4wLygodCkgKiAoZikpKSAqLwotICAgcmVzdWx0ID0gZjJQb3coLWV4cG9uZW50LCBERlJBQ1RfQklUUy0xLU1FVEFEQVRBX0ZSQUNUX0JJVFMsICZlX3Jlcyk7CisgIC8qIGV4cCgtMS4wLygodCkgKiAoZikpKSAqLworICByZXN1bHQgPSBmMlBvdygtZXhwb25lbnQsIERGUkFDVF9CSVRTIC0gMSAtIE1FVEFEQVRBX0ZSQUNUX0JJVFMsICZlX3Jlcyk7CiAKLSAgIC8qIHJlc3VsdCA9IDEuMCAtIGV4cCgtMS4wLygodCkgKiAoZikpKSAqLwotICAgcmVzdWx0ID0gKEZJWFBfREJMKU1BWFZBTF9EQkwgLSBzY2FsZVZhbHVlKHJlc3VsdCwgZV9yZXMpOworICAvKiByZXN1bHQgPSAxLjAgLSBleHAoLTEuMC8oKHQpICogKGYpKSkgKi8KKyAgcmVzdWx0ID0gKEZJWFBfREJMKU1BWFZBTF9EQkwgLSBzY2FsZVZhbHVlKHJlc3VsdCwgZV9yZXMpOwogCi0gICByZXR1cm4gcmVzdWx0OworICByZXR1cm4gcmVzdWx0OwogfQogCi1JTlQgRkRLX0RSQ19HZW5lcmF0b3JfT3BlbigKLSAgICAgICAgSERSQ19DT01QICAgICAgICAgICAgICAgICAgICAgICpwaERyY0NvbXAKLSAgICAgICAgKQotewotICAgIElOVCBlcnIgPSAwOwotICAgIEhEUkNfQ09NUCBoRGNDb21wID0gTlVMTDsKK3N0YXRpYyB2b2lkIGZpbmRQZWFrTGV2ZWxzKEhEUkNfQ09NUCBkcmNDb21wLCBjb25zdCBJTlRfUENNKiBjb25zdCBpblNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBjbGV2LCBjb25zdCBGSVhQX0RCTCBzbGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgZXh0X2xldmEsIGNvbnN0IEZJWFBfREJMIGV4dF9sZXZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgbGZlX2xldiwgY29uc3QgRklYUF9EQkwgZG14R2FpbjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBkbXhHYWluMiwgRklYUF9EQkwgcGVha1syXSkgeworICBpbnQgaSwgYzsKKyAgRklYUF9EQkwgdG1wID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgSU5UX1BDTSBtYXhTYW1wbGUgPSAwOwogCi0gICAgaWYgKHBoRHJjQ29tcCA9PSBOVUxMKSB7Ci0gICAgICBlcnIgPSAtMTsKLSAgICAgIGdvdG8gYmFpbDsKKyAgLyogZmluZCBwZWFrIGxldmVsICovCisgIHBlYWtbMF0gPSBwZWFrWzFdID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgZm9yIChpID0gMDsgaSA8IGRyY0NvbXAtPmJsb2NrTGVuZ3RoOyBpKyspIHsKKyAgICBjb25zdCBJTlRfUENNKiBwU2FtcGxlcyA9ICZpblNhbXBsZXNbaSAqIGRyY0NvbXAtPmNoYW5uZWxzXTsKKworICAgIC8qIHNpbmdsZSBjaGFubmVscyAqLworICAgIGZvciAoYyA9IDA7IGMgPCAoaW50KWRyY0NvbXAtPmNoYW5uZWxzOyBjKyspIHsKKyAgICAgIG1heFNhbXBsZSA9IGZNYXgobWF4U2FtcGxlLCAoSU5UX1BDTSlmQWJzKHBTYW1wbGVzW2NdKSk7CisgICAgfQorICB9CisgIHBlYWtbMF0gPSBmaXhNYXgocGVha1swXSwgRlhfUENNMkZYX0RCTChtYXhTYW1wbGUpID4+IERPV05NSVhfU0hJRlQpOworCisgIC8qIDcuMS82LjEgdG8gNS4xIGRvd25taXhlcyAqLworICBpZiAoZHJjQ29tcC0+ZnVsbENoYW5uZWxzID4gNSkgeworICAgIGZvciAoaSA9IDA7IGkgPCBkcmNDb21wLT5ibG9ja0xlbmd0aDsgaSsrKSB7CisgICAgICBjb25zdCBJTlRfUENNKiBwU2FtcGxlcyA9ICZpblNhbXBsZXNbaSAqIGRyY0NvbXAtPmNoYW5uZWxzXTsKKworICAgICAgLyogY2hhbm5lbCAxIChMLCBMcywuLi4pICovCisgICAgICB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICAgICAgc3dpdGNoIChkcmNDb21wLT5jaGFuQ29uZmlnKSB7CisgICAgICAgIGNhc2UgTU9ERV82XzE6CisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbNF1dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMcyAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmIsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzZdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogQ3MgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFXzdfMV9CQUNLOgorICAgICAgICBjYXNlIE1PREVfN18xX1JFQVJfU1VSUk9VTkQ6CisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbNF1dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMcyAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmIsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzddXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTHJzIC8gTHNzICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU9ERV8xXzJfMl8yXzE6CisgICAgICAgIGNhc2UgTU9ERV83XzFfRlJPTlRfQ0VOVEVSOgorICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFswXV0pID4+CisgICAgICAgICAgICAgICAgICBET1dOTUlYX1NISUZUKTsgLyogTCAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmIsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzddXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTGMgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFXzdfMV9UT1BfRlJPTlQ6CisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMF1dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMICovCisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbN11dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMdmggKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHBlYWtbMF0gPSBmaXhNYXgocGVha1swXSwgZml4cF9hYnModG1wKSk7CisKKyAgICAgIC8qIGNoYW5uZWwgMiAoUiwgUnMsLi4uKSAqLworICAgICAgdG1wID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgICAgIHN3aXRjaCAoZHJjQ29tcC0+Y2hhbkNvbmZpZykgeworICAgICAgICBjYXNlIE1PREVfNl8xOgorICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmEsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzVdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUnMgKi8KKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGV4dF9sZXZiLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs2XV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIENzICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU9ERV83XzFfQkFDSzoKKyAgICAgICAgY2FzZSBNT0RFXzdfMV9SRUFSX1NVUlJPVU5EOgorICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmEsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzVdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUnMgKi8KKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGV4dF9sZXZiLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs4XV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFJycyAvIFJzcyAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1PREVfMV8yXzJfMl8xOgorICAgICAgICBjYXNlIE1PREVfN18xX0ZST05UX0NFTlRFUjoKKyAgICAgICAgICB0bXAgKz0gKEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMV1dKSA+PgorICAgICAgICAgICAgICAgICAgRE9XTk1JWF9TSElGVCk7IC8qIFIgKi8KKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGV4dF9sZXZiLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs4XV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFJjICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU9ERV83XzFfVE9QX0ZST05UOgorICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmEsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzFdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUiAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmIsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzhdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUnZoICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBwZWFrWzBdID0gZml4TWF4KHBlYWtbMF0sIGZpeHBfYWJzKHRtcCkpOworCisgICAgICAvKiBjaGFubmVsIDMgKEMpICovCisgICAgICB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICAgICAgc3dpdGNoIChkcmNDb21wLT5jaGFuQ29uZmlnKSB7CisgICAgICAgIGNhc2UgTU9ERV8xXzJfMl8yXzE6CisgICAgICAgIGNhc2UgTU9ERV83XzFfRlJPTlRfQ0VOVEVSOgorICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFsyXV0pID4+CisgICAgICAgICAgICAgICAgICBET1dOTUlYX1NISUZUKTsgLyogQyAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmEsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzddXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTGMgKi8KKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGV4dF9sZXZhLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs4XV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFJjICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBwZWFrWzBdID0gZml4TWF4KHBlYWtbMF0sIGZpeHBfYWJzKHRtcCkpOworCisgICAgfSAvKiBmb3IgKGJsb2NrbGVuZ3RoKSAqLworCisgICAgLyogdGFrZSBkb3dubWl4IGdhaW4gaW50byBhY2NvdXQgKi8KKyAgICBwZWFrWzBdID0gZk11bHQoZG14R2FpbjUsIHBlYWtbMF0pCisgICAgICAgICAgICAgIDw8IChERlJBQ1RfQklUUyAtIDEgLSBNRVRBREFUQV9GUkFDVF9CSVRTKTsKKyAgfQorCisgIC8qIDcuMSAvIDUuMSB0byBzdGVyZW8gZG93bm1peGVzICovCisgIGlmIChkcmNDb21wLT5mdWxsQ2hhbm5lbHMgPiAyKSB7CisgICAgLyogTHQvUnQgZG93bm1peCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBkcmNDb21wLT5ibG9ja0xlbmd0aDsgaSsrKSB7CisgICAgICBjb25zdCBJTlRfUENNKiBwU2FtcGxlcyA9ICZpblNhbXBsZXNbaSAqIGRyY0NvbXAtPmNoYW5uZWxzXTsKKworICAgICAgLyogTHQgKi8KKyAgICAgIHRtcCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gPj0gMCkKKyAgICAgICAgdG1wIC09IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTXV0pID4+CisgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMcyAqLworICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA+PSAwKQorICAgICAgICB0bXAgLT0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXV0pID4+CisgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMczIgKi8KKyAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA+PSAwKQorICAgICAgICB0bXAgLT0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUlNdXSkgPj4KKyAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFJzICovCisgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID49IDApCisgICAgICAgIHRtcCAtPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdXSkgPj4KKyAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFJzMiAqLworICAgICAgaWYgKChkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA+PSAwKSAmJiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID49IDApKQorICAgICAgICB0bXAgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCB0bXApOyAvKiA3LjFjaCAqLworICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbU10gPj0gMCkKKyAgICAgICAgdG1wIC09IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1NdXSkgPj4KKyAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFMgKi8KKyAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0NdID49IDApCisgICAgICAgIHRtcCArPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtDXV0pID4+CisgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBDICovCisgICAgICB0bXAgKz0gKEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTF1dKSA+PgorICAgICAgICAgICAgICBET1dOTUlYX1NISUZUKTsgLyogTCAqLworCisgICAgICAvKiBhcHBseSBzY2FsaW5nIG9mIGRvd25taXggZ2FpbnMgKi8KKyAgICAgIC8qIG9ubHkgZm9yIHBvc2l0aXZlIHZhbHVlcyBvbmx5LCBhcyBsZWdhY3kgZGVjb2RlcnMgbWlnaHQgbm90IGtub3cgdGhpcworICAgICAgICogcGFyYW1ldGVyICovCisgICAgICBpZiAoZG14R2FpbjIgPiBGTDJGWENPTlNUX0RCTCgwLmYpKSB7CisgICAgICAgIGlmIChkcmNDb21wLT5mdWxsQ2hhbm5lbHMgPiA1KSB7CisgICAgICAgICAgdG1wID0gZk11bHQoZG14R2FpbjUsIHRtcCkgPDwgKERGUkFDVF9CSVRTIC0gMSAtIE1FVEFEQVRBX0ZSQUNUX0JJVFMpOworICAgICAgICB9CisgICAgICAgIHRtcCA9IGZNdWx0KGRteEdhaW4yLCB0bXApIDw8IChERlJBQ1RfQklUUyAtIDEgLSBNRVRBREFUQV9GUkFDVF9CSVRTKTsKKyAgICAgIH0KKyAgICAgIHBlYWtbMF0gPSBmaXhNYXgocGVha1swXSwgZml4cF9hYnModG1wKSk7CisKKyAgICAgIC8qIFJ0ICovCisgICAgICB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID49IDApCisgICAgICAgIHRtcCArPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMU11dKSA+PgorICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTHMgKi8KKyAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPj0gMCkKKyAgICAgICAgdG1wICs9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTMl1dKSA+PgorICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTHMyICovCisgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPj0gMCkKKyAgICAgICAgdG1wICs9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JTXV0pID4+CisgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBScyAqLworICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXSA+PSAwKQorICAgICAgICB0bXAgKz0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXV0pID4+CisgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBSczIgKi8KKyAgICAgIGlmICgoZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPj0gMCkgJiYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXSA+PSAwKSkKKyAgICAgICAgdG1wID0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgdG1wKTsgLyogNy4xY2ggKi8KKyAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1NdID49IDApCisgICAgICAgIHRtcCArPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtTXV0pID4+CisgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBTICovCisgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA+PSAwKQorICAgICAgICB0bXAgKz0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbQ11dKSA+PgorICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogQyAqLworICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JdXSkgPj4KKyAgICAgICAgICAgICAgRE9XTk1JWF9TSElGVCk7IC8qIFIgKi8KKworICAgICAgLyogYXBwbHkgc2NhbGluZyBvZiBkb3dubWl4IGdhaW5zICovCisgICAgICAvKiBvbmx5IGZvciBwb3NpdGl2ZSB2YWx1ZXMgb25seSwgYXMgbGVnYWN5IGRlY29kZXJzIG1pZ2h0IG5vdCBrbm93IHRoaXMKKyAgICAgICAqIHBhcmFtZXRlciAqLworICAgICAgaWYgKGRteEdhaW4yID4gRkwyRlhDT05TVF9EQkwoMC5mKSkgeworICAgICAgICBpZiAoZHJjQ29tcC0+ZnVsbENoYW5uZWxzID4gNSkgeworICAgICAgICAgIHRtcCA9IGZNdWx0KGRteEdhaW41LCB0bXApIDw8IChERlJBQ1RfQklUUyAtIDEgLSBNRVRBREFUQV9GUkFDVF9CSVRTKTsKKyAgICAgICAgfQorICAgICAgICB0bXAgPSBmTXVsdChkbXhHYWluMiwgdG1wKSA8PCAoREZSQUNUX0JJVFMgLSAxIC0gTUVUQURBVEFfRlJBQ1RfQklUUyk7CisgICAgICB9CisgICAgICBwZWFrWzBdID0gZml4TWF4KHBlYWtbMF0sIGZpeHBfYWJzKHRtcCkpOwogICAgIH0KIAotICAgIC8qIGFsbG9jYXRlIG1lbW9yeSAqLwotICAgIGhEY0NvbXAgPSAoSERSQ19DT01QKUZES2NhbGxvYygxLCBzaXplb2YoRFJDX0NPTVApKTsKKyAgICAvKiBMby9SbyBkb3dubWl4ICovCisgICAgZm9yIChpID0gMDsgaSA8IGRyY0NvbXAtPmJsb2NrTGVuZ3RoOyBpKyspIHsKKyAgICAgIGNvbnN0IElOVF9QQ00qIHBTYW1wbGVzID0gJmluU2FtcGxlc1tpICogZHJjQ29tcC0+Y2hhbm5lbHNdOwogCi0gICAgaWYgKGhEY0NvbXAgPT0gTlVMTCkgewotICAgICAgZXJyID0gLTE7Ci0gICAgICBnb3RvIGJhaWw7CisgICAgICAvKiBMbyAqLworICAgICAgdG1wID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgICAgIHN3aXRjaCAoZHJjQ29tcC0+Y2hhbkNvbmZpZykgeworICAgICAgICBjYXNlIE1PREVfNl8xOgorICAgICAgICAgIHRtcCArPSBmTXVsdERpdjIoZk11bHQoc2xldiwgZXh0X2xldmEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbNF1dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMcyAqLworICAgICAgICAgIHRtcCArPSBmTXVsdERpdjIoZk11bHQoc2xldiwgZXh0X2xldmIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbNl1dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBDcyAqLworICAgICAgICAgIHRtcCArPSBmTXVsdERpdjIoY2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMl1dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBDICovCisgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzBdXSkgPj4KKyAgICAgICAgICAgICAgICAgIERPV05NSVhfU0hJRlQpOyAvKiBMICovCisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihsZmVfbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFszXV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSAtIExGRV9MRVZfU0NBTEUpOyAvKiBMRkUgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFXzdfMV9CQUNLOgorICAgICAgICBjYXNlIE1PREVfN18xX1JFQVJfU1VSUk9VTkQ6CisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihmTXVsdChzbGV2LCBleHRfbGV2YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs0XV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIExzICovCisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihmTXVsdChzbGV2LCBleHRfbGV2YiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs3XV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIExycyAvIExzcyovCisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihjbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFsyXV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIEMgKi8KKyAgICAgICAgICB0bXAgKz0gKEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMF1dKSA+PgorICAgICAgICAgICAgICAgICAgRE9XTk1JWF9TSElGVCk7IC8qIEwgKi8KKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGxmZV9sZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzNdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxIC0gTEZFX0xFVl9TQ0FMRSk7IC8qIExGRSAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1PREVfMV8yXzJfMl8xOgorICAgICAgICBjYXNlIE1PREVfN18xX0ZST05UX0NFTlRFUjoKKyAgICAgICAgICB0bXAgKz0gKEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMF1dKSA+PgorICAgICAgICAgICAgICAgICAgRE9XTk1JWF9TSElGVCk7IC8qIEwgKi8KKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGV4dF9sZXZiLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs3XV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIExjICovCisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihmTXVsdChleHRfbGV2YSwgY2xldiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs3XV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIExjIC0gc2Vjb25kIHBhdGgqLworICAgICAgICAgIHRtcCArPSBmTXVsdERpdjIoY2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMl1dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBDICovCisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs0XV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIExzICovCisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihsZmVfbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFszXV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSAtIExGRV9MRVZfU0NBTEUpOyAvKiBMRkUgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFXzdfMV9UT1BfRlJPTlQ6CisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMF1dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMICovCisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbN11dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMdmggKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzJdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogQyAqLworICAgICAgICAgIHRtcCArPSBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbNF1dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMcyAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIobGZlX2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbM11dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEgLSBMRkVfTEVWX1NDQUxFKTsgLyogTEZFICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID49IDApCisgICAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgICBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFNdXSkgPj4KKyAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMcyAqLworICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPj0gMCkKKyAgICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICAgIGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdXSkgPj4KKyAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMczIgKi8KKyAgICAgICAgICBpZiAoKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID49IDApICYmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPj0gMCkpCisgICAgICAgICAgICB0bXAgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCB0bXApOyAvKiA3LjFjaCAqLworICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1NdID49IDApCisgICAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgICBmTXVsdERpdjIoc2xldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQoRkwyRlhDT05TVF9EQkwoMC43ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1NdXSkpID4+CisgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUyAqLworICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0NdID49IDApCisgICAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgICBmTXVsdERpdjIoY2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbQ11dKSA+PgorICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIEMgKi8KKyAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFszXSA+PSAwKQorICAgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihsZmVfbGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFszXV0pID4+CisgICAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxIC0gTEZFX0xFVl9TQ0FMRSk7IC8qIExGRSAqLworICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMXV0pID4+CisgICAgICAgICAgICAgICAgICBET1dOTUlYX1NISUZUKTsgLyogTCAqLworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvKiBhcHBseSBzY2FsaW5nIG9mIGRvd25taXggZ2FpbnMgKi8KKyAgICAgIC8qIG9ubHkgZm9yIHBvc2l0aXZlIHZhbHVlcyBvbmx5LCBhcyBsZWdhY3kgZGVjb2RlcnMgbWlnaHQgbm90IGtub3cgdGhpcworICAgICAgICogcGFyYW1ldGVyICovCisgICAgICBpZiAoZG14R2FpbjIgPiBGTDJGWENPTlNUX0RCTCgwLmYpKSB7CisgICAgICAgIGlmIChkcmNDb21wLT5mdWxsQ2hhbm5lbHMgPiA1KSB7CisgICAgICAgICAgdG1wID0gZk11bHQoZG14R2FpbjUsIHRtcCkgPDwgKERGUkFDVF9CSVRTIC0gMSAtIE1FVEFEQVRBX0ZSQUNUX0JJVFMpOworICAgICAgICB9CisgICAgICAgIHRtcCA9IGZNdWx0KGRteEdhaW4yLCB0bXApIDw8IChERlJBQ1RfQklUUyAtIDEgLSBNRVRBREFUQV9GUkFDVF9CSVRTKTsKKyAgICAgIH0KKyAgICAgIHBlYWtbMF0gPSBmaXhNYXgocGVha1swXSwgZml4cF9hYnModG1wKSk7CisKKyAgICAgIC8qIFJvICovCisgICAgICB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICAgICAgc3dpdGNoIChkcmNDb21wLT5jaGFuQ29uZmlnKSB7CisgICAgICAgIGNhc2UgTU9ERV82XzE6CisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihmTXVsdChzbGV2LCBleHRfbGV2YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs1XV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFJzICovCisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihmTXVsdChzbGV2LCBleHRfbGV2YiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs2XV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIENzICovCisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihjbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFsyXV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIEMgKi8KKyAgICAgICAgICB0bXAgKz0gKEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMV1dKSA+PgorICAgICAgICAgICAgICAgICAgRE9XTk1JWF9TSElGVCk7IC8qIFIgKi8KKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGxmZV9sZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzNdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxIC0gTEZFX0xFVl9TQ0FMRSk7IC8qIExGRSAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1PREVfN18xX0JBQ0s6CisgICAgICAgIGNhc2UgTU9ERV83XzFfUkVBUl9TVVJST1VORDoKKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGZNdWx0KHNsZXYsIGV4dF9sZXZhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzVdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUnMgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGZNdWx0KHNsZXYsIGV4dF9sZXZiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzhdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUnJzIC8gUnNzKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzJdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogQyAqLworICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFsxXV0pID4+CisgICAgICAgICAgICAgICAgICBET1dOTUlYX1NISUZUKTsgLyogUiAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIobGZlX2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbM11dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEgLSBMRkVfTEVWX1NDQUxFKTsgLyogTEZFICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU9ERV8xXzJfMl8yXzE6CisgICAgICAgIGNhc2UgTU9ERV83XzFfRlJPTlRfQ0VOVEVSOgorICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFsxXV0pID4+CisgICAgICAgICAgICAgICAgICBET1dOTUlYX1NISUZUKTsgLyogUiAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmIsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzhdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUmMgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGZNdWx0KGV4dF9sZXZhLCBjbGV2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzhdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUmMgLSBzZWNvbmQgcGF0aCovCisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihjbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFsyXV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIEMgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzVdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUnMgKi8KKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGxmZV9sZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzNdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxIC0gTEZFX0xFVl9TQ0FMRSk7IC8qIExGRSAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1PREVfN18xX1RPUF9GUk9OVDoKKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGV4dF9sZXZhLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFsxXV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFIgKi8KKyAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGV4dF9sZXZiLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs4XV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFJ2aCAqLworICAgICAgICAgIHRtcCArPSBmTXVsdERpdjIoY2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMl1dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBDICovCisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs1XV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFJzICovCisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihsZmVfbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFszXV0pID4+CisgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSAtIExGRV9MRVZfU0NBTEUpOyAvKiBMRkUgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPj0gMCkKKyAgICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICAgIGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSU11dKSA+PgorICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFJzICovCisgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXSA+PSAwKQorICAgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgICAgZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JTMl1dKSA+PgorICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFJzMiAqLworICAgICAgICAgIGlmICgoZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPj0gMCkgJiYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXSA+PSAwKSkKKyAgICAgICAgICAgIHRtcCA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIHRtcCk7IC8qIDcuMWNoICovCisgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbU10gPj0gMCkKKyAgICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICAgIGZNdWx0RGl2MihzbGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjdmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbU11dKSkgPj4KKyAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBTICovCisgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gPj0gMCkKKyAgICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICAgIGZNdWx0RGl2MihjbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtDXV0pID4+CisgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogQyAqLworICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4WzNdID49IDApCisgICAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGxmZV9sZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzNdXSkgPj4KKyAgICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEgLSBMRkVfTEVWX1NDQUxFKTsgLyogTEZFICovCisgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JdXSkgPj4KKyAgICAgICAgICAgICAgICAgIERPV05NSVhfU0hJRlQpOyAvKiBSICovCisgICAgICB9CisKKyAgICAgIC8qIGFwcGx5IHNjYWxpbmcgb2YgZG93bm1peCBnYWlucyAqLworICAgICAgLyogb25seSBmb3IgcG9zaXRpdmUgdmFsdWVzIG9ubHksIGFzIGxlZ2FjeSBkZWNvZGVycyBtaWdodCBub3Qga25vdyB0aGlzCisgICAgICAgKiBwYXJhbWV0ZXIgKi8KKyAgICAgIGlmIChkbXhHYWluMiA+IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICAgICAgaWYgKGRyY0NvbXAtPmZ1bGxDaGFubmVscyA+IDUpIHsKKyAgICAgICAgICB0bXAgPSBmTXVsdChkbXhHYWluNSwgdG1wKSA8PCAoREZSQUNUX0JJVFMgLSAxIC0gTUVUQURBVEFfRlJBQ1RfQklUUyk7CisgICAgICAgIH0KKyAgICAgICAgdG1wID0gZk11bHQoZG14R2FpbjIsIHRtcCkgPDwgKERGUkFDVF9CSVRTIC0gMSAtIE1FVEFEQVRBX0ZSQUNUX0JJVFMpOworICAgICAgfQorICAgICAgcGVha1swXSA9IGZpeE1heChwZWFrWzBdLCBmaXhwX2Ficyh0bXApKTsKICAgICB9CisgIH0KIAotICAgIEZES21lbWNsZWFyKGhEY0NvbXAsIHNpemVvZihEUkNfQ09NUCkpOworICBwZWFrWzFdID0gZml4TWF4KHBlYWtbMF0sIHBlYWtbMV0pOwogCi0gICAgLyogUmV0dXJuIGRyYyBjb21wcmVzc29yIGluc3RhbmNlICovCi0gICAgKnBoRHJjQ29tcCA9IGhEY0NvbXA7Ci0gICAgcmV0dXJuIGVycjsKKyAgLyogTW9ubyBEb3dubWl4IC0gZm9yIGNvbXBfdmFsIG9ubHkgKi8KKyAgaWYgKGRyY0NvbXAtPmZ1bGxDaGFubmVscyA+IDEpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHJjQ29tcC0+YmxvY2tMZW5ndGg7IGkrKykgeworICAgICAgY29uc3QgSU5UX1BDTSogcFNhbXBsZXMgPSAmaW5TYW1wbGVzW2kgKiBkcmNDb21wLT5jaGFubmVsc107CisKKyAgICAgIHRtcCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgICBzd2l0Y2ggKGRyY0NvbXAtPmNoYW5Db25maWcpIHsKKyAgICAgICAgY2FzZSBNT0RFXzZfMToKKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGZNdWx0KHNsZXYsIGV4dF9sZXZhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzRdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTHMgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGZNdWx0KHNsZXYsIGV4dF9sZXZhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzVdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUnMgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHQoZk11bHQoc2xldiwgZXh0X2xldmIpLAorICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs2XV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIENzICovCisgICAgICAgICAgdG1wICs9IGZNdWx0KGNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzJdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogQyAqLworICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFswXV0pID4+CisgICAgICAgICAgICAgICAgICBET1dOTUlYX1NISUZUKTsgLyogTCAqLworICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFsxXV0pID4+CisgICAgICAgICAgICAgICAgICBET1dOTUlYX1NISUZUKTsgLyogUiAqLworICAgICAgICAgIHRtcCArPSBmTXVsdChsZmVfbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFszXV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSAtIExGRV9MRVZfU0NBTEUpOyAvKiBMRkUgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFXzdfMV9CQUNLOgorICAgICAgICBjYXNlIE1PREVfN18xX1JFQVJfU1VSUk9VTkQ6CisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihmTXVsdChzbGV2LCBleHRfbGV2YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs0XV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIExzICovCisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihmTXVsdChzbGV2LCBleHRfbGV2YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs1XV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFJzICovCisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihmTXVsdChzbGV2LCBleHRfbGV2YiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs3XV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIExycyAvIExzcyovCisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihmTXVsdChzbGV2LCBleHRfbGV2YiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs4XV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFJycyAvIFJzcyovCisgICAgICAgICAgdG1wICs9IGZNdWx0KGNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzJdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogQyAqLworICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFswXV0pID4+CisgICAgICAgICAgICAgICAgICBET1dOTUlYX1NISUZUKTsgLyogTCAqLworICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFsxXV0pID4+CisgICAgICAgICAgICAgICAgICBET1dOTUlYX1NISUZUKTsgLyogUiAqLworICAgICAgICAgIHRtcCArPSBmTXVsdChsZmVfbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFszXV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSAtIExGRV9MRVZfU0NBTEUpOyAvKiBMRkUgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFXzFfMl8yXzJfMToKKyAgICAgICAgY2FzZSBNT0RFXzdfMV9GUk9OVF9DRU5URVI6CisgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzBdXSkgPj4KKyAgICAgICAgICAgICAgICAgIERPV05NSVhfU0hJRlQpOyAvKiBMICovCisgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzFdXSkgPj4KKyAgICAgICAgICAgICAgICAgIERPV05NSVhfU0hJRlQpOyAvKiBSICovCisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbN11dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBMYyAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmIsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzhdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUmMgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKGZNdWx0KGV4dF9sZXZhLCBjbGV2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzddXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTGMgLSBzZWNvbmQgcGF0aCovCisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihmTXVsdChleHRfbGV2YSwgY2xldiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs4XV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFJjIC0gc2Vjb25kIHBhdGgqLworICAgICAgICAgIHRtcCArPSBmTXVsdChjbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFsyXV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIEMgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzRdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTHMgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzVdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUnMgKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHQobGZlX2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbM11dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEgLSBMRkVfTEVWX1NDQUxFKTsgLyogTEZFICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU9ERV83XzFfVE9QX0ZST05UOgorICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmEsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzBdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTCAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmEsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzFdXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogUiAqLworICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICBmTXVsdERpdjIoZXh0X2xldmIsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzddXSkgPj4KKyAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTHZoICovCisgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihleHRfbGV2YiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbOF1dKSA+PgorICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBSdmggKi8KKyAgICAgICAgICB0bXAgKz0gZk11bHQoY2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbMl1dKSA+PgorICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBDICovCisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs0XV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIExzICovCisgICAgICAgICAgdG1wICs9IGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFs1XV0pID4+CisgICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFJzICovCisgICAgICAgICAgdG1wICs9IGZNdWx0KGxmZV9sZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4WzNdXSkgPj4KKyAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxIC0gTEZFX0xFVl9TQ0FMRSk7IC8qIExGRSAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA+PSAwKQorICAgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgICAgZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTXV0pID4+CisgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTHMgKi8KKyAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID49IDApCisgICAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgICBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXV0pID4+CisgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxKTsgLyogTHMyICovCisgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdID49IDApCisgICAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgICBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUlNdXSkgPj4KKyAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBScyAqLworICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPj0gMCkKKyAgICAgICAgICAgIHRtcCArPQorICAgICAgICAgICAgICAgIGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdXSkgPj4KKyAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBSczIgKi8KKyAgICAgICAgICBpZiAoKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID49IDApICYmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPj0gMCkpCisgICAgICAgICAgICB0bXAgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCB0bXApOyAvKiA3LjFjaCAqLworICAgICAgICAgIC8qaWYgKChkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA+PSAwKSAmJiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID49IDApKSB0bXAgKj0wLjcwN2Y7Ki8gLyogNy4xY2ggKi8KKyAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtTXSA+PSAwKQorICAgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgICAgZk11bHREaXYyKHNsZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuN2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtTXV0pKSA+PgorICAgICAgICAgICAgICAgIChET1dOTUlYX1NISUZUIC0gMSk7IC8qIFMgKi8KKyAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA+PSAwKQorICAgICAgICAgICAgdG1wICs9IGZNdWx0KGNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0NdXSkgPj4KKyAgICAgICAgICAgICAgICAgICAoRE9XTk1JWF9TSElGVCAtIDEpOyAvKiBDICgyKmNsZXYpICovCisgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbM10gPj0gMCkKKyAgICAgICAgICAgIHRtcCArPSBmTXVsdChsZmVfbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFszXV0pID4+CisgICAgICAgICAgICAgICAgICAgKERPV05NSVhfU0hJRlQgLSAxIC0gTEZFX0xFVl9TQ0FMRSk7IC8qIExGRSAqLworICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMXV0pID4+CisgICAgICAgICAgICAgICAgICBET1dOTUlYX1NISUZUKTsgLyogTCAqLworICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSXV0pID4+CisgICAgICAgICAgICAgICAgICBET1dOTUlYX1NISUZUKTsgLyogUiAqLworICAgICAgfQorCisgICAgICAvKiBhcHBseSBzY2FsaW5nIG9mIGRvd25taXggZ2FpbnMgKi8KKyAgICAgIC8qIG9ubHkgZm9yIHBvc2l0aXZlIHZhbHVlcyBvbmx5LCBhcyBsZWdhY3kgZGVjb2RlcnMgbWlnaHQgbm90IGtub3cgdGhpcworICAgICAgICogcGFyYW1ldGVyICovCisgICAgICBpZiAoZG14R2FpbjIgPiBGTDJGWENPTlNUX0RCTCgwLmYpKSB7CisgICAgICAgIGlmIChkcmNDb21wLT5mdWxsQ2hhbm5lbHMgPiA1KSB7CisgICAgICAgICAgdG1wID0gZk11bHQoZG14R2FpbjUsIHRtcCkgPDwgKERGUkFDVF9CSVRTIC0gMSAtIE1FVEFEQVRBX0ZSQUNUX0JJVFMpOworICAgICAgICB9CisgICAgICAgIHRtcCA9IGZNdWx0KGRteEdhaW4yLCB0bXApIDw8IChERlJBQ1RfQklUUyAtIDEgLSBNRVRBREFUQV9GUkFDVF9CSVRTKTsKKyAgICAgIH0KKyAgICAgIHBlYWtbMV0gPSBmaXhNYXgocGVha1sxXSwgZml4cF9hYnModG1wKSk7CisgICAgfQorICB9Cit9CisKK0lOVCBGREtfRFJDX0dlbmVyYXRvcl9PcGVuKEhEUkNfQ09NUCogcGhEcmNDb21wKSB7CisgIElOVCBlcnIgPSAwOworICBIRFJDX0NPTVAgaERjQ29tcCA9IE5VTEw7CisKKyAgaWYgKHBoRHJjQ29tcCA9PSBOVUxMKSB7CisgICAgZXJyID0gLTE7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogYWxsb2NhdGUgbWVtb3J5ICovCisgIGhEY0NvbXAgPSAoSERSQ19DT01QKUZES2NhbGxvYygxLCBzaXplb2YoRFJDX0NPTVApKTsKKworICBpZiAoaERjQ29tcCA9PSBOVUxMKSB7CisgICAgZXJyID0gLTE7CisgICAgZ290byBiYWlsOworICB9CisKKyAgRkRLbWVtY2xlYXIoaERjQ29tcCwgc2l6ZW9mKERSQ19DT01QKSk7CisKKyAgLyogUmV0dXJuIGRyYyBjb21wcmVzc29yIGluc3RhbmNlICovCisgICpwaERyY0NvbXAgPSBoRGNDb21wOworICByZXR1cm4gZXJyOwogYmFpbDoKLSAgICBGREtfRFJDX0dlbmVyYXRvcl9DbG9zZSgmaERjQ29tcCk7Ci0gICAgcmV0dXJuIGVycjsKKyAgRkRLX0RSQ19HZW5lcmF0b3JfQ2xvc2UoJmhEY0NvbXApOworICByZXR1cm4gZXJyOwogfQogCi1JTlQgRkRLX0RSQ19HZW5lcmF0b3JfQ2xvc2UoCi0gICAgICAgIEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAqcGhEcmNDb21wCi0gICAgICAgICkKLXsKLSAgICBpZiAocGhEcmNDb21wID09IE5VTEwpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKCpwaERyY0NvbXAgIT0gTlVMTCkgewotICAgICAgRkRLZnJlZSgqcGhEcmNDb21wKTsKLSAgICAgICpwaERyY0NvbXAgPSBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gMDsKK0lOVCBGREtfRFJDX0dlbmVyYXRvcl9DbG9zZShIRFJDX0NPTVAqIHBoRHJjQ29tcCkgeworICBpZiAocGhEcmNDb21wID09IE5VTEwpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKCpwaERyY0NvbXAgIT0gTlVMTCkgeworICAgIEZES2ZyZWUoKnBoRHJjQ29tcCk7CisgICAgKnBoRHJjQ29tcCA9IE5VTEw7CisgIH0KKyAgcmV0dXJuIDA7CiB9CiAKK0lOVCBGREtfRFJDX0dlbmVyYXRvcl9Jbml0aWFsaXplKEhEUkNfQ09NUCBkcmNDb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRFJDX1BST0ZJTEUgcHJvZmlsZUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEUkNfUFJPRklMRSBwcm9maWxlUkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYmxvY2tMZW5ndGgsIGNvbnN0IFVJTlQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENIQU5ORUxfTU9ERSBjaGFubmVsTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENIQU5ORUxfT1JERVIgY2hhbm5lbE9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgdXNlV2VpZ2h0aW5nKSB7CisgIGludCBpOworICBDSEFOTkVMX01BUFBJTkcgY2hhbm5lbE1hcHBpbmc7CiAKLUlOVCBGREtfRFJDX0dlbmVyYXRvcl9Jbml0aWFsaXplKAotICAgICAgICBIRFJDX0NPTVAgICAgICAgICAgICAgICAgICAgICAgIGRyY0NvbXAsCi0gICAgICAgIGNvbnN0IERSQ19QUk9GSUxFICAgICAgICAgICAgICAgcHJvZmlsZUxpbmUsCi0gICAgICAgIGNvbnN0IERSQ19QUk9GSUxFICAgICAgICAgICAgICAgcHJvZmlsZVJGLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrTGVuZ3RoLAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgIGNvbnN0IENIQU5ORUxfTU9ERSAgICAgICAgICAgICAgY2hhbm5lbE1vZGUsCi0gICAgICAgIGNvbnN0IENIQU5ORUxfT1JERVIgICAgICAgICAgICAgY2hhbm5lbE9yZGVyLAotICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICAgICAgICAgICAgIHVzZVdlaWdodGluZwotICAgICAgICApCi17Ci0gICAgaW50IGk7Ci0gICAgQ0hBTk5FTF9NQVBQSU5HIGNoYW5uZWxNYXBwaW5nOworICBkcmNDb21wLT5saW1EZWNheSA9CisgICAgICBGTDJGWENPTlNUX0RCTCgoKDAuMDA2ZiAvIDI1NikgKiBibG9ja0xlbmd0aCkgLyBNRVRBREFUQV9JTlRfU0NBTEUpOwogCi0gICAgZHJjQ29tcC0+bGltRGVjYXkgPSBGTDJGWENPTlNUX0RCTCggKCgwLjAwNmYgLyAyNTYpICogYmxvY2tMZW5ndGgpIC8gTUVUQURBVEFfSU5UX1NDQUxFICk7CisgIC8qIFNhdmUgcGFyYW1ldGVycy4gKi8KKyAgZHJjQ29tcC0+YmxvY2tMZW5ndGggPSBibG9ja0xlbmd0aDsKKyAgZHJjQ29tcC0+c2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgIGRyY0NvbXAtPmNoYW5Db25maWcgPSBjaGFubmVsTW9kZTsKKyAgZHJjQ29tcC0+dXNlV2VpZ2h0aW5nID0gdXNlV2VpZ2h0aW5nOwogCi0gICAgLyogU2F2ZSBwYXJhbWV0ZXJzLiAqLwotICAgIGRyY0NvbXAtPmJsb2NrTGVuZ3RoID0gYmxvY2tMZW5ndGg7Ci0gICAgZHJjQ29tcC0+c2FtcGxlUmF0ZSAgPSBzYW1wbGVSYXRlOwotICAgIGRyY0NvbXAtPmNoYW5Db25maWcgPSBjaGFubmVsTW9kZTsKLSAgICBkcmNDb21wLT51c2VXZWlnaHRpbmcgPSB1c2VXZWlnaHRpbmc7CisgIGlmIChGREtfRFJDX0dlbmVyYXRvcl9zZXREcmNQcm9maWxlKGRyY0NvbXAsIHByb2ZpbGVMaW5lLCBwcm9maWxlUkYpICE9CisgICAgICAwKSB7IC8qIGV4cGVjdHMgaW5pdGlhbGl6ZWQgYmxvY2tMZW5ndGggYW5kIHNhbXBsZVJhdGUgKi8KKyAgICByZXR1cm4gKC0xKTsKKyAgfQogCi0gICAgaWYgKEZES19EUkNfR2VuZXJhdG9yX3NldERyY1Byb2ZpbGUoZHJjQ29tcCwgcHJvZmlsZUxpbmUsIHByb2ZpbGVSRikhPTApIHsgLyogZXhwZWN0cyBpbml0aWFsaXplZCBibG9ja0xlbmd0aCBhbmQgc2FtcGxlUmF0ZSAqLwotICAgICAgcmV0dXJuICgtMSk7Ci0gICAgfQorICAvKiBTZXQgbnVtYmVyIG9mIGNoYW5uZWxzIGFuZCBjaGFubmVsIG9mZnNldHMuICovCisgIGlmIChGREthYWNFbmNfSW5pdENoYW5uZWxNYXBwaW5nKGNoYW5uZWxNb2RlLCBjaGFubmVsT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsTWFwcGluZykgIT0gQUFDX0VOQ19PSykgeworICAgIHJldHVybiAoLTIpOworICB9CiAKLSAgICAvKiBTZXQgbnVtYmVyIG9mIGNoYW5uZWxzIGFuZCBjaGFubmVsIG9mZnNldHMuICovCi0gICAgaWYgKEZES2FhY0VuY19Jbml0Q2hhbm5lbE1hcHBpbmcoY2hhbm5lbE1vZGUsIGNoYW5uZWxPcmRlciwgJmNoYW5uZWxNYXBwaW5nKSE9QUFDX0VOQ19PSykgewotICAgICAgcmV0dXJuICgtMik7Ci0gICAgfQorICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSBkcmNDb21wLT5jaGFubmVsSWR4W2ldID0gLTE7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSBkcmNDb21wLT5jaGFubmVsSWR4W2ldID0gLTE7Ci0KLSAgICBzd2l0Y2ggKGNoYW5uZWxNb2RlKSB7CisgIHN3aXRjaCAoY2hhbm5lbE1vZGUpIHsKICAgICBjYXNlIE1PREVfMTogLyogbW9ubyAqLwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0NdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzBdOwotICAgICAgICBicmVhazsKKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzBdOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBNT0RFXzI6IC8qIHN0ZXJlbyAqLwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzBdOwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzFdOwotICAgICAgICBicmVhazsKKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTF0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzBdOworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMV07CisgICAgICBicmVhazsKICAgICBjYXNlIE1PREVfMV8yOiAvKiAzY2ggKi8KLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFswXTsKLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFsxXTsKLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsKLSAgICAgICAgYnJlYWs7CisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUl0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzFdOworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMF07CisgICAgICBicmVhazsKICAgICBjYXNlIE1PREVfMV8yXzE6IC8qIDRjaCAqLwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzBdOwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzFdOwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0NdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzBdOwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1NdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzBdOwotICAgICAgICBicmVhazsKKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTF0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzBdOworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMV07CisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0NdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbU10gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzBdOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBNT0RFXzFfMl8yOiAvKiA1Y2ggKi8KLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFswXTsKLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFsxXTsKLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsKLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFswXTsKLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFsxXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT0RFXzFfMl8yXzE6ICAvKiA1LjEgY2ggKi8KLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFswXTsKLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFsxXTsKLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsKLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMRkVdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzNdLkNoYW5uZWxJbmRleFswXTsKLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFswXTsKLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFsxXTsKLSAgICAgICAgYnJlYWs7CisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUl0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzFdOworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMF07CisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1syXS5DaGFubmVsSW5kZXhbMF07CisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1syXS5DaGFubmVsSW5kZXhbMV07CisgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfMV8yXzJfMTogLyogNS4xIGNoICovCisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFswXTsKKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUl0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzFdOworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMF07CisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xGRV0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bM10uQ2hhbm5lbEluZGV4WzBdOworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzBdOworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzFdOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBNT0RFXzFfMl8yXzJfMTogLyogNy4xIGNoICovCiAgICAgY2FzZSBNT0RFXzdfMV9GUk9OVF9DRU5URVI6Ci0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTF0gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1syXS5DaGFubmVsSW5kZXhbMF07IC8qIGwgKi8KLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFsxXTsgLyogciAqLwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0NdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMF0uQ2hhbm5lbEluZGV4WzBdOyAvKiBjICovCi0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTEZFXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1s0XS5DaGFubmVsSW5kZXhbMF07IC8qIGxmZSAqLwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xTXSAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bM10uQ2hhbm5lbEluZGV4WzBdOyAvKiBscyAqLwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JTXSAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bM10uQ2hhbm5lbEluZGV4WzFdOyAvKiBycyAqLwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzBdOyAvKiBsYyAqLwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzFdOyAvKiByYyAqLwotICAgICAgICBicmVhazsKKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTF0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzBdOyAvKiBsICovCisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFsxXTsgLyogciAqLworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMF07IC8qIGMgKi8KKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTEZFXSA9CisgICAgICAgICAgY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzRdLkNoYW5uZWxJbmRleFswXTsgLyogbGZlICovCisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA9CisgICAgICAgICAgY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzNdLkNoYW5uZWxJbmRleFswXTsgLyogbHMgKi8KKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdID0KKyAgICAgICAgICBjaGFubmVsTWFwcGluZy5lbEluZm9bM10uQ2hhbm5lbEluZGV4WzFdOyAvKiBycyAqLworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID0KKyAgICAgICAgICBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzBdOyAvKiBsYyAqLworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID0KKyAgICAgICAgICBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzFdOyAvKiByYyAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFXzdfMV9CQUNLOgogICAgIGNhc2UgTU9ERV83XzFfUkVBUl9TVVJST1VORDoKLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSAgID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFswXTsgLyogbCAqLwotICAgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JdICAgPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzFdOyAvKiByICovCi0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMF07IC8qIGMgKi8KLSAgICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMRkVdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzRdLkNoYW5uZWxJbmRleFswXTsgLyogbGZlICovCi0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1szXS5DaGFubmVsSW5kZXhbMF07IC8qIGxyZWFyICovCi0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdICA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1szXS5DaGFubmVsSW5kZXhbMV07IC8qIHJyZWFyICovCi0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1syXS5DaGFubmVsSW5kZXhbMF07IC8qIGxzICovCi0gICAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1syXS5DaGFubmVsSW5kZXhbMV07IC8qIHJzICovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9ERV8xXzE6Ci0gICAgY2FzZSBNT0RFXzFfMV8xXzE6Ci0gICAgY2FzZSBNT0RFXzFfMV8xXzFfMV8xOgotICAgIGNhc2UgTU9ERV8xXzFfMV8xXzFfMV8xXzE6Ci0gICAgY2FzZSBNT0RFXzFfMV8xXzFfMV8xXzFfMV8xXzFfMV8xOgotICAgIGNhc2UgTU9ERV8yXzI6Ci0gICAgY2FzZSBNT0RFXzJfMl8yOgotICAgIGNhc2UgTU9ERV8yXzJfMl8yOgotICAgIGNhc2UgTU9ERV8yXzJfMl8yXzJfMjoKKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTF0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzBdOyAvKiBsICovCisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFsxXTsgLyogciAqLworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMF07IC8qIGMgKi8KKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTEZFXSA9CisgICAgICAgICAgY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzRdLkNoYW5uZWxJbmRleFswXTsgLyogbGZlICovCisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA9CisgICAgICAgICAgY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzNdLkNoYW5uZWxJbmRleFswXTsgLyogbHJlYXIgKi8KKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdID0KKyAgICAgICAgICBjaGFubmVsTWFwcGluZy5lbEluZm9bM10uQ2hhbm5lbEluZGV4WzFdOyAvKiBycmVhciAqLworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID0KKyAgICAgICAgICBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzBdOyAvKiBscyAqLworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID0KKyAgICAgICAgICBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzFdOyAvKiBycyAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFXzZfMToKKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTF0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzBdOyAvKiBsICovCisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W1JdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzFdLkNoYW5uZWxJbmRleFsxXTsgLyogciAqLworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1swXS5DaGFubmVsSW5kZXhbMF07IC8qIGMgKi8KKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTEZFXSA9CisgICAgICAgICAgY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzRdLkNoYW5uZWxJbmRleFswXTsgLyogbGZlICovCisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA9CisgICAgICAgICAgY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzJdLkNoYW5uZWxJbmRleFswXTsgLyogbHMgKi8KKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdID0KKyAgICAgICAgICBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzFdOyAvKiBycyAqLworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtTXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1szXS5DaGFubmVsSW5kZXhbMF07IC8qIHMgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV83XzFfVE9QX0ZST05UOgorICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMXSA9IGNoYW5uZWxNYXBwaW5nLmVsSW5mb1sxXS5DaGFubmVsSW5kZXhbMF07IC8qIGwgKi8KKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUl0gPSBjaGFubmVsTWFwcGluZy5lbEluZm9bMV0uQ2hhbm5lbEluZGV4WzFdOyAvKiByICovCisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0NdID0gY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzBdLkNoYW5uZWxJbmRleFswXTsgLyogYyAqLworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtMRkVdID0KKyAgICAgICAgICBjaGFubmVsTWFwcGluZy5lbEluZm9bM10uQ2hhbm5lbEluZGV4WzBdOyAvKiBsZmUgKi8KKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID0KKyAgICAgICAgICBjaGFubmVsTWFwcGluZy5lbEluZm9bMl0uQ2hhbm5lbEluZGV4WzBdOyAvKiBscyAqLworICAgICAgZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPQorICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLmVsSW5mb1syXS5DaGFubmVsSW5kZXhbMV07IC8qIHJzICovCisgICAgICBkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPQorICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLmVsSW5mb1s0XS5DaGFubmVsSW5kZXhbMF07IC8qIGx2aDIgKi8KKyAgICAgIGRyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXSA9CisgICAgICAgICAgY2hhbm5lbE1hcHBpbmcuZWxJbmZvWzRdLkNoYW5uZWxJbmRleFsxXTsgLyogcnZoMiAqLworICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAoLTEpOworICB9CisKKyAgZHJjQ29tcC0+ZnVsbENoYW5uZWxzID0gY2hhbm5lbE1hcHBpbmcubkNoYW5uZWxzRWZmOworICBkcmNDb21wLT5jaGFubmVscyA9IGNoYW5uZWxNYXBwaW5nLm5DaGFubmVsczsKKworICAvKiBJbml0IHN0YXRlcy4gKi8KKyAgZHJjQ29tcC0+c21vb3RoTGV2ZWxbMF0gPSBkcmNDb21wLT5zbW9vdGhMZXZlbFsxXSA9CisgICAgICAoRklYUF9EQkwpKC0oMTM1IDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpKTsKKworICBGREttZW1jbGVhcihkcmNDb21wLT5zbW9vdGhHYWluLCBzaXplb2YoZHJjQ29tcC0+c21vb3RoR2FpbikpOworICBGREttZW1jbGVhcihkcmNDb21wLT5ob2xkQ250LCBzaXplb2YoZHJjQ29tcC0+aG9sZENudCkpOworICBGREttZW1jbGVhcihkcmNDb21wLT5saW1HYWluLCBzaXplb2YoZHJjQ29tcC0+bGltR2FpbikpOworICBGREttZW1jbGVhcihkcmNDb21wLT5wcmV2UGVhaywgc2l6ZW9mKGRyY0NvbXAtPnByZXZQZWFrKSk7CisgIEZES21lbWNsZWFyKGRyY0NvbXAtPmZpbHRlciwgc2l6ZW9mKGRyY0NvbXAtPmZpbHRlcikpOworCisgIHJldHVybiAoMCk7Cit9CisKK0lOVCBGREtfRFJDX0dlbmVyYXRvcl9zZXREcmNQcm9maWxlKEhEUkNfQ09NUCBkcmNDb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRFJDX1BST0ZJTEUgcHJvZmlsZUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEUkNfUFJPRklMRSBwcm9maWxlUkYpIHsKKyAgaW50IHByb2ZpbGVJZHgsIGk7CisKKyAgZHJjQ29tcC0+cHJvZmlsZVswXSA9IHByb2ZpbGVMaW5lOworICBkcmNDb21wLT5wcm9maWxlWzFdID0gcHJvZmlsZVJGOworCisgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAvKiBnZXQgcHJvZmlsZSBpbmRleCAqLworICAgIHN3aXRjaCAoZHJjQ29tcC0+cHJvZmlsZVtpXSkgeworICAgICAgY2FzZSBEUkNfTk9ORToKKyAgICAgIGNhc2UgRFJDX05PVF9QUkVTRU5UOgorICAgICAgY2FzZSBEUkNfRklMTVNUQU5EQVJEOgorICAgICAgICBwcm9maWxlSWR4ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERSQ19GSUxNTElHSFQ6CisgICAgICAgIHByb2ZpbGVJZHggPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRFJDX01VU0lDU1RBTkRBUkQ6CisgICAgICAgIHByb2ZpbGVJZHggPSAyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRFJDX01VU0lDTElHSFQ6CisgICAgICAgIHByb2ZpbGVJZHggPSAzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRFJDX1NQRUVDSDoKKyAgICAgICAgcHJvZmlsZUlkeCA9IDQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEUkNfREVMQVlfVEVTVDoKKyAgICAgICAgcHJvZmlsZUlkeCA9IDU7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuICgtMSk7CiAgICAgfQogCi0gICAgZHJjQ29tcC0+ZnVsbENoYW5uZWxzID0gY2hhbm5lbE1hcHBpbmcubkNoYW5uZWxzRWZmOwotICAgIGRyY0NvbXAtPmNoYW5uZWxzICAgICA9IGNoYW5uZWxNYXBwaW5nLm5DaGFubmVsczsKKyAgICAvKiBnZXQgcGFyYW1ldGVycyBmb3Igc2VsZWN0ZWQgcHJvZmlsZSAqLworICAgIGlmIChwcm9maWxlSWR4ID49IDApIHsKKyAgICAgIGRyY0NvbXAtPm1heEJvb3N0VGhyW2ldID0gdGFiTWF4Qm9vc3RUaHJbcHJvZmlsZUlkeF07CisgICAgICBkcmNDb21wLT5ib29zdFRocltpXSA9IHRhYkJvb3N0VGhyW3Byb2ZpbGVJZHhdOworICAgICAgZHJjQ29tcC0+ZWFybHlDdXRUaHJbaV0gPSB0YWJFYXJseUN1dFRocltwcm9maWxlSWR4XTsKKyAgICAgIGRyY0NvbXAtPmN1dFRocltpXSA9IHRhYkN1dFRocltwcm9maWxlSWR4XTsKKyAgICAgIGRyY0NvbXAtPm1heEN1dFRocltpXSA9IHRhYk1heEN1dFRocltwcm9maWxlSWR4XTsKIAotICAgIC8qIEluaXQgc3RhdGVzLiAqLwotICAgIGRyY0NvbXAtPnNtb290aExldmVsWzBdID0gZHJjQ29tcC0+c21vb3RoTGV2ZWxbMV0gPSAoRklYUF9EQkwpKGludCkoKHVuc2lnbmVkKS0xMzU8PE1FVEFEQVRBX0ZSQUNUX0JJVFMpOworICAgICAgZHJjQ29tcC0+Ym9vc3RGYWNbaV0gPSB0YWJCb29zdFJhdGlvW3Byb2ZpbGVJZHhdOworICAgICAgZHJjQ29tcC0+ZWFybHlDdXRGYWNbaV0gPSB0YWJFYXJseUN1dFJhdGlvW3Byb2ZpbGVJZHhdOworICAgICAgZHJjQ29tcC0+Y3V0RmFjW2ldID0gdGFiQ3V0UmF0aW9bcHJvZmlsZUlkeF07CiAKLSAgICBGREttZW1jbGVhcihkcmNDb21wLT5zbW9vdGhHYWluLCBzaXplb2YoZHJjQ29tcC0+c21vb3RoR2FpbikpOwotICAgIEZES21lbWNsZWFyKGRyY0NvbXAtPmhvbGRDbnQsIHNpemVvZihkcmNDb21wLT5ob2xkQ250KSk7Ci0gICAgRkRLbWVtY2xlYXIoZHJjQ29tcC0+bGltR2Fpbiwgc2l6ZW9mKGRyY0NvbXAtPmxpbUdhaW4pKTsKLSAgICBGREttZW1jbGVhcihkcmNDb21wLT5wcmV2UGVhaywgc2l6ZW9mKGRyY0NvbXAtPnByZXZQZWFrKSk7Ci0gICAgRkRLbWVtY2xlYXIoZHJjQ29tcC0+ZmlsdGVyLCBzaXplb2YoZHJjQ29tcC0+ZmlsdGVyKSk7CisgICAgICBkcmNDb21wLT5tYXhCb29zdFtpXSA9IHRhYk1heEJvb3N0W3Byb2ZpbGVJZHhdOworICAgICAgZHJjQ29tcC0+bWF4Q3V0W2ldID0gdGFiTWF4Q3V0W3Byb2ZpbGVJZHhdOworICAgICAgZHJjQ29tcC0+bWF4RWFybHlDdXRbaV0gPQorICAgICAgICAgIC1mTXVsdCgoZHJjQ29tcC0+Y3V0VGhyW2ldIC0gZHJjQ29tcC0+ZWFybHlDdXRUaHJbaV0pLAorICAgICAgICAgICAgICAgICBkcmNDb21wLT5lYXJseUN1dEZhY1tpXSk7IC8qIG5vIHNjYWxpbmcgYWZ0ZXIgbXVsdCBuZWVkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFybHlDdXRGYWMgaXMgaW4gRklYUF9EQkwgKi8KIAotICAgIHJldHVybiAoMCk7CisgICAgICBkcmNDb21wLT5mYXN0QXR0YWNrW2ldID0gdGMyQ29lZmYoCisgICAgICAgICAgdGFiRmFzdEF0dGFja1twcm9maWxlSWR4XSwgZHJjQ29tcC0+c2FtcGxlUmF0ZSwgZHJjQ29tcC0+YmxvY2tMZW5ndGgpOworICAgICAgZHJjQ29tcC0+ZmFzdERlY2F5W2ldID0gdGMyQ29lZmYoCisgICAgICAgICAgdGFiRmFzdERlY2F5W3Byb2ZpbGVJZHhdLCBkcmNDb21wLT5zYW1wbGVSYXRlLCBkcmNDb21wLT5ibG9ja0xlbmd0aCk7CisgICAgICBkcmNDb21wLT5zbG93QXR0YWNrW2ldID0gdGMyQ29lZmYoCisgICAgICAgICAgdGFiU2xvd0F0dGFja1twcm9maWxlSWR4XSwgZHJjQ29tcC0+c2FtcGxlUmF0ZSwgZHJjQ29tcC0+YmxvY2tMZW5ndGgpOworICAgICAgZHJjQ29tcC0+c2xvd0RlY2F5W2ldID0gdGMyQ29lZmYoCisgICAgICAgICAgdGFiU2xvd0RlY2F5W3Byb2ZpbGVJZHhdLCBkcmNDb21wLT5zYW1wbGVSYXRlLCBkcmNDb21wLT5ibG9ja0xlbmd0aCk7CisgICAgICBkcmNDb21wLT5ob2xkT2ZmW2ldID0gdGFiSG9sZE9mZltwcm9maWxlSWR4XSAqIDI1NiAvIGRyY0NvbXAtPmJsb2NrTGVuZ3RoOworCisgICAgICBkcmNDb21wLT5hdHRhY2tUaHJbaV0gPSB0YWJBdHRhY2tUaHJbcHJvZmlsZUlkeF07CisgICAgICBkcmNDb21wLT5kZWNheVRocltpXSA9IHRhYkRlY2F5VGhyW3Byb2ZpbGVJZHhdOworICAgIH0KKworICAgIGRyY0NvbXAtPnNtb290aEdhaW5baV0gPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICB9CisgIHJldHVybiAoMCk7CiB9CiAKK0lOVCBGREtfRFJDX0dlbmVyYXRvcl9DYWxjKEhEUkNfQ09NUCBkcmNDb21wLCBjb25zdCBJTlRfUENNKiBjb25zdCBpblNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGluU2FtcGxlc0J1ZlNpemUsIGNvbnN0IElOVCBkaWFsbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBkcmNfVGFyZ2V0UmVmTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgY29tcF9UYXJnZXRSZWZMZXZlbCwgY29uc3QgRklYUF9EQkwgY2xldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIHNsZXYsIGNvbnN0IEZJWFBfREJMIGV4dF9sZXZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgZXh0X2xldmIsIGNvbnN0IEZJWFBfREJMIGxmZV9sZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZG14R2FpbjUsIGNvbnN0IElOVCBkbXhHYWluMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogY29uc3QgcER5bnJuZywgSU5UKiBjb25zdCBwQ29tcHIpIHsKKyAgaW50IGksIGM7CisgIEZJWFBfREJMIHBlYWtbMl07CiAKLUlOVCBGREtfRFJDX0dlbmVyYXRvcl9zZXREcmNQcm9maWxlKAotICAgICAgICBIRFJDX0NPTVAgICAgICAgICAgICAgICAgICAgICAgIGRyY0NvbXAsCi0gICAgICAgIGNvbnN0IERSQ19QUk9GSUxFICAgICAgICAgICAgICAgcHJvZmlsZUxpbmUsCi0gICAgICAgIGNvbnN0IERSQ19QUk9GSUxFICAgICAgICAgICAgICAgcHJvZmlsZVJGCi0gICAgICAgICkKLXsKLSAgICBpbnQgcHJvZmlsZUlkeCwgaTsKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqIGNvbXByZXNzb3IKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBpZiAoKGRyY0NvbXAtPnByb2ZpbGVbMF0gIT0gRFJDX05PTkUpIHx8IChkcmNDb21wLT5wcm9maWxlWzFdICE9IERSQ19OT05FKSkgeworICAgIC8qIENhbGMgbG91ZG5lc3MgbGV2ZWwgKi8KKyAgICBGSVhQX0RCTCBsZXZlbF9iID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgICBpbnQgbGV2ZWxfZSA9IERGUkFDVF9CSVRTIC0gMTsKIAotICAgIGRyY0NvbXAtPnByb2ZpbGVbMF0gPSBwcm9maWxlTGluZTsKLSAgICBkcmNDb21wLT5wcm9maWxlWzFdID0gcHJvZmlsZVJGOworICAgIC8qIEluY3JlYXNlIGVuZXJneSB0aW1lIHJlc29sdXRpb24gd2l0aCBzaG9ydGVyIHByb2Nlc3NpbmcgYmxvY2tzLiAxNiBpcyBhbgorICAgICAqIGVtcGlyaWMgdmFsdWUuICovCisgICAgY29uc3QgaW50IGdyYW51bGVMZW5ndGggPSBmaXhNaW4oMTYsIGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsKKworICAgIGlmIChkcmNDb21wLT51c2VXZWlnaHRpbmcpIHsKKyAgICAgIEZJWFBfREJMIHgxLCB4MiwgeSwgeTEsIHkyOworICAgICAgLyogc3VtIG9mIGZpbHRlciBjb2VmZmljaWVudHMgYWJvdXQgMi41IC0+IHNxdWFyZWQgdmFsdWUgaXMgNi4yNQorICAgICAgICAgV0VJR0hUSU5HX0ZJTFRFUl9TSElGVCBpcyAyIC0+IHNjYWxpbmcgYWJvdXQgMTYsIHRoZXJlZm9yZSByZWR1Y2UKKyAgICAgICAgIGdyYW51bGVTaGlmdCBieSAxLgorICAgICAgICovCisgICAgICBjb25zdCBpbnQgZ3JhbnVsZVNoaWZ0ID0gZ2V0U2hpZnRGYWN0b3IoZ3JhbnVsZUxlbmd0aCkgLSAxOworCisgICAgICBmb3IgKGMgPSAwOyBjIDwgKGludClkcmNDb21wLT5jaGFubmVsczsgYysrKSB7CisgICAgICAgIGNvbnN0IElOVF9QQ00qIHBTYW1wbGVzID0gaW5TYW1wbGVzICsgYyAqIGluU2FtcGxlc0J1ZlNpemU7CisKKyAgICAgICAgaWYgKGMgPT0gZHJjQ29tcC0+Y2hhbm5lbElkeFtMRkVdKSB7CisgICAgICAgICAgY29udGludWU7IC8qIHNraXAgTEZFICovCisgICAgICAgIH0KKworICAgICAgICAvKiBnZXQgZmlsdGVyIHN0YXRlcyAqLworICAgICAgICB4MSA9IGRyY0NvbXAtPmZpbHRlcltjXS54MTsKKyAgICAgICAgeDIgPSBkcmNDb21wLT5maWx0ZXJbY10ueDI7CisgICAgICAgIHkxID0gZHJjQ29tcC0+ZmlsdGVyW2NdLnkxOworICAgICAgICB5MiA9IGRyY0NvbXAtPmZpbHRlcltjXS55MjsKKworICAgICAgICBpID0gMDsKKworICAgICAgICBkbyB7CisgICAgICAgICAgaW50IG9mZnNldCA9IGk7CisgICAgICAgICAgRklYUF9EQkwgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisKKyAgICAgICAgICBmb3IgKGkgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICBpIDwgZml4TWluKG9mZnNldCArIGdyYW51bGVMZW5ndGgsIGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsgaSsrKSB7CisgICAgICAgICAgICAvKiBhcHBseSB3ZWlnaHRpbmcgZmlsdGVyICovCisgICAgICAgICAgICBGSVhQX0RCTCB4ID0KKyAgICAgICAgICAgICAgICBGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tpXSkgPj4gV0VJR0hUSU5HX0ZJTFRFUl9TSElGVDsKKworICAgICAgICAgICAgLyogeSA9IGIwICogKHggLSB4MikgLSBhMSAqIHkxIC0gYTIgKiB5MjsgKi8KKyAgICAgICAgICAgIHkgPSBmTXVsdChiMCwgeCAtIHgyKSAtIGZNdWx0KGExLCB5MSkgLSBmTXVsdChhMiwgeTIpOworCisgICAgICAgICAgICB4MiA9IHgxOworICAgICAgICAgICAgeDEgPSB4OworICAgICAgICAgICAgeTIgPSB5MTsKKyAgICAgICAgICAgIHkxID0geTsKKworICAgICAgICAgICAgYWNjdSArPSBmUG93MkRpdjIoeSkgPj4gKGdyYW51bGVTaGlmdCAtIDEpOyAvKiBwYXJ0aWFsIGVuZXJneSAqLworICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpICovCisKKyAgICAgICAgICBmaXhwQWRkKGFjY3UsIGdyYW51bGVTaGlmdCArIDIgKiBXRUlHSFRJTkdfRklMVEVSX1NISUZULCAmbGV2ZWxfYiwKKyAgICAgICAgICAgICAgICAgICZsZXZlbF9lKTsgLyogc3VwIHVwIHBhcnRpYWwgZW5lcmdpZXMgKi8KKworICAgICAgICB9IHdoaWxlIChpIDwgZHJjQ29tcC0+YmxvY2tMZW5ndGgpOworCisgICAgICAgIC8qIHNhdmUgZmlsdGVyIHN0YXRlcyAqLworICAgICAgICBkcmNDb21wLT5maWx0ZXJbY10ueDEgPSB4MTsKKyAgICAgICAgZHJjQ29tcC0+ZmlsdGVyW2NdLngyID0geDI7CisgICAgICAgIGRyY0NvbXAtPmZpbHRlcltjXS55MSA9IHkxOworICAgICAgICBkcmNDb21wLT5maWx0ZXJbY10ueTIgPSB5MjsKKyAgICAgIH0gLyogYyAqLworICAgIH0gICAvKiB3ZWlnaHRpbmcgKi8KKyAgICBlbHNlIHsKKyAgICAgIGNvbnN0IGludCBncmFudWxlU2hpZnQgPSBnZXRTaGlmdEZhY3RvcihncmFudWxlTGVuZ3RoKTsKKworICAgICAgZm9yIChjID0gMDsgYyA8IChpbnQpZHJjQ29tcC0+Y2hhbm5lbHM7IGMrKykgeworICAgICAgICBjb25zdCBJTlRfUENNKiBwU2FtcGxlcyA9IGluU2FtcGxlcyArIGMgKiBpblNhbXBsZXNCdWZTaXplOworCisgICAgICAgIGlmICgoaW50KWMgPT0gZHJjQ29tcC0+Y2hhbm5lbElkeFtMRkVdKSB7CisgICAgICAgICAgY29udGludWU7IC8qIHNraXAgTEZFICovCisgICAgICAgIH0KKworICAgICAgICBpID0gMDsKKworICAgICAgICBkbyB7CisgICAgICAgICAgaW50IG9mZnNldCA9IGk7CisgICAgICAgICAgRklYUF9EQkwgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisKKyAgICAgICAgICBmb3IgKGkgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICBpIDwgZml4TWluKG9mZnNldCArIGdyYW51bGVMZW5ndGgsIGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsgaSsrKSB7CisgICAgICAgICAgICAvKiBwYXJ0aWFsIGVuZXJneSAqLworICAgICAgICAgICAgYWNjdSArPSBmUG93MkRpdjIoKEZJWFBfUENNKXBTYW1wbGVzW2ldKSA+PiAoZ3JhbnVsZVNoaWZ0IC0gMSk7CisgICAgICAgICAgfSAvKiBpICovCisKKyAgICAgICAgICBmaXhwQWRkKGFjY3UsIGdyYW51bGVTaGlmdCwgJmxldmVsX2IsCisgICAgICAgICAgICAgICAgICAmbGV2ZWxfZSk7IC8qIHN1cCB1cCBwYXJ0aWFsIGVuZXJnaWVzICovCisKKyAgICAgICAgfSB3aGlsZSAoaSA8IGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsKKyAgICAgIH0KKyAgICB9IC8qIHdlaWdodGluZyAqLworCisgICAgLyoKKyAgICAgKiBDb252ZXJ0IHRvIGRCRlMsIGFwcGx5IGRpYWxub3JtCisgICAgICovCisgICAgLyogbGV2ZWwgc2NhbGluZyAqLworCisgICAgLyogZGVzY2FsZWQgbGV2ZWwgaW4gbGQ2NCByZXByZXNlbnRhdGlvbiAqLworICAgIEZJWFBfREJMIGxkTGV2ZWwgPQorICAgICAgICBDYWxjTGREYXRhKGxldmVsX2IpICsKKyAgICAgICAgKEZJWFBfREJMKSgobGV2ZWxfZSAtIDEyKSA8PCAoREZSQUNUX0JJVFMgLSAxIC0gTERfREFUQV9TSElGVCkpIC0KKyAgICAgICAgQ2FsY0xkRGF0YSgoRklYUF9EQkwpKGRyY0NvbXAtPmJsb2NrTGVuZ3RoIDw8IChERlJBQ1RfQklUUyAtIDEgLSAxMikpKTsKKworICAgIC8qIGlmIChsZXZlbCA8IDFlLTEwKSBsZXZlbCA9IDFlLTEwZjsgKi8KKyAgICBsZExldmVsID0KKyAgICAgICAgZk1heChsZExldmVsLCBGTDJGWENPTlNUX0RCTCgtMC41MTkwNTEyNjQ4MjYxNTAzNjY4NTQ3Mzc0MTA4NTc3MmYpKTsKKworICAgIC8qIGxldmVsID0gMTAgKiBsb2cobGV2ZWwpL2xvZygxMCkgKyAzOworICAgICAqICAgICAgID0gMTAqbG9nKDIpL2xvZygxMCkgKiBsZChsZXZlbCkgKyAzOworICAgICAqICAgICAgID0gMTAgKiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQobGV2ZWwpICsgMworICAgICAqICAgICAgID0gMTAgKiAoMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkKGxldmVsKSArIDAuMykKKyAgICAgKiAgICAgICA9IDEwICogKDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkgKiBsZDY0KGxldmVsKSArIDAuMy82NCkKKyAgICAgKiAqIDY0CisgICAgICoKKyAgICAgKiAgICBhZGRpdGlvbmFsIHNjYWxpbmcgd2l0aCBNRVRBREFUQV9GUkFDVF9CSVRTOgorICAgICAqICAgICAgID0gMTAgKiAoMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkNjQobGV2ZWwpICsgMC4zLzY0KQorICAgICAqICogNjQgKiAyXihNRVRBREFUQV9GUkFDVF9CSVRTKSA9IDEwICogKDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkKKyAgICAgKiAqIGxkNjQobGV2ZWwpICsgMC4zLzY0KSAqIDJeKE1FVEFEQVRBX0ZSQUNUX0JJVFMrTERfREFUQV9TSElGVCkgPQorICAgICAqIDEwKjJeKE1FVEFEQVRBX0ZSQUNUX0JJVFMrTERfREFUQV9TSElGVCkgKiAoCisgICAgICogMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkNjQobGV2ZWwpICsgMC4zLzY0ICkKKyAgICAgKiAqLworICAgIEZJWFBfREJMIGxldmVsID0gZk11bHQoCisgICAgICAgIChGSVhQX0RCTCkoMTAgPDwgKE1FVEFEQVRBX0ZSQUNUX0JJVFMgKyBMRF9EQVRBX1NISUZUKSksCisgICAgICAgIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDlmKSwgbGRMZXZlbCkgKworICAgICAgICAgICAgKEZJWFBfREJMKShGTDJGWENPTlNUX0RCTCgwLjNmKSA+PiBMRF9EQVRBX1NISUZUKSk7CisKKyAgICAvKiBsZXZlbCAtPSBkaWFsbm9ybSArIDMxICovIC8qIHRoaXMgaXMgZml4ZWQgdG8gRG9sYnktUmVmZXJlbmNlTGV2ZWwgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzb3IgcHJvZmlsZXMgYXJlIGRlZmluZWQgcmVsYXRpdmUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgKi8KKyAgICBsZXZlbCAtPSAoKEZJWFBfREJMKShkaWFsbm9ybSA8PCAoTUVUQURBVEFfRlJBQ1RfQklUUyAtIDE2KSkgKworICAgICAgICAgICAgICAoRklYUF9EQkwpKDMxIDw8IE1FVEFEQVRBX0ZSQUNUX0JJVFMpKTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgLyogZ2V0IHByb2ZpbGUgaW5kZXggKi8KLSAgICAgICAgc3dpdGNoIChkcmNDb21wLT5wcm9maWxlW2ldKSB7Ci0gICAgICAgICAgICBjYXNlIERSQ19OT05FOgotICAgICAgICAgICAgY2FzZSBEUkNfRklMTVNUQU5EQVJEOiAgcHJvZmlsZUlkeCA9IDA7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBEUkNfRklMTUxJR0hUOiAgICAgcHJvZmlsZUlkeCA9IDE7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBEUkNfTVVTSUNTVEFOREFSRDogcHJvZmlsZUlkeCA9IDI7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBEUkNfTVVTSUNMSUdIVDogICAgcHJvZmlsZUlkeCA9IDM7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBEUkNfU1BFRUNIOiAgICAgICAgcHJvZmlsZUlkeCA9IDQ7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBEUkNfREVMQVlfVEVTVDogICAgcHJvZmlsZUlkeCA9IDU7IGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuICgtMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBnZXQgcGFyYW1ldGVycyBmb3Igc2VsZWN0ZWQgcHJvZmlsZSAqLwotICAgICAgICBpZiAocHJvZmlsZUlkeCA+PSAwKSB7Ci0gICAgICAgICAgICBkcmNDb21wLT5tYXhCb29zdFRocltpXSA9IHRhYk1heEJvb3N0VGhyW3Byb2ZpbGVJZHhdOwotICAgICAgICAgICAgZHJjQ29tcC0+Ym9vc3RUaHJbaV0gICAgPSB0YWJCb29zdFRocltwcm9maWxlSWR4XTsKLSAgICAgICAgICAgIGRyY0NvbXAtPmVhcmx5Q3V0VGhyW2ldID0gdGFiRWFybHlDdXRUaHJbcHJvZmlsZUlkeF07Ci0gICAgICAgICAgICBkcmNDb21wLT5jdXRUaHJbaV0gICAgICA9IHRhYkN1dFRocltwcm9maWxlSWR4XTsKLSAgICAgICAgICAgIGRyY0NvbXAtPm1heEN1dFRocltpXSAgID0gdGFiTWF4Q3V0VGhyW3Byb2ZpbGVJZHhdOwotCi0gICAgICAgICAgICBkcmNDb21wLT5ib29zdEZhY1tpXSAgICA9IHRhYkJvb3N0UmF0aW9bcHJvZmlsZUlkeF07Ci0gICAgICAgICAgICBkcmNDb21wLT5lYXJseUN1dEZhY1tpXSA9IHRhYkVhcmx5Q3V0UmF0aW9bcHJvZmlsZUlkeF07Ci0gICAgICAgICAgICBkcmNDb21wLT5jdXRGYWNbaV0gICAgICA9IHRhYkN1dFJhdGlvW3Byb2ZpbGVJZHhdOwotCi0gICAgICAgICAgICBkcmNDb21wLT5tYXhCb29zdFtpXSAgICA9IHRhYk1heEJvb3N0W3Byb2ZpbGVJZHhdOwotICAgICAgICAgICAgZHJjQ29tcC0+bWF4Q3V0W2ldICAgICAgPSB0YWJNYXhDdXRbcHJvZmlsZUlkeF07Ci0gICAgICAgICAgICBkcmNDb21wLT5tYXhFYXJseUN1dFtpXSA9IC0gZk11bHQoKGRyY0NvbXAtPmN1dFRocltpXSAtIGRyY0NvbXAtPmVhcmx5Q3V0VGhyW2ldKSwgZHJjQ29tcC0+ZWFybHlDdXRGYWNbaV0pOyAvKiBubyBzY2FsaW5nIGFmdGVyIG11bHQgbmVlZGVkLCBlYXJseUN1dEZhYyBpcyBpbiBGSVhQX0RCTCAqLwotCi0gICAgICAgICAgICBkcmNDb21wLT5mYXN0QXR0YWNrW2ldICA9IHRjMkNvZWZmKHRhYkZhc3RBdHRhY2tbcHJvZmlsZUlkeF0sIGRyY0NvbXAtPnNhbXBsZVJhdGUsIGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsKLSAgICAgICAgICAgIGRyY0NvbXAtPmZhc3REZWNheVtpXSAgID0gdGMyQ29lZmYodGFiRmFzdERlY2F5W3Byb2ZpbGVJZHhdLCBkcmNDb21wLT5zYW1wbGVSYXRlLCBkcmNDb21wLT5ibG9ja0xlbmd0aCk7Ci0gICAgICAgICAgICBkcmNDb21wLT5zbG93QXR0YWNrW2ldICA9IHRjMkNvZWZmKHRhYlNsb3dBdHRhY2tbcHJvZmlsZUlkeF0sIGRyY0NvbXAtPnNhbXBsZVJhdGUsIGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsKLSAgICAgICAgICAgIGRyY0NvbXAtPnNsb3dEZWNheVtpXSAgID0gdGMyQ29lZmYodGFiU2xvd0RlY2F5W3Byb2ZpbGVJZHhdLCBkcmNDb21wLT5zYW1wbGVSYXRlLCBkcmNDb21wLT5ibG9ja0xlbmd0aCk7Ci0gICAgICAgICAgICBkcmNDb21wLT5ob2xkT2ZmW2ldICAgICA9IHRhYkhvbGRPZmZbcHJvZmlsZUlkeF0gKiAyNTYgLyBkcmNDb21wLT5ibG9ja0xlbmd0aDsKLQotICAgICAgICAgICAgZHJjQ29tcC0+YXR0YWNrVGhyW2ldICAgPSB0YWJBdHRhY2tUaHJbcHJvZmlsZUlkeF07Ci0gICAgICAgICAgICBkcmNDb21wLT5kZWNheVRocltpXSAgICA9IHRhYkRlY2F5VGhyW3Byb2ZpbGVJZHhdOwotICAgICAgICB9Ci0KLSAgICAgICAgZHJjQ29tcC0+c21vb3RoR2FpbltpXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0gICAgfQotICAgIHJldHVybiAoMCk7Ci19Ci0KLQotSU5UIEZES19EUkNfR2VuZXJhdG9yX0NhbGMoCi0gICAgICAgIEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAgZHJjQ29tcCwKLSAgICAgICAgY29uc3QgSU5UX1BDTSAqIGNvbnN0ICAgICAgICAgICBpblNhbXBsZXMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgZGlhbG5vcm0sCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgZHJjX1RhcmdldFJlZkxldmVsLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIGNvbXBfVGFyZ2V0UmVmTGV2ZWwsCi0gICAgICAgIEZJWFBfREJMICAgICAgICAgICAgICAgICAgICAgICAgY2xldiwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAgICAgICBzbGV2LAotICAgICAgICBJTlQgKiBjb25zdCAgICAgICAgICAgICAgICAgICAgIHBEeW5ybmcsCi0gICAgICAgIElOVCAqIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgcENvbXByCi0gICAgICAgICkKLXsKLSAgICBpbnQgaSwgYzsKLSAgICBGSVhQX0RCTCBwZWFrWzJdOwotCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAqIGNvbXByZXNzb3IKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIGlmICgoZHJjQ29tcC0+cHJvZmlsZVswXSAhPSBEUkNfTk9ORSkgfHwgKGRyY0NvbXAtPnByb2ZpbGVbMV0gIT0gRFJDX05PTkUpKSB7Ci0gICAgICAgIC8qIENhbGMgbG91ZG5lc3MgbGV2ZWwgKi8KLSAgICAgICAgRklYUF9EQkwgbGV2ZWxfYiA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0gICAgICAgIGludCAgICAgIGxldmVsX2UgPSBERlJBQ1RfQklUUy0xOwotCi0gICAgICAgIC8qIEluY3JlYXNlIGVuZXJneSB0aW1lIHJlc29sdXRpb24gd2l0aCBzaG9ydGVyIHByb2Nlc3NpbmcgYmxvY2tzLiAzMiBpcyBhbiBlbXBpcmljIHZhbHVlLiAqLwotICAgICAgICBjb25zdCBpbnQgZ3JhbnVsZUxlbmd0aCA9IGZpeE1pbigzMiwgZHJjQ29tcC0+YmxvY2tMZW5ndGgpOwotCi0gICAgICAgIGlmIChkcmNDb21wLT51c2VXZWlnaHRpbmcpIHsKLSAgICAgICAgICAgIEZJWFBfREJMIHgxLCB4MiwgeSwgeTEsIHkyOwotICAgICAgICAgICAgLyogc3VtIG9mIGZpbHRlciBjb2VmZmljaWVudHMgYWJvdXQgMi41IC0+IHNxdWFyZWQgdmFsdWUgaXMgNi4yNQotICAgICAgICAgICAgICAgV0VJR0hUSU5HX0ZJTFRFUl9TSElGVCBpcyAyIC0+IHNjYWxpbmcgYWJvdXQgMTYsIHRoZXJlZm9yZSByZWR1Y2UgZ3JhbnVsZVNoaWZ0IGJ5IDEuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGNvbnN0IGludCBncmFudWxlU2hpZnQgPSBnZXRTaGlmdEZhY3RvcihncmFudWxlTGVuZ3RoKS0xOwotCi0gICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgKGludClkcmNDb21wLT5jaGFubmVsczsgYysrKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgSU5UX1BDTSogcFNhbXBsZXMgPSAmaW5TYW1wbGVzW2NdOwotCi0gICAgICAgICAgICAgICAgaWYgKGMgPT0gZHJjQ29tcC0+Y2hhbm5lbElkeFtMRkVdKSB7Ci0gICAgICAgICAgICAgICAgICBjb250aW51ZTsgIC8qIHNraXAgTEZFICovCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogZ2V0IGZpbHRlciBzdGF0ZXMgKi8KLSAgICAgICAgICAgICAgICB4MSA9IGRyY0NvbXAtPmZpbHRlcltjXS54MTsKLSAgICAgICAgICAgICAgICB4MiA9IGRyY0NvbXAtPmZpbHRlcltjXS54MjsKLSAgICAgICAgICAgICAgICB5MSA9IGRyY0NvbXAtPmZpbHRlcltjXS55MTsKLSAgICAgICAgICAgICAgICB5MiA9IGRyY0NvbXAtPmZpbHRlcltjXS55MjsKLQotICAgICAgICAgICAgICAgIGkgPSAwOwotCi0gICAgICAgICAgICAgICAgZG8gewotCi0gICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gaTsKLSAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwotCi0gICAgICAgICAgICAgICAgICBmb3IgKGk9b2Zmc2V0OyBpIDwgZml4TWluKG9mZnNldCtncmFudWxlTGVuZ3RoLGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGFwcGx5IHdlaWdodGluZyBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgeCA9IEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2kqZHJjQ29tcC0+Y2hhbm5lbHNdKSA+PiBXRUlHSFRJTkdfRklMVEVSX1NISUZUOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIHkgPSBiMCAqICh4IC0geDIpIC0gYTEgKiB5MSAtIGEyICogeTI7ICovCi0gICAgICAgICAgICAgICAgICAgIHkgPSBmTXVsdChiMCx4LXgyKSAtIGZNdWx0KGExLHkxKSAtIGZNdWx0KGEyLHkyKTsKLQotICAgICAgICAgICAgICAgICAgICB4MiA9IHgxOwotICAgICAgICAgICAgICAgICAgICB4MSA9IHg7Ci0gICAgICAgICAgICAgICAgICAgIHkyID0geTE7Ci0gICAgICAgICAgICAgICAgICAgIHkxID0geTsKLQotICAgICAgICAgICAgICAgICAgICBhY2N1ICs9IGZQb3cyRGl2Mih5KT4+KGdyYW51bGVTaGlmdC0xKTsgICAgIC8qIHBhcnRpYWwgZW5lcmd5ICovCi0gICAgICAgICAgICAgICAgICB9IC8qIGkgKi8KLQotICAgICAgICAgICAgICAgICAgZml4cEFkZChhY2N1LCBncmFudWxlU2hpZnQrMipXRUlHSFRJTkdfRklMVEVSX1NISUZULCAmbGV2ZWxfYiwgJmxldmVsX2UpOyAvKiBzdXAgdXAgcGFydGlhbCBlbmVyZ2llcyAqLwotCi0gICAgICAgICAgICAgICAgfSB3aGlsZSAoIGkgPCBkcmNDb21wLT5ibG9ja0xlbmd0aCApOwotCi0KLSAgICAgICAgICAgICAgICAvKiBzYXZlIGZpbHRlciBzdGF0ZXMgKi8KLSAgICAgICAgICAgICAgICBkcmNDb21wLT5maWx0ZXJbY10ueDEgPSB4MTsKLSAgICAgICAgICAgICAgICBkcmNDb21wLT5maWx0ZXJbY10ueDIgPSB4MjsKLSAgICAgICAgICAgICAgICBkcmNDb21wLT5maWx0ZXJbY10ueTEgPSB5MTsKLSAgICAgICAgICAgICAgICBkcmNDb21wLT5maWx0ZXJbY10ueTIgPSB5MjsKLSAgICAgICAgICAgIH0gLyogYyAqLwotICAgICAgICB9IC8qIHdlaWdodGluZyAqLwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBncmFudWxlU2hpZnQgPSBnZXRTaGlmdEZhY3RvcihncmFudWxlTGVuZ3RoKTsKLQotICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IChpbnQpZHJjQ29tcC0+Y2hhbm5lbHM7IGMrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IElOVF9QQ00qIHBTYW1wbGVzID0gJmluU2FtcGxlc1tjXTsKLQotICAgICAgICAgICAgICAgIGlmICgoaW50KWMgPT0gZHJjQ29tcC0+Y2hhbm5lbElkeFtMRkVdKSB7Ci0gICAgICAgICAgICAgICAgICBjb250aW51ZTsgIC8qIHNraXAgTEZFICovCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaSA9IDA7Ci0KLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gaTsKLSAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwotCi0gICAgICAgICAgICAgICAgICBmb3IgKGk9b2Zmc2V0OyBpIDwgZml4TWluKG9mZnNldCtncmFudWxlTGVuZ3RoLGRyY0NvbXAtPmJsb2NrTGVuZ3RoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWwgZW5lcmd5ICovCi0gICAgICAgICAgICAgICAgICAgIGFjY3UgKz0gZlBvdzJEaXYyKChGSVhQX1BDTSlwU2FtcGxlc1tpKmRyY0NvbXAtPmNoYW5uZWxzXSk+PihncmFudWxlU2hpZnQtMSk7Ci0gICAgICAgICAgICAgICAgICB9IC8qIGkgKi8KLQotICAgICAgICAgICAgICAgICAgZml4cEFkZChhY2N1LCBncmFudWxlU2hpZnQsICZsZXZlbF9iLCAmbGV2ZWxfZSk7IC8qIHN1cCB1cCBwYXJ0aWFsIGVuZXJnaWVzICovCi0KLSAgICAgICAgICAgICAgICB9IHdoaWxlICggaSA8IGRyY0NvbXAtPmJsb2NrTGVuZ3RoICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gLyogd2VpZ2h0aW5nICovCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ29udmVydCB0byBkQkZTLCBhcHBseSBkaWFsbm9ybQotICAgICAgICAgKi8KLSAgICAgICAgLyogbGV2ZWwgc2NhbGluZyAqLwotCi0gICAgICAgIC8qIGRlc2NhbGVkIGxldmVsIGluIGxkNjQgcmVwcmVzZW50YXRpb24gKi8KLSAgICAgICAgRklYUF9EQkwgbGRMZXZlbCA9IENhbGNMZERhdGEobGV2ZWxfYikgKyAoRklYUF9EQkwpKChsZXZlbF9lLTEyKTw8KERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCkpIC0gQ2FsY0xkRGF0YSgoRklYUF9EQkwpKGRyY0NvbXAtPmJsb2NrTGVuZ3RoPDwoREZSQUNUX0JJVFMtMS0xMikpKTsKLQotICAgICAgICAvKiBpZiAobGV2ZWwgPCAxZS0xMCkgbGV2ZWwgPSAxZS0xMGY7ICovCi0gICAgICAgIGxkTGV2ZWwgPSBGREttYXgobGRMZXZlbCwgRkwyRlhDT05TVF9EQkwoLTAuNTE5MDUxMjY0ODI2MTUwMzY2ODU0NzM3NDEwODU3NzJmKSk7Ci0KLSAgICAgICAgLyogbGV2ZWwgPSAxMCAqIGxvZyhsZXZlbCkvbG9nKDEwKSArIDM7Ci0gICAgICAgICAqICAgICAgID0gMTAqbG9nKDIpL2xvZygxMCkgKiBsZChsZXZlbCkgKyAzOwotICAgICAgICAgKiAgICAgICA9IDEwICogMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkKGxldmVsKSArIDMKLSAgICAgICAgICogICAgICAgPSAxMCAqICgwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQobGV2ZWwpICsgMC4zKQotICAgICAgICAgKiAgICAgICA9IDEwICogKDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkgKiBsZDY0KGxldmVsKSArIDAuMy82NCkgKiA2NAotICAgICAgICAgKgotICAgICAgICAgKiAgICBhZGRpdGlvbmFsIHNjYWxpbmcgd2l0aCBNRVRBREFUQV9GUkFDVF9CSVRTOgotICAgICAgICAgKiAgICAgICA9IDEwICogKDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkgKiBsZDY0KGxldmVsKSArIDAuMy82NCkgKiA2NCAqIDJeKE1FVEFEQVRBX0ZSQUNUX0JJVFMpCi0gICAgICAgICAqICAgICAgID0gMTAgKiAoMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkNjQobGV2ZWwpICsgMC4zLzY0KSAqIDJeKE1FVEFEQVRBX0ZSQUNUX0JJVFMrTERfREFUQV9TSElGVCkKLSAgICAgICAgICogICAgICAgPSAxMCoyXihNRVRBREFUQV9GUkFDVF9CSVRTK0xEX0RBVEFfU0hJRlQpICogKCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQ2NChsZXZlbCkgKyAwLjMvNjQgKQotICAgICAgICAgKiAqLwotICAgICAgICBGSVhQX0RCTCBsZXZlbCA9IGZNdWx0KChGSVhQX0RCTCkoMTA8PChNRVRBREFUQV9GUkFDVF9CSVRTK0xEX0RBVEFfU0hJRlQpKSwgZk11bHQoIEZMMkZYQ09OU1RfREJMKDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDlmKSwgbGRMZXZlbCkgKyAoRklYUF9EQkwpKEZMMkZYQ09OU1RfREJMKDAuM2YpPj5MRF9EQVRBX1NISUZUKSApOwotCi0gICAgICAgIC8qIGxldmVsIC09IGRpYWxub3JtICsgMzEgKi8gICAvKiB0aGlzIGlzIGZpeGVkIHRvIERvbGJ5LVJlZmVyZW5jZUxldmVsIGFzIGNvbXByZXNzb3IgcHJvZmlsZXMgYXJlIGRlZmluZWQgcmVsYXRpdmUgdG8gdGhpcyAqLwotICAgICAgICBsZXZlbCAtPSAoKEZJWFBfREJMKShkaWFsbm9ybTw8KE1FVEFEQVRBX0ZSQUNUX0JJVFMtMTYpKSAgKyAoRklYUF9EQkwpKDMxPDxNRVRBREFUQV9GUkFDVF9CSVRTKSk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgICAgaWYgKGRyY0NvbXAtPnByb2ZpbGVbaV0gPT0gRFJDX05PTkUpIHsKLSAgICAgICAgICAgICAgICAvKiBubyBjb21wcmVzc2lvbiAqLwotICAgICAgICAgICAgICAgIGRyY0NvbXAtPnNtb290aEdhaW5baV0gPSBGTDJGWENPTlNUX0RCTCgwLmYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgRklYUF9EQkwgZ2FpbiwgYWxwaGEsIGx2bDJzbXRobHZsOwotCi0gICAgICAgICAgICAgICAgLyogY2FsYyBzdGF0aWMgZ2FpbiAqLwotICAgICAgICAgICAgICAgIGlmIChsZXZlbCA8PSBkcmNDb21wLT5tYXhCb29zdFRocltpXSkgewotICAgICAgICAgICAgICAgICAgICAvKiBtYXggYm9vc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgZ2FpbiA9IGRyY0NvbXAtPm1heEJvb3N0W2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA8IGRyY0NvbXAtPmJvb3N0VGhyW2ldKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGJvb3N0IHJhbmdlICovCi0gICAgICAgICAgICAgICAgICAgIGdhaW4gPSBmTXVsdCgobGV2ZWwgLSBkcmNDb21wLT5ib29zdFRocltpXSksZHJjQ29tcC0+Ym9vc3RGYWNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA8PSBkcmNDb21wLT5lYXJseUN1dFRocltpXSkgewotICAgICAgICAgICAgICAgICAgICAvKiBudWxsIGJhbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgZ2FpbiA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsIDw9IGRyY0NvbXAtPmN1dFRocltpXSkgewotICAgICAgICAgICAgICAgICAgICAvKiBlYXJseSBjdXQgcmFuZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgZ2FpbiA9IGZNdWx0KChsZXZlbCAtIGRyY0NvbXAtPmVhcmx5Q3V0VGhyW2ldKSwgZHJjQ29tcC0+ZWFybHlDdXRGYWNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA8IGRyY0NvbXAtPm1heEN1dFRocltpXSkgewotICAgICAgICAgICAgICAgICAgICAvKiBjdXQgcmFuZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgZ2FpbiA9IGZNdWx0KChsZXZlbCAtIGRyY0NvbXAtPmN1dFRocltpXSksIGRyY0NvbXAtPmN1dEZhY1tpXSkgLSBkcmNDb21wLT5tYXhFYXJseUN1dFtpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIG1heCBjdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgZ2FpbiA9IC1kcmNDb21wLT5tYXhDdXRbaV07Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogY2hvb3NlIHRpbWUgY29uc3RhbnQgKi8KLSAgICAgICAgICAgICAgICBsdmwyc210aGx2bCA9IGxldmVsIC0gZHJjQ29tcC0+c21vb3RoTGV2ZWxbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGdhaW4gPCBkcmNDb21wLT5zbW9vdGhHYWluW2ldKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGF0dGFjayAqLwotICAgICAgICAgICAgICAgICAgICBpZiAobHZsMnNtdGhsdmwgPiBkcmNDb21wLT5hdHRhY2tUaHJbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZhc3QgYXR0YWNrICovCi0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IGRyY0NvbXAtPmZhc3RBdHRhY2tbaV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBzbG93IGF0dGFjayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSBkcmNDb21wLT5zbG93QXR0YWNrW2ldOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvKiByZWxlYXNlICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChsdmwyc210aGx2bCA8IC1kcmNDb21wLT5kZWNheVRocltpXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogZmFzdCByZWxlYXNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IGRyY0NvbXAtPmZhc3REZWNheVtpXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNsb3cgcmVsZWFzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSBkcmNDb21wLT5zbG93RGVjYXlbaV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBzbW9vdGggZ2FpbiAmIGxldmVsICovCi0gICAgICAgICAgICAgICAgaWYgKChnYWluIDwgZHJjQ29tcC0+c21vb3RoR2FpbltpXSkgfHwgKGRyY0NvbXAtPmhvbGRDbnRbaV0gPT0gMCkpIHsgLyogaG9sZCBnYWluIHVubGVzcyB3ZSBoYXZlIGFuIGF0dGFjayBvciBob2xkIHBlcmlvZCBpcyBvdmVyICovCi0gICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGFjY3U7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogZHJjQ29tcC0+c21vb3RoTGV2ZWxbaV0gPSAoMS1hbHBoYSkgKiBkcmNDb21wLT5zbW9vdGhMZXZlbFtpXSArIGFscGhhICogbGV2ZWw7ICovCi0gICAgICAgICAgICAgICAgICAgIGFjY3UgPSAgZk11bHQoKChGSVhQX0RCTClNQVhWQUxfREJMLWFscGhhKSwgZHJjQ29tcC0+c21vb3RoTGV2ZWxbaV0pOwotICAgICAgICAgICAgICAgICAgICBhY2N1ICs9IGZNdWx0KGFscGhhLGxldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgZHJjQ29tcC0+c21vb3RoTGV2ZWxbaV0gPSBhY2N1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIGRyY0NvbXAtPnNtb290aEdhaW5baV0gID0gKDEtYWxwaGEpICogZHJjQ29tcC0+c21vb3RoR2FpbltpXSArIGFscGhhICogZ2FpbjsgKi8KLSAgICAgICAgICAgICAgICAgICAgYWNjdSA9ICBmTXVsdCgoKEZJWFBfREJMKU1BWFZBTF9EQkwtYWxwaGEpLCBkcmNDb21wLT5zbW9vdGhHYWluW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgYWNjdSArPSBmTXVsdChhbHBoYSxnYWluKTsKLSAgICAgICAgICAgICAgICAgICAgZHJjQ29tcC0+c21vb3RoR2FpbltpXSA9IGFjY3U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogaG9sZCBjb3VudGVyICovCi0gICAgICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmhvbGRDbnRbaV0pIHsKLSAgICAgICAgICAgICAgICAgIGRyY0NvbXAtPmhvbGRDbnRbaV0tLTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGdhaW4gPCBkcmNDb21wLT5zbW9vdGhHYWluW2ldKSB7Ci0gICAgICAgICAgICAgICAgICBkcmNDb21wLT5ob2xkQ250W2ldID0gZHJjQ29tcC0+aG9sZE9mZltpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IC8qIHByb2ZpbGUgIT0gRFJDX05PTkUgKi8KLSAgICAgICAgfSAvKiBmb3IgaT0xLi4yICovCi0gICAgICB9IGVsc2UgeworICAgICAgaWYgKGRyY0NvbXAtPnByb2ZpbGVbaV0gPT0gRFJDX05PTkUpIHsKICAgICAgICAgLyogbm8gY29tcHJlc3Npb24gKi8KLSAgICAgICAgZHJjQ29tcC0+c21vb3RoR2FpblswXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0gICAgICAgIGRyY0NvbXAtPnNtb290aEdhaW5bMV0gPSBGTDJGWENPTlNUX0RCTCgwLmYpOwotICAgICAgfQorICAgICAgICBkcmNDb21wLT5zbW9vdGhHYWluW2ldID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZJWFBfREJMIGdhaW4sIGFscGhhLCBsdmwyc210aGx2bDsKIAotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogbGltaXRlcgotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyogZmluZCBwZWFrIGxldmVsICovCi0gICAgcGVha1swXSA9IHBlYWtbMV0gPSBGTDJGWENPTlNUX0RCTCgwLmYpOwotICAgIGZvciAoaSA9IDA7IGkgPCBkcmNDb21wLT5ibG9ja0xlbmd0aDsgaSsrKSB7Ci0gICAgICAgIEZJWFBfREJMIHRtcDsKLSAgICAgICAgY29uc3QgSU5UX1BDTSogcFNhbXBsZXMgPSAmaW5TYW1wbGVzW2kqZHJjQ29tcC0+Y2hhbm5lbHNdOwotICAgICAgICBJTlRfUENNIG1heFNhbXBsZSA9IDA7Ci0KLSAgICAgICAgLyogc2luZ2xlIGNoYW5uZWxzICovCi0gICAgICAgIGZvciAoYyA9IDA7IGMgPCAoaW50KWRyY0NvbXAtPmNoYW5uZWxzOyBjKyspIHsKLSAgICAgICAgICAgIG1heFNhbXBsZSA9IEZES21heChtYXhTYW1wbGUsIGZBYnMocFNhbXBsZXNbY10pKTsKLSAgICAgICAgfQotICAgICAgICBwZWFrWzBdID0gZml4TWF4KHBlYWtbMF0sIEZYX1BDTTJGWF9EQkwobWF4U2FtcGxlKT4+RE9XTk1JWF9TSElGVCk7Ci0KLSAgICAgICAgLyogTHQvUnQgZG93bm1peCAqLwotICAgICAgICBpZiAoZHJjQ29tcC0+ZnVsbENoYW5uZWxzID4gMikgewotICAgICAgICAgICAgLyogTHQgKi8KLSAgICAgICAgICAgIHRtcCA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0KLSAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA+PSAwKSB0bXAgLT0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgLyogTHMgKi8KLSAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPj0gMCkgdG1wIC09IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgLyogTHMyICovCi0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPj0gMCkgdG1wIC09IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSU11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgIC8qIFJzICovCi0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID49IDApIHRtcCAtPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgIC8qIFJzMiAqLwotICAgICAgICAgICAgaWYgKChkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA+PSAwKSAmJiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID49IDApKSB0bXAgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3LjFjaCAqLwotICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbU10gPj0gMCkgdG1wIC09IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtTXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAvKiBTICovCi0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0NdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgIC8qIEMgKi8KLSAgICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMXV0pPj5ET1dOTUlYX1NISUZUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTCAqLwotCi0gICAgICAgICAgICBwZWFrWzBdID0gZml4TWF4KHBlYWtbMF0sIGZpeHBfYWJzKHRtcCkpOwotCi0gICAgICAgICAgICAvKiBSdCAqLwotICAgICAgICAgICAgdG1wID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKLSAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgLyogTHMgKi8KLSAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgLyogTHMyICovCi0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSU11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgIC8qIFJzICovCi0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID49IDApIHRtcCArPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgIC8qIFJzMiAqLwotICAgICAgICAgICAgaWYgKChkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA+PSAwKSAmJiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID49IDApKSB0bXAgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3LjFjaCAqLwotICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbU10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtTXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAvKiBTICovCi0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0NdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgIC8qIEMgKi8KLSAgICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSXV0pPj5ET1dOTUlYX1NISUZUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUiAqLwotCi0gICAgICAgICAgICBwZWFrWzBdID0gZml4TWF4KHBlYWtbMF0sIGZpeHBfYWJzKHRtcCkpOworICAgICAgICAvKiBjYWxjIHN0YXRpYyBnYWluICovCisgICAgICAgIGlmIChsZXZlbCA8PSBkcmNDb21wLT5tYXhCb29zdFRocltpXSkgeworICAgICAgICAgIC8qIG1heCBib29zdCAqLworICAgICAgICAgIGdhaW4gPSBkcmNDb21wLT5tYXhCb29zdFtpXTsKKyAgICAgICAgfSBlbHNlIGlmIChsZXZlbCA8IGRyY0NvbXAtPmJvb3N0VGhyW2ldKSB7CisgICAgICAgICAgLyogYm9vc3QgcmFuZ2UgKi8KKyAgICAgICAgICBnYWluID0gZk11bHQoKGxldmVsIC0gZHJjQ29tcC0+Ym9vc3RUaHJbaV0pLCBkcmNDb21wLT5ib29zdEZhY1tpXSk7CisgICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPD0gZHJjQ29tcC0+ZWFybHlDdXRUaHJbaV0pIHsKKyAgICAgICAgICAvKiBudWxsIGJhbmQgKi8KKyAgICAgICAgICBnYWluID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgICAgICAgfSBlbHNlIGlmIChsZXZlbCA8PSBkcmNDb21wLT5jdXRUaHJbaV0pIHsKKyAgICAgICAgICAvKiBlYXJseSBjdXQgcmFuZ2UgKi8KKyAgICAgICAgICBnYWluID0KKyAgICAgICAgICAgICAgZk11bHQoKGxldmVsIC0gZHJjQ29tcC0+ZWFybHlDdXRUaHJbaV0pLCBkcmNDb21wLT5lYXJseUN1dEZhY1tpXSk7CisgICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPCBkcmNDb21wLT5tYXhDdXRUaHJbaV0pIHsKKyAgICAgICAgICAvKiBjdXQgcmFuZ2UgKi8KKyAgICAgICAgICBnYWluID0gZk11bHQoKGxldmVsIC0gZHJjQ29tcC0+Y3V0VGhyW2ldKSwgZHJjQ29tcC0+Y3V0RmFjW2ldKSAtCisgICAgICAgICAgICAgICAgIGRyY0NvbXAtPm1heEVhcmx5Q3V0W2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIG1heCBjdXQgKi8KKyAgICAgICAgICBnYWluID0gLWRyY0NvbXAtPm1heEN1dFtpXTsKICAgICAgICAgfQogCi0gICAgICAgIC8qIExvL1JvIGRvd25taXggKi8KLSAgICAgICAgaWYgKGRyY0NvbXAtPmZ1bGxDaGFubmVscyA+IDIpIHsKLSAgICAgICAgICAgIC8qIExvICovCi0gICAgICAgICAgICB0bXAgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwotICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFNdID49IDApIHRtcCArPSBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTFNdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMcyAqLwotICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTMl1dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMczIgKi8KLSAgICAgICAgICAgIGlmICgoZHJjQ29tcC0+Y2hhbm5lbElkeFtMU10gPj0gMCkgJiYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbTFMyXSA+PSAwKSkgdG1wID0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNy4xY2ggKi8KLSAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W1NdID49IDApIHRtcCArPSBmTXVsdERpdjIoc2xldiwgZk11bHQoRkwyRlhDT05TVF9EQkwoMC43ZiksIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1NdXSkpPj4oRE9XTk1JWF9TSElGVC0xKTsgLyogUyAqLwotICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbQ10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihjbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtDXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDICovCi0gICAgICAgICAgICB0bXAgKz0gKEZYX1BDTTJGWF9EQkwoKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbTF1dKT4+RE9XTk1JWF9TSElGVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEwgKi8KLQotICAgICAgICAgICAgcGVha1swXSA9IGZpeE1heChwZWFrWzBdLCBmaXhwX2Ficyh0bXApKTsKLQotICAgICAgICAgICAgLyogUm8gKi8KLSAgICAgICAgICAgIHRtcCA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSU11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJzICovCi0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID49IDApIHRtcCArPSBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJzMiAqLwotICAgICAgICAgICAgaWYgKChkcmNDb21wLT5jaGFubmVsSWR4W1JTXSA+PSAwKSAmJiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID49IDApKSB0bXAgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3LjFjaCAqLwotICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbU10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihzbGV2LCBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbU11dKSk+PihET1dOTUlYX1NISUZULTEpOyAvKiBTICovCi0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKGNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0NdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEMgKi8KLSAgICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSXV0pPj5ET1dOTUlYX1NISUZUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUiAqLwotCi0gICAgICAgICAgICBwZWFrWzBdID0gZml4TWF4KHBlYWtbMF0sIGZpeHBfYWJzKHRtcCkpOworICAgICAgICAvKiBjaG9vc2UgdGltZSBjb25zdGFudCAqLworICAgICAgICBsdmwyc210aGx2bCA9IGxldmVsIC0gZHJjQ29tcC0+c21vb3RoTGV2ZWxbaV07CisgICAgICAgIGlmIChnYWluIDwgZHJjQ29tcC0+c21vb3RoR2FpbltpXSkgeworICAgICAgICAgIC8qIGF0dGFjayAqLworICAgICAgICAgIGlmIChsdmwyc210aGx2bCA+IGRyY0NvbXAtPmF0dGFja1RocltpXSkgeworICAgICAgICAgICAgLyogZmFzdCBhdHRhY2sgKi8KKyAgICAgICAgICAgIGFscGhhID0gZHJjQ29tcC0+ZmFzdEF0dGFja1tpXTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogc2xvdyBhdHRhY2sgKi8KKyAgICAgICAgICAgIGFscGhhID0gZHJjQ29tcC0+c2xvd0F0dGFja1tpXTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogcmVsZWFzZSAqLworICAgICAgICAgIGlmIChsdmwyc210aGx2bCA8IC1kcmNDb21wLT5kZWNheVRocltpXSkgeworICAgICAgICAgICAgLyogZmFzdCByZWxlYXNlICovCisgICAgICAgICAgICBhbHBoYSA9IGRyY0NvbXAtPmZhc3REZWNheVtpXTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogc2xvdyByZWxlYXNlICovCisgICAgICAgICAgICBhbHBoYSA9IGRyY0NvbXAtPnNsb3dEZWNheVtpXTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwZWFrWzFdID0gZml4TWF4KHBlYWtbMF0sIHBlYWtbMV0pOworICAgICAgICAvKiBzbW9vdGggZ2FpbiAmIGxldmVsICovCisgICAgICAgIGlmICgoZ2FpbiA8IGRyY0NvbXAtPnNtb290aEdhaW5baV0pIHx8CisgICAgICAgICAgICAoZHJjQ29tcC0+aG9sZENudFtpXSA9PQorICAgICAgICAgICAgIDApKSB7IC8qIGhvbGQgZ2FpbiB1bmxlc3Mgd2UgaGF2ZSBhbiBhdHRhY2sgb3IgaG9sZAorICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZCBpcyBvdmVyICovCisgICAgICAgICAgRklYUF9EQkwgYWNjdTsKIAotICAgICAgICAvKiBNb25vIERvd25taXggLSBmb3IgY29tcF92YWwgb25seSAqLwotICAgICAgICBpZiAoZHJjQ29tcC0+ZnVsbENoYW5uZWxzID4gMSkgewotICAgICAgICAgICAgdG1wID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKLSAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA+PSAwKSB0bXAgKz0gZk11bHREaXYyKHNsZXYsIChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W0xTXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTHMgKi8KLSAgICAgICAgICAgIGlmIChkcmNDb21wLT5jaGFubmVsSWR4W0xTMl0gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdXSk+PihET1dOTUlYX1NISUZULTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTHMyICovCi0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSU10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihzbGV2LCAoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtSU11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJzICovCi0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtSUzJdID49IDApIHRtcCArPSBmTXVsdERpdjIoc2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbUlMyXV0pPj4oRE9XTk1JWF9TSElGVC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJzMiAqLwotICAgICAgICAgICAgaWYgKChkcmNDb21wLT5jaGFubmVsSWR4W0xTXSA+PSAwKSAmJiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtMUzJdID49IDApKSB0bXAgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjcwN2YpLCB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3LjFjaCAqLwotICAgICAgICAgICAgLyppZiAoKGRyY0NvbXAtPmNoYW5uZWxJZHhbUlNdID49IDApICYmIChkcmNDb21wLT5jaGFubmVsSWR4W1JTMl0gPj0gMCkpIHRtcCAqPTAuNzA3ZjsqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3LjFjaCAqLwotICAgICAgICAgICAgaWYgKGRyY0NvbXAtPmNoYW5uZWxJZHhbU10gPj0gMCkgdG1wICs9IGZNdWx0RGl2MihzbGV2LCBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjdmKSwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbU11dKSk+PihET1dOTUlYX1NISUZULTEpOyAvKiBTICovCi0gICAgICAgICAgICBpZiAoZHJjQ29tcC0+Y2hhbm5lbElkeFtDXSA+PSAwKSB0bXAgKz0gZk11bHQoY2xldiwgKEZJWFBfUENNKXBTYW1wbGVzW2RyY0NvbXAtPmNoYW5uZWxJZHhbQ11dKT4+KERPV05NSVhfU0hJRlQtMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEMgKDIqY2xldikgKi8KLSAgICAgICAgICAgIHRtcCArPSAoRlhfUENNMkZYX0RCTCgoRklYUF9QQ00pcFNhbXBsZXNbZHJjQ29tcC0+Y2hhbm5lbElkeFtMXV0pPj5ET1dOTUlYX1NISUZUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTCAqLwotICAgICAgICAgICAgdG1wICs9IChGWF9QQ00yRlhfREJMKChGSVhQX1BDTSlwU2FtcGxlc1tkcmNDb21wLT5jaGFubmVsSWR4W1JdXSk+PkRPV05NSVhfU0hJRlQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSICovCisgICAgICAgICAgLyogZHJjQ29tcC0+c21vb3RoTGV2ZWxbaV0gPSAoMS1hbHBoYSkgKiBkcmNDb21wLT5zbW9vdGhMZXZlbFtpXSArCisgICAgICAgICAgICogYWxwaGEgKiBsZXZlbDsgKi8KKyAgICAgICAgICBhY2N1ID0gZk11bHQoKChGSVhQX0RCTClNQVhWQUxfREJMIC0gYWxwaGEpLCBkcmNDb21wLT5zbW9vdGhMZXZlbFtpXSk7CisgICAgICAgICAgYWNjdSArPSBmTXVsdChhbHBoYSwgbGV2ZWwpOworICAgICAgICAgIGRyY0NvbXAtPnNtb290aExldmVsW2ldID0gYWNjdTsKIAotICAgICAgICAgICAgcGVha1sxXSA9IGZpeE1heChwZWFrWzFdLCBmaXhwX2Ficyh0bXApKTsKKyAgICAgICAgICAvKiBkcmNDb21wLT5zbW9vdGhHYWluW2ldICA9ICgxLWFscGhhKSAqIGRyY0NvbXAtPnNtb290aEdhaW5baV0gKworICAgICAgICAgICAqIGFscGhhICogZ2FpbjsgKi8KKyAgICAgICAgICBhY2N1ID0gZk11bHQoKChGSVhQX0RCTClNQVhWQUxfREJMIC0gYWxwaGEpLCBkcmNDb21wLT5zbW9vdGhHYWluW2ldKTsKKyAgICAgICAgICBhY2N1ICs9IGZNdWx0KGFscGhhLCBnYWluKTsKKyAgICAgICAgICBkcmNDb21wLT5zbW9vdGhHYWluW2ldID0gYWNjdTsKICAgICAgICAgfQorCisgICAgICAgIC8qIGhvbGQgY291bnRlciAqLworICAgICAgICBpZiAoZHJjQ29tcC0+aG9sZENudFtpXSkgeworICAgICAgICAgIGRyY0NvbXAtPmhvbGRDbnRbaV0tLTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2FpbiA8IGRyY0NvbXAtPnNtb290aEdhaW5baV0pIHsKKyAgICAgICAgICBkcmNDb21wLT5ob2xkQ250W2ldID0gZHJjQ29tcC0+aG9sZE9mZltpXTsKKyAgICAgICAgfQorICAgICAgfSAvKiBwcm9maWxlICE9IERSQ19OT05FICovCisgICAgfSAgIC8qIGZvciBpPTEuLjIgKi8KKyAgfSBlbHNlIHsKKyAgICAvKiBubyBjb21wcmVzc2lvbiAqLworICAgIGRyY0NvbXAtPnNtb290aEdhaW5bMF0gPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICAgIGRyY0NvbXAtPnNtb290aEdhaW5bMV0gPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICB9CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqIGxpbWl0ZXIKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIGZpbmRQZWFrTGV2ZWxzKGRyY0NvbXAsIGluU2FtcGxlcywgY2xldiwgc2xldiwgZXh0X2xldmEsIGV4dF9sZXZiLCBsZmVfbGV2LAorICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKChMT05HKShkbXhHYWluNSkgPDwgKE1FVEFEQVRBX0ZSQUNUX0JJVFMgLSAxNikpLAorICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKChMT05HKShkbXhHYWluMikgPDwgKE1FVEFEQVRBX0ZSQUNUX0JJVFMgLSAxNikpLAorICAgICAgICAgICAgICAgICBwZWFrKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgRklYUF9EQkwgdG1wID0gZHJjQ29tcC0+cHJldlBlYWtbaV07CisgICAgZHJjQ29tcC0+cHJldlBlYWtbaV0gPSBwZWFrW2ldOworICAgIHBlYWtbaV0gPSBmaXhNYXgocGVha1tpXSwgdG1wKTsKKworICAgIC8qCisgICAgICogQ29udmVydCB0byBkQkZTLCBhcHBseSBkaWFsbm9ybQorICAgICAqLworICAgIC8qIGRlc2NhbGVkIHBlYWsgaW4gbGQ2NCByZXByZXNlbnRhdGlvbiAqLworICAgIEZJWFBfREJMIGxkX3BlYWsgPQorICAgICAgICBDYWxjTGREYXRhKHBlYWtbaV0pICsKKyAgICAgICAgKEZJWFBfREJMKSgoTE9ORylET1dOTUlYX1NISUZUIDw8IChERlJBQ1RfQklUUyAtIDEgLSBMRF9EQVRBX1NISUZUKSk7CisKKyAgICAvKiBpZiAocGVhayA8IDFlLTYpIGxldmVsID0gMWUtNmY7ICovCisgICAgbGRfcGVhayA9CisgICAgICAgIGZNYXgobGRfcGVhaywgRkwyRlhDT05TVF9EQkwoLTAuMzExNDMwNzU4ODk1NjkwMjIwMTEyODQyNDQ2NTE0NjNmKSk7CisKKyAgICAvKiBwZWFrW2ldID0gMjAgKiBsb2cocGVha1tpXSkvbG9nKDEwKSArIDAuMmYgKworICAgICAqIChkcmNDb21wLT5zbW9vdGhHYWluW2ldKjJeTUVUQURBVEFfRlJBQ1RfQklUUykgcGVha1tpXSA9IDIwICoKKyAgICAgKiBsb2coMikvbG9nKDEwKSAqIGxkKHBlYWtbaV0pICsgMC4yZiArCisgICAgICogKGRyY0NvbXAtPnNtb290aEdhaW5baV0qMl5NRVRBREFUQV9GUkFDVF9CSVRTKSBwZWFrW2ldID0gMTAgKgorICAgICAqIDIqMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkKHBlYWtbaV0pICsgMC4yZiArCisgICAgICogKGRyY0NvbXAtPnNtb290aEdhaW5baV0qMl5NRVRBREFUQV9GUkFDVF9CSVRTKQorICAgICAqCisgICAgICogICAgYWRkaXRpb25hbCBzY2FsaW5nIHdpdGggTUVUQURBVEFfRlJBQ1RfQklUUzoKKyAgICAgKiBwZWFrW2ldID0gKDEwICogMiowLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQ2NChwZWFrW2ldKSAqIDY0CisgICAgICogKyAwLjJmICsKKyAgICAgKiAoZHJjQ29tcC0+c21vb3RoR2FpbltpXSoyXk1FVEFEQVRBX0ZSQUNUX0JJVFMpKSoyXigtTUVUQURBVEFfRlJBQ1RfQklUUykKKyAgICAgKiBwZWFrW2ldID0gMTAqMl4oTUVUQURBVEFfRlJBQ1RfQklUUytMRF9EQVRBX1NISUZUKSAqCisgICAgICogMiowLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQ2NChwZWFrW2ldKQorICAgICAqICAgICAgICAgKyAwLjJmKjJeKC1NRVRBREFUQV9GUkFDVF9CSVRTKSArIGRyY0NvbXAtPnNtb290aEdhaW5baV0KKyAgICAgKi8KKyAgICBwZWFrW2ldID0gZk11bHQoCisgICAgICAgIChGSVhQX0RCTCkoMTAgPDwgKE1FVEFEQVRBX0ZSQUNUX0JJVFMgKyBMRF9EQVRBX1NISUZUKSksCisgICAgICAgIGZNdWx0KEZMMkZYX0RCTCgyICogMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OWYpLCBsZF9wZWFrKSk7CisgICAgcGVha1tpXSArPQorICAgICAgICAoRkwyRlhfREJMKDAuNWYpID4+IE1FVEFEQVRBX0lOVF9CSVRTKTsgLyogYWRkIGEgbGl0dGxlIGJpdCBoZWFkcm9vbSAqLworICAgIHBlYWtbaV0gKz0gZHJjQ29tcC0+c21vb3RoR2FpbltpXTsKKyAgfQorCisgIC8qIHBlYWsgLT0gZGlhbG5vcm0gKyAzMTsgKi8gLyogdGhpcyBpcyBEb2xieSBzdHlsZSBvbmx5ICovCisgIHBlYWtbMF0gLT0gKEZJWFBfREJMKSgoZGlhbG5vcm0gLSBkcmNfVGFyZ2V0UmVmTGV2ZWwpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAoTUVUQURBVEFfRlJBQ1RfQklUUyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpKTsgLyogcGVha1swXSAtPSBkaWFsbm9ybSAtIGRyY19UYXJnZXRSZWZMZXZlbCAqLworCisgIC8qIHBlYWsgKz0gMTE7ICovCisgIC8qIHRoaXMgaXMgRG9sYnkgc3R5bGUgb25seSAqLyAvKiBSRiBtb2RlIG91dHB1dCBpcyAxMWRCIGhpZ2hlciAqLworICAvKnBlYWsgKz0gY29tcF9UYXJnZXRSZWZMZXZlbCAtIGRyY19UYXJnZXRSZWZMZXZlbDsqLworICBwZWFrWzFdIC09CisgICAgICAoRklYUF9EQkwpKChkaWFsbm9ybSAtIGNvbXBfVGFyZ2V0UmVmTGV2ZWwpCisgICAgICAgICAgICAgICAgIDw8IChNRVRBREFUQV9GUkFDVF9CSVRTIC0KKyAgICAgICAgICAgICAgICAgICAgIDE2KSk7IC8qIHBlYWtbMV0gLT0gZGlhbG5vcm0gLSBjb21wX1RhcmdldFJlZkxldmVsICovCisKKyAgLyogbGltaXRlciBnYWluICovCisgIGRyY0NvbXAtPmxpbUdhaW5bMF0gKz0gZHJjQ29tcC0+bGltRGVjYXk7IC8qIGxpbmVhciBsaW1pdGVyIHJlbGVhc2UgKi8KKyAgZHJjQ29tcC0+bGltR2FpblswXSA9IGZpeE1pbihkcmNDb21wLT5saW1HYWluWzBdLCAtcGVha1swXSk7CisKKyAgZHJjQ29tcC0+bGltR2FpblsxXSArPSAyICogZHJjQ29tcC0+bGltRGVjYXk7IC8qIGxpbmVhciBsaW1pdGVyIHJlbGVhc2UgKi8KKyAgZHJjQ29tcC0+bGltR2FpblsxXSA9IGZpeE1pbihkcmNDb21wLT5saW1HYWluWzFdLCAtcGVha1sxXSk7CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyogYXBwbHkgbGltaXRpbmcsIHJldHVybiBEUkMgZ2FpbnMqLworICB7CisgICAgRklYUF9EQkwgdG1wOworCisgICAgdG1wID0gZHJjQ29tcC0+c21vb3RoR2FpblswXTsKKyAgICBpZiAoZHJjQ29tcC0+bGltR2FpblswXSA8IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICAgIHRtcCArPSBkcmNDb21wLT5saW1HYWluWzBdOwogICAgIH0KKyAgICAqcER5bnJuZyA9IChMT05HKXNjYWxlVmFsdWUodG1wLCAtKE1FVEFEQVRBX0ZSQUNUX0JJVFMgLSAxNikpOwogCi0gICAgZm9yIChpPTA7IGk8MjsgaSsrKSB7Ci0gICAgICBGSVhQX0RCTCB0bXAgPSBkcmNDb21wLT5wcmV2UGVha1tpXTsKLSAgICAgIGRyY0NvbXAtPnByZXZQZWFrW2ldID0gcGVha1tpXTsKLSAgICAgIHBlYWtbaV0gPSBmaXhNYXgocGVha1tpXSwgdG1wKTsKLQotICAgICAgLyoKLSAgICAgICAqIENvbnZlcnQgdG8gZEJGUywgYXBwbHkgZGlhbG5vcm0KLSAgICAgICAqLwotICAgICAgLyogZGVzY2FsZWQgcGVhayBpbiBsZDY0IHJlcHJlc2VudGF0aW9uICovCi0gICAgICBGSVhQX0RCTCBsZF9wZWFrID0gQ2FsY0xkRGF0YShwZWFrW2ldKSArIChGSVhQX0RCTCkoKExPTkcpRE9XTk1JWF9TSElGVDw8KERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCkpOwotCi0gICAgICAvKiBpZiAocGVhayA8IDFlLTYpIGxldmVsID0gMWUtNmY7ICovCi0gICAgICBsZF9wZWFrID0gRkRLbWF4KGxkX3BlYWssIEZMMkZYQ09OU1RfREJMKC0wLjMxMTQzMDc1ODg5NTY5MDIyMDExMjg0MjQ0NjUxNDYzZikpOwotCi0gICAgICAvKiBwZWFrW2ldID0gMjAgKiBsb2cocGVha1tpXSkvbG9nKDEwKSArIDAuMmYgKyAoZHJjQ29tcC0+c21vb3RoR2FpbltpXSoyXk1FVEFEQVRBX0ZSQUNUX0JJVFMpCi0gICAgICAgKiBwZWFrW2ldID0gMjAgKiBsb2coMikvbG9nKDEwKSAqIGxkKHBlYWtbaV0pICsgMC4yZiArIChkcmNDb21wLT5zbW9vdGhHYWluW2ldKjJeTUVUQURBVEFfRlJBQ1RfQklUUykKLSAgICAgICAqIHBlYWtbaV0gPSAxMCAqIDIqMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkKHBlYWtbaV0pICsgMC4yZiArIChkcmNDb21wLT5zbW9vdGhHYWluW2ldKjJeTUVUQURBVEFfRlJBQ1RfQklUUykKLSAgICAgICAqCi0gICAgICAgKiAgICBhZGRpdGlvbmFsIHNjYWxpbmcgd2l0aCBNRVRBREFUQV9GUkFDVF9CSVRTOgotICAgICAgICogcGVha1tpXSA9ICgxMCAqIDIqMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAqIGxkNjQocGVha1tpXSkgKiA2NCArIDAuMmYgKyAoZHJjQ29tcC0+c21vb3RoR2FpbltpXSoyXk1FVEFEQVRBX0ZSQUNUX0JJVFMpKSoyXigtTUVUQURBVEFfRlJBQ1RfQklUUykKLSAgICAgICAqIHBlYWtbaV0gPSAxMCoyXihNRVRBREFUQV9GUkFDVF9CSVRTK0xEX0RBVEFfU0hJRlQpICogMiowLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5ICogbGQ2NChwZWFrW2ldKQotICAgICAgICogICAgICAgICArIDAuMmYqMl4oLU1FVEFEQVRBX0ZSQUNUX0JJVFMpICsgZHJjQ29tcC0+c21vb3RoR2FpbltpXQotICAgICAgICovCi0gICAgICBwZWFrW2ldID0gZk11bHQoKEZJWFBfREJMKSgxMDw8KE1FVEFEQVRBX0ZSQUNUX0JJVFMrTERfREFUQV9TSElGVCkpLCBmTXVsdCggRkwyRlhfREJMKDIqMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OWYpLCBsZF9wZWFrKSk7Ci0gICAgICBwZWFrW2ldICs9IChGTDJGWF9EQkwoMC41Zik+Pk1FVEFEQVRBX0lOVF9CSVRTKTsgICAgICAgICAgIC8qIGFkZCBhIGxpdHRsZSBiaXQgaGVhZHJvb20gKi8KLSAgICAgIHBlYWtbaV0gKz0gIGRyY0NvbXAtPnNtb290aEdhaW5baV07CisgICAgdG1wID0gZHJjQ29tcC0+c21vb3RoR2FpblsxXTsKKyAgICBpZiAoZHJjQ29tcC0+bGltR2FpblsxXSA8IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICAgIHRtcCArPSBkcmNDb21wLT5saW1HYWluWzFdOwogICAgIH0KKyAgICAqcENvbXByID0gKExPTkcpc2NhbGVWYWx1ZSh0bXAsIC0oTUVUQURBVEFfRlJBQ1RfQklUUyAtIDE2KSk7CisgIH0KIAotICAgIC8qIHBlYWsgLT0gZGlhbG5vcm0gKyAzMTsgKi8gIC8qIHRoaXMgaXMgRG9sYnkgc3R5bGUgb25seSAqLwotICAgIHBlYWtbMF0gLT0gKEZJWFBfREJMKSgoZGlhbG5vcm0tZHJjX1RhcmdldFJlZkxldmVsKTw8KE1FVEFEQVRBX0ZSQUNUX0JJVFMtMTYpKTsgLyogcGVha1swXSAtPSBkaWFsbm9ybSAtIGRyY19UYXJnZXRSZWZMZXZlbCAqLwotCi0gICAgLyogcGVhayArPSAxMTsgKi8gICAvKiB0aGlzIGlzIERvbGJ5IHN0eWxlIG9ubHkgKi8gICAgICAvKiBSRiBtb2RlIG91dHB1dCBpcyAxMWRCIGhpZ2hlciAqLwotICAgIC8qcGVhayArPSBjb21wX1RhcmdldFJlZkxldmVsIC0gZHJjX1RhcmdldFJlZkxldmVsOyovCi0gICAgcGVha1sxXSAtPSAoRklYUF9EQkwpKChkaWFsbm9ybS1jb21wX1RhcmdldFJlZkxldmVsKTw8KE1FVEFEQVRBX0ZSQUNUX0JJVFMtMTYpKTsgLyogcGVha1sxXSAtPSBkaWFsbm9ybSAtIGNvbXBfVGFyZ2V0UmVmTGV2ZWwgKi8KLQotICAgIC8qIGxpbWl0ZXIgZ2FpbiAqLwotICAgIGRyY0NvbXAtPmxpbUdhaW5bMF0gKz0gZHJjQ29tcC0+bGltRGVjYXk7ICAgICAgICAgICAgICAgLyogbGluZWFyIGxpbWl0ZXIgcmVsZWFzZSAqLwotICAgIGRyY0NvbXAtPmxpbUdhaW5bMF0gPSBmaXhNaW4oZHJjQ29tcC0+bGltR2FpblswXSwgLXBlYWtbMF0pOwotCi0gICAgZHJjQ29tcC0+bGltR2FpblsxXSArPSAyKmRyY0NvbXAtPmxpbURlY2F5OyAgICAgICAgICAgICAvKiBsaW5lYXIgbGltaXRlciByZWxlYXNlICovCi0gICAgZHJjQ29tcC0+bGltR2FpblsxXSA9IGZpeE1pbihkcmNDb21wLT5saW1HYWluWzFdLCAtcGVha1sxXSk7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qIGFwcGx5IGxpbWl0aW5nLCByZXR1cm4gRFJDIGdhaW5zKi8KLSAgICB7Ci0gICAgICAgIEZJWFBfREJMIHRtcDsKLQotICAgICAgICB0bXAgPSBkcmNDb21wLT5zbW9vdGhHYWluWzBdOwotICAgICAgICBpZiAoZHJjQ29tcC0+bGltR2FpblswXSA8IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKLSAgICAgICAgICB0bXAgKz0gZHJjQ29tcC0+bGltR2FpblswXTsKLSAgICAgICAgfQotICAgICAgICAqcER5bnJuZyA9IChMT05HKSBzY2FsZVZhbHVlKHRtcCwgLShNRVRBREFUQV9GUkFDVF9CSVRTLTE2KSk7Ci0KLSAgICAgICAgdG1wID0gZHJjQ29tcC0+c21vb3RoR2FpblsxXTsKLSAgICAgICAgaWYgKGRyY0NvbXAtPmxpbUdhaW5bMV0gPCBGTDJGWENPTlNUX0RCTCgwLmYpKSB7Ci0gICAgICAgICAgdG1wICs9IGRyY0NvbXAtPmxpbUdhaW5bMV07Ci0gICAgICAgIH0KLSAgICAgICAgKnBDb21wciAgPSAoTE9ORykgc2NhbGVWYWx1ZSh0bXAsIC0oTUVUQURBVEFfRlJBQ1RfQklUUy0xNikpOwotICAgIH0KLQotICAgIHJldHVybiAwOworICByZXR1cm4gMDsKIH0KIAotCi1EUkNfUFJPRklMRSBGREtfRFJDX0dlbmVyYXRvcl9nZXREcmNQcm9maWxlKGNvbnN0IEhEUkNfQ09NUCBkcmNDb21wKQotewotICAgIHJldHVybiBkcmNDb21wLT5wcm9maWxlWzBdOworRFJDX1BST0ZJTEUgRkRLX0RSQ19HZW5lcmF0b3JfZ2V0RHJjUHJvZmlsZShjb25zdCBIRFJDX0NPTVAgZHJjQ29tcCkgeworICByZXR1cm4gZHJjQ29tcC0+cHJvZmlsZVswXTsKIH0KIAotRFJDX1BST0ZJTEUgRkRLX0RSQ19HZW5lcmF0b3JfZ2V0Q29tcFByb2ZpbGUoY29uc3QgSERSQ19DT01QIGRyY0NvbXApCi17Ci0gICAgcmV0dXJuIGRyY0NvbXAtPnByb2ZpbGVbMV07CitEUkNfUFJPRklMRSBGREtfRFJDX0dlbmVyYXRvcl9nZXRDb21wUHJvZmlsZShjb25zdCBIRFJDX0NPTVAgZHJjQ29tcCkgeworICByZXR1cm4gZHJjQ29tcC0+cHJvZmlsZVsxXTsKIH0KLQotCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL21ldGFkYXRhX2NvbXByZXNzb3IuaCBiL2xpYkFBQ2VuYy9zcmMvbWV0YWRhdGFfY29tcHJlc3Nvci5oCmluZGV4IGZmNjM5YjUuLjFkMGFhNDIgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvbWV0YWRhdGFfY29tcHJlc3Nvci5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvbWV0YWRhdGFfY29tcHJlc3Nvci5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDc1ICs5MCw3MyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgQUFDIEVuY29kZXIgbGliICAqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEF1dGhvcihzKTogTS4gTmV1c2luZ2VyCisgICBBdXRob3Iocyk6ICAgTS4gTmV1c2luZ2VyCisKICAgIERlc2NyaXB0aW9uOiBDb21wcmVzc29yIGZvciBBQUMgTWV0YWRhdGEgR2VuZXJhdG9yCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgX01FVEFEQVRBX0NPTVBSRVNTT1JfSAotI2RlZmluZSBfTUVUQURBVEFfQ09NUFJFU1NPUl9ICi0KKyNpZm5kZWYgTUVUQURBVEFfQ09NUFJFU1NPUl9ICisjZGVmaW5lIE1FVEFEQVRBX0NPTVBSRVNTT1JfSAogCiAjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCiAjaW5jbHVkZSAiYWFjZW5jLmgiCiAKKyNkZWZpbmUgTEZFX0xFVl9TQ0FMRSAyCiAKIC8qKgogICogIERSQyBjb21wcmVzc2lvbiBwcm9maWxlcy4KICAqLwogdHlwZWRlZiBlbnVtIERSQ19QUk9GSUxFIHsKLSAgRFJDX05PTkUgICAgICAgICAgPSAwLAotICBEUkNfRklMTVNUQU5EQVJEICA9IDEsCi0gIERSQ19GSUxNTElHSFQgICAgID0gMiwKKyAgRFJDX05PTkUgPSAwLAorICBEUkNfRklMTVNUQU5EQVJEID0gMSwKKyAgRFJDX0ZJTE1MSUdIVCA9IDIsCiAgIERSQ19NVVNJQ1NUQU5EQVJEID0gMywKLSAgRFJDX01VU0lDTElHSFQgICAgPSA0LAotICBEUkNfU1BFRUNIICAgICAgICA9IDUsCi0gIERSQ19ERUxBWV9URVNUICAgID0gNgorICBEUkNfTVVTSUNMSUdIVCA9IDQsCisgIERSQ19TUEVFQ0ggPSA1LAorICBEUkNfREVMQVlfVEVTVCA9IDYsCisgIERSQ19OT1RfUFJFU0VOVCA9IC0yCiAKIH0gRFJDX1BST0ZJTEU7CiAKLQogLyoqCiAgKiAgRFJDIENvbXByZXNzb3IgaGFuZGxlLgogICovCi10eXBlZGVmIHN0cnVjdCBEUkNfQ09NUCAgRFJDX0NPTVAsICpIRFJDX0NPTVA7Cit0eXBlZGVmIHN0cnVjdCBEUkNfQ09NUCBEUkNfQ09NUCwgKkhEUkNfQ09NUDsKIAogLyoqCiAgKiBcYnJpZWYgIE9wZW4gYSBEUkMgQ29tcHJlc3NvciBpbnN0YW5jZS4KICAqCiAgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgY29tcHJlc3NvciBpbnN0YW5jZS4KICAqCi0gKiBccGFyYW0gcGhEcmNDb21wICAgICAgICAgICAgIEEgcG9pbnRlciB0byBhIGNvbXByZXNzb3IgaGFuZGxlLiBJbml0aWFsaXplZCBvbiByZXR1cm4uCisgKiBccGFyYW0gcGhEcmNDb21wICAgICAgICAgICAgIEEgcG9pbnRlciB0byBhIGNvbXByZXNzb3IgaGFuZGxlLiBJbml0aWFsaXplZCBvbgorICogcmV0dXJuLgogICoKICAqIFxyZXR1cm4KICAqICAgICAgICAgIC0gMCwgb24gc3VjY2VzLgogICogICAgICAgICAgLSB1bmVxdWFsIDAsIG9uIGZhaWx1cmUuCiAgKi8KLUlOVCBGREtfRFJDX0dlbmVyYXRvcl9PcGVuKAotICAgICAgICBIRFJDX0NPTVAgICAgICAgICAgICAgICAgICAgICAgKnBoRHJjQ29tcAotICAgICAgICApOwotCitJTlQgRkRLX0RSQ19HZW5lcmF0b3JfT3BlbihIRFJDX0NPTVAgKnBoRHJjQ29tcCk7CiAKIC8qKgogICogXGJyaWVmICBDbG9zZSB0aGUgRFJDIENvbXByZXNzb3IgaW5zdGFuY2UuCiAgKgogICogRGVhbGxvY2F0ZSBpbnN0YW5jZSBhbmQgZnJlZSB3aG9sZSBtZW1vcnkuCiAgKgotICogXHBhcmFtIHBoRHJjQ29tcCAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBjb21wcmVzc29yIGhhbmRsZSB0byBiZSBkZWFsbG9jYXRlZC4KKyAqIFxwYXJhbSBwaERyY0NvbXAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgY29tcHJlc3NvciBoYW5kbGUgdG8gYmUKKyAqIGRlYWxsb2NhdGVkLgogICoKICAqIFxyZXR1cm4KICAqICAgICAgICAgIC0gMCwgb24gc3VjY2VzLgogICogICAgICAgICAgLSB1bmVxdWFsIDAsIG9uIGZhaWx1cmUuCiAgKi8KLUlOVCBGREtfRFJDX0dlbmVyYXRvcl9DbG9zZSgKLSAgICAgICAgSERSQ19DT01QICAgICAgICAgICAgICAgICAgICAgICpwaERyY0NvbXAKLSAgICAgICAgKTsKK0lOVCBGREtfRFJDX0dlbmVyYXRvcl9DbG9zZShIRFJDX0NPTVAgKnBoRHJjQ29tcCk7CiAKIC8qKgogICogXGJyaWVmICBDb25maWd1cmUgRFJDIENvbXByZXNzb3IuCkBAIC0xNTUsNyArMTY0LDggQEAKICAqIFxwYXJhbSBkcmNDb21wICAgICAgICAgICAgICAgQ29tcHJlc3NvciBoYW5kbGUuCiAgKiBccGFyYW0gcHJvZmlsZUxpbmUgICAgICAgICAgIERSQyBwcm9maWxlIGZvciBsaW5lIG1vZGUuCiAgKiBccGFyYW0gcHJvZmlsZVJGICAgICAgICAgICAgIERSQyBwcm9maWxlIGZvciBSRiBtb2RlLgotICogXHBhcmFtIGJsb2NrTGVuZ3RoICAgICAgICAgICBMZW5ndGggb2YgcHJvY2Vzc2luZyBibG9jayBpbiBzYW1wbGVzIHBlciBjaGFubmVsLgorICogXHBhcmFtIGJsb2NrTGVuZ3RoICAgICAgICAgICBMZW5ndGggb2YgcHJvY2Vzc2luZyBibG9jayBpbiBzYW1wbGVzIHBlcgorICogY2hhbm5lbC4KICAqIFxwYXJhbSBzYW1wbGVSYXRlICAgICAgICAgICAgU2FtcGxpbmcgcmF0ZSBpbiBIei4KICAqIFxwYXJhbSBjaGFubmVsTW9kZSAgICAgICAgICAgQ2hhbm5lbCBjb25maWd1cmF0aW9uLgogICogXHBhcmFtIGNoYW5uZWxPcmRlciAgICAgICAgICBDaGFubmVsIG9yZGVyLCBNUEVHIG9yIFdBVi4KQEAgLTE2NSw0NiArMTc1LDQ5IEBACiAgKiAgICAgICAgICAtIDAsIG9uIHN1Y2Nlc3MsCiAgKiAgICAgICAgICAtIHVuZXF1YWwgMCwgb24gZmFpbHVyZQogICovCi1JTlQgRkRLX0RSQ19HZW5lcmF0b3JfSW5pdGlhbGl6ZSgKLSAgICAgICAgSERSQ19DT01QICAgICAgICAgICAgICAgICAgICAgICBkcmNDb21wLAotICAgICAgICBjb25zdCBEUkNfUFJPRklMRSAgICAgICAgICAgICAgIHByb2ZpbGVMaW5lLAotICAgICAgICBjb25zdCBEUkNfUFJPRklMRSAgICAgICAgICAgICAgIHByb2ZpbGVSRiwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICBibG9ja0xlbmd0aCwKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICBjb25zdCBDSEFOTkVMX01PREUgICAgICAgICAgICAgIGNoYW5uZWxNb2RlLAotICAgICAgICBjb25zdCBDSEFOTkVMX09SREVSICAgICAgICAgICAgIGNoYW5uZWxPcmRlciwKLSAgICAgICAgY29uc3QgVUNIQVIgICAgICAgICAgICAgICAgICAgICB1c2VXZWlnaHRpbmcKLSAgICAgICAgKTsKK0lOVCBGREtfRFJDX0dlbmVyYXRvcl9Jbml0aWFsaXplKEhEUkNfQ09NUCBkcmNDb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRFJDX1BST0ZJTEUgcHJvZmlsZUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEUkNfUFJPRklMRSBwcm9maWxlUkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYmxvY2tMZW5ndGgsIGNvbnN0IFVJTlQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENIQU5ORUxfTU9ERSBjaGFubmVsTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENIQU5ORUxfT1JERVIgY2hhbm5lbE9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgdXNlV2VpZ2h0aW5nKTsKIAogLyoqCiAgKiBcYnJpZWYgIENhbGN1bGF0ZSBEUkMgQ29tcHJlc3NvciBHYWluLgogICoKICAqIFxwYXJhbSBkcmNDb21wICAgICAgICAgICAgICAgQ29tcHJlc3NvciBoYW5kbGUuCiAgKiBccGFyYW0gaW5TYW1wbGVzICAgICAgICAgICAgIFBvaW50ZXIgdG8gaW50ZXJsZWF2ZWQgaW5wdXQgYXVkaW8gc2FtcGxlcy4KKyAqIFxwYXJhbSBpblNhbXBsZXNCdWZTaXplICAgICAgU2l6ZSBvZiBpblNhbXBsZXMgZm9yIG9uZSBjaGFubmVsLgogICogXHBhcmFtIGRpYWxub3JtICAgICAgICAgICAgICBEaWFsb2cgTGV2ZWwgaW4gZEIgKHR5cGljYWxseSAtMzEuLi4tMSkuCiAgKiBccGFyYW0gZHJjX1RhcmdldFJlZkxldmVsCiAgKiBccGFyYW0gY29tcF9UYXJnZXRSZWZMZXZlbAotICogXHBhcmFtIGNsZXYgICAgICAgICAgICAgICAgICBEb3dubWl4IGNlbnRlciBtaXggZmFjdG9yICh0eXBpY2FsbHkgMC43MDcsIDAuNTk1IG9yIDAuNSkKLSAqIFxwYXJhbSBzbGV2ICAgICAgICAgICAgICAgICAgRG93bm1peCBzdXJyb3VuZCBtaXggZmFjdG9yICh0eXBpY2FsbHkgMC43MDcsIDAuNSwgb3IgMCkKLSAqIFxwYXJhbSBkeW5ybmcgICAgICAgICAgICAgICAgUG9pbnRlciB0byB2YXJpYWJsZSByZWNlaXZpbmcgbGluZSBtb2RlIERSQyBnYWluIGluIGRCCi0gKiBccGFyYW0gY29tcHIgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdmFyaWFibGUgcmVjZWl2aW5nIFJGIG1vZGUgRFJDIGdhaW4gaW4gZEIKKyAqIFxwYXJhbSBjbGV2ICAgICAgICAgICAgICAgICAgRG93bm1peCBjZW50ZXIgbWl4IGZhY3RvciAodHlwaWNhbGx5IDAuNzA3LAorICogMC41OTUgb3IgMC41KQorICogXHBhcmFtIHNsZXYgICAgICAgICAgICAgICAgICBEb3dubWl4IHN1cnJvdW5kIG1peCBmYWN0b3IgKHR5cGljYWxseSAwLjcwNywKKyAqIDAuNSwgb3IgMCkKKyAqIFxwYXJhbSBleHRfbGV2YSAgICAgICAgICAgICAgRG93bm1peCBnYWluIGZhY3RvciBBCisgKiBccGFyYW0gZXh0X2xldmIgICAgICAgICAgICAgIERvd25taXggZ2FpbiBmYWN0b3IgQgorICogXHBhcmFtIGxmZV9sZXYgICAgICAgICAgICAgICBMRkUgZ2FpbiBmYWN0b3IKKyAqIFxwYXJhbSBkbXhHYWluNSAgICAgICAgICAgICAgR2FpbiBmYWN0b3IgZm9yIGRvd25taXggdG8gNSBjaGFubmVscworICogXHBhcmFtIGRteEdhaW4yICAgICAgICAgICAgICBHYWluIGZhY3RvciBmb3IgZG93bm1peCB0byAyIGNoYW5uZWxzCisgKiBccGFyYW0gZHlucm5nICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdmFyaWFibGUgcmVjZWl2aW5nIGxpbmUgbW9kZSBEUkMgZ2FpbgorICogaW4gZEIKKyAqIFxwYXJhbSBjb21wciAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB2YXJpYWJsZSByZWNlaXZpbmcgUkYgbW9kZSBEUkMgZ2FpbgorICogaW4gZEIKICAqCiAgKiBccmV0dXJuCiAgKiAgICAgICAgICAtIDAsIG9uIHN1Y2Nlc3MsCiAgKiAgICAgICAgICAtIHVuZXF1YWwgMCwgb24gZmFpbHVyZQogICovCi1JTlQgRkRLX0RSQ19HZW5lcmF0b3JfQ2FsYygKLSAgICAgICAgSERSQ19DT01QICAgICAgICAgICAgICAgICAgICAgICBkcmNDb21wLAotICAgICAgICBjb25zdCBJTlRfUENNICogY29uc3QgICAgICAgICAgIGluU2FtcGxlcywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICBkaWFsbm9ybSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICBkcmNfVGFyZ2V0UmVmTGV2ZWwsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgY29tcF9UYXJnZXRSZWZMZXZlbCwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAgICAgICBjbGV2LAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICAgICAgIHNsZXYsCi0gICAgICAgIElOVCAqIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgZHlucm5nLAotICAgICAgICBJTlQgKiBjb25zdCAgICAgICAgICAgICAgICAgICAgIGNvbXByCi0gICAgICAgICk7Ci0KK0lOVCBGREtfRFJDX0dlbmVyYXRvcl9DYWxjKEhEUkNfQ09NUCBkcmNDb21wLCBjb25zdCBJTlRfUENNICpjb25zdCBpblNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGluU2FtcGxlc0J1ZlNpemUsIGNvbnN0IElOVCBkaWFsbm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBkcmNfVGFyZ2V0UmVmTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgY29tcF9UYXJnZXRSZWZMZXZlbCwgY29uc3QgRklYUF9EQkwgY2xldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIHNsZXYsIGNvbnN0IEZJWFBfREJMIGV4dF9sZXZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgZXh0X2xldmIsIGNvbnN0IEZJWFBfREJMIGxmZV9sZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZG14R2FpbjUsIGNvbnN0IElOVCBkbXhHYWluMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqY29uc3QgZHlucm5nLCBJTlQgKmNvbnN0IGNvbXByKTsKIAogLyoqCiAgKiBcYnJpZWYgIENvbmZpZ3VyZSBEUkMgQ29tcHJlc3NvciBQcm9maWxlLgpAQCAtMjE3LDEyICsyMzAsOSBAQAogICogICAgICAgICAgLSAwLCBvbiBzdWNjZXNzLAogICogICAgICAgICAgLSB1bmVxdWFsIDAsIG9uIGZhaWx1cmUKICAqLwotSU5UIEZES19EUkNfR2VuZXJhdG9yX3NldERyY1Byb2ZpbGUoCi0gICAgICAgIEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAgZHJjQ29tcCwKLSAgICAgICAgY29uc3QgRFJDX1BST0ZJTEUgICAgICAgICAgICAgICBwcm9maWxlTGluZSwKLSAgICAgICAgY29uc3QgRFJDX1BST0ZJTEUgICAgICAgICAgICAgICBwcm9maWxlUkYKLSAgICAgICAgKTsKLQorSU5UIEZES19EUkNfR2VuZXJhdG9yX3NldERyY1Byb2ZpbGUoSERSQ19DT01QIGRyY0NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEUkNfUFJPRklMRSBwcm9maWxlTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERSQ19QUk9GSUxFIHByb2ZpbGVSRik7CiAKIC8qKgogICogXGJyaWVmICBHZXQgRFJDIHByb2ZpbGUgZm9yIGxpbmUgbW9kZS4KQEAgLTIzMSwxMCArMjQxLDcgQEAKICAqCiAgKiBccmV0dXJuICBDdXJyZW50IFByb2ZpbGUuCiAgKi8KLURSQ19QUk9GSUxFIEZES19EUkNfR2VuZXJhdG9yX2dldERyY1Byb2ZpbGUoCi0gICAgICAgIGNvbnN0IEhEUkNfQ09NUCAgICAgICAgICAgICAgICAgZHJjQ29tcAotICAgICAgICApOwotCitEUkNfUFJPRklMRSBGREtfRFJDX0dlbmVyYXRvcl9nZXREcmNQcm9maWxlKGNvbnN0IEhEUkNfQ09NUCBkcmNDb21wKTsKIAogLyoqCiAgKiBcYnJpZWYgIEdldCBEUkMgcHJvZmlsZSBmb3IgUkYgbW9kZS4KQEAgLTI0MywxMCArMjUwLDYgQEAKICAqCiAgKiBccmV0dXJuICBDdXJyZW50IFByb2ZpbGUuCiAgKi8KLURSQ19QUk9GSUxFIEZES19EUkNfR2VuZXJhdG9yX2dldENvbXBQcm9maWxlKAotICAgICAgICBjb25zdCBIRFJDX0NPTVAgICAgICAgICAgICAgICAgIGRyY0NvbXAKLSAgICAgICAgKTsKK0RSQ19QUk9GSUxFIEZES19EUkNfR2VuZXJhdG9yX2dldENvbXBQcm9maWxlKGNvbnN0IEhEUkNfQ09NUCBkcmNDb21wKTsKIAotCi0jZW5kaWYgLyogX01FVEFEQVRBX0NPTVBSRVNTT1JfSCAqLwotCisjZW5kaWYgLyogTUVUQURBVEFfQ09NUFJFU1NPUl9IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL21ldGFkYXRhX21haW4uY3BwIGIvbGliQUFDZW5jL3NyYy9tZXRhZGF0YV9tYWluLmNwcAppbmRleCA5MGY4ZjRlLi5lZGQzODMxIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL21ldGFkYXRhX21haW4uY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvbWV0YWRhdGFfbWFpbi5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTUgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBBQUMgRW5jb2RlciBsaWIgICoqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgQXV0aG9yKHMpOiBWLiBCYWNpZ2FsdXBvCisgICBBdXRob3Iocyk6ICAgVi4gQmFjaWdhbHVwbworCiAgICBEZXNjcmlwdGlvbjogTWV0YWRhdGEgRW5jb2RlciBsaWJyYXJ5IGludGVyZmFjZSBmdW5jdGlvbnMKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAibWV0YWRhdGFfbWFpbi5oIgogI2luY2x1ZGUgIm1ldGFkYXRhX2NvbXByZXNzb3IuaCIKQEAgLTk2LDU1MSArMTA3LDY5NyBAQAogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0gZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgTUFYX0RSQ19CQU5EUyAgICAgICAgKDE8PDQpCi0jZGVmaW5lIE1BWF9EUkNfQ0hBTk5FTFMgICAgICAgICg4KQotI2RlZmluZSBNQVhfRFJDX0ZSQU1FTEVOICAgKDIqMTAyNCkKKyNkZWZpbmUgTUFYX0RSQ19CQU5EUyAoMSA8PCA0KQorI2RlZmluZSBNQVhfRFJDX0ZSQU1FTEVOICgyICogMTAyNCkKKyNkZWZpbmUgTUFYX0RFTEFZX0ZSQU1FUyAoMykKIAogLyotLS0tLS0tLS0tLS0tLS0gc3RydWN0dXJlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdHlwZWRlZiBzdHJ1Y3QgQUFDX01FVEFEQVRBCi17Cit0eXBlZGVmIHN0cnVjdCBBQUNfTUVUQURBVEEgewogICAvKiBNUEVHOiBEeW5hbWljIFJhbmdlIENvbnRyb2wgKi8KICAgc3RydWN0IHsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9nX3JlZl9sZXZlbF9wcmVzZW50OwotICAgIFNDSEFSICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dfcmVmX2xldmVsOworICAgIFVDSEFSIHByb2dfcmVmX2xldmVsX3ByZXNlbnQ7CisgICAgU0NIQVIgcHJvZ19yZWZfbGV2ZWw7CiAKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICBkeW5fcm5nX3NnbltNQVhfRFJDX0JBTkRTXTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICBkeW5fcm5nX2N0bFtNQVhfRFJDX0JBTkRTXTsKKyAgICBVQ0hBUiBkeW5fcm5nX3NnbltNQVhfRFJDX0JBTkRTXTsKKyAgICBVQ0hBUiBkeW5fcm5nX2N0bFtNQVhfRFJDX0JBTkRTXTsKIAotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgIGRyY19iYW5kc19wcmVzZW50OwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgIGRyY19iYW5kX2luY3I7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgZHJjX2JhbmRfdG9wW01BWF9EUkNfQkFORFNdOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgIGRyY19pbnRlcnBvbGF0aW9uX3NjaGVtZTsKLSAgICBBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEUgICBkcmNfcHJvZmlsZTsKLSAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmNfVGFyZ2V0UmVmTGV2ZWw7ICAgIC8qIHVzZWQgZm9yIExpbWl0ZXIgKi8KKyAgICBVQ0hBUiBkcmNfYmFuZHNfcHJlc2VudDsKKyAgICBVQ0hBUiBkcmNfYmFuZF9pbmNyOworICAgIFVDSEFSIGRyY19iYW5kX3RvcFtNQVhfRFJDX0JBTkRTXTsKKyAgICBVQ0hBUiBkcmNfaW50ZXJwb2xhdGlvbl9zY2hlbWU7CisgICAgQUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFIGRyY19wcm9maWxlOworICAgIElOVCBkcmNfVGFyZ2V0UmVmTGV2ZWw7IC8qIHVzZWQgZm9yIExpbWl0ZXIgKi8KIAogICAgIC8qIGV4Y2x1ZGVkIGNoYW5uZWxzICovCi0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWRfY2huc19wcmVzZW50OwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVfbWFza1syXTsgICAgICAgLyogTUFYX05VTUJFUl9DSEFOTkVMUy84ICovCisgICAgVUNIQVIgZXhjbHVkZWRfY2huc19wcmVzZW50OworICAgIFVDSEFSIGV4Y2x1ZGVfbWFza1syXTsgLyogTUFYX05VTUJFUl9DSEFOTkVMUy84ICovCiAgIH0gbXBlZ0RyYzsKIAogICAvKiBFVFNJOiBhZGR0bCBhbmNpbGxhcnkgZGF0YSAqLwogICBzdHJ1Y3QgewogICAgIC8qIEhlYXZ5IENvbXByZXNzaW9uICovCi0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25fb247ICAgICAgICAvKiBmbGFnLCBpZiBjb21wcmVzc2lvbiB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbiAqLwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uX3ZhbHVlOyAgICAgLyogY29tcHJlc3Npb24gdmFsdWUgKi8KLSAgICBBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEUgICBjb21wX3Byb2ZpbGU7Ci0gICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcF9UYXJnZXRSZWZMZXZlbDsgICAvKiB1c2VkIGZvciBMaW1pdGVyICovCi0gICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZWNvZGVfY29hcnNlX3N0YXR1czsKLSAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lY29kZV9maW5lX3N0YXR1czsKKyAgICBVQ0hBUiBjb21wcmVzc2lvbl9vbjsgICAgLyogZmxhZywgaWYgY29tcHJlc3Npb24gdmFsdWUgc2hvdWxkIGJlIHdyaXR0ZW4gKi8KKyAgICBVQ0hBUiBjb21wcmVzc2lvbl92YWx1ZTsgLyogY29tcHJlc3Npb24gdmFsdWUgKi8KKyAgICBBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEUgY29tcF9wcm9maWxlOworICAgIElOVCBjb21wX1RhcmdldFJlZkxldmVsOyAvKiB1c2VkIGZvciBMaW1pdGVyICovCisgICAgSU5UIHRpbWVjb2RlX2NvYXJzZV9zdGF0dXM7CisgICAgSU5UIHRpbWVjb2RlX2ZpbmVfc3RhdHVzOworCisgICAgVUNIQVIgZXh0QW5jRGF0YVN0YXR1czsKKworICAgIHN0cnVjdCB7CisgICAgICBVQ0hBUiBleHRfZG93bm1peF9sdmxfc3RhdHVzOworICAgICAgVUNIQVIgZXh0X2Rvd25taXhfZ2Fpbl9zdGF0dXM7CisgICAgICBVQ0hBUiBleHRfbGZlX2Rvd25taXhfc3RhdHVzOworICAgICAgVUNIQVIKKyAgICAgIGV4dF9kbWl4X2FfaWR4OyAvKiBleHRlbmRlZCBkb3dubWl4IGxldmVsICgwLi43LCBhY2NvcmRpbmcgdG8gdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBVQ0hBUgorICAgICAgZXh0X2RtaXhfYl9pZHg7IC8qIGV4dGVuZGVkIGRvd25taXggbGV2ZWwgKDAuLjcsIGFjY29yZGluZyB0byB0YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIFVDSEFSIGRteF9nYWluXzVfc2duOworICAgICAgVUNIQVIgZG14X2dhaW5fNV9pZHg7CisgICAgICBVQ0hBUiBkbXhfZ2Fpbl8yX3NnbjsKKyAgICAgIFVDSEFSIGRteF9nYWluXzJfaWR4OworICAgICAgVUNIQVIgZXh0X2RtaXhfbGZlX2lkeDsgLyogZXh0ZW5kZWQgZG93bm1peCBsZXZlbCBmb3IgbGZlICgwLi4xNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY29yZGluZyB0byB0YWJsZSkgKi8KKworICAgIH0gZXh0QW5jRGF0YTsKKwogICB9IGV0c2lBbmNEYXRhOwogCi0gIFNDSEFSICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlck1peExldmVsOyAgICAgICAgICAvKiBjZW50ZXIgZG93bm1peCBsZXZlbCAoMC4uLjcsIGFjY29yZGluZyB0byB0YWJsZSkgKi8KLSAgU0NIQVIgICAgICAgICAgICAgICAgICAgICAgICAgc3Vycm91bmRNaXhMZXZlbDsgICAgICAgIC8qIHN1cnJvdW5kIGRvd25taXggbGV2ZWwgKDAuLi43LCBhY2NvcmRpbmcgdG8gdGFibGUpICovCi0gIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlUENFTWl4RHduSWR4OyAgICAgICAvKiBmbGFnICovCi0gIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgIERteEx2bF9PbjsgICAgICAgICAgICAgICAvKiBmbGFnICovCisgIFNDSEFSIGNlbnRlck1peExldmVsOyAvKiBjZW50ZXIgZG93bm1peCBsZXZlbCAoMC4uLjcsIGFjY29yZGluZyB0byB0YWJsZSkgKi8KKyAgU0NIQVIKKyAgc3Vycm91bmRNaXhMZXZlbDsgLyogc3Vycm91bmQgZG93bm1peCBsZXZlbCAoMC4uLjcsIGFjY29yZGluZyB0byB0YWJsZSkgKi8KKyAgVUNIQVIgV3JpdGVQQ0VNaXhEd25JZHg7IC8qIGZsYWcgKi8KKyAgVUNIQVIgRG14THZsX09uOyAgICAgICAgIC8qIGZsYWcgKi8KIAotICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICBkb2xieVN1cnJvdW5kTW9kZTsKKyAgVUNIQVIgZG9sYnlTdXJyb3VuZE1vZGU7CisgIFVDSEFSIGRyY1ByZXNlbnRhdGlvbk1vZGU7CiAKLSAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFNb2RlOyAgICAgICAgICAgIC8qIGluZGljYXRlIG1ldGEgZGF0YSBtb2RlIGluIGN1cnJlbnQgZnJhbWUgKGRlbGF5IGxpbmUpICovCisgIFVDSEFSCisgIG1ldGFkYXRhTW9kZTsgLyogaW5kaWNhdGUgbWV0YSBkYXRhIG1vZGUgaW4gY3VycmVudCBmcmFtZSAoZGVsYXkgbGluZSkgKi8KIAogfSBBQUNfTUVUQURBVEE7CiAKLXN0cnVjdCBGREtfTUVUQURBVEFfRU5DT0RFUgotewotICBJTlQgICAgICAgICAgICAgICAgbWV0YWRhdGFNb2RlOwotICBIRFJDX0NPTVAgICAgICAgICAgaERyY0NvbXA7Ci0gIEFBQ0VOQ19NZXRhRGF0YSAgICBzdWJtaXR0ZWRNZXRhRGF0YTsKK3R5cGVkZWYgc3RydWN0IEZES19NRVRBREFUQV9FTkNPREVSIHsKKyAgSU5UIG1ldGFkYXRhTW9kZTsKKyAgSERSQ19DT01QIGhEcmNDb21wOworICBBQUNFTkNfTWV0YURhdGEgc3VibWl0dGVkTWV0YURhdGE7CiAKLSAgSU5UICAgICAgICAgICAgICAgIG5BdWRpb0RhdGFEZWxheTsKLSAgSU5UICAgICAgICAgICAgICAgIG5NZXRhRGF0YURlbGF5OwotICBJTlQgICAgICAgICAgICAgICAgbkNoYW5uZWxzOworICBJTlQgbkF1ZGlvRGF0YURlbGF5OyAvKiBBZGRpdGlvbmFsIGRlbGF5IHRvIHJvdW5kIHVwIHRvIG5leHQgZnJhbWUgYm9yZGVyIChpbgorICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzKSAqLworICBJTlQgbk1ldGFEYXRhRGVsYXk7ICAvKiBNZXRhIGRhdGEgZGVsYXkgKGluIGZyYW1lcykgKi8KKyAgSU5UIG5DaGFubmVsczsKKyAgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlOwogCi0gIElOVF9QQ00gICAgICAgICAgICBhdWRpb0RlbGF5QnVmZmVyW01BWF9EUkNfQ0hBTk5FTFMqTUFYX0RSQ19GUkFNRUxFTl07Ci0gIGludCAgICAgICAgICAgICAgICBhdWRpb0RlbGF5SWR4OworICBJTlRfUENNKiBwQXVkaW9EZWxheUJ1ZmZlcjsKIAotICBBQUNfTUVUQURBVEEgICAgICAgbWV0YURhdGFCdWZmZXJbM107Ci0gIGludCAgICAgICAgICAgICAgICBtZXRhRGF0YURlbGF5SWR4OworICBBQUNfTUVUQURBVEEgbWV0YURhdGFCdWZmZXJbTUFYX0RFTEFZX0ZSQU1FU107CisgIElOVCBtZXRhRGF0YURlbGF5SWR4OwogCi0gIFVDSEFSICAgICAgICAgICAgICBkcmNJbmZvUGF5bG9hZFsxMl07Ci0gIFVDSEFSICAgICAgICAgICAgICBkcmNEc2VQYXlsb2FkWzhdOworICBVQ0hBUiBkcmNJbmZvUGF5bG9hZFsxMl07CisgIFVDSEFSIGRyY0RzZVBheWxvYWRbOF07CiAKLSAgSU5UICAgICAgICAgICAgICAgIG1hdHJpeF9taXhkb3duX2lkeDsKKyAgSU5UIG1hdHJpeF9taXhkb3duX2lkeDsKKwogICBBQUNFTkNfRVhUX1BBWUxPQUQgZXhQYXlsb2FkWzJdOwotICBJTlQgICAgICAgICAgICAgICAgbkV4dGVuc2lvbnM7CisgIElOVCBuRXh0ZW5zaW9uczsKIAotICBJTlQgICAgICAgICAgICAgICAgZmluYWxpemVNZXRhRGF0YTsgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgc3dpdGNoIG9mZiBieSBvbmUgZnJhbWUgYW5kIHdyaXRlIGRlZmF1bHQgY29uZmlndXJhdGlvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxpemUgdGhlIG1ldGFkYXRhIHNldHVwLiAqLwotfTsKKyAgVUlOVCBtYXhDaGFubmVsczsgLyogTWF4aW11bSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdG8gYmUgc3VwcG9ydGVkLiAqLwogCisgIElOVCBmaW5hbGl6ZU1ldGFEYXRhOyAgIC8qIERlbGF5IHN3aXRjaCBvZmYgYnkgb25lIGZyYW1lIGFuZCB3cml0ZSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gdG8gICBmaW5hbGl6ZSB0aGUgbWV0YWRhdGEgc2V0dXAuICovCisgIElOVCBpbml0aWFsaXplTWV0YURhdGE7IC8qIEZpbGwgdXAgZGVsYXkgbGluZSB3aXRoIGZpcnN0IG1ldGEgZGF0YSBpbmZvLiBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHJlcXVpcmVkIHRvIGhhdmUgbWV0YSBkYXRhIGFscmVhZHkgaW4gZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuICovCit9IEZES19NRVRBREFUQV9FTkNPREVSOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0gY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyBjb25zdCBBQUNFTkNfTWV0YURhdGEgZGVmYXVsdE1ldGFEYXRhU2V0dXAgPSB7Ci0gICAgQUFDRU5DX01FVEFEQVRBX0RSQ19OT05FLAotICAgIEFBQ0VOQ19NRVRBREFUQV9EUkNfTk9ORSwKLSAgICAtKDMxPDwxNiksCi0gICAgLSgzMTw8MTYpLAotICAgIDAsCi0gICAgLSgzMTw8MTYpLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMAorICAgIEFBQ0VOQ19NRVRBREFUQV9EUkNfTk9ORSwgICAgICAgIC8qIGRyY19wcm9maWxlICovCisgICAgQUFDRU5DX01FVEFEQVRBX0RSQ19OT1RfUFJFU0VOVCwgLyogY29tcF9wcm9maWxlICovCisgICAgLSgzMSA8PCAxNiksICAgICAgICAgICAgICAgICAgICAgLyogZHJjX1RhcmdldFJlZkxldmVsICovCisgICAgLSgyMyA8PCAxNiksICAgICAgICAgICAgICAgICAgICAgLyogY29tcF9UYXJnZXRSZWZMZXZlbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2dfcmVmX2xldmVsX3ByZXNlbnQgKi8KKyAgICAtKDIzIDw8IDE2KSwgICAgICAgICAgICAgICAgICAgICAvKiBwcm9nX3JlZl9sZXZlbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBDRV9taXhkb3duX2lkeF9wcmVzZW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVRTSV9EbXhMdmxfcHJlc2VudCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNlbnRlck1peExldmVsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3Vycm91bmRNaXhMZXZlbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvbGJ5U3Vycm91bmRNb2RlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHJjUHJlc2VudGF0aW9uTW9kZSAqLworICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSAgICAgIC8qIEV4dE1ldGFEYXRhICovCiB9OwogCiBzdGF0aWMgY29uc3QgRklYUF9EQkwgZG14VGFibGVbOF0gPSB7Ci0gICAgKChGSVhQX0RCTClNQVhWQUxfREJMKSwgRkwyRlhDT05TVF9EQkwoMC44NDFmKSwgRkwyRlhDT05TVF9EQkwoMC43MDdmKSwgRkwyRlhDT05TVF9EQkwoMC41OTZmKSwKLSAgICBGTDJGWENPTlNUX0RCTCgwLjUwMGYpLCBGTDJGWENPTlNUX0RCTCgwLjQyMmYpLCBGTDJGWENPTlNUX0RCTCgwLjM1NWYpLCBGTDJGWENPTlNUX0RCTCgwLjAwMGYpCi19OworICAgICgoRklYUF9EQkwpTUFYVkFMX0RCTCksIEZMMkZYQ09OU1RfREJMKDAuODQxZiksIEZMMkZYQ09OU1RfREJMKDAuNzA3ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC41OTZmKSwgRkwyRlhDT05TVF9EQkwoMC41MDBmKSwgRkwyRlhDT05TVF9EQkwoMC40MjJmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjM1NWYpLCBGTDJGWENPTlNUX0RCTCgwLjAwMGYpfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIHN1cm1peDJtYXRyaXhfbWl4ZG93bl9pZHhbOF0gPSB7Ci0gICAgMCwgMCwgMCwgMSwgMSwgMiwgMiwgMwotfTsKKyNkZWZpbmUgRkwyRE1YTEZFKGEpIEZMMkZYQ09OU1RfREJMKChhKSAvICgxIDw8IExGRV9MRVZfU0NBTEUpKQorc3RhdGljIGNvbnN0IEZJWFBfREJMIGRteExmZVRhYmxlWzE2XSA9IHsKKyAgICBGTDJETVhMRkUoMy4xNjJmKSwgRkwyRE1YTEZFKDIuMDAwZiksIEZMMkRNWExGRSgxLjY3OWYpLCBGTDJETVhMRkUoMS40MTNmKSwKKyAgICBGTDJETVhMRkUoMS4xODlmKSwgRkwyRE1YTEZFKDEuMDAwZiksIEZMMkRNWExGRSgwLjg0MWYpLCBGTDJETVhMRkUoMC43MDdmKSwKKyAgICBGTDJETVhMRkUoMC41OTZmKSwgRkwyRE1YTEZFKDAuNTAwZiksIEZMMkRNWExGRSgwLjMxNmYpLCBGTDJETVhMRkUoMC4xNzhmKSwKKyAgICBGTDJETVhMRkUoMC4xMDBmKSwgRkwyRE1YTEZFKDAuMDMyZiksIEZMMkRNWExGRSgwLjAxMGYpLCBGTDJETVhMRkUoMC4wMDBmKX07CiAKK3N0YXRpYyBjb25zdCBVQ0hBUiBzdXJtaXgybWF0cml4X21peGRvd25faWR4WzhdID0gezAsIDAsIDAsIDEsIDEsIDIsIDIsIDN9OwogCiAvKi0tLS0tLS0tLS0tLS0tLSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIEZES19NRVRBREFUQV9FUlJPUiBXcml0ZU1ldGFkYXRhUGF5bG9hZCgKLSAgICAgICAgY29uc3QgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhRGF0YSwKLSAgICAgICAgY29uc3QgQUFDX01FVEFEQVRBICogY29uc3QgIHBNZXRhZGF0YQotICAgICAgICApOworICAgIGNvbnN0IEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiBoTWV0YURhdGEsCisgICAgY29uc3QgQUFDX01FVEFEQVRBKiBjb25zdCBwTWV0YWRhdGEpOwogCi1zdGF0aWMgSU5UIFdyaXRlRHluYW1pY1JhbmdlSW5mb1BheWxvYWQoCi0gICAgICAgIGNvbnN0IEFBQ19NRVRBREFUQSogY29uc3QgcE1ldGFkYXRhLAotICAgICAgICBVQ0hBUiogY29uc3QgICAgICAgICAgICAgIHBFeHRlbnNpb25QYXlsb2FkCi0gICAgICAgICk7CitzdGF0aWMgSU5UIFdyaXRlRHluYW1pY1JhbmdlSW5mb1BheWxvYWQoY29uc3QgQUFDX01FVEFEQVRBKiBjb25zdCBwTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIqIGNvbnN0IHBFeHRlbnNpb25QYXlsb2FkKTsKIAotc3RhdGljIElOVCBXcml0ZUV0c2lBbmNpbGxhcnlEYXRhUGF5bG9hZCgKLSAgICAgICAgY29uc3QgQUFDX01FVEFEQVRBKiBjb25zdCBwTWV0YWRhdGEsCi0gICAgICAgIFVDSEFSKiBjb25zdCAgICAgICAgICAgICAgcEV4dGVuc2lvblBheWxvYWQKLSAgICAgICAgKTsKK3N0YXRpYyBJTlQgV3JpdGVFdHNpQW5jaWxsYXJ5RGF0YVBheWxvYWQoY29uc3QgQUFDX01FVEFEQVRBKiBjb25zdCBwTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSKiBjb25zdCBwRXh0ZW5zaW9uUGF5bG9hZCk7CiAKIHN0YXRpYyBGREtfTUVUQURBVEFfRVJST1IgQ29tcGVuc2F0ZUF1ZGlvRGVsYXkoCi0gICAgICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiBoTWV0YURhdGFFbmMsCi0gICAgICAgIElOVF9QQ00gKiBjb25zdCAgICAgICAgICAgICBwQXVkaW9TYW1wbGVzLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgbkF1ZGlvU2FtcGxlcwotICAgICAgICApOworICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiBoTWV0YURhdGFFbmMsIElOVF9QQ00qIGNvbnN0IHBBdWRpb1NhbXBsZXMsCisgICAgY29uc3QgVUlOVCBhdWRpb1NhbXBsZXNCdWZTaXplLCBjb25zdCBJTlQgbkF1ZGlvU2FtcGxlcyk7CiAKIHN0YXRpYyBGREtfTUVUQURBVEFfRVJST1IgTG9hZFN1Ym1pdHRlZE1ldGFkYXRhKAotICAgICAgICBjb25zdCBBQUNFTkNfTWV0YURhdGEgKiAgIGNvbnN0IGhNZXRhZGF0YSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFNb2RlLAotICAgICAgICBBQUNfTUVUQURBVEEgKiBjb25zdCAgICAgICAgICAgIHBBYWNNZXRhRGF0YQotICAgICAgICApOworICAgIGNvbnN0IEFBQ0VOQ19NZXRhRGF0YSogY29uc3QgaE1ldGFkYXRhLCBjb25zdCBJTlQgbkNoYW5uZWxzLAorICAgIGNvbnN0IElOVCBtZXRhZGF0YU1vZGUsIEFBQ19NRVRBREFUQSogY29uc3QgcEFhY01ldGFEYXRhKTsKIAotc3RhdGljIEZES19NRVRBREFUQV9FUlJPUiBQcm9jZXNzQ29tcHJlc3NvcigKLSAgICAgICAgQUFDX01FVEFEQVRBICAgICAgICAgICAgICAgICAgICAqcE1ldGFkYXRhLAotICAgICAgICBIRFJDX0NPTVAgICAgICAgICAgICAgICAgICAgICAgICBoRHJjQ29tcCwKLSAgICAgICAgY29uc3QgSU5UX1BDTSAqIGNvbnN0ICAgICAgICAgICAgcFNhbXBsZXMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgIG5TYW1wbGVzCi0gICAgICAgICk7CitzdGF0aWMgRkRLX01FVEFEQVRBX0VSUk9SIFByb2Nlc3NDb21wcmVzc29yKEFBQ19NRVRBREFUQSogcE1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRFJDX0NPTVAgaERyY0NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVF9QQ00qIGNvbnN0IHBTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIHNhbXBsZXNCdWZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgblNhbXBsZXMpOwogCiAvKi0tLS0tLS0tLS0tLS0gZnVuY3Rpb24gZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyBEUkNfUFJPRklMRSBjb252ZXJ0UHJvZmlsZShBQUNFTkNfTUVUQURBVEFfRFJDX1BST0ZJTEUgYWFjUHJvZmlsZSkKLXsKLSAgICBEUkNfUFJPRklMRSBkcmNQcm9maWxlID0gRFJDX05PTkU7CitzdGF0aWMgRFJDX1BST0ZJTEUgY29udmVydFByb2ZpbGUoQUFDRU5DX01FVEFEQVRBX0RSQ19QUk9GSUxFIGFhY1Byb2ZpbGUpIHsKKyAgRFJDX1BST0ZJTEUgZHJjUHJvZmlsZSA9IERSQ19OT05FOwogCi0gICAgc3dpdGNoKGFhY1Byb2ZpbGUpIHsKLSAgICAgIGNhc2UgQUFDRU5DX01FVEFEQVRBX0RSQ19OT05FOiAgICAgICAgICBkcmNQcm9maWxlID0gRFJDX05PTkU7ICAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBBQUNFTkNfTUVUQURBVEFfRFJDX0ZJTE1TVEFOREFSRDogIGRyY1Byb2ZpbGUgPSBEUkNfRklMTVNUQU5EQVJEOyAgYnJlYWs7Ci0gICAgICBjYXNlIEFBQ0VOQ19NRVRBREFUQV9EUkNfRklMTUxJR0hUOiAgICAgZHJjUHJvZmlsZSA9IERSQ19GSUxNTElHSFQ7ICAgICBicmVhazsKLSAgICAgIGNhc2UgQUFDRU5DX01FVEFEQVRBX0RSQ19NVVNJQ1NUQU5EQVJEOiBkcmNQcm9maWxlID0gRFJDX01VU0lDU1RBTkRBUkQ7IGJyZWFrOwotICAgICAgY2FzZSBBQUNFTkNfTUVUQURBVEFfRFJDX01VU0lDTElHSFQ6ICAgIGRyY1Byb2ZpbGUgPSBEUkNfTVVTSUNMSUdIVDsgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFBQ0VOQ19NRVRBREFUQV9EUkNfU1BFRUNIOiAgICAgICAgZHJjUHJvZmlsZSA9IERSQ19TUEVFQ0g7ICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmNQcm9maWxlID0gRFJDX05PTkU7ICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gZHJjUHJvZmlsZTsKKyAgc3dpdGNoIChhYWNQcm9maWxlKSB7CisgICAgY2FzZSBBQUNFTkNfTUVUQURBVEFfRFJDX05PTkU6CisgICAgICBkcmNQcm9maWxlID0gRFJDX05PTkU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19NRVRBREFUQV9EUkNfRklMTVNUQU5EQVJEOgorICAgICAgZHJjUHJvZmlsZSA9IERSQ19GSUxNU1RBTkRBUkQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19NRVRBREFUQV9EUkNfRklMTUxJR0hUOgorICAgICAgZHJjUHJvZmlsZSA9IERSQ19GSUxNTElHSFQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFBQ0VOQ19NRVRBREFUQV9EUkNfTVVTSUNTVEFOREFSRDoKKyAgICAgIGRyY1Byb2ZpbGUgPSBEUkNfTVVTSUNTVEFOREFSRDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUFDRU5DX01FVEFEQVRBX0RSQ19NVVNJQ0xJR0hUOgorICAgICAgZHJjUHJvZmlsZSA9IERSQ19NVVNJQ0xJR0hUOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfTUVUQURBVEFfRFJDX1NQRUVDSDoKKyAgICAgIGRyY1Byb2ZpbGUgPSBEUkNfU1BFRUNIOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBQUNFTkNfTUVUQURBVEFfRFJDX05PVF9QUkVTRU5UOgorICAgICAgZHJjUHJvZmlsZSA9IERSQ19OT1RfUFJFU0VOVDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBkcmNQcm9maWxlID0gRFJDX05PTkU7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gZHJjUHJvZmlsZTsKIH0KIAotCiAvKiBjb252ZXJ0IGRpYWxvZyBub3JtYWxpemF0aW9uIHRvIHByb2dyYW0gcmVmZXJlbmNlIGxldmVsICovCi0vKiBOT1RFOiB0aGlzIG9ubHkgaXMgY29ycmVjdCwgaWYgdGhlIGRlY29kZXIgdGFyZ2V0IGxldmVsIGlzIHNldCB0byAtMzFkQiBmb3IgbGluZSBtb2RlIC8gLTIwZEIgZm9yIFJGIG1vZGUgKi8KLXN0YXRpYyBVQ0hBUiBkaWFsbm9ybTJwcm9ncmVmbHZsKGNvbnN0IElOVCBkKQotewotICAgIHJldHVybiAoKFVDSEFSKUZES21heCgwLCBGREttaW4oKC1kICsgKDE8PDEzKSkgPj4gMTQsIDEyNykpKTsKKy8qIE5PVEU6IHRoaXMgb25seSBpcyBjb3JyZWN0LCBpZiB0aGUgZGVjb2RlciB0YXJnZXQgbGV2ZWwgaXMgc2V0IHRvIC0zMWRCIGZvcgorICogbGluZSBtb2RlIC8gLTIwZEIgZm9yIFJGIG1vZGUgKi8KK3N0YXRpYyBVQ0hBUiBkaWFsbm9ybTJwcm9ncmVmbHZsKGNvbnN0IElOVCBkKSB7CisgIHJldHVybiAoKFVDSEFSKWZNYXgoMCwgZk1pbigoLWQgKyAoMSA8PCAxMykpID4+IDE0LCAxMjcpKSk7CiB9CiAKIC8qIGNvbnZlcnQgcHJvZ3JhbSByZWZlcmVuY2UgbGV2ZWwgdG8gZGlhbG9nIG5vcm1hbGl6YXRpb24gKi8KLXN0YXRpYyBJTlQgcHJvZ3JlZmx2bDJkaWFsbm9ybShjb25zdCBVQ0hBUiBwKQotewotICAgIHJldHVybiAtKChJTlQpKHA8PCgxNi0yKSkpOworc3RhdGljIElOVCBwcm9ncmVmbHZsMmRpYWxub3JtKGNvbnN0IFVDSEFSIHApIHsKKyAgcmV0dXJuIC0oKElOVCkocCA8PCAoMTYgLSAyKSkpOwogfQogCiAvKiBlbmNvZGUgZG93bm1peCBsZXZlbHMgdG8gRG93bm1peGluZ19sZXZlbHNfTVBFRzQgKi8KLXN0YXRpYyBTQ0hBUiBlbmNvZGVEbXhMdmxzKGNvbnN0IFNDSEFSIGNtaXhsZXYsIGNvbnN0IFNDSEFSIHN1cm1peGxldikKLXsKLSAgICBTQ0hBUiBkbXhMdmxzID0gMDsKLSAgICBkbXhMdmxzIHw9IDB4ODAgfCAoY21peGxldiA8PCA0KTsgLyogY2VudGVyX21peF9sZXZlbF9vbiAqLwotICAgIGRteEx2bHMgfD0gMHgwOCB8IHN1cm1peGxldjsgICAgICAvKiBzdXJyb3VuZF9taXhfbGV2ZWxfb24gKi8KK3N0YXRpYyBTQ0hBUiBlbmNvZGVEbXhMdmxzKGNvbnN0IFNDSEFSIGNtaXhsZXYsIGNvbnN0IFNDSEFSIHN1cm1peGxldikgeworICBTQ0hBUiBkbXhMdmxzID0gMDsKKyAgZG14THZscyB8PSAweDgwIHwgKGNtaXhsZXYgPDwgNCk7IC8qIGNlbnRlcl9taXhfbGV2ZWxfb24gKi8KKyAgZG14THZscyB8PSAweDA4IHwgc3VybWl4bGV2OyAgICAgIC8qIHN1cnJvdW5kX21peF9sZXZlbF9vbiAqLwogCi0gICAgcmV0dXJuIGRteEx2bHM7CisgIHJldHVybiBkbXhMdmxzOwogfQogCiAvKiBlbmNvZGUgQUFDIERSQyBnYWluIChJU08vSUVDIDE0NDk2LTM6MjAwNSAgNC41LjIuNykgKi8KLXN0YXRpYyB2b2lkIGVuY29kZUR5bnJuZyhJTlQgZ2FpbiwgVUNIQVIqIGNvbnN0IGR5bl9ybmdfY3RsLCBVQ0hBUiogY29uc3QgZHluX3JuZ19zZ24gKQotewotICAgIGlmKGdhaW4gPCAwKQotICAgIHsKLSAgICAgICpkeW5fcm5nX3NnbiA9IDE7Ci0gICAgICBnYWluID0gLWdhaW47Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAqZHluX3JuZ19zZ24gPSAwOwotICAgIH0KLSAgICBnYWluID0gRkRLbWluKGdhaW4sKDEyNzw8MTQpKTsKK3N0YXRpYyB2b2lkIGVuY29kZUR5bnJuZyhJTlQgZ2FpbiwgVUNIQVIqIGNvbnN0IGR5bl9ybmdfY3RsLAorICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSKiBjb25zdCBkeW5fcm5nX3NnbikgeworICBpZiAoZ2FpbiA8IDApIHsKKyAgICAqZHluX3JuZ19zZ24gPSAxOworICAgIGdhaW4gPSAtZ2FpbjsKKyAgfSBlbHNlIHsKKyAgICAqZHluX3JuZ19zZ24gPSAwOworICB9CisgIGdhaW4gPSBmTWluKGdhaW4sICgxMjcgPDwgMTQpKTsKIAotICAgICpkeW5fcm5nX2N0bCA9IChVQ0hBUikoKGdhaW4gKyAoMTw8MTMpKSA+PiAxNCk7CisgICpkeW5fcm5nX2N0bCA9IChVQ0hBUikoKGdhaW4gKyAoMSA8PCAxMykpID4+IDE0KTsKIH0KIAogLyogZGVjb2RlIEFBQyBEUkMgZ2FpbiAoSVNPL0lFQyAxNDQ5Ni0zOjIwMDUgIDQuNS4yLjcpICovCi1zdGF0aWMgSU5UIGRlY29kZUR5bnJuZyhjb25zdCBVQ0hBUiBkeW5fcm5nX2N0bCwgY29uc3QgVUNIQVIgZHluX3JuZ19zZ24pCi17Ci0gICAgSU5UIHRtcCA9ICgoSU5UKWR5bl9ybmdfY3RsIDw8ICgxNi0yKSk7Ci0gICAgaWYgKGR5bl9ybmdfc2duKSB0bXAgPSAtdG1wOworc3RhdGljIElOVCBkZWNvZGVEeW5ybmcoY29uc3QgVUNIQVIgZHluX3JuZ19jdGwsIGNvbnN0IFVDSEFSIGR5bl9ybmdfc2duKSB7CisgIElOVCB0bXAgPSAoKElOVClkeW5fcm5nX2N0bCA8PCAoMTYgLSAyKSk7CisgIGlmIChkeW5fcm5nX3NnbikgdG1wID0gLXRtcDsKIAotICAgIHJldHVybiB0bXA7CisgIHJldHVybiB0bXA7CiB9CiAKIC8qIGVuY29kZSBBQUMgY29tcHJlc3Npb24gdmFsdWUgKEVUU0kgVFMgMTAxIDE1NCBwYWdlIDk5KSAqLwotc3RhdGljIFVDSEFSIGVuY29kZUNvbXByKElOVCBnYWluKQotewotICAgIFVDSEFSIHgsIHk7Ci0gICAgSU5UIHRtcDsKK3N0YXRpYyBVQ0hBUiBlbmNvZGVDb21wcihJTlQgZ2FpbikgeworICBVQ0hBUiB4LCB5OworICBJTlQgdG1wOwogCi0gICAgLyogdG1wID0gKGludCkoKDQ4LjE2NGYgLSBnYWluKSAvIDYuMDIwNmYgKiAxNSArIDAuNWYpOyAqLwotICAgIHRtcCA9ICgoMzE1NjQ3NiAtIGdhaW4pICogMTUgKyAxOTcyODMpIC8gMzk0NTY2OworICAvKiB0bXAgPSAoaW50KSgoNDguMTY0ZiAtIGdhaW4pIC8gNi4wMjA2ZiAqIDE1ICsgMC41Zik7ICovCisgIHRtcCA9ICgoMzE1NjQ3NiAtIGdhaW4pICogMTUgKyAxOTcyODMpIC8gMzk0NTY2OwogCi0gICAgaWYgKHRtcCA+PSAyNDApIHsKLSAgICAgICAgcmV0dXJuIDB4RkY7Ci0gICAgfQotICAgIGVsc2UgaWYgKHRtcCA8IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICB4ID0gdG1wIC8gMTU7Ci0gICAgICAgIHkgPSB0bXAgJSAxNTsKLSAgICB9CisgIGlmICh0bXAgPj0gMjQwKSB7CisgICAgcmV0dXJuIDB4RkY7CisgIH0gZWxzZSBpZiAodG1wIDwgMCkgeworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIHggPSB0bXAgLyAxNTsKKyAgICB5ID0gdG1wICUgMTU7CisgIH0KIAotICAgIHJldHVybiAoeCA8PCA0KSB8IHk7CisgIHJldHVybiAoeCA8PCA0KSB8IHk7CiB9CiAKIC8qIGRlY29kZSBBQUMgY29tcHJlc3Npb24gdmFsdWUgKEVUU0kgVFMgMTAxIDE1NCBwYWdlIDk5KSAqLwotc3RhdGljIElOVCBkZWNvZGVDb21wcihjb25zdCBVQ0hBUiBjb21wcikKLXsKLSAgICBJTlQgZ2FpbjsKLSAgICBTQ0hBUiB4ID0gY29tcHIgPj4gNDsgICAgIC8qIDQgTVNCIG9mIGNvbXByICovCi0gICAgVUNIQVIgeSA9IChjb21wciAmIDB4MEYpOyAvKiA0IExTQiBvZiBjb21wciAqLworc3RhdGljIElOVCBkZWNvZGVDb21wcihjb25zdCBVQ0hBUiBjb21wcikgeworICBJTlQgZ2FpbjsKKyAgU0NIQVIgeCA9IGNvbXByID4+IDQ7ICAgICAvKiA0IE1TQiBvZiBjb21wciAqLworICBVQ0hBUiB5ID0gKGNvbXByICYgMHgwRik7IC8qIDQgTFNCIG9mIGNvbXByICovCiAKLSAgICAvKiBnYWluID0gKElOVCkoKDQ4LjE2NGYgLSA2LjAyMDZmICogeCAtIDAuNDAxNGYgKiB5KSApOyAqLwotICAgIGdhaW4gPSAoSU5UKSggc2NhbGVWYWx1ZSgoKExPTkcpRkwyRlhDT05TVF9EQkwoNi4wMjA2Zi8xMjguZikqKDgteCkgLSAoTE9ORylGTDJGWENPTlNUX0RCTCgwLjQwMTRmLzEyOC5mKSp5KSwgLShERlJBQ1RfQklUUy0xLTctMTYpKSApOworICAvKiBnYWluID0gKElOVCkoKDQ4LjE2NGYgLSA2LjAyMDZmICogeCAtIDAuNDAxNGYgKiB5KSApOyAqLworICBnYWluID0gKElOVCkoCisgICAgICBzY2FsZVZhbHVlKChGSVhQX0RCTCkoKChMT05HKUZMMkZYQ09OU1RfREJMKDYuMDIwNmYgLyAxMjguZikgKiAoOCAtIHgpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExPTkcpRkwyRlhDT05TVF9EQkwoMC40MDE0ZiAvIDEyOC5mKSAqIHkpKSwKKyAgICAgICAgICAgICAgICAgLShERlJBQ1RfQklUUyAtIDEgLSA3IC0gMTYpKSk7CiAKLSAgICByZXR1cm4gZ2FpbjsKKyAgcmV0dXJuIGdhaW47CiB9CiAKK0ZES19NRVRBREFUQV9FUlJPUiBGREtfTWV0YWRhdGFFbmNfT3BlbihIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIqIHBoTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBtYXhDaGFubmVscykgeworICBGREtfTUVUQURBVEFfRVJST1IgZXJyID0gTUVUQURBVEFfT0s7CisgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiBoTWV0YURhdGEgPSBOVUxMOwogCi1GREtfTUVUQURBVEFfRVJST1IgRkRLX01ldGFkYXRhRW5jX09wZW4oCi0gICAgICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiAqcGhNZXRhRGF0YQotICAgICAgICApCi17Ci0gICAgRkRLX01FVEFEQVRBX0VSUk9SIGVyciA9IE1FVEFEQVRBX09LOwotICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiBoTWV0YURhdGEgPSBOVUxMOworICBpZiAocGhNZXRhRGF0YSA9PSBOVUxMKSB7CisgICAgZXJyID0gTUVUQURBVEFfSU5WQUxJRF9IQU5ETEU7CisgICAgZ290byBiYWlsOworICB9CiAKLSAgICBpZiAocGhNZXRhRGF0YSA9PSBOVUxMKSB7Ci0gICAgICBlcnIgPSBNRVRBREFUQV9JTlZBTElEX0hBTkRMRTsKLSAgICAgIGdvdG8gYmFpbDsKLSAgICB9CisgIC8qIGFsbG9jYXRlIG1lbW9yeSAqLworICBpZiAoTlVMTCA9PSAoaE1ldGFEYXRhID0gKEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUilGREtjYWxsb2MoCisgICAgICAgICAgICAgICAgICAgMSwgc2l6ZW9mKEZES19NRVRBREFUQV9FTkNPREVSKSkpKSB7CisgICAgZXJyID0gTUVUQURBVEFfTUVNT1JZX0VSUk9SOworICAgIGdvdG8gYmFpbDsKKyAgfQorICBGREttZW1jbGVhcihoTWV0YURhdGEsIHNpemVvZihGREtfTUVUQURBVEFfRU5DT0RFUikpOwogCi0gICAgLyogYWxsb2NhdGUgbWVtb3J5ICovCi0gICAgaE1ldGFEYXRhID0gKEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUikgRkRLY2FsbG9jKDEsIHNpemVvZihGREtfTUVUQURBVEFfRU5DT0RFUikgKTsKKyAgaWYgKE5VTEwgPT0gKGhNZXRhRGF0YS0+cEF1ZGlvRGVsYXlCdWZmZXIgPSAoSU5UX1BDTSopRkRLY2FsbG9jKAorICAgICAgICAgICAgICAgICAgIG1heENoYW5uZWxzICogTUFYX0RSQ19GUkFNRUxFTiwgc2l6ZW9mKElOVF9QQ00pKSkpIHsKKyAgICBlcnIgPSBNRVRBREFUQV9NRU1PUllfRVJST1I7CisgICAgZ290byBiYWlsOworICB9CisgIEZES21lbWNsZWFyKGhNZXRhRGF0YS0+cEF1ZGlvRGVsYXlCdWZmZXIsCisgICAgICAgICAgICAgIG1heENoYW5uZWxzICogTUFYX0RSQ19GUkFNRUxFTiAqIHNpemVvZihJTlRfUENNKSk7CisgIGhNZXRhRGF0YS0+bWF4Q2hhbm5lbHMgPSBtYXhDaGFubmVsczsKIAotICAgIGlmIChoTWV0YURhdGEgPT0gTlVMTCkgewotICAgICAgZXJyID0gTUVUQURBVEFfTUVNT1JZX0VSUk9SOwotICAgICAgZ290byBiYWlsOwotICAgIH0KKyAgLyogQWxsb2NhdGUgRFJDIENvbXByZXNzb3IuICovCisgIGlmIChGREtfRFJDX0dlbmVyYXRvcl9PcGVuKCZoTWV0YURhdGEtPmhEcmNDb21wKSAhPSAwKSB7CisgICAgZXJyID0gTUVUQURBVEFfTUVNT1JZX0VSUk9SOworICAgIGdvdG8gYmFpbDsKKyAgfQorICBoTWV0YURhdGEtPmNoYW5uZWxNb2RlID0gTU9ERV9VTktOT1dOOwogCi0gICAgRkRLbWVtY2xlYXIoaE1ldGFEYXRhLCBzaXplb2YoRkRLX01FVEFEQVRBX0VOQ09ERVIpKTsKKyAgLyogUmV0dXJuIG1ldGFkYXRhIGluc3RhbmNlICovCisgICpwaE1ldGFEYXRhID0gaE1ldGFEYXRhOwogCi0gICAgLyogQWxsb2NhdGUgRFJDIENvbXByZXNzb3IuICovCi0gICAgaWYgKEZES19EUkNfR2VuZXJhdG9yX09wZW4oJmhNZXRhRGF0YS0+aERyY0NvbXApIT0wKSB7Ci0gICAgICBlcnIgPSBNRVRBREFUQV9NRU1PUllfRVJST1I7Ci0gICAgICBnb3RvIGJhaWw7Ci0gICAgfQotCi0gICAgLyogUmV0dXJuIG1ldGFkYXRhIGluc3RhbmNlICovCi0gICAgKnBoTWV0YURhdGEgPSBoTWV0YURhdGE7Ci0KLSAgICByZXR1cm4gZXJyOworICByZXR1cm4gZXJyOwogCiBiYWlsOgotICAgIEZES19NZXRhZGF0YUVuY19DbG9zZSgmaE1ldGFEYXRhKTsKLSAgICByZXR1cm4gZXJyOworICBGREtfTWV0YWRhdGFFbmNfQ2xvc2UoJmhNZXRhRGF0YSk7CisgIHJldHVybiBlcnI7CiB9CiAKIEZES19NRVRBREFUQV9FUlJPUiBGREtfTWV0YWRhdGFFbmNfQ2xvc2UoCi0gICAgICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiAqcGhNZXRhRGF0YQotICAgICAgICApCi17Ci0gICAgRkRLX01FVEFEQVRBX0VSUk9SIGVyciA9IE1FVEFEQVRBX09LOworICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiogcGhNZXRhRGF0YSkgeworICBGREtfTUVUQURBVEFfRVJST1IgZXJyID0gTUVUQURBVEFfT0s7CiAKLSAgICBpZiAocGhNZXRhRGF0YSA9PSBOVUxMKSB7Ci0gICAgICBlcnIgPSBNRVRBREFUQV9JTlZBTElEX0hBTkRMRTsKLSAgICAgIGdvdG8gYmFpbDsKLSAgICB9CisgIGlmIChwaE1ldGFEYXRhID09IE5VTEwpIHsKKyAgICBlcnIgPSBNRVRBREFUQV9JTlZBTElEX0hBTkRMRTsKKyAgICBnb3RvIGJhaWw7CisgIH0KIAotICAgIGlmICgqcGhNZXRhRGF0YSAhPSBOVUxMKSB7Ci0gICAgICBGREtfRFJDX0dlbmVyYXRvcl9DbG9zZSgmKCpwaE1ldGFEYXRhKS0+aERyY0NvbXApOwotICAgICAgRkRLZnJlZSgqcGhNZXRhRGF0YSk7Ci0gICAgICAqcGhNZXRhRGF0YSA9IE5VTEw7Ci0gICAgfQorICBpZiAoKnBoTWV0YURhdGEgIT0gTlVMTCkgeworICAgIEZES19EUkNfR2VuZXJhdG9yX0Nsb3NlKCYoKnBoTWV0YURhdGEpLT5oRHJjQ29tcCk7CisgICAgRkRLZnJlZSgoKnBoTWV0YURhdGEpLT5wQXVkaW9EZWxheUJ1ZmZlcik7CisgICAgRkRLZnJlZSgqcGhNZXRhRGF0YSk7CisgICAgKnBoTWV0YURhdGEgPSBOVUxMOworICB9CiBiYWlsOgotICAgIHJldHVybiBlcnI7CisgIHJldHVybiBlcnI7CiB9CiAKIEZES19NRVRBREFUQV9FUlJPUiBGREtfTWV0YWRhdGFFbmNfSW5pdCgKLSAgICAgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhRGF0YSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgIHJlc2V0U3RhdGVzLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFNb2RlLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgYXVkaW9EZWxheSwKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoLAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgY29uc3QgQ0hBTk5FTF9NT0RFICAgICAgICAgIGNoYW5uZWxNb2RlLAotICAgICAgICBjb25zdCBDSEFOTkVMX09SREVSICAgICAgICAgY2hhbm5lbE9yZGVyCi0gICAgICAgICkKLXsKLSAgICBGREtfTUVUQURBVEFfRVJST1IgZXJyID0gTUVUQURBVEFfT0s7Ci0gICAgaW50IGksIG5GcmFtZXMsIGRlbGF5OworICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiBoTWV0YURhdGEsIGNvbnN0IElOVCByZXNldFN0YXRlcywKKyAgICBjb25zdCBJTlQgbWV0YWRhdGFNb2RlLCBjb25zdCBJTlQgYXVkaW9EZWxheSwgY29uc3QgVUlOVCBmcmFtZUxlbmd0aCwKKyAgICBjb25zdCBVSU5UIHNhbXBsZVJhdGUsIGNvbnN0IFVJTlQgbkNoYW5uZWxzLCBjb25zdCBDSEFOTkVMX01PREUgY2hhbm5lbE1vZGUsCisgICAgY29uc3QgQ0hBTk5FTF9PUkRFUiBjaGFubmVsT3JkZXIpIHsKKyAgRkRLX01FVEFEQVRBX0VSUk9SIGVyciA9IE1FVEFEQVRBX09LOworICBpbnQgaSwgbkZyYW1lcywgZGVsYXk7CiAKLSAgICBpZiAoaE1ldGFEYXRhPT1OVUxMKSB7Ci0gICAgICBlcnIgPSBNRVRBREFUQV9JTlZBTElEX0hBTkRMRTsKLSAgICAgIGdvdG8gYmFpbDsKKyAgaWYgKGhNZXRhRGF0YSA9PSBOVUxMKSB7CisgICAgZXJyID0gTUVUQURBVEFfSU5WQUxJRF9IQU5ETEU7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogRGV0ZXJtaW5lIHZhbHVlcyBmb3IgZGVsYXkgY29tcGVuc2F0aW9uLiAqLworICBmb3IgKG5GcmFtZXMgPSAwLCBkZWxheSA9IGF1ZGlvRGVsYXkgLSAoSU5UKWZyYW1lTGVuZ3RoOyBkZWxheSA+IDA7CisgICAgICAgZGVsYXkgLT0gKElOVClmcmFtZUxlbmd0aCwgbkZyYW1lcysrKQorICAgIDsKKworICBpZiAoKG5DaGFubmVscyA+ICg4KSkgfHwgKG5DaGFubmVscyA+IGhNZXRhRGF0YS0+bWF4Q2hhbm5lbHMpIHx8CisgICAgICAoKC1kZWxheSkgPiBNQVhfRFJDX0ZSQU1FTEVOKSB8fCBuRnJhbWVzID49IE1BWF9ERUxBWV9GUkFNRVMpIHsKKyAgICBlcnIgPSBNRVRBREFUQV9JTklUX0VSUk9SOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgd2l0aCBkZWZhdWx0IHNldHVwLiAqLworICBGREttZW1jcHkoJmhNZXRhRGF0YS0+c3VibWl0dGVkTWV0YURhdGEsICZkZWZhdWx0TWV0YURhdGFTZXR1cCwKKyAgICAgICAgICAgIHNpemVvZihBQUNFTkNfTWV0YURhdGEpKTsKKworICBoTWV0YURhdGEtPmZpbmFsaXplTWV0YURhdGEgPQorICAgICAgMDsgLyogZmluYWxpemUgbWV0YSBkYXRhIG9ubHkgd2hpbGUgb24vb2ZmIHN3aXRjaGluZywgZWxzZSBkaXNhYmxlZCAqLworICBoTWV0YURhdGEtPmluaXRpYWxpemVNZXRhRGF0YSA9CisgICAgICAwOyAvKiBmaWxsIHVwIG1ldGEgZGF0YSBkZWxheSBsaW5lIG9ubHkgYXQgYSByZXNldCBvdGhlcndpc2UgZGlzYWJsZWQgKi8KKworICAvKiBSZXNldCBkZWxheSBsaW5lcy4gKi8KKyAgaWYgKHJlc2V0U3RhdGVzIHx8IChoTWV0YURhdGEtPm5BdWRpb0RhdGFEZWxheSAhPSAtZGVsYXkpIHx8CisgICAgICAoaE1ldGFEYXRhLT5jaGFubmVsTW9kZSAhPSBjaGFubmVsTW9kZSkpIHsKKyAgICBpZiAocmVzZXRTdGF0ZXMgfHwgKGhNZXRhRGF0YS0+Y2hhbm5lbE1vZGUgPT0gTU9ERV9VTktOT1dOKSkgeworICAgICAgLyogY2xlYXIgZGVsYXkgYnVmZmVyICovCisgICAgICBGREttZW1jbGVhcihoTWV0YURhdGEtPnBBdWRpb0RlbGF5QnVmZmVyLAorICAgICAgICAgICAgICAgICAgaE1ldGFEYXRhLT5tYXhDaGFubmVscyAqIE1BWF9EUkNfRlJBTUVMRU4gKiBzaXplb2YoSU5UX1BDTSkpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBpZiBwb3NzaWJsZSwga2VlcCBzdGF0aWMgYXVkaW8gY2hhbm5lbHMgZm9yIHNlYW1sZXNzIGNoYW5uZWwKKyAgICAgICAqIHJlY29uZmlndXJhdGlvbiAqLworICAgICAgRkRLX2NoYW5uZWxNYXBEZXNjciBtYXBEZXNjclByZXYsIG1hcERlc2NyOworICAgICAgaW50IGMsIHNyY1syXSA9IHstMSwgLTF9LCBkc3RbMl0gPSB7LTEsIC0xfTsKKworICAgICAgRkRLX2NoTWFwRGVzY3JfaW5pdCgmbWFwRGVzY3JQcmV2LCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbm5lbE9yZGVyID09IENIX09SREVSX01QRUcpID8gMSA6IDApOworICAgICAgRkRLX2NoTWFwRGVzY3JfaW5pdCgmbWFwRGVzY3IsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFubmVsT3JkZXIgPT0gQ0hfT1JERVJfTVBFRykgPyAxIDogMCk7CisKKyAgICAgIHN3aXRjaCAoY2hhbm5lbE1vZGUpIHsKKyAgICAgICAgY2FzZSBNT0RFXzE6CisgICAgICAgICAgaWYgKChJTlQpbkNoYW5uZWxzICE9IDIpIHsKKyAgICAgICAgICAgIC8qIHByZXNlcnZlIGNlbnRlciBjaGFubmVsICovCisgICAgICAgICAgICBzcmNbMF0gPSBGREtfY2hNYXBEZXNjcl9nZXRNYXBWYWx1ZSgmbWFwRGVzY3JQcmV2LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaE1ldGFEYXRhLT5jaGFubmVsTW9kZSk7CisgICAgICAgICAgICBkc3RbMF0gPSBGREtfY2hNYXBEZXNjcl9nZXRNYXBWYWx1ZSgmbWFwRGVzY3IsIDAsIGNoYW5uZWxNb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU9ERV8yOgorICAgICAgICBjYXNlIE1PREVfMV8yOgorICAgICAgICBjYXNlIE1PREVfMV8yXzE6CisgICAgICAgIGNhc2UgTU9ERV8xXzJfMjoKKyAgICAgICAgY2FzZSBNT0RFXzFfMl8yXzE6CisgICAgICAgICAgaWYgKGhNZXRhRGF0YS0+bkNoYW5uZWxzID49IDIpIHsKKyAgICAgICAgICAgIC8qIHByZXNlcnZlIGxlZnQvcmlnaHQgY2hhbm5lbCAqLworICAgICAgICAgICAgc3JjWzBdID0gRkRLX2NoTWFwRGVzY3JfZ2V0TWFwVmFsdWUoCisgICAgICAgICAgICAgICAgJm1hcERlc2NyUHJldiwgKChoTWV0YURhdGEtPmNoYW5uZWxNb2RlID09IDIpID8gMCA6IDEpLAorICAgICAgICAgICAgICAgIGhNZXRhRGF0YS0+Y2hhbm5lbE1vZGUpOworICAgICAgICAgICAgc3JjWzFdID0gRkRLX2NoTWFwRGVzY3JfZ2V0TWFwVmFsdWUoCisgICAgICAgICAgICAgICAgJm1hcERlc2NyUHJldiwgKChoTWV0YURhdGEtPmNoYW5uZWxNb2RlID09IDIpID8gMSA6IDIpLAorICAgICAgICAgICAgICAgIGhNZXRhRGF0YS0+Y2hhbm5lbE1vZGUpOworICAgICAgICAgICAgZHN0WzBdID0gRkRLX2NoTWFwRGVzY3JfZ2V0TWFwVmFsdWUoCisgICAgICAgICAgICAgICAgJm1hcERlc2NyLCAoKGNoYW5uZWxNb2RlID09IDIpID8gMCA6IDEpLCBjaGFubmVsTW9kZSk7CisgICAgICAgICAgICBkc3RbMV0gPSBGREtfY2hNYXBEZXNjcl9nZXRNYXBWYWx1ZSgKKyAgICAgICAgICAgICAgICAmbWFwRGVzY3IsICgoY2hhbm5lbE1vZGUgPT0gMikgPyAxIDogMiksIGNoYW5uZWxNb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6OworICAgICAgfQorICAgICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHNjcmF0Y2hfYXVkaW9EZWxheUJ1ZmZlciwgSU5UX1BDTSwgKDgpKTsKKyAgICAgIEZES21lbWNsZWFyKHNjcmF0Y2hfYXVkaW9EZWxheUJ1ZmZlciwgKDgpICogc2l6ZW9mKElOVF9QQ00pKTsKKworICAgICAgaSA9IChoTWV0YURhdGEtPm5DaGFubmVscyA+IChJTlQpbkNoYW5uZWxzKQorICAgICAgICAgICAgICA/IDAKKyAgICAgICAgICAgICAgOiBoTWV0YURhdGEtPm5BdWRpb0RhdGFEZWxheSAtIDE7CisgICAgICBkbyB7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCAyOyBjKyspIHsKKyAgICAgICAgICBpZiAoc3JjW2NdICE9IC0xICYmIGRzdFtjXSAhPSAtMSkgeworICAgICAgICAgICAgc2NyYXRjaF9hdWRpb0RlbGF5QnVmZmVyW2RzdFtjXV0gPQorICAgICAgICAgICAgICAgIGhNZXRhRGF0YS0+cEF1ZGlvRGVsYXlCdWZmZXJbaSAqIGhNZXRhRGF0YS0+bkNoYW5uZWxzICsgc3JjW2NdXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRkRLbWVtY3B5KCZoTWV0YURhdGEtPnBBdWRpb0RlbGF5QnVmZmVyW2kgKiBuQ2hhbm5lbHNdLAorICAgICAgICAgICAgICAgICAgc2NyYXRjaF9hdWRpb0RlbGF5QnVmZmVyLCBuQ2hhbm5lbHMgKiBzaXplb2YoSU5UX1BDTSkpOworICAgICAgICBpICs9IChoTWV0YURhdGEtPm5DaGFubmVscyA+IChJTlQpbkNoYW5uZWxzKSA/IDEgOiAtMTsKKyAgICAgIH0gd2hpbGUgKChpIDwgaE1ldGFEYXRhLT5uQXVkaW9EYXRhRGVsYXkpICYmIChpID49IDApKTsKKworICAgICAgQ19BTExPQ19TQ1JBVENIX0VORChzY3JhdGNoX2F1ZGlvRGVsYXlCdWZmZXIsIElOVF9QQ00sICg4KSk7CisgICAgfQorICAgIEZES21lbWNsZWFyKGhNZXRhRGF0YS0+bWV0YURhdGFCdWZmZXIsIHNpemVvZihoTWV0YURhdGEtPm1ldGFEYXRhQnVmZmVyKSk7CisgICAgaE1ldGFEYXRhLT5tZXRhRGF0YURlbGF5SWR4ID0gMDsKKyAgICBoTWV0YURhdGEtPmluaXRpYWxpemVNZXRhRGF0YSA9CisgICAgICAgIDE7IC8qIGZpbGwgdXAgZGVsYXkgbGluZSB3aXRoIGZpcnN0IG1ldGEgZGF0YSBpbmZvICovCisgIH0gZWxzZSB7CisgICAgLyogRW5hYmxlIG1ldGEgZGF0YS4gKi8KKyAgICBpZiAoKGhNZXRhRGF0YS0+bWV0YWRhdGFNb2RlID09IDApICYmIChtZXRhZGF0YU1vZGUgIT0gMCkpIHsKKyAgICAgIC8qIGRpc2FibGUgbWV0YSBkYXRhIGluIGFsbCBkZWxheSBsaW5lcyAqLworICAgICAgZm9yIChpID0gMDsKKyAgICAgICAgICAgaSA8IChpbnQpKHNpemVvZihoTWV0YURhdGEtPm1ldGFEYXRhQnVmZmVyKSAvIHNpemVvZihBQUNfTUVUQURBVEEpKTsKKyAgICAgICAgICAgaSsrKSB7CisgICAgICAgIExvYWRTdWJtaXR0ZWRNZXRhZGF0YSgmaE1ldGFEYXRhLT5zdWJtaXR0ZWRNZXRhRGF0YSwgbkNoYW5uZWxzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhNZXRhRGF0YS0+bWV0YURhdGFCdWZmZXJbaV0pOworICAgICAgfQogICAgIH0KIAotICAgIC8qIERldGVybWluZSB2YWx1ZXMgZm9yIGRlbGF5IGNvbXBlbnNhdGlvbi4gKi8KLSAgICBmb3IgKG5GcmFtZXM9MCwgZGVsYXk9YXVkaW9EZWxheS1mcmFtZUxlbmd0aDsgZGVsYXk+MDsgZGVsYXktPWZyYW1lTGVuZ3RoLCBuRnJhbWVzKyspOworICAgIC8qIERpc2FibGUgbWV0YSBkYXRhLiovCisgICAgaWYgKChoTWV0YURhdGEtPm1ldGFkYXRhTW9kZSAhPSAwKSAmJiAobWV0YWRhdGFNb2RlID09IDApKSB7CisgICAgICBoTWV0YURhdGEtPmZpbmFsaXplTWV0YURhdGEgPSBoTWV0YURhdGEtPm1ldGFkYXRhTW9kZTsKKyAgICB9CisgIH0KIAotICAgIGlmICggKGhNZXRhRGF0YS0+bkNoYW5uZWxzPk1BWF9EUkNfQ0hBTk5FTFMpIHx8ICgoLWRlbGF5KT5NQVhfRFJDX0ZSQU1FTEVOKSApIHsKKyAgLyogSW5pdGlhbGl6ZSBkZWxheS4gKi8KKyAgaE1ldGFEYXRhLT5uQXVkaW9EYXRhRGVsYXkgPSAtZGVsYXk7CisgIGhNZXRhRGF0YS0+bk1ldGFEYXRhRGVsYXkgPSBuRnJhbWVzOworICBoTWV0YURhdGEtPm5DaGFubmVscyA9IG5DaGFubmVsczsKKyAgaE1ldGFEYXRhLT5jaGFubmVsTW9kZSA9IGNoYW5uZWxNb2RlOworICBoTWV0YURhdGEtPm1ldGFkYXRhTW9kZSA9IG1ldGFkYXRhTW9kZTsKKworICAvKiBJbml0aWFsaXplIGNvbXByZXNzb3IuICovCisgIGlmICgobWV0YWRhdGFNb2RlID09IDEpIHx8IChtZXRhZGF0YU1vZGUgPT0gMikpIHsKKyAgICBpZiAoRkRLX0RSQ19HZW5lcmF0b3JfSW5pdGlhbGl6ZShoTWV0YURhdGEtPmhEcmNDb21wLCBEUkNfTk9ORSwgRFJDX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGgsIHNhbXBsZVJhdGUsIGNoYW5uZWxNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxPcmRlciwgMSkgIT0gMCkgewogICAgICAgZXJyID0gTUVUQURBVEFfSU5JVF9FUlJPUjsKLSAgICAgIGdvdG8gYmFpbDsKICAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHdpdGggZGVmYXVsdCBzZXR1cC4gKi8KLSAgICBGREttZW1jcHkoJmhNZXRhRGF0YS0+c3VibWl0dGVkTWV0YURhdGEsICZkZWZhdWx0TWV0YURhdGFTZXR1cCwgIHNpemVvZihBQUNFTkNfTWV0YURhdGEpKTsKLQotICAgIGhNZXRhRGF0YS0+ZmluYWxpemVNZXRhRGF0YSA9IDA7IC8qIGZpbmFsaXplIG1ldGEgZGF0YSBvbmx5IHdoaWxlIG9uL29mZiBzd2l0Y2hpbmcsIGVsc2UgZGlzYWJsZWQgKi8KLQotICAgIC8qIFJlc2V0IGRlbGF5IGxpbmVzLiAqLwotICAgIGlmICggcmVzZXRTdGF0ZXMgfHwgKGhNZXRhRGF0YS0+bkF1ZGlvRGF0YURlbGF5IT0tZGVsYXkpIHx8IChoTWV0YURhdGEtPm5DaGFubmVscyE9KElOVCluQ2hhbm5lbHMpICkKLSAgICB7Ci0gICAgICBGREttZW1jbGVhcihoTWV0YURhdGEtPmF1ZGlvRGVsYXlCdWZmZXIsIHNpemVvZihoTWV0YURhdGEtPmF1ZGlvRGVsYXlCdWZmZXIpKTsKLSAgICAgIEZES21lbWNsZWFyKGhNZXRhRGF0YS0+bWV0YURhdGFCdWZmZXIsIHNpemVvZihoTWV0YURhdGEtPm1ldGFEYXRhQnVmZmVyKSk7Ci0gICAgICBoTWV0YURhdGEtPmF1ZGlvRGVsYXlJZHggPSAwOwotICAgICAgaE1ldGFEYXRhLT5tZXRhRGF0YURlbGF5SWR4ID0gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvKiBFbmFibGUgbWV0YSBkYXRhLiAqLwotICAgICAgaWYgKCAoaE1ldGFEYXRhLT5tZXRhZGF0YU1vZGU9PTApICYmIChtZXRhZGF0YU1vZGUhPTApICkgewotICAgICAgICAvKiBkaXNhYmxlIG1ldGEgZGF0YSBpbiBhbGwgZGVsYXkgbGluZXMgKi8KLSAgICAgICAgZm9yIChpPTA7IGk8KGludCkoc2l6ZW9mKGhNZXRhRGF0YS0+bWV0YURhdGFCdWZmZXIpL3NpemVvZihBQUNfTUVUQURBVEEpKTsgaSsrKSB7Ci0gICAgICAgICAgTG9hZFN1Ym1pdHRlZE1ldGFkYXRhKCZoTWV0YURhdGEtPnN1Ym1pdHRlZE1ldGFEYXRhLCBuQ2hhbm5lbHMsIDAsICZoTWV0YURhdGEtPm1ldGFEYXRhQnVmZmVyW2ldKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBEaXNhYmxlIG1ldGEgZGF0YS4qLwotICAgICAgaWYgKCAoaE1ldGFEYXRhLT5tZXRhZGF0YU1vZGUhPTApICYmIChtZXRhZGF0YU1vZGU9PTApICkgewotICAgICAgICBoTWV0YURhdGEtPmZpbmFsaXplTWV0YURhdGEgPSBoTWV0YURhdGEtPm1ldGFkYXRhTW9kZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIGRlbGF5LiAqLwotICAgIGhNZXRhRGF0YS0+bkF1ZGlvRGF0YURlbGF5ID0gLWRlbGF5OwotICAgIGhNZXRhRGF0YS0+bk1ldGFEYXRhRGVsYXkgID0gbkZyYW1lczsKLSAgICBoTWV0YURhdGEtPm5DaGFubmVscyAgICAgICA9IG5DaGFubmVsczsKLSAgICBoTWV0YURhdGEtPm1ldGFkYXRhTW9kZSAgICA9IG1ldGFkYXRhTW9kZTsKLQotICAgIC8qIEluaXRpYWxpemUgY29tcHJlc3Nvci4gKi8KLSAgICBpZiAobWV0YWRhdGFNb2RlICE9IDApIHsKLSAgICAgICAgaWYgKCBGREtfRFJDX0dlbmVyYXRvcl9Jbml0aWFsaXplKAotICAgICAgICAgICAgICAgICAgICAgICAgIGhNZXRhRGF0YS0+aERyY0NvbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRFJDX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRFJDX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsT3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMSkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgIGVyciA9IE1FVEFEQVRBX0lOSVRfRVJST1I7Ci0gICAgICAgIH0KLSAgICB9CisgIH0KIGJhaWw6Ci0gICAgcmV0dXJuIGVycjsKKyAgcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIEZES19NRVRBREFUQV9FUlJPUiBQcm9jZXNzQ29tcHJlc3NvcigKLSAgICAgICAgQUFDX01FVEFEQVRBICAgICAgICAgICAgICAgICAgICAqcE1ldGFkYXRhLAotICAgICAgICBIRFJDX0NPTVAgICAgICAgICAgICAgICAgICAgICAgICBoRHJjQ29tcCwKLSAgICAgICAgY29uc3QgSU5UX1BDTSAqIGNvbnN0ICAgICAgICAgICAgcFNhbXBsZXMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgIG5TYW1wbGVzCi0gICAgICAgICkKLXsKLSAgICBGREtfTUVUQURBVEFfRVJST1IgZXJyID0gTUVUQURBVEFfT0s7CitzdGF0aWMgRkRLX01FVEFEQVRBX0VSUk9SIFByb2Nlc3NDb21wcmVzc29yKEFBQ19NRVRBREFUQSogcE1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRFJDX0NPTVAgaERyY0NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVF9QQ00qIGNvbnN0IHBTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIHNhbXBsZXNCdWZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgblNhbXBsZXMpIHsKKyAgRkRLX01FVEFEQVRBX0VSUk9SIGVyciA9IE1FVEFEQVRBX09LOwogCi0gICAgaWYgKCAocE1ldGFkYXRhPT1OVUxMKSB8fCAoaERyY0NvbXA9PU5VTEwpICkgewotICAgICAgZXJyID0gTUVUQURBVEFfSU5WQUxJRF9IQU5ETEU7Ci0gICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBEUkNfUFJPRklMRSBwcm9maWxlRHJjICA9IGNvbnZlcnRQcm9maWxlKHBNZXRhZGF0YS0+bXBlZ0RyYy5kcmNfcHJvZmlsZSk7Ci0gICAgRFJDX1BST0ZJTEUgcHJvZmlsZUNvbXAgPSBjb252ZXJ0UHJvZmlsZShwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmNvbXBfcHJvZmlsZSk7CisgIElOVCBkeW5ybmcsIGNvbXByOworICBJTlQgZG14R2FpbjUsIGRteEdhaW4yOworICBEUkNfUFJPRklMRSBwcm9maWxlRHJjOworICBEUkNfUFJPRklMRSBwcm9maWxlQ29tcDsKIAotICAgIC8qIGZpcnN0LCBjaGVjayBpZiBwcm9maWxlIGlzIHNhbWUgYXMgbGFzdCBmcmFtZQotICAgICAqIG90aGVyd2lzZSwgdXBkYXRlIHNldHVwICovCi0gICAgaWYgKCAocHJvZmlsZURyYyAhPSBGREtfRFJDX0dlbmVyYXRvcl9nZXREcmNQcm9maWxlKGhEcmNDb21wKSkKLSAgICAgIHx8IChwcm9maWxlQ29tcCAhPSBGREtfRFJDX0dlbmVyYXRvcl9nZXRDb21wUHJvZmlsZShoRHJjQ29tcCkpICkKLSAgICB7Ci0gICAgICBGREtfRFJDX0dlbmVyYXRvcl9zZXREcmNQcm9maWxlKGhEcmNDb21wLCBwcm9maWxlRHJjLCBwcm9maWxlQ29tcCk7Ci0gICAgfQorICBpZiAoKHBNZXRhZGF0YSA9PSBOVUxMKSB8fCAoaERyY0NvbXAgPT0gTlVMTCkpIHsKKyAgICBlcnIgPSBNRVRBREFUQV9JTlZBTElEX0hBTkRMRTsKKyAgICByZXR1cm4gZXJyOworICB9CiAKLSAgICAvKiBTYW5pdHkgY2hlY2sgKi8KLSAgICBpZiAocHJvZmlsZUNvbXAgPT0gRFJDX05PTkUpIHsKLSAgICAgIHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuY29tcHJlc3Npb25fdmFsdWUgPSAweDgwOyAgLyogdG8gZW5zdXJlIG5vIGV4dGVybmFsIHZhbHVlcyB3aWxsIGJlIHdyaXR0ZW4gaWYgbm90IGNvbmZpZ3VyZWQgKi8KLSAgICB9CisgIHByb2ZpbGVEcmMgPSBjb252ZXJ0UHJvZmlsZShwTWV0YWRhdGEtPm1wZWdEcmMuZHJjX3Byb2ZpbGUpOworICBwcm9maWxlQ29tcCA9IGNvbnZlcnRQcm9maWxlKHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuY29tcF9wcm9maWxlKTsKIAotICAgIC8qIGluIGNhc2Ugb2YgZW1iZWRkaW5nIGV4dGVybmFsIHZhbHVlcywgY29weSB0aGlzIG5vdyAobGltaXRlciBtYXkgb3ZlcndyaXRlIHRoZW0pICovCi0gICAgSU5UIGR5bnJuZyA9IGRlY29kZUR5bnJuZyhwTWV0YWRhdGEtPm1wZWdEcmMuZHluX3JuZ19jdGxbMF0sIHBNZXRhZGF0YS0+bXBlZ0RyYy5keW5fcm5nX3NnblswXSk7Ci0gICAgSU5UIGNvbXByICA9IGRlY29kZUNvbXByKHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuY29tcHJlc3Npb25fdmFsdWUpOworICAvKiBmaXJzdCwgY2hlY2sgaWYgcHJvZmlsZSBpcyBzYW1lIGFzIGxhc3QgZnJhbWUKKyAgICogb3RoZXJ3aXNlLCB1cGRhdGUgc2V0dXAgKi8KKyAgaWYgKChwcm9maWxlRHJjICE9IEZES19EUkNfR2VuZXJhdG9yX2dldERyY1Byb2ZpbGUoaERyY0NvbXApKSB8fAorICAgICAgKHByb2ZpbGVDb21wICE9IEZES19EUkNfR2VuZXJhdG9yX2dldENvbXBQcm9maWxlKGhEcmNDb21wKSkpIHsKKyAgICBGREtfRFJDX0dlbmVyYXRvcl9zZXREcmNQcm9maWxlKGhEcmNDb21wLCBwcm9maWxlRHJjLCBwcm9maWxlQ29tcCk7CisgIH0KIAotICAgIC8qIENhbGwgY29tcHJlc3NvciAqLwotICAgIGlmIChGREtfRFJDX0dlbmVyYXRvcl9DYWxjKGhEcmNDb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVmbHZsMmRpYWxub3JtKHBNZXRhZGF0YS0+bXBlZ0RyYy5wcm9nX3JlZl9sZXZlbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwTWV0YWRhdGEtPm1wZWdEcmMuZHJjX1RhcmdldFJlZkxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5jb21wX1RhcmdldFJlZkxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG14VGFibGVbcE1ldGFkYXRhLT5jZW50ZXJNaXhMZXZlbF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkbXhUYWJsZVtwTWV0YWRhdGEtPnN1cnJvdW5kTWl4TGV2ZWxdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR5bnJuZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcikgIT0gMCkKLSAgICB7Ci0gICAgICBlcnIgPSBNRVRBREFUQV9FTkNPREVfRVJST1I7Ci0gICAgICBnb3RvIGJhaWw7Ci0gICAgfQorICAvKiBTYW5pdHkgY2hlY2sgKi8KKyAgaWYgKHByb2ZpbGVDb21wID09IERSQ19OT05FKSB7CisgICAgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5jb21wcmVzc2lvbl92YWx1ZSA9IDB4ODA7IC8qIHRvIGVuc3VyZSBubyBleHRlcm5hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgd2lsbCBiZSB3cml0dGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjb25maWd1cmVkICovCisgIH0KIAotICAgIC8qIFdyaXRlIERSQyB2YWx1ZXMgKi8KLSAgICBwTWV0YWRhdGEtPm1wZWdEcmMuZHJjX2JhbmRfaW5jciA9IDA7Ci0gICAgZW5jb2RlRHlucm5nKGR5bnJuZywgcE1ldGFkYXRhLT5tcGVnRHJjLmR5bl9ybmdfY3RsLCBwTWV0YWRhdGEtPm1wZWdEcmMuZHluX3JuZ19zZ24pOwotICAgIHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuY29tcHJlc3Npb25fdmFsdWUgPSBlbmNvZGVDb21wcihjb21wcik7CisgIC8qIGluIGNhc2Ugb2YgZW1iZWRkaW5nIGV4dGVybmFsIHZhbHVlcywgY29weSB0aGlzIG5vdyAobGltaXRlciBtYXkgb3ZlcndyaXRlCisgICAqIHRoZW0pICovCisgIGR5bnJuZyA9IGRlY29kZUR5bnJuZyhwTWV0YWRhdGEtPm1wZWdEcmMuZHluX3JuZ19jdGxbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBwTWV0YWRhdGEtPm1wZWdEcmMuZHluX3JuZ19zZ25bMF0pOworICBjb21wciA9IGRlY29kZUNvbXByKHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuY29tcHJlc3Npb25fdmFsdWUpOworCisgIGRteEdhaW41ID0gZGVjb2RlRHlucm5nKHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5kbXhfZ2Fpbl81X2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmRteF9nYWluXzVfc2duKTsKKyAgZG14R2FpbjIgPSBkZWNvZGVEeW5ybmcocE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmRteF9nYWluXzJfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZG14X2dhaW5fMl9zZ24pOworCisgIC8qIENhbGwgY29tcHJlc3NvciAqLworICBpZiAoRkRLX0RSQ19HZW5lcmF0b3JfQ2FsYygKKyAgICAgICAgICBoRHJjQ29tcCwgcFNhbXBsZXMsIHNhbXBsZXNCdWZTaXplLAorICAgICAgICAgIHByb2dyZWZsdmwyZGlhbG5vcm0ocE1ldGFkYXRhLT5tcGVnRHJjLnByb2dfcmVmX2xldmVsKSwKKyAgICAgICAgICBwTWV0YWRhdGEtPm1wZWdEcmMuZHJjX1RhcmdldFJlZkxldmVsLAorICAgICAgICAgIHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuY29tcF9UYXJnZXRSZWZMZXZlbCwKKyAgICAgICAgICBkbXhUYWJsZVtwTWV0YWRhdGEtPmNlbnRlck1peExldmVsXSwKKyAgICAgICAgICBkbXhUYWJsZVtwTWV0YWRhdGEtPnN1cnJvdW5kTWl4TGV2ZWxdLAorICAgICAgICAgIGRteFRhYmxlW3BNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfZG1peF9hX2lkeF0sCisgICAgICAgICAgZG14VGFibGVbcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmV4dF9kbWl4X2JfaWR4XSwKKyAgICAgICAgICBwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZXh0X2xmZV9kb3dubWl4X3N0YXR1cworICAgICAgICAgICAgICA/IGRteExmZVRhYmxlW3BNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfZG1peF9sZmVfaWR4XQorICAgICAgICAgICAgICA6IChGSVhQX0RCTCkwLAorICAgICAgICAgIGRteEdhaW41LCBkbXhHYWluMiwgJmR5bnJuZywgJmNvbXByKSAhPSAwKSB7CisgICAgZXJyID0gTUVUQURBVEFfRU5DT0RFX0VSUk9SOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIFdyaXRlIERSQyB2YWx1ZXMgKi8KKyAgcE1ldGFkYXRhLT5tcGVnRHJjLmRyY19iYW5kX2luY3IgPSAwOworICBlbmNvZGVEeW5ybmcoZHlucm5nLCBwTWV0YWRhdGEtPm1wZWdEcmMuZHluX3JuZ19jdGwsCisgICAgICAgICAgICAgICBwTWV0YWRhdGEtPm1wZWdEcmMuZHluX3JuZ19zZ24pOworICBwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmNvbXByZXNzaW9uX3ZhbHVlID0gZW5jb2RlQ29tcHIoY29tcHIpOwogCiBiYWlsOgotICAgIHJldHVybiBlcnI7CisgIHJldHVybiBlcnI7CiB9CiAKIEZES19NRVRBREFUQV9FUlJPUiBGREtfTWV0YWRhdGFFbmNfUHJvY2VzcygKLSAgICAgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSICAgICAgaE1ldGFEYXRhRW5jLAotICAgICAgICBJTlRfUENNICogY29uc3QgICAgICAgICAgICAgICAgICBwQXVkaW9TYW1wbGVzLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgICBuQXVkaW9TYW1wbGVzLAotICAgICAgICBjb25zdCBBQUNFTkNfTWV0YURhdGEgKiBjb25zdCAgICBwTWV0YWRhdGEsCi0gICAgICAgIEFBQ0VOQ19FWFRfUEFZTE9BRCAqKiAgICAgICAgICAgIHBwTWV0YURhdGFFeHRQYXlsb2FkLAotICAgICAgICBVSU5UICogICAgICAgICAgICAgICAgICAgICAgICAgICBuTWV0YURhdGFFeHRlbnNpb25zLAotICAgICAgICBJTlQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXhfbWl4ZG93bl9pZHgKLSAgICAgICAgKQotewotICAgIEZES19NRVRBREFUQV9FUlJPUiBlcnIgPSBNRVRBREFUQV9PSzsKLSAgICBpbnQgbWV0YURhdGFEZWxheVdyaXRlSWR4LCBtZXRhRGF0YURlbGF5UmVhZElkeCwgbWV0YWRhdGFNb2RlOworICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiBoTWV0YURhdGFFbmMsIElOVF9QQ00qIGNvbnN0IHBBdWRpb1NhbXBsZXMsCisgICAgY29uc3QgVUlOVCBhdWRpb1NhbXBsZXNCdWZTaXplLCBjb25zdCBJTlQgbkF1ZGlvU2FtcGxlcywKKyAgICBjb25zdCBBQUNFTkNfTWV0YURhdGEqIGNvbnN0IHBNZXRhZGF0YSwKKyAgICBBQUNFTkNfRVhUX1BBWUxPQUQqKiBwcE1ldGFEYXRhRXh0UGF5bG9hZCwgVUlOVCogbk1ldGFEYXRhRXh0ZW5zaW9ucywKKyAgICBJTlQqIG1hdHJpeF9taXhkb3duX2lkeCkgeworICBGREtfTUVUQURBVEFfRVJST1IgZXJyID0gTUVUQURBVEFfT0s7CisgIGludCBtZXRhRGF0YURlbGF5V3JpdGVJZHgsIG1ldGFEYXRhRGVsYXlSZWFkSWR4LCBtZXRhZGF0YU1vZGU7CiAKLSAgICAvKiBXaGVyZSB0byB3cml0ZSBuZXcgbWV0YSBkYXRhIGluZm8gKi8KLSAgICBtZXRhRGF0YURlbGF5V3JpdGVJZHggPSBoTWV0YURhdGFFbmMtPm1ldGFEYXRhRGVsYXlJZHg7CisgIC8qIFdoZXJlIHRvIHdyaXRlIG5ldyBtZXRhIGRhdGEgaW5mbyAqLworICBtZXRhRGF0YURlbGF5V3JpdGVJZHggPSBoTWV0YURhdGFFbmMtPm1ldGFEYXRhRGVsYXlJZHg7CiAKLSAgICAvKiBIb3cgdG8gd3JpdGUgdGhlIGRhdGEgKi8KLSAgICBtZXRhZGF0YU1vZGUgPSBoTWV0YURhdGFFbmMtPm1ldGFkYXRhTW9kZTsKKyAgLyogSG93IHRvIHdyaXRlIHRoZSBkYXRhICovCisgIG1ldGFkYXRhTW9kZSA9IGhNZXRhRGF0YUVuYy0+bWV0YWRhdGFNb2RlOwogCi0gICAgLyogQ29tcGVuc2F0ZSBtZXRhIGRhdGEgZGVsYXkuICovCi0gICAgaE1ldGFEYXRhRW5jLT5tZXRhRGF0YURlbGF5SWR4Kys7Ci0gICAgaWYgKGhNZXRhRGF0YUVuYy0+bWV0YURhdGFEZWxheUlkeCA+IGhNZXRhRGF0YUVuYy0+bk1ldGFEYXRhRGVsYXkpIGhNZXRhRGF0YUVuYy0+bWV0YURhdGFEZWxheUlkeCA9IDA7CisgIC8qIENvbXBlbnNhdGUgbWV0YSBkYXRhIGRlbGF5LiAqLworICBoTWV0YURhdGFFbmMtPm1ldGFEYXRhRGVsYXlJZHgrKzsKKyAgaWYgKGhNZXRhRGF0YUVuYy0+bWV0YURhdGFEZWxheUlkeCA+IGhNZXRhRGF0YUVuYy0+bk1ldGFEYXRhRGVsYXkpCisgICAgaE1ldGFEYXRhRW5jLT5tZXRhRGF0YURlbGF5SWR4ID0gMDsKIAotICAgIC8qIFdoZXJlIHRvIHJlYWQgcGVuZGluZyBtZXRhIGRhdGEgaW5mbyBmcm9tLiAqLwotICAgIG1ldGFEYXRhRGVsYXlSZWFkSWR4ID0gaE1ldGFEYXRhRW5jLT5tZXRhRGF0YURlbGF5SWR4OworICAvKiBXaGVyZSB0byByZWFkIHBlbmRpbmcgbWV0YSBkYXRhIGluZm8gZnJvbS4gKi8KKyAgbWV0YURhdGFEZWxheVJlYWRJZHggPSBoTWV0YURhdGFFbmMtPm1ldGFEYXRhRGVsYXlJZHg7CiAKLSAgICAvKiBTdWJtaXQgbmV3IGRhdGEgaWYgYXZhaWxhYmxlLiAqLwotICAgIGlmIChwTWV0YWRhdGEhPU5VTEwpIHsKLSAgICAgICAgRkRLbWVtY3B5KCZoTWV0YURhdGFFbmMtPnN1Ym1pdHRlZE1ldGFEYXRhLCBwTWV0YWRhdGEsIHNpemVvZihBQUNFTkNfTWV0YURhdGEpKTsKKyAgLyogU3VibWl0IG5ldyBkYXRhIGlmIGF2YWlsYWJsZS4gKi8KKyAgaWYgKHBNZXRhZGF0YSAhPSBOVUxMKSB7CisgICAgRkRLbWVtY3B5KCZoTWV0YURhdGFFbmMtPnN1Ym1pdHRlZE1ldGFEYXRhLCBwTWV0YWRhdGEsCisgICAgICAgICAgICAgIHNpemVvZihBQUNFTkNfTWV0YURhdGEpKTsKKyAgfQorCisgIC8qIFdyaXRlIG9uZSBhZGRpdGlvbmFsIGZyYW1lIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIG1ldGEgZGF0YS4gRW5zdXJlCisgICAqIGRlZmluZWQgYmVoYXZpb3VyIG9uIGRlY29kZXIgc2lkZS4gKi8KKyAgaWYgKChoTWV0YURhdGFFbmMtPmZpbmFsaXplTWV0YURhdGEgIT0gMCkgJiYKKyAgICAgIChoTWV0YURhdGFFbmMtPm1ldGFkYXRhTW9kZSA9PSAwKSkgeworICAgIEZES21lbWNweSgmaE1ldGFEYXRhRW5jLT5zdWJtaXR0ZWRNZXRhRGF0YSwgJmRlZmF1bHRNZXRhRGF0YVNldHVwLAorICAgICAgICAgICAgICBzaXplb2YoQUFDRU5DX01ldGFEYXRhKSk7CisgICAgbWV0YWRhdGFNb2RlID0gaE1ldGFEYXRhRW5jLT5maW5hbGl6ZU1ldGFEYXRhOworICAgIGhNZXRhRGF0YUVuYy0+ZmluYWxpemVNZXRhRGF0YSA9IDA7CisgIH0KKworICAvKiBHZXQgbGFzdCBzdWJtaXR0ZWQgZGF0YS4gKi8KKyAgaWYgKChlcnIgPSBMb2FkU3VibWl0dGVkTWV0YWRhdGEoCisgICAgICAgICAgICZoTWV0YURhdGFFbmMtPnN1Ym1pdHRlZE1ldGFEYXRhLCBoTWV0YURhdGFFbmMtPm5DaGFubmVscywKKyAgICAgICAgICAgbWV0YWRhdGFNb2RlLAorICAgICAgICAgICAmaE1ldGFEYXRhRW5jLT5tZXRhRGF0YUJ1ZmZlclttZXRhRGF0YURlbGF5V3JpdGVJZHhdKSkgIT0KKyAgICAgIE1FVEFEQVRBX09LKSB7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogQ2FsY3VsYXRlIGNvbXByZXNzb3IgaWYgbmVjZXNzYXJ5IGFuZCB1cGRhdGEgbWV0YSBkYXRhIGluZm8gKi8KKyAgaWYgKChoTWV0YURhdGFFbmMtPm1ldGFEYXRhQnVmZmVyW21ldGFEYXRhRGVsYXlXcml0ZUlkeF0ubWV0YWRhdGFNb2RlID09IDEpIHx8CisgICAgICAoaE1ldGFEYXRhRW5jLT5tZXRhRGF0YUJ1ZmZlclttZXRhRGF0YURlbGF5V3JpdGVJZHhdLm1ldGFkYXRhTW9kZSA9PSAyKSkgeworICAgIGlmICgoZXJyID0gUHJvY2Vzc0NvbXByZXNzb3IoCisgICAgICAgICAgICAgJmhNZXRhRGF0YUVuYy0+bWV0YURhdGFCdWZmZXJbbWV0YURhdGFEZWxheVdyaXRlSWR4XSwKKyAgICAgICAgICAgICBoTWV0YURhdGFFbmMtPmhEcmNDb21wLCBwQXVkaW9TYW1wbGVzLCBhdWRpb1NhbXBsZXNCdWZTaXplLAorICAgICAgICAgICAgIG5BdWRpb1NhbXBsZXMpKSAhPSBNRVRBREFUQV9PSykgeworICAgICAgLyogR2V0IGxhc3Qgc3VibWl0dGVkIGRhdGEgYWdhaW4uICovCisgICAgICBMb2FkU3VibWl0dGVkTWV0YWRhdGEoCisgICAgICAgICAgJmhNZXRhRGF0YUVuYy0+c3VibWl0dGVkTWV0YURhdGEsIGhNZXRhRGF0YUVuYy0+bkNoYW5uZWxzLAorICAgICAgICAgIG1ldGFkYXRhTW9kZSwgJmhNZXRhRGF0YUVuYy0+bWV0YURhdGFCdWZmZXJbbWV0YURhdGFEZWxheVdyaXRlSWR4XSk7CiAgICAgfQorICB9CiAKLSAgICAvKiBXcml0ZSBvbmUgYWRkaXRpb25hbCBmcmFtZSB3aXRoIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiBtZXRhIGRhdGEuIEVuc3VyZSBkZWZpbmVkIGJlaGF2aW91ciBvbiBkZWNvZGVyIHNpZGUuICovCi0gICAgaWYgKCAoaE1ldGFEYXRhRW5jLT5maW5hbGl6ZU1ldGFEYXRhIT0wKSAmJiAoaE1ldGFEYXRhRW5jLT5tZXRhZGF0YU1vZGU9PTApKSB7Ci0gICAgICBGREttZW1jcHkoJmhNZXRhRGF0YUVuYy0+c3VibWl0dGVkTWV0YURhdGEsICZkZWZhdWx0TWV0YURhdGFTZXR1cCwgIHNpemVvZihBQUNFTkNfTWV0YURhdGEpKTsKLSAgICAgIG1ldGFkYXRhTW9kZSA9IGhNZXRhRGF0YUVuYy0+ZmluYWxpemVNZXRhRGF0YTsKLSAgICAgIGhNZXRhRGF0YUVuYy0+ZmluYWxpemVNZXRhRGF0YSA9IDA7Ci0gICAgfQotCi0gICAgLyogR2V0IGxhc3Qgc3VibWl0dGVkIGRhdGEuICovCi0gICAgaWYgKCAoZXJyID0gTG9hZFN1Ym1pdHRlZE1ldGFkYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgJmhNZXRhRGF0YUVuYy0+c3VibWl0dGVkTWV0YURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaE1ldGFEYXRhRW5jLT5uQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgJmhNZXRhRGF0YUVuYy0+bWV0YURhdGFCdWZmZXJbbWV0YURhdGFEZWxheVdyaXRlSWR4XSkpICE9IE1FVEFEQVRBX09LICkKLSAgICB7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICAvKiBDYWxjdWxhdGUgY29tcHJlc3NvciBpZiBuZWNlc3NhcnkgYW5kIHVwZGF0YSBtZXRhIGRhdGEgaW5mbyAqLwotICAgIGlmIChoTWV0YURhdGFFbmMtPm1ldGFEYXRhQnVmZmVyW21ldGFEYXRhRGVsYXlXcml0ZUlkeF0ubWV0YWRhdGFNb2RlICE9IDApIHsKLSAgICAgIGlmICggKGVyciA9IFByb2Nlc3NDb21wcmVzc29yKAotICAgICAgICAgICAgICAgICAgICAgICAgJmhNZXRhRGF0YUVuYy0+bWV0YURhdGFCdWZmZXJbbWV0YURhdGFEZWxheVdyaXRlSWR4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoTWV0YURhdGFFbmMtPmhEcmNDb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb1NhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbkF1ZGlvU2FtcGxlcykpICE9IE1FVEFEQVRBX09LKQotICAgICAgewotICAgICAgICAvKiBHZXQgbGFzdCBzdWJtaXR0ZWQgZGF0YSBhZ2Fpbi4gKi8KLSAgICAgICAgTG9hZFN1Ym1pdHRlZE1ldGFkYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgJmhNZXRhRGF0YUVuYy0+c3VibWl0dGVkTWV0YURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaE1ldGFEYXRhRW5jLT5uQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgJmhNZXRhRGF0YUVuYy0+bWV0YURhdGFCdWZmZXJbbWV0YURhdGFEZWxheVdyaXRlSWR4XSk7CisgIC8qIEZpbGwgdXAgZGVsYXkgbGluZSB3aXRoIGluaXRpYWwgbWV0YSBkYXRhIGluZm8uKi8KKyAgaWYgKChoTWV0YURhdGFFbmMtPmluaXRpYWxpemVNZXRhRGF0YSAhPSAwKSAmJgorICAgICAgKGhNZXRhRGF0YUVuYy0+bWV0YWRhdGFNb2RlICE9IDApKSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsKKyAgICAgICAgIGkgPCAoaW50KShzaXplb2YoaE1ldGFEYXRhRW5jLT5tZXRhRGF0YUJ1ZmZlcikgLyBzaXplb2YoQUFDX01FVEFEQVRBKSk7CisgICAgICAgICBpKyspIHsKKyAgICAgIGlmIChpICE9IG1ldGFEYXRhRGVsYXlXcml0ZUlkeCkgeworICAgICAgICBGREttZW1jcHkoJmhNZXRhRGF0YUVuYy0+bWV0YURhdGFCdWZmZXJbaV0sCisgICAgICAgICAgICAgICAgICAmaE1ldGFEYXRhRW5jLT5tZXRhRGF0YUJ1ZmZlclttZXRhRGF0YURlbGF5V3JpdGVJZHhdLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhNZXRhRGF0YUVuYy0+bWV0YURhdGFCdWZmZXJbbWV0YURhdGFEZWxheVdyaXRlSWR4XSkpOwogICAgICAgfQogICAgIH0KKyAgICBoTWV0YURhdGFFbmMtPmluaXRpYWxpemVNZXRhRGF0YSA9IDA7CisgIH0KIAotICAgIC8qIENvbnZlcnQgTWV0YSBEYXRhIHNpZGUgaW5mbyB0byBiaXRzdHJlYW0gZGF0YS4gKi8KLSAgICBpZiAoIChlcnIgPSBXcml0ZU1ldGFkYXRhUGF5bG9hZChoTWV0YURhdGFFbmMsICZoTWV0YURhdGFFbmMtPm1ldGFEYXRhQnVmZmVyW21ldGFEYXRhRGVsYXlSZWFkSWR4XSkpICE9IE1FVEFEQVRBX09LICkgewotICAgICAgZ290byBiYWlsOwotICAgIH0KKyAgLyogQ29udmVydCBNZXRhIERhdGEgc2lkZSBpbmZvIHRvIGJpdHN0cmVhbSBkYXRhLiAqLworICBGREtfQVNTRVJUKG1ldGFEYXRhRGVsYXlSZWFkSWR4IDwgTUFYX0RFTEFZX0ZSQU1FUyk7CisgIGlmICgoZXJyID0gV3JpdGVNZXRhZGF0YVBheWxvYWQoCisgICAgICAgICAgIGhNZXRhRGF0YUVuYywKKyAgICAgICAgICAgJmhNZXRhRGF0YUVuYy0+bWV0YURhdGFCdWZmZXJbbWV0YURhdGFEZWxheVJlYWRJZHhdKSkgIT0KKyAgICAgIE1FVEFEQVRBX09LKSB7CisgICAgZ290byBiYWlsOworICB9CiAKLSAgICAvKiBBc3NpZ24gbWV0YSBkYXRhIHRvIG91dHB1dCAqLwotICAgICpwcE1ldGFEYXRhRXh0UGF5bG9hZCA9IGhNZXRhRGF0YUVuYy0+ZXhQYXlsb2FkOwotICAgICpuTWV0YURhdGFFeHRlbnNpb25zICA9IGhNZXRhRGF0YUVuYy0+bkV4dGVuc2lvbnM7Ci0gICAgKm1hdHJpeF9taXhkb3duX2lkeCAgID0gaE1ldGFEYXRhRW5jLT5tYXRyaXhfbWl4ZG93bl9pZHg7CisgIC8qIEFzc2lnbiBtZXRhIGRhdGEgdG8gb3V0cHV0ICovCisgICpwcE1ldGFEYXRhRXh0UGF5bG9hZCA9IGhNZXRhRGF0YUVuYy0+ZXhQYXlsb2FkOworICAqbk1ldGFEYXRhRXh0ZW5zaW9ucyA9IGhNZXRhRGF0YUVuYy0+bkV4dGVuc2lvbnM7CisgICptYXRyaXhfbWl4ZG93bl9pZHggPSBoTWV0YURhdGFFbmMtPm1hdHJpeF9taXhkb3duX2lkeDsKIAogYmFpbDoKLSAgICAvKiBDb21wZW5zYXRlIGF1ZGlvIGRlbGF5LCByZXNldCBlcnIgc3RhdHVzLiAqLwotICAgIGVyciA9IENvbXBlbnNhdGVBdWRpb0RlbGF5KGhNZXRhRGF0YUVuYywgcEF1ZGlvU2FtcGxlcywgbkF1ZGlvU2FtcGxlcyk7CisgIC8qIENvbXBlbnNhdGUgYXVkaW8gZGVsYXksIHJlc2V0IGVyciBzdGF0dXMuICovCisgIGVyciA9IENvbXBlbnNhdGVBdWRpb0RlbGF5KGhNZXRhRGF0YUVuYywgcEF1ZGlvU2FtcGxlcywgYXVkaW9TYW1wbGVzQnVmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkF1ZGlvU2FtcGxlcyAvIGhNZXRhRGF0YUVuYy0+bkNoYW5uZWxzKTsKIAotICAgIHJldHVybiBlcnI7CisgIHJldHVybiBlcnI7CiB9CiAKLQogc3RhdGljIEZES19NRVRBREFUQV9FUlJPUiBDb21wZW5zYXRlQXVkaW9EZWxheSgKLSAgICAgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhRGF0YUVuYywKLSAgICAgICAgSU5UX1BDTSAqIGNvbnN0ICAgICAgICAgICAgIHBBdWRpb1NhbXBsZXMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICBuQXVkaW9TYW1wbGVzCi0gICAgICAgICkKLXsKLSAgICBGREtfTUVUQURBVEFfRVJST1IgZXJyID0gTUVUQURBVEFfT0s7CisgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhRGF0YUVuYywgSU5UX1BDTSogY29uc3QgcEF1ZGlvU2FtcGxlcywKKyAgICBjb25zdCBVSU5UIGF1ZGlvU2FtcGxlc0J1ZlNpemUsIGNvbnN0IElOVCBuQXVkaW9TYW1wbGVzKSB7CisgIEZES19NRVRBREFUQV9FUlJPUiBlcnIgPSBNRVRBREFUQV9PSzsKIAotICAgIGlmIChoTWV0YURhdGFFbmMtPm5BdWRpb0RhdGFEZWxheSkgewotICAgICAgaW50IGksIGRlbGF5U2FtcGxlcyA9IGhNZXRhRGF0YUVuYy0+bkF1ZGlvRGF0YURlbGF5KmhNZXRhRGF0YUVuYy0+bkNoYW5uZWxzOworICBpZiAoaE1ldGFEYXRhRW5jLT5uQXVkaW9EYXRhRGVsYXkpIHsKKyAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoc2NyYXRjaF9hdWRpb0RlbGF5QnVmZmVyLCBJTlRfUENNLCAxMDI0KTsKIAotICAgICAgZm9yIChpID0gMDsgaSA8IG5BdWRpb1NhbXBsZXM7IGkrKykgewotICAgICAgICBJTlRfUENNIHRtcCA9IHBBdWRpb1NhbXBsZXNbaV07Ci0gICAgICAgIHBBdWRpb1NhbXBsZXNbaV0gPSBoTWV0YURhdGFFbmMtPmF1ZGlvRGVsYXlCdWZmZXJbaE1ldGFEYXRhRW5jLT5hdWRpb0RlbGF5SWR4XTsKLSAgICAgICAgaE1ldGFEYXRhRW5jLT5hdWRpb0RlbGF5QnVmZmVyW2hNZXRhRGF0YUVuYy0+YXVkaW9EZWxheUlkeF0gPSB0bXA7CisgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBoTWV0YURhdGFFbmMtPm5DaGFubmVsczsgYysrKSB7CisgICAgICBpbnQgTSA9IDEwMjQ7CisgICAgICBJTlRfUENNKiBwQXVkaW9TYW1wbGVzMiA9IHBBdWRpb1NhbXBsZXMgKyBjICogYXVkaW9TYW1wbGVzQnVmU2l6ZTsKKyAgICAgIGludCBkZWxheUlkeCA9IGhNZXRhRGF0YUVuYy0+bkF1ZGlvRGF0YURlbGF5OwogCi0gICAgICAgIGhNZXRhRGF0YUVuYy0+YXVkaW9EZWxheUlkeCsrOwotICAgICAgICBpZiAoaE1ldGFEYXRhRW5jLT5hdWRpb0RlbGF5SWR4ID49IGRlbGF5U2FtcGxlcykgaE1ldGFEYXRhRW5jLT5hdWRpb0RlbGF5SWR4ID0gMDsKLSAgICAgIH0KKyAgICAgIGRvIHsKKyAgICAgICAgTSA9IGZNaW4oTSwgZGVsYXlJZHgpOworICAgICAgICBkZWxheUlkeCAtPSBNOworCisgICAgICAgIEZES21lbWNweSgmc2NyYXRjaF9hdWRpb0RlbGF5QnVmZmVyWzBdLAorICAgICAgICAgICAgICAgICAgJnBBdWRpb1NhbXBsZXMyWyhuQXVkaW9TYW1wbGVzIC0gTSldLCBzaXplb2YoSU5UX1BDTSkgKiBNKTsKKyAgICAgICAgRkRLbWVtbW92ZSgmcEF1ZGlvU2FtcGxlczJbTV0sICZwQXVkaW9TYW1wbGVzMlswXSwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoSU5UX1BDTSkgKiAobkF1ZGlvU2FtcGxlcyAtIE0pKTsKKyAgICAgICAgRkRLbWVtY3B5KAorICAgICAgICAgICAgJnBBdWRpb1NhbXBsZXMyWzBdLAorICAgICAgICAgICAgJmhNZXRhRGF0YUVuYy0+cEF1ZGlvRGVsYXlCdWZmZXJbZGVsYXlJZHggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAqIGhNZXRhRGF0YUVuYy0+bkF1ZGlvRGF0YURlbGF5XSwKKyAgICAgICAgICAgIHNpemVvZihJTlRfUENNKSAqIE0pOworICAgICAgICBGREttZW1jcHkoCisgICAgICAgICAgICAmaE1ldGFEYXRhRW5jLT5wQXVkaW9EZWxheUJ1ZmZlcltkZWxheUlkeCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICogaE1ldGFEYXRhRW5jLT5uQXVkaW9EYXRhRGVsYXldLAorICAgICAgICAgICAgJnNjcmF0Y2hfYXVkaW9EZWxheUJ1ZmZlclswXSwgc2l6ZW9mKElOVF9QQ00pICogTSk7CisKKyAgICAgIH0gd2hpbGUgKGRlbGF5SWR4ID4gMCk7CiAgICAgfQogCi0gICAgcmV0dXJuIGVycjsKKyAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHNjcmF0Y2hfYXVkaW9EZWxheUJ1ZmZlciwgSU5UX1BDTSwgMTAyNCk7CisgIH0KKworICByZXR1cm4gZXJyOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02NTEsMjE5ICs4MDgsMzc3IEBACiAKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIEZES19NRVRBREFUQV9FUlJPUiBXcml0ZU1ldGFkYXRhUGF5bG9hZCgKLSAgICAgICAgY29uc3QgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSIGhNZXRhRGF0YSwKLSAgICAgICAgY29uc3QgQUFDX01FVEFEQVRBICogY29uc3QgICAgICAgIHBNZXRhZGF0YQotICAgICAgICApCi17Ci0gICAgRkRLX01FVEFEQVRBX0VSUk9SIGVyciA9IE1FVEFEQVRBX09LOworICAgIGNvbnN0IEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiBoTWV0YURhdGEsCisgICAgY29uc3QgQUFDX01FVEFEQVRBKiBjb25zdCBwTWV0YWRhdGEpIHsKKyAgRkRLX01FVEFEQVRBX0VSUk9SIGVyciA9IE1FVEFEQVRBX09LOwogCi0gICAgaWYgKCAoaE1ldGFEYXRhPT1OVUxMKSB8fCAocE1ldGFkYXRhPT1OVUxMKSApIHsKLSAgICAgICAgZXJyID0gTUVUQURBVEFfSU5WQUxJRF9IQU5ETEU7Ci0gICAgICAgIGdvdG8gYmFpbDsKKyAgaWYgKChoTWV0YURhdGEgPT0gTlVMTCkgfHwgKHBNZXRhZGF0YSA9PSBOVUxMKSkgeworICAgIGVyciA9IE1FVEFEQVRBX0lOVkFMSURfSEFORExFOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIGhNZXRhRGF0YS0+bkV4dGVuc2lvbnMgPSAwOworICBoTWV0YURhdGEtPm1hdHJpeF9taXhkb3duX2lkeCA9IC0xOworCisgIGlmIChwTWV0YWRhdGEtPm1ldGFkYXRhTW9kZSAhPSAwKSB7CisgICAgLyogQUFDLURSQyAqLworICAgIGlmICgocE1ldGFkYXRhLT5tZXRhZGF0YU1vZGUgPT0gMSkgfHwgKHBNZXRhZGF0YS0+bWV0YWRhdGFNb2RlID09IDIpKSB7CisgICAgICBoTWV0YURhdGEtPmV4UGF5bG9hZFtoTWV0YURhdGEtPm5FeHRlbnNpb25zXS5wRGF0YSA9CisgICAgICAgICAgaE1ldGFEYXRhLT5kcmNJbmZvUGF5bG9hZDsKKyAgICAgIGhNZXRhRGF0YS0+ZXhQYXlsb2FkW2hNZXRhRGF0YS0+bkV4dGVuc2lvbnNdLmRhdGFUeXBlID0gRVhUX0RZTkFNSUNfUkFOR0U7CisgICAgICBoTWV0YURhdGEtPmV4UGF5bG9hZFtoTWV0YURhdGEtPm5FeHRlbnNpb25zXS5hc3NvY2lhdGVkQ2hFbGVtZW50ID0gLTE7CisKKyAgICAgIGhNZXRhRGF0YS0+ZXhQYXlsb2FkW2hNZXRhRGF0YS0+bkV4dGVuc2lvbnNdLmRhdGFTaXplID0KKyAgICAgICAgICBXcml0ZUR5bmFtaWNSYW5nZUluZm9QYXlsb2FkKAorICAgICAgICAgICAgICBwTWV0YWRhdGEsIGhNZXRhRGF0YS0+ZXhQYXlsb2FkW2hNZXRhRGF0YS0+bkV4dGVuc2lvbnNdLnBEYXRhKTsKKworICAgICAgaE1ldGFEYXRhLT5uRXh0ZW5zaW9ucysrOworICAgIH0gLyogcE1ldGFkYXRhLT5tZXRhZGF0YU1vZGU9PTEgfHwgcE1ldGFkYXRhLT5tZXRhZGF0YU1vZGU9PTIgKi8KKworICAgIC8qIE1hdHJpeCBNaXhkb3duIENvZWZmaWNpZW50IGluIFBDRSAqLworICAgIGlmIChwTWV0YWRhdGEtPldyaXRlUENFTWl4RHduSWR4KSB7CisgICAgICBoTWV0YURhdGEtPm1hdHJpeF9taXhkb3duX2lkeCA9CisgICAgICAgICAgc3VybWl4Mm1hdHJpeF9taXhkb3duX2lkeFtwTWV0YWRhdGEtPnN1cnJvdW5kTWl4TGV2ZWxdOwogICAgIH0KIAotICAgIGhNZXRhRGF0YS0+bkV4dGVuc2lvbnMgPSAwOwotICAgIGhNZXRhRGF0YS0+bWF0cml4X21peGRvd25faWR4ID0gLTE7Ci0KLSAgICAvKiBBQUMtRFJDICovCi0gICAgaWYgKHBNZXRhZGF0YS0+bWV0YWRhdGFNb2RlICE9IDApCisgICAgLyogRVRTSSBUUyAxMDEgMTU0IChEVkIpIC0gTVBFRzQgYW5jaWxsYXJ5X2RhdGEoKSAqLworICAgIGlmICgocE1ldGFkYXRhLT5tZXRhZGF0YU1vZGUgPT0gMikgfHwKKyAgICAgICAgKHBNZXRhZGF0YS0+bWV0YWRhdGFNb2RlID09IDMpKSAvKiBNUDRfTUVUQURBVEFfTVBFR19FVFNJICovCiAgICAgewotICAgICAgICBoTWV0YURhdGEtPmV4UGF5bG9hZFtoTWV0YURhdGEtPm5FeHRlbnNpb25zXS5wRGF0YSAgICAgICAgICAgICAgID0gaE1ldGFEYXRhLT5kcmNJbmZvUGF5bG9hZDsKLSAgICAgICAgaE1ldGFEYXRhLT5leFBheWxvYWRbaE1ldGFEYXRhLT5uRXh0ZW5zaW9uc10uZGF0YVR5cGUgICAgICAgICAgICA9IEVYVF9EWU5BTUlDX1JBTkdFOwotICAgICAgICBoTWV0YURhdGEtPmV4UGF5bG9hZFtoTWV0YURhdGEtPm5FeHRlbnNpb25zXS5hc3NvY2lhdGVkQ2hFbGVtZW50ID0gLTE7CisgICAgICBoTWV0YURhdGEtPmV4UGF5bG9hZFtoTWV0YURhdGEtPm5FeHRlbnNpb25zXS5wRGF0YSA9CisgICAgICAgICAgaE1ldGFEYXRhLT5kcmNEc2VQYXlsb2FkOworICAgICAgaE1ldGFEYXRhLT5leFBheWxvYWRbaE1ldGFEYXRhLT5uRXh0ZW5zaW9uc10uZGF0YVR5cGUgPSBFWFRfREFUQV9FTEVNRU5UOworICAgICAgaE1ldGFEYXRhLT5leFBheWxvYWRbaE1ldGFEYXRhLT5uRXh0ZW5zaW9uc10uYXNzb2NpYXRlZENoRWxlbWVudCA9IC0xOwogCi0gICAgICAgIGhNZXRhRGF0YS0+ZXhQYXlsb2FkW2hNZXRhRGF0YS0+bkV4dGVuc2lvbnNdLmRhdGFTaXplID0KLSAgICAgICAgICAgICAgV3JpdGVEeW5hbWljUmFuZ2VJbmZvUGF5bG9hZChwTWV0YWRhdGEsIGhNZXRhRGF0YS0+ZXhQYXlsb2FkW2hNZXRhRGF0YS0+bkV4dGVuc2lvbnNdLnBEYXRhKTsKKyAgICAgIGhNZXRhRGF0YS0+ZXhQYXlsb2FkW2hNZXRhRGF0YS0+bkV4dGVuc2lvbnNdLmRhdGFTaXplID0KKyAgICAgICAgICBXcml0ZUV0c2lBbmNpbGxhcnlEYXRhUGF5bG9hZCgKKyAgICAgICAgICAgICAgcE1ldGFkYXRhLCBoTWV0YURhdGEtPmV4UGF5bG9hZFtoTWV0YURhdGEtPm5FeHRlbnNpb25zXS5wRGF0YSk7CiAKLSAgICAgICAgaE1ldGFEYXRhLT5uRXh0ZW5zaW9ucysrOworICAgICAgaE1ldGFEYXRhLT5uRXh0ZW5zaW9ucysrOworICAgIH0gLyogbWV0YWRhdGFNb2RlPT0yIHx8IG1ldGFkYXRhTW9kZT09MyAqLwogCi0gICAgICAgIC8qIE1hdHJpeCBNaXhkb3duIENvZWZmaWNpZW50IGluIFBDRSAqLwotICAgICAgICBpZiAocE1ldGFkYXRhLT5Xcml0ZVBDRU1peER3bklkeCkgewotICAgICAgICAgICAgaE1ldGFEYXRhLT5tYXRyaXhfbWl4ZG93bl9pZHggPSBzdXJtaXgybWF0cml4X21peGRvd25faWR4W3BNZXRhZGF0YS0+c3Vycm91bmRNaXhMZXZlbF07Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBFVFNJIFRTIDEwMSAxNTQgKERWQikgLSBNUEVHNCBhbmNpbGxhcnlfZGF0YSgpICovCi0gICAgICAgIGlmIChwTWV0YWRhdGEtPm1ldGFkYXRhTW9kZSA9PSAyKSAvKiBNUDRfTUVUQURBVEFfTVBFR19FVFNJICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGhNZXRhRGF0YS0+ZXhQYXlsb2FkW2hNZXRhRGF0YS0+bkV4dGVuc2lvbnNdLnBEYXRhICAgICAgICAgICAgICAgPSBoTWV0YURhdGEtPmRyY0RzZVBheWxvYWQ7Ci0gICAgICAgICAgICBoTWV0YURhdGEtPmV4UGF5bG9hZFtoTWV0YURhdGEtPm5FeHRlbnNpb25zXS5kYXRhVHlwZSAgICAgICAgICAgID0gRVhUX0RBVEFfRUxFTUVOVDsKLSAgICAgICAgICAgIGhNZXRhRGF0YS0+ZXhQYXlsb2FkW2hNZXRhRGF0YS0+bkV4dGVuc2lvbnNdLmFzc29jaWF0ZWRDaEVsZW1lbnQgPSAtMTsKLQotICAgICAgICAgICAgaE1ldGFEYXRhLT5leFBheWxvYWRbaE1ldGFEYXRhLT5uRXh0ZW5zaW9uc10uZGF0YVNpemUgPQotICAgICAgICAgICAgICAgICBXcml0ZUV0c2lBbmNpbGxhcnlEYXRhUGF5bG9hZChwTWV0YWRhdGEsaE1ldGFEYXRhLT5leFBheWxvYWRbaE1ldGFEYXRhLT5uRXh0ZW5zaW9uc10ucERhdGEpOwotCi0gICAgICAgICAgICBoTWV0YURhdGEtPm5FeHRlbnNpb25zKys7Ci0gICAgICAgIH0gLyogbWV0YWRhdGFNb2RlID09IDIgKi8KLQotICAgIH0gLyogbWV0YWRhdGFNb2RlICE9IDAgKi8KKyAgfSAvKiBtZXRhZGF0YU1vZGUgIT0gMCAqLwogCiBiYWlsOgotICAgIHJldHVybiBlcnI7CisgIHJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBJTlQgV3JpdGVEeW5hbWljUmFuZ2VJbmZvUGF5bG9hZCgKLSAgICAgICAgY29uc3QgQUFDX01FVEFEQVRBKiBjb25zdCBwTWV0YWRhdGEsCi0gICAgICAgIFVDSEFSKiBjb25zdCAgICAgICAgICAgICAgcEV4dGVuc2lvblBheWxvYWQKLSAgICAgICAgKQotewotICAgIGNvbnN0IElOVCBwY2VfdGFnX3ByZXNlbnQgPSAwOyAgICAgICAgLyogeWV0IGZpeGVkIHNldHRpbmchICovCi0gICAgY29uc3QgSU5UIHByb2dfcmVmX2xldl9yZXNfYml0cyA9IDA7Ci0gICAgSU5UIGksIGRyY19udW1fYmFuZHMgPSAxOworc3RhdGljIElOVCBXcml0ZUR5bmFtaWNSYW5nZUluZm9QYXlsb2FkKGNvbnN0IEFBQ19NRVRBREFUQSogY29uc3QgcE1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSKiBjb25zdCBwRXh0ZW5zaW9uUGF5bG9hZCkgeworICBjb25zdCBJTlQgcGNlX3RhZ19wcmVzZW50ID0gMDsgLyogeWV0IGZpeGVkIHNldHRpbmchICovCisgIGNvbnN0IElOVCBwcm9nX3JlZl9sZXZfcmVzX2JpdHMgPSAwOworICBJTlQgaSwgZHJjX251bV9iYW5kcyA9IDE7CiAKLSAgICBGREtfQklUU1RSRUFNIGJzV3JpdGVyOwotICAgIEZES2luaXRCaXRTdHJlYW0oJmJzV3JpdGVyLCBwRXh0ZW5zaW9uUGF5bG9hZCwgMTYsIDAsIEJTX1dSSVRFUik7CisgIEZES19CSVRTVFJFQU0gYnNXcml0ZXI7CisgIEZES2luaXRCaXRTdHJlYW0oJmJzV3JpdGVyLCBwRXh0ZW5zaW9uUGF5bG9hZCwgMTYsIDAsIEJTX1dSSVRFUik7CiAKLSAgICAvKiBkeW5hbWljX3JhbmdlX2luZm8oKSAqLwotICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBjZV90YWdfcHJlc2VudCwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwY2VfdGFnX3ByZXNlbnQgKi8KLSAgICBpZiAocGNlX3RhZ19wcmVzZW50KSB7Ci0gICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAweDAsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBjZV9pbnN0YW5jZV90YWcgKi8KLSAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDB4MCwgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHJjX3RhZ19yZXNlcnZlZF9iaXRzICovCi0gICB9CisgIC8qIGR5bmFtaWNfcmFuZ2VfaW5mbygpICovCisgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBjZV90YWdfcHJlc2VudCwgMSk7IC8qIHBjZV90YWdfcHJlc2VudCAqLworICBpZiAocGNlX3RhZ19wcmVzZW50KSB7CisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMHgwLCA0KTsgLyogcGNlX2luc3RhbmNlX3RhZyAqLworICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDB4MCwgNCk7IC8qIGRyY190YWdfcmVzZXJ2ZWRfYml0cyAqLworICB9CiAKLSAgICAvKiBFeGNsdWRlIGNoYW5uZWxzICovCi0gICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgKHBNZXRhZGF0YS0+bXBlZ0RyYy5leGNsdWRlZF9jaG5zX3ByZXNlbnQpID8gMSA6IDAsIDEpOyAgICAgIC8qIGV4Y2x1ZGVkX2NobnNfcHJlc2VudCovCisgIC8qIEV4Y2x1ZGUgY2hhbm5lbHMgKi8KKyAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgKHBNZXRhZGF0YS0+bXBlZ0RyYy5leGNsdWRlZF9jaG5zX3ByZXNlbnQpID8gMSA6IDAsCisgICAgICAgICAgICAgICAxKTsgLyogZXhjbHVkZWRfY2huc19wcmVzZW50Ki8KIAotICAgIC8qIE11bHRpYmFuZCBEUkMgKi8KLSAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAocE1ldGFkYXRhLT5tcGVnRHJjLmRyY19iYW5kc19wcmVzZW50KSA/IDEgOiAwLCAxKTsgICAgICAgICAgLyogZHJjX2JhbmRzX3ByZXNlbnQgKi8KLSAgICBpZiAocE1ldGFkYXRhLT5tcGVnRHJjLmRyY19iYW5kc19wcmVzZW50KQotICAgIHsKLSAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBNZXRhZGF0YS0+bXBlZ0RyYy5kcmNfYmFuZF9pbmNyLCA0KTsgICAgICAgICAgICAgICAgICAgICAgLyogZHJjX2JhbmRfaW5jciAqLwotICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5tcGVnRHJjLmRyY19pbnRlcnBvbGF0aW9uX3NjaGVtZSwgNCk7ICAgICAgICAgICAvKiBkcmNfaW50ZXJwb2xhdGlvbl9zY2hlbWUgKi8KLSAgICAgIGRyY19udW1fYmFuZHMgKz0gcE1ldGFkYXRhLT5tcGVnRHJjLmRyY19iYW5kX2luY3I7Ci0gICAgICBmb3IgKGk9MDsgaTxkcmNfbnVtX2JhbmRzOyBpKyspIHsKLSAgICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5tcGVnRHJjLmRyY19iYW5kX3RvcFtpXSwgOCk7ICAgICAgICAgICAgICAgICAgLyogZHJjX2JhbmRfdG9wICovCi0gICAgICB9CisgIC8qIE11bHRpYmFuZCBEUkMgKi8KKyAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgKHBNZXRhZGF0YS0+bXBlZ0RyYy5kcmNfYmFuZHNfcHJlc2VudCkgPyAxIDogMCwKKyAgICAgICAgICAgICAgIDEpOyAvKiBkcmNfYmFuZHNfcHJlc2VudCAqLworICBpZiAocE1ldGFkYXRhLT5tcGVnRHJjLmRyY19iYW5kc19wcmVzZW50KSB7CisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5tcGVnRHJjLmRyY19iYW5kX2luY3IsCisgICAgICAgICAgICAgICAgIDQpOyAvKiBkcmNfYmFuZF9pbmNyICovCisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5tcGVnRHJjLmRyY19pbnRlcnBvbGF0aW9uX3NjaGVtZSwKKyAgICAgICAgICAgICAgICAgNCk7IC8qIGRyY19pbnRlcnBvbGF0aW9uX3NjaGVtZSAqLworICAgIGRyY19udW1fYmFuZHMgKz0gcE1ldGFkYXRhLT5tcGVnRHJjLmRyY19iYW5kX2luY3I7CisgICAgZm9yIChpID0gMDsgaSA8IGRyY19udW1fYmFuZHM7IGkrKykgeworICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5tcGVnRHJjLmRyY19iYW5kX3RvcFtpXSwKKyAgICAgICAgICAgICAgICAgICA4KTsgLyogZHJjX2JhbmRfdG9wICovCiAgICAgfQorICB9CiAKLSAgICAvKiBQcm9ncmFtIFJlZmVyZW5jZSBMZXZlbCAqLwotICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBNZXRhZGF0YS0+bXBlZ0RyYy5wcm9nX3JlZl9sZXZlbF9wcmVzZW50LCAxKTsgICAgICAgICAgICAgICAvKiBwcm9nX3JlZl9sZXZlbF9wcmVzZW50ICovCi0gICAgaWYgKHBNZXRhZGF0YS0+bXBlZ0RyYy5wcm9nX3JlZl9sZXZlbF9wcmVzZW50KQotICAgIHsKLSAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBNZXRhZGF0YS0+bXBlZ0RyYy5wcm9nX3JlZl9sZXZlbCwgNyk7ICAgICAgICAgICAgICAgICAgICAgLyogcHJvZ19yZWZfbGV2ZWwgKi8KLSAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHByb2dfcmVmX2xldl9yZXNfYml0cywgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvZ19yZWZfbGV2ZWxfcmVzZXJ2ZWRfYml0cyAqLwotICAgIH0KKyAgLyogUHJvZ3JhbSBSZWZlcmVuY2UgTGV2ZWwgKi8KKyAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5tcGVnRHJjLnByb2dfcmVmX2xldmVsX3ByZXNlbnQsCisgICAgICAgICAgICAgICAxKTsgLyogcHJvZ19yZWZfbGV2ZWxfcHJlc2VudCAqLworICBpZiAocE1ldGFkYXRhLT5tcGVnRHJjLnByb2dfcmVmX2xldmVsX3ByZXNlbnQpIHsKKyAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBwTWV0YWRhdGEtPm1wZWdEcmMucHJvZ19yZWZfbGV2ZWwsCisgICAgICAgICAgICAgICAgIDcpOyAvKiBwcm9nX3JlZl9sZXZlbCAqLworICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHByb2dfcmVmX2xldl9yZXNfYml0cywKKyAgICAgICAgICAgICAgICAgMSk7IC8qIHByb2dfcmVmX2xldmVsX3Jlc2VydmVkX2JpdHMgKi8KKyAgfQogCi0gICAgLyogRFJDIFZhbHVlcyAqLwotICAgIGZvciAoaT0wOyBpPGRyY19udW1fYmFuZHM7IGkrKykgewotICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgKHBNZXRhZGF0YS0+bXBlZ0RyYy5keW5fcm5nX3NnbltpXSkgPyAxIDogMCwgMSk7ICAgICAgICAgICAvKiBkeW5fcm5nX3NnblsgKi8KLSAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBNZXRhZGF0YS0+bXBlZ0RyYy5keW5fcm5nX2N0bFtpXSwgNyk7ICAgICAgICAgICAgICAgICAgICAgLyogZHluX3JuZ19jdGwgKi8KLSAgICB9CisgIC8qIERSQyBWYWx1ZXMgKi8KKyAgZm9yIChpID0gMDsgaSA8IGRyY19udW1fYmFuZHM7IGkrKykgeworICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIChwTWV0YWRhdGEtPm1wZWdEcmMuZHluX3JuZ19zZ25baV0pID8gMSA6IDAsCisgICAgICAgICAgICAgICAgIDEpOyAvKiBkeW5fcm5nX3NnblsgKi8KKyAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBwTWV0YWRhdGEtPm1wZWdEcmMuZHluX3JuZ19jdGxbaV0sCisgICAgICAgICAgICAgICAgIDcpOyAvKiBkeW5fcm5nX2N0bCAqLworICB9CiAKLSAgICAvKiByZXR1cm4gbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gZXh0ZW5zaW9uIHBheWxvYWQuICovCi0gICAgcmV0dXJuIEZES2dldFZhbGlkQml0cygmYnNXcml0ZXIpOworICAvKiByZXR1cm4gbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gZXh0ZW5zaW9uIHBheWxvYWQuICovCisgIHJldHVybiBGREtnZXRWYWxpZEJpdHMoJmJzV3JpdGVyKTsKIH0KIAotc3RhdGljIElOVCBXcml0ZUV0c2lBbmNpbGxhcnlEYXRhUGF5bG9hZCgKLSAgICAgICAgY29uc3QgQUFDX01FVEFEQVRBKiBjb25zdCBwTWV0YWRhdGEsCi0gICAgICAgIFVDSEFSKiBjb25zdCAgICAgICAgICAgICAgcEV4dGVuc2lvblBheWxvYWQKLSAgICAgICAgKQotewotICAgIEZES19CSVRTVFJFQU0gYnNXcml0ZXI7Ci0gICAgRkRLaW5pdEJpdFN0cmVhbSgmYnNXcml0ZXIsIHBFeHRlbnNpb25QYXlsb2FkLCAxNiwgMCwgQlNfV1JJVEVSKTsKK3N0YXRpYyBJTlQgV3JpdGVFdHNpQW5jaWxsYXJ5RGF0YVBheWxvYWQoY29uc3QgQUFDX01FVEFEQVRBKiBjb25zdCBwTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSKiBjb25zdCBwRXh0ZW5zaW9uUGF5bG9hZCkgeworICBGREtfQklUU1RSRUFNIGJzV3JpdGVyOworICBGREtpbml0Qml0U3RyZWFtKCZic1dyaXRlciwgcEV4dGVuc2lvblBheWxvYWQsIDE2LCAwLCBCU19XUklURVIpOwogCi0gICAgLyogYW5jaWxsYXJ5X2RhdGFfc3luYyAqLwotICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDB4QkMsIDgpOworICAvKiBhbmNpbGxhcnlfZGF0YV9zeW5jICovCisgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDB4QkMsIDgpOwogCi0gICAgLyogYnNfaW5mbyAqLwotICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDB4MywgMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtcGVnX2F1ZGlvX3R5cGUgKi8KLSAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBwTWV0YWRhdGEtPmRvbGJ5U3Vycm91bmRNb2RlLCAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9sYnlfc3Vycm91bmRfbW9kZSAqLwotICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDB4MCwgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCAqLworICAvKiBic19pbmZvICovCisgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDB4MywgMik7IC8qIG1wZWdfYXVkaW9fdHlwZSAqLworICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBwTWV0YWRhdGEtPmRvbGJ5U3Vycm91bmRNb2RlLAorICAgICAgICAgICAgICAgMik7IC8qIGRvbGJ5X3N1cnJvdW5kX21vZGUgKi8KKyAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5kcmNQcmVzZW50YXRpb25Nb2RlLAorICAgICAgICAgICAgICAgMik7ICAgICAgICAgICAgICAgICAvKiBEUkMgcHJlc2VudGF0aW9uIG1vZGUgKi8KKyAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMHgwLCAxKTsgLyogc3RlcmVvX2Rvd25taXhfbW9kZSAqLworICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAweDAsIDEpOyAvKiByZXNlcnZlZCAqLwogCi0gICAgLyogYW5jaWxsYXJ5X2RhdGFfc3RhdHVzICovCi0gICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMCwgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMgYml0IFJlc2VydmVkLCBzZXQgdG8gIjAiICovCi0gICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgKHBNZXRhZGF0YS0+RG14THZsX09uKSA/IDEgOiAwLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvd25taXhpbmdfbGV2ZWxzX01QRUc0X3N0YXR1cyAqLwotICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDAsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNlcnZlZCwgc2V0IHRvICIwIiAqLwotICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIChwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmNvbXByZXNzaW9uX29uKSA/IDEgOiAwLCAxKTsgICAgICAgICAvKiBhdWRpb19jb2RpbmdfbW9kZV9hbmRfY29tcHJlc3Npb24gc3RhdHVzICovCi0gICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgKHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEudGltZWNvZGVfY29hcnNlX3N0YXR1cykgPyAxIDogMCwgMSk7IC8qIGNvYXJzZV9ncmFpbl90aW1lY29kZV9zdGF0dXMgKi8KLSAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAocE1ldGFkYXRhLT5ldHNpQW5jRGF0YS50aW1lY29kZV9maW5lX3N0YXR1cykgPyAxIDogMCwgMSk7ICAgLyogZmluZV9ncmFpbl90aW1lY29kZV9zdGF0dXMgKi8KKyAgLyogYW5jaWxsYXJ5X2RhdGFfc3RhdHVzICovCisgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDAsIDMpOyAvKiAzIGJpdCBSZXNlcnZlZCwgc2V0IHRvICIwIiAqLworICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAocE1ldGFkYXRhLT5EbXhMdmxfT24pID8gMSA6IDAsCisgICAgICAgICAgICAgICAxKTsgLyogZG93bm1peGluZ19sZXZlbHNfTVBFRzRfc3RhdHVzICovCisgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YVN0YXR1cywKKyAgICAgICAgICAgICAgIDEpOyAvKiBleHRfYW5jX2RhdGFfc3RhdHVzICovCisgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIChwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmNvbXByZXNzaW9uX29uKSA/IDEgOiAwLAorICAgICAgICAgICAgICAgMSk7IC8qIGF1ZGlvX2NvZGluZ19tb2RlX2FuZF9jb21wcmVzc2lvbiBzdGF0dXMgKi8KKyAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwKKyAgICAgICAgICAgICAgIChwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLnRpbWVjb2RlX2NvYXJzZV9zdGF0dXMpID8gMSA6IDAsCisgICAgICAgICAgICAgICAxKTsgLyogY29hcnNlX2dyYWluX3RpbWVjb2RlX3N0YXR1cyAqLworICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAocE1ldGFkYXRhLT5ldHNpQW5jRGF0YS50aW1lY29kZV9maW5lX3N0YXR1cykgPyAxIDogMCwKKyAgICAgICAgICAgICAgIDEpOyAvKiBmaW5lX2dyYWluX3RpbWVjb2RlX3N0YXR1cyAqLwogCi0gICAgLyogZG93bm1peGluZ19sZXZlbHNfTVBFRzRfc3RhdHVzICovCi0gICAgaWYgKHBNZXRhZGF0YS0+RG14THZsX09uKSB7Ci0gICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBlbmNvZGVEbXhMdmxzKHBNZXRhZGF0YS0+Y2VudGVyTWl4TGV2ZWwsIHBNZXRhZGF0YS0+c3Vycm91bmRNaXhMZXZlbCksIDgpOworICAvKiBkb3dubWl4aW5nX2xldmVsc19NUEVHNF9zdGF0dXMgKi8KKyAgaWYgKHBNZXRhZGF0YS0+RG14THZsX09uKSB7CisgICAgRkRLd3JpdGVCaXRzKAorICAgICAgICAmYnNXcml0ZXIsCisgICAgICAgIGVuY29kZURteEx2bHMocE1ldGFkYXRhLT5jZW50ZXJNaXhMZXZlbCwgcE1ldGFkYXRhLT5zdXJyb3VuZE1peExldmVsKSwKKyAgICAgICAgOCk7CisgIH0KKworICAvKiBhdWRpb19jb2RpbmdfbW9kZV9hbmRfY29tcHJlc3Npb25fc3RhdHVzICovCisgIGlmIChwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmNvbXByZXNzaW9uX29uKSB7CisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMHgwMSwgOCk7IC8qIGF1ZGlvIGNvZGluZyBtb2RlICovCisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5jb21wcmVzc2lvbl92YWx1ZSwKKyAgICAgICAgICAgICAgICAgOCk7IC8qIGNvbXByZXNzaW9uIHZhbHVlICovCisgIH0KKworICAvKiBncmFpbi10aW1lY29kZSBjb2Fyc2UvZmluZSAqLworICBpZiAocE1ldGFkYXRhLT5ldHNpQW5jRGF0YS50aW1lY29kZV9jb2Fyc2Vfc3RhdHVzKSB7CisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMHgwLCAxNik7IC8qIG5vdCB5ZXQgc3VwcG9ydGVkICovCisgIH0KKworICBpZiAocE1ldGFkYXRhLT5ldHNpQW5jRGF0YS50aW1lY29kZV9maW5lX3N0YXR1cykgeworICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDB4MCwgMTYpOyAvKiBub3QgeWV0IHN1cHBvcnRlZCAqLworICB9CisKKyAgLyogZXh0ZW5kZWQgYW5jaWxsYXJ5IGRhdGEgc3RydWN0dXJlICovCisgIGlmIChwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGFTdGF0dXMpIHsKKyAgICAvKiBleHRfYW5jaWxsYXJ5X2RhdGFfc3RhdHVzICovCisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMCwgMSk7IC8qIFJlc2VydmVkLCBzZXQgdG8gIjAiICovCisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwKKyAgICAgICAgICAgICAgICAgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmV4dF9kb3dubWl4X2x2bF9zdGF0dXMsCisgICAgICAgICAgICAgICAgIDEpOyAvKiBleHRfZG93bm1peGluZ19sZXZlbHNfc3RhdHVzICovCisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwKKyAgICAgICAgICAgICAgICAgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmV4dF9kb3dubWl4X2dhaW5fc3RhdHVzLAorICAgICAgICAgICAgICAgICAxKTsgLyogZXh0X2Rvd25taXhpbmdfZ2xvYmFsX2dhaW5zX3N0YXR1cyAqLworICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsCisgICAgICAgICAgICAgICAgIHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfbGZlX2Rvd25taXhfc3RhdHVzLAorICAgICAgICAgICAgICAgICAxKTsgICAgICAgICAgICAgICAvKiBleHRfZG93bm1peGluZ19sZmVfbGV2ZWxfc3RhdHVzIiAqLworICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDAsIDQpOyAvKiBSZXNlcnZlZCwgc2V0IHRvICIwIiAqLworCisgICAgLyogZXh0X2Rvd25taXhpbmdfbGV2ZWxzICovCisgICAgaWYgKHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfZG93bm1peF9sdmxfc3RhdHVzKSB7CisgICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZXh0X2RtaXhfYV9pZHgsCisgICAgICAgICAgICAgICAgICAgMyk7IC8qIGRtaXhfYV9pZHggKi8KKyAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfZG1peF9iX2lkeCwKKyAgICAgICAgICAgICAgICAgICAzKTsgICAgICAgICAgICAgICAvKiBkbWl4X2JfaWR4ICovCisgICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAwLCAyKTsgLyogUmVzZXJ2ZWQsIHNldCB0byAiMCIgKi8KICAgICB9CiAKLSAgICAvKiBhdWRpb19jb2RpbmdfbW9kZV9hbmRfY29tcHJlc3Npb25fc3RhdHVzICovCi0gICAgaWYgKHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuY29tcHJlc3Npb25fb24pIHsKLSAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDB4MDEsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXVkaW8gY29kaW5nIG1vZGUgKi8KLSAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuY29tcHJlc3Npb25fdmFsdWUsIDgpOyAgICAgICAgICAgICAgLyogY29tcHJlc3Npb24gdmFsdWUgKi8KKyAgICAvKiBleHRfZG93bm1peGluZ19nYWlucyAqLworICAgIGlmIChwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZXh0X2Rvd25taXhfZ2Fpbl9zdGF0dXMpIHsKKyAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5kbXhfZ2Fpbl81X3NnbiwKKyAgICAgICAgICAgICAgICAgICAxKTsgLyogZG14X2dhaW5fNV9zaWduICovCisgICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBwTWV0YWRhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZG14X2dhaW5fNV9pZHgsCisgICAgICAgICAgICAgICAgICAgNik7ICAgICAgICAgICAgICAgLyogZG14X2dhaW5fNV9pZHggKi8KKyAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIDAsIDEpOyAvKiBSZXNlcnZlZCwgc2V0IHRvICIwIiAqLworICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgcE1ldGFkYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmRteF9nYWluXzJfc2duLAorICAgICAgICAgICAgICAgICAgIDEpOyAvKiBkbXhfZ2Fpbl8yX3NpZ24gKi8KKyAgICAgIEZES3dyaXRlQml0cygmYnNXcml0ZXIsIHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5kbXhfZ2Fpbl8yX2lkeCwKKyAgICAgICAgICAgICAgICAgICA2KTsgICAgICAgICAgICAgICAvKiBkbXhfZ2Fpbl8yX2lkeCAqLworICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMCwgMSk7IC8qIFJlc2VydmVkLCBzZXQgdG8gIjAiICovCiAgICAgfQogCi0gICAgLyogZ3JhaW4tdGltZWNvZGUgY29hcnNlL2ZpbmUgKi8KLSAgICBpZiAocE1ldGFkYXRhLT5ldHNpQW5jRGF0YS50aW1lY29kZV9jb2Fyc2Vfc3RhdHVzKSB7Ci0gICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCAweDAsIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCB5ZXQgc3VwcG9ydGVkICovCisgICAgaWYgKHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfbGZlX2Rvd25taXhfc3RhdHVzKSB7CisgICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLAorICAgICAgICAgICAgICAgICAgIHBNZXRhZGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfZG1peF9sZmVfaWR4LAorICAgICAgICAgICAgICAgICAgIDQpOyAgICAgICAgICAgICAgIC8qIGRtaXhfbGZlX2lkeCAqLworICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMCwgNCk7IC8qIFJlc2VydmVkLCBzZXQgdG8gIjAiICovCiAgICAgfQorICB9CiAKLSAgICBpZiAocE1ldGFkYXRhLT5ldHNpQW5jRGF0YS50aW1lY29kZV9maW5lX3N0YXR1cykgewotICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgMHgwLCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgeWV0IHN1cHBvcnRlZCAqLwotICAgIH0KLQotICAgIHJldHVybiBGREtnZXRWYWxpZEJpdHMoJmJzV3JpdGVyKTsKKyAgcmV0dXJuIEZES2dldFZhbGlkQml0cygmYnNXcml0ZXIpOwogfQogCi0KIHN0YXRpYyBGREtfTUVUQURBVEFfRVJST1IgTG9hZFN1Ym1pdHRlZE1ldGFkYXRhKAotICAgICAgICBjb25zdCBBQUNFTkNfTWV0YURhdGEgKiBjb25zdCAgIGhNZXRhZGF0YSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFNb2RlLAotICAgICAgICBBQUNfTUVUQURBVEEgKiBjb25zdCAgICAgICAgICAgIHBBYWNNZXRhRGF0YQotICAgICAgICApCi17Ci0gICAgRkRLX01FVEFEQVRBX0VSUk9SIGVyciA9IE1FVEFEQVRBX09LOworICAgIGNvbnN0IEFBQ0VOQ19NZXRhRGF0YSogY29uc3QgaE1ldGFkYXRhLCBjb25zdCBJTlQgbkNoYW5uZWxzLAorICAgIGNvbnN0IElOVCBtZXRhZGF0YU1vZGUsIEFBQ19NRVRBREFUQSogY29uc3QgcEFhY01ldGFEYXRhKSB7CisgIEZES19NRVRBREFUQV9FUlJPUiBlcnIgPSBNRVRBREFUQV9PSzsKIAotICAgIGlmIChwQWFjTWV0YURhdGE9PU5VTEwpIHsKLSAgICAgIGVyciA9IE1FVEFEQVRBX0lOVkFMSURfSEFORExFOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8qIGluaXQgc3RydWN0ICovCi0gICAgICBGREttZW1jbGVhcihwQWFjTWV0YURhdGEsIHNpemVvZihBQUNfTUVUQURBVEEpKTsKKyAgaWYgKHBBYWNNZXRhRGF0YSA9PSBOVUxMKSB7CisgICAgZXJyID0gTUVUQURBVEFfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgLyogaW5pdCBzdHJ1Y3QgKi8KKyAgICBGREttZW1jbGVhcihwQWFjTWV0YURhdGEsIHNpemVvZihBQUNfTUVUQURBVEEpKTsKIAotICAgICAgaWYgKGhNZXRhZGF0YSE9TlVMTCkgewotICAgICAgICAvKiBjb252ZXJ0IGRhdGEgKi8KLSAgICAgICAgcEFhY01ldGFEYXRhLT5tcGVnRHJjLmRyY19wcm9maWxlICAgICAgICAgICAgPSBoTWV0YWRhdGEtPmRyY19wcm9maWxlOwotICAgICAgICBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmNvbXBfcHJvZmlsZSAgICAgICA9IGhNZXRhZGF0YS0+Y29tcF9wcm9maWxlOwotICAgICAgICBwQWFjTWV0YURhdGEtPm1wZWdEcmMuZHJjX1RhcmdldFJlZkxldmVsICAgICA9IGhNZXRhZGF0YS0+ZHJjX1RhcmdldFJlZkxldmVsOwotICAgICAgICBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmNvbXBfVGFyZ2V0UmVmTGV2ZWw9IGhNZXRhZGF0YS0+Y29tcF9UYXJnZXRSZWZMZXZlbDsKLSAgICAgICAgcEFhY01ldGFEYXRhLT5tcGVnRHJjLnByb2dfcmVmX2xldmVsX3ByZXNlbnQgPSBoTWV0YWRhdGEtPnByb2dfcmVmX2xldmVsX3ByZXNlbnQ7Ci0gICAgICAgIHBBYWNNZXRhRGF0YS0+bXBlZ0RyYy5wcm9nX3JlZl9sZXZlbCAgICAgICAgID0gZGlhbG5vcm0ycHJvZ3JlZmx2bChoTWV0YWRhdGEtPnByb2dfcmVmX2xldmVsKTsKKyAgICBpZiAoaE1ldGFkYXRhICE9IE5VTEwpIHsKKyAgICAgIC8qIGNvbnZlcnQgZGF0YSAqLworICAgICAgcEFhY01ldGFEYXRhLT5tcGVnRHJjLmRyY19wcm9maWxlID0gaE1ldGFkYXRhLT5kcmNfcHJvZmlsZTsKKyAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuY29tcF9wcm9maWxlID0gaE1ldGFkYXRhLT5jb21wX3Byb2ZpbGU7CisgICAgICBwQWFjTWV0YURhdGEtPm1wZWdEcmMuZHJjX1RhcmdldFJlZkxldmVsID0gaE1ldGFkYXRhLT5kcmNfVGFyZ2V0UmVmTGV2ZWw7CisgICAgICBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmNvbXBfVGFyZ2V0UmVmTGV2ZWwgPQorICAgICAgICAgIGhNZXRhZGF0YS0+Y29tcF9UYXJnZXRSZWZMZXZlbDsKKyAgICAgIHBBYWNNZXRhRGF0YS0+bXBlZ0RyYy5wcm9nX3JlZl9sZXZlbF9wcmVzZW50ID0KKyAgICAgICAgICBoTWV0YWRhdGEtPnByb2dfcmVmX2xldmVsX3ByZXNlbnQ7CisgICAgICBwQWFjTWV0YURhdGEtPm1wZWdEcmMucHJvZ19yZWZfbGV2ZWwgPQorICAgICAgICAgIGRpYWxub3JtMnByb2dyZWZsdmwoaE1ldGFkYXRhLT5wcm9nX3JlZl9sZXZlbCk7CiAKLSAgICAgICAgcEFhY01ldGFEYXRhLT5jZW50ZXJNaXhMZXZlbCAgICAgICAgICAgICAgICAgPSBoTWV0YWRhdGEtPmNlbnRlck1peExldmVsOwotICAgICAgICBwQWFjTWV0YURhdGEtPnN1cnJvdW5kTWl4TGV2ZWwgICAgICAgICAgICAgICA9IGhNZXRhZGF0YS0+c3Vycm91bmRNaXhMZXZlbDsKLSAgICAgICAgcEFhY01ldGFEYXRhLT5Xcml0ZVBDRU1peER3bklkeCAgICAgICAgICAgICAgPSBoTWV0YWRhdGEtPlBDRV9taXhkb3duX2lkeF9wcmVzZW50OwotICAgICAgICBwQWFjTWV0YURhdGEtPkRteEx2bF9PbiAgICAgICAgICAgICAgICAgICAgICA9IGhNZXRhZGF0YS0+RVRTSV9EbXhMdmxfcHJlc2VudDsKKyAgICAgIHBBYWNNZXRhRGF0YS0+Y2VudGVyTWl4TGV2ZWwgPSBoTWV0YWRhdGEtPmNlbnRlck1peExldmVsOworICAgICAgcEFhY01ldGFEYXRhLT5zdXJyb3VuZE1peExldmVsID0gaE1ldGFkYXRhLT5zdXJyb3VuZE1peExldmVsOworICAgICAgcEFhY01ldGFEYXRhLT5Xcml0ZVBDRU1peER3bklkeCA9IGhNZXRhZGF0YS0+UENFX21peGRvd25faWR4X3ByZXNlbnQ7CisgICAgICBwQWFjTWV0YURhdGEtPkRteEx2bF9PbiA9IGhNZXRhZGF0YS0+RVRTSV9EbXhMdmxfcHJlc2VudDsKIAotICAgICAgICBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmNvbXByZXNzaW9uX29uID0gMTsKKyAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuY29tcHJlc3Npb25fb24gPQorICAgICAgICAgIChoTWV0YWRhdGEtPmNvbXBfcHJvZmlsZSA9PSBBQUNFTkNfTUVUQURBVEFfRFJDX05PVF9QUkVTRU5UID8gMCA6IDEpOwogCisgICAgICBpZiAocEFhY01ldGFEYXRhLT5tcGVnRHJjLmRyY19wcm9maWxlID09CisgICAgICAgICAgQUFDRU5DX01FVEFEQVRBX0RSQ19OT1RfUFJFU0VOVCkgeworICAgICAgICBwQWFjTWV0YURhdGEtPm1wZWdEcmMuZHJjX3Byb2ZpbGUgPQorICAgICAgICAgICAgQUFDRU5DX01FVEFEQVRBX0RSQ19OT05FOyAvKiBNUEVHIERSQyBnYWlucyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx3YXlzIHByZXNlbnQgaW4gQlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4ICovCisgICAgICAgIC8qIHdlIHNob3VsZCBnaXZlIGEgd2FybmluZywgYnV0IEVycm9ySGFuZGxlciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgKi8KKyAgICAgIH0KIAotICAgICAgICBpZiAobkNoYW5uZWxzID09IDIpIHsKLSAgICAgICAgICBwQWFjTWV0YURhdGEtPmRvbGJ5U3Vycm91bmRNb2RlID0gaE1ldGFkYXRhLT5kb2xieVN1cnJvdW5kTW9kZTsgICAgIC8qIGRvbGJ5X3N1cnJvdW5kX21vZGUgKi8KKyAgICAgIGlmIChuQ2hhbm5lbHMgPT0gMikgeworICAgICAgICBwQWFjTWV0YURhdGEtPmRvbGJ5U3Vycm91bmRNb2RlID0KKyAgICAgICAgICAgIGhNZXRhZGF0YS0+ZG9sYnlTdXJyb3VuZE1vZGU7IC8qIGRvbGJ5X3N1cnJvdW5kX21vZGUgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBBYWNNZXRhRGF0YS0+ZG9sYnlTdXJyb3VuZE1vZGUgPSAwOworICAgICAgfQorCisgICAgICBwQWFjTWV0YURhdGEtPmRyY1ByZXNlbnRhdGlvbk1vZGUgPSBoTWV0YWRhdGEtPmRyY1ByZXNlbnRhdGlvbk1vZGU7CisgICAgICAvKiBvdmVycmlkZSBleHRlcm5hbCB2YWx1ZXMgaWYgRFZCIERSQyBwcmVzZW50YXRpb24gbW9kZSBpcyBnaXZlbiAqLworICAgICAgaWYgKHBBYWNNZXRhRGF0YS0+ZHJjUHJlc2VudGF0aW9uTW9kZSA9PSAxKSB7CisgICAgICAgIHBBYWNNZXRhRGF0YS0+bXBlZ0RyYy5kcmNfVGFyZ2V0UmVmTGV2ZWwgPQorICAgICAgICAgICAgZk1heCgtKDMxIDw8IDE2KSwgcEFhY01ldGFEYXRhLT5tcGVnRHJjLmRyY19UYXJnZXRSZWZMZXZlbCk7CisgICAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuY29tcF9UYXJnZXRSZWZMZXZlbCA9IGZNYXgoCisgICAgICAgICAgICAtKDIwIDw8IDE2KSwKKyAgICAgICAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuY29tcF9UYXJnZXRSZWZMZXZlbCk7IC8qIGltcGxpZXMgLTIzZEIgKi8KKyAgICAgIH0KKyAgICAgIGlmIChwQWFjTWV0YURhdGEtPmRyY1ByZXNlbnRhdGlvbk1vZGUgPT0gMikgeworICAgICAgICBwQWFjTWV0YURhdGEtPm1wZWdEcmMuZHJjX1RhcmdldFJlZkxldmVsID0KKyAgICAgICAgICAgIGZNYXgoLSgyMyA8PCAxNiksIHBBYWNNZXRhRGF0YS0+bXBlZ0RyYy5kcmNfVGFyZ2V0UmVmTGV2ZWwpOworICAgICAgICBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmNvbXBfVGFyZ2V0UmVmTGV2ZWwgPQorICAgICAgICAgICAgZk1heCgtKDIzIDw8IDE2KSwgcEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5jb21wX1RhcmdldFJlZkxldmVsKTsKKyAgICAgIH0KKyAgICAgIGlmIChwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmNvbXBfcHJvZmlsZSA9PQorICAgICAgICAgIEFBQ0VOQ19NRVRBREFUQV9EUkNfTk9UX1BSRVNFTlQpIHsKKyAgICAgICAgLyogRFZCIGRlZmluZXMgdG8gcmV2ZXJ0IHRvIExpZ2h0IERSQyBpZiBoZWF2eSBpcyBub3QgcHJlc2VudCAqLworICAgICAgICBpZiAocEFhY01ldGFEYXRhLT5kcmNQcmVzZW50YXRpb25Nb2RlICE9IDApIHsKKyAgICAgICAgICAvKiB3ZSBleGNsdWRlIHRoZSAibm90IGluZGljYXRlZCIgbW9kZSBhcyB0aGlzIHJlcXVpcmVzIHRoZSB1c2VyIHRvCisgICAgICAgICAgICogZGVmaW5lIGRlc2lyZWQgbGV2ZWxzIGFueXdheSAqLworICAgICAgICAgIHBBYWNNZXRhRGF0YS0+bXBlZ0RyYy5kcmNfVGFyZ2V0UmVmTGV2ZWwgPQorICAgICAgICAgICAgICBmTWF4KHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuY29tcF9UYXJnZXRSZWZMZXZlbCwKKyAgICAgICAgICAgICAgICAgICBwQWFjTWV0YURhdGEtPm1wZWdEcmMuZHJjX1RhcmdldFJlZkxldmVsKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLnRpbWVjb2RlX2NvYXJzZV9zdGF0dXMgPQorICAgICAgICAgIDA7IC8qIG5vdCB5ZXQgc3VwcG9ydGVkIC0gYXR0ZW50aW9uOiBVcGRhdGUKKyAgICAgICAgICAgICAgICBHZXRFc3RNZXRhZGF0YUJ5dGVzUGVyRnJhbWUoKSBpZiBlbmFibGUgdGhpcyEgKi8KKyAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEudGltZWNvZGVfZmluZV9zdGF0dXMgPQorICAgICAgICAgIDA7IC8qIG5vdCB5ZXQgc3VwcG9ydGVkIC0gYXR0ZW50aW9uOiBVcGRhdGUKKyAgICAgICAgICAgICAgICBHZXRFc3RNZXRhZGF0YUJ5dGVzUGVyRnJhbWUoKSBpZiBlbmFibGUgdGhpcyEgKi8KKworICAgICAgLyogZXh0ZW5kZWQgYW5jaWxsYXJ5IGRhdGEgKi8KKyAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YVN0YXR1cyA9CisgICAgICAgICAgKChoTWV0YWRhdGEtPkV4dE1ldGFEYXRhLmV4dEFuY0RhdGFFbmFibGUgPT0gMSkgPyAxIDogMCk7CisKKyAgICAgIGlmIChwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGFTdGF0dXMpIHsKKyAgICAgICAgcEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmV4dF9kb3dubWl4X2x2bF9zdGF0dXMgPQorICAgICAgICAgICAgKGhNZXRhZGF0YS0+RXh0TWV0YURhdGEuZXh0RG93bm1peExldmVsRW5hYmxlID8gMSA6IDApOworICAgICAgICBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZXh0X2Rvd25taXhfZ2Fpbl9zdGF0dXMgPQorICAgICAgICAgICAgKGhNZXRhZGF0YS0+RXh0TWV0YURhdGEuZG14R2FpbkVuYWJsZSA/IDEgOiAwKTsKKyAgICAgICAgcEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmV4dF9sZmVfZG93bm1peF9zdGF0dXMgPQorICAgICAgICAgICAgKGhNZXRhZGF0YS0+RXh0TWV0YURhdGEubGZlRG14RW5hYmxlID8gMSA6IDApOworCisgICAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfZG1peF9hX2lkeCA9CisgICAgICAgICAgICBoTWV0YWRhdGEtPkV4dE1ldGFEYXRhLmV4dERvd25taXhMZXZlbF9BOworICAgICAgICBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZXh0X2RtaXhfYl9pZHggPQorICAgICAgICAgICAgaE1ldGFkYXRhLT5FeHRNZXRhRGF0YS5leHREb3dubWl4TGV2ZWxfQjsKKworICAgICAgICBpZiAocEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmV4dF9kb3dubWl4X2dhaW5fc3RhdHVzKSB7CisgICAgICAgICAgZW5jb2RlRHlucm5nKGhNZXRhZGF0YS0+RXh0TWV0YURhdGEuZG14R2FpbjUsCisgICAgICAgICAgICAgICAgICAgICAgICYocEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmRteF9nYWluXzVfaWR4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgJihwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZG14X2dhaW5fNV9zZ24pKTsKKyAgICAgICAgICBlbmNvZGVEeW5ybmcoaE1ldGFkYXRhLT5FeHRNZXRhRGF0YS5kbXhHYWluMiwKKyAgICAgICAgICAgICAgICAgICAgICAgJihwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZG14X2dhaW5fMl9pZHgpLAorICAgICAgICAgICAgICAgICAgICAgICAmKHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5kbXhfZ2Fpbl8yX3NnbikpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBBYWNNZXRhRGF0YS0+ZG9sYnlTdXJyb3VuZE1vZGUgPSAwOworICAgICAgICAgIGVuY29kZUR5bnJuZygxIDw8IDE2LAorICAgICAgICAgICAgICAgICAgICAgICAmKHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5kbXhfZ2Fpbl81X2lkeCksCisgICAgICAgICAgICAgICAgICAgICAgICYocEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmRteF9nYWluXzVfc2duKSk7CisgICAgICAgICAgZW5jb2RlRHlucm5nKDEgPDwgMTYsCisgICAgICAgICAgICAgICAgICAgICAgICYocEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmRteF9nYWluXzJfaWR4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgJihwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZG14X2dhaW5fMl9zZ24pKTsKICAgICAgICAgfQogCi0gICAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEudGltZWNvZGVfY29hcnNlX3N0YXR1cyA9IDA7IC8qIG5vdCB5ZXQgc3VwcG9ydGVkIC0gYXR0ZW50aW9uOiBVcGRhdGUgR2V0RXN0TWV0YWRhdGFCeXRlc1BlckZyYW1lKCkgaWYgZW5hYmxlIHRoaXMhICovCi0gICAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEudGltZWNvZGVfZmluZV9zdGF0dXMgICA9IDA7IC8qIG5vdCB5ZXQgc3VwcG9ydGVkIC0gYXR0ZW50aW9uOiBVcGRhdGUgR2V0RXN0TWV0YWRhdGFCeXRlc1BlckZyYW1lKCkgaWYgZW5hYmxlIHRoaXMhICovCisgICAgICAgIGlmIChwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZXh0X2xmZV9kb3dubWl4X3N0YXR1cykgeworICAgICAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfZG1peF9sZmVfaWR4ID0KKyAgICAgICAgICAgICAgaE1ldGFkYXRhLT5FeHRNZXRhRGF0YS5sZmVEbXhMZXZlbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZXh0X2RtaXhfbGZlX2lkeCA9CisgICAgICAgICAgICAgIDE1OyAvKiAtaW5mIGRCICovCisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfZG93bm1peF9sdmxfc3RhdHVzID0gMDsKKyAgICAgICAgcEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmV4dF9kb3dubWl4X2dhaW5fc3RhdHVzID0gMDsKKyAgICAgICAgcEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmV4dF9sZmVfZG93bm1peF9zdGF0dXMgPSAwOwogCi0gICAgICAgIHBBYWNNZXRhRGF0YS0+bWV0YWRhdGFNb2RlID0gbWV0YWRhdGFNb2RlOworICAgICAgICBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZXh0X2RtaXhfYV9pZHggPSA3OyAvKiAtaW5mIGRCICovCisgICAgICAgIHBBYWNNZXRhRGF0YS0+ZXRzaUFuY0RhdGEuZXh0QW5jRGF0YS5leHRfZG1peF9iX2lkeCA9IDc7IC8qIC1pbmYgZEIgKi8KKworICAgICAgICBlbmNvZGVEeW5ybmcoMSA8PCAxNiwKKyAgICAgICAgICAgICAgICAgICAgICYocEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmRteF9nYWluXzVfaWR4KSwKKyAgICAgICAgICAgICAgICAgICAgICYocEFhY01ldGFEYXRhLT5ldHNpQW5jRGF0YS5leHRBbmNEYXRhLmRteF9nYWluXzVfc2duKSk7CisgICAgICAgIGVuY29kZUR5bnJuZygxIDw8IDE2LAorICAgICAgICAgICAgICAgICAgICAgJihwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZG14X2dhaW5fMl9pZHgpLAorICAgICAgICAgICAgICAgICAgICAgJihwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZG14X2dhaW5fMl9zZ24pKTsKKworICAgICAgICBwQWFjTWV0YURhdGEtPmV0c2lBbmNEYXRhLmV4dEFuY0RhdGEuZXh0X2RtaXhfbGZlX2lkeCA9CisgICAgICAgICAgICAxNTsgLyogLWluZiBkQiAqLwogICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHBBYWNNZXRhRGF0YS0+bWV0YWRhdGFNb2RlID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogdGhlcmUgaXMgbm8gY29uZmlndXJhdGlvbiBhdmFpbGFibGUgKi8KLSAgICAgIH0KKworICAgICAgcEFhY01ldGFEYXRhLT5tZXRhZGF0YU1vZGUgPSBtZXRhZGF0YU1vZGU7CisgICAgfSBlbHNlIHsKKyAgICAgIHBBYWNNZXRhRGF0YS0+bWV0YWRhdGFNb2RlID0gMDsgLyogdGhlcmUgaXMgbm8gY29uZmlndXJhdGlvbiBhdmFpbGFibGUgKi8KICAgICB9CisgIH0KIAotICAgIHJldHVybiBlcnI7CisgIHJldHVybiBlcnI7CiB9CiAKLUlOVCBGREtfTWV0YWRhdGFFbmNfR2V0RGVsYXkoCi0gICAgICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiBoTWV0YWRhdGFFbmMKLSAgICAgICAgKQotewotICAgIElOVCBkZWxheSA9IDA7CitJTlQgRkRLX01ldGFkYXRhRW5jX0dldERlbGF5KEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiBoTWV0YWRhdGFFbmMpIHsKKyAgSU5UIGRlbGF5ID0gMDsKIAotICAgIGlmIChoTWV0YWRhdGFFbmMhPU5VTEwpIHsKLSAgICAgICAgZGVsYXkgPSBoTWV0YWRhdGFFbmMtPm5BdWRpb0RhdGFEZWxheTsKLSAgICB9CisgIGlmIChoTWV0YWRhdGFFbmMgIT0gTlVMTCkgeworICAgIGRlbGF5ID0gaE1ldGFkYXRhRW5jLT5uQXVkaW9EYXRhRGVsYXk7CisgIH0KIAotICAgIHJldHVybiBkZWxheTsKKyAgcmV0dXJuIGRlbGF5OwogfQotCi0KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvbWV0YWRhdGFfbWFpbi5oIGIvbGliQUFDZW5jL3NyYy9tZXRhZGF0YV9tYWluLmgKaW5kZXggYmZjOGFlMS4uZDg3MmM3NyAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9tZXRhZGF0YV9tYWluLmgKKysrIGIvbGliQUFDZW5jL3NyYy9tZXRhZGF0YV9tYWluLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMzQgKzkwLDM2IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBBQUMgRW5jb2RlciBsaWIgICoqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgQXV0aG9yKHMpOiBWLiBCYWNpZ2FsdXBvCisgICBBdXRob3Iocyk6ICAgVi4gQmFjaWdhbHVwbworCiAgICBEZXNjcmlwdGlvbjogTWV0YWRhdGEgRW5jb2RlciBsaWJyYXJ5IGludGVyZmFjZSBmdW5jdGlvbnMKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfTUVUQURBVEFfTUFJTl9ICi0jZGVmaW5lIF9NRVRBREFUQV9NQUlOX0gKLQorI2lmbmRlZiBNRVRBREFUQV9NQUlOX0gKKyNkZWZpbmUgTUVUQURBVEFfTUFJTl9ICiAKIC8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlICJhYWNlbmNfbGliLmgiCiAjaW5jbHVkZSAiYWFjZW5jLmgiCiAKLQogLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgZW51bSB7Ci0gICAgTUVUQURBVEFfT0sgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwLCAgIC8qITwgTm8gZXJyb3IgaGFwcGVuZWQuIEFsbCBmaW5lLiAqLwotICAgIE1FVEFEQVRBX0lOVkFMSURfSEFORExFICAgICAgICA9IDB4MDAyMCwgICAvKiE8IEhhbmRsZSBwYXNzZWQgdG8gZnVuY3Rpb24gY2FsbCB3YXMgaW52YWxpZC4gKi8KLSAgICBNRVRBREFUQV9NRU1PUllfRVJST1IgICAgICAgICAgPSAweDAwMjEsICAgLyohPCBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuICovCi0gICAgTUVUQURBVEFfSU5JVF9FUlJPUiAgICAgICAgICAgID0gMHgwMDQwLCAgIC8qITwgR2VuZXJhbCBpbml0aWFsaXphdGlvbiBlcnJvci4gKi8KLSAgICBNRVRBREFUQV9FTkNPREVfRVJST1IgICAgICAgICAgPSAweDAwNjAgICAgLyohPCBUaGUgZW5jb2RpbmcgcHJvY2VzcyB3YXMgaW50ZXJydXB0ZWQgYnkgYW4gdW5leHBlY3RlZCBlcnJvci4gKi8KKyAgTUVUQURBVEFfT0sgPSAweDAwMDAsIC8qITwgTm8gZXJyb3IgaGFwcGVuZWQuIEFsbCBmaW5lLiAqLworICBNRVRBREFUQV9JTlZBTElEX0hBTkRMRSA9CisgICAgICAweDAwMjAsIC8qITwgSGFuZGxlIHBhc3NlZCB0byBmdW5jdGlvbiBjYWxsIHdhcyBpbnZhbGlkLiAqLworICBNRVRBREFUQV9NRU1PUllfRVJST1IgPSAweDAwMjEsIC8qITwgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiAqLworICBNRVRBREFUQV9JTklUX0VSUk9SID0gMHgwMDQwLCAgIC8qITwgR2VuZXJhbCBpbml0aWFsaXphdGlvbiBlcnJvci4gKi8KKyAgTUVUQURBVEFfRU5DT0RFX0VSUk9SID0KKyAgICAgIDB4MDA2MCAvKiE8IFRoZSBlbmNvZGluZyBwcm9jZXNzIHdhcyBpbnRlcnJ1cHRlZCBieSBhbiB1bmV4cGVjdGVkIGVycm9yLgorICAgICAgICAgICAgICAqLwogCiB9IEZES19NRVRBREFUQV9FUlJPUjsKIApAQCAtMTE1LDMyICsxMjgsMzMgQEAKICAqLwogdHlwZWRlZiBzdHJ1Y3QgRkRLX01FVEFEQVRBX0VOQ09ERVIgKkhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUjsKIAotCiAvKioKICAqIFxicmllZiAgT3BlbiBhIE1ldGEgRGF0YSBpbnN0YW5jZS4KICAqCi0gKiBccGFyYW0gcGhNZXRhZGF0YUVuYyAgICAgICAgIEEgcG9pbnRlciB0byBhIE1ldGEgRGF0YSBoYW5kbGUgdG8gYmUgYWxsb2NhdGVkLiBJbml0aWFsaXplZCBvbiByZXR1cm4uCisgKiBccGFyYW0gcGhNZXRhZGF0YUVuYyAgICAgICAgIEEgcG9pbnRlciB0byBhIE1ldGEgRGF0YSBoYW5kbGUgdG8gYmUgYWxsb2NhdGVkLgorICogSW5pdGlhbGl6ZWQgb24gcmV0dXJuLgorICogXHBhcmFtIG1heENoYW5uZWxzICAgICAgICAgICBNYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQgYXVkaW8gY2hhbm5lbHMuCiAgKgogICogXHJldHVybgogICogICAgICAgICAgLSBNRVRBREFUQV9PSywgb24gc3VjY2VzLgogICogICAgICAgICAgLSBNRVRBREFUQV9JTlZBTElEX0hBTkRMRSwgTUVUQURBVEFfTUVNT1JZX0VSUk9SLCBvbiBmYWlsdXJlLgogICovCiBGREtfTUVUQURBVEFfRVJST1IgRkRLX01ldGFkYXRhRW5jX09wZW4oCi0gICAgICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiAgICAgKnBoTWV0YWRhdGFFbmMKLSAgICAgICAgKTsKLQorICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiAqcGhNZXRhZGF0YUVuYywgY29uc3QgVUlOVCBtYXhDaGFubmVscyk7CiAKIC8qKgogICogXGJyaWVmICBJbml0aWFsaXplIGEgTWV0YSBEYXRhIGluc3RhbmNlLgogICoKICAqIFxwYXJhbSBoTWV0YWRhdGFFbmMgICAgICAgICAgTWV0YSBEYXRhIGhhbmRsZS4KICAqIFxwYXJhbSByZXNldFN0YXRlcyAgICAgICAgICAgSW5kaWNhdGlvbiBmb3IgZnVsbCByZXNldCBvZiBhbGwgc3RhdGVzLgotICogXHBhcmFtIG1ldGFkYXRhTW9kZSAgICAgICAgICBDb25maWd1cmVzIG1ldGF0IGRhdGEgb3V0cHV0IGZvcm1hdCAoMCwxLDIpLgorICogXHBhcmFtIG1ldGFkYXRhTW9kZSAgICAgICAgICBDb25maWd1cmVzIG1ldGEgZGF0YSBvdXRwdXQgZm9ybWF0ICgwLDEsMiwzKS4KICAqIFxwYXJhbSBhdWRpb0RlbGF5ICAgICAgICAgICAgRGVsYXkgY2F1c2UgYnkgdGhlIGF1ZGlvIGVuY29kZXIuCi0gKiBccGFyYW0gZnJhbWVMZW5ndGggICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIHRvIGJlIHByb2Nlc3NlcyB3aXRoaW4gb25lIGZyYW1lLgorICogXHBhcmFtIGZyYW1lTGVuZ3RoICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyB0byBiZSBwcm9jZXNzZXMgd2l0aGluIG9uZQorICogZnJhbWUuCiAgKiBccGFyYW0gc2FtcGxlUmF0ZSAgICAgICAgICAgIFNhbXBsaW5nIHJhdCBpbiBIeiBvZiBhdWRpbyBpbnB1dCBzaWduYWwuCiAgKiBccGFyYW0gbkNoYW5uZWxzICAgICAgICAgICAgIE51bWJlciBvZiBhdWRpbyBpbnB1dCBjaGFubmVscy4KLSAqIFxwYXJhbSBjaGFubmVsTW9kZSAgICAgICAgICAgQ2hhbm5lbCBjb25maWd1cmF0aW9uIHdoaWNoIGlzIHVzZWQgYnkgdGhlIGVuY29kZXIuCisgKiBccGFyYW0gY2hhbm5lbE1vZGUgICAgICAgICAgIENoYW5uZWwgY29uZmlndXJhdGlvbiB3aGljaCBpcyB1c2VkIGJ5IHRoZQorICogZW5jb2Rlci4KICAqIFxwYXJhbSBjaGFubmVsT3JkZXIgICAgICAgICAgQ2hhbm5lbCBvcmRlciBvZiB0aGUgaW5wdXQgZGF0YS4gKFdBViwgTVBFRykKICAqCiAgKiBccmV0dXJuCkBAIC0xNDgsMTcgKzE2MiwxMCBAQAogICogICAgICAgICAgLSBNRVRBREFUQV9JTlZBTElEX0hBTkRMRSwgTUVUQURBVEFfSU5JVF9FUlJPUiwgb24gZmFpbHVyZS4KICAqLwogRkRLX01FVEFEQVRBX0VSUk9SIEZES19NZXRhZGF0YUVuY19Jbml0KAotICAgICAgICBIQU5ETEVfRkRLX01FVEFEQVRBX0VOQ09ERVIgICAgICBoTWV0YWRhdGFFbmMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0U3RhdGVzLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU1vZGUsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRGVsYXksCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoLAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCi0gICAgICAgIGNvbnN0IENIQU5ORUxfTU9ERSAgICAgICAgICAgICAgIGNoYW5uZWxNb2RlLAotICAgICAgICBjb25zdCBDSEFOTkVMX09SREVSICAgICAgICAgICAgICBjaGFubmVsT3JkZXIKLSAgICAgICAgKTsKLQorICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiBoTWV0YWRhdGFFbmMsIGNvbnN0IElOVCByZXNldFN0YXRlcywKKyAgICBjb25zdCBJTlQgbWV0YWRhdGFNb2RlLCBjb25zdCBJTlQgYXVkaW9EZWxheSwgY29uc3QgVUlOVCBmcmFtZUxlbmd0aCwKKyAgICBjb25zdCBVSU5UIHNhbXBsZVJhdGUsIGNvbnN0IFVJTlQgbkNoYW5uZWxzLCBjb25zdCBDSEFOTkVMX01PREUgY2hhbm5lbE1vZGUsCisgICAgY29uc3QgQ0hBTk5FTF9PUkRFUiBjaGFubmVsT3JkZXIpOwogCiAvKioKICAqIFxicmllZiAgQ2FsY3VsYXRlIE1ldGEgRGF0YSBwcm9jZXNzaW5nLgpAQCAtMTcwLDQzICsxNzcsNDIgQEAKICAqIC0gQXBwbHkgYXVkaW8gZGF0YSBhbmQgbWV0YSBkYXRhIGRlbGF5IGNvbXBlbnNhdGlvbi4KICAqCiAgKiBccGFyYW0gaE1ldGFkYXRhRW5jICAgICAgICAgIE1ldGEgRGF0YSBoYW5kbGUuCi0gKiBccGFyYW0gcEF1ZGlvU2FtcGxlcyAgICAgICAgIFBvaW50ZXIgdG8gYXVkaW8gaW5wdXQgZGF0YS4gRXhpc3RpbmcgZnVuY3Rpb24gb3ZlcndyaXRlcyBhdWRpbyBkYXRhIHdpdGggZGVsYXllZCBhdWRpbyBzYW1wbGVzLgorICogXHBhcmFtIHBBdWRpb1NhbXBsZXMgICAgICAgICBQb2ludGVyIHRvIGF1ZGlvIGlucHV0IGRhdGEuIEV4aXN0aW5nIGZ1bmN0aW9uCisgKiBvdmVyd3JpdGVzIGF1ZGlvIGRhdGEgd2l0aCBkZWxheWVkIGF1ZGlvIHNhbXBsZXMuCiAgKiBccGFyYW0gbkF1ZGlvU2FtcGxlcyAgICAgICAgIE51bWJlciBvZiBpbnB1dCBhdWRpbyBzYW1wbGVzIHRvIGJlIHByY2Vzc2VkLgogICogXHBhcmFtIHBNZXRhZGF0YSAgICAgICAgICAgICBQb2ludGVyIHRvIE1ldGF0IERhdGEgaW5wdXQuCi0gKiBccGFyYW0gcHBNZXRhRGF0YUV4dFBheWxvYWQgIFBvaW50ZXIgdG8gZXh0ZW5zaW9uIHBheWxvYWQgYXJyYXkuIEZpbGxlZCBvbiByZXR1cm4uCi0gKiBccGFyYW0gbk1ldGFEYXRhRXh0ZW5zaW9ucyAgIFBvaW50ZXIgdG8gdmFyaWFibGUgdG8gZGVzY3JpYmUgbnVtYmVyIG9mIGF2YWlsYWJsZSBleHRlbnNpb24gcGF5bG9hZHMuIEZpbGxlZCBvbiByZXR1cm4uCi0gKiBccGFyYW0gbWF0cml4X21peGRvd25faWR4ICAgIFBvaW50ZXIgdG8gdmFyaWFibGUgZm9yIG1hdHJpeCBtaXhkb3duIGNvZWZmaWNpZW50LiBGaWxsZWQgb24gcmV0dXJuLgorICogXHBhcmFtIHBwTWV0YURhdGFFeHRQYXlsb2FkICBQb2ludGVyIHRvIGV4dGVuc2lvbiBwYXlsb2FkIGFycmF5LiBGaWxsZWQgb24KKyAqIHJldHVybi4KKyAqIFxwYXJhbSBuTWV0YURhdGFFeHRlbnNpb25zICAgUG9pbnRlciB0byB2YXJpYWJsZSB0byBkZXNjcmliZSBudW1iZXIgb2YKKyAqIGF2YWlsYWJsZSBleHRlbnNpb24gcGF5bG9hZHMuIEZpbGxlZCBvbiByZXR1cm4uCisgKiBccGFyYW0gbWF0cml4X21peGRvd25faWR4ICAgIFBvaW50ZXIgdG8gdmFyaWFibGUgZm9yIG1hdHJpeCBtaXhkb3duCisgKiBjb2VmZmljaWVudC4gRmlsbGVkIG9uIHJldHVybi4KICAqCiAgKiBccmV0dXJuCiAgKiAgICAgICAgICAtIE1FVEFEQVRBX09LLCBvbiBzdWNjZXMuCiAgKiAgICAgICAgICAtIE1FVEFEQVRBX0lOVkFMSURfSEFORExFLCBNRVRBREFUQV9FTkNPREVfRVJST1IsIG9uIGZhaWx1cmUuCiAgKi8KIEZES19NRVRBREFUQV9FUlJPUiBGREtfTWV0YWRhdGFFbmNfUHJvY2VzcygKLSAgICAgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSICAgICAgaE1ldGFkYXRhRW5jLAotICAgICAgICBJTlRfUENNICogY29uc3QgICAgICAgICAgICAgICAgICBwQXVkaW9TYW1wbGVzLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgICBuQXVkaW9TYW1wbGVzLAotICAgICAgICBjb25zdCBBQUNFTkNfTWV0YURhdGEgKiBjb25zdCAgICBwTWV0YWRhdGEsCi0gICAgICAgIEFBQ0VOQ19FWFRfUEFZTE9BRCAqKiAgICAgICAgICAgIHBwTWV0YURhdGFFeHRQYXlsb2FkLAotICAgICAgICBVSU5UICogICAgICAgICAgICAgICAgICAgICAgICAgICBuTWV0YURhdGFFeHRlbnNpb25zLAotICAgICAgICBJTlQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXhfbWl4ZG93bl9pZHgKLSAgICAgICAgKTsKLQorICAgIEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiBoTWV0YWRhdGFFbmMsIElOVF9QQ00gKmNvbnN0IHBBdWRpb1NhbXBsZXMsCisgICAgY29uc3QgVUlOVCBhdWRpb1NhbXBsZXNCdWZTaXplLCBjb25zdCBJTlQgbkF1ZGlvU2FtcGxlcywKKyAgICBjb25zdCBBQUNFTkNfTWV0YURhdGEgKmNvbnN0IHBNZXRhZGF0YSwKKyAgICBBQUNFTkNfRVhUX1BBWUxPQUQgKipwcE1ldGFEYXRhRXh0UGF5bG9hZCwgVUlOVCAqbk1ldGFEYXRhRXh0ZW5zaW9ucywKKyAgICBJTlQgKm1hdHJpeF9taXhkb3duX2lkeCk7CiAKIC8qKgogICogXGJyaWVmICBDbG9zZSB0aGUgTWV0YSBEYXRhIGluc3RhbmNlLgogICoKICAqIERlYWxsb2NhdGUgaW5zdGFuY2UgYW5kIGZyZWUgd2hvbGUgbWVtb3J5LgogICoKLSAqIFxwYXJhbSBwaE1ldGFEYXRhICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgTWV0YSBEYXRhIGhhbmRsZSB0byBiZSBkZWFsbG9jYXRlZC4KKyAqIFxwYXJhbSBwaE1ldGFEYXRhICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgTWV0YSBEYXRhIGhhbmRsZSB0byBiZQorICogZGVhbGxvY2F0ZWQuCiAgKgogICogXHJldHVybgogICogICAgICAgICAgLSBNRVRBREFUQV9PSywgb24gc3VjY2VzLgogICogICAgICAgICAgLSBNRVRBREFUQV9JTlZBTElEX0hBTkRMRSwgb24gZmFpbHVyZS4KICAqLwogRkRLX01FVEFEQVRBX0VSUk9SIEZES19NZXRhZGF0YUVuY19DbG9zZSgKLSAgICAgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSICAgICAqcGhNZXRhRGF0YQotICAgICAgICApOwotCisgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSICpwaE1ldGFEYXRhKTsKIAogLyoqCiAgKiBcYnJpZWYgIEdldCBNZXRhIERhdGEgRW5jb2RlciBkZWxheS4KQEAgLTIxNSwxMCArMjIxLDYgQEAKICAqCiAgKiBccmV0dXJuICBEZWxheSBjYXVzZWQgYnkgTWV0YSBEYXRhIG1vZHVsZS4KICAqLwotSU5UIEZES19NZXRhZGF0YUVuY19HZXREZWxheSgKLSAgICAgICAgSEFORExFX0ZES19NRVRBREFUQV9FTkNPREVSICAgICAgaE1ldGFkYXRhRW5jCi0gICAgICAgICk7CitJTlQgRkRLX01ldGFkYXRhRW5jX0dldERlbGF5KEhBTkRMRV9GREtfTUVUQURBVEFfRU5DT0RFUiBoTWV0YWRhdGFFbmMpOwogCi0KLSNlbmRpZiAvKiBfTUVUQURBVEFfTUFJTl9IICovCi0KKyNlbmRpZiAvKiBNRVRBREFUQV9NQUlOX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvbXBzX21haW4uY3BwIGIvbGliQUFDZW5jL3NyYy9tcHNfbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA0ODIyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYkFBQ2VuYy9zcmMvbXBzX21haW4uY3BwCkBAIC0wLDAgKzEsNTI5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXJrdXMgTG9od2Fzc2VyCisKKyAgIERlc2NyaXB0aW9uOiBNcGVnIFN1cnJvdW5kIGxpYnJhcnkgaW50ZXJmYWNlIGZ1bmN0aW9ucworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAibXBzX21haW4uaCIKKyNpbmNsdWRlICJzYWNlbmNfbGliLmgiCisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBNUFNfRU5DT0RFUiB7CisgIEhBTkRMRV9NUDRTUEFDRV9FTkNPREVSIGhTYWNFbmNvZGVyOworCisgIEFVRElPX09CSkVDVF9UWVBFIGF1ZGlvT2JqZWN0VHlwZTsKKworICBGREtfYnVmRGVzY3IgaW5CdWZEZXNjOworICBGREtfYnVmRGVzY3Igb3V0QnVmRGVzYzsKKyAgU0FDRU5DX0luQXJncyBpbmFyZ3M7CisgIFNBQ0VOQ19PdXRBcmdzIG91dGFyZ3M7CisKKyAgdm9pZCAqcEluQnVmZmVyWzFdOworICBVSU5UIHBJbkJ1ZmZlclNpemVbMV07CisgIFVJTlQgcEluQnVmZmVyRWxTaXplWzFdOworICBVSU5UIHBJbkJ1ZmZlclR5cGVbMV07CisKKyAgdm9pZCAqcE91dEJ1ZmZlclsyXTsKKyAgVUlOVCBwT3V0QnVmZmVyU2l6ZVsyXTsKKyAgVUlOVCBwT3V0QnVmZmVyRWxTaXplWzJdOworICBVSU5UIHBPdXRCdWZmZXJUeXBlWzJdOworCisgIFVDSEFSIHNhY091dEJ1ZmZlclsxMDI0XTsgLyogV29yc3QgY2FzZSBtZW1vcnkgY29uc3VtcHRpb24gZm9yIEVMRHYyOiA3NjgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyA9PiA2MTQ0IGJpdHMgKENvcmUgKyBTQlIgKyBNUFMpICovCit9OworCitzdHJ1Y3QgTVBTX0NPTkZJR19UQUIgeworICBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb19vYmplY3RfdHlwZTsKKyAgQ0hBTk5FTF9NT0RFIGNoYW5uZWxfbW9kZTsKKyAgVUxPTkcgc2JyX3JhdGlvOworICBVTE9ORyBzYW1wbGluZ19yYXRlOworICBVTE9ORyBiaXRyYXRlX21pbjsKKyAgVUxPTkcgYml0cmF0ZV9tYXg7Cit9OworCisvKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY29uc3QgTVBTX0NPTkZJR19UQUIgbXBzQ29uZmlnVGFiW10gPSB7CisgICAge0FPVF9FUl9BQUNfRUxELCBNT0RFXzIxMiwgMCwgMTYwMDAsIDE2MDAwLCAzOTk5OX0sCisgICAge0FPVF9FUl9BQUNfRUxELCBNT0RFXzIxMiwgMCwgMjIwNTAsIDE2MDAwLCA0OTk5OX0sCisgICAge0FPVF9FUl9BQUNfRUxELCBNT0RFXzIxMiwgMCwgMjQwMDAsIDE2MDAwLCA2MTk5OX0sCisgICAge0FPVF9FUl9BQUNfRUxELCBNT0RFXzIxMiwgMCwgMzIwMDAsIDIwMDAwLCA4NDk5OX0sCisgICAge0FPVF9FUl9BQUNfRUxELCBNT0RFXzIxMiwgMCwgNDQxMDAsIDUwMDAwLCAxOTIwMDB9LAorICAgIHtBT1RfRVJfQUFDX0VMRCwgTU9ERV8yMTIsIDAsIDQ4MDAwLCA2MjAwMCwgMTkyMDAwfSwKKworICAgIHtBT1RfRVJfQUFDX0VMRCwgTU9ERV8yMTIsIDEsIDE2MDAwLCAxODAwMCwgMzE5OTl9LAorICAgIHtBT1RfRVJfQUFDX0VMRCwgTU9ERV8yMTIsIDEsIDIyMDUwLCAxODAwMCwgMzE5OTl9LAorICAgIHtBT1RfRVJfQUFDX0VMRCwgTU9ERV8yMTIsIDEsIDI0MDAwLCAyMDAwMCwgNjQwMDB9LAorCisgICAge0FPVF9FUl9BQUNfRUxELCBNT0RFXzIxMiwgMiwgMzIwMDAsIDE4MDAwLCA2NDAwMH0sCisgICAge0FPVF9FUl9BQUNfRUxELCBNT0RFXzIxMiwgMiwgNDQxMDAsIDIxMDAwLCA2NDAwMH0sCisgICAge0FPVF9FUl9BQUNfRUxELCBNT0RFXzIxMiwgMiwgNDgwMDAsIDI2MDAwLCA2NDAwMH0KKworfTsKKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlZmluaXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UIEZES19NcGVnc0VuY19Xcml0ZUZyYW1lSGVhZGVyKEhBTkRMRV9NUFNfRU5DT0RFUiBoTXBzRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqY29uc3QgcE91dHB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG91dHB1dEJ1ZmZlclNpemUpOworCitNUFNfRU5DT0RFUl9FUlJPUiBGREtfTXBlZ3NFbmNfT3BlbihIQU5ETEVfTVBTX0VOQ09ERVIgKnBoTXBzRW5jKSB7CisgIE1QU19FTkNPREVSX0VSUk9SIGVycm9yID0gTVBTX0VOQ09ERVJfT0s7CisgIEhBTkRMRV9NUFNfRU5DT0RFUiBoTXBzRW5jID0gTlVMTDsKKworICBpZiAocGhNcHNFbmMgPT0gTlVMTCkgeworICAgIGVycm9yID0gTVBTX0VOQ09ERVJfSU5WQUxJRF9IQU5ETEU7CisgICAgZ290byBiYWlsOworICB9CisKKyAgaWYgKE5VTEwgPT0KKyAgICAgIChoTXBzRW5jID0gKEhBTkRMRV9NUFNfRU5DT0RFUilGREtjYWxsb2MoMSwgc2l6ZW9mKE1QU19FTkNPREVSKSkpKSB7CisgICAgZXJyb3IgPSBNUFNfRU5DT0RFUl9NRU1PUllfRVJST1I7CisgICAgZ290byBiYWlsOworICB9CisgIEZES21lbWNsZWFyKGhNcHNFbmMsIHNpemVvZihNUFNfRU5DT0RFUikpOworCisgIGlmIChTQUNFTkNfT0sgIT0gRkRLX3NhY2VuY19vcGVuKCZoTXBzRW5jLT5oU2FjRW5jb2RlcikpIHsKKyAgICBlcnJvciA9IE1QU19FTkNPREVSX01FTU9SWV9FUlJPUjsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICAvKiBSZXR1cm4gbXBzIGVuY29kZXIgaW5zdGFuY2UgKi8KKyAgKnBoTXBzRW5jID0gaE1wc0VuYzsKKworYmFpbDoKKyAgaWYgKGVycm9yICE9IE1QU19FTkNPREVSX09LKSB7CisgICAgRkRLX01wZWdzRW5jX0Nsb3NlKCZoTXBzRW5jKTsKKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CisKK01QU19FTkNPREVSX0VSUk9SIEZES19NcGVnc0VuY19DbG9zZShIQU5ETEVfTVBTX0VOQ09ERVIgKnBoTXBzRW5jKSB7CisgIE1QU19FTkNPREVSX0VSUk9SIGVycm9yID0gTVBTX0VOQ09ERVJfT0s7CisKKyAgaWYgKHBoTXBzRW5jID09IE5VTEwpIHsKKyAgICBlcnJvciA9IE1QU19FTkNPREVSX0lOVkFMSURfSEFORExFOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIGlmICgqcGhNcHNFbmMgIT0gTlVMTCkgeworICAgIEZES19zYWNlbmNfY2xvc2UoJigqcGhNcHNFbmMpLT5oU2FjRW5jb2Rlcik7CisgICAgRkRLZnJlZSgqcGhNcHNFbmMpOworICAgICpwaE1wc0VuYyA9IE5VTEw7CisgIH0KK2JhaWw6CisgIHJldHVybiBlcnJvcjsKK30KKworTVBTX0VOQ09ERVJfRVJST1IgRkRLX01wZWdzRW5jX0luaXQoSEFORExFX01QU19FTkNPREVSIGhNcHNFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb09iamVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIHNhbXBsaW5ncmF0ZSwgY29uc3QgVUlOVCBiaXRyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBzYnJSYXRpbywgY29uc3QgVUlOVCBmcmFtZWxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgaW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgY29yZUNvZGVyRGVsYXkpIHsKKyAgTVBTX0VOQ09ERVJfRVJST1IgZXJyb3IgPSBNUFNfRU5DT0RFUl9PSzsKKyAgY29uc3QgVUlOVCBmc19sb3cgPSAyNzcxMzsgIC8qIGxvdyBNUFMgc2FtcGxpbmcgZnJlcXVlbmNpZXMgKi8KKyAgY29uc3QgVUlOVCBmc19oaWdoID0gNTU0MjY7IC8qIGhpZ2ggTVBTIHNhbXBsaW5nIGZyZXF1ZW5jaWVzICovCisgIFVJTlQgblRpbWVTbG90cyA9IDAsIG5RbWZCYW5kc0xkID0gMDsKKworICBpZiAoaE1wc0VuYyA9PSBOVUxMKSB7CisgICAgZXJyb3IgPSBNUFNfRU5DT0RFUl9JTlZBTElEX0hBTkRMRTsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICAvKiBDb21iaW5lIE1QUyB3aXRoIFNCUiBvbmx5IGlmIHRoZSBudW1iZXIgb2YgUU1GIGJhbmQgZml0cyB0b2dldGhlci4qLworICBzd2l0Y2ggKHNiclJhdGlvKSB7CisgICAgY2FzZSAxOiAvKiBkb3duc2FtcGxlZCBzYnIgLSAzMiBRTUYgYmFuZHMgcmVxdWlyZWQgKi8KKyAgICAgIGlmICghKHNhbXBsaW5ncmF0ZSA8IGZzX2xvdykpIHsKKyAgICAgICAgZXJyb3IgPSBNUFNfRU5DT0RFUl9JTklUX0VSUk9SOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6IC8qIGR1YWxyYXRlIC0gNjQgUU1GIGJhbmRzIHJlcXVpcmVkICovCisgICAgICBpZiAoISgoc2FtcGxpbmdyYXRlID49IGZzX2xvdykgJiYgKHNhbXBsaW5ncmF0ZSA8IGZzX2hpZ2gpKSkgeworICAgICAgICBlcnJvciA9IE1QU19FTkNPREVSX0lOSVRfRVJST1I7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMDoKKyAgICBkZWZhdWx0OjsgLyogdGltZSBpbnRlcmZhY2UgLSBubyBzYW1wbGluZ3JhdGUgcmVzdHJpY3Rpb24gKi8KKyAgfQorCisgIC8qIDMyICBRTUYtQmFuZHMgICggZnMgPCAyNzcxMyApCisgICAqIDY0ICBRTUYtQmFuZHMgICggMjc3MTMgPj0gZnMgPD0gNTU0MjYgKQorICAgKiAxMjggUU1GLUJhbmRzICAoIGZzID4gNTU0MjYgKQorICAgKi8KKyAgblFtZkJhbmRzTGQgPQorICAgICAgKHNhbXBsaW5ncmF0ZSA8IGZzX2xvdykgPyA1IDogKChzYW1wbGluZ3JhdGUgPiBmc19oaWdoKSA/IDcgOiA2KTsKKyAgblRpbWVTbG90cyA9IGZyYW1lbGVuZ3RoID4+IG5RbWZCYW5kc0xkOworCisgIC8qIGNoZWNrIGlmIG51bWJlciBvZiBxbWYgYmFuZHMgaXMgdXNhYmxlIGZvciBnaXZlbiBmcmFtZWxlbmd0aCAqLworICBpZiAoZnJhbWVsZW5ndGggIT0gKG5UaW1lU2xvdHMgPDwgblFtZkJhbmRzTGQpKSB7CisgICAgZXJyb3IgPSBNUFNfRU5DT0RFUl9JTklUX0VSUk9SOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIGlzIGdpdmVuIGJpdHJhdGUgaW50ZW5kZWQgdG8gYmUgc3VwcG9ydGVkICovCisgIGlmICgoSU5UKWJpdHJhdGUgIT0gRkRLX01wZWdzRW5jX0dldENsb3Nlc3RCaXRSYXRlKGF1ZGlvT2JqZWN0VHlwZSwgTU9ERV8yMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5ncmF0ZSwgc2JyUmF0aW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJhdGUpKSB7CisgICAgZXJyb3IgPSBNUFNfRU5DT0RFUl9JTklUX0VSUk9SOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIGluaXQgU0FDIGxpYnJhcnkgKi8KKyAgc3dpdGNoIChhdWRpb09iamVjdFR5cGUpIHsKKyAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOiB7CisgICAgICBjb25zdCBVSU5UIG5vSW50ZXJGcmFtZUNvZGluZyA9IDA7CisKKyAgICAgIGlmICgoU0FDRU5DX09LICE9CisgICAgICAgICAgIEZES19zYWNlbmNfc2V0UGFyYW0oaE1wc0VuYy0+aFNhY0VuY29kZXIsIFNBQ0VOQ19MT1dERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm9JbnRlckZyYW1lQ29kaW5nID09IDEpID8gMSA6IDIpKSB8fAorICAgICAgICAgIChTQUNFTkNfT0sgIT0gRkRLX3NhY2VuY19zZXRQYXJhbShoTXBzRW5jLT5oU2FjRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FDRU5DX0VOQ19NT0RFLCBTQUNFTkNfMjEyKSkgfHwKKyAgICAgICAgICAoU0FDRU5DX09LICE9IEZES19zYWNlbmNfc2V0UGFyYW0oaE1wc0VuYy0+aFNhY0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBQ0VOQ19TQU1QTEVSQVRFLCBzYW1wbGluZ3JhdGUpKSB8fAorICAgICAgICAgIChTQUNFTkNfT0sgIT0gRkRLX3NhY2VuY19zZXRQYXJhbShoTXBzRW5jLT5oU2FjRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FDRU5DX0ZSQU1FX1RJTUVfU0xPVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5UaW1lU2xvdHMpKSB8fAorICAgICAgICAgIChTQUNFTkNfT0sgIT0gRkRLX3NhY2VuY19zZXRQYXJhbShoTXBzRW5jLT5oU2FjRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FDRU5DX1BBUkFNX0JBTkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQUNFTkNfQkFORFNfMTUpKSB8fAorICAgICAgICAgIChTQUNFTkNfT0sgIT0KKyAgICAgICAgICAgRkRLX3NhY2VuY19zZXRQYXJhbShoTXBzRW5jLT5oU2FjRW5jb2RlciwgU0FDRU5DX1RJTUVfRE9NX0RNWCwgMikpIHx8CisgICAgICAgICAgKFNBQ0VOQ19PSyAhPQorICAgICAgICAgICBGREtfc2FjZW5jX3NldFBhcmFtKGhNcHNFbmMtPmhTYWNFbmNvZGVyLCBTQUNFTkNfQ09BUlNFX1FVQU5ULCAwKSkgfHwKKyAgICAgICAgICAoU0FDRU5DX09LICE9IEZES19zYWNlbmNfc2V0UGFyYW0oaE1wc0VuYy0+aFNhY0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBQ0VOQ19RVUFOVF9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQUNFTkNfUVVBTlRNT0RFX0ZJTkUpKSB8fAorICAgICAgICAgIChTQUNFTkNfT0sgIT0gRkRLX3NhY2VuY19zZXRQYXJhbShoTXBzRW5jLT5oU2FjRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FDRU5DX1RJTUVfQUxJR05NRU5ULCAwKSkgfHwKKyAgICAgICAgICAoU0FDRU5DX09LICE9IEZES19zYWNlbmNfc2V0UGFyYW0oaE1wc0VuYy0+aFNhY0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBQ0VOQ19JTkRFUEVOREVOQ1lfRkFDVE9SLCAyMCkpKSB7CisgICAgICAgIGVycm9yID0gTVBTX0VOQ09ERVJfSU5JVF9FUlJPUjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciA9IE1QU19FTkNPREVSX0lOSVRfRVJST1I7CisgICAgICBnb3RvIGJhaWw7CisgIH0KKworICBpZiAoU0FDRU5DX09LICE9IEZES19zYWNlbmNfaW5pdChoTXBzRW5jLT5oU2FjRW5jb2RlciwgY29yZUNvZGVyRGVsYXkpKSB7CisgICAgZXJyb3IgPSBNUFNfRU5DT0RFUl9JTklUX0VSUk9SOworICB9CisKKyAgaE1wc0VuYy0+YXVkaW9PYmplY3RUeXBlID0gYXVkaW9PYmplY3RUeXBlOworCisgIGhNcHNFbmMtPmluQnVmRGVzYy5wcEJhc2UgPSAodm9pZCAqKikmaE1wc0VuYy0+cEluQnVmZmVyOworICBoTXBzRW5jLT5pbkJ1ZkRlc2MucEJ1ZlNpemUgPSBoTXBzRW5jLT5wSW5CdWZmZXJTaXplOworICBoTXBzRW5jLT5pbkJ1ZkRlc2MucEVsZVNpemUgPSBoTXBzRW5jLT5wSW5CdWZmZXJFbFNpemU7CisgIGhNcHNFbmMtPmluQnVmRGVzYy5wQnVmVHlwZSA9IGhNcHNFbmMtPnBJbkJ1ZmZlclR5cGU7CisgIGhNcHNFbmMtPmluQnVmRGVzYy5udW1CdWZzID0gMTsKKworICBoTXBzRW5jLT5vdXRCdWZEZXNjLnBwQmFzZSA9ICh2b2lkICoqKSZoTXBzRW5jLT5wT3V0QnVmZmVyOworICBoTXBzRW5jLT5vdXRCdWZEZXNjLnBCdWZTaXplID0gaE1wc0VuYy0+cE91dEJ1ZmZlclNpemU7CisgIGhNcHNFbmMtPm91dEJ1ZkRlc2MucEVsZVNpemUgPSBoTXBzRW5jLT5wT3V0QnVmZmVyRWxTaXplOworICBoTXBzRW5jLT5vdXRCdWZEZXNjLnBCdWZUeXBlID0gaE1wc0VuYy0+cE91dEJ1ZmZlclR5cGU7CisgIGhNcHNFbmMtPm91dEJ1ZkRlc2MubnVtQnVmcyA9IDI7CisKKyAgaE1wc0VuYy0+cEluQnVmZmVyWzBdID0gTlVMTDsKKyAgaE1wc0VuYy0+cEluQnVmZmVyU2l6ZVswXSA9IDA7CisgIGhNcHNFbmMtPnBJbkJ1ZmZlckVsU2l6ZVswXSA9IHNpemVvZihJTlRfUENNKTsKKyAgaE1wc0VuYy0+cEluQnVmZmVyVHlwZVswXSA9IChGREtfQlVGX1RZUEVfSU5QVVQgfCBGREtfQlVGX1RZUEVfUENNX0RBVEEpOworCisgIGhNcHNFbmMtPnBPdXRCdWZmZXJbMF0gPSBOVUxMOworICBoTXBzRW5jLT5wT3V0QnVmZmVyU2l6ZVswXSA9IDA7CisgIGhNcHNFbmMtPnBPdXRCdWZmZXJFbFNpemVbMF0gPSBzaXplb2YoSU5UX1BDTSk7CisgIGhNcHNFbmMtPnBPdXRCdWZmZXJUeXBlWzBdID0gKEZES19CVUZfVFlQRV9PVVRQVVQgfCBGREtfQlVGX1RZUEVfUENNX0RBVEEpOworCisgIGhNcHNFbmMtPnBPdXRCdWZmZXJbMV0gPSBOVUxMOworICBoTXBzRW5jLT5wT3V0QnVmZmVyU2l6ZVsxXSA9IDA7CisgIGhNcHNFbmMtPnBPdXRCdWZmZXJFbFNpemVbMV0gPSBzaXplb2YoVUNIQVIpOworICBoTXBzRW5jLT5wT3V0QnVmZmVyVHlwZVsxXSA9IChGREtfQlVGX1RZUEVfT1VUUFVUIHwgRkRLX0JVRl9UWVBFX0JTX0RBVEEpOworCisgIGhNcHNFbmMtPmluYXJncy5pc0lucHV0SW50ZXJsZWF2ZWQgPSAwOworICBoTXBzRW5jLT5pbmFyZ3MuaW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbCA9IGlucHV0QnVmZmVyU2l6ZVBlckNoYW5uZWw7CisKK2JhaWw6CisgIHJldHVybiBlcnJvcjsKK30KKworTVBTX0VOQ09ERVJfRVJST1IgRkRLX01wZWdzRW5jX1Byb2Nlc3MoSEFORExFX01QU19FTkNPREVSIGhNcHNFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICpjb25zdCBwQXVkaW9TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5BdWRpb1NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNFTkNfRVhUX1BBWUxPQUQgKnBNcHNFeHRQYXlsb2FkKSB7CisgIE1QU19FTkNPREVSX0VSUk9SIGVycm9yID0gTVBTX0VOQ09ERVJfT0s7CisKKyAgaWYgKGhNcHNFbmMgPT0gTlVMTCkgeworICAgIGVycm9yID0gTVBTX0VOQ09ERVJfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaW50IHNhY0hlYWRlckZsYWcgPSAxOworICAgIGludCBzYWNPdXRCdWZmZXJPZmZzZXQgPSAwOworCisgICAgLyogSW4gY2FzZSBvZiBlbGQgdGhlIHNzYyBpcyBleHBsaWNpdCBhbmQgZG9lc24ndCBuZWVkIHRvIGJlIGluYmFuZCAqLworICAgIGlmIChoTXBzRW5jLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19FTEQpIHsKKyAgICAgIHNhY0hlYWRlckZsYWcgPSAwOworICAgIH0KKworICAgIC8qIDQgYml0cyBuaWJibGUgYWZ0ZXIgZXh0ZW5zaW9uIHR5cGUgKi8KKyAgICBoTXBzRW5jLT5zYWNPdXRCdWZmZXJbMF0gPSAoc2FjSGVhZGVyRmxhZyA9PSAwKSA/IDB4MyA6IDB4NzsKKyAgICBzYWNPdXRCdWZmZXJPZmZzZXQgKz0gMTsKKworICAgIGlmIChzYWNIZWFkZXJGbGFnKSB7CisgICAgICBzYWNPdXRCdWZmZXJPZmZzZXQgKz0gRkRLX01wZWdzRW5jX1dyaXRlRnJhbWVIZWFkZXIoCisgICAgICAgICAgaE1wc0VuYywgJmhNcHNFbmMtPnNhY091dEJ1ZmZlcltzYWNPdXRCdWZmZXJPZmZzZXRdLAorICAgICAgICAgIHNpemVvZihoTXBzRW5jLT5zYWNPdXRCdWZmZXIpIC0gc2FjT3V0QnVmZmVyT2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKiBSZWdpc3RlciBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlci4gKi8KKyAgICBoTXBzRW5jLT5wSW5CdWZmZXJbMF0gPSAodm9pZCAqKXBBdWRpb1NhbXBsZXM7CisgICAgaE1wc0VuYy0+aW5hcmdzLm5JbnB1dFNhbXBsZXMgPSBuQXVkaW9TYW1wbGVzOworCisgICAgaE1wc0VuYy0+cE91dEJ1ZmZlclswXSA9ICh2b2lkICopcEF1ZGlvU2FtcGxlczsKKyAgICBoTXBzRW5jLT5wT3V0QnVmZmVyU2l6ZVswXSA9IHNpemVvZihJTlRfUENNKSAqIG5BdWRpb1NhbXBsZXMgLyAyOworCisgICAgaE1wc0VuYy0+cE91dEJ1ZmZlclsxXSA9ICh2b2lkICopJmhNcHNFbmMtPnNhY091dEJ1ZmZlcltzYWNPdXRCdWZmZXJPZmZzZXRdOworICAgIGhNcHNFbmMtPnBPdXRCdWZmZXJTaXplWzFdID0KKyAgICAgICAgc2l6ZW9mKGhNcHNFbmMtPnNhY091dEJ1ZmZlcikgLSBzYWNPdXRCdWZmZXJPZmZzZXQ7CisKKyAgICAvKiBlbmNvZGUgU0FDIGZyYW1lICovCisgICAgaWYgKFNBQ0VOQ19PSyAhPSBGREtfc2FjZW5jX2VuY29kZShoTXBzRW5jLT5oU2FjRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoTXBzRW5jLT5pbkJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaE1wc0VuYy0+b3V0QnVmRGVzYywgJmhNcHNFbmMtPmluYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoTXBzRW5jLT5vdXRhcmdzKSkgeworICAgICAgZXJyb3IgPSBNUFNfRU5DT0RFUl9FTkNPREVfRVJST1I7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogZXhwb3J0IE1QUyBwYXlsb2FkICovCisgICAgcE1wc0V4dFBheWxvYWQtPnBEYXRhID0gKFVDSEFSICopaE1wc0VuYy0+c2FjT3V0QnVmZmVyOworICAgIHBNcHNFeHRQYXlsb2FkLT5kYXRhU2l6ZSA9CisgICAgICAgIGhNcHNFbmMtPm91dGFyZ3Mubk91dHB1dEJpdHMgKyA4ICogKHNhY091dEJ1ZmZlck9mZnNldCAtIDEpOworICAgIHBNcHNFeHRQYXlsb2FkLT5kYXRhVHlwZSA9IEVYVF9MRFNBQ19EQVRBOworICAgIHBNcHNFeHRQYXlsb2FkLT5hc3NvY2lhdGVkQ2hFbGVtZW50ID0gLTE7CisgIH0KKworYmFpbDoKKyAgcmV0dXJuIGVycm9yOworfQorCitJTlQgRkRLX01wZWdzRW5jX1dyaXRlU3BhdGlhbFNwZWNpZmljQ29uZmlnKEhBTkRMRV9NUFNfRU5DT0RFUiBoTXBzRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMpIHsKKyAgSU5UIHNzY0JpdHMgPSAwOworCisgIGlmIChOVUxMICE9IGhNcHNFbmMpIHsKKyAgICBNUDRTUEFDRUVOQ19JTkZPIG1wNFNwYWNlRW5jb2RlckluZm87CisgICAgRkRLX3NhY2VuY19nZXRJbmZvKGhNcHNFbmMtPmhTYWNFbmNvZGVyLCAmbXA0U3BhY2VFbmNvZGVySW5mbyk7CisKKyAgICBpZiAoaEJzICE9IE5VTEwpIHsKKyAgICAgIGludCBpOworICAgICAgaW50IHdyaXR0ZW5CaXRzID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGk8bXA0U3BhY2VFbmNvZGVySW5mby5wU3NjQnVmLT5uU3NjU2l6ZUJpdHM+PiAzOyBpKyspIHsKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCcywgbXA0U3BhY2VFbmNvZGVySW5mby5wU3NjQnVmLT5wU3NjW2ldLCA4KTsKKyAgICAgICAgd3JpdHRlbkJpdHMgKz0gODsKKyAgICAgIH0KKyAgICAgIEZES3dyaXRlQml0cyhoQnMsIG1wNFNwYWNlRW5jb2RlckluZm8ucFNzY0J1Zi0+cFNzY1tpXSwKKyAgICAgICAgICAgICAgICAgICBtcDRTcGFjZUVuY29kZXJJbmZvLnBTc2NCdWYtPm5Tc2NTaXplQml0cyAtIHdyaXR0ZW5CaXRzKTsKKyAgICB9IC8qIGhCUyAqLworCisgICAgc3NjQml0cyA9IG1wNFNwYWNlRW5jb2RlckluZm8ucFNzY0J1Zi0+blNzY1NpemVCaXRzOworCisgIH0gLyogdmFsaWQgaE1wc0VuYyAqLworCisgIHJldHVybiBzc2NCaXRzOworfQorCitzdGF0aWMgSU5UIEZES19NcGVnc0VuY19Xcml0ZUZyYW1lSGVhZGVyKEhBTkRMRV9NUFNfRU5DT0RFUiBoTXBzRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqY29uc3QgcE91dHB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG91dHB1dEJ1ZmZlclNpemUpIHsKKyAgY29uc3QgaW50IHNhY1RpbWVBbGlnbkZsYWcgPSAwOworCisgIC8qIEluaXRpYWxpemUgdmFyaWFibGVzICovCisgIGludCBudW1CaXRzID0gMDsKKworICBpZiAoKE5VTEwgIT0gaE1wc0VuYykgJiYgKE5VTEwgIT0gcE91dHB1dEJ1ZmZlcikpIHsKKyAgICBVSU5UIGFsaWduQW5jaG9yLCBjbnQ7CisgICAgRkRLX0JJVFNUUkVBTSBCczsKKyAgICBGREtpbml0Qml0U3RyZWFtKCZCcywgcE91dHB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyU2l6ZSwgMCwgQlNfV1JJVEVSKTsKKworICAgIC8qIENhbGN1bGF0ZSBTU0MgbGVuZ3RoIGluZm9ybWF0aW9uICovCisgICAgY250ID0gKEZES19NcGVnc0VuY19Xcml0ZVNwYXRpYWxTcGVjaWZpY0NvbmZpZyhoTXBzRW5jLCBOVUxMKSArIDcpID4+IDM7CisKKyAgICAvKiBXcml0ZSBTU0MgKi8KKyAgICBGREt3cml0ZUJpdHMoJkJzLCBzYWNUaW1lQWxpZ25GbGFnLCAxKTsKKworICAgIGlmIChjbnQgPCAxMjcpIHsKKyAgICAgIEZES3dyaXRlQml0cygmQnMsIGNudCwgNyk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZES3dyaXRlQml0cygmQnMsIDEyNywgNyk7CisgICAgICBGREt3cml0ZUJpdHMoJkJzLCBjbnQgLSAxMjcsIDE2KTsKKyAgICB9CisKKyAgICBhbGlnbkFuY2hvciA9IEZES2dldFZhbGlkQml0cygmQnMpOworICAgIEZES19NcGVnc0VuY19Xcml0ZVNwYXRpYWxTcGVjaWZpY0NvbmZpZyhoTXBzRW5jLCAmQnMpOworICAgIEZES2J5dGVBbGlnbigmQnMsIGFsaWduQW5jaG9yKTsgLyogYnNGaWxsQml0cyAqLworCisgICAgaWYgKHNhY1RpbWVBbGlnbkZsYWcpIHsKKyAgICAgIEZES19BU1NFUlQoMSk7IC8qIHRpbWUgYWxpZ25tZW50IG5vdCBzdXBwb3J0ZWQgKi8KKyAgICB9CisKKyAgICBudW1CaXRzID0gRkRLZ2V0VmFsaWRCaXRzKCZCcyk7CisgIH0gLyogdmFsaWQgaGFuZGxlICovCisKKyAgcmV0dXJuICgobnVtQml0cyArIDcpID4+IDMpOworfQorCitJTlQgRkRLX01wZWdzRW5jX0dldENsb3Nlc3RCaXRSYXRlKGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGF1ZGlvT2JqZWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIHNhbXBsaW5ncmF0ZSwgY29uc3QgVUlOVCBzYnJSYXRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBiaXRyYXRlKSB7CisgIHVuc2lnbmVkIGludCBpOworICBpbnQgdGFyZ2V0Qml0cmF0ZSA9IC0xOworCisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YobXBzQ29uZmlnVGFiKSAvIHNpemVvZihNUFNfQ09ORklHX1RBQik7IGkrKykgeworICAgIGlmICgobXBzQ29uZmlnVGFiW2ldLmF1ZGlvX29iamVjdF90eXBlID09IGF1ZGlvT2JqZWN0VHlwZSkgJiYKKyAgICAgICAgKG1wc0NvbmZpZ1RhYltpXS5jaGFubmVsX21vZGUgPT0gY2hhbm5lbE1vZGUpICYmCisgICAgICAgIChtcHNDb25maWdUYWJbaV0uc2JyX3JhdGlvID09IHNiclJhdGlvKSAmJgorICAgICAgICAobXBzQ29uZmlnVGFiW2ldLnNhbXBsaW5nX3JhdGUgPT0gc2FtcGxpbmdyYXRlKSkgeworICAgICAgdGFyZ2V0Qml0cmF0ZSA9IGZNaW4oZk1heChiaXRyYXRlLCBtcHNDb25maWdUYWJbaV0uYml0cmF0ZV9taW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBzQ29uZmlnVGFiW2ldLmJpdHJhdGVfbWF4KTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdGFyZ2V0Qml0cmF0ZTsKK30KKworSU5UIEZES19NcGVnc0VuY19HZXREZWxheShIQU5ETEVfTVBTX0VOQ09ERVIgaE1wc0VuYykgeworICBJTlQgZGVsYXkgPSAwOworCisgIGlmIChOVUxMICE9IGhNcHNFbmMpIHsKKyAgICBNUDRTUEFDRUVOQ19JTkZPIG1wNFNwYWNlRW5jb2RlckluZm87CisgICAgRkRLX3NhY2VuY19nZXRJbmZvKGhNcHNFbmMtPmhTYWNFbmNvZGVyLCAmbXA0U3BhY2VFbmNvZGVySW5mbyk7CisgICAgZGVsYXkgPSBtcDRTcGFjZUVuY29kZXJJbmZvLm5Db2RlY0RlbGF5OworICB9CisKKyAgcmV0dXJuIGRlbGF5OworfQorCitJTlQgRkRLX01wZWdzRW5jX0dldERlY0RlbGF5KEhBTkRMRV9NUFNfRU5DT0RFUiBoTXBzRW5jKSB7CisgIElOVCBkZWxheSA9IDA7CisKKyAgaWYgKE5VTEwgIT0gaE1wc0VuYykgeworICAgIE1QNFNQQUNFRU5DX0lORk8gbXA0U3BhY2VFbmNvZGVySW5mbzsKKyAgICBGREtfc2FjZW5jX2dldEluZm8oaE1wc0VuYy0+aFNhY0VuY29kZXIsICZtcDRTcGFjZUVuY29kZXJJbmZvKTsKKyAgICBkZWxheSA9IG1wNFNwYWNlRW5jb2RlckluZm8ubkRlY29kZXJEZWxheTsKKyAgfQorCisgIHJldHVybiBkZWxheTsKK30KKworTVBTX0VOQ09ERVJfRVJST1IgRkRLX01wZWdzRW5jX0dldExpYkluZm8oTElCX0lORk8gKmluZm8pIHsKKyAgTVBTX0VOQ09ERVJfRVJST1IgZXJyb3IgPSBNUFNfRU5DT0RFUl9PSzsKKworICBpZiAoTlVMTCA9PSBpbmZvKSB7CisgICAgZXJyb3IgPSBNUFNfRU5DT0RFUl9JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIGlmIChTQUNFTkNfT0sgIT0gRkRLX3NhY2VuY19nZXRMaWJJbmZvKGluZm8pKSB7CisgICAgZXJyb3IgPSBNUFNfRU5DT0RFUl9JTklUX0VSUk9SOworICB9CisKKyAgcmV0dXJuIGVycm9yOworfQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9tcHNfbWFpbi5oIGIvbGliQUFDZW5jL3NyYy9tcHNfbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NjY3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJBQUNlbmMvc3JjL21wc19tYWluLmgKQEAgLTAsMCArMSwyNzAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hcmt1cyBMb2h3YXNzZXIKKworICAgRGVzY3JpcHRpb246IE1wZWcgU3Vycm91bmQgbGlicmFyeSBpbnRlcmZhY2UgZnVuY3Rpb25zCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTVBTX01BSU5fSAorI2RlZmluZSBNUFNfTUFJTl9ICisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJhYWNlbmMuaCIKKyNpbmNsdWRlICJGREtfYXVkaW8uaCIKKyNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKKworLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKyAgTVBTX0VOQ09ERVJfT0sgPSAweDAwMDAsIC8qITwgTm8gZXJyb3IgaGFwcGVuZWQuIEFsbCBmaW5lLiAqLworICBNUFNfRU5DT0RFUl9JTlZBTElEX0hBTkRMRSA9CisgICAgICAweDAwMjAsIC8qITwgSGFuZGxlIHBhc3NlZCB0byBmdW5jdGlvbiBjYWxsIHdhcyBpbnZhbGlkLiAqLworICBNUFNfRU5DT0RFUl9NRU1PUllfRVJST1IgPSAweDAwMjEsIC8qITwgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiAqLworICBNUFNfRU5DT0RFUl9JTklUX0VSUk9SID0gMHgwMDQwLCAgIC8qITwgR2VuZXJhbCBpbml0aWFsaXphdGlvbiBlcnJvci4gKi8KKyAgTVBTX0VOQ09ERVJfRU5DT0RFX0VSUk9SID0KKyAgICAgIDB4MDA2MCAvKiE8IFRoZSBlbmNvZGluZyBwcm9jZXNzIHdhcyBpbnRlcnJ1cHRlZCBieSBhbiB1bmV4cGVjdGVkIGVycm9yLgorICAgICAgICAgICAgICAqLworCit9IE1QU19FTkNPREVSX0VSUk9SOworCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogIE1QRUcgU3Vycm91bmQgRW5jb2RlciBpbnRlcmZhY2UgaGFuZGxlLgorICovCit0eXBlZGVmIHN0cnVjdCBNUFNfRU5DT0RFUiBNUFNfRU5DT0RFUiwgKkhBTkRMRV9NUFNfRU5DT0RFUjsKKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFxicmllZiAgT3BlbiBhIE1wZWcgU3Vycm91bmQgRW5jb2RlciBpbnN0YW5jZS4KKyAqCisgKiBccGhNcHNFbmMgICAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byBhIE1QUyBoYW5kbGUgdG8gYmUgYWxsb2NhdGVkLgorICogSW5pdGlhbGl6ZWQgb24gcmV0dXJuLgorICoKKyAqIFxyZXR1cm4KKyAqICAgICAgICAgIC0gTVBTX0VOQ09ERVJfT0ssIG9uIHN1Y2Nlcy4KKyAqICAgICAgICAgIC0gTVBTX0VOQ09ERVJfSU5WQUxJRF9IQU5ETEUsIE1QU19FTkNPREVSX01FTU9SWV9FUlJPUiwgb24gZmFpbHVyZS4KKyAqLworTVBTX0VOQ09ERVJfRVJST1IgRkRLX01wZWdzRW5jX09wZW4oSEFORExFX01QU19FTkNPREVSICpwaE1wc0VuYyk7CisKKy8qKgorICogXGJyaWVmICBDbG9zZSB0aGUgTXBlZyBTdXJyb3VuZCBFbmNvZGVyIGluc3RhbmNlLgorICoKKyAqIERlYWxsb2NhdGUgaW5zdGFuY2UgYW5kIGZyZWUgd2hvbGUgbWVtb3J5LgorICoKKyAqIFxwYXJhbSBwaE1wc0VuYyAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgTVBTIGhhbmRsZSB0byBiZSBkZWFsbG9jYXRlZC4KKyAqCisgKiBccmV0dXJuCisgKiAgICAgICAgICAtIE1QU19FTkNPREVSX09LLCBvbiBzdWNjZXMuCisgKiAgICAgICAgICAtIE1QU19FTkNPREVSX0lOVkFMSURfSEFORExFLCBvbiBmYWlsdXJlLgorICovCitNUFNfRU5DT0RFUl9FUlJPUiBGREtfTXBlZ3NFbmNfQ2xvc2UoSEFORExFX01QU19FTkNPREVSICpwaE1wc0VuYyk7CisKKy8qKgorICogXGJyaWVmICBJbml0aWFsaXplIGEgTXBlZyBTdXJyb3VuZCBFbmNvZGVyIGluc3RhbmNlLgorICoKKyAqIFxwYXJhbSBoTXBzRW5jICAgICAgICAgICAgICAgICAgIE1QUyBFbmNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBhdWRpb09iamVjdFR5cGUgICAgICAgICAgIEF1ZGlvIG9iamVjdCB0eXBlLgorICogXHBhcmFtIHNhbXBsaW5ncmF0ZSAgICAgICAgICAgICAgU2FtcGxpbmcgcmF0ZSBpbiBIeiBvZiBhdWRpbyBpbnB1dCBzaWduYWwuCisgKiBccGFyYW0gYml0cmF0ZSAgICAgICAgICAgICAgICAgICBFbmNkZXIgdGFyZ2V0IGJpdHJhdGUuCisgKiBccGFyYW0gc2JyUmF0aW8gICAgICAgICAgICAgICAgICBTQlIgc2FtcGxpbmcgcmF0ZSByYXRpby4KKyAqIFxwYXJhbSBmcmFtZWxlbmd0aCAgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIHRvIGJlIHByb2Nlc3NlcyB3aXRoaW4gb25lCisgKiBmcmFtZS4KKyAqIFxwYXJhbSBpbnB1dEJ1ZmZlclNpemVQZXJDaGFubmVsIFNpemUgb2YgaW5wdXQgYnVmZmVyIHBlciBjaGFubmVsLgorICogXHBhcmFtIGNvcmVDb2RlckRlbGF5ICAgICAgICAgICAgQ29yZSBjb2RlciBkZWxheS4KKyAqCisgKiBccmV0dXJuCisgKiAgICAgICAgICAtIE1QU19FTkNPREVSX09LLCBvbiBzdWNjZXMuCisgKiAgICAgICAgICAtIE1QU19FTkNPREVSX0lOVkFMSURfSEFORExFLCBNUFNfRU5DT0RFUl9FTkNPREVfRVJST1IsIG9uIGZhaWx1cmUuCisgKi8KK01QU19FTkNPREVSX0VSUk9SIEZES19NcGVnc0VuY19Jbml0KEhBTkRMRV9NUFNfRU5DT0RFUiBoTXBzRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgYXVkaW9PYmplY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBzYW1wbGluZ3JhdGUsIGNvbnN0IFVJTlQgYml0cmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgc2JyUmF0aW8sIGNvbnN0IFVJTlQgZnJhbWVsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGlucHV0QnVmZmVyU2l6ZVBlckNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGNvcmVDb2RlckRlbGF5KTsKKworLyoqCisgKiBcYnJpZWYgIENhbGN1bGF0ZSBNcGVnIFN1cnJvdW5kIHByb2Nlc3NpbmcuCisgKgorICogVGhpcyBmdWN0aW9uIGFwcGxpZXMgdGhlIE1QUyBwcm9jZXNzaW5nLiBUaGUgTVBTIHNpZGUgaW5mbyB3aWxsIGJlIHdyaXR0ZW4gdG8KKyAqIGV4dGVuc2lvbiBwYXlsb2FkLiBUaGUgaW5wdXQgYXVkaW8gZGF0YSB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBjYWxjdWxhdGVkCisgKiBkb3dubWl4LgorICoKKyAqIFxwYXJhbSBoTXBzRW5jICAgICAgICAgICAgICAgTVBTIEVuY29kZXIgaGFuZGxlLgorICogXHBhcmFtIHBBdWRpb1NhbXBsZXMgICAgICAgICBQb2ludGVyIHRvIGF1ZGlvIGlucHV0L291dHB1dCBkYXRhLgorICogXHBhcmFtIG5BdWRpb1NhbXBsZXMgICAgICAgICBOdW1iZXIgb2YgaW5wdXQgYXVkaW8gc2FtcGxlcyB0byBiZSBwcmNlc3NlZC4KKyAqIFxwYXJhbSBwTXBzRXh0UGF5bG9hZCAgICAgICAgUG9pbnRlciB0byBleHRlbnNpb24gcGF5bG9hZCB0byBiZSBmaWxsZWQgb24KKyAqIHJldHVybi4KKyAqCisgKiBccmV0dXJuCisgKiAgICAgICAgICAtIE1QU19FTkNPREVSX09LLCBvbiBzdWNjZXMuCisgKiAgICAgICAgICAtIE1QU19FTkNPREVSX0lOVkFMSURfSEFORExFLCBNUFNfRU5DT0RFUl9FTkNPREVfRVJST1IsIG9uIGZhaWx1cmUuCisgKi8KK01QU19FTkNPREVSX0VSUk9SIEZES19NcGVnc0VuY19Qcm9jZXNzKEhBTkRMRV9NUFNfRU5DT0RFUiBoTXBzRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqY29uc3QgcEF1ZGlvU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQXVkaW9TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDRU5DX0VYVF9QQVlMT0FEICpwTXBzRXh0UGF5bG9hZCk7CisKKy8qKgorICogXGJyaWVmICBXcml0ZSBTcGF0aWFsIFNwZWNpZmljIENvbmZpZy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgdmlhIGNhbGwgYmFjayBmcm9tIHRoZSB0cmFuc3BvcnQgbGlicmFyeSB0byB3cml0ZQorICogdGhlIFNwYXRpYWwgU3BlY2lmaWMgQ29uZmlnIHRvIGdpdmVuIGJpdHN0cmVhbSBidWZmZXIuCisgKgorICogXHBhcmFtIGhNcHNFbmMgICAgICAgICAgICAgICBNUFMgRW5jb2RlciBoYW5kbGUuCisgKiBccGFyYW0gaEJzICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbSBidWZmZXIgaGFuZGxlLgorICoKKyAqIFxyZXR1cm4gICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHdyaXR0ZW4gYml0cy4KKyAqLworSU5UIEZES19NcGVnc0VuY19Xcml0ZVNwYXRpYWxTcGVjaWZpY0NvbmZpZyhIQU5ETEVfTVBTX0VOQ09ERVIgaE1wc0VuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzKTsKKworLyoqCisgKiBcYnJpZWYgIEdldCBjbG9zZXN0IHZhbGlkIGJpdHJhdGUgc3VwcG9ydGVkIGJ5IGdpdmVuIGNvbmZpZy4KKyAqCisgKiBccGFyYW0gYXVkaW9PYmplY3RUeXBlICAgICAgIEF1ZGlvIG9iamVjdCB0eXBlLgorICogXHBhcmFtIGNoYW5uZWxNb2RlICAgICAgICAgICBFbmNvZGVyIGNoYW5uZWwgbW9kZS4KKyAqIFxwYXJhbSBzYW1wbGluZ3JhdGUgICAgICAgICAgU2FtcGxpbmcgcmF0ZSBpbiBIeiBvZiBhdWRpbyBpbnB1dCBzaWduYWwuCisgKiBccGFyYW0gc2JyUmF0aW8gICAgICAgICAgICAgIFNCUiBzYW1wbGluZyByYXRlIHJhdGlvLgorICogXHBhcmFtIGJpdHJhdGUgICAgICAgICAgICAgICBUaGUgZGVzaXJlZCB0YXJnZXQgYml0cmF0ZS4KKyAqCisgKiBccmV0dXJuICAgICAgICAgICAgICAgICAgICAgIENsb3Nlc3QgdmFsaWQgYml0cmF0ZSB0byBnaXZlbiBiaXRyYXRlLi4KKyAqLworSU5UIEZES19NcGVnc0VuY19HZXRDbG9zZXN0Qml0UmF0ZShjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb09iamVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENIQU5ORUxfTU9ERSBjaGFubmVsTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBzYW1wbGluZ3JhdGUsIGNvbnN0IFVJTlQgc2JyUmF0aW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgYml0cmF0ZSk7CisKKy8qKgorICogXGJyaWVmICBHZXQgY29kZWMgZGVsYXkuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGRlbGF5IG9mIHRoZSB3aG9sZSBlbi0vZGVjb2RlZCBzaWduYWwsIGluY2x1ZGluZworICogY29yZWNvZGVyIGRlbGF5LgorICoKKyAqIFxwYXJhbSBoTXBzRW5jICAgICAgICAgICAgICAgTVBTIEVuY29kZXIgaGFuZGxlLgorICoKKyAqIFxyZXR1cm4gICAgICAgICAgICAgICAgICAgICAgQ29kZWMgZGVsYXkgaW4gc2FtcGxlcy4KKyAqLworSU5UIEZES19NcGVnc0VuY19HZXREZWxheShIQU5ETEVfTVBTX0VOQ09ERVIgaE1wc0VuYyk7CisKKy8qKgorICogXGJyaWVmICBHZXQgTXBlZyBTdXJyb3VuZCBEZWNvZGVyIGRlbGF5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBkZWxheSBvZiB0aGUgTXBlZyBTdXJyb3VuZCBkZWNvZGVyLgorICoKKyAqIFxwYXJhbSBoTXBzRW5jICAgICAgICAgICAgICAgTVBTIEVuY29kZXIgaGFuZGxlLgorICoKKyAqIFxyZXR1cm4gICAgICAgICAgICAgICAgICAgICAgTXBlZyBTdXJyb3VuZCBEZWNvZGVyIGRlbGF5IGluIHNhbXBsZXMuCisgKi8KK0lOVCBGREtfTXBlZ3NFbmNfR2V0RGVjRGVsYXkoSEFORExFX01QU19FTkNPREVSIGhNcHNFbmMpOworCisvKioKKyAqIFxicmllZiAgR2V0IGluZm9ybWF0aW9uIGFib3V0IGVuY29kZXIgbGlicmFyeSBidWlsZC4KKyAqCisgKiBGaWxsIGEgZ2l2ZW4gTElCX0lORk8gc3RydWN0dXJlIHdpdGggbGlicmFyeSB2ZXJzaW9uIGluZm9ybWF0aW9uLgorICoKKyAqIFxwYXJhbSBpbmZvICBQb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBMSUJfSU5GTyBzdHJ1Y3QuCisgKgorICogXHJldHVybgorICogICAgICAgICAgLSBNUFNfRU5DT0RFUl9PSywgb24gc3VjY2VzLgorICogICAgICAgICAgLSBNUFNfRU5DT0RFUl9JTlZBTElEX0hBTkRMRSwgTVBTX0VOQ09ERVJfSU5JVF9FUlJPUiwgb24gZmFpbHVyZS4KKyAqLworTVBTX0VOQ09ERVJfRVJST1IgRkRLX01wZWdzRW5jX0dldExpYkluZm8oTElCX0lORk8gKmluZm8pOworCisjZW5kaWYgLyogTVBTX01BSU5fSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9tc19zdGVyZW8uY3BwIGIvbGliQUFDZW5jL3NyYy9tc19zdGVyZW8uY3BwCmluZGV4IDMwNmQ0OTAuLjZhMTIxYjIgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvbXNfc3RlcmVvLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL21zX3N0ZXJlby5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTczICs5MCwyMDYgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBNUyBzdGVyZW8gcHJvY2Vzc2luZworICAgQXV0aG9yKHMpOiAgIE0uV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBNUyBzdGVyZW8gcHJvY2Vzc2luZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAjaW5jbHVkZSAibXNfc3RlcmVvLmgiCiAKICNpbmNsdWRlICJwc3lfY29uc3QuaCIKIAogLyogc3RhdGljIGNvbnN0IGZsb2F0IHNjYWxlTWluVGhyZXMgPSAxLjBmOyAqLyAvKiAwLjc1ZiBmb3IgM2RiIGJvb3N0ICovCiAKLXZvaWQgRkRLYWFjRW5jX01zU3RlcmVvUHJvY2Vzc2luZyhQU1lfREFUQSAgICpSRVNUUklDVCBwc3lEYXRhWygyKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWxbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICppc0Jvb2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICptc0RpZ2VzdCwgICAgICAgLyogb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICptc01hc2ssICAgICAgICAgLyogb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAqc2ZiT2Zmc2V0KQotewotICAgIEZJWFBfREJMICAgICAgICAqc2ZiRW5lcmd5TGVmdCA9IHBzeURhdGFbMF0tPnNmYkVuZXJneS5Mb25nOyAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kaWZpZWQgd2hlcmUgbXNNYXNrPT0xICovCi0gICAgRklYUF9EQkwgICAgICAgICpzZmJFbmVyZ3lSaWdodCA9IHBzeURhdGFbMV0tPnNmYkVuZXJneS5Mb25nOyAgICAgICAgICAgICAgICAgICAgICAvKiBtb2RpZmllZCB3aGVyZSBtc01hc2s9PTEgKi8KLSAgICBjb25zdCBGSVhQX0RCTCAgKnNmYkVuZXJneU1pZCA9IHBzeURhdGFbMF0tPnNmYkVuZXJneU1TLkxvbmc7Ci0gICAgY29uc3QgRklYUF9EQkwgICpzZmJFbmVyZ3lTaWRlID0gcHN5RGF0YVsxXS0+c2ZiRW5lcmd5TVMuTG9uZzsKLSAgICBGSVhQX0RCTCAgICAgICAgKnNmYlRocmVzaG9sZExlZnQgPSBwc3lEYXRhWzBdLT5zZmJUaHJlc2hvbGQuTG9uZzsgICAgICAgICAgICAgICAgIC8qIG1vZGlmaWVkIHdoZXJlIG1zTWFzaz09MSAqLwotICAgIEZJWFBfREJMICAgICAgICAqc2ZiVGhyZXNob2xkUmlnaHQgPSBwc3lEYXRhWzFdLT5zZmJUaHJlc2hvbGQuTG9uZzsgICAgICAgICAgICAgICAgLyogbW9kaWZpZWQgd2hlcmUgbXNNYXNrPT0xICovCit2b2lkIEZES2FhY0VuY19Nc1N0ZXJlb1Byb2Nlc3NpbmcoUFNZX0RBVEEgKlJFU1RSSUNUIHBzeURhdGFbKDIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5uZWxbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICppc0Jvb2ssIElOVCAqbXNEaWdlc3QsIC8qIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbXNNYXNrLCAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYWxsb3dNUywgY29uc3QgSU5UIHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqc2ZiT2Zmc2V0KSB7CisgIEZJWFBfREJMICpzZmJFbmVyZ3lMZWZ0ID0KKyAgICAgIHBzeURhdGFbMF0tPnNmYkVuZXJneS5Mb25nOyAvKiBtb2RpZmllZCB3aGVyZSBtc01hc2s9PTEgKi8KKyAgRklYUF9EQkwgKnNmYkVuZXJneVJpZ2h0ID0KKyAgICAgIHBzeURhdGFbMV0tPnNmYkVuZXJneS5Mb25nOyAvKiBtb2RpZmllZCB3aGVyZSBtc01hc2s9PTEgKi8KKyAgY29uc3QgRklYUF9EQkwgKnNmYkVuZXJneU1pZCA9IHBzeURhdGFbMF0tPnNmYkVuZXJneU1TLkxvbmc7CisgIGNvbnN0IEZJWFBfREJMICpzZmJFbmVyZ3lTaWRlID0gcHN5RGF0YVsxXS0+c2ZiRW5lcmd5TVMuTG9uZzsKKyAgRklYUF9EQkwgKnNmYlRocmVzaG9sZExlZnQgPQorICAgICAgcHN5RGF0YVswXS0+c2ZiVGhyZXNob2xkLkxvbmc7IC8qIG1vZGlmaWVkIHdoZXJlIG1zTWFzaz09MSAqLworICBGSVhQX0RCTCAqc2ZiVGhyZXNob2xkUmlnaHQgPQorICAgICAgcHN5RGF0YVsxXS0+c2ZiVGhyZXNob2xkLkxvbmc7IC8qIG1vZGlmaWVkIHdoZXJlIG1zTWFzaz09MSAqLwogCi0gICAgRklYUF9EQkwgICAgICAgICpzZmJTcHJlYWRFbkxlZnQgPSBwc3lEYXRhWzBdLT5zZmJTcHJlYWRFbmVyZ3kuTG9uZzsKLSAgICBGSVhQX0RCTCAgICAgICAgKnNmYlNwcmVhZEVuUmlnaHQgPSBwc3lEYXRhWzFdLT5zZmJTcHJlYWRFbmVyZ3kuTG9uZzsKKyAgRklYUF9EQkwgKnNmYlNwcmVhZEVuTGVmdCA9IHBzeURhdGFbMF0tPnNmYlNwcmVhZEVuZXJneS5Mb25nOworICBGSVhQX0RCTCAqc2ZiU3ByZWFkRW5SaWdodCA9IHBzeURhdGFbMV0tPnNmYlNwcmVhZEVuZXJneS5Mb25nOwogCi0gICAgRklYUF9EQkwgICAgICAgICpzZmJFbmVyZ3lMZWZ0TGREYXRhID0gcHN5T3V0Q2hhbm5lbFswXS0+c2ZiRW5lcmd5TGREYXRhOyAgICAgICAgLyogbW9kaWZpZWQgd2hlcmUgbXNNYXNrPT0xICovCi0gICAgRklYUF9EQkwgICAgICAgICpzZmJFbmVyZ3lSaWdodExkRGF0YSA9IHBzeU91dENoYW5uZWxbMV0tPnNmYkVuZXJneUxkRGF0YTsgICAgICAgLyogbW9kaWZpZWQgd2hlcmUgbXNNYXNrPT0xICovCi0gICAgRklYUF9EQkwgICAgICAgICpzZmJFbmVyZ3lNaWRMZERhdGEgPSBwc3lEYXRhWzBdLT5zZmJFbmVyZ3lNU0xkRGF0YTsKLSAgICBGSVhQX0RCTCAgICAgICAgKnNmYkVuZXJneVNpZGVMZERhdGEgPSBwc3lEYXRhWzFdLT5zZmJFbmVyZ3lNU0xkRGF0YTsKLSAgICBGSVhQX0RCTCAgICAgICAgKnNmYlRocmVzaG9sZExlZnRMZERhdGEgPSBwc3lPdXRDaGFubmVsWzBdLT5zZmJUaHJlc2hvbGRMZERhdGE7ICAvKiBtb2RpZmllZCB3aGVyZSBtc01hc2s9PTEgKi8KLSAgICBGSVhQX0RCTCAgICAgICAgKnNmYlRocmVzaG9sZFJpZ2h0TGREYXRhID0gcHN5T3V0Q2hhbm5lbFsxXS0+c2ZiVGhyZXNob2xkTGREYXRhOyAvKiBtb2RpZmllZCB3aGVyZSBtc01hc2s9PTEgKi8KKyAgRklYUF9EQkwgKnNmYkVuZXJneUxlZnRMZERhdGEgPQorICAgICAgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiRW5lcmd5TGREYXRhOyAvKiBtb2RpZmllZCB3aGVyZSBtc01hc2s9PTEgKi8KKyAgRklYUF9EQkwgKnNmYkVuZXJneVJpZ2h0TGREYXRhID0KKyAgICAgIHBzeU91dENoYW5uZWxbMV0tPnNmYkVuZXJneUxkRGF0YTsgLyogbW9kaWZpZWQgd2hlcmUgbXNNYXNrPT0xICovCisgIEZJWFBfREJMICpzZmJFbmVyZ3lNaWRMZERhdGEgPSBwc3lEYXRhWzBdLT5zZmJFbmVyZ3lNU0xkRGF0YTsKKyAgRklYUF9EQkwgKnNmYkVuZXJneVNpZGVMZERhdGEgPSBwc3lEYXRhWzFdLT5zZmJFbmVyZ3lNU0xkRGF0YTsKKyAgRklYUF9EQkwgKnNmYlRocmVzaG9sZExlZnRMZERhdGEgPQorICAgICAgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiVGhyZXNob2xkTGREYXRhOyAvKiBtb2RpZmllZCB3aGVyZSBtc01hc2s9PTEgKi8KKyAgRklYUF9EQkwgKnNmYlRocmVzaG9sZFJpZ2h0TGREYXRhID0KKyAgICAgIHBzeU91dENoYW5uZWxbMV0tPnNmYlRocmVzaG9sZExkRGF0YTsgLyogbW9kaWZpZWQgd2hlcmUgbXNNYXNrPT0xICovCiAKLSAgICBGSVhQX0RCTCAgICAgICAgKm1kY3RTcGVjdHJ1bUxlZnQgPSBwc3lEYXRhWzBdLT5tZGN0U3BlY3RydW07ICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZGlmaWVkIHdoZXJlIG1zTWFzaz09MSAqLwotICAgIEZJWFBfREJMICAgICAgICAqbWRjdFNwZWN0cnVtUmlnaHQgPSBwc3lEYXRhWzFdLT5tZGN0U3BlY3RydW07ICAgICAgICAgICAgICAgICAgICAgLyogbW9kaWZpZWQgd2hlcmUgbXNNYXNrPT0xICovCisgIEZJWFBfREJMICptZGN0U3BlY3RydW1MZWZ0ID0KKyAgICAgIHBzeURhdGFbMF0tPm1kY3RTcGVjdHJ1bTsgLyogbW9kaWZpZWQgd2hlcmUgbXNNYXNrPT0xICovCisgIEZJWFBfREJMICptZGN0U3BlY3RydW1SaWdodCA9CisgICAgICBwc3lEYXRhWzFdLT5tZGN0U3BlY3RydW07IC8qIG1vZGlmaWVkIHdoZXJlIG1zTWFzaz09MSAqLwogCi0gICAgSU5UICAgICAgICAgICAgIHNmYixzZmJvZmZzLCBqOyAgICAgICAgICAgLyogbG9vcCBjb3VudGVycyAgICAgICAgICovCi0gICAgRklYUF9EQkwgICAgICAgIHBubHJMZERhdGEsIHBubXNMZERhdGE7Ci0gICAgRklYUF9EQkwgICAgICAgIG1pblRocmVzaG9sZExkRGF0YTsKLSAgICBGSVhQX0RCTCAgICAgICAgbWluVGhyZXNob2xkOwotICAgIElOVCAgICAgICAgICAgICB1c2VNUzsKKyAgSU5UIHNmYiwgc2Zib2ZmcywgajsgLyogbG9vcCBjb3VudGVycyAgICAgICAgICovCisgIEZJWFBfREJMIHBubHJMZERhdGEsIHBubXNMZERhdGE7CisgIEZJWFBfREJMIG1pblRocmVzaG9sZExkRGF0YTsKKyAgRklYUF9EQkwgbWluVGhyZXNob2xkOworICBJTlQgdXNlTVM7CiAKLSAgICBJTlQgICAgICAgICAgICAgbXNNYXNrVHJ1ZVNvbWV3aGVyZSA9IDA7ICAvKiB0byBkZXRlcm1pbmUgbXNEaWdlc3QgKi8KLSAgICBJTlQgICAgICAgICAgICAgbnVtTXNNYXNrRmFsc2UgPSAwOyAgICAgICAvKiBudW1iZXIgb2Ygbm9uLWludGVuc2l0eSBiYW5kcyB3aGVyZSBML1IgY29kaW5nIGlzIHVzZWQgKi8KKyAgSU5UIG1zTWFza1RydWVTb21ld2hlcmUgPSAwOyAvKiB0byBkZXRlcm1pbmUgbXNEaWdlc3QgKi8KKyAgSU5UIG51bU1zTWFza0ZhbHNlID0KKyAgICAgIDA7IC8qIG51bWJlciBvZiBub24taW50ZW5zaXR5IGJhbmRzIHdoZXJlIEwvUiBjb2RpbmcgaXMgdXNlZCAqLwogCi0gICAgZm9yKHNmYj0wOyBzZmI8c2ZiQ250OyBzZmIrPXNmYlBlckdyb3VwKSB7Ci0gICAgICBmb3Ioc2Zib2Zmcz0wO3NmYm9mZnM8bWF4U2ZiUGVyR3JvdXA7c2Zib2ZmcysrKSB7CisgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQ250OyBzZmIgKz0gc2ZiUGVyR3JvdXApIHsKKyAgICBmb3IgKHNmYm9mZnMgPSAwOyBzZmJvZmZzIDwgbWF4U2ZiUGVyR3JvdXA7IHNmYm9mZnMrKykgeworICAgICAgaWYgKChpc0Jvb2sgPT0gTlVMTCkgPyAxIDogKGlzQm9va1tzZmIgKyBzZmJvZmZzXSA9PSAwKSkgeworICAgICAgICBGSVhQX0RCTCB0bXA7CiAKLSAgICAgICAgaWYgKCAoaXNCb29rPT1OVUxMKSA/IDEgOiAoaXNCb29rW3NmYitzZmJvZmZzXSA9PSAwKSApIHsKLSAgICAgICAgICBGSVhQX0RCTCB0bXA7CisgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICBtaW5UaHJlc2hvbGQ9bWluKHNmYlRocmVzaG9sZExlZnRbc2ZiK3NmYm9mZnNdLAorICAgICAgICAgICBzZmJUaHJlc2hvbGRSaWdodFtzZmIrc2Zib2Zmc10pKnNjYWxlTWluVGhyZXM7IHBubHIgPQorICAgICAgICAgICAoc2ZiVGhyZXNob2xkTGVmdFtzZmIrc2Zib2Zmc10vCisgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHNmYkVuZXJneUxlZnRbc2ZiK3NmYm9mZnNdLHNmYlRocmVzaG9sZExlZnRbc2ZiK3NmYm9mZnNdKSkqCisgICAgICAgICAgICAgICAgICAgICAgICAgKHNmYlRocmVzaG9sZFJpZ2h0W3NmYitzZmJvZmZzXS8KKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXgoc2ZiRW5lcmd5UmlnaHRbc2ZiK3NmYm9mZnNdLHNmYlRocmVzaG9sZFJpZ2h0W3NmYitzZmJvZmZzXSkpOworICAgICAgICAgICAgICAgICAgcG5tcyA9CisgICAgICAgICAgIChtaW5UaHJlc2hvbGQvbWF4KHNmYkVuZXJneU1pZFtzZmIrc2Zib2Zmc10sbWluVGhyZXNob2xkKSkqCisgICAgICAgICAgICAgICAgICAgICAgICAgKG1pblRocmVzaG9sZC9tYXgoc2ZiRW5lcmd5U2lkZVtzZmIrc2Zib2Zmc10sbWluVGhyZXNob2xkKSk7CisgICAgICAgICAgICAgICAgICB1c2VNUyA9IChwbm1zID4gcG5scik7CisgICAgICAgICovCiAKLS8qCi0gICAgICAgICAgbWluVGhyZXNob2xkPW1pbihzZmJUaHJlc2hvbGRMZWZ0W3NmYitzZmJvZmZzXSwgc2ZiVGhyZXNob2xkUmlnaHRbc2ZiK3NmYm9mZnNdKSpzY2FsZU1pblRocmVzOwotICAgICAgICAgIHBubHIgPSAoc2ZiVGhyZXNob2xkTGVmdFtzZmIrc2Zib2Zmc10vCi0gICAgICAgICAgICAgICAgIG1heChzZmJFbmVyZ3lMZWZ0W3NmYitzZmJvZmZzXSxzZmJUaHJlc2hvbGRMZWZ0W3NmYitzZmJvZmZzXSkpKgotICAgICAgICAgICAgICAgICAoc2ZiVGhyZXNob2xkUmlnaHRbc2ZiK3NmYm9mZnNdLwotICAgICAgICAgICAgICAgICBtYXgoc2ZiRW5lcmd5UmlnaHRbc2ZiK3NmYm9mZnNdLHNmYlRocmVzaG9sZFJpZ2h0W3NmYitzZmJvZmZzXSkpOwotICAgICAgICAgIHBubXMgPSAobWluVGhyZXNob2xkL21heChzZmJFbmVyZ3lNaWRbc2ZiK3NmYm9mZnNdLG1pblRocmVzaG9sZCkpKgotICAgICAgICAgICAgICAgICAobWluVGhyZXNob2xkL21heChzZmJFbmVyZ3lTaWRlW3NmYitzZmJvZmZzXSxtaW5UaHJlc2hvbGQpKTsKLSAgICAgICAgICB1c2VNUyA9IChwbm1zID4gcG5scik7Ci0qLworICAgICAgICAvKiB3ZSBhc3N1bWUgdGhhdCBzY2FsZU1pblRocmVzID09IDEuMGYgYW5kIHdlIGNhbiBkcm9wIGl0ICovCisgICAgICAgIG1pblRocmVzaG9sZExkRGF0YSA9IGZpeE1pbihzZmJUaHJlc2hvbGRMZWZ0TGREYXRhW3NmYiArIHNmYm9mZnNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkUmlnaHRMZERhdGFbc2ZiICsgc2Zib2Zmc10pOwogCi0gICAgICAgICAgLyogd2UgYXNzdW1lIHRoYXQgc2NhbGVNaW5UaHJlcyA9PSAxLjBmIGFuZCB3ZSBjYW4gZHJvcCBpdCAqLwotICAgICAgICAgIG1pblRocmVzaG9sZExkRGF0YSA9IGZpeE1pbihzZmJUaHJlc2hvbGRMZWZ0TGREYXRhW3NmYitzZmJvZmZzXSwgc2ZiVGhyZXNob2xkUmlnaHRMZERhdGFbc2ZiK3NmYm9mZnNdKTsKKyAgICAgICAgLyogcG5sckxkRGF0YSA9IHNmYlRocmVzaG9sZExlZnRMZERhdGFbc2ZiK3NmYm9mZnNdIC0KKyAgICAgICAgICAgICAgICAgICAgICBtYXgoc2ZiRW5lcmd5TGVmdExkRGF0YVtzZmIrc2Zib2Zmc10sCisgICAgICAgICAgIHNmYlRocmVzaG9sZExlZnRMZERhdGFbc2ZiK3NmYm9mZnNdKSArCisgICAgICAgICAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkUmlnaHRMZERhdGFbc2ZiK3NmYm9mZnNdIC0KKyAgICAgICAgICAgICAgICAgICAgICBtYXgoc2ZiRW5lcmd5UmlnaHRMZERhdGFbc2ZiK3NmYm9mZnNdLAorICAgICAgICAgICBzZmJUaHJlc2hvbGRSaWdodExkRGF0YVtzZmIrc2Zib2Zmc10pOyAqLworICAgICAgICB0bXAgPSBmaXhNYXgoc2ZiRW5lcmd5TGVmdExkRGF0YVtzZmIgKyBzZmJvZmZzXSwKKyAgICAgICAgICAgICAgICAgICAgIHNmYlRocmVzaG9sZExlZnRMZERhdGFbc2ZiICsgc2Zib2Zmc10pOworICAgICAgICBwbmxyTGREYXRhID0gKHNmYlRocmVzaG9sZExlZnRMZERhdGFbc2ZiICsgc2Zib2Zmc10gPj4gMSkgLSAodG1wID4+IDEpOworICAgICAgICBwbmxyTGREYXRhID0gcG5sckxkRGF0YSArIChzZmJUaHJlc2hvbGRSaWdodExkRGF0YVtzZmIgKyBzZmJvZmZzXSA+PiAxKTsKKyAgICAgICAgdG1wID0gZml4TWF4KHNmYkVuZXJneVJpZ2h0TGREYXRhW3NmYiArIHNmYm9mZnNdLAorICAgICAgICAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkUmlnaHRMZERhdGFbc2ZiICsgc2Zib2Zmc10pOworICAgICAgICBwbmxyTGREYXRhID0gcG5sckxkRGF0YSAtICh0bXAgPj4gMSk7CiAKLSAgICAgICAgICAvKiBwbmxyTGREYXRhID0gc2ZiVGhyZXNob2xkTGVmdExkRGF0YVtzZmIrc2Zib2Zmc10gLQotICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHNmYkVuZXJneUxlZnRMZERhdGFbc2ZiK3NmYm9mZnNdLCBzZmJUaHJlc2hvbGRMZWZ0TGREYXRhW3NmYitzZmJvZmZzXSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkUmlnaHRMZERhdGFbc2ZiK3NmYm9mZnNdIC0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1heChzZmJFbmVyZ3lSaWdodExkRGF0YVtzZmIrc2Zib2Zmc10sIHNmYlRocmVzaG9sZFJpZ2h0TGREYXRhW3NmYitzZmJvZmZzXSk7ICovCi0gICAgICAgICAgdG1wID0gZml4TWF4KHNmYkVuZXJneUxlZnRMZERhdGFbc2ZiK3NmYm9mZnNdLCBzZmJUaHJlc2hvbGRMZWZ0TGREYXRhW3NmYitzZmJvZmZzXSk7Ci0gICAgICAgICAgcG5sckxkRGF0YSA9IChzZmJUaHJlc2hvbGRMZWZ0TGREYXRhW3NmYitzZmJvZmZzXT4+MSkgLSAodG1wPj4xKTsKLSAgICAgICAgICBwbmxyTGREYXRhID0gcG5sckxkRGF0YSArIChzZmJUaHJlc2hvbGRSaWdodExkRGF0YVtzZmIrc2Zib2Zmc10+PjEpOwotICAgICAgICAgIHRtcCA9IGZpeE1heChzZmJFbmVyZ3lSaWdodExkRGF0YVtzZmIrc2Zib2Zmc10sIHNmYlRocmVzaG9sZFJpZ2h0TGREYXRhW3NmYitzZmJvZmZzXSk7Ci0gICAgICAgICAgcG5sckxkRGF0YSA9IHBubHJMZERhdGEgLSAodG1wPj4xKTsKKyAgICAgICAgLyogcG5tc0xkRGF0YSA9IG1pblRocmVzaG9sZExkRGF0YSAtCisgICAgICAgICAgIG1heChzZmJFbmVyZ3lNaWRMZERhdGFbc2ZiK3NmYm9mZnNdLCBtaW5UaHJlc2hvbGRMZERhdGEpICsKKyAgICAgICAgICAgICAgICAgICAgICBtaW5UaHJlc2hvbGRMZERhdGEgLSBtYXgoc2ZiRW5lcmd5U2lkZUxkRGF0YVtzZmIrc2Zib2Zmc10sCisgICAgICAgICAgIG1pblRocmVzaG9sZExkRGF0YSk7ICovCisgICAgICAgIHRtcCA9IGZpeE1heChzZmJFbmVyZ3lNaWRMZERhdGFbc2ZiICsgc2Zib2Zmc10sIG1pblRocmVzaG9sZExkRGF0YSk7CisgICAgICAgIHBubXNMZERhdGEgPSBtaW5UaHJlc2hvbGRMZERhdGEgLSAodG1wID4+IDEpOworICAgICAgICB0bXAgPSBmaXhNYXgoc2ZiRW5lcmd5U2lkZUxkRGF0YVtzZmIgKyBzZmJvZmZzXSwgbWluVGhyZXNob2xkTGREYXRhKTsKKyAgICAgICAgcG5tc0xkRGF0YSA9IHBubXNMZERhdGEgLSAodG1wID4+IDEpOworICAgICAgICB1c2VNUyA9ICgoYWxsb3dNUyAhPSAwKSAmJiAocG5tc0xkRGF0YSA+IHBubHJMZERhdGEpKSA/IDEgOiAwOwogCi0gICAgICAgICAgLyogcG5tc0xkRGF0YSA9IG1pblRocmVzaG9sZExkRGF0YSAtIG1heChzZmJFbmVyZ3lNaWRMZERhdGFbc2ZiK3NmYm9mZnNdLCBtaW5UaHJlc2hvbGRMZERhdGEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pblRocmVzaG9sZExkRGF0YSAtIG1heChzZmJFbmVyZ3lTaWRlTGREYXRhW3NmYitzZmJvZmZzXSwgbWluVGhyZXNob2xkTGREYXRhKTsgKi8KLSAgICAgICAgICB0bXAgPSBmaXhNYXgoc2ZiRW5lcmd5TWlkTGREYXRhW3NmYitzZmJvZmZzXSwgbWluVGhyZXNob2xkTGREYXRhKTsKLSAgICAgICAgICBwbm1zTGREYXRhID0gbWluVGhyZXNob2xkTGREYXRhIC0gKHRtcD4+MSk7Ci0gICAgICAgICAgdG1wID0gZml4TWF4KHNmYkVuZXJneVNpZGVMZERhdGFbc2ZiK3NmYm9mZnNdLCBtaW5UaHJlc2hvbGRMZERhdGEpOwotICAgICAgICAgIHBubXNMZERhdGEgPSBwbm1zTGREYXRhIC0gKHRtcD4+MSk7Ci0gICAgICAgICAgdXNlTVMgPSAocG5tc0xkRGF0YSA+IChwbmxyTGREYXRhKSk7CisgICAgICAgIGlmICh1c2VNUykgeworICAgICAgICAgIG1zTWFza1tzZmIgKyBzZmJvZmZzXSA9IDE7CisgICAgICAgICAgbXNNYXNrVHJ1ZVNvbWV3aGVyZSA9IDE7CisgICAgICAgICAgZm9yIChqID0gc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnNdOyBqIDwgc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnMgKyAxXTsKKyAgICAgICAgICAgICAgIGorKykgeworICAgICAgICAgICAgRklYUF9EQkwgc3BlY0wsIHNwZWNSOworICAgICAgICAgICAgc3BlY0wgPSBtZGN0U3BlY3RydW1MZWZ0W2pdID4+IDE7CisgICAgICAgICAgICBzcGVjUiA9IG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID4+IDE7CisgICAgICAgICAgICBtZGN0U3BlY3RydW1MZWZ0W2pdID0gc3BlY0wgKyBzcGVjUjsKKyAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID0gc3BlY0wgLSBzcGVjUjsKKyAgICAgICAgICB9CisgICAgICAgICAgbWluVGhyZXNob2xkID0gZml4TWluKHNmYlRocmVzaG9sZExlZnRbc2ZiICsgc2Zib2Zmc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYlRocmVzaG9sZFJpZ2h0W3NmYiArIHNmYm9mZnNdKTsKKyAgICAgICAgICBzZmJUaHJlc2hvbGRMZWZ0W3NmYiArIHNmYm9mZnNdID0gc2ZiVGhyZXNob2xkUmlnaHRbc2ZiICsgc2Zib2Zmc10gPQorICAgICAgICAgICAgICBtaW5UaHJlc2hvbGQ7CisgICAgICAgICAgc2ZiVGhyZXNob2xkTGVmdExkRGF0YVtzZmIgKyBzZmJvZmZzXSA9CisgICAgICAgICAgICAgIHNmYlRocmVzaG9sZFJpZ2h0TGREYXRhW3NmYiArIHNmYm9mZnNdID0gbWluVGhyZXNob2xkTGREYXRhOworICAgICAgICAgIHNmYkVuZXJneUxlZnRbc2ZiICsgc2Zib2Zmc10gPSBzZmJFbmVyZ3lNaWRbc2ZiICsgc2Zib2Zmc107CisgICAgICAgICAgc2ZiRW5lcmd5UmlnaHRbc2ZiICsgc2Zib2Zmc10gPSBzZmJFbmVyZ3lTaWRlW3NmYiArIHNmYm9mZnNdOworICAgICAgICAgIHNmYkVuZXJneUxlZnRMZERhdGFbc2ZiICsgc2Zib2Zmc10gPQorICAgICAgICAgICAgICBzZmJFbmVyZ3lNaWRMZERhdGFbc2ZiICsgc2Zib2Zmc107CisgICAgICAgICAgc2ZiRW5lcmd5UmlnaHRMZERhdGFbc2ZiICsgc2Zib2Zmc10gPQorICAgICAgICAgICAgICBzZmJFbmVyZ3lTaWRlTGREYXRhW3NmYiArIHNmYm9mZnNdOwogCisgICAgICAgICAgc2ZiU3ByZWFkRW5MZWZ0W3NmYiArIHNmYm9mZnNdID0gc2ZiU3ByZWFkRW5SaWdodFtzZmIgKyBzZmJvZmZzXSA9CisgICAgICAgICAgICAgIGZpeE1pbihzZmJTcHJlYWRFbkxlZnRbc2ZiICsgc2Zib2Zmc10sCisgICAgICAgICAgICAgICAgICAgICBzZmJTcHJlYWRFblJpZ2h0W3NmYiArIHNmYm9mZnNdKSA+PgorICAgICAgICAgICAgICAxOwogCi0gICAgICAgICAgaWYgKHVzZU1TKSB7Ci0gICAgICAgICAgICBtc01hc2tbc2ZiK3NmYm9mZnNdID0gMTsKLSAgICAgICAgICAgIG1zTWFza1RydWVTb21ld2hlcmUgPSAxOwotICAgICAgICAgICAgZm9yKGo9c2ZiT2Zmc2V0W3NmYitzZmJvZmZzXTsgajxzZmJPZmZzZXRbc2ZiK3NmYm9mZnMrMV07IGorKykgeworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1zTWFza1tzZmIgKyBzZmJvZmZzXSA9IDA7CisgICAgICAgICAgbnVtTXNNYXNrRmFsc2UrKzsKKyAgICAgICAgfSAvKiB1c2VNUyAqLworICAgICAgfSAgIC8qIGlzQm9vayAqLworICAgICAgZWxzZSB7CisgICAgICAgIC8qIGtlZXAgbURpZ2VzdCBmcm9tIElTIG1vZHVsZSAqLworICAgICAgICBpZiAobXNNYXNrW3NmYiArIHNmYm9mZnNdKSB7CisgICAgICAgICAgbXNNYXNrVHJ1ZVNvbWV3aGVyZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgLyogcHJvaGliaXQgTVNfTUFTS19BTEwgaW4gY29tYmluYXRpb24gd2l0aCBJUyAqLworICAgICAgICBudW1Nc01hc2tGYWxzZSA9IDk7CisgICAgICB9IC8qIGlzQm9vayAqLworICAgIH0gICAvKiBzZmJvZmZzICovCisgIH0gICAgIC8qIHNmYiAqLworCisgIGlmIChtc01hc2tUcnVlU29tZXdoZXJlID09IDEpIHsKKyAgICBpZiAoKG51bU1zTWFza0ZhbHNlID09IDApIHx8CisgICAgICAgICgobnVtTXNNYXNrRmFsc2UgPCBtYXhTZmJQZXJHcm91cCkgJiYgKG51bU1zTWFza0ZhbHNlIDwgOSkpKSB7CisgICAgICAqbXNEaWdlc3QgPSBTSV9NU19NQVNLX0FMTDsKKyAgICAgIC8qIGxvb3AgdGhyb3VnaCBNL1MgYmFuZHM7IGlmIG1zTWFzaz09MCwgc2V0IGl0IHRvIDEgYW5kIGFwcGx5IE0vUyAqLworICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYiArPSBzZmJQZXJHcm91cCkgeworICAgICAgICBmb3IgKHNmYm9mZnMgPSAwOyBzZmJvZmZzIDwgbWF4U2ZiUGVyR3JvdXA7IHNmYm9mZnMrKykgeworICAgICAgICAgIGlmICgoKGlzQm9vayA9PSBOVUxMKSA/IDEgOiAoaXNCb29rW3NmYiArIHNmYm9mZnNdID09IDApKSAmJgorICAgICAgICAgICAgICAobXNNYXNrW3NmYiArIHNmYm9mZnNdID09IDApKSB7CisgICAgICAgICAgICBtc01hc2tbc2ZiICsgc2Zib2Zmc10gPSAxOworICAgICAgICAgICAgLyogYXBwbHkgTS9TIGNvZGluZyAqLworICAgICAgICAgICAgZm9yIChqID0gc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnNdOyBqIDwgc2ZiT2Zmc2V0W3NmYiArIHNmYm9mZnMgKyAxXTsKKyAgICAgICAgICAgICAgICAgaisrKSB7CiAgICAgICAgICAgICAgIEZJWFBfREJMIHNwZWNMLCBzcGVjUjsKLSAgICAgICAgICAgICAgc3BlY0wgPSBtZGN0U3BlY3RydW1MZWZ0W2pdPj4xOwotICAgICAgICAgICAgICBzcGVjUiA9IG1kY3RTcGVjdHJ1bVJpZ2h0W2pdPj4xOworICAgICAgICAgICAgICBzcGVjTCA9IG1kY3RTcGVjdHJ1bUxlZnRbal0gPj4gMTsKKyAgICAgICAgICAgICAgc3BlY1IgPSBtZGN0U3BlY3RydW1SaWdodFtqXSA+PiAxOwogICAgICAgICAgICAgICBtZGN0U3BlY3RydW1MZWZ0W2pdID0gc3BlY0wgKyBzcGVjUjsKICAgICAgICAgICAgICAgbWRjdFNwZWN0cnVtUmlnaHRbal0gPSBzcGVjTCAtIHNwZWNSOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWluVGhyZXNob2xkID0gZml4TWluKHNmYlRocmVzaG9sZExlZnRbc2ZiK3NmYm9mZnNdLCBzZmJUaHJlc2hvbGRSaWdodFtzZmIrc2Zib2Zmc10pOwotICAgICAgICAgICAgc2ZiVGhyZXNob2xkTGVmdFtzZmIrc2Zib2Zmc10gPSBzZmJUaHJlc2hvbGRSaWdodFtzZmIrc2Zib2Zmc10gPSBtaW5UaHJlc2hvbGQ7Ci0gICAgICAgICAgICBzZmJUaHJlc2hvbGRMZWZ0TGREYXRhW3NmYitzZmJvZmZzXSA9IHNmYlRocmVzaG9sZFJpZ2h0TGREYXRhW3NmYitzZmJvZmZzXSA9IG1pblRocmVzaG9sZExkRGF0YTsKLSAgICAgICAgICAgIHNmYkVuZXJneUxlZnRbc2ZiK3NmYm9mZnNdID0gc2ZiRW5lcmd5TWlkW3NmYitzZmJvZmZzXTsKLSAgICAgICAgICAgIHNmYkVuZXJneVJpZ2h0W3NmYitzZmJvZmZzXSA9IHNmYkVuZXJneVNpZGVbc2ZiK3NmYm9mZnNdOwotICAgICAgICAgICAgc2ZiRW5lcmd5TGVmdExkRGF0YVtzZmIrc2Zib2Zmc10gPSBzZmJFbmVyZ3lNaWRMZERhdGFbc2ZiK3NmYm9mZnNdOwotICAgICAgICAgICAgc2ZiRW5lcmd5UmlnaHRMZERhdGFbc2ZiK3NmYm9mZnNdID0gc2ZiRW5lcmd5U2lkZUxkRGF0YVtzZmIrc2Zib2Zmc107CisgICAgICAgICAgICBtaW5UaHJlc2hvbGQgPSBmaXhNaW4oc2ZiVGhyZXNob2xkTGVmdFtzZmIgKyBzZmJvZmZzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJUaHJlc2hvbGRSaWdodFtzZmIgKyBzZmJvZmZzXSk7CisgICAgICAgICAgICBzZmJUaHJlc2hvbGRMZWZ0W3NmYiArIHNmYm9mZnNdID0gc2ZiVGhyZXNob2xkUmlnaHRbc2ZiICsgc2Zib2Zmc10gPQorICAgICAgICAgICAgICAgIG1pblRocmVzaG9sZDsKKyAgICAgICAgICAgIG1pblRocmVzaG9sZExkRGF0YSA9IGZpeE1pbihzZmJUaHJlc2hvbGRMZWZ0TGREYXRhW3NmYiArIHNmYm9mZnNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYlRocmVzaG9sZFJpZ2h0TGREYXRhW3NmYiArIHNmYm9mZnNdKTsKKyAgICAgICAgICAgIHNmYlRocmVzaG9sZExlZnRMZERhdGFbc2ZiICsgc2Zib2Zmc10gPQorICAgICAgICAgICAgICAgIHNmYlRocmVzaG9sZFJpZ2h0TGREYXRhW3NmYiArIHNmYm9mZnNdID0gbWluVGhyZXNob2xkTGREYXRhOworICAgICAgICAgICAgc2ZiRW5lcmd5TGVmdFtzZmIgKyBzZmJvZmZzXSA9IHNmYkVuZXJneU1pZFtzZmIgKyBzZmJvZmZzXTsKKyAgICAgICAgICAgIHNmYkVuZXJneVJpZ2h0W3NmYiArIHNmYm9mZnNdID0gc2ZiRW5lcmd5U2lkZVtzZmIgKyBzZmJvZmZzXTsKKyAgICAgICAgICAgIHNmYkVuZXJneUxlZnRMZERhdGFbc2ZiICsgc2Zib2Zmc10gPQorICAgICAgICAgICAgICAgIHNmYkVuZXJneU1pZExkRGF0YVtzZmIgKyBzZmJvZmZzXTsKKyAgICAgICAgICAgIHNmYkVuZXJneVJpZ2h0TGREYXRhW3NmYiArIHNmYm9mZnNdID0KKyAgICAgICAgICAgICAgICBzZmJFbmVyZ3lTaWRlTGREYXRhW3NmYiArIHNmYm9mZnNdOwogCi0gICAgICAgICAgICBzZmJTcHJlYWRFbkxlZnRbc2ZiK3NmYm9mZnNdID0gc2ZiU3ByZWFkRW5SaWdodFtzZmIrc2Zib2Zmc10gPQotICAgICAgICAgICAgICAgICAgICAgZml4TWluKCBzZmJTcHJlYWRFbkxlZnRbc2ZiK3NmYm9mZnNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJTcHJlYWRFblJpZ2h0W3NmYitzZmJvZmZzXSApID4+IDE7Ci0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBtc01hc2tbc2ZiK3NmYm9mZnNdID0gMDsKLSAgICAgICAgICAgIG51bU1zTWFza0ZhbHNlKys7Ci0gICAgICAgICAgfSAvKiB1c2VNUyAqLwotICAgICAgICB9IC8qIGlzQm9vayAqLwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAvKiBrZWVwIG1EaWdlc3QgZnJvbSBJUyBtb2R1bGUgKi8KLSAgICAgICAgICBpZiAobXNNYXNrW3NmYitzZmJvZmZzXSkgewotICAgICAgICAgICAgbXNNYXNrVHJ1ZVNvbWV3aGVyZSA9IDE7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8qIHByb2hpYml0IE1TX01BU0tfQUxMIGluIGNvbWJpbmF0aW9uIHdpdGggSVMgKi8KLSAgICAgICAgICBudW1Nc01hc2tGYWxzZSA9IDk7Ci0gICAgICAgIH0gLyogaXNCb29rICovCi0gICAgICB9IC8qIHNmYm9mZnMgKi8KLSAgICB9IC8qIHNmYiAqLwotCi0KLSAgICBpZihtc01hc2tUcnVlU29tZXdoZXJlID09IDEpIHsKLSAgICAgIGlmICgobnVtTXNNYXNrRmFsc2UgPT0gMCkgfHwgKChudW1Nc01hc2tGYWxzZSA8IG1heFNmYlBlckdyb3VwKSAmJiAobnVtTXNNYXNrRmFsc2UgPCA5KSkpIHsKLSAgICAgICAgKm1zRGlnZXN0ID0gU0lfTVNfTUFTS19BTEw7Ci0gICAgICAgIC8qIGxvb3AgdGhyb3VnaCBNL1MgYmFuZHM7IGlmIG1zTWFzaz09MCwgc2V0IGl0IHRvIDEgYW5kIGFwcGx5IE0vUyAqLwotICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiICs9IHNmYlBlckdyb3VwKSB7Ci0gICAgICAgICAgZm9yIChzZmJvZmZzID0gMDsgc2Zib2ZmcyA8IG1heFNmYlBlckdyb3VwOyBzZmJvZmZzKyspIHsKLSAgICAgICAgICAgIGlmICgoIChpc0Jvb2sgPT0gTlVMTCkgPyAxIDogKGlzQm9va1tzZmIrc2Zib2Zmc10gPT0gMCkgKSAmJiAobXNNYXNrW3NmYitzZmJvZmZzXSA9PSAwKSkgewotICAgICAgICAgICAgICBtc01hc2tbc2ZiK3NmYm9mZnNdID0gMTsKLSAgICAgICAgICAgICAgLyogYXBwbHkgTS9TIGNvZGluZyAqLwotICAgICAgICAgICAgICBmb3Ioaj1zZmJPZmZzZXRbc2ZiK3NmYm9mZnNdOyBqPHNmYk9mZnNldFtzZmIrc2Zib2ZmcysxXTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgRklYUF9EQkwgc3BlY0wsIHNwZWNSOwotICAgICAgICAgICAgICAgIHNwZWNMID0gbWRjdFNwZWN0cnVtTGVmdFtqXT4+MTsKLSAgICAgICAgICAgICAgICBzcGVjUiA9IG1kY3RTcGVjdHJ1bVJpZ2h0W2pdPj4xOwotICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bUxlZnRbal0gPSBzcGVjTCArIHNwZWNSOwotICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID0gc3BlY0wgLSBzcGVjUjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBtaW5UaHJlc2hvbGQgPSBmaXhNaW4oc2ZiVGhyZXNob2xkTGVmdFtzZmIrc2Zib2Zmc10sIHNmYlRocmVzaG9sZFJpZ2h0W3NmYitzZmJvZmZzXSk7Ci0gICAgICAgICAgICAgIHNmYlRocmVzaG9sZExlZnRbc2ZiK3NmYm9mZnNdID0gc2ZiVGhyZXNob2xkUmlnaHRbc2ZiK3NmYm9mZnNdID0gbWluVGhyZXNob2xkOwotICAgICAgICAgICAgICBtaW5UaHJlc2hvbGRMZERhdGEgPSBmaXhNaW4oc2ZiVGhyZXNob2xkTGVmdExkRGF0YVtzZmIrc2Zib2Zmc10sIHNmYlRocmVzaG9sZFJpZ2h0TGREYXRhW3NmYitzZmJvZmZzXSk7Ci0gICAgICAgICAgICAgIHNmYlRocmVzaG9sZExlZnRMZERhdGFbc2ZiK3NmYm9mZnNdID0gc2ZiVGhyZXNob2xkUmlnaHRMZERhdGFbc2ZiK3NmYm9mZnNdID0gbWluVGhyZXNob2xkTGREYXRhOwotICAgICAgICAgICAgICBzZmJFbmVyZ3lMZWZ0W3NmYitzZmJvZmZzXSA9IHNmYkVuZXJneU1pZFtzZmIrc2Zib2Zmc107Ci0gICAgICAgICAgICAgIHNmYkVuZXJneVJpZ2h0W3NmYitzZmJvZmZzXSA9IHNmYkVuZXJneVNpZGVbc2ZiK3NmYm9mZnNdOwotICAgICAgICAgICAgICBzZmJFbmVyZ3lMZWZ0TGREYXRhW3NmYitzZmJvZmZzXSA9IHNmYkVuZXJneU1pZExkRGF0YVtzZmIrc2Zib2Zmc107Ci0gICAgICAgICAgICAgIHNmYkVuZXJneVJpZ2h0TGREYXRhW3NmYitzZmJvZmZzXSA9IHNmYkVuZXJneVNpZGVMZERhdGFbc2ZiK3NmYm9mZnNdOwotCi0gICAgICAgICAgICAgIHNmYlNwcmVhZEVuTGVmdFtzZmIrc2Zib2Zmc10gPSBzZmJTcHJlYWRFblJpZ2h0W3NmYitzZmJvZmZzXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIGZpeE1pbiggc2ZiU3ByZWFkRW5MZWZ0W3NmYitzZmJvZmZzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJTcHJlYWRFblJpZ2h0W3NmYitzZmJvZmZzXSApID4+IDE7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBzZmJTcHJlYWRFbkxlZnRbc2ZiICsgc2Zib2Zmc10gPSBzZmJTcHJlYWRFblJpZ2h0W3NmYiArIHNmYm9mZnNdID0KKyAgICAgICAgICAgICAgICBmaXhNaW4oc2ZiU3ByZWFkRW5MZWZ0W3NmYiArIHNmYm9mZnNdLAorICAgICAgICAgICAgICAgICAgICAgICBzZmJTcHJlYWRFblJpZ2h0W3NmYiArIHNmYm9mZnNdKSA+PgorICAgICAgICAgICAgICAgIDE7CiAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAqbXNEaWdlc3QgPSBTSV9NU19NQVNLX1NPTUU7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICptc0RpZ2VzdCA9IFNJX01TX01BU0tfTk9ORTsKKyAgICAgICptc0RpZ2VzdCA9IFNJX01TX01BU0tfU09NRTsKICAgICB9CisgIH0gZWxzZSB7CisgICAgKm1zRGlnZXN0ID0gU0lfTVNfTUFTS19OT05FOworICB9CiB9CmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL21zX3N0ZXJlby5oIGIvbGliQUFDZW5jL3NyYy9tc19zdGVyZW8uaAppbmRleCAyZjNhZGRiLi5hMjAyMzA3IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL21zX3N0ZXJlby5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvbXNfc3RlcmVvLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjkgKzkwLDI4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogTVMgc3RlcmVvIHByb2Nlc3NpbmcKKyAgIEF1dGhvcihzKTogICBNLldlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogTVMgc3RlcmVvIHByb2Nlc3NpbmcKIAotI2lmbmRlZiBfX01TX1NURVJFT19IX18KLSNkZWZpbmUgX19NU19TVEVSRU9fSF9fCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZuZGVmIE1TX1NURVJFT19ICisjZGVmaW5lIE1TX1NURVJFT19ICiAKICNpbmNsdWRlICJpbnRlcmZhY2UuaCIKIAotdm9pZCBGREthYWNFbmNfTXNTdGVyZW9Qcm9jZXNzaW5nKFBTWV9EQVRBICAgKlJFU1RSSUNUIHBzeURhdGFbKDIpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbFsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgKmlzQm9vaywKLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgKm1zRGlnZXN0LCAgICAgICAvKiBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgKm1zTWFzaywgICAgICAgICAvKiBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIHNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICpzZmJPZmZzZXQpOwordm9pZCBGREthYWNFbmNfTXNTdGVyZW9Qcm9jZXNzaW5nKFBTWV9EQVRBICpSRVNUUklDVCBwc3lEYXRhWygyKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFubmVsWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqaXNCb29rLCBJTlQgKm1zRGlnZXN0LCAvKiBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm1zTWFzaywgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGFsbG93TVMsIGNvbnN0IElOVCBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBtYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKnNmYk9mZnNldCk7CiAKLSNlbmRpZgorI2VuZGlmIC8qIE1TX1NURVJFT19IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL25vaXNlZGV0LmNwcCBiL2xpYkFBQ2VuYy9zcmMvbm9pc2VkZXQuY3BwCmluZGV4IGYzYzUxZGUuLmM5ODQzMDQgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvbm9pc2VkZXQuY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvbm9pc2VkZXQuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIyICs5MCwyMiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBMb2h3YXNzZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBub2lzZWRldC5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgUm91dGluZXMgZm9yIE5vaXNlIERldGVjdGlvbgorICAgQXV0aG9yKHMpOiAgIE0uIExvaHdhc3NlcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogbm9pc2VkZXQuYworICAgICAgICAgICAgICAgIFJvdXRpbmVzIGZvciBOb2lzZSBEZXRlY3Rpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgIm5vaXNlZGV0LmgiCiAKICNpbmNsdWRlICJhYWNlbmNfcG5zLmgiCiAjaW5jbHVkZSAicG5zcGFyYW0uaCIKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX2Z1enp5SXNTbWFsbGVyCkBAIC0xMDUsMjAgKzExNiwxNiBAQAogICAgIG91dHB1dDogICAgICAgcmV0dXJuIGZ1enp5IHZhbHVlCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIEZJWFBfU0dMIEZES2FhY0VuY19mdXp6eUlzU21hbGxlciggRklYUF9EQkwgdGVzdFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgcmVmVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBsb0xpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgaGlMaW0gKQoteworc3RhdGljIEZJWFBfU0dMIEZES2FhY0VuY19mdXp6eUlzU21hbGxlcihGSVhQX0RCTCB0ZXN0VmFsLCBGSVhQX0RCTCByZWZWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGxvTGltLCBGSVhQX0RCTCBoaUxpbSkgewogICBpZiAocmVmVmFsIDw9IEZMMkZYQ09OU1RfREJMKDAuMCkpCi0gICAgICAgIHJldHVybiggRkwyRlhDT05TVF9TR0woMC4wZikgKTsKLSAgZWxzZSBpZiAodGVzdFZhbCA+PSBmTXVsdCgoaGlMaW0+PjEpKyhsb0xpbT4+MSksIHJlZlZhbCkpCi0gICAgICAgIHJldHVybiggRkwyRlhDT05TVF9TR0woMC4wZikgKTsKLSAgZWxzZSAgcmV0dXJuKCAoRklYUF9TR0wpTUFYVkFMX1NHTCApOworICAgIHJldHVybiAoRkwyRlhDT05TVF9TR0woMC4wZikpOworICBlbHNlIGlmICh0ZXN0VmFsID49IGZNdWx0KChoaUxpbSA+PiAxKSArIChsb0xpbSA+PiAxKSwgcmVmVmFsKSkKKyAgICByZXR1cm4gKEZMMkZYQ09OU1RfU0dMKDAuMGYpKTsKKyAgZWxzZQorICAgIHJldHVybiAoKEZJWFBfU0dMKU1BWFZBTF9TR0wpOwogfQogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19ub2lzZURldGVjdApAQCAtMTQwLDQ1ICsxNDcsNDUgQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgRkRLYWFjRW5jX25vaXNlRGV0ZWN0KEZJWFBfREJMICAgICpSRVNUUklDVCBtZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgIElOVCAgICAgICAgICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWMsCi0gICAgICAgICAgICAgICAgIElOVCAgICAgICAgICBzZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICpSRVNUUklDVCBzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgIEZJWFBfU0dMICAgICpSRVNUUklDVCBub2lzZUZ1enp5TWVhc3VyZSwKLSAgICAgICAgICAgICAgICAgTk9JU0VQQVJBTVMgKm5wLAotICAgICAgICAgICAgICAgICBGSVhQX1NHTCAgICAqUkVTVFJJQ1Qgc2ZidG9uYWxpdHkgKQordm9pZCBGREthYWNFbmNfbm9pc2VEZXRlY3QoRklYUF9EQkwgKlJFU1RSSUNUIG1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqUkVTVFJJQ1Qgc2ZiTWF4U2NhbGVTcGVjLCBJTlQgc2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpSRVNUUklDVCBzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAqUkVTVFJJQ1Qgbm9pc2VGdXp6eU1lYXN1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOT0lTRVBBUkFNUyAqbnAsIEZJWFBfU0dMICpSRVNUUklDVCBzZmJ0b25hbGl0eSkKIAogewotICBpbnQgICAgaSwgaywgc2ZiLCBzZmJXaWR0aDsKKyAgaW50IGksIGssIHNmYiwgc2ZiV2lkdGg7CiAgIEZJWFBfU0dMIGZ1enp5LCBmdXp6eVRvdGFsOwogICBGSVhQX0RCTCByZWZWYWwsIHRlc3RWYWw7CiAKICAgLyoqKioqIFN0YXJ0IGRldGVjdGlvbiBwaGFzZSAqKioqKi8KICAgLyogU3RhcnQgbm9pc2UgZGV0ZWN0aW9uIGZvciBlYWNoIGJhbmQgYmFzZWQgb24gYSBudW1iZXIgb2YgY2hlY2tzICovCi0gIGZvciAoc2ZiPTA7IHNmYjxzZmJBY3RpdmU7IHNmYisrKSB7Ci0KKyAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJBY3RpdmU7IHNmYisrKSB7CiAgICAgZnV6enlUb3RhbCA9IChGSVhQX1NHTClNQVhWQUxfU0dMOwotICAgIHNmYldpZHRoID0gc2ZiT2Zmc2V0W3NmYisxXSAtIHNmYk9mZnNldFtzZmJdOworICAgIHNmYldpZHRoID0gc2ZiT2Zmc2V0W3NmYiArIDFdIC0gc2ZiT2Zmc2V0W3NmYl07CiAKICAgICAvKiBSZXNldCBvdXRwdXQgZm9yIGxvd2VyIGJhbmRzIG9yIHRvbyBzbWFsbCBiYW5kcyAqLwotICAgIGlmIChzZmIgPCBucC0+c3RhcnRTZmIgIHx8ICBzZmJXaWR0aCA8IG5wLT5taW5TZmJXaWR0aCkgeworICAgIGlmIChzZmIgPCBucC0+c3RhcnRTZmIgfHwgc2ZiV2lkdGggPCBucC0+bWluU2ZiV2lkdGgpIHsKICAgICAgIG5vaXNlRnV6enlNZWFzdXJlW3NmYl0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KIAotICAgIGlmICggKG5wLT5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyAmIFVTRV9QT1dFUl9ESVNUUklCVVRJT04pICYmIChmdXp6eVRvdGFsID4gRkwyRlhDT05TVF9TR0woMC41ZikpICkgeworICAgIGlmICgobnAtPmRldGVjdGlvbkFsZ29yaXRobUZsYWdzICYgVVNFX1BPV0VSX0RJU1RSSUJVVElPTikgJiYKKyAgICAgICAgKGZ1enp5VG90YWwgPiBGTDJGWENPTlNUX1NHTCgwLjVmKSkpIHsKICAgICAgIEZJWFBfREJMIGZoZWxwMSwgZmhlbHAyLCBmaGVscDMsIGZoZWxwNCwgbWF4VmFsLCBtaW5WYWw7Ci0gICAgICBJTlQgbGVhZGluZ0JpdHMgPSBmaXhNYXgoMCwoc2ZiTWF4U2NhbGVTcGVjW3NmYl0gLSAzKSk7ICAgICAgICAgLyogbWF4IHNmYldpZHRoID0gOTYvNCA7IDJeNT0zMiA9PiA1LzIgPSAzIChzcGMqc3BjKSAqLworICAgICAgSU5UIGxlYWRpbmdCaXRzID0gZml4TWF4KAorICAgICAgICAgIDAsIChzZmJNYXhTY2FsZVNwZWNbc2ZiXSAtCisgICAgICAgICAgICAgIDMpKTsgLyogbWF4IHNmYldpZHRoID0gOTYvNCA7IDJeNT0zMiA9PiA1LzIgPSAzIChzcGMqc3BjKSAqLwogCiAgICAgICAvKiAgY2hlY2sgcG93ZXIgZGlzdHJpYnV0aW9uIGluIGZvdXIgcmVnaW9ucyAqLwogICAgICAgZmhlbHAxID0gZmhlbHAyID0gZmhlbHAzID0gZmhlbHA0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICBrID0gc2ZiV2lkdGggPj4yOyAgLyogV2lkdGggb2YgYSBxdWFydGVyIGJhbmQgKi8KKyAgICAgIGsgPSBzZmJXaWR0aCA+PiAyOyAvKiBXaWR0aCBvZiBhIHF1YXJ0ZXIgYmFuZCAqLwogCi0gICAgICBmb3IgKGk9c2ZiT2Zmc2V0W3NmYl07IGk8c2ZiT2Zmc2V0W3NmYl0razsgaSsrKSB7Ci0gICAgICAgIGZoZWxwMSA9IGZQb3cyQWRkRGl2MihmaGVscDEsIG1kY3RTcGVjdHJ1bVtpXTw8bGVhZGluZ0JpdHMpOwotICAgICAgICBmaGVscDIgPSBmUG93MkFkZERpdjIoZmhlbHAyLCBtZGN0U3BlY3RydW1baStrXTw8bGVhZGluZ0JpdHMpOwotICAgICAgICBmaGVscDMgPSBmUG93MkFkZERpdjIoZmhlbHAzLCBtZGN0U3BlY3RydW1baSsyKmtdPDxsZWFkaW5nQml0cyk7Ci0gICAgICAgIGZoZWxwNCA9IGZQb3cyQWRkRGl2MihmaGVscDQsIG1kY3RTcGVjdHJ1bVtpKzMqa108PGxlYWRpbmdCaXRzKTsKKyAgICAgIGZvciAoaSA9IHNmYk9mZnNldFtzZmJdOyBpIDwgc2ZiT2Zmc2V0W3NmYl0gKyBrOyBpKyspIHsKKyAgICAgICAgZmhlbHAxID0gZlBvdzJBZGREaXYyKGZoZWxwMSwgbWRjdFNwZWN0cnVtW2ldIDw8IGxlYWRpbmdCaXRzKTsKKyAgICAgICAgZmhlbHAyID0gZlBvdzJBZGREaXYyKGZoZWxwMiwgbWRjdFNwZWN0cnVtW2kgKyBrXSA8PCBsZWFkaW5nQml0cyk7CisgICAgICAgIGZoZWxwMyA9IGZQb3cyQWRkRGl2MihmaGVscDMsIG1kY3RTcGVjdHJ1bVtpICsgMiAqIGtdIDw8IGxlYWRpbmdCaXRzKTsKKyAgICAgICAgZmhlbHA0ID0gZlBvdzJBZGREaXYyKGZoZWxwNCwgbWRjdFNwZWN0cnVtW2kgKyAzICoga10gPDwgbGVhZGluZ0JpdHMpOwogICAgICAgfQogCiAgICAgICAvKiBnZXQgbWF4IGludG8gZmhlbHA6ICovCkBAIC0xOTQsMzQgKzIwMSwzNCBAQAogICAgICAgLyogTm9ybWFsaXplIG1pbiBhbmQgbWF4IFZhbCAqLwogICAgICAgbGVhZGluZ0JpdHMgPSBDb3VudExlYWRpbmdCaXRzKG1heFZhbCk7CiAgICAgICB0ZXN0VmFsID0gbWF4VmFsIDw8IGxlYWRpbmdCaXRzOwotICAgICAgcmVmVmFsICA9IG1pblZhbCA8PCBsZWFkaW5nQml0czsKKyAgICAgIHJlZlZhbCA9IG1pblZhbCA8PCBsZWFkaW5nQml0czsKIAogICAgICAgLyogY2FsY3VsYXRlIGZ1enp5IHZhbHVlIGZvciBwb3dlciBkaXN0cmlidXRpb24gKi8KICAgICAgIHRlc3RWYWwgPSBmTXVsdERpdjIodGVzdFZhbCwgbnAtPnBvd0Rpc3RQU0RjdXJ2ZVtzZmJdKTsKIAotICAgICAgZnV6enkgPSBGREthYWNFbmNfZnV6enlJc1NtYWxsZXIodGVzdFZhbCwgICAgICAgICAgIC8qIDEvMiAqIG1heFZhbHVlICogUFNEY3VydmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVmFsLCAgICAgICAgICAgIC8qIDEgICAqIG1pblZhbHVlICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC40OTUpLCAgLyogMS8yICogbG9MaW0gICgwLjk5Zi8yKSAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjUwNSkpOyAvKiAxLzIgKiBoaUxpbSAgKDEuMDFmLzIpICAgICovCisgICAgICBmdXp6eSA9IEZES2FhY0VuY19mdXp6eUlzU21hbGxlcigKKyAgICAgICAgICB0ZXN0VmFsLCAgICAgICAgICAgICAgICAvKiAxLzIgKiBtYXhWYWx1ZSAqIFBTRGN1cnZlICovCisgICAgICAgICAgcmVmVmFsLCAgICAgICAgICAgICAgICAgLyogMSAgICogbWluVmFsdWUgICAgICAgICAgICAqLworICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuNDk1KSwgIC8qIDEvMiAqIGxvTGltICAoMC45OWYvMikgICAgKi8KKyAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjUwNSkpOyAvKiAxLzIgKiBoaUxpbSAgKDEuMDFmLzIpICAgICovCiAKICAgICAgIGZ1enp5VG90YWwgPSBmaXhNaW4oZnV6enlUb3RhbCwgZnV6enkpOwogICAgIH0KIAotICAgIGlmICggKG5wLT5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyAmIFVTRV9QU1lDSF9UT05BTElUWSkgJiYgKGZ1enp5VG90YWwgPiBGTDJGWENPTlNUX1NHTCgwLjVmKSkgKSB7CisgICAgaWYgKChucC0+ZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3MgJiBVU0VfUFNZQ0hfVE9OQUxJVFkpICYmCisgICAgICAgIChmdXp6eVRvdGFsID4gRkwyRlhDT05TVF9TR0woMC41ZikpKSB7CiAgICAgICAvKiBEZXRlY3Rpb24gd2l0aCB0b25hbGl0eS12YWx1ZSBvZiBwc3ljaC4gYWNvdXN0aWMgKGhlcmU6IDEgaXMgdG9uYWwhKSovCiAKLSAgICAgIHRlc3RWYWwgPSBGWF9TR0wyRlhfREJMKHNmYnRvbmFsaXR5W3NmYl0pPj4xOyAgICAgICAgICAvKiAxLzIgKiBzZmJUb25hbGl0eSAgICAgICAgICovCi0gICAgICByZWZWYWwgID0gbnAtPnJlZlRvbmFsaXR5OworICAgICAgdGVzdFZhbCA9IEZYX1NHTDJGWF9EQkwoc2ZidG9uYWxpdHlbc2ZiXSkgPj4gMTsgLyogMS8yICogc2ZiVG9uYWxpdHkgKi8KKyAgICAgIHJlZlZhbCA9IG5wLT5yZWZUb25hbGl0eTsKIAotICAgICAgZnV6enkgICA9IEZES2FhY0VuY19mdXp6eUlzU21hbGxlcih0ZXN0VmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjQ1ZiksICAgIC8qIDEvMiAqIGxvTGltICAoMC45Zi8yKSAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjU1ZikpOyAgIC8qIDEvMiAqIGhpTGltICAoMS4xZi8yKSAgICAgKi8KKyAgICAgIGZ1enp5ID0gRkRLYWFjRW5jX2Z1enp5SXNTbWFsbGVyKAorICAgICAgICAgIHRlc3RWYWwsIHJlZlZhbCwgRkwyRlhDT05TVF9EQkwoMC40NWYpLCAvKiAxLzIgKiBsb0xpbSAgKDAuOWYvMikgKi8KKyAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjU1ZikpOyAvKiAxLzIgKiBoaUxpbSAgKDEuMWYvMikgICAgICovCiAKICAgICAgIGZ1enp5VG90YWwgPSBmaXhNaW4oZnV6enlUb3RhbCwgZnV6enkpOwogICAgIH0KIAotCiAgICAgLyogT3V0cHV0IG9mIGZpbmFsIHJlc3VsdCAqLwogICAgIG5vaXNlRnV6enlNZWFzdXJlW3NmYl0gPSBmdXp6eVRvdGFsOwogICB9CmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL25vaXNlZGV0LmggYi9saWJBQUNlbmMvc3JjL25vaXNlZGV0LmgKaW5kZXggOGQ1ZTM2NS4uNDc4NzAxZiAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9ub2lzZWRldC5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvbm9pc2VkZXQuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzMCArOTAsMjcgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gTG9od2Fzc2VyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogbm9pc2VkZXQuaAorICAgQXV0aG9yKHMpOiAgIE0uIExvaHdhc3NlcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogbm9pc2VkZXQuaAogCi0jaWZuZGVmIF9fTk9JU0VERVRfSAotI2RlZmluZSBfX05PSVNFREVUX0gKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTk9JU0VERVRfSAorI2RlZmluZSBOT0lTRURFVF9ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKICNpbmNsdWRlICJwbnNwYXJhbS5oIgogI2luY2x1ZGUgInBzeV9kYXRhLmgiCiAKK3ZvaWQgRkRLYWFjRW5jX25vaXNlRGV0ZWN0KEZJWFBfREJMICptZGN0U3BlY3RydW0sIElOVCAqc2ZiTWF4U2NhbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNmYkFjdGl2ZSwgY29uc3QgSU5UICpzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCBub2lzZUZ1enp5TWVhc3VyZVtdLCBOT0lTRVBBUkFNUyAqbnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAqc2ZidG9uYWxpdHkpOwogCi12b2lkIEZES2FhY0VuY19ub2lzZURldGVjdCggRklYUF9EQkwgICAgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICpzZmJNYXhTY2FsZVNwZWMsCi0gICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgc2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICAgICBub2lzZUZ1enp5TWVhc3VyZVtdLAotICAgICAgICAgICAgICAgICAgTk9JU0VQQVJBTVMgKm5wLAotICAgICAgICAgICAgICAgICAgRklYUF9TR0wgICAgKnNmYnRvbmFsaXR5ICk7Ci0KLSNlbmRpZgorI2VuZGlmIC8qIE5PSVNFREVUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvcG5zX2Z1bmMuaCBiL2xpYkFBQ2VuYy9zcmMvcG5zX2Z1bmMuaAppbmRleCBlZmE0NGVmLi44OGY0NTg2IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL3Buc19mdW5jLmgKKysrIGIvbGliQUFDZW5jL3NyYy9wbnNfZnVuYy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDcyICs5MCw0OSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBMb2h3YXNzZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBwbnNfZnVuYy5oCisgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBwbnNfZnVuYy5oCiAKLSNpZm5kZWYgX1BOU19GVU5DX0gKLSNkZWZpbmUgX1BOU19GVU5DX0gKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgUE5TX0ZVTkNfSAorI2RlZmluZSBQTlNfRlVOQ19ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCi0KICNpbmNsdWRlICJhYWNlbmNfcG5zLmgiCiAjaW5jbHVkZSAicHN5X2RhdGEuaCIKIAorQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRQbnNDb25maWd1cmF0aW9uKAorICAgIFBOU19DT05GSUcgKnBuc0NvbmYsIElOVCBiaXRSYXRlLCBJTlQgc2FtcGxlUmF0ZSwgSU5UIHVzZVBucywgSU5UIHNmYkNudCwKKyAgICBjb25zdCBJTlQgKnNmYk9mZnNldCwgY29uc3QgSU5UIG51bUNoYW4sIGNvbnN0IElOVCBpc0xDKTsKIAordm9pZCBGREthYWNFbmNfUG5zRGV0ZWN0KFBOU19DT05GSUcgKnBuc0NvbmYsIFBOU19EQVRBICpwbnNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBsYXN0V2luZG93U2VxdWVuY2UsIGNvbnN0IElOVCBzZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG1heFNmYlBlckdyb3VwLCBGSVhQX0RCTCAqc2ZiVGhyZXNob2xkTGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqc2ZiT2Zmc2V0LCBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2ZiTWF4U2NhbGVTcGVjLCBGSVhQX1NHTCAqc2ZidG9uYWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRuc09yZGVyLCBJTlQgdG5zUHJlZGljdGlvbkdhaW4sIElOVCB0bnNBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNmYkVuZXJneUxkRGF0YSwgSU5UICpub2lzZU5yZyk7CiAKLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0UG5zQ29uZmlndXJhdGlvbihQTlNfQ09ORklHICpwbnNDb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICB1c2VQbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgbnVtQ2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgIGlzTEMgKTsKK3ZvaWQgRkRLYWFjRW5jX0NvZGVQbnNDaGFubmVsKGNvbnN0IElOVCBzZmJBY3RpdmUsIFBOU19DT05GSUcgKnBuc0NvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnBuc0ZsYWcsIEZJWFBfREJMICpzZmJFbmVyZ3ksIElOVCAqbm9pc2VOcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiVGhyZXNob2xkKTsKIAotdm9pZCBGREthYWNFbmNfUG5zRGV0ZWN0KCBQTlNfQ09ORklHICAqcG5zQ29uZiwKLSAgICAgICAgICAgICAgICBQTlNfREFUQSAgICAqcG5zRGF0YSwKLSAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBsYXN0V2luZG93U2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgY29uc3QgSU5UICAgc2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpzZmJUaHJlc2hvbGRMZERhdGEsCi0gICAgICAgICAgICAgICAgY29uc3QgSU5UICAgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgIElOVCAgICAgICAgICpzZmJNYXhTY2FsZVNwZWMsCi0gICAgICAgICAgICAgICAgRklYUF9TR0wgICAgKnNmYnRvbmFsaXR5LAotICAgICAgICAgICAgICAgIGludCAgICAgICAgIHRuc09yZGVyLAotICAgICAgICAgICAgICAgIElOVCAgICAgICAgIHRuc1ByZWRpY3Rpb25HYWluLAotICAgICAgICAgICAgICAgIElOVCAgICAgICAgIHRuc0FjdGl2ZSwKLSAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqc2ZiRW5lcmd5TGREYXRhLAotICAgICAgICAgICAgICAgIElOVCAgICAgICAgICpub2lzZU5yZyApOwordm9pZCBGREthYWNFbmNfUHJlUHJvY2Vzc1Buc0NoYW5uZWxQYWlyKAorICAgIGNvbnN0IElOVCBzZmJBY3RpdmUsIEZJWFBfREJMICpzZmJFbmVyZ3lMZWZ0LCBGSVhQX0RCTCAqc2ZiRW5lcmd5UmlnaHQsCisgICAgRklYUF9EQkwgKnNmYkVuZXJneUxlZnRMRCwgRklYUF9EQkwgKnNmYkVuZXJneVJpZ2h0TEQsCisgICAgRklYUF9EQkwgKnNmYkVuZXJneU1pZCwgUE5TX0NPTkZJRyAqcG5zQ29uZkxlZnQsIFBOU19EQVRBICpwbnNEYXRhTGVmdCwKKyAgICBQTlNfREFUQSAqcG5zRGF0YVJpZ2h0KTsKIAotdm9pZCBGREthYWNFbmNfQ29kZVBuc0NoYW5uZWwoIGNvbnN0IElOVCAgICAgc2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgUE5TX0NPTkZJRyAgICAqcG5zQ29uZiwKLSAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgKnBuc0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICpzZmJFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICpub2lzZU5yZywKLSAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKnNmYlRocmVzaG9sZCApOwordm9pZCBGREthYWNFbmNfUG9zdFByb2Nlc3NQbnNDaGFubmVsUGFpcihjb25zdCBJTlQgc2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfQ09ORklHICpwbnNDb25mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfREFUQSAqcG5zRGF0YUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOU19EQVRBICpwbnNEYXRhUmlnaHQsIElOVCAqbXNNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm1zRGlnZXN0KTsKIAotdm9pZCBGREthYWNFbmNfUHJlUHJvY2Vzc1Buc0NoYW5uZWxQYWlyKCBjb25zdCBJTlQgIHNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICpzZmJFbmVyZ3lMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKnNmYkVuZXJneVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKnNmYkVuZXJneUxlZnRMRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICpzZmJFbmVyZ3lSaWdodExELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKnNmYkVuZXJneU1pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfQ09ORklHICpwbnNDb25mTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfREFUQSAgICpwbnNEYXRhTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfREFUQSAgICpwbnNEYXRhUmlnaHQgKTsKLQotdm9pZCBGREthYWNFbmNfUG9zdFByb2Nlc3NQbnNDaGFubmVsUGFpciggY29uc3QgSU5UICAgc2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfQ09ORklHICAqcG5zQ29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5TX0RBVEEgICAgKnBuc0RhdGFMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTlNfREFUQSAgICAqcG5zRGF0YVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqbXNNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqbXNEaWdlc3QgKTsKLQotI2VuZGlmIC8qIF9QTlNfRlVOQ19IICovCisjZW5kaWYgLyogUE5TX0ZVTkNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9wbnNwYXJhbS5jcHAgYi9saWJBQUNlbmMvc3JjL3Buc3BhcmFtLmNwcAppbmRleCA5ZDU5ZGRjLi5hNmFhYjA2IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL3Buc3BhcmFtLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL3Buc3BhcmFtLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzMSArOTAsMzIgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5Mb2h3YXNzZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBQTlMgcGFyYW1ldGVycyBkZXBlbmRpbmcgb24gYml0cmF0ZSBhbmQgYmFuZHdpZHRoCisgICBBdXRob3Iocyk6ICAgTS5Mb2h3YXNzZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFBOUyBwYXJhbWV0ZXJzIGRlcGVuZGluZyBvbiBiaXRyYXRlIGFuZCBiYW5kd2lkdGgKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInBuc3BhcmFtLmgiCisKICNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIFNIT1JUICAgICBzdGFydEZyZXE7CisgIFNIT1JUIHN0YXJ0RnJlcTsKICAgLyogUGFyYW1ldGVycyBmb3IgZGV0ZWN0aW9uICovCi0gIEZJWFBfU0dMICByZWZQb3dlcjsKLSAgRklYUF9TR0wgIHJlZlRvbmFsaXR5OwotICBTSE9SVCAgICAgdG5zR2FpblRocmVzaG9sZDsgICAgIC8qIHNjYWxlZCBieSBUTlNfUFJFREdBSU5fU0NBTEUgKD0xMDAwKSAqLwotICBTSE9SVCAgICAgdG5zUE5TR2FpblRocmVzaG9sZDsgIC8qIHNjYWxlZCBieSBUTlNfUFJFREdBSU5fU0NBTEUgKD0xMDAwKSAqLwotICBGSVhQX1NHTCAgZ2FwRmlsbFRocjsKLSAgU0hPUlQgICAgIG1pblNmYldpZHRoOwotICBVU0hPUlQgICAgZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3M7CisgIEZJWFBfU0dMIHJlZlBvd2VyOworICBGSVhQX1NHTCByZWZUb25hbGl0eTsKKyAgU0hPUlQgdG5zR2FpblRocmVzaG9sZDsgICAgLyogc2NhbGVkIGJ5IFROU19QUkVER0FJTl9TQ0FMRSAoPTEwMDApICovCisgIFNIT1JUIHRuc1BOU0dhaW5UaHJlc2hvbGQ7IC8qIHNjYWxlZCBieSBUTlNfUFJFREdBSU5fU0NBTEUgKD0xMDAwKSAqLworICBGSVhQX1NHTCBnYXBGaWxsVGhyOworICBTSE9SVCBtaW5TZmJXaWR0aDsKKyAgVVNIT1JUIGRldGVjdGlvbkFsZ29yaXRobUZsYWdzOwogfSBQTlNfSU5GT19UQUI7CiAKLQogdHlwZWRlZiBzdHJ1Y3QgewogICBVTE9ORyBickZyb207CiAgIFVMT05HIGJyVG87CkBAIC0xMTUsMTk3ICsxMjcsNDQ4IEBACiAgIFVDSEFSIFM0ODAwMDsKIH0gQVVUT19QTlNfVEFCOwogCi1zdGF0aWMgY29uc3QgQVVUT19QTlNfVEFCIGxldmVsVGFibGVfbW9ub1tdPSB7Ci0gIHswLCAgICAgIDExOTk5LCAwLCAxLCAxLCAxLCAxLCAxLH0sCi0gIHsxMjAwMCwgIDE5OTk5LCAwLCAxLCAxLCAxLCAxLCAxLH0sCi0gIHsyMDAwMCwgIDI4OTk5LCAwLCAyLCAxLCAxLCAxLCAxLH0sCi0gIHsyOTAwMCwgIDQwOTk5LCAwLCA0LCA0LCA0LCAyLCAyLH0sCi0gIHs0MTAwMCwgIDU1OTk5LCAwLCA5LCA5LCA3LCA3LCA3LH0sCi0gIHs1NjAwMCwgIDYxOTk5LCAwLCAwLCAwLCAwLCA5LCA5LH0sCi0gIHs2MjAwMCwgIDc1OTk5LCAwLCAwLCAwLCAwLCAwLCAwLH0sCi0gIHs3NjAwMCwgIDkyOTk5LCAwLCAwLCAwLCAwLCAwLCAwLH0sCi0gIHs5MzAwMCwgOTk5OTk5LCAwLCAwLCAwLCAwLCAwLCAwLH0sCitzdGF0aWMgY29uc3QgQVVUT19QTlNfVEFCIGxldmVsVGFibGVfbW9ub1tdID0geworICAgIHsKKyAgICAgICAgMCwKKyAgICAgICAgMTE5OTksCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgIDEsCisgICAgICAgIDEsCisgICAgICAgIDEsCisgICAgICAgIDEsCisgICAgfSwKKyAgICB7CisgICAgICAgIDEyMDAwLAorICAgICAgICAxOTk5OSwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgMSwKKyAgICAgICAgMSwKKyAgICAgICAgMSwKKyAgICAgICAgMSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgMjAwMDAsCisgICAgICAgIDI4OTk5LAorICAgICAgICAwLAorICAgICAgICAyLAorICAgICAgICAxLAorICAgICAgICAxLAorICAgICAgICAxLAorICAgICAgICAxLAorICAgIH0sCisgICAgeworICAgICAgICAyOTAwMCwKKyAgICAgICAgNDA5OTksCisgICAgICAgIDAsCisgICAgICAgIDQsCisgICAgICAgIDQsCisgICAgICAgIDQsCisgICAgICAgIDIsCisgICAgICAgIDIsCisgICAgfSwKKyAgICB7CisgICAgICAgIDQxMDAwLAorICAgICAgICA1NTk5OSwKKyAgICAgICAgMCwKKyAgICAgICAgOSwKKyAgICAgICAgOSwKKyAgICAgICAgNywKKyAgICAgICAgNywKKyAgICAgICAgNywKKyAgICB9LAorICAgIHsKKyAgICAgICAgNTYwMDAsCisgICAgICAgIDYxOTk5LAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICA5LAorICAgICAgICA5LAorICAgIH0sCisgICAgeworICAgICAgICA2MjAwMCwKKyAgICAgICAgNzU5OTksCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgfSwKKyAgICB7CisgICAgICAgIDc2MDAwLAorICAgICAgICA5Mjk5OSwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICB9LAorICAgIHsKKyAgICAgICAgOTMwMDAsCisgICAgICAgIDk5OTk5OSwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICB9LAogfTsKIAotc3RhdGljIGNvbnN0IEFVVE9fUE5TX1RBQiBsZXZlbFRhYmxlX3N0ZXJlb1tdPSB7Ci0gIHswLCAgICAgIDExOTk5LCAwLCAxLCAxLCAxLCAxLCAxLH0sCi0gIHsxMjAwMCwgIDE5OTk5LCAwLCAzLCAxLCAxLCAxLCAxLH0sCi0gIHsyMDAwMCwgIDI4OTk5LCAwLCAzLCAzLCAzLCAyLCAyLH0sCi0gIHsyOTAwMCwgIDQwOTk5LCAwLCA3LCA2LCA2LCA1LCA1LH0sCi0gIHs0MTAwMCwgIDU1OTk5LCAwLCA5LCA5LCA3LCA3LCA3LH0sCi0gIHs1NjAwMCwgIDc5OTk5LCAwLCAwLCAwLCAwLCAwLCAwLH0sCi0gIHs4MDAwMCwgIDk5OTk5LCAwLCAwLCAwLCAwLCAwLCAwLH0sCi0gIHsxMDAwMDAsOTk5OTk5LCAwLCAwLCAwLCAwLCAwLCAwLH0sCitzdGF0aWMgY29uc3QgQVVUT19QTlNfVEFCIGxldmVsVGFibGVfc3RlcmVvW10gPSB7CisgICAgeworICAgICAgICAwLAorICAgICAgICAxMTk5OSwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgMSwKKyAgICAgICAgMSwKKyAgICAgICAgMSwKKyAgICAgICAgMSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgMTIwMDAsCisgICAgICAgIDE5OTk5LAorICAgICAgICAwLAorICAgICAgICAzLAorICAgICAgICAxLAorICAgICAgICAxLAorICAgICAgICAxLAorICAgICAgICAxLAorICAgIH0sCisgICAgeworICAgICAgICAyMDAwMCwKKyAgICAgICAgMjg5OTksCisgICAgICAgIDAsCisgICAgICAgIDMsCisgICAgICAgIDMsCisgICAgICAgIDMsCisgICAgICAgIDIsCisgICAgICAgIDIsCisgICAgfSwKKyAgICB7CisgICAgICAgIDI5MDAwLAorICAgICAgICA0MDk5OSwKKyAgICAgICAgMCwKKyAgICAgICAgNywKKyAgICAgICAgNiwKKyAgICAgICAgNiwKKyAgICAgICAgNSwKKyAgICAgICAgNSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgNDEwMDAsCisgICAgICAgIDU1OTk5LAorICAgICAgICAwLAorICAgICAgICA5LAorICAgICAgICA5LAorICAgICAgICA3LAorICAgICAgICA3LAorICAgICAgICA3LAorICAgIH0sCisgICAgeworICAgICAgICA1NjAwMCwKKyAgICAgICAgNzk5OTksCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgfSwKKyAgICB7CisgICAgICAgIDgwMDAwLAorICAgICAgICA5OTk5OSwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICB9LAorICAgIHsKKyAgICAgICAgMTAwMDAwLAorICAgICAgICA5OTk5OTksCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgfSwKIH07CiAKLQogc3RhdGljIGNvbnN0IFBOU19JTkZPX1RBQiBwbnNJbmZvVGFiW10gPSB7Ci0vKjAgICBwbnMgb2ZmICovCi0vKjEqLyB7IDQwMDAsIEZMMkZYQ09OU1RfU0dMKDAuMDQpLCBGTDJGWENPTlNUX1NHTCgwLjA2KSwgMTE1MCwgMTIwMCwgRkwyRlhDT05TVF9TR0woMC4wMiksIDgsCi0gICAgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwgVVNFX1ROU19QTlMgLyp8IEpVU1RfTE9OR19XSU5ET1cqLyB9LAotLyoyKi8geyA0MDAwLCBGTDJGWENPTlNUX1NHTCgwLjA0KSwgRkwyRlhDT05TVF9TR0woMC4wNyksIDExMzAsIDEzMDAsIEZMMkZYQ09OU1RfU0dMKDAuMDUpLCA4LAotICAgICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8IFVTRV9UTlNfUE5TIC8qfCBKVVNUX0xPTkdfV0lORE9XKi8gfSwKLS8qMyovIHsgNDEwMCwgRkwyRlhDT05TVF9TR0woMC4wNCksIEZMMkZYQ09OU1RfU0dMKDAuMDcpLCAxMTAwLCAxNDAwLCBGTDJGWENPTlNUX1NHTCgwLjEwKSwgOCwKLSAgICAgICAgVVNFX1BPV0VSX0RJU1RSSUJVVElPTiB8IFVTRV9QU1lDSF9UT05BTElUWSB8IFVTRV9UTlNfR0FJTl9USFIgfCBVU0VfVE5TX1BOUyAvKnwgSlVTVF9MT05HX1dJTkRPVyovIH0sCi0vKjQqLyB7IDQxMDAsIEZMMkZYQ09OU1RfU0dMKDAuMDMpLCBGTDJGWENPTlNUX1NHTCgwLjEwKSwgMTEwMCwgMTQwMCwgRkwyRlhDT05TVF9TR0woMC4xNSksIDgsCi0gICAgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwgVVNFX1ROU19QTlMgLyp8IEpVU1RfTE9OR19XSU5ET1cqLyB9LAotLyo1Ki8geyA0MzAwLCBGTDJGWENPTlNUX1NHTCgwLjAzKSwgRkwyRlhDT05TVF9TR0woMC4xMCksIDExMDAsIDE0MDAsIEZMMkZYQ09OU1RfU0dMKDAuMTUpLCA4LAotICAgICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8IFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPVyB9LAotLyo2Ki8geyA1MDAwLCBGTDJGWENPTlNUX1NHTCgwLjAzKSwgRkwyRlhDT05TVF9TR0woMC4xMCksIDExMDAsIDE0MDAsIEZMMkZYQ09OU1RfU0dMKDAuMjUpLCA4LAotICAgICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8IFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPVyB9LAotLyo3Ki8geyA1NTAwLCBGTDJGWENPTlNUX1NHTCgwLjAzKSwgRkwyRlhDT05TVF9TR0woMC4xMiksIDExMDAsIDE0MDAsIEZMMkZYQ09OU1RfU0dMKDAuMzUpLCA4LAotICAgICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8IFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPVyB9LAotLyo4Ki8geyA2MDAwLCBGTDJGWENPTlNUX1NHTCgwLjAzKSwgRkwyRlhDT05TVF9TR0woMC4xMiksIDEwODAsIDE0MDAsIEZMMkZYQ09OU1RfU0dMKDAuNDApLCA4LAotICAgICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8IFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPVyB9LAotLyo5Ki8geyA2MDAwLCBGTDJGWENPTlNUX1NHTCgwLjAzKSwgRkwyRlhDT05TVF9TR0woMC4xNCksIDEwNzAsIDE0MDAsIEZMMkZYQ09OU1RfU0dMKDAuNDUpLCA4LAotICAgICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8IFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPVyB9LAorICAgIC8qMCAgIHBucyBvZmYgKi8KKyAgICAvKjEqLyB7NDAwMCwgRkwyRlhDT05TVF9TR0woMC4wNCksIEZMMkZYQ09OU1RfU0dMKDAuMDYpLCAxMTUwLCAxMjAwLAorICAgICAgICAgICBGTDJGWENPTlNUX1NHTCgwLjAyKSwgOCwKKyAgICAgICAgICAgVVNFX1BPV0VSX0RJU1RSSUJVVElPTiB8IFVTRV9QU1lDSF9UT05BTElUWSB8IFVTRV9UTlNfR0FJTl9USFIgfAorICAgICAgICAgICAgICAgVVNFX1ROU19QTlMgLyp8IEpVU1RfTE9OR19XSU5ET1cqL30sCisgICAgLyoyKi8KKyAgICB7NDAwMCwgRkwyRlhDT05TVF9TR0woMC4wNCksIEZMMkZYQ09OU1RfU0dMKDAuMDcpLCAxMTMwLCAxMzAwLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjA1KSwgOCwKKyAgICAgVVNFX1BPV0VSX0RJU1RSSUJVVElPTiB8IFVTRV9QU1lDSF9UT05BTElUWSB8IFVTRV9UTlNfR0FJTl9USFIgfAorICAgICAgICAgVVNFX1ROU19QTlMgLyp8IEpVU1RfTE9OR19XSU5ET1cqL30sCisgICAgLyozKi8KKyAgICB7NDEwMCwgRkwyRlhDT05TVF9TR0woMC4wNCksIEZMMkZYQ09OU1RfU0dMKDAuMDcpLCAxMTAwLCAxNDAwLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjEwKSwgOCwKKyAgICAgVVNFX1BPV0VSX0RJU1RSSUJVVElPTiB8IFVTRV9QU1lDSF9UT05BTElUWSB8IFVTRV9UTlNfR0FJTl9USFIgfAorICAgICAgICAgVVNFX1ROU19QTlMgLyp8IEpVU1RfTE9OR19XSU5ET1cqL30sCisgICAgLyo0Ki8KKyAgICB7NDEwMCwgRkwyRlhDT05TVF9TR0woMC4wMyksIEZMMkZYQ09OU1RfU0dMKDAuMTApLCAxMTAwLCAxNDAwLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjE1KSwgOCwKKyAgICAgVVNFX1BPV0VSX0RJU1RSSUJVVElPTiB8IFVTRV9QU1lDSF9UT05BTElUWSB8IFVTRV9UTlNfR0FJTl9USFIgfAorICAgICAgICAgVVNFX1ROU19QTlMgLyp8IEpVU1RfTE9OR19XSU5ET1cqL30sCisgICAgLyo1Ki8KKyAgICB7NDMwMCwgRkwyRlhDT05TVF9TR0woMC4wMyksIEZMMkZYQ09OU1RfU0dMKDAuMTApLCAxMTAwLCAxNDAwLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjE1KSwgOCwKKyAgICAgVVNFX1BPV0VSX0RJU1RSSUJVVElPTiB8IFVTRV9QU1lDSF9UT05BTElUWSB8IFVTRV9UTlNfR0FJTl9USFIgfAorICAgICAgICAgVVNFX1ROU19QTlMgfCBKVVNUX0xPTkdfV0lORE9XfSwKKyAgICAvKjYqLworICAgIHs1MDAwLCBGTDJGWENPTlNUX1NHTCgwLjAzKSwgRkwyRlhDT05TVF9TR0woMC4xMCksIDExMDAsIDE0MDAsCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMjUpLCA4LAorICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8CisgICAgICAgICBVU0VfVE5TX1BOUyB8IEpVU1RfTE9OR19XSU5ET1d9LAorICAgIC8qNyovCisgICAgezU1MDAsIEZMMkZYQ09OU1RfU0dMKDAuMDMpLCBGTDJGWENPTlNUX1NHTCgwLjEyKSwgMTEwMCwgMTQwMCwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4zNSksIDgsCisgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwKKyAgICAgICAgIFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPV30sCisgICAgLyo4Ki8KKyAgICB7NjAwMCwgRkwyRlhDT05TVF9TR0woMC4wMyksIEZMMkZYQ09OU1RfU0dMKDAuMTIpLCAxMDgwLCAxNDAwLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjQwKSwgOCwKKyAgICAgVVNFX1BPV0VSX0RJU1RSSUJVVElPTiB8IFVTRV9QU1lDSF9UT05BTElUWSB8IFVTRV9UTlNfR0FJTl9USFIgfAorICAgICAgICAgVVNFX1ROU19QTlMgfCBKVVNUX0xPTkdfV0lORE9XfSwKKyAgICAvKjkqLworICAgIHs2MDAwLCBGTDJGWENPTlNUX1NHTCgwLjAzKSwgRkwyRlhDT05TVF9TR0woMC4xNCksIDEwNzAsIDE0MDAsCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNDUpLCA4LAorICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8CisgICAgICAgICBVU0VfVE5TX1BOUyB8IEpVU1RfTE9OR19XSU5ET1d9LAogfTsKIAotc3RhdGljIGNvbnN0IEFVVE9fUE5TX1RBQiBsZXZlbFRhYmxlX2xvd0NvbXBsZXhpdHlbXT0gewotICB7MCwgICAgICAyNzk5OSwgMCwgMCwgMCwgMCwgMCwgMCx9LAotICB7MjgwMDAsICAzMTk5OSwgMCwgMiwgMiwgMiwgMiwgMix9LAotICB7MzIwMDAsICA0Nzk5OSwgMCwgMywgMywgMywgMywgMyx9LAotICB7NDgwMDAsICA0ODAwMCwgMCwgNCwgNCwgNCwgNCwgNCx9LAotICB7NDgwMDEsIDk5OTk5OSwgMCwgMCwgMCwgMCwgMCwgMCx9LAorc3RhdGljIGNvbnN0IEFVVE9fUE5TX1RBQiBsZXZlbFRhYmxlX2xvd0NvbXBsZXhpdHlbXSA9IHsKKyAgICB7CisgICAgICAgIDAsCisgICAgICAgIDI3OTk5LAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgIH0sCisgICAgeworICAgICAgICAyODAwMCwKKyAgICAgICAgMzE5OTksCisgICAgICAgIDAsCisgICAgICAgIDIsCisgICAgICAgIDIsCisgICAgICAgIDIsCisgICAgICAgIDIsCisgICAgICAgIDIsCisgICAgfSwKKyAgICB7CisgICAgICAgIDMyMDAwLAorICAgICAgICA0Nzk5OSwKKyAgICAgICAgMCwKKyAgICAgICAgMywKKyAgICAgICAgMywKKyAgICAgICAgMywKKyAgICAgICAgMywKKyAgICAgICAgMywKKyAgICB9LAorICAgIHsKKyAgICAgICAgNDgwMDAsCisgICAgICAgIDQ4MDAwLAorICAgICAgICAwLAorICAgICAgICA0LAorICAgICAgICA0LAorICAgICAgICA0LAorICAgICAgICA0LAorICAgICAgICA0LAorICAgIH0sCisgICAgeworICAgICAgICA0ODAwMSwKKyAgICAgICAgOTk5OTk5LAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgIH0sCiB9OwotCi0vKiBjb252ZXJzaW9uIG9mIG9sZCBMQyB0dW5pbmcgdGFibGVzIHRvIG5ldyAoTEQgZW5jKSBzdHJ1Y3R1cmUgKG9ubHkgZW50cmllcyB3aGljaCBhcmUgYWN0dWFsbHkgdXNlZCB3ZXJlIGNvbnZlcnRlZCkgKi8KKy8qIGNvbnZlcnNpb24gb2Ygb2xkIExDIHR1bmluZyB0YWJsZXMgdG8gbmV3IChMRCBlbmMpIHN0cnVjdHVyZSAob25seSBlbnRyaWVzCisgKiB3aGljaCBhcmUgYWN0dWFsbHkgdXNlZCB3ZXJlIGNvbnZlcnRlZCkgKi8KIHN0YXRpYyBjb25zdCBQTlNfSU5GT19UQUIgcG5zSW5mb1RhYl9sb3dDb21wbGV4aXR5W10gPSB7Ci0vKjAgICBwbnMgb2ZmICovCi0gICAgICAvKiBERUZBVUxUIHBhcmFtZXRlciBzZXQgKi8KLS8qMSovIHsgNDEwMCwgRkwyRlhDT05TVF9TR0woMC4wMyksIEZMMkZYQ09OU1RfU0dMKDAuMTYpLCAxMTAwLCAxNDAwLCBGTDJGWENPTlNUX1NHTCgwLjUpLCAxNiwKLSAgICAgICAgVVNFX1BPV0VSX0RJU1RSSUJVVElPTiB8IFVTRV9QU1lDSF9UT05BTElUWSB8IFVTRV9UTlNfR0FJTl9USFIgfCBVU0VfVE5TX1BOUyB8IEpVU1RfTE9OR19XSU5ET1cgfSwKLS8qMiovIHsgNDEwMCwgRkwyRlhDT05TVF9TR0woMC4wNSksIEZMMkZYQ09OU1RfU0dMKDAuMTApLCAxNDEwLCAxNDAwLCBGTDJGWENPTlNUX1NHTCgwLjUpLCAxNiwKLSAgICAgICAgVVNFX1BPV0VSX0RJU1RSSUJVVElPTiB8IFVTRV9QU1lDSF9UT05BTElUWSB8IFVTRV9UTlNfR0FJTl9USFIgfCBVU0VfVE5TX1BOUyB8IEpVU1RfTE9OR19XSU5ET1cgfSwKLS8qMyovIHsgNDEwMCwgRkwyRlhDT05TVF9TR0woMC4wNSksIEZMMkZYQ09OU1RfU0dMKDAuMTApLCAxMTAwLCAxNDAwLCBGTDJGWENPTlNUX1NHTCgwLjUpLCAxNiwKLSAgICAgICAgVVNFX1BPV0VSX0RJU1RSSUJVVElPTiB8IFVTRV9QU1lDSF9UT05BTElUWSB8IFVTRV9UTlNfR0FJTl9USFIgfCBVU0VfVE5TX1BOUyB8IEpVU1RfTE9OR19XSU5ET1cgfSwKLSAgICAgIC8qIExPV1NVQlNUIC0+IFBOUyBpcyB1c2VkIGxlc3Mgb2Z0ZW4gdGhhbiB3aXRoIERFRkFVTFQgcGFyYW1ldGVyIHNldCAoZm9yIGJyOiA0ODAwMCAtIDc5OTk5KSAqLwotLyo0Ki8geyA0MTAwLCBGTDJGWENPTlNUX1NHTCgwLjIwKSwgRkwyRlhDT05TVF9TR0woMC4xMCksIDE0MTAsIDE0MDAsIEZMMkZYQ09OU1RfU0dMKDAuNSksIDE2LAotICAgICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8IFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPVyB9LAorICAgIC8qMCAgIHBucyBvZmYgKi8KKyAgICAvKiBERUZBVUxUIHBhcmFtZXRlciBzZXQgKi8KKyAgICAvKjEqLyB7NDEwMCwgRkwyRlhDT05TVF9TR0woMC4wMyksIEZMMkZYQ09OU1RfU0dMKDAuMTYpLCAxMTAwLCAxNDAwLAorICAgICAgICAgICBGTDJGWENPTlNUX1NHTCgwLjUpLCAxNiwKKyAgICAgICAgICAgVVNFX1BPV0VSX0RJU1RSSUJVVElPTiB8IFVTRV9QU1lDSF9UT05BTElUWSB8IFVTRV9UTlNfR0FJTl9USFIgfAorICAgICAgICAgICAgICAgVVNFX1ROU19QTlMgfCBKVVNUX0xPTkdfV0lORE9XfSwKKyAgICAvKjIqLworICAgIHs0MTAwLCBGTDJGWENPTlNUX1NHTCgwLjA1KSwgRkwyRlhDT05TVF9TR0woMC4xMCksIDE0MTAsIDE0MDAsCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNSksIDE2LAorICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8CisgICAgICAgICBVU0VfVE5TX1BOUyB8IEpVU1RfTE9OR19XSU5ET1d9LAorICAgIC8qMyovCisgICAgezQxMDAsIEZMMkZYQ09OU1RfU0dMKDAuMDUpLCBGTDJGWENPTlNUX1NHTCgwLjEwKSwgMTEwMCwgMTQwMCwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41KSwgMTYsCisgICAgIFVTRV9QT1dFUl9ESVNUUklCVVRJT04gfCBVU0VfUFNZQ0hfVE9OQUxJVFkgfCBVU0VfVE5TX0dBSU5fVEhSIHwKKyAgICAgICAgIFVTRV9UTlNfUE5TIHwgSlVTVF9MT05HX1dJTkRPV30sCisgICAgLyogTE9XU1VCU1QgLT4gUE5TIGlzIHVzZWQgbGVzcyBvZnRlbiB0aGFuIHdpdGggREVGQVVMVCBwYXJhbWV0ZXIgc2V0IChmb3IKKyAgICAgICBicjogNDgwMDAgLSA3OTk5OSkgKi8KKyAgICAvKjQqLworICAgIHs0MTAwLCBGTDJGWENPTlNUX1NHTCgwLjIwKSwgRkwyRlhDT05TVF9TR0woMC4xMCksIDE0MTAsIDE0MDAsCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNSksIDE2LAorICAgICBVU0VfUE9XRVJfRElTVFJJQlVUSU9OIHwgVVNFX1BTWUNIX1RPTkFMSVRZIHwgVVNFX1ROU19HQUlOX1RIUiB8CisgICAgICAgICBVU0VfVE5TX1BOUyB8IEpVU1RfTE9OR19XSU5ET1d9LAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgZnVuY3Rpb24gdG8gbG9vayB1cCB1c2VkIHBucyBsZXZlbAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBGREthYWNFbmNfbG9va1VwUG5zVXNlIChpbnQgYml0UmF0ZSwgaW50IHNhbXBsZVJhdGUsIGludCBudW1DaGFuLCBjb25zdCBpbnQgaXNMQykgewotCi0gIGludCBoVXNlUG5zPTAsIHNpemUsIGk7CitpbnQgRkRLYWFjRW5jX2xvb2tVcFBuc1VzZShpbnQgYml0UmF0ZSwgaW50IHNhbXBsZVJhdGUsIGludCBudW1DaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGlzTEMpIHsKKyAgaW50IGhVc2VQbnMgPSAwLCBzaXplLCBpOwogICBjb25zdCBBVVRPX1BOU19UQUIgKmxldmVsVGFibGU7CiAKICAgaWYgKGlzTEMpIHsKICAgICBsZXZlbFRhYmxlID0gJmxldmVsVGFibGVfbG93Q29tcGxleGl0eVswXTsKICAgICBzaXplID0gc2l6ZW9mKGxldmVsVGFibGVfbG93Q29tcGxleGl0eSk7Ci0gIH0gZWxzZQotICB7IC8qIChFKUxEICovCisgIH0gZWxzZSB7IC8qIChFKUxEICovCiAgICAgbGV2ZWxUYWJsZSA9IChudW1DaGFuID4gMSkgPyAmbGV2ZWxUYWJsZV9zdGVyZW9bMF0gOiAmbGV2ZWxUYWJsZV9tb25vWzBdOwogICAgIHNpemUgPSAobnVtQ2hhbiA+IDEpID8gc2l6ZW9mKGxldmVsVGFibGVfc3RlcmVvKSA6IHNpemVvZihsZXZlbFRhYmxlX21vbm8pOwogICB9CiAKLSAgZm9yKGkgPSAwOyBpIDwgKGludCkgKHNpemUvc2l6ZW9mKEFVVE9fUE5TX1RBQikpOyBpKyspIHsKLSAgICBpZigoKFVMT05HKWJpdFJhdGUgPj0gbGV2ZWxUYWJsZVtpXS5ickZyb20pICYmCi0gICAgICAgKChVTE9ORyliaXRSYXRlIDw9IGxldmVsVGFibGVbaV0uYnJUbykgKQorICBmb3IgKGkgPSAwOyBpIDwgKGludCkoc2l6ZSAvIHNpemVvZihBVVRPX1BOU19UQUIpKTsgaSsrKSB7CisgICAgaWYgKCgoVUxPTkcpYml0UmF0ZSA+PSBsZXZlbFRhYmxlW2ldLmJyRnJvbSkgJiYKKyAgICAgICAgKChVTE9ORyliaXRSYXRlIDw9IGxldmVsVGFibGVbaV0uYnJUbykpCiAgICAgICBicmVhazsKICAgfQogCiAgIC8qIHNhbml0eSBjaGVjayAqLwotICBpZiAoKGludCkoc2l6ZW9mKHBuc0luZm9UYWIpL3NpemVvZihQTlNfSU5GT19UQUIpKSA8IGkgKSB7CisgIGlmICgoaW50KShzaXplb2YocG5zSW5mb1RhYikgLyBzaXplb2YoUE5TX0lORk9fVEFCKSkgPCBpKSB7CiAgICAgcmV0dXJuIChQTlNfVEFCTEVfRVJST1IpOwogICB9CiAKICAgc3dpdGNoIChzYW1wbGVSYXRlKSB7Ci0gIGNhc2UgMTYwMDA6IGhVc2VQbnMgPSBsZXZlbFRhYmxlW2ldLlMxNjAwMDsgYnJlYWs7Ci0gIGNhc2UgMjIwNTA6IGhVc2VQbnMgPSBsZXZlbFRhYmxlW2ldLlMyMjA1MDsgYnJlYWs7Ci0gIGNhc2UgMjQwMDA6IGhVc2VQbnMgPSBsZXZlbFRhYmxlW2ldLlMyNDAwMDsgYnJlYWs7Ci0gIGNhc2UgMzIwMDA6IGhVc2VQbnMgPSBsZXZlbFRhYmxlW2ldLlMzMjAwMDsgYnJlYWs7Ci0gIGNhc2UgNDQxMDA6IGhVc2VQbnMgPSBsZXZlbFRhYmxlW2ldLlM0NDEwMDsgYnJlYWs7Ci0gIGNhc2UgNDgwMDA6IGhVc2VQbnMgPSBsZXZlbFRhYmxlW2ldLlM0ODAwMDsgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgaWYgKGlzTEMpIHsKKyAgICBjYXNlIDE2MDAwOgorICAgICAgaFVzZVBucyA9IGxldmVsVGFibGVbaV0uUzE2MDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjA1MDoKKyAgICAgIGhVc2VQbnMgPSBsZXZlbFRhYmxlW2ldLlMyMjA1MDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjQwMDA6CisgICAgICBoVXNlUG5zID0gbGV2ZWxUYWJsZVtpXS5TMjQwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMyMDAwOgorICAgICAgaFVzZVBucyA9IGxldmVsVGFibGVbaV0uUzMyMDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0NDEwMDoKKyAgICAgIGhVc2VQbnMgPSBsZXZlbFRhYmxlW2ldLlM0NDEwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDgwMDA6CiAgICAgICBoVXNlUG5zID0gbGV2ZWxUYWJsZVtpXS5TNDgwMDA7Ci0gICAgfQotICAgIGJyZWFrOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChpc0xDKSB7CisgICAgICAgIGhVc2VQbnMgPSBsZXZlbFRhYmxlW2ldLlM0ODAwMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICB9CiAKICAgcmV0dXJuIChoVXNlUG5zKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0dldFBuc1BhcmFtCi0gICAgZGVzY3JpcHRpb246ICBHZXRzIFBOUyBwYXJhbWV0ZXJzIGRlcGVuZGluZyBvbiBiaXRyYXRlIGFuZCBiYW5kd2lkdGgKKyAgICBkZXNjcmlwdGlvbjogIEdldHMgUE5TIHBhcmFtZXRlcnMgZGVwZW5kaW5nIG9uIGJpdHJhdGUgYW5kIGJhbmR3aWR0aCBvcgorICAgICAgICAgICAgICAgICAgICBiaXRzUGVyTGluZQogICAgIHJldHVybnM6ICAgICAgZXJyb3Igc3RhdHVzCiAgICAgaW5wdXQ6ICAgICAgICBOb2lzZXBhcmFtcyBzdHJ1Y3QsIGJpdHJhdGUsIHNhbXBsaW5nIHJhdGUsCiAgICAgICAgICAgICAgICAgICBudW1iZXIgb2Ygc2ZiJ3MsIHBvaW50ZXIgdG8gc2ZiIG9mZnNldAogICAgIG91dHB1dDogICAgICAgUE5TIHBhcmFtZXRlcnMKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfR2V0UG5zUGFyYW0oTk9JU0VQQVJBTVMgKm5wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIGJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqdXNlUG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG51bUNoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgaXNMQykKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19HZXRQbnNQYXJhbShOT0lTRVBBUkFNUyAqbnAsIElOVCBiaXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlLCBJTlQgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqc2ZiT2Zmc2V0LCBJTlQgKnVzZVBucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtQ2hhbiwgY29uc3QgSU5UIGlzTEMpIHsKKyAgaW50IGksIGhVc2VQbnM7CisgIGNvbnN0IFBOU19JTkZPX1RBQiAqcG5zSW5mbzsKIAotewotICAgIGludCBpLCBoVXNlUG5zOwotICAgIGNvbnN0IFBOU19JTkZPX1RBQiAqcG5zSW5mbzsKKyAgaWYgKCp1c2VQbnMgPD0gMCkgcmV0dXJuIEFBQ19FTkNfT0s7CiAKLSAgICBpZiAoaXNMQykgewotICAgICAgbnAtPmRldGVjdGlvbkFsZ29yaXRobUZsYWdzID0gSVNfTE9XX0NPTUxFWElUWTsKLSAgICAgIHBuc0luZm8gPSBwbnNJbmZvVGFiX2xvd0NvbXBsZXhpdHk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBucC0+ZGV0ZWN0aW9uQWxnb3JpdGhtRmxhZ3MgPSAwOwotICAgICAgcG5zSW5mbyA9IHBuc0luZm9UYWI7Ci0gICAgfQorICBpZiAoaXNMQykgeworICAgIG5wLT5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyA9IElTX0xPV19DT01QTEVYSVRZOwogCi0gICAgaWYgKCp1c2VQbnM8PTApCi0gICAgICAgIHJldHVybiBBQUNfRU5DX09LOworICAgIHBuc0luZm8gPSBwbnNJbmZvVGFiX2xvd0NvbXBsZXhpdHk7CiAKICAgICAvKiBuZXcgcG5zIHBhcmFtcyAqLwotICAgIGhVc2VQbnMgPSBGREthYWNFbmNfbG9va1VwUG5zVXNlIChiaXRSYXRlLCBzYW1wbGVSYXRlLCBudW1DaGFuLCBpc0xDKTsKKyAgICBoVXNlUG5zID0gRkRLYWFjRW5jX2xvb2tVcFBuc1VzZShiaXRSYXRlLCBzYW1wbGVSYXRlLCBudW1DaGFuLCBpc0xDKTsKICAgICBpZiAoaFVzZVBucyA9PSAwKSB7CiAgICAgICAqdXNlUG5zID0gMDsKLSAgICAgICAgcmV0dXJuIEFBQ19FTkNfT0s7Ci0gICAgICAgIH0KLSAgICBpZiAoaFVzZVBucyA9PSBQTlNfVEFCTEVfRVJST1IpCisgICAgICByZXR1cm4gQUFDX0VOQ19PSzsKKyAgICB9CisKKyAgICBpZiAoaFVzZVBucyA9PSBQTlNfVEFCTEVfRVJST1IpIHsKICAgICAgIHJldHVybiBBQUNfRU5DX1BOU19UQUJMRV9FUlJPUjsKKyAgICB9CiAKICAgICAvKiBzZWxlY3QgY29ycmVjdCByb3cgb2YgdHVuaW5nIHRhYmxlICovCi0gICAgcG5zSW5mbyArPSBoVXNlUG5zLTE7CisgICAgcG5zSW5mbyArPSBoVXNlUG5zIC0gMTsKIAotICAgIG5wLT5zdGFydFNmYiA9IEZES2FhY0VuY19GcmVxVG9CYW5kV2l0aFJvdW5kaW5nKCBwbnNJbmZvLT5zdGFydEZyZXEsCi0gICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgIHNmYkNudCwKLSAgICAgICAgc2ZiT2Zmc2V0ICk7CisgIH0gZWxzZSB7CisgICAgbnAtPmRldGVjdGlvbkFsZ29yaXRobUZsYWdzID0gMDsKKyAgICBwbnNJbmZvID0gcG5zSW5mb1RhYjsKIAotICAgIG5wLT5kZXRlY3Rpb25BbGdvcml0aG1GbGFncyB8PSBwbnNJbmZvLT5kZXRlY3Rpb25BbGdvcml0aG1GbGFnczsKLQotICAgIG5wLT5yZWZQb3dlciAgICAgICAgICAgICA9IEZYX1NHTDJGWF9EQkwocG5zSW5mby0+cmVmUG93ZXIpOwotICAgIG5wLT5yZWZUb25hbGl0eSAgICAgICAgICA9IEZYX1NHTDJGWF9EQkwocG5zSW5mby0+cmVmVG9uYWxpdHkpOwotICAgIG5wLT50bnNHYWluVGhyZXNob2xkICAgICA9IHBuc0luZm8tPnRuc0dhaW5UaHJlc2hvbGQ7Ci0gICAgbnAtPnRuc1BOU0dhaW5UaHJlc2hvbGQgID0gcG5zSW5mby0+dG5zUE5TR2FpblRocmVzaG9sZDsKLSAgICBucC0+bWluU2ZiV2lkdGggICAgICAgICAgPSBwbnNJbmZvLT5taW5TZmJXaWR0aDsKLQotICAgIG5wLT5nYXBGaWxsVGhyICAgICAgICAgICA9IChGSVhQX1NHTClwbnNJbmZvLT5nYXBGaWxsVGhyOwotCi0gICAgLyogYXNzdW1pbmcgYSBjb25zdGFudCBkQi9IeiBzbG9wZSBpbiB0aGUgc2lnbmFsJ3MgUFNEIGN1cnZlLAotICAgIHRoZSBkZXRlY3Rpb24gdGhyZXNob2xkIG5lZWRzIHRvIGJlIGNvcnJlY3RlZCBmb3IgdGhlIHdpZHRoIG9mIHRoZSBiYW5kICovCi0gICAgZm9yICggaSA9IDA7IGkgPCAoc2ZiQ250LTEpOyBpKyspCi0gICAgewotICAgICAgICBJTlQgcXRtcCwgc2ZiV2lkdGg7Ci0gICAgICAgIEZJWFBfREJMIHRtcDsKLQotICAgICAgICBzZmJXaWR0aCA9IHNmYk9mZnNldFtpKzFdLXNmYk9mZnNldFtpXTsKLQotICAgICAgICB0bXAgPSBmUG93KG5wLT5yZWZQb3dlciwgMCwgc2ZiV2lkdGgsIERGUkFDVF9CSVRTLTEtNSwgJnF0bXApOwotICAgICAgICBucC0+cG93RGlzdFBTRGN1cnZlW2ldID0gKEZJWFBfU0dMKSgoTE9ORykoc2NhbGVWYWx1ZSh0bXAsIHF0bXApID4+IDE2KSk7CisgICAgLyogbmV3IHBucyBwYXJhbXMgKi8KKyAgICBoVXNlUG5zID0gRkRLYWFjRW5jX2xvb2tVcFBuc1VzZShiaXRSYXRlLCBzYW1wbGVSYXRlLCBudW1DaGFuLCBpc0xDKTsKKyAgICBpZiAoaFVzZVBucyA9PSAwKSB7CisgICAgICAqdXNlUG5zID0gMDsKKyAgICAgIHJldHVybiBBQUNfRU5DX09LOwogICAgIH0KLSAgICBucC0+cG93RGlzdFBTRGN1cnZlW3NmYkNudF0gPSBucC0+cG93RGlzdFBTRGN1cnZlW3NmYkNudC0xXTsKKyAgICBpZiAoaFVzZVBucyA9PSBQTlNfVEFCTEVfRVJST1IpIHJldHVybiBBQUNfRU5DX1BOU19UQUJMRV9FUlJPUjsKKworICAgIC8qIHNlbGVjdCBjb3JyZWN0IHJvdyBvZiB0dW5pbmcgdGFibGUgKi8KKyAgICBwbnNJbmZvICs9IGhVc2VQbnMgLSAxOworICB9CisKKyAgbnAtPnN0YXJ0U2ZiID0gRkRLYWFjRW5jX0ZyZXFUb0JhbmRXaWR0aFJvdW5kaW5nKAorICAgICAgcG5zSW5mby0+c3RhcnRGcmVxLCBzYW1wbGVSYXRlLCBzZmJDbnQsIHNmYk9mZnNldCk7CisKKyAgbnAtPmRldGVjdGlvbkFsZ29yaXRobUZsYWdzIHw9IHBuc0luZm8tPmRldGVjdGlvbkFsZ29yaXRobUZsYWdzOworCisgIG5wLT5yZWZQb3dlciA9IEZYX1NHTDJGWF9EQkwocG5zSW5mby0+cmVmUG93ZXIpOworICBucC0+cmVmVG9uYWxpdHkgPSBGWF9TR0wyRlhfREJMKHBuc0luZm8tPnJlZlRvbmFsaXR5KTsKKyAgbnAtPnRuc0dhaW5UaHJlc2hvbGQgPSBwbnNJbmZvLT50bnNHYWluVGhyZXNob2xkOworICBucC0+dG5zUE5TR2FpblRocmVzaG9sZCA9IHBuc0luZm8tPnRuc1BOU0dhaW5UaHJlc2hvbGQ7CisgIG5wLT5taW5TZmJXaWR0aCA9IHBuc0luZm8tPm1pblNmYldpZHRoOworCisgIG5wLT5nYXBGaWxsVGhyID0KKyAgICAgIHBuc0luZm8tPmdhcEZpbGxUaHI7IC8qIGZvciBMQyBpdCBpcyBhbHdheXMgRkwyRlhDT05TVF9TR0woMC41KSAqLworCisgIC8qIGFzc3VtaW5nIGEgY29uc3RhbnQgZEIvSHogc2xvcGUgaW4gdGhlIHNpZ25hbCdzIFBTRCBjdXJ2ZSwKKyAgICB0aGUgZGV0ZWN0aW9uIHRocmVzaG9sZCBuZWVkcyB0byBiZSBjb3JyZWN0ZWQgZm9yIHRoZSB3aWR0aCBvZiB0aGUgYmFuZCAqLworCisgIGZvciAoaSA9IDA7IGkgPCAoc2ZiQ250IC0gMSk7IGkrKykgeworICAgIElOVCBxdG1wLCBzZmJXaWR0aDsKKyAgICBGSVhQX0RCTCB0bXA7CisKKyAgICBzZmJXaWR0aCA9IHNmYk9mZnNldFtpICsgMV0gLSBzZmJPZmZzZXRbaV07CisKKyAgICB0bXAgPSBmUG93KG5wLT5yZWZQb3dlciwgMCwgc2ZiV2lkdGgsIERGUkFDVF9CSVRTIC0gMSAtIDUsICZxdG1wKTsKKyAgICBucC0+cG93RGlzdFBTRGN1cnZlW2ldID0gKEZJWFBfU0dMKSgoTE9ORykoc2NhbGVWYWx1ZSh0bXAsIHF0bXApID4+IDE2KSk7CisgIH0KKyAgbnAtPnBvd0Rpc3RQU0RjdXJ2ZVtzZmJDbnRdID0gbnAtPnBvd0Rpc3RQU0RjdXJ2ZVtzZmJDbnQgLSAxXTsKIAogICByZXR1cm4gQUFDX0VOQ19PSzsKIH0KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvcG5zcGFyYW0uaCBiL2xpYkFBQ2VuYy9zcmMvcG5zcGFyYW0uaAppbmRleCAwOGJiODNlLi5jMzc3MzhhIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL3Buc3BhcmFtLmgKKysrIGIvbGliQUFDZW5jL3NyYy9wbnNwYXJhbS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDM2ICs5MCwzNiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBMb2h3YXNzZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBQTlMgcGFyYW1ldGVycyBkZXBlbmRpbmcgb24gYml0cmF0ZSBhbmQgYmFuZHdpZHRoCisgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBQTlMgcGFyYW1ldGVycyBkZXBlbmRpbmcgb24gYml0cmF0ZSBhbmQgYmFuZHdpZHRoCiAKLSNpZm5kZWYgX19QTlNQQVJBTV9ICi0jZGVmaW5lIF9fUE5TUEFSQU1fSAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBQTlNQQVJBTV9ICisjZGVmaW5lIFBOU1BBUkFNX0gKIAogI2luY2x1ZGUgImFhY2VuYy5oIgogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKICNpbmNsdWRlICJwc3lfY29uc3QuaCIKIAotI2RlZmluZSBOVU1fUE5TSU5GT1RBQiAgICA0Ci0jZGVmaW5lIFBOU19UQUJMRV9FUlJPUiAgIC0xCisjZGVmaW5lIE5VTV9QTlNJTkZPVEFCIDQKKyNkZWZpbmUgUE5TX1RBQkxFX0VSUk9SIC0xCiAKIC8qIGRldGVjdGlvbiBhbGdvcml0aG0gZmxhZ3MgKi8KLSNkZWZpbmUgVVNFX1BPV0VSX0RJU1RSSUJVVElPTiAgICAgICAgICAgKDE8PDApCi0jZGVmaW5lIFVTRV9QU1lDSF9UT05BTElUWSAgICAgICAgICAgICAgICgxPDwxKQotI2RlZmluZSBVU0VfVE5TX0dBSU5fVEhSICAgICAgICAgICAgICAgICAoMTw8MikKLSNkZWZpbmUgVVNFX1ROU19QTlMgICAgICAgICAgICAgICAgICAgICAgKDE8PDMpCi0jZGVmaW5lIEpVU1RfTE9OR19XSU5ET1cgICAgICAgICAgICAgICAgICgxPDw0KQorI2RlZmluZSBVU0VfUE9XRVJfRElTVFJJQlVUSU9OICgxIDw8IDApCisjZGVmaW5lIFVTRV9QU1lDSF9UT05BTElUWSAoMSA8PCAxKQorI2RlZmluZSBVU0VfVE5TX0dBSU5fVEhSICgxIDw8IDIpCisjZGVmaW5lIFVTRV9UTlNfUE5TICgxIDw8IDMpCisjZGVmaW5lIEpVU1RfTE9OR19XSU5ET1cgKDEgPDwgNCkKIC8qIGFkZGl0aW9uYWwgYWxnb3JpdGhtIGZsYWdzICovCi0jZGVmaW5lIElTX0xPV19DT01MRVhJVFkgICAgICAgICAgICAgICAgICgxPDw1KQorI2RlZmluZSBJU19MT1dfQ09NUExFWElUWSAoMSA8PCA1KQogCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAvKiBQTlMgc3RhcnQgYmFuZCAqLwogICBzaG9ydCBzdGFydFNmYjsKIApAQCAtMTE2LDI2ICsxMjcsMjMgQEAKICAgVVNIT1JUIGRldGVjdGlvbkFsZ29yaXRobUZsYWdzOwogCiAgIC8qIFBhcmFtZXRlcnMgZm9yIGRldGVjdGlvbiAqLwotICBGSVhQX0RCTCAgcmVmUG93ZXI7Ci0gIEZJWFBfREJMICByZWZUb25hbGl0eTsKLSAgSU5UICAgICAgIHRuc0dhaW5UaHJlc2hvbGQ7Ci0gIElOVCAgICAgICB0bnNQTlNHYWluVGhyZXNob2xkOwotICBJTlQgICAgICAgbWluU2ZiV2lkdGg7Ci0gIEZJWFBfU0dMICBwb3dEaXN0UFNEY3VydmVbTUFYX0dST1VQRURfU0ZCXTsKLSAgRklYUF9TR0wgIGdhcEZpbGxUaHI7CisgIEZJWFBfREJMIHJlZlBvd2VyOworICBGSVhQX0RCTCByZWZUb25hbGl0eTsKKyAgSU5UIHRuc0dhaW5UaHJlc2hvbGQ7CisgIElOVCB0bnNQTlNHYWluVGhyZXNob2xkOworICBJTlQgbWluU2ZiV2lkdGg7CisgIEZJWFBfU0dMIHBvd0Rpc3RQU0RjdXJ2ZVtNQVhfR1JPVVBFRF9TRkJdOworICBGSVhQX1NHTCBnYXBGaWxsVGhyOwogfSBOT0lTRVBBUkFNUzsKIAotaW50IEZES2FhY0VuY19sb29rVXBQbnNVc2UgKGludCBiaXRSYXRlLCBpbnQgc2FtcGxlUmF0ZSwgaW50IG51bUNoYW4sIGNvbnN0IGludCBpc0xDKTsKK2ludCBGREthYWNFbmNfbG9va1VwUG5zVXNlKGludCBiaXRSYXRlLCBpbnQgc2FtcGxlUmF0ZSwgaW50IG51bUNoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaXNMQyk7CiAKIC8qKioqKiogRGVmaW5pdGlvbiBvZiBwcm90b3R5cGVzICoqKioqKi8KIAotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0dldFBuc1BhcmFtKE5PSVNFUEFSQU1TICpucCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBiaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgKnVzZVBucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBudW1DaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIGlzTEMpOworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0dldFBuc1BhcmFtKE5PSVNFUEFSQU1TICpucCwgSU5UIGJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsZVJhdGUsIElOVCBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpzZmJPZmZzZXQsIElOVCAqdXNlUG5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1DaGFuLCBjb25zdCBJTlQgaXNMQyk7CiAKLSNlbmRpZgorI2VuZGlmIC8qIFBOU1BBUkFNX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvcHJlX2VjaG9fY29udHJvbC5jcHAgYi9saWJBQUNlbmMvc3JjL3ByZV9lY2hvX2NvbnRyb2wuY3BwCmluZGV4IDNkZmQ4ZWQuLjNkNWQxNTMgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvcHJlX2VjaG9fY29udHJvbC5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9wcmVfZWNob19jb250cm9sLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw5MiArOTAsODcgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBQcmUgZWNobyBjb250cm9sCisgICBBdXRob3Iocyk6ICAgTS5XZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFByZSBlY2hvIGNvbnRyb2wKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInByZV9lY2hvX2NvbnRyb2wuaCIKICNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgogCi12b2lkIEZES2FhY0VuY19Jbml0UHJlRWNob0NvbnRyb2woRklYUF9EQkwgICAgKlJFU1RSSUNUIHBiVGhyZXNob2xkTm0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICpjYWxjUHJlRWNobywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgbnVtUGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKlJFU1RSSUNUIHNmYlBjbVF1YW50VGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICptZGN0U2NhbGVubTEpCi17Ci0gICptZGN0U2NhbGVubTEgPSBQQ01fUVVBTlRfVEhSX1NDQUxFPj4xOwordm9pZCBGREthYWNFbmNfSW5pdFByZUVjaG9Db250cm9sKEZJWFBfREJMICpSRVNUUklDVCBwYlRocmVzaG9sZE5tMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmNhbGNQcmVFY2hvLCBJTlQgbnVtUGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHNmYlBjbVF1YW50VGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbWRjdFNjYWxlbm0xKSB7CisgICptZGN0U2NhbGVubTEgPSBQQ01fUVVBTlRfVEhSX1NDQUxFID4+IDE7CiAKLSAgRkRLbWVtY3B5KHBiVGhyZXNob2xkTm0xLCBzZmJQY21RdWFudFRocmVzaG9sZCwgbnVtUGIqc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNweShwYlRocmVzaG9sZE5tMSwgc2ZiUGNtUXVhbnRUaHJlc2hvbGQsIG51bVBiICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKICAgKmNhbGNQcmVFY2hvID0gMTsKIH0KIAordm9pZCBGREthYWNFbmNfUHJlRWNob0NvbnRyb2woRklYUF9EQkwgKlJFU1RSSUNUIHBiVGhyZXNob2xkTm0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNhbGNQcmVFY2hvLCBJTlQgbnVtUGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgbWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBiVGhyZXNob2xkLCBJTlQgbWRjdFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICptZGN0U2NhbGVubTEpIHsKKyAgaW50IGk7CisgIEZJWFBfREJMIHRtcFRocmVzaG9sZDEsIHRtcFRocmVzaG9sZDI7CisgIGludCBzY2FsaW5nOwogCi12b2lkIEZES2FhY0VuY19QcmVFY2hvQ29udHJvbChGSVhQX0RCTCAgICpSRVNUUklDVCBwYlRocmVzaG9sZE5tMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIGNhbGNQcmVFY2hvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgbnVtUGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAgICBtaW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICpSRVNUUklDVCBwYlRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG1kY3RTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgKm1kY3RTY2FsZW5tMSkKLXsKLSAgICBpbnQgaTsKLSAgICBGSVhQX0RCTCB0bXBUaHJlc2hvbGQxLCB0bXBUaHJlc2hvbGQyOwotICAgIGludCBzY2FsaW5nOwotCi0JLyogSWYgbGFzdFdpbmRvd1NlcXVlbmNlIGluIHByZXZpb3VzIGZyYW1lIHdhcyBzdGFydC0gb3Igc3RvcC13aW5kb3csCi0JICAgc2tpcCBwcmVlY2hvY29udHJvbCBjYWxjdWxhdGlvbiAqLwotICAgIGlmIChjYWxjUHJlRWNobz09MCkgewotICAgICAgLyogY29weSB0aHJlc2hvbGRzIHRvIGludGVybmFsIG1lbW9yeSAqLwotICAgICAgRkRLbWVtY3B5KHBiVGhyZXNob2xkTm0xLCBwYlRocmVzaG9sZCwgbnVtUGIqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgICAqbWRjdFNjYWxlbm0xID0gbWRjdFNjYWxlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICggbWRjdFNjYWxlID4gKm1kY3RTY2FsZW5tMSApIHsKLSAgICAgICAgLyogaWYgY3VycmVudCB0aHJlc2hvbGRzIGFyZSBkb3duc2NhbGVkIG1vcmUgdGhhbiB0aGUgb25lcyBmcm9tIHRoZSBsYXN0IGJsb2NrICovCi0gICAgICAgIHNjYWxpbmcgPSAyKihtZGN0U2NhbGUtKm1kY3RTY2FsZW5tMSk7Ci0gICAgICAgIGZvcihpID0gMDsgaSA8IG51bVBiOyBpKyspIHsKLQotICAgICAgICAgICAgLyogbXVsdGlwbGljYXRpb24gd2l0aCByZXR1cm4gZGF0YSB0eXBlIGZyYWN0IGlzdCBlcXVpdmFsZW50IHRvIGludCBtdWx0aXBsaWNhdGlvbiAqLwotICAgICAgICAgICAgRkRLX0FTU0VSVChzY2FsaW5nPj0wKTsKLSAgICAgICAgICAgIHRtcFRocmVzaG9sZDEgPSBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IgKiAocGJUaHJlc2hvbGRObTFbaV0+PnNjYWxpbmcpOwotICAgICAgICAgICAgdG1wVGhyZXNob2xkMiA9IGZNdWx0KG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwgcGJUaHJlc2hvbGRbaV0pOwotCi0JCQlGSVhQX0RCTCB0bXAgPSBwYlRocmVzaG9sZFtpXTsKLQotICAgICAgICAgICAgLyogY29weSB0aHJlc2hvbGRzIHRvIGludGVybmFsIG1lbW9yeSAqLwotICAgICAgICAgICAgcGJUaHJlc2hvbGRObTFbaV0gPSB0bXA7Ci0KLSAgICAgICAgICAgIHRtcCA9IGZpeE1pbih0bXAsIHRtcFRocmVzaG9sZDEpOwotICAgICAgICAgICAgcGJUaHJlc2hvbGRbaV0gPSBmaXhNYXgodG1wLCB0bXBUaHJlc2hvbGQyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogaWYgdGhyZXNob2xkcyBvZiBsYXN0IGJsb2NrIGFyZSBtb3JlIGRvd25zY2FsZWQgdGhhbiB0aGUgY3VycmVudCBvbmVzICovCi0gICAgICAgIHNjYWxpbmcgPSAyKigqbWRjdFNjYWxlbm0xLW1kY3RTY2FsZSk7Ci0gICAgICAgIGZvcihpID0gMDsgaSA8IG51bVBiOyBpKyspIHsKLQotICAgICAgICAgICAgLyogbXVsdGlwbGljYXRpb24gd2l0aCByZXR1cm4gZGF0YSB0eXBlIGZyYWN0IGlzdCBlcXVpdmFsZW50IHRvIGludCBtdWx0aXBsaWNhdGlvbiAqLwotICAgICAgICAgICAgdG1wVGhyZXNob2xkMSA9IChtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3I+PjEpICogcGJUaHJlc2hvbGRObTFbaV07Ci0gICAgICAgICAgICB0bXBUaHJlc2hvbGQyID0gZk11bHQobWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yLCBwYlRocmVzaG9sZFtpXSk7Ci0KLSAgICAgICAgICAgIC8qIGNvcHkgdGhyZXNob2xkcyB0byBpbnRlcm5hbCBtZW1vcnkgKi8KLSAgICAgICAgICAgIHBiVGhyZXNob2xkTm0xW2ldID0gcGJUaHJlc2hvbGRbaV07Ci0KLSAgICAgICAgICAgIEZES19BU1NFUlQoc2NhbGluZz49MCk7Ci0gICAgICAgICAgICBpZigocGJUaHJlc2hvbGRbaV0+PihzY2FsaW5nKzEpKSA+IHRtcFRocmVzaG9sZDEpIHsKLSAgICAgICAgICAgICAgICBwYlRocmVzaG9sZFtpXSA9IHRtcFRocmVzaG9sZDE8PChzY2FsaW5nKzEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGJUaHJlc2hvbGRbaV0gPSBmaXhNYXgocGJUaHJlc2hvbGRbaV0sIHRtcFRocmVzaG9sZDIpOwotICAgICAgICB9Ci0gICAgfQotCisgIC8qIElmIGxhc3RXaW5kb3dTZXF1ZW5jZSBpbiBwcmV2aW91cyBmcmFtZSB3YXMgc3RhcnQtIG9yIHN0b3Atd2luZG93LAorICAgICBza2lwIHByZWVjaG9jb250cm9sIGNhbGN1bGF0aW9uICovCisgIGlmIChjYWxjUHJlRWNobyA9PSAwKSB7CisgICAgLyogY29weSB0aHJlc2hvbGRzIHRvIGludGVybmFsIG1lbW9yeSAqLworICAgIEZES21lbWNweShwYlRocmVzaG9sZE5tMSwgcGJUaHJlc2hvbGQsIG51bVBiICogc2l6ZW9mKEZJWFBfREJMKSk7CiAgICAgKm1kY3RTY2FsZW5tMSA9IG1kY3RTY2FsZTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAobWRjdFNjYWxlID4gKm1kY3RTY2FsZW5tMSkgeworICAgIC8qIGlmIGN1cnJlbnQgdGhyZXNob2xkcyBhcmUgZG93bnNjYWxlZCBtb3JlIHRoYW4gdGhlIG9uZXMgZnJvbSB0aGUgbGFzdAorICAgICAqIGJsb2NrICovCisgICAgc2NhbGluZyA9IDIgKiAobWRjdFNjYWxlIC0gKm1kY3RTY2FsZW5tMSk7CisgICAgZm9yIChpID0gMDsgaSA8IG51bVBiOyBpKyspIHsKKyAgICAgIC8qIG11bHRpcGxpY2F0aW9uIHdpdGggcmV0dXJuIGRhdGEgdHlwZSBmcmFjdCBpc3QgZXF1aXZhbGVudCB0byBpbnQKKyAgICAgICAqIG11bHRpcGxpY2F0aW9uICovCisgICAgICBGREtfQVNTRVJUKHNjYWxpbmcgPj0gMCk7CisgICAgICB0bXBUaHJlc2hvbGQxID0gbWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yICogKHBiVGhyZXNob2xkTm0xW2ldID4+IHNjYWxpbmcpOworICAgICAgdG1wVGhyZXNob2xkMiA9IGZNdWx0KG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwgcGJUaHJlc2hvbGRbaV0pOworCisgICAgICBGSVhQX0RCTCB0bXAgPSBwYlRocmVzaG9sZFtpXTsKKworICAgICAgLyogY29weSB0aHJlc2hvbGRzIHRvIGludGVybmFsIG1lbW9yeSAqLworICAgICAgcGJUaHJlc2hvbGRObTFbaV0gPSB0bXA7CisKKyAgICAgIHRtcCA9IGZpeE1pbih0bXAsIHRtcFRocmVzaG9sZDEpOworICAgICAgcGJUaHJlc2hvbGRbaV0gPSBmaXhNYXgodG1wLCB0bXBUaHJlc2hvbGQyKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogaWYgdGhyZXNob2xkcyBvZiBsYXN0IGJsb2NrIGFyZSBtb3JlIGRvd25zY2FsZWQgdGhhbiB0aGUgY3VycmVudCBvbmVzICovCisgICAgc2NhbGluZyA9IDIgKiAoKm1kY3RTY2FsZW5tMSAtIG1kY3RTY2FsZSk7CisgICAgZm9yIChpID0gMDsgaSA8IG51bVBiOyBpKyspIHsKKyAgICAgIC8qIG11bHRpcGxpY2F0aW9uIHdpdGggcmV0dXJuIGRhdGEgdHlwZSBmcmFjdCBpc3QgZXF1aXZhbGVudCB0byBpbnQKKyAgICAgICAqIG11bHRpcGxpY2F0aW9uICovCisgICAgICB0bXBUaHJlc2hvbGQxID0gKG1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciA+PiAxKSAqIHBiVGhyZXNob2xkTm0xW2ldOworICAgICAgdG1wVGhyZXNob2xkMiA9IGZNdWx0KG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwgcGJUaHJlc2hvbGRbaV0pOworCisgICAgICAvKiBjb3B5IHRocmVzaG9sZHMgdG8gaW50ZXJuYWwgbWVtb3J5ICovCisgICAgICBwYlRocmVzaG9sZE5tMVtpXSA9IHBiVGhyZXNob2xkW2ldOworCisgICAgICBGREtfQVNTRVJUKHNjYWxpbmcgPj0gMCk7CisgICAgICBpZiAoKHBiVGhyZXNob2xkW2ldID4+IChzY2FsaW5nICsgMSkpID4gdG1wVGhyZXNob2xkMSkgeworICAgICAgICBwYlRocmVzaG9sZFtpXSA9IHRtcFRocmVzaG9sZDEgPDwgKHNjYWxpbmcgKyAxKTsKKyAgICAgIH0KKyAgICAgIHBiVGhyZXNob2xkW2ldID0gZml4TWF4KHBiVGhyZXNob2xkW2ldLCB0bXBUaHJlc2hvbGQyKTsKKyAgICB9CisgIH0KKworICAqbWRjdFNjYWxlbm0xID0gbWRjdFNjYWxlOwogfQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9wcmVfZWNob19jb250cm9sLmggYi9saWJBQUNlbmMvc3JjL3ByZV9lY2hvX2NvbnRyb2wuaAppbmRleCA5MjI0ZGIwLi42ODhlZmRiIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL3ByZV9lY2hvX2NvbnRyb2wuaAorKysgYi9saWJBQUNlbmMvc3JjL3ByZV9lY2hvX2NvbnRyb2wuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzNiArOTAsMjkgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBQcmUgZWNobyBjb250cm9sCisgICBBdXRob3Iocyk6ICAgTS5XZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFByZSBlY2hvIGNvbnRyb2wKIAotI2lmbmRlZiBfX1BSRV9FQ0hPX0NPTlRST0xfSAotI2RlZmluZSBfX1BSRV9FQ0hPX0NPTlRST0xfSAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBQUkVfRUNIT19DT05UUk9MX0gKKyNkZWZpbmUgUFJFX0VDSE9fQ09OVFJPTF9ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKK3ZvaWQgRkRLYWFjRW5jX0luaXRQcmVFY2hvQ29udHJvbChGSVhQX0RCTCAqcGJUaHJlc2hvbGRubTEsIElOVCAqY2FsY1ByZUVjaG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bVBiLCBGSVhQX0RCTCAqc2ZiUGNtUXVhbnRUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICptZGN0U2NhbGVubTEpOwogCi12b2lkIEZES2FhY0VuY19Jbml0UHJlRWNob0NvbnRyb2woRklYUF9EQkwgICAgKnBiVGhyZXNob2xkbm0xLAotCQkJCQkJSU5UICAgICAgICAgKmNhbGNQcmVFY2hvLAotICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgbnVtUGIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqc2ZiUGNtUXVhbnRUaHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqbWRjdFNjYWxlbm0xKTsKLQotCi12b2lkIEZES2FhY0VuY19QcmVFY2hvQ29udHJvbChGSVhQX0RCTCAgICAqcGJUaHJlc2hvbGRObTEsCi0JCQkJCUlOVCAgICAgICAgIGNhbGNQcmVFY2hvLAotICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBudW1QYiwKLSAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgbWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAgICBtaW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpwYlRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgbWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAqbWRjdFNjYWxlbm0xKTsKK3ZvaWQgRkRLYWFjRW5jX1ByZUVjaG9Db250cm9sKEZJWFBfREJMICpwYlRocmVzaG9sZE5tMSwgSU5UIGNhbGNQcmVFY2hvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bVBiLCBJTlQgbWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgbWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBiVGhyZXNob2xkLCBJTlQgbWRjdFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICptZGN0U2NhbGVubTEpOwogCiAjZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9wc3lfY29uZmlndXJhdGlvbi5jcHAgYi9saWJBQUNlbmMvc3JjL3BzeV9jb25maWd1cmF0aW9uLmNwcAppbmRleCA5YTcyYzY4Li5lZWY5MGJjIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL3BzeV9jb25maWd1cmF0aW9uLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL3BzeV9jb25maWd1cmF0aW9uLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBQc3ljaG9hY2NvdXN0aWMgY29uZmlndXJhdGlvbgorICAgQXV0aG9yKHMpOiAgIE0uV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBQc3ljaG9hY2NvdXN0aWMgY29uZmlndXJhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJhZGpfdGhyLmgiCkBAIC05NiwxNSArMTA4LDE0IEBACiAKICNpbmNsdWRlICJGREtfdHJpZ0ZjdHMuaCIKIAotdHlwZWRlZiBzdHJ1Y3R7Ci0gICAgTE9ORyAgc2FtcGxlUmF0ZTsKLSAgICBjb25zdCBTRkJfUEFSQU1fTE9ORyAgKnBhcmFtTG9uZzsKLSAgICBjb25zdCBTRkJfUEFSQU1fU0hPUlQgKnBhcmFtU2hvcnQ7Ci19U0ZCX0lORk9fVEFCOwotCit0eXBlZGVmIHN0cnVjdCB7CisgIExPTkcgc2FtcGxlUmF0ZTsKKyAgY29uc3QgU0ZCX1BBUkFNX0xPTkcgKnBhcmFtTG9uZzsKKyAgY29uc3QgU0ZCX1BBUkFNX1NIT1JUICpwYXJhbVNob3J0OworfSBTRkJfSU5GT19UQUI7CiAKIHN0YXRpYyBjb25zdCBTRkJfSU5GT19UQUIgc2ZiSW5mb1RhYltdID0gewotICAgIHs4MDAwLCAgJnBfRkRLYWFjRW5jXzgwMDBfbG9uZ18xMDI0LCAgJnBfRkRLYWFjRW5jXzgwMDBfc2hvcnRfMTI4fSwKKyAgICB7ODAwMCwgJnBfRkRLYWFjRW5jXzgwMDBfbG9uZ18xMDI0LCAmcF9GREthYWNFbmNfODAwMF9zaG9ydF8xMjh9LAogICAgIHsxMTAyNSwgJnBfRkRLYWFjRW5jXzExMDI1X2xvbmdfMTAyNCwgJnBfRkRLYWFjRW5jXzExMDI1X3Nob3J0XzEyOH0sCiAgICAgezEyMDAwLCAmcF9GREthYWNFbmNfMTIwMDBfbG9uZ18xMDI0LCAmcF9GREthYWNFbmNfMTIwMDBfc2hvcnRfMTI4fSwKICAgICB7MTYwMDAsICZwX0ZES2FhY0VuY18xNjAwMF9sb25nXzEwMjQsICZwX0ZES2FhY0VuY18xNjAwMF9zaG9ydF8xMjh9LApAQCAtMTIxLDEwOCArMTMyLDgxIEBACiAKIC8qIDIyMDUwIGFuZCAyNDAwMCBIeiAqLwogc3RhdGljIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfMjIwNTBfbG9uZ181MTIgPSB7Ci0gICAgMzEsCi0gICAgeyAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKLSAgICAgICA0LCAgOCwgIDgsICA4LCAxMiwgMTIsIDEyLCAxNiwgMjAsIDI0LAotICAgICAgMjgsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCi0gICAgICAzMn0KLX07CisgICAgMzEsIHs0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDEyLCAxMiwKKyAgICAgICAgIDEyLCAxNiwgMjAsIDI0LCAyOCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzJ9fTsKIAogLyogMzIwMDAgSHogKi8KIHN0YXRpYyBjb25zdCBTRkJfUEFSQU1fTE9ORyBwXzMyMDAwX2xvbmdfNTEyID0gewogICAgIDM3LAotICAgIHsgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsCi0gICAgICAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsICA4LCAxMiwKLSAgICAgIDEyLCAxMiwgMTIsIDE2LCAxNiwgMTYsIDIwLCAyNCwgMjQsIDI4LAotICAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzJ9Ci19OworICAgIHs0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsIDgsCisgICAgIDEyLCAxMiwgMTIsIDEyLCAxNiwgMTYsIDE2LCAyMCwgMjQsIDI0LCAyOCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzJ9fTsKIAogLyogNDQxMDAgSHogKi8KIHN0YXRpYyBjb25zdCBTRkJfUEFSQU1fTE9ORyBwXzQ0MTAwX2xvbmdfNTEyID0gewotICAgIDM2LAotICAgIHs0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LAotICAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsICA4LAotICAgIDEyLCAxMiwgMTIsIDEyLCAxNiwgMjAsIDI0LCAyOCwgMzIsIDMyLAotICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgNTJ9Ci19OworICAgIDM2LCB7NCwgNCwgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwKKyAgICAgICAgIDgsIDgsIDEyLCAxMiwgMTIsIDEyLCAxNiwgMjAsIDI0LCAyOCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDUyfX07CiAKIHN0YXRpYyBjb25zdCBTRkJfSU5GT19UQUIgc2ZiSW5mb1RhYkxENTEyW10gPSB7Ci0gICAgeyA4MDAwLCAmcF8yMjA1MF9sb25nXzUxMiwgTlVMTH0sCi0gICAgezExMDI1LCAmcF8yMjA1MF9sb25nXzUxMiwgTlVMTH0sCi0gICAgezEyMDAwLCAmcF8yMjA1MF9sb25nXzUxMiwgTlVMTH0sCi0gICAgezE2MDAwLCAmcF8yMjA1MF9sb25nXzUxMiwgTlVMTH0sCi0gICAgezIyMDUwLCAmcF8yMjA1MF9sb25nXzUxMiwgTlVMTH0sCi0gICAgezI0MDAwLCAmcF8yMjA1MF9sb25nXzUxMiwgTlVMTH0sCi0gICAgezMyMDAwLCAmcF8zMjAwMF9sb25nXzUxMiwgTlVMTH0sCi0gICAgezQ0MTAwLCAmcF80NDEwMF9sb25nXzUxMiwgTlVMTH0sCi0gICAgezQ4MDAwLCAmcF80NDEwMF9sb25nXzUxMiwgTlVMTH0sCi0gICAgezY0MDAwLCAmcF80NDEwMF9sb25nXzUxMiwgTlVMTH0sCi0gICAgezg4MjAwLCAmcF80NDEwMF9sb25nXzUxMiwgTlVMTH0sCi0gICAgezk2MDAwLCAmcF80NDEwMF9sb25nXzUxMiwgTlVMTH0sCi0KKyAgICB7ODAwMCwgJnBfMjIwNTBfbG9uZ181MTIsIE5VTEx9LCAgIHsxMTAyNSwgJnBfMjIwNTBfbG9uZ181MTIsIE5VTEx9LAorICAgIHsxMjAwMCwgJnBfMjIwNTBfbG9uZ181MTIsIE5VTEx9LCAgezE2MDAwLCAmcF8yMjA1MF9sb25nXzUxMiwgTlVMTH0sCisgICAgezIyMDUwLCAmcF8yMjA1MF9sb25nXzUxMiwgTlVMTH0sICB7MjQwMDAsICZwXzIyMDUwX2xvbmdfNTEyLCBOVUxMfSwKKyAgICB7MzIwMDAsICZwXzMyMDAwX2xvbmdfNTEyLCBOVUxMfSwgIHs0NDEwMCwgJnBfNDQxMDBfbG9uZ181MTIsIE5VTEx9LAorICAgIHs0ODAwMCwgJnBfNDQxMDBfbG9uZ181MTIsIE5VTEx9LCAgezY0MDAwLCAmcF80NDEwMF9sb25nXzUxMiwgTlVMTH0sCisgICAgezg4MjAwLCAmcF80NDEwMF9sb25nXzUxMiwgTlVMTH0sICB7OTYwMDAsICZwXzQ0MTAwX2xvbmdfNTEyLCBOVUxMfSwKKyAgICB7MTI4MDAwLCAmcF80NDEwMF9sb25nXzUxMiwgTlVMTH0sIHsxNzY0MDAsICZwXzQ0MTAwX2xvbmdfNTEyLCBOVUxMfSwKKyAgICB7MTkyMDAwLCAmcF80NDEwMF9sb25nXzUxMiwgTlVMTH0sIHsyNTYwMDAsICZwXzQ0MTAwX2xvbmdfNTEyLCBOVUxMfSwKKyAgICB7MzUyODAwLCAmcF80NDEwMF9sb25nXzUxMiwgTlVMTH0sIHszODQwMDAsICZwXzQ0MTAwX2xvbmdfNTEyLCBOVUxMfSwKIH07CiAKLQogLyogMjIwNTAgYW5kIDI0MDAwIEh6ICovCiBzdGF0aWMgY29uc3QgU0ZCX1BBUkFNX0xPTkcgcF8yMjA1MF9sb25nXzQ4MCA9IHsKLSAgICAzMCwKLSAgICB7IDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsCi0gICAgICA0LCAgOCwgIDgsICA4LCAxMiwgMTIsIDEyLCAxNiwgMjAsIDI0LAotICAgICAyOCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMn0KLX07CisgICAgMzAsIHs0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDEyLAorICAgICAgICAgMTIsIDEyLCAxNiwgMjAsIDI0LCAyOCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMn19OwogCiAvKiAzMjAwMCBIeiAqLwogc3RhdGljIGNvbnN0IFNGQl9QQVJBTV9MT05HIHBfMzIwMDBfbG9uZ180ODAgPSB7Ci0gICAgMzcsCi0gICAgeyA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LAotICAgICAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwKLSAgICAgIDgsICA4LCAxMiwgMTIsIDEyLCAxNiwgMTYsIDIwLCAyNCwgMzIsCi0gICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyfQotfTsKKyAgICAzNywgezQsIDQsIDQsIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgOCwKKyAgICAgICAgIDgsIDgsIDgsIDEyLCAxMiwgMTIsIDE2LCAxNiwgMjAsIDI0LCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzJ9fTsKIAogLyogNDQxMDAgSHogKi8KIHN0YXRpYyBjb25zdCBTRkJfUEFSQU1fTE9ORyBwXzQ0MTAwX2xvbmdfNDgwID0gewotICAgIDM1LAotICAgIHsgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwKLSAgICAgIDQsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsICA4LCAgOCwgMTIsCi0gICAgIDEyLCAxMiwgMTIsIDEyLCAxNiwgMTYsIDI0LCAyOCwgMzIsIDMyLAotICAgICAzMiwgMzIsIDMyLCAzMiwgNDh9Ci19OworICAgIDM1LCB7NCwgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgOCwKKyAgICAgICAgIDgsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTYsIDE2LCAyNCwgMjgsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDQ4fX07CiAKIHN0YXRpYyBjb25zdCBTRkJfSU5GT19UQUIgc2ZiSW5mb1RhYkxENDgwW10gPSB7Ci0gICAgeyA4MDAwLCAmcF8yMjA1MF9sb25nXzQ4MCwgTlVMTH0sCi0gICAgezExMDI1LCAmcF8yMjA1MF9sb25nXzQ4MCwgTlVMTH0sCi0gICAgezEyMDAwLCAmcF8yMjA1MF9sb25nXzQ4MCwgTlVMTH0sCi0gICAgezE2MDAwLCAmcF8yMjA1MF9sb25nXzQ4MCwgTlVMTH0sCi0gICAgezIyMDUwLCAmcF8yMjA1MF9sb25nXzQ4MCwgTlVMTH0sCi0gICAgezI0MDAwLCAmcF8yMjA1MF9sb25nXzQ4MCwgTlVMTH0sCi0gICAgezMyMDAwLCAmcF8zMjAwMF9sb25nXzQ4MCwgTlVMTH0sCi0gICAgezQ0MTAwLCAmcF80NDEwMF9sb25nXzQ4MCwgTlVMTH0sCi0gICAgezQ4MDAwLCAmcF80NDEwMF9sb25nXzQ4MCwgTlVMTH0sCi0gICAgezY0MDAwLCAmcF80NDEwMF9sb25nXzQ4MCwgTlVMTH0sCi0gICAgezg4MjAwLCAmcF80NDEwMF9sb25nXzQ4MCwgTlVMTH0sCi0gICAgezk2MDAwLCAmcF80NDEwMF9sb25nXzQ4MCwgTlVMTH0sCi0KKyAgICB7ODAwMCwgJnBfMjIwNTBfbG9uZ180ODAsIE5VTEx9LCAgIHsxMTAyNSwgJnBfMjIwNTBfbG9uZ180ODAsIE5VTEx9LAorICAgIHsxMjAwMCwgJnBfMjIwNTBfbG9uZ180ODAsIE5VTEx9LCAgezE2MDAwLCAmcF8yMjA1MF9sb25nXzQ4MCwgTlVMTH0sCisgICAgezIyMDUwLCAmcF8yMjA1MF9sb25nXzQ4MCwgTlVMTH0sICB7MjQwMDAsICZwXzIyMDUwX2xvbmdfNDgwLCBOVUxMfSwKKyAgICB7MzIwMDAsICZwXzMyMDAwX2xvbmdfNDgwLCBOVUxMfSwgIHs0NDEwMCwgJnBfNDQxMDBfbG9uZ180ODAsIE5VTEx9LAorICAgIHs0ODAwMCwgJnBfNDQxMDBfbG9uZ180ODAsIE5VTEx9LCAgezY0MDAwLCAmcF80NDEwMF9sb25nXzQ4MCwgTlVMTH0sCisgICAgezg4MjAwLCAmcF80NDEwMF9sb25nXzQ4MCwgTlVMTH0sICB7OTYwMDAsICZwXzQ0MTAwX2xvbmdfNDgwLCBOVUxMfSwKKyAgICB7MTI4MDAwLCAmcF80NDEwMF9sb25nXzQ4MCwgTlVMTH0sIHsxNzY0MDAsICZwXzQ0MTAwX2xvbmdfNDgwLCBOVUxMfSwKKyAgICB7MTkyMDAwLCAmcF80NDEwMF9sb25nXzQ4MCwgTlVMTH0sIHsyNTYwMDAsICZwXzQ0MTAwX2xvbmdfNDgwLCBOVUxMfSwKKyAgICB7MzUyODAwLCAmcF80NDEwMF9sb25nXzQ4MCwgTlVMTH0sIHszODQwMDAsICZwXzQ0MTAwX2xvbmdfNDgwLCBOVUxMfSwKIH07CiAKIC8qIEZpeGVkIHBvaW50IHByZWNpc2lvbiBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBRX0JBUkNWQUwgICAgICAgICgyNSkKKyNkZWZpbmUgUV9CQVJDVkFMICgyNSkKIAotc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19pbml0U2ZiVGFibGUoTE9ORyBzYW1wbGVSYXRlLCBJTlQgYmxvY2tUeXBlLCBJTlQgZ3JhbnVsZUxlbmd0aCwgSU5UICpzZmJPZmZzZXQsIElOVCAqc2ZiQ250KQotewotICBJTlQgIGksIHNwZWNTdGFydE9mZnNldCA9IDA7Ci0gIGNvbnN0IFVDSEFSKiBzZmJXaWR0aCA9IE5VTEw7CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfaW5pdFNmYlRhYmxlKGNvbnN0IExPTkcgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGJsb2NrVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGdyYW51bGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqY29uc3Qgc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmNvbnN0IHNmYkNudCkgeworICBJTlQgaSwgc3BlY1N0YXJ0T2Zmc2V0ID0gMDsKKyAgSU5UIGdyYW51bGVMZW5ndGhXaW5kb3cgPSBncmFudWxlTGVuZ3RoOworICBjb25zdCBVQ0hBUiAqc2ZiV2lkdGggPSBOVUxMOwogICBjb25zdCBTRkJfSU5GT19UQUIgKnNmYkluZm8gPSBOVUxMOwogICBpbnQgc2l6ZTsKIAogICAvKgogICAgIHNlbGVjdCB0YWJsZQogICAqLwotICBzd2l0Y2goZ3JhbnVsZUxlbmd0aCkgeworICBzd2l0Y2ggKGdyYW51bGVMZW5ndGgpIHsKICAgICBjYXNlIDEwMjQ6Ci0gICAgY2FzZSAgOTYwOgorICAgIGNhc2UgOTYwOgogICAgICAgc2ZiSW5mbyA9IHNmYkluZm9UYWI7Ci0gICAgICBzaXplID0gKElOVCkoc2l6ZW9mKHNmYkluZm9UYWIpL3NpemVvZihTRkJfSU5GT19UQUIpKTsKKyAgICAgIHNpemUgPSAoSU5UKShzaXplb2Yoc2ZiSW5mb1RhYikgLyBzaXplb2YoU0ZCX0lORk9fVEFCKSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIDUxMjoKICAgICAgIHNmYkluZm8gPSBzZmJJbmZvVGFiTEQ1MTI7CkBAIC0yMzYsMjAgKzIyMCwyMCBAQAogICAgICAgcmV0dXJuIEFBQ19FTkNfSU5WQUxJRF9GUkFNRV9MRU5HVEg7CiAgIH0KIAotICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspewotICAgIGlmKHNmYkluZm9baV0uc2FtcGxlUmF0ZSA9PSBzYW1wbGVSYXRlKXsKLSAgICAgIHN3aXRjaChibG9ja1R5cGUpewotICAgICAgY2FzZSBMT05HX1dJTkRPVzoKLSAgICAgIGNhc2UgU1RBUlRfV0lORE9XOgotICAgICAgY2FzZSBTVE9QX1dJTkRPVzoKLSAgICAgICAgc2ZiV2lkdGggPSBzZmJJbmZvW2ldLnBhcmFtTG9uZy0+c2ZiV2lkdGg7Ci0gICAgICAgICpzZmJDbnQgID0gc2ZiSW5mb1tpXS5wYXJhbUxvbmctPnNmYkNudDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNIT1JUX1dJTkRPVzoKLSAgICAgICAgc2ZiV2lkdGggPSBzZmJJbmZvW2ldLnBhcmFtU2hvcnQtPnNmYldpZHRoOwotICAgICAgICAqc2ZiQ250ICA9IHNmYkluZm9baV0ucGFyYW1TaG9ydC0+c2ZiQ250OwotICAgICAgICBncmFudWxlTGVuZ3RoIC89IFRSQU5TX0ZBQzsKLSAgICAgICAgYnJlYWs7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBpZiAoc2ZiSW5mb1tpXS5zYW1wbGVSYXRlID09IHNhbXBsZVJhdGUpIHsKKyAgICAgIHN3aXRjaCAoYmxvY2tUeXBlKSB7CisgICAgICAgIGNhc2UgTE9OR19XSU5ET1c6CisgICAgICAgIGNhc2UgU1RBUlRfV0lORE9XOgorICAgICAgICBjYXNlIFNUT1BfV0lORE9XOgorICAgICAgICAgIHNmYldpZHRoID0gc2ZiSW5mb1tpXS5wYXJhbUxvbmctPnNmYldpZHRoOworICAgICAgICAgICpzZmJDbnQgPSBzZmJJbmZvW2ldLnBhcmFtTG9uZy0+c2ZiQ250OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNIT1JUX1dJTkRPVzoKKyAgICAgICAgICBzZmJXaWR0aCA9IHNmYkluZm9baV0ucGFyYW1TaG9ydC0+c2ZiV2lkdGg7CisgICAgICAgICAgKnNmYkNudCA9IHNmYkluZm9baV0ucGFyYW1TaG9ydC0+c2ZiQ250OworICAgICAgICAgIGdyYW51bGVMZW5ndGhXaW5kb3cgLz0gVFJBTlNfRkFDOworICAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMjYxLDIxICsyNDUsMTkgQEAKICAgLyoKICAgICBjYWxjIHNmYiBvZmZzZXRzCiAgICovCi0gIGZvcihpID0gMDsgaSA8ICpzZmJDbnQ7IGkrKyl7Ci0gICAgICBzZmJPZmZzZXRbaV0gPSBzcGVjU3RhcnRPZmZzZXQ7Ci0gICAgICBzcGVjU3RhcnRPZmZzZXQgKz0gc2ZiV2lkdGhbaV07Ci0gICAgICBpZiAoc3BlY1N0YXJ0T2Zmc2V0ID49IGdyYW51bGVMZW5ndGgpIHsKLSAgICAgICAgICBpKys7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9CisgIGZvciAoaSA9IDA7IGkgPCAqc2ZiQ250OyBpKyspIHsKKyAgICBzZmJPZmZzZXRbaV0gPSBzcGVjU3RhcnRPZmZzZXQ7CisgICAgc3BlY1N0YXJ0T2Zmc2V0ICs9IHNmYldpZHRoW2ldOworICAgIGlmIChzcGVjU3RhcnRPZmZzZXQgPj0gZ3JhbnVsZUxlbmd0aFdpbmRvdykgeworICAgICAgaSsrOworICAgICAgYnJlYWs7CisgICAgfQogICB9Ci0gICpzZmJDbnQgPSBmaXhNaW4oaSwqc2ZiQ250KTsKLSAgc2ZiT2Zmc2V0WypzZmJDbnRdID0gZml4TWluKHNwZWNTdGFydE9mZnNldCxncmFudWxlTGVuZ3RoKTsKLQorICAqc2ZiQ250ID0gZml4TWluKGksICpzZmJDbnQpOworICBzZmJPZmZzZXRbKnNmYkNudF0gPSBmaXhNaW4oc3BlY1N0YXJ0T2Zmc2V0LCBncmFudWxlTGVuZ3RoV2luZG93KTsKICAgcmV0dXJuIEFBQ19FTkNfT0s7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19CYXJjTGluZVZhbHVlCkBAIC0yODUsNTEgKzI2Nyw1MyBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX0JhcmNMaW5lVmFsdWUoSU5UIG5vT2ZMaW5lcywgSU5UIGZmdExpbmUsIExPTkcgc2FtcGxpbmdGcmVxKQoteworc3RhdGljIEZJWFBfREJMIEZES2FhY0VuY19CYXJjTGluZVZhbHVlKElOVCBub09mTGluZXMsIElOVCBmZnRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkcgc2FtcGxpbmdGcmVxKSB7CisgIEZJWFBfREJMIEZPVVJCWTNFTTQgPSAoRklYUF9EQkwpMHg0NWU3YjI3MzsgLyogNC4wLzMgKiAwLjAwMDEgaW4gcTQzICovCisgIEZJWFBfREJMIFBaWlo3NiA9IChGSVhQX0RCTCkweDYzOWQ1ZTRhOyAgICAgLyogMC4wMDA3NiBpbiBxNDEgKi8KKyAgRklYUF9EQkwgT05FM1AzID0gKEZJWFBfREJMKTB4MzUzMzMzMzM7ICAgICAvKiAxMy4zIGluIHEyNiAqLworICBGSVhQX0RCTCBUSFJFRVA1ID0gKEZJWFBfREJMKTB4MWMwMDAwMDA7ICAgIC8qIDMuNSBpbiBxMjcgKi8KKyAgRklYUF9EQkwgSU5WNDgwID0gKEZJWFBfREJMKTB4NDQ0NDQ0NDQ7ICAgICAvLyAxLzQ4MCBpbiBxMzkKIAotICAgIEZJWFBfREJMIEZPVVJCWTNFTTQgICAgID0gKEZJWFBfREJMKTB4NDVlN2IyNzM7IC8qIDQuMC8zICogMC4wMDAxIGluIHE0MyAqLwotICAgIEZJWFBfREJMIFBaWlo3NiAgICAgICAgID0gKEZJWFBfREJMKTB4NjM5ZDVlNGE7IC8qIDAuMDAwNzYgaW4gcTQxICovCi0gICAgRklYUF9EQkwgT05FM1AzICAgICAgICAgPSAoRklYUF9EQkwpMHgzNTMzMzMzMzsgLyogMTMuMyBpbiBxMjYgKi8KLSAgICBGSVhQX0RCTCBUSFJFRVA1ICAgICAgICA9IChGSVhQX0RCTCkweDFjMDAwMDAwOyAvKiAzLjUgaW4gcTI3ICovCi0gICAgRklYUF9EQkwgSU5WNDgwICAgICAgICAgPSAoRklYUF9EQkwpMHg0NDQ0NDQ0NDsgLy8gMS80ODAgaW4gcTM5CisgIEZJWFBfREJMIGNlbnRlcl9mcmVxLCB4MSwgeDI7CisgIEZJWFBfREJMIGJ2YWxGRlRMaW5lLCBhdGFuMSwgYXRhbjI7CiAKLSAgICBGSVhQX0RCTCBjZW50ZXJfZnJlcSwgeDEsIHgyOwotICAgIEZJWFBfREJMIGJ2YWxGRlRMaW5lLCBhdGFuMSwgYXRhbjI7CisgIC8qIFRoZW9yaXRpY2FsIG1heGltdW0gb2YgY2VudGVyX2ZyZXEgKHNhbXBfZnJlcSowLjUpIGlzIDk2a2h6ICogMC41ID0gNDgwMDAKKyAgICovCisgIC8qIFRoZW9yaXRpY2FsIG1heGltdW0gb2YgeDEgaXMgMS4zMzMzMzMzZS00ZiAqIGNlbnRlcl9mcmVxID0gNi40LCBjYW4ga2VlcCBpbgorICAgKiBxMjggICovCisgIC8qIFRoZW9yaXRpY2FsIG1heGltdW0gb2YgeDIgaXMgMC4wMDA3NmYgKiBjZW50ZXJfZnJlcSA9IDM2LjQ4LCBjYW4ga2VlcCBpbgorICAgKiBxMjUgICAgICovCiAKLSAgICAvKiBUaGVvcml0aWNhbCBtYXhpbXVtIG9mIGNlbnRlcl9mcmVxIChzYW1wX2ZyZXEqMC41KSBpcyA5NmtoeiAqIDAuNSA9IDQ4MDAwICAgICAgICAqLwotICAgIC8qIFRoZW9yaXRpY2FsIG1heGltdW0gb2YgeDEgaXMgMS4zMzMzMzMzZS00ZiAqIGNlbnRlcl9mcmVxID0gNi40LCBjYW4ga2VlcCBpbiBxMjggICovCi0gICAgLyogVGhlb3JpdGljYWwgbWF4aW11bSBvZiB4MiBpcyAwLjAwMDc2ZiAqIGNlbnRlcl9mcmVxID0gMzYuNDgsIGNhbiBrZWVwIGluIHEyNSAgICAgKi8KKyAgY2VudGVyX2ZyZXEgPSBmZnRMaW5lICogc2FtcGxpbmdGcmVxOyAvKiBxMTEgb3IgcTggKi8KIAotICAgIGNlbnRlcl9mcmVxID0gZmZ0TGluZSAqIHNhbXBsaW5nRnJlcTsgICAgICAgLyogcTExIG9yIHE4ICovCisgIHN3aXRjaCAobm9PZkxpbmVzKSB7CisgICAgY2FzZSAxMDI0OgorICAgICAgY2VudGVyX2ZyZXEgPSBjZW50ZXJfZnJlcSA8PCAyOyAvKiBxMTMgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI4OgorICAgICAgY2VudGVyX2ZyZXEgPSBjZW50ZXJfZnJlcSA8PCA1OyAvKiBxMTMgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgNTEyOgorICAgICAgY2VudGVyX2ZyZXEgPSAoZmZ0TGluZSAqIHNhbXBsaW5nRnJlcSkgPDwgMzsgIC8vIHExMworICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODA6CisgICAgICBjZW50ZXJfZnJlcSA9IGZNdWx0KGNlbnRlcl9mcmVxLCBJTlY0ODApIDw8IDQ7ICAvLyBxMTMKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBjZW50ZXJfZnJlcSA9IChGSVhQX0RCTCkwOworICB9CiAKLSAgICBzd2l0Y2ggKG5vT2ZMaW5lcykgewotICAgICAgY2FzZSAxMDI0OgotICAgICAgICBjZW50ZXJfZnJlcSA9IGNlbnRlcl9mcmVxIDw8IDI7IC8qIHExMyAqLwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTI4OgotICAgICAgICBjZW50ZXJfZnJlcSA9IGNlbnRlcl9mcmVxIDw8IDU7IC8qIHExMyAqLwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNTEyOgotICAgICAgICBjZW50ZXJfZnJlcSA9IChmZnRMaW5lICogc2FtcGxpbmdGcmVxKSA8PCAzOyAgIC8vIHExMwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNDgwOgotICAgICAgICBjZW50ZXJfZnJlcSA9IGZNdWx0KGNlbnRlcl9mcmVxLCBJTlY0ODApIDw8IDQ7IC8vIHExMwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGNlbnRlcl9mcmVxID0gKEZJWFBfREJMKTA7Ci0gICAgfQorICB4MSA9IGZNdWx0KGNlbnRlcl9mcmVxLCBGT1VSQlkzRU00KTsgLyogcTEzICogcTQzIC0gKERGUkFDVF9CSVRTLTEpID0gcTI1ICovCisgIHgyID0gZk11bHQoY2VudGVyX2ZyZXEsIFBaWlo3NikKKyAgICAgICA8PCAyOyAvKiBxMTMgKiBxNDEgLSAoREZSQUNUX0JJVFMtMSkgKyAyID0gcTI1ICovCiAKLSAgICB4MSA9IGZNdWx0KGNlbnRlcl9mcmVxLCBGT1VSQlkzRU00KTsgICAgICAgIC8qIHExMyAqIHE0MyAtIChERlJBQ1RfQklUUy0xKSA9IHEyNSAqLwotICAgIHgyID0gZk11bHQoY2VudGVyX2ZyZXEsIFBaWlo3NikgPDwgMjsgICAgICAgLyogcTEzICogcTQxIC0gKERGUkFDVF9CSVRTLTEpICsgMiA9IHEyNSAqLworICBhdGFuMSA9IGZpeHBfYXRhbih4MSk7CisgIGF0YW4yID0gZml4cF9hdGFuKHgyKTsKIAotICAgIGF0YW4xID0gZml4cF9hdGFuKHgxKTsKLSAgICBhdGFuMiA9IGZpeHBfYXRhbih4Mik7Ci0KLSAgICAvKiBxMjUgKHEyNiAqIHEzMCAtIChERlJBQ1RfQklUUy0xKSkgKyBxMjUgKHEyNyAqIHEzMCAqIHEzMCkgKi8KLSAgICBidmFsRkZUTGluZSA9IGZNdWx0KE9ORTNQMywgYXRhbjIpICsgZk11bHQoVEhSRUVQNSwgZk11bHQoYXRhbjEsIGF0YW4xKSk7Ci0gICAgcmV0dXJuKGJ2YWxGRlRMaW5lKTsKLQorICAvKiBxMjUgKHEyNiAqIHEzMCAtIChERlJBQ1RfQklUUy0xKSkgKyBxMjUgKHEyNyAqIHEzMCAqIHEzMCkgKi8KKyAgYnZhbEZGVExpbmUgPSBmTXVsdChPTkUzUDMsIGF0YW4yKSArIGZNdWx0KFRIUkVFUDUsIGZNdWx0KGF0YW4xLCBhdGFuMSkpOworICByZXR1cm4gKGJ2YWxGRlRMaW5lKTsKIH0KIAogLyoKQEAgLTMzOCwzMjAgKzMyMiwzMDYgQEAKICAgIG1pZ2h0IG5lZWQgdG8gYmUgY29uZmlndXJhYmxlIHRvIGUuZy4gMjQgYml0IFBDTSBJbnB1dCBvciBhIGxvd2VyCiAgICByZXNvbHV0aW9uIGZvciBsb3cgYml0IHJhdGVzCiAqLwotc3RhdGljIHZvaWQgRkRLYWFjRW5jX0luaXRNaW5QQ01SZXNvbHV0aW9uKGludCAgIG51bVBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgKnBiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNmYlBDTXF1YW50VGhyZXNob2xkKQotewotICAvKiBQQ01fUVVBTlRfTk9JU0UgPSBGREtwb3coMTAuMGYsIC0gMjAuZiAvIDEwLjBmKSAqIEFCU19MT1cgKiBOT1JNX1BDTV9FTkVSR1kgKiBGREtwb3coMixQQ01fUVVBTlRfVEhSX1NDQUxFKSAqLwotICAjZGVmaW5lIFBDTV9RVUFOVF9OT0lTRSAgKChGSVhQX0RCTCkweDAwNTQ3MDYyKQorc3RhdGljIHZvaWQgRkRLYWFjRW5jX0luaXRNaW5QQ01SZXNvbHV0aW9uKGludCBudW1QYiwgaW50ICpwYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiUENNcXVhbnRUaHJlc2hvbGQpIHsKKy8qIFBDTV9RVUFOVF9OT0lTRSA9IEZES3BvdygxMC4wZiwgLSAyMC5mIC8gMTAuMGYpICogQUJTX0xPVyAqIE5PUk1fUENNX0VORVJHWSAqCisgKiBGREtwb3coMixQQ01fUVVBTlRfVEhSX1NDQUxFKSAqLworI2RlZmluZSBQQ01fUVVBTlRfTk9JU0UgKChGSVhQX0RCTCkweDAwNTQ3MDYyKQogCi0gIGZvciggaW50IGkgPSAwOyBpIDwgbnVtUGI7IGkrKyApIHsKLSAgICBzZmJQQ01xdWFudFRocmVzaG9sZFtpXSA9IChwYk9mZnNldFtpKzFdIC0gcGJPZmZzZXRbaV0pICogUENNX1FVQU5UX05PSVNFOworICBmb3IgKGludCBpID0gMDsgaSA8IG51bVBiOyBpKyspIHsKKyAgICBzZmJQQ01xdWFudFRocmVzaG9sZFtpXSA9IChwYk9mZnNldFtpICsgMV0gLSBwYk9mZnNldFtpXSkgKiBQQ01fUVVBTlRfTk9JU0U7CiAgIH0KIH0KIAotc3RhdGljIEZJWFBfREJMIGdldE1hc2tGYWN0b3IoCi0gICAgICAgIGNvbnN0IEZJWFBfREJMIGRiVmFsX2ZpeCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgZGJWYWxfZSwKLSAgICAgICAgY29uc3QgRklYUF9EQkwgdGVuX2ZpeCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgdGVuX2UKLSAgICAgICAgKQotewotICAgIElOVCBxX21zazsKLSAgICBGSVhQX0RCTCBtYXNrX2ZhY3RvcjsKK3N0YXRpYyBGSVhQX0RCTCBnZXRNYXNrRmFjdG9yKGNvbnN0IEZJWFBfREJMIGRiVmFsX2ZpeCwgY29uc3QgSU5UIGRiVmFsX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCB0ZW5fZml4LCBjb25zdCBJTlQgdGVuX2UpIHsKKyAgSU5UIHFfbXNrOworICBGSVhQX0RCTCBtYXNrX2ZhY3RvcjsKIAotICAgIG1hc2tfZmFjdG9yID0gZlBvdyh0ZW5fZml4LCBERlJBQ1RfQklUUy0xLXRlbl9lLCAtZGJWYWxfZml4LCBERlJBQ1RfQklUUy0xLWRiVmFsX2UsICZxX21zayk7Ci0gICAgcV9tc2sgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSxmaXhNYXgoLShERlJBQ1RfQklUUy0xKSxxX21zaykpOworICBtYXNrX2ZhY3RvciA9IGZQb3codGVuX2ZpeCwgREZSQUNUX0JJVFMgLSAxIC0gdGVuX2UsIC1kYlZhbF9maXgsCisgICAgICAgICAgICAgICAgICAgICBERlJBQ1RfQklUUyAtIDEgLSBkYlZhbF9lLCAmcV9tc2spOworICBxX21zayA9IGZpeE1pbihERlJBQ1RfQklUUyAtIDEsIGZpeE1heCgtKERGUkFDVF9CSVRTIC0gMSksIHFfbXNrKSk7CiAKLSAgICBpZiAoIChxX21zaz4wKSAmJiAobWFza19mYWN0b3I+KEZJWFBfREJMKU1BWFZBTF9EQkw+PnFfbXNrKSApIHsKLSAgICAgIG1hc2tfZmFjdG9yID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgbWFza19mYWN0b3IgPSBzY2FsZVZhbHVlKG1hc2tfZmFjdG9yLCBxX21zayk7Ci0gICAgfQorICBpZiAoKHFfbXNrID4gMCkgJiYgKG1hc2tfZmFjdG9yID4gKEZJWFBfREJMKU1BWFZBTF9EQkwgPj4gcV9tc2spKSB7CisgICAgbWFza19mYWN0b3IgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKyAgfSBlbHNlIHsKKyAgICBtYXNrX2ZhY3RvciA9IHNjYWxlVmFsdWUobWFza19mYWN0b3IsIHFfbXNrKTsKKyAgfQogCi0gICAgcmV0dXJuIChtYXNrX2ZhY3Rvcik7CisgIHJldHVybiAobWFza19mYWN0b3IpOwogfQogCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfaW5pdFNwcmVhZGluZyhJTlQgbnVtUGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwYkJhcmNWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBiTWFza0xvRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcGJNYXNrSGlGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwYk1hc2tMb0ZhY3RvclNwckVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcGJNYXNrSGlGYWN0b3JTcHJFbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTE9ORyBiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYmxvY2tUeXBlKQorc3RhdGljIHZvaWQgRkRLYWFjRW5jX2luaXRTcHJlYWRpbmcoSU5UIG51bVBiLCBGSVhQX0RCTCAqcGJCYXJjVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcGJNYXNrTG9GYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcGJNYXNrSGlGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcGJNYXNrTG9GYWN0b3JTcHJFbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwYk1hc2tIaUZhY3RvclNwckVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTE9ORyBiaXRyYXRlLCBjb25zdCBJTlQgYmxvY2tUeXBlKQogCiB7Ci0gICAgSU5UIGk7Ci0gICAgRklYUF9EQkwgTUFTS0xPV1NQUkVOLCBNQVNLSElHSFNQUkVOOworICBJTlQgaTsKKyAgRklYUF9EQkwgTUFTS0xPV1NQUkVOLCBNQVNLSElHSFNQUkVOOwogCi0gICAgRklYUF9EQkwgTUFTS0hJR0ggICAgICAgICAgICAgICA9IChGSVhQX0RCTCkweDMwMDAwMDAwOyAvKiAxLjUgaW4gcTI5ICovCi0gICAgRklYUF9EQkwgTUFTS0xPVyAgICAgICAgICAgICAgICA9IChGSVhQX0RCTCkweDYwMDAwMDAwOyAvKiAzLjAgaW4gcTI5ICovCi0gICAgRklYUF9EQkwgTUFTS0xPV1NQUkVOTE9ORyAgICAgICA9IChGSVhQX0RCTCkweDYwMDAwMDAwOyAvKiAzLjAgaW4gcTI5ICovCi0gICAgRklYUF9EQkwgTUFTS0hJR0hTUFJFTkxPTkcgICAgICA9IChGSVhQX0RCTCkweDQwMDAwMDAwOyAvKiAyLjAgaW4gcTI5ICovCi0gICAgRklYUF9EQkwgTUFTS0hJR0hTUFJFTkxPTkdMT1dCUiA9IChGSVhQX0RCTCkweDMwMDAwMDAwOyAvKiAxLjUgaW4gcTI5ICovCi0gICAgRklYUF9EQkwgTUFTS0xPV1NQUkVOU0hPUlQgICAgICA9IChGSVhQX0RCTCkweDQwMDAwMDAwOyAvKiAyLjAgaW4gcTI5ICovCi0gICAgRklYUF9EQkwgTUFTS0hJR0hTUFJFTlNIT1JUICAgICA9IChGSVhQX0RCTCkweDMwMDAwMDAwOyAvKiAxLjUgaW4gcTI5ICovCi0gICAgRklYUF9EQkwgVEVOICAgICAgICAgICAgICAgICAgICA9IChGSVhQX0RCTCkweDUwMDAwMDAwOyAvKiAxMC4wIGluIHEyNyAqLworICBGSVhQX0RCTCBNQVNLSElHSCA9IChGSVhQX0RCTCkweDMwMDAwMDAwOyAgICAgICAgICAgICAgIC8qIDEuNSBpbiBxMjkgKi8KKyAgRklYUF9EQkwgTUFTS0xPVyA9IChGSVhQX0RCTCkweDYwMDAwMDAwOyAgICAgICAgICAgICAgICAvKiAzLjAgaW4gcTI5ICovCisgIEZJWFBfREJMIE1BU0tMT1dTUFJFTkxPTkcgPSAoRklYUF9EQkwpMHg2MDAwMDAwMDsgICAgICAgLyogMy4wIGluIHEyOSAqLworICBGSVhQX0RCTCBNQVNLSElHSFNQUkVOTE9ORyA9IChGSVhQX0RCTCkweDQwMDAwMDAwOyAgICAgIC8qIDIuMCBpbiBxMjkgKi8KKyAgRklYUF9EQkwgTUFTS0hJR0hTUFJFTkxPTkdMT1dCUiA9IChGSVhQX0RCTCkweDMwMDAwMDAwOyAvKiAxLjUgaW4gcTI5ICovCisgIEZJWFBfREJMIE1BU0tMT1dTUFJFTlNIT1JUID0gKEZJWFBfREJMKTB4NDAwMDAwMDA7ICAgICAgLyogMi4wIGluIHEyOSAqLworICBGSVhQX0RCTCBNQVNLSElHSFNQUkVOU0hPUlQgPSAoRklYUF9EQkwpMHgzMDAwMDAwMDsgICAgIC8qIDEuNSBpbiBxMjkgKi8KKyAgRklYUF9EQkwgVEVOID0gKEZJWFBfREJMKTB4NTAwMDAwMDA7ICAgICAgICAgICAgICAgICAgICAvKiAxMC4wIGluIHEyNyAqLwogCi0gICAgaWYgKGJsb2NrVHlwZSAhPSBTSE9SVF9XSU5ET1cpCi0gICAgewotICAgICAgICBNQVNLTE9XU1BSRU4gPSBNQVNLTE9XU1BSRU5MT05HOwotICAgICAgICBNQVNLSElHSFNQUkVOID0gKGJpdHJhdGU+MjAwMDApP01BU0tISUdIU1BSRU5MT05HOk1BU0tISUdIU1BSRU5MT05HTE9XQlI7CisgIGlmIChibG9ja1R5cGUgIT0gU0hPUlRfV0lORE9XKSB7CisgICAgTUFTS0xPV1NQUkVOID0gTUFTS0xPV1NQUkVOTE9ORzsKKyAgICBNQVNLSElHSFNQUkVOID0KKyAgICAgICAgKGJpdHJhdGUgPiAyMDAwMCkgPyBNQVNLSElHSFNQUkVOTE9ORyA6IE1BU0tISUdIU1BSRU5MT05HTE9XQlI7CisgIH0gZWxzZSB7CisgICAgTUFTS0xPV1NQUkVOID0gTUFTS0xPV1NQUkVOU0hPUlQ7CisgICAgTUFTS0hJR0hTUFJFTiA9IE1BU0tISUdIU1BSRU5TSE9SVDsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBudW1QYjsgaSsrKSB7CisgICAgaWYgKGkgPiAwKSB7CisgICAgICBwYk1hc2tIaUZhY3RvcltpXSA9IGdldE1hc2tGYWN0b3IoCisgICAgICAgICAgZk11bHQoTUFTS0hJR0gsIChwYkJhcmNWYWx1ZVtpXSAtIHBiQmFyY1ZhbHVlW2kgLSAxXSkpLCAyMywgVEVOLCAyNyk7CisKKyAgICAgIHBiTWFza0xvRmFjdG9yW2kgLSAxXSA9IGdldE1hc2tGYWN0b3IoCisgICAgICAgICAgZk11bHQoTUFTS0xPVywgKHBiQmFyY1ZhbHVlW2ldIC0gcGJCYXJjVmFsdWVbaSAtIDFdKSksIDIzLCBURU4sIDI3KTsKKworICAgICAgcGJNYXNrSGlGYWN0b3JTcHJFbltpXSA9IGdldE1hc2tGYWN0b3IoCisgICAgICAgICAgZk11bHQoTUFTS0hJR0hTUFJFTiwgKHBiQmFyY1ZhbHVlW2ldIC0gcGJCYXJjVmFsdWVbaSAtIDFdKSksIDIzLCBURU4sCisgICAgICAgICAgMjcpOworCisgICAgICBwYk1hc2tMb0ZhY3RvclNwckVuW2kgLSAxXSA9IGdldE1hc2tGYWN0b3IoCisgICAgICAgICAgZk11bHQoTUFTS0xPV1NQUkVOLCAocGJCYXJjVmFsdWVbaV0gLSBwYkJhcmNWYWx1ZVtpIC0gMV0pKSwgMjMsIFRFTiwKKyAgICAgICAgICAyNyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBiTWFza0hpRmFjdG9yW2ldID0gKEZJWFBfREJMKTA7CisgICAgICBwYk1hc2tMb0ZhY3RvcltudW1QYiAtIDFdID0gKEZJWFBfREJMKTA7CisgICAgICBwYk1hc2tIaUZhY3RvclNwckVuW2ldID0gKEZJWFBfREJMKTA7CisgICAgICBwYk1hc2tMb0ZhY3RvclNwckVuW251bVBiIC0gMV0gPSAoRklYUF9EQkwpMDsKICAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgRkRLYWFjRW5jX2luaXRCYXJjVmFsdWVzKElOVCBudW1QYiwgSU5UICpwYk9mZnNldCwgSU5UIG51bUxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGluZ0ZyZXF1ZW5jeSwgRklYUF9EQkwgKnBiQnZhbCkgeworICBJTlQgaTsKKyAgRklYUF9EQkwgTUFYX0JBUkMgPSAoRklYUF9EQkwpMHgzMDAwMDAwMDsgLyogMjQuMCBpbiBxMjUgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgbnVtUGI7IGkrKykgeworICAgIEZJWFBfREJMIHYxLCB2MiwgY3VyX2Jhcms7CisgICAgdjEgPSBGREthYWNFbmNfQmFyY0xpbmVWYWx1ZShudW1MaW5lcywgcGJPZmZzZXRbaV0sIHNhbXBsaW5nRnJlcXVlbmN5KTsKKyAgICB2MiA9IEZES2FhY0VuY19CYXJjTGluZVZhbHVlKG51bUxpbmVzLCBwYk9mZnNldFtpICsgMV0sIHNhbXBsaW5nRnJlcXVlbmN5KTsKKyAgICBjdXJfYmFyayA9ICh2MSA+PiAxKSArICh2MiA+PiAxKTsKKyAgICBwYkJ2YWxbaV0gPSBmaXhNaW4oY3VyX2JhcmssIE1BWF9CQVJDKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBGREthYWNFbmNfaW5pdE1pblNucihjb25zdCBMT05HIGJpdHJhdGUsIGNvbnN0IExPTkcgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBudW1MaW5lcywgY29uc3QgSU5UICpzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2ZiQWN0aXZlLCBjb25zdCBJTlQgYmxvY2tUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNmYk1pblNuckxkRGF0YSkgeworICBJTlQgc2ZiOworCisgIC8qIEZpeCBjb252ZXJzaW9uIHZhcmlhYmxlcyAqLworICBJTlQgcWJmYWMsIHFwZXJ3aW4sIHFkaXYsIHFwZXBydF9jb25zdCwgcXBlcHJ0OworICBJTlQgcXRtcCwgcXNuciwgc2ZiV2lkdGg7CisKKyAgRklYUF9EQkwgTUFYX0JBUkMgPSAoRklYUF9EQkwpMHgzMDAwMDAwMDsgICAvKiAyNC4wIGluIHEyNSAqLworICBGSVhQX0RCTCBNQVhfQkFSQ1AxID0gKEZJWFBfREJMKTB4MzIwMDAwMDA7IC8qIDI1LjAgaW4gcTI1ICovCisgIEZJWFBfREJMIEJJVFMyUEVGQUMgPSAoRklYUF9EQkwpMHg0Yjg1MWViODsgLyogMS4xOCBpbiBxMzAgKi8KKyAgRklYUF9EQkwgUEVSUzJQNCA9IChGSVhQX0RCTCkweDYyNGRkMmYyOyAgICAvKiAwLjAyNCBpbiBxMzYgKi8KKyAgRklYUF9EQkwgT05FUDUgPSAoRklYUF9EQkwpMHg2MDAwMDAwMDsgICAgICAvKiAxLjUgaW4gcTMwICovCisgIEZJWFBfREJMIE1BWF9TTlIgPSAoRklYUF9EQkwpMHgzMzMzMzMzMzsgICAgLyogMC44IGluIHEzMCAqLworICBGSVhQX0RCTCBNSU5fU05SID0gKEZJWFBfREJMKTB4MDAzMTI2ZTk7ICAgIC8qIDAuMDAzIGluIHEzMCAqLworCisgIEZJWFBfREJMIGJhcmNGYWN0b3IsIHBlUGVyV2luZG93LCBwZVBhcnQsIGJhcmNXaWR0aDsKKyAgRklYUF9EQkwgcGVQYXJ0X2NvbnN0LCB0bXAsIHNuciwgb25lX3FzbnIsIG9uZV9wb2ludDU7CisKKyAgLyogcmVsYXRpdmUgbnVtYmVyIG9mIGFjdGl2ZSBiYXJrcyAqLworICBiYXJjRmFjdG9yID0gZkRpdk5vcm0oZml4TWluKEZES2FhY0VuY19CYXJjTGluZVZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1MaW5lcywgc2ZiT2Zmc2V0W3NmYkFjdGl2ZV0sIHNhbXBsZXJhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9CQVJDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9CQVJDUDEsICZxYmZhYyk7CisKKyAgcWJmYWMgPSBERlJBQ1RfQklUUyAtIDEgLSBxYmZhYzsKKworICBwZVBlcldpbmRvdyA9IGZEaXZOb3JtKGJpdHJhdGUsIHNhbXBsZXJhdGUsICZxcGVyd2luKTsKKyAgcXBlcndpbiA9IERGUkFDVF9CSVRTIC0gMSAtIHFwZXJ3aW47CisgIHBlUGVyV2luZG93ID0gZk11bHQocGVQZXJXaW5kb3csIEJJVFMyUEVGQUMpOworICBxcGVyd2luID0gcXBlcndpbiArIDMwIC0gKERGUkFDVF9CSVRTIC0gMSk7CisgIHBlUGVyV2luZG93ID0gZk11bHQocGVQZXJXaW5kb3csIFBFUlMyUDQpOworICBxcGVyd2luID0gcXBlcndpbiArIDM2IC0gKERGUkFDVF9CSVRTIC0gMSk7CisKKyAgc3dpdGNoIChudW1MaW5lcykgeworICAgIGNhc2UgMTAyNDoKKyAgICAgIHFwZXJ3aW4gPSBxcGVyd2luIC0gMTA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyODoKKyAgICAgIHFwZXJ3aW4gPSBxcGVyd2luIC0gNzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNTEyOgorICAgICAgcXBlcndpbiA9IHFwZXJ3aW4gLSA5OworICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODA6CisgICAgICBxcGVyd2luID0gcXBlcndpbiAtIDk7CisgICAgICBwZVBlcldpbmRvdyA9IGZNdWx0KHBlUGVyV2luZG93LCBGTDJGWENPTlNUX0RCTCg0ODAuZiAvIDUxMi5mKSk7CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIGZvciBzaG9ydCBibG9ja3MgaXQgaXMgYXNzdW1lZCB0aGF0IG1vcmUgYml0cyBhcmUgYXZhaWxhYmxlICovCisgIGlmIChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKSB7CisgICAgcGVQZXJXaW5kb3cgPSBmTXVsdChwZVBlcldpbmRvdywgT05FUDUpOworICAgIHFwZXJ3aW4gPSBxcGVyd2luICsgMzAgLSAoREZSQUNUX0JJVFMgLSAxKTsKKyAgfQorICBwZVBhcnRfY29uc3QgPSBmRGl2Tm9ybShwZVBlcldpbmRvdywgYmFyY0ZhY3RvciwgJnFkaXYpOworICBxcGVwcnRfY29uc3QgPSBxcGVyd2luIC0gcWJmYWMgKyBERlJBQ1RfQklUUyAtIDEgLSBxZGl2OworCisgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykgeworICAgIGJhcmNXaWR0aCA9CisgICAgICAgIEZES2FhY0VuY19CYXJjTGluZVZhbHVlKG51bUxpbmVzLCBzZmJPZmZzZXRbc2ZiICsgMV0sIHNhbXBsZXJhdGUpIC0KKyAgICAgICAgRkRLYWFjRW5jX0JhcmNMaW5lVmFsdWUobnVtTGluZXMsIHNmYk9mZnNldFtzZmJdLCBzYW1wbGVyYXRlKTsKKworICAgIC8qIGFkYXB0IHRvIHNmYiBiYW5kcyAqLworICAgIHBlUGFydCA9IGZNdWx0KHBlUGFydF9jb25zdCwgYmFyY1dpZHRoKTsKKyAgICBxcGVwcnQgPSBxcGVwcnRfY29uc3QgKyAyNSAtIChERlJBQ1RfQklUUyAtIDEpOworCisgICAgLyogcGUgLT4gc25yIGNhbGN1bGF0aW9uICovCisgICAgc2ZiV2lkdGggPSAoc2ZiT2Zmc2V0W3NmYiArIDFdIC0gc2ZiT2Zmc2V0W3NmYl0pOworICAgIHBlUGFydCA9IGZEaXZOb3JtKHBlUGFydCwgc2ZiV2lkdGgsICZxZGl2KTsKKyAgICBxcGVwcnQgKz0gREZSQUNUX0JJVFMgLSAxIC0gcWRpdjsKKworICAgIHRtcCA9IGYyUG93KHBlUGFydCwgREZSQUNUX0JJVFMgLSAxIC0gcXBlcHJ0LCAmcXRtcCk7CisgICAgcXRtcCA9IERGUkFDVF9CSVRTIC0gMSAtIHF0bXA7CisKKyAgICAvKiBTdWJ0cmFjdCAxLjUgKi8KKyAgICBxc25yID0gZml4TWluKHF0bXAsIDMwKTsKKyAgICB0bXAgPSB0bXAgPj4gKHF0bXAgLSBxc25yKTsKKworICAgIGlmICgoMzAgKyAxIC0gcXNucikgPiAoREZSQUNUX0JJVFMgLSAxKSkKKyAgICAgIG9uZV9wb2ludDUgPSAoRklYUF9EQkwpMDsKICAgICBlbHNlCi0gICAgewotICAgICAgICBNQVNLTE9XU1BSRU4gPSBNQVNLTE9XU1BSRU5TSE9SVDsKLSAgICAgICAgTUFTS0hJR0hTUFJFTiA9IE1BU0tISUdIU1BSRU5TSE9SVDsKLSAgICB9CisgICAgICBvbmVfcG9pbnQ1ID0gKEZJWFBfREJMKShPTkVQNSA+PiAoMzAgKyAxIC0gcXNucikpOwogCi0gICAgZm9yKGk9MDsgaTxudW1QYjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwYk1hc2tIaUZhY3RvcltpXSA9IGdldE1hc2tGYWN0b3IoCi0gICAgICAgICAgICAgICAgICAgIGZNdWx0KE1BU0tISUdILCAocGJCYXJjVmFsdWVbaV0gLSBwYkJhcmNWYWx1ZVtpLTFdKSksIDIzLAotICAgICAgICAgICAgICAgICAgICBURU4sIDI3KTsKKyAgICBzbnIgPSAodG1wID4+IDEpIC0gKG9uZV9wb2ludDUpOworICAgIHFzbnIgLT0gMTsKIAotICAgICAgICAgICAgcGJNYXNrTG9GYWN0b3JbaS0xXSA9IGdldE1hc2tGYWN0b3IoCi0gICAgICAgICAgICAgICAgICAgIGZNdWx0KE1BU0tMT1csIChwYkJhcmNWYWx1ZVtpXSAtIHBiQmFyY1ZhbHVlW2ktMV0pKSwgMjMsCi0gICAgICAgICAgICAgICAgICAgIFRFTiwgMjcpOworICAgIC8qIG1heChzbnIsIDEuMCkgKi8KKyAgICBpZiAocXNuciA+IDApCisgICAgICBvbmVfcXNuciA9IChGSVhQX0RCTCkoMSA8PCBxc25yKTsKKyAgICBlbHNlCisgICAgICBvbmVfcXNuciA9IChGSVhQX0RCTCkwOwogCi0gICAgICAgICAgICBwYk1hc2tIaUZhY3RvclNwckVuW2ldID0gZ2V0TWFza0ZhY3RvcigKLSAgICAgICAgICAgICAgICAgICAgZk11bHQoTUFTS0hJR0hTUFJFTiwgKHBiQmFyY1ZhbHVlW2ldIC0gcGJCYXJjVmFsdWVbaS0xXSkpLCAyMywKLSAgICAgICAgICAgICAgICAgICAgVEVOLCAyNyk7CisgICAgc25yID0gZml4TWF4KG9uZV9xc25yLCBzbnIpOwogCi0gICAgICAgICAgICBwYk1hc2tMb0ZhY3RvclNwckVuW2ktMV0gPSBnZXRNYXNrRmFjdG9yKAotICAgICAgICAgICAgICAgICAgICBmTXVsdChNQVNLTE9XU1BSRU4sIChwYkJhcmNWYWx1ZVtpXSAtIHBiQmFyY1ZhbHVlW2ktMV0pKSwgMjMsCi0gICAgICAgICAgICAgICAgICAgIFRFTiwgMjcpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcGJNYXNrSGlGYWN0b3JbaV0gICAgICAgICAgICA9IChGSVhQX0RCTCkwOwotICAgICAgICAgICAgcGJNYXNrTG9GYWN0b3JbbnVtUGItMV0gICAgICA9IChGSVhQX0RCTCkwOwotICAgICAgICAgICAgcGJNYXNrSGlGYWN0b3JTcHJFbltpXSAgICAgICA9IChGSVhQX0RCTCkwOwotICAgICAgICAgICAgcGJNYXNrTG9GYWN0b3JTcHJFbltudW1QYi0xXSA9IChGSVhQX0RCTCkwOwotICAgICAgICB9Ci0gICAgfQorICAgIC8qIDEvc25yICovCisgICAgc25yID0gZkRpdk5vcm0ob25lX3FzbnIsIHNuciwgJnFzbnIpOworICAgIHFzbnIgPSBERlJBQ1RfQklUUyAtIDEgLSBxc25yOworICAgIHNuciA9IChxc25yID4gMzApID8gKHNuciA+PiAocXNuciAtIDMwKSkgOiBzbnI7CisKKyAgICAvKiB1cHBlciBsaW1pdCBpcyAtMSBkQiAqLworICAgIHNuciA9IChzbnIgPiBNQVhfU05SKSA/IE1BWF9TTlIgOiBzbnI7CisKKyAgICAvKiBsb3dlciBsaW1pdCBpcyAtMjUgZEIgKi8KKyAgICBzbnIgPSAoc25yIDwgTUlOX1NOUikgPyBNSU5fU05SIDogc25yOworICAgIHNuciA9IHNuciA8PCAxOworCisgICAgc2ZiTWluU25yTGREYXRhW3NmYl0gPSBDYWxjTGREYXRhKHNucik7CisgIH0KIH0KIAotc3RhdGljIHZvaWQgRkRLYWFjRW5jX2luaXRCYXJjVmFsdWVzKElOVCBudW1QYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcGJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxpbmdGcmVxdWVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcGJCdmFsKQotewotICAgIElOVCBpOwotICAgIEZJWFBfREJMIE1BWF9CQVJDID0gKEZJWFBfREJMKTB4MzAwMDAwMDA7IC8qIDI0LjAgaW4gcTI1ICovCi0KLSAgICBmb3IoaT0wOyBpPG51bVBiOyBpKyspCi0gICAgewotICAgICAgICBGSVhQX0RCTCB2MSwgdjIsIGN1cl9iYXJrOwotICAgICAgICB2MSA9IEZES2FhY0VuY19CYXJjTGluZVZhbHVlKG51bUxpbmVzLCBwYk9mZnNldFtpXSwgc2FtcGxpbmdGcmVxdWVuY3kpOwotICAgICAgICB2MiA9IEZES2FhY0VuY19CYXJjTGluZVZhbHVlKG51bUxpbmVzLCBwYk9mZnNldFtpKzFdLCBzYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0gICAgICAgIGN1cl9iYXJrID0gKHYxID4+IDEpICsgKHYyID4+IDEpOwotICAgICAgICBwYkJ2YWxbaV0gPSBmaXhNaW4oY3VyX2JhcmssIE1BWF9CQVJDKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19pbml0TWluU25yKGNvbnN0IExPTkcgICBiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExPTkcgICBzYW1wbGVyYXRlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICBudW1MaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICBzZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgIGJsb2NrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqc2ZiTWluU25yTGREYXRhKQotewotICAgIElOVCBzZmI7Ci0KLSAgICAvKiBGaXggY29udmVyc2lvbiB2YXJpYWJsZXMgKi8KLSAgICBJTlQgcWJmYWMsIHFwZXJ3aW4sIHFkaXYsIHFwZXBydF9jb25zdCwgcXBlcHJ0OwotICAgIElOVCBxdG1wLCBxc25yLCBzZmJXaWR0aDsKLQotICAgIEZJWFBfREJMIE1BWF9CQVJDICAgICAgID0gKEZJWFBfREJMKTB4MzAwMDAwMDA7IC8qIDI0LjAgaW4gcTI1ICovCi0gICAgRklYUF9EQkwgTUFYX0JBUkNQMSAgICAgPSAoRklYUF9EQkwpMHgzMjAwMDAwMDsgLyogMjUuMCBpbiBxMjUgKi8KLSAgICBGSVhQX0RCTCBCSVRTMlBFRkFDICAgICA9IChGSVhQX0RCTCkweDRiODUxZWI4OyAvKiAxLjE4IGluIHEzMCAqLwotICAgIEZJWFBfREJMIFBFUlMyUDQgICAgICAgID0gKEZJWFBfREJMKTB4NjI0ZGQyZjI7IC8qIDAuMDI0IGluIHEzNiAqLwotICAgIEZJWFBfREJMIE9ORVA1ICAgICAgICAgID0gKEZJWFBfREJMKTB4NjAwMDAwMDA7IC8qIDEuNSBpbiBxMzAgKi8KLSAgICBGSVhQX0RCTCBNQVhfU05SICAgICAgICA9IChGSVhQX0RCTCkweDMzMzMzMzMzOyAvKiAwLjggaW4gcTMwICovCi0gICAgRklYUF9EQkwgTUlOX1NOUiAgICAgICAgPSAoRklYUF9EQkwpMHgwMDMxMjZlOTsgLyogMC4wMDMgaW4gcTMwICovCi0KLSAgICBGSVhQX0RCTCBiYXJjRmFjdG9yLCBwZVBlcldpbmRvdywgcGVQYXJ0LCBiYXJjV2lkdGg7Ci0gICAgRklYUF9EQkwgcGVQYXJ0X2NvbnN0LCB0bXAsIHNuciwgb25lX3FzbnIsIG9uZV9wb2ludDU7Ci0KLSAgICAvKiByZWxhdGl2ZSBudW1iZXIgb2YgYWN0aXZlIGJhcmtzICovCi0gICAgYmFyY0ZhY3RvciA9IGZEaXZOb3JtKGZpeE1pbihGREthYWNFbmNfQmFyY0xpbmVWYWx1ZShudW1MaW5lcywgc2ZiT2Zmc2V0W3NmYkFjdGl2ZV0sIHNhbXBsZXJhdGUpLCBNQVhfQkFSQyksCi0gICAgICAgIE1BWF9CQVJDUDEsICZxYmZhYyk7Ci0KLSAgICBxYmZhYyA9IERGUkFDVF9CSVRTLTEtcWJmYWM7Ci0KLSAgICBwZVBlcldpbmRvdyA9IGZEaXZOb3JtKGJpdHJhdGUsIHNhbXBsZXJhdGUsICZxcGVyd2luKTsKLSAgICBxcGVyd2luID0gREZSQUNUX0JJVFMtMS1xcGVyd2luOwotICAgIHBlUGVyV2luZG93ID0gZk11bHQocGVQZXJXaW5kb3csIEJJVFMyUEVGQUMpOyAgICAgICAgICAgICAgICAgICBxcGVyd2luID0gcXBlcndpbiArIDMwIC0gKERGUkFDVF9CSVRTLTEpOwotICAgIHBlUGVyV2luZG93ID0gZk11bHQocGVQZXJXaW5kb3csIFBFUlMyUDQpOyAgICAgICAgICAgICAgICAgICAgICBxcGVyd2luID0gcXBlcndpbiArIDM2IC0gKERGUkFDVF9CSVRTLTEpOwotCi0gICAgc3dpdGNoIChudW1MaW5lcykgewotICAgICAgY2FzZSAxMDI0OgotICAgICAgICBxcGVyd2luID0gcXBlcndpbiAtIDEwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTI4OgotICAgICAgICBxcGVyd2luID0gcXBlcndpbiAtIDc7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA1MTI6Ci0gICAgICAgIHFwZXJ3aW4gPSBxcGVyd2luIC0gOTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDQ4MDoKLSAgICAgICAgcXBlcndpbiA9IHFwZXJ3aW4gLSA5OwotICAgICAgICBwZVBlcldpbmRvdyA9IGZNdWx0KHBlUGVyV2luZG93LCBGTDJGWENPTlNUX0RCTCg0ODAuZi81MTIuZikpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBmb3Igc2hvcnQgYmxvY2tzIGl0IGlzIGFzc3VtZWQgdGhhdCBtb3JlIGJpdHMgYXJlIGF2YWlsYWJsZSAqLwotICAgIGlmIChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKQotICAgIHsKLSAgICAgICAgcGVQZXJXaW5kb3cgPSBmTXVsdChwZVBlcldpbmRvdywgT05FUDUpOwotICAgICAgICBxcGVyd2luID0gcXBlcndpbiArIDMwIC0gKERGUkFDVF9CSVRTLTEpOwotICAgIH0KLSAgICBwZVBhcnRfY29uc3QgPSBmRGl2Tm9ybShwZVBlcldpbmRvdywgYmFyY0ZhY3RvciwgJnFkaXYpOyAgICAgIHFwZXBydF9jb25zdCA9IHFwZXJ3aW4gLSBxYmZhYyArIERGUkFDVF9CSVRTLTEtcWRpdjsKLQotICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQWN0aXZlOyBzZmIrKykKLSAgICB7Ci0gICAgICAgIGJhcmNXaWR0aCA9IEZES2FhY0VuY19CYXJjTGluZVZhbHVlKG51bUxpbmVzLCBzZmJPZmZzZXRbc2ZiKzFdLCBzYW1wbGVyYXRlKSAtCi0gICAgICAgICAgICBGREthYWNFbmNfQmFyY0xpbmVWYWx1ZShudW1MaW5lcywgc2ZiT2Zmc2V0W3NmYl0sIHNhbXBsZXJhdGUpOwotCi0gICAgICAgIC8qIGFkYXB0IHRvIHNmYiBiYW5kcyAqLwotICAgICAgICBwZVBhcnQgPSBmTXVsdChwZVBhcnRfY29uc3QsIGJhcmNXaWR0aCk7IHFwZXBydCA9IHFwZXBydF9jb25zdCArIDI1IC0gKERGUkFDVF9CSVRTLTEpOwotCi0gICAgICAgIC8qIHBlIC0+IHNuciBjYWxjdWxhdGlvbiAqLwotICAgICAgICBzZmJXaWR0aCA9IChzZmJPZmZzZXRbc2ZiKzFdIC0gc2ZiT2Zmc2V0W3NmYl0pOwotICAgICAgICBwZVBhcnQgPSBmRGl2Tm9ybShwZVBhcnQsIHNmYldpZHRoLCAmcWRpdik7IHFwZXBydCArPSBERlJBQ1RfQklUUy0xLXFkaXY7Ci0KLSAgICAgICAgdG1wID0gZjJQb3cocGVQYXJ0LCBERlJBQ1RfQklUUy0xLXFwZXBydCwgJnF0bXApOwotICAgICAgICBxdG1wID0gREZSQUNUX0JJVFMtMS1xdG1wOwotCi0gICAgICAgIC8qIFN1YnRyYWN0IDEuNSAqLwotICAgICAgICBxc25yID0gZml4TWluKHF0bXAsIDMwKTsKLSAgICAgICAgdG1wID0gdG1wID4+IChxdG1wIC0gcXNucik7Ci0KLSAgICAgICAgaWYoKDMwKzEtcXNucikgPiAoREZSQUNUX0JJVFMtMSkpCi0gICAgICAgICAgICBvbmVfcG9pbnQ1ID0gKEZJWFBfREJMKTA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG9uZV9wb2ludDUgPSAoRklYUF9EQkwpKE9ORVA1ID4+ICgzMCsxLXFzbnIpKTsKLQotICAgICAgICBzbnIgPSAodG1wPj4xKSAtIChvbmVfcG9pbnQ1KTsgcXNuciAtPSAxOwotCi0gICAgICAgIC8qIG1heChzbnIsIDEuMCkgKi8KLSAgICAgICAgaWYocXNuciA+IDApCi0gICAgICAgICAgICBvbmVfcXNuciA9IChGSVhQX0RCTCkoMSA8PCBxc25yKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgb25lX3FzbnIgPSAoRklYUF9EQkwpMDsKLQotICAgICAgICBzbnIgPSBmaXhNYXgob25lX3FzbnIsIHNucik7Ci0KLSAgICAgICAgLyogMS9zbnIgKi8KLSAgICAgICAgc25yID0gZkRpdk5vcm0ob25lX3FzbnIsIHNuciwgJnFzbnIpOwotICAgICAgICBxc25yID0gREZSQUNUX0JJVFMtMS1xc25yOwotICAgICAgICBzbnIgPSAocXNuciA+IDMwKT8gKHNucj4+KHFzbnItMzApKTpzbnI7Ci0KLSAgICAgICAgLyogdXBwZXIgbGltaXQgaXMgLTEgZEIgKi8KLSAgICAgICAgc25yID0gKHNuciA+IE1BWF9TTlIpID8gTUFYX1NOUiA6IHNucjsKLQotICAgICAgICAvKiBsb3dlciBsaW1pdCBpcyAtMjUgZEIgKi8KLSAgICAgICAgc25yID0gKHNuciA8IE1JTl9TTlIpID8gTUlOX1NOUiA6IHNucjsKLSAgICAgICAgc25yID0gc25yIDw8IDE7Ci0KLSAgICAgICAgc2ZiTWluU25yTGREYXRhW3NmYl0gPSBDYWxjTGREYXRhKHNucik7Ci0gICAgfQotfQotCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdFBzeUNvbmZpZ3VyYXRpb24oSU5UICAgYml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBzYW1wbGVyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIGJhbmR3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBibG9ja3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgZ3JhbnVsZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICB1c2VJUywKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0UHN5Q29uZmlndXJhdGlvbihJTlQgYml0cmF0ZSwgSU5UIHNhbXBsZXJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJhbmR3aWR0aCwgSU5UIGJsb2NrdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZ3JhbnVsZUxlbmd0aCwgSU5UIHVzZUlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB1c2VNUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTiAqcHN5Q29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQl9UWVBFIGZpbHRlcmJhbmspCi17Ci0gICAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7Ci0gICAgSU5UICAgICAgc2ZiOwotICAgIEZJWFBfREJMIHNmYkJhcmNWYWxbTUFYX1NGQl07Ci0gICAgY29uc3QgSU5UIGZyYW1lTGVuZ3RoTG9uZyA9IGdyYW51bGVMZW5ndGg7Ci0gICAgY29uc3QgSU5UIGZyYW1lTGVuZ3RoU2hvcnQgPSBncmFudWxlTGVuZ3RoL1RSQU5TX0ZBQzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQl9UWVBFIGZpbHRlcmJhbmspIHsKKyAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7CisgIElOVCBzZmI7CisgIEZJWFBfREJMIHNmYkJhcmNWYWxbTUFYX1NGQl07CisgIGNvbnN0IElOVCBmcmFtZUxlbmd0aExvbmcgPSBncmFudWxlTGVuZ3RoOworICBjb25zdCBJTlQgZnJhbWVMZW5ndGhTaG9ydCA9IGdyYW51bGVMZW5ndGggLyBUUkFOU19GQUM7CisgIElOVCBkb3duc2NhbGVGYWN0b3IgPSAxOwogCi0gICAgRkRLbWVtY2xlYXIocHN5Q29uZiwgc2l6ZW9mKFBTWV9DT05GSUdVUkFUSU9OKSk7Ci0gICAgcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aCA9IGdyYW51bGVMZW5ndGg7Ci0gICAgcHN5Q29uZi0+ZmlsdGVyYmFuayA9IGZpbHRlcmJhbms7CisgIHN3aXRjaCAoZ3JhbnVsZUxlbmd0aCkgeworICAgIGNhc2UgMjU2OgorICAgIGNhc2UgMjQwOgorICAgICAgZG93bnNjYWxlRmFjdG9yID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI4OgorICAgIGNhc2UgMTIwOgorICAgICAgZG93bnNjYWxlRmFjdG9yID0gNDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBkb3duc2NhbGVGYWN0b3IgPSAxOworICAgICAgYnJlYWs7CisgIH0KIAotICAgIHBzeUNvbmYtPmFsbG93SVMgICAgICAgPSAodXNlSVMpICYmICggKGJpdHJhdGUvYmFuZHdpZHRoKSA8IDUgKTsKKyAgRkRLbWVtY2xlYXIocHN5Q29uZiwgc2l6ZW9mKFBTWV9DT05GSUdVUkFUSU9OKSk7CisgIHBzeUNvbmYtPmdyYW51bGVMZW5ndGggPSBncmFudWxlTGVuZ3RoOworICBwc3lDb25mLT5maWx0ZXJiYW5rID0gZmlsdGVyYmFuazsKIAotICAgIC8qIGluaXQgc2ZiIHRhYmxlICovCi0gICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfaW5pdFNmYlRhYmxlKHNhbXBsZXJhdGUsYmxvY2t0eXBlLGdyYW51bGVMZW5ndGgscHN5Q29uZi0+c2ZiT2Zmc2V0LCZwc3lDb25mLT5zZmJDbnQpOwotICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQotICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOworICBwc3lDb25mLT5hbGxvd0lTID0gKHVzZUlTKSAmJiAoKGJpdHJhdGUgLyBiYW5kd2lkdGgpIDwgNSk7CisgIHBzeUNvbmYtPmFsbG93TVMgPSB1c2VNUzsKIAotICAgIC8qIGNhbGN1bGF0ZSBiYXJjIHZhbHVlcyBmb3IgZWFjaCBwYiAqLwotICAgIEZES2FhY0VuY19pbml0QmFyY1ZhbHVlcyhwc3lDb25mLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk9mZnNldFtwc3lDb25mLT5zZmJDbnRdLAotICAgICAgICAgICAgICAgICAgIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgICAgICAgc2ZiQmFyY1ZhbCk7CisgIC8qIGluaXQgc2ZiIHRhYmxlICovCisgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX2luaXRTZmJUYWJsZShzYW1wbGVyYXRlICogZG93bnNjYWxlRmFjdG9yLCBibG9ja3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFudWxlTGVuZ3RoICogZG93bnNjYWxlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0LCAmcHN5Q29uZi0+c2ZiQ250KTsKIAotICAgIEZES2FhY0VuY19Jbml0TWluUENNUmVzb2x1dGlvbihwc3lDb25mLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYlBjbVF1YW50VGhyZXNob2xkKTsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIHJldHVybiBFcnJvclN0YXR1czsKIAotICAgIC8qIGNhbGN1bGF0ZSBzcHJlYWRpbmcgZnVuY3Rpb24gKi8KLSAgICBGREthYWNFbmNfaW5pdFNwcmVhZGluZyhwc3lDb25mLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICBzZmJCYXJjVmFsLAotICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWFza0xvd0ZhY3RvciwKLSAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tIaWdoRmFjdG9yLAotICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWFza0xvd0ZhY3RvclNwckVuLAotICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWFza0hpZ2hGYWN0b3JTcHJFbiwKLSAgICAgICAgICAgICAgICAgIGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICBibG9ja3R5cGUpOworICAvKiBjYWxjdWxhdGUgYmFyYyB2YWx1ZXMgZm9yIGVhY2ggcGIgKi8KKyAgRkRLYWFjRW5jX2luaXRCYXJjVmFsdWVzKHBzeUNvbmYtPnNmYkNudCwgcHN5Q29uZi0+c2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0W3BzeUNvbmYtPnNmYkNudF0sIHNhbXBsZXJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJCYXJjVmFsKTsKIAotICAgIC8qIGluaXQgcmF0aW8gKi8KKyAgRkRLYWFjRW5jX0luaXRNaW5QQ01SZXNvbHV0aW9uKHBzeUNvbmYtPnNmYkNudCwgcHN5Q29uZi0+c2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiUGNtUXVhbnRUaHJlc2hvbGQpOwogCi0gICAgcHN5Q29uZi0+bWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50ZWdlciAqLwotICAgIHBzeUNvbmYtPm1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciA9IChGSVhQX1NHTCkweDAxNDg7IC8qIEZMMkZYQ09OU1RfU0dMKDAuMDFmKTsgKi8gIC8qIGZyYWN0ICAgKi8KKyAgLyogY2FsY3VsYXRlIHNwcmVhZGluZyBmdW5jdGlvbiAqLworICBGREthYWNFbmNfaW5pdFNwcmVhZGluZyhwc3lDb25mLT5zZmJDbnQsIHNmYkJhcmNWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tMb3dGYWN0b3IsIHBzeUNvbmYtPnNmYk1hc2tIaWdoRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJNYXNrTG93RmFjdG9yU3ByRW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tIaWdoRmFjdG9yU3ByRW4sIGJpdHJhdGUsIGJsb2NrdHlwZSk7CiAKLSAgICBwc3lDb25mLT5jbGlwRW5lcmd5ID0gKEZJWFBfREJMKTB4NzczNTkzZmY7IC8qIEZMMkZYQ09OU1RfREJMKDEuMGU5Kk5PUk1fUENNX0VORVJHWSk7ICovCisgIC8qIGluaXQgcmF0aW8gKi8KIAotICAgIGlmIChibG9ja3R5cGUhPVNIT1JUX1dJTkRPVykgewotICAgICAgICBwc3lDb25mLT5sb3dwYXNzTGluZSA9IChJTlQpKCgyKmJhbmR3aWR0aCpmcmFtZUxlbmd0aExvbmcpL3NhbXBsZXJhdGUpOwotICAgICAgICBwc3lDb25mLT5sb3dwYXNzTGluZUxGRSA9IExGRV9MT1dQQVNTX0xJTkU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBwc3lDb25mLT5sb3dwYXNzTGluZSA9IChJTlQpKCgyKmJhbmR3aWR0aCpmcmFtZUxlbmd0aFNob3J0KS9zYW1wbGVyYXRlKTsKLSAgICAgICAgcHN5Q29uZi0+bG93cGFzc0xpbmVMRkUgPSAwOyAvKiBMRkUgb25seSBpbiBsb25mIGJsb2NrcyAqLwotICAgICAgICAvKiBwc3lDb25mLT5jbGlwRW5lcmd5IC89IChUUkFOU19GQUMgKiBUUkFOU19GQUMpOyAqLwotICAgICAgICBwc3lDb25mLT5jbGlwRW5lcmd5ID4+PSA2OwotICAgIH0KKyAgcHN5Q29uZi0+bWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yID0gMjsgLyogaW50ZWdlciAqLworICBwc3lDb25mLT5taW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IgPSAoRklYUF9TR0wpMHgwMTQ4OworICAvKiBGTDJGWENPTlNUX1NHTCgwLjAxZik7ICovIC8qIGZyYWN0ICAgKi8KIAotICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5Q29uZi0+c2ZiQ250OyBzZmIrKyl7Ci0gICAgICAgIGlmIChwc3lDb25mLT5zZmJPZmZzZXRbc2ZiXSA+PSBwc3lDb25mLT5sb3dwYXNzTGluZSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBwc3lDb25mLT5zZmJBY3RpdmUgPSBGREttYXgoc2ZiLCAxKTsKKyAgcHN5Q29uZi0+Y2xpcEVuZXJneSA9CisgICAgICAoRklYUF9EQkwpMHg3NzM1OTNmZjsgLyogRkwyRlhDT05TVF9EQkwoMS4wZTkqTk9STV9QQ01fRU5FUkdZKTsgKi8KIAotICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5Q29uZi0+c2ZiQ250OyBzZmIrKyl7Ci0gICAgICAgIGlmIChwc3lDb25mLT5zZmJPZmZzZXRbc2ZiXSA+PSBwc3lDb25mLT5sb3dwYXNzTGluZUxGRSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBwc3lDb25mLT5zZmJBY3RpdmVMRkUgPSBzZmI7Ci0gICAgcHN5Q29uZi0+c2ZiQWN0aXZlID0gRkRLbWF4KHBzeUNvbmYtPnNmYkFjdGl2ZSwgcHN5Q29uZi0+c2ZiQWN0aXZlTEZFKTsKKyAgaWYgKGJsb2NrdHlwZSAhPSBTSE9SVF9XSU5ET1cpIHsKKyAgICBwc3lDb25mLT5sb3dwYXNzTGluZSA9CisgICAgICAgIChJTlQpKCgyICogYmFuZHdpZHRoICogZnJhbWVMZW5ndGhMb25nKSAvIHNhbXBsZXJhdGUpOworICAgIHBzeUNvbmYtPmxvd3Bhc3NMaW5lTEZFID0gTEZFX0xPV1BBU1NfTElORTsKKyAgfSBlbHNlIHsKKyAgICBwc3lDb25mLT5sb3dwYXNzTGluZSA9CisgICAgICAgIChJTlQpKCgyICogYmFuZHdpZHRoICogZnJhbWVMZW5ndGhTaG9ydCkgLyBzYW1wbGVyYXRlKTsKKyAgICBwc3lDb25mLT5sb3dwYXNzTGluZUxGRSA9IDA7IC8qIExGRSBvbmx5IGluIGxvbmYgYmxvY2tzICovCisgICAgLyogcHN5Q29uZi0+Y2xpcEVuZXJneSAvPSAoVFJBTlNfRkFDICogVFJBTlNfRkFDKTsgKi8KKyAgICBwc3lDb25mLT5jbGlwRW5lcmd5ID4+PSA2OworICB9CiAKLSAgICAvKiBjYWxjdWxhdGUgbWluU25yICovCi0gICAgRkRLYWFjRW5jX2luaXRNaW5TbnIoYml0cmF0ZSwKLSAgICAgICAgICAgICAgIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXRbcHN5Q29uZi0+c2ZiQ250XSwKLSAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgIGJsb2NrdHlwZSwKLSAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1pblNuckxkRGF0YSk7CisgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5Q29uZi0+c2ZiQ250OyBzZmIrKykgeworICAgIGlmIChwc3lDb25mLT5zZmJPZmZzZXRbc2ZiXSA+PSBwc3lDb25mLT5sb3dwYXNzTGluZSkgYnJlYWs7CisgIH0KKyAgcHN5Q29uZi0+c2ZiQWN0aXZlID0gZk1heChzZmIsIDEpOwogCi0gICAgcmV0dXJuIEFBQ19FTkNfT0s7CisgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5Q29uZi0+c2ZiQ250OyBzZmIrKykgeworICAgIGlmIChwc3lDb25mLT5zZmJPZmZzZXRbc2ZiXSA+PSBwc3lDb25mLT5sb3dwYXNzTGluZUxGRSkgYnJlYWs7CisgIH0KKyAgcHN5Q29uZi0+c2ZiQWN0aXZlTEZFID0gc2ZiOworICBwc3lDb25mLT5zZmJBY3RpdmUgPSBmTWF4KHBzeUNvbmYtPnNmYkFjdGl2ZSwgcHN5Q29uZi0+c2ZiQWN0aXZlTEZFKTsKKworICAvKiBjYWxjdWxhdGUgbWluU25yICovCisgIEZES2FhY0VuY19pbml0TWluU25yKGJpdHJhdGUsIHNhbXBsZXJhdGUgKiBkb3duc2NhbGVGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk9mZnNldFtwc3lDb25mLT5zZmJDbnRdLCBwc3lDb25mLT5zZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYkFjdGl2ZSwgYmxvY2t0eXBlLCBwc3lDb25mLT5zZmJNaW5TbnJMZERhdGEpOworCisgIHJldHVybiBBQUNfRU5DX09LOwogfQotCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3BzeV9jb25maWd1cmF0aW9uLmggYi9saWJBQUNlbmMvc3JjL3BzeV9jb25maWd1cmF0aW9uLmgKaW5kZXggMzYyOTI0Ni4uNTJiMjg4NyAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9wc3lfY29uZmlndXJhdGlvbi5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvcHN5X2NvbmZpZ3VyYXRpb24uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxOCArOTAsMTggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBQc3ljaG9hY2NvdXN0aWMgY29uZmlndXJhdGlvbgorICAgQXV0aG9yKHMpOiAgIE0uV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBQc3ljaG9hY2NvdXN0aWMgY29uZmlndXJhdGlvbgogCi0jaWZuZGVmIF9QU1lfQ09ORklHVVJBVElPTl9ICi0jZGVmaW5lIF9QU1lfQ09ORklHVVJBVElPTl9ICisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZuZGVmIFBTWV9DT05GSUdVUkFUSU9OX0gKKyNkZWZpbmUgUFNZX0NPTkZJR1VSQVRJT05fSAogCiAjaW5jbHVkZSAiYWFjZW5jLmgiCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgpAQCAtOTksNjcgKzExMCw2MiBAQAogI2luY2x1ZGUgImFhY2VuY190bnMuaCIKICNpbmNsdWRlICJhYWNlbmNfcG5zLmgiCiAKLSNkZWZpbmUgVEhSX1NISUZUQklUUyAgICAgICAgIDQKLSNkZWZpbmUgUENNX1FVQU5UX1RIUl9TQ0FMRSAgMTYKKyNkZWZpbmUgVEhSX1NISUZUQklUUyA0CisjZGVmaW5lIFBDTV9RVUFOVF9USFJfU0NBTEUgMTYKKyNkZWZpbmUgQklUU19QRVJfTElORV9TSElGVCAzCiAKLSNkZWZpbmUgQ19SQVRJTyAoRklYUF9EQkwpMHgwMjk0MGExMCAvKiBGTDJGWENPTlNUX0RCTCgwLjAwMTI1ODkyNWYpIDw8IFRIUl9TSElGVEJJVFM7ICovIC8qIHBvdygxMC4wZiwgLSgyOS4wZi8xMC4wZikpICovCisjZGVmaW5lIENfUkFUSU8gXAorICAoRklYUF9EQkwpMHgwMjk0MGExMCAvKiBGTDJGWENPTlNUX0RCTCgwLjAwMTI1ODkyNWYpIDw8IFRIUl9TSElGVEJJVFM7ICovIC8qIHBvdygxMC4wZiwgLSgyOS4wZi8xMC4wZikpICovCiAKLXR5cGVkZWYgc3RydWN0ewotCi0gIElOVCBzZmJDbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleGlzdGluZyBzZiBiYW5kcyAqLwotICBJTlQgc2ZiQWN0aXZlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc2YgYmFuZHMgY29udGFpbmluZyBlbmVyZ3kgYWZ0ZXIgbG93cGFzcyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBJTlQgc2ZiQ250OyAgICAvKiBudW1iZXIgb2YgZXhpc3Rpbmcgc2YgYmFuZHMgKi8KKyAgSU5UIHNmYkFjdGl2ZTsgLyogbnVtYmVyIG9mIHNmIGJhbmRzIGNvbnRhaW5pbmcgZW5lcmd5IGFmdGVyIGxvd3Bhc3MgKi8KICAgSU5UIHNmYkFjdGl2ZUxGRTsKLSAgSU5UIHNmYk9mZnNldFtNQVhfU0ZCKzFdOworICBJTlQgc2ZiT2Zmc2V0W01BWF9TRkIgKyAxXTsKIAotICBJTlQgICAgICAgZmlsdGVyYmFuazsgICAgICAgICAgICAgICAgICAgICAvKiBMQywgTEQgb3IgRUxEICovCisgIElOVCBmaWx0ZXJiYW5rOyAvKiBMQywgTEQgb3IgRUxEICovCiAKLSAgRklYUF9EQkwgIHNmYlBjbVF1YW50VGhyZXNob2xkW01BWF9TRkJdOworICBGSVhQX0RCTCBzZmJQY21RdWFudFRocmVzaG9sZFtNQVhfU0ZCXTsKIAotICBJTlQgICAgICAgbWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yOyAgICAgICAgICAvKiBwcmVlY2hvIGNvbnRyb2wgKi8KLSAgRklYUF9TR0wgIG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvcjsKKyAgSU5UIG1heEFsbG93ZWRJbmNyZWFzZUZhY3RvcjsgLyogcHJlZWNobyBjb250cm9sICovCisgIEZJWFBfU0dMIG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvcjsKIAotICBJTlQgICAgICAgbG93cGFzc0xpbmU7Ci0gIElOVCAgICAgICBsb3dwYXNzTGluZUxGRTsKLSAgRklYUF9EQkwgIGNsaXBFbmVyZ3k7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIGxldmVsIGRlcGVuZGVuZCB0bW4gKi8KKyAgSU5UIGxvd3Bhc3NMaW5lOworICBJTlQgbG93cGFzc0xpbmVMRkU7CisgIEZJWFBfREJMIGNsaXBFbmVyZ3k7IC8qIGZvciBsZXZlbCBkZXBlbmRlbmQgdG1uICovCiAKLSAgRklYUF9EQkwgIHNmYk1hc2tMb3dGYWN0b3JbTUFYX1NGQl07Ci0gIEZJWFBfREJMICBzZmJNYXNrSGlnaEZhY3RvcltNQVhfU0ZCXTsKKyAgRklYUF9EQkwgc2ZiTWFza0xvd0ZhY3RvcltNQVhfU0ZCXTsKKyAgRklYUF9EQkwgc2ZiTWFza0hpZ2hGYWN0b3JbTUFYX1NGQl07CiAKLSAgRklYUF9EQkwgIHNmYk1hc2tMb3dGYWN0b3JTcHJFbltNQVhfU0ZCXTsKLSAgRklYUF9EQkwgIHNmYk1hc2tIaWdoRmFjdG9yU3ByRW5bTUFYX1NGQl07CisgIEZJWFBfREJMIHNmYk1hc2tMb3dGYWN0b3JTcHJFbltNQVhfU0ZCXTsKKyAgRklYUF9EQkwgc2ZiTWFza0hpZ2hGYWN0b3JTcHJFbltNQVhfU0ZCXTsKIAotICBGSVhQX0RCTCAgc2ZiTWluU25yTGREYXRhW01BWF9TRkJdOyAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIHNuciAoZm9ybWVybHkga25vd24gYXMgYm1heCkgKi8KKyAgRklYUF9EQkwgc2ZiTWluU25yTGREYXRhW01BWF9TRkJdOyAvKiBtaW5pbXVtIHNuciAoZm9ybWVybHkga25vd24gYXMgYm1heCkgKi8KIAogICBUTlNfQ09ORklHIHRuc0NvbmY7CiAgIFBOU19DT05GSUcgcG5zQ29uZjsKIAotICBJTlQgICAgICAgIGdyYW51bGVMZW5ndGg7Ci0gIElOVCAgICAgICAgYWxsb3dJUzsKKyAgSU5UIGdyYW51bGVMZW5ndGg7CisgIElOVCBhbGxvd0lTOworICBJTlQgYWxsb3dNUzsKK30gUFNZX0NPTkZJR1VSQVRJT047CiAKLX1QU1lfQ09ORklHVVJBVElPTjsKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgc2ZiQ250OyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNjYWxlZmFjdG9yIGJhbmRzICovCisgIFVDSEFSIHNmYldpZHRoW01BWF9TRkJfTE9OR107IC8qIFdpZHRoIG9mIHNjYWxlZmFjdG9yIGJhbmRzIGZvciBsb25nIGJsb2NrcyAqLworfSBTRkJfUEFSQU1fTE9ORzsKIAordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBzZmJDbnQ7IC8qIE51bWJlciBvZiBzY2FsZWZhY3RvciBiYW5kcyAqLworICBVQ0hBUgorICBzZmJXaWR0aFtNQVhfU0ZCX1NIT1JUXTsgLyogV2lkdGggb2Ygc2NhbGVmYWN0b3IgYmFuZHMgZm9yIHNob3J0IGJsb2NrcyAqLworfSBTRkJfUEFSQU1fU0hPUlQ7CiAKLXR5cGVkZWYgc3RydWN0ewotICAgIFVDSEFSIHNmYkNudDsgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2NhbGVmYWN0b3IgYmFuZHMgKi8KLSAgICBVQ0hBUiBzZmJXaWR0aFtNQVhfU0ZCX0xPTkddOyAgICAgLyogV2lkdGggb2Ygc2NhbGVmYWN0b3IgYmFuZHMgZm9yIGxvbmcgYmxvY2tzICovCi19U0ZCX1BBUkFNX0xPTkc7Ci0KLXR5cGVkZWYgc3RydWN0ewotICAgIFVDSEFSIHNmYkNudDsgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2NhbGVmYWN0b3IgYmFuZHMgKi8KLSAgICBVQ0hBUiBzZmJXaWR0aFtNQVhfU0ZCX1NIT1JUXTsgICAgLyogV2lkdGggb2Ygc2NhbGVmYWN0b3IgYmFuZHMgZm9yIHNob3J0IGJsb2NrcyAqLwotfVNGQl9QQVJBTV9TSE9SVDsKLQotCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdFBzeUNvbmZpZ3VyYXRpb24oSU5UICBiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgc2FtcGxlcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgIGJhbmR3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgIGJsb2NrdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgIGdyYW51bGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICB1c2VJUywKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0UHN5Q29uZmlndXJhdGlvbihJTlQgYml0cmF0ZSwgSU5UIHNhbXBsZXJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJhbmR3aWR0aCwgSU5UIGJsb2NrdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZ3JhbnVsZUxlbmd0aCwgSU5UIHVzZUlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB1c2VNUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTiAqcHN5Q29uZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQl9UWVBFIGZpbHRlcmJhbmspOwogCi0jZW5kaWYgLyogX1BTWV9DT05GSUdVUkFUSU9OX0ggKi8KLQotCi0KKyNlbmRpZiAvKiBQU1lfQ09ORklHVVJBVElPTl9IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3BzeV9jb25zdC5oIGIvbGliQUFDZW5jL3NyYy9wc3lfY29uc3QuaAppbmRleCBkOWM5ZjQzLi5jMmQ1MzA0IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL3BzeV9jb25zdC5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvcHN5X2NvbnN0LmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMzcgKzkwLDM0IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogR2xvYmFsIHBzeWNob2FjY291c3RpYyBjb25zdGFudHMKKyAgIEF1dGhvcihzKTogICBNLldlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9QU1lDT05TVF9ICi0jZGVmaW5lIF9QU1lDT05TVF9ICisgICBEZXNjcmlwdGlvbjogR2xvYmFsIHBzeWNob2FjY291c3RpYyBjb25zdGFudHMKIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBUUlVFICAxCisjaWZuZGVmIFBTWV9DT05TVF9ICisjZGVmaW5lIFBTWV9DT05TVF9ICisKKyNkZWZpbmUgVFJVRSAxCiAjZGVmaW5lIEZBTFNFIDAKIAotICAjZGVmaW5lIFRSQU5TX0ZBQyAgICAgICAgIDggIC8qIGVuY29kZXIgc2hvcnQgbG9uZyByYXRpbyAqLworI2RlZmluZSBUUkFOU19GQUMgOCAvKiBlbmNvZGVyIHNob3J0IGxvbmcgcmF0aW8gKi8KIAotI2RlZmluZSBGUkFNRV9NQVhMRU5fU0hPUlQgICAgKCgxMDI0KS9UUkFOU19GQUMpCi0jZGVmaW5lIEZSQU1FX0xFTl9TSE9SVF8xMjggICAoKDEwMjQpL1RSQU5TX0ZBQykKKyNkZWZpbmUgRlJBTUVfTUFYTEVOX1NIT1JUICgoMTAyNCkgLyBUUkFOU19GQUMpCisjZGVmaW5lIEZSQU1FX0xFTl9TSE9SVF8xMjggKCgxMDI0KSAvIFRSQU5TX0ZBQykKKyNkZWZpbmUgRlJBTUVfTEVOX1NIT1JUXzEyMCAoRlJBTUVfTEVOX0xPTkdfOTYwIC8gVFJBTlNfRkFDKQogCiAvKiBGaWx0ZXJiYW5rIHR5cGUqLwotZW51bSBGQl9UWVBFIHsKLSAgRkJfTEMgID0gMCwKLSAgRkJfTEQgID0gMSwKLSAgRkJfRUxEID0gMgotfTsKK2VudW0gRkJfVFlQRSB7IEZCX0xDID0gMCwgRkJfTEQgPSAxLCBGQl9FTEQgPSAyIH07CiAKIC8qIEJsb2NrIHR5cGVzICovCiAjZGVmaW5lIE5fQkxPQ0tUWVBFUyA2Ci1lbnVtCi17CitlbnVtIHsKICAgTE9OR19XSU5ET1cgPSAwLAogICBTVEFSVF9XSU5ET1csCiAgIFNIT1JUX1dJTkRPVywKQEAgLTExOSw0MiArMTI3LDQyIEBACiB9OwogCiAvKiBXaW5kb3cgc2hhcGVzICovCi1lbnVtCi17CitlbnVtIHsKICAgU0lORV9XSU5ET1cgPSAwLAotICBLQkRfV0lORE9XICA9IDEsCisgIEtCRF9XSU5ET1cgPSAxLAogICBMT0xfV0lORE9XID0gMiAvKiBMb3cgT3ZlckxhcCB3aW5kb3cgc2hhcGUgZm9yIEFBQy1MRCAqLwogfTsKIAogLyoKICAgTVMgc3R1ZmYKICovCi1lbnVtCi17Ci0gIFNJX01TX01BU0tfTk9ORSA9IDAsCi0gIFNJX01TX01BU0tfU09NRSA9IDEsCi0gIFNJX01TX01BU0tfQUxMICA9IDIKLX07CitlbnVtIHsgU0lfTVNfTUFTS19OT05FID0gMCwgU0lfTVNfTUFTS19TT01FID0gMSwgU0lfTVNfTUFTS19BTEwgPSAyIH07CiAKKyNkZWZpbmUgTUFYX05PX09GX0dST1VQUyA0CisjZGVmaW5lIE1BWF9TRkJfTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgNTEgLyogNTEgZm9yIGEgbWVtb3J5IG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiwgbWF5YmUgNjQgZm9yIGNvbnZlbmllbnQgXAorICAgICAgICBkZWJ1Z2dpbmcgKi8KKyNkZWZpbmUgTUFYX1NGQl9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAxNSAvKiAxNSBmb3IgYSBtZW1vcnkgb3B0aW1pemVkIGltcGxlbWVudGF0aW9uLCBtYXliZSAxNiBmb3IgY29udmVuaWVudCBcCisgICAgICAgIGRlYnVnZ2luZyAqLwogCi0gICNkZWZpbmUgTUFYX05PX09GX0dST1VQUyAgIDQKLSAgI2RlZmluZSBNQVhfU0ZCX0xPTkcgICAgICAgNTEgIC8qIDUxIGZvciBhIG1lbW9yeSBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24sIG1heWJlIDY0IGZvciBjb252ZW5pZW50IGRlYnVnZ2luZyAqLwotICAjZGVmaW5lIE1BWF9TRkJfU0hPUlQgICAgICAxNSAgLyogMTUgZm9yIGEgbWVtb3J5IG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiwgbWF5YmUgMTYgZm9yIGNvbnZlbmllbnQgZGVidWdnaW5nICovCisjZGVmaW5lIE1BWF9TRkIgXAorICAoTUFYX1NGQl9TSE9SVCA+IE1BWF9TRkJfTE9ORyA/IE1BWF9TRkJfU0hPUlQgOiBNQVhfU0ZCX0xPTkcpIC8qID0gNTEgKi8KKyNkZWZpbmUgTUFYX0dST1VQRURfU0ZCICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKE1BWF9OT19PRl9HUk9VUFMgKiBNQVhfU0ZCX1NIT1JUID4gTUFYX1NGQl9MT05HIFwKKyAgICAgICA/IE1BWF9OT19PRl9HUk9VUFMgKiBNQVhfU0ZCX1NIT1JUICAgICAgICAgIFwKKyAgICAgICA6IE1BWF9TRkJfTE9ORykgLyogPSA2MCAqLwogCi0jZGVmaW5lIE1BWF9TRkIgICAgICAgICAoTUFYX1NGQl9TSE9SVCA+IE1BWF9TRkJfTE9ORyA/IE1BWF9TRkJfU0hPUlQgOiBNQVhfU0ZCX0xPTkcpICAgLyogPSA1MSAqLwotI2RlZmluZSBNQVhfR1JPVVBFRF9TRkIgKE1BWF9OT19PRl9HUk9VUFMqTUFYX1NGQl9TSE9SVCA+IE1BWF9TRkJfTE9ORyA/IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfTk9fT0ZfR1JPVVBTKk1BWF9TRkJfU0hPUlQgOiBNQVhfU0ZCX0xPTkcpIC8qID0gNjAgKi8KKyNkZWZpbmUgTUFYX0lOUFVUX0JVRkZFUl9TSVpFICgyICogKDEwMjQpKSAvKiAyMDQ4ICovCiAKLSNkZWZpbmUgTUFYX0lOUFVUX0JVRkZFUl9TSVpFICAoMiooMTAyNCkpICAgLyogMjA0OCAqLworI2RlZmluZSBQQ01fTEVWRUwgMS4wZgorI2RlZmluZSBOT1JNX1BDTSAoUENNX0xFVkVMIC8gMzI3NjguMGYpCisjZGVmaW5lIE5PUk1fUENNX0VORVJHWSAoTk9STV9QQ00gKiBOT1JNX1BDTSkKKyNkZWZpbmUgTE9HX05PUk1fUENNIC0xNQogCisjZGVmaW5lIFROU19QUkVER0FJTl9TQ0FMRSAoMTAwMCkKIAotI2RlZmluZSBQQ01fTEVWRUwgICAgICAgICAgICAgMS4wZgotI2RlZmluZSBOT1JNX1BDTSAgICAgICAgICAgICAgKFBDTV9MRVZFTC8zMjc2OC4wZikKLSNkZWZpbmUgTk9STV9QQ01fRU5FUkdZICAgICAgIChOT1JNX1BDTSpOT1JNX1BDTSkKLSNkZWZpbmUgTE9HX05PUk1fUENNICAgICAgICAgIC0xNQorI2RlZmluZSBMRkVfTE9XUEFTU19MSU5FIDEyCisjZGVmaW5lIExGRV9MT1dQQVNTX0xJTkVfTUlOIDQKIAotI2RlZmluZSBUTlNfUFJFREdBSU5fU0NBTEUgICAgKDEwMDApCi0KLSNkZWZpbmUgTEZFX0xPV1BBU1NfTElORSAgICAgIDEyCi0KLSNlbmRpZiAvKiBfUFNZQ09OU1RfSCAqLworI2VuZGlmIC8qIFBTWV9DT05TVF9IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3BzeV9kYXRhLmggYi9saWJBQUNlbmMvc3JjL3BzeV9kYXRhLmgKaW5kZXggNzE4Mzk1NS4uZmMwNDczNCAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9wc3lfZGF0YS5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvcHN5X2RhdGEuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3NCArOTAsODAgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBQc3ljaG9hY2NvdXN0aWMgZGF0YQorICAgQXV0aG9yKHMpOiAgIE0uV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBQc3ljaG9hY2NvdXN0aWMgZGF0YQogCi0jaWZuZGVmIF9QU1lfREFUQV9ICi0jZGVmaW5lIF9QU1lfREFUQV9ICisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZuZGVmIFBTWV9EQVRBX0gKKyNkZWZpbmUgUFNZX0RBVEFfSAogCiAjaW5jbHVkZSAiYmxvY2tfc3dpdGNoLmgiCisjaW5jbHVkZSAibWRjdC5oIgogCiAvKiBCZSBjYXJlZnVsIHdpdGggTUFYX1NGQl9MT05HIGFzIGxlbmd0aCBvZiB0aGUgLkxvbmcgYXJyYXlzLgotICogc2ZiRW5lcmd5LkxvbmcgYW5kIHNmYkVuZXJneU1TLkxvbmcgYW5kIHNmYlRocmVzaG9sZC5Mb25nIGFyZSB1c2VkIGFzIGEgdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIHRoZSByZWdyb3VwZWQKLSAqIHNob3J0IGVuZXJnaWVzIGFuZCB0aHJlc2hvbGRzIGJldHdlZW4gRkRLYWFjRW5jX2dyb3VwU2hvcnREYXRhKCkgYW5kIEJ1aWxkSW50ZXJmYWNlKCkgaW4gRkRLYWFjRW5jX3BzeU1haW4oKS4KLSAqIFRoZSBzcGFjZSByZXF1aXJlZCBmb3IgdGhpcyBpcyBNQVhfR1JPVVBFRF9TRkIgKCA9IE1BWF9OT19PRl9HUk9VUFMqTUFYX1NGQl9TSE9SVCApLgotICogSG93ZXZlciwgdGhpcyBpcyBub3QgaW1wb3J0YW50IGlmIHVuaW9ucyBhcmUgdXNlZCAod2hpY2ggaXMgbm90IHBvc3NpYmxlIHdpdGggcGZsb2F0KS4gKi8KKyAqIHNmYkVuZXJneS5Mb25nIGFuZCBzZmJFbmVyZ3lNUy5Mb25nIGFuZCBzZmJUaHJlc2hvbGQuTG9uZyBhcmUgdXNlZCBhcyBhCisgKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgdGhlIHJlZ3JvdXBlZCBzaG9ydCBlbmVyZ2llcyBhbmQgdGhyZXNob2xkcyBiZXR3ZWVuCisgKiBGREthYWNFbmNfZ3JvdXBTaG9ydERhdGEoKSBhbmQgQnVpbGRJbnRlcmZhY2UoKSBpbiBGREthYWNFbmNfcHN5TWFpbigpLiBUaGUKKyAqIHNwYWNlIHJlcXVpcmVkIGZvciB0aGlzIGlzIE1BWF9HUk9VUEVEX1NGQiAoID0gTUFYX05PX09GX0dST1VQUypNQVhfU0ZCX1NIT1JUCisgKiApLiBIb3dldmVyLCB0aGlzIGlzIG5vdCBpbXBvcnRhbnQgaWYgdW5pb25zIGFyZSB1c2VkICh3aGljaCBpcyBub3QgcG9zc2libGUKKyAqIHdpdGggcGZsb2F0KS4gKi8KIAotdHlwZWRlZiBzaG91bGRCZVVuaW9uewotICBGSVhQX0RCTCAgTG9uZ1tNQVhfR1JPVVBFRF9TRkJdOwotICBGSVhQX0RCTCAgU2hvcnRbVFJBTlNfRkFDXVtNQVhfU0ZCX1NIT1JUXTsKLX1TRkJfVEhSRVNIT0xEOwordHlwZWRlZiBzaG91bGRCZVVuaW9uIHsKKyAgRklYUF9EQkwgTG9uZ1tNQVhfR1JPVVBFRF9TRkJdOworICBGSVhQX0RCTCBTaG9ydFtUUkFOU19GQUNdW01BWF9TRkJfU0hPUlRdOworfQorU0ZCX1RIUkVTSE9MRDsKIAotdHlwZWRlZiBzaG91bGRCZVVuaW9uewotICBGSVhQX0RCTCAgTG9uZ1tNQVhfR1JPVVBFRF9TRkJdOwotICBGSVhQX0RCTCAgU2hvcnRbVFJBTlNfRkFDXVtNQVhfU0ZCX1NIT1JUXTsKLX1TRkJfRU5FUkdZOwordHlwZWRlZiBzaG91bGRCZVVuaW9uIHsKKyAgRklYUF9EQkwgTG9uZ1tNQVhfR1JPVVBFRF9TRkJdOworICBGSVhQX0RCTCBTaG9ydFtUUkFOU19GQUNdW01BWF9TRkJfU0hPUlRdOworfQorU0ZCX0VORVJHWTsKIAotdHlwZWRlZiBzaG91bGRCZVVuaW9uewotICBGSVhQX0RCTCAgTG9uZ1tNQVhfR1JPVVBFRF9TRkJdOwotICBGSVhQX0RCTCAgU2hvcnRbVFJBTlNfRkFDXVtNQVhfU0ZCX1NIT1JUXTsKLX1TRkJfTERfRU5FUkdZOwordHlwZWRlZiBzaG91bGRCZVVuaW9uIHsKKyAgRklYUF9EQkwgTG9uZ1tNQVhfR1JPVVBFRF9TRkJdOworICBGSVhQX0RCTCBTaG9ydFtUUkFOU19GQUNdW01BWF9TRkJfU0hPUlRdOworfQorU0ZCX0xEX0VORVJHWTsKIAotdHlwZWRlZiBzaG91bGRCZVVuaW9uewotICBJTlQgIExvbmdbTUFYX0dST1VQRURfU0ZCXTsKLSAgSU5UICBTaG9ydFtUUkFOU19GQUNdW01BWF9TRkJfU0hPUlRdOwotfVNGQl9NQVhfU0NBTEU7Cit0eXBlZGVmIHNob3VsZEJlVW5pb24geworICBJTlQgTG9uZ1tNQVhfR1JPVVBFRF9TRkJdOworICBJTlQgU2hvcnRbVFJBTlNfRkFDXVtNQVhfU0ZCX1NIT1JUXTsKK30KK1NGQl9NQVhfU0NBTEU7CiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UX1BDTSogcHN5SW5wdXRCdWZmZXI7CisgIEZJWFBfREJMIG92ZXJsYXBBZGRCdWZmZXJbMyAqIDUxMiAvIDJdOwogCi10eXBlZGVmIHN0cnVjdHsKLSAgSU5UX1BDTSogICAgICAgICAgICAgICAgICBwc3lJbnB1dEJ1ZmZlcjsKLSAgRklYUF9EQkwgICAgICAgICAgICAgICAgICBvdmVybGFwQWRkQnVmZmVyWzEwMjRdOworICBtZGN0X3QgbWRjdFBlcnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1EQ1QgcGVyc2lzdGVudCBkYXRhICovCisgIEJMT0NLX1NXSVRDSElOR19DT05UUk9MIGJsb2NrU3dpdGNoaW5nQ29udHJvbDsgLyogYmxvY2sgc3dpdGNoaW5nICovCisgIEZJWFBfREJMIHNmYlRocmVzaG9sZG5tMVtNQVhfU0ZCXTsgICAgICAgICAgICAgLyogRkRLYWFjRW5jX1ByZUVjaG9Db250cm9sICovCisgIElOVCBtZGN0U2NhbGVubTE7IC8qIHNjYWxlIG9mIGxhc3QgYmxvY2sncyBtZGN0IChGREthYWNFbmNfUHJlRWNob0NvbnRyb2wpICovCisgIElOVCBjYWxjUHJlRWNobzsKKyAgSU5UIGlzTEZFOworfSBQU1lfU1RBVElDOwogCi0gIEJMT0NLX1NXSVRDSElOR19DT05UUk9MICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sOyAgICAgICAgICAgICAgLyogYmxvY2sgc3dpdGNoaW5nICovCi0gIEZJWFBfREJMICAgICAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkbm0xW01BWF9TRkJdOyAgICAgICAgICAgLyogRkRLYWFjRW5jX1ByZUVjaG9Db250cm9sICovCi0gIElOVCAgICAgICAgICAgICAgICAgICAgICAgbWRjdFNjYWxlbm0xOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgb2YgbGFzdCBibG9jaydzIG1kY3QgKEZES2FhY0VuY19QcmVFY2hvQ29udHJvbCkgKi8KLSAgSU5UICAgICAgICAgICAgICAgICAgICAgICBjYWxjUHJlRWNobzsKLSAgSU5UICAgICAgICAgICAgICAgICAgICAgICBpc0xGRTsKLX1QU1lfU1RBVElDOwordHlwZWRlZiBzdHJ1Y3QgeworICBGSVhQX0RCTCogbWRjdFNwZWN0cnVtOworICBTRkJfVEhSRVNIT0xEIHNmYlRocmVzaG9sZDsgICAgLyogYWRhcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU0ZCX0VORVJHWSBzZmJFbmVyZ3k7ICAgICAgICAgIC8qIHNmYiBlbmVyZ2llcyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNGQl9MRF9FTkVSR1kgc2ZiRW5lcmd5TGREYXRhOyAvKiBzZmIgZW5lcmdpZXMgaW4gbGREYXRhIGZvcm1hdCAgICAgICAgICAqLworICBTRkJfTUFYX1NDQUxFIHNmYk1heFNjYWxlU3BlYzsKKyAgU0ZCX0VORVJHWSBzZmJFbmVyZ3lNUzsgLyogbWlkL3NpZGUgc2ZiIGVuZXJnaWVzICAgICAgICAgICAgICAgICAgKi8KKyAgRklYUF9EQkwgc2ZiRW5lcmd5TVNMZERhdGFbTUFYX0dST1VQRURfU0ZCXTsgLyogbWlkL3NpZGUgc2ZiIGVuZXJnaWVzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxkRGF0YSBmb3JtYXQgKi8KKyAgU0ZCX0VORVJHWSBzZmJTcHJlYWRFbmVyZ3k7CisgIElOVCBtZGN0U2NhbGU7IC8qIGV4cG9uZW50IG9mIGRhdGEgaW4gbWRjdFNwZWN0cnVtICAgICAgICovCisgIElOVCBncm91cGVkU2ZiT2Zmc2V0W01BWF9HUk9VUEVEX1NGQiArIDFdOworICBJTlQgc2ZiQWN0aXZlOworICBJTlQgbG93cGFzc0xpbmU7Cit9IFBTWV9EQVRBOwogCi0KLXR5cGVkZWYgc3RydWN0ewotICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgKm1kY3RTcGVjdHJ1bTsKLSAgU0ZCX1RIUkVTSE9MRCAgICAgICAgICAgICBzZmJUaHJlc2hvbGQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGFwdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBTRkJfRU5FUkdZICAgICAgICAgICAgICAgIHNmYkVuZXJneTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNmYiBlbmVyZ2llcyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFNGQl9MRF9FTkVSR1kgICAgICAgICAgICAgc2ZiRW5lcmd5TGREYXRhOyAgICAgICAgICAgICAgICAgICAgLyogc2ZiIGVuZXJnaWVzIGluIGxkRGF0YSBmb3JtYXQgICAgICAgICAgKi8KLSAgU0ZCX01BWF9TQ0FMRSAgICAgICAgICAgICBzZmJNYXhTY2FsZVNwZWM7Ci0gIFNGQl9FTkVSR1kgICAgICAgICAgICAgICAgc2ZiRW5lcmd5TVM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWlkL3NpZGUgc2ZiIGVuZXJnaWVzICAgICAgICAgICAgICAgICAgKi8KLSAgRklYUF9EQkwgICAgICAgICAgICAgICAgICBzZmJFbmVyZ3lNU0xkRGF0YVtNQVhfR1JPVVBFRF9TRkJdOyAvKiBtaWQvc2lkZSBzZmIgZW5lcmdpZXMgaW4gbGREYXRhIGZvcm1hdCAqLwotICBTRkJfRU5FUkdZICAgICAgICAgICAgICAgIHNmYlNwcmVhZEVuZXJneTsKLSAgSU5UICAgICAgICAgICAgICAgICAgICAgICBtZGN0U2NhbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHBvbmVudCBvZiBkYXRhIGluIG1kY3RTcGVjdHJ1bSAgICAgICAqLwotICBJTlQgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRTZmJPZmZzZXRbTUFYX0dST1VQRURfU0ZCKzFdOwotICBJTlQgICAgICAgICAgICAgICAgICAgICAgIHNmYkFjdGl2ZTsKLSAgSU5UICAgICAgICAgICAgICAgICAgICAgICBsb3dwYXNzTGluZTsKLX1QU1lfREFUQTsKLQotCi0jZW5kaWYgLyogX1BTWV9EQVRBX0ggKi8KKyNlbmRpZiAvKiBQU1lfREFUQV9IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3BzeV9tYWluLmNwcCBiL2xpYkFBQ2VuYy9zcmMvcHN5X21haW4uY3BwCmluZGV4IDQ0NmM4OTQuLmY2MzQ1ZTQgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvcHN5X21haW4uY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvcHN5X21haW4uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IFBzeWNob2FjY291c3RpYyBtYWpvciBmdW5jdGlvbiBibG9jaworICAgQXV0aG9yKHMpOiAgIE0uV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBQc3ljaG9hY2NvdXN0aWMgbWFqb3IgZnVuY3Rpb24gYmxvY2sKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInBzeV9jb25zdC5oIgogCkBAIC0xMDcsMTUgKzExOSwxMyBAQAogI2luY2x1ZGUgImFhY0VuY19yYW0uaCIKICNpbmNsdWRlICJpbnRlbnNpdHkuaCIKIAotCi0KIC8qIGJsZW5kaW5nIHRvIHJlZHVjZSBnaWJicyBhcnRpZmFjdHMgKi8KICNkZWZpbmUgRkFERV9PVVRfTEVOIDYKLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBmYWRlT3V0RmFjdG9yW0ZBREVfT1VUX0xFTl0gPSB7MTg0MDY0NDA5NiwgMTUzMzg3MDA4MCwgMTIyNzA5NjA2NCwgOTIwMzIyMDQ4LCA2MTM1NDgwMzIsIDMwNjc3NDAxNn07CitzdGF0aWMgY29uc3QgRklYUF9EQkwgZmFkZU91dEZhY3RvcltGQURFX09VVF9MRU5dID0geworICAgIDE4NDA2NDQwOTYsIDE1MzM4NzAwODAsIDEyMjcwOTYwNjQsIDkyMDMyMjA0OCwgNjEzNTQ4MDMyLCAzMDY3NzQwMTZ9OwogCiAvKiBmb3J3YXJkIGRlZmluaXRpb25zICovCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19Qc3lOZXcKQEAgLTEyNCw1NiArMTM0LDUyIEBACiAgICAgaW5wdXQ6ICAgICAgICBwb2ludGVyIHRvIGEgcHN5Y2ggaGFuZGxlCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1BzeU5ldyhQU1lfSU5URVJOQUwgICoqcGhwc3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBuRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBuQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsVUNIQVIgICAgICAgICAgKmR5bmFtaWNfUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzOwotICAgIFBTWV9JTlRFUk5BTCAqaFBzeTsKLSAgICBJTlQgaTsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Qc3lOZXcoUFNZX0lOVEVSTkFMICoqcGhwc3ksIGNvbnN0IElOVCBuRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsIFVDSEFSICpkeW5hbWljX1JBTSkgeworICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKKyAgUFNZX0lOVEVSTkFMICpoUHN5OworICBJTlQgaTsKIAotICAgIGhQc3kgPSBHZXRSYW1fYWFjRW5jX1BzeUludGVybmFsKCk7Ci0gICAgKnBocHN5ID0gaFBzeTsKLSAgICBpZiAoaFBzeSA9PSBOVUxMKSB7CisgIGhQc3kgPSBHZXRSYW1fYWFjRW5jX1BzeUludGVybmFsKCk7CisgICpwaHBzeSA9IGhQc3k7CisgIGlmIChoUHN5ID09IE5VTEwpIHsKKyAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBuRWxlbWVudHM7IGkrKykgeworICAgIC8qIFBTWV9FTEVNRU5UICovCisgICAgaFBzeS0+cHN5RWxlbWVudFtpXSA9IEdldFJhbV9hYWNFbmNfUHN5RWxlbWVudChpKTsKKyAgICBpZiAoaFBzeS0+cHN5RWxlbWVudFtpXSA9PSBOVUxMKSB7CiAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOwogICAgICAgZ290byBiYWlsOwogICAgIH0KKyAgfQogCi0gICAgZm9yIChpPTA7IGk8bkVsZW1lbnRzOyBpKyspIHsKLSAgICAgICAgLyogUFNZX0VMRU1FTlQgKi8KLSAgICAgICAgaFBzeS0+cHN5RWxlbWVudFtpXSA9IEdldFJhbV9hYWNFbmNfUHN5RWxlbWVudChpKTsKLSAgICAgICAgaWYgKGhQc3ktPnBzeUVsZW1lbnRbaV0gPT0gTlVMTCkgewotICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7Ci0gICAgICAgICAgZ290byBiYWlsOwotICAgICAgICB9CisgIGZvciAoaSA9IDA7IGkgPCBuQ2hhbm5lbHM7IGkrKykgeworICAgIC8qIFBTWV9TVEFUSUMgKi8KKyAgICBoUHN5LT5wU3RhdGljQ2hhbm5lbHNbaV0gPSBHZXRSYW1fYWFjRW5jX1BzeVN0YXRpYyhpKTsKKyAgICBpZiAoaFBzeS0+cFN0YXRpY0NoYW5uZWxzW2ldID09IE5VTEwpIHsKKyAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CisgICAgICBnb3RvIGJhaWw7CiAgICAgfQotCi0gICAgZm9yIChpPTA7IGk8bkNoYW5uZWxzOyBpKyspIHsKLSAgICAgICAgLyogUFNZX1NUQVRJQyAqLwotICAgICAgICBoUHN5LT5wU3RhdGljQ2hhbm5lbHNbaV0gPSBHZXRSYW1fYWFjRW5jX1BzeVN0YXRpYyhpKTsKLSAgICAgICAgaWYgKGhQc3ktPnBTdGF0aWNDaGFubmVsc1tpXT09TlVMTCkgewotICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7Ci0gICAgICAgICAgZ290byBiYWlsOwotICAgICAgICB9Ci0gICAgICAgIC8qIEFVRElPIElOUFVUIEJVRkZFUiAqLwotICAgICAgICBoUHN5LT5wU3RhdGljQ2hhbm5lbHNbaV0tPnBzeUlucHV0QnVmZmVyID0gR2V0UmFtX2FhY0VuY19Qc3lJbnB1dEJ1ZmZlcihpKTsKLSAgICAgICAgaWYgKGhQc3ktPnBTdGF0aWNDaGFubmVsc1tpXS0+cHN5SW5wdXRCdWZmZXI9PU5VTEwpIHsKLSAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOwotICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgfQorICAgIC8qIEFVRElPIElOUFVUIEJVRkZFUiAqLworICAgIGhQc3ktPnBTdGF0aWNDaGFubmVsc1tpXS0+cHN5SW5wdXRCdWZmZXIgPSBHZXRSYW1fYWFjRW5jX1BzeUlucHV0QnVmZmVyKGkpOworICAgIGlmIChoUHN5LT5wU3RhdGljQ2hhbm5lbHNbaV0tPnBzeUlucHV0QnVmZmVyID09IE5VTEwpIHsKKyAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CisgICAgICBnb3RvIGJhaWw7CiAgICAgfQorICB9CiAKLSAgICAvKiByZXVzYWJsZSBwc3ljaCBtZW1vcnkgKi8KLSAgICBoUHN5LT5wc3lEeW5hbWljID0gR2V0UmFtX2FhY0VuY19Qc3lEeW5hbWljKDAsIGR5bmFtaWNfUkFNKTsKKyAgLyogcmV1c2FibGUgcHN5Y2ggbWVtb3J5ICovCisgIGhQc3ktPnBzeUR5bmFtaWMgPSBHZXRSYW1fYWFjRW5jX1BzeUR5bmFtaWMoMCwgZHluYW1pY19SQU0pOwogCi0gICAgcmV0dXJuIEFBQ19FTkNfT0s7CisgIHJldHVybiBBQUNfRU5DX09LOwogCiBiYWlsOgotICAgRkRLYWFjRW5jX1BzeUNsb3NlKHBocHN5LCBOVUxMKTsKKyAgRkRLYWFjRW5jX1BzeUNsb3NlKHBocHN5LCBOVUxMKTsKIAotICAgcmV0dXJuIEVycm9yU3RhdHVzOworICByZXR1cm4gRXJyb3JTdGF0dXM7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTg0LDE4ICsxOTAsMTQgQEAKICAgICBpbnB1dDogICAgICAgIHBvaW50ZXIgdG8gYSBwc3ljaCBoYW5kbGUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUHN5T3V0TmV3KFBTWV9PVVQgICAqKnBocHN5T3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBuRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgblN1YkZyYW1lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiAgICAgICpkeW5hbWljX1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Qc3lPdXROZXcoUFNZX09VVCAqKnBocHN5T3V0LCBjb25zdCBJTlQgbkVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzLCBjb25zdCBJTlQgblN1YkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmR5bmFtaWNfUkFNKSB7CiAgIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzOwogICBpbnQgbiwgaTsKICAgaW50IGVsSW5jID0gMCwgY2hJbmMgPSAwOwogCi0gIGZvciAobj0wOyBuPG5TdWJGcmFtZXM7IG4rKykgeworICBmb3IgKG4gPSAwOyBuIDwgblN1YkZyYW1lczsgbisrKSB7CiAgICAgcGhwc3lPdXRbbl0gPSBHZXRSYW1fYWFjRW5jX1BzeU91dChuKTsKIAogICAgIGlmIChwaHBzeU91dFtuXSA9PSBOVUxMKSB7CkBAIC0yMDMsMTEgKzIwNSwxNSBAQAogICAgICAgZ290byBiYWlsOwogICAgIH0KIAotICAgIGZvciAoaT0wOyBpPG5DaGFubmVsczsgaSsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IG5DaGFubmVsczsgaSsrKSB7CiAgICAgICBwaHBzeU91dFtuXS0+cFBzeU91dENoYW5uZWxzW2ldID0gR2V0UmFtX2FhY0VuY19Qc3lPdXRDaGFubmVsKGNoSW5jKyspOworICAgICAgaWYgKE5VTEwgPT0gcGhwc3lPdXRbbl0tPnBQc3lPdXRDaGFubmVsc1tpXSkgeworICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CiAgICAgfQogCi0gICAgZm9yIChpPTA7IGk8bkVsZW1lbnRzOyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbkVsZW1lbnRzOyBpKyspIHsKICAgICAgIHBocHN5T3V0W25dLT5wc3lPdXRFbGVtZW50W2ldID0gR2V0UmFtX2FhY0VuY19Qc3lPdXRFbGVtZW50cyhlbEluYysrKTsKICAgICAgIGlmIChwaHBzeU91dFtuXS0+cHN5T3V0RWxlbWVudFtpXSA9PSBOVUxMKSB7CiAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CkBAIC0yMjMsNjMgKzIyOSw1OSBAQAogICByZXR1cm4gRXJyb3JTdGF0dXM7CiB9CiAKLQotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3BzeUluaXRTdGF0ZXMoUFNZX0lOVEVSTkFMICAgICpoUHN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX1NUQVRJQyogcHN5U3RhdGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgYXVkaW9PYmplY3RUeXBlKQoteworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3BzeUluaXRTdGF0ZXMoUFNZX0lOVEVSTkFMICpoUHN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX1NUQVRJQyAqcHN5U3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgYXVkaW9PYmplY3RUeXBlKSB7CiAgIC8qIGluaXQgaW5wdXQgYnVmZmVyICovCi0gIEZES21lbWNsZWFyKHBzeVN0YXRpYy0+cHN5SW5wdXRCdWZmZXIsIE1BWF9JTlBVVF9CVUZGRVJfU0laRSpzaXplb2YoSU5UX1BDTSkpOworICBGREttZW1jbGVhcihwc3lTdGF0aWMtPnBzeUlucHV0QnVmZmVyLAorICAgICAgICAgICAgICBNQVhfSU5QVVRfQlVGRkVSX1NJWkUgKiBzaXplb2YoSU5UX1BDTSkpOwogCiAgIEZES2FhY0VuY19Jbml0QmxvY2tTd2l0Y2hpbmcoJnBzeVN0YXRpYy0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xvd0RlbGF5KGF1ZGlvT2JqZWN0VHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTG93RGVsYXkoYXVkaW9PYmplY3RUeXBlKSk7CiAKICAgcmV0dXJuIEFBQ19FTkNfT0s7CiB9CiAKLQotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3BzeUluaXQoUFNZX0lOVEVSTkFMICAgICpoUHN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVCAgICAgICAgKipwaHBzeU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgblN1YkZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgbk1heENoYW5uZWxzLAorQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3BzeUluaXQoUFNZX0lOVEVSTkFMICpoUHN5LCBQU1lfT1VUICoqcGhwc3lPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgblN1YkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuTWF4Q2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb09iamVjdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcgKmNtKQoteworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HICpjbSkgewogICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1cyA9IEFBQ19FTkNfT0s7CiAgIGludCBpLCBjaCwgbiwgY2hJbmMgPSAwLCByZXNldENoYW5uZWxzID0gMzsKIAotICBpZiAoIChuTWF4Q2hhbm5lbHM+MikgJiYgKGNtLT5uQ2hhbm5lbHM9PTIpICkgeworICBpZiAoKG5NYXhDaGFubmVscyA+IDIpICYmIChjbS0+bkNoYW5uZWxzID09IDIpKSB7CiAgICAgY2hJbmMgPSAxOwogICAgIEZES2FhY0VuY19wc3lJbml0U3RhdGVzKGhQc3ksIGhQc3ktPnBTdGF0aWNDaGFubmVsc1swXSwgYXVkaW9PYmplY3RUeXBlKTsKICAgfQogCi0gIGlmICggKG5NYXhDaGFubmVscz09MikgKSB7CisgIGlmICgobk1heENoYW5uZWxzID09IDIpKSB7CiAgICAgcmVzZXRDaGFubmVscyA9IDA7CiAgIH0KIAotICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspIHsKLSAgICBmb3IgKGNoPTA7IGNoPGNtLT5lbEluZm9baV0ubkNoYW5uZWxzSW5FbDsgY2grKykgewotICAgICAgaWYgKGNtLT5lbEluZm9baV0uZWxUeXBlIT1JRF9MRkUpIHsKLSAgICAgICAgaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXSA9IGhQc3ktPnBTdGF0aWNDaGFubmVsc1tjaEluY107Ci0gICAgICAgIGlmIChjaEluYz49cmVzZXRDaGFubmVscykgewotICAgICAgICAgICAgRkRLYWFjRW5jX3BzeUluaXRTdGF0ZXMoaFBzeSwgaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXSwgYXVkaW9PYmplY3RUeXBlKTsKKyAgZm9yIChpID0gMDsgaSA8IGNtLT5uRWxlbWVudHM7IGkrKykgeworICAgIGZvciAoY2ggPSAwOyBjaCA8IGNtLT5lbEluZm9baV0ubkNoYW5uZWxzSW5FbDsgY2grKykgeworICAgICAgaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXSA9IGhQc3ktPnBTdGF0aWNDaGFubmVsc1tjaEluY107CisgICAgICBpZiAoY20tPmVsSW5mb1tpXS5lbFR5cGUgIT0gSURfTEZFKSB7CisgICAgICAgIGlmIChjaEluYyA+PSByZXNldENoYW5uZWxzKSB7CisgICAgICAgICAgRkRLYWFjRW5jX3BzeUluaXRTdGF0ZXMoaFBzeSwgaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb09iamVjdFR5cGUpOwogICAgICAgICB9CisgICAgICAgIG1kY3RfaW5pdCgmKGhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0tPm1kY3RQZXJzKSwgTlVMTCwgMCk7CiAgICAgICAgIGhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0tPmlzTEZFID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBoUHN5LT5wc3lFbGVtZW50W2ldLT5wc3lTdGF0aWNbY2hdID0gaFBzeS0+cFN0YXRpY0NoYW5uZWxzW25NYXhDaGFubmVscy0xXTsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIGhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0tPmlzTEZFID0gMTsKICAgICAgIH0KICAgICAgIGNoSW5jKys7CiAgICAgfQogICB9CiAKLSAgZm9yIChuPTA7IG48blN1YkZyYW1lczsgbisrKSB7CisgIGZvciAobiA9IDA7IG4gPCBuU3ViRnJhbWVzOyBuKyspIHsKICAgICBjaEluYyA9IDA7Ci0gICAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKSB7Ci0gICAgICBmb3IgKGNoPTA7IGNoPGNtLT5lbEluZm9baV0ubkNoYW5uZWxzSW5FbDsgY2grKykgewotICAgICAgICBwaHBzeU91dFtuXS0+cHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbFtjaF0gPSBwaHBzeU91dFtuXS0+cFBzeU91dENoYW5uZWxzW2NoSW5jKytdOworICAgIGZvciAoaSA9IDA7IGkgPCBjbS0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNtLT5lbEluZm9baV0ubkNoYW5uZWxzSW5FbDsgY2grKykgeworICAgICAgICBwaHBzeU91dFtuXS0+cHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbFtjaF0gPQorICAgICAgICAgICAgcGhwc3lPdXRbbl0tPnBQc3lPdXRDaGFubmVsc1tjaEluYysrXTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTI4Nyw3ICsyODksNiBAQAogICByZXR1cm4gRXJyb3JTdGF0dXM7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19wc3lNYWluSW5pdApAQCAtMjk2LDEzOSArMjk3LDEwNCBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3BzeU1haW5Jbml0KFBTWV9JTlRFUk5BTCAqaFBzeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb09iamVjdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HICpjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZ3JhbnVsZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdG5zTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYmFuZHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB1c2VQbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHVzZUlTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgaW5pdEZsYWdzKQoteworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3BzeU1haW5Jbml0KAorICAgIFBTWV9JTlRFUk5BTCAqaFBzeSwgQVVESU9fT0JKRUNUX1RZUEUgYXVkaW9PYmplY3RUeXBlLCBDSEFOTkVMX01BUFBJTkcgKmNtLAorICAgIElOVCBzYW1wbGVSYXRlLCBJTlQgZ3JhbnVsZUxlbmd0aCwgSU5UIGJpdFJhdGUsIElOVCB0bnNNYXNrLCBJTlQgYmFuZHdpZHRoLAorICAgIElOVCB1c2VQbnMsIElOVCB1c2VJUywgSU5UIHVzZU1TLCBVSU5UIHN5bnRheEZsYWdzLCBVTE9ORyBpbml0RmxhZ3MpIHsKICAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7CiAgIGludCBpLCBjaDsKICAgaW50IGNoYW5uZWxzRWZmID0gY20tPm5DaGFubmVsc0VmZjsKICAgaW50IHRuc0NoYW5uZWxzID0gMDsKICAgRkJfVFlQRSBmaWx0ZXJCYW5rOwogCi0KLSAgc3dpdGNoKEZES2FhY0VuY19HZXRNb25vU3RlcmVvTW9kZShjbS0+ZW5jTW9kZSkpIHsKKyAgc3dpdGNoIChGREthYWNFbmNfR2V0TW9ub1N0ZXJlb01vZGUoY20tPmVuY01vZGUpKSB7CiAgICAgLyogLi4uIGFuZCBtYXAgdG8gdG5zQ2hhbm5lbHMgKi8KLSAgICBjYXNlIEVMX01PREVfTU9OTzogICB0bnNDaGFubmVscyA9IDE7IGJyZWFrOwotICAgIGNhc2UgRUxfTU9ERV9TVEVSRU86IHRuc0NoYW5uZWxzID0gMjsgYnJlYWs7Ci0gICAgZGVmYXVsdDogICAgICAgICAgICAgdG5zQ2hhbm5lbHMgPSAwOworICAgIGNhc2UgRUxfTU9ERV9NT05POgorICAgICAgdG5zQ2hhbm5lbHMgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFTF9NT0RFX1NURVJFTzoKKyAgICAgIHRuc0NoYW5uZWxzID0gMjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0bnNDaGFubmVscyA9IDA7CiAgIH0KIAotICBzd2l0Y2ggKGF1ZGlvT2JqZWN0VHlwZSkKLSAgewotICAgIGRlZmF1bHQ6IGZpbHRlckJhbmsgPSBGQl9MQzsgIGJyZWFrOwotICAgIGNhc2UgQU9UX0VSX0FBQ19MRDogIGZpbHRlckJhbmsgPSBGQl9MRDsgIGJyZWFrOwotICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6IGZpbHRlckJhbmsgPSBGQl9FTEQ7IGJyZWFrOworICBzd2l0Y2ggKGF1ZGlvT2JqZWN0VHlwZSkgeworICAgIGRlZmF1bHQ6CisgICAgICBmaWx0ZXJCYW5rID0gRkJfTEM7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgICBmaWx0ZXJCYW5rID0gRkJfTEQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgICAgZmlsdGVyQmFuayA9IEZCX0VMRDsKKyAgICAgIGJyZWFrOwogICB9CiAKICAgaFBzeS0+Z3JhbnVsZUxlbmd0aCA9IGdyYW51bGVMZW5ndGg7CiAKLSAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfSW5pdFBzeUNvbmZpZ3VyYXRpb24oYml0UmF0ZS9jaGFubmVsc0VmZiwgc2FtcGxlUmF0ZSwgYmFuZHdpZHRoLCBMT05HX1dJTkRPVywgaFBzeS0+Z3JhbnVsZUxlbmd0aCwgdXNlSVMsICYoaFBzeS0+cHN5Q29uZlswXSksIGZpbHRlckJhbmspOwotICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKLSAgICByZXR1cm4gRXJyb3JTdGF0dXM7CisgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0luaXRQc3lDb25maWd1cmF0aW9uKAorICAgICAgYml0UmF0ZSAvIGNoYW5uZWxzRWZmLCBzYW1wbGVSYXRlLCBiYW5kd2lkdGgsIExPTkdfV0lORE9XLAorICAgICAgaFBzeS0+Z3JhbnVsZUxlbmd0aCwgdXNlSVMsIHVzZU1TLCAmKGhQc3ktPnBzeUNvbmZbMF0pLCBmaWx0ZXJCYW5rKTsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIHJldHVybiBFcnJvclN0YXR1czsKIAogICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Jbml0VG5zQ29uZmlndXJhdGlvbigKLSAgICAgICAgKGJpdFJhdGUqdG5zQ2hhbm5lbHMpL2NoYW5uZWxzRWZmLAotICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICB0bnNDaGFubmVscywKLSAgICAgICAgTE9OR19XSU5ET1csCi0gICAgICAgIGhQc3ktPmdyYW51bGVMZW5ndGgsCi0gICAgICAgIGlzTG93RGVsYXkoYXVkaW9PYmplY3RUeXBlKSwKLSAgICAgICAgKHN5bnRheEZsYWdzJkFDX1NCUl9QUkVTRU5UKT8xOjAsCi0gICAgICAgJihoUHN5LT5wc3lDb25mWzBdLnRuc0NvbmYpLAotICAgICAgICZoUHN5LT5wc3lDb25mWzBdLAotICAgICAgICAoSU5UKSh0bnNNYXNrJjIpLAotICAgICAgICAoSU5UKSh0bnNNYXNrJjgpICk7CisgICAgICAoYml0UmF0ZSAqIHRuc0NoYW5uZWxzKSAvIGNoYW5uZWxzRWZmLCBzYW1wbGVSYXRlLCB0bnNDaGFubmVscywKKyAgICAgIExPTkdfV0lORE9XLCBoUHN5LT5ncmFudWxlTGVuZ3RoLCBpc0xvd0RlbGF5KGF1ZGlvT2JqZWN0VHlwZSksCisgICAgICAoc3ludGF4RmxhZ3MgJiBBQ19TQlJfUFJFU0VOVCkgPyAxIDogMCwgJihoUHN5LT5wc3lDb25mWzBdLnRuc0NvbmYpLAorICAgICAgJmhQc3ktPnBzeUNvbmZbMF0sIChJTlQpKHRuc01hc2sgJiAyKSwgKElOVCkodG5zTWFzayAmIDgpKTsKIAotICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKLSAgICByZXR1cm4gRXJyb3JTdGF0dXM7CisgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKSByZXR1cm4gRXJyb3JTdGF0dXM7CiAKICAgaWYgKGdyYW51bGVMZW5ndGggPiA1MTIpIHsKLSAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Jbml0UHN5Q29uZmlndXJhdGlvbihiaXRSYXRlL2NoYW5uZWxzRWZmLCBzYW1wbGVSYXRlLCBiYW5kd2lkdGgsIFNIT1JUX1dJTkRPVywgaFBzeS0+Z3JhbnVsZUxlbmd0aCwgdXNlSVMsICZoUHN5LT5wc3lDb25mWzFdLCBmaWx0ZXJCYW5rKTsKLSAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKLSAgICAgIHJldHVybiBFcnJvclN0YXR1czsKKyAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Jbml0UHN5Q29uZmlndXJhdGlvbigKKyAgICAgICAgYml0UmF0ZSAvIGNoYW5uZWxzRWZmLCBzYW1wbGVSYXRlLCBiYW5kd2lkdGgsIFNIT1JUX1dJTkRPVywKKyAgICAgICAgaFBzeS0+Z3JhbnVsZUxlbmd0aCwgdXNlSVMsIHVzZU1TLCAmaFBzeS0+cHN5Q29uZlsxXSwgZmlsdGVyQmFuayk7CisKKyAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykgcmV0dXJuIEVycm9yU3RhdHVzOwogCiAgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfSW5pdFRuc0NvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICAoYml0UmF0ZSp0bnNDaGFubmVscykvY2hhbm5lbHNFZmYsCi0gICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgdG5zQ2hhbm5lbHMsCi0gICAgICAgICAgICBTSE9SVF9XSU5ET1csCi0gICAgICAgICAgICBoUHN5LT5ncmFudWxlTGVuZ3RoLAotICAgICAgICAgICAgaXNMb3dEZWxheShhdWRpb09iamVjdFR5cGUpLAotICAgICAgICAgICAgKHN5bnRheEZsYWdzJkFDX1NCUl9QUkVTRU5UKT8xOjAsCi0gICAgICAgICAgICZoUHN5LT5wc3lDb25mWzFdLnRuc0NvbmYsCi0gICAgICAgICAgICZoUHN5LT5wc3lDb25mWzFdLAotICAgICAgICAgICAgKElOVCkodG5zTWFzayYxKSwKLSAgICAgICAgICAgIChJTlQpKHRuc01hc2smNCkgKTsKKyAgICAgICAgKGJpdFJhdGUgKiB0bnNDaGFubmVscykgLyBjaGFubmVsc0VmZiwgc2FtcGxlUmF0ZSwgdG5zQ2hhbm5lbHMsCisgICAgICAgIFNIT1JUX1dJTkRPVywgaFBzeS0+Z3JhbnVsZUxlbmd0aCwgaXNMb3dEZWxheShhdWRpb09iamVjdFR5cGUpLAorICAgICAgICAoc3ludGF4RmxhZ3MgJiBBQ19TQlJfUFJFU0VOVCkgPyAxIDogMCwgJmhQc3ktPnBzeUNvbmZbMV0udG5zQ29uZiwKKyAgICAgICAgJmhQc3ktPnBzeUNvbmZbMV0sIChJTlQpKHRuc01hc2sgJiAxKSwgKElOVCkodG5zTWFzayAmIDQpKTsKIAotICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQotICAgIHJldHVybiBFcnJvclN0YXR1czsKLQorICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKSByZXR1cm4gRXJyb3JTdGF0dXM7CiAgIH0KIAotCi0gIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykgewotICAgIGZvciAoY2g9MDsgY2g8Y20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7CisgIGZvciAoaSA9IDA7IGkgPCBjbS0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjbS0+ZWxJbmZvW2ldLm5DaGFubmVsc0luRWw7IGNoKyspIHsKICAgICAgIGlmIChpbml0RmxhZ3MpIHsKICAgICAgICAgLyogcmVzZXQgc3RhdGVzICovCi0gICAgICAgIEZES2FhY0VuY19wc3lJbml0U3RhdGVzKGhQc3ksIGhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0sIGF1ZGlvT2JqZWN0VHlwZSk7CisgICAgICAgIEZES2FhY0VuY19wc3lJbml0U3RhdGVzKGhQc3ksIGhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvT2JqZWN0VHlwZSk7CiAgICAgICB9CiAKLSAgICAgIEZES2FhY0VuY19Jbml0UHJlRWNob0NvbnRyb2woaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXS0+c2ZiVGhyZXNob2xkbm0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoUHN5LT5wc3lFbGVtZW50W2ldLT5wc3lTdGF0aWNbY2hdLT5jYWxjUHJlRWNobywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeS0+cHN5Q29uZlswXS5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3ktPnBzeUNvbmZbMF0uc2ZiUGNtUXVhbnRUaHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0tPm1kY3RTY2FsZW5tMSk7CisgICAgICBGREthYWNFbmNfSW5pdFByZUVjaG9Db250cm9sKAorICAgICAgICAgIGhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0tPnNmYlRocmVzaG9sZG5tMSwKKyAgICAgICAgICAmaFBzeS0+cHN5RWxlbWVudFtpXS0+cHN5U3RhdGljW2NoXS0+Y2FsY1ByZUVjaG8sCisgICAgICAgICAgaFBzeS0+cHN5Q29uZlswXS5zZmJDbnQsIGhQc3ktPnBzeUNvbmZbMF0uc2ZiUGNtUXVhbnRUaHJlc2hvbGQsCisgICAgICAgICAgJmhQc3ktPnBzeUVsZW1lbnRbaV0tPnBzeVN0YXRpY1tjaF0tPm1kY3RTY2FsZW5tMSk7CiAgICAgfQogICB9CiAKLSAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfSW5pdFBuc0NvbmZpZ3VyYXRpb24oJmhQc3ktPnBzeUNvbmZbMF0ucG5zQ29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZS9jaGFubmVsc0VmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlUG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5LT5wc3lDb25mWzBdLnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeS0+cHN5Q29uZlswXS5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLT5lbEluZm9bMF0ubkNoYW5uZWxzSW5FbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhQc3ktPnBzeUNvbmZbMF0uZmlsdGVyYmFuayA9PSBGQl9MQykpOwotICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKLSAgICByZXR1cm4gRXJyb3JTdGF0dXM7CisgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0luaXRQbnNDb25maWd1cmF0aW9uKAorICAgICAgJmhQc3ktPnBzeUNvbmZbMF0ucG5zQ29uZiwgYml0UmF0ZSAvIGNoYW5uZWxzRWZmLCBzYW1wbGVSYXRlLCB1c2VQbnMsCisgICAgICBoUHN5LT5wc3lDb25mWzBdLnNmYkNudCwgaFBzeS0+cHN5Q29uZlswXS5zZmJPZmZzZXQsCisgICAgICBjbS0+ZWxJbmZvWzBdLm5DaGFubmVsc0luRWwsIChoUHN5LT5wc3lDb25mWzBdLmZpbHRlcmJhbmsgPT0gRkJfTEMpKTsKKyAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIHJldHVybiBFcnJvclN0YXR1czsKIAotICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Jbml0UG5zQ29uZmlndXJhdGlvbigmaFBzeS0+cHN5Q29uZlsxXS5wbnNDb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlL2NoYW5uZWxzRWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VQbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3ktPnBzeUNvbmZbMV0uc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5LT5wc3lDb25mWzFdLnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmVsSW5mb1sxXS5uQ2hhbm5lbHNJbkVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaFBzeS0+cHN5Q29uZlsxXS5maWx0ZXJiYW5rID09IEZCX0xDKSk7CisgIGlmIChncmFudWxlTGVuZ3RoID4gNTEyKSB7CisgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfSW5pdFBuc0NvbmZpZ3VyYXRpb24oCisgICAgICAgICZoUHN5LT5wc3lDb25mWzFdLnBuc0NvbmYsIGJpdFJhdGUgLyBjaGFubmVsc0VmZiwgc2FtcGxlUmF0ZSwgdXNlUG5zLAorICAgICAgICBoUHN5LT5wc3lDb25mWzFdLnNmYkNudCwgaFBzeS0+cHN5Q29uZlsxXS5zZmJPZmZzZXQsCisgICAgICAgIGNtLT5lbEluZm9bMV0ubkNoYW5uZWxzSW5FbCwgKGhQc3ktPnBzeUNvbmZbMV0uZmlsdGVyYmFuayA9PSBGQl9MQykpOworICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKSByZXR1cm4gRXJyb3JTdGF0dXM7CisgIH0KKwogICByZXR1cm4gRXJyb3JTdGF0dXM7CiB9CiAKLQotc3RhdGljCi12b2lkIEZES2FhY0VuY19kZWludGVybGVhdmVJbnB1dEJ1ZmZlcihJTlRfUENNICpwT3V0cHV0U2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKnBJbnB1dFNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbkNoYW5uZWxzKQotewotICAgIElOVCBrOwotICAgIC8qIGRlaW50ZXJsYXZlIGlucHV0IHNhbXBsZXMgYW5kIHdyaXRlIHRvIG91dHB1dCBidWZmZXIgKi8KLSAgICBmb3IgKGs9MDsgazxuU2FtcGxlczsgaysrKSB7Ci0gICAgICAgIHBPdXRwdXRTYW1wbGVzW2tdID0gcElucHV0U2FtcGxlc1trKm5DaGFubmVsc107Ci0gICAgfQotfQotCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19wc3lNYWluCkBAIC00MzgsOTUwICs0MDQsOTQ1IEBACiAgICAgICAgIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGVub3VnaCBpbnB1dCBkYXRhIGlzIGluIHRoZSBtb2R1bG8gYnVmZmVyLgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19wc3lNYWluKElOVCBjaGFubmVscywgUFNZX0VMRU1FTlQgKnBzeUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfRFlOQU1JQyAqcHN5RHluYW1pYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OICpwc3lDb25mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICpSRVNUUklDVCBwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqcElucHV0LCBjb25zdCBVSU5UIGlucHV0QnVmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqY2hJZHgsIElOVCB0b3RhbENoYW5uZWxzKSB7CisgIGNvbnN0IElOVCBjb21tb25XaW5kb3cgPSAxOworICBJTlQgbWF4U2ZiUGVyR3JvdXBbKDIpXTsKKyAgSU5UIG1kY3RTcGVjdHJ1bV9lOworICBJTlQgY2g7ICAgLyogY291bnRzIHRocm91Z2ggY2hhbm5lbHMgICAgICAgICAgKi8KKyAgSU5UIHc7ICAgIC8qIGNvdW50cyB0aHJvdWdoIHdpbmRvd3MgICAgICAgICAgICovCisgIElOVCBzZmI7ICAvKiBjb3VudHMgdGhyb3VnaCBzY2FsZWZhY3RvciBiYW5kcyAqLworICBJTlQgbGluZTsgLyogY291bnRzIHRocm91Z2ggbGluZXMgICAgICAgICAgICAgKi8KIAotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3BzeU1haW4oSU5UICAgICAgICAgICAgICAgICBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9FTEVNRU5UICAgICAgICAqcHN5RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9EWU5BTUlDICAgICAgICAqcHN5RHluYW1pYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OICAqcHN5Q29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCAgICAqUkVTVFJJQ1QgcHN5T3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgICAgICAgKnBJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgKmNoSWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgdG90YWxDaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgY29uc3QgSU5UIGNvbW1vbldpbmRvdyA9IDE7Ci0gICAgSU5UIG1heFNmYlBlckdyb3VwWygyKV07Ci0gICAgSU5UIG1kY3RTcGVjdHJ1bV9lOwotICAgIElOVCBjaDsgICAvKiBjb3VudHMgdGhyb3VnaCBjaGFubmVscyAgICAgICAgICAqLwotICAgIElOVCB3OyAgICAvKiBjb3VudHMgdGhyb3VnaCB3aW5kb3dzICAgICAgICAgICAqLwotICAgIElOVCBzZmI7ICAvKiBjb3VudHMgdGhyb3VnaCBzY2FsZWZhY3RvciBiYW5kcyAqLwotICAgIElOVCBsaW5lOyAvKiBjb3VudHMgdGhyb3VnaCBsaW5lcyAgICAgICAgICAgICAqLworICBQU1lfQ09ORklHVVJBVElPTiAqUkVTVFJJQ1QgaFBzeUNvbmZMb25nID0gJnBzeUNvbmZbMF07CisgIFBTWV9DT05GSUdVUkFUSU9OICpSRVNUUklDVCBoUHN5Q29uZlNob3J0ID0gJnBzeUNvbmZbMV07CisgIFBTWV9PVVRfQ0hBTk5FTCAqKlJFU1RSSUNUIHBzeU91dENoYW5uZWwgPSBwc3lPdXRFbGVtZW50LT5wc3lPdXRDaGFubmVsOworICBGSVhQX1NHTCBzZmJUb25hbGl0eVsoMildW01BWF9TRkJfTE9OR107CiAKLSAgICBQU1lfQ09ORklHVVJBVElPTiAqUkVTVFJJQ1QgaFBzeUNvbmZMb25nICA9ICZwc3lDb25mWzBdOwotICAgIFBTWV9DT05GSUdVUkFUSU9OICpSRVNUUklDVCBoUHN5Q29uZlNob3J0ID0gJnBzeUNvbmZbMV07Ci0gICAgUFNZX09VVF9DSEFOTkVMICAqKlJFU1RSSUNUIHBzeU91dENoYW5uZWwgPSBwc3lPdXRFbGVtZW50LT5wc3lPdXRDaGFubmVsOwotICAgIEZJWFBfU0dMIHNmYlRvbmFsaXR5WygyKV1bTUFYX1NGQl9MT05HXTsKKyAgUFNZX1NUQVRJQyAqKlJFU1RSSUNUIHBzeVN0YXRpYyA9IHBzeUVsZW1lbnQtPnBzeVN0YXRpYzsKIAotICAgIFBTWV9TVEFUSUMgICAgICAgICoqUkVTVFJJQ1QgcHN5U3RhdGljID0gcHN5RWxlbWVudC0+cHN5U3RhdGljOworICBQU1lfREFUQSAqUkVTVFJJQ1QgcHN5RGF0YVsoMildOworICBUTlNfREFUQSAqUkVTVFJJQ1QgdG5zRGF0YVsoMildOworICBQTlNfREFUQSAqUkVTVFJJQ1QgcG5zRGF0YVsoMildOwogCi0gICAgUFNZX0RBVEEgICAgICAgICAgICpSRVNUUklDVCBwc3lEYXRhWygyKV07Ci0gICAgVE5TX0RBVEEgICAgICAgICAgICpSRVNUUklDVCB0bnNEYXRhWygyKV07Ci0gICAgUE5TX0RBVEEgICAgICAgICAgICpSRVNUUklDVCBwbnNEYXRhWygyKV07CisgIElOVCB6ZXJvU3BlYyA9IFRSVUU7IC8qIG1lYW5zIGFsbCBzcGVjdHJhbCBsaW5lcyBhcmUgemVybyAqLwogCi0gICAgSU5UIHplcm9TcGVjID0gVFJVRTsgLyogbWVhbnMgYWxsIHNwZWN0cmFsIGxpbmVzIGFyZSB6ZXJvICovCisgIElOVCBibG9ja1N3aXRjaGluZ09mZnNldDsKIAotICAgIElOVCBibG9ja1N3aXRjaGluZ09mZnNldDsKKyAgUFNZX0NPTkZJR1VSQVRJT04gKlJFU1RSSUNUIGhUaGlzUHN5Q29uZlsoMildOworICBJTlQgd2luZG93TGVuZ3RoWygyKV07CisgIElOVCBuV2luZG93c1soMildOworICBJTlQgd09mZnNldDsKIAotICAgIFBTWV9DT05GSUdVUkFUSU9OICpSRVNUUklDVCBoVGhpc1BzeUNvbmZbKDIpXTsKLSAgICBJTlQgd2luZG93TGVuZ3RoWygyKV07Ci0gICAgSU5UIG5XaW5kb3dzWygyKV07Ci0gICAgSU5UIHdPZmZzZXQ7CisgIElOVCBtYXhTZmJbKDIpXTsKKyAgSU5UICpwU2ZiTWF4U2NhbGVTcGVjWygyKV07CisgIEZJWFBfREJMICpwU2ZiRW5lcmd5WygyKV07CisgIEZJWFBfREJMICpwU2ZiU3ByZWFkRW5lcmd5WygyKV07CisgIEZJWFBfREJMICpwU2ZiRW5lcmd5TGREYXRhWygyKV07CisgIEZJWFBfREJMICpwU2ZiRW5lcmd5TVNbKDIpXTsKKyAgRklYUF9EQkwgKnBTZmJUaHJlc2hvbGRbKDIpXTsKIAotICAgIElOVCAgICAgICBtYXhTZmJbKDIpXTsKLSAgICBJTlQgICAgICAqcFNmYk1heFNjYWxlU3BlY1soMildOwotICAgIEZJWFBfREJMICpwU2ZiRW5lcmd5WygyKV07Ci0gICAgRklYUF9EQkwgKnBTZmJTcHJlYWRFbmVyZ3lbKDIpXTsKLSAgICBGSVhQX0RCTCAqcFNmYkVuZXJneUxkRGF0YVsoMildOwotICAgIEZJWFBfREJMICpwU2ZiRW5lcmd5TVNbKDIpXTsKLSAgICBGSVhQX0RCTCAqcFNmYlRocmVzaG9sZFsoMildOworICBJTlQgaXNTaG9ydFdpbmRvd1soMildOwogCi0gICAgSU5UIGlzU2hvcnRXaW5kb3dbKDIpXTsKKyAgLyogbnVtYmVyIG9mIGluY29taW5nIHRpbWUgc2FtcGxlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgY29uc3QgSU5UIG5UaW1lU2FtcGxlcyA9IHBzeUNvbmYtPmdyYW51bGVMZW5ndGg7CiAKKyAgc3dpdGNoIChoUHN5Q29uZkxvbmctPmZpbHRlcmJhbmspIHsKKyAgICBjYXNlIEZCX0xDOgorICAgICAgYmxvY2tTd2l0Y2hpbmdPZmZzZXQgPQorICAgICAgICAgIG5UaW1lU2FtcGxlcyArICg5ICogblRpbWVTYW1wbGVzIC8gKDIgKiBUUkFOU19GQUMpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkJfTEQ6CisgICAgY2FzZSBGQl9FTEQ6CisgICAgICBibG9ja1N3aXRjaGluZ09mZnNldCA9IG5UaW1lU2FtcGxlczsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9GSUxURVJCQU5LOworICB9CiAKLSAgICBpZiAoaFBzeUNvbmZMb25nLT5maWx0ZXJiYW5rID09IEZCX0xDKSB7Ci0gICAgICBibG9ja1N3aXRjaGluZ09mZnNldCA9IHBzeUNvbmYtPmdyYW51bGVMZW5ndGggKyAoOSpwc3lDb25mLT5ncmFudWxlTGVuZ3RoLygyKlRSQU5TX0ZBQykpOworICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgIHBzeURhdGFbY2hdID0gJnBzeUR5bmFtaWMtPnBzeURhdGFbY2hdOworICAgIHRuc0RhdGFbY2hdID0gJnBzeUR5bmFtaWMtPnRuc0RhdGFbY2hdOworICAgIHBuc0RhdGFbY2hdID0gJnBzeUR5bmFtaWMtPnBuc0RhdGFbY2hdOworCisgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSA9IHBzeU91dENoYW5uZWxbY2hdLT5tZGN0U3BlY3RydW07CisgIH0KKworICAvKiBibG9jayBzd2l0Y2hpbmcgKi8KKyAgaWYgKGhQc3lDb25mTG9uZy0+ZmlsdGVyYmFuayAhPSBGQl9FTEQpIHsKKyAgICBpbnQgZXJyOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChwVGltZVNpZ25hbCwgSU5UX1BDTSwgKDEwMjQpKQorCisgICAgICAvKiBjb3B5IGlucHV0IGRhdGEgYW5kIHVzZSBmb3IgYmxvY2sgc3dpdGNoaW5nICovCisgICAgICBGREttZW1jcHkocFRpbWVTaWduYWwsIHBJbnB1dCArIGNoSWR4W2NoXSAqIGlucHV0QnVmU2l6ZSwKKyAgICAgICAgICAgICAgICBuVGltZVNhbXBsZXMgKiBzaXplb2YoSU5UX1BDTSkpOworCisgICAgICBGREthYWNFbmNfQmxvY2tTd2l0Y2hpbmcoJnBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuVGltZVNhbXBsZXMsIHBzeVN0YXRpY1tjaF0tPmlzTEZFLCBwVGltZVNpZ25hbCk7CisKKyAgICAgIC8qIGZpbGwgdXAgaW50ZXJuYWwgaW5wdXQgYnVmZmVyLCB0byAyeGZyYW1lbGVuZ3RoIHNhbXBsZXMgKi8KKyAgICAgIEZES21lbWNweShwc3lTdGF0aWNbY2hdLT5wc3lJbnB1dEJ1ZmZlciArIGJsb2NrU3dpdGNoaW5nT2Zmc2V0LAorICAgICAgICAgICAgICAgIHBUaW1lU2lnbmFsLAorICAgICAgICAgICAgICAgICgyICogblRpbWVTYW1wbGVzIC0gYmxvY2tTd2l0Y2hpbmdPZmZzZXQpICogc2l6ZW9mKElOVF9QQ00pKTsKKworICAgICAgQ19BTExPQ19TQ1JBVENIX0VORChwVGltZVNpZ25hbCwgSU5UX1BDTSwgKDEwMjQpKQorICAgIH0KKworICAgIC8qIHN5bmNoIGxlZnQgYW5kIHJpZ2h0IGJsb2NrIHR5cGUgKi8KKyAgICBlcnIgPSBGREthYWNFbmNfU3luY0Jsb2NrU3dpdGNoaW5nKAorICAgICAgICAmcHN5U3RhdGljWzBdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wsCisgICAgICAgIChjaGFubmVscyA+IDEpID8gJnBzeVN0YXRpY1sxXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sIDogTlVMTCwgY2hhbm5lbHMsCisgICAgICAgIGNvbW1vbldpbmRvdyk7CisKKyAgICBpZiAoZXJyKSB7CisgICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9BT1Q7IC8qIG1peGVkIHVwIExDIGFuZCBMRCAqLworICAgIH0KKworICB9IGVsc2UgeworICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAvKiBjb3B5IGlucHV0IGRhdGEgYW5kIHVzZSBmb3IgYmxvY2sgc3dpdGNoaW5nICovCisgICAgICBGREttZW1jcHkocHN5U3RhdGljW2NoXS0+cHN5SW5wdXRCdWZmZXIgKyBibG9ja1N3aXRjaGluZ09mZnNldCwKKyAgICAgICAgICAgICAgICBwSW5wdXQgKyBjaElkeFtjaF0gKiBpbnB1dEJ1ZlNpemUsCisgICAgICAgICAgICAgICAgblRpbWVTYW1wbGVzICogc2l6ZW9mKElOVF9QQ00pKTsKKyAgICB9CisgIH0KKworICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykKKyAgICBpc1Nob3J0V2luZG93W2NoXSA9CisgICAgICAgIChwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlID09CisgICAgICAgICBTSE9SVF9XSU5ET1cpOworCisgIC8qIHNldCBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byB3aW5kb3cgbGVuZ3RoICovCisgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgaWYgKGlzU2hvcnRXaW5kb3dbY2hdKSB7CisgICAgICBoVGhpc1BzeUNvbmZbY2hdID0gaFBzeUNvbmZTaG9ydDsKKyAgICAgIHdpbmRvd0xlbmd0aFtjaF0gPSBwc3lDb25mLT5ncmFudWxlTGVuZ3RoIC8gVFJBTlNfRkFDOworICAgICAgbldpbmRvd3NbY2hdID0gVFJBTlNfRkFDOworICAgICAgbWF4U2ZiW2NoXSA9IE1BWF9TRkJfU0hPUlQ7CisKKyAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdID0gcHN5RGF0YVtjaF0tPnNmYk1heFNjYWxlU3BlYy5TaG9ydFswXTsKKyAgICAgIHBTZmJFbmVyZ3lbY2hdID0gcHN5RGF0YVtjaF0tPnNmYkVuZXJneS5TaG9ydFswXTsKKyAgICAgIHBTZmJTcHJlYWRFbmVyZ3lbY2hdID0gcHN5RGF0YVtjaF0tPnNmYlNwcmVhZEVuZXJneS5TaG9ydFswXTsKKyAgICAgIHBTZmJFbmVyZ3lMZERhdGFbY2hdID0gcHN5RGF0YVtjaF0tPnNmYkVuZXJneUxkRGF0YS5TaG9ydFswXTsKKyAgICAgIHBTZmJFbmVyZ3lNU1tjaF0gPSBwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5TVMuU2hvcnRbMF07CisgICAgICBwU2ZiVGhyZXNob2xkW2NoXSA9IHBzeURhdGFbY2hdLT5zZmJUaHJlc2hvbGQuU2hvcnRbMF07CisKICAgICB9IGVsc2UgewotICAgICAgYmxvY2tTd2l0Y2hpbmdPZmZzZXQgPSBwc3lDb25mLT5ncmFudWxlTGVuZ3RoOworICAgICAgaFRoaXNQc3lDb25mW2NoXSA9IGhQc3lDb25mTG9uZzsKKyAgICAgIHdpbmRvd0xlbmd0aFtjaF0gPSBwc3lDb25mLT5ncmFudWxlTGVuZ3RoOworICAgICAgbldpbmRvd3NbY2hdID0gMTsKKyAgICAgIG1heFNmYltjaF0gPSBNQVhfR1JPVVBFRF9TRkI7CisKKyAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdID0gcHN5RGF0YVtjaF0tPnNmYk1heFNjYWxlU3BlYy5Mb25nOworICAgICAgcFNmYkVuZXJneVtjaF0gPSBwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5Lkxvbmc7CisgICAgICBwU2ZiU3ByZWFkRW5lcmd5W2NoXSA9IHBzeURhdGFbY2hdLT5zZmJTcHJlYWRFbmVyZ3kuTG9uZzsKKyAgICAgIHBTZmJFbmVyZ3lMZERhdGFbY2hdID0gcHN5RGF0YVtjaF0tPnNmYkVuZXJneUxkRGF0YS5Mb25nOworICAgICAgcFNmYkVuZXJneU1TW2NoXSA9IHBzeURhdGFbY2hdLT5zZmJFbmVyZ3lNUy5Mb25nOworICAgICAgcFNmYlRocmVzaG9sZFtjaF0gPSBwc3lEYXRhW2NoXS0+c2ZiVGhyZXNob2xkLkxvbmc7CisgICAgfQorICB9CisKKyAgLyogVHJhbnNmb3JtIGFuZCBnZXQgbWRjdFNjYWxpbmcgZm9yIGFsbCBjaGFubmVscyBhbmQgd2luZG93cy4gKi8KKyAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAvKiB1cGRhdGUgbnVtYmVyIG9mIGFjdGl2ZSBiYW5kcyAqLworICAgIGlmIChwc3lTdGF0aWNbY2hdLT5pc0xGRSkgeworICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSA9IGhUaGlzUHN5Q29uZltjaF0tPnNmYkFjdGl2ZUxGRTsKKyAgICAgIHBzeURhdGFbY2hdLT5sb3dwYXNzTGluZSA9IGhUaGlzUHN5Q29uZltjaF0tPmxvd3Bhc3NMaW5lTEZFOworICAgIH0gZWxzZSB7CisgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlID0gaFRoaXNQc3lDb25mW2NoXS0+c2ZiQWN0aXZlOworICAgICAgcHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lID0gaFRoaXNQc3lDb25mW2NoXS0+bG93cGFzc0xpbmU7CiAgICAgfQogCi0gICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykKLSAgICB7Ci0gICAgICAgIHBzeURhdGFbY2hdID0gJnBzeUR5bmFtaWMtPnBzeURhdGFbY2hdOwotICAgICAgICB0bnNEYXRhW2NoXSA9ICZwc3lEeW5hbWljLT50bnNEYXRhW2NoXTsKLSAgICAgICAgcG5zRGF0YVtjaF0gPSAmcHN5RHluYW1pYy0+cG5zRGF0YVtjaF07Ci0KLSAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSA9IHBzeU91dENoYW5uZWxbY2hdLT5tZGN0U3BlY3RydW07Ci0gICAgfQotCi0gICAgLyogYmxvY2sgc3dpdGNoaW5nICovCi0gICAgaWYgKGhQc3lDb25mTG9uZy0+ZmlsdGVyYmFuayAhPSBGQl9FTEQpCi0gICAgewotICAgICAgaW50IGVycjsKLQotICAgICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykKLSAgICAgIHsKLSAgICAgICAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocFRpbWVTaWduYWwsIElOVF9QQ00sICgxMDI0KSkKLQotICAgICAgICAgIC8qIGRlaW50ZXJsZWF2ZSBpbnB1dCBkYXRhIGFuZCB1c2UgZm9yIGJsb2NrIHN3aXRjaGluZyAqLwotICAgICAgICAgIEZES2FhY0VuY19kZWludGVybGVhdmVJbnB1dEJ1ZmZlciggcFRpbWVTaWduYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5wdXRbY2hJZHhbY2hdXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPmdyYW51bGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbENoYW5uZWxzKTsKLQotCi0gICAgICAgICAgRkRLYWFjRW5jX0Jsb2NrU3dpdGNoaW5nICgmcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPmdyYW51bGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+aXNMRkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVTaWduYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotCi0gICAgICAgICAgICAvKiBmaWxsIHVwIGludGVybmFsIGlucHV0IGJ1ZmZlciwgdG8gMnhmcmFtZWxlbmd0aCBzYW1wbGVzICovCi0gICAgICAgICAgICBGREttZW1jcHkocHN5U3RhdGljW2NoXS0+cHN5SW5wdXRCdWZmZXIrYmxvY2tTd2l0Y2hpbmdPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgcFRpbWVTaWduYWwsCi0gICAgICAgICAgICAgICAgICAgICAgKDIqcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aC1ibG9ja1N3aXRjaGluZ09mZnNldCkqc2l6ZW9mKElOVF9QQ00pKTsKLQotICAgICAgICAgICAgQ19BTExPQ19TQ1JBVENIX0VORChwVGltZVNpZ25hbCwgSU5UX1BDTSwgKDEwMjQpKQorICAgIGlmIChoVGhpc1BzeUNvbmZbY2hdLT5maWx0ZXJiYW5rID09IEZCX0VMRCkgeworICAgICAgaWYgKEZES2FhY0VuY19UcmFuc2Zvcm1fUmVhbF9FbGQoCisgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPnBzeUlucHV0QnVmZmVyLCBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlLAorICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2hhcGUsCisgICAgICAgICAgICAgICZwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NoYXBlLAorICAgICAgICAgICAgICBuVGltZVNhbXBsZXMsICZtZGN0U3BlY3RydW1fZSwgaFRoaXNQc3lDb25mW2NoXS0+ZmlsdGVyYmFuaywKKyAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+b3ZlcmxhcEFkZEJ1ZmZlcikgIT0gMCkgeworICAgICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9GSUxURVJCQU5LOwogICAgICAgfQotCi0gICAgICAvKiBzeW5jaCBsZWZ0IGFuZCByaWdodCBibG9jayB0eXBlICovCi0gICAgICBlcnIgPSBGREthYWNFbmNfU3luY0Jsb2NrU3dpdGNoaW5nKCZwc3lTdGF0aWNbMF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeVN0YXRpY1sxXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb25XaW5kb3cpOwotCi0gICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQU9UOyAvKiBtaXhlZCB1cCBMQyBhbmQgTEQgKi8KLSAgICAgIH0KLQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCi0gICAgICB7Ci0gICAgICAgIC8qIGRlaW50ZXJsZWF2ZSBpbnB1dCBkYXRhIGFuZCB1c2UgZm9yIGJsb2NrIHN3aXRjaGluZyAqLwotICAgICAgICBGREthYWNFbmNfZGVpbnRlcmxlYXZlSW5wdXRCdWZmZXIoIHBzeVN0YXRpY1tjaF0tPnBzeUlucHV0QnVmZmVyICsgYmxvY2tTd2l0Y2hpbmdPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcElucHV0W2NoSWR4W2NoXV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbENoYW5uZWxzKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKEZES2FhY0VuY19UcmFuc2Zvcm1fUmVhbCgKKyAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+cHN5SW5wdXRCdWZmZXIsIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UsCisgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTaGFwZSwKKyAgICAgICAgICAgICAgJnBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2hhcGUsCisgICAgICAgICAgICAgICZwc3lTdGF0aWNbY2hdLT5tZGN0UGVycywgblRpbWVTYW1wbGVzLCAmbWRjdFNwZWN0cnVtX2UsCisgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPmZpbHRlcmJhbmspICE9IDApIHsKKyAgICAgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfRklMVEVSQkFOSzsKICAgICAgIH0KICAgICB9CiAKLSAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQotICAgICAgaXNTaG9ydFdpbmRvd1tjaF09KHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKTsKKyAgICBmb3IgKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKKyAgICAgIHdPZmZzZXQgPSB3ICogd2luZG93TGVuZ3RoW2NoXTsKIAotICAgIC8qIHNldCBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byB3aW5kb3cgbGVuZ3RoICovCi0gICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykKLSAgICB7Ci0gICAgICAgIGlmKGlzU2hvcnRXaW5kb3dbY2hdKSB7Ci0gICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdICAgICAgID0gaFBzeUNvbmZTaG9ydDsKLSAgICAgICAgICAgIHdpbmRvd0xlbmd0aFtjaF0gICAgICAgPSBwc3lDb25mLT5ncmFudWxlTGVuZ3RoL1RSQU5TX0ZBQzsKLSAgICAgICAgICAgIG5XaW5kb3dzW2NoXSAgICAgICAgICAgPSBUUkFOU19GQUM7Ci0gICAgICAgICAgICBtYXhTZmJbY2hdICAgICAgICAgICAgID0gTUFYX1NGQl9TSE9SVDsKKyAgICAgIC8qIExvdyBwYXNzIC8gaGlnaGVzdCBzZmIgKi8KKyAgICAgIEZES21lbWNsZWFyKAorICAgICAgICAgICZwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW3BzeURhdGFbY2hdLT5sb3dwYXNzTGluZSArIHdPZmZzZXRdLAorICAgICAgICAgICh3aW5kb3dMZW5ndGhbY2hdIC0gcHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lKSAqIHNpemVvZihGSVhQX0RCTCkpOwogCi0gICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjW2NoXSAgID0gcHN5RGF0YVtjaF0tPnNmYk1heFNjYWxlU3BlYy5TaG9ydFswXTsKLSAgICAgICAgICAgIHBTZmJFbmVyZ3lbY2hdICAgICAgICAgPSBwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5LlNob3J0WzBdOwotICAgICAgICAgICAgcFNmYlNwcmVhZEVuZXJneVtjaF0gICA9IHBzeURhdGFbY2hdLT5zZmJTcHJlYWRFbmVyZ3kuU2hvcnRbMF07Ci0gICAgICAgICAgICBwU2ZiRW5lcmd5TGREYXRhW2NoXSAgID0gcHN5RGF0YVtjaF0tPnNmYkVuZXJneUxkRGF0YS5TaG9ydFswXTsKLSAgICAgICAgICAgIHBTZmJFbmVyZ3lNU1tjaF0gICAgICAgPSBwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5TVMuU2hvcnRbMF07Ci0gICAgICAgICAgICBwU2ZiVGhyZXNob2xkW2NoXSAgICAgID0gcHN5RGF0YVtjaF0tPnNmYlRocmVzaG9sZC5TaG9ydFswXTsKLQotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXSAgICAgICA9IGhQc3lDb25mTG9uZzsKLSAgICAgICAgICAgIHdpbmRvd0xlbmd0aFtjaF0gICAgICAgPSBwc3lDb25mLT5ncmFudWxlTGVuZ3RoOwotICAgICAgICAgICAgbldpbmRvd3NbY2hdICAgICAgICAgICA9IDE7Ci0gICAgICAgICAgICBtYXhTZmJbY2hdICAgICAgICAgICAgID0gTUFYX0dST1VQRURfU0ZCOwotCi0gICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjW2NoXSAgID0gcHN5RGF0YVtjaF0tPnNmYk1heFNjYWxlU3BlYy5Mb25nOwotICAgICAgICAgICAgcFNmYkVuZXJneVtjaF0gICAgICAgICA9IHBzeURhdGFbY2hdLT5zZmJFbmVyZ3kuTG9uZzsKLSAgICAgICAgICAgIHBTZmJTcHJlYWRFbmVyZ3lbY2hdICAgPSBwc3lEYXRhW2NoXS0+c2ZiU3ByZWFkRW5lcmd5Lkxvbmc7Ci0gICAgICAgICAgICBwU2ZiRW5lcmd5TGREYXRhW2NoXSAgID0gcHN5RGF0YVtjaF0tPnNmYkVuZXJneUxkRGF0YS5Mb25nOwotICAgICAgICAgICAgcFNmYkVuZXJneU1TW2NoXSAgICAgICA9IHBzeURhdGFbY2hdLT5zZmJFbmVyZ3lNUy5Mb25nOwotICAgICAgICAgICAgcFNmYlRocmVzaG9sZFtjaF0gICAgICA9IHBzeURhdGFbY2hdLT5zZmJUaHJlc2hvbGQuTG9uZzsKKyAgICAgIGlmICgoaFBzeUNvbmZMb25nLT5maWx0ZXJiYW5rICE9IEZCX0xDKSAmJgorICAgICAgICAgIChwc3lEYXRhW2NoXS0+bG93cGFzc0xpbmUgPj0gRkFERV9PVVRfTEVOKSkgeworICAgICAgICAvKiBEbyBibGVuZGluZyB0byByZWR1Y2UgZ2liYnMgYXJ0aWZhY3RzICovCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRkFERV9PVVRfTEVOOyBpKyspIHsKKyAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW3BzeURhdGFbY2hdLT5sb3dwYXNzTGluZSArIHdPZmZzZXQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFERV9PVVRfTEVOICsgaV0gPQorICAgICAgICAgICAgICBmTXVsdChwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW3BzeURhdGFbY2hdLT5sb3dwYXNzTGluZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd09mZnNldCAtIEZBREVfT1VUX0xFTiArIGldLAorICAgICAgICAgICAgICAgICAgICBmYWRlT3V0RmFjdG9yW2ldKTsKICAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBDaGVjayBmb3IgemVybyBzcGVjdHJ1bS4gVGhlc2UgbG9vcHMgd2lsbCB1c3VhbGx5IHRlcm1pbmF0ZSB2ZXJ5LCB2ZXJ5CisgICAgICAgKiBlYXJseS4gKi8KKyAgICAgIGZvciAobGluZSA9IDA7IChsaW5lIDwgcHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lKSAmJiAoemVyb1NwZWMgPT0gVFJVRSk7CisgICAgICAgICAgIGxpbmUrKykgeworICAgICAgICBpZiAocHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtsaW5lICsgd09mZnNldF0gIT0gKEZJWFBfREJMKTApIHsKKyAgICAgICAgICB6ZXJvU3BlYyA9IEZBTFNFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICB9IC8qIHcgbG9vcCAqLworCisgICAgcHN5RGF0YVtjaF0tPm1kY3RTY2FsZSA9IG1kY3RTcGVjdHJ1bV9lOworCisgICAgLyogcm90YXRlIGludGVybmFsIHRpbWUgc2FtcGxlcyAqLworICAgIEZES21lbW1vdmUocHN5U3RhdGljW2NoXS0+cHN5SW5wdXRCdWZmZXIsCisgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5wc3lJbnB1dEJ1ZmZlciArIG5UaW1lU2FtcGxlcywKKyAgICAgICAgICAgICAgIG5UaW1lU2FtcGxlcyAqIHNpemVvZihJTlRfUENNKSk7CisKKyAgICAvKiAuLi4gYW5kIGdldCByZW1haW5pbmcgc2FtcGxlcyBmcm9tIGlucHV0IGJ1ZmZlciAqLworICAgIEZES21lbWNweShwc3lTdGF0aWNbY2hdLT5wc3lJbnB1dEJ1ZmZlciArIG5UaW1lU2FtcGxlcywKKyAgICAgICAgICAgICAgcElucHV0ICsgKDIgKiBuVGltZVNhbXBsZXMgLSBibG9ja1N3aXRjaGluZ09mZnNldCkgKworICAgICAgICAgICAgICAgICAgY2hJZHhbY2hdICogaW5wdXRCdWZTaXplLAorICAgICAgICAgICAgICAoYmxvY2tTd2l0Y2hpbmdPZmZzZXQgLSBuVGltZVNhbXBsZXMpICogc2l6ZW9mKElOVF9QQ00pKTsKKworICB9IC8qIGNoICovCisKKyAgLyogRG8gc29tZSByZXNjYWxpbmcgdG8gZ2V0IG1heGltdW0gcG9zc2libGUgYWNjdXJhY3kgZm9yIGVuZXJnaWVzICovCisgIGlmICh6ZXJvU3BlYyA9PSBGQUxTRSkgeworICAgIC8qIENhbGMgcG9zc2libGUgc3BlY3RydW0gbGVmdHNoaWZ0IGZvciBlYWNoIHNmYiAoMSBtZWFuczogMSBiaXQgbGVmdCBzaGlmdAorICAgICAqIGlzIHBvc3NpYmxlIHdpdGhvdXQgb3ZlcmZsb3cpICovCisgICAgSU5UIG1pblNwZWNTaGlmdCA9IE1BWF9TSElGVF9EQkw7CisgICAgSU5UIG5yZ1NoaWZ0ID0gTUFYX1NISUZUX0RCTDsKKyAgICBJTlQgZmluYWxTaGlmdCA9IE1BWF9TSElGVF9EQkw7CisgICAgRklYUF9EQkwgY3Vyck5yZyA9IDA7CisgICAgRklYUF9EQkwgbWF4TnJnID0gMDsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICBmb3IgKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKKyAgICAgICAgd09mZnNldCA9IHcgKiB3aW5kb3dMZW5ndGhbY2hdOworICAgICAgICBGREthYWNFbmNfQ2FsY1NmYk1heFNjYWxlU3BlYygKKyAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0gKyB3T2Zmc2V0LCBoVGhpc1BzeUNvbmZbY2hdLT5zZmJPZmZzZXQsCisgICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjW2NoXSArIHcgKiBtYXhTZmJbY2hdLCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKTsKKworICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKQorICAgICAgICAgIG1pblNwZWNTaGlmdCA9IGZpeE1pbihtaW5TcGVjU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwU2ZiTWF4U2NhbGVTcGVjW2NoXSArIHcgKiBtYXhTZmJbY2hdKVtzZmJdKTsKKyAgICAgIH0KICAgICB9CiAKLSAgICAvKiBUcmFuc2Zvcm0gYW5kIGdldCBtZGN0U2NhbGluZyBmb3IgYWxsIGNoYW5uZWxzIGFuZCB3aW5kb3dzLiAqLwotICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCi0gICAgewotICAgICAgICAvKiB1cGRhdGUgbnVtYmVyIG9mIGFjdGl2ZSBiYW5kcyAqLwotICAgICAgICBpZiAocHN5U3RhdGljW2NoXS0+aXNMRkUpIHsKLSAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUgPSBoVGhpc1BzeUNvbmZbY2hdLT5zZmJBY3RpdmVMRkU7Ci0gICAgICAgICAgICBwc3lEYXRhW2NoXS0+bG93cGFzc0xpbmUgPSBoVGhpc1BzeUNvbmZbY2hdLT5sb3dwYXNzTGluZUxGRTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUgPSBoVGhpc1BzeUNvbmZbY2hdLT5zZmJBY3RpdmU7Ci0gICAgICAgICAgICBwc3lEYXRhW2NoXS0+bG93cGFzc0xpbmUgPSBoVGhpc1BzeUNvbmZbY2hdLT5sb3dwYXNzTGluZTsKKyAgICAvKiBDYWxjIHBvc3NpYmxlIGVuZXJneSBsZWZ0c2hpZnQgZm9yIGVhY2ggc2ZiICgxIG1lYW5zOiAxIGJpdCBsZWZ0IHNoaWZ0IGlzCisgICAgICogcG9zc2libGUgd2l0aG91dCBvdmVyZmxvdykgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgZm9yICh3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKSB7CisgICAgICAgIHdPZmZzZXQgPSB3ICogd2luZG93TGVuZ3RoW2NoXTsKKyAgICAgICAgY3Vyck5yZyA9IEZES2FhY0VuY19DaGVja0JhbmRFbmVyZ3lPcHRpbSgKKyAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0gKyB3T2Zmc2V0LAorICAgICAgICAgICAgcFNmYk1heFNjYWxlU3BlY1tjaF0gKyB3ICogbWF4U2ZiW2NoXSwgaFRoaXNQc3lDb25mW2NoXS0+c2ZiT2Zmc2V0LAorICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwgcFNmYkVuZXJneVtjaF0gKyB3ICogbWF4U2ZiW2NoXSwKKyAgICAgICAgICAgIHBTZmJFbmVyZ3lMZERhdGFbY2hdICsgdyAqIG1heFNmYltjaF0sIG1pblNwZWNTaGlmdCAtIDQpOworCisgICAgICAgIG1heE5yZyA9IGZpeE1heChtYXhOcmcsIGN1cnJOcmcpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChtYXhOcmcgIT0gKEZJWFBfREJMKTApIHsKKyAgICAgIG5yZ1NoaWZ0ID0gKENvdW50TGVhZGluZ0JpdHMobWF4TnJnKSA+PiAxKSArIChtaW5TcGVjU2hpZnQgLSA0KTsKKyAgICB9CisKKyAgICAvKiAyY2hlY2s6IEhhc24ndCB0aGlzIGRlY2lzaW9uIHRvIGJlIG1hZGUgZm9yIGJvdGggY2hhbm5lbHM/ICovCisgICAgLyogRm9yIHNob3J0IHdpbmRvd3MgMSBhZGRpdGlvbmFsIGJpdCBoZWFkcm9vbSBpcyBuZWNlc3NhcnkgdG8gcHJldmVudAorICAgICAqIG92ZXJmbG93cyB3aGVuIHN1bW1pbmcgdXAgZW5lcmdpZXMgaW4gRkRLYWFjRW5jX2dyb3VwU2hvcnREYXRhKCkgKi8KKyAgICBpZiAoaXNTaG9ydFdpbmRvd1swXSkgbnJnU2hpZnQtLTsKKworICAgIC8qIGJvdGggc3BlY3RydW0gYW5kIGVuZXJnaWVzIG11c3RuJ3Qgb3ZlcmZsb3cgKi8KKyAgICBmaW5hbFNoaWZ0ID0gZml4TWluKG1pblNwZWNTaGlmdCwgbnJnU2hpZnQpOworCisgICAgLyogZG8gbm90IHNoaWZ0IG1vcmUgdGhhbiAzIGJpdHMgbW9yZSB0byB0aGUgbGVmdCB0aGFuIHNpZ25hbCB3aXRob3V0CisgICAgICogYmxvY2tmbG9hdGluZyBwb2ludCB3b3VsZCBiZSB0byBhdm9pZCBvdmVyZmxvdyBvZiBzY2FsZWQgUENNIHF1YW50aXphdGlvbgorICAgICAqIHRocmVzaG9sZHMgKi8KKyAgICBpZiAoZmluYWxTaGlmdCA+IHBzeURhdGFbMF0tPm1kY3RTY2FsZSArIDMpCisgICAgICBmaW5hbFNoaWZ0ID0gcHN5RGF0YVswXS0+bWRjdFNjYWxlICsgMzsKKworICAgIEZES19BU1NFUlQoZmluYWxTaGlmdCA+PSAwKTsgLyogcmlnaHQgc2hpZnQgaXMgbm90IGFsbG93ZWQgKi8KKworICAgIC8qIGNvcnJlY3Qgc2ZiRW5lcmd5IGFuZCBzZmJFbmVyZ3lMZERhdGEgd2l0aCBuZXcgZmluYWxTaGlmdCAqLworICAgIEZJWFBfREJMIGxkU2hpZnQgPSBmaW5hbFNoaWZ0ICogRkwyRlhDT05TVF9EQkwoMi4wIC8gNjQpOworICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICBJTlQgbWF4U2ZiX2NoID0gbWF4U2ZiW2NoXTsKKyAgICAgIElOVCB3X21heFNmYl9jaCA9IDA7CisgICAgICBmb3IgKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKKyAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlOyBzZmIrKykgeworICAgICAgICAgIElOVCBzY2FsZSA9IGZpeE1heCgwLCAocFNmYk1heFNjYWxlU3BlY1tjaF0gKyB3X21heFNmYl9jaClbc2ZiXSAtIDQpOworICAgICAgICAgIHNjYWxlID0gZml4TWluKChzY2FsZSAtIGZpbmFsU2hpZnQpIDw8IDEsIERGUkFDVF9CSVRTIC0gMSk7CisgICAgICAgICAgaWYgKHNjYWxlID49IDApCisgICAgICAgICAgICAocFNmYkVuZXJneVtjaF0gKyB3X21heFNmYl9jaClbc2ZiXSA+Pj0gKHNjYWxlKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAocFNmYkVuZXJneVtjaF0gKyB3X21heFNmYl9jaClbc2ZiXSA8PD0gKC1zY2FsZSk7CisgICAgICAgICAgKHBTZmJUaHJlc2hvbGRbY2hdICsgd19tYXhTZmJfY2gpW3NmYl0gPQorICAgICAgICAgICAgICBmTXVsdCgocFNmYkVuZXJneVtjaF0gKyB3X21heFNmYl9jaClbc2ZiXSwgQ19SQVRJTyk7CisgICAgICAgICAgKHBTZmJFbmVyZ3lMZERhdGFbY2hdICsgd19tYXhTZmJfY2gpW3NmYl0gKz0gbGRTaGlmdDsKICAgICAgICAgfQorICAgICAgICB3X21heFNmYl9jaCArPSBtYXhTZmJfY2g7CisgICAgICB9CisgICAgfQogCi0gICAgICAgIGZvcih3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKSB7Ci0KLSAgICAgICAgICB3T2Zmc2V0ID0gdyp3aW5kb3dMZW5ndGhbY2hdOwotCi0gICAgICAgICAgRkRLYWFjRW5jX1RyYW5zZm9ybV9SZWFsKCBwc3lTdGF0aWNbY2hdLT5wc3lJbnB1dEJ1ZmZlciArIHdPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtK3dPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTaGFwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPmdyYW51bGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZGN0U3BlY3RydW1fZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPmZpbHRlcmJhbmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHBzeVN0YXRpY1tjaF0tPm92ZXJsYXBBZGRCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgIC8qIExvdyBwYXNzIC8gaGlnaGVzdCBzZmIgKi8KLSAgICAgICAgICBGREttZW1jbGVhcigmcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtwc3lEYXRhW2NoXS0+bG93cGFzc0xpbmUrd09mZnNldF0sCi0gICAgICAgICAgICAgICAgICAgICAgKHdpbmRvd0xlbmd0aFtjaF0tcHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lKSpzaXplb2YoRklYUF9EQkwpKTsKLQotICAgICAgICAgIGlmICggKGhQc3lDb25mTG9uZy0+ZmlsdGVyYmFuayAhPSBGQl9MQykgJiYgKHBzeURhdGFbY2hdLT5sb3dwYXNzTGluZSA+PSBGQURFX09VVF9MRU4pICkgewotICAgICAgICAgICAgLyogRG8gYmxlbmRpbmcgdG8gcmVkdWNlIGdpYmJzIGFydGlmYWN0cyAqLwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPEZBREVfT1VUX0xFTjsgaSsrKSB7Ci0gICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW1bcHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lK3dPZmZzZXQgLSBGQURFX09VVF9MRU4gKyBpXSA9IGZNdWx0KHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW1bcHN5RGF0YVtjaF0tPmxvd3Bhc3NMaW5lK3dPZmZzZXQgLSBGQURFX09VVF9MRU4gKyBpXSwgZmFkZU91dEZhY3RvcltpXSk7Ci0gICAgICAgICAgICB9CisgICAgaWYgKGZpbmFsU2hpZnQgIT0gMCkgeworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgSU5UIHdMZW4gPSB3aW5kb3dMZW5ndGhbY2hdOworICAgICAgICBJTlQgbG93cGFzc0xpbmUgPSBwc3lEYXRhW2NoXS0+bG93cGFzc0xpbmU7CisgICAgICAgIHdPZmZzZXQgPSAwOworICAgICAgICBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtID0gJnBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW1bMF07CisgICAgICAgIGZvciAodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgeworICAgICAgICAgIEZJWFBfREJMICpzcGVjdHJ1bSA9ICZtZGN0U3BlY3RydW1bd09mZnNldF07CisgICAgICAgICAgZm9yIChsaW5lID0gMDsgbGluZSA8IGxvd3Bhc3NMaW5lOyBsaW5lKyspIHsKKyAgICAgICAgICAgIHNwZWN0cnVtW2xpbmVdIDw8PSBmaW5hbFNoaWZ0OwogICAgICAgICAgIH0KKyAgICAgICAgICB3T2Zmc2V0ICs9IHdMZW47CiAKKyAgICAgICAgICAvKiB1cGRhdGUgc2ZiTWF4U2NhbGVTcGVjICovCisgICAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlOyBzZmIrKykKKyAgICAgICAgICAgIChwU2ZiTWF4U2NhbGVTcGVjW2NoXSArIHcgKiBtYXhTZmJbY2hdKVtzZmJdIC09IGZpbmFsU2hpZnQ7CisgICAgICAgIH0KKyAgICAgICAgLyogdXBkYXRlIG1kY3RTY2FsZSAqLworICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNjYWxlIC09IGZpbmFsU2hpZnQ7CisgICAgICB9CisgICAgfQogCi0gICAgICAgICAgLyogQ2hlY2sgZm9yIHplcm8gc3BlY3RydW0uIFRoZXNlIGxvb3BzIHdpbGwgdXN1YWxseSB0ZXJtaW5hdGUgdmVyeSwgdmVyeSBlYXJseS4gKi8KLSAgICAgICAgICBmb3IobGluZT0wOyAobGluZTxwc3lEYXRhW2NoXS0+bG93cGFzc0xpbmUpICYmICh6ZXJvU3BlYz09VFJVRSk7IGxpbmUrKykgewotICAgICAgICAgICAgICBpZiAocHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtsaW5lK3dPZmZzZXRdICE9IChGSVhQX0RCTCkwKSB7Ci0gICAgICAgICAgICAgICAgICB6ZXJvU3BlYyA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9CisgIH0gZWxzZSB7CisgICAgLyogYWxsIHNwZWN0cmFsIGxpbmVzIGFyZSB6ZXJvICovCisgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIHBzeURhdGFbY2hdLT5tZGN0U2NhbGUgPQorICAgICAgICAgIDA7IC8qIG90aGVyd2lzZSBtZGN0U2NhbGUgd291bGQgYmUgZm9yIGV4YW1wbGUgNyBhbmQgUENNIHF1YW50aXphdGlvbgorICAgICAgICAgICAgICAqIHRocmVzaG9sZHMgd291bGQgYmUgc2hpZnRlZCAxNCBiaXRzIHRvIHRoZSByaWdodCBjYXVzaW5nIHNvbWUgb2YKKyAgICAgICAgICAgICAgKiB0aGVtIHRvIGJlY29tZSAwICh3aGljaCBjYXVzZXMgcHJvYmxlbXMgbGF0ZXIpICovCisgICAgICAvKiBjbGVhciBzZmJNYXhTY2FsZVNwZWMgKi8KKyAgICAgIGZvciAodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgeworICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKSB7CisgICAgICAgICAgKHBTZmJNYXhTY2FsZVNwZWNbY2hdICsgdyAqIG1heFNmYltjaF0pW3NmYl0gPSAwOworICAgICAgICAgIChwU2ZiRW5lcmd5W2NoXSArIHcgKiBtYXhTZmJbY2hdKVtzZmJdID0gKEZJWFBfREJMKTA7CisgICAgICAgICAgKHBTZmJFbmVyZ3lMZERhdGFbY2hdICsgdyAqIG1heFNmYltjaF0pW3NmYl0gPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7CisgICAgICAgICAgKHBTZmJUaHJlc2hvbGRbY2hdICsgdyAqIG1heFNmYltjaF0pW3NmYl0gPSAoRklYUF9EQkwpMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQogCi0gICAgICAgIH0gLyogdyBsb29wICovCi0KLSAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTY2FsZSA9IG1kY3RTcGVjdHJ1bV9lOwotCi0gICAgICAgIC8qIHJvdGF0ZSBpbnRlcm5hbCB0aW1lIHNhbXBsZXMgKi8KLSAgICAgICAgRkRLbWVtbW92ZShwc3lTdGF0aWNbY2hdLT5wc3lJbnB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5wc3lJbnB1dEJ1ZmZlcitwc3lDb25mLT5ncmFudWxlTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgIHBzeUNvbmYtPmdyYW51bGVMZW5ndGgqc2l6ZW9mKElOVF9QQ00pKTsKLQotCi0gICAgICAgIC8qIC4uLiBhbmQgZ2V0IHJlbWFpbmluZyBzYW1wbGVzIGZyb20gaW5wdXQgYnVmZmVyICovCi0gICAgICAgIEZES2FhY0VuY19kZWludGVybGVhdmVJbnB1dEJ1ZmZlciggcHN5U3RhdGljW2NoXS0+cHN5SW5wdXRCdWZmZXIrcHN5Q29uZi0+Z3JhbnVsZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5wdXRbICgyKnBzeUNvbmYtPmdyYW51bGVMZW5ndGgtYmxvY2tTd2l0Y2hpbmdPZmZzZXQpKnRvdGFsQ2hhbm5lbHMgKyBjaElkeFtjaF0gXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ09mZnNldC1wc3lDb25mLT5ncmFudWxlTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQ2hhbm5lbHMpOwotCisgIC8qIEFkdmFuY2UgcHN5Y2hvYWNvdXN0aWNzOiBUb25hbGl0eSBhbmQgVE5TICovCisgIGlmICgoY2hhbm5lbHMgPj0gMSkgJiYgKHBzeVN0YXRpY1swXS0+aXNMRkUpKSB7CisgICAgdG5zRGF0YVswXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmVbSElGSUxUXSA9IDA7CisgICAgdG5zRGF0YVswXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmVbTE9GSUxUXSA9IDA7CisgIH0gZWxzZSB7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIGlmICghaXNTaG9ydFdpbmRvd1tjaF0pIHsKKyAgICAgICAgLyogdG9uYWxpdHkgKi8KKyAgICAgICAgRkRLYWFjRW5jX0NhbGN1bGF0ZUZ1bGxUb25hbGl0eSgKKyAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0sIHBTZmJNYXhTY2FsZVNwZWNbY2hdLAorICAgICAgICAgICAgcFNmYkVuZXJneUxkRGF0YVtjaF0sIHNmYlRvbmFsaXR5W2NoXSwgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwKKyAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk9mZnNldCwgaFRoaXNQc3lDb25mW2NoXS0+cG5zQ29uZi51c2VQbnMpOworICAgICAgfQogICAgIH0gLyogY2ggKi8KIAotICAgIC8qIERvIHNvbWUgcmVzY2FsaW5nIHRvIGdldCBtYXhpbXVtIHBvc3NpYmxlIGFjY3VyYWN5IGZvciBlbmVyZ2llcyAqLwotICAgIGlmICggemVyb1NwZWMgPT0gRkFMU0UpIHsKKyAgICBpZiAoaFBzeUNvbmZMb25nLT50bnNDb25mLnRuc0FjdGl2ZSB8fCBoUHN5Q29uZlNob3J0LT50bnNDb25mLnRuc0FjdGl2ZSkgeworICAgICAgSU5UIHRuc0FjdGl2ZVtUUkFOU19GQUNdID0gezB9OworICAgICAgSU5UIG5yZ1NjYWxpbmdbMl0gPSB7MCwgMH07CisgICAgICBJTlQgdG5zU3BlY1NoaWZ0ID0gMDsKIAotICAgICAgICAvKiBDYWxjIHBvc3NpYmxlIHNwZWN0cnVtIGxlZnRzaGlmdCBmb3IgZWFjaCBzZmIgKDEgbWVhbnM6IDEgYml0IGxlZnQgc2hpZnQgaXMgcG9zc2libGUgd2l0aG91dCBvdmVyZmxvdykgKi8KLSAgICAgICAgSU5UIG1pblNwZWNTaGlmdCA9IE1BWF9TSElGVF9EQkw7Ci0gICAgICAgIElOVCBucmdTaGlmdCAgICAgPSBNQVhfU0hJRlRfREJMOwotICAgICAgICBJTlQgZmluYWxTaGlmdCAgID0gTUFYX1NISUZUX0RCTDsKLSAgICAgICAgRklYUF9EQkwgY3Vyck5yZyA9IDA7Ci0gICAgICAgIEZJWFBfREJMIG1heE5yZyAgPSAwOworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgZm9yICh3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKSB7CisgICAgICAgICAgd09mZnNldCA9IHcgKiB3aW5kb3dMZW5ndGhbY2hdOworICAgICAgICAgIC8qIFROUyAqLworICAgICAgICAgIEZES2FhY0VuY19UbnNEZXRlY3QoCisgICAgICAgICAgICAgIHRuc0RhdGFbY2hdLCAmaFRoaXNQc3lDb25mW2NoXS0+dG5zQ29uZiwKKyAgICAgICAgICAgICAgJnBzeU91dENoYW5uZWxbY2hdLT50bnNJbmZvLCBoVGhpc1BzeUNvbmZbY2hdLT5zZmJDbnQsCisgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0gKyB3T2Zmc2V0LCB3LAorICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlKTsKKyAgICAgICAgfQorICAgICAgfQogCi0gICAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgICAgIGZvcih3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKSB7Ci0gICAgICAgICAgICAgICAgd09mZnNldCA9IHcqd2luZG93TGVuZ3RoW2NoXTsKLSAgICAgICAgICAgICAgICBGREthYWNFbmNfQ2FsY1NmYk1heFNjYWxlU3BlYyhwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtK3dPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdK3cqbWF4U2ZiW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKTsKKyAgICAgIGlmIChjaGFubmVscyA9PSAyKSB7CisgICAgICAgIEZES2FhY0VuY19UbnNTeW5jKAorICAgICAgICAgICAgdG5zRGF0YVsxXSwgdG5zRGF0YVswXSwgJnBzeU91dENoYW5uZWxbMV0tPnRuc0luZm8sCisgICAgICAgICAgICAmcHN5T3V0Q2hhbm5lbFswXS0+dG5zSW5mbywKIAotICAgICAgICAgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKQotICAgICAgICAgICAgICAgICAgICBtaW5TcGVjU2hpZnQgPSBmaXhNaW4obWluU3BlY1NoaWZ0LCAocFNmYk1heFNjYWxlU3BlY1tjaF0rdyptYXhTZmJbY2hdKVtzZmJdKTsKKyAgICAgICAgICAgIHBzeVN0YXRpY1sxXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSwKKyAgICAgICAgICAgIHBzeVN0YXRpY1swXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSwKKyAgICAgICAgICAgICZoVGhpc1BzeUNvbmZbMV0tPnRuc0NvbmYpOworICAgICAgfQorCisgICAgICBpZiAoY2hhbm5lbHMgPj0gMSkgeworICAgICAgICBGREtfQVNTRVJUKDEgPT0gY29tbW9uV2luZG93KTsgLyogYWxsIGNoZWNrcyBmb3IgVE5TIGRvIG9ubHkgd29yayBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbiB3aW5kb3dzICh3aGljaCBpcyBhbHdheXMgc2V0KSovCisgICAgICAgIGZvciAodyA9IDA7IHcgPCBuV2luZG93c1swXTsgdysrKSB7CisgICAgICAgICAgaWYgKGlzU2hvcnRXaW5kb3dbMF0pCisgICAgICAgICAgICB0bnNBY3RpdmVbd10gPQorICAgICAgICAgICAgICAgIHRuc0RhdGFbMF0tPmRhdGFSYXcuU2hvcnQuc3ViQmxvY2tJbmZvW3ddLnRuc0FjdGl2ZVtISUZJTFRdIHx8CisgICAgICAgICAgICAgICAgdG5zRGF0YVswXS0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bd10udG5zQWN0aXZlW0xPRklMVF0gfHwKKyAgICAgICAgICAgICAgICB0bnNEYXRhW2NoYW5uZWxzIC0gMV0KKyAgICAgICAgICAgICAgICAgICAgLT5kYXRhUmF3LlNob3J0LnN1YkJsb2NrSW5mb1t3XQorICAgICAgICAgICAgICAgICAgICAudG5zQWN0aXZlW0hJRklMVF0gfHwKKyAgICAgICAgICAgICAgICB0bnNEYXRhW2NoYW5uZWxzIC0gMV0KKyAgICAgICAgICAgICAgICAgICAgLT5kYXRhUmF3LlNob3J0LnN1YkJsb2NrSW5mb1t3XQorICAgICAgICAgICAgICAgICAgICAudG5zQWN0aXZlW0xPRklMVF07CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG5zQWN0aXZlW3ddID0KKyAgICAgICAgICAgICAgICB0bnNEYXRhWzBdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZVtISUZJTFRdIHx8CisgICAgICAgICAgICAgICAgdG5zRGF0YVswXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmVbTE9GSUxUXSB8fAorICAgICAgICAgICAgICAgIHRuc0RhdGFbY2hhbm5lbHMgLSAxXQorICAgICAgICAgICAgICAgICAgICAtPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlW0hJRklMVF0gfHwKKyAgICAgICAgICAgICAgICB0bnNEYXRhW2NoYW5uZWxzIC0gMV0KKyAgICAgICAgICAgICAgICAgICAgLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZVtMT0ZJTFRdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGlmICh0bnNBY3RpdmVbMF0gJiYgIWlzU2hvcnRXaW5kb3dbY2hdKSB7CisgICAgICAgICAgLyogU2NhbGUgZG93biBzcGVjdHJ1bSBpZiB0bnMgaXMgYWN0aXZlIGluIG9uZSBvZiB0aGUgdHdvIGNoYW5uZWxzCisgICAgICAgICAgICogd2l0aCBzYW1lIGxhc3RXaW5kb3dTZXF1ZW5jZSAqLworICAgICAgICAgIC8qIGZpcnN0IHBhcnQgb2YgdGhyZXNob2xkIGNhbGN1bGF0aW9uOyBpdCdzIG5vdCBuZWNlc3NhcnkgdG8gdXBkYXRlCisgICAgICAgICAgICogc2ZiTWF4U2NhbGVTcGVjICovCisgICAgICAgICAgSU5UIHNoaWZ0ID0gMTsKKyAgICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IGhUaGlzUHN5Q29uZltjaF0tPmxvd3Bhc3NMaW5lOyBzZmIrKykgeworICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtzZmJdID0KKyAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW3NmYl0gPj4gc2hpZnQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogdXBkYXRlIHRocmVzaG9sZHMgKi8KKyAgICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKSB7CisgICAgICAgICAgICBwU2ZiVGhyZXNob2xkW2NoXVtzZmJdID4+PSAoMiAqIHNoaWZ0KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNjYWxlICs9IHNoaWZ0OyAvKiB1cGRhdGUgbWRjdFNjYWxlICovCisKKyAgICAgICAgICAvKiBjYWxjIHNmYkVuZXJnaWVzIGFmdGVyIHRuc0VuY29kZSBhZ2FpbiAhICovCisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgZm9yICh3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKSB7CisgICAgICAgICAgd09mZnNldCA9IHcgKiB3aW5kb3dMZW5ndGhbY2hdOworICAgICAgICAgIEZES2FhY0VuY19UbnNFbmNvZGUoCisgICAgICAgICAgICAgICZwc3lPdXRDaGFubmVsW2NoXS0+dG5zSW5mbywgdG5zRGF0YVtjaF0sCisgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYkNudCwgJmhUaGlzUHN5Q29uZltjaF0tPnRuc0NvbmYsCisgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk9mZnNldFtwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlXSwKKyAgICAgICAgICAgICAgLypoVGhpc1BzeUNvbmZbY2hdLT5sb3dwYXNzTGluZSovIC8qIGZpbHRlciBzdG9wcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgISAqLworICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSArCisgICAgICAgICAgICAgICAgICB3T2Zmc2V0LAorICAgICAgICAgICAgICB3LCBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlKTsKKworICAgICAgICAgIGlmICh0bnNBY3RpdmVbd10pIHsKKyAgICAgICAgICAgIC8qIENhbGMgc2ZiLWJhbmR3aXNlIG1kY3QtZW5lcmdpZXMgZm9yIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgYWdhaW4sCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qIGlmIHRucyBhY3RpdmUgaW4gY3VycmVudCBjaGFubmVsIG9yIGluIG9uZSBjaGFubmVsIHdpdGggc2FtZQorICAgICAgICAgICAgICogbGFzdFdpbmRvd1NlcXVlbmNlIGxlZnQgYW5kIHJpZ2h0ICovCisgICAgICAgICAgICBGREthYWNFbmNfQ2FsY1NmYk1heFNjYWxlU3BlYyhwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtICsgd09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdICsgdyAqIG1heFNmYltjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgZm9yICh3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKSB7CisgICAgICAgICAgaWYgKHRuc0FjdGl2ZVt3XSkgeworICAgICAgICAgICAgaWYgKGlzU2hvcnRXaW5kb3dbY2hdKSB7CisgICAgICAgICAgICAgIEZES2FhY0VuY19DYWxjQmFuZEVuZXJneU9wdGltU2hvcnQoCisgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtICsgdyAqIHdpbmRvd0xlbmd0aFtjaF0sCisgICAgICAgICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjW2NoXSArIHcgKiBtYXhTZmJbY2hdLAorICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiT2Zmc2V0LCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneVtjaF0gKyB3ICogbWF4U2ZiW2NoXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBucmdTY2FsaW5nW2NoXSA9IC8qIHdpdGggdG5zLCBlbmVyZ3kgY2FsY3VsYXRpb24gY2FuIG92ZXJmbG93OyAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxpbmcgKi8KKyAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19DYWxjQmFuZEVuZXJneU9wdGltTG9uZygKKyAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtLCBwU2ZiTWF4U2NhbGVTcGVjW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJPZmZzZXQsIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneVtjaF0sIHBTZmJFbmVyZ3lMZERhdGFbY2hdKTsKKyAgICAgICAgICAgICAgdG5zU3BlY1NoaWZ0ID0KKyAgICAgICAgICAgICAgICAgIGZpeE1heCh0bnNTcGVjU2hpZnQsIG5yZ1NjYWxpbmdbY2hdKTsgLyogbnJnU2NhbGluZyBpcyBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seSBpZiBucmcgd291bGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBhbiBvdmVyZmxvdyAqLwogICAgICAgICAgICAgfQorICAgICAgICAgIH0gLyogaWYgdG5zQWN0aXZlICovCisgICAgICAgIH0KKyAgICAgIH0gLyogZW5kIGNoYW5uZWwgbG9vcCAqLwogCisgICAgICAvKiBhZGFwdCBzY2FsaW5nIHRvIHByZXZlbnQgbnJnIG92ZXJmbG93LCBvbmx5IGZvciBsb25nIGJsb2NrcyAqLworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgaWYgKCh0bnNTcGVjU2hpZnQgIT0gMCkgJiYgIWlzU2hvcnRXaW5kb3dbY2hdKSB7CisgICAgICAgICAgLyogc2NhbGUgZG93biBzcGVjdHJ1bSwgbnJnJ3MgYW5kIHRocmVzaG9sZHMsIGlmIHRoZXJlIHdhcyBhbiBvdmVyZmxvdworICAgICAgICAgICAqIGluIHNmYk5yZyBjYWxjdWxhdGlvbiBhZnRlciB0bnMgKi8KKyAgICAgICAgICBmb3IgKGxpbmUgPSAwOyBsaW5lIDwgaFRoaXNQc3lDb25mW2NoXS0+bG93cGFzc0xpbmU7IGxpbmUrKykgeworICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtsaW5lXSA+Pj0gdG5zU3BlY1NoaWZ0OworICAgICAgICAgIH0KKyAgICAgICAgICBJTlQgc2NhbGUgPSAodG5zU3BlY1NoaWZ0IC0gbnJnU2NhbGluZ1tjaF0pIDw8IDE7CisgICAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlOyBzZmIrKykgeworICAgICAgICAgICAgcFNmYkVuZXJneUxkRGF0YVtjaF1bc2ZiXSAtPQorICAgICAgICAgICAgICAgIHNjYWxlICogRkwyRlhDT05TVF9EQkwoMS4wIC8gTERfREFUQV9TQ0FMSU5HKTsKKyAgICAgICAgICAgIHBTZmJFbmVyZ3lbY2hdW3NmYl0gPj49IHNjYWxlOworICAgICAgICAgICAgcFNmYlRocmVzaG9sZFtjaF1bc2ZiXSA+Pj0gKHRuc1NwZWNTaGlmdCA8PCAxKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTY2FsZSArPSB0bnNTcGVjU2hpZnQ7IC8qIHVwZGF0ZSBtZGN0U2NhbGU7IG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcnkgdG8gdXBkYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk1heFNjYWxlU3BlYyAqLworICAgICAgICB9CisgICAgICB9IC8qIGVuZCBjaGFubmVsIGxvb3AgKi8KKworICAgIH0gLyogVE5TIGFjdGl2ZSAqLworICAgIGVsc2UgeworICAgICAgLyogSW4gY2FzZSBvZiBkaXNhYmxlIFROUywgcmVzZXQgaXRzIGR5bmFtaWMgZGF0YS4gU29tZSBvZiBpdHMgZWxlbWVudHMgaXMKKyAgICAgICAqIHJlcXVpcmVkIGluIFBOUyBkZXRlY3Rpb24gYmVsb3cuICovCisgICAgICBGREttZW1jbGVhcihwc3lEeW5hbWljLT50bnNEYXRhLCBzaXplb2YocHN5RHluYW1pYy0+dG5zRGF0YSkpOworICAgIH0KKyAgfSAvKiAhaXNMRkUgKi8KKworICAvKiBBZHZhbmNlIHRocmVzaG9sZHMgKi8KKyAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICBJTlQgaGVhZHJvb207CisKKyAgICBGSVhQX0RCTCBjbGlwRW5lcmd5OworICAgIElOVCBlbmVyZ3lTaGlmdCA9IHBzeURhdGFbY2hdLT5tZGN0U2NhbGUgKiAyOworICAgIElOVCBjbGlwTnJnU2hpZnQgPSBlbmVyZ3lTaGlmdCAtIFRIUl9TSElGVEJJVFM7CisgICAgaWYgKGlzU2hvcnRXaW5kb3dbY2hdKQorICAgICAgaGVhZHJvb20gPSA2OworICAgIGVsc2UKKyAgICAgIGhlYWRyb29tID0gMDsKKworICAgIGlmIChjbGlwTnJnU2hpZnQgPj0gMCkKKyAgICAgIGNsaXBFbmVyZ3kgPSBoVGhpc1BzeUNvbmZbY2hdLT5jbGlwRW5lcmd5ID4+IGNsaXBOcmdTaGlmdDsKKyAgICBlbHNlIGlmIChjbGlwTnJnU2hpZnQgPj0gLWhlYWRyb29tKQorICAgICAgY2xpcEVuZXJneSA9IGhUaGlzUHN5Q29uZltjaF0tPmNsaXBFbmVyZ3kgPDwgLWNsaXBOcmdTaGlmdDsKKyAgICBlbHNlCisgICAgICBjbGlwRW5lcmd5ID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CisKKyAgICBmb3IgKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKKyAgICAgIElOVCBpOworICAgICAgLyogbGltaXQgdGhyZXNob2xkIHRvIGF2b2lkIGNsaXBwaW5nICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgaSsrKSB7CisgICAgICAgICoocFNmYlRocmVzaG9sZFtjaF0gKyB3ICogbWF4U2ZiW2NoXSArIGkpID0KKyAgICAgICAgICAgIGZpeE1pbigqKHBTZmJUaHJlc2hvbGRbY2hdICsgdyAqIG1heFNmYltjaF0gKyBpKSwgY2xpcEVuZXJneSk7CisgICAgICB9CisKKyAgICAgIC8qIHNwcmVhZGluZyAqLworICAgICAgRkRLYWFjRW5jX1NwcmVhZGluZ01heChwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJNYXNrTG93RmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJNYXNrSGlnaEZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYlRocmVzaG9sZFtjaF0gKyB3ICogbWF4U2ZiW2NoXSk7CisKKyAgICAgIC8qIFBDTSBxdWFudGl6YXRpb24gdGhyZXNob2xkICovCisgICAgICBlbmVyZ3lTaGlmdCArPSBQQ01fUVVBTlRfVEhSX1NDQUxFOworICAgICAgaWYgKGVuZXJneVNoaWZ0ID49IDApIHsKKyAgICAgICAgZW5lcmd5U2hpZnQgPSBmaXhNaW4oREZSQUNUX0JJVFMgLSAxLCBlbmVyZ3lTaGlmdCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlOyBpKyspIHsKKyAgICAgICAgICAqKHBTZmJUaHJlc2hvbGRbY2hdICsgdyAqIG1heFNmYltjaF0gKyBpKSA9IGZpeE1heCgKKyAgICAgICAgICAgICAgKihwU2ZiVGhyZXNob2xkW2NoXSArIHcgKiBtYXhTZmJbY2hdICsgaSkgPj4gVEhSX1NISUZUQklUUywKKyAgICAgICAgICAgICAgKGhUaGlzUHN5Q29uZltjaF0tPnNmYlBjbVF1YW50VGhyZXNob2xkW2ldID4+IGVuZXJneVNoaWZ0KSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVuZXJneVNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTIC0gMSwgLWVuZXJneVNoaWZ0KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IGkrKykgeworICAgICAgICAgICoocFNmYlRocmVzaG9sZFtjaF0gKyB3ICogbWF4U2ZiW2NoXSArIGkpID0gZml4TWF4KAorICAgICAgICAgICAgICAqKHBTZmJUaHJlc2hvbGRbY2hdICsgdyAqIG1heFNmYltjaF0gKyBpKSA+PiBUSFJfU0hJRlRCSVRTLAorICAgICAgICAgICAgICAoaFRoaXNQc3lDb25mW2NoXS0+c2ZiUGNtUXVhbnRUaHJlc2hvbGRbaV0gPDwgZW5lcmd5U2hpZnQpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoIXBzeVN0YXRpY1tjaF0tPmlzTEZFKSB7CisgICAgICAgIC8qIHByZWVjaG8gY29udHJvbCAqLworICAgICAgICBpZiAocHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSA9PQorICAgICAgICAgICAgU1RPUF9XSU5ET1cpIHsKKyAgICAgICAgICAvKiBwcmV2ZW50IEZES2FhY0VuY19QcmVFY2hvQ29udHJvbCBmcm9tIGNvbXBhcmluZyBzdG9wCisgICAgICAgICAgICAgdGhyZXNob2xkcyB3aXRoIHNob3J0IHRocmVzaG9sZHMgKi8KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgaSsrKSB7CisgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5zZmJUaHJlc2hvbGRubTFbaV0gPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5tZGN0U2NhbGVubTEgPSAwOworICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmNhbGNQcmVFY2hvID0gMDsKICAgICAgICAgfQogCi0gICAgICAgIC8qIENhbGMgcG9zc2libGUgZW5lcmd5IGxlZnRzaGlmdCBmb3IgZWFjaCBzZmIgKDEgbWVhbnM6IDEgYml0IGxlZnQgc2hpZnQgaXMgcG9zc2libGUgd2l0aG91dCBvdmVyZmxvdykgKi8KLSAgICAgICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgewotICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKLSAgICAgICAgICAgICAgICB3T2Zmc2V0ID0gdyp3aW5kb3dMZW5ndGhbY2hdOwotICAgICAgICAgICAgICAgIGN1cnJOcmcgPSBGREthYWNFbmNfQ2hlY2tCYW5kRW5lcmd5T3B0aW0ocHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneVtjaF0rdyptYXhTZmJbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiRW5lcmd5TGREYXRhW2NoXSt3Km1heFNmYltjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblNwZWNTaGlmdC00KTsKKyAgICAgICAgRkRLYWFjRW5jX1ByZUVjaG9Db250cm9sKAorICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+c2ZiVGhyZXNob2xkbm0xLCBwc3lTdGF0aWNbY2hdLT5jYWxjUHJlRWNobywKKyAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsIGhUaGlzUHN5Q29uZltjaF0tPm1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciwKKyAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPm1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwKKyAgICAgICAgICAgIHBTZmJUaHJlc2hvbGRbY2hdICsgdyAqIG1heFNmYltjaF0sIHBzeURhdGFbY2hdLT5tZGN0U2NhbGUsCisgICAgICAgICAgICAmcHN5U3RhdGljW2NoXS0+bWRjdFNjYWxlbm0xKTsKIAotICAgICAgICAgICAgICAgIG1heE5yZyA9IGZpeE1heChtYXhOcmcsIGN1cnJOcmcpOwotICAgICAgICAgICAgfQorICAgICAgICBwc3lTdGF0aWNbY2hdLT5jYWxjUHJlRWNobyA9IDE7CisKKyAgICAgICAgaWYgKHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UgPT0KKyAgICAgICAgICAgIFNUQVJUX1dJTkRPVykgeworICAgICAgICAgIC8qIHByZXZlbnQgRkRLYWFjRW5jX1ByZUVjaG9Db250cm9sIGluIG5leHQgZnJhbWUgdG8gY29tcGFyZSBzdGFydAorICAgICAgICAgICAgIHRocmVzaG9sZHMgd2l0aCBzaG9ydCB0aHJlc2hvbGRzICovCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IGkrKykgeworICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+c2ZiVGhyZXNob2xkbm0xW2ldID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CisgICAgICAgICAgfQorCisgICAgICAgICAgcHN5U3RhdGljW2NoXS0+bWRjdFNjYWxlbm0xID0gMDsKKyAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5jYWxjUHJlRWNobyA9IDA7CiAgICAgICAgIH0KKyAgICAgIH0KIAotICAgICAgICBpZiAoIG1heE5yZyAhPSAoRklYUF9EQkwpMCApIHsKLSAgICAgICAgICAgIG5yZ1NoaWZ0ID0gKENvdW50TGVhZGluZ0JpdHMobWF4TnJnKT4+MSkgKyAobWluU3BlY1NoaWZ0LTQpOworICAgICAgLyogc3ByZWFkIGVuZXJneSB0byBhdm9pZCBob2xlIGRldGVjdGlvbiAqLworICAgICAgRkRLbWVtY3B5KHBTZmJTcHJlYWRFbmVyZ3lbY2hdICsgdyAqIG1heFNmYltjaF0sCisgICAgICAgICAgICAgICAgcFNmYkVuZXJneVtjaF0gKyB3ICogbWF4U2ZiW2NoXSwKKyAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlICogc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgICAgIEZES2FhY0VuY19TcHJlYWRpbmdNYXgocHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiTWFza0xvd0ZhY3RvclNwckVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJNYXNrSGlnaEZhY3RvclNwckVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiU3ByZWFkRW5lcmd5W2NoXSArIHcgKiBtYXhTZmJbY2hdKTsKKyAgICB9CisgIH0KKworICAvKiBDYWxjIGJhbmR3aXNlIGVuZXJnaWVzIGZvciBtaWQgYW5kIHNpZGUgY2hhbm5lbC4gRG8gaXQgb25seSBpZiAyIGNoYW5uZWxzCisgICAqIGV4aXN0ICovCisgIGlmIChjaGFubmVscyA9PSAyKSB7CisgICAgZm9yICh3ID0gMDsgdyA8IG5XaW5kb3dzWzFdOyB3KyspIHsKKyAgICAgIHdPZmZzZXQgPSB3ICogd2luZG93TGVuZ3RoWzFdOworICAgICAgRkRLYWFjRW5jX0NhbGNCYW5kTnJnTVNPcHQoCisgICAgICAgICAgcHN5RGF0YVswXS0+bWRjdFNwZWN0cnVtICsgd09mZnNldCwKKyAgICAgICAgICBwc3lEYXRhWzFdLT5tZGN0U3BlY3RydW0gKyB3T2Zmc2V0LAorICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbMF0gKyB3ICogbWF4U2ZiWzBdLAorICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbMV0gKyB3ICogbWF4U2ZiWzFdLCBoVGhpc1BzeUNvbmZbMV0tPnNmYk9mZnNldCwKKyAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJBY3RpdmUsIHBTZmJFbmVyZ3lNU1swXSArIHcgKiBtYXhTZmJbMF0sCisgICAgICAgICAgcFNmYkVuZXJneU1TWzFdICsgdyAqIG1heFNmYlsxXSwKKyAgICAgICAgICAocHN5U3RhdGljWzFdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlICE9CisgICAgICAgICAgIFNIT1JUX1dJTkRPVyksCisgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiRW5lcmd5TVNMZERhdGEsIHBzeURhdGFbMV0tPnNmYkVuZXJneU1TTGREYXRhKTsKKyAgICB9CisgIH0KKworICAvKiBncm91cCBzaG9ydCBkYXRhIChtYXhTZmJbY2hdIGZvciBzaG9ydCBibG9ja3MgaXMgZGV0ZXJtaW5lZCBoZXJlKSAqLworICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgIGlmIChpc1Nob3J0V2luZG93W2NoXSkgeworICAgICAgaW50IHNmYkdycDsKKyAgICAgIGludCBub1NmYiA9IHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ub09mR3JvdXBzICoKKyAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYkNudDsKKyAgICAgIC8qIEF0IHRoaXMgcG9pbnQsIGVuZXJnaWVzIGFuZCB0aHJlc2hvbGRzIGFyZSBjb3BpZWQvcmVncm91cGVkIGZyb20gdGhlCisgICAgICAgKiAiLlNob3J0IiB0byB0aGUgIi5Mb25nIiBhcnJheXMgKi8KKyAgICAgIEZES2FhY0VuY19ncm91cFNob3J0RGF0YSgKKyAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtLCAmcHN5RGF0YVtjaF0tPnNmYlRocmVzaG9sZCwKKyAgICAgICAgICAmcHN5RGF0YVtjaF0tPnNmYkVuZXJneSwgJnBzeURhdGFbY2hdLT5zZmJFbmVyZ3lNUywKKyAgICAgICAgICAmcHN5RGF0YVtjaF0tPnNmYlNwcmVhZEVuZXJneSwgaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAorICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsIGhQc3lDb25mU2hvcnQtPnNmYk9mZnNldCwKKyAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJNaW5TbnJMZERhdGEsIHBzeURhdGFbY2hdLT5ncm91cGVkU2ZiT2Zmc2V0LAorICAgICAgICAgICZtYXhTZmJQZXJHcm91cFtjaF0sIHBzeU91dENoYW5uZWxbY2hdLT5zZmJNaW5TbnJMZERhdGEsCisgICAgICAgICAgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHMsCisgICAgICAgICAgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmdyb3VwTGVuLAorICAgICAgICAgIHBzeUNvbmZbMV0uZ3JhbnVsZUxlbmd0aCk7CisKKyAgICAgIC8qIGNhbGN1bGF0ZSBsZERhdGEgYXJyYXlzIChzaG9ydCB2YWx1ZXMgYXJlIGluIC5Mb25nLWFycmF5cyBhZnRlcgorICAgICAgICogRkRLYWFjRW5jX2dyb3VwU2hvcnREYXRhKSAqLworICAgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBub1NmYjsgc2ZiR3JwICs9IGhQc3lDb25mU2hvcnQtPnNmYkNudCkgeworICAgICAgICBMZERhdGFWZWN0b3IoJnBzeURhdGFbY2hdLT5zZmJFbmVyZ3kuTG9uZ1tzZmJHcnBdLAorICAgICAgICAgICAgICAgICAgICAgJnBzeU91dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3lMZERhdGFbc2ZiR3JwXSwKKyAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpOworICAgICAgfQorCisgICAgICAvKiBjYWxjIHNmYlRocmxkIGFuZCBzZXQgVmFsdWVzIHNtYWxsZXIgMl4tMzEgdG8gMl4tMzMqLworICAgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBub1NmYjsgc2ZiR3JwICs9IGhQc3lDb25mU2hvcnQtPnNmYkNudCkgeworICAgICAgICBMZERhdGFWZWN0b3IoJnBzeURhdGFbY2hdLT5zZmJUaHJlc2hvbGQuTG9uZ1tzZmJHcnBdLAorICAgICAgICAgICAgICAgICAgICAgJnBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwXSwKKyAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpOworICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKSB7CisgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtzZmJHcnAgKyBzZmJdID0KKyAgICAgICAgICAgICAgZml4TWF4KHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwICsgc2ZiXSwKKyAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKC0wLjUxNTYyNWYpKTsKICAgICAgICAgfQorICAgICAgfQogCi0gICAgICAgIC8qIDJjaGVjazogSGFzbid0IHRoaXMgZGVjaXNpb24gdG8gYmUgbWFkZSBmb3IgYm90aCBjaGFubmVscz8gKi8KLSAgICAgICAgLyogRm9yIHNob3J0IHdpbmRvd3MgMSBhZGRpdGlvbmFsIGJpdCBoZWFkcm9vbSBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCBvdmVyZmxvd3Mgd2hlbiBzdW1taW5nIHVwIGVuZXJnaWVzIGluIEZES2FhY0VuY19ncm91cFNob3J0RGF0YSgpICovCi0gICAgICAgIGlmKGlzU2hvcnRXaW5kb3dbMF0pIG5yZ1NoaWZ0LS07Ci0KLSAgICAgICAgLyogYm90aCBzcGVjdHJ1bSBhbmQgZW5lcmdpZXMgbXVzdG4ndCBvdmVyZmxvdyAqLwotICAgICAgICBmaW5hbFNoaWZ0ID0gZml4TWluKG1pblNwZWNTaGlmdCwgbnJnU2hpZnQpOwotCi0gICAgICAgIC8qIGRvIG5vdCBzaGlmdCBtb3JlIHRoYW4gMyBiaXRzIG1vcmUgdG8gdGhlIGxlZnQgdGhhbiBzaWduYWwgd2l0aG91dCBibG9ja2Zsb2F0aW5nIHBvaW50Ci0gICAgICAgICAqIHdvdWxkIGJlIHRvIGF2b2lkIG92ZXJmbG93IG9mIHNjYWxlZCBQQ00gcXVhbnRpemF0aW9uIHRocmVzaG9sZHMgKi8KLSAgICAgICAgaWYgKGZpbmFsU2hpZnQgPiBwc3lEYXRhWzBdLT5tZGN0U2NhbGUgKyAzICkKLSAgICAgICAgICAgIGZpbmFsU2hpZnQgPSBwc3lEYXRhWzBdLT5tZGN0U2NhbGUgKyAzOwotCi0gICAgICAgIEZES19BU1NFUlQoZmluYWxTaGlmdCA+PSAwKTsgICAgLyogcmlnaHQgc2hpZnQgaXMgbm90IGFsbG93ZWQgKi8KLQotICAgICAgICAvKiBjb3JyZWN0IHNmYkVuZXJneSBhbmQgc2ZiRW5lcmd5TGREYXRhIHdpdGggbmV3IGZpbmFsU2hpZnQgKi8KLSAgICAgICAgRklYUF9EQkwgbGRTaGlmdCA9IGZpbmFsU2hpZnQgKiBGTDJGWENPTlNUX0RCTCgyLjAvNjQpOwotICAgICAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgICAgICBmb3IodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgewotICAgICAgICAgICAgICAgIGZvcihzZmI9MDsgc2ZiPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIElOVCBzY2FsZSA9IGZpeE1heCgwLCAocFNmYk1heFNjYWxlU3BlY1tjaF0rdyptYXhTZmJbY2hdKVtzZmJdLTQpOwotICAgICAgICAgICAgICAgICAgICBzY2FsZSAgICAgPSBmaXhNaW4oKHNjYWxlLWZpbmFsU2hpZnQpPDwxLCBERlJBQ1RfQklUUy0xKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxlID49IDApIChwU2ZiRW5lcmd5W2NoXSt3Km1heFNmYltjaF0pW3NmYl0gPj49IChzY2FsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAocFNmYkVuZXJneVtjaF0rdyptYXhTZmJbY2hdKVtzZmJdIDw8PSAoLXNjYWxlKTsKLSAgICAgICAgICAgICAgICAgICAgKHBTZmJUaHJlc2hvbGRbY2hdK3cqbWF4U2ZiW2NoXSlbc2ZiXSA9IGZNdWx0KChwU2ZiRW5lcmd5W2NoXSt3Km1heFNmYltjaF0pW3NmYl0sIENfUkFUSU8pOwotICAgICAgICAgICAgICAgICAgICAocFNmYkVuZXJneUxkRGF0YVtjaF0rdyptYXhTZmJbY2hdKVtzZmJdICs9IGxkU2hpZnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgaWYgKGNoYW5uZWxzID09IDIpIHsKKyAgICAgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBub1NmYjsgc2ZiR3JwICs9IGhQc3lDb25mU2hvcnQtPnNmYkNudCkgeworICAgICAgICAgIExkRGF0YVZlY3RvcigmcHN5RGF0YVtjaF0tPnNmYkVuZXJneU1TLkxvbmdbc2ZiR3JwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLT5zZmJFbmVyZ3lNU0xkRGF0YVtzZmJHcnBdLAorICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKTsKICAgICAgICAgfQorICAgICAgfQogCi0gICAgICAgIGlmICggZmluYWxTaGlmdCAhPSAwICkgewotICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgICAgICAgICBmb3IodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgewotICAgICAgICAgICAgICAgICAgICB3T2Zmc2V0ID0gdyp3aW5kb3dMZW5ndGhbY2hdOwotICAgICAgICAgICAgICAgICAgICBmb3IobGluZT0wOyBsaW5lPHBzeURhdGFbY2hdLT5sb3dwYXNzTGluZTsgbGluZSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtW2xpbmUrd09mZnNldF0gPDw9IGZpbmFsU2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHNmYk1heFNjYWxlU3BlYyAqLwotICAgICAgICAgICAgICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYjxwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlOyBzZmIrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIChwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0pW3NmYl0gLT0gZmluYWxTaGlmdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogdXBkYXRlIG1kY3RTY2FsZSAqLwotICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U2NhbGUgLT0gZmluYWxTaGlmdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5zZmJPZmZzZXRzLCBwc3lEYXRhW2NoXS0+Z3JvdXBlZFNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAoTUFYX0dST1VQRURfU0ZCICsgMSkgKiBzaXplb2YoSU5UKSk7CiAKICAgICB9IGVsc2UgewotICAgICAgICAvKiBhbGwgc3BlY3RyYWwgbGluZXMgYXJlIHplcm8gKi8KLSAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U2NhbGUgPSAwOyAgICAgLyogb3RoZXJ3aXNlIG1kY3RTY2FsZSB3b3VsZCBiZSBmb3IgZXhhbXBsZSA3IGFuZCBQQ00gcXVhbnRpemF0aW9uIHRocmVzaG9sZHMgd291bGQgYmUgc2hpZnRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAxNCBiaXRzIHRvIHRoZSByaWdodCBjYXVzaW5nIHNvbWUgb2YgdGhlbSB0byBiZWNvbWUgMCAod2hpY2ggY2F1c2VzIHByb2JsZW1zIGxhdGVyKSAqLwotICAgICAgICAgICAgLyogY2xlYXIgc2ZiTWF4U2NhbGVTcGVjICovCi0gICAgICAgICAgICBmb3IodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykgewotICAgICAgICAgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIChwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0pW3NmYl0gPSAwOwotICAgICAgICAgICAgICAgICAgICAocFNmYkVuZXJneVtjaF0rdyptYXhTZmJbY2hdKVtzZmJdICAgICAgID0gKEZJWFBfREJMKTA7Ci0gICAgICAgICAgICAgICAgICAgIChwU2ZiRW5lcmd5TGREYXRhW2NoXSt3Km1heFNmYltjaF0pW3NmYl0gPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7Ci0gICAgICAgICAgICAgICAgICAgIChwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0pW3NmYl0gICAgPSAoRklYUF9EQkwpMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICBpbnQgaTsKKyAgICAgIC8qIG1heFNmYltjaF0gZm9yIGxvbmcgYmxvY2tzICovCisgICAgICBmb3IgKHNmYiA9IHBzeURhdGFbY2hdLT5zZmJBY3RpdmUgLSAxOyBzZmIgPj0gMDsgc2ZiLS0pIHsKKyAgICAgICAgZm9yIChsaW5lID0gaFBzeUNvbmZMb25nLT5zZmJPZmZzZXRbc2ZiICsgMV0gLSAxOworICAgICAgICAgICAgIGxpbmUgPj0gaFBzeUNvbmZMb25nLT5zZmJPZmZzZXRbc2ZiXTsgbGluZS0tKSB7CisgICAgICAgICAgaWYgKHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW1bbGluZV0gIT0gRkwyRlhDT05TVF9TR0woMC4wZikpIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGlmIChsaW5lID4gaFBzeUNvbmZMb25nLT5zZmJPZmZzZXRbc2ZiXSkgYnJlYWs7CisgICAgICB9CisgICAgICBtYXhTZmJQZXJHcm91cFtjaF0gPSBzZmIgKyAxOworICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdID0KKyAgICAgICAgICBmaXhNYXgoZml4TWluKDUsIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUpLCBtYXhTZmJQZXJHcm91cFtjaF0pOworCisgICAgICAvKiBzZmJOcmdMZERhdGEgaXMgY2FsY3VsYXRlZCBpbiBGREthYWNFbmNfYWR2YW5jZVBzeWNoTG9uZywgY29weSBpbgorICAgICAgICogcHN5T3V0IHN0cnVjdHVyZSAqLworICAgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3lMZERhdGEsCisgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkVuZXJneUxkRGF0YS5Mb25nLAorICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUgKiBzaXplb2YoRklYUF9EQkwpKTsKKworICAgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5zZmJPZmZzZXRzLCBoUHN5Q29uZkxvbmctPnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAoTUFYX0dST1VQRURfU0ZCICsgMSkgKiBzaXplb2YoSU5UKSk7CisKKyAgICAgIC8qIHNmYk1pblNuckxkRGF0YSBtb2RpZmllZCBpbiBhZGp1c3QgdGhyZXNob2xkLCBjb3B5IG5lY2Vzc2FyeSAqLworICAgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5zZmJNaW5TbnJMZERhdGEsCisgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJNaW5TbnJMZERhdGEsCisgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSAqIHNpemVvZihGSVhQX0RCTCkpOworCisgICAgICAvKiBzZmJFbmVyZ3lNU0xkRGF0YSBpc3QgYWxyZWFkeSBjYWxjdWxhdGVkIGluIEZES2FhY0VuY19DYWxjQmFuZE5yZ01TT3B0OworICAgICAgICogb25seSBpbiBsb25nIGNhc2UgKi8KKworICAgICAgLyogY2FsYyBzZmJUaHJsZCBhbmQgc2V0IFZhbHVlcyBzbWFsbGVyIDJeLTMxIHRvIDJeLTMzKi8KKyAgICAgIExkRGF0YVZlY3Rvcihwc3lEYXRhW2NoXS0+c2ZiVGhyZXNob2xkLkxvbmcsCisgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YSwKKyAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlOyBpKyspIHsKKyAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtpXSA9CisgICAgICAgICAgICBmaXhNYXgocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YVtpXSwKKyAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgtMC41MTU2MjVmKSk7CisgICAgICB9CiAgICAgfQorICB9CiAKLSAgICAvKiBBZHZhbmNlIHBzeWNob2Fjb3VzdGljczogVG9uYWxpdHkgYW5kIFROUyAqLwotICAgIGlmIChwc3lTdGF0aWNbMF0tPmlzTEZFKSB7Ci0gICAgICAgIHRuc0RhdGFbMF0tPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlW0hJRklMVF0gPSAwOwotICAgICAgICB0bnNEYXRhWzBdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZVtMT0ZJTFRdID0gMDsKKyAgLyoKKyAgICAgIEludGVuc2l0eSBwYXJhbWV0ZXIgaW50aWFsaXphdGlvbi4KKyAgICovCisgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgRkRLbWVtY2xlYXIocHN5T3V0Q2hhbm5lbFtjaF0tPmlzQm9vaywgTUFYX0dST1VQRURfU0ZCICogc2l6ZW9mKElOVCkpOworICAgIEZES21lbWNsZWFyKHBzeU91dENoYW5uZWxbY2hdLT5pc1NjYWxlLCBNQVhfR1JPVVBFRF9TRkIgKiBzaXplb2YoSU5UKSk7CisgIH0KKworICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgIElOVCB3aW4gPSAoaXNTaG9ydFdpbmRvd1tjaF0gPyAxIDogMCk7CisgICAgaWYgKCFwc3lTdGF0aWNbY2hdLT5pc0xGRSkgeworICAgICAgLyogUE5TIERlY2lzaW9uICovCisgICAgICBGREthYWNFbmNfUG5zRGV0ZWN0KAorICAgICAgICAgICYocHN5Q29uZlswXS5wbnNDb25mKSwgcG5zRGF0YVtjaF0sCisgICAgICAgICAgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSwKKyAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAorICAgICAgICAgIG1heFNmYlBlckdyb3VwW2NoXSwgLyogY291bnQgb2YgU2ZiIHdoaWNoIGFyZSBub3QgemVyby4gKi8KKyAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhLCBwc3lDb25mW3dpbl0uc2ZiT2Zmc2V0LAorICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0sIHBzeURhdGFbY2hdLT5zZmJNYXhTY2FsZVNwZWMuTG9uZywKKyAgICAgICAgICBzZmJUb25hbGl0eVtjaF0sIHBzeU91dENoYW5uZWxbY2hdLT50bnNJbmZvLm9yZGVyWzBdWzBdLAorICAgICAgICAgIHRuc0RhdGFbY2hdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnByZWRpY3Rpb25HYWluW0hJRklMVF0sCisgICAgICAgICAgdG5zRGF0YVtjaF0tPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlW0hJRklMVF0sCisgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneUxkRGF0YSwgcHN5T3V0Q2hhbm5lbFtjaF0tPm5vaXNlTnJnKTsKKyAgICB9IC8qICFpc0xGRSAqLworICB9ICAgLyogY2ggKi8KKworICAvKgorICAgICAgc3RlcmVvIFByb2Nlc3NpbmcKKyAgKi8KKyAgaWYgKGNoYW5uZWxzID09IDIpIHsKKyAgICBwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNEaWdlc3QgPSBNU19OT05FOworICAgIHBzeU91dEVsZW1lbnQtPmNvbW1vbldpbmRvdyA9IGNvbW1vbldpbmRvdzsKKyAgICBpZiAocHN5T3V0RWxlbWVudC0+Y29tbW9uV2luZG93KQorICAgICAgbWF4U2ZiUGVyR3JvdXBbMF0gPSBtYXhTZmJQZXJHcm91cFsxXSA9CisgICAgICAgICAgZml4TWF4KG1heFNmYlBlckdyb3VwWzBdLCBtYXhTZmJQZXJHcm91cFsxXSk7CisgICAgaWYgKHBzeVN0YXRpY1swXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSAhPQorICAgICAgICBTSE9SVF9XSU5ET1cpIHsKKyAgICAgIC8qIFBOUyBwcmVwcm9jZXNzaW5nIGRlcGVuZGluZyBvbiBtcyBwcm9jZXNzaW5nOiBQTlMgbm90IGluIFNob3J0IFdpbmRvdyEKKyAgICAgICAqLworICAgICAgRkRLYWFjRW5jX1ByZVByb2Nlc3NQbnNDaGFubmVsUGFpcigKKyAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJBY3RpdmUsICgmcHN5RGF0YVswXS0+c2ZiRW5lcmd5KS0+TG9uZywKKyAgICAgICAgICAoJnBzeURhdGFbMV0tPnNmYkVuZXJneSktPkxvbmcsIHBzeU91dENoYW5uZWxbMF0tPnNmYkVuZXJneUxkRGF0YSwKKyAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5zZmJFbmVyZ3lMZERhdGEsIHBzeURhdGFbMF0tPnNmYkVuZXJneU1TLkxvbmcsCisgICAgICAgICAgJihwc3lDb25mWzBdLnBuc0NvbmYpLCBwbnNEYXRhWzBdLCBwbnNEYXRhWzFdKTsKKworICAgICAgRkRLYWFjRW5jX0ludGVuc2l0eVN0ZXJlb1Byb2Nlc3NpbmcoCisgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiRW5lcmd5LkxvbmcsIHBzeURhdGFbMV0tPnNmYkVuZXJneS5Mb25nLAorICAgICAgICAgIHBzeURhdGFbMF0tPm1kY3RTcGVjdHJ1bSwgcHN5RGF0YVsxXS0+bWRjdFNwZWN0cnVtLAorICAgICAgICAgIHBzeURhdGFbMF0tPnNmYlRocmVzaG9sZC5Mb25nLCBwc3lEYXRhWzFdLT5zZmJUaHJlc2hvbGQuTG9uZywKKyAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5zZmJUaHJlc2hvbGRMZERhdGEsCisgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiU3ByZWFkRW5lcmd5LkxvbmcsIHBzeURhdGFbMV0tPnNmYlNwcmVhZEVuZXJneS5Mb25nLAorICAgICAgICAgIHBzeU91dENoYW5uZWxbMF0tPnNmYkVuZXJneUxkRGF0YSwgcHN5T3V0Q2hhbm5lbFsxXS0+c2ZiRW5lcmd5TGREYXRhLAorICAgICAgICAgICZwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNEaWdlc3QsIHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc01hc2ssCisgICAgICAgICAgcHN5Q29uZlswXS5zZmJDbnQsIHBzeUNvbmZbMF0uc2ZiQ250LCBtYXhTZmJQZXJHcm91cFswXSwKKyAgICAgICAgICBwc3lDb25mWzBdLnNmYk9mZnNldCwKKyAgICAgICAgICBwc3lDb25mWzBdLmFsbG93SVMgJiYgcHN5T3V0RWxlbWVudC0+Y29tbW9uV2luZG93LAorICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPmlzQm9vaywgcHN5T3V0Q2hhbm5lbFsxXS0+aXNTY2FsZSwgcG5zRGF0YSk7CisKKyAgICAgIEZES2FhY0VuY19Nc1N0ZXJlb1Byb2Nlc3NpbmcoCisgICAgICAgICAgcHN5RGF0YSwgcHN5T3V0Q2hhbm5lbCwgcHN5T3V0Q2hhbm5lbFsxXS0+aXNCb29rLAorICAgICAgICAgICZwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNEaWdlc3QsIHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc01hc2ssCisgICAgICAgICAgcHN5Q29uZlswXS5hbGxvd01TLCBwc3lEYXRhWzBdLT5zZmJBY3RpdmUsIHBzeURhdGFbMF0tPnNmYkFjdGl2ZSwKKyAgICAgICAgICBtYXhTZmJQZXJHcm91cFswXSwgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiT2Zmc2V0cyk7CisKKyAgICAgIC8qIFBOUyBwb3N0cHJvY2Vzc2luZyAqLworICAgICAgRkRLYWFjRW5jX1Bvc3RQcm9jZXNzUG5zQ2hhbm5lbFBhaXIoCisgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiQWN0aXZlLCAmKHBzeUNvbmZbMF0ucG5zQ29uZiksIHBuc0RhdGFbMF0sIHBuc0RhdGFbMV0sCisgICAgICAgICAgcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFzaywgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCk7CisKKyAgICB9IGVsc2UgeworICAgICAgRkRLYWFjRW5jX0ludGVuc2l0eVN0ZXJlb1Byb2Nlc3NpbmcoCisgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiRW5lcmd5LkxvbmcsIHBzeURhdGFbMV0tPnNmYkVuZXJneS5Mb25nLAorICAgICAgICAgIHBzeURhdGFbMF0tPm1kY3RTcGVjdHJ1bSwgcHN5RGF0YVsxXS0+bWRjdFNwZWN0cnVtLAorICAgICAgICAgIHBzeURhdGFbMF0tPnNmYlRocmVzaG9sZC5Mb25nLCBwc3lEYXRhWzFdLT5zZmJUaHJlc2hvbGQuTG9uZywKKyAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5zZmJUaHJlc2hvbGRMZERhdGEsCisgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiU3ByZWFkRW5lcmd5LkxvbmcsIHBzeURhdGFbMV0tPnNmYlNwcmVhZEVuZXJneS5Mb25nLAorICAgICAgICAgIHBzeU91dENoYW5uZWxbMF0tPnNmYkVuZXJneUxkRGF0YSwgcHN5T3V0Q2hhbm5lbFsxXS0+c2ZiRW5lcmd5TGREYXRhLAorICAgICAgICAgICZwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNEaWdlc3QsIHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc01hc2ssCisgICAgICAgICAgcHN5U3RhdGljWzBdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcyAqCisgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYkNudCwKKyAgICAgICAgICBwc3lDb25mWzFdLnNmYkNudCwgbWF4U2ZiUGVyR3JvdXBbMF0sIHBzeURhdGFbMF0tPmdyb3VwZWRTZmJPZmZzZXQsCisgICAgICAgICAgcHN5Q29uZlswXS5hbGxvd0lTICYmIHBzeU91dEVsZW1lbnQtPmNvbW1vbldpbmRvdywKKyAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5pc0Jvb2ssIHBzeU91dENoYW5uZWxbMV0tPmlzU2NhbGUsIHBuc0RhdGEpOworCisgICAgICAvKiBpdCdzIE9LIHRvIHBhc3MgdGhlICIuTG9uZyIgYXJyYXlzIGhlcmUuIFRoZXkgY29udGFpbiBncm91cGVkIHNob3J0CisgICAgICAgKiBkYXRhIHNpbmNlIEZES2FhY0VuY19ncm91cFNob3J0RGF0YSgpICovCisgICAgICBGREthYWNFbmNfTXNTdGVyZW9Qcm9jZXNzaW5nKAorICAgICAgICAgIHBzeURhdGEsIHBzeU91dENoYW5uZWwsIHBzeU91dENoYW5uZWxbMV0tPmlzQm9vaywKKyAgICAgICAgICAmcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0LCBwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrLAorICAgICAgICAgIHBzeUNvbmZbMV0uYWxsb3dNUywKKyAgICAgICAgICBwc3lTdGF0aWNbMF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ub09mR3JvdXBzICoKKyAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAorICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYkNudCwgbWF4U2ZiUGVyR3JvdXBbMF0sCisgICAgICAgICAgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiT2Zmc2V0cyk7CiAgICAgfQotICAgIGVsc2UKLSAgICB7Ci0KLSAgICAgICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgewotICAgICAgICAgICAgaWYgKCFpc1Nob3J0V2luZG93W2NoXSkgewotICAgICAgICAgICAgICAgIC8qIHRvbmFsaXR5ICovCi0gICAgICAgICAgICAgICAgRkRLYWFjRW5jX0NhbGN1bGF0ZUZ1bGxUb25hbGl0eSggcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJNYXhTY2FsZVNwZWNbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneUxkRGF0YVtjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJUb25hbGl0eVtjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+cG5zQ29uZi51c2VQbnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhQc3lDb25mTG9uZy0+dG5zQ29uZi50bnNBY3RpdmUgfHwgaFBzeUNvbmZTaG9ydC0+dG5zQ29uZi50bnNBY3RpdmUpIHsKLSAgICAgICAgICAgIElOVCB0bnNBY3RpdmVbVFJBTlNfRkFDXTsKLSAgICAgICAgICAgIElOVCBucmdTY2FsaW5nWzJdID0gezAsMH07Ci0gICAgICAgICAgICBJTlQgdG5zU3BlY1NoaWZ0ID0gMDsKLQotICAgICAgICAgICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgewotICAgICAgICAgICAgICAgIGZvcih3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgd09mZnNldCA9IHcqd2luZG93TGVuZ3RoW2NoXTsKLSAgICAgICAgICAgICAgICAgICAgLyogVE5TICovCi0gICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19UbnNEZXRlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGFbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFRoaXNQc3lDb25mW2NoXS0+dG5zQ29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dENoYW5uZWxbY2hdLT50bnNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0rd09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNoYW5uZWxzID09IDIpIHsKLSAgICAgICAgICAgICAgRkRLYWFjRW5jX1Ruc1N5bmMoCi0gICAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICB0bnNEYXRhWzBdLAotICAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRDaGFubmVsWzFdLT50bnNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRDaGFubmVsWzBdLT50bnNJbmZvLAotCi0gICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljWzFdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1swXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAmaFRoaXNQc3lDb25mWzFdLT50bnNDb25mKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRkRLX0FTU0VSVCgxPT1jb21tb25XaW5kb3cpOyAvKiBhbGwgY2hlY2tzIGZvciBUTlMgZG8gb25seSB3b3JrIGZvciBjb21tb24gd2luZG93cyAod2hpY2ggaXMgYWx3YXlzIHNldCkqLwotICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbMF07IHcrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNTaG9ydFdpbmRvd1swXSkKLSAgICAgICAgICAgICAgICAgICAgdG5zQWN0aXZlW3ddID0gdG5zRGF0YVswXS0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bd10udG5zQWN0aXZlW0hJRklMVF0gfHwKLSAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVswXS0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bd10udG5zQWN0aXZlW0xPRklMVF0gfHwKLSAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVtjaGFubmVscy0xXS0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bd10udG5zQWN0aXZlW0hJRklMVF0gfHwKLSAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVtjaGFubmVscy0xXS0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bd10udG5zQWN0aXZlW0xPRklMVF07Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB0bnNBY3RpdmVbd10gPSB0bnNEYXRhWzBdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZVtISUZJTFRdIHx8Ci0gICAgICAgICAgICAgICAgICAgIHRuc0RhdGFbMF0tPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlW0xPRklMVF0gfHwKLSAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVtjaGFubmVscy0xXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmVbSElGSUxUXSB8fAotICAgICAgICAgICAgICAgICAgICB0bnNEYXRhW2NoYW5uZWxzLTFdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZVtMT0ZJTFRdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRuc0FjdGl2ZVswXSAmJiAhaXNTaG9ydFdpbmRvd1tjaF0pIHsKLSAgICAgICAgICAgICAgICAgICAgLyogU2NhbGUgZG93biBzcGVjdHJ1bSBpZiB0bnMgaXMgYWN0aXZlIGluIG9uZSBvZiB0aGUgdHdvIGNoYW5uZWxzIHdpdGggc2FtZSBsYXN0V2luZG93U2VxdWVuY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgcGFydCBvZiB0aHJlc2hvbGQgY2FsY3VsYXRpb247IGl0J3Mgbm90IG5lY2Vzc2FyeSB0byB1cGRhdGUgc2ZiTWF4U2NhbGVTcGVjICovCi0gICAgICAgICAgICAgICAgICAgIElOVCBzaGlmdCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihzZmI9MDsgc2ZiPGhUaGlzUHN5Q29uZltjaF0tPmxvd3Bhc3NMaW5lOyBzZmIrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtzZmJdID0gcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bVtzZmJdID4+IHNoaWZ0OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHRocmVzaG9sZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IHNmYisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU2ZiVGhyZXNob2xkW2NoXVtzZmJdID4+PSAoMipzaGlmdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNjYWxlICs9IHNoaWZ0OyAvKiB1cGRhdGUgbWRjdFNjYWxlICovCi0KLSAgICAgICAgICAgICAgICAgICAgLyogY2FsYyBzZmJFbmVyZ2llcyBhZnRlciB0bnNFbmNvZGUgYWdhaW4gISAqLwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgICAgICAgIGZvcih3ID0gMDsgdyA8IG5XaW5kb3dzW2NoXTsgdysrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgd09mZnNldCA9IHcqd2luZG93TGVuZ3RoW2NoXTsKLSAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX1Ruc0VuY29kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dENoYW5uZWxbY2hdLT50bnNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNEYXRhW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFRoaXNQc3lDb25mW2NoXS0+dG5zQ29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiT2Zmc2V0W3BzeURhdGFbY2hdLT5zZmJBY3RpdmVdLC8qaFRoaXNQc3lDb25mW2NoXS0+bG93cGFzc0xpbmUqLyAvKiBmaWx0ZXIgc3RvcHMgYmVmb3JlIHRoYXQgbGluZSAhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0rd09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYodG5zQWN0aXZlW3ddKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FsYyBzZmItYmFuZHdpc2UgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBhZ2FpbiwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB0bnMgYWN0aXZlIGluIGN1cnJlbnQgY2hhbm5lbCBvciBpbiBvbmUgY2hhbm5lbCB3aXRoIHNhbWUgbGFzdFdpbmRvd1NlcXVlbmNlIGxlZnQgYW5kIHJpZ2h0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX0NhbGNTZmJNYXhTY2FsZVNwZWMocHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYk1heFNjYWxlU3BlY1tjaF0rdyptYXhTZmJbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbY2hdOyB3KyspIHsKLQotICAgICAgICAgICAgICAgIGlmICh0bnNBY3RpdmVbd10pIHsKLQotICAgICAgICAgICAgICAgICAgaWYgKGlzU2hvcnRXaW5kb3dbY2hdKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19DYWxjQmFuZEVuZXJneU9wdGltU2hvcnQocHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSt3KndpbmRvd0xlbmd0aFtjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjW2NoXSt3Km1heFNmYltjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneVtjaF0rdyptYXhTZmJbY2hdKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBucmdTY2FsaW5nW2NoXSA9ICAgICAgICAvKiB3aXRoIHRucywgZW5lcmd5IGNhbGN1bGF0aW9uIGNhbiBvdmVyZmxvdzsgLT4gc2NhbGluZyAqLwotICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfQ2FsY0JhbmRFbmVyZ3lPcHRpbUxvbmcocHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiTWF4U2NhbGVTcGVjW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiRW5lcmd5W2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiRW5lcmd5TGREYXRhW2NoXSk7Ci0gICAgICAgICAgICAgICAgICAgIHRuc1NwZWNTaGlmdCA9IGZpeE1heCh0bnNTcGVjU2hpZnQsIG5yZ1NjYWxpbmdbY2hdKTsgICAgICAgLyogbnJnU2NhbGluZyBpcyBzZXQgb25seSBpZiBucmcgd291bGQgaGF2ZSBhbiBvdmVyZmxvdyAqLwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gLyogaWYgdG5zQWN0aXZlICovCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gLyogZW5kIGNoYW5uZWwgbG9vcCAqLwotCi0gICAgICAgICAgICAvKiBhZGFwdCBzY2FsaW5nIHRvIHByZXZlbnQgbnJnIG92ZXJmbG93LCBvbmx5IGZvciBsb25nIGJsb2NrcyAqLwotICAgICAgICAgICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgewotICAgICAgICAgICAgICBpZiAoICh0bnNTcGVjU2hpZnQhPTApICYmICFpc1Nob3J0V2luZG93W2NoXSApIHsKLSAgICAgICAgICAgICAgICAvKiBzY2FsZSBkb3duIHNwZWN0cnVtLCBucmcncyBhbmQgdGhyZXNob2xkcywgaWYgdGhlcmUgd2FzIGFuIG92ZXJmbG93IGluIHNmYk5yZyBjYWxjdWxhdGlvbiBhZnRlciB0bnMgKi8KLSAgICAgICAgICAgICAgICBmb3IobGluZT0wOyBsaW5lPGhUaGlzUHN5Q29uZltjaF0tPmxvd3Bhc3NMaW5lOyBsaW5lKyspIHsKLSAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW1bbGluZV0gPj49IHRuc1NwZWNTaGlmdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSU5UIHNjYWxlID0gKHRuc1NwZWNTaGlmdC1ucmdTY2FsaW5nW2NoXSk8PDE7Ci0gICAgICAgICAgICAgICAgZm9yKHNmYj0wOyBzZmI8cHN5RGF0YVtjaF0tPnNmYkFjdGl2ZTsgc2ZiKyspIHsKLSAgICAgICAgICAgICAgICAgIHBTZmJFbmVyZ3lMZERhdGFbY2hdW3NmYl0gICAtPSBzY2FsZSpGTDJGWENPTlNUX0RCTCgxLjAvTERfREFUQV9TQ0FMSU5HKTsKLSAgICAgICAgICAgICAgICAgIHBTZmJFbmVyZ3lbY2hdW3NmYl0gICAgICAgID4+PSBzY2FsZTsKLSAgICAgICAgICAgICAgICAgIHBTZmJUaHJlc2hvbGRbY2hdW3NmYl0gICAgID4+PSAodG5zU3BlY1NoaWZ0PDwxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPm1kY3RTY2FsZSArPSB0bnNTcGVjU2hpZnQ7ICAvKiB1cGRhdGUgbWRjdFNjYWxlOyBub3QgbmVjZXNzYXJ5IHRvIHVwZGF0ZSBzZmJNYXhTY2FsZVNwZWMgKi8KLQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IC8qIGVuZCBjaGFubmVsIGxvb3AgKi8KLQotICAgICAgICB9IC8qIFROUyBhY3RpdmUgKi8KLSAgICB9ICAvKiAhaXNMRkUgKi8KLQotCi0KLQotCi0KLSAgICAvKiBBZHZhbmNlIHRocmVzaG9sZHMgKi8KLSAgICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgIElOVCBoZWFkcm9vbTsKLQotICAgICAgICBGSVhQX0RCTCBjbGlwRW5lcmd5OwotICAgICAgICBJTlQgZW5lcmd5U2hpZnQgID0gcHN5RGF0YVtjaF0tPm1kY3RTY2FsZSoyIDsKLSAgICAgICAgSU5UIGNsaXBOcmdTaGlmdCA9IGVuZXJneVNoaWZ0IC0gVEhSX1NISUZUQklUUyA7Ci0KLSAgICAgICAgaWYoaXNTaG9ydFdpbmRvd1tjaF0pCi0gICAgICAgICAgICBoZWFkcm9vbSA9IDY7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGhlYWRyb29tID0gMDsKLQotICAgICAgICBpZiAoY2xpcE5yZ1NoaWZ0ID49IDApCi0gICAgICAgICAgICBjbGlwRW5lcmd5ID0gaFRoaXNQc3lDb25mW2NoXS0+Y2xpcEVuZXJneSA+PiAgY2xpcE5yZ1NoaWZ0IDsKLSAgICAgICAgZWxzZSBpZiAoY2xpcE5yZ1NoaWZ0Pj0taGVhZHJvb20pCi0gICAgICAgICAgICBjbGlwRW5lcmd5ID0gaFRoaXNQc3lDb25mW2NoXS0+Y2xpcEVuZXJneSA8PCAtY2xpcE5yZ1NoaWZ0IDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY2xpcEVuZXJneSA9IChGSVhQX0RCTClNQVhWQUxfREJMIDsKLQotICAgICAgICBmb3IodyA9IDA7IHcgPCBuV2luZG93c1tjaF07IHcrKykKLSAgICAgICAgewotICAgICAgICAgICAgSU5UIGk7Ci0gICAgICAgICAgICAvKiBsaW1pdCB0aHJlc2hvbGQgdG8gYXZvaWQgY2xpcHBpbmcgKi8KLSAgICAgICAgICAgIGZvciAoaT0wOyBpPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7IGkrKykgewotICAgICAgICAgICAgICAgICoocFNmYlRocmVzaG9sZFtjaF0rdyptYXhTZmJbY2hdK2kpID0gZml4TWluKCoocFNmYlRocmVzaG9sZFtjaF0rdyptYXhTZmJbY2hdK2kpLCBjbGlwRW5lcmd5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogc3ByZWFkaW5nICovCi0gICAgICAgICAgICBGREthYWNFbmNfU3ByZWFkaW5nTWF4KHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mW2NoXS0+c2ZiTWFza0xvd0ZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJNYXNrSGlnaEZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0pOwotCi0KLSAgICAgICAgICAgIC8qIFBDTSBxdWFudGl6YXRpb24gdGhyZXNob2xkICovCi0gICAgICAgICAgICBlbmVyZ3lTaGlmdCArPSBQQ01fUVVBTlRfVEhSX1NDQUxFOwotICAgICAgICAgICAgaWYgKGVuZXJneVNoaWZ0Pj0wKSB7Ci0gICAgICAgICAgICAgICBlbmVyZ3lTaGlmdCA9IGZpeE1pbihERlJBQ1RfQklUUy0xLGVuZXJneVNoaWZ0KTsKLSAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7aSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgKihwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0raSkgPSBmaXhNYXgoKihwU2ZiVGhyZXNob2xkW2NoXSt3Km1heFNmYltjaF0raSkgPj4gVEhSX1NISUZUQklUUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaFRoaXNQc3lDb25mW2NoXS0+c2ZiUGNtUXVhbnRUaHJlc2hvbGRbaV0gPj4gZW5lcmd5U2hpZnQpKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICBlbmVyZ3lTaGlmdCA9IGZpeE1pbihERlJBQ1RfQklUUy0xLC1lbmVyZ3lTaGlmdCk7Ci0gICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlO2krKykgewotICAgICAgICAgICAgICAgICAgICoocFNmYlRocmVzaG9sZFtjaF0rdyptYXhTZmJbY2hdK2kpID0gZml4TWF4KCoocFNmYlRocmVzaG9sZFtjaF0rdyptYXhTZmJbY2hdK2kpID4+IFRIUl9TSElGVEJJVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhUaGlzUHN5Q29uZltjaF0tPnNmYlBjbVF1YW50VGhyZXNob2xkW2ldIDw8IGVuZXJneVNoaWZ0KSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghcHN5U3RhdGljW2NoXS0+aXNMRkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogcHJlZWNobyBjb250cm9sICovCi0gICAgICAgICAgICAgICAgaWYocHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSA9PSBTVE9QX1dJTkRPVykgewotICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IEZES2FhY0VuY19QcmVFY2hvQ29udHJvbCBmcm9tIGNvbXBhcmluZyBzdG9wCi0gICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZHMgd2l0aCBzaG9ydCB0aHJlc2hvbGRzICovCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7aSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5zZmJUaHJlc2hvbGRubTFbaV0gPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPm1kY3RTY2FsZW5tMSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmNhbGNQcmVFY2hvICA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgRkRLYWFjRW5jX1ByZUVjaG9Db250cm9sKCBwc3lTdGF0aWNbY2hdLT5zZmJUaHJlc2hvbGRubTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmNhbGNQcmVFY2hvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5tYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPm1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYlRocmVzaG9sZFtjaF0rdyptYXhTZmJbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5U3RhdGljW2NoXS0+bWRjdFNjYWxlbm0xKTsKLQotICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmNhbGNQcmVFY2hvID0gMTsKLQotICAgICAgICAgICAgICAgIGlmKHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UgPT0gU1RBUlRfV0lORE9XKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogcHJldmVudCBGREthYWNFbmNfUHJlRWNob0NvbnRyb2wgaW4gbmV4dCBmcmFtZSB0byBjb21wYXJlIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZHMgd2l0aCBzaG9ydCB0aHJlc2hvbGRzICovCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7aSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5zZmJUaHJlc2hvbGRubTFbaV0gPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPm1kY3RTY2FsZW5tMSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmNhbGNQcmVFY2hvICA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIHNwcmVhZCBlbmVyZ3kgdG8gYXZvaWQgaG9sZSBkZXRlY3Rpb24gKi8KLSAgICAgICAgICAgIEZES21lbWNweShwU2ZiU3ByZWFkRW5lcmd5W2NoXSt3Km1heFNmYltjaF0sIHBTZmJFbmVyZ3lbY2hdK3cqbWF4U2ZiW2NoXSwgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSpzaXplb2YoRklYUF9EQkwpKTsKLQotICAgICAgICAgICAgRkRLYWFjRW5jX1NwcmVhZGluZ01heChwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhUaGlzUHN5Q29uZltjaF0tPnNmYk1hc2tMb3dGYWN0b3JTcHJFbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoVGhpc1BzeUNvbmZbY2hdLT5zZmJNYXNrSGlnaEZhY3RvclNwckVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBTZmJTcHJlYWRFbmVyZ3lbY2hdK3cqbWF4U2ZiW2NoXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDYWxjIGJhbmR3aXNlIGVuZXJnaWVzIGZvciBtaWQgYW5kIHNpZGUgY2hhbm5lbC4gRG8gaXQgb25seSBpZiAyIGNoYW5uZWxzIGV4aXN0ICovCi0gICAgaWYgKGNoYW5uZWxzPT0yKSB7Ci0gICAgICAgIGZvcih3ID0gMDsgdyA8IG5XaW5kb3dzWzFdOyB3KyspIHsKLSAgICAgICAgICAgIHdPZmZzZXQgPSB3KndpbmRvd0xlbmd0aFsxXTsKLSAgICAgICAgICAgIEZES2FhY0VuY19DYWxjQmFuZE5yZ01TT3B0KHBzeURhdGFbMF0tPm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLT5tZGN0U3BlY3RydW0rd09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYk1heFNjYWxlU3BlY1swXSt3Km1heFNmYlswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYk1heFNjYWxlU3BlY1sxXSt3Km1heFNmYlsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRoaXNQc3lDb25mWzFdLT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmYkVuZXJneU1TWzBdK3cqbWF4U2ZiWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZiRW5lcmd5TVNbMV0rdyptYXhTZmJbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwc3lTdGF0aWNbMV0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiRW5lcmd5TVNMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0tPnNmYkVuZXJneU1TTGREYXRhKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGdyb3VwIHNob3J0IGRhdGEgKG1heFNmYltjaF0gZm9yIHNob3J0IGJsb2NrcyBpcyBkZXRlcm1pbmVkIGhlcmUpICovCi0gICAgZm9yKGNoPTA7Y2g8Y2hhbm5lbHM7Y2grKykKLSAgICB7Ci0gICAgICAgIElOVCBub1NmYiwgaTsKLSAgICAgICAgaWYoaXNTaG9ydFdpbmRvd1tjaF0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBzZmJHcnA7Ci0gICAgICAgICAgICBub1NmYiA9IHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ub09mR3JvdXBzICogaFBzeUNvbmZTaG9ydC0+c2ZiQ250OwotICAgICAgICAgICAgLyogQXQgdGhpcyBwb2ludCwgZW5lcmdpZXMgYW5kIHRocmVzaG9sZHMgYXJlIGNvcGllZC9yZWdyb3VwZWQgZnJvbSB0aGUgIi5TaG9ydCIgdG8gdGhlICIuTG9uZyIgYXJyYXlzICovCi0gICAgICAgICAgICBGREthYWNFbmNfZ3JvdXBTaG9ydERhdGEoIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLT5zZmJUaHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLT5zZmJFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLT5zZmJFbmVyZ3lNUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0tPnNmYlNwcmVhZEVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiTWluU25yTGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLT5ncm91cGVkU2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhTZmJQZXJHcm91cFtjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYk1pblNuckxkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wuZ3JvdXBMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZlsxXS5ncmFudWxlTGVuZ3RoKTsKLQotCi0gICAgICAgICAgICAvKiBjYWxjdWxhdGUgbGREYXRhIGFycmF5cyAoc2hvcnQgdmFsdWVzIGFyZSBpbiAuTG9uZy1hcnJheXMgYWZ0ZXIgRkRLYWFjRW5jX2dyb3VwU2hvcnREYXRhKSAqLwotICAgICAgICAgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBub1NmYjsgc2ZiR3JwICs9IGhQc3lDb25mU2hvcnQtPnNmYkNudCkgewotICAgICAgICAgICAgICBMZERhdGFWZWN0b3IoJnBzeURhdGFbY2hdLT5zZmJFbmVyZ3kuTG9uZ1tzZmJHcnBdLCAmcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneUxkRGF0YVtzZmJHcnBdLCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogY2FsYyBzZmJUaHJsZCBhbmQgc2V0IFZhbHVlcyBzbWFsbGVyIDJeLTMxIHRvIDJeLTMzKi8KLSAgICAgICAgICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgbm9TZmI7IHNmYkdycCArPSBoUHN5Q29uZlNob3J0LT5zZmJDbnQpIHsKLSAgICAgICAgICAgICAgTGREYXRhVmVjdG9yKCZwc3lEYXRhW2NoXS0+c2ZiVGhyZXNob2xkLkxvbmdbc2ZiR3JwXSwgJnBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiR3JwXSwgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSk7Ci0gICAgICAgICAgICAgIGZvciAoc2ZiPTA7c2ZiPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7c2ZiKyspIHsKLSAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeE1heChwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYkdycCtzZmJdLCBGTDJGWENPTlNUX0RCTCgtMC41MTU2MjVmKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBjaGFubmVscz09MiApIHsKLSAgICAgICAgICAgICAgZm9yIChzZmJHcnAgPSAwOyBzZmJHcnAgPCBub1NmYjsgc2ZiR3JwICs9IGhQc3lDb25mU2hvcnQtPnNmYkNudCkgewotICAgICAgICAgICAgICAgIExkRGF0YVZlY3RvcigmcHN5RGF0YVtjaF0tPnNmYkVuZXJneU1TLkxvbmdbc2ZiR3JwXSwgJnBzeURhdGFbY2hdLT5zZmJFbmVyZ3lNU0xkRGF0YVtzZmJHcnBdLCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGREttZW1jcHkocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYk9mZnNldHMsIHBzeURhdGFbY2hdLT5ncm91cGVkU2ZiT2Zmc2V0LCAoTUFYX0dST1VQRURfU0ZCKzEpKnNpemVvZihJTlQpKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogbWF4U2ZiW2NoXSBmb3IgbG9uZyBibG9ja3MgKi8KLSAgICAgICAgICAgIGZvciAoc2ZiID0gcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZS0xOyBzZmIgPj0gMDsgc2ZiLS0pIHsKLSAgICAgICAgICAgICAgICBmb3IgKGxpbmUgPSBoUHN5Q29uZkxvbmctPnNmYk9mZnNldFtzZmIrMV0tMTsgbGluZSA+PSBoUHN5Q29uZkxvbmctPnNmYk9mZnNldFtzZmJdOyBsaW5lLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW1bbGluZV0gIT0gRkwyRlhDT05TVF9TR0woMC4wZikpIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGluZSA+IGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0W3NmYl0pIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdID0gc2ZiICsgMTsKLSAgICAgICAgICAgIC8qIGVuc3VyZSBhdCBsZWFzdCBvbmUgc2VjdGlvbiBpbiBJQ1M7IHdvcmthcm91bmQgZm9yIGV4aXN0aW5nIGRlY29kZXIgY3JjIGltcGxlbWVudGF0aW9uICovCi0gICAgICAgICAgICBtYXhTZmJQZXJHcm91cFtjaF0gPSBmaXhNYXgoZml4TWluKDUscHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSksbWF4U2ZiUGVyR3JvdXBbY2hdKTsKLQotICAgICAgICAgICAgLyogc2ZiTnJnTGREYXRhIGlzIGNhbGN1bGF0ZWQgaW4gRkRLYWFjRW5jX2FkdmFuY2VQc3ljaExvbmcsIGNvcHkgaW4gcHN5T3V0IHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3lMZERhdGEsIHBzeURhdGFbY2hdLT5zZmJFbmVyZ3lMZERhdGEuTG9uZywgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSpzaXplb2YoRklYUF9EQkwpKTsKLQotICAgICAgICAgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5zZmJPZmZzZXRzLCBoUHN5Q29uZkxvbmctPnNmYk9mZnNldCwgKE1BWF9HUk9VUEVEX1NGQisxKSpzaXplb2YoSU5UKSk7Ci0KLSAgICAgICAgICAgIC8qIHNmYk1pblNuckxkRGF0YSBtb2RpZmllZCBpbiBhZGp1c3QgdGhyZXNob2xkLCBjb3B5IG5lY2Vzc2FyeSAqLwotICAgICAgICAgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5zZmJNaW5TbnJMZERhdGEsIGhQc3lDb25mTG9uZy0+c2ZiTWluU25yTGREYXRhLCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlKnNpemVvZihGSVhQX0RCTCkpOwotCi0gICAgICAgICAgICAvKiBzZmJFbmVyZ3lNU0xkRGF0YSBpc3QgYWxyZWFkeSBjYWxjdWxhdGVkIGluIEZES2FhY0VuY19DYWxjQmFuZE5yZ01TT3B0OyBvbmx5IGluIGxvbmcgY2FzZSAqLwotCi0gICAgICAgICAgICAvKiBjYWxjIHNmYlRocmxkIGFuZCBzZXQgVmFsdWVzIHNtYWxsZXIgMl4tMzEgdG8gMl4tMzMqLwotICAgICAgICAgICAgTGREYXRhVmVjdG9yKHBzeURhdGFbY2hdLT5zZmJUaHJlc2hvbGQuTG9uZywgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlRocmVzaG9sZExkRGF0YSwgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSk7Ci0gICAgICAgICAgICBmb3IgKGk9MDtpPHBzeURhdGFbY2hdLT5zZmJBY3RpdmU7aSsrKSB7Ci0gICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4TWF4KHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGFbaV0sIEZMMkZYQ09OU1RfREJMKC0wLjUxNTYyNWYpKTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgIH0KLQotCi0gICAgfQotCi0KLSAgICAvKgotICAgICAgICBJbnRlbnNpdHkgcGFyYW1ldGVyIGludGlhbGl6YXRpb24uCi0gICAgICovCi0gICAgZm9yKGNoPTA7Y2g8Y2hhbm5lbHM7Y2grKykgewotICAgICAgICBGREttZW1jbGVhcihwc3lPdXRDaGFubmVsW2NoXS0+aXNCb29rLCAgTUFYX0dST1VQRURfU0ZCKnNpemVvZihJTlQpKTsKLSAgICAgICAgRkRLbWVtY2xlYXIocHN5T3V0Q2hhbm5lbFtjaF0tPmlzU2NhbGUsIE1BWF9HUk9VUEVEX1NGQipzaXplb2YoSU5UKSk7Ci0gICAgfQotCi0gICAgZm9yKGNoPTA7Y2g8Y2hhbm5lbHM7Y2grKykgewotICAgICAgICBJTlQgd2luID0gKGlzU2hvcnRXaW5kb3dbY2hdPzE6MCk7Ci0gICAgICAgIGlmICghcHN5U3RhdGljW2NoXS0+aXNMRkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFBOUyBEZWNpc2lvbiAqLwotICAgICAgICAgICAgRkRLYWFjRW5jX1Buc0RldGVjdCggJihwc3lDb25mWzBdLnBuc0NvbmYpLAotICAgICAgICAgICAgICAgICAgICAgICBwbnNEYXRhW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdLCAvKiBjb3VudCBvZiBTZmIgd2hpY2ggYXJlIG5vdCB6ZXJvLiAqLwotICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiVGhyZXNob2xkTGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICBwc3lDb25mW3dpbl0uc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+bWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiTWF4U2NhbGVTcGVjLkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgIHNmYlRvbmFsaXR5W2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnRuc0luZm8ub3JkZXJbMF1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGFbY2hdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnByZWRpY3Rpb25HYWluW0hJRklMVF0sCi0gICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGFbY2hdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZVtISUZJTFRdLAotICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiRW5lcmd5TGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+bm9pc2VOcmcgKTsKLSAgICAgICAgfSAvKiAhaXNMRkUgKi8KLSAgICB9Ci0KLSAgICAvKgotICAgICAgICBzdGVyZW8gUHJvY2Vzc2luZwotICAgICovCi0gICAgaWYoY2hhbm5lbHMgPT0gMikKLSAgICB7Ci0gICAgICAgIHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCA9IE1TX05PTkU7Ci0gICAgICAgIHBzeU91dEVsZW1lbnQtPmNvbW1vbldpbmRvdyAgICAgICA9IGNvbW1vbldpbmRvdzsKLSAgICAgICAgaWYgKHBzeU91dEVsZW1lbnQtPmNvbW1vbldpbmRvdykKLSAgICAgICAgICAgIG1heFNmYlBlckdyb3VwWzBdID0gbWF4U2ZiUGVyR3JvdXBbMV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4TWF4KG1heFNmYlBlckdyb3VwWzBdLCBtYXhTZmJQZXJHcm91cFsxXSk7Ci0KLSAgICAgICAgaWYocHN5U3RhdGljWzBdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubGFzdFdpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykKLSAgICAgICAgewotICAgICAgICAgICAgLyogUE5TIHByZXByb2Nlc3NpbmcgZGVwZW5kaW5nIG9uIG1zIHByb2Nlc3Npbmc6IFBOUyBub3QgaW4gU2hvcnQgV2luZG93ISAqLwotICAgICAgICAgICAgRkRLYWFjRW5jX1ByZVByb2Nlc3NQbnNDaGFubmVsUGFpcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJnBzeURhdGFbMF0tPnNmYkVuZXJneSktPkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgmcHN5RGF0YVsxXS0+c2ZiRW5lcmd5KS0+TG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFswXS0+c2ZiRW5lcmd5TGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5zZmJFbmVyZ3lMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPnNmYkVuZXJneU1TLkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocHN5Q29uZlswXS5wbnNDb25mKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5zRGF0YVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5zRGF0YVsxXSk7Ci0KLSAgICAgICAgICAgIEZES2FhY0VuY19JbnRlbnNpdHlTdGVyZW9Qcm9jZXNzaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJFbmVyZ3kuTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS0+c2ZiRW5lcmd5LkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS0+bWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJUaHJlc2hvbGQuTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS0+c2ZiVGhyZXNob2xkLkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPnNmYlRocmVzaG9sZExkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiU3ByZWFkRW5lcmd5LkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0tPnNmYlNwcmVhZEVuZXJneS5Mb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzBdLT5zZmJFbmVyZ3lMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPnNmYkVuZXJneUxkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZlswXS5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmZbMF0uc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZlswXS5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmZbMF0uYWxsb3dJUyAmJiBjb21tb25XaW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPmlzQm9vaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFsxXS0+aXNTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5zRGF0YSk7Ci0KLSAgICAgICAgICAgIEZES2FhY0VuY19Nc1N0ZXJlb1Byb2Nlc3NpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPmlzQm9vaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNmYlBlckdyb3VwWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzBdLT5zZmJPZmZzZXRzKTsKLQotICAgICAgICAgICAgLyogUE5TIHBvc3Rwcm9jZXNzaW5nICovCi0gICAgICAgICAgICBGREthYWNFbmNfUG9zdFByb2Nlc3NQbnNDaGFubmVsUGFpcihwc3lEYXRhWzBdLT5zZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocHN5Q29uZlswXS5wbnNDb25mKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5zRGF0YVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5zRGF0YVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZES2FhY0VuY19JbnRlbnNpdHlTdGVyZW9Qcm9jZXNzaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJFbmVyZ3kuTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS0+c2ZiRW5lcmd5LkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0tPm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS0+bWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLT5zZmJUaHJlc2hvbGQuTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS0+c2ZiVGhyZXNob2xkLkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPnNmYlRocmVzaG9sZExkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+c2ZiU3ByZWFkRW5lcmd5LkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0tPnNmYlNwcmVhZEVuZXJneS5Mb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzBdLT5zZmJFbmVyZ3lMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMV0tPnNmYkVuZXJneUxkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5U3RhdGljWzBdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcypoUHN5Q29uZlNob3J0LT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNvbmZbMV0uc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS0+Z3JvdXBlZFNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Q29uZlswXS5hbGxvd0lTICYmIGNvbW1vbldpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFsxXS0+aXNCb29rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5pc1NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbnNEYXRhKTsKLQotICAgICAgICAgICAgLyogaXQncyBPSyB0byBwYXNzIHRoZSAiLkxvbmciIGFycmF5cyBoZXJlLiBUaGV5IGNvbnRhaW4gZ3JvdXBlZCBzaG9ydCBkYXRhIHNpbmNlIEZES2FhY0VuY19ncm91cFNob3J0RGF0YSgpICovCi0gICAgICAgICAgICBGREthYWNFbmNfTXNTdGVyZW9Qcm9jZXNzaW5nKCBwc3lEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzFdLT5pc0Jvb2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNEaWdlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeVN0YXRpY1swXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHMqaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNmYlBlckdyb3VwWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzBdLT5zZmJPZmZzZXRzKTsKLSAgICAgICAgfQotICAgIH0KKyAgfSAvKiAoY2hhbm5lbHMgPT0gMikgKi8KIAogICAvKgogICAgIFBOUyBDb2RpbmcKICAgKi8KLSAgZm9yKGNoPTA7Y2g8Y2hhbm5lbHM7Y2grKykgewotICAgICAgaWYgKHBzeVN0YXRpY1tjaF0tPmlzTEZFKSB7Ci0gICAgICAgICAgLyogbm8gUE5TIGNvZGluZyAqLwotICAgICAgICAgIGZvcihzZmIgPSAwOyBzZmIgPCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlOyBzZmIrKykgewotICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPm5vaXNlTnJnW3NmYl0gPSBOT19OT0lTRV9QTlM7Ci0gICAgICAgICAgfQotICAgICAgfSBlbHNlCi0gICAgICB7Ci0gICAgICAgICAgRkRLYWFjRW5jX0NvZGVQbnNDaGFubmVsKHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJihwc3lDb25mW2NoXS5wbnNDb25mKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwbnNEYXRhW2NoXS0+cG5zRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS0+c2ZiRW5lcmd5TGREYXRhLkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPm5vaXNlTnJnLCAvKiB0aGlzIGlzIHRoZSBlbmVyZ3kgdGhhdCB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGJpdHN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGEpOworICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgIGlmIChwc3lTdGF0aWNbY2hdLT5pc0xGRSkgeworICAgICAgLyogbm8gUE5TIGNvZGluZyAqLworICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lEYXRhW2NoXS0+c2ZiQWN0aXZlOyBzZmIrKykgeworICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+bm9pc2VOcmdbc2ZiXSA9IE5PX05PSVNFX1BOUzsKICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgRkRLYWFjRW5jX0NvZGVQbnNDaGFubmVsKAorICAgICAgICAgIHBzeURhdGFbY2hdLT5zZmJBY3RpdmUsICYoaFRoaXNQc3lDb25mW2NoXS0+cG5zQ29uZiksCisgICAgICAgICAgcG5zRGF0YVtjaF0tPnBuc0ZsYWcsIHBzeURhdGFbY2hdLT5zZmJFbmVyZ3lMZERhdGEuTG9uZywKKyAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+bm9pc2VOcmcsIC8qIHRoaXMgaXMgdGhlIGVuZXJneSB0aGF0IHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gdG8gdGhlIGJpdHN0cmVhbSAqLworICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJUaHJlc2hvbGRMZERhdGEpOworICAgIH0KICAgfQogCi0gICAgLyoKLSAgICAgICAgYnVpbGQgb3V0cHV0Ci0gICAgKi8KLSAgICBmb3IoY2g9MDtjaDxjaGFubmVscztjaCsrKQotICAgIHsKLSAgICAgICAgSU5UIGosIGdycCwgbWFzazsKKyAgLyoKKyAgICAgIGJ1aWxkIG91dHB1dAorICAqLworICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgIElOVCBtYXNrOworICAgIGludCBncnA7CisgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwID0gbWF4U2ZiUGVyR3JvdXBbY2hdOworICAgIHBzeU91dENoYW5uZWxbY2hdLT5tZGN0U2NhbGUgPSBwc3lEYXRhW2NoXS0+bWRjdFNjYWxlOworICAgIGlmIChpc1Nob3J0V2luZG93W2NoXSA9PSAwKSB7CisgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiQ250ID0gaFBzeUNvbmZMb25nLT5zZmJBY3RpdmU7CisgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+c2ZiUGVyR3JvdXAgPSBoUHN5Q29uZkxvbmctPnNmYkFjdGl2ZTsKKyAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2UgPQorICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5sYXN0V2luZG93U2VxdWVuY2U7CisgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+d2luZG93U2hhcGUgPQorICAgICAgICAgIHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTaGFwZTsKKyAgICB9IGVsc2UgeworICAgICAgSU5UIHNmYkNudCA9IHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ub09mR3JvdXBzICoKKyAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJDbnQ7CiAKLSAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwICAgID0gbWF4U2ZiUGVyR3JvdXBbY2hdOwotICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+bWRjdFNjYWxlICAgICAgICAgPSBwc3lEYXRhW2NoXS0+bWRjdFNjYWxlOwotCi0gICAgICAgIGlmKGlzU2hvcnRXaW5kb3dbY2hdPT0wKSB7Ci0KLSAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQgICAgICAgICA9IGhQc3lDb25mTG9uZy0+c2ZiQWN0aXZlOwotICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYlBlckdyb3VwICAgID0gaFBzeUNvbmZMb25nLT5zZmJBY3RpdmU7Ci0gICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+bGFzdFdpbmRvd1NlcXVlbmNlID0gcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmxhc3RXaW5kb3dTZXF1ZW5jZTsKLSAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT53aW5kb3dTaGFwZSAgICA9IHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTaGFwZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIElOVCBzZmJDbnQgPSBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcypoUHN5Q29uZlNob3J0LT5zZmJDbnQ7Ci0KLSAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJDbnQgICAgICAgICA9IHNmYkNudDsKLSAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCAgICA9IGhQc3lDb25mU2hvcnQtPnNmYkNudDsKLSAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2UgPSBTSE9SVF9XSU5ET1c7Ci0gICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+d2luZG93U2hhcGUgICAgPSBTSU5FX1dJTkRPVzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGdlbmVyYXRlIGdyb3VwaW5nIG1hc2sgKi8KLSAgICAgICAgbWFzayA9IDA7Ci0gICAgICAgIGZvciAoZ3JwID0gMDsgZ3JwIDwgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHM7IGdycCsrKQotICAgICAgICB7Ci0gICAgICAgICAgbWFzayA8PD0gMTsKLSAgICAgICAgICBmb3IgKGo9MTsgajxwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wuZ3JvdXBMZW5bZ3JwXTsgaisrKSB7Ci0gICAgICAgICAgICAgIG1hc2sgPSAobWFzazw8MSkgfCAxIDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPmdyb3VwaW5nTWFzayA9IG1hc2s7Ci0KLSAgICAgICAgLyogYnVpbGQgaW50ZXJmYWNlICovCi0gICAgICAgIEZES21lbWNweShwc3lPdXRDaGFubmVsW2NoXS0+Z3JvdXBMZW4scHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLmdyb3VwTGVuLE1BWF9OT19PRl9HUk9VUFMqc2l6ZW9mKElOVCkpOwotICAgICAgICBGREttZW1jcHkocHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneSwoJnBzeURhdGFbY2hdLT5zZmJFbmVyZ3kpLT5Mb25nLCBNQVhfR1JPVVBFRF9TRkIqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgICAgIEZES21lbWNweShwc3lPdXRDaGFubmVsW2NoXS0+c2ZiU3ByZWFkRW5lcmd5LCgmcHN5RGF0YVtjaF0tPnNmYlNwcmVhZEVuZXJneSktPkxvbmcsIE1BWF9HUk9VUEVEX1NGQipzaXplb2YoRklYUF9EQkwpKTsKLS8vICAgICAgICBGREttZW1jcHkocHN5T3V0Q2hhbm5lbFtjaF0tPm1kY3RTcGVjdHJ1bSwgcHN5RGF0YVtjaF0tPm1kY3RTcGVjdHJ1bSwgKDEwMjQpKnNpemVvZihGSVhQX0RCTCkpOworICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkNudCA9IHNmYkNudDsKKyAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5zZmJQZXJHcm91cCA9IGhQc3lDb25mU2hvcnQtPnNmYkNudDsKKyAgICAgIHBzeU91dENoYW5uZWxbY2hdLT5sYXN0V2luZG93U2VxdWVuY2UgPSBTSE9SVF9XSU5ET1c7CisgICAgICBwc3lPdXRDaGFubmVsW2NoXS0+d2luZG93U2hhcGUgPSBTSU5FX1dJTkRPVzsKICAgICB9CisgICAgLyogZ2VuZXJhdGUgZ3JvdXBpbmcgbWFzayAqLworICAgIG1hc2sgPSAwOworICAgIGZvciAoZ3JwID0gMDsgZ3JwIDwgcHN5U3RhdGljW2NoXS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHM7CisgICAgICAgICBncnArKykgeworICAgICAgaW50IGo7CisgICAgICBtYXNrIDw8PSAxOworICAgICAgZm9yIChqID0gMTsgaiA8IHBzeVN0YXRpY1tjaF0tPmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ncm91cExlbltncnBdOyBqKyspIHsKKyAgICAgICAgbWFzayA9IChtYXNrIDw8IDEpIHwgMTsKKyAgICAgIH0KKyAgICB9CisgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPmdyb3VwaW5nTWFzayA9IG1hc2s7CiAKLSAgICByZXR1cm4gQUFDX0VOQ19PSzsKKyAgICAvKiBidWlsZCBpbnRlcmZhY2UgKi8KKyAgICBGREttZW1jcHkocHN5T3V0Q2hhbm5lbFtjaF0tPmdyb3VwTGVuLAorICAgICAgICAgICAgICBwc3lTdGF0aWNbY2hdLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wuZ3JvdXBMZW4sCisgICAgICAgICAgICAgIE1BWF9OT19PRl9HUk9VUFMgKiBzaXplb2YoSU5UKSk7CisgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5zZmJFbmVyZ3ksICgmcHN5RGF0YVtjaF0tPnNmYkVuZXJneSktPkxvbmcsCisgICAgICAgICAgICAgIE1BWF9HUk9VUEVEX1NGQiAqIHNpemVvZihGSVhQX0RCTCkpOworICAgIEZES21lbWNweShwc3lPdXRDaGFubmVsW2NoXS0+c2ZiU3ByZWFkRW5lcmd5LAorICAgICAgICAgICAgICAoJnBzeURhdGFbY2hdLT5zZmJTcHJlYWRFbmVyZ3kpLT5Mb25nLAorICAgICAgICAgICAgICBNQVhfR1JPVVBFRF9TRkIgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAvLyAgICAgICAgRkRLbWVtY3B5KHBzeU91dENoYW5uZWxbY2hdLT5tZGN0U3BlY3RydW0sCisgICAgLy8gICAgICAgIHBzeURhdGFbY2hdLT5tZGN0U3BlY3RydW0sICgxMDI0KSpzaXplb2YoRklYUF9EQkwpKTsKKyAgfQorCisgIHJldHVybiBBQUNfRU5DX09LOwogfQogCit2b2lkIEZES2FhY0VuY19Qc3lDbG9zZShQU1lfSU5URVJOQUwgKipwaFBzeUludGVybmFsLCBQU1lfT1VUICoqcGhQc3lPdXQpIHsKKyAgaW50IG4sIGk7CiAKLXZvaWQgRkRLYWFjRW5jX1BzeUNsb3NlKFBTWV9JTlRFUk5BTCAgICoqcGhQc3lJbnRlcm5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQgICAgICAgICoqcGhQc3lPdXQpCi17Ci0gICAgaW50IG4sIGk7CisgIGlmIChwaFBzeUludGVybmFsICE9IE5VTEwpIHsKKyAgICBQU1lfSU5URVJOQUwgKmhQc3lJbnRlcm5hbCA9ICpwaFBzeUludGVybmFsOwogCisgICAgaWYgKGhQc3lJbnRlcm5hbCkgeworICAgICAgZm9yIChpID0gMDsgaSA8ICg4KTsgaSsrKSB7CisgICAgICAgIGlmIChoUHN5SW50ZXJuYWwtPnBTdGF0aWNDaGFubmVsc1tpXSkgeworICAgICAgICAgIGlmIChoUHN5SW50ZXJuYWwtPnBTdGF0aWNDaGFubmVsc1tpXS0+cHN5SW5wdXRCdWZmZXIpCisgICAgICAgICAgICBGcmVlUmFtX2FhY0VuY19Qc3lJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAmaFBzeUludGVybmFsLT5wU3RhdGljQ2hhbm5lbHNbaV0KKyAgICAgICAgICAgICAgICAgICAgIC0+cHN5SW5wdXRCdWZmZXIpOyAvKiBBVURJTyBJTlBVVCBCVUZGRVIgKi8KIAotICAgIGlmKHBoUHN5SW50ZXJuYWwhPU5VTEwpIHsKLSAgICAgIFBTWV9JTlRFUk5BTCAqaFBzeUludGVybmFsID0gKnBoUHN5SW50ZXJuYWw7Ci0KLSAgICAgIGlmIChoUHN5SW50ZXJuYWwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaT0wOyBpPCg4KTsgaSsrKSB7Ci0gICAgICAgICAgaWYgKGhQc3lJbnRlcm5hbC0+cFN0YXRpY0NoYW5uZWxzW2ldKSB7Ci0gICAgICAgICAgICBpZiAoaFBzeUludGVybmFsLT5wU3RhdGljQ2hhbm5lbHNbaV0tPnBzeUlucHV0QnVmZmVyKQotICAgICAgICAgICAgICBGcmVlUmFtX2FhY0VuY19Qc3lJbnB1dEJ1ZmZlcigmaFBzeUludGVybmFsLT5wU3RhdGljQ2hhbm5lbHNbaV0tPnBzeUlucHV0QnVmZmVyKTsgIC8qIEFVRElPIElOUFVUIEJVRkZFUiAqLwotCi0gICAgICAgICAgICBGcmVlUmFtX2FhY0VuY19Qc3lTdGF0aWMoJmhQc3lJbnRlcm5hbC0+cFN0YXRpY0NoYW5uZWxzW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUFNZX1NUQVRJQyAqLwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaT0wOyBpPCg4KTsgaSsrKSB7Ci0gICAgICAgICAgaWYgKGhQc3lJbnRlcm5hbC0+cHN5RWxlbWVudFtpXSkKLSAgICAgICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeUVsZW1lbnQoJmhQc3lJbnRlcm5hbC0+cHN5RWxlbWVudFtpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQU1lfRUxFTUVOVCAqLwotICAgICAgICB9Ci0KLQotICAgICAgICBGcmVlUmFtX2FhY0VuY19Qc3lJbnRlcm5hbChwaFBzeUludGVybmFsKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocGhQc3lPdXQhPU5VTEwpIHsKLSAgICAgIGZvciAobj0wOyBuPCgxKTsgbisrKSB7Ci0gICAgICAgIGlmIChwaFBzeU91dFtuXSkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoaT0wOyBpPCg4KTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocGhQc3lPdXRbbl0tPnBQc3lPdXRDaGFubmVsc1tpXSkKLSAgICAgICAgICAgICAgRnJlZVJhbV9hYWNFbmNfUHN5T3V0Q2hhbm5lbCgmcGhQc3lPdXRbbl0tPnBQc3lPdXRDaGFubmVsc1tpXSk7ICAgICAgICAgICAgICAgICAgLyogUFNZX09VVF9DSEFOTkVMICovCi0gICAgICAgICAgfQotCi0gICAgICAgICAgZm9yIChpPTA7IGk8KDgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwaFBzeU91dFtuXS0+cHN5T3V0RWxlbWVudFtpXSkKLSAgICAgICAgICAgICAgRnJlZVJhbV9hYWNFbmNfUHN5T3V0RWxlbWVudHMoJnBoUHN5T3V0W25dLT5wc3lPdXRFbGVtZW50W2ldKTsgICAgICAgICAgICAgICAgICAgLyogUFNZX09VVF9FTEVNRU5UUyAqLwotICAgICAgICAgIH0KLQotICAgICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeU91dCgmcGhQc3lPdXRbbl0pOworICAgICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeVN0YXRpYygKKyAgICAgICAgICAgICAgJmhQc3lJbnRlcm5hbC0+cFN0YXRpY0NoYW5uZWxzW2ldKTsgLyogUFNZX1NUQVRJQyAqLwogICAgICAgICB9CiAgICAgICB9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAoKDgpKTsgaSsrKSB7CisgICAgICAgIGlmIChoUHN5SW50ZXJuYWwtPnBzeUVsZW1lbnRbaV0pCisgICAgICAgICAgRnJlZVJhbV9hYWNFbmNfUHN5RWxlbWVudCgKKyAgICAgICAgICAgICAgJmhQc3lJbnRlcm5hbC0+cHN5RWxlbWVudFtpXSk7IC8qIFBTWV9FTEVNRU5UICovCisgICAgICB9CisKKyAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeUludGVybmFsKHBoUHN5SW50ZXJuYWwpOwogICAgIH0KKyAgfQorCisgIGlmIChwaFBzeU91dCAhPSBOVUxMKSB7CisgICAgZm9yIChuID0gMDsgbiA8ICgxKTsgbisrKSB7CisgICAgICBpZiAocGhQc3lPdXRbbl0pIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8ICg4KTsgaSsrKSB7CisgICAgICAgICAgaWYgKHBoUHN5T3V0W25dLT5wUHN5T3V0Q2hhbm5lbHNbaV0pCisgICAgICAgICAgICBGcmVlUmFtX2FhY0VuY19Qc3lPdXRDaGFubmVsKAorICAgICAgICAgICAgICAgICZwaFBzeU91dFtuXS0+cFBzeU91dENoYW5uZWxzW2ldKTsgLyogUFNZX09VVF9DSEFOTkVMICovCisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKCg4KSk7IGkrKykgeworICAgICAgICAgIGlmIChwaFBzeU91dFtuXS0+cHN5T3V0RWxlbWVudFtpXSkKKyAgICAgICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeU91dEVsZW1lbnRzKAorICAgICAgICAgICAgICAgICZwaFBzeU91dFtuXS0+cHN5T3V0RWxlbWVudFtpXSk7IC8qIFBTWV9PVVRfRUxFTUVOVFMgKi8KKyAgICAgICAgfQorCisgICAgICAgIEZyZWVSYW1fYWFjRW5jX1BzeU91dCgmcGhQc3lPdXRbbl0pOworICAgICAgfQorICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9wc3lfbWFpbi5oIGIvbGliQUFDZW5jL3NyYy9wc3lfbWFpbi5oCmluZGV4IDdiZGNjMzguLjdjYzAxYTMgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvcHN5X21haW4uaAorKysgYi9saWJBQUNlbmMvc3JjL3BzeV9tYWluLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTggKzkwLDE4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogUHN5Y2hvYWNjb3VzdGljIG1ham9yIGZ1bmN0aW9uIGJsb2NrCisgICBBdXRob3Iocyk6ICAgTS5XZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFBzeWNob2FjY291c3RpYyBtYWpvciBmdW5jdGlvbiBibG9jawogCi0jaWZuZGVmIF9QU1lNQUlOX0gKLSNkZWZpbmUgX1BTWU1BSU5fSAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmbmRlZiBQU1lfTUFJTl9ICisjZGVmaW5lIFBTWV9NQUlOX0gKIAogI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSAicWNfZGF0YS5oIgpAQCAtOTksNzYgKzExMCw1MiBAQAogLyoKICAgcHN5Y2ggaW50ZXJuYWwKICovCi10eXBlZGVmIHN0cnVjdCAgewordHlwZWRlZiBzdHJ1Y3QgeworICBQU1lfU1RBVElDICpwc3lTdGF0aWNbKDIpXTsKIAotICBQU1lfU1RBVElDKiAgICAgICAgcHN5U3RhdGljWygyKV07Cit9IFBTWV9FTEVNRU5UOwogCi19UFNZX0VMRU1FTlQ7Cit0eXBlZGVmIHN0cnVjdCB7CisgIFBTWV9EQVRBIHBzeURhdGFbKDIpXTsKKyAgVE5TX0RBVEEgdG5zRGF0YVsoMildOworICBQTlNfREFUQSBwbnNEYXRhWygyKV07CiAKLXR5cGVkZWYgc3RydWN0ICB7Cit9IFBTWV9EWU5BTUlDOwogCi0gIFBTWV9EQVRBICAgICAgICAgICBwc3lEYXRhWygyKV07Ci0gIFROU19EQVRBICAgICAgICAgICB0bnNEYXRhWygyKV07Ci0gIFBOU19EQVRBICAgICAgICAgICBwbnNEYXRhWygyKV07Cit0eXBlZGVmIHN0cnVjdCB7CisgIFBTWV9DT05GSUdVUkFUSU9OIHBzeUNvbmZbMl07IC8qIExPTkcgLyBTSE9SVCAqLworICBQU1lfRUxFTUVOVCAqcHN5RWxlbWVudFsoKDgpKV07CisgIFBTWV9TVEFUSUMgKnBTdGF0aWNDaGFubmVsc1soOCldOworICBQU1lfRFlOQU1JQyAqcHN5RHluYW1pYzsKKyAgSU5UIGdyYW51bGVMZW5ndGg7CiAKLX1QU1lfRFlOQU1JQzsKK30gUFNZX0lOVEVSTkFMOwogCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUHN5TmV3KFBTWV9JTlRFUk5BTCAqKnBocHN5LCBjb25zdCBJTlQgbkVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzLCBVQ0hBUiAqZHluYW1pY19SQU0pOwogCi10eXBlZGVmIHN0cnVjdCAgeworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1BzeU91dE5ldyhQU1lfT1VUICoqcGhwc3lPdXQsIGNvbnN0IElOVCBuRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsIGNvbnN0IElOVCBuU3ViRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqZHluYW1pY19SQU0pOwogCi0gIFBTWV9DT05GSUdVUkFUSU9OICBwc3lDb25mWzJdOyAvKiBMT05HIC8gU0hPUlQgKi8KLSAgUFNZX0VMRU1FTlQqICAgICAgIHBzeUVsZW1lbnRbKDgpXTsKLSAgUFNZX1NUQVRJQyogICAgICAgIHBTdGF0aWNDaGFubmVsc1soOCldOwotICBQU1lfRFlOQU1JQyogICAgICAgcHN5RHluYW1pYzsKLSAgSU5UICAgICAgICAgICAgICAgIGdyYW51bGVMZW5ndGg7Ci0KLX1QU1lfSU5URVJOQUw7Ci0KLQotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1BzeU5ldyhQU1lfSU5URVJOQUwgICoqcGhwc3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBuRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBuQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsVUNIQVIgICAgICAgICAgKmR5bmFtaWNfUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1BzeU91dE5ldyhQU1lfT1VUICAgICoqcGhwc3lPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICBuRWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICBuU3ViRnJhbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFVDSEFSICAgICAgICpkeW5hbWljX1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19wc3lJbml0KFBTWV9JTlRFUk5BTCAgICAqaFBzeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQgICAgICAgICoqcGhwc3lPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIG5TdWJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIG5NYXhDaGFubmVscywKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19wc3lJbml0KFBTWV9JTlRFUk5BTCAqaFBzeSwgUFNZX09VVCAqKnBocHN5T3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5TdWJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbk1heENoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgYXVkaW9PYmplY3RUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HICpjbSk7CiAKLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19wc3lNYWluSW5pdChQU1lfSU5URVJOQUwgKmhQc3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgYXVkaW9PYmplY3RUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyAqY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGdyYW51bGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRuc01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJhbmR3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdXNlUG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB1c2VJUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HIGluaXRGbGFncyk7CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcHN5TWFpbkluaXQoCisgICAgUFNZX0lOVEVSTkFMICpoUHN5LCBBVURJT19PQkpFQ1RfVFlQRSBhdWRpb09iamVjdFR5cGUsIENIQU5ORUxfTUFQUElORyAqY20sCisgICAgSU5UIHNhbXBsZVJhdGUsIElOVCBncmFudWxlTGVuZ3RoLCBJTlQgYml0UmF0ZSwgSU5UIHRuc01hc2ssIElOVCBiYW5kd2lkdGgsCisgICAgSU5UIHVzZVBucywgSU5UIHVzZUlTLCBJTlQgdXNlTVMsIFVJTlQgc3ludGF4RmxhZ3MsIFVMT05HIGluaXRGbGFncyk7CiAKLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19wc3lNYWluKElOVCAgICAgICAgICAgICAgICAgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfRUxFTUVOVCAgICAgICAgICpwc3lFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0RZTkFNSUMgICAgICAgICAqcHN5RHluYW1pYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OICAgKnBzeUNvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgICAgICpwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgICAgICAgICAgICAqcElucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqY2hJZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICB0b3RhbENoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcHN5TWFpbihJTlQgY2hhbm5lbHMsIFBTWV9FTEVNRU5UICpwc3lFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0RZTkFNSUMgKnBzeUR5bmFtaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTiAqcHN5Q29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCAqcHN5T3V0RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKnBJbnB1dCwgY29uc3QgVUlOVCBpbnB1dEJ1ZlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmNoSWR4LCBJTlQgdG90YWxDaGFubmVscyk7CiAKLXZvaWQgRkRLYWFjRW5jX1BzeUNsb3NlKFBTWV9JTlRFUk5BTCAgICoqcGhQc3lJbnRlcm5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQgICAgICAgICoqcGhQc3lPdXQpOwordm9pZCBGREthYWNFbmNfUHN5Q2xvc2UoUFNZX0lOVEVSTkFMICoqcGhQc3lJbnRlcm5hbCwgUFNZX09VVCAqKnBoUHN5T3V0KTsKIAotI2VuZGlmIC8qIF9QU1lNQUlOX0ggKi8KKyNlbmRpZiAvKiBQU1lfTUFJTl9IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3FjX2RhdGEuaCBiL2xpYkFBQ2VuYy9zcmMvcWNfZGF0YS5oCmluZGV4IDAwZDYwOTAuLjZlNjcxZWQgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvcWNfZGF0YS5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvcWNfZGF0YS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE5ICs5MCwyMCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBXZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBRdWFudGl6aW5nICYgY29kaW5nIGRhdGEKKyAgIEF1dGhvcihzKTogICBNLiBXZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFF1YW50aXppbmcgJiBjb2RpbmcgZGF0YQogCi0jaWZuZGVmIF9RQ19EQVRBX0gKLSNkZWZpbmUgX1FDX0RBVEFfSAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmbmRlZiBRQ19EQVRBX0gKKyNkZWZpbmUgUUNfREFUQV9ICiAKKyNpbmNsdWRlICJhYWNlbmMuaCIKICNpbmNsdWRlICJwc3lfY29uc3QuaCIKICNpbmNsdWRlICJkeW5fYml0cy5oIgogI2luY2x1ZGUgImFkal90aHJfZGF0YS5oIgpAQCAtOTksMTggKzExMSwxNiBAQAogI2luY2x1ZGUgIkZES19hdWRpby5oIgogI2luY2x1ZGUgImludGVyZmFjZS5oIgogCi0KIHR5cGVkZWYgZW51bSB7CiAgIFFDREFUQV9CUl9NT0RFX0lOVkFMSUQgPSAtMSwKLSAgUUNEQVRBX0JSX01PREVfQ0JSICAgICA9ICAwLAotICBRQ0RBVEFfQlJfTU9ERV9WQlJfMSAgID0gIDEsIC8qIDMyIGticHMvY2hhbm5lbCAqLwotICBRQ0RBVEFfQlJfTU9ERV9WQlJfMiAgID0gIDIsIC8qIDQwIGticHMvY2hhbm5lbCAqLwotICBRQ0RBVEFfQlJfTU9ERV9WQlJfMyAgID0gIDMsIC8qIDQ4IGticHMvY2hhbm5lbCAqLwotICBRQ0RBVEFfQlJfTU9ERV9WQlJfNCAgID0gIDQsIC8qIDY0IGticHMvY2hhbm5lbCAqLwotICBRQ0RBVEFfQlJfTU9ERV9WQlJfNSAgID0gIDUsIC8qIDk2IGticHMvY2hhbm5lbCAqLwotICBRQ0RBVEFfQlJfTU9ERV9GRiAgICAgID0gIDYsICAvKiBGaXhlZCBmcmFtZSBtb2RlLiAqLwotICBRQ0RBVEFfQlJfTU9ERV9TRlIgICAgID0gIDcgIC8qIFN1cGVyZnJhbWUgbW9kZS4gKi8KLQorICBRQ0RBVEFfQlJfTU9ERV9DQlIgPSAwLCAgIC8qIENvbnN0YW50IGJpdCByYXRlLCBnaXZlbiBhdmVyYWdlIGJpdHJhdGUgKi8KKyAgUUNEQVRBX0JSX01PREVfVkJSXzEgPSAxLCAvKiBWYXJpYWJsZSBiaXQgcmF0ZSwgdmVyeSBsb3cgKi8KKyAgUUNEQVRBX0JSX01PREVfVkJSXzIgPSAyLCAvKiBWYXJpYWJsZSBiaXQgcmF0ZSwgbG93ICovCisgIFFDREFUQV9CUl9NT0RFX1ZCUl8zID0gMywgLyogVmFyaWFibGUgYml0IHJhdGUsIG1lZGl1bSAqLworICBRQ0RBVEFfQlJfTU9ERV9WQlJfNCA9IDQsIC8qIFZhcmlhYmxlIGJpdCByYXRlLCBoaWdoICovCisgIFFDREFUQV9CUl9NT0RFX1ZCUl81ID0gNSwgLyogVmFyaWFibGUgYml0IHJhdGUsIHZlcnkgaGlnaCAqLworICBRQ0RBVEFfQlJfTU9ERV9GRiA9IDYsICAgIC8qIEZpeGVkIGZyYW1lIG1vZGUuICovCisgIFFDREFUQV9CUl9NT0RFX1NGUiA9IDcgICAgLyogU3VwZXJmcmFtZSBtb2RlLiAqLwogCiB9IFFDREFUQV9CUl9NT0RFOwogCkBAIC0xMjcsMTM3ICsxMzcsMTUwIEBACiAgIElOVCBuQ2hhbm5lbHM7CiAgIElOVCBuQ2hhbm5lbHNFZmY7CiAgIElOVCBuRWxlbWVudHM7Ci0gIEVMRU1FTlRfSU5GTyBlbEluZm9bKDgpXTsKKyAgRUxFTUVOVF9JTkZPIGVsSW5mb1soKDgpKV07CiB9IENIQU5ORUxfTUFQUElORzsKIAogdHlwZWRlZiBzdHJ1Y3QgewogICBJTlQgcGFkZGluZ1Jlc3Q7CiB9IFBBRERJTkc7CiAKLQogLyogUXVhbnRpemluZyAmIGNvZGluZyBzdGFnZSAqLwogCi1zdHJ1Y3QgUUNfSU5JVHsKLSAgQ0hBTk5FTF9NQVBQSU5HKiBjaGFubmVsTWFwcGluZzsKK3N0cnVjdCBRQ19JTklUIHsKKyAgQ0hBTk5FTF9NQVBQSU5HICpjaGFubmVsTWFwcGluZzsKICAgSU5UIHNjZUNwZTsgICAgICAvKiBub3QgdXNlZCB5ZXQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgSU5UIG1heEJpdHM7ICAgICAvKiBtYXhpbXVtIG51bWJlciBvZiBiaXRzIGluIHJlc2Vydm9pciAgKi8KICAgSU5UIGF2ZXJhZ2VCaXRzOyAvKiBhdmVyYWdlIG51bWJlciBvZiBiaXRzIHdlIHNob3VsZCB1c2UgKi8KICAgSU5UIGJpdFJlczsKLSAgSU5UIHNhbXBsZVJhdGU7ICAgICAgIC8qIG91dHB1dCBzYW1wbGUgcmF0ZSAgICAgICAgICAgICAgICAgICAqLwotICBJTlQgYWR2YW5jZWRCaXRzVG9QZTsgLyogaWYgc2V0LCBjYWxjIGJpdHMyUEUgZmFjdG9yIGRlcGVuZGluZyBvbiBzYW1wbGVyYXRlICovCi0gIElOVCBzdGF0aWNCaXRzOyAgLyogQml0cyBwZXIgZnJhbWUgY29uc3VtZWQgYnkgdHJhbnNwb3J0IGxheWVycy4gKi8KKyAgSU5UIHNhbXBsZVJhdGU7IC8qIG91dHB1dCBzYW1wbGUgcmF0ZSAgICAgICAgICAgICAgICAgICAqLworICBJTlQgaXNMb3dEZWxheTsgLyogaWYgc2V0LCBjYWxjIGJpdHMyUEUgZmFjdG9yIGRlcGVuZGluZyBvbiBzYW1wbGVyYXRlICovCisgIElOVCBzdGF0aWNCaXRzOyAvKiBCaXRzIHBlciBmcmFtZSBjb25zdW1lZCBieSB0cmFuc3BvcnQgbGF5ZXJzLiAqLwogICBRQ0RBVEFfQlJfTU9ERSBiaXRyYXRlTW9kZTsKICAgSU5UIG1lYW5QZTsKLSAgSU5UIGNoQml0cmF0ZTsKKyAgSU5UIGNoQml0cmF0ZTsgLyogQml0cmF0ZS9jaGFubmVsICovCiAgIElOVCBpbnZRdWFudDsKLSAgSU5UIG1heEl0ZXJhdGlvbnM7IC8qIE1heGltdW0gbnVtYmVyIG9mIGFsbG93ZWQgaXRlcmF0aW9ucyBiZWZvcmUgRkRLYWFjRW5jX2NyYXNoUmVjb3ZlcnkoKSBpcyBhcHBsaWVkLiAqLworICBJTlQgbWF4SXRlcmF0aW9uczsgLyogTWF4aW11bSBudW1iZXIgb2YgYWxsb3dlZCBpdGVyYXRpb25zIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX2NyYXNoUmVjb3ZlcnkoKSBpcyBhcHBsaWVkLiAqLwogICBGSVhQX0RCTCBtYXhCaXRGYWM7CiAgIElOVCBiaXRyYXRlOwotICBJTlQgblN1YkZyYW1lczsgLyogaGVscGVyIHZhcmlhYmxlICovCi0gIElOVCBtaW5CaXRzOyAgICAvKiBtaW5pbWFsIG51bWJlciBvZiBiaXRzIGluIG9uZSBmcmFtZSovCisgIElOVCBuU3ViRnJhbWVzOyAgICAgICAgICAgICAgICAvKiBoZWxwZXIgdmFyaWFibGUgKi8KKyAgSU5UIG1pbkJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIG1pbmltYWwgbnVtYmVyIG9mIGJpdHMgaW4gb25lIGZyYW1lKi8KKyAgQUFDRU5DX0JJVFJFU19NT0RFIGJpdFJlc01vZGU7IC8qIDA6IGZ1bGwgYml0cmVzZXJ2b2lyLCAxOiByZWR1Y2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRyZXNlcnZvaXIsIDI6IGRpc2FibGVkIGJpdHJlc2Vydm9pciAqLworICBJTlQgYml0RGlzdHJpYnV0aW9uTW9kZTsgLyogQ29uZmlndXJlIGVsZW1lbnQtd2lzZSBleGVjdXRpb24gb3IgZXhlY3V0aW9uIG92ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBlbGVtZW50cyBmb3IgdGhlIHBlLWRlcGVuZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkLWFkYXB0aW9uICovCiAKICAgUEFERElORyBwYWRkaW5nOwogfTsKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRklYUF9EQkwgICAgICBtZGN0U3BlY3RydW1bKDEwMjQpXTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgRklYUF9EQkwgbWRjdFNwZWN0cnVtWygxMDI0KV07CiAKLSAgU0hPUlQgICAgICAgICBxdWFudFNwZWNbKDEwMjQpXTsKKyAgU0hPUlQgcXVhbnRTcGVjWygxMDI0KV07CiAKLSAgVUlOVCAgICAgICAgICBtYXhWYWx1ZUluU2ZiW01BWF9HUk9VUEVEX1NGQl07Ci0gIElOVCAgICAgICAgICAgc2NmW01BWF9HUk9VUEVEX1NGQl07Ci0gIElOVCAgICAgICAgICAgZ2xvYmFsR2FpbjsKLSAgU0VDVElPTl9EQVRBICBzZWN0aW9uRGF0YTsKKyAgVUlOVCBtYXhWYWx1ZUluU2ZiW01BWF9HUk9VUEVEX1NGQl07CisgIElOVCBzY2ZbTUFYX0dST1VQRURfU0ZCXTsKKyAgSU5UIGdsb2JhbEdhaW47CisgIFNFQ1RJT05fREFUQSBzZWN0aW9uRGF0YTsKIAotICBGSVhQX0RCTCAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGFbTUFYX0dST1VQRURfU0ZCXTsKKyAgRklYUF9EQkwgc2ZiRm9ybUZhY3RvckxkRGF0YVtNQVhfR1JPVVBFRF9TRkJdOwogCi0gIEZJWFBfREJMICAgICAgc2ZiVGhyZXNob2xkTGREYXRhW01BWF9HUk9VUEVEX1NGQl07Ci0gIEZJWFBfREJMICAgICAgc2ZiTWluU25yTGREYXRhW01BWF9HUk9VUEVEX1NGQl07Ci0gIEZJWFBfREJMICAgICAgc2ZiRW5lcmd5TGREYXRhW01BWF9HUk9VUEVEX1NGQl07Ci0gIEZJWFBfREJMICAgICAgc2ZiRW5lcmd5W01BWF9HUk9VUEVEX1NGQl07Ci0gIEZJWFBfREJMICAgICAgc2ZiV2VpZ2h0ZWRFbmVyZ3lMZERhdGFbTUFYX0dST1VQRURfU0ZCXTsKKyAgRklYUF9EQkwgc2ZiVGhyZXNob2xkTGREYXRhW01BWF9HUk9VUEVEX1NGQl07CisgIEZJWFBfREJMIHNmYk1pblNuckxkRGF0YVtNQVhfR1JPVVBFRF9TRkJdOworICBGSVhQX0RCTCBzZmJFbmVyZ3lMZERhdGFbTUFYX0dST1VQRURfU0ZCXTsKKyAgRklYUF9EQkwgc2ZiRW5lcmd5W01BWF9HUk9VUEVEX1NGQl07CisgIEZJWFBfREJMIHNmYldlaWdodGVkRW5lcmd5TGREYXRhW01BWF9HUk9VUEVEX1NGQl07CiAKLSAgRklYUF9EQkwgICAgICBzZmJFbkZhY0xkW01BWF9HUk9VUEVEX1NGQl07CisgIEZJWFBfREJMIHNmYkVuRmFjTGRbTUFYX0dST1VQRURfU0ZCXTsKIAotICBGSVhQX0RCTCAgICAgIHNmYlNwcmVhZEVuZXJneVtNQVhfR1JPVVBFRF9TRkJdOworICBGSVhQX0RCTCBzZmJTcHJlYWRFbmVyZ3lbTUFYX0dST1VQRURfU0ZCXTsKIAogfSBRQ19PVVRfQ0hBTk5FTDsKIAotCi10eXBlZGVmIHN0cnVjdAotewotICBFWFRfUEFZTE9BRF9UWVBFICB0eXBlOyAgLyogdHlwZSBvZiB0aGUgZXh0ZW5zaW9uIHBheWxvYWQgKi8KLSAgSU5UICAgIG5QYXlsb2FkQml0czsgICAgIC8qIHNpemUgb2YgdGhlIHBheWxvYWQgKi8KLSAgVUNIQVIgKnBQYXlsb2FkOyAgICAgICAgIC8qIHBvaW50ZXIgdG8gcGF5bG9hZCAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBFWFRfUEFZTE9BRF9UWVBFIHR5cGU7IC8qIHR5cGUgb2YgdGhlIGV4dGVuc2lvbiBwYXlsb2FkICovCisgIElOVCBuUGF5bG9hZEJpdHM7ICAgICAgLyogc2l6ZSBvZiB0aGUgcGF5bG9hZCAqLworICBVQ0hBUiAqcFBheWxvYWQ7ICAgICAgIC8qIHBvaW50ZXIgdG8gcGF5bG9hZCAqLwogCiB9IFFDX09VVF9FWFRFTlNJT047CiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UIHN0YXRpY0JpdHNVc2VkOyAvKiBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzICovCisgIElOVCBkeW5CaXRzVXNlZDsgICAgLyogZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3NlcyAqLwogCi10eXBlZGVmIHN0cnVjdAotewotICBJTlQgICAgICAgICAgc3RhdGljQml0c1VzZWQ7IC8qIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMgKi8KLSAgSU5UICAgICAgICAgIGR5bkJpdHNVc2VkOyAgICAvKiBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzICovCisgIElOVCBleHRCaXRzVXNlZDsgLyogYml0IGNvbnN1bXB0aW9uIG9mIGV4dGVuZGVkIGZpbGwgZWxlbWVudHMgKi8KKyAgSU5UIG5FeHRlbnNpb25zOyAvKiBudW1iZXIgb2YgZXh0ZW5zaW9uIHBheWxvYWRzIGZvciB0aGlzIGVsZW1lbnQgKi8KKyAgUUNfT1VUX0VYVEVOU0lPTiBleHRlbnNpb25bKDEpXTsgLyogcmVmZmVyaW5nIGV4dGVuc2lvbiBwYXlsb2FkICovCiAKLSAgSU5UICAgICAgICAgIGV4dEJpdHNVc2VkOyAgICAvKiBiaXQgY29uc3VtcHRpb24gb2YgZXh0ZW5kZWQgZmlsbCBlbGVtZW50cyAqLwotICBJTlQgICAgICAgICAgbkV4dGVuc2lvbnM7ICAgIC8qIG51bWJlciBvZiBleHRlbnNpb24gcGF5bG9hZHMgZm9yIHRoaXMgZWxlbWVudCAqLwotICBRQ19PVVRfRVhURU5TSU9OIGV4dGVuc2lvblsoMSldOyAgLyogcmVmZmVyaW5nIGV4dGVuc2lvbiBwYXlsb2FkICovCisgIElOVCBncmFudGVkRHluQml0czsKIAotICBJTlQgICAgICAgICAgZ3JhbnRlZER5bkJpdHM7CisgIElOVCBncmFudGVkUGU7CisgIElOVCBncmFudGVkUGVDb3JyOwogCi0gIElOVCAgICAgICAgICBncmFudGVkUGU7Ci0gIElOVCAgICAgICAgICBncmFudGVkUGVDb3JyOwotCi0gIFBFX0RBVEEgICAgICBwZURhdGE7CisgIFBFX0RBVEEgcGVEYXRhOwogCiAgIFFDX09VVF9DSEFOTkVMICpxY091dENoYW5uZWxbKDIpXTsKIAorICBVQ0hBUgorICAqZHluTWVtX0FoX0ZsYWc7IC8qIHBvaW50ZXIgdG8gZHluYW1pYyBidWZmZXIgdXNlZCBieSBBaEZsYWcgaW4gZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfYWRhcHRUaHJlc2hvbGRzVG9QZSgpICovCisgIFVDSEFSCisgICpkeW5NZW1fVGhyX0V4cDsgLyogcG9pbnRlciB0byBkeW5hbWljIGJ1ZmZlciB1c2VkIGJ5IFRockV4cCBpbiBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19hZGFwdFRocmVzaG9sZHNUb1BlKCkgKi8KKyAgVUNIQVIgKmR5bk1lbV9TZmJOQWN0aXZlTGluZXNMZERhdGE7IC8qIHBvaW50ZXIgdG8gZHluYW1pYyBidWZmZXIgdXNlZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiTkFjdGl2ZUxpbmVzTGREYXRhIGluIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfY29ycmVjdFRocmVzaCgpICovCiAKIH0gUUNfT1VUX0VMRU1FTlQ7CiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIFFDX09VVF9FTEVNRU5UICAgICpxY0VsZW1lbnRbKDgpXTsKLSAgUUNfT1VUX0NIQU5ORUwgICAgKnBRY091dENoYW5uZWxzWyg4KV07Ci0gIFFDX09VVF9FWFRFTlNJT04gICBleHRlbnNpb25bKDIrMildOyAgLyogZ2xvYmFsIGV4dGVuc2lvbiBwYXlsb2FkICovCi0gIElOVCAgICAgICAgICBuRXh0ZW5zaW9uczsgICAgICAgLyogbnVtYmVyIG9mIGV4dGVuc2lvbiBwYXlsb2FkcyBmb3IgdGhpcyBBVSAqLwotICBJTlQgICAgICAgICAgbWF4RHluQml0czsgICAgICAgIC8qIG1heGltYWwgYWxsb3dlZCBkeW5hbWljIGJpdHMgaW4gZnJhbWUgKi8KLSAgSU5UICAgICAgICAgIGdyYW50ZWREeW5CaXRzOyAgICAvKiBncmFudGVkIGR5bmFtaWMgYml0cyBpbiBmcmFtZSAqLwotICBJTlQgICAgICAgICAgdG90RmlsbEJpdHM7ICAgICAgIC8qIGZpbGwgYml0cyAqLwotICBJTlQgICAgICAgICAgZWxlbWVudEV4dEJpdHM7ICAgIC8qIGVsZW1lbnQgYXNzb2NpYXRlZCBleHRlbnNpb24gcGF5bG9hZCBiaXRzLCBlLmcuIHNiciwgZHJjIC4uLiAqLwotICBJTlQgICAgICAgICAgZ2xvYmFsRXh0Qml0czsgICAgIC8qIGZyYW1lL2F1IGFzc29jaWF0ZWQgZXh0ZW5zaW9uIHBheWxvYWQgYml0cyAoYW5jIGRhdGEgLi4uKSAqLwotICBJTlQgICAgICAgICAgc3RhdGljQml0czsgICAgICAgIC8qIGFhYyBzaWRlIGluZm8gYml0cyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBRQ19PVVRfRUxFTUVOVCAqcWNFbGVtZW50WygoOCkpXTsKKyAgUUNfT1VUX0NIQU5ORUwgKnBRY091dENoYW5uZWxzWyg4KV07CisgIFFDX09VVF9FWFRFTlNJT04gZXh0ZW5zaW9uWygyICsgMildOyAvKiBnbG9iYWwgZXh0ZW5zaW9uIHBheWxvYWQgKi8KKyAgSU5UIG5FeHRlbnNpb25zOyAgICAvKiBudW1iZXIgb2YgZXh0ZW5zaW9uIHBheWxvYWRzIGZvciB0aGlzIEFVICovCisgIElOVCBtYXhEeW5CaXRzOyAgICAgLyogbWF4aW1hbCBhbGxvd2VkIGR5bmFtaWMgYml0cyBpbiBmcmFtZSAqLworICBJTlQgZ3JhbnRlZER5bkJpdHM7IC8qIGdyYW50ZWQgZHluYW1pYyBiaXRzIGluIGZyYW1lICovCisgIElOVCB0b3RGaWxsQml0czsgICAgLyogZmlsbCBiaXRzICovCisgIElOVCBlbGVtZW50RXh0Qml0czsgLyogZWxlbWVudCBhc3NvY2lhdGVkIGV4dGVuc2lvbiBwYXlsb2FkIGJpdHMsIGUuZy4gc2JyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRyYyAuLi4gKi8KKyAgSU5UIGdsb2JhbEV4dEJpdHM7ICAvKiBmcmFtZS9hdSBhc3NvY2lhdGVkIGV4dGVuc2lvbiBwYXlsb2FkIGJpdHMgKGFuYyBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKSAqLworICBJTlQgc3RhdGljQml0czsgICAgIC8qIGFhYyBzaWRlIGluZm8gYml0cyAqLwogCi0gIElOVCAgICAgICAgICB0b3RhbE5vUmVkUGU7Ci0gIElOVCAgICAgICAgICB0b3RhbEdyYW50ZWRQZUNvcnI7CisgIElOVCB0b3RhbE5vUmVkUGU7CisgIElOVCB0b3RhbEdyYW50ZWRQZUNvcnI7CiAKLSAgSU5UICAgICAgICAgIHVzZWREeW5CaXRzOyAgICAgICAvKiBudW1iZXIgb2YgZHluYW1pYyBiaXRzIGluIHVzZSAqLwotICBJTlQgICAgICAgICAgYWxpZ25CaXRzOyAgICAgICAgIC8qIEFVIGFsaWdubWVudCBiaXRzICovCi0gIElOVCAgICAgICAgICB0b3RhbEJpdHM7ICAgICAgICAgLyogc3VtIG9mIHN0YXRpYywgZHluLCBzYnIsIGZpbGwsIGFsaWduIGFuZCBkc2UgYml0cyAqLworICBJTlQgdXNlZER5bkJpdHM7IC8qIG51bWJlciBvZiBkeW5hbWljIGJpdHMgaW4gdXNlICovCisgIElOVCBhbGlnbkJpdHM7ICAgLyogQVUgYWxpZ25tZW50IGJpdHMgKi8KKyAgSU5UIHRvdGFsQml0czsgICAvKiBzdW0gb2Ygc3RhdGljLCBkeW4sIHNiciwgZmlsbCwgYWxpZ24gYW5kIGRzZSBiaXRzICovCiAKIH0gUUNfT1VUOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIElOVCBjaEJpdHJhdGVFbDsgICAgICAgICAgICAgICAgICAgIC8qIGNoYW5uZWwgYml0cmF0ZSBpbiBlbGVtZW50ICh0b3RhbGJpdHJhdGUqZWxfcmVsYXRpdmVCaXRzL2VsX2NoYW5uZWxzKSAqLwotICBJTlQgbWF4Qml0c0VsOyAgICAgICAgICAgICAgICAgICAgICAvKiB1c2VkIGluIGNyYXNoIHJlY292ZXJ5ICovCi0gIElOVCBiaXRSZXNMZXZlbEVsOyAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBiaXRyZXNlcnZvaXIgbGV2ZWwgaW4gZWFjaCBjYWxsIG9mIEZES2FhY0VuY19RQ01haW4gKi8KLSAgSU5UIG1heEJpdFJlc0JpdHNFbDsgICAgICAgICAgICAgICAgLyogbkVmZkNoYW5uZWxzKjYxNDQgLSBhdmVyYWdlQml0c0luRnJhbWUgKi8KLSAgRklYUF9EQkwgcmVsYXRpdmVCaXRzRWw7ICAgICAgICAgICAgLyogQml0cyByZWxhdGl2ZSB0byB0b3RhbCBCaXRzKi8KKyAgSU5UIGNoQml0cmF0ZUVsOyAgICAgICAgIC8qIGNoYW5uZWwgYml0cmF0ZSBpbiBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG90YWxiaXRyYXRlKmVsX3JlbGF0aXZlQml0cy9lbF9jaGFubmVscykgKi8KKyAgSU5UIG1heEJpdHNFbDsgICAgICAgICAgIC8qIHVzZWQgaW4gY3Jhc2ggcmVjb3ZlcnkgKi8KKyAgSU5UIGJpdFJlc0xldmVsRWw7ICAgICAgIC8qIHVwZGF0ZSBiaXRyZXNlcnZvaXIgbGV2ZWwgaW4gZWFjaCBjYWxsIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfUUNNYWluICovCisgIElOVCBtYXhCaXRSZXNCaXRzRWw7ICAgICAvKiBuRWZmQ2hhbm5lbHMqNjE0NCAtIGF2ZXJhZ2VCaXRzSW5GcmFtZSAqLworICBGSVhQX0RCTCByZWxhdGl2ZUJpdHNFbDsgLyogQml0cyByZWxhdGl2ZSB0byB0b3RhbCBCaXRzKi8KIH0gRUxFTUVOVF9CSVRTOwogCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAvKiB0aGlzIGlzIGJhc2ljYWxseSBzdHJ1Y3QgUUNfSU5JVCAqLwogCiAgIElOVCBnbG9iSGRyQml0czsKLSAgSU5UIG1heEJpdHNQZXJGcmFtZTsgICAvKiBtYXhpbWFsIGFsbG93ZWQgYml0cyBwZXIgZnJhbWUsIDYxNDQqbkNoYW5uZWxzRWZmICovCi0gIElOVCBtaW5CaXRzUGVyRnJhbWU7ICAgLyogbWluaW1hbCBhbGxvd2QgYml0cyBwZXIgZnJhbSwgc3VwZXJmcmFtaW5nIC0gRFJNICovCisgIElOVCBtYXhCaXRzUGVyRnJhbWU7IC8qIG1heGltYWwgYWxsb3dlZCBiaXRzIHBlciBmcmFtZSwgNjE0NCpuQ2hhbm5lbHNFZmYgKi8KKyAgSU5UIG1pbkJpdHNQZXJGcmFtZTsgLyogbWluaW1hbCBhbGxvd2QgYml0cyBwZXIgZnJhbSwgc3VwZXJmcmFtaW5nIC0gRFJNICovCiAgIElOVCBuRWxlbWVudHM7CiAgIFFDREFUQV9CUl9NT0RFIGJpdHJhdGVNb2RlOwotICBJTlQgYml0RGlzdHJpYnV0aW9uTW9kZTsgLyogMDogZnVsbCBiaXRyZXNlcnZvaXIsIDE6IHJlZHVjZWQgYml0cmVzZXJ2b2lyLCAyOiBkaXNhYmxlZCBiaXRyZXNlcnZvaXIgKi8KKyAgQUFDRU5DX0JJVFJFU19NT0RFIGJpdFJlc01vZGU7IC8qIDA6IGZ1bGwgYml0cmVzZXJ2b2lyLCAxOiByZWR1Y2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRyZXNlcnZvaXIsIDI6IGRpc2FibGVkIGJpdHJlc2Vydm9pciAqLwogICBJTlQgYml0UmVzVG90OwogICBJTlQgYml0UmVzVG90TWF4OwotICBJTlQgbWF4SXRlcmF0aW9uczsgICAgICAvKiBNYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIGl0ZXJhdGlvbnMgYmVmb3JlIEZES2FhY0VuY19jcmFzaFJlY292ZXJ5KCkgaXMgYXBwbGllZC4gKi8KKyAgSU5UIG1heEl0ZXJhdGlvbnM7IC8qIE1heGltdW0gbnVtYmVyIG9mIGFsbG93ZWQgaXRlcmF0aW9ucyBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19jcmFzaFJlY292ZXJ5KCkgaXMgYXBwbGllZC4gKi8KICAgSU5UIGludlF1YW50OwogCiAgIEZJWFBfREJMIHZiclF1YWxGYWN0b3I7CkBAIC0yNjUsMTYgKzI4OCwxMiBAQAogCiAgIFBBRERJTkcgcGFkZGluZzsKIAotICBFTEVNRU5UX0JJVFMgICplbGVtZW50Qml0c1soOCldOworICBFTEVNRU5UX0JJVFMgKmVsZW1lbnRCaXRzWygoOCkpXTsKICAgQklUQ05UUl9TVEFURSAqaEJpdENvdW50ZXI7CiAgIEFESl9USFJfU1RBVEUgKmhBZGpUaHI7CiAKLSAgSU5UIGRab25lUXVhbnRFbmFibGU7ICAgLyogZW5hYmxlIGRlYWQgem9uZSBxdWFudGl6ZXIgKi8KKyAgSU5UIGRab25lUXVhbnRFbmFibGU7IC8qIGVuYWJsZSBkZWFkIHpvbmUgcXVhbnRpemVyICovCiAKIH0gUUNfU1RBVEU7CiAKLSNlbmRpZiAvKiBfUUNfREFUQV9IICovCi0KLQotCi0KKyNlbmRpZiAvKiBRQ19EQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvcWNfbWFpbi5jcHAgYi9saWJBQUNlbmMvc3JjL3FjX21haW4uY3BwCmluZGV4IDljZDczZjYuLmJhM2JjN2UgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvcWNfbWFpbi5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9xY19tYWluLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogUXVhbnRpemluZyAmIGNvZGluZworICAgQXV0aG9yKHMpOiAgIE0uIFdlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogUXVhbnRpemluZyAmIGNvZGluZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAicWNfbWFpbi5oIgogI2luY2x1ZGUgInF1YW50aXplLmgiCkBAIC0xMDAsNiArMTEyLDcgQEAKIAogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAKKyNkZWZpbmUgQUFDRU5DX0RaUV9CUl9USFIgMzIwMDAgLyogRGVhZCB6b25lIHF1YW50aXplciBiaXRyYXRlIHRocmVzaG9sZCAqLwogCiB0eXBlZGVmIHN0cnVjdCB7CiAgIFFDREFUQV9CUl9NT0RFIGJpdHJhdGVNb2RlOwpAQCAtMTA3LDYyICsxMjAsNTcgQEAKIH0gVEFCX1ZCUl9RVUFMX0ZBQ1RPUjsKIAogc3RhdGljIGNvbnN0IFRBQl9WQlJfUVVBTF9GQUNUT1IgdGFibGVWYnJRdWFsRmFjdG9yW10gPSB7Ci0gIHtRQ0RBVEFfQlJfTU9ERV9WQlJfMSwgRkwyRlhDT05TVF9EQkwoMC4xNjBmKX0sIC8qIDMyIGticHMgbW9ubyAgIEFBQy1MQyArIFNCUiArIFBTICovCi0gIHtRQ0RBVEFfQlJfTU9ERV9WQlJfMiwgRkwyRlhDT05TVF9EQkwoMC4xNDhmKX0sIC8qIDY0IGticHMgc3RlcmVvIEFBQy1MQyArIFNCUiAgICAgICovCi0gIHtRQ0RBVEFfQlJfTU9ERV9WQlJfMywgRkwyRlhDT05TVF9EQkwoMC4xMzVmKX0sIC8qIDgwIC0gOTYga2JwcyBzdGVyZW8gQUFDLUxDICAgICAgICovCi0gIHtRQ0RBVEFfQlJfTU9ERV9WQlJfNCwgRkwyRlhDT05TVF9EQkwoMC4xMTFmKX0sIC8qIDEyOCBrYnBzIHN0ZXJlbyBBQUMtTEMgICAgICAgICAgICovCi0gIHtRQ0RBVEFfQlJfTU9ERV9WQlJfNSwgRkwyRlhDT05TVF9EQkwoMC4wNzBmKX0gIC8qIDE5MiBrYnBzIHN0ZXJlbyBBQUMtTEMgICAgICAgICAgICovCisgICAge1FDREFUQV9CUl9NT0RFX1ZCUl8xLAorICAgICBGTDJGWENPTlNUX0RCTCgwLjE2MGYpfSwgLyogQXBwcm94LiAzMiAtICA0OCAoQUMtTEMpLCAgMzIgLSAgNTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBQUMtTEQvRUxEKSBrYnBzL2NoYW5uZWwgKi8KKyAgICB7UUNEQVRBX0JSX01PREVfVkJSXzIsCisgICAgIEZMMkZYQ09OU1RfREJMKDAuMTQ4Zil9LCAvKiBBcHByb3guIDQwIC0gIDU2IChBQy1MQyksICA0MCAtICA2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFBQy1MRC9FTEQpIGticHMvY2hhbm5lbCAqLworICAgIHtRQ0RBVEFfQlJfTU9ERV9WQlJfMywKKyAgICAgRkwyRlhDT05TVF9EQkwoMC4xMzVmKX0sIC8qIEFwcHJveC4gNDggLSAgNjQgKEFDLUxDKSwgIDQ4IC0gIDcyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUFDLUxEL0VMRCkga2Jwcy9jaGFubmVsICovCisgICAge1FDREFUQV9CUl9NT0RFX1ZCUl80LAorICAgICBGTDJGWENPTlNUX0RCTCgwLjExMWYpfSwgLyogQXBwcm94LiA2NCAtICA4MCAoQUMtTEMpLCAgNjQgLSAgODgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBQUMtTEQvRUxEKSBrYnBzL2NoYW5uZWwgKi8KKyAgICB7UUNEQVRBX0JSX01PREVfVkJSXzUsCisgICAgIEZMMkZYQ09OU1RfREJMKDAuMDcwZil9IC8qIEFwcHJveC4gOTYgLSAxMjAgKEFDLUxDKSwgMTEyIC0gMTQ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBQUMtTEQvRUxEKSBrYnBzL2NoYW5uZWwgKi8KIH07CiAKLXN0YXRpYyBJTlQgaXNDb25zdGFudEJpdHJhdGVNb2RlKAotICAgICAgICBjb25zdCBRQ0RBVEFfQlJfTU9ERSBiaXRyYXRlTW9kZQotICAgICAgICApCi17Ci0gIHJldHVybiAoICgoYml0cmF0ZU1vZGU9PVFDREFUQV9CUl9NT0RFX0NCUikgfHwgKGJpdHJhdGVNb2RlPT1RQ0RBVEFfQlJfTU9ERV9TRlIpIHx8IChiaXRyYXRlTW9kZT09UUNEQVRBX0JSX01PREVfRkYpKSA/IDEgOiAwICk7CitzdGF0aWMgSU5UIGlzQ29uc3RhbnRCaXRyYXRlTW9kZShjb25zdCBRQ0RBVEFfQlJfTU9ERSBiaXRyYXRlTW9kZSkgeworICByZXR1cm4gKCgoYml0cmF0ZU1vZGUgPT0gUUNEQVRBX0JSX01PREVfQ0JSKSB8fAorICAgICAgICAgICAoYml0cmF0ZU1vZGUgPT0gUUNEQVRBX0JSX01PREVfU0ZSKSB8fAorICAgICAgICAgICAoYml0cmF0ZU1vZGUgPT0gUUNEQVRBX0JSX01PREVfRkYpKQorICAgICAgICAgICAgICA/IDEKKyAgICAgICAgICAgICAgOiAwKTsKIH0KIAotCi0KLXR5cGVkZWYgZW51bXsKLSAgICBGUkFNRV9MRU5fQllURVNfTU9EVUxPID0gIDEsCi0gICAgRlJBTUVfTEVOX0JZVEVTX0lOVCAgICA9ICAyCi19RlJBTUVfTEVOX1JFU1VMVF9NT0RFOwordHlwZWRlZiBlbnVtIHsKKyAgRlJBTUVfTEVOX0JZVEVTX01PRFVMTyA9IDEsCisgIEZSQU1FX0xFTl9CWVRFU19JTlQgPSAyCit9IEZSQU1FX0xFTl9SRVNVTFRfTU9ERTsKIAogLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KIAotc3RhdGljIElOVCBGREthYWNFbmNfY2FsY01heFZhbHVlSW5TZmIoSU5UICAgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgKlJFU1RSSUNUIHNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKlJFU1RSSUNUIHF1YW50U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKlJFU1RSSUNUIG1heFZhbHVlKTsKK3N0YXRpYyBJTlQgRkRLYWFjRW5jX2NhbGNNYXhWYWx1ZUluU2ZiKElOVCBzZmJDbnQsIElOVCBtYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzZmJQZXJHcm91cCwgSU5UKiBSRVNUUklDVCBzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCogUkVTVFJJQ1QgcXVhbnRTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQqIFJFU1RSSUNUIG1heFZhbHVlKTsKIAotc3RhdGljIHZvaWQgRkRLYWFjRW5jX2NyYXNoUmVjb3ZlcnkoSU5UICAgICAgICAgICAgICAgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqICBwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqICAgICAgICAgICBxY091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQgICAqcWNFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICBiaXRzVG9TYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBhb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgIHN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICBlcENvbmZpZyk7CitzdGF0aWMgdm9pZCBGREthYWNFbmNfY3Jhc2hSZWNvdmVyeShJTlQgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiBwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiBxY091dCwgUUNfT1VUX0VMRU1FTlQqIHFjRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBiaXRzVG9TYXZlLCBBVURJT19PQkpFQ1RfVFlQRSBhb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHN5bnRheEZsYWdzLCBTQ0hBUiBlcENvbmZpZyk7CiAKLXN0YXRpYwotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3JlZHVjZUJpdENvbnN1bXB0aW9uKGludCogICAgICAgICAgICAgaXRlcmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgbWF4SXRlcmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgZ2FpbkFkanVzdG1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgIGNoQ29uc3RyYWludHNGdWxmaWxsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgIGNhbGN1bGF0ZVF1YW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqIHBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqICAgICAgICAgIHFjT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqICBxY091dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX0JJVFMqICAgIGVsQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFICBhb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgIHN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICBlcENvbmZpZyk7CitzdGF0aWMgQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3JlZHVjZUJpdENvbnN1bXB0aW9uKAorICAgIGludCogaXRlcmF0aW9ucywgY29uc3QgaW50IG1heEl0ZXJhdGlvbnMsIGludCBnYWluQWRqdXN0bWVudCwKKyAgICBpbnQqIGNoQ29uc3RyYWludHNGdWxmaWxsZWQsIGludCogY2FsY3VsYXRlUXVhbnQsIGludCBuQ2hhbm5lbHMsCisgICAgUFNZX09VVF9FTEVNRU5UKiBwc3lPdXRFbGVtZW50LCBRQ19PVVQqIHFjT3V0LCBRQ19PVVRfRUxFTUVOVCogcWNPdXRFbGVtZW50LAorICAgIEVMRU1FTlRfQklUUyogZWxCaXRzLCBBVURJT19PQkpFQ1RfVFlQRSBhb3QsIFVJTlQgc3ludGF4RmxhZ3MsCisgICAgU0NIQVIgZXBDb25maWcpOwogCi0KLXZvaWQgIEZES2FhY0VuY19RQ0Nsb3NlIChRQ19TVEFURSAgKipwaFFDc3RhdGUsIFFDX09VVCAqKnBoUUMpOwordm9pZCBGREthYWNFbmNfUUNDbG9zZShRQ19TVEFURSoqIHBoUUNzdGF0ZSwgUUNfT1VUKiogcGhRQyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCkBAIC0xNzMsMjUgKzE4MSwyMiBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UIEZES2FhY0VuY19jYWxjRnJhbWVMZW4oSU5UIGJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCBncmFudWxlTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfTEVOX1JFU1VMVF9NT0RFIG1vZGUpCi17CitzdGF0aWMgSU5UIEZES2FhY0VuY19jYWxjRnJhbWVMZW4oSU5UIGJpdFJhdGUsIElOVCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBncmFudWxlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0xFTl9SRVNVTFRfTU9ERSBtb2RlKSB7CisgIElOVCByZXN1bHQ7CiAKLSAgIElOVCByZXN1bHQ7CisgIHJlc3VsdCA9ICgoZ3JhbnVsZUxlbmd0aCkgPj4gMykgKiAoYml0UmF0ZSk7CiAKLSAgIHJlc3VsdCA9ICgoZ3JhbnVsZUxlbmd0aCk+PjMpKihiaXRSYXRlKTsKLQotICAgc3dpdGNoKG1vZGUpIHsKLSAgICAgY2FzZSBGUkFNRV9MRU5fQllURVNfTU9EVUxPOgotICAgICAgICAgcmVzdWx0ICU9IHNhbXBsZVJhdGU7Ci0gICAgIGJyZWFrOwotICAgICBjYXNlIEZSQU1FX0xFTl9CWVRFU19JTlQ6Ci0gICAgICAgICByZXN1bHQgLz0gc2FtcGxlUmF0ZTsKLSAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4ocmVzdWx0KTsKKyAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBGUkFNRV9MRU5fQllURVNfTU9EVUxPOgorICAgICAgcmVzdWx0ICU9IHNhbXBsZVJhdGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSQU1FX0xFTl9CWVRFU19JTlQ6CisgICAgICByZXN1bHQgLz0gc2FtcGxlUmF0ZTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAocmVzdWx0KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMDMsMzEgKzIwOCwyNSBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UIEZES2FhY0VuY19mcmFtZVBhZGRpbmcoSU5UIGJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCBncmFudWxlTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwYWRkaW5nUmVzdCkKLXsKK3N0YXRpYyBJTlQgRkRLYWFjRW5jX2ZyYW1lUGFkZGluZyhJTlQgYml0UmF0ZSwgSU5UIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGdyYW51bGVMZW5ndGgsIElOVCogcGFkZGluZ1Jlc3QpIHsKICAgSU5UIHBhZGRpbmdPbjsKICAgSU5UIGRpZmZlcmVuY2U7CiAKICAgcGFkZGluZ09uID0gMDsKIAotICBkaWZmZXJlbmNlID0gRkRLYWFjRW5jX2NhbGNGcmFtZUxlbiggYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnVsZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfTEVOX0JZVEVTX01PRFVMTyApOwotICAqcGFkZGluZ1Jlc3QtPWRpZmZlcmVuY2U7CisgIGRpZmZlcmVuY2UgPSBGREthYWNFbmNfY2FsY0ZyYW1lTGVuKGJpdFJhdGUsIHNhbXBsZVJhdGUsIGdyYW51bGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0xFTl9CWVRFU19NT0RVTE8pOworICAqcGFkZGluZ1Jlc3QgLT0gZGlmZmVyZW5jZTsKIAotICBpZiAoKnBhZGRpbmdSZXN0IDw9IDAgKSB7CisgIGlmICgqcGFkZGluZ1Jlc3QgPD0gMCkgewogICAgIHBhZGRpbmdPbiA9IDE7CiAgICAgKnBhZGRpbmdSZXN0ICs9IHNhbXBsZVJhdGU7CiAgIH0KIAotICByZXR1cm4oIHBhZGRpbmdPbiApOworICByZXR1cm4gKHBhZGRpbmdPbik7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19RQ091dE5ldwpAQCAtMjM1LDQ4ICsyMzQsNTAgQEAKICAgICAgICAgIHJldHVybjoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ091dE5ldyhRQ19PVVQgICAgKipwaFFDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG5FbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgblN1YkZyYW1lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFVDSEFSICAgICAgKmR5bmFtaWNfUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNPdXROZXcoUUNfT1VUKiogcGhRQywgY29uc3QgSU5UIG5FbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzLCBjb25zdCBJTlQgblN1YkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiogZHluYW1pY19SQU0pIHsKICAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7CiAgIGludCBuLCBpOwogICBpbnQgZWxJbmMgPSAwLCBjaEluYyA9IDA7CiAKLSAgZm9yIChuPTA7IG48blN1YkZyYW1lczsgbisrKSB7CisgIGZvciAobiA9IDA7IG4gPCBuU3ViRnJhbWVzOyBuKyspIHsKICAgICBwaFFDW25dID0gR2V0UmFtX2FhY0VuY19RQ291dChuKTsKICAgICBpZiAocGhRQ1tuXSA9PSBOVUxMKSB7CiAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOwogICAgICAgZ290byBRQ091dE5ld19iYWlsOwogICAgIH0KIAotICAgIGZvciAoaT0wOyBpPG5DaGFubmVsczsgaSsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IG5DaGFubmVsczsgaSsrKSB7CiAgICAgICBwaFFDW25dLT5wUWNPdXRDaGFubmVsc1tpXSA9IEdldFJhbV9hYWNFbmNfUUNjaGFubmVsKGNoSW5jLCBkeW5hbWljX1JBTSk7Ci0gICAgICBpZiAoIHBoUUNbbl0tPnBRY091dENoYW5uZWxzW2ldID09IE5VTEwKLSAgICAgICAgICkKLSAgICAgIHsKLSAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7Ci0gICAgICAgICBnb3RvIFFDT3V0TmV3X2JhaWw7CisgICAgICBpZiAocGhRQ1tuXS0+cFFjT3V0Q2hhbm5lbHNbaV0gPT0gTlVMTCkgeworICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOworICAgICAgICBnb3RvIFFDT3V0TmV3X2JhaWw7CiAgICAgICB9CisKICAgICAgIGNoSW5jKys7CiAgICAgfSAvKiBuQ2hhbm5lbHMgKi8KIAotICAgIGZvciAoaT0wOyBpPG5FbGVtZW50czsgaSsrKSB7Ci0gICAgICBwaFFDW25dLT5xY0VsZW1lbnRbaV0gICAgICA9IEdldFJhbV9hYWNFbmNfUUNlbGVtZW50KGVsSW5jKTsKLSAgICAgIGlmIChwaFFDW25dLT5xY0VsZW1lbnRbaV0gPT0gTlVMTCkKLSAgICAgIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbkVsZW1lbnRzOyBpKyspIHsKKyAgICAgIHBoUUNbbl0tPnFjRWxlbWVudFtpXSA9IEdldFJhbV9hYWNFbmNfUUNlbGVtZW50KGVsSW5jKTsKKyAgICAgIGlmIChwaFFDW25dLT5xY0VsZW1lbnRbaV0gPT0gTlVMTCkgewogICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19FTkNfTk9fTUVNT1JZOwogICAgICAgICBnb3RvIFFDT3V0TmV3X2JhaWw7CiAgICAgICB9CiAgICAgICBlbEluYysrOworCisgICAgICAvKiBpbml0aWFsaXplIHBvaW50ZXIgdG8gZHluYW1pYyBidWZmZXIgd2hpY2ggYXJlIHVzZWQgaW4gYWRqdXN0CisgICAgICAgKiB0aHJlc2hvbGRzICovCisgICAgICBwaFFDW25dLT5xY0VsZW1lbnRbaV0tPmR5bk1lbV9BaF9GbGFnID0gZHluYW1pY19SQU0gKyAoUF9CVUZfMSk7CisgICAgICBwaFFDW25dLT5xY0VsZW1lbnRbaV0tPmR5bk1lbV9UaHJfRXhwID0KKyAgICAgICAgICBkeW5hbWljX1JBTSArIChQX0JVRl8xKSArIEFESl9USFJfQUhfRkxBR19TSVpFOworICAgICAgcGhRQ1tuXS0+cWNFbGVtZW50W2ldLT5keW5NZW1fU2ZiTkFjdGl2ZUxpbmVzTGREYXRhID0KKyAgICAgICAgICBkeW5hbWljX1JBTSArIChQX0JVRl8xKSArIEFESl9USFJfQUhfRkxBR19TSVpFICsgQURKX1RIUl9USFJfRVhQX1NJWkU7CisKICAgICB9IC8qIG5FbGVtZW50cyAqLwogCiAgIH0gLyogblN1YkZyYW1lcyAqLwogCi0KICAgcmV0dXJuIEFBQ19FTkNfT0s7CiAKIFFDT3V0TmV3X2JhaWw6CkBAIC0yOTAsMjEgKzI5MSwyMCBAQAogICAgICAgICAgcmV0dXJuOgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1FDT3V0SW5pdChRQ19PVVQgICAgICAgICAgKnBoUUNbKDEpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBuU3ViRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSEFOTkVMX01BUFBJTkcgKmNtKQotewotICBJTlQgbixpLGNoOworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1FDT3V0SW5pdChRQ19PVVQqIHBoUUNbKDEpXSwgY29uc3QgSU5UIG5TdWJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENIQU5ORUxfTUFQUElORyogY20pIHsKKyAgSU5UIG4sIGksIGNoOwogCi0gIGZvciAobj0wOyBuPG5TdWJGcmFtZXM7IG4rKykgeworICBmb3IgKG4gPSAwOyBuIDwgblN1YkZyYW1lczsgbisrKSB7CiAgICAgSU5UIGNoSW5jID0gMDsKLSAgICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspIHsKLSAgICAgIGZvciAoY2g9MDsgY2g8Y20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsOyBjaCsrKSB7Ci0gICAgICAgIHBoUUNbbl0tPnFjRWxlbWVudFtpXS0+cWNPdXRDaGFubmVsW2NoXSA9IHBoUUNbbl0tPnBRY091dENoYW5uZWxzW2NoSW5jXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY20tPm5FbGVtZW50czsgaSsrKSB7CisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjbS0+ZWxJbmZvW2ldLm5DaGFubmVsc0luRWw7IGNoKyspIHsKKyAgICAgICAgcGhRQ1tuXS0+cWNFbGVtZW50W2ldLT5xY091dENoYW5uZWxbY2hdID0KKyAgICAgICAgICAgIHBoUUNbbl0tPnBRY091dENoYW5uZWxzW2NoSW5jXTsKICAgICAgICAgY2hJbmMrKzsKICAgICAgIH0gLyogY2hJbkVsICovCi0gICAgfSAvKiBuRWxlbWVudHMgKi8KLSAgfSAvKiBuU3ViRnJhbWVzICovCisgICAgfSAgIC8qIG5FbGVtZW50cyAqLworICB9ICAgICAvKiBuU3ViRnJhbWVzICovCiAKICAgcmV0dXJuIEFBQ19FTkNfT0s7CiB9CkBAIC0zMTYsMTEgKzMxNiw4IEBACiAgICAgICAgICByZXR1cm46CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNOZXcoUUNfU1RBVEUgICoqcGhRQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBuRWxlbWVudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiogICAgICBkeW5hbWljX1JBTQotICAgICAgICAgICApCi17CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNOZXcoUUNfU1RBVEUqKiBwaFFDLCBJTlQgbkVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSKiBkeW5hbWljX1JBTSkgewogICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKICAgaW50IGk7CiAKQEAgLTM0MSw3ICszMzgsNyBAQAogICAgIGdvdG8gUUNOZXdfYmFpbDsKICAgfQogCi0gIGZvciAoaT0wOyBpPG5FbGVtZW50czsgaSsrKSB7CisgIGZvciAoaSA9IDA7IGkgPCBuRWxlbWVudHM7IGkrKykgewogICAgIGhRQy0+ZWxlbWVudEJpdHNbaV0gPSBHZXRSYW1fYWFjRW5jX0VsZW1lbnRCaXRzKGkpOwogICAgIGlmIChoUUMtPmVsZW1lbnRCaXRzW2ldID09IE5VTEwpIHsKICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19OT19NRU1PUlk7CkBAIC0zNjMsNTIgKzM2MCw2MCBAQAogICAgICAgICAgcmV0dXJuOgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1FDSW5pdChRQ19TVEFURSAqaFFDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgUUNfSU5JVCAqaW5pdCkKLXsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ0luaXQoUUNfU1RBVEUqIGhRQywgc3RydWN0IFFDX0lOSVQqIGluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVMT05HIGluaXRGbGFncykgeworICBBQUNfRU5DT0RFUl9FUlJPUiBlcnIgPSBBQUNfRU5DX09LOworCiAgIGludCBpOwogICBoUUMtPm1heEJpdHNQZXJGcmFtZSA9IGluaXQtPm1heEJpdHM7CiAgIGhRQy0+bWluQml0c1BlckZyYW1lID0gaW5pdC0+bWluQml0czsKLSAgaFFDLT5uRWxlbWVudHMgICAgICAgPSBpbml0LT5jaGFubmVsTWFwcGluZy0+bkVsZW1lbnRzOwotICBoUUMtPmJpdFJlc1RvdE1heCAgICA9IGluaXQtPmJpdFJlczsKLSAgaFFDLT5iaXRSZXNUb3QgICAgICAgPSBpbml0LT5iaXRSZXM7Ci0gIGhRQy0+bWF4Qml0RmFjICAgICAgID0gaW5pdC0+bWF4Qml0RmFjOwotICBoUUMtPmJpdHJhdGVNb2RlICAgICA9IGluaXQtPmJpdHJhdGVNb2RlOwotICBoUUMtPmludlF1YW50ICAgICAgICA9IGluaXQtPmludlF1YW50OwotICBoUUMtPm1heEl0ZXJhdGlvbnMgICA9IGluaXQtPm1heEl0ZXJhdGlvbnM7Ci0KLSAgaWYgKCBpc0NvbnN0YW50Qml0cmF0ZU1vZGUoaFFDLT5iaXRyYXRlTW9kZSkgKSB7Ci0gICAgSU5UIGJpdHJlc1BlckNoYW5uZWwgPSAoaFFDLT5iaXRSZXNUb3RNYXggLyBpbml0LT5jaGFubmVsTWFwcGluZy0+bkNoYW5uZWxzRWZmKTsKLSAgICAvKiAwOiBmdWxsIGJpdHJlc2Vydm9pciwgMTogcmVkdWNlZCBiaXRyZXNlcnZvaXIsIDI6IGRpc2FibGVkIGJpdHJlc2Vydm9pciAqLwotICAgIGhRQy0+Yml0RGlzdHJpYnV0aW9uTW9kZSA9IChiaXRyZXNQZXJDaGFubmVsPkJJVFJFU19NSU5fTEQpID8gMCA6IChiaXRyZXNQZXJDaGFubmVsPjApID8gMSA6IDI7CisgIGhRQy0+bkVsZW1lbnRzID0gaW5pdC0+Y2hhbm5lbE1hcHBpbmctPm5FbGVtZW50czsKKyAgaWYgKChpbml0RmxhZ3MgIT0gMCkgfHwgKChpbml0LT5iaXRyYXRlTW9kZSAhPSBRQ0RBVEFfQlJfTU9ERV9GRikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChoUUMtPmJpdFJlc1RvdE1heCAhPSBpbml0LT5iaXRSZXMpKSkgeworICAgIGhRQy0+Yml0UmVzVG90ID0gaW5pdC0+Yml0UmVzOwogICB9Ci0gIGVsc2UgewotICAgIGhRQy0+Yml0RGlzdHJpYnV0aW9uTW9kZSA9IDA7IC8qIGZ1bGwgYml0cmVzZXJ2b2lyICovCi0gIH0KKyAgaFFDLT5iaXRSZXNUb3RNYXggPSBpbml0LT5iaXRSZXM7CisgIGhRQy0+bWF4Qml0RmFjID0gaW5pdC0+bWF4Qml0RmFjOworICBoUUMtPmJpdHJhdGVNb2RlID0gaW5pdC0+Yml0cmF0ZU1vZGU7CisgIGhRQy0+aW52UXVhbnQgPSBpbml0LT5pbnZRdWFudDsKKyAgaFFDLT5tYXhJdGVyYXRpb25zID0gaW5pdC0+bWF4SXRlcmF0aW9uczsKIAorICBpZiAoaXNDb25zdGFudEJpdHJhdGVNb2RlKGhRQy0+Yml0cmF0ZU1vZGUpKSB7CisgICAgLyogMDogZnVsbCBiaXRyZXNlcnZvaXIsIDE6IHJlZHVjZWQgYml0cmVzZXJ2b2lyLCAyOiBkaXNhYmxlZCBiaXRyZXNlcnZvaXIKKyAgICAgKi8KKyAgICBoUUMtPmJpdFJlc01vZGUgPSBpbml0LT5iaXRSZXNNb2RlOworICB9IGVsc2UgeworICAgIGhRQy0+Yml0UmVzTW9kZSA9IEFBQ0VOQ19CUl9NT0RFX0ZVTEw7IC8qIGZ1bGwgYml0cmVzZXJ2b2lyICovCisgIH0KIAogICBoUUMtPnBhZGRpbmcucGFkZGluZ1Jlc3QgPSBpbml0LT5wYWRkaW5nLnBhZGRpbmdSZXN0OwogCiAgIGhRQy0+Z2xvYkhkckJpdHMgPSBpbml0LT5zdGF0aWNCaXRzOyAvKiBCaXQgb3ZlcmhlYWQgZHVlIHRvIHRyYW5zcG9ydCAqLwogCi0gIEZES2FhY0VuY19Jbml0RWxlbWVudEJpdHMoaFFDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQtPmNoYW5uZWxNYXBwaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQtPmJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluaXQtPmF2ZXJhZ2VCaXRzL2luaXQtPm5TdWJGcmFtZXMpIC0gaFFDLT5nbG9iSGRyQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPm1heEJpdHNQZXJGcmFtZS9pbml0LT5jaGFubmVsTWFwcGluZy0+bkNoYW5uZWxzRWZmKTsKKyAgZXJyID0gRkRLYWFjRW5jX0luaXRFbGVtZW50Qml0cygKKyAgICAgIGhRQywgaW5pdC0+Y2hhbm5lbE1hcHBpbmcsIGluaXQtPmJpdHJhdGUsCisgICAgICAoaW5pdC0+YXZlcmFnZUJpdHMgLyBpbml0LT5uU3ViRnJhbWVzKSAtIGhRQy0+Z2xvYkhkckJpdHMsCisgICAgICBoUUMtPm1heEJpdHNQZXJGcmFtZSAvIGluaXQtPmNoYW5uZWxNYXBwaW5nLT5uQ2hhbm5lbHNFZmYpOworICBpZiAoZXJyICE9IEFBQ19FTkNfT0spIGdvdG8gYmFpbDsKIAogICBoUUMtPnZiclF1YWxGYWN0b3IgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwotICBmb3IgKGk9MDsgaTwoaW50KShzaXplb2YodGFibGVWYnJRdWFsRmFjdG9yKS9zaXplb2YoVEFCX1ZCUl9RVUFMX0ZBQ1RPUikpOyBpKyspIHsKLSAgICBpZiAoaFFDLT5iaXRyYXRlTW9kZT09dGFibGVWYnJRdWFsRmFjdG9yW2ldLmJpdHJhdGVNb2RlKSB7CisgIGZvciAoaSA9IDA7CisgICAgICAgaSA8IChpbnQpKHNpemVvZih0YWJsZVZiclF1YWxGYWN0b3IpIC8gc2l6ZW9mKFRBQl9WQlJfUVVBTF9GQUNUT1IpKTsKKyAgICAgICBpKyspIHsKKyAgICBpZiAoaFFDLT5iaXRyYXRlTW9kZSA9PSB0YWJsZVZiclF1YWxGYWN0b3JbaV0uYml0cmF0ZU1vZGUpIHsKICAgICAgIGhRQy0+dmJyUXVhbEZhY3RvciA9IChGSVhQX0RCTCl0YWJsZVZiclF1YWxGYWN0b3JbaV0udmJyUXVhbEZhY3RvcjsKICAgICAgIGJyZWFrOwogICAgIH0KICAgfQogCiAgIGlmIChpbml0LT5jaGFubmVsTWFwcGluZy0+bkNoYW5uZWxzRWZmID09IDEgJiYKLSAgICAgKGluaXQtPmJpdHJhdGUgLyBpbml0LT5jaGFubmVsTWFwcGluZy0+bkNoYW5uZWxzRWZmKSA8IDMyMDAwICYmCi0gICAgIGluaXQtPmFkdmFuY2VkQml0c1RvUGUgIT0gMAotICAgICApCisgICAgICAoaW5pdC0+Yml0cmF0ZSAvIGluaXQtPmNoYW5uZWxNYXBwaW5nLT5uQ2hhbm5lbHNFZmYpIDwKKyAgICAgICAgICBBQUNFTkNfRFpRX0JSX1RIUiAmJgorICAgICAgaW5pdC0+aXNMb3dEZWxheSAhPQorICAgICAgICAgIDApIC8qIHdhdGNoIG91dCBoZXJlOiBpbml0LT5iaXRyYXRlIGlzIHRoZSBiaXRyYXRlICJtaW51cyIgdGhlCisgICAgICAgICAgICAgICAgc3RhbmRhcmQgU0JSIGJpdHJhdGUgKD0yNTAwa2JwcykgLS0+IGZvciB0aGUgRkRLIHRoZSBPRkZTVEUKKyAgICAgICAgICAgICAgICB0dW5pbmcgc2hvdWxkIHN0YXJ0IHNvbWV3aGVyZSBiZWxvdyAzMjAwMGticHMtMjUwMGticHMgLi4uIHNvCisgICAgICAgICAgICAgICAgZXZlcnl0aGluZyBpcyBmaW5lIGhlcmUgKi8KICAgewogICAgIGhRQy0+ZFpvbmVRdWFudEVuYWJsZSA9IDE7CiAgIH0gZWxzZSB7CkBAIC00MTYsMjMgKzQyMSwyMCBAQAogICB9CiAKICAgRkRLYWFjRW5jX0FkalRockluaXQoCi0gICAgICAgIGhRQy0+aEFkalRociwKLSAgICAgICAgaW5pdC0+bWVhblBlLAotICAgICAgICBoUUMtPmVsZW1lbnRCaXRzLCAgICAgICAgICAgICAgICAgLyogb3IgY2hhbm5lbEJpdHJhdGVzLCB3YXM6IGNoYW5uZWxCaXRyYXRlICovCi0gICAgICAgIGhRQy0+aW52UXVhbnQsCi0gICAgICAgIGluaXQtPmNoYW5uZWxNYXBwaW5nLT5uRWxlbWVudHMsCi0gICAgICAgIGluaXQtPmNoYW5uZWxNYXBwaW5nLT5uQ2hhbm5lbHNFZmYsCi0gICAgICAgIGluaXQtPnNhbXBsZVJhdGUsICAgICAgICAgICAgICAgICAvKiBvdXRwdXQgc2FtcGxlIHJhdGUgKi8KLSAgICAgICAgaW5pdC0+YWR2YW5jZWRCaXRzVG9QZSwgICAgICAgICAgIC8qIGlmIHNldCwgY2FsYyBiaXRzMlBFIGZhY3RvciBkZXBlbmRpbmcgb24gc2FtcGxlcmF0ZSAqLwotICAgICAgICBoUUMtPnZiclF1YWxGYWN0b3IsCi0gICAgICAgIGhRQy0+ZFpvbmVRdWFudEVuYWJsZQotICAgICAgICApOworICAgICAgaFFDLT5oQWRqVGhyLCBpbml0LT5tZWFuUGUsIGhRQy0+aW52UXVhbnQsIGluaXQtPmNoYW5uZWxNYXBwaW5nLAorICAgICAgaW5pdC0+c2FtcGxlUmF0ZSwgLyogb3V0cHV0IHNhbXBsZSByYXRlICovCisgICAgICBpbml0LT5iaXRyYXRlLCAgICAvKiB0b3RhbCBiaXRyYXRlICovCisgICAgICBpbml0LT5pc0xvd0RlbGF5LCAvKiBpZiBzZXQsIGNhbGMgYml0czJQRSBmYWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGluZyBvbiBzYW1wbGVyYXRlICovCisgICAgICBpbml0LT5iaXRSZXNNb2RlICAvKiBmb3IgYSBzbWFsbCBiaXRyZXNlcnZvaXIsIHRoZSBwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdGlvbiBpcyBjYWxjJ2QgZGlmZmVyZW50bHkgKi8KKyAgICAgICwKKyAgICAgIGhRQy0+ZFpvbmVRdWFudEVuYWJsZSwgaW5pdC0+Yml0RGlzdHJpYnV0aW9uTW9kZSwgaFFDLT52YnJRdWFsRmFjdG9yKTsKIAotICByZXR1cm4gQUFDX0VOQ19PSzsKK2JhaWw6CisgIHJldHVybiBlcnI7CiB9CiAKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICAgICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX1FDTWFpblByZXBhcmUKQEAgLTQ0MCwzMyArNDQyLDI4IEBACiAgICAgICAgICByZXR1cm46CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNNYWluUHJlcGFyZShFTEVNRU5UX0lORk8gICAgICAgICAgICAgICplbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNfRUxFTUVOVCogUkVTVFJJQ1QgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqIFJFU1RSSUNUICBwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqIFJFU1RSSUNUICAgcWNPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgICAgICAgICAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNNYWluUHJlcGFyZSgKKyAgICBFTEVNRU5UX0lORk8qIGVsSW5mbywgQVRTX0VMRU1FTlQqIFJFU1RSSUNUIGFkalRoclN0YXRlRWxlbWVudCwKKyAgICBQU1lfT1VUX0VMRU1FTlQqIFJFU1RSSUNUIHBzeU91dEVsZW1lbnQsCisgICAgUUNfT1VUX0VMRU1FTlQqIFJFU1RSSUNUIHFjT3V0RWxlbWVudCwgQVVESU9fT0JKRUNUX1RZUEUgYW90LAorICAgIFVJTlQgc3ludGF4RmxhZ3MsIFNDSEFSIGVwQ29uZmlnKSB7CiAgIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzID0gQUFDX0VOQ19PSzsKLSAgSU5UICBuQ2hhbm5lbHMgPSBlbEluZm8tPm5DaGFubmVsc0luRWw7CisgIElOVCBuQ2hhbm5lbHMgPSBlbEluZm8tPm5DaGFubmVsc0luRWw7CiAKLSAgUFNZX09VVF9DSEFOTkVMKiogUkVTVFJJQ1QgcHN5T3V0Q2hhbm5lbCA9IHBzeU91dEVsZW1lbnQtPnBzeU91dENoYW5uZWw7ICAgIC8qIG1heSBiZSBtb2RpZmllZCBpbi1wbGFjZSAqLworICBQU1lfT1VUX0NIQU5ORUwqKiBSRVNUUklDVCBwc3lPdXRDaGFubmVsID0KKyAgICAgIHBzeU91dEVsZW1lbnQtPnBzeU91dENoYW5uZWw7IC8qIG1heSBiZSBtb2RpZmllZCBpbi1wbGFjZSAqLwogCi0gIEZES2FhY0VuY19DYWxjRm9ybUZhY3RvcihxY091dEVsZW1lbnQtPnFjT3V0Q2hhbm5lbCwgcHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKKyAgRkRLYWFjRW5jX0NhbGNGb3JtRmFjdG9yKHFjT3V0RWxlbWVudC0+cWNPdXRDaGFubmVsLCBwc3lPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzKTsKIAogICAvKiBwcmVwYXJlIGFuZCBjYWxjdWxhdGUgUEUgd2l0aG91dCByZWR1Y3Rpb24gKi8KLSAgRkRLYWFjRW5jX3BlQ2FsY3VsYXRpb24oJnFjT3V0RWxlbWVudC0+cGVEYXRhLCBwc3lPdXRDaGFubmVsLCBxY091dEVsZW1lbnQtPnFjT3V0Q2hhbm5lbCwgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mbywgYWRqVGhyU3RhdGVFbGVtZW50LCBuQ2hhbm5lbHMpOworICBGREthYWNFbmNfcGVDYWxjdWxhdGlvbigmcWNPdXRFbGVtZW50LT5wZURhdGEsIHBzeU91dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0RWxlbWVudC0+cWNPdXRDaGFubmVsLCAmcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQsIG5DaGFubmVscyk7CiAKLSAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfQ2hhbm5lbEVsZW1lbnRXcml0ZSggTlVMTCwgZWxJbmZvLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT5wc3lPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNPdXRFbGVtZW50LT5zdGF0aWNCaXRzVXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCApOworICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19DaGFubmVsRWxlbWVudFdyaXRlKAorICAgICAgTlVMTCwgZWxJbmZvLCBOVUxMLCBwc3lPdXRFbGVtZW50LCBwc3lPdXRFbGVtZW50LT5wc3lPdXRDaGFubmVsLAorICAgICAgc3ludGF4RmxhZ3MsIGFvdCwgZXBDb25maWcsICZxY091dEVsZW1lbnQtPnN0YXRpY0JpdHNVc2VkLCAwKTsKIAogICByZXR1cm4gRXJyb3JTdGF0dXM7CiB9CkBAIC00NzQsNTcgKzQ3MSw5MCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19BZGp1c3RCaXRyYXRlCi0gICAgICAgICBkZXNjcmlwdGlvbjogIGFkanVzdHMgZnJhbWVsZW5ndGggdmlhIHBhZGRpbmcgb24gYSBmcmFtZSB0byBmcmFtZSBiYXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgdG8gYWNoaWV2ZSBhIGJpdHJhdGUgdGhhdCBkZW1hbmRzIGEgbm9uIGJ5dGUgYWxpZ25lZAotICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWxlbmd0aAotICAgICAgICAgcmV0dXJuOiAgICAgICBlcnJvcmNvZGUKKyAgICAgICAgIGRlc2NyaXB0aW9uOiAgYWRqdXN0cyBmcmFtZWxlbmd0aCB2aWEgcGFkZGluZyBvbiBhIGZyYW1lIHRvIGZyYW1lCitiYXNpcywgdG8gYWNoaWV2ZSBhIGJpdHJhdGUgdGhhdCBkZW1hbmRzIGEgbm9uIGJ5dGUgYWxpZ25lZCBmcmFtZWxlbmd0aCByZXR1cm46CitlcnJvcmNvZGUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19BZGp1c3RCaXRyYXRlKFFDX1NUQVRFICAgICAgICAqUkVTVFJJQ1QgaFFDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HICpSRVNUUklDVCBjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAqYXZnVG90YWxCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICBiaXRSYXRlLCAgICAgICAvKiB0b3RhbCBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgIHNhbXBsZVJhdGUsICAgIC8qIG91dHB1dCBzYW1wbGluZyByYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgIGdyYW51bGVMZW5ndGgpIC8qIGZyYW1lIGxlbmd0aCAqLworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0FkanVzdEJpdHJhdGUoCisgICAgUUNfU1RBVEUqIFJFU1RSSUNUIGhRQywgQ0hBTk5FTF9NQVBQSU5HKiBSRVNUUklDVCBjbSwgSU5UKiBhdmdUb3RhbEJpdHMsCisgICAgSU5UIGJpdFJhdGUsICAgICAgIC8qIHRvdGFsIGJpdHJhdGUgKi8KKyAgICBJTlQgc2FtcGxlUmF0ZSwgICAgLyogb3V0cHV0IHNhbXBsaW5nIHJhdGUgKi8KKyAgICBJTlQgZ3JhbnVsZUxlbmd0aCkgLyogZnJhbWUgbGVuZ3RoICovCiB7CiAgIElOVCBwYWRkaW5nT247CiAgIElOVCBmcmFtZUxlbjsKIAogICAvKiBEbyB3ZSBuZWVkIGFuIGV4dHJhIHBhZGRpbmcgYnl0ZT8gKi8KLSAgcGFkZGluZ09uID0gRkRLYWFjRW5jX2ZyYW1lUGFkZGluZyhiaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW51bGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZoUUMtPnBhZGRpbmcucGFkZGluZ1Jlc3QpOworICBwYWRkaW5nT24gPSBGREthYWNFbmNfZnJhbWVQYWRkaW5nKGJpdFJhdGUsIHNhbXBsZVJhdGUsIGdyYW51bGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhRQy0+cGFkZGluZy5wYWRkaW5nUmVzdCk7CiAKLSAgZnJhbWVMZW4gPSBwYWRkaW5nT24gKyBGREthYWNFbmNfY2FsY0ZyYW1lTGVuKGJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW51bGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0xFTl9CWVRFU19JTlQpOworICBmcmFtZUxlbiA9CisgICAgICBwYWRkaW5nT24gKyBGREthYWNFbmNfY2FsY0ZyYW1lTGVuKGJpdFJhdGUsIHNhbXBsZVJhdGUsIGdyYW51bGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0xFTl9CWVRFU19JTlQpOwogCi0gICphdmdUb3RhbEJpdHMgPSBmcmFtZUxlbjw8MzsKKyAgKmF2Z1RvdGFsQml0cyA9IGZyYW1lTGVuIDw8IDM7CiAKICAgcmV0dXJuIEFBQ19FTkNfT0s7CiB9CiAKLXN0YXRpYyBBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfZGlzdHJpYnV0ZUVsZW1lbnREeW5CaXRzKFFDX1NUQVRFKiAgICAgICAgIGhRQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqICAgcWNFbGVtZW50Wyg4KV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyogIGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICBjb2RlQml0cykKLXsKKyNkZWZpbmUgaXNBdWRpb0VsZW1lbnQoZWxUeXBlKSBcCisgICgoZWxUeXBlID09IElEX1NDRSkgfHwgKGVsVHlwZSA9PSBJRF9DUEUpIHx8IChlbFR5cGUgPT0gSURfTEZFKSkKIAotICBJTlQgaSwgZmlyc3RFbCA9IGNtLT5uRWxlbWVudHMtMTsKLSAgSU5UIHRvdGFsQml0cyA9IDA7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgZm9yIChpPShjbS0+bkVsZW1lbnRzLTEpOyBpPj0wOyBpLS0pIHsKLSAgICBpZiAoKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX1NDRSkgfHwgKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX0NQRSkgfHwKLSAgICAgICAgKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX0xGRSkpCi0gICAgewotICAgICAgcWNFbGVtZW50W2ldLT5ncmFudGVkRHluQml0cyA9ICAoSU5UKWZNdWx0KGhRQy0+ZWxlbWVudEJpdHNbaV0tPnJlbGF0aXZlQml0c0VsLCAoRklYUF9EQkwpY29kZUJpdHMpOworICAgICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfZGlzdHJpYnV0ZUVsZW1lbnREeW5CaXRzCisgICAgICAgICBkZXNjcmlwdGlvbjogIGRpc3RyaWJ1dGVzIGFsbCBiaXRzIG92ZXIgYWxsIGVsZW1lbnRzLiBUaGUgcmVsYXRpdmUgYml0CisgICAgICAgICAgICAgICAgICAgICAgIGRpc3RpYnV0aW9uIGlzIGRlc2NyaWJlZCBpbiB0aGUgRUxFTUVOVF9JTkZPIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBlbGVtZW50LiBUaGUgYml0IGRpc3RyaWJ1dGlvbiB0YWJsZSBpcworICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZCBpbiBGREthYWNFbmNfSW5pdENoYW5uZWxNYXBwaW5nKCkuCisgICAgICAgICByZXR1cm46ICAgICAgIGVycm9yY29kZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19kaXN0cmlidXRlRWxlbWVudER5bkJpdHMoCisgICAgUUNfU1RBVEUqIGhRQywgUUNfT1VUX0VMRU1FTlQqIHFjRWxlbWVudFsoKDgpKV0sIENIQU5ORUxfTUFQUElORyogY20sCisgICAgSU5UIGNvZGVCaXRzKSB7CisgIElOVCBpOyAgICAgICAgICAgICAvKiBjb3VudGVyIHZhcmlhYmxlICovCisgIElOVCB0b3RhbEJpdHMgPSAwOyAvKiBzdW0gb2YgYml0cyBvdmVyIGFsbCBlbGVtZW50cyAqLworCisgIGZvciAoaSA9IChjbS0+bkVsZW1lbnRzIC0gMSk7IGkgPj0gMDsgaS0tKSB7CisgICAgaWYgKGlzQXVkaW9FbGVtZW50KGNtLT5lbEluZm9baV0uZWxUeXBlKSkgeworICAgICAgcWNFbGVtZW50W2ldLT5ncmFudGVkRHluQml0cyA9CisgICAgICAgICAgZk1heCgwLCBmTXVsdEkoaFFDLT5lbGVtZW50Qml0c1tpXS0+cmVsYXRpdmVCaXRzRWwsIGNvZGVCaXRzKSk7CiAgICAgICB0b3RhbEJpdHMgKz0gcWNFbGVtZW50W2ldLT5ncmFudGVkRHluQml0czsKLSAgICAgIGZpcnN0RWwgPSBpOwogICAgIH0KICAgfQotICBxY0VsZW1lbnRbZmlyc3RFbF0tPmdyYW50ZWREeW5CaXRzICs9IGNvZGVCaXRzIC0gdG90YWxCaXRzOworCisgIC8qIER1ZSB0byBpbmFjY3VyYWNpZXMgd2l0aCB0aGUgbXVsdGlwbGljYXRpb24sIGNvZGVCaXRzIG1heSBkaWZmZXIgZnJvbQorICAgICB0b3RhbEJpdHMuIEZvciB0aGF0IGNhc2UsIHRoZSBkaWZmZXJlbmNlIG11c3QgYmUgYWRkZWQvc3Vic3RyYWN0ZWQgYWdhaW4KKyAgICAgdG8vZnJvbSBvbmUgZWxlbWVudCwgaS5lOgorICAgICBOZWdhdGl2ZSBkaWZmZXJlbmNlcyBhcmUgc3Vic3RyYWN0ZWQgZnJvbSB0aGUgZWxlbWVudCB3aXRoIHRoZSBtb3N0IGJpdHMuCisgICAgIFBvc2l0aXZlIGRpZmZlcmVuY2VzIGFyZSBhZGRlZCB0byB0aGUgZWxlbWVudCB3aXRoIHRoZSBsZWFzdCBiaXRzLgorICAqLworICBpZiAoY29kZUJpdHMgIT0gdG90YWxCaXRzKSB7CisgICAgSU5UIGVsTWF4Qml0cyA9IGNtLT5uRWxlbWVudHMgLSAxOyAvKiBlbGVtZW50IHdpdGggdGhlIG1vc3QgYml0cyAqLworICAgIElOVCBlbE1pbkJpdHMgPSBjbS0+bkVsZW1lbnRzIC0gMTsgLyogZWxlbWVudCB3aXRoIHRoZSBsZWFzdCBiaXRzICovCisKKyAgICAvKiBTZWFyY2ggZm9yIGJpZ2dlc3QgYW5kIHNtYWxsZXN0IGF1ZGlvIGVsZW1lbnQgKi8KKyAgICBmb3IgKGkgPSAoY20tPm5FbGVtZW50cyAtIDEpOyBpID49IDA7IGktLSkgeworICAgICAgaWYgKGlzQXVkaW9FbGVtZW50KGNtLT5lbEluZm9baV0uZWxUeXBlKSkgeworICAgICAgICBpZiAocWNFbGVtZW50W2ldLT5ncmFudGVkRHluQml0cyA+CisgICAgICAgICAgICBxY0VsZW1lbnRbZWxNYXhCaXRzXS0+Z3JhbnRlZER5bkJpdHMpIHsKKyAgICAgICAgICBlbE1heEJpdHMgPSBpOworICAgICAgICB9CisgICAgICAgIGlmIChxY0VsZW1lbnRbaV0tPmdyYW50ZWREeW5CaXRzIDwKKyAgICAgICAgICAgIHFjRWxlbWVudFtlbE1pbkJpdHNdLT5ncmFudGVkRHluQml0cykgeworICAgICAgICAgIGVsTWluQml0cyA9IGk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLyogQ29tcGVuc2F0ZSBmb3IgYml0IGRpc3RpYnV0aW9uIGRpZmZlcmVuY2UgKi8KKyAgICBpZiAoY29kZUJpdHMgLSB0b3RhbEJpdHMgPiAwKSB7CisgICAgICBxY0VsZW1lbnRbZWxNaW5CaXRzXS0+Z3JhbnRlZER5bkJpdHMgKz0gY29kZUJpdHMgLSB0b3RhbEJpdHM7CisgICAgfSBlbHNlIHsKKyAgICAgIHFjRWxlbWVudFtlbE1heEJpdHNdLT5ncmFudGVkRHluQml0cyArPSBjb2RlQml0cyAtIHRvdGFsQml0czsKKyAgICB9CisgIH0KIAogICByZXR1cm4gQUFDX0VOQ19PSzsKIH0KQEAgLTUzMiwxMiArNTYyLDEzIEBACiAvKioKICAqIFxicmllZiAgVmVyaWZ5IHdoZXRoZXIgbWluQml0c1BlckZyYW1lIGNyaXRlcmlvbiBjYW4gYmUgc2F0aXNmaWVkLgogICoKLSAqIFRoaXMgZnVuY3Rpb24gZXZhbHVhdGVzIHRoZSBiaXQgY29uc3VtcHRpb24gb25seSBpZiBtaW5CaXRzUGVyRnJhbWUgcGFyYW1ldGVyIGlzIG5vdCAwLgotICogSW4gaHlwZXJmcmFtaW5nIG1vZGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBncmFudGVkRHluQml0cyBhbmQgdXNlZER5bkJpdHMgb2YgYWxsIHN1YiBmcmFtZXMKLSAqIHJlc3VsdHMgdGhlIG51bWJlciBvZiBmaWxsYml0cyB0byBiZSB3cml0dGVuLgotICogVGhpcyBiaXRzIGNhbiBiZSBkaXN0cnViaXR1ZWQgaW4gc3VwZXJmcmFtZSB0byByZWFjaCBtaW5CaXRzUGVyRnJhbWUgYml0IGNvbnN1bXB0aW9uIGluIHNpbmdsZSBBVSdzLgotICogVGhlIHJldHVybiB2YWx1ZSBkZW5vdGVzIGlmIGVub3VnaCBkZXNpcmVkIGZpbGwgYml0cyBhcmUgYXZhaWxhYmxlIHRvIGFjaGlldmUgbWluQml0c1BlckZyYW1lIGluIGFsbCBmcmFtZXMuCi0gKiBUaGlzIGNoZWNrIGNhbiBvbmx5IGJlIHVzZWQgd2l0aGluIHN1cGVyZnJhbWVzLgorICogVGhpcyBmdW5jdGlvbiBldmFsdWF0ZXMgdGhlIGJpdCBjb25zdW1wdGlvbiBvbmx5IGlmIG1pbkJpdHNQZXJGcmFtZSBwYXJhbWV0ZXIKKyAqIGlzIG5vdCAwLiBJbiBoeXBlcmZyYW1pbmcgbW9kZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGdyYW50ZWREeW5CaXRzIGFuZAorICogdXNlZER5bkJpdHMgb2YgYWxsIHN1YiBmcmFtZXMgcmVzdWx0cyB0aGUgbnVtYmVyIG9mIGZpbGxiaXRzIHRvIGJlIHdyaXR0ZW4uCisgKiBUaGlzIGJpdHMgY2FuIGJlIGRpc3RydWJpdHVlZCBpbiBzdXBlcmZyYW1lIHRvIHJlYWNoIG1pbkJpdHNQZXJGcmFtZSBiaXQKKyAqIGNvbnN1bXB0aW9uIGluIHNpbmdsZSBBVSdzLiBUaGUgcmV0dXJuIHZhbHVlIGRlbm90ZXMgaWYgZW5vdWdoIGRlc2lyZWQgZmlsbAorICogYml0cyBhcmUgYXZhaWxhYmxlIHRvIGFjaGlldmUgbWluQml0c1BlckZyYW1lIGluIGFsbCBmcmFtZXMuIFRoaXMgY2hlY2sgY2FuCisgKiBvbmx5IGJlIHVzZWQgd2l0aGluIHN1cGVyZnJhbWVzLgogICoKICAqIFxwYXJhbSBxY091dCAgICAgICAgICAgIFBvaW50ZXIgdG8gY29kaW5nIGRhdGEgc3RydWN0LgogICogXHBhcmFtIG1pbkJpdHNQZXJGcmFtZSAgTWluaW1hbCBudW1iZXIgb2YgYml0cyB0byBiZSBjb25zdW1lZCBpbiBlYWNoIGZyYW1lLgpAQCAtNTQ3LDEyICs1NzgsOCBAQAogICogICAgICAgICAgLSAxOiBhbGwgZmluZQogICogICAgICAgICAgLSAwOiBjcml0ZXJpb24gbm90IGZ1bGZpbGxlZAogICovCi1zdGF0aWMgaW50IGNoZWNrTWluRnJhbWVCaXRzRGVtYW5kKAotICAgICAgICBRQ19PVVQqKiAgICAgICAgICAgICAgICAgIHFjT3V0LAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIG1pbkJpdHNQZXJGcmFtZSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBuU3ViRnJhbWVzCi0gICAgICAgICkKLXsKK3N0YXRpYyBpbnQgY2hlY2tNaW5GcmFtZUJpdHNEZW1hbmQoUUNfT1VUKiogcWNPdXQsIGNvbnN0IElOVCBtaW5CaXRzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuU3ViRnJhbWVzKSB7CiAgIGludCByZXN1bHQgPSAxOyAvKiBhbGwgZmluZSovCiAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC01NjgsMzMgKzU5NSwyNiBAQAogICAgICAgICAgcmV0dXJuOiAgICAgICBudW1iZXIgb2Ygc3RhdGljIGJpdHMKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgRkRLYWFjRW5jX2dldE1pbmltYWxTdGF0aWNCaXRkZW1hbmQoQ0hBTk5FTF9NQVBQSU5HKiAgICAgY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQqKiAgICAgICAgICAgIHBzeU91dCkKLXsKK3N0YXRpYyBpbnQgRkRLYWFjRW5jX2dldE1pbmltYWxTdGF0aWNCaXRkZW1hbmQoQ0hBTk5FTF9NQVBQSU5HKiBjbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVCoqIHBzeU91dCkgewogICBBVURJT19PQkpFQ1RfVFlQRSBhb3QgPSBBT1RfQUFDX0xDOwotICBVSU5UICBzeW50YXhGbGFncyA9IDA7CisgIFVJTlQgc3ludGF4RmxhZ3MgPSAwOwogICBTQ0hBUiBlcENvbmZpZyA9IC0xOwogICBpbnQgaSwgYml0Y291bnQgPSAwOwogCi0gIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykgewotICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07CisgIGZvciAoaSA9IDA7IGkgPCBjbS0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKIAotICAgICAgaWYgKCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpCi0gICAgICAgIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkKLSAgICAgICAgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSApCi0gICAgICB7Ci0gICAgICAgIElOVCBtaW5FbEJpdHMgPSAwOworICAgIGlmICgoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkgfHwKKyAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkgeworICAgICAgSU5UIG1pbkVsQml0cyA9IDA7CiAKLSAgICAgICAgRkRLYWFjRW5jX0NoYW5uZWxFbGVtZW50V3JpdGUoIE5VTEwsICZlbEluZm8sIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRbMF0tPnBzeU91dEVsZW1lbnRbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRbMF0tPnBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluRWxCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSApOwotICAgICAgICBiaXRjb3VudCArPSBtaW5FbEJpdHM7Ci0gICAgICB9CisgICAgICBGREthYWNFbmNfQ2hhbm5lbEVsZW1lbnRXcml0ZShOVUxMLCAmZWxJbmZvLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0WzBdLT5wc3lPdXRFbGVtZW50W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0WzBdLT5wc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsIGFvdCwgZXBDb25maWcsICZtaW5FbEJpdHMsIDEpOworICAgICAgYml0Y291bnQgKz0gbWluRWxCaXRzOworICAgIH0KICAgfQogCiAgIHJldHVybiBiaXRjb3VudDsKQEAgLTYwMiwyMDEgKzYyMiwxODQgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19wcmVwYXJlQml0RGlzdHJpYnV0aW9uKFFDX1NUQVRFKiAgICAgICAgICAgIGhRQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQqKiAgICAgICAgICAgIHBzeU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCoqICAgICAgICAgICAgIHFjT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HKiAgICAgY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogICAgICBxY0VsZW1lbnRbKDEpXVsoOCldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgYXZnVG90YWxCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqdG90YWxBdmFpbGFibGVCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqYXZnVG90YWxEeW5CaXRzKQotewotICAgIGludCBpOwotICAgICAgLyogZ2V0IG1heGltYWwgYWxsb3dlZCBkeW5hbWljIGJpdHMgKi8KLSAgICAgIHFjT3V0WzBdLT5ncmFudGVkRHluQml0cyA9ICAoZml4TWluKGhRQy0+bWF4Qml0c1BlckZyYW1lLCBhdmdUb3RhbEJpdHMpIC0gaFFDLT5nbG9iSGRyQml0cykmfjc7Ci0gICAgICBxY091dFswXS0+Z3JhbnRlZER5bkJpdHMgLT0gKHFjT3V0WzBdLT5nbG9iYWxFeHRCaXRzICsgcWNPdXRbMF0tPnN0YXRpY0JpdHMgKyBxY091dFswXS0+ZWxlbWVudEV4dEJpdHMpOwotICAgICAgcWNPdXRbMF0tPm1heER5bkJpdHMgPSAoKGhRQy0+bWF4Qml0c1BlckZyYW1lKSZ+NykgLSAocWNPdXRbMF0tPmdsb2JhbEV4dEJpdHMgKyBxY091dFswXS0+c3RhdGljQml0cyArIHFjT3V0WzBdLT5lbGVtZW50RXh0Qml0cyk7Ci0gICAgICAvKiBhc3N1cmUgdGhhdCBlbm91Z2ggYml0cyBhcmUgYXZhaWxhYmxlICovCi0gICAgICBpZiAoKHFjT3V0WzBdLT5ncmFudGVkRHluQml0cytoUUMtPmJpdFJlc1RvdCkgPCAwKSB7Ci0gICAgICAgIC8qIGNyYXNoIHJlY292ZXJ5IGFsbG93cyB0byByZWR1Y2Ugc3RhdGljIGJpdHMgdG8gYSBtaW5pbXVtICovCi0gICAgICAgIGlmICggKHFjT3V0WzBdLT5ncmFudGVkRHluQml0cytoUUMtPmJpdFJlc1RvdCkgPCAoRkRLYWFjRW5jX2dldE1pbmltYWxTdGF0aWNCaXRkZW1hbmQoY20sIHBzeU91dCktcWNPdXRbMF0tPnN0YXRpY0JpdHMpICkKLSAgICAgICAgICByZXR1cm4gQUFDX0VOQ19CSVRSRVNfVE9PX0xPVzsKLSAgICAgIH0KK3N0YXRpYyBBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcHJlcGFyZUJpdERpc3RyaWJ1dGlvbigKKyAgICBRQ19TVEFURSogaFFDLCBQU1lfT1VUKiogcHN5T3V0LCBRQ19PVVQqKiBxY091dCwgQ0hBTk5FTF9NQVBQSU5HKiBjbSwKKyAgICBRQ19PVVRfRUxFTUVOVCogcWNFbGVtZW50WygxKV1bKCg4KSldLCBJTlQgYXZnVG90YWxCaXRzLAorICAgIElOVCogdG90YWxBdmFpbGFibGVCaXRzLCBJTlQqIGF2Z1RvdGFsRHluQml0cykgeworICBpbnQgaTsKKyAgLyogZ2V0IG1heGltYWwgYWxsb3dlZCBkeW5hbWljIGJpdHMgKi8KKyAgcWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzID0KKyAgICAgIChmaXhNaW4oaFFDLT5tYXhCaXRzUGVyRnJhbWUsIGF2Z1RvdGFsQml0cykgLSBoUUMtPmdsb2JIZHJCaXRzKSAmIH43OworICBxY091dFswXS0+Z3JhbnRlZER5bkJpdHMgLT0gKHFjT3V0WzBdLT5nbG9iYWxFeHRCaXRzICsgcWNPdXRbMF0tPnN0YXRpY0JpdHMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0WzBdLT5lbGVtZW50RXh0Qml0cyk7CisgIHFjT3V0WzBdLT5tYXhEeW5CaXRzID0gKChoUUMtPm1heEJpdHNQZXJGcmFtZSkgJiB+NykgLQorICAgICAgICAgICAgICAgICAgICAgICAgIChxY091dFswXS0+Z2xvYmFsRXh0Qml0cyArIHFjT3V0WzBdLT5zdGF0aWNCaXRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRbMF0tPmVsZW1lbnRFeHRCaXRzKTsKKyAgLyogYXNzdXJlIHRoYXQgZW5vdWdoIGJpdHMgYXJlIGF2YWlsYWJsZSAqLworICBpZiAoKHFjT3V0WzBdLT5ncmFudGVkRHluQml0cyArIGhRQy0+Yml0UmVzVG90KSA8IDApIHsKKyAgICAvKiBjcmFzaCByZWNvdmVyeSBhbGxvd3MgdG8gcmVkdWNlIHN0YXRpYyBiaXRzIHRvIGEgbWluaW11bSAqLworICAgIGlmICgocWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzICsgaFFDLT5iaXRSZXNUb3QpIDwKKyAgICAgICAgKEZES2FhY0VuY19nZXRNaW5pbWFsU3RhdGljQml0ZGVtYW5kKGNtLCBwc3lPdXQpIC0KKyAgICAgICAgIHFjT3V0WzBdLT5zdGF0aWNCaXRzKSkKKyAgICAgIHJldHVybiBBQUNfRU5DX0JJVFJFU19UT09fTE9XOworICB9CiAKLSAgICAgIC8qIGRpc3RyaWJ1dGUgZHluYW1pYyBiaXRzIHRvIGVhY2ggZWxlbWVudCAqLwotICAgICAgRkRLYWFjRW5jX2Rpc3RyaWJ1dGVFbGVtZW50RHluQml0cyhoUUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50WzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0WzBdLT5ncmFudGVkRHluQml0cyk7CisgIC8qIGRpc3RyaWJ1dGUgZHluYW1pYyBiaXRzIHRvIGVhY2ggZWxlbWVudCAqLworICBGREthYWNFbmNfZGlzdHJpYnV0ZUVsZW1lbnREeW5CaXRzKGhRQywgcWNFbGVtZW50WzBdLCBjbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dFswXS0+Z3JhbnRlZER5bkJpdHMpOwogCi0gICAgICAqYXZnVG90YWxEeW5CaXRzID0gMDsgLypmcmFtZUR5bkJpdHM7Ki8KKyAgKmF2Z1RvdGFsRHluQml0cyA9IDA7IC8qZnJhbWVEeW5CaXRzOyovCiAKLSAgICAqdG90YWxBdmFpbGFibGVCaXRzID0gYXZnVG90YWxCaXRzOworICAqdG90YWxBdmFpbGFibGVCaXRzID0gYXZnVG90YWxCaXRzOwogCi0gICAgLyogc3VtIHVwIGNvcnJlY3RlZCBncmFudGVkIFBFICovCi0gICAgcWNPdXRbMF0tPnRvdGFsR3JhbnRlZFBlQ29yciA9IDA7CisgIC8qIHN1bSB1cCBjb3JyZWN0ZWQgZ3JhbnRlZCBQRSAqLworICBxY091dFswXS0+dG90YWxHcmFudGVkUGVDb3JyID0gMDsKIAotICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKLSAgICB7Ci0gICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOwotICAgICAgICBpbnQgbkNoYW5uZWxzID0gZWxJbmZvLm5DaGFubmVsc0luRWw7CisgIGZvciAoaSA9IDA7IGkgPCBjbS0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKKyAgICBpbnQgbkNoYW5uZWxzID0gZWxJbmZvLm5DaGFubmVsc0luRWw7CiAKLSAgICAgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAotICAgICAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGZvciAoIGFsbCBzdWIgZnJhbWVzICkgLi4uICovCi0gICAgICAgICAgICAgICAgRkRLYWFjRW5jX0Rpc3RyaWJ1dGVCaXRzKGhRQy0+aEFkalRociwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5oQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dFswXS0+cHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNFbGVtZW50WzBdW2ldLT5wZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjRWxlbWVudFswXVtpXS0+Z3JhbnRlZFBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY0VsZW1lbnRbMF1baV0tPmdyYW50ZWRQZUNvcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0WzBdLT5wc3lPdXRFbGVtZW50W2ldLT5jb21tb25XaW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFswXVtpXS0+Z3JhbnRlZER5bkJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+ZWxlbWVudEJpdHNbaV0tPmJpdFJlc0xldmVsRWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+ZWxlbWVudEJpdHNbaV0tPm1heEJpdFJlc0JpdHNFbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5tYXhCaXRGYWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+Yml0RGlzdHJpYnV0aW9uTW9kZSk7CisgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAorICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKSB7CisgICAgICAvKiBmb3IgKCBhbGwgc3ViIGZyYW1lcyApIC4uLiAqLworICAgICAgRkRLYWFjRW5jX0Rpc3RyaWJ1dGVCaXRzKAorICAgICAgICAgIGhRQy0+aEFkalRociwgaFFDLT5oQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV0sCisgICAgICAgICAgcHN5T3V0WzBdLT5wc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsLCAmcWNFbGVtZW50WzBdW2ldLT5wZURhdGEsCisgICAgICAgICAgJnFjRWxlbWVudFswXVtpXS0+Z3JhbnRlZFBlLCAmcWNFbGVtZW50WzBdW2ldLT5ncmFudGVkUGVDb3JyLAorICAgICAgICAgIG5DaGFubmVscywgcHN5T3V0WzBdLT5wc3lPdXRFbGVtZW50W2ldLT5jb21tb25XaW5kb3csCisgICAgICAgICAgcWNFbGVtZW50WzBdW2ldLT5ncmFudGVkRHluQml0cywgaFFDLT5lbGVtZW50Qml0c1tpXS0+Yml0UmVzTGV2ZWxFbCwKKyAgICAgICAgICBoUUMtPmVsZW1lbnRCaXRzW2ldLT5tYXhCaXRSZXNCaXRzRWwsIGhRQy0+bWF4Qml0RmFjLAorICAgICAgICAgIGhRQy0+Yml0UmVzTW9kZSk7CiAKLSAgICAgICAgICAgICAgICAqdG90YWxBdmFpbGFibGVCaXRzICs9IGhRQy0+ZWxlbWVudEJpdHNbaV0tPmJpdFJlc0xldmVsRWw7Ci0gICAgICAgIC8qIGdldCB0b3RhbCBjb3JyZWN0ZWQgZ3JhbnRlZCBQRSAqLwotICAgICAgICBxY091dFswXS0+dG90YWxHcmFudGVkUGVDb3JyICs9IHFjRWxlbWVudFswXVtpXS0+Z3JhbnRlZFBlQ29ycjsKLSAgICAgICAgfSAgLyogIC1lbmQtIGlmKElEX1NDRSB8fCBJRF9DUEUgfHwgSURfTEZFKSAqLworICAgICAgKnRvdGFsQXZhaWxhYmxlQml0cyArPSBoUUMtPmVsZW1lbnRCaXRzW2ldLT5iaXRSZXNMZXZlbEVsOworICAgICAgLyogZ2V0IHRvdGFsIGNvcnJlY3RlZCBncmFudGVkIFBFICovCisgICAgICBxY091dFswXS0+dG90YWxHcmFudGVkUGVDb3JyICs9IHFjRWxlbWVudFswXVtpXS0+Z3JhbnRlZFBlQ29ycjsKKyAgICB9IC8qICAtZW5kLSBpZihJRF9TQ0UgfHwgSURfQ1BFIHx8IElEX0xGRSkgKi8KIAotICAgIH0gIC8qIC1lbmQtIGVsZW1lbnQgbG9vcCAqLworICB9IC8qIC1lbmQtIGVsZW1lbnQgbG9vcCAqLwogCi0gICAgKnRvdGFsQXZhaWxhYmxlQml0cyA9IEZES21pbihoUUMtPm1heEJpdHNQZXJGcmFtZSwgKCp0b3RhbEF2YWlsYWJsZUJpdHMpKTsKLQotICAgIHJldHVybiBBQUNfRU5DX09LOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY191cGRhdGVVc2VkRHluQml0cyhJTlQqICAgICAgICAgICAgICAgc3VtRHluQml0c0NvbnN1bWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogICAgcWNFbGVtZW50Wyg4KV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyogICBjbSkKLXsKLSAgSU5UIGk7Ci0KLSAgKnN1bUR5bkJpdHNDb25zdW1lZCA9IDA7Ci0KLSAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKQotICB7Ci0gICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKLQotICAgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAotICAgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpCi0gICAgICB7Ci0gICAgICAgICAgLyogc3VtIHVwIGJpdHMgY29uc3VtZWQgKi8KLSAgICAgICAgICAqc3VtRHluQml0c0NvbnN1bWVkICArPSBxY0VsZW1lbnRbaV0tPmR5bkJpdHNVc2VkOwotICAgICAgfSAgLyogIC1lbmQtIGlmKElEX1NDRSB8fCBJRF9DUEUgfHwgSURfTEZFKSAqLwotCi0gIH0gIC8qIC1lbmQtIGVsZW1lbnQgbG9vcCAqLworICAqdG90YWxBdmFpbGFibGVCaXRzID0gZk1pbihoUUMtPm1heEJpdHNQZXJGcmFtZSwgKCp0b3RhbEF2YWlsYWJsZUJpdHMpKTsKIAogICByZXR1cm4gQUFDX0VOQ19PSzsKIH0KIAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3N0YXRpYyBBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfdXBkYXRlVXNlZER5bkJpdHMoCisgICAgSU5UKiBzdW1EeW5CaXRzQ29uc3VtZWQsIFFDX09VVF9FTEVNRU5UKiBxY0VsZW1lbnRbKCg4KSldLAorICAgIENIQU5ORUxfTUFQUElORyogY20pIHsKKyAgSU5UIGk7CiAKLXN0YXRpYyBJTlQgRkRLYWFjRW5jX2dldFRvdGFsQ29uc3VtZWREeW5CaXRzKFFDX09VVCoqIHFjT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblN1YkZyYW1lcykKLXsKLSAgICBJTlQgYywgdG90YWxCaXRzPTA7CisgICpzdW1EeW5CaXRzQ29uc3VtZWQgPSAwOwogCi0gICAgLyogc3VtIHVwIGJpdCBjb25zdW1wdGlvbiBmb3IgYWxsIHN1YiBmcmFtZXMgKi8KLSAgICBmb3IgKGM9MDsgYzxuU3ViRnJhbWVzOyBjKyspCi0gICAgewotICAgICAgICAvKiBiaXQgY29uc3VtcHRpb24gbm90IHZhbGlkIGlmIGR5bmFtaWMgYml0cwotICAgICAgICAgICBub3QgYXZhaWxhYmxlIGluIG9uZSBzdWIgZnJhbWUgKi8KLSAgICAgICAgaWYgKHFjT3V0W2NdLT51c2VkRHluQml0cz09LTEpIHJldHVybiAtMTsKLSAgICAgICAgdG90YWxCaXRzICs9IHFjT3V0W2NdLT51c2VkRHluQml0czsKLSAgICB9CisgIGZvciAoaSA9IDA7IGkgPCBjbS0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKIAotICAgIHJldHVybiB0b3RhbEJpdHM7CisgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAorICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKSB7CisgICAgICAvKiBzdW0gdXAgYml0cyBjb25zdW1lZCAqLworICAgICAgKnN1bUR5bkJpdHNDb25zdW1lZCArPSBxY0VsZW1lbnRbaV0tPmR5bkJpdHNVc2VkOworICAgIH0gLyogIC1lbmQtIGlmKElEX1NDRSB8fCBJRF9DUEUgfHwgSURfTEZFKSAqLwogCisgIH0gLyogLWVuZC0gZWxlbWVudCBsb29wICovCisKKyAgcmV0dXJuIEFBQ19FTkNfT0s7CiB9CiAKLXN0YXRpYyBJTlQgRkRLYWFjRW5jX2dldFRvdGFsQ29uc3VtZWRCaXRzKFFDX09VVCoqICAgICAgICAgIHFjT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogICBxY0VsZW1lbnRbKDEpXVsoOCldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcqICBjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgZ2xvYkhkckJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgIG5TdWJGcmFtZXMpCi17Ci0gICAgaW50IGMsIGk7Ci0gICAgaW50IHRvdGFsVXNlZEJpdHMgPSAwOworc3RhdGljIElOVCBGREthYWNFbmNfZ2V0VG90YWxDb25zdW1lZER5bkJpdHMoUUNfT1VUKiogcWNPdXQsIElOVCBuU3ViRnJhbWVzKSB7CisgIElOVCBjLCB0b3RhbEJpdHMgPSAwOwogCi0gICAgZm9yIChjID0gMCA7IGMgPCBuU3ViRnJhbWVzIDsgYysrICkKLSAgICB7Ci0gICAgICAgIGludCBkYXRhQml0cyA9IDA7Ci0gICAgICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChjbS0+ZWxJbmZvW2ldLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChjbS0+ZWxJbmZvW2ldLmVsVHlwZSA9PSBJRF9DUEUpIHx8Ci0gICAgICAgICAgICAgICAgKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX0xGRSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgZGF0YUJpdHMgKz0gcWNFbGVtZW50W2NdW2ldLT5keW5CaXRzVXNlZCArIHFjRWxlbWVudFtjXVtpXS0+c3RhdGljQml0c1VzZWQgKyBxY0VsZW1lbnRbY11baV0tPmV4dEJpdHNVc2VkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRhdGFCaXRzICs9IHFjT3V0W2NdLT5nbG9iYWxFeHRCaXRzOworICAvKiBzdW0gdXAgYml0IGNvbnN1bXB0aW9uIGZvciBhbGwgc3ViIGZyYW1lcyAqLworICBmb3IgKGMgPSAwOyBjIDwgblN1YkZyYW1lczsgYysrKSB7CisgICAgLyogYml0IGNvbnN1bXB0aW9uIG5vdCB2YWxpZCBpZiBkeW5hbWljIGJpdHMKKyAgICAgICBub3QgYXZhaWxhYmxlIGluIG9uZSBzdWIgZnJhbWUgKi8KKyAgICBpZiAocWNPdXRbY10tPnVzZWREeW5CaXRzID09IC0xKSByZXR1cm4gLTE7CisgICAgdG90YWxCaXRzICs9IHFjT3V0W2NdLT51c2VkRHluQml0czsKKyAgfQogCi0gICAgICAgIHRvdGFsVXNlZEJpdHMgKz0gKDggLSAoZGF0YUJpdHMpICUgOCkgJSA4OwotICAgICAgICB0b3RhbFVzZWRCaXRzICs9IGRhdGFCaXRzICsgZ2xvYkhkckJpdHM7ICAvKiBoZWFkZXIgYml0cyBmb3IgZXZlcnkgZnJhbWUgKi8KKyAgcmV0dXJuIHRvdGFsQml0czsKK30KKworc3RhdGljIElOVCBGREthYWNFbmNfZ2V0VG90YWxDb25zdW1lZEJpdHMoUUNfT1VUKiogcWNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogcWNFbGVtZW50WygxKV1bKCg4KSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HKiBjbSwgSU5UIGdsb2JIZHJCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TdWJGcmFtZXMpIHsKKyAgaW50IGMsIGk7CisgIGludCB0b3RhbFVzZWRCaXRzID0gMDsKKworICBmb3IgKGMgPSAwOyBjIDwgblN1YkZyYW1lczsgYysrKSB7CisgICAgaW50IGRhdGFCaXRzID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY20tPm5FbGVtZW50czsgaSsrKSB7CisgICAgICBpZiAoKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX1NDRSkgfHwKKyAgICAgICAgICAoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfQ1BFKSB8fAorICAgICAgICAgIChjbS0+ZWxJbmZvW2ldLmVsVHlwZSA9PSBJRF9MRkUpKSB7CisgICAgICAgIGRhdGFCaXRzICs9IHFjRWxlbWVudFtjXVtpXS0+ZHluQml0c1VzZWQgKworICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnRbY11baV0tPnN0YXRpY0JpdHNVc2VkICsKKyAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50W2NdW2ldLT5leHRCaXRzVXNlZDsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHRvdGFsVXNlZEJpdHM7CisgICAgZGF0YUJpdHMgKz0gcWNPdXRbY10tPmdsb2JhbEV4dEJpdHM7CisKKyAgICB0b3RhbFVzZWRCaXRzICs9ICg4IC0gKGRhdGFCaXRzKSAlIDgpICUgODsKKyAgICB0b3RhbFVzZWRCaXRzICs9IGRhdGFCaXRzICsgZ2xvYkhkckJpdHM7IC8qIGhlYWRlciBiaXRzIGZvciBldmVyeSBmcmFtZSAqLworICB9CisgIHJldHVybiB0b3RhbFVzZWRCaXRzOwogfQogCiBzdGF0aWMgQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0JpdFJlc1JlZGlzdHJpYnV0aW9uKAotICAgICAgICBRQ19TVEFURSAqY29uc3QgICAgICAgICAgICAgIGhRQywKLSAgICAgICAgY29uc3QgQ0hBTk5FTF9NQVBQSU5HICpjb25zdCBjbSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICBhdmdUb3RhbEJpdHMKLSAgICAgICAgKQotewotICAgIC8qIGNoZWNrIGJpdHJlc2Vydm9pciBmaWxsIGxldmVsICovCi0gICAgaWYgKGhRQy0+Yml0UmVzVG90IDwgMCkgewotICAgICAgcmV0dXJuIEFBQ19FTkNfQklUUkVTX1RPT19MT1c7Ci0gICAgfQotICAgIGVsc2UgaWYgKGhRQy0+Yml0UmVzVG90ID4gaFFDLT5iaXRSZXNUb3RNYXgpIHsKLSAgICAgIHJldHVybiBBQUNfRU5DX0JJVFJFU19UT09fSElHSDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBJTlQgaSwgZmlyc3RFbCA9IGNtLT5uRWxlbWVudHMtMTsKLSAgICAgIElOVCB0b3RhbEJpdHMgPSAwLCB0b3RhbEJpdHNfbWF4ID0gMDsKKyAgICBRQ19TVEFURSogY29uc3QgaFFDLCBjb25zdCBDSEFOTkVMX01BUFBJTkcqIGNvbnN0IGNtLAorICAgIGNvbnN0IElOVCBhdmdUb3RhbEJpdHMpIHsKKyAgLyogY2hlY2sgYml0cmVzZXJ2b2lyIGZpbGwgbGV2ZWwgKi8KKyAgaWYgKGhRQy0+Yml0UmVzVG90IDwgMCkgeworICAgIHJldHVybiBBQUNfRU5DX0JJVFJFU19UT09fTE9XOworICB9IGVsc2UgaWYgKGhRQy0+Yml0UmVzVG90ID4gaFFDLT5iaXRSZXNUb3RNYXgpIHsKKyAgICByZXR1cm4gQUFDX0VOQ19CSVRSRVNfVE9PX0hJR0g7CisgIH0gZWxzZSB7CisgICAgSU5UIGk7CisgICAgSU5UIHRvdGFsQml0cyA9IDAsIHRvdGFsQml0c19tYXggPSAwOwogCi0gICAgICBpbnQgdG90YWxCaXRyZXNlcnZvaXIgICAgPSBGREttaW4oaFFDLT5iaXRSZXNUb3QsIChoUUMtPm1heEJpdHNQZXJGcmFtZS1hdmdUb3RhbEJpdHMpKTsKLSAgICAgIGludCB0b3RhbEJpdHJlc2Vydm9pck1heCA9IEZES21pbihoUUMtPmJpdFJlc1RvdE1heCwgKGhRQy0+bWF4Qml0c1BlckZyYW1lLWF2Z1RvdGFsQml0cykpOworICAgIGNvbnN0IGludCB0b3RhbEJpdHJlc2Vydm9pciA9CisgICAgICAgIGZNaW4oaFFDLT5iaXRSZXNUb3QsIChoUUMtPm1heEJpdHNQZXJGcmFtZSAtIGF2Z1RvdGFsQml0cykpOworICAgIGNvbnN0IGludCB0b3RhbEJpdHJlc2Vydm9pck1heCA9CisgICAgICAgIGZNaW4oaFFDLT5iaXRSZXNUb3RNYXgsIChoUUMtPm1heEJpdHNQZXJGcmFtZSAtIGF2Z1RvdGFsQml0cykpOwogCi0gICAgICBpbnQgc2NfYml0UmVzVG90ID0gQ291bnRMZWFkaW5nQml0cyh0b3RhbEJpdHJlc2Vydm9pcik7Ci0gICAgICBpbnQgc2NfYml0UmVzVG90TWF4ID0gQ291bnRMZWFkaW5nQml0cyh0b3RhbEJpdHJlc2Vydm9pck1heCk7CisgICAgZm9yIChpID0gKGNtLT5uRWxlbWVudHMgLSAxKTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIGlmICgoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfU0NFKSB8fAorICAgICAgICAgIChjbS0+ZWxJbmZvW2ldLmVsVHlwZSA9PSBJRF9DUEUpIHx8CisgICAgICAgICAgKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX0xGRSkpIHsKKyAgICAgICAgaFFDLT5lbGVtZW50Qml0c1tpXS0+Yml0UmVzTGV2ZWxFbCA9CisgICAgICAgICAgICBmTXVsdEkoaFFDLT5lbGVtZW50Qml0c1tpXS0+cmVsYXRpdmVCaXRzRWwsIHRvdGFsQml0cmVzZXJ2b2lyKTsKKyAgICAgICAgdG90YWxCaXRzICs9IGhRQy0+ZWxlbWVudEJpdHNbaV0tPmJpdFJlc0xldmVsRWw7CiAKLSAgICAgIGZvciAoaT0oY20tPm5FbGVtZW50cy0xKTsgaT49MDsgaS0tKSB7Ci0gICAgICAgIGlmICgoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfU0NFKSB8fCAoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfQ1BFKSB8fAotICAgICAgICAgICAgKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX0xGRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBoUUMtPmVsZW1lbnRCaXRzW2ldLT5iaXRSZXNMZXZlbEVsID0gKElOVClmTXVsdChoUUMtPmVsZW1lbnRCaXRzW2ldLT5yZWxhdGl2ZUJpdHNFbCwgKEZJWFBfREJMKSh0b3RhbEJpdHJlc2Vydm9pcjw8c2NfYml0UmVzVG90KSk+PnNjX2JpdFJlc1RvdDsKLSAgICAgICAgICB0b3RhbEJpdHMgKz0gaFFDLT5lbGVtZW50Qml0c1tpXS0+Yml0UmVzTGV2ZWxFbDsKLQotICAgICAgICAgIGhRQy0+ZWxlbWVudEJpdHNbaV0tPm1heEJpdFJlc0JpdHNFbCA9IChJTlQpZk11bHQoaFFDLT5lbGVtZW50Qml0c1tpXS0+cmVsYXRpdmVCaXRzRWwsIChGSVhQX0RCTCkodG90YWxCaXRyZXNlcnZvaXJNYXg8PHNjX2JpdFJlc1RvdE1heCkpPj5zY19iaXRSZXNUb3RNYXg7Ci0gICAgICAgICAgdG90YWxCaXRzX21heCArPSBoUUMtPmVsZW1lbnRCaXRzW2ldLT5tYXhCaXRSZXNCaXRzRWw7Ci0KLSAgICAgICAgICBmaXJzdEVsID0gaTsKLSAgICAgICAgfQorICAgICAgICBoUUMtPmVsZW1lbnRCaXRzW2ldLT5tYXhCaXRSZXNCaXRzRWwgPQorICAgICAgICAgICAgZk11bHRJKGhRQy0+ZWxlbWVudEJpdHNbaV0tPnJlbGF0aXZlQml0c0VsLCB0b3RhbEJpdHJlc2Vydm9pck1heCk7CisgICAgICAgIHRvdGFsQml0c19tYXggKz0gaFFDLT5lbGVtZW50Qml0c1tpXS0+bWF4Qml0UmVzQml0c0VsOwogICAgICAgfQotICAgICAgaFFDLT5lbGVtZW50Qml0c1tmaXJzdEVsXS0+Yml0UmVzTGV2ZWxFbCAgICs9IHRvdGFsQml0cmVzZXJ2b2lyIC0gdG90YWxCaXRzOwotICAgICAgaFFDLT5lbGVtZW50Qml0c1tmaXJzdEVsXS0+bWF4Qml0UmVzQml0c0VsICs9IHRvdGFsQml0cmVzZXJ2b2lyTWF4IC0gdG90YWxCaXRzX21heDsKICAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGNtLT5uRWxlbWVudHM7IGkrKykgeworICAgICAgaWYgKChjbS0+ZWxJbmZvW2ldLmVsVHlwZSA9PSBJRF9TQ0UpIHx8CisgICAgICAgICAgKGNtLT5lbEluZm9baV0uZWxUeXBlID09IElEX0NQRSkgfHwKKyAgICAgICAgICAoY20tPmVsSW5mb1tpXS5lbFR5cGUgPT0gSURfTEZFKSkgeworICAgICAgICBpbnQgZGVsdGFCaXRzID0gZk1heCh0b3RhbEJpdHJlc2Vydm9pciAtIHRvdGFsQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWhRQy0+ZWxlbWVudEJpdHNbaV0tPmJpdFJlc0xldmVsRWwpOworICAgICAgICBoUUMtPmVsZW1lbnRCaXRzW2ldLT5iaXRSZXNMZXZlbEVsICs9IGRlbHRhQml0czsKKyAgICAgICAgdG90YWxCaXRzICs9IGRlbHRhQml0czsKIAotICAgIHJldHVybiBBQUNfRU5DX09LOworICAgICAgICBkZWx0YUJpdHMgPSBmTWF4KHRvdGFsQml0cmVzZXJ2b2lyTWF4IC0gdG90YWxCaXRzX21heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAtaFFDLT5lbGVtZW50Qml0c1tpXS0+bWF4Qml0UmVzQml0c0VsKTsKKyAgICAgICAgaFFDLT5lbGVtZW50Qml0c1tpXS0+bWF4Qml0UmVzQml0c0VsICs9IGRlbHRhQml0czsKKyAgICAgICAgdG90YWxCaXRzX21heCArPSBkZWx0YUJpdHM7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIEFBQ19FTkNfT0s7CiB9CiAKLQotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1FDTWFpbihRQ19TVEFURSogUkVTVFJJQ1QgICAgICAgICBoUUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQqKiAgICAgICAgICAgICAgICAgIHBzeU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiogICAgICAgICAgICAgICAgICAgcWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgIGF2Z1RvdGFsQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HKiAgICAgICAgICAgY20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsQVVESU9fT0JKRUNUX1RZUEUgICAgICAgICAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgICAgICAgICAgZXBDb25maWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNNYWluKFFDX1NUQVRFKiBSRVNUUklDVCBoUUMsIFBTWV9PVVQqKiBwc3lPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCoqIHFjT3V0LCBJTlQgYXZnVG90YWxCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcqIGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBhb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc3ludGF4RmxhZ3MsIFNDSEFSIGVwQ29uZmlnKSB7CiAgIGludCBpLCBjOwogICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1cyA9IEFBQ19FTkNfT0s7CiAgIElOVCBhdmdUb3RhbER5bkJpdHMgPSAwOyAvKiBtYXhpbWFsIGFsbG93ZWQgZHluYW1pYyBiaXRzIGZvciBhbGwgZnJhbWVzICovCkBAIC04MTQsMzYzICs4MTcsMzE0IEBACiAgIC8qIGZhc3RlbmMgbmVlZHMgb25lIHRpbWUgdGhyZXNob2xkIHNpbXVsYXRpb24sCiAgICAgIGluIGNhc2Ugb2YgbXVsdGlwbGUgZnJhbWVzLCBvbmUgbW9yZSBndWVzcyBoYXMgdG8gYmUgY2FsY3VsYXRlZCAqLwogCi0gICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgICAvKiBoZWxwZXIgcG9pbnRlciAqLwotICAgICAgUUNfT1VUX0VMRU1FTlQqICBxY0VsZW1lbnRbKDEpXVsoOCldOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIC8qIGhlbHBlciBwb2ludGVyICovCisgIFFDX09VVF9FTEVNRU5UKiBxY0VsZW1lbnRbKDEpXVsoKDgpKV07CiAKLSAgICAgIC8qIHdvcmsgb24gYSBjb3B5IG9mIHFjQ2hhbm5lbCBhbmQgcWNFbGVtZW50ICovCi0gICAgICBmb3IgKGk9MDsgaTxjbS0+bkVsZW1lbnRzOyBpKyspCi0gICAgICB7Ci0gICAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07CisgIC8qIHdvcmsgb24gYSBjb3B5IG9mIHFjQ2hhbm5lbCBhbmQgcWNFbGVtZW50ICovCisgIGZvciAoaSA9IDA7IGkgPCBjbS0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKIAotICAgICAgICAgIGlmICgoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkgfHwKLSAgICAgICAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIGZvciAoIGFsbCBzdWIgZnJhbWVzICkgLi4uICovCi0gICAgICAgICAgICAgIGZvciAoYyA9IDAgOyBjIDwgblN1YkZyYW1lcyA7IGMrKyApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnRbY11baV0gPSBxY091dFtjXS0+cWNFbGVtZW50W2ldOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQorICAgIGlmICgoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpIHx8IChlbEluZm8uZWxUeXBlID09IElEX0NQRSkgfHwKKyAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkgeworICAgICAgLyogZm9yICggYWxsIHN1YiBmcmFtZXMgKSAuLi4gKi8KKyAgICAgIGZvciAoYyA9IDA7IGMgPCBuU3ViRnJhbWVzOyBjKyspIHsKKyAgICAgICAgeyBxY0VsZW1lbnRbY11baV0gPSBxY091dFtjXS0+cWNFbGVtZW50W2ldOyB9CiAgICAgICB9CisgICAgfQorICB9CiAKLSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgIGlmICggaXNDb25zdGFudEJpdHJhdGVNb2RlKGhRQy0+Yml0cmF0ZU1vZGUpICkKLSAgICAgIHsKLSAgICAgICAgICAvKiBjYWxjIGdyYW50ZWQgZHluYW1pYyBiaXRzIGZvciBzdWIgZnJhbWUgYW5kCi0gICAgICAgICAgICAgZGlzdHJpYnV0ZSBpdCB0byBlYWNoIGVsZW1lbnQgKi8KLSAgICAgICAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19wcmVwYXJlQml0RGlzdHJpYnV0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z1RvdGFsQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvdGFsQXZhaWxhYmxlQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF2Z1RvdGFsRHluQml0cyk7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICBpZiAoaXNDb25zdGFudEJpdHJhdGVNb2RlKGhRQy0+Yml0cmF0ZU1vZGUpKSB7CisgICAgLyogY2FsYyBncmFudGVkIGR5bmFtaWMgYml0cyBmb3Igc3ViIGZyYW1lIGFuZAorICAgICAgIGRpc3RyaWJ1dGUgaXQgdG8gZWFjaCBlbGVtZW50ICovCisgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfcHJlcGFyZUJpdERpc3RyaWJ1dGlvbigKKyAgICAgICAgaFFDLCBwc3lPdXQsIHFjT3V0LCBjbSwgcWNFbGVtZW50LCBhdmdUb3RhbEJpdHMsICZ0b3RhbEF2YWlsYWJsZUJpdHMsCisgICAgICAgICZhdmdUb3RhbER5bkJpdHMpOwogCi0gICAgICAgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spIHsKLSAgICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgICBxY091dFswXS0+Z3JhbnRlZER5bkJpdHMgPSAoKGhRQy0+bWF4Qml0c1BlckZyYW1lIC0gKGhRQy0+Z2xvYkhkckJpdHMpKSZ+NykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAocWNPdXRbMF0tPmdsb2JhbEV4dEJpdHMgKyBxY091dFswXS0+c3RhdGljQml0cyArIHFjT3V0WzBdLT5lbGVtZW50RXh0Qml0cyk7Ci0gICAgICAgICAgcWNPdXRbMF0tPm1heER5bkJpdHMgICAgID0gcWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzOworICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKSB7CisgICAgICByZXR1cm4gRXJyb3JTdGF0dXM7CisgICAgfQorICB9IGVsc2UgeworICAgIHFjT3V0WzBdLT5ncmFudGVkRHluQml0cyA9CisgICAgICAgICgoaFFDLT5tYXhCaXRzUGVyRnJhbWUgLSAoaFFDLT5nbG9iSGRyQml0cykpICYgfjcpIC0KKyAgICAgICAgKHFjT3V0WzBdLT5nbG9iYWxFeHRCaXRzICsgcWNPdXRbMF0tPnN0YXRpY0JpdHMgKworICAgICAgICAgcWNPdXRbMF0tPmVsZW1lbnRFeHRCaXRzKTsKKyAgICBxY091dFswXS0+bWF4RHluQml0cyA9IHFjT3V0WzBdLT5ncmFudGVkRHluQml0czsKIAotICAgICAgICAgIHRvdGFsQXZhaWxhYmxlQml0cyA9IGhRQy0+bWF4Qml0c1BlckZyYW1lOwotICAgICAgICAgIGF2Z1RvdGFsRHluQml0cyA9IDA7Ci0gICAgICB9CisgICAgdG90YWxBdmFpbGFibGVCaXRzID0gaFFDLT5tYXhCaXRzUGVyRnJhbWU7CisgICAgYXZnVG90YWxEeW5CaXRzID0gMDsKKyAgfQogCi0jaWZkZWYgUE5TX1BSRUNPVU5UX0VOQUJMRQotICAgICAgLyogQ2FsY3VsYXRlIGVzdGltYXRlZCBwbnMgYml0cyBhbmQgc3Vic3RyYWN0IHRoZW0gZnJvbSBncmFudGVkRHluQml0cyB0byBnZXQgYSBtb3JlIGFjY3VyYXRlIG51bWJlciBvZiBhdmFpbGFibGUgYml0cy4gKi8KLSAgICAgIGlmIChzeW50YXhGbGFncyAmIChBQ19MRHxBQ19FTEQpKQotICAgICAgewotICAgICAgICBpbnQgZXN0aW1hdGVkUG5zQml0cyA9IDAsIGNoOworICAvKiBmb3IgKCBhbGwgc3ViIGZyYW1lcyApIC4uLiAqLworICBmb3IgKGMgPSAwOyBjIDwgblN1YkZyYW1lczsgYysrKSB7CisgICAgLyogZm9yIENCUiBhbmQgVkJSIG1vZGUgKi8KKyAgICBGREthYWNFbmNfQWRqdXN0VGhyZXNob2xkcyhoUUMtPmhBZGpUaHIsIHFjRWxlbWVudFtjXSwgcWNPdXRbY10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0W2NdLT5wc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29uc3RhbnRCaXRyYXRlTW9kZShoUUMtPmJpdHJhdGVNb2RlKSwgY20pOwogCi0gICAgICAgIGZvciAoY2g9MDsgY2g8Y20tPm5DaGFubmVsczsgY2grKykgewotICAgICAgICAgIHFjT3V0WzBdLT5wUWNPdXRDaGFubmVsc1tjaF0tPnNlY3Rpb25EYXRhLm5vaXNlTnJnQml0cyA9IG5vaXNlUHJlQ291bnQocHN5T3V0WzBdLT5wUHN5T3V0Q2hhbm5lbHNbY2hdLT5ub2lzZU5yZywgcHN5T3V0WzBdLT5wUHN5T3V0Q2hhbm5lbHNbY2hdLT5tYXhTZmJQZXJHcm91cCk7Ci0gICAgICAgICAgZXN0aW1hdGVkUG5zQml0cyArPSBxY091dFswXS0+cFFjT3V0Q2hhbm5lbHNbY2hdLT5zZWN0aW9uRGF0YS5ub2lzZU5yZ0JpdHM7CisgIH0gLyogLWVuZC0gc3ViIGZyYW1lIGNvdW50ZXIgKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIElOVCBpdGVyYXRpb25zWygxKV1bKCg4KSldOworICBJTlQgY2hDb25zdHJhaW50c0Z1bGZpbGxlZFsoMSldWygoOCkpXVsoMildOworICBJTlQgY2FsY3VsYXRlUXVhbnRbKDEpXVsoKDgpKV1bKDIpXTsKKyAgSU5UIGNvbnN0cmFpbnRzRnVsZmlsbGVkWygxKV1bKCg4KSldOworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgLyogZm9yICggYWxsIHN1YiBmcmFtZXMgKSAuLi4gKi8KKyAgZm9yIChjID0gMDsgYyA8IG5TdWJGcmFtZXM7IGMrKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBjbS0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOworICAgICAgSU5UIGNoLCBuQ2hhbm5lbHMgPSBlbEluZm8ubkNoYW5uZWxzSW5FbDsKKworICAgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAorICAgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpIHsKKyAgICAgICAgLyogVHVybiB0aHJlc2hvbGRzIGludG8gc2NhbGVmYWN0b3JzLCBvcHRpbWl6ZSBiaXQgY29uc3VtcHRpb24gYW5kCisgICAgICAgICAqIHZlcmlmeSBjb25mb3JtYW5jZSAqLworICAgICAgICBGREthYWNFbmNfRXN0aW1hdGVTY2FsZUZhY3RvcnMoCisgICAgICAgICAgICBwc3lPdXRbY10tPnBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWwsCisgICAgICAgICAgICBxY0VsZW1lbnRbY11baV0tPnFjT3V0Q2hhbm5lbCwgaFFDLT5pbnZRdWFudCwgaFFDLT5kWm9uZVF1YW50RW5hYmxlLAorICAgICAgICAgICAgY20tPmVsSW5mb1tpXS5uQ2hhbm5lbHNJbkVsKTsKKworICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgIGNvbnN0cmFpbnRzRnVsZmlsbGVkW2NdW2ldID0gMTsKKyAgICAgICAgaXRlcmF0aW9uc1tjXVtpXSA9IDA7CisKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgY2hDb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXVtjaF0gPSAxOworICAgICAgICAgIGNhbGN1bGF0ZVF1YW50W2NdW2ldW2NoXSA9IDE7CiAgICAgICAgIH0KLSAgICAgICAgcWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzIC09IGVzdGltYXRlZFBuc0JpdHM7Ci0gICAgICB9Ci0jZW5kaWYKIAotICAgICAgLyogZm9yICggYWxsIHN1YiBmcmFtZXMgKSAuLi4gKi8KLSAgICAgIGZvciAoYyA9IDAgOyBjIDwgblN1YkZyYW1lcyA7IGMrKyApCi0gICAgICB7Ci0gICAgICAgICAgLyogZm9yIENCUiBhbmQgVkJSIG1vZGUgKi8KLSAgICAgICAgICBGREthYWNFbmNfQWRqdXN0VGhyZXNob2xkcyhoUUMtPmhBZGpUaHItPmFkalRoclN0YXRlRWxlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnRbY10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRbY10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0W2NdLT5wc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29uc3RhbnRCaXRyYXRlTW9kZShoUUMtPmJpdHJhdGVNb2RlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmhBZGpUaHItPm1heEl0ZXIybmRHdWVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbSk7CisgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotICAgICAgfSAvKiAtZW5kLSBzdWIgZnJhbWUgY291bnRlciAqLworICAgICAgfSAvKiAgLWVuZC0gaWYoSURfU0NFIHx8IElEX0NQRSB8fCBJRF9MRkUpICovCiAKLSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgIElOVCBpdGVyYXRpb25zWygxKV1bKDgpXTsKLSAgICAgIElOVCBjaENvbnN0cmFpbnRzRnVsZmlsbGVkWygxKV1bKDgpXVsoMildOwotICAgICAgSU5UIGNhbGN1bGF0ZVF1YW50WygxKV1bKDgpXVsoMildOwotICAgICAgSU5UIGNvbnN0cmFpbnRzRnVsZmlsbGVkWygxKV1bKDgpXTsKLSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICB9IC8qIC1lbmQtIGVsZW1lbnQgbG9vcCAqLwogCisgICAgcWNPdXRbY10tPnVzZWREeW5CaXRzID0gLTE7CiAKLSAgICAgIC8qIGZvciAoIGFsbCBzdWIgZnJhbWVzICkgLi4uICovCi0gICAgICBmb3IgKGMgPSAwIDsgYyA8IG5TdWJGcmFtZXMgOyBjKysgKQotICAgICAgewotICAgICAgICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKKyAgfSAvKiAtZW5kLSBzdWIgZnJhbWUgY291bnRlciAqLworCisgIElOVCBxdWFudGl6YXRpb25Eb25lID0gMDsKKyAgSU5UIHN1bUR5bkJpdHNDb25zdW1lZFRvdGFsID0gMDsKKyAgSU5UIGRlY3JlYXNlQml0Q29uc3VtcHRpb24gPSAtMTsgLyogbm8gZGlyZWN0aW9uIHlldCEgKi8KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIC8qIC1zdGFydC0gUXVhbnRpemF0aW9uIGxvb3AgLi4uICAgICAgICAgICAgICAgKi8KKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICBkbyAvKiB1bnRpbCBtYXggYWxsb3dlZCBiaXRzIHBlciBmcmFtZSBhbmQgbWF4RHluQml0cyE9LTEqLworICB7CisgICAgcXVhbnRpemF0aW9uRG9uZSA9IDA7CisKKyAgICBjID0gMDsgLyogZ2V0IGZyYW1lIHRvIHByb2Nlc3MgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBjbS0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOworICAgICAgSU5UIGNoLCBuQ2hhbm5lbHMgPSBlbEluZm8ubkNoYW5uZWxzSW5FbDsKKworICAgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAorICAgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpIHsKKyAgICAgICAgZG8gLyogdW50aWwgZWxlbWVudCBiaXRzIDwgbkNoYW5uZWxzKk1JTl9CVUZTSVpFX1BFUl9FRkZfQ0hBTiAqLworICAgICAgICB7CisgICAgICAgICAgZG8gLyogdW50aWwgc3BlY3RyYWwgdmFsdWVzIDwgTUFYX1FVQU5UICovCiAgICAgICAgICAgewotICAgICAgICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tpXTsKLSAgICAgICAgICAgICAgSU5UIGNoLCBuQ2hhbm5lbHMgPSBlbEluZm8ubkNoYW5uZWxzSW5FbDsKLQotICAgICAgICAgICAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8Ci0gICAgICAgICAgICAgICAgICAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgLyogVHVybiB0aHJlc2hvbGRzIGludG8gc2NhbGVmYWN0b3JzLCBvcHRpbWl6ZSBiaXQgY29uc3VtcHRpb24gYW5kIHZlcmlmeSBjb25mb3JtYW5jZSAqLwotICAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19Fc3RpbWF0ZVNjYWxlRmFjdG9ycyhwc3lPdXRbY10tPnBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXVtpXS0+cWNPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmludlF1YW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmRab25lUXVhbnRFbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLT5lbEluZm9baV0ubkNoYW5uZWxzSW5FbCk7Ci0KLQotICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9uc1tjXVtpXSA9IDAgOwotCi0gICAgICAgICAgICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXVtjaF0gPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVRdWFudFtjXVtpXVtjaF0gPSAxOwotICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgICAgICAgICAgICB9ICAvKiAgLWVuZC0gaWYoSURfU0NFIHx8IElEX0NQRSB8fCBJRF9MRkUpICovCi0KLSAgICAgICAgICB9ICAvKiAtZW5kLSBlbGVtZW50IGxvb3AgKi8KLQotICAgICAgICAgIHFjT3V0W2NdLT51c2VkRHluQml0cyA9IC0xOwotCi0gICAgICB9IC8qIC1lbmQtIHN1YiBmcmFtZSBjb3VudGVyICovCi0KLQotCi0gICAgICBJTlQgcXVhbnRpemF0aW9uRG9uZSA9IDA7Ci0gICAgICBJTlQgc3VtRHluQml0c0NvbnN1bWVkVG90YWwgID0gMDsKLSAgICAgIElOVCBkZWNyZWFzZUJpdENvbnN1bXB0aW9uID0gLTE7IC8qIG5vIGRpcmVjdGlvbiB5ZXQhICovCi0KLSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgIC8qIC1zdGFydC0gUXVhbnRpemF0aW9uIGxvb3AgLi4uICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgIGRvIC8qIHVudGlsIG1heCBhbGxvd2VkIGJpdHMgcGVyIGZyYW1lIGFuZCBtYXhEeW5CaXRzIT0tMSovCi0gICAgICB7Ci0gICAgICAgICAgcXVhbnRpemF0aW9uRG9uZSA9IDA7Ci0KLSAgICAgICAgICAgICAgYyA9IDA7ICAgICAgICAgICAgICAvKiBnZXQgZnJhbWUgdG8gcHJvY2VzcyAqLwotCi0gICAgICAgICAgICAgIGZvciAoaT0wOyBpPGNtLT5uRWxlbWVudHM7IGkrKykKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07Ci0gICAgICAgICAgICAgICAgICBJTlQgY2gsIG5DaGFubmVscyA9IGVsSW5mby5uQ2hhbm5lbHNJbkVsOwotCi0gICAgICAgICAgICAgICAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBkbyAvKiB1bnRpbCBzcGVjdHJhbCB2YWx1ZXMgPCBNQVhfUVVBTlQgKi8KLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX3JlZHVjZUJpdENvbnN1bXB0aW9uKCZpdGVyYXRpb25zW2NdW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+bWF4SXRlcmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVjcmVhc2VCaXRDb25zdW1wdGlvbikgPyAxIDogLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVRdWFudFtjXVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0W2NdLT5wc3lPdXRFbGVtZW50W2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0W2NdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmVsZW1lbnRCaXRzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHNGdWxmaWxsZWRbY11baV0gPSAxIDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHF1YW50aXplIHNwZWN0cnVtIChwZXIgZWFjaCBjaGFubmVsKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ29uc3RyYWludHNGdWxmaWxsZWRbY11baV1bY2hdID0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsY3VsYXRlUXVhbnRbY11baV1bY2hdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoID0gcWNFbGVtZW50W2NdW2ldLT5xY091dENoYW5uZWxbY2hdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2ggPSBwc3lPdXRbY10tPnBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWxbY2hdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlUXVhbnRbY11baV1bY2hdID0gMDsgLyogY2FsY3VsYXRlIHF1YW50aXphdGlvbiBvbmx5IGlmIG5lY2Vzc2FyeSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19RdWFudGl6ZVNwZWN0cnVtKHBzeU91dENoLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPm1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5zZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+c2ZiT2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+Z2xvYmFsR2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5zY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+cXVhbnRTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+ZFpvbmVRdWFudEVuYWJsZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZES2FhY0VuY19jYWxjTWF4VmFsdWVJblNmYihwc3lPdXRDaC0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+bWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5zZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPnNmYk9mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2gtPnF1YW50U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+bWF4VmFsdWVJblNmYikgPiBNQVhfUVVBTlQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXVtjaF0gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHNGdWxmaWxsZWRbY11baV0gPSAwIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHF1YW5penRlZCB2YWx1ZSBvdXQgb2YgcmFuZ2U7IGluY3JlYXNlIGdsb2JhbCBnYWluISAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjcmVhc2VCaXRDb25zdW1wdGlvbiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGlmIGNhbGN1bGF0ZVF1YW50W2NdW2ldW2NoXSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogY2hhbm5lbCBsb29wICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxdWFudGl6ZSBzcGVjdHJ1bSAocGVyIGVhY2ggY2hhbm5lbCkgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICghY29uc3RyYWludHNGdWxmaWxsZWRbY11baV0pIDsgLyogZG9lcyBub3QgcmVnYXJkIGJpdCBjb25zdW1wdGlvbiAqLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgICAgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXVtpXS0+ZHluQml0c1VzZWQgPSAwIDsgLyogcmVzZXQgZHluYW1pYyBiaXRzICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAvKiBxdWFudGl6YXRpb24gdmFsaWQgaW4gY3VycmVudCBjaGFubmVsISAqLwotICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoID0gcWNFbGVtZW50W2NdW2ldLT5xY091dENoYW5uZWxbY2hdOwotICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoID0gcHN5T3V0W2NdLT5wc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsW2NoXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3VudCBkeW5hbWljIGJpdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNoRHluQml0cyA9IEZES2FhY0VuY19keW5CaXRDb3VudChoUUMtPmhCaXRDb3VudGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2gtPnF1YW50U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5tYXhWYWx1ZUluU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2gtPnNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+bGFzdFdpbmRvd1NlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPm1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5zZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+c2ZiT2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNPdXRDaC0+c2VjdGlvbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPm5vaXNlTnJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoLT5pc0Jvb2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPmlzU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MpIDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gdXAgZHluYW1pYyBjaGFubmVsIGJpdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50W2NdW2ldLT5keW5CaXRzVXNlZCArPSBjaER5bkJpdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSBkeW5CaXRzVXNlZCBmb3IgY29ycmVjdGlvbiBvZiBiaXRzMnBlIHJlbGF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgaWYoaFFDLT5oQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV0tPmR5bkJpdHNMYXN0PT0tMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtpXS0+ZHluQml0c0xhc3QgPSBxY0VsZW1lbnRbY11baV0tPmR5bkJpdHNVc2VkOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0gIC8qICAtZW5kLSBpZihJRF9TQ0UgfHwgSURfQ1BFIHx8IElEX0xGRSkgKi8KLQotICAgICAgICAgICAgICB9ICAvKiAtZW5kLSBlbGVtZW50IGxvb3AgKi8KLQotICAgICAgICAgICAgICAvKiB1cGRhdGUgZHluQml0cyBvZiBjdXJyZW50IHN1YkZyYW1lICovCi0gICAgICAgICAgICAgIEZES2FhY0VuY191cGRhdGVVc2VkRHluQml0cygmcWNPdXRbY10tPnVzZWREeW5CaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50W2NdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20pOwotCi0gICAgICAgICAgICAgIC8qIGdldCB0b3RhbCBjb25zdW1lZCBiaXRzLCBkeW4gYml0cyBpbiBhbGwgc3ViIGZyYW1lcyBoYXZlIHRvIGJlIHZhbGlkICovCi0gICAgICAgICAgICAgIHN1bUR5bkJpdHNDb25zdW1lZFRvdGFsID0gRkRLYWFjRW5jX2dldFRvdGFsQ29uc3VtZWREeW5CaXRzKHFjT3V0LCBuU3ViRnJhbWVzKTsKLQotICAgICAgICAgICAgICBpZiAoc3VtRHluQml0c0NvbnN1bWVkVG90YWw9PS0xKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMDsgLyogYml0IGNvbnN1bXB0aW9uIG5vdCB2YWxpZCBpbiBhbGwgc3ViIGZyYW1lcyAqLworICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAgICAgaWYgKCFjb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXSkgeworICAgICAgICAgICAgICBpZiAoKEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX3JlZHVjZUJpdENvbnN1bXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAmaXRlcmF0aW9uc1tjXVtpXSwgaFFDLT5tYXhJdGVyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAoZGVjcmVhc2VCaXRDb25zdW1wdGlvbikgPyAxIDogLTEsCisgICAgICAgICAgICAgICAgICAgICAgIGNoQ29uc3RyYWludHNGdWxmaWxsZWRbY11baV0sIGNhbGN1bGF0ZVF1YW50W2NdW2ldLAorICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsIHBzeU91dFtjXS0+cHN5T3V0RWxlbWVudFtpXSwgcWNPdXRbY10sCisgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXVtpXSwgaFFDLT5lbGVtZW50Qml0c1tpXSwgYW90LCBzeW50YXhGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgZXBDb25maWcpKSAhPSBBQUNfRU5DX09LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOwogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBzdW1CaXRzQ29uc3VtZWRUb3RhbCA9IEZES2FhY0VuY19nZXRUb3RhbENvbnN1bWVkQml0cyhxY091dCwgcWNFbGVtZW50LCBjbSwgaFFDLT5nbG9iSGRyQml0cywgblN1YkZyYW1lcyk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvKiBpbiBhbGwgZnJhbWVzIGFyZSB2YWxpZCBkeW5hbWljIGJpdHMgKi8KLSAgICAgICAgICAgICAgICBpZiAoICgoc3VtQml0c0NvbnN1bWVkVG90YWwgPCB0b3RhbEF2YWlsYWJsZUJpdHMpIHx8IHFjT3V0W2NdLT51c2VkRHluQml0cz09MCkgJiYgKGRlY3JlYXNlQml0Q29uc3VtcHRpb249PTEpICYmIGNoZWNrTWluRnJhbWVCaXRzRGVtYW5kKHFjT3V0LGhRQy0+bWluQml0c1BlckZyYW1lLG5TdWJGcmFtZXMpCi0gICAgICAgICAgICAgICAgICAgICAgLyooKSovICApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMTsgLyogZXhpdCBiaXQgYWRqdXN0bWVudCAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3VtQml0c0NvbnN1bWVkVG90YWwgPiB0b3RhbEF2YWlsYWJsZUJpdHMgJiYgKGRlY3JlYXNlQml0Q29uc3VtcHRpb249PTApICkKLS8vICAgICAgICAgICAgICAgICAgICAgIC8qKCkqLyAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uRG9uZSA9IDA7IC8qIHJlc2V0ISAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgICAgIGNvbnN0cmFpbnRzRnVsZmlsbGVkW2NdW2ldID0gMTsKIAorICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAgICAgLyogcXVhbnRpemUgc3BlY3RydW0gKHBlciBlYWNoIGNoYW5uZWwpICovCisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAgICAgICBjaENvbnN0cmFpbnRzRnVsZmlsbGVkW2NdW2ldW2NoXSA9IDE7CisKKyAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAgICAgICAgICAgIGlmIChjYWxjdWxhdGVRdWFudFtjXVtpXVtjaF0pIHsKKyAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaCA9IHFjRWxlbWVudFtjXVtpXS0+cWNPdXRDaGFubmVsW2NoXTsKKyAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoID0KKyAgICAgICAgICAgICAgICAgICAgcHN5T3V0W2NdLT5wc3lPdXRFbGVtZW50W2ldLT5wc3lPdXRDaGFubmVsW2NoXTsKKworICAgICAgICAgICAgICAgIGNhbGN1bGF0ZVF1YW50W2NdW2ldW2NoXSA9CisgICAgICAgICAgICAgICAgICAgIDA7IC8qIGNhbGN1bGF0ZSBxdWFudGl6YXRpb24gb25seSBpZiBuZWNlc3NhcnkgKi8KKworICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgICAgICAgICBGREthYWNFbmNfUXVhbnRpemVTcGVjdHJ1bSgKKyAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPnNmYkNudCwgcHN5T3V0Q2gtPm1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+c2ZiUGVyR3JvdXAsIHBzeU91dENoLT5zZmJPZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICBxY091dENoLT5tZGN0U3BlY3RydW0sIHFjT3V0Q2gtPmdsb2JhbEdhaW4sIHFjT3V0Q2gtPnNjZiwKKyAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+cXVhbnRTcGVjLCBoUUMtPmRab25lUXVhbnRFbmFibGUpOworCisgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAgICAgICAgIGlmIChGREthYWNFbmNfY2FsY01heFZhbHVlSW5TZmIoCisgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+c2ZiQ250LCBwc3lPdXRDaC0+bWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaC0+c2ZiUGVyR3JvdXAsIHBzeU91dENoLT5zZmJPZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+cXVhbnRTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaC0+bWF4VmFsdWVJblNmYikgPiBNQVhfUVVBTlQpIHsKKyAgICAgICAgICAgICAgICAgIGNoQ29uc3RyYWludHNGdWxmaWxsZWRbY11baV1bY2hdID0gMDsKKyAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzRnVsZmlsbGVkW2NdW2ldID0gMDsKKyAgICAgICAgICAgICAgICAgIC8qIGlmIHF1YW5penRlZCB2YWx1ZSBvdXQgb2YgcmFuZ2U7IGluY3JlYXNlIGdsb2JhbCBnYWluISAqLworICAgICAgICAgICAgICAgICAgZGVjcmVhc2VCaXRDb25zdW1wdGlvbiA9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAgICAgICAgICAgIH0gLyogaWYgY2FsY3VsYXRlUXVhbnRbY11baV1bY2hdICovCisKKyAgICAgICAgICAgIH0gLyogY2hhbm5lbCBsb29wICovCisKKyAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgICAgIC8qIHF1YW50aXplIHNwZWN0cnVtIChwZXIgZWFjaCBjaGFubmVsKSAqLworCisgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICAgICAgICB9IHdoaWxlICghY29uc3RyYWludHNGdWxmaWxsZWRbY11baV0pOyAvKiBkb2VzIG5vdCByZWdhcmQgYml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtcHRpb24gKi8KIAogICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgICAgcWNFbGVtZW50W2NdW2ldLT5keW5CaXRzVXNlZCA9IDA7IC8qIHJlc2V0IGR5bmFtaWMgYml0cyAqLwogCi0gICAgICAgICAgICAgIGludCBlbWVyZ2VuY3lJdGVyYXRpb25zID0gMTsKLSAgICAgICAgICAgICAgaW50IGR5bkJpdHNPdmVyc2hvb3QgICAgPSAwOworICAgICAgICAgIC8qIHF1YW50aXphdGlvbiB2YWxpZCBpbiBjdXJyZW50IGNoYW5uZWwhICovCisgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaCA9IHFjRWxlbWVudFtjXVtpXS0+cWNPdXRDaGFubmVsW2NoXTsKKyAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2ggPQorICAgICAgICAgICAgICAgIHBzeU91dFtjXS0+cHN5T3V0RWxlbWVudFtpXS0+cHN5T3V0Q2hhbm5lbFtjaF07CiAKLSAgICAgICAgICAgICAgZm9yIChjID0gMCA7IGMgPCBuU3ViRnJhbWVzIDsgYysrICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8Y20tPm5FbGVtZW50czsgaSsrKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2ldOworICAgICAgICAgICAgLyogY291bnQgZHluYW1pYyBiaXRzICovCisgICAgICAgICAgICBJTlQgY2hEeW5CaXRzID0gRkRLYWFjRW5jX2R5bkJpdENvdW50KAorICAgICAgICAgICAgICAgIGhRQy0+aEJpdENvdW50ZXIsIHFjT3V0Q2gtPnF1YW50U3BlYywgcWNPdXRDaC0+bWF4VmFsdWVJblNmYiwKKyAgICAgICAgICAgICAgICBxY091dENoLT5zY2YsIHBzeU91dENoLT5sYXN0V2luZG93U2VxdWVuY2UsIHBzeU91dENoLT5zZmJDbnQsCisgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPm1heFNmYlBlckdyb3VwLCBwc3lPdXRDaC0+c2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgcHN5T3V0Q2gtPnNmYk9mZnNldHMsICZxY091dENoLT5zZWN0aW9uRGF0YSwgcHN5T3V0Q2gtPm5vaXNlTnJnLAorICAgICAgICAgICAgICAgIHBzeU91dENoLT5pc0Jvb2ssIHBzeU91dENoLT5pc1NjYWxlLCBzeW50YXhGbGFncyk7CiAKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKSB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIChlbEluZm8uZWxUeXBlID09IElEX0xGRSkpCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogaXRlcmF0aW9uIGxpbWl0YXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVtZXJnZW5jeUl0ZXJhdGlvbnMgJj0gKChpdGVyYXRpb25zW2NdW2ldIDwgaFFDLT5tYXhJdGVyYXRpb25zKSA/IDAgOiAxKTsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAvKiBkZXRlY3Rpb24gaWYgdXNlZCBkeW4gYml0cyBleGNlZWRzIHRoZSBtYXhpbWFsIGFsbG93ZWQgY3JpdGVyaW9uICovCi0gICAgICAgICAgICAgICAgICBkeW5CaXRzT3ZlcnNob290IHw9ICgocWNPdXRbY10tPnVzZWREeW5CaXRzID4gcWNPdXRbY10tPm1heER5bkJpdHMpID8gMSA6IDApOwotICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBzdW0gdXAgZHluYW1pYyBjaGFubmVsIGJpdHMgKi8KKyAgICAgICAgICAgIHFjRWxlbWVudFtjXVtpXS0+ZHluQml0c1VzZWQgKz0gY2hEeW5CaXRzOworICAgICAgICAgIH0KIAotICAgICAgICAgICAgICBpZiAocXVhbnRpemF0aW9uRG9uZT09MCB8fCBkeW5CaXRzT3ZlcnNob290KQotICAgICAgICAgICAgICB7CisgICAgICAgICAgLyogc2F2ZSBkeW5CaXRzVXNlZCBmb3IgY29ycmVjdGlvbiBvZiBiaXRzMnBlIHJlbGF0aW9uICovCisgICAgICAgICAgaWYgKGhRQy0+aEFkalRoci0+YWRqVGhyU3RhdGVFbGVtW2ldLT5keW5CaXRzTGFzdCA9PSAtMSkgeworICAgICAgICAgICAgaFFDLT5oQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1baV0tPmR5bkJpdHNMYXN0ID0KKyAgICAgICAgICAgICAgICBxY0VsZW1lbnRbY11baV0tPmR5bkJpdHNVc2VkOworICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgaW50IHN1bUJpdHNDb25zdW1lZFRvdGFsID0gRkRLYWFjRW5jX2dldFRvdGFsQ29uc3VtZWRCaXRzKHFjT3V0LCBxY0VsZW1lbnQsIGNtLCBoUUMtPmdsb2JIZHJCaXRzLCBuU3ViRnJhbWVzKTsKKyAgICAgICAgICAvKiBob2xkIHRvdGFsIGJpdCBjb25zdW1wdGlvbiBpbiBwcmVzZW50IGVsZW1lbnQgYmVsb3cgbWF4aW11bSBhbGxvd2VkCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKHFjRWxlbWVudFtjXVtpXS0+ZHluQml0c1VzZWQgPgorICAgICAgICAgICAgICAoKG5DaGFubmVscyAqIE1JTl9CVUZTSVpFX1BFUl9FRkZfQ0hBTikgLQorICAgICAgICAgICAgICAgcWNFbGVtZW50W2NdW2ldLT5zdGF0aWNCaXRzVXNlZCAtCisgICAgICAgICAgICAgICBxY0VsZW1lbnRbY11baV0tPmV4dEJpdHNVc2VkKSkgeworICAgICAgICAgICAgY29uc3RyYWludHNGdWxmaWxsZWRbY11baV0gPSAwOworICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgaWYgKCAoc3VtRHluQml0c0NvbnN1bWVkVG90YWwgPj0gYXZnVG90YWxEeW5CaXRzKSB8fCAoc3VtRHluQml0c0NvbnN1bWVkVG90YWw9PTApICkgewotICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXphdGlvbkRvbmUgPSAxOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgaWYgKGVtZXJnZW5jeUl0ZXJhdGlvbnMgJiYgKHN1bUJpdHNDb25zdW1lZFRvdGFsIDwgdG90YWxBdmFpbGFibGVCaXRzKSkgewotICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXphdGlvbkRvbmUgPSAxOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgaWYgKChzdW1CaXRzQ29uc3VtZWRUb3RhbCA+IHRvdGFsQXZhaWxhYmxlQml0cykgfHwgIWNoZWNrTWluRnJhbWVCaXRzRGVtYW5kKHFjT3V0LGhRQy0+bWluQml0c1BlckZyYW1lLG5TdWJGcmFtZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uRG9uZSA9IDA7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBpZiAoKHN1bUJpdHNDb25zdW1lZFRvdGFsIDwgdG90YWxBdmFpbGFibGVCaXRzKSAmJiBjaGVja01pbkZyYW1lQml0c0RlbWFuZChxY091dCxoUUMtPm1pbkJpdHNQZXJGcmFtZSxuU3ViRnJhbWVzKSkgewotICAgICAgICAgICAgICAgICAgICAgIGRlY3JlYXNlQml0Q29uc3VtcHRpb24gPSAwOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgZGVjcmVhc2VCaXRDb25zdW1wdGlvbiA9IDE7Ci0gICAgICAgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKCFjb25zdHJhaW50c0Z1bGZpbGxlZFtjXVtpXSk7CiAKLSAgICAgICAgICAgICAgICAgIGlmIChkeW5CaXRzT3ZlcnNob290KSB7Ci0gICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMDsKLSAgICAgICAgICAgICAgICAgICAgIGRlY3JlYXNlQml0Q29uc3VtcHRpb24gPSAxOwotICAgICAgICAgICAgICAgICAgfQorICAgICAgfSAvKiAgLWVuZC0gaWYoSURfU0NFIHx8IElEX0NQRSB8fCBJRF9MRkUpICovCiAKLSAgICAgICAgICAgICAgICAgIC8qIHJlc2V0IGNvbnN0cmFpbnRzIGZ1bGxmaWxsZWQgZmxhZ3MgKi8KLSAgICAgICAgICAgICAgICAgIEZES21lbWNsZWFyKGNvbnN0cmFpbnRzRnVsZmlsbGVkLCBzaXplb2YoY29uc3RyYWludHNGdWxmaWxsZWQpKTsKLSAgICAgICAgICAgICAgICAgIEZES21lbWNsZWFyKGNoQ29uc3RyYWludHNGdWxmaWxsZWQsIHNpemVvZihjaENvbnN0cmFpbnRzRnVsZmlsbGVkKSk7CisgICAgfSAvKiAtZW5kLSBlbGVtZW50IGxvb3AgKi8KIAorICAgIC8qIHVwZGF0ZSBkeW5CaXRzIG9mIGN1cnJlbnQgc3ViRnJhbWUgKi8KKyAgICBGREthYWNFbmNfdXBkYXRlVXNlZER5bkJpdHMoJnFjT3V0W2NdLT51c2VkRHluQml0cywgcWNFbGVtZW50W2NdLCBjbSk7CiAKLSAgICAgICAgICAgICAgfS8qIHF1YW50aXphdGlvbkRvbmUgKi8KKyAgICAvKiBnZXQgdG90YWwgY29uc3VtZWQgYml0cywgZHluIGJpdHMgaW4gYWxsIHN1YiBmcmFtZXMgaGF2ZSB0byBiZSB2YWxpZCAqLworICAgIHN1bUR5bkJpdHNDb25zdW1lZFRvdGFsID0KKyAgICAgICAgRkRLYWFjRW5jX2dldFRvdGFsQ29uc3VtZWREeW5CaXRzKHFjT3V0LCBuU3ViRnJhbWVzKTsKIAotICAgICAgfSB3aGlsZSAoIXF1YW50aXphdGlvbkRvbmUpIDsKKyAgICBpZiAoc3VtRHluQml0c0NvbnN1bWVkVG90YWwgPT0gLTEpIHsKKyAgICAgIHF1YW50aXphdGlvbkRvbmUgPSAwOyAvKiBiaXQgY29uc3VtcHRpb24gbm90IHZhbGlkIGluIGFsbCBzdWIgZnJhbWVzICovCisgICAgfSBlbHNlIHsKKyAgICAgIGludCBzdW1CaXRzQ29uc3VtZWRUb3RhbCA9IEZES2FhY0VuY19nZXRUb3RhbENvbnN1bWVkQml0cygKKyAgICAgICAgICBxY091dCwgcWNFbGVtZW50LCBjbSwgaFFDLT5nbG9iSGRyQml0cywgblN1YkZyYW1lcyk7CiAKLSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgIC8qIC4uLiAtZW5kLSBRdWFudGl6YXRpb24gbG9vcCAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgIC8qIGluIGFsbCBmcmFtZXMgYXJlIHZhbGlkIGR5bmFtaWMgYml0cyAqLworICAgICAgaWYgKCgoc3VtQml0c0NvbnN1bWVkVG90YWwgPCB0b3RhbEF2YWlsYWJsZUJpdHMpIHx8CisgICAgICAgICAgIHN1bUR5bkJpdHNDb25zdW1lZFRvdGFsID09IDApICYmCisgICAgICAgICAgKGRlY3JlYXNlQml0Q29uc3VtcHRpb24gPT0gMSkgJiYKKyAgICAgICAgICBjaGVja01pbkZyYW1lQml0c0RlbWFuZChxY091dCwgaFFDLT5taW5CaXRzUGVyRnJhbWUsIG5TdWJGcmFtZXMpCisgICAgICAgICAgLyooKSovKSB7CisgICAgICAgIHF1YW50aXphdGlvbkRvbmUgPSAxOyAvKiBleGl0IGJpdCBhZGp1c3RtZW50ICovCisgICAgICB9CisgICAgICBpZiAoc3VtQml0c0NvbnN1bWVkVG90YWwgPiB0b3RhbEF2YWlsYWJsZUJpdHMgJiYKKyAgICAgICAgICAoZGVjcmVhc2VCaXRDb25zdW1wdGlvbiA9PSAwKSkgeworICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMDsgLyogcmVzZXQhICovCisgICAgICB9CisgICAgfQorCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAgaW50IGVtZXJnZW5jeUl0ZXJhdGlvbnMgPSAxOworICAgIGludCBkeW5CaXRzT3ZlcnNob290ID0gMDsKKworICAgIGZvciAoYyA9IDA7IGMgPCBuU3ViRnJhbWVzOyBjKyspIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjbS0+bkVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbyA9IGNtLT5lbEluZm9baV07CisKKyAgICAgICAgaWYgKChlbEluZm8uZWxUeXBlID09IElEX1NDRSkgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKSB8fAorICAgICAgICAgICAgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSkgeworICAgICAgICAgIC8qIGl0ZXJhdGlvbiBsaW1pdGF0aW9uICovCisgICAgICAgICAgZW1lcmdlbmN5SXRlcmF0aW9ucyAmPQorICAgICAgICAgICAgICAoKGl0ZXJhdGlvbnNbY11baV0gPCBoUUMtPm1heEl0ZXJhdGlvbnMpID8gMCA6IDEpOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBkZXRlY3Rpb24gaWYgdXNlZCBkeW4gYml0cyBleGNlZWRzIHRoZSBtYXhpbWFsIGFsbG93ZWQgY3JpdGVyaW9uICovCisgICAgICBkeW5CaXRzT3ZlcnNob290IHw9CisgICAgICAgICAgKChxY091dFtjXS0+dXNlZER5bkJpdHMgPiBxY091dFtjXS0+bWF4RHluQml0cykgPyAxIDogMCk7CisgICAgfQorCisgICAgaWYgKHF1YW50aXphdGlvbkRvbmUgPT0gMCB8fCBkeW5CaXRzT3ZlcnNob290KSB7CisgICAgICBpbnQgc3VtQml0c0NvbnN1bWVkVG90YWwgPSBGREthYWNFbmNfZ2V0VG90YWxDb25zdW1lZEJpdHMoCisgICAgICAgICAgcWNPdXQsIHFjRWxlbWVudCwgY20sIGhRQy0+Z2xvYkhkckJpdHMsIG5TdWJGcmFtZXMpOworCisgICAgICBpZiAoKHN1bUR5bkJpdHNDb25zdW1lZFRvdGFsID49IGF2Z1RvdGFsRHluQml0cykgfHwKKyAgICAgICAgICAoc3VtRHluQml0c0NvbnN1bWVkVG90YWwgPT0gMCkpIHsKKyAgICAgICAgcXVhbnRpemF0aW9uRG9uZSA9IDE7CisgICAgICB9CisgICAgICBpZiAoZW1lcmdlbmN5SXRlcmF0aW9ucyAmJiAoc3VtQml0c0NvbnN1bWVkVG90YWwgPCB0b3RhbEF2YWlsYWJsZUJpdHMpKSB7CisgICAgICAgIHF1YW50aXphdGlvbkRvbmUgPSAxOworICAgICAgfQorICAgICAgaWYgKChzdW1CaXRzQ29uc3VtZWRUb3RhbCA+IHRvdGFsQXZhaWxhYmxlQml0cykgfHwKKyAgICAgICAgICAhY2hlY2tNaW5GcmFtZUJpdHNEZW1hbmQocWNPdXQsIGhRQy0+bWluQml0c1BlckZyYW1lLCBuU3ViRnJhbWVzKSkgeworICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMDsKKyAgICAgIH0KKyAgICAgIGlmICgoc3VtQml0c0NvbnN1bWVkVG90YWwgPCB0b3RhbEF2YWlsYWJsZUJpdHMpICYmCisgICAgICAgICAgY2hlY2tNaW5GcmFtZUJpdHNEZW1hbmQocWNPdXQsIGhRQy0+bWluQml0c1BlckZyYW1lLCBuU3ViRnJhbWVzKSkgeworICAgICAgICBkZWNyZWFzZUJpdENvbnN1bXB0aW9uID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlY3JlYXNlQml0Q29uc3VtcHRpb24gPSAxOworICAgICAgfQorCisgICAgICBpZiAoZHluQml0c092ZXJzaG9vdCkgeworICAgICAgICBxdWFudGl6YXRpb25Eb25lID0gMDsKKyAgICAgICAgZGVjcmVhc2VCaXRDb25zdW1wdGlvbiA9IDE7CisgICAgICB9CisKKyAgICAgIC8qIHJlc2V0IGNvbnN0cmFpbnRzIGZ1bGxmaWxsZWQgZmxhZ3MgKi8KKyAgICAgIEZES21lbWNsZWFyKGNvbnN0cmFpbnRzRnVsZmlsbGVkLCBzaXplb2YoY29uc3RyYWludHNGdWxmaWxsZWQpKTsKKyAgICAgIEZES21lbWNsZWFyKGNoQ29uc3RyYWludHNGdWxmaWxsZWQsIHNpemVvZihjaENvbnN0cmFpbnRzRnVsZmlsbGVkKSk7CisKKyAgICB9IC8qIHF1YW50aXphdGlvbkRvbmUgKi8KKworICB9IHdoaWxlICghcXVhbnRpemF0aW9uRG9uZSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAvKiAuLi4gLWVuZC0gUXVhbnRpemF0aW9uIGxvb3AgICAgICAgICAgICAgICAgICovCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTExNzgsMTEyICsxMTMyLDk4IEBACiAgIHJldHVybiBBQUNfRU5DX09LOwogfQogCi0KLXN0YXRpYyBBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfcmVkdWNlQml0Q29uc3VtcHRpb24oaW50KiAgICAgICAgICAgICBpdGVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgbWF4SXRlcmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGdhaW5BZGp1c3RtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgICAgICAgICAgY2hDb25zdHJhaW50c0Z1bGZpbGxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgIGNhbGN1bGF0ZVF1YW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogcHN5T3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqICAgICAgICAgIHFjT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiAgcWNPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfQklUUyogICAgZWxCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgIHN5bnRheEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgZXBDb25maWcpCi17CitzdGF0aWMgQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3JlZHVjZUJpdENvbnN1bXB0aW9uKAorICAgIGludCogaXRlcmF0aW9ucywgY29uc3QgaW50IG1heEl0ZXJhdGlvbnMsIGludCBnYWluQWRqdXN0bWVudCwKKyAgICBpbnQqIGNoQ29uc3RyYWludHNGdWxmaWxsZWQsIGludCogY2FsY3VsYXRlUXVhbnQsIGludCBuQ2hhbm5lbHMsCisgICAgUFNZX09VVF9FTEVNRU5UKiBwc3lPdXRFbGVtZW50LCBRQ19PVVQqIHFjT3V0LCBRQ19PVVRfRUxFTUVOVCogcWNPdXRFbGVtZW50LAorICAgIEVMRU1FTlRfQklUUyogZWxCaXRzLCBBVURJT19PQkpFQ1RfVFlQRSBhb3QsIFVJTlQgc3ludGF4RmxhZ3MsCisgICAgU0NIQVIgZXBDb25maWcpIHsKICAgaW50IGNoOwogCiAgIC8qKiBTT0xWSU5HIFBST0JMRU0gKiovCi0gIGlmICgoKml0ZXJhdGlvbnMpKysgPj0gbWF4SXRlcmF0aW9ucykKLSAgewotICAgIGlmIChxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkPT0wKSB7Ci0gICAgfQotICAgIC8qIGNyYXNoIHJlY292ZXJ5ICovCi0gICAgZWxzZSB7Ci0gICAgICBJTlQgYml0c1RvU2F2ZSA9IDA7Ci0gICAgICBpZiAoIChiaXRzVG9TYXZlID0gZml4TWF4KChxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkICsgOCkgLSAoZWxCaXRzLT5iaXRSZXNMZXZlbEVsICsgcWNPdXRFbGVtZW50LT5ncmFudGVkRHluQml0cyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkICsgcWNPdXRFbGVtZW50LT5zdGF0aWNCaXRzVXNlZCArIDgpIC0gKGVsQml0cy0+bWF4Qml0c0VsKSkpID4gMCApCi0gICAgICB7Ci0gICAgICAgIEZES2FhY0VuY19jcmFzaFJlY292ZXJ5KG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgIHFjT3V0LAotICAgICAgICAgICAgICAgICAgICAgIHFjT3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICBiaXRzVG9TYXZlLAotICAgICAgICAgICAgICAgICAgICAgIGFvdCwKLSAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZykgOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKQotICAgICAgewotICAgICAgICAgIHFjT3V0RWxlbWVudC0+cWNPdXRDaGFubmVsW2NoXS0+Z2xvYmFsR2FpbiArPSAxOwotICAgICAgfQotICAgIH0KLSAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCi0gICAgewotICAgICAgY2FsY3VsYXRlUXVhbnRbY2hdID0gMTsKLSAgICB9Ci0gIH0KLSAgfQotICBlbHNlIC8qIGl0ZXJhdGlvbnMgPj0gbWF4SXRlcmF0aW9ucyAqLwotICB7CisgIGlmICgoKml0ZXJhdGlvbnMpIDwgbWF4SXRlcmF0aW9ucykgewogICAgIC8qIGluY3JlYXNlIGdhaW4gKCsgbmV4dCBpdGVyYXRpb24pICovCi0gICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKQotICAgIHsKLSAgICAgIGlmKCFjaENvbnN0cmFpbnRzRnVsZmlsbGVkW2NoXSkKLSAgICAgIHsKLSAgICAgICAgICBxY091dEVsZW1lbnQtPnFjT3V0Q2hhbm5lbFtjaF0tPmdsb2JhbEdhaW4gKz0gZ2FpbkFkanVzdG1lbnQgOwotICAgICAgICAgIGNhbGN1bGF0ZVF1YW50W2NoXSA9IDE7IC8qIGdsb2JhbCBnYWluIGhhcyBjaGFuZ2VkLCByZWNhbGN1bGF0ZSBxdWFudGl6YXRpb24gaW4gbmV4dCBpdGVyYXRpb24hICovCisgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgICBpZiAoIWNoQ29uc3RyYWludHNGdWxmaWxsZWRbY2hdKSB7CisgICAgICAgIHFjT3V0RWxlbWVudC0+cWNPdXRDaGFubmVsW2NoXS0+Z2xvYmFsR2FpbiArPSBnYWluQWRqdXN0bWVudDsKKyAgICAgICAgY2FsY3VsYXRlUXVhbnRbY2hdID0gMTsgLyogZ2xvYmFsIGdhaW4gaGFzIGNoYW5nZWQsIHJlY2FsY3VsYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXphdGlvbiBpbiBuZXh0IGl0ZXJhdGlvbiEgKi8KICAgICAgIH0KICAgICB9CisgIH0gZWxzZSBpZiAoKCppdGVyYXRpb25zKSA9PSBtYXhJdGVyYXRpb25zKSB7CisgICAgaWYgKHFjT3V0RWxlbWVudC0+ZHluQml0c1VzZWQgPT0gMCkgeworICAgICAgcmV0dXJuIEFBQ19FTkNfUVVBTlRfRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGNyYXNoIHJlY292ZXJ5ICovCisgICAgICBJTlQgYml0c1RvU2F2ZSA9IDA7CisgICAgICBpZiAoKGJpdHNUb1NhdmUgPSBmaXhNYXgoCisgICAgICAgICAgICAgICAocWNPdXRFbGVtZW50LT5keW5CaXRzVXNlZCArIDgpIC0KKyAgICAgICAgICAgICAgICAgICAoZWxCaXRzLT5iaXRSZXNMZXZlbEVsICsgcWNPdXRFbGVtZW50LT5ncmFudGVkRHluQml0cyksCisgICAgICAgICAgICAgICAocWNPdXRFbGVtZW50LT5keW5CaXRzVXNlZCArIHFjT3V0RWxlbWVudC0+c3RhdGljQml0c1VzZWQgKyA4KSAtCisgICAgICAgICAgICAgICAgICAgKGVsQml0cy0+bWF4Qml0c0VsKSkpID4gMCkgeworICAgICAgICBGREthYWNFbmNfY3Jhc2hSZWNvdmVyeShuQ2hhbm5lbHMsIHBzeU91dEVsZW1lbnQsIHFjT3V0LCBxY091dEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHNUb1NhdmUsIGFvdCwgc3ludGF4RmxhZ3MsIGVwQ29uZmlnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworICAgICAgICAgIHFjT3V0RWxlbWVudC0+cWNPdXRDaGFubmVsW2NoXS0+Z2xvYmFsR2FpbiArPSAxOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgY2FsY3VsYXRlUXVhbnRbY2hdID0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogKCppdGVyYXRpb25zKSA+IG1heEl0ZXJhdGlvbnMgKi8KKyAgICByZXR1cm4gQUFDX0VOQ19RVUFOVF9FUlJPUjsKICAgfQorICAoKml0ZXJhdGlvbnMpKys7CiAKICAgcmV0dXJuIEFBQ19FTkNfT0s7CiB9CiAKLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY191cGRhdGVGaWxsQml0cyhDSEFOTkVMX01BUFBJTkcqICAgICAgICAgIGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX1NUQVRFKiAgICAgICAgICAgICAgICAgcWNLZXJuZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9CSVRTKiBSRVNUUklDVCAgICBlbEJpdHNbKDgpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqKiAgICAgICAgICAgICAgICAgIHFjT3V0KQoteworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX3VwZGF0ZUZpbGxCaXRzKENIQU5ORUxfTUFQUElORyogY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfU1RBVEUqIHFjS2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfQklUUyogUkVTVFJJQ1QgZWxCaXRzWygoOCkpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqKiBxY091dCkgewogICBzd2l0Y2ggKHFjS2VybmVsLT5iaXRyYXRlTW9kZSkgewogICAgIGNhc2UgUUNEQVRBX0JSX01PREVfU0ZSOgogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFFDREFUQV9CUl9NT0RFX0ZGOgotICAgICAgIGJyZWFrOwotCisgICAgICBicmVhazsKICAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl8xOgogICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzI6CiAgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9WQlJfMzoKICAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl80OgogICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzU6Ci0gICAgICBxY091dFswXS0+dG90RmlsbEJpdHMgPSAocWNPdXRbMF0tPmdyYW50ZWREeW5CaXRzIC0gcWNPdXRbMF0tPnVzZWREeW5CaXRzKSY3OyAvKiBwcmVjYWxjdWxhdGUgYWxpZ25tZW50IGJpdHMgKi8KLSAgICAgIHFjT3V0WzBdLT50b3RhbEJpdHMgPSBxY091dFswXS0+c3RhdGljQml0cyArIHFjT3V0WzBdLT51c2VkRHluQml0cyArIHFjT3V0WzBdLT50b3RGaWxsQml0cyArIHFjT3V0WzBdLT5lbGVtZW50RXh0Qml0cyArIHFjT3V0WzBdLT5nbG9iYWxFeHRCaXRzOwotICAgICAgcWNPdXRbMF0tPnRvdEZpbGxCaXRzICs9ICggZml4TWF4KDAsIHFjS2VybmVsLT5taW5CaXRzUGVyRnJhbWUgLSBxY091dFswXS0+dG90YWxCaXRzKSArIDcpICYgfjc7CisgICAgICBxY091dFswXS0+dG90RmlsbEJpdHMgPQorICAgICAgICAgIChxY091dFswXS0+Z3JhbnRlZER5bkJpdHMgLSBxY091dFswXS0+dXNlZER5bkJpdHMpICYKKyAgICAgICAgICA3OyAvKiBwcmVjYWxjdWxhdGUgYWxpZ25tZW50IGJpdHMgKi8KKyAgICAgIHFjT3V0WzBdLT50b3RhbEJpdHMgPSBxY091dFswXS0+c3RhdGljQml0cyArIHFjT3V0WzBdLT51c2VkRHluQml0cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRbMF0tPnRvdEZpbGxCaXRzICsgcWNPdXRbMF0tPmVsZW1lbnRFeHRCaXRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dFswXS0+Z2xvYmFsRXh0Qml0czsKKyAgICAgIHFjT3V0WzBdLT50b3RGaWxsQml0cyArPQorICAgICAgICAgIChmaXhNYXgoMCwgcWNLZXJuZWwtPm1pbkJpdHNQZXJGcmFtZSAtIHFjT3V0WzBdLT50b3RhbEJpdHMpICsgNykgJiB+NzsKICAgICAgIGJyZWFrOwotCiAgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9DQlI6CiAgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9JTlZBTElEOgogICAgIGRlZmF1bHQ6Ci0gICAgICBJTlQgYml0UmVzU3BhY2UgPSBxY0tlcm5lbC0+Yml0UmVzVG90TWF4IC0gcWNLZXJuZWwtPmJpdFJlc1RvdCA7CisgICAgICBJTlQgYml0UmVzU3BhY2UgPSBxY0tlcm5lbC0+Yml0UmVzVG90TWF4IC0gcWNLZXJuZWwtPmJpdFJlc1RvdDsKICAgICAgIC8qIHByb2Nlc3NpbmcgZmlsbC1iaXRzICovCi0gICAgICBJTlQgZGVsdGFCaXRSZXMgPSBxY091dFswXS0+Z3JhbnRlZER5bkJpdHMgLSBxY091dFswXS0+dXNlZER5bkJpdHMgOwotICAgICAgcWNPdXRbMF0tPnRvdEZpbGxCaXRzID0gZml4TWF4KChkZWx0YUJpdFJlcyY3KSwgKGRlbHRhQml0UmVzIC0gKGZpeE1heCgwLGJpdFJlc1NwYWNlLTcpJn43KSkpOwotICAgICAgcWNPdXRbMF0tPnRvdGFsQml0cyA9IHFjT3V0WzBdLT5zdGF0aWNCaXRzICsgcWNPdXRbMF0tPnVzZWREeW5CaXRzICsgcWNPdXRbMF0tPnRvdEZpbGxCaXRzICsgcWNPdXRbMF0tPmVsZW1lbnRFeHRCaXRzICsgcWNPdXRbMF0tPmdsb2JhbEV4dEJpdHM7Ci0gICAgICBxY091dFswXS0+dG90RmlsbEJpdHMgKz0gKCBmaXhNYXgoMCwgcWNLZXJuZWwtPm1pbkJpdHNQZXJGcmFtZSAtIHFjT3V0WzBdLT50b3RhbEJpdHMpICsgNykgJiB+NzsKKyAgICAgIElOVCBkZWx0YUJpdFJlcyA9IHFjT3V0WzBdLT5ncmFudGVkRHluQml0cyAtIHFjT3V0WzBdLT51c2VkRHluQml0czsKKyAgICAgIHFjT3V0WzBdLT50b3RGaWxsQml0cyA9IGZpeE1heCgKKyAgICAgICAgICAoZGVsdGFCaXRSZXMgJiA3KSwgKGRlbHRhQml0UmVzIC0gKGZpeE1heCgwLCBiaXRSZXNTcGFjZSAtIDcpICYgfjcpKSk7CisgICAgICBxY091dFswXS0+dG90YWxCaXRzID0gcWNPdXRbMF0tPnN0YXRpY0JpdHMgKyBxY091dFswXS0+dXNlZER5bkJpdHMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0WzBdLT50b3RGaWxsQml0cyArIHFjT3V0WzBdLT5lbGVtZW50RXh0Qml0cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRbMF0tPmdsb2JhbEV4dEJpdHM7CisgICAgICBxY091dFswXS0+dG90RmlsbEJpdHMgKz0KKyAgICAgICAgICAoZml4TWF4KDAsIHFjS2VybmVsLT5taW5CaXRzUGVyRnJhbWUgLSBxY091dFswXS0+dG90YWxCaXRzKSArIDcpICYgfjc7CiAgICAgICBicmVhazsKICAgfSAvKiBzd2l0Y2ggKHFjS2VybmVsLT5iaXRyYXRlTW9kZSkgKi8KIAogICByZXR1cm4gQUFDX0VOQ19PSzsKIH0KIAotCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19jYWxjTWF4VmFsdWVJblNmYgpAQCAtMTI5MiwzNCArMTIzMiwyOSBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgSU5UIEZES2FhY0VuY19jYWxjTWF4VmFsdWVJblNmYihJTlQgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIG1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAqUkVTVFJJQ1Qgc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqUkVTVFJJQ1QgcXVhbnRTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqUkVTVFJJQ1QgbWF4VmFsdWUpCi17Ci0gIElOVCBzZmJPZmZzLHNmYjsKK3N0YXRpYyBJTlQgRkRLYWFjRW5jX2NhbGNNYXhWYWx1ZUluU2ZiKElOVCBzZmJDbnQsIElOVCBtYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzZmJQZXJHcm91cCwgSU5UKiBSRVNUUklDVCBzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCogUkVTVFJJQ1QgcXVhbnRTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQqIFJFU1RSSUNUIG1heFZhbHVlKSB7CisgIElOVCBzZmJPZmZzLCBzZmI7CiAgIElOVCBtYXhWYWx1ZUFsbCA9IDA7CiAKLSAgZm9yIChzZmJPZmZzPTA7c2ZiT2ZmczxzZmJDbnQ7c2ZiT2Zmcys9c2ZiUGVyR3JvdXApCi0gICAgZm9yIChzZmIgPSAwOyBzZmIgPCBtYXhTZmJQZXJHcm91cDsgc2ZiKyspCi0gICAgeworICBmb3IgKHNmYk9mZnMgPSAwOyBzZmJPZmZzIDwgc2ZiQ250OyBzZmJPZmZzICs9IHNmYlBlckdyb3VwKQorICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgbWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CiAgICAgICBJTlQgbGluZTsKICAgICAgIElOVCBtYXhUaGlzU2ZiID0gMDsKLSAgICAgIGZvciAobGluZSA9IHNmYk9mZnNldFtzZmJPZmZzK3NmYl07IGxpbmUgPCBzZmJPZmZzZXRbc2ZiT2ZmcytzZmIrMV07IGxpbmUrKykKLSAgICAgIHsKKyAgICAgIGZvciAobGluZSA9IHNmYk9mZnNldFtzZmJPZmZzICsgc2ZiXTsgbGluZSA8IHNmYk9mZnNldFtzZmJPZmZzICsgc2ZiICsgMV07CisgICAgICAgICAgIGxpbmUrKykgewogICAgICAgICBJTlQgdG1wID0gZml4cF9hYnMocXVhbnRTcGVjdHJ1bVtsaW5lXSk7CiAgICAgICAgIG1heFRoaXNTZmIgPSBmaXhNYXgodG1wLCBtYXhUaGlzU2ZiKTsKICAgICAgIH0KIAotICAgICAgbWF4VmFsdWVbc2ZiT2ZmcytzZmJdID0gbWF4VGhpc1NmYjsKKyAgICAgIG1heFZhbHVlW3NmYk9mZnMgKyBzZmJdID0gbWF4VGhpc1NmYjsKICAgICAgIG1heFZhbHVlQWxsID0gZml4TWF4KG1heFRoaXNTZmIsIG1heFZhbHVlQWxsKTsKICAgICB9CiAgIHJldHVybiBtYXhWYWx1ZUFsbDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICAgICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX3VwZGF0ZUJpdHJlcwpAQCAtMTMyNywyMSArMTI2MiwxOCBAQAogICAgICAgICAgcmV0dXJuOgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBGREthYWNFbmNfdXBkYXRlQml0cmVzKENIQU5ORUxfTUFQUElORyAqY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfU1RBVEUqIHFjS2VybmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCoqIHFjT3V0KQotewordm9pZCBGREthYWNFbmNfdXBkYXRlQml0cmVzKENIQU5ORUxfTUFQUElORyogY20sIFFDX1NUQVRFKiBxY0tlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqKiBxY091dCkgewogICBzd2l0Y2ggKHFjS2VybmVsLT5iaXRyYXRlTW9kZSkgewotICAgIGNhc2UgUUNEQVRBX0JSX01PREVfRkY6CiAgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9WQlJfMToKICAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl8yOgogICAgIGNhc2UgUUNEQVRBX0JSX01PREVfVkJSXzM6CiAgICAgY2FzZSBRQ0RBVEFfQlJfTU9ERV9WQlJfNDoKICAgICBjYXNlIFFDREFUQV9CUl9NT0RFX1ZCUl81OgogICAgICAgLyogdmFyaWFibGUgYml0cmF0ZSAqLwotICAgICAgcWNLZXJuZWwtPmJpdFJlc1RvdCA9IEZES21pbihxY0tlcm5lbC0+bWF4Qml0c1BlckZyYW1lLCBxY0tlcm5lbC0+Yml0UmVzVG90TWF4KTsKKyAgICAgIHFjS2VybmVsLT5iaXRSZXNUb3QgPQorICAgICAgICAgIGZNaW4ocWNLZXJuZWwtPm1heEJpdHNQZXJGcmFtZSwgcWNLZXJuZWwtPmJpdFJlc1RvdE1heCk7CiAgICAgICBicmVhazsKLQogICAgIGNhc2UgUUNEQVRBX0JSX01PREVfQ0JSOgogICAgIGNhc2UgUUNEQVRBX0JSX01PREVfU0ZSOgogICAgIGNhc2UgUUNEQVRBX0JSX01PREVfSU5WQUxJRDoKQEAgLTEzNDksNyArMTI4MSw5IEBACiAgICAgICBpbnQgYyA9IDA7CiAgICAgICAvKiBjb25zdGFudCBiaXRyYXRlICovCiAgICAgICB7Ci0gICAgICAgIHFjS2VybmVsLT5iaXRSZXNUb3QgKz0gcWNPdXRbY10tPmdyYW50ZWREeW5CaXRzIC0gKHFjT3V0W2NdLT51c2VkRHluQml0cyArIHFjT3V0W2NdLT50b3RGaWxsQml0cyArIHFjT3V0W2NdLT5hbGlnbkJpdHMpOworICAgICAgICBxY0tlcm5lbC0+Yml0UmVzVG90ICs9IHFjT3V0W2NdLT5ncmFudGVkRHluQml0cyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHFjT3V0W2NdLT51c2VkRHluQml0cyArIHFjT3V0W2NdLT50b3RGaWxsQml0cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0W2NdLT5hbGlnbkJpdHMpOwogICAgICAgfQogICAgICAgYnJlYWs7CiAgIH0KQEAgLTEzNjIsNTcgKzEyOTYsNTkgQEAKICAgICAgICAgIHJldHVybjoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19GaW5hbGl6ZUJpdENvbnN1bXB0aW9uKENIQU5ORUxfTUFQUElORyAqY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19TVEFURSAqcWNLZXJuZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQgKnFjT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqKiBxY0VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFICAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgICAgZXBDb25maWcpCi17CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfRmluYWxpemVCaXRDb25zdW1wdGlvbigKKyAgICBDSEFOTkVMX01BUFBJTkcqIGNtLCBRQ19TVEFURSogcWNLZXJuZWwsIFFDX09VVCogcWNPdXQsCisgICAgUUNfT1VUX0VMRU1FTlQqKiBxY0VsZW1lbnQsIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAorICAgIEFVRElPX09CSkVDVF9UWVBFIGFvdCwgVUlOVCBzeW50YXhGbGFncywgU0NIQVIgZXBDb25maWcpIHsKICAgUUNfT1VUX0VYVEVOU0lPTiBmaWxsRXh0UGF5bG9hZDsKICAgSU5UIHRvdEZpbGxCaXRzLCBhbGlnbkJpdHM7CiAKICAgLyogR2V0IHRvdGFsIGNvbnN1bWVkIGJpdHMgaW4gQVUgKi8KLSAgcWNPdXQtPnRvdGFsQml0cyA9IHFjT3V0LT5zdGF0aWNCaXRzICsgcWNPdXQtPnVzZWREeW5CaXRzICArIHFjT3V0LT50b3RGaWxsQml0cyArCi0gICAgICAgICAgICAgICAgICAgICBxY091dC0+ZWxlbWVudEV4dEJpdHMgKyBxY091dC0+Z2xvYmFsRXh0Qml0czsKKyAgcWNPdXQtPnRvdGFsQml0cyA9IHFjT3V0LT5zdGF0aWNCaXRzICsgcWNPdXQtPnVzZWREeW5CaXRzICsKKyAgICAgICAgICAgICAgICAgICAgIHFjT3V0LT50b3RGaWxsQml0cyArIHFjT3V0LT5lbGVtZW50RXh0Qml0cyArCisgICAgICAgICAgICAgICAgICAgICBxY091dC0+Z2xvYmFsRXh0Qml0czsKIAotICBpZiAocWNLZXJuZWwtPmJpdHJhdGVNb2RlPT1RQ0RBVEFfQlJfTU9ERV9DQlIpIHsKLQotICAgIC8qIE5vdyB3ZSBjYW4gZ2V0IHRoZSBleGFjdCB0cmFuc3BvcnQgYml0IGFtb3VudCwgYW5kIGhvcGVmdWxseSBpdCBpcyBlcXVhbCB0byB0aGUgZXN0aW1hdGVkIHZhbHVlICovCisgIGlmIChxY0tlcm5lbC0+Yml0cmF0ZU1vZGUgPT0gUUNEQVRBX0JSX01PREVfQ0JSKSB7CisgICAgLyogTm93IHdlIGNhbiBnZXQgdGhlIGV4YWN0IHRyYW5zcG9ydCBiaXQgYW1vdW50LCBhbmQgaG9wZWZ1bGx5IGl0IGlzIGVxdWFsCisgICAgICogdG8gdGhlIGVzdGltYXRlZCB2YWx1ZSAqLwogICAgIElOVCBleGFjdFRwQml0cyA9IHRyYW5zcG9ydEVuY19HZXRTdGF0aWNCaXRzKGhUcEVuYywgcWNPdXQtPnRvdGFsQml0cyk7CiAKICAgICBpZiAoZXhhY3RUcEJpdHMgIT0gcWNLZXJuZWwtPmdsb2JIZHJCaXRzKSB7CiAgICAgICBJTlQgZGlmZkZpbGxCaXRzID0gMDsKIAotICAgICAgLyogSG93IG1hbnkgYml0cyBjYW4gYmUgdGFrZW4gYnkgYml0cmVzZXJ2b2lyICovCi0gICAgICBjb25zdCBJTlQgYml0cmVzU3BhY2UgPSBxY0tlcm5lbC0+Yml0UmVzVG90TWF4IC0gKHFjS2VybmVsLT5iaXRSZXNUb3QgKyAocWNPdXQtPmdyYW50ZWREeW5CaXRzIC0gKHFjT3V0LT51c2VkRHluQml0cyArIHFjT3V0LT50b3RGaWxsQml0cykgKSApOworICAgICAgLyogSG93IG1hbnkgYml0cyBjYW4gYmUgdGFrZSBieSBiaXRyZXNlcnZvaXIgKi8KKyAgICAgIGNvbnN0IElOVCBiaXRyZXNTcGFjZSA9CisgICAgICAgICAgcWNLZXJuZWwtPmJpdFJlc1RvdE1heCAtCisgICAgICAgICAgKHFjS2VybmVsLT5iaXRSZXNUb3QgKworICAgICAgICAgICAocWNPdXQtPmdyYW50ZWREeW5CaXRzIC0gKHFjT3V0LT51c2VkRHluQml0cyArIHFjT3V0LT50b3RGaWxsQml0cykpKTsKIAogICAgICAgLyogTnVtYmVyIG9mIGJpdHMgd2hpY2ggY2FuIGJlIG1vdmVkIHRvIGJpdHJlc2Vydm9pci4gKi8KICAgICAgIGNvbnN0IElOVCBiaXRzVG9CaXRyZXMgPSBxY0tlcm5lbC0+Z2xvYkhkckJpdHMgLSBleGFjdFRwQml0czsKLSAgICAgIEZES19BU1NFUlQoYml0c1RvQml0cmVzPj0wKTsgLyogaXMgYWx3YXlzIHBvc2l0aXZlICovCisgICAgICBGREtfQVNTRVJUKGJpdHNUb0JpdHJlcyA+PSAwKTsgLyogaXMgYWx3YXlzIHBvc2l0aXZlICovCiAKLSAgICAgIC8qIElmIGJpdHJlc2Vydm9pciBjYW4gbm90IHRha2UgYWxsIGJpdHMsIG1vdmUgcmFtYWluaW5nIGJpdHMgdG8gZmlsbGJpdHMgKi8KLSAgICAgIGRpZmZGaWxsQml0cyA9IEZES21heCgwLCBiaXRzVG9CaXRyZXMgLSBiaXRyZXNTcGFjZSk7CisgICAgICAvKiBJZiBiaXRyZXNlcnZvaXIgY2FuIG5vdCB0YWtlIGFsbCBiaXRzLCBtb3ZlIHJhbWFpbmluZyBiaXRzIHRvIGZpbGxiaXRzCisgICAgICAgKi8KKyAgICAgIGRpZmZGaWxsQml0cyA9IGZNYXgoMCwgYml0c1RvQml0cmVzIC0gYml0cmVzU3BhY2UpOwogCiAgICAgICAvKiBBc3N1cmUgcHJldmlvdXMgYWxpZ25tZW50ICovCi0gICAgICBkaWZmRmlsbEJpdHMgPSAoZGlmZkZpbGxCaXRzKzcpJn43OworICAgICAgZGlmZkZpbGxCaXRzID0gKGRpZmZGaWxsQml0cyArIDcpICYgfjc7CiAKICAgICAgIC8qIE1vdmUgYXMgbWFueSBiaXRzIGFzIHBvc3NpYmxlIHRvIGJpdHJlc2Vydm9pciAqLwotICAgICAgcWNLZXJuZWwtPmJpdFJlc1RvdCAgICArPSAoYml0c1RvQml0cmVzLWRpZmZGaWxsQml0cyk7CisgICAgICBxY0tlcm5lbC0+Yml0UmVzVG90ICs9IChiaXRzVG9CaXRyZXMgLSBkaWZmRmlsbEJpdHMpOwogCiAgICAgICAvKiBXcml0ZSByZW1haW5nIGJpdHMgYXMgZmlsbCBiaXRzICovCi0gICAgICBxY091dC0+dG90RmlsbEJpdHMgICAgICs9IGRpZmZGaWxsQml0czsKLSAgICAgIHFjT3V0LT50b3RhbEJpdHMgICAgICAgKz0gZGlmZkZpbGxCaXRzOwotICAgICAgcWNPdXQtPmdyYW50ZWREeW5CaXRzICArPSBkaWZmRmlsbEJpdHM7CisgICAgICBxY091dC0+dG90RmlsbEJpdHMgKz0gZGlmZkZpbGxCaXRzOworICAgICAgcWNPdXQtPnRvdGFsQml0cyArPSBkaWZmRmlsbEJpdHM7CisgICAgICBxY091dC0+Z3JhbnRlZER5bkJpdHMgKz0gZGlmZkZpbGxCaXRzOwogCiAgICAgICAvKiBHZXQgbmV3IGhlYWRlciBiaXRzICovCi0gICAgICBxY0tlcm5lbC0+Z2xvYkhkckJpdHMgPSB0cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cyhoVHBFbmMsIHFjT3V0LT50b3RhbEJpdHMpOworICAgICAgcWNLZXJuZWwtPmdsb2JIZHJCaXRzID0KKyAgICAgICAgICB0cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cyhoVHBFbmMsIHFjT3V0LT50b3RhbEJpdHMpOwogCiAgICAgICBpZiAocWNLZXJuZWwtPmdsb2JIZHJCaXRzICE9IGV4YWN0VHBCaXRzKSB7Ci0gICAgICAgIC8qIEluIHByZXZpb3VzIHN0ZXAsIGZpbGwgYml0cyBhbmQgY29ycmVzcG9uZGluZyB0b3RhbCBiaXRzIHdlcmUgY2hhbmdlZCB3aGVuIGJpdHJlc2Vydm9pciB3YXMgY29tcGxldGVseSBmaWxsZWQuCi0gICAgICAgICAgIE5vdyB3ZSBjYW4gdGFrZSB0aGUgdG9vIG11Y2ggdGFrZW4gYml0cyBjYXVzZWQgYnkgaGVhZGVyIG92ZXJoZWFkIGZyb20gYml0cmVzZXJ2b2lyLgorICAgICAgICAvKiBJbiBwcmV2aW91cyBzdGVwLCBmaWxsIGJpdHMgYW5kIGNvcnJlc3BvbmRpbmcgdG90YWwgYml0cyB3ZXJlIGNoYW5nZWQKKyAgICAgICAgICAgd2hlbiBiaXRyZXNlcnZvaXIgd2FzIGNvbXBsZXRlbHkgZmlsbGVkLiBOb3cgd2UgY2FuIHRha2UgdGhlIHRvbyBtdWNoCisgICAgICAgICAgIHRha2VuIGJpdHMgY2F1c2VkIGJ5IGhlYWRlciBvdmVyaGVhZCBmcm9tIGJpdHJlc2Vydm9pci4KICAgICAgICAgICovCiAgICAgICAgIHFjS2VybmVsLT5iaXRSZXNUb3QgLT0gKHFjS2VybmVsLT5nbG9iSGRyQml0cyAtIGV4YWN0VHBCaXRzKTsKICAgICAgIH0KQEAgLTE0MzIsMjYgKzEzNjgsMjggQEAKICAgZmlsbEV4dFBheWxvYWQudHlwZSA9IEVYVF9GSUxMX0RBVEE7CiAgIGZpbGxFeHRQYXlsb2FkLm5QYXlsb2FkQml0cyA9IHRvdEZpbGxCaXRzOwogCi0gIC8qIGFzayBiaXRzdHJlYW0gZW5jb2RlciBob3cgbWFueSBvZiB0aGF0IGJpdHMgY2FuIGJlIHdyaXR0ZW4gaW4gYSBmaWxsIGV4dGVuc2lvbiBkYXRhIGVudGl0eSAqLwotICBxY091dC0+dG90RmlsbEJpdHMgPSBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhKCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxsRXh0UGF5bG9hZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBDb25maWcgKTsKKyAgLyogYXNrIGJpdHN0cmVhbSBlbmNvZGVyIGhvdyBtYW55IG9mIHRoYXQgYml0cyBjYW4gYmUgd3JpdHRlbiBpbiBhIGZpbGwKKyAgICogZXh0ZW5zaW9uIGRhdGEgZW50aXR5ICovCisgIHFjT3V0LT50b3RGaWxsQml0cyA9IEZES2FhY0VuY193cml0ZUV4dGVuc2lvbkRhdGEoTlVMTCwgJmZpbGxFeHRQYXlsb2FkLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheEZsYWdzLCBhb3QsIGVwQ29uZmlnKTsKIAogICAvKiBub3cgZGlzdHJpYnV0ZSBleHRyYSBmaWxsYml0cyBhbmQgYWxpZ25iaXRzICovCi0gIGFsaWduQml0cyA9IDcgLSAocWNPdXQtPnN0YXRpY0JpdHMgKyBxY091dC0+dXNlZER5bkJpdHMgKyBxY091dC0+ZWxlbWVudEV4dEJpdHMKLSAgICAgICAgICAgICAgICAgICArIHFjT3V0LT50b3RGaWxsQml0cyArIHFjT3V0LT5nbG9iYWxFeHRCaXRzIC0xKSU4OworICBhbGlnbkJpdHMgPQorICAgICAgNyAtIChxY091dC0+c3RhdGljQml0cyArIHFjT3V0LT51c2VkRHluQml0cyArIHFjT3V0LT5lbGVtZW50RXh0Qml0cyArCisgICAgICAgICAgIHFjT3V0LT50b3RGaWxsQml0cyArIHFjT3V0LT5nbG9iYWxFeHRCaXRzIC0gMSkgJQorICAgICAgICAgICAgICA4OwogCiAgIC8qIE1heWJlIHdlIGNvdWxkIHJlbW92ZSB0aGlzICovCi0gIGlmKCAoKGFsaWduQml0cyArIHFjT3V0LT50b3RGaWxsQml0cyAtIHRvdEZpbGxCaXRzKT09OCkgJiYgKHFjT3V0LT50b3RGaWxsQml0cz44KSApCi0gICAgICAgIHFjT3V0LT50b3RGaWxsQml0cyAtPSA4OworICBpZiAoKChhbGlnbkJpdHMgKyBxY091dC0+dG90RmlsbEJpdHMgLSB0b3RGaWxsQml0cykgPT0gOCkgJiYKKyAgICAgIChxY091dC0+dG90RmlsbEJpdHMgPiA4KSkKKyAgICBxY091dC0+dG90RmlsbEJpdHMgLT0gODsKIAotICBxY091dC0+dG90YWxCaXRzID0gcWNPdXQtPnN0YXRpY0JpdHMgKyBxY091dC0+dXNlZER5bkJpdHMgKyBxY091dC0+dG90RmlsbEJpdHMgKwotICAgICAgICAgICAgICAgICAgICAgYWxpZ25CaXRzICsgcWNPdXQtPmVsZW1lbnRFeHRCaXRzICsgcWNPdXQtPmdsb2JhbEV4dEJpdHM7CisgIHFjT3V0LT50b3RhbEJpdHMgPSBxY091dC0+c3RhdGljQml0cyArIHFjT3V0LT51c2VkRHluQml0cyArCisgICAgICAgICAgICAgICAgICAgICBxY091dC0+dG90RmlsbEJpdHMgKyBhbGlnbkJpdHMgKyBxY091dC0+ZWxlbWVudEV4dEJpdHMgKworICAgICAgICAgICAgICAgICAgICAgcWNPdXQtPmdsb2JhbEV4dEJpdHM7CiAKLSAgaWYgKCAocWNPdXQtPnRvdGFsQml0cz5xY0tlcm5lbC0+bWF4Qml0c1BlckZyYW1lKSB8fCAocWNPdXQtPnRvdGFsQml0czxxY0tlcm5lbC0+bWluQml0c1BlckZyYW1lKSApIHsKKyAgaWYgKChxY091dC0+dG90YWxCaXRzID4gcWNLZXJuZWwtPm1heEJpdHNQZXJGcmFtZSkgfHwKKyAgICAgIChxY091dC0+dG90YWxCaXRzIDwgcWNLZXJuZWwtPm1pbkJpdHNQZXJGcmFtZSkpIHsKICAgICByZXR1cm4gQUFDX0VOQ19RVUFOVF9FUlJPUjsKICAgfQogCkBAIC0xNDYwLDggKzEzOTgsNiBAQAogICByZXR1cm4gQUFDX0VOQ19PSzsKIH0KIAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgICAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfY3Jhc2hSZWNvdmVyeQpAQCAtMTQ3Miw5MyArMTQwOCw4MiBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfY3Jhc2hSZWNvdmVyeShJTlQgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogIHBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCogICAgICAgICAgIHFjT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCAgICpxY0VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgIGJpdHNUb1NhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGFvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICAgIGVwQ29uZmlnKQotewotICBJTlQgY2ggOwotICBJTlQgc2F2ZWRCaXRzID0gMCA7Ci0gIElOVCBzZmIsIHNmYkdycCA7Ci0gIElOVCBiaXRzUGVyU2NmWygyKV1bTUFYX0dST1VQRURfU0ZCXSA7Ci0gIElOVCBzZWN0aW9uVG9TY2ZbKDIpXVtNQVhfR1JPVVBFRF9TRkJdIDsKLSAgSU5UICpzZmJPZmZzZXQgOwotICBJTlQgc2VjdCwgc3RhdEJpdHNOZXcgOwotICBRQ19PVVRfQ0hBTk5FTCAqKnFjQ2hhbm5lbCA9IHFjRWxlbWVudC0+cWNPdXRDaGFubmVsOwotICBQU1lfT1VUX0NIQU5ORUwgKipwc3lDaGFubmVsID0gcHN5T3V0RWxlbWVudC0+cHN5T3V0Q2hhbm5lbDsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19jcmFzaFJlY292ZXJ5KElOVCBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqIHBzeU91dEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqIHFjT3V0LCBRQ19PVVRfRUxFTUVOVCogcWNFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJpdHNUb1NhdmUsIEFVRElPX09CSkVDVF9UWVBFIGFvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc3ludGF4RmxhZ3MsIFNDSEFSIGVwQ29uZmlnKSB7CisgIElOVCBjaDsKKyAgSU5UIHNhdmVkQml0cyA9IDA7CisgIElOVCBzZmIsIHNmYkdycDsKKyAgSU5UIGJpdHNQZXJTY2ZbKDIpXVtNQVhfR1JPVVBFRF9TRkJdOworICBJTlQgc2VjdGlvblRvU2NmWygyKV1bTUFYX0dST1VQRURfU0ZCXTsKKyAgSU5UKiBzZmJPZmZzZXQ7CisgIElOVCBzZWN0LCBzdGF0Qml0c05ldzsKKyAgUUNfT1VUX0NIQU5ORUwqKiBxY0NoYW5uZWwgPSBxY0VsZW1lbnQtPnFjT3V0Q2hhbm5lbDsKKyAgUFNZX09VVF9DSEFOTkVMKiogcHN5Q2hhbm5lbCA9IHBzeU91dEVsZW1lbnQtPnBzeU91dENoYW5uZWw7CiAKICAgLyogY3JlYXRlIGEgdGFibGUgd2hpY2ggY29udmVydHMgZnJxLWJpbnMgdG8gYml0LWRlbWFuZC4uLiAgICBbYml0c1BlclNjZl0gKi8KICAgLyogLi4uYW5kIGFub3RoZXIgb25lIHdoaWNoIGhvbGRzIHRoZSBjb3JyZXNwb25kaW5nIHNlY3Rpb25zIFtzZWN0aW9uVG9TY2ZdICovCi0gIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykKLSAgewotICAgIHNmYk9mZnNldCA9IHBzeUNoYW5uZWxbY2hdLT5zZmJPZmZzZXRzIDsKKyAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgc2ZiT2Zmc2V0ID0gcHN5Q2hhbm5lbFtjaF0tPnNmYk9mZnNldHM7CiAKLSAgICBmb3IgKHNlY3QgPSAwOyBzZWN0IDwgcWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEubm9PZlNlY3Rpb25zOyBzZWN0KyspCi0gICAgewotICAgICAgSU5UIHNmYiA7Ci0gICAgICBJTlQgY29kZUJvb2sgPSBxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5odWZmc2VjdGlvbltzZWN0XS5jb2RlQm9vayA7CisgICAgZm9yIChzZWN0ID0gMDsgc2VjdCA8IHFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLm5vT2ZTZWN0aW9uczsgc2VjdCsrKSB7CisgICAgICBJTlQgY29kZUJvb2sgPSBxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5odWZmc2VjdGlvbltzZWN0XS5jb2RlQm9vazsKIAogICAgICAgZm9yIChzZmIgPSBxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5odWZmc2VjdGlvbltzZWN0XS5zZmJTdGFydDsKICAgICAgICAgICAgc2ZiIDwgcWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEuaHVmZnNlY3Rpb25bc2VjdF0uc2ZiU3RhcnQgKwotICAgICAgICAgICAgICAgICBxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5odWZmc2VjdGlvbltzZWN0XS5zZmJDbnQ7Ci0gICAgICAgICAgIHNmYisrKQotICAgICAgeworICAgICAgICAgICAgICAgICAgICAgcWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEuaHVmZnNlY3Rpb25bc2VjdF0uc2ZiQ250OworICAgICAgICAgICBzZmIrKykgewogICAgICAgICBiaXRzUGVyU2NmW2NoXVtzZmJdID0gMDsKLSAgICAgICAgaWYgKCAoY29kZUJvb2sgIT0gQ09ERV9CT09LX1BOU19OTykgLyomJgotICAgICAgICAgICAgIChzZmIgPCAocWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEubm9PZkdyb3VwcypxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5tYXhTZmJQZXJHcm91cCkpKi8gKQotICAgICAgICB7Ci0gICAgICAgICAgICBJTlQgc2ZiU3RhcnRMaW5lID0gc2ZiT2Zmc2V0W3NmYl0gOwotICAgICAgICAgICAgSU5UIG5vT2ZMaW5lcyAgICA9IHNmYk9mZnNldFtzZmIrMV0gLSBzZmJTdGFydExpbmUgOwotICAgICAgICAgICAgYml0c1BlclNjZltjaF1bc2ZiXSA9IEZES2FhY0VuY19jb3VudFZhbHVlcygmKHFjQ2hhbm5lbFtjaF0tPnF1YW50U3BlY1tzZmJTdGFydExpbmVdKSwgbm9PZkxpbmVzLCBjb2RlQm9vaykgOworICAgICAgICBpZiAoKGNvZGVCb29rICE9IENPREVfQk9PS19QTlNfTk8pIC8qJiYKKyAgICAgICAgICAgICAoc2ZiIDwgKHFjQ2hhbm5lbFtjaF0tPnNlY3Rpb25EYXRhLm5vT2ZHcm91cHMqcWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEubWF4U2ZiUGVyR3JvdXApKSovKSB7CisgICAgICAgICAgSU5UIHNmYlN0YXJ0TGluZSA9IHNmYk9mZnNldFtzZmJdOworICAgICAgICAgIElOVCBub09mTGluZXMgPSBzZmJPZmZzZXRbc2ZiICsgMV0gLSBzZmJTdGFydExpbmU7CisgICAgICAgICAgYml0c1BlclNjZltjaF1bc2ZiXSA9IEZES2FhY0VuY19jb3VudFZhbHVlcygKKyAgICAgICAgICAgICAgJihxY0NoYW5uZWxbY2hdLT5xdWFudFNwZWNbc2ZiU3RhcnRMaW5lXSksIG5vT2ZMaW5lcywgY29kZUJvb2spOwogICAgICAgICB9Ci0gICAgICAgIHNlY3Rpb25Ub1NjZltjaF1bc2ZiXSA9IHNlY3QgOworICAgICAgICBzZWN0aW9uVG9TY2ZbY2hdW3NmYl0gPSBzZWN0OwogICAgICAgfQotCiAgICAgfQogICB9CiAKICAgLyogTE9XRVIgW21heFNmYl0gSU4gQk9USCBDSEFOTkVMUyEhICovCi0gIC8qIEF0dGVudGlvbjogaW4gY2FzZSBvZiBzdGVyZW86IG1heFNmYkwgPT0gbWF4U2ZiUiwgR3JvdXBpbmdMID09IEdyb3VwaW5nUiA7ICovCisgIC8qIEF0dGVudGlvbjogaW4gY2FzZSBvZiBzdGVyZW86IG1heFNmYkwgPT0gbWF4U2ZiUiwgR3JvdXBpbmdMID09IEdyb3VwaW5nUiA7CisgICAqLwogCi0gIGZvciAoc2ZiID0gcWNDaGFubmVsWzBdLT5zZWN0aW9uRGF0YS5tYXhTZmJQZXJHcm91cC0xOyBzZmIgPj0gMDsgc2ZiLS0pCi0gIHsKLSAgICBmb3IgKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeUNoYW5uZWxbMF0tPnNmYkNudDsgc2ZiR3JwICs9IHBzeUNoYW5uZWxbMF0tPnNmYlBlckdyb3VwKQotICAgIHsKLSAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykKLSAgICAgIHsKLSAgICAgICAgaW50IHNlY3QgPSBzZWN0aW9uVG9TY2ZbY2hdW3NmYkdycCtzZmJdOwotICAgICAgICBxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5odWZmc2VjdGlvbltzZWN0XS5zZmJDbnQtLSA7Ci0gICAgICAgIHNhdmVkQml0cyArPSBiaXRzUGVyU2NmW2NoXVtzZmJHcnArc2ZiXSA7CisgIGZvciAoc2ZiID0gcWNDaGFubmVsWzBdLT5zZWN0aW9uRGF0YS5tYXhTZmJQZXJHcm91cCAtIDE7IHNmYiA+PSAwOyBzZmItLSkgeworICAgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5Q2hhbm5lbFswXS0+c2ZiQ250OworICAgICAgICAgc2ZiR3JwICs9IHBzeUNoYW5uZWxbMF0tPnNmYlBlckdyb3VwKSB7CisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgc2VjdCA9IHNlY3Rpb25Ub1NjZltjaF1bc2ZiR3JwICsgc2ZiXTsKKyAgICAgICAgcWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEuaHVmZnNlY3Rpb25bc2VjdF0uc2ZiQ250LS07CisgICAgICAgIHNhdmVkQml0cyArPSBiaXRzUGVyU2NmW2NoXVtzZmJHcnAgKyBzZmJdOwogCiAgICAgICAgIGlmIChxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5odWZmc2VjdGlvbltzZWN0XS5zZmJDbnQgPT0gMCkgewotICAgICAgICAgIHNhdmVkQml0cyArPSAocHN5Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSE9U0hPUlRfV0lORE9XKSA/IEZES2FhY0VuY19zaWRlSW5mb1RhYkxvbmdbMF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZES2FhY0VuY19zaWRlSW5mb1RhYlNob3J0WzBdOworICAgICAgICAgIHNhdmVkQml0cyArPSAocHN5Q2hhbm5lbFtjaF0tPmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEZES2FhY0VuY19zaWRlSW5mb1RhYkxvbmdbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRkRLYWFjRW5jX3NpZGVJbmZvVGFiU2hvcnRbMF07CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKICAgICAvKiAuLi5oYXZlIGVub3VnaCBiaXRzIGJlZW4gc2F2ZWQ/ICovCi0gICAgaWYgKHNhdmVkQml0cyA+PSBiaXRzVG9TYXZlKQotICAgICAgYnJlYWsgOworICAgIGlmIChzYXZlZEJpdHMgPj0gYml0c1RvU2F2ZSkgYnJlYWs7CiAKICAgfSAvKiBzZmIgbG9vcCAqLwogCiAgIC8qIGlmIG5vdCBlbm91Z2ggYml0cyBzYXZlZCwKICAgICAgY2xlYW4gd2hvbGUgc3BlY3RydW0gYW5kIHJlbW92ZSBzaWRlIGluZm8gb3ZlcmhlYWQgKi8KICAgaWYgKHNmYiA9PSAtMSkgewotICAgIHNmYiA9IDAgOworICAgIHNmYiA9IDA7CiAgIH0KIAotICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCi0gIHsKLSAgICBxY0NoYW5uZWxbY2hdLT5zZWN0aW9uRGF0YS5tYXhTZmJQZXJHcm91cCA9IHNmYiA7Ci0gICAgcHN5Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwID0gc2ZiIDsKKyAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgcWNDaGFubmVsW2NoXS0+c2VjdGlvbkRhdGEubWF4U2ZiUGVyR3JvdXAgPSBzZmI7CisgICAgcHN5Q2hhbm5lbFtjaF0tPm1heFNmYlBlckdyb3VwID0gc2ZiOwogICAgIC8qIHdoZW4gbm8gc3BlY3RydW0gaXMgY29kZWQgc2F2ZSB0b29scyBpbmZvIGluIGJpdHN0cmVhbSAqLwotICAgIGlmKHNmYj09MCkgeworICAgIGlmIChzZmIgPT0gMCkgewogICAgICAgRkRLbWVtY2xlYXIoJnBzeUNoYW5uZWxbY2hdLT50bnNJbmZvLCBzaXplb2YoVE5TX0lORk8pKTsKICAgICAgIEZES21lbWNsZWFyKCZwc3lPdXRFbGVtZW50LT50b29sc0luZm8sIHNpemVvZihUT09MU0lORk8pKTsKICAgICB9CkBAIC0xNTcyLDE0ICsxNDk3LDkgQEAKICAgICBlbEluZm8ubkNoYW5uZWxzSW5FbCA9IG5DaGFubmVsczsKICAgICBlbEluZm8uZWxUeXBlID0gKG5DaGFubmVscyA9PSAyKSA/IElEX0NQRSA6IElEX1NDRTsKIAotICAgIEZES2FhY0VuY19DaGFubmVsRWxlbWVudFdyaXRlKCBOVUxMLCAmZWxJbmZvLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdEJpdHNOZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKTsKKyAgICBGREthYWNFbmNfQ2hhbm5lbEVsZW1lbnRXcml0ZShOVUxMLCAmZWxJbmZvLCBOVUxMLCBwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUNoYW5uZWwsIHN5bnRheEZsYWdzLCBhb3QsIGVwQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0Qml0c05ldywgMCk7CiAgIH0KIAogICBzYXZlZEJpdHMgPSBxY0VsZW1lbnQtPnN0YXRpY0JpdHNVc2VkIC0gc3RhdEJpdHNOZXc7CkBAIC0xNTg4LDMwICsxNTA4LDIzIEBACiAgIHFjRWxlbWVudC0+c3RhdGljQml0c1VzZWQgLT0gc2F2ZWRCaXRzOwogICBxY0VsZW1lbnQtPmdyYW50ZWREeW5CaXRzICs9IHNhdmVkQml0czsKIAotICBxY091dC0+c3RhdGljQml0cyAgICAgLT0gc2F2ZWRCaXRzOworICBxY091dC0+c3RhdGljQml0cyAtPSBzYXZlZEJpdHM7CiAgIHFjT3V0LT5ncmFudGVkRHluQml0cyArPSBzYXZlZEJpdHM7Ci0gIHFjT3V0LT5tYXhEeW5CaXRzICAgICArPSBzYXZlZEJpdHM7Ci0KLQorICBxY091dC0+bWF4RHluQml0cyArPSBzYXZlZEJpdHM7CiB9CiAKLQotCi12b2lkICBGREthYWNFbmNfUUNDbG9zZSAoUUNfU1RBVEUgICoqcGhRQ3N0YXRlLCBRQ19PVVQgKipwaFFDKQotewordm9pZCBGREthYWNFbmNfUUNDbG9zZShRQ19TVEFURSoqIHBoUUNzdGF0ZSwgUUNfT1VUKiogcGhRQykgewogICBpbnQgbiwgaTsKIAotICBpZiAocGhRQyE9TlVMTCkgewotCi0gICAgZm9yIChuPTA7bjwoMSk7bisrKSB7CisgIGlmIChwaFFDICE9IE5VTEwpIHsKKyAgICBmb3IgKG4gPSAwOyBuIDwgKDEpOyBuKyspIHsKICAgICAgIGlmIChwaFFDW25dICE9IE5VTEwpIHsKLSAgICAgICAgUUNfT1VUICAgICpoUUMgICAgICA9IHBoUUNbbl07Ci0gICAgICAgIGZvciAoaT0wOyBpPCg4KTsgaSsrKSB7CisgICAgICAgIFFDX09VVCogaFFDID0gcGhRQ1tuXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8ICg4KTsgaSsrKSB7CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKGk9MDsgaTwoOCk7IGkrKykgewotICAgICAgICAgIGlmIChoUUMtPnFjRWxlbWVudFtpXSkKLSAgICAgICAgICAgIEZyZWVSYW1fYWFjRW5jX1FDZWxlbWVudCgmaFFDLT5xY0VsZW1lbnRbaV0pOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKCg4KSk7IGkrKykgeworICAgICAgICAgIGlmIChoUUMtPnFjRWxlbWVudFtpXSkgRnJlZVJhbV9hYWNFbmNfUUNlbGVtZW50KCZoUUMtPnFjRWxlbWVudFtpXSk7CiAgICAgICAgIH0KIAogICAgICAgICBGcmVlUmFtX2FhY0VuY19RQ291dCgmcGhRQ1tuXSk7CkBAIC0xNjE5LDE4ICsxNTMyLDE3IEBACiAgICAgfQogICB9CiAKLSAgaWYgKHBoUUNzdGF0ZSE9TlVMTCkgeworICBpZiAocGhRQ3N0YXRlICE9IE5VTEwpIHsKICAgICBpZiAoKnBoUUNzdGF0ZSAhPSBOVUxMKSB7Ci0gICAgICBRQ19TVEFURSAgKmhRQ3N0YXRlID0gKnBoUUNzdGF0ZTsKKyAgICAgIFFDX1NUQVRFKiBoUUNzdGF0ZSA9ICpwaFFDc3RhdGU7CiAKLSAgICAgIGlmIChoUUNzdGF0ZS0+aEFkalRociAhPSBOVUxMKQotICAgICAgICBGREthYWNFbmNfQWRqVGhyQ2xvc2UoJmhRQ3N0YXRlLT5oQWRqVGhyKTsKKyAgICAgIGlmIChoUUNzdGF0ZS0+aEFkalRociAhPSBOVUxMKSBGREthYWNFbmNfQWRqVGhyQ2xvc2UoJmhRQ3N0YXRlLT5oQWRqVGhyKTsKIAogICAgICAgaWYgKGhRQ3N0YXRlLT5oQml0Q291bnRlciAhPSBOVUxMKQogICAgICAgICBGREthYWNFbmNfQkNDbG9zZSgmaFFDc3RhdGUtPmhCaXRDb3VudGVyKTsKIAotICAgICAgZm9yIChpPTA7IGk8KDgpOyBpKyspIHsKLSAgICAgICAgaWYgKGhRQ3N0YXRlLT5lbGVtZW50Qml0c1tpXSE9TlVMTCkgeworICAgICAgZm9yIChpID0gMDsgaSA8ICgoOCkpOyBpKyspIHsKKyAgICAgICAgaWYgKGhRQ3N0YXRlLT5lbGVtZW50Qml0c1tpXSAhPSBOVUxMKSB7CiAgICAgICAgICAgRnJlZVJhbV9hYWNFbmNfRWxlbWVudEJpdHMoJmhRQ3N0YXRlLT5lbGVtZW50Qml0c1tpXSk7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTE2MzgsNCArMTU1MCwzIEBACiAgICAgfQogICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvcWNfbWFpbi5oIGIvbGliQUFDZW5jL3NyYy9xY19tYWluLmgKaW5kZXggNGU4YzA0Mi4uYjllOGUyZCAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9xY19tYWluLmgKKysrIGIvbGliQUFDZW5jL3NyYy9xY19tYWluLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTcgKzkwLDE4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIFdlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IFF1YW50aXppbmcgJiBjb2RpbmcKKyAgIEF1dGhvcihzKTogICBNLiBXZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfUUNfTUFJTl9ICi0jZGVmaW5lIF9RQ19NQUlOX0gKKyAgIERlc2NyaXB0aW9uOiBRdWFudGl6aW5nICYgY29kaW5nCiAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgUUNfTUFJTl9ICisjZGVmaW5lIFFDX01BSU5fSAogCiAjaW5jbHVkZSAiYWFjZW5jLmgiCiAjaW5jbHVkZSAicWNfZGF0YS5oIgpAQCAtOTksNzIgKzExMSw0OCBAQAogCiAvKiBRdWFudGl6aW5nICYgY29kaW5nIHN0YWdlICovCiAKLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ091dE5ldyhRQ19PVVQgICAgKipwaFFDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgIG5FbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgblN1YkZyYW1lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFVDSEFSICAgKmR5bmFtaWNfUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ091dE5ldyhRQ19PVVQgKipwaFFDLCBjb25zdCBJTlQgbkVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMsIGNvbnN0IElOVCBuU3ViRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpkeW5hbWljX1JBTSk7CiAKLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ091dEluaXQoUUNfT1VUICAgICAgICAgICpwaFFDWygxKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgblN1YkZyYW1lcywKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ091dEluaXQoUUNfT1VUICpwaFFDWygxKV0sIGNvbnN0IElOVCBuU3ViRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSEFOTkVMX01BUFBJTkcgKmNtKTsKIAotQUFDX0VOQ09ERVJfRVJST1IgIEZES2FhY0VuY19RQ05ldyhRQ19TVEFURSAgKipwaFFDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICBuRWxlbWVudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsVUNIQVIqIGR5bmFtaWNfUkFNCi0gICAgICAgICAgICk7CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNOZXcoUUNfU1RBVEUgKipwaFFDLCBJTlQgbkVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpkeW5hbWljX1JBTSk7CiAKLUFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19RQ0luaXQoUUNfU1RBVEUgKmhRQywgc3RydWN0IFFDX0lOSVQgKmluaXQpOworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1FDSW5pdChRQ19TVEFURSAqaFFDLCBzdHJ1Y3QgUUNfSU5JVCAqaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUxPTkcgaW5pdEZsYWdzKTsKIAogQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1FDTWFpblByZXBhcmUoCi0gICAgICAgICAgIEVMRU1FTlRfSU5GTyAgICAgICAgICAgICAgKmVsSW5mbywKLSAgICAgICAgICAgQVRTX0VMRU1FTlQqICBSRVNUUklDVCAgICAgYWRqVGhyU3RhdGVFbGVtZW50LAotICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqIFJFU1RSSUNUICBwc3lPdXRFbGVtZW50LAotICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogUkVTVFJJQ1QgICBxY091dEVsZW1lbnQsICAgLyogcmV0dXJucyBlcnJvciBjb2RlICAgICAgICovCi0gICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFICAgICAgICAgIGFvdCwKLSAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCi0gICAgICAgICAgIFNDSEFSICAgICAgICAgICAgICAgICAgICAgIGVwQ29uZmlnCi0gICAgICAgICAgICk7CisgICAgRUxFTUVOVF9JTkZPICplbEluZm8sIEFUU19FTEVNRU5UICpSRVNUUklDVCBhZGpUaHJTdGF0ZUVsZW1lbnQsCisgICAgUFNZX09VVF9FTEVNRU5UICpSRVNUUklDVCBwc3lPdXRFbGVtZW50LAorICAgIFFDX09VVF9FTEVNRU5UICpSRVNUUklDVCBxY091dEVsZW1lbnQsIC8qIHJldHVybnMgZXJyb3IgY29kZSAgICAgICAqLworICAgIEFVRElPX09CSkVDVF9UWVBFIGFvdCwgVUlOVCBzeW50YXhGbGFncywgU0NIQVIgZXBDb25maWcpOwogCitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfUUNNYWluKFFDX1NUQVRFICpSRVNUUklDVCBoUUMsIFBTWV9PVVQgKipwc3lPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCAqKnFjT3V0LCBJTlQgYXZnVG90YWxCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcgKmNtLCBBVURJT19PQkpFQ1RfVFlQRSBhb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc3ludGF4RmxhZ3MsIFNDSEFSIGVwQ29uZmlnKTsKIAotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX1FDTWFpbihRQ19TVEFURSogUkVTVFJJQ1QgICAgICAgICBoUUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQqKiAgICAgICAgICAgICAgICAgIHBzeU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiogICAgICAgICAgICAgICAgICAgcWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgIGF2Z1RvdGFsQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HKiAgICAgICAgICAgY20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsQVVESU9fT0JKRUNUX1RZUEUgICAgICAgICAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBzeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgICAgICAgICAgZXBDb25maWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKK0FBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY191cGRhdGVGaWxsQml0cyhDSEFOTkVMX01BUFBJTkcgKmNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX1NUQVRFICpxY0tlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX0JJVFMgKlJFU1RSSUNUIGVsQml0c1soKDgpKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUICoqcWNPdXQpOwogCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfdXBkYXRlRmlsbEJpdHMoQ0hBTk5FTF9NQVBQSU5HKiAgICAgICAgICBjbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19TVEFURSogICAgICAgICAgICAgICAgIHFjS2VybmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfQklUUyogUkVTVFJJQ1QgICAgZWxCaXRzWyg4KV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiogICAgICAgICAgICAgICAgICBxY091dCk7Cit2b2lkIEZES2FhY0VuY191cGRhdGVCaXRyZXMoQ0hBTk5FTF9NQVBQSU5HICpjbSwgUUNfU1RBVEUgKnFjS2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCAqKnFjT3V0KTsKIAotCi12b2lkIEZES2FhY0VuY191cGRhdGVCaXRyZXMoICBDSEFOTkVMX01BUFBJTkcgKmNtLAotICAgICAgICAgICAgICAgICAgICBRQ19TVEFURSAqcWNLZXJuZWwsCi0gICAgICAgICAgICAgICAgICAgIFFDX09VVCAqKnFjT3V0KTsKLQotQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0ZpbmFsaXplQml0Q29uc3VtcHRpb24oIENIQU5ORUxfTUFQUElORyAqY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfU1RBVEUgKmhRQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQgKnFjT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiogcWNFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFICAgYW90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgc3ludGF4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgICAgICBlcENvbmZpZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0ZpbmFsaXplQml0Q29uc3VtcHRpb24oCisgICAgQ0hBTk5FTF9NQVBQSU5HICpjbSwgUUNfU1RBVEUgKmhRQywgUUNfT1VUICpxY091dCwKKyAgICBRQ19PVVRfRUxFTUVOVCAqKnFjRWxlbWVudCwgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgQVVESU9fT0JKRUNUX1RZUEUgYW90LCBVSU5UIHN5bnRheEZsYWdzLCBTQ0hBUiBlcENvbmZpZyk7CiAKIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19BZGp1c3RCaXRyYXRlKFFDX1NUQVRFICpSRVNUUklDVCBoUUMsCi0gICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcgKlJFU1RSSUNUIGNtLAotICAgICAgICAgICAgICAgICAgSU5UICphdmdUb3RhbEJpdHMsCi0gICAgICAgICAgICAgICAgICBJTlQgYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgSU5UIGdyYW51bGVMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NQVBQSU5HICpSRVNUUklDVCBjbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqYXZnVG90YWxCaXRzLCBJTlQgYml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlLCBJTlQgZ3JhbnVsZUxlbmd0aCk7CiAKLXZvaWQgIEZES2FhY0VuY19RQ0Nsb3NlIChRQ19TVEFURSAgKipwaFFDc3RhdGUsIFFDX09VVCAqKnBoUUMpOwordm9pZCBGREthYWNFbmNfUUNDbG9zZShRQ19TVEFURSAqKnBoUUNzdGF0ZSwgUUNfT1VUICoqcGhRQyk7CiAKLSNlbmRpZiAvKiBfUUNfTUFJTl9IICovCisjZW5kaWYgLyogUUNfTUFJTl9IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3F1YW50aXplLmNwcCBiL2xpYkFBQ2VuYy9zcmMvcXVhbnRpemUuY3BwCmluZGV4IGE3NGRhMGUuLjRkMjUyNjMgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvcXVhbnRpemUuY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvcXVhbnRpemUuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLldlcm5lcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IFF1YW50aXphdGlvbgorICAgQXV0aG9yKHMpOiAgIE0uV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBRdWFudGl6YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInF1YW50aXplLmgiCiAKQEAgLTEwMSw2MCArMTEzLDYxIEBACiAgICAgb3V0cHV0OiBxdWFudGl6ZWQgc3BlY3RydW0KIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfcXVhbnRpemVMaW5lcyhJTlQgICAgICBnYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICBub09mTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICptZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICAgICpxdWFTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgZFpvbmVRdWFudEVuYWJsZSkKLXsKLSAgaW50ICAgbGluZTsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19xdWFudGl6ZUxpbmVzKElOVCBnYWluLCBJTlQgbm9PZkxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFTcGVjdHJ1bSwgSU5UIGRab25lUXVhbnRFbmFibGUpIHsKKyAgaW50IGxpbmU7CiAgIEZJWFBfREJMIGsgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgRklYUF9RVEQgcXVhbnRpemVyID0gRkRLYWFjRW5jX3F1YW50VGFibGVRWygtZ2FpbikmM107Ci0gIElOVCAgICAgIHF1YW50aXplcnNoaWZ0ID0gKCgtZ2Fpbik+PjIpKzE7Ci0gIGNvbnN0IElOVCBrU2hpZnQ9MTY7CisgIEZJWFBfUVREIHF1YW50aXplciA9IEZES2FhY0VuY19xdWFudFRhYmxlUVsoLWdhaW4pICYgM107CisgIElOVCBxdWFudGl6ZXJzaGlmdCA9ICgoLWdhaW4pID4+IDIpICsgMTsKKyAgY29uc3QgSU5UIGtTaGlmdCA9IDE2OwogCiAgIGlmIChkWm9uZVF1YW50RW5hYmxlKQotICAgIGsgPSBGTDJGWENPTlNUX0RCTCgwLjIzZik+PmtTaGlmdDsKKyAgICBrID0gRkwyRlhDT05TVF9EQkwoMC4yM2YpID4+IGtTaGlmdDsKICAgZWxzZQotICAgIGsgPSBGTDJGWENPTlNUX0RCTCgtMC4wOTQ2ZiArIDAuNWYpPj5rU2hpZnQ7CisgICAgayA9IEZMMkZYQ09OU1RfREJMKC0wLjA5NDZmICsgMC41ZikgPj4ga1NoaWZ0OwogCi0gIGZvciAobGluZSA9IDA7IGxpbmUgPCBub09mTGluZXM7IGxpbmUrKykKLSAgewotICAgIEZJWFBfREJMIGFjY3UgPSBmTXVsdERpdjIobWRjdFNwZWN0cnVtW2xpbmVdLHF1YW50aXplcik7CisgIGZvciAobGluZSA9IDA7IGxpbmUgPCBub09mTGluZXM7IGxpbmUrKykgeworICAgIEZJWFBfREJMIGFjY3UgPSBmTXVsdERpdjIobWRjdFNwZWN0cnVtW2xpbmVdLCBxdWFudGl6ZXIpOwogCi0gICAgaWYgKGFjY3UgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkKLSAgICB7Ci0gICAgICBhY2N1PS1hY2N1OworICAgIGlmIChhY2N1IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgIGFjY3UgPSAtYWNjdTsKICAgICAgIC8qIG5vcm1hbGl6ZSAqLwotICAgICAgSU5UICAgYWNjdVNoaWZ0ID0gQ250TGVhZGluZ1plcm9zKGFjY3UpIC0gMTsgIC8qIENvdW50TGVhZGluZ0JpdHMoKSBpcyBub3QgbmVjZXNzYXJ5IGhlcmUgc2luY2UgdGVzdCB2YWx1ZSBpcyBhbHdheXMgPiAwICovCisgICAgICBJTlQgYWNjdVNoaWZ0ID0gQ250TGVhZGluZ1plcm9zKGFjY3UpIC0gMTsgLyogQ291bnRMZWFkaW5nQml0cygpIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyeSBoZXJlIHNpbmNlIHRlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpcyBhbHdheXMgPiAwICovCiAgICAgICBhY2N1IDw8PSBhY2N1U2hpZnQ7Ci0gICAgICBJTlQgdGFiSW5kZXggPSAoSU5UKShhY2N1Pj4oREZSQUNUX0JJVFMtMi1NQU5UX0RJR0lUUykpJih+TUFOVF9TSVpFKTsKLSAgICAgIElOVCB0b3RhbFNoaWZ0ID0gcXVhbnRpemVyc2hpZnQtYWNjdVNoaWZ0KzE7Ci0gICAgICBhY2N1ID0gZk11bHREaXYyKEZES2FhY0VuY19tVGFiXzNfNFt0YWJJbmRleF0sRkRLYWFjRW5jX3F1YW50VGFibGVFW3RvdGFsU2hpZnQmM10pOwotICAgICAgdG90YWxTaGlmdCA9ICgxNi00KS0oMyoodG90YWxTaGlmdD4+MikpOwotICAgICAgRkRLX0FTU0VSVCh0b3RhbFNoaWZ0ID49MCk7IC8qIE1BWF9RVUFOVF9WSU9MQVRJT04gKi8KLSAgICAgIGFjY3UgPj49IGZpeE1pbih0b3RhbFNoaWZ0LERGUkFDVF9CSVRTLTEpOwotICAgICAgcXVhU3BlY3RydW1bbGluZV0gPSAoU0hPUlQpKC0oKExPTkcpKGsgKyBhY2N1KSA+PiAoREZSQUNUX0JJVFMtMS0xNikpKTsKLSAgICB9Ci0gICAgZWxzZSBpZihhY2N1ID4gRkwyRlhDT05TVF9EQkwoMC4wZikpCi0gICAgeworICAgICAgSU5UIHRhYkluZGV4ID0KKyAgICAgICAgICAoSU5UKShhY2N1ID4+IChERlJBQ1RfQklUUyAtIDIgLSBNQU5UX0RJR0lUUykpICYgKH5NQU5UX1NJWkUpOworICAgICAgSU5UIHRvdGFsU2hpZnQgPSBxdWFudGl6ZXJzaGlmdCAtIGFjY3VTaGlmdCArIDE7CisgICAgICBhY2N1ID0gZk11bHREaXYyKEZES2FhY0VuY19tVGFiXzNfNFt0YWJJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19xdWFudFRhYmxlRVt0b3RhbFNoaWZ0ICYgM10pOworICAgICAgdG90YWxTaGlmdCA9ICgxNiAtIDQpIC0gKDMgKiAodG90YWxTaGlmdCA+PiAyKSk7CisgICAgICBGREtfQVNTRVJUKHRvdGFsU2hpZnQgPj0gMCk7IC8qIE1BWF9RVUFOVF9WSU9MQVRJT04gKi8KKyAgICAgIGFjY3UgPj49IGZpeE1pbih0b3RhbFNoaWZ0LCBERlJBQ1RfQklUUyAtIDEpOworICAgICAgcXVhU3BlY3RydW1bbGluZV0gPQorICAgICAgICAgIChTSE9SVCkoLSgoTE9ORykoayArIGFjY3UpID4+IChERlJBQ1RfQklUUyAtIDEgLSAxNikpKTsKKyAgICB9IGVsc2UgaWYgKGFjY3UgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgewogICAgICAgLyogbm9ybWFsaXplICovCi0gICAgICBJTlQgICBhY2N1U2hpZnQgPSBDbnRMZWFkaW5nWmVyb3MoYWNjdSkgLSAxOyAgLyogQ291bnRMZWFkaW5nQml0cygpIGlzIG5vdCBuZWNlc3NhcnkgaGVyZSBzaW5jZSB0ZXN0IHZhbHVlIGlzIGFsd2F5cyA+IDAgKi8KKyAgICAgIElOVCBhY2N1U2hpZnQgPSBDbnRMZWFkaW5nWmVyb3MoYWNjdSkgLSAxOyAvKiBDb3VudExlYWRpbmdCaXRzKCkgaXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJ5IGhlcmUgc2luY2UgdGVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGlzIGFsd2F5cyA+IDAgKi8KICAgICAgIGFjY3UgPDw9IGFjY3VTaGlmdDsKLSAgICAgIElOVCB0YWJJbmRleCA9IChJTlQpKGFjY3U+PihERlJBQ1RfQklUUy0yLU1BTlRfRElHSVRTKSkmKH5NQU5UX1NJWkUpOwotICAgICAgSU5UIHRvdGFsU2hpZnQgPSBxdWFudGl6ZXJzaGlmdC1hY2N1U2hpZnQrMTsKLSAgICAgIGFjY3UgPSBmTXVsdERpdjIoRkRLYWFjRW5jX21UYWJfM180W3RhYkluZGV4XSxGREthYWNFbmNfcXVhbnRUYWJsZUVbdG90YWxTaGlmdCYzXSk7Ci0gICAgICB0b3RhbFNoaWZ0ID0gKDE2LTQpLSgzKih0b3RhbFNoaWZ0Pj4yKSk7Ci0gICAgICBGREtfQVNTRVJUKHRvdGFsU2hpZnQgPj0wKTsgLyogTUFYX1FVQU5UX1ZJT0xBVElPTiAqLwotICAgICAgYWNjdSA+Pj0gZml4TWluKHRvdGFsU2hpZnQsREZSQUNUX0JJVFMtMSk7Ci0gICAgICBxdWFTcGVjdHJ1bVtsaW5lXSA9IChTSE9SVCkoKExPTkcpKGsgKyBhY2N1KSA+PiAoREZSQUNUX0JJVFMtMS0xNikpOworICAgICAgSU5UIHRhYkluZGV4ID0KKyAgICAgICAgICAoSU5UKShhY2N1ID4+IChERlJBQ1RfQklUUyAtIDIgLSBNQU5UX0RJR0lUUykpICYgKH5NQU5UX1NJWkUpOworICAgICAgSU5UIHRvdGFsU2hpZnQgPSBxdWFudGl6ZXJzaGlmdCAtIGFjY3VTaGlmdCArIDE7CisgICAgICBhY2N1ID0gZk11bHREaXYyKEZES2FhY0VuY19tVGFiXzNfNFt0YWJJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19xdWFudFRhYmxlRVt0b3RhbFNoaWZ0ICYgM10pOworICAgICAgdG90YWxTaGlmdCA9ICgxNiAtIDQpIC0gKDMgKiAodG90YWxTaGlmdCA+PiAyKSk7CisgICAgICBGREtfQVNTRVJUKHRvdGFsU2hpZnQgPj0gMCk7IC8qIE1BWF9RVUFOVF9WSU9MQVRJT04gKi8KKyAgICAgIGFjY3UgPj49IGZpeE1pbih0b3RhbFNoaWZ0LCBERlJBQ1RfQklUUyAtIDEpOworICAgICAgcXVhU3BlY3RydW1bbGluZV0gPSAoU0hPUlQpKChMT05HKShrICsgYWNjdSkgPj4gKERGUkFDVF9CSVRTIC0gMSAtIDE2KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHF1YVNwZWN0cnVtW2xpbmVdID0gMDsKICAgICB9Ci0gICAgZWxzZQotICAgICAgcXVhU3BlY3RydW1bbGluZV09MDsKICAgfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOmlGREthYWNFbmNfcXVhbnRpemVMaW5lcwpAQCAtMTY0LDkwICsxNzcsOTAgQEAKICAgICBvdXRwdXQ6IHNwZWN0cmFsIGRhdGEKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfaW52UXVhbnRpemVMaW5lcyhJTlQgIGdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgbm9PZkxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSkKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19pbnZRdWFudGl6ZUxpbmVzKElOVCBnYWluLCBJTlQgbm9PZkxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtKQogCiB7CiAgIElOVCBpcXVhbnRpemVybW9kOwogICBJTlQgaXF1YW50aXplcnNoaWZ0OwogICBJTlQgbGluZTsKIAotICBpcXVhbnRpemVybW9kID0gZ2FpbiYzOwotICBpcXVhbnRpemVyc2hpZnQgPSBnYWluPj4yOworICBpcXVhbnRpemVybW9kID0gZ2FpbiAmIDM7CisgIGlxdWFudGl6ZXJzaGlmdCA9IGdhaW4gPj4gMjsKIAogICBmb3IgKGxpbmUgPSAwOyBsaW5lIDwgbm9PZkxpbmVzOyBsaW5lKyspIHsKLQotICAgIGlmKHF1YW50U3BlY3RydW1bbGluZV0gPCAwKSB7CisgICAgaWYgKHF1YW50U3BlY3RydW1bbGluZV0gPCAwKSB7CiAgICAgICBGSVhQX0RCTCBhY2N1OwotICAgICAgSU5UIGV4LHNwZWNFeHAsdGFiSW5kZXg7Ci0gICAgICBGSVhQX0RCTCBzLHQ7CisgICAgICBJTlQgZXgsIHNwZWNFeHAsIHRhYkluZGV4OworICAgICAgRklYUF9EQkwgcywgdDsKIAotICAgICAgYWNjdSA9IChGSVhQX0RCTCkgLXF1YW50U3BlY3RydW1bbGluZV07CisgICAgICBhY2N1ID0gKEZJWFBfREJMKS1xdWFudFNwZWN0cnVtW2xpbmVdOwogCiAgICAgICBleCA9IENvdW50TGVhZGluZ0JpdHMoYWNjdSk7CiAgICAgICBhY2N1IDw8PSBleDsKLSAgICAgIHNwZWNFeHAgPSAoREZSQUNUX0JJVFMtMSkgLSBleDsKKyAgICAgIHNwZWNFeHAgPSAoREZSQUNUX0JJVFMgLSAxKSAtIGV4OwogCi0gICAgICBGREtfQVNTRVJUKHNwZWNFeHAgPCAxNCk7ICAgICAgIC8qIHRoaXMgZmFpbHMgaWYgYWJzKHZhbHVlKSA+IDgxOTEgKi8KKyAgICAgIEZES19BU1NFUlQoc3BlY0V4cCA8IDE0KTsgLyogdGhpcyBmYWlscyBpZiBhYnModmFsdWUpID4gODE5MSAqLwogCi0gICAgICB0YWJJbmRleCA9IChJTlQpKGFjY3U+PihERlJBQ1RfQklUUy0yLU1BTlRfRElHSVRTKSkmKH5NQU5UX1NJWkUpOworICAgICAgdGFiSW5kZXggPSAoSU5UKShhY2N1ID4+IChERlJBQ1RfQklUUyAtIDIgLSBNQU5UX0RJR0lUUykpICYgKH5NQU5UX1NJWkUpOwogCiAgICAgICAvKiBjYWxjdWxhdGUgIm1hbnRpc3NhIiBeNC8zICovCiAgICAgICBzID0gRkRLYWFjRW5jX21UYWJfNF8zRWxjW3RhYkluZGV4XTsKIAotICAgICAgLyogZ2V0IGFwcHJvcGVyaWF0ZSBleHBvbmVudCBtdWx0aXBsaWVyIGZvciBzcGVjRXhwXjMvNCBjb21iaW5lZCB3aXRoIHNjZk1vZCAqLworICAgICAgLyogZ2V0IGFwcHJvcGVyaWF0ZSBleHBvbmVudCBtdWx0aXBsaWVyIGZvciBzcGVjRXhwXjMvNCBjb21iaW5lZCB3aXRoCisgICAgICAgKiBzY2ZNb2QgKi8KICAgICAgIHQgPSBGREthYWNFbmNfc3BlY0V4cE1hbnRUYWJsZUNvbWJFbGNbaXF1YW50aXplcm1vZF1bc3BlY0V4cF07CiAKICAgICAgIC8qIG11bHRpcGx5ICJtYW50aXNzYSIgXjQvMyB3aXRoIGV4cG9uZW50IG11bHRpcGxpZXIgKi8KLSAgICAgIGFjY3UgPSBmTXVsdChzLHQpOworICAgICAgYWNjdSA9IGZNdWx0KHMsIHQpOwogCiAgICAgICAvKiBnZXQgYXBwcm9wZXJpYXRlIGV4cG9uZW50IHNoaWZ0ZXIgKi8KLSAgICAgIHNwZWNFeHAgPSBGREthYWNFbmNfc3BlY0V4cFRhYmxlQ29tYltpcXVhbnRpemVybW9kXVtzcGVjRXhwXS0xOyAvKiAtMSB0byBhdm9pZCBvdmVyZmxvd3MgaW4gYWNjdSAqLworICAgICAgc3BlY0V4cCA9IEZES2FhY0VuY19zcGVjRXhwVGFibGVDb21iW2lxdWFudGl6ZXJtb2RdW3NwZWNFeHBdIC0KKyAgICAgICAgICAgICAgICAxOyAvKiAtMSB0byBhdm9pZCBvdmVyZmxvd3MgaW4gYWNjdSAqLwogCi0gICAgICBpZiAoKC1pcXVhbnRpemVyc2hpZnQtc3BlY0V4cCkgPCAwKQotICAgICAgICBhY2N1IDw8PSAtKC1pcXVhbnRpemVyc2hpZnQtc3BlY0V4cCk7CisgICAgICBpZiAoKC1pcXVhbnRpemVyc2hpZnQgLSBzcGVjRXhwKSA8IDApCisgICAgICAgIGFjY3UgPDw9IC0oLWlxdWFudGl6ZXJzaGlmdCAtIHNwZWNFeHApOwogICAgICAgZWxzZQotICAgICAgICBhY2N1ID4+PSAtaXF1YW50aXplcnNoaWZ0LXNwZWNFeHA7CisgICAgICAgIGFjY3UgPj49IC1pcXVhbnRpemVyc2hpZnQgLSBzcGVjRXhwOwogCiAgICAgICBtZGN0U3BlY3RydW1bbGluZV0gPSAtYWNjdTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocXVhbnRTcGVjdHJ1bVtsaW5lXSA+IDApIHsKKyAgICB9IGVsc2UgaWYgKHF1YW50U3BlY3RydW1bbGluZV0gPiAwKSB7CiAgICAgICBGSVhQX0RCTCBhY2N1OwotICAgICAgSU5UIGV4LHNwZWNFeHAsdGFiSW5kZXg7Ci0gICAgICBGSVhQX0RCTCBzLHQ7CisgICAgICBJTlQgZXgsIHNwZWNFeHAsIHRhYkluZGV4OworICAgICAgRklYUF9EQkwgcywgdDsKIAogICAgICAgYWNjdSA9IChGSVhQX0RCTCkoSU5UKXF1YW50U3BlY3RydW1bbGluZV07CiAKICAgICAgIGV4ID0gQ291bnRMZWFkaW5nQml0cyhhY2N1KTsKICAgICAgIGFjY3UgPDw9IGV4OwotICAgICAgc3BlY0V4cCA9IChERlJBQ1RfQklUUy0xKSAtIGV4OworICAgICAgc3BlY0V4cCA9IChERlJBQ1RfQklUUyAtIDEpIC0gZXg7CiAKLSAgICAgIEZES19BU1NFUlQoc3BlY0V4cCA8IDE0KTsgICAgICAgLyogdGhpcyBmYWlscyBpZiBhYnModmFsdWUpID4gODE5MSAqLworICAgICAgRkRLX0FTU0VSVChzcGVjRXhwIDwgMTQpOyAvKiB0aGlzIGZhaWxzIGlmIGFicyh2YWx1ZSkgPiA4MTkxICovCiAKLSAgICAgIHRhYkluZGV4ID0gKElOVCkoYWNjdT4+KERGUkFDVF9CSVRTLTItTUFOVF9ESUdJVFMpKSYofk1BTlRfU0laRSk7CisgICAgICB0YWJJbmRleCA9IChJTlQpKGFjY3UgPj4gKERGUkFDVF9CSVRTIC0gMiAtIE1BTlRfRElHSVRTKSkgJiAofk1BTlRfU0laRSk7CiAKICAgICAgIC8qIGNhbGN1bGF0ZSAibWFudGlzc2EiIF40LzMgKi8KICAgICAgIHMgPSBGREthYWNFbmNfbVRhYl80XzNFbGNbdGFiSW5kZXhdOwogCi0gICAgICAvKiBnZXQgYXBwcm9wZXJpYXRlIGV4cG9uZW50IG11bHRpcGxpZXIgZm9yIHNwZWNFeHBeMy80IGNvbWJpbmVkIHdpdGggc2NmTW9kICovCisgICAgICAvKiBnZXQgYXBwcm9wZXJpYXRlIGV4cG9uZW50IG11bHRpcGxpZXIgZm9yIHNwZWNFeHBeMy80IGNvbWJpbmVkIHdpdGgKKyAgICAgICAqIHNjZk1vZCAqLwogICAgICAgdCA9IEZES2FhY0VuY19zcGVjRXhwTWFudFRhYmxlQ29tYkVsY1tpcXVhbnRpemVybW9kXVtzcGVjRXhwXTsKIAogICAgICAgLyogbXVsdGlwbHkgIm1hbnRpc3NhIiBeNC8zIHdpdGggZXhwb25lbnQgbXVsdGlwbGllciAqLwotICAgICAgYWNjdSA9IGZNdWx0KHMsdCk7CisgICAgICBhY2N1ID0gZk11bHQocywgdCk7CiAKICAgICAgIC8qIGdldCBhcHByb3BlcmlhdGUgZXhwb25lbnQgc2hpZnRlciAqLwotICAgICAgc3BlY0V4cCA9IEZES2FhY0VuY19zcGVjRXhwVGFibGVDb21iW2lxdWFudGl6ZXJtb2RdW3NwZWNFeHBdLTE7IC8qIC0xIHRvIGF2b2lkIG92ZXJmbG93cyBpbiBhY2N1ICovCisgICAgICBzcGVjRXhwID0gRkRLYWFjRW5jX3NwZWNFeHBUYWJsZUNvbWJbaXF1YW50aXplcm1vZF1bc3BlY0V4cF0gLQorICAgICAgICAgICAgICAgIDE7IC8qIC0xIHRvIGF2b2lkIG92ZXJmbG93cyBpbiBhY2N1ICovCiAKLSAgICAgIGlmICgoIC1pcXVhbnRpemVyc2hpZnQtc3BlY0V4cCkgPCAwKQotICAgICAgICBhY2N1IDw8PSAtKC1pcXVhbnRpemVyc2hpZnQtc3BlY0V4cCk7CisgICAgICBpZiAoKC1pcXVhbnRpemVyc2hpZnQgLSBzcGVjRXhwKSA8IDApCisgICAgICAgIGFjY3UgPDw9IC0oLWlxdWFudGl6ZXJzaGlmdCAtIHNwZWNFeHApOwogICAgICAgZWxzZQotICAgICAgICBhY2N1ID4+PSAtaXF1YW50aXplcnNoaWZ0LXNwZWNFeHA7CisgICAgICAgIGFjY3UgPj49IC1pcXVhbnRpemVyc2hpZnQgLSBzcGVjRXhwOwogCiAgICAgICBtZGN0U3BlY3RydW1bbGluZV0gPSBhY2N1OwotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgbWRjdFNwZWN0cnVtW2xpbmVdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgfQogICB9CkBAIC0yNjIsMzQgKzI3NSwyOSBAQAogICAgIG91dHB1dDogcXVhbnRpemVkIHNwZWN0cnVtCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBGREthYWNFbmNfUXVhbnRpemVTcGVjdHJ1bShJTlQgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgIElOVCBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICBJTlQgc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgSU5UICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICBJTlQgZ2xvYmFsR2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNjYWxlZmFjdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRpemVkU3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgSU5UIGRab25lUXVhbnRFbmFibGUpCi17Ci0gIElOVCBzZmJPZmZzLHNmYjsKK3ZvaWQgRkRLYWFjRW5jX1F1YW50aXplU3BlY3RydW0oSU5UIHNmYkNudCwgSU5UIG1heFNmYlBlckdyb3VwLCBJTlQgc2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLCBJTlQgZ2xvYmFsR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpzY2FsZWZhY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudGl6ZWRTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGRab25lUXVhbnRFbmFibGUpIHsKKyAgSU5UIHNmYk9mZnMsIHNmYjsKIAogICAvKiBpbiBGREthYWNFbmNfcXVhbnRpemVMaW5lcyBxdWFTcGVjdHJ1bSBpcyBjYWxjdWxhdGVkIHdpdGg6CiAgICAgICAgIHNwZWNeKDMvNCkgKiAyXigtMy8xNipRU1MpICogMl4oMy80KnNjYWxlKSArIGsKICAgICAgc2ltcGxpZnkgc2NhbGluZyBjYWxjdWxhdGlvbiBhbmQgcmVkdWNlIFFTUyBiZWZvcmU6CiAgICAgICAgIHNwZWNeKDMvNCkgKiAyXigtMy8xNiooUVNTIC0gNCpzY2FsZSkpICovCiAKLSAgZm9yKHNmYk9mZnM9MDtzZmJPZmZzPHNmYkNudDtzZmJPZmZzKz1zZmJQZXJHcm91cCkKLSAgZm9yIChzZmIgPSAwOyBzZmIgPCBtYXhTZmJQZXJHcm91cDsgc2ZiKyspCi0gIHsKLSAgICBJTlQgc2NhbGVmYWN0b3IgPSBzY2FsZWZhY3RvcnNbc2ZiT2ZmcytzZmJdIDsKKyAgZm9yIChzZmJPZmZzID0gMDsgc2ZiT2ZmcyA8IHNmYkNudDsgc2ZiT2ZmcyArPSBzZmJQZXJHcm91cCkKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgSU5UIHNjYWxlZmFjdG9yID0gc2NhbGVmYWN0b3JzW3NmYk9mZnMgKyBzZmJdOwogCi0gICAgRkRLYWFjRW5jX3F1YW50aXplTGluZXMoZ2xvYmFsR2FpbiAtIHNjYWxlZmFjdG9yLCAvKiBRU1MgKi8KLSAgICAgICAgICAgICAgICAgIHNmYk9mZnNldFtzZmJPZmZzK3NmYisxXSAtIHNmYk9mZnNldFtzZmJPZmZzK3NmYl0sCi0gICAgICAgICAgICAgICAgICBtZGN0U3BlY3RydW0gKyBzZmJPZmZzZXRbc2ZiT2ZmcytzZmJdLAotICAgICAgICAgICAgICAgICAgcXVhbnRpemVkU3BlY3RydW0gKyBzZmJPZmZzZXRbc2ZiT2ZmcytzZmJdLAotICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSk7Ci0gIH0KKyAgICAgIEZES2FhY0VuY19xdWFudGl6ZUxpbmVzKAorICAgICAgICAgIGdsb2JhbEdhaW4gLSBzY2FsZWZhY3RvciwgLyogUVNTICovCisgICAgICAgICAgc2ZiT2Zmc2V0W3NmYk9mZnMgKyBzZmIgKyAxXSAtIHNmYk9mZnNldFtzZmJPZmZzICsgc2ZiXSwKKyAgICAgICAgICBtZGN0U3BlY3RydW0gKyBzZmJPZmZzZXRbc2ZiT2ZmcyArIHNmYl0sCisgICAgICAgICAgcXVhbnRpemVkU3BlY3RydW0gKyBzZmJPZmZzZXRbc2ZiT2ZmcyArIHNmYl0sIGRab25lUXVhbnRFbmFibGUpOworICAgIH0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMDEsNDEgKzMwOSwzNCBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1GSVhQX0RCTCBGREthYWNFbmNfY2FsY1NmYkRpc3QoRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgSU5UIG5vT2ZMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgIElOVCBnYWluLAotICAgICAgICAgICAgICAgICAgICAgSU5UIGRab25lUXVhbnRFbmFibGUKLSAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgSU5UIGksc2NhbGU7CitGSVhQX0RCTCBGREthYWNFbmNfY2FsY1NmYkRpc3QoY29uc3QgRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjdHJ1bSwgSU5UIG5vT2ZMaW5lcywgSU5UIGdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGRab25lUXVhbnRFbmFibGUpIHsKKyAgSU5UIGksIHNjYWxlOwogICBGSVhQX0RCTCB4ZnNmOwogICBGSVhQX0RCTCBkaWZmOwogICBGSVhQX0RCTCBpbnZRdWFudFNwZWM7CiAKICAgeGZzZiA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogCi0gIGZvciAoaT0wOyBpPG5vT2ZMaW5lczsgaSsrKSB7CisgIGZvciAoaSA9IDA7IGkgPCBub09mTGluZXM7IGkrKykgewogICAgIC8qIHF1YW50aXphdGlvbiAqLwotICAgIEZES2FhY0VuY19xdWFudGl6ZUxpbmVzKGdhaW4sCi0gICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAmbWRjdFNwZWN0cnVtW2ldLAotICAgICAgICAgICAgICAgICAmcXVhbnRTcGVjdHJ1bVtpXSwKLSAgICAgICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUpOworICAgIEZES2FhY0VuY19xdWFudGl6ZUxpbmVzKGdhaW4sIDEsICZtZGN0U3BlY3RydW1baV0sICZxdWFudFNwZWN0cnVtW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUpOwogCi0gICAgaWYgKGZBYnMocXVhbnRTcGVjdHJ1bVtpXSk+TUFYX1FVQU5UKSB7CisgICAgaWYgKGZBYnMocXVhbnRTcGVjdHJ1bVtpXSkgPiBNQVhfUVVBTlQpIHsKICAgICAgIHJldHVybiBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICB9CiAgICAgLyogaW52ZXJzZSBxdWFudGl6YXRpb24gKi8KLSAgICBGREthYWNFbmNfaW52UXVhbnRpemVMaW5lcyhnYWluLDEsJnF1YW50U3BlY3RydW1baV0sJmludlF1YW50U3BlYyk7CisgICAgRkRLYWFjRW5jX2ludlF1YW50aXplTGluZXMoZ2FpbiwgMSwgJnF1YW50U3BlY3RydW1baV0sICZpbnZRdWFudFNwZWMpOwogCiAgICAgLyogZGlzdCAqLwotICAgIGRpZmYgPSBmaXhwX2FicyhmaXhwX2FicyhpbnZRdWFudFNwZWMpIC0gZml4cF9hYnMobWRjdFNwZWN0cnVtW2ldPj4xKSk7CisgICAgZGlmZiA9IGZpeHBfYWJzKGZpeHBfYWJzKGludlF1YW50U3BlYykgLSBmaXhwX2FicyhtZGN0U3BlY3RydW1baV0gPj4gMSkpOwogCiAgICAgc2NhbGUgPSBDb3VudExlYWRpbmdCaXRzKGRpZmYpOwogICAgIGRpZmYgPSBzY2FsZVZhbHVlKGRpZmYsIHNjYWxlKTsKICAgICBkaWZmID0gZlBvdzIoZGlmZik7Ci0gICAgc2NhbGUgPSBmaXhNaW4oMiooc2NhbGUtMSksIERGUkFDVF9CSVRTLTEpOworICAgIHNjYWxlID0gZml4TWluKDIgKiAoc2NhbGUgLSAxKSwgREZSQUNUX0JJVFMgLSAxKTsKIAogICAgIGRpZmYgPSBzY2FsZVZhbHVlKGRpZmYsIC1zY2FsZSk7CiAKQEAgLTM1OCw0OCArMzU5LDQzIEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBGREthYWNFbmNfY2FsY1NmYlF1YW50RW5lcmd5QW5kRGlzdChGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBub09mTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpkaXN0KQotewotICBJTlQgaSxzY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50U3BlY3RydW0sIElOVCBub09mTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBnYWluLCBGSVhQX0RCTCAqZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpkaXN0KSB7CisgIElOVCBpLCBzY2FsZTsKICAgRklYUF9EQkwgaW52UXVhbnRTcGVjOwogICBGSVhQX0RCTCBkaWZmOwogCiAgIEZJWFBfREJMIGVuZXJneSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICBGSVhQX0RCTCBkaXN0b3J0aW9uID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKLSAgZm9yIChpPTA7IGk8bm9PZkxpbmVzOyBpKyspIHsKLQotICAgIGlmIChmQWJzKHF1YW50U3BlY3RydW1baV0pPk1BWF9RVUFOVCkgewotICAgICAgKmVuICAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgZm9yIChpID0gMDsgaSA8IG5vT2ZMaW5lczsgaSsrKSB7CisgICAgaWYgKGZBYnMocXVhbnRTcGVjdHJ1bVtpXSkgPiBNQVhfUVVBTlQpIHsKKyAgICAgICplbiA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgKmRpc3QgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICAvKiBpbnZlcnNlIHF1YW50aXphdGlvbiAqLwotICAgIEZES2FhY0VuY19pbnZRdWFudGl6ZUxpbmVzKGdhaW4sMSwmcXVhbnRTcGVjdHJ1bVtpXSwmaW52UXVhbnRTcGVjKTsKKyAgICBGREthYWNFbmNfaW52UXVhbnRpemVMaW5lcyhnYWluLCAxLCAmcXVhbnRTcGVjdHJ1bVtpXSwgJmludlF1YW50U3BlYyk7CiAKICAgICAvKiBlbmVyZ3kgKi8KICAgICBlbmVyZ3kgKz0gZlBvdzIoaW52UXVhbnRTcGVjKTsKIAogICAgIC8qIGRpc3QgKi8KLSAgICBkaWZmID0gZml4cF9hYnMoZml4cF9hYnMoaW52UXVhbnRTcGVjKSAtIGZpeHBfYWJzKG1kY3RTcGVjdHJ1bVtpXT4+MSkpOworICAgIGRpZmYgPSBmaXhwX2FicyhmaXhwX2FicyhpbnZRdWFudFNwZWMpIC0gZml4cF9hYnMobWRjdFNwZWN0cnVtW2ldID4+IDEpKTsKIAogICAgIHNjYWxlID0gQ291bnRMZWFkaW5nQml0cyhkaWZmKTsKICAgICBkaWZmID0gc2NhbGVWYWx1ZShkaWZmLCBzY2FsZSk7CiAgICAgZGlmZiA9IGZQb3cyKGRpZmYpOwogCi0gICAgc2NhbGUgPSBmaXhNaW4oMiooc2NhbGUtMSksIERGUkFDVF9CSVRTLTEpOworICAgIHNjYWxlID0gZml4TWluKDIgKiAoc2NhbGUgLSAxKSwgREZSQUNUX0JJVFMgLSAxKTsKIAogICAgIGRpZmYgPSBzY2FsZVZhbHVlKGRpZmYsIC1zY2FsZSk7CiAKICAgICBkaXN0b3J0aW9uICs9IGRpZmY7CiAgIH0KIAotICAqZW4gICA9IENhbGNMZERhdGEoZW5lcmd5KStGTDJGWENPTlNUX0RCTCgwLjAzMTI1Zik7CisgICplbiA9IENhbGNMZERhdGEoZW5lcmd5KSArIEZMMkZYQ09OU1RfREJMKDAuMDMxMjVmKTsKICAgKmRpc3QgPSBDYWxjTGREYXRhKGRpc3RvcnRpb24pOwogfQotCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3F1YW50aXplLmggYi9saWJBQUNlbmMvc3JjL3F1YW50aXplLmgKaW5kZXggMTZkM2Q0ZS4uZGZjMjIwNiAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9xdWFudGl6ZS5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvcXVhbnRpemUuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNyArOTAsMTggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBRdWFudGl6YXRpb24KKyAgIEF1dGhvcihzKTogICBNLldlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogUXVhbnRpemF0aW9uCiAKLSNpZm5kZWYgX1FVQU5USVpFX0hfCi0jZGVmaW5lIF9RVUFOVElaRV9IXworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBRVUFOVElaRV9ICisjZGVmaW5lIFFVQU5USVpFX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIApAQCAtOTcsMjUgKzEwOSwxOSBAQAogCiAjZGVmaW5lIE1BWF9RVUFOVCA4MTkxCiAKLXZvaWQgRkRLYWFjRW5jX1F1YW50aXplU3BlY3RydW0oSU5UIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICBJTlQgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgSU5UIHNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2ZiT2Zmc2V0LCBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgIElOVCBnbG9iYWxHYWluLCBJTlQgKnNjYWxlZmFjdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRpemVkU3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgSU5UIGRab25lUXVhbnRFbmFibGUpOwordm9pZCBGREthYWNFbmNfUXVhbnRpemVTcGVjdHJ1bShJTlQgc2ZiQ250LCBJTlQgbWF4U2ZiUGVyR3JvdXAsIElOVCBzZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICptZGN0U3BlY3RydW0sIElOVCBnbG9iYWxHYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKnNjYWxlZmFjdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50aXplZFNwZWN0cnVtLCBJTlQgZFpvbmVRdWFudEVuYWJsZSk7CiAKLUZJWFBfREJMIEZES2FhY0VuY19jYWxjU2ZiRGlzdChGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICBJTlQgbm9PZkxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgSU5UIGdhaW4sCi0gICAgICAgICAgICAgICAgICAgICBJTlQgZFpvbmVRdWFudEVuYWJsZSk7CitGSVhQX0RCTCBGREthYWNFbmNfY2FsY1NmYkRpc3QoY29uc3QgRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjdHJ1bSwgSU5UIG5vT2ZMaW5lcywgSU5UIGdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGRab25lUXVhbnRFbmFibGUpOwogCiB2b2lkIEZES2FhY0VuY19jYWxjU2ZiUXVhbnRFbmVyZ3lBbmREaXN0KEZJWFBfREJMICptZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgICAqcXVhbnRTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgbm9PZkxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICBnYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICplbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqZGlzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudFNwZWN0cnVtLCBJTlQgbm9PZkxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZ2FpbiwgRklYUF9EQkwgKmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqZGlzdCk7CiAKLSNlbmRpZiAvKiBfUVVBTlRJWkVfSF8gKi8KKyNlbmRpZiAvKiBRVUFOVElaRV9IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3NmX2VzdGltLmNwcCBiL2xpYkFBQ2VuYy9zcmMvc2ZfZXN0aW0uY3BwCmluZGV4IDFjYjI0M2IuLjE3YThhZTIgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvc2ZfZXN0aW0uY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvc2ZfZXN0aW0uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDMzICs5MCwzNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBXZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBTY2FsZSBmYWN0b3IgZXN0aW1hdGlvbgorICAgQXV0aG9yKHMpOiAgIE0uIFdlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogU2NhbGUgZmFjdG9yIGVzdGltYXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInNmX2VzdGltLmgiCiAjaW5jbHVkZSAiYWFjRW5jX3JvbS5oIgogI2luY2x1ZGUgInF1YW50aXplLmgiCiAjaW5jbHVkZSAiYml0X2NudC5oIgogCisjaWZkZWYgX19hcm1fXworI2VuZGlmCiAKLQotCisjZGVmaW5lIFVQQ09VTlRfTElNSVQgMQogI2RlZmluZSBBU19QRV9GQUNfU0hJRlQgNwotI2RlZmluZSBESVNUX0ZBQ19TSElGVCAgMworI2RlZmluZSBESVNUX0ZBQ19TSElGVCAzCiAjZGVmaW5lIEFTX1BFX0ZBQ19GTE9BVCAoZmxvYXQpKDEgPDwgQVNfUEVfRkFDX1NISUZUKQogc3RhdGljIGNvbnN0IElOVCBNQVhfU0NGX0RFTFRBID0gNjA7CiAKLQotc3RhdGljIGNvbnN0IEZJWFBfREJMIFBFX0MxID0gRkwyRlhDT05TVF9EQkwoMy4wZi9BU19QRV9GQUNfRkxPQVQpOyAgICAgICAgICAvKiAobG9nKDguMCkvbG9nKDIpKSA+PiBBU19QRV9GQUNfU0hJRlQgKi8KLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBQRV9DMiA9IEZMMkZYQ09OU1RfREJMKDEuMzIxOTI4MWYvQVNfUEVfRkFDX0ZMT0FUKTsgICAgLyogKGxvZygyLjUpL2xvZygyKSkgPj4gQVNfUEVfRkFDX1NISUZUICovCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgUEVfQzMgPSBGTDJGWENPTlNUX0RCTCgwLjU1OTM1NzNmKTsgICAgICAgICAgICAgICAgICAgIC8qIDEtQzIvQzEgKi8KLQorc3RhdGljIGNvbnN0IEZJWFBfREJMIFBFX0MxID0gRkwyRlhDT05TVF9EQkwoCisgICAgMy4wZiAvIEFTX1BFX0ZBQ19GTE9BVCk7IC8qIChsb2coOC4wKS9sb2coMikpID4+IEFTX1BFX0ZBQ19TSElGVCAqLworc3RhdGljIGNvbnN0IEZJWFBfREJMIFBFX0MyID0gRkwyRlhDT05TVF9EQkwoCisgICAgMS4zMjE5MjgxZiAvIEFTX1BFX0ZBQ19GTE9BVCk7IC8qIChsb2coMi41KS9sb2coMikpID4+IEFTX1BFX0ZBQ19TSElGVCAqLworc3RhdGljIGNvbnN0IEZJWFBfREJMIFBFX0MzID0gRkwyRlhDT05TVF9EQkwoMC41NTkzNTczZik7IC8qIDEtQzIvQzEgKi8KIAogLyoKICAgRnVuY3Rpb247IEZES2FhY0VuY19GREthYWNFbmNfQ2FsY0Zvcm1GYWN0b3JDaGFubmVsCkBAIC0xMTMsMzAgKzEyNiwzMiBAQAogICBEZXNjcmlwdGlvbjogQ2FsY3VsYXRlcyB0aGUgZm9ybWZhY3RvcgogCiAgIHNmOiBzY2FsZSBmYWN0b3Igb2YgdGhlIG1kY3Qgc3BlY3RydW0KLSAgc2ZiRm9ybUZhY3RvckxkRGF0YSBpcyBzY2FsZWQgd2l0aCB0aGUgZmFjdG9yIDEvKCgoMl5zZileMC41KSAqICgyXkZPUk1fRkFDX1NISUZUKSkKKyAgc2ZiRm9ybUZhY3RvckxkRGF0YSBpcyBzY2FsZWQgd2l0aCB0aGUgZmFjdG9yIDEvKCgoMl5zZileMC41KSAqCisgICgyXkZPUk1fRkFDX1NISUZUKSkKICovCi1zdGF0aWMgdm9pZAotRkRLYWFjRW5jX0ZES2FhY0VuY19DYWxjRm9ybUZhY3RvckNoYW5uZWwoRklYUF9EQkwgKlJFU1RSSUNUIHNmYkZvcm1GYWN0b3JMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICpSRVNUUklDVCBwc3lPdXRDaGFuKQoteworc3RhdGljIHZvaWQgRkRLYWFjRW5jX0ZES2FhY0VuY19DYWxjRm9ybUZhY3RvckNoYW5uZWwoCisgICAgRklYUF9EQkwgKlJFU1RSSUNUIHNmYkZvcm1GYWN0b3JMZERhdGEsCisgICAgUFNZX09VVF9DSEFOTkVMICpSRVNUUklDVCBwc3lPdXRDaGFuKSB7CiAgIElOVCBqLCBzZmIsIHNmYkdycDsKICAgRklYUF9EQkwgZm9ybUZhY3RvcjsKIAogICBpbnQgdG1wMCA9IHBzeU91dENoYW4tPnNmYkNudDsKICAgaW50IHRtcDEgPSBwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsKICAgaW50IHN0ZXAgPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cDsKLSAgZm9yKHNmYkdycCA9IDA7IHNmYkdycCA8IHRtcDA7IHNmYkdycCArPSBzdGVwKSB7CisgIGZvciAoc2ZiR3JwID0gMDsgc2ZiR3JwIDwgdG1wMDsgc2ZiR3JwICs9IHN0ZXApIHsKICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHRtcDE7IHNmYisrKSB7CiAgICAgICBmb3JtRmFjdG9yID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICAvKiBjYWxjIHN1bSBvZiBzcXJ0KHNwZWMpICovCi0gICAgICBmb3Ioaj1wc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYkdycCtzZmJdOyBqPHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiR3JwK3NmYisxXTsgaisrICkgewotICAgICAgICAgZm9ybUZhY3RvciArPSBzcXJ0Rml4cChmaXhwX2Ficyhwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW1bal0pKT4+Rk9STV9GQUNfU0hJRlQ7CisgICAgICBmb3IgKGogPSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYkdycCArIHNmYl07CisgICAgICAgICAgIGogPCBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYkdycCArIHNmYiArIDFdOyBqKyspIHsKKyAgICAgICAgZm9ybUZhY3RvciArPQorICAgICAgICAgICAgc3FydEZpeHAoZml4cF9hYnMocHN5T3V0Q2hhbi0+bWRjdFNwZWN0cnVtW2pdKSkgPj4gRk9STV9GQUNfU0hJRlQ7CiAgICAgICB9Ci0gICAgICBzZmJGb3JtRmFjdG9yTGREYXRhW3NmYkdycCtzZmJdID0gQ2FsY0xkRGF0YShmb3JtRmFjdG9yKTsKKyAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGFbc2ZiR3JwICsgc2ZiXSA9IENhbGNMZERhdGEoZm9ybUZhY3Rvcik7CiAgICAgfQogICAgIC8qIHNldCBzZmJGb3JtRmFjdG9yIGZvciBzZmJzIHdpdGggemVybyBzcGVjIHRvIHplcm8uIEp1c3QgZm9yIGRlYnVnZ2luZy4gKi8KLSAgICBmb3IgKCA7IHNmYiA8IHBzeU91dENoYW4tPnNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgc2ZiRm9ybUZhY3RvckxkRGF0YVtzZmJHcnArc2ZiXSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKKyAgICBmb3IgKDsgc2ZiIDwgcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICBzZmJGb3JtRmFjdG9yTGREYXRhW3NmYkdycCArIHNmYl0gPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7CiAgICAgfQogICB9CiB9CkBAIC0xNDQsMTcgKzE1OSwxNyBAQAogLyoKICAgRnVuY3Rpb246IEZES2FhY0VuY19DYWxjRm9ybUZhY3RvcgogCi0gIERlc2NyaXB0aW9uOiBDYWxscyBGREthYWNFbmNfRkRLYWFjRW5jX0NhbGNGb3JtRmFjdG9yQ2hhbm5lbCgpIGZvciBlYWNoIGNoYW5uZWwKKyAgRGVzY3JpcHRpb246IENhbGxzIEZES2FhY0VuY19GREthYWNFbmNfQ2FsY0Zvcm1GYWN0b3JDaGFubmVsKCkgZm9yIGVhY2gKKyAgY2hhbm5lbAogKi8KIAotdm9pZAotRkRLYWFjRW5jX0NhbGNGb3JtRmFjdG9yKFFDX09VVF9DSEFOTkVMICAgKnFjT3V0Q2hhbm5lbFsoMildLAotICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICAqcHN5T3V0Q2hhbm5lbFsoMildLAotICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBuQ2hhbm5lbHMpCi17Cit2b2lkIEZES2FhY0VuY19DYWxjRm9ybUZhY3RvcihRQ19PVVRfQ0hBTk5FTCAqcWNPdXRDaGFubmVsWygyKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ2hhbm5lbHMpIHsKICAgSU5UIGo7Ci0gIGZvciAoaj0wOyBqPG5DaGFubmVsczsgaisrKSB7Ci0gICAgRkRLYWFjRW5jX0ZES2FhY0VuY19DYWxjRm9ybUZhY3RvckNoYW5uZWwocWNPdXRDaGFubmVsW2pdLT5zZmJGb3JtRmFjdG9yTGREYXRhLCBwc3lPdXRDaGFubmVsW2pdKTsKKyAgZm9yIChqID0gMDsgaiA8IG5DaGFubmVsczsgaisrKSB7CisgICAgRkRLYWFjRW5jX0ZES2FhY0VuY19DYWxjRm9ybUZhY3RvckNoYW5uZWwoCisgICAgICAgIHFjT3V0Q2hhbm5lbFtqXS0+c2ZiRm9ybUZhY3RvckxkRGF0YSwgcHN5T3V0Q2hhbm5lbFtqXSk7CiAgIH0KIH0KIApAQCAtMTY1LDQwICsxODAsNDQgQEAKIAogICBzZmJOUmVsZXZhbnRMaW5lcyBpcyBzY2FsZWQgd2l0aCB0aGUgZmFjdG9yIDEvKCgyXkZPUk1fRkFDX1NISUZUKSAqIDIuMCkKICovCi1zdGF0aWMgdm9pZAotRkRLYWFjRW5jX2NhbGNTZmJSZWxldmFudExpbmVzKCBjb25zdCBGSVhQX0RCTCAqY29uc3Qgc2ZiRm9ybUZhY3RvckxkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3Qgc2ZiRW5lcmd5TGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBzZmJUaHJlc2hvbGRMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpjb25zdCBzZmJPZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiTlJlbGV2YW50TGluZXMpCi17CitzdGF0aWMgdm9pZCBGREthYWNFbmNfY2FsY1NmYlJlbGV2YW50TGluZXMoCisgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHNmYkZvcm1GYWN0b3JMZERhdGEsCisgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHNmYkVuZXJneUxkRGF0YSwKKyAgICBjb25zdCBGSVhQX0RCTCAqY29uc3Qgc2ZiVGhyZXNob2xkTGREYXRhLCBjb25zdCBJTlQgKmNvbnN0IHNmYk9mZnNldHMsCisgICAgY29uc3QgSU5UIHNmYkNudCwgY29uc3QgSU5UIHNmYlBlckdyb3VwLCBjb25zdCBJTlQgbWF4U2ZiUGVyR3JvdXAsCisgICAgRklYUF9EQkwgKnNmYk5SZWxldmFudExpbmVzKSB7CiAgIElOVCBzZmJPZmZzLCBzZmI7CiAgIEZJWFBfREJMIHNmYldpZHRoTGREYXRhOwotICBGSVhQX0RCTCBhc1BlRmFjTGREYXRhID0gRkwyRlhDT05TVF9EQkwoMC4xMDkzNzUpOyAgIC8qIEFTX1BFX0ZBQ19TSElGVCpsZDY0KDIpICovCisgIEZJWFBfREJMIGFzUGVGYWNMZERhdGEgPQorICAgICAgRkwyRlhDT05TVF9EQkwoMC4xMDkzNzUpOyAvKiBBU19QRV9GQUNfU0hJRlQqbGQ2NCgyKSAqLwogICBGSVhQX0RCTCBhY2N1OwogCi0gIC8qIHNmYk5SZWxldmFudExpbmVzW2ldID0gMl4oIChzZmJGb3JtRmFjdG9yTGREYXRhW2ldIC0gMC4yNSAqIChzZmJFbmVyZ3lMZERhdGFbaV0gLSBsZDY0KHNmYldpZHRoW2ldLygyXjcpKSAtIEFTX1BFX0ZBQ19TSElGVCpsZDY0KDIpKSAqIDY0KTsgKi8KKyAgLyogc2ZiTlJlbGV2YW50TGluZXNbaV0gPSAyXiggKHNmYkZvcm1GYWN0b3JMZERhdGFbaV0gLSAwLjI1ICoKKyAgICogKHNmYkVuZXJneUxkRGF0YVtpXSAtIGxkNjQoc2ZiV2lkdGhbaV0vKDJeNykpIC0gQVNfUEVfRkFDX1NISUZUKmxkNjQoMikpICoKKyAgICogNjQpOyAqLwogCiAgIEZES21lbWNsZWFyKHNmYk5SZWxldmFudExpbmVzLCBzZmJDbnQgKiBzaXplb2YoRklYUF9EQkwpKTsKIAotICBmb3IgKHNmYk9mZnM9MDsgc2ZiT2ZmczxzZmJDbnQ7IHNmYk9mZnMrPXNmYlBlckdyb3VwKSB7Ci0gICAgZm9yKHNmYj0wOyBzZmI8bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgIGZvciAoc2ZiT2ZmcyA9IDA7IHNmYk9mZnMgPCBzZmJDbnQ7IHNmYk9mZnMgKz0gc2ZiUGVyR3JvdXApIHsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIrKykgewogICAgICAgLyogY2FsYyBzdW0gb2Ygc3FydChzcGVjKSAqLwotICAgICAgaWYoKEZJWFBfREJMKXNmYkVuZXJneUxkRGF0YVtzZmJPZmZzK3NmYl0gPiAoRklYUF9EQkwpc2ZiVGhyZXNob2xkTGREYXRhW3NmYk9mZnMrc2ZiXSkgewotICAgICAgICBJTlQgc2ZiV2lkdGggPSBzZmJPZmZzZXRzW3NmYk9mZnMrc2ZiKzFdIC0gc2ZiT2Zmc2V0c1tzZmJPZmZzK3NmYl07CisgICAgICBpZiAoKEZJWFBfREJMKXNmYkVuZXJneUxkRGF0YVtzZmJPZmZzICsgc2ZiXSA+CisgICAgICAgICAgKEZJWFBfREJMKXNmYlRocmVzaG9sZExkRGF0YVtzZmJPZmZzICsgc2ZiXSkgeworICAgICAgICBJTlQgc2ZiV2lkdGggPQorICAgICAgICAgICAgc2ZiT2Zmc2V0c1tzZmJPZmZzICsgc2ZiICsgMV0gLSBzZmJPZmZzZXRzW3NmYk9mZnMgKyBzZmJdOwogCi0gICAgICAgIC8qIGF2Z0Zvcm1GYWN0b3JMZERhdGEgPSBzcXJ0Rml4cChzcXJ0Rml4cChzZmJFbmVyZ3lMZERhdGFbc2ZiT2ZmcytzZmJdL3NmYldpZHRoKSk7ICovCi0gICAgICAgIC8qIHNmYk5SZWxldmFudExpbmVzW3NmYk9mZnMrc2ZiXSA9IHNmYkZvcm1GYWN0b3Jbc2ZiT2ZmcytzZmJdIC8gYXZnRm9ybUZhY3RvckxkRGF0YTsgKi8KLSAgICAgICAgc2ZiV2lkdGhMZERhdGEgPSAoRklYUF9EQkwpKHNmYldpZHRoIDw8IChERlJBQ1RfQklUUy0xLUFTX1BFX0ZBQ19TSElGVCkpOworICAgICAgICAvKiBhdmdGb3JtRmFjdG9yTGREYXRhID0KKyAgICAgICAgICogc3FydEZpeHAoc3FydEZpeHAoc2ZiRW5lcmd5TGREYXRhW3NmYk9mZnMrc2ZiXS9zZmJXaWR0aCkpOyAqLworICAgICAgICAvKiBzZmJOUmVsZXZhbnRMaW5lc1tzZmJPZmZzK3NmYl0gPSBzZmJGb3JtRmFjdG9yW3NmYk9mZnMrc2ZiXSAvCisgICAgICAgICAqIGF2Z0Zvcm1GYWN0b3JMZERhdGE7ICovCisgICAgICAgIHNmYldpZHRoTGREYXRhID0KKyAgICAgICAgICAgIChGSVhQX0RCTCkoc2ZiV2lkdGggPDwgKERGUkFDVF9CSVRTIC0gMSAtIEFTX1BFX0ZBQ19TSElGVCkpOwogICAgICAgICBzZmJXaWR0aExkRGF0YSA9IENhbGNMZERhdGEoc2ZiV2lkdGhMZERhdGEpOwogCi0gICAgICAgIGFjY3UgPSBzZmJFbmVyZ3lMZERhdGFbc2ZiT2ZmcytzZmJdIC0gc2ZiV2lkdGhMZERhdGEgLSBhc1BlRmFjTGREYXRhOwotICAgICAgICBhY2N1ID0gc2ZiRm9ybUZhY3RvckxkRGF0YVtzZmJPZmZzK3NmYl0gLSAoYWNjdSA+PiAyKTsKKyAgICAgICAgYWNjdSA9IHNmYkVuZXJneUxkRGF0YVtzZmJPZmZzICsgc2ZiXSAtIHNmYldpZHRoTGREYXRhIC0gYXNQZUZhY0xkRGF0YTsKKyAgICAgICAgYWNjdSA9IHNmYkZvcm1GYWN0b3JMZERhdGFbc2ZiT2ZmcyArIHNmYl0gLSAoYWNjdSA+PiAyKTsKIAotICAgICAgICBzZmJOUmVsZXZhbnRMaW5lc1tzZmJPZmZzK3NmYl0gPSBDYWxjSW52TGREYXRhKGFjY3UpID4+IDE7CisgICAgICAgIHNmYk5SZWxldmFudExpbmVzW3NmYk9mZnMgKyBzZmJdID0gQ2FsY0ludkxkRGF0YShhY2N1KSA+PiAxOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMjExLDE0ICsyMzAsMTQgQEAKIAogICBzY2ZCaXRzRnJhY3QgaXMgc2NhbGVkIGJ5IDEvKDJeKDIqQVNfUEVfRkFDX1NISUZUKSkKICovCi1zdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX2NvdW50U2luZ2xlU2NmQml0cyhJTlQgc2NmLCBJTlQgc2NmTGVmdCwgSU5UIHNjZlJpZ2h0KQoteworc3RhdGljIEZJWFBfREJMIEZES2FhY0VuY19jb3VudFNpbmdsZVNjZkJpdHMoSU5UIHNjZiwgSU5UIHNjZkxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NmUmlnaHQpIHsKICAgRklYUF9EQkwgc2NmQml0c0ZyYWN0OwogCi0gIHNjZkJpdHNGcmFjdCA9IChGSVhQX0RCTCkgKCAgRkRLYWFjRW5jX2JpdENvdW50U2NhbGVmYWN0b3JEZWx0YShzY2ZMZWZ0LXNjZikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZi1zY2ZSaWdodCkgKTsKKyAgc2NmQml0c0ZyYWN0ID0gKEZJWFBfREJMKShGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZkxlZnQgLSBzY2YpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZiAtIHNjZlJpZ2h0KSk7CiAKLSAgc2NmQml0c0ZyYWN0ID0gc2NmQml0c0ZyYWN0IDw8IChERlJBQ1RfQklUUy0xLSgyKkFTX1BFX0ZBQ19TSElGVCkpOworICBzY2ZCaXRzRnJhY3QgPSBzY2ZCaXRzRnJhY3QgPDwgKERGUkFDVF9CSVRTIC0gMSAtICgyICogQVNfUEVfRkFDX1NISUZUKSk7CiAKICAgcmV0dXJuIHNjZkJpdHNGcmFjdDsgLyogb3V0cHV0IHNjYWxlZCBieSAxLygyXigyKkFTX1BFX0ZBQykpICovCiB9CkBAIC0yMjgsMjEgKzI0NywyMSBAQAogCiAgIHNwZWNQZSBpcyBzY2FsZWQgYnkgMS8oMl4oMipBU19QRV9GQUNfU0hJRlQpKQogKi8KLXN0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfY2FsY1NpbmdsZVNwZWNQZShJTlQgc2NmLCBGSVhQX0RCTCBzZmJDb25zdFBlUGFydCwgRklYUF9EQkwgbkxpbmVzKQoteworc3RhdGljIEZJWFBfREJMIEZES2FhY0VuY19jYWxjU2luZ2xlU3BlY1BlKElOVCBzY2YsIEZJWFBfREJMIHNmYkNvbnN0UGVQYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIG5MaW5lcykgewogICBGSVhQX0RCTCBzcGVjUGUgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgRklYUF9EQkwgbGRSYXRpbzsKICAgRklYUF9EQkwgc2NmRnJhY3Q7CiAKLSAgc2NmRnJhY3QgPSAoRklYUF9EQkwpKHNjZiA8PCAoREZSQUNUX0JJVFMtMS1BU19QRV9GQUNfU0hJRlQpKTsKKyAgc2NmRnJhY3QgPSAoRklYUF9EQkwpKHNjZiA8PCAoREZSQUNUX0JJVFMgLSAxIC0gQVNfUEVfRkFDX1NISUZUKSk7CiAKLSAgbGRSYXRpbyA9IHNmYkNvbnN0UGVQYXJ0IC0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC4zNzVmKSxzY2ZGcmFjdCk7CisgIGxkUmF0aW8gPSBzZmJDb25zdFBlUGFydCAtIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuMzc1ZiksIHNjZkZyYWN0KTsKIAogICBpZiAobGRSYXRpbyA+PSBQRV9DMSkgewotICAgIHNwZWNQZSA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuN2YpLGZNdWx0KG5MaW5lcyxsZFJhdGlvKSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgc3BlY1BlID0gZk11bHQoRkwyRlhDT05TVF9EQkwoMC43ZiksZk11bHQobkxpbmVzLChQRV9DMiArIGZNdWx0KFBFX0MzLGxkUmF0aW8pKSkpOworICAgIHNwZWNQZSA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuN2YpLCBmTXVsdChuTGluZXMsIGxkUmF0aW8pKTsKKyAgfSBlbHNlIHsKKyAgICBzcGVjUGUgPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjdmKSwKKyAgICAgICAgICAgICAgICAgICBmTXVsdChuTGluZXMsIChQRV9DMiArIGZNdWx0KFBFX0MzLCBsZFJhdGlvKSkpKTsKICAgfQogCiAgIHJldHVybiBzcGVjUGU7IC8qIG91dHB1dCBzY2FsZWQgYnkgMS8oMl4oMipBU19QRV9GQUMpKSAqLwpAQCAtMjUzLDEyICsyNzIsOCBAQAogCiAgIHNjZkJpdHNEaWZmIGlzIHNjYWxlZCBieSAxLygyXigyKkFTX1BFX0ZBQ19TSElGVCkpCiAqLwotc3RhdGljIEZJWFBfREJMIEZES2FhY0VuY19jb3VudFNjZkJpdHNEaWZmKElOVCAqc2NmT2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpzY2ZOZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXJ0U2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0b3BTZmIpCi17CitzdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX2NvdW50U2NmQml0c0RpZmYoSU5UICpzY2ZPbGQsIElOVCAqc2NmTmV3LCBJTlQgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdGFydFNmYiwgSU5UIHN0b3BTZmIpIHsKICAgRklYUF9EQkwgc2NmQml0c0ZyYWN0OwogICBJTlQgc2NmQml0c0RpZmYgPSAwOwogICBJTlQgc2ZiID0gMCwgc2ZiTGFzdDsKQEAgLTI2NiwzMiArMjgxLDMzIEBACiAKICAgLyogc2VhcmNoIGZvciBmaXJzdCByZWxldmFudCBzZmIgKi8KICAgc2ZiTGFzdCA9IHN0YXJ0U2ZiOwotICB3aGlsZSAoKHNmYkxhc3Q8c3RvcFNmYikgJiYgKHNjZk9sZFtzZmJMYXN0XT09RkRLX0lOVF9NSU4pKQotICAgIHNmYkxhc3QrKzsKKyAgd2hpbGUgKChzZmJMYXN0IDwgc3RvcFNmYikgJiYgKHNjZk9sZFtzZmJMYXN0XSA9PSBGREtfSU5UX01JTikpIHNmYkxhc3QrKzsKICAgLyogc2VhcmNoIGZvciBwcmV2aW91cyByZWxldmFudCBzZmIgYW5kIGNvdW50IGRpZmYgKi8KICAgc2ZiUHJldiA9IHN0YXJ0U2ZiIC0gMTsKLSAgd2hpbGUgKChzZmJQcmV2Pj0wKSAmJiAoc2NmT2xkW3NmYlByZXZdPT1GREtfSU5UX01JTikpCi0gICAgc2ZiUHJldi0tOwotICBpZiAoc2ZiUHJldj49MCkKLSAgICBzY2ZCaXRzRGlmZiArPSBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk5ld1tzZmJQcmV2XS1zY2ZOZXdbc2ZiTGFzdF0pIC0KLSAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk9sZFtzZmJQcmV2XS1zY2ZPbGRbc2ZiTGFzdF0pOworICB3aGlsZSAoKHNmYlByZXYgPj0gMCkgJiYgKHNjZk9sZFtzZmJQcmV2XSA9PSBGREtfSU5UX01JTikpIHNmYlByZXYtLTsKKyAgaWYgKHNmYlByZXYgPj0gMCkKKyAgICBzY2ZCaXRzRGlmZiArPQorICAgICAgICBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk5ld1tzZmJQcmV2XSAtIHNjZk5ld1tzZmJMYXN0XSkgLQorICAgICAgICBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk9sZFtzZmJQcmV2XSAtIHNjZk9sZFtzZmJMYXN0XSk7CiAgIC8qIG5vdyBsb29wIHRocm91Z2ggYWxsIHNmYnMgYW5kIGNvdW50IGRpZmZzIG9mIHJlbGV2YW50IHNmYnMgKi8KLSAgZm9yIChzZmI9c2ZiTGFzdCsxOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKLSAgICBpZiAoc2NmT2xkW3NmYl0hPUZES19JTlRfTUlOKSB7Ci0gICAgICBzY2ZCaXRzRGlmZiArPSBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk5ld1tzZmJMYXN0XS1zY2ZOZXdbc2ZiXSkgLQotICAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX2JpdENvdW50U2NhbGVmYWN0b3JEZWx0YShzY2ZPbGRbc2ZiTGFzdF0tc2NmT2xkW3NmYl0pOworICBmb3IgKHNmYiA9IHNmYkxhc3QgKyAxOyBzZmIgPCBzdG9wU2ZiOyBzZmIrKykgeworICAgIGlmIChzY2ZPbGRbc2ZiXSAhPSBGREtfSU5UX01JTikgeworICAgICAgc2NmQml0c0RpZmYgKz0KKyAgICAgICAgICBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk5ld1tzZmJMYXN0XSAtIHNjZk5ld1tzZmJdKSAtCisgICAgICAgICAgRkRLYWFjRW5jX2JpdENvdW50U2NhbGVmYWN0b3JEZWx0YShzY2ZPbGRbc2ZiTGFzdF0gLSBzY2ZPbGRbc2ZiXSk7CiAgICAgICBzZmJMYXN0ID0gc2ZiOwogICAgIH0KICAgfQogICAvKiBzZWFyY2ggZm9yIG5leHQgcmVsZXZhbnQgc2ZiIGFuZCBjb3VudCBkaWZmICovCiAgIHNmYk5leHQgPSBzdG9wU2ZiOwotICB3aGlsZSAoKHNmYk5leHQ8c2ZiQ250KSAmJiAoc2NmT2xkW3NmYk5leHRdPT1GREtfSU5UX01JTikpCi0gICAgc2ZiTmV4dCsrOwotICBpZiAoc2ZiTmV4dDxzZmJDbnQpCi0gICAgc2NmQml0c0RpZmYgKz0gRkRLYWFjRW5jX2JpdENvdW50U2NhbGVmYWN0b3JEZWx0YShzY2ZOZXdbc2ZiTGFzdF0tc2NmTmV3W3NmYk5leHRdKSAtCi0gICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX2JpdENvdW50U2NhbGVmYWN0b3JEZWx0YShzY2ZPbGRbc2ZiTGFzdF0tc2NmT2xkW3NmYk5leHRdKTsKKyAgd2hpbGUgKChzZmJOZXh0IDwgc2ZiQ250KSAmJiAoc2NmT2xkW3NmYk5leHRdID09IEZES19JTlRfTUlOKSkgc2ZiTmV4dCsrOworICBpZiAoc2ZiTmV4dCA8IHNmYkNudCkKKyAgICBzY2ZCaXRzRGlmZiArPQorICAgICAgICBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk5ld1tzZmJMYXN0XSAtIHNjZk5ld1tzZmJOZXh0XSkgLQorICAgICAgICBGREthYWNFbmNfYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk9sZFtzZmJMYXN0XSAtIHNjZk9sZFtzZmJOZXh0XSk7CiAKLSAgc2NmQml0c0ZyYWN0ID0gKEZJWFBfREJMKSAoc2NmQml0c0RpZmYgPDwgKERGUkFDVF9CSVRTLTEtKDIqQVNfUEVfRkFDX1NISUZUKSkpOworICBzY2ZCaXRzRnJhY3QgPQorICAgICAgKEZJWFBfREJMKShzY2ZCaXRzRGlmZiA8PCAoREZSQUNUX0JJVFMgLSAxIC0gKDIgKiBBU19QRV9GQUNfU0hJRlQpKSk7CiAKICAgcmV0dXJuIHNjZkJpdHNGcmFjdDsKIH0KQEAgLTMwMSw0OCArMzE3LDUxIEBACiAKICAgc3BlY1BlRGlmZiBpcyBzY2FsZWQgYnkgMS8oMl4oMipBU19QRV9GQUNfU0hJRlQpKQogKi8KLXN0YXRpYyBGSVhQX0RCTCBGREthYWNFbmNfY2FsY1NwZWNQZURpZmYoUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICAqcWNPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2NmT2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2NmTmV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJDb25zdFBlUGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiRm9ybUZhY3RvckxkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiTlJlbGV2YW50TGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXJ0U2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdG9wU2ZiKQoteworc3RhdGljIEZJWFBfREJMIEZES2FhY0VuY19jYWxjU3BlY1BlRGlmZigKKyAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4sIFFDX09VVF9DSEFOTkVMICpxY091dENoYW5uZWwsIElOVCAqc2NmT2xkLAorICAgIElOVCAqc2NmTmV3LCBGSVhQX0RCTCAqc2ZiQ29uc3RQZVBhcnQsIEZJWFBfREJMICpzZmJGb3JtRmFjdG9yTGREYXRhLAorICAgIEZJWFBfREJMICpzZmJOUmVsZXZhbnRMaW5lcywgSU5UIHN0YXJ0U2ZiLCBJTlQgc3RvcFNmYikgewogICBGSVhQX0RCTCBzcGVjUGVEaWZmID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgIEZJWFBfREJMIHNjZkZyYWN0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgIElOVCBzZmI7CiAKICAgLyogbG9vcCB0aHJvdWdoIGFsbCBzZmJzIGFuZCBjb3VudCBwZSBkaWZmZXJlbmNlICovCi0gIGZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKLSAgICBpZiAoc2NmT2xkW3NmYl0hPUZES19JTlRfTUlOKSB7CisgIGZvciAoc2ZiID0gc3RhcnRTZmI7IHNmYiA8IHN0b3BTZmI7IHNmYisrKSB7CisgICAgaWYgKHNjZk9sZFtzZmJdICE9IEZES19JTlRfTUlOKSB7CiAgICAgICBGSVhQX0RCTCBsZFJhdGlvT2xkLCBsZFJhdGlvTmV3LCBwT2xkLCBwTmV3OwogCi0gICAgICAvKiBzZmJDb25zdFBlUGFydFtzZmJdID0gKGZsb2F0KWxvZyhwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiXSAqIDYuNzVmIC8gc2ZiRm9ybUZhY3RvcltzZmJdKSAqIExPRzJfMTsgKi8KLSAgICAgIC8qIDAuMDIxNTIyNTU4NjFmID0gbG9nKDYuNzUpL2xvZygyKS9BU19QRV9GQUNfRkxPQVQ7IExPRzJfMSBpcyAxLjAgZm9yIGxvZzIgKi8KKyAgICAgIC8qIHNmYkNvbnN0UGVQYXJ0W3NmYl0gPSAoZmxvYXQpbG9nKHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJdICogNi43NWYgLworICAgICAgICogc2ZiRm9ybUZhY3RvcltzZmJdKSAqIExPRzJfMTsgKi8KKyAgICAgIC8qIDAuMDIxNTIyNTU4NjFmID0gbG9nKDYuNzUpL2xvZygyKS9BU19QRV9GQUNfRkxPQVQ7IExPRzJfMSBpcyAxLjAgZm9yCisgICAgICAgKiBsb2cyICovCiAgICAgICAvKiAwLjA5Mzc1ZiA9IGxvZyg2NC4wKS9sb2coMi4wKS82NC4wID0gc2NhbGUgb2Ygc2ZiRm9ybUZhY3RvckxkRGF0YSAqLwogICAgICAgaWYgKHNmYkNvbnN0UGVQYXJ0W3NmYl0gPT0gKEZJWFBfREJMKUZES19JTlRfTUlOKQotICAgICAgICBzZmJDb25zdFBlUGFydFtzZmJdID0gKChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiXSAtIHNmYkZvcm1GYWN0b3JMZERhdGFbc2ZiXSAtIEZMMkZYQ09OU1RfREJMKDAuMDkzNzVmKSkgPj4gMSkgKyBGTDJGWENPTlNUX0RCTCgwLjAyMTUyMjU1ODYxZik7CisgICAgICAgIHNmYkNvbnN0UGVQYXJ0W3NmYl0gPQorICAgICAgICAgICAgKChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGFbc2ZiXSAtIHNmYkZvcm1GYWN0b3JMZERhdGFbc2ZiXSAtCisgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMDkzNzVmKSkgPj4KKyAgICAgICAgICAgICAxKSArCisgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjAyMTUyMjU1ODYxZik7CiAKLSAgICAgIHNjZkZyYWN0ID0gKEZJWFBfREJMKSAoc2NmT2xkW3NmYl0gPDwgKERGUkFDVF9CSVRTLTEtQVNfUEVfRkFDX1NISUZUKSk7Ci0gICAgICBsZFJhdGlvT2xkID0gc2ZiQ29uc3RQZVBhcnRbc2ZiXSAtIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuMzc1Ziksc2NmRnJhY3QpOworICAgICAgc2NmRnJhY3QgPSAoRklYUF9EQkwpKHNjZk9sZFtzZmJdIDw8IChERlJBQ1RfQklUUyAtIDEgLSBBU19QRV9GQUNfU0hJRlQpKTsKKyAgICAgIGxkUmF0aW9PbGQgPQorICAgICAgICAgIHNmYkNvbnN0UGVQYXJ0W3NmYl0gLSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjM3NWYpLCBzY2ZGcmFjdCk7CiAKLSAgICAgIHNjZkZyYWN0ID0gKEZJWFBfREJMKSAoc2NmTmV3W3NmYl0gPDwgKERGUkFDVF9CSVRTLTEtQVNfUEVfRkFDX1NISUZUKSk7Ci0gICAgICBsZFJhdGlvTmV3ID0gc2ZiQ29uc3RQZVBhcnRbc2ZiXSAtIGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuMzc1Ziksc2NmRnJhY3QpOworICAgICAgc2NmRnJhY3QgPSAoRklYUF9EQkwpKHNjZk5ld1tzZmJdIDw8IChERlJBQ1RfQklUUyAtIDEgLSBBU19QRV9GQUNfU0hJRlQpKTsKKyAgICAgIGxkUmF0aW9OZXcgPQorICAgICAgICAgIHNmYkNvbnN0UGVQYXJ0W3NmYl0gLSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjM3NWYpLCBzY2ZGcmFjdCk7CiAKICAgICAgIGlmIChsZFJhdGlvT2xkID49IFBFX0MxKQogICAgICAgICBwT2xkID0gbGRSYXRpb09sZDsKICAgICAgIGVsc2UKLSAgICAgICAgcE9sZCA9IFBFX0MyICsgZk11bHQoUEVfQzMsbGRSYXRpb09sZCk7CisgICAgICAgIHBPbGQgPSBQRV9DMiArIGZNdWx0KFBFX0MzLCBsZFJhdGlvT2xkKTsKIAogICAgICAgaWYgKGxkUmF0aW9OZXcgPj0gUEVfQzEpCiAgICAgICAgIHBOZXcgPSBsZFJhdGlvTmV3OwogICAgICAgZWxzZQotICAgICAgICBwTmV3ID0gUEVfQzIgKyBmTXVsdChQRV9DMyxsZFJhdGlvTmV3KTsKKyAgICAgICAgcE5ldyA9IFBFX0MyICsgZk11bHQoUEVfQzMsIGxkUmF0aW9OZXcpOwogCi0gICAgICBzcGVjUGVEaWZmICs9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuN2YpLGZNdWx0KHNmYk5SZWxldmFudExpbmVzW3NmYl0sKHBOZXcgLSBwT2xkKSkpOworICAgICAgc3BlY1BlRGlmZiArPSBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjdmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQoc2ZiTlJlbGV2YW50TGluZXNbc2ZiXSwgKHBOZXcgLSBwT2xkKSkpOwogICAgIH0KICAgfQogCkBAIC0zNTIsMTIzICszNzEsOTYgQEAKIC8qCiAgIEZ1bmN0aW9uOiBGREthYWNFbmNfaW1wcm92ZVNjZgogCi0gIERlc2NyaXB0aW9uOiBDYWxjdWxhdGUgdGhlIGRpc3RvcnRpb24gYnkgcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIHF1YW50aXphdGlvbiBvZiB0aGUgc3BlY3RydW0gd2l0aAotICAgICAgICAgICAgICAgdmFyaW91cyBzY2FsZWZhY3RvcnMuIFRoZSBzY2FsZWZhY3RvciB3aGljaCBwcm92aWRlcyB0aGUgYmVzdCByZXN1bHRzIHdpbGwgYmUgdXNlZC4KKyAgRGVzY3JpcHRpb246IENhbGN1bGF0ZSB0aGUgZGlzdG9ydGlvbiBieSBxdWFudGl6YXRpb24gYW5kIGludmVyc2UgcXVhbnRpemF0aW9uCisgIG9mIHRoZSBzcGVjdHJ1bSB3aXRoIHZhcmlvdXMgc2NhbGVmYWN0b3JzLiBUaGUgc2NhbGVmYWN0b3Igd2hpY2ggcHJvdmlkZXMgdGhlCisgIGJlc3QgcmVzdWx0cyB3aWxsIGJlIHVzZWQuCiAqLwotc3RhdGljIElOVCBGREthYWNFbmNfaW1wcm92ZVNjZihGSVhQX0RCTCAqc3BlYywKLSAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjLAotICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudFNwZWNUbXAsCi0gICAgICAgICAgICAgICAgICAgICAgSU5UIHNmYldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICB0aHJlc2hMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgSU5UIHNjZiwKLSAgICAgICAgICAgICAgICAgICAgICBJTlQgbWluU2NmLAotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqZGlzdExkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBJTlQgKm1pblNjZkNhbGN1bGF0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgSU5UIGRab25lUXVhbnRFbmFibGUKLSAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICBGSVhQX0RCTCBzZmJEaXN0TGREYXRhOwotICAgSU5UIHNjZkJlc3QgPSBzY2Y7Ci0gICBJTlQgazsKLSAgIEZJWFBfREJMIGRpc3RGYWN0b3JMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgtMC4wMDUwMzAxMjY1KTsgICAvKiBsZDY0KDEvMS4yNSkgKi8KK3N0YXRpYyBJTlQgRkRLYWFjRW5jX2ltcHJvdmVTY2YoY29uc3QgRklYUF9EQkwgKnNwZWMsIFNIT1JUICpxdWFudFNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudFNwZWNUbXAsIElOVCBzZmJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgdGhyZXNoTGREYXRhLCBJTlQgc2NmLCBJTlQgbWluU2NmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqZGlzdExkRGF0YSwgSU5UICptaW5TY2ZDYWxjdWxhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZFpvbmVRdWFudEVuYWJsZSkgeworICBGSVhQX0RCTCBzZmJEaXN0TGREYXRhOworICBJTlQgc2NmQmVzdCA9IHNjZjsKKyAgSU5UIGs7CisgIEZJWFBfREJMIGRpc3RGYWN0b3JMZERhdGEgPSBGTDJGWENPTlNUX0RCTCgtMC4wMDUwMzAxMjY1KTsgLyogbGQ2NCgxLzEuMjUpICovCiAKLSAgIC8qIGNhbGMgcmVhbCBkaXN0b3J0aW9uICovCi0gICBzZmJEaXN0TGREYXRhID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSk7Ci0gICAqbWluU2NmQ2FsY3VsYXRlZCA9IHNjZjsKLSAgIC8qIG5tciA+IDEuMjUgLT4gdHJ5IHRvIGltcHJvdmUgbm1yICovCi0gICBpZiAoc2ZiRGlzdExkRGF0YSA+ICh0aHJlc2hMZERhdGEtZGlzdEZhY3RvckxkRGF0YSkpIHsKLSAgICAgIElOVCBzY2ZFc3RpbWF0ZWQgPSBzY2Y7Ci0gICAgICBGSVhQX0RCTCBzZmJEaXN0QmVzdExkRGF0YSA9IHNmYkRpc3RMZERhdGE7Ci0gICAgICBJTlQgY250OwotICAgICAgLyogaW1wcm92ZSBieSBiaWdnZXIgc2NmID8gKi8KLSAgICAgIGNudCA9IDA7CisgIC8qIGNhbGMgcmVhbCBkaXN0b3J0aW9uICovCisgIHNmYkRpc3RMZERhdGEgPQorICAgICAgRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHNwZWMsIHF1YW50U3BlYywgc2ZiV2lkdGgsIHNjZiwgZFpvbmVRdWFudEVuYWJsZSk7CisgICptaW5TY2ZDYWxjdWxhdGVkID0gc2NmOworICAvKiBubXIgPiAxLjI1IC0+IHRyeSB0byBpbXByb3ZlIG5tciAqLworICBpZiAoc2ZiRGlzdExkRGF0YSA+ICh0aHJlc2hMZERhdGEgLSBkaXN0RmFjdG9yTGREYXRhKSkgeworICAgIElOVCBzY2ZFc3RpbWF0ZWQgPSBzY2Y7CisgICAgRklYUF9EQkwgc2ZiRGlzdEJlc3RMZERhdGEgPSBzZmJEaXN0TGREYXRhOworICAgIElOVCBjbnQ7CisgICAgLyogaW1wcm92ZSBieSBiaWdnZXIgc2NmID8gKi8KKyAgICBjbnQgPSAwOwogCi0gICAgICB3aGlsZSAoKHNmYkRpc3RMZERhdGEgPiAodGhyZXNoTGREYXRhLWRpc3RGYWN0b3JMZERhdGEpKSAmJiAoY250KysgPCAzKSkgewotICAgICAgICAgc2NmKys7Ci0gICAgICAgICBzZmJEaXN0TGREYXRhID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY1RtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSk7CisgICAgd2hpbGUgKChzZmJEaXN0TGREYXRhID4gKHRocmVzaExkRGF0YSAtIGRpc3RGYWN0b3JMZERhdGEpKSAmJgorICAgICAgICAgICAoY250KysgPCBVUENPVU5UX0xJTUlUKSkgeworICAgICAgc2NmKys7CisgICAgICBzZmJEaXN0TGREYXRhID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHNwZWMsIHF1YW50U3BlY1RtcCwgc2ZiV2lkdGgsIHNjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSk7CiAKLSAgICAgICAgIGlmIChzZmJEaXN0TGREYXRhIDwgc2ZiRGlzdEJlc3RMZERhdGEpIHsKLSAgICAgICAgICAgIHNjZkJlc3QgPSBzY2Y7Ci0gICAgICAgICAgICBzZmJEaXN0QmVzdExkRGF0YSA9IHNmYkRpc3RMZERhdGE7Ci0gICAgICAgICAgICBmb3IgKGs9MDsgazxzZmJXaWR0aDsgaysrKQotCSAgICAgICAgICAgICBxdWFudFNwZWNba10gPSBxdWFudFNwZWNUbXBba107Ci0gICAgICAgICB9CisgICAgICBpZiAoc2ZiRGlzdExkRGF0YSA8IHNmYkRpc3RCZXN0TGREYXRhKSB7CisgICAgICAgIHNjZkJlc3QgPSBzY2Y7CisgICAgICAgIHNmYkRpc3RCZXN0TGREYXRhID0gc2ZiRGlzdExkRGF0YTsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IHNmYldpZHRoOyBrKyspIHF1YW50U3BlY1trXSA9IHF1YW50U3BlY1RtcFtrXTsKICAgICAgIH0KLSAgICAgIC8qIGltcHJvdmUgYnkgc21hbGxlciBzY2YgPyAqLwotICAgICAgY250ID0gMDsKLSAgICAgIHNjZiA9IHNjZkVzdGltYXRlZDsKLSAgICAgIHNmYkRpc3RMZERhdGEgPSBzZmJEaXN0QmVzdExkRGF0YTsKLSAgICAgIHdoaWxlICgoc2ZiRGlzdExkRGF0YSA+ICh0aHJlc2hMZERhdGEtZGlzdEZhY3RvckxkRGF0YSkpICYmIChjbnQrKyA8IDEpICYmIChzY2YgPiBtaW5TY2YpKSB7Ci0gICAgICAgICBzY2YtLTsKLSAgICAgICAgIHNmYkRpc3RMZERhdGEgPSBGREthYWNFbmNfY2FsY1NmYkRpc3Qoc3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjVG1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkWm9uZVF1YW50RW5hYmxlKTsKKyAgICB9CisgICAgLyogaW1wcm92ZSBieSBzbWFsbGVyIHNjZiA/ICovCisgICAgY250ID0gMDsKKyAgICBzY2YgPSBzY2ZFc3RpbWF0ZWQ7CisgICAgc2ZiRGlzdExkRGF0YSA9IHNmYkRpc3RCZXN0TGREYXRhOworICAgIHdoaWxlICgoc2ZiRGlzdExkRGF0YSA+ICh0aHJlc2hMZERhdGEgLSBkaXN0RmFjdG9yTGREYXRhKSkgJiYgKGNudCsrIDwgMSkgJiYKKyAgICAgICAgICAgKHNjZiA+IG1pblNjZikpIHsKKyAgICAgIHNjZi0tOworICAgICAgc2ZiRGlzdExkRGF0YSA9IEZES2FhY0VuY19jYWxjU2ZiRGlzdChzcGVjLCBxdWFudFNwZWNUbXAsIHNmYldpZHRoLCBzY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUpOwogCi0gICAgICAgICBpZiAoc2ZiRGlzdExkRGF0YSA8IHNmYkRpc3RCZXN0TGREYXRhKSB7Ci0gICAgICAgICAgICBzY2ZCZXN0ID0gc2NmOwotICAgICAgICAgICAgc2ZiRGlzdEJlc3RMZERhdGEgPSBzZmJEaXN0TGREYXRhOwotICAgICAgICAgICAgZm9yIChrPTA7IGs8c2ZiV2lkdGg7IGsrKykKLQkgICAgICAgICAgICAgcXVhbnRTcGVjW2tdID0gcXVhbnRTcGVjVG1wW2tdOwotICAgICAgICAgfQotICAgICAgICAgKm1pblNjZkNhbGN1bGF0ZWQgPSBzY2Y7CisgICAgICBpZiAoc2ZiRGlzdExkRGF0YSA8IHNmYkRpc3RCZXN0TGREYXRhKSB7CisgICAgICAgIHNjZkJlc3QgPSBzY2Y7CisgICAgICAgIHNmYkRpc3RCZXN0TGREYXRhID0gc2ZiRGlzdExkRGF0YTsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IHNmYldpZHRoOyBrKyspIHF1YW50U3BlY1trXSA9IHF1YW50U3BlY1RtcFtrXTsKICAgICAgIH0KLSAgICAgICpkaXN0TGREYXRhID0gc2ZiRGlzdEJlc3RMZERhdGE7Ci0gICB9Ci0gICBlbHNlIHsgLyogbm1yIDw9IDEuMjUgLT4gdHJ5IHRvIGZpbmQgYmlnZ2VyIHNjZiB0byB1c2UgbGVzcyBiaXRzICovCi0gICAgICBGSVhQX0RCTCBzZmJEaXN0QmVzdExkRGF0YSA9IHNmYkRpc3RMZERhdGE7Ci0gICAgICBGSVhQX0RCTCBzZmJEaXN0QWxsb3dlZExkRGF0YSA9IGZpeE1pbihzZmJEaXN0TGREYXRhLWRpc3RGYWN0b3JMZERhdGEsdGhyZXNoTGREYXRhKTsKLSAgICAgIGludCBjbnQ7Ci0gICAgICBmb3IgKGNudD0wOyBjbnQ8MzsgY250KyspIHsKLSAgICAgICAgIHNjZisrOwotICAgICAgICAgc2ZiRGlzdExkRGF0YSA9IEZES2FhY0VuY19jYWxjU2ZiRGlzdChzcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNUbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUpOworICAgICAgKm1pblNjZkNhbGN1bGF0ZWQgPSBzY2Y7CisgICAgfQorICAgICpkaXN0TGREYXRhID0gc2ZiRGlzdEJlc3RMZERhdGE7CisgIH0gZWxzZSB7IC8qIG5tciA8PSAxLjI1IC0+IHRyeSB0byBmaW5kIGJpZ2dlciBzY2YgdG8gdXNlIGxlc3MgYml0cyAqLworICAgIEZJWFBfREJMIHNmYkRpc3RCZXN0TGREYXRhID0gc2ZiRGlzdExkRGF0YTsKKyAgICBGSVhQX0RCTCBzZmJEaXN0QWxsb3dlZExkRGF0YSA9CisgICAgICAgIGZpeE1pbihzZmJEaXN0TGREYXRhIC0gZGlzdEZhY3RvckxkRGF0YSwgdGhyZXNoTGREYXRhKTsKKyAgICBpbnQgY250OworICAgIGZvciAoY250ID0gMDsgY250IDwgVVBDT1VOVF9MSU1JVDsgY250KyspIHsKKyAgICAgIHNjZisrOworICAgICAgc2ZiRGlzdExkRGF0YSA9IEZES2FhY0VuY19jYWxjU2ZiRGlzdChzcGVjLCBxdWFudFNwZWNUbXAsIHNmYldpZHRoLCBzY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUpOwogCi0gICAgICAgICBpZiAoc2ZiRGlzdExkRGF0YSA8IHNmYkRpc3RBbGxvd2VkTGREYXRhKSB7Ci0gICAgICAgICAgICptaW5TY2ZDYWxjdWxhdGVkID0gc2NmQmVzdCsxOwotICAgICAgICAgICBzY2ZCZXN0ID0gc2NmOwotICAgICAgICAgICBzZmJEaXN0QmVzdExkRGF0YSA9IHNmYkRpc3RMZERhdGE7Ci0gICAgICAgICAgIGZvciAoaz0wOyBrPHNmYldpZHRoOyBrKyspCi0gICAgICAgICAgICAgcXVhbnRTcGVjW2tdID0gcXVhbnRTcGVjVG1wW2tdOwotICAgICAgICAgfQorICAgICAgaWYgKHNmYkRpc3RMZERhdGEgPCBzZmJEaXN0QWxsb3dlZExkRGF0YSkgeworICAgICAgICAqbWluU2NmQ2FsY3VsYXRlZCA9IHNjZkJlc3QgKyAxOworICAgICAgICBzY2ZCZXN0ID0gc2NmOworICAgICAgICBzZmJEaXN0QmVzdExkRGF0YSA9IHNmYkRpc3RMZERhdGE7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBzZmJXaWR0aDsgaysrKSBxdWFudFNwZWNba10gPSBxdWFudFNwZWNUbXBba107CiAgICAgICB9Ci0gICAgICAqZGlzdExkRGF0YSA9IHNmYkRpc3RCZXN0TGREYXRhOwotICAgfQorICAgIH0KKyAgICAqZGlzdExkRGF0YSA9IHNmYkRpc3RCZXN0TGREYXRhOworICB9CiAKLSAgIC8qIHJldHVybiBiZXN0IHNjYWxlZmFjdG9yICovCi0gICByZXR1cm4gc2NmQmVzdDsKKyAgLyogcmV0dXJuIGJlc3Qgc2NhbGVmYWN0b3IgKi8KKyAgcmV0dXJuIHNjZkJlc3Q7CiB9CiAKIC8qCiAgIEZ1bmN0aW9uOiBGREthYWNFbmNfYXNzaW1pbGF0ZVNpbmdsZVNjZgogCiAqLwotc3RhdGljIHZvaWQgRkRLYWFjRW5jX2Fzc2ltaWxhdGVTaW5nbGVTY2YoUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAgICpxY091dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudFNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudFNwZWNUbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBkWm9uZVF1YW50RW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICptaW5TY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJEaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiQ29uc3RQZVBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJGb3JtRmFjdG9yTGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiTlJlbGV2YW50TGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbWluU2NmQ2FsY3VsYXRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHJlc3RhcnRPblN1Y2Nlc3MpCi17CitzdGF0aWMgdm9pZCBGREthYWNFbmNfYXNzaW1pbGF0ZVNpbmdsZVNjZigKKyAgICBjb25zdCBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4sIGNvbnN0IFFDX09VVF9DSEFOTkVMICpxY091dENoYW5uZWwsCisgICAgU0hPUlQgKnF1YW50U3BlYywgU0hPUlQgKnF1YW50U3BlY1RtcCwgSU5UIGRab25lUXVhbnRFbmFibGUsIElOVCAqc2NmLAorICAgIGNvbnN0IElOVCAqbWluU2NmLCBGSVhQX0RCTCAqc2ZiRGlzdCwgRklYUF9EQkwgKnNmYkNvbnN0UGVQYXJ0LAorICAgIGNvbnN0IEZJWFBfREJMICpzZmJGb3JtRmFjdG9yTGREYXRhLCBjb25zdCBGSVhQX0RCTCAqc2ZiTlJlbGV2YW50TGluZXMsCisgICAgSU5UICptaW5TY2ZDYWxjdWxhdGVkLCBJTlQgcmVzdGFydE9uU3VjY2VzcykgewogICBJTlQgc2ZiTGFzdCwgc2ZiQWN0LCBzZmJOZXh0OwogICBJTlQgc2NmQWN0LCAqc2NmTGFzdCwgKnNjZk5leHQsIHNjZk1pbiwgc2NmTWF4OwogICBJTlQgc2ZiV2lkdGgsIHNmYk9mZnM7CkBAIC00ODMsNzcgKzQ3NSw4MiBAQAogICBGSVhQX0RCTCBkZWx0YVBlTGFzdFtNQVhfR1JPVVBFRF9TRkJdOwogICBJTlQgdXBkYXRlTWluU2NmQ2FsY3VsYXRlZDsKIAotICBmb3IgKGk9MDsgaTxwc3lPdXRDaGFuLT5zZmJDbnQ7IGkrKykgeworICBmb3IgKGkgPSAwOyBpIDwgcHN5T3V0Q2hhbi0+c2ZiQ250OyBpKyspIHsKICAgICBwcmV2U2NmTGFzdFtpXSA9IEZES19JTlRfTUFYOwogICAgIHByZXZTY2ZOZXh0W2ldID0gRkRLX0lOVF9NQVg7CiAgICAgZGVsdGFQZUxhc3RbaV0gPSAoRklYUF9EQkwpRkRLX0lOVF9NQVg7CiAgIH0KIAogICBzZmJMYXN0ID0gLTE7Ci0gIHNmYkFjdCAgPSAtMTsKKyAgc2ZiQWN0ID0gLTE7CiAgIHNmYk5leHQgPSAtMTsKICAgc2NmTGFzdCA9IDA7CiAgIHNjZk5leHQgPSAwOwotICBzY2ZNaW4gID0gRkRLX0lOVF9NQVg7Ci0gIHNjZk1heCAgPSBGREtfSU5UX01BWDsKKyAgc2NmTWluID0gRkRLX0lOVF9NQVg7CisgIHNjZk1heCA9IEZES19JTlRfTUFYOwogICBkbyB7CiAgICAgLyogc2VhcmNoIGZvciBuZXcgcmVsZXZhbnQgc2ZiICovCiAgICAgc2ZiTmV4dCsrOwogICAgIHdoaWxlICgoc2ZiTmV4dCA8IHBzeU91dENoYW4tPnNmYkNudCkgJiYgKHNjZltzZmJOZXh0XSA9PSBGREtfSU5UX01JTikpCiAgICAgICBzZmJOZXh0Kys7Ci0gICAgaWYgKChzZmJMYXN0Pj0wKSAmJiAoc2ZiQWN0Pj0wKSAmJiAoc2ZiTmV4dDxwc3lPdXRDaGFuLT5zZmJDbnQpKSB7CisgICAgaWYgKChzZmJMYXN0ID49IDApICYmIChzZmJBY3QgPj0gMCkgJiYgKHNmYk5leHQgPCBwc3lPdXRDaGFuLT5zZmJDbnQpKSB7CiAgICAgICAvKiByZWxldmFudCBzY2ZzIHRvIHRoZSBsZWZ0IGFuZCB0byB0aGUgcmlnaHQgKi8KLSAgICAgIHNjZkFjdCAgPSBzY2Zbc2ZiQWN0XTsKKyAgICAgIHNjZkFjdCA9IHNjZltzZmJBY3RdOwogICAgICAgc2NmTGFzdCA9IHNjZiArIHNmYkxhc3Q7CiAgICAgICBzY2ZOZXh0ID0gc2NmICsgc2ZiTmV4dDsKLSAgICAgIHNjZk1pbiAgPSBmaXhNaW4oKnNjZkxhc3QsICpzY2ZOZXh0KTsKLSAgICAgIHNjZk1heCAgPSBmaXhNYXgoKnNjZkxhc3QsICpzY2ZOZXh0KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKHNmYkxhc3Q9PS0xKSAmJiAoc2ZiQWN0Pj0wKSAmJiAoc2ZiTmV4dDxwc3lPdXRDaGFuLT5zZmJDbnQpKSB7CisgICAgICBzY2ZNaW4gPSBmaXhNaW4oKnNjZkxhc3QsICpzY2ZOZXh0KTsKKyAgICAgIHNjZk1heCA9IGZpeE1heCgqc2NmTGFzdCwgKnNjZk5leHQpOworICAgIH0gZWxzZSBpZiAoKHNmYkxhc3QgPT0gLTEpICYmIChzZmJBY3QgPj0gMCkgJiYKKyAgICAgICAgICAgICAgIChzZmJOZXh0IDwgcHN5T3V0Q2hhbi0+c2ZiQ250KSkgewogICAgICAgLyogZmlyc3QgcmVsZXZhbnQgc2NmICovCi0gICAgICBzY2ZBY3QgID0gc2NmW3NmYkFjdF07CisgICAgICBzY2ZBY3QgPSBzY2Zbc2ZiQWN0XTsKICAgICAgIHNjZkxhc3QgPSAmc2NmQWN0OwogICAgICAgc2NmTmV4dCA9IHNjZiArIHNmYk5leHQ7Ci0gICAgICBzY2ZNaW4gID0gKnNjZk5leHQ7Ci0gICAgICBzY2ZNYXggID0gKnNjZk5leHQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKChzZmJMYXN0Pj0wKSAmJiAoc2ZiQWN0Pj0wKSAmJiAoc2ZiTmV4dD09cHN5T3V0Q2hhbi0+c2ZiQ250KSkgeworICAgICAgc2NmTWluID0gKnNjZk5leHQ7CisgICAgICBzY2ZNYXggPSAqc2NmTmV4dDsKKyAgICB9IGVsc2UgaWYgKChzZmJMYXN0ID49IDApICYmIChzZmJBY3QgPj0gMCkgJiYKKyAgICAgICAgICAgICAgIChzZmJOZXh0ID09IHBzeU91dENoYW4tPnNmYkNudCkpIHsKICAgICAgIC8qIGxhc3QgcmVsZXZhbnQgc2NmICovCi0gICAgICBzY2ZBY3QgID0gc2NmW3NmYkFjdF07CisgICAgICBzY2ZBY3QgPSBzY2Zbc2ZiQWN0XTsKICAgICAgIHNjZkxhc3QgPSBzY2YgKyBzZmJMYXN0OwogICAgICAgc2NmTmV4dCA9ICZzY2ZBY3Q7Ci0gICAgICBzY2ZNaW4gID0gKnNjZkxhc3Q7Ci0gICAgICBzY2ZNYXggID0gKnNjZkxhc3Q7CisgICAgICBzY2ZNaW4gPSAqc2NmTGFzdDsKKyAgICAgIHNjZk1heCA9ICpzY2ZMYXN0OwogICAgIH0KLSAgICBpZiAoc2ZiQWN0Pj0wKQotICAgICAgc2NmTWluID0gZml4TWF4KHNjZk1pbiwgbWluU2NmW3NmYkFjdF0pOworICAgIGlmIChzZmJBY3QgPj0gMCkgc2NmTWluID0gZml4TWF4KHNjZk1pbiwgbWluU2NmW3NmYkFjdF0pOwogCi0gICAgaWYgKChzZmJBY3QgPj0gMCkgJiYKLSAgICAgICAgKHNmYkxhc3Q+PTAgfHwgc2ZiTmV4dDxwc3lPdXRDaGFuLT5zZmJDbnQpICYmCi0gICAgICAgIChzY2ZBY3QgPiBzY2ZNaW4pICYmCi0gICAgICAgIChzY2ZBY3QgPD0gc2NmTWluK01BWF9TQ0ZfREVMVEEpICYmCi0gICAgICAgIChzY2ZBY3QgPj0gc2NmTWF4LU1BWF9TQ0ZfREVMVEEpICYmCi0gICAgICAgICgqc2NmTGFzdCAhPSBwcmV2U2NmTGFzdFtzZmJBY3RdIHx8Ci0gICAgICAgICAqc2NmTmV4dCAhPSBwcmV2U2NmTmV4dFtzZmJBY3RdIHx8CisgICAgaWYgKChzZmJBY3QgPj0gMCkgJiYgKHNmYkxhc3QgPj0gMCB8fCBzZmJOZXh0IDwgcHN5T3V0Q2hhbi0+c2ZiQ250KSAmJgorICAgICAgICAoc2NmQWN0ID4gc2NmTWluKSAmJiAoc2NmQWN0IDw9IHNjZk1pbiArIE1BWF9TQ0ZfREVMVEEpICYmCisgICAgICAgIChzY2ZBY3QgPj0gc2NmTWF4IC0gTUFYX1NDRl9ERUxUQSkgJiYKKyAgICAgICAgKHNjZkFjdCA8PQorICAgICAgICAgZml4TWluKHNjZk1pbiwgZml4TWluKCpzY2ZMYXN0LCAqc2NmTmV4dCkpICsgTUFYX1NDRl9ERUxUQSkgJiYKKyAgICAgICAgKCpzY2ZMYXN0ICE9IHByZXZTY2ZMYXN0W3NmYkFjdF0gfHwgKnNjZk5leHQgIT0gcHJldlNjZk5leHRbc2ZiQWN0XSB8fAogICAgICAgICAgZGVsdGFQZSA8IGRlbHRhUGVMYXN0W3NmYkFjdF0pKSB7CiAgICAgICAvKiBiaWdnZXIgdGhhbiBuZWlnaGJvdXJpbmcgc2NmIGZvdW5kLCB0cnkgdG8gdXNlIHNtYWxsZXIgc2NmICovCiAgICAgICBzdWNjZXNzID0gMDsKIAotICAgICAgc2ZiV2lkdGggPSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYkFjdCsxXSAtIHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiQWN0XTsKKyAgICAgIHNmYldpZHRoID0KKyAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYkFjdCArIDFdIC0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmJBY3RdOwogICAgICAgc2ZiT2ZmcyA9IHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiQWN0XTsKIAogICAgICAgLyogZXN0aW1hdGUgcmVxdWlyZWQgYml0cyBmb3IgYWN0dWFsIHNjZiAqLwogICAgICAgZW5MZERhdGEgPSBxY091dENoYW5uZWwtPnNmYkVuZXJneUxkRGF0YVtzZmJBY3RdOwogCi0gICAgICAvKiBzZmJDb25zdFBlUGFydFtzZmJBY3RdID0gKGZsb2F0KWxvZyg2Ljc1Ziplbi9zZmJGb3JtRmFjdG9yW3NmYkFjdF0pICogTE9HMl8xOyAqLwotICAgICAgLyogMC4wMjE1MjI1NTg2MWYgPSBsb2coNi43NSkvbG9nKDIpL0FTX1BFX0ZBQ19GTE9BVDsgTE9HMl8xIGlzIDEuMCBmb3IgbG9nMiAqLworICAgICAgLyogc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSA9IChmbG9hdClsb2coNi43NWYqZW4vc2ZiRm9ybUZhY3RvcltzZmJBY3RdKSAqCisgICAgICAgKiBMT0cyXzE7ICovCisgICAgICAvKiAwLjAyMTUyMjU1ODYxZiA9IGxvZyg2Ljc1KS9sb2coMikvQVNfUEVfRkFDX0ZMT0FUOyBMT0cyXzEgaXMgMS4wIGZvcgorICAgICAgICogbG9nMiAqLwogICAgICAgLyogMC4wOTM3NWYgPSBsb2coNjQuMCkvbG9nKDIuMCkvNjQuMCA9IHNjYWxlIG9mIHNmYkZvcm1GYWN0b3JMZERhdGEgKi8KICAgICAgIGlmIChzZmJDb25zdFBlUGFydFtzZmJBY3RdID09IChGSVhQX0RCTClGREtfSU5UX01JTikgewotICAgICAgICBzZmJDb25zdFBlUGFydFtzZmJBY3RdID0gKChlbkxkRGF0YSAtIHNmYkZvcm1GYWN0b3JMZERhdGFbc2ZiQWN0XSAtIEZMMkZYQ09OU1RfREJMKDAuMDkzNzVmKSkgPj4gMSkgKyBGTDJGWENPTlNUX0RCTCgwLjAyMTUyMjU1ODYxZik7CisgICAgICAgIHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gPSAoKGVuTGREYXRhIC0gc2ZiRm9ybUZhY3RvckxkRGF0YVtzZmJBY3RdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4wOTM3NWYpKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMDIxNTIyNTU4NjFmKTsKICAgICAgIH0KIAotICAgICAgc2ZiUGVPbGQgPSBGREthYWNFbmNfY2FsY1NpbmdsZVNwZWNQZShzY2ZBY3Qsc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSxzZmJOUmVsZXZhbnRMaW5lc1tzZmJBY3RdKQotICAgICAgICAgICAgICAgICtGREthYWNFbmNfY291bnRTaW5nbGVTY2ZCaXRzKHNjZkFjdCwgKnNjZkxhc3QsICpzY2ZOZXh0KTsKKyAgICAgIHNmYlBlT2xkID0gRkRLYWFjRW5jX2NhbGNTaW5nbGVTcGVjUGUoc2NmQWN0LCBzZmJDb25zdFBlUGFydFtzZmJBY3RdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJOUmVsZXZhbnRMaW5lc1tzZmJBY3RdKSArCisgICAgICAgICAgICAgICAgIEZES2FhY0VuY19jb3VudFNpbmdsZVNjZkJpdHMoc2NmQWN0LCAqc2NmTGFzdCwgKnNjZk5leHQpOwogCiAgICAgICBkZWx0YVBlTmV3ID0gZGVsdGFQZTsKICAgICAgIHVwZGF0ZU1pblNjZkNhbGN1bGF0ZWQgPSAxOwpAQCAtNTYyLDEwICs1NTksMTIgQEAKICAgICAgICAgLyogZXN0aW1hdGUgcmVxdWlyZWQgYml0cyBmb3Igc21hbGxlciBzY2YgKi8KICAgICAgICAgc2NmQWN0LS07CiAgICAgICAgIC8qIGNoZWNrIG9ubHkgaWYgdGhlIHNhbWUgY2hlY2sgd2FzIG5vdCBkb25lIGJlZm9yZSAqLwotICAgICAgICBpZiAoc2NmQWN0IDwgbWluU2NmQ2FsY3VsYXRlZFtzZmJBY3RdICYmIHNjZkFjdD49c2NmTWF4LU1BWF9TQ0ZfREVMVEEpeworICAgICAgICBpZiAoc2NmQWN0IDwgbWluU2NmQ2FsY3VsYXRlZFtzZmJBY3RdICYmCisgICAgICAgICAgICBzY2ZBY3QgPj0gc2NmTWF4IC0gTUFYX1NDRl9ERUxUQSkgewogICAgICAgICAgIC8qIGVzdGltYXRlIHJlcXVpcmVkIGJpdHMgZm9yIG5ldyBzY2YgKi8KLSAgICAgICAgICBzZmJQZU5ldyA9ICBGREthYWNFbmNfY2FsY1NpbmdsZVNwZWNQZShzY2ZBY3Qsc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSxzZmJOUmVsZXZhbnRMaW5lc1tzZmJBY3RdKQotICAgICAgICAgICAgICAgICAgICAgK0ZES2FhY0VuY19jb3VudFNpbmdsZVNjZkJpdHMoc2NmQWN0LCpzY2ZMYXN0LCAqc2NmTmV4dCk7CisgICAgICAgICAgc2ZiUGVOZXcgPSBGREthYWNFbmNfY2FsY1NpbmdsZVNwZWNQZShzY2ZBY3QsIHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJOUmVsZXZhbnRMaW5lc1tzZmJBY3RdKSArCisgICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfY291bnRTaW5nbGVTY2ZCaXRzKHNjZkFjdCwgKnNjZkxhc3QsICpzY2ZOZXh0KTsKIAogICAgICAgICAgIC8qIHVzZSBuZXcgc2NmIGlmIG5vIGluY3JlYXNlIGluIHBlIGFuZAogICAgICAgICAgICAgIHF1YW50aXphdGlvbiBlcnJvciBpcyBzbWFsbGVyICovCkBAIC01NzMsMjggKzU3MiwyNCBAQAogICAgICAgICAgIC8qIDAuMDAwNjEwMzUxNTYyNWYgPSAxMC4wZi8oMl4oMipBU19QRV9GQUNfU0hJRlQpKSAqLwogICAgICAgICAgIGlmIChkZWx0YVBlVG1wIDwgRkwyRlhDT05TVF9EQkwoMC4wMDA2MTAzNTE1NjI1ZikpIHsKICAgICAgICAgICAgIC8qIGRpc3RvcnRpb24gb2YgbmV3IHNjZiAqLwotICAgICAgICAgICAgc2ZiRGlzdE5ldyA9IEZES2FhY0VuY19jYWxjU2ZiRGlzdChxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bStzZmJPZmZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNUbXArc2ZiT2ZmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZkFjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSk7CisgICAgICAgICAgICBzZmJEaXN0TmV3ID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KAorICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtICsgc2ZiT2ZmcywgcXVhbnRTcGVjVG1wICsgc2ZiT2ZmcywKKyAgICAgICAgICAgICAgICBzZmJXaWR0aCwgc2NmQWN0LCBkWm9uZVF1YW50RW5hYmxlKTsKIAogICAgICAgICAgICAgaWYgKHNmYkRpc3ROZXcgPCBzZmJEaXN0W3NmYkFjdF0pIHsKICAgICAgICAgICAgICAgLyogc3VjY2VzcywgcmVwbGFjZSBzY2YgYnkgbmV3IG9uZSAqLwogICAgICAgICAgICAgICBzY2Zbc2ZiQWN0XSA9IHNjZkFjdDsKICAgICAgICAgICAgICAgc2ZiRGlzdFtzZmJBY3RdID0gc2ZiRGlzdE5ldzsKIAotICAgICAgICAgICAgICBmb3IgKGs9MDsgazxzZmJXaWR0aDsgaysrKQotICAgICAgICAgICAgICAgIHF1YW50U3BlY1tzZmJPZmZzK2tdID0gcXVhbnRTcGVjVG1wW3NmYk9mZnMra107CisgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBzZmJXaWR0aDsgaysrKQorICAgICAgICAgICAgICAgIHF1YW50U3BlY1tzZmJPZmZzICsga10gPSBxdWFudFNwZWNUbXBbc2ZiT2ZmcyArIGtdOwogCiAgICAgICAgICAgICAgIGRlbHRhUGVOZXcgPSBkZWx0YVBlVG1wOwogICAgICAgICAgICAgICBzdWNjZXNzID0gMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8qIG1hcmsgYXMgYWxyZWFkeSBjaGVja2VkICovCi0gICAgICAgICAgICBpZiAodXBkYXRlTWluU2NmQ2FsY3VsYXRlZCkKLSAgICAgICAgICAgICAgbWluU2NmQ2FsY3VsYXRlZFtzZmJBY3RdID0gc2NmQWN0OwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICh1cGRhdGVNaW5TY2ZDYWxjdWxhdGVkKSBtaW5TY2ZDYWxjdWxhdGVkW3NmYkFjdF0gPSBzY2ZBY3Q7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qIGZyb20gdGhpcyBzY2YgdmFsdWUgb24gbm90IGFsbCBuZXcgdmFsdWVzIGhhdmUgYmVlbiBjaGVja2VkICovCiAgICAgICAgICAgICB1cGRhdGVNaW5TY2ZDYWxjdWxhdGVkID0gMDsKICAgICAgICAgICB9CkBAIC02MTIsMTggKzYwNywxNyBAQAogICAgIGlmIChzdWNjZXNzICYmIHJlc3RhcnRPblN1Y2Nlc3MpIHsKICAgICAgIC8qIHN0YXJ0IGFnYWluIGF0IGZpcnN0IHNmYiAqLwogICAgICAgc2ZiTGFzdCA9IC0xOwotICAgICAgc2ZiQWN0ICA9IC0xOworICAgICAgc2ZiQWN0ID0gLTE7CiAgICAgICBzZmJOZXh0ID0gLTE7CiAgICAgICBzY2ZMYXN0ID0gMDsKICAgICAgIHNjZk5leHQgPSAwOwotICAgICAgc2NmTWluICA9IEZES19JTlRfTUFYOwotICAgICAgc2NmTWF4ICA9IEZES19JTlRfTUFYOworICAgICAgc2NmTWluID0gRkRLX0lOVF9NQVg7CisgICAgICBzY2ZNYXggPSBGREtfSU5UX01BWDsKICAgICAgIHN1Y2Nlc3MgPSAwOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgLyogc2hpZnQgc2ZicyBmb3IgbmV4dCBiYW5kICovCiAgICAgICBzZmJMYXN0ID0gc2ZiQWN0OwotICAgICAgc2ZiQWN0ICA9IHNmYk5leHQ7CisgICAgICBzZmJBY3QgPSBzZmJOZXh0OwogICAgIH0KICAgfSB3aGlsZSAoc2ZiTmV4dCA8IHBzeU91dENoYW4tPnNmYkNudCk7CiB9CkBAIC02MzIsMTggKzYyNiwxMSBAQAogICBGdW5jdGlvbjogRkRLYWFjRW5jX2Fzc2ltaWxhdGVNdWx0aXBsZVNjZgogCiAqLwotc3RhdGljIHZvaWQgRkRLYWFjRW5jX2Fzc2ltaWxhdGVNdWx0aXBsZVNjZihQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgICpxY091dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjVG1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBkWm9uZVF1YW50RW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbWluU2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJEaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJDb25zdFBlUGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiRm9ybUZhY3RvckxkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiTlJlbGV2YW50TGluZXMpCi17CitzdGF0aWMgdm9pZCBGREthYWNFbmNfYXNzaW1pbGF0ZU11bHRpcGxlU2NmKAorICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiwgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbm5lbCwgU0hPUlQgKnF1YW50U3BlYywKKyAgICBTSE9SVCAqcXVhbnRTcGVjVG1wLCBJTlQgZFpvbmVRdWFudEVuYWJsZSwgSU5UICpzY2YsIGNvbnN0IElOVCAqbWluU2NmLAorICAgIEZJWFBfREJMICpzZmJEaXN0LCBGSVhQX0RCTCAqc2ZiQ29uc3RQZVBhcnQsIEZJWFBfREJMICpzZmJGb3JtRmFjdG9yTGREYXRhLAorICAgIEZJWFBfREJMICpzZmJOUmVsZXZhbnRMaW5lcykgewogICBJTlQgc2ZiLCBzdGFydFNmYiwgc3RvcFNmYjsKICAgSU5UIHNjZlRtcFtNQVhfR1JPVVBFRF9TRkJdLCBzY2ZNaW4sIHNjZk1heCwgc2NmQWN0OwogICBJTlQgcG9zc2libGVSZWdpb25Gb3VuZDsKQEAgLTY1OCwzMSArNjQ1LDI5IEBACiAgIC8qIGNhbGMgbWluIGFuZCBtYXggc2NhbGZhY3RvcnMgKi8KICAgc2NmTWluID0gRkRLX0lOVF9NQVg7CiAgIHNjZk1heCA9IEZES19JTlRfTUlOOwotICBmb3IgKHNmYj0wOyBzZmI8c2ZiQ250OyBzZmIrKykgewotICAgIGlmIChzY2Zbc2ZiXSE9RkRLX0lOVF9NSU4pIHsKKyAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYisrKSB7CisgICAgaWYgKHNjZltzZmJdICE9IEZES19JTlRfTUlOKSB7CiAgICAgICBzY2ZNaW4gPSBmaXhNaW4oc2NmTWluLCBzY2Zbc2ZiXSk7CiAgICAgICBzY2ZNYXggPSBmaXhNYXgoc2NmTWF4LCBzY2Zbc2ZiXSk7CiAgICAgfQogICB9CiAKLSAgaWYgKHNjZk1heCAhPSBGREtfSU5UX01JTiAmJiBzY2ZNYXggPD0gc2NmTWluK01BWF9TQ0ZfREVMVEEpIHsKLQorICBpZiAoc2NmTWF4ICE9IEZES19JTlRfTUlOICYmIHNjZk1heCA8PSBzY2ZNaW4gKyBNQVhfU0NGX0RFTFRBKSB7CiAgICAgc2NmQWN0ID0gc2NmTWF4OwogCiAgICAgZG8gewogICAgICAgLyogdHJ5IHNtYWxsZXIgc2NmICovCiAgICAgICBzY2ZBY3QtLTsKLSAgICAgIGZvciAoaT0wOyBpPE1BWF9HUk9VUEVEX1NGQjsgaSsrKQotICAgICAgICBzY2ZUbXBbaV0gPSBzY2ZbaV07CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0dST1VQRURfU0ZCOyBpKyspIHNjZlRtcFtpXSA9IHNjZltpXTsKICAgICAgIHN0b3BTZmIgPSAwOwogICAgICAgZG8gewogICAgICAgICAvKiBzZWFyY2ggZm9yIHJlZ2lvbiB3aGVyZSBhbGwgc2NmcyBhcmUgYmlnZ2VyIHRoYW4gc2NmQWN0ICovCiAgICAgICAgIHNmYiA9IHN0b3BTZmI7Ci0gICAgICAgIHdoaWxlIChzZmI8c2ZiQ250ICYmIChzY2Zbc2ZiXT09RkRLX0lOVF9NSU4gfHwgc2NmW3NmYl0gPD0gc2NmQWN0KSkKKyAgICAgICAgd2hpbGUgKHNmYiA8IHNmYkNudCAmJiAoc2NmW3NmYl0gPT0gRkRLX0lOVF9NSU4gfHwgc2NmW3NmYl0gPD0gc2NmQWN0KSkKICAgICAgICAgICBzZmIrKzsKICAgICAgICAgc3RhcnRTZmIgPSBzZmI7CiAgICAgICAgIHNmYisrOwotICAgICAgICB3aGlsZSAoc2ZiPHNmYkNudCAmJiAoc2NmW3NmYl09PUZES19JTlRfTUlOIHx8IHNjZltzZmJdID4gc2NmQWN0KSkKKyAgICAgICAgd2hpbGUgKHNmYiA8IHNmYkNudCAmJiAoc2NmW3NmYl0gPT0gRkRLX0lOVF9NSU4gfHwgc2NmW3NmYl0gPiBzY2ZBY3QpKQogICAgICAgICAgIHNmYisrOwogICAgICAgICBzdG9wU2ZiID0gc2ZiOwogCkBAIC02OTAsNyArNjc1LDcgQEAKICAgICAgICAgcG9zc2libGVSZWdpb25Gb3VuZCA9IDA7CiAgICAgICAgIGlmIChzdGFydFNmYiA8IHNmYkNudCkgewogICAgICAgICAgIHBvc3NpYmxlUmVnaW9uRm91bmQgPSAxOwotICAgICAgICAgIGZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKKyAgICAgICAgICBmb3IgKHNmYiA9IHN0YXJ0U2ZiOyBzZmIgPCBzdG9wU2ZiOyBzZmIrKykgewogICAgICAgICAgICAgaWYgKHNjZltzZmJdICE9IEZES19JTlRfTUlOKQogICAgICAgICAgICAgICBpZiAoc2NmQWN0IDwgbWluU2NmW3NmYl0pIHsKICAgICAgICAgICAgICAgICBwb3NzaWJsZVJlZ2lvbkZvdW5kID0gMDsKQEAgLTcwMiw0MCArNjg3LDM4IEBACiAgICAgICAgIGlmIChwb3NzaWJsZVJlZ2lvbkZvdW5kKSB7IC8qIHJlZ2lvbiBmb3VuZCAqLwogCiAgICAgICAgICAgLyogcmVwbGFjZSBzY2ZzIGluIHJlZ2lvbiBieSBzY2ZBY3QgKi8KLSAgICAgICAgICBmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7Ci0gICAgICAgICAgICBpZiAoc2NmVG1wW3NmYl0gIT0gRkRLX0lOVF9NSU4pCi0gICAgICAgICAgICAgIHNjZlRtcFtzZmJdID0gc2NmQWN0OworICAgICAgICAgIGZvciAoc2ZiID0gc3RhcnRTZmI7IHNmYiA8IHN0b3BTZmI7IHNmYisrKSB7CisgICAgICAgICAgICBpZiAoc2NmVG1wW3NmYl0gIT0gRkRLX0lOVF9NSU4pIHNjZlRtcFtzZmJdID0gc2NmQWN0OwogICAgICAgICAgIH0KIAogICAgICAgICAgIC8qIGVzdGltYXRlIGNoYW5nZSBpbiBiaXQgZGVtYW5kIGZvciBuZXcgc2NmcyAqLwotICAgICAgICAgIGRlbHRhU2NmQml0cyA9IEZES2FhY0VuY19jb3VudFNjZkJpdHNEaWZmKHNjZixzY2ZUbXAsc2ZiQ250LHN0YXJ0U2ZiLHN0b3BTZmIpOworICAgICAgICAgIGRlbHRhU2NmQml0cyA9IEZES2FhY0VuY19jb3VudFNjZkJpdHNEaWZmKHNjZiwgc2NmVG1wLCBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTZmIsIHN0b3BTZmIpOwogCi0gICAgICAgICAgZGVsdGFTcGVjUGUgPSBGREthYWNFbmNfY2FsY1NwZWNQZURpZmYocHN5T3V0Q2hhbiwgcWNPdXRDaGFubmVsLCBzY2YsIHNjZlRtcCwgc2ZiQ29uc3RQZVBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJGb3JtRmFjdG9yTGREYXRhLCBzZmJOUmVsZXZhbnRMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2ZiLCBzdG9wU2ZiKTsKKyAgICAgICAgICBkZWx0YVNwZWNQZSA9IEZES2FhY0VuY19jYWxjU3BlY1BlRGlmZigKKyAgICAgICAgICAgICAgcHN5T3V0Q2hhbiwgcWNPdXRDaGFubmVsLCBzY2YsIHNjZlRtcCwgc2ZiQ29uc3RQZVBhcnQsCisgICAgICAgICAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGEsIHNmYk5SZWxldmFudExpbmVzLCBzdGFydFNmYiwgc3RvcFNmYik7CiAKICAgICAgICAgICBkZWx0YVBlTmV3ID0gZGVsdGFQZSArIChGSVhQX0RCTClkZWx0YVNjZkJpdHMgKyBkZWx0YVNwZWNQZTsKIAogICAgICAgICAgIC8qIG5ldyBiaXQgZGVtYW5kIHNtYWxsIGVub3VnaCA/ICovCiAgICAgICAgICAgLyogMC4wMDA2MTAzNTE1NjI1ZiA9IDEwLjBmLygyXigyKkFTX1BFX0ZBQ19TSElGVCkpICovCiAgICAgICAgICAgaWYgKGRlbHRhUGVOZXcgPCBGTDJGWENPTlNUX0RCTCgwLjAwMDYxMDM1MTU2MjVmKSkgewotCiAgICAgICAgICAgICAvKiBxdWFudGl6ZSBhbmQgY2FsYyBzdW0gb2YgbmV3IGRpc3RvcnRpb24gKi8KICAgICAgICAgICAgIGRpc3RPbGRTdW0gPSBkaXN0TmV3U3VtID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICAgICAgICBmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7CisgICAgICAgICAgICBmb3IgKHNmYiA9IHN0YXJ0U2ZiOyBzZmIgPCBzdG9wU2ZiOyBzZmIrKykgewogICAgICAgICAgICAgICBpZiAoc2NmVG1wW3NmYl0gIT0gRkRLX0lOVF9NSU4pIHsKICAgICAgICAgICAgICAgICBkaXN0T2xkU3VtICs9IENhbGNJbnZMZERhdGEoc2ZiRGlzdFtzZmJdKSA+PiBESVNUX0ZBQ19TSElGVDsKIAotICAgICAgICAgICAgICAgIHNmYldpZHRoID0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmIrMV0gLSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYl07CisgICAgICAgICAgICAgICAgc2ZiV2lkdGggPSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYiArIDFdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiXTsKICAgICAgICAgICAgICAgICBzZmJPZmZzID0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmJdOwogCi0gICAgICAgICAgICAgICAgc2ZiRGlzdE5ld1tzZmJdID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtK3NmYk9mZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjVG1wK3NmYk9mZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmQWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUpOworICAgICAgICAgICAgICAgIHNmYkRpc3ROZXdbc2ZiXSA9IEZES2FhY0VuY19jYWxjU2ZiRGlzdCgKKyAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5tZGN0U3BlY3RydW0gKyBzZmJPZmZzLAorICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNUbXAgKyBzZmJPZmZzLCBzZmJXaWR0aCwgc2NmQWN0LCBkWm9uZVF1YW50RW5hYmxlKTsKIAotICAgICAgICAgICAgICAgIGlmIChzZmJEaXN0TmV3W3NmYl0gPnFjT3V0Q2hhbm5lbC0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYl0pIHsKKyAgICAgICAgICAgICAgICBpZiAoc2ZiRGlzdE5ld1tzZmJdID4gcWNPdXRDaGFubmVsLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiXSkgewogICAgICAgICAgICAgICAgICAgLyogbm8gaW1wcm92ZW1lbnQsIHNraXAgZnVydGhlciBkaXN0LiBjYWxjdWxhdGlvbnMgKi8KICAgICAgICAgICAgICAgICAgIGRpc3ROZXdTdW0gPSBkaXN0T2xkU3VtIDw8IDE7CiAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTc0NiwyMCArNzI5LDE5IEBACiAgICAgICAgICAgICAvKiBkaXN0b3J0aW9uIHNtYWxsZXIgPyAtPiB1c2UgbmV3IHNjYWxlZmFjdG9ycyAqLwogICAgICAgICAgICAgaWYgKGRpc3ROZXdTdW0gPCBkaXN0T2xkU3VtKSB7CiAgICAgICAgICAgICAgIGRlbHRhUGUgPSBkZWx0YVBlTmV3OwotICAgICAgICAgICAgICBmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7CisgICAgICAgICAgICAgIGZvciAoc2ZiID0gc3RhcnRTZmI7IHNmYiA8IHN0b3BTZmI7IHNmYisrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHNjZltzZmJdICE9IEZES19JTlRfTUlOKSB7Ci0gICAgICAgICAgICAgICAgICBzZmJXaWR0aCA9IHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiKzFdIC0KKyAgICAgICAgICAgICAgICAgIHNmYldpZHRoID0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmIgKyAxXSAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiXTsKICAgICAgICAgICAgICAgICAgIHNmYk9mZnMgPSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYl07CiAgICAgICAgICAgICAgICAgICBzY2Zbc2ZiXSA9IHNjZkFjdDsKICAgICAgICAgICAgICAgICAgIHNmYkRpc3Rbc2ZiXSA9IHNmYkRpc3ROZXdbc2ZiXTsKIAotICAgICAgICAgICAgICAgICAgZm9yIChrPTA7IGs8c2ZiV2lkdGg7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjW3NmYk9mZnMra10gPSBxdWFudFNwZWNUbXBbc2ZiT2ZmcytrXTsKKyAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBzZmJXaWR0aDsgaysrKQorICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNbc2ZiT2ZmcyArIGtdID0gcXVhbnRTcGVjVG1wW3NmYk9mZnMgKyBrXTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLQogICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC03NzMsMTggKzc1NSwxMSBAQAogICBGdW5jdGlvbjogRkRLYWFjRW5jX0ZES2FhY0VuY19hc3NpbWlsYXRlTXVsdGlwbGVTY2YyCiAKICovCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfRkRLYWFjRW5jX2Fzc2ltaWxhdGVNdWx0aXBsZVNjZjIoUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAgKnFjT3V0Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50U3BlY1RtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGRab25lUXVhbnRFbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm1pblNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNmYkRpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJDb25zdFBlUGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNmYkZvcm1GYWN0b3JMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJOUmVsZXZhbnRMaW5lcykKLXsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19GREthYWNFbmNfYXNzaW1pbGF0ZU11bHRpcGxlU2NmMigKKyAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4sIFFDX09VVF9DSEFOTkVMICpxY091dENoYW5uZWwsIFNIT1JUICpxdWFudFNwZWMsCisgICAgU0hPUlQgKnF1YW50U3BlY1RtcCwgSU5UIGRab25lUXVhbnRFbmFibGUsIElOVCAqc2NmLCBjb25zdCBJTlQgKm1pblNjZiwKKyAgICBGSVhQX0RCTCAqc2ZiRGlzdCwgRklYUF9EQkwgKnNmYkNvbnN0UGVQYXJ0LCBGSVhQX0RCTCAqc2ZiRm9ybUZhY3RvckxkRGF0YSwKKyAgICBGSVhQX0RCTCAqc2ZiTlJlbGV2YW50TGluZXMpIHsKICAgSU5UIHNmYiwgc3RhcnRTZmIsIHN0b3BTZmI7CiAgIElOVCBzY2ZUbXBbTUFYX0dST1VQRURfU0ZCXSwgc2NmQWN0LCBzY2ZOZXc7CiAgIElOVCBzY2ZQcmV2LCBzY2ZOZXh0LCBzY2ZQcmV2TmV4dE1pbiwgc2NmUHJldk5leHRNYXgsIHNjZkxvLCBzY2ZIaTsKQEAgLTc5OCwxMyArNzczLDEzIEBACiAgIEZJWFBfREJMIGRlbHRhUGVOZXcgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgSU5UIHNmYkNudCA9IHBzeU91dENoYW4tPnNmYkNudDsKICAgSU5UIGJTdWNjZXNzLCBiQ2hlY2tTY2Y7Ci0gIElOVCBpLGs7CisgIElOVCBpLCBrOwogCiAgIC8qIGNhbGMgbWluIGFuZCBtYXggc2NhbGZhY3RvcnMgKi8KICAgc2NmTWluID0gRkRLX0lOVF9NQVg7CiAgIHNjZk1heCA9IEZES19JTlRfTUlOOwotICBmb3IgKHNmYj0wOyBzZmI8c2ZiQ250OyBzZmIrKykgewotICAgIGlmIChzY2Zbc2ZiXSE9RkRLX0lOVF9NSU4pIHsKKyAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYisrKSB7CisgICAgaWYgKHNjZltzZmJdICE9IEZES19JTlRfTUlOKSB7CiAgICAgICBzY2ZNaW4gPSBmaXhNaW4oc2NmTWluLCBzY2Zbc2ZiXSk7CiAgICAgICBzY2ZNYXggPSBmaXhNYXgoc2NmTWF4LCBzY2Zbc2ZiXSk7CiAgICAgfQpAQCAtODE3LDEyICs3OTIsMTIgQEAKICAgICBzY2ZQcmV2ID0gc2NmQWN0OwogCiAgICAgc2ZiID0gc3RvcFNmYjsKLSAgICB3aGlsZSAoc2ZiPHNmYkNudCAmJiAoc2NmW3NmYl09PUZES19JTlRfTUlOKSkKLSAgICAgIHNmYisrOworICAgIHdoaWxlIChzZmIgPCBzZmJDbnQgJiYgKHNjZltzZmJdID09IEZES19JTlRfTUlOKSkgc2ZiKys7CiAgICAgc3RhcnRTZmIgPSBzZmI7CiAgICAgc2NmQWN0ID0gc2NmW3N0YXJ0U2ZiXTsKICAgICBzZmIrKzsKLSAgICB3aGlsZSAoc2ZiPHNmYkNudCAmJiAoKHNjZltzZmJdPT1GREtfSU5UX01JTikgfHwgKHNjZltzZmJdPT1zY2Zbc3RhcnRTZmJdKSkpCisgICAgd2hpbGUgKHNmYiA8IHNmYkNudCAmJgorICAgICAgICAgICAoKHNjZltzZmJdID09IEZES19JTlRfTUlOKSB8fCAoc2NmW3NmYl0gPT0gc2NmW3N0YXJ0U2ZiXSkpKQogICAgICAgc2ZiKys7CiAgICAgc3RvcFNmYiA9IHNmYjsKIApAQCAtODMxLDggKzgwNiw3IEBACiAgICAgZWxzZQogICAgICAgc2NmTmV4dCA9IHNjZkFjdDsKIAotICAgIGlmIChzY2ZQcmV2ID09IEZES19JTlRfTUlOKQotICAgICAgc2NmUHJldiA9IHNjZkFjdDsKKyAgICBpZiAoc2NmUHJldiA9PSBGREtfSU5UX01JTikgc2NmUHJldiA9IHNjZkFjdDsKIAogICAgIHNjZlByZXZOZXh0TWF4ID0gZml4TWF4KHNjZlByZXYsIHNjZk5leHQpOwogICAgIHNjZlByZXZOZXh0TWluID0gZml4TWluKHNjZlByZXYsIHNjZk5leHQpOwpAQCAtODQ3LDM5ICs4MjEsNDkgQEAKICAgICBlbHNlCiAgICAgICBzY2ZMbyA9IHNjZlByZXZOZXh0TWF4OwogCi0gICAgaWYgKHN0YXJ0U2ZiIDwgc2ZiQ250ICYmIHNjZkhpLXNjZkxvIDw9IE1BWF9TQ0ZfREVMVEEpIHsgLyogcmVnaW9uIGZvdW5kICovCisgICAgaWYgKHN0YXJ0U2ZiIDwgc2ZiQ250ICYmCisgICAgICAgIHNjZkhpIC0gc2NmTG8gPD0gTUFYX1NDRl9ERUxUQSkgeyAvKiByZWdpb24gZm91bmQgKi8KICAgICAgIC8qIDEuIHRyeSB0byBzYXZlIGJpdHMgYnkgY29hcnNlciBxdWFudGl6YXRpb24gKi8KICAgICAgIGlmIChzY2ZIaSA+IHNjZltzdGFydFNmYl0pIHsKICAgICAgICAgLyogY2FsY3VsYXRlIHRoZSBhbGxvd2VkIGRpc3RvcnRpb24gKi8KLSAgICAgICAgZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgeworICAgICAgICBmb3IgKHNmYiA9IHN0YXJ0U2ZiOyBzZmIgPCBzdG9wU2ZiOyBzZmIrKykgewogICAgICAgICAgIGlmIChzY2Zbc2ZiXSAhPSBGREtfSU5UX01JTikgewotICAgICAgICAgICAgLyogc2ZiRGlzdE1heFtzZmJdID0gKGZsb2F0KXBvdyhxY091dENoYW5uZWwtPnNmYlRocmVzaG9sZFtzZmJdKnNmYkRpc3Rbc2ZiXSpzZmJEaXN0W3NmYl0sMS4wZi8zLjBmKTsgKi8KLSAgICAgICAgICAgIC8qIHNmYkRpc3RNYXhbc2ZiXSA9IGZpeE1heChzZmJEaXN0TWF4W3NmYl0scWNPdXRDaGFubmVsLT5zZmJFbmVyZ3lbc2ZiXSpGTDJGWENPTlNUX0RCTCgxLmUtM2YpKTsgKi8KKyAgICAgICAgICAgIC8qIHNmYkRpc3RNYXhbc2ZiXSA9CisgICAgICAgICAgICAgKiAoZmxvYXQpcG93KHFjT3V0Q2hhbm5lbC0+c2ZiVGhyZXNob2xkW3NmYl0qc2ZiRGlzdFtzZmJdKnNmYkRpc3Rbc2ZiXSwxLjBmLzMuMGYpOworICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiBzZmJEaXN0TWF4W3NmYl0gPQorICAgICAgICAgICAgICogZml4TWF4KHNmYkRpc3RNYXhbc2ZiXSxxY091dENoYW5uZWwtPnNmYkVuZXJneVtzZmJdKkZMMkZYQ09OU1RfREJMKDEuZS0zZikpOworICAgICAgICAgICAgICovCiAgICAgICAgICAgICAvKiAtMC4xNTU3MTUzNzk0NCA9IGxkNjQoMS5lLTNmKSovCi0gICAgICAgICAgICBzZmJEaXN0TWF4W3NmYl0gPSBmTXVsdChGTDJGWENPTlNUX0RCTCgxLjBmLzMuMGYpLHFjT3V0Q2hhbm5lbC0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYl0pK2ZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMGYvMy4wZiksc2ZiRGlzdFtzZmJdKStmTXVsdChGTDJGWENPTlNUX0RCTCgxLjBmLzMuMGYpLHNmYkRpc3Rbc2ZiXSk7Ci0gICAgICAgICAgICBzZmJEaXN0TWF4W3NmYl0gPSBmaXhNYXgoc2ZiRGlzdE1heFtzZmJdLHFjT3V0Q2hhbm5lbC0+c2ZiRW5lcmd5TGREYXRhW3NmYl0tRkwyRlhDT05TVF9EQkwoMC4xNTU3MTUzNzk0NCkpOwotICAgICAgICAgICAgc2ZiRGlzdE1heFtzZmJdID0gZml4TWluKHNmYkRpc3RNYXhbc2ZiXSxxY091dENoYW5uZWwtPnNmYlRocmVzaG9sZExkRGF0YVtzZmJdKTsKKyAgICAgICAgICAgIHNmYkRpc3RNYXhbc2ZiXSA9IGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMGYgLyAzLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYl0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMGYgLyAzLjBmKSwgc2ZiRGlzdFtzZmJdKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChGTDJGWENPTlNUX0RCTCgxLjBmIC8gMy4wZiksIHNmYkRpc3Rbc2ZiXSk7CisgICAgICAgICAgICBzZmJEaXN0TWF4W3NmYl0gPQorICAgICAgICAgICAgICAgIGZpeE1heChzZmJEaXN0TWF4W3NmYl0sIHFjT3V0Q2hhbm5lbC0+c2ZiRW5lcmd5TGREYXRhW3NmYl0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjE1NTcxNTM3OTQ0KSk7CisgICAgICAgICAgICBzZmJEaXN0TWF4W3NmYl0gPQorICAgICAgICAgICAgICAgIGZpeE1pbihzZmJEaXN0TWF4W3NmYl0sIHFjT3V0Q2hhbm5lbC0+c2ZiVGhyZXNob2xkTGREYXRhW3NmYl0pOwogICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8qIGxvb3Agb3ZlciBhbGwgcG9zc2libGUgc2NmIHZhbHVlcyBmb3IgdGhpcyByZWdpb24gKi8KICAgICAgICAgYkNoZWNrU2NmID0gMTsKLSAgICAgICAgZm9yIChzY2ZOZXc9c2NmW3N0YXJ0U2ZiXSsxOyBzY2ZOZXc8PXNjZkhpOyBzY2ZOZXcrKykgewotCSAgICAgICAgIGZvciAoaz0wOyBrPE1BWF9HUk9VUEVEX1NGQjsgaysrKQotICAgICAgICAgICAgc2NmVG1wW2tdID0gc2NmW2tdOworICAgICAgICBmb3IgKHNjZk5ldyA9IHNjZltzdGFydFNmYl0gKyAxOyBzY2ZOZXcgPD0gc2NmSGk7IHNjZk5ldysrKSB7CisgICAgICAgICAgZm9yIChrID0gMDsgayA8IE1BWF9HUk9VUEVEX1NGQjsgaysrKSBzY2ZUbXBba10gPSBzY2Zba107CiAKICAgICAgICAgICAvKiByZXBsYWNlIHNjZnMgaW4gcmVnaW9uIGJ5IHNjZk5ldyAqLwotICAgICAgICAgIGZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKLSAgICAgICAgICAgIGlmIChzY2ZUbXBbc2ZiXSAhPSBGREtfSU5UX01JTikKLSAgICAgICAgICAgICAgc2NmVG1wW3NmYl0gPSBzY2ZOZXc7CisgICAgICAgICAgZm9yIChzZmIgPSBzdGFydFNmYjsgc2ZiIDwgc3RvcFNmYjsgc2ZiKyspIHsKKyAgICAgICAgICAgIGlmIChzY2ZUbXBbc2ZiXSAhPSBGREtfSU5UX01JTikgc2NmVG1wW3NmYl0gPSBzY2ZOZXc7CiAgICAgICAgICAgfQogCiAgICAgICAgICAgLyogZXN0aW1hdGUgY2hhbmdlIGluIGJpdCBkZW1hbmQgZm9yIG5ldyBzY2ZzICovCi0gICAgICAgICAgZGVsdGFTY2ZCaXRzID0gRkRLYWFjRW5jX2NvdW50U2NmQml0c0RpZmYoc2NmLHNjZlRtcCxzZmJDbnQsc3RhcnRTZmIsc3RvcFNmYik7CisgICAgICAgICAgZGVsdGFTY2ZCaXRzID0gRkRLYWFjRW5jX2NvdW50U2NmQml0c0RpZmYoc2NmLCBzY2ZUbXAsIHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNmYiwgc3RvcFNmYik7CiAKLSAgICAgICAgICBkZWx0YVNwZWNQZSA9IEZES2FhY0VuY19jYWxjU3BlY1BlRGlmZihwc3lPdXRDaGFuLCBxY091dENoYW5uZWwsIHNjZiwgc2NmVG1wLCBzZmJDb25zdFBlUGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGEsIHNmYk5SZWxldmFudExpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTZmIsIHN0b3BTZmIpOworICAgICAgICAgIGRlbHRhU3BlY1BlID0gRkRLYWFjRW5jX2NhbGNTcGVjUGVEaWZmKAorICAgICAgICAgICAgICBwc3lPdXRDaGFuLCBxY091dENoYW5uZWwsIHNjZiwgc2NmVG1wLCBzZmJDb25zdFBlUGFydCwKKyAgICAgICAgICAgICAgc2ZiRm9ybUZhY3RvckxkRGF0YSwgc2ZiTlJlbGV2YW50TGluZXMsIHN0YXJ0U2ZiLCBzdG9wU2ZiKTsKIAogICAgICAgICAgIGRlbHRhUGVOZXcgPSBkZWx0YVBlICsgKEZJWFBfREJMKWRlbHRhU2NmQml0cyArIGRlbHRhU3BlY1BlOwogCkBAIC04ODgsMTMgKzg3MiwxMiBAQAogICAgICAgICAgICAgYlN1Y2Nlc3MgPSAxOwogCiAgICAgICAgICAgICAvKiBxdWFudGl6ZSBhbmQgY2FsYyBzdW0gb2YgbmV3IGRpc3RvcnRpb24gKi8KLSAgICAgICAgICAgIGZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKKyAgICAgICAgICAgIGZvciAoc2ZiID0gc3RhcnRTZmI7IHNmYiA8IHN0b3BTZmI7IHNmYisrKSB7CiAgICAgICAgICAgICAgIGlmIChzY2ZUbXBbc2ZiXSAhPSBGREtfSU5UX01JTikgewotICAgICAgICAgICAgICAgIHNmYkRpc3ROZXdbc2ZiXSA9IEZES2FhY0VuY19jYWxjU2ZiRGlzdChxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bStzZmJPZmZzW3NmYl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjVG1wK3NmYk9mZnNbc2ZiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzW3NmYisxXS1zZmJPZmZzW3NmYl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmTmV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUpOworICAgICAgICAgICAgICAgIHNmYkRpc3ROZXdbc2ZiXSA9IEZES2FhY0VuY19jYWxjU2ZiRGlzdCgKKyAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5tZGN0U3BlY3RydW0gKyBzZmJPZmZzW3NmYl0sCisgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY1RtcCArIHNmYk9mZnNbc2ZiXSwKKyAgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc1tzZmIgKyAxXSAtIHNmYk9mZnNbc2ZiXSwgc2NmTmV3LCBkWm9uZVF1YW50RW5hYmxlKTsKIAogICAgICAgICAgICAgICAgIGlmIChzZmJEaXN0TmV3W3NmYl0gPiBzZmJEaXN0TWF4W3NmYl0pIHsKICAgICAgICAgICAgICAgICAgIC8qIG5vIGltcHJvdmVtZW50LCBza2lwIGZ1cnRoZXIgZGlzdC4gY2FsY3VsYXRpb25zICovCkBAIC05MDgsMTggKzg5MSwxOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJDaGVja1NjZj09MCkgLyogZnVydGhlciBjYWxjdWxhdGlvbnMgdXNlbGVzcyA/ICovCi0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoYkNoZWNrU2NmID09IDApIC8qIGZ1cnRoZXIgY2FsY3VsYXRpb25zIHVzZWxlc3MgPyAqLworICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIC8qIGRpc3RvcnRpb24gc21hbGwgZW5vdWdoID8gLT4gdXNlIG5ldyBzY2FsZWZhY3RvcnMgKi8KICAgICAgICAgICAgIGlmIChiU3VjY2VzcykgewogICAgICAgICAgICAgICBkZWx0YVBlID0gZGVsdGFQZU5ldzsKLSAgICAgICAgICAgICAgZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgeworICAgICAgICAgICAgICBmb3IgKHNmYiA9IHN0YXJ0U2ZiOyBzZmIgPCBzdG9wU2ZiOyBzZmIrKykgewogICAgICAgICAgICAgICAgIGlmIChzY2Zbc2ZiXSAhPSBGREtfSU5UX01JTikgewogICAgICAgICAgICAgICAgICAgc2NmW3NmYl0gPSBzY2ZOZXc7CiAgICAgICAgICAgICAgICAgICBzZmJEaXN0W3NmYl0gPSBzZmJEaXN0TmV3W3NmYl07CiAKLSAgICAgICAgICAgICAgICAgIGZvciAoaz0wOyBrPHNmYk9mZnNbc2ZiKzFdLXNmYk9mZnNbc2ZiXTsgaysrKQotICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNbc2ZiT2Zmc1tzZmJdK2tdID0gcXVhbnRTcGVjVG1wW3NmYk9mZnNbc2ZiXStrXTsKKyAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBzZmJPZmZzW3NmYiArIDFdIC0gc2ZiT2Zmc1tzZmJdOyBrKyspCisgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY1tzZmJPZmZzW3NmYl0gKyBrXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNUbXBbc2ZiT2Zmc1tzZmJdICsga107CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC05MzAsNTIgKzkxNCw0NyBAQAogICAgICAgLyogMi4gb25seSBpZiBjb2Fyc2VyIHF1YW50aXphdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWwsIHRyeSB0byBmaW5kCiAgICAgICAgICBhIGJldHRlciBzb2x1dGlvbiBieSBmaW5lciBxdWFudGl6YXRpb24gYW5kIHJlZHVjaW5nIGJpdHMgZm9yCiAgICAgICAgICBzY2FsZWZhY3RvciBjb2RpbmcgKi8KLSAgICAgIGlmIChzY2ZBY3Q9PXNjZltzdGFydFNmYl0gJiYKLSAgICAgICAgICBzY2ZMbyA8IHNjZkFjdCAmJgotICAgICAgICAgIHNjZk1heC1zY2ZNaW4gPD0gTUFYX1NDRl9ERUxUQSkgewotCisgICAgICBpZiAoc2NmQWN0ID09IHNjZltzdGFydFNmYl0gJiYgc2NmTG8gPCBzY2ZBY3QgJiYKKyAgICAgICAgICBzY2ZNYXggLSBzY2ZNaW4gPD0gTUFYX1NDRl9ERUxUQSkgewogICAgICAgICBpbnQgYm1pblNjZlZpb2xhdGlvbiA9IDA7CiAKLSAgICAgICAgZm9yIChrPTA7IGs8TUFYX0dST1VQRURfU0ZCOyBrKyspCi0gICAgICAgICAgc2NmVG1wW2tdID0gc2NmW2tdOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgTUFYX0dST1VQRURfU0ZCOyBrKyspIHNjZlRtcFtrXSA9IHNjZltrXTsKIAogICAgICAgICBzY2ZOZXcgPSBzY2ZMbzsKIAogICAgICAgICAvKiByZXBsYWNlIHNjZnMgaW4gcmVnaW9uIGJ5IHNjZk5ldyBhbmQKICAgICAgICAgICAgY2hlY2sgaWYgaW4gYWxsIHNmYiBzY2ZOZXcgPj0gbWluU2NmW3NmYl0gKi8KLSAgICAgICAgZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgeworICAgICAgICBmb3IgKHNmYiA9IHN0YXJ0U2ZiOyBzZmIgPCBzdG9wU2ZiOyBzZmIrKykgewogICAgICAgICAgIGlmIChzY2ZUbXBbc2ZiXSAhPSBGREtfSU5UX01JTikgewogICAgICAgICAgICAgc2NmVG1wW3NmYl0gPSBzY2ZOZXc7Ci0gICAgICAgICAgICBpZiAoc2NmTmV3IDwgbWluU2NmW3NmYl0pCi0gICAgICAgICAgICAgIGJtaW5TY2ZWaW9sYXRpb24gPSAxOworICAgICAgICAgICAgaWYgKHNjZk5ldyA8IG1pblNjZltzZmJdKSBibWluU2NmVmlvbGF0aW9uID0gMTsKICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIWJtaW5TY2ZWaW9sYXRpb24pIHsKICAgICAgICAgICAvKiBlc3RpbWF0ZSBjaGFuZ2UgaW4gYml0IGRlbWFuZCBmb3IgbmV3IHNjZnMgKi8KLSAgICAgICAgICBkZWx0YVNjZkJpdHMgPSBGREthYWNFbmNfY291bnRTY2ZCaXRzRGlmZihzY2Ysc2NmVG1wLHNmYkNudCxzdGFydFNmYixzdG9wU2ZiKTsKKyAgICAgICAgICBkZWx0YVNjZkJpdHMgPSBGREthYWNFbmNfY291bnRTY2ZCaXRzRGlmZihzY2YsIHNjZlRtcCwgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2ZiLCBzdG9wU2ZiKTsKIAotICAgICAgICAgIGRlbHRhU3BlY1BlID0gRkRLYWFjRW5jX2NhbGNTcGVjUGVEaWZmKHBzeU91dENoYW4sIHFjT3V0Q2hhbm5lbCwgc2NmLCBzY2ZUbXAsIHNmYkNvbnN0UGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRm9ybUZhY3RvckxkRGF0YSwgc2ZiTlJlbGV2YW50TGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNmYiwgc3RvcFNmYik7CisgICAgICAgICAgZGVsdGFTcGVjUGUgPSBGREthYWNFbmNfY2FsY1NwZWNQZURpZmYoCisgICAgICAgICAgICAgIHBzeU91dENoYW4sIHFjT3V0Q2hhbm5lbCwgc2NmLCBzY2ZUbXAsIHNmYkNvbnN0UGVQYXJ0LAorICAgICAgICAgICAgICBzZmJGb3JtRmFjdG9yTGREYXRhLCBzZmJOUmVsZXZhbnRMaW5lcywgc3RhcnRTZmIsIHN0b3BTZmIpOwogCiAgICAgICAgICAgZGVsdGFQZU5ldyA9IGRlbHRhUGUgKyAoRklYUF9EQkwpZGVsdGFTY2ZCaXRzICsgZGVsdGFTcGVjUGU7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBuZXcgYml0IGRlbWFuZCBzbWFsbCBlbm91Z2ggPyAqLwogICAgICAgICBpZiAoIWJtaW5TY2ZWaW9sYXRpb24gJiYgZGVsdGFQZU5ldyA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7Ci0KICAgICAgICAgICAvKiBxdWFudGl6ZSBhbmQgY2FsYyBzdW0gb2YgbmV3IGRpc3RvcnRpb24gKi8KICAgICAgICAgICBkaXN0T2xkU3VtID0gZGlzdE5ld1N1bSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgICAgIGZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKKyAgICAgICAgICBmb3IgKHNmYiA9IHN0YXJ0U2ZiOyBzZmIgPCBzdG9wU2ZiOyBzZmIrKykgewogICAgICAgICAgICAgaWYgKHNjZlRtcFtzZmJdICE9IEZES19JTlRfTUlOKSB7CiAgICAgICAgICAgICAgIGRpc3RPbGRTdW0gKz0gQ2FsY0ludkxkRGF0YShzZmJEaXN0W3NmYl0pID4+IERJU1RfRkFDX1NISUZUOwogCi0gICAgICAgICAgICAgIHNmYkRpc3ROZXdbc2ZiXSA9IEZES2FhY0VuY19jYWxjU2ZiRGlzdChxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bStzZmJPZmZzW3NmYl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNUbXArc2ZiT2Zmc1tzZmJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc1tzZmIrMV0tc2ZiT2Zmc1tzZmJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmTmV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSk7CisgICAgICAgICAgICAgIHNmYkRpc3ROZXdbc2ZiXSA9IEZES2FhY0VuY19jYWxjU2ZiRGlzdCgKKyAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtICsgc2ZiT2Zmc1tzZmJdLAorICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjVG1wICsgc2ZiT2Zmc1tzZmJdLCBzZmJPZmZzW3NmYiArIDFdIC0gc2ZiT2Zmc1tzZmJdLAorICAgICAgICAgICAgICAgICAgc2NmTmV3LCBkWm9uZVF1YW50RW5hYmxlKTsKIAogICAgICAgICAgICAgICBpZiAoc2ZiRGlzdE5ld1tzZmJdID4gcWNPdXRDaGFubmVsLT5zZmJUaHJlc2hvbGRMZERhdGFbc2ZiXSkgewogICAgICAgICAgICAgICAgIC8qIG5vIGltcHJvdmVtZW50LCBza2lwIGZ1cnRoZXIgZGlzdC4gY2FsY3VsYXRpb25zICovCkBAIC05ODYsMTUgKzk2NSwxNSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgICAvKiBkaXN0b3J0aW9uIHNtYWxsZXIgPyAtPiB1c2UgbmV3IHNjYWxlZmFjdG9ycyAqLwotICAgICAgICAgIGlmIChkaXN0TmV3U3VtIDwgZk11bHQoRkwyRlhDT05TVF9EQkwoMC44ZiksZGlzdE9sZFN1bSkpIHsKKyAgICAgICAgICBpZiAoZGlzdE5ld1N1bSA8IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuOGYpLCBkaXN0T2xkU3VtKSkgewogICAgICAgICAgICAgZGVsdGFQZSA9IGRlbHRhUGVOZXc7Ci0gICAgICAgICAgICBmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7CisgICAgICAgICAgICBmb3IgKHNmYiA9IHN0YXJ0U2ZiOyBzZmIgPCBzdG9wU2ZiOyBzZmIrKykgewogICAgICAgICAgICAgICBpZiAoc2NmW3NmYl0gIT0gRkRLX0lOVF9NSU4pIHsKICAgICAgICAgICAgICAgICBzY2Zbc2ZiXSA9IHNjZk5ldzsKICAgICAgICAgICAgICAgICBzZmJEaXN0W3NmYl0gPSBzZmJEaXN0TmV3W3NmYl07CiAKLSAgICAgICAgICAgICAgICBmb3IgKGs9MDsgazxzZmJPZmZzW3NmYisxXS1zZmJPZmZzW3NmYl07IGsrKykKLSAgICAgICAgICAgICAgICAgIHF1YW50U3BlY1tzZmJPZmZzW3NmYl0ra10gPSBxdWFudFNwZWNUbXBbc2ZiT2Zmc1tzZmJdK2tdOworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBzZmJPZmZzW3NmYiArIDFdIC0gc2ZiT2Zmc1tzZmJdOyBrKyspCisgICAgICAgICAgICAgICAgICBxdWFudFNwZWNbc2ZiT2Zmc1tzZmJdICsga10gPSBxdWFudFNwZWNUbXBbc2ZiT2Zmc1tzZmJdICsga107CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICB9CkBAIC0xMDAzLDQzICs5ODIsNDUgQEAKIAogICAgICAgLyogMy4gdHJ5IHRvIGZpbmQgYSBiZXR0ZXIgc29sdXRpb24gKHNhdmUgYml0cykgYnkgb25seSByZWR1Y2luZyB0aGUKICAgICAgICAgIHNjYWxlZmFjdG9yIHdpdGhvdXQgbmV3IHF1YW50aXphdGlvbiAqLwotICAgICAgaWYgKHNjZk1heC1zY2ZNaW4gPD0gTUFYX1NDRl9ERUxUQS0zKSB7IC8qIDMgYmVjLiBzY2YgaXMgcmVkdWNlZCAzIHRpbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZSBmb3IgbG9vcCBiZWxvdyAqLworICAgICAgaWYgKHNjZk1heCAtIHNjZk1pbiA8PQorICAgICAgICAgIE1BWF9TQ0ZfREVMVEEgLSAzKSB7IC8qIDMgYmVjLiBzY2YgaXMgcmVkdWNlZCAzIHRpbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZSBmb3IgbG9vcCBiZWxvdyAqLwogCi0gICAgICAgIGZvciAoaz0wOyBrPHNmYkNudDsgaysrKQotICAgICAgICAgIHNjZlRtcFtrXSA9IHNjZltrXTsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IHNmYkNudDsgaysrKSBzY2ZUbXBba10gPSBzY2Zba107CiAKLSAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgc2NmTmV3ID0gc2NmVG1wW3N0YXJ0U2ZiXS0xOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgc2NmTmV3ID0gc2NmVG1wW3N0YXJ0U2ZiXSAtIDE7CiAgICAgICAgICAgLyogcmVwbGFjZSBzY2ZzIGluIHJlZ2lvbiBieSBzY2ZOZXcgKi8KLSAgICAgICAgICBmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7Ci0gICAgICAgICAgICBpZiAoc2NmVG1wW3NmYl0gIT0gRkRLX0lOVF9NSU4pCi0gICAgICAgICAgICAgIHNjZlRtcFtzZmJdID0gc2NmTmV3OworICAgICAgICAgIGZvciAoc2ZiID0gc3RhcnRTZmI7IHNmYiA8IHN0b3BTZmI7IHNmYisrKSB7CisgICAgICAgICAgICBpZiAoc2NmVG1wW3NmYl0gIT0gRkRLX0lOVF9NSU4pIHNjZlRtcFtzZmJdID0gc2NmTmV3OwogICAgICAgICAgIH0KICAgICAgICAgICAvKiBlc3RpbWF0ZSBjaGFuZ2UgaW4gYml0IGRlbWFuZCBmb3IgbmV3IHNjZnMgKi8KLSAgICAgICAgICBkZWx0YVNjZkJpdHMgPSBGREthYWNFbmNfY291bnRTY2ZCaXRzRGlmZihzY2Ysc2NmVG1wLHNmYkNudCxzdGFydFNmYixzdG9wU2ZiKTsKKyAgICAgICAgICBkZWx0YVNjZkJpdHMgPSBGREthYWNFbmNfY291bnRTY2ZCaXRzRGlmZihzY2YsIHNjZlRtcCwgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2ZiLCBzdG9wU2ZiKTsKICAgICAgICAgICBkZWx0YVBlTmV3ID0gZGVsdGFQZSArIChGSVhQX0RCTClkZWx0YVNjZkJpdHM7CiAgICAgICAgICAgLyogbmV3IGJpdCBkZW1hbmQgc21hbGwgZW5vdWdoID8gKi8KICAgICAgICAgICBpZiAoZGVsdGFQZU5ldyA8PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgewotCiAgICAgICAgICAgICBiU3VjY2VzcyA9IDE7CiAgICAgICAgICAgICBkaXN0T2xkU3VtID0gZGlzdE5ld1N1bSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgICAgICAgZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgeworICAgICAgICAgICAgZm9yIChzZmIgPSBzdGFydFNmYjsgc2ZiIDwgc3RvcFNmYjsgc2ZiKyspIHsKICAgICAgICAgICAgICAgaWYgKHNjZlRtcFtzZmJdICE9IEZES19JTlRfTUlOKSB7CiAgICAgICAgICAgICAgICAgRklYUF9EQkwgc2ZiRW5ROwogICAgICAgICAgICAgICAgIC8qIGNhbGMgdGhlIGVuZXJneSBhbmQgZGlzdG9ydGlvbiBvZiB0aGUgcXVhbnRpemVkIHNwZWN0cnVtIGZvcgogICAgICAgICAgICAgICAgICAgIGEgc21hbGxlciBzY2YgKi8KLSAgICAgICAgICAgICAgICBGREthYWNFbmNfY2FsY1NmYlF1YW50RW5lcmd5QW5kRGlzdChxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bStzZmJPZmZzW3NmYl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWMrc2ZiT2Zmc1tzZmJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc1tzZmIrMV0tc2ZiT2Zmc1tzZmJdLCBzY2ZOZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2ZiRW5RLCAmc2ZiRGlzdE5ld1tzZmJdKTsKKyAgICAgICAgICAgICAgICBGREthYWNFbmNfY2FsY1NmYlF1YW50RW5lcmd5QW5kRGlzdCgKKyAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5tZGN0U3BlY3RydW0gKyBzZmJPZmZzW3NmYl0sCisgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlYyArIHNmYk9mZnNbc2ZiXSwgc2ZiT2Zmc1tzZmIgKyAxXSAtIHNmYk9mZnNbc2ZiXSwKKyAgICAgICAgICAgICAgICAgICAgc2NmTmV3LCAmc2ZiRW5RLCAmc2ZiRGlzdE5ld1tzZmJdKTsKIAogICAgICAgICAgICAgICAgIGRpc3RPbGRTdW0gKz0gQ2FsY0ludkxkRGF0YShzZmJEaXN0W3NmYl0pID4+IERJU1RfRkFDX1NISUZUOwogICAgICAgICAgICAgICAgIGRpc3ROZXdTdW0gKz0gQ2FsY0ludkxkRGF0YShzZmJEaXN0TmV3W3NmYl0pID4+IERJU1RfRkFDX1NISUZUOwogCiAgICAgICAgICAgICAgICAgLyogIDAuMDAyNTk0ODg1NTYxNjcgPSBsZDY0KDEuMTIyZikgKi8KICAgICAgICAgICAgICAgICAvKiAtMC4wMDc3ODcyMjY4NjY1MiA9IGxkNjQoMC43MDc5ZikgKi8KLSAgICAgICAgICAgICAgICBpZiAoKHNmYkRpc3ROZXdbc2ZiXSA+IChzZmJEaXN0W3NmYl0rRkwyRlhDT05TVF9EQkwoMC4wMDI1OTQ4ODU1NjE2N2YpKSkgfHwgKHNmYkVuUSA8IChxY091dENoYW5uZWwtPnNmYkVuZXJneUxkRGF0YVtzZmJdIC0gRkwyRlhDT05TVF9EQkwoMC4wMDc3ODcyMjY4NjY1MmYpKSkpeworICAgICAgICAgICAgICAgIGlmICgoc2ZiRGlzdE5ld1tzZmJdID4KKyAgICAgICAgICAgICAgICAgICAgIChzZmJEaXN0W3NmYl0gKyBGTDJGWENPTlNUX0RCTCgwLjAwMjU5NDg4NTU2MTY3ZikpKSB8fAorICAgICAgICAgICAgICAgICAgICAoc2ZiRW5RIDwgKHFjT3V0Q2hhbm5lbC0+c2ZiRW5lcmd5TGREYXRhW3NmYl0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMDA3Nzg3MjI2ODY2NTJmKSkpKSB7CiAgICAgICAgICAgICAgICAgICBiU3VjY2VzcyA9IDA7CiAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDQ4LDcgKzEwMjksNyBAQAogICAgICAgICAgICAgLyogZGlzdG9ydGlvbiBzbWFsbGVyID8gLT4gdXNlIG5ldyBzY2FsZWZhY3RvcnMgKi8KICAgICAgICAgICAgIGlmIChkaXN0TmV3U3VtIDwgZGlzdE9sZFN1bSAmJiBiU3VjY2VzcykgewogICAgICAgICAgICAgICBkZWx0YVBlID0gZGVsdGFQZU5ldzsKLSAgICAgICAgICAgICAgZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgeworICAgICAgICAgICAgICBmb3IgKHNmYiA9IHN0YXJ0U2ZiOyBzZmIgPCBzdG9wU2ZiOyBzZmIrKykgewogICAgICAgICAgICAgICAgIGlmIChzY2Zbc2ZiXSAhPSBGREtfSU5UX01JTikgewogICAgICAgICAgICAgICAgICAgc2NmW3NmYl0gPSBzY2ZOZXc7CiAgICAgICAgICAgICAgICAgICBzZmJEaXN0W3NmYl0gPSBzZmJEaXN0TmV3W3NmYl07CkBAIC0xMDYwLDIwICsxMDQxLDEzIEBACiAgICAgICB9CiAgICAgfQogICB9IHdoaWxlIChzdG9wU2ZiIDw9IHNmYkNudCk7Ci0KIH0KIAotc3RhdGljIHZvaWQKLUZES2FhY0VuY19GREthYWNFbmNfRXN0aW1hdGVTY2FsZUZhY3RvcnNDaGFubmVsKFFDX09VVF9DSEFOTkVMICAgKnFjT3V0Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgICpwc3lPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqUkVTVFJJQ1Qgc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqUkVTVFJJQ1QgZ2xvYmFsR2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgc2ZiRm9ybUZhY3RvckxkRGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICxjb25zdCBJTlQgaW52UXVhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKlJFU1RSSUNUIHF1YW50U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZFpvbmVRdWFudEVuYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19Fc3RpbWF0ZVNjYWxlRmFjdG9yc0NoYW5uZWwoCisgICAgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbm5lbCwgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFubmVsLAorICAgIElOVCAqUkVTVFJJQ1Qgc2NmLCBJTlQgKlJFU1RSSUNUIGdsb2JhbEdhaW4sCisgICAgRklYUF9EQkwgKlJFU1RSSUNUIHNmYkZvcm1GYWN0b3JMZERhdGEsIGNvbnN0IElOVCBpbnZRdWFudCwKKyAgICBTSE9SVCAqUkVTVFJJQ1QgcXVhbnRTcGVjLCBjb25zdCBJTlQgZFpvbmVRdWFudEVuYWJsZSkgewogICBJTlQgaSwgaiwgc2ZiLCBzZmJPZmZzOwogICBJTlQgc2NmSW50OwogICBJTlQgbWF4U2Y7CkBAIC0xMDg0LDQ2ICsxMDU4LDQ1IEBACiAgIEZJWFBfREJMIHRocmVzaG9sZFBhcnRMZERhdGE7CiAgIEZJWFBfREJMIHNjZkZyYWN0OwogICBGSVhQX0RCTCBtYXhTcGVjOwotICBGSVhQX0RCTCBhYnNTcGVjOwogICBJTlQgbWluU2NmQ2FsY3VsYXRlZFtNQVhfR1JPVVBFRF9TRkJdOwogICBGSVhQX0RCTCBzZmJEaXN0TGREYXRhW01BWF9HUk9VUEVEX1NGQl07Ci0gIENfQUxMT0NfU0NSQVRDSF9TVEFSVChxdWFudFNwZWNUbXAsIFNIT1JULCAoMTAyNCkpOworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocXVhbnRTcGVjVG1wLCBTSE9SVCwgKDEwMjQpKQogICBJTlQgbWluU2ZNYXhRdWFudFtNQVhfR1JPVVBFRF9TRkJdOwogCi0gIEZJWFBfREJMIHRocmVzaENvbnN0TGREYXRhPUZMMkZYQ09OU1RfREJMKDAuMDQzMDQ1MTE3MjJmKTsgLyogbG9nMTAoNi43NSkvbG9nMTAoMi4wKS82NC4wICovCi0gIEZJWFBfREJMIGNvbnZDb25zdD1GTDJGWENPTlNUX0RCTCgwLjMwMTAyOTk5NTY2Zik7IC8qIGxvZzEwKDIuMCkgKi8KLSAgRklYUF9EQkwgYzFDb25zdD1GTDJGWENPTlNUX0RCTCgtMC4yNzA4MzE4MzU5NGYpOyAvKiBDMSA9IC02OS4zMzI5NSA9PiBDMS8yXjggKi8KKyAgRklYUF9EQkwgdGhyZXNoQ29uc3RMZERhdGEgPQorICAgICAgRkwyRlhDT05TVF9EQkwoMC4wNDMwNDUxMTcyMmYpOyAvKiBsb2cxMCg2Ljc1KS9sb2cxMCgyLjApLzY0LjAgKi8KKyAgRklYUF9EQkwgY29udkNvbnN0ID0gRkwyRlhDT05TVF9EQkwoMC4zMDEwMjk5OTU2NmYpOyAvKiBsb2cxMCgyLjApICovCisgIEZJWFBfREJMIGMxQ29uc3QgPQorICAgICAgRkwyRlhDT05TVF9EQkwoLTAuMjcwODMxODM1OTRmKTsgLyogQzEgPSAtNjkuMzMyOTUgPT4gQzEvMl44ICovCiAKLQotCi0gIGlmIChpbnZRdWFudD4wKSB7Ci0gICAgRkRLbWVtY2xlYXIocXVhbnRTcGVjLCAoMTAyNCkqc2l6ZW9mKFNIT1JUKSk7CisgIGlmIChpbnZRdWFudCA+IDApIHsKKyAgICBGREttZW1jbGVhcihxdWFudFNwZWMsICgxMDI0KSAqIHNpemVvZihTSE9SVCkpOwogICB9CiAKICAgLyogc2NmcyB3aXRob3V0IGVuZXJneSBvciB3aXRoIHRocmVzaD5lbmVyZ3kgYXJlIG1hcmtlZCB3aXRoIEZES19JTlRfTUlOICovCi0gIGZvcihpPTA7IGk8cHN5T3V0Q2hhbm5lbC0+c2ZiQ250OyBpKyspIHsKKyAgZm9yIChpID0gMDsgaSA8IHBzeU91dENoYW5uZWwtPnNmYkNudDsgaSsrKSB7CiAgICAgc2NmW2ldID0gRkRLX0lOVF9NSU47CiAgIH0KIAotICBmb3IgKGk9MDsgaTxNQVhfR1JPVVBFRF9TRkI7IGkrKykgeworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0dST1VQRURfU0ZCOyBpKyspIHsKICAgICBtaW5TZk1heFF1YW50W2ldID0gRkRLX0lOVF9NSU47CiAgIH0KIAotICBmb3IgKHNmYk9mZnM9MDsgc2ZiT2Zmczxwc3lPdXRDaGFubmVsLT5zZmJDbnQ7IHNmYk9mZnMrPXBzeU91dENoYW5uZWwtPnNmYlBlckdyb3VwKSB7Ci0gICAgZm9yKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbm5lbC0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgIGZvciAoc2ZiT2ZmcyA9IDA7IHNmYk9mZnMgPCBwc3lPdXRDaGFubmVsLT5zZmJDbnQ7CisgICAgICAgc2ZiT2ZmcyArPSBwc3lPdXRDaGFubmVsLT5zZmJQZXJHcm91cCkgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5T3V0Q2hhbm5lbC0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICB0aHJlc2hMZERhdGEgPSBxY091dENoYW5uZWwtPnNmYlRocmVzaG9sZExkRGF0YVtzZmJPZmZzICsgc2ZiXTsKKyAgICAgIGVuZXJneUxkRGF0YSA9IHFjT3V0Q2hhbm5lbC0+c2ZiRW5lcmd5TGREYXRhW3NmYk9mZnMgKyBzZmJdOwogCi0gICAgICB0aHJlc2hMZERhdGEgPSBxY091dENoYW5uZWwtPnNmYlRocmVzaG9sZExkRGF0YVtzZmJPZmZzK3NmYl07Ci0gICAgICBlbmVyZ3lMZERhdGEgPSBxY091dENoYW5uZWwtPnNmYkVuZXJneUxkRGF0YVtzZmJPZmZzK3NmYl07Ci0KLSAgICAgIHNmYkRpc3RMZERhdGFbc2ZiT2ZmcytzZmJdID0gZW5lcmd5TGREYXRhOwotCisgICAgICBzZmJEaXN0TGREYXRhW3NmYk9mZnMgKyBzZmJdID0gZW5lcmd5TGREYXRhOwogCiAgICAgICBpZiAoZW5lcmd5TGREYXRhID4gdGhyZXNoTGREYXRhKSB7CiAgICAgICAgIEZJWFBfREJMIHRtcDsKIAogICAgICAgICAvKiBlbmVyZ3lQYXJ0ID0gKGZsb2F0KWxvZzEwKHNmYkZvcm1GYWN0b3Jbc2ZiT2ZmcytzZmJdKTsgKi8KICAgICAgICAgLyogMC4wOTM3NWYgPSBsb2coNjQuMCkvbG9nKDIuMCkvNjQuMCA9IHNjYWxlIG9mIHNmYkZvcm1GYWN0b3JMZERhdGEgKi8KLSAgICAgICAgZW5lcmd5UGFydExkRGF0YSA9IHNmYkZvcm1GYWN0b3JMZERhdGFbc2ZiT2ZmcytzZmJdICsgRkwyRlhDT05TVF9EQkwoMC4wOTM3NWYpOworICAgICAgICBlbmVyZ3lQYXJ0TGREYXRhID0KKyAgICAgICAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGFbc2ZiT2ZmcyArIHNmYl0gKyBGTDJGWENPTlNUX0RCTCgwLjA5Mzc1Zik7CiAKICAgICAgICAgLyogaW5mbHVlbmNlIG9mIGFsbG93ZWQgZGlzdG9ydGlvbiAqLwogICAgICAgICAvKiB0aHJlc2hvbGRQYXJ0ID0gKGZsb2F0KWxvZzEwKDYuNzUqdGhyZXNoK0ZMVF9NSU4pOyAqLwpAQCAtMTEzMywxNjUgKzExMDYsMTY2IEBACiAgICAgICAgIC8qIHNjZkZsb2F0ID0gOC44NTg1ZiAqICh0aHJlc2hvbGRQYXJ0IC0gZW5lcmd5UGFydCk7ICovCiAgICAgICAgIHNjZkZyYWN0ID0gdGhyZXNob2xkUGFydExkRGF0YSAtIGVuZXJneVBhcnRMZERhdGE7CiAgICAgICAgIC8qIGNvbnZlcnNpb24gZnJvbSBsb2cyIHRvIGxvZzEwICovCi0gICAgICAgIHNjZkZyYWN0ID0gZk11bHQoY29udkNvbnN0LHNjZkZyYWN0KTsKKyAgICAgICAgc2NmRnJhY3QgPSBmTXVsdChjb252Q29uc3QsIHNjZkZyYWN0KTsKICAgICAgICAgLyogKDguODU4NWYgKiBzY2ZGcmFjdCkvOCA9IDgvOCAqIHNjZkZyYWN0ICsgMC44NTg1ICogc2NmRnJhY3QvOCAqLwotICAgICAgICBzY2ZGcmFjdCA9IHNjZkZyYWN0ICsgZk11bHQoRkwyRlhDT05TVF9EQkwoMC44NTg1Ziksc2NmRnJhY3QgPj4gMyk7CisgICAgICAgIHNjZkZyYWN0ID0gc2NmRnJhY3QgKyBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjg1ODVmKSwgc2NmRnJhY3QgPj4gMyk7CiAKICAgICAgICAgLyogaW50ZWdlciBzY2FsZWZhY3RvciAqLwogICAgICAgICAvKiBzY2ZJbnQgPSAoaW50KWZsb29yKHNjZkZsb2F0KTsgKi8KLSAgICAgICAgc2NmSW50ID0gKElOVCkoc2NmRnJhY3Q+PigoREZSQUNUX0JJVFMtMSktMy1MRF9EQVRBX1NISUZUKSk7IC8qIDMgYml0cyA9PiBzY2ZGcmFjdC84LjA7IDYgYml0cyA9PiBsZDY0ICovCisgICAgICAgIHNjZkludCA9CisgICAgICAgICAgICAoSU5UKShzY2ZGcmFjdCA+PgorICAgICAgICAgICAgICAgICAgKChERlJBQ1RfQklUUyAtIDEpIC0gMyAtCisgICAgICAgICAgICAgICAgICAgTERfREFUQV9TSElGVCkpOyAvKiAzIGJpdHMgPT4gc2NmRnJhY3QvOC4wOyA2IGJpdHMgPT4gbGQ2NCAqLwogCiAgICAgICAgIC8qIG1heGltdW0gb2Ygc3BlY3RydW0gKi8KICAgICAgICAgbWF4U3BlYyA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogCi0gICAgICAgIGZvcihqPXBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmJdOyBqPHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmIrMV07IGorKyApewotICAgICAgICAgIGFic1NwZWMgPSBmaXhwX2FicyhxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bVtqXSk7Ci0gICAgICAgICAgbWF4U3BlYyA9IChhYnNTcGVjID4gbWF4U3BlYykgPyBhYnNTcGVjIDogbWF4U3BlYzsKKyAgICAgICAgLyogVW5yb2xsIGJ5IDQsIGFsbG93IGR1YWwgbWVtb3J5IGFjY2VzcyAqLworICAgICAgICBEV09SRF9BTElHTkVEKHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtKTsKKyAgICAgICAgZm9yIChqID0gcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzICsgc2ZiXTsKKyAgICAgICAgICAgICBqIDwgcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzICsgc2ZiICsgMV07IGogKz0gNCkgeworICAgICAgICAgIG1heFNwZWMgPSBmTWF4KG1heFNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZk1heChmTWF4KGZBYnMocWNPdXRDaGFubmVsLT5tZGN0U3BlY3RydW1baiArIDBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkFicyhxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bVtqICsgMV0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNYXgoZkFicyhxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bVtqICsgMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQWJzKHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtW2ogKyAzXSkpKSk7CiAgICAgICAgIH0KLQogICAgICAgICAvKiBsb3dlciBzY2YgbGltaXQgdG8gYXZvaWQgcXVhbnRpemVkIHZhbHVlcyBiaWdnZXIgdGhhbiBNQVhfUVVBTlQgKi8KICAgICAgICAgLyogQzEgPSAtNjkuMzMyOTVmLCBDMiA9IDUuNzcwNzhmID0gNC9sb2coMikgKi8KICAgICAgICAgLyogbWluU2ZNYXhRdWFudFtzZmJPZmZzK3NmYl0gPSAoaW50KWNlaWwoQzEgKyBDMipsb2cobWF4U3BlYykpOyAqLwotICAgICAgICAvKiBDMS8yXjggKyA0L2xvZygyLjApKmxvZyhtYXhTcGVjKS8yXjggID0+IEMxLzJeOCArIGxvZyhtYXhTcGVjKS9sb2coMi4wKSo0LzJeOCA9PiBDMS8yXjggKyBsb2cobWF4U3BlYykvbG9nKDIuMCkvNjQuMCAqLworICAgICAgICAvKiBDMS8yXjggKyA0L2xvZygyLjApKmxvZyhtYXhTcGVjKS8yXjggID0+IEMxLzJeOCArCisgICAgICAgICAqIGxvZyhtYXhTcGVjKS9sb2coMi4wKSo0LzJeOCA9PiBDMS8yXjggKyBsb2cobWF4U3BlYykvbG9nKDIuMCkvNjQuMCAqLwogCi0gICAgICAgIC8vbWluU2ZNYXhRdWFudFtzZmJPZmZzK3NmYl0gPSAoKElOVCkgKChjMUNvbnN0ICsgQ2FsY0xkRGF0YShtYXhTcGVjKSkgPj4gKChERlJBQ1RfQklUUy0xKS04KSkpICsgMTsKKyAgICAgICAgLy8gbWluU2ZNYXhRdWFudFtzZmJPZmZzK3NmYl0gPSAoKElOVCkgKChjMUNvbnN0ICsgQ2FsY0xkRGF0YShtYXhTcGVjKSkKKyAgICAgICAgLy8gPj4gKChERlJBQ1RfQklUUy0xKS04KSkpICsgMTsKICAgICAgICAgdG1wID0gQ2FsY0xkRGF0YShtYXhTcGVjKTsKLSAgICAgICAgaWYgKGMxQ29uc3Q+RkwyRlhDT05TVF9EQkwoLTEuZiktdG1wKSB7Ci0gICAgICAgICAgbWluU2ZNYXhRdWFudFtzZmJPZmZzK3NmYl0gPSAoKElOVCkgKChjMUNvbnN0ICsgdG1wKSA+PiAoKERGUkFDVF9CSVRTLTEpLTgpKSkgKyAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIG1pblNmTWF4UXVhbnRbc2ZiT2ZmcytzZmJdID0gKChJTlQpIChGTDJGWENPTlNUX0RCTCgtMS5mKSA+PiAoKERGUkFDVF9CSVRTLTEpLTgpKSkgKyAxOworICAgICAgICBpZiAoYzFDb25zdCA+IEZMMkZYQ09OU1RfREJMKC0xLmYpIC0gdG1wKSB7CisgICAgICAgICAgbWluU2ZNYXhRdWFudFtzZmJPZmZzICsgc2ZiXSA9CisgICAgICAgICAgICAgICgoSU5UKSgoYzFDb25zdCArIHRtcCkgPj4gKChERlJBQ1RfQklUUyAtIDEpIC0gOCkpKSArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbWluU2ZNYXhRdWFudFtzZmJPZmZzICsgc2ZiXSA9CisgICAgICAgICAgICAgICgoSU5UKShGTDJGWENPTlNUX0RCTCgtMS5mKSA+PiAoKERGUkFDVF9CSVRTIC0gMSkgLSA4KSkpICsgMTsKICAgICAgICAgfQogCi0gICAgICAgIHNjZkludCA9IGZpeE1heChzY2ZJbnQsIG1pblNmTWF4UXVhbnRbc2ZiT2ZmcytzZmJdKTsKLQorICAgICAgICBzY2ZJbnQgPSBmaXhNYXgoc2NmSW50LCBtaW5TZk1heFF1YW50W3NmYk9mZnMgKyBzZmJdKTsKIAogICAgICAgICAvKiBmaW5kIGJldHRlciBzY2FsZWZhY3RvciB3aXRoIGFuYWx5c2lzIGJ5IHN5bnRoZXNpcyAqLwotICAgICAgICBpZiAoaW52UXVhbnQ+MCkgewotICAgICAgICAgIHNjZkludCA9IEZES2FhY0VuY19pbXByb3ZlU2NmKHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtK3BzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjK3BzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjVG1wK3BzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzK3NmYisxXS1wc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaExkRGF0YSwgc2NmSW50LCBtaW5TZk1heFF1YW50W3NmYk9mZnMrc2ZiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZmJEaXN0TGREYXRhW3NmYk9mZnMrc2ZiXSwgJm1pblNjZkNhbGN1bGF0ZWRbc2ZiT2ZmcytzZmJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKGludlF1YW50ID4gMCkgeworICAgICAgICAgIHNjZkludCA9IEZES2FhY0VuY19pbXByb3ZlU2NmKAorICAgICAgICAgICAgICBxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bSArCisgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMgKyBzZmJdLAorICAgICAgICAgICAgICBxdWFudFNwZWMgKyBwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMgKyBzZmJdLAorICAgICAgICAgICAgICBxdWFudFNwZWNUbXAgKyBwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMgKyBzZmJdLAorICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMgKyBzZmIgKyAxXSAtCisgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMgKyBzZmJdLAorICAgICAgICAgICAgICB0aHJlc2hMZERhdGEsIHNjZkludCwgbWluU2ZNYXhRdWFudFtzZmJPZmZzICsgc2ZiXSwKKyAgICAgICAgICAgICAgJnNmYkRpc3RMZERhdGFbc2ZiT2ZmcyArIHNmYl0sICZtaW5TY2ZDYWxjdWxhdGVkW3NmYk9mZnMgKyBzZmJdLAorICAgICAgICAgICAgICBkWm9uZVF1YW50RW5hYmxlKTsKICAgICAgICAgfQotICAgICAgICBzY2Zbc2ZiT2ZmcytzZmJdID0gc2NmSW50OworICAgICAgICBzY2Zbc2ZiT2ZmcyArIHNmYl0gPSBzY2ZJbnQ7CiAgICAgICB9CiAgICAgfQogICB9CiAKLQotICBpZiAoaW52UXVhbnQ+MSkgeworICBpZiAoaW52UXVhbnQgPiAwKSB7CiAgICAgLyogdHJ5IHRvIGRlY3JlYXNlIHNjZiBkaWZmZXJlbmNlcyAqLwogICAgIEZJWFBfREJMIHNmYkNvbnN0UGVQYXJ0W01BWF9HUk9VUEVEX1NGQl07CiAgICAgRklYUF9EQkwgc2ZiTlJlbGV2YW50TGluZXNbTUFYX0dST1VQRURfU0ZCXTsKIAotICAgIGZvciAoaT0wOyBpPHBzeU91dENoYW5uZWwtPnNmYkNudDsgaSsrKQorICAgIGZvciAoaSA9IDA7IGkgPCBwc3lPdXRDaGFubmVsLT5zZmJDbnQ7IGkrKykKICAgICAgIHNmYkNvbnN0UGVQYXJ0W2ldID0gKEZJWFBfREJMKUZES19JTlRfTUlOOwogCi0gICAgRkRLYWFjRW5jX2NhbGNTZmJSZWxldmFudExpbmVzKCBzZmJGb3JtRmFjdG9yTGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPnNmYkVuZXJneUxkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5zZmJUaHJlc2hvbGRMZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWwtPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbC0+c2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWwtPm1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJOUmVsZXZhbnRMaW5lcyk7CisgICAgRkRLYWFjRW5jX2NhbGNTZmJSZWxldmFudExpbmVzKAorICAgICAgICBzZmJGb3JtRmFjdG9yTGREYXRhLCBxY091dENoYW5uZWwtPnNmYkVuZXJneUxkRGF0YSwKKyAgICAgICAgcWNPdXRDaGFubmVsLT5zZmJUaHJlc2hvbGRMZERhdGEsIHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHMsCisgICAgICAgIHBzeU91dENoYW5uZWwtPnNmYkNudCwgcHN5T3V0Q2hhbm5lbC0+c2ZiUGVyR3JvdXAsCisgICAgICAgIHBzeU91dENoYW5uZWwtPm1heFNmYlBlckdyb3VwLCBzZmJOUmVsZXZhbnRMaW5lcyk7CiAKKyAgICBGREthYWNFbmNfYXNzaW1pbGF0ZVNpbmdsZVNjZigKKyAgICAgICAgcHN5T3V0Q2hhbm5lbCwgcWNPdXRDaGFubmVsLCBxdWFudFNwZWMsIHF1YW50U3BlY1RtcCwgZFpvbmVRdWFudEVuYWJsZSwKKyAgICAgICAgc2NmLCBtaW5TZk1heFF1YW50LCBzZmJEaXN0TGREYXRhLCBzZmJDb25zdFBlUGFydCwgc2ZiRm9ybUZhY3RvckxkRGF0YSwKKyAgICAgICAgc2ZiTlJlbGV2YW50TGluZXMsIG1pblNjZkNhbGN1bGF0ZWQsIDEpOwogCi0gICAgRkRLYWFjRW5jX2Fzc2ltaWxhdGVTaW5nbGVTY2YocHN5T3V0Q2hhbm5lbCwgcWNPdXRDaGFubmVsLCBxdWFudFNwZWMsIHF1YW50U3BlY1RtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5TZk1heFF1YW50LCBzZmJEaXN0TGREYXRhLCBzZmJDb25zdFBlUGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGEsIHNmYk5SZWxldmFudExpbmVzLCBtaW5TY2ZDYWxjdWxhdGVkLCAxKTsKKyAgICBpZiAoaW52UXVhbnQgPiAxKSB7CisgICAgICBGREthYWNFbmNfYXNzaW1pbGF0ZU11bHRpcGxlU2NmKAorICAgICAgICAgIHBzeU91dENoYW5uZWwsIHFjT3V0Q2hhbm5lbCwgcXVhbnRTcGVjLCBxdWFudFNwZWNUbXAsCisgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSwgc2NmLCBtaW5TZk1heFF1YW50LCBzZmJEaXN0TGREYXRhLCBzZmJDb25zdFBlUGFydCwKKyAgICAgICAgICBzZmJGb3JtRmFjdG9yTGREYXRhLCBzZmJOUmVsZXZhbnRMaW5lcyk7CiAKLSAgICBpZihpbnZRdWFudCA+IDEpIHsKLSAgICAgIEZES2FhY0VuY19hc3NpbWlsYXRlTXVsdGlwbGVTY2YocHN5T3V0Q2hhbm5lbCwgcWNPdXRDaGFubmVsLCBxdWFudFNwZWMsIHF1YW50U3BlY1RtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5TZk1heFF1YW50LCBzZmJEaXN0TGREYXRhLCBzZmJDb25zdFBlUGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGEsIHNmYk5SZWxldmFudExpbmVzKTsKLQotICAgICAgRkRLYWFjRW5jX2Fzc2ltaWxhdGVNdWx0aXBsZVNjZihwc3lPdXRDaGFubmVsLCBxY091dENoYW5uZWwsIHF1YW50U3BlYywgcXVhbnRTcGVjVG1wLAotICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pblNmTWF4UXVhbnQsIHNmYkRpc3RMZERhdGEsIHNmYkNvbnN0UGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRm9ybUZhY3RvckxkRGF0YSwgc2ZiTlJlbGV2YW50TGluZXMpOwotCi0KLSAgICAgIEZES2FhY0VuY19GREthYWNFbmNfYXNzaW1pbGF0ZU11bHRpcGxlU2NmMihwc3lPdXRDaGFubmVsLCBxY091dENoYW5uZWwsIHF1YW50U3BlYywgcXVhbnRTcGVjVG1wLAotICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pblNmTWF4UXVhbnQsIHNmYkRpc3RMZERhdGEsIHNmYkNvbnN0UGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRm9ybUZhY3RvckxkRGF0YSwgc2ZiTlJlbGV2YW50TGluZXMpOworICAgICAgRkRLYWFjRW5jX0ZES2FhY0VuY19hc3NpbWlsYXRlTXVsdGlwbGVTY2YyKAorICAgICAgICAgIHBzeU91dENoYW5uZWwsIHFjT3V0Q2hhbm5lbCwgcXVhbnRTcGVjLCBxdWFudFNwZWNUbXAsCisgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSwgc2NmLCBtaW5TZk1heFF1YW50LCBzZmJEaXN0TGREYXRhLCBzZmJDb25zdFBlUGFydCwKKyAgICAgICAgICBzZmJGb3JtRmFjdG9yTGREYXRhLCBzZmJOUmVsZXZhbnRMaW5lcyk7CiAgICAgfQogICB9CiAKLQogICAvKiBnZXQgbWluIHNjYWxlZmFjICovCiAgIG1pblNmID0gRkRLX0lOVF9NQVg7Ci0gIGZvciAoc2ZiT2Zmcz0wOyBzZmJPZmZzPHBzeU91dENoYW5uZWwtPnNmYkNudDsgc2ZiT2Zmcys9cHN5T3V0Q2hhbm5lbC0+c2ZiUGVyR3JvdXApIHsKKyAgZm9yIChzZmJPZmZzID0gMDsgc2ZiT2ZmcyA8IHBzeU91dENoYW5uZWwtPnNmYkNudDsKKyAgICAgICBzZmJPZmZzICs9IHBzeU91dENoYW5uZWwtPnNmYlBlckdyb3VwKSB7CiAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lPdXRDaGFubmVsLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgIGlmIChzY2Zbc2ZiT2ZmcytzZmJdIT1GREtfSU5UX01JTikKLSAgICAgICAgbWluU2YgPSBmaXhNaW4obWluU2Ysc2NmW3NmYk9mZnMrc2ZiXSk7CisgICAgICBpZiAoc2NmW3NmYk9mZnMgKyBzZmJdICE9IEZES19JTlRfTUlOKQorICAgICAgICBtaW5TZiA9IGZpeE1pbihtaW5TZiwgc2NmW3NmYk9mZnMgKyBzZmJdKTsKICAgICB9CiAgIH0KIAogICAvKiBsaW1pdCBzY2YgZGVsdGEgKi8KLSAgZm9yIChzZmJPZmZzPTA7IHNmYk9mZnM8cHN5T3V0Q2hhbm5lbC0+c2ZiQ250OyBzZmJPZmZzKz1wc3lPdXRDaGFubmVsLT5zZmJQZXJHcm91cCkgeworICBmb3IgKHNmYk9mZnMgPSAwOyBzZmJPZmZzIDwgcHN5T3V0Q2hhbm5lbC0+c2ZiQ250OworICAgICAgIHNmYk9mZnMgKz0gcHN5T3V0Q2hhbm5lbC0+c2ZiUGVyR3JvdXApIHsKICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeU91dENoYW5uZWwtPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgaWYgKChzY2Zbc2ZiT2ZmcytzZmJdICE9IEZES19JTlRfTUlOKSAmJiAobWluU2YrTUFYX1NDRl9ERUxUQSkgPCBzY2Zbc2ZiT2ZmcytzZmJdKSB7Ci0gICAgICAgIHNjZltzZmJPZmZzK3NmYl0gPSBtaW5TZiArIE1BWF9TQ0ZfREVMVEE7CisgICAgICBpZiAoKHNjZltzZmJPZmZzICsgc2ZiXSAhPSBGREtfSU5UX01JTikgJiYKKyAgICAgICAgICAobWluU2YgKyBNQVhfU0NGX0RFTFRBKSA8IHNjZltzZmJPZmZzICsgc2ZiXSkgeworICAgICAgICBzY2Zbc2ZiT2ZmcyArIHNmYl0gPSBtaW5TZiArIE1BWF9TQ0ZfREVMVEE7CiAgICAgICAgIGlmIChpbnZRdWFudCA+IDApIHsgLyogY2hhbmdlZCBiYW5kcyBuZWVkIHRvIGJlIHF1YW50aXplZCBhZ2FpbiAqLwotICAgICAgICAgIHNmYkRpc3RMZERhdGFbc2ZiT2ZmcytzZmJdID0KLSAgICAgICAgICAgICAgIEZES2FhY0VuY19jYWxjU2ZiRGlzdChxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bStwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWMrcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzK3NmYl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzK3NmYisxXS1wc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2Zbc2ZiT2ZmcytzZmJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgIHNmYkRpc3RMZERhdGFbc2ZiT2ZmcyArIHNmYl0gPSBGREthYWNFbmNfY2FsY1NmYkRpc3QoCisgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtICsKKyAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcyArIHNmYl0sCisgICAgICAgICAgICAgIHF1YW50U3BlYyArIHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcyArIHNmYl0sCisgICAgICAgICAgICAgIHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcyArIHNmYiArIDFdIC0KKyAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcyArIHNmYl0sCisgICAgICAgICAgICAgIHNjZltzZmJPZmZzICsgc2ZiXSwgZFpvbmVRdWFudEVuYWJsZSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KIAotCiAgIC8qIGdldCBtYXggc2NhbGVmYWMgZm9yIGdsb2JhbCBnYWluICovCiAgIG1heFNmID0gRkRLX0lOVF9NSU47Ci0gIGZvciAoc2ZiT2Zmcz0wOyBzZmJPZmZzPHBzeU91dENoYW5uZWwtPnNmYkNudDsgc2ZiT2Zmcys9cHN5T3V0Q2hhbm5lbC0+c2ZiUGVyR3JvdXApIHsKKyAgZm9yIChzZmJPZmZzID0gMDsgc2ZiT2ZmcyA8IHBzeU91dENoYW5uZWwtPnNmYkNudDsKKyAgICAgICBzZmJPZmZzICs9IHBzeU91dENoYW5uZWwtPnNmYlBlckdyb3VwKSB7CiAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lPdXRDaGFubmVsLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgIG1heFNmID0gZml4TWF4KG1heFNmLHNjZltzZmJPZmZzK3NmYl0pOworICAgICAgbWF4U2YgPSBmaXhNYXgobWF4U2YsIHNjZltzZmJPZmZzICsgc2ZiXSk7CiAgICAgfQogICB9CiAKICAgLyogY2FsYyBsb29wIHNjYWxlZmFjdG9ycywgaWYgc3BlYyBpcyBub3QgYWxsIHplcm8gKGkuZS4gbWF4U2YgPT0gLTk5KSAqLwotICBpZiggbWF4U2YgPiBGREtfSU5UX01JTiApIHsKKyAgaWYgKG1heFNmID4gRkRLX0lOVF9NSU4pIHsKICAgICAqZ2xvYmFsR2FpbiA9IG1heFNmOwotICAgIGZvciAoc2ZiT2Zmcz0wOyBzZmJPZmZzPHBzeU91dENoYW5uZWwtPnNmYkNudDsgc2ZiT2Zmcys9cHN5T3V0Q2hhbm5lbC0+c2ZiUGVyR3JvdXApIHsKKyAgICBmb3IgKHNmYk9mZnMgPSAwOyBzZmJPZmZzIDwgcHN5T3V0Q2hhbm5lbC0+c2ZiQ250OworICAgICAgICAgc2ZiT2ZmcyArPSBwc3lPdXRDaGFubmVsLT5zZmJQZXJHcm91cCkgewogICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lPdXRDaGFubmVsLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgICAgaWYoIHNjZltzZmJPZmZzK3NmYl0gPT0gRkRLX0lOVF9NSU4gKSB7Ci0gICAgICAgICAgc2NmW3NmYk9mZnMrc2ZiXSA9IDA7CisgICAgICAgIGlmIChzY2Zbc2ZiT2ZmcyArIHNmYl0gPT0gRkRLX0lOVF9NSU4pIHsKKyAgICAgICAgICBzY2Zbc2ZiT2ZmcyArIHNmYl0gPSAwOwogICAgICAgICAgIC8qIHNldCBiYW5kIGV4cGxpY2l0ZWx5IHRvIHplcm8gKi8KLSAgICAgICAgICBmb3Ioaj1wc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiXTsgajxwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiKzFdOyBqKysgKSB7CisgICAgICAgICAgZm9yIChqID0gcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzICsgc2ZiXTsKKyAgICAgICAgICAgICAgIGogPCBwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMgKyBzZmIgKyAxXTsgaisrKSB7CiAgICAgICAgICAgICBxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bVtqXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBzY2Zbc2ZiT2ZmcytzZmJdID0gbWF4U2YgLSBzY2Zbc2ZiT2ZmcytzZmJdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNjZltzZmJPZmZzICsgc2ZiXSA9IG1heFNmIC0gc2NmW3NmYk9mZnMgKyBzZmJdOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICB9Ci0gIGVsc2V7CisgIH0gZWxzZSB7CiAgICAgKmdsb2JhbEdhaW4gPSAwOwogICAgIC8qIHNldCBzcGVjdHJ1bSBleHBsaWNpdGVseSB0byB6ZXJvICovCi0gICAgZm9yIChzZmJPZmZzPTA7IHNmYk9mZnM8cHN5T3V0Q2hhbm5lbC0+c2ZiQ250OyBzZmJPZmZzKz1wc3lPdXRDaGFubmVsLT5zZmJQZXJHcm91cCkgeworICAgIGZvciAoc2ZiT2ZmcyA9IDA7IHNmYk9mZnMgPCBwc3lPdXRDaGFubmVsLT5zZmJDbnQ7CisgICAgICAgICBzZmJPZmZzICs9IHBzeU91dENoYW5uZWwtPnNmYlBlckdyb3VwKSB7CiAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeU91dENoYW5uZWwtPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgICBzY2Zbc2ZiT2ZmcytzZmJdID0gMDsKKyAgICAgICAgc2NmW3NmYk9mZnMgKyBzZmJdID0gMDsKICAgICAgICAgLyogc2V0IGJhbmQgZXhwbGljaXRlbHkgdG8gemVybyAqLwotICAgICAgICBmb3Ioaj1wc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiXTsgajxwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiKzFdOyBqKysgKSB7CisgICAgICAgIGZvciAoaiA9IHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcyArIHNmYl07CisgICAgICAgICAgICAgaiA8IHBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcyArIHNmYiArIDFdOyBqKyspIHsKICAgICAgICAgICBxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bVtqXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgICB9CiAgICAgICB9CkBAIC0xMjk5LDMyICsxMjczLDIwIEBACiAgIH0KIAogICAvKiBmcmVlIHF1YW50U3BlY1RtcCBmcm9tIHNjcmF0Y2ggKi8KLSAgQ19BTExPQ19TQ1JBVENIX0VORChxdWFudFNwZWNUbXAsIFNIT1JULCAoMTAyNCkpOwotCi0KKyAgQ19BTExPQ19TQ1JBVENIX0VORChxdWFudFNwZWNUbXAsIFNIT1JULCAoMTAyNCkpCiB9CiAKLXZvaWQKLUZES2FhY0VuY19Fc3RpbWF0ZVNjYWxlRmFjdG9ycyhQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5uZWxbXSwKLSAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoYW5uZWxbXSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbnZRdWFudCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBkWm9uZVF1YW50RW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG5DaGFubmVscykKLXsKK3ZvaWQgRkRLYWFjRW5jX0VzdGltYXRlU2NhbGVGYWN0b3JzKFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbm5lbFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgKnFjT3V0Q2hhbm5lbFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGludlF1YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGRab25lUXVhbnRFbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkNoYW5uZWxzKSB7CiAgIGludCBjaDsKIAotICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCi0gIHsKLSAgICAgIEZES2FhY0VuY19GREthYWNFbmNfRXN0aW1hdGVTY2FsZUZhY3RvcnNDaGFubmVsKHFjT3V0Q2hhbm5lbFtjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+c2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dENoYW5uZWxbY2hdLT5nbG9iYWxHYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkZvcm1GYWN0b3JMZERhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsaW52UXVhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+cXVhbnRTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBGREthYWNFbmNfRXN0aW1hdGVTY2FsZUZhY3RvcnNDaGFubmVsKAorICAgICAgICBxY091dENoYW5uZWxbY2hdLCBwc3lPdXRDaGFubmVsW2NoXSwgcWNPdXRDaGFubmVsW2NoXS0+c2NmLAorICAgICAgICAmcWNPdXRDaGFubmVsW2NoXS0+Z2xvYmFsR2FpbiwgcWNPdXRDaGFubmVsW2NoXS0+c2ZiRm9ybUZhY3RvckxkRGF0YSwKKyAgICAgICAgaW52UXVhbnQsIHFjT3V0Q2hhbm5lbFtjaF0tPnF1YW50U3BlYywgZFpvbmVRdWFudEVuYWJsZSk7CiAgIH0KLQogfQotCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3NmX2VzdGltLmggYi9saWJBQUNlbmMvc3JjL3NmX2VzdGltLmgKaW5kZXggZWY4ZDM2Ni4uYWIyZDNjMiAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9zZl9lc3RpbS5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvc2ZfZXN0aW0uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw0MCArOTAsMzUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS4gV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogU2NhbGUgZmFjdG9yIGVzdGltYXRpb24KKyAgIEF1dGhvcihzKTogICBNLiBXZXJuZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFNjYWxlIGZhY3RvciBlc3RpbWF0aW9uCiAKLSNpZm5kZWYgX1NGX0VTVElNX0gKLSNkZWZpbmUgX1NGX0VTVElNX0gKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0ZfRVNUSU1fSAorI2RlZmluZSBTRl9FU1RJTV9ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKLQogI2luY2x1ZGUgInBzeV9jb25zdC5oIgogI2luY2x1ZGUgInFjX2RhdGEuaCIKICNpbmNsdWRlICJpbnRlcmZhY2UuaCIKIAotI2RlZmluZSBGT1JNX0ZBQ19TSElGVCAgNgorI2RlZmluZSBGT1JNX0ZBQ19TSElGVCA2CiAKK3ZvaWQgRkRLYWFjRW5jX0NhbGNGb3JtRmFjdG9yKFFDX09VVF9DSEFOTkVMICpxY091dENoYW5uZWxbKDIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbm5lbFsoMildLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscyk7CiAKLXZvaWQKLUZES2FhY0VuY19DYWxjRm9ybUZhY3RvcihRQ19PVVRfQ0hBTk5FTCAgICpxY091dENoYW5uZWxbKDIpXSwKLSAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgKnBzeU91dENoYW5uZWxbKDIpXSwKLSAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgbkNoYW5uZWxzKTsKLQotdm9pZAotRkRLYWFjRW5jX0VzdGltYXRlU2NhbGVGYWN0b3JzKFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbm5lbFtdLAotICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHFjT3V0Q2hhbm5lbFtdLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGludlF1YW50LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGRab25lUXVhbnRFbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbkNoYW5uZWxzKTsKLQotCit2b2lkIEZES2FhY0VuY19Fc3RpbWF0ZVNjYWxlRmFjdG9ycyhQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5uZWxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICpxY091dENoYW5uZWxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpbnZRdWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBkWm9uZVF1YW50RW5hYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscyk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9zcHJlYWRpbmcuY3BwIGIvbGliQUFDZW5jL3NyYy9zcHJlYWRpbmcuY3BwCmluZGV4IDg1MmRhMWUuLjBmYjQzYmIgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvc3ByZWFkaW5nLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL3NwcmVhZGluZy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMzYgKzkwLDM2IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogU3ByZWFkaW5nIG9mIGVuZXJneQorICAgQXV0aG9yKHMpOiAgIE0uV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBTcHJlYWRpbmcgb2YgZW5lcmd5CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJzcHJlYWRpbmcuaCIKIAotdm9pZCBGREthYWNFbmNfU3ByZWFkaW5nTWF4KGNvbnN0IElOVCAgICAgICBwYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgKlJFU1RSSUNUIG1hc2tMb3dGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICpSRVNUUklDVCBtYXNrSGlnaEZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICAgKlJFU1RSSUNUIHBiU3ByZWFkRW5lcmd5KQotewotICAgaW50IGk7Ci0gICBGSVhQX0RCTCBkZWxheTsKK3ZvaWQgRkRLYWFjRW5jX1NwcmVhZGluZ01heChjb25zdCBJTlQgcGJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIG1hc2tMb3dGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIG1hc2tIaWdoRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwYlNwcmVhZEVuZXJneSkgeworICBpbnQgaTsKKyAgRklYUF9EQkwgZGVsYXk7CiAKLSAgIC8qIHNsb3BlIHRvIGhpZ2hlciBmcmVxdWVuY2llcyAqLwotICAgZGVsYXkgPSBwYlNwcmVhZEVuZXJneVswXTsKLSAgIGZvciAoaT0xOyBpPHBiQ250OyBpKyspIHsKLSAgICAgIGRlbGF5ID0gZml4TWF4KHBiU3ByZWFkRW5lcmd5W2ldLCBmTXVsdChtYXNrSGlnaEZhY3RvcltpXSwgZGVsYXkpKTsKLSAgICAgIHBiU3ByZWFkRW5lcmd5W2ldID0gZGVsYXk7Ci0gICB9CisgIC8qIHNsb3BlIHRvIGhpZ2hlciBmcmVxdWVuY2llcyAqLworICBkZWxheSA9IHBiU3ByZWFkRW5lcmd5WzBdOworICBmb3IgKGkgPSAxOyBpIDwgcGJDbnQ7IGkrKykgeworICAgIGRlbGF5ID0gZml4TWF4KHBiU3ByZWFkRW5lcmd5W2ldLCBmTXVsdChtYXNrSGlnaEZhY3RvcltpXSwgZGVsYXkpKTsKKyAgICBwYlNwcmVhZEVuZXJneVtpXSA9IGRlbGF5OworICB9CiAKLSAgIC8qIHNsb3BlIHRvIGxvd2VyIGZyZXF1ZW5jaWVzICovCi0gICBkZWxheSA9IHBiU3ByZWFkRW5lcmd5W3BiQ250LTFdOwotICAgZm9yIChpPXBiQ250LTI7IGk+PTA7IGktLSkgewotICAgICAgZGVsYXkgPSBmaXhNYXgocGJTcHJlYWRFbmVyZ3lbaV0sIGZNdWx0KG1hc2tMb3dGYWN0b3JbaV0sZGVsYXkpKTsKLSAgICAgIHBiU3ByZWFkRW5lcmd5W2ldID0gZGVsYXk7Ci0gICB9CisgIC8qIHNsb3BlIHRvIGxvd2VyIGZyZXF1ZW5jaWVzICovCisgIGRlbGF5ID0gcGJTcHJlYWRFbmVyZ3lbcGJDbnQgLSAxXTsKKyAgZm9yIChpID0gcGJDbnQgLSAyOyBpID49IDA7IGktLSkgeworICAgIGRlbGF5ID0gZml4TWF4KHBiU3ByZWFkRW5lcmd5W2ldLCBmTXVsdChtYXNrTG93RmFjdG9yW2ldLCBkZWxheSkpOworICAgIHBiU3ByZWFkRW5lcmd5W2ldID0gZGVsYXk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvc3ByZWFkaW5nLmggYi9saWJBQUNlbmMvc3JjL3NwcmVhZGluZy5oCmluZGV4IGUxYjUwNmMuLmU2OTMwMzEgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvc3ByZWFkaW5nLmgKKysrIGIvbGliQUFDZW5jL3NyYy9zcHJlYWRpbmcuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyNCArOTAsMjQgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTS5XZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBTcHJlYWRpbmcgb2YgZW5lcmd5IGFuZCB3ZWlnaHRlZCB0b25hbGl0eQorICAgQXV0aG9yKHMpOiAgIE0uV2VybmVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBTcHJlYWRpbmcgb2YgZW5lcmd5IGFuZCB3ZWlnaHRlZCB0b25hbGl0eQogCi0jaWZuZGVmIF9TUFJFQURJTkdfSAotI2RlZmluZSBfU1BSRUFESU5HX0gKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU1BSRUFESU5HX0gKKyNkZWZpbmUgU1BSRUFESU5HX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAordm9pZCBGREthYWNFbmNfU3ByZWFkaW5nTWF4KGNvbnN0IElOVCBwYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgbWFza0xvd0ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgbWFza0hpZ2hGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBiU3ByZWFkRW5lcmd5KTsKIAotdm9pZCBGREthYWNFbmNfU3ByZWFkaW5nTWF4KGNvbnN0IElOVCAgICAgICAgIHBiQ250LAotICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgICAgKlJFU1RSSUNUIG1hc2tMb3dGYWN0b3IsCi0gICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAqUkVTVFJJQ1QgbWFza0hpZ2hGYWN0b3IsCi0gICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICAgICAqUkVTVFJJQ1QgcGJTcHJlYWRFbmVyZ3kpOwotCi0jZW5kaWYgLyogI2lmbmRlZiBfU1BSRUFESU5HX0ggKi8KKyNlbmRpZiAvKiAjaWZuZGVmIFNQUkVBRElOR19IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3Ruc19mdW5jLmggYi9saWJBQUNlbmMvc3JjL3Ruc19mdW5jLmgKaW5kZXggNWU1MjY1ZC4uNjA5OWJjNyAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy90bnNfZnVuYy5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvdG5zX2Z1bmMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw2NyArOTAsNDAgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgQWxleCBHb2VzY2hlbAotICAgY29udGVudHMvZGVzY3JpcHRpb246IFRlbXBvcmFsIG5vaXNlIHNoYXBpbmcKKyAgIEF1dGhvcihzKTogICBBbGV4IEdvZXNjaGVsCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBUZW1wb3JhbCBub2lzZSBzaGFwaW5nCiAKLSNpZm5kZWYgX1ROU19GVU5DX0gKLSNkZWZpbmUgX1ROU19GVU5DX0gKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVE5TX0ZVTkNfSAorI2RlZmluZSBUTlNfRlVOQ19ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKICNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgogCi1BQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdFRuc0NvbmZpZ3VyYXRpb24oSU5UIGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBibG9ja3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGdyYW51bGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGlzTG93RGVsYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGxkU2JyUHJlc2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfQ09ORklHICp0bnNDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT04gKnBzeUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB1c2VUbnNQZWFrICk7CitBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdFRuc0NvbmZpZ3VyYXRpb24oCisgICAgSU5UIGJpdHJhdGUsIElOVCBzYW1wbGVyYXRlLCBJTlQgY2hhbm5lbHMsIElOVCBibG9ja3R5cGUsIElOVCBncmFudWxlTGVuZ3RoLAorICAgIElOVCBpc0xvd0RlbGF5LCBJTlQgbGRTYnJQcmVzZW50LCBUTlNfQ09ORklHICp0bnNDb25maWcsCisgICAgUFNZX0NPTkZJR1VSQVRJT04gKnBzeUNvbmZpZywgSU5UIGFjdGl2ZSwgSU5UIHVzZVRuc1BlYWspOwogCi1JTlQgRkRLYWFjRW5jX1Ruc0RldGVjdCgKLSAgICAgICAgICAgICAgVE5TX0RBVEEgKnRuc0RhdGEsCi0gICAgICAgICAgICAgIGNvbnN0IFROU19DT05GSUcgKnRDLAotICAgICAgICAgICAgICBUTlNfSU5GTyogdG5zSW5mbywKLSAgICAgICAgICAgICAgSU5UIHNmYkNudCwKLSAgICAgICAgICAgICAgRklYUF9EQkwgKnNwZWN0cnVtLAotICAgICAgICAgICAgICBJTlQgc3ViQmxvY2tOdW1iZXIsCi0gICAgICAgICAgICAgIElOVCBibG9ja1R5cGUKLSAgICAgICAgICAgICAgKTsKK0lOVCBGREthYWNFbmNfVG5zRGV0ZWN0KFROU19EQVRBICp0bnNEYXRhLCBjb25zdCBUTlNfQ09ORklHICp0QywKKyAgICAgICAgICAgICAgICAgICAgICAgIFROU19JTkZPICp0bnNJbmZvLCBJTlQgc2ZiQ250LCBjb25zdCBGSVhQX0RCTCAqc3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3ViQmxvY2tOdW1iZXIsIElOVCBibG9ja1R5cGUpOwogCit2b2lkIEZES2FhY0VuY19UbnNTeW5jKFROU19EQVRBICp0bnNEYXRhRGVzdCwgY29uc3QgVE5TX0RBVEEgKnRuc0RhdGFTcmMsCisgICAgICAgICAgICAgICAgICAgICAgIFROU19JTkZPICp0bnNJbmZvRGVzdCwgVE5TX0lORk8gKnRuc0luZm9TcmMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBibG9ja1R5cGVEZXN0LCBjb25zdCBJTlQgYmxvY2tUeXBlU3JjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTlNfQ09ORklHICp0Qyk7CiAKK0lOVCBGREthYWNFbmNfVG5zRW5jb2RlKFROU19JTkZPICp0bnNJbmZvLCBUTlNfREFUQSAqdG5zRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBudW1PZlNmYiwgY29uc3QgVE5TX0NPTkZJRyAqdEMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbG93UGFzc0xpbmUsIEZJWFBfREJMICpzcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzdWJCbG9ja051bWJlciwgY29uc3QgSU5UIGJsb2NrVHlwZSk7CiAKLXZvaWQgRkRLYWFjRW5jX1Ruc1N5bmMoCi0gICAgICAgICAgICAgVE5TX0RBVEEgKnRuc0RhdGFEZXN0LAotICAgICAgICAgICAgIGNvbnN0IFROU19EQVRBICp0bnNEYXRhU3JjLAotICAgICAgICAgICAgIFROU19JTkZPICp0bnNJbmZvRGVzdCwKLSAgICAgICAgICAgICBUTlNfSU5GTyAqdG5zSW5mb1NyYywKLSAgICAgICAgICAgICBjb25zdCBJTlQgYmxvY2tUeXBlRGVzdCwKLSAgICAgICAgICAgICBjb25zdCBJTlQgYmxvY2tUeXBlU3JjLAotICAgICAgICAgICAgIGNvbnN0IFROU19DT05GSUcgKnRDCi0gICAgICAgICAgICAgKTsKLQotSU5UIEZES2FhY0VuY19UbnNFbmNvZGUoCi0gICAgICAgICAgICAgIFROU19JTkZPKiB0bnNJbmZvLAotICAgICAgICAgICAgICBUTlNfREFUQSogdG5zRGF0YSwKLSAgICAgICAgICAgICAgY29uc3QgSU5UIG51bU9mU2ZiLAotICAgICAgICAgICAgICBjb25zdCBUTlNfQ09ORklHICp0QywKLSAgICAgICAgICAgICAgY29uc3QgSU5UIGxvd1Bhc3NMaW5lLAotICAgICAgICAgICAgICBGSVhQX0RCTCogc3BlY3RydW0sCi0gICAgICAgICAgICAgIGNvbnN0IElOVCBzdWJCbG9ja051bWJlciwKLSAgICAgICAgICAgICAgY29uc3QgSU5UIGJsb2NrVHlwZQotICAgICAgICAgICAgICApOwotCi0KLQotI2VuZGlmIC8qIF9UTlNfRlVOQ19IICovCisjZW5kaWYgLyogVE5TX0ZVTkNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy90b25hbGl0eS5jcHAgYi9saWJBQUNlbmMvc3JjL3RvbmFsaXR5LmNwcAppbmRleCA3MjQ2YTM0Li4zMzRlMGYxIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL3RvbmFsaXR5LmNwcAorKysgYi9saWJBQUNlbmMvc3JjL3RvbmFsaXR5LmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3NCArOTAsNzcgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQUMgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBhdXRob3I6ICAgTS4gV2VybmVyCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogQ29udmVydCBjaGFvcyBtZWFzdXJlIHRvIHRoZSB0b25hbGl0eSBpbmRleAorICAgQXV0aG9yKHMpOiAgIE0uIFdlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogQ29udmVydCBjaGFvcyBtZWFzdXJlIHRvIHRoZSB0b25hbGl0eSBpbmRleAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAidG9uYWxpdHkuaCIKKwogI2luY2x1ZGUgImNoYW9zbWVhc3VyZS5oIgogCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgbm9ybWxvZyA9IChGSVhQX0RCTCkweGQ5NzdkOTQ5OyAvKkZMMkZYQ09OU1RfREJMKC0wLjQzNDI5NDQ4MTlmICogRkRLbG9nKDIuMCkvRkRLbG9nKDIuNzE4MjgxOCkpOyAqLwotCi1zdGF0aWMgdm9pZCBGREthYWNFbmNfQ2FsY1NmYlRvbmFsaXR5KEZJWFBfREJMICAgICAgKlJFU1RSSUNUIHNwZWN0cnVtLAotCQkJCQkJCUlOVCAgICAgICAgICAgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICpSRVNUUklDVCBjaGFvc01lYXN1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgICAgICAqUkVTVFJJQ1Qgc2ZiVG9uYWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAqUkVTVFJJQ1Qgc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKlJFU1RSSUNUIHNmYkVuZXJneUxENjQgKTsKLQotCi12b2lkIEZES2FhY0VuY19DYWxjdWxhdGVGdWxsVG9uYWxpdHkoRklYUF9EQkwgICAgICAqUkVTVFJJQ1Qgc3BlY3RydW0sCi0JCQkJCQkgICAgICAgICAgICAgSU5UICAgICAgICAgICAqUkVTVFJJQ1Qgc2ZiTWF4U2NhbGVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKlJFU1RSSUNUIHNmYkVuZXJneUxENjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgICAgICAqUkVTVFJJQ1Qgc2ZiVG9uYWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICB1c2VQbnMpCi17Ci0gIElOVCBqOwotI2lmIGRlZmluZWQoQVJDSF9QUkVGRVJfTVVMVF8zMngxNikKLSAgRklYUF9TR0wgYWxwaGFfMCA9IEZMMkZYQ09OU1RfU0dMKDAuMjVmKTsgICAgICAgLyogdXNlZCBpbiBzbW9vdGggQ2hhb3NNZWFzdXJlICovCi0gIEZJWFBfU0dMIGFscGhhXzEgPSBGTDJGWENPTlNUX1NHTCgxLjBmLTAuMjVmKTsgIC8qIHVzZWQgaW4gc21vb3RoIENoYW9zTWVhc3VyZSAqLwotI2Vsc2UKLSAgRklYUF9EQkwgYWxwaGFfMCA9IEZMMkZYQ09OU1RfREJMKDAuMjVmKTsgICAgICAgLyogdXNlZCBpbiBzbW9vdGggQ2hhb3NNZWFzdXJlICovCi0gIEZJWFBfREJMIGFscGhhXzEgPSBGTDJGWENPTlNUX0RCTCgxLjBmLTAuMjVmKTsgIC8qIHVzZWQgaW4gc21vb3RoIENoYW9zTWVhc3VyZSAqLworI2lmIGRlZmluZWQoX19hcm1fXykKICNlbmRpZgorCitzdGF0aWMgY29uc3QgRklYUF9EQkwgbm9ybWxvZyA9CisgICAgKEZJWFBfREJMKTB4ZDk3N2Q5NDk7IC8qRkwyRlhDT05TVF9EQkwoLTAuNDM0Mjk0NDgxOWYgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREtsb2coMi4wKS9GREtsb2coMi43MTgyODE4KSk7ICovCisKK3N0YXRpYyB2b2lkIEZES2FhY0VuY19DYWxjU2ZiVG9uYWxpdHkoRklYUF9EQkwgKlJFU1RSSUNUIHNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKlJFU1RSSUNUIHNmYk1heFNjYWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIGNoYW9zTWVhc3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgKlJFU1RSSUNUIHNmYlRvbmFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2ZiQ250LCBjb25zdCBJTlQgKlJFU1RSSUNUIHNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHNmYkVuZXJneUxENjQpOworCit2b2lkIEZES2FhY0VuY19DYWxjdWxhdGVGdWxsVG9uYWxpdHkoRklYUF9EQkwgKlJFU1RSSUNUIHNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqUkVTVFJJQ1Qgc2ZiTWF4U2NhbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBzZmJFbmVyZ3lMRDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICpSRVNUUklDVCBzZmJUb25hbGl0eSwgSU5UIHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKnNmYk9mZnNldCwgSU5UIHVzZVBucykgeworICBJTlQgajsKICAgSU5UIG51bWJlck9mTGluZXMgPSBzZmJPZmZzZXRbc2ZiQ250XTsKIAotICBpZiAoIXVzZVBucykKLSAgICByZXR1cm47CisgIGlmICh1c2VQbnMpIHsKKyAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoY2hhb3NNZWFzdXJlUGVyTGluZSwgRklYUF9EQkwsICgxMDI0KSkKIAotICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoY2hhb3NNZWFzdXJlUGVyTGluZSwgRklYUF9EQkwsICgxMDI0KSk7Ci0gIC8qIGNhbGN1bGF0ZSBjaGFvcyBtZWFzdXJlICovCi0gIEZES2FhY0VuY19DYWxjdWxhdGVDaGFvc01lYXN1cmUoc3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZkxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhb3NNZWFzdXJlUGVyTGluZSk7CisgICAgLyogY2FsY3VsYXRlIGNoYW9zIG1lYXN1cmUgKi8KKyAgICBGREthYWNFbmNfQ2FsY3VsYXRlQ2hhb3NNZWFzdXJlKHNwZWN0cnVtLCBudW1iZXJPZkxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhb3NNZWFzdXJlUGVyTGluZSk7CiAKLSAgLyogc21vb3RoIENoYW9zTWVhc3VyZSAqLwotICBmb3IgKGo9MTtqPG51bWJlck9mTGluZXM7aisrKSB7Ci0gICAgRklYUF9EQkwgdG1wID0gZk11bHREaXYyKGFscGhhXzEsIGNoYW9zTWVhc3VyZVBlckxpbmVbal0pOwotICAgIGNoYW9zTWVhc3VyZVBlckxpbmVbal0gPSBmTXVsdEFkZCh0bXAsIGFscGhhXzAsIGNoYW9zTWVhc3VyZVBlckxpbmVbai0xXSk7CisgICAgLyogc21vb3RoIENoYW9zTWVhc3VyZSAqLworICAgIEZJWFBfREJMIGxlZnQgPSBjaGFvc01lYXN1cmVQZXJMaW5lWzBdOworICAgIEZJWFBfREJMIHJpZ2h0OworICAgIGZvciAoaiA9IDE7IGogPCAobnVtYmVyT2ZMaW5lcyAtIDEpOyBqICs9IDIpIHsKKyAgICAgIHJpZ2h0ID0gY2hhb3NNZWFzdXJlUGVyTGluZVtqXTsKKyAgICAgIHJpZ2h0ID0gcmlnaHQgLSAocmlnaHQgPj4gMik7CisgICAgICBsZWZ0ID0gcmlnaHQgKyAobGVmdCA+PiAyKTsKKyAgICAgIGNoYW9zTWVhc3VyZVBlckxpbmVbal0gPSBsZWZ0OyAvKiAwLjI1IGxlZnQgKyAwLjc1IHJpZ2h0ICovCisKKyAgICAgIHJpZ2h0ID0gY2hhb3NNZWFzdXJlUGVyTGluZVtqICsgMV07CisgICAgICByaWdodCA9IHJpZ2h0IC0gKHJpZ2h0ID4+IDIpOworICAgICAgbGVmdCA9IHJpZ2h0ICsgKGxlZnQgPj4gMik7CisgICAgICBjaGFvc01lYXN1cmVQZXJMaW5lW2ogKyAxXSA9IGxlZnQ7CisgICAgfQorICAgIGlmIChqID09IChudW1iZXJPZkxpbmVzIC0gMSkpIHsKKyAgICAgIHJpZ2h0ID0gY2hhb3NNZWFzdXJlUGVyTGluZVtqXTsKKyAgICAgIHJpZ2h0ID0gcmlnaHQgLSAocmlnaHQgPj4gMik7CisgICAgICBsZWZ0ID0gcmlnaHQgKyAobGVmdCA+PiAyKTsKKyAgICAgIGNoYW9zTWVhc3VyZVBlckxpbmVbal0gPSBsZWZ0OworICAgIH0KKworICAgIEZES2FhY0VuY19DYWxjU2ZiVG9uYWxpdHkoc3BlY3RydW0sIHNmYk1heFNjYWxlU3BlYywgY2hhb3NNZWFzdXJlUGVyTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYlRvbmFsaXR5LCBzZmJDbnQsIHNmYk9mZnNldCwgc2ZiRW5lcmd5TEQ2NCk7CisKKyAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGNoYW9zTWVhc3VyZVBlckxpbmUsIEZJWFBfREJMLCAoMTAyNCkpCiAgIH0KLQotICBGREthYWNFbmNfQ2FsY1NmYlRvbmFsaXR5KHNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgc2ZiTWF4U2NhbGVTcGVjLAotICAgICAgICAgICAgICAgICAgY2hhb3NNZWFzdXJlUGVyTGluZSwKLSAgICAgICAgICAgICAgICAgIHNmYlRvbmFsaXR5LAotICAgICAgICAgICAgICAgICAgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5TEQ2NCk7Ci0KLSAgQ19BTExPQ19TQ1JBVENIX0VORChjaGFvc01lYXN1cmVQZXJMaW5lLCBGSVhQX0RCTCwgKDEwMjQpKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogQ2FsY3VsYXRlVG9uYWxpdHlJbmRleApAQCAtMTU4LDQ3ICsxNzIsNDggQEAKICAgICBvdXRwdXQ6ICAgICAgIHNmYiB3aXNlIHRvbmFsaXR5IHZhbHVlcwogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEZES2FhY0VuY19DYWxjU2ZiVG9uYWxpdHkoRklYUF9EQkwgICAgICAqUkVTVFJJQ1Qgc3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAqUkVTVFJJQ1Qgc2ZiTWF4U2NhbGVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKlJFU1RSSUNUIGNoYW9zTWVhc3VyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAgICAgICpSRVNUUklDVCBzZmJUb25hbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICpSRVNUUklDVCBzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqUkVTVFJJQ1Qgc2ZiRW5lcmd5TEQ2NCApCi17Ci0gICAgSU5UIGksIGo7CitzdGF0aWMgdm9pZCBGREthYWNFbmNfQ2FsY1NmYlRvbmFsaXR5KEZJWFBfREJMICpSRVNUUklDVCBzcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBjaGFvc01lYXN1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICpSRVNUUklDVCBzZmJUb25hbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNmYkNudCwgY29uc3QgSU5UICpSRVNUUklDVCBzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBzZmJFbmVyZ3lMRDY0KSB7CisgIElOVCBpOwogCi0gICAgZm9yIChpPTA7IGk8c2ZiQ250OyBpKyspIHsKLSAgICAgIEZJWFBfREJMIGNoYW9zTWVhc3VyZVNmYkxENjQ7Ci0gICAgICBJTlQgc2hpZnRCaXRzID0gZml4TWF4KDAsc2ZiTWF4U2NhbGVTcGVjW2ldIC0gNCk7ICAvKiBtYXggc2ZiV2lkdGggPSA5NiA7IDJeNz0xMjggPT4gNy8yID0gNCAoc3BjKnNwYykgKi8KKyAgZm9yIChpID0gMDsgaSA8IHNmYkNudDsgaSsrKSB7CisgICAgRklYUF9EQkwgY2hhb3NNZWFzdXJlU2ZiTEQ2NDsKKyAgICBJTlQgc2hpZnRCaXRzID0KKyAgICAgICAgZml4TWF4KDAsIHNmYk1heFNjYWxlU3BlY1tpXSAtCisgICAgICAgICAgICAgICAgICAgICAgNCk7IC8qIG1heCBzZmJXaWR0aCA9IDk2IDsgMl43PTEyOCA9PiA3LzIgPSA0IChzcGMqc3BjKSAqLwogCi0gICAgICBGSVhQX0RCTCBjaGFvc01lYXN1cmVTZmIgPSBGTDJGWENPTlNUX0RCTCgwLjApOworICAgIElOVCBqOworICAgIEZJWFBfREJMIGNoYW9zTWVhc3VyZVNmYiA9IEZMMkZYQ09OU1RfREJMKDAuMCk7CiAKLSAgICAgIC8qIGNhbGMgY2hhb3NNZWFzdXJlUGVyU2ZiICovCi0gICAgICBmb3IgKGo9KHNmYk9mZnNldFtpKzFdLXNmYk9mZnNldFtpXSktMTsgaj49MDsgai0tKSB7Ci0gICAgICAgIEZJWFBfREJMIHRtcCA9ICgqc3BlY3RydW0rKyk8PHNoaWZ0Qml0czsKLSAgICAgICAgRklYUF9EQkwgbGluZU5yZyA9IGZNdWx0RGl2Mih0bXAsIHRtcCk7Ci0gICAgICAgIGNoYW9zTWVhc3VyZVNmYiA9IGZNdWx0QWRkRGl2MihjaGFvc01lYXN1cmVTZmIsIGxpbmVOcmcsICpjaGFvc01lYXN1cmUrKyk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNhbGMgdG9uYWxpdHlQZXJTZmIgKi8KLSAgICAgIGlmIChjaGFvc01lYXN1cmVTZmIgIT0gRkwyRlhDT05TVF9EQkwoMC4wKSkKLSAgICAgIHsKLSAgICAgICAgLyogYWRkIGxkKGNvbnZ0b25lKS82NCBhbmQgMi82NCBiZWMuZk11bHREaXYyICovCi0gICAgICAgIGNoYW9zTWVhc3VyZVNmYkxENjQgPSBDYWxjTGREYXRhKChjaGFvc01lYXN1cmVTZmIpKSAtIHNmYkVuZXJneUxENjRbaV07Ci0gICAgICAgIGNoYW9zTWVhc3VyZVNmYkxENjQgKz0gRkwyRlhDT05TVF9EQkwoMy4wZi82NCkgLSAoKEZJWFBfREJMKShzaGlmdEJpdHMpPDwoREZSQUNUX0JJVFMtNikpOwotCi0gICAgICAgIGlmIChjaGFvc01lYXN1cmVTZmJMRDY0ID4gRkwyRlhDT05TVF9EQkwoLTAuMDUxOTA1MSkgKSAgICAgLyogPiBsZCgwLjA1KStsZCgyKSAqLwotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGNoYW9zTWVhc3VyZVNmYkxENjQgPD0gRkwyRlhDT05TVF9EQkwoMC4wKSApCi0JCSAgICBzZmJUb25hbGl0eVtpXSA9IEZYX0RCTDJGWF9TR0woZk11bHREaXYyKCBjaGFvc01lYXN1cmVTZmJMRDY0ICwgbm9ybWxvZyApIDw8IDcpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNmYlRvbmFsaXR5W2ldID0gRkwyRlhDT05TVF9TR0woMC4wKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgc2ZiVG9uYWxpdHlbaV0gPSAoRklYUF9TR0wpTUFYVkFMX1NHTDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgc2ZiVG9uYWxpdHlbaV0gPSAoRklYUF9TR0wpTUFYVkFMX1NHTDsKKyAgICAvKiBjYWxjIGNoYW9zTWVhc3VyZVBlclNmYiAqLworICAgIGZvciAoaiA9IChzZmJPZmZzZXRbaSArIDFdIC0gc2ZiT2Zmc2V0W2ldKSAtIDE7IGogPj0gMDsgai0tKSB7CisgICAgICBGSVhQX0RCTCB0bXAgPSAoKnNwZWN0cnVtKyspIDw8IHNoaWZ0Qml0czsKKyAgICAgIEZJWFBfREJMIGxpbmVOcmcgPSBmTXVsdERpdjIodG1wLCB0bXApOworICAgICAgY2hhb3NNZWFzdXJlU2ZiID0gZk11bHRBZGREaXYyKGNoYW9zTWVhc3VyZVNmYiwgbGluZU5yZywgKmNoYW9zTWVhc3VyZSsrKTsKICAgICB9CisKKyAgICAvKiBjYWxjIHRvbmFsaXR5UGVyU2ZiICovCisgICAgaWYgKGNoYW9zTWVhc3VyZVNmYiAhPSBGTDJGWENPTlNUX0RCTCgwLjApKSB7CisgICAgICAvKiBhZGQgbGQoY29udnRvbmUpLzY0IGFuZCAyLzY0IGJlYy5mTXVsdERpdjIgKi8KKyAgICAgIGNoYW9zTWVhc3VyZVNmYkxENjQgPSBDYWxjTGREYXRhKChjaGFvc01lYXN1cmVTZmIpKSAtIHNmYkVuZXJneUxENjRbaV07CisgICAgICBjaGFvc01lYXN1cmVTZmJMRDY0ICs9IEZMMkZYQ09OU1RfREJMKDMuMGYgLyA2NCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZJWFBfREJMKShzaGlmdEJpdHMpIDw8IChERlJBQ1RfQklUUyAtIDYpKTsKKworICAgICAgaWYgKGNoYW9zTWVhc3VyZVNmYkxENjQgPgorICAgICAgICAgIEZMMkZYQ09OU1RfREJMKC0wLjA1MTkwNTEpKSAvKiA+IGxkKDAuMDUpK2xkKDIpICovCisgICAgICB7CisgICAgICAgIGlmIChjaGFvc01lYXN1cmVTZmJMRDY0IDw9IEZMMkZYQ09OU1RfREJMKDAuMCkpCisgICAgICAgICAgc2ZiVG9uYWxpdHlbaV0gPQorICAgICAgICAgICAgICBGWF9EQkwyRlhfU0dMKGZNdWx0RGl2MihjaGFvc01lYXN1cmVTZmJMRDY0LCBub3JtbG9nKSA8PCA3KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNmYlRvbmFsaXR5W2ldID0gRkwyRlhDT05TVF9TR0woMC4wKTsKKyAgICAgIH0gZWxzZQorICAgICAgICBzZmJUb25hbGl0eVtpXSA9IChGSVhQX1NHTClNQVhWQUxfU0dMOworICAgIH0gZWxzZQorICAgICAgc2ZiVG9uYWxpdHlbaV0gPSAoRklYUF9TR0wpTUFYVkFMX1NHTDsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy90b25hbGl0eS5oIGIvbGliQUFDZW5jL3NyYy90b25hbGl0eS5oCmluZGV4IGZiZTc4ZWUuLmM1Y2Y0YzUgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvdG9uYWxpdHkuaAorKysgYi9saWJBQUNlbmMvc3JjL3RvbmFsaXR5LmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMzAgKzkwLDI2IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgYXV0aG9yOiAgIE0uIExvaHdhc3NlcgotICAgY29udGVudHMvZGVzY3JpcHRpb246IENhbGN1bGF0ZSB0b25hbGl0eSBpbmRleAorICAgQXV0aG9yKHMpOiAgIE0uIExvaHdhc3NlcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogQ2FsY3VsYXRlIHRvbmFsaXR5IGluZGV4CiAKLSNpZm5kZWYgX19UT05BTElUWV9ICi0jZGVmaW5lIF9fVE9OQUxJVFlfSAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBUT05BTElUWV9ICisjZGVmaW5lIFRPTkFMSVRZX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKLQotCiAjaW5jbHVkZSAiY2hhb3NtZWFzdXJlLmgiCiAKK3ZvaWQgRkRLYWFjRW5jX0NhbGN1bGF0ZUZ1bGxUb25hbGl0eShGSVhQX0RCTCAqUkVTVFJJQ1Qgc3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHNmYkVuZXJneUxENjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgKlJFU1RSSUNUIHNmYlRvbmFsaXR5LCBJTlQgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqc2ZiT2Zmc2V0LCBJTlQgdXNlUG5zKTsKIAotdm9pZCBGREthYWNFbmNfQ2FsY3VsYXRlRnVsbFRvbmFsaXR5KCBGSVhQX0RCTCAgICAgICpSRVNUUklDVCBzcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICpSRVNUUklDVCBzZmJNYXhTY2FsZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqUkVTVFJJQ1Qgc2ZiRW5lcmd5TEQ2NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAgICAgICpSRVNUUklDVCBzZmJUb25hbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICB1c2VQbnMpOwotCi0jZW5kaWYKKyNlbmRpZiAvKiBUT05BTElUWV9IICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3RyYW5zZm9ybS5jcHAgYi9saWJBQUNlbmMvc3JjL3RyYW5zZm9ybS5jcHAKaW5kZXggNjkwYjgyZS4uMDhiMWMyZiAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy90cmFuc2Zvcm0uY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvdHJhbnNmb3JtLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw5ICs5MCwxMSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUFDIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIFRvYmlhcyBDaGFsdXBrYQogCiAgICBEZXNjcmlwdGlvbjogRkRLYWFjTGRFbmNfTWRjdFRyYW5zZm9ybTQ4MDoKICAgICAgICAgICAgICAgICBUaGUgbW9kdWxlIEZES2FhY0xkRW5jX01kY3RUcmFuc2Zvcm0gd2lsbCBwZXJmb3JtIHRoZSBNRENULgpAQCAtOTAsMTc1ICsxMDMsMTkyIEBACiAgICAgICAgICAgICAgICAgY2FuIGJlIGRpdmlkZWQgaW4gIFdpbmRvd2luZywgUHJlTW9kdWxhdGlvbiwgRmZ0IGFuZAogICAgICAgICAgICAgICAgIFBvc3RNb2R1bGF0aW9uLgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAidHJhbnNmb3JtLmgiCi0KICNpbmNsdWRlICJkY3QuaCIKICNpbmNsdWRlICJwc3lfY29uc3QuaCIKICNpbmNsdWRlICJhYWNFbmNfcm9tLmgiCiAjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgogCi1JTlQgRkRLYWFjRW5jX1RyYW5zZm9ybV9SZWFsIChjb25zdCBJTlRfUENNICogcFRpbWVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3REYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGJsb2NrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB3aW5kb3dTaGFwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcHJldldpbmRvd1NoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGZyYW1lTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICptZGN0RGF0YV9lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGZpbHRlclR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLEZJWFBfREJMICogUkVTVFJJQ1Qgb3ZlcmxhcEFkZEJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gIGNvbnN0IElOVF9QQ00gKiBSRVNUUklDVCB0aW1lRGF0YTsKKyNpZiBkZWZpbmVkKF9fYXJtX18pCisjZW5kaWYKKworSU5UIEZES2FhY0VuY19UcmFuc2Zvcm1fUmVhbChjb25zdCBJTlRfUENNICpwVGltZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBtZGN0RGF0YSwgY29uc3QgSU5UIGJsb2NrVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHdpbmRvd1NoYXBlLCBJTlQgKnByZXZXaW5kb3dTaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSF9NRENUIG1kY3RQZXJzLCBjb25zdCBJTlQgZnJhbWVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcE1kY3REYXRhX2UsIElOVCBmaWx0ZXJUeXBlKSB7CisgIGNvbnN0IElOVF9QQ00gKlJFU1RSSUNUIHRpbWVEYXRhOworCisgIFVJTlQgbnVtU3BlYzsKKyAgVUlOVCBudW1NZGN0TGluZXM7CisgIFVJTlQgb2Zmc2V0OworICBpbnQgZnI7IC8qIGZyOiByaWdodCB3aW5kb3cgc2xvcGUgbGVuZ3RoICovCisgIFNIT1JUIG1kY3REYXRhX2VbOF07CisKKyAgdGltZURhdGEgPSBwVGltZURhdGE7CisKKyAgaWYgKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpIHsKKyAgICBudW1TcGVjID0gODsKKyAgICBudW1NZGN0TGluZXMgPSBmcmFtZUxlbmd0aCA+PiAzOworICB9IGVsc2UgeworICAgIG51bVNwZWMgPSAxOworICAgIG51bU1kY3RMaW5lcyA9IGZyYW1lTGVuZ3RoOworICB9CisKKyAgb2Zmc2V0ID0gKHdpbmRvd1NoYXBlID09IExPTF9XSU5ET1cpID8gKChmcmFtZUxlbmd0aCAqIDMpID4+IDIpIDogMDsKKyAgc3dpdGNoIChibG9ja1R5cGUpIHsKKyAgICBjYXNlIExPTkdfV0lORE9XOgorICAgIGNhc2UgU1RPUF9XSU5ET1c6CisgICAgICBmciA9IGZyYW1lTGVuZ3RoIC0gb2Zmc2V0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBTVEFSVF9XSU5ET1c6IC8qIG9yIFN0b3BTdGFydFNlcXVlbmNlICovCisgICAgY2FzZSBTSE9SVF9XSU5ET1c6CisgICAgICBmciA9IGZyYW1lTGVuZ3RoID4+IDM7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgIHJldHVybiAtMTsKKyAgfQorCisgIG1kY3RfYmxvY2sobWRjdFBlcnMsIHRpbWVEYXRhLCBmcmFtZUxlbmd0aCwgbWRjdERhdGEsIG51bVNwZWMsIG51bU1kY3RMaW5lcywKKyAgICAgICAgICAgICBGREtnZXRXaW5kb3dTbG9wZShmciwgd2luZG93U2hhcGUpLCBmciwgbWRjdERhdGFfZSk7CisKKyAgaWYgKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpIHsKKyAgICBpZiAoIShtZGN0RGF0YV9lWzBdID09IG1kY3REYXRhX2VbMV0gJiYgbWRjdERhdGFfZVsxXSA9PSBtZGN0RGF0YV9lWzJdICYmCisgICAgICAgICAgbWRjdERhdGFfZVsyXSA9PSBtZGN0RGF0YV9lWzNdICYmIG1kY3REYXRhX2VbM10gPT0gbWRjdERhdGFfZVs0XSAmJgorICAgICAgICAgIG1kY3REYXRhX2VbNF0gPT0gbWRjdERhdGFfZVs1XSAmJiBtZGN0RGF0YV9lWzVdID09IG1kY3REYXRhX2VbNl0gJiYKKyAgICAgICAgICBtZGN0RGF0YV9lWzZdID09IG1kY3REYXRhX2VbN10pKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisgICpwcmV2V2luZG93U2hhcGUgPSB3aW5kb3dTaGFwZTsKKyAgKnBNZGN0RGF0YV9lID0gbWRjdERhdGFfZVswXTsKKworICByZXR1cm4gMDsKK30KKworSU5UIEZES2FhY0VuY19UcmFuc2Zvcm1fUmVhbF9FbGQoY29uc3QgSU5UX1BDTSAqcFRpbWVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3REYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGJsb2NrVHlwZSwgY29uc3QgSU5UIHdpbmRvd1NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwcmV2V2luZG93U2hhcGUsIGNvbnN0IElOVCBmcmFtZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbWRjdERhdGFfZSwgSU5UIGZpbHRlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgb3ZlcmxhcEFkZEJ1ZmZlcikgeworICBjb25zdCBJTlRfUENNICpSRVNUUklDVCB0aW1lRGF0YTsKIAogICBJTlQgaTsKKwogICAvKiB0bDogdHJhbnNmb3JtIGxlbmd0aAogICAgICBmbDogbGVmdCB3aW5kb3cgc2xvcGUgbGVuZ3RoCiAgICAgIG5sOiBsZWZ0IHdpbmRvdyBzbG9wZSBvZmZzZXQKICAgICAgZnI6IHJpZ2h0IHdpbmRvdyBzbG9wZSBsZW5ndGgKLSAgICAgbnI6IHJpZ2h0IHdpbmRvdyBzbG9wZSBvZmZzZXQKLSAgICAgU2VlIEZES190b29scy9kb2MvaW50ZXJuL21kY3QudGV4IGZvciBtb3JlIGRldGFpbC4gKi8KLSAgaW50IHRsLCBmbCwgbmwsIGZyLCBucjsKKyAgICAgbnI6IHJpZ2h0IHdpbmRvdyBzbG9wZSBvZmZzZXQgKi8KKyAgY29uc3QgRklYUF9XVEIgKnBXaW5kb3dFTEQgPSBOVUxMOworICBpbnQgTiA9IGZyYW1lTGVuZ3RoOworICBpbnQgTCA9IGZyYW1lTGVuZ3RoOwogCi0gIGNvbnN0IEZJWFBfV1RQICogUkVTVFJJQ1QgcExlZnRXaW5kb3dQYXJ0OwotICBjb25zdCBGSVhQX1dUUCAqIFJFU1RSSUNUIHBSaWdodFdpbmRvd1BhcnQ7CisgIHRpbWVEYXRhID0gcFRpbWVEYXRhOworCisgIGlmIChibG9ja1R5cGUgIT0gTE9OR19XSU5ET1cpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KIAogICAvKgogICAgKiBNRENUIHNjYWxlOgogICAgKiArIDE6IGZNdWx0RGl2MigpIGluIHdpbmRvd2luZy4KICAgICogKyAxOiBCZWNhdXNlIG9mIGZhY3RvciAxLzIgaW4gUHJpbmNlbi1CcmFkbGV5IGNvbXBsaWFudCB3aW5kb3dlZCBUREFDLgogICAgKi8KLSAgKm1kY3REYXRhX2UgPSAxKzE7CisgICptZGN0RGF0YV9lID0gMSArIDE7CiAKLSAgdGwgPSBmcmFtZUxlbmd0aDsKLSAgdGltZURhdGEgPSBwVGltZURhdGE7Ci0KLSAgc3dpdGNoKCBibG9ja1R5cGUgKSB7Ci0gICAgY2FzZSBMT05HX1dJTkRPVzoKLSAgICAgIHsKLSAgICAgICAgaW50IG9mZnNldCA9ICh3aW5kb3dTaGFwZSA9PSBMT0xfV0lORE9XKSA/ICgoZnJhbWVMZW5ndGggKiAzKT4+MikgOiAwOwotICAgICAgICBmbCA9IGZyYW1lTGVuZ3RoIC0gb2Zmc2V0OwotICAgICAgICBmciA9IGZyYW1lTGVuZ3RoIC0gb2Zmc2V0OwotICAgICAgfQorICBzd2l0Y2ggKGZyYW1lTGVuZ3RoKSB7CisgICAgY2FzZSA1MTI6CisgICAgICBwV2luZG93RUxEID0gRUxEQW5hbHlzaXM1MTI7CiAgICAgICBicmVhazsKLSAgICBjYXNlIFNUT1BfV0lORE9XOgotICAgICAgZmwgPSBmcmFtZUxlbmd0aCA+PiAzOwotICAgICAgZnIgPSBmcmFtZUxlbmd0aDsKKyAgICBjYXNlIDQ4MDoKKyAgICAgIHBXaW5kb3dFTEQgPSBFTERBbmFseXNpczQ4MDsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgU1RBUlRfV0lORE9XOiAvKiBvciBTdG9wU3RhcnRTZXF1ZW5jZSAqLwotICAgICAgZmwgPSBmcmFtZUxlbmd0aDsKLSAgICAgIGZyID0gZnJhbWVMZW5ndGggPj4gMzsKKyAgICBjYXNlIDI1NjoKKyAgICAgIHBXaW5kb3dFTEQgPSBFTERBbmFseXNpczI1NjsKKyAgICAgICptZGN0RGF0YV9lICs9IDE7CiAgICAgICBicmVhazsKLSAgICBjYXNlIFNIT1JUX1dJTkRPVzoKLSAgICAgIGZsID0gZnIgPSBmcmFtZUxlbmd0aCA+PiAzOwotICAgICAgdGwgPj49IDM7Ci0gICAgICB0aW1lRGF0YSA9IHBUaW1lRGF0YSArIDMqZmwgKyAoZmwvMik7CisgICAgY2FzZSAyNDA6CisgICAgICBwV2luZG93RUxEID0gRUxEQW5hbHlzaXMyNDA7CisgICAgICAqbWRjdERhdGFfZSArPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjg6CisgICAgICBwV2luZG93RUxEID0gRUxEQW5hbHlzaXMxMjg7CisgICAgICAqbWRjdERhdGFfZSArPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjA6CisgICAgICBwV2luZG93RUxEID0gRUxEQW5hbHlzaXMxMjA7CisgICAgICAqbWRjdERhdGFfZSArPSAyOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIEZES19BU1NFUlQoMCk7CiAgICAgICByZXR1cm4gLTE7Ci0gICAgICBicmVhazsKICAgfQogCi0gIC8qIFRha2VuIGZyb20gRkRLX3Rvb2xzL3NyYy9tZGN0LmNwcCBEZXJpdmUgTlIgYW5kIE5MICovCi0gIG5yID0gKHRsIC0gZnIpPj4xOwotICBubCA9ICh0bCAtIGZsKT4+MTsKKyAgZm9yIChpID0gMDsgaSA8IE4gLyA0OyBpKyspIHsKKyAgICBGSVhQX0RCTCB6MCwgb3V0dmFsOwogCi0gIHBMZWZ0V2luZG93UGFydCA9IEZES2dldFdpbmRvd1Nsb3BlKGZsLCAqcHJldldpbmRvd1NoYXBlKTsKLSAgcFJpZ2h0V2luZG93UGFydCA9IEZES2dldFdpbmRvd1Nsb3BlKGZyLCB3aW5kb3dTaGFwZSk7CisgICAgejAgPSAoZk11bHQoKEZJWFBfUENNKXRpbWVEYXRhW0wgKyBOICogMyAvIDQgLSAxIC0gaV0sCisgICAgICAgICAgICAgICAgcFdpbmRvd0VMRFtOIC8gMiAtIDEgLSBpXSkKKyAgICAgICAgICA8PCAoV1RTMCAtIDEpKSArCisgICAgICAgICAoZk11bHQoKEZJWFBfUENNKXRpbWVEYXRhW0wgKyBOICogMyAvIDQgKyBpXSwgcFdpbmRvd0VMRFtOIC8gMiArIGldKQorICAgICAgICAgIDw8IChXVFMwIC0gMSkpOwogCi0gIC8qIHdpbmRvd2luZyAqLwotICBpZiAoZmlsdGVyVHlwZSAhPSBGQl9FTEQpCi0gIHsKLSAgICAvKiBMZWZ0IHdpbmRvdyBzbG9wZSBvZmZzZXQgKi8KLSAgICBmb3IgKGk9MDsgaTxubCA7IGkrKykKLSAgICB7Ci0jaWYgU0FNUExFX0JJVFMgPT0gREZSQUNUX0JJVFMgICAvKiBTUENfQklUUyBhbmQgREZSQUNUX0JJVFMgc2hvdWxkIGJlIGVxdWFsLiAqLwotICAgICAgbWRjdERhdGFbKHRsLzIpK2ldID0gLSAoRklYUF9EQkwpIHRpbWVEYXRhW3RsLWktMV0gPj4gKCAxICk7Ci0jZWxzZQotICAgICAgbWRjdERhdGFbKHRsLzIpK2ldID0gLSAoRklYUF9EQkwpIHRpbWVEYXRhW3RsLWktMV0gPDwgKERGUkFDVF9CSVRTIC0gU0FNUExFX0JJVFMgLSAxKTsKLSNlbmRpZgotICAgIH0KLSAgICAvKiBMZWZ0IHdpbmRvdyBzbG9wZSAqLwotICAgIGZvciAoaT0wOyBpPGZsLzI7IGkrKykKLSAgICB7Ci0gICAgICBGSVhQX0RCTCB0bXAwOwotICAgICAgdG1wMCA9IGZNdWx0RGl2MigoRklYUF9QQ00pdGltZURhdGFbaStubF0sIHBMZWZ0V2luZG93UGFydFtpXS52LmltKTsKLSAgICAgIG1kY3REYXRhWyh0bC8yKStpK25sXSA9IGZNdWx0U3ViRGl2Mih0bXAwLCAoRklYUF9QQ00pdGltZURhdGFbdGwtbmwtaS0xXSwgcExlZnRXaW5kb3dQYXJ0W2ldLnYucmUpOwotICAgIH0KKyAgICBvdXR2YWwgPSAoZk11bHREaXYyKChGSVhQX1BDTSl0aW1lRGF0YVtMICsgTiAqIDMgLyA0IC0gMSAtIGldLAorICAgICAgICAgICAgICAgICAgICAgICAgcFdpbmRvd0VMRFtOICsgTiAvIDIgLSAxIC0gaV0pID4+CisgICAgICAgICAgICAgICgtV1RTMSkpOworICAgIG91dHZhbCArPSAoZk11bHREaXYyKChGSVhQX1BDTSl0aW1lRGF0YVtMICsgTiAqIDMgLyA0ICsgaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgcFdpbmRvd0VMRFtOICsgTiAvIDIgKyBpXSkgPj4KKyAgICAgICAgICAgICAgICgtV1RTMSkpOworICAgIG91dHZhbCArPSAoZk11bHREaXYyKG92ZXJsYXBBZGRCdWZmZXJbTiAvIDIgKyBpXSwgcFdpbmRvd0VMRFsyICogTiArIGldKSA+PgorICAgICAgICAgICAgICAgKC1XVFMyIC0gMSkpOwogCi0gICAgLyogUmlnaHQgd2luZG93IHNsb3BlIG9mZnNldCAqLwotICAgIGZvcihpPTA7IGk8bnI7IGkrKykKLSAgICB7Ci0jaWYgU0FNUExFX0JJVFMgPT0gREZSQUNUX0JJVFMgICAgLyogVGhpcyBzaG91bGQgYmUgU1BDX0JJVFMgaW5zdGVhZCBvZiBERlJBQ1RfQklUUy4gKi8KLSAgICAgIG1kY3REYXRhWyh0bC8yKS0xLWldID0gLSAoRklYUF9EQkwpIHRpbWVEYXRhW3RsK2ldID4+ICgxKTsKLSNlbHNlCi0gICAgICBtZGN0RGF0YVsodGwvMiktMS1pXSA9IC0gKEZJWFBfREJMKSB0aW1lRGF0YVt0bCtpXSA8PCAoREZSQUNUX0JJVFMgLSBTQU1QTEVfQklUUyAtIDEpOwotI2VuZGlmCi0gICAgfQotICAgIC8qIFJpZ2h0IHdpbmRvdyBzbG9wZSAqLwotICAgIGZvciAoaT0wOyBpPGZyLzI7IGkrKykKLSAgICB7Ci0gICAgICBGSVhQX0RCTCB0bXAxOwotICAgICAgdG1wMSA9IGZNdWx0RGl2MigoRklYUF9QQ00pdGltZURhdGFbdGwrbnIraV0sIHBSaWdodFdpbmRvd1BhcnRbaV0udi5yZSk7Ci0gICAgICBtZGN0RGF0YVsodGwvMiktbnItaS0xXSA9IC1mTXVsdEFkZERpdjIodG1wMSwgKEZJWFBfUENNKXRpbWVEYXRhWyh0bCoyKS1uci1pLTFdLCBwUmlnaHRXaW5kb3dQYXJ0W2ldLnYuaW0pOwotICAgIH0KKyAgICBvdmVybGFwQWRkQnVmZmVyW04gLyAyICsgaV0gPSBvdmVybGFwQWRkQnVmZmVyW2ldOworCisgICAgb3ZlcmxhcEFkZEJ1ZmZlcltpXSA9IHowOworICAgIG1kY3REYXRhW2ldID0gb3ZlcmxhcEFkZEJ1ZmZlcltOIC8gMiArIGldICsKKyAgICAgICAgICAgICAgICAgIChmTXVsdERpdjIob3ZlcmxhcEFkZEJ1ZmZlcltOICsgTiAvIDIgLSAxIC0gaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXaW5kb3dFTERbMiAqIE4gKyBOIC8gMiArIGldKSA+PgorICAgICAgICAgICAgICAgICAgICgtV1RTMiAtIDEpKTsKKworICAgIG1kY3REYXRhW04gLSAxIC0gaV0gPSBvdXR2YWw7CisgICAgb3ZlcmxhcEFkZEJ1ZmZlcltOICsgTiAvIDIgLSAxIC0gaV0gPSBvdXR2YWw7CiAgIH0KIAotICBpZiAoZmlsdGVyVHlwZSA9PSBGQl9FTEQpCi0gIHsKLSAgICBjb25zdCBGSVhQX1dUQiAqcFdpbmRvd0VMRD1OVUxMOwotICAgIGludCBpLCBOID0gZnJhbWVMZW5ndGgsIEwgPSBmcmFtZUxlbmd0aDsKKyAgZm9yIChpID0gTiAvIDQ7IGkgPCBOIC8gMjsgaSsrKSB7CisgICAgRklYUF9EQkwgejAsIG91dHZhbDsKIAotICAgIGlmIChmcmFtZUxlbmd0aCA9PSA1MTIpIHsKLSAgICAgIHBXaW5kb3dFTEQgPSBFTERBbmFseXNpczUxMjsKLSAgICB9IGVsc2UgewotICAgICAgcFdpbmRvd0VMRCA9IEVMREFuYWx5c2lzNDgwOwotICAgIH0KKyAgICB6MCA9IGZNdWx0KChGSVhQX1BDTSl0aW1lRGF0YVtMICsgTiAqIDMgLyA0IC0gMSAtIGldLAorICAgICAgICAgICAgICAgcFdpbmRvd0VMRFtOIC8gMiAtIDEgLSBpXSkKKyAgICAgICAgIDw8IChXVFMwIC0gMSk7CiAKLSAgICBmb3IoaT0wO2k8Ti80O2krKykKLSAgICB7Ci0gICAgICBGSVhQX0RCTCB6MCwgb3V0dmFsOworICAgIG91dHZhbCA9IChmTXVsdERpdjIoKEZJWFBfUENNKXRpbWVEYXRhW0wgKyBOICogMyAvIDQgLSAxIC0gaV0sCisgICAgICAgICAgICAgICAgICAgICAgICBwV2luZG93RUxEW04gKyBOIC8gMiAtIDEgLSBpXSkgPj4KKyAgICAgICAgICAgICAgKC1XVFMxKSk7CisgICAgb3V0dmFsICs9IChmTXVsdERpdjIob3ZlcmxhcEFkZEJ1ZmZlcltOIC8gMiArIGldLCBwV2luZG93RUxEWzIgKiBOICsgaV0pID4+CisgICAgICAgICAgICAgICAoLVdUUzIgLSAxKSk7CiAKLSAgICAgIHowID0gKGZNdWx0KChGSVhQX1BDTSl0aW1lRGF0YVtMK04qMy80LTEtaV0sIHBXaW5kb3dFTERbTi8yLTEtaV0pPDwgKFdUUzAtMSkpICsgKGZNdWx0KChGSVhQX1BDTSl0aW1lRGF0YVtMK04qMy80K2ldLCBwV2luZG93RUxEW04vMitpXSk8PCAoV1RTMC0xKSk7CisgICAgb3ZlcmxhcEFkZEJ1ZmZlcltOIC8gMiArIGldID0KKyAgICAgICAgb3ZlcmxhcEFkZEJ1ZmZlcltpXSArCisgICAgICAgIChmTXVsdCgoRklYUF9QQ00pdGltZURhdGFbTCAtIE4gLyA0ICsgaV0sIHBXaW5kb3dFTERbTiAvIDIgKyBpXSkKKyAgICAgICAgIDw8IChXVFMwIC0gMSkpOwogCi0gICAgICBvdXR2YWwgID0gKGZNdWx0RGl2MigoRklYUF9QQ00pdGltZURhdGFbTCtOKjMvNC0xLWldLCBwV2luZG93RUxEW04rTi8yLTEtaV0pID4+ICgtV1RTMSkpOwotICAgICAgb3V0dmFsICs9IChmTXVsdERpdjIoKEZJWFBfUENNKXRpbWVEYXRhW0wrTiozLzQraV0sIHBXaW5kb3dFTERbTitOLzIraV0pID4+ICgtV1RTMSkgKTsKLSAgICAgIG91dHZhbCArPSAoZk11bHREaXYyKG92ZXJsYXBBZGRCdWZmZXJbTi8yK2ldLCBwV2luZG93RUxEWzIqTitpXSk+PiAoLVdUUzItMSkpOworICAgIG92ZXJsYXBBZGRCdWZmZXJbaV0gPSB6MDsKKyAgICBtZGN0RGF0YVtpXSA9IG92ZXJsYXBBZGRCdWZmZXJbTiAvIDIgKyBpXSArCisgICAgICAgICAgICAgICAgICAoZk11bHREaXYyKG92ZXJsYXBBZGRCdWZmZXJbTiArIE4gLyAyIC0gMSAtIGldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV2luZG93RUxEWzIgKiBOICsgTiAvIDIgKyBpXSkgPj4KKyAgICAgICAgICAgICAgICAgICAoLVdUUzIgLSAxKSk7CiAKLSAgICAgIG92ZXJsYXBBZGRCdWZmZXJbTi8yK2ldID0gb3ZlcmxhcEFkZEJ1ZmZlcltpXTsKLQotICAgICAgb3ZlcmxhcEFkZEJ1ZmZlcltpXSA9IHowOwotICAgICAgbWRjdERhdGFbaV0gPSBvdmVybGFwQWRkQnVmZmVyW04vMitpXSArIChmTXVsdERpdjIob3ZlcmxhcEFkZEJ1ZmZlcltOK04vMi0xLWldLCBwV2luZG93RUxEWzIqTitOLzIraV0pID4+ICgtV1RTMi0xKSk7Ci0KLSAgICAgIG1kY3REYXRhW04tMS1pXSA9IG91dHZhbDsKLSAgICAgIG92ZXJsYXBBZGRCdWZmZXJbTitOLzItMS1pXSA9IG91dHZhbDsKLSAgICB9Ci0KLSAgICBmb3IoaT1OLzQ7aTxOLzI7aSsrKQotICAgIHsKLSAgICAgIEZJWFBfREJMIHowLCBvdXR2YWw7Ci0KLSAgICAgIHowID0gZk11bHQoKEZJWFBfUENNKXRpbWVEYXRhW0wrTiozLzQtMS1pXSwgcFdpbmRvd0VMRFtOLzItMS1pXSkgPDwgKFdUUzAtMSk7Ci0KLSAgICAgIG91dHZhbCAgPSAoZk11bHREaXYyKChGSVhQX1BDTSl0aW1lRGF0YVtMK04qMy80LTEtaV0sIHBXaW5kb3dFTERbTitOLzItMS1pXSkgPj4gKC1XVFMxKSkgOwotICAgICAgb3V0dmFsICs9IChmTXVsdERpdjIob3ZlcmxhcEFkZEJ1ZmZlcltOLzIraV0sIHBXaW5kb3dFTERbMipOK2ldKSA+PiAoLVdUUzItMSkpOwotCi0gICAgICBvdmVybGFwQWRkQnVmZmVyW04vMitpXSA9IG92ZXJsYXBBZGRCdWZmZXJbaV0gKyAoZk11bHQoKEZJWFBfUENNKXRpbWVEYXRhW0wtTi80K2ldLCBwV2luZG93RUxEW04vMitpXSk8PCAoV1RTMC0xKSApOwotCi0gICAgICBvdmVybGFwQWRkQnVmZmVyW2ldID0gejA7Ci0gICAgICBtZGN0RGF0YVtpXSA9IG92ZXJsYXBBZGRCdWZmZXJbTi8yK2ldICsgKGZNdWx0RGl2MihvdmVybGFwQWRkQnVmZmVyW04rTi8yLTEtaV0sIHBXaW5kb3dFTERbMipOK04vMitpXSkgPj4gKC1XVFMyLTEpKTsKLQotICAgICAgbWRjdERhdGFbTi0xLWldID0gb3V0dmFsOwotICAgICAgb3ZlcmxhcEFkZEJ1ZmZlcltOK04vMi0xLWldID0gb3V0dmFsOwotICAgIH0KKyAgICBtZGN0RGF0YVtOIC0gMSAtIGldID0gb3V0dmFsOworICAgIG92ZXJsYXBBZGRCdWZmZXJbTiArIE4gLyAyIC0gMSAtIGldID0gb3V0dmFsOwogICB9Ci0KLSAgZGN0X0lWKG1kY3REYXRhLCB0bCwgbWRjdERhdGFfZSk7CisgIGRjdF9JVihtZGN0RGF0YSwgZnJhbWVMZW5ndGgsIG1kY3REYXRhX2UpOwogCiAgICpwcmV2V2luZG93U2hhcGUgPSB3aW5kb3dTaGFwZTsKIAogICByZXR1cm4gMDsKIH0KLQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy90cmFuc2Zvcm0uaCBiL2xpYkFBQ2VuYy9zcmMvdHJhbnNmb3JtLmgKaW5kZXggNTA1MzE3NC4uOGY1ZmY0NiAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy90cmFuc2Zvcm0uaAorKysgYi9saWJBQUNlbmMvc3JjL3RyYW5zZm9ybS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE4ICs5MCwyMCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFBQyBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBXZXJuZXIKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBNRENUIFRyYW5zZm9ybQorICAgQXV0aG9yKHMpOiAgIE0uIFdlcm5lcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogTURDVCBUcmFuc2Zvcm0KIAotI2lmbmRlZiBfVFJBTlNGT1JNX0gKLSNkZWZpbmUgX1RSQU5TRk9STV9ICisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZuZGVmIFRSQU5TRk9STV9ICisjZGVmaW5lIFRSQU5TRk9STV9ICisKKyNpbmNsdWRlICJtZGN0LmgiCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCiAjZGVmaW5lIFdUUzAgMQpAQCAtMTA1LDE5ICsxMTgsNDYgQEAKICAqICAgICAgICBMT05HX1dJTkRPVywgU1RBUlRfV0lORE9XLCBTSE9SVF9XSU5ET1cgb3IgU1RPUF9XSU5ET1cuCiAgKiBccGFyYW0gd2luZG93U2hhcGUgaW5kZXggaW5kaWNhdGluZyB0aGUgd2luZG93IHNsb3BlIHR5cGUgdG8gYmUgdXNlZC4KICAqICAgICAgICBWYWx1ZXMgYWxsb3dlZCBhcmUgZWl0aGVyIFNJTkVfV0lORE9XIG9yIEtCRF9XSU5ET1cuCi0gKiBccGFyYW0gZnJhbWVMZW5ndGggbGVuZ3RoIG9mIHRoZSBibG9jay4KKyAqIFxwYXJhbSBwcmV2aW5kb3dTaGFwZSBpbmRleCBpbmRpY2F0aW5nIHRoZSB3aW5kb3cgc2xvcGUgdHlwZSB1c2VkCisgKiAgICAgICAgaW4gdGhlIGxhc3QgZnJhbWUuCisgKiAgICAgICAgVmFsdWVzIGFsbG93ZWQgYXJlIGVpdGhlciBTSU5FX1dJTkRPVyBvciBLQkRfV0lORE9XLgorICogXHBhcmFtIGZyYW1lTGVuZ3RoIGxlbmd0aCBvZiB0aGUgYmxvY2suIEVpdGhlciAxMDI0IG9yIDk2MC4KICAqIFxwYXJhbSBtZGN0RGF0YV9lIHBvaW50ZXIgdG8gYW4gSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgZnJlcXVlbmN5CiAgKiAgICAgICAgZG9tYWluIG91dHB1dCBkYXRhIGlzIHN0b3JlZCBpbnRvLgotICogXHJldHVybiAwIGluIGNhc2Ugb2Ygc3VjY2Vzcywgbm9uLXplcm8gaW4gY2FzZSBvZiBlcnJvciAoaW5jb25zaXN0ZW50IHBhcmFtZXRlcnMpLgorICogXHBhcmFtIGZpbHRlclR5cGUgeHh4CisgKiBccmV0dXJuIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBub24temVybyBpbiBjYXNlIG9mIGVycm9yIChpbmNvbnNpc3RlbnQKKyAqIHBhcmFtZXRlcnMpLgogICovCi1JTlQgRkRLYWFjRW5jX1RyYW5zZm9ybV9SZWFsIChjb25zdCBJTlRfUENNICp0aW1lRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBtZGN0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBibG9ja1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgd2luZG93U2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnByZXZXaW5kb3dTaGFwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBmcmFtZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbWRjdERhdGFfZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBmaWx0ZXJUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICxGSVhQX0RCTCAqIFJFU1RSSUNUIG92ZXJsYXBBZGRCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSNlbmRpZgorSU5UIEZES2FhY0VuY19UcmFuc2Zvcm1fUmVhbChjb25zdCBJTlRfUENNKiBwVGltZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiBSRVNUUklDVCBtZGN0RGF0YSwgY29uc3QgSU5UIGJsb2NrVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHdpbmRvd1NoYXBlLCBJTlQqIHByZXZXaW5kb3dTaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSF9NRENUIG1kY3RQZXJzLCBjb25zdCBJTlQgZnJhbWVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogcE1kY3REYXRhX2UsIElOVCBmaWx0ZXJUeXBlKTsKKworLyoqCisgKiBcYnJpZWY6IFBlcmZvcm1lIEVMRCBmaWx0ZXJibmFuayB0cmFuc2Zvcm0gb2YgdGltZSBkb21haW4gZGF0YS4KKyAqIFxwYXJhbSB0aW1lRGF0YSBwb2ludGVyIHRvIHRpbWUgZG9tYWluIGlucHV0IHNpZ25hbC4KKyAqIFxwYXJhbSBtZGN0RGF0YSBwb2ludGVyIHRvIHN0b3JlIGZyZXF1ZW5jeSBkb21haW4gb3V0cHV0IGRhdGEuCisgKiBccGFyYW0gYmxvY2tUeXBlIGluZGV4IGluZGljYXRpbmcgdGhlIHR5cGUgb2YgYmxvY2suIEVpdGhlcgorICogICAgICAgIExPTkdfV0lORE9XLCBTVEFSVF9XSU5ET1csIFNIT1JUX1dJTkRPVyBvciBTVE9QX1dJTkRPVy4KKyAqIFxwYXJhbSB3aW5kb3dTaGFwZSBpbmRleCBpbmRpY2F0aW5nIHRoZSB3aW5kb3cgc2xvcGUgdHlwZSB0byBiZSB1c2VkLgorICogICAgICAgIFZhbHVlcyBhbGxvd2VkIGFyZSBlaXRoZXIgU0lORV9XSU5ET1cgb3IgS0JEX1dJTkRPVy4KKyAqIFxwYXJhbSBwcmV2aW5kb3dTaGFwZSBpbmRleCBpbmRpY2F0aW5nIHRoZSB3aW5kb3cgc2xvcGUgdHlwZSB1c2VkCisgKiAgICAgICAgaW4gdGhlIGxhc3QgZnJhbWUuCisgKiAgICAgICAgVmFsdWVzIGFsbG93ZWQgYXJlIGVpdGhlciBTSU5FX1dJTkRPVyBvciBLQkRfV0lORE9XLgorICogXHBhcmFtIGZyYW1lTGVuZ3RoIGxlbmd0aCBvZiB0aGUgYmxvY2suIEVpdGhlciAxMDI0IG9yIDk2MC4KKyAqIFxwYXJhbSBtZGN0RGF0YV9lIHBvaW50ZXIgdG8gYW4gSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgZnJlcXVlbmN5CisgKiAgICAgICAgZG9tYWluIG91dHB1dCBkYXRhIGlzIHN0b3JlZCBpbnRvLgorICogXHBhcmFtIGZpbHRlclR5cGUgeHh4CisgKiBccGFyYW0gb3ZlcmxhcEFkZEJ1ZmZlciBvdmVybGFwIGFkZCBidWZmZXIgZm9yIG92ZXJsYXAgb2YgRUxEIGZpbHRlcmJhbmsKKyAqIFxyZXR1cm4gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIG5vbi16ZXJvIGluIGNhc2Ugb2YgZXJyb3IgKGluY29uc2lzdGVudAorICogcGFyYW1ldGVycykuCisgKi8KK0lOVCBGREthYWNFbmNfVHJhbnNmb3JtX1JlYWxfRWxkKGNvbnN0IElOVF9QQ00qIHBUaW1lRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiBSRVNUUklDVCBtZGN0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBibG9ja1R5cGUsIGNvbnN0IElOVCB3aW5kb3dTaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogcHJldldpbmRvd1NoYXBlLCBjb25zdCBJTlQgZnJhbWVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQqIG1kY3REYXRhX2UsIElOVCBmaWx0ZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqIFJFU1RSSUNUIG92ZXJsYXBBZGRCdWZmZXIpOworCisjZW5kaWYgLyogIyFkZWZpbmVkIChUUkFOU0ZPUk1fSCkgKi8KZGlmZiAtLWdpdCBhL2xpYkFyaXRoQ29kaW5nL2luY2x1ZGUvYWNfYXJpdGhfY29kZXIuaCBiL2xpYkFyaXRoQ29kaW5nL2luY2x1ZGUvYWNfYXJpdGhfY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzBjMTg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliQXJpdGhDb2RpbmcvaW5jbHVkZS9hY19hcml0aF9jb2Rlci5oCkBAIC0wLDAgKzEsMTQyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBBcml0aG1ldGljIGNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBPbGl2ZXIgV2Vpc3MKKworICAgRGVzY3JpcHRpb246IEludGVyZmFjZSBmb3IgU3BlY3RyYWwgTm9pc2VsZXNzIENvZGluZyBTY2hlbWUgYmFzZWQgb24gYW4KKyAgICAgICAgICAgICAgICBBcml0aG1ldGljIENvZGVyIGluIENvbmp1bmN0aW9uIHdpdGggYW4gQWRhcHRpdmUgQ29udGV4dAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFDX0FSSVRIX0NPREVSX0gKKyNkZWZpbmUgQUNfQVJJVEhfQ09ERVJfSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKworI2luY2x1ZGUgIkZES19hdWRpby5oIgorCit0eXBlZGVmIGVudW0geyBBUklUSF9DT0RFUl9PSyA9IDAsIEFSSVRIX0NPREVSX0VSUk9SID0gNSB9IEFSSVRIX0NPRElOR19FUlJPUjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBTSE9SVCBtX251bWJlckxpbmVzUHJldjsKKyAgVUNIQVIgY19wcmV2WygxMDI0IC8gMikgKyA0XTsgLyogMi10dXBsZSBjb250ZXh0IG9mIHByZXZpb3VzIGZyYW1lLCA0IGJpdCAqLworfSBDQXJjb0RhdGE7CisKKy8qIHByb3RvdHlwZXMgKi8KKworQ0FyY29EYXRhICpDQXJjb19DcmVhdGUodm9pZCk7CisKK3ZvaWQgQ0FyY29fRGVzdHJveShDQXJjb0RhdGEgKnBBcmNvRGF0YSk7CisKKy8qKgorICogXGJyaWVmIGRlY29kZSBhIHNwZWN0cmFsIGRhdGEgZWxlbWVudCBieSB1c2luZyBhbiBhZGFwdGl2ZSBjb250ZXh0IGRlcGVuZGVudAorICogYXJpdGhtZXRpYyBjb2Rpbmcgc2NoZW1lCisgKiBccGFyYW0gaEJzIGJpdCBzdHJlYW0gaGFuZGxlCisgKiBccGFyYW0gc3BlY3RydW0gcG9pbnRlciB0byBxdWFudGl6ZWQgZGF0YSBvdXRwdXQuCisgKiBccGFyYW0gbGcgbnVtYmVyIG9mIHF1YW50aXplZCBzcGVjdHJhbCBjb2VmZmljaWVudHMgKG91dHB1dCBieSB0aGUgYXJpdGhtZXRpYworICogZGVjb2RlcikuCisgKiBccGFyYW0gbGdfbWF4IG1heCBudW1iZXIgb2YgcXVhbnRpemVkIHNwZWN0cmFsIGNvZWZmaWNpZW50cy4KKyAqIFxwYXJhbSBhcml0aF9yZXNldF9mbGFnIGZsYWcgd2hpY2ggaW5kaWNhdGVzIGlmIHRoZSBzcGVjdHJhbCBub2lzZWxlc3MKKyAqIGNvbnRleHQgbXVzdCBiZSByZXNldAorICogXHJldHVybiB2b2lkCisgKi8KK0FSSVRIX0NPRElOR19FUlJPUiBDQXJjb19EZWNvZGVBcml0aERhdGEoQ0FyY29EYXRhICpwQXJjb0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHNwZWN0cnVtLCBpbnQgbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZ19tYXgsIGludCBhcml0aF9yZXNldF9mbGFnKTsKKworI2VuZGlmIC8qIEFDX0FSSVRIX0NPREVSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFyaXRoQ29kaW5nL3NyYy9hY19hcml0aF9jb2Rlci5jcHAgYi9saWJBcml0aENvZGluZy9zcmMvYWNfYXJpdGhfY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OTFmMzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJBcml0aENvZGluZy9zcmMvYWNfYXJpdGhfY29kZXIuY3BwCkBAIC0wLDAgKzEsNzc3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBBcml0aG1ldGljIGNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBZb3VsaXkgTmlub3YsIE9saXZlciBXZWlzcworCisgICBEZXNjcmlwdGlvbjogRGVmaW5pdGlvbiBvZiBTcGVjdHJhbCBOb2lzZWxlc3MgQ29kaW5nIFNjaGVtZSBiYXNlZCBvbiBhbgorICAgICAgICAgICAgICAgIEFyaXRobWV0aWMgQ29kZXIgaW4gQ29uanVuY3Rpb24gd2l0aCBhbiBBZGFwdGl2ZSBDb250ZXh0CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJhY19hcml0aF9jb2Rlci5oIgorCisjZGVmaW5lIGNiaXRzbmV3IDE2CisjZGVmaW5lIHN0YXRfYml0c25ldyAxNAorI2RlZmluZSBhcmlfcTRuZXcgKCgobG9uZykxIDw8IGNiaXRzbmV3KSAtIDEpIC8qIDB4RkZGRiAqLworI2RlZmluZSBhcmlfcTFuZXcgKGFyaV9xNG5ldyAvIDQgKyAxKSAgICAgICAgIC8qIDB4NDAwMCAqLworI2RlZmluZSBhcmlfcTJuZXcgKDIgKiBhcmlfcTFuZXcpICAgICAgICAgICAgIC8qIDB4ODAwMCAqLworI2RlZmluZSBhcmlfcTNuZXcgKDMgKiBhcmlfcTFuZXcpICAgICAgICAgICAgIC8qIDB4QzAwMCAqLworCisjZGVmaW5lIFZBTF9FU0MgMTYKKworLyogQXJpdGhtZXRpYyBjb2RlciBsaWJyYXJ5IGluZm8gKi8KKyNkZWZpbmUgQUNfTElCX1ZMMCAyCisjZGVmaW5lIEFDX0xJQl9WTDEgMAorI2RlZmluZSBBQ19MSUJfVkwyIDAKKyNkZWZpbmUgQUNfTElCX1RJVExFICJBcml0aG1ldGljIENvZGVyIExpYiIKKyNpZmRlZiBfX0FORFJPSURfXworI2RlZmluZSBBQ19MSUJfQlVJTERfREFURSAiIgorI2RlZmluZSBBQ19MSUJfQlVJTERfVElNRSAiIgorI2Vsc2UKKyNkZWZpbmUgQUNfTElCX0JVSUxEX0RBVEUgX19EQVRFX18KKyNkZWZpbmUgQUNfTElCX0JVSUxEX1RJTUUgX19USU1FX18KKyNlbmRpZgorCitjb25zdCBTSE9SVCBhcmlfbHNiMlszXVs0XSA9IHsKKyAgICB7MTI1NzEsIDEwNTY5LCAzNjk2LCAwfSwgezEyNjYxLCA1NzAwLCAzNzUxLCAwfSwgezEwODI3LCA2ODg0LCAyOTI5LCAwfX07CisKK0hfQUxMT0NfTUVNKEFyY29EYXRhLCBDQXJjb0RhdGEpCisvKiEgVGhlIHN0cnVjdHVyZSBBcmNvRGF0YSBjb250YWlucyAyLXR1cGxlIGNvbnRleHQgb2YgcHJldmlvdXMgZnJhbWUuIDxicj4KKyAgICBEaW1lbnNpb246IDEgKi8KK0NfQUxMT0NfTUVNKEFyY29EYXRhLCBDQXJjb0RhdGEsIDEpCisKKy8qCisgICBUaGlzIGRlZmluZSB0cmlnZ2VycyB0aGUgdXNlIG9mIHRoZSBwcmUta25vd24gcmV0dXJuIHZhbHVlcyBvZiBmdW5jdGlvbgorICAgZ2V0X3BrX3YyKCkgZm9yIHRoZSBjYXNlcywgd2hlcmUgcGFyYW1ldGVyIHMgaXMgaW4gcmFuZ2UKKyAgIDB4MDAwMDAwMDAuLjB4MDAwMDAwMEYuIE5vdGU6IFRoZXNlIDE2IGJ5dGVzIGhhdmUgYmVlbiBtb3ZlZCBpbnRvIHRoZSBmaXJzdCA0CisgICBlbnRyaWVzIG9mIGFyaV9tZXJnZWRfaGFzaF9wcyB0aGF0IGFyZSBubyBtb3JlIHJlZmVyZW5jZWQuCisqLworCitzdGF0aWMgY29uc3QgVUxPTkcgYXJpX21lcmdlZF9oYXNoX3BzWzc0Ml0gPSB7CisgICAgMHgwMDAwMTA0NFVMLCAweDAwMDAzRDBBVUwsIDB4MDAwMDUzNTBVTCwgMHgwMDAwNzRENlVMLCAweDAwMDBBNDlGVUwsCisgICAgMHgwMDAwRjk2RVVMLCAweDAwMTExMDAwVUwsIDB4MDExMTFFODNVTCwgMHgwMTExMzE0NlVMLCAweDAxMTE0MDM2VUwsCisgICAgMHgwMTExNjg2M1VMLCAweDAxMTE5NEU5VUwsIDB4MDExMUY3RUVVTCwgMHgwMTEyMjY5QlVMLCAweDAxMTI0Nzc1VUwsCisgICAgMHgwMTEyNkRBMVVMLCAweDAxMTJEOTEyVUwsIDB4MDExMzFBRjBVTCwgMHgwMTEzMzZERFVMLCAweDAxMTM1Q0Y1VUwsCisgICAgMHgwMTEzOURGOFVMLCAweDAxMTQxQTVCVUwsIDB4MDExNDQ3NzNVTCwgMHgwMTE0NkNGNVVMLCAweDAxMTRGREU5VUwsCisgICAgMHgwMTE2NkNGNVVMLCAweDAxMTZGREU0VUwsIDB4MDExNzRDRjNVTCwgMHgwMTFGRkRDRlVMLCAweDAxMjExQ0MyVUwsCisgICAgMHgwMTIxM0IyRFVMLCAweDAxMjE0MDM2VUwsIDB4MDEyMTY4NjNVTCwgMHgwMTIxOTREMlVMLCAweDAxMjIxOTdGVUwsCisgICAgMHgwMTIyM0FBRFVMLCAweDAxMjI0MDM2VUwsIDB4MDEyMjY4NzhVTCwgMHgwMTIyQTkyOVVMLCAweDAxMjJGNEFCVUwsCisgICAgMHgwMTIzMkIyRFVMLCAweDAxMjM0N0I2VUwsIDB4MDEyMzdERjhVTCwgMHgwMTIzQjkyOVVMLCAweDAxMjQxN0REVUwsCisgICAgMHgwMTI0NUQ3NlVMLCAweDAxMjQ5REY4VUwsIDB4MDEyNEY5MTJVTCwgMHgwMTI1NUQ3NVVMLCAweDAxMjVGREU5VUwsCisgICAgMHgwMTI2NUQ3NVVMLCAweDAxMkI4REY3VUwsIDB4MDEzMTFFMkFVTCwgMHgwMTMxM0I1RVVMLCAweDAxMzE2ODdCVUwsCisgICAgMHgwMTMyMUE2RFVMLCAweDAxMzIzN0JDVUwsIDB4MDEzMjY4NjNVTCwgMHgwMTMyRjRFRVVMLCAweDAxMzMyQjVFVUwsCisgICAgMHgwMTMzNURBMVVMLCAweDAxMzM4RTI0VUwsIDB4MDEzNDFBNUVVTCwgMHgwMTM0M0RCNlVMLCAweDAxMzQ4REY4VUwsCisgICAgMHgwMTM1MTkzNVVMLCAweDAxMzU1REI3VUwsIDB4MDEzNUZFMTJVTCwgMHgwMTM3NkRGN1VMLCAweDAxM0ZGRTI5VUwsCisgICAgMHgwMTQwMDAyNFVMLCAweDAxNDIzODIxVUwsIDB4MDE0MzE4RjZVTCwgMHgwMTQzMzgyMVVMLCAweDAxNDNGOEU1VUwsCisgICAgMHgwMTQ0M0RBMVVMLCAweDAxNDg2RTM4VUwsIDB4MDE0RkY5MjlVTCwgMHgwMTU0M0VFM1VMLCAweDAxNUZGOTEyVUwsCisgICAgMHgwMTZGMjk4Q1VMLCAweDAxOEE1QTY5VUwsIDB4MDIxMDA3RjFVTCwgMHgwMjExMkMyQ1VMLCAweDAyMTE0QjQ4VUwsCisgICAgMHgwMjExNzM1M1VMLCAweDAyMTFGNEFFVUwsIDB4MDIxMjJGRUFVTCwgMHgwMjEyNEI0OFVMLCAweDAyMTI3ODUwVUwsCisgICAgMHgwMjEyRjcyRVVMLCAweDAyMTMzQTlFVUwsIDB4MDIxMzQwMzZVTCwgMHgwMjEzODg2NFVMLCAweDAyMTQxNEFEVUwsCisgICAgMHgwMjE0Mzc5RVVMLCAweDAyMTQ1REI2VUwsIDB4MDIxNEZFMUZVTCwgMHgwMjE2NkRCN1VMLCAweDAyMjAwREM0VUwsCisgICAgMHgwMjIxMkZFQVVMLCAweDAyMjE0N0EwVUwsIDB4MDIyMTgzNjlVTCwgMHgwMjIxRjdFRVVMLCAweDAyMjIyQUFEVUwsCisgICAgMHgwMjIyNDc4OFVMLCAweDAyMjI2ODYzVUwsIDB4MDIyMjk5MjlVTCwgMHgwMjIyRjRBQlVMLCAweDAyMjMyQTlFVUwsCisgICAgMHgwMjIzNEYwOFVMLCAweDAyMjM3ODY0VUwsIDB4MDIyM0E5MjlVTCwgMHgwMjI0MTdERVVMLCAweDAyMjQ0RjM2VUwsCisgICAgMHgwMjI0ODg2M1VMLCAweDAyMjUxQTc0VUwsIDB4MDIyNTZEQTFVTCwgMHgwMjI1RkUxMlVMLCAweDAyMjYzREI2VUwsCisgICAgMHgwMjI3NkRGN1VMLCAweDAyMkZGRTI5VUwsIDB4MDIzMTE4NkRVTCwgMHgwMjMxMzdCQ1VMLCAweDAyMzE0MDIwVUwsCisgICAgMHgwMjMxOUVENlVMLCAweDAyMzIxOTZEVUwsIDB4MDIzMjM3QkNVTCwgMHgwMjMyNTgwOVVMLCAweDAyMzI5NDI5VUwsCisgICAgMHgwMjMzMTdFRFVMLCAweDAyMzMzRjA4VUwsIDB4MDIzMzU4MDlVTCwgMHgwMjMzNzhFNFVMLCAweDAyMzQxQTdDVUwsCisgICAgMHgwMjM0NDIyMVVMLCAweDAyMzRBOEQzVUwsIDB4MDIzNTE0QkNVTCwgMHgwMjM1NDIyMVVMLCAweDAyMzVGOERGVUwsCisgICAgMHgwMjM2NDg2MVVMLCAweDAyM0ZGRTI5VUwsIDB4MDI0MDAwMjRVTCwgMHgwMjQxNTgzQlVMLCAweDAyNDIxNEM4VUwsCisgICAgMHgwMjQyNDgwOVVMLCAweDAyNDI3RUU2VUwsIDB4MDI0MzE3MDhVTCwgMHgwMjQzNDgwOVVMLCAweDAyNDM2RUQwVUwsCisgICAgMHgwMjQ0MUE3NlVMLCAweDAyNDQzODIxVUwsIDB4MDI0NDU4RTNVTCwgMHgwMjQ0RjkxRlVMLCAweDAyNDU0ODYzVUwsCisgICAgMHgwMjQ2MTkwQVVMLCAweDAyNDY0ODYzVUwsIDB4MDI0RkY5MjlVTCwgMHgwMjUyNUVEMFVMLCAweDAyNTMxNEUxVUwsCisgICAgMHgwMjUzNDhGQlVMLCAweDAyNTQxOUExVUwsIDB4MDI1NDU4RDBVTCwgMHgwMjU0RjRFNVVMLCAweDAyNTUyODYxVUwsCisgICAgMHgwMjVGRjkxMlVMLCAweDAyNjY1OTkzVUwsIDB4MDI3RjVBNjlVTCwgMHgwMjlGMTQ4MVVMLCAweDAyQ0YyOEE0VUwsCisgICAgMHgwMzEwMEFGMFVMLCAweDAzMTEyMEFBVUwsIDB4MDMxMTQ3QTBVTCwgMHgwMzExODM1NlVMLCAweDAzMTIxN0VDVUwsCisgICAgMHgwMzEyM0I1RVVMLCAweDAzMTI0MDA4VUwsIDB4MDMxMjczNTBVTCwgMHgwMzEzMTRBQVVMLCAweDAzMTMyMDFFVUwsCisgICAgMHgwMzEzNEYwOFVMLCAweDAzMTM2ODYzVUwsIDB4MDMxNDFBNUVVTCwgMHgwMzE0M0YzQ1VMLCAweDAzMjAwODQ3VUwsCisgICAgMHgwMzIxMkFBRFVMLCAweDAzMjE0RjIwVUwsIDB4MDMyMThFRDZVTCwgMHgwMzIyMThBRFVMLCAweDAzMjIzN0JDVUwsCisgICAgMHgwMzIyNTgwOVVMLCAweDAzMjI5NDE2VUwsIDB4MDMyMzE3RURVTCwgMHgwMzIzNEYyMFVMLCAweDAzMjM3MzUwVUwsCisgICAgMHgwMzIzRkE2QlVMLCAweDAzMjQzRjA4VUwsIDB4MDMyNDY4NjNVTCwgMHgwMzI0RjkyNVVMLCAweDAzMjU0MjIxVUwsCisgICAgMHgwMzI1RjhERlVMLCAweDAzMjY0ODIxVUwsIDB4MDMyRkZFMjlVTCwgMHgwMzMxMUU0N1VMLCAweDAzMzEzRjA4VUwsCisgICAgMHgwMzMxNTgwRFVMLCAweDAzMzIxNERFVUwsIDB4MDMzMjNGMDhVTCwgMHgwMzMyNDAyMFVMLCAweDAzMzI2MzUwVUwsCisgICAgMHgwMzMyOTRFOVVMLCAweDAzMzMxN0RFVUwsIDB4MDMzMzNGMDhVTCwgMHgwMzMzNjI3QlVMLCAweDAzMzNBOUE5VUwsCisgICAgMHgwMzM0MTdGQ1VMLCAweDAzMzQzMjIwVUwsIDB4MDMzNDYyN0JVTCwgMHgwMzM0QTlBOVVMLCAweDAzMzUxNDhBVUwsCisgICAgMHgwMzM1MzIyMFVMLCAweDAzMzU4OEU0VUwsIDB4MDMzNjFBNEFVTCwgMHgwMzM2MzgyMVVMLCAweDAzMzZGOEQyVUwsCisgICAgMHgwMzM3Njg2M1VMLCAweDAzNDExOTM5VUwsIDB4MDM0MTU4M0JVTCwgMHgwMzQyMTRDOFVMLCAweDAzNDI0ODA5VUwsCisgICAgMHgwMzQyNkVEMFVMLCAweDAzNDMxNTg4VUwsIDB4MDM0MzQ4MDlVTCwgMHgwMzQzNkVEMFVMLCAweDAzNDQxQTQ4VUwsCisgICAgMHgwMzQ0NDgwRFVMLCAweDAzNDQ2RUQwVUwsIDB4MDM0NTFBNEFVTCwgMHgwMzQ1MzgwOVVMLCAweDAzNDU1RUZCVUwsCisgICAgMHgwMzQ2MTRDQVVMLCAweDAzNDYzODQ5VUwsIDB4MDM0Rjg5MjRVTCwgMHgwMzUwMEE2OVVMLCAweDAzNTI1MkQwVUwsCisgICAgMHgwMzUzMTRFMFVMLCAweDAzNTMzMjREVUwsIDB4MDM1MzVFRDBVTCwgMHgwMzU0MTRFMFVMLCAweDAzNTQzMjREVUwsCisgICAgMHgwMzU0NUVEMFVMLCAweDAzNTRGNEU4VUwsIDB4MDM1NTM4NERVTCwgMHgwMzU1NUVEMFVMLCAweDAzNTVGNERGVUwsCisgICAgMHgwMzU2NDM1MFVMLCAweDAzNTk2OUE2VUwsIDB4MDM1RkZBNTJVTCwgMHgwMzY2NDlBNlVMLCAweDAzNkZGQTUyVUwsCisgICAgMHgwMzdGNEY2NlVMLCAweDAzOUQ3NDkyVUwsIDB4MDNCRjY4OTJVTCwgMHgwM0RGOEExRlVMLCAweDA0MTAwQjg0VUwsCisgICAgMHgwNDExMjEwN1VMLCAweDA0MTE1MjBEVUwsIDB4MDQxMjE0RUFVTCwgMHgwNDEyNEYyMFVMLCAweDA0MTMxRURFVUwsCisgICAgMHgwNDEzM0YwOFVMLCAweDA0MTM1ODA5VUwsIDB4MDQxM0Y0MkJVTCwgMHgwNDE0MkYwOFVMLCAweDA0MjAwODQ3VUwsCisgICAgMHgwNDIxMjFGQ1VMLCAweDA0MjE0MjA5VUwsIDB4MDQyMjE0MDdVTCwgMHgwNDIyMjAzQ1VMLCAweDA0MjI0MjA5VUwsCisgICAgMHgwNDIyNjM1MFVMLCAweDA0MjMxQTdDVUwsIDB4MDQyMzQyMDlVTCwgMHgwNDIzNjM3QlVMLCAweDA0MjQxQTdDVUwsCisgICAgMHgwNDI0MzIyMFVMLCAweDA0MjQ2MjdCVUwsIDB4MDQyNTE0QzhVTCwgMHgwNDI1NDgwOVVMLCAweDA0MkZGOEU5VUwsCisgICAgMHgwNDMxMUU0N1VMLCAweDA0MzEzMjIwVUwsIDB4MDQzMTUyN0JVTCwgMHgwNDMyMTRGQ1VMLCAweDA0MzIzMjIwVUwsCisgICAgMHgwNDMyNjI1MFVMLCAweDA0MzMxNUJDVUwsIDB4MDQzMzMyMjBVTCwgMHgwNDMzNTI3QlVMLCAweDA0MzM4NDEzVUwsCisgICAgMHgwNDM0MTQ4OFVMLCAweDA0MzQ0ODA5VUwsIDB4MDQzNDZFRDBVTCwgMHgwNDM1MUY0OFVMLCAweDA0MzU1MjdCVUwsCisgICAgMHgwNDM1RjlBNVVMLCAweDA0MzYzODA5VUwsIDB4MDQzNzVFRkJVTCwgMHgwNDNGRjkyOVVMLCAweDA0NDEyRTc5VUwsCisgICAgMHgwNDQxNDI3QlVMLCAweDA0NDIxOUI5VUwsIDB4MDQ0MjM4MDlVTCwgMHgwNDQyNTM3QlVMLCAweDA0NDMxNEM4VUwsCisgICAgMHgwNDQzMjAyMFVMLCAweDA0NDM1MjdCVUwsIDB4MDQ0NDE0Q0FVTCwgMHgwNDQ0MzgwOVVMLCAweDA0NDQ1MzdCVUwsCisgICAgMHgwNDQ0ODk5M1VMLCAweDA0NDUxNDhBVUwsIDB4MDQ0NTM4MDlVTCwgMHgwNDQ1NUVEMFVMLCAweDA0NDVGNEU1VUwsCisgICAgMHgwNDQ2Mzg0RFVMLCAweDA0NTAwOUE2VUwsIDB4MDQ1MjcyRDNVTCwgMHgwNDUzMTRBMFVMLCAweDA0NTMzMjREVUwsCisgICAgMHgwNDUzNUVEMFVMLCAweDA0NTQxNUEwVUwsIDB4MDQ1NDMyNERVTCwgMHgwNDU0NUVEMFVMLCAweDA0NTUxRjYwVUwsCisgICAgMHgwNDU1MzI0RFVMLCAweDA0NTYyOTg5VUwsIDB4MDQ1NjQzNTBVTCwgMHgwNDVGRjREMlVMLCAweDA0NjY1OTkzVUwsCisgICAgMHgwNDdGRkY2MlVMLCAweDA0OEZGNzI1VUwsIDB4MDQ5RjQ0QkRVTCwgMHgwNEJGQjdFNVVMLCAweDA0RUY4QTI1VUwsCisgICAgMHgwNEZGRkI5OFVMLCAweDA1MTEzMUY5VUwsIDB4MDUxMjEyQzdVTCwgMHgwNTEzNDIwOVVMLCAweDA1MjAwMjQ3VUwsCisgICAgMHgwNTIxMTAwN1VMLCAweDA1MjEzRTYwVUwsIDB4MDUyMjEyQzdVTCwgMHgwNTIyNDIwOVVMLCAweDA1MjMxOUJDVUwsCisgICAgMHgwNTIzMzIyMFVMLCAweDA1MjM1MjdCVUwsIDB4MDUyNDE0QzhVTCwgMHgwNTI0MzgyMFVMLCAweDA1MzExMkY5VUwsCisgICAgMHgwNTMxM0U0OVVMLCAweDA1MzIxNDM5VUwsIDB4MDUzMjNFNDlVTCwgMHgwNTMyNTM3QlVMLCAweDA1MzMxNEM4VUwsCisgICAgMHgwNTMzNDgwRFVMLCAweDA1MzM3NDEzVUwsIDB4MDUzNDE0ODhVTCwgMHgwNTM0NTI3QlVMLCAweDA1MzRGNEVCVUwsCisgICAgMHgwNTM1MzgwOVVMLCAweDA1MzU2RUQwVUwsIDB4MDUzNUY0RTVVTCwgMHgwNTM2NDI3QlVMLCAweDA1NDExOUI5VUwsCisgICAgMHgwNTQyMTJGOVVMLCAweDA1NDIzMjQ5VUwsIDB4MDU0MjZFRDNVTCwgMHgwNTQzMTczOVVMLCAweDA1NDMzMjQ5VUwsCisgICAgMHgwNTQzNUVEMFVMLCAweDA1NDNGNEVCVUwsIDB4MDU0NDM4MDlVTCwgMHgwNTQ0NUVEMFVMLCAweDA1NDRGNEU4VUwsCisgICAgMHgwNTQ1MzI0RFVMLCAweDA1NEZGOTkyVUwsIDB4MDU1MzYyRDNVTCwgMHgwNTUzRjVBQlVMLCAweDA1NTQ0MzUwVUwsCisgICAgMHgwNTU1MTRDQVVMLCAweDA1NTU0MjdCVUwsIDB4MDU1NUY0RTVVTCwgMHgwNTU2MzI3QlVMLCAweDA1NUZGNEQyVUwsCisgICAgMHgwNTY2NTk5M1VMLCAweDA1Nzc0RjUzVUwsIDB4MDU5RkY3MjhVTCwgMHgwNUNDMzdGRFVMLCAweDA1RUZCQTI4VUwsCisgICAgMHgwNUZGRkI5OFVMLCAweDA2MTEzMUY5VUwsIDB4MDYxMjE0MDdVTCwgMHgwNjEzM0U2MFVMLCAweDA2MUE3MkU0VUwsCisgICAgMHgwNjIxMUU0N1VMLCAweDA2MjE0RTRCVUwsIDB4MDYyMjE0QzdVTCwgMHgwNjIyM0U2MFVMLCAweDA2MjMxMkY5VUwsCisgICAgMHgwNjIzM0U2MFVMLCAweDA2MzExMkY5VUwsIDB4MDYzMTNFNENVTCwgMHgwNjMyMTlCOVVMLCAweDA2MzIzRTQ5VUwsCisgICAgMHgwNjMzMTQzOVVMLCAweDA2MzMzODA5VUwsIDB4MDYzMzZFRTZVTCwgMHgwNjMzRjVBQlVMLCAweDA2MzQzODA5VUwsCisgICAgMHgwNjM0RjQyQlVMLCAweDA2MzU0MjdCVUwsIDB4MDYzRkY5OTJVTCwgMHgwNjQzNDJGQlVMLCAweDA2NDNGNEVCVUwsCisgICAgMHgwNjQ0NDI3QlVMLCAweDA2NDUyNEM5VUwsIDB4MDY2NTU5OTNVTCwgMHgwNjY2MTcwQVVMLCAweDA2NjY1MkU2VUwsCisgICAgMHgwNjdBNkY1NlVMLCAweDA2OTg0NzNEVUwsIDB4MDZDRjY3RDJVTCwgMHgwNkVGM0EyNlVMLCAweDA2RkZGQUQ4VUwsCisgICAgMHgwNzExMzFDQ1VMLCAweDA3MjExMzA3VUwsIDB4MDcyMjJFNzlVTCwgMHgwNzIyOTJEQ1VMLCAweDA3MjM0RTRCVUwsCisgICAgMHgwNzMxMTJGOVVMLCAweDA3MzIyMzM5VUwsIDB4MDczNjMyQ0JVTCwgMHgwNzNGRjk5MlVMLCAweDA3NDQzMkNCVUwsCisgICAgMHgwNzU1NDlBNlVMLCAweDA3NzZGRjY4VUwsIDB4MDc3NzQzNTBVTCwgMHgwNzg4NDczRFVMLCAweDA3Q0Y0NTE2VUwsCisgICAgMHgwN0VGM0EyNlVMLCAweDA3RkZGQUQ4VUwsIDB4MDgyMjJFNzlVTCwgMHgwODMxMTJGOVVMLCAweDA4MzQzMzBCVUwsCisgICAgMHgwODQ1MzM4QlVMLCAweDA4NzU2RjVDVUwsIDB4MDg4N0Y3MjVVTCwgMHgwODg4NDM2NlVMLCAweDA4QUY2NDlDVUwsCisgICAgMHgwOEYwMDg5OFVMLCAweDA4RkZGQUQ4VUwsIDB4MDkxMTExQzdVTCwgMHgwOTMyMzMwQlVMLCAweDA5NDUzMzhCVUwsCisgICAgMHgwOTc3NEY3RFVMLCAweDA5OThDNzI1VUwsIDB4MDk5OTY0MTZVTCwgMHgwOUVGODdFNVVMLCAweDA5RkZGQUQ4VUwsCisgICAgMHgwQTM0MzMwQlVMLCAweDBBNDUzMzhCVUwsIDB4MEE3NzQ2N0RVTCwgMHgwQUE5RjUyQlVMLCAweDBBQUE2NDE2VUwsCisgICAgMHgwQUJENjdERlVMLCAweDBBRkZGQTE4VUwsIDB4MEIzMzMzMEJVTCwgMHgwQjQ0NDNBNlVMLCAweDBCNzY0NjdEVUwsCisgICAgMHgwQkI5NzUxRlVMLCAweDBCQkI1OUJEVUwsIDB4MEJFRjU4OTJVTCwgMHgwQkZGRkFEOFVMLCAweDBDMjIxMzM5VUwsCisgICAgMHgwQzUzMzM4RVVMLCAweDBDNzYzNjdEVUwsIDB4MENDQUY1MkVVTCwgMHgwQ0NDNjk5NlVMLCAweDBDRkZGQTE4VUwsCisgICAgMHgwRDQ0NDM4RVVMLCAweDBENjQyNjRFVUwsIDB4MEREQ0Y1MkVVTCwgMHgwRERENTk5NlVMLCAweDBERkZGQTE4VUwsCisgICAgMHgwRTQzMzM4RVVMLCAweDBFNjg0NjVDVUwsIDB4MEVFRTY1MUNVTCwgMHgwRUZGRkExOFVMLCAweDBGMzMyMzhFVUwsCisgICAgMHgwRjU1MzY1OVVMLCAweDBGOEY0NTFDVUwsIDB4MEZBRkY4QUVVTCwgMHgwRkYwMEEyRVVMLCAweDBGRkYxQUNDVUwsCisgICAgMHgwRkZGMzNCRFVMLCAweDBGRkY3NTIyVUwsIDB4MEZGRkZBRDhVTCwgMHgxMDAwMkM3MlVMLCAweDExMTExMDNFVUwsCisgICAgMHgxMTEyMUU4M1VMLCAweDExMTMxRTlBVUwsIDB4MTEyMTExNUFVTCwgMHgxMTIyMTE3MFVMLCAweDExMjMxNkYwVUwsCisgICAgMHgxMTI0MTc1RFVMLCAweDExMzExQ0MyVUwsIDB4MTEzMjExODJVTCwgMHgxMTMzMUQ0MlVMLCAweDExNDExRDQ4VUwsCisgICAgMHgxMTQyMTgzNlVMLCAweDExNDMxODc2VUwsIDB4MTE0NDFERjVVTCwgMHgxMTUyMjg3QlVMLCAweDEyMTExOTAzVUwsCisgICAgMHgxMjEyMTE1QVVMLCAweDEyMTMxNkYwVUwsIDB4MTIyMTFCMzBVTCwgMHgxMjIyMUIzMFVMLCAweDEyMjMxQjAyVUwsCisgICAgMHgxMjMxMTE4NFVMLCAweDEyMzIxRDA0VUwsIDB4MTIzMzE3ODRVTCwgMHgxMjQxMUQzOVVMLCAweDEyNDEyMDIwVUwsCisgICAgMHgxMjQyMjIyMFVMLCAweDEyNTExRDg5VUwsIDB4MTI1MjIyN0JVTCwgMHgxMjU4MTg0QVVMLCAweDEyODMyOTkyVUwsCisgICAgMHgxMzExMTcxQVVMLCAweDEzMTIxQjMwVUwsIDB4MTMxMjIwMkNVTCwgMHgxMzEzMjBBQVVMLCAweDEzMjEyMEFBVUwsCisgICAgMHgxMzIyMjBBRFVMLCAweDEzMjMyRkVEVUwsIDB4MTMzMTIxMDdVTCwgMHgxMzMyMjEzNFVMLCAweDEzMzMyMTM0VUwsCisgICAgMHgxMzQxMUQzOVVMLCAweDEzNDMxRTc0VUwsIDB4MTM0NDE4MzRVTCwgMHgxMzQ4MTJCNFVMLCAweDEzNTIyMzBCVUwsCisgICAgMHgxMzYxMUU0QlVMLCAweDEzNjUyMkU0VUwsIDB4MTQxMTEzQzJVTCwgMHgxNDEyMTFDNFVMLCAweDE0MzEyMUY5VUwsCisgICAgMHgxNDMyMjFGOVVMLCAweDE0MzMyMUNBVUwsIDB4MTQzNTFEMzRVTCwgMHgxNDQzMUU0N1VMLCAweDE0NDQxRTc0VUwsCisgICAgMHgxNDQ2MTJCNFVMLCAweDE0NTIyMzBFVUwsIDB4MTQ1NTFFNzRVTCwgMHgxNDcxMTMwRVVMLCAweDE1MTExM0MyVUwsCisgICAgMHgxNTIxMjFGOVVMLCAweDE1MzEyMUY5VUwsIDB4MTUzMjIxRjlVTCwgMHgxNTMzMTAwN1VMLCAweDE1NTIyRTRFVUwsCisgICAgMHgxNTU1MUU3NFVMLCAweDE1NzExMzBFVUwsIDB4MTYxMTEzQzdVTCwgMHgxNjIxMjFGOVVMLCAweDE2MzEyMUY5VUwsCisgICAgMHgxNjYxMUU3OVVMLCAweDE2NjYxMzM0VUwsIDB4MTcxMTEzQzdVTCwgMHgxNzIxMjFGOVVMLCAweDE3NDUxRTQ3VUwsCisgICAgMHgxNzcxMTMwQ1VMLCAweDE4MTExM0M3VUwsIDB4MTgyMTFFNDdVTCwgMHgxODUxMUU0Q1VMLCAweDE4ODIxMzBDVUwsCisgICAgMHgxOTExMTNDN1VMLCAweDE5MzMxRTc5VUwsIDB4MUExMTEzMDdVTCwgMHgxQTMxMUU3OVVMLCAweDFGNTIyMzBFVUwsCisgICAgMHgyMDAwMDNDMVVMLCAweDIwMDAxMDI3VUwsIDB4MjAwMDQ0NjdVTCwgMHgyMDAwNzlFN1VMLCAweDIwMDBFNUVGVUwsCisgICAgMHgyMTEwMEJDMFVMLCAweDIxMTEyOUMwVUwsIDB4MjExMTQwMTFVTCwgMHgyMTExODlFN1VMLCAweDIxMTFGNUVGVUwsCisgICAgMHgyMTEyNDAxMVVMLCAweDIxMTI3NDU1VUwsIDB4MjExMzI1QzBVTCwgMHgyMTEzNDAxMVVMLCAweDIxMTM3NDU1VUwsCisgICAgMHgyMTE0MjVDMFVMLCAweDIxMjEyNDQwVUwsIDB4MjEyMTMwMDFVTCwgMHgyMTIxRjlFRlVMLCAweDIxMjIyNTQwVUwsCisgICAgMHgyMTIyNjQ1NVVMLCAweDIxMjJGNUVGVUwsIDB4MjEyMzMwNTFVTCwgMHgyMTIzRjU2RlVMLCAweDIxMjQ0NDUxVUwsCisgICAgMHgyMTMxMjU1MVVMLCAweDIxMzIzNDUxVUwsIDB4MjEzMzI1NTFVTCwgMHgyMTg0NDU1NVVMLCAweDIyMTEyNUMwVUwsCisgICAgMHgyMjExMzAxMVVMLCAweDIyMTFGOUVGVUwsIDB4MjIxMjMwNTFVTCwgMHgyMjEyRjlFRlVMLCAweDIyMTMyOUQxVUwsCisgICAgMHgyMjIxMjU0MVVMLCAweDIyMjEzMDExVUwsIDB4MjIyMUY5RUZVTCwgMHgyMjIyMzQ1MVVMLCAweDIyMjJGOUVGVUwsCisgICAgMHgyMjIzMjU1MVVMLCAweDIyMjNGNTZGVUwsIDB4MjIzMTI1NTFVTCwgMHgyMjMyMjlEMVVMLCAweDIyMzJGNTZGVUwsCisgICAgMHgyMjMzMjU1MVVMLCAweDIyMzNGNTZGVUwsIDB4MjI4NzU1NTVVTCwgMHgyMkRBQjVEN1VMLCAweDIzMTEyQkQxVUwsCisgICAgMHgyMzExNTQ2N1VMLCAweDIzMTIyNUQxVUwsIDB4MjMyMTI5RDFVTCwgMHgyMzIyMjlEMVVMLCAweDIzMjJGOUVGVUwsCisgICAgMHgyMzIzMzQ1MVVMLCAweDIzMjNGOUVGVUwsIDB4MjMzMTI1NTFVTCwgMHgyMzMyMjlEMVVMLCAweDIzMzJGOUVGVUwsCisgICAgMHgyMzMzRjU2RlVMLCAweDIzN0ZGNTU3VUwsIDB4MjM4NTY5RDVVTCwgMHgyM0Q5NTVEN1VMLCAweDI0MTAwQkU3VUwsCisgICAgMHgyNDg3ODlFN1VMLCAweDI0RTMxNUQ3VUwsIDB4MjRGRkZCRUZVTCwgMHgyNTk4NjlFN1VMLCAweDI1REZGNUVGVUwsCisgICAgMHgyNUZGRkJFRlVMLCAweDI2ODc4OUU3VUwsIDB4MjZERkE1RDdVTCwgMHgyNkZGRkJFRlVMLCAweDI3OTY0OUU3VUwsCisgICAgMHgyN0U0MjVEN1VMLCAweDI3RkZGQkVGVUwsIDB4Mjg4ODc5RTdVTCwgMHgyOEVGRjVFRlVMLCAweDI4RkZGQkVGVUwsCisgICAgMHgyOTg0MzlFN1VMLCAweDI5RjExNUVGVUwsIDB4MjlGRkZCRUZVTCwgMHgyQTc2NTlFN1VMLCAweDJBRUY3NUQ3VUwsCisgICAgMHgyQUZGRkJFRlVMLCAweDJCN0M4OUU3VUwsIDB4MkJFRjk1RDdVTCwgMHgyQkZGRkJFRlVMLCAweDJDNjY1OUU3VUwsCisgICAgMHgyQ0Q1NTVEN1VMLCAweDJDRkZGQkVGVUwsIDB4MkQ2MzI5RTdVTCwgMHgyRERENTVFN1VMLCAweDJERkZGQkVCVUwsCisgICAgMHgyRTg0NzlEN1VMLCAweDJFRUUzNUU3VUwsIDB4MkVGRkZCRUZVTCwgMHgyRjU0NTlFN1VMLCAweDJGQ0Y4NUQ3VUwsCisgICAgMHgyRkZFRkJFQlVMLCAweDJGRkZBNUVGVUwsIDB4MkZGRkVCRUZVTCwgMHgzMDAwMUFFN1VMLCAweDMwMDAyMDAxVUwsCisgICAgMHgzMTExMjlDMFVMLCAweDMxMjIxMDE1VUwsIDB4MzEyMzIwMDBVTCwgMHgzMTMzMjQ1MVVMLCAweDMyMTEyNTQwVUwsCisgICAgMHgzMjEzMTAyN1VMLCAweDMyMjEyNDQwVUwsIDB4MzM0NTI0NTVVTCwgMHg0MDAwRjlEN1VMLCAweDQxMjJGOUQ3VUwsCisgICAgMHg0M0Y2NTU1NVVMLCAweDQzRkZGNUQ3VUwsIDB4NDRGNTU1NjdVTCwgMHg0NEZGRjVEN1VMLCAweDQ1RjAwNTU3VUwsCisgICAgMHg0NUZGRjVEN1VMLCAweDQ2RjY1OUQ3VUwsIDB4NDcxMDA1RTdVTCwgMHg0N0Y0NDlFN1VMLCAweDQ4MTAwNUU3VUwsCisgICAgMHg0OEVGQTlENVVMLCAweDQ4RkZGNUVGVUwsIDB4NDlGNDQ5RTdVTCwgMHg0OUZGRjVFRlVMLCAweDRBRUE3OUU3VUwsCisgICAgMHg0QUZGRjVFRlVMLCAweDRCRTlDOUQ1VUwsIDB4NEJGRkY1RUZVTCwgMHg0Q0U1NDlFN1VMLCAweDRDRkZGNUVGVUwsCisgICAgMHg0REUzNTlFN1VMLCAweDRERkZGNUQ3VUwsIDB4NEVFNDY5RTdVTCwgMHg0RUZGRjVEN1VMLCAweDRGRUYzOUU3VUwsCisgICAgMHg0RkZGRjVFRlVMLCAweDYwMDBGOUU3VUwsIDB4NjlGRkY1NTdVTCwgMHg2RkZGRjlEN1VMLCAweDgxMTAwOUQ3VUwsCisgICAgMHg4RUZGRjU1NVVMLCAweEZGRkZGOUU3VUx9OworCitzdGF0aWMgY29uc3QgU0hPUlQgYXJpX3BrWzY0XVsxN10gPSB7CisgICAgezcwOCwgNzA2LCA1NzksIDU2OSwgNTY4LCA1NjcsIDQ3OSwgNDY5LCAyOTcsIDEzOCwgOTcsIDkxLCA3MiwgNTIsIDM4LCAzNCwKKyAgICAgMH0sCisgICAgezc2MTksIDY5MTcsIDY1MTksIDY0MTIsIDU1MTQsIDUwMDMsIDQ2ODMsIDQ1NjMsIDM5MDcsIDMyOTcsIDMxMjUsIDMwNjAsCisgICAgIDI5MDQsIDI3MTgsIDI2MzEsIDI1OTAsIDB9LAorICAgIHs3MjYzLCA0ODg4LCA0ODEwLCA0ODAzLCAxODg5LCA0MTUsIDMzNSwgMzI3LCAxOTUsIDcyLCA1MiwgNDksIDM2LCAyMCwgMTUsCisgICAgIDE0LCAwfSwKKyAgICB7MzYyNiwgMjE5NywgMjE4OCwgMjE4NywgNTgyLCA1NywgNDcsIDQ2LCAzMCwgMTIsIDksIDgsIDYsIDQsIDMsIDIsIDB9LAorICAgIHs3ODA2LCA1NTQxLCA1NDUxLCA1NDQxLCAyNzIwLCA4MzQsIDY5MSwgNjc0LCA0ODcsIDI0MywgMTc5LCAxNjcsIDEzOSwgOTgsCisgICAgIDc3LCA3MCwgMH0sCisgICAgezY2ODQsIDQxMDEsIDQwNTgsIDQwNTUsIDE3NDgsIDQyNiwgMzY4LCAzNjQsIDMyMiwgMjU3LCAyMzUsIDIzMiwgMjI4LCAyMjIsCisgICAgIDIxNywgMjE1LCAwfSwKKyAgICB7OTE2MiwgNTk2NCwgNTgzMSwgNTgxOSwgMzI2OSwgODY2LCA2NTgsIDYzOCwgNTM1LCAzNDgsIDI1OCwgMjQ0LCAyMzQsIDIxNCwKKyAgICAgMTk1LCAxODYsIDB9LAorICAgIHsxMDYzOCwgODQ5MSwgODM2NSwgODM1MSwgNDQxOCwgMjA2NywgMTg1OSwgMTgzNCwgMTE5MCwgNjAxLCA0OTUsIDQ3OCwgMzU2LAorICAgICAyMTcsIDE3NCwgMTY0LCAwfSwKKyAgICB7MTMzODksIDEwNTE0LCAxMDAzMiwgOTk2MSwgNzE2NiwgMzQ4OCwgMjY1NSwgMjUyNCwgMjAxNSwgMTE0MCwgNzYwLCA2NzIsCisgICAgIDU4NSwgNDI2LCAzMjUsIDI4MywgMH0sCisgICAgezE0ODYxLCAxMjc4OCwgMTIxMTUsIDExOTUyLCA5OTg3LCA2NjU3LCA1MzIzLCA0OTg0LCA0MzI0LCAzMDAxLCAyMjA1LCAxOTQzLAorICAgICAxNzY0LCAxMzk0LCAxMTE1LCA5NzgsIDB9LAorICAgIHsxMjg3NiwgMTAwMDQsIDk2NjEsIDk2MTAsIDcxMDcsIDM0MzUsIDI3MTEsIDI1OTUsIDIyNTcsIDE1MDgsIDEwNTksIDk1MiwKKyAgICAgODkzLCA3NTMsIDYwOSwgNTM4LCAwfSwKKyAgICB7MTUxMjUsIDEzNTkxLCAxMzA0OSwgMTI4NzQsIDExMTkyLCA4NTQzLCA3NDA2LCA3MDIzLCA2MjkxLCA0OTIyLCA0MTA0LAorICAgICAzNzY5LCAzNDY1LCAyODkwLCAyNDg2LCAyMjc1LCAwfSwKKyAgICB7MTQ1NzQsIDEzMTA2LCAxMjczMSwgMTI2MzgsIDEwNDUzLCA3OTQ3LCA3MjMzLCA3MDM3LCA2MDMxLCA0NjE4LCA0MDgxLAorICAgICAzOTA2LCAzNDY1LCAyODAyLCAyNDc2LCAyMzQ5LCAwfSwKKyAgICB7MTUwNzAsIDEzMTc5LCAxMjUxNywgMTIzNTEsIDEwNzQyLCA3NjU3LCA2MjAwLCA1ODI1LCA1MjY0LCAzOTk4LCAzMDE0LAorICAgICAyNjYyLCAyNTEwLCAyMTUzLCAxNzk5LCAxNTY0LCAwfSwKKyAgICB7MTU1NDIsIDE0NDY2LCAxNDAwNywgMTM4NDQsIDEyNDg5LCAxMDQwOSwgOTQ4MSwgOTEzMiwgODMwNSwgNjk0MCwgNjE5MywKKyAgICAgNTg2NywgNTQ1OCwgNDc0MywgNDI5MSwgNDA0NywgMH0sCisgICAgezE1MTY1LCAxNDM4NCwgMTQwODQsIDEzOTM0LCAxMjkxMSwgMTE0ODUsIDEwODQ0LCAxMDUxMywgMTAwMDIsIDg5OTMsIDgzODAsCisgICAgIDgwNTEsIDc3MTEsIDcwMzYsIDY1MTQsIDYyMzMsIDB9LAorICAgIHsxNTY0MiwgMTQyNzksIDEzNjI1LCAxMzM5MywgMTIzNDgsIDk5NzEsIDg0MDUsIDc4NTgsIDczMzUsIDYxMTksIDQ5MTgsCisgICAgIDQzNzYsIDQxODUsIDM3MTksIDMyMzEsIDI4NjAsIDB9LAorICAgIHsxMzQwOCwgMTM0MDcsIDExNDcxLCAxMTIxOCwgMTEyMTcsIDExMjE2LCA5NDczLCA5MjE2LCA2NDgwLCAzNjg5LCAyODU3LAorICAgICAyNjkwLCAyMjU2LCAxNzMyLCAxNDA1LCAxMzAyLCAwfSwKKyAgICB7MTYwOTgsIDE1NTg0LCAxNTE5MSwgMTQ5MzEsIDE0NTE0LCAxMzU3OCwgMTI3MDMsIDEyMTAzLCAxMTgzMCwgMTExNzIsCisgICAgIDEwNDc1LCA5ODY3LCA5Njk1LCA5MjgxLCA4ODI1LCA4Mzg5LCAwfSwKKyAgICB7MTU4NDQsIDE0ODczLCAxNDI3NywgMTM5OTYsIDEzMjMwLCAxMTUzNSwgMTAyMDUsIDk1NDMsIDkxMDcsIDgwODYsIDcwODUsCisgICAgIDY0MTksIDYyMTQsIDU3MTMsIDUxOTUsIDQ3MzEsIDB9LAorICAgIHsxNjEzMSwgMTU3MjAsIDE1NDQzLCAxNTI3NiwgMTQ4NDgsIDEzOTcxLCAxMzMxNCwgMTI5MTAsIDEyNTkxLCAxMTg3NCwKKyAgICAgMTEyMjUsIDEwNzg4LCAxMDU3MywgMTAwNzcsIDk1ODUsIDkyMDksIDB9LAorICAgIHsxNjMzMSwgMTYzMzAsIDEyMjgzLCAxMTQzNSwgMTE0MzQsIDExNDMzLCA4NzI1LCA4MDQ5LCA2MDY1LCA0MTM4LCAzMTg3LAorICAgICAyODQyLCAyNTI5LCAyMTcxLCAxOTA3LCAxNzQ1LCAwfSwKKyAgICB7MTYwMTEsIDE1MjkyLCAxNDc4MiwgMTQ1MjgsIDE0MDA4LCAxMjc2NywgMTE1NTYsIDEwOTIxLCAxMDU5MSwgOTc1OSwgODgxMywKKyAgICAgODA0MywgNzg1NSwgNzM4MywgNjg2MywgNjI4MiwgMH0sCisgICAgezE2MzgwLCAxNjM3OSwgMTUxNTksIDE0NjEwLCAxNDYwOSwgMTQ2MDgsIDEyODU5LCAxMjExMSwgMTEwNDYsIDk1MzYsIDgzNDgsCisgICAgIDc3MTMsIDcyMTYsIDY1MzMsIDU5NjQsIDU1NDYsIDB9LAorICAgIHsxNjM2NywgMTYzMzMsIDE2Mjk0LCAxNjI1MywgMTYyMjIsIDE2MTQzLCAxNjA0OCwgMTU5NDcsIDE1OTE1LCAxNTgzMiwKKyAgICAgMTU3MzEsIDE1NjE5LCAxNTU4OSwgMTU1MTIsIDE1NDE2LCAxNTMxMCwgMH0sCisgICAgezE1OTY3LCAxNTMxOSwgMTQ5MzcsIDE0NzUzLCAxNDAxMCwgMTI2MzgsIDExNzg3LCAxMTM2MCwgMTA4MDUsIDk3MDYsIDg5MzQsCisgICAgIDg1MTUsIDgxNjYsIDc0NTYsIDY5MTEsIDY1NzUsIDB9LAorICAgIHs0OTA2LCAzMDA1LCAyOTg1LCAyOTg0LCA4NzUsIDEwMiwgODMsIDgxLCA0NywgMTcsIDEyLCAxMSwgOCwgNSwgNCwgMywgMH0sCisgICAgezcyMTcsIDQzNDYsIDQyNjksIDQyNjQsIDE5MjQsIDQyOCwgMzQwLCAzMzIsIDI4MCwgMjAzLCAxNzksIDE3NSwgMTcxLCAxNjQsCisgICAgIDE1OSwgMTU3LCAwfSwKKyAgICB7MTYwMTAsIDE1NDE1LCAxNTAzMiwgMTQ4MDUsIDE0MjI4LCAxMzA0MywgMTIxNjgsIDExNjM0LCAxMTI2NSwgMTA0MTksIDk2NDUsCisgICAgIDkxMTAsIDg4OTIsIDgzNzgsIDc4NTAsIDc0MzcsIDB9LAorICAgIHs4NTczLCA1MjE4LCA1MDQ2LCA1MDMyLCAyNzg3LCA3NzEsIDU1NSwgNTMzLCA0NDMsIDI4NiwgMjE4LCAyMDUsIDE5NywgMTgxLAorICAgICAxNjgsIDE2MiwgMH0sCisgICAgezExNDc0LCA4MDk1LCA3ODIyLCA3Nzk2LCA0NjMyLCAxNDQzLCAxMDQ2LCAxMDA0LCA3NDgsIDM1MSwgMjE4LCAxOTQsIDE2NywKKyAgICAgMTIxLCA5MywgODMsIDB9LAorICAgIHsxNjE1MiwgMTU3NjQsIDE1NDYzLCAxNTI2NCwgMTQ5MjUsIDE0MTg5LCAxMzUzNiwgMTMwNzAsIDEyODQ2LCAxMjMxNCwKKyAgICAgMTE3NjMsIDExMjc3LCAxMTEzMSwgMTA3NzcsIDEwMzgzLCAxMDAxMSwgMH0sCisgICAgezE0MTg3LCAxMTY1NCwgMTEwNDMsIDEwOTE5LCA4NDk4LCA0ODg1LCAzNzc4LCAzNTUyLCAyOTQ3LCAxODM1LCAxMjgzLCAxMTM0LAorICAgICA5OTgsIDc0OSwgNTg1LCA1MTQsIDB9LAorICAgIHsxNDE2MiwgMTE1MjcsIDEwNzU5LCAxMDU1NywgODYwMSwgNTQxNywgNDEwNSwgMzc1MywgMzI4NiwgMjM1MywgMTcwOCwgMTQ3MywKKyAgICAgMTM3MCwgMTE0OCwgOTU5LCA4NDAsIDB9LAorICAgIHsxNjIwNSwgMTU5MDIsIDE1NjY5LCAxNTQ5OCwgMTUyMTMsIDE0NjAxLCAxNDA2OCwgMTM2NzQsIDEzNDYzLCAxMjk3MCwKKyAgICAgMTI0NzEsIDEyMDYxLCAxMTkxNiwgMTE1NjQsIDExMTgzLCAxMDg0MSwgMH0sCisgICAgezE1MDQzLCAxMjk3MiwgMTIwOTIsIDExNzkyLCAxMDI2NSwgNzQ0NiwgNTkzNCwgNTM3OSwgNDg4MywgMzgyNSwgMzAzNiwKKyAgICAgMjY0NywgMjUwNywgMjE4NSwgMTkwMSwgMTY5OSwgMH0sCisgICAgezE1MzIwLCAxMzY5NCwgMTI3ODIsIDEyMzUyLCAxMTE5MSwgODkzNiwgNzQzMywgNjY3MSwgNjI1NSwgNTM2NiwgNDYyMiwKKyAgICAgNDE1OCwgNDAyMCwgMzcxMiwgMzQyMCwgMzE5OCwgMH0sCisgICAgezE2MjU1LCAxNjAyMCwgMTU3NjgsIDE1NjAwLCAxNTQxNiwgMTQ5NjMsIDE0NDQwLCAxNDAwNiwgMTM4NzUsIDEzNTM0LAorICAgICAxMzEzNywgMTI2OTcsIDEyNjAyLCAxMjM2NCwgMTIwODQsIDExNzgxLCAwfSwKKyAgICB7MTU2MjcsIDE0NTAzLCAxMzkwNiwgMTM2MjIsIDEyNTU3LCAxMDUyNywgOTI2OSwgODY2MSwgODExNywgNjkzMywgNTk5NCwKKyAgICAgNTQ3NCwgNTIyMiwgNDY2NCwgNDE2NiwgMzg0MSwgMH0sCisgICAgezE2MzY2LCAxNjM2NSwgMTQ1NDcsIDE0MTYwLCAxNDE1OSwgMTQxNTgsIDExOTY5LCAxMTQ3MywgODczNSwgNjE0NywgNDkxMSwKKyAgICAgNDUzMCwgMzg2NSwgMzE4MCwgMjcxMCwgMjQ3MywgMH0sCisgICAgezE2MjU3LCAxNjAzOCwgMTU4NzEsIDE1NzU0LCAxNTUzNiwgMTUwNzEsIDE0NjczLCAxNDM5MCwgMTQyMzAsIDEzODQyLAorICAgICAxMzQ1MiwgMTMxMzYsIDEzMDIxLCAxMjc0NSwgMTI0MzQsIDEyMTU0LCAwfSwKKyAgICB7MTU4NTUsIDE0OTcxLCAxNDMzOCwgMTM5MzksIDEzMjM5LCAxMTc4MiwgMTA1ODUsIDk4MDUsIDk0NDQsIDg2MjMsIDc4NDYsCisgICAgIDcyNTQsIDcwNzksIDY2NzMsIDYyNjIsIDU5MjMsIDB9LAorICAgIHs5NDkyLCA2MzE4LCA2MTk3LCA2MTg5LCAzMDA0LCA2NTIsIDQ4OSwgNDc3LCAzMzMsIDE0MywgOTYsIDkwLCA3OCwgNjAsIDUwLAorICAgICA0NywgMH0sCisgICAgezE2MzEzLCAxNjE5MSwgMTYwNjMsIDE1OTY4LCAxNTg1MSwgMTU1OTAsIDE1MzAzLCAxNTA4MiwgMTQ5NjgsIDE0NzA0LAorICAgICAxNDQyNywgMTQxNzcsIDE0MDk1LCAxMzg5OSwgMTM2NzQsIDEzNDU3LCAwfSwKKyAgICB7ODQ4NSwgNTQ3MywgNTM4OSwgNTM4MywgMjQxMSwgNDk0LCAzODYsIDM3NywgMjc4LCAxNTAsIDExNywgMTEyLCAxMDMsIDg5LAorICAgICA4MSwgNzgsIDB9LAorICAgIHsxMDQ5NywgNzE1NCwgNjk1OSwgNjk0MywgMzc4OCwgMTAwNCwgNzM0LCA3MDksIDUxNywgMjM4LCAxNTIsIDEzOCwgMTIwLCA5MCwKKyAgICAgNzIsIDY2LCAwfSwKKyAgICB7MTYzMTcsIDE2MjI2LCAxNjEyNywgMTYwNDAsIDE1OTU1LCAxNTc2MiwgMTU1NDcsIDE1MzQ1LCAxNTI3NywgMTUxMTEsCisgICAgIDE0OTIyLCAxNDcyMywgMTQ2NzEsIDE0NTQ2LCAxNDM5NiwgMTQyMzksIDB9LAorICAgIHsxNjM4MiwgMTYzODEsIDE1ODU4LCAxNTU0MCwgMTU1MzksIDE1NTM4LCAxNDcwNCwgMTQxNjgsIDEzNzY4LCAxMzA5MiwKKyAgICAgMTI0NTIsIDExOTI1LCAxMTY4MywgMTEyNjgsIDEwODQxLCAxMDQ2MCwgMH0sCisgICAgezU5NzQsIDM3OTgsIDM3NTgsIDM3NTUsIDEyNzUsIDIwNSwgMTY2LCAxNjIsIDk1LCAzNSwgMjYsIDI0LCAxOCwgMTEsIDgsIDcsCisgICAgIDB9LAorICAgIHszNTMyLCAyMjU4LCAyMjQ2LCAyMjQ0LCA3MzEsIDEzNSwgMTE4LCAxMTUsIDg3LCA0NSwgMzYsIDM0LCAyOSwgMjEsIDE3LCAxNiwKKyAgICAgMH0sCisgICAgezc0NjYsIDQ4ODIsIDQ4MjEsIDQ4MTEsIDI0NzYsIDg4NiwgNzg4LCA3NzEsIDY4OCwgNTMxLCA0NjksIDQ1NywgNDM3LCA0MDAsCisgICAgIDM2OSwgMzYxLCAwfSwKKyAgICB7OTU4MCwgNTc3MiwgNTI5MSwgNTIxNiwgMzQ0NCwgMTQ5NiwgMTAyNSwgOTI4LCA4MDYsIDU3OCwgNDMzLCAzODQsIDM2NiwKKyAgICAgMzMxLCAyOTYsIDI3MywgMH0sCisgICAgezEwNjkyLCA3NzMwLCA3NTQzLCA3NTIxLCA0Njc5LCAxNzQ2LCAxMzkxLCAxMzQ2LCAxMTI4LCA2OTIsIDQ5NSwgNDU4LCA0MjQsCisgICAgIDM1MywgMjkxLCAyNjgsIDB9LAorICAgIHsxMTA0MCwgNzEzMiwgNjU0OSwgNjQ1MiwgNDM3NywgMTg3NSwgMTI1MywgMTEzMCwgOTU4LCA2MzEsIDQzMSwgMzcwLCAzNDYsCisgICAgIDI5NiwgMjUzLCAyMjcsIDB9LAorICAgIHsxMjY4NywgOTMzMiwgODcwMSwgODU4NSwgNjI2NiwgMzA5MywgMjE4MiwgMjAwNCwgMTY4MywgMTA3MiwgNzEyLCA2MDgsIDU1OSwKKyAgICAgNDU4LCAzNzMsIDMyMywgMH0sCisgICAgezEzNDI5LCA5ODUzLCA4ODYwLCA4NTg0LCA2ODA2LCA0MDM5LCAyODYyLCAyNDc4LCAyMjM5LCAxNzY0LCAxNDA5LCAxMjI0LAorICAgICAxMTc4LCAxMDc3LCA5NzksIDkwMywgMH0sCisgICAgezE0Njg1LCAxMjE2MywgMTEwNjEsIDEwNjY4LCA5MTAxLCA2MzQ1LCA0ODcxLCA0MjYzLCAzOTA4LCAzMjAwLCAyNjY4LCAyMzY4LAorICAgICAyMjg1LCAyMTA2LCAxOTQyLCAxODE5LCAwfSwKKyAgICB7MTMyOTUsIDExMzAyLCAxMDk5OSwgMTA5NDUsIDc5NDcsIDUwMzYsIDQ0OTAsIDQzODUsIDMzOTEsIDIxODUsIDE4MzYsIDE3NTcsCisgICAgIDE0MjQsIDk5OCwgODMzLCA3ODUsIDB9LAorICAgIHs0OTkyLCAyOTkzLCAyOTcyLCAyOTcwLCAxMjY5LCA1NzUsIDU1MiwgNTQ5LCA1MzAsIDUwNSwgNDk3LCA0OTUsIDQ5MywgNDg5LAorICAgICA0ODYsIDQ4NSwgMH0sCisgICAgezE1NDE5LCAxMzg2MiwgMTMxMDQsIDEyODE5LCAxMTQyOSwgODc1MywgNzIyMCwgNjY1MSwgNjAyMCwgNDY2NywgMzY2MywKKyAgICAgMzIyMCwgMjk5NSwgMjUxMSwgMjEwNywgMTg3MSwgMH0sCisgICAgezEyNDY4LCA5MjYzLCA4OTEyLCA4ODczLCA1NzU4LCAyMTkzLCAxNjI1LCAxNTU2LCAxMTg3LCA1ODksIDM3MSwgMzMwLCAyODMsCisgICAgIDIwMCwgMTQ5LCAxMzEsIDB9LAorICAgIHsxNTg3MCwgMTUwNzYsIDE0NjE1LCAxNDM2OSwgMTM1ODYsIDEyMDM0LCAxMDk5MCwgMTA0MjMsIDk5NTMsIDg5MDgsIDgwMzEsCisgICAgIDc0ODgsIDcyMzMsIDY2NDgsIDYxMDEsIDU3MTIsIDB9LAorICAgIHsxNjkzLCA5NzgsIDk3NiwgOTc1LCAxOTQsIDE4LCAxNiwgMTUsIDExLCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAwfSwKKyAgICB7Nzk5MiwgNTIxOCwgNTE0NywgNTE0MywgMjE1MiwgMzY2LCAyODIsIDI3NiwgMTczLCA1OSwgMzgsIDM1LCAyNywgMTYsIDExLAorICAgICAxMCwgMH19OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBsb3c7CisgIGludCBoaWdoOworICBpbnQgdm9iZjsKK30gVGFzdGF0OworCitzdGF0aWMgaW5saW5lIElOVCBtdWxfc2JjXzE0Yml0cyhJTlQgciwgSU5UIGMpIHsKKyAgcmV0dXJuICgoKElOVClyKSAqICgoSU5UKWMpKSA+PiBzdGF0X2JpdHNuZXc7Cit9CisKK3N0YXRpYyBpbmxpbmUgSU5UIGFyaV9kZWNvZGVfMTRiaXRzKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgVGFzdGF0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgKlJFU1RSSUNUIGNfZnJlcSwgaW50IGNmbCkgeworICBJTlQgc3ltYm9sOworICBJTlQgbG93LCBoaWdoLCByYW5nZSwgdmFsdWU7CisgIElOVCBjOworICBjb25zdCBTSE9SVCAqcDsKKworICBsb3cgPSBzLT5sb3c7CisgIGhpZ2ggPSBzLT5oaWdoOworICB2YWx1ZSA9IHMtPnZvYmY7CisKKyAgcmFuZ2UgPSBoaWdoIC0gbG93ICsgMTsKKyAgYyA9ICgoKGludCkodmFsdWUgLSBsb3cgKyAxKSkgPDwgc3RhdF9iaXRzbmV3KSAtICgoaW50KTEpOworICBwID0gKGNvbnN0IFNIT1JUICopKGNfZnJlcSAtIDEpOworCisgIGlmIChjZmwgPT0gKFZBTF9FU0MgKyAxKSkgeworICAgIC8qIEluIDUwJSBvZiBhbGwgY2FzZXMsIHRoZSBmaXJzdCBlbnRyeSBpcyB0aGUgcmlnaHQgb25lLCBzbyB3ZSBjaGVjayBpdAorICAgICAqIHByaW9yIHRvIGFsbCBvdGhlcnMgKi8KKyAgICBpZiAoKHBbMV0gKiByYW5nZSkgPiBjKSB7CisgICAgICBwICs9IDE7CisgICAgICBpZiAoKHBbOF0gKiByYW5nZSkgPiBjKSB7CisgICAgICAgIHAgKz0gODsKKyAgICAgIH0KKyAgICAgIGlmICgocFs0XSAqIHJhbmdlKSA+IGMpIHsKKyAgICAgICAgcCArPSA0OworICAgICAgfQorICAgICAgaWYgKChwWzJdICogcmFuZ2UpID4gYykgeworICAgICAgICBwICs9IDI7CisgICAgICB9CisgICAgICBpZiAoKHBbMV0gKiByYW5nZSkgPiBjKSB7CisgICAgICAgIHAgKz0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAoY2ZsID09IDQpIHsKKyAgICBpZiAoKHBbMl0gKiByYW5nZSkgPiBjKSB7CisgICAgICBwICs9IDI7CisgICAgfQorICAgIGlmICgocFsxXSAqIHJhbmdlKSA+IGMpIHsKKyAgICAgIHAgKz0gMTsKKyAgICB9CisgIH0gZWxzZSBpZiAoY2ZsID09IDIpIHsKKyAgICBpZiAoKHBbMV0gKiByYW5nZSkgPiBjKSB7CisgICAgICBwICs9IDE7CisgICAgfQorICB9IGVsc2UgaWYgKGNmbCA9PSAyNykgeworICAgIGNvbnN0IFNIT1JUICpwXzI0ID0gcCArIDI0OworCisgICAgaWYgKChwWzE2XSAqIHJhbmdlKSA+IGMpIHsKKyAgICAgIHAgKz0gMTY7CisgICAgfQorICAgIGlmICgocFs4XSAqIHJhbmdlKSA+IGMpIHsKKyAgICAgIHAgKz0gODsKKyAgICB9CisgICAgaWYgKHAgIT0gcF8yNCkgeworICAgICAgaWYgKChwWzRdICogcmFuZ2UpID4gYykgeworICAgICAgICBwICs9IDQ7CisgICAgICB9CisgICAgfQorICAgIGlmICgocFsyXSAqIHJhbmdlKSA+IGMpIHsKKyAgICAgIHAgKz0gMjsKKyAgICB9CisKKyAgICBpZiAocCAhPSAmcF8yNFsyXSkgeworICAgICAgaWYgKChwWzFdICogcmFuZ2UpID4gYykgeworICAgICAgICBwICs9IDE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3ltYm9sID0gKElOVCkocCAtIChjb25zdCBTSE9SVCAqKShjX2ZyZXEgLSAxKSk7CisKKyAgaWYgKHN5bWJvbCkgeworICAgIGhpZ2ggPSBsb3cgKyBtdWxfc2JjXzE0Yml0cyhyYW5nZSwgY19mcmVxW3N5bWJvbCAtIDFdKSAtIDE7CisgIH0KKworICBsb3cgKz0gbXVsX3NiY18xNGJpdHMocmFuZ2UsIGNfZnJlcVtzeW1ib2xdKTsKKworICBVU0hPUlQgdXNfaGlnaCA9IChVU0hPUlQpaGlnaDsKKyAgVVNIT1JUIHVzX2xvdyA9IChVU0hPUlQpbG93OworICB3aGlsZSAoMSkgeworICAgIGlmICh1c19oaWdoICYgMHg4MDAwKSB7CisgICAgICBpZiAoISh1c19sb3cgJiAweDgwMDApKSB7CisgICAgICAgIGlmICh1c19sb3cgJiAweDQwMDAgJiYgISh1c19oaWdoICYgMHg0MDAwKSkgeworICAgICAgICAgIHVzX2xvdyAtPSAweDQwMDA7CisgICAgICAgICAgdXNfaGlnaCAtPSAweDQwMDA7CisgICAgICAgICAgdmFsdWUgLT0gMHg0MDAwOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgdXNfbG93ID0gdXNfbG93IDw8IDE7CisgICAgdXNfaGlnaCA9ICh1c19oaWdoIDw8IDEpIHwgMTsKKyAgICB2YWx1ZSA9ICh2YWx1ZSA8PCAxKSB8IEZES3JlYWRCaXQoaEJzKTsKKyAgfQorICBzLT5sb3cgPSAoaW50KXVzX2xvdzsKKyAgcy0+aGlnaCA9IChpbnQpdXNfaGlnaDsKKyAgcy0+dm9iZiA9IHZhbHVlICYgMHhGRkZGOworCisgIHJldHVybiBzeW1ib2w7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3B5VGFibGVBbXJ3YkFyaXRoMihVQ0hBUiB0YWJbXSwgaW50IHNpemVJbiwgaW50IHNpemVPdXQpIHsKKyAgaW50IGk7CisgIGludCBqOworICBpbnQgayA9IDI7CisKKyAgdGFiICs9IDI7CisKKyAgaWYgKHNpemVJbiA8IHNpemVPdXQpIHsKKyAgICB0YWJbc2l6ZU91dCArIDBdID0gdGFiW3NpemVJbiArIDBdOworICAgIHRhYltzaXplT3V0ICsgMV0gPSB0YWJbc2l6ZUluICsgMV07CisgICAgaWYgKHNpemVJbiA8IChzaXplT3V0ID4+IDIpKSB7CisgICAgICBrID0gODsKKyAgICB9IGVsc2UgaWYgKHNpemVJbiA9PSAoc2l6ZU91dCA+PiAyKSkgeworICAgICAgayA9IDQ7CisgICAgfQorCisgICAgaSA9IHNpemVPdXQgLSAxOworICAgIGogPSBzaXplSW4gLSAxOworCisgICAgZm9yICg7IGkgPj0gMDsgai0tKSB7CisgICAgICBVQ0hBUiB0cV9kYXRhMCA9IHRhYltqXTsKKworICAgICAgZm9yIChpbnQgbCA9IChrID4+IDEpOyBsID4gMDsgbC0tKSB7CisgICAgICAgIHRhYltpLS1dID0gdHFfZGF0YTA7CisgICAgICAgIHRhYltpLS1dID0gdHFfZGF0YTA7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChzaXplT3V0IDwgKHNpemVJbiA+PiAyKSkgeworICAgICAgayA9IDg7CisgICAgfSBlbHNlIGlmIChzaXplT3V0ID09IChzaXplSW4gPj4gMikpIHsKKyAgICAgIGsgPSA0OworICAgIH0KKworICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgc2l6ZU91dDsgaiArPSBrKSB7CisgICAgICBVQ0hBUiB0cV9kYXRhMCA9IHRhYltqXTsKKworICAgICAgdGFiW2krK10gPSB0cV9kYXRhMDsKKyAgICB9CisgICAgdGFiW3NpemVPdXQgKyAwXSA9IHRhYltzaXplSW4gKyAwXTsKKyAgICB0YWJbc2l6ZU91dCArIDFdID0gdGFiW3NpemVJbiArIDFdOworICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgVUxPTkcgZ2V0X3BrX3YyKFVMT05HIHMpIHsKKyAgY29uc3QgVUxPTkcgKnAgPSBhcmlfbWVyZ2VkX2hhc2hfcHM7CisgIFVMT05HIHMxMiA9IChmTWF4KChVSU5UKXMsIChVSU5UKTEpIDw8IDEyKSAtIDE7CisgIGlmIChzMTIgPiBwWzQ4NV0pIHsKKyAgICBwICs9IDQ4NjsgLyogNzQyIC0gMjU2ID0gNDg2ICovCisgIH0gZWxzZSB7CisgICAgaWYgKHMxMiA+IHBbMjU1XSkgcCArPSAyNTY7CisgIH0KKworICBpZiAoczEyID4gcFsxMjddKSB7CisgICAgcCArPSAxMjg7CisgIH0KKyAgaWYgKHMxMiA+IHBbNjNdKSB7CisgICAgcCArPSA2NDsKKyAgfQorICBpZiAoczEyID4gcFszMV0pIHsKKyAgICBwICs9IDMyOworICB9CisgIGlmIChzMTIgPiBwWzE1XSkgeworICAgIHAgKz0gMTY7CisgIH0KKyAgaWYgKHMxMiA+IHBbN10pIHsKKyAgICBwICs9IDg7CisgIH0KKyAgaWYgKHMxMiA+IHBbM10pIHsKKyAgICBwICs9IDQ7CisgIH0KKyAgaWYgKHMxMiA+IHBbMV0pIHsKKyAgICBwICs9IDI7CisgIH0KKyAgVUxPTkcgaiA9IHBbMF07CisgIGlmIChzMTIgPiBqKSBqID0gcFsxXTsKKyAgaWYgKHMgIT0gKGogPj4gMTIpKSBqID4+PSA2OworICByZXR1cm4gKGogJiAweDNGKTsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlMihIQU5ETEVfRkRLX0JJVFNUUkVBTSBiYnVmLCBVQ0hBUiAqUkVTVFJJQ1QgY19wcmV2LAorICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcFNwZWN0cmFsQ29lZmZpY2llbnQsIElOVCBuLCBJTlQgbnQpIHsKKyAgVGFzdGF0IGFzOworICBpbnQgaSwgbCwgcjsKKyAgSU5UIGxldiwgZXNjX25iLCBwa2k7CisgIFVTSE9SVCBzdGF0ZV9pbmM7CisgIFVJTlQgczsKKworICBpbnQgY18zID0gMDsgLyogY29udGV4dCBvZiBjdXJyZW50IGZyYW1lIDMgdGltZSBzdGVwcyBhZ28gKi8KKyAgaW50IGNfMiA9IDA7IC8qIGNvbnRleHQgb2YgY3VycmVudCBmcmFtZSAyIHRpbWUgc3RlcHMgYWdvICovCisgIGludCBjXzEgPSAwOyAvKiBjb250ZXh0IG9mIGN1cnJlbnQgZnJhbWUgMSB0aW1lIHN0ZXBzIGFnbyAqLworICBpbnQgY18wID0gMTsgLyogY29udGV4dCBvZiBjdXJyZW50IGZyYW1lIHRvIGJlIGNhbGN1bGF0ZWQgKi8KKworICAvKiBhcmlfc3RhcnRfZGVjb2RpbmdfMTRiaXRzICovCisgIGFzLmxvdyA9IDA7CisgIGFzLmhpZ2ggPSBhcmlfcTRuZXc7CisgIGFzLnZvYmYgPSBGREtyZWFkQml0cyhiYnVmLCBjYml0c25ldyk7CisKKyAgLyogYXJpdGhfbWFwX2NvbnRleHQgKi8KKyAgc3RhdGVfaW5jID0gY19wcmV2WzBdIDw8IDEyOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiBhcml0aF9nZXRfY29udGV4dCAqLworICAgIHMgPSBzdGF0ZV9pbmMgPj4gODsKKyAgICBzID0gcyArIChjX3ByZXZbaSArIDFdIDw8IDgpOworICAgIHMgPSAocyA8PCA0KSArIGNfMTsKKworICAgIHN0YXRlX2luYyA9IHM7CisKKyAgICBpZiAoaSA+IDMpIHsKKyAgICAgIC8qIEN1bXVsYXRpdmUgYW1wbGl0dWRlIGJlbG93IDIgKi8KKyAgICAgIGlmICgoY18xICsgY18yICsgY18zKSA8IDUpIHsKKyAgICAgICAgcyArPSAweDEwMDAwOworICAgICAgfQorICAgIH0KKworICAgIC8qIE1TQnMgZGVjb2RpbmcgKi8KKyAgICBmb3IgKGxldiA9IGVzY19uYiA9IDA7OykgeworICAgICAgcGtpID0gZ2V0X3BrX3YyKHMgKyAoZXNjX25iIDw8IChWQUxfRVNDICsgMSkpKTsKKyAgICAgIHIgPSBhcmlfZGVjb2RlXzE0Yml0cyhiYnVmLCAmYXMsIGFyaV9wa1twa2ldLCBWQUxfRVNDICsgMSk7CisgICAgICBpZiAociA8IFZBTF9FU0MpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGxldisrOworCisgICAgICBpZiAoZXNjX25iIDwgNykgeworICAgICAgICBlc2NfbmIrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTdG9wIHN5bWJvbCAqLworICAgIGlmIChyID09IDApIHsKKyAgICAgIGlmIChlc2NfbmIgPiAwKSB7CisgICAgICAgIGJyZWFrOyAvKiBTdG9wIHN5bWJvbCAqLworICAgICAgfQorICAgICAgY18wID0gMTsKKyAgICB9IGVsc2UgLyogaWYgKHI9PTApICovCisgICAgeworICAgICAgSU5UIGIgPSByID4+IDI7CisgICAgICBJTlQgYSA9IHIgJiAweDM7CisKKyAgICAgIC8qIExTQnMgZGVjb2RpbmcgKi8KKyAgICAgIGZvciAobCA9IDA7IGwgPCBsZXY7IGwrKykgeworICAgICAgICB7CisgICAgICAgICAgaW50IHBpZHggPSAoYSA9PSAwKSA/IDEgOiAoKGIgPT0gMCkgPyAwIDogMik7CisgICAgICAgICAgciA9IGFyaV9kZWNvZGVfMTRiaXRzKGJidWYsICZhcywgYXJpX2xzYjJbcGlkeF0sIDQpOworICAgICAgICB9CisgICAgICAgIGEgPSAoYSA8PCAxKSB8IChyICYgMSk7CisgICAgICAgIGIgPSAoYiA8PCAxKSB8IChyID4+IDEpOworICAgICAgfQorCisgICAgICBwU3BlY3RyYWxDb2VmZmljaWVudFsyICogaV0gPSAoRklYUF9EQkwpYTsKKyAgICAgIHBTcGVjdHJhbENvZWZmaWNpZW50WzIgKiBpICsgMV0gPSAoRklYUF9EQkwpYjsKKworICAgICAgY18wID0gYSArIGIgKyAxOworICAgICAgaWYgKGNfMCA+IDB4RikgeworICAgICAgICBjXzAgPSAweEY7CisgICAgICB9CisKKyAgICB9IC8qIGVuZGlmIChyPT0wKSAqLworCisgICAgLyogYXJpdGhfdXBkYXRlX2NvbnRleHQgKi8KKyAgICBjXzMgPSBjXzI7CisgICAgY18yID0gY18xOworICAgIGNfMSA9IGNfMDsKKyAgICBjX3ByZXZbaV0gPSAoVUNIQVIpY18wOworCisgIH0gLyogZm9yIChpPTA7IGk8bjsgaSsrKSAqLworCisgIEZES3B1c2hCYWNrKGJidWYsIGNiaXRzbmV3IC0gMik7CisKKyAgLyogV2UgbmVlZCB0byBydW4gb25seSBmcm9tIDAgdG8gaS0xIHNpbmNlIGFsbCBvdGhlciBxW2ldWzFdLmEsYiB3aWxsIGJlCisgICAqIGNsZWFyZWQgbGF0ZXIgKi8KKyAgaW50IGogPSBpOworICBmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisgICAgaW50IGJpdHMgPSAwOworICAgIGlmIChwU3BlY3RyYWxDb2VmZmljaWVudFsyICogaV0gIT0gKEZJWFBfREJMKTApIGJpdHMrKzsKKyAgICBpZiAocFNwZWN0cmFsQ29lZmZpY2llbnRbMiAqIGkgKyAxXSAhPSAoRklYUF9EQkwpMCkgYml0cysrOworCisgICAgaWYgKGJpdHMpIHsKKyAgICAgIHIgPSBGREtyZWFkQml0cyhiYnVmLCBiaXRzKTsKKyAgICAgIGlmIChwU3BlY3RyYWxDb2VmZmljaWVudFsyICogaV0gIT0gKEZJWFBfREJMKTAgJiYgIShyID4+IChiaXRzIC0gMSkpKSB7CisgICAgICAgIHBTcGVjdHJhbENvZWZmaWNpZW50WzIgKiBpXSA9IC1wU3BlY3RyYWxDb2VmZmljaWVudFsyICogaV07CisgICAgICB9CisgICAgICBpZiAocFNwZWN0cmFsQ29lZmZpY2llbnRbMiAqIGkgKyAxXSAhPSAoRklYUF9EQkwpMCAmJiAhKHIgJiAxKSkgeworICAgICAgICBwU3BlY3RyYWxDb2VmZmljaWVudFsyICogaSArIDFdID0gLXBTcGVjdHJhbENvZWZmaWNpZW50WzIgKiBpICsgMV07CisgICAgICB9CisgICAgfQorICB9CisKKyAgRkRLbWVtc2V0KCZjX3ByZXZbaV0sIDEsIHNpemVvZihjX3ByZXZbMF0pICogKG50IC0gaSkpOworfQorCitDQXJjb0RhdGEgKkNBcmNvX0NyZWF0ZSh2b2lkKSB7IHJldHVybiBHZXRBcmNvRGF0YSgpOyB9CisKK3ZvaWQgQ0FyY29fRGVzdHJveShDQXJjb0RhdGEgKnBBcmNvRGF0YSkgeyBGcmVlQXJjb0RhdGEoJnBBcmNvRGF0YSk7IH0KKworQVJJVEhfQ09ESU5HX0VSUk9SIENBcmNvX0RlY29kZUFyaXRoRGF0YShDQXJjb0RhdGEgKnBBcmNvRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGcsIGludCBsZ19tYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcml0aF9yZXNldF9mbGFnKSB7CisgIEFSSVRIX0NPRElOR19FUlJPUiBFcnJvclN0YXR1cyA9IEFSSVRIX0NPREVSX09LOworCisgIC8qIENoZWNrIGxnIGFuZCBsZ19tYXggY29uc2lzdGVuY3kuICovCisgIGlmIChsZ19tYXggPCBsZykgeworICAgIHJldHVybiBBUklUSF9DT0RFUl9FUlJPUjsKKyAgfQorCisgIEZES21lbWNsZWFyKG1kY3RTcGVjdHJ1bSwgbGdfbWF4ICogc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgLyogYXJpdGhfbWFwX2NvbnRleHQgKi8KKyAgaWYgKGFyaXRoX3Jlc2V0X2ZsYWcpIHsKKyAgICBGREttZW1jbGVhcihwQXJjb0RhdGEtPmNfcHJldiwKKyAgICAgICAgICAgICAgICBzaXplb2YocEFyY29EYXRhLT5jX3ByZXZbMF0pICogKChsZ19tYXggLyAyKSArIDQpKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAobGdfbWF4ICE9IHBBcmNvRGF0YS0+bV9udW1iZXJMaW5lc1ByZXYpIHsKKyAgICAgIGlmIChwQXJjb0RhdGEtPm1fbnVtYmVyTGluZXNQcmV2ID09IDApIHsKKyAgICAgICAgLyogQ2Fubm90IGRlY29kZSB3aXRob3V0IGEgdmFsaWQgQUMgY29udGV4dCAqLworICAgICAgICByZXR1cm4gQVJJVEhfQ09ERVJfRVJST1I7CisgICAgICB9CisKKyAgICAgIC8qIHNob3J0LXRvLWxvbmcgb3IgbG9uZy10by1zaG9ydCBibG9jayB0cmFuc2l0aW9uICovCisgICAgICAvKiBDdXJyZW50IGxlbmd0aCBkaWZmZXJzIGNvbXBhcmVkIHRvIHByZXZpb3VzIC0gcGVyZm9ybSB1cC9kb3dubWl4IG9mCisgICAgICAgKiBtX3FidWYgKi8KKyAgICAgIGNvcHlUYWJsZUFtcndiQXJpdGgyKHBBcmNvRGF0YS0+Y19wcmV2LCBwQXJjb0RhdGEtPm1fbnVtYmVyTGluZXNQcmV2ID4+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsZ19tYXggPj4gMSk7CisgICAgfQorICB9CisKKyAgcEFyY29EYXRhLT5tX251bWJlckxpbmVzUHJldiA9IGxnX21heDsKKworICBpZiAobGcgPiAwKSB7CisgICAgZGVjb2RlMihoQnMsIHBBcmNvRGF0YS0+Y19wcmV2ICsgMiwgbWRjdFNwZWN0cnVtLCBsZyA+PiAxLCBsZ19tYXggPj4gMSk7CisgIH0gZWxzZSB7CisgICAgRkRLbWVtc2V0KCZwQXJjb0RhdGEtPmNfcHJldlsyXSwgMSwKKyAgICAgICAgICAgICAgc2l6ZW9mKHBBcmNvRGF0YS0+Y19wcmV2WzJdKSAqIChsZ19tYXggPj4gMSkpOworICB9CisKKyAgaWYgKChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcykgPCAwKSB7CisgICAgcmV0dXJuIEFSSVRIX0NPREVSX0VSUk9SOworICB9CisKKyAgcmV0dXJuIEVycm9yU3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbGliRFJDZGVjL2luY2x1ZGUvRkRLX2RyY0RlY0xpYi5oIGIvbGliRFJDZGVjL2luY2x1ZGUvRkRLX2RyY0RlY0xpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxODdlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJEUkNkZWMvaW5jbHVkZS9GREtfZHJjRGVjTGliLmgKQEAgLTAsMCArMSwzMTMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRy1EIERSQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEJlcm5oYXJkIE5ldWdlYmF1ZXIKKworICAgRGVzY3JpcHRpb246IE1QRUctRCBEUkMgRGVjb2RlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZES19EUkNERUNMSUJfSAorI2RlZmluZSBGREtfRFJDREVDTElCX0gKKworI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJGREtfYXVkaW8uaCIKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKy8qIERSQyBkZWNvZGVyIGFjY29yZGluZyB0byBJU08vSUVDIDIzMDAzLTQgKE1QRUctRCBEUkMpICovCisvKiBpbmNsdWRpbmcgSVNPL0lFQyAyMzAwMy00L0FNRDEgKEFtZW5kbWVudCAxKSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHNfZHJjX2RlY29kZXIqIEhBTkRMRV9EUkNfREVDT0RFUjsKK3R5cGVkZWYgc3RydWN0IHNfdW5pX2RyY19pbnRlcmZhY2UqIEhBTkRMRV9VTklfRFJDX0lOVEVSRkFDRTsKK3R5cGVkZWYgc3RydWN0IHNfc2VsZWN0aW9uX3Byb2Nlc3Nfb3V0cHV0KiBIQU5ETEVfU0VMX1BST0NfT1VUUFVUOworCit0eXBlZGVmIGVudW0geworICBEUkNfREVDX1NFTEVDVElPTiA9IDB4MSwgLyogRFJDIGRlY29kZXIgaW5zdGFuY2UgZm9yIERSQyBzZXQgc2VsZWN0aW9uIG9ubHkgKi8KKyAgRFJDX0RFQ19HQUlOID0gMHgyLCAgICAgIC8qIERSQyBkZWNvZGVyIGluc3RhbmNlIGZvciBhcHBseWluZyBEUkMgb25seSAqLworICBEUkNfREVDX0FMTCA9IDB4MyAgICAgICAgLyogRFJDIGRlY29kZXIgd2l0aCBmdWxsIGZ1bmN0aW9uYWxpdHkgKi8KK30gRFJDX0RFQ19GVU5DVElPTkFMX1JBTkdFOworCit0eXBlZGVmIGVudW0geworICAvKiBnZXQgYW5kIHNldCB1c2VycGFyYW1zICovCisgIERSQ19ERUNfQk9PU1QsCisgIERSQ19ERUNfQ09NUFJFU1MsCisgIC8qIHNldCBvbmx5IHVzZXJwYXJhbXMgKi8KKyAgRFJDX0RFQ19MT1VETkVTU19OT1JNQUxJWkFUSU9OX09OLAorICBEUkNfREVDX1RBUkdFVF9MT1VETkVTUywgLyoqPCB0YXJnZXQgbG91ZG5lc3MgaW4gZEIsIHdpdGggZXhwb25lbnQgZSA9IDcgKi8KKyAgRFJDX0RFQ19FRkZFQ1RfVFlQRSwKKyAgRFJDX0RFQ19FRkZFQ1RfVFlQRV9GQUxMQkFDS19DT0RFLAorICBEUkNfREVDX0xPVURORVNTX01FQVNVUkVNRU5UX01FVEhPRCwKKyAgLyogc2V0IG9ubHkgc3lzdGVtIChub3QgdXNlcikgcGFyYW1ldGVycyAqLworICBEUkNfREVDX0RPV05NSVhfSUQsCisgIERSQ19ERUNfVEFSR0VUX0NIQU5ORUxfQ09VTlRfUkVRVUVTVEVELCAvKio8IG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVkIHRvIEZES19kcmNEZWNMaWIgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2luZyBhbiBhcHByb3ByaWF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peEluc3RydWN0aW9uICovCisgIERSQ19ERUNfQkFTRV9DSEFOTkVMX0NPVU5ULAorICAvKiBnZXQgb25seSBzeXN0ZW0gcGFyYW1ldGVycyAqLworICBEUkNfREVDX0lTX01VTFRJQkFORF9EUkNfMSwKKyAgRFJDX0RFQ19JU19NVUxUSUJBTkRfRFJDXzIsCisgIERSQ19ERUNfSVNfQUNUSVZFLCAvKio8IE1QRUctRCBEUkMgcGF5bG9hZCBpcyBwcmVzZW50IGFuZCBhdCBsZWFzdCBvbmUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWMgUmFuZ2UgQ29udHJvbCAoRFJDKSBvciBMb3VkbmVzcyBOb3JtYWxpemF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAoTE4pIGlzIGFjdGl2YXRlZCAqLworICBEUkNfREVDX1RBUkdFVF9DSEFOTkVMX0NPVU5UX1NFTEVDVEVEIC8qKjwgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGRvd25taXhJbnN0cnVjdGlvbiBleGlzdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gRFJDX0RFQ19VU0VSUEFSQU07CisKK3R5cGVkZWYgZW51bSB7CisgIERSQ19ERUNfT0sgPSAwLAorCisgIERSQ19ERUNfTk9UX09LID0gLTEwMDAwLAorICBEUkNfREVDX09VVF9PRl9NRU1PUlksCisgIERSQ19ERUNfTk9UX09QRU5FRCwKKyAgRFJDX0RFQ19OT1RfUkVBRFksCisgIERSQ19ERUNfUEFSQU1fT1VUX09GX1JBTkdFLAorICBEUkNfREVDX0lOVkFMSURfUEFSQU0sCisgIERSQ19ERUNfVU5TVVBQT1JURURfRlVOQ1RJT04KK30gRFJDX0RFQ19FUlJPUjsKKwordHlwZWRlZiBlbnVtIHsKKyAgRFJDX0RFQ19URVNUX1RJTUVfRE9NQUlOID0gLTEwMCwKKyAgRFJDX0RFQ19URVNUX1FNRl9ET01BSU4sCisgIERSQ19ERUNfVEVTVF9TVEZUX0RPTUFJTiwKKyAgRFJDX0RFQ19DT0RFQ19NT0RFX1VOREVGSU5FRCA9IC0xLAorICBEUkNfREVDX01QRUdfNF9BQUMsCisgIERSQ19ERUNfTVBFR19EX1VTQUMsCisgIERSQ19ERUNfTVBFR19IXzNEQQorfSBEUkNfREVDX0NPREVDX01PREU7CisKKy8qIEFwcGx5IG9ubHkgRFJDIHNldHMgZGVkaWNhdGVkIHRvIHByb2Nlc3NpbmcgbG9jYXRpb24uCisgICBEUkMxOiBiZWZvcmUgZG93bm1peAorICAgRFJDMjogYmVmb3JlIG9yIGFmdGVyIGRvd25taXggKEFNRDE6IG9ubHkgYWZ0ZXIgZG93bm1peCkKKyAgIERSQzM6IGFmdGVyIGRvd25taXggKi8KK3R5cGVkZWYgZW51bSB7CisgIERSQ19ERUNfRFJDMSwKKyAgRFJDX0RFQ19EUkMxX0RSQzIsCisgIERSQ19ERUNfRFJDMiwKKyAgRFJDX0RFQ19EUkMzLAorICBEUkNfREVDX0RSQzJfRFJDMworfSBEUkNfREVDX0xPQ0FUSU9OOworCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX09wZW4oSEFORExFX0RSQ19ERUNPREVSKiBwaERyY0RlYywKKyAgICAgICAgICAgICAgICBjb25zdCBEUkNfREVDX0ZVTkNUSU9OQUxfUkFOR0UgZnVuY3Rpb25hbFJhbmdlKTsKKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19TZXRDb2RlY01vZGUoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEUkNfREVDX0NPREVDX01PREUgY29kZWNNb2RlKTsKKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19Jbml0KEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLCBjb25zdCBpbnQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgIGNvbnN0IGludCBzYW1wbGVSYXRlLCBjb25zdCBpbnQgYmFzZUNoYW5uZWxDb3VudCk7CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfQ2xvc2UoSEFORExFX0RSQ19ERUNPREVSKiBwaERyY0RlYyk7CisKKy8qIHNldCBzaW5nbGUgdXNlciByZXF1ZXN0ICovCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX1NldFBhcmFtKEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEUkNfREVDX1VTRVJQQVJBTSByZXF1ZXN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgcmVxdWVzdFZhbHVlKTsKKworTE9ORyBGREtfZHJjRGVjX0dldFBhcmFtKEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERSQ19ERUNfVVNFUlBBUkFNIHJlcXVlc3RUeXBlKTsKKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19TZXRJbnRlcmZhY2VQYXJhbWV0ZXJzKEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0lOVEVSRkFDRSB1bmlEcmNJbnRlcmZhY2UpOworCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX1NldFNlbGVjdGlvblByb2Nlc3NNcGVnaFBhcmFtZXRlcnNfc2ltcGxlKAorICAgIEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLCBjb25zdCBpbnQgZ3JvdXBQcmVzZXRJZFJlcXVlc3RlZCwKKyAgICBjb25zdCBpbnQgbnVtR3JvdXBJZHNSZXF1ZXN0ZWQsIGNvbnN0IGludCogZ3JvdXBJZHNSZXF1ZXN0ZWQpOworCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX1NldERvd25taXhJbnN0cnVjdGlvbnMoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bURvd21peElkLCBjb25zdCBpbnQqIGRvd25taXhJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIHRhcmdldExheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIHRhcmdldENoYW5uZWxDb3VudCk7CisKK3ZvaWQgRkRLX2RyY0RlY19TZXRTZWxlY3Rpb25Qcm9jZXNzT3V0cHV0KAorICAgIEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLCBIQU5ETEVfU0VMX1BST0NfT1VUUFVUIGhTZWxQcm9jT3V0cHV0KTsKKworSEFORExFX1NFTF9QUk9DX09VVFBVVAorRkRLX2RyY0RlY19HZXRTZWxlY3Rpb25Qcm9jZXNzT3V0cHV0KEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjKTsKKworTE9ORyAvKiBGSVhQX0RCTCwgZSA9IDcgKi8KK0ZES19kcmNEZWNfR2V0R3JvdXBMb3VkbmVzcyhIQU5ETEVfU0VMX1BST0NfT1VUUFVUIGhTZWxQcm9jT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBncm91cElELCBpbnQqIGdyb3VwTG91ZG5lc3NBdmFpbGFibGUpOworCit2b2lkIEZES19kcmNEZWNfU2V0Q2hhbm5lbEdhaW5zKEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtQ2hhbm5lbHMsIGNvbnN0IGludCBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiBjaGFubmVsR2FpbkRiLCBGSVhQX0RCTCogYXVkaW9CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBhdWRpb0J1ZmZlckNoYW5uZWxPZmZzZXQpOworCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX1JlYWRVbmlEcmNDb25maWcoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSk7CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfUmVhZExvdWRuZXNzSW5mb1NldChIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKTsKKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19SZWFkTG91ZG5lc3NCb3goSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKTsKKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19SZWFkRG93bm1peEluc3RydWN0aW9uc19Cb3goSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKTsKKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19SZWFkVW5pRHJjSW5zdHJ1Y3Rpb25zX0JveChIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSk7CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfUmVhZFVuaURyY0NvZWZmaWNpZW50c19Cb3goSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0pOworCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX1JlYWRVbmlEcmNHYWluKEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKTsKKworLyogZWl0aGVyIGNhbGwgRkRLX2RyY0RlY19SZWFkVW5pRHJjQ29uZmlnLCBGREtfZHJjRGVjX1JlYWRMb3VkbmVzc0luZm9TZXQgYW5kCisgICBGREtfZHJjRGVjX1JlYWRVbmlEcmNHYWluIHNlcGFyYXRlbHksIG9yIGNhbGwgRkRLX2RyY0RlY19SZWFkVW5pRHJjICovCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX1JlYWRVbmlEcmMoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSk7CisKKy8qIGNhbGxpbmcgc2VxdWVuY2U6CisgICBGREtfZHJjRGVjX1JlYWQuLi4oKQorICAgRkRLX2RyY0RlY19TZXRDaGFubmVsR2FpbnMoKQorICAgRkRLX2RyY0RlY19QcmVwcm9jZXNzKCkKKyAgIEZES19kcmNEZWNfUHJvY2Vzcy4uLigpICovCisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfUHJlcHJvY2VzcyhIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYyk7CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfUHJvY2Vzc1RpbWUoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsIGNvbnN0IGludCBkZWxheVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERSQ19ERUNfTE9DQVRJT04gZHJjTG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaGFubmVsT2Zmc2V0LCBjb25zdCBpbnQgZHJjQ2hhbm5lbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bUNoYW5uZWxzUHJvY2Vzc2VkLCBGSVhQX0RCTCogcmVhbEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbWVEYXRhQ2hhbm5lbE9mZnNldCk7CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfUHJvY2Vzc0ZyZXEoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsIGNvbnN0IGludCBkZWxheVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERSQ19ERUNfTE9DQVRJT04gZHJjTG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaGFubmVsT2Zmc2V0LCBjb25zdCBpbnQgZHJjQ2hhbm5lbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bUNoYW5uZWxzUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcHJvY2Vzc1NpbmdsZVRpbWVzbG90LCBGSVhQX0RCTCoqIHJlYWxCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiogaW1hZ0J1ZmZlcik7CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfQXBwbHlEb3dubWl4KEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLCBpbnQqIHJldmVyc2VJbkNoYW5uZWxNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHJldmVyc2VPdXRDaGFubmVsTWFwLCBGSVhQX0RCTCogcmVhbEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCogcE5DaGFubmVscyk7CisKKy8qIEdldCBsaWJyYXJ5IGluZm8gZm9yIHRoaXMgbW9kdWxlLiAqLworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19HZXRMaWJJbmZvKExJQl9JTkZPKiBpbmZvKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliRFJDZGVjL3NyYy9GREtfZHJjRGVjTGliLmNwcCBiL2xpYkRSQ2RlYy9zcmMvRkRLX2RyY0RlY0xpYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5Yjc5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYkRSQ2RlYy9zcmMvRkRLX2RyY0RlY0xpYi5jcHAKQEAgLTAsMCArMSw4OTEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRy1EIERSQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEJlcm5oYXJkIE5ldWdlYmF1ZXIKKworICAgRGVzY3JpcHRpb246IE1QRUctRCBEUkMgRGVjb2RlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZHJjRGVjX3JlYWRlci5oIgorI2luY2x1ZGUgImRyY0RlY19nYWluRGVjb2Rlci5oIgorI2luY2x1ZGUgIkZES19kcmNEZWNMaWIuaCIKKworI2luY2x1ZGUgImRyY0RlY19zZWxlY3Rpb25Qcm9jZXNzLmgiCisjaW5jbHVkZSAiZHJjRGVjX3Rvb2xzLmgiCisKKy8qIERlY29kZXIgbGlicmFyeSBpbmZvICovCisjZGVmaW5lIERSQ0RFQ19MSUJfVkwwIDIKKyNkZWZpbmUgRFJDREVDX0xJQl9WTDEgMQorI2RlZmluZSBEUkNERUNfTElCX1ZMMiAwCisjZGVmaW5lIERSQ0RFQ19MSUJfVElUTEUgIk1QRUctRCBEUkMgRGVjb2RlciBMaWIiCisjaWZkZWYgX19BTkRST0lEX18KKyNkZWZpbmUgRFJDREVDX0xJQl9CVUlMRF9EQVRFICIiCisjZGVmaW5lIERSQ0RFQ19MSUJfQlVJTERfVElNRSAiIgorI2Vsc2UKKyNkZWZpbmUgRFJDREVDX0xJQl9CVUlMRF9EQVRFIF9fREFURV9fCisjZGVmaW5lIERSQ0RFQ19MSUJfQlVJTERfVElNRSBfX1RJTUVfXworI2VuZGlmCisKK3R5cGVkZWYgZW51bSB7CisgIERSQ19ERUNfTk9UX0lOSVRJQUxJWkVEID0gMCwKKyAgRFJDX0RFQ19JTklUSUFMSVpFRCwKKyAgRFJDX0RFQ19ORVdfR0FJTl9QQVlMT0FELAorICBEUkNfREVDX0lOVEVSUE9MQVRJT05fUFJFUEFSRUQKK30gRFJDX0RFQ19TVEFUVVM7CisKK3N0cnVjdCBzX2RyY19kZWNvZGVyIHsKKyAgRFJDX0RFQ19DT0RFQ19NT0RFIGNvZGVjTW9kZTsKKyAgRFJDX0RFQ19GVU5DVElPTkFMX1JBTkdFIGZ1bmN0aW9uYWxSYW5nZTsKKyAgRFJDX0RFQ19TVEFUVVMgc3RhdHVzOworCisgIC8qIGhhbmRsZXMgb2Ygc3VibW9kdWxlcyAqLworICBIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYzsKKyAgSEFORExFX0RSQ19TRUxFQ1RJT05fUFJPQ0VTUyBoU2VsZWN0aW9uUHJvYzsKKyAgaW50IHNlbFByb2NJbnB1dERpZmY7CisKKyAgLyogZGF0YSBzdHJ1Y3RzICovCisgIFVOSV9EUkNfQ09ORklHIHVuaURyY0NvbmZpZzsKKyAgTE9VRE5FU1NfSU5GT19TRVQgbG91ZG5lc3NJbmZvU2V0OworICBVTklfRFJDX0dBSU4gdW5pRHJjR2FpbjsKKworICBTRUxfUFJPQ19PVVRQVVQgc2VsUHJvY091dHB1dDsKK30gRFJDX0RFQ09ERVI7CisKK3N0YXRpYyBpbnQgaXNSZXNldE5lZWRlZChIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRUxfUFJPQ19PVVRQVVQgb2xkU2VsUHJvY091dHB1dCkgeworICBpbnQgaSwgcmVzZXROZWVkZWQgPSAwOworCisgIGlmIChoRHJjRGVjLT5zZWxQcm9jT3V0cHV0Lm51bVNlbGVjdGVkRHJjU2V0cyAhPQorICAgICAgb2xkU2VsUHJvY091dHB1dC5udW1TZWxlY3RlZERyY1NldHMpIHsKKyAgICByZXNldE5lZWRlZCA9IDE7CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhEcmNEZWMtPnNlbFByb2NPdXRwdXQubnVtU2VsZWN0ZWREcmNTZXRzOyBpKyspIHsKKyAgICAgIGlmIChoRHJjRGVjLT5zZWxQcm9jT3V0cHV0LnNlbGVjdGVkRHJjU2V0SWRzW2ldICE9CisgICAgICAgICAgb2xkU2VsUHJvY091dHB1dC5zZWxlY3RlZERyY1NldElkc1tpXSkKKyAgICAgICAgcmVzZXROZWVkZWQgPSAxOworICAgICAgaWYgKGhEcmNEZWMtPnNlbFByb2NPdXRwdXQuc2VsZWN0ZWREb3dubWl4SWRzW2ldICE9CisgICAgICAgICAgb2xkU2VsUHJvY091dHB1dC5zZWxlY3RlZERvd25taXhJZHNbaV0pCisgICAgICAgIHJlc2V0TmVlZGVkID0gMTsKKyAgICB9CisgIH0KKworICBpZiAoaERyY0RlYy0+c2VsUHJvY091dHB1dC5ib29zdCAhPSBvbGRTZWxQcm9jT3V0cHV0LmJvb3N0KSByZXNldE5lZWRlZCA9IDE7CisgIGlmIChoRHJjRGVjLT5zZWxQcm9jT3V0cHV0LmNvbXByZXNzICE9IG9sZFNlbFByb2NPdXRwdXQuY29tcHJlc3MpCisgICAgcmVzZXROZWVkZWQgPSAxOworCisgIC8qIE5vdGU6IENoYW5nZXMgaW4gZG93bm1peCBtYXRyaXggYXJlIG5vdCBjYXVnaHQsIGFzIHRoZXkgZG9uJ3QgYWZmZWN0IHRoZQorICAgKiBEUkMgZ2FpbiBkZWNvZGVyICovCisKKyAgcmV0dXJuIHJlc2V0TmVlZGVkOworfQorCitzdGF0aWMgRFJDX0RFQ19FUlJPUiBzdGFydFNlbGVjdGlvblByb2Nlc3MoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMpIHsKKyAgRFJDX0VSUk9SIGRFcnIgPSBERV9PSzsKKyAgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBzRXJyID0gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworICBpbnQgdW5pRHJjQ29uZmlnSGFzQ2hhbmdlZCA9IDA7CisgIFNFTF9QUk9DX09VVFBVVCBvbGRTZWxQcm9jT3V0cHV0ID0gaERyY0RlYy0+c2VsUHJvY091dHB1dDsKKworICBpZiAoIWhEcmNEZWMtPnN0YXR1cykgcmV0dXJuIERSQ19ERUNfTk9UX1JFQURZOworCisgIGlmIChoRHJjRGVjLT5mdW5jdGlvbmFsUmFuZ2UgJiBEUkNfREVDX1NFTEVDVElPTikgeworICAgIHVuaURyY0NvbmZpZ0hhc0NoYW5nZWQgPSBoRHJjRGVjLT51bmlEcmNDb25maWcuZGlmZjsKKyAgICBpZiAoaERyY0RlYy0+dW5pRHJjQ29uZmlnLmRpZmYgfHwgaERyY0RlYy0+bG91ZG5lc3NJbmZvU2V0LmRpZmYgfHwKKyAgICAgICAgaERyY0RlYy0+c2VsUHJvY0lucHV0RGlmZikgeworICAgICAgLyogaW4gY2FzZSBvZiBhbiBlcnJvciwgc2lnbmFsIHRoYXQgc2VsZWN0aW9uIHByb2Nlc3Mgd2FzIG5vdCBzdWNjZXNzZnVsCisgICAgICAgKi8KKyAgICAgIGhEcmNEZWMtPnNlbFByb2NPdXRwdXQubnVtU2VsZWN0ZWREcmNTZXRzID0gMDsKKworICAgICAgc0VyciA9IGRyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX1Byb2Nlc3MoCisgICAgICAgICAgaERyY0RlYy0+aFNlbGVjdGlvblByb2MsICYoaERyY0RlYy0+dW5pRHJjQ29uZmlnKSwKKyAgICAgICAgICAmKGhEcmNEZWMtPmxvdWRuZXNzSW5mb1NldCksICYoaERyY0RlYy0+c2VsUHJvY091dHB1dCkpOworICAgICAgaWYgKHNFcnIpIHJldHVybiBEUkNfREVDX09LOworCisgICAgICBoRHJjRGVjLT5zZWxQcm9jSW5wdXREaWZmID0gMDsKKyAgICAgIGhEcmNEZWMtPnVuaURyY0NvbmZpZy5kaWZmID0gMDsKKyAgICAgIGhEcmNEZWMtPmxvdWRuZXNzSW5mb1NldC5kaWZmID0gMDsKKyAgICB9CisgIH0KKworICBpZiAoaERyY0RlYy0+ZnVuY3Rpb25hbFJhbmdlICYgRFJDX0RFQ19HQUlOKSB7CisgICAgaWYgKGlzUmVzZXROZWVkZWQoaERyY0RlYywgb2xkU2VsUHJvY091dHB1dCkgfHwgdW5pRHJjQ29uZmlnSGFzQ2hhbmdlZCkgeworICAgICAgZEVyciA9CisgICAgICAgICAgZHJjRGVjX0dhaW5EZWNvZGVyX0NvbmZpZyhoRHJjRGVjLT5oR2FpbkRlYywgJihoRHJjRGVjLT51bmlEcmNDb25maWcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaERyY0RlYy0+c2VsUHJvY091dHB1dC5udW1TZWxlY3RlZERyY1NldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRHJjRGVjLT5zZWxQcm9jT3V0cHV0LnNlbGVjdGVkRHJjU2V0SWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaERyY0RlYy0+c2VsUHJvY091dHB1dC5zZWxlY3RlZERvd25taXhJZHMpOworICAgICAgaWYgKGRFcnIpIHJldHVybiBEUkNfREVDX09LOworICAgIH0KKyAgfQorICByZXR1cm4gRFJDX0RFQ19PSzsKK30KKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19PcGVuKEhBTkRMRV9EUkNfREVDT0RFUiogcGhEcmNEZWMsCisgICAgICAgICAgICAgICAgY29uc3QgRFJDX0RFQ19GVU5DVElPTkFMX1JBTkdFIGZ1bmN0aW9uYWxSYW5nZSkgeworICBEUkNfRVJST1IgZEVyciA9IERFX09LOworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHNFcnIgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisgIEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjOworCisgICpwaERyY0RlYyA9IChIQU5ETEVfRFJDX0RFQ09ERVIpRkRLY2FsbG9jKDEsIHNpemVvZihEUkNfREVDT0RFUikpOworICBpZiAoISpwaERyY0RlYykgcmV0dXJuIERSQ19ERUNfT1VUX09GX01FTU9SWTsKKyAgaERyY0RlYyA9ICpwaERyY0RlYzsKKworICBoRHJjRGVjLT5mdW5jdGlvbmFsUmFuZ2UgPSBmdW5jdGlvbmFsUmFuZ2U7CisKKyAgaERyY0RlYy0+c3RhdHVzID0gRFJDX0RFQ19OT1RfSU5JVElBTElaRUQ7CisgIGhEcmNEZWMtPmNvZGVjTW9kZSA9IERSQ19ERUNfQ09ERUNfTU9ERV9VTkRFRklORUQ7CisKKyAgaWYgKGhEcmNEZWMtPmZ1bmN0aW9uYWxSYW5nZSAmIERSQ19ERUNfU0VMRUNUSU9OKSB7CisgICAgc0VyciA9IGRyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX0NyZWF0ZSgmKGhEcmNEZWMtPmhTZWxlY3Rpb25Qcm9jKSk7CisgICAgaWYgKHNFcnIpIHJldHVybiBEUkNfREVDX09VVF9PRl9NRU1PUlk7CisgICAgc0VyciA9IGRyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX0luaXQoaERyY0RlYy0+aFNlbGVjdGlvblByb2MpOworICAgIGlmIChzRXJyKSByZXR1cm4gRFJDX0RFQ19OT1RfT0s7CisgICAgaERyY0RlYy0+c2VsUHJvY0lucHV0RGlmZiA9IDE7CisgIH0KKworICBpZiAoaERyY0RlYy0+ZnVuY3Rpb25hbFJhbmdlICYgRFJDX0RFQ19HQUlOKSB7CisgICAgZEVyciA9IGRyY0RlY19HYWluRGVjb2Rlcl9PcGVuKCYoaERyY0RlYy0+aEdhaW5EZWMpKTsKKyAgICBpZiAoZEVycikgcmV0dXJuIERSQ19ERUNfT1VUX09GX01FTU9SWTsKKyAgfQorCisgIHJldHVybiBEUkNfREVDX09LOworfQorCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX1NldENvZGVjTW9kZShIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERSQ19ERUNfQ09ERUNfTU9ERSBjb2RlY01vZGUpIHsKKyAgRFJDX0VSUk9SIGRFcnIgPSBERV9PSzsKKyAgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBzRXJyID0gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworCisgIGlmIChoRHJjRGVjID09IE5VTEwpIHJldHVybiBEUkNfREVDX05PVF9PUEVORUQ7CisKKyAgaWYgKGhEcmNEZWMtPmNvZGVjTW9kZSA9PQorICAgICAgRFJDX0RFQ19DT0RFQ19NT0RFX1VOREVGSU5FRCkgeyAvKiBTZXQgY29kZWMgbW9kZSwgaWYgaXQgaXMgc2V0IGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgdGltZSAqLworICAgIGhEcmNEZWMtPmNvZGVjTW9kZSA9IGNvZGVjTW9kZTsKKworICAgIGlmIChoRHJjRGVjLT5mdW5jdGlvbmFsUmFuZ2UgJiBEUkNfREVDX1NFTEVDVElPTikgeworICAgICAgc0VyciA9IGRyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX1NldENvZGVjTW9kZSgKKyAgICAgICAgICBoRHJjRGVjLT5oU2VsZWN0aW9uUHJvYywgKFNFTF9QUk9DX0NPREVDX01PREUpY29kZWNNb2RlKTsKKyAgICAgIGlmIChzRXJyKSByZXR1cm4gRFJDX0RFQ19OT1RfT0s7CisgICAgICBoRHJjRGVjLT5zZWxQcm9jSW5wdXREaWZmID0gMTsKKyAgICB9CisKKyAgICBpZiAoaERyY0RlYy0+ZnVuY3Rpb25hbFJhbmdlICYgRFJDX0RFQ19HQUlOKSB7CisgICAgICBERUxBWV9NT0RFIGRlbGF5TW9kZTsKKyAgICAgIGludCB0aW1lRG9tYWluU3VwcG9ydGVkOworICAgICAgU1VCQkFORF9ET01BSU5fTU9ERSBzdWJiYW5kRG9tYWluU3VwcG9ydGVkOworCisgICAgICBzd2l0Y2ggKGhEcmNEZWMtPmNvZGVjTW9kZSkgeworICAgICAgICBjYXNlIERSQ19ERUNfTVBFR180X0FBQzoKKyAgICAgICAgY2FzZSBEUkNfREVDX01QRUdfRF9VU0FDOgorICAgICAgICBjYXNlIERSQ19ERUNfTVBFR19IXzNEQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBkZWxheU1vZGUgPSBETV9SRUdVTEFSX0RFTEFZOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGhEcmNEZWMtPmNvZGVjTW9kZSkgeworICAgICAgICBjYXNlIERSQ19ERUNfTVBFR180X0FBQzoKKyAgICAgICAgY2FzZSBEUkNfREVDX01QRUdfRF9VU0FDOgorICAgICAgICAgIHRpbWVEb21haW5TdXBwb3J0ZWQgPSAxOworICAgICAgICAgIHN1YmJhbmREb21haW5TdXBwb3J0ZWQgPSBTRE1fT0ZGOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERSQ19ERUNfTVBFR19IXzNEQToKKyAgICAgICAgICB0aW1lRG9tYWluU3VwcG9ydGVkID0gMTsKKyAgICAgICAgICBzdWJiYW5kRG9tYWluU3VwcG9ydGVkID0gU0RNX1NURlQyNTY7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEUkNfREVDX1RFU1RfVElNRV9ET01BSU46CisgICAgICAgICAgdGltZURvbWFpblN1cHBvcnRlZCA9IDE7CisgICAgICAgICAgc3ViYmFuZERvbWFpblN1cHBvcnRlZCA9IFNETV9PRkY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRFJDX0RFQ19URVNUX1FNRl9ET01BSU46CisgICAgICAgICAgdGltZURvbWFpblN1cHBvcnRlZCA9IDA7CisgICAgICAgICAgc3ViYmFuZERvbWFpblN1cHBvcnRlZCA9IFNETV9RTUY2NDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEUkNfREVDX1RFU1RfU1RGVF9ET01BSU46CisgICAgICAgICAgdGltZURvbWFpblN1cHBvcnRlZCA9IDA7CisgICAgICAgICAgc3ViYmFuZERvbWFpblN1cHBvcnRlZCA9IFNETV9TVEZUMjU2OworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGltZURvbWFpblN1cHBvcnRlZCA9IDA7CisgICAgICAgICAgc3ViYmFuZERvbWFpblN1cHBvcnRlZCA9IFNETV9PRkY7CisgICAgICB9CisKKyAgICAgIGRFcnIgPSBkcmNEZWNfR2FpbkRlY29kZXJfU2V0Q29kZWNEZXBlbmRlbnRQYXJhbWV0ZXJzKAorICAgICAgICAgIGhEcmNEZWMtPmhHYWluRGVjLCBkZWxheU1vZGUsIHRpbWVEb21haW5TdXBwb3J0ZWQsCisgICAgICAgICAgc3ViYmFuZERvbWFpblN1cHBvcnRlZCk7CisgICAgICBpZiAoZEVycikgcmV0dXJuIERSQ19ERUNfTk9UX09LOworICAgIH0KKyAgfQorCisgIC8qIERvbid0IGFsbG93IGNoYW5naW5nIGNvZGVjTW9kZSBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIHNldC4gKi8KKyAgaWYgKGhEcmNEZWMtPmNvZGVjTW9kZSAhPSBjb2RlY01vZGUpIHJldHVybiBEUkNfREVDX05PVF9PSzsKKworICByZXR1cm4gRFJDX0RFQ19PSzsKK30KKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19Jbml0KEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLCBjb25zdCBpbnQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgIGNvbnN0IGludCBzYW1wbGVSYXRlLCBjb25zdCBpbnQgYmFzZUNoYW5uZWxDb3VudCkgeworICBEUkNfRVJST1IgZEVyciA9IERFX09LOworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHNFcnIgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisKKyAgaWYgKGhEcmNEZWMgPT0gTlVMTCB8fCBmcmFtZVNpemUgPT0gMCB8fCBzYW1wbGVSYXRlID09IDAgfHwKKyAgICAgIGJhc2VDaGFubmVsQ291bnQgPT0gMCkKKyAgICByZXR1cm4gRFJDX0RFQ19PSzsgLyogcmV0dXJuIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcgKi8KKworICBpZiAoaERyY0RlYy0+ZnVuY3Rpb25hbFJhbmdlICYgRFJDX0RFQ19TRUxFQ1RJT04pIHsKKyAgICBzRXJyID0gZHJjRGVjX1NlbGVjdGlvblByb2Nlc3NfU2V0UGFyYW0oCisgICAgICAgIGhEcmNEZWMtPmhTZWxlY3Rpb25Qcm9jLCBTRUxfUFJPQ19CQVNFX0NIQU5ORUxfQ09VTlQsCisgICAgICAgIChGSVhQX0RCTCliYXNlQ2hhbm5lbENvdW50LCAmKGhEcmNEZWMtPnNlbFByb2NJbnB1dERpZmYpKTsKKyAgICBpZiAoc0VycikgcmV0dXJuIERSQ19ERUNfTk9UX09LOworICAgIHNFcnIgPSBkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19TZXRQYXJhbSgKKyAgICAgICAgaERyY0RlYy0+aFNlbGVjdGlvblByb2MsIFNFTF9QUk9DX1NBTVBMRV9SQVRFLCAoRklYUF9EQkwpc2FtcGxlUmF0ZSwKKyAgICAgICAgJihoRHJjRGVjLT5zZWxQcm9jSW5wdXREaWZmKSk7CisgICAgaWYgKHNFcnIpIHJldHVybiBEUkNfREVDX05PVF9PSzsKKyAgfQorCisgIGlmIChoRHJjRGVjLT5mdW5jdGlvbmFsUmFuZ2UgJiBEUkNfREVDX0dBSU4pIHsKKyAgICBkRXJyID0gZHJjRGVjX0dhaW5EZWNvZGVyX0luaXQoaERyY0RlYy0+aEdhaW5EZWMsIGZyYW1lU2l6ZSwgc2FtcGxlUmF0ZSk7CisgICAgaWYgKGRFcnIpIHJldHVybiBEUkNfREVDX05PVF9PSzsKKyAgfQorCisgIGhEcmNEZWMtPnN0YXR1cyA9IERSQ19ERUNfSU5JVElBTElaRUQ7CisKKyAgc3RhcnRTZWxlY3Rpb25Qcm9jZXNzKGhEcmNEZWMpOworCisgIHJldHVybiBEUkNfREVDX09LOworfQorCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX0Nsb3NlKEhBTkRMRV9EUkNfREVDT0RFUiogcGhEcmNEZWMpIHsKKyAgSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWM7CisKKyAgaWYgKHBoRHJjRGVjID09IE5VTEwpIHsKKyAgICByZXR1cm4gRFJDX0RFQ19PSzsKKyAgfQorCisgIGhEcmNEZWMgPSAqcGhEcmNEZWM7CisKKyAgaWYgKGhEcmNEZWMgPT0gTlVMTCkgcmV0dXJuIERSQ19ERUNfTk9UX09QRU5FRDsKKworICBpZiAoaERyY0RlYy0+ZnVuY3Rpb25hbFJhbmdlICYgRFJDX0RFQ19HQUlOKSB7CisgICAgZHJjRGVjX0dhaW5EZWNvZGVyX0Nsb3NlKCYoaERyY0RlYy0+aEdhaW5EZWMpKTsKKyAgfQorCisgIGlmIChoRHJjRGVjLT5mdW5jdGlvbmFsUmFuZ2UgJiBEUkNfREVDX1NFTEVDVElPTikgeworICAgIGRyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX0RlbGV0ZSgmKGhEcmNEZWMtPmhTZWxlY3Rpb25Qcm9jKSk7CisgIH0KKworICBGREtmcmVlKCpwaERyY0RlYyk7CisgICpwaERyY0RlYyA9IE5VTEw7CisKKyAgcmV0dXJuIERSQ19ERUNfT0s7Cit9CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfU2V0UGFyYW0oSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERSQ19ERUNfVVNFUlBBUkFNIHJlcXVlc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCByZXF1ZXN0VmFsdWUpIHsKKyAgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBzRXJyID0gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworCisgIGlmIChoRHJjRGVjID09IE5VTEwpIHJldHVybiBEUkNfREVDX05PVF9PUEVORUQ7CisKKyAgaWYgKGhEcmNEZWMtPmZ1bmN0aW9uYWxSYW5nZSA9PSBEUkNfREVDX0dBSU4pCisgICAgcmV0dXJuIERSQ19ERUNfTk9UX09LOyAvKiBub3Qgc3VwcG9ydGVkIGZvciBEUkNfREVDX0dBSU4uIEFsbCBwYXJhbWV0ZXJzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGVkIG92ZXIgdG8gc2VsZWN0aW9uIHByb2Nlc3MgbGliLiAqLworCisgIHN3aXRjaCAocmVxdWVzdFR5cGUpIHsKKyAgICBjYXNlIERSQ19ERUNfQk9PU1Q6CisgICAgICBzRXJyID0gZHJjRGVjX1NlbGVjdGlvblByb2Nlc3NfU2V0UGFyYW0oaERyY0RlYy0+aFNlbGVjdGlvblByb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VMX1BST0NfQk9PU1QsIHJlcXVlc3RWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGhEcmNEZWMtPnNlbFByb2NJbnB1dERpZmYpKTsKKyAgICAgIGlmIChzRXJyKSByZXR1cm4gRFJDX0RFQ19QQVJBTV9PVVRfT0ZfUkFOR0U7CisgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19ERUNfQ09NUFJFU1M6CisgICAgICBzRXJyID0gZHJjRGVjX1NlbGVjdGlvblByb2Nlc3NfU2V0UGFyYW0oaERyY0RlYy0+aFNlbGVjdGlvblByb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VMX1BST0NfQ09NUFJFU1MsIHJlcXVlc3RWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGhEcmNEZWMtPnNlbFByb2NJbnB1dERpZmYpKTsKKyAgICAgIGlmIChzRXJyKSByZXR1cm4gRFJDX0RFQ19QQVJBTV9PVVRfT0ZfUkFOR0U7CisgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19ERUNfTE9VRE5FU1NfTk9STUFMSVpBVElPTl9PTjoKKyAgICAgIHNFcnIgPSBkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19TZXRQYXJhbSgKKyAgICAgICAgICBoRHJjRGVjLT5oU2VsZWN0aW9uUHJvYywgU0VMX1BST0NfTE9VRE5FU1NfTk9STUFMSVpBVElPTl9PTiwKKyAgICAgICAgICByZXF1ZXN0VmFsdWUsICYoaERyY0RlYy0+c2VsUHJvY0lucHV0RGlmZikpOworICAgICAgaWYgKHNFcnIpIHJldHVybiBEUkNfREVDX1BBUkFNX09VVF9PRl9SQU5HRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX0RFQ19UQVJHRVRfTE9VRE5FU1M6CisgICAgICBzRXJyID0gZHJjRGVjX1NlbGVjdGlvblByb2Nlc3NfU2V0UGFyYW0oCisgICAgICAgICAgaERyY0RlYy0+aFNlbGVjdGlvblByb2MsIFNFTF9QUk9DX1RBUkdFVF9MT1VETkVTUywgcmVxdWVzdFZhbHVlLAorICAgICAgICAgICYoaERyY0RlYy0+c2VsUHJvY0lucHV0RGlmZikpOworICAgICAgaWYgKHNFcnIpIHJldHVybiBEUkNfREVDX1BBUkFNX09VVF9PRl9SQU5HRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX0RFQ19FRkZFQ1RfVFlQRToKKyAgICAgIHNFcnIgPSBkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19TZXRQYXJhbSgKKyAgICAgICAgICBoRHJjRGVjLT5oU2VsZWN0aW9uUHJvYywgU0VMX1BST0NfRUZGRUNUX1RZUEUsIHJlcXVlc3RWYWx1ZSwKKyAgICAgICAgICAmKGhEcmNEZWMtPnNlbFByb2NJbnB1dERpZmYpKTsKKyAgICAgIGlmIChzRXJyKSByZXR1cm4gRFJDX0RFQ19QQVJBTV9PVVRfT0ZfUkFOR0U7CisgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19ERUNfRE9XTk1JWF9JRDoKKyAgICAgIHNFcnIgPSBkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19TZXRQYXJhbShoRHJjRGVjLT5oU2VsZWN0aW9uUHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxfUFJPQ19ET1dOTUlYX0lELCByZXF1ZXN0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihoRHJjRGVjLT5zZWxQcm9jSW5wdXREaWZmKSk7CisgICAgICBpZiAoc0VycikgcmV0dXJuIERSQ19ERUNfUEFSQU1fT1VUX09GX1JBTkdFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfREVDX1RBUkdFVF9DSEFOTkVMX0NPVU5UX1JFUVVFU1RFRDoKKyAgICAgIHNFcnIgPSBkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19TZXRQYXJhbSgKKyAgICAgICAgICBoRHJjRGVjLT5oU2VsZWN0aW9uUHJvYywgU0VMX1BST0NfVEFSR0VUX0NIQU5ORUxfQ09VTlQsIHJlcXVlc3RWYWx1ZSwKKyAgICAgICAgICAmKGhEcmNEZWMtPnNlbFByb2NJbnB1dERpZmYpKTsKKyAgICAgIGlmIChzRXJyKSByZXR1cm4gRFJDX0RFQ19QQVJBTV9PVVRfT0ZfUkFOR0U7CisgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19ERUNfQkFTRV9DSEFOTkVMX0NPVU5UOgorICAgICAgc0VyciA9IGRyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX1NldFBhcmFtKAorICAgICAgICAgIGhEcmNEZWMtPmhTZWxlY3Rpb25Qcm9jLCBTRUxfUFJPQ19CQVNFX0NIQU5ORUxfQ09VTlQsIHJlcXVlc3RWYWx1ZSwKKyAgICAgICAgICAmKGhEcmNEZWMtPnNlbFByb2NJbnB1dERpZmYpKTsKKyAgICAgIGlmIChzRXJyKSByZXR1cm4gRFJDX0RFQ19OT1RfT0s7CisgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19ERUNfTE9VRE5FU1NfTUVBU1VSRU1FTlRfTUVUSE9EOgorICAgICAgc0VyciA9IGRyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX1NldFBhcmFtKAorICAgICAgICAgIGhEcmNEZWMtPmhTZWxlY3Rpb25Qcm9jLCBTRUxfUFJPQ19MT1VETkVTU19NRUFTVVJFTUVOVF9NRVRIT0QsCisgICAgICAgICAgcmVxdWVzdFZhbHVlLCAmKGhEcmNEZWMtPnNlbFByb2NJbnB1dERpZmYpKTsKKyAgICAgIGlmIChzRXJyKSByZXR1cm4gRFJDX0RFQ19QQVJBTV9PVVRfT0ZfUkFOR0U7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIERSQ19ERUNfSU5WQUxJRF9QQVJBTTsKKyAgfQorCisgIC8qIEFsbCBwYXJhbWV0ZXJzIG5lZWQgYSBuZXcgc3RhcnQgb2YgdGhlIHNlbGVjdGlvbiBwcm9jZXNzICovCisgIHN0YXJ0U2VsZWN0aW9uUHJvY2VzcyhoRHJjRGVjKTsKKworICByZXR1cm4gRFJDX0RFQ19PSzsKK30KKworTE9ORyBGREtfZHJjRGVjX0dldFBhcmFtKEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERSQ19ERUNfVVNFUlBBUkFNIHJlcXVlc3RUeXBlKSB7CisgIGlmIChoRHJjRGVjID09IE5VTEwpIHJldHVybiBEUkNfREVDX05PVF9PUEVORUQ7CisKKyAgc3dpdGNoIChyZXF1ZXN0VHlwZSkgeworICAgIGNhc2UgRFJDX0RFQ19CT09TVDoKKyAgICAgIHJldHVybiAoTE9ORyloRHJjRGVjLT5zZWxQcm9jT3V0cHV0LmJvb3N0OworICAgIGNhc2UgRFJDX0RFQ19DT01QUkVTUzoKKyAgICAgIHJldHVybiAoTE9ORyloRHJjRGVjLT5zZWxQcm9jT3V0cHV0LmNvbXByZXNzOworICAgIGNhc2UgRFJDX0RFQ19JU19NVUxUSUJBTkRfRFJDXzE6CisgICAgICByZXR1cm4gKExPTkcpYml0c3RyZWFtQ29udGFpbnNNdWx0aWJhbmREcmMoJmhEcmNEZWMtPnVuaURyY0NvbmZpZywgMCk7CisgICAgY2FzZSBEUkNfREVDX0lTX01VTFRJQkFORF9EUkNfMjoKKyAgICAgIHJldHVybiAoTE9ORyliaXRzdHJlYW1Db250YWluc011bHRpYmFuZERyYygmaERyY0RlYy0+dW5pRHJjQ29uZmlnLCAweDdGKTsKKyAgICBjYXNlIERSQ19ERUNfSVNfQUNUSVZFOiB7CisgICAgICAvKiBNUEVHLUQgRFJDIGlzIGNvbnNpZGVyZWQgYWN0aXZlIChhbmQgb3ZlcnJpZGVzIE1QRUctNCBEUkMpLCBpZgorICAgICAgICogdW5pRHJjIHBheWxvYWQgaXMgcHJlc2VudCAobG91ZG5lc3NJbmZvU2V0IGFuZC9vciB1bmlEcmNDb25maWcpCisgICAgICAgKiBhdCBsZWFzdCBvbmUgb2YgRFJDIGFuZCBMb3VkbmVzcyBDb250cm9sIGlzIHN3aXRjaGVkIG9uICovCisgICAgICBpbnQgZHJjT24gPSBkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19HZXRQYXJhbSgKKyAgICAgICAgICBoRHJjRGVjLT5oU2VsZWN0aW9uUHJvYywgU0VMX1BST0NfRFlOQU1JQ19SQU5HRV9DT05UUk9MX09OKTsKKyAgICAgIGludCBsbk9uID0gZHJjRGVjX1NlbGVjdGlvblByb2Nlc3NfR2V0UGFyYW0oCisgICAgICAgICAgaERyY0RlYy0+aFNlbGVjdGlvblByb2MsIFNFTF9QUk9DX0xPVURORVNTX05PUk1BTElaQVRJT05fT04pOworICAgICAgaW50IHVuaURyY1BheWxvYWRQcmVzZW50ID0KKyAgICAgICAgICAoaERyY0RlYy0+bG91ZG5lc3NJbmZvU2V0LmxvdWRuZXNzSW5mb0NvdW50ID4gMCk7CisgICAgICB1bmlEcmNQYXlsb2FkUHJlc2VudCB8PQorICAgICAgICAgIChoRHJjRGVjLT5sb3VkbmVzc0luZm9TZXQubG91ZG5lc3NJbmZvQWxidW1Db3VudCA+IDApOworICAgICAgdW5pRHJjUGF5bG9hZFByZXNlbnQgfD0KKyAgICAgICAgICAoaERyY0RlYy0+dW5pRHJjQ29uZmlnLmRyY0luc3RydWN0aW9uc1VuaURyY0NvdW50ID4gMCk7CisgICAgICB1bmlEcmNQYXlsb2FkUHJlc2VudCB8PQorICAgICAgICAgIChoRHJjRGVjLT51bmlEcmNDb25maWcuZG93bm1peEluc3RydWN0aW9uc0NvdW50ID4gMCk7CisgICAgICByZXR1cm4gKExPTkcpKHVuaURyY1BheWxvYWRQcmVzZW50ICYmIChkcmNPbiB8fCBsbk9uKSk7CisgICAgfQorICAgIGNhc2UgRFJDX0RFQ19UQVJHRVRfQ0hBTk5FTF9DT1VOVF9TRUxFQ1RFRDoKKyAgICAgIHJldHVybiAoTE9ORyloRHJjRGVjLT5zZWxQcm9jT3V0cHV0LnRhcmdldENoYW5uZWxDb3VudDsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19TZXRJbnRlcmZhY2VQYXJhbWV0ZXJzKEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0lOVEVSRkFDRSBoVW5pRHJjSW50ZXJmYWNlKSB7CisgIHJldHVybiBEUkNfREVDX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOworfQorCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX1NldFNlbGVjdGlvblByb2Nlc3NNcGVnaFBhcmFtZXRlcnNfc2ltcGxlKAorICAgIEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLCBjb25zdCBpbnQgZ3JvdXBQcmVzZXRJZFJlcXVlc3RlZCwKKyAgICBjb25zdCBpbnQgbnVtR3JvdXBJZHNSZXF1ZXN0ZWQsIGNvbnN0IGludCogZ3JvdXBJZHNSZXF1ZXN0ZWQpIHsKKyAgcmV0dXJuIERSQ19ERUNfVU5TVVBQT1JURURfRlVOQ1RJT047Cit9CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfU2V0RG93bm1peEluc3RydWN0aW9ucyhIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtRG93bm1peElkLCBjb25zdCBpbnQqIGRvd25taXhJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIHRhcmdldExheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIHRhcmdldENoYW5uZWxDb3VudCkgeworICByZXR1cm4gRFJDX0RFQ19VTlNVUFBPUlRFRF9GVU5DVElPTjsKK30KKwordm9pZCBGREtfZHJjRGVjX1NldFNlbGVjdGlvblByb2Nlc3NPdXRwdXQoCisgICAgSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsIEhBTkRMRV9TRUxfUFJPQ19PVVRQVVQgaFNlbFByb2NPdXRwdXQpIHt9CisKK0hBTkRMRV9TRUxfUFJPQ19PVVRQVVQKK0ZES19kcmNEZWNfR2V0U2VsZWN0aW9uUHJvY2Vzc091dHB1dChIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYykgeworICBpZiAoaERyY0RlYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICByZXR1cm4gJihoRHJjRGVjLT5zZWxQcm9jT3V0cHV0KTsKK30KKworTE9ORyAvKiBGSVhQX0RCTCwgZSA9IDcgKi8KK0ZES19kcmNEZWNfR2V0R3JvdXBMb3VkbmVzcyhIQU5ETEVfU0VMX1BST0NfT1VUUFVUIGhTZWxQcm9jT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBncm91cElELCBpbnQqIGdyb3VwTG91ZG5lc3NBdmFpbGFibGUpIHsKKyAgcmV0dXJuIChMT05HKTA7Cit9CisKK3ZvaWQgRkRLX2RyY0RlY19TZXRDaGFubmVsR2FpbnMoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBudW1DaGFubmVscywgY29uc3QgaW50IGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqIGNoYW5uZWxHYWluRGIsIEZJWFBfREJMKiBhdWRpb0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGF1ZGlvQnVmZmVyQ2hhbm5lbE9mZnNldCkgeworICBpbnQgZXJyOworCisgIGlmIChoRHJjRGVjID09IE5VTEwpIHJldHVybjsKKworICBlcnIgPSBkcmNEZWNfR2FpbkRlY29kZXJfU2V0TG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiKAorICAgICAgaERyY0RlYy0+aEdhaW5EZWMsIGhEcmNEZWMtPnNlbFByb2NPdXRwdXQubG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiKTsKKyAgaWYgKGVycikgcmV0dXJuOworCisgIGRyY0RlY19HYWluRGVjb2Rlcl9TZXRDaGFubmVsR2FpbnMoaERyY0RlYy0+aEdhaW5EZWMsIG51bUNoYW5uZWxzLCBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEdhaW5EYiwgYXVkaW9CdWZmZXJDaGFubmVsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyKTsKK30KKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19SZWFkVW5pRHJjQ29uZmlnKEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0pIHsKKyAgRFJDX0VSUk9SIGRFcnIgPSBERV9PSzsKKworICBpZiAoaERyY0RlYyA9PSBOVUxMKSByZXR1cm4gRFJDX0RFQ19OT1RfT1BFTkVEOworCisgIGlmIChoRHJjRGVjLT5jb2RlY01vZGUgPT0gRFJDX0RFQ19NUEVHX0RfVVNBQykgeworICAgIGRFcnIgPSBkcmNEZWNfcmVhZFVuaURyY0NvbmZpZyhoQml0c3RyZWFtLCAmKGhEcmNEZWMtPnVuaURyY0NvbmZpZykpOworICB9IGVsc2UKKyAgICByZXR1cm4gRFJDX0RFQ19OT1RfT0s7CisKKyAgaWYgKGRFcnIpIHsKKyAgICAvKiBjbGVhciBjb25maWcsIGlmIHBhcnNpbmcgZXJyb3Igb2NjdXJlZCAqLworICAgIEZES21lbWNsZWFyKCZoRHJjRGVjLT51bmlEcmNDb25maWcsIHNpemVvZihoRHJjRGVjLT51bmlEcmNDb25maWcpKTsKKyAgICBoRHJjRGVjLT51bmlEcmNDb25maWcuZGlmZiA9IDE7CisgIH0KKworICBzdGFydFNlbGVjdGlvblByb2Nlc3MoaERyY0RlYyk7CisKKyAgcmV0dXJuIERSQ19ERUNfT0s7Cit9CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfUmVhZERvd25taXhJbnN0cnVjdGlvbnNfQm94KEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSkgeworICBEUkNfRVJST1IgZEVyciA9IERFX09LOworCisgIGlmIChoRHJjRGVjID09IE5VTEwpIHJldHVybiBEUkNfREVDX05PVF9PUEVORUQ7CisKKyAgcmV0dXJuIERSQ19ERUNfTk9UX09LOworCisgIGlmIChkRXJyKSB7CisgICAgLyogY2xlYXIgY29uZmlnLCBpZiBwYXJzaW5nIGVycm9yIG9jY3VycmVkICovCisgICAgRkRLbWVtY2xlYXIoJmhEcmNEZWMtPnVuaURyY0NvbmZpZy5kb3dubWl4SW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgIHNpemVvZihoRHJjRGVjLT51bmlEcmNDb25maWcuZG93bm1peEluc3RydWN0aW9ucykpOworICAgIGhEcmNEZWMtPnVuaURyY0NvbmZpZy5kb3dubWl4SW5zdHJ1Y3Rpb25zQ291bnQgPSAwOworICAgIGhEcmNEZWMtPnVuaURyY0NvbmZpZy5kb3dubWl4SW5zdHJ1Y3Rpb25zQ291bnRWMCA9IDA7CisgICAgaERyY0RlYy0+dW5pRHJjQ29uZmlnLmRvd25taXhJbnN0cnVjdGlvbnNDb3VudFYxID0gMDsKKyAgICBoRHJjRGVjLT51bmlEcmNDb25maWcuZGlmZiA9IDE7CisgIH0KKworICBzdGFydFNlbGVjdGlvblByb2Nlc3MoaERyY0RlYyk7CisKKyAgcmV0dXJuIERSQ19ERUNfT0s7Cit9CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfUmVhZFVuaURyY0luc3RydWN0aW9uc19Cb3goSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0pIHsKKyAgRFJDX0VSUk9SIGRFcnIgPSBERV9PSzsKKworICBpZiAoaERyY0RlYyA9PSBOVUxMKSByZXR1cm4gRFJDX0RFQ19OT1RfT1BFTkVEOworCisgIHJldHVybiBEUkNfREVDX05PVF9PSzsKKworICBpZiAoZEVycikgeworICAgIC8qIGNsZWFyIGNvbmZpZywgaWYgcGFyc2luZyBlcnJvciBvY2N1cnJlZCAqLworICAgIEZES21lbWNsZWFyKCZoRHJjRGVjLT51bmlEcmNDb25maWcuZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjLAorICAgICAgICAgICAgICAgIHNpemVvZihoRHJjRGVjLT51bmlEcmNDb25maWcuZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjKSk7CisgICAgaERyY0RlYy0+dW5pRHJjQ29uZmlnLmRyY0luc3RydWN0aW9uc1VuaURyY0NvdW50ID0gMDsKKyAgICBoRHJjRGVjLT51bmlEcmNDb25maWcuZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnRWMCA9IDA7CisgICAgaERyY0RlYy0+dW5pRHJjQ29uZmlnLmRyY0luc3RydWN0aW9uc1VuaURyY0NvdW50VjEgPSAwOworICAgIGhEcmNEZWMtPnVuaURyY0NvbmZpZy5kaWZmID0gMTsKKyAgfQorCisgIHN0YXJ0U2VsZWN0aW9uUHJvY2VzcyhoRHJjRGVjKTsKKworICByZXR1cm4gRFJDX0RFQ19PSzsKK30KKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19SZWFkVW5pRHJjQ29lZmZpY2llbnRzX0JveChIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSkgeworICBEUkNfRVJST1IgZEVyciA9IERFX09LOworCisgIGlmIChoRHJjRGVjID09IE5VTEwpIHJldHVybiBEUkNfREVDX05PVF9PUEVORUQ7CisKKyAgcmV0dXJuIERSQ19ERUNfTk9UX09LOworCisgIGlmIChkRXJyKSB7CisgICAgLyogY2xlYXIgY29uZmlnLCBpZiBwYXJzaW5nIGVycm9yIG9jY3VycmVkICovCisgICAgRkRLbWVtY2xlYXIoJmhEcmNEZWMtPnVuaURyY0NvbmZpZy5kcmNDb2VmZmljaWVudHNVbmlEcmMsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGhEcmNEZWMtPnVuaURyY0NvbmZpZy5kcmNDb2VmZmljaWVudHNVbmlEcmMpKTsKKyAgICBoRHJjRGVjLT51bmlEcmNDb25maWcuZHJjQ29lZmZpY2llbnRzVW5pRHJjQ291bnQgPSAwOworICAgIGhEcmNEZWMtPnVuaURyY0NvbmZpZy5kcmNDb2VmZmljaWVudHNVbmlEcmNDb3VudFYwID0gMDsKKyAgICBoRHJjRGVjLT51bmlEcmNDb25maWcuZHJjQ29lZmZpY2llbnRzVW5pRHJjQ291bnRWMSA9IDA7CisgICAgaERyY0RlYy0+dW5pRHJjQ29uZmlnLmRpZmYgPSAxOworICB9CisKKyAgc3RhcnRTZWxlY3Rpb25Qcm9jZXNzKGhEcmNEZWMpOworCisgIHJldHVybiBEUkNfREVDX09LOworfQorCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX1JlYWRMb3VkbmVzc0luZm9TZXQoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSkgeworICBEUkNfRVJST1IgZEVyciA9IERFX09LOworCisgIGlmIChoRHJjRGVjID09IE5VTEwpIHJldHVybiBEUkNfREVDX05PVF9PUEVORUQ7CisKKyAgaWYgKGhEcmNEZWMtPmNvZGVjTW9kZSA9PSBEUkNfREVDX01QRUdfRF9VU0FDKSB7CisgICAgZEVyciA9IGRyY0RlY19yZWFkTG91ZG5lc3NJbmZvU2V0KGhCaXRzdHJlYW0sICYoaERyY0RlYy0+bG91ZG5lc3NJbmZvU2V0KSk7CisgIH0gZWxzZQorICAgIHJldHVybiBEUkNfREVDX05PVF9PSzsKKworICBpZiAoZEVycikgeworICAgIC8qIGNsZWFyIGNvbmZpZywgaWYgcGFyc2luZyBlcnJvciBvY2N1cnJlZCAqLworICAgIEZES21lbWNsZWFyKCZoRHJjRGVjLT5sb3VkbmVzc0luZm9TZXQsIHNpemVvZihoRHJjRGVjLT5sb3VkbmVzc0luZm9TZXQpKTsKKyAgICBoRHJjRGVjLT5sb3VkbmVzc0luZm9TZXQuZGlmZiA9IDE7CisgIH0KKworICBzdGFydFNlbGVjdGlvblByb2Nlc3MoaERyY0RlYyk7CisKKyAgcmV0dXJuIERSQ19ERUNfT0s7Cit9CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfUmVhZExvdWRuZXNzQm94KEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSkgeworICBEUkNfRVJST1IgZEVyciA9IERFX09LOworCisgIGlmIChoRHJjRGVjID09IE5VTEwpIHJldHVybiBEUkNfREVDX05PVF9PUEVORUQ7CisKKyAgcmV0dXJuIERSQ19ERUNfTk9UX09LOworCisgIGlmIChkRXJyKSB7CisgICAgLyogY2xlYXIgY29uZmlnLCBpZiBwYXJzaW5nIGVycm9yIG9jY3VycmVkICovCisgICAgRkRLbWVtY2xlYXIoJmhEcmNEZWMtPmxvdWRuZXNzSW5mb1NldCwgc2l6ZW9mKGhEcmNEZWMtPmxvdWRuZXNzSW5mb1NldCkpOworICAgIGhEcmNEZWMtPmxvdWRuZXNzSW5mb1NldC5kaWZmID0gMTsKKyAgfQorCisgIHN0YXJ0U2VsZWN0aW9uUHJvY2VzcyhoRHJjRGVjKTsKKworICByZXR1cm4gRFJDX0RFQ19PSzsKK30KKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19SZWFkVW5pRHJjR2FpbihIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSkgeworICBEUkNfRVJST1IgZEVyciA9IERFX09LOworCisgIGlmIChoRHJjRGVjID09IE5VTEwpIHJldHVybiBEUkNfREVDX05PVF9PUEVORUQ7CisgIGlmICghaERyY0RlYy0+c3RhdHVzKSB7CisgICAgcmV0dXJuIERSQ19ERUNfT0s7CisgIH0KKworICBkRXJyID0gZHJjRGVjX3JlYWRVbmlEcmNHYWluKAorICAgICAgaEJpdHN0cmVhbSwgJihoRHJjRGVjLT51bmlEcmNDb25maWcpLAorICAgICAgZHJjRGVjX0dhaW5EZWNvZGVyX0dldEZyYW1lU2l6ZShoRHJjRGVjLT5oR2FpbkRlYyksCisgICAgICBkcmNEZWNfR2FpbkRlY29kZXJfR2V0RGVsdGFUbWluRGVmYXVsdChoRHJjRGVjLT5oR2FpbkRlYyksCisgICAgICAmKGhEcmNEZWMtPnVuaURyY0dhaW4pKTsKKyAgaWYgKGRFcnIpIHJldHVybiBEUkNfREVDX05PVF9PSzsKKworICBoRHJjRGVjLT5zdGF0dXMgPSBEUkNfREVDX05FV19HQUlOX1BBWUxPQUQ7CisKKyAgcmV0dXJuIERSQ19ERUNfT0s7Cit9CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfUmVhZFVuaURyYyhIQU5ETEVfRFJDX0RFQ09ERVIgaERyY0RlYywKKyAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtKSB7CisgIERSQ19FUlJPUiBkRXJyID0gREVfT0s7CisKKyAgaWYgKGhEcmNEZWMgPT0gTlVMTCkgcmV0dXJuIERSQ19ERUNfTk9UX09QRU5FRDsKKyAgaWYgKCFoRHJjRGVjLT5zdGF0dXMpIHJldHVybiBEUkNfREVDX05PVF9SRUFEWTsKKworICBkRXJyID0gZHJjRGVjX3JlYWRVbmlEcmMoCisgICAgICBoQml0c3RyZWFtLCAmKGhEcmNEZWMtPnVuaURyY0NvbmZpZyksICYoaERyY0RlYy0+bG91ZG5lc3NJbmZvU2V0KSwKKyAgICAgIGRyY0RlY19HYWluRGVjb2Rlcl9HZXRGcmFtZVNpemUoaERyY0RlYy0+aEdhaW5EZWMpLAorICAgICAgZHJjRGVjX0dhaW5EZWNvZGVyX0dldERlbHRhVG1pbkRlZmF1bHQoaERyY0RlYy0+aEdhaW5EZWMpLAorICAgICAgJihoRHJjRGVjLT51bmlEcmNHYWluKSk7CisgIGlmIChkRXJyKSByZXR1cm4gRFJDX0RFQ19OT1RfT0s7CisKKyAgc3RhcnRTZWxlY3Rpb25Qcm9jZXNzKGhEcmNEZWMpOworCisgIGhEcmNEZWMtPnN0YXR1cyA9IERSQ19ERUNfTkVXX0dBSU5fUEFZTE9BRDsKKworICByZXR1cm4gRFJDX0RFQ19PSzsKK30KKworRFJDX0RFQ19FUlJPUgorRkRLX2RyY0RlY19QcmVwcm9jZXNzKEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjKSB7CisgIERSQ19FUlJPUiBkRXJyID0gREVfT0s7CisKKyAgaWYgKGhEcmNEZWMgPT0gTlVMTCkgcmV0dXJuIERSQ19ERUNfTk9UX09QRU5FRDsKKyAgaWYgKCFoRHJjRGVjLT5zdGF0dXMpIHJldHVybiBEUkNfREVDX05PVF9SRUFEWTsKKyAgaWYgKCEoaERyY0RlYy0+ZnVuY3Rpb25hbFJhbmdlICYgRFJDX0RFQ19HQUlOKSkgcmV0dXJuIERSQ19ERUNfTk9UX09LOworCisgIGlmIChoRHJjRGVjLT5zdGF0dXMgIT0gRFJDX0RFQ19ORVdfR0FJTl9QQVlMT0FEKSB7CisgICAgLyogbm8gbmV3IGdhaW4gcGF5bG9hZCB3YXMgcmVhZCwgZS5nLiBkdXJpbmcgY29uY2FsbWVudCBvciBmbHVzaGluZy4KKyAgICAgICBHZW5lcmF0ZSBEUkMgZ2FpbnMgYmFzZWQgb24gdGhlIHN0b3JlZCBEUkMgZ2FpbnMgb2YgbGFzdCBmcmFtZXMgKi8KKyAgICBkcmNEZWNfR2FpbkRlY29kZXJfQ29uY2VhbChoRHJjRGVjLT5oR2FpbkRlYywgJihoRHJjRGVjLT51bmlEcmNDb25maWcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoaERyY0RlYy0+dW5pRHJjR2FpbikpOworICB9CisKKyAgZEVyciA9IGRyY0RlY19HYWluRGVjb2Rlcl9QcmVwcm9jZXNzKAorICAgICAgaERyY0RlYy0+aEdhaW5EZWMsICYoaERyY0RlYy0+dW5pRHJjR2FpbiksCisgICAgICBoRHJjRGVjLT5zZWxQcm9jT3V0cHV0LmxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYiwKKyAgICAgIGhEcmNEZWMtPnNlbFByb2NPdXRwdXQuYm9vc3QsIGhEcmNEZWMtPnNlbFByb2NPdXRwdXQuY29tcHJlc3MpOworICBpZiAoZEVycikgcmV0dXJuIERSQ19ERUNfTk9UX09LOworICBoRHJjRGVjLT5zdGF0dXMgPSBEUkNfREVDX0lOVEVSUE9MQVRJT05fUFJFUEFSRUQ7CisKKyAgcmV0dXJuIERSQ19ERUNfT0s7Cit9CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfUHJvY2Vzc1RpbWUoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsIGNvbnN0IGludCBkZWxheVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERSQ19ERUNfTE9DQVRJT04gZHJjTG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaGFubmVsT2Zmc2V0LCBjb25zdCBpbnQgZHJjQ2hhbm5lbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bUNoYW5uZWxzUHJvY2Vzc2VkLCBGSVhQX0RCTCogcmVhbEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbWVEYXRhQ2hhbm5lbE9mZnNldCkgeworICBEUkNfRVJST1IgZEVyciA9IERFX09LOworCisgIGlmIChoRHJjRGVjID09IE5VTEwpIHJldHVybiBEUkNfREVDX05PVF9PUEVORUQ7CisgIGlmICghKGhEcmNEZWMtPmZ1bmN0aW9uYWxSYW5nZSAmIERSQ19ERUNfR0FJTikpIHJldHVybiBEUkNfREVDX05PVF9PSzsKKyAgaWYgKGhEcmNEZWMtPnN0YXR1cyAhPSBEUkNfREVDX0lOVEVSUE9MQVRJT05fUFJFUEFSRUQpCisgICAgcmV0dXJuIERSQ19ERUNfTk9UX1JFQURZOworCisgIGRFcnIgPSBkcmNEZWNfR2FpbkRlY29kZXJfUHJvY2Vzc1RpbWVEb21haW4oCisgICAgICBoRHJjRGVjLT5oR2FpbkRlYywgZGVsYXlTYW1wbGVzLCAoR0FJTl9ERUNfTE9DQVRJT04pZHJjTG9jYXRpb24sCisgICAgICBjaGFubmVsT2Zmc2V0LCBkcmNDaGFubmVsT2Zmc2V0LCBudW1DaGFubmVsc1Byb2Nlc3NlZCwKKyAgICAgIHRpbWVEYXRhQ2hhbm5lbE9mZnNldCwgcmVhbEJ1ZmZlcik7CisgIGlmIChkRXJyKSByZXR1cm4gRFJDX0RFQ19OT1RfT0s7CisKKyAgcmV0dXJuIERSQ19ERUNfT0s7Cit9CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfUHJvY2Vzc0ZyZXEoSEFORExFX0RSQ19ERUNPREVSIGhEcmNEZWMsIGNvbnN0IGludCBkZWxheVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERSQ19ERUNfTE9DQVRJT04gZHJjTG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaGFubmVsT2Zmc2V0LCBjb25zdCBpbnQgZHJjQ2hhbm5lbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bUNoYW5uZWxzUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcHJvY2Vzc1NpbmdsZVRpbWVzbG90LCBGSVhQX0RCTCoqIHJlYWxCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiogaW1hZ0J1ZmZlcikgeworICBEUkNfRVJST1IgZEVyciA9IERFX09LOworCisgIGlmIChoRHJjRGVjID09IE5VTEwpIHJldHVybiBEUkNfREVDX05PVF9PUEVORUQ7CisgIGlmICghKGhEcmNEZWMtPmZ1bmN0aW9uYWxSYW5nZSAmIERSQ19ERUNfR0FJTikpIHJldHVybiBEUkNfREVDX05PVF9PSzsKKyAgaWYgKGhEcmNEZWMtPnN0YXR1cyAhPSBEUkNfREVDX0lOVEVSUE9MQVRJT05fUFJFUEFSRUQpCisgICAgcmV0dXJuIERSQ19ERUNfTk9UX1JFQURZOworCisgIGRFcnIgPSBkcmNEZWNfR2FpbkRlY29kZXJfUHJvY2Vzc1N1YmJhbmREb21haW4oCisgICAgICBoRHJjRGVjLT5oR2FpbkRlYywgZGVsYXlTYW1wbGVzLCAoR0FJTl9ERUNfTE9DQVRJT04pZHJjTG9jYXRpb24sCisgICAgICBjaGFubmVsT2Zmc2V0LCBkcmNDaGFubmVsT2Zmc2V0LCBudW1DaGFubmVsc1Byb2Nlc3NlZCwKKyAgICAgIHByb2Nlc3NTaW5nbGVUaW1lc2xvdCwgcmVhbEJ1ZmZlciwgaW1hZ0J1ZmZlcik7CisgIGlmIChkRXJyKSByZXR1cm4gRFJDX0RFQ19OT1RfT0s7CisKKyAgcmV0dXJuIERSQ19ERUNfT0s7Cit9CisKK0RSQ19ERUNfRVJST1IKK0ZES19kcmNEZWNfQXBwbHlEb3dubWl4KEhBTkRMRV9EUkNfREVDT0RFUiBoRHJjRGVjLCBpbnQqIHJldmVyc2VJbkNoYW5uZWxNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHJldmVyc2VPdXRDaGFubmVsTWFwLCBGSVhQX0RCTCogcmVhbEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCogcE5DaGFubmVscykgeworICBTRUxfUFJPQ19PVVRQVVQqIHBTZWxQcm9jT3V0cHV0ID0gJihoRHJjRGVjLT5zZWxQcm9jT3V0cHV0KTsKKyAgaW50IGJhc2VDaENudCA9IHBTZWxQcm9jT3V0cHV0LT5iYXNlQ2hhbm5lbENvdW50OworICBpbnQgdGFyZ2V0Q2hDbnQgPSBwU2VsUHJvY091dHB1dC0+dGFyZ2V0Q2hhbm5lbENvdW50OworICBpbnQgZnJhbWVTaXplLCBuLCBpYywgb2M7CisgIEZJWFBfREJMIHRtcF9vdXRbOF07CisgIEZJWFBfREJMKiBhdWRpb0NoYW5uZWxzWzhdOworCisgIGlmIChoRHJjRGVjID09IE5VTEwpIHJldHVybiBEUkNfREVDX05PVF9PUEVORUQ7CisgIGlmICghKGhEcmNEZWMtPmZ1bmN0aW9uYWxSYW5nZSAmIERSQ19ERUNfR0FJTikpIHJldHVybiBEUkNfREVDX05PVF9PSzsKKworICAvKiBvbmx5IGRvd25taXggaXMgcGVyZm9ybWVkIGhlcmUsIG5vIHVwbWl4LgorICAgICBEb3dubWl4IGlzIG9ubHkgcGVyZm9ybWVkIGlmIGRvd25taXggY29lZmZpY2llbnRzIGFyZSBwcm92aWRlZC4KKyAgICAgQWxsIG90aGVyIGNhc2VzIG9mIGRvd25taXggYW5kIHVwbWl4IGFyZSB0cmVhdGVkIGJ5IHBjbURteCBsaWJyYXJ5LiAqLworICBpZiAocFNlbFByb2NPdXRwdXQtPmRvd25taXhNYXRyaXhQcmVzZW50ID09IDApCisgICAgcmV0dXJuIERSQ19ERUNfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBkb3dubWl4ICovCisgIGlmICh0YXJnZXRDaENudCA+PSBiYXNlQ2hDbnQpIHJldHVybiBEUkNfREVDX09LOyAvKiBkb3dubWl4IG9ubHkgKi8KKworICAvKiBzYW5pdHkgY2hlY2tzICovCisgIGlmIChyZWFsQnVmZmVyID09IE5VTEwpIHJldHVybiBEUkNfREVDX05PVF9PSzsKKyAgaWYgKHJldmVyc2VJbkNoYW5uZWxNYXAgPT0gTlVMTCkgcmV0dXJuIERSQ19ERUNfTk9UX09LOworICBpZiAocmV2ZXJzZU91dENoYW5uZWxNYXAgPT0gTlVMTCkgcmV0dXJuIERSQ19ERUNfTk9UX09LOworICBpZiAoYmFzZUNoQ250ID4gOCkgcmV0dXJuIERSQ19ERUNfTk9UX09LOworICBpZiAoYmFzZUNoQ250ICE9ICpwTkNoYW5uZWxzKSByZXR1cm4gRFJDX0RFQ19OT1RfT0s7CisgIGlmICh0YXJnZXRDaENudCA+IDgpIHJldHVybiBEUkNfREVDX05PVF9PSzsKKworICBmcmFtZVNpemUgPSBkcmNEZWNfR2FpbkRlY29kZXJfR2V0RnJhbWVTaXplKGhEcmNEZWMtPmhHYWluRGVjKTsKKworICBmb3IgKGljID0gMDsgaWMgPCBiYXNlQ2hDbnQ7IGljKyspIHsKKyAgICBhdWRpb0NoYW5uZWxzW2ljXSA9ICYocmVhbEJ1ZmZlcltpYyAqIGZyYW1lU2l6ZV0pOworICB9CisKKyAgLyogaW4tcGxhY2UgZG93bm1peCAqLworICBmb3IgKG4gPSAwOyBuIDwgZnJhbWVTaXplOyBuKyspIHsKKyAgICBmb3IgKG9jID0gMDsgb2MgPCB0YXJnZXRDaENudDsgb2MrKykgeworICAgICAgdG1wX291dFtvY10gPSAoRklYUF9EQkwpMDsKKyAgICAgIGZvciAoaWMgPSAwOyBpYyA8IGJhc2VDaENudDsgaWMrKykgeworICAgICAgICB0bXBfb3V0W29jXSArPQorICAgICAgICAgICAgZk11bHREaXYyKGF1ZGlvQ2hhbm5lbHNbaWNdW25dLAorICAgICAgICAgICAgICAgICAgICAgIHBTZWxQcm9jT3V0cHV0LT5kb3dubWl4TWF0cml4W3JldmVyc2VJbkNoYW5uZWxNYXBbaWNdXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JldmVyc2VPdXRDaGFubmVsTWFwW29jXV0pCisgICAgICAgICAgICA8PCAzOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKG9jID0gMDsgb2MgPCB0YXJnZXRDaENudDsgb2MrKykgeworICAgICAgaWYgKG9jID49IGJhc2VDaENudCkgYnJlYWs7CisgICAgICBhdWRpb0NoYW5uZWxzW29jXVtuXSA9IHRtcF9vdXRbb2NdOworICAgIH0KKyAgfQorCisgIGZvciAob2MgPSB0YXJnZXRDaENudDsgb2MgPCBiYXNlQ2hDbnQ7IG9jKyspIHsKKyAgICBGREttZW1zZXQoYXVkaW9DaGFubmVsc1tvY10sIDAsIGZyYW1lU2l6ZSAqIHNpemVvZihGSVhQX0RCTCkpOworICB9CisKKyAgKnBOQ2hhbm5lbHMgPSB0YXJnZXRDaENudDsKKworICByZXR1cm4gRFJDX0RFQ19PSzsKK30KKworLyogR2V0IGxpYnJhcnkgaW5mbyBmb3IgdGhpcyBtb2R1bGUuICovCitEUkNfREVDX0VSUk9SCitGREtfZHJjRGVjX0dldExpYkluZm8oTElCX0lORk8qIGluZm8pIHsKKyAgaW50IGk7CisKKyAgaWYgKGluZm8gPT0gTlVMTCkgeworICAgIHJldHVybiBEUkNfREVDX0lOVkFMSURfUEFSQU07CisgIH0KKworICAvKiBTZWFyY2ggZm9yIG5leHQgZnJlZSB0YWIgKi8KKyAgZm9yIChpID0gMDsgaSA8IEZES19NT0RVTEVfTEFTVDsgaSsrKSB7CisgICAgaWYgKGluZm9baV0ubW9kdWxlX2lkID09IEZES19OT05FKSBicmVhazsKKyAgfQorICBpZiAoaSA9PSBGREtfTU9EVUxFX0xBU1QpIHsKKyAgICByZXR1cm4gRFJDX0RFQ19OT1RfT0s7CisgIH0KKworICAvKiBBZGQgdGhlIGxpYnJhcnkgaW5mbyAqLworICBpbmZvW2ldLm1vZHVsZV9pZCA9IEZES19VTklEUkNERUM7CisgIGluZm9baV0udmVyc2lvbiA9IExJQl9WRVJTSU9OKERSQ0RFQ19MSUJfVkwwLCBEUkNERUNfTElCX1ZMMSwgRFJDREVDX0xJQl9WTDIpOworICBMSUJfVkVSU0lPTl9TVFJJTkcoaW5mbyArIGkpOworICBpbmZvW2ldLmJ1aWxkX2RhdGUgPSBEUkNERUNfTElCX0JVSUxEX0RBVEU7CisgIGluZm9baV0uYnVpbGRfdGltZSA9IERSQ0RFQ19MSUJfQlVJTERfVElNRTsKKyAgaW5mb1tpXS50aXRsZSA9IERSQ0RFQ19MSUJfVElUTEU7CisKKyAgcmV0dXJuIERSQ19ERUNfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJEUkNkZWMvc3JjL2RyY0RlY19nYWluRGVjb2Rlci5jcHAgYi9saWJEUkNkZWMvc3JjL2RyY0RlY19nYWluRGVjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E4MWZhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX2dhaW5EZWNvZGVyLmNwcApAQCAtMCwwICsxLDQ0NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHLUQgRFJDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZHJjRGVjX3R5cGVzLmgiCisjaW5jbHVkZSAiZHJjRGVjX2dhaW5EZWNvZGVyLmgiCisjaW5jbHVkZSAiZHJjR2FpbkRlY19wcmVwcm9jZXNzLmgiCisjaW5jbHVkZSAiZHJjR2FpbkRlY19pbml0LmgiCisjaW5jbHVkZSAiZHJjR2FpbkRlY19wcm9jZXNzLmgiCisjaW5jbHVkZSAiZHJjRGVjX3Rvb2xzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogc3RhdGljIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBfZml0c0xvY2F0aW9uKERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcEluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0FJTl9ERUNfTE9DQVRJT04gZHJjTG9jYXRpb24pIHsKKyAgaW50IGRvd25taXhJZCA9IHBJbnN0LT5kcmNBcHBseVRvRG93bm1peCA/IHBJbnN0LT5kb3dubWl4SWRbMF0gOiAwOworICBzd2l0Y2ggKGRyY0xvY2F0aW9uKSB7CisgICAgY2FzZSBHQUlOX0RFQ19EUkMxOgorICAgICAgcmV0dXJuIChkb3dubWl4SWQgPT0gMCk7CisgICAgY2FzZSBHQUlOX0RFQ19EUkMxX0RSQzI6CisgICAgICByZXR1cm4gKChkb3dubWl4SWQgPT0gMCkgfHwgKGRvd25taXhJZCA9PSBET1dOTUlYX0lEX0FOWV9ET1dOTUlYKSk7CisgICAgY2FzZSBHQUlOX0RFQ19EUkMyOgorICAgICAgcmV0dXJuIChkb3dubWl4SWQgPT0gRE9XTk1JWF9JRF9BTllfRE9XTk1JWCk7CisgICAgY2FzZSBHQUlOX0RFQ19EUkMzOgorICAgICAgcmV0dXJuICgoZG93bm1peElkICE9IDApICYmIChkb3dubWl4SWQgIT0gRE9XTk1JWF9JRF9BTllfRE9XTk1JWCkpOworICAgIGNhc2UgR0FJTl9ERUNfRFJDMl9EUkMzOgorICAgICAgcmV0dXJuIChkb3dubWl4SWQgIT0gMCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9zZXRDaGFubmVsR2FpbnMoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBudW1DaGFubmVsR2FpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMKiBjaGFubmVsR2FpbkRiKSB7CisgIGludCBpLCBjaGFubmVsR2Fpbl9lOworICBGSVhQX0RCTCBjaGFubmVsR2FpbjsKKyAgRkRLX0FTU0VSVChudW1DaGFubmVsR2FpbnMgPD0gOCk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1DaGFubmVsR2FpbnM7IGkrKykgeworICAgIGlmIChjaGFubmVsR2FpbkRiW2ldID09IChGSVhQX0RCTClNSU5WQUxfREJMKSB7CisgICAgICBoR2FpbkRlYy0+Y2hhbm5lbEdhaW5baV0gPSAoRklYUF9EQkwpMDsKKyAgICB9IGVsc2UgeworICAgICAgLyogYWRkIGxvdWRuZXNzIG5vcm1hbGlzYXRpb24gZ2FpbiAoZEIpIHRvIGNoYW5uZWwgZ2FpbiAoZEIpICovCisgICAgICBGSVhQX0RCTCB0bXBfY2hhbm5lbEdhaW5EYiA9IChjaGFubmVsR2FpbkRiW2ldID4+IDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhHYWluRGVjLT5sb3VkbmVzc05vcm1hbGlzYXRpb25HYWluRGIgPj4gMik7CisgICAgICB0bXBfY2hhbm5lbEdhaW5EYiA9CisgICAgICAgICAgU0FUVVJBVEVfTEVGVF9TSElGVCh0bXBfY2hhbm5lbEdhaW5EYiwgMSwgREZSQUNUX0JJVFMpOworICAgICAgY2hhbm5lbEdhaW4gPSBkQjJsaW4odG1wX2NoYW5uZWxHYWluRGIsIDgsICZjaGFubmVsR2Fpbl9lKTsKKyAgICAgIGhHYWluRGVjLT5jaGFubmVsR2FpbltpXSA9IHNjYWxlVmFsdWUoY2hhbm5lbEdhaW4sIGNoYW5uZWxHYWluX2UgLSA4KTsKKyAgICB9CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBwdWJsaWMgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitEUkNfRVJST1IKK2RyY0RlY19HYWluRGVjb2Rlcl9PcGVuKEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSKiBwaEdhaW5EZWMpIHsKKyAgRFJDX0dBSU5fREVDT0RFUiogaEdhaW5EZWMgPSBOVUxMOworCisgIGhHYWluRGVjID0gKERSQ19HQUlOX0RFQ09ERVIqKUZES2NhbGxvYygxLCBzaXplb2YoRFJDX0dBSU5fREVDT0RFUikpOworICBpZiAoaEdhaW5EZWMgPT0gTlVMTCkgcmV0dXJuIERFX01FTU9SWV9FUlJPUjsKKworICBoR2FpbkRlYy0+bXVsdGlCYW5kQWN0aXZlRHJjSW5kZXggPSAtMTsKKyAgaEdhaW5EZWMtPmNoYW5uZWxHYWluQWN0aXZlRHJjSW5kZXggPSAtMTsKKworICAqcGhHYWluRGVjID0gaEdhaW5EZWM7CisKKyAgcmV0dXJuIERFX09LOworfQorCitEUkNfRVJST1IKK2RyY0RlY19HYWluRGVjb2Rlcl9Jbml0KEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjLCBjb25zdCBpbnQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNhbXBsZVJhdGUpIHsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworCisgIGVyciA9IGluaXRHYWluRGVjKGhHYWluRGVjLCBmcmFtZVNpemUsIHNhbXBsZVJhdGUpOworICBpZiAoZXJyKSByZXR1cm4gZXJyOworCisgIGluaXREcmNHYWluQnVmZmVycyhoR2FpbkRlYy0+ZnJhbWVTaXplLCAmaEdhaW5EZWMtPmRyY0dhaW5CdWZmZXJzKTsKKworICByZXR1cm4gZXJyOworfQorCitEUkNfRVJST1IKK2RyY0RlY19HYWluRGVjb2Rlcl9TZXRDb2RlY0RlcGVuZGVudFBhcmFtZXRlcnMoCisgICAgSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsIGNvbnN0IERFTEFZX01PREUgZGVsYXlNb2RlLAorICAgIGNvbnN0IGludCB0aW1lRG9tYWluU3VwcG9ydGVkLAorICAgIGNvbnN0IFNVQkJBTkRfRE9NQUlOX01PREUgc3ViYmFuZERvbWFpblN1cHBvcnRlZCkgeworICBpZiAoKGRlbGF5TW9kZSAhPSBETV9SRUdVTEFSX0RFTEFZKSAmJiAoZGVsYXlNb2RlICE9IERNX0xPV19ERUxBWSkpIHsKKyAgICByZXR1cm4gREVfTk9UX09LOworICB9CisgIGhHYWluRGVjLT5kZWxheU1vZGUgPSBkZWxheU1vZGU7CisgIGhHYWluRGVjLT50aW1lRG9tYWluU3VwcG9ydGVkID0gdGltZURvbWFpblN1cHBvcnRlZDsKKyAgaEdhaW5EZWMtPnN1YmJhbmREb21haW5TdXBwb3J0ZWQgPSBzdWJiYW5kRG9tYWluU3VwcG9ydGVkOworCisgIHJldHVybiBERV9PSzsKK30KKworRFJDX0VSUk9SCitkcmNEZWNfR2FpbkRlY29kZXJfQ29uZmlnKEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgbnVtU2VsZWN0ZWREcmNTZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0hBUiogc2VsZWN0ZWREcmNTZXRJZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSKiBzZWxlY3RlZERvd25taXhJZHMpIHsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworICBpbnQgYTsKKworICBoR2FpbkRlYy0+bkFjdGl2ZURyY3MgPSAwOworICBoR2FpbkRlYy0+bXVsdGlCYW5kQWN0aXZlRHJjSW5kZXggPSAtMTsKKyAgaEdhaW5EZWMtPmNoYW5uZWxHYWluQWN0aXZlRHJjSW5kZXggPSAtMTsKKyAgZm9yIChhID0gMDsgYSA8IG51bVNlbGVjdGVkRHJjU2V0czsgYSsrKSB7CisgICAgZXJyID0gaW5pdEFjdGl2ZURyYyhoR2FpbkRlYywgaFVuaURyY0NvbmZpZywgc2VsZWN0ZWREcmNTZXRJZHNbYV0sCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERvd25taXhJZHNbYV0pOworICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgIH0KKworICBlcnIgPSBpbml0QWN0aXZlRHJjT2Zmc2V0KGhHYWluRGVjKTsKKyAgaWYgKGVycikgcmV0dXJuIGVycjsKKworICByZXR1cm4gZXJyOworfQorCitEUkNfRVJST1IKK2RyY0RlY19HYWluRGVjb2Rlcl9DbG9zZShIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiogcGhHYWluRGVjKSB7CisgIGlmICgqcGhHYWluRGVjICE9IE5VTEwpIHsKKyAgICBGREtmcmVlKCpwaEdhaW5EZWMpOworICAgICpwaEdhaW5EZWMgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIERFX09LOworfQorCitEUkNfRVJST1IKK2RyY0RlY19HYWluRGVjb2Rlcl9QcmVwcm9jZXNzKEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfR0FJTiBoVW5pRHJjR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGJvb3N0LCBjb25zdCBGSVhQX1NHTCBjb21wcmVzcykgeworICBEUkNfRVJST1IgZXJyID0gREVfT0s7CisgIGludCBhLCBjOworCisgIC8qIGxuYlBvaW50ZXIgaXMgdGhlIGluZGV4IG9uIHRoZSBtb3N0IHJlY2VudCBub2RlIGJ1ZmZlciAqLworICBoR2FpbkRlYy0+ZHJjR2FpbkJ1ZmZlcnMubG5iUG9pbnRlcisrOworICBpZiAoaEdhaW5EZWMtPmRyY0dhaW5CdWZmZXJzLmxuYlBvaW50ZXIgPj0gTlVNX0xOQl9GUkFNRVMpCisgICAgaEdhaW5EZWMtPmRyY0dhaW5CdWZmZXJzLmxuYlBvaW50ZXIgPSAwOworCisgIGZvciAoYSA9IDA7IGEgPCBoR2FpbkRlYy0+bkFjdGl2ZURyY3M7IGErKykgeworICAgIC8qIHByZXBhcmUgZ2FpbiBpbnRlcnBvbGF0aW9uIG9mIHNlcXVlbmNlcyB1c2VkIGJ5IGNvcHlpbmcgYW5kIG1vZGlmeWluZworICAgICAqIG5vZGVzIGluIG5vZGUgYnVmZmVycyAqLworICAgIGVyciA9IHByZXBhcmVEcmNHYWluKGhHYWluRGVjLCBoVW5pRHJjR2FpbiwgY29tcHJlc3MsIGJvb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYiwgYSk7CisgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgfQorCisgIGZvciAoYSA9IDA7IGEgPCBNQVhfQUNUSVZFX0RSQ1M7IGErKykgeworICAgIGZvciAoYyA9IDA7IGMgPCA4OyBjKyspIHsKKyAgICAgIGhHYWluRGVjLT5hY3RpdmVEcmNbYV0KKyAgICAgICAgICAubG5iSW5kZXhGb3JDaGFubmVsW2NdW2hHYWluRGVjLT5kcmNHYWluQnVmZmVycy5sbmJQb2ludGVyXSA9CisgICAgICAgICAgLTE7IC8qICJubyBEUkMgcHJvY2Vzc2luZyIgKi8KKyAgICB9CisgICAgaEdhaW5EZWMtPmFjdGl2ZURyY1thXS5zdWJiYW5kR2FpbnNSZWFkeSA9IDA7CisgIH0KKworICBmb3IgKGMgPSAwOyBjIDwgODsgYysrKSB7CisgICAgaEdhaW5EZWMtPmRyY0dhaW5CdWZmZXJzCisgICAgICAgIC5jaGFubmVsR2FpbltjXVtoR2FpbkRlYy0+ZHJjR2FpbkJ1ZmZlcnMubG5iUG9pbnRlcl0gPQorICAgICAgICBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKGZsb2F0KSgxIDw8IDgpKTsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKy8qIGNyZWF0ZSBnYWluIHNlcXVlbmNlIG91dCBvZiBnYWluIHNlcXVlbmNlcyBvZiBsYXN0IGZyYW1lIGZvciBjb25jZWFsbWVudCBhbmQKKyAqIGZsdXNoaW5nICovCitEUkNfRVJST1IKK2RyY0RlY19HYWluRGVjb2Rlcl9Db25jZWFsKEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfVU5JX0RSQ19HQUlOIGhVbmlEcmNHYWluKSB7CisgIGludCBzZXEsIGdhaW5TZXF1ZW5jZUNvdW50OworICBEUkNfQ09FRkZJQ0lFTlRTX1VOSV9EUkMqIHBDb2VmID0KKyAgICAgIHNlbGVjdERyY0NvZWZmaWNpZW50cyhoVW5pRHJjQ29uZmlnLCBMT0NBVElPTl9TRUxFQ1RFRCk7CisgIGlmIChwQ29lZiA9PSBOVUxMKSByZXR1cm4gREVfT0s7CisKKyAgZ2FpblNlcXVlbmNlQ291bnQgPSBmTWluKHBDb2VmLT5nYWluU2VxdWVuY2VDb3VudCwgKFVDSEFSKTEyKTsKKworICBmb3IgKHNlcSA9IDA7IHNlcSA8IGdhaW5TZXF1ZW5jZUNvdW50OyBzZXErKykgeworICAgIGludCBsYXN0Tm9kZUluZGV4ID0gMDsKKyAgICBGSVhQX1NHTCBsYXN0R2FpbkRiID0gKEZJWFBfU0dMKTA7CisKKyAgICBsYXN0Tm9kZUluZGV4ID0gaFVuaURyY0dhaW4tPm5Ob2Rlc1tzZXFdIC0gMTsKKyAgICBpZiAoKGxhc3ROb2RlSW5kZXggPj0gMCkgJiYgKGxhc3ROb2RlSW5kZXggPCAxNikpIHsKKyAgICAgIGxhc3RHYWluRGIgPSBoVW5pRHJjR2Fpbi0+Z2Fpbk5vZGVbc2VxXVtsYXN0Tm9kZUluZGV4XS5nYWluRGI7CisgICAgfQorCisgICAgaFVuaURyY0dhaW4tPm5Ob2Rlc1tzZXFdID0gMTsKKyAgICBpZiAobGFzdEdhaW5EYiA+IChGSVhQX1NHTCkwKSB7CisgICAgICBoVW5pRHJjR2Fpbi0+Z2Fpbk5vZGVbc2VxXVswXS5nYWluRGIgPQorICAgICAgICAgIEZYX0RCTDJGWF9TR0woZk11bHQoRkwyRlhDT05TVF9TR0woMC45ZiksIGxhc3RHYWluRGIpKTsKKyAgICB9IGVsc2UgeworICAgICAgaFVuaURyY0dhaW4tPmdhaW5Ob2RlW3NlcV1bMF0uZ2FpbkRiID0KKyAgICAgICAgICBGWF9EQkwyRlhfU0dMKGZNdWx0KEZMMkZYQ09OU1RfU0dMKDAuOThmKSwgbGFzdEdhaW5EYikpOworICAgIH0KKyAgICBoVW5pRHJjR2Fpbi0+Z2Fpbk5vZGVbc2VxXVswXS50aW1lID0gaEdhaW5EZWMtPmZyYW1lU2l6ZSAtIDE7CisgIH0KKyAgcmV0dXJuIERFX09LOworfQorCit2b2lkIGRyY0RlY19HYWluRGVjb2Rlcl9TZXRDaGFubmVsR2FpbnMoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwqIGNoYW5uZWxHYWluRGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGF1ZGlvQnVmZmVyQ2hhbm5lbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogYXVkaW9CdWZmZXIpIHsKKyAgaW50IGMsIGk7CisKKyAgaWYgKGhHYWluRGVjLT5jaGFubmVsR2FpbkFjdGl2ZURyY0luZGV4ID49IDApIHsKKyAgICAvKiBjaGFubmVsIGdhaW5zIHdpbGwgYmUgYXBwbGllZCBpbiBkcmNEZWNfR2FpbkRlY29kZXJfUHJvY2Vzc1RpbWVEb21haW4gb3IKKyAgICAgKiBkcmNEZWNfR2FpbkRlY29kZXJfUHJvY2Vzc1N1YmJhbmREb21haW4sIHJlc3BlY3RpdmVseS4gKi8KKyAgICBfc2V0Q2hhbm5lbEdhaW5zKGhHYWluRGVjLCBudW1DaGFubmVscywgY2hhbm5lbEdhaW5EYik7CisKKyAgICBpZiAoIWhHYWluRGVjLT5zdGF0dXMpIHsgLyogb3ZlcndyaXRlIHByZXZpb3VzIGNoYW5uZWwgZ2FpbnMgYXQgc3RhcnR1cCAqLworICAgICAgRFJDX0dBSU5fQlVGRkVSUyogcERyY0dhaW5CdWZmZXJzID0gJmhHYWluRGVjLT5kcmNHYWluQnVmZmVyczsKKyAgICAgIGZvciAoYyA9IDA7IGMgPCBudW1DaGFubmVsczsgYysrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTE5CX0ZSQU1FUzsgaSsrKSB7CisgICAgICAgICAgcERyY0dhaW5CdWZmZXJzLT5jaGFubmVsR2FpbltjXVtpXSA9IGhHYWluRGVjLT5jaGFubmVsR2FpbltjXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaEdhaW5EZWMtPnN0YXR1cyA9IDE7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIHNtb290aCBhbmQgYXBwbHkgY2hhbm5lbCBnYWlucyAqLworICAgIEZJWFBfREJMIHByZXZDaGFubmVsR2Fpbls4XTsKKyAgICBmb3IgKGMgPSAwOyBjIDwgbnVtQ2hhbm5lbHM7IGMrKykgeworICAgICAgcHJldkNoYW5uZWxHYWluW2NdID0gaEdhaW5EZWMtPmNoYW5uZWxHYWluW2NdOworICAgIH0KKworICAgIF9zZXRDaGFubmVsR2FpbnMoaEdhaW5EZWMsIG51bUNoYW5uZWxzLCBjaGFubmVsR2FpbkRiKTsKKworICAgIGlmICghaEdhaW5EZWMtPnN0YXR1cykgeyAvKiBvdmVyd3JpdGUgcHJldmlvdXMgY2hhbm5lbCBnYWlucyBhdCBzdGFydHVwICovCisgICAgICBmb3IgKGMgPSAwOyBjIDwgbnVtQ2hhbm5lbHM7IGMrKykKKyAgICAgICAgcHJldkNoYW5uZWxHYWluW2NdID0gaEdhaW5EZWMtPmNoYW5uZWxHYWluW2NdOworICAgICAgaEdhaW5EZWMtPnN0YXR1cyA9IDE7CisgICAgfQorCisgICAgZm9yIChjID0gMDsgYyA8IG51bUNoYW5uZWxzOyBjKyspIHsKKyAgICAgIElOVCBuX21pbiA9IGZNaW4oZk1pbihDbnRMZWFkaW5nWmVyb3MocHJldkNoYW5uZWxHYWluW2NdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbnRMZWFkaW5nWmVyb3MoaEdhaW5EZWMtPmNoYW5uZWxHYWluW2NdKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgOSk7CisgICAgICBGSVhQX0RCTCBnYWluID0gcHJldkNoYW5uZWxHYWluW2NdIDw8IG5fbWluOworICAgICAgRklYUF9EQkwgc3RlcHNpemUgPSAoKGhHYWluRGVjLT5jaGFubmVsR2FpbltjXSA8PCBuX21pbikgLSBnYWluKTsKKyAgICAgIGlmIChzdGVwc2l6ZSAhPSAoRklYUF9EQkwpMCkgeworICAgICAgICBpZiAoZnJhbWVTaXplID09IDEwMjQpCisgICAgICAgICAgc3RlcHNpemUgPSBzdGVwc2l6ZSA+PiAxMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHN0ZXBzaXplID0gKExPTkcpc3RlcHNpemUgLyBmcmFtZVNpemU7CisgICAgICB9CisgICAgICBuX21pbiA9IDkgLSBuX21pbjsKKyNpZmRlZiBGVU5DVElPTl9kcmNEZWNfR2FpbkRlY29kZXJfU2V0Q2hhbm5lbEdhaW5zX2Z1bmMxCisgICAgICBkcmNEZWNfR2FpbkRlY29kZXJfU2V0Q2hhbm5lbEdhaW5zX2Z1bmMxKGF1ZGlvQnVmZmVyLCBnYWluLCBzdGVwc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9taW4sIGZyYW1lU2l6ZSk7CisjZWxzZQorICAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lU2l6ZTsgaSsrKSB7CisgICAgICAgIGF1ZGlvQnVmZmVyW2ldID0gZk11bHREaXYyKGF1ZGlvQnVmZmVyW2ldLCBnYWluKSA8PCBuX21pbjsKKyAgICAgICAgZ2FpbiArPSBzdGVwc2l6ZTsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgYXVkaW9CdWZmZXIgKz0gYXVkaW9CdWZmZXJDaGFubmVsT2Zmc2V0OworICAgIH0KKyAgfQorfQorCitEUkNfRVJST1IKK2RyY0RlY19HYWluRGVjb2Rlcl9Qcm9jZXNzVGltZURvbWFpbigKKyAgICBIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywgY29uc3QgaW50IGRlbGF5U2FtcGxlcywKKyAgICBjb25zdCBHQUlOX0RFQ19MT0NBVElPTiBkcmNMb2NhdGlvbiwgY29uc3QgaW50IGNoYW5uZWxPZmZzZXQsCisgICAgY29uc3QgaW50IGRyY0NoYW5uZWxPZmZzZXQsIGNvbnN0IGludCBudW1DaGFubmVsc1Byb2Nlc3NlZCwKKyAgICBjb25zdCBpbnQgdGltZURhdGFDaGFubmVsT2Zmc2V0LCBGSVhQX0RCTCogYXVkaW9JT0J1ZmZlcikgeworICBEUkNfRVJST1IgZXJyID0gREVfT0s7CisgIGludCBhOworCisgIGlmICghaEdhaW5EZWMtPnRpbWVEb21haW5TdXBwb3J0ZWQpIHsKKyAgICByZXR1cm4gREVfTk9UX09LOworICB9CisKKyAgZm9yIChhID0gMDsgYSA8IGhHYWluRGVjLT5uQWN0aXZlRHJjczsgYSsrKSB7CisgICAgaWYgKCFfZml0c0xvY2F0aW9uKGhHYWluRGVjLT5hY3RpdmVEcmNbYV0ucEluc3QsIGRyY0xvY2F0aW9uKSkgY29udGludWU7CisKKyAgICAvKiBBcHBseSBEUkMgKi8KKyAgICBlcnIgPSBwcm9jZXNzRHJjVGltZShoR2FpbkRlYywgYSwgZGVsYXlTYW1wbGVzLCBjaGFubmVsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRyY0NoYW5uZWxPZmZzZXQsIG51bUNoYW5uZWxzUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVEYXRhQ2hhbm5lbE9mZnNldCwgYXVkaW9JT0J1ZmZlcik7CisgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKK0RSQ19FUlJPUgorZHJjRGVjX0dhaW5EZWNvZGVyX1Byb2Nlc3NTdWJiYW5kRG9tYWluKAorICAgIEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjLCBjb25zdCBpbnQgZGVsYXlTYW1wbGVzLAorICAgIGNvbnN0IEdBSU5fREVDX0xPQ0FUSU9OIGRyY0xvY2F0aW9uLCBjb25zdCBpbnQgY2hhbm5lbE9mZnNldCwKKyAgICBjb25zdCBpbnQgZHJjQ2hhbm5lbE9mZnNldCwgY29uc3QgaW50IG51bUNoYW5uZWxzUHJvY2Vzc2VkLAorICAgIGNvbnN0IGludCBwcm9jZXNzU2luZ2xlVGltZXNsb3QsIEZJWFBfREJMKiBhdWRpb0lPQnVmZmVyUmVhbFtdLAorICAgIEZJWFBfREJMKiBhdWRpb0lPQnVmZmVySW1hZ1tdKSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgaW50IGE7CisKKyAgaWYgKGhHYWluRGVjLT5zdWJiYW5kRG9tYWluU3VwcG9ydGVkID09IFNETV9PRkYpIHsKKyAgICByZXR1cm4gREVfTk9UX09LOworICB9CisKKyAgZm9yIChhID0gMDsgYSA8IGhHYWluRGVjLT5uQWN0aXZlRHJjczsgYSsrKSB7CisgICAgaWYgKCFfZml0c0xvY2F0aW9uKGhHYWluRGVjLT5hY3RpdmVEcmNbYV0ucEluc3QsIGRyY0xvY2F0aW9uKSkgY29udGludWU7CisKKyAgICAvKiBBcHBseSBEUkMgKi8KKyAgICBlcnIgPSBwcm9jZXNzRHJjU3ViYmFuZChoR2FpbkRlYywgYSwgZGVsYXlTYW1wbGVzLCBjaGFubmVsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyY0NoYW5uZWxPZmZzZXQsIG51bUNoYW5uZWxzUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NTaW5nbGVUaW1lc2xvdCwgYXVkaW9JT0J1ZmZlclJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9JT0J1ZmZlckltYWcpOworICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCitEUkNfRVJST1IKK2RyY0RlY19HYWluRGVjb2Rlcl9TZXRMb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGIoCisgICAgSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsIEZJWFBfREJMIGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYikgeworICBoR2FpbkRlYy0+bG91ZG5lc3NOb3JtYWxpc2F0aW9uR2FpbkRiID0gbG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiOworCisgIHJldHVybiBERV9PSzsKK30KKworaW50IGRyY0RlY19HYWluRGVjb2Rlcl9HZXRGcmFtZVNpemUoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMpIHsKKyAgaWYgKGhHYWluRGVjID09IE5VTEwpIHJldHVybiAtMTsKKworICByZXR1cm4gaEdhaW5EZWMtPmZyYW1lU2l6ZTsKK30KKworaW50IGRyY0RlY19HYWluRGVjb2Rlcl9HZXREZWx0YVRtaW5EZWZhdWx0KEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjKSB7CisgIGlmIChoR2FpbkRlYyA9PSBOVUxMKSByZXR1cm4gLTE7CisKKyAgcmV0dXJuIGhHYWluRGVjLT5kZWx0YVRtaW5EZWZhdWx0OworfQpkaWZmIC0tZ2l0IGEvbGliRFJDZGVjL3NyYy9kcmNEZWNfZ2FpbkRlY29kZXIuaCBiL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX2dhaW5EZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY0ZGY0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX2dhaW5EZWNvZGVyLmgKQEAgLTAsMCArMSwyNjQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRy1EIERSQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBEUkNERUNfR0FJTkRFQ09ERVJfSAorI2RlZmluZSBEUkNERUNfR0FJTkRFQ09ERVJfSAorCisjaW5jbHVkZSAiZHJjRGVjb2Rlci5oIgorCisvKiBEZWZpbml0aW9ucyBjb21tb24gdG8gZ2FpbkRlY29kZXIgc3VibW9kdWxlICovCisKKyNkZWZpbmUgTlVNX0xOQl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDUgLyogcHJldmlvdXMgZnJhbWUgKyB0aGlzIGZyYW1lICsgb25lIGZyYW1lIGZvciBETV9SRUdVTEFSX0RFTEFZICsgKG1heGltdW0gXAorICAgICAgIGRlbGF5U2FtcGxlcykvZnJhbWVTaXplICovCisKKy8qIFFNRjY0ICovCisjZGVmaW5lIFNVQkJBTkRfTlVNX0JBTkRTX1FNRjY0IDY0CisjZGVmaW5lIFNVQkJBTkRfRE9XTlNBTVBMSU5HX0ZBQ1RPUl9RTUY2NCA2NAorI2RlZmluZSBTVUJCQU5EX0FOQUxZU0lTX0RFTEFZX1FNRjY0IDMyMAorCisvKiBRTUY3MSAoYWNjb3JkaW5nIHRvIElTTy9JRUMgMjMwMDMtMToyMDA3KSAqLworI2RlZmluZSBTVUJCQU5EX05VTV9CQU5EU19RTUY3MSA3MQorI2RlZmluZSBTVUJCQU5EX0RPV05TQU1QTElOR19GQUNUT1JfUU1GNzEgNjQKKyNkZWZpbmUgU1VCQkFORF9BTkFMWVNJU19ERUxBWV9RTUY3MSAzMjAgKyAzODQKKworLyogU1RGVDI1NiAoYWNjb3JkaW5nIHRvIElTTy9JRUMgMjMwMDgtMzoyMDE1L0FNRDMpICovCisjZGVmaW5lIFNVQkJBTkRfTlVNX0JBTkRTX1NURlQyNTYgMjU2CisjZGVmaW5lIFNVQkJBTkRfRE9XTlNBTVBMSU5HX0ZBQ1RPUl9TVEZUMjU2IDI1NgorI2RlZmluZSBTVUJCQU5EX0FOQUxZU0lTX0RFTEFZX1NURlQyNTYgMjU2CisKK3R5cGVkZWYgZW51bSB7CisgIEdBSU5fREVDX0RSQzEsCisgIEdBSU5fREVDX0RSQzFfRFJDMiwKKyAgR0FJTl9ERUNfRFJDMiwKKyAgR0FJTl9ERUNfRFJDMywKKyAgR0FJTl9ERUNfRFJDMl9EUkMzCit9IEdBSU5fREVDX0xPQ0FUSU9OOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEZJWFBfREJMIGdhaW5MaW47IC8qIGUgPSA3ICovCisgIFNIT1JUIHRpbWU7Cit9IE5PREVfTElOOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEdBSU5fSU5URVJQT0xBVElPTl9UWVBFIGdhaW5JbnRlcnBvbGF0aW9uVHlwZTsKKyAgaW50IG5Ob2Rlc1tOVU1fTE5CX0ZSQU1FU107IC8qIG51bWJlciBvZiBub2Rlcywgc2F0dXJhdGVkIHRvIDE2ICovCisgIE5PREVfTElOIGxpbmVhck5vZGVbTlVNX0xOQl9GUkFNRVNdWzE2XTsKK30gTElORUFSX05PREVfQlVGRkVSOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBsbmJQb2ludGVyOworICBMSU5FQVJfTk9ERV9CVUZGRVIgbGluZWFyTm9kZUJ1ZmZlclsxMl07CisgIExJTkVBUl9OT0RFX0JVRkZFUiBkdW1teUxuYjsKKyAgRklYUF9EQkwgY2hhbm5lbEdhaW5bOF1bTlVNX0xOQl9GUkFNRVNdOyAvKiBlID0gOCAqLworfSBEUkNfR0FJTl9CVUZGRVJTOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBhY3RpdmVEcmNPZmZzZXQ7CisgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcEluc3Q7CisgIERSQ19DT0VGRklDSUVOVFNfVU5JX0RSQyogcENvZWY7CisKKyAgRFVDS0lOR19NT0RJRklDQVRJT04gZHVja2luZ01vZGlmaWNhdGlvbkZvckNoYW5uZWxHcm91cFs4XTsKKyAgU0NIQVIgY2hhbm5lbEdyb3VwRm9yQ2hhbm5lbFs4XTsKKworICBVQ0hBUiBiYW5kQ291bnRGb3JDaGFubmVsR3JvdXBbOF07CisgIFVDSEFSIGdhaW5FbGVtZW50Rm9yR3JvdXBbOF07CisgIFVDSEFSIGNoYW5uZWxHcm91cElzUGFyYW1ldHJpY0RyY1s4XTsKKyAgVUNIQVIgZ2FpbkVsZW1lbnRDb3VudDsgLyogbnVtYmVyIG9mIGRpZmZlcmVudCBEUkMgZ2FpbnMgaW5sdWRpbmcgYWxsIERSQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kcyAqLworICBpbnQgbG5iSW5kZXhGb3JDaGFubmVsWzhdW05VTV9MTkJfRlJBTUVTXTsKKyAgaW50IHN1YmJhbmRHYWluc1JlYWR5OworfSBBQ1RJVkVfRFJDOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBkZWx0YVRtaW5EZWZhdWx0OworICBJTlQgZnJhbWVTaXplOworICBGSVhQX0RCTCBsb3VkbmVzc05vcm1hbGlzYXRpb25HYWluRGI7CisgIERFTEFZX01PREUgZGVsYXlNb2RlOworCisgIGludCBuQWN0aXZlRHJjczsKKyAgQUNUSVZFX0RSQyBhY3RpdmVEcmNbTUFYX0FDVElWRV9EUkNTXTsKKyAgaW50IG11bHRpQmFuZEFjdGl2ZURyY0luZGV4OworICBpbnQgY2hhbm5lbEdhaW5BY3RpdmVEcmNJbmRleDsKKyAgRklYUF9EQkwgY2hhbm5lbEdhaW5bOF07IC8qIGUgPSA4ICovCisKKyAgRFJDX0dBSU5fQlVGRkVSUyBkcmNHYWluQnVmZmVyczsKKyAgRklYUF9EQkwgc3ViYmFuZEdhaW5zWzEyXVs0ICogMTAyNCAvIDI1Nl07CisgIEZJWFBfREJMIGR1bW15U3ViYmFuZEdhaW5zWzQgKiAxMDI0IC8gMjU2XTsKKworICBpbnQgc3RhdHVzOworICBpbnQgdGltZURvbWFpblN1cHBvcnRlZDsKKyAgU1VCQkFORF9ET01BSU5fTU9ERSBzdWJiYW5kRG9tYWluU3VwcG9ydGVkOworfSBEUkNfR0FJTl9ERUNPREVSLCAqSEFORExFX0RSQ19HQUlOX0RFQ09ERVI7CisKKy8qIGluaXQgZnVuY3Rpb25zICovCitEUkNfRVJST1IKK2RyY0RlY19HYWluRGVjb2Rlcl9PcGVuKEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSKiBwaEdhaW5EZWMpOworCitEUkNfRVJST1IKK2RyY0RlY19HYWluRGVjb2Rlcl9Jbml0KEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjLCBjb25zdCBpbnQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNhbXBsZVJhdGUpOworCitEUkNfRVJST1IKK2RyY0RlY19HYWluRGVjb2Rlcl9TZXRDb2RlY0RlcGVuZGVudFBhcmFtZXRlcnMoCisgICAgSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsIGNvbnN0IERFTEFZX01PREUgZGVsYXlNb2RlLAorICAgIGNvbnN0IGludCB0aW1lRG9tYWluU3VwcG9ydGVkLAorICAgIGNvbnN0IFNVQkJBTkRfRE9NQUlOX01PREUgc3ViYmFuZERvbWFpblN1cHBvcnRlZCk7CisKK0RSQ19FUlJPUgorZHJjRGVjX0dhaW5EZWNvZGVyX0NvbmZpZyhIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIG51bVNlbGVjdGVkRHJjU2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NIQVIqIHNlbGVjdGVkRHJjU2V0SWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiogc2VsZWN0ZWREb3dubWl4SWRzKTsKKworLyogY2xvc2UgZnVuY3Rpb25zICovCitEUkNfRVJST1IKK2RyY0RlY19HYWluRGVjb2Rlcl9DbG9zZShIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiogcGhHYWluRGVjKTsKKworLyogcHJvY2VzcyBmdW5jdGlvbnMgKi8KKworLyogY2FsbCBkcmNEZWNfR2FpbkRlY29kZXJfUHJlcHJvY2VzcyBmaXJzdCAqLworRFJDX0VSUk9SCitkcmNEZWNfR2FpbkRlY29kZXJfUHJlcHJvY2VzcyhIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0dBSU4gaFVuaURyY0dhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBsb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBib29zdCwgY29uc3QgRklYUF9TR0wgY29tcHJlc3MpOworCisvKiBUaGVuIGNhbGwgb25lIG9mIGRyY0RlY19HYWluRGVjb2Rlcl9Qcm9jZXNzVGltZURvbWFpbiBvcgorICogZHJjRGVjX0dhaW5EZWNvZGVyX1Byb2Nlc3NTdWJiYW5kRG9tYWluICovCitEUkNfRVJST1IKK2RyY0RlY19HYWluRGVjb2Rlcl9Qcm9jZXNzVGltZURvbWFpbigKKyAgICBIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywgY29uc3QgaW50IGRlbGF5U2FtcGxlcywKKyAgICBjb25zdCBHQUlOX0RFQ19MT0NBVElPTiBkcmNMb2NhdGlvbiwgY29uc3QgaW50IGNoYW5uZWxPZmZzZXQsCisgICAgY29uc3QgaW50IGRyY0NoYW5uZWxPZmZzZXQsIGNvbnN0IGludCBudW1DaGFubmVsc1Byb2Nlc3NlZCwKKyAgICBjb25zdCBpbnQgdGltZURhdGFDaGFubmVsT2Zmc2V0LCBGSVhQX0RCTCogYXVkaW9JT0J1ZmZlcik7CisKK0RSQ19FUlJPUgorZHJjRGVjX0dhaW5EZWNvZGVyX1Byb2Nlc3NTdWJiYW5kRG9tYWluKAorICAgIEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjLCBjb25zdCBpbnQgZGVsYXlTYW1wbGVzLAorICAgIEdBSU5fREVDX0xPQ0FUSU9OIGRyY0xvY2F0aW9uLCBjb25zdCBpbnQgY2hhbm5lbE9mZnNldCwKKyAgICBjb25zdCBpbnQgZHJjQ2hhbm5lbE9mZnNldCwgY29uc3QgaW50IG51bUNoYW5uZWxzUHJvY2Vzc2VkLAorICAgIGNvbnN0IGludCBwcm9jZXNzU2luZ2xlVGltZXNsb3QsIEZJWFBfREJMKiBhdWRpb0lPQnVmZmVyUmVhbFtdLAorICAgIEZJWFBfREJMKiBhdWRpb0lPQnVmZmVySW1hZ1tdKTsKKworRFJDX0VSUk9SCitkcmNEZWNfR2FpbkRlY29kZXJfQ29uY2VhbChIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfR0FJTiBoVW5pRHJjR2Fpbik7CisKK0RSQ19FUlJPUgorZHJjRGVjX0dhaW5EZWNvZGVyX1NldExvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYigKKyAgICBIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywgRklYUF9EQkwgbG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiKTsKKworaW50IGRyY0RlY19HYWluRGVjb2Rlcl9HZXRGcmFtZVNpemUoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMpOworCitpbnQgZHJjRGVjX0dhaW5EZWNvZGVyX0dldERlbHRhVG1pbkRlZmF1bHQoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMpOworCit2b2lkIGRyY0RlY19HYWluRGVjb2Rlcl9TZXRDaGFubmVsR2FpbnMoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwqIGNoYW5uZWxHYWluRGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGF1ZGlvQnVmZmVyQ2hhbm5lbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogYXVkaW9CdWZmZXIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX3JlYWRlci5jcHAgYi9saWJEUkNkZWMvc3JjL2RyY0RlY19yZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZTdhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJEUkNkZWMvc3JjL2RyY0RlY19yZWFkZXIuY3BwCkBAIC0wLDAgKzEsMjAyOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHLUQgRFJDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZml4cG9pbnRfbWF0aC5oIgorI2luY2x1ZGUgImRyY0RlY19yZWFkZXIuaCIKKyNpbmNsdWRlICJkcmNEZWNfdG9vbHMuaCIKKyNpbmNsdWRlICJkcmNEZWNfcm9tLmgiCisjaW5jbHVkZSAiZHJjRGVjb2Rlci5oIgorCisvKiBNUEVHLUQgRFJDIEFNRCAxICovCisKKyNkZWZpbmUgVU5JRFJDQ09ORkVYVF9QQVJBTV9EUkMgMHgxCisjZGVmaW5lIFVOSURSQ0NPTkZFWFRfVjEgMHgyCisjZGVmaW5lIFVOSURSQ0xPVURFWFRfRVEgMHgxCisKKyNkZWZpbmUgVU5JRFJDR0FJTkVYVF9URVJNIDB4MAorI2RlZmluZSBVTklEUkNMT1VERVhUX1RFUk0gMHgwCisjZGVmaW5lIFVOSURSQ0NPTkZFWFRfVEVSTSAweDAKKworc3RhdGljIGludCBfZ2V0Wihjb25zdCBpbnQgbk5vZGVzTWF4KSB7CisgIC8qIFogaXMgdGhlIG1pbmltdW0gY29kZXdvcmQgbGVuZ3RoIHRoYXQgaXMgbmVlZGVkIHRvIGVuY29kZSBhbGwgcG9zc2libGUKKyAgICogdGltZURlbHRhIHZhbHVlcyAqLworICAvKiBaID0gY2VpbChsb2cyKDIqbk5vZGVzTWF4KSkgKi8KKyAgaW50IFogPSAxOworICB3aGlsZSAoKDEgPDwgWikgPCAoMiAqIG5Ob2Rlc01heCkpIHsKKyAgICBaKys7CisgIH0KKyAgcmV0dXJuIFo7Cit9CisKK3N0YXRpYyBpbnQgX2dldFRpbWVEZWx0YU1pbihjb25zdCBHQUlOX1NFVCogcEdzZXQsIGNvbnN0IGludCBkZWx0YVRtaW5EZWZhdWx0KSB7CisgIGlmIChwR3NldC0+dGltZURlbHRhTWluUHJlc2VudCkgeworICAgIHJldHVybiBwR3NldC0+dGltZURlbHRhTWluOworICB9IGVsc2UgeworICAgIHJldHVybiBkZWx0YVRtaW5EZWZhdWx0OworICB9Cit9CisKKy8qIGNvbXBhcmUgYW5kIGFzc2lnbiAqLworc3RhdGljIGlubGluZSBpbnQgX2NvbXBBc3NpZ24oVUNIQVIqIGRlc3QsIGNvbnN0IFVDSEFSIHNyYykgeworICBpbnQgZGlmZiA9IDA7CisgIGlmICgqZGVzdCAhPSBzcmMpIGRpZmYgPSAxOworICAqZGVzdCA9IHNyYzsKKyAgcmV0dXJuIGRpZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9jb21wQXNzaWduKFVMT05HKiBkZXN0LCBjb25zdCBVTE9ORyBzcmMpIHsKKyAgaW50IGRpZmYgPSAwOworICBpZiAoKmRlc3QgIT0gc3JjKSBkaWZmID0gMTsKKyAgKmRlc3QgPSBzcmM7CisgIHJldHVybiBkaWZmOworfQorCit0eXBlZGVmIGNvbnN0IFNDSEFSICgqSHVmZm1hbilbMl07CisKK2ludCBfZGVjb2RlSHVmZm1hbkNXKEh1ZmZtYW4gaCwgLyohPCBwb2ludGVyIHRvIGh1ZmZtYW4gY29kZWJvb2sgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcykgLyohPCBIYW5kbGUgdG8gYml0YnVmZmVyICovCit7CisgIFNDSEFSIGluZGV4ID0gMDsKKyAgaW50IHZhbHVlLCBiaXQ7CisKKyAgd2hpbGUgKGluZGV4ID49IDApIHsKKyAgICBiaXQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGluZGV4ID0gaFtpbmRleF1bYml0XTsKKyAgfQorCisgIHZhbHVlID0gaW5kZXggKyA2NDsgLyogQWRkIG9mZnNldCAqLworCisgIHJldHVybiB2YWx1ZTsKK30KKworLyoqKioqKioqKiovCisvKiB1bmlEcmMgKi8KKy8qKioqKioqKioqLworCitEUkNfRVJST1IKK2RyY0RlY19yZWFkVW5pRHJjKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgICAgICAgICAgICAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmcmFtZVNpemUsIGNvbnN0IGludCBkZWx0YVRtaW5EZWZhdWx0LAorICAgICAgICAgICAgICAgICAgSEFORExFX1VOSV9EUkNfR0FJTiBoVW5pRHJjR2FpbikgeworICBEUkNfRVJST1IgZXJyID0gREVfT0s7CisgIGludCBsb3VkbmVzc0luZm9TZXRQcmVzZW50LCB1bmlEcmNDb25maWdQcmVzZW50OworCisgIGxvdWRuZXNzSW5mb1NldFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBpZiAobG91ZG5lc3NJbmZvU2V0UHJlc2VudCkgeworICAgIHVuaURyY0NvbmZpZ1ByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGlmICh1bmlEcmNDb25maWdQcmVzZW50KSB7CisgICAgICBlcnIgPSBkcmNEZWNfcmVhZFVuaURyY0NvbmZpZyhoQnMsIGhVbmlEcmNDb25maWcpOworICAgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgICB9CisgICAgZXJyID0gZHJjRGVjX3JlYWRMb3VkbmVzc0luZm9TZXQoaEJzLCBoTG91ZG5lc3NJbmZvU2V0KTsKKyAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICB9CisKKyAgaWYgKGhVbmlEcmNHYWluICE9IE5VTEwpIHsKKyAgICBlcnIgPSBkcmNEZWNfcmVhZFVuaURyY0dhaW4oaEJzLCBoVW5pRHJjQ29uZmlnLCBmcmFtZVNpemUsIGRlbHRhVG1pbkRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhVbmlEcmNHYWluKTsKKyAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqLworLyogdW5pRHJjR2FpbiAqLworLyoqKioqKioqKioqKioqLworCitzdGF0aWMgRklYUF9TR0wgX2RlY29kZUdhaW5Jbml0aWFsKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgY29uc3QgR0FJTl9DT0RJTkdfUFJPRklMRSBnYWluQ29kaW5nUHJvZmlsZSkgeworICBpbnQgc2lnbiwgbWFnbjsKKyAgRklYUF9TR0wgZ2FpbkluaXRpYWwgPSAoRklYUF9TR0wpMDsKKyAgc3dpdGNoIChnYWluQ29kaW5nUHJvZmlsZSkgeworICAgIGNhc2UgR0NQX1JFR1VMQVI6CisgICAgICBzaWduID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICAgIG1hZ24gPSBGREtyZWFkQml0cyhoQnMsIDgpOworCisgICAgICBnYWluSW5pdGlhbCA9CisgICAgICAgICAgKEZJWFBfU0dMKShtYWduIDw8IChGUkFDVF9CSVRTIC0gMSAtIDMgLSA3KSk7IC8qIG1hZ24gKiAwLjEyNTsgKi8KKyAgICAgIGlmIChzaWduKSBnYWluSW5pdGlhbCA9IC1nYWluSW5pdGlhbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0NQX0ZBRElORzoKKyAgICAgIHNpZ24gPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgaWYgKHNpZ24gPT0gMCkKKyAgICAgICAgZ2FpbkluaXRpYWwgPSAoRklYUF9TR0wpMDsKKyAgICAgIGVsc2UgeworICAgICAgICBtYWduID0gRkRLcmVhZEJpdHMoaEJzLCAxMCk7CisgICAgICAgIGdhaW5Jbml0aWFsID0gLShGSVhQX1NHTCkoCisgICAgICAgICAgICAobWFnbiArIDEpIDw8IChGUkFDVF9CSVRTIC0gMSAtIDMgLSA3KSk7IC8qIC0gKG1hZ24gKyAxKSAqIDAuMTI1OyAqLworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHQ1BfQ0xJUFBJTkdfRFVDS0lORzoKKyAgICAgIHNpZ24gPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgaWYgKHNpZ24gPT0gMCkKKyAgICAgICAgZ2FpbkluaXRpYWwgPSAoRklYUF9TR0wpMDsKKyAgICAgIGVsc2UgeworICAgICAgICBtYWduID0gRkRLcmVhZEJpdHMoaEJzLCA4KTsKKyAgICAgICAgZ2FpbkluaXRpYWwgPSAtKEZJWFBfU0dMKSgKKyAgICAgICAgICAgIChtYWduICsgMSkgPDwgKEZSQUNUX0JJVFMgLSAxIC0gMyAtIDcpKTsgLyogLSAobWFnbiArIDEpICogMC4xMjU7ICovCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdDUF9DT05TVEFOVDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBnYWluSW5pdGlhbDsKK30KKworc3RhdGljIGludCBfZGVjb2RlTk5vZGVzKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcykgeworICBpbnQgbk5vZGVzID0gMCwgZW5kTWFya2VyID0gMDsKKworICAvKiBkZWNvZGUgbnVtYmVyIG9mIG5vZGVzICovCisgIHdoaWxlIChlbmRNYXJrZXIgIT0gMSkgeworICAgIG5Ob2RlcysrOworICAgIGlmIChuTm9kZXMgPj0gMTI4KSBicmVhazsKKyAgICBlbmRNYXJrZXIgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICB9CisgIHJldHVybiBuTm9kZXM7Cit9CisKK3N0YXRpYyB2b2lkIF9kZWNvZGVHYWlucyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0FJTl9DT0RJTkdfUFJPRklMRSBnYWluQ29kaW5nUHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbk5vZGVzLCBHQUlOX05PREUqIHBOb2RlcykgeworICBpbnQgaywgZGVsdGFHYWluOworICBIdWZmbWFuIGRlbHRhR2FpbkNvZGVib29rOworCisgIHBOb2Rlc1swXS5nYWluRGIgPSBfZGVjb2RlR2FpbkluaXRpYWwoaEJzLCBnYWluQ29kaW5nUHJvZmlsZSk7CisKKyAgaWYgKGdhaW5Db2RpbmdQcm9maWxlID09IEdDUF9DTElQUElOR19EVUNLSU5HKSB7CisgICAgZGVsdGFHYWluQ29kZWJvb2sgPSAoSHVmZm1hbikmZGVsdGFHYWluX2NvZGluZ1Byb2ZpbGVfMl9odWZmbWFuOworICB9IGVsc2UgeworICAgIGRlbHRhR2FpbkNvZGVib29rID0gKEh1ZmZtYW4pJmRlbHRhR2Fpbl9jb2RpbmdQcm9maWxlXzBfMV9odWZmbWFuOworICB9CisKKyAgZm9yIChrID0gMTsgayA8IG5Ob2RlczsgaysrKSB7CisgICAgZGVsdGFHYWluID0gX2RlY29kZUh1ZmZtYW5DVyhkZWx0YUdhaW5Db2RlYm9vaywgaEJzKTsKKyAgICBpZiAoayA+PSAxNikgY29udGludWU7CisgICAgLyogZ2Fpbl9kQl9lID0gNyAqLworICAgIHBOb2Rlc1trXS5nYWluRGIgPQorICAgICAgICBwTm9kZXNbayAtIDFdLmdhaW5EYiArCisgICAgICAgIChGSVhQX1NHTCkoZGVsdGFHYWluIDw8IChGUkFDVF9CSVRTIC0gMSAtIDcgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMykpOyAvKiBwTm9kZXNbay0xXS5nYWluRGIgKyAwLjEyNSpkZWx0YUdhaW4gKi8KKyAgfQorfQorCitzdGF0aWMgdm9pZCBfZGVjb2RlU2xvcGVzKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0FJTl9JTlRFUlBPTEFUSU9OX1RZUEUgZ2FpbkludGVycG9sYXRpb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbk5vZGVzLCBHQUlOX05PREUqIHBOb2RlcykgeworICBpbnQgayA9IDA7CisKKyAgaWYgKGdhaW5JbnRlcnBvbGF0aW9uVHlwZSA9PSBHSVRfU1BMSU5FKSB7CisgICAgLyogZGVjb2RlIHNsb3BlIHN0ZWVwbmVzcyAqLworICAgIGZvciAoayA9IDA7IGsgPCBuTm9kZXM7IGsrKykgeworICAgICAgX2RlY29kZUh1ZmZtYW5DVygoSHVmZm1hbikmc2xvcGVTdGVlcG5lc3NfaHVmZm1hbiwgaEJzKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGludCBfZGVjb2RlVGltZURlbHRhKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgY29uc3QgaW50IFopIHsKKyAgaW50IHByZWZpeCwgbXU7CisKKyAgcHJlZml4ID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsKKyAgc3dpdGNoIChwcmVmaXgpIHsKKyAgICBjYXNlIDB4MDoKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgMHgxOgorICAgICAgbXUgPSBGREtyZWFkQml0cyhoQnMsIDIpOworICAgICAgcmV0dXJuIG11ICsgMjsKKyAgICBjYXNlIDB4MjoKKyAgICAgIG11ID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKKyAgICAgIHJldHVybiBtdSArIDY7CisgICAgY2FzZSAweDM6CisgICAgICBtdSA9IEZES3JlYWRCaXRzKGhCcywgWik7CisgICAgICByZXR1cm4gbXUgKyAxNDsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworc3RhdGljIHZvaWQgX2RlY29kZVRpbWVzKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgY29uc3QgaW50IGRlbHRhVG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZnJhbWVTaXplLCBjb25zdCBpbnQgZnVsbEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0aW1lT2Zmc2V0LCBjb25zdCBpbnQgWiwgY29uc3QgaW50IG5Ob2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBHQUlOX05PREUqIHBOb2RlcykgeworICBpbnQgdGltZURlbHRhLCBrOworICBpbnQgdGltZU9mZnMgPSB0aW1lT2Zmc2V0OworICBpbnQgZnJhbWVFbmRGbGFnLCBub2RlVGltZVRtcCwgbm9kZVJlc0ZsYWc7CisKKyAgaWYgKGZ1bGxGcmFtZSA9PSAwKSB7CisgICAgZnJhbWVFbmRGbGFnID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgfSBlbHNlIHsKKyAgICBmcmFtZUVuZEZsYWcgPSAxOworICB9CisKKyAgaWYgKGZyYW1lRW5kRmxhZyA9PQorICAgICAgMSkgeyAvKiBmcmFtZUVuZEZsYWcgPT0gMSBzaWduYWxzIHRoYXQgdGhlIGxhc3Qgbm9kZSBpcyBhdCB0aGUgZW5kIG9mIHRoZQorICAgICAgICAgICAgICBEUkMgZnJhbWUgKi8KKyAgICBub2RlUmVzRmxhZyA9IDA7CisgICAgZm9yIChrID0gMDsgayA8IG5Ob2RlcyAtIDE7IGsrKykgeworICAgICAgLyogZGVjb2RlIGEgZGVsdGEgdGltZSB2YWx1ZSAqLworICAgICAgdGltZURlbHRhID0gX2RlY29kZVRpbWVEZWx0YShoQnMsIFopOworICAgICAgaWYgKGsgPj0gKDE2IC0gMSkpIGNvbnRpbnVlOworICAgICAgLyogZnJhbWVFbmRGbGFnID09IDEgbmVlZHMgc3BlY2lhbCBoYW5kbGluZyBmb3IgbGFzdCBub2RlIHdpdGggbm9kZQorICAgICAgICogcmVzZXJ2b2lyICovCisgICAgICBub2RlVGltZVRtcCA9IHRpbWVPZmZzICsgdGltZURlbHRhICogZGVsdGFUbWluOworICAgICAgaWYgKG5vZGVUaW1lVG1wID4gZnJhbWVTaXplICsgdGltZU9mZnNldCkgeworICAgICAgICBpZiAobm9kZVJlc0ZsYWcgPT0gMCkgeworICAgICAgICAgIHBOb2Rlc1trXS50aW1lID0gZnJhbWVTaXplICsgdGltZU9mZnNldDsKKyAgICAgICAgICBub2RlUmVzRmxhZyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcE5vZGVzW2sgKyAxXS50aW1lID0gbm9kZVRpbWVUbXA7CisgICAgICB9IGVsc2UgeworICAgICAgICBwTm9kZXNba10udGltZSA9IG5vZGVUaW1lVG1wOworICAgICAgfQorICAgICAgdGltZU9mZnMgPSBub2RlVGltZVRtcDsKKyAgICB9CisgICAgaWYgKG5vZGVSZXNGbGFnID09IDApIHsKKyAgICAgIGsgPSBmTWluKGssIDE2IC0gMSk7CisgICAgICBwTm9kZXNba10udGltZSA9IGZyYW1lU2l6ZSArIHRpbWVPZmZzZXQ7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoayA9IDA7IGsgPCBuTm9kZXM7IGsrKykgeworICAgICAgLyogZGVjb2RlIGEgZGVsdGEgdGltZSB2YWx1ZSAqLworICAgICAgdGltZURlbHRhID0gX2RlY29kZVRpbWVEZWx0YShoQnMsIFopOworICAgICAgaWYgKGsgPj0gMTYpIGNvbnRpbnVlOworICAgICAgcE5vZGVzW2tdLnRpbWUgPSB0aW1lT2ZmcyArIHRpbWVEZWx0YSAqIGRlbHRhVG1pbjsKKyAgICAgIHRpbWVPZmZzID0gcE5vZGVzW2tdLnRpbWU7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIF9yZWFkTm9kZXMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBHQUlOX1NFVCogZ2FpblNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZyYW1lU2l6ZSwgY29uc3QgaW50IHRpbWVEZWx0YU1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIqIHBOTm9kZXMsIEdBSU5fTk9ERSogcE5vZGVzKSB7CisgIGludCB0aW1lT2Zmc2V0LCBkcmNHYWluQ29kaW5nTW9kZSwgbk5vZGVzOworICBpbnQgWiA9IF9nZXRaKGZyYW1lU2l6ZSAvIHRpbWVEZWx0YU1pbik7CisgIGlmIChnYWluU2V0LT50aW1lQWxpZ25tZW50ID09IDApIHsKKyAgICB0aW1lT2Zmc2V0ID0gLTE7CisgIH0gZWxzZSB7CisgICAgdGltZU9mZnNldCA9IC10aW1lRGVsdGFNaW4gKworICAgICAgICAgICAgICAgICAodGltZURlbHRhTWluIC0gMSkgLworICAgICAgICAgICAgICAgICAgICAgMjsgLyogdGltZU9mZnNldCA9IC0gZGVsdGFUbWluICsgZmxvb3IoKGRlbHRhVG1pbi0xKS8yKTsgKi8KKyAgfQorCisgIGRyY0dhaW5Db2RpbmdNb2RlID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgaWYgKGRyY0dhaW5Db2RpbmdNb2RlID09IDApIHsKKyAgICAvKiAic2ltcGxlIiBtb2RlOiBvbmx5IG9uZSBub2RlIGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lIHdpdGggc2xvcGUgPSAwICovCisgICAgbk5vZGVzID0gMTsKKyAgICBwTm9kZXNbMF0uZ2FpbkRiID0gX2RlY29kZUdhaW5Jbml0aWFsKAorICAgICAgICBoQnMsIChHQUlOX0NPRElOR19QUk9GSUxFKWdhaW5TZXQtPmdhaW5Db2RpbmdQcm9maWxlKTsKKyAgICBwTm9kZXNbMF0udGltZSA9IGZyYW1lU2l6ZSArIHRpbWVPZmZzZXQ7CisgIH0gZWxzZSB7CisgICAgbk5vZGVzID0gX2RlY29kZU5Ob2RlcyhoQnMpOworCisgICAgX2RlY29kZVNsb3BlcyhoQnMsIChHQUlOX0lOVEVSUE9MQVRJT05fVFlQRSlnYWluU2V0LT5nYWluSW50ZXJwb2xhdGlvblR5cGUsCisgICAgICAgICAgICAgICAgICBuTm9kZXMsIHBOb2Rlcyk7CisKKyAgICBfZGVjb2RlVGltZXMoaEJzLCB0aW1lRGVsdGFNaW4sIGZyYW1lU2l6ZSwgZ2FpblNldC0+ZnVsbEZyYW1lLCB0aW1lT2Zmc2V0LAorICAgICAgICAgICAgICAgICBaLCBuTm9kZXMsIHBOb2Rlcyk7CisKKyAgICBfZGVjb2RlR2FpbnMoaEJzLCAoR0FJTl9DT0RJTkdfUFJPRklMRSlnYWluU2V0LT5nYWluQ29kaW5nUHJvZmlsZSwgbk5vZGVzLAorICAgICAgICAgICAgICAgICBwTm9kZXMpOworICB9CisgICpwTk5vZGVzID0gKFVDSEFSKW5Ob2RlczsKK30KKworc3RhdGljIHZvaWQgX3JlYWREcmNHYWluU2VxdWVuY2UoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBHQUlOX1NFVCogZ2FpblNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmcmFtZVNpemUsIGNvbnN0IGludCB0aW1lRGVsdGFNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiogcE5Ob2RlcywgR0FJTl9OT0RFIHBOb2Rlc1sxNl0pIHsKKyAgU0hPUlQgdGltZUJ1ZlByZXZGcmFtZVsxNl0sIHRpbWVCdWZDdXJGcmFtZVsxNl07CisgIGludCBuTm9kZXNOb2RlUmVzLCBuTm9kZXNDdXIsIGssIG07CisKKyAgaWYgKGdhaW5TZXQtPmdhaW5Db2RpbmdQcm9maWxlID09IEdDUF9DT05TVEFOVCkgeworICAgICpwTk5vZGVzID0gMTsKKyAgICBwTm9kZXNbMF0udGltZSA9IGZyYW1lU2l6ZSAtIDE7CisgICAgcE5vZGVzWzBdLmdhaW5EYiA9IChGSVhQX1NHTCkwOworICB9IGVsc2UgeworICAgIF9yZWFkTm9kZXMoaEJzLCBnYWluU2V0LCBmcmFtZVNpemUsIHRpbWVEZWx0YU1pbiwgcE5Ob2RlcywgcE5vZGVzKTsKKworICAgIC8qIGNvdW50IG51bWJlciBvZiBub2RlcyBpbiBub2RlIHJlc2Vydm9pciAqLworICAgIG5Ob2Rlc05vZGVSZXMgPSAwOworICAgIG5Ob2Rlc0N1ciA9IDA7CisgICAgLyogY291bnQgYW5kIGJ1ZmZlciBub2RlcyBmcm9tIG5vZGUgcmVzZXJ2b2lyICovCisgICAgZm9yIChrID0gMDsgayA8ICpwTk5vZGVzOyBrKyspIHsKKyAgICAgIGlmIChrID49IDE2KSBjb250aW51ZTsKKyAgICAgIGlmIChwTm9kZXNba10udGltZSA+PSBmcmFtZVNpemUpIHsKKyAgICAgICAgLyogd3JpdGUgbm9kZSByZXNlcnZvaXIgdGltZXMgaW50byBidWZmZXIgKi8KKyAgICAgICAgdGltZUJ1ZlByZXZGcmFtZVtuTm9kZXNOb2RlUmVzXSA9IHBOb2Rlc1trXS50aW1lOworICAgICAgICBuTm9kZXNOb2RlUmVzKys7CisgICAgICB9IGVsc2UgeyAvKiB0aW1lcyBmcm9tIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgdGltZUJ1ZkN1ckZyYW1lW25Ob2Rlc0N1cl0gPSBwTm9kZXNba10udGltZTsKKyAgICAgICAgbk5vZGVzQ3VyKys7CisgICAgICB9CisgICAgfQorICAgIC8qIGNvbXBvc2UgcmlnaHQgdGltZSBvcmRlciAoYml0IHJlc2Vydm9pciBmaXJzdCkgKi8KKyAgICBmb3IgKGsgPSAwOyBrIDwgbk5vZGVzTm9kZVJlczsgaysrKSB7CisgICAgICAvKiBzdWJ0cmFjdCB0d28gdGltZSBmcmFtZVNpemU6IG9uZSB0byByZW1vdmUgbm9kZSByZXNlcnZvaXIgb2Zmc2V0IGFuZAorICAgICAgICogb25lIHRvIGdldCB0aGUgbmVnYXRpdmUgaW5kZXggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZnJhbWUKKyAgICAgICAqLworICAgICAgcE5vZGVzW2tdLnRpbWUgPSB0aW1lQnVmUHJldkZyYW1lW2tdIC0gMiAqIGZyYW1lU2l6ZTsKKyAgICB9CisgICAgLyogLi4uYW5kIHRpbWVzIGZyb20gY3VycmVudCBmcmFtZSAqLworICAgIGZvciAobSA9IDA7IG0gPCBuTm9kZXNDdXI7IG0rKywgaysrKSB7CisgICAgICBwTm9kZXNba10udGltZSA9IHRpbWVCdWZDdXJGcmFtZVttXTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIERSQ19FUlJPUiBfcmVhZFVuaURyY0dhaW5FeHRlbnNpb24oSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5JX0RSQ19HQUlOX0VYVEVOU0lPTiogcEV4dCkgeworICBEUkNfRVJST1IgZXJyID0gREVfT0s7CisgIGludCBrLCBiaXRTaXplTGVuLCBleHRTaXplQml0cywgYml0U2l6ZTsKKworICBrID0gMDsKKyAgcEV4dC0+dW5pRHJjR2FpbkV4dFR5cGVba10gPSBGREtyZWFkQml0cyhoQnMsIDQpOworICB3aGlsZSAocEV4dC0+dW5pRHJjR2FpbkV4dFR5cGVba10gIT0gVU5JRFJDR0FJTkVYVF9URVJNKSB7CisgICAgaWYgKGsgPj0gKDggLSAxKSkgcmV0dXJuIERFX01FTU9SWV9FUlJPUjsKKyAgICBiaXRTaXplTGVuID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKKyAgICBleHRTaXplQml0cyA9IGJpdFNpemVMZW4gKyA0OworCisgICAgYml0U2l6ZSA9IEZES3JlYWRCaXRzKGhCcywgZXh0U2l6ZUJpdHMpOworICAgIHBFeHQtPmV4dEJpdFNpemVba10gPSBiaXRTaXplICsgMTsKKworICAgIHN3aXRjaCAocEV4dC0+dW5pRHJjR2FpbkV4dFR5cGVba10pIHsKKyAgICAgIC8qIGFkZCBmdXR1cmUgZXh0ZW5zaW9ucyBoZXJlICovCisgICAgICBkZWZhdWx0OgorICAgICAgICBGREtwdXNoRm9yKGhCcywgcEV4dC0+ZXh0Qml0U2l6ZVtrXSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBrKys7CisgICAgcEV4dC0+dW5pRHJjR2FpbkV4dFR5cGVba10gPSBGREtyZWFkQml0cyhoQnMsIDQpOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworRFJDX0VSUk9SCitkcmNEZWNfcmVhZFVuaURyY0dhaW4oSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLCBjb25zdCBpbnQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkZWx0YVRtaW5EZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0dBSU4gaFVuaURyY0dhaW4pIHsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworICBpbnQgc2VxLCBnYWluU2VxdWVuY2VDb3VudDsKKyAgRFJDX0NPRUZGSUNJRU5UU19VTklfRFJDKiBwQ29lZiA9CisgICAgICBzZWxlY3REcmNDb2VmZmljaWVudHMoaFVuaURyY0NvbmZpZywgTE9DQVRJT05fU0VMRUNURUQpOworICBpZiAocENvZWYgPT0gTlVMTCkgcmV0dXJuIERFX09LOworICBpZiAoaFVuaURyY0dhaW4gPT0gTlVMTCkgcmV0dXJuIERFX09LOyAvKiBoVW5pRHJjR2FpbiBub3QgaW5pdGlhbGl6ZWQgeWV0ICovCisKKyAgZ2FpblNlcXVlbmNlQ291bnQgPSBmTWluKHBDb2VmLT5nYWluU2VxdWVuY2VDb3VudCwgKFVDSEFSKTEyKTsKKworICBmb3IgKHNlcSA9IDA7IHNlcSA8IGdhaW5TZXF1ZW5jZUNvdW50OyBzZXErKykgeworICAgIFVDSEFSIGluZGV4ID0gcENvZWYtPmdhaW5TZXRJbmRleEZvckdhaW5TZXF1ZW5jZVtzZXFdOworICAgIEdBSU5fU0VUKiBnYWluU2V0OworICAgIGludCB0aW1lRGVsdGFNaW47CisgICAgVUNIQVIgdG1wTk5vZGVzID0gMDsKKyAgICBHQUlOX05PREUgdG1wTm9kZXNbMTZdOworCisgICAgaWYgKChpbmRleCA+PSBwQ29lZi0+Z2FpblNldENvdW50KSB8fCAoaW5kZXggPj0gMTIpKSByZXR1cm4gREVfTk9UX09LOworICAgIGdhaW5TZXQgPSAmKHBDb2VmLT5nYWluU2V0W2luZGV4XSk7CisKKyAgICB0aW1lRGVsdGFNaW4gPSBfZ2V0VGltZURlbHRhTWluKGdhaW5TZXQsIGRlbHRhVG1pbkRlZmF1bHQpOworCisgICAgX3JlYWREcmNHYWluU2VxdWVuY2UoaEJzLCBnYWluU2V0LCBmcmFtZVNpemUsIHRpbWVEZWx0YU1pbiwgJnRtcE5Ob2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0bXBOb2Rlcyk7CisKKyAgICBoVW5pRHJjR2Fpbi0+bk5vZGVzW3NlcV0gPSB0bXBOTm9kZXM7CisgICAgRkRLbWVtY3B5KGhVbmlEcmNHYWluLT5nYWluTm9kZVtzZXFdLCB0bXBOb2RlcywKKyAgICAgICAgICAgICAgZk1pbih0bXBOTm9kZXMsIChVQ0hBUikxNikgKiBzaXplb2YoR0FJTl9OT0RFKSk7CisgIH0KKworICBoVW5pRHJjR2Fpbi0+dW5pRHJjR2FpbkV4dFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBpZiAoaFVuaURyY0dhaW4tPnVuaURyY0dhaW5FeHRQcmVzZW50ID09IDEpIHsKKyAgICBlcnIgPSBfcmVhZFVuaURyY0dhaW5FeHRlbnNpb24oaEJzLCAmKGhVbmlEcmNHYWluLT51bmlEcmNHYWluRXh0ZW5zaW9uKSk7CisgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqLworLyogdW5pRHJjQ29uZmlnICovCisvKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgX2RlY29kZUR1Y2tpbmdNb2RpZmljYXRpb24oSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFVDS0lOR19NT0RJRklDQVRJT04qIHBETW9kLCBpbnQgaXNCb3gpIHsKKyAgaW50IGJzRHVja2luZ1NjYWxpbmcsIHNpZ21hLCBtdTsKKworICBpZiAoaXNCb3gpIEZES3B1c2hGb3IoaEJzLCA3KTsgLyogcmVzZXJ2ZWQgKi8KKyAgcERNb2QtPmR1Y2tpbmdTY2FsaW5nUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisKKyAgaWYgKHBETW9kLT5kdWNraW5nU2NhbGluZ1ByZXNlbnQpIHsKKyAgICBpZiAoaXNCb3gpIEZES3B1c2hGb3IoaEJzLCA0KTsgLyogcmVzZXJ2ZWQgKi8KKyAgICBic0R1Y2tpbmdTY2FsaW5nID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICBzaWdtYSA9IGJzRHVja2luZ1NjYWxpbmcgPj4gMzsKKyAgICBtdSA9IGJzRHVja2luZ1NjYWxpbmcgJiAweDc7CisKKyAgICBpZiAoc2lnbWEpIHsKKyAgICAgIHBETW9kLT5kdWNraW5nU2NhbGluZyA9IChGSVhQX1NHTCkoCisgICAgICAgICAgKDcgLSBtdSkgPDwgKEZSQUNUX0JJVFMgLSAxIC0gMyAtIDIpKTsgLyogMS4wIC0gMC4xMjUgKiAoMSArIG11KTsgKi8KKyAgICB9IGVsc2UgeworICAgICAgcERNb2QtPmR1Y2tpbmdTY2FsaW5nID0gKEZJWFBfU0dMKSgKKyAgICAgICAgICAoOSArIG11KSA8PCAoRlJBQ1RfQklUUyAtIDEgLSAzIC0gMikpOyAvKiAxLjAgKyAwLjEyNSAqICgxICsgbXUpOyAqLworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwRE1vZC0+ZHVja2luZ1NjYWxpbmcgPSAoRklYUF9TR0wpKDEgPDwgKEZSQUNUX0JJVFMgLSAxIC0gMikpOyAvKiAxLjAgKi8KKyAgfQorfQorCitzdGF0aWMgdm9pZCBfZGVjb2RlR2Fpbk1vZGlmaWNhdGlvbihIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIGNvbnN0IGludCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhbmRDb3VudCwgR0FJTl9NT0RJRklDQVRJT04qIHBHTW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzQm94KSB7CisgIGludCBzaWduLCBic0dhaW5PZmZzZXQsIGJzQXR0ZW51YXRpb25TY2FsaW5nLCBic0FtcGxpZmljYXRpb25TY2FsaW5nOworCisgIGlmICh2ZXJzaW9uID4gMCkgeworICAgIGludCBiLCBzaGFwZUZpbHRlclByZXNlbnQ7CisKKyAgICBpZiAoaXNCb3gpIHsKKyAgICAgIEZES3B1c2hGb3IoaEJzLCA0KTsgLyogcmVzZXJ2ZWQgKi8KKyAgICAgIGJhbmRDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgfQorCisgICAgZm9yIChiID0gMDsgYiA8IGJhbmRDb3VudDsgYisrKSB7CisgICAgICBpZiAoaXNCb3gpIHsKKyAgICAgICAgRkRLcHVzaEZvcihoQnMsIDQpOyAvKiByZXNlcnZlZCAqLworICAgICAgICBwR01vZFtiXS50YXJnZXRDaGFyYWN0ZXJpc3RpY0xlZnRQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICAgICAgcEdNb2RbYl0udGFyZ2V0Q2hhcmFjdGVyaXN0aWNSaWdodFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgICBwR01vZFtiXS5nYWluU2NhbGluZ1ByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgICBwR01vZFtiXS5nYWluT2Zmc2V0UHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICB9CisKKyAgICAgIGlmICghaXNCb3gpCisgICAgICAgIHBHTW9kW2JdLnRhcmdldENoYXJhY3RlcmlzdGljTGVmdFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgaWYgKHBHTW9kW2JdLnRhcmdldENoYXJhY3RlcmlzdGljTGVmdFByZXNlbnQpIHsKKyAgICAgICAgaWYgKGlzQm94KSBGREtwdXNoRm9yKGhCcywgNCk7IC8qIHJlc2VydmVkICovCisgICAgICAgIHBHTW9kW2JdLnRhcmdldENoYXJhY3RlcmlzdGljTGVmdEluZGV4ID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICAgIH0KKyAgICAgIGlmICghaXNCb3gpCisgICAgICAgIHBHTW9kW2JdLnRhcmdldENoYXJhY3RlcmlzdGljUmlnaHRQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICAgIGlmIChwR01vZFtiXS50YXJnZXRDaGFyYWN0ZXJpc3RpY1JpZ2h0UHJlc2VudCkgeworICAgICAgICBpZiAoaXNCb3gpIEZES3B1c2hGb3IoaEJzLCA0KTsgLyogcmVzZXJ2ZWQgKi8KKyAgICAgICAgcEdNb2RbYl0udGFyZ2V0Q2hhcmFjdGVyaXN0aWNSaWdodEluZGV4ID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICAgIH0KKyAgICAgIGlmICghaXNCb3gpIHBHTW9kW2JdLmdhaW5TY2FsaW5nUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICBpZiAocEdNb2RbYl0uZ2FpblNjYWxpbmdQcmVzZW50KSB7CisgICAgICAgIGJzQXR0ZW51YXRpb25TY2FsaW5nID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICAgICAgcEdNb2RbYl0uYXR0ZW51YXRpb25TY2FsaW5nID0gKEZJWFBfU0dMKSgKKyAgICAgICAgICAgIGJzQXR0ZW51YXRpb25TY2FsaW5nCisgICAgICAgICAgICA8PCAoRlJBQ1RfQklUUyAtIDEgLSAzIC0gMikpOyAvKiBic0F0dGVudWF0aW9uU2NhbGluZyAqIDAuMTI1OyAqLworICAgICAgICBic0FtcGxpZmljYXRpb25TY2FsaW5nID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICAgICAgcEdNb2RbYl0uYW1wbGlmaWNhdGlvblNjYWxpbmcgPSAoRklYUF9TR0wpKAorICAgICAgICAgICAgYnNBbXBsaWZpY2F0aW9uU2NhbGluZworICAgICAgICAgICAgPDwgKEZSQUNUX0JJVFMgLSAxIC0gMyAtIDIpKTsgLyogYnNBbXBsaWZpY2F0aW9uU2NhbGluZyAqIDAuMTI1OyAqLworICAgICAgfQorICAgICAgaWYgKCFpc0JveCkgcEdNb2RbYl0uZ2Fpbk9mZnNldFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgaWYgKHBHTW9kW2JdLmdhaW5PZmZzZXRQcmVzZW50KSB7CisgICAgICAgIGlmIChpc0JveCkgRkRLcHVzaEZvcihoQnMsIDIpOyAvKiByZXNlcnZlZCAqLworICAgICAgICBzaWduID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICAgICAgYnNHYWluT2Zmc2V0ID0gRkRLcmVhZEJpdHMoaEJzLCA1KTsKKyAgICAgICAgcEdNb2RbYl0uZ2Fpbk9mZnNldCA9IChGSVhQX1NHTCkoCisgICAgICAgICAgICAoMSArIGJzR2Fpbk9mZnNldCkKKyAgICAgICAgICAgIDw8IChGUkFDVF9CSVRTIC0gMSAtIDIgLSA0KSk7IC8qICgxK2JzR2Fpbk9mZnNldCkgKiAwLjI1OyAqLworICAgICAgICBpZiAoc2lnbikgeworICAgICAgICAgIHBHTW9kW2JdLmdhaW5PZmZzZXQgPSAtcEdNb2RbYl0uZ2Fpbk9mZnNldDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoYmFuZENvdW50ID09IDEpIHsKKyAgICAgIHNoYXBlRmlsdGVyUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICBpZiAoc2hhcGVGaWx0ZXJQcmVzZW50KSB7CisgICAgICAgIGlmIChpc0JveCkgRkRLcHVzaEZvcihoQnMsIDMpOyAvKiByZXNlcnZlZCAqLworICAgICAgICBGREtwdXNoRm9yKGhCcywgNCk7ICAgICAgICAgICAgLyogcEdNb2QtPnNoYXBlRmlsdGVySW5kZXggKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpc0JveCkgRkRLcHVzaEZvcihoQnMsIDcpOyAvKiByZXNlcnZlZCAqLworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQgYiwgZ2FpblNjYWxpbmdQcmVzZW50LCBnYWluT2Zmc2V0UHJlc2VudDsKKyAgICBGSVhQX1NHTCBhdHRlbnVhdGlvblNjYWxpbmcgPSBGTDJGWENPTlNUX1NHTCgxLjBmIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICAgICAgICAgICBhbXBsaWZpY2F0aW9uU2NhbGluZyA9IEZMMkZYQ09OU1RfU0dMKDEuMGYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICAgICAgICAgIGdhaW5PZmZzZXQgPSAoRklYUF9TR0wpMDsKKyAgICBpZiAoaXNCb3gpIEZES3B1c2hGb3IoaEJzLCA3KTsgLyogcmVzZXJ2ZWQgKi8KKyAgICBnYWluU2NhbGluZ1ByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGlmIChnYWluU2NhbGluZ1ByZXNlbnQpIHsKKyAgICAgIGJzQXR0ZW51YXRpb25TY2FsaW5nID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICAgIGF0dGVudWF0aW9uU2NhbGluZyA9IChGSVhQX1NHTCkoCisgICAgICAgICAgYnNBdHRlbnVhdGlvblNjYWxpbmcKKyAgICAgICAgICA8PCAoRlJBQ1RfQklUUyAtIDEgLSAzIC0gMikpOyAvKiBic0F0dGVudWF0aW9uU2NhbGluZyAqIDAuMTI1OyAqLworICAgICAgYnNBbXBsaWZpY2F0aW9uU2NhbGluZyA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgICBhbXBsaWZpY2F0aW9uU2NhbGluZyA9IChGSVhQX1NHTCkoCisgICAgICAgICAgYnNBbXBsaWZpY2F0aW9uU2NhbGluZworICAgICAgICAgIDw8IChGUkFDVF9CSVRTIC0gMSAtIDMgLSAyKSk7IC8qIGJzQW1wbGlmaWNhdGlvblNjYWxpbmcgKiAwLjEyNTsgKi8KKyAgICB9CisgICAgaWYgKGlzQm94KSBGREtwdXNoRm9yKGhCcywgNyk7IC8qIHJlc2VydmVkICovCisgICAgZ2Fpbk9mZnNldFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGlmIChnYWluT2Zmc2V0UHJlc2VudCkgeworICAgICAgaWYgKGlzQm94KSBGREtwdXNoRm9yKGhCcywgMik7IC8qIHJlc2VydmVkICovCisgICAgICBzaWduID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICAgIGJzR2Fpbk9mZnNldCA9IEZES3JlYWRCaXRzKGhCcywgNSk7CisgICAgICBnYWluT2Zmc2V0ID0KKyAgICAgICAgICAoRklYUF9TR0wpKCgxICsgYnNHYWluT2Zmc2V0KSA8PCAoRlJBQ1RfQklUUyAtIDEgLSAyIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCkpOyAvKiAoMStic0dhaW5PZmZzZXQpICogMC4yNTsgKi8KKyAgICAgIGlmIChzaWduKSB7CisgICAgICAgIGdhaW5PZmZzZXQgPSAtZ2Fpbk9mZnNldDsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChiID0gMDsgYiA8IDQ7IGIrKykgeworICAgICAgcEdNb2RbYl0udGFyZ2V0Q2hhcmFjdGVyaXN0aWNMZWZ0UHJlc2VudCA9IDA7CisgICAgICBwR01vZFtiXS50YXJnZXRDaGFyYWN0ZXJpc3RpY1JpZ2h0UHJlc2VudCA9IDA7CisgICAgICBwR01vZFtiXS5nYWluU2NhbGluZ1ByZXNlbnQgPSBnYWluU2NhbGluZ1ByZXNlbnQ7CisgICAgICBwR01vZFtiXS5hdHRlbnVhdGlvblNjYWxpbmcgPSBhdHRlbnVhdGlvblNjYWxpbmc7CisgICAgICBwR01vZFtiXS5hbXBsaWZpY2F0aW9uU2NhbGluZyA9IGFtcGxpZmljYXRpb25TY2FsaW5nOworICAgICAgcEdNb2RbYl0uZ2Fpbk9mZnNldFByZXNlbnQgPSBnYWluT2Zmc2V0UHJlc2VudDsKKyAgICAgIHBHTW9kW2JdLmdhaW5PZmZzZXQgPSBnYWluT2Zmc2V0OworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBfcmVhZERyY0NoYXJhY3RlcmlzdGljKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgY29uc3QgaW50IHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSQ19DSEFSQUNURVJJU1RJQyogcERDaGFyLCBpbnQgaXNCb3gpIHsKKyAgaWYgKHZlcnNpb24gPT0gMCkgeworICAgIGlmIChpc0JveCkgRkRLcHVzaEZvcihoQnMsIDEpOyAvKiByZXNlcnZlZCAqLworICAgIHBEQ2hhci0+Y2ljcEluZGV4ID0gRkRLcmVhZEJpdHMoaEJzLCA3KTsKKyAgICBpZiAocERDaGFyLT5jaWNwSW5kZXggPiAwKSB7CisgICAgICBwRENoYXItPnByZXNlbnQgPSAxOworICAgICAgcERDaGFyLT5pc0NJQ1AgPSAxOworICAgIH0gZWxzZSB7CisgICAgICBwRENoYXItPnByZXNlbnQgPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwRENoYXItPnByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGlmIChpc0JveCkgcERDaGFyLT5pc0NJQ1AgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGlmIChwRENoYXItPnByZXNlbnQpIHsKKyAgICAgIGlmICghaXNCb3gpIHBEQ2hhci0+aXNDSUNQID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICAgIGlmIChwRENoYXItPmlzQ0lDUCkgeworICAgICAgICBpZiAoaXNCb3gpIEZES3B1c2hGb3IoaEJzLCAxKTsgLyogcmVzZXJ2ZWQgKi8KKyAgICAgICAgcERDaGFyLT5jaWNwSW5kZXggPSBGREtyZWFkQml0cyhoQnMsIDcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcERDaGFyLT5jdXN0b20ubGVmdCA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgICAgIHBEQ2hhci0+Y3VzdG9tLnJpZ2h0ID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgX3JlYWRCYW5kQm9yZGVyKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgQkFORF9CT1JERVIqIHBCQm9yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHJjQmFuZFR5cGUsIGludCBpc0JveCkgeworICBpZiAoZHJjQmFuZFR5cGUpIHsKKyAgICBpZiAoaXNCb3gpIEZES3B1c2hGb3IoaEJzLCA0KTsgLyogcmVzZXJ2ZWQgKi8KKyAgICBwQkJvcmQtPmNyb3Nzb3ZlckZyZXFJbmRleCA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgIH0gZWxzZSB7CisgICAgaWYgKGlzQm94KSBGREtwdXNoRm9yKGhCcywgNik7IC8qIHJlc2VydmVkICovCisgICAgcEJCb3JkLT5zdGFydFN1YkJhbmRJbmRleCA9IEZES3JlYWRCaXRzKGhCcywgMTApOworICB9Cit9CisKK3N0YXRpYyBEUkNfRVJST1IgX3JlYWRHYWluU2V0KEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgY29uc3QgaW50IHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGdhaW5TZXF1ZW5jZUluZGV4LCBHQUlOX1NFVCogcEdTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNCb3gpIHsKKyAgaWYgKGlzQm94KSBGREtwdXNoRm9yKGhCcywgMik7IC8qIHJlc2VydmVkICovCisgIHBHU2V0LT5nYWluQ29kaW5nUHJvZmlsZSA9IEZES3JlYWRCaXRzKGhCcywgMik7CisgIHBHU2V0LT5nYWluSW50ZXJwb2xhdGlvblR5cGUgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBwR1NldC0+ZnVsbEZyYW1lID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgcEdTZXQtPnRpbWVBbGlnbm1lbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBwR1NldC0+dGltZURlbHRhTWluUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisKKyAgaWYgKHBHU2V0LT50aW1lRGVsdGFNaW5QcmVzZW50KSB7CisgICAgaW50IGJzVGltZURlbHRhTWluOworICAgIGlmIChpc0JveCkgRkRLcHVzaEZvcihoQnMsIDUpOyAvKiByZXNlcnZlZCAqLworICAgIGJzVGltZURlbHRhTWluID0gRkRLcmVhZEJpdHMoaEJzLCAxMSk7CisgICAgcEdTZXQtPnRpbWVEZWx0YU1pbiA9IGJzVGltZURlbHRhTWluICsgMTsKKyAgfQorCisgIGlmIChwR1NldC0+Z2FpbkNvZGluZ1Byb2ZpbGUgIT0gR0NQX0NPTlNUQU5UKSB7CisgICAgaW50IGk7CisgICAgaWYgKGlzQm94KSBGREtwdXNoRm9yKGhCcywgMyk7IC8qIHJlc2VydmVkICovCisgICAgcEdTZXQtPmJhbmRDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgaWYgKHBHU2V0LT5iYW5kQ291bnQgPiA0KSByZXR1cm4gREVfTUVNT1JZX0VSUk9SOworCisgICAgaWYgKChwR1NldC0+YmFuZENvdW50ID4gMSkgfHwgaXNCb3gpIHsKKyAgICAgIHBHU2V0LT5kcmNCYW5kVHlwZSA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHBHU2V0LT5iYW5kQ291bnQ7IGkrKykgeworICAgICAgaWYgKHZlcnNpb24gPT0gMCkgeworICAgICAgICAqZ2FpblNlcXVlbmNlSW5kZXggPSAoKmdhaW5TZXF1ZW5jZUluZGV4KSArIDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgaW5kZXhQcmVzZW50OworICAgICAgICBpbmRleFByZXNlbnQgPSAoaXNCb3gpID8gMSA6IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICAgIGlmIChpbmRleFByZXNlbnQpIHsKKyAgICAgICAgICBpbnQgYnNJbmRleDsKKyAgICAgICAgICBic0luZGV4ID0gRkRLcmVhZEJpdHMoaEJzLCA2KTsKKyAgICAgICAgICAqZ2FpblNlcXVlbmNlSW5kZXggPSBic0luZGV4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpnYWluU2VxdWVuY2VJbmRleCA9ICgqZ2FpblNlcXVlbmNlSW5kZXgpICsgMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcEdTZXQtPmdhaW5TZXF1ZW5jZUluZGV4W2ldID0gKmdhaW5TZXF1ZW5jZUluZGV4OworICAgICAgX3JlYWREcmNDaGFyYWN0ZXJpc3RpYyhoQnMsIHZlcnNpb24sICYocEdTZXQtPmRyY0NoYXJhY3RlcmlzdGljW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNCb3gpOworICAgIH0KKyAgICBmb3IgKGkgPSAxOyBpIDwgcEdTZXQtPmJhbmRDb3VudDsgaSsrKSB7CisgICAgICBfcmVhZEJhbmRCb3JkZXIoaEJzLCAmKHBHU2V0LT5iYW5kQm9yZGVyW2ldKSwgcEdTZXQtPmRyY0JhbmRUeXBlLCBpc0JveCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHBHU2V0LT5iYW5kQ291bnQgPSAxOworICAgICpnYWluU2VxdWVuY2VJbmRleCA9ICgqZ2FpblNlcXVlbmNlSW5kZXgpICsgMTsKKyAgICBwR1NldC0+Z2FpblNlcXVlbmNlSW5kZXhbMF0gPSAqZ2FpblNlcXVlbmNlSW5kZXg7CisgIH0KKworICByZXR1cm4gREVfT0s7Cit9CisKK3N0YXRpYyBEUkNfRVJST1IgX3JlYWRDdXN0b21EcmNDaGFyYWN0ZXJpc3RpYyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBUkFDVEVSSVNUSUNfU0lERSBzaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSKiBwQ2hhcmFjdGVyaXN0aWNGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VTVE9NX0RSQ19DSEFSKiBwQ0NoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzQm94KSB7CisgIGlmIChpc0JveCkgRkRLcHVzaEZvcihoQnMsIDcpOyAvKiByZXNlcnZlZCAqLworICAqcENoYXJhY3RlcmlzdGljRm9ybWF0ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgaWYgKCpwQ2hhcmFjdGVyaXN0aWNGb3JtYXQgPT0gQ0ZfU0lHTU9JRCkgeworICAgIGludCBic0dhaW4sIGJzSW9SYXRpbywgYnNFeHA7CisgICAgaWYgKGlzQm94KSBGREtwdXNoRm9yKGhCcywgMSk7IC8qIHJlc2VydmVkICovCisgICAgYnNHYWluID0gRkRLcmVhZEJpdHMoaEJzLCA2KTsKKyAgICBpZiAoc2lkZSA9PSBDU19MRUZUKSB7CisgICAgICBwQ0NoYXItPnNpZ21vaWQuZ2FpbiA9IChGSVhQX1NHTCkoYnNHYWluIDw8IChGUkFDVF9CSVRTIC0gMSAtIDYpKTsKKyAgICB9IGVsc2UgeworICAgICAgcENDaGFyLT5zaWdtb2lkLmdhaW4gPSAoRklYUF9TR0wpKC1ic0dhaW4gPDwgKEZSQUNUX0JJVFMgLSAxIC0gNikpOworICAgIH0KKyAgICBic0lvUmF0aW8gPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgIC8qIHBDQ2hhci0+c2lnbW9pZC5pb1JhdGlvID0gMC4wNSArIDAuMTUgKiBic0lvUmF0aW87ICovCisgICAgcENDaGFyLT5zaWdtb2lkLmlvUmF0aW8gPQorICAgICAgICBGTDJGWENPTlNUX1NHTCgwLjA1ZiAvIChmbG9hdCkoMSA8PCAyKSkgKworICAgICAgICAoRklYUF9TR0wpKCgoKDMgKiBic0lvUmF0aW8pIDw8IChGUkFDVF9CSVRTIC0gMSkpIC8gNSkgPj4gNCk7CisgICAgYnNFeHAgPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgIGlmIChic0V4cCA8IDE1KSB7CisgICAgICBwQ0NoYXItPnNpZ21vaWQuZXhwID0gKEZJWFBfU0dMKSgoMSArIDIgKiBic0V4cCkgPDwgKEZSQUNUX0JJVFMgLSAxIC0gNSkpOworICAgIH0gZWxzZSB7CisgICAgICBwQ0NoYXItPnNpZ21vaWQuZXhwID0gKEZJWFBfU0dMKU1BWFZBTF9TR0w7IC8qIHJlcHJlc2VudHMgaW5maW5pdHkgKi8KKyAgICB9CisgICAgcENDaGFyLT5zaWdtb2lkLmZsaXBTaWduID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgfSBlbHNlIHsgLyogQ0ZfTk9ERVMgKi8KKyAgICBpbnQgaSwgYnNDaGFyYWN0ZXJpc3RpY05vZGVDb3VudCwgYnNOb2RlTGV2ZWxEZWx0YSwgYnNOb2RlR2FpbjsKKyAgICBpZiAoaXNCb3gpIEZES3B1c2hGb3IoaEJzLCA2KTsgLyogcmVzZXJ2ZWQgKi8KKyAgICBic0NoYXJhY3RlcmlzdGljTm9kZUNvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsKKyAgICBwQ0NoYXItPm5vZGVzLmNoYXJhY3RlcmlzdGljTm9kZUNvdW50ID0gYnNDaGFyYWN0ZXJpc3RpY05vZGVDb3VudCArIDE7CisgICAgaWYgKHBDQ2hhci0+bm9kZXMuY2hhcmFjdGVyaXN0aWNOb2RlQ291bnQgPiA0KSByZXR1cm4gREVfTUVNT1JZX0VSUk9SOworICAgIHBDQ2hhci0+bm9kZXMubm9kZUxldmVsWzBdID0gRFJDX0lOUFVUX0xPVURORVNTX1RBUkdFVF9TR0w7CisgICAgcENDaGFyLT5ub2Rlcy5ub2RlR2FpblswXSA9IChGSVhQX1NHTCkwOworICAgIGZvciAoaSA9IDA7IGkgPCBwQ0NoYXItPm5vZGVzLmNoYXJhY3RlcmlzdGljTm9kZUNvdW50OyBpKyspIHsKKyAgICAgIGlmIChpc0JveCkgRkRLcHVzaEZvcihoQnMsIDMpOyAvKiByZXNlcnZlZCAqLworICAgICAgYnNOb2RlTGV2ZWxEZWx0YSA9IEZES3JlYWRCaXRzKGhCcywgNSk7CisgICAgICBpZiAoc2lkZSA9PSBDU19MRUZUKSB7CisgICAgICAgIHBDQ2hhci0+bm9kZXMubm9kZUxldmVsW2kgKyAxXSA9CisgICAgICAgICAgICBwQ0NoYXItPm5vZGVzLm5vZGVMZXZlbFtpXSAtCisgICAgICAgICAgICAoRklYUF9TR0wpKCgxICsgYnNOb2RlTGV2ZWxEZWx0YSkgPDwgKEZSQUNUX0JJVFMgLSAxIC0gNykpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcENDaGFyLT5ub2Rlcy5ub2RlTGV2ZWxbaSArIDFdID0KKyAgICAgICAgICAgIHBDQ2hhci0+bm9kZXMubm9kZUxldmVsW2ldICsKKyAgICAgICAgICAgIChGSVhQX1NHTCkoKDEgKyBic05vZGVMZXZlbERlbHRhKSA8PCAoRlJBQ1RfQklUUyAtIDEgLSA3KSk7CisgICAgICB9CisgICAgICBic05vZGVHYWluID0gRkRLcmVhZEJpdHMoaEJzLCA4KTsKKyAgICAgIHBDQ2hhci0+bm9kZXMubm9kZUdhaW5baSArIDFdID0gKEZJWFBfU0dMKSgKKyAgICAgICAgICAoYnNOb2RlR2FpbiAtIDEyOCkKKyAgICAgICAgICA8PCAoRlJBQ1RfQklUUyAtIDEgLSAxIC0gNykpOyAvKiAwLjVmICogYnNOb2RlR2FpbiAtIDY0LjBmOyAqLworICAgIH0KKyAgfQorICByZXR1cm4gREVfT0s7Cit9CisKK3N0YXRpYyB2b2lkIF9za2lwTG91ZEVxSW5zdHJ1Y3Rpb25zKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcykgeworICBpbnQgaTsKKyAgaW50IGRvd25taXhJZFByZXNlbnQsIGFkZGl0aW9uYWxEb3dubWl4SWRQcmVzZW50LAorICAgICAgYWRkaXRpb25hbERvd25taXhJZENvdW50ID0gMDsKKyAgaW50IGRyY1NldElkUHJlc2VudCwgYWRkaXRpb25hbERyY1NldElkUHJlc2VudCwgYWRkaXRpb25hbERyY1NldElkQ291bnQgPSAwOworICBpbnQgZXFTZXRJZFByZXNlbnQsIGFkZGl0aW9uYWxFcVNldElkUHJlc2VudCwgYWRkaXRpb25hbEVxU2V0SWRDb3VudCA9IDA7CisgIGludCBsb3VkRXFHYWluU2VxdWVuY2VDb3VudCwgZHJjQ2hhcmFjdGVyaXN0aWNGb3JtYXRJc0NJQ1A7CisKKyAgRkRLcHVzaEZvcihoQnMsIDQpOyAvKiBsb3VkRXFTZXRJZCAqLworICBGREtwdXNoRm9yKGhCcywgNCk7IC8qIGRyY0xvY2F0aW9uICovCisgIGRvd25taXhJZFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBpZiAoZG93bm1peElkUHJlc2VudCkgeworICAgIEZES3B1c2hGb3IoaEJzLCA3KTsgLyogZG93bm1peElkICovCisgICAgYWRkaXRpb25hbERvd25taXhJZFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGlmIChhZGRpdGlvbmFsRG93bm1peElkUHJlc2VudCkgeworICAgICAgYWRkaXRpb25hbERvd25taXhJZENvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA3KTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhZGRpdGlvbmFsRG93bm1peElkQ291bnQ7IGkrKykgeworICAgICAgICBGREtwdXNoRm9yKGhCcywgNyk7IC8qIGFkZGl0aW9uYWxEb3dubWl4SWQgKi8KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBkcmNTZXRJZFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBpZiAoZHJjU2V0SWRQcmVzZW50KSB7CisgICAgRkRLcHVzaEZvcihoQnMsIDYpOyAvKiBkcmNTZXRJZCAqLworICAgIGFkZGl0aW9uYWxEcmNTZXRJZFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGlmIChhZGRpdGlvbmFsRHJjU2V0SWRQcmVzZW50KSB7CisgICAgICBhZGRpdGlvbmFsRHJjU2V0SWRDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgYWRkaXRpb25hbERyY1NldElkQ291bnQ7IGkrKykgeworICAgICAgICBGREtwdXNoRm9yKGhCcywgNik7IC8qIGFkZGl0aW9uYWxEcmNTZXRJZDsgKi8KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBlcVNldElkUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIGlmIChlcVNldElkUHJlc2VudCkgeworICAgIEZES3B1c2hGb3IoaEJzLCA2KTsgLyogZXFTZXRJZCAqLworICAgIGFkZGl0aW9uYWxFcVNldElkUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgaWYgKGFkZGl0aW9uYWxFcVNldElkUHJlc2VudCkgeworICAgICAgYWRkaXRpb25hbEVxU2V0SWRDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgYWRkaXRpb25hbEVxU2V0SWRDb3VudDsgaSsrKSB7CisgICAgICAgIEZES3B1c2hGb3IoaEJzLCA2KTsgLyogYWRkaXRpb25hbEVxU2V0SWQ7ICovCisgICAgICB9CisgICAgfQorICB9CisKKyAgRkRLcHVzaEZvcihoQnMsIDEpOyAvKiBsb3VkbmVzc0FmdGVyRHJjICovCisgIEZES3B1c2hGb3IoaEJzLCAxKTsgLyogbG91ZG5lc3NBZnRlckVxICovCisgIGxvdWRFcUdhaW5TZXF1ZW5jZUNvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA2KTsKKyAgZm9yIChpID0gMDsgaSA8IGxvdWRFcUdhaW5TZXF1ZW5jZUNvdW50OyBpKyspIHsKKyAgICBGREtwdXNoRm9yKGhCcywgNik7IC8qIGdhaW5TZXF1ZW5jZUluZGV4ICovCisgICAgZHJjQ2hhcmFjdGVyaXN0aWNGb3JtYXRJc0NJQ1AgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGlmIChkcmNDaGFyYWN0ZXJpc3RpY0Zvcm1hdElzQ0lDUCkgeworICAgICAgRkRLcHVzaEZvcihoQnMsIDcpOyAvKiBkcmNDaGFyYWN0ZXJpc3RpYyAqLworICAgIH0gZWxzZSB7CisgICAgICBGREtwdXNoRm9yKGhCcywgNCk7IC8qIGRyY0NoYXJhY3RlcmlzdGljTGVmdEluZGV4ICovCisgICAgICBGREtwdXNoRm9yKGhCcywgNCk7IC8qIGRyY0NoYXJhY3RlcmlzdGljUmlnaHRJbmRleCAqLworICAgIH0KKyAgICBGREtwdXNoRm9yKGhCcywgNik7IC8qIGZyZXF1ZW5jeVJhbmdlSW5kZXggKi8KKyAgICBGREtwdXNoRm9yKGhCcywgMyk7IC8qIGJzTG91ZEVxU2NhbGluZyAqLworICAgIEZES3B1c2hGb3IoaEJzLCA1KTsgLyogYnNMb3VkRXFPZmZzZXQgKi8KKyAgfQorfQorCitzdGF0aWMgdm9pZCBfc2tpcEVxU3ViYmFuZEdhaW5TcGxpbmUoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzKSB7CisgIGludCBuRXFOb2RlcywgaywgYml0czsKKyAgbkVxTm9kZXMgPSBGREtyZWFkQml0cyhoQnMsIDUpOworICBuRXFOb2RlcyArPSAyOworICBmb3IgKGsgPSAwOyBrIDwgbkVxTm9kZXM7IGsrKykgeworICAgIGJpdHMgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGlmICghYml0cykgeworICAgICAgRkRLcHVzaEZvcihoQnMsIDQpOworICAgIH0KKyAgfQorICBGREtwdXNoRm9yKGhCcywgNCAqIChuRXFOb2RlcyAtIDEpKTsKKyAgYml0cyA9IEZES3JlYWRCaXRzKGhCcywgMik7CisgIHN3aXRjaCAoYml0cykgeworICAgIGNhc2UgMDoKKyAgICAgIEZES3B1c2hGb3IoaEJzLCA1KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgICBGREtwdXNoRm9yKGhCcywgNCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBGREtwdXNoRm9yKGhCcywgMyk7CisgICAgICBicmVhazsKKyAgfQorICBGREtwdXNoRm9yKGhCcywgNSAqIChuRXFOb2RlcyAtIDEpKTsKK30KKworc3RhdGljIHZvaWQgX3NraXBFcUNvZWZmaWNpZW50cyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMpIHsKKyAgaW50IGosIGs7CisgIGludCBlcURlbGF5TWF4UHJlc2VudDsKKyAgaW50IHVuaXF1ZUZpbHRlckJsb2NrQ291bnQsIGZpbHRlckVsZW1lbnRDb3VudCwgZmlsdGVyRWxlbWVudEdhaW5QcmVzZW50OworICBpbnQgdW5pcXVlVGRGaWx0ZXJFbGVtZW50Q291bnQsIGVxRmlsdGVyRm9ybWF0LCBic1JlYWxaZXJvUmFkaXVzT25lQ291bnQsCisgICAgICByZWFsWmVyb0NvdW50LCBnZW5lcmljWmVyb0NvdW50LCByZWFsUG9sZUNvdW50LCBjb21wbGV4UG9sZUNvdW50LAorICAgICAgZmlyRmlsdGVyT3JkZXI7CisgIGludCB1bmlxdWVFcVN1YmJhbmRHYWluc0NvdW50LCBlcVN1YmJhbmRHYWluUmVwcmVzZW50YXRpb24sCisgICAgICBlcVN1YmJhbmRHYWluQ291bnQ7CisgIEVRX1NVQkJBTkRfR0FJTl9GT1JNQVQgZXFTdWJiYW5kR2FpbkZvcm1hdDsKKworICBlcURlbGF5TWF4UHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIGlmIChlcURlbGF5TWF4UHJlc2VudCkgeworICAgIEZES3B1c2hGb3IoaEJzLCA4KTsgLyogYnNFcURlbGF5TWF4ICovCisgIH0KKworICB1bmlxdWVGaWx0ZXJCbG9ja0NvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA2KTsKKyAgZm9yIChqID0gMDsgaiA8IHVuaXF1ZUZpbHRlckJsb2NrQ291bnQ7IGorKykgeworICAgIGZpbHRlckVsZW1lbnRDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNik7CisgICAgZm9yIChrID0gMDsgayA8IGZpbHRlckVsZW1lbnRDb3VudDsgaysrKSB7CisgICAgICBGREtwdXNoRm9yKGhCcywgNik7IC8qIGZpbHRlckVsZW1lbnRJbmRleCAqLworICAgICAgZmlsdGVyRWxlbWVudEdhaW5QcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICAgIGlmIChmaWx0ZXJFbGVtZW50R2FpblByZXNlbnQpIHsKKyAgICAgICAgRkRLcHVzaEZvcihoQnMsIDEwKTsgLyogYnNGaWx0ZXJFbGVtZW50R2FpbiAqLworICAgICAgfQorICAgIH0KKyAgfQorICB1bmlxdWVUZEZpbHRlckVsZW1lbnRDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNik7CisgIGZvciAoaiA9IDA7IGogPCB1bmlxdWVUZEZpbHRlckVsZW1lbnRDb3VudDsgaisrKSB7CisgICAgZXFGaWx0ZXJGb3JtYXQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGlmIChlcUZpbHRlckZvcm1hdCA9PSAwKSB7IC8qIHBvbGUvemVybyAqLworICAgICAgYnNSZWFsWmVyb1JhZGl1c09uZUNvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKKyAgICAgIHJlYWxaZXJvQ291bnQgPSBGREtyZWFkQml0cyhoQnMsIDYpOworICAgICAgZ2VuZXJpY1plcm9Db3VudCA9IEZES3JlYWRCaXRzKGhCcywgNik7CisgICAgICByZWFsUG9sZUNvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICAgIGNvbXBsZXhQb2xlQ291bnQgPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgICAgRkRLcHVzaEZvcihoQnMsIDIgKiBic1JlYWxaZXJvUmFkaXVzT25lQ291bnQgKiAxKTsKKyAgICAgIEZES3B1c2hGb3IoaEJzLCByZWFsWmVyb0NvdW50ICogOCk7CisgICAgICBGREtwdXNoRm9yKGhCcywgZ2VuZXJpY1plcm9Db3VudCAqIDE0KTsKKyAgICAgIEZES3B1c2hGb3IoaEJzLCByZWFsUG9sZUNvdW50ICogOCk7CisgICAgICBGREtwdXNoRm9yKGhCcywgY29tcGxleFBvbGVDb3VudCAqIDE0KTsKKyAgICB9IGVsc2UgeyAvKiBGSVIgY29lZmZpY2llbnRzICovCisgICAgICBmaXJGaWx0ZXJPcmRlciA9IEZES3JlYWRCaXRzKGhCcywgNyk7CisgICAgICBGREtwdXNoRm9yKGhCcywgMSk7CisgICAgICBGREtwdXNoRm9yKGhCcywgKGZpckZpbHRlck9yZGVyIC8gMiArIDEpICogMTEpOworICAgIH0KKyAgfQorICB1bmlxdWVFcVN1YmJhbmRHYWluc0NvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA2KTsKKyAgaWYgKHVuaXF1ZUVxU3ViYmFuZEdhaW5zQ291bnQgPiAwKSB7CisgICAgZXFTdWJiYW5kR2FpblJlcHJlc2VudGF0aW9uID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICBlcVN1YmJhbmRHYWluRm9ybWF0ID0gKEVRX1NVQkJBTkRfR0FJTl9GT1JNQVQpRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICBzd2l0Y2ggKGVxU3ViYmFuZEdhaW5Gb3JtYXQpIHsKKyAgICAgIGNhc2UgR0ZfUU1GMzI6CisgICAgICAgIGVxU3ViYmFuZEdhaW5Db3VudCA9IDMyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0ZfUU1GSFlCUklEMzk6CisgICAgICAgIGVxU3ViYmFuZEdhaW5Db3VudCA9IDM5OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0ZfUU1GNjQ6CisgICAgICAgIGVxU3ViYmFuZEdhaW5Db3VudCA9IDY0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0ZfUU1GSFlCUklENzE6CisgICAgICAgIGVxU3ViYmFuZEdhaW5Db3VudCA9IDcxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0ZfUU1GMTI4OgorICAgICAgICBlcVN1YmJhbmRHYWluQ291bnQgPSAxMjg7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHRl9RTUZIWUJSSUQxMzU6CisgICAgICAgIGVxU3ViYmFuZEdhaW5Db3VudCA9IDEzNTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdGX1VOSUZPUk06CisgICAgICBkZWZhdWx0OgorICAgICAgICBlcVN1YmJhbmRHYWluQ291bnQgPSBGREtyZWFkQml0cyhoQnMsIDgpOworICAgICAgICBlcVN1YmJhbmRHYWluQ291bnQrKzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGZvciAoayA9IDA7IGsgPCB1bmlxdWVFcVN1YmJhbmRHYWluc0NvdW50OyBrKyspIHsKKyAgICAgIGlmIChlcVN1YmJhbmRHYWluUmVwcmVzZW50YXRpb24gPT0gMSkgeworICAgICAgICBfc2tpcEVxU3ViYmFuZEdhaW5TcGxpbmUoaEJzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZES3B1c2hGb3IoaEJzLCBlcVN1YmJhbmRHYWluQ291bnQgKiA5KTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgX3NraXBUZEZpbHRlckNhc2NhZGUoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGVxQ2hhbm5lbEdyb3VwQ291bnQpIHsKKyAgaW50IGksIGVxQ2FzY2FkZUdhaW5QcmVzZW50LCBmaWx0ZXJCbG9ja0NvdW50LCBlcVBoYXNlQWxpZ25tZW50UHJlc2VudDsKKyAgZm9yIChpID0gMDsgaSA8IGVxQ2hhbm5lbEdyb3VwQ291bnQ7IGkrKykgeworICAgIGVxQ2FzY2FkZUdhaW5QcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICBpZiAoZXFDYXNjYWRlR2FpblByZXNlbnQpIHsKKyAgICAgIEZES3B1c2hGb3IoaEJzLCAxMCk7IC8qIGJzRXFDYXNjYWRlR2FpbiAqLworICAgIH0KKyAgICBmaWx0ZXJCbG9ja0NvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICBGREtwdXNoRm9yKGhCcywgZmlsdGVyQmxvY2tDb3VudCAqIDcpOyAvKiBmaWx0ZXJCbG9ja0luZGV4ICovCisgIH0KKyAgZXFQaGFzZUFsaWdubWVudFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICB7CisgICAgaWYgKGVxUGhhc2VBbGlnbm1lbnRQcmVzZW50KSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgZXFDaGFubmVsR3JvdXBDb3VudDsgaSsrKSB7CisgICAgICAgIEZES3B1c2hGb3IoaEJzLCAoZXFDaGFubmVsR3JvdXBDb3VudCAtIGkgLSAxKSAqIDEpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgRFJDX0VSUk9SIF9za2lwRXFJbnN0cnVjdGlvbnMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnKSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgaW50IGMsIGksIGssIGNoYW5uZWxDb3VudDsKKyAgaW50IGRvd25taXhJZFByZXNlbnQsIGRvd25taXhJZCwgZXFBcHBseVRvRG93bm1peCwgYWRkaXRpb25hbERvd25taXhJZFByZXNlbnQsCisgICAgICBhZGRpdGlvbmFsRG93bm1peElkQ291bnQgPSAwOworICBpbnQgYWRkaXRpb25hbERyY1NldElkUHJlc2VudCwgYWRkaXRpb25hbERyY1NldElkQ291bnQ7CisgIGludCBkZXBlbmRzT25FcVNldFByZXNlbnQsIGVxQ2hhbm5lbEdyb3VwQ291bnQsIHRkRmlsdGVyQ2FzY2FkZVByZXNlbnQsCisgICAgICBzdWJiYW5kR2FpbnNQcmVzZW50LCBlcVRyYW5zaXRpb25EdXJhdGlvblByZXNlbnQ7CisKKyAgRkRLcHVzaEZvcihoQnMsIDYpOyAvKiBlcVNldElkICovCisgIEZES3B1c2hGb3IoaEJzLCA0KTsgLyogZXFTZXRDb21wbGV4aXR5TGV2ZWwgKi8KKyAgZG93bm1peElkUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIGlmIChkb3dubWl4SWRQcmVzZW50KSB7CisgICAgZG93bm1peElkID0gRkRLcmVhZEJpdHMoaEJzLCA3KTsKKyAgICBlcUFwcGx5VG9Eb3dubWl4ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICBhZGRpdGlvbmFsRG93bm1peElkUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgaWYgKGFkZGl0aW9uYWxEb3dubWl4SWRQcmVzZW50KSB7CisgICAgICBhZGRpdGlvbmFsRG93bm1peElkQ291bnQgPSBGREtyZWFkQml0cyhoQnMsIDcpOworICAgICAgRkRLcHVzaEZvcihoQnMsIGFkZGl0aW9uYWxEb3dubWl4SWRDb3VudCAqIDcpOyAvKiBhZGRpdGlvbmFsRG93bm1peElkICovCisgICAgfQorICB9IGVsc2UgeworICAgIGRvd25taXhJZCA9IDA7CisgICAgZXFBcHBseVRvRG93bm1peCA9IDA7CisgIH0KKyAgRkRLcHVzaEZvcihoQnMsIDYpOyAvKiBkcmNTZXRJZCAqLworICBhZGRpdGlvbmFsRHJjU2V0SWRQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgaWYgKGFkZGl0aW9uYWxEcmNTZXRJZFByZXNlbnQpIHsKKyAgICBhZGRpdGlvbmFsRHJjU2V0SWRDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNik7CisgICAgZm9yIChpID0gMDsgaSA8IGFkZGl0aW9uYWxEcmNTZXRJZENvdW50OyBpKyspIHsKKyAgICAgIEZES3B1c2hGb3IoaEJzLCA2KTsgLyogYWRkaXRpb25hbERyY1NldElkICovCisgICAgfQorICB9CisgIEZES3B1c2hGb3IoaEJzLCAxNik7IC8qIGVxU2V0UHVycG9zZSAqLworICBkZXBlbmRzT25FcVNldFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBpZiAoZGVwZW5kc09uRXFTZXRQcmVzZW50KSB7CisgICAgRkRLcHVzaEZvcihoQnMsIDYpOyAvKiBkZXBlbmRzT25FcVNldCAqLworICB9IGVsc2UgeworICAgIEZES3B1c2hGb3IoaEJzLCAxKTsgLyogbm9JbmRlcGVuZGVudEVxVXNlICovCisgIH0KKworICBjaGFubmVsQ291bnQgPSBoVW5pRHJjQ29uZmlnLT5jaGFubmVsTGF5b3V0LmJhc2VDaGFubmVsQ291bnQ7CisgIGlmICgoZG93bm1peElkUHJlc2VudCA9PSAxKSAmJiAoZXFBcHBseVRvRG93bm1peCA9PSAxKSAmJiAoZG93bm1peElkICE9IDApICYmCisgICAgICAoZG93bm1peElkICE9IERPV05NSVhfSURfQU5ZX0RPV05NSVgpICYmCisgICAgICAoYWRkaXRpb25hbERvd25taXhJZENvdW50ID09IDApKSB7CisgICAgRE9XTk1JWF9JTlNUUlVDVElPTlMqIHBEb3duID0KKyAgICAgICAgc2VsZWN0RG93bm1peEluc3RydWN0aW9ucyhoVW5pRHJjQ29uZmlnLCBkb3dubWl4SWQpOworICAgIGlmIChwRG93biA9PSBOVUxMKSByZXR1cm4gREVfTk9UX09LOworCisgICAgY2hhbm5lbENvdW50ID0KKyAgICAgICAgcERvd24tPnRhcmdldENoYW5uZWxDb3VudDsgLyogdGFyZ2V0Q2hhbm5lbENvdW50RnJvbURvd25taXhJZCovCisgIH0gZWxzZSBpZiAoKGRvd25taXhJZCA9PSBET1dOTUlYX0lEX0FOWV9ET1dOTUlYKSB8fAorICAgICAgICAgICAgIChhZGRpdGlvbmFsRG93bm1peElkQ291bnQgPiAxKSkgeworICAgIGNoYW5uZWxDb3VudCA9IDE7CisgIH0KKworICBlcUNoYW5uZWxHcm91cENvdW50ID0gMDsKKyAgZm9yIChjID0gMDsgYyA8IGNoYW5uZWxDb3VudDsgYysrKSB7CisgICAgVUNIQVIgZXFDaGFubmVsR3JvdXBGb3JDaGFubmVsWzhdOworICAgIGludCBuZXdHcm91cCA9IDE7CisgICAgaWYgKGMgPj0gOCkgcmV0dXJuIERFX01FTU9SWV9FUlJPUjsKKyAgICBlcUNoYW5uZWxHcm91cEZvckNoYW5uZWxbY10gPSBGREtyZWFkQml0cyhoQnMsIDcpOworICAgIGZvciAoayA9IDA7IGsgPCBjOyBrKyspIHsKKyAgICAgIGlmIChlcUNoYW5uZWxHcm91cEZvckNoYW5uZWxbY10gPT0gZXFDaGFubmVsR3JvdXBGb3JDaGFubmVsW2tdKSB7CisgICAgICAgIG5ld0dyb3VwID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG5ld0dyb3VwID09IDEpIHsKKyAgICAgIGVxQ2hhbm5lbEdyb3VwQ291bnQgKz0gMTsKKyAgICB9CisgIH0KKyAgdGRGaWx0ZXJDYXNjYWRlUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIGlmICh0ZEZpbHRlckNhc2NhZGVQcmVzZW50KSB7CisgICAgX3NraXBUZEZpbHRlckNhc2NhZGUoaEJzLCBlcUNoYW5uZWxHcm91cENvdW50KTsKKyAgfQorICBzdWJiYW5kR2FpbnNQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgaWYgKHN1YmJhbmRHYWluc1ByZXNlbnQpIHsKKyAgICBGREtwdXNoRm9yKGhCcywgZXFDaGFubmVsR3JvdXBDb3VudCAqIDYpOyAvKiBzdWJiYW5kR2FpbnNJbmRleCAqLworICB9CisgIGVxVHJhbnNpdGlvbkR1cmF0aW9uUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIGlmIChlcVRyYW5zaXRpb25EdXJhdGlvblByZXNlbnQpIHsKKyAgICBGREtwdXNoRm9yKGhCcywgNSk7IC8qIGJzRXFUcmFuc2l0aW9uRHVyYXRpb24gKi8KKyAgfQorICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfc2tpcERyY0NvZWZmaWNpZW50c0Jhc2ljKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcykgeworICBGREtwdXNoRm9yKGhCcywgNCk7IC8qIGRyY0xvY2F0aW9uICovCisgIEZES3B1c2hGb3IoaEJzLCA3KTsgLyogZHJjQ2hhcmFjdGVyaXN0aWMgKi8KK30KKworc3RhdGljIERSQ19FUlJPUiBfcmVhZERyY0NvZWZmaWNpZW50c1VuaURyYyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUkNfQ09FRkZJQ0lFTlRTX1VOSV9EUkMqIHBDb2VmKSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgaW50IGksIGJzRHJjRnJhbWVTaXplOworICBpbnQgZ2FpblNlcXVlbmNlSW5kZXggPSAtMTsKKworICBwQ29lZi0+ZHJjTG9jYXRpb24gPSBGREtyZWFkQml0cyhoQnMsIDQpOworICBwQ29lZi0+ZHJjRnJhbWVTaXplUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisKKyAgaWYgKHBDb2VmLT5kcmNGcmFtZVNpemVQcmVzZW50ID09IDEpIHsKKyAgICBic0RyY0ZyYW1lU2l6ZSA9IEZES3JlYWRCaXRzKGhCcywgMTUpOworICAgIHBDb2VmLT5kcmNGcmFtZVNpemUgPSBic0RyY0ZyYW1lU2l6ZSArIDE7CisgIH0KKyAgaWYgKHZlcnNpb24gPT0gMCkgeworICAgIGludCBnYWluU2VxdWVuY2VDb3VudCA9IDAsIGdhaW5TZXRDb3VudDsKKyAgICBwQ29lZi0+Y2hhcmFjdGVyaXN0aWNMZWZ0Q291bnQgPSAwOworICAgIHBDb2VmLT5jaGFyYWN0ZXJpc3RpY1JpZ2h0Q291bnQgPSAwOworICAgIGdhaW5TZXRDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNik7CisgICAgcENvZWYtPmdhaW5TZXRDb3VudCA9IGZNaW4oZ2FpblNldENvdW50LCAxMik7CisgICAgZm9yIChpID0gMDsgaSA8IGdhaW5TZXRDb3VudDsgaSsrKSB7CisgICAgICBHQUlOX1NFVCB0bXBHc2V0OworICAgICAgRkRLbWVtY2xlYXIoJnRtcEdzZXQsIHNpemVvZihHQUlOX1NFVCkpOworICAgICAgZXJyID0gX3JlYWRHYWluU2V0KGhCcywgdmVyc2lvbiwgJmdhaW5TZXF1ZW5jZUluZGV4LCAmdG1wR3NldCwgMCk7CisgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgICAgZ2FpblNlcXVlbmNlQ291bnQgKz0gdG1wR3NldC5iYW5kQ291bnQ7CisKKyAgICAgIGlmIChpID49IDEyKSBjb250aW51ZTsKKyAgICAgIHBDb2VmLT5nYWluU2V0W2ldID0gdG1wR3NldDsKKyAgICB9CisgICAgcENvZWYtPmdhaW5TZXF1ZW5jZUNvdW50ID0gZ2FpblNlcXVlbmNlQ291bnQ7CisgIH0gZWxzZSB7IC8qICh2ZXJzaW9uID09IDEpICovCisgICAgVUNIQVIgZHJjQ2hhcmFjdGVyaXN0aWNMZWZ0UHJlc2VudCwgZHJjQ2hhcmFjdGVyaXN0aWNSaWdodFByZXNlbnQ7CisgICAgVUNIQVIgc2hhcGVGaWx0ZXJzUHJlc2VudCwgc2hhcGVGaWx0ZXJDb3VudCwgdG1wUHJlc2VudDsKKyAgICBpbnQgZ2FpblNldENvdW50OworICAgIGRyY0NoYXJhY3RlcmlzdGljTGVmdFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGlmIChkcmNDaGFyYWN0ZXJpc3RpY0xlZnRQcmVzZW50KSB7CisgICAgICBwQ29lZi0+Y2hhcmFjdGVyaXN0aWNMZWZ0Q291bnQgPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgICAgaWYgKChwQ29lZi0+Y2hhcmFjdGVyaXN0aWNMZWZ0Q291bnQgKyAxKSA+IDgpIHJldHVybiBERV9NRU1PUllfRVJST1I7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgcENvZWYtPmNoYXJhY3RlcmlzdGljTGVmdENvdW50OyBpKyspIHsKKyAgICAgICAgZXJyID0gX3JlYWRDdXN0b21EcmNDaGFyYWN0ZXJpc3RpYygKKyAgICAgICAgICAgIGhCcywgQ1NfTEVGVCwgJihwQ29lZi0+Y2hhcmFjdGVyaXN0aWNMZWZ0Rm9ybWF0W2kgKyAxXSksCisgICAgICAgICAgICAmKHBDb2VmLT5jdXN0b21DaGFyYWN0ZXJpc3RpY0xlZnRbaSArIDFdKSwgMCk7CisgICAgICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgICAgICB9CisgICAgfQorICAgIGRyY0NoYXJhY3RlcmlzdGljUmlnaHRQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICBpZiAoZHJjQ2hhcmFjdGVyaXN0aWNSaWdodFByZXNlbnQpIHsKKyAgICAgIHBDb2VmLT5jaGFyYWN0ZXJpc3RpY1JpZ2h0Q291bnQgPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgICAgaWYgKChwQ29lZi0+Y2hhcmFjdGVyaXN0aWNSaWdodENvdW50ICsgMSkgPiA4KSByZXR1cm4gREVfTUVNT1JZX0VSUk9SOworICAgICAgZm9yIChpID0gMDsgaSA8IHBDb2VmLT5jaGFyYWN0ZXJpc3RpY1JpZ2h0Q291bnQ7IGkrKykgeworICAgICAgICBlcnIgPSBfcmVhZEN1c3RvbURyY0NoYXJhY3RlcmlzdGljKAorICAgICAgICAgICAgaEJzLCBDU19SSUdIVCwgJihwQ29lZi0+Y2hhcmFjdGVyaXN0aWNSaWdodEZvcm1hdFtpICsgMV0pLAorICAgICAgICAgICAgJihwQ29lZi0+Y3VzdG9tQ2hhcmFjdGVyaXN0aWNSaWdodFtpICsgMV0pLCAwKTsKKyAgICAgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgICAgIH0KKyAgICB9CisgICAgc2hhcGVGaWx0ZXJzUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgaWYgKHNoYXBlRmlsdGVyc1ByZXNlbnQpIHsKKyAgICAgIHNoYXBlRmlsdGVyQ291bnQgPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgICAgZm9yIChpID0gMDsgaSA8IHNoYXBlRmlsdGVyQ291bnQ7IGkrKykgeworICAgICAgICB0bXBQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICAgICAgaWYgKHRtcFByZXNlbnQpIC8qIGxmQ3V0UGFyYW1zICovCisgICAgICAgICAgRkRLcHVzaEZvcihoQnMsIDUpOworCisgICAgICAgIHRtcFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgICBpZiAodG1wUHJlc2VudCkgLyogbGZCb29zdFBhcmFtcyAqLworICAgICAgICAgIEZES3B1c2hGb3IoaEJzLCA1KTsKKworICAgICAgICB0bXBQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICAgICAgaWYgKHRtcFByZXNlbnQpIC8qIGhmQ3V0UGFyYW1zICovCisgICAgICAgICAgRkRLcHVzaEZvcihoQnMsIDUpOworCisgICAgICAgIHRtcFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgICBpZiAodG1wUHJlc2VudCkgLyogaGZCb29zdFBhcmFtcyAqLworICAgICAgICAgIEZES3B1c2hGb3IoaEJzLCA1KTsKKyAgICAgIH0KKyAgICB9CisgICAgcENvZWYtPmdhaW5TZXF1ZW5jZUNvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA2KTsKKyAgICBnYWluU2V0Q291bnQgPSBGREtyZWFkQml0cyhoQnMsIDYpOworICAgIHBDb2VmLT5nYWluU2V0Q291bnQgPSBmTWluKGdhaW5TZXRDb3VudCwgMTIpOworICAgIGZvciAoaSA9IDA7IGkgPCBnYWluU2V0Q291bnQ7IGkrKykgeworICAgICAgR0FJTl9TRVQgdG1wR3NldDsKKyAgICAgIEZES21lbWNsZWFyKCZ0bXBHc2V0LCBzaXplb2YoR0FJTl9TRVQpKTsKKyAgICAgIGVyciA9IF9yZWFkR2FpblNldChoQnMsIHZlcnNpb24sICZnYWluU2VxdWVuY2VJbmRleCwgJnRtcEdzZXQsIDApOworICAgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKworICAgICAgaWYgKGkgPj0gMTIpIGNvbnRpbnVlOworICAgICAgcENvZWYtPmdhaW5TZXRbaV0gPSB0bXBHc2V0OworICAgIH0KKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgeworICAgIHBDb2VmLT5nYWluU2V0SW5kZXhGb3JHYWluU2VxdWVuY2VbaV0gPSAyNTU7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IHBDb2VmLT5nYWluU2V0Q291bnQ7IGkrKykgeworICAgIGludCBiOworICAgIGZvciAoYiA9IDA7IGIgPCBwQ29lZi0+Z2FpblNldFtpXS5iYW5kQ291bnQ7IGIrKykgeworICAgICAgaWYgKHBDb2VmLT5nYWluU2V0W2ldLmdhaW5TZXF1ZW5jZUluZGV4W2JdID49IDEyKSBjb250aW51ZTsKKyAgICAgIHBDb2VmLT5nYWluU2V0SW5kZXhGb3JHYWluU2VxdWVuY2VbcENvZWYtPmdhaW5TZXRbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nYWluU2VxdWVuY2VJbmRleFtiXV0gPSBpOworICAgIH0KKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9za2lwRHJjSW5zdHJ1Y3Rpb25zQmFzaWMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzKSB7CisgIGludCBkcmNTZXRFZmZlY3Q7CisgIGludCBhZGRpdGlvbmFsRG93bm1peElkUHJlc2VudCwgYWRkaXRpb25hbERvd25taXhJZENvdW50LAorICAgICAgbGltaXRlclBlYWtUYXJnZXRQcmVzZW50OworICBpbnQgZHJjU2V0VGFyZ2V0TG91ZG5lc3NQcmVzZW50LCBkcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlTG93ZXJQcmVzZW50OworCisgIEZES3B1c2hGb3IoaEJzLCA2KTsgLyogZHJjU2V0SWQgKi8KKyAgRkRLcHVzaEZvcihoQnMsIDQpOyAvKiBkcmNMb2NhdGlvbiAqLworICBGREtwdXNoRm9yKGhCcywgNyk7IC8qIGRvd25taXhJZCAqLworICBhZGRpdGlvbmFsRG93bm1peElkUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIGlmIChhZGRpdGlvbmFsRG93bm1peElkUHJlc2VudCkgeworICAgIGFkZGl0aW9uYWxEb3dubWl4SWRDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgMyk7CisgICAgRkRLcHVzaEZvcihoQnMsIDcgKiBhZGRpdGlvbmFsRG93bm1peElkQ291bnQpOyAvKiBhZGRpdGlvbmFsRG93bm1peElkICovCisgIH0KKworICBkcmNTZXRFZmZlY3QgPSBGREtyZWFkQml0cyhoQnMsIDE2KTsKKyAgaWYgKCEoZHJjU2V0RWZmZWN0ICYgKEVCX0RVQ0tfT1RIRVIgfCBFQl9EVUNLX1NFTEYpKSkgeworICAgIGxpbWl0ZXJQZWFrVGFyZ2V0UHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgaWYgKGxpbWl0ZXJQZWFrVGFyZ2V0UHJlc2VudCkgeworICAgICAgRkRLcHVzaEZvcihoQnMsIDgpOyAvKiBic0xpbWl0ZXJQZWFrVGFyZ2V0ICovCisgICAgfQorICB9CisKKyAgZHJjU2V0VGFyZ2V0TG91ZG5lc3NQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgaWYgKGRyY1NldFRhcmdldExvdWRuZXNzUHJlc2VudCkgeworICAgIEZES3B1c2hGb3IoaEJzLCA2KTsgLyogYnNEcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlVXBwZXIgKi8KKyAgICBkcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlTG93ZXJQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICBpZiAoZHJjU2V0VGFyZ2V0TG91ZG5lc3NWYWx1ZUxvd2VyUHJlc2VudCkgeworICAgICAgRkRLcHVzaEZvcihoQnMsIDYpOyAvKiBic0RyY1NldFRhcmdldExvdWRuZXNzVmFsdWVMb3dlciAqLworICAgIH0KKyAgfQorfQorCitzdGF0aWMgRFJDX0VSUk9SIF9yZWFkRHJjSW5zdHJ1Y3Rpb25zVW5pRHJjKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBJbnN0KSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgaW50IGksIGcsIGM7CisgIGludCBkb3dubWl4SWRQcmVzZW50LCBhZGRpdGlvbmFsRG93bm1peElkUHJlc2VudCwgYWRkaXRpb25hbERvd25taXhJZENvdW50OworICBpbnQgYnNMaW1pdGVyUGVha1RhcmdldCwgY2hhbm5lbENvdW50OworICBEUkNfQ09FRkZJQ0lFTlRTX1VOSV9EUkMqIHBDb2VmID0gTlVMTDsKKyAgaW50IHJlcGVhdFBhcmFtZXRlcnMsIGJzUmVwZWF0UGFyYW1ldGVyc0NvdW50OworICBpbnQgcmVwZWF0U2VxdWVuY2VJbmRleCwgYnNSZXBlYXRTZXF1ZW5jZUNvdW50OworICBTQ0hBUiogZ2FpblNldEluZGV4ID0gcEluc3QtPmdhaW5TZXRJbmRleDsKKyAgU0NIQVIgY2hhbm5lbEdyb3VwRm9yQ2hhbm5lbFs4XTsKKyAgRFVDS0lOR19NT0RJRklDQVRJT04gZHVja2luZ01vZGlmaWNhdGlvbkZvckNoYW5uZWxHcm91cFs4XTsKKworICBwSW5zdC0+ZHJjU2V0SWQgPSBGREtyZWFkQml0cyhoQnMsIDYpOworICBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgLyogQXNzdW1lIGFsbCB2MCBEUkMgc2V0cyB0byBiZSBtYW5hZ2VhYmxlIGluIHRlcm1zIG9mIGNvbXBsZXhpdHkgKi8KKyAgICBwSW5zdC0+ZHJjU2V0Q29tcGxleGl0eUxldmVsID0gMjsKKyAgfSBlbHNlIHsKKyAgICBwSW5zdC0+ZHJjU2V0Q29tcGxleGl0eUxldmVsID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgfQorICBwSW5zdC0+ZHJjTG9jYXRpb24gPSBGREtyZWFkQml0cyhoQnMsIDQpOworICBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgZG93bm1peElkUHJlc2VudCA9IDE7CisgIH0gZWxzZSB7CisgICAgZG93bm1peElkUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIH0KKyAgaWYgKGRvd25taXhJZFByZXNlbnQpIHsKKyAgICBwSW5zdC0+ZG93bm1peElkWzBdID0gRkRLcmVhZEJpdHMoaEJzLCA3KTsKKyAgICBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgICBpZiAocEluc3QtPmRvd25taXhJZFswXSA9PSAwKQorICAgICAgICBwSW5zdC0+ZHJjQXBwbHlUb0Rvd25taXggPSAwOworICAgICAgZWxzZQorICAgICAgICBwSW5zdC0+ZHJjQXBwbHlUb0Rvd25taXggPSAxOworICAgIH0gZWxzZSB7CisgICAgICBwSW5zdC0+ZHJjQXBwbHlUb0Rvd25taXggPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIH0KKworICAgIGFkZGl0aW9uYWxEb3dubWl4SWRQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICBpZiAoYWRkaXRpb25hbERvd25taXhJZFByZXNlbnQpIHsKKyAgICAgIGFkZGl0aW9uYWxEb3dubWl4SWRDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgMyk7CisgICAgICBpZiAoKDEgKyBhZGRpdGlvbmFsRG93bm1peElkQ291bnQpID4gOCkgcmV0dXJuIERFX01FTU9SWV9FUlJPUjsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhZGRpdGlvbmFsRG93bm1peElkQ291bnQ7IGkrKykgeworICAgICAgICBwSW5zdC0+ZG93bm1peElkW2kgKyAxXSA9IEZES3JlYWRCaXRzKGhCcywgNyk7CisgICAgICB9CisgICAgICBwSW5zdC0+ZG93bm1peElkQ291bnQgPSAxICsgYWRkaXRpb25hbERvd25taXhJZENvdW50OworICAgIH0gZWxzZSB7CisgICAgICBwSW5zdC0+ZG93bm1peElkQ291bnQgPSAxOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwSW5zdC0+ZG93bm1peElkWzBdID0gMDsKKyAgICBwSW5zdC0+ZG93bm1peElkQ291bnQgPSAxOworICB9CisKKyAgcEluc3QtPmRyY1NldEVmZmVjdCA9IEZES3JlYWRCaXRzKGhCcywgMTYpOworCisgIGlmICgocEluc3QtPmRyY1NldEVmZmVjdCAmIChFQl9EVUNLX09USEVSIHwgRUJfRFVDS19TRUxGKSkgPT0gMCkgeworICAgIHBJbnN0LT5saW1pdGVyUGVha1RhcmdldFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGlmIChwSW5zdC0+bGltaXRlclBlYWtUYXJnZXRQcmVzZW50KSB7CisgICAgICBic0xpbWl0ZXJQZWFrVGFyZ2V0ID0gRkRLcmVhZEJpdHMoaEJzLCA4KTsKKyAgICAgIHBJbnN0LT5saW1pdGVyUGVha1RhcmdldCA9IC0oRklYUF9TR0wpKAorICAgICAgICAgIGJzTGltaXRlclBlYWtUYXJnZXQKKyAgICAgICAgICA8PCAoRlJBQ1RfQklUUyAtIDEgLSAzIC0gNSkpOyAvKiAtIGJzTGltaXRlclBlYWtUYXJnZXQgKiAwLjEyNTsgKi8KKyAgICB9CisgIH0KKworICBwSW5zdC0+ZHJjU2V0VGFyZ2V0TG91ZG5lc3NQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKworICAvKiBzZXQgZGVmYXVsdCB2YWx1ZXMgKi8KKyAgcEluc3QtPmRyY1NldFRhcmdldExvdWRuZXNzVmFsdWVVcHBlciA9IDA7CisgIHBJbnN0LT5kcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlTG93ZXIgPSAtNjM7CisKKyAgaWYgKHBJbnN0LT5kcmNTZXRUYXJnZXRMb3VkbmVzc1ByZXNlbnQgPT0gMSkgeworICAgIGludCBic0RyY1NldFRhcmdldExvdWRuZXNzVmFsdWVVcHBlciwgYnNEcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlTG93ZXI7CisgICAgaW50IGRyY1NldFRhcmdldExvdWRuZXNzVmFsdWVMb3dlclByZXNlbnQ7CisgICAgYnNEcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlVXBwZXIgPSBGREtyZWFkQml0cyhoQnMsIDYpOworICAgIHBJbnN0LT5kcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlVXBwZXIgPQorICAgICAgICBic0RyY1NldFRhcmdldExvdWRuZXNzVmFsdWVVcHBlciAtIDYzOworICAgIGRyY1NldFRhcmdldExvdWRuZXNzVmFsdWVMb3dlclByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIGlmIChkcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlTG93ZXJQcmVzZW50ID09IDEpIHsKKyAgICAgIGJzRHJjU2V0VGFyZ2V0TG91ZG5lc3NWYWx1ZUxvd2VyID0gRkRLcmVhZEJpdHMoaEJzLCA2KTsKKyAgICAgIHBJbnN0LT5kcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlTG93ZXIgPQorICAgICAgICAgIGJzRHJjU2V0VGFyZ2V0TG91ZG5lc3NWYWx1ZUxvd2VyIC0gNjM7CisgICAgfQorICB9CisKKyAgcEluc3QtPmRlcGVuZHNPbkRyY1NldFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworCisgIHBJbnN0LT5ub0luZGVwZW5kZW50VXNlID0gMDsKKyAgaWYgKHBJbnN0LT5kZXBlbmRzT25EcmNTZXRQcmVzZW50KSB7CisgICAgcEluc3QtPmRlcGVuZHNPbkRyY1NldCA9IEZES3JlYWRCaXRzKGhCcywgNik7CisgIH0gZWxzZSB7CisgICAgcEluc3QtPm5vSW5kZXBlbmRlbnRVc2UgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICB9CisKKyAgaWYgKHZlcnNpb24gPT0gMCkgeworICAgIHBJbnN0LT5yZXF1aXJlc0VxID0gMDsKKyAgfSBlbHNlIHsKKyAgICBwSW5zdC0+cmVxdWlyZXNFcSA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIH0KKworICBwQ29lZiA9IHNlbGVjdERyY0NvZWZmaWNpZW50cyhoVW5pRHJjQ29uZmlnLCBwSW5zdC0+ZHJjTG9jYXRpb24pOworCisgIHBJbnN0LT5kcmNDaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQgPQorICAgICAgaFVuaURyY0NvbmZpZy0+Y2hhbm5lbExheW91dC5iYXNlQ2hhbm5lbENvdW50OworCisgIGlmIChwSW5zdC0+ZHJjU2V0RWZmZWN0ICYgKEVCX0RVQ0tfT1RIRVIgfCBFQl9EVUNLX1NFTEYpKSB7CisgICAgRFVDS0lOR19NT0RJRklDQVRJT04qIHBETW9kRm9yQ2hhbm5lbCA9CisgICAgICAgIHBJbnN0LT5kdWNraW5nTW9kaWZpY2F0aW9uRm9yQ2hhbm5lbDsKKyAgICBjID0gMDsKKyAgICB3aGlsZSAoYyA8IGNoYW5uZWxDb3VudCkgeworICAgICAgaW50IGJzR2FpblNldEluZGV4OworICAgICAgYnNHYWluU2V0SW5kZXggPSBGREtyZWFkQml0cyhoQnMsIDYpOworICAgICAgaWYgKGMgPj0gOCkgcmV0dXJuIERFX01FTU9SWV9FUlJPUjsKKyAgICAgIGdhaW5TZXRJbmRleFtjXSA9IGJzR2FpblNldEluZGV4IC0gMTsKKyAgICAgIF9kZWNvZGVEdWNraW5nTW9kaWZpY2F0aW9uKGhCcywgJihwRE1vZEZvckNoYW5uZWxbY10pLCAwKTsKKworICAgICAgYysrOworICAgICAgcmVwZWF0UGFyYW1ldGVycyA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICBpZiAocmVwZWF0UGFyYW1ldGVycyA9PSAxKSB7CisgICAgICAgIGJzUmVwZWF0UGFyYW1ldGVyc0NvdW50ID0gRkRLcmVhZEJpdHMoaEJzLCA1KTsKKyAgICAgICAgYnNSZXBlYXRQYXJhbWV0ZXJzQ291bnQgKz0gMTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJzUmVwZWF0UGFyYW1ldGVyc0NvdW50OyBpKyspIHsKKyAgICAgICAgICBpZiAoYyA+PSA4KSByZXR1cm4gREVfTUVNT1JZX0VSUk9SOworICAgICAgICAgIGdhaW5TZXRJbmRleFtjXSA9IGdhaW5TZXRJbmRleFtjIC0gMV07CisgICAgICAgICAgcERNb2RGb3JDaGFubmVsW2NdID0gcERNb2RGb3JDaGFubmVsW2MgLSAxXTsKKyAgICAgICAgICBjKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGMgPiBjaGFubmVsQ291bnQpIHsKKyAgICAgIHJldHVybiBERV9OT1RfT0s7CisgICAgfQorCisgICAgZXJyID0gZGVyaXZlRHJjQ2hhbm5lbEdyb3VwcygKKyAgICAgICAgcEluc3QtPmRyY1NldEVmZmVjdCwgcEluc3QtPmRyY0NoYW5uZWxDb3VudCwgZ2FpblNldEluZGV4LAorICAgICAgICBwRE1vZEZvckNoYW5uZWwsICZwSW5zdC0+bkRyY0NoYW5uZWxHcm91cHMsCisgICAgICAgIHBJbnN0LT5nYWluU2V0SW5kZXhGb3JDaGFubmVsR3JvdXAsIGNoYW5uZWxHcm91cEZvckNoYW5uZWwsCisgICAgICAgIGR1Y2tpbmdNb2RpZmljYXRpb25Gb3JDaGFubmVsR3JvdXApOworICAgIGlmIChlcnIpIHJldHVybiAoZXJyKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgZGVyaXZlQ2hhbm5lbENvdW50ID0gMDsKKyAgICBpZiAoKCh2ZXJzaW9uID09IDApIHx8IChwSW5zdC0+ZHJjQXBwbHlUb0Rvd25taXggIT0gMCkpICYmCisgICAgICAgIChwSW5zdC0+ZG93bm1peElkWzBdICE9IERPV05NSVhfSURfQkFTRV9MQVlPVVQpICYmCisgICAgICAgIChwSW5zdC0+ZG93bm1peElkWzBdICE9IERPV05NSVhfSURfQU5ZX0RPV05NSVgpICYmCisgICAgICAgIChwSW5zdC0+ZG93bm1peElkQ291bnQgPT0gMSkpIHsKKyAgICAgIGlmIChoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zQ291bnQgIT0gMCkgeworICAgICAgICBET1dOTUlYX0lOU1RSVUNUSU9OUyogcERvd24gPQorICAgICAgICAgICAgc2VsZWN0RG93bm1peEluc3RydWN0aW9ucyhoVW5pRHJjQ29uZmlnLCBwSW5zdC0+ZG93bm1peElkWzBdKTsKKyAgICAgICAgaWYgKHBEb3duID09IE5VTEwpIHJldHVybiBERV9OT1RfT0s7CisgICAgICAgIHBJbnN0LT5kcmNDaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQgPQorICAgICAgICAgICAgcERvd24tPnRhcmdldENoYW5uZWxDb3VudDsgLyogdGFyZ2V0Q2hhbm5lbENvdW50RnJvbURvd25taXhJZCovCisgICAgICB9IGVsc2UgeworICAgICAgICBkZXJpdmVDaGFubmVsQ291bnQgPSAxOworICAgICAgICBjaGFubmVsQ291bnQgPSAxOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoKCh2ZXJzaW9uID09IDApIHx8IChwSW5zdC0+ZHJjQXBwbHlUb0Rvd25taXggIT0gMCkpICYmCisgICAgICAgICAgICAgICAoKHBJbnN0LT5kb3dubWl4SWRbMF0gPT0gRE9XTk1JWF9JRF9BTllfRE9XTk1JWCkgfHwKKyAgICAgICAgICAgICAgICAocEluc3QtPmRvd25taXhJZENvdW50ID4gMSkpKSB7CisgICAgICAvKiBTZXQgbWF4aW11bSBjaGFubmVsIGNvdW50IGFzIHVwcGVyIGJvcmRlci4gVGhlIGVmZmVjdGl2ZSBjaGFubmVsIGNvdW50CisgICAgICAgKiBpcyBzZXQgYXQgdGhlIHByb2Nlc3MgZnVuY3Rpb24uICovCisgICAgICBwSW5zdC0+ZHJjQ2hhbm5lbENvdW50ID0gODsKKyAgICAgIGNoYW5uZWxDb3VudCA9IDE7CisgICAgfQorCisgICAgYyA9IDA7CisgICAgd2hpbGUgKGMgPCBjaGFubmVsQ291bnQpIHsKKyAgICAgIGludCBic0dhaW5TZXRJbmRleDsKKyAgICAgIGJzR2FpblNldEluZGV4ID0gRkRLcmVhZEJpdHMoaEJzLCA2KTsKKyAgICAgIGlmIChjID49IDgpIHJldHVybiBERV9NRU1PUllfRVJST1I7CisgICAgICBnYWluU2V0SW5kZXhbY10gPSBic0dhaW5TZXRJbmRleCAtIDE7CisgICAgICBjKys7CisgICAgICByZXBlYXRTZXF1ZW5jZUluZGV4ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKworICAgICAgaWYgKHJlcGVhdFNlcXVlbmNlSW5kZXggPT0gMSkgeworICAgICAgICBic1JlcGVhdFNlcXVlbmNlQ291bnQgPSBGREtyZWFkQml0cyhoQnMsIDUpOworICAgICAgICBic1JlcGVhdFNlcXVlbmNlQ291bnQgKz0gMTsKKyAgICAgICAgaWYgKGRlcml2ZUNoYW5uZWxDb3VudCkgeworICAgICAgICAgIGNoYW5uZWxDb3VudCA9IDEgKyBic1JlcGVhdFNlcXVlbmNlQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJzUmVwZWF0U2VxdWVuY2VDb3VudDsgaSsrKSB7CisgICAgICAgICAgaWYgKGMgPj0gOCkgcmV0dXJuIERFX01FTU9SWV9FUlJPUjsKKyAgICAgICAgICBnYWluU2V0SW5kZXhbY10gPSBic0dhaW5TZXRJbmRleCAtIDE7CisgICAgICAgICAgYysrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChjID4gY2hhbm5lbENvdW50KSB7CisgICAgICByZXR1cm4gREVfTk9UX09LOworICAgIH0KKyAgICBpZiAoZGVyaXZlQ2hhbm5lbENvdW50KSB7CisgICAgICBwSW5zdC0+ZHJjQ2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OworICAgIH0KKworICAgIC8qIERPV05NSVhfSURfQU5ZX0RPV05NSVg6IGNoYW5uZWxDb3VudCBpcyAxLiBEaXN0cmlidXRlIGdhaW5TZXRJbmRleCB0byBhbGwKKyAgICAgKiBjaGFubmVscy4gKi8KKyAgICBpZiAoKHBJbnN0LT5kb3dubWl4SWRbMF0gPT0gRE9XTk1JWF9JRF9BTllfRE9XTk1JWCkgfHwKKyAgICAgICAgKHBJbnN0LT5kb3dubWl4SWRDb3VudCA+IDEpKSB7CisgICAgICBmb3IgKGMgPSAxOyBjIDwgcEluc3QtPmRyY0NoYW5uZWxDb3VudDsgYysrKSB7CisgICAgICAgIGdhaW5TZXRJbmRleFtjXSA9IGdhaW5TZXRJbmRleFswXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBlcnIgPSBkZXJpdmVEcmNDaGFubmVsR3JvdXBzKHBJbnN0LT5kcmNTZXRFZmZlY3QsIHBJbnN0LT5kcmNDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYWluU2V0SW5kZXgsIE5VTEwsICZwSW5zdC0+bkRyY0NoYW5uZWxHcm91cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdC0+Z2FpblNldEluZGV4Rm9yQ2hhbm5lbEdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEdyb3VwRm9yQ2hhbm5lbCwgTlVMTCk7CisgICAgaWYgKGVycikgcmV0dXJuIChlcnIpOworCisgICAgZm9yIChnID0gMDsgZyA8IHBJbnN0LT5uRHJjQ2hhbm5lbEdyb3VwczsgZysrKSB7CisgICAgICBpbnQgc2V0LCBiYW5kQ291bnQ7CisgICAgICBzZXQgPSBwSW5zdC0+Z2FpblNldEluZGV4Rm9yQ2hhbm5lbEdyb3VwW2ddOworCisgICAgICAvKiBnZXQgYmFuZENvdW50ICovCisgICAgICBpZiAocENvZWYgIT0gTlVMTCAmJiBzZXQgPCBwQ29lZi0+Z2FpblNldENvdW50KSB7CisgICAgICAgIGJhbmRDb3VudCA9IHBDb2VmLT5nYWluU2V0W3NldF0uYmFuZENvdW50OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYmFuZENvdW50ID0gMTsKKyAgICAgIH0KKworICAgICAgX2RlY29kZUdhaW5Nb2RpZmljYXRpb24oaEJzLCB2ZXJzaW9uLCBiYW5kQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdC0+Z2Fpbk1vZGlmaWNhdGlvbkZvckNoYW5uZWxHcm91cFtnXSwgMCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIERSQ19FUlJPUiBfcmVhZENoYW5uZWxMYXlvdXQoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9MQVlPVVQqIHBDaGFuKSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKworICBwQ2hhbi0+YmFzZUNoYW5uZWxDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNyk7CisKKyAgaWYgKHBDaGFuLT5iYXNlQ2hhbm5lbENvdW50ID4gOCkgcmV0dXJuIERFX05PVF9PSzsKKworICBwQ2hhbi0+bGF5b3V0U2lnbmFsaW5nUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisKKyAgaWYgKHBDaGFuLT5sYXlvdXRTaWduYWxpbmdQcmVzZW50KSB7CisgICAgcENoYW4tPmRlZmluZWRMYXlvdXQgPSBGREtyZWFkQml0cyhoQnMsIDgpOworCisgICAgaWYgKHBDaGFuLT5kZWZpbmVkTGF5b3V0ID09IDApIHsKKyAgICAgIGludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IHBDaGFuLT5iYXNlQ2hhbm5lbENvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKGkgPCA4KSB7CisgICAgICAgICAgcENoYW4tPnNwZWFrZXJQb3NpdGlvbltpXSA9IEZES3JlYWRCaXRzKGhCcywgNyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRkRLcHVzaEZvcihoQnMsIDcpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBEUkNfRVJST1IgX3JlYWREb3dubWl4SW5zdHJ1Y3Rpb25zKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9MQVlPVVQqIHBDaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9XTk1JWF9JTlNUUlVDVElPTlMqIHBEb3duKSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKworICBwRG93bi0+ZG93bm1peElkID0gRkRLcmVhZEJpdHMoaEJzLCA3KTsKKyAgcERvd24tPnRhcmdldENoYW5uZWxDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNyk7CisgIHBEb3duLT50YXJnZXRMYXlvdXQgPSBGREtyZWFkQml0cyhoQnMsIDgpOworICBwRG93bi0+ZG93bm1peENvZWZmaWNpZW50c1ByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworCisgIGlmIChwRG93bi0+ZG93bm1peENvZWZmaWNpZW50c1ByZXNlbnQpIHsKKyAgICBpbnQgbkRvd25taXhDb2VmZnMgPSBwRG93bi0+dGFyZ2V0Q2hhbm5lbENvdW50ICogcENoYW4tPmJhc2VDaGFubmVsQ291bnQ7CisgICAgaW50IGk7CisgICAgaWYgKG5Eb3dubWl4Q29lZmZzID4gOCAqIDgpIHJldHVybiBERV9OT1RfT0s7CisgICAgaWYgKHZlcnNpb24gPT0gMCkgeworICAgICAgcERvd24tPmJzRG93bm1peE9mZnNldCA9IDA7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbkRvd25taXhDb2VmZnM7IGkrKykgeworICAgICAgICAvKiBMRkUgZG93bm1peCBjb2VmZmljaWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQuICovCisgICAgICAgIHBEb3duLT5kb3dubWl4Q29lZmZpY2llbnRbaV0gPSBkb3dubWl4Q29lZmZbRkRLcmVhZEJpdHMoaEJzLCA0KV07CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHBEb3duLT5ic0Rvd25taXhPZmZzZXQgPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgICAgZm9yIChpID0gMDsgaSA8IG5Eb3dubWl4Q29lZmZzOyBpKyspIHsKKyAgICAgICAgcERvd24tPmRvd25taXhDb2VmZmljaWVudFtpXSA9IGRvd25taXhDb2VmZlYxW0ZES3JlYWRCaXRzKGhCcywgNSldOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgRFJDX0VSUk9SIF9yZWFkRHJjRXh0ZW5zaW9uVjEoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnKSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgaW50IGRvd25taXhJbnN0cnVjdGlvbnNWMVByZXNlbnQ7CisgIGludCBkcmNDb2VmZnNBbmRJbnN0cnVjdGlvbnNVbmlEcmNWMVByZXNlbnQ7CisgIGludCBsb3VkRXFJbnN0cnVjdGlvbnNQcmVzZW50LCBsb3VkRXFJbnN0cnVjdGlvbnNDb3VudDsKKyAgaW50IGVxUHJlc2VudCwgZXFJbnN0cnVjdGlvbnNDb3VudDsKKyAgaW50IGksIG9mZnNldDsKKyAgaW50IGRpZmYgPSBoVW5pRHJjQ29uZmlnLT5kaWZmOworCisgIGRvd25taXhJbnN0cnVjdGlvbnNWMVByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBpZiAoZG93bm1peEluc3RydWN0aW9uc1YxUHJlc2VudCA9PSAxKSB7CisgICAgZGlmZiB8PSBfY29tcEFzc2lnbigmaFVuaURyY0NvbmZpZy0+ZG93bm1peEluc3RydWN0aW9uc0NvdW50VjEsCisgICAgICAgICAgICAgICAgICAgICAgICBGREtyZWFkQml0cyhoQnMsIDcpKTsKKyAgICBvZmZzZXQgPSBoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zQ291bnRWMDsKKyAgICBoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zQ291bnQgPSBmTWluKAorICAgICAgICAoVUNIQVIpKG9mZnNldCArIGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNDb3VudFYxKSwgKFVDSEFSKTYpOworICAgIGZvciAoaSA9IDA7IGkgPCBoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zQ291bnRWMTsgaSsrKSB7CisgICAgICBET1dOTUlYX0lOU1RSVUNUSU9OUyB0bXBEb3duOworICAgICAgRkRLbWVtY2xlYXIoJnRtcERvd24sIHNpemVvZihET1dOTUlYX0lOU1RSVUNUSU9OUykpOworICAgICAgZXJyID0gX3JlYWREb3dubWl4SW5zdHJ1Y3Rpb25zKGhCcywgMSwgJmhVbmlEcmNDb25maWctPmNoYW5uZWxMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcERvd24pOworICAgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgICAgIGlmICgob2Zmc2V0ICsgaSkgPj0gNikgY29udGludWU7CisgICAgICBpZiAoIWRpZmYpCisgICAgICAgIGRpZmYgfD0gKEZES21lbWNtcCgmdG1wRG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICYoaFVuaURyY0NvbmZpZy0+ZG93bm1peEluc3RydWN0aW9uc1tvZmZzZXQgKyBpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRE9XTk1JWF9JTlNUUlVDVElPTlMpKSAhPSAwKTsKKyAgICAgIGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNbb2Zmc2V0ICsgaV0gPSB0bXBEb3duOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBkaWZmIHw9IF9jb21wQXNzaWduKCZoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zQ291bnRWMSwgMCk7CisgIH0KKworICBkcmNDb2VmZnNBbmRJbnN0cnVjdGlvbnNVbmlEcmNWMVByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBpZiAoZHJjQ29lZmZzQW5kSW5zdHJ1Y3Rpb25zVW5pRHJjVjFQcmVzZW50ID09IDEpIHsKKyAgICBkaWZmIHw9IF9jb21wQXNzaWduKCZoVW5pRHJjQ29uZmlnLT5kcmNDb2VmZmljaWVudHNVbmlEcmNDb3VudFYxLAorICAgICAgICAgICAgICAgICAgICAgICAgRkRLcmVhZEJpdHMoaEJzLCAzKSk7CisgICAgb2Zmc2V0ID0gaFVuaURyY0NvbmZpZy0+ZHJjQ29lZmZpY2llbnRzVW5pRHJjQ291bnRWMDsKKyAgICBoVW5pRHJjQ29uZmlnLT5kcmNDb2VmZmljaWVudHNVbmlEcmNDb3VudCA9CisgICAgICAgIGZNaW4oKFVDSEFSKShvZmZzZXQgKyBoVW5pRHJjQ29uZmlnLT5kcmNDb2VmZmljaWVudHNVbmlEcmNDb3VudFYxKSwKKyAgICAgICAgICAgICAoVUNIQVIpMik7CisgICAgZm9yIChpID0gMDsgaSA8IGhVbmlEcmNDb25maWctPmRyY0NvZWZmaWNpZW50c1VuaURyY0NvdW50VjE7IGkrKykgeworICAgICAgRFJDX0NPRUZGSUNJRU5UU19VTklfRFJDIHRtcENvZWY7CisgICAgICBGREttZW1jbGVhcigmdG1wQ29lZiwgc2l6ZW9mKERSQ19DT0VGRklDSUVOVFNfVU5JX0RSQykpOworICAgICAgZXJyID0gX3JlYWREcmNDb2VmZmljaWVudHNVbmlEcmMoaEJzLCAxLCAmdG1wQ29lZik7CisgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgICAgaWYgKChvZmZzZXQgKyBpKSA+PSAyKSBjb250aW51ZTsKKyAgICAgIGlmICghZGlmZikKKyAgICAgICAgZGlmZiB8PSAoRkRLbWVtY21wKCZ0bXBDb2VmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJihoVW5pRHJjQ29uZmlnLT5kcmNDb2VmZmljaWVudHNVbmlEcmNbb2Zmc2V0ICsgaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKERSQ19DT0VGRklDSUVOVFNfVU5JX0RSQykpICE9IDApOworICAgICAgaFVuaURyY0NvbmZpZy0+ZHJjQ29lZmZpY2llbnRzVW5pRHJjW29mZnNldCArIGldID0gdG1wQ29lZjsKKyAgICB9CisKKyAgICBkaWZmIHw9IF9jb21wQXNzaWduKCZoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNDb3VudFYxLAorICAgICAgICAgICAgICAgICAgICAgICAgRkRLcmVhZEJpdHMoaEJzLCA2KSk7CisgICAgb2Zmc2V0ID0gaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnQ7CisgICAgaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnQgPQorICAgICAgICBmTWluKChVQ0hBUikob2Zmc2V0ICsgaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnRWMSksCisgICAgICAgICAgICAgKFVDSEFSKTEyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnQ7IGkrKykgeworICAgICAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDIHRtcEluc3Q7CisgICAgICBGREttZW1jbGVhcigmdG1wSW5zdCwgc2l6ZW9mKERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQykpOworICAgICAgZXJyID0gX3JlYWREcmNJbnN0cnVjdGlvbnNVbmlEcmMoaEJzLCAxLCBoVW5pRHJjQ29uZmlnLCAmdG1wSW5zdCk7CisgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgICAgaWYgKChvZmZzZXQgKyBpKSA+PSAxMikgY29udGludWU7CisgICAgICBpZiAoIWRpZmYpCisgICAgICAgIGRpZmYgfD0gKEZES21lbWNtcCgmdG1wSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICYoaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjW29mZnNldCArIGldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMpKSAhPSAwKTsKKyAgICAgIGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY1tvZmZzZXQgKyBpXSA9IHRtcEluc3Q7CisgICAgfQorICB9IGVsc2UgeworICAgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJmhVbmlEcmNDb25maWctPmRyY0NvZWZmaWNpZW50c1VuaURyY0NvdW50VjEsIDApOworICAgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJmhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY0NvdW50VjEsIDApOworICB9CisKKyAgbG91ZEVxSW5zdHJ1Y3Rpb25zUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIGlmIChsb3VkRXFJbnN0cnVjdGlvbnNQcmVzZW50ID09IDEpIHsKKyAgICBsb3VkRXFJbnN0cnVjdGlvbnNDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgZm9yIChpID0gMDsgaSA8IGxvdWRFcUluc3RydWN0aW9uc0NvdW50OyBpKyspIHsKKyAgICAgIF9za2lwTG91ZEVxSW5zdHJ1Y3Rpb25zKGhCcyk7CisgICAgfQorICB9CisKKyAgZXFQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgaWYgKGVxUHJlc2VudCA9PSAxKSB7CisgICAgX3NraXBFcUNvZWZmaWNpZW50cyhoQnMpOworICAgIGVxSW5zdHJ1Y3Rpb25zQ291bnQgPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgIGZvciAoaSA9IDA7IGkgPCBlcUluc3RydWN0aW9uc0NvdW50OyBpKyspIHsKKyAgICAgIF9za2lwRXFJbnN0cnVjdGlvbnMoaEJzLCBoVW5pRHJjQ29uZmlnKTsKKyAgICB9CisgIH0KKworICBoVW5pRHJjQ29uZmlnLT5kaWZmID0gZGlmZjsKKworICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgRFJDX0VSUk9SIF9yZWFkVW5pRHJjQ29uZmlnRXh0ZW5zaW9uKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcpIHsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworICBpbnQgaywgYml0U2l6ZUxlbiwgZXh0U2l6ZUJpdHMsIGJpdFNpemU7CisgIElOVCBuQml0c1JlbWFpbmluZzsKKyAgVU5JX0RSQ19DT05GSUdfRVhURU5TSU9OKiBwRXh0ID0gJihoVW5pRHJjQ29uZmlnLT51bmlEcmNDb25maWdFeHQpOworCisgIGsgPSAwOworICBwRXh0LT51bmlEcmNDb25maWdFeHRUeXBlW2tdID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgd2hpbGUgKHBFeHQtPnVuaURyY0NvbmZpZ0V4dFR5cGVba10gIT0gVU5JRFJDQ09ORkVYVF9URVJNKSB7CisgICAgaWYgKGsgPj0gKDggLSAxKSkgcmV0dXJuIERFX01FTU9SWV9FUlJPUjsKKyAgICBiaXRTaXplTGVuID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICBleHRTaXplQml0cyA9IGJpdFNpemVMZW4gKyA0OworCisgICAgYml0U2l6ZSA9IEZES3JlYWRCaXRzKGhCcywgZXh0U2l6ZUJpdHMpOworICAgIHBFeHQtPmV4dEJpdFNpemVba10gPSBiaXRTaXplICsgMTsKKyAgICBuQml0c1JlbWFpbmluZyA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisKKyAgICBzd2l0Y2ggKHBFeHQtPnVuaURyY0NvbmZpZ0V4dFR5cGVba10pIHsKKyAgICAgIGNhc2UgVU5JRFJDQ09ORkVYVF9WMToKKyAgICAgICAgZXJyID0gX3JlYWREcmNFeHRlbnNpb25WMShoQnMsIGhVbmlEcmNDb25maWcpOworICAgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgICAgICBpZiAobkJpdHNSZW1haW5pbmcgIT0KKyAgICAgICAgICAgICgoSU5UKXBFeHQtPmV4dEJpdFNpemVba10gKyAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpKSkKKyAgICAgICAgICByZXR1cm4gREVfTk9UX09LOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVU5JRFJDQ09ORkVYVF9QQVJBTV9EUkM6CisgICAgICAvKiBhZGQgZnV0dXJlIGV4dGVuc2lvbnMgaGVyZSAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgRkRLcHVzaEZvcihoQnMsIHBFeHQtPmV4dEJpdFNpemVba10pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaysrOworICAgIHBFeHQtPnVuaURyY0NvbmZpZ0V4dFR5cGVba10gPSBGREtyZWFkQml0cyhoQnMsIDQpOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworRFJDX0VSUk9SCitkcmNEZWNfcmVhZFVuaURyY0NvbmZpZyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZykgeworICBEUkNfRVJST1IgZXJyID0gREVfT0s7CisgIGludCBpLCBkaWZmID0gMDsKKyAgaW50IGRyY0Rlc2NyaXB0aW9uQmFzaWNQcmVzZW50LCBkcmNDb2VmZmljaWVudHNCYXNpY0NvdW50LAorICAgICAgZHJjSW5zdHJ1Y3Rpb25zQmFzaWNDb3VudDsKKyAgQ0hBTk5FTF9MQVlPVVQgdG1wQ2hhbjsKKyAgRkRLbWVtY2xlYXIoJnRtcENoYW4sIHNpemVvZihDSEFOTkVMX0xBWU9VVCkpOworICBpZiAoaFVuaURyY0NvbmZpZyA9PSBOVUxMKSByZXR1cm4gREVfTk9UX09LOworCisgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJmhVbmlEcmNDb25maWctPnNhbXBsZVJhdGVQcmVzZW50LCBGREtyZWFkQml0cyhoQnMsIDEpKTsKKworICBpZiAoaFVuaURyY0NvbmZpZy0+c2FtcGxlUmF0ZVByZXNlbnQgPT0gMSkgeworICAgIGRpZmYgfD0KKyAgICAgICAgX2NvbXBBc3NpZ24oJmhVbmlEcmNDb25maWctPnNhbXBsZVJhdGUsIEZES3JlYWRCaXRzKGhCcywgMTgpICsgMTAwMCk7CisgIH0KKworICBkaWZmIHw9IF9jb21wQXNzaWduKCZoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zQ291bnRWMCwKKyAgICAgICAgICAgICAgICAgICAgICBGREtyZWFkQml0cyhoQnMsIDcpKTsKKworICBkcmNEZXNjcmlwdGlvbkJhc2ljUHJlc2VudCA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgIGlmIChkcmNEZXNjcmlwdGlvbkJhc2ljUHJlc2VudCA9PSAxKSB7CisgICAgZHJjQ29lZmZpY2llbnRzQmFzaWNDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgMyk7CisgICAgZHJjSW5zdHJ1Y3Rpb25zQmFzaWNDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgIH0gZWxzZSB7CisgICAgZHJjQ29lZmZpY2llbnRzQmFzaWNDb3VudCA9IDA7CisgICAgZHJjSW5zdHJ1Y3Rpb25zQmFzaWNDb3VudCA9IDA7CisgIH0KKworICBkaWZmIHw9IF9jb21wQXNzaWduKCZoVW5pRHJjQ29uZmlnLT5kcmNDb2VmZmljaWVudHNVbmlEcmNDb3VudFYwLAorICAgICAgICAgICAgICAgICAgICAgIEZES3JlYWRCaXRzKGhCcywgMykpOworICBkaWZmIHw9IF9jb21wQXNzaWduKCZoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNDb3VudFYwLAorICAgICAgICAgICAgICAgICAgICAgIEZES3JlYWRCaXRzKGhCcywgNikpOworCisgIGVyciA9IF9yZWFkQ2hhbm5lbExheW91dChoQnMsICZ0bXBDaGFuKTsKKyAgaWYgKGVycikgcmV0dXJuIGVycjsKKworICBpZiAoIWRpZmYpCisgICAgZGlmZiB8PSAoRkRLbWVtY21wKCZ0bXBDaGFuLCAmaFVuaURyY0NvbmZpZy0+Y2hhbm5lbExheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENIQU5ORUxfTEFZT1VUKSkgIT0gMCk7CisgIGhVbmlEcmNDb25maWctPmNoYW5uZWxMYXlvdXQgPSB0bXBDaGFuOworCisgIGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNDb3VudCA9CisgICAgICBmTWluKGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNDb3VudFYwLCAoVUNIQVIpNik7CisgIGZvciAoaSA9IDA7IGkgPCBoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zQ291bnRWMDsgaSsrKSB7CisgICAgRE9XTk1JWF9JTlNUUlVDVElPTlMgdG1wRG93bjsKKyAgICBGREttZW1jbGVhcigmdG1wRG93biwgc2l6ZW9mKERPV05NSVhfSU5TVFJVQ1RJT05TKSk7CisgICAgZXJyID0gX3JlYWREb3dubWl4SW5zdHJ1Y3Rpb25zKGhCcywgMCwgJmhVbmlEcmNDb25maWctPmNoYW5uZWxMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBEb3duKTsKKyAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgIGlmIChpID49IDYpIGNvbnRpbnVlOworICAgIGlmICghZGlmZikKKyAgICAgIGRpZmYgfD0gKEZES21lbWNtcCgmdG1wRG93biwgJihoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRE9XTk1JWF9JTlNUUlVDVElPTlMpKSAhPSAwKTsKKyAgICBoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zW2ldID0gdG1wRG93bjsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBkcmNDb2VmZmljaWVudHNCYXNpY0NvdW50OyBpKyspIHsKKyAgICBfc2tpcERyY0NvZWZmaWNpZW50c0Jhc2ljKGhCcyk7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IGRyY0luc3RydWN0aW9uc0Jhc2ljQ291bnQ7IGkrKykgeworICAgIF9za2lwRHJjSW5zdHJ1Y3Rpb25zQmFzaWMoaEJzKTsKKyAgfQorCisgIGhVbmlEcmNDb25maWctPmRyY0NvZWZmaWNpZW50c1VuaURyY0NvdW50ID0KKyAgICAgIGZNaW4oaFVuaURyY0NvbmZpZy0+ZHJjQ29lZmZpY2llbnRzVW5pRHJjQ291bnRWMCwgKFVDSEFSKTIpOworICBmb3IgKGkgPSAwOyBpIDwgaFVuaURyY0NvbmZpZy0+ZHJjQ29lZmZpY2llbnRzVW5pRHJjQ291bnRWMDsgaSsrKSB7CisgICAgRFJDX0NPRUZGSUNJRU5UU19VTklfRFJDIHRtcENvZWY7CisgICAgRkRLbWVtY2xlYXIoJnRtcENvZWYsIHNpemVvZihEUkNfQ09FRkZJQ0lFTlRTX1VOSV9EUkMpKTsKKyAgICBlcnIgPSBfcmVhZERyY0NvZWZmaWNpZW50c1VuaURyYyhoQnMsIDAsICZ0bXBDb2VmKTsKKyAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgIGlmIChpID49IDIpIGNvbnRpbnVlOworICAgIGlmICghZGlmZikKKyAgICAgIGRpZmYgfD0gKEZES21lbWNtcCgmdG1wQ29lZiwgJihoVW5pRHJjQ29uZmlnLT5kcmNDb2VmZmljaWVudHNVbmlEcmNbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihEUkNfQ09FRkZJQ0lFTlRTX1VOSV9EUkMpKSAhPSAwKTsKKyAgICBoVW5pRHJjQ29uZmlnLT5kcmNDb2VmZmljaWVudHNVbmlEcmNbaV0gPSB0bXBDb2VmOworICB9CisKKyAgaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnQgPQorICAgICAgZk1pbihoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNDb3VudFYwLCAoVUNIQVIpMTIpOworICBmb3IgKGkgPSAwOyBpIDwgaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnRWMDsgaSsrKSB7CisgICAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDIHRtcEluc3Q7CisgICAgRkRLbWVtY2xlYXIoJnRtcEluc3QsIHNpemVvZihEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMpKTsKKyAgICBlcnIgPSBfcmVhZERyY0luc3RydWN0aW9uc1VuaURyYyhoQnMsIDAsIGhVbmlEcmNDb25maWcsICZ0bXBJbnN0KTsKKyAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgIGlmIChpID49IDEyKSBjb250aW51ZTsKKyAgICBpZiAoIWRpZmYpCisgICAgICBkaWZmIHw9IChGREttZW1jbXAoJnRtcEluc3QsICYoaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKSkgIT0gMCk7CisgICAgaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjW2ldID0gdG1wSW5zdDsKKyAgfQorCisgIGRpZmYgfD0KKyAgICAgIF9jb21wQXNzaWduKCZoVW5pRHJjQ29uZmlnLT51bmlEcmNDb25maWdFeHRQcmVzZW50LCBGREtyZWFkQml0cyhoQnMsIDEpKTsKKyAgaFVuaURyY0NvbmZpZy0+ZGlmZiA9IGRpZmY7CisKKyAgaWYgKGhVbmlEcmNDb25maWctPnVuaURyY0NvbmZpZ0V4dFByZXNlbnQgPT0gMSkgeworICAgIGVyciA9IF9yZWFkVW5pRHJjQ29uZmlnRXh0ZW5zaW9uKGhCcywgaFVuaURyY0NvbmZpZyk7CisgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqLworLyogbG91ZG5lc3NJbmZvU2V0ICovCisvKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIERSQ19FUlJPUiBfZGVjb2RlTWV0aG9kVmFsdWUoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgbWV0aG9kRGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiBtZXRob2RWYWx1ZSwgSU5UIGlzQm94KSB7CisgIGludCB0bXA7CisgIEZJWFBfREJMIHZhbDsKKyAgc3dpdGNoIChtZXRob2REZWZpbml0aW9uKSB7CisgICAgY2FzZSBNRF9VTktOT1dOX09USEVSOgorICAgIGNhc2UgTURfUFJPR1JBTV9MT1VETkVTUzoKKyAgICBjYXNlIE1EX0FOQ0hPUl9MT1VETkVTUzoKKyAgICBjYXNlIE1EX01BWF9PRl9MT1VETkVTU19SQU5HRToKKyAgICBjYXNlIE1EX01PTUVOVEFSWV9MT1VETkVTU19NQVg6CisgICAgY2FzZSBNRF9TSE9SVF9URVJNX0xPVURORVNTX01BWDoKKyAgICAgIHRtcCA9IEZES3JlYWRCaXRzKGhCcywgOCk7CisgICAgICB2YWwgPSBGTDJGWENPTlNUX0RCTCgtNTcuNzVmIC8gKGZsb2F0KSgxIDw8IDcpKSArCisgICAgICAgICAgICAoRklYUF9EQkwpKAorICAgICAgICAgICAgICAgIHRtcCA8PCAoREZSQUNUX0JJVFMgLSAxIC0gMiAtIDcpKTsgLyogLTU3Ljc1ICsgdG1wICogMC4yNTsgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgTURfTE9VRE5FU1NfUkFOR0U6CisgICAgICB0bXAgPSBGREtyZWFkQml0cyhoQnMsIDgpOworICAgICAgaWYgKHRtcCA9PSAwKQorICAgICAgICB2YWwgPSAoRklYUF9EQkwpMDsKKyAgICAgIGVsc2UgaWYgKHRtcCA8PSAxMjgpCisgICAgICAgIHZhbCA9IChGSVhQX0RCTCkodG1wIDw8IChERlJBQ1RfQklUUyAtIDEgLSAyIC0gNykpOyAvKiB0bXAgKiAwLjI1OyAqLworICAgICAgZWxzZSBpZiAodG1wIDw9IDIwNCkgeworICAgICAgICB2YWwgPSAoRklYUF9EQkwpKHRtcCA8PCAoREZSQUNUX0JJVFMgLSAxIC0gMSAtIDcpKSAtCisgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDMyLjBmIC8gKGZsb2F0KSgxIDw8IDcpKTsgLyogMC41ICogdG1wIC0gMzIuMGY7ICovCisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBkb3duc2NhbGUgYnkgMSBtb3JlIGJpdCB0byBwcmV2ZW50IG92ZXJmbG93IGF0IGludGVybWVkaWF0ZSByZXN1bHQgKi8KKyAgICAgICAgdmFsID0gKEZJWFBfREJMKSh0bXAgPDwgKERGUkFDVF9CSVRTIC0gMSAtIDgpKSAtCisgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEzNC4wZiAvIChmbG9hdCkoMSA8PCA4KSk7IC8qIHRtcCAtIDEzNC4wOyAqLworICAgICAgICB2YWwgPDw9IDE7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIE1EX01JWElOR19MRVZFTDoKKyAgICAgIHRtcCA9IEZES3JlYWRCaXRzKGhCcywgaXNCb3ggPyA4IDogNSk7CisgICAgICB2YWwgPSAoRklYUF9EQkwpKHRtcCA8PCAoREZSQUNUX0JJVFMgLSAxIC0gNykpICsKKyAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDgwLjBmIC8gKGZsb2F0KSgxIDw8IDcpKTsgLyogdG1wICsgODAuMDsgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgTURfUk9PTV9UWVBFOgorICAgICAgdG1wID0gRkRLcmVhZEJpdHMoaEJzLCBpc0JveCA/IDggOiAyKTsKKyAgICAgIHZhbCA9IChGSVhQX0RCTCkodG1wIDw8IChERlJBQ1RfQklUUyAtIDEgLSA3KSk7IC8qIHRtcDsgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgTURfU0hPUlRfVEVSTV9MT1VETkVTUzoKKyAgICAgIHRtcCA9IEZES3JlYWRCaXRzKGhCcywgOCk7CisgICAgICB2YWwgPSBGTDJGWENPTlNUX0RCTCgtMTE2LjBmIC8gKGZsb2F0KSgxIDw8IDcpKSArCisgICAgICAgICAgICAoRklYUF9EQkwpKAorICAgICAgICAgICAgICAgIHRtcCA8PCAoREZSQUNUX0JJVFMgLSAxIC0gMSAtIDcpKTsgLyogLTExNi4wICsgdG1wICogMC41OyAqLworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBERV9OT1RfT0s7IC8qIGludmFsaWQgbWV0aG9kRGVmaW5pdGlvbiB2YWx1ZSAqLworICB9CisgICptZXRob2RWYWx1ZSA9IHZhbDsKKyAgcmV0dXJuIERFX09LOworfQorCitzdGF0aWMgRFJDX0VSUk9SIF9yZWFkTG91ZG5lc3NNZWFzdXJlbWVudChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT1VETkVTU19NRUFTVVJFTUVOVCogcE1lYXMpIHsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworCisgIHBNZWFzLT5tZXRob2REZWZpbml0aW9uID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgZXJyID0KKyAgICAgIF9kZWNvZGVNZXRob2RWYWx1ZShoQnMsIHBNZWFzLT5tZXRob2REZWZpbml0aW9uLCAmcE1lYXMtPm1ldGhvZFZhbHVlLCAwKTsKKyAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgcE1lYXMtPm1lYXN1cmVtZW50U3lzdGVtID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgcE1lYXMtPnJlbGlhYmlsaXR5ID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsKKworICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgRFJDX0VSUk9SIF9yZWFkTG91ZG5lc3NJbmZvKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgY29uc3QgaW50IHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPVURORVNTX0lORk8qIGxvdWRuZXNzSW5mbykgeworICBEUkNfRVJST1IgZXJyID0gREVfT0s7CisgIGludCBic1NhbXBsZVBlYWtMZXZlbCwgYnNUcnVlUGVha0xldmVsLCBpOworICBpbnQgbWVhc3VyZW1lbnRDb3VudDsKKworICBsb3VkbmVzc0luZm8tPmRyY1NldElkID0gRkRLcmVhZEJpdHMoaEJzLCA2KTsKKyAgaWYgKHZlcnNpb24gPj0gMSkgeworICAgIGxvdWRuZXNzSW5mby0+ZXFTZXRJZCA9IEZES3JlYWRCaXRzKGhCcywgNik7CisgIH0gZWxzZSB7CisgICAgbG91ZG5lc3NJbmZvLT5lcVNldElkID0gMDsKKyAgfQorICBsb3VkbmVzc0luZm8tPmRvd25taXhJZCA9IEZES3JlYWRCaXRzKGhCcywgNyk7CisKKyAgbG91ZG5lc3NJbmZvLT5zYW1wbGVQZWFrTGV2ZWxQcmVzZW50ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgaWYgKGxvdWRuZXNzSW5mby0+c2FtcGxlUGVha0xldmVsUHJlc2VudCkgeworICAgIGJzU2FtcGxlUGVha0xldmVsID0gRkRLcmVhZEJpdHMoaEJzLCAxMik7CisgICAgaWYgKGJzU2FtcGxlUGVha0xldmVsID09IDApIHsKKyAgICAgIGxvdWRuZXNzSW5mby0+c2FtcGxlUGVha0xldmVsUHJlc2VudCA9IDA7CisgICAgICBsb3VkbmVzc0luZm8tPnNhbXBsZVBlYWtMZXZlbCA9IChGSVhQX0RCTCkwOworICAgIH0gZWxzZSB7IC8qIDIwLjAgLSBic1NhbXBsZVBlYWtMZXZlbCAqIDAuMDMxMjU7ICovCisgICAgICBsb3VkbmVzc0luZm8tPnNhbXBsZVBlYWtMZXZlbCA9CisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMjAuMGYgLyAoZmxvYXQpKDEgPDwgNykpIC0KKyAgICAgICAgICAoRklYUF9EQkwpKGJzU2FtcGxlUGVha0xldmVsIDw8IChERlJBQ1RfQklUUyAtIDEgLSA1IC0gNykpOworICAgIH0KKyAgfQorCisgIGxvdWRuZXNzSW5mby0+dHJ1ZVBlYWtMZXZlbFByZXNlbnQgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBpZiAobG91ZG5lc3NJbmZvLT50cnVlUGVha0xldmVsUHJlc2VudCkgeworICAgIGJzVHJ1ZVBlYWtMZXZlbCA9IEZES3JlYWRCaXRzKGhCcywgMTIpOworICAgIGlmIChic1RydWVQZWFrTGV2ZWwgPT0gMCkgeworICAgICAgbG91ZG5lc3NJbmZvLT50cnVlUGVha0xldmVsUHJlc2VudCA9IDA7CisgICAgICBsb3VkbmVzc0luZm8tPnRydWVQZWFrTGV2ZWwgPSAoRklYUF9EQkwpMDsKKyAgICB9IGVsc2UgeworICAgICAgbG91ZG5lc3NJbmZvLT50cnVlUGVha0xldmVsID0KKyAgICAgICAgICBGTDJGWENPTlNUX0RCTCgyMC4wZiAvIChmbG9hdCkoMSA8PCA3KSkgLQorICAgICAgICAgIChGSVhQX0RCTCkoYnNUcnVlUGVha0xldmVsIDw8IChERlJBQ1RfQklUUyAtIDEgLSA1IC0gNykpOworICAgIH0KKyAgICBsb3VkbmVzc0luZm8tPnRydWVQZWFrTGV2ZWxNZWFzdXJlbWVudFN5c3RlbSA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgbG91ZG5lc3NJbmZvLT50cnVlUGVha0xldmVsUmVsaWFiaWxpdHkgPSBGREtyZWFkQml0cyhoQnMsIDIpOworICB9CisKKyAgbWVhc3VyZW1lbnRDb3VudCA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgIGxvdWRuZXNzSW5mby0+bWVhc3VyZW1lbnRDb3VudCA9IGZNaW4obWVhc3VyZW1lbnRDb3VudCwgOCk7CisgIGZvciAoaSA9IDA7IGkgPCBtZWFzdXJlbWVudENvdW50OyBpKyspIHsKKyAgICBMT1VETkVTU19NRUFTVVJFTUVOVCB0bXBNZWFzOworICAgIEZES21lbWNsZWFyKCZ0bXBNZWFzLCBzaXplb2YoTE9VRE5FU1NfTUVBU1VSRU1FTlQpKTsKKyAgICBlcnIgPSBfcmVhZExvdWRuZXNzTWVhc3VyZW1lbnQoaEJzLCAmdG1wTWVhcyk7CisgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgICBpZiAoaSA+PSA4KSBjb250aW51ZTsKKyAgICBsb3VkbmVzc0luZm8tPmxvdWRuZXNzTWVhc3VyZW1lbnRbaV0gPSB0bXBNZWFzOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIERSQ19FUlJPUiBfcmVhZExvdWRuZXNzSW5mb1NldEV4dEVxKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQpIHsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworICBpbnQgaSwgb2Zmc2V0OworICBpbnQgZGlmZiA9IGhMb3VkbmVzc0luZm9TZXQtPmRpZmY7CisKKyAgZGlmZiB8PSBfY29tcEFzc2lnbigmaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW1Db3VudFYxLAorICAgICAgICAgICAgICAgICAgICAgIEZES3JlYWRCaXRzKGhCcywgNikpOworICBkaWZmIHw9CisgICAgICBfY29tcEFzc2lnbigmaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQ291bnRWMSwgRkRLcmVhZEJpdHMoaEJzLCA2KSk7CisKKyAgb2Zmc2V0ID0gaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW1Db3VudFYwOworICBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bUNvdW50ID0gZk1pbigKKyAgICAgIChVQ0hBUikob2Zmc2V0ICsgaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW1Db3VudFYxKSwgKFVDSEFSKTEyKTsKKyAgZm9yIChpID0gMDsgaSA8IGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0FsYnVtQ291bnRWMTsgaSsrKSB7CisgICAgTE9VRE5FU1NfSU5GTyB0bXBMb3VkOworICAgIEZES21lbWNsZWFyKCZ0bXBMb3VkLCBzaXplb2YoTE9VRE5FU1NfSU5GTykpOworICAgIGVyciA9IF9yZWFkTG91ZG5lc3NJbmZvKGhCcywgMSwgJnRtcExvdWQpOworICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgICAgaWYgKChvZmZzZXQgKyBpKSA+PSAxMikgY29udGludWU7CisgICAgaWYgKCFkaWZmKQorICAgICAgZGlmZiB8PSAoRkRLbWVtY21wKCZ0bXBMb3VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICYoaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW1bb2Zmc2V0ICsgaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMT1VETkVTU19JTkZPKSkgIT0gMCk7CisgICAgaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW1bb2Zmc2V0ICsgaV0gPSB0bXBMb3VkOworICB9CisKKyAgb2Zmc2V0ID0gaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQ291bnRWMDsKKyAgaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQ291bnQgPQorICAgICAgZk1pbigoVUNIQVIpKG9mZnNldCArIGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0NvdW50VjEpLCAoVUNIQVIpMTIpOworICBmb3IgKGkgPSAwOyBpIDwgaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQ291bnRWMTsgaSsrKSB7CisgICAgTE9VRE5FU1NfSU5GTyB0bXBMb3VkOworICAgIEZES21lbWNsZWFyKCZ0bXBMb3VkLCBzaXplb2YoTE9VRE5FU1NfSU5GTykpOworICAgIGVyciA9IF9yZWFkTG91ZG5lc3NJbmZvKGhCcywgMSwgJnRtcExvdWQpOworICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgICAgaWYgKChvZmZzZXQgKyBpKSA+PSAxMikgY29udGludWU7CisgICAgaWYgKCFkaWZmKQorICAgICAgZGlmZiB8PQorICAgICAgICAgIChGREttZW1jbXAoJnRtcExvdWQsICYoaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvW29mZnNldCArIGldKSwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMT1VETkVTU19JTkZPKSkgIT0gMCk7CisgICAgaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvW29mZnNldCArIGldID0gdG1wTG91ZDsKKyAgfQorICBoTG91ZG5lc3NJbmZvU2V0LT5kaWZmID0gZGlmZjsKKyAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIERSQ19FUlJPUiBfcmVhZExvdWRuZXNzSW5mb1NldEV4dGVuc2lvbigKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0KSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgaW50IGssIGJpdFNpemVMZW4sIGV4dFNpemVCaXRzLCBiaXRTaXplOworICBJTlQgbkJpdHNSZW1haW5pbmc7CisgIExPVURORVNTX0lORk9fU0VUX0VYVEVOU0lPTiogcEV4dCA9ICYoaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvU2V0RXh0KTsKKworICBrID0gMDsKKyAgcEV4dC0+bG91ZG5lc3NJbmZvU2V0RXh0VHlwZVtrXSA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgIHdoaWxlIChwRXh0LT5sb3VkbmVzc0luZm9TZXRFeHRUeXBlW2tdICE9IFVOSURSQ0xPVURFWFRfVEVSTSkgeworICAgIGlmIChrID49ICg4IC0gMSkpIHJldHVybiBERV9NRU1PUllfRVJST1I7CisgICAgYml0U2l6ZUxlbiA9IEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgZXh0U2l6ZUJpdHMgPSBiaXRTaXplTGVuICsgNDsKKworICAgIGJpdFNpemUgPSBGREtyZWFkQml0cyhoQnMsIGV4dFNpemVCaXRzKTsKKyAgICBwRXh0LT5leHRCaXRTaXplW2tdID0gYml0U2l6ZSArIDE7CisgICAgbkJpdHNSZW1haW5pbmcgPSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpOworCisgICAgc3dpdGNoIChwRXh0LT5sb3VkbmVzc0luZm9TZXRFeHRUeXBlW2tdKSB7CisgICAgICBjYXNlIFVOSURSQ0xPVURFWFRfRVE6CisgICAgICAgIGVyciA9IF9yZWFkTG91ZG5lc3NJbmZvU2V0RXh0RXEoaEJzLCBoTG91ZG5lc3NJbmZvU2V0KTsKKyAgICAgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgICAgICAgaWYgKG5CaXRzUmVtYWluaW5nICE9CisgICAgICAgICAgICAoKElOVClwRXh0LT5leHRCaXRTaXplW2tdICsgKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSkpCisgICAgICAgICAgcmV0dXJuIERFX05PVF9PSzsKKyAgICAgICAgYnJlYWs7CisgICAgICAvKiBhZGQgZnV0dXJlIGV4dGVuc2lvbnMgaGVyZSAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgRkRLcHVzaEZvcihoQnMsIHBFeHQtPmV4dEJpdFNpemVba10pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaysrOworICAgIHBFeHQtPmxvdWRuZXNzSW5mb1NldEV4dFR5cGVba10gPSBGREtyZWFkQml0cyhoQnMsIDQpOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworLyogUGFyc2VyIGZvciBsb3VuZGVzc0luZm9TZXQoKSAqLworRFJDX0VSUk9SCitkcmNEZWNfcmVhZExvdWRuZXNzSW5mb1NldChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCkgeworICBEUkNfRVJST1IgZXJyID0gREVfT0s7CisgIGludCBpLCBkaWZmID0gMDsKKyAgaWYgKGhMb3VkbmVzc0luZm9TZXQgPT0gTlVMTCkgcmV0dXJuIERFX05PVF9PSzsKKworICBkaWZmIHw9IF9jb21wQXNzaWduKCZoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bUNvdW50VjAsCisgICAgICAgICAgICAgICAgICAgICAgRkRLcmVhZEJpdHMoaEJzLCA2KSk7CisgIGRpZmYgfD0KKyAgICAgIF9jb21wQXNzaWduKCZoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9Db3VudFYwLCBGREtyZWFkQml0cyhoQnMsIDYpKTsKKworICBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bUNvdW50ID0KKyAgICAgIGZNaW4oaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW1Db3VudFYwLCAoVUNIQVIpMTIpOworICBmb3IgKGkgPSAwOyBpIDwgaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW1Db3VudFYwOyBpKyspIHsKKyAgICBMT1VETkVTU19JTkZPIHRtcExvdWQ7CisgICAgRkRLbWVtY2xlYXIoJnRtcExvdWQsIHNpemVvZihMT1VETkVTU19JTkZPKSk7CisgICAgZXJyID0gX3JlYWRMb3VkbmVzc0luZm8oaEJzLCAwLCAmdG1wTG91ZCk7CisgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgICBpZiAoaSA+PSAxMikgY29udGludWU7CisgICAgaWYgKCFkaWZmKQorICAgICAgZGlmZiB8PSAoRkRLbWVtY21wKCZ0bXBMb3VkLCAmKGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0FsYnVtW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTE9VRE5FU1NfSU5GTykpICE9IDApOworICAgIGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0FsYnVtW2ldID0gdG1wTG91ZDsKKyAgfQorCisgIGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0NvdW50ID0KKyAgICAgIGZNaW4oaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQ291bnRWMCwgKFVDSEFSKTEyKTsKKyAgZm9yIChpID0gMDsgaSA8IGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0NvdW50VjA7IGkrKykgeworICAgIExPVURORVNTX0lORk8gdG1wTG91ZDsKKyAgICBGREttZW1jbGVhcigmdG1wTG91ZCwgc2l6ZW9mKExPVURORVNTX0lORk8pKTsKKyAgICBlcnIgPSBfcmVhZExvdWRuZXNzSW5mbyhoQnMsIDAsICZ0bXBMb3VkKTsKKyAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgIGlmIChpID49IDEyKSBjb250aW51ZTsKKyAgICBpZiAoIWRpZmYpCisgICAgICBkaWZmIHw9IChGREttZW1jbXAoJnRtcExvdWQsICYoaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTE9VRE5FU1NfSU5GTykpICE9IDApOworICAgIGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb1tpXSA9IHRtcExvdWQ7CisgIH0KKworICBkaWZmIHw9IF9jb21wQXNzaWduKCZoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9TZXRFeHRQcmVzZW50LAorICAgICAgICAgICAgICAgICAgICAgIEZES3JlYWRCaXRzKGhCcywgMSkpOworICBoTG91ZG5lc3NJbmZvU2V0LT5kaWZmID0gZGlmZjsKKworICBpZiAoaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvU2V0RXh0UHJlc2VudCkgeworICAgIGVyciA9IF9yZWFkTG91ZG5lc3NJbmZvU2V0RXh0ZW5zaW9uKGhCcywgaExvdWRuZXNzSW5mb1NldCk7CisgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9saWJEUkNkZWMvc3JjL2RyY0RlY19yZWFkZXIuaCBiL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX3JlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYjliNTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJEUkNkZWMvc3JjL2RyY0RlY19yZWFkZXIuaApAQCAtMCwwICsxLDEzMCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHLUQgRFJDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIERSQ0RFQ19SRUFERVJfSAorI2RlZmluZSBEUkNERUNfUkVBREVSX0gKKworI2luY2x1ZGUgImRyY0RlY29kZXIuaCIKKyNpbmNsdWRlICJkcmNEZWNfdHlwZXMuaCIKKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisKK0RSQ19FUlJPUgorZHJjRGVjX3JlYWRVbmlEcmMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0LAorICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZyYW1lU2l6ZSwgY29uc3QgaW50IGRlbHRhVG1pbkRlZmF1bHQsCisgICAgICAgICAgICAgICAgICBIQU5ETEVfVU5JX0RSQ19HQUlOIGhVbmlEcmNHYWluKTsKKworRFJDX0VSUk9SCitkcmNEZWNfcmVhZFVuaURyY0dhaW4oSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLCBjb25zdCBpbnQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkZWx0YVRtaW5EZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0dBSU4gaFVuaURyY0dhaW4pOworCitEUkNfRVJST1IKK2RyY0RlY19yZWFkVW5pRHJjQ29uZmlnKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnKTsKKworRFJDX0VSUk9SCitkcmNEZWNfcmVhZExvdWRuZXNzSW5mb1NldChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliRFJDZGVjL3NyYy9kcmNEZWNfcm9tLmNwcCBiL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX3JvbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY4OTY4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX3JvbS5jcHAKQEAgLTAsMCArMSwzMjMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRy1EIERSQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImRyY0RlY190eXBlcy5oIgorI2luY2x1ZGUgImRyY0RlY19yb20uaCIKKworY29uc3QgU0NIQVIgZGVsdGFHYWluX2NvZGluZ1Byb2ZpbGVfMF8xX2h1ZmZtYW5bMjRdWzJdID0geworICAgIHsxLCAyfSwgICAgezMsIDR9LCAgICAgey02MywgLTY1fSwgezUsIC02Nn0sICAgey02NCwgNn0sICAgey04MCwgN30sCisgICAgezgsIDl9LCAgICB7LTY4LCAxMH0sICB7MTEsIDEyfSwgICB7LTU2LCAtNjd9LCB7LTYxLCAxM30sICB7LTYyLCAtNjl9LAorICAgIHsxNCwgMTV9LCAgezE2LCAtNzJ9LCAgey03MSwgMTd9LCAgey03MCwgLTYwfSwgezE4LCAtNTl9LCAgezE5LCAyMH0sCisgICAgezIxLCAtNzl9LCB7LTU3LCAtNzN9LCB7MjIsIC01OH0sICB7LTc2LCAyM30sICB7LTc1LCAtNzR9LCB7LTc4LCAtNzd9fTsKKworY29uc3QgU0NIQVIgZGVsdGFHYWluX2NvZGluZ1Byb2ZpbGVfMl9odWZmbWFuWzQ4XVsyXSA9IHsKKyAgICB7MSwgMn0sICAgICB7MywgNH0sICAgICB7NSwgNn0sICAgICB7NywgOH0sICAgICB7OSwgMTB9LCAgICB7MTEsIDEyfSwKKyAgICB7MTMsIC02NX0sICB7MTQsIC02NH0sICB7MTUsIC02Nn0sICB7MTYsIC02N30sICB7MTcsIDE4fSwgICB7MTksIC02OH0sCisgICAgezIwLCAtNjN9LCAgey02OSwgMjF9LCAgey01OSwgMjJ9LCAgey02MSwgLTYyfSwgey02MCwgMjN9LCAgezI0LCAtNTh9LAorICAgIHstNzAsIC01N30sIHstNTYsIC03MX0sIHsyNSwgMjZ9LCAgIHsyNywgLTU1fSwgIHstNzIsIDI4fSwgIHstNTQsIDI5fSwKKyAgICB7LTUzLCAzMH0sICB7LTczLCAtNTJ9LCB7MzEsIC03NH0sICB7MzIsIDMzfSwgICB7LTc1LCAzNH0sICB7LTc2LCAzNX0sCisgICAgey01MSwgMzZ9LCAgey03OCwgMzd9LCAgey03NywgMzh9LCAgey05NiwgMzl9LCAgey00OCwgNDB9LCAgey01MCwgLTc5fSwKKyAgICB7NDEsIDQyfSwgICB7LTgwLCAtODF9LCB7LTgyLCA0M30sICB7NDQsIC00OX0sICB7NDUsIC04NH0sICB7LTgzLCAtODl9LAorICAgIHstODYsIDQ2fSwgIHstOTAsIC04NX0sIHstOTEsIC05M30sIHstOTIsIDQ3fSwgIHstODgsIC04N30sIHstOTUsIC05NH19OworCitjb25zdCBGSVhQX1NHTCBzbG9wZVN0ZWVwbmVzc1tdID0ge0ZMMkZYQ09OU1RfU0dMKC0zLjA1MThmIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9TR0woLTEuMjIwN2YgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX1NHTCgtMC40ODgzZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjE5NTNmIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9TR0woLTAuMDc4MWYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX1NHTCgtMC4wMzEyZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjAwNWYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX1NHTCgwLjBmIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9TR0woMC4wMDVmIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9TR0woMC4wMzEyZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfU0dMKDAuMDc4MWYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX1NHTCgwLjE5NTNmIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9TR0woMC40ODgzZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfU0dMKDEuMjIwN2YgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX1NHTCgzLjA1MThmIC8gKGZsb2F0KSgxIDw8IDIpKX07CisKK2NvbnN0IFNDSEFSIHNsb3BlU3RlZXBuZXNzX2h1ZmZtYW5bMTRdWzJdID0geworICAgIHsxLCAtNTd9LCAgey01OCwgMn0sICAgezMsIDR9LCAgICB7NSwgNn0sICAgIHs3LCAtNTZ9LAorICAgIHs4LCAtNjB9LCAgey02MSwgLTU1fSwgezksIC01OX0sICB7MTAsIC01NH0sIHstNjQsIDExfSwKKyAgICB7LTUxLCAxMn0sIHstNjIsIC01MH0sIHstNjMsIDEzfSwgey01MiwgLTUzfX07CisKK2NvbnN0IEZJWFBfREJMIGRvd25taXhDb2VmZltdID0geworICAgIEZMMkZYQ09OU1RfREJMKDEuMDAwMDAwMDAwMCAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC45NDQwNjA4NzYzIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg5MTI1MDkzODEgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODQxMzk1MTQxNiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC43OTQzMjgyMzQ3IC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc0OTg5NDIwOTMgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzA3OTQ1Nzg0NCAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC42NjgzNDM5MTc2IC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYzMDk1NzM0NDUgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTk1NjYyMTQzNSAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC41NjIzNDEzMjUyIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjUzMDg4NDQ0NDIgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTAxMTg3MjMzNiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC40MjE2OTY1MDM0IC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjM1NDgxMzM4OTIgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwMDAwMCAvIChmbG9hdCkoMSA8PCAyKSl9OworCitjb25zdCBGSVhQX0RCTCBkb3dubWl4Q29lZmZWMVtdID0geworICAgIEZMMkZYQ09OU1RfREJMKDMuMTYyMjc3NjYwMiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMS45OTUyNjIzMTUwIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgxLjY3ODgwNDAxODEgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDEuNDEyNTM3NTQ0NiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMS4xODg1MDIyMjc0IC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgxLjAwMDAwMDAwMDAgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTQ0MDYwODc2MyAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC44OTEyNTA5MzgxIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg0MTM5NTE0MTYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzk0MzI4MjM0NyAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC43NDk4OTQyMDkzIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjcwNzk0NTc4NDQgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjY4MzQzOTE3NiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MzA5NTczNDQ1IC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU5NTY2MjE0MzUgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTYyMzQxMzI1MiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC41MzA4ODQ0NDQyIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjUwMTE4NzIzMzYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDczMTUxMjU5MCAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC40NDY2ODM1OTIyIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQyMTY5NjUwMzQgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuMzk4MTA3MTcwNiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC4zNTQ4MTMzODkyIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjMxNjIyNzc2NjAgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuMjgxODM4MjkzMSAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC4yNTExODg2NDMyIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjE3NzgyNzk0MTAgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuMTAwMDAwMDAwMCAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC4wNTYyMzQxMzI1IC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjAzMTYyMjc3NjYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuMDEwMDAwMDAwMCAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDAwMDAwIC8gKGZsb2F0KSgxIDw8IDIpKX07CisKK2NvbnN0IENVU1RPTV9EUkNfQ0hBUl9TSUdNT0lEIGNpY3BEcmNDaGFyU2lnbW9pZExlZnRbXSA9IHsKKyAgICB7RkwyRlhDT05TVF9TR0woMzIuMGYgLyAoZmxvYXQpKDEgPDwgNikpLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjBmIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICAgRkwyRlhDT05TVF9TR0woOS4wZiAvIChmbG9hdCkoMSA8PCA1KSksIDB9LCAvKiAxICovCisgICAge0ZMMkZYQ09OU1RfU0dMKDMyLjBmIC8gKGZsb2F0KSgxIDw8IDYpKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4yZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgIEZMMkZYQ09OU1RfU0dMKDkuMGYgLyAoZmxvYXQpKDEgPDwgNSkpLCAwfSwgLyogMiAqLworICAgIHtGTDJGWENPTlNUX1NHTCgzMi4wZiAvIChmbG9hdCkoMSA8PCA2KSksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNGYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICBGTDJGWENPTlNUX1NHTCg5LjBmIC8gKGZsb2F0KSgxIDw8IDUpKSwgMH0sIC8qIDMgKi8KKyAgICB7RkwyRlhDT05TVF9TR0woMzIuMGYgLyAoZmxvYXQpKDEgPDwgNikpLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjZmIC8gKGZsb2F0KSgxIDw8IDIpKSwKKyAgICAgRkwyRlhDT05TVF9TR0woOS4wZiAvIChmbG9hdCkoMSA8PCA1KSksIDB9LCAvKiA0ICovCisgICAge0ZMMkZYQ09OU1RfU0dMKDMyLjBmIC8gKGZsb2F0KSgxIDw8IDYpKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44ZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgIEZMMkZYQ09OU1RfU0dMKDYuMGYgLyAoZmxvYXQpKDEgPDwgNSkpLCAwfSwgLyogNSAqLworICAgIHtGTDJGWENPTlNUX1NHTCgzMi4wZiAvIChmbG9hdCkoMSA8PCA2KSksCisgICAgIEZMMkZYQ09OU1RfU0dMKDEuMGYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICBGTDJGWENPTlNUX1NHTCg1LjBmIC8gKGZsb2F0KSgxIDw8IDUpKSwgMH0sIC8qIDYgKi8KK307CisKK2NvbnN0IENVU1RPTV9EUkNfQ0hBUl9TSUdNT0lEIGNpY3BEcmNDaGFyU2lnbW9pZFJpZ2h0W10gPSB7CisgICAge0ZMMkZYQ09OU1RfU0dMKC0zMi4wZiAvIChmbG9hdCkoMSA8PCA2KSksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMGYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICBGTDJGWENPTlNUX1NHTCgxMi4wZiAvIChmbG9hdCkoMSA8PCA1KSksIDB9LCAvKiAxICovCisgICAge0ZMMkZYQ09OU1RfU0dMKC0zMi4wZiAvIChmbG9hdCkoMSA8PCA2KSksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMmYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICBGTDJGWENPTlNUX1NHTCgxMi4wZiAvIChmbG9hdCkoMSA8PCA1KSksIDB9LCAvKiAyICovCisgICAge0ZMMkZYQ09OU1RfU0dMKC0zMi4wZiAvIChmbG9hdCkoMSA8PCA2KSksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNGYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICBGTDJGWENPTlNUX1NHTCgxMi4wZiAvIChmbG9hdCkoMSA8PCA1KSksIDB9LCAvKiAzICovCisgICAge0ZMMkZYQ09OU1RfU0dMKC0zMi4wZiAvIChmbG9hdCkoMSA8PCA2KSksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNmYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICBGTDJGWENPTlNUX1NHTCgxMC4wZiAvIChmbG9hdCkoMSA8PCA1KSksIDB9LCAvKiA0ICovCisgICAge0ZMMkZYQ09OU1RfU0dMKC0zMi4wZiAvIChmbG9hdCkoMSA8PCA2KSksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOGYgLyAoZmxvYXQpKDEgPDwgMikpLAorICAgICBGTDJGWENPTlNUX1NHTCg4LjBmIC8gKGZsb2F0KSgxIDw8IDUpKSwgMH0sIC8qIDUgKi8KKyAgICB7RkwyRlhDT05TVF9TR0woLTMyLjBmIC8gKGZsb2F0KSgxIDw8IDYpKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMS4wZiAvIChmbG9hdCkoMSA8PCAyKSksCisgICAgIEZMMkZYQ09OU1RfU0dMKDYuMGYgLyAoZmxvYXQpKDEgPDwgNSkpLCAwfSwgLyogNiAqLworfTsKKworY29uc3QgQ1VTVE9NX0RSQ19DSEFSX05PREVTIGNpY3BEcmNDaGFyTm9kZXNMZWZ0W10gPSB7CisgICAgezIsCisgICAgIHtGTDJGWENPTlNUX1NHTCgtMzEuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTQxLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC01My4wZiAvIChmbG9hdCkoMSA8PCA3KSl9LAorICAgICB7RkwyRlhDT05TVF9TR0woMC4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgwLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDYuMGYgLyAoZmxvYXQpKDEgPDwgNykpfX0sIC8qIDcgKi8KKyAgICB7MSwKKyAgICAge0ZMMkZYQ09OU1RfU0dMKC0zMS4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgtNDMuMGYgLyAoZmxvYXQpKDEgPDwgNykpfSwKKyAgICAge0ZMMkZYQ09OU1RfU0dMKDAuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woNi4wZiAvIChmbG9hdCkoMSA8PCA3KSl9fSwgLyogOCAqLworICAgIHsyLAorICAgICB7RkwyRlhDT05TVF9TR0woLTMxLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC00MS4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgtNjUuMGYgLyAoZmxvYXQpKDEgPDwgNykpfSwKKyAgICAge0ZMMkZYQ09OU1RfU0dMKDAuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woMC4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgxMi4wZiAvIChmbG9hdCkoMSA8PCA3KSl9fSwgLyogOSAqLworICAgIHsxLAorICAgICB7RkwyRlhDT05TVF9TR0woLTMxLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC01NS4wZiAvIChmbG9hdCkoMSA8PCA3KSl9LAorICAgICB7RkwyRlhDT05TVF9TR0woMC4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgxMi4wZiAvIChmbG9hdCkoMSA8PCA3KSl9fSwgLyogMTAgKi8KKyAgICB7MSwKKyAgICAge0ZMMkZYQ09OU1RfU0dMKC0zMS4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgtNTAuMGYgLyAoZmxvYXQpKDEgPDwgNykpfSwKKyAgICAge0ZMMkZYQ09OU1RfU0dMKDAuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woMTUuMGYgLyAoZmxvYXQpKDEgPDwgNykpfX0gLyogMTEgKi8KK307CisKK2NvbnN0IENVU1RPTV9EUkNfQ0hBUl9OT0RFUyBjaWNwRHJjQ2hhck5vZGVzUmlnaHRbXSA9IHsKKyAgICB7NCwKKyAgICAge0ZMMkZYQ09OU1RfU0dMKC0zMS4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgtMjEuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTExLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDkuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woMTkuMGYgLyAoZmxvYXQpKDEgPDwgNykpfSwKKyAgICAge0ZMMkZYQ09OU1RfU0dMKDAuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woMC4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgtNS4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgtMjQuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTM0LjBmIC8gKGZsb2F0KSgxIDw8IDcpKX19LCAvKiA3ICovCisgICAgezQsCisgICAgIHtGTDJGWENPTlNUX1NHTCgtMzEuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTI2LjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC0xNi4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCg0LjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDE0LjBmIC8gKGZsb2F0KSgxIDw8IDcpKX0sCisgICAgIHtGTDJGWENPTlNUX1NHTCgwLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDAuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTUuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTI0LjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC0zNC4wZiAvIChmbG9hdCkoMSA8PCA3KSl9fSwgLyogOCAqLworICAgIHszLAorICAgICB7RkwyRlhDT05TVF9TR0woLTMxLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC0yMS4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCg5LjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDI5LjBmIC8gKGZsb2F0KSgxIDw8IDcpKX0sCisgICAgIHtGTDJGWENPTlNUX1NHTCgwLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDAuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTE1LjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC0zNS4wZiAvIChmbG9hdCkoMSA8PCA3KSl9fSwgLyogOSAqLworICAgIHs0LAorICAgICB7RkwyRlhDT05TVF9TR0woLTMxLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC0yNi4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgtMTYuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woNC4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgxNC4wZiAvIChmbG9hdCkoMSA8PCA3KSl9LAorICAgICB7RkwyRlhDT05TVF9TR0woMC4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgwLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC01LjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC0yNC4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCgtMzQuMGYgLyAoZmxvYXQpKDEgPDwgNykpfX0sIC8qIDEwICovCisgICAgezQsCisgICAgIHtGTDJGWENPTlNUX1NHTCgtMzEuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTI2LjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC0xNi4wZiAvIChmbG9hdCkoMSA8PCA3KSksCisgICAgICBGTDJGWENPTlNUX1NHTCg0LjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDE0LjBmIC8gKGZsb2F0KSgxIDw8IDcpKX0sCisgICAgIHtGTDJGWENPTlNUX1NHTCgwLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDAuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTUuMGYgLyAoZmxvYXQpKDEgPDwgNykpLAorICAgICAgRkwyRlhDT05TVF9TR0woLTI0LjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKC0zNC4wZiAvIChmbG9hdCkoMSA8PCA3KSl9fSAvKiAxMSAqLworfTsKZGlmZiAtLWdpdCBhL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX3JvbS5oIGIvbGliRFJDZGVjL3NyYy9kcmNEZWNfcm9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlZTg4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX3JvbS5oCkBAIC0wLDAgKzEsMTIwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUctRCBEUkMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRFJDREVDX1JPTV9ICisjZGVmaW5lIERSQ0RFQ19ST01fSAorCitleHRlcm4gY29uc3QgU0NIQVIgZGVsdGFHYWluX2NvZGluZ1Byb2ZpbGVfMF8xX2h1ZmZtYW5bMjRdWzJdOworZXh0ZXJuIGNvbnN0IFNDSEFSIGRlbHRhR2Fpbl9jb2RpbmdQcm9maWxlXzJfaHVmZm1hbls0OF1bMl07CisKK2V4dGVybiBjb25zdCBGSVhQX1NHTCBzbG9wZVN0ZWVwbmVzc1tdOworZXh0ZXJuIGNvbnN0IFNDSEFSIHNsb3BlU3RlZXBuZXNzX2h1ZmZtYW5bMTRdWzJdOworCitleHRlcm4gY29uc3QgRklYUF9EQkwgZG93bm1peENvZWZmW107CitleHRlcm4gY29uc3QgRklYUF9EQkwgZG93bm1peENvZWZmVjFbXTsKKworZXh0ZXJuIGNvbnN0IENVU1RPTV9EUkNfQ0hBUl9TSUdNT0lEIGNpY3BEcmNDaGFyU2lnbW9pZExlZnRbXTsKK2V4dGVybiBjb25zdCBDVVNUT01fRFJDX0NIQVJfU0lHTU9JRCBjaWNwRHJjQ2hhclNpZ21vaWRSaWdodFtdOworZXh0ZXJuIGNvbnN0IENVU1RPTV9EUkNfQ0hBUl9OT0RFUyBjaWNwRHJjQ2hhck5vZGVzTGVmdFtdOworZXh0ZXJuIGNvbnN0IENVU1RPTV9EUkNfQ0hBUl9OT0RFUyBjaWNwRHJjQ2hhck5vZGVzUmlnaHRbXTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJEUkNkZWMvc3JjL2RyY0RlY19zZWxlY3Rpb25Qcm9jZXNzLmNwcCBiL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX3NlbGVjdGlvblByb2Nlc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YjczMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJEUkNkZWMvc3JjL2RyY0RlY19zZWxlY3Rpb25Qcm9jZXNzLmNwcApAQCAtMCwwICsxLDMwODMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRy1EIERSQyBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEFuZHJlYXMgSG9lbHplcgorCisgICBEZXNjcmlwdGlvbjogRFJDIFNldCBTZWxlY3Rpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImRyY0RlY19zZWxlY3Rpb25Qcm9jZXNzLmgiCisjaW5jbHVkZSAiZHJjRGVjX3Rvb2xzLmgiCisKKyNkZWZpbmUgVU5ERUZJTkVEX0xPVURORVNTX1ZBTFVFIChGSVhQX0RCTCkgTUFYVkFMX0RCTAorCit0eXBlZGVmIGVudW0geworICBERVRSX05PTkUgPSAwLAorICBERVRSX05JR0hUID0gMSwKKyAgREVUUl9OT0lTWSA9IDIsCisgIERFVFJfTElNSVRFRCA9IDMsCisgIERFVFJfTE9XTEVWRUwgPSA0LAorICBERVRSX0RJQUxPRyA9IDUsCisgIERFVFJfR0VORVJBTF9DT01QUiA9IDYsCisgIERFVFJfRVhQQU5EID0gNywKKyAgREVUUl9BUlRJU1RJQyA9IDgsCisgIERFVFJfQ09VTlQKK30gRFJDX0VGRkVDVF9UWVBFX1JFUVVFU1Q7CisKK3R5cGVkZWYgZW51bSB7CisgIERGUlRfRUZGRUNUX1RZUEUsCisgIERGUlRfRFlOQU1JQ19SQU5HRSwKKyAgREZSVF9EUkNfQ0hBUkFDVEVSSVNUSUMKK30gRFJDX0ZFQVRVUkVfUkVRVUVTVF9UWVBFOworCit0eXBlZGVmIGVudW0geworICBNRFJfREVGQVVMVCA9IDAsCisgIE1EUl9QUk9HUkFNX0xPVURORVNTID0gMSwKKyAgTURSX0FOQ0hPUl9MT1VETkVTUyA9IDIKK30gTUVUSE9EX0RFRklOSVRJT05fUkVRVUVTVDsKKwordHlwZWRlZiBlbnVtIHsKKyAgTVNSX0RFRkFVTFQgPSAwLAorICBNU1JfQlNfMTc3MF80ID0gMSwKKyAgTVNSX1VTRVIgPSAyLAorICBNU1JfRVhQRVJUX1BBTkVMID0gMywKKyAgTVNSX1JFU0VSVkVEX0EgPSA0LAorICBNU1JfUkVTRVJWRURfQiA9IDUsCisgIE1TUl9SRVNFUlZFRF9DID0gNiwKKyAgTVNSX1JFU0VSVkVEX0QgPSA3LAorICBNU1JfUkVTRVJWRURfRSA9IDgKK30gTUVBU1VSRU1FTlRfU1lTVEVNX1JFUVVFU1Q7CisKK3R5cGVkZWYgZW51bSB7CisgIExQUl9ERUZBVUxUID0gMCwKKyAgTFBSX09GRiA9IDEsCisgIExQUl9ISUdIUEFTUyA9IDIKK30gTE9VRE5FU1NfUFJFUFJPQ0VTU0lOR19SRVFVRVNUOworCit0eXBlZGVmIGVudW0geworICBEUk1SVF9TSE9SVF9URVJNX0xPVURORVNTX1RPX0FWRyA9IDAsCisgIERSTVJUX01PTUVOVEFSWV9MT1VETkVTU19UT19BVkcgPSAxLAorICBEUk1SVF9UT1BfT0ZfTE9VRE5FU1NfUkFOR0VfVE9fQVZHID0gMgorfSBEWU5fUkFOR0VfTUVBU1VSRU1FTlRfUkVRVUVTVF9UWVBFOworCit0eXBlZGVmIGVudW0geworICBUQ1JUX0RPV05NSVhfSUQgPSAwLAorICBUQ1JUX1RBUkdFVF9MQVlPVVQgPSAxLAorICBUQ1JUX1RBUkdFVF9DSEFOTkVMX0NPVU5UID0gMgorfSBUQVJHRVRfQ09ORklHX1JFUVVFU1RfVFlQRTsKKwordHlwZWRlZiBzaG91bGRCZVVuaW9uIHsKKyAgc3RydWN0IHsKKyAgICBVQ0hBUiBudW1SZXF1ZXN0czsKKyAgICBVQ0hBUiBudW1SZXF1ZXN0c0Rlc2lyZWQ7CisgICAgRFJDX0VGRkVDVF9UWVBFX1JFUVVFU1QgcmVxdWVzdFtNQVhfUkVRVUVTVFNfRFJDX0VGRkVDVF9UWVBFXTsKKyAgfSBkcmNFZmZlY3RUeXBlOworICBzdHJ1Y3QgeworICAgIERZTl9SQU5HRV9NRUFTVVJFTUVOVF9SRVFVRVNUX1RZUEUgbWVhc3VyZW1lbnRSZXF1ZXN0VHlwZTsKKyAgICBVQ0hBUiByZXF1ZXN0ZWRJc1JhbmdlOworICAgIEZJWFBfREJMIHJlcXVlc3RWYWx1ZTsgICAgLyogZSA9IDcgKi8KKyAgICBGSVhQX0RCTCByZXF1ZXN0VmFsdWVNaW47IC8qIGUgPSA3ICovCisgICAgRklYUF9EQkwgcmVxdWVzdFZhbHVlTWF4OyAvKiBlID0gNyAqLworICB9IGR5bmFtaWNSYW5nZTsKKyAgVUNIQVIgZHJjQ2hhcmFjdGVyaXN0aWM7Cit9CitEUkNfRkVBVFVSRV9SRVFVRVNUOworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIHN5c3RlbSBwYXJhbWV0ZXJzICovCisgIFNDSEFSIGJhc2VDaGFubmVsQ291bnQ7CisgIFNDSEFSIGJhc2VMYXlvdXQ7IC8qIG5vdCBzdXBwb3J0ZWQgKi8KKyAgVEFSR0VUX0NPTkZJR19SRVFVRVNUX1RZUEUgdGFyZ2V0Q29uZmlnUmVxdWVzdFR5cGU7CisgIFVDSEFSIG51bURvd25taXhJZFJlcXVlc3RzOworICBVQ0hBUiBkb3dubWl4SWRSZXF1ZXN0ZWRbTUFYX1JFUVVFU1RTX0RPV05NSVhfSURdOworICBVQ0hBUiB0YXJnZXRMYXlvdXRSZXF1ZXN0ZWQ7CisgIFVDSEFSIHRhcmdldENoYW5uZWxDb3VudFJlcXVlc3RlZDsKKyAgTE9ORyBhdWRpb1NhbXBsZVJhdGU7IC8qIG5lZWRlZCBmb3IgY29tcGxleGl0eSBlc3RpbWF0aW9uLCBjdXJyZW50bHkgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgKi8KKworICAvKiBsb3VkbmVzcyBub3JtYWxpemF0aW9uIHBhcmFtZXRlcnMgKi8KKyAgVUNIQVIgbG91ZG5lc3NOb3JtYWxpemF0aW9uT247CisgIEZJWFBfREJMIHRhcmdldExvdWRuZXNzOyAvKiBlID0gNyAqLworICBVQ0hBUiBhbGJ1bU1vZGU7CisgIFVDSEFSIHBlYWtMaW1pdGVyUHJlc2VudDsKKyAgVUNIQVIgbG91ZG5lc3NEZXZpYXRpb25NYXg7IC8qIHJlc29sdXRpb246IDEgZEIgKi8KKyAgTUVUSE9EX0RFRklOSVRJT05fUkVRVUVTVCBsb3VkbmVzc01lYXN1cmVtZW50TWV0aG9kOworICBNRUFTVVJFTUVOVF9TWVNURU1fUkVRVUVTVCBsb3VkbmVzc01lYXN1cmVtZW50U3lzdGVtOworICBMT1VETkVTU19QUkVQUk9DRVNTSU5HX1JFUVVFU1QgbG91ZG5lc3NNZWFzdXJlbWVudFByZVByb2M7IC8qIG5vdCBzdXBwb3J0ZWQgKi8KKyAgTE9ORyBkZXZpY2VDdXRPZmZGcmVxdWVuY3k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3Qgc3VwcG9ydGVkICovCisgIEZJWFBfREJMIGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYk1heDsgICAgICAgICAgICAgICAgICAgLyogZSA9IDcgKi8KKyAgRklYUF9EQkwgbG91ZG5lc3NOb3JtYWxpemF0aW9uR2Fpbk1vZGlmaWNhdGlvbkRiOyAgICAgICAgICAvKiBlID0gNyAqLworICBGSVhQX0RCTCBvdXRwdXRQZWFrTGV2ZWxNYXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGUgPSA3ICovCisKKyAgLyogZHluYW1pYyByYW5nZSBjb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgVUNIQVIgZHluYW1pY1JhbmdlQ29udHJvbE9uOworICBVQ0hBUiBudW1EcmNGZWF0dXJlUmVxdWVzdHM7CisgIERSQ19GRUFUVVJFX1JFUVVFU1RfVFlQRSBkcmNGZWF0dXJlUmVxdWVzdFR5cGVbTUFYX1JFUVVFU1RTX0RSQ19GRUFUVVJFXTsKKyAgRFJDX0ZFQVRVUkVfUkVRVUVTVCBkcmNGZWF0dXJlUmVxdWVzdFtNQVhfUkVRVUVTVFNfRFJDX0ZFQVRVUkVdOworCisgIC8qIG90aGVyICovCisgIEZJWFBfU0dMIGJvb3N0OyAgICAgICAgICAgICAgICAvKiBlID0gMSAqLworICBGSVhQX1NHTCBjb21wcmVzczsgICAgICAgICAgICAgLyogZSA9IDEgKi8KKyAgVUNIQVIgZHJjQ2hhcmFjdGVyaXN0aWNUYXJnZXQ7IC8qIG5vdCBzdXBwb3J0ZWQgKi8KK30gU0VMX1BST0NfSU5QVVQsICpIQU5ETEVfU0VMX1BST0NfSU5QVVQ7CisKKy8qIFRhYmxlIEUuMSBvZiBJU08vSUVDIERJUyAyMzAwMy00OiBSZWNvbW1lbmRlZCBvcmRlciBvZiBmYWxsYmFjayBlZmZlY3QgdHlwZQorICogcmVxdWVzdHMgKi8KK3N0YXRpYyBEUkNfRUZGRUNUX1RZUEVfUkVRVUVTVCBmYWxsYmFja0VmZmVjdFR5cGVSZXF1ZXN0c1s2XVs1XSA9IHsKKyAgICAvKiBOaWdodCAqLyB7REVUUl9HRU5FUkFMX0NPTVBSLCBERVRSX05PSVNZLCBERVRSX0xJTUlURUQsIERFVFJfTE9XTEVWRUwsCisgICAgICAgICAgICAgICAgIERFVFJfRElBTE9HfSwKKyAgICAvKiBOb2lzeSAqLworICAgIHtERVRSX0dFTkVSQUxfQ09NUFIsIERFVFJfTklHSFQsIERFVFJfTElNSVRFRCwgREVUUl9MT1dMRVZFTCwgREVUUl9ESUFMT0d9LAorICAgIC8qIExpbWl0ZWQgKi8KKyAgICB7REVUUl9HRU5FUkFMX0NPTVBSLCBERVRSX05JR0hULCBERVRSX05PSVNZLCBERVRSX0xPV0xFVkVMLCBERVRSX0RJQUxPR30sCisgICAgLyogTG93TGV2ZWwgKi8KKyAgICB7REVUUl9HRU5FUkFMX0NPTVBSLCBERVRSX05PSVNZLCBERVRSX05JR0hULCBERVRSX0xJTUlURUQsIERFVFJfRElBTE9HfSwKKyAgICAvKiBEaWFsb2cgKi8KKyAgICB7REVUUl9HRU5FUkFMX0NPTVBSLCBERVRSX05JR0hULCBERVRSX05PSVNZLCBERVRSX0xJTUlURUQsIERFVFJfTE9XTEVWRUx9LAorICAgIC8qIEdlbmVyYWwgKi8KKyAgICB7REVUUl9OSUdIVCwgREVUUl9OT0lTWSwgREVUUl9MSU1JVEVELCBERVRSX0xPV0xFVkVMLCBERVRSX0RJQUxPR319OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgc2VsZWN0aW9uRmxhZzsKKyAgVUNIQVIgZG93bm1peElkUmVxdWVzdEluZGV4OworICBGSVhQX0RCTCBvdXRwdXRQZWFrTGV2ZWw7ICAgICAgICAgICAgICAgICAgICAgLyogZSA9IDcgKi8KKyAgRklYUF9EQkwgbG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiQWRqdXN0ZWQ7IC8qIGUgPSA3ICovCisgIEZJWFBfREJMIG91dHB1dExvdWRuZXNzOyAgICAgICAgICAgICAgICAgICAgICAvKiBlID0gNyAqLworICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBJbnN0OworCit9IERSQ0RFQ19TRUxFQ1RJT05fREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBudW1EYXRhOworICBEUkNERUNfU0VMRUNUSU9OX0RBVEEgZGF0YVsoMTIgKyAxICsgNildOworCit9IERSQ0RFQ19TRUxFQ1RJT047CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogaGVscGVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBfaXNFcnJvcihpbnQgeCkgeworICBpZiAoeCA8IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19XQVJOSU5HKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICByZXR1cm4gMDsKK30KKworLyogY29tcGFyZSBhbmQgYXNzaWduICovCitzdGF0aWMgaW5saW5lIGludCBfY29tcEFzc2lnbihVQ0hBUiogZGVzdCwgY29uc3QgVUNIQVIgc3JjKSB7CisgIGludCBkaWZmID0gMDsKKyAgaWYgKCpkZXN0ICE9IHNyYykgZGlmZiA9IDE7CisgICpkZXN0ID0gc3JjOworICByZXR1cm4gZGlmZjsKK30KKworc3RhdGljIGlubGluZSBpbnQgX2NvbXBBc3NpZ24oU0NIQVIqIGRlc3QsIGNvbnN0IFNDSEFSIHNyYykgeworICBpbnQgZGlmZiA9IDA7CisgIGlmICgqZGVzdCAhPSBzcmMpIGRpZmYgPSAxOworICAqZGVzdCA9IHNyYzsKKyAgcmV0dXJuIGRpZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9jb21wQXNzaWduKEZJWFBfREJMKiBkZXN0LCBjb25zdCBGSVhQX0RCTCBzcmMpIHsKKyAgaW50IGRpZmYgPSAwOworICBpZiAoKmRlc3QgIT0gc3JjKSBkaWZmID0gMTsKKyAgKmRlc3QgPSBzcmM7CisgIHJldHVybiBkaWZmOworfQorCitzdGF0aWMgaW5saW5lIGludCBfY29tcEFzc2lnbihGSVhQX1NHTCogZGVzdCwgY29uc3QgRklYUF9TR0wgc3JjKSB7CisgIGludCBkaWZmID0gMDsKKyAgaWYgKCpkZXN0ICE9IHNyYykgZGlmZiA9IDE7CisgICpkZXN0ID0gc3JjOworICByZXR1cm4gZGlmZjsKK30KKworc3RhdGljIGlubGluZSBpbnQgX2NvbXBBc3NpZ24oVEFSR0VUX0NPTkZJR19SRVFVRVNUX1RZUEUqIGRlc3QsIGNvbnN0IGludCBzcmMpIHsKKyAgaW50IGRpZmYgPSAwOworICBpZiAoKmRlc3QgIT0gc3JjKSBkaWZmID0gMTsKKyAgKmRlc3QgPSAoVEFSR0VUX0NPTkZJR19SRVFVRVNUX1RZUEUpc3JjOworICByZXR1cm4gZGlmZjsKK30KKworc3RhdGljIGlubGluZSBpbnQgX2NvbXBBc3NpZ24oTUVUSE9EX0RFRklOSVRJT05fUkVRVUVTVCogZGVzdCwgY29uc3QgaW50IHNyYykgeworICBpbnQgZGlmZiA9IDA7CisgIGlmICgqZGVzdCAhPSBzcmMpIGRpZmYgPSAxOworICAqZGVzdCA9IChNRVRIT0RfREVGSU5JVElPTl9SRVFVRVNUKXNyYzsKKyAgcmV0dXJuIGRpZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9jb21wQXNzaWduKERSQ19GRUFUVVJFX1JFUVVFU1RfVFlQRSogZGVzdCwgY29uc3QgaW50IHNyYykgeworICBpbnQgZGlmZiA9IDA7CisgIGlmICgqZGVzdCAhPSBzcmMpIGRpZmYgPSAxOworICAqZGVzdCA9IChEUkNfRkVBVFVSRV9SRVFVRVNUX1RZUEUpc3JjOworICByZXR1cm4gZGlmZjsKK30KKworc3RhdGljIGlubGluZSBpbnQgX2NvbXBBc3NpZ24oRFJDX0VGRkVDVF9UWVBFX1JFUVVFU1QqIGRlc3QsIGNvbnN0IGludCBzcmMpIHsKKyAgaW50IGRpZmYgPSAwOworICBpZiAoKmRlc3QgIT0gc3JjKSBkaWZmID0gMTsKKyAgKmRlc3QgPSAoRFJDX0VGRkVDVF9UWVBFX1JFUVVFU1Qpc3JjOworICByZXR1cm4gZGlmZjsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fREFUQSogX2RyY2RlY19zZWxlY3Rpb25fYWRkTmV3KAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBTZWxlY3Rpb24pOworCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBfZHJjZGVjX3NlbGVjdGlvbl9hZGQoCisgICAgRFJDREVDX1NFTEVDVElPTiogcFNlbGVjdGlvbiwgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBwRGF0YUluKTsKKworc3RhdGljIGludCBfZHJjZGVjX3NlbGVjdGlvbl9jbGVhcihEUkNERUNfU0VMRUNUSU9OKiBwU2VsZWN0aW9uKTsKKworc3RhdGljIGludCBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIoRFJDREVDX1NFTEVDVElPTiogcFNlbGVjdGlvbik7CisKK3N0YXRpYyBpbnQgX2RyY2RlY19zZWxlY3Rpb25fc2V0TnVtYmVyKERSQ0RFQ19TRUxFQ1RJT04qIHBTZWxlY3Rpb24sIGludCBudW0pOworCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBfZHJjZGVjX3NlbGVjdGlvbl9nZXRBdCgKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwU2VsZWN0aW9uLCBpbnQgYXQpOworCitzdGF0aWMgaW50IF9zd2FwU2VsZWN0aW9uQW5kQ2xlYXIoRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUkNERUNfU0VMRUNUSU9OKiogcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworCitzdGF0aWMgaW50IF9zd2FwU2VsZWN0aW9uKERSQ0RFQ19TRUxFQ1RJT04qKiBwcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERSQ0RFQ19TRUxFQ1RJT04qKiBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZGVjbGFyYXRpb25zIG9mIHN0YXRpYyBmdW5jdGlvbnMgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2luaXREZWZhdWx0UGFyYW1zKAorICAgIEhBTkRMRV9TRUxfUFJPQ19JTlBVVCBoU2VsUHJvY0lucHV0KTsKKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2luaXRDb2RlY01vZGVQYXJhbXMoCisgICAgSEFORExFX1NFTF9QUk9DX0lOUFVUIGhTZWxQcm9jSW5wdXQsIGNvbnN0IFNFTF9QUk9DX0NPREVDX01PREUgY29kZWNNb2RlKTsKKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2RyY1NldFByZVNlbGVjdGlvbigKKyAgICBTRUxfUFJPQ19JTlBVVCogaFNlbFByb2NJbnB1dCwgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsCisgICAgRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiogcHBDYW5kaWRhdGVzU2VsZWN0ZWQsIFNFTF9QUk9DX0NPREVDX01PREUgY29kZWNNb2RlKTsKKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2RyY1NldEZpbmFsU2VsZWN0aW9uX3BlYWtWYWx1ZTAoCisgICAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9keW5hbWljUmFuZ2VNZWFzdXJlbWVudCgKKyAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCwgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwSW5zdCwKKyAgICBVQ0hBUiBkb3dubWl4SWRSZXF1ZXN0ZWQsCisgICAgRFlOX1JBTkdFX01FQVNVUkVNRU5UX1JFUVVFU1RfVFlQRSBkeW5hbWljUmFuZ2VNZWFzdXJlbWVudFR5cGUsCisgICAgaW50IGFsYnVtTW9kZSwgaW50KiBwZWFrVG9BdmVyYWdlUHJlc2VudCwgRklYUF9EQkwqIHBlYWtUb0F2ZXJhZ2UpOworCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfY2hhbm5lbExheW91dFRvRG93bm1peElkTWFwcGluZygKKyAgICBIQU5ETEVfU0VMX1BST0NfSU5QVVQgaFNlbFByb2NJbnB1dCwgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcpOworCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZ2VuZXJhdGVWaXJ0dWFsRHJjU2V0cygKKyAgICBIQU5ETEVfU0VMX1BST0NfSU5QVVQgaFNlbFByb2NJbnB1dCwgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgU0VMX1BST0NfQ09ERUNfTU9ERSBjb2RlY01vZGUpOworCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZHJjU2V0UmVxdWVzdFNlbGVjdGlvbigKKyAgICBTRUxfUFJPQ19JTlBVVCogaFNlbFByb2NJbnB1dCwgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsCisgICAgRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiogcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZHJjU2V0RmluYWxTZWxlY3Rpb24oCisgICAgSEFORExFX1NFTF9QUk9DX0lOUFVUIGhTZWxQcm9jSW5wdXQsIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLAorICAgIERSQ0RFQ19TRUxFQ1RJT04qKiBwcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1NlbGVjdGVkLCBTRUxfUFJPQ19DT0RFQ19NT0RFIGNvZGVjTW9kZSk7CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9nZW5lcmF0ZU91dHB1dEluZm8oCisgICAgSEFORExFX1NFTF9QUk9DX0lOUFVUIGhTZWxQcm9jSW5wdXQsIEhBTkRMRV9TRUxfUFJPQ19PVVRQVVQgaFNlbFByb2NPdXRwdXQsCisgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsCisgICAgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBwU2VsZWN0aW9uRGF0YSwgU0VMX1BST0NfQ09ERUNfTU9ERSBjb2RlY01vZGUpOworCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfc2VsZWN0RG93bm1peE1hdHJpeCgKKyAgICBIQU5ETEVfU0VMX1BST0NfT1VUUFVUIGhTZWxQcm9jT3V0cHV0LCBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZyk7CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9nZXRMb3VkbmVzcygKKyAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCwgaW50IGFsYnVtTW9kZSwKKyAgICBNRVRIT0RfREVGSU5JVElPTl9SRVFVRVNUIG1lYXN1cmVtZW50TWV0aG9kUmVxdWVzdGVkLAorICAgIE1FQVNVUkVNRU5UX1NZU1RFTV9SRVFVRVNUIG1lYXN1cmVtZW50U3lzdGVtUmVxdWVzdGVkLAorICAgIEZJWFBfREJMIHRhcmdldExvdWRuZXNzLCBpbnQgZHJjU2V0SWQsIGludCBkb3dubWl4SWRSZXF1ZXN0ZWQsCisgICAgRklYUF9EQkwqIHBMb3VkbmVzc05vcm1hbGl6YXRpb25HYWluLCBGSVhQX0RCTCogcExvdWRuZXNzKTsKKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2dldE1peGluZ0xldmVsKAorICAgIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0LCBpbnQgZG93bm1peElkUmVxdWVzdGVkLAorICAgIGludCBkcmNTZXRJZFJlcXVlc3RlZCwgaW50IGFsYnVtTW9kZSwgRklYUF9EQkwqIHBNaXhpbmdMZXZlbCk7CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9nZXRTaWduYWxQZWFrTGV2ZWwoCisgICAgSEFORExFX1NFTF9QUk9DX0lOUFVUIGhTZWxQcm9jSW5wdXQsIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLAorICAgIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0LCBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBJbnN0LAorICAgIGludCBkb3dubWl4SWRSZXF1ZXN0ZWQsIGludCogZXhwbGljaXRQZWFrSW5mb3JtYXRpb25QcmVzZW50LAorICAgIEZJWFBfREJMKiBzaWduYWxQZWFrTGV2ZWxPdXQsIC8qIGUgPSA3ICovCisgICAgU0VMX1BST0NfQ09ERUNfTU9ERSBjb2RlY01vZGUpOworCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZXh0cmFjdExvdWRuZXNzUGVha1RvQXZlcmFnZVZhbHVlKAorICAgIExPVURORVNTX0lORk8qIGxvdWRuZXNzSW5mbywKKyAgICBEWU5fUkFOR0VfTUVBU1VSRU1FTlRfUkVRVUVTVF9UWVBFIGR5bmFtaWNSYW5nZU1lYXN1cmVtZW50VHlwZSwKKyAgICBpbnQqIHBMb3VkbmVzc1BlYWtUb0F2ZXJhZ2VWYWx1ZVByZXNlbnQsCisgICAgRklYUF9EQkwqIHBMb3VkbmVzc1BlYWtUb0F2ZXJhZ2VWYWx1ZSk7CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9zZWxlY3RBbGJ1bUxvdWRuZXNzKAorICAgIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0LAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworCitzdGF0aWMgaW50IF9maW5kTWV0aG9kRGVmaW5pdGlvbihMT1VETkVTU19JTkZPKiBwTG91ZG5lc3NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZERlZmluaXRpb24sIGludCBzdGFydEluZGV4KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBwdWJsaWMgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3Qgc19kcmNkZWNfc2VsZWN0aW9uX3Byb2Nlc3MgeworICBTRUxfUFJPQ19DT0RFQ19NT0RFIGNvZGVjTW9kZTsKKyAgU0VMX1BST0NfSU5QVVQgc2VsUHJvY0lucHV0OworICBEUkNERUNfU0VMRUNUSU9OCisgIHNlbGVjdGlvbkRhdGFbMl07IC8qIDIgaW5zdGFuY2VzLCBvbmUgYmVmb3JlIGFuZCBvbmUgYWZ0ZXIgc2VsZWN0aW9uICovCit9OworCitEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOCitkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19DcmVhdGUoSEFORExFX0RSQ19TRUxFQ1RJT05fUFJPQ0VTUyogcGhJbnN0YW5jZSkgeworICBIQU5ETEVfRFJDX1NFTEVDVElPTl9QUk9DRVNTIGhJbnN0YW5jZTsKKyAgaEluc3RhbmNlID0gKEhBTkRMRV9EUkNfU0VMRUNUSU9OX1BST0NFU1MpRkRLY2FsbG9jKAorICAgICAgMSwgc2l6ZW9mKHN0cnVjdCBzX2RyY2RlY19zZWxlY3Rpb25fcHJvY2VzcykpOworCisgIGlmICghaEluc3RhbmNlKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX09VVE9GTUVNT1JZOworCisgIGhJbnN0YW5jZS0+Y29kZWNNb2RlID0gU0VMX1BST0NfQ09ERUNfTU9ERV9VTkRFRklORUQ7CisKKyAgKnBoSW5zdGFuY2UgPSBoSW5zdGFuY2U7CisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKK0RSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4KK2RyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX0luaXQoSEFORExFX0RSQ19TRUxFQ1RJT05fUFJPQ0VTUyBoSW5zdGFuY2UpIHsKKyAgaWYgKCFoSW5zdGFuY2UpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworCisgIF9pbml0RGVmYXVsdFBhcmFtcygmaEluc3RhbmNlLT5zZWxQcm9jSW5wdXQpOworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworfQorCitEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOCitkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19TZXRDb2RlY01vZGUoSEFORExFX0RSQ19TRUxFQ1RJT05fUFJPQ0VTUyBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0VMX1BST0NfQ09ERUNfTU9ERSBjb2RlY01vZGUpIHsKKyAgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiByZXRWYWwgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisKKyAgaWYgKCFoSW5zdGFuY2UpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworCisgIHN3aXRjaCAoY29kZWNNb2RlKSB7CisgICAgY2FzZSBTRUxfUFJPQ19NUEVHXzRfQUFDOgorICAgIGNhc2UgU0VMX1BST0NfTVBFR19EX1VTQUM6CisgICAgY2FzZSBTRUxfUFJPQ19URVNUX1RJTUVfRE9NQUlOOgorICAgIGNhc2UgU0VMX1BST0NfVEVTVF9RTUZfRE9NQUlOOgorICAgIGNhc2UgU0VMX1BST0NfVEVTVF9TVEZUX0RPTUFJTjoKKyAgICAgIGhJbnN0YW5jZS0+Y29kZWNNb2RlID0gY29kZWNNb2RlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNFTF9QUk9DX0NPREVDX01PREVfVU5ERUZJTkVEOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgfQorCisgIHJldFZhbCA9IF9pbml0Q29kZWNNb2RlUGFyYW1zKCYoaEluc3RhbmNlLT5zZWxQcm9jSW5wdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSW5zdGFuY2UtPmNvZGVjTW9kZSA9IGNvZGVjTW9kZSk7CisKKyAgcmV0dXJuIHJldFZhbDsKK30KKworRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTgorZHJjRGVjX1NlbGVjdGlvblByb2Nlc3NfU2V0UGFyYW0oSEFORExFX0RSQ19TRUxFQ1RJT05fUFJPQ0VTUyBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRUxfUFJPQ19VU0VSX1BBUkFNIHJlcXVlc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgcmVxdWVzdFZhbHVlLCBpbnQqIHBEaWZmKSB7CisgIElOVCByZXF1ZXN0VmFsdWVJbnQgPSAoSU5UKXJlcXVlc3RWYWx1ZTsKKyAgaW50IGksIGRpZmYgPSAwOworICBTRUxfUFJPQ19JTlBVVCogcFNlbFByb2NJbnB1dCA9ICYoaEluc3RhbmNlLT5zZWxQcm9jSW5wdXQpOworCisgIHN3aXRjaCAocmVxdWVzdFR5cGUpIHsKKyAgICBjYXNlIFNFTF9QUk9DX0xPVURORVNTX05PUk1BTElaQVRJT05fT046CisgICAgICBpZiAoKHJlcXVlc3RWYWx1ZUludCAhPSAwKSAmJiAocmVxdWVzdFZhbHVlSW50ICE9IDEpKQorICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1BBUkFNX09VVF9PRl9SQU5HRTsKKyAgICAgIGRpZmYgfD0KKyAgICAgICAgICBfY29tcEFzc2lnbigmcFNlbFByb2NJbnB1dC0+bG91ZG5lc3NOb3JtYWxpemF0aW9uT24sIHJlcXVlc3RWYWx1ZUludCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNFTF9QUk9DX1RBUkdFVF9MT1VETkVTUzoKKyAgICAgIC8qIExvd2VyIGJvdW5kYXJ5OiBkcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlTG93ZXIgZGVmYXVsdCB2YWx1ZS4KKyAgICAgICAgIFVwcGVyIGJvdW5kYXJ5OiBkcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlVXBwZXIgZGVmYXVsdCB2YWx1ZSAqLworICAgICAgaWYgKChyZXF1ZXN0VmFsdWUgPCBGTDJGWENPTlNUX0RCTCgtNjMuMGYgLyAoZmxvYXQpKDEgPDwgNykpKSB8fAorICAgICAgICAgIChyZXF1ZXN0VmFsdWUgPiAoRklYUF9EQkwpMCkpCisgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUEFSQU1fT1VUX09GX1JBTkdFOworICAgICAgaWYgKHJlcXVlc3RWYWx1ZSA+CisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoLTEwLjBmIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpKDEgPDwgNykpKSAvKiByZWNvbW1lbmRlZCBtYXhpbXVtIHZhbHVlICovCisgICAgICAgIHJlcXVlc3RWYWx1ZSA9IEZMMkZYQ09OU1RfREJMKC0xMC4wZiAvIChmbG9hdCkoMSA8PCA3KSk7CisgICAgICBkaWZmIHw9IF9jb21wQXNzaWduKCZwU2VsUHJvY0lucHV0LT50YXJnZXRMb3VkbmVzcywgcmVxdWVzdFZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0VMX1BST0NfRUZGRUNUX1RZUEU6CisgICAgICBpZiAoKHJlcXVlc3RWYWx1ZUludCA8IC0xKSB8fCAocmVxdWVzdFZhbHVlSW50ID49IERFVFJfQ09VTlQpKQorICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1BBUkFNX09VVF9PRl9SQU5HRTsKKyAgICAgIC8qIENhdXRpb24uIFRoaXMgb3ZlcnJpZGVzIGFsbCBkcmNGZWF0dXJlUmVxdWVzdHMgcmVxdWVzdGVkIHNvIGZhciEgKi8KKyAgICAgIGlmIChyZXF1ZXN0VmFsdWVJbnQgPT0gLTEpIHsKKyAgICAgICAgZGlmZiB8PSBfY29tcEFzc2lnbigmcFNlbFByb2NJbnB1dC0+ZHluYW1pY1JhbmdlQ29udHJvbE9uLCAwKTsKKyAgICAgIH0gZWxzZSBpZiAocmVxdWVzdFZhbHVlSW50ID09IERFVFJfTk9ORSkgeworICAgICAgICBkaWZmIHw9IF9jb21wQXNzaWduKCZwU2VsUHJvY0lucHV0LT5keW5hbWljUmFuZ2VDb250cm9sT24sIDEpOworICAgICAgICBkaWZmIHw9IF9jb21wQXNzaWduKCZwU2VsUHJvY0lucHV0LT5udW1EcmNGZWF0dXJlUmVxdWVzdHMsIDApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGlmZiB8PSBfY29tcEFzc2lnbigmcFNlbFByb2NJbnB1dC0+ZHluYW1pY1JhbmdlQ29udHJvbE9uLCAxKTsKKyAgICAgICAgZGlmZiB8PSBfY29tcEFzc2lnbigmcFNlbFByb2NJbnB1dC0+bnVtRHJjRmVhdHVyZVJlcXVlc3RzLCAxKTsKKyAgICAgICAgZGlmZiB8PSBfY29tcEFzc2lnbigmcFNlbFByb2NJbnB1dC0+ZHJjRmVhdHVyZVJlcXVlc3RUeXBlWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERGUlRfRUZGRUNUX1RZUEUpOworICAgICAgICBkaWZmIHw9IF9jb21wQXNzaWduKCZwU2VsUHJvY0lucHV0LT5kcmNGZWF0dXJlUmVxdWVzdFswXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRyY0VmZmVjdFR5cGUubnVtUmVxdWVzdHNEZXNpcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICBkaWZmIHw9IF9jb21wQXNzaWduKAorICAgICAgICAgICAgJnBTZWxQcm9jSW5wdXQtPmRyY0ZlYXR1cmVSZXF1ZXN0WzBdLmRyY0VmZmVjdFR5cGUucmVxdWVzdFswXSwKKyAgICAgICAgICAgIHJlcXVlc3RWYWx1ZUludCk7CisgICAgICAgIGlmICgocmVxdWVzdFZhbHVlSW50ID4gREVUUl9OT05FKSAmJgorICAgICAgICAgICAgKHJlcXVlc3RWYWx1ZUludCA8PSBERVRSX0dFTkVSQUxfQ09NUFIpKSB7CisgICAgICAgICAgLyogdXNlIGZhbGxiYWNrIGVmZmVjdCB0eXBlIHJlcXVlc3RzICovCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgZGlmZiB8PQorICAgICAgICAgICAgICAgIF9jb21wQXNzaWduKCZwU2VsUHJvY0lucHV0LT5kcmNGZWF0dXJlUmVxdWVzdFswXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRyY0VmZmVjdFR5cGUucmVxdWVzdFtpICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2tFZmZlY3RUeXBlUmVxdWVzdHNbcmVxdWVzdFZhbHVlSW50IC0gMV1baV0pOworICAgICAgICAgIH0KKyAgICAgICAgICBkaWZmIHw9IF9jb21wQXNzaWduKAorICAgICAgICAgICAgICAmcFNlbFByb2NJbnB1dC0+ZHJjRmVhdHVyZVJlcXVlc3RbMF0uZHJjRWZmZWN0VHlwZS5udW1SZXF1ZXN0cywKKyAgICAgICAgICAgICAgNik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZGlmZiB8PSBfY29tcEFzc2lnbigKKyAgICAgICAgICAgICAgJnBTZWxQcm9jSW5wdXQtPmRyY0ZlYXR1cmVSZXF1ZXN0WzBdLmRyY0VmZmVjdFR5cGUubnVtUmVxdWVzdHMsCisgICAgICAgICAgICAgIDEpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFNFTF9QUk9DX0xPVURORVNTX01FQVNVUkVNRU5UX01FVEhPRDoKKyAgICAgIGlmICgocmVxdWVzdFZhbHVlSW50IDwgMCkgfHwgKHJlcXVlc3RWYWx1ZUludCA+IDIpKQorICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1BBUkFNX09VVF9PRl9SQU5HRTsKKyAgICAgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJnBTZWxQcm9jSW5wdXQtPmxvdWRuZXNzTWVhc3VyZW1lbnRNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RWYWx1ZUludCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNFTF9QUk9DX0RPV05NSVhfSUQ6CisgICAgICBkaWZmIHw9CisgICAgICAgICAgX2NvbXBBc3NpZ24oJnBTZWxQcm9jSW5wdXQtPnRhcmdldENvbmZpZ1JlcXVlc3RUeXBlLCBUQ1JUX0RPV05NSVhfSUQpOworICAgICAgaWYgKHJlcXVlc3RWYWx1ZUludCA8IDApIHsgLyogbmVnYXRpdmUgcmVxdWVzdHMgc2lnbmFsIG5vIGRvd25taXhJZCAqLworICAgICAgICBkaWZmIHw9IF9jb21wQXNzaWduKCZwU2VsUHJvY0lucHV0LT5udW1Eb3dubWl4SWRSZXF1ZXN0cywgMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkaWZmIHw9IF9jb21wQXNzaWduKCZwU2VsUHJvY0lucHV0LT5udW1Eb3dubWl4SWRSZXF1ZXN0cywgMSk7CisgICAgICAgIGRpZmYgfD0KKyAgICAgICAgICAgIF9jb21wQXNzaWduKCZwU2VsUHJvY0lucHV0LT5kb3dubWl4SWRSZXF1ZXN0ZWRbMF0sIHJlcXVlc3RWYWx1ZUludCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFNFTF9QUk9DX1RBUkdFVF9MQVlPVVQ6CisgICAgICAvKiBSZXF1ZXN0IHRhcmdldCBsYXlvdXQgYWNjb3JkaW5nIHRvIENoYW5uZWxDb25maWd1cmF0aW9uIGluIElTTy9JRUMKKyAgICAgICAqIDIzMDAxLTggKENJQ1ApICovCisgICAgICBpZiAoKHJlcXVlc3RWYWx1ZUludCA8IDEpIHx8IChyZXF1ZXN0VmFsdWVJbnQgPiA2MykpCisgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUEFSQU1fT1VUX09GX1JBTkdFOworICAgICAgZGlmZiB8PSBfY29tcEFzc2lnbigmcFNlbFByb2NJbnB1dC0+dGFyZ2V0Q29uZmlnUmVxdWVzdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRDUlRfVEFSR0VUX0xBWU9VVCk7CisgICAgICBkaWZmIHw9CisgICAgICAgICAgX2NvbXBBc3NpZ24oJnBTZWxQcm9jSW5wdXQtPnRhcmdldExheW91dFJlcXVlc3RlZCwgcmVxdWVzdFZhbHVlSW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0VMX1BST0NfVEFSR0VUX0NIQU5ORUxfQ09VTlQ6CisgICAgICBpZiAoKHJlcXVlc3RWYWx1ZUludCA8IDEpIHx8IChyZXF1ZXN0VmFsdWVJbnQgPiA4KSkKKyAgICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19QQVJBTV9PVVRfT0ZfUkFOR0U7CisgICAgICBkaWZmIHw9IF9jb21wQXNzaWduKCZwU2VsUHJvY0lucHV0LT50YXJnZXRDb25maWdSZXF1ZXN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVENSVF9UQVJHRVRfQ0hBTk5FTF9DT1VOVCk7CisgICAgICBkaWZmIHw9IF9jb21wQXNzaWduKCZwU2VsUHJvY0lucHV0LT50YXJnZXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RWYWx1ZUludCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNFTF9QUk9DX0JBU0VfQ0hBTk5FTF9DT1VOVDoKKyAgICAgIGlmIChyZXF1ZXN0VmFsdWVJbnQgPCAwKQorICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1BBUkFNX09VVF9PRl9SQU5HRTsKKyAgICAgIGRpZmYgfD0gX2NvbXBBc3NpZ24oJnBTZWxQcm9jSW5wdXQtPmJhc2VDaGFubmVsQ291bnQsIHJlcXVlc3RWYWx1ZUludCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNFTF9QUk9DX1NBTVBMRV9SQVRFOgorICAgICAgaWYgKHJlcXVlc3RWYWx1ZUludCA8IDApCisgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUEFSQU1fT1VUX09GX1JBTkdFOworICAgICAgZGlmZiB8PSBfY29tcEFzc2lnbigmcFNlbFByb2NJbnB1dC0+YXVkaW9TYW1wbGVSYXRlLCByZXF1ZXN0VmFsdWVJbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTRUxfUFJPQ19CT09TVDoKKyAgICAgIGlmICgocmVxdWVzdFZhbHVlIDwgKEZJWFBfREJMKTApIHx8CisgICAgICAgICAgKHJlcXVlc3RWYWx1ZSA+IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgMSkpKSkKKyAgICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19QQVJBTV9PVVRfT0ZfUkFOR0U7CisgICAgICBkaWZmIHw9IF9jb21wQXNzaWduKCZwU2VsUHJvY0lucHV0LT5ib29zdCwgRlhfREJMMkZYX1NHTChyZXF1ZXN0VmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0VMX1BST0NfQ09NUFJFU1M6CisgICAgICBpZiAoKHJlcXVlc3RWYWx1ZSA8IChGSVhQX0RCTCkwKSB8fAorICAgICAgICAgIChyZXF1ZXN0VmFsdWUgPiBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKGZsb2F0KSgxIDw8IDEpKSkpCisgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUEFSQU1fT1VUX09GX1JBTkdFOworICAgICAgZGlmZiB8PQorICAgICAgICAgIF9jb21wQXNzaWduKCZwU2VsUHJvY0lucHV0LT5jb21wcmVzcywgRlhfREJMMkZYX1NHTChyZXF1ZXN0VmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX0lOVkFMSURfUEFSQU07CisgIH0KKworICBpZiAocERpZmYgIT0gTlVMTCkgeworICAgICpwRGlmZiB8PSBkaWZmOworICB9CisKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKK30KKworRklYUF9EQkwKK2RyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX0dldFBhcmFtKEhBTkRMRV9EUkNfU0VMRUNUSU9OX1BST0NFU1MgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0VMX1BST0NfVVNFUl9QQVJBTSByZXF1ZXN0VHlwZSkgeworICBTRUxfUFJPQ19JTlBVVCogcFNlbFByb2NJbnB1dCA9ICYoaEluc3RhbmNlLT5zZWxQcm9jSW5wdXQpOworCisgIHN3aXRjaCAocmVxdWVzdFR5cGUpIHsKKyAgICBjYXNlIFNFTF9QUk9DX0xPVURORVNTX05PUk1BTElaQVRJT05fT046CisgICAgICByZXR1cm4gKEZJWFBfREJMKXBTZWxQcm9jSW5wdXQtPmxvdWRuZXNzTm9ybWFsaXphdGlvbk9uOworICAgIGNhc2UgU0VMX1BST0NfRFlOQU1JQ19SQU5HRV9DT05UUk9MX09OOgorICAgICAgcmV0dXJuIChGSVhQX0RCTClwU2VsUHJvY0lucHV0LT5keW5hbWljUmFuZ2VDb250cm9sT247CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAoRklYUF9EQkwpMDsKKyAgfQorfQorCitEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOCitkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19EZWxldGUoSEFORExFX0RSQ19TRUxFQ1RJT05fUFJPQ0VTUyogcGhJbnN0YW5jZSkgeworICBpZiAocGhJbnN0YW5jZSA9PSBOVUxMIHx8ICpwaEluc3RhbmNlID09IE5VTEwpCisgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19JTlZBTElEX0hBTkRMRTsKKworICBGREtmcmVlKCpwaEluc3RhbmNlKTsKKyAgKnBoSW5zdGFuY2UgPSBOVUxMOworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworfQorCitEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOCitkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19Qcm9jZXNzKEhBTkRMRV9EUkNfU0VMRUNUSU9OX1BST0NFU1MgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TRUxfUFJPQ19PVVRQVVQgaFNlbFByb2NPdXRwdXQpIHsKKyAgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiByZXRWYWwgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisgIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzU2VsZWN0ZWQ7CisgIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzUG90ZW50aWFsOworCisgIGlmIChoSW5zdGFuY2UgPT0gTlVMTCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19JTlZBTElEX0hBTkRMRTsKKworICBwQ2FuZGlkYXRlc1NlbGVjdGVkID0gJihoSW5zdGFuY2UtPnNlbGVjdGlvbkRhdGFbMF0pOworICBwQ2FuZGlkYXRlc1BvdGVudGlhbCA9ICYoaEluc3RhbmNlLT5zZWxlY3Rpb25EYXRhWzFdKTsKKyAgX2RyY2RlY19zZWxlY3Rpb25fc2V0TnVtYmVyKHBDYW5kaWRhdGVzU2VsZWN0ZWQsIDApOworICBfZHJjZGVjX3NlbGVjdGlvbl9zZXROdW1iZXIocENhbmRpZGF0ZXNQb3RlbnRpYWwsIDApOworCisgIHJldFZhbCA9IF9nZW5lcmF0ZVZpcnR1YWxEcmNTZXRzKCYoaEluc3RhbmNlLT5zZWxQcm9jSW5wdXQpLCBoVW5pRHJjQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSW5zdGFuY2UtPmNvZGVjTW9kZSk7CisgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKworICBpZiAoaEluc3RhbmNlLT5zZWxQcm9jSW5wdXQuYmFzZUNoYW5uZWxDb3VudCAhPQorICAgICAgaFVuaURyY0NvbmZpZy0+Y2hhbm5lbExheW91dC5iYXNlQ2hhbm5lbENvdW50KSB7CisgICAgaEluc3RhbmNlLT5zZWxQcm9jSW5wdXQuYmFzZUNoYW5uZWxDb3VudCA9CisgICAgICAgIGhVbmlEcmNDb25maWctPmNoYW5uZWxMYXlvdXQuYmFzZUNoYW5uZWxDb3VudDsKKyAgfQorCisgIGlmICgoaEluc3RhbmNlLT5zZWxQcm9jSW5wdXQudGFyZ2V0Q29uZmlnUmVxdWVzdFR5cGUgIT0gMCkgfHwKKyAgICAgIChoSW5zdGFuY2UtPnNlbFByb2NJbnB1dC50YXJnZXRDb25maWdSZXF1ZXN0VHlwZSA9PSAwICYmCisgICAgICAgaEluc3RhbmNlLT5zZWxQcm9jSW5wdXQubnVtRG93bm1peElkUmVxdWVzdHMgPT0gMCkpIHsKKyAgICByZXRWYWwgPSBfY2hhbm5lbExheW91dFRvRG93bm1peElkTWFwcGluZygmKGhJbnN0YW5jZS0+c2VsUHJvY0lucHV0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVW5pRHJjQ29uZmlnKTsKKworICAgIGlmIChfaXNFcnJvcihyZXRWYWwpKSByZXR1cm4gKHJldFZhbCk7CisgIH0KKworICByZXRWYWwgPSBfZHJjU2V0UHJlU2VsZWN0aW9uKCYoaEluc3RhbmNlLT5zZWxQcm9jSW5wdXQpLCBoVW5pRHJjQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhMb3VkbmVzc0luZm9TZXQsICZwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENhbmRpZGF0ZXNTZWxlY3RlZCwgaEluc3RhbmNlLT5jb2RlY01vZGUpOworICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisKKyAgaWYgKGhJbnN0YW5jZS0+c2VsUHJvY0lucHV0LmFsYnVtTW9kZSkgeworICAgIF9zd2FwU2VsZWN0aW9uQW5kQ2xlYXIoJnBDYW5kaWRhdGVzUG90ZW50aWFsLCAmcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisKKyAgICByZXRWYWwgPSBfc2VsZWN0QWxidW1Mb3VkbmVzcyhoTG91ZG5lc3NJbmZvU2V0LCBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisKKyAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKHBDYW5kaWRhdGVzU2VsZWN0ZWQpID09IDApIHsKKyAgICAgIF9zd2FwU2VsZWN0aW9uKCZwQ2FuZGlkYXRlc1BvdGVudGlhbCwgJnBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgIH0KKyAgfQorCisgIF9zd2FwU2VsZWN0aW9uQW5kQ2xlYXIoJnBDYW5kaWRhdGVzUG90ZW50aWFsLCAmcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisKKyAgcmV0VmFsID0gX2RyY1NldFJlcXVlc3RTZWxlY3Rpb24oJihoSW5zdGFuY2UtPnNlbFByb2NJbnB1dCksIGhVbmlEcmNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhMb3VkbmVzc0luZm9TZXQsICZwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisKKyAgcmV0VmFsID0gX2RyY1NldEZpbmFsU2VsZWN0aW9uKCYoaEluc3RhbmNlLT5zZWxQcm9jSW5wdXQpLCBoVW5pRHJjQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDYW5kaWRhdGVzUG90ZW50aWFsLCAmcENhbmRpZGF0ZXNTZWxlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhJbnN0YW5jZS0+Y29kZWNNb2RlKTsKKyAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworCisgIHJldFZhbCA9IF9nZW5lcmF0ZU91dHB1dEluZm8oCisgICAgICAmKGhJbnN0YW5jZS0+c2VsUHJvY0lucHV0KSwgaFNlbFByb2NPdXRwdXQsIGhVbmlEcmNDb25maWcsCisgICAgICBoTG91ZG5lc3NJbmZvU2V0LCAmKHBDYW5kaWRhdGVzU2VsZWN0ZWQtPmRhdGFbMF0pLCBoSW5zdGFuY2UtPmNvZGVjTW9kZSk7CisKKyAgaWYgKF9pc0Vycm9yKHJldFZhbCkpIHJldHVybiAocmV0VmFsKTsKKworICByZXRWYWwgPSBfc2VsZWN0RG93bm1peE1hdHJpeChoU2VsUHJvY091dHB1dCwgaFVuaURyY0NvbmZpZyk7CisgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHN0YXRpYyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9pbml0RGVmYXVsdFBhcmFtcygKKyAgICBIQU5ETEVfU0VMX1BST0NfSU5QVVQgaFNlbFByb2NJbnB1dCkgeworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHJldFZhbCA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKworICBpZiAoaFNlbFByb2NJbnB1dCA9PSBOVUxMKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX0lOVkFMSURfSEFORExFOworCisgIC8qIHN5c3RlbSBwYXJhbWV0ZXJzICovCisgIGhTZWxQcm9jSW5wdXQtPmJhc2VDaGFubmVsQ291bnQgPSAtMTsKKyAgaFNlbFByb2NJbnB1dC0+YmFzZUxheW91dCA9IC0xOworICBoU2VsUHJvY0lucHV0LT50YXJnZXRDb25maWdSZXF1ZXN0VHlwZSA9IFRDUlRfRE9XTk1JWF9JRDsKKyAgaFNlbFByb2NJbnB1dC0+bnVtRG93bm1peElkUmVxdWVzdHMgPSAwOworCisgIC8qIGxvdWRuZXNzIG5vcm1hbGl6YXRpb24gcGFyYW1ldGVycyAqLworICBoU2VsUHJvY0lucHV0LT5hbGJ1bU1vZGUgPSAwOworICBoU2VsUHJvY0lucHV0LT5wZWFrTGltaXRlclByZXNlbnQgPSAwOworICBoU2VsUHJvY0lucHV0LT5sb3VkbmVzc05vcm1hbGl6YXRpb25PbiA9IDE7CisgIGhTZWxQcm9jSW5wdXQtPnRhcmdldExvdWRuZXNzID0gRkwyRlhDT05TVF9EQkwoLTI0LjBmIC8gKGZsb2F0KSgxIDw8IDcpKTsKKyAgaFNlbFByb2NJbnB1dC0+bG91ZG5lc3NEZXZpYXRpb25NYXggPSBERUZBVUxUX0xPVURORVNTX0RFVklBVElPTl9NQVg7CisgIGhTZWxQcm9jSW5wdXQtPmxvdWRuZXNzTWVhc3VyZW1lbnRNZXRob2QgPSBNRFJfREVGQVVMVDsKKyAgaFNlbFByb2NJbnB1dC0+bG91ZG5lc3NNZWFzdXJlbWVudFN5c3RlbSA9IE1TUl9ERUZBVUxUOworICBoU2VsUHJvY0lucHV0LT5sb3VkbmVzc01lYXN1cmVtZW50UHJlUHJvYyA9IExQUl9ERUZBVUxUOworICBoU2VsUHJvY0lucHV0LT5kZXZpY2VDdXRPZmZGcmVxdWVuY3kgPSA1MDA7CisgIGhTZWxQcm9jSW5wdXQtPmxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYk1heCA9CisgICAgICAoRklYUF9EQkwpTUFYVkFMX0RCTDsgLyogaW5maW5pdHkgYXMgZGVmYXVsdCAqLworICBoU2VsUHJvY0lucHV0LT5sb3VkbmVzc05vcm1hbGl6YXRpb25HYWluTW9kaWZpY2F0aW9uRGIgPSAoRklYUF9EQkwpMDsKKyAgaFNlbFByb2NJbnB1dC0+b3V0cHV0UGVha0xldmVsTWF4ID0gKEZJWFBfREJMKTA7CisgIGlmIChoU2VsUHJvY0lucHV0LT5wZWFrTGltaXRlclByZXNlbnQgPT0gMSkgeworICAgIGhTZWxQcm9jSW5wdXQtPm91dHB1dFBlYWtMZXZlbE1heCA9IEZMMkZYQ09OU1RfREJMKDYuMGYgLyAoZmxvYXQpKDEgPDwgNykpOworICB9CisKKyAgLyogZHluYW1pYyByYW5nZSBjb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgaFNlbFByb2NJbnB1dC0+ZHluYW1pY1JhbmdlQ29udHJvbE9uID0gMTsKKworICBoU2VsUHJvY0lucHV0LT5udW1EcmNGZWF0dXJlUmVxdWVzdHMgPSAwOworCisgIC8qIG90aGVyIHBhcmFtZXRlcnMgKi8KKyAgaFNlbFByb2NJbnB1dC0+Ym9vc3QgPSBGTDJGWENPTlNUX1NHTCgxLmYgLyAoZmxvYXQpKDEgPDwgMSkpOworICBoU2VsUHJvY0lucHV0LT5jb21wcmVzcyA9IEZMMkZYQ09OU1RfU0dMKDEuZiAvIChmbG9hdCkoMSA8PCAxKSk7CisgIGhTZWxQcm9jSW5wdXQtPmRyY0NoYXJhY3RlcmlzdGljVGFyZ2V0ID0gMDsKKworICByZXR1cm4gcmV0VmFsOworfQorCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfaW5pdENvZGVjTW9kZVBhcmFtcygKKyAgICBIQU5ETEVfU0VMX1BST0NfSU5QVVQgaFNlbFByb2NJbnB1dCwgY29uc3QgU0VMX1BST0NfQ09ERUNfTU9ERSBjb2RlY01vZGUpIHsKKyAgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiByZXRWYWwgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisKKyAgaWYgKGhTZWxQcm9jSW5wdXQgPT0gTlVMTCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19JTlZBTElEX0hBTkRMRTsKKworICBzd2l0Y2ggKGNvZGVjTW9kZSkgeworICAgIGNhc2UgU0VMX1BST0NfTVBFR19IXzNEQToKKyAgICAgIGhTZWxQcm9jSW5wdXQtPmxvdWRuZXNzRGV2aWF0aW9uTWF4ID0gMDsKKyAgICAgIGhTZWxQcm9jSW5wdXQtPnBlYWtMaW1pdGVyUHJlc2VudCA9IDE7IC8qIHBlYWsgbGltaXRlciBpcyBtYW5kYXRvcnkgKi8KKyAgICAgIC8qIFRoZSBwZWFrIGxpbWl0ZXIgYWxzbyBoYXMgdG8gY2F0Y2ggb3ZlcnNob290cyBkdWUgdG8gdXNlcgorICAgICAgaW50ZXJhY3Rpdml0eSwgZG93bm1peGluZyBldGMuIFRoZXJlZm9yZSB0aGUgbWF4aW11bSBvdXRwdXQgcGVhayBsZXZlbCBpcworICAgICAgcmVkdWNlZCB0byAwIGRCLiAqLworICAgICAgaFNlbFByb2NJbnB1dC0+b3V0cHV0UGVha0xldmVsTWF4ID0gKEZJWFBfREJMKTA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNFTF9QUk9DX01QRUdfNF9BQUM6CisgICAgY2FzZSBTRUxfUFJPQ19NUEVHX0RfVVNBQzoKKyAgICAgIGhTZWxQcm9jSW5wdXQtPmxvdWRuZXNzRGV2aWF0aW9uTWF4ID0gREVGQVVMVF9MT1VETkVTU19ERVZJQVRJT05fTUFYOworICAgICAgaFNlbFByb2NJbnB1dC0+cGVha0xpbWl0ZXJQcmVzZW50ID0gMTsKKyAgICAgIC8qIEEgcGVhayBsaW1pdGVyIGlzIHByZXNlbnQgYXQgdGhlIGVuZCBvZiB0aGUgZGVjb2RlciwgdGhlcmVmb3JlIHdlIGNhbgorICAgICAgICogYWxsb3cgZm9yIGEgbWF4aW11bSBvdXRwdXQgcGVhayBsZXZlbCBncmVhdGVyIHRoYW4gZnVsbCBzY2FsZQorICAgICAgICovCisgICAgICBoU2VsUHJvY0lucHV0LT5vdXRwdXRQZWFrTGV2ZWxNYXggPQorICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDYuMGYgLyAoZmxvYXQpKDEgPDwgNykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTRUxfUFJPQ19URVNUX1RJTUVfRE9NQUlOOgorICAgIGNhc2UgU0VMX1BST0NfVEVTVF9RTUZfRE9NQUlOOgorICAgIGNhc2UgU0VMX1BST0NfVEVTVF9TVEZUX0RPTUFJTjoKKyAgICAgIC8qIGZvciB0ZXN0aW5nLCBhZGFwdCB0byBkZWZhdWx0IHNldHRpbmdzIGluIHJlZmVyZW5jZSBzb2Z0d2FyZSAqLworICAgICAgaFNlbFByb2NJbnB1dC0+bG91ZG5lc3NOb3JtYWxpemF0aW9uT24gPSAwOworICAgICAgaFNlbFByb2NJbnB1dC0+ZHluYW1pY1JhbmdlQ29udHJvbE9uID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0VMX1BST0NfQ09ERUNfTU9ERV9VTkRFRklORUQ6CisgICAgZGVmYXVsdDoKKyAgICAgIGhTZWxQcm9jSW5wdXQtPmxvdWRuZXNzRGV2aWF0aW9uTWF4ID0gREVGQVVMVF9MT1VETkVTU19ERVZJQVRJT05fTUFYOworICAgICAgaFNlbFByb2NJbnB1dC0+cGVha0xpbWl0ZXJQcmVzZW50ID0gMDsKKyAgfQorCisgIHJldHVybiByZXRWYWw7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9jaGFubmVsTGF5b3V0VG9Eb3dubWl4SWRNYXBwaW5nKAorICAgIEhBTkRMRV9TRUxfUFJPQ19JTlBVVCBoU2VsUHJvY0lucHV0LCBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZykgeworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHJldFZhbCA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKworICBET1dOTUlYX0lOU1RSVUNUSU9OUyogcERvd24gPSBOVUxMOworCisgIGludCBpOworCisgIGhTZWxQcm9jSW5wdXQtPm51bURvd25taXhJZFJlcXVlc3RzID0gMDsKKworICBzd2l0Y2ggKGhTZWxQcm9jSW5wdXQtPnRhcmdldENvbmZpZ1JlcXVlc3RUeXBlKSB7CisgICAgY2FzZSBUQ1JUX0RPV05NSVhfSUQ6CisgICAgICBpZiAoaFNlbFByb2NJbnB1dC0+bnVtRG93bm1peElkUmVxdWVzdHMgPT0gMCkgeworICAgICAgICBoU2VsUHJvY0lucHV0LT5kb3dubWl4SWRSZXF1ZXN0ZWRbMF0gPSAwOworICAgICAgICBoU2VsUHJvY0lucHV0LT5udW1Eb3dubWl4SWRSZXF1ZXN0cyA9IDE7CisgICAgICB9CisKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUQ1JUX1RBUkdFVF9MQVlPVVQ6CisgICAgICBpZiAoaFNlbFByb2NJbnB1dC0+dGFyZ2V0TGF5b3V0UmVxdWVzdGVkID09IGhTZWxQcm9jSW5wdXQtPmJhc2VMYXlvdXQpIHsKKyAgICAgICAgaFNlbFByb2NJbnB1dC0+ZG93bm1peElkUmVxdWVzdGVkWzBdID0gMDsKKyAgICAgICAgaFNlbFByb2NJbnB1dC0+bnVtRG93bm1peElkUmVxdWVzdHMgPSAxOworICAgICAgfQorCisgICAgICBpZiAoaFNlbFByb2NJbnB1dC0+bnVtRG93bm1peElkUmVxdWVzdHMgPT0gMCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaFVuaURyY0NvbmZpZy0+ZG93bm1peEluc3RydWN0aW9uc0NvdW50OyBpKyspIHsKKyAgICAgICAgICBwRG93biA9ICYoaFVuaURyY0NvbmZpZy0+ZG93bm1peEluc3RydWN0aW9uc1tpXSk7CisKKyAgICAgICAgICBpZiAoaFNlbFByb2NJbnB1dC0+dGFyZ2V0TGF5b3V0UmVxdWVzdGVkID09IHBEb3duLT50YXJnZXRMYXlvdXQpIHsKKyAgICAgICAgICAgIGhTZWxQcm9jSW5wdXQKKyAgICAgICAgICAgICAgICAtPmRvd25taXhJZFJlcXVlc3RlZFtoU2VsUHJvY0lucHV0LT5udW1Eb3dubWl4SWRSZXF1ZXN0c10gPQorICAgICAgICAgICAgICAgIHBEb3duLT5kb3dubWl4SWQ7CisgICAgICAgICAgICBoU2VsUHJvY0lucHV0LT5udW1Eb3dubWl4SWRSZXF1ZXN0cysrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoaFNlbFByb2NJbnB1dC0+YmFzZUxheW91dCA9PSAtMSkgeworICAgICAgICByZXRWYWwgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfV0FSTklORzsKKyAgICAgIH0KKworICAgICAgaWYgKGhTZWxQcm9jSW5wdXQtPm51bURvd25taXhJZFJlcXVlc3RzID09IDApIHsKKyAgICAgICAgaFNlbFByb2NJbnB1dC0+ZG93bm1peElkUmVxdWVzdGVkWzBdID0gMDsKKyAgICAgICAgaFNlbFByb2NJbnB1dC0+bnVtRG93bm1peElkUmVxdWVzdHMgPSAxOworICAgICAgICByZXRWYWwgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfV0FSTklORzsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRDUlRfVEFSR0VUX0NIQU5ORUxfQ09VTlQ6CisgICAgICBpZiAoaFNlbFByb2NJbnB1dC0+dGFyZ2V0Q2hhbm5lbENvdW50UmVxdWVzdGVkID09CisgICAgICAgICAgaFNlbFByb2NJbnB1dC0+YmFzZUNoYW5uZWxDb3VudCkgeworICAgICAgICBoU2VsUHJvY0lucHV0LT5kb3dubWl4SWRSZXF1ZXN0ZWRbMF0gPSAwOworICAgICAgICBoU2VsUHJvY0lucHV0LT5udW1Eb3dubWl4SWRSZXF1ZXN0cyA9IDE7CisgICAgICB9CisKKyAgICAgIGlmIChoU2VsUHJvY0lucHV0LT5udW1Eb3dubWl4SWRSZXF1ZXN0cyA9PSAwKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zQ291bnQ7IGkrKykgeworICAgICAgICAgIHBEb3duID0gJihoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zW2ldKTsKKworICAgICAgICAgIGlmIChoU2VsUHJvY0lucHV0LT50YXJnZXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQgPT0KKyAgICAgICAgICAgICAgcERvd24tPnRhcmdldENoYW5uZWxDb3VudCkgeworICAgICAgICAgICAgaFNlbFByb2NJbnB1dAorICAgICAgICAgICAgICAgIC0+ZG93bm1peElkUmVxdWVzdGVkW2hTZWxQcm9jSW5wdXQtPm51bURvd25taXhJZFJlcXVlc3RzXSA9CisgICAgICAgICAgICAgICAgcERvd24tPmRvd25taXhJZDsKKyAgICAgICAgICAgIGhTZWxQcm9jSW5wdXQtPm51bURvd25taXhJZFJlcXVlc3RzKys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChoU2VsUHJvY0lucHV0LT5iYXNlQ2hhbm5lbENvdW50ID09IC0xKSB7CisgICAgICAgIHJldFZhbCA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19XQVJOSU5HOworICAgICAgfQorCisgICAgICBpZiAoaFNlbFByb2NJbnB1dC0+bnVtRG93bm1peElkUmVxdWVzdHMgPT0gMCkgeworICAgICAgICByZXRWYWwgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfV0FSTklORzsKKyAgICAgICAgaFNlbFByb2NJbnB1dC0+ZG93bm1peElkUmVxdWVzdGVkWzBdID0gMDsKKyAgICAgICAgaFNlbFByb2NJbnB1dC0+bnVtRG93bm1peElkUmVxdWVzdHMgPSAxOworICAgICAgfQorCisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgfQorCisgIHJldHVybiByZXRWYWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBOb3RlOiBOdW1iZXJpbmcgb2YgRFJDIHByZS1zZWxlY3Rpb24gc3RlcHMgYWNjb3JkaW5nIHRvIE1QRUctRCBQYXJ0LTQgRFJDCisgKiBBbWQxICovCisKKy8qICMxOiBEb3dubWl4SWQgb2YgRFJDIHNldCBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgZG93bm1peElkLgorICAgIzI6IE91dHB1dCBjaGFubmVsIGxheW91dCBvZiBEUkMgc2V0IG1hdGNoZXMgdGhlIHJlcXVlc3RlZCBsYXlvdXQuCisgICAjMzogQ2hhbm5lbCBjb3VudCBvZiBEUkMgc2V0IG1hdGNoZXMgdGhlIHJlcXVlc3RlZCBjaGFubmVsIGNvdW50LiAqLworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX3ByZVNlbGVjdGlvblJlcXVpcmVtZW50MTIzKAorICAgIGludCBuUmVxdWVzdGVkRG93bm1peElkLCBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBEcmNJbnN0cnVjdGlvblVuaURyYywKKyAgICBpbnQqIHBNYXRjaEZvdW5kKSB7CisgIGludCBpOworICAqcE1hdGNoRm91bmQgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMtPmRvd25taXhJZENvdW50OyBpKyspIHsKKyAgICBpZiAoKHBEcmNJbnN0cnVjdGlvblVuaURyYy0+ZG93bm1peElkW2ldID09IG5SZXF1ZXN0ZWREb3dubWl4SWQpIHx8CisgICAgICAgIChwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMtPmRvd25taXhJZFtpXSA9PSBET1dOTUlYX0lEX0FOWV9ET1dOTUlYKSB8fAorICAgICAgICAoKHBEcmNJbnN0cnVjdGlvblVuaURyYy0+ZG93bm1peElkW2ldID09IERPV05NSVhfSURfQkFTRV9MQVlPVVQpICYmCisgICAgICAgICAocERyY0luc3RydWN0aW9uVW5pRHJjLT5kcmNTZXRJZCA+IDApKSkgeworICAgICAgKnBNYXRjaEZvdW5kID0gMTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKKy8qICM0OiBUaGUgRFJDIHNldCBpcyBub3QgYSAiRmFkZS0iIG9yICJEdWNraW5nLSIgb25seSBEUkMgc2V0LiAqLworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX3ByZVNlbGVjdGlvblJlcXVpcmVtZW50NCgKKyAgICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBEcmNJbnN0cnVjdGlvbiwgaW50IG5EeW5hbWljUmFuZ2VDb250cm9sT24sCisgICAgaW50KiBwTWF0Y2hGb3VuZCkgeworICAqcE1hdGNoRm91bmQgPSAwOworCisgIGlmIChuRHluYW1pY1JhbmdlQ29udHJvbE9uID09IDEpIHsKKyAgICBpZiAoKHBEcmNJbnN0cnVjdGlvbi0+ZHJjU2V0RWZmZWN0ICE9IEVCX0ZBREUpICYmCisgICAgICAgIChwRHJjSW5zdHJ1Y3Rpb24tPmRyY1NldEVmZmVjdCAhPSBFQl9EVUNLX09USEVSKSAmJgorICAgICAgICAocERyY0luc3RydWN0aW9uLT5kcmNTZXRFZmZlY3QgIT0gRUJfRFVDS19TRUxGKSAmJgorICAgICAgICAocERyY0luc3RydWN0aW9uLT5kcmNTZXRFZmZlY3QgIT0gMCB8fCBwRHJjSW5zdHJ1Y3Rpb24tPmRyY1NldElkIDwgMCkpIHsKKyAgICAgICpwTWF0Y2hGb3VuZCA9IDE7CisgICAgfQorICB9IGVsc2UgeworICAgICpwTWF0Y2hGb3VuZCA9IDE7CisgIH0KKworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworfQorCisvKiAjNTogVGhlIG51bWJlciBvZiBEUkMgYmFuZHMgaXMgc3VwcG9ydGVkLiAqLworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX3ByZVNlbGVjdGlvblJlcXVpcmVtZW50NSgKKyAgICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBEcmNJbnN0cnVjdGlvblVuaURyYywKKyAgICBEUkNfQ09FRkZJQ0lFTlRTX1VOSV9EUkMqIHBDb2VmLCBpbnQqIHBNYXRjaEZvdW5kKSB7CisgIGludCBpOworCisgICpwTWF0Y2hGb3VuZCA9IDE7CisKKyAgaWYgKHBDb2VmID09IE5VTEwpIC8qIGNoZWNrIGZvciBwYXJhbWV0cmljRFJDICovCisgIHsKKyAgICAqcE1hdGNoRm91bmQgPSAxOworICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgcERyY0luc3RydWN0aW9uVW5pRHJjLT5uRHJjQ2hhbm5lbEdyb3VwczsgaSsrKSB7CisgICAgaW50IGluZGV4RHJjQ29lZmYgPSBwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMtPmdhaW5TZXRJbmRleEZvckNoYW5uZWxHcm91cFtpXTsKKyAgICBpbnQgYmFuZENvdW50ID0gMDsKKworICAgIGlmIChpbmRleERyY0NvZWZmID4gcENvZWYtPmdhaW5TZXRDb3VudCAtIDEpIC8qIGNoZWNrIGZvciBwYXJhbWV0cmljRFJDICovCisgICAgeworICAgICAgKnBNYXRjaEZvdW5kID0gMTsKKyAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisgICAgfQorCisgICAgR0FJTl9TRVQqIGdhaW5TZXQgPSAmKHBDb2VmLT5nYWluU2V0W2luZGV4RHJjQ29lZmZdKTsKKyAgICBiYW5kQ291bnQgPSBnYWluU2V0LT5iYW5kQ291bnQ7CisKKyAgICBpZiAoYmFuZENvdW50ID4gNCkgeworICAgICAgKnBNYXRjaEZvdW5kID0gMDsKKyAgICB9CisgIH0KKworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworfQorCisvKiAjNjogSW5kZXBlbmRlbnQgdXNlIG9mIERSQyBzZXQgaXMgcGVybWl0dGVkLiovCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfcHJlU2VsZWN0aW9uUmVxdWlyZW1lbnQ2KAorICAgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcERyY0luc3RydWN0aW9uVW5pRHJjLCBpbnQqIHBNYXRjaEZvdW5kKSB7CisgICpwTWF0Y2hGb3VuZCA9IDA7CisKKyAgaWYgKCgocERyY0luc3RydWN0aW9uVW5pRHJjLT5kZXBlbmRzT25EcmNTZXRQcmVzZW50ID09IDApICYmCisgICAgICAgKHBEcmNJbnN0cnVjdGlvblVuaURyYy0+bm9JbmRlcGVuZGVudFVzZSA9PSAwKSkgfHwKKyAgICAgIChwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMtPmRlcGVuZHNPbkRyY1NldFByZXNlbnQgPT0gMSkpIHsKKyAgICAqcE1hdGNoRm91bmQgPSAxOworICB9CisKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKK30KKworLyogIzc6IERSQyBzZXRzIHRoYXQgcmVxdWlyZSBFUSBhcmUgb25seSBwZXJtaXR0ZWQgaWYgRVEgaXMgc3VwcG9ydGVkLiAqLworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX3ByZVNlbGVjdGlvblJlcXVpcmVtZW50NygKKyAgICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBEcmNJbnN0cnVjdGlvblVuaURyYywgaW50KiBwTWF0Y2hGb3VuZCkgeworICAqcE1hdGNoRm91bmQgPSAxOworCisgIGlmIChwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMtPnJlcXVpcmVzRXEpIHsKKyAgICAvKiBFUSBpcyBub3Qgc3VwcG9ydGVkICovCisgICAgKnBNYXRjaEZvdW5kID0gMDsKKyAgfQorCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKK3N0YXRpYyB2b2lkIF9zZXRTZWxlY3Rpb25EYXRhSW5mbyhEUkNERUNfU0VMRUNUSU9OX0RBVEEqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGxvdWRuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBsb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGJNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgbG91ZG5lc3NEZXZpYXRpb25NYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgc2lnbmFsUGVha0xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIG91dHB1dFBlYWtMZXZlbE1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXBwbHlBZGp1c3RtZW50KSB7CisgIEZJWFBfREJMIGFkanVzdG1lbnQgPSAwOworCisgIGlmIChhcHBseUFkanVzdG1lbnQpIHsKKyAgICBhZGp1c3RtZW50ID0KKyAgICAgICAgZk1heCgoRklYUF9EQkwpMCwgc2lnbmFsUGVha0xldmVsICsgbG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBlYWtMZXZlbE1heCk7CisgICAgYWRqdXN0bWVudCA9IGZNaW4oYWRqdXN0bWVudCwgZk1heCgoRklYUF9EQkwpMCwgbG91ZG5lc3NEZXZpYXRpb25NYXgpKTsKKyAgfQorCisgIHBEYXRhLT5sb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGJBZGp1c3RlZCA9IGZNaW4oCisgICAgICBsb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGIgLSBhZGp1c3RtZW50LCBsb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGJNYXgpOworICBwRGF0YS0+b3V0cHV0TG91ZG5lc3MgPSBsb3VkbmVzcyArIHBEYXRhLT5sb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGJBZGp1c3RlZDsKKyAgcERhdGEtPm91dHB1dFBlYWtMZXZlbCA9CisgICAgICBzaWduYWxQZWFrTGV2ZWwgKyBwRGF0YS0+bG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiQWRqdXN0ZWQ7Cit9CisKK3N0YXRpYyBpbnQgX3RhcmdldExvdWRuZXNzSW5SYW5nZSgKKyAgICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBEcmNJbnN0cnVjdGlvblVuaURyYywgRklYUF9EQkwgdGFyZ2V0TG91ZG5lc3MpIHsKKyAgaW50IHJldFZhbCA9IDA7CisKKyAgRklYUF9EQkwgZHJjU2V0VGFyZ2V0TG91ZG5lc3NWYWx1ZVVwcGVyID0KKyAgICAgICgoRklYUF9EQkwpcERyY0luc3RydWN0aW9uVW5pRHJjLT5kcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlVXBwZXIpCisgICAgICA8PCAoREZSQUNUX0JJVFMgLSAxIC0gNyk7CisgIEZJWFBfREJMIGRyY1NldFRhcmdldExvdWRuZXNzVmFsdWVMb3dlciA9CisgICAgICAoKEZJWFBfREJMKXBEcmNJbnN0cnVjdGlvblVuaURyYy0+ZHJjU2V0VGFyZ2V0TG91ZG5lc3NWYWx1ZUxvd2VyKQorICAgICAgPDwgKERGUkFDVF9CSVRTIC0gMSAtIDcpOworCisgIGlmIChwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMtPmRyY1NldFRhcmdldExvdWRuZXNzUHJlc2VudCAmJgorICAgICAgZHJjU2V0VGFyZ2V0TG91ZG5lc3NWYWx1ZVVwcGVyID49IHRhcmdldExvdWRuZXNzICYmCisgICAgICBkcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlTG93ZXIgPCB0YXJnZXRMb3VkbmVzcykgeworICAgIHJldFZhbCA9IDE7CisgIH0KKworICByZXR1cm4gcmV0VmFsOworfQorCisvKiAjODogVGhlIHJhbmdlIG9mIHRoZSB0YXJnZXQgbG91ZG5lc3Mgc3BlY2lmaWVkIGZvciBhIERSQyBzZXQgaGFzIHRvIGluY2x1ZGUKKyAqIHRoZSByZXF1ZXN0ZWQgZGVjb2RlciB0YXJnZXQgbG91ZG5lc3MuICovCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfcHJlU2VsZWN0aW9uUmVxdWlyZW1lbnQ4KAorICAgIFNFTF9QUk9DX0lOUFVUKiBoU2VsUHJvY0lucHV0LCBpbnQgZG93bm1peElkSW5kZXgsCisgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsCisgICAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMsCisgICAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNTZWxlY3RlZCwgU0VMX1BST0NfQ09ERUNfTU9ERSBjb2RlY01vZGUpIHsKKyAgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiByZXRWYWwgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisgIGludCBleHBsaWNpdFBlYWtJbmZvcm1hdGlvblByZXNlbnQ7CisgIEZJWFBfREJMIHNpZ25hbFBlYWtMZXZlbDsKKyAgaW50IGFkZFRvQ2FuZGlkYXRlID0gMDsKKworICBGSVhQX0RCTCBsb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGI7CisgIEZJWFBfREJMIGxvdWRuZXNzOworCisgIEZJWFBfREJMIGxvdWRuZXNzRGV2aWF0aW9uTWF4ID0KKyAgICAgICgoRklYUF9EQkwpaFNlbFByb2NJbnB1dC0+bG91ZG5lc3NEZXZpYXRpb25NYXgpIDw8IChERlJBQ1RfQklUUyAtIDEgLSA3KTsKKyAgOworCisgIGlmIChoU2VsUHJvY0lucHV0LT5sb3VkbmVzc05vcm1hbGl6YXRpb25PbikgeworICAgIHJldFZhbCA9IF9nZXRMb3VkbmVzcyhoTG91ZG5lc3NJbmZvU2V0LCBoU2VsUHJvY0lucHV0LT5hbGJ1bU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhTZWxQcm9jSW5wdXQtPmxvdWRuZXNzTWVhc3VyZW1lbnRNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhTZWxQcm9jSW5wdXQtPmxvdWRuZXNzTWVhc3VyZW1lbnRTeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhTZWxQcm9jSW5wdXQtPnRhcmdldExvdWRuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMtPmRyY1NldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoU2VsUHJvY0lucHV0LT5kb3dubWl4SWRSZXF1ZXN0ZWRbZG93bm1peElkSW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiLCAmbG91ZG5lc3MpOworICAgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKyAgfSBlbHNlIHsKKyAgICBsb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGIgPSAoRklYUF9EQkwpMDsKKyAgICBsb3VkbmVzcyA9IFVOREVGSU5FRF9MT1VETkVTU19WQUxVRTsKKyAgfQorCisgIHJldFZhbCA9IF9nZXRTaWduYWxQZWFrTGV2ZWwoCisgICAgICBoU2VsUHJvY0lucHV0LCBoVW5pRHJjQ29uZmlnLCBoTG91ZG5lc3NJbmZvU2V0LCBwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMsCisgICAgICBoU2VsUHJvY0lucHV0LT5kb3dubWl4SWRSZXF1ZXN0ZWRbZG93bm1peElkSW5kZXhdLAorICAgICAgJmV4cGxpY2l0UGVha0luZm9ybWF0aW9uUHJlc2VudCwgJnNpZ25hbFBlYWtMZXZlbCwgY29kZWNNb2RlCisKKyAgKTsKKyAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworCisgIGlmIChoU2VsUHJvY0lucHV0LT5keW5hbWljUmFuZ2VDb250cm9sT24pIHsKKyAgICBpZiAoZXhwbGljaXRQZWFrSW5mb3JtYXRpb25QcmVzZW50ID09IDApIHsKKyAgICAgIGlmIChwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMtPmRyY1NldFRhcmdldExvdWRuZXNzUHJlc2VudCAmJgorICAgICAgICAgICgoaFNlbFByb2NJbnB1dC0+bG91ZG5lc3NOb3JtYWxpemF0aW9uT24gJiYKKyAgICAgICAgICAgIF90YXJnZXRMb3VkbmVzc0luUmFuZ2UocERyY0luc3RydWN0aW9uVW5pRHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2VsUHJvY0lucHV0LT50YXJnZXRMb3VkbmVzcykpIHx8CisgICAgICAgICAgICFoU2VsUHJvY0lucHV0LT5sb3VkbmVzc05vcm1hbGl6YXRpb25PbikpIHsKKyAgICAgICAgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBwRGF0YSA9CisgICAgICAgICAgICBfZHJjZGVjX3NlbGVjdGlvbl9hZGROZXcocENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgICAgIGlmIChwRGF0YSA9PSBOVUxMKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKworICAgICAgICBfc2V0U2VsZWN0aW9uRGF0YUluZm8ocERhdGEsIGxvdWRuZXNzLCBsb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2VsUHJvY0lucHV0LT5sb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGJNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3VkbmVzc0RldmlhdGlvbk1heCwgc2lnbmFsUGVha0xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNlbFByb2NJbnB1dC0+b3V0cHV0UGVha0xldmVsTWF4LCAwKTsKKyAgICAgICAgcERhdGEtPmRvd25taXhJZFJlcXVlc3RJbmRleCA9IGRvd25taXhJZEluZGV4OworICAgICAgICBwRGF0YS0+cEluc3QgPSBwRHJjSW5zdHJ1Y3Rpb25VbmlEcmM7CisgICAgICAgIHBEYXRhLT5zZWxlY3Rpb25GbGFnID0KKyAgICAgICAgICAgIDE7IC8qIHNpZ25hbCBwcmUtc2VsZWN0aW9uIHN0ZXAgZGVhbGluZyB3aXRoIGRyY1NldFRhcmdldExvdWRuZXNzICovCisKKyAgICAgICAgaWYgKGhTZWxQcm9jSW5wdXQtPmxvdWRuZXNzTm9ybWFsaXphdGlvbk9uKSB7CisgICAgICAgICAgcERhdGEtPm91dHB1dFBlYWtMZXZlbCA9CisgICAgICAgICAgICAgIGhTZWxQcm9jSW5wdXQtPnRhcmdldExvdWRuZXNzIC0KKyAgICAgICAgICAgICAgKCgoRklYUF9EQkwpcERhdGEtPnBJbnN0LT5kcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlVXBwZXIpCisgICAgICAgICAgICAgICA8PCAoREZSQUNUX0JJVFMgLSAxIC0gNykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBEYXRhLT5vdXRwdXRQZWFrTGV2ZWwgPSAoRklYUF9EQkwpMDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCghaFNlbFByb2NJbnB1dC0+bG91ZG5lc3NOb3JtYWxpemF0aW9uT24pIHx8CisgICAgICAgICAgICAoIXBEcmNJbnN0cnVjdGlvblVuaURyYy0+ZHJjU2V0VGFyZ2V0TG91ZG5lc3NQcmVzZW50KSB8fAorICAgICAgICAgICAgKGhTZWxQcm9jSW5wdXQtPmxvdWRuZXNzTm9ybWFsaXphdGlvbk9uICYmCisgICAgICAgICAgICAgX3RhcmdldExvdWRuZXNzSW5SYW5nZShwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2VsUHJvY0lucHV0LT50YXJnZXRMb3VkbmVzcykpKSB7CisgICAgICAgICAgYWRkVG9DYW5kaWRhdGUgPSAxOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGFkZFRvQ2FuZGlkYXRlID0gMTsKKyAgICB9CisKKyAgICBpZiAoYWRkVG9DYW5kaWRhdGUpIHsKKyAgICAgIERSQ0RFQ19TRUxFQ1RJT05fREFUQSogcERhdGEgPQorICAgICAgICAgIF9kcmNkZWNfc2VsZWN0aW9uX2FkZE5ldyhwQ2FuZGlkYXRlc1BvdGVudGlhbCk7CisgICAgICBpZiAocERhdGEgPT0gTlVMTCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgICAgIF9zZXRTZWxlY3Rpb25EYXRhSW5mbyhwRGF0YSwgbG91ZG5lc3MsIGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2VsUHJvY0lucHV0LT5sb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGJNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG91ZG5lc3NEZXZpYXRpb25NYXgsIHNpZ25hbFBlYWtMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2VsUHJvY0lucHV0LT5vdXRwdXRQZWFrTGV2ZWxNYXgsIDApOworICAgICAgcERhdGEtPmRvd25taXhJZFJlcXVlc3RJbmRleCA9IGRvd25taXhJZEluZGV4OworICAgICAgcERhdGEtPnBJbnN0ID0gcERyY0luc3RydWN0aW9uVW5pRHJjOworICAgICAgcERhdGEtPnNlbGVjdGlvbkZsYWcgPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAocERyY0luc3RydWN0aW9uVW5pRHJjLT5kcmNTZXRJZCA8IDApIHsKKyAgICAgIERSQ0RFQ19TRUxFQ1RJT05fREFUQSogcERhdGEgPQorICAgICAgICAgIF9kcmNkZWNfc2VsZWN0aW9uX2FkZE5ldyhwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICAgIGlmIChwRGF0YSA9PSBOVUxMKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKworICAgICAgX3NldFNlbGVjdGlvbkRhdGFJbmZvKHBEYXRhLCBsb3VkbmVzcywgbG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTZWxQcm9jSW5wdXQtPmxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYk1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3VkbmVzc0RldmlhdGlvbk1heCwgc2lnbmFsUGVha0xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTZWxQcm9jSW5wdXQtPm91dHB1dFBlYWtMZXZlbE1heCwgMSk7CisKKyAgICAgIHBEYXRhLT5kb3dubWl4SWRSZXF1ZXN0SW5kZXggPSBkb3dubWl4SWRJbmRleDsKKyAgICAgIHBEYXRhLT5wSW5zdCA9IHBEcmNJbnN0cnVjdGlvblVuaURyYzsKKyAgICAgIHBEYXRhLT5zZWxlY3Rpb25GbGFnID0gMDsKKyAgICB9CisgIH0KKworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworfQorCisvKiAjOTogQ2xpcHBpbmcgaXMgbWluaW1pemVkLiAqLworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX3ByZVNlbGVjdGlvblJlcXVpcmVtZW50OSgKKyAgICBTRUxfUFJPQ19JTlBVVCogaFNlbFByb2NJbnB1dCwgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNTZWxlY3RlZCkgeworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKHBDYW5kaWRhdGVzUG90ZW50aWFsKTsgaSsrKSB7CisgICAgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBwQ2FuZGlkYXRlID0KKyAgICAgICAgX2RyY2RlY19zZWxlY3Rpb25fZ2V0QXQocENhbmRpZGF0ZXNQb3RlbnRpYWwsIGkpOworICAgIGlmIChwQ2FuZGlkYXRlID09IE5VTEwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworCisgICAgaWYgKHBDYW5kaWRhdGUtPm91dHB1dFBlYWtMZXZlbCA8PSBoU2VsUHJvY0lucHV0LT5vdXRwdXRQZWFrTGV2ZWxNYXgpIHsKKyAgICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9hZGQocENhbmRpZGF0ZXNTZWxlY3RlZCwgcENhbmRpZGF0ZSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgICAgfQorICB9CisKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2RyY1NldFByZVNlbGVjdGlvblNpbmdsZUluc3RydWN0aW9uKAorICAgIFNFTF9QUk9DX0lOUFVUKiBoU2VsUHJvY0lucHV0LCBpbnQgZG93bm1peElkSW5kZXgsCisgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsCisgICAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMsCisgICAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNTZWxlY3RlZCwgU0VMX1BST0NfQ09ERUNfTU9ERSBjb2RlY01vZGUpIHsKKyAgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiByZXRWYWwgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisgIGludCBtYXRjaEZvdW5kID0gMDsKKyAgRFJDX0NPRUZGSUNJRU5UU19VTklfRFJDKiBwQ29lZiA9CisgICAgICBzZWxlY3REcmNDb2VmZmljaWVudHMoaFVuaURyY0NvbmZpZywgTE9DQVRJT05fU0VMRUNURUQpOworCisgIHJldFZhbCA9IF9wcmVTZWxlY3Rpb25SZXF1aXJlbWVudDEyMygKKyAgICAgIGhTZWxQcm9jSW5wdXQtPmRvd25taXhJZFJlcXVlc3RlZFtkb3dubWl4SWRJbmRleF0sIHBEcmNJbnN0cnVjdGlvblVuaURyYywKKyAgICAgICZtYXRjaEZvdW5kKTsKKworICBpZiAoIXJldFZhbCAmJiBtYXRjaEZvdW5kKQorICAgIHJldFZhbCA9IF9wcmVTZWxlY3Rpb25SZXF1aXJlbWVudDQocERyY0luc3RydWN0aW9uVW5pRHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNlbFByb2NJbnB1dC0+ZHluYW1pY1JhbmdlQ29udHJvbE9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hdGNoRm91bmQpOworCisgIGlmICghcmV0VmFsICYmIG1hdGNoRm91bmQpCisgICAgcmV0VmFsID0KKyAgICAgICAgX3ByZVNlbGVjdGlvblJlcXVpcmVtZW50NShwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMsIHBDb2VmLCAmbWF0Y2hGb3VuZCk7CisKKyAgaWYgKCFyZXRWYWwgJiYgbWF0Y2hGb3VuZCkKKyAgICByZXRWYWwgPSBfcHJlU2VsZWN0aW9uUmVxdWlyZW1lbnQ2KHBEcmNJbnN0cnVjdGlvblVuaURyYywgJm1hdGNoRm91bmQpOworCisgIGlmICghcmV0VmFsICYmIG1hdGNoRm91bmQpCisgICAgcmV0VmFsID0gX3ByZVNlbGVjdGlvblJlcXVpcmVtZW50NyhwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMsICZtYXRjaEZvdW5kKTsKKworICBpZiAoIXJldFZhbCAmJiBtYXRjaEZvdW5kKQorICAgIHJldFZhbCA9IF9wcmVTZWxlY3Rpb25SZXF1aXJlbWVudDgoCisgICAgICAgIGhTZWxQcm9jSW5wdXQsIGRvd25taXhJZEluZGV4LCBoVW5pRHJjQ29uZmlnLCBoTG91ZG5lc3NJbmZvU2V0LAorICAgICAgICBwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMsIHBDYW5kaWRhdGVzUG90ZW50aWFsLCBwQ2FuZGlkYXRlc1NlbGVjdGVkLAorICAgICAgICBjb2RlY01vZGUpOworCisgIHJldHVybiByZXRWYWw7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9kcmNTZXRTZWxlY3Rpb25BZGRDYW5kaWRhdGVzKAorICAgIFNFTF9QUk9DX0lOUFVUKiBoU2VsUHJvY0lucHV0LCBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1NlbGVjdGVkKSB7CisgIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gcmV0VmFsID0gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworICBpbnQgbkhpdENvdW50ID0gMDsKKyAgaW50IGk7CisKKyAgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBwQ2FuZGlkYXRlID0gTlVMTDsKKyAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMgPSBOVUxMOworCisgIGZvciAoaSA9IDA7IGkgPCBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIocENhbmRpZGF0ZXNQb3RlbnRpYWwpOyBpKyspIHsKKyAgICBwQ2FuZGlkYXRlID0gX2RyY2RlY19zZWxlY3Rpb25fZ2V0QXQocENhbmRpZGF0ZXNQb3RlbnRpYWwsIGkpOworICAgIGlmIChwQ2FuZGlkYXRlID09IE5VTEwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworCisgICAgcERyY0luc3RydWN0aW9uVW5pRHJjID0gcENhbmRpZGF0ZS0+cEluc3Q7CisKKyAgICBpZiAoX3RhcmdldExvdWRuZXNzSW5SYW5nZShwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNlbFByb2NJbnB1dC0+dGFyZ2V0TG91ZG5lc3MpKSB7CisgICAgICBuSGl0Q291bnQrKzsKKyAgICB9CisgIH0KKworICBpZiAobkhpdENvdW50ICE9IDApIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKHBDYW5kaWRhdGVzUG90ZW50aWFsKTsgaSsrKSB7CisgICAgICBwQ2FuZGlkYXRlID0gX2RyY2RlY19zZWxlY3Rpb25fZ2V0QXQocENhbmRpZGF0ZXNQb3RlbnRpYWwsIGkpOworICAgICAgaWYgKHBDYW5kaWRhdGUgPT0gTlVMTCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgICAgIHBEcmNJbnN0cnVjdGlvblVuaURyYyA9IHBDYW5kaWRhdGUtPnBJbnN0OworCisgICAgICBpZiAoX3RhcmdldExvdWRuZXNzSW5SYW5nZShwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2VsUHJvY0lucHV0LT50YXJnZXRMb3VkbmVzcykpIHsKKyAgICAgICAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2FkZChwQ2FuZGlkYXRlc1NlbGVjdGVkLCBwQ2FuZGlkYXRlKSA9PSBOVUxMKQorICAgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBGSVhQX0RCTCBsb3dlc3RQZWFrTGV2ZWwgPSBNQVhWQUxfREJMOyAvKiBlID0gNyAqLworICAgIEZJWFBfREJMIHBlYWtMZXZlbCA9IDA7ICAgICAgICAgICAgICAgIC8qIGUgPSA3ICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKHBDYW5kaWRhdGVzUG90ZW50aWFsKTsgaSsrKSB7CisgICAgICBwQ2FuZGlkYXRlID0gX2RyY2RlY19zZWxlY3Rpb25fZ2V0QXQocENhbmRpZGF0ZXNQb3RlbnRpYWwsIGkpOworICAgICAgaWYgKHBDYW5kaWRhdGUgPT0gTlVMTCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgICAgIHBlYWtMZXZlbCA9IHBDYW5kaWRhdGUtPm91dHB1dFBlYWtMZXZlbDsKKworICAgICAgaWYgKHBlYWtMZXZlbCA8IGxvd2VzdFBlYWtMZXZlbCkgeworICAgICAgICBsb3dlc3RQZWFrTGV2ZWwgPSBwZWFrTGV2ZWw7CisgICAgICB9CisgICAgfQorCisgICAgLyogYWRkIGFsbCB3aXRoIGxvd2VzdCBwZWFrIGxldmVsIG9yIG1heCAxZEIgYWJvdmUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKHBDYW5kaWRhdGVzUG90ZW50aWFsKTsgaSsrKSB7CisgICAgICBGSVhQX0RCTCBsb3VkbmVzc0RldmlhdGlvbk1heCA9CisgICAgICAgICAgKChGSVhQX0RCTCloU2VsUHJvY0lucHV0LT5sb3VkbmVzc0RldmlhdGlvbk1heCkKKyAgICAgICAgICA8PCAoREZSQUNUX0JJVFMgLSAxIC0gNyk7IC8qIGUgPSA3ICovCisKKyAgICAgIHBDYW5kaWRhdGUgPSBfZHJjZGVjX3NlbGVjdGlvbl9nZXRBdChwQ2FuZGlkYXRlc1BvdGVudGlhbCwgaSk7CisgICAgICBpZiAocENhbmRpZGF0ZSA9PSBOVUxMKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKworICAgICAgcGVha0xldmVsID0gcENhbmRpZGF0ZS0+b3V0cHV0UGVha0xldmVsOworCisgICAgICBpZiAocGVha0xldmVsID09IGxvd2VzdFBlYWtMZXZlbCB8fAorICAgICAgICAgIHBlYWtMZXZlbCA8PQorICAgICAgICAgICAgICBsb3dlc3RQZWFrTGV2ZWwgKyBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSkgeworICAgICAgICBGSVhQX0RCTCBhZGp1c3RtZW50ID0KKyAgICAgICAgICAgIGZNYXgoKEZJWFBfREJMKTAsIHBlYWtMZXZlbCAtIGhTZWxQcm9jSW5wdXQtPm91dHB1dFBlYWtMZXZlbE1heCk7CisgICAgICAgIGFkanVzdG1lbnQgPSBmTWluKGFkanVzdG1lbnQsIGZNYXgoKEZJWFBfREJMKTAsIGxvdWRuZXNzRGV2aWF0aW9uTWF4KSk7CisKKyAgICAgICAgcENhbmRpZGF0ZS0+bG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiQWRqdXN0ZWQgLT0gYWRqdXN0bWVudDsKKyAgICAgICAgcENhbmRpZGF0ZS0+b3V0cHV0UGVha0xldmVsIC09IGFkanVzdG1lbnQ7CisgICAgICAgIHBDYW5kaWRhdGUtPm91dHB1dExvdWRuZXNzIC09IGFkanVzdG1lbnQ7CisgICAgICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9hZGQocENhbmRpZGF0ZXNTZWxlY3RlZCwgcENhbmRpZGF0ZSkgPT0gTlVMTCkKKyAgICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0VmFsOworfQorCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZGVwZW5kZW50RHJjSW5zdHJ1Y3Rpb24oCisgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcEluc3QsCisgICAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiogcHBEcmNJbnN0cnVjdGlvbnNEZXBlbmRlbnQpIHsKKyAgaW50IGk7CisgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcERlcGVuZGVudERyYyA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY0NvdW50OyBpKyspIHsKKyAgICBwRGVwZW5kZW50RHJjID0KKyAgICAgICAgKERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyopJihoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNbaV0pOworCisgICAgaWYgKHBEZXBlbmRlbnREcmMtPmRyY1NldElkID09IHBJbnN0LT5kZXBlbmRzT25EcmNTZXQpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChpID09IGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY0NvdW50KSB7CisgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgIH0KKworICBpZiAocERlcGVuZGVudERyYy0+ZGVwZW5kc09uRHJjU2V0UHJlc2VudCA9PSAxKSB7CisgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgIH0KKworICAqcHBEcmNJbnN0cnVjdGlvbnNEZXBlbmRlbnQgPSBwRGVwZW5kZW50RHJjOworCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9zZWxlY3REcmNTZXRFZmZlY3ROb25lKAorICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLCBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1NlbGVjdGVkKSB7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIocENhbmRpZGF0ZXNQb3RlbnRpYWwpOyBpKyspIHsKKyAgICBEUkNERUNfU0VMRUNUSU9OX0RBVEEqIHBDYW5kaWRhdGUgPQorICAgICAgICBfZHJjZGVjX3NlbGVjdGlvbl9nZXRBdChwQ2FuZGlkYXRlc1BvdGVudGlhbCwgaSk7CisgICAgaWYgKHBDYW5kaWRhdGUgPT0gTlVMTCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgICBpZiAoKHBDYW5kaWRhdGUtPnBJbnN0LT5kcmNTZXRFZmZlY3QgJiAweGZmKSA9PSAwKSB7CisgICAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fYWRkKHBDYW5kaWRhdGVzU2VsZWN0ZWQsIHBDYW5kaWRhdGUpID09IE5VTEwpCisgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICAgIH0KKyAgfQorCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9zZWxlY3RTaW5nbGVFZmZlY3RUeXBlKAorICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLCBEUkNfRUZGRUNUX1RZUEVfUkVRVUVTVCBlZmZlY3RUeXBlLAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzU2VsZWN0ZWQpIHsKKyAgaW50IGk7CisgIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gcmV0VmFsID0gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBJbnN0OworICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBEcmNJbnN0cnVjdGlvbnNEZXBlbmRlbnQ7CisKKyAgaWYgKGVmZmVjdFR5cGUgPT0gREVUUl9OT05FKSB7CisgICAgcmV0VmFsID0gX3NlbGVjdERyY1NldEVmZmVjdE5vbmUoaFVuaURyY0NvbmZpZywgcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworICB9IGVsc2UgeworICAgIGludCBlZmZlY3RCaXRQb3NpdGlvbiA9IDEgPDwgKGVmZmVjdFR5cGUgLSAxKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIocENhbmRpZGF0ZXNQb3RlbnRpYWwpOyBpKyspIHsKKyAgICAgIERSQ0RFQ19TRUxFQ1RJT05fREFUQSogcENhbmRpZGF0ZSA9CisgICAgICAgICAgX2RyY2RlY19zZWxlY3Rpb25fZ2V0QXQocENhbmRpZGF0ZXNQb3RlbnRpYWwsIGkpOworICAgICAgaWYgKHBDYW5kaWRhdGUgPT0gTlVMTCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgICAgIHBJbnN0ID0gcENhbmRpZGF0ZS0+cEluc3Q7CisKKyAgICAgIGlmICghcEluc3QtPmRlcGVuZHNPbkRyY1NldFByZXNlbnQpIHsKKyAgICAgICAgaWYgKChwSW5zdC0+ZHJjU2V0RWZmZWN0ICYgZWZmZWN0Qml0UG9zaXRpb24pKSB7CisgICAgICAgICAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2FkZChwQ2FuZGlkYXRlc1NlbGVjdGVkLCBwQ2FuZGlkYXRlKSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldFZhbCA9IF9kZXBlbmRlbnREcmNJbnN0cnVjdGlvbihoVW5pRHJjQ29uZmlnLCBwSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRHJjSW5zdHJ1Y3Rpb25zRGVwZW5kZW50KTsKKyAgICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworCisgICAgICAgIGlmICgoKHBJbnN0LT5kcmNTZXRFZmZlY3QgJiBlZmZlY3RCaXRQb3NpdGlvbikpIHx8CisgICAgICAgICAgICAoKHBEcmNJbnN0cnVjdGlvbnNEZXBlbmRlbnQtPmRyY1NldEVmZmVjdCAmIGVmZmVjdEJpdFBvc2l0aW9uKSkpIHsKKyAgICAgICAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fYWRkKHBDYW5kaWRhdGVzU2VsZWN0ZWQsIHBDYW5kaWRhdGUpID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiByZXRWYWw7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9zZWxlY3RFZmZlY3RUeXBlRmVhdHVyZSgKKyAgICBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywgRFJDX0ZFQVRVUkVfUkVRVUVTVCBkcmNGZWF0dXJlUmVxdWVzdCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiogcHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgIERSQ0RFQ19TRUxFQ1RJT04qKiBwcENhbmRpZGF0ZXNTZWxlY3RlZCkgeworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHJldFZhbCA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKyAgaW50IGk7CisgIGludCBkZXNpcmVkRWZmZWN0VHlwZUZvdW5kID0gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgZHJjRmVhdHVyZVJlcXVlc3QuZHJjRWZmZWN0VHlwZS5udW1SZXF1ZXN0c0Rlc2lyZWQ7IGkrKykgeworICAgIHJldFZhbCA9IF9zZWxlY3RTaW5nbGVFZmZlY3RUeXBlKAorICAgICAgICBoVW5pRHJjQ29uZmlnLCBkcmNGZWF0dXJlUmVxdWVzdC5kcmNFZmZlY3RUeXBlLnJlcXVlc3RbaV0sCisgICAgICAgICpwcENhbmRpZGF0ZXNQb3RlbnRpYWwsICpwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworCisgICAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcigqcHBDYW5kaWRhdGVzU2VsZWN0ZWQpKSB7CisgICAgICBkZXNpcmVkRWZmZWN0VHlwZUZvdW5kID0gMTsKKyAgICAgIF9zd2FwU2VsZWN0aW9uQW5kQ2xlYXIocHBDYW5kaWRhdGVzUG90ZW50aWFsLCBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgfQorICB9CisKKyAgaWYgKCFkZXNpcmVkRWZmZWN0VHlwZUZvdW5kKSB7CisgICAgZm9yIChpID0gZHJjRmVhdHVyZVJlcXVlc3QuZHJjRWZmZWN0VHlwZS5udW1SZXF1ZXN0c0Rlc2lyZWQ7CisgICAgICAgICBpIDwgZHJjRmVhdHVyZVJlcXVlc3QuZHJjRWZmZWN0VHlwZS5udW1SZXF1ZXN0czsgaSsrKSB7CisgICAgICByZXRWYWwgPSBfc2VsZWN0U2luZ2xlRWZmZWN0VHlwZSgKKyAgICAgICAgICBoVW5pRHJjQ29uZmlnLCBkcmNGZWF0dXJlUmVxdWVzdC5kcmNFZmZlY3RUeXBlLnJlcXVlc3RbaV0sCisgICAgICAgICAgKnBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICAgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKworICAgICAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcigqcHBDYW5kaWRhdGVzU2VsZWN0ZWQpKSB7CisgICAgICAgIF9zd2FwU2VsZWN0aW9uQW5kQ2xlYXIocHBDYW5kaWRhdGVzUG90ZW50aWFsLCBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIF9zd2FwU2VsZWN0aW9uKHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworCisgIHJldHVybiByZXRWYWw7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9zZWxlY3REeW5hbWljUmFuZ2UoCisgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsCisgICAgRFJDX0ZFQVRVUkVfUkVRVUVTVCBkcmNGZWF0dXJlUmVxdWVzdCwgVUNIQVIqIHBEb3dubWl4SWRSZXF1ZXN0ZWQsCisgICAgaW50IGFsYnVtTW9kZSwgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgRFJDREVDX1NFTEVDVElPTiogcHBDYW5kaWRhdGVzU2VsZWN0ZWQpIHsKKyAgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiByZXRWYWwgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisgIGludCBpOworICBpbnQgcGVha1RvQXZlcmFnZVByZXNlbnQ7CisgIEZJWFBfREJMIHBlYWtUb0F2ZXJhZ2U7CisKKyAgRklYUF9EQkwgbWluVmFsID0gTUFYVkFMX0RCTDsKKyAgRklYUF9EQkwgdmFsID0gMDsKKworICBpbnQgbnVtU2VsZWN0ZWRDYW5kaWRhdGVzID0gX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKHBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKworICBmb3IgKGkgPSAwOyBpIDwgX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKHBDYW5kaWRhdGVzUG90ZW50aWFsKTsgaSsrKSB7CisgICAgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBwQ2FuZGlkYXRlID0KKyAgICAgICAgX2RyY2RlY19zZWxlY3Rpb25fZ2V0QXQocENhbmRpZGF0ZXNQb3RlbnRpYWwsIGkpOworICAgIGlmIChwQ2FuZGlkYXRlID09IE5VTEwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworCisgICAgcmV0VmFsID0gX2R5bmFtaWNSYW5nZU1lYXN1cmVtZW50KAorICAgICAgICBoTG91ZG5lc3NJbmZvU2V0LCBwQ2FuZGlkYXRlLT5wSW5zdCwKKyAgICAgICAgcERvd25taXhJZFJlcXVlc3RlZFtwQ2FuZGlkYXRlLT5kb3dubWl4SWRSZXF1ZXN0SW5kZXhdLAorICAgICAgICBkcmNGZWF0dXJlUmVxdWVzdC5keW5hbWljUmFuZ2UubWVhc3VyZW1lbnRSZXF1ZXN0VHlwZSwgYWxidW1Nb2RlLAorICAgICAgICAmcGVha1RvQXZlcmFnZVByZXNlbnQsICZwZWFrVG9BdmVyYWdlKTsKKyAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisKKyAgICBpZiAocGVha1RvQXZlcmFnZVByZXNlbnQpIHsKKyAgICAgIGlmICghZHJjRmVhdHVyZVJlcXVlc3QuZHluYW1pY1JhbmdlLnJlcXVlc3RlZElzUmFuZ2UpIHsKKyAgICAgICAgdmFsID0gZkFicyhkcmNGZWF0dXJlUmVxdWVzdC5keW5hbWljUmFuZ2UucmVxdWVzdFZhbHVlIC0gcGVha1RvQXZlcmFnZSk7CisKKyAgICAgICAgaWYgKG1pblZhbCA+IHZhbCkgeworICAgICAgICAgIG1pblZhbCA9IHZhbDsKKworICAgICAgICAgIF9kcmNkZWNfc2VsZWN0aW9uX3NldE51bWJlcihwcENhbmRpZGF0ZXNTZWxlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2VsZWN0ZWRDYW5kaWRhdGVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fYWRkKHBwQ2FuZGlkYXRlc1NlbGVjdGVkLCBwQ2FuZGlkYXRlKSA9PSBOVUxMKQorICAgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChwZWFrVG9BdmVyYWdlID49IGRyY0ZlYXR1cmVSZXF1ZXN0LmR5bmFtaWNSYW5nZS5yZXF1ZXN0VmFsdWVNaW4pICYmCisgICAgICAgICAgICAocGVha1RvQXZlcmFnZSA8PSBkcmNGZWF0dXJlUmVxdWVzdC5keW5hbWljUmFuZ2UucmVxdWVzdFZhbHVlTWF4KSkgeworICAgICAgICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9hZGQocHBDYW5kaWRhdGVzU2VsZWN0ZWQsIHBDYW5kaWRhdGUpID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiByZXRWYWw7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9zZWxlY3RTaW5nbGVEcmNDaGFyYWN0ZXJpc3RpYygKKyAgICBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywgaW50IHJlcXVlc3RlZERyY0NoYXJhY3RlcmlzdGljLAorICAgIERSQ0RFQ19TRUxFQ1RJT04qKiBwcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1NlbGVjdGVkKSB7CisgIGludCBpLCBqLCBiOworICBpbnQgaGl0ID0gMDsKKworICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBJbnN0ID0gTlVMTDsKKyAgRFJDX0NPRUZGSUNJRU5UU19VTklfRFJDKiBwQ29lZiA9IE5VTEw7CisgIEdBSU5fU0VUKiBwR2FpblNldCA9IE5VTEw7CisKKyAgaWYgKHJlcXVlc3RlZERyY0NoYXJhY3RlcmlzdGljIDwgMSkgeworICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICB9CisKKyAgcENvZWYgPSBzZWxlY3REcmNDb2VmZmljaWVudHMoaFVuaURyY0NvbmZpZywgTE9DQVRJT05fU0VMRUNURUQpOworCisgIGlmIChwQ29lZiA9PSBOVUxMKSAvKiBjaGVjayBmb3IgcGFyYW1ldHJpY0RSQyAqLworICB7CisgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIoKnBwQ2FuZGlkYXRlc1BvdGVudGlhbCk7IGkrKykgeworICAgIERSQ0RFQ19TRUxFQ1RJT05fREFUQSogcENhbmRpZGF0ZSA9CisgICAgICAgIF9kcmNkZWNfc2VsZWN0aW9uX2dldEF0KCpwcENhbmRpZGF0ZXNQb3RlbnRpYWwsIGkpOworICAgIGlmIChwQ2FuZGlkYXRlID09IE5VTEwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworCisgICAgcEluc3QgPSBwQ2FuZGlkYXRlLT5wSW5zdDsKKworICAgIGhpdCA9IDA7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgcEluc3QtPm5EcmNDaGFubmVsR3JvdXBzOyBqKyspIHsKKyAgICAgIGludCBiYW5kQ291bnQgPSAwOworICAgICAgaW50IGluZGV4RHJjQ29lZmYgPSBwSW5zdC0+Z2FpblNldEluZGV4Rm9yQ2hhbm5lbEdyb3VwW2pdOworCisgICAgICBpZiAoaW5kZXhEcmNDb2VmZiA+IHBDb2VmLT5nYWluU2V0Q291bnQgLSAxKSAvKiBjaGVjayBmb3IgcGFyYW1ldHJpY0RSQyAqLworICAgICAgeworICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworICAgICAgfQorCisgICAgICBwR2FpblNldCA9ICYocENvZWYtPmdhaW5TZXRbaW5kZXhEcmNDb2VmZl0pOworICAgICAgYmFuZENvdW50ID0gcEdhaW5TZXQtPmJhbmRDb3VudDsKKworICAgICAgZm9yIChiID0gMDsgYiA8IGJhbmRDb3VudDsgYisrKSB7CisgICAgICAgIGlmICgocEdhaW5TZXQtPmRyY0NoYXJhY3RlcmlzdGljW2JdLmlzQ0lDUCkgJiYKKyAgICAgICAgICAgIChwR2FpblNldC0+ZHJjQ2hhcmFjdGVyaXN0aWNbYl0uY2ljcEluZGV4ID09CisgICAgICAgICAgICAgcmVxdWVzdGVkRHJjQ2hhcmFjdGVyaXN0aWMpKSB7CisgICAgICAgICAgaGl0ID0gMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoaGl0KSBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaGl0KSB7CisgICAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fYWRkKCpwcENhbmRpZGF0ZXNTZWxlY3RlZCwgcENhbmRpZGF0ZSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgICAgfQorICB9CisKKyAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcigqcHBDYW5kaWRhdGVzU2VsZWN0ZWQpKSB7CisgICAgX3N3YXBTZWxlY3Rpb25BbmRDbGVhcihwcENhbmRpZGF0ZXNQb3RlbnRpYWwsIHBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgfQorCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9zZWxlY3REcmNDaGFyYWN0ZXJpc3RpYygKKyAgICBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywgaW50IGRyY0NoYXJhY3RlcmlzdGljUmVxdWVzdGVkLAorICAgIERSQ0RFQ19TRUxFQ1RJT04qKiBwcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1NlbGVjdGVkKSB7CisgIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gcmV0VmFsID0gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworCisgIGNvbnN0IGludCBzZWNvbmRUcnlbMTJdID0gezAsIDIsIDMsIDQsIDUsIDYsIDUsIDksIDEwLCA3LCA4LCAxMH07CisKKyAgcmV0VmFsID0gX3NlbGVjdFNpbmdsZURyY0NoYXJhY3RlcmlzdGljKAorICAgICAgaFVuaURyY0NvbmZpZywgZHJjQ2hhcmFjdGVyaXN0aWNSZXF1ZXN0ZWQsIHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICAgIHBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworCisgIGlmICgoZHJjQ2hhcmFjdGVyaXN0aWNSZXF1ZXN0ZWQgPD0gMTEpICYmCisgICAgICAoX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKCpwcENhbmRpZGF0ZXNTZWxlY3RlZCkgPT0gMCkpIHsKKyAgICByZXRWYWwgPSBfc2VsZWN0U2luZ2xlRHJjQ2hhcmFjdGVyaXN0aWMoCisgICAgICAgIGhVbmlEcmNDb25maWcsIHNlY29uZFRyeVtkcmNDaGFyYWN0ZXJpc3RpY1JlcXVlc3RlZF0sCisgICAgICAgIHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKyAgfQorCisgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIoKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKSA9PSAwKSB7CisgICAgaWYgKChkcmNDaGFyYWN0ZXJpc3RpY1JlcXVlc3RlZCA+PSAyKSAmJgorICAgICAgICAoZHJjQ2hhcmFjdGVyaXN0aWNSZXF1ZXN0ZWQgPD0gNSkpIHsKKyAgICAgIHJldFZhbCA9IF9zZWxlY3RTaW5nbGVEcmNDaGFyYWN0ZXJpc3RpYygKKyAgICAgICAgICBoVW5pRHJjQ29uZmlnLCBkcmNDaGFyYWN0ZXJpc3RpY1JlcXVlc3RlZCAtIDEsIHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICAgICAgICBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisgICAgfSBlbHNlIGlmIChkcmNDaGFyYWN0ZXJpc3RpY1JlcXVlc3RlZCA9PSAxMSkgeworICAgICAgcmV0VmFsID0gX3NlbGVjdFNpbmdsZURyY0NoYXJhY3RlcmlzdGljKAorICAgICAgICAgIGhVbmlEcmNDb25maWcsIDksIHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworICAgIH0KKyAgfQorCisgIF9zd2FwU2VsZWN0aW9uKHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworCisgIHJldHVybiByZXRWYWw7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9kcmNTZXRGaW5hbFNlbGVjdGlvbl9wZWFrVmFsdWUwKAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzU2VsZWN0ZWQpIHsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcihwQ2FuZGlkYXRlc1BvdGVudGlhbCk7IGkrKykgeworICAgIERSQ0RFQ19TRUxFQ1RJT05fREFUQSogcENhbmRpZGF0ZSA9CisgICAgICAgIF9kcmNkZWNfc2VsZWN0aW9uX2dldEF0KHBDYW5kaWRhdGVzUG90ZW50aWFsLCBpKTsKKyAgICBpZiAocENhbmRpZGF0ZSA9PSBOVUxMKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKworICAgIGlmIChwQ2FuZGlkYXRlLT5vdXRwdXRQZWFrTGV2ZWwgPD0gRklYUF9EQkwoMCkpIHsKKyAgICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9hZGQocENhbmRpZGF0ZXNTZWxlY3RlZCwgcENhbmRpZGF0ZSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgICAgfQorICB9CisKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2RyY1NldEZpbmFsU2VsZWN0aW9uX2Rvd25taXhJZCgKKyAgICBIQU5ETEVfU0VMX1BST0NfSU5QVVQgaFNlbFByb2NJbnB1dCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiogcHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgIERSQ0RFQ19TRUxFQ1RJT04qKiBwcENhbmRpZGF0ZXNTZWxlY3RlZCkgeworICBpbnQgaSwgajsKKyAgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBwQ2FuZGlkYXRlID0gTlVMTDsKKyAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwSW5zdCA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcigqcHBDYW5kaWRhdGVzUG90ZW50aWFsKTsgaSsrKSB7CisgICAgcENhbmRpZGF0ZSA9IF9kcmNkZWNfc2VsZWN0aW9uX2dldEF0KCpwcENhbmRpZGF0ZXNQb3RlbnRpYWwsIGkpOworICAgIGlmIChwQ2FuZGlkYXRlID09IE5VTEwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworCisgICAgcEluc3QgPSBwQ2FuZGlkYXRlLT5wSW5zdDsKKworICAgIGZvciAoaiA9IDA7IGogPCBwSW5zdC0+ZG93bm1peElkQ291bnQ7IGorKykgeworICAgICAgaWYgKERPV05NSVhfSURfQkFTRV9MQVlPVVQgIT0gcEluc3QtPmRvd25taXhJZFtqXSAmJgorICAgICAgICAgIERPV05NSVhfSURfQU5ZX0RPV05NSVggIT0gcEluc3QtPmRvd25taXhJZFtqXSAmJgorICAgICAgICAgIGhTZWxQcm9jSW5wdXQKKyAgICAgICAgICAgICAgICAgIC0+ZG93bm1peElkUmVxdWVzdGVkW3BDYW5kaWRhdGUtPmRvd25taXhJZFJlcXVlc3RJbmRleF0gPT0KKyAgICAgICAgICAgICAgcEluc3QtPmRvd25taXhJZFtqXSkgeworICAgICAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fYWRkKCpwcENhbmRpZGF0ZXNTZWxlY3RlZCwgcENhbmRpZGF0ZSkgPT0gTlVMTCkKKyAgICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKCpwcENhbmRpZGF0ZXNTZWxlY3RlZCkgPT0gMCkgeworICAgIF9zd2FwU2VsZWN0aW9uKHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICB9CisKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKK30KKworc3RhdGljIGludCBfY3Jvc3NTdW0oaW50IHZhbHVlKSB7CisgIGludCBzdW0gPSAwOworCisgIHdoaWxlICh2YWx1ZSAhPSAwKSB7CisgICAgaWYgKCh2YWx1ZSAmIDEpID09IDEpIHsKKyAgICAgIHN1bSsrOworICAgIH0KKworICAgIHZhbHVlID4+PSAxOworICB9CisKKyAgcmV0dXJuIHN1bTsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2RyY1NldEZpbmFsU2VsZWN0aW9uX2VmZmVjdFR5cGVzKAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBDYW5kaWRhdGVzU2VsZWN0ZWQpIHsKKyAgaW50IGk7CisgIGludCBtaW5OdW1FZmZlY3RzID0gMTAwMDsKKyAgaW50IG51bUVmZmVjdHMgPSAwOworICBpbnQgZWZmZWN0cyA9IDA7CisgIERSQ0RFQ19TRUxFQ1RJT05fREFUQSogcENhbmRpZGF0ZSA9IE5VTEw7CisgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcEluc3QgPSBOVUxMOworCisgIGZvciAoaSA9IDA7IGkgPCBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIocENhbmRpZGF0ZXNQb3RlbnRpYWwpOyBpKyspIHsKKyAgICBwQ2FuZGlkYXRlID0gX2RyY2RlY19zZWxlY3Rpb25fZ2V0QXQocENhbmRpZGF0ZXNQb3RlbnRpYWwsIGkpOworICAgIGlmIChwQ2FuZGlkYXRlID09IE5VTEwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworCisgICAgcEluc3QgPSBwQ2FuZGlkYXRlLT5wSW5zdDsKKworICAgIGVmZmVjdHMgPSBwSW5zdC0+ZHJjU2V0RWZmZWN0OworICAgIGVmZmVjdHMgJj0gMHhmZmZmIF4gKEVCX0dFTkVSQUxfQ09NUFIpOworICAgIG51bUVmZmVjdHMgPSBfY3Jvc3NTdW0oZWZmZWN0cyk7CisKKyAgICBpZiAobnVtRWZmZWN0cyA8IG1pbk51bUVmZmVjdHMpIHsKKyAgICAgIG1pbk51bUVmZmVjdHMgPSBudW1FZmZlY3RzOworICAgIH0KKyAgfQorCisgIC8qIGFkZCBhbGwgd2l0aCBtaW5pbXVtIG51bWJlciBvZiBlZmZlY3RzICovCisgIGZvciAoaSA9IDA7IGkgPCBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIocENhbmRpZGF0ZXNQb3RlbnRpYWwpOyBpKyspIHsKKyAgICBwQ2FuZGlkYXRlID0gX2RyY2RlY19zZWxlY3Rpb25fZ2V0QXQocENhbmRpZGF0ZXNQb3RlbnRpYWwsIGkpOworICAgIGlmIChwQ2FuZGlkYXRlID09IE5VTEwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworCisgICAgcEluc3QgPSBwQ2FuZGlkYXRlLT5wSW5zdDsKKworICAgIGVmZmVjdHMgPSBwSW5zdC0+ZHJjU2V0RWZmZWN0OworICAgIGVmZmVjdHMgJj0gMHhmZmZmIF4gKEVCX0dFTkVSQUxfQ09NUFIpOworICAgIG51bUVmZmVjdHMgPSBfY3Jvc3NTdW0oZWZmZWN0cyk7CisKKyAgICBpZiAobnVtRWZmZWN0cyA9PSBtaW5OdW1FZmZlY3RzKSB7CisgICAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fYWRkKHBDYW5kaWRhdGVzU2VsZWN0ZWQsIHBDYW5kaWRhdGUpID09IE5VTEwpCisgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICAgIH0KKyAgfQorCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9zZWxlY3RTbWFsbGVzdFRhcmdldExvdWRuZXNzVmFsdWVVcHBlcigKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1NlbGVjdGVkKSB7CisgIGludCBpOworICBTQ0hBUiBtaW5WYWwgPSAweDdGOworICBTQ0hBUiB2YWwgPSAwOworICBEUkNERUNfU0VMRUNUSU9OX0RBVEEqIHBDYW5kaWRhdGUgPSBOVUxMOworCisgIGZvciAoaSA9IDA7IGkgPCBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIocENhbmRpZGF0ZXNQb3RlbnRpYWwpOyBpKyspIHsKKyAgICBwQ2FuZGlkYXRlID0gX2RyY2RlY19zZWxlY3Rpb25fZ2V0QXQocENhbmRpZGF0ZXNQb3RlbnRpYWwsIGkpOworICAgIGlmIChwQ2FuZGlkYXRlID09IE5VTEwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworCisgICAgdmFsID0gcENhbmRpZGF0ZS0+cEluc3QtPmRyY1NldFRhcmdldExvdWRuZXNzVmFsdWVVcHBlcjsKKworICAgIGlmICh2YWwgPCBtaW5WYWwpIHsKKyAgICAgIG1pblZhbCA9IHZhbDsKKyAgICB9CisgIH0KKworICAvKiBhZGQgYWxsIHdpdGggc2FtZSBzbWFsbGVzdCBkcmNTZXRUYXJnZXRMb3VkbmVzc1ZhbHVlVXBwZXIgKi8KKyAgZm9yIChpID0gMDsgaSA8IF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcihwQ2FuZGlkYXRlc1BvdGVudGlhbCk7IGkrKykgeworICAgIHBDYW5kaWRhdGUgPSBfZHJjZGVjX3NlbGVjdGlvbl9nZXRBdChwQ2FuZGlkYXRlc1BvdGVudGlhbCwgaSk7CisgICAgaWYgKHBDYW5kaWRhdGUgPT0gTlVMTCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgICB2YWwgPSBwQ2FuZGlkYXRlLT5wSW5zdC0+ZHJjU2V0VGFyZ2V0TG91ZG5lc3NWYWx1ZVVwcGVyOworCisgICAgaWYgKHZhbCA9PSBtaW5WYWwpIHsKKyAgICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9hZGQocENhbmRpZGF0ZXNTZWxlY3RlZCwgcENhbmRpZGF0ZSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgICAgfQorICB9CisKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2RyY1NldEZpbmFsU2VsZWN0aW9uX3RhcmdldExvdWRuZXNzKAorICAgIEZJWFBfREJMIHRhcmdldExvdWRuZXNzLCBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1NlbGVjdGVkKSB7CisgIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gcmV0VmFsID0gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworICBpbnQgaTsKKyAgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBwQ2FuZGlkYXRlID0gTlVMTDsKKworICBmb3IgKGkgPSAwOyBpIDwgX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKHBDYW5kaWRhdGVzUG90ZW50aWFsKTsgaSsrKSB7CisgICAgcENhbmRpZGF0ZSA9IF9kcmNkZWNfc2VsZWN0aW9uX2dldEF0KHBDYW5kaWRhdGVzUG90ZW50aWFsLCBpKTsKKyAgICBpZiAocENhbmRpZGF0ZSA9PSBOVUxMKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKworICAgIGlmIChwQ2FuZGlkYXRlLT5zZWxlY3Rpb25GbGFnID09IDApIHsKKyAgICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9hZGQocENhbmRpZGF0ZXNTZWxlY3RlZCwgcENhbmRpZGF0ZSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgICAgfQorICB9CisKKyAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcihwQ2FuZGlkYXRlc1NlbGVjdGVkKSA9PSAwKSB7CisgICAgcmV0VmFsID0gX3NlbGVjdFNtYWxsZXN0VGFyZ2V0TG91ZG5lc3NWYWx1ZVVwcGVyKHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisgIH0KKworICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKHBDYW5kaWRhdGVzU2VsZWN0ZWQpID4gMSkgeworICAgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcERyY0luc3RydWN0aW9uVW5pRHJjID0gTlVMTDsKKworICAgIF9zd2FwU2VsZWN0aW9uQW5kQ2xlYXIoJnBDYW5kaWRhdGVzUG90ZW50aWFsLCAmcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKHBDYW5kaWRhdGVzUG90ZW50aWFsKTsgaSsrKSB7CisgICAgICBwQ2FuZGlkYXRlID0gX2RyY2RlY19zZWxlY3Rpb25fZ2V0QXQocENhbmRpZGF0ZXNQb3RlbnRpYWwsIGkpOworICAgICAgaWYgKHBDYW5kaWRhdGUgPT0gTlVMTCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgICAgIHBEcmNJbnN0cnVjdGlvblVuaURyYyA9IHBDYW5kaWRhdGUtPnBJbnN0OworCisgICAgICBpZiAoX3RhcmdldExvdWRuZXNzSW5SYW5nZShwRHJjSW5zdHJ1Y3Rpb25VbmlEcmMsIHRhcmdldExvdWRuZXNzKSkgeworICAgICAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fYWRkKHBDYW5kaWRhdGVzU2VsZWN0ZWQsIHBDYW5kaWRhdGUpID09IE5VTEwpCisgICAgICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcihwQ2FuZGlkYXRlc1NlbGVjdGVkKSA+IDEpIHsKKyAgICAgIF9zd2FwU2VsZWN0aW9uQW5kQ2xlYXIoJnBDYW5kaWRhdGVzUG90ZW50aWFsLCAmcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisKKyAgICAgIHJldFZhbCA9IF9zZWxlY3RTbWFsbGVzdFRhcmdldExvdWRuZXNzVmFsdWVVcHBlcihwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICAgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0VmFsOworfQorCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZHJjU2V0RmluYWxTZWxlY3Rpb25fcGVha1ZhbHVlTGFyZ2VzdCgKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiBwQ2FuZGlkYXRlc1NlbGVjdGVkKSB7CisgIGludCBpOworICBGSVhQX0RCTCBsYXJnZXN0UGVha0xldmVsID0gTUlOVkFMX0RCTDsKKyAgRklYUF9EQkwgcGVha0xldmVsID0gMDsKKyAgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBwQ2FuZGlkYXRlID0gTlVMTDsKKworICBmb3IgKGkgPSAwOyBpIDwgX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKHBDYW5kaWRhdGVzUG90ZW50aWFsKTsgaSsrKSB7CisgICAgcENhbmRpZGF0ZSA9IF9kcmNkZWNfc2VsZWN0aW9uX2dldEF0KHBDYW5kaWRhdGVzUG90ZW50aWFsLCBpKTsKKyAgICBpZiAocENhbmRpZGF0ZSA9PSBOVUxMKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKworICAgIHBlYWtMZXZlbCA9IHBDYW5kaWRhdGUtPm91dHB1dFBlYWtMZXZlbDsKKworICAgIGlmIChwZWFrTGV2ZWwgPiBsYXJnZXN0UGVha0xldmVsKSB7CisgICAgICBsYXJnZXN0UGVha0xldmVsID0gcGVha0xldmVsOworICAgIH0KKyAgfQorCisgIC8qIGFkZCBhbGwgd2l0aCBzYW1lIGxhcmdlc3QgcGVhayBsZXZlbCAqLworICBmb3IgKGkgPSAwOyBpIDwgX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKHBDYW5kaWRhdGVzUG90ZW50aWFsKTsgaSsrKSB7CisgICAgcENhbmRpZGF0ZSA9IF9kcmNkZWNfc2VsZWN0aW9uX2dldEF0KHBDYW5kaWRhdGVzUG90ZW50aWFsLCBpKTsKKyAgICBpZiAocENhbmRpZGF0ZSA9PSBOVUxMKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKworICAgIHBlYWtMZXZlbCA9IHBDYW5kaWRhdGUtPm91dHB1dFBlYWtMZXZlbDsKKworICAgIGlmIChwZWFrTGV2ZWwgPT0gbGFyZ2VzdFBlYWtMZXZlbCkgeworICAgICAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2FkZChwQ2FuZGlkYXRlc1NlbGVjdGVkLCBwQ2FuZGlkYXRlKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgICB9CisgIH0KKworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworfQorCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZHJjU2V0RmluYWxTZWxlY3Rpb25fZHJjU2V0SWQoCisgICAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNTZWxlY3RlZCkgeworICBpbnQgaTsKKyAgaW50IGxhcmdlc3RJZCA9IC0xMDAwOworICBpbnQgaWQgPSAwOworICBEUkNERUNfU0VMRUNUSU9OX0RBVEEqIHBDYW5kaWRhdGUgPSBOVUxMOworICBEUkNERUNfU0VMRUNUSU9OX0RBVEEqIHBDYW5kaWRhdGVTZWxlY3RlZCA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcihwQ2FuZGlkYXRlc1BvdGVudGlhbCk7IGkrKykgeworICAgIHBDYW5kaWRhdGUgPSBfZHJjZGVjX3NlbGVjdGlvbl9nZXRBdChwQ2FuZGlkYXRlc1BvdGVudGlhbCwgaSk7CisgICAgaWYgKHBDYW5kaWRhdGUgPT0gTlVMTCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgICBpZCA9IHBDYW5kaWRhdGUtPnBJbnN0LT5kcmNTZXRJZDsKKworICAgIGlmIChpZCA+IGxhcmdlc3RJZCkgeworICAgICAgbGFyZ2VzdElkID0gaWQ7CisgICAgICBwQ2FuZGlkYXRlU2VsZWN0ZWQgPSBwQ2FuZGlkYXRlOworICAgIH0KKyAgfQorCisgIGlmIChwQ2FuZGlkYXRlU2VsZWN0ZWQgIT0gTlVMTCkgeworICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9hZGQocENhbmRpZGF0ZXNTZWxlY3RlZCwgcENhbmRpZGF0ZVNlbGVjdGVkKSA9PSBOVUxMKQorICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgIH0KKworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworfQorCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZHJjU2V0RmluYWxTZWxlY3Rpb24oCisgICAgSEFORExFX1NFTF9QUk9DX0lOUFVUIGhTZWxQcm9jSW5wdXQsIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLAorICAgIERSQ0RFQ19TRUxFQ1RJT04qKiBwcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1NlbGVjdGVkLCBTRUxfUFJPQ19DT0RFQ19NT0RFIGNvZGVjTW9kZSkgeworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHJldFZhbCA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKworICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKCpwcENhbmRpZGF0ZXNQb3RlbnRpYWwpID09IDApIHsKKyAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgfSBlbHNlIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIoKnBwQ2FuZGlkYXRlc1BvdGVudGlhbCkgPT0gMSkgeworICAgIF9zd2FwU2VsZWN0aW9uKHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgIC8qIGZpbmlzaGVkICovCisgIH0gZWxzZSAvKiA+IDEgKi8KKyAgeworICAgIHJldFZhbCA9IF9kcmNTZXRGaW5hbFNlbGVjdGlvbl9wZWFrVmFsdWUwKCpwcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisKKyAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKCpwcENhbmRpZGF0ZXNTZWxlY3RlZCkgPiAxKSB7CisgICAgICBfc3dhcFNlbGVjdGlvbkFuZENsZWFyKHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgICAgcmV0VmFsID0gX2RyY1NldEZpbmFsU2VsZWN0aW9uX2Rvd25taXhJZCgKKyAgICAgICAgICBoU2VsUHJvY0lucHV0LCBwcENhbmRpZGF0ZXNQb3RlbnRpYWwsIHBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICAgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKyAgICB9CisKKyAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKCpwcENhbmRpZGF0ZXNTZWxlY3RlZCkgPiAxKSB7CisgICAgICBfc3dhcFNlbGVjdGlvbkFuZENsZWFyKHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgICAgcmV0VmFsID0gX2RyY1NldEZpbmFsU2VsZWN0aW9uX2VmZmVjdFR5cGVzKCpwcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICAgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKyAgICB9CisKKyAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKCpwcENhbmRpZGF0ZXNTZWxlY3RlZCkgPiAxKSB7CisgICAgICBfc3dhcFNlbGVjdGlvbkFuZENsZWFyKHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgICAgcmV0VmFsID0gX2RyY1NldEZpbmFsU2VsZWN0aW9uX3RhcmdldExvdWRuZXNzKAorICAgICAgICAgIGhTZWxQcm9jSW5wdXQtPnRhcmdldExvdWRuZXNzLCAqcHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgICAgICAgICpwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisgICAgfQorCisgICAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcigqcHBDYW5kaWRhdGVzU2VsZWN0ZWQpID4gMSkgeworICAgICAgX3N3YXBTZWxlY3Rpb25BbmRDbGVhcihwcENhbmRpZGF0ZXNQb3RlbnRpYWwsIHBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICAgIHJldFZhbCA9IF9kcmNTZXRGaW5hbFNlbGVjdGlvbl9wZWFrVmFsdWVMYXJnZXN0KCpwcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworICAgIH0KKworICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIoKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKSA+IDEpIHsKKyAgICAgIF9zd2FwU2VsZWN0aW9uQW5kQ2xlYXIocHBDYW5kaWRhdGVzUG90ZW50aWFsLCBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgICByZXRWYWwgPSBfZHJjU2V0RmluYWxTZWxlY3Rpb25fZHJjU2V0SWQoKnBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworICAgIH0KKyAgfQorCisgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIoKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKSA9PSAwKSB7CisgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgIH0KKworICByZXR1cm4gcmV0VmFsOworfQorCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZ2VuZXJhdGVWaXJ0dWFsRHJjU2V0cygKKyAgICBIQU5ETEVfU0VMX1BST0NfSU5QVVQgaFNlbFByb2NJbnB1dCwgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgU0VMX1BST0NfQ09ERUNfTU9ERSBjb2RlY01vZGUpIHsKKyAgaW50IGk7CisgIGludCBuTWl4ZXMgPSBoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zQ291bnQgKyAxOworICBpbnQgaW5kZXggPSBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNDb3VudDsKKyAgaW50IGluZGV4VmlydHVhbCA9IC0xOworICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBEcmNJbnN0cnVjdGlvbiA9CisgICAgICAmKGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY1tpbmRleF0pOworCisgIGlmIChjb2RlY01vZGUgPT0gU0VMX1BST0NfTVBFR19IXzNEQSkgeworICAgIG5NaXhlcyA9IDE7CisgIH0KKworICBpZiAoKGluZGV4ICsgbk1peGVzKSA+ICgxMiArIDEgKyA2KSkgeworICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICB9CisKKyAgRkRLbWVtc2V0KHBEcmNJbnN0cnVjdGlvbiwgMCwgc2l6ZW9mKERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQykpOworCisgIHBEcmNJbnN0cnVjdGlvbi0+ZHJjU2V0SWQgPSBpbmRleFZpcnR1YWw7CisgIGluZGV4Kys7CisgIGluZGV4VmlydHVhbC0tOworICBwRHJjSW5zdHJ1Y3Rpb24tPmRvd25taXhJZENvdW50ID0gMTsKKworICBpZiAoKGNvZGVjTW9kZSA9PSBTRUxfUFJPQ19NUEVHX0hfM0RBKSAmJgorICAgICAgKGhTZWxQcm9jSW5wdXQtPm51bURvd25taXhJZFJlcXVlc3RzKSkgeworICAgIHBEcmNJbnN0cnVjdGlvbi0+ZG93bm1peElkWzBdID0gaFNlbFByb2NJbnB1dC0+ZG93bm1peElkUmVxdWVzdGVkWzBdOworICB9IGVsc2UgeworICAgIHBEcmNJbnN0cnVjdGlvbi0+ZG93bm1peElkWzBdID0gRE9XTk1JWF9JRF9CQVNFX0xBWU9VVDsKKyAgfQorCisgIGZvciAoaSA9IDE7IGkgPCBuTWl4ZXM7IGkrKykgeworICAgIHBEcmNJbnN0cnVjdGlvbiA9ICYoaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjW2luZGV4XSk7CisgICAgRkRLbWVtc2V0KHBEcmNJbnN0cnVjdGlvbiwgMCwgc2l6ZW9mKERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQykpOworICAgIHBEcmNJbnN0cnVjdGlvbi0+ZHJjU2V0SWQgPSBpbmRleFZpcnR1YWw7CisgICAgcERyY0luc3RydWN0aW9uLT5kb3dubWl4SWRbMF0gPQorICAgICAgICBoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zW2kgLSAxXS5kb3dubWl4SWQ7CisgICAgcERyY0luc3RydWN0aW9uLT5kb3dubWl4SWRDb3VudCA9IDE7CisgICAgaW5kZXgrKzsKKyAgICBpbmRleFZpcnR1YWwtLTsKKyAgfQorCisgIGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc0NvdW50SW5jbFZpcnR1YWwgPQorICAgICAgaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnQgKyBuTWl4ZXM7CisKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2dlbmVyYXRlT3V0cHV0SW5mbygKKyAgICBIQU5ETEVfU0VMX1BST0NfSU5QVVQgaFNlbFByb2NJbnB1dCwgSEFORExFX1NFTF9QUk9DX09VVFBVVCBoU2VsUHJvY091dHB1dCwKKyAgICBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywKKyAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCwKKyAgICBEUkNERUNfU0VMRUNUSU9OX0RBVEEqIHBTZWxlY3Rpb25EYXRhLCBTRUxfUFJPQ19DT0RFQ19NT0RFIGNvZGVjTW9kZSkgeworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHJldFZhbCA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKworICBpbnQgaSwgajsKKyAgaW50IGhhc0RlcGVuZGVuZCA9IDA7CisgIGludCBoYXNGYWRpbmcgPSAwOworICBpbnQgaGFzRHVja2luZyA9IDA7CisgIGludCBzZWxlY3RlZERyY1NldElkczsKKyAgaW50IHNlbGVjdGVkRG93bm1peElkczsKKyAgRklYUF9EQkwgbWl4aW5nTGV2ZWwgPSAwOworICBpbnQgYWxidW1Nb2RlID0gaFNlbFByb2NJbnB1dC0+YWxidW1Nb2RlOworICBVQ0hBUiogcERvd25taXhJZFJlcXVlc3RlZCA9IGhTZWxQcm9jSW5wdXQtPmRvd25taXhJZFJlcXVlc3RlZDsKKyAgRklYUF9TR0wgYm9vc3QgPSBoU2VsUHJvY0lucHV0LT5ib29zdDsKKyAgRklYUF9TR0wgY29tcHJlc3MgPSBoU2VsUHJvY0lucHV0LT5jb21wcmVzczsKKworICBoU2VsUHJvY091dHB1dC0+bnVtU2VsZWN0ZWREcmNTZXRzID0gMTsKKyAgaFNlbFByb2NPdXRwdXQtPnNlbGVjdGVkRHJjU2V0SWRzWzBdID0gcFNlbGVjdGlvbkRhdGEtPnBJbnN0LT5kcmNTZXRJZDsKKyAgaFNlbFByb2NPdXRwdXQtPnNlbGVjdGVkRG93bm1peElkc1swXSA9CisgICAgICBwU2VsZWN0aW9uRGF0YS0+cEluc3QtPmRyY0FwcGx5VG9Eb3dubWl4ID09IDEKKyAgICAgICAgICA/IHBTZWxlY3Rpb25EYXRhLT5wSW5zdC0+ZG93bm1peElkWzBdCisgICAgICAgICAgOiAwOworICBoU2VsUHJvY091dHB1dC0+bG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiID0KKyAgICAgIHBTZWxlY3Rpb25EYXRhLT5sb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGJBZGp1c3RlZCArCisgICAgICBoU2VsUHJvY0lucHV0LT5sb3VkbmVzc05vcm1hbGl6YXRpb25HYWluTW9kaWZpY2F0aW9uRGI7CisgIGhTZWxQcm9jT3V0cHV0LT5vdXRwdXRQZWFrTGV2ZWxEYiA9IHBTZWxlY3Rpb25EYXRhLT5vdXRwdXRQZWFrTGV2ZWw7CisKKyAgaFNlbFByb2NPdXRwdXQtPmJvb3N0ID0gYm9vc3Q7CisgIGhTZWxQcm9jT3V0cHV0LT5jb21wcmVzcyA9IGNvbXByZXNzOworICBoU2VsUHJvY091dHB1dC0+YmFzZUNoYW5uZWxDb3VudCA9CisgICAgICBoVW5pRHJjQ29uZmlnLT5jaGFubmVsTGF5b3V0LmJhc2VDaGFubmVsQ291bnQ7CisgIGhTZWxQcm9jT3V0cHV0LT50YXJnZXRDaGFubmVsQ291bnQgPQorICAgICAgaFVuaURyY0NvbmZpZy0+Y2hhbm5lbExheW91dC5iYXNlQ2hhbm5lbENvdW50OworICBoU2VsUHJvY091dHB1dC0+YWN0aXZlRG93bm1peElkID0KKyAgICAgIHBEb3dubWl4SWRSZXF1ZXN0ZWRbcFNlbGVjdGlvbkRhdGEtPmRvd25taXhJZFJlcXVlc3RJbmRleF07CisKKyAgX2dldE1peGluZ0xldmVsKGhMb3VkbmVzc0luZm9TZXQsICpwRG93bm1peElkUmVxdWVzdGVkLAorICAgICAgICAgICAgICAgICAgaFNlbFByb2NPdXRwdXQtPnNlbGVjdGVkRHJjU2V0SWRzWzBdLCBhbGJ1bU1vZGUsCisgICAgICAgICAgICAgICAgICAmbWl4aW5nTGV2ZWwpOworICBoU2VsUHJvY091dHB1dC0+bWl4aW5nTGV2ZWwgPSBtaXhpbmdMZXZlbDsKKworICAvKmRlcGVuZGVudCovCisgIGlmIChwU2VsZWN0aW9uRGF0YS0+cEluc3QtPmRlcGVuZHNPbkRyY1NldFByZXNlbnQpIHsKKyAgICBpbnQgZGVwZW5kc09uRHJjU2V0SUQgPSBwU2VsZWN0aW9uRGF0YS0+cEluc3QtPmRlcGVuZHNPbkRyY1NldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNDb3VudEluY2xWaXJ0dWFsOyBpKyspIHsKKyAgICAgIGlmIChoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNbaV0uZHJjU2V0SWQgPT0KKyAgICAgICAgICBkZXBlbmRzT25EcmNTZXRJRCkgeworICAgICAgICBoU2VsUHJvY091dHB1dC0+c2VsZWN0ZWREcmNTZXRJZHNbaFNlbFByb2NPdXRwdXQtPm51bVNlbGVjdGVkRHJjU2V0c10gPQorICAgICAgICAgICAgaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjW2ldLmRyY1NldElkOworICAgICAgICBoU2VsUHJvY091dHB1dC0+c2VsZWN0ZWREb3dubWl4SWRzW2hTZWxQcm9jT3V0cHV0LT5udW1TZWxlY3RlZERyY1NldHNdID0KKyAgICAgICAgICAgIGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY1tpXS5kcmNBcHBseVRvRG93bm1peCA9PSAxCisgICAgICAgICAgICAgICAgPyBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNbaV0uZG93bm1peElkWzBdCisgICAgICAgICAgICAgICAgOiAwOworICAgICAgICBoU2VsUHJvY091dHB1dC0+bnVtU2VsZWN0ZWREcmNTZXRzKys7CisgICAgICAgIGhhc0RlcGVuZGVuZCA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGZhZGluZyAqLworICBpZiAoaFNlbFByb2NJbnB1dC0+YWxidW1Nb2RlID09IDApIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnQ7IGkrKykgeworICAgICAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwSW5zdCA9CisgICAgICAgICAgJihoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNbaV0pOworCisgICAgICBpZiAocEluc3QtPmRyY1NldEVmZmVjdCAmIEVCX0ZBREUpIHsKKyAgICAgICAgaWYgKHBJbnN0LT5kb3dubWl4SWRbMF0gPT0gRE9XTk1JWF9JRF9BTllfRE9XTk1JWCkgeworICAgICAgICAgIGhTZWxQcm9jT3V0cHV0LT5udW1TZWxlY3RlZERyY1NldHMgPSBoYXNEZXBlbmRlbmQgKyAxOworICAgICAgICAgIGhTZWxQcm9jT3V0cHV0CisgICAgICAgICAgICAgIC0+c2VsZWN0ZWREcmNTZXRJZHNbaFNlbFByb2NPdXRwdXQtPm51bVNlbGVjdGVkRHJjU2V0c10gPQorICAgICAgICAgICAgICBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNbaV0uZHJjU2V0SWQ7CisgICAgICAgICAgaFNlbFByb2NPdXRwdXQKKyAgICAgICAgICAgICAgLT5zZWxlY3RlZERvd25taXhJZHNbaFNlbFByb2NPdXRwdXQtPm51bVNlbGVjdGVkRHJjU2V0c10gPQorICAgICAgICAgICAgICBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNbaV0uZHJjQXBwbHlUb0Rvd25taXggPT0gMQorICAgICAgICAgICAgICAgICAgPyBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNbaV0uZG93bm1peElkWzBdCisgICAgICAgICAgICAgICAgICA6IDA7CisgICAgICAgICAgaFNlbFByb2NPdXRwdXQtPm51bVNlbGVjdGVkRHJjU2V0cysrOworICAgICAgICAgIGhhc0ZhZGluZyA9IDE7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXRWYWwgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICAgICAgICAgIGlmIChyZXRWYWwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogZHVja2luZyAqLworICBmb3IgKGkgPSAwOyBpIDwgaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnQ7IGkrKykgeworICAgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcEluc3QgPQorICAgICAgICAmKGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY1tpXSk7CisKKyAgICBpZiAocEluc3QtPmRyY1NldEVmZmVjdCAmIChFQl9EVUNLX09USEVSIHwgRUJfRFVDS19TRUxGKSkgeworICAgICAgZm9yIChqID0gMDsgaiA8IHBJbnN0LT5kb3dubWl4SWRDb3VudDsgaisrKSB7CisgICAgICAgIGlmIChwSW5zdC0+ZG93bm1peElkW2pdID09IGhTZWxQcm9jT3V0cHV0LT5hY3RpdmVEb3dubWl4SWQpIHsKKyAgICAgICAgICBoU2VsUHJvY091dHB1dC0+bnVtU2VsZWN0ZWREcmNTZXRzID0KKyAgICAgICAgICAgICAgaGFzRGVwZW5kZW5kICsgMTsgLyogZHVja2luZyBvdmVycmlkZXMgZmFkaW5nICovCisKKyAgICAgICAgICBoU2VsUHJvY091dHB1dAorICAgICAgICAgICAgICAtPnNlbGVjdGVkRHJjU2V0SWRzW2hTZWxQcm9jT3V0cHV0LT5udW1TZWxlY3RlZERyY1NldHNdID0KKyAgICAgICAgICAgICAgaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjW2ldLmRyY1NldElkOworICAgICAgICAgIC8qIGZvcmNlIGR1Y2tpbmcgRFJDIHNldCB0byBiZSBwcm9jZXNzZWQgb24gYmFzZSBsYXlvdXQgKi8KKyAgICAgICAgICBoU2VsUHJvY091dHB1dAorICAgICAgICAgICAgICAtPnNlbGVjdGVkRG93bm1peElkc1toU2VsUHJvY091dHB1dC0+bnVtU2VsZWN0ZWREcmNTZXRzXSA9IDA7CisgICAgICAgICAgaFNlbFByb2NPdXRwdXQtPm51bVNlbGVjdGVkRHJjU2V0cysrOworICAgICAgICAgIGhhc0R1Y2tpbmcgPSAxOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogcmVwZWF0IGZvciBET1dOTUlYX0lEX0JBU0VfTEFZT1VUIGlmIG5vIGR1Y2tpbmcgZm91bmQqLworCisgIGlmICghaGFzRHVja2luZykgeworICAgIGZvciAoaSA9IDA7IGkgPCBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNDb3VudDsgaSsrKSB7CisgICAgICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBJbnN0ID0KKyAgICAgICAgICAmKGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY1tpXSk7CisKKyAgICAgIGlmIChwSW5zdC0+ZHJjU2V0RWZmZWN0ICYgKEVCX0RVQ0tfT1RIRVIgfCBFQl9EVUNLX1NFTEYpKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBwSW5zdC0+ZG93bm1peElkQ291bnQ7IGorKykgeworICAgICAgICAgIGlmIChwSW5zdC0+ZG93bm1peElkW2pdID09IERPV05NSVhfSURfQkFTRV9MQVlPVVQpIHsKKyAgICAgICAgICAgIGhTZWxQcm9jT3V0cHV0LT5udW1TZWxlY3RlZERyY1NldHMgPSBoYXNEZXBlbmRlbmQgKyBoYXNGYWRpbmcgKyAxOworICAgICAgICAgICAgaFNlbFByb2NPdXRwdXQKKyAgICAgICAgICAgICAgICAtPnNlbGVjdGVkRHJjU2V0SWRzW2hTZWxQcm9jT3V0cHV0LT5udW1TZWxlY3RlZERyY1NldHNdID0KKyAgICAgICAgICAgICAgICBoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNbaV0uZHJjU2V0SWQ7CisgICAgICAgICAgICAvKiBmb3JjZSBkdWNraW5nIERSQyBzZXQgdG8gYmUgcHJvY2Vzc2VkIG9uIGJhc2UgbGF5b3V0ICovCisgICAgICAgICAgICBoU2VsUHJvY091dHB1dAorICAgICAgICAgICAgICAgIC0+c2VsZWN0ZWREb3dubWl4SWRzW2hTZWxQcm9jT3V0cHV0LT5udW1TZWxlY3RlZERyY1NldHNdID0gMDsKKyAgICAgICAgICAgIGhTZWxQcm9jT3V0cHV0LT5udW1TZWxlY3RlZERyY1NldHMrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoaFNlbFByb2NPdXRwdXQtPm51bVNlbGVjdGVkRHJjU2V0cyA+IDMpIHsKKyAgICAvKiBtYXhpbXVtIHBlcm1pdHRlZCBudW1iZXIgb2YgYXBwbGllZCBEUkMgc2V0cyBpcyAzLCBzZWUgc2VjdGlvbiA2LjMuNSBvZgorICAgICAqIElTTy9JRUMgMjMwMDMtNCAqLworICAgIGhTZWxQcm9jT3V0cHV0LT5udW1TZWxlY3RlZERyY1NldHMgPSAwOworICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICB9CisKKyAgLyogc29ydGluZzogRHVja2luZy9GYWRpbmcgLT4gRGVwZW5kZW50IC0+IFNlbGVjdGVkICovCisgIGlmIChoU2VsUHJvY091dHB1dC0+bnVtU2VsZWN0ZWREcmNTZXRzID09IDMpIHsKKyAgICBzZWxlY3RlZERyY1NldElkcyA9IGhTZWxQcm9jT3V0cHV0LT5zZWxlY3RlZERyY1NldElkc1swXTsKKyAgICBzZWxlY3RlZERvd25taXhJZHMgPSBoU2VsUHJvY091dHB1dC0+c2VsZWN0ZWREb3dubWl4SWRzWzBdOworICAgIGhTZWxQcm9jT3V0cHV0LT5zZWxlY3RlZERyY1NldElkc1swXSA9IGhTZWxQcm9jT3V0cHV0LT5zZWxlY3RlZERyY1NldElkc1syXTsKKyAgICBoU2VsUHJvY091dHB1dC0+c2VsZWN0ZWREb3dubWl4SWRzWzBdID0KKyAgICAgICAgaFNlbFByb2NPdXRwdXQtPnNlbGVjdGVkRG93bm1peElkc1syXTsKKyAgICBoU2VsUHJvY091dHB1dC0+c2VsZWN0ZWREcmNTZXRJZHNbMl0gPSBzZWxlY3RlZERyY1NldElkczsKKyAgICBoU2VsUHJvY091dHB1dC0+c2VsZWN0ZWREb3dubWl4SWRzWzJdID0gc2VsZWN0ZWREb3dubWl4SWRzOworICB9IGVsc2UgaWYgKGhTZWxQcm9jT3V0cHV0LT5udW1TZWxlY3RlZERyY1NldHMgPT0gMikgeworICAgIHNlbGVjdGVkRHJjU2V0SWRzID0gaFNlbFByb2NPdXRwdXQtPnNlbGVjdGVkRHJjU2V0SWRzWzBdOworICAgIHNlbGVjdGVkRG93bm1peElkcyA9IGhTZWxQcm9jT3V0cHV0LT5zZWxlY3RlZERvd25taXhJZHNbMF07CisgICAgaFNlbFByb2NPdXRwdXQtPnNlbGVjdGVkRHJjU2V0SWRzWzBdID0gaFNlbFByb2NPdXRwdXQtPnNlbGVjdGVkRHJjU2V0SWRzWzFdOworICAgIGhTZWxQcm9jT3V0cHV0LT5zZWxlY3RlZERvd25taXhJZHNbMF0gPQorICAgICAgICBoU2VsUHJvY091dHB1dC0+c2VsZWN0ZWREb3dubWl4SWRzWzFdOworICAgIGhTZWxQcm9jT3V0cHV0LT5zZWxlY3RlZERyY1NldElkc1sxXSA9IHNlbGVjdGVkRHJjU2V0SWRzOworICAgIGhTZWxQcm9jT3V0cHV0LT5zZWxlY3RlZERvd25taXhJZHNbMV0gPSBzZWxlY3RlZERvd25taXhJZHM7CisgIH0KKworICByZXR1cm4gcmV0VmFsOworfQorCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfc2VsZWN0RG93bm1peE1hdHJpeCgKKyAgICBIQU5ETEVfU0VMX1BST0NfT1VUUFVUIGhTZWxQcm9jT3V0cHV0LAorICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnKSB7CisgIGludCBpOworICBoU2VsUHJvY091dHB1dC0+YmFzZUNoYW5uZWxDb3VudCA9CisgICAgICBoVW5pRHJjQ29uZmlnLT5jaGFubmVsTGF5b3V0LmJhc2VDaGFubmVsQ291bnQ7CisgIGhTZWxQcm9jT3V0cHV0LT50YXJnZXRDaGFubmVsQ291bnQgPQorICAgICAgaFVuaURyY0NvbmZpZy0+Y2hhbm5lbExheW91dC5iYXNlQ2hhbm5lbENvdW50OworICBoU2VsUHJvY091dHB1dC0+dGFyZ2V0TGF5b3V0ID0gLTE7CisgIGhTZWxQcm9jT3V0cHV0LT5kb3dubWl4TWF0cml4UHJlc2VudCA9IDA7CisKKyAgaWYgKGhTZWxQcm9jT3V0cHV0LT5hY3RpdmVEb3dubWl4SWQgIT0gMCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zQ291bnQ7IGkrKykgeworICAgICAgRE9XTk1JWF9JTlNUUlVDVElPTlMqIHBEb3duID0gJihoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zW2ldKTsKKworICAgICAgaWYgKGhTZWxQcm9jT3V0cHV0LT5hY3RpdmVEb3dubWl4SWQgPT0gcERvd24tPmRvd25taXhJZCkgeworICAgICAgICBoU2VsUHJvY091dHB1dC0+dGFyZ2V0Q2hhbm5lbENvdW50ID0gcERvd24tPnRhcmdldENoYW5uZWxDb3VudDsKKyAgICAgICAgaFNlbFByb2NPdXRwdXQtPnRhcmdldExheW91dCA9IHBEb3duLT50YXJnZXRMYXlvdXQ7CisKKyAgICAgICAgaWYgKHBEb3duLT5kb3dubWl4Q29lZmZpY2llbnRzUHJlc2VudCkgeworICAgICAgICAgIGludCBqLCBrOworICAgICAgICAgIEZJWFBfREJMIGRvd25taXhPZmZzZXQgPSBnZXREb3dubWl4T2Zmc2V0KAorICAgICAgICAgICAgICBwRG93biwgaFNlbFByb2NPdXRwdXQtPmJhc2VDaGFubmVsQ291bnQpOyAvKiBlID0gMSAqLworCisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGhTZWxQcm9jT3V0cHV0LT5iYXNlQ2hhbm5lbENvdW50OyBqKyspIHsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBoU2VsUHJvY091dHB1dC0+dGFyZ2V0Q2hhbm5lbENvdW50OyBrKyspIHsKKyAgICAgICAgICAgICAgaFNlbFByb2NPdXRwdXQtPmRvd25taXhNYXRyaXhbal1ba10gPQorICAgICAgICAgICAgICAgICAgZk11bHREaXYyKAorICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgcERvd24tPmRvd25taXhDb2VmZmljaWVudFtqICsgayAqIGhTZWxQcm9jT3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmJhc2VDaGFubmVsQ291bnRdKQorICAgICAgICAgICAgICAgICAgPDwgMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBoU2VsUHJvY091dHB1dC0+ZG93bm1peE1hdHJpeFByZXNlbnQgPSAxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9kcmNTZXRQcmVTZWxlY3Rpb24oCisgICAgU0VMX1BST0NfSU5QVVQqIGhTZWxQcm9jSW5wdXQsIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLAorICAgIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0LAorICAgIERSQ0RFQ19TRUxFQ1RJT04qKiBwcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1NlbGVjdGVkLCBTRUxfUFJPQ19DT0RFQ19NT0RFIGNvZGVjTW9kZSkgeworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHJldFZhbCA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKyAgaW50IGksIGo7CisKKyAgZm9yIChpID0gMDsgaSA8IGhTZWxQcm9jSW5wdXQtPm51bURvd25taXhJZFJlcXVlc3RzOyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zQ291bnRJbmNsVmlydHVhbDsgaisrKSB7CisgICAgICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBEcmNJbnN0cnVjdGlvbiA9CisgICAgICAgICAgJihoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNbal0pOworICAgICAgcmV0VmFsID0gX2RyY1NldFByZVNlbGVjdGlvblNpbmdsZUluc3RydWN0aW9uKAorICAgICAgICAgIGhTZWxQcm9jSW5wdXQsIGksIGhVbmlEcmNDb25maWcsIGhMb3VkbmVzc0luZm9TZXQsIHBEcmNJbnN0cnVjdGlvbiwKKyAgICAgICAgICAqcHBDYW5kaWRhdGVzUG90ZW50aWFsLCAqcHBDYW5kaWRhdGVzU2VsZWN0ZWQsIGNvZGVjTW9kZSk7CisgICAgICBpZiAocmV0VmFsKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgICB9CisgIH0KKworICByZXRWYWwgPSBfcHJlU2VsZWN0aW9uUmVxdWlyZW1lbnQ5KGhTZWxQcm9jSW5wdXQsICpwcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgaWYgKHJldFZhbCkgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisKKyAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcigqcHBDYW5kaWRhdGVzU2VsZWN0ZWQpID09IDApIHsKKyAgICByZXRWYWwgPSBfZHJjU2V0U2VsZWN0aW9uQWRkQ2FuZGlkYXRlcygKKyAgICAgICAgaFNlbFByb2NJbnB1dCwgKnBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKyAgICBpZiAocmV0VmFsKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgfQorCisgIHJldHVybiByZXRWYWw7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9kcmNTZXRSZXF1ZXN0U2VsZWN0aW9uKAorICAgIFNFTF9QUk9DX0lOUFVUKiBoU2VsUHJvY0lucHV0LCBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywKKyAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCwKKyAgICBEUkNERUNfU0VMRUNUSU9OKiogcHBDYW5kaWRhdGVzUG90ZW50aWFsLAorICAgIERSQ0RFQ19TRUxFQ1RJT04qKiBwcENhbmRpZGF0ZXNTZWxlY3RlZCkgeworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHJldFZhbDsKKyAgaW50IGk7CisKKyAgaWYgKF9kcmNkZWNfc2VsZWN0aW9uX2dldE51bWJlcigqcHBDYW5kaWRhdGVzUG90ZW50aWFsKSA9PSAwKSB7CisgICAgcmV0VmFsID0gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgICBpZiAocmV0VmFsKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgfQorCisgIGlmIChoU2VsUHJvY0lucHV0LT5keW5hbWljUmFuZ2VDb250cm9sT24pIHsKKyAgICBpZiAoaFNlbFByb2NJbnB1dC0+bnVtRHJjRmVhdHVyZVJlcXVlc3RzID09IDApIHsKKyAgICAgIHJldFZhbCA9IF9zZWxlY3REcmNTZXRFZmZlY3ROb25lKGhVbmlEcmNDb25maWcsICpwcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworCisgICAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKCpwcENhbmRpZGF0ZXNTZWxlY3RlZCkgPT0gMCkgeworICAgICAgICBEUkNfRkVBVFVSRV9SRVFVRVNUIGZhbGxiYWNrUmVxdWVzdDsKKyAgICAgICAgZmFsbGJhY2tSZXF1ZXN0LmRyY0VmZmVjdFR5cGUubnVtUmVxdWVzdHMgPSA1OworICAgICAgICBmYWxsYmFja1JlcXVlc3QuZHJjRWZmZWN0VHlwZS5udW1SZXF1ZXN0c0Rlc2lyZWQgPSA1OworICAgICAgICBmYWxsYmFja1JlcXVlc3QuZHJjRWZmZWN0VHlwZS5yZXF1ZXN0WzBdID0gREVUUl9HRU5FUkFMX0NPTVBSOworICAgICAgICBmYWxsYmFja1JlcXVlc3QuZHJjRWZmZWN0VHlwZS5yZXF1ZXN0WzFdID0gREVUUl9OSUdIVDsKKyAgICAgICAgZmFsbGJhY2tSZXF1ZXN0LmRyY0VmZmVjdFR5cGUucmVxdWVzdFsyXSA9IERFVFJfTk9JU1k7CisgICAgICAgIGZhbGxiYWNrUmVxdWVzdC5kcmNFZmZlY3RUeXBlLnJlcXVlc3RbM10gPSBERVRSX0xJTUlURUQ7CisgICAgICAgIGZhbGxiYWNrUmVxdWVzdC5kcmNFZmZlY3RUeXBlLnJlcXVlc3RbNF0gPSBERVRSX0xPV0xFVkVMOworCisgICAgICAgIHJldFZhbCA9IF9zZWxlY3RFZmZlY3RUeXBlRmVhdHVyZShoVW5pRHJjQ29uZmlnLCBmYWxsYmFja1JlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgICAgIGlmIChyZXRWYWwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICAgICAgfQorCisgICAgICBfc3dhcFNlbGVjdGlvbkFuZENsZWFyKHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgaFNlbFByb2NJbnB1dC0+bnVtRHJjRmVhdHVyZVJlcXVlc3RzOyBpKyspIHsKKyAgICAgICAgaWYgKGhTZWxQcm9jSW5wdXQtPmRyY0ZlYXR1cmVSZXF1ZXN0VHlwZVtpXSA9PSBERlJUX0VGRkVDVF9UWVBFKSB7CisgICAgICAgICAgcmV0VmFsID0gX3NlbGVjdEVmZmVjdFR5cGVGZWF0dXJlKAorICAgICAgICAgICAgICBoVW5pRHJjQ29uZmlnLCBoU2VsUHJvY0lucHV0LT5kcmNGZWF0dXJlUmVxdWVzdFtpXSwKKyAgICAgICAgICAgICAgcHBDYW5kaWRhdGVzUG90ZW50aWFsLCBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisKKyAgICAgICAgICBfc3dhcFNlbGVjdGlvbkFuZENsZWFyKHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgICAgICAgIGlmIChyZXRWYWwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICAgICAgICB9CisKKyAgICAgICAgZWxzZSBpZiAoaFNlbFByb2NJbnB1dC0+ZHJjRmVhdHVyZVJlcXVlc3RUeXBlW2ldID09CisgICAgICAgICAgICAgICAgIERGUlRfRFlOQU1JQ19SQU5HRSkgeworICAgICAgICAgIHJldFZhbCA9IF9zZWxlY3REeW5hbWljUmFuZ2UoCisgICAgICAgICAgICAgIGhVbmlEcmNDb25maWcsIGhMb3VkbmVzc0luZm9TZXQsCisgICAgICAgICAgICAgIGhTZWxQcm9jSW5wdXQtPmRyY0ZlYXR1cmVSZXF1ZXN0W2ldLAorICAgICAgICAgICAgICBoU2VsUHJvY0lucHV0LT5kb3dubWl4SWRSZXF1ZXN0ZWQsIGhTZWxQcm9jSW5wdXQtPmFsYnVtTW9kZSwKKyAgICAgICAgICAgICAgKnBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKTsKKworICAgICAgICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIoKnBwQ2FuZGlkYXRlc1NlbGVjdGVkKSA+IDApIHsKKyAgICAgICAgICAgIF9zd2FwU2VsZWN0aW9uQW5kQ2xlYXIocHBDYW5kaWRhdGVzUG90ZW50aWFsLCBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChyZXRWYWwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICAgICAgICB9IGVsc2UgaWYgKGhTZWxQcm9jSW5wdXQtPmRyY0ZlYXR1cmVSZXF1ZXN0VHlwZVtpXSA9PQorICAgICAgICAgICAgICAgICAgIERGUlRfRFJDX0NIQVJBQ1RFUklTVElDKSB7CisgICAgICAgICAgcmV0VmFsID0gX3NlbGVjdERyY0NoYXJhY3RlcmlzdGljKAorICAgICAgICAgICAgICBoVW5pRHJjQ29uZmlnLAorICAgICAgICAgICAgICBoU2VsUHJvY0lucHV0LT5kcmNGZWF0dXJlUmVxdWVzdFtpXS5kcmNDaGFyYWN0ZXJpc3RpYywKKyAgICAgICAgICAgICAgcHBDYW5kaWRhdGVzUG90ZW50aWFsLCBwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisKKyAgICAgICAgICBpZiAoX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKCpwcENhbmRpZGF0ZXNTZWxlY3RlZCkgPiAwKSB7CisgICAgICAgICAgICBfc3dhcFNlbGVjdGlvbkFuZENsZWFyKHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwgcHBDYW5kaWRhdGVzU2VsZWN0ZWQpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAocmV0VmFsKSByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2R5bmFtaWNSYW5nZU1lYXN1cmVtZW50KAorICAgIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0LCBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBJbnN0LAorICAgIFVDSEFSIGRvd25taXhJZFJlcXVlc3RlZCwKKyAgICBEWU5fUkFOR0VfTUVBU1VSRU1FTlRfUkVRVUVTVF9UWVBFIGR5bmFtaWNSYW5nZU1lYXN1cmVtZW50VHlwZSwKKyAgICBpbnQgYWxidW1Nb2RlLCBpbnQqIHBQZWFrVG9BdmVyYWdlUHJlc2VudCwgRklYUF9EQkwqIHBQZWFrVG9BdmVyYWdlKSB7CisgIGludCBpOworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIHJldFZhbCA9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKyAgaW50IGRyY1NldElkID0gZk1heCgwLCBwSW5zdC0+ZHJjU2V0SWQpOworCisgICpwUGVha1RvQXZlcmFnZVByZXNlbnQgPSAwOworCisgIGlmIChhbGJ1bU1vZGUpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW1Db3VudDsgaSsrKSB7CisgICAgICBMT1VETkVTU19JTkZPKiBwTG91ZG5lc3NJbmZvID0gJihoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bVtpXSk7CisKKyAgICAgIGlmIChkcmNTZXRJZCA9PSBwTG91ZG5lc3NJbmZvLT5kcmNTZXRJZCkgeworICAgICAgICBpZiAoZG93bm1peElkUmVxdWVzdGVkID09IHBMb3VkbmVzc0luZm8tPmRvd25taXhJZCkgeworICAgICAgICAgIHJldFZhbCA9IF9leHRyYWN0TG91ZG5lc3NQZWFrVG9BdmVyYWdlVmFsdWUoCisgICAgICAgICAgICAgIHBMb3VkbmVzc0luZm8sIGR5bmFtaWNSYW5nZU1lYXN1cmVtZW50VHlwZSwgcFBlYWtUb0F2ZXJhZ2VQcmVzZW50LAorICAgICAgICAgICAgICBwUGVha1RvQXZlcmFnZSk7CisgICAgICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKCpwUGVha1RvQXZlcmFnZVByZXNlbnQgPT0gMCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9Db3VudDsgaSsrKSB7CisgICAgICBMT1VETkVTU19JTkZPKiBwTG91ZG5lc3NJbmZvID0gJihoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9baV0pOworCisgICAgICBpZiAoZHJjU2V0SWQgPT0gcExvdWRuZXNzSW5mby0+ZHJjU2V0SWQpIHsKKyAgICAgICAgaWYgKGRvd25taXhJZFJlcXVlc3RlZCA9PSBwTG91ZG5lc3NJbmZvLT5kb3dubWl4SWQpIHsKKyAgICAgICAgICByZXRWYWwgPSBfZXh0cmFjdExvdWRuZXNzUGVha1RvQXZlcmFnZVZhbHVlKAorICAgICAgICAgICAgICBwTG91ZG5lc3NJbmZvLCBkeW5hbWljUmFuZ2VNZWFzdXJlbWVudFR5cGUsIHBQZWFrVG9BdmVyYWdlUHJlc2VudCwKKyAgICAgICAgICAgICAgcFBlYWtUb0F2ZXJhZ2UpOworICAgICAgICAgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiByZXRWYWw7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fREFUQSogX2RyY2RlY19zZWxlY3Rpb25fYWRkTmV3KAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBTZWxlY3Rpb24pIHsKKyAgaWYgKHBTZWxlY3Rpb24tPm51bURhdGEgPCAoMTIgKyAxICsgNikpIHsKKyAgICBEUkNERUNfU0VMRUNUSU9OX0RBVEEqIHBEYXRhID0gJihwU2VsZWN0aW9uLT5kYXRhW3BTZWxlY3Rpb24tPm51bURhdGFdKTsKKyAgICBGREttZW1zZXQocERhdGEsIDAsIHNpemVvZihEUkNERUNfU0VMRUNUSU9OX0RBVEEpKTsKKyAgICBwU2VsZWN0aW9uLT5udW1EYXRhKys7CisKKyAgICByZXR1cm4gcERhdGE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fREFUQSogX2RyY2RlY19zZWxlY3Rpb25fYWRkKAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBTZWxlY3Rpb24sIERSQ0RFQ19TRUxFQ1RJT05fREFUQSogcERhdGFJbikgeworICBpZiAocFNlbGVjdGlvbi0+bnVtRGF0YSA8ICgxMiArIDEgKyA2KSkgeworICAgIERSQ0RFQ19TRUxFQ1RJT05fREFUQSogcERhdGEgPSAmKHBTZWxlY3Rpb24tPmRhdGFbcFNlbGVjdGlvbi0+bnVtRGF0YV0pOworICAgIEZES21lbWNweShwRGF0YSwgcERhdGFJbiwgc2l6ZW9mKERSQ0RFQ19TRUxFQ1RJT05fREFUQSkpOworICAgIHBTZWxlY3Rpb24tPm51bURhdGErKzsKKyAgICByZXR1cm4gcERhdGE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIGludCBfZHJjZGVjX3NlbGVjdGlvbl9jbGVhcihEUkNERUNfU0VMRUNUSU9OKiBwU2VsZWN0aW9uKSB7CisgIHJldHVybiBwU2VsZWN0aW9uLT5udW1EYXRhID0gMDsKK30KKworc3RhdGljIGludCBfZHJjZGVjX3NlbGVjdGlvbl9nZXROdW1iZXIoRFJDREVDX1NFTEVDVElPTiogcFNlbGVjdGlvbikgeworICByZXR1cm4gcFNlbGVjdGlvbi0+bnVtRGF0YTsKK30KKworc3RhdGljIGludCBfZHJjZGVjX3NlbGVjdGlvbl9zZXROdW1iZXIoRFJDREVDX1NFTEVDVElPTiogcFNlbGVjdGlvbiwgaW50IG51bSkgeworICBpZiAobnVtID49IDAgJiYgbnVtIDwgcFNlbGVjdGlvbi0+bnVtRGF0YSkgeworICAgIHJldHVybiBwU2VsZWN0aW9uLT5udW1EYXRhID0gbnVtOworICB9IGVsc2UgeworICAgIHJldHVybiBwU2VsZWN0aW9uLT5udW1EYXRhOworICB9Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX0RBVEEqIF9kcmNkZWNfc2VsZWN0aW9uX2dldEF0KAorICAgIERSQ0RFQ19TRUxFQ1RJT04qIHBTZWxlY3Rpb24sIGludCBhdCkgeworICBpZiAoYXQgPj0gMCAmJiBhdCA8ICgxMiArIDEgKyA2KSkgeworICAgIHJldHVybiAmKHBTZWxlY3Rpb24tPmRhdGFbYXRdKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgaW50IF9zd2FwU2VsZWN0aW9uQW5kQ2xlYXIoRFJDREVDX1NFTEVDVElPTioqIHBwQ2FuZGlkYXRlc1BvdGVudGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUkNERUNfU0VMRUNUSU9OKiogcHBDYW5kaWRhdGVzU2VsZWN0ZWQpIHsKKyAgRFJDREVDX1NFTEVDVElPTiogcFRtcCA9ICpwcENhbmRpZGF0ZXNQb3RlbnRpYWw7CisgICpwcENhbmRpZGF0ZXNQb3RlbnRpYWwgPSAqcHBDYW5kaWRhdGVzU2VsZWN0ZWQ7CisgICpwcENhbmRpZGF0ZXNTZWxlY3RlZCA9IHBUbXA7CisgIF9kcmNkZWNfc2VsZWN0aW9uX2NsZWFyKCpwcENhbmRpZGF0ZXNTZWxlY3RlZCk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zd2FwU2VsZWN0aW9uKERSQ0RFQ19TRUxFQ1RJT04qKiBwcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERSQ0RFQ19TRUxFQ1RJT04qKiBwcENhbmRpZGF0ZXNTZWxlY3RlZCkgeworICBEUkNERUNfU0VMRUNUSU9OKiBwVG1wID0gKnBwQ2FuZGlkYXRlc1BvdGVudGlhbDsKKyAgKnBwQ2FuZGlkYXRlc1BvdGVudGlhbCA9ICpwcENhbmRpZGF0ZXNTZWxlY3RlZDsKKyAgKnBwQ2FuZGlkYXRlc1NlbGVjdGVkID0gcFRtcDsKKyAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgTE9VRE5FU1NfSU5GTyogX2dldExvdWRuZXNzSW5mb1N0cnVjdHVyZSgKKyAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCwgaW50IGRyY1NldElkLCBpbnQgZG93bm1peElkLAorICAgIGludCBhbGJ1bU1vZGUpIHsKKyAgaW50IGksIGo7CisgIGludCBjb3VudDsKKworICBMT1VETkVTU19JTkZPKiBwTG91ZG5lc3NJbmZvID0gTlVMTDsKKworICBpZiAoYWxidW1Nb2RlKSB7CisgICAgY291bnQgPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bUNvdW50OworICAgIHBMb3VkbmVzc0luZm8gPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bTsKKyAgfSBlbHNlIHsKKyAgICBjb3VudCA9IGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0NvdW50OworICAgIHBMb3VkbmVzc0luZm8gPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm87CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIGlmICgocExvdWRuZXNzSW5mb1tpXS5kcmNTZXRJZCA9PSBkcmNTZXRJZCkgJiYKKyAgICAgICAgKHBMb3VkbmVzc0luZm9baV0uZG93bm1peElkID09IGRvd25taXhJZCkpIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBwTG91ZG5lc3NJbmZvW2ldLm1lYXN1cmVtZW50Q291bnQ7IGorKykgeworICAgICAgICBpZiAoKHBMb3VkbmVzc0luZm9baV0ubG91ZG5lc3NNZWFzdXJlbWVudFtqXS5tZXRob2REZWZpbml0aW9uID09IDEpIHx8CisgICAgICAgICAgICAocExvdWRuZXNzSW5mb1tpXS5sb3VkbmVzc01lYXN1cmVtZW50W2pdLm1ldGhvZERlZmluaXRpb24gPT0gMikpIHsKKyAgICAgICAgICByZXR1cm4gJnBMb3VkbmVzc0luZm9baV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIExPVURORVNTX0lORk8qIF9nZXRBcHBsaWNhYmxlTG91ZG5lc3NJbmZvU3RydWN0dXJlKAorICAgIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0LCBpbnQgZHJjU2V0SWQsCisgICAgaW50IGRvd25taXhJZFJlcXVlc3RlZCwgaW50IGFsYnVtTW9kZSkgeworICBMT1VETkVTU19JTkZPKiBwTG91ZG5lc3NJbmZvID0gTlVMTDsKKworICAvKiBkZWZhdWx0IHZhbHVlICovCisgIHBMb3VkbmVzc0luZm8gPSBfZ2V0TG91ZG5lc3NJbmZvU3RydWN0dXJlKGhMb3VkbmVzc0luZm9TZXQsIGRyY1NldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4SWRSZXF1ZXN0ZWQsIGFsYnVtTW9kZSk7CisKKyAgLyogZmFsbGJhY2sgdmFsdWVzICovCisgIGlmIChwTG91ZG5lc3NJbmZvID09IE5VTEwpIHsKKyAgICBwTG91ZG5lc3NJbmZvID0KKyAgICAgICAgX2dldExvdWRuZXNzSW5mb1N0cnVjdHVyZShoTG91ZG5lc3NJbmZvU2V0LCBkcmNTZXRJZCwgMHg3RiwgYWxidW1Nb2RlKTsKKyAgfQorCisgIGlmIChwTG91ZG5lc3NJbmZvID09IE5VTEwpIHsKKyAgICBwTG91ZG5lc3NJbmZvID0gX2dldExvdWRuZXNzSW5mb1N0cnVjdHVyZShoTG91ZG5lc3NJbmZvU2V0LCAweDNGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhJZFJlcXVlc3RlZCwgYWxidW1Nb2RlKTsKKyAgfQorCisgIGlmIChwTG91ZG5lc3NJbmZvID09IE5VTEwpIHsKKyAgICBwTG91ZG5lc3NJbmZvID0gX2dldExvdWRuZXNzSW5mb1N0cnVjdHVyZShoTG91ZG5lc3NJbmZvU2V0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhJZFJlcXVlc3RlZCwgYWxidW1Nb2RlKTsKKyAgfQorCisgIGlmIChwTG91ZG5lc3NJbmZvID09IE5VTEwpIHsKKyAgICBwTG91ZG5lc3NJbmZvID0KKyAgICAgICAgX2dldExvdWRuZXNzSW5mb1N0cnVjdHVyZShoTG91ZG5lc3NJbmZvU2V0LCAweDNGLCAweDdGLCBhbGJ1bU1vZGUpOworICB9CisKKyAgaWYgKHBMb3VkbmVzc0luZm8gPT0gTlVMTCkgeworICAgIHBMb3VkbmVzc0luZm8gPQorICAgICAgICBfZ2V0TG91ZG5lc3NJbmZvU3RydWN0dXJlKGhMb3VkbmVzc0luZm9TZXQsIDAsIDB4N0YsIGFsYnVtTW9kZSk7CisgIH0KKworICBpZiAocExvdWRuZXNzSW5mbyA9PSBOVUxMKSB7CisgICAgcExvdWRuZXNzSW5mbyA9CisgICAgICAgIF9nZXRMb3VkbmVzc0luZm9TdHJ1Y3R1cmUoaExvdWRuZXNzSW5mb1NldCwgZHJjU2V0SWQsIDAsIGFsYnVtTW9kZSk7CisgIH0KKworICBpZiAocExvdWRuZXNzSW5mbyA9PSBOVUxMKSB7CisgICAgcExvdWRuZXNzSW5mbyA9CisgICAgICAgIF9nZXRMb3VkbmVzc0luZm9TdHJ1Y3R1cmUoaExvdWRuZXNzSW5mb1NldCwgMHgzRiwgMCwgYWxidW1Nb2RlKTsKKyAgfQorCisgIGlmIChwTG91ZG5lc3NJbmZvID09IE5VTEwpIHsKKyAgICBwTG91ZG5lc3NJbmZvID0KKyAgICAgICAgX2dldExvdWRuZXNzSW5mb1N0cnVjdHVyZShoTG91ZG5lc3NJbmZvU2V0LCAwLCAwLCBhbGJ1bU1vZGUpOworICB9CisKKyAgcmV0dXJuIHBMb3VkbmVzc0luZm87Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIEZJWFBfREJMIHZhbHVlOworICBpbnQgb3JkZXI7Cit9IFZBTFVFX09SREVSOworCit2b2lkIF9pbml0VmFsdWVPcmRlcihWQUxVRV9PUkRFUiogcFZhbHVlKSB7CisgIHBWYWx1ZS0+dmFsdWUgPSAoRklYUF9EQkwpMDsKKyAgcFZhbHVlLT5vcmRlciA9IC0xOworfQorCitlbnVtIHsKKyAgTVNfQk9OVVMwID0gMCwKKyAgTVNfQk9OVVMxNzcwLAorICBNU19CT05VU1VTRVIsCisgIE1TX0JPTlVTRVhQRVJULAorICBNU19SRVNBLAorICBNU19SRVNCLAorICBNU19SRVNDLAorICBNU19SRVNELAorICBNU19SRVNFLAorICBNU19QUk9HUkFNTE9VRE5FU1MsCisgIE1TX1BFQUtMT1VETkVTUworfTsKKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2dldE1ldGhvZFZhbHVlKAorICAgIFZBTFVFX09SREVSKiBwVmFsdWVPcmRlciwgRklYUF9EQkwgdmFsdWUsIGludCBtZWFzdXJlbWVudFN5c3RlbSwKKyAgICBpbnQgbWVhc3VyZW1lbnRTeXN0ZW1SZXF1ZXN0ZWQpIHsKKyAgY29uc3QgaW50IHJvd3MgPSAxMTsKKyAgY29uc3QgaW50IGNvbHVtbnMgPSAxMjsKKyAgY29uc3QgaW50IHBPcmRlcmluZ1tyb3dzXVtjb2x1bW5zXSA9IHsKKyAgICAgIHswLCAwLCA4LCAwLCAxLCAzLCAwLCA1LCA2LCA3LCA0LCAyfSwgLyogZGVmYXVsdCA9IGJvbnVzMTc3MCAqLworICAgICAgezAsIDAsIDgsIDAsIDEsIDMsIDAsIDUsIDYsIDcsIDQsIDJ9LCAvKiBib251czE3NzAgKi8KKyAgICAgIHswLCAwLCAxLCAwLCA4LCA1LCAwLCAyLCAzLCA0LCA2LCA3fSwgLyogYm9udXNVc2VyICovCisgICAgICB7MCwgMCwgMywgMCwgMSwgOCwgMCwgNCwgNSwgNiwgNywgMn0sIC8qIGJvbnVzRXhwZXJ0ICovCisgICAgICB7MCwgMCwgNSwgMCwgMSwgMywgMCwgOCwgNiwgNywgNCwgMn0sIC8qIFJlc0EgKi8KKyAgICAgIHswLCAwLCA1LCAwLCAxLCAzLCAwLCA2LCA4LCA3LCA0LCAyfSwgLyogUmVzQiAqLworICAgICAgezAsIDAsIDUsIDAsIDEsIDMsIDAsIDYsIDcsIDgsIDQsIDJ9LCAvKiBSZXNDICovCisgICAgICB7MCwgMCwgMywgMCwgMSwgNywgMCwgNCwgNSwgNiwgOCwgMn0sIC8qIFJlc0QgKi8KKyAgICAgIHswLCAwLCAxLCAwLCA3LCA1LCAwLCAyLCAzLCA0LCA2LCA4fSwgLyogUmVzRSAqLworICAgICAgezAsIDAsIDEsIDAsIDAsIDAsIDAsIDIsIDMsIDQsIDAsIDB9LCAvKiBQcm9ncmFtTG91ZG5lc3MgKi8KKyAgICAgIHswLCA3LCAwLCAwLCAwLCAwLCA2LCA1LCA0LCAzLCAyLCAxfSAgLyogUGVha0xvdWRuZXNzICovCisgIH07CisKKyAgaWYgKG1lYXN1cmVtZW50U3lzdGVtUmVxdWVzdGVkIDwgMCB8fCBtZWFzdXJlbWVudFN5c3RlbVJlcXVlc3RlZCA+PSByb3dzIHx8CisgICAgICBtZWFzdXJlbWVudFN5c3RlbSA8IDAgfHwgbWVhc3VyZW1lbnRTeXN0ZW0gPj0gY29sdW1ucykgeworICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICB9CisKKyAgaWYgKHBPcmRlcmluZ1ttZWFzdXJlbWVudFN5c3RlbVJlcXVlc3RlZF1bbWVhc3VyZW1lbnRTeXN0ZW1dID4KKyAgICAgIHBWYWx1ZU9yZGVyLT5vcmRlcikgeworICAgIHBWYWx1ZU9yZGVyLT5vcmRlciA9CisgICAgICAgIHBPcmRlcmluZ1ttZWFzdXJlbWVudFN5c3RlbVJlcXVlc3RlZF1bbWVhc3VyZW1lbnRTeXN0ZW1dOworICAgIHBWYWx1ZU9yZGVyLT52YWx1ZSA9IHZhbHVlOworICB9CisKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9nZXRMb3VkbmVzcygKKyAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCwgaW50IGFsYnVtTW9kZSwKKyAgICBNRVRIT0RfREVGSU5JVElPTl9SRVFVRVNUIG1lYXN1cmVtZW50TWV0aG9kUmVxdWVzdGVkLAorICAgIE1FQVNVUkVNRU5UX1NZU1RFTV9SRVFVRVNUIG1lYXN1cmVtZW50U3lzdGVtUmVxdWVzdGVkLAorICAgIEZJWFBfREJMIHRhcmdldExvdWRuZXNzLCAvKiBlID0gNyAqLworICAgIGludCBkcmNTZXRJZCwgaW50IGRvd25taXhJZFJlcXVlc3RlZCwKKyAgICBGSVhQX0RCTCogcExvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW4sIC8qIGUgPSA3ICovCisgICAgRklYUF9EQkwqIHBMb3VkbmVzcykgICAgICAgICAgICAgICAgICAvKiBlID0gNyAqLworeworICBpbnQgaW5kZXg7CisKKyAgTE9VRE5FU1NfSU5GTyogcExvdWRuZXNzSW5mbyA9IE5VTEw7CisgIFZBTFVFX09SREVSIHZhbHVlT3JkZXI7CisKKyAgLyogbWFwIE1EUl9ERUZBVUxUIHRvIE1EUl9QUk9HUkFNX0xPVURORVNTICovCisgIE1FVEhPRF9ERUZJTklUSU9OX1JFUVVFU1QgcmVxdWVzdGVkTWV0aG9kRGVmaW5pdGlvbiA9CisgICAgICBtZWFzdXJlbWVudE1ldGhvZFJlcXVlc3RlZCA8IE1EUl9BTkNIT1JfTE9VRE5FU1MgPyBNRFJfUFJPR1JBTV9MT1VETkVTUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTURSX0FOQ0hPUl9MT1VETkVTUzsKKworICBpZiAobWVhc3VyZW1lbnRNZXRob2RSZXF1ZXN0ZWQgPiBNRFJfQU5DSE9SX0xPVURORVNTKSB7CisgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7CisgIH0KKworICBfaW5pdFZhbHVlT3JkZXIoJnZhbHVlT3JkZXIpOworCisgICpwTG91ZG5lc3MgPSBVTkRFRklORURfTE9VRE5FU1NfVkFMVUU7CisgICpwTG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbiA9IChGSVhQX0RCTCkwOworCisgIGlmIChkcmNTZXRJZCA8IDApIHsKKyAgICBkcmNTZXRJZCA9IDA7CisgIH0KKworICBwTG91ZG5lc3NJbmZvID0gX2dldEFwcGxpY2FibGVMb3VkbmVzc0luZm9TdHJ1Y3R1cmUoCisgICAgICBoTG91ZG5lc3NJbmZvU2V0LCBkcmNTZXRJZCwgZG93bm1peElkUmVxdWVzdGVkLCBhbGJ1bU1vZGUpOworCisgIGlmIChhbGJ1bU1vZGUgJiYgKHBMb3VkbmVzc0luZm8gPT0gTlVMTCkpIHsKKyAgICBwTG91ZG5lc3NJbmZvID0gX2dldEFwcGxpY2FibGVMb3VkbmVzc0luZm9TdHJ1Y3R1cmUoCisgICAgICAgIGhMb3VkbmVzc0luZm9TZXQsIGRyY1NldElkLCBkb3dubWl4SWRSZXF1ZXN0ZWQsIDApOworICB9CisKKyAgaWYgKHBMb3VkbmVzc0luZm8gPT0gTlVMTCkgeworICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisgIH0KKworICBpbmRleCA9IC0xOworCisgIGRvIHsKKyAgICBpbmRleCA9IF9maW5kTWV0aG9kRGVmaW5pdGlvbihwTG91ZG5lc3NJbmZvLCByZXF1ZXN0ZWRNZXRob2REZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICsgMSk7CisKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgX2dldE1ldGhvZFZhbHVlKAorICAgICAgICAgICZ2YWx1ZU9yZGVyLCBwTG91ZG5lc3NJbmZvLT5sb3VkbmVzc01lYXN1cmVtZW50W2luZGV4XS5tZXRob2RWYWx1ZSwKKyAgICAgICAgICBwTG91ZG5lc3NJbmZvLT5sb3VkbmVzc01lYXN1cmVtZW50W2luZGV4XS5tZWFzdXJlbWVudFN5c3RlbSwKKyAgICAgICAgICBtZWFzdXJlbWVudFN5c3RlbVJlcXVlc3RlZCk7CisgICAgfQorICB9IHdoaWxlIChpbmRleCA+PSAwKTsKKworICAvKiByZXBlYXQgd2l0aCBvdGhlciBtZXRob2QgZGVmaW5pdGlvbiAqLworICBpZiAodmFsdWVPcmRlci5vcmRlciA9PSAtMSkgeworICAgIGluZGV4ID0gLTE7CisKKyAgICBkbyB7CisgICAgICBpbmRleCA9IF9maW5kTWV0aG9kRGVmaW5pdGlvbigKKyAgICAgICAgICBwTG91ZG5lc3NJbmZvLAorICAgICAgICAgIHJlcXVlc3RlZE1ldGhvZERlZmluaXRpb24gPT0gTURSX1BST0dSQU1fTE9VRE5FU1MKKyAgICAgICAgICAgICAgPyBNRFJfQU5DSE9SX0xPVURORVNTCisgICAgICAgICAgICAgIDogTURSX1BST0dSQU1fTE9VRE5FU1MsCisgICAgICAgICAgaW5kZXggKyAxKTsKKworICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgX2dldE1ldGhvZFZhbHVlKAorICAgICAgICAgICAgJnZhbHVlT3JkZXIsIHBMb3VkbmVzc0luZm8tPmxvdWRuZXNzTWVhc3VyZW1lbnRbaW5kZXhdLm1ldGhvZFZhbHVlLAorICAgICAgICAgICAgcExvdWRuZXNzSW5mby0+bG91ZG5lc3NNZWFzdXJlbWVudFtpbmRleF0ubWVhc3VyZW1lbnRTeXN0ZW0sCisgICAgICAgICAgICBtZWFzdXJlbWVudFN5c3RlbVJlcXVlc3RlZCk7CisgICAgICB9CisgICAgfSB3aGlsZSAoaW5kZXggPj0gMCk7CisgIH0KKworICBpZiAodmFsdWVPcmRlci5vcmRlciA9PSAtMSkgeworICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworICB9IGVsc2UgeworICAgICpwTG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbiA9IHRhcmdldExvdWRuZXNzIC0gdmFsdWVPcmRlci52YWx1ZTsKKyAgICAqcExvdWRuZXNzID0gdmFsdWVPcmRlci52YWx1ZTsKKyAgfQorCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF90cnVlUGVha0xldmVsSXNQcmVzZW50KEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHJjU2V0SWQsIGludCBkb3dubWl4SWQsIGludCBhbGJ1bU1vZGUpIHsKKyAgaW50IGk7CisgIGludCBjb3VudDsKKyAgTE9VRE5FU1NfSU5GTyogcExvdWRuZXNzSW5mbyA9IE5VTEw7CisKKyAgaWYgKGFsYnVtTW9kZSkgeworICAgIGNvdW50ID0gaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW1Db3VudDsKKyAgICBwTG91ZG5lc3NJbmZvID0gaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW07CisgIH0gZWxzZSB7CisgICAgY291bnQgPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9Db3VudDsKKyAgICBwTG91ZG5lc3NJbmZvID0gaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBpZiAoKHBMb3VkbmVzc0luZm9baV0uZHJjU2V0SWQgPT0gZHJjU2V0SWQpICYmCisgICAgICAgIChwTG91ZG5lc3NJbmZvW2ldLmRvd25taXhJZCA9PSBkb3dubWl4SWQpKSB7CisgICAgICBpZiAocExvdWRuZXNzSW5mb1tpXS50cnVlUGVha0xldmVsUHJlc2VudCkgcmV0dXJuIDE7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOIF9nZXRUcnVlUGVha0xldmVsKAorICAgIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0LCBpbnQgZHJjU2V0SWQsIGludCBkb3dubWl4SWQsCisgICAgaW50IGFsYnVtTW9kZSwgRklYUF9EQkwqIHBUcnVlUGVha0xldmVsKSB7CisgIGludCBpOworICBpbnQgY291bnQ7CisgIExPVURORVNTX0lORk8qIHBMb3VkbmVzc0luZm8gPSBOVUxMOworCisgIGlmIChhbGJ1bU1vZGUpIHsKKyAgICBjb3VudCA9IGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0FsYnVtQ291bnQ7CisgICAgcExvdWRuZXNzSW5mbyA9IGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0FsYnVtOworICB9IGVsc2UgeworICAgIGNvdW50ID0gaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQ291bnQ7CisgICAgcExvdWRuZXNzSW5mbyA9IGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mbzsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgaWYgKChwTG91ZG5lc3NJbmZvW2ldLmRyY1NldElkID09IGRyY1NldElkKSAmJgorICAgICAgICAocExvdWRuZXNzSW5mb1tpXS5kb3dubWl4SWQgPT0gZG93bm1peElkKSkgeworICAgICAgaWYgKHBMb3VkbmVzc0luZm9baV0udHJ1ZVBlYWtMZXZlbFByZXNlbnQpIHsKKyAgICAgICAgKnBUcnVlUGVha0xldmVsID0gcExvdWRuZXNzSW5mb1tpXS50cnVlUGVha0xldmVsOworICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworfQorCitzdGF0aWMgaW50IF9zYW1wbGVQZWFrTGV2ZWxJc1ByZXNlbnQoSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRyY1NldElkLCBpbnQgZG93bm1peElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGJ1bU1vZGUpIHsKKyAgaW50IGk7CisgIGludCBjb3VudDsKKyAgTE9VRE5FU1NfSU5GTyogcExvdWRuZXNzSW5mbyA9IE5VTEw7CisKKyAgaWYgKGFsYnVtTW9kZSkgeworICAgIGNvdW50ID0gaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW1Db3VudDsKKyAgICBwTG91ZG5lc3NJbmZvID0gaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW07CisgIH0gZWxzZSB7CisgICAgY291bnQgPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9Db3VudDsKKyAgICBwTG91ZG5lc3NJbmZvID0gaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBpZiAoKHBMb3VkbmVzc0luZm9baV0uZHJjU2V0SWQgPT0gZHJjU2V0SWQpICYmCisgICAgICAgIChwTG91ZG5lc3NJbmZvW2ldLmRvd25taXhJZCA9PSBkb3dubWl4SWQpKSB7CisgICAgICBpZiAocExvdWRuZXNzSW5mb1tpXS5zYW1wbGVQZWFrTGV2ZWxQcmVzZW50KSByZXR1cm4gMTsKKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2dldFNhbXBsZVBlYWtMZXZlbCgKKyAgICBIQU5ETEVfTE9VRE5FU1NfSU5GT19TRVQgaExvdWRuZXNzSW5mb1NldCwgaW50IGRyY1NldElkLCBpbnQgZG93bm1peElkLAorICAgIGludCBhbGJ1bU1vZGUsIEZJWFBfREJMKiBwU2FtcGxlUGVha0xldmVsIC8qIGUgPSA3ICovCispIHsKKyAgaW50IGk7CisgIGludCBjb3VudDsKKyAgTE9VRE5FU1NfSU5GTyogcExvdWRuZXNzSW5mbyA9IE5VTEw7CisKKyAgaWYgKGFsYnVtTW9kZSkgeworICAgIGNvdW50ID0gaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW1Db3VudDsKKyAgICBwTG91ZG5lc3NJbmZvID0gaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvQWxidW07CisgIH0gZWxzZSB7CisgICAgY291bnQgPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9Db3VudDsKKyAgICBwTG91ZG5lc3NJbmZvID0gaExvdWRuZXNzSW5mb1NldC0+bG91ZG5lc3NJbmZvOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBpZiAoKHBMb3VkbmVzc0luZm9baV0uZHJjU2V0SWQgPT0gZHJjU2V0SWQpICYmCisgICAgICAgIChwTG91ZG5lc3NJbmZvW2ldLmRvd25taXhJZCA9PSBkb3dubWl4SWQpKSB7CisgICAgICBpZiAocExvdWRuZXNzSW5mb1tpXS5zYW1wbGVQZWFrTGV2ZWxQcmVzZW50KSB7CisgICAgICAgICpwU2FtcGxlUGVha0xldmVsID0gcExvdWRuZXNzSW5mb1tpXS5zYW1wbGVQZWFrTGV2ZWw7CisgICAgICAgIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0s7Cit9CisKK3N0YXRpYyBpbnQgX2xpbWl0ZXJQZWFrVGFyZ2V0SXNQcmVzZW50KAorICAgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcERyY0luc3RydWN0aW9uLCBpbnQgZHJjU2V0SWQsIGludCBkb3dubWl4SWQpIHsKKyAgaW50IGk7CisKKyAgaWYgKHBEcmNJbnN0cnVjdGlvbi0+bGltaXRlclBlYWtUYXJnZXRQcmVzZW50KSB7CisgICAgaWYgKChwRHJjSW5zdHJ1Y3Rpb24tPmRvd25taXhJZFswXSA9PSBkb3dubWl4SWQpIHx8CisgICAgICAgIChwRHJjSW5zdHJ1Y3Rpb24tPmRvd25taXhJZFswXSA9PSAweDdGKSkgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHBEcmNJbnN0cnVjdGlvbi0+ZG93bm1peElkQ291bnQ7IGkrKykgeworICAgICAgaWYgKHBEcmNJbnN0cnVjdGlvbi0+ZG93bm1peElkW2ldID09IGRvd25taXhJZCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2dldExpbWl0ZXJQZWFrVGFyZ2V0KAorICAgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcERyY0luc3RydWN0aW9uLCBpbnQgZHJjU2V0SWQsIGludCBkb3dubWl4SWQsCisgICAgRklYUF9EQkwqIHBMaW1pdGVyUGVha1RhcmdldCkgeworICBpbnQgaTsKKworICBpZiAocERyY0luc3RydWN0aW9uLT5saW1pdGVyUGVha1RhcmdldFByZXNlbnQpIHsKKyAgICBpZiAoKHBEcmNJbnN0cnVjdGlvbi0+ZG93bm1peElkWzBdID09IGRvd25taXhJZCkgfHwKKyAgICAgICAgKHBEcmNJbnN0cnVjdGlvbi0+ZG93bm1peElkWzBdID09IDB4N0YpKSB7CisgICAgICAqcExpbWl0ZXJQZWFrVGFyZ2V0ID0KKyAgICAgICAgICAoKEZYX1NHTDJGWF9EQkwocERyY0luc3RydWN0aW9uLT5saW1pdGVyUGVha1RhcmdldCkgPj4gMikpOworICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcERyY0luc3RydWN0aW9uLT5kb3dubWl4SWRDb3VudDsgaSsrKSB7CisgICAgICBpZiAocERyY0luc3RydWN0aW9uLT5kb3dubWl4SWRbaV0gPT0gZG93bm1peElkKSB7CisgICAgICAgICpwTGltaXRlclBlYWtUYXJnZXQgPQorICAgICAgICAgICAgKChGWF9TR0wyRlhfREJMKHBEcmNJbnN0cnVjdGlvbi0+bGltaXRlclBlYWtUYXJnZXQpID4+IDIpKTsKKyAgICAgICAgcmV0dXJuIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT19FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKK30KKworc3RhdGljIGludCBfZG93bm1peENvZWZmaWNpZW50c0FyZVByZXNlbnQoSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZG93bm1peElkLCBpbnQqIHBJbmRleCkgeworICBpbnQgaTsKKyAgKnBJbmRleCA9IC0xOworCisgIGZvciAoaSA9IDA7IGkgPCBoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zQ291bnQ7IGkrKykgeworICAgIGlmIChoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zW2ldLmRvd25taXhJZCA9PSBkb3dubWl4SWQpIHsKKyAgICAgIGlmIChoVW5pRHJjQ29uZmlnLT5kb3dubWl4SW5zdHJ1Y3Rpb25zW2ldLmRvd25taXhDb2VmZmljaWVudHNQcmVzZW50KSB7CisgICAgICAgICpwSW5kZXggPSBpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2dldFNpZ25hbFBlYWtMZXZlbCgKKyAgICBIQU5ETEVfU0VMX1BST0NfSU5QVVQgaFNlbFByb2NJbnB1dCwgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsCisgICAgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcEluc3QsCisgICAgaW50IGRvd25taXhJZFJlcXVlc3RlZCwgaW50KiBleHBsaWNpdFBlYWtJbmZvcm1hdGlvblByZXNlbnQsCisgICAgRklYUF9EQkwqIHNpZ25hbFBlYWtMZXZlbE91dCwgLyogZSA9IDcgKi8KKyAgICBTRUxfUFJPQ19DT0RFQ19NT0RFIGNvZGVjTW9kZQorCispIHsKKyAgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiByZXRWYWwgPSBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9fRVJST1I7CisKKyAgaW50IGFsYnVtTW9kZSA9IGhTZWxQcm9jSW5wdXQtPmFsYnVtTW9kZTsKKworICBGSVhQX0RCTCBzaWduYWxQZWFrTGV2ZWxUbXAgPSAoRklYUF9EQkwpMDsKKyAgRklYUF9EQkwgc2lnbmFsUGVha0xldmVsID0gRklYUF9EQkwoMCk7CisKKyAgaW50IGRteElkID0gZG93bm1peElkUmVxdWVzdGVkOworCisgIGludCBkcmNTZXRJZCA9IHBJbnN0LT5kcmNTZXRJZDsKKworICBpZiAoZHJjU2V0SWQgPCAwKSB7CisgICAgZHJjU2V0SWQgPSAwOworICB9CisKKyAgKmV4cGxpY2l0UGVha0luZm9ybWF0aW9uUHJlc2VudCA9IDE7CisKKyAgaWYgKF90cnVlUGVha0xldmVsSXNQcmVzZW50KGhMb3VkbmVzc0luZm9TZXQsIGRyY1NldElkLCBkbXhJZCwgYWxidW1Nb2RlKSkgeworICAgIHJldFZhbCA9IF9nZXRUcnVlUGVha0xldmVsKGhMb3VkbmVzc0luZm9TZXQsIGRyY1NldElkLCBkbXhJZCwgYWxidW1Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWduYWxQZWFrTGV2ZWwpOworICAgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKyAgfSBlbHNlIGlmIChfc2FtcGxlUGVha0xldmVsSXNQcmVzZW50KGhMb3VkbmVzc0luZm9TZXQsIGRyY1NldElkLCBkbXhJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsYnVtTW9kZSkpIHsKKyAgICByZXRWYWwgPSBfZ2V0U2FtcGxlUGVha0xldmVsKGhMb3VkbmVzc0luZm9TZXQsIGRyY1NldElkLCBkbXhJZCwgYWxidW1Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25hbFBlYWtMZXZlbCk7CisgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworICB9IGVsc2UgaWYgKF90cnVlUGVha0xldmVsSXNQcmVzZW50KGhMb3VkbmVzc0luZm9TZXQsIDB4M0YsIGRteElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsYnVtTW9kZSkpIHsKKyAgICByZXRWYWwgPSBfZ2V0VHJ1ZVBlYWtMZXZlbChoTG91ZG5lc3NJbmZvU2V0LCAweDNGLCBkbXhJZCwgYWxidW1Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWduYWxQZWFrTGV2ZWwpOworICAgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKyAgfSBlbHNlIGlmIChfc2FtcGxlUGVha0xldmVsSXNQcmVzZW50KGhMb3VkbmVzc0luZm9TZXQsIDB4M0YsIGRteElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxidW1Nb2RlKSkgeworICAgIHJldFZhbCA9IF9nZXRTYW1wbGVQZWFrTGV2ZWwoaExvdWRuZXNzSW5mb1NldCwgMHgzRiwgZG14SWQsIGFsYnVtTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWduYWxQZWFrTGV2ZWwpOworICAgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKyAgfSBlbHNlIGlmIChfbGltaXRlclBlYWtUYXJnZXRJc1ByZXNlbnQocEluc3QsIGRyY1NldElkLCBkbXhJZCkpIHsKKyAgICByZXRWYWwgPSBfZ2V0TGltaXRlclBlYWtUYXJnZXQocEluc3QsIGRyY1NldElkLCBkbXhJZCwgJnNpZ25hbFBlYWtMZXZlbCk7CisgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworICB9IGVsc2UgaWYgKGRteElkICE9IDApIHsKKyAgICBpbnQgZG93bm1peEluc3RydWN0aW9uSW5kZXggPSAwOworICAgIEZJWFBfREJMIGRvd25taXhQZWFrTGV2ZWxEQiA9IDA7CisKKyAgICAqZXhwbGljaXRQZWFrSW5mb3JtYXRpb25QcmVzZW50ID0gMDsKKworICAgIHNpZ25hbFBlYWtMZXZlbFRtcCA9IEZJWFBfREJMKDApOworCisgICAgaWYgKF9kb3dubWl4Q29lZmZpY2llbnRzQXJlUHJlc2VudChoVW5pRHJjQ29uZmlnLCBkbXhJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkb3dubWl4SW5zdHJ1Y3Rpb25JbmRleCkpIHsKKyAgICAgIEZJWFBfREJMIGRCX207CisgICAgICBpbnQgZEJfZTsKKyAgICAgIEZJWFBfREJMIGNvZWZmOworICAgICAgRklYUF9EQkwgc3VtLCBtYXhTdW07IC8qIGUgPSA3LCBzbyBpdCBpcyBwb3NzaWJsZSB0byBzdW0gdXAgdXAgdG8gMzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4IGNvZWZmaWNpZW50cyAod2l0aCBlID0gMikgKi8KKyAgICAgIGludCBpLCBqOworICAgICAgRE9XTk1JWF9JTlNUUlVDVElPTlMqIHBEb3duID0KKyAgICAgICAgICAmKGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNbZG93bm1peEluc3RydWN0aW9uSW5kZXhdKTsKKyAgICAgIEZJWFBfREJMIGRvd25taXhPZmZzZXQgPSBnZXREb3dubWl4T2Zmc2V0KAorICAgICAgICAgIHBEb3duLCBoVW5pRHJjQ29uZmlnLT5jaGFubmVsTGF5b3V0LmJhc2VDaGFubmVsQ291bnQpOyAvKiBlID0gMSAqLworICAgICAgbWF4U3VtID0gKEZJWFBfREJMKTA7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBwRG93bi0+dGFyZ2V0Q2hhbm5lbENvdW50OyBpKyspIHsKKyAgICAgICAgc3VtID0gKEZJWFBfREJMKTA7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBoVW5pRHJjQ29uZmlnLT5jaGFubmVsTGF5b3V0LmJhc2VDaGFubmVsQ291bnQ7IGorKykgeworICAgICAgICAgIGNvZWZmID0gcERvd24tPmRvd25taXhDb2VmZmljaWVudFtqICsgaSAqIGhVbmlEcmNDb25maWctPmNoYW5uZWxMYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJhc2VDaGFubmVsQ291bnRdOworICAgICAgICAgIHN1bSArPSBjb2VmZiA+PiA1OworICAgICAgICB9CisgICAgICAgIGlmIChtYXhTdW0gPCBzdW0pIG1heFN1bSA9IHN1bTsKKyAgICAgIH0KKworICAgICAgbWF4U3VtID0gZk11bHREaXYyKG1heFN1bSwgZG93bm1peE9mZnNldCkgPDwgMjsKKworICAgICAgaWYgKG1heFN1bSA9PSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSkgeworICAgICAgICBkb3dubWl4UGVha0xldmVsREIgPSAoRklYUF9EQkwpMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRCX20gPSBsaW4yZEIobWF4U3VtLCA3LCAmZEJfZSk7IC8qIGVfbWF4U3VtID0gNyAqLworICAgICAgICBkb3dubWl4UGVha0xldmVsREIgPQorICAgICAgICAgICAgc2NhbGVWYWx1ZShkQl9tLCBkQl9lIC0gNyk7IC8qIGVfZG93bm1peFBlYWtMZXZlbERCID0gNyAqLworICAgICAgfQorICAgIH0KKworICAgIGlmIChfdHJ1ZVBlYWtMZXZlbElzUHJlc2VudChoTG91ZG5lc3NJbmZvU2V0LCBkcmNTZXRJZCwgMCwgYWxidW1Nb2RlKSkgeworICAgICAgcmV0VmFsID0gX2dldFRydWVQZWFrTGV2ZWwoaExvdWRuZXNzSW5mb1NldCwgZHJjU2V0SWQsIDAsIGFsYnVtTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWduYWxQZWFrTGV2ZWxUbXApOworICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworICAgIH0gZWxzZSBpZiAoX3NhbXBsZVBlYWtMZXZlbElzUHJlc2VudChoTG91ZG5lc3NJbmZvU2V0LCBkcmNTZXRJZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxidW1Nb2RlKSkgeworICAgICAgcmV0VmFsID0gX2dldFNhbXBsZVBlYWtMZXZlbChoTG91ZG5lc3NJbmZvU2V0LCBkcmNTZXRJZCwgMCwgYWxidW1Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lnbmFsUGVha0xldmVsVG1wKTsKKyAgICAgIGlmIChyZXRWYWwpIHJldHVybiAocmV0VmFsKTsKKyAgICB9IGVsc2UgaWYgKF90cnVlUGVha0xldmVsSXNQcmVzZW50KGhMb3VkbmVzc0luZm9TZXQsIDB4M0YsIDAsIGFsYnVtTW9kZSkpIHsKKyAgICAgIHJldFZhbCA9IF9nZXRUcnVlUGVha0xldmVsKGhMb3VkbmVzc0luZm9TZXQsIDB4M0YsIDAsIGFsYnVtTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWduYWxQZWFrTGV2ZWxUbXApOworICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIChyZXRWYWwpOworICAgIH0gZWxzZSBpZiAoX3NhbXBsZVBlYWtMZXZlbElzUHJlc2VudChoTG91ZG5lc3NJbmZvU2V0LCAweDNGLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGJ1bU1vZGUpKSB7CisgICAgICByZXRWYWwgPSBfZ2V0U2FtcGxlUGVha0xldmVsKGhMb3VkbmVzc0luZm9TZXQsIDB4M0YsIDAsIGFsYnVtTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25hbFBlYWtMZXZlbFRtcCk7CisgICAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisgICAgfSBlbHNlIGlmIChfbGltaXRlclBlYWtUYXJnZXRJc1ByZXNlbnQocEluc3QsIGRyY1NldElkLCAwKSkgeworICAgICAgcmV0VmFsID0gX2dldExpbWl0ZXJQZWFrVGFyZ2V0KHBJbnN0LCBkcmNTZXRJZCwgMCwgJnNpZ25hbFBlYWtMZXZlbFRtcCk7CisgICAgICBpZiAocmV0VmFsKSByZXR1cm4gKHJldFZhbCk7CisgICAgfQorCisgICAgc2lnbmFsUGVha0xldmVsID0gc2lnbmFsUGVha0xldmVsVG1wICsgZG93bm1peFBlYWtMZXZlbERCOworICB9IGVsc2UgeworICAgIHNpZ25hbFBlYWtMZXZlbCA9IEZJWFBfREJMKDApOyAvKiB3b3JzdCBjYXNlIGVzdGltYXRlICovCisgICAgKmV4cGxpY2l0UGVha0luZm9ybWF0aW9uUHJlc2VudCA9IEZJWFBfREJMKDApOworICB9CisKKyAgKnNpZ25hbFBlYWtMZXZlbE91dCA9IHNpZ25hbFBlYWtMZXZlbDsKKworICByZXR1cm4gcmV0VmFsOworfQorCitzdGF0aWMgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTiBfZXh0cmFjdExvdWRuZXNzUGVha1RvQXZlcmFnZVZhbHVlKAorICAgIExPVURORVNTX0lORk8qIGxvdWRuZXNzSW5mbywKKyAgICBEWU5fUkFOR0VfTUVBU1VSRU1FTlRfUkVRVUVTVF9UWVBFIGR5bmFtaWNSYW5nZU1lYXN1cmVtZW50VHlwZSwKKyAgICBpbnQqIHBMb3VkbmVzc1BlYWtUb0F2ZXJhZ2VWYWx1ZVByZXNlbnQsCisgICAgRklYUF9EQkwqIHBMb3VkbmVzc1BlYWtUb0F2ZXJhZ2VWYWx1ZSkgeworICBpbnQgaTsKKworICBWQUxVRV9PUkRFUiB2YWx1ZU9yZGVyTG91ZG5lc3M7CisgIFZBTFVFX09SREVSIHZhbHVlT3JkZXJQZWFrTG91ZG5lc3M7CisKKyAgX2luaXRWYWx1ZU9yZGVyKCZ2YWx1ZU9yZGVyTG91ZG5lc3MpOworICBfaW5pdFZhbHVlT3JkZXIoJnZhbHVlT3JkZXJQZWFrTG91ZG5lc3MpOworCisgIExPVURORVNTX01FQVNVUkVNRU5UKiBwTG91ZG5lc3NNZWFzdXJlID0gTlVMTDsKKworICAqcExvdWRuZXNzUGVha1RvQXZlcmFnZVZhbHVlUHJlc2VudCA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IGxvdWRuZXNzSW5mby0+bWVhc3VyZW1lbnRDb3VudDsgaSsrKSB7CisgICAgcExvdWRuZXNzTWVhc3VyZSA9ICYobG91ZG5lc3NJbmZvLT5sb3VkbmVzc01lYXN1cmVtZW50W2ldKTsKKworICAgIGlmIChwTG91ZG5lc3NNZWFzdXJlLT5tZXRob2REZWZpbml0aW9uID09IE1EX1BST0dSQU1fTE9VRE5FU1MpIHsKKyAgICAgIF9nZXRNZXRob2RWYWx1ZSgmdmFsdWVPcmRlckxvdWRuZXNzLCBwTG91ZG5lc3NNZWFzdXJlLT5tZXRob2RWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBwTG91ZG5lc3NNZWFzdXJlLT5tZWFzdXJlbWVudFN5c3RlbSwgTVNfUFJPR1JBTUxPVURORVNTKTsKKyAgICB9CisKKyAgICBpZiAoKGR5bmFtaWNSYW5nZU1lYXN1cmVtZW50VHlwZSA9PSBEUk1SVF9TSE9SVF9URVJNX0xPVURORVNTX1RPX0FWRykgJiYKKyAgICAgICAgKHBMb3VkbmVzc01lYXN1cmUtPm1ldGhvZERlZmluaXRpb24gPT0gTURfU0hPUlRfVEVSTV9MT1VETkVTU19NQVgpKSB7CisgICAgICBfZ2V0TWV0aG9kVmFsdWUoJnZhbHVlT3JkZXJQZWFrTG91ZG5lc3MsIHBMb3VkbmVzc01lYXN1cmUtPm1ldGhvZFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIHBMb3VkbmVzc01lYXN1cmUtPm1lYXN1cmVtZW50U3lzdGVtLCBNU19QRUFLTE9VRE5FU1MpOworICAgIH0KKworICAgIGlmICgoZHluYW1pY1JhbmdlTWVhc3VyZW1lbnRUeXBlID09IERSTVJUX01PTUVOVEFSWV9MT1VETkVTU19UT19BVkcpICYmCisgICAgICAgIChwTG91ZG5lc3NNZWFzdXJlLT5tZXRob2REZWZpbml0aW9uID09IE1EX01PTUVOVEFSWV9MT1VETkVTU19NQVgpKSB7CisgICAgICBfZ2V0TWV0aG9kVmFsdWUoJnZhbHVlT3JkZXJQZWFrTG91ZG5lc3MsIHBMb3VkbmVzc01lYXN1cmUtPm1ldGhvZFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIHBMb3VkbmVzc01lYXN1cmUtPm1lYXN1cmVtZW50U3lzdGVtLCBNU19QRUFLTE9VRE5FU1MpOworICAgIH0KKworICAgIGlmICgoZHluYW1pY1JhbmdlTWVhc3VyZW1lbnRUeXBlID09IERSTVJUX1RPUF9PRl9MT1VETkVTU19SQU5HRV9UT19BVkcpICYmCisgICAgICAgIChwTG91ZG5lc3NNZWFzdXJlLT5tZXRob2REZWZpbml0aW9uID09IE1EX01BWF9PRl9MT1VETkVTU19SQU5HRSkpIHsKKyAgICAgIF9nZXRNZXRob2RWYWx1ZSgmdmFsdWVPcmRlclBlYWtMb3VkbmVzcywgcExvdWRuZXNzTWVhc3VyZS0+bWV0aG9kVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgcExvdWRuZXNzTWVhc3VyZS0+bWVhc3VyZW1lbnRTeXN0ZW0sIE1TX1BFQUtMT1VETkVTUyk7CisgICAgfQorICB9CisKKyAgaWYgKCh2YWx1ZU9yZGVyTG91ZG5lc3Mub3JkZXIgPiAtMSkgJiYgKHZhbHVlT3JkZXJQZWFrTG91ZG5lc3Mub3JkZXIgPiAtMSkpIHsKKyAgICAqcExvdWRuZXNzUGVha1RvQXZlcmFnZVZhbHVlID0KKyAgICAgICAgdmFsdWVPcmRlclBlYWtMb3VkbmVzcy52YWx1ZSAtIHZhbHVlT3JkZXJMb3VkbmVzcy52YWx1ZTsKKyAgICAqcExvdWRuZXNzUGVha1RvQXZlcmFnZVZhbHVlUHJlc2VudCA9IDE7CisgIH0KKworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX3NlbGVjdEFsYnVtTG91ZG5lc3MoCisgICAgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsCisgICAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNQb3RlbnRpYWwsCisgICAgRFJDREVDX1NFTEVDVElPTiogcENhbmRpZGF0ZXNTZWxlY3RlZCkgeworICBpbnQgaSwgajsKKworICBmb3IgKGkgPSAwOyBpIDwgX2RyY2RlY19zZWxlY3Rpb25fZ2V0TnVtYmVyKHBDYW5kaWRhdGVzUG90ZW50aWFsKTsgaSsrKSB7CisgICAgRFJDREVDX1NFTEVDVElPTl9EQVRBKiBwQ2FuZGlkYXRlID0KKyAgICAgICAgX2RyY2RlY19zZWxlY3Rpb25fZ2V0QXQocENhbmRpZGF0ZXNQb3RlbnRpYWwsIGkpOworICAgIGlmIChwQ2FuZGlkYXRlID09IE5VTEwpIHJldHVybiBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfTk9UX09LOworCisgICAgZm9yIChqID0gMDsgaiA8IGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0FsYnVtQ291bnQ7IGorKykgeworICAgICAgaWYgKHBDYW5kaWRhdGUtPnBJbnN0LT5kcmNTZXRJZCA9PQorICAgICAgICAgIGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0FsYnVtW2pdLmRyY1NldElkKSB7CisgICAgICAgIGlmIChfZHJjZGVjX3NlbGVjdGlvbl9hZGQocENhbmRpZGF0ZXNTZWxlY3RlZCwgcENhbmRpZGF0ZSkgPT0gTlVMTCkKKyAgICAgICAgICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PVF9PSzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBfZmluZE1ldGhvZERlZmluaXRpb24oTE9VRE5FU1NfSU5GTyogcExvdWRuZXNzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2REZWZpbml0aW9uLCBpbnQgc3RhcnRJbmRleCkgeworICBpbnQgaTsKKyAgaW50IGluZGV4ID0gLTE7CisKKyAgZm9yIChpID0gc3RhcnRJbmRleDsgaSA8IHBMb3VkbmVzc0luZm8tPm1lYXN1cmVtZW50Q291bnQ7IGkrKykgeworICAgIGlmIChwTG91ZG5lc3NJbmZvLT5sb3VkbmVzc01lYXN1cmVtZW50W2ldLm1ldGhvZERlZmluaXRpb24gPT0KKyAgICAgICAgbWV0aG9kRGVmaW5pdGlvbikgeworICAgICAgaW5kZXggPSBpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGluZGV4OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4gX2dldE1peGluZ0xldmVsKAorICAgIEhBTkRMRV9MT1VETkVTU19JTkZPX1NFVCBoTG91ZG5lc3NJbmZvU2V0LCBpbnQgZG93bm1peElkUmVxdWVzdGVkLAorICAgIGludCBkcmNTZXRJZFJlcXVlc3RlZCwgaW50IGFsYnVtTW9kZSwgRklYUF9EQkwqIHBNaXhpbmdMZXZlbCkgeworICBjb25zdCBGSVhQX0RCTCBtaXhpbmdMZXZlbERlZmF1bHQgPSBGTDJGWENPTlNUX0RCTCg4NS4wZiAvIChmbG9hdCkoMSA8PCA3KSk7CisKKyAgaW50IGk7CisgIGludCBjb3VudDsKKworICBMT1VETkVTU19JTkZPKiBwTG91ZG5lc3NJbmZvID0gTlVMTDsKKworICAqcE1peGluZ0xldmVsID0gbWl4aW5nTGV2ZWxEZWZhdWx0OworCisgIGlmIChkcmNTZXRJZFJlcXVlc3RlZCA8IDApIHsKKyAgICBkcmNTZXRJZFJlcXVlc3RlZCA9IDA7CisgIH0KKworICBpZiAoYWxidW1Nb2RlKSB7CisgICAgY291bnQgPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bUNvdW50OworICAgIHBMb3VkbmVzc0luZm8gPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm9BbGJ1bTsKKyAgfSBlbHNlIHsKKyAgICBjb3VudCA9IGhMb3VkbmVzc0luZm9TZXQtPmxvdWRuZXNzSW5mb0NvdW50OworICAgIHBMb3VkbmVzc0luZm8gPSBoTG91ZG5lc3NJbmZvU2V0LT5sb3VkbmVzc0luZm87CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIGlmICgoZHJjU2V0SWRSZXF1ZXN0ZWQgPT0gcExvdWRuZXNzSW5mb1tpXS5kcmNTZXRJZCkgJiYKKyAgICAgICAgKChkb3dubWl4SWRSZXF1ZXN0ZWQgPT0gcExvdWRuZXNzSW5mb1tpXS5kb3dubWl4SWQpIHx8CisgICAgICAgICAoRE9XTk1JWF9JRF9BTllfRE9XTk1JWCA9PSBwTG91ZG5lc3NJbmZvW2ldLmRvd25taXhJZCkpKSB7CisgICAgICBpbnQgaW5kZXggPSBfZmluZE1ldGhvZERlZmluaXRpb24oJnBMb3VkbmVzc0luZm9baV0sIE1EX01JWElOR19MRVZFTCwgMCk7CisKKyAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICpwTWl4aW5nTGV2ZWwgPSBwTG91ZG5lc3NJbmZvW2ldLmxvdWRuZXNzTWVhc3VyZW1lbnRbaW5kZXhdLm1ldGhvZFZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX3NlbGVjdGlvblByb2Nlc3MuaCBiL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX3NlbGVjdGlvblByb2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTBlM2ZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliRFJDZGVjL3NyYy9kcmNEZWNfc2VsZWN0aW9uUHJvY2Vzcy5oCkBAIC0wLDAgKzEsMjE3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUctRCBEUkMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBBbmRyZWFzIEhvZWx6ZXIKKworICAgRGVzY3JpcHRpb246IERSQyBTZXQgU2VsZWN0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRFJDREVDX1NFTEVDVElPTlBST0NFU1NfSAorI2RlZmluZSBEUkNERUNfU0VMRUNUSU9OUFJPQ0VTU19ICisKKyNpbmNsdWRlICJkcmNEZWNfdHlwZXMuaCIKKyNpbmNsdWRlICJkcmNEZWNvZGVyLmgiCisKKy8qIERSQyBzZXQgc2VsZWN0aW9uIGFjY29yZGluZyB0byBzZWN0aW9uIDYuMiBvZiBJU08vSUVDIDIzMDAzLTQgKE1QRUctRCBEUkMpICovCisvKiBpbmNsdWRpbmcgSVNPL0lFQyAyMzAwMy00L0FNRDEgKEFtZW5kbWVudCAxKSAqLworCit0eXBlZGVmIHN0cnVjdCBzX2RyY2RlY19zZWxlY3Rpb25fcHJvY2VzcyogSEFORExFX0RSQ19TRUxFQ1RJT05fUFJPQ0VTUzsKKwordHlwZWRlZiBlbnVtIHsKKyAgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX05PX0VSUk9SID0gMCwKKworICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfV0FSTklORyA9IC0xMDAwLAorCisgIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfT0sgPSAtMjAwMCwKKyAgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX09VVE9GTUVNT1JZLAorICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfSU5WQUxJRF9IQU5ETEUsCisgIERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19OT1RfU1VQUE9SVEVELAorICBEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfSU5WQUxJRF9QQVJBTSwKKyAgRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1BBUkFNX09VVF9PRl9SQU5HRQorCit9IERSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk47CisKK3R5cGVkZWYgZW51bSB7CisgIFNFTF9QUk9DX1RFU1RfVElNRV9ET01BSU4gPSAtMTAwLAorICBTRUxfUFJPQ19URVNUX1FNRl9ET01BSU4sCisgIFNFTF9QUk9DX1RFU1RfU1RGVF9ET01BSU4sCisKKyAgU0VMX1BST0NfQ09ERUNfTU9ERV9VTkRFRklORUQgPSAtMSwKKyAgU0VMX1BST0NfTVBFR180X0FBQywKKyAgU0VMX1BST0NfTVBFR19EX1VTQUMsCisgIFNFTF9QUk9DX01QRUdfSF8zREEKK30gU0VMX1BST0NfQ09ERUNfTU9ERTsKKwordHlwZWRlZiBlbnVtIHsKKyAgLyogc2V0IGFuZCBnZXQgdXNlciBwYXJhbSAqLworICBTRUxfUFJPQ19MT1VETkVTU19OT1JNQUxJWkFUSU9OX09OLAorICAvKiBnZXQgb25seSB1c2VyIHBhcmFtICovCisgIFNFTF9QUk9DX0RZTkFNSUNfUkFOR0VfQ09OVFJPTF9PTiwKKyAgLyogc2V0IG9ubHkgdXNlciBwYXJhbXMgKi8KKyAgU0VMX1BST0NfVEFSR0VUX0xPVURORVNTLAorICBTRUxfUFJPQ19FRkZFQ1RfVFlQRSwKKyAgU0VMX1BST0NfRUZGRUNUX1RZUEVfRkFMTEJBQ0tfQ09ERSwKKyAgU0VMX1BST0NfTE9VRE5FU1NfTUVBU1VSRU1FTlRfTUVUSE9ELAorICBTRUxfUFJPQ19ET1dOTUlYX0lELAorICBTRUxfUFJPQ19UQVJHRVRfTEFZT1VULAorICBTRUxfUFJPQ19UQVJHRVRfQ0hBTk5FTF9DT1VOVCwKKyAgU0VMX1BST0NfQkFTRV9DSEFOTkVMX0NPVU5ULAorICBTRUxfUFJPQ19TQU1QTEVfUkFURSwKKyAgU0VMX1BST0NfQk9PU1QsCisgIFNFTF9QUk9DX0NPTVBSRVNTCit9IFNFTF9QUk9DX1VTRVJfUEFSQU07CisKK3R5cGVkZWYgc3RydWN0IHNfc2VsZWN0aW9uX3Byb2Nlc3Nfb3V0cHV0IHsKKyAgRklYUF9EQkwgb3V0cHV0UGVha0xldmVsRGI7ICAgICAgICAgICAvKiBlID0gNyAqLworICBGSVhQX0RCTCBsb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGI7IC8qIGUgPSA3ICovCisgIEZJWFBfREJMIG91dHB1dExvdWRuZXNzOyAgICAgICAgICAgICAgLyogZSA9IDcgKi8KKworICBVQ0hBUiBudW1TZWxlY3RlZERyY1NldHM7CisgIFNDSEFSIHNlbGVjdGVkRHJjU2V0SWRzW01BWF9BQ1RJVkVfRFJDU107CisgIFVDSEFSIHNlbGVjdGVkRG93bm1peElkc1tNQVhfQUNUSVZFX0RSQ1NdOworCisgIFVDSEFSIGFjdGl2ZURvd25taXhJZDsKKyAgVUNIQVIgYmFzZUNoYW5uZWxDb3VudDsKKyAgVUNIQVIgdGFyZ2V0Q2hhbm5lbENvdW50OworICBTQ0hBUiB0YXJnZXRMYXlvdXQ7CisgIFVDSEFSIGRvd25taXhNYXRyaXhQcmVzZW50OworICBGSVhQX0RCTCBkb3dubWl4TWF0cml4WzhdWzhdOyAvKiBlID0gMiAqLworCisgIEZJWFBfU0dMIGJvb3N0OyAgICAvKiBlID0gMSAqLworICBGSVhQX1NHTCBjb21wcmVzczsgLyogZSA9IDEgKi8KKworICBGSVhQX0RCTCBtaXhpbmdMZXZlbDsgLyogZSA9IDcgKi8KKworfSBTRUxfUFJPQ19PVVRQVVQsICpIQU5ETEVfU0VMX1BST0NfT1VUUFVUOworCitEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOCitkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19DcmVhdGUoSEFORExFX0RSQ19TRUxFQ1RJT05fUFJPQ0VTUyogcGhJbnN0YW5jZSk7CisKK0RSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4KK2RyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX0RlbGV0ZShIQU5ETEVfRFJDX1NFTEVDVElPTl9QUk9DRVNTKiBwaEluc3RhbmNlKTsKKworRFJDREVDX1NFTEVDVElPTl9QUk9DRVNTX1JFVFVSTgorZHJjRGVjX1NlbGVjdGlvblByb2Nlc3NfSW5pdChIQU5ETEVfRFJDX1NFTEVDVElPTl9QUk9DRVNTIGhJbnN0YW5jZSk7CisKK0RSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4KK2RyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX1NldENvZGVjTW9kZShIQU5ETEVfRFJDX1NFTEVDVElPTl9QUk9DRVNTIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRUxfUFJPQ19DT0RFQ19NT0RFIGNvZGVjTW9kZSk7CisKK0RSQ0RFQ19TRUxFQ1RJT05fUFJPQ0VTU19SRVRVUk4KK2RyY0RlY19TZWxlY3Rpb25Qcm9jZXNzX1NldFBhcmFtKEhBTkRMRV9EUkNfU0VMRUNUSU9OX1BST0NFU1MgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0VMX1BST0NfVVNFUl9QQVJBTSByZXF1ZXN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHJlcXVlc3RWYWx1ZSwgaW50KiBwRGlmZik7CisKK0ZJWFBfREJMCitkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19HZXRQYXJhbShIQU5ETEVfRFJDX1NFTEVDVElPTl9QUk9DRVNTIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNFTF9QUk9DX1VTRVJfUEFSQU0gcmVxdWVzdFR5cGUpOworCitEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOCitkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19TZXRNcGVnaFBhcmFtcygKKyAgICBIQU5ETEVfRFJDX1NFTEVDVElPTl9QUk9DRVNTIGhJbnN0YW5jZSwgY29uc3QgaW50IG51bUdyb3VwSWRzUmVxdWVzdGVkLAorICAgIGNvbnN0IGludCogZ3JvdXBJZFJlcXVlc3RlZCwgY29uc3QgaW50IG51bUdyb3VwUHJlc2V0SWRzUmVxdWVzdGVkLAorICAgIGNvbnN0IGludCogZ3JvdXBQcmVzZXRJZFJlcXVlc3RlZCwKKyAgICBjb25zdCBpbnQqIG51bU1lbWJlcnNHcm91cFByZXNldElkc1JlcXVlc3RlZCwKKyAgICBjb25zdCBpbnQgZ3JvdXBQcmVzZXRJZFJlcXVlc3RlZFByZWZlcmVuY2UsIGludCogcERpZmYpOworCitEUkNERUNfU0VMRUNUSU9OX1BST0NFU1NfUkVUVVJOCitkcmNEZWNfU2VsZWN0aW9uUHJvY2Vzc19Qcm9jZXNzKEhBTkRMRV9EUkNfU0VMRUNUSU9OX1BST0NFU1MgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0xPVURORVNTX0lORk9fU0VUIGhMb3VkbmVzc0luZm9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TRUxfUFJPQ19PVVRQVVQgaFNlbFByb2NPdXRwdXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX3Rvb2xzLmNwcCBiL2xpYkRSQ2RlYy9zcmMvZHJjRGVjX3Rvb2xzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTZmZWIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliRFJDZGVjL3NyYy9kcmNEZWNfdG9vbHMuY3BwCkBAIC0wLDAgKzEsMzcxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUctRCBEUkMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJkcmNEZWNfdHlwZXMuaCIKKyNpbmNsdWRlICJkcmNEZWNfdG9vbHMuaCIKKyNpbmNsdWRlICJmaXhwb2ludF9tYXRoLmgiCisjaW5jbHVkZSAiZHJjRGVjb2Rlci5oIgorCitpbnQgZ2V0RGVsdGFUbWluKGNvbnN0IGludCBzYW1wbGVSYXRlKSB7CisgIC8qIGhhbGZfbXMgPSByb3VuZCAoMC4wMDA1ICogc2FtcGxlUmF0ZSk7ICovCisgIGludCBoYWxmX21zID0gKHNhbXBsZVJhdGUgKyAxMDAwKSAvIDIwMDA7CisgIGludCBkZWx0YVRtaW4gPSAxOworICBpZiAoc2FtcGxlUmF0ZSA8IDEwMDApIHsKKyAgICByZXR1cm4gREVfTk9UX09LOworICB9CisgIHdoaWxlIChkZWx0YVRtaW4gPD0gaGFsZl9tcykgeworICAgIGRlbHRhVG1pbiA9IGRlbHRhVG1pbiA8PCAxOworICB9CisgIHJldHVybiBkZWx0YVRtaW47Cit9CisKK0RSQ19DT0VGRklDSUVOVFNfVU5JX0RSQyogc2VsZWN0RHJjQ29lZmZpY2llbnRzKAorICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLCBjb25zdCBpbnQgbG9jYXRpb24pIHsKKyAgaW50IG47CisgIGludCBjID0gLTE7CisgIGZvciAobiA9IDA7IG4gPCBoVW5pRHJjQ29uZmlnLT5kcmNDb2VmZmljaWVudHNVbmlEcmNDb3VudDsgbisrKSB7CisgICAgaWYgKGhVbmlEcmNDb25maWctPmRyY0NvZWZmaWNpZW50c1VuaURyY1tuXS5kcmNMb2NhdGlvbiA9PSBsb2NhdGlvbikgeworICAgICAgYyA9IG47CisgICAgfQorICB9CisgIGlmIChjID49IDApIHsKKyAgICByZXR1cm4gJihoVW5pRHJjQ29uZmlnLT5kcmNDb2VmZmljaWVudHNVbmlEcmNbY10pOworICB9CisgIHJldHVybiBOVUxMOyAvKiBwb3NzaWJsZSBkdXJpbmcgYml0c3RyZWFtIHBhcnNpbmcgKi8KK30KKworRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBzZWxlY3REcmNJbnN0cnVjdGlvbnMoCisgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsIGNvbnN0IGludCBkcmNTZXRJZCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc0NvdW50SW5jbFZpcnR1YWw7IGkrKykgeworICAgIGlmIChoVW5pRHJjQ29uZmlnLT5kcmNJbnN0cnVjdGlvbnNVbmlEcmNbaV0uZHJjU2V0SWQgPT0gZHJjU2V0SWQpIHsKKyAgICAgIHJldHVybiAmKGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY1tpXSk7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorCitET1dOTUlYX0lOU1RSVUNUSU9OUyogc2VsZWN0RG93bm1peEluc3RydWN0aW9ucygKKyAgICBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywgY29uc3QgaW50IGRvd25taXhJZCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNDb3VudDsgaSsrKSB7CisgICAgaWYgKGhVbmlEcmNDb25maWctPmRvd25taXhJbnN0cnVjdGlvbnNbaV0uZG93bm1peElkID09IGRvd25taXhJZCkgeworICAgICAgcmV0dXJuICYoaFVuaURyY0NvbmZpZy0+ZG93bm1peEluc3RydWN0aW9uc1tpXSk7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorCitEUkNfRVJST1IKK2Rlcml2ZURyY0NoYW5uZWxHcm91cHMoCisgICAgY29uc3QgaW50IGRyY1NldEVmZmVjdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiAqLworICAgIGNvbnN0IGludCBjaGFubmVsQ291bnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gKi8KKyAgICBjb25zdCBTQ0hBUiogZ2FpblNldEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluICovCisgICAgY29uc3QgRFVDS0lOR19NT0RJRklDQVRJT04qIGR1Y2tpbmdNb2RpZmljYXRpb25Gb3JDaGFubmVsLCAvKiBpbiAqLworICAgIFVDSEFSKiBuRHJjQ2hhbm5lbEdyb3VwcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0ICovCisgICAgU0NIQVIqIHVuaXF1ZUluZGV4LCAgICAgLyogb3V0IChnYWluU2V0SW5kZXhGb3JDaGFubmVsR3JvdXApICovCisgICAgU0NIQVIqIGdyb3VwRm9yQ2hhbm5lbCwgLyogb3V0ICovCisgICAgRFVDS0lOR19NT0RJRklDQVRJT04qIGR1Y2tpbmdNb2RpZmljYXRpb25Gb3JDaGFubmVsR3JvdXApIC8qIG91dCAqLworeworICBpbnQgZHVja2luZ1NlcXVlbmNlID0gLTE7CisgIGludCBjLCBuLCBnLCBtYXRjaCwgaWR4OworICBGSVhQX1NHTCBmYWN0b3I7CisgIEZJWFBfU0dMIHVuaXF1ZVNjYWxpbmdbOF07CisKKyAgZm9yIChnID0gMDsgZyA8IDg7IGcrKykgeworICAgIHVuaXF1ZUluZGV4W2ddID0gLTEwOworICAgIHVuaXF1ZVNjYWxpbmdbZ10gPSBGSVhQX1NHTCgtMS4wZik7CisgIH0KKworICBnID0gMDsKKworICBpZiAoZHJjU2V0RWZmZWN0ICYgRUJfRFVDS19PVEhFUikgeworICAgIGZvciAoYyA9IDA7IGMgPCBjaGFubmVsQ291bnQ7IGMrKykgeworICAgICAgbWF0Y2ggPSAwOworICAgICAgaWYgKGMgPj0gOCkgcmV0dXJuIERFX01FTU9SWV9FUlJPUjsKKyAgICAgIGlkeCA9IGdhaW5TZXRJbmRleFtjXTsKKyAgICAgIGZhY3RvciA9IGR1Y2tpbmdNb2RpZmljYXRpb25Gb3JDaGFubmVsW2NdLmR1Y2tpbmdTY2FsaW5nOworICAgICAgaWYgKGlkeCA8IDApIHsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IGc7IG4rKykgeworICAgICAgICAgIGlmICh1bmlxdWVTY2FsaW5nW25dID09IGZhY3RvcikgeworICAgICAgICAgICAgbWF0Y2ggPSAxOworICAgICAgICAgICAgZ3JvdXBGb3JDaGFubmVsW2NdID0gbjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobWF0Y2ggPT0gMCkgeworICAgICAgICAgIGlmIChnID49IDgpIHJldHVybiBERV9NRU1PUllfRVJST1I7CisgICAgICAgICAgdW5pcXVlSW5kZXhbZ10gPSBpZHg7CisgICAgICAgICAgdW5pcXVlU2NhbGluZ1tnXSA9IGZhY3RvcjsKKyAgICAgICAgICBncm91cEZvckNoYW5uZWxbY10gPSBnOworICAgICAgICAgIGcrKzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChkdWNraW5nU2VxdWVuY2UgPiAwKSAmJiAoZHVja2luZ1NlcXVlbmNlICE9IGlkeCkpIHsKKyAgICAgICAgICByZXR1cm4gREVfTk9UX09LOworICAgICAgICB9CisgICAgICAgIGR1Y2tpbmdTZXF1ZW5jZSA9IGlkeDsKKyAgICAgICAgZ3JvdXBGb3JDaGFubmVsW2NdID0gLTE7CisgICAgICB9CisgICAgfQorICAgIGlmIChkdWNraW5nU2VxdWVuY2UgPT0gLTEpIHsKKyAgICAgIHJldHVybiBERV9OT1RfT0s7CisgICAgfQorICB9IGVsc2UgaWYgKGRyY1NldEVmZmVjdCAmIEVCX0RVQ0tfU0VMRikgeworICAgIGZvciAoYyA9IDA7IGMgPCBjaGFubmVsQ291bnQ7IGMrKykgeworICAgICAgbWF0Y2ggPSAwOworICAgICAgaWYgKGMgPj0gOCkgcmV0dXJuIERFX01FTU9SWV9FUlJPUjsKKyAgICAgIGlkeCA9IGdhaW5TZXRJbmRleFtjXTsKKyAgICAgIGZhY3RvciA9IGR1Y2tpbmdNb2RpZmljYXRpb25Gb3JDaGFubmVsW2NdLmR1Y2tpbmdTY2FsaW5nOworICAgICAgaWYgKGlkeCA+PSAwKSB7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCBnOyBuKyspIHsKKyAgICAgICAgICBpZiAoKHVuaXF1ZUluZGV4W25dID09IGlkeCkgJiYgKHVuaXF1ZVNjYWxpbmdbbl0gPT0gZmFjdG9yKSkgeworICAgICAgICAgICAgbWF0Y2ggPSAxOworICAgICAgICAgICAgZ3JvdXBGb3JDaGFubmVsW2NdID0gbjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobWF0Y2ggPT0gMCkgeworICAgICAgICAgIGlmIChnID49IDgpIHJldHVybiBERV9NRU1PUllfRVJST1I7CisgICAgICAgICAgdW5pcXVlSW5kZXhbZ10gPSBpZHg7CisgICAgICAgICAgdW5pcXVlU2NhbGluZ1tnXSA9IGZhY3RvcjsKKyAgICAgICAgICBncm91cEZvckNoYW5uZWxbY10gPSBnOworICAgICAgICAgIGcrKzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3JvdXBGb3JDaGFubmVsW2NdID0gLTE7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeyAvKiBubyBkdWNraW5nICovCisgICAgZm9yIChjID0gMDsgYyA8IGNoYW5uZWxDb3VudDsgYysrKSB7CisgICAgICBpZiAoYyA+PSA4KSByZXR1cm4gREVfTUVNT1JZX0VSUk9SOworICAgICAgaWR4ID0gZ2FpblNldEluZGV4W2NdOworICAgICAgbWF0Y2ggPSAwOworICAgICAgaWYgKGlkeCA+PSAwKSB7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCBnOyBuKyspIHsKKyAgICAgICAgICBpZiAodW5pcXVlSW5kZXhbbl0gPT0gaWR4KSB7CisgICAgICAgICAgICBtYXRjaCA9IDE7CisgICAgICAgICAgICBncm91cEZvckNoYW5uZWxbY10gPSBuOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtYXRjaCA9PSAwKSB7CisgICAgICAgICAgaWYgKGcgPj0gOCkgcmV0dXJuIERFX01FTU9SWV9FUlJPUjsKKyAgICAgICAgICB1bmlxdWVJbmRleFtnXSA9IGlkeDsKKyAgICAgICAgICBncm91cEZvckNoYW5uZWxbY10gPSBnOworICAgICAgICAgIGcrKzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3JvdXBGb3JDaGFubmVsW2NdID0gLTE7CisgICAgICB9CisgICAgfQorICB9CisgICpuRHJjQ2hhbm5lbEdyb3VwcyA9IGc7CisKKyAgaWYgKGRyY1NldEVmZmVjdCAmIChFQl9EVUNLX09USEVSIHwgRUJfRFVDS19TRUxGKSkgeworICAgIGZvciAoZyA9IDA7IGcgPCAqbkRyY0NoYW5uZWxHcm91cHM7IGcrKykgeworICAgICAgaWYgKGRyY1NldEVmZmVjdCAmIEVCX0RVQ0tfT1RIRVIpIHsKKyAgICAgICAgdW5pcXVlSW5kZXhbZ10gPSBkdWNraW5nU2VxdWVuY2U7CisgICAgICB9CisgICAgICBkdWNraW5nTW9kaWZpY2F0aW9uRm9yQ2hhbm5lbEdyb3VwW2ddLmR1Y2tpbmdTY2FsaW5nID0gdW5pcXVlU2NhbGluZ1tnXTsKKyAgICAgIGlmICh1bmlxdWVTY2FsaW5nW2ddICE9IEZMMkZYQ09OU1RfU0dMKDEuMGYgLyAoZmxvYXQpKDEgPDwgMikpKSB7CisgICAgICAgIGR1Y2tpbmdNb2RpZmljYXRpb25Gb3JDaGFubmVsR3JvdXBbZ10uZHVja2luZ1NjYWxpbmdQcmVzZW50ID0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGR1Y2tpbmdNb2RpZmljYXRpb25Gb3JDaGFubmVsR3JvdXBbZ10uZHVja2luZ1NjYWxpbmdQcmVzZW50ID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gREVfT0s7Cit9CisKK0ZJWFBfREJMCitkQjJsaW4oY29uc3QgRklYUF9EQkwgZEJfbSwgY29uc3QgaW50IGRCX2UsIGludCogcExpbl9lKSB7CisgIC8qIGdldCBsaW5lYXIgdmFsdWUgZnJvbSBkQi4KKyAgICAgcmV0dXJuIGxpbl92YWwgPSAxMF4oZEJfdmFsLzIwKSA9IDJeKGxvZzIoMTApLzIwKmRCX3ZhbCkKKyAgICAgd2l0aCBkQl92YWwgPSBkQl9tICoyXmRCX2UgYW5kIGxpbl92YWwgPSBsaW5fbSAqIDJebGluX2UgKi8KKyAgRklYUF9EQkwgbGluX20gPQorICAgICAgZjJQb3coZk11bHQoZEJfbSwgRkwyRlhDT05TVF9EQkwoMC4xNjYwOTY0ZiAqIChmbG9hdCkoMSA8PCAyKSkpLCBkQl9lIC0gMiwKKyAgICAgICAgICAgIHBMaW5fZSk7CisKKyAgcmV0dXJuIGxpbl9tOworfQorCitGSVhQX0RCTAorbGluMmRCKGNvbnN0IEZJWFBfREJMIGxpbl9tLCBjb25zdCBpbnQgbGluX2UsIGludCogcERiX2UpIHsKKyAgLyogZ2V0IGRCIHZhbHVlIGZyb20gbGluZWFyIHZhbHVlLgorICAgICByZXR1cm4gZEJfdmFsID0gMjAqbG9nMTAobGluX3ZhbCkKKyAgICAgd2l0aCBkQl92YWwgPSBkQl9tICoyXmRCX2UgYW5kIGxpbl92YWwgPSBsaW5fbSAqIDJebGluX2UgKi8KKyAgRklYUF9EQkwgZEJfbTsKKworICBpZiAobGluX20gPT0gKEZJWFBfREJMKTApIHsgLyogcmV0dXJuIHZlcnkgc21hbGwgdmFsdWUgcmVwcmVzZW50aW5nIC1pbmYgKi8KKyAgICBkQl9tID0gKEZJWFBfREJMKU1JTlZBTF9EQkw7CisgICAgKnBEYl9lID0gREZSQUNUX0JJVFMgLSAxOworICB9IGVsc2UgeworICAgIC8qIDIwKmxvZzEwKGxpbl92YWwpID0gMjAvbG9nMigxMCkqbG9nMihsaW5fdmFsKSAqLworICAgIGRCX20gPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoNi4wMjA1OTk5MWYgLyAoZmxvYXQpKDEgPDwgMykpLAorICAgICAgICAgICAgICAgICAgICAgZkxvZzIobGluX20sIGxpbl9lLCBwRGJfZSkpOworICAgICpwRGJfZSArPSAzICsgMTsKKyAgfQorCisgIHJldHVybiBkQl9tOworfQorCitGSVhQX0RCTAorYXBwcm94RGIybGluKGNvbnN0IEZJWFBfREJMIGRCX20sIGNvbnN0IGludCBkQl9lLCBpbnQqIHBMaW5fZSkgeworICAvKiBnZXQgbGluZWFyIHZhbHVlIGZyb20gYXBwcm94aW1hdGUgZEIuCisgICAgIHJldHVybiBsaW5fdmFsID0gMl4oZEJfdmFsLzYpCisgICAgIHdpdGggZEJfdmFsID0gZEJfbSAqMl5kQl9lIGFuZCBsaW5fdmFsID0gbGluX20gKiAyXmxpbl9lICovCisgIEZJWFBfREJMIGxpbl9tID0KKyAgICAgIGYyUG93KGZNdWx0KGRCX20sIEZMMkZYQ09OU1RfREJMKDAuMTY2NjY2N2YgKiAoZmxvYXQpKDEgPDwgMikpKSwgZEJfZSAtIDIsCisgICAgICAgICAgICBwTGluX2UpOworCisgIHJldHVybiBsaW5fbTsKK30KKworaW50IGJpdHN0cmVhbUNvbnRhaW5zTXVsdGliYW5kRHJjKEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkb3dubWl4SWQpIHsKKyAgaW50IGksIGcsIGQsIHNlcTsKKyAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwSW5zdDsKKyAgRFJDX0NPRUZGSUNJRU5UU19VTklfRFJDKiBwQ29lZiA9IE5VTEw7CisgIGludCBpc011bHRpYmFuZCA9IDA7CisKKyAgcENvZWYgPSBzZWxlY3REcmNDb2VmZmljaWVudHMoaFVuaURyY0NvbmZpZywgTE9DQVRJT05fU0VMRUNURUQpOworICBpZiAocENvZWYgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgZm9yIChpID0gMDsgaSA8IGhVbmlEcmNDb25maWctPmRyY0luc3RydWN0aW9uc1VuaURyY0NvdW50OyBpKyspIHsKKyAgICBwSW5zdCA9ICYoaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjW2ldKTsKKyAgICBmb3IgKGQgPSAwOyBkIDwgcEluc3QtPmRvd25taXhJZENvdW50OyBkKyspIHsKKyAgICAgIGlmIChkb3dubWl4SWQgPT0gcEluc3QtPmRvd25taXhJZFtkXSkgeworICAgICAgICBmb3IgKGcgPSAwOyBnIDwgcEluc3QtPm5EcmNDaGFubmVsR3JvdXBzOyBnKyspIHsKKyAgICAgICAgICBzZXEgPSBwSW5zdC0+Z2FpblNldEluZGV4Rm9yQ2hhbm5lbEdyb3VwW2ddOworICAgICAgICAgIGlmIChwQ29lZi0+Z2FpblNldFtzZXFdLmJhbmRDb3VudCA+IDEpIHsKKyAgICAgICAgICAgIGlzTXVsdGliYW5kID0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gaXNNdWx0aWJhbmQ7Cit9CisKK0ZJWFBfREJMIGdldERvd25taXhPZmZzZXQoRE9XTk1JWF9JTlNUUlVDVElPTlMqIHBEb3duLCBpbnQgYmFzZUNoYW5uZWxDb3VudCkgeworICBGSVhQX0RCTCBkb3dubWl4T2Zmc2V0ID0gRkwyRlhDT05TVF9EQkwoMS4wZiAvICgxIDw8IDEpKTsgLyogZSA9IDEgKi8KKyAgaWYgKChwRG93bi0+YnNEb3dubWl4T2Zmc2V0ID09IDEpIHx8IChwRG93bi0+YnNEb3dubWl4T2Zmc2V0ID09IDIpKSB7CisgICAgaW50IGVfYSwgZV9kb3dubWl4T2Zmc2V0OworICAgIEZJWFBfREJMIGEsIHE7CisgICAgaWYgKGJhc2VDaGFubmVsQ291bnQgPD0gcERvd24tPnRhcmdldENoYW5uZWxDb3VudCkgcmV0dXJuIGRvd25taXhPZmZzZXQ7CisKKyAgICBxID0gZkRpdk5vcm0oKEZJWFBfREJMKXBEb3duLT50YXJnZXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgIChGSVhQX0RCTCliYXNlQ2hhbm5lbENvdW50KTsgLyogZSA9IDAgKi8KKyAgICBhID0gbGluMmRCKHEsIDAsICZlX2EpOworICAgIGlmIChwRG93bi0+YnNEb3dubWl4T2Zmc2V0ID09IDIpIHsKKyAgICAgIGVfYSArPSAxOyAvKiBhICo9IDIgKi8KKyAgICB9CisgICAgLyogYSA9IDAuNSAqIHJvdW5kIChhKSAqLworICAgIGEgPSBmaXhwX3JvdW5kKGEsIGVfYSkgPj4gMTsKKyAgICBkb3dubWl4T2Zmc2V0ID0gZEIybGluKGEsIGVfYSwgJmVfZG93bm1peE9mZnNldCk7CisgICAgZG93bm1peE9mZnNldCA9IHNjYWxlVmFsdWUoZG93bm1peE9mZnNldCwgZV9kb3dubWl4T2Zmc2V0IC0gMSk7CisgIH0KKyAgcmV0dXJuIGRvd25taXhPZmZzZXQ7Cit9CmRpZmYgLS1naXQgYS9saWJEUkNkZWMvc3JjL2RyY0RlY190b29scy5oIGIvbGliRFJDZGVjL3NyYy9kcmNEZWNfdG9vbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2EwYWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliRFJDZGVjL3NyYy9kcmNEZWNfdG9vbHMuaApAQCAtMCwwICsxLDE0NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHLUQgRFJDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIERSQ0RFQ19UT09MU19ICisjZGVmaW5lIERSQ0RFQ19UT09MU19ICisKKyNpbmNsdWRlICJkcmNEZWNfdHlwZXMuaCIKKyNpbmNsdWRlICJkcmNEZWNfc2VsZWN0aW9uUHJvY2Vzcy5oIgorCitpbnQgZ2V0RGVsdGFUbWluKGNvbnN0IGludCBzYW1wbGVSYXRlKTsKKworRFJDX0NPRUZGSUNJRU5UU19VTklfRFJDKiBzZWxlY3REcmNDb2VmZmljaWVudHMoCisgICAgSEFORExFX1VOSV9EUkNfQ09ORklHIGhVbmlEcmNDb25maWcsIGNvbnN0IGludCBsb2NhdGlvbik7CisKK0RSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogc2VsZWN0RHJjSW5zdHJ1Y3Rpb25zKAorICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLCBjb25zdCBpbnQgZHJjU2V0SWQpOworCitET1dOTUlYX0lOU1RSVUNUSU9OUyogc2VsZWN0RG93bm1peEluc3RydWN0aW9ucygKKyAgICBIQU5ETEVfVU5JX0RSQ19DT05GSUcgaFVuaURyY0NvbmZpZywgY29uc3QgaW50IGRvd25taXhJZCk7CisKK0RSQ19FUlJPUgorZGVyaXZlRHJjQ2hhbm5lbEdyb3VwcygKKyAgICBjb25zdCBpbnQgZHJjU2V0RWZmZWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluICovCisgICAgY29uc3QgaW50IGNoYW5uZWxDb3VudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiAqLworICAgIGNvbnN0IFNDSEFSKiBnYWluU2V0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gKi8KKyAgICBjb25zdCBEVUNLSU5HX01PRElGSUNBVElPTiogZHVja2luZ01vZGlmaWNhdGlvbkZvckNoYW5uZWwsIC8qIGluICovCisgICAgVUNIQVIqIG5EcmNDaGFubmVsR3JvdXBzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXQgKi8KKyAgICBTQ0hBUiogdW5pcXVlSW5kZXgsICAgICAvKiBvdXQgKGdhaW5TZXRJbmRleEZvckNoYW5uZWxHcm91cCkgKi8KKyAgICBTQ0hBUiogZ3JvdXBGb3JDaGFubmVsLCAvKiBvdXQgKi8KKyAgICBEVUNLSU5HX01PRElGSUNBVElPTiogZHVja2luZ01vZGlmaWNhdGlvbkZvckNoYW5uZWxHcm91cCk7IC8qIG91dCAqLworCitGSVhQX0RCTAorZEIybGluKGNvbnN0IEZJWFBfREJMIGRCX20sIGNvbnN0IGludCBkQl9lLCBpbnQqIHBMaW5fZSk7CisKK0ZJWFBfREJMCitsaW4yZEIoY29uc3QgRklYUF9EQkwgbGluX20sIGNvbnN0IGludCBsaW5fZSwgaW50KiBwRGJfZSk7CisKK0ZJWFBfREJMCithcHByb3hEYjJsaW4oY29uc3QgRklYUF9EQkwgZEJfbSwgY29uc3QgaW50IGRCX2UsIGludCogcExpbl9lKTsKKworaW50IGJpdHN0cmVhbUNvbnRhaW5zTXVsdGliYW5kRHJjKEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkb3dubWl4SWQpOworCitGSVhQX0RCTAorZ2V0RG93bm1peE9mZnNldChET1dOTUlYX0lOU1RSVUNUSU9OUyogcERvd24sIGludCBiYXNlQ2hhbm5lbENvdW50KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJEUkNkZWMvc3JjL2RyY0RlY190eXBlcy5oIGIvbGliRFJDZGVjL3NyYy9kcmNEZWNfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGMxN2YzCi0tLSAvZGV2L251bGwKKysrIGIvbGliRFJDZGVjL3NyYy9kcmNEZWNfdHlwZXMuaApAQCAtMCwwICsxLDQyOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHLUQgRFJDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIERSQ0RFQ19UWVBFU19ICisjZGVmaW5lIERSQ0RFQ19UWVBFU19ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKy8qIERhdGEgc3RydWN0dXJlcyBjb3JyZXNwb25kaW5nIHRvIHN0YXRpYyBhbmQgZHluYW1pYyBEUkMvTG91ZG5lc3MgcGF5bG9hZAorICAgYXMgZGVmaW5lZCBpbiBzZWN0aW9uIDcgb2YgTVBFRy1EIERSQyBzdGFuZGFyZCwgSVNPL0lFQyAyMzAwMy00ICovCisKKy8qKioqKioqKioqKioqKi8KKy8qIHVuaURyY0dhaW4gKi8KKy8qKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBGSVhQX1NHTCBnYWluRGI7IC8qIGUgPSA3ICovCisgIFNIT1JUIHRpbWU7Cit9IEdBSU5fTk9ERTsKKworLyogdW5pRHJjR2FpbkV4dGVuc2lvbigpIChUYWJsZSA1NikgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgdW5pRHJjR2FpbkV4dFR5cGVbOF07CisgIFVMT05HIGV4dEJpdFNpemVbOCAtIDFdOworfSBVTklfRFJDX0dBSU5fRVhURU5TSU9OOworCisvKiB1bmlEcmNHYWluKCkgKFRhYmxlIDU1KSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBuTm9kZXNbMTJdOyAvKiB1bnNhdHVyYXRlZCB2YWx1ZSwgaS5lLiBhcyBwcm92aWRlZCBpbiBiaXRzdHJlYW0gKi8KKyAgR0FJTl9OT0RFIGdhaW5Ob2RlWzEyXVsxNl07CisKKyAgVUNIQVIgdW5pRHJjR2FpbkV4dFByZXNlbnQ7CisgIFVOSV9EUkNfR0FJTl9FWFRFTlNJT04gdW5pRHJjR2FpbkV4dGVuc2lvbjsKK30gVU5JX0RSQ19HQUlOLCAqSEFORExFX1VOSV9EUkNfR0FJTjsKKworLyoqKioqKioqKioqKioqKiovCisvKiB1bmlEcmNDb25maWcgKi8KKy8qKioqKioqKioqKioqKioqLworCit0eXBlZGVmIGVudW0geworICBFQl9OSUdIVCA9IDB4MDAwMSwKKyAgRUJfTk9JU1kgPSAweDAwMDIsCisgIEVCX0xJTUlURUQgPSAweDAwMDQsCisgIEVCX0xPV0xFVkVMID0gMHgwMDA4LAorICBFQl9ESUFMT0cgPSAweDAwMTAsCisgIEVCX0dFTkVSQUxfQ09NUFIgPSAweDAwMjAsCisgIEVCX0VYUEFORCA9IDB4MDA0MCwKKyAgRUJfQVJUSVNUSUMgPSAweDAwODAsCisgIEVCX0NMSVBQSU5HID0gMHgwMTAwLAorICBFQl9GQURFID0gMHgwMjAwLAorICBFQl9EVUNLX09USEVSID0gMHgwNDAwLAorICBFQl9EVUNLX1NFTEYgPSAweDA4MDAKK30gRUZGRUNUX0JJVDsKKwordHlwZWRlZiBlbnVtIHsKKyAgR0NQX1JFR1VMQVIgPSAwLAorICBHQ1BfRkFESU5HID0gMSwKKyAgR0NQX0NMSVBQSU5HX0RVQ0tJTkcgPSAyLAorICBHQ1BfQ09OU1RBTlQgPSAzCit9IEdBSU5fQ09ESU5HX1BST0ZJTEU7CisKK3R5cGVkZWYgZW51bSB7IEdJVF9TUExJTkUgPSAwLCBHSVRfTElORUFSID0gMSB9IEdBSU5fSU5URVJQT0xBVElPTl9UWVBFOworCit0eXBlZGVmIGVudW0geyBDU19MRUZUID0gMCwgQ1NfUklHSFQgPSAxIH0gQ0hBUkFDVEVSSVNUSUNfU0lERTsKKwordHlwZWRlZiBlbnVtIHsgQ0ZfU0lHTU9JRCA9IDAsIENGX05PREVTID0gMSB9IENIQVJBQ1RFUklTVElDX0ZPUk1BVDsKKwordHlwZWRlZiBlbnVtIHsKKyAgR0ZfUU1GMzIgPSAweDEsCisgIEdGX1FNRkhZQlJJRDM5ID0gMHgyLAorICBHRl9RTUY2NCA9IDB4MywKKyAgR0ZfUU1GSFlCUklENzEgPSAweDQsCisgIEdGX1FNRjEyOCA9IDB4NSwKKyAgR0ZfUU1GSFlCUklEMTM1ID0gMHg2LAorICBHRl9VTklGT1JNID0gMHg3Cit9IEVRX1NVQkJBTkRfR0FJTl9GT1JNQVQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgZHVja2luZ1NjYWxpbmdQcmVzZW50OworICBGSVhQX1NHTCBkdWNraW5nU2NhbGluZzsgLyogZSA9IDIgKi8KK30gRFVDS0lOR19NT0RJRklDQVRJT047CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgdGFyZ2V0Q2hhcmFjdGVyaXN0aWNMZWZ0UHJlc2VudDsKKyAgVUNIQVIgdGFyZ2V0Q2hhcmFjdGVyaXN0aWNMZWZ0SW5kZXg7CisgIFVDSEFSIHRhcmdldENoYXJhY3RlcmlzdGljUmlnaHRQcmVzZW50OworICBVQ0hBUiB0YXJnZXRDaGFyYWN0ZXJpc3RpY1JpZ2h0SW5kZXg7CisgIFVDSEFSIGdhaW5TY2FsaW5nUHJlc2VudDsKKyAgRklYUF9TR0wgYXR0ZW51YXRpb25TY2FsaW5nOyAgIC8qIGUgPSAyICovCisgIEZJWFBfU0dMIGFtcGxpZmljYXRpb25TY2FsaW5nOyAvKiBlID0gMiAqLworICBVQ0hBUiBnYWluT2Zmc2V0UHJlc2VudDsKKyAgRklYUF9TR0wgZ2Fpbk9mZnNldDsgLyogZSA9IDQgKi8KK30gR0FJTl9NT0RJRklDQVRJT047CisKK3R5cGVkZWYgdW5pb24geworICBVQ0hBUiBjcm9zc292ZXJGcmVxSW5kZXg7CisgIFVTSE9SVCBzdGFydFN1YkJhbmRJbmRleDsKK30gQkFORF9CT1JERVI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgbGVmdDsKKyAgVUNIQVIgcmlnaHQ7Cit9IENVU1RPTV9JTkRFWDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBwcmVzZW50OworICBVQ0hBUiBpc0NJQ1A7CisgIHVuaW9uIHsKKyAgICBVQ0hBUiBjaWNwSW5kZXg7CisgICAgQ1VTVE9NX0lOREVYIGN1c3RvbTsKKyAgfTsKK30gRFJDX0NIQVJBQ1RFUklTVElDOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIGdhaW5Db2RpbmdQcm9maWxlOworICBVQ0hBUiBnYWluSW50ZXJwb2xhdGlvblR5cGU7CisgIFVDSEFSIGZ1bGxGcmFtZTsKKyAgVUNIQVIgdGltZUFsaWdubWVudDsKKyAgVUNIQVIgdGltZURlbHRhTWluUHJlc2VudDsKKyAgVVNIT1JUIHRpbWVEZWx0YU1pbjsKKyAgVUNIQVIgYmFuZENvdW50OworICBVQ0hBUiBkcmNCYW5kVHlwZTsKKyAgVUNIQVIgZ2FpblNlcXVlbmNlSW5kZXhbNF07CisgIERSQ19DSEFSQUNURVJJU1RJQyBkcmNDaGFyYWN0ZXJpc3RpY1s0XTsKKyAgQkFORF9CT1JERVIgYmFuZEJvcmRlcls0XTsKK30gR0FJTl9TRVQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgRklYUF9TR0wgZ2FpbjsgICAgLyogZSA9IDYgKi8KKyAgRklYUF9TR0wgaW9SYXRpbzsgLyogZSA9IDIgKi8KKyAgRklYUF9TR0wgZXhwOyAgICAgLyogZSA9IDUgKi8KKyAgVUNIQVIgZmxpcFNpZ247Cit9IENVU1RPTV9EUkNfQ0hBUl9TSUdNT0lEOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIGNoYXJhY3RlcmlzdGljTm9kZUNvdW50OworICBGSVhQX1NHTCBub2RlTGV2ZWxbNCArIDFdOyAvKiBlID0gNyAqLworICBGSVhQX1NHTCBub2RlR2Fpbls0ICsgMV07ICAvKiBlID0gNyAqLworfSBDVVNUT01fRFJDX0NIQVJfTk9ERVM7CisKK3R5cGVkZWYgc2hvdWxkQmVVbmlvbiB7CisgIENVU1RPTV9EUkNfQ0hBUl9TSUdNT0lEIHNpZ21vaWQ7CisgIENVU1RPTV9EUkNfQ0hBUl9OT0RFUyBub2RlczsKK30KK0NVU1RPTV9EUkNfQ0hBUjsKKworLyogZHJjQ29lZmZpY2llbnRzVW5pRHJjKCkgKFRhYmxlIDY3KSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBkcmNMb2NhdGlvbjsKKyAgVUNIQVIgZHJjRnJhbWVTaXplUHJlc2VudDsKKyAgVVNIT1JUIGRyY0ZyYW1lU2l6ZTsKKyAgVUNIQVIgY2hhcmFjdGVyaXN0aWNMZWZ0Q291bnQ7CisgIFVDSEFSIGNoYXJhY3RlcmlzdGljTGVmdEZvcm1hdFs4XTsKKyAgQ1VTVE9NX0RSQ19DSEFSIGN1c3RvbUNoYXJhY3RlcmlzdGljTGVmdFs4XTsKKyAgVUNIQVIgY2hhcmFjdGVyaXN0aWNSaWdodENvdW50OworICBVQ0hBUiBjaGFyYWN0ZXJpc3RpY1JpZ2h0Rm9ybWF0WzhdOworICBDVVNUT01fRFJDX0NIQVIgY3VzdG9tQ2hhcmFjdGVyaXN0aWNSaWdodFs4XTsKKyAgVUNIQVIKKyAgZ2FpblNlcXVlbmNlQ291bnQ7ICAvKiB1bnNhdHVyYXRlZCB2YWx1ZSwgaS5lLiBhcyBwcm92aWRlZCBpbiBiaXRzdHJlYW0gKi8KKyAgVUNIQVIgZ2FpblNldENvdW50OyAvKiBzYXR1cmF0ZWQgdG8gMTIgKi8KKyAgR0FJTl9TRVQgZ2FpblNldFsxMl07CisgIC8qIGRlcml2ZWQgZGF0YSAqLworICBVQ0hBUiBnYWluU2V0SW5kZXhGb3JHYWluU2VxdWVuY2VbMTJdOworfSBEUkNfQ09FRkZJQ0lFTlRTX1VOSV9EUkM7CisKKy8qIGRyY0luc3RydWN0aW9uc1VuaURyYygpIChUYWJsZSA3MikgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgU0NIQVIgZHJjU2V0SWQ7CisgIFVDSEFSIGRyY1NldENvbXBsZXhpdHlMZXZlbDsKKyAgVUNIQVIgZHJjTG9jYXRpb247CisgIFVDSEFSIGRyY0FwcGx5VG9Eb3dubWl4OworICBVQ0hBUiBkb3dubWl4SWRDb3VudDsKKyAgVUNIQVIgZG93bm1peElkWzhdOworICBVU0hPUlQgZHJjU2V0RWZmZWN0OworICBVQ0hBUiBsaW1pdGVyUGVha1RhcmdldFByZXNlbnQ7CisgIEZJWFBfU0dMIGxpbWl0ZXJQZWFrVGFyZ2V0OyAvKiBlID0gNSAqLworICBVQ0hBUiBkcmNTZXRUYXJnZXRMb3VkbmVzc1ByZXNlbnQ7CisgIFNDSEFSIGRyY1NldFRhcmdldExvdWRuZXNzVmFsdWVVcHBlcjsKKyAgU0NIQVIgZHJjU2V0VGFyZ2V0TG91ZG5lc3NWYWx1ZUxvd2VyOworICBVQ0hBUiBkZXBlbmRzT25EcmNTZXRQcmVzZW50OworICB1bmlvbiB7CisgICAgU0NIQVIgZGVwZW5kc09uRHJjU2V0OworICAgIFVDSEFSIG5vSW5kZXBlbmRlbnRVc2U7CisgIH07CisgIFVDSEFSIHJlcXVpcmVzRXE7CisgIHNob3VsZEJlVW5pb24geworICAgIEdBSU5fTU9ESUZJQ0FUSU9OIGdhaW5Nb2RpZmljYXRpb25Gb3JDaGFubmVsR3JvdXBbOF1bNF07CisgICAgRFVDS0lOR19NT0RJRklDQVRJT04gZHVja2luZ01vZGlmaWNhdGlvbkZvckNoYW5uZWxbOF07CisgIH07CisgIFNDSEFSIGdhaW5TZXRJbmRleFs4XTsKKworICAvKiBkZXJpdmVkIGRhdGEgKi8KKyAgVUNIQVIgZHJjQ2hhbm5lbENvdW50OworICBVQ0hBUiBuRHJjQ2hhbm5lbEdyb3VwczsKKyAgU0NIQVIgZ2FpblNldEluZGV4Rm9yQ2hhbm5lbEdyb3VwWzhdOworfSBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkM7CisKKy8qIGNoYW5uZWxMYXlvdXQoKSAoVGFibGUgNjIpICovCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIGJhc2VDaGFubmVsQ291bnQ7CisgIFVDSEFSIGxheW91dFNpZ25hbGluZ1ByZXNlbnQ7CisgIFVDSEFSIGRlZmluZWRMYXlvdXQ7CisgIFVDSEFSIHNwZWFrZXJQb3NpdGlvbls4XTsKK30gQ0hBTk5FTF9MQVlPVVQ7CisKKy8qIGRvd25taXhJbnN0cnVjdGlvbnMoKSAoVGFibGUgNjMpICovCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIGRvd25taXhJZDsKKyAgVUNIQVIgdGFyZ2V0Q2hhbm5lbENvdW50OworICBVQ0hBUiB0YXJnZXRMYXlvdXQ7CisgIFVDSEFSIGRvd25taXhDb2VmZmljaWVudHNQcmVzZW50OworICBVQ0hBUiBic0Rvd25taXhPZmZzZXQ7CisgIEZJWFBfREJMIGRvd25taXhDb2VmZmljaWVudFs4ICogOF07IC8qIGUgPSAyICovCit9IERPV05NSVhfSU5TVFJVQ1RJT05TOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIHVuaURyY0NvbmZpZ0V4dFR5cGVbOF07CisgIFVMT05HIGV4dEJpdFNpemVbOCAtIDFdOworfSBVTklfRFJDX0NPTkZJR19FWFRFTlNJT047CisKKy8qIHVuaURyY0NvbmZpZygpIChUYWJsZSA1NykgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgc2FtcGxlUmF0ZVByZXNlbnQ7CisgIFVMT05HIHNhbXBsZVJhdGU7CisgIFVDSEFSIGRvd25taXhJbnN0cnVjdGlvbnNDb3VudFYwOworICBVQ0hBUiBkb3dubWl4SW5zdHJ1Y3Rpb25zQ291bnRWMTsKKyAgVUNIQVIgZG93bm1peEluc3RydWN0aW9uc0NvdW50OyAvKiBzYXR1cmF0ZWQgdG8gNiAqLworICBVQ0hBUiBkcmNDb2VmZmljaWVudHNVbmlEcmNDb3VudFYwOworICBVQ0hBUiBkcmNDb2VmZmljaWVudHNVbmlEcmNDb3VudFYxOworICBVQ0hBUiBkcmNDb2VmZmljaWVudHNVbmlEcmNDb3VudDsgLyogc2F0dXJhdGVkIHRvIDIgKi8KKyAgVUNIQVIgZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnRWMDsKKyAgVUNIQVIgZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnRWMTsKKyAgVUNIQVIgZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnQ7IC8qIHNhdHVyYXRlZCB0byAoMTIgKyAxICsgNikgKi8KKyAgQ0hBTk5FTF9MQVlPVVQgY2hhbm5lbExheW91dDsKKyAgRE9XTk1JWF9JTlNUUlVDVElPTlMgZG93bm1peEluc3RydWN0aW9uc1s2XTsKKyAgRFJDX0NPRUZGSUNJRU5UU19VTklfRFJDIGRyY0NvZWZmaWNpZW50c1VuaURyY1syXTsKKyAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDIGRyY0luc3RydWN0aW9uc1VuaURyY1soMTIgKyAxICsgNildOworICBVQ0hBUiB1bmlEcmNDb25maWdFeHRQcmVzZW50OworICBVTklfRFJDX0NPTkZJR19FWFRFTlNJT04gdW5pRHJjQ29uZmlnRXh0OworCisgIC8qIGRlcml2ZWQgZGF0YSAqLworICBVQ0hBUiBkcmNJbnN0cnVjdGlvbnNDb3VudEluY2xWaXJ0dWFsOworICBVQ0hBUiBkaWZmOworfSBVTklfRFJDX0NPTkZJRywgKkhBTkRMRV9VTklfRFJDX0NPTkZJRzsKKworLyoqKioqKioqKioqKioqKioqKiovCisvKiBsb3VkbmVzc0luZm9TZXQgKi8KKy8qKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIGVudW0geworICBNRF9VTktOT1dOX09USEVSID0gMCwKKyAgTURfUFJPR1JBTV9MT1VETkVTUyA9IDEsCisgIE1EX0FOQ0hPUl9MT1VETkVTUyA9IDIsCisgIE1EX01BWF9PRl9MT1VETkVTU19SQU5HRSA9IDMsCisgIE1EX01PTUVOVEFSWV9MT1VETkVTU19NQVggPSA0LAorICBNRF9TSE9SVF9URVJNX0xPVURORVNTX01BWCA9IDUsCisgIE1EX0xPVURORVNTX1JBTkdFID0gNiwKKyAgTURfTUlYSU5HX0xFVkVMID0gNywKKyAgTURfUk9PTV9UWVBFID0gOCwKKyAgTURfU0hPUlRfVEVSTV9MT1VETkVTUyA9IDkKK30gTUVUSE9EX0RFRklOSVRJT047CisKK3R5cGVkZWYgZW51bSB7CisgIE1TX1VOS05PV05fT1RIRVIgPSAwLAorICBNU19FQlVfUl8xMjggPSAxLAorICBNU19CU18xNzcwXzQgPSAyLAorICBNU19CU18xNzcwXzRfUFJFX1BST0NFU1NJTkcgPSAzLAorICBNU19VU0VSID0gNCwKKyAgTVNfRVhQRVJUX1BBTkVMID0gNSwKKyAgTVNfQlNfMTc3MV8xID0gNiwKKyAgTVNfUkVTRVJWRURfQSA9IDcsCisgIE1TX1JFU0VSVkVEX0IgPSA4LAorICBNU19SRVNFUlZFRF9DID0gOSwKKyAgTVNfUkVTRVJWRURfRCA9IDEwLAorICBNU19SRVNFUlZFRF9FID0gMTEKK30gTUVBU1VSRU1FTlRfU1lTVEVNOworCit0eXBlZGVmIGVudW0geworICBSX1VLTk9XTiA9IDAsCisgIFJfVU5WRVJJRklFRCA9IDEsCisgIFJfQ0VJTElORyA9IDIsCisgIFJfQUNDVVJBVEUgPSAzCit9IFJFTElBQklMSVRZOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIG1ldGhvZERlZmluaXRpb247CisgIEZJWFBfREJMIG1ldGhvZFZhbHVlOyAvKiBlID0gNyBmb3IgYWxsIG1ldGhvZERlZmluaXRpb25zICovCisgIFVDSEFSIG1lYXN1cmVtZW50U3lzdGVtOworICBVQ0hBUiByZWxpYWJpbGl0eTsKK30gTE9VRE5FU1NfTUVBU1VSRU1FTlQ7CisKKy8qIGxvdWRuZXNzSW5mbygpIChUYWJsZSA1OSkgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgU0NIQVIgZHJjU2V0SWQ7CisgIFVDSEFSIGVxU2V0SWQ7CisgIFVDSEFSIGRvd25taXhJZDsKKyAgVUNIQVIgc2FtcGxlUGVha0xldmVsUHJlc2VudDsKKyAgRklYUF9EQkwgc2FtcGxlUGVha0xldmVsOyAvKiBlID0gNyAqLworICBVQ0hBUiB0cnVlUGVha0xldmVsUHJlc2VudDsKKyAgRklYUF9EQkwgdHJ1ZVBlYWtMZXZlbDsgLyogZSA9IDcgKi8KKyAgVUNIQVIgdHJ1ZVBlYWtMZXZlbE1lYXN1cmVtZW50U3lzdGVtOworICBVQ0hBUiB0cnVlUGVha0xldmVsUmVsaWFiaWxpdHk7CisgIFVDSEFSIG1lYXN1cmVtZW50Q291bnQ7IC8qIHNhdHVyYXRlZCB0byA4ICovCisgIExPVURORVNTX01FQVNVUkVNRU5UIGxvdWRuZXNzTWVhc3VyZW1lbnRbOF07Cit9IExPVURORVNTX0lORk87CisKKy8qIGxvdWRuZXNzSW5mb1NldEV4dGVuc2lvbigpIChUYWJsZSA2MSkgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgbG91ZG5lc3NJbmZvU2V0RXh0VHlwZVs4XTsKKyAgVUxPTkcgZXh0Qml0U2l6ZVs4IC0gMV07Cit9IExPVURORVNTX0lORk9fU0VUX0VYVEVOU0lPTjsKKworLyogbG91ZG5lc3NJbmZvU2V0KCkgKFRhYmxlIDU4KSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBsb3VkbmVzc0luZm9BbGJ1bUNvdW50VjA7CisgIFVDSEFSIGxvdWRuZXNzSW5mb0FsYnVtQ291bnRWMTsKKyAgVUNIQVIgbG91ZG5lc3NJbmZvQWxidW1Db3VudDsgLyogc2F0dXJhdGVkIHRvIDEyICovCisgIFVDSEFSIGxvdWRuZXNzSW5mb0NvdW50VjA7CisgIFVDSEFSIGxvdWRuZXNzSW5mb0NvdW50VjE7CisgIFVDSEFSIGxvdWRuZXNzSW5mb0NvdW50OyAvKiBzYXR1cmF0ZWQgdG8gMTIgKi8KKyAgTE9VRE5FU1NfSU5GTyBsb3VkbmVzc0luZm9BbGJ1bVsxMl07CisgIExPVURORVNTX0lORk8gbG91ZG5lc3NJbmZvWzEyXTsKKyAgVUNIQVIgbG91ZG5lc3NJbmZvU2V0RXh0UHJlc2VudDsKKyAgTE9VRE5FU1NfSU5GT19TRVRfRVhURU5TSU9OIGxvdWRuZXNzSW5mb1NldEV4dDsKKyAgLyogZGVyaXZlZCBkYXRhICovCisgIFVDSEFSIGRpZmY7Cit9IExPVURORVNTX0lORk9fU0VULCAqSEFORExFX0xPVURORVNTX0lORk9fU0VUOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYkRSQ2RlYy9zcmMvZHJjRGVjb2Rlci5oIGIvbGliRFJDZGVjL3NyYy9kcmNEZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyNmE3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYkRSQ2RlYy9zcmMvZHJjRGVjb2Rlci5oCkBAIC0wLDAgKzEsMTQyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUctRCBEUkMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRFJDREVDT0RFUl9ICisjZGVmaW5lIERSQ0RFQ09ERVJfSAorCisvKiBkcmNEZWNvZGVyLmg6IGRlZmluaXRpb25zIHVzZWQgaW4gYWxsIHN1Ym1vZHVsZXMgKi8KKworI2RlZmluZSBNQVhfQUNUSVZFX0RSQ1MgMworCit0eXBlZGVmIGVudW0geyBETV9SRUdVTEFSX0RFTEFZID0gMCwgRE1fTE9XX0RFTEFZID0gMSB9IERFTEFZX01PREU7CisKK3R5cGVkZWYgZW51bSB7CisgIERFX09LID0gMCwKKyAgREVfTk9UX09LID0gLTEwMCwKKyAgREVfUEFSQU1fT1VUX09GX1JBTkdFLAorICBERV9QQVJBTV9JTlZBTElELAorICBERV9NRU1PUllfRVJST1IKK30gRFJDX0VSUk9SOworCit0eXBlZGVmIGVudW0geyBTRE1fT0ZGLCBTRE1fUU1GNjQsIFNETV9RTUY3MSwgU0RNX1NURlQyNTYgfSBTVUJCQU5EX0RPTUFJTl9NT0RFOworCisjZGVmaW5lIERPV05NSVhfSURfQkFTRV9MQVlPVVQgMHgwCisjZGVmaW5lIERPV05NSVhfSURfQU5ZX0RPV05NSVggMHg3RgorI2RlZmluZSBEUkNfU0VUX0lEX05PX0RSQyAweDAKKyNkZWZpbmUgRFJDX1NFVF9JRF9BTllfRFJDIDB4M0YKKworI2RlZmluZSBMT0NBVElPTl9NUDRfSU5TVFJFQU1fVU5JRFJDIDB4MQorI2RlZmluZSBMT0NBVElPTl9NUDRfRFlOX1JBTkdFX0lORk8gMHgyCisjZGVmaW5lIExPQ0FUSU9OX01QNF9DT01QUkVTU0lPTl9WQUxVRSAweDMKKyNkZWZpbmUgTE9DQVRJT05fU0VMRUNURUQgXAorICBMT0NBVElPTl9NUDRfSU5TVFJFQU1fVU5JRFJDIC8qIHNldCB0byBsb2NhdGlvbiBzZWxlY3RlZCBieSBzeXN0ZW0gKi8KKworI2RlZmluZSBNQVhfUkVRVUVTVFNfRE9XTk1JWF9JRCAxNQorI2RlZmluZSBNQVhfUkVRVUVTVFNfRFJDX0ZFQVRVUkUgNworI2RlZmluZSBNQVhfUkVRVUVTVFNfRFJDX0VGRkVDVF9UWVBFIDE1CisKKyNkZWZpbmUgREVGQVVMVF9MT1VETkVTU19ERVZJQVRJT05fTUFYIDYzCisKKyNkZWZpbmUgRFJDX0lOUFVUX0xPVURORVNTX1RBUkdFVCBGTDJGWENPTlNUX0RCTCgtMzEuMGYgLyAoZmxvYXQpKDEgPDwgNykpCisjZGVmaW5lIERSQ19JTlBVVF9MT1VETkVTU19UQVJHRVRfU0dMIEZMMkZYQ09OU1RfU0dMKC0zMS4wZiAvIChmbG9hdCkoMSA8PCA3KSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJEUkNkZWMvc3JjL2RyY0dhaW5EZWNfaW5pdC5jcHAgYi9saWJEUkNkZWMvc3JjL2RyY0dhaW5EZWNfaW5pdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmMzI0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYkRSQ2RlYy9zcmMvZHJjR2FpbkRlY19pbml0LmNwcApAQCAtMCwwICsxLDM0NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHLUQgRFJDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZHJjRGVjX3R5cGVzLmgiCisjaW5jbHVkZSAiZHJjRGVjX3Rvb2xzLmgiCisjaW5jbHVkZSAiZHJjRGVjX2dhaW5EZWNvZGVyLmgiCisjaW5jbHVkZSAiZHJjR2FpbkRlY19pbml0LmgiCisKK3N0YXRpYyBEUkNfRVJST1IgX2dlbmVyYXRlRHJjSW5zdHJ1Y3Rpb25zRGVyaXZlZERhdGEoCisgICAgSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLAorICAgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcEluc3QsIERSQ19DT0VGRklDSUVOVFNfVU5JX0RSQyogcENvZWYsCisgICAgQUNUSVZFX0RSQyogcEFjdGl2ZURyYykgeworICBEUkNfRVJST1IgZXJyID0gREVfT0s7CisgIGludCBnOworICBpbnQgZ2FpbkVsZW1lbnRDb3VudCA9IDA7CisgIFVDSEFSIG5EcmNDaGFubmVsR3JvdXBzID0gMDsKKyAgU0NIQVIgZ2FpblNldEluZGV4Rm9yQ2hhbm5lbEdyb3VwWzhdOworCisgIGVyciA9IGRlcml2ZURyY0NoYW5uZWxHcm91cHMoCisgICAgICBwSW5zdC0+ZHJjU2V0RWZmZWN0LCBwSW5zdC0+ZHJjQ2hhbm5lbENvdW50LCBwSW5zdC0+Z2FpblNldEluZGV4LAorICAgICAgcEluc3QtPmRyY1NldEVmZmVjdCAmIChFQl9EVUNLX09USEVSIHwgRUJfRFVDS19TRUxGKQorICAgICAgICAgID8gcEluc3QtPmR1Y2tpbmdNb2RpZmljYXRpb25Gb3JDaGFubmVsCisgICAgICAgICAgOiBOVUxMLAorICAgICAgJm5EcmNDaGFubmVsR3JvdXBzLCBnYWluU2V0SW5kZXhGb3JDaGFubmVsR3JvdXAsCisgICAgICBwQWN0aXZlRHJjLT5jaGFubmVsR3JvdXBGb3JDaGFubmVsLAorICAgICAgcEluc3QtPmRyY1NldEVmZmVjdCAmIChFQl9EVUNLX09USEVSIHwgRUJfRFVDS19TRUxGKQorICAgICAgICAgID8gcEFjdGl2ZURyYy0+ZHVja2luZ01vZGlmaWNhdGlvbkZvckNoYW5uZWxHcm91cAorICAgICAgICAgIDogTlVMTCk7CisgIGlmIChlcnIpIHJldHVybiAoZXJyKTsKKworICAvKiBzYW5pdHkgY2hlY2sgKi8KKyAgaWYgKG5EcmNDaGFubmVsR3JvdXBzICE9IHBJbnN0LT5uRHJjQ2hhbm5lbEdyb3VwcykgcmV0dXJuIERFX05PVF9PSzsKKyAgZm9yIChnID0gMDsgZyA8IHBJbnN0LT5uRHJjQ2hhbm5lbEdyb3VwczsgZysrKSB7CisgICAgaWYgKGdhaW5TZXRJbmRleEZvckNoYW5uZWxHcm91cFtnXSAhPSBwSW5zdC0+Z2FpblNldEluZGV4Rm9yQ2hhbm5lbEdyb3VwW2ddKQorICAgICAgcmV0dXJuIERFX05PVF9PSzsKKyAgfQorCisgIGZvciAoZyA9IDA7IGcgPCBwSW5zdC0+bkRyY0NoYW5uZWxHcm91cHM7IGcrKykgeworICAgIGludCBzZXEgPSBwSW5zdC0+Z2FpblNldEluZGV4Rm9yQ2hhbm5lbEdyb3VwW2ddOworICAgIGlmIChzZXEgIT0gLTEgJiYgKGhVbmlEcmNDb25maWctPmRyY0NvZWZmaWNpZW50c1VuaURyY0NvdW50ID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzZXEgPj0gcENvZWYtPmdhaW5TZXRDb3VudCkpIHsKKyAgICAgIHBBY3RpdmVEcmMtPmNoYW5uZWxHcm91cElzUGFyYW1ldHJpY0RyY1tnXSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHBBY3RpdmVEcmMtPmNoYW5uZWxHcm91cElzUGFyYW1ldHJpY0RyY1tnXSA9IDA7CisgICAgICBpZiAoc2VxID49IHBDb2VmLT5nYWluU2V0Q291bnQpIHsKKyAgICAgICAgcmV0dXJuIERFX05PVF9PSzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBnYWluRWxlbWVudENvdW50ICovCisgIGlmIChwSW5zdC0+ZHJjU2V0RWZmZWN0ICYgKEVCX0RVQ0tfT1RIRVIgfCBFQl9EVUNLX1NFTEYpKSB7CisgICAgZm9yIChnID0gMDsgZyA8IHBJbnN0LT5uRHJjQ2hhbm5lbEdyb3VwczsgZysrKSB7CisgICAgICBwQWN0aXZlRHJjLT5iYW5kQ291bnRGb3JDaGFubmVsR3JvdXBbZ10gPSAxOworICAgIH0KKyAgICBwQWN0aXZlRHJjLT5nYWluRWxlbWVudENvdW50ID0KKyAgICAgICAgcEluc3QtPm5EcmNDaGFubmVsR3JvdXBzOyAvKiBvbmUgZ2FpbiBlbGVtZW50IHBlciBjaGFubmVsIGdyb3VwICovCisgIH0gZWxzZSB7CisgICAgZm9yIChnID0gMDsgZyA8IHBJbnN0LT5uRHJjQ2hhbm5lbEdyb3VwczsgZysrKSB7CisgICAgICBpZiAocEFjdGl2ZURyYy0+Y2hhbm5lbEdyb3VwSXNQYXJhbWV0cmljRHJjW2ddKSB7CisgICAgICAgIGdhaW5FbGVtZW50Q291bnQrKzsKKyAgICAgICAgcEFjdGl2ZURyYy0+YmFuZENvdW50Rm9yQ2hhbm5lbEdyb3VwW2ddID0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBzZXEsIGJhbmRDb3VudDsKKyAgICAgICAgc2VxID0gcEluc3QtPmdhaW5TZXRJbmRleEZvckNoYW5uZWxHcm91cFtnXTsKKyAgICAgICAgYmFuZENvdW50ID0gcENvZWYtPmdhaW5TZXRbc2VxXS5iYW5kQ291bnQ7CisgICAgICAgIHBBY3RpdmVEcmMtPmJhbmRDb3VudEZvckNoYW5uZWxHcm91cFtnXSA9IGJhbmRDb3VudDsKKyAgICAgICAgZ2FpbkVsZW1lbnRDb3VudCArPSBiYW5kQ291bnQ7CisgICAgICB9CisgICAgfQorICAgIHBBY3RpdmVEcmMtPmdhaW5FbGVtZW50Q291bnQgPSBnYWluRWxlbWVudENvdW50OworICB9CisKKyAgLyogcHJlcGFyZSBnYWluRWxlbWVudEZvckdyb3VwIChjdW11bGF0ZWQgc3VtIG9mIGJhbmRDb3VudEZvckNoYW5uZWxHcm91cCkgKi8KKyAgcEFjdGl2ZURyYy0+Z2FpbkVsZW1lbnRGb3JHcm91cFswXSA9IDA7CisgIGZvciAoZyA9IDE7IGcgPCBwSW5zdC0+bkRyY0NoYW5uZWxHcm91cHM7IGcrKykgeworICAgIHBBY3RpdmVEcmMtPmdhaW5FbGVtZW50Rm9yR3JvdXBbZ10gPQorICAgICAgICBwQWN0aXZlRHJjLT5nYWluRWxlbWVudEZvckdyb3VwW2cgLSAxXSArCisgICAgICAgIHBBY3RpdmVEcmMtPmJhbmRDb3VudEZvckNoYW5uZWxHcm91cFtnIC0gMV07IC8qIGluZGV4IG9mIGZpcnN0IGdhaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UgaW4gY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCAqLworICB9CisKKyAgcmV0dXJuIERFX09LOworfQorCitEUkNfRVJST1IKK2luaXRHYWluRGVjKEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjLCBjb25zdCBpbnQgZnJhbWVTaXplLAorICAgICAgICAgICAgY29uc3QgaW50IHNhbXBsZVJhdGUpIHsKKyAgaW50IGksIGosIGs7CisKKyAgaWYgKGZyYW1lU2l6ZSA8IDEpIHsKKyAgICByZXR1cm4gREVfTk9UX09LOworICB9CisKKyAgaEdhaW5EZWMtPmZyYW1lU2l6ZSA9IGZyYW1lU2l6ZTsKKworICBpZiAoaEdhaW5EZWMtPmZyYW1lU2l6ZSAqIDEwMDAgPCBzYW1wbGVSYXRlKSB7CisgICAgcmV0dXJuIERFX05PVF9PSzsKKyAgfQorCisgIGhHYWluRGVjLT5kZWx0YVRtaW5EZWZhdWx0ID0gZ2V0RGVsdGFUbWluKHNhbXBsZVJhdGUpOworICBpZiAoaEdhaW5EZWMtPmRlbHRhVG1pbkRlZmF1bHQgPiBoR2FpbkRlYy0+ZnJhbWVTaXplKSB7CisgICAgcmV0dXJuIERFX05PVF9PSzsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBNQVhfQUNUSVZFX0RSQ1M7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKyAgICAgIC8qIHVzZSBzdGFydHVwIG5vZGUgYXQgdGhlIGJlZ2lubmluZyAqLworICAgICAgaEdhaW5EZWMtPmFjdGl2ZURyY1tpXS5sbmJJbmRleEZvckNoYW5uZWxbal1bMF0gPSAwOworICAgICAgZm9yIChrID0gMTsgayA8IE5VTV9MTkJfRlJBTUVTOyBrKyspIHsKKyAgICAgICAgaEdhaW5EZWMtPmFjdGl2ZURyY1tpXS5sbmJJbmRleEZvckNoYW5uZWxbal1ba10gPSAtMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisgICAgaEdhaW5EZWMtPmNoYW5uZWxHYWluW2pdID0gRkwyRlhDT05TVF9EQkwoMS4wZiAvIChmbG9hdCkoMSA8PCA4KSk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgNCAqIDEwMjQgLyAyNTY7IGkrKykgeworICAgIGhHYWluRGVjLT5kdW1teVN1YmJhbmRHYWluc1tpXSA9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgNykpOworICB9CisKKyAgaEdhaW5EZWMtPnN0YXR1cyA9IDA7IC8qIHN0YXJ0dXAgKi8KKworICByZXR1cm4gREVfT0s7Cit9CisKK3ZvaWQgaW5pdERyY0dhaW5CdWZmZXJzKGNvbnN0IGludCBmcmFtZVNpemUsIERSQ19HQUlOX0JVRkZFUlMqIGRyY0dhaW5CdWZmZXJzKSB7CisgIGludCBpLCBjLCBqOworICAvKiBwcmVwYXJlIDEyIGluc3RhbmNlcyBvZiBub2RlIGJ1ZmZlcnMgKi8KKyAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgTlVNX0xOQl9GUkFNRVM7IGorKykgeworICAgICAgZHJjR2FpbkJ1ZmZlcnMtPmxpbmVhck5vZGVCdWZmZXJbaV0ubk5vZGVzW2pdID0gMTsKKyAgICAgIGRyY0dhaW5CdWZmZXJzLT5saW5lYXJOb2RlQnVmZmVyW2ldLmxpbmVhck5vZGVbal1bMF0uZ2FpbkxpbiA9CisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMS4wZiAvIChmbG9hdCkoMSA8PCA3KSk7CisgICAgICBpZiAoaiA9PSAwKSB7CisgICAgICAgIGRyY0dhaW5CdWZmZXJzLT5saW5lYXJOb2RlQnVmZmVyW2ldLmxpbmVhck5vZGVbal1bMF0udGltZSA9CisgICAgICAgICAgICAwOyAvKiBpbml0aWFsaXplIGxhc3Qgbm9kZSB3aXRoIHN0YXJ0dXAgbm9kZSAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZHJjR2FpbkJ1ZmZlcnMtPmxpbmVhck5vZGVCdWZmZXJbaV0ubGluZWFyTm9kZVtqXVswXS50aW1lID0KKyAgICAgICAgICAgIGZyYW1lU2l6ZSAtIDE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogcHJlcGFyZSBkdW1teUxuYiwgYSBsaW5lYXJOb2RlQnVmZmVyIGNvbnRhaW5pbmcgYSBjb25zdGFudCBnYWluIG9mIDAgZEIsCisgICAqIGZvciB0aGUgIm5vIERSQyBwcm9jZXNzaW5nIiBjYXNlICovCisgIGRyY0dhaW5CdWZmZXJzLT5kdW1teUxuYi5nYWluSW50ZXJwb2xhdGlvblR5cGUgPSBHSVRfTElORUFSOworICBmb3IgKGkgPSAwOyBpIDwgTlVNX0xOQl9GUkFNRVM7IGkrKykgeworICAgIGRyY0dhaW5CdWZmZXJzLT5kdW1teUxuYi5uTm9kZXNbaV0gPSAxOworICAgIGRyY0dhaW5CdWZmZXJzLT5kdW1teUxuYi5saW5lYXJOb2RlW2ldWzBdLmdhaW5MaW4gPQorICAgICAgICBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKGZsb2F0KSgxIDw8IDcpKTsKKyAgICBkcmNHYWluQnVmZmVycy0+ZHVtbXlMbmIubGluZWFyTm9kZVtpXVswXS50aW1lID0gZnJhbWVTaXplIC0gMTsKKyAgfQorCisgIC8qIHByZXBhcmUgY2hhbm5lbEdhaW4gZGVsYXkgbGluZSAqLworICBmb3IgKGMgPSAwOyBjIDwgODsgYysrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9MTkJfRlJBTUVTOyBpKyspIHsKKyAgICAgIGRyY0dhaW5CdWZmZXJzLT5jaGFubmVsR2FpbltjXVtpXSA9CisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMS4wZiAvIChmbG9hdCkoMSA8PCA4KSk7CisgICAgfQorICB9CisKKyAgZHJjR2FpbkJ1ZmZlcnMtPmxuYlBvaW50ZXIgPSAwOworfQorCitEUkNfRVJST1IKK2luaXRBY3RpdmVEcmMoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsCisgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLCBjb25zdCBpbnQgZHJjU2V0SWRTZWxlY3RlZCwKKyAgICAgICAgICAgICAgY29uc3QgaW50IGRvd25taXhJZFNlbGVjdGVkKSB7CisgIGludCBnLCBpc011bHRpYmFuZCA9IDA7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwSW5zdCA9IE5VTEw7CisgIERSQ19DT0VGRklDSUVOVFNfVU5JX0RSQyogcENvZWYgPSBOVUxMOworCisgIHBJbnN0ID0gc2VsZWN0RHJjSW5zdHJ1Y3Rpb25zKGhVbmlEcmNDb25maWcsIGRyY1NldElkU2VsZWN0ZWQpOworICBpZiAocEluc3QgPT0gTlVMTCkgeworICAgIHJldHVybiBERV9OT1RfT0s7CisgIH0KKworICBpZiAocEluc3QtPmRyY1NldElkID49IDApIHsKKyAgICBwQ29lZiA9IHNlbGVjdERyY0NvZWZmaWNpZW50cyhoVW5pRHJjQ29uZmlnLCBwSW5zdC0+ZHJjTG9jYXRpb24pOworICAgIGlmIChwQ29lZiA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gREVfTk9UX09LOworICAgIH0KKworICAgIGlmIChwQ29lZi0+ZHJjRnJhbWVTaXplUHJlc2VudCkgeworICAgICAgaWYgKHBDb2VmLT5kcmNGcmFtZVNpemUgIT0gaEdhaW5EZWMtPmZyYW1lU2l6ZSkgeworICAgICAgICByZXR1cm4gREVfTk9UX09LOworICAgICAgfQorICAgIH0KKworICAgIGVyciA9IF9nZW5lcmF0ZURyY0luc3RydWN0aW9uc0Rlcml2ZWREYXRhKAorICAgICAgICBoR2FpbkRlYywgaFVuaURyY0NvbmZpZywgcEluc3QsIHBDb2VmLAorICAgICAgICAmKGhHYWluRGVjLT5hY3RpdmVEcmNbaEdhaW5EZWMtPm5BY3RpdmVEcmNzXSkpOworICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgIH0KKworICBoR2FpbkRlYy0+YWN0aXZlRHJjW2hHYWluRGVjLT5uQWN0aXZlRHJjc10ucEluc3QgPSBwSW5zdDsKKyAgaEdhaW5EZWMtPmFjdGl2ZURyY1toR2FpbkRlYy0+bkFjdGl2ZURyY3NdLnBDb2VmID0gcENvZWY7CisKKyAgZm9yIChnID0gMDsgZyA8IHBJbnN0LT5uRHJjQ2hhbm5lbEdyb3VwczsgZysrKSB7CisgICAgaWYgKGhHYWluRGVjLT5hY3RpdmVEcmNbaEdhaW5EZWMtPm5BY3RpdmVEcmNzXS5iYW5kQ291bnRGb3JDaGFubmVsR3JvdXBbZ10gPgorICAgICAgICAxKSB7CisgICAgICBpZiAoaEdhaW5EZWMtPm11bHRpQmFuZEFjdGl2ZURyY0luZGV4ICE9IC0xKSB7CisgICAgICAgIHJldHVybiBERV9OT1RfT0s7CisgICAgICB9CisgICAgICBpc011bHRpYmFuZCA9IDE7CisgICAgfQorICB9CisKKyAgaWYgKGlzTXVsdGliYW5kKSB7CisgICAgLyogS2VlcCBhY3RpdmVEcmMgaW5kZXggb2YgbXVsdGliYW5kIERSQyBzZXQgKi8KKyAgICBoR2FpbkRlYy0+bXVsdGlCYW5kQWN0aXZlRHJjSW5kZXggPSBoR2FpbkRlYy0+bkFjdGl2ZURyY3M7CisgIH0KKworICBpZiAoKGhHYWluRGVjLT5jaGFubmVsR2FpbkFjdGl2ZURyY0luZGV4ID09IC0xKSAmJgorICAgICAgKGRvd25taXhJZFNlbGVjdGVkID09IERPV05NSVhfSURfQkFTRV9MQVlPVVQpICYmCisgICAgICAoaFVuaURyY0NvbmZpZy0+ZHJjSW5zdHJ1Y3Rpb25zVW5pRHJjQ291bnQgPgorICAgICAgIDApKSB7IC8qIHVzZSB0aGlzIGFjdGl2ZURyYyB0byBhcHBseSBjaGFubmVsR2FpbnMgKi8KKyAgICBoR2FpbkRlYy0+Y2hhbm5lbEdhaW5BY3RpdmVEcmNJbmRleCA9IGhHYWluRGVjLT5uQWN0aXZlRHJjczsKKyAgfQorCisgIGhHYWluRGVjLT5uQWN0aXZlRHJjcysrOworICBpZiAoaEdhaW5EZWMtPm5BY3RpdmVEcmNzID4gTUFYX0FDVElWRV9EUkNTKSByZXR1cm4gREVfTk9UX09LOworCisgIHJldHVybiBERV9PSzsKK30KKworRFJDX0VSUk9SCitpbml0QWN0aXZlRHJjT2Zmc2V0KEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjKSB7CisgIGludCBhLCBhY2NHYWluRWxlbWVudENvdW50OworCisgIGFjY0dhaW5FbGVtZW50Q291bnQgPSAwOworICBmb3IgKGEgPSAwOyBhIDwgaEdhaW5EZWMtPm5BY3RpdmVEcmNzOyBhKyspIHsKKyAgICBoR2FpbkRlYy0+YWN0aXZlRHJjW2FdLmFjdGl2ZURyY09mZnNldCA9IGFjY0dhaW5FbGVtZW50Q291bnQ7CisgICAgYWNjR2FpbkVsZW1lbnRDb3VudCArPSBoR2FpbkRlYy0+YWN0aXZlRHJjW2FdLmdhaW5FbGVtZW50Q291bnQ7CisgIH0KKworICBpZiAoYWNjR2FpbkVsZW1lbnRDb3VudCA+IDEyKSByZXR1cm4gREVfTk9UX09LOworCisgIHJldHVybiBERV9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYkRSQ2RlYy9zcmMvZHJjR2FpbkRlY19pbml0LmggYi9saWJEUkNkZWMvc3JjL2RyY0dhaW5EZWNfaW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMTViYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJEUkNkZWMvc3JjL2RyY0dhaW5EZWNfaW5pdC5oCkBAIC0wLDAgKzEsMTIwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUctRCBEUkMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRFJDR0FJTkRFQ19JTklUX0gKKyNkZWZpbmUgRFJDR0FJTkRFQ19JTklUX0gKKworRFJDX0VSUk9SCitpbml0R2FpbkRlYyhIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywgY29uc3QgaW50IGZyYW1lU2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IGludCBzYW1wbGVSYXRlKTsKKwordm9pZCBpbml0RHJjR2FpbkJ1ZmZlcnMoY29uc3QgaW50IGZyYW1lU2l6ZSwgRFJDX0dBSU5fQlVGRkVSUyogZHJjR2FpbkJ1ZmZlcnMpOworCitEUkNfRVJST1IKK2luaXRBY3RpdmVEcmMoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsCisgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0NPTkZJRyBoVW5pRHJjQ29uZmlnLCBjb25zdCBpbnQgZHJjU2V0SWRTZWxlY3RlZCwKKyAgICAgICAgICAgICAgY29uc3QgaW50IGRvd25taXhJZFNlbGVjdGVkKTsKKworRFJDX0VSUk9SCitpbml0QWN0aXZlRHJjT2Zmc2V0KEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJEUkNkZWMvc3JjL2RyY0dhaW5EZWNfcHJlcHJvY2Vzcy5jcHAgYi9saWJEUkNkZWMvc3JjL2RyY0dhaW5EZWNfcHJlcHJvY2Vzcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkxOTU4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYkRSQ2RlYy9zcmMvZHJjR2FpbkRlY19wcmVwcm9jZXNzLmNwcApAQCAtMCwwICsxLDcxNCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHLUQgRFJDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZHJjRGVjX3R5cGVzLmgiCisjaW5jbHVkZSAiZHJjRGVjX2dhaW5EZWNvZGVyLmgiCisjaW5jbHVkZSAiZHJjR2FpbkRlY19wcmVwcm9jZXNzLmgiCisjaW5jbHVkZSAiZHJjRGVjX3Rvb2xzLmgiCisjaW5jbHVkZSAiRkRLX21hdHJpeENhbGxvYy5oIgorI2luY2x1ZGUgImRyY0RlY19yb20uaCIKKworI2RlZmluZSBTTE9QRV9GQUNUT1JfREJfVE9fTElORUFSIFwKKyAgRkwyRlhDT05TVF9EQkwoMC4xMTUxZiAqIChmbG9hdCkoMSA8PCAzKSkgLyogbG4oMTApIC8gMjAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgZHJjU2V0RWZmZWN0OworICBEVUNLSU5HX01PRElGSUNBVElPTiogcERNb2Q7CisgIEdBSU5fTU9ESUZJQ0FUSU9OKiBwR01vZDsKKyAgaW50IGRyY0NoYXJhY3RlcmlzdGljUHJlc2VudDsKKyAgQ0hBUkFDVEVSSVNUSUNfRk9STUFUIGNoYXJhY3RlcmlzdGljRm9ybWF0U291cmNlWzJdOworICBjb25zdCBDVVNUT01fRFJDX0NIQVIqIHBDQ2hhclNvdXJjZVsyXTsKKyAgQ0hBUkFDVEVSSVNUSUNfRk9STUFUIGNoYXJhY3RlcmlzdGljRm9ybWF0VGFyZ2V0WzJdOworICBjb25zdCBDVVNUT01fRFJDX0NIQVIqIHBDQ2hhclRhcmdldFsyXTsKKyAgaW50IHNsb3BlSXNOZWdhdGl2ZTsKKyAgaW50IGxpbWl0ZXJQZWFrVGFyZ2V0UHJlc2VudDsKKyAgRklYUF9TR0wgbGltaXRlclBlYWtUYXJnZXQ7CisgIEZJWFBfREJMIGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYjsKKyAgRklYUF9TR0wgY29tcHJlc3M7CisgIEZJWFBfU0dMIGJvb3N0OworfSBOT0RFX01PRElGSUNBVElPTjsKKworc3RhdGljIERSQ19FUlJPUiBfZ2V0Q2ljcENoYXJhY3RlcmlzdGljKAorICAgIGNvbnN0IGludCBjaWNwQ2hhcmFjdGVyaXN0aWMsCisgICAgQ0hBUkFDVEVSSVNUSUNfRk9STUFUIHBDaGFyYWN0ZXJpc3RpY0Zvcm1hdFsyXSwKKyAgICBjb25zdCBDVVNUT01fRFJDX0NIQVIqIHBDQ2hhclNvdXJjZVsyXSkgeworICBpZiAoKGNpY3BDaGFyYWN0ZXJpc3RpYyA8IDEpIHx8IChjaWNwQ2hhcmFjdGVyaXN0aWMgPiAxMSkpIHsKKyAgICByZXR1cm4gREVfTk9UX09LOworICB9CisKKyAgaWYgKGNpY3BDaGFyYWN0ZXJpc3RpYyA8IDcpIHsgLyogc2lnbW9pZCBjaGFyYWN0ZXJpc3RpYyAqLworICAgIHBDaGFyYWN0ZXJpc3RpY0Zvcm1hdFtDU19MRUZUXSA9IENGX1NJR01PSUQ7CisgICAgcENDaGFyU291cmNlW0NTX0xFRlRdID0KKyAgICAgICAgKGNvbnN0IENVU1RPTV9EUkNfQ0hBUiopKCZjaWNwRHJjQ2hhclNpZ21vaWRMZWZ0W2NpY3BDaGFyYWN0ZXJpc3RpYyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxXSk7CisgICAgcENoYXJhY3RlcmlzdGljRm9ybWF0W0NTX1JJR0hUXSA9IENGX1NJR01PSUQ7CisgICAgcENDaGFyU291cmNlW0NTX1JJR0hUXSA9CisgICAgICAgIChjb25zdCBDVVNUT01fRFJDX0NIQVIqKSgmY2ljcERyY0NoYXJTaWdtb2lkUmlnaHRbY2ljcENoYXJhY3RlcmlzdGljIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxXSk7CisgIH0gZWxzZSB7IC8qIG5vZGVzIGNoYXJhY3RlcmlzdGljICovCisgICAgcENoYXJhY3RlcmlzdGljRm9ybWF0W0NTX0xFRlRdID0gQ0ZfTk9ERVM7CisgICAgcENDaGFyU291cmNlW0NTX0xFRlRdID0KKyAgICAgICAgKGNvbnN0IENVU1RPTV9EUkNfQ0hBUiopKCZjaWNwRHJjQ2hhck5vZGVzTGVmdFtjaWNwQ2hhcmFjdGVyaXN0aWMgLSA3XSk7CisgICAgcENoYXJhY3RlcmlzdGljRm9ybWF0W0NTX1JJR0hUXSA9IENGX05PREVTOworICAgIHBDQ2hhclNvdXJjZVtDU19SSUdIVF0gPQorICAgICAgICAoY29uc3QgQ1VTVE9NX0RSQ19DSEFSKikoJmNpY3BEcmNDaGFyTm9kZXNSaWdodFtjaWNwQ2hhcmFjdGVyaXN0aWMgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3XSk7CisgIH0KKyAgcmV0dXJuIERFX09LOworfQorCitzdGF0aWMgaW50IF9nZXRTaWduKEZJWFBfU0dMIGluKSB7CisgIGlmIChpbiA+IChGSVhQX0RCTCkwKSByZXR1cm4gMTsKKyAgaWYgKGluIDwgKEZJWFBfREJMKTApIHJldHVybiAtMTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBEUkNfRVJST1IgX2dldFNsb3BlU2lnbihjb25zdCBDSEFSQUNURVJJU1RJQ19GT1JNQVQgZHJjQ2hhckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDVVNUT01fRFJDX0NIQVIqIHBDQ2hhciwgaW50KiBwU2xvcGVTaWduKSB7CisgIGlmIChkcmNDaGFyRm9ybWF0ID09IENGX1NJR01PSUQpIHsKKyAgICAqcFNsb3BlU2lnbiA9IChwQ0NoYXItPnNpZ21vaWQuZmxpcFNpZ24gPyAxIDogLTEpOworICB9IGVsc2UgeworICAgIGludCBrLCBzbG9wZVNpZ24gPSAwLCB0bXBfc2xvcGVTaWduOworICAgIGZvciAoayA9IDA7IGsgPCBwQ0NoYXItPm5vZGVzLmNoYXJhY3RlcmlzdGljTm9kZUNvdW50OyBrKyspIHsKKyAgICAgIGlmIChwQ0NoYXItPm5vZGVzLm5vZGVMZXZlbFtrICsgMV0gPiBwQ0NoYXItPm5vZGVzLm5vZGVMZXZlbFtrXSkgeworICAgICAgICB0bXBfc2xvcGVTaWduID0KKyAgICAgICAgICAgIF9nZXRTaWduKHBDQ2hhci0+bm9kZXMubm9kZUdhaW5bayArIDFdIC0gcENDaGFyLT5ub2Rlcy5ub2RlR2FpbltrXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0bXBfc2xvcGVTaWduID0gLV9nZXRTaWduKHBDQ2hhci0+bm9kZXMubm9kZUdhaW5bayArIDFdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ0NoYXItPm5vZGVzLm5vZGVHYWluW2tdKTsKKyAgICAgIH0KKyAgICAgIGlmICgoc2xvcGVTaWduIHx8IHRtcF9zbG9wZVNpZ24pICYmIChzbG9wZVNpZ24gPT0gLXRtcF9zbG9wZVNpZ24pKQorICAgICAgICByZXR1cm4gREVfTk9UX09LOyAvKiBEUkMgY2hhcmFjdGVyaXN0aWMgaXMgbm90IGludmVydGlibGUgKi8KKyAgICAgIGVsc2UKKyAgICAgICAgc2xvcGVTaWduID0gdG1wX3Nsb3BlU2lnbjsKKyAgICB9CisgICAgKnBTbG9wZVNpZ24gPSBzbG9wZVNpZ247CisgIH0KKyAgcmV0dXJuIERFX09LOworfQorCitzdGF0aWMgRFJDX0VSUk9SIF9pc1Nsb3BlTmVnYXRpdmUoY29uc3QgQ0hBUkFDVEVSSVNUSUNfRk9STUFUIGRyY0NoYXJGb3JtYXRbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1VTVE9NX0RSQ19DSEFSKiBwQ0NoYXJbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwU2xvcGVJc05lZ2F0aXZlKSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgaW50IHNsb3BlU2lnblsyXSA9IHswLCAwfTsKKworICBlcnIgPSBfZ2V0U2xvcGVTaWduKGRyY0NoYXJGb3JtYXRbQ1NfTEVGVF0sIHBDQ2hhcltDU19MRUZUXSwKKyAgICAgICAgICAgICAgICAgICAgICAmc2xvcGVTaWduW0NTX0xFRlRdKTsKKyAgaWYgKGVycikgcmV0dXJuIGVycjsKKworICBlcnIgPSBfZ2V0U2xvcGVTaWduKGRyY0NoYXJGb3JtYXRbQ1NfUklHSFRdLCBwQ0NoYXJbQ1NfUklHSFRdLAorICAgICAgICAgICAgICAgICAgICAgICZzbG9wZVNpZ25bQ1NfUklHSFRdKTsKKyAgaWYgKGVycikgcmV0dXJuIGVycjsKKworICBpZiAoKHNsb3BlU2lnbltDU19MRUZUXSB8fCBzbG9wZVNpZ25bQ1NfUklHSFRdKSAmJgorICAgICAgKHNsb3BlU2lnbltDU19MRUZUXSA9PSAtc2xvcGVTaWduW0NTX1JJR0hUXSkpCisgICAgcmV0dXJuIERFX05PVF9PSzsgLyogRFJDIGNoYXJhY3RlcmlzdGljIGlzIG5vdCBpbnZlcnRpYmxlICovCisKKyAgKnBTbG9wZUlzTmVnYXRpdmUgPSAoc2xvcGVTaWduW0NTX0xFRlRdIDwgMCk7CisgIHJldHVybiBERV9PSzsKK30KKworc3RhdGljIERSQ19FUlJPUiBfcHJlcGFyZURyY0NoYXJhY3RlcmlzdGljKGNvbnN0IERSQ19DSEFSQUNURVJJU1RJQyogcERDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSQ19DT0VGRklDSUVOVFNfVU5JX0RSQyogcENvZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9ERV9NT0RJRklDQVRJT04qIHBOb2RlTW9kKSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgcE5vZGVNb2QtPmRyY0NoYXJhY3RlcmlzdGljUHJlc2VudCA9IHBEQ2hhci0+cHJlc2VudDsKKyAgaWYgKHBOb2RlTW9kLT5kcmNDaGFyYWN0ZXJpc3RpY1ByZXNlbnQpIHsKKyAgICBpZiAocERDaGFyLT5pc0NJQ1AgPT0gMSkgeworICAgICAgZXJyID0gX2dldENpY3BDaGFyYWN0ZXJpc3RpYyhwRENoYXItPmNpY3BJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGVNb2QtPmNoYXJhY3RlcmlzdGljRm9ybWF0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZU1vZC0+cENDaGFyU291cmNlKTsKKyAgICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgICAgfSBlbHNlIHsKKyAgICAgIHBOb2RlTW9kLT5jaGFyYWN0ZXJpc3RpY0Zvcm1hdFNvdXJjZVtDU19MRUZUXSA9CisgICAgICAgICAgKENIQVJBQ1RFUklTVElDX0ZPUk1BVCkKKyAgICAgICAgICAgICAgcENvZWYtPmNoYXJhY3RlcmlzdGljTGVmdEZvcm1hdFtwRENoYXItPmN1c3RvbS5sZWZ0XTsKKyAgICAgIHBOb2RlTW9kLT5wQ0NoYXJTb3VyY2VbQ1NfTEVGVF0gPQorICAgICAgICAgICYocENvZWYtPmN1c3RvbUNoYXJhY3RlcmlzdGljTGVmdFtwRENoYXItPmN1c3RvbS5sZWZ0XSk7CisgICAgICBwTm9kZU1vZC0+Y2hhcmFjdGVyaXN0aWNGb3JtYXRTb3VyY2VbQ1NfUklHSFRdID0KKyAgICAgICAgICAoQ0hBUkFDVEVSSVNUSUNfRk9STUFUKQorICAgICAgICAgICAgICBwQ29lZi0+Y2hhcmFjdGVyaXN0aWNSaWdodEZvcm1hdFtwRENoYXItPmN1c3RvbS5yaWdodF07CisgICAgICBwTm9kZU1vZC0+cENDaGFyU291cmNlW0NTX1JJR0hUXSA9CisgICAgICAgICAgJihwQ29lZi0+Y3VzdG9tQ2hhcmFjdGVyaXN0aWNSaWdodFtwRENoYXItPmN1c3RvbS5yaWdodF0pOworICAgIH0KKyAgICBlcnIgPSBfaXNTbG9wZU5lZ2F0aXZlKHBOb2RlTW9kLT5jaGFyYWN0ZXJpc3RpY0Zvcm1hdFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlTW9kLT5wQ0NoYXJTb3VyY2UsICZwTm9kZU1vZC0+c2xvcGVJc05lZ2F0aXZlKTsKKyAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworCisgICAgaWYgKHBOb2RlTW9kLT5wR01vZCAhPSBOVUxMKSB7CisgICAgICBpZiAocE5vZGVNb2QtPnBHTW9kW2JdLnRhcmdldENoYXJhY3RlcmlzdGljTGVmdFByZXNlbnQpIHsKKyAgICAgICAgcE5vZGVNb2QtPmNoYXJhY3RlcmlzdGljRm9ybWF0VGFyZ2V0W0NTX0xFRlRdID0KKyAgICAgICAgICAgIChDSEFSQUNURVJJU1RJQ19GT1JNQVQpcENvZWYtPmNoYXJhY3RlcmlzdGljTGVmdEZvcm1hdAorICAgICAgICAgICAgICAgIFtwTm9kZU1vZC0+cEdNb2RbYl0udGFyZ2V0Q2hhcmFjdGVyaXN0aWNMZWZ0SW5kZXhdOworICAgICAgICBwTm9kZU1vZC0+cENDaGFyVGFyZ2V0W0NTX0xFRlRdID0KKyAgICAgICAgICAgICYocENvZWYtPmN1c3RvbUNoYXJhY3RlcmlzdGljTGVmdAorICAgICAgICAgICAgICAgICAgW3BOb2RlTW9kLT5wR01vZFtiXS50YXJnZXRDaGFyYWN0ZXJpc3RpY0xlZnRJbmRleF0pOworICAgICAgfQorICAgICAgaWYgKHBOb2RlTW9kLT5wR01vZFtiXS50YXJnZXRDaGFyYWN0ZXJpc3RpY1JpZ2h0UHJlc2VudCkgeworICAgICAgICBwTm9kZU1vZC0+Y2hhcmFjdGVyaXN0aWNGb3JtYXRUYXJnZXRbQ1NfUklHSFRdID0KKyAgICAgICAgICAgIChDSEFSQUNURVJJU1RJQ19GT1JNQVQpcENvZWYtPmNoYXJhY3RlcmlzdGljUmlnaHRGb3JtYXQKKyAgICAgICAgICAgICAgICBbcE5vZGVNb2QtPnBHTW9kW2JdLnRhcmdldENoYXJhY3RlcmlzdGljUmlnaHRJbmRleF07CisgICAgICAgIHBOb2RlTW9kLT5wQ0NoYXJUYXJnZXRbQ1NfUklHSFRdID0KKyAgICAgICAgICAgICYocENvZWYtPmN1c3RvbUNoYXJhY3RlcmlzdGljUmlnaHQKKyAgICAgICAgICAgICAgICAgIFtwTm9kZU1vZC0+cEdNb2RbYl0udGFyZ2V0Q2hhcmFjdGVyaXN0aWNSaWdodEluZGV4XSk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBERV9PSzsKK30KKworc3RhdGljIERSQ19FUlJPUiBfY29tcHJlc3NvcklPX3NpZ21vaWRfY29tbW9uKAorICAgIGNvbnN0IEZJWFBfREJMIHRtcCwgICAgICAgICAgICAgICAvKiBlID0gNyAqLworICAgIGNvbnN0IEZJWFBfREJMIGdhaW5EYkxpbWl0LCAgICAgICAvKiBlID0gNiAqLworICAgIGNvbnN0IEZJWFBfREJMIGV4cCwgICAgICAgICAgICAgICAvKiBlID0gNSAqLworICAgIGNvbnN0IGludCBpbnZlcnNlLCBGSVhQX0RCTCogb3V0KSAvKiBlID0gNyAqLworeworICBGSVhQX0RCTCB4LCB0bXAxLCB0bXAyLCBpbnZFeHAsIGRlbm9tOworICBpbnQgZV94LCBlX3RtcDEsIGVfdG1wMiwgZV9pbnZFeHAsIGVfZGVub20sIGVfb3V0OworCisgIGlmIChleHAgPCBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKGZsb2F0KSgxIDw8IDUpKSkgeworICAgIHJldHVybiBERV9OT1RfT0s7CisgIH0KKworICAvKiB4ID0gdG1wIC8gZ2FpbkRiTGltaXQ7ICovCisgIHggPSBmRGl2Tm9ybVNpZ25lZCh0bXAsIGdhaW5EYkxpbWl0LCAmZV94KTsKKyAgZV94ICs9IDcgLSA2OworICBpZiAoeCA8IChGSVhQX0RCTCkwKSB7CisgICAgcmV0dXJuIERFX05PVF9PSzsKKyAgfQorCisgIC8qIG91dCA9IHRtcCAvIHBvdygxLjBmICsvLSBwb3coeCwgZXhwKSwgMS4wZi9leHApOyAqLworICB0bXAxID0gZlBvdyh4LCBlX3gsIGV4cCwgNSwgJmVfdG1wMSk7CisgIGlmIChpbnZlcnNlKSB0bXAxID0gLXRtcDE7CisgIHRtcDIgPSBmQWRkTm9ybShGTDJGWENPTlNUX0RCTCgxLjBmIC8gKGZsb2F0KSgxIDw8IDEpKSwgMSwgdG1wMSwgZV90bXAxLAorICAgICAgICAgICAgICAgICAgJmVfdG1wMik7CisgIGludkV4cCA9IGZEaXZOb3JtKEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgMSkpLCBleHAsICZlX2ludkV4cCk7CisgIGVfaW52RXhwICs9IDEgLSA1OworICBkZW5vbSA9IGZQb3codG1wMiwgZV90bXAyLCBpbnZFeHAsIGVfaW52RXhwLCAmZV9kZW5vbSk7CisgICpvdXQgPSBmRGl2Tm9ybVNpZ25lZCh0bXAsIGRlbm9tLCAmZV9vdXQpOworICBlX291dCArPSA3IC0gZV9kZW5vbTsKKyAgKm91dCA9IHNjYWxlVmFsdWVTYXR1cmF0ZSgqb3V0LCBlX291dCAtIDcpOworICByZXR1cm4gREVfT0s7Cit9CisKK3N0YXRpYyBEUkNfRVJST1IgX2NvbXByZXNzb3JJT19zaWdtb2lkKGNvbnN0IENVU1RPTV9EUkNfQ0hBUl9TSUdNT0lEKiBwQ0NoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBpbkxldmVsRGIsIC8qIGUgPSA3ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogb3V0R2FpbkRiKSAgICAgIC8qIGUgPSA3ICovCit7CisgIEZJWFBfREJMIHRtcDsKKyAgRklYUF9TR0wgZXhwID0gcENDaGFyLT5leHA7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKworICB0bXAgPSBmTXVsdERpdjIoRFJDX0lOUFVUX0xPVURORVNTX1RBUkdFVCAtIGluTGV2ZWxEYiwgcENDaGFyLT5pb1JhdGlvKTsKKyAgdG1wID0gU0FUVVJBVEVfTEVGVF9TSElGVCh0bXAsIDIgKyAxLCBERlJBQ1RfQklUUyk7CisgIGlmIChleHAgPCAoRklYUF9TR0wpTUFYVkFMX1NHTCkgeworICAgIC8qIHggPSB0bXAgLyBnYWluRGJMaW1pdDsgKi8KKyAgICAvKiAqb3V0R2FpbkRiID0gdG1wIC8gcG93KDEuMGYgKyBwb3coeCwgZXhwKSwgMS4wZi9leHApOyAqLworICAgIGVyciA9IF9jb21wcmVzc29ySU9fc2lnbW9pZF9jb21tb24odG1wLCBGWF9TR0wyRlhfREJMKHBDQ2hhci0+Z2FpbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TR0wyRlhfREJMKGV4cCksIDAsIG91dEdhaW5EYik7CisgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgfSBlbHNlIHsKKyAgICAqb3V0R2FpbkRiID0KKyAgICAgICAgdG1wOyAvKiBzY2FsaW5nIG9mIG91dEdhaW5EYiAoNykgaXMgZXF1YWwgdG8gc2NhbGluZyBvZiB0bXAgKDcpICovCisgIH0KKyAgaWYgKHBDQ2hhci0+ZmxpcFNpZ24gPT0gMSkgeworICAgICpvdXRHYWluRGIgPSAtKm91dEdhaW5EYjsKKyAgfQorICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgRFJDX0VSUk9SIF9jb21wcmVzc29ySU9fc2lnbW9pZF9pbnZlcnNlKAorICAgIGNvbnN0IENVU1RPTV9EUkNfQ0hBUl9TSUdNT0lEKiBwQ0NoYXIsIGNvbnN0IEZJWFBfU0dMIGdhaW5EYiwKKyAgICBGSVhQX0RCTCogaW5MZXYpIHsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworICBGSVhQX1NHTCBpb1JhdGlvID0gcENDaGFyLT5pb1JhdGlvOworICBGSVhQX1NHTCBleHAgPSBwQ0NoYXItPmV4cDsKKyAgRklYUF9EQkwgdG1wID0gRlhfU0dMMkZYX0RCTChnYWluRGIpLCB0bXBfb3V0OworICBpbnQgZV9vdXQ7CisKKyAgaWYgKHBDQ2hhci0+ZmxpcFNpZ24gPT0gMSkgeworICAgIHRtcCA9IC10bXA7CisgIH0KKyAgaWYgKGV4cCA8IChGSVhQX1NHTClNQVhWQUxfU0dMKSB7CisgICAgLyogeCA9IHRtcCAvIGdhaW5EYkxpbWl0OyAqLworICAgIC8qIHRtcCA9IHRtcCAvIHBvdygxLjBmIC0gcG93KHgsIGV4cCksIDEuMGYgLyBleHApOyAqLworICAgIGVyciA9IF9jb21wcmVzc29ySU9fc2lnbW9pZF9jb21tb24odG1wLCBGWF9TR0wyRlhfREJMKHBDQ2hhci0+Z2FpbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TR0wyRlhfREJMKGV4cCksIDEsICZ0bXApOworICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgIH0KKyAgaWYgKGlvUmF0aW8gPT0gKEZJWFBfU0dMKTApIHsKKyAgICByZXR1cm4gREVfTk9UX09LOworICB9CisgIHRtcF9vdXQgPSBmRGl2Tm9ybVNpZ25lZCh0bXAsIEZYX1NHTDJGWF9EQkwoaW9SYXRpbyksICZlX291dCk7CisgIGVfb3V0ICs9IDcgLSAyOworICB0bXBfb3V0ID0gZkFkZE5vcm0oRFJDX0lOUFVUX0xPVURORVNTX1RBUkdFVCwgNywgLXRtcF9vdXQsIGVfb3V0LCAmZV9vdXQpOworICAqaW5MZXYgPSBzY2FsZVZhbHVlU2F0dXJhdGUodG1wX291dCwgZV9vdXQgLSA3KTsKKworICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgRFJDX0VSUk9SIF9jb21wcmVzc29ySU9fbm9kZXMoY29uc3QgQ1VTVE9NX0RSQ19DSEFSX05PREVTKiBwQ0NoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgaW5MZXZlbERiLCAvKiBlID0gNyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiBvdXRHYWluRGIpICAgICAgLyogZSA9IDcgKi8KK3sKKyAgaW50IG47CisgIEZJWFBfREJMIHc7CisgIGNvbnN0IEZJWFBfU0dMKiBub2RlTGV2ZWwgPSBwQ0NoYXItPm5vZGVMZXZlbDsKKyAgY29uc3QgRklYUF9TR0wqIG5vZGVHYWluID0gcENDaGFyLT5ub2RlR2FpbjsKKworICBpZiAoaW5MZXZlbERiIDwgRFJDX0lOUFVUX0xPVURORVNTX1RBUkdFVCkgeworICAgIGZvciAobiA9IDA7IG4gPCBwQ0NoYXItPmNoYXJhY3RlcmlzdGljTm9kZUNvdW50OyBuKyspIHsKKyAgICAgIGlmICgoaW5MZXZlbERiIDw9IEZYX1NHTDJGWF9EQkwobm9kZUxldmVsW25dKSkgJiYKKyAgICAgICAgICAoaW5MZXZlbERiID4gRlhfU0dMMkZYX0RCTChub2RlTGV2ZWxbbiArIDFdKSkpIHsKKyAgICAgICAgdyA9IGZEaXZOb3JtKGluTGV2ZWxEYiAtIEZYX1NHTDJGWF9EQkwobm9kZUxldmVsW24gKyAxXSksCisgICAgICAgICAgICAgICAgICAgICBGWF9TR0wyRlhfREJMKG5vZGVMZXZlbFtuXSAtIG5vZGVMZXZlbFtuICsgMV0pKTsKKyAgICAgICAgKm91dEdhaW5EYiA9IGZNdWx0KHcsIG5vZGVHYWluW25dKSArCisgICAgICAgICAgICAgICAgICAgICBmTXVsdCgoRklYUF9EQkwpTUFYVkFMX0RCTCAtIHcsIG5vZGVHYWluW24gKyAxXSk7CisgICAgICAgIC8qICpvdXRHYWluRGIgPSAodyAqIG5vZGVHYWluW25dICsgKDEuMC13KSAqIG5vZGVHYWluW24rMV0pOyAqLworICAgICAgICByZXR1cm4gREVfT0s7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAobiA9IDA7IG4gPCBwQ0NoYXItPmNoYXJhY3RlcmlzdGljTm9kZUNvdW50OyBuKyspIHsKKyAgICAgIGlmICgoaW5MZXZlbERiID49IEZYX1NHTDJGWF9EQkwobm9kZUxldmVsW25dKSkgJiYKKyAgICAgICAgICAoaW5MZXZlbERiIDwgRlhfU0dMMkZYX0RCTChub2RlTGV2ZWxbbiArIDFdKSkpIHsKKyAgICAgICAgdyA9IGZEaXZOb3JtKEZYX1NHTDJGWF9EQkwobm9kZUxldmVsW24gKyAxXSkgLSBpbkxldmVsRGIsCisgICAgICAgICAgICAgICAgICAgICBGWF9TR0wyRlhfREJMKG5vZGVMZXZlbFtuICsgMV0gLSBub2RlTGV2ZWxbbl0pKTsKKyAgICAgICAgKm91dEdhaW5EYiA9IGZNdWx0KHcsIG5vZGVHYWluW25dKSArCisgICAgICAgICAgICAgICAgICAgICBmTXVsdCgoRklYUF9EQkwpTUFYVkFMX0RCTCAtIHcsIG5vZGVHYWluW24gKyAxXSk7CisgICAgICAgIC8qICpvdXRHYWluRGIgPSAodyAqIG5vZGVHYWluW25dICsgKDEuMC13KSAqIG5vZGVHYWluW24rMV0pOyAqLworICAgICAgICByZXR1cm4gREVfT0s7CisgICAgICB9CisgICAgfQorICB9CisgICpvdXRHYWluRGIgPSBGWF9TR0wyRlhfREJMKG5vZGVHYWluW3BDQ2hhci0+Y2hhcmFjdGVyaXN0aWNOb2RlQ291bnRdKTsKKyAgcmV0dXJuIERFX09LOworfQorCitzdGF0aWMgRFJDX0VSUk9SIF9jb21wcmVzc29ySU9fbm9kZXNfaW52ZXJzZSgKKyAgICBjb25zdCBDVVNUT01fRFJDX0NIQVJfTk9ERVMqIHBDQ2hhciwgY29uc3QgRklYUF9TR0wgZ2FpbkRiLCAvKiBlID0gNyAqLworICAgIEZJWFBfREJMKiBpbkxldikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGUgPSA3ICovCit7CisgIGludCBuOworICBpbnQgazsKKyAgRklYUF9EQkwgdzsKKyAgaW50IGdhaW5Jc05lZ2F0aXZlID0gMDsKKyAgY29uc3QgRklYUF9TR0wqIG5vZGVMZXZlbCA9IHBDQ2hhci0+bm9kZUxldmVsOworICBjb25zdCBGSVhQX1NHTCogbm9kZUdhaW4gPSBwQ0NoYXItPm5vZGVHYWluOworICBpbnQgbm9kZUNvdW50ID0gcENDaGFyLT5jaGFyYWN0ZXJpc3RpY05vZGVDb3VudDsKKyAgZm9yIChrID0gMDsgayA8IG5vZGVDb3VudDsgaysrKSB7CisgICAgaWYgKHBDQ2hhci0+bm9kZUdhaW5bayArIDFdIDwgKEZJWFBfU0dMKTApIHsKKyAgICAgIGdhaW5Jc05lZ2F0aXZlID0gMTsKKyAgICB9CisgIH0KKyAgaWYgKGdhaW5Jc05lZ2F0aXZlID09IDEpIHsKKyAgICBpZiAoZ2FpbkRiIDw9IG5vZGVHYWluW25vZGVDb3VudF0pIHsKKyAgICAgICppbkxldiA9IEZYX1NHTDJGWF9EQkwobm9kZUxldmVsW25vZGVDb3VudF0pOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoZ2FpbkRiID49IChGSVhQX1NHTCkwKSB7CisgICAgICAgICppbkxldiA9IERSQ19JTlBVVF9MT1VETkVTU19UQVJHRVQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbm9kZUNvdW50OyBuKyspIHsKKyAgICAgICAgICBpZiAoKGdhaW5EYiA8PSBub2RlR2FpbltuXSkgJiYgKGdhaW5EYiA+IG5vZGVHYWluW24gKyAxXSkpIHsKKyAgICAgICAgICAgIEZJWFBfU0dMIGdhaW5EZWx0YSA9IG5vZGVHYWluW25dIC0gbm9kZUdhaW5bbiArIDFdOworICAgICAgICAgICAgaWYgKGdhaW5EZWx0YSA9PSAoRklYUF9TR0wpMCkgeworICAgICAgICAgICAgICAqaW5MZXYgPSBGWF9TR0wyRlhfREJMKG5vZGVMZXZlbFtuXSk7CisgICAgICAgICAgICAgIHJldHVybiBERV9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHcgPSBmRGl2Tm9ybShnYWluRGIgLSBub2RlR2FpbltuICsgMV0sIGdhaW5EZWx0YSk7CisgICAgICAgICAgICAqaW5MZXYgPSBmTXVsdCh3LCBub2RlTGV2ZWxbbl0pICsKKyAgICAgICAgICAgICAgICAgICAgIGZNdWx0KChGSVhQX0RCTClNQVhWQUxfREJMIC0gdywgbm9kZUxldmVsW24gKyAxXSk7CisgICAgICAgICAgICAvKiAqaW5MZXYgPSAodyAqIG5vZGVMZXZlbFtuXSArICgxLjAtdykgKiBub2RlTGV2ZWxbbisxXSk7ICovCisgICAgICAgICAgICByZXR1cm4gREVfT0s7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICppbkxldiA9IEZYX1NHTDJGWF9EQkwobm9kZUxldmVsW25vZGVDb3VudF0pOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2FpbkRiID49IG5vZGVHYWluW25vZGVDb3VudF0pIHsKKyAgICAgICppbkxldiA9IEZYX1NHTDJGWF9EQkwobm9kZUxldmVsW25vZGVDb3VudF0pOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoZ2FpbkRiIDw9IChGSVhQX1NHTCkwKSB7CisgICAgICAgICppbkxldiA9IERSQ19JTlBVVF9MT1VETkVTU19UQVJHRVQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbm9kZUNvdW50OyBuKyspIHsKKyAgICAgICAgICBpZiAoKGdhaW5EYiA+PSBub2RlR2FpbltuXSkgJiYgKGdhaW5EYiA8IG5vZGVHYWluW24gKyAxXSkpIHsKKyAgICAgICAgICAgIEZJWFBfU0dMIGdhaW5EZWx0YSA9IG5vZGVHYWluW24gKyAxXSAtIG5vZGVHYWluW25dOworICAgICAgICAgICAgaWYgKGdhaW5EZWx0YSA9PSAoRklYUF9TR0wpMCkgeworICAgICAgICAgICAgICAqaW5MZXYgPSBGWF9TR0wyRlhfREJMKG5vZGVMZXZlbFtuXSk7CisgICAgICAgICAgICAgIHJldHVybiBERV9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHcgPSBmRGl2Tm9ybShub2RlR2FpbltuICsgMV0gLSBnYWluRGIsIGdhaW5EZWx0YSk7CisgICAgICAgICAgICAqaW5MZXYgPSBmTXVsdCh3LCBub2RlTGV2ZWxbbl0pICsKKyAgICAgICAgICAgICAgICAgICAgIGZNdWx0KChGSVhQX0RCTClNQVhWQUxfREJMIC0gdywgbm9kZUxldmVsW24gKyAxXSk7CisgICAgICAgICAgICAvKiAqaW5MZXYgPSAodyAqIG5vZGVMZXZlbFtuXSArICgxLjAtdykgKiBub2RlTGV2ZWxbbisxXSk7ICovCisgICAgICAgICAgICByZXR1cm4gREVfT0s7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICppbkxldiA9IEZYX1NHTDJGWF9EQkwobm9kZUxldmVsW25vZGVDb3VudF0pOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gREVfT0s7Cit9CisKK3N0YXRpYyBEUkNfRVJST1IgX21hcEdhaW4oY29uc3QgQ0hBUkFDVEVSSVNUSUNfRk9STUFUIHBDQ2hhckZvcm1hdFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1VTVE9NX0RSQ19DSEFSKiBwQ0NoYXJTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENIQVJBQ1RFUklTVElDX0ZPUk1BVCBwQ0NoYXJGb3JtYXRUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENVU1RPTV9EUkNfQ0hBUiogcENDaGFyVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBnYWluSW5EYiwgLyogZSA9IDcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqIGdhaW5PdXREYikgICAgIC8qIGUgPSA3ICovCit7CisgIEZJWFBfREJMIGluTGV2ZWwgPSAoRklYUF9EQkwpMDsKKyAgRFJDX0VSUk9SIGVyciA9IERFX09LOworCisgIHN3aXRjaCAocENDaGFyRm9ybWF0U291cmNlKSB7CisgICAgY2FzZSBDRl9TSUdNT0lEOgorICAgICAgZXJyID0gX2NvbXByZXNzb3JJT19zaWdtb2lkX2ludmVyc2UoCisgICAgICAgICAgKGNvbnN0IENVU1RPTV9EUkNfQ0hBUl9TSUdNT0lEKilwQ0NoYXJTb3VyY2UsIGdhaW5JbkRiLCAmaW5MZXZlbCk7CisgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDRl9OT0RFUzoKKyAgICAgIGVyciA9IF9jb21wcmVzc29ySU9fbm9kZXNfaW52ZXJzZSgKKyAgICAgICAgICAoY29uc3QgQ1VTVE9NX0RSQ19DSEFSX05PREVTKilwQ0NoYXJTb3VyY2UsIGdhaW5JbkRiLCAmaW5MZXZlbCk7CisgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBERV9OT1RfT0s7CisgIH0KKyAgc3dpdGNoIChwQ0NoYXJGb3JtYXRUYXJnZXQpIHsKKyAgICBjYXNlIENGX1NJR01PSUQ6CisgICAgICBlcnIgPSBfY29tcHJlc3NvcklPX3NpZ21vaWQoKGNvbnN0IENVU1RPTV9EUkNfQ0hBUl9TSUdNT0lEKilwQ0NoYXJUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5MZXZlbCwgZ2Fpbk91dERiKTsKKyAgICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgICAgICBicmVhazsKKyAgICBjYXNlIENGX05PREVTOgorICAgICAgZXJyID0gX2NvbXByZXNzb3JJT19ub2RlcygoY29uc3QgQ1VTVE9NX0RSQ19DSEFSX05PREVTKilwQ0NoYXJUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTGV2ZWwsIGdhaW5PdXREYik7CisgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBERV9PSzsKK30KKworc3RhdGljIERSQ19FUlJPUiBfdG9MaW5lYXIoCisgICAgY29uc3QgTk9ERV9NT0RJRklDQVRJT04qIG5vZGVNb2QsIGNvbnN0IGludCBkcmNCYW5kLAorICAgIGNvbnN0IEZJWFBfU0dMIGdhaW5EYiwgIC8qIGluOiBnYWluIHZhbHVlIGluIGRCLCBlID0gNyAqLworICAgIGNvbnN0IEZJWFBfU0dMIHNsb3BlRGIsIC8qIGluOiBzbG9wZSB2YWx1ZSBpbiBkQi9kZWx0YVRtaW4sIGUgPSAyICovCisgICAgRklYUF9EQkwqIGdhaW5MaW4sICAgICAgLyogb3V0OiBsaW5lYXIgZ2FpbiB2YWx1ZSwgZSA9IDcgKi8KKyAgICBGSVhQX0RCTCogc2xvcGVMaW4pICAgICAvKiBvdXQ6IGxpbmVhciBzbG9wZSB2YWx1ZSwgZSA9IDcgKi8KK3sKKyAgRklYUF9EQkwgZ2FpblJhdGlvX20gPSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKGZsb2F0KSgxIDw8IDEpKTsKKyAgR0FJTl9NT0RJRklDQVRJT04qIHBHTW9kID0gTlVMTDsKKyAgRFVDS0lOR19NT0RJRklDQVRJT04qIHBETW9kID0gbm9kZU1vZC0+cERNb2Q7CisgIEZJWFBfREJMIHRtcF9kYmwsIGdhaW5EYl9tb2RpZmllZCwgZ2FpbkRiX29mZnNldCwgZ2FpbkRiX291dCwgZ2Fpbkxpbl9tLAorICAgICAgc2xvcGVMaW5fbTsKKyAgaW50IGdhaW5MaW5fZSwgZ2FpblJhdGlvX2UgPSAxLCBnYWluRGJfb3V0X2U7CisgIGlmIChub2RlTW9kLT5wR01vZCAhPSBOVUxMKSB7CisgICAgcEdNb2QgPSAmKG5vZGVNb2QtPnBHTW9kW2RyY0JhbmRdKTsKKyAgfQorICBpZiAoKChub2RlTW9kLT5kcmNTZXRFZmZlY3QgJiAoRUJfRFVDS19PVEhFUiB8IEVCX0RVQ0tfU0VMRikpID09IDApICYmCisgICAgICAobm9kZU1vZC0+ZHJjU2V0RWZmZWN0ICE9IEVCX0ZBREUpICYmCisgICAgICAobm9kZU1vZC0+ZHJjU2V0RWZmZWN0ICE9IEVCX0NMSVBQSU5HKSkgeworICAgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgICBGSVhQX0RCTCBnYWluRGJNYXBwZWQ7CisKKyAgICBpZiAoKHBHTW9kICE9IE5VTEwpICYmIChub2RlTW9kLT5kcmNDaGFyYWN0ZXJpc3RpY1ByZXNlbnQpKSB7CisgICAgICBpZiAoKChnYWluRGIgPiAoRklYUF9TR0wpMCkgJiYgbm9kZU1vZC0+c2xvcGVJc05lZ2F0aXZlKSB8fAorICAgICAgICAgICgoZ2FpbkRiIDwgKEZJWFBfU0dMKTApICYmICFub2RlTW9kLT5zbG9wZUlzTmVnYXRpdmUpKSB7CisgICAgICAgIC8qIGxlZnQgc2lkZSAqLworICAgICAgICBpZiAocEdNb2QtPnRhcmdldENoYXJhY3RlcmlzdGljTGVmdFByZXNlbnQgPT0gMSkgeworICAgICAgICAgIGVyciA9IF9tYXBHYWluKG5vZGVNb2QtPmNoYXJhY3RlcmlzdGljRm9ybWF0U291cmNlW0NTX0xFRlRdLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVNb2QtPnBDQ2hhclNvdXJjZVtDU19MRUZUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTW9kLT5jaGFyYWN0ZXJpc3RpY0Zvcm1hdFRhcmdldFtDU19MRUZUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTW9kLT5wQ0NoYXJUYXJnZXRbQ1NfTEVGVF0sIGdhaW5EYiwgJmdhaW5EYk1hcHBlZCk7CisgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgICAgICAgICBnYWluUmF0aW9fbSA9IGZEaXZOb3JtU2lnbmVkKAorICAgICAgICAgICAgICBnYWluRGJNYXBwZWQsIEZYX1NHTDJGWF9EQkwoZ2FpbkRiKSwKKyAgICAgICAgICAgICAgJmdhaW5SYXRpb19lKTsgLyogdGFyZ2V0IGNoYXJhY3RlcmlzdGljIGluIHBheWxvYWQgKi8KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBlbHNlIHsgLyogaWYgKCgoZ2FpbkRiIDwgKEZJWFBfU0dMKTApICYmIG5vZGVNb2QtPnNsb3BlSXNOZWdhdGl2ZSkgfHwKKyAgICAgICAgICAgICAgICAoKGdhaW5EYiA+IChGSVhQX1NHTCkwKSAmJiAhbm9kZU1vZC0+c2xvcGVJc05lZ2F0aXZlKSkgKi8KKworICAgICAgICAvKiByaWdodCBzaWRlICovCisgICAgICAgIGlmIChwR01vZC0+dGFyZ2V0Q2hhcmFjdGVyaXN0aWNSaWdodFByZXNlbnQgPT0gMSkgeworICAgICAgICAgIGVyciA9CisgICAgICAgICAgICAgIF9tYXBHYWluKG5vZGVNb2QtPmNoYXJhY3RlcmlzdGljRm9ybWF0U291cmNlW0NTX1JJR0hUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgbm9kZU1vZC0+cENDaGFyU291cmNlW0NTX1JJR0hUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgbm9kZU1vZC0+Y2hhcmFjdGVyaXN0aWNGb3JtYXRUYXJnZXRbQ1NfUklHSFRdLAorICAgICAgICAgICAgICAgICAgICAgICBub2RlTW9kLT5wQ0NoYXJUYXJnZXRbQ1NfUklHSFRdLCBnYWluRGIsICZnYWluRGJNYXBwZWQpOworICAgICAgICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisgICAgICAgICAgZ2FpblJhdGlvX20gPSBmRGl2Tm9ybVNpZ25lZCgKKyAgICAgICAgICAgICAgZ2FpbkRiTWFwcGVkLCBGWF9TR0wyRlhfREJMKGdhaW5EYiksCisgICAgICAgICAgICAgICZnYWluUmF0aW9fZSk7IC8qIHRhcmdldCBjaGFyYWN0ZXJpc3RpYyBpbiBwYXlsb2FkICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGdhaW5EYiA8IChGSVhQX1NHTCkwKSB7CisgICAgICBnYWluUmF0aW9fbSA9IGZNdWx0RGl2MihnYWluUmF0aW9fbSwgbm9kZU1vZC0+Y29tcHJlc3MpOworICAgIH0gZWxzZSB7CisgICAgICBnYWluUmF0aW9fbSA9IGZNdWx0RGl2MihnYWluUmF0aW9fbSwgbm9kZU1vZC0+Ym9vc3QpOworICAgIH0KKyAgICBnYWluUmF0aW9fZSArPSAyOworICB9CisgIGlmICgocEdNb2QgIT0gTlVMTCkgJiYgKHBHTW9kLT5nYWluU2NhbGluZ1ByZXNlbnQgPT0gMSkpIHsKKyAgICBpZiAoZ2FpbkRiIDwgKEZJWFBfU0dMKTApIHsKKyAgICAgIGdhaW5SYXRpb19tID0gZk11bHREaXYyKGdhaW5SYXRpb19tLCBwR01vZC0+YXR0ZW51YXRpb25TY2FsaW5nKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2FpblJhdGlvX20gPSBmTXVsdERpdjIoZ2FpblJhdGlvX20sIHBHTW9kLT5hbXBsaWZpY2F0aW9uU2NhbGluZyk7CisgICAgfQorICAgIGdhaW5SYXRpb19lICs9IDM7CisgIH0KKyAgaWYgKChwRE1vZCAhPSBOVUxMKSAmJgorICAgICAgKG5vZGVNb2QtPmRyY1NldEVmZmVjdCAmIChFQl9EVUNLX09USEVSIHwgRUJfRFVDS19TRUxGKSkgJiYKKyAgICAgIChwRE1vZC0+ZHVja2luZ1NjYWxpbmdQcmVzZW50ID09IDEpKSB7CisgICAgZ2FpblJhdGlvX20gPSBmTXVsdERpdjIoZ2FpblJhdGlvX20sIHBETW9kLT5kdWNraW5nU2NhbGluZyk7CisgICAgZ2FpblJhdGlvX2UgKz0gMzsKKyAgfQorCisgIGdhaW5EYl9tb2RpZmllZCA9CisgICAgICBmTXVsdERpdjIoZ2FpbkRiLCBnYWluUmF0aW9fbSk7IC8qIHJlc3VsdGluZyBlOiA3ICsgZ2FpblJhdGlvX2UgKyAxKi8KKyAgZ2FpbkRiX29mZnNldCA9IChGSVhQX0RCTCkwOworCisgIGlmICgocEdNb2QgIT0gTlVMTCkgJiYgKHBHTW9kLT5nYWluT2Zmc2V0UHJlc2VudCA9PSAxKSkgeworICAgIC8qICpnYWluTGluICo9IChmbG9hdClwb3coMi4wLCAoZG91YmxlKShwR01vZC0+Z2Fpbk9mZnNldC82LjBmKSk7ICovCisgICAgZ2FpbkRiX29mZnNldCArPSBGWF9TR0wyRlhfREJMKHBHTW9kLT5nYWluT2Zmc2V0KSA+PiA0OyAvKiByZXN1bHRpbmcgZTogOCAqLworICB9CisgIGlmICgobm9kZU1vZC0+bGltaXRlclBlYWtUYXJnZXRQcmVzZW50ID09IDEpICYmCisgICAgICAobm9kZU1vZC0+ZHJjU2V0RWZmZWN0ID09CisgICAgICAgRUJfQ0xJUFBJTkcpKSB7IC8qIFRoZSBvbmx5IGRyY1NldEVmZmVjdCBpcyAiY2xpcHBpbmcgcHJldmVudGlvbiIgKi8KKyAgICAvKiBsb3VkbmVzc05vcm1hbGl6YXRpb25HYWluTW9kaWZpY2F0aW9uRGIgaXMgaW5jbHVkZWQgaW4KKyAgICAgKiBsb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGIgKi8KKyAgICAvKiAqZ2FpbkxpbiAqPSAoZmxvYXQpcG93KDIuMCwgbWF4KDAuMCwgLW5vZGVNb2RpZmljYXRpb24tPmxpbWl0ZXJQZWFrVGFyZ2V0CisgICAgICogLSBub2RlTW9kaWZpY2F0aW9uLT5sb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGIpLzYuMCk7ICovCisgICAgZ2FpbkRiX29mZnNldCArPSBmTWF4KAorICAgICAgICAoRklYUF9EQkwpMCwKKyAgICAgICAgKEZYX1NHTDJGWF9EQkwoLW5vZGVNb2QtPmxpbWl0ZXJQZWFrVGFyZ2V0KSA+PiAzKSAtCisgICAgICAgICAgICAobm9kZU1vZC0+bG91ZG5lc3NOb3JtYWxpemF0aW9uR2FpbkRiID4+IDEpKTsgLyogcmVzdWx0aW5nIGU6IDggKi8KKyAgfQorICBpZiAoZ2FpbkRiX29mZnNldCAhPSAoRklYUF9EQkwpMCkgeworICAgIGdhaW5EYl9vdXQgPSBmQWRkTm9ybShnYWluRGJfbW9kaWZpZWQsIDcgKyBnYWluUmF0aW9fZSArIDEsIGdhaW5EYl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDgsICZnYWluRGJfb3V0X2UpOworICB9IGVsc2UgeworICAgIGdhaW5EYl9vdXQgPSBnYWluRGJfbW9kaWZpZWQ7CisgICAgZ2FpbkRiX291dF9lID0gNyArIGdhaW5SYXRpb19lICsgMTsKKyAgfQorCisgIC8qICpnYWluTGluID0gKGZsb2F0KXBvdygyLjAsIChkb3VibGUpKGdhaW5EYl9tb2RpZmllZFsxXSAvIDYuMGYpKTsgKi8KKyAgZ2Fpbkxpbl9tID0gYXBwcm94RGIybGluKGdhaW5EYl9vdXQsIGdhaW5EYl9vdXRfZSwgJmdhaW5MaW5fZSk7CisgICpnYWluTGluID0gc2NhbGVWYWx1ZVNhdHVyYXRlKGdhaW5MaW5fbSwgZ2Fpbkxpbl9lIC0gNyk7CisKKyAgLyogKnNsb3BlTGluID0gU0xPUEVfRkFDVE9SX0RCX1RPX0xJTkVBUiAqIGdhaW5SYXRpbyAqICpnYWluTGluICogc2xvcGVEYjsgKi8KKyAgaWYgKHNsb3BlRGIgPT0gKEZJWFBfU0dMKTApIHsKKyAgICAqc2xvcGVMaW4gPSAoRklYUF9EQkwpMDsKKyAgfSBlbHNlIHsKKyAgICB0bXBfZGJsID0KKyAgICAgICAgZk11bHQoc2xvcGVEYiwgU0xPUEVfRkFDVE9SX0RCX1RPX0xJTkVBUik7IC8qIHJlc3VsdGluZyBlOiAyIC0gMyA9IC0xICovCisgICAgdG1wX2RibCA9IGZNdWx0KHRtcF9kYmwsIGdhaW5SYXRpb19tKTsgLyogcmVzdWx0aW5nIGU6IC0xICsgZ2FpblJhdGlvX2UgKi8KKyAgICBpZiAoZ2FpbkRiX29mZnNldCAhPQorICAgICAgICAoRklYUF9EQkwpMCkgeyAvKiByZWNhbGN1bGF0ZSBnYWluTGluIGZyb20gZ2FpbkRiIHRoYXQgd2Fzbid0IG1vZGlmaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGdhaW5PZmZzZXQgYW5kIGxpbWl0ZXJQZWFrVGFyZ2V0ICovCisgICAgICBnYWluTGluX20gPSBhcHByb3hEYjJsaW4oZ2FpbkRiX21vZGlmaWVkLCA3ICsgZ2FpblJhdGlvX2UsICZnYWluTGluX2UpOworICAgIH0KKyAgICBzbG9wZUxpbl9tID0gZk11bHQodG1wX2RibCwgZ2Fpbkxpbl9tKTsKKyAgICAqc2xvcGVMaW4gPQorICAgICAgICBzY2FsZVZhbHVlU2F0dXJhdGUoc2xvcGVMaW5fbSwgLTEgKyBnYWluUmF0aW9fZSArIGdhaW5MaW5fZSAtIDcpOworICB9CisKKyAgaWYgKChub2RlTW9kLT5saW1pdGVyUGVha1RhcmdldFByZXNlbnQgPT0gMSkgJiYKKyAgICAgIChub2RlTW9kLT5kcmNTZXRFZmZlY3QgPT0gRUJfQ0xJUFBJTkcpKSB7CisgICAgaWYgKCpnYWluTGluID49IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgNykpKSB7CisgICAgICAqZ2FpbkxpbiA9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgNykpOworICAgICAgKnNsb3BlTGluID0gKEZJWFBfREJMKTA7CisgICAgfQorICB9CisKKyAgcmV0dXJuIERFX09LOworfQorCisvKiBwcmVwYXJlIGJ1ZmZlcnMgY29udGFpbmluZyBsaW5lYXIgbm9kZXMgZm9yIGVhY2ggZ2FpbiBzZXF1ZW5jZSAqLworRFJDX0VSUk9SCitwcmVwYXJlRHJjR2FpbihIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywKKyAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0dBSU4gaFVuaURyY0dhaW4sIGNvbnN0IEZJWFBfU0dMIGNvbXByZXNzLAorICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgYm9vc3QsIGNvbnN0IEZJWFBfREJMIGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYiwKKyAgICAgICAgICAgICAgIGNvbnN0IGludCBhY3RpdmVEcmNJbmRleCkgeworICBpbnQgYiwgZywgZ2FpbkVsZW1lbnRJbmRleDsKKyAgRFJDX0dBSU5fQlVGRkVSUyogZHJjR2FpbkJ1ZmZlcnMgPSAmKGhHYWluRGVjLT5kcmNHYWluQnVmZmVycyk7CisgIE5PREVfTU9ESUZJQ0FUSU9OIG5vZGVNb2Q7CisgIEZES21lbWNsZWFyKCZub2RlTW9kLCBzaXplb2YoTk9ERV9NT0RJRklDQVRJT04pKTsKKyAgQUNUSVZFX0RSQyogcEFjdGl2ZURyYyA9ICYoaEdhaW5EZWMtPmFjdGl2ZURyY1thY3RpdmVEcmNJbmRleF0pOworICBEUkNfSU5TVFJVQ1RJT05TX1VOSV9EUkMqIHBJbnN0ID0gcEFjdGl2ZURyYy0+cEluc3Q7CisgIGlmIChwSW5zdCA9PSBOVUxMKSByZXR1cm4gREVfTk9UX09LOworCisgIG5vZGVNb2QuZHJjU2V0RWZmZWN0ID0gcEluc3QtPmRyY1NldEVmZmVjdDsKKworICBub2RlTW9kLmNvbXByZXNzID0gY29tcHJlc3M7CisgIG5vZGVNb2QuYm9vc3QgPSBib29zdDsKKyAgbm9kZU1vZC5sb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGIgPSBsb3VkbmVzc05vcm1hbGl6YXRpb25HYWluRGI7CisgIG5vZGVNb2QubGltaXRlclBlYWtUYXJnZXRQcmVzZW50ID0gcEluc3QtPmxpbWl0ZXJQZWFrVGFyZ2V0UHJlc2VudDsKKyAgbm9kZU1vZC5saW1pdGVyUGVha1RhcmdldCA9IHBJbnN0LT5saW1pdGVyUGVha1RhcmdldDsKKworICBnYWluRWxlbWVudEluZGV4ID0gMDsKKyAgZm9yIChnID0gMDsgZyA8IHBJbnN0LT5uRHJjQ2hhbm5lbEdyb3VwczsgZysrKSB7CisgICAgaW50IGdhaW5TZXRJbmRleCA9IDA7CisgICAgaW50IG5EcmNCYW5kcyA9IDA7CisgICAgRFJDX0NPRUZGSUNJRU5UU19VTklfRFJDKiBwQ29lZiA9IHBBY3RpdmVEcmMtPnBDb2VmOworICAgIGlmIChwQ29lZiA9PSBOVUxMKSByZXR1cm4gREVfTk9UX09LOworCisgICAgaWYgKCFwQWN0aXZlRHJjLT5jaGFubmVsR3JvdXBJc1BhcmFtZXRyaWNEcmNbZ10pIHsKKyAgICAgIGdhaW5TZXRJbmRleCA9IHBJbnN0LT5nYWluU2V0SW5kZXhGb3JDaGFubmVsR3JvdXBbZ107CisKKyAgICAgIGlmIChub2RlTW9kLmRyY1NldEVmZmVjdCAmIChFQl9EVUNLX09USEVSIHwgRUJfRFVDS19TRUxGKSkgeworICAgICAgICBub2RlTW9kLnBETW9kID0gJihwQWN0aXZlRHJjLT5kdWNraW5nTW9kaWZpY2F0aW9uRm9yQ2hhbm5lbEdyb3VwW2ddKTsKKyAgICAgICAgbm9kZU1vZC5wR01vZCA9IE5VTEw7CisgICAgICB9IGVsc2UgeworICAgICAgICBub2RlTW9kLnBHTW9kID0gcEluc3QtPmdhaW5Nb2RpZmljYXRpb25Gb3JDaGFubmVsR3JvdXBbZ107CisgICAgICAgIG5vZGVNb2QucERNb2QgPSBOVUxMOworICAgICAgfQorCisgICAgICBuRHJjQmFuZHMgPSBwQWN0aXZlRHJjLT5iYW5kQ291bnRGb3JDaGFubmVsR3JvdXBbZ107CisgICAgICBmb3IgKGIgPSAwOyBiIDwgbkRyY0JhbmRzOyBiKyspIHsKKyAgICAgICAgRFJDX0VSUk9SIGVyciA9IERFX09LOworICAgICAgICBHQUlOX1NFVCogcEdhaW5TZXQgPSAmKHBDb2VmLT5nYWluU2V0W2dhaW5TZXRJbmRleF0pOworICAgICAgICBpbnQgc2VxID0gcEdhaW5TZXQtPmdhaW5TZXF1ZW5jZUluZGV4W2JdOworICAgICAgICBEUkNfQ0hBUkFDVEVSSVNUSUMqIHBEQ2hhciA9ICYocEdhaW5TZXQtPmRyY0NoYXJhY3RlcmlzdGljW2JdKTsKKworICAgICAgICAvKiBsaW5lYXJOb2RlQnVmZmVyIGNvbnRhaW5zIGEgY29weSBvZiB0aGUgZ2FpbiBzZXF1ZW5jZXMgKGNvbnNpc3Rpbmcgb2YKKyAgICAgICAgICAgbm9kZXMpIHRoYXQgYXJlIHJlbGV2YW50IGZvciBkZWNvZGluZy4gSXQgYWxzbyBjb250YWlucyBnYWluCisgICAgICAgICAgIHNlcXVlbmNlcyBvZiBwcmV2aW91cyBmcmFtZXMuICovCisgICAgICAgIExJTkVBUl9OT0RFX0JVRkZFUiogcExuYiA9CisgICAgICAgICAgICAmKGRyY0dhaW5CdWZmZXJzLT5saW5lYXJOb2RlQnVmZmVyW3BBY3RpdmVEcmMtPmFjdGl2ZURyY09mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW5FbGVtZW50SW5kZXhdKTsKKyAgICAgICAgaW50IGksIGxuYnA7CisgICAgICAgIGxuYnAgPSBkcmNHYWluQnVmZmVycy0+bG5iUG9pbnRlcjsKKyAgICAgICAgcExuYi0+Z2FpbkludGVycG9sYXRpb25UeXBlID0KKyAgICAgICAgICAgIChHQUlOX0lOVEVSUE9MQVRJT05fVFlQRSlwR2FpblNldC0+Z2FpbkludGVycG9sYXRpb25UeXBlOworCisgICAgICAgIGVyciA9IF9wcmVwYXJlRHJjQ2hhcmFjdGVyaXN0aWMocERDaGFyLCBwQ29lZiwgYiwgJm5vZGVNb2QpOworICAgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworCisgICAgICAgIC8qIGNvcHkgYSBub2RlIGJ1ZmZlciBhbmQgY29udmVydCBmcm9tIGRCIHRvIGxpbmVhciAqLworICAgICAgICBwTG5iLT5uTm9kZXNbbG5icF0gPSBmTWluKChpbnQpaFVuaURyY0dhaW4tPm5Ob2Rlc1tzZXFdLCAxNik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwTG5iLT5uTm9kZXNbbG5icF07IGkrKykgeworICAgICAgICAgIEZJWFBfREJMIGdhaW5MaW4sIHNsb3BlTGluOworICAgICAgICAgIGVyciA9IF90b0xpbmVhcigmbm9kZU1vZCwgYiwgaFVuaURyY0dhaW4tPmdhaW5Ob2RlW3NlcV1baV0uZ2FpbkRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9TR0wpMCwgJmdhaW5MaW4sICZzbG9wZUxpbik7CisgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgICAgICAgICBwTG5iLT5saW5lYXJOb2RlW2xuYnBdW2ldLmdhaW5MaW4gPSBnYWluTGluOworICAgICAgICAgIHBMbmItPmxpbmVhck5vZGVbbG5icF1baV0udGltZSA9IGhVbmlEcmNHYWluLT5nYWluTm9kZVtzZXFdW2ldLnRpbWU7CisgICAgICAgIH0KKyAgICAgICAgZ2FpbkVsZW1lbnRJbmRleCsrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBwYXJhbWV0cmljIERSQyBub3Qgc3VwcG9ydGVkICovCisgICAgICBnYWluRWxlbWVudEluZGV4Kys7CisgICAgfQorICB9CisgIHJldHVybiBERV9PSzsKK30KZGlmZiAtLWdpdCBhL2xpYkRSQ2RlYy9zcmMvZHJjR2FpbkRlY19wcmVwcm9jZXNzLmggYi9saWJEUkNkZWMvc3JjL2RyY0dhaW5EZWNfcHJlcHJvY2Vzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NDc0MDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJEUkNkZWMvc3JjL2RyY0dhaW5EZWNfcHJlcHJvY2Vzcy5oCkBAIC0wLDAgKzEsMTExIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUctRCBEUkMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRFJDR0FJTkRFQ19QUkVQUk9DRVNTX0gKKyNkZWZpbmUgRFJDR0FJTkRFQ19QUkVQUk9DRVNTX0gKKworRFJDX0VSUk9SCitwcmVwYXJlRHJjR2FpbihIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywKKyAgICAgICAgICAgICAgIEhBTkRMRV9VTklfRFJDX0dBSU4gaFVuaURyY0dhaW4sIGNvbnN0IEZJWFBfU0dMIGNvbXByZXNzLAorICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgYm9vc3QsIGNvbnN0IEZJWFBfREJMIGxvdWRuZXNzTm9ybWFsaXphdGlvbkdhaW5EYiwKKyAgICAgICAgICAgICAgIGNvbnN0IGludCBhY3RpdmVEcmNJbmRleCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYkRSQ2RlYy9zcmMvZHJjR2FpbkRlY19wcm9jZXNzLmNwcCBiL2xpYkRSQ2RlYy9zcmMvZHJjR2FpbkRlY19wcm9jZXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGM5NTMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliRFJDZGVjL3NyYy9kcmNHYWluRGVjX3Byb2Nlc3MuY3BwCkBAIC0wLDAgKzEsNTMyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUctRCBEUkMgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJkcmNEZWNfdHlwZXMuaCIKKyNpbmNsdWRlICJkcmNEZWNfZ2FpbkRlY29kZXIuaCIKKyNpbmNsdWRlICJkcmNHYWluRGVjX3Byb2Nlc3MuaCIKKworI2RlZmluZSBFX1RHQUlOU1RFUCAxMgorCitzdGF0aWMgRFJDX0VSUk9SIF9wcmVwYXJlTG5iSW5kZXgoQUNUSVZFX0RSQyogcEFjdGl2ZURyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY2hhbm5lbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZHJjQ2hhbm5lbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtQ2hhbm5lbHNQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxuYlBvaW50ZXIpIHsKKyAgaW50IGcsIGM7CisgIERSQ19JTlNUUlVDVElPTlNfVU5JX0RSQyogcEluc3QgPSBwQWN0aXZlRHJjLT5wSW5zdDsKKworICAvKiBjaGFubmVsT2Zmc2V0OiBzdGFydCBpbmRleCBvZiBwaHlzaWNhbCBjaGFubmVscworICAgICBudW1DaGFubmVsc1Byb2Nlc3NlZDogbnVtYmVyIG9mIHByb2Nlc3NlZCBjaGFubmVscywgcGh5c2ljYWwgY2hhbm5lbHMgYW5kCisgICAgIERSQyBjaGFubmVscyBjaGFubmVsT2Zmc2V0ICsgZHJjQ2hhbm5lbE9mZnNldDogc3RhcnQgaW5kZXggb2YgRFJDIGNoYW5uZWxzLAorICAgICAgICBpLmUuIHRoZSBjaGFubmVsIG9yZGVyIHJlZmVyZW5jZWQgaW4gcEluc3Quc2VxdWVuY2VJbmRleCAqLworCisgIC8qIHNhbml0eSBjaGVja3MgKi8KKyAgaWYgKChjaGFubmVsT2Zmc2V0ICsgbnVtQ2hhbm5lbHNQcm9jZXNzZWQpID4gOCkgcmV0dXJuIERFX05PVF9PSzsKKworICBpZiAoKGNoYW5uZWxPZmZzZXQgKyBkcmNDaGFubmVsT2Zmc2V0ICsgbnVtQ2hhbm5lbHNQcm9jZXNzZWQpID4gOCkKKyAgICByZXR1cm4gREVfTk9UX09LOworCisgIGlmICgoY2hhbm5lbE9mZnNldCArIGRyY0NoYW5uZWxPZmZzZXQpIDwgMCkgcmV0dXJuIERFX05PVF9PSzsKKworICAvKiBwcmVwYXJlIGxuYkluZGV4Rm9yQ2hhbm5lbCwgYSBtYXAgb2YgaW5kaWNlcyBmcm9tIGVhY2ggY2hhbm5lbCB0byBpdHMKKyAgICogY29ycmVzcG9uZGluZyBsaW5lYXJOb2RlQnVmZmVyIGluc3RhbmNlICovCisgIGZvciAoYyA9IGNoYW5uZWxPZmZzZXQ7IGMgPCBjaGFubmVsT2Zmc2V0ICsgbnVtQ2hhbm5lbHNQcm9jZXNzZWQ7IGMrKykgeworICAgIGlmIChwSW5zdC0+ZHJjU2V0SWQgPiAwKSB7CisgICAgICBpbnQgZHJjQ2hhbm5lbCA9IGMgKyBkcmNDaGFubmVsT2Zmc2V0OworICAgICAgLyogZmFsbGJhY2sgZm9yIGNvbmZpZ3VyYXRpb24gd2l0aCBtb3JlIHBoeXNpY2FsIGNoYW5uZWxzIHRoYW4gRFJDCisgICAgICAgICBjaGFubmVsczogcmV1c2UgRFJDIGdhaW4gb2YgZmlyc3QgY2hhbm5lbC4gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIEhFLUFBQworICAgICAgICAgbW9ubyB3aXRoIHN0ZXJlbyBvdXRwdXQgKi8KKyAgICAgIGlmIChkcmNDaGFubmVsID49IHBJbnN0LT5kcmNDaGFubmVsQ291bnQpIGRyY0NoYW5uZWwgPSAwOworICAgICAgZyA9IHBBY3RpdmVEcmMtPmNoYW5uZWxHcm91cEZvckNoYW5uZWxbZHJjQ2hhbm5lbF07CisgICAgICBpZiAoKGcgPj0gMCkgJiYgIXBBY3RpdmVEcmMtPmNoYW5uZWxHcm91cElzUGFyYW1ldHJpY0RyY1tnXSkgeworICAgICAgICBwQWN0aXZlRHJjLT5sbmJJbmRleEZvckNoYW5uZWxbY11bbG5iUG9pbnRlcl0gPQorICAgICAgICAgICAgcEFjdGl2ZURyYy0+YWN0aXZlRHJjT2Zmc2V0ICsgcEFjdGl2ZURyYy0+Z2FpbkVsZW1lbnRGb3JHcm91cFtnXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gREVfT0s7Cit9CisKK3N0YXRpYyBEUkNfRVJST1IgX2ludGVycG9sYXRlRHJjR2FpbigKKyAgICBjb25zdCBHQUlOX0lOVEVSUE9MQVRJT05fVFlQRSBnYWluSW50ZXJwb2xhdGlvblR5cGUsCisgICAgY29uc3QgU0hPUlQgdGltZVByZXYsICAvKiB0aW1lMCAqLworICAgIGNvbnN0IFNIT1JUIHRHYWluU3RlcCwgLyogdGltZTEgLSB0aW1lMCAqLworICAgIGNvbnN0IFNIT1JUIHN0YXJ0LCBjb25zdCBTSE9SVCBzdG9wLCBjb25zdCBTSE9SVCBzdGVwc2l6ZSwKKyAgICBjb25zdCBGSVhQX0RCTCBnYWluTGVmdCwgY29uc3QgRklYUF9EQkwgZ2FpblJpZ2h0LCBjb25zdCBGSVhQX0RCTCBzbG9wZUxlZnQsCisgICAgY29uc3QgRklYUF9EQkwgc2xvcGVSaWdodCwgRklYUF9EQkwqIGJ1ZmZlcikgeworICBpbnQgbiwgbl9idWY7CisgIGludCBzdGFydF9tb2R1bG8sIHN0YXJ0X29mZnNldDsKKworICBpZiAodEdhaW5TdGVwIDwgMCkgeworICAgIHJldHVybiBERV9OT1RfT0s7CisgIH0KKyAgaWYgKHRHYWluU3RlcCA9PSAwKSB7CisgICAgcmV0dXJuIERFX09LOworICB9CisKKyAgLyogZ2V0IHN0YXJ0IGluZGV4IG9mZnNldCBhbmQgYnVmZmVyIGluZGV4IGZvciBkb3duc2FtcGxlZCBpbnRlcnBvbGF0aW9uICovCisgIC8qIHN0YXJ0X21vZHVsbyA9IChzdGFydCt0aW1lUHJldiklc3RlcHNpemU7ICovIC8qIHN0ZXBzaXplIGlzIGEgcG93ZXIgb2YgMiAqLworICBzdGFydF9tb2R1bG8gPSAoc3RhcnQgKyB0aW1lUHJldikgJiAoc3RlcHNpemUgLSAxKTsKKyAgc3RhcnRfb2Zmc2V0ID0gKHN0YXJ0X21vZHVsbyA/IHN0ZXBzaXplIC0gc3RhcnRfbW9kdWxvIDogMCk7CisgIC8qIG5fYnVmID0gKHN0YXJ0ICsgdGltZVByZXYgKyBzdGFydF9vZmZzZXQpL3N0ZXBzaXplOyAqLworICBuX2J1ZiA9IChzdGFydCArIHRpbWVQcmV2ICsgc3RhcnRfb2Zmc2V0KSA+PiAoMTUgLSBmaXhub3Jtel9TKHN0ZXBzaXplKSk7CisKKyAgeyAvKiBnYWluSW50ZXJwb2xhdGlvblR5cGUgPT0gR0lUX0xJTkVBUiAqLworICAgIExPTkcgYTsKKyAgICAvKiBydW5zID0gY2VpbCgoc3RvcCAtIHN0YXJ0IC0gc3RhcnRfb2Zmc2V0KS9zdGVwc2l6ZSkuIFRoaXMgd29ya3MgZm9yCisgICAgICogc3RlcHNpemUgPSAyXk4gb25seS4gKi8KKyAgICBJTlQgcnVucyA9IChJTlQpKHN0b3AgLSBzdGFydCAtIHN0YXJ0X29mZnNldCArIHN0ZXBzaXplIC0gMSkgPj4KKyAgICAgICAgICAgICAgICgzMCAtIENvdW50TGVhZGluZ0JpdHMoc3RlcHNpemUpKTsKKyAgICBJTlQgbl9taW4gPSBmTWluKAorICAgICAgICBmTWluKENudExlYWRpbmdaZXJvcyhnYWluUmlnaHQpLCBDbnRMZWFkaW5nWmVyb3MoZ2FpbkxlZnQpKSAtIDEsIDgpOworICAgIGEgPSAoTE9ORykoKGdhaW5SaWdodCA8PCBuX21pbikgLSAoZ2FpbkxlZnQgPDwgbl9taW4pKSAvIHRHYWluU3RlcDsKKyAgICBMT05HIGFfc3RlcCA9IGEgKiBzdGVwc2l6ZTsKKyAgICBuID0gc3RhcnQgKyBzdGFydF9vZmZzZXQ7CisgICAgYSA9IGEgKiBuICsgKExPTkcpKGdhaW5MZWZ0IDw8IG5fbWluKTsKKyAgICBidWZmZXIgKz0gbl9idWY7CisjaWYgZGVmaW5lZChGVU5DVElPTl9pbnRlcnBvbGF0ZURyY0dhaW5fZnVuYzEpCisgICAgaW50ZXJwb2xhdGVEcmNHYWluX2Z1bmMxKGJ1ZmZlciwgYSwgYV9zdGVwLCBuX21pbiwgcnVucyk7CisjZWxzZQorICAgIGEgLT0gYV9zdGVwOworICAgIG5fbWluID0gOCAtIG5fbWluOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVuczsgaSsrKSB7CisgICAgICBhICs9IGFfc3RlcDsKKyAgICAgIGJ1ZmZlcltpXSA9IGZNdWx0RGl2MihidWZmZXJbaV0sIChGSVhQX0RCTClhKSA8PCBuX21pbjsKKyAgICB9CisjZW5kaWYgLyogZGVmaW5lZChGVU5DVElPTl9pbnRlcnBvbGF0ZURyY0dhaW5fZnVuYzEpICovCisgIH0KKyAgcmV0dXJuIERFX09LOworfQorCitzdGF0aWMgRFJDX0VSUk9SIF9wcm9jZXNzTm9kZVNlZ21lbnRzKAorICAgIGNvbnN0IGludCBmcmFtZVNpemUsIGNvbnN0IEdBSU5fSU5URVJQT0xBVElPTl9UWVBFIGdhaW5JbnRlcnBvbGF0aW9uVHlwZSwKKyAgICBjb25zdCBpbnQgbk5vZGVzLCBjb25zdCBOT0RFX0xJTiogcE5vZGVMaW4sIGNvbnN0IGludCBvZmZzZXQsCisgICAgY29uc3QgU0hPUlQgc3RlcHNpemUsCisgICAgY29uc3QgTk9ERV9MSU4gbm9kZVByZXZpb3VzLCAvKiB0aGUgbGFzdCBub2RlIG9mIHRoZSBwcmV2aW91cyBmcmFtZSAqLworICAgIGNvbnN0IEZJWFBfREJMIGNoYW5uZWxHYWluLCBGSVhQX0RCTCogYnVmZmVyKSB7CisgIERSQ19FUlJPUiBlcnIgPSBERV9PSzsKKyAgU0hPUlQgdGltZVByZXYsIGR1cmF0aW9uLCBzdGFydCwgc3RvcCwgdGltZTsKKyAgaW50IG47CisgIEZJWFBfREJMIGdhaW5MaW4gPSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKGZsb2F0KSgxIDw8IDcpKSwgZ2FpbkxpblByZXY7CisgIEZJWFBfREJMIHNsb3BlTGluID0gKEZJWFBfREJMKTAsIHNsb3BlTGluUHJldiA9IChGSVhQX0RCTCkwOworCisgIHRpbWVQcmV2ID0gbm9kZVByZXZpb3VzLnRpbWUgKyBvZmZzZXQ7CisgIGdhaW5MaW5QcmV2ID0gbm9kZVByZXZpb3VzLmdhaW5MaW47CisgIGZvciAobiA9IDA7IG4gPCBuTm9kZXM7IG4rKykgeworICAgIHRpbWUgPSBwTm9kZUxpbltuXS50aW1lICsgb2Zmc2V0OworICAgIGR1cmF0aW9uID0gdGltZSAtIHRpbWVQcmV2OworICAgIGdhaW5MaW4gPSBwTm9kZUxpbltuXS5nYWluTGluOworICAgIGlmIChjaGFubmVsR2FpbiAhPSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKGZsb2F0KSgxIDw8IDgpKSkKKyAgICAgIGdhaW5MaW4gPQorICAgICAgICAgIFNBVFVSQVRFX0xFRlRfU0hJRlQoZk11bHREaXYyKGdhaW5MaW4sIGNoYW5uZWxHYWluKSwgOSwgREZSQUNUX0JJVFMpOworCisgICAgaWYgKCh0aW1lUHJldiA+PSAoZnJhbWVTaXplIC0gMSkpIHx8CisgICAgICAgICh0aW1lIDwgMCkpIHsgLyogVGhpcyBzZWdtZW50IChiZXR3ZWVuIHByZXZpb3VzIGFuZCBjdXJyZW50IG5vZGUpIGxpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRzaWRlIG9mIHRoaXMgYXVkaW8gZnJhbWUgKi8KKyAgICAgIHRpbWVQcmV2ID0gdGltZTsKKyAgICAgIGdhaW5MaW5QcmV2ID0gZ2FpbkxpbjsKKyAgICAgIHNsb3BlTGluUHJldiA9IHNsb3BlTGluOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLyogc3RhcnQgYW5kIHN0b3AgYXJlIHRoZSBib3VuZGFyaWVzIG9mIHRoZSByZWdpb24gb2YgdGhpcyBzZWdtZW50IHRoYXQgbGllCisgICAgICAgd2l0aGluIHRoaXMgYXVkaW8gZnJhbWUuIFRoZWlyIHZhbHVlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZgorICAgICAgIHRoaXMgc2VnbWVudC4gc3RvcCBpcyB0aGUgZmlyc3Qgc2FtcGxlIHRoYXQgaXNuJ3QgcHJvY2Vzc2VkIGFueSBtb3JlLiAqLworICAgIHN0YXJ0ID0gZk1heCgtdGltZVByZXYsIDEpOworICAgIHN0b3AgPSBmTWluKHRpbWUsIChTSE9SVCkoZnJhbWVTaXplIC0gMSkpIC0gdGltZVByZXYgKyAxOworCisgICAgZXJyID0gX2ludGVycG9sYXRlRHJjR2FpbihnYWluSW50ZXJwb2xhdGlvblR5cGUsIHRpbWVQcmV2LCBkdXJhdGlvbiwgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wLCBzdGVwc2l6ZSwgZ2FpbkxpblByZXYsIGdhaW5MaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG9wZUxpblByZXYsIHNsb3BlTGluLCBidWZmZXIpOworICAgIGlmIChlcnIpIHJldHVybiBlcnI7CisKKyAgICB0aW1lUHJldiA9IHRpbWU7CisgICAgZ2FpbkxpblByZXYgPSBnYWluTGluOworICB9CisgIHJldHVybiBlcnI7Cit9CisKKy8qIHByb2Nlc3MgRFJDIG9uIHRpbWUtZG9tYWluIHNpZ25hbCAqLworRFJDX0VSUk9SCitwcm9jZXNzRHJjVGltZShIQU5ETEVfRFJDX0dBSU5fREVDT0RFUiBoR2FpbkRlYywgY29uc3QgaW50IGFjdGl2ZURyY0luZGV4LAorICAgICAgICAgICAgICAgY29uc3QgaW50IGRlbGF5U2FtcGxlcywgY29uc3QgaW50IGNoYW5uZWxPZmZzZXQsCisgICAgICAgICAgICAgICBjb25zdCBpbnQgZHJjQ2hhbm5lbE9mZnNldCwgY29uc3QgaW50IG51bUNoYW5uZWxzUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbWVEYXRhQ2hhbm5lbE9mZnNldCwgRklYUF9EQkwqIGRlaW50ZXJsZWF2ZWRBdWRpbykgeworICBEUkNfRVJST1IgZXJyID0gREVfT0s7CisgIGludCBjLCBiLCBpOworICBBQ1RJVkVfRFJDKiBwQWN0aXZlRHJjID0gJihoR2FpbkRlYy0+YWN0aXZlRHJjW2FjdGl2ZURyY0luZGV4XSk7CisgIERSQ19HQUlOX0JVRkZFUlMqIHBEcmNHYWluQnVmZmVycyA9ICYoaEdhaW5EZWMtPmRyY0dhaW5CdWZmZXJzKTsKKyAgaW50IGxuYlBvaW50ZXIgPSBwRHJjR2FpbkJ1ZmZlcnMtPmxuYlBvaW50ZXIsIGxuYkl4OworICBMSU5FQVJfTk9ERV9CVUZGRVIqIHBMaW5lYXJOb2RlQnVmZmVyID0gcERyY0dhaW5CdWZmZXJzLT5saW5lYXJOb2RlQnVmZmVyOworICBMSU5FQVJfTk9ERV9CVUZGRVIqIHBEdW1teUxuYiA9ICYocERyY0dhaW5CdWZmZXJzLT5kdW1teUxuYik7CisgIGludCBvZmZzZXQgPSAwOworCisgIGlmIChoR2FpbkRlYy0+ZGVsYXlNb2RlID09IERNX1JFR1VMQVJfREVMQVkpIHsKKyAgICBvZmZzZXQgPSBoR2FpbkRlYy0+ZnJhbWVTaXplOworICB9CisKKyAgaWYgKChkZWxheVNhbXBsZXMgKyBvZmZzZXQpID4KKyAgICAgIChOVU1fTE5CX0ZSQU1FUyAtIDIpICoKKyAgICAgICAgICBoR2FpbkRlYy0+ZnJhbWVTaXplKSAvKiBpZiBkZWxheVNhbXBsZXMgaXMgdG9vIGJpZywgTlVNX0xOQl9GUkFNRVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgaW5jcmVhc2VkICovCisgICAgcmV0dXJuIERFX05PVF9PSzsKKworICBlcnIgPSBfcHJlcGFyZUxuYkluZGV4KHBBY3RpdmVEcmMsIGNoYW5uZWxPZmZzZXQsIGRyY0NoYW5uZWxPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHNQcm9jZXNzZWQsIGxuYlBvaW50ZXIpOworICBpZiAoZXJyKSByZXR1cm4gZXJyOworCisgIGRlaW50ZXJsZWF2ZWRBdWRpbyArPQorICAgICAgY2hhbm5lbE9mZnNldCAqIHRpbWVEYXRhQ2hhbm5lbE9mZnNldDsgLyogYXBwbHkgY2hhbm5lbE9mZnNldCAqLworCisgIC8qIHNpZ25hbCBwcm9jZXNzaW5nIGxvb3AgKi8KKyAgZm9yIChjID0gY2hhbm5lbE9mZnNldDsgYyA8IGNoYW5uZWxPZmZzZXQgKyBudW1DaGFubmVsc1Byb2Nlc3NlZDsgYysrKSB7CisgICAgaWYgKGFjdGl2ZURyY0luZGV4ID09IGhHYWluRGVjLT5jaGFubmVsR2FpbkFjdGl2ZURyY0luZGV4KQorICAgICAgcERyY0dhaW5CdWZmZXJzLT5jaGFubmVsR2FpbltjXVtsbmJQb2ludGVyXSA9IGhHYWluRGVjLT5jaGFubmVsR2FpbltjXTsKKworICAgIGIgPSAwOworICAgIHsKKyAgICAgIExJTkVBUl9OT0RFX0JVRkZFUiAqcExuYiwgKnBMbmJQcmV2aW91czsKKyAgICAgIE5PREVfTElOIG5vZGVQcmV2aW91czsKKyAgICAgIGludCBsbmJQb2ludGVyRGlmZjsKKyAgICAgIEZJWFBfREJMIGNoYW5uZWxHYWluOworICAgICAgLyogZ2V0IHBvaW50ZXIgdG8gb2xkZXN0IGxpbmVhck5vZGVzICovCisgICAgICBsbmJJeCA9IGxuYlBvaW50ZXIgKyAxIC0gTlVNX0xOQl9GUkFNRVM7CisgICAgICB3aGlsZSAobG5iSXggPCAwKSBsbmJJeCArPSBOVU1fTE5CX0ZSQU1FUzsKKworICAgICAgaWYgKGFjdGl2ZURyY0luZGV4ID09IGhHYWluRGVjLT5jaGFubmVsR2FpbkFjdGl2ZURyY0luZGV4KQorICAgICAgICBjaGFubmVsR2FpbiA9IHBEcmNHYWluQnVmZmVycy0+Y2hhbm5lbEdhaW5bY11bbG5iSXhdOworICAgICAgZWxzZQorICAgICAgICBjaGFubmVsR2FpbiA9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgOCkpOworCisgICAgICAvKiBMb29wIG92ZXIgYWxsIG5vZGUgYnVmZmVycyBpbiBsaW5lYXJOb2RlQnVmZmVyLgorICAgICAgICAgQWxsIG5vZGVzIHdoaWNoIGFyZSBub3QgcmVsZXZhbnQgZm9yIHRoZSBjdXJyZW50IGZyYW1lIGFyZSBzb3J0ZWQgb3V0CisgICAgICAgICBpbnNpZGUgX3Byb2Nlc3NOb2RlU2VnbWVudHMuICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0xOQl9GUkFNRVMgLSAxOyBpKyspIHsKKyAgICAgICAgLyogUHJlcGFyZSBwcmV2aW91cyBub2RlICovCisgICAgICAgIGlmIChwQWN0aXZlRHJjLT5sbmJJbmRleEZvckNoYW5uZWxbY11bbG5iSXhdID49IDApCisgICAgICAgICAgcExuYlByZXZpb3VzID0gJigKKyAgICAgICAgICAgICAgcExpbmVhck5vZGVCdWZmZXJbcEFjdGl2ZURyYy0+bG5iSW5kZXhGb3JDaGFubmVsW2NdW2xuYkl4XSArIGJdKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHBMbmJQcmV2aW91cyA9IHBEdW1teUxuYjsKKyAgICAgICAgbm9kZVByZXZpb3VzID0KKyAgICAgICAgICAgIHBMbmJQcmV2aW91cy0+bGluZWFyTm9kZVtsbmJJeF1bcExuYlByZXZpb3VzLT5uTm9kZXNbbG5iSXhdIC0gMV07CisgICAgICAgIG5vZGVQcmV2aW91cy50aW1lIC09IGhHYWluRGVjLT5mcmFtZVNpemU7CisgICAgICAgIGlmIChjaGFubmVsR2FpbiAhPSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKGZsb2F0KSgxIDw8IDgpKSkKKyAgICAgICAgICBub2RlUHJldmlvdXMuZ2FpbkxpbiA9IFNBVFVSQVRFX0xFRlRfU0hJRlQoCisgICAgICAgICAgICAgIGZNdWx0RGl2Mihub2RlUHJldmlvdXMuZ2FpbkxpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEcmNHYWluQnVmZmVycy0+Y2hhbm5lbEdhaW5bY11bbG5iSXhdKSwKKyAgICAgICAgICAgICAgOSwgREZSQUNUX0JJVFMpOworCisgICAgICAgIC8qIFByZXBhcmUgY3VycmVudCBsaW5lYXJOb2RlQnVmZmVyIGluc3RhbmNlICovCisgICAgICAgIGxuYkl4Kys7CisgICAgICAgIGlmIChsbmJJeCA+PSBOVU1fTE5CX0ZSQU1FUykgbG5iSXggPSAwOworCisgICAgICAgIC8qIGlmIGxuYkluZGV4Rm9yQ2hhbm5lbCBjaGFuZ2VzIG92ZXIgdGltZSwgdXNlIHRoZSBvbGQgaW5kaWNlcyBmb3IKKyAgICAgICAgICogc21vb3RoIHRyYW5zaXRpb25zICovCisgICAgICAgIGlmIChwQWN0aXZlRHJjLT5sbmJJbmRleEZvckNoYW5uZWxbY11bbG5iSXhdID49IDApCisgICAgICAgICAgcExuYiA9ICYoCisgICAgICAgICAgICAgIHBMaW5lYXJOb2RlQnVmZmVyW3BBY3RpdmVEcmMtPmxuYkluZGV4Rm9yQ2hhbm5lbFtjXVtsbmJJeF0gKyBiXSk7CisgICAgICAgIGVsc2UgLyogbG5iSW5kZXhGb3JDaGFubmVsID0gLTEgbWVhbnMgIm5vIERSQyBwcm9jZXNzaW5nIiwgZHVlIHRvCisgICAgICAgICAgICAgICAgZHJjSW5zdHJ1Y3Rpb25zSW5kZXggPCAwLCBkcmNTZXRJZCA8IDAgb3IgY2hhbm5lbCBncm91cCA8IDAgKi8KKyAgICAgICAgICBwTG5iID0gcER1bW15TG5iOworCisgICAgICAgIGlmIChhY3RpdmVEcmNJbmRleCA9PSBoR2FpbkRlYy0+Y2hhbm5lbEdhaW5BY3RpdmVEcmNJbmRleCkKKyAgICAgICAgICBjaGFubmVsR2FpbiA9IHBEcmNHYWluQnVmZmVycy0+Y2hhbm5lbEdhaW5bY11bbG5iSXhdOworCisgICAgICAgIC8qIG51bWJlciBvZiBmcmFtZXMgb2Ygb2Zmc2V0IHdpdGggcmVzcGVjdCB0byBsbmJQb2ludGVyICovCisgICAgICAgIGxuYlBvaW50ZXJEaWZmID0gaSAtIChOVU1fTE5CX0ZSQU1FUyAtIDIpOworCisgICAgICAgIGVyciA9IF9wcm9jZXNzTm9kZVNlZ21lbnRzKAorICAgICAgICAgICAgaEdhaW5EZWMtPmZyYW1lU2l6ZSwgcExuYi0+Z2FpbkludGVycG9sYXRpb25UeXBlLAorICAgICAgICAgICAgcExuYi0+bk5vZGVzW2xuYkl4XSwgcExuYi0+bGluZWFyTm9kZVtsbmJJeF0sCisgICAgICAgICAgICBsbmJQb2ludGVyRGlmZiAqIGhHYWluRGVjLT5mcmFtZVNpemUgKyBkZWxheVNhbXBsZXMgKyBvZmZzZXQsIDEsCisgICAgICAgICAgICBub2RlUHJldmlvdXMsIGNoYW5uZWxHYWluLCBkZWludGVybGVhdmVkQXVkaW8pOworICAgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgICAgfQorICAgICAgZGVpbnRlcmxlYXZlZEF1ZGlvICs9IHRpbWVEYXRhQ2hhbm5lbE9mZnNldDsgLyogcHJvY2VlZCB0byBuZXh0IGNoYW5uZWwgKi8KKyAgICB9CisgIH0KKyAgcmV0dXJuIERFX09LOworfQorCisvKiBwcm9jZXNzIERSQyBvbiBzdWJiYW5kLWRvbWFpbiBzaWduYWwgKi8KK0RSQ19FUlJPUgorcHJvY2Vzc0RyY1N1YmJhbmQoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsIGNvbnN0IGludCBhY3RpdmVEcmNJbmRleCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkZWxheVNhbXBsZXMsIGNvbnN0IGludCBjaGFubmVsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGRyY0NoYW5uZWxPZmZzZXQsIGNvbnN0IGludCBudW1DaGFubmVsc1Byb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBwcm9jZXNzU2luZ2xlVGltZXNsb3QsCisgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogZGVpbnRlcmxlYXZlZEF1ZGlvUmVhbFtdLAorICAgICAgICAgICAgICAgICAgRklYUF9EQkwqIGRlaW50ZXJsZWF2ZWRBdWRpb0ltYWdbXSkgeworICBEUkNfRVJST1IgZXJyID0gREVfT0s7CisgIGludCBiLCBjLCBnLCBtLCBtX3N0YXJ0LCBtX3N0b3AsIHMsIGk7CisgIEZJWFBfREJMIGdhaW5TYjsKKyAgRFJDX0lOU1RSVUNUSU9OU19VTklfRFJDKiBwSW5zdCA9IGhHYWluRGVjLT5hY3RpdmVEcmNbYWN0aXZlRHJjSW5kZXhdLnBJbnN0OworICBEUkNfR0FJTl9CVUZGRVJTKiBwRHJjR2FpbkJ1ZmZlcnMgPSAmKGhHYWluRGVjLT5kcmNHYWluQnVmZmVycyk7CisgIEFDVElWRV9EUkMqIHBBY3RpdmVEcmMgPSAmKGhHYWluRGVjLT5hY3RpdmVEcmNbYWN0aXZlRHJjSW5kZXhdKTsKKyAgaW50IGFjdGl2ZURyY09mZnNldCA9IHBBY3RpdmVEcmMtPmFjdGl2ZURyY09mZnNldDsKKyAgaW50IGxuYlBvaW50ZXIgPSBwRHJjR2FpbkJ1ZmZlcnMtPmxuYlBvaW50ZXIsIGxuYkl4OworICBMSU5FQVJfTk9ERV9CVUZGRVIqIHBMaW5lYXJOb2RlQnVmZmVyID0gcERyY0dhaW5CdWZmZXJzLT5saW5lYXJOb2RlQnVmZmVyOworICBGSVhQX0RCTCgqc3ViYmFuZEdhaW5zKVs0ICogMTAyNCAvIDI1Nl0gPSBoR2FpbkRlYy0+c3ViYmFuZEdhaW5zOworICBGSVhQX0RCTCogZHVtbXlTdWJiYW5kR2FpbnMgPSBoR2FpbkRlYy0+ZHVtbXlTdWJiYW5kR2FpbnM7CisgIFNVQkJBTkRfRE9NQUlOX01PREUgc3ViYmFuZERvbWFpbk1vZGUgPSBoR2FpbkRlYy0+c3ViYmFuZERvbWFpblN1cHBvcnRlZDsKKyAgaW50IHNpZ25hbEluZGV4ID0gMDsKKyAgaW50IGZyYW1lU2l6ZVNiID0gMDsKKyAgaW50IG5EZWNvZGVyU3ViYmFuZHM7CisgIFNIT1JUIEwgPSAwOyAvKiBMOiBkb3duc2FtcGxpbmcgZmFjdG9yICovCisgIGludCBvZmZzZXQgPSAwOworICBGSVhQX0RCTCAqYXVkaW9SZWFsID0gTlVMTCwgKmF1ZGlvSW1hZyA9IE5VTEw7CisKKyAgaWYgKGhHYWluRGVjLT5kZWxheU1vZGUgPT0gRE1fUkVHVUxBUl9ERUxBWSkgeworICAgIG9mZnNldCA9IGhHYWluRGVjLT5mcmFtZVNpemU7CisgIH0KKworICBpZiAoKGRlbGF5U2FtcGxlcyArIG9mZnNldCkgPgorICAgICAgKE5VTV9MTkJfRlJBTUVTIC0gMikgKgorICAgICAgICAgIGhHYWluRGVjLT5mcmFtZVNpemUpIC8qIGlmIGRlbGF5U2FtcGxlcyBpcyB0b28gYmlnLCBOVU1fTE5CX0ZSQU1FUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBpbmNyZWFzZWQgKi8KKyAgICByZXR1cm4gREVfTk9UX09LOworCisgIHN3aXRjaCAoc3ViYmFuZERvbWFpbk1vZGUpIHsKKyNpZiAoKDEwMjQgLyAyNTYpID49ICg0MDk2IC8gU1VCQkFORF9ET1dOU0FNUExJTkdfRkFDVE9SX1FNRjY0KSkKKyAgICBjYXNlIFNETV9RTUY2NDoKKyAgICAgIG5EZWNvZGVyU3ViYmFuZHMgPSBTVUJCQU5EX05VTV9CQU5EU19RTUY2NDsKKyAgICAgIEwgPSBTVUJCQU5EX0RPV05TQU1QTElOR19GQUNUT1JfUU1GNjQ7CisgICAgICAvKiBhbmFseXNpc0RlbGF5ID0gU1VCQkFORF9BTkFMWVNJU19ERUxBWV9RTUY2NDsgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0RNX1FNRjcxOgorICAgICAgbkRlY29kZXJTdWJiYW5kcyA9IFNVQkJBTkRfTlVNX0JBTkRTX1FNRjcxOworICAgICAgTCA9IFNVQkJBTkRfRE9XTlNBTVBMSU5HX0ZBQ1RPUl9RTUY3MTsKKyAgICAgIC8qIGFuYWx5c2lzRGVsYXkgPSBTVUJCQU5EX0FOQUxZU0lTX0RFTEFZX1FNRjcxOyAqLworICAgICAgYnJlYWs7CisjZWxzZQorICAgIGNhc2UgU0RNX1FNRjY0OgorICAgIGNhc2UgU0RNX1FNRjcxOgorICAgICAgLyogUU1GIGRvbWFpbiBwcm9jZXNzaW5nIGlzIG5vdCBzdXBwb3J0ZWQuICovCisgICAgICByZXR1cm4gREVfTk9UX09LOworI2VuZGlmCisgICAgY2FzZSBTRE1fU1RGVDI1NjoKKyAgICAgIG5EZWNvZGVyU3ViYmFuZHMgPSBTVUJCQU5EX05VTV9CQU5EU19TVEZUMjU2OworICAgICAgTCA9IFNVQkJBTkRfRE9XTlNBTVBMSU5HX0ZBQ1RPUl9TVEZUMjU2OworICAgICAgLyogYW5hbHlzaXNEZWxheSA9IFNVQkJBTkRfQU5BTFlTSVNfREVMQVlfU1RGVDI1NjsgKi8KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gREVfTk9UX09LOworICB9CisKKyAgLyogZnJhbWVTaXplU2IgPSBoR2FpbkRlYy0+ZnJhbWVTaXplL0w7ICovIC8qIEwgaXMgYSBwb3dlciBvZiAyICovCisgIGZyYW1lU2l6ZVNiID0KKyAgICAgIGhHYWluRGVjLT5mcmFtZVNpemUgPj4gKDE1IC0gZml4bm9ybXpfUyhMKSk7IC8qIHRpbWVzbG90cyBwZXIgZnJhbWUgKi8KKworICBpZiAoKHByb2Nlc3NTaW5nbGVUaW1lc2xvdCA8IDApIHx8IChwcm9jZXNzU2luZ2xlVGltZXNsb3QgPj0gZnJhbWVTaXplU2IpKSB7CisgICAgbV9zdGFydCA9IDA7CisgICAgbV9zdG9wID0gZnJhbWVTaXplU2I7CisgIH0gZWxzZSB7CisgICAgbV9zdGFydCA9IHByb2Nlc3NTaW5nbGVUaW1lc2xvdDsKKyAgICBtX3N0b3AgPSBtX3N0YXJ0ICsgMTsKKyAgfQorCisgIGVyciA9IF9wcmVwYXJlTG5iSW5kZXgocEFjdGl2ZURyYywgY2hhbm5lbE9mZnNldCwgZHJjQ2hhbm5lbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVsc1Byb2Nlc3NlZCwgbG5iUG9pbnRlcik7CisgIGlmIChlcnIpIHJldHVybiBlcnI7CisKKyAgaWYgKCFwQWN0aXZlRHJjLT5zdWJiYW5kR2FpbnNSZWFkeSkgLyogb25seSBmb3IgdGhlIGZpcnN0IHRpbWUgcGVyIGZyYW1lIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RyY1N1YmJhbmQgaXMgY2FsbGVkICovCisgIHsKKyAgICAvKiB3cml0ZSBzdWJiYW5kR2FpbnMgKi8KKyAgICBmb3IgKGcgPSAwOyBnIDwgcEluc3QtPm5EcmNDaGFubmVsR3JvdXBzOyBnKyspIHsKKyAgICAgIGIgPSAwOworICAgICAgeworICAgICAgICBMSU5FQVJfTk9ERV9CVUZGRVIqIHBMbmIgPQorICAgICAgICAgICAgJihwTGluZWFyTm9kZUJ1ZmZlclthY3RpdmVEcmNPZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWN0aXZlRHJjLT5nYWluRWxlbWVudEZvckdyb3VwW2ddICsgYl0pOworICAgICAgICBOT0RFX0xJTiBub2RlUHJldmlvdXM7CisgICAgICAgIGludCBsbmJQb2ludGVyRGlmZjsKKworICAgICAgICBmb3IgKG0gPSAwOyBtIDwgZnJhbWVTaXplU2I7IG0rKykgeworICAgICAgICAgIHN1YmJhbmRHYWluc1thY3RpdmVEcmNPZmZzZXQgKyBnXVtiICogZnJhbWVTaXplU2IgKyBtXSA9CisgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgNykpOworICAgICAgICB9CisKKyAgICAgICAgbG5iSXggPSBsbmJQb2ludGVyIC0gKE5VTV9MTkJfRlJBTUVTIC0gMSk7CisgICAgICAgIHdoaWxlIChsbmJJeCA8IDApIGxuYkl4ICs9IE5VTV9MTkJfRlJBTUVTOworCisgICAgICAgIC8qIExvb3Agb3ZlciBhbGwgbm9kZSBidWZmZXJzIGluIGxpbmVhck5vZGVCdWZmZXIuCisgICAgICAgICAgIEFsbCBub2RlcyB3aGljaCBhcmUgbm90IHJlbGV2YW50IGZvciB0aGUgY3VycmVudCBmcmFtZSBhcmUgc29ydGVkIG91dAorICAgICAgICAgICBpbnNpZGUgX3Byb2Nlc3NOb2RlU2VnbWVudHMuICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTE5CX0ZSQU1FUyAtIDE7IGkrKykgeworICAgICAgICAgIC8qIFByZXBhcmUgcHJldmlvdXMgbm9kZSAqLworICAgICAgICAgIG5vZGVQcmV2aW91cyA9IHBMbmItPmxpbmVhck5vZGVbbG5iSXhdW3BMbmItPm5Ob2Rlc1tsbmJJeF0gLSAxXTsKKyAgICAgICAgICBub2RlUHJldmlvdXMudGltZSAtPSBoR2FpbkRlYy0+ZnJhbWVTaXplOworCisgICAgICAgICAgbG5iSXgrKzsKKyAgICAgICAgICBpZiAobG5iSXggPj0gTlVNX0xOQl9GUkFNRVMpIGxuYkl4ID0gMDsKKworICAgICAgICAgIC8qIG51bWJlciBvZiBmcmFtZXMgb2Ygb2Zmc2V0IHdpdGggcmVzcGVjdCB0byBsbmJQb2ludGVyICovCisgICAgICAgICAgbG5iUG9pbnRlckRpZmYgPSBpIC0gKE5VTV9MTkJfRlJBTUVTIC0gMik7CisKKyAgICAgICAgICBlcnIgPSBfcHJvY2Vzc05vZGVTZWdtZW50cygKKyAgICAgICAgICAgICAgaEdhaW5EZWMtPmZyYW1lU2l6ZSwgcExuYi0+Z2FpbkludGVycG9sYXRpb25UeXBlLAorICAgICAgICAgICAgICBwTG5iLT5uTm9kZXNbbG5iSXhdLCBwTG5iLT5saW5lYXJOb2RlW2xuYkl4XSwKKyAgICAgICAgICAgICAgbG5iUG9pbnRlckRpZmYgKiBoR2FpbkRlYy0+ZnJhbWVTaXplICsgZGVsYXlTYW1wbGVzICsgb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICAgIChMIC0gMSkgLyAyLAorICAgICAgICAgICAgICBMLCBub2RlUHJldmlvdXMsIEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoZmxvYXQpKDEgPDwgOCkpLAorICAgICAgICAgICAgICAmKHN1YmJhbmRHYWluc1thY3RpdmVEcmNPZmZzZXQgKyBnXVtiICogZnJhbWVTaXplU2JdKSk7CisgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBwQWN0aXZlRHJjLT5zdWJiYW5kR2FpbnNSZWFkeSA9IDE7CisgIH0KKworICBmb3IgKGMgPSBjaGFubmVsT2Zmc2V0OyBjIDwgY2hhbm5lbE9mZnNldCArIG51bUNoYW5uZWxzUHJvY2Vzc2VkOyBjKyspIHsKKyAgICBGSVhQX0RCTCogdGhpc1N1YmJhbmRHYWluc0J1ZmZlcjsKKyAgICBpZiAocEluc3QtPmRyY1NldElkID4gMCkKKyAgICAgIGcgPSBwQWN0aXZlRHJjLT5jaGFubmVsR3JvdXBGb3JDaGFubmVsW2MgKyBkcmNDaGFubmVsT2Zmc2V0XTsKKyAgICBlbHNlCisgICAgICBnID0gLTE7CisKKyAgICBhdWRpb1JlYWwgPSBkZWludGVybGVhdmVkQXVkaW9SZWFsW3NpZ25hbEluZGV4XTsKKyAgICBpZiAoc3ViYmFuZERvbWFpbk1vZGUgIT0gU0RNX1NURlQyNTYpIHsKKyAgICAgIGF1ZGlvSW1hZyA9IGRlaW50ZXJsZWF2ZWRBdWRpb0ltYWdbc2lnbmFsSW5kZXhdOworICAgIH0KKworICAgIGlmICgoZyA+PSAwKSAmJiAhcEFjdGl2ZURyYy0+Y2hhbm5lbEdyb3VwSXNQYXJhbWV0cmljRHJjW2ddKSB7CisgICAgICB0aGlzU3ViYmFuZEdhaW5zQnVmZmVyID0gc3ViYmFuZEdhaW5zW2FjdGl2ZURyY09mZnNldCArIGddOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzU3ViYmFuZEdhaW5zQnVmZmVyID0gZHVtbXlTdWJiYW5kR2FpbnM7CisgICAgfQorCisgICAgZm9yIChtID0gbV9zdGFydDsgbSA8IG1fc3RvcDsgbSsrKSB7CisgICAgICBJTlQgbl9taW4gPSA4OworICAgICAgeyAvKiBzaW5nbGUtYmFuZCBEUkMgKi8KKyAgICAgICAgZ2FpblNiID0gdGhpc1N1YmJhbmRHYWluc0J1ZmZlclttXTsKKyAgICAgICAgaWYgKGFjdGl2ZURyY0luZGV4ID09IGhHYWluRGVjLT5jaGFubmVsR2FpbkFjdGl2ZURyY0luZGV4KQorICAgICAgICAgIGdhaW5TYiA9IFNBVFVSQVRFX0xFRlRfU0hJRlQoCisgICAgICAgICAgICAgIGZNdWx0RGl2MihnYWluU2IsIGhHYWluRGVjLT5jaGFubmVsR2FpbltjXSksIDksIERGUkFDVF9CSVRTKTsKKyAgICAgICAgLyogbm9ybWFsaXplIGdhaW5TYiBmb3Iga2VlcGluZyBzaWduYWwgcHJlY2lzaW9uICovCisgICAgICAgIG5fbWluID0gZk1pbihDbnRMZWFkaW5nWmVyb3MoZ2FpblNiKSAtIDEsIG5fbWluKTsKKyAgICAgICAgZ2FpblNiIDw8PSBuX21pbjsKKyAgICAgICAgbl9taW4gPSA4IC0gbl9taW47CisgICAgICAgIGlmIChzdWJiYW5kRG9tYWluTW9kZSA9PQorICAgICAgICAgICAgU0RNX1NURlQyNTYpIHsgLyogRm9yIFNURlQgZmlsdGVyYmFuaywgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsZWF2ZWQuICovCisgICAgICAgICAgZm9yIChzID0gMDsgcyA8IG5EZWNvZGVyU3ViYmFuZHM7IHMrKykgeworICAgICAgICAgICAgKmF1ZGlvUmVhbCA9IGZNdWx0RGl2MigqYXVkaW9SZWFsLCBnYWluU2IpIDw8IG5fbWluOworICAgICAgICAgICAgYXVkaW9SZWFsKys7CisgICAgICAgICAgICAqYXVkaW9SZWFsID0gZk11bHREaXYyKCphdWRpb1JlYWwsIGdhaW5TYikgPDwgbl9taW47CisgICAgICAgICAgICBhdWRpb1JlYWwrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChzID0gMDsgcyA8IG5EZWNvZGVyU3ViYmFuZHM7IHMrKykgeworICAgICAgICAgICAgKmF1ZGlvUmVhbCA9IGZNdWx0RGl2MigqYXVkaW9SZWFsLCBnYWluU2IpIDw8IG5fbWluOworICAgICAgICAgICAgYXVkaW9SZWFsKys7CisgICAgICAgICAgICAqYXVkaW9JbWFnID0gZk11bHREaXYyKCphdWRpb0ltYWcsIGdhaW5TYikgPDwgbl9taW47CisgICAgICAgICAgICBhdWRpb0ltYWcrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgc2lnbmFsSW5kZXgrKzsKKyAgfQorICByZXR1cm4gREVfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJEUkNkZWMvc3JjL2RyY0dhaW5EZWNfcHJvY2Vzcy5oIGIvbGliRFJDZGVjL3NyYy9kcmNHYWluRGVjX3Byb2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzUxYWJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliRFJDZGVjL3NyYy9kcmNHYWluRGVjX3Byb2Nlc3MuaApAQCAtMCwwICsxLDExOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHLUQgRFJDIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIERSQ0dBSU5ERUNfUFJPQ0VTU19ICisjZGVmaW5lIERSQ0dBSU5ERUNfUFJPQ0VTU19ICisKK0RSQ19FUlJPUgorcHJvY2Vzc0RyY1RpbWUoSEFORExFX0RSQ19HQUlOX0RFQ09ERVIgaEdhaW5EZWMsIGNvbnN0IGludCBhY3RpdmVEcmNJbmRleCwKKyAgICAgICAgICAgICAgIGNvbnN0IGludCBkZWxheVNhbXBsZXMsIGNvbnN0IGludCBjaGFubmVsT2Zmc2V0LAorICAgICAgICAgICAgICAgY29uc3QgaW50IGRyY0NoYW5uZWxPZmZzZXQsIGNvbnN0IGludCBudW1DaGFubmVsc1Byb2Nlc3NlZCwKKyAgICAgICAgICAgICAgIGNvbnN0IGludCB0aW1lRGF0YUNoYW5uZWxPZmZzZXQsIEZJWFBfREJMKiBkZWludGVybGVhdmVkQXVkaW8pOworCitEUkNfRVJST1IKK3Byb2Nlc3NEcmNTdWJiYW5kKEhBTkRMRV9EUkNfR0FJTl9ERUNPREVSIGhHYWluRGVjLCBjb25zdCBpbnQgYWN0aXZlRHJjSW5kZXgsCisgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZGVsYXlTYW1wbGVzLCBjb25zdCBpbnQgY2hhbm5lbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkcmNDaGFubmVsT2Zmc2V0LCBjb25zdCBpbnQgbnVtQ2hhbm5lbHNQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcHJvY2Vzc1NpbmdsZVRpbWVzbG90LAorICAgICAgICAgICAgICAgICAgRklYUF9EQkwqIGRlaW50ZXJsZWF2ZWRBdWRpb1JlYWxbXSwKKyAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiBkZWludGVybGVhdmVkQXVkaW9JbWFnW10pOworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9GREtfYXJjaGRlZi5oIGIvbGliRkRLL2luY2x1ZGUvRkRLX2FyY2hkZWYuaAppbmRleCA1ZGJjMTM4Li45NTYwMWJiIDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9GREtfYXJjaGRlZi5oCisrKyBiL2xpYkZESy9pbmNsdWRlL0ZES19hcmNoZGVmLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNzQgKzkwLDc2IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOgorCiAgICBEZXNjcmlwdGlvbjoKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfX0FSQ0hfSF9fCi0jZGVmaW5lIF9fQVJDSF9IX18KKyNpZm5kZWYgRkRLX0FSQ0hERUZfSAorI2RlZmluZSBGREtfQVJDSERFRl9ICiAKLS8qIFBlcmZvcm1hbmNlIC8gUXVhbGl0eSBwcm9maWxlIHNlbGVjdG9yICovCi0gICNkZWZpbmUgRkRLX0hJR0hfUEVSRk9STUFOQ0UKKy8qIFVuaWZ5IHNvbWUgZmV3IHRvb2xjaGFpbiBzcGVjaWZpYyBkZWZpbmVzIHRvIGF2b2lkIGhhdmluZyBsYXJnZSAib3IiIG1hY3JvCisgKiBjb250cmFwdGlvbnMgYWxsIG92ZXIgdGhlIHNvdXJjZSBjb2RlLiAqLwogCi0vKiBVbmlmeSBzb21lIGZldyB0b29sY2hhaW4gc3BlY2lmaWMgZGVmaW5lcyB0byBhdm9pZCBoYXZpbmcgbGFyZ2UgIm9yIiBtYWNybyBjb250cmFwdGlvbnMgYWxsIG92ZXIgdGhlIHNvdXJjZSBjb2RlLiAqLwotCi0vKiBUYWtlIGFjdGlvbiBhZ2FpbnN0IFZpc3VhbFN0dWRpbyAyMDA1IGNyb3NzY29tcGlsZSBwcm9ibGVtcy4gKi8KLQotLyogVXNlIHNpbmdsZSBtYWNybyAodGhlIEdDQyBidWlsdCBpbiBtYWNybykgZm9yIGFyY2hpdGVjdHVyZSBpZGVudGlmaWNhdGlvbiBpbmRlcGVuZGVudCBvZiB0aGUgcGFydGljdWxhciB0b29sY2hhaW4gKi8KLSNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9faTQ4Nl9fKSB8fCBkZWZpbmVkKF9faTU4Nl9fKSB8fCBkZWZpbmVkKF9faTY4Nl9fKSB8fCAoZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfTV9JWDg2KSkgfHwgZGVmaW5lZCAoX194ODZfNjRfXykKKy8qIFVzZSBzaW5nbGUgbWFjcm8gKHRoZSBHQ0MgYnVpbHQgaW4gbWFjcm8pIGZvciBhcmNoaXRlY3R1cmUgaWRlbnRpZmljYXRpb24KKyAqIGluZGVwZW5kZW50IG9mIHRoZSBwYXJ0aWN1bGFyIHRvb2xjaGFpbiAqLworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19pNDg2X18pIHx8IGRlZmluZWQoX19pNTg2X18pIHx8ICBcCisgICAgZGVmaW5lZChfX2k2ODZfXykgfHwgKGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX01fSVg4NikpIHx8IFwKKyAgICAoZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfTV9YNjQpKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCiAjZGVmaW5lIF9feDg2X18KICNlbmRpZgogCi0jaWYgKGRlZmluZWQoX01fQVJNKSB8fCBkZWZpbmVkKF9fQ0NfQVJNKSkgJiYgIWRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX1RJX1RNUzQ3MF9WNV9fKSAmJiAhZGVmaW5lZChfX2FybV9fKQorI2lmIGRlZmluZWQoX01fQVJNKSAmJiAhZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9fYWFyY2g2NF9fKQogI2RlZmluZSBfX2FybV9fCiAjZW5kaWYKIAotCi0KKyNpZiAoX19UQVJHRVRfQVJDSF9BUk0gPT0gNSkgfHwgZGVmaW5lZChfX1RBUkdFVF9GRUFUVVJFX0RTUE1VTCkgfHwgXAorICAgIChfTV9BUk0gPT0gNSkgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzVURUpfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzdFTV9fKQogLyogRGVmaW5lIF9fQVJNX0FSQ0hfNVRFX18gaWYgYXJtdjV0ZSBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkICAqLwotI2lmIChfX1RBUkdFVF9BUkNIX0FSTSA9PSA1KSB8fCBkZWZpbmVkKF9fVEFSR0VUX0ZFQVRVUkVfRFNQTVVMKSB8fCAoX01fQVJNID09IDUpIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VEVKX18pIHx8IGRlZmluZWQoX19USV9UTVM0NzBfVjVfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzdFTV9fKQogI2RlZmluZSBfX0FSTV9BUkNIXzVURV9fCiAjZW5kaWYKIAorI2lmIChfX1RBUkdFVF9BUkNIX0FSTSA9PSA2KSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNkpfXykgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF82WktfXykKIC8qIERlZmluZSBfX0FSTV9BUkNIXzZfXyBpZiB0aGUgYXJtdjYgaW50cnVjdGlvbnMgYXJlIGJlaW5nIHN1cHBvcnRlZC4gKi8KLSNpZiAoX19UQVJHRVRfQVJDSF9BUk0gPT0gNikgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZKX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF82WktfXykKICNkZWZpbmUgX19BUk1fQVJDSF81VEVfXwogI2RlZmluZSBfX0FSTV9BUkNIXzZfXwogI2VuZGlmCiAKLS8qIERlZmluZSBfX0FSTV9BUkNIXzdfQV9fIGlmIHRoZSBhcm12NyBpbnRydWN0aW9ucyBhcmUgYmVpbmcgc3VwcG9ydGVkLiAqLwogI2lmIGRlZmluZWQoX19UQVJHRVRfQVJDSF83X1IpIHx8IGRlZmluZWQoX19BUk1fQVJDSF83Ul9fKQorLyogRGVmaW5lIF9fQVJNX0FSQ0hfN19BX18gaWYgdGhlIGFybXY3IGludHJ1Y3Rpb25zIGFyZSBiZWluZyBzdXBwb3J0ZWQuICovCiAjZGVmaW5lIF9fQVJNX0FSQ0hfNVRFX18KICNkZWZpbmUgX19BUk1fQVJDSF82X18KICNkZWZpbmUgX19BUk1fQVJDSF83X1JfXwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKF9fVEFSR0VUX0FSQ0hfN19BKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN0FfXykgfHwgXAorICAgICgoX19BUk1fQVJDSCA9PSA4KSAmJiAoX19BUk1fMzJCSVRfU1RBVEUgPT0gMSkpCiAvKiBEZWZpbmUgX19BUk1fQVJDSF83X0FfXyBpZiB0aGUgYXJtdjcgaW50cnVjdGlvbnMgYXJlIGJlaW5nIHN1cHBvcnRlZC4gKi8KLSNpZiBkZWZpbmVkKF9fVEFSR0VUX0FSQ0hfN19BKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN0FfXykKICNkZWZpbmUgX19BUk1fQVJDSF81VEVfXwogI2RlZmluZSBfX0FSTV9BUkNIXzZfXwogI2RlZmluZSBfX0FSTV9BUkNIXzdfQV9fCiAjZW5kaWYKIAotLyogRGVmaW5lIF9fQVJNX0FSQ0hfN01fXyBpZiB0aGUgQVJNdjctTSBpbnN0cnVjdGlvbnMgYXJlIGJlaW5nIHN1cHBvcnRlZCwgZS5nLiBDb3J0ZXgtTTMuICovCiAjaWYgZGVmaW5lZChfX1RBUkdFVF9BUkNIXzdfTSkgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzdfTV9fKQorLyogRGVmaW5lIF9fQVJNX0FSQ0hfN01fXyBpZiB0aGUgQVJNdjctTSBpbnN0cnVjdGlvbnMgYXJlIGJlaW5nIHN1cHBvcnRlZCwgZS5nLgorICogQ29ydGV4LU0zLiAqLwogI2RlZmluZSBfX0FSTV9BUkNIXzdNX18KICNlbmRpZgogCi0vKiBEZWZpbmUgX19BUk1fQVJDSF83RU1fXyBpZiB0aGUgQVJNdjctTUUgaW5zdHJ1Y3Rpb25zIGFyZSBiZWluZyBzdXBwb3J0ZWQsIGUuZy4gQ29ydGV4LU00LiAqLwogI2lmIGRlZmluZWQoX19UQVJHRVRfQVJDSF83RV9NKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN0VfTV9fKQorLyogRGVmaW5lIF9fQVJNX0FSQ0hfN0VNX18gaWYgdGhlIEFSTXY3LU1FIGluc3RydWN0aW9ucyBhcmUgYmVpbmcgc3VwcG9ydGVkLAorICogZS5nLiBDb3J0ZXgtTTQuICovCiAjZGVmaW5lIF9fQVJNX0FSQ0hfN0VNX18KICNlbmRpZgogCi0vKiBEZXRlY3QgYW5kIHVuaWZ5IG1hY3JvcyBmb3IgbmVvbiBmZWF0dXJlLiAqLwotI2lmIGRlZmluZWQoX19UQVJHRVRfRkVBVFVSRV9ORU9OKSAmJiAhZGVmaW5lZChfX0FSTV9ORU9OX18pCi0jZGVmaW5lIF9fQVJNX05FT05fXworI2lmIGRlZmluZWQoX19hYXJjaDY0X18pCisjZGVmaW5lIF9fQVJNX0FSQ0hfOF9fCiAjZW5kaWYKIAogI2lmZGVmIF9NX0FSTQpAQCAtMTU0LDE4ICsxNjcsMjMgQEAKICNpbmNsdWRlICJhcm1pbnRyLmgiCiAjZW5kaWYKIAotCiAvKiBEZWZpbmUgcHJlZmVycmVkIE11bHRpcGxpY2F0aW9uIHR5cGUgKi8KLSNpZiBkZWZpbmVkKEZES19ISUdIX1BFUkZPUk1BTkNFKSAmJiAhZGVmaW5lZChGREtfSElHSF9RVUFMSVRZKSAvKiBGREtfSElHSF9QRVJGT1JNQU5DRSAqLwogCi0jaWYgZGVmaW5lZChfX21pcHNfXykgfHwgZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX3NoX18pCisjaWYgZGVmaW5lZChfX21pcHNfXykKICNkZWZpbmUgQVJDSF9QUkVGRVJfTVVMVF8xNngxNgogI3VuZGVmIFNJTkVUQUJMRV8xNkJJVAogI3VuZGVmIFBPVzJDT0VGRl8xNkJJVAogI3VuZGVmIExEQ09FRkZfMTZCSVQKICN1bmRlZiBXSU5ET1dUQUJMRV8xNkJJVAogCi0jZWxpZiBkZWZpbmVkKF9fYXJtX18pICYmIGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCisjZWxpZiBkZWZpbmVkKF9fYXJtX18pICYmIGRlZmluZWQoX19BUk1fQVJDSF84X18pCisjZGVmaW5lIEFSQ0hfUFJFRkVSX01VTFRfMzJ4MTYKKyNkZWZpbmUgU0lORVRBQkxFXzE2QklUCisjZGVmaW5lIFBPVzJDT0VGRl8xNkJJVAorI2RlZmluZSBMRENPRUZGXzE2QklUCisjZGVmaW5lIFdJTkRPV1RBQkxFXzE2QklUCisKKyNlbGlmIGRlZmluZWQoX19hcm1fXykgJiYgZGVmaW5lZChfX0FSTV9BUkNIXzVURV9fKQogI2RlZmluZSBBUkNIX1BSRUZFUl9NVUxUXzMyeDE2CiAjZGVmaW5lIFNJTkVUQUJMRV8xNkJJVAogI2RlZmluZSBQT1cyQ09FRkZfMTZCSVQKQEAgLTE5NCw3ICsyMTIsNyBAQAogI3VuZGVmIFBPVzJDT0VGRl8xNkJJVAogI3VuZGVmIExEQ09FRkZfMTZCSVQKIAotI2VsaWYgZGVmaW5lZChfX3g4Nl9fKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCisjZWxpZiBkZWZpbmVkKF9feDg2X18pCiAjZGVmaW5lIEFSQ0hfUFJFRkVSX01VTFRfMzJ4MTYKICNkZWZpbmUgU0lORVRBQkxFXzE2QklUCiAjZGVmaW5lIFdJTkRPV1RBQkxFXzE2QklUCkBAIC0yMDIsNDQgKzIyMCw0MCBAQAogI2RlZmluZSBMRENPRUZGXzE2QklUCiAKICNlbHNlCi0KLSAgI3dhcm5pbmcgID4+Pj4gUGxlYXNlIHNldCBhcmNoaXRlY3R1cmUgY2hhcmFjdGVyaXphdGlvbiBkZWZpbmVzIGZvciB5b3VyIHBsYXRmb3JtIChGREtfSElHSF9QRVJGT1JNQU5DRSkhIDw8PDwKKyN3YXJuaW5nID4+Pj4gUGxlYXNlIHNldCBhcmNoaXRlY3R1cmUgY2hhcmFjdGVyaXphdGlvbiBkZWZpbmVzIGZvciB5b3VyIHBsYXRmb3JtIChGREtfSElHSF9QRVJGT1JNQU5DRSkhIDw8PDwKIAogI2VuZGlmIC8qIEFyY2hpdGVjdHVyZSBzd2l0Y2hlcyAqLwogCi0jZWxzZSAvKiBuZWl0aGVyIEZES19ISUdIX1FVQUxJVFkgb3IgRkRLX0hJR0hfUEVSRk9STUFOQ0UgKi8KLQotI2Vycm9yIEVpdGhlciBzZXQgRkRLX0hJR0hfUVVBTElUWSBvciBGREtfSElHSF9QRVJGT1JNQU5DRSwgYnV0IG5vdCBib3RoIG5vciBub25lIG9mIHRoZW0uCi0KLSNlbmRpZiAvKiBFbmQgb2YgcXVhbGl0eS9jb21wbGV4aXR5IHRyYWRlb2ZmICovCi0KLSNkZWZpbmUgRkRLVE9PTFNfUEFDS0VEX1RBQkxFUwotCi0KICNpZmRlZiBTSU5FVEFCTEVfMTZCSVQKLSAgI2RlZmluZSBGSVhQX1NUQiBGSVhQX1NHTCAgICAgLyogU1RCIHNpbnVzIFRhYiB1c2VkIGluIHRyYW5zZm9ybWF0aW9uICovCi0gICNkZWZpbmUgRklYUF9TVFAgRklYUF9TUEsKLSAgI2RlZmluZSBTVEMoYSkgKEZYX0RCTDJGWENPTlNUX1NHTChhKSkKKyNkZWZpbmUgRklYUF9TVEIgRklYUF9TR0wgLyogU1RCIHNpbnVzIFRhYiB1c2VkIGluIHRyYW5zZm9ybWF0aW9uICovCisjZGVmaW5lIEZJWFBfU1RQIEZJWFBfU1BLCisjZGVmaW5lIFNUQyhhKSAoRlhfREJMMkZYQ09OU1RfU0dMKGEpKQogI2Vsc2UKLSAgI2RlZmluZSBGSVhQX1NUQiBGSVhQX0RCTAotICAjZGVmaW5lIEZJWFBfU1RQIEZJWFBfRFBLCi0gICNkZWZpbmUgU1RDKGEpICgoRklYUF9EQkwpKExPTkcpKGEpKQorI2RlZmluZSBGSVhQX1NUQiBGSVhQX0RCTAorI2RlZmluZSBGSVhQX1NUUCBGSVhQX0RQSworI2RlZmluZSBTVEMoYSkgKChGSVhQX0RCTCkoTE9ORykoYSkpCiAjZW5kaWYgLyogZGVmaW5lZChTSU5FVEFCTEVfMTZCSVQpICovCiAKLSNkZWZpbmUgU1RDUChjb3Msc2luKSB7IHsgU1RDKGNvcyksIFNUQyhzaW4pIH0gfQotCisjZGVmaW5lIFNUQ1AoY29zLCBzaW4pICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBTVEMoY29zKSwgU1RDKHNpbikgfSBcCisgIH0KIAogI2lmZGVmIFdJTkRPV1RBQkxFXzE2QklUCi0gICNkZWZpbmUgRklYUF9XVEIgRklYUF9TR0wgLyogc2luZ2xlIEZJWFBfU0dMIHZhbHVlcyAqLwotICAjZGVmaW5lIEZJWFBfV1RQIEZJWFBfU1BLIC8qIHBhY2tlZCBGSVhQX1NHTCB2YWx1ZXMgKi8KLSAgI2RlZmluZSBXVEMoYSkgRlhfREJMMkZYQ09OU1RfU0dMKGEpCisjZGVmaW5lIEZJWFBfV1RCIEZJWFBfU0dMIC8qIHNpbmdsZSBGSVhQX1NHTCB2YWx1ZXMgKi8KKyNkZWZpbmUgRlhfREJMMkZYX1dUQih4KSBGWF9EQkwyRlhfU0dMKHgpCisjZGVmaW5lIEZJWFBfV1RQIEZJWFBfU1BLIC8qIHBhY2tlZCBGSVhQX1NHTCB2YWx1ZXMgKi8KKyNkZWZpbmUgV1RDKGEpIEZYX0RCTDJGWENPTlNUX1NHTChhKQogI2Vsc2UgLyogU0lORVRBQkxFXzE2QklUICovCi0gICNkZWZpbmUgRklYUF9XVEIgRklYUF9EQkwKLSAgI2RlZmluZSBGSVhQX1dUUCBGSVhQX0RQSwotICAjZGVmaW5lIFdUQyhhKSAoRklYUF9EQkwpKGEpCisjZGVmaW5lIEZJWFBfV1RCIEZJWFBfREJMCisjZGVmaW5lIEZYX0RCTDJGWF9XVEIoeCkgKHgpCisjZGVmaW5lIEZJWFBfV1RQIEZJWFBfRFBLCisjZGVmaW5lIFdUQyhhKSAoRklYUF9EQkwpKGEpCiAjZW5kaWYgLyogU0lORVRBQkxFXzE2QklUICovCiAKLSNkZWZpbmUgV1RDUChhLGIpIHsgeyBXVEMoYSksIFdUQyhiKSB9IH0KKyNkZWZpbmUgV1RDUChhLCBiKSAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBXVEMoYSksIFdUQyhiKSB9IFwKKyAgfQogCi0KLSNlbmRpZiAvKiBfX0FSQ0hfSF9fICovCisjZW5kaWYgLyogRkRLX0FSQ0hERUZfSCAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvRkRLX2JpdGJ1ZmZlci5oIGIvbGliRkRLL2luY2x1ZGUvRkRLX2JpdGJ1ZmZlci5oCmluZGV4IDY1ZmEwNGIuLmVkMGIyZjYgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL0ZES19iaXRidWZmZXIuaAorKysgYi9saWJGREsvaW5jbHVkZS9GREtfYml0YnVmZmVyLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjQgKzkwLDI2IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIE0uIExvaHdhc3NlcgorCiAgICBEZXNjcmlwdGlvbjogY29tbW9uIGJpdGJ1ZmZlciByZWFkL3dyaXRlIHJvdXRpbmVzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgX19GREtfQklUQlVGRkVSX0hfXwotI2RlZmluZSBfX0ZES19CSVRCVUZGRVJfSF9fCisjaWZuZGVmIEZES19CSVRCVUZGRVJfSAorI2RlZmluZSBGREtfQklUQlVGRkVSX0gKIAotCi0KKyNpbmNsdWRlICJGREtfYXJjaGRlZi5oIgogI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgogCi10eXBlZGVmIHN0cnVjdAoteworLyogbGVhdmUgMyBiaXRzIGhlYWRyb29tIHNvIE1BWF9CVUZTSVpFIGNhbiBiZSByZXByZXNlbnRlZCBpbiBiaXRzIGFzIHdlbGwuICovCisjZGVmaW5lIE1BWF9CVUZTSVpFX0JZVEVTICgweDEwMDAwMDAwKQorCit0eXBlZGVmIHN0cnVjdCB7CiAgIFVJTlQgVmFsaWRCaXRzOwogICBVSU5UIFJlYWRPZmZzZXQ7CiAgIFVJTlQgV3JpdGVPZmZzZXQ7CkBAIC0xMDQsNjMgKzExNyw2NyBAQAogICBVSU5UIEJpdE5keDsKIAogICBVQ0hBUiAqQnVmZmVyOwotICBVSU5UICAgYnVmU2l6ZTsKLSAgVUlOVCAgIGJ1ZkJpdHM7CisgIFVJTlQgYnVmU2l6ZTsKKyAgVUlOVCBidWZCaXRzOwogfSBGREtfQklUQlVGOwogCiB0eXBlZGVmIEZES19CSVRCVUYgKkhBTkRMRV9GREtfQklUQlVGOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKK2V4dGVybiAiQyIgewogI2VuZGlmCiAKLWV4dGVybiBjb25zdCBVSU5UIEJpdE1hc2sgWzMyKzFdOworZXh0ZXJuIGNvbnN0IFVJTlQgQml0TWFza1szMiArIDFdOwogCiAvKiogIFRoZSBCaXRCdWZmZXIgRnVuY3Rpb25zIGFyZSBjYWxsZWQgc3RyYWlnaHQgZnJvbSBGREtfYml0c3RyZWFtIEludGVyZmFjZS4KICAgICAgRm9yIEZ1bmN0aW9ucyBmdW5jdGlvbmFsIHN1cnZleSBsb29rIHRoZXJlLgogKi8KIAotdm9pZCBGREtfQ3JlYXRlQml0QnVmZmVyIChIQU5ETEVfRkRLX0JJVEJVRiAqaEJpdEJ1ZmZlciwgVUNIQVIgKnBCdWZmZXIsIFVJTlQgYnVmU2l6ZSkgOwordm9pZCBGREtfQ3JlYXRlQml0QnVmZmVyKEhBTkRMRV9GREtfQklUQlVGICpoQml0QnVmZmVyLCBVQ0hBUiAqcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGJ1ZlNpemUpOwogCi12b2lkIEZES19Jbml0Qml0QnVmZmVyICAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIFVDSEFSICpwQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGJ1ZlNpemUsIFVJTlQgdmFsaWRCaXRzKSA7Cit2b2lkIEZES19Jbml0Qml0QnVmZmVyKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIFVDSEFSICpwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGJ1ZlNpemUsIFVJTlQgdmFsaWRCaXRzKTsKIAotdm9pZCBGREtfUmVzZXRCaXRCdWZmZXIgIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyKSA7Cit2b2lkIEZES19SZXNldEJpdEJ1ZmZlcihIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyKTsKIAotdm9pZCBGREtfRGVsZXRlQml0QnVmZmVyIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyKSA7Cit2b2lkIEZES19EZWxldGVCaXRCdWZmZXIoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlcik7CiAKLUlOVCAgRkRLX2dldCAgICAgICAgICAgICAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlciwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpIDsKK0lOVCBGREtfZ2V0KEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKTsKIAotSU5UICBGREtfZ2V0MzIgICAgICAgICAgIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyKSA7CitJTlQgRkRLX2dldDMyKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYpOwogCi12b2lkIEZES19wdXQgICAgICAgICAgICAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIFVJTlQgdmFsdWUsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKSA7Cit2b2lkIEZES19wdXQoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlciwgVUlOVCB2YWx1ZSwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpOwogCi1JTlQgIEZES19nZXRCd2QgICAgICAgICAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKTsKLXZvaWQgRkRLX3B1dEJ3ZCAgICAgICAgICAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlciwgVUlOVCB2YWx1ZSwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpIDsKK0lOVCBGREtfZ2V0QndkKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKTsKK3ZvaWQgRkRLX3B1dEJ3ZChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyLCBVSU5UIHZhbHVlLAorICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKTsKIAotdm9pZCBGREtfcHVzaEJhY2sgICAgICAgIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyLCBjb25zdCBVSU5UIG51bWJlck9mQml0cywgVUNIQVIgY29uZmlnKSA7Ci12b2lkIEZES19wdXNoRm9yd2FyZCAgICAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzLCBVQ0hBUiBjb25maWcpIDsKK3ZvaWQgRkRLX3B1c2hCYWNrKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzLAorICAgICAgICAgICAgICAgICAgVUNIQVIgY29uZmlnKTsKIAotdm9pZCBGREtfYnl0ZUFsaWduICAgICAgIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyLCBVQ0hBUiBjb25maWcpIDsKK3ZvaWQgRkRLX3B1c2hGb3J3YXJkKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzLAorICAgICAgICAgICAgICAgICAgICAgVUNIQVIgY29uZmlnKTsKIAotVUlOVCBGREtfZ2V0VmFsaWRCaXRzICAgIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyKSA7Ci1JTlQgIEZES19nZXRGcmVlQml0cyAgICAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIpIDsKK3ZvaWQgRkRLX2J5dGVBbGlnbihIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyLCBVQ0hBUiBjb25maWcpOwogCi12b2lkIEZES19zZXRCaXRDbnQgICAgICAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIGNvbnN0IFVJTlQgdmFsdWUpIDsKLUlOVCAgRkRLX2dldEJpdENudCAgICAgICAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlcikgOworVUlOVCBGREtfZ2V0VmFsaWRCaXRzKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIpOwogCi12b2lkIEZES19GZWVkICAgICAgICAgICAgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIFVDSEFSIGlucHV0QnVmZmVyIFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGJ1ZmZlclNpemUsIFVJTlQgKmJ5dGVzVmFsaWQpIDsKK0lOVCBGREtfZ2V0RnJlZUJpdHMoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlcik7CiAKLXZvaWQgRkRLX0NvcHkgICAgICAgICAgICAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZkRzdCwgSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZlNyYywgVUlOVCAqYnl0ZXNWYWxpZCkgOwordm9pZCBGREtfc2V0Qml0Q250KEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZmZXIsIGNvbnN0IFVJTlQgdmFsdWUpOworSU5UIEZES19nZXRCaXRDbnQoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlcik7CiAKLXZvaWQgRkRLX0ZldGNoICAgICAgICAgICAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZmZlciwgVUNIQVIgb3V0QnVmW10sIFVJTlQgKndyaXRlQnl0ZXMpOwordm9pZCBGREtfRmVlZChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyLCBjb25zdCBVQ0hBUiBpbnB1dEJ1ZmZlcltdLAorICAgICAgICAgICAgICBjb25zdCBVSU5UIGJ1ZmZlclNpemUsIFVJTlQgKmJ5dGVzVmFsaWQpOwogCit2b2lkIEZES19Db3B5KEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZEc3QsIEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWZTcmMsCisgICAgICAgICAgICAgIFVJTlQgKmJ5dGVzVmFsaWQpOworCit2b2lkIEZES19GZXRjaChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmZmVyLCBVQ0hBUiBvdXRCdWZbXSwgVUlOVCAqd3JpdGVCeXRlcyk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmCiAKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9GREtfYml0c3RyZWFtLmggYi9saWJGREsvaW5jbHVkZS9GREtfYml0c3RyZWFtLmgKaW5kZXggZmM4ZDdkZS4uNDllZWVhZiAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvRkRLX2JpdHN0cmVhbS5oCisrKyBiL2xpYkZESy9pbmNsdWRlL0ZES19iaXRzdHJlYW0uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxOSArOTAsMTggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyCisKICAgIERlc2NyaXB0aW9uOiBiaXRzdHJlYW0gaW50ZXJmYWNlIHRvIGJpdGJ1ZmZlciByb3V0aW5lcwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIF9fRkRLX0JJVFNUUkVBTV9IX18KLSNkZWZpbmUgX19GREtfQklUU1RSRUFNX0hfXwotCi0KKyNpZm5kZWYgRkRLX0JJVFNUUkVBTV9ICisjZGVmaW5lIEZES19CSVRTVFJFQU1fSAogCiAjaW5jbHVkZSAiRkRLX2JpdGJ1ZmZlci5oIgogI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgpAQCAtMTAwLDIxICsxMTAsMTggQEAKIAogI2RlZmluZSBDQUNIRV9CSVRTIDMyCiAKLXR5cGVkZWYgZW51bSB7Ci0gICAgQlNfUkVBREVSLAotICAgIEJTX1dSSVRFUgotfSBGREtfQlNfQ0ZHOworI2RlZmluZSBCVUZTSVpFX0RVTU1ZX1ZBTFVFIE1BWF9CVUZTSVpFX0JZVEVTCiAKK3R5cGVkZWYgZW51bSB7IEJTX1JFQURFUiwgQlNfV1JJVEVSIH0gRkRLX0JTX0NGRzsKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgVUlOVCAgICAgICBDYWNoZVdvcmQgOwotICBVSU5UICAgICAgIEJpdHNJbkNhY2hlIDsKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVCBDYWNoZVdvcmQ7CisgIFVJTlQgQml0c0luQ2FjaGU7CiAgIEZES19CSVRCVUYgaEJpdEJ1ZjsKLSAgVUlOVCAgICAgICBDb25maWdDYWNoZSA7CisgIFVJTlQgQ29uZmlnQ2FjaGU7CiB9IEZES19CSVRTVFJFQU07CiAKLXR5cGVkZWYgRkRLX0JJVFNUUkVBTSogSEFORExFX0ZES19CSVRTVFJFQU07Cit0eXBlZGVmIEZES19CSVRTVFJFQU0gKkhBTkRMRV9GREtfQklUU1RSRUFNOwogCiAvKioKICAqIFxicmllZiBDcmVhdGVCaXRTdHJlYW0gRnVuY3Rpb24uCkBAIC0xMjIsNTAgKzEyOSw0OCBAQAogICogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGJpdHN0cmVhbSB3aXRoIGV4dGVybiBhbGxvY2F0ZWQgYnVmZmVyLgogICoKICAqIFxwYXJhbSBwQnVmZmVyICBQb2ludGVyIHRvIEJpdEJ1ZmZlciBhcnJheS4KLSAqIFxwYXJhbSBidWZTaXplICBMZW5ndGggb2YgQml0QnVmZmVyIGFycmF5LiAoYXdhaXRzIHNpemUgMl5uKQorICogXHBhcmFtIGJ1ZlNpemUgIExlbmd0aCBvZiBCaXRCdWZmZXIgYXJyYXkuIChhd2FpdHMgc2l6ZSAyXm4gYW5kIDw9CisgKiBNQVhfQlVGU0laRV9CWVRFUykKICAqIFxwYXJhbSBjb25maWcgICBJbml0aWFsaXplIEJpdFN0cmVhbSBhcyBSZWFkZXIgb3IgV3JpdGVyLgogICovCiBGREtfSU5MSU5FCi1IQU5ETEVfRkRLX0JJVFNUUkVBTSBGREtjcmVhdGVCaXRTdHJlYW0gKFVDSEFSICpwQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGJ1ZlNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES19CU19DRkcgY29uZmlnID0gQlNfUkVBREVSKQotewotICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtID0gKEhBTkRMRV9GREtfQklUU1RSRUFNKSBGREtjYWxsb2MoMSwgc2l6ZW9mKEZES19CSVRTVFJFQU0pKTsKLSAgRkRLX0luaXRCaXRCdWZmZXIoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIHBCdWZmZXIsIGJ1ZlNpemUsIDApIDsKK0hBTkRMRV9GREtfQklUU1RSRUFNIEZES2NyZWF0ZUJpdFN0cmVhbShVQ0hBUiAqcEJ1ZmZlciwgVUlOVCBidWZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES19CU19DRkcgY29uZmlnID0gQlNfUkVBREVSKSB7CisgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0gPQorICAgICAgKEhBTkRMRV9GREtfQklUU1RSRUFNKUZES2NhbGxvYygxLCBzaXplb2YoRkRLX0JJVFNUUkVBTSkpOworICBpZiAoaEJpdFN0cmVhbSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgRkRLX0luaXRCaXRCdWZmZXIoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIHBCdWZmZXIsIGJ1ZlNpemUsIDApOwogCiAgIC8qIGluaXQgY2FjaGUgKi8KLSAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID0gaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPSAwIDsKLSAgaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUgPSBjb25maWcgOworICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPSBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA9IDA7CisgIGhCaXRTdHJlYW0tPkNvbmZpZ0NhY2hlID0gY29uZmlnOwogCi0gIHJldHVybiBoQml0U3RyZWFtIDsKKyAgcmV0dXJuIGhCaXRTdHJlYW07CiB9CiAKLQogLyoqCi0gKiBcYnJpZWYgSW5pdGlhbGl6ZSBCaXN0cmVhbUJ1ZmZlci4gQml0QnVmZmVyIGNhbiBwb2ludCB0byBmaWxsZWQgQml0QnVmZmVyIGFycmF5IC4KKyAqIFxicmllZiBJbml0aWFsaXplIEJpc3RyZWFtQnVmZmVyLiBCaXRCdWZmZXIgY2FuIHBvaW50IHRvIGZpbGxlZCBCaXRCdWZmZXIKKyAqIGFycmF5IC4KICAqCiAgKiBccGFyYW0gaEJpdFN0cmVhbSBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKICAqIFxwYXJhbSBwQnVmZmVyICAgIFBvaW50ZXIgdG8gQml0QnVmZmVyIGFycmF5LgotICogXHBhcmFtIGJ1ZlNpemUgICAgTGVuZ3RoIG9mIEJpdEJ1ZmZlciBhcnJheS4gKGF3YWl0cyBzaXplIDJebikKKyAqIFxwYXJhbSBidWZTaXplICAgIExlbmd0aCBvZiBCaXRCdWZmZXIgYXJyYXkgaW4gYnl0ZXMuIChhd2FpdHMgc2l6ZSAyXm4gYW5kIDw9CisgKiBNQVhfQlVGU0laRV9CWVRFUykKICAqIFxwYXJhbSB2YWxpZEJpdHMgIE51bWJlciBvZiB2YWxpZCBCaXRCdWZmZXIgZmlsbGVkIEJpdHMuCiAgKiBccGFyYW0gY29uZmlnICAgICBJbml0aWFsaXplIEJpdFN0cmVhbSBhcyBSZWFkZXIgb3IgV3JpdGVyLgogICogXHJldHVybiB2b2lkCiAgKi8KIEZES19JTkxJTkUKLXZvaWQgRkRLaW5pdEJpdFN0cmVhbSAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYnVmU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgVUlOVCB2YWxpZEJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZES19CU19DRkcgY29uZmlnID0gQlNfUkVBREVSKQotewotICBGREtfSW5pdEJpdEJ1ZmZlcigmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgcEJ1ZmZlciwgYnVmU2l6ZSwgdmFsaWRCaXRzKSA7Cit2b2lkIEZES2luaXRCaXRTdHJlYW0oSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgVUNIQVIgKnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgVUlOVCBidWZTaXplLCBVSU5UIHZhbGlkQml0cywKKyAgICAgICAgICAgICAgICAgICAgICBGREtfQlNfQ0ZHIGNvbmZpZyA9IEJTX1JFQURFUikgeworICBGREtfSW5pdEJpdEJ1ZmZlcigmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgcEJ1ZmZlciwgYnVmU2l6ZSwgdmFsaWRCaXRzKTsKIAogICAvKiBpbml0IGNhY2hlICovCi0gIGhCaXRTdHJlYW0tPkNhY2hlV29yZCA9IGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlID0gMCA7Ci0gIGhCaXRTdHJlYW0tPkNvbmZpZ0NhY2hlID0gY29uZmlnIDsKKyAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID0gaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPSAwOworICBoQml0U3RyZWFtLT5Db25maWdDYWNoZSA9IGNvbmZpZzsKIH0KIAotCiAvKioKICAqIFxicmllZiBSZXNldEJpdGJ1ZmZlciBGdW5jdGlvbi4gUmVzZXQgc3RhdGVzIGluIEJpdEJ1ZmZlciBhbmQgQ2FjaGUuCiAgKgpAQCAtMTczLDE4MyArMTc4LDIwNiBAQAogICogXHBhcmFtIGNvbmZpZyAgICAgSW5pdGlhbGl6ZSBCaXRTdHJlYW0gYXMgUmVhZGVyIG9yIFdyaXRlci4KICAqIFxyZXR1cm4gdm9pZAogICovCi1GREtfSU5MSU5FIHZvaWQgRkRLcmVzZXRCaXRidWZmZXIoIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIEZES19CU19DRkcgY29uZmlnID0gQlNfUkVBREVSKQotewotICBGREtfUmVzZXRCaXRCdWZmZXIoICZoQml0U3RyZWFtLT5oQml0QnVmICkgOworRkRLX0lOTElORSB2b2lkIEZES3Jlc2V0Qml0YnVmZmVyKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLX0JTX0NGRyBjb25maWcgPSBCU19SRUFERVIpIHsKKyAgRkRLX1Jlc2V0Qml0QnVmZmVyKCZoQml0U3RyZWFtLT5oQml0QnVmKTsKIAogICAvKiBpbml0IGNhY2hlICovCi0gIGhCaXRTdHJlYW0tPkNhY2hlV29yZCA9IGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlID0gMCA7Ci0gIGhCaXRTdHJlYW0tPkNvbmZpZ0NhY2hlID0gY29uZmlnIDsKKyAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID0gaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPSAwOworICBoQml0U3RyZWFtLT5Db25maWdDYWNoZSA9IGNvbmZpZzsKIH0KIAotCiAvKiogRGVsZXRlQml0U3RyZWFtLgogCiAgICAgRGVsZXRlcyB0aGUgaW4gQ3JlYXRlIEJpdHN0cmVhbSBhbGxvY2F0ZWQgQml0U3RyZWFtIGFuZCBCaXRCdWZmZXIuCiAqLwotRkRLX0lOTElORSB2b2lkIEZES2RlbGV0ZUJpdFN0cmVhbSAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKLXsKLSAgRkRLX0RlbGV0ZUJpdEJ1ZmZlcigmaEJpdFN0cmVhbS0+aEJpdEJ1ZikgOwotICBGREtmcmVlKGhCaXRTdHJlYW0pIDsKK0ZES19JTkxJTkUgdm9pZCBGREtkZWxldGVCaXRTdHJlYW0oSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkgeworICBGREtfRGVsZXRlQml0QnVmZmVyKCZoQml0U3RyZWFtLT5oQml0QnVmKTsKKyAgRkRLZnJlZShoQml0U3RyZWFtKTsKIH0KIAotCiAvKioKLSAqIFxicmllZiBSZWFkQml0cyBGdW5jdGlvbiAoZm9yd2FyZCkuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG51bWJlciBvZiBzZXF1ZW50aWFsCi0gKiAgICAgICAgYml0cyBmcm9tIHRoZSBpbnB1dCBiaXRzdHJlYW0uCisgKiBcYnJpZWYgUmVhZEJpdHMgRnVuY3Rpb24gKGZvcndhcmQpLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBudW1iZXIgb2YKKyAqIHNlcXVlbnRpYWwgYml0cyBmcm9tIHRoZSBpbnB1dCBiaXRzdHJlYW0uCiAgKgogICogXHBhcmFtIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCi0gKiBccGFyYW0gbnVtYmVyT2ZCaXRzICBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gYmUgcmV0cmlldmVkLgorICogXHBhcmFtIG51bWJlck9mQml0cyAgVGhlIG51bWJlciBvZiBiaXRzIHRvIGJlIHJldHJpZXZlZC4gKCAoMCksMSA8PQorICogbnVtYmVyT2ZCaXRzIDw9IDMyKQogICogXHJldHVybiB0aGUgcmVxdWVzdGVkIGJpdHMsIHJpZ2h0IGFsaWduZWQKICAqIFxyZXR1cm4KICAqLwotI2RlZmluZSBPUFRJTUlaRV9GREtSRUFEQklUUwogCiBGREtfSU5MSU5FIFVJTlQgRkRLcmVhZEJpdHMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKQotewotI2lmZGVmIG5vT1BUSU1JWkVfRkRLUkVBREJJVFMKLSAgSU5UIG1pc3NpbmdCaXRzID0gbnVtYmVyT2ZCaXRzIC0gaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGU7Ci0gIGlmIChtaXNzaW5nQml0cyA+IDApCi0gIHsKLSAgICBVSU5UIGJpdHMgPSBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPDwgbWlzc2luZ0JpdHM7Ci0gICAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID0gRkRLX2dldDMyICgmaEJpdFN0cmVhbS0+aEJpdEJ1ZikgOwotICAgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlID0gQ0FDSEVfQklUUyAtIG1pc3NpbmdCaXRzOwotICAgIHJldHVybiAoIGJpdHMgfCAoaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID4+IGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlKSkgJiBCaXRNYXNrW251bWJlck9mQml0c107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpIHsKKyAgVUlOVCBiaXRzID0gMDsKKyAgSU5UIG1pc3NpbmdCaXRzID0gKElOVCludW1iZXJPZkJpdHMgLSAoSU5UKWhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlOworCisgIEZES19BU1NFUlQobnVtYmVyT2ZCaXRzIDw9IDMyKTsKKyAgaWYgKG1pc3NpbmdCaXRzID4gMCkgeworICAgIGlmIChtaXNzaW5nQml0cyAhPSAzMikgYml0cyA9IGhCaXRTdHJlYW0tPkNhY2hlV29yZCA8PCBtaXNzaW5nQml0czsKKyAgICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPSBGREtfZ2V0MzIoJmhCaXRTdHJlYW0tPmhCaXRCdWYpOworICAgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlICs9IENBQ0hFX0JJVFM7CiAgIH0KIAogICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSAtPSBudW1iZXJPZkJpdHM7Ci0gIHJldHVybiAoIGhCaXRTdHJlYW0tPkNhY2hlV29yZCA+PiBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSkgJiBCaXRNYXNrW251bWJlck9mQml0c107CiAKLSNlbHNlCi0gIGNvbnN0IFVJTlQgdmFsaWRNYXNrID0gQml0TWFzayBbbnVtYmVyT2ZCaXRzXSA7Ci0KLSAgaWYgKGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlIDw9IG51bWJlck9mQml0cykKLSAgewotICAgIGNvbnN0IElOVCBmcmVlQml0cyA9IChDQUNIRV9CSVRTLTEpIC0gaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgOwotCi0gICAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID0gKGhCaXRTdHJlYW0tPkNhY2hlV29yZCA8PCBmcmVlQml0cykgfCBGREtfZ2V0ICgmaEJpdFN0cmVhbS0+aEJpdEJ1ZixmcmVlQml0cykgOwotICAgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlICs9IGZyZWVCaXRzIDsKLSAgfQotCi0gIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlIC09IG51bWJlck9mQml0cyA7Ci0KLSAgcmV0dXJuIChoQml0U3RyZWFtLT5DYWNoZVdvcmQgPj4gaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUpICYgdmFsaWRNYXNrIDsKLSNlbmRpZgorICByZXR1cm4gKGJpdHMgfCAoaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID4+IGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlKSkgJgorICAgICAgICAgQml0TWFza1tudW1iZXJPZkJpdHNdOwogfQogCi1GREtfSU5MSU5FIFVJTlQgRkRLcmVhZEJpdChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQotewotI2lmZGVmIE9QVElNSVpFX0ZES1JFQURCSVRTCi0gIGlmICghaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUpCi0gIHsKLSAgICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPSBGREtfZ2V0MzIgKCZoQml0U3RyZWFtLT5oQml0QnVmKTsKLSAgICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA9IENBQ0hFX0JJVFM7CitGREtfSU5MSU5FIFVJTlQgRkRLcmVhZEJpdChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKSB7CisgIGlmICghaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUpIHsKKyAgICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPSBGREtfZ2V0MzIoJmhCaXRTdHJlYW0tPmhCaXRCdWYpOworICAgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlID0gQ0FDSEVfQklUUyAtIDE7CisgICAgcmV0dXJuIGhCaXRTdHJlYW0tPkNhY2hlV29yZCA+PiAzMTsKICAgfQogICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZS0tOwogCiAgIHJldHVybiAoaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID4+IGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlKSAmIDE7Ci0jZWxzZQotIHJldHVybiBGREtyZWFkQml0cyhoQml0U3RyZWFtLDEpOwotI2VuZGlmCiB9CiAKIC8qKgotICogXGJyaWVmIFJlYWQyQml0cyBGdW5jdGlvbiAoZm9yd2FyZCkuIFRoaXMgZnVuY3Rpb24gMiBzZXF1ZW50aWFsCisgKiBcYnJpZWYgUmVhZDJCaXRzIEZ1bmN0aW9uIChmb3J3YXJkKS4gVGhpcyBmdW5jdGlvbiByZWFkcyAyIHNlcXVlbnRpYWwKICAqICAgICAgICBiaXRzIGZyb20gdGhlIGlucHV0IGJpdHN0cmVhbS4gSXQgaXMgdGhlIG9wdGltaXplZCB2ZXJzaW9uCi0gICAgICAgICAgb2YgRkRLcmVhZEJpdHMoKSBmb3IgcmVhZGlnbiAyIGJpdHMuCisgICAgICAgICAgb2YgRkRLcmVhZEJpdHMoKSBmb3IgcmVhZGluZyAyIGJpdHMuCiAgKgogICogXHBhcmFtIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCiAgKiBccmV0dXJuIHRoZSByZXF1ZXN0ZWQgYml0cywgcmlnaHQgYWxpZ25lZAogICogXHJldHVybgogICovCi1pbmxpbmUgVUlOVCBGREtyZWFkMkJpdHMoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKLXsKLSAgVUlOVCBCaXRzSW5DYWNoZSA9IGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlOwotICBpZiAoQml0c0luQ2FjaGUgPCAyKSAgLyogQ29tcGFyaXNvbiBjaGFuZ2VkIGZyb20gJ2xlc3MtZXF1YWwnIHRvICdsZXNzJyAqLwotICB7Ci0gICAgY29uc3QgSU5UIGZyZWVCaXRzID0gKENBQ0hFX0JJVFMtMSkgLSBCaXRzSW5DYWNoZSA7Ci0KLSAgICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPSAoaEJpdFN0cmVhbS0+Q2FjaGVXb3JkIDw8IGZyZWVCaXRzKSB8IEZES19nZXQgKCZoQml0U3RyZWFtLT5oQml0QnVmLGZyZWVCaXRzKSA7Ci0gICAgQml0c0luQ2FjaGUgKz0gZnJlZUJpdHM7CitGREtfSU5MSU5FIFVJTlQgRkRLcmVhZDJCaXRzKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pIHsKKyAgLyoKKyAgKiogVmVyc2lvbiBjb3JyZXNwb25kcyB0byBvcHRpbWl6ZWQgRkRLcmVhZEJpdHMgaW1wbGVtZW50YXRpb24KKyAgKiogY2FsbGluZyBGREtfZ2V0MzIsIHRoYXQga2VlcHMgcmVhZCBwb2ludGVyIGFsaWduZWQuCisgICovCisgIFVJTlQgYml0cyA9IDA7CisgIElOVCBtaXNzaW5nQml0cyA9IDIgLSAoSU5UKWhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlOworICBpZiAobWlzc2luZ0JpdHMgPiAwKSB7CisgICAgYml0cyA9IGhCaXRTdHJlYW0tPkNhY2hlV29yZCA8PCBtaXNzaW5nQml0czsKKyAgICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPSBGREtfZ2V0MzIoJmhCaXRTdHJlYW0tPmhCaXRCdWYpOworICAgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlICs9IENBQ0hFX0JJVFM7CiAgIH0KLSAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPSBCaXRzSW5DYWNoZSAtIDI7Ci0gIHJldHVybiAoaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID4+IGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlKSAmIDB4MzsKKworICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSAtPSAyOworCisgIHJldHVybiAoYml0cyB8IChoQml0U3RyZWFtLT5DYWNoZVdvcmQgPj4gaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUpKSAmIDB4MzsKIH0KIAogLyoqCi0gKiBcYnJpZWYgUmVhZEJpdHMgRnVuY3Rpb24gKGJhY2t3YXJkKS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbnVtYmVyIG9mIHNlcXVlbnRpYWwgYml0cwotICogICAgICAgIGZyb20gdGhlIGlucHV0IGJpdHN0cmVhbS4KKyAqIFxicmllZiBSZWFkQml0cyBGdW5jdGlvbiAoYmFja3dhcmQpLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBudW1iZXIgb2YKKyAqIHNlcXVlbnRpYWwgYml0cyBmcm9tIHRoZSBpbnB1dCBiaXRzdHJlYW0uCiAgKgogICogXHBhcmFtIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCiAgKiBccGFyYW0gbnVtYmVyT2ZCaXRzICBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gYmUgcmV0cmlldmVkLgogICogXHJldHVybiB0aGUgcmVxdWVzdGVkIGJpdHMsIHJpZ2h0IGFsaWduZWQKICAqLwogRkRLX0lOTElORSBVSU5UIEZES3JlYWRCaXRzQndkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG51bWJlck9mQml0cykKLXsKLSAgY29uc3QgVUlOVCB2YWxpZE1hc2sgPSBCaXRNYXNrIFtudW1iZXJPZkJpdHNdIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG51bWJlck9mQml0cykgeworICBjb25zdCBVSU5UIHZhbGlkTWFzayA9IEJpdE1hc2tbbnVtYmVyT2ZCaXRzXTsKIAotICBpZiAoaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPD0gbnVtYmVyT2ZCaXRzKQotICB7Ci0gICAgY29uc3QgSU5UIGZyZWVCaXRzID0gKENBQ0hFX0JJVFMtMSkgLSBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA7CisgIGlmIChoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA8PSBudW1iZXJPZkJpdHMpIHsKKyAgICBjb25zdCBJTlQgZnJlZUJpdHMgPSAoQ0FDSEVfQklUUyAtIDEpIC0gaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGU7CiAKLSAgICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPSAoaEJpdFN0cmVhbS0+Q2FjaGVXb3JkIDw8IGZyZWVCaXRzKSB8IEZES19nZXRCd2QgKCZoQml0U3RyZWFtLT5oQml0QnVmLGZyZWVCaXRzKSA7Ci0gICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgKz0gZnJlZUJpdHMgOworICAgIGhCaXRTdHJlYW0tPkNhY2hlV29yZCA9IChoQml0U3RyZWFtLT5DYWNoZVdvcmQgPDwgZnJlZUJpdHMpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREtfZ2V0QndkKCZoQml0U3RyZWFtLT5oQml0QnVmLCBmcmVlQml0cyk7CisgICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgKz0gZnJlZUJpdHM7CiAgIH0KIAotICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSAtPSBudW1iZXJPZkJpdHMgOworICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSAtPSBudW1iZXJPZkJpdHM7CiAKLSAgcmV0dXJuIChoQml0U3RyZWFtLT5DYWNoZVdvcmQgPj4gaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUpICYgdmFsaWRNYXNrIDsKKyAgcmV0dXJuIChoQml0U3RyZWFtLT5DYWNoZVdvcmQgPj4gaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUpICYgdmFsaWRNYXNrOwogfQogCisvKioKKyAqIFxicmllZiByZWFkIGFuIGludGVnZXIgdmFsdWUgdXNpbmcgYSB2YXJ5aW5nIG51bWJlciBvZiBiaXRzIGZyb20gdGhlCisgKiBiaXRzdHJlYW0KKyAqCisgKiAgICAgICAgcS52LiBJU08vSUVDIEZESVMgMjMwMDMtMyAgVGFibGUgMTYKKyAqCisgKiBccGFyYW0gaEJpdFN0cmVhbSBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKKyAqIFxwYXJhbSBuQml0czEgIG51bWJlciBvZiBiaXRzIHRvIHJlYWQgZm9yIGEgc21hbGwgaW50ZWdlciB2YWx1ZSBvciBlc2NhcGUKKyAqIHZhbHVlCisgKiBccGFyYW0gbkJpdHMyICBudW1iZXIgb2YgYml0cyB0byByZWFkIGZvciBhIG1lZGl1bSBzaXplZCBpbnRlZ2VyIHZhbHVlIG9yCisgKiBlc2NhcGUgdmFsdWUKKyAqIFxwYXJhbSBuQml0czMgIG51bWJlciBvZiBiaXRzIHRvIHJlYWQgZm9yIGEgbGFyZ2UgaW50ZWdlciB2YWx1ZQorICogXHJldHVybiBpbnRlZ2VyIHZhbHVlIHJlYWQgZnJvbSBiaXRzdHJlYW0KKyAqLworRkRLX0lOTElORSBVSU5UIGVzY2FwZWRWYWx1ZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBpbnQgbkJpdHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkJpdHMyLCBpbnQgbkJpdHMzKSB7CisgIFVJTlQgdmFsdWUgPSBGREtyZWFkQml0cyhoQml0U3RyZWFtLCBuQml0czEpOworCisgIGlmICh2YWx1ZSA9PSAoVUlOVCkoMSA8PCBuQml0czEpIC0gMSkgeworICAgIFVJTlQgdmFsdWVBZGQgPSBGREtyZWFkQml0cyhoQml0U3RyZWFtLCBuQml0czIpOworICAgIHZhbHVlICs9IHZhbHVlQWRkOworICAgIGlmICh2YWx1ZUFkZCA9PSAoVUlOVCkoMSA8PCBuQml0czIpIC0gMSkgeworICAgICAgdmFsdWUgKz0gRkRLcmVhZEJpdHMoaEJpdFN0cmVhbSwgbkJpdHMzKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdmFsdWU7Cit9CiAKIC8qKgogICogXGJyaWVmIHJldHVybiBhIG51bWJlciBvZiBiaXRzIGZyb20gdGhlIGJpdEJ1ZmZlci4KLSAqICAgICAgICBZb3UgaGF2ZSB0byBrbm93IHdoYXQgeW91IGRvISBDYWNoZSBoYXMgdG8gYmUgc3luY2hyb25pemVkIGJlZm9yZSB1c2luZyB0aGlzCi0gKiAgICAgICAgZnVuY3Rpb24uCisgKiAgICAgICAgWW91IGhhdmUgdG8ga25vdyB3aGF0IHlvdSBkbyEgQ2FjaGUgaGFzIHRvIGJlIHN5bmNocm9uaXplZCBiZWZvcmUKKyAqIHVzaW5nIHRoaXMgZnVuY3Rpb24uCiAgKgogICogXHBhcmFtIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCiAgKiBccGFyYW0gbnVtQml0cyBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gYmUgcmV0cmlldmVkLgogICogXHJldHVybiB0aGUgcmVxdWVzdGVkIGJpdHMsIHJpZ2h0IGFsaWduZWQKICAqLwotRkRLX0lOTElORSBVSU5UIEZES2dldEJpdHMgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIFVJTlQgbnVtQml0cykKLXsKLSAgICByZXR1cm4gRkRLX2dldCAoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIG51bUJpdHMpIDsKK0ZES19JTkxJTkUgVUlOVCBGREtnZXRCaXRzKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIFVJTlQgbnVtQml0cykgeworICByZXR1cm4gRkRLX2dldCgmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgbnVtQml0cyk7CiB9CiAKLQogLyoqCi0gKiBcYnJpZWYgV3JpdGVCaXRzIEZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBudW1iZXJPZkJpdHMgb2YgdmFsdWUgaW50byBiaXRzdHJlYW0uCisgKiBcYnJpZWYgV3JpdGVCaXRzIEZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBudW1iZXJPZkJpdHMgb2YgdmFsdWUgaW50bworICogYml0c3RyZWFtLgogICoKICAqIFxwYXJhbSBoQml0U3RyZWFtIEhBTkRMRV9GREtfQklUU1RSRUFNIGhhbmRsZQotICogXHBhcmFtIHZhbHVlICAgICAgICAgVmFyaWFibGUgaG9sZHMgZGF0YSB0byBiZSB3cml0dGVuLgotICogXHBhcmFtIG51bWJlck9mQml0cyAgVGhlIG51bWJlciBvZiBiaXRzIHRvIGJlIHdyaXR0ZW4uCi0gKiBccmV0dXJuIG51bWJlciBvZiBiaXRzIHdyaXR0ZW4KKyAqIFxwYXJhbSB2YWx1ZSAgICAgICAgIFRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4KKyAqIFxwYXJhbSBudW1iZXJPZkJpdHMgIFRoZSBudW1iZXIgb2YgYml0cyB0byBiZSB3cml0dGVuCisgKiBccmV0dXJuICAgICAgICAgICAgICBOdW1iZXIgb2YgYml0cyB3cml0dGVuCiAgKi8KIEZES19JTkxJTkUgVUNIQVIgRkRLd3JpdGVCaXRzKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIFVJTlQgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG51bWJlck9mQml0cykKLXsKLSAgY29uc3QgVUlOVCB2YWxpZE1hc2sgPSBCaXRNYXNrIFtudW1iZXJPZkJpdHNdIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKSB7CisgIGNvbnN0IFVJTlQgdmFsaWRNYXNrID0gQml0TWFza1tudW1iZXJPZkJpdHNdOwogCi0gIGlmICgoaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUrbnVtYmVyT2ZCaXRzKSA8IENBQ0hFX0JJVFMpCi0gIHsKLSAgICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSArPSBudW1iZXJPZkJpdHMgOwotICAgIGhCaXRTdHJlYW0tPkNhY2hlV29yZCAgID0gIChoQml0U3RyZWFtLT5DYWNoZVdvcmQgPDwgbnVtYmVyT2ZCaXRzKSB8ICh2YWx1ZSAmIHZhbGlkTWFzayk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgRkRLX3B1dCgmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkLCBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSkgOwotICAgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlID0gbnVtYmVyT2ZCaXRzIDsKLSAgICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgICA9ICh2YWx1ZSAmIHZhbGlkTWFzaykgOworICBpZiAoaEJpdFN0cmVhbSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIG51bWJlck9mQml0czsKICAgfQogCi0gcmV0dXJuIG51bWJlck9mQml0czsKKyAgaWYgKChoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSArIG51bWJlck9mQml0cykgPCBDQUNIRV9CSVRTKSB7CisgICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgKz0gbnVtYmVyT2ZCaXRzOworICAgIGhCaXRTdHJlYW0tPkNhY2hlV29yZCA9CisgICAgICAgIChoQml0U3RyZWFtLT5DYWNoZVdvcmQgPDwgbnVtYmVyT2ZCaXRzKSB8ICh2YWx1ZSAmIHZhbGlkTWFzayk7CisgIH0gZWxzZSB7CisgICAgLyogUHV0IGFsd2F5cyAzMiBiaXRzIGludG8gbWVtb3J5ICAgICAgICAgICAgICovCisgICAgLyogLSBmaWxsIGNhY2hlJ3MgTFNCaXRzIHdpdGggTVNCaXRzIG9mIHZhbHVlICovCisgICAgLyogLSBzdG9yZSAzMiBiaXRzIGluIG1lbW9yeSB1c2luZyBzdWJyb3V0aW5lICovCisgICAgLyogLSBmaWxsIHJlbWFpbmluZyBiaXRzIGludG8gY2FjaGUncyBMU0JpdHMgICovCisgICAgLyogLSB1cHBlciBiaXRzIGluIGNhY2hlIGFyZSBkb24ndCBjYXJlICAgICAgICovCisKKyAgICAvKiBDb21wdXRlIG51bWJlciBvZiBiaXRzIHRvIGJlIGZpbGxlZCBpbnRvIGNhY2hlICovCisgICAgaW50IG1pc3NpbmdfYml0cyA9IENBQ0hFX0JJVFMgLSBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZTsKKyAgICBpbnQgcmVtYWluaW5nX2JpdHMgPSBudW1iZXJPZkJpdHMgLSBtaXNzaW5nX2JpdHM7CisgICAgdmFsdWUgPSB2YWx1ZSAmIHZhbGlkTWFzazsKKyAgICAvKiBBdm9pZCBzaGlmdCBsZWZ0IGJ5IDMyIHBvc2l0aW9ucyAqLworICAgIFVJTlQgQ2FjaGVXb3JkID0KKyAgICAgICAgKG1pc3NpbmdfYml0cyA9PSAzMikgPyAwIDogKGhCaXRTdHJlYW0tPkNhY2hlV29yZCA8PCBtaXNzaW5nX2JpdHMpOworICAgIENhY2hlV29yZCB8PSAodmFsdWUgPj4gKHJlbWFpbmluZ19iaXRzKSk7CisgICAgRkRLX3B1dCgmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgQ2FjaGVXb3JkLCAzMik7CisKKyAgICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPSB2YWx1ZTsKKyAgICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA9IHJlbWFpbmluZ19iaXRzOworICB9CisKKyAgcmV0dXJuIG51bWJlck9mQml0czsKIH0KIAotCiAvKioKLSAqIFxicmllZiBXcml0ZUJpdHMgRnVuY3Rpb24gKGJhY2t3YXJkKS4gVGhpcyBmdW5jdGlvbiB3cml0ZXMgbnVtYmVyT2ZCaXRzIG9mIHZhbHVlIGludG8gYml0c3RyZWFtLgorICogXGJyaWVmIFdyaXRlQml0cyBGdW5jdGlvbiAoYmFja3dhcmQpLiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBudW1iZXJPZkJpdHMgb2YKKyAqIHZhbHVlIGludG8gYml0c3RyZWFtLgogICoKICAqIFxwYXJhbSBoQml0U3RyZWFtIEhBTkRMRV9GREtfQklUU1RSRUFNIGhhbmRsZQogICogXHBhcmFtIHZhbHVlICAgICAgICAgVmFyaWFibGUgaG9sZHMgZGF0YSB0byBiZSB3cml0dGVuLgpAQCAtMzU3LDI1ICszODUsNjMgQEAKICAqIFxyZXR1cm4gbnVtYmVyIG9mIGJpdHMgd3JpdHRlbgogICovCiBGREtfSU5MSU5FIFVDSEFSIEZES3dyaXRlQml0c0J3ZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBVSU5UIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpCi17Ci0gIGNvbnN0IFVJTlQgdmFsaWRNYXNrID0gQml0TWFzayBbbnVtYmVyT2ZCaXRzXSA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG51bWJlck9mQml0cykgeworICBjb25zdCBVSU5UIHZhbGlkTWFzayA9IEJpdE1hc2tbbnVtYmVyT2ZCaXRzXTsKIAotICBpZiAoKGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlK251bWJlck9mQml0cykgPD0gQ0FDSEVfQklUUykKLSAgewotICAgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlICs9IG51bWJlck9mQml0cyA7Ci0gICAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkICAgPSAgKGhCaXRTdHJlYW0tPkNhY2hlV29yZCA8PCBudW1iZXJPZkJpdHMpIHwgKHZhbHVlICYgdmFsaWRNYXNrKTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBGREtfcHV0QndkKCZoQml0U3RyZWFtLT5oQml0QnVmLCBoQml0U3RyZWFtLT5DYWNoZVdvcmQsIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlKSA7Ci0gICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPSBudW1iZXJPZkJpdHMgOwotICAgIGhCaXRTdHJlYW0tPkNhY2hlV29yZCAgID0gKHZhbHVlICYgdmFsaWRNYXNrKSA7CisgIGlmICgoaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgKyBudW1iZXJPZkJpdHMpIDw9IENBQ0hFX0JJVFMpIHsKKyAgICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSArPSBudW1iZXJPZkJpdHM7CisgICAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID0KKyAgICAgICAgKGhCaXRTdHJlYW0tPkNhY2hlV29yZCA8PCBudW1iZXJPZkJpdHMpIHwgKHZhbHVlICYgdmFsaWRNYXNrKTsKKyAgfSBlbHNlIHsKKyAgICBGREtfcHV0QndkKCZoQml0U3RyZWFtLT5oQml0QnVmLCBoQml0U3RyZWFtLT5DYWNoZVdvcmQsCisgICAgICAgICAgICAgICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSk7CisgICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPSBudW1iZXJPZkJpdHM7CisgICAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkID0gKHZhbHVlICYgdmFsaWRNYXNrKTsKICAgfQogCi0gcmV0dXJuIG51bWJlck9mQml0czsKKyAgcmV0dXJuIG51bWJlck9mQml0czsKIH0KIAorLyoqCisgKiBcYnJpZWYgd3JpdGUgYW4gaW50ZWdlciB2YWx1ZSB1c2luZyBhIHZhcnlpbmcgbnVtYmVyIG9mIGJpdHMgZnJvbSB0aGUKKyAqIGJpdHN0cmVhbQorICoKKyAqICAgICAgICBxLnYuIElTTy9JRUMgRkRJUyAyMzAwMy0zICBUYWJsZSAxNgorICoKKyAqIFxwYXJhbSBoQml0U3RyZWFtIEhBTkRMRV9GREtfQklUU1RSRUFNIGhhbmRsZQorICogXHBhcmFtIHZhbHVlICAgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbgorICogXHBhcmFtIG5CaXRzMSAgbnVtYmVyIG9mIGJpdHMgdG8gd3JpdGUgZm9yIGEgc21hbGwgaW50ZWdlciB2YWx1ZSBvciBlc2NhcGUKKyAqIHZhbHVlCisgKiBccGFyYW0gbkJpdHMyICBudW1iZXIgb2YgYml0cyB0byB3cml0ZSBmb3IgYSBtZWRpdW0gc2l6ZWQgaW50ZWdlciB2YWx1ZSBvcgorICogZXNjYXBlIHZhbHVlCisgKiBccGFyYW0gbkJpdHMzICBudW1iZXIgb2YgYml0cyB0byB3cml0ZSBmb3IgYSBsYXJnZSBpbnRlZ2VyIHZhbHVlCisgKiBccmV0dXJuIG51bWJlciBvZiBiaXRzIHdyaXR0ZW4KKyAqLworRkRLX0lOTElORSBVQ0hBUiBGREt3cml0ZUVzY2FwZWRWYWx1ZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHZhbHVlLCBVSU5UIG5CaXRzMSwgVUlOVCBuQml0czIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgbkJpdHMzKSB7CisgIFVDSEFSIG5iaXRzID0gMDsKKyAgVUlOVCB0bXAgPSAoMSA8PCBuQml0czEpIC0gMTsKKworICBpZiAodmFsdWUgPCB0bXApIHsKKyAgICBuYml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgdmFsdWUsIG5CaXRzMSk7CisgIH0gZWxzZSB7CisgICAgbmJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHRtcCwgbkJpdHMxKTsKKyAgICB2YWx1ZSAtPSB0bXA7CisgICAgdG1wID0gKDEgPDwgbkJpdHMyKSAtIDE7CisKKyAgICBpZiAodmFsdWUgPCB0bXApIHsKKyAgICAgIG5iaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCB2YWx1ZSwgbkJpdHMyKTsKKyAgICB9IGVsc2UgeworICAgICAgbmJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHRtcCwgbkJpdHMyKTsKKyAgICAgIHZhbHVlIC09IHRtcDsKKworICAgICAgbmJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHZhbHVlLCBuQml0czMpOworICAgIH0KKyAgfQorCisgIHJldHVybiBuYml0czsKK30KIAogLyoqCiAgKiBcYnJpZWYgU3luY0NhY2hlIEZ1bmN0aW9uLiBDbGVhciBjYWNoZSBhZnRlciByZWFkIGZvcndhcmQuCkBAIC0zODMsMTUyICs0NDksMTU4IEBACiAgKiBccGFyYW0gaEJpdFN0cmVhbSBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKICAqIFxyZXR1cm4gdm9pZAogICovCi1GREtfSU5MSU5FIHZvaWQgRkRLc3luY0NhY2hlIChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQoteworRkRLX0lOTElORSB2b2lkIEZES3N5bmNDYWNoZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKSB7CiAgIGlmIChoQml0U3RyZWFtLT5Db25maWdDYWNoZSA9PSBCU19SRUFERVIpCi0gICAgRkRLX3B1c2hCYWNrICgmaEJpdFN0cmVhbS0+aEJpdEJ1ZixoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSxoQml0U3RyZWFtLT5Db25maWdDYWNoZSkgOwotICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgLyogQlNfV1JJVEVSICovCi0gICAgRkRLX3B1dCgmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkLCBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSkgOworICAgIEZES19wdXNoQmFjaygmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUsCisgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0tPkNvbmZpZ0NhY2hlKTsKKyAgZWxzZSBpZiAoaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUpIC8qIEJTX1dSSVRFUiAqLworICAgIEZES19wdXQoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIGhCaXRTdHJlYW0tPkNhY2hlV29yZCwKKyAgICAgICAgICAgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlKTsKIAotICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA9IDAgOwotICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgICA9IDAgOworICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSA9IDA7CisgIGhCaXRTdHJlYW0tPkNhY2hlV29yZCA9IDA7CiB9CiAKLQogLyoqCiAgKiBcYnJpZWYgU3luY0NhY2hlIEZ1bmN0aW9uLiBDbGVhciBjYWNoZSBhZnRlciByZWFkIGJhY2t3YXJkcy4KICAqCiAgKiBccGFyYW0gIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCiAgKiBccmV0dXJuIHZvaWQKICAqLwotRkRLX0lOTElORSB2b2lkIEZES3N5bmNDYWNoZUJ3ZCAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKLXsKK0ZES19JTkxJTkUgdm9pZCBGREtzeW5jQ2FjaGVCd2QoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkgewogICBpZiAoaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUgPT0gQlNfUkVBREVSKSB7Ci0gICAgRkRLX3B1c2hGb3J3YXJkICgmaEJpdFN0cmVhbS0+aEJpdEJ1ZixoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSxoQml0U3RyZWFtLT5Db25maWdDYWNoZSkgOwotICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBCU19XUklURVIgKi8KLSAgICBGREtfcHV0QndkICgmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkLCBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSkgOworICAgIEZES19wdXNoRm9yd2FyZCgmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0tPkNvbmZpZ0NhY2hlKTsKKyAgfSBlbHNlIHsgLyogQlNfV1JJVEVSICovCisgICAgRkRLX3B1dEJ3ZCgmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkLAorICAgICAgICAgICAgICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUpOwogICB9CiAKLSAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPSAwIDsKLSAgaEJpdFN0cmVhbS0+Q2FjaGVXb3JkICAgPSAwIDsKKyAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPSAwOworICBoQml0U3RyZWFtLT5DYWNoZVdvcmQgPSAwOwogfQogCi0KIC8qKgogICogXGJyaWVmIEJ5dGUgQWxpZ25tZW50IEZ1bmN0aW9uLgotICogICAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIGJ5dGVfYWxpZ25tZW50KCkgc3ludGFjdGljIGZ1bmN0aW9uIG9uIHRoZSBpbnB1dCBzdHJlYW0sCi0gKiAgICAgICAgaS5lLiBzb21lIGJpdHMgd2lsbCBiZSBkaXNjYXJkZWQvcGFkZGVkIHNvIHRoYXQgdGhlIG5leHQgYml0cyB0byBiZSByZWFkL3dyaXR0ZW4gd2lsbAotICogICAgICAgIGJlIGFsaWduZWQgb24gYSBieXRlIGJvdW5kYXJ5IHdpdGggcmVzcGVjdCB0byB0aGUgYml0IHBvc2l0aW9uIDAuCisgKiAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgYnl0ZV9hbGlnbm1lbnQoKSBzeW50YWN0aWMgZnVuY3Rpb24gb24gdGhlCisgKiBpbnB1dCBzdHJlYW0sIGkuZS4gc29tZSBiaXRzIHdpbGwgYmUgZGlzY2FyZGVkL3BhZGRlZCBzbyB0aGF0IHRoZSBuZXh0IGJpdHMKKyAqIHRvIGJlIHJlYWQvd3JpdHRlbiB3aWxsIGJlIGFsaWduZWQgb24gYSBieXRlIGJvdW5kYXJ5IHdpdGggcmVzcGVjdCB0bworICogdGhlIGJpdCBwb3NpdGlvbiAwLgogICoKICAqIFxwYXJhbSAgaEJpdFN0cmVhbSBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKICAqIFxyZXR1cm4gdm9pZAogICovCi1GREtfSU5MSU5FIHZvaWQgRkRLYnl0ZUFsaWduIChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQotewotICBGREtzeW5jQ2FjaGUgKGhCaXRTdHJlYW0pIDsKLSAgRkRLX2J5dGVBbGlnbiAoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIChVQ0hBUiloQml0U3RyZWFtLT5Db25maWdDYWNoZSkgOworRkRLX0lOTElORSB2b2lkIEZES2J5dGVBbGlnbihIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKSB7CisgIEZES3N5bmNDYWNoZShoQml0U3RyZWFtKTsKKyAgRkRLX2J5dGVBbGlnbigmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgKFVDSEFSKWhCaXRTdHJlYW0tPkNvbmZpZ0NhY2hlKTsKIH0KIAotCiAvKioKICAqIFxicmllZiBCeXRlIEFsaWdubWVudCBGdW5jdGlvbiB3aXRoIGFuY2hvcgotICogICAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIGJ5dGVfYWxpZ25tZW50KCkgc3ludGFjdGljIGZ1bmN0aW9uIG9uIHRoZSBpbnB1dCBzdHJlYW0sCi0gKiAgICAgICAgaS5lLiBzb21lIGJpdHMgd2lsbCBiZSBkaXNjYXJkZWQgc28gdGhhdCB0aGUgbmV4dCBiaXRzIHRvIGJlIHJlYWQvd3JpdHRlbiB3b3VsZCBiZSBhbGlnbmVkCi0gKiAgICAgICAgb24gYSBieXRlIGJvdW5kYXJ5IHdpdGggcmVzcGVjdCB0byB0aGUgZ2l2ZW4gYWxpZ25tZW50IGFuY2hvci4KKyAqICAgICAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBieXRlX2FsaWdubWVudCgpIHN5bnRhY3RpYyBmdW5jdGlvbiBvbiB0aGUKKyAqIGlucHV0IHN0cmVhbSwgaS5lLiBzb21lIGJpdHMgd2lsbCBiZSBkaXNjYXJkZWQgc28gdGhhdCB0aGUgbmV4dCBiaXRzIHRvIGJlCisgKiByZWFkL3dyaXR0ZW4gd291bGQgYmUgYWxpZ25lZCBvbiBhIGJ5dGUgYm91bmRhcnkgd2l0aCByZXNwZWN0IHRvIHRoZQorICogZ2l2ZW4gYWxpZ25tZW50IGFuY2hvci4KICAqCiAgKiBccGFyYW0gaEJpdFN0cmVhbSBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKLSAqIFxwYXJhbSBhbGlnbm1lbnRBbmNob3IgYml0IHBvc2l0aW9uIHRvIGJlIGNvbnNpZGVyZWQgYXMgb3JpZ2luIGZvciBieXRlIGFsaWdubWVudAorICogXHBhcmFtIGFsaWdubWVudEFuY2hvciBiaXQgcG9zaXRpb24gdG8gYmUgY29uc2lkZXJlZCBhcyBvcmlnaW4gZm9yIGJ5dGUKKyAqIGFsaWdubWVudAogICogXHJldHVybiB2b2lkCiAgKi8KLUZES19JTkxJTkUgdm9pZCBGREtieXRlQWxpZ24gKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIFVJTlQgYWxpZ25tZW50QW5jaG9yKQotewotICBGREtzeW5jQ2FjaGUgKGhCaXRTdHJlYW0pIDsKK0ZES19JTkxJTkUgdm9pZCBGREtieXRlQWxpZ24oSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBhbGlnbm1lbnRBbmNob3IpIHsKKyAgRkRLc3luY0NhY2hlKGhCaXRTdHJlYW0pOwogICBpZiAoaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUgPT0gQlNfUkVBREVSKSB7Ci0gICAgRkRLX3B1c2hGb3J3YXJkICgmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICg4IC0gKChhbGlnbm1lbnRBbmNob3IgLSBGREtfZ2V0VmFsaWRCaXRzKCZoQml0U3RyZWFtLT5oQml0QnVmKSkgJiAweDA3KSkgJiAweDA3LAotICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUpIDsKLSAgfQotICBlbHNlIHsKLSAgICBGREtfcHV0ICgmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwKLSAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICg4IC0gKChGREtfZ2V0VmFsaWRCaXRzKCZoQml0U3RyZWFtLT5oQml0QnVmKS1hbGlnbm1lbnRBbmNob3IpICYgMHgwNykpICYgMHgwNyApOworICAgIEZES19wdXNoRm9yd2FyZCgKKyAgICAgICAgJmhCaXRTdHJlYW0tPmhCaXRCdWYsCisgICAgICAgIChVSU5UKSgoSU5UKTggLSAoKChJTlQpYWxpZ25tZW50QW5jaG9yIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKElOVClGREtfZ2V0VmFsaWRCaXRzKCZoQml0U3RyZWFtLT5oQml0QnVmKSkgJgorICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcpKSAmCisgICAgICAgICAgICAweDA3LAorICAgICAgICBoQml0U3RyZWFtLT5Db25maWdDYWNoZSk7CisgIH0gZWxzZSB7CisgICAgRkRLX3B1dCgmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgMCwKKyAgICAgICAgICAgICg4IC0gKChGREtfZ2V0VmFsaWRCaXRzKCZoQml0U3RyZWFtLT5oQml0QnVmKSAtIGFsaWdubWVudEFuY2hvcikgJgorICAgICAgICAgICAgICAgICAgMHgwNykpICYKKyAgICAgICAgICAgICAgICAweDA3KTsKICAgfQogfQogCi0KIC8qKgogICogXGJyaWVmIFB1c2ggQmFjayhDYWNoZSkgLyBGb3IgLyBCaURpcmVjdGlvbmFsIEZ1bmN0aW9uLgotICogICAgICAgIFB1c2hCYWNrQ2FjaGUgZnVuY3Rpb24gdW5nZXRzIGEgbnVtYmVyIG9mIGJpdHMgZXJyb25lb3VzbHkgcmVhZC93cml0dGVuIGJ5IHRoZSBsYXN0IEdldCgpIGNhbGwuCi0gKiAgICAgICBOQjogVGhlIG51bWJlciBvZiBiaXRzIHRvIGJlIHN0dWZmZWQgYmFjayBpbnRvIHRoZSBzdHJlYW0gbWF5IG5ldmVyIGV4Y2VlZCB0aGUKLSAqICAgICAgIG51bWJlciBvZiBiaXRzIHJldHVybmVkIGJ5IHRoZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgR2V0KCkgY2FsbC4KKyAqICAgICAgICBQdXNoQmFja0NhY2hlIGZ1bmN0aW9uIHVuZ2V0cyBhIG51bWJlciBvZiBiaXRzIGVycm9uZW91c2x5CisgKiByZWFkL3dyaXR0ZW4gYnkgdGhlIGxhc3QgR2V0KCkgY2FsbC4gTkI6IFRoZSBudW1iZXIgb2YgYml0cyB0byBiZSBzdHVmZmVkCisgKiBiYWNrIGludG8gdGhlIHN0cmVhbSBtYXkgbmV2ZXIgZXhjZWVkIHRoZSBudW1iZXIgb2YgYml0cyByZXR1cm5lZCBieQorICogdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyBHZXQoKSBjYWxsLgogICoKLSAqICAgICAgIFB1c2hCYWNrIGZ1bmN0aW9uIHVuZ2V0cyBhIG51bWJlciBvZiBiaXRzIChjb21iaW5lcyBjYWNoZSBhbmQgYml0YnVmZmVyIGluZGljZXMpCi0gKiAgICAgICBQdXNoRm9yICBmdW5jdGlvbiBnZXRzIGEgbnVtYmVyIG9mIGJpdHMgKGNvbWJpbmVzIGNhY2hlIGFuZCBiaXRidWZmZXIgaW5kaWNlcykKLSAqICAgICAgIFB1c2hCaURpcmVjdGlvbmFsIGdldHMvdW5nZXRzIG51bWJlciBvZiBiaXRzIGFzIGRlZmluZWQgaW4gUHVzQmFjay9Gb3IgZnVuY3Rpb24KLSAqICAgICAgIE5COiBUaGUgc2lnbiBvZiBiaXRzIGlzIG5vdCBrbm93biwgc28gdGhlIGZ1bmN0aW9uIGNoZWNrcyBkaXJlY3Rpb24gYW5kIGNhbGxzCi0gKiAgICAgICAgYXBwcm9wcmlhdGUgZnVuY3Rpb24uIChwb3NpdGl2ZSBzaWduIHB1c2hGb3IsIG5lZ2F0aXZlIHNpZ24gcHVzaEJhY2sgKQorICogICAgICAgUHVzaEJhY2sgZnVuY3Rpb24gdW5nZXRzIGEgbnVtYmVyIG9mIGJpdHMgKGNvbWJpbmVzIGNhY2hlIGFuZCBiaXRidWZmZXIKKyAqIGluZGljZXMpIFB1c2hGb3IgIGZ1bmN0aW9uIGdldHMgYSBudW1iZXIgb2YgYml0cyAoY29tYmluZXMgY2FjaGUgYW5kCisgKiBiaXRidWZmZXIgaW5kaWNlcykgUHVzaEJpRGlyZWN0aW9uYWwgZ2V0cy91bmdldHMgbnVtYmVyIG9mIGJpdHMgYXMKKyAqIGRlZmluZWQgaW4gUHVzQmFjay9Gb3IgZnVuY3Rpb24gTkI6IFRoZSBzaWduIG9mIGJpdHMgaXMgbm90IGtub3duLCBzbworICogdGhlIGZ1bmN0aW9uIGNoZWNrcyBkaXJlY3Rpb24gYW5kIGNhbGxzIGFwcHJvcHJpYXRlIGZ1bmN0aW9uLiAocG9zaXRpdmUKKyAqIHNpZ24gcHVzaEZvciwgbmVnYXRpdmUgc2lnbiBwdXNoQmFjayApCiAgKgogICogXHBhcmFtIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCiAgKiBccGFyYW0gbnVtYmVyT2ZCaXRzICBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gYmUgcHVzaGVkIGJhY2svZm9yLgogICogXHJldHVybiB2b2lkCiAgKi8KLUZES19JTkxJTkUgdm9pZCBGREtwdXNoQmFja0NhY2hlIChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBjb25zdCBVSU5UIG51bWJlck9mQml0cykKLXsKLSAgRkRLX0FTU0VSVCAoKGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlK251bWJlck9mQml0cyk8PUNBQ0hFX0JJVFMpOwotICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSArPSBudW1iZXJPZkJpdHMgOworRkRLX0lOTElORSB2b2lkIEZES3B1c2hCYWNrQ2FjaGUoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKSB7CisgIEZES19BU1NFUlQoKGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlICsgbnVtYmVyT2ZCaXRzKSA8PSBDQUNIRV9CSVRTKTsKKyAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgKz0gbnVtYmVyT2ZCaXRzOwogfQogCi1GREtfSU5MSU5FIHZvaWQgRkRLcHVzaEJhY2sgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKQotewotICBpZiAoKGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlK251bWJlck9mQml0cyk8Q0FDSEVfQklUUyAmJiAoaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUgPT0gQlNfUkVBREVSKSApIHsKLSAgICBoQml0U3RyZWFtLT5CaXRzSW5DYWNoZSArPSBudW1iZXJPZkJpdHMgOwotICAgIEZES3N5bmNDYWNoZShoQml0U3RyZWFtKSA7IC8qIHN5bmMgY2FjaGUgdG8gYXZvaWQgaW52YWxpZCBjYWNoZSAqLwotICB9Ci0gIGVsc2UgewotICAgIEZES3N5bmNDYWNoZShoQml0U3RyZWFtKSA7Ci0gICAgRkRLX3B1c2hCYWNrKCZoQml0U3RyZWFtLT5oQml0QnVmLG51bWJlck9mQml0cyxoQml0U3RyZWFtLT5Db25maWdDYWNoZSk7CitGREtfSU5MSU5FIHZvaWQgRkRLcHVzaEJhY2soSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG51bWJlck9mQml0cykgeworICBpZiAoKGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlICsgbnVtYmVyT2ZCaXRzKSA8IENBQ0hFX0JJVFMgJiYKKyAgICAgIChoQml0U3RyZWFtLT5Db25maWdDYWNoZSA9PSBCU19SRUFERVIpKSB7CisgICAgaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgKz0gbnVtYmVyT2ZCaXRzOworICAgIEZES3N5bmNDYWNoZShoQml0U3RyZWFtKTsgLyogc3luYyBjYWNoZSB0byBhdm9pZCBpbnZhbGlkIGNhY2hlICovCisgIH0gZWxzZSB7CisgICAgRkRLc3luY0NhY2hlKGhCaXRTdHJlYW0pOworICAgIEZES19wdXNoQmFjaygmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgbnVtYmVyT2ZCaXRzLCBoQml0U3RyZWFtLT5Db25maWdDYWNoZSk7CiAgIH0KIH0KIAotRkRLX0lOTElORSB2b2lkIEZES3B1c2hGb3IgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKQotewotICBpZiAoIChoQml0U3RyZWFtLT5CaXRzSW5DYWNoZT5udW1iZXJPZkJpdHMpICYmIChoQml0U3RyZWFtLT5Db25maWdDYWNoZSA9PSBCU19SRUFERVIpICkgeworRkRLX0lOTElORSB2b2lkIEZES3B1c2hGb3IoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKSB7CisgIGlmICgoaEJpdFN0cmVhbS0+Qml0c0luQ2FjaGUgPiBudW1iZXJPZkJpdHMpICYmCisgICAgICAoaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUgPT0gQlNfUkVBREVSKSkgewogICAgIGhCaXRTdHJlYW0tPkJpdHNJbkNhY2hlIC09IG51bWJlck9mQml0czsKLSAgfQotICBlbHNlIHsKLSAgICBGREtzeW5jQ2FjaGUoaEJpdFN0cmVhbSkgOwotICAgIEZES19wdXNoRm9yd2FyZCgmaEJpdFN0cmVhbS0+aEJpdEJ1ZixudW1iZXJPZkJpdHMsaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUpOworICB9IGVsc2UgeworICAgIEZES3N5bmNDYWNoZShoQml0U3RyZWFtKTsKKyAgICBGREtfcHVzaEZvcndhcmQoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIG51bWJlck9mQml0cywKKyAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbS0+Q29uZmlnQ2FjaGUpOwogICB9CiB9CiAKLUZES19JTkxJTkUgdm9pZCBGREtwdXNoQmlEaXJlY3Rpb25hbCAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgY29uc3QgSU5UIG51bWJlck9mQml0cykKLXsKLSAgaWYobnVtYmVyT2ZCaXRzPj0wKSAgRkRLcHVzaEZvcihoQml0U3RyZWFtLCBudW1iZXJPZkJpdHMpIDsKLSAgZWxzZSAgICAgICAgICAgICAgICAgRkRLcHVzaEJhY2soaEJpdFN0cmVhbSwgLW51bWJlck9mQml0cykgOworRkRLX0lOTElORSB2b2lkIEZES3B1c2hCaURpcmVjdGlvbmFsKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG51bWJlck9mQml0cykgeworICBpZiAobnVtYmVyT2ZCaXRzID49IDApCisgICAgRkRLcHVzaEZvcihoQml0U3RyZWFtLCBudW1iZXJPZkJpdHMpOworICBlbHNlCisgICAgRkRLcHVzaEJhY2soaEJpdFN0cmVhbSwgLW51bWJlck9mQml0cyk7CiB9CiAKLQogLyoqCi0gKiBcYnJpZWYgR2V0VmFsaWRCaXRzIEZ1bmN0aW9uLiAgQ2xlYXIgY2FjaGUgYW5kIHJldHVybiB2YWxpZCBCaXRzIGZyb20gQml0YnVmZmVyLgorICogXGJyaWVmIEdldFZhbGlkQml0cyBGdW5jdGlvbi4gIENsZWFyIGNhY2hlIGFuZCByZXR1cm4gdmFsaWQgQml0cyBmcm9tCisgKiBCaXRidWZmZXIuCiAgKiBccGFyYW0gaEJpdFN0cmVhbSBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKICAqIFxyZXR1cm4gYW1vdW50IG9mIHZhbGlkIGJpdHMgdGhhdCBzdGlsbCBjYW4gYmUgcmVhZCBvciB3ZXJlIGFscmVhZHkgd3JpdHRlbi4KICAqCiAgKi8KLUZES19JTkxJTkUgVUlOVCBGREtnZXRWYWxpZEJpdHMgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pCi17Ci0gIEZES3N5bmNDYWNoZShoQml0U3RyZWFtKSA7Ci0gIHJldHVybiBGREtfZ2V0VmFsaWRCaXRzKCZoQml0U3RyZWFtLT5oQml0QnVmKSA7CitGREtfSU5MSU5FIFVJTlQgRkRLZ2V0VmFsaWRCaXRzKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pIHsKKyAgRkRLc3luY0NhY2hlKGhCaXRTdHJlYW0pOworICByZXR1cm4gRkRLX2dldFZhbGlkQml0cygmaEJpdFN0cmVhbS0+aEJpdEJ1Zik7CiB9CiAKLQogLyoqCiAgKiBcYnJpZWYgcmV0dXJuIGFtb3VudCBvZiB1bnVzZWQgQml0cyBmcm9tIEJpdGJ1ZmZlci4KICAqIFxwYXJhbSBoQml0U3RyZWFtIEhBTkRMRV9GREtfQklUU1RSRUFNIGhhbmRsZQogICogXHJldHVybiBhbW91bnQgb2YgZnJlZSBiaXRzIHRoYXQgc3RpbGwgY2FuIGJlIHdyaXR0ZW4gaW50byB0aGUgYml0c3RyZWFtCiAgKi8KLUZES19JTkxJTkUgSU5UIEZES2dldEZyZWVCaXRzIChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQotewotICAgcmV0dXJuIEZES19nZXRGcmVlQml0cyAoJmhCaXRTdHJlYW0tPmhCaXRCdWYpIDsKK0ZES19JTkxJTkUgSU5UIEZES2dldEZyZWVCaXRzKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pIHsKKyAgcmV0dXJuIEZES19nZXRGcmVlQml0cygmaEJpdFN0cmVhbS0+aEJpdEJ1Zik7CiB9CiAKIC8qKgpAQCAtNTM2LDEwICs2MDgsOSBAQAogICogXHBhcmFtIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCiAgKiBccmV0dXJuIHZvaWQKICAqLwotRkRLX0lOTElORSB2b2lkIEZES3Jlc2V0Qml0Q250IChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQotewotICAgIEZES3N5bmNDYWNoZSAoaEJpdFN0cmVhbSkgOwotICAgIEZES19zZXRCaXRDbnQgKCZoQml0U3RyZWFtLT5oQml0QnVmLCAwKSA7CitGREtfSU5MSU5FIHZvaWQgRkRLcmVzZXRCaXRDbnQoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkgeworICBGREtzeW5jQ2FjaGUoaEJpdFN0cmVhbSk7CisgIEZES19zZXRCaXRDbnQoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIDApOwogfQogCiAvKioKQEAgLTU0OCwxMCArNjE5LDkgQEAKICAqIFxwYXJhbSB2YWx1ZSBuZXcgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGJpdCBjb3VudGVyCiAgKiBccmV0dXJuIHZvaWQKICAqLwotRkRLX0lOTElORSB2b2lkIEZES3NldEJpdENudCAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgVUlOVCB2YWx1ZSkKLXsKLSAgICBGREtzeW5jQ2FjaGUgKGhCaXRTdHJlYW0pIDsKLSAgICBGREtfc2V0Qml0Q250ICgmaEJpdFN0cmVhbS0+aEJpdEJ1ZiwgdmFsdWUpIDsKK0ZES19JTkxJTkUgdm9pZCBGREtzZXRCaXRDbnQoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgVUlOVCB2YWx1ZSkgeworICBGREtzeW5jQ2FjaGUoaEJpdFN0cmVhbSk7CisgIEZES19zZXRCaXRDbnQoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIHZhbHVlKTsKIH0KIAogLyoqCkBAIC01NTksNjAgKzYyOSw2MCBAQAogICogXHBhcmFtIGhCaXRTdHJlYW0gSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlCiAgKiBccmV0dXJuIGN1cnJlbnQgYml0IGNvdW50ZXIgdmFsdWUKICAqLwotRkRLX0lOTElORSBJTlQgIEZES2dldEJpdENudCAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKLXsKLSAgICBGREtzeW5jQ2FjaGUoaEJpdFN0cmVhbSkgOwotICAgIHJldHVybiBGREtfZ2V0Qml0Q250KCZoQml0U3RyZWFtLT5oQml0QnVmKSA7CitGREtfSU5MSU5FIElOVCBGREtnZXRCaXRDbnQoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkgeworICBGREtzeW5jQ2FjaGUoaEJpdFN0cmVhbSk7CisgIHJldHVybiBGREtfZ2V0Qml0Q250KCZoQml0U3RyZWFtLT5oQml0QnVmKTsKIH0KIAotCiAvKioKICAqIFxicmllZiBGaWxsIHRoZSBCaXRCdWZmZXIgd2l0aCBhIG51bWJlciBvZiBpbnB1dCBieXRlcyBmcm9tICBleHRlcm5hbCBzb3VyY2UuCi0gKiAgICAgICAgVGhlIGJ5dGVzVmFsaWQgdmFyaWFibGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJhbWFpbmluZyB2YWxpZCBieXRlcyBpbiBleHRlcm4gaW5wdXRCdWZmZXIuCisgKiAgICAgICAgVGhlIGJ5dGVzVmFsaWQgdmFyaWFibGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJhbWFpbmluZyB2YWxpZCBieXRlcyBpbgorICogZXh0ZXJuIGlucHV0QnVmZmVyLgogICoKICAqIFxwYXJhbSBoQml0U3RyZWFtICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKICAqIFxwYXJhbSBpbnB1dEJ1ZmZlciBQb2ludGVyIHRvIGlucHV0IGJ1ZmZlciB3aXRoIGJpdHN0cmVhbSBkYXRhLgogICogXHBhcmFtIGJ1ZmZlclNpemUgIFRvdGFsIHNpemUgb2YgaW5wdXRCdWZmZXIgYXJyYXkuCi0gKiBccGFyYW0gYnl0ZXNWYWxpZCAgSW5wdXQ6IG51bWJlciBvZiB2YWxpZCBieXRlcyBpbiBpbnB1dEJ1ZmZlci4gT3V0cHV0OiBieXRlcyBzdGlsbCBsZWZ0IHVucmVhZCBpbiBpbnB1dEJ1ZmZlci4KKyAqIFxwYXJhbSBieXRlc1ZhbGlkICBJbnB1dDogbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGluIGlucHV0QnVmZmVyLiBPdXRwdXQ6IGJ5dGVzCisgKiBzdGlsbCBsZWZ0IHVucmVhZCBpbiBpbnB1dEJ1ZmZlci4KICAqIFxyZXR1cm4gdm9pZAogICovCi1GREtfSU5MSU5FIHZvaWQgRkRLZmVlZEJ1ZmZlciAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgY29uc3QgVUNIQVIgaW5wdXRCdWZmZXIgW10sIGNvbnN0IFVJTlQgYnVmZmVyU2l6ZSwgVUlOVCAqYnl0ZXNWYWxpZCkKLXsKLSAgRkRLc3luY0NhY2hlIChoQml0U3RyZWFtKSA7Ci0gIEZES19GZWVkKCZoQml0U3RyZWFtLT5oQml0QnVmLCAoVUNIQVIqKWlucHV0QnVmZmVyLCBidWZmZXJTaXplLCBieXRlc1ZhbGlkICApIDsKK0ZES19JTkxJTkUgdm9pZCBGREtmZWVkQnVmZmVyKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBpbnB1dEJ1ZmZlcltdLCBjb25zdCBVSU5UIGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpieXRlc1ZhbGlkKSB7CisgIEZES3N5bmNDYWNoZShoQml0U3RyZWFtKTsKKyAgRkRLX0ZlZWQoJmhCaXRTdHJlYW0tPmhCaXRCdWYsIGlucHV0QnVmZmVyLCBidWZmZXJTaXplLCBieXRlc1ZhbGlkKTsKIH0KIAotCiAvKioKLSAqIFxicmllZiBmaWxsIGRlc3RpbmF0aW9uIEJpdEJ1ZmZlciB3aXRoIGEgbnVtYmVyIG9mIGJ5dGVzIGZyb20gc291cmNlIEJpdEJ1ZmZlci4gVGhlCi0gKiAgICAgICAgYnl0ZXNWYWxpZCB2YXJpYWJsZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgcmFtYWluaW5nIHZhbGlkIGJ5dGVzIGluIHNvdXJjZSBCaXRCdWZmZXIuCisgKiBcYnJpZWYgZmlsbCBkZXN0aW5hdGlvbiBCaXRCdWZmZXIgd2l0aCBhIG51bWJlciBvZiBieXRlcyBmcm9tIHNvdXJjZQorICogQml0QnVmZmVyLiBUaGUgYnl0ZXNWYWxpZCB2YXJpYWJsZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgcmFtYWluaW5nIHZhbGlkCisgKiBieXRlcyBpbiBzb3VyY2UgQml0QnVmZmVyLgogICoKICAqIFxwYXJhbSBoQlNEc3QgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUgdG8gd3JpdGUgZGF0YSBpbnRvCiAgKiBccGFyYW0gaEJTU3JjICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaGFuZGxlIHRvIHJlYWQgZGF0YSBmcm9tCi0gKiBccGFyYW0gYnl0ZXNWYWxpZCAgICAgICAgSW5wdXQ6IG51bWJlciBvZiB2YWxpZCBieXRlcyBpbiBpbnB1dEJ1ZmZlci4gT3V0cHV0OiBieXRlcyBzdGlsbCBsZWZ0IHVucmVhZCBpbiBpbnB1dEJ1ZmZlci4KKyAqIFxwYXJhbSBieXRlc1ZhbGlkICAgICAgICBJbnB1dDogbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGluIGlucHV0QnVmZmVyLiBPdXRwdXQ6CisgKiBieXRlcyBzdGlsbCBsZWZ0IHVucmVhZCBpbiBpbnB1dEJ1ZmZlci4KICAqIFxyZXR1cm4gdm9pZAogICovCi1GREtfSU5MSU5FIHZvaWQgRkRLY29weUJ1ZmZlciAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJTRHN0LCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQlNTcmMsIFVJTlQgKmJ5dGVzVmFsaWQpCi17Ci0gIEZES3N5bmNDYWNoZSAoaEJTU3JjKSA7Ci0gIEZES19Db3B5ICgmaEJTRHN0LT5oQml0QnVmLCAmaEJTU3JjLT5oQml0QnVmLCBieXRlc1ZhbGlkKSA7CitGREtfSU5MSU5FIHZvaWQgRkRLY29weUJ1ZmZlcihIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQlNEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQlNTcmMsIFVJTlQgKmJ5dGVzVmFsaWQpIHsKKyAgRkRLc3luY0NhY2hlKGhCU1NyYyk7CisgIEZES19Db3B5KCZoQlNEc3QtPmhCaXRCdWYsICZoQlNTcmMtPmhCaXRCdWYsIGJ5dGVzVmFsaWQpOwogfQogCi0KIC8qKgotICogXGJyaWVmIGZpbGwgdGhlIG91dHB1dEJ1ZmZlciB3aXRoIGFsbCB2YWxpZCBieXRlcyBob2xkIGluIEJpdEJ1ZmZlci4gVGhlIFdyaXRlQnl0ZXMKLSAqICAgICAgICB2YXJpYWJsZSByZXR1cm5zIHRoZSBudW1iZXIgb2Ygd3JpdHRlbiBCeXRlcy4KKyAqIFxicmllZiBmaWxsIHRoZSBvdXRwdXRCdWZmZXIgd2l0aCBhbGwgdmFsaWQgYnl0ZXMgaG9sZCBpbiBCaXRCdWZmZXIuIFRoZQorICogV3JpdGVCeXRlcyB2YXJpYWJsZSByZXR1cm5zIHRoZSBudW1iZXIgb2Ygd3JpdHRlbiBCeXRlcy4KICAqCiAgKiBccGFyYW0gaEJpdFN0cmVhbSAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoYW5kbGUKICAqIFxwYXJhbSBvdXRwdXRCdWZmZXIgIFBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlci4KICAqIFxwYXJhbSB3cml0ZUJ5dGVzICAgIE51bWJlciBvZiBieXRlcyB3cml0ZSB0byBvdXRwdXQgYnVmZmVyLgogICogXHJldHVybiB2b2lkCiAgKi8KLUZES19JTkxJTkUgdm9pZCBGREtmZXRjaEJ1ZmZlcihIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBVQ0hBUiAqb3V0cHV0QnVmZmVyLCBVSU5UICp3cml0ZUJ5dGVzKQotewotICBGREtzeW5jQ2FjaGUgKGhCaXRTdHJlYW0pIDsKK0ZES19JTkxJTkUgdm9pZCBGREtmZXRjaEJ1ZmZlcihIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpvdXRwdXRCdWZmZXIsIFVJTlQgKndyaXRlQnl0ZXMpIHsKKyAgRkRLc3luY0NhY2hlKGhCaXRTdHJlYW0pOwogICBGREtfRmV0Y2goJmhCaXRTdHJlYW0tPmhCaXRCdWYsIG91dHB1dEJ1ZmZlciwgd3JpdGVCeXRlcyk7CiB9CiAKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9GREtfY29yZS5oIGIvbGliRkRLL2luY2x1ZGUvRkRLX2NvcmUuaAppbmRleCAxMGE2YThlLi45NTQzNTIyIDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9GREtfY29yZS5oCisrKyBiL2xpYkZESy9pbmNsdWRlL0ZES19jb3JlLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKKwogICAgRGVzY3JpcHRpb246IEZESyB0b29scyB2ZXJzaW9uaW5nIHN1cHBvcnQKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmbmRlZiBGREtfQ09SRV9ICiAjZGVmaW5lIEZES19DT1JFX0gKQEAgLTk4LDcgKzExMCw4IEBACiAjZW5kaWYKIAogLyoqIEBicmllZiBHZXQgRkRLX3Rvb2xzIGxpYnJhcnkgaW5mb3JtYXRpb24uCi0gKiAgQHJldHVybiAgICAgUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvcmNvZGUgb24gZmFpbHVyZSAoc2VlIGVycm9yY29kZXMuaCkuCisgKiAgQHJldHVybiAgICAgUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvcmNvZGUgb24gZmFpbHVyZSAoc2VlCisgKiBlcnJvcmNvZGVzLmgpLgogICovCiBpbnQgRkRLX3Rvb2xzR2V0TGliSW5mbyhMSUJfSU5GTyAqaW5mbyk7CiAKZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL0ZES19jcmMuaCBiL2xpYkZESy9pbmNsdWRlL0ZES19jcmMuaAppbmRleCBiMWZlZDg4Li42YzcwNDBjIDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9GREtfY3JjLmgKKysrIGIvbGliRkRLL2luY2x1ZGUvRkRLX2NyYy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDU1ICs5MCw1MyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIEF1ZGlvIEVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOgotICAgY29udGVudHMvZGVzY3JpcHRpb246IENSQyBjYWxjdWxhdGlvbgorICAgQXV0aG9yKHMpOgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogQ1JDIGNhbGN1bGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgRkRLX0NSQ19ICiAjZGVmaW5lIEZES19DUkNfSAogCi0KLQogI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKIAotCi0jZGVmaW5lIE1BWF9DUkNfUkVHUyAzICAgIC8qITwgTWF4aW1hbCBudW1iZXIgb2Ygb3ZlcmxhcHBpbmcgY3JjIHJlZ2lvbiBpbiBBRFRTIGNoYW5uZWwgcGFpciBlbGVtZW50IGlzIHR3by4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3QgdGhyZWUgaW5kZXBlbmRlbnQgcmVnaW9ucyBwcmV2ZW50aXZlbHkuICovCisjZGVmaW5lIE1BWF9DUkNfUkVHUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAzIC8qITwgTWF4aW1hbCBudW1iZXIgb2Ygb3ZlcmxhcHBpbmcgY3JjIHJlZ2lvbiBpbiBBRFRTIGNoYW5uZWwgcGFpciBlbGVtZW50IFwKKyAgICAgICBpcyB0d28uIFNlbGVjdCB0aHJlZSBpbmRlcGVuZGVudCByZWdpb25zIHByZXZlbnRpdmVseS4gKi8KIAogLyoqCiAgKiAgVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHNpbmdsZSBjcmMgcmVnaW9uIHVzZWQgZm9yIGNyYyBjYWxjdWxhdGlvbi4KICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgVUNIQVIgaXNBY3RpdmU7Ci0gIElOVCAgIG1heEJpdHM7Ci0gIFVJTlQgIGJpdEJ1ZkNudEJpdHM7Ci0gIFVJTlQgIHZhbGlkQml0czsKKyAgSU5UIG1heEJpdHM7CisgIElOVCBiaXRCdWZDbnRCaXRzOworICBJTlQgdmFsaWRCaXRzOwogCiB9IENDcmNSZWdEYXRhOwogCiAvKioKICAqICBDUkMgaW5mbyBzdHJ1Y3R1cmUuCiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgQ0NyY1JlZ0RhdGEgIGNyY1JlZ0RhdGFbTUFYX0NSQ19SRUdTXTsgICAvKiE8IE11bHRpcGxlIGNyYyByZWdpb24gZGVzY3JpcHRpb24uICovCi0gICAgY29uc3QgVVNIT1JUICAgICAgICpwQ3JjTG9va3VwOyAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gbG9va3VwIHRhYmxlIGZpbGxlZCBpbiBGREtfY3JjSW5pdCgpLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBDQ3JjUmVnRGF0YSBjcmNSZWdEYXRhW01BWF9DUkNfUkVHU107IC8qITwgTXVsdGlwbGUgY3JjIHJlZ2lvbiBkZXNjcmlwdGlvbi4gKi8KKyAgY29uc3QgVVNIT1JUKgorICAgICAgcENyY0xvb2t1cDsgLyohPCBQb2ludGVyIHRvIGxvb2t1cCB0YWJsZSBmaWxsZWQgaW4gRkRLX2NyY0luaXQoKS4gKi8KIAotICAgIFVTSE9SVCAgICAgICAgICAgICAgY3JjUG9seTsgICAgICAgICAgICAgLyohPCBDUkMgZ2VuZXJhdG9yIHBvbHlub20uICovCi0gICAgVVNIT1JUICAgICAgICAgICAgICBjcmNNYXNrOyAgICAgICAgICAgICAvKiE8IENSQyBtYXNrLiAqLwotICAgIFVTSE9SVCAgICAgICAgICAgICAgc3RhcnRWYWx1ZTsgICAgICAgICAgLyohPCBDUkMgc3RhcnQgdmFsdWUuICovCi0gICAgVUNIQVIgICAgICAgICAgICAgICBjcmNMZW47ICAgICAgICAgICAgICAvKiE8IENSQyBsZW5ndGguICovCisgIFVTSE9SVCBjcmNQb2x5OyAgICAvKiE8IENSQyBnZW5lcmF0b3IgcG9seW5vbS4gKi8KKyAgVVNIT1JUIGNyY01hc2s7ICAgIC8qITwgQ1JDIG1hc2suICovCisgIFVTSE9SVCBzdGFydFZhbHVlOyAvKiE8IENSQyBzdGFydCB2YWx1ZS4gKi8KKyAgVUNIQVIgY3JjTGVuOyAgICAgIC8qITwgQ1JDIGxlbmd0aC4gKi8KIAotICAgIFVJTlQgICAgICAgICAgICAgICAgcmVnU3RhcnQ7ICAgICAgICAgICAgLyohPCBTdGFydCByZWdpb24gbWFya2VyIGZvciBzeW5jaHJvbml6YXRpb24uICovCi0gICAgVUlOVCAgICAgICAgICAgICAgICByZWdTdG9wOyAgICAgICAgICAgICAvKiE8IFN0b3AgcmVnaW9uIG1hcmtlciBmb3Igc3luY2hyb25pemF0aW9uLiAqLworICBVSU5UIHJlZ1N0YXJ0OyAvKiE8IFN0YXJ0IHJlZ2lvbiBtYXJrZXIgZm9yIHN5bmNocm9uaXphdGlvbi4gKi8KKyAgVUlOVCByZWdTdG9wOyAgLyohPCBTdG9wIHJlZ2lvbiBtYXJrZXIgZm9yIHN5bmNocm9uaXphdGlvbi4gKi8KIAotICAgIFVTSE9SVCAgICAgICAgICAgICAgY3JjVmFsdWU7ICAgICAgICAgICAgLyohPCBDcmMgdmFsdWUgdG8gYmUgY2FsY3VsYXRlZC4gKi8KKyAgVVNIT1JUIGNyY1ZhbHVlOyAvKiE8IENyYyB2YWx1ZSB0byBiZSBjYWxjdWxhdGVkLiAqLwogCiB9IEZES19DUkNJTkZPOwogCkBAIC0xMzYsMjUgKzE0NSwyMiBAQAogICovCiB0eXBlZGVmIEZES19DUkNJTkZPKiBIQU5ETEVfRkRLX0NSQ0lORk87CiAKLQogLyoqCiAgKiBcYnJpZWYgIEluaXRpYWxpemUgQ1JDIHN0cnVjdHVyZS4KICAqCi0gKiBUaGUgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgZXhpc3RpbmcgY3JjIGluZm8gc3RydWN0dXJlIHdpdGggZGVub3RlZCBjb25maWd1cmF0aW9uLgorICogVGhlIGZ1bmN0aW9uIGluaXRpYWxpemVzIGV4aXN0aW5nIGNyYyBpbmZvIHN0cnVjdHVyZSB3aXRoIGRlbm90ZWQKKyAqIGNvbmZpZ3VyYXRpb24uCiAgKgotICogXHBhcmFtIGhDcmNJbmZvICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIG91dGx5aW5nIGFsbG9jYXRlZCBjcmMgaW5mbyBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gaENyY0luZm8gICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gb3V0bHlpbmcgYWxsb2NhdGVkIGNyYyBpbmZvCisgKiBzdHJ1Y3R1cmUuCiAgKiBccGFyYW0gY3JjUG9seSAgICAgICAgICAgICAgIENvbmZpZ3VyZSBjcmMgcG9seW5vbS4KICAqIFxwYXJhbSBjcmNTdGFydFZhbHVlICAgICAgICAgQ29uZmlndXJlIGNyYyBzdGFydCB2YWx1ZS4KICAqIFxwYXJhbSBjcmNMZW4gICAgICAgICAgICAgICAgQ29uZmlndXJlIGNyYyBsZW5ndGguCiAgKgogICogXHJldHVybiAgbm9uZQogICovCi12b2lkIEZES2NyY0luaXQoCi0gICAgICAgIEhBTkRMRV9GREtfQ1JDSU5GTyAgICAgICAgICAgICAgaENyY0luZm8sCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICAgICAgY3JjUG9seSwKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgICAgICBjcmNTdGFydFZhbHVlLAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgICAgIGNyY0xlbgotICAgICAgICApOwordm9pZCBGREtjcmNJbml0KEhBTkRMRV9GREtfQ1JDSU5GTyBoQ3JjSW5mbywgY29uc3QgVUlOVCBjcmNQb2x5LAorICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgY3JjU3RhcnRWYWx1ZSwgY29uc3QgVUlOVCBjcmNMZW4pOwogCiAvKioKICAqIFxicmllZiAgUmVzZXQgQ1JDIGluZm8gc3RydWN0dXJlLgpAQCAtMTY1LDQyICsxNzEsMzcgQEAKICAqCiAgKiBccmV0dXJuICBub25lCiAgKi8KLXZvaWQgRkRLY3JjUmVzZXQoCi0gICAgICAgIEhBTkRMRV9GREtfQ1JDSU5GTyAgICAgICAgICAgICAgaENyY0luZm8KLSAgICAgICAgKTsKLQordm9pZCBGREtjcmNSZXNldChIQU5ETEVfRkRLX0NSQ0lORk8gaENyY0luZm8pOwogCiAvKioKICAqIFxicmllZiAgU3RhcnQgQ1JDIHJlZ2lvbiB3aXRoIG1heGltdW0gbnVtYmVyIG9mIGJpdHMuCiAgKgotICogVGhpcyBmdW5jdGlvbiBtYXJrcyBwb3NpdGlvbiBpbiBiaXRzdHJlYW0gdG8gYmUgdXNlZCBhcyBzdGFydCBwb2ludCBmb3IgY3JjIGNhbGN1bGF0aW9uLgotICogQml0c3RyZWFtIHJhbmdlIGZvciBjcmMgY2FsY3VsYXRpb24gY2FuIGJlIGxpbWl0ZWQgb3Iga2VwdCBkeW5hbWljIGRlcGVuZGluZyBvbiBtQml0cyBwYXJhbWV0ZXIuCi0gKiBUaGUgY3JjIHJlZ2lvbiBoYXMgdG8gYmUgdGVybWluYXRlZCB3aXRoIEZES2NyY0VuZFJlZygpIGluIGVhY2ggY2FzZS4KKyAqIFRoaXMgZnVuY3Rpb24gbWFya3MgcG9zaXRpb24gaW4gYml0c3RyZWFtIHRvIGJlIHVzZWQgYXMgc3RhcnQgcG9pbnQgZm9yIGNyYworICogY2FsY3VsYXRpb24uIEJpdHN0cmVhbSByYW5nZSBmb3IgY3JjIGNhbGN1bGF0aW9uIGNhbiBiZSBsaW1pdGVkIG9yIGtlcHQKKyAqIGR5bmFtaWMgZGVwZW5kaW5nIG9uIG1CaXRzIHBhcmFtZXRlci4gVGhlIGNyYyByZWdpb24gaGFzIHRvIGJlIHRlcm1pbmF0ZWQKKyAqIHdpdGggRkRLY3JjRW5kUmVnKCkgaW4gZWFjaCBjYXNlLgogICoKICAqIFxwYXJhbSBoQ3JjSW5mbyAgICAgICAgICAgICAgUG9pbnRlciB0byBjcmMgaW5mbyBzdHVjdHVyZS4KICAqIFxwYXJhbSBoQnMgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBjdXJyZW50IGJpdCBidWZmZXIgc3RydWN0dXJlLgogICogXHBhcmFtIG1CaXRzICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgYml0cyBpbiBjcmMgcmVnaW9uIHRvIGJlIGNhbGN1bGF0ZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbUJpdHMgPiAwOiBaZXJvIHBhZGRpbmcgd2lsbCBiZSB1c2VkIGZvciBDUkMgY2FsY3VsYXRpb24sIGlmIHRoZXJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgbGVzcyB0aGFuIG1CaXRzIGJpdHMgYXZhaWxhYmxlLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1CaXRzID4gMDogWmVybyBwYWRkaW5nIHdpbGwgYmUgdXNlZCBmb3IgQ1JDCisgKiBjYWxjdWxhdGlvbiwgaWYgdGhlcmUgYXJlIGxlc3MgdGhhbiBtQml0cyBiaXRzIGF2YWlsYWJsZS4KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtQml0cyA8IDA6IE5vIHplcm8gcGFkZGluZyBpcyBkb25lLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1CaXRzID0gMDogVGhlIG51bWJlciBvZiBiaXRzIHVzZWQgaW4gY3JjIGNhbGN1bGF0aW9uIGlzIGR5bmFtaWNhbGx5LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIGJpdHN0cmVhbSBwb3NpdGlvbiBiZXR3ZWVuIEZES2NyY1N0YXJ0UmVnKCkgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREtjcmNFbmRSZWcoKSBjYWxsLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1CaXRzID0gMDogVGhlIG51bWJlciBvZiBiaXRzIHVzZWQgaW4gY3JjCisgKiBjYWxjdWxhdGlvbiBpcyBkeW5hbWljYWxseSwgZGVwZW5kaW5nIG9uIGJpdHN0cmVhbSBwb3NpdGlvbiBiZXR3ZWVuCisgKiBGREtjcmNTdGFydFJlZygpIGFuZCBGREtjcmNFbmRSZWcoKQorICogY2FsbC4KICAqCiAgKiBccmV0dXJuICBJRCBmb3IgdGhlIGNyZWF0ZWQgcmVnaW9uLCAtMSBpbiBjYXNlIG9mIGFuIGVycm9yCiAgKi8KLUlOVCBGREtjcmNTdGFydFJlZygKLSAgICAgICAgSEFORExFX0ZES19DUkNJTkZPICAgICAgICAgICAgICBoQ3JjSW5mbywKLSAgICAgICAgY29uc3QgSEFORExFX0ZES19CSVRTVFJFQU0gICAgICBoQnMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgbUJpdHMKLSAgICAgICAgKTsKLQorSU5UIEZES2NyY1N0YXJ0UmVnKEhBTkRMRV9GREtfQ1JDSU5GTyBoQ3JjSW5mbywgY29uc3QgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBtQml0cyk7CiAKIC8qKgogICogXGJyaWVmICBFbmRzIENSQyByZWdpb24uCiAgKgotICogVGhpcyBmdW5jdGlvbiB0ZXJtaW5hdGVzIGNyYyByZWdpb24gc3BlY2lmaWVkIHdpdGggRkRLY3JjU3RhcnRSZWcoKS4gVGhlIG51bWJlciBvZiBiaXRzIGluIGNyYyByZWdpb24gZGVwZW5kcwotICogb24gbUJpdHMgcGFyYW1ldGVyIG9mIEZES2NyY1N0YXJ0UmVnKCkuCisgKiBUaGlzIGZ1bmN0aW9uIHRlcm1pbmF0ZXMgY3JjIHJlZ2lvbiBzcGVjaWZpZWQgd2l0aCBGREtjcmNTdGFydFJlZygpLiBUaGUKKyAqIG51bWJlciBvZiBiaXRzIGluIGNyYyByZWdpb24gZGVwZW5kcyBvbiBtQml0cyBwYXJhbWV0ZXIgb2YgRkRLY3JjU3RhcnRSZWcoKS4KICAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhbmQgdXBkYXRlcyBjcmMgaW4gaW5mbyBzdHJ1Y3R1cmUuCiAgKgogICogXHBhcmFtIGhDcmNJbmZvICAgICAgICAgICAgICBQb2ludGVyIHRvIGNyYyBpbmZvIHN0dWN0dXJlLgpAQCAtMjA5LDEyICsyMTAsOCBAQAogICoKICAqIFxyZXR1cm4gIDAgb24gc3VjY2VzcwogICovCi1JTlQgRkRLY3JjRW5kUmVnKAotICAgICAgICBIQU5ETEVfRkRLX0NSQ0lORk8gICAgICAgICAgICAgIGhDcmNJbmZvLAotICAgICAgICBjb25zdCBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICAgIGhCcywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICByZWcKLSAgICAgICAgKTsKLQorSU5UIEZES2NyY0VuZFJlZyhIQU5ETEVfRkRLX0NSQ0lORk8gaENyY0luZm8sIGNvbnN0IEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHJlZyk7CiAKIC8qKgogICogXGJyaWVmICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgY3JjIHZhbHVlIGZyb20gaW5mbyBzdHJ1Y3QuCkBAIC0yMjMsOSArMjIwLDYgQEAKICAqCiAgKiBccmV0dXJuICBDUkMgdmFsdWUgbWFza2VkIHdpdGggY3JjIGxlbmd0aC4KICAqLwotVVNIT1JUIEZES2NyY0dldENSQygKLSAgICAgICAgY29uc3QgSEFORExFX0ZES19DUkNJTkZPICAgICAgICBoQ3JjSW5mbwotICAgICAgICApOwotCitVU0hPUlQgRkRLY3JjR2V0Q1JDKGNvbnN0IEhBTkRMRV9GREtfQ1JDSU5GTyBoQ3JjSW5mbyk7CiAKICNlbmRpZiAvKiBGREtfQ1JDX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL0ZES19kZWNvcnJlbGF0ZS5oIGIvbGliRkRLL2luY2x1ZGUvRkRLX2RlY29ycmVsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzYWFhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYkZESy9pbmNsdWRlL0ZES19kZWNvcnJlbGF0ZS5oCkBAIC0wLDAgKzEsMzE0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXJrdXMgTG9od2Fzc2VyCisKKyAgIERlc2NyaXB0aW9uOiBGREsgVG9vbHMgRGVjb3JyZWxhdG9yCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRkRLX0RFQ09SUkVMQVRFX0gKKyNkZWZpbmUgRkRLX0RFQ09SUkVMQVRFX0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworI2RlZmluZSBGSVhQX01QUyBGSVhQX0RCTAorCisjaWZuZGVmIEFSQ0hfUFJFRkVSX01VTFRfMzJ4MzIKKyNkZWZpbmUgRklYUF9ERUNPUlIgRklYUF9TR0wKKyNkZWZpbmUgRlhfREVDT1JSMkZYX0RCTCBGWF9TR0wyRlhfREJMCisjZGVmaW5lIEZYX0RFQ09SUjJGWF9TR0wKKyNkZWZpbmUgRlhfREJMMkZYX0RFQ09SUiBGWF9EQkwyRlhfU0dMCisjZGVmaW5lIEZYX1NHTDJGWF9ERUNPUlIKKyNkZWZpbmUgREVDT1JSKGEpIChGWF9EQkwyRlhDT05TVF9TR0woYSkpCisjZGVmaW5lIEZMMkZYQ09OU1RfREVDT1JSIEZMMkZYQ09OU1RfU0dMCisjZWxzZQorI2RlZmluZSBGSVhQX0RFQ09SUiBGSVhQX0RCTAorI2RlZmluZSBGWF9ERUNPUlIyRlhfREJMCisjZGVmaW5lIEZYX0RFQ09SUjJGWF9TR0wgRlhfREJMMkZYX1NHTAorI2RlZmluZSBGWF9EQkwyRlhfREVDT1JSCisjZGVmaW5lIEZYX1NHTDJGWF9ERUNPUlIgRlhfU0dMMkZYX0RCTAorI2RlZmluZSBERUNPUlIoYSkgRklYUF9EQkwoYSkKKyNkZWZpbmUgRkwyRlhDT05TVF9ERUNPUlIgRkwyRlhDT05TVF9EQkwKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLSBlbnVtcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBEZWNvcnJlbGF0b3IgdHlwZXMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIERFQ09SUl9NUFMsICAvKio8IERlY29ycmVsYXRvciB0eXBlIHVzZWQgYnkgTVBTIExQL0hRICovCisgIERFQ09SUl9QUywgICAvKio8IERlY29ycmVsYXRvciB0eXBlIHVzZWQgYnkgSEVBQUN2MiBhbmQgTVBTIExQICovCisgIERFQ09SUl9VU0FDLCAvKio8IERlY29ycmVsYXRvciB0eXBlIHVzZWQgYnkgVVNBQyAqLworICBERUNPUlJfTEQgICAgLyoqPCBEZWNvcnJlbGF0b3IgdHlwZSB1c2VkIGJ5IE1QUyBMb3cgRGVsYXkgKi8KK30gRkRLX0RFQ09SUl9UWVBFOworCisvKioKKyAqIER1Y2tlciB0eXBlcy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgRFVDS0VSX0FVVE9NQVRJQywgLyoqPCBGREtkZWNvcnJlbGF0ZUluaXQoKSBjaG9vc2VzIGNvcnJlY3QgZHVja2VyIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHByb3ZpZGVkIHBhcmFtZXRlcnMuICovCisgIERVQ0tFUl9NUFMsICAgICAgIC8qKjwgRm9yY2UgZHVja2VyIHR5cGUgdG8gTVBTLiAqLworICBEVUNLRVJfUFMgICAgICAgICAvKio8IEZvcmNlIGR1Y2tlciB0eXBlIHRvIFBTLiAqLworfSBGREtfRFVDS0VSX1RZUEU7CisKKy8qKgorICogUmV2ZXJiIGJhbmQgdHlwZXMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIE5PVF9FWElTVCwgLyoqPCBNYXJrIHJldmVyYiBiYW5kIGFzIG5vbi1leGlzdGluZyAobnVtYmVyIG9mIGJhbmRzID0gMCkuICovCisgIERFTEFZLCAvKio8IFJldmVyYiBiYW5kcyBqdXN0IGNvbnRhaW5zIGRlbGF5IGVsZW1lbnRzIGFuZCBubyBhbGxwYXNzIGZpbHRlcnMuCisgICAgICAgICAgKi8KKyAgQ09NTU9OX1JFQUwsICAvKio8IFJlYWwgZmlsdGVyIGNvZWZmcywgY29tbW9uIGZpbHRlciBjb2VmZnMgd2l0aGluIG9uZSByZXZlcmIKKyAgICAgICAgICAgICAgICAgICBiYW5kICovCisgIENPTU1PTl9DUExYLCAgLyoqPCBDb21wbGV4IGZpbHRlciBjb2VmZnMsIGNvbW1vbiBmaWx0ZXIgY29lZmZzIHdpdGhpbiBvbmUKKyAgICAgICAgICAgICAgICAgICByZXZlcmIgYmFuZCAqLworICBJTkRFUF9DUExYLCAgIC8qKjwgQ29tcGxleCBmaWx0ZXIgY29lZmZzLCBpbmRlcGVuZGVudCBmaWx0ZXIgY29lZmZzIGZvciBlYWNoCisgICAgICAgICAgICAgICAgICAgaHlicmlkIGJhbmQgKi8KKyAgSU5ERVBfQ1BMWF9QUyAvKio8IFBTIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBvZiBnZW5lcmFsIElOREVQX0NQTFggdHlwZSAqLworfSBSRVZCQU5EX0ZJTFRfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgREVDT1JSX0RFQyAqSEFORExFX0RFQ09SUl9ERUM7CisKK3R5cGVkZWYgc3RydWN0IERVQ0tFUl9JTlNUQU5DRSB7CisgIGludCBoeWJyaWRCYW5kczsKKyAgaW50IHBhcmFtZXRlckJhbmRzOworICBpbnQgcGFydGlhbGx5Q29tcGxleDsKKyAgRkRLX0RVQ0tFUl9UWVBFIGR1Y2tlclR5cGU7CisKKyAgY29uc3QgVUNIQVIgKnFzX25leHQ7CisgIGNvbnN0IFVDSEFSICptYXBQcm9jQmFuZHMySHliQmFuZHM7CisgIGNvbnN0IFVDSEFSICptYXBIeWJCYW5kczJQcm9jQmFuZHM7CisgIC8qIGludGVybGVhdmVkICAgICBTbW9vdGhEaXJlY3ROcmdbXSBhbmQgU21vb3RoUmV2ZXJiTnJnW10sCisgICAgIG5vbi1pbnRlcmxlYXZlZCBTbW9vdGhEaXJlY3ROcmdbXSBpbiBjYXNlIG9mIHBhcmFtZXRyaWMgc3RlcmVvICovCisgIEZJWFBfTVBTIFNtb290aERpclJldk5yZ1syICogKDI4KV07CisKKyAgLyoKKyAgICBwYXJhbWV0cmljIHN0ZXJlbworICAqLworICBGSVhQX01QUyBwZWFrRGVjYXlbKDI4KV07CisgIEZJWFBfTVBTIHBlYWtEaWZmWygyOCldOworICBGSVhQX0RCTCBtYXhWYWxEaXJlY3REYXRhOworICBGSVhQX0RCTCBtYXhWYWxSZXZlcmJEYXRhOworICBTQ0hBUiBzY2FsZURpcmVjdE5yZzsKKyAgU0NIQVIgc2NhbGVSZXZlcmJOcmc7CisgIFNDSEFSIHNjYWxlU21vb3RoRGlyUmV2TnJnOworICBTQ0hBUiBoZWFkcm9vbVNtb290aERpclJldk5yZzsKKworfSBEVUNLRVJfSU5TVEFOQ0U7CisKK3R5cGVkZWYgc3RydWN0IERFQ09SUl9GSUxURVJfSU5TVEFOQ0UgeworICBGSVhQX01QUyAqc3RhdGVDcGx4OworICBGSVhQX0RCTCAqRGVsYXlCdWZmZXJDcGx4OworCisgIGNvbnN0IEZJWFBfREVDT1JSICpudW1lcmF0b3JSZWFsOworICBjb25zdCBGSVhQX1NUUCAqY29lZmZzUGFja2VkOworICBjb25zdCBGSVhQX0RFQ09SUiAqZGVub21pbmF0b3JSZWFsOworfSBERUNPUlJfRklMVEVSX0lOU1RBTkNFOworCit0eXBlZGVmIHN0cnVjdCBERUNPUlJfREVDIHsKKyAgSU5UIExfc3RhdGVCdWZmZXJDcGx4OworICBGSVhQX0RCTCAqc3RhdGVCdWZmZXJDcGx4OworICBJTlQgTF9kZWxheUJ1ZmZlckNwbHg7CisgIEZJWFBfREJMICpkZWxheUJ1ZmZlckNwbHg7CisKKyAgY29uc3QgUkVWQkFORF9GSUxUX1RZUEUgKlJFVl9maWx0VHlwZTsKKyAgY29uc3QgVUNIQVIgKlJFVl9iYW5kT2Zmc2V0OworICBjb25zdCBVQ0hBUiAqUkVWX2RlbGF5OworICBjb25zdCBTQ0hBUiAqUkVWX2ZpbHRlck9yZGVyOworICBJTlQgcmV2ZXJiQmFuZERlbGF5QnVmZmVySW5kZXhbKDQpXTsKKyAgVUNIQVIgc3RhdGVCdWZmZXJPZmZzZXRbKDMpXTsKKworICBERUNPUlJfRklMVEVSX0lOU1RBTkNFIEZpbHRlclsoNzEpXTsKKyAgRFVDS0VSX0lOU1RBTkNFIGR1Y2tlcjsKKworICBpbnQgbnVtYmluczsKKyAgaW50IHBhcnRpYWxseUNvbXBsZXg7Cit9IERFQ09SUl9ERUM7CisKKy8qKgorICogXGJyaWVmICBDcmVhdGUgb25lIGluc3RhbmNlIG9mIERlY29ycmVsYXRvci4KKyAqCisgKiBccGFyYW0gaERlY29yckRlYyAgICAgICAgICBBIHBvaW50ZXIgdG8gYSBkZWNvcnJlbGF0b3IgaW5zdGFuY2Ugd2hpY2ggd2FzCisgKiBhbGxvY2F0ZWQgZXh0ZXJuYWxseS4KKyAqIFxwYXJhbSBidWZmZXJDcGx4ICAgICAgICAgIEV4dGVybmFsbHkgYWxsb2NhdGVkIGJ1ZmZlciAoYWxsb2NhdGUgKDIqKCAoIDgyNSApCisgKiArICggMzczICkgKSkgRklYUF9EQkwgdmFsdWVzKS4KKyAqIFxwYXJhbSBidWZMZW4gICAgICAgICAgICAgIExlbmd0aCBvZiBidWZmZXJDcGx4LiBNdXN0IGJlID49ICgyKiggKCA4MjUgKSArICgKKyAqIDM3MyApICkpLgorICoKKyAqIFxyZXR1cm4gIDAgb24gc3VjY2Vzcy4KKyAqLworSU5UIEZES2RlY29ycmVsYXRlT3BlbihIQU5ETEVfREVDT1JSX0RFQyBoRGVjb3JyRGVjLCBGSVhQX0RCTCAqYnVmZmVyQ3BseCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGJ1Zkxlbik7CisKKy8qKgorICogXGJyaWVmICBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgRGVjb3JyZWxhdG9yIGluc3RhbmNlLgorICoKKyAqIFxwYXJhbSBoRGVjb3JyRGVjICAgICAgICAgIEEgRGVjb3JyZWxhdG9yIGhhbmRsZS4KKyAqIFxwYXJhbSBuckh5YkJhbmRzICAgICAgICAgIE51bWJlciBvZiAoaHlicmlkKSBiYW5kcy4KKyAqIFxwYXJhbSBkZWNvcnJUeXBlICAgICAgICAgIERlY29ycmVsYXRvciB0eXBlIHRvIHVzZS4KKyAqIFxwYXJhbSBkdWNrZXJUeXBlICAgICAgICAgIER1Y2tlciB0eXBlIHRvIHVzZSAoaW4gZ2VuZXJhbCB1c2UKKyAqIERVQ0tFUl9BVVRPTUFUSUMpLgorICogXHBhcmFtIGRlY29yckNvbmZpZyAgICAgICAgRGVwZW5kaW5nIG9uIGRlY29yclR5cGUgdmFsdWVzIG9mIDAsMSwyIGFyZQorICogYWxsb3dlZC4KKyAqIFxwYXJhbSBzZWVkICAgICAgICAgICAgICAgIFNlZWQgb2YgZGVjb3JyZWxhdG9yIGluc3RhbmNlLiBBbGxvd2VkIG1heGltdW0KKyAqIHZhbHVlZCBkZXBlbmRzIG9uIGRlY29yclR5cGUuCisgKiBccGFyYW0gcGFydGlhbGx5Q29tcGxleCAgICBMb3cgcG93ZXIgb3IgaGlnaCBxdWFsaXR5IHByb2Nlc3NpbmcgMDogSFEsIDE6IExRCisgKiAob25seSBhbGxvd2VkIGZvciBERUNPUlJfTVBTIHwgREVDT1JSX1BTKS4KKyAqIFxwYXJhbSB1c2VGcmFjdERlbGF5ICAgICAgIEluZGljYXRlIHVzYWdlIG9mIGZyYWN0aW9uYWwgZGVsYXkgMDogb2ZmLCAxOiBvbgorICogKGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkKS4KKyAqIFxwYXJhbSBpc0xlZ2FjeVBTICAgICAgICAgIEluZGljYXRlIGlmIERFQ09SUl9QUyBpcyB1c2VkIGZvciBIRUFBQ3YyIChmb3IgYWxsCisgKiBvdGhlciBjYXNlczogaXNMZWdhY3lQUyA9IDApLiBUaGUgcHVycG9zZSBvZiB0aGlzIHBhcmFtZXRlciBpcyB0byBzZWxlY3QgdGhlCisgKiBjb3JyZWN0IG51bWJlciBvZiBwYXJhbSBiYW5kcyBmb3IgdGhlIGR1Y2tlci4KKyAqIFxwYXJhbSBpbml0U3RhdGVzRmxhZyAgICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdGF0ZXMgYnVmZmVyIGhhcyB0byBiZQorICogY2xlYXJlZC4KKyAqCisgKiBccmV0dXJuICAwIG9uIHN1Y2Nlc3MuCisgKi8KK0lOVCBGREtkZWNvcnJlbGF0ZUluaXQoSEFORExFX0RFQ09SUl9ERUMgaERlY29yckRlYywgY29uc3QgSU5UIG5ySHliQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZES19ERUNPUlJfVFlQRSBkZWNvcnJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGREtfRFVDS0VSX1RZUEUgZHVja2VyVHlwZSwgY29uc3QgSU5UIGRlY29yckNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNlZWQsIGNvbnN0IElOVCBwYXJ0aWFsbHlDb21wbGV4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgdXNlRnJhY3REZWxheSwgY29uc3QgSU5UIGlzTGVnYWN5UFMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpbml0U3RhdGVzRmxhZyk7CisKKy8qKgorICogXGJyaWVmICBBcHBseSBEZWNvcnJlbGF0b3Igb24gaW5wdXQgZGF0YS4KKyAqCisgKiBGdW5jdGlvbiBhcHBsaWVzIGRlY29ycmVsYXRvciBhbmQgZHVja2VyIGlucGxhY2Ugb24gaHlicmlkIGlucHV0IGRhdGEuCisgKiBNb2RpZmllZCBoeWJyaWQgZGF0YSB3aWxsIGJlIHJldHVybmVkIGlucGxhY2UuCisgKgorICogXHBhcmFtIGhEZWNvcnJEZWMgICAgICAgICAgQSBkZWNvcnJlbGF0b3IgaGFuZGxlLgorICogXHBhcmFtIGRhdGFSZWFsSW4gICAgICAgICAgSW4gKGh5YnJpZCkgZGF0YS4KKyAqIFxwYXJhbSBkYXRhSW1hZ0luICAgICAgICAgIEluIChoeWJyaWQpIGRhdGEuCisgKiBccGFyYW0gZGF0YVJlYWxPdXQgICAgICAgICBPdXQgKGh5YnJpZCkgZGF0YSAoY2FuIGJlIHNhbWUgYXMgZGF0YVJlYWxJbiBmb3IKKyAqIGluLXBsYWNlIGNhbGN1bGF0aW9uKS4KKyAqIFxwYXJhbSBkYXRhSW1hZ091dCAgICAgICAgIE91dCAoaHlicmlkKSBkYXRhIChjYW4gYmUgc2FtZSBhcyBkYXRhSW1hZ0luIGZvcgorICogaW4tcGxhY2UgY2FsY3VsYXRpb24pLgorICogXHBhcmFtIHN0YXJ0SHliQmFuZCAgICAgICAgSHlicmlkIGJhbmQgdG8gc3RhcnQgd2l0aCBkZWNvcnJlbGF0aW9uLgorICoKKyAqIFxyZXR1cm4gIDAgb24gc3VjY2Vzcy4KKyAqLworSU5UIEZES2RlY29ycmVsYXRlQXBwbHkoSEFORExFX0RFQ09SUl9ERUMgaERlY29yckRlYywgRklYUF9EQkwgKmRhdGFSZWFsSW4sCisgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqZGF0YUltYWdJbiwgRklYUF9EQkwgKmRhdGFSZWFsT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmRhdGFJbWFnT3V0LCBjb25zdCBJTlQgc3RhcnRIeWJCYW5kKTsKKworLyoqCisgKiBcYnJpZWYgIERlc3Ryb3kgYSBEZWNvcnJlbGF0b3IgaW5zdGFuY2UuCisgKgorICogRGVhbGxvY2F0ZSB3aG9sZSBtZW1vcnkgb2YgZGVjb3JyYWx0b3IgYW5kIGluc2lkZSBkdWNrZXIuCisgKgorICogXHBhcmFtIGhEZWNvcnJEZWMgIFBvaW50ZXIgdG8gYSBkZWNvZGVycm9sYXRvciBoYW5kbGUuIE51bGwgaW5pdGlhbGl6ZWQgb24KKyAqIHJldHVybi4KKyAqCisgKiBccmV0dXJuICAwIG9uIHN1Y2Nlc3MuCisgKi8KK0lOVCBGREtkZWNvcnJlbGF0ZUNsb3NlKEhBTkRMRV9ERUNPUlJfREVDIGhEZWNvcnJEZWMpOworCisvKioKKyAqIFxicmllZiAgR2V0IG1heCB2YWx1ZSBhZGRyZXNzIG9mIGRpcmVjdCBzaWduYWwuCisgKgorICogR2V0IG1heCB2YWx1ZSBhZGRyZXNzIG9mIGRpcmVjdCBzaWduYWwgbmVlZGVkIGZvciBkdWNrZXIgZW5lcmd5IGNhbGN1bGF0aW9uLgorICoKKyAqIFxwYXJhbSBoRGVjb3JyRGVjICBQb2ludGVyIHRvIGEgZGVjb2RlcnJvbGF0b3IgaGFuZGxlLgorICoKKyAqIFxyZXR1cm4gIGFkZHJlc3Mgb2YgbWF4IHZhbHVlCisgKi8KK0ZJWFBfREJMICpnZXRBZGRyRGlyZWN0U2lnbmFsTWF4VmFsKEhBTkRMRV9ERUNPUlJfREVDIGhEZWNvcnJEZWMpOworCisjZW5kaWYgLyogRkRLX0RFQ09SUkVMQVRFX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL0ZES19oeWJyaWQuaCBiL2xpYkZESy9pbmNsdWRlL0ZES19oeWJyaWQuaAppbmRleCA2M2YyZDcwLi41ODNmMjk5IDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9GREtfaHlicmlkLmgKKysrIGIvbGliRkRLL2luY2x1ZGUvRkRLX2h5YnJpZC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE5ICs5MCwxOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAotICAgQXV0aG9yKHMpOiBNYXJrdXMgTG9od2Fzc2VyCisgICBBdXRob3Iocyk6ICAgTWFya3VzIExvaHdhc3NlcgorCiAgICBEZXNjcmlwdGlvbjogRkRLIFRvb2xzIEh5YnJpZCBGaWx0ZXJiYW5rCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgX19GREtfSFlCUklEX0gKLSNkZWZpbmUgX19GREtfSFlCUklEX0gKLQotCisjaWZuZGVmIEZES19IWUJSSURfSAorI2RlZmluZSBGREtfSFlCUklEX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIApAQCAtMTAxLDU3ICsxMTEsNTMgQEAKICAqIEh5YnJpZCBGaWx0ZXJiYW5kIG1vZGVzLgogICovCiB0eXBlZGVmIGVudW0gewotICAgIFRIUkVFX1RPX1RFTiwKLSAgICBUSFJFRV9UT19UV0VMVkUsCi0gICAgVEhSRUVfVE9fU0lYVEVFTgorICBUSFJFRV9UT19URU4sCisgIFRIUkVFX1RPX1RXRUxWRSwKKyAgVEhSRUVfVE9fU0lYVEVFTgogCiB9IEZES19IWUJSSURfTU9ERTsKIAotCiAvKi0tLS0tLS0tLS0tLS0tLSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IEZES19IWUJSSURfU0VUVVAgKkhBTkRMRV9GREtfSFlCUklEX1NFVFVQOwordHlwZWRlZiBjb25zdCBzdHJ1Y3QgRkRLX0hZQlJJRF9TRVRVUCAqSEFORExFX0ZES19IWUJSSURfU0VUVVA7CiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIEZJWFBfREJMICAgICAgICAgICAgICpidWZmZXJMRlJlYWxbM107ICAgICAvKiE8IExGIHJlYWwgZmlsdGVyIHN0YXRlcy4gKi8KLSAgRklYUF9EQkwgICAgICAgICAgICAgKmJ1ZmZlckxGSW1hZ1szXTsgICAgIC8qITwgTEYgaW1hZyBmaWx0ZXIgc3RhdGVzLiAqLwotICBGSVhQX0RCTCAgICAgICAgICAgICAqYnVmZmVySEZSZWFsWzEzXTsgICAgLyohPCBIRiByZWFsIGRlbGF5IGxpbmVzLiAqLwotICBGSVhQX0RCTCAgICAgICAgICAgICAqYnVmZmVySEZJbWFnWzEzXTsgICAgLyohPCBIRiBpbWFnIGRlbGF5IGxpbmVzLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBGSVhQX0RCTCAqYnVmZmVyTEZSZWFsWzNdOyAgLyohPCBMRiByZWFsIGZpbHRlciBzdGF0ZXMuICovCisgIEZJWFBfREJMICpidWZmZXJMRkltYWdbM107ICAvKiE8IExGIGltYWcgZmlsdGVyIHN0YXRlcy4gKi8KKyAgRklYUF9EQkwgKmJ1ZmZlckhGUmVhbFsxM107IC8qITwgSEYgcmVhbCBkZWxheSBsaW5lcy4gKi8KKyAgRklYUF9EQkwgKmJ1ZmZlckhGSW1hZ1sxM107IC8qITwgSEYgaW1hZyBkZWxheSBsaW5lcy4gKi8KIAotICBJTlQgICAgICAgICAgICAgICAgICAgYnVmZmVyTEZwb3M7ICAgICAgICAgLyohPCBQb3NpdGlvbiB0byB3cml0ZSBpbmNvbWluZyBkYXRhIGludG8gcmluZ2J1ZmZlci4gKi8KLSAgSU5UICAgICAgICAgICAgICAgICAgIGJ1ZmZlckhGcG9zOyAgICAgICAgIC8qITwgRGVsYXkgbGluZSBwb3NpdGlvbmluZy4gKi8KLSAgSU5UICAgICAgICAgICAgICAgICAgIG5yQmFuZHM7ICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIFFNRiBiYW5kcy4gKi8KLSAgSU5UICAgICAgICAgICAgICAgICAgIGNwbHhCYW5kczsgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGNvbXBsZXggUU1GIGJhbmRzLiovCi0gIFVDSEFSICAgICAgICAgICAgICAgICBoZk1vZGU7ICAgICAgICAgICAgICAvKiE8IEZsYWcgc2lnbmFsaXplcyB0cmVhdG1lbnQgb2YgSEYgYmFuZHMuICovCisgIElOVCBidWZmZXJMRnBvczsgLyohPCBQb3NpdGlvbiB0byB3cml0ZSBpbmNvbWluZyBkYXRhIGludG8gcmluZ2J1ZmZlci4gKi8KKyAgSU5UIGJ1ZmZlckhGcG9zOyAvKiE8IERlbGF5IGxpbmUgcG9zaXRpb25pbmcuICovCisgIElOVCBuckJhbmRzOyAgICAgLyohPCBOdW1iZXIgb2YgUU1GIGJhbmRzLiAqLworICBJTlQgY3BseEJhbmRzOyAgIC8qITwgTnVtYmVyIG9mIGNvbXBsZXggUU1GIGJhbmRzLiovCisgIFVDSEFSIGhmTW9kZTsgICAgLyohPCBGbGFnIHNpZ25hbGl6ZXMgdHJlYXRtZW50IG9mIEhGIGJhbmRzLiAqLwogCi0gIEZJWFBfREJMICAgICAgICAgICAgICpwTEZtZW1vcnk7ICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gTEYgc3RhdGVzIGJ1ZmZlci4gKi8KLSAgRklYUF9EQkwgICAgICAgICAgICAgKnBIRm1lbW9yeTsgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBIRiBzdGF0ZXMgYnVmZmVyLiAqLworICBGSVhQX0RCTCAqcExGbWVtb3J5OyAvKiE8IFBvaW50ZXIgdG8gTEYgc3RhdGVzIGJ1ZmZlci4gKi8KKyAgRklYUF9EQkwgKnBIRm1lbW9yeTsgLyohPCBQb2ludGVyIHRvIEhGIHN0YXRlcyBidWZmZXIuICovCiAKLSAgVUlOVCAgICAgICAgICAgICAgICAgIExGbWVtb3J5U2l6ZTsgICAgICAgIC8qITwgU2l6ZSBvZiBMRiBzdGF0ZXMgYnVmZmVyLiAqLwotICBVSU5UICAgICAgICAgICAgICAgICAgSEZtZW1vcnlTaXplOyAgICAgICAgLyohPCBTaXplIG9mIEhGIHN0YXRlcyBidWZmZXIuICovCisgIFVJTlQgTEZtZW1vcnlTaXplOyAvKiE8IFNpemUgb2YgTEYgc3RhdGVzIGJ1ZmZlci4gKi8KKyAgVUlOVCBIRm1lbW9yeVNpemU7IC8qITwgU2l6ZSBvZiBIRiBzdGF0ZXMgYnVmZmVyLiAqLwogCi0gIEhBTkRMRV9GREtfSFlCUklEX1NFVFVQIHBTZXR1cDsgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gZmlsdGVyIHNldHVwLiAqLworICBIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUCBwU2V0dXA7IC8qITwgUG9pbnRlciB0byBmaWx0ZXIgc2V0dXAuICovCiAKIH0gRkRLX0FOQV9IWUJfRklMVEVSOwogCit0eXBlZGVmIHN0cnVjdCB7CisgIElOVCBuckJhbmRzOyAgIC8qITwgTnVtYmVyIG9mIFFNRiBiYW5kcy4gKi8KKyAgSU5UIGNwbHhCYW5kczsgLyohPCBOdW1iZXIgb2YgY29tcGxleCBRTUYgYmFuZHMuKi8KIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgSU5UICAgICAgICAgICAgICAgICAgIG5yQmFuZHM7ICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIFFNRiBiYW5kcy4gKi8KLSAgSU5UICAgICAgICAgICAgICAgICAgIGNwbHhCYW5kczsgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGNvbXBsZXggUU1GIGJhbmRzLiovCi0KLSAgSEFORExFX0ZES19IWUJSSURfU0VUVVAgcFNldHVwOyAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBmaWx0ZXIgc2V0dXAuICovCisgIEhBTkRMRV9GREtfSFlCUklEX1NFVFVQIHBTZXR1cDsgLyohPCBQb2ludGVyIHRvIGZpbHRlciBzZXR1cC4gKi8KIAogfSBGREtfU1lOX0hZQl9GSUxURVI7CiAKIHR5cGVkZWYgRkRLX0FOQV9IWUJfRklMVEVSICpIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSOwogdHlwZWRlZiBGREtfU1lOX0hZQl9GSUxURVIgKkhBTkRMRV9GREtfU1lOX0hZQl9GSUxURVI7CiAKLQogLyoqCiAgKiBcYnJpZWYgIENyZWF0ZSBvbmUgaW5zdGFuY2Ugb2YgSHlicmlkIEFuYWx5aXMgRmlsdGVyYmFuay4KICAqCi0gKiBccGFyYW0gaEFuYWx5c2lzSHliRmlsdGVyICBQb2ludGVyIHRvIGFuIG91dGx5aW5nIGFsbG9jYXRlZCBIeWJyaWQgQW5hbHlzaXMgRmlsdGVyYmFuayBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gaEFuYWx5c2lzSHliRmlsdGVyICBQb2ludGVyIHRvIGFuIG91dGx5aW5nIGFsbG9jYXRlZCBIeWJyaWQgQW5hbHlzaXMKKyAqIEZpbHRlcmJhbmsgc3RydWN0dXJlLgogICogXHBhcmFtIHBMRm1lbW9yeSAgICAgICAgICAgUG9pbnRlciB0byBvdXRseWluZyBidWZmZXIgdXNlZCBMRiBmaWx0ZXJpbmcuCiAgKiBccGFyYW0gTEZtZW1vcnlTaXplICAgICAgICBTaXplIG9mIHBMRm1lbW9yeSBpbiBieXRlcy4KICAqIFxwYXJhbSBwSEZtZW1vcnkgICAgICAgICAgIFBvaW50ZXIgdG8gb3V0bHlpbmcgYnVmZmVyIHVzZWQgSEYgZGVsYXkgbGluZS4KQEAgLTE1OSw0OCArMTY1LDM2IEBACiAgKgogICogXHJldHVybiAgMCBvbiBzdWNjZXNzLgogICovCi1JTlQgRkRLaHlicmlkQW5hbHlzaXNPcGVuKAotICAgICAgICBIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSICBoQW5hbHlzaXNIeWJGaWx0ZXIsCi0gICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIHBMRm1lbW9yeSwKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgTEZtZW1vcnlTaXplLAotICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBwSEZtZW1vcnksCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgIEhGbWVtb3J5U2l6ZQotICAgICAgICApOwotCitJTlQgRkRLaHlicmlkQW5hbHlzaXNPcGVuKEhBTkRMRV9GREtfQU5BX0hZQl9GSUxURVIgaEFuYWx5c2lzSHliRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY29uc3QgcExGbWVtb3J5LCBjb25zdCBVSU5UIExGbWVtb3J5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNvbnN0IHBIRm1lbW9yeSwgY29uc3QgVUlOVCBIRm1lbW9yeVNpemUpOwogCiAvKioKLSAqIFxicmllZiAgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIEh5YnJkaWQgQW5hbHlzaXMgRmlsdGVyYmFuayBpbnN0YW5jZS4KKyAqIFxicmllZiAgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIEh5YnJpZCBBbmFseXNpcyBGaWx0ZXJiYW5rIGluc3RhbmNlLgogICoKICAqIFxwYXJhbSBoQW5hbHlzaXNIeWJGaWx0ZXIgIEEgSHlicmlkIEFuYWx5c2lzIEZpbHRlcmJhbmsgaGFuZGxlLgogICogXHBhcmFtIG1vZGUgICAgICAgICAgICAgICAgU2VsZWN0IGh5YnJpZCBmaWx0ZXIgY29uZmlndXJhdGlvbi4KICAqIFxwYXJhbSBxbWZCYW5kcyAgICAgICAgICAgIE51bWJlciBvZiBxbWYgYmFuZHMgdG8gYmUgcHJvY2Vzc2VkLgogICogXHBhcmFtIGNwbHhCYW5kcyAgICAgICAgICAgTnVtYmVyIG9mIGNvbXBsZXggcW1mIGJhbmRzIHRvIGJlIHByb2Nlc3NlZC4KLSAqIFxwYXJhbSBpbml0U3RhdGVzRmxhZyAgICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdGF0ZXMgYnVmZmVyIGhhcyB0byBiZSBjbGVhcmVkLgorICogXHBhcmFtIGluaXRTdGF0ZXNGbGFnICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0YXRlcyBidWZmZXIgaGFzIHRvIGJlCisgKiBjbGVhcmVkLgogICoKICAqIFxyZXR1cm4gIDAgb24gc3VjY2Vzcy4KICAqLwotSU5UIEZES2h5YnJpZEFuYWx5c2lzSW5pdCgKLSAgICAgICAgSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiAgaEFuYWx5c2lzSHliRmlsdGVyLAotICAgICAgICBjb25zdCBGREtfSFlCUklEX01PREUgICAgICBtb2RlLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBxbWZCYW5kcywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgY3BseEJhbmRzLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBpbml0U3RhdGVzRmxhZwotICAgICAgICApOwotCitJTlQgRkRLaHlicmlkQW5hbHlzaXNJbml0KEhBTkRMRV9GREtfQU5BX0hZQl9GSUxURVIgaEFuYWx5c2lzSHliRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGREtfSFlCUklEX01PREUgbW9kZSwgY29uc3QgSU5UIHFtZkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgY3BseEJhbmRzLCBjb25zdCBJTlQgaW5pdFN0YXRlc0ZsYWcpOwogCiAvKioKLSAqIFxicmllZiAgQWRqdXN0IEh5YnJkaWQgQW5hbHlzaXMgRmlsdGVyYmFuayBzdGF0ZXMuCisgKiBcYnJpZWYgIEFkanVzdCBIeWJyaWQgQW5hbHlzaXMgRmlsdGVyYmFuayBzdGF0ZXMuCiAgKgogICogXHBhcmFtIGhBbmFseXNpc0h5YkZpbHRlciAgQSBIeWJyaWQgQW5hbHlzaXMgRmlsdGVyYmFuayBoYW5kbGUuCiAgKiBccGFyYW0gc2NhbGluZ1ZhbHVlICAgICAgICBTY2FsaW5nIHZhbHVlIHRvIGJlIGFwcGxpZWQgb24gZmlsdGVyIHN0YXRlcy4KICAqCiAgKiBccmV0dXJuICAwIG9uIHN1Y2Nlc3MuCiAgKi8KLUlOVCBGREtoeWJyaWRBbmFseXNpc1NjYWxlU3RhdGVzKAotICAgICAgICBIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSICBoQW5hbHlzaXNIeWJGaWx0ZXIsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIHNjYWxpbmdWYWx1ZQotICAgICAgICApOwotCitJTlQgRkRLaHlicmlkQW5hbHlzaXNTY2FsZVN0YXRlcyhIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSIGhBbmFseXNpc0h5YkZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzY2FsaW5nVmFsdWUpOwogCiAvKioKICAqIFxicmllZiAgQXBwbHkgSHlicmlkIEFuYWx5c2lzIEZpbHRlcmJhbmsgb24gUW1mIGlucHV0IGRhdGEuCkBAIC0yMTMsMTQgKzIwNywxMSBAQAogICoKICAqIFxyZXR1cm4gIDAgb24gc3VjY2Vzcy4KICAqLwotSU5UIEZES2h5YnJpZEFuYWx5c2lzQXBwbHkoCi0gICAgICAgIEhBTkRMRV9GREtfQU5BX0hZQl9GSUxURVIgIGhBbmFseXNpc0h5YkZpbHRlciwKLSAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcFFtZlJlYWwsCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZJbWFnLAotICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBwSHlicmlkUmVhbCwKLSAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcEh5YnJpZEltYWcKLSAgICAgICAgKTsKLQorSU5UIEZES2h5YnJpZEFuYWx5c2lzQXBwbHkoSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiBoQW5hbHlzaXNIeWJGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgcFFtZlJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgcFFtZkltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY29uc3QgcEh5YnJpZFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY29uc3QgcEh5YnJpZEltYWcpOwogCiAvKioKICAqIFxicmllZiAgQ2xvc2UgYSBIeWJyaWQgQW5hbHlzaXMgRmlsdGVyYmFuayBpbnN0YW5jZS4KQEAgLTIyOSw5ICsyMjAsNyBAQAogICoKICAqIFxyZXR1cm4gIDAgb24gc3VjY2Vzcy4KICAqLwotSU5UIEZES2h5YnJpZEFuYWx5c2lzQ2xvc2UoCi0gICAgICAgIEhBTkRMRV9GREtfQU5BX0hZQl9GSUxURVIgIGhBbmFseXNpc0h5YkZpbHRlcgotICAgICAgICApOworSU5UIEZES2h5YnJpZEFuYWx5c2lzQ2xvc2UoSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiBoQW5hbHlzaXNIeWJGaWx0ZXIpOwogCiAvKioKICAqIFxicmllZiAgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIEh5YnJkaWQgU3ludGhlc2lzIEZpbHRlcmJhbmsgaW5zdGFuY2UuCkBAIC0yNDMsMTIgKzIzMiw5IEBACiAgKgogICogXHJldHVybiAgMCBvbiBzdWNjZXNzLgogICovCi1JTlQgRkRLaHlicmlkU3ludGhlc2lzSW5pdCgKLSAgICAgICAgSEFORExFX0ZES19TWU5fSFlCX0ZJTFRFUiAgaFN5bnRoZXNpc0h5YkZpbHRlciwKLSAgICAgICAgY29uc3QgRkRLX0hZQlJJRF9NT0RFICAgICAgbW9kZSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgcW1mQmFuZHMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIGNwbHhCYW5kcwotICAgICAgICApOworSU5UIEZES2h5YnJpZFN5bnRoZXNpc0luaXQoSEFORExFX0ZES19TWU5fSFlCX0ZJTFRFUiBoU3ludGhlc2lzSHliRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkRLX0hZQlJJRF9NT0RFIG1vZGUsIGNvbnN0IElOVCBxbWZCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBjcGx4QmFuZHMpOwogCiAvKioKICAqIFxicmllZiAgQXBwbHkgSHlicmlkIEFuYWx5c2lzIEZpbHRlcmJhbmsgb24gSHlicmlkIGRhdGEuCkBAIC0yNTksMTUgKzI0NSwxMSBAQAogICogXHBhcmFtIHBRbWZSZWFsICAgICAgICAgICAgIFFtZiBvdXRwdXQgZGF0YS4KICAqIFxwYXJhbSBwUW1mSW1hZyAgICAgICAgICAgICBRbWYgb3V0cHV0IGRhdGEuCiAgKgotICogXHJldHVybiAgMCBvbiBzdWNjZXNzLgogICovCi1JTlQgRkRLaHlicmlkU3ludGhlc2lzQXBwbHkoCi0gICAgICAgIEhBTkRMRV9GREtfU1lOX0hZQl9GSUxURVIgIGhTeW50aGVzaXNIeWJGaWx0ZXIsCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBIeWJyaWRSZWFsLAotICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwSHlicmlkSW1hZywKLSAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcFFtZlJlYWwsCi0gICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIHBRbWZJbWFnCi0gICAgICAgICk7Cit2b2lkIEZES2h5YnJpZFN5bnRoZXNpc0FwcGx5KEhBTkRMRV9GREtfU1lOX0hZQl9GSUxURVIgaFN5bnRoZXNpc0h5YkZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHBIeWJyaWRSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgcEh5YnJpZEltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb25zdCBwUW1mUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNvbnN0IHBRbWZJbWFnKTsKIAotCi0jZW5kaWYgLyogX19GREtfSFlCUklEX0ggKi8KKyNlbmRpZiAvKiBGREtfSFlCUklEX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL0ZES19scGMuaCBiL2xpYkZESy9pbmNsdWRlL0ZES19scGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTFkZDFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliRkRLL2luY2x1ZGUvRkRLX2xwYy5oCkBAIC0wLDAgKzEsMjE4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCisKKyAgIERlc2NyaXB0aW9uOiBMUEMgcmVsYXRlZCBmdW5jdGlvbnMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGREtfTFBDX0gKKyNkZWZpbmUgRkRLX0xQQ19ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKyNkZWZpbmUgTFBDX01BWF9PUkRFUiAyNAorCisvKgorICogRXhwZXJpbWVudGFsIHNvbHV0aW9uIGZvciBsYXR0aWNlIGZpbHRlciBzdWJzdGl0dXRpb24uCisgKiBMUENfU1lOVEhFU0lTX0lJUiBtYWNybyBtdXN0IGJlIGFjdGl2YXRlZCBpbiBhYWNkZWNfdG5zLmNwcC4KKyAqIFdoZW4gTFBDX1NZTlRIRVNJU19JSVIgZW5hYmxlZCwgdGhlcmUgd2lsbCBiZSBhIHN1YnN0aXR1dGlvbiBvZiB0aGUgZGVmYXVsdAorICogbHBjIHN5bnRoZXNpcyBsYXR0aWNlIGZpbHRlciBieSBhbiBJSVIgc3ludGhlc2lzIGZpbHRlciAod2l0aCBhIGNvbnZlcnNpb25vZgorICogdGhlIGZpbHRlciBjb2VmcykuIExQQ19UTlMgcmVsYXRlZCBtYWNyb3MgYXJlIGludGVuZGVkIHRvIGltcGxlbWVudCB0aGUgZGF0YQorICogdHlwZXMgdXNlZCBieSB0aGUgQ0xwY19TeW50aGVzaXMgdmFyaWFudCB3aGljaCBpcyB1c2VkIGZvciB0aGlzIHNvbHV0aW9uLgorICogKi8KKworLyogI2RlZmluZSBMUENfVE5TX0xPV0VSX1BSRUNJU0lPTiAqLworCit0eXBlZGVmIEZJWFBfREJMIEZJWFBfTFBDX1ROUzsKKyNkZWZpbmUgRlhfREJMMkZYX0xQQ19UTlMoeCkgKHgpCisjZGVmaW5lIEZYX0RCTDJGWENPTlNUX0xQQ19UTlMoeCkgKHgpCisjZGVmaW5lIEZYX0xQQ19UTlMyRlhfREJMKHgpICh4KQorI2RlZmluZSBGTDJGWENPTlNUX0xQQ19UTlModmFsKSBGTDJGWENPTlNUX0RCTCh2YWwpCisjZGVmaW5lIE1BWFZBTF9MUENfVE5TIE1BWFZBTF9EQkwKKwordHlwZWRlZiBGSVhQX1NHTCBGSVhQX0xQQzsKKyNkZWZpbmUgRlhfREJMMkZYX0xQQyh4KSBGWF9EQkwyRlhfU0dMKChGSVhQX0RCTCkoeCkpCisjZGVmaW5lIEZYX0RCTDJGWENPTlNUX0xQQyh4KSBGWF9EQkwyRlhDT05TVF9TR0woeCkKKyNkZWZpbmUgRlhfTFBDMkZYX0RCTCh4KSBGWF9TR0wyRlhfREJMKHgpCisjZGVmaW5lIEZMMkZYQ09OU1RfTFBDKHZhbCkgRkwyRlhDT05TVF9TR0wodmFsKQorI2RlZmluZSBNQVhWQUxfTFBDIE1BWFZBTF9TR0wKKworLyoqCisgKiBcYnJpZWYgT2J0YWluIHJlc2lkdWFsIHNpZ25hbCB0aHJvdWdoIExQQyBhbmFseXNpcy4KKyAqIFxwYXJhbSBzaWduYWwgcG9pbnRlciB0byBidWZmZXIgaG9sZGluZyBzaWduYWwgdG8gYmUgYW5hbHlzZWQuIFJlc2lkdWFsIGlzCisgKiByZXR1cm5lZCB0aGVyZSAoaW4gcGxhY2UpCisgKiBccGFyYW0gc2lnbmFsX3NpemUgdGhlIHNpemUgb2YgdGhlIGlucHV0IGRhdGEgaW4gcERhdGEKKyAqIFxwYXJhbSBscGNDb2VmZl9tIHRoZSBMUEMgZmlsdGVyIGNvZWZmaWNpZW50IG1hbnRpc3NhcworICogXHBhcmFtIGxwY0NvZWZmX2UgdGhlIExQQyBmaWx0ZXIgY29lZmZpY2llbnQgZXhwb25lbnQKKyAqIFxwYXJhbSBvcmRlciB0aGUgTFBDIGZpbHRlciBvcmRlciAoc2l6ZSBvZiBjb2VmZikKKyAqIFxwYXJhbSBmaWx0U3RhdGUgUG9pbnRlciB0byBzdGF0ZSBidWZmZXIgb2Ygc2l6ZSBvcmRlcgorICogXHBhcmFtIGZpbHRTdGF0ZUluZGV4IHBvaW50ZXIgdG8gc3RhdGUgaW5kZXggc3RvcmFnZQorICovCit2b2lkIENMcGNfQW5hbHlzaXMoRklYUF9EQkwgc2lnbmFsW10sIGNvbnN0IGludCBzaWduYWxfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0xQQyBscGNDb2VmZl9tW10sIGNvbnN0IGludCBscGNDb2VmZl9lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvcmRlciwgRklYUF9EQkwgKmZpbHRTdGF0ZSwgaW50ICpmaWx0U3RhdGVJbmRleCk7CisKKy8qKgorICogXGJyaWVmIFN5bnRoZXNpemUgc2lnbmFsIGZvbSByZXNpZHVhbCB0aHJvdWdoIExQQyBzeW50aGVzaXMsIHVzaW5nIExQCisgKiBjb2VmZmljaWVudHMuCisgKiBccGFyYW0gc2lnbmFsIHBvaW50ZXIgdG8gYnVmZmVyIGhvbGRpbmcgdGhlIHJlc2lkdWFsIHNpZ25hbC4gVGhlIHN5bnRoZXNpcyBpcworICogcmV0dXJuZWQgdGhlcmUgKGluIHBsYWNlKQorICogXHBhcmFtIHNpZ25hbF9zaXplIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBkYXRhIGluIHBEYXRhCisgKiBccGFyYW0gaW5jIGJ1ZmZlciB0cmF2ZXJzYWwgaW5jcmVtZW50IGZvciBzaWduYWwKKyAqIFxwYXJhbSBjb2VmZiB0aGUgTFBDIGZpbHRlciBjb2VmZmljaWVudHMKKyAqIFxwYXJhbSBjb2VmZl9lIGV4cG9uZW50IG9mIGNvZWZmCisgKiBccGFyYW0gb3JkZXIgdGhlIExQQyBmaWx0ZXIgb3JkZXIgKHNpemUgb2YgY29lZmYpCisgKiBccGFyYW0gc3RhdGUgc3RhdGUgYnVmZmVyIG9mIHNpemUgTFBDX01BWF9PUkRFUgorICogXHBhcmFtIHBTdGF0ZUluZGV4IHBvaW50ZXIgdG8gc3RhdGUgaW5kZXggc3RvcmFnZQorICovCit2b2lkIENMcGNfU3ludGhlc2lzKEZJWFBfREJMICpzaWduYWwsIGNvbnN0IGludCBzaWduYWxfc2l6ZSwgY29uc3QgaW50IHNpZ25hbF9lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW5jLCBjb25zdCBGSVhQX0xQQ19UTlMgKmxwY0NvZWZmX20sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBscGNDb2VmZl9lLCBjb25zdCBpbnQgb3JkZXIsIEZJWFBfREJMICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgaW50ICpwU3RhdGVJbmRleCk7Cit2b2lkIENMcGNfU3ludGhlc2lzKEZJWFBfREJMICpzaWduYWwsIGNvbnN0IGludCBzaWduYWxfc2l6ZSwgY29uc3QgaW50IHNpZ25hbF9lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW5jLCBjb25zdCBGSVhQX0xQQyBjb2VmZltdLCBjb25zdCBpbnQgY29lZmZfZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG9yZGVyLCBGSVhQX0RCTCAqZmlsdFN0YXRlLCBpbnQgKnBTdGF0ZUluZGV4KTsKKworLyoqCisgKiBcYnJpZWYgU3ludGhlc2l6ZSBzaWduYWwgZm9tIHJlc2lkdWFsIHRocm91Z2ggTFBDIHN5bnRoZXNpcywgdXNpbmcgUGFyQ29yCisgKiBjb2VmZmljaWVudHMuIFRoZSBhbGdvcml0aG0gYXNzdW1lcyBhIGZpbHRlciBnYWluIG9mIG1heCAxLjAuIElmIHRoZSBmaWx0ZXIKKyAqIGdhaW4gaXMgaGlnaGVyLCB0aGlzIG11c3QgYmUgYWNjb3VudGVkIGludG8gdGhlIHZhbHVlcyBvZiBzaWduYWxfZQorICogYW5kL29yIHNpZ25hbF9lX291dCB0byBhdm9pZCBvdmVyZmxvd3MuCisgKiBccGFyYW0gc2lnbmFsIHBvaW50ZXIgdG8gYnVmZmVyIGhvbGRpbmcgdGhlIHJlc2lkdWFsIHNpZ25hbC4gVGhlIHN5bnRoZXNpcyBpcworICogcmV0dXJuZWQgdGhlcmUgKGluIHBsYWNlKQorICogXHBhcmFtIHNpZ25hbF9zaXplIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBkYXRhIGluIHBEYXRhCisgKiBccGFyYW0gaW5jIGJ1ZmZlciB0cmF2ZXJzYWwgaW5jcmVtZW50IGZvciBzaWduYWwKKyAqIFxwYXJhbSBjb2VmZiB0aGUgTFBDIGZpbHRlciBjb2VmZmljaWVudHMKKyAqIFxwYXJhbSBjb2VmZl9lIGV4cG9uZW50IG9mIGNvZWZmCisgKiBccGFyYW0gb3JkZXIgdGhlIExQQyBmaWx0ZXIgb3JkZXIgKHNpemUgb2YgY29lZmYpCisgKiBccGFyYW0gc3RhdGUgc3RhdGUgYnVmZmVyIG9mIHNpemUgTFBDX01BWF9PUkRFUgorICovCit2b2lkIENMcGNfU3ludGhlc2lzTGF0dGljZShGSVhQX0RCTCAqc2lnbmFsLCBjb25zdCBpbnQgc2lnbmFsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2lnbmFsX2UsIGNvbnN0IGludCBzaWduYWxfZV9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW5jLCBjb25zdCBGSVhQX1NHTCAqY29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3JkZXIsIEZJWFBfREJMICpzdGF0ZSk7CisKK3ZvaWQgQ0xwY19TeW50aGVzaXNMYXR0aWNlKEZJWFBfREJMICpSRVNUUklDVCBzaWduYWwsIGNvbnN0IGludCBzaWduYWxfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzaWduYWxfZSwgY29uc3QgaW50IHNpZ25hbF9lX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbmMsIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBjb2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvcmRlciwgRklYUF9EQkwgKlJFU1RSSUNUIHN0YXRlKTsKKworLyoqCisgKiBcYnJpZWYKKyAqLworSU5UIENMcGNfUGFyY29yVG9McGMoY29uc3QgRklYUF9MUENfVE5TIHJlZmxDb2VmZltdLCBGSVhQX0xQQ19UTlMgTHBjQ29lZmZbXSwKKyAgICAgICAgICAgICAgICAgICAgIElOVCBudW1PZkNvZWZmLCBGSVhQX0RCTCB3b3JrQnVmZmVyW10pOworSU5UIENMcGNfUGFyY29yVG9McGMoY29uc3QgRklYUF9MUEMgcmVmbENvZWZmW10sIEZJWFBfTFBDIExwY0NvZWZmW10sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtT2ZDb2VmZiwgRklYUF9EQkwgd29ya0J1ZmZlcltdKTsKKworLyoqCisgKiBcYnJpZWYgQ2FsY3VsYXRlIFBhckNvciAoUGFydGlhbCBhdXRvQ29ycmVsYXRpb24sIHJlZmxlY3Rpb24pIGNvZWZmaWNpZW50cworICogZnJvbSBhdXRvY29ycmVsYXRpb24gY29lZmZpY2llbnRzIHVzaW5nIHRoZSBTY2h1ciBhbGdvcml0aG0gKGluc3RlYWQgb2YKKyAqIExldmluc29uIER1cmJpbikuCisgKiBccGFyYW0gYWNvcnIgb3JkZXIrMSBhdXRvY29ycmVsYXRpb24gY29lZmZpY2llbnRzCisgKiBccGFyYW0gcmVmbENvZWZmIG91dHB1dCByZWZsZWN0aW9uIC9QYXJDb3IgY29lZmZpY2llbnRzLiBUaGUgZmlyc3QKKyAqIGNvZWZmaWNpZW50IHdoaWNoIGlzIGFsd2F5cyAxLjAgaXMgb21taXR0ZWQuCisgKiBccGFyYW0gb3JkZXIgbnVtYmVyIG9mIGFjb3JyIC8gcmVmbENvZWZmIGNvZWZmaWNpZW50cy4KKyAqIFxwYXJhbSBwUHJlZGljdGlvbkdhaW5fbSBwcmVkaWN0aW9uIGdhaW4gbWFudGlzc2EKKyAqIFxwYXJhbSBwUHJlZGljdGlvbkdhaW5fZSBwcmVkaWN0aW9uIGdhaW4gZXhwb25lbnQKKyAqLwordm9pZCBDTHBjX0F1dG9Ub1BhcmNvcihGSVhQX0RCTCBhY29ycltdLCBjb25zdCBpbnQgYWNvcnJfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRklYUF9MUEMgcmVmbENvZWZmW10sIGNvbnN0IGludCBvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBQcmVkaWN0aW9uR2Fpbl9tLCBJTlQgKnBQcmVkaWN0aW9uR2Fpbl9lKTsKKworI2VuZGlmIC8qIEZES19MUENfSCAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvRkRLX21hdHJpeENhbGxvYy5oIGIvbGliRkRLL2luY2x1ZGUvRkRLX21hdHJpeENhbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYjU0ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJGREsvaW5jbHVkZS9GREtfbWF0cml4Q2FsbG9jLmgKQEAgLTAsMCArMSwyMzAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogbWF0cml4IG1lbW9yeSBhbGxvY2F0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRkRLX01BVFJJWENBTExPQ19ICisjZGVmaW5lIEZES19NQVRSSVhDQUxMT0NfSAorCisjaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKworLyogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIEZES19BTExPQ0FURV9NRU1PUllfMUQgaW5zdGVhZCBvZiBmZGtDYWxsb2NNYXRyaXgxRAorICovCit2b2lkKiBmZGtDYWxsb2NNYXRyaXgxRChVSU5UIGRpbTEsIFVJTlQgc2l6ZSk7Cit2b2lkKiBmZGtDYWxsb2NNYXRyaXgxRF9hbGlnbmVkKFVJTlQgZGltMSwgVUlOVCBzaXplKTsKKy8qIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBGREtfQUxMT0NBVEVfTUVNT1JZXzFEX0lOVCBpbnN0ZWFkIG9mCisgKiBmZGtDYWxsb2NNYXRyaXgxRF9pbnQgKi8KK3ZvaWQqIGZka0NhbGxvY01hdHJpeDFEX2ludChVSU5UIGRpbTEsIFVJTlQgc2l6ZSwgTUVNT1JZX1NFQ1RJT04gcyk7Cit2b2lkKiBmZGtDYWxsb2NNYXRyaXgxRF9pbnRfYWxpZ25lZChVSU5UIGRpbTEsIFVJTlQgc2l6ZSwgTUVNT1JZX1NFQ1RJT04gcyk7CisvKiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgRkRLX0ZSRUVfTUVNT1JZXzFEIGluc3RlYWQgb2YgZmRrRnJlZU1hdHJpeDFEICovCit2b2lkIGZka0ZyZWVNYXRyaXgxRCh2b2lkKiBwKTsKK3ZvaWQgZmRrRnJlZU1hdHJpeDFEX2FsaWduZWQodm9pZCogcCk7CisKKy8qIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBGREtfQUxMT0NBVEVfTUVNT1JZXzJEIGluc3RlYWQgb2YgZmRrQ2FsbG9jTWF0cml4MkQKKyAqLwordm9pZCoqIGZka0NhbGxvY01hdHJpeDJEKFVJTlQgZGltMSwgVUlOVCBkaW0yLCBVSU5UIHNpemUpOwordm9pZCoqIGZka0NhbGxvY01hdHJpeDJEX2FsaWduZWQoVUlOVCBkaW0xLCBVSU5UIGRpbTIsIFVJTlQgc2l6ZSk7CisvKiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgRkRLX0FMTE9DQVRFX01FTU9SWV8yRF9JTlQgaW5zdGVhZCBvZgorICogZmRrQ2FsbG9jTWF0cml4MkRfaW50ICovCit2b2lkKiogZmRrQ2FsbG9jTWF0cml4MkRfaW50KFVJTlQgZGltMSwgVUlOVCBkaW0yLCBVSU5UIHNpemUsIE1FTU9SWV9TRUNUSU9OIHMpOworLyogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIEZES19BTExPQ0FURV9NRU1PUllfMkRfSU5UX0FMSUdORUQgaW5zdGVhZCBvZgorICogZmRrQ2FsbG9jTWF0cml4MkRfaW50X2FsaWduZWQgKi8KK3ZvaWQqKiBmZGtDYWxsb2NNYXRyaXgyRF9pbnRfYWxpZ25lZChVSU5UIGRpbTEsIFVJTlQgZGltMiwgVUlOVCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FTU9SWV9TRUNUSU9OIHMpOworLyogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIEZES19GUkVFX01FTU9SWV8yRCBpbnN0ZWFkIG9mIGZka0ZyZWVNYXRyaXgyRCAqLwordm9pZCBmZGtGcmVlTWF0cml4MkQodm9pZCoqIHApOworLyogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIEZES19GUkVFX01FTU9SWV8yRF9BTElHTkVEIGluc3RlYWQgb2YKKyAqIGZka0ZyZWVNYXRyaXgyRF9hbGlnbmVkICovCit2b2lkIGZka0ZyZWVNYXRyaXgyRF9hbGlnbmVkKHZvaWQqKiBwKTsKKworLyogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIEZES19BTExPQ0FURV9NRU1PUllfM0QgaW5zdGVhZCBvZiBmZGtDYWxsb2NNYXRyaXgzRAorICovCit2b2lkKioqIGZka0NhbGxvY01hdHJpeDNEKFVJTlQgZGltMSwgVUlOVCBkaW0yLCBVSU5UIGRpbTMsIFVJTlQgc2l6ZSk7CisvKiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgRkRLX0FMTE9DQVRFX01FTU9SWV8zRF9JTlQgaW5zdGVhZCBvZgorICogZmRrQ2FsbG9jTWF0cml4M0RfaW50ICovCit2b2lkKioqIGZka0NhbGxvY01hdHJpeDNEX2ludChVSU5UIGRpbTEsIFVJTlQgZGltMiwgVUlOVCBkaW0zLCBVSU5UIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRU1PUllfU0VDVElPTiBzKTsKKy8qIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBGREtfRlJFRV9NRU1PUllfM0QgaW5zdGVhZCBvZiBmZGtGcmVlTWF0cml4M0QgKi8KK3ZvaWQgZmRrRnJlZU1hdHJpeDNEKHZvaWQqKiogcCk7CisKKyNkZWZpbmUgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChhLCBkaW0xLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCgoYSkgPSAodHlwZSopZmRrQ2FsbG9jTWF0cml4MUQoKGRpbTEpLCBzaXplb2YodHlwZSkpKSA9PSBOVUxMKSB7IFwKKyAgICBnb3RvIGJhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIEZES19BTExPQ0FURV9NRU1PUllfMURfQUxJR05FRChhLCBkaW0xLCB0eXBlKSAgICAgICAgICAgICAgICAgICBcCisgIGlmICgoKGEpID0gKHR5cGUqKWZka0NhbGxvY01hdHJpeDFEX2FsaWduZWQoKGRpbTEpLCBzaXplb2YodHlwZSkpKSA9PSBcCisgICAgICBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ290byBiYWlsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBGREtfQUxMT0NBVEVfTUVNT1JZXzFEX1AoYSwgZGltMSwgdHlwZSwgcHR5cGUpICAgICAgICAgICAgICAgICAgXAorICBpZiAoKChhKSA9IChwdHlwZSlmZGtDYWxsb2NNYXRyaXgxRCgoZGltMSksIHNpemVvZih0eXBlKSkpID09IE5VTEwpIHsgXAorICAgIGdvdG8gYmFpbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgRkRLX0FMTE9DQVRFX01FTU9SWV8xRF9JTlQoYSwgZGltMSwgdHlwZSwgcykgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgoKGEpID0gKHR5cGUqKWZka0NhbGxvY01hdHJpeDFEX2ludCgoZGltMSksIHNpemVvZih0eXBlKSwgKHMpKSkgPT0gXAorICAgICAgTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnb3RvIGJhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBGREtfRlJFRV9NRU1PUllfMUQoYSkgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZka0ZyZWVNYXRyaXgxRCgodm9pZCopKGEpKTsgXAorICAgIChhKSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEZES19GUkVFX01FTU9SWV8xRF9BTElHTkVEKGEpICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZka0ZyZWVNYXRyaXgxRF9hbGlnbmVkKCh2b2lkKikoYSkpOyBcCisgICAgKGEpID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBGREtfQUxMT0NBVEVfTUVNT1JZXzJEKGEsIGRpbTEsIGRpbTIsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCgoYSkgPSAodHlwZSoqKWZka0NhbGxvY01hdHJpeDJEKChkaW0xKSwgKGRpbTIpLCBzaXplb2YodHlwZSkpKSA9PSBcCisgICAgICBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdvdG8gYmFpbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIEZES19BTExPQ0FURV9NRU1PUllfMkRfSU5UKGEsIGRpbTEsIGRpbTIsIHR5cGUsIHMpICAgICAgICAgICAgICAgXAorICBpZiAoKChhKSA9ICh0eXBlKiopZmRrQ2FsbG9jTWF0cml4MkRfaW50KChkaW0xKSwgKGRpbTIpLCBzaXplb2YodHlwZSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocykpKSA9PSBOVUxMKSB7ICAgICAgICAgICAgICBcCisgICAgZ290byBiYWlsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgRkRLX0FMTE9DQVRFX01FTU9SWV8yRF9JTlRfQUxJR05FRChhLCBkaW0xLCBkaW0yLCB0eXBlLCBzKSBcCisgIGlmICgoKGEpID0gKHR5cGUqKilmZGtDYWxsb2NNYXRyaXgyRF9pbnRfYWxpZ25lZCggICAgICAgICAgICAgICAgXAorICAgICAgICAgICAoZGltMSksIChkaW0yKSwgc2l6ZW9mKHR5cGUpLCAocykpKSA9PSBOVUxMKSB7ICAgICAgICAgIFwKKyAgICBnb3RvIGJhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBGREtfRlJFRV9NRU1PUllfMkQoYSkgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmRrRnJlZU1hdHJpeDJEKCh2b2lkKiopKGEpKTsgXAorICAgIChhKSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBGREtfRlJFRV9NRU1PUllfMkRfQUxJR05FRChhKSAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZka0ZyZWVNYXRyaXgyRF9hbGlnbmVkKCh2b2lkKiopKGEpKTsgXAorICAgIChhKSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEZES19BTExPQ0FURV9NRU1PUllfM0QoYSwgZGltMSwgZGltMiwgZGltMywgdHlwZSkgICAgICAgICBcCisgIGlmICgoKGEpID0gKHR5cGUqKiopZmRrQ2FsbG9jTWF0cml4M0QoKGRpbTEpLCAoZGltMiksIChkaW0zKSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHR5cGUpKSkgPT0gTlVMTCkgeyBcCisgICAgZ290byBiYWlsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBGREtfQUxMT0NBVEVfTUVNT1JZXzNEX0lOVChhLCBkaW0xLCBkaW0yLCBkaW0zLCB0eXBlLCBzKSAgICAgICAgICAgXAorICBpZiAoKChhKSA9ICh0eXBlKioqKWZka0NhbGxvY01hdHJpeDNEX2ludCgoZGltMSksIChkaW0yKSwgKGRpbTMpLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodHlwZSksIChzKSkpID09IE5VTEwpIHsgXAorICAgIGdvdG8gYmFpbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgRkRLX0ZSRUVfTUVNT1JZXzNEKGEpICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmRrRnJlZU1hdHJpeDNEKCh2b2lkKioqKShhKSk7IFwKKyAgICAoYSkgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZW5kaWYgLyogRkRLX01BVFJJWENBTExPQ19IICovCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9GREtfcW1mX2RvbWFpbi5oIGIvbGliRkRLL2luY2x1ZGUvRkRLX3FtZl9kb21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzEyNjgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliRkRLL2luY2x1ZGUvRkRLX3FtZl9kb21haW4uaApAQCAtMCwwICsxLDQxNiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWF0dGhpYXMgSGlsZGVuYnJhbmQKKworICAgRGVzY3JpcHRpb246IE1vZHVsZSB0byBlZmZpY2llbnRseSBoYW5kbGUgUU1GIGRhdGEgZm9yIG11bHRpcGxlIGNoYW5uZWxzIGFuZAorICAgICAgICAgICAgICAgIHRvIHNoYXJlIHRoZSBkYXRhIGJldHdlZW4gZS5nLiBTQlIgYW5kIE1QUworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZES19RTUZfRE9NQUlOX0gKKyNkZWZpbmUgRkRLX1FNRl9ET01BSU5fSAorCisjaW5jbHVkZSAicW1mLmgiCisKK3R5cGVkZWYgZW51bSB7CisgIFFNRl9ET01BSU5fT0sgPSAweDAsIC8qITwgTm8gZXJyb3Igb2NjdXJyZWQuICovCisgIFFNRl9ET01BSU5fT1VUX09GX01FTU9SWSA9CisgICAgICAweDEsIC8qITwgUU1GLUNvbmZpZ3VyYXRpb24gZGVtYW5kcyBmb3IgbW9yZSBtZW1vcnkgdGhhbiBhbGxvY2F0ZWQgb24KKyAgICAgICAgICAgICAgaGVhcC4gKi8KKyAgUU1GX0RPTUFJTl9JTklUX0VSUk9SID0KKyAgICAgIDB4MiwgLyohPCBBbiBlcnJvciBkdXJpbmcgZmlsdGVyYmFuay1zZXR1cCBvY2N1cnJlZC4gKi8KKyAgUU1GX0RPTUFJTl9SRVNBTVBMRVJfSU5JVF9FUlJPUiA9CisgICAgICAweDMgLyohPCBBbiBlcnJvciBkdXJpbmcgUU1GLXJlc2FtcGxlci1zZXR1cCBvY2N1cnJlZC4gKi8KK30gUU1GX0RPTUFJTl9FUlJPUjsKKworI2RlZmluZSBDTVBMWF9NT0QgKDIpCisKKyNkZWZpbmUgUU1GX01BWF9XQl9TRUNUSU9OUyAoNSkgLyogbWF4aW11bSBudW1iZXIgb2Ygd29ya2J1ZmZlciBzZWN0aW9ucyAqLworI2RlZmluZSBRTUZfV0JfU0VDVElPTl9TSVpFICgxMDI0ICogMikKKworSF9BTExPQ19NRU1fT1ZFUkxBWShRbWZXb3JrQnVmZmVyQ29yZTEsIEZJWFBfREJMKQorSF9BTExPQ19NRU1fT1ZFUkxBWShRbWZXb3JrQnVmZmVyQ29yZTIsIEZJWFBfREJMKQorSF9BTExPQ19NRU1fT1ZFUkxBWShRbWZXb3JrQnVmZmVyQ29yZTMsIEZJWFBfREJMKQorSF9BTExPQ19NRU1fT1ZFUkxBWShRbWZXb3JrQnVmZmVyQ29yZTQsIEZJWFBfREJMKQorSF9BTExPQ19NRU1fT1ZFUkxBWShRbWZXb3JrQnVmZmVyQ29yZTUsIEZJWFBfREJMKQorSF9BTExPQ19NRU1fT1ZFUkxBWShRbWZXb3JrQnVmZmVyQ29yZTYsIEZJWFBfREJMKQorCisjZGVmaW5lIFFNRl9ET01BSU5fTUFYX0FOQUxZU0lTX1FNRl9CQU5EUyAoNjQpCisjZGVmaW5lIFFNRl9ET01BSU5fTUFYX1NZTlRIRVNJU19RTUZfQkFORFMgKFFNRl9NQVhfU1lOVEhFU0lTX0JBTkRTKQorI2RlZmluZSBRTUZfRE9NQUlOX01BWF9RTUZfUFJPQ19CQU5EUyAoNjQpCisjZGVmaW5lIFFNRl9ET01BSU5fTUFYX1RJTUVTTE9UUyAoNjQpCisjZGVmaW5lIFFNRl9ET01BSU5fTUFYX09WX1RJTUVTTE9UUyAoMTIpCisKKyNkZWZpbmUgUU1GX0RPTUFJTl9BTkFMWVNJU19RTUZfQkFORFNfMTYgKDE2KQorI2RlZmluZSBRTUZfRE9NQUlOX0FOQUxZU0lTX1FNRl9CQU5EU18yNCAoMjQpCisjZGVmaW5lIFFNRl9ET01BSU5fQU5BTFlTSVNfUU1GX0JBTkRTXzMyICgzMikKKworI2RlZmluZSBRTUZfRE9NQUlOX1RJTUVTTE9UU18xNiAoMTYpCisjZGVmaW5lIFFNRl9ET01BSU5fVElNRVNMT1RTXzMyICgzMikKKworI2RlZmluZSBRTUZfRE9NQUlOX09WX1RJTUVTTE9UU18xNiAoMykKKyNkZWZpbmUgUU1GX0RPTUFJTl9PVl9USU1FU0xPVFNfMzIgKDYpCisKK0hfQUxMT0NfTUVNKEFuYVFtZlN0YXRlcywgRklYUF9RQVMpCitIX0FMTE9DX01FTShTeW5RbWZTdGF0ZXMsIEZJWFBfUVNTKQorSF9BTExPQ19NRU0oUW1mU2xvdHNSZWFsLCBGSVhQX0RCTCAqKQorSF9BTExPQ19NRU0oUW1mU2xvdHNJbWFnLCBGSVhQX0RCTCAqKQorSF9BTExPQ19NRU0oUW1mT3ZlcmxhcEJ1ZmZlciwgRklYUF9EQkwpCisKK0hfQUxMT0NfTUVNKEFuYVFtZlN0YXRlczE2LCBGSVhQX1FBUykKK0hfQUxMT0NfTUVNKEFuYVFtZlN0YXRlczI0LCBGSVhQX1FBUykKK0hfQUxMT0NfTUVNKEFuYVFtZlN0YXRlczMyLCBGSVhQX1FBUykKK0hfQUxMT0NfTUVNKFFtZlNsb3RzUmVhbDE2LCBGSVhQX0RCTCAqKQorSF9BTExPQ19NRU0oUW1mU2xvdHNSZWFsMzIsIEZJWFBfREJMICopCitIX0FMTE9DX01FTShRbWZTbG90c0ltYWcxNiwgRklYUF9EQkwgKikKK0hfQUxMT0NfTUVNKFFtZlNsb3RzSW1hZzMyLCBGSVhQX0RCTCAqKQorSF9BTExPQ19NRU0oUW1mT3ZlcmxhcEJ1ZmZlcjE2LCBGSVhQX0RCTCkKK0hfQUxMT0NfTUVNKFFtZk92ZXJsYXBCdWZmZXIzMiwgRklYUF9EQkwpCisKKyNkZWZpbmUgUURPTV9QQ00gSU5UX1BDTQorCisvKioKKyAqIFN0cnVjdHVyZSB0byBob2xkIHRoZSBjb25maWd1cmF0aW9uIGRhdGEgd2hpY2ggaXMgZ2xvYmFsIHdoaXRoaW4gYSBRTUYgZG9tYWluCisgKiBpbnN0YW5jZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBxbWZEb21haW5FeHBsaWNpdENvbmZpZzsgICAvKiE8IEZsYWcgdG8gc2lnbmFsIHRoYXQgUU1GIGRvbWFpbiBpcyBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwbGljaXRseSBpbnN0ZWFkIG9mIFNCUiBhbmQgTVBTIGluaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZXMuICovCisgIFVDSEFSIG5JbnB1dENoYW5uZWxzOyAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIFFNRiBpbnB1dCBjaGFubmVscy4gKi8KKyAgVUNIQVIgbklucHV0Q2hhbm5lbHNfcmVxdWVzdGVkOyAgLyohPCBDb3JyZXNwb25kaW5nIHJlcXVlc3RlZCBub3QgeWV0IGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlci4gKi8KKyAgVUNIQVIgbk91dHB1dENoYW5uZWxzOyAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgUU1GIG91dHB1dCBjaGFubmVscy4gKi8KKyAgVUNIQVIgbk91dHB1dENoYW5uZWxzX3JlcXVlc3RlZDsgLyohPCBDb3JyZXNwb25kaW5nIHJlcXVlc3RlZCBub3QgeWV0IGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlci4gKi8KKyAgVUNIQVIKKyAgcGFya0NoYW5uZWw7IC8qITwgc2lnbmFsIHRvIGF1dG9tYXRpY2FsbHkgYWxsb2NhdGUgYWRkaXRpb25hbCBtZW1vcnkgdG8KKyAgICAgICAgICAgICAgICAgIHBhcmsgYSBjaGFubmVsIGlmIG9ubHkgb25lIHByb2Nlc3NpbmcgY2hhbm5lbCBpcworICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlLiAqLworICBVQ0hBUiBwYXJrQ2hhbm5lbF9yZXF1ZXN0ZWQ7CisgIFFET01fUENNCisgICpURGlucHV0OyAvKiE8IFBvaW50ZXIgdG8gdGltZSBkb21haW4gZGF0YSB1c2VkIGFzIGlucHV0IGZvciB0aGUgUU1GCisgICAgICAgICAgICAgICBhbmFseXNpcy4gKi8KKyAgRklYUF9EQkwgKgorICAgICAgcFdvcmtCdWZmZXJbUU1GX01BWF9XQl9TRUNUSU9OU107IC8qITwgUG9pbnRlcmFycmF5IHRvIHZvbGF0aWxlIG1lbW9yeS4gKi8KKyAgVUlOVCBmbGFnczsgLyohPCBGbGFncyB0byBiZSBzZXQgb24gYWxsIFFNRiBhbmFseXNpcy9zeW50aGVzaXMgZmlsdGVyCisgICAgICAgICAgICAgICAgIGluc3RhbmNlcy4gKi8KKyAgVUlOVCBmbGFnc19yZXF1ZXN0ZWQ7IC8qITwgQ29ycmVzcG9uZGluZyByZXF1ZXN0ZWQgbm90IHlldCBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLiAqLworICBVQ0hBUiBuQmFuZHNBbmFseXNpczsgLyohPCBOdW1iZXIgb2YgUU1GIGFuYWx5c2lzIGJhbmRzIGZvciBhbGwgaW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzLiAqLworICBVQ0hBUiBuQmFuZHNBbmFseXNpc19yZXF1ZXN0ZWQ7IC8qITwgQ29ycmVzcG9uZGluZyByZXF1ZXN0ZWQgbm90IHlldCBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlci4gKi8KKyAgVVNIT1JUIG5CYW5kc1N5bnRoZXNpczsgLyohPCBOdW1iZXIgb2YgUU1GIHN5bnRoZXNpcyBiYW5kcyBmb3IgYWxsIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscy4gKi8KKyAgVVNIT1JUCisgIG5CYW5kc1N5bnRoZXNpc19yZXF1ZXN0ZWQ7IC8qITwgQ29ycmVzcG9uZGluZyByZXF1ZXN0ZWQgbm90IHlldCBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuICovCisgIFVDSEFSIG5RbWZUaW1lU2xvdHM7IC8qITwgTnVtYmVyIG9mIFFNRiB0aW1lIHNsb3RzIChzdG9yZWQgaW4gd29yayBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5KS4gKi8KKyAgVUNIQVIgblFtZlRpbWVTbG90c19yZXF1ZXN0ZWQ7IC8qITwgQ29ycmVzcG9uZGluZyByZXF1ZXN0ZWQgbm90IHlldCBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLiAqLworICBVQ0hBUgorICBuUW1mT3ZUaW1lU2xvdHM7IC8qITwgTnVtYmVyIG9mIFFNRiBvdmVybGFwL2RlbGF5IHRpbWUgc2xvdHMgKHN0b3JlZCBpbgorICAgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQgbWVtb3J5KS4gKi8KKyAgVUNIQVIgblFtZk92VGltZVNsb3RzX3JlcXVlc3RlZDsgLyohPCBDb3JyZXNwb25kaW5nIHJlcXVlc3RlZCBub3QgeWV0IGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlci4gKi8KKyAgVUNIQVIgblFtZlByb2NCYW5kczsgLyohPCBOdW1iZXIgb2YgUU1GIGJhbmRzIHdoaWNoIGFyZSBwcm9jZXNzZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIuIFR5cGljYWxseSB0aGlzIGlzIGVxdWFsIHRvIG5CYW5kc1N5bnRoZXNpcworICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgaXQgbWF5IGRpZmZlciBpZiB0aGUgUU1GIGJhc2VkIHJlc2FtcGxlciBpcyBiZWluZworICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkLiAqLworICBVQ0hBUiBuUW1mUHJvY0JhbmRzX3JlcXVlc3RlZDsgLyohPCBDb3JyZXNwb25kaW5nIHJlcXVlc3RlZCBub3QgeWV0IGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuICovCisgIFVDSEFSCisgIG5RbWZQcm9jQ2hhbm5lbHM7IC8qITwgTnVtYmVyIG9mIGNvbXBsZXRlIFFNRiBjaGFubmVscyB3aGljaCBuZWVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgIGNvZXhpc3QgaW4gbWVtb3J5IGF0IHRoZSBzYW1lIHRpbWUuIEZvciBtb3N0IGNhc2VzCisgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgMSB3aGljaCBtZWFucyB0aGUgd29yayBidWZmZXIgY2FuIGJlIHNoYXJlZAorICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIGF1ZGlvIGNoYW5uZWxzLiAqLworICBVQ0hBUgorICBuUW1mUHJvY0NoYW5uZWxzX3JlcXVlc3RlZDsgLyohPCBDb3JyZXNwb25kaW5nIHJlcXVlc3RlZCBub3QgeWV0IGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuICovCit9IEZES19RTUZfRE9NQUlOX0dDOwordHlwZWRlZiBGREtfUU1GX0RPTUFJTl9HQyAqSEFORExFX0ZES19RTUZfRE9NQUlOX0dDOworCisvKioKKyAqIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgb25lIFFNRiBpbnB1dCBjaGFubmVsLiBUaGlzIGluY2x1ZGVzIHRoZSBRTUYgYW5hbHlzaXMKKyAqIGFuZCB0aGUgUU1GIGRvbWFpbiBkYXRhIHJlcHJlc2VudGF0aW9uIG5lZWRlZCBieSB0aGUgY29kZWMuIFdvcmsgYnVmZmVyIGRhdGEKKyAqIG1heSBiZSBzaGFyZWQgYmV0d2VlbiBjaGFubmVscyBpZiB0aGUgY29kZWMgcHJvY2Vzc2VzIGFsbCBRTUYgY2hhbm5lbHMgaW4gYQorICogY29uc2VjdXRpdmUgb3JkZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgSEFORExFX0ZES19RTUZfRE9NQUlOX0dDCisgIHBHbG9iYWxDb25mOyAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBnbG9iYWwgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUuICovCisgIFFNRl9GSUxURVJfQkFOSyBmYjsgICAgICAgIC8qITwgUU1GIChhbmFseXNpcykgZmlsdGVyIGJhbmsgc3RydWN0dXJlLiAqLworICBRTUZfU0NBTEVfRkFDVE9SIHNjYWxpbmc7ICAvKiE8IFN0cnVjdHVyZSB3aXRoIHNjYWxpbmcgaW5mb3JtYXRpb24uICovCisgIFVDSEFSIHdvcmtCdWZfblRpbWVTbG90czsgIC8qITwgV29yayBidWZmZXIgZGltZW5zaW9uIGZvciB0aGlzIGNoYW5uZWwgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmtCdWZfblRpbWVTbG90cyAqIHdvcmtCdWZfbkJhbmRzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ01QTFhfTU9EKS4gKi8KKyAgVUNIQVIgd29ya0J1Zl9uQmFuZHM7ICAgICAgLyohPCBXb3JrIGJ1ZmZlciBkaW1lbnNpb24gZm9yIHRoaXMgY2hhbm5lbCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod29ya0J1Zl9uVGltZVNsb3RzICogd29ya0J1Zl9uQmFuZHMgKiBDTVBMWF9NT0QpLiAqLworICBVU0hPUlQgd29ya0J1ZmZlck9mZnNldDsgICAvKiE8IE9mZnNldCB3aXRoaW4gd29yayBidWZmZXIuICovCisgIFVTSE9SVCB3b3JrQnVmZmVyU2VjdFNpemU7IC8qITwgU2l6ZSBvZiB3b3JrIGJ1ZmZlciBzZWN0aW9uLiAqLworICBGSVhQX1FBUyAqCisgICAgICBwQW5hUW1mU3RhdGVzOyAvKiE8IFBvaW50ZXIgdG8gUU1GIGFuYWx5c2lzIHN0YXRlcyAocGVyc2lzdGVudCBtZW1vcnkpLiAqLworICBGSVhQX0RCTAorICAqcE92ZXJsYXBCdWZmZXI7ICAgICAgICAvKiE8IFBvaW50ZXIgdG8gUU1GIG92ZXJsYXAvZGVsYXkgbWVtb3J5IChwZXJzaXN0ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSkuICovCisgIEZJWFBfREJMICoqcFdvcmtCdWZmZXI7IC8qITwgUG9pbnRlciBhcnJheSB0byBhdmFpbGFibGUgd29yayBidWZmZXJzLiAqLworICBGSVhQX0RCTCAqCisgICAgICAqaFFtZlNsb3RzUmVhbDsgLyohPCBIYW5kbGUgZm9yIFFNRiByZWFsIGRhdGEgdGltZSBzbG90IHBvaW50ZXIgYXJyYXkuICovCisgIEZJWFBfREJMICoqaFFtZlNsb3RzSW1hZzsgLyohPCBIYW5kbGUgZm9yIFFNRiBpbWFnaW5hcnkgZGF0YSB0aW1lIHNsb3QgcG9pbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LiAqLworfSBGREtfUU1GX0RPTUFJTl9JTjsKK3R5cGVkZWYgRkRLX1FNRl9ET01BSU5fSU4gKkhBTkRMRV9GREtfUU1GX0RPTUFJTl9JTjsKKworLyoqCisgKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIG9uZSBRTUYgb3V0cHV0IGNoYW5uZWwuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgUU1GX0ZJTFRFUl9CQU5LIGZiOyAgICAgIC8qITwgUU1GIChzeW50aGVzaXMpIGZpbHRlciBiYW5rIHN0cnVjdHVyZS4gKi8KKyAgRklYUF9RU1MgKnBTeW5RbWZTdGF0ZXM7IC8qITwgUG9pbnRlciB0byBRTUYgc3ludGhlc2lzIHN0YXRlcyAocGVyc2lzdGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5KS4gKi8KK30gRkRLX1FNRl9ET01BSU5fT1VUOwordHlwZWRlZiBGREtfUU1GX0RPTUFJTl9PVVQgKkhBTkRMRV9GREtfUU1GX0RPTUFJTl9PVVQ7CisKKy8qKgorICogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgUU1GIGRvbWFpbiBmb3IgbXVsdGlwbGUgY2hhbm5lbHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgRkRLX1FNRl9ET01BSU5fR0MgZ2xvYmFsQ29uZjsgLyohPCBHbG9iYWwgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUuICovCisgIEZES19RTUZfRE9NQUlOX0lOCisgIFFtZkRvbWFpbkluWygoOCkgKyAoMSkpXTsgLyohPCBBcnJheSBvZiBRTUYgZG9tYWluIGlucHV0IHN0cnVjdHVyZXMgKi8KKyAgRkRLX1FNRl9ET01BSU5fT1VUCisgIFFtZkRvbWFpbk91dFsoKDgpICsgKDEpKV07IC8qITwgQXJyYXkgb2YgUU1GIGRvbWFpbiBvdXRwdXQgc3RydWN0dXJlcyAqLworfSBGREtfUU1GX0RPTUFJTjsKK3R5cGVkZWYgRkRLX1FNRl9ET01BSU4gKkhBTkRMRV9GREtfUU1GX0RPTUFJTjsKKworLyoqCisgKiBcYnJpZWYgQ2hlY2sgd2hldGhlciBhbmFseXNpcy0gYW5kIHN5bnRoZXNpcy1maWx0ZXJiYW5rLXN0YXRlcyBoYXZlIGJlZW4KKyAqIGluaXRpYWxpemVkLgorICoKKyAqIFxwYXJhbSBxZCBQb2ludGVyIHRvIFFNRiBkb21haW4gc3RydWN0dXJlLgorICoKKyAqIFxyZXR1cm4gIDEgaWYgaW5pdGlhbGl6ZWQsIDAgZWxzZQorICovCitpbnQgRkRLX1FtZkRvbWFpbl9Jc0luaXRpYWxpemVkKGNvbnN0IEhBTkRMRV9GREtfUU1GX0RPTUFJTiBxZCk7CisKKy8qKgorICogXGJyaWVmIEluaXRpYWxpemUgUU1GIGFuYWx5c2lzIGFuZCBzeW50aGVzaXMgZmlsdGVyIGJhbmtzIGFuZCBzZXQgdXAgUU1GIGRhdGEKKyAqIHJlcHJlc2VudGF0aW9uLgorICoKKyAqIFxwYXJhbSBxZCBQb2ludGVyIHRvIFFNRiBkb21haW4gc3RydWN0dXJlLgorICogXHBhcmFtIGV4dHJhX2ZsYWdzIEluaXRpYWxpemUgZmlsdGVyIGJhbmtzIHdpdGggZXh0cmEgZmxhZ3Mgd2hpY2ggd2VyZSBub3QKKyAqIHNldCBpbiB0aGUgZ2xvYmFsIGNvbmZpZyBmbGFncyBmaWVsZC4KKyAqCisgKiBccmV0dXJuICAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBGREtfUW1mRG9tYWluX0luaXRGaWx0ZXJCYW5rKEhBTkRMRV9GREtfUU1GX0RPTUFJTiBxZCwgVUlOVCBleHRyYV9mbGFncyk7CisKKy8qKgorICogXGJyaWVmIFdoZW4gUU1GIHByb2Nlc3Npbmcgb2Ygb25lIGNoYW5uZWwgaXMgZmluaXNoZWQgY29weSB0aGUgb3ZlcmxhcC9kZWxheQorICogcGFydCBpbnRvIHRoZSBwZXJzaXN0ZW50IG1lbW9yeSB0byBiZSB1c2VkIGluIHRoZSBuZXh0IGZyYW1lLgorICoKKyAqIFxwYXJhbSBxZF9jaCBQb2ludGVyIHRvIGEgUU1GIGRvbWFpbiBpbnB1dCBjaGFubmVsLgorICogXHBhcmFtIG9mZnNldAorICoKKyAqIFxyZXR1cm4gIHZvaWQKKyAqLwordm9pZCBGREtfUW1mRG9tYWluX1NhdmVPdmVybGFwKEhBTkRMRV9GREtfUU1GX0RPTUFJTl9JTiBxZF9jaCwgaW50IG9mZnNldCk7CisKKy8qKgorICogXGJyaWVmIEdldCBvbmUgc2xvdCBvZiBRTUYgZGF0YSBhbmQgYWRhcHQgdGhlIHNjYWxpbmcuCisgKgorICogXHBhcmFtIHFkX2NoIFBvaW50ZXIgdG8gYSBRTUYgZG9tYWluIGlucHV0IGNoYW5uZWwuCisgKiBccGFyYW0gdHMgVGltZSBzbG90IG51bWJlciB0byBiZSBvYnRhaW5lZC4KKyAqIFxwYXJhbSBzdGFydF9iYW5kIFN0YXJ0IGluZGV4IG9mIFFNRiBiYW5kcyB0byBiZSBvYnRhaW5lZC4KKyAqIFxwYXJhbSBzdG9wX2JhbmQgU3RvcCBpbmRleCBvZiBRTUYgYmFuZCB0byBiZSBvYnRhaW5lZC4KKyAqIFxwYXJhbSBwUW1mT3V0UmVhbCBPdXRwdXQgYnVmZmVyIChyZWFsIFFNRiBkYXRhKS4KKyAqIFxwYXJhbSBwUW1mT3V0SW1hZyAgT3V0cHV0IGJ1ZmZlciAoaW1hZyBRTUYgZGF0YSkuCisgKiBccGFyYW0gZXhwX291dCBUYXJnZXQgZXhwb25lbnQgKHNjYWxpbmcpIG9mIGRhdGEuCisgKgorICogXHJldHVybiAgdm9pZAorICovCit2b2lkIEZES19RbWZEb21haW5fR2V0U2xvdChjb25zdCBIQU5ETEVfRkRLX1FNRl9ET01BSU5fSU4gcWRfY2gsIGNvbnN0IGludCB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzdGFydF9iYW5kLCBjb25zdCBpbnQgc3RvcF9iYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBRbWZPdXRSZWFsLCBGSVhQX0RCTCAqcFFtZk91dEltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZXhwX291dCk7CisKKy8qKgorICogXGJyaWVmIERpcmVjdCBhY2Nlc3MgdG8gdGhlIHdvcmsgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCBhIGNlcnRhaW4gY2hhbm5lbCAobm8KKyAqIHRpbWUgc2xvdCBwb2ludGVyIGFycmF5IGlzIHVzZWQpLgorICoKKyAqIFxwYXJhbSBxZF9jaCBQb2ludGVyIHRvIGEgUU1GIGRvbWFpbiBpbnB1dCBjaGFubmVsLgorICogXHBhcmFtIHRzIFRpbWUgc2xvdCBudW1iZXIgdG8gYmUgb2J0YWluZWQuCisgKiBccGFyYW0gcHBRbWZSZWFsIFJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIHJlcXVlc3RlZCBwYXJ0IG9mIHRoZSB3b3JrIGJ1ZmZlcgorICogKHJlYWwgdGltZSBzbG90KS4KKyAqIFxwYXJhbSBwcFFtZkltYWcgUmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgcmVxdWVzdGVkIHBhcnQgb2YgdGhlIHdvcmsgYnVmZmVyCisgKiAoaW1hZyB0aW1lIHNsb3QpLgorICoKKyAqIFxyZXR1cm4gIHZvaWQKKyAqLwordm9pZCBGREtfUW1mRG9tYWluX0dldFdvcmtCdWZmZXIoY29uc3QgSEFORExFX0ZES19RTUZfRE9NQUlOX0lOIHFkX2NoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRzLCBGSVhQX0RCTCAqKnBwUW1mUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcHBRbWZJbWFnKTsKKworLyoqCisgKiBcYnJpZWYgRm9yIHRoZSBjYXNlIHRoYXQgdGhlIHdvcmsgYnVmZmVyIGFzc29jaWF0ZWQgdG8gdGhpcyBjaGFubmVsIGlzIG5vdAorICogaWRlbnRpY2FsIHRvIHRoZSBwcm9jZXNzaW5nIGNoYW5uZWwgd29yayBidWZmZXIgY29weSB0aGUgZGF0YSBpbnRvIHRoZQorICogcHJvY2Vzc2luZyBjaGFubmVsLgorICoKKyAqIFxwYXJhbSBxZF9jaCBQb2ludGVyIHRvIGEgUU1GIGRvbWFpbiBpbnB1dCBjaGFubmVsLgorICogXHJldHVybiAgdm9pZAorICovCit2b2lkIEZES19RbWZEb21haW5fV29ya0J1ZmZlcjJQcm9jQ2hhbm5lbChjb25zdCBIQU5ETEVfRkRLX1FNRl9ET01BSU5fSU4gcWRfY2gpOworCisvKioKKyAqIFxicmllZiBGb3IgdGhlIGNhc2Ugb2Ygc3RlcmVvQ2ZnSW5kZXgzIHdpdGggSEJFIHRoZSBIQkUgYnVmZmVyIGlzIGNvcGllZCBpbnRvCisgKiB0aGUgcHJvY2Vzc2luZyBjaGFubmVsIHdvcmsgYnVmZmVyIGFuZCB0aGUgcHJvY2Vzc2luZyBjaGFubmVsIHdvcmsgYnVmZmVyIGlzCisgKiBjb3BpZWQgaW50byB0aGUgSEJFIGJ1ZmZlci4KKyAqCisgKiBccGFyYW0gcWRfY2ggUG9pbnRlciB0byBhIFFNRiBkb21haW4gaW5wdXQgY2hhbm5lbC4KKyAqIFxwYXJhbSBwcFFtZlJlYWwgUG9pbnRlciB0byBhIEhCRSBRTUYgZGF0YSBidWZmZXIgKHJlYWwpLgorICogXHBhcmFtIHBwUW1mSW1hZyBQb2ludGVyIHRvIGEgSEJFIFFNRiBkYXRhIGJ1ZmZlciAoaW1hZykuCisgKgorICogXHJldHVybiAgdm9pZAorICovCit2b2lkIEZES19RbWZEb21haW5fUW1mRGF0YTJIQkUoSEFORExFX0ZES19RTUZfRE9NQUlOX0lOIHFkX2NoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcHBRbWZSZWFsLCBGSVhQX0RCTCAqKnBwUW1mSW1hZyk7CisKKy8qKgorICogXGJyaWVmIFNldCBhbGwgZmllbGRzIGZvciByZXF1ZXN0ZWQgcGFyYW1ldGVydmFsdWVzIGluIGdsb2JhbCBjb25maWcgc3RydWN0CisgKiBGREtfUU1GX0RPTUFJTl9HQyB0byAwLgorICoKKyAqIFxwYXJhbSBoZ2MgIFBvaW50ZXIgdG8gYSBRTUYgZG9tYWluIGdsb2JhbCBjb25maWcgc3RydWN0LgorICovCit2b2lkIEZES19RbWZEb21haW5fQ2xlYXJSZXF1ZXN0ZWQoSEFORExFX0ZES19RTUZfRE9NQUlOX0dDIGhnYyk7CisKKy8qKgorICogXGJyaWVmIENoZWNrIGZvciBwYXJhbWV0ZXItY2hhbmdlIHJlcXVlc3RzIGluIGdsb2JhbCBjb25maWcgYW5kCisgKiAocmUtKWNvbmZpZ3VyZSBRTUYgZG9tYWluIGFjY29yZGluZ2x5LgorICoKKyAqIFxwYXJhbSAgaHFkICBQb2ludGVyIHRvIFFNRiBkb21haW4KKyAqCisgKiBccmV0dXJuICBlcnJvcmNvZGUKKyAqLworUU1GX0RPTUFJTl9FUlJPUiBGREtfUW1mRG9tYWluX0NvbmZpZ3VyZShIQU5ETEVfRkRLX1FNRl9ET01BSU4gaHFkKTsKKworLyoqCisgKiBcYnJpZWYgRnJlZSBRTUYgd29ya2J1ZmZlciwgUU1GIHBlcnNpc3RlbnQgbWVtb3J5IGFuZCBjb25maWd1cmF0aW9uCisgKiB2YXJpYWJsZXMuCisgKgorICogXHBhcmFtICBocWQgIFBvaW50ZXIgdG8gUU1GIGRvbWFpbgorICovCit2b2lkIEZES19RbWZEb21haW5fRnJlZU1lbShIQU5ETEVfRkRLX1FNRl9ET01BSU4gaHFkKTsKKworLyoqCisgKiBcYnJpZWYgQ2xlYXIgUU1GIG92ZXJsYXAgYnVmZmVycyBhbmQgUU1GIGZpbHRlciBiYW5rIHN0YXRlcy4KKyAqCisgKiBccGFyYW0gIGhxZCAgUG9pbnRlciB0byBRTUYgZG9tYWluCisgKi8KK1FNRl9ET01BSU5fRVJST1IgRkRLX1FtZkRvbWFpbl9DbGVhclBlcnNpc3RlbnRNZW1vcnkoSEFORExFX0ZES19RTUZfRE9NQUlOIGhxZCk7CisKKy8qKgorICogXGJyaWVmIEZyZWUgUU1GIHdvcmtidWZmZXIgYW5kIFFNRiBwZXJzaXN0ZW50IG1lbW9yeS4KKyAqCisgKiBccGFyYW0gIGhxZCAgUG9pbnRlciB0byBRTUYgZG9tYWluCisgKgorICogXHBhcmFtICBkbXhfbHBfbW9kZSAgZG93bm1peCBsb3cgcG93ZXIgbW9kZSBmbGFnCisgKi8KK3ZvaWQgRkRLX1FtZkRvbWFpbl9DbG9zZShIQU5ETEVfRkRLX1FNRl9ET01BSU4gaHFkKTsKKworI2VuZGlmIC8qIEZES19RTUZfRE9NQUlOX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL0ZES190b29sc19yb20uaCBiL2xpYkZESy9pbmNsdWRlL0ZES190b29sc19yb20uaAppbmRleCA5MzYxYzgxLi5kMWNiOTgwIDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9GREtfdG9vbHNfcm9tLmgKKysrIGIvbGliRkRLL2luY2x1ZGUvRkRLX3Rvb2xzX3JvbS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDcyICs5MCwxMTQgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgT2xpdmVyIE1vc2VyCisKICAgIERlc2NyaXB0aW9uOiBST00gdGFibGVzIHVzZWQgYnkgRkRLIHRvb2xzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgX19GREtfVE9PTFNfUk9NX0hfXwotI2RlZmluZSBfX0ZES19UT09MU19ST01fSF9fCisjaWZuZGVmIEZES19UT09MU19ST01fSAorI2RlZmluZSBGREtfVE9PTFNfUk9NX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKICNpbmNsdWRlICJGREtfYXVkaW8uaCIKIAorLyogc2luZXRhYmxlcyAqLwogCiAvKiBOb25lIHJhZGl4MiByb3RhdGlvbiB2ZWN0b3JzICovCi1leHRlcm4gY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDYwWzYwXTsKLWV4dGVybiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnNjBbNjBdOwotZXh0ZXJuIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWwyNDBbMjQwXTsKLWV4dGVybiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnMjQwWzI0MF07Ci1leHRlcm4gY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDQ4MFs0ODBdOwotZXh0ZXJuIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvckltYWc0ODBbNDgwXTsKLQorZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsNjBbNjBdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnNjBbNjBdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsMTkyWzE5Ml07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvckltYWcxOTJbMTkyXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDI0MFsyMTBdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnMjQwWzIxMF07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWw0ODBbNDgwXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzQ4MFs0ODBdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsNls2XTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzZbNl07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWwxMlsxMl07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvckltYWcxMlsxMl07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWwyNFsyNF07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvckltYWcyNFsyNF07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWw0OFs0OF07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvckltYWc0OFs0OF07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWw4MFs4MF07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvckltYWc4MFs4MF07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWw5Nls5Nl07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvckltYWc5Nls5Nl07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWwzODRbMzg0XTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzM4NFszODRdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsMjBbMjBdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnMjBbMjBdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsMTIwWzEyMF07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvckltYWcxMjBbMTIwXTsKIAogLyogUmVndWxhciBzaW5lIHRhYmxlcyAqLwotZXh0ZXJuIGNvbnN0IEZJWFBfU1RQIFNpbmVUYWJsZTUxMltdOwotZXh0ZXJuIGNvbnN0IEZJWFBfU1RQIFNpbmVUYWJsZTQ4MFtdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUUCBTaW5lVGFibGUxMDI0W107CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RQIFNpbmVUYWJsZTUxMltdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUUCBTaW5lVGFibGU0ODBbXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9TVFAgU2luZVRhYmxlMzg0W107CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfU1RQIFNpbmVUYWJsZTgwW107CisjaWZkZWYgSU5DTFVERV9TaW5lVGFibGUxMAorZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1NUUCBTaW5lVGFibGUxMFtdOworI2VuZGlmCiAKIC8qIEFBQy1MQyB3aW5kb3dzICovCi1leHRlcm4gY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzEwMjRbXTsKLWV4dGVybiBjb25zdCBGSVhQX1dUUCBLQkRXaW5kb3cxMDI0W107Ci1leHRlcm4gY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzEyOFtdOwotZXh0ZXJuIGNvbnN0IEZJWFBfV1RQIEtCRFdpbmRvdzEyOFtdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MTAyNFtdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1dUUCBLQkRXaW5kb3cxMDI0W107CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3cxMjhbXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9XVFAgS0JEV2luZG93MTI4W107CiAKLWV4dGVybiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93OTYwW107Ci1leHRlcm4gY29uc3QgRklYUF9XVFAgS0JEV2luZG93OTYwW107Ci1leHRlcm4gY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzEyMFtdOwotZXh0ZXJuIGNvbnN0IEZJWFBfV1RQIEtCRFdpbmRvdzEyMFtdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93OTYwW107CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfV1RQIEtCRFdpbmRvdzk2MFtdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MTIwW107CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfV1RQIEtCRFdpbmRvdzEyMFtdOwogCiAvKiBBQUMtTEQgd2luZG93cyAqLwotZXh0ZXJuIGNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3c1MTJbXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzUxMltdOwogI2RlZmluZSBMb3dPdmVybGFwV2luZG93NTEyIFNpbmVXaW5kb3cxMjgKLWV4dGVybiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93NDgwW107CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3c0ODBbXTsKICNkZWZpbmUgTG93T3ZlcmxhcFdpbmRvdzQ4MCBTaW5lV2luZG93MTIwCiAKKy8qIFVTQUMgVENYIFdpbmRvdyAqLworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MjU2WzI1Nl07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3cxOTJbXTsKIAorLyogVVNBQyA4LzMgd2luZG93cyAqLworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93NzY4W107CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfV1RQIEtCRFdpbmRvdzc2OFtdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93OTZbXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9XVFAgS0JEV2luZG93OTZbXTsKIAotZXh0ZXJuIGNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3c2NFtdOwotZXh0ZXJuIGNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3czMltdOworLyogRENUIGFuZCBvdGhlcnMgKi8KK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzY0W107CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3c0OFtdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MzJbXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzI0W107CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3cxNltdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93OFtdOwogCiAvKioKLSAqIFxicmllZiBIZWxwZXIgdGFibGUgZm9yIHdpbmRvdyBzbG9wZSBtYXBwaW5nLiBZb3Ugc2hvdWxkIHByZWZlciB0aGUgdXNhZ2Ugb2YgdGhlCi0gKiBmdW5jdGlvbiBGREtnZXRXaW5kb3dTbG9wZSgpLCB0aGlzIHRhYmxlIGlzIG9ubHkgbWFkZSBwdWJsaWMgZm9yIHNvbWUgb3B0aW1pemVkCi0gKiBhY2Nlc3MgaW5zaWRlIGRjdC5jcHAuCisgKiBcYnJpZWYgSGVscGVyIHRhYmxlIGZvciB3aW5kb3cgc2xvcGUgbWFwcGluZy4gWW91IHNob3VsZCBwcmVmZXIgdGhlIHVzYWdlIG9mCisgKiB0aGUgZnVuY3Rpb24gRkRLZ2V0V2luZG93U2xvcGUoKSwgdGhpcyB0YWJsZSBpcyBvbmx5IG1hZGUgcHVibGljIGZvciBzb21lCisgKiBvcHRpbWl6ZWQgYWNjZXNzIGluc2lkZSBkY3QuY3BwLgogICovCi1leHRlcm4gY29uc3QgRklYUF9XVFAgKmNvbnN0IHdpbmRvd1Nsb3Blc1syXVszXVs5XTsKK2V4dGVybiBjb25zdCBGSVhQX1dUUCAqY29uc3Qgd2luZG93U2xvcGVzWzJdWzRdWzldOwogCiAvKioKICAqIFxicmllZiBXaW5kb3cgc2xvcGUgYWNjZXNzIGhlbHBlci4gT2J0YWluIGEgd2luZG93IG9mIGdpdmVuIGxlbmd0aCBhbmQgc2hhcGUuCiAgKiBccGFyYW0gbGVuZ3RoIExlbmd0aCBvZiB0aGUgd2luZG93IHNsb3BlLgotICogXHBhcmFtIHNoYXBlIFNoYXBlIGluZGV4IG9mIHRoZSB3aW5kb3cgc2xvcGUuIDA6IHNpbmUgd2luZG93LCAxOiBLYWlzZXItQmVzc2VsLiBBbnkgb3RoZXIKLSAqICAgICAgICAgICAgICB2YWx1ZSBpcyBhcHBsaWVkIGEgbWFzayBvZiAxIHRvLCBtYXBwaW5nIGl0IHRvIGVpdGhlciAwIG9yIDEuCi0gKiBccGFyYW0gUG9pbnRlciB0byB3aW5kb3cgc2xvcGUgb3IgTlVMTCBpZiB0aGUgcmVxdWVzdGVkIHdpbmRvdyBzbG9wZSBpcyBub3QgYXZhaWxhYmxlLgorICogXHBhcmFtIHNoYXBlIFNoYXBlIGluZGV4IG9mIHRoZSB3aW5kb3cgc2xvcGUuIDA6IHNpbmUgd2luZG93LCAxOgorICogS2Fpc2VyLUJlc3NlbC4gQW55IG90aGVyIHZhbHVlIGlzIGFwcGxpZWQgYSBtYXNrIG9mIDEgdG8sIG1hcHBpbmcgaXQgdG8KKyAqIGVpdGhlciAwIG9yIDEuCisgKiBccGFyYW0gUG9pbnRlciB0byB3aW5kb3cgc2xvcGUgb3IgTlVMTCBpZiB0aGUgcmVxdWVzdGVkIHdpbmRvdyBzbG9wZSBpcyBub3QKKyAqIGF2YWlsYWJsZS4KICAqLwotY29uc3QgRklYUF9XVFAgKiBGREtnZXRXaW5kb3dTbG9wZShpbnQgbGVuZ3RoLCBpbnQgc2hhcGUpOworY29uc3QgRklYUF9XVFAgKkZES2dldFdpbmRvd1Nsb3BlKGludCBsZW5ndGgsIGludCBzaGFwZSk7CiAKIGV4dGVybiBjb25zdCBGSVhQX1dUUCBzaW5fdHdpZGRsZV9MNjRbXTsKIApAQCAtMTUzLDYyICsyMDYsMTAzIEBACiAgKi8KIAogI2lmIGRlZmluZWQoQVJDSF9QUkVGRVJfTVVMVF8xNngxNikgfHwgZGVmaW5lZChBUkNIX1BSRUZFUl9NVUxUXzMyeDE2KQotICAjZGVmaW5lIFFNRl9DT0VGRl8xNkJJVAorI2RlZmluZSBRTUZfQ09FRkZfMTZCSVQKICNlbmRpZgogCi0jZGVmaW5lIFFNRl9GSUxURVJfUFJPVE9UWVBFX1NJWkUgICAgNjQwCi0jZGVmaW5lIFFNRl9OT19QT0xZICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBRTUZfRklMVEVSX1BST1RPVFlQRV9TSVpFIDY0MAorI2RlZmluZSBRTUZfTk9fUE9MWSA1CiAKICNpZmRlZiBRTUZfQ09FRkZfMTZCSVQKLSAgI2RlZmluZSBGSVhQX1BGVCBGSVhQX1NHTAotICAjZGVmaW5lIEZJWFBfUVRXIEZJWFBfU0dMCisjZGVmaW5lIEZJWFBfUEZUIEZJWFBfU0dMCisjZGVmaW5lIEZJWFBfUVRXIEZJWFBfU0dMCisjZGVmaW5lIEZYX0RCTDJGWF9RVFcoeCkgRlhfREJMMkZYX1NHTCh4KQogI2Vsc2UKLSAgI2RlZmluZSBGSVhQX1BGVCBGSVhQX0RCTAotICAjZGVmaW5lIEZJWFBfUVRXIEZJWFBfREJMCisjZGVmaW5lIEZJWFBfUEZUIEZJWFBfREJMCisjZGVmaW5lIEZJWFBfUVRXIEZJWFBfREJMCisKKyNkZWZpbmUgRlhfREJMMkZYX1FUVyh4KSAoeCkKKwogI2VuZGlmCiAKLSNkZWZpbmUgUU1GNjQwX1BGVF9UQUJMRV9TSVpFICAgICAgICg2NDAvMiArIFFNRl9OT19QT0xZKQorI2RlZmluZSBRTUY2NDBfUEZUX1RBQkxFX1NJWkUgKDY0MCAvIDIgKyBRTUZfTk9fUE9MWSkKIAotZXh0ZXJuIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczMyWzMyXTsKLWV4dGVybiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW4zMlszMl07CisvKiBSZXNhbXBsaW5nIHR3aWRkbGVzIGZvciBRTUYgKi8KKworLyogTm90IHJlc2FtcGxpbmcgdHdpZGRsZXMgKi8KK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zMzJbMzJdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW4zMlszMl07CiAvKiBBZGFwdGVkIGFuYWx5c2lzIHBvc3QtdHdpZGRsZXMgZm9yIGRvd24tc2FtcGxlZCBIUSBTQlIgKi8KLWV4dGVybiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3NfZG93bnNhbXAzMlszMl07Ci1leHRlcm4gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luX2Rvd25zYW1wMzJbMzJdOwotZXh0ZXJuIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczY0WzY0XTsKLWV4dGVybiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW42NFs2NF07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2Nvc19kb3duc2FtcDMyWzMyXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luX2Rvd25zYW1wMzJbMzJdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3M2NFs2NF07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X3NpbjY0WzY0XTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9QRlQKKyAgICBxbWZfcGZpbHQ2NDBbUU1GNjQwX1BGVF9UQUJMRV9TSVpFICsgUU1GX05PX1BPTFldOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1BGVCBxbWZfcGZpbHQ2NDBfdmVjdG9yWzY0MF07CiAKLWV4dGVybiBjb25zdCBGSVhQX1BGVCBxbWZfNjRbUU1GNjQwX1BGVF9UQUJMRV9TSVpFK1FNRl9OT19QT0xZXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zNDBbNDBdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW40MFs0MF07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfUEZUIHFtZl9wZmlsdDQwMFtdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1BGVCBxbWZfcGZpbHQyMDBbXTsKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9QRlQgcW1mX3BmaWx0MTIwW107CiAKK2V4dGVybiBSQU1fQUxJR04gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zMjRbMjRdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW4yNFsyNF07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfUEZUIHFtZl9wZmlsdDI0MFtdOwogCi0KLQorZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3MxNlsxNl07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X3NpbjE2WzE2XTsKIAogI2RlZmluZSBRTUY2NDBfQ0xERkJfUEZUX1RBQkxFX1NJWkUgKDY0MCkKICNkZWZpbmUgUU1GMzIwX0NMREZCX1BGVF9UQUJMRV9TSVpFICgzMjApCiAjZGVmaW5lIFFNRl9DTERGQl9QRlRfU0NBTEUgMQogCi1leHRlcm4gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zMzJfY2xkZmJbMzJdOworZXh0ZXJuIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczMyX2NsZGZiX2FuYVszMl07CitleHRlcm4gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zMzJfY2xkZmJfc3luWzMyXTsKIGV4dGVybiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW4zMl9jbGRmYlszMl07CisKK2V4dGVybiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3MxNl9jbGRmYl9hbmFbMTZdOworZXh0ZXJuIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczE2X2NsZGZiX3N5blsxNl07CitleHRlcm4gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luMTZfY2xkZmJbMTZdOworCitleHRlcm4gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zOF9jbGRmYl9hbmFbOF07CitleHRlcm4gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zOF9jbGRmYl9zeW5bOF07CitleHRlcm4gY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luOF9jbGRmYls4XTsKKwogZXh0ZXJuIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczY0X2NsZGZiWzY0XTsKIGV4dGVybiBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW42NF9jbGRmYls2NF07CiAKLWV4dGVybiBjb25zdCBGSVhQX1BGVCBxbWZfY2xkZmJfNjQwW1FNRjY0MF9DTERGQl9QRlRfVEFCTEVfU0laRV07Ci1leHRlcm4gY29uc3QgRklYUF9QRlQgcW1mX2NsZGZiXzMyMFtRTUYzMjBfQ0xERkJfUEZUX1RBQkxFX1NJWkVdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1BGVCBxbWZfY2xkZmJfNjQwW1FNRjY0MF9DTERGQl9QRlRfVEFCTEVfU0laRV07CitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfUEZUIHFtZl9jbGRmYl8zMjBbUU1GMzIwX0NMREZCX1BGVF9UQUJMRV9TSVpFXTsKKyNkZWZpbmUgUU1GMTYwX0NMREZCX1BGVF9UQUJMRV9TSVpFICgxNjApCitleHRlcm4gUkFNX0FMSUdOIGNvbnN0IEZJWFBfUEZUIHFtZl9jbGRmYl8xNjBbUU1GMTYwX0NMREZCX1BGVF9UQUJMRV9TSVpFXTsKKyNkZWZpbmUgUU1GODBfQ0xERkJfUEZUX1RBQkxFX1NJWkUgKDgwKQorZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1BGVCBxbWZfY2xkZmJfODBbUU1GODBfQ0xERkJfUEZUX1RBQkxFX1NJWkVdOwogCisjZGVmaW5lIFFNRjMyMF9NUFNMREZCX1BGVF9UQUJMRV9TSVpFICgzMjApCisjZGVmaW5lIFFNRjY0MF9NUFNMREZCX1BGVF9UQUJMRV9TSVpFICg2NDApCisjZGVmaW5lIFFNRl9NUFNMREZCX1BGVF9TQ0FMRSAxCiAKK2V4dGVybiBjb25zdCBGSVhQX1BGVCBxbWZfbXBzbGRmYl8zMjBbUU1GMzIwX01QU0xERkJfUEZUX1RBQkxFX1NJWkVdOworZXh0ZXJuIFJBTV9BTElHTiBjb25zdCBGSVhQX1BGVCBxbWZfbXBzbGRmYl82NDBbUU1GNjQwX01QU0xERkJfUEZUX1RBQkxFX1NJWkVdOwogCi0KKy8qKgorICogQXVkaW8gYml0c3RyZWFtIGVsZW1lbnQgc3BlY2lmaWMgc3ludGF4IGZsYWdzOgorICovCisjZGVmaW5lIEFDX0VMX0dBX0NDRSAweDAwMDAwMDAxIC8qITwgR0EgQUFDIGNvdXBsaW5nIGNoYW5uZWwgZWxlbWVudCAoQ0NFKSAqLwogCiAvKgotICogUmF3IERhdGEgQmxvY2sgbGlzdCBzdHVmZi4KKyAqIFJhdyBEYXRhIEJsb2NrIGxpc3QgaXRlbXMuCiAgKi8KIHR5cGVkZWYgZW51bSB7CiAgIGVsZW1lbnRfaW5zdGFuY2VfdGFnLAotICBjb21tb25fd2luZG93LAorICBjb21tb25fd2luZG93LCAvKiAtPiBkZWNpc2lvbiBmb3IgbGlua19zZXF1ZW5jZSAqLwogICBnbG9iYWxfZ2FpbiwKLSAgaWNzX2luZm8sIC8qIGljc19yZXNlcnZlZF9iaXQsIHdpbmRvd19zZXF1ZW5jZSwgd2luZG93X3NoYXBlLCBtYXhfc2ZiLCBzY2FsZV9mYWN0b3JfZ3JvdXBpbmcsIHByZWRpY3Rvcl9kYXRhX3ByZXNlbnQsIGx0cF9kYXRhX3ByZXNlbnQsIGx0cF9kYXRhICovCisgIGljc19pbmZvLCAvKiBpY3NfcmVzZXJ2ZWRfYml0LCB3aW5kb3dfc2VxdWVuY2UsIHdpbmRvd19zaGFwZSwgbWF4X3NmYiwKKyAgICAgICAgICAgICAgIHNjYWxlX2ZhY3Rvcl9ncm91cGluZywgcHJlZGljdG9yX2RhdGFfcHJlc2VudCwgbHRwX2RhdGFfcHJlc2VudCwKKyAgICAgICAgICAgICAgIGx0cF9kYXRhICovCiAgIG1heF9zZmIsCi0gIG1zLCAvKiBtc19tYXNrX3ByZXNlbnQsIG1zX3VzZWQgKi8KKyAgbXMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1zX21hc2tfcHJlc2VudCwgbXNfdXNlZCAqLwogICAvKnByZWRpY3Rvcl9kYXRhX3ByZXNlbnQsKi8gLyogcGFydCBvZiBpY3NfaW5mbyAqLwogICBsdHBfZGF0YV9wcmVzZW50LAogICBsdHBfZGF0YSwKQEAgLTIyNCw3ICszMTgsNyBAQAogICBzcGVjdHJhbF9kYXRhLAogCiAgIHNjYWxlX2ZhY3Rvcl9kYXRhX3VzYWMsCi0gIGNvcmVfbW9kZSwKKyAgY29yZV9tb2RlLCAvKiAtPiBkZWNpc2lvbiBmb3IgbGlua19zZXF1ZW5jZSAqLwogICBjb21tb25fdHcsCiAgIGxwZF9jaGFubmVsX3N0cmVhbSwKICAgdHdfZGF0YSwKQEAgLTIzNSw2ICszMjksOCBAQAogICB0bnNfZGF0YV9wcmVzZW50X3VzYWMsCiAgIGNvbW1vbl9tYXhfc2ZiLAogCisgIGNvdXBsZWRfZWxlbWVudHMsICAgLyogb25seSBmb3IgQ0NFIHBhcnNpbmcgKi8KKyAgZ2Fpbl9lbGVtZW50X2xpc3RzLCAvKiBvbmx5IGZvciBDQ0UgcGFyc2luZyAqLwogCiAgIC8qIE5vbiBkYXRhIGxpc3QgaXRlbXMgKi8KICAgYWR0c2NyY19zdGFydF9yZWcxLApAQCAtMjYxLDEwICszNTcsNDIgQEAKICAqIFxwYXJhbSBlcENvbmZpZyB0aGUgZXBDb25maWcgdmFsdWUgZnJvbSB0aGUgY3VycmVudCBBdWRpbyBTcGVjaWZpYyBDb25maWcKICAqIFxwYXJhbSBuQ2hhbm5lbHMgYW1vdW50IG9mIGNoYW5uZWxzIGNvbnRhaW5lZCBpbiB0aGUgY3VycmVudCBlbGVtZW50LgogICogXHBhcmFtIGxheWVyIHRoZSBsYXllciBvZiB0aGUgY3VycmVudCBlbGVtZW50LgorICogXHBhcmFtIGVsRmxhZ3MgZWxlbWVudCBzcGVjaWZpYyBmbGFncy4KICAqIFxyZXR1cm4gZWxlbWVudF9saXN0X3QgcGFyc2VyIGd1aWRhbmNlIHN0cnVjdHVyZS4KICAqLwotY29uc3QgZWxlbWVudF9saXN0X3QgKiBnZXRCaXRzdHJlYW1FbGVtZW50TGlzdChBVURJT19PQkpFQ1RfVFlQRSBhb3QsIFNDSEFSIGVwQ29uZmlnLCBVQ0hBUiBuQ2hhbm5lbHMsIFVDSEFSIGxheWVyKTsKK2NvbnN0IGVsZW1lbnRfbGlzdF90ICpnZXRCaXRzdHJlYW1FbGVtZW50TGlzdChBVURJT19PQkpFQ1RfVFlQRSBhb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgZXBDb25maWcsIFVDSEFSIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBsYXllciwgVUlOVCBlbEZsYWdzKTsKIAordHlwZWRlZiBlbnVtIHsKKyAgLyogbi5hLiAqLworICBGREtfRk9STUFUXzFfMCA9IDEsICAgICAvKiBtb25vICovCisgIEZES19GT1JNQVRfMl8wID0gMiwgICAgIC8qIHN0ZXJlbyAqLworICBGREtfRk9STUFUXzNfMF9GQyA9IDMsICAvKiAzLzAuMCAqLworICBGREtfRk9STUFUXzNfMV8wID0gNCwgICAvKiAzLzEuMCAqLworICBGREtfRk9STUFUXzVfMCA9IDUsICAgICAvKiAzLzIuMCAqLworICBGREtfRk9STUFUXzVfMSA9IDYsICAgICAvKiA1LjEgKi8KKyAgRkRLX0ZPUk1BVF83XzFfQUxUID0gNywgLyogNS8yLjEgQUxUICovCisgIC8qIDggbi5hLiovCisgIEZES19GT1JNQVRfM18wX1JDID0gOSwgLyogMi8xLjAgKi8KKyAgRkRLX0ZPUk1BVF8yXzJfMCA9IDEwLCAvKiAyLzIuMCAqLworICBGREtfRk9STUFUXzZfMSA9IDExLCAgIC8qIDMvMy4xICovCisgIEZES19GT1JNQVRfN18xID0gMTIsICAgLyogMy80LjEgKi8KKyAgRkRLX0ZPUk1BVF8yMl8yID0gMTMsICAvKiAyMi4yICovCisgIEZES19GT1JNQVRfNV8yXzEgPSAxNCwgLyogNS8yLjEqLworICBGREtfRk9STUFUXzVfNV8yID0gMTUsIC8qIDUvNS4yICovCisgIEZES19GT1JNQVRfOV8xID0gMTYsICAgLyogNS80LjEgKi8KKyAgRkRLX0ZPUk1BVF82XzVfMSA9IDE3LCAvKiA2LzUuMSAqLworICBGREtfRk9STUFUXzZfN18xID0gMTgsIC8qIDYvNy4xICovCisgIEZES19GT1JNQVRfNV82XzEgPSAxOSwgLyogNS82LjEgKi8KKyAgRkRLX0ZPUk1BVF83XzZfMSA9IDIwLCAvKiA3LzYuMSAqLworICBGREtfRk9STUFUX0lOX0xJU1RPRkNIQU5ORUxTID0gMjEsCisgIEZES19GT1JNQVRfT1VUX0xJU1RPRkNIQU5ORUxTID0gMjIsCisgIC8qIDIwIGZvcm1hdHMgKyBJbiAmIE91dCBsaXN0IG9mIGNoYW5uZWxzICovCisgIEZES19ORk9STUFUUyA9IDIzLAorICBGREtfRk9STUFUX0ZBSUwgPSAtMQorfSBGREtfY29udmVydGVyX2Zvcm1hdGlkX3Q7CisKK2V4dGVybiBjb25zdCBJTlQgZm9ybWF0X25jaGFuW0ZES19ORk9STUFUUyArIDkgLSAyXTsKIAogI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL0ZES190cmlnRmN0cy5oIGIvbGliRkRLL2luY2x1ZGUvRkRLX3RyaWdGY3RzLmgKaW5kZXggYzMyYzBmMi4uMTUzY2E0YyAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvRkRLX3RyaWdGY3RzLmgKKysrIGIvbGliRkRLL2luY2x1ZGUvRkRLX3RyaWdGY3RzLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNDMgKzkwLDQ1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSGFyaWNoYXJhbiBMYWtzaG1hbiwgTWFudWVsIEphbmRlcgorCiAgICBEZXNjcmlwdGlvbjogVHJpZ29ub21ldHJpYyBmdW5jdGlvbnMgZml4ZWQgcG9pbnQgZnJhY3Rpb25hbCBpbXBsZW1lbnRhdGlvbi4KIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCisjaWYgIWRlZmluZWQoRkRLX1RSSUdGQ1RTX0gpCisjZGVmaW5lIEZES19UUklHRkNUU19ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKICNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCiAKIC8qIEZpeGVkIHBvaW50IHByZWNpc2lvbiBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBRKGZvcm1hdCkgICAgICAgICgoRklYUF9EQkwpKCgoTE9ORykxKSA8PCAoZm9ybWF0KSkpCisjZGVmaW5lIFEoZm9ybWF0KSAoKEZJWFBfREJMKSgoKExPTkcpMSkgPDwgKGZvcm1hdCkpKQogCiAjaWZuZGVmIE1fUEkKLSNkZWZpbmUgTV9QSSAgICAgICgzLjE0MTU5MjY1MzU4OTc5MzIzODQ2ZikKKyNkZWZpbmUgTV9QSSAoMy4xNDE1OTI2NTM1ODk3OTMyMzg0NmYpCiAjZW5kaWYKIAogLyohCiAgKiBJbnZlcnNlIHRhbmdlbnQgZnVuY3Rpb24uCiAgKi8KIAotLy8gLS0tIGZpeHBfYXRhbigpIC0tLS0KLSNkZWZpbmUgUV9BVEFOSU5QICAgKDI1KSAgICAvLyBJbnB1dCBpbiBxMjUsIE91dHB1dCBpbiBxMzAKLSNkZWZpbmUgUV9BVEFOT1VUICAgKDMwKQotI2RlZmluZSBBVElfU0YgICAgICAgICAgICAgICgoREZSQUNUX0JJVFMtMSktUV9BVEFOSU5QKSAgLy8gNgotI2RlZmluZSBBVElfU0NBTEUgICAgICAgICAgICgoZmxvYXQpKDE8PEFUSV9TRikpICAgICAgICAgLy8KLSNkZWZpbmUgQVRPX1NGICAgICAgICAgICAgICAoKERGUkFDVF9CSVRTLTEpLVFfQVRBTk9VVCkgIC8vIDEgICBdIC1waS8yIC4uIHBpLzIgWwotI2RlZmluZSBBVE9fU0NBTEUgICAgICAgICAgICgoZmxvYXQpKDE8PEFUT19TRikpICAgICAgICAgLy8KLS8vIC0tLSBmaXhwX2F0YW4yKCkgLS0tCi0jZGVmaW5lIFFfQVRBTjJPVVQgICgyOSkKLSNkZWZpbmUgQVQyT19TRiAgICAgICAgICAgICAoKERGUkFDVF9CSVRTLTEpLVFfQVRBTjJPVVQpIC8vIDIgICBdIC1waSAgIC4uIHBpICAgXQotI2RlZmluZSBBVDJPX1NDQUxFICAgICAgICAgICgoZmxvYXQpKDE8PEFUMk9fU0YpKSAgICAgICAgLy8KKy8qIC0tLSBmaXhwX2F0YW4oKSAtLS0tICAgICovCisjZGVmaW5lIFFfQVRBTklOUCAoMjUpICAvLyBJbnB1dCBpbiBxMjUsIE91dHB1dCBpbiBxMzAKKyNkZWZpbmUgUV9BVEFOT1VUICgzMCkKKyNkZWZpbmUgQVRJX1NGICgoREZSQUNUX0JJVFMgLSAxKSAtIFFfQVRBTklOUCkgLyogNiAgKi8KKyNkZWZpbmUgQVRJX1NDQUxFICgoZmxvYXQpKDEgPDwgQVRJX1NGKSkKKyNkZWZpbmUgQVRPX1NGICgoREZSQUNUX0JJVFMgLSAxKSAtIFFfQVRBTk9VVCkgLyogMSAgIF0gLXBpLzIgLi4gcGkvMiBbICovCisjZGVmaW5lIEFUT19TQ0FMRSAoKGZsb2F0KSgxIDw8IEFUT19TRikpCisvKiAtLS0gZml4cF9hdGFuMigpIC0tLSAgICAqLworI2RlZmluZSBRX0FUQU4yT1VUICgyOSkKKyNkZWZpbmUgQVQyT19TRiAoKERGUkFDVF9CSVRTIC0gMSkgLSBRX0FUQU4yT1VUKSAvKiAyICAgXSAtcGkgICAuLiBwaSAgIF0gKi8KKyNkZWZpbmUgQVQyT19TQ0FMRSAoKGZsb2F0KSgxIDw8IEFUMk9fU0YpKQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogRklYUF9EQkwgZml4cF9hdGFuKEZJWFBfREJMIHgpOwpAQCAtMTI2LDEzICsxMzksMTEgQEAKIAogI2RlZmluZSBGSVhQX0NPU19TSU4KIAotCiAjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgogCiAjZGVmaW5lIFNJTkVUQUIgU2luZVRhYmxlNTEyCiAjZGVmaW5lIExEIDkKIAotCiAjaWZuZGVmIEZVTkNUSU9OX2lubGluZV9maXhwX2Nvc19zaW4KIAogI2RlZmluZSBGVU5DVElPTl9pbmxpbmVfZml4cF9jb3Nfc2luCkBAIC0xNDEsODkgKzE1MiwxMDcgQEAKICAqIENhbGN1bGF0ZXMgY29hcnNlIGxvb2t1cCBpbmRleCBhbmQgc2lnbiBmb3Igc2luZS4KICAqIFJldHVybnMgZGVsdGEgeCByZXNpZHVhbC4KICAqLwotc3RhdGljIGlubGluZSBGSVhQX0RCTCBmaXhwX3Npbl9jb3NfcmVzaWR1YWxfaW5saW5lKEZJWFBfREJMIHgsIGludCBzY2FsZSwgRklYUF9EQkwgKnNpbmUsIEZJWFBfREJMICpjb3NpbmUpCi17Ci0gICAgRklYUF9EQkwgcmVzaWR1YWw7Ci0gICAgaW50IHM7Ci0gICAgaW50IHNoaWZ0ID0gKDMxLXNjYWxlLUxELTEpOwotICAgIGludCBzc2lnbiA9IDE7Ci0gICAgaW50IGNzaWduID0gMTsKK3N0YXRpYyBpbmxpbmUgRklYUF9EQkwgZml4cF9zaW5fY29zX3Jlc2lkdWFsX2lubGluZShGSVhQX0RCTCB4LCBpbnQgc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNvc2luZSkgeworICBGSVhQX0RCTCByZXNpZHVhbDsKKyAgaW50IHM7CisgIGludCBzaGlmdCA9ICgzMSAtIHNjYWxlIC0gTEQgLSAxKTsKKyAgaW50IHNzaWduID0gMTsKKyAgaW50IGNzaWduID0gMTsKIAotICAgIHJlc2lkdWFsID0gZk11bHQoeCwgRkwyRlhDT05TVF9EQkwoMS4wL01fUEkpKTsKLSAgICBzID0gKChMT05HKXJlc2lkdWFsKSA+PiBzaGlmdDsKKyAgcmVzaWR1YWwgPSBmTXVsdCh4LCBGTDJGWENPTlNUX0RCTCgxLjAgLyBNX1BJKSk7CisgIHMgPSAoKExPTkcpcmVzaWR1YWwpID4+IHNoaWZ0OwogCi0gICAgcmVzaWR1YWwgJj0gKCAoMTw8c2hpZnQpIC0gMSApOwotICAgIHJlc2lkdWFsID0gZk11bHQocmVzaWR1YWwsIEZMMkZYQ09OU1RfREJMKE1fUEkvNC4wKSkgPDwgMjsKLSAgICByZXNpZHVhbCA8PD0gc2NhbGU7CisgIHJlc2lkdWFsICY9ICgoMSA8PCBzaGlmdCkgLSAxKTsKKyAgcmVzaWR1YWwgPSBmTXVsdChyZXNpZHVhbCwgRkwyRlhDT05TVF9EQkwoTV9QSSAvIDQuMCkpIDw8IDI7CisgIHJlc2lkdWFsIDw8PSBzY2FsZTsKIAotICAgIC8qIFNpbmUgc2lnbiBzeW1tZXRyeSAqLwotICAgIGlmIChzICYgKCgxPDxMRCk8PDEpICkgewotICAgICAgc3NpZ24gPSAtc3NpZ247CisgIC8qIFNpbmUgc2lnbiBzeW1tZXRyeSAqLworICBpZiAocyAmICgoMSA8PCBMRCkgPDwgMSkpIHsKKyAgICBzc2lnbiA9IC1zc2lnbjsKKyAgfQorICAvKiBDb3NpbmUgc2lnbiBzeW1tZXRyeSAqLworICBpZiAoKHMgKyAoMSA8PCBMRCkpICYgKCgxIDw8IExEKSA8PCAxKSkgeworICAgIGNzaWduID0gLWNzaWduOworICB9CisKKyAgcyA9IGZBYnMocyk7CisKKyAgcyAmPSAoKCgxIDw8IExEKSA8PCAxKSAtIDEpOyAvKiBNb2R1bG8gUEkgKi8KKworICBpZiAocyA+ICgxIDw8IExEKSkgeworICAgIHMgPSAoKDEgPDwgTEQpIDw8IDEpIC0gczsKKyAgfQorCisgIHsKKyAgICBMT05HIHNsLCBjbDsKKyAgICAvKiBCZWNhdXNlIG9mIHBhY2tlZCB0YWJsZSAqLworICAgIGlmIChzID4gKDEgPDwgKExEIC0gMSkpKSB7CisgICAgICBGSVhQX1NUUCB0bXA7CisgICAgICAvKiBDb3NpbmUvU2luZSBzaW1ldHJ5IGZvciBhbmdsZXMgZ3JlYXRlciB0aGFuIFBJLzQgKi8KKyAgICAgIHMgPSAoMSA8PCBMRCkgLSBzOworICAgICAgdG1wID0gU0lORVRBQltzXTsKKyAgICAgIHNsID0gKExPTkcpdG1wLnYucmU7CisgICAgICBjbCA9IChMT05HKXRtcC52LmltOworICAgIH0gZWxzZSB7CisgICAgICBGSVhQX1NUUCB0bXA7CisgICAgICB0bXAgPSBTSU5FVEFCW3NdOworICAgICAgc2wgPSAoTE9ORyl0bXAudi5pbTsKKyAgICAgIGNsID0gKExPTkcpdG1wLnYucmU7CiAgICAgfQotICAgIC8qIENvc2luZSBzaWduIHN5bW1ldHJ5ICovCi0gICAgaWYgKCAocyArICgxPDxMRCkpICYgKCgxPDxMRCk8PDEpICkgewotICAgICAgY3NpZ24gPSAtY3NpZ247Ci0gICAgfQotCi0gICAgcyA9IGZBYnMocyk7Ci0KLSAgICBzICY9ICgoKDE8PExEKTw8MSktMSk7IC8qIE1vZHVsbyBQSSAqLwotCi0gICAgaWYgKHMgPiAoMTw8TEQpKSB7Ci0gICAgICBzID0gKCgxPDxMRCk8PDEpIC0gczsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICBMT05HIHNsLCBjbDsKLSAgICAgIC8qIEJlY2F1c2Ugb2YgcGFja2VkIHRhYmxlICovCi0gICAgICBpZiAocyA+ICgxPDwoTEQtMSkpKSB7Ci0gICAgICAgIEZJWFBfU1RQIHRtcDsKLSAgICAgICAgLyogQ29zaW5lL1NpbmUgc2ltZXRyeSBmb3IgYW5nbGVzIGdyZWF0ZXIgdGhhbiBQSS80ICovCi0gICAgICAgIHMgPSAoMTw8TEQpLXM7Ci0gICAgICAgIHRtcCA9IFNJTkVUQUJbc107Ci0gICAgICAgIHNsID0gKExPTkcpdG1wLnYucmU7Ci0gICAgICAgIGNsID0gKExPTkcpdG1wLnYuaW07Ci0gICAgICB9IGVsc2UgewotICAgICAgICBGSVhQX1NUUCB0bXA7Ci0gICAgICAgIHRtcCA9IFNJTkVUQUJbc107Ci0gICAgICAgIHNsID0gKExPTkcpdG1wLnYuaW07Ci0gICAgICAgIGNsID0gKExPTkcpdG1wLnYucmU7Ci0gICAgICB9CiAKICNpZmRlZiBTSU5FVEFCTEVfMTZCSVQKLSAgICAgICpzaW5lICAgPSAoRklYUF9EQkwpKChzbCAqIHNzaWduKSA8PCAoREZSQUNUX0JJVFMtRlJBQ1RfQklUUykpOwotICAgICAgKmNvc2luZSA9IChGSVhQX0RCTCkoKGNsICogY3NpZ24pIDw8IChERlJBQ1RfQklUUy1GUkFDVF9CSVRTKSk7CisgICAgKnNpbmUgPSAoRklYUF9EQkwpKChzbCAqIHNzaWduKSA8PCAoREZSQUNUX0JJVFMgLSBGUkFDVF9CSVRTKSk7CisgICAgKmNvc2luZSA9IChGSVhQX0RCTCkoKGNsICogY3NpZ24pIDw8IChERlJBQ1RfQklUUyAtIEZSQUNUX0JJVFMpKTsKICNlbHNlCi0gICAgICAqc2luZSAgID0gKEZJWFBfREJMKShzbCAqIHNzaWduKTsKLSAgICAgICpjb3NpbmUgPSAoRklYUF9EQkwpKGNsICogY3NpZ24pOworICAgIC8qIHNjYWxlIGRvd24gYnkgMSBmb3Igb3ZlcmZsb3cgcHJldmVudGlvbi4gVGhpcyBpcyB1bmRvbmUgYXQgdGhlIGNhbGxpbmcKKyAgICAgKiBmdW5jdGlvbi4gKi8KKyAgICAqc2luZSA9IChGSVhQX0RCTCkoc2wgKiBzc2lnbikgPj4gMTsKKyAgICAqY29zaW5lID0gKEZJWFBfREJMKShjbCAqIGNzaWduKSA+PiAxOwogI2VuZGlmCi0gICAgfQorICB9CiAKLSAgICByZXR1cm4gcmVzaWR1YWw7CisgIHJldHVybiByZXNpZHVhbDsKIH0KIAogLyoqCi0gKiBcYnJpZWYgQ2FsY3VsYXRlIGNvc2luZSBhbmQgc2luZSB2YWx1ZSBlYWNoIG9mIDIgYW5nbGVzIGRpZmZlcmVudCBhbmdsZSB2YWx1ZXMuCisgKiBcYnJpZWYgQ2FsY3VsYXRlIGNvc2luZSBhbmQgc2luZSB2YWx1ZSBlYWNoIG9mIDIgYW5nbGVzIGRpZmZlcmVudCBhbmdsZQorICogdmFsdWVzLgogICogXHBhcmFtIHgxIGZpcnN0IGFuZ2xlIHZhbHVlCiAgKiBccGFyYW0geDIgc2Vjb25kIGFuZ2xlIHZhbHVlCiAgKiBccGFyYW0gc2NhbGUgZXhwb25lbnQgb2YgeDEgYW5kIHgyCi0gKiBccGFyYW0gb3V0IHBvaW50ZXIgdG8gNCBGSVhQX0RCTCBsb2NhdGlvbnMsIHdlcmUgdGhlIHZhbHVlcyBjb3MoeDEpLCBzaW4oeDEpLCBjb3MoeDIpLCBzaW4oeDIpCi0gKiAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGludG8uCisgKiBccGFyYW0gb3V0IHBvaW50ZXIgdG8gNCBGSVhQX0RCTCBsb2NhdGlvbnMsIHdlcmUgdGhlIHZhbHVlcyBjb3MoeDEpLCBzaW4oeDEpLAorICogY29zKHgyKSwgc2luKHgyKSB3aWxsIGJlIHN0b3JlZCBpbnRvLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5saW5lX2ZpeHBfY29zX3NpbiAoRklYUF9EQkwgeDEsIEZJWFBfREJMIHgyLCBjb25zdCBpbnQgc2NhbGUsIEZJWFBfREJMICpvdXQpCi17Ci0gICAgRklYUF9EQkwgcmVzaWR1YWwsIGVycm9yMCwgZXJyb3IxLCBzaW5lLCBjb3NpbmU7Ci0gICAgcmVzaWR1YWwgPSBmaXhwX3Npbl9jb3NfcmVzaWR1YWxfaW5saW5lKHgxLCBzY2FsZSwgJnNpbmUsICZjb3NpbmUpOwotICAgIGVycm9yMCA9IGZNdWx0RGl2MihzaW5lLCByZXNpZHVhbCk7Ci0gICAgZXJyb3IxID0gZk11bHREaXYyKGNvc2luZSwgcmVzaWR1YWwpOwotICAgICpvdXQrKyAgPSBjb3NpbmUgLSAoZXJyb3IwPDwxKTsKLSAgICAqb3V0KysgID0gc2luZSAgICsgKGVycm9yMTw8MSk7CitzdGF0aWMgaW5saW5lIHZvaWQgaW5saW5lX2ZpeHBfY29zX3NpbihGSVhQX0RCTCB4MSwgRklYUF9EQkwgeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2NhbGUsIEZJWFBfREJMICpvdXQpIHsKKyAgRklYUF9EQkwgcmVzaWR1YWwsIGVycm9yMCwgZXJyb3IxLCBzaW5lLCBjb3NpbmU7CisgIHJlc2lkdWFsID0gZml4cF9zaW5fY29zX3Jlc2lkdWFsX2lubGluZSh4MSwgc2NhbGUsICZzaW5lLCAmY29zaW5lKTsKKyAgZXJyb3IwID0gZk11bHREaXYyKHNpbmUsIHJlc2lkdWFsKTsKKyAgZXJyb3IxID0gZk11bHREaXYyKGNvc2luZSwgcmVzaWR1YWwpOwogCi0gICAgcmVzaWR1YWwgPSBmaXhwX3Npbl9jb3NfcmVzaWR1YWxfaW5saW5lKHgyLCBzY2FsZSwgJnNpbmUsICZjb3NpbmUpOwotICAgIGVycm9yMCA9IGZNdWx0RGl2MihzaW5lLCByZXNpZHVhbCk7Ci0gICAgZXJyb3IxID0gZk11bHREaXYyKGNvc2luZSwgcmVzaWR1YWwpOwotICAgICpvdXQrKyAgPSBjb3NpbmUgLSAoZXJyb3IwPDwxKTsKLSAgICAqb3V0KysgID0gc2luZSAgICsgKGVycm9yMTw8MSk7CisjaWZkZWYgU0lORVRBQkxFXzE2QklUCisgICpvdXQrKyA9IGNvc2luZSAtIChlcnJvcjAgPDwgMSk7CisgICpvdXQrKyA9IHNpbmUgKyAoZXJyb3IxIDw8IDEpOworI2Vsc2UKKyAgLyogVW5kbyBkb3duc2NhbGluZyBieSAxIHdoaWNoIHdhcyBkb25lIGF0IGZpeHBfc2luX2Nvc19yZXNpZHVhbF9pbmxpbmUgKi8KKyAgKm91dCsrID0gU0FUVVJBVEVfTEVGVF9TSElGVChjb3NpbmUgLSAoZXJyb3IwIDw8IDEpLCAxLCBERlJBQ1RfQklUUyk7CisgICpvdXQrKyA9IFNBVFVSQVRFX0xFRlRfU0hJRlQoc2luZSArIChlcnJvcjEgPDwgMSksIDEsIERGUkFDVF9CSVRTKTsKKyNlbmRpZgorCisgIHJlc2lkdWFsID0gZml4cF9zaW5fY29zX3Jlc2lkdWFsX2lubGluZSh4Miwgc2NhbGUsICZzaW5lLCAmY29zaW5lKTsKKyAgZXJyb3IwID0gZk11bHREaXYyKHNpbmUsIHJlc2lkdWFsKTsKKyAgZXJyb3IxID0gZk11bHREaXYyKGNvc2luZSwgcmVzaWR1YWwpOworCisjaWZkZWYgU0lORVRBQkxFXzE2QklUCisgICpvdXQrKyA9IGNvc2luZSAtIChlcnJvcjAgPDwgMSk7CisgICpvdXQrKyA9IHNpbmUgKyAoZXJyb3IxIDw8IDEpOworI2Vsc2UKKyAgKm91dCsrID0gU0FUVVJBVEVfTEVGVF9TSElGVChjb3NpbmUgLSAoZXJyb3IwIDw8IDEpLCAxLCBERlJBQ1RfQklUUyk7CisgICpvdXQrKyA9IFNBVFVSQVRFX0xFRlRfU0hJRlQoc2luZSArIChlcnJvcjEgPDwgMSksIDEsIERGUkFDVF9CSVRTKTsKKyNlbmRpZgogfQogI2VuZGlmCiAKKyNlbmRpZiAvKiAhZGVmaW5lZChGREtfVFJJR0ZDVFNfSCkgKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL2Ficy5oIGIvbGliRkRLL2luY2x1ZGUvYWJzLmgKaW5kZXggMDgzN2UzYy4uMDg0NmM5NiAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvYWJzLmgKKysrIGIvbGliRkRLL2luY2x1ZGUvYWJzLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjMgKzkwLDIzIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIE0uIExvaHdhc3NlcgorCiAgICBEZXNjcmlwdGlvbjogZml4ZWQgcG9pbnQgYWJzIGRlZmluaXRpb25zCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZiAhZGVmaW5lZChfX0FCU19IX18pCi0jZGVmaW5lIF9fQUJTX0hfXworI2lmICFkZWZpbmVkKEFCU19IKQorI2RlZmluZSBBQlNfSAogCi0KLSNpZiBkZWZpbmVkKF9fbWlwc19fKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCisjaWYgZGVmaW5lZChfX21pcHNfXykKICNpbmNsdWRlICJtaXBzL2Fic19taXBzLmgiCiAKLSNlbGlmIGRlZmluZWQoX194ODZfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLworI2VsaWYgZGVmaW5lZChfX3g4Nl9fKQogI2luY2x1ZGUgIng4Ni9hYnNfeDg2LmgiCiAKICNlbmRpZiAvKiBhbGwgY29yZXMgKi8KQEAgLTEwNywxNSArMTE4LDE5IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeGFic19EKQotaW5saW5lIEZJWFBfREJMIGZpeGFic19EKEZJWFBfREJMIHgpIHsgcmV0dXJuICgoeCkgPiAoRklYUF9EQkwpKDApKSA/ICh4KSA6IC0oeCkgOyB9CitpbmxpbmUgRklYUF9EQkwgZml4YWJzX0QoRklYUF9EQkwgeCkgeworICByZXR1cm4gKCh4KSA+IChGSVhQX0RCTCkoMCkpID8gKHgpIDogLSh4KTsKK30KICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4YWJzX0kpCi1pbmxpbmUgSU5UIGZpeGFic19JKElOVCB4KSAgICAgICAgICAgeyByZXR1cm4gKCh4KSA+IChJTlQpKDApKSAgICAgID8gKHgpIDogLSh4KSA7IH0KK2lubGluZSBJTlQgZml4YWJzX0koSU5UIHgpIHsgcmV0dXJuICgoeCkgPiAoSU5UKSgwKSkgPyAoeCkgOiAtKHgpOyB9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeGFic19TKQotaW5saW5lIEZJWFBfU0dMIGZpeGFic19TKEZJWFBfU0dMIHgpIHsgcmV0dXJuICgoeCkgPiAoRklYUF9TR0wpKDApKSA/ICh4KSA6IC0oeCkgOyB9CitpbmxpbmUgRklYUF9TR0wgZml4YWJzX1MoRklYUF9TR0wgeCkgeworICByZXR1cm4gKCh4KSA+IChGSVhQX1NHTCkoMCkpID8gKHgpIDogLSh4KTsKK30KICNlbmRpZgogCi0jZW5kaWYgLyogX19BQlNfSF9fICovCisjZW5kaWYgLyogQUJTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL2FybS9jbHpfYXJtLmggYi9saWJGREsvaW5jbHVkZS9hcm0vY2x6X2FybS5oCmluZGV4IGY0M2E3YjEuLjFjM2UxZmIgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL2FybS9jbHpfYXJtLmgKKysrIGIvbGliRkRLL2luY2x1ZGUvYXJtL2Nsel9hcm0uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw0NCArOTAsNzUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKKwogICAgRGVzY3JpcHRpb246IGZpeGVkIHBvaW50IGludHJpbnNpY3MKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKENMWl9BUk1fSCkKKyNkZWZpbmUgQ0xaX0FSTV9ICiAKICNpZiBkZWZpbmVkKF9fYXJtX18pCiAKLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KLSAgLyogQVJNIGdjYyovCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKy8qIEFSTSBnY2MqLwogCi0gICNkZWZpbmUgRlVOQ1RJT05fZml4bm9ybXpfRAotICAjZGVmaW5lIEZVTkNUSU9OX2ZpeG5vcm1fRAorI2lmIGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzhfXykKKyNkZWZpbmUgRlVOQ1RJT05fZml4bm9ybXpfRAorI2RlZmluZSBGVU5DVElPTl9maXhub3JtX0QKKyNkZWZpbmUgRlVOQ1RJT05fZml4bm9ybXpfUworI2RlZmluZSBGVU5DVElPTl9maXhub3JtX1MKIAotICBpbmxpbmUgSU5UIGZpeG5vcm16X0QoTE9ORyB2YWx1ZSkKLSAgewotICAgIElOVCByZXN1bHQ7Ci0gICAgYXNtKCJjbHogJTAsICUxICI6ICI9ciIocmVzdWx0KSA6ICJyIih2YWx1ZSkgKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9CisjaWZkZWYgRlVOQ1RJT05fZml4bm9ybXpfRAoraW5saW5lIElOVCBmaXhub3Jtel9EKExPTkcgdmFsdWUpIHsKKyAgSU5UIHJlc3VsdDsKKyNpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfOF9fKQorICBhc20oImNseiAldzAsICV3MSAiIDogIj1yIihyZXN1bHQpIDogInIiKHZhbHVlKSk7CisjZWxzZQorICBhc20oImNseiAlMCwgJTEgIiA6ICI9ciIocmVzdWx0KSA6ICJyIih2YWx1ZSkpOworI2VuZGlmCisgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLyogI2lmZGVmIEZVTkNUSU9OX2ZpeG5vcm16X0QgKi8KIAotICBpbmxpbmUgSU5UIGZpeG5vcm1fRChMT05HIHZhbHVlKQotICB7Ci0gICAgSU5UIHJlc3VsdDsKLSAgICBpZiAodmFsdWUgPT0gMCkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICh2YWx1ZSA8IDApIHsKLSAgICAgIHZhbHVlID0gfnZhbHVlOwotICAgIH0KLSAgICByZXN1bHQgPSAgZml4bm9ybXpfRCh2YWx1ZSk7Ci0gICAgcmV0dXJuIHJlc3VsdCAtIDE7Ci0gIH0KKyNpZmRlZiBGVU5DVElPTl9maXhub3JtX0QKK2lubGluZSBJTlQgZml4bm9ybV9EKExPTkcgdmFsdWUpIHsKKyAgaWYgKCF2YWx1ZSkgcmV0dXJuIDA7CisgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gfnZhbHVlOworICByZXR1cm4gZml4bm9ybXpfRCh2YWx1ZSkgLSAxOworfQorI2VuZGlmIC8qICNpZmRlZiBGVU5DVElPTl9maXhub3JtX0QgKi8KKworI2lmZGVmIEZVTkNUSU9OX2ZpeG5vcm16X1MKK2lubGluZSBJTlQgZml4bm9ybXpfUyhTSE9SVCB2YWx1ZSkgeworICBJTlQgcmVzdWx0OworICByZXN1bHQgPSAoTE9ORykodmFsdWUgPDwgMTYpOworICBpZiAocmVzdWx0ID09IDApCisgICAgcmVzdWx0ID0gMTY7CisgIGVsc2UKKyAgICByZXN1bHQgPSBmaXhub3Jtel9EKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLyogI2lmZGVmIEZVTkNUSU9OX2ZpeG5vcm16X1MgKi8KKworI2lmZGVmIEZVTkNUSU9OX2ZpeG5vcm1fUworaW5saW5lIElOVCBmaXhub3JtX1MoU0hPUlQgdmFsdWUpIHsKKyAgTE9ORyBsdmFsdWUgPSAoTE9ORykodmFsdWUgPDwgMTYpOworICBpZiAoIWx2YWx1ZSkgcmV0dXJuIDA7CisgIGlmIChsdmFsdWUgPCAwKSBsdmFsdWUgPSB+bHZhbHVlOworICByZXR1cm4gZml4bm9ybXpfRChsdmFsdWUpIC0gMTsKK30KKyNlbmRpZiAvKiAjaWZkZWYgRlVOQ1RJT05fZml4bm9ybV9TICovCisKKyNlbmRpZgogCiAjZW5kaWYgLyogYXJtIHRvb2xjaGFpbiAqLwogCiAjZW5kaWYgLyogX19hcm1fXyAqLwogCisjZW5kaWYgLyogIWRlZmluZWQoQ0xaX0FSTV9IKSAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvYXJtL2NwbHhfbXVsLmggYi9saWJGREsvaW5jbHVkZS9hcm0vY3BseF9tdWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0ODAzMS4uMDAwMDAwMAotLS0gYS9saWJGREsvaW5jbHVkZS9hcm0vY3BseF9tdWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIEF1dGhvcihzKToKLSAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBpbnRyaW5zaWNzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIGRlZmluZWQoX19hcm1fXykgJiYgZGVmaW5lZChfX0dOVUNfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwotCi0jaWYgZGVmaW5lZChfX0FSTV9BUkNIXzVURV9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKQotICAjZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngxNgotICAjZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngxNlgyCi0gIC8vI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdF8zMngxNgotICAvLyNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHRfMzJ4MTZYMgotI2VuZGlmCi0KLSNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDMyWDIKLS8vI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdF8zMngzMlgyCi0KLSNpZmRlZiBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTYKLWlubGluZSB2b2lkIGNwbHhNdWx0RGl2MiggRklYUF9EQkwgKmNfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjX0ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhX0ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NQSyB3cGsgKQotewotICAgTE9ORyB0bXAxLHRtcDI7Ci0gICBjb25zdCBMT05HIHcgPSB3cGsudzsKLQotICAgYXNtKCJzbXVsd3QgJTAsICUzLCAlNDtcbiIKLSAgICAgICAicnNiICUxLCUwLCMwO1xuIgotICAgICAgICJzbWxhd2IgJTAsICUyLCAlNCwgJTE7XG4iCi0gICAgICAgInNtdWx3dCAlMSwgJTIsICU0O1xuIgotICAgICAgICJzbWxhd2IgJTEsICUzLCAlNCwgJTE7XG4iCi0gICAgICAgOiAiPSZyIih0bXAxKSwgIj0mciIodG1wMikKLSAgICAgICA6ICJyIihhX1JlKSwgInIiKGFfSW0pLCAiciIodykKLSAgICAgICApOwotCi0gICAgKmNfUmUgPSB0bXAxOwotICAgICpjX0ltID0gdG1wMjsKLX0KLSNlbmRpZiAvKiBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTYgKi8KLQotI2lmZGVmIEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngxNlgyCi1pbmxpbmUgdm9pZCBjcGx4TXVsdERpdjIoIEZJWFBfREJMICpjX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgYl9SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgYl9JbSkKLXsKLSAgICBMT05HIHRtcDEsIHRtcDI7Ci0KLSAgICBhc20oInNtdWx3YiAlMCwgJTMsICU1O1xuIiAgICAgLyogJTcgICA9IC1hX0ltICogYl9JbSAqLwotICAgICAgICAicnNiICUxLCUwLCMwO1xuIgotICAgICAgICAic21sYXdiICUwLCAlMiwgJTQsICUxO1xuIiAvKiB0bXAxID0gIGFfUmUgKiBiX1JlIC0gYV9JbSAqIGJfSW0gKi8KLSAgICAgICAgInNtdWx3YiAlMSwgJTIsICU1O1xuIiAgICAgLyogJTcgICA9ICBhX1JlICogYl9JbSAqLwotICAgICAgICAic21sYXdiICUxLCAlMywgJTQsICUxO1xuIiAvKiB0bXAyID0gIGFfSW0gKiBiX1JlICsgYV9SZSAqIGJfSW0gKi8KLSAgICAgICAgOiAiPSZyIih0bXAxKSwgIj0mciIodG1wMikKLSAgICAgICAgOiAiciIoYV9SZSksICJyIihhX0ltKSwgInIiKGJfUmUpLCAiciIoYl9JbSkKLSAgICAgICAgKTsKLQotICAgICAqY19SZSA9IHRtcDE7Ci0gICAgICpjX0ltID0gdG1wMjsKLX0KLSNlbmRpZiAvKiBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTZYMiAqLwotCi0jaWZkZWYgRlVOQ1RJT05fY3BseE11bHRBZGREaXYyXzMyeDE2WDIKLWlubGluZSB2b2lkIGNwbHhNdWx0QWRkRGl2MiggRklYUF9EQkwgKmNfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjX0ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYV9SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfSW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGJfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGJfSW0pCi17Ci0gICAgTE9ORyB0bXAxLCB0bXAyOwotCi0gICAgYXNtKCJzbXVsd2IgJTAsICUzLCAlNTtcbiIKLSAgICAgICAgInJzYiAlMSwlMCwjMDtcbiIKLSAgICAgICAgInNtbGF3YiAlMCwgJTIsICU0LCAlMTtcbiIKLSAgICAgICAgInNtdWx3YiAlMSwgJTIsICU1O1xuIgotICAgICAgICAic21sYXdiICUxLCAlMywgJTQsICUxO1xuIgotICAgICAgICA6ICI9JnIiKHRtcDEpLCAiPSZyIih0bXAyKQotICAgICAgICA6ICJyIihhX1JlKSwgInIiKGFfSW0pLCAiciIoYl9SZSksICJyIihiX0ltKQotICAgICAgICApOwotCi0gICAgICpjX1JlICs9IHRtcDE7Ci0gICAgICpjX0ltICs9IHRtcDI7Ci19Ci0jZW5kaWYgLyogRlVOQ1RJT05fY3BseE11bHRBZGREaXYyXzMyeDE2WDIgKi8KLQotCi0jaWZkZWYgRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDMyWDIKLWlubGluZSB2b2lkIGNwbHhNdWx0RGl2MiggRklYUF9EQkwgKmNfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjX0ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhX0ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBiX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBiX0ltKQotewotICAgIExPTkcgdG1wMSwgdG1wMjsKLQotI2lmZGVmIF9fQVJNX0FSQ0hfNl9fCi0gICAgYXNtKAotICAgICAgICJzbW11bCAlMCwgJTIsICU0O1xuIiAgICAgLyogdG1wMSAgPSBhX1JlICogYl9SZSAqLwotICAgICAgICJzbW1scyAlMCwgJTMsICU1LCAlMDtcbiIgLyogdG1wMSAtPSBhX0ltICogYl9JbSAqLwotICAgICAgICJzbW11bCAlMSwgJTIsICU1O1xuIiAgICAgLyogdG1wMiAgPSBhX1JlICogYl9JbSAqLwotICAgICAgICJzbW1sYSAlMSwgJTMsICU0LCAlMTtcbiIgLyogdG1wMiArPSBhX0ltICogYl9SZSAqLwotICAgICAgIDogIj0mciIodG1wMSksICI9JnIiKHRtcDIpCi0gICAgICAgOiAiciIoYV9SZSksICJyIihhX0ltKSwgInIiKGJfUmUpLCAiciIoYl9JbSkKLSAgICAgICA6ICJyMCIKLSAgICAgICApOwotI2Vsc2UKLSAgICBMT05HIGRpc2NhcmQ7Ci0gICAgYXNtKAotICAgICAgICJzbXVsbCAlMiwgJTAsICU3LCAlNjtcbiIgLyogdG1wMSAgPSAtYV9JbSAqIGJfSW0gKi8KLSAgICAgICAic21sYWwgJTIsICUwLCAlMywgJTU7XG4iIC8qIHRtcDEgKz0gIGFfUmUgKiBiX1JlICovCi0gICAgICAgInNtdWxsICUyLCAlMSwgJTMsICU2O1xuIiAvKiB0bXAyICA9ICBhX1JlICogYl9JbSAqLwotICAgICAgICJzbWxhbCAlMiwgJTEsICU0LCAlNTtcbiIgLyogdG1wMiArPSAgYV9JbSAqIGJfUmUgKi8KLSAgICAgICA6ICI9JnIiKHRtcDEpLCAiPSZyIih0bXAyKSwgIj0mciIoZGlzY2FyZCkKLSAgICAgICA6ICJyIihhX1JlKSwgInIiKGFfSW0pLCAiciIoYl9SZSksICJyIihiX0ltKSwgInIiKC1hX0ltKQotICAgICAgICk7Ci0gI2VuZGlmCi0gICAgKmNfUmUgPSB0bXAxOwotICAgICpjX0ltID0gdG1wMjsKLX0KLSNlbmRpZiAvKiBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MzJYMiAqLwotCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9hcm0vY3BseF9tdWxfYXJtLmggYi9saWJGREsvaW5jbHVkZS9hcm0vY3BseF9tdWxfYXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0OGUzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYkZESy9pbmNsdWRlL2FybS9jcGx4X211bF9hcm0uaApAQCAtMCwwICsxLDIwMSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBpbnRyaW5zaWNzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChDUExYX01VTF9BUk1fSCkKKyNkZWZpbmUgQ1BMWF9NVUxfQVJNX0gKKworI2lmIGRlZmluZWQoX19hcm1fXykgJiYgZGVmaW5lZChfX0dOVUNfXykKKworI2lmIGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZfXykgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF84X18pCisjZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngxNgorI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTZYMgorI2VuZGlmCisKKyNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDMyWDIKKyNpZmRlZiBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MzJYMgoraW5saW5lIHZvaWQgY3BseE11bHREaXYyKEZJWFBfREJMICpjX1JlLCBGSVhQX0RCTCAqY19JbSwgY29uc3QgRklYUF9EQkwgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhX0ltLCBjb25zdCBGSVhQX0RCTCBiX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGJfSW0pIHsKKyAgTE9ORyB0bXAxLCB0bXAyOworCisjaWZkZWYgX19BUk1fQVJDSF84X18KKyAgYXNtKCJzbXVsbCAgJXgwLCAldzIsICV3NDsgICAgICAgXG4iIC8qIHRtcDEgID0gYV9SZSAqIGJfUmUgKi8KKyAgICAgICJzbXVsbCAgJXgxLCAldzIsICV3NTsgICAgICAgXG4iIC8qIHRtcDIgID0gYV9SZSAqIGJfSW0gKi8KKyAgICAgICJzbXN1YmwgJXgwLCAldzMsICV3NSwgJXgwOyAgXG4iIC8qIHRtcDEgLT0gYV9JbSAqIGJfSW0gKi8KKyAgICAgICJzbWFkZGwgJXgxLCAldzMsICV3NCwgJXgxOyAgXG4iIC8qIHRtcDIgKz0gYV9JbSAqIGJfUmUgKi8KKyAgICAgICJhc3IgICAgJXgwLCAleDAsICAjMzIgICAgICAgXG4iCisgICAgICAiYXNyICAgICV4MSwgJXgxLCAgIzMyICAgICAgIFxuIgorICAgICAgOiAiPSZyIih0bXAxKSwgIj0mciIodG1wMikKKyAgICAgIDogInIiKGFfUmUpLCAiciIoYV9JbSksICJyIihiX1JlKSwgInIiKGJfSW0pKTsKKyNlbGlmIGRlZmluZWQoX19BUk1fQVJDSF82X18pCisgIGFzbSgic21tdWwgJTAsICUyLCAlNDtcbiIgICAgIC8qIHRtcDEgID0gYV9SZSAqIGJfUmUgKi8KKyAgICAgICJzbW1scyAlMCwgJTMsICU1LCAlMDtcbiIgLyogdG1wMSAtPSBhX0ltICogYl9JbSAqLworICAgICAgInNtbXVsICUxLCAlMiwgJTU7XG4iICAgICAvKiB0bXAyICA9IGFfUmUgKiBiX0ltICovCisgICAgICAic21tbGEgJTEsICUzLCAlNCwgJTE7XG4iIC8qIHRtcDIgKz0gYV9JbSAqIGJfUmUgKi8KKyAgICAgIDogIj0mciIodG1wMSksICI9JnIiKHRtcDIpCisgICAgICA6ICJyIihhX1JlKSwgInIiKGFfSW0pLCAiciIoYl9SZSksICJyIihiX0ltKSk7CisjZWxzZQorICBMT05HIGRpc2NhcmQ7CisgIGFzbSgic211bGwgJTIsICUwLCAlNywgJTY7XG4iIC8qIHRtcDEgID0gLWFfSW0gKiBiX0ltICovCisgICAgICAic21sYWwgJTIsICUwLCAlMywgJTU7XG4iIC8qIHRtcDEgKz0gIGFfUmUgKiBiX1JlICovCisgICAgICAic211bGwgJTIsICUxLCAlMywgJTY7XG4iIC8qIHRtcDIgID0gIGFfUmUgKiBiX0ltICovCisgICAgICAic21sYWwgJTIsICUxLCAlNCwgJTU7XG4iIC8qIHRtcDIgKz0gIGFfSW0gKiBiX1JlICovCisgICAgICA6ICI9JnIiKHRtcDEpLCAiPSZyIih0bXAyKSwgIj0mciIoZGlzY2FyZCkKKyAgICAgIDogInIiKGFfUmUpLCAiciIoYV9JbSksICJyIihiX1JlKSwgInIiKGJfSW0pLCAiciIoLWFfSW0pKTsKKyNlbmRpZgorICAqY19SZSA9IHRtcDE7CisgICpjX0ltID0gdG1wMjsKK30KKyNlbmRpZiAvKiBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MzJYMiAqLworCisjaWYgZGVmaW5lZChGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTYpCitpbmxpbmUgdm9pZCBjcGx4TXVsdERpdjIoRklYUF9EQkwgKmNfUmUsIEZJWFBfREJMICpjX0ltLCBjb25zdCBGSVhQX0RCTCBhX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGFfSW0sIEZJWFBfU1BLIHdwaykgeworI2lmZGVmIF9fQVJNX0FSQ0hfOF9fCisgIEZJWFBfREJMIGJfSW0gPSBGWF9TR0wyRlhfREJMKHdway52LmltKTsKKyAgRklYUF9EQkwgYl9SZSA9IEZYX1NHTDJGWF9EQkwod3BrLnYucmUpOworICBjcGx4TXVsdERpdjIoY19SZSwgY19JbSwgYV9SZSwgYV9JbSwgYl9SZSwgYl9JbSk7CisjZWxzZQorICBMT05HIHRtcDEsIHRtcDI7CisgIGNvbnN0IExPTkcgdyA9IHdway53OworICBhc20oInNtdWx3dCAlMCwgJTMsICU0O1xuIgorICAgICAgInJzYiAlMSwlMCwjMDtcbiIKKyAgICAgICJzbWxhd2IgJTAsICUyLCAlNCwgJTE7XG4iCisgICAgICAic211bHd0ICUxLCAlMiwgJTQ7XG4iCisgICAgICAic21sYXdiICUxLCAlMywgJTQsICUxO1xuIgorICAgICAgOiAiPSZyIih0bXAxKSwgIj0mciIodG1wMikKKyAgICAgIDogInIiKGFfUmUpLCAiciIoYV9JbSksICJyIih3KSk7CisgICpjX1JlID0gdG1wMTsKKyAgKmNfSW0gPSB0bXAyOworI2VuZGlmCit9CisjZW5kaWYgLyogRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDE2ICovCisKKyNpZmRlZiBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTZYMgoraW5saW5lIHZvaWQgY3BseE11bHREaXYyKEZJWFBfREJMICpjX1JlLCBGSVhQX0RCTCAqY19JbSwgY29uc3QgRklYUF9EQkwgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhX0ltLCBjb25zdCBGSVhQX1NHTCBiX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGJfSW0pIHsKKyNpZmRlZiBfX0FSTV9BUkNIXzhfXworICBGSVhQX0RCTCBiX3JlID0gRlhfU0dMMkZYX0RCTChiX1JlKTsKKyAgRklYUF9EQkwgYl9pbSA9IEZYX1NHTDJGWF9EQkwoYl9JbSk7CisgIGNwbHhNdWx0RGl2MihjX1JlLCBjX0ltLCBhX1JlLCBhX0ltLCBiX3JlLCBiX2ltKTsKKyNlbHNlCisgIExPTkcgdG1wMSwgdG1wMjsKKworICBhc20oInNtdWx3YiAlMCwgJTMsICU1O1xuIiAvKiAlNyAgID0gLWFfSW0gKiBiX0ltICovCisgICAgICAicnNiICUxLCUwLCMwO1xuIgorICAgICAgInNtbGF3YiAlMCwgJTIsICU0LCAlMTtcbiIgLyogdG1wMSA9ICBhX1JlICogYl9SZSAtIGFfSW0gKiBiX0ltICovCisgICAgICAic211bHdiICUxLCAlMiwgJTU7XG4iICAgICAvKiAlNyAgID0gIGFfUmUgKiBiX0ltICovCisgICAgICAic21sYXdiICUxLCAlMywgJTQsICUxO1xuIiAvKiB0bXAyID0gIGFfSW0gKiBiX1JlICsgYV9SZSAqIGJfSW0gKi8KKyAgICAgIDogIj0mciIodG1wMSksICI9JnIiKHRtcDIpCisgICAgICA6ICJyIihhX1JlKSwgInIiKGFfSW0pLCAiciIoYl9SZSksICJyIihiX0ltKSk7CisKKyAgKmNfUmUgPSB0bXAxOworICAqY19JbSA9IHRtcDI7CisjZW5kaWYKK30KKyNlbmRpZiAvKiBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTZYMiAqLworCisjZW5kaWYKKworI2VuZGlmIC8qICFkZWZpbmVkKENQTFhfTVVMX0FSTV9IKSAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvYXJtL2ZpeG1hZGRfYXJtLmggYi9saWJGREsvaW5jbHVkZS9hcm0vZml4bWFkZF9hcm0uaAppbmRleCAxMTExNDdiLi4xMzc4NjYwIDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9hcm0vZml4bWFkZF9hcm0uaAorKysgYi9saWJGREsvaW5jbHVkZS9hcm0vZml4bWFkZF9hcm0uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw4MiArOTAsMTMxIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CisKICAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBpbnRyaW5zaWNzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChGSVhNQUREX0FSTV9IKQorI2RlZmluZSBGSVhNQUREX0FSTV9ICiAKICNpZiBkZWZpbmVkKF9fYXJtX18pCiAKLSAgLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KLSAgI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX19TWU1CSUFOMzJfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwotICAvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLwotICAgIC8qIEFSTSBHTlUgR0NDICovCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2FybV9fKQorLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqLworLyogQVJNIEdOVSBHQ0MgKi8KIAotICAgICNkZWZpbmUgRlVOQ1RJT05fZml4bWFkZGRpdjJfREQKKyNpZmRlZiBfX0FSTV9BUkNIXzhfXworI2RlZmluZSBGVU5DVElPTl9maXhtYWRkZGl2Ml9ERAorI2lmZGVmIEZVTkNUSU9OX2ZpeG1hZGRkaXYyX0RECitpbmxpbmUgRklYUF9EQkwgZml4bWFkZGRpdjJfREQoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikgeworICBJTlQ2NCByZXN1bHQ7CisgIGFzbSgic211bGwgICV4MCwgICV3MSwgICV3MjsgICAgXG4iCisgICAgICAiYXNyICAgICV4MCwgICV4MCwgICMzMjsgICAgXG4iCisgICAgICAiYWRkICAgICV3MCwgJXczLCAgJXcwOyAgICBcbiIKKyAgICAgIDogIj0mciIocmVzdWx0KQorICAgICAgOiAiciIoYSksICJyIihiKSwgInIiKHgpKTsKKyAgcmV0dXJuIChJTlQpcmVzdWx0OworfQorI2VuZGlmIC8qICNpZmRlZiBGVU5DVElPTl9maXhtYWRkZGl2Ml9ERCAqLwogCi0gICAgI2lmZGVmIF9fQVJNX0FSQ0hfNl9fCi0gICAgICBpbmxpbmUgRklYUF9EQkwgZml4bWFkZGRpdjJfREQgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfREJMIGIpIHsKLSAgICAgICAgSU5UIHJlc3VsdDsKLSAgICAgICAgYXNtICAoInNtbWxhICUwLCAlMSwgJTIsICUzO1xuIgotICAgICAgICAgICAgICA6ICI9ciIgKHJlc3VsdCkKLSAgICAgICAgICAgICAgOiAiciIgKGEpLCAiciIgKGIpLCAiciIoeCkgKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdCA7Ci0gICAgICB9Ci0gICAgICAjZGVmaW5lIEZVTkNUSU9OX2ZpeG1zdWJkaXYyX0RECi0gICAgICBpbmxpbmUgRklYUF9EQkwgZml4bXN1YmRpdjJfREQgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfREJMIGIpIHsKLSAgICAgICAgSU5UIHJlc3VsdDsKLSAgICAgICAgYXNtICAoInNtbWxzICUwLCAlMSwgJTIsICUzO1xuIgotICAgICAgICAgICAgICA6ICI9ciIgKHJlc3VsdCkKLSAgICAgICAgICAgICAgOiAiciIgKGEpLCAiciIgKGIpLCAiciIoeCkgKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdCA7Ci0gICAgICB9Ci0gICAgI2Vsc2UgLyogX19BUk1fQVJDSF82X18gKi8KLSAgICAgIGlubGluZSBGSVhQX0RCTCBmaXhtYWRkZGl2Ml9ERCAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikgewotICAgICAgICBJTlQgZGlzY2FyZCwgcmVzdWx0ID0geDsKLSAgICAgICAgYXNtICAoInNtbGFsICUwLCAlMSwgJTIsICUzO1xuIgotICAgICAgICAgICAgICA6ICI9ciIgKGRpc2NhcmQpLCAiK3IiIChyZXN1bHQpCi0gICAgICAgICAgICAgIDogInIiIChhKSwgInIiIChiKSApOwotICAgICAgICByZXR1cm4gcmVzdWx0IDsKLSAgICAgIH0KLSAgICAjZW5kaWYgLyogX19BUk1fQVJDSF82X18gKi8KKyNkZWZpbmUgRlVOQ1RJT05fZml4bXN1YmRpdjJfREQKKyNpZmRlZiBGVU5DVElPTl9maXhtc3ViZGl2Ml9ERAoraW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyX0REKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfREJMIGIpIHsKKyAgSU5UNjQgcmVzdWx0OworICBhc20oInNtdWxsICAleDAsICAldzEsICV3MjsgICAgIFxuIgorICAgICAgImFzciAgICAleDAsICAleDAsICAjMzI7ICAgICBcbiIKKyAgICAgICJzdWIgICAgJXcwLCAldzMsICV3MDsgICAgIFxuIgorICAgICAgOiAiPSZyIihyZXN1bHQpCisgICAgICA6ICJyIihhKSwgInIiKGIpLCAiciIoeCkpOworICByZXR1cm4gKElOVClyZXN1bHQ7Cit9CisjZW5kaWYgLyogI2lmZGVmIEZVTkNUSU9OX2ZpeG1zdWJkaXYyX0REICovCiAKLSAgICAjaWYgZGVmaW5lZChfX0FSTV9BUkNIXzVURV9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKQorI2VsaWYgZGVmaW5lZChfX0FSTV9BUkNIXzZfXykKKyNkZWZpbmUgRlVOQ1RJT05fZml4bWFkZGRpdjJfREQKKyNpZmRlZiBGVU5DVElPTl9maXhtYWRkZGl2Ml9ERAoraW5saW5lIEZJWFBfREJMIGZpeG1hZGRkaXYyX0REKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfREJMIGIpIHsKKyAgSU5UIHJlc3VsdDsKKyAgYXNtKCJzbW1sYSAlMCwgJTEsICUyLCAlMztcbiIgOiAiPXIiKHJlc3VsdCkgOiAiciIoYSksICJyIihiKSwgInIiKHgpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvKiAjaWZkZWYgRlVOQ1RJT05fZml4bWFkZGRpdjJfREQgKi8KIAotICAgICAgI2RlZmluZSBGVU5DVElPTl9maXhtYWRkZGl2Ml9EUworI2RlZmluZSBGVU5DVElPTl9maXhtc3ViZGl2Ml9ERAorI2lmZGVmIEZVTkNUSU9OX2ZpeG1zdWJkaXYyX0RECitpbmxpbmUgRklYUF9EQkwgZml4bXN1YmRpdjJfREQoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikgeworICBJTlQgcmVzdWx0OworICBhc20oInNtbWxzICUwLCAlMSwgJTIsICUzO1xuIiA6ICI9ciIocmVzdWx0KSA6ICJyIihhKSwgInIiKGIpLCAiciIoeCkpOworICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8qICNpZmRlZiBGVU5DVElPTl9maXhtc3ViZGl2Ml9ERCAqLwogCi0gICAgICBpbmxpbmUgRklYUF9EQkwgZml4bWFkZGRpdjJfRFMgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfU0dMIGIpIHsKLSAgICAgICAgSU5UIHJlc3VsdDsKLSAgICAgICAgYXNtKCJzbWxhd2IgJTAsICUxLCAlMiwgJTMgIgotICAgICAgICAgICAgICA6ICI9ciIgKHJlc3VsdCkKLSAgICAgICAgICAgICAgOiAiciIgKGEpLCAiciIgKGIpLCAiciIgKHgpICk7Ci0gICAgICAgIHJldHVybiByZXN1bHQgOwotICAgICAgfQorI2Vsc2UKKyNkZWZpbmUgRlVOQ1RJT05fZml4bWFkZGRpdjJfREQKKyNpZmRlZiBGVU5DVElPTl9maXhtYWRkZGl2Ml9ERAoraW5saW5lIEZJWFBfREJMIGZpeG1hZGRkaXYyX0REKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfREJMIGIpIHsKKyAgSU5UIGRpc2NhcmQgPSAwOworICBJTlQgcmVzdWx0ID0geDsKKyAgYXNtKCJzbWxhbCAlMCwgJTEsICUyLCAlMztcbiIgOiAiK3IiKGRpc2NhcmQpLCAiK3IiKHJlc3VsdCkgOiAiciIoYSksICJyIihiKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLyogI2lmZGVmIEZVTkNUSU9OX2ZpeG1hZGRkaXYyX0REICovCisjZW5kaWYKIAotICAgICNlbmRpZiAvKiBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF82X18pICovCisjaWYgZGVmaW5lZChfX0FSTV9BUkNIXzVURV9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKQogCi0gICAgI2RlZmluZSBGVU5DVElPTl9maXhtYWRkZGl2MkJpdEV4YWN0X0RECi0gICAgI2RlZmluZSBmaXhtYWRkZGl2MkJpdEV4YWN0X0REKGEsIGIsIGMpIGZpeG1hZGRkaXYyX0REKGEsIGIsIGMpCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG1hZGRkaXYyX0RTCisjaWZkZWYgRlVOQ1RJT05fZml4bWFkZGRpdjJfRFMKK2lubGluZSBGSVhQX0RCTCBmaXhtYWRkZGl2Ml9EUyhGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX1NHTCBiKSB7CisgIElOVCByZXN1bHQ7CisgIGFzbSgic21sYXdiICUwLCAlMSwgJTIsICUzICIgOiAiPXIiKHJlc3VsdCkgOiAiciIoYSksICJyIihiKSwgInIiKHgpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvKiAjaWZkZWYgRlVOQ1RJT05fZml4bWFkZGRpdjJfRFMgKi8KIAotICAgICNkZWZpbmUgRlVOQ1RJT05fZml4bXN1YmRpdjJCaXRFeGFjdF9ERAotICAgIGlubGluZSBGSVhQX0RCTCBmaXhtc3ViZGl2MkJpdEV4YWN0X0REIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7Ci0gICAgICByZXR1cm4geCAtIGZpeG11bGRpdjJCaXRFeGFjdF9ERChhLCBiKTsKLSAgICB9CisjZW5kaWYgLyogZGVmaW5lZChfX0FSTV9BUkNIXzVURV9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKSAqLwogCi0gICAgI2RlZmluZSBGVU5DVElPTl9maXhtYWRkZGl2MkJpdEV4YWN0X0RTCi0gICAgI2RlZmluZSBmaXhtYWRkZGl2MkJpdEV4YWN0X0RTKGEsIGIsIGMpIGZpeG1hZGRkaXYyX0RTKGEsIGIsIGMpCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG1hZGRkaXYyQml0RXhhY3RfREQKKyNpZmRlZiBGVU5DVElPTl9maXhtYWRkZGl2MkJpdEV4YWN0X0RECisjZGVmaW5lIGZpeG1hZGRkaXYyQml0RXhhY3RfREQoYSwgYiwgYykgZml4bWFkZGRpdjJfREQoYSwgYiwgYykKKyNlbmRpZiAvKiAjaWZkZWYgRlVOQ1RJT05fZml4bWFkZGRpdjJCaXRFeGFjdF9ERCAqLwogCi0gICAgI2RlZmluZSBGVU5DVElPTl9maXhtc3ViZGl2MkJpdEV4YWN0X0RTCi0gICAgaW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyQml0RXhhY3RfRFMgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfU0dMIGIpIHsKLSAgICAgIHJldHVybiB4IC0gZml4bXVsZGl2MkJpdEV4YWN0X0RTKGEsIGIpOwotICAgIH0KLSAgLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KLSAgI2VuZGlmIC8qIHRvb2xjaGFpbiAqLwotICAvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLworI2RlZmluZSBGVU5DVElPTl9maXhtc3ViZGl2MkJpdEV4YWN0X0RECisjaWZkZWYgRlVOQ1RJT05fZml4bXN1YmRpdjJCaXRFeGFjdF9ERAoraW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyQml0RXhhY3RfREQoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGIpIHsKKyAgcmV0dXJuIHggLSBmaXhtdWxkaXYyQml0RXhhY3RfREQoYSwgYik7Cit9CisjZW5kaWYgLyogI2lmZGVmIEZVTkNUSU9OX2ZpeG1zdWJkaXYyQml0RXhhY3RfREQgKi8KKworI2RlZmluZSBGVU5DVElPTl9maXhtYWRkZGl2MkJpdEV4YWN0X0RTCisjaWZkZWYgRlVOQ1RJT05fZml4bWFkZGRpdjJCaXRFeGFjdF9EUworI2RlZmluZSBmaXhtYWRkZGl2MkJpdEV4YWN0X0RTKGEsIGIsIGMpIGZpeG1hZGRkaXYyX0RTKGEsIGIsIGMpCisjZW5kaWYgLyogI2lmZGVmIEZVTkNUSU9OX2ZpeG1hZGRkaXYyQml0RXhhY3RfRFMgKi8KKworI2RlZmluZSBGVU5DVElPTl9maXhtc3ViZGl2MkJpdEV4YWN0X0RTCisjaWZkZWYgRlVOQ1RJT05fZml4bXN1YmRpdjJCaXRFeGFjdF9EUworaW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyQml0RXhhY3RfRFMoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGIpIHsKKyAgcmV0dXJuIHggLSBmaXhtdWxkaXYyQml0RXhhY3RfRFMoYSwgYik7Cit9CisjZW5kaWYgLyogI2lmZGVmIEZVTkNUSU9OX2ZpeG1zdWJkaXYyQml0RXhhY3RfRFMgKi8KKworLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqLworI2VuZGlmIC8qIHRvb2xjaGFpbiAqLworICAvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgKi8KIAogI2VuZGlmIC8qIF9fYXJtX18gKi8KIAorI2VuZGlmIC8qICFkZWZpbmVkKEZJWE1BRERfQVJNX0gpICovCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9hcm0vZml4bXVsX2FybS5oIGIvbGliRkRLL2luY2x1ZGUvYXJtL2ZpeG11bF9hcm0uaAppbmRleCAyZjA0NzA1Li4wNzdlNWM2IDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9hcm0vZml4bXVsX2FybS5oCisrKyBiL2xpYkZESy9pbmNsdWRlL2FybS9maXhtdWxfYXJtLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNjQgKzkwLDEwOSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOgorCiAgICBEZXNjcmlwdGlvbjogZml4ZWQgcG9pbnQgaW50cmluc2ljcwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIWRlZmluZWQoRklYTVVMX0FSTV9IKQorI2RlZmluZSBGSVhNVUxfQVJNX0gKIAogI2lmIGRlZmluZWQoX19hcm1fXykKIAotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcm1fXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcm1fXykKIC8qIEFSTSB3aXRoIEdOVSBjb21waWxlciAqLwogCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJfREQKIAogI2RlZmluZSBGVU5DVElPTl9maXhtdWxkaXYyQml0RXhhY3RfREQKLSNkZWZpbmUgZml4bXVsZGl2MkJpdEV4YWN0X0REKGEsYikgZml4bXVsZGl2Ml9ERChhLGIpCisjaWZkZWYgRlVOQ1RJT05fZml4bXVsZGl2MkJpdEV4YWN0X0RECisjZGVmaW5lIGZpeG11bGRpdjJCaXRFeGFjdF9ERChhLCBiKSBmaXhtdWxkaXYyX0REKGEsIGIpCisjZW5kaWYgLyogI2lmZGVmIEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9ERCAqLworCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bEJpdEV4YWN0X0RECi0jZGVmaW5lIGZpeG11bEJpdEV4YWN0X0REKGEsYikgZml4bXVsX0REKGEsYikKKyNpZmRlZiBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9ERAorI2RlZmluZSBmaXhtdWxCaXRFeGFjdF9ERChhLCBiKSAoZml4bXVsZGl2MkJpdEV4YWN0X0REKGEsIGIpIDw8IDEpCisjZW5kaWYgLyogI2lmZGVmIEZVTkNUSU9OX2ZpeG11bEJpdEV4YWN0X0REICovCiAKICNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2MkJpdEV4YWN0X0RTCi0jZGVmaW5lIGZpeG11bGRpdjJCaXRFeGFjdF9EUyhhLGIpIGZpeG11bGRpdjJfRFMoYSxiKQorI2lmZGVmIEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9EUworI2RlZmluZSBmaXhtdWxkaXYyQml0RXhhY3RfRFMoYSwgYikgZml4bXVsZGl2Ml9EUyhhLCBiKQorI2VuZGlmIC8qICNpZmRlZiBGVU5DVElPTl9maXhtdWxkaXYyQml0RXhhY3RfRFMgKi8KIAogI2RlZmluZSBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9EUwotI2RlZmluZSBmaXhtdWxCaXRFeGFjdF9EUyhhLGIpIGZpeG11bF9EUyhhLGIpCisjaWZkZWYgRlVOQ1RJT05fZml4bXVsQml0RXhhY3RfRFMKKyNkZWZpbmUgZml4bXVsQml0RXhhY3RfRFMoYSwgYikgZml4bXVsX0RTKGEsIGIpCisjZW5kaWYgLyogI2lmZGVmIEZVTkNUSU9OX2ZpeG11bEJpdEV4YWN0X0RTICovCiAKLSNpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKSB8fCBkZWZpbmVkKF9fVEFSR0VUX0FSQ0hfN0VfTSkKLWlubGluZSBJTlQgZml4bXVsZGl2Ml9ERCAoY29uc3QgSU5UIGEsIGNvbnN0IElOVCBiKQotewotICBJTlQgcmVzdWx0IDsKLSAgX19hc21fXyAoInNtbXVsICUwLCAlMSwgJTIiIDogIj1yIiAocmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiciIgKGEpLCAiciIgKGIpKSA7Ci0gIHJldHVybiByZXN1bHQgOworI2lmZGVmIEZVTkNUSU9OX2ZpeG11bGRpdjJfREQKK2lubGluZSBJTlQgZml4bXVsZGl2Ml9ERChjb25zdCBJTlQgYSwgY29uc3QgSU5UIGIpIHsKKyAgSU5UIHJlc3VsdDsKKyNpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfOF9fKQorICBJTlQ2NCByZXN1bHQ2NDsKKyAgX19hc21fXygKKyAgICAgICJzbXVsbCAleDAsICV3MSwgJXcyO1xuIgorICAgICAgImFzciAleDAsICV4MCwgIzMyOyAgICAgIgorICAgICAgOiAiPXIiKHJlc3VsdDY0KQorICAgICAgOiAiciIoYSksICJyIihiKSk7CisgIHJlc3VsdCA9IChJTlQpcmVzdWx0NjQ7CisjZWxpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKSB8fCBkZWZpbmVkKF9fVEFSR0VUX0FSQ0hfN0VfTSkKKyAgX19hc21fXygic21tdWwgJTAsICUxLCAlMiIgOiAiPXIiKHJlc3VsdCkgOiAiciIoYSksICJyIihiKSk7CisjZWxzZQorICBJTlQgZGlzY2FyZDsKKyAgX19hc21fXygic211bGwgJTAsICUxLCAlMiwgJTMiCisgICAgICAgICAgOiAiPSZyIihkaXNjYXJkKSwgIj1yIihyZXN1bHQpCisgICAgICAgICAgOiAiciIoYSksICJyIihiKSk7CisjZW5kaWYKKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZiAvKiAjaWZkZWYgRlVOQ1RJT05fZml4bXVsZGl2Ml9ERCAqLworCisjaWYgZGVmaW5lZChfX0FSTV9BUkNIXzhfXykKKyNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2Ml9TRAorI2lmZGVmIEZVTkNUSU9OX2ZpeG11bGRpdjJfU0QKK2lubGluZSBJTlQgZml4bXVsZGl2Ml9TRChjb25zdCBTSE9SVCBhLCBjb25zdCBJTlQgYikgeworICByZXR1cm4gZml4bXVsZGl2Ml9ERCgoSU5UKShhIDw8IDE2KSwgYik7Cit9CisjZW5kaWYgLyogI2lmZGVmIEZVTkNUSU9OX2ZpeG11bGRpdjJfU0QgKi8KKyNlbGlmIGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZfXykKKyNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2Ml9TRAorI2lmZGVmIEZVTkNUSU9OX2ZpeG11bGRpdjJfU0QKK2lubGluZSBJTlQgZml4bXVsZGl2Ml9TRChjb25zdCBTSE9SVCBhLCBjb25zdCBJTlQgYikgeworICBJTlQgcmVzdWx0OworICBfX2FzbV9fKCJzbXVsd2IgJTAsICUxLCAlMiIgOiAiPXIiKHJlc3VsdCkgOiAiciIoYiksICJyIihhKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLyogI2lmZGVmIEZVTkNUSU9OX2ZpeG11bGRpdjJfU0QgKi8KKyNlbmRpZgorCisjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bF9ERAorI2lmZGVmIEZVTkNUSU9OX2ZpeG11bF9ERAorI2lmIGRlZmluZWQoX19BUk1fQVJDSF84X18pCitpbmxpbmUgSU5UIGZpeG11bF9ERChjb25zdCBJTlQgYSwgY29uc3QgSU5UIGIpIHsKKyAgSU5UNjQgcmVzdWx0NjQ7CisKKyAgX19hc21fXygKKyAgICAgICJzbXVsbCAleDAsICV3MSwgJXcyO1xuIgorICAgICAgImFzciAleDAsICV4MCwgIzMxOyAgICAgIgorICAgICAgOiAiPXIiKHJlc3VsdDY0KQorICAgICAgOiAiciIoYSksICJyIihiKSk7CisgIHJldHVybiAoSU5UKXJlc3VsdDY0OwogfQogI2Vsc2UKLWlubGluZSBJTlQgZml4bXVsZGl2Ml9ERCAoY29uc3QgSU5UIGEsIGNvbnN0IElOVCBiKQotewotICBJTlQgZGlzY2FyZCwgcmVzdWx0IDsKLSAgX19hc21fXyAoInNtdWxsICUwLCAlMSwgJTIsICUzIiA6ICI9JnIiIChkaXNjYXJkKSwgIj1yIiAocmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiIChhKSwgInIiIChiKSkgOwotICByZXR1cm4gcmVzdWx0IDsKK2lubGluZSBJTlQgZml4bXVsX0REKGNvbnN0IElOVCBhLCBjb25zdCBJTlQgYikgeworICByZXR1cm4gKGZpeG11bGRpdjJfREQoYSwgYikgPDwgMSk7CiB9Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZfXykKLSNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2Ml9TRAotaW5saW5lIElOVCBmaXhtdWxkaXYyX1NEIChjb25zdCBTSE9SVCBhLCBjb25zdCBJTlQgYikKLXsKLSAgSU5UIHJlc3VsdCA7Ci0gIF9fYXNtX18gKCJzbXVsd2IgJTAsICUxLCAlMiIKLSAgICA6ICI9ciIgKHJlc3VsdCkKLSAgICA6ICJyIiAoYiksICJyIiAoYSkpIDsKLSAgcmV0dXJuIHJlc3VsdCA7Ci19Ci0jZW5kaWYKKyNlbmRpZiAvKiBfX0FSTV9BUkNIXzhfXyAqLworI2VuZGlmIC8qICNpZmRlZiBGVU5DVElPTl9maXhtdWxfREQgKi8KIAogI2VuZGlmIC8qIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcm1fXykgKi8KIAogI2VuZGlmIC8qIF9fYXJtX18gKi8KIAorI2VuZGlmIC8qICFkZWZpbmVkKEZJWE1VTF9BUk1fSCkgKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL2FybS9zY2FsZS5oIGIvbGliRkRLL2luY2x1ZGUvYXJtL3NjYWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYjgxZGMuLjAwMDAwMDAKLS0tIGEvbGliRkRLL2luY2x1ZGUvYXJtL3NjYWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6Ci0gICBEZXNjcmlwdGlvbjogQVJNIHNjYWxpbmcgb3BlcmF0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAvKiBHQ0MgQ29tcGlsZXIgKi8JLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwotCi0jaWYgZGVmaW5lZChfX0FSTV9BUkNIXzZfXykKLQotaW5saW5lIHN0YXRpYyBJTlQgc2hpZnRSaWdodFNhdChJTlQgc3JjLCBpbnQgc2NhbGUpCi17Ci0gIElOVCByZXN1bHQ7Ci0gIGFzbSgKLSAgICAgICJzc2F0ICUwLCUyLCUwO1xuIgotCi0gICAgICA6ICI9JnIiKHJlc3VsdCkKLSAgICAgIDogInIiKHNyYz4+c2NhbGUpLCAiTSIoU0FNUExFX0JJVFMpCi0gICAgICApOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLSAgI2RlZmluZSBTQVRVUkFURV9JTlRfUENNX1JJR0hUX1NISUZUKHNyYywgc2NhbGUpIHNoaWZ0UmlnaHRTYXQoc3JjLCBzY2FsZSkKLQotaW5saW5lIHN0YXRpYyBJTlQgc2hpZnRMZWZ0U2F0KElOVCBzcmMsIGludCBzY2FsZSkKLXsKLSAgSU5UIHJlc3VsdDsKLSAgYXNtKAotICAgICAgInNzYXQgJTAsJTIsJTA7XG4iCi0KLSAgICAgIDogIj0mciIocmVzdWx0KQotICAgICAgOiAiciIoc3JjPDxzY2FsZSksICJNIihTQU1QTEVfQklUUykKLSAgICAgICk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotICAjZGVmaW5lIFNBVFVSQVRFX0lOVF9QQ01fTEVGVF9TSElGVChzcmMsIHNjYWxlKSAgc2hpZnRMZWZ0U2F0KHNyYywgc2NhbGUpCi0KLSNlbmRpZiAvKiBfX0FSTV9BUkNIXzZfXyAqLwotCi0jZW5kaWYgLyogY29tcGlsZXIgc2VsZWN0aW9uICovCi0KLSNkZWZpbmUgRlVOQ1RJT05fc2NhbGVWYWx1ZUluUGxhY2UKLWlubGluZQotdm9pZCBzY2FsZVZhbHVlSW5QbGFjZShGSVhQX0RCTCAqdmFsdWUsIC8qITwgVmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNjYWxlZmFjdG9yICAgLyohPCBTY2FsZWZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gIElOVCBuZXdzY2FsZTsKLSAgaWYgKChuZXdzY2FsZSA9IHNjYWxlZmFjdG9yKSA+PSAwKQotICAgICp2YWx1ZSA8PD0gbmV3c2NhbGU7Ci0gIGVsc2UKLSAgICAqdmFsdWUgPj49IC1uZXdzY2FsZTsKLX0KLQotCi0gICNkZWZpbmUgU0FUVVJBVEVfUklHSFRfU0hJRlQoc3JjLCBzY2FsZSwgZEJpdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAoICgoKExPTkcpKHNyYykgXiAoKExPTkcpKHNyYykgPj4gKERGUkFDVF9CSVRTLTEpKSk+PihzY2FsZSkpID4gKExPTkcpKCgoMVUpPDwoKGRCaXRzKS0xKSktMSkpICAgICBcCi0gICAgICAgICAgPyAoKExPTkcpKHNyYykgPj4gKERGUkFDVF9CSVRTLTEpKSBeIChMT05HKSgoKDFVKTw8KChkQml0cyktMSkpLTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgOiAoKExPTkcpKHNyYykgPj4gKHNjYWxlKSkKLQotICAjZGVmaW5lIFNBVFVSQVRFX0xFRlRfU0hJRlQoc3JjLCBzY2FsZSwgZEJpdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKCAoKExPTkcpKHNyYykgXiAoKExPTkcpKHNyYykgPj4gKERGUkFDVF9CSVRTLTEpKSkgPiAoKExPTkcpKCgoMVUpPDwoKGRCaXRzKS0xKSktMSkgPj4gKHNjYWxlKSkgKSAgXAotICAgICAgICAgID8gKChMT05HKShzcmMpID4+IChERlJBQ1RfQklUUy0xKSkgXiAoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIDogKChMT05HKShzcmMpIDw8IChzY2FsZSkpCi0KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL2FybS9zY2FsZV9hcm0uaCBiL2xpYkZESy9pbmNsdWRlL2FybS9zY2FsZV9hcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmY0ZjY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliRkRLL2luY2x1ZGUvYXJtL3NjYWxlX2FybS5oCkBAIC0wLDAgKzEsMTYzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IEFSTSBzY2FsaW5nIG9wZXJhdGlvbnMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKFNDQUxFX0FSTV9IKQorI2RlZmluZSBTQ0FMRV9BUk1fSAorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgLyogR0NDIENvbXBpbGVyICovCisKKyNpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKQorCitpbmxpbmUgc3RhdGljIElOVCBzaGlmdFJpZ2h0U2F0KElOVCBzcmMsIGludCBzY2FsZSkgeworICBJTlQgcmVzdWx0OworICBhc20oInNzYXQgJTAsJTIsJTA7XG4iCisKKyAgICAgIDogIj0mciIocmVzdWx0KQorICAgICAgOiAiciIoc3JjID4+IHNjYWxlKSwgIk0iKFNBTVBMRV9CSVRTKSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworI2RlZmluZSBTQVRVUkFURV9JTlRfUENNX1JJR0hUX1NISUZUKHNyYywgc2NhbGUpIHNoaWZ0UmlnaHRTYXQoc3JjLCBzY2FsZSkKKworaW5saW5lIHN0YXRpYyBJTlQgc2hpZnRMZWZ0U2F0KElOVCBzcmMsIGludCBzY2FsZSkgeworICBJTlQgcmVzdWx0OworICBhc20oInNzYXQgJTAsJTIsJTA7XG4iCisKKyAgICAgIDogIj0mciIocmVzdWx0KQorICAgICAgOiAiciIoc3JjIDw8IHNjYWxlKSwgIk0iKFNBTVBMRV9CSVRTKSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworI2RlZmluZSBTQVRVUkFURV9JTlRfUENNX0xFRlRfU0hJRlQoc3JjLCBzY2FsZSkgc2hpZnRMZWZ0U2F0KHNyYywgc2NhbGUpCisKKyNlbmRpZiAvKiBfX0FSTV9BUkNIXzZfXyAqLworCisjZW5kaWYgLyogY29tcGlsZXIgc2VsZWN0aW9uICovCisKKyNkZWZpbmUgRlVOQ1RJT05fc2NhbGVWYWx1ZUluUGxhY2UKKyNpZmRlZiBGVU5DVElPTl9zY2FsZVZhbHVlSW5QbGFjZQoraW5saW5lIHZvaWQgc2NhbGVWYWx1ZUluUGxhY2UoRklYUF9EQkwgKnZhbHVlLCAvKiE8IFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgIC8qITwgU2NhbGVmYWN0b3IgKi8KKykgeworICBJTlQgbmV3c2NhbGU7CisgIGlmICgobmV3c2NhbGUgPSBzY2FsZWZhY3RvcikgPj0gMCkKKyAgICAqdmFsdWUgPDw9IG5ld3NjYWxlOworICBlbHNlCisgICAgKnZhbHVlID4+PSAtbmV3c2NhbGU7Cit9CisjZW5kaWYgLyogI2lmZGVmIEZVTkNUSU9OX3NjYWxlVmFsdWVJblBsYWNlICovCisKKyNkZWZpbmUgU0FUVVJBVEVfUklHSFRfU0hJRlQoc3JjLCBzY2FsZSwgZEJpdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKChMT05HKShzcmMpIF4gKChMT05HKShzcmMpID4+IChERlJBQ1RfQklUUyAtIDEpKSkgPj4gKHNjYWxlKSkgPiAgICAgICAgICAgXAorICAgKExPTkcpKCgoMVUpIDw8ICgoZEJpdHMpLTEpKSAtIDEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgID8gKChMT05HKShzcmMpID4+IChERlJBQ1RfQklUUyAtIDEpKSBeIChMT05HKSgoKDFVKSA8PCAoKGRCaXRzKS0xKSkgLSAxKSBcCisgICAgICA6ICgoTE9ORykoc3JjKSA+PiAoc2NhbGUpKQorCisjZGVmaW5lIFNBVFVSQVRFX0xFRlRfU0hJRlQoc3JjLCBzY2FsZSwgZEJpdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChMT05HKShzcmMpIF4gKChMT05HKShzcmMpID4+IChERlJBQ1RfQklUUyAtIDEpKSkgPiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoTE9ORykoKCgxVSkgPDwgKChkQml0cyktMSkpIC0gMSkgPj4gKHNjYWxlKSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA/ICgoTE9ORykoc3JjKSA+PiAoREZSQUNUX0JJVFMgLSAxKSkgXiAoTE9ORykoKCgxVSkgPDwgKChkQml0cyktMSkpIC0gMSkgXAorICAgICAgOiAoKExPTkcpKHNyYykgPDwgKHNjYWxlKSkKKworI2VuZGlmIC8qICFkZWZpbmVkKFNDQUxFX0FSTV9IKSAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvYXJtL3NjcmFtYmxlLmggYi9saWJGREsvaW5jbHVkZS9hcm0vc2NyYW1ibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJkMDMzOC4uMDAwMDAwMAotLS0gYS9saWJGREsvaW5jbHVkZS9hcm0vc2NyYW1ibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIEF1dGhvcihzKToKLSAgIERlc2NyaXB0aW9uOiBiaXRyZXZlcnNhbCBvZiBpbnB1dCBkYXRhCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIGRlZmluZWQoRlVOQ1RJT05fc2NyYW1ibGUpCi0jaWYgZGVmaW5lZChfX0dOVUNfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwotCi0jZGVmaW5lIEZVTkNUSU9OX3NjcmFtYmxlCi0KLSNpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pCi0jZGVmaW5lIFVTRV9MRFJEX1NUUkQgICAvKiBMRFJEIHJlcXVpcmVzIDggYnl0ZSBkYXRhIGFsaWdubWVudC4gKi8KLSNlbmRpZgotCi1pbmxpbmUgdm9pZCBzY3JhbWJsZShGSVhQX0RCTCB4IFtdLCBJTlQgbikgewotICBGREtfQVNTRVJUKCEoKChJTlQpeCkmKEFMSUdOTUVOVF9ERUZBVUxULTEpKSk7Ci0gIGFzbSgibW92ICAgICByMiwgIzE7XG4iICAgICAgICAgICAgICAgLyogcjIobSkgPSAxOyAgICAgICAgICAgKi8KLSAgICAgICJzdWIgICAgIHIzLCAlMSwgIzE7XG4iICAgICAgICAgICAvKiByMyA9IG4tMTsgICAgICAgICAgICAqLwotICAgICAgIm1vdiAgICAgcjQsICMwO1xuIiAgICAgICAgICAgICAgIC8qIHI0KGopID0gMDsgICAgICAgICAgICovCi0KLSJzY3JhbWJsZV9tX2xvb3AlPTpcbiIgICAgICAgICAgICAgICAgICAvKiB7ICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgIm1vdiAgICAgcjUsICUxO1xuIiAgICAgICAgICAgICAgIC8qICByNShrKSA9IDE7ICAgICAgICAgICovCi0KLSJzY3JhbWJsZV9rX2xvb3AlPTpcbiIgICAgICAgICAgICAgICAgICAvKiAgeyAgICAgICAgICAgICAgICAgICAqLwotICAgICAgIm1vdiAgICAgcjUsIHI1LCBsc3IgIzE7XG4iICAgICAgIC8qICAgayA+Pj0gMTsgICAgICAgICAgICovCi0gICAgICAiZW9yICAgICByNCwgcjQsIHI1O1xuIiAgICAgICAgICAgLyogICBqIF49azsgICAgICAgICAgICAgKi8KLSAgICAgICJhbmRzICAgIHIxMCwgcjQsIHI1O1xuIiAgICAgICAgICAgLyogICByMTAgPSByNCAmIHI1OyAgICAgICovCi0gICAgICAiYmVxICAgICBzY3JhbWJsZV9rX2xvb3AlPTtcbiIgICAgICAvKiAgfSB3aGlsZSAocjEwID09IDApOyAgKi8KLQotICAgICAgImNtcCAgICAgcjQsIHIyO1xuIiAgICAgICAgICAgICAgIC8qICAgaWYgKHI0IDwgcjIpIGJyZWFrOyAgICAgICAgKi8KLSAgICAgICJiY2MgICAgIHNjcmFtYmxlX21fbG9vcF9lbmQlPTtcbiIKLQotI2lmZGVmIFVTRV9MRFJEX1NUUkQKLSAgICAgICJtb3YgICAgIHI1LCByMiwgbHNsICMzO1xuIiAgICAgICAvKiBtKHI1KSA9IHIyKjQqMiAgICAgICAgICAgICAgICovCi0gICAgICAibGRyZCAgICByMTAsIFslMCwgcjVdO1xuIiAgICAgICAgIC8qIHIxMCA9IHhbcjVdLCB4NyA9IHhbcjUrMV0gICAgICovCi0gICAgICAibW92ICAgICByNiwgcjQsIGxzbCAjMztcbiIgICAgICAvKiBqKHI2KSA9IHI0KjQqMiAgICAgICAgICAgICAgKi8KLSAgICAgICJsZHJkICAgIHI4LCBbJTAsIHI2XTtcbiIgICAgICAgIC8qIHI4ID0geFtyNl0sIHI5ID0geFtyNisxXTsgICovCi0gICAgICAic3RyZCAgICByMTAsIFslMCwgcjZdO1xuIiAgICAgICAgLyogeFtyNixyNisxXSA9IHIxMCxyMTE7ICAgICAgICAqLwotICAgICAgInN0cmQgICAgcjgsIFslMCwgcjVdO1xuIiAgICAgICAgIC8qIHhbcjUscjUrMV0gPSByOCxyOTsgICAgICAgICAgKi8KLSNlbHNlCi0gICAgICAibW92ICAgICAgcjUsIHIyLCBsc2wgIzM7XG4iICAgICAgIC8qIG0ocjUpID0gcjIqNCoyICAgICAgICAgICAgICAgKi8KLSAgICAgICJsZHIJcjEwLCBbJTAsIHI1XTtcbiIKLSAgICAgICJtb3YgICAgICByNiwgcjQsIGxzbCAjMztcbiIgICAgICAvKiBqKHI2KSA9IHI0KjQqMiAgICAgICAgICAgICAgKi8KLSAgICAgICJsZHIJcjExLCBbJTAsIHI2XTtcbiIKLQotICAgICAgInN0cglyMTAsIFslMCwgcjZdO1xuIgotICAgICAgInN0ciAgICAgIHIxMSwgWyUwLCByNV07XG4iCi0KLSAgICAgICJhZGQJcjUsIHI1LCAjNDsiCi0gICAgICAibGRyCXIxMCwgWyUwLCByNV07XG4iCi0gICAgICAiYWRkCXI2LCByNiwgIzQ7IgotICAgICAgImxkciAgICAgIHIxMSwgWyUwLCByNl07XG4iCi0gICAgICAic3RyICAgICAgcjEwLCBbJTAsIHI2XTtcbiIKLSAgICAgICJzdHIgICAgICByMTEsIFslMCwgcjVdO1xuIgotI2VuZGlmCi0ic2NyYW1ibGVfbV9sb29wX2VuZCU9OlxuIgotICAgICAgImFkZCAgICAgcjIsIHIyLCAjMTtcbiIgICAgICAgICAgIC8qIHIyKys7ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICJjbXAgICAgIHIyLCByMztcbiIKLSAgICAgICJiY2MgICAgIHNjcmFtYmxlX21fbG9vcCU9O1xuIiAgICAgIC8qIH0gd2hpbGUgKHIyKG0pIDwgcjMobi0xKSk7ICAgKi8KLSAgICAgICA6Ci0gICAgICAgOiAiciIoeCksICJyIihuKQotI2lmZGVmIFVTRV9MRFJEX1NUUkQKLSAgICAgICA6ICJyMiIsInIzIiwgInI0IiwicjUiLCAicjEwIiwicjExIiwgInI4IiwicjkiLCAicjYiICk7Ci0jZWxzZQotICAgICAgIDogInIyIiwicjMiLCAicjQiLCJyNSIsICJyMTAiLCJyMTEiLCAicjYiICk7Ci0jZW5kaWYKLX0KLSNlbHNlCi0vKiBGb3JjZSBDIGltcGxlbWVudGF0aW9uIGlmIG5vIGFzc2VtYmxlciB2ZXJzaW9uIGF2YWlsYWJsZS4gKi8KLSN1bmRlZiBGVU5DVElPTl9zY3JhbWJsZQotI2VuZGlmCS8qIFRvb2xjaGFpbiBzZWxlY3Rpb24uICovCi0KLSNlbmRpZgkvKiBkZWZpbmVkKEZVTkNUSU9OX3NjcmFtYmxlKSAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvYXJtL3NjcmFtYmxlX2FybS5oIGIvbGliRkRLL2luY2x1ZGUvYXJtL3NjcmFtYmxlX2FybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Y2ZlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJGREsvaW5jbHVkZS9hcm0vc2NyYW1ibGVfYXJtLmgKQEAgLTAsMCArMSwxNzQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogYml0cmV2ZXJzYWwgb2YgaW5wdXQgZGF0YQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIWRlZmluZWQoU0NSQU1CTEVfQVJNX0gpCisjZGVmaW5lIFNDUkFNQkxFX0FSTV9ICisKKyNpZiBkZWZpbmVkKEZVTkNUSU9OX3NjcmFtYmxlKQorI2lmIGRlZmluZWQoX19HTlVDX18pCisKKyNkZWZpbmUgRlVOQ1RJT05fc2NyYW1ibGUKKworI2lmIGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykKKyNkZWZpbmUgVVNFX0xEUkRfU1RSRCAvKiBMRFJEIHJlcXVpcmVzIDggYnl0ZSBkYXRhIGFsaWdubWVudC4gKi8KKyNlbmRpZgorCitpbmxpbmUgdm9pZCBzY3JhbWJsZShGSVhQX0RCTCB4W10sIElOVCBuKSB7CisgIEZES19BU1NFUlQoISgoKElOVCl4KSAmIChBTElHTk1FTlRfREVGQVVMVCAtIDEpKSk7CisgIGFzbSgibW92ICAgICByMiwgIzE7XG4iICAgICAvKiByMihtKSA9IDE7ICAgICAgICAgICAqLworICAgICAgInN1YiAgICAgcjMsICUxLCAjMTtcbiIgLyogcjMgPSBuLTE7ICAgICAgICAgICAgKi8KKyAgICAgICJtb3YgICAgIHI0LCAjMDtcbiIgICAgIC8qIHI0KGopID0gMDsgICAgICAgICAgICovCisKKyAgICAgICJzY3JhbWJsZV9tX2xvb3AlPTpcbiIgLyogeyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICJtb3YgICAgIHI1LCAlMTtcbiIgICAgLyogIHI1KGspID0gMTsgICAgICAgICAgKi8KKworICAgICAgInNjcmFtYmxlX2tfbG9vcCU9OlxuIiAgICAgICAgIC8qICB7ICAgICAgICAgICAgICAgICAgICovCisgICAgICAibW92ICAgICByNSwgcjUsIGxzciAjMTtcbiIgICAgLyogICBrID4+PSAxOyAgICAgICAgICAgKi8KKyAgICAgICJlb3IgICAgIHI0LCByNCwgcjU7XG4iICAgICAgICAvKiAgIGogXj1rOyAgICAgICAgICAgICAqLworICAgICAgImFuZHMgICAgcjEwLCByNCwgcjU7XG4iICAgICAgIC8qICAgcjEwID0gcjQgJiByNTsgICAgICAqLworICAgICAgImJlcSAgICAgc2NyYW1ibGVfa19sb29wJT07XG4iIC8qICB9IHdoaWxlIChyMTAgPT0gMCk7ICAqLworCisgICAgICAiY21wICAgICByNCwgcjI7XG4iIC8qICAgaWYgKHI0IDwgcjIpIGJyZWFrOyAgICAgICAgKi8KKyAgICAgICJiY2MgICAgIHNjcmFtYmxlX21fbG9vcF9lbmQlPTtcbiIKKworI2lmZGVmIFVTRV9MRFJEX1NUUkQKKyAgICAgICJtb3YgICAgIHI1LCByMiwgbHNsICMzO1xuIiAvKiBtKHI1KSA9IHIyKjQqMiAgICAgICAgICAgICAgICovCisgICAgICAibGRyZCAgICByMTAsIFslMCwgcjVdO1xuIiAgLyogcjEwID0geFtyNV0sIHg3ID0geFtyNSsxXSAgICAgKi8KKyAgICAgICJtb3YgICAgIHI2LCByNCwgbHNsICMzO1xuIiAvKiBqKHI2KSA9IHI0KjQqMiAgICAgICAgICAgICAgKi8KKyAgICAgICJsZHJkICAgIHI4LCBbJTAsIHI2XTtcbiIgICAvKiByOCA9IHhbcjZdLCByOSA9IHhbcjYrMV07ICAqLworICAgICAgInN0cmQgICAgcjEwLCBbJTAsIHI2XTtcbiIgIC8qIHhbcjYscjYrMV0gPSByMTAscjExOyAgICAgICAgKi8KKyAgICAgICJzdHJkICAgIHI4LCBbJTAsIHI1XTtcbiIgICAvKiB4W3I1LHI1KzFdID0gcjgscjk7ICAgICAgICAgICovCisjZWxzZQorICAgICAgIm1vdiAgICAgIHI1LCByMiwgbHNsICMzO1xuIiAvKiBtKHI1KSA9IHIyKjQqMiAgICAgICAgICAgICAgICovCisgICAgICAibGRyICAgICAgcjEwLCBbJTAsIHI1XTtcbiIKKyAgICAgICJtb3YgICAgICByNiwgcjQsIGxzbCAjMztcbiIgLyogaihyNikgPSByNCo0KjIgICAgICAgICAgICAgICovCisgICAgICAibGRyICAgICAgcjExLCBbJTAsIHI2XTtcbiIKKworICAgICAgInN0ciAgICAgIHIxMCwgWyUwLCByNl07XG4iCisgICAgICAic3RyICAgICAgcjExLCBbJTAsIHI1XTtcbiIKKworICAgICAgImFkZCAgICAgIHI1LCByNSwgIzQ7IgorICAgICAgImxkciAgICAgIHIxMCwgWyUwLCByNV07XG4iCisgICAgICAiYWRkICAgICAgcjYsIHI2LCAjNDsiCisgICAgICAibGRyICAgICAgcjExLCBbJTAsIHI2XTtcbiIKKyAgICAgICJzdHIgICAgICByMTAsIFslMCwgcjZdO1xuIgorICAgICAgInN0ciAgICAgIHIxMSwgWyUwLCByNV07XG4iCisjZW5kaWYKKyAgICAgICJzY3JhbWJsZV9tX2xvb3BfZW5kJT06XG4iCisgICAgICAiYWRkICAgICByMiwgcjIsICMxO1xuIiAvKiByMisrOyAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAiY21wICAgICByMiwgcjM7XG4iCisgICAgICAiYmNjICAgICBzY3JhbWJsZV9tX2xvb3AlPTtcbiIgLyogfSB3aGlsZSAocjIobSkgPCByMyhuLTEpKTsgICAqLworICAgICAgOgorICAgICAgOiAiciIoeCksICJyIihuKQorI2lmZGVmIFVTRV9MRFJEX1NUUkQKKyAgICAgIDogInIyIiwgInIzIiwgInI0IiwgInI1IiwgInIxMCIsICJyMTEiLCAicjgiLCAicjkiLCAicjYiKTsKKyNlbHNlCisgICAgICA6ICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyMTAiLCAicjExIiwgInI2Iik7CisjZW5kaWYKK30KKyNlbHNlCisvKiBGb3JjZSBDIGltcGxlbWVudGF0aW9uIGlmIG5vIGFzc2VtYmxlciB2ZXJzaW9uIGF2YWlsYWJsZS4gKi8KKyN1bmRlZiBGVU5DVElPTl9zY3JhbWJsZQorI2VuZGlmIC8qIFRvb2xjaGFpbiBzZWxlY3Rpb24uICovCisKKyNlbmRpZiAvKiBkZWZpbmVkKEZVTkNUSU9OX3NjcmFtYmxlKSAqLworI2VuZGlmIC8qICFkZWZpbmVkKFNDUkFNQkxFX0FSTV9IKSAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvYXV0b2NvcnIybmQuaCBiL2xpYkZESy9pbmNsdWRlL2F1dG9jb3JyMm5kLmgKaW5kZXggYzJlOTU5NS4uZTAxOTg5YiAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvYXV0b2NvcnIybmQuaAorKysgYi9saWJGREsvaW5jbHVkZS9hdXRvY29ycjJuZC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDUwICs5MCw0OCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIKKwogICAgRGVzY3JpcHRpb246IGZpeGVkIHBvaW50IGFicyBkZWZpbml0aW9ucwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIF9BVVRPQ09SUl8yTkRfSAotI2RlZmluZSBfQVVUT0NPUlJfMk5EX0gKLQotCisjaWZuZGVmIEFVVE9DT1JSMk5EX0gKKyNkZWZpbmUgQVVUT0NPUlIyTkRfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIEZJWFBfREJMICByMDByOwotICBGSVhQX0RCTCAgcjExcjsKLSAgRklYUF9EQkwgIHIyMnI7Ci0gIEZJWFBfREJMICByMDFyOwotICBGSVhQX0RCTCAgcjAycjsKLSAgRklYUF9EQkwgIHIxMnI7Ci0gIEZJWFBfREJMICByMDFpOwotICBGSVhQX0RCTCAgcjAyaTsKLSAgRklYUF9EQkwgIHIxMmk7Ci0gIEZJWFBfREJMICBkZXQ7CisgIEZJWFBfREJMIHIwMHI7CisgIEZJWFBfREJMIHIxMXI7CisgIEZJWFBfREJMIHIyMnI7CisgIEZJWFBfREJMIHIwMXI7CisgIEZJWFBfREJMIHIwMnI7CisgIEZJWFBfREJMIHIxMnI7CisgIEZJWFBfREJMIHIwMWk7CisgIEZJWFBfREJMIHIwMmk7CisgIEZJWFBfREJMIHIxMmk7CisgIEZJWFBfREJMIGRldDsKICAgaW50IGRldF9zY2FsZTsKIH0gQUNPUlJfQ09FRlM7CiAKICNkZWZpbmUgTFBDX09SREVSIDIKIAorSU5UIGF1dG9Db3JyMm5kX3JlYWwoCisgICAgQUNPUlJfQ09FRlMgKmFjLCAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gYXV0b2NvcnJlbGF0aW9uIGNvZWZmcyAqLworICAgIGNvbnN0IEZJWFBfREJMICpyZUJ1ZmZlciwgLyohPCBQb2ludGVyIHRvIHRvIHJlYWwgcGFydCBvZiBzcGVjdHJ1bSAqLworICAgIGNvbnN0IGludCBsZW4gICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgcW1mIHNsb3RzICovCispOwogCi1JTlQKLWF1dG9Db3JyMm5kX3JlYWwgKEFDT1JSX0NPRUZTICphYywgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGF1dG9jb3JyZWxhdGlvbiBjb2VmZnMgKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpyZUJ1ZmZlciwgLyohPCBQb2ludGVyIHRvIHRvIHJlYWwgcGFydCBvZiBzcGVjdHJ1bSAqLwotICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxlbiAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBxbWYgc2xvdHMgKi8KLSAgICAgICAgICAgICAgICAgKTsKLUlOVAotYXV0b0NvcnIybmRfY3BseCAoQUNPUlJfQ09FRlMgKmFjLCAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGF1dG9jb3JyZWxhdGlvbiBjb2VmZnMgKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpyZUJ1ZmZlciwgIC8qITwgUG9pbnRlciB0byB0byByZWFsIHBhcnQgb2Ygc3BlY3RydW0gKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICppbUJ1ZmZlciwgIC8qITwgUG9pbnRlciB0byBpbWFnIHBhcnQgb2Ygc3BlY3RydW0gKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBsZW4gICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHFtZiBzbG90cyAqLwotICAgICAgICAgICAgICAgICApOworSU5UIGF1dG9Db3JyMm5kX2NwbHgoCisgICAgQUNPUlJfQ09FRlMgKmFjLCAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gYXV0b2NvcnJlbGF0aW9uIGNvZWZmcyAqLworICAgIGNvbnN0IEZJWFBfREJMICpyZUJ1ZmZlciwgLyohPCBQb2ludGVyIHRvIHRvIHJlYWwgcGFydCBvZiBzcGVjdHJ1bSAqLworICAgIGNvbnN0IEZJWFBfREJMICppbUJ1ZmZlciwgLyohPCBQb2ludGVyIHRvIGltYWcgcGFydCBvZiBzcGVjdHJ1bSAqLworICAgIGNvbnN0IGludCBsZW4gICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgcW1mIHNsb3RzICovCispOwogCi0KLSNlbmRpZiAvKiBfQVVUT0NPUlJfMk5EX0ggKi8KKyNlbmRpZiAvKiBBVVRPQ09SUjJORF9IICovCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9jbHouaCBiL2xpYkZESy9pbmNsdWRlL2Nsei5oCmluZGV4IGZjNjEyZTEuLjZhY2RlZTYgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL2Nsei5oCisrKyBiL2xpYkZESy9pbmNsdWRlL2Nsei5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE3ICs5MCwxOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIE1hcmMgR2F5ZXIKKwogICAgRGVzY3JpcHRpb246IGZpeGVkIHBvaW50IGludHJpbnNpY3MKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmICFkZWZpbmVkKF9fQ0xaX0hfXykKLSNkZWZpbmUgX19DTFpfSF9fCisjaWYgIWRlZmluZWQoQ0xaX0gpCisjZGVmaW5lIENMWl9ICiAKICNpbmNsdWRlICJGREtfYXJjaGRlZi5oIgogI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgpAQCAtOTcsMTUgKzEwOSwxNCBAQAogI2lmIGRlZmluZWQoX19hcm1fXykKICNpbmNsdWRlICJhcm0vY2x6X2FybS5oIgogCi0jZWxpZiBkZWZpbmVkKF9fbWlwc19fKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCisjZWxpZiBkZWZpbmVkKF9fbWlwc19fKQogI2luY2x1ZGUgIm1pcHMvY2x6X21pcHMuaCIKIAotI2VsaWYgZGVmaW5lZChfX3g4Nl9fKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCisjZWxpZiBkZWZpbmVkKF9feDg2X18pCiAjaW5jbHVkZSAieDg2L2Nsel94ODYuaCIKIAogI2VuZGlmIC8qIGFsbCBjb3JlcyAqLwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgIFNvZnR3YXJlIGZhbGxiYWNrcyBmb3IgbWlzc2luZyBmdW5jdGlvbnMuCkBAIC0xMTQsNzkgKzEyNSw3OCBAQAogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bm9ybXpfUykKICNpZmRlZiBGVU5DVElPTl9maXhub3Jtel9ECi1pbmxpbmUgSU5UIGZpeG5vcm16X1MgKFNIT1JUIGEpCi17Ci0gIHJldHVybiBmaXhub3Jtel9EKChJTlQpKGEpKTsKK2lubGluZSBJTlQgZml4bm9ybXpfUyhTSE9SVCBhKSB7CisgIGlmIChhIDwgMCkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBmaXhub3Jtel9EKChJTlQpKGEpKSAtIDE2OwogfQogI2Vsc2UKLWlubGluZSBJTlQgZml4bm9ybXpfUyAoU0hPUlQgYSkKLXsKLSAgICBpbnQgbGVhZGluZ0JpdHMgPSAwOwotICAgIGEgPSB+YTsKLSAgICB3aGlsZShhICYgMHg4MDAwKSB7Ci0gICAgICBsZWFkaW5nQml0cysrOwotICAgICAgYSA8PD0gMTsKLSAgICB9CitpbmxpbmUgSU5UIGZpeG5vcm16X1MoU0hPUlQgYSkgeworICBpbnQgbGVhZGluZ0JpdHMgPSAwOworICBhID0gfmE7CisgIHdoaWxlIChhICYgMHg4MDAwKSB7CisgICAgbGVhZGluZ0JpdHMrKzsKKyAgICBhIDw8PSAxOworICB9CiAKLSAgICByZXR1cm4gKGxlYWRpbmdCaXRzKTsKKyAgcmV0dXJuIChsZWFkaW5nQml0cyk7CiB9CiAjZW5kaWYKICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bm9ybXpfRCkKLWlubGluZSBJTlQgZml4bm9ybXpfRCAoTE9ORyBhKQotewotICAgIElOVCBsZWFkaW5nQml0cyA9IDA7Ci0gICAgYSA9IH5hOwotICAgIHdoaWxlKGEgJiAweDgwMDAwMDAwKSB7Ci0gICAgICBsZWFkaW5nQml0cysrOwotICAgICAgYSA8PD0gMTsKLSAgICB9CitpbmxpbmUgSU5UIGZpeG5vcm16X0QoTE9ORyBhKSB7CisgIElOVCBsZWFkaW5nQml0cyA9IDA7CisgIGEgPSB+YTsKKyAgd2hpbGUgKGEgJiAweDgwMDAwMDAwKSB7CisgICAgbGVhZGluZ0JpdHMrKzsKKyAgICBhIDw8PSAxOworICB9CiAKLSAgICByZXR1cm4gKGxlYWRpbmdCaXRzKTsKKyAgcmV0dXJuIChsZWFkaW5nQml0cyk7CiB9CiAjZW5kaWYKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogZml4bm9ybV9ECi0gICAgZGVzY3JpcHRpb246ICBDb3VudCBsZWFkaW5nIG9uZXMgb3IgemVyb3Mgb2Ygb3BlcmFuZCB2YWwgZm9yIGRmcmFjdC9MT05HIElOVCB2YWx1ZXMuCi0gICAgICAgICAgICAgICAgICBSZXR1cm4gdGhpcyB2YWx1ZSBtaW51cyAxLiBSZXR1cm4gMCBpZiBvcGVyYW5kPT0wLgorICAgIGRlc2NyaXB0aW9uOiAgQ291bnQgbGVhZGluZyBvbmVzIG9yIHplcm9zIG9mIG9wZXJhbmQgdmFsIGZvciBkZnJhY3QvTE9ORyBJTlQKK3ZhbHVlcy4gUmV0dXJuIHRoaXMgdmFsdWUgbWludXMgMS4gUmV0dXJuIDAgaWYgb3BlcmFuZD09MC4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG5vcm1fUykKICNpZmRlZiBGVU5DVElPTl9maXhub3JtX0QKLWlubGluZSBJTlQgZml4bm9ybV9TKEZJWFBfU0dMIHZhbCkKLXsKLSAgcmV0dXJuIGZpeG5vcm1fRCgoSU5UKSh2YWwpKTsKK2lubGluZSBJTlQgZml4bm9ybV9TKEZJWFBfU0dMIHZhbCkgeworICBpZiAodmFsID09IChGSVhQX1NHTCkwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGZpeG5vcm1fRCgoSU5UKSh2YWwpKSAtIDE2OwogfQogI2Vsc2UKLWlubGluZSBJTlQgZml4bm9ybV9TKEZJWFBfU0dMIHZhbCkKLXsKLSAgICBJTlQgbGVhZGluZ0JpdHMgPSAwOwotICAgIGlmICggdmFsICE9IChGSVhQX1NHTCkwICkgewotICAgICAgICBpZiAoIHZhbCA8IChGSVhQX1NHTCkwICkgewotICAgICAgICAgICAgdmFsID0gfnZhbDsKLSAgICAgICAgfQotICAgICAgICBsZWFkaW5nQml0cyA9IGZpeG5vcm16X1ModmFsKSAtIDE7CitpbmxpbmUgSU5UIGZpeG5vcm1fUyhGSVhQX1NHTCB2YWwpIHsKKyAgSU5UIGxlYWRpbmdCaXRzID0gMDsKKyAgaWYgKHZhbCAhPSAoRklYUF9TR0wpMCkgeworICAgIGlmICh2YWwgPCAoRklYUF9TR0wpMCkgeworICAgICAgdmFsID0gfnZhbDsKICAgICB9Ci0gICAgcmV0dXJuIChsZWFkaW5nQml0cyk7CisgICAgbGVhZGluZ0JpdHMgPSBmaXhub3Jtel9TKHZhbCkgLSAxOworICB9CisgIHJldHVybiAobGVhZGluZ0JpdHMpOwogfQogI2VuZGlmCiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG5vcm1fRCkKLWlubGluZSBJTlQgZml4bm9ybV9EKEZJWFBfREJMIHZhbCkKLXsKLSAgICBJTlQgbGVhZGluZ0JpdHMgPSAwOwotICAgIGlmICggdmFsICE9IChGSVhQX0RCTCkwICkgewotICAgICAgICBpZiAoIHZhbCA8IChGSVhQX0RCTCkwICkgewotICAgICAgICAgICAgdmFsID0gfnZhbDsKLSAgICAgICAgfQotICAgICAgICBsZWFkaW5nQml0cyA9IGZpeG5vcm16X0QodmFsKSAtIDE7CitpbmxpbmUgSU5UIGZpeG5vcm1fRChGSVhQX0RCTCB2YWwpIHsKKyAgSU5UIGxlYWRpbmdCaXRzID0gMDsKKyAgaWYgKHZhbCAhPSAoRklYUF9EQkwpMCkgeworICAgIGlmICh2YWwgPCAoRklYUF9EQkwpMCkgeworICAgICAgdmFsID0gfnZhbDsKICAgICB9Ci0gICAgcmV0dXJuIChsZWFkaW5nQml0cyk7CisgICAgbGVhZGluZ0JpdHMgPSBmaXhub3Jtel9EKHZhbCkgLSAxOworICB9CisgIHJldHVybiAobGVhZGluZ0JpdHMpOwogfQogI2VuZGlmCiAKLSNlbmRpZiAvKiBfX0NMWl9IX18gKi8KKyNlbmRpZiAvKiBDTFpfSCAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvY29tbW9uX2ZpeC5oIGIvbGliRkRLL2luY2x1ZGUvY29tbW9uX2ZpeC5oCmluZGV4IGQyZDExZjQuLjhkMGRmZGUgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL2NvbW1vbl9maXguaAorKysgYi9saWJGREsvaW5jbHVkZS9jb21tb25fZml4LmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNzQgKzkwLDg1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyLCBNLiBHYXllcgorCiAgICBEZXNjcmlwdGlvbjogRmxleGlibGUgZml4cG9pbnQgbGlicmFyeSBjb25maWd1cmF0aW9uCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgX0NPTU1PTl9GSVhfSAotI2RlZmluZSBfQ09NTU9OX0ZJWF9ICisjaWZuZGVmIENPTU1PTl9GSVhfSAorI2RlZmluZSBDT01NT05fRklYX0gKIAogI2luY2x1ZGUgIkZES19hcmNoZGVmLmgiCiAjaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCiAKIC8qICoqKioqIFN0YXJ0IG9mIGZvcm1lciBmaXguaCAqKioqKiogKi8KIAotLyogQ29uZmlndXJlIGZyYWN0aW9uYWwgb3IgaW50ZWdlciBhcml0aG1ldGljICovCi0gICNkZWZpbmUgRklYX0ZSQUNUIDAgLyogRGVmaW5lIHRoaXMgdG8gIjEiIHRvIHVzZSBmcmFjdGlvbmFsIGFyaXRobWV0aWMgc2ltdWxhdGlvbiBpbiBjbGFzcyBmcmFjdCBpbnN0ZWFkIG9mIGludGVnZXIgYXJpdGhtZXRpYyAqLwotICAgICAgICAgICAgICAgICAgICAgIC8qIDEgZm9yIGRlYnVnIHdpdGggZXh0cmEgcnVudGltZSBvdmVyZmxvdyBjaGVja2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCiAvKiBEZWZpbmUgYml0IHNpemVzIG9mIGludGVnZXIgZml4cG9pbnQgZnJhY3Rpb25hbCBkYXRhIHR5cGVzICovCi0jZGVmaW5lIEZSQUNUX0JJVFMgICAgICAxNiAvKiBzaW5nbGUgcHJlY2lzaW9uICovCi0jZGVmaW5lIERGUkFDVF9CSVRTICAgICAzMiAvKiBkb3VibGUgcHJlY2lzaW9uICovCi0jZGVmaW5lIEFDQ1VfQklUUyAgICAgICA0MCAvKiBkb3VibGUgcHJlY2lzaW9uIHBsdXMgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgRlJBQ1RfQklUUyAxNiAgLyogc2luZ2xlIHByZWNpc2lvbiAqLworI2RlZmluZSBERlJBQ1RfQklUUyAzMiAvKiBkb3VibGUgcHJlY2lzaW9uICovCisjZGVmaW5lIEFDQ1VfQklUUyA0MCAgIC8qIGRvdWJsZSBwcmVjaXNpb24gcGx1cyBvdmVyZmxvdyAqLwogCiAvKiBGaXhwb2ludCBlcXVpdmFsZW50IHR5cGUgZm90IFBDTSBhdWRpbyB0aW1lIGRvbWFpbiBkYXRhLiAqLwogI2lmIGRlZmluZWQoU0FNUExFX0JJVFMpCiAjaWYgKFNBTVBMRV9CSVRTID09IERGUkFDVF9CSVRTKQotICAjZGVmaW5lIEZJWFBfUENNICAgICAgRklYUF9EQkwKLSAgI2RlZmluZSBGWF9QQ00yRlhfREJMKHgpICgoRklYUF9EQkwpKHgpKQotICAjZGVmaW5lIEZYX0RCTDJGWF9QQ00oeCkgKChJTlRfUENNKSh4KSkKKyNkZWZpbmUgRklYUF9QQ00gRklYUF9EQkwKKyNkZWZpbmUgTUFYVkFMX0ZJWFBfUENNIE1BWFZBTF9EQkwKKyNkZWZpbmUgTUlOVkFMX0ZJWFBfUENNIE1JTlZBTF9EQkwKKyNkZWZpbmUgRlhfUENNMkZYX0RCTCh4KSAoKEZJWFBfREJMKSh4KSkKKyNkZWZpbmUgRlhfREJMMkZYX1BDTSh4KSAoKElOVF9QQ00pKHgpKQogI2VsaWYgKFNBTVBMRV9CSVRTID09IEZSQUNUX0JJVFMpCi0gICNkZWZpbmUgRklYUF9QQ00gICAgICBGSVhQX1NHTAotICAjZGVmaW5lIEZYX1BDTTJGWF9EQkwoeCkgRlhfU0dMMkZYX0RCTCgoRklYUF9TR0wpKHgpKQotICAjZGVmaW5lIEZYX0RCTDJGWF9QQ00oeCkgRlhfREJMMkZYX1NHTCh4KQorI2RlZmluZSBGSVhQX1BDTSBGSVhQX1NHTAorI2RlZmluZSBNQVhWQUxfRklYUF9QQ00gTUFYVkFMX1NHTAorI2RlZmluZSBNSU5WQUxfRklYUF9QQ00gTUlOVkFMX1NHTAorI2RlZmluZSBGWF9QQ00yRlhfREJMKHgpIEZYX1NHTDJGWF9EQkwoKEZJWFBfU0dMKSh4KSkKKyNkZWZpbmUgRlhfREJMMkZYX1BDTSh4KSBGWF9EQkwyRlhfU0dMKHgpCiAjZWxzZQotICAjZXJyb3IgU0FNUExFX0JJVFMgZGlmZmVyZW50IGZyb20gRlJBQ1RfQklUUyBvciBERlJBQ1RfQklUUyBub3QgaW1wbGVtZW50ZWQhCisjZXJyb3IgU0FNUExFX0JJVFMgZGlmZmVyZW50IGZyb20gRlJBQ1RfQklUUyBvciBERlJBQ1RfQklUUyBub3QgaW1wbGVtZW50ZWQhCiAjZW5kaWYKICNlbmRpZgogCiAvKiAqKioqKiogRW5kIG9mIGZvcm1lciBmaXguaCAqKioqKiogKi8KIAotI2RlZmluZSBTR0xfTUFTSyAgICAgICAgICAgICgoMVVMPDxGUkFDVF9CSVRTKS0xKSAgIC8qIDE2Yml0OiAoMl4xNiktMSA9IDB4RkZGRiAqLworI2RlZmluZSBTR0xfTUFTSyAoKDFVTCA8PCBGUkFDVF9CSVRTKSAtIDEpIC8qIDE2Yml0OiAoMl4xNiktMSA9IDB4RkZGRiAqLwogCi0jZGVmaW5lIE1BWF9TSElGVF9TR0wgKEZSQUNUX0JJVFMtMSkgICAvKiBtYXhpbXVtIHBvc3NpYmxlIHNoaWZ0IGZvciBGSVhQX1NHTCB2YWx1ZXMgKi8KLSNkZWZpbmUgTUFYX1NISUZUX0RCTCAoREZSQUNUX0JJVFMtMSkgIC8qIG1heGltdW0gcG9zc2libGUgc2hpZnQgZm9yIEZJWFBfREJMIHZhbHVlcyAqLworI2RlZmluZSBNQVhfU0hJRlRfU0dMIFwKKyAgKEZSQUNUX0JJVFMgLSAxKSAvKiBtYXhpbXVtIHBvc3NpYmxlIHNoaWZ0IGZvciBGSVhQX1NHTCB2YWx1ZXMgKi8KKyNkZWZpbmUgTUFYX1NISUZUX0RCTCBcCisgIChERlJBQ1RfQklUUyAtIDEpIC8qIG1heGltdW0gcG9zc2libGUgc2hpZnQgZm9yIEZJWFBfREJMIHZhbHVlcyAqLwogCi0vKiBTY2FsZSBmYWN0b3IgZnJvbS90byBmbG9hdC9maXhwb2ludCB2YWx1ZXMuIERPIE5PVCBVU0UgVEhFU0UgVkFMVUVTIEFTIFNBVFVSQVRJT04gTElNSVRTICEhICovCi0jZGVmaW5lIEZSQUNUX0ZJWF9TQ0FMRSAgICAgKChJTlQ2NCgxKTw8KEZSQUNUX0JJVFMtMSkpKQotI2RlZmluZSBERlJBQ1RfRklYX1NDQUxFICAgICgoSU5UNjQoMSk8PChERlJBQ1RfQklUUy0xKSkpCisvKiBTY2FsZSBmYWN0b3IgZnJvbS90byBmbG9hdC9maXhwb2ludCB2YWx1ZXMuIERPIE5PVCBVU0UgVEhFU0UgVkFMVUVTIEFTCisgKiBTQVRVUkFUSU9OIExJTUlUUyAhISAqLworI2RlZmluZSBGUkFDVF9GSVhfU0NBTEUgKChJTlQ2NCgxKSA8PCAoRlJBQ1RfQklUUyAtIDEpKSkKKyNkZWZpbmUgREZSQUNUX0ZJWF9TQ0FMRSAoKElOVDY0KDEpIDw8IChERlJBQ1RfQklUUyAtIDEpKSkKIAotLyogTWF4IGFuZCBNaW4gdmFsdWVzIGZvciBzYXR1cmF0aW9uIHB1cnBvc2VzLiBETyBOT1QgVVNFIFRIRVNFIFZBTFVFUyBBUyBTQ0FMRSBWQUxVRVMgISEgKi8KLSNkZWZpbmUgIE1BWFZBTF9TR0wgICAgICgoc2lnbmVkKTB4MDAwMDdGRkYpICAgIC8qIHRoaXMgaGFzIHRvIGJlIHN5bmNocm9uaXplZCB0byBGUkFDVF9CSVRTICovCi0jZGVmaW5lICBNSU5WQUxfU0dMICAgICAoKHNpZ25lZCkweEZGRkY4MDAwKSAgICAvKiB0aGlzIGhhcyB0byBiZSBzeW5jaHJvbml6ZWQgdG8gRlJBQ1RfQklUUyAqLwotI2RlZmluZSAgTUFYVkFMX0RCTCAgICAgKChzaWduZWQpMHg3RkZGRkZGRikgICAgLyogdGhpcyBoYXMgdG8gYmUgc3luY2hyb25pemVkIHRvIERGUkFDVF9CSVRTICovCi0jZGVmaW5lICBNSU5WQUxfREJMICAgICAoKHNpZ25lZCkweDgwMDAwMDAwKSAgICAvKiB0aGlzIGhhcyB0byBiZSBzeW5jaHJvbml6ZWQgdG8gREZSQUNUX0JJVFMgKi8KKy8qIE1heCBhbmQgTWluIHZhbHVlcyBmb3Igc2F0dXJhdGlvbiBwdXJwb3Nlcy4gRE8gTk9UIFVTRSBUSEVTRSBWQUxVRVMgQVMgU0NBTEUKKyAqIFZBTFVFUyAhISAqLworI2RlZmluZSBNQVhWQUxfU0dMIFwKKyAgKChzaWduZWQpMHgwMDAwN0ZGRikgLyogdGhpcyBoYXMgdG8gYmUgc3luY2hyb25pemVkIHRvIEZSQUNUX0JJVFMgKi8KKyNkZWZpbmUgTUlOVkFMX1NHTCBcCisgICgoc2lnbmVkKTB4RkZGRjgwMDApIC8qIHRoaXMgaGFzIHRvIGJlIHN5bmNocm9uaXplZCB0byBGUkFDVF9CSVRTICovCisjZGVmaW5lIE1BWFZBTF9EQkwgXAorICAoKHNpZ25lZCkweDdGRkZGRkZGKSAvKiB0aGlzIGhhcyB0byBiZSBzeW5jaHJvbml6ZWQgdG8gREZSQUNUX0JJVFMgKi8KKyNkZWZpbmUgTUlOVkFMX0RCTCBcCisgICgoc2lnbmVkKTB4ODAwMDAwMDApIC8qIHRoaXMgaGFzIHRvIGJlIHN5bmNocm9uaXplZCB0byBERlJBQ1RfQklUUyAqLwogCisjZGVmaW5lIEZYX0RCTDJGWENPTlNUX1NHTCh2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKCgoKHZhbCkgPj4gKERGUkFDVF9CSVRTIC0gRlJBQ1RfQklUUyAtIDEpKSArIDEpID4gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoKExPTkcpMSA8PCBGUkFDVF9CSVRTKSAtIDEpKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChMT05HKSh2YWwpID4gMCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoRklYUF9TR0wpKFNIT1JUKSgoKExPTkcpMSA8PCAoRlJBQ1RfQklUUyAtIDEpKSAtIDEpICAgICAgICAgICAgICAgICBcCisgICAgICAgOiAoRklYUF9TR0wpKFNIT1JUKSgoKCh2YWwpID4+IChERlJBQ1RfQklUUyAtIEZSQUNUX0JJVFMgLSAxKSkgKyAxKSA+PiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSkKIAotI2RlZmluZSBGWF9EQkwyRlhDT05TVF9TR0wodmFsKSAoICggKCgoKHZhbCkgPj4gKERGUkFDVF9CSVRTLUZSQUNUX0JJVFMtMSkpICsgMSkgPiAoKChMT05HKTE8PEZSQUNUX0JJVFMpLTEpKSAmJiAoKExPTkcpKHZhbCkgPiAwKSApID8gXAotICAgKEZJWFBfU0dMKShTSE9SVCkoKChMT05HKTE8PChGUkFDVF9CSVRTLTEpKS0xKTooRklYUF9TR0wpKFNIT1JUKSgoKCh2YWwpID4+IChERlJBQ1RfQklUUy1GUkFDVF9CSVRTLTEpKSArIDEpID4+IDEpICkKKyNkZWZpbmUgc2hvdWxkQmVVbmlvbiB1bmlvbiAvKiB1bmlvbnMgYXJlIHBvc3NpYmxlICovCiAKLQotCi0jZGVmaW5lIHNob3VsZEJlVW5pb24gdW5pb24gICAgIC8qIHVuaW9ucyBhcmUgcG9zc2libGUgKi8KLQotICAgIHR5cGVkZWYgU0hPUlQgICAgICAgRklYUF9TR0w7Ci0gICAgdHlwZWRlZiBMT05HICAgICAgICBGSVhQX0RCTDsKK3R5cGVkZWYgU0hPUlQgRklYUF9TR0w7Cit0eXBlZGVmIExPTkcgRklYUF9EQkw7CiAKIC8qIG1hY3JvcyBmb3IgY29tcGlsZS10aW1lIGNvbnZlcnNpb24gb2YgY29uc3RhbnQgZmxvYXQgdmFsdWVzIHRvIGZpeGVkcG9pbnQgKi8KICNkZWZpbmUgRkwyRlhDT05TVF9TUEMgRkwyRlhDT05TVF9EQkwKQEAgLTE1NCwxOTkgKzE3NiwyNTEgQEAKICNkZWZpbmUgTUlOVkFMX0RCTF9DT05TVCBNSU5WQUxfREJMCiAjZGVmaW5lIE1JTlZBTF9TR0xfQ09OU1QgTUlOVkFMX1NHTAogCi0jZGVmaW5lIEZMMkZYQ09OU1RfU0dMKHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLShGSVhQX1NHTCkoICggKHZhbCkgPj0gMCkgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSgoKCAoZG91YmxlKSh2YWwpICogKEZSQUNUX0ZJWF9TQ0FMRSkgKyAwLjUgKSA+PSAoZG91YmxlKShNQVhWQUxfU0dMKSApID8gKFNIT1JUKShNQVhWQUxfU0dMKSA6IChTSE9SVCkoIChkb3VibGUpKHZhbCkgKiAoZG91YmxlKShGUkFDVF9GSVhfU0NBTEUpICsgMC41KSkgOiAgIFwKLSgoKCAoZG91YmxlKSh2YWwpICogKEZSQUNUX0ZJWF9TQ0FMRSkgLSAwLjUpIDw9ICAoZG91YmxlKShNSU5WQUxfU0dMX0NPTlNUKSApID8gKFNIT1JUKShNSU5WQUxfU0dMX0NPTlNUKSA6IChTSE9SVCkoIChkb3VibGUpKHZhbCkgKiAoZG91YmxlKShGUkFDVF9GSVhfU0NBTEUpIC0gMC41KSkgKQorI2RlZmluZSBGTDJGWENPTlNUX1NHTCh2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChGSVhQX1NHTCkoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgodmFsKSA+PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgID8gKCgoKGRvdWJsZSkodmFsKSAqIChGUkFDVF9GSVhfU0NBTEUpICsgMC41KSA+PSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChkb3VibGUpKE1BWFZBTF9TR0wpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgPyAoU0hPUlQpKE1BWFZBTF9TR0wpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICA6IChTSE9SVCkoKGRvdWJsZSkodmFsKSAqIChkb3VibGUpKEZSQUNUX0ZJWF9TQ0FMRSkgKyAwLjUpKSBcCisgICAgICAgICAgOiAoKCgoZG91YmxlKSh2YWwpICogKEZSQUNUX0ZJWF9TQ0FMRSktMC41KSA8PSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKGRvdWJsZSkoTUlOVkFMX1NHTF9DT05TVCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICA/IChTSE9SVCkoTUlOVkFMX1NHTF9DT05TVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIDogKFNIT1JUKSgoZG91YmxlKSh2YWwpICogKGRvdWJsZSkoRlJBQ1RfRklYX1NDQUxFKS0wLjUpKSkKIAotI2RlZmluZSBGTDJGWENPTlNUX0RCTCh2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0oRklYUF9EQkwpKCAoICh2YWwpID49IDApID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0oKCggKGRvdWJsZSkodmFsKSAqIChERlJBQ1RfRklYX1NDQUxFKSArIDAuNSApID49IChkb3VibGUpKE1BWFZBTF9EQkwpICkgPyAoTE9ORykoTUFYVkFMX0RCTCkgOiAoTE9ORykoIChkb3VibGUpKHZhbCkgKiAoZG91YmxlKShERlJBQ1RfRklYX1NDQUxFKSArIDAuNSkpIDogXAotKCgoIChkb3VibGUpKHZhbCkgKiAoREZSQUNUX0ZJWF9TQ0FMRSkgLSAwLjUpIDw9ICAoZG91YmxlKShNSU5WQUxfREJMX0NPTlNUKSApID8gKExPTkcpKE1JTlZBTF9EQkxfQ09OU1QpIDogKExPTkcpKCAoZG91YmxlKSh2YWwpICogKGRvdWJsZSkoREZSQUNUX0ZJWF9TQ0FMRSkgLSAwLjUpKSApCisjZGVmaW5lIEZMMkZYQ09OU1RfREJMKHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEZJWFBfREJMKSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCh2YWwpID49IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgPyAoKCgoZG91YmxlKSh2YWwpICogKERGUkFDVF9GSVhfU0NBTEUpICsgMC41KSA+PSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKGRvdWJsZSkoTUFYVkFMX0RCTCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICA/IChMT05HKShNQVhWQUxfREJMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIDogKExPTkcpKChkb3VibGUpKHZhbCkgKiAoZG91YmxlKShERlJBQ1RfRklYX1NDQUxFKSArIDAuNSkpIFwKKyAgICAgICAgICA6ICgoKChkb3VibGUpKHZhbCkgKiAoREZSQUNUX0ZJWF9TQ0FMRSktMC41KSA8PSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoZG91YmxlKShNSU5WQUxfREJMX0NPTlNUKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgID8gKExPTkcpKE1JTlZBTF9EQkxfQ09OU1QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgOiAoTE9ORykoKGRvdWJsZSkodmFsKSAqIChkb3VibGUpKERGUkFDVF9GSVhfU0NBTEUpLTAuNSkpKQogCi0vKiBtYWNyb3MgZm9yIHJ1bnRpbWUgY29udmVyc2lvbiBvZiBmbG9hdCB2YWx1ZXMgdG8gaW50ZWdlciBmaXhlZHBvaW50LiBOTyBPVkVSRkxPVyBDSEVDSyEhISAqLworLyogbWFjcm9zIGZvciBydW50aW1lIGNvbnZlcnNpb24gb2YgZmxvYXQgdmFsdWVzIHRvIGludGVnZXIgZml4ZWRwb2ludC4gTk8KKyAqIE9WRVJGTE9XIENIRUNLISEhICovCiAjZGVmaW5lIEZMMkZYX1NQQyBGTDJGWF9EQkwKLSNkZWZpbmUgRkwyRlhfU0dMKHZhbCkgKCAodmFsKT4wLjBmID8gKFNIT1JUKSggKHZhbCkqKGZsb2F0KShGUkFDVF9GSVhfU0NBTEUpKzAuNWYgKSA6IChTSE9SVCkoICh2YWwpKihmbG9hdCkoRlJBQ1RfRklYX1NDQUxFKS0wLjVmICkgKQotI2RlZmluZSBGTDJGWF9EQkwodmFsKSAoICh2YWwpPjAuMGYgPyAoTE9ORykoICh2YWwpKihmbG9hdCkoREZSQUNUX0ZJWF9TQ0FMRSkrMC41ZiApIDogKExPTkcpKCAodmFsKSooZmxvYXQpKERGUkFDVF9GSVhfU0NBTEUpLTAuNWYgKSApCisjZGVmaW5lIEZMMkZYX1NHTCh2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHZhbCkgPiAwLjBmID8gKFNIT1JUKSgodmFsKSAqIChmbG9hdCkoRlJBQ1RfRklYX1NDQUxFKSArIDAuNWYpIFwKKyAgICAgICAgICAgICAgICA6IChTSE9SVCkoKHZhbCkgKiAoZmxvYXQpKEZSQUNUX0ZJWF9TQ0FMRSktMC41ZikpCisjZGVmaW5lIEZMMkZYX0RCTCh2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHZhbCkgPiAwLjBmID8gKExPTkcpKCh2YWwpICogKGZsb2F0KShERlJBQ1RfRklYX1NDQUxFKSArIDAuNWYpIFwKKyAgICAgICAgICAgICAgICA6IChMT05HKSgodmFsKSAqIChmbG9hdCkoREZSQUNUX0ZJWF9TQ0FMRSktMC41ZikpCiAKLS8qIG1hY3JvcyBmb3IgcnVudGltZSBjb252ZXJzaW9uIG9mIGZpeGVkcG9pbnQgdmFsdWVzIHRvIG90aGVyIGZpeGVkcG9pbnQuIE5PIFJPVU5ESU5HISEhICovCi0jZGVmaW5lIEZYX0FDQzJGWF9TR0wodmFsKSAoKEZJWFBfU0dMKSgodmFsKT4+KEFDQ1VfQklUUy1GUkFDVF9CSVRTKSkpCi0jZGVmaW5lIEZYX0FDQzJGWF9EQkwodmFsKSAoKEZJWFBfREJMKSgodmFsKT4+KEFDQ1VfQklUUy1ERlJBQ1RfQklUUykpKQotI2RlZmluZSBGWF9TR0wyRlhfQUNDKHZhbCkgKChGSVhQX0FDQykoKExPTkcpKHZhbCk8PChBQ0NVX0JJVFMtRlJBQ1RfQklUUykpKQotI2RlZmluZSBGWF9TR0wyRlhfREJMKHZhbCkgKChGSVhQX0RCTCkoKExPTkcpKHZhbCk8PChERlJBQ1RfQklUUy1GUkFDVF9CSVRTKSkpCi0jZGVmaW5lIEZYX0RCTDJGWF9TR0wodmFsKSAoKEZJWFBfU0dMKSgodmFsKT4+KERGUkFDVF9CSVRTLUZSQUNUX0JJVFMpKSkKKy8qIG1hY3JvcyBmb3IgcnVudGltZSBjb252ZXJzaW9uIG9mIGZpeGVkcG9pbnQgdmFsdWVzIHRvIG90aGVyIGZpeGVkcG9pbnQuIE5PCisgKiBST1VORElORyEhISAqLworI2RlZmluZSBGWF9BQ0MyRlhfU0dMKHZhbCkgKChGSVhQX1NHTCkoKHZhbCkgPj4gKEFDQ1VfQklUUyAtIEZSQUNUX0JJVFMpKSkKKyNkZWZpbmUgRlhfQUNDMkZYX0RCTCh2YWwpICgoRklYUF9EQkwpKCh2YWwpID4+IChBQ0NVX0JJVFMgLSBERlJBQ1RfQklUUykpKQorI2RlZmluZSBGWF9TR0wyRlhfQUNDKHZhbCkgKChGSVhQX0FDQykoKExPTkcpKHZhbCkgPDwgKEFDQ1VfQklUUyAtIEZSQUNUX0JJVFMpKSkKKyNkZWZpbmUgRlhfU0dMMkZYX0RCTCh2YWwpIFwKKyAgKChGSVhQX0RCTCkoKExPTkcpKHZhbCkgPDwgKERGUkFDVF9CSVRTIC0gRlJBQ1RfQklUUykpKQorI2RlZmluZSBGWF9EQkwyRlhfU0dMKHZhbCkgKChGSVhQX1NHTCkoKHZhbCkgPj4gKERGUkFDVF9CSVRTIC0gRlJBQ1RfQklUUykpKQogCiAvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCiAKIC8qIG1hY3JvcyBmb3IgcnVudGltZSBjb252ZXJzaW9uIG9mIGludGVnZXIgZml4ZWRwb2ludCB2YWx1ZXMgdG8gZmxvYXQuICovCi0vKiBUaGlzIGlzIGp1c3QgZm9yIHRlbXBvcmFyeSB1c2UgYW5kIHNob3VsZCBub3QgYmUgcmVxdWlyZWQgaW4gYSBmaW5hbCB2ZXJzaW9uISAqLwogCi0vKiAjZGVmaW5lIEZYX0RCTDJGTCh2YWwpICAoKGZsb2F0KShwb3coMi4sLTMxLikqKGZsb2F0KXZhbCkpICovICAvKiB2ZXJzaW9uICMxICovCi0jZGVmaW5lIEZYX0RCTDJGTCh2YWwpICAoKGZsb2F0KSgoZG91YmxlKSh2YWwpLyhkb3VibGUpREZSQUNUX0ZJWF9TQ0FMRSkpICAgLyogdmVyc2lvbiAjMiAtIGlkZW50aWNhbCB0byBjbGFzcyBkZnJhY3QgY2FzdCBmcm9tIGRmcmFjdCB0byBmbG9hdCAqLworLyogI2RlZmluZSBGWF9EQkwyRkwodmFsKSAgKChmbG9hdCkocG93KDIuLC0zMS4pKihmbG9hdCl2YWwpKSAqLyAvKiB2ZXJzaW9uICMxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGWF9EQkwyRkwodmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChmbG9hdCkoKGRvdWJsZSkodmFsKSAvIChkb3VibGUpREZSQUNUX0ZJWF9TQ0FMRSkpIC8qIHZlcnNpb24gIzIgLSAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGljYWwgdG8gY2xhc3MgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZyYWN0IGNhc3QgZnJvbSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmcmFjdCB0byBmbG9hdCAqLworI2RlZmluZSBGWF9EQkwyRE9VQkxFKHZhbCkgKCgoZG91YmxlKSh2YWwpIC8gKGRvdWJsZSlERlJBQ1RfRklYX1NDQUxFKSkKIAogLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLwogI2luY2x1ZGUgImZpeG11bC5oIgogCi1GREtfSU5MSU5FIExPTkcgZk11bHQoU0hPUlQgYSwgU0hPUlQgYikgICAgICAgICB7IHJldHVybiBmaXhtdWxfU1MoYSwgYik7IH0KLUZES19JTkxJTkUgTE9ORyBmTXVsdChTSE9SVCBhLCBMT05HIGIpICAgICAgICAgIHsgcmV0dXJuIGZpeG11bF9TRChhLCBiKTsgfQotRkRLX0lOTElORSBMT05HIGZNdWx0KExPTkcgYSwgU0hPUlQgYikgICAgICAgICAgeyByZXR1cm4gZml4bXVsX0RTKGEsIGIpOyB9Ci1GREtfSU5MSU5FIExPTkcgZk11bHQoTE9ORyBhLCBMT05HIGIpICAgICAgICAgICB7IHJldHVybiBmaXhtdWxfREQoYSwgYik7IH0KLUZES19JTkxJTkUgTE9ORyBmUG93MihMT05HIGEpICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeHBvdzJfRChhKTsgICAgfQotRkRLX0lOTElORSBMT05HIGZQb3cyKFNIT1JUIGEpICAgICAgICAgICAgICAgICAgeyByZXR1cm4gZml4cG93Ml9TKGEpOyAgICB9CitGREtfSU5MSU5FIExPTkcgZk11bHQoU0hPUlQgYSwgU0hPUlQgYikgeyByZXR1cm4gZml4bXVsX1NTKGEsIGIpOyB9CitGREtfSU5MSU5FIExPTkcgZk11bHQoU0hPUlQgYSwgTE9ORyBiKSB7IHJldHVybiBmaXhtdWxfU0QoYSwgYik7IH0KK0ZES19JTkxJTkUgTE9ORyBmTXVsdChMT05HIGEsIFNIT1JUIGIpIHsgcmV0dXJuIGZpeG11bF9EUyhhLCBiKTsgfQorRkRLX0lOTElORSBMT05HIGZNdWx0KExPTkcgYSwgTE9ORyBiKSB7IHJldHVybiBmaXhtdWxfREQoYSwgYik7IH0KK0ZES19JTkxJTkUgTE9ORyBmUG93MihMT05HIGEpIHsgcmV0dXJuIGZpeHBvdzJfRChhKTsgfQorRkRLX0lOTElORSBMT05HIGZQb3cyKFNIT1JUIGEpIHsgcmV0dXJuIGZpeHBvdzJfUyhhKTsgfQogCi1GREtfSU5MSU5FIElOVCAgZk11bHRJKExPTkcgYSwgU0hPUlQgYikgICAgICAgICB7IHJldHVybiAoIChJTlQpKCgoMTw8KEZSQUNUX0JJVFMtMikpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhtdWxkaXYyX0REKGEsKChJTlQpYjw8RlJBQ1RfQklUUykpKT4+KEZSQUNUX0JJVFMtMSkpICk7IH0KK0ZES19JTkxJTkUgTE9ORyBmTXVsdERpdjIoU0hPUlQgYSwgU0hPUlQgYikgeyByZXR1cm4gZml4bXVsZGl2Ml9TUyhhLCBiKTsgfQorRkRLX0lOTElORSBMT05HIGZNdWx0RGl2MihTSE9SVCBhLCBMT05HIGIpIHsgcmV0dXJuIGZpeG11bGRpdjJfU0QoYSwgYik7IH0KK0ZES19JTkxJTkUgTE9ORyBmTXVsdERpdjIoTE9ORyBhLCBTSE9SVCBiKSB7IHJldHVybiBmaXhtdWxkaXYyX0RTKGEsIGIpOyB9CitGREtfSU5MSU5FIExPTkcgZk11bHREaXYyKExPTkcgYSwgTE9ORyBiKSB7IHJldHVybiBmaXhtdWxkaXYyX0REKGEsIGIpOyB9CitGREtfSU5MSU5FIExPTkcgZlBvdzJEaXYyKExPTkcgYSkgeyByZXR1cm4gZml4cG93MmRpdjJfRChhKTsgfQorRkRLX0lOTElORSBMT05HIGZQb3cyRGl2MihTSE9SVCBhKSB7IHJldHVybiBmaXhwb3cyZGl2Ml9TKGEpOyB9CiAKLUZES19JTkxJTkUgSU5UICBmTXVsdElmbG9vcihMT05HIGEsIElOVCBiKSAgICAgIHsgcmV0dXJuICggKElOVCkoKDEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeG11bGRpdjJfREQoYSwoYjw8RlJBQ1RfQklUUykpKSA+PiAoRlJBQ1RfQklUUy0xKSkgKTsgfQorRkRLX0lOTElORSBMT05HIGZNdWx0RGl2MkJpdEV4YWN0KExPTkcgYSwgTE9ORyBiKSB7CisgIHJldHVybiBmaXhtdWxkaXYyQml0RXhhY3RfREQoYSwgYik7Cit9CitGREtfSU5MSU5FIExPTkcgZk11bHREaXYyQml0RXhhY3QoU0hPUlQgYSwgTE9ORyBiKSB7CisgIHJldHVybiBmaXhtdWxkaXYyQml0RXhhY3RfU0QoYSwgYik7Cit9CitGREtfSU5MSU5FIExPTkcgZk11bHREaXYyQml0RXhhY3QoTE9ORyBhLCBTSE9SVCBiKSB7CisgIHJldHVybiBmaXhtdWxkaXYyQml0RXhhY3RfRFMoYSwgYik7Cit9CitGREtfSU5MSU5FIExPTkcgZk11bHRCaXRFeGFjdChMT05HIGEsIExPTkcgYikgeworICByZXR1cm4gZml4bXVsQml0RXhhY3RfREQoYSwgYik7Cit9CitGREtfSU5MSU5FIExPTkcgZk11bHRCaXRFeGFjdChTSE9SVCBhLCBMT05HIGIpIHsKKyAgcmV0dXJuIGZpeG11bEJpdEV4YWN0X1NEKGEsIGIpOworfQorRkRLX0lOTElORSBMT05HIGZNdWx0Qml0RXhhY3QoTE9ORyBhLCBTSE9SVCBiKSB7CisgIHJldHVybiBmaXhtdWxCaXRFeGFjdF9EUyhhLCBiKTsKK30KIAotRkRLX0lOTElORSBJTlQgIGZNdWx0SWNlaWwoTE9ORyBhLCBJTlQgYikgICAgICAgeyByZXR1cm4gKCAoSU5UKSgoKElOVCkweDdmZmYgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeG11bGRpdjJfREQoYSwoYjw8RlJBQ1RfQklUUykpKSA+PiAoRlJBQ1RfQklUUy0xKSkgKTsgfQotCi1GREtfSU5MSU5FIExPTkcgZk11bHREaXYyKFNIT1JUIGEsIFNIT1JUIGIpICAgICB7IHJldHVybiBmaXhtdWxkaXYyX1NTKGEsIGIpOyB9Ci1GREtfSU5MSU5FIExPTkcgZk11bHREaXYyKFNIT1JUIGEsIExPTkcgYikgICAgICB7IHJldHVybiBmaXhtdWxkaXYyX1NEKGEsIGIpOyB9Ci1GREtfSU5MSU5FIExPTkcgZk11bHREaXYyKExPTkcgYSwgU0hPUlQgYikgICAgICB7IHJldHVybiBmaXhtdWxkaXYyX0RTKGEsIGIpOyB9Ci1GREtfSU5MSU5FIExPTkcgZk11bHREaXYyKExPTkcgYSwgTE9ORyBiKSAgICAgICB7IHJldHVybiBmaXhtdWxkaXYyX0REKGEsIGIpOyB9Ci1GREtfSU5MSU5FIExPTkcgZlBvdzJEaXYyKExPTkcgYSkgICAgICAgICAgICAgICB7IHJldHVybiBmaXhwb3cyZGl2Ml9EKGEpOyAgICB9Ci1GREtfSU5MSU5FIExPTkcgZlBvdzJEaXYyKFNIT1JUIGEpICAgICAgICAgICAgICB7IHJldHVybiBmaXhwb3cyZGl2Ml9TKGEpOyAgICB9Ci0KLUZES19JTkxJTkUgTE9ORyBmTXVsdERpdjJCaXRFeGFjdChMT05HIGEsIExPTkcgYikgICB7IHJldHVybiBmaXhtdWxkaXYyQml0RXhhY3RfREQoYSwgYik7IH0KLUZES19JTkxJTkUgTE9ORyBmTXVsdERpdjJCaXRFeGFjdChTSE9SVCBhLCBMT05HICBiKSB7IHJldHVybiBmaXhtdWxkaXYyQml0RXhhY3RfU0QoYSwgYik7IH0KLUZES19JTkxJTkUgTE9ORyBmTXVsdERpdjJCaXRFeGFjdChMT05HICBhLCBTSE9SVCBiKSB7IHJldHVybiBmaXhtdWxkaXYyQml0RXhhY3RfRFMoYSwgYik7IH0KLUZES19JTkxJTkUgTE9ORyBmTXVsdEJpdEV4YWN0KExPTkcgYSwgTE9ORyBiKSAgICAgICB7IHJldHVybiBmaXhtdWxCaXRFeGFjdF9ERChhLCBiKTsgfQotRkRLX0lOTElORSBMT05HIGZNdWx0Qml0RXhhY3QoU0hPUlQgYSwgTE9ORyAgYikgICAgIHsgcmV0dXJuIGZpeG11bEJpdEV4YWN0X1NEKGEsIGIpOyB9Ci1GREtfSU5MSU5FIExPTkcgZk11bHRCaXRFeGFjdChMT05HICBhLCBTSE9SVCBiKSAgICAgeyByZXR1cm4gZml4bXVsQml0RXhhY3RfRFMoYSwgYik7IH0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KICNpbmNsdWRlICJhYnMuaCIKIAotRkRLX0lOTElORSBGSVhQX0RCTCBmQWJzKEZJWFBfREJMIHgpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4YWJzX0QoeCk7IH0KLUZES19JTkxJTkUgRklYUF9TR0wgZkFicyhGSVhQX1NHTCB4KQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeGFic19TKHgpOyB9CitGREtfSU5MSU5FIEZJWFBfREJMIGZBYnMoRklYUF9EQkwgeCkgeyByZXR1cm4gZml4YWJzX0QoeCk7IH0KK0ZES19JTkxJTkUgRklYUF9TR0wgZkFicyhGSVhQX1NHTCB4KSB7IHJldHVybiBmaXhhYnNfUyh4KTsgfQogCi0vKiB3b3JrYXJvdW5kIGZvciBUSSBDNnggY29tcGlsZXIgYnV0IG5vdCBmb3IgVEkgQVJNOUUgY29tcGlsZXIgKi8KLSNpZiAoIWRlZmluZWQoX19USV9DT01QSUxFUl9WRVJTSU9OX18pIHx8IGRlZmluZWQoX19USV9UTVM0NzBfVjVfXykpICYmICFkZWZpbmVkKF9fTFA2NF9fKQotRkRLX0lOTElORSBJTlQgIGZBYnMoSU5UIHgpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4YWJzX0koeCk7IH0KKyNpZiAhZGVmaW5lZChfX0xQNjRfXykKK0ZES19JTkxJTkUgSU5UIGZBYnMoSU5UIHgpIHsgcmV0dXJuIGZpeGFic19JKHgpOyB9CiAjZW5kaWYKIAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICovCiAKICNpbmNsdWRlICJjbHouaCIKIAotRkRLX0lOTElORSBJTlQgZk5vcm16KEZJWFBfREJMIHgpCi0gICAgICAgICAgICAgICB7IHJldHVybiBmaXhub3Jtel9EKHgpOyB9Ci1GREtfSU5MSU5FIElOVCBmTm9ybXooRklYUF9TR0wgeCkKLSAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG5vcm16X1MoeCk7IH0KLUZES19JTkxJTkUgSU5UIGZOb3JtKEZJWFBfREJMIHgpCi0gICAgICAgICAgICAgICB7IHJldHVybiBmaXhub3JtX0QoeCk7IH0KLUZES19JTkxJTkUgSU5UIGZOb3JtKEZJWFBfU0dMIHgpCi0gICAgICAgICAgICAgICB7IHJldHVybiBmaXhub3JtX1MoeCk7IH0KK0ZES19JTkxJTkUgSU5UIGZOb3JteihJTlQ2NCB4KSB7CisgIElOVCBjbHogPSBmaXhub3Jtel9EKChJTlQpKHggPj4gMzIpKTsKKyAgaWYgKGNseiA9PSAzMikgY2x6ICs9IGZpeG5vcm16X0QoKElOVCl4KTsKKyAgcmV0dXJuIGNsejsKK30KK0ZES19JTkxJTkUgSU5UIGZOb3JteihGSVhQX0RCTCB4KSB7IHJldHVybiBmaXhub3Jtel9EKHgpOyB9CitGREtfSU5MSU5FIElOVCBmTm9ybXooRklYUF9TR0wgeCkgeyByZXR1cm4gZml4bm9ybXpfUyh4KTsgfQorRkRLX0lOTElORSBJTlQgZk5vcm0oRklYUF9EQkwgeCkgeyByZXR1cm4gZml4bm9ybV9EKHgpOyB9CitGREtfSU5MSU5FIElOVCBmTm9ybShGSVhQX1NHTCB4KSB7IHJldHVybiBmaXhub3JtX1MoeCk7IH0KIAotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqLworICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKi8KKyAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICovCiAKICNpbmNsdWRlICJjbHouaCIKICNkZWZpbmUgZml4cF9hYnMoeCkgZkFicyh4KQotI2RlZmluZSBmaXhNaW4oYSxiKSBmTWluKGEsYikKLSNkZWZpbmUgZml4TWF4KGEsYikgZk1heChhLGIpCi0jZGVmaW5lIENudExlYWRpbmdaZXJvcyh4KSAgZml4bm9ybXpfRCh4KQorI2RlZmluZSBmaXhNaW4oYSwgYikgZk1pbihhLCBiKQorI2RlZmluZSBmaXhNYXgoYSwgYikgZk1heChhLCBiKQorI2RlZmluZSBDbnRMZWFkaW5nWmVyb3MoeCkgZml4bm9ybXpfRCh4KQogI2RlZmluZSBDb3VudExlYWRpbmdCaXRzKHgpIGZpeG5vcm1fRCh4KQogCiAjaW5jbHVkZSAiZml4bWFkZC5oIgogCiAvKiB5ID0gKHgrMC41KmEqYikgKi8KLUZES19JTkxJTkUgRklYUF9EQkwgZk11bHRBZGREaXYyKEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfREJMIGIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWFkZGRpdjJfREQoeCwgYSwgYik7IH0KLUZES19JTkxJTkUgRklYUF9EQkwgZk11bHRBZGREaXYyKEZJWFBfREJMIHgsIEZJWFBfU0dMIGEsIEZJWFBfREJMIGIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWFkZGRpdjJfU0QoeCwgYSwgYik7IH0KLUZES19JTkxJTkUgRklYUF9EQkwgZk11bHRBZGREaXYyKEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfU0dMIGIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWFkZGRpdjJfRFMoeCwgYSwgYik7IH0KLUZES19JTkxJTkUgRklYUF9EQkwgZk11bHRBZGREaXYyKEZJWFBfREJMIHgsIEZJWFBfU0dMIGEsIEZJWFBfU0dMIGIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWFkZGRpdjJfU1MoeCwgYSwgYik7IH0KK0ZES19JTkxJTkUgRklYUF9EQkwgZk11bHRBZGREaXYyKEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfREJMIGIpIHsKKyAgcmV0dXJuIGZpeG1hZGRkaXYyX0REKHgsIGEsIGIpOworfQorRkRLX0lOTElORSBGSVhQX0RCTCBmTXVsdEFkZERpdjIoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9EQkwgYikgeworICByZXR1cm4gZml4bWFkZGRpdjJfU0QoeCwgYSwgYik7Cit9CitGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkRGl2MihGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX1NHTCBiKSB7CisgIHJldHVybiBmaXhtYWRkZGl2Ml9EUyh4LCBhLCBiKTsKK30KK0ZES19JTkxJTkUgRklYUF9EQkwgZk11bHRBZGREaXYyKEZJWFBfREJMIHgsIEZJWFBfU0dMIGEsIEZJWFBfU0dMIGIpIHsKKyAgcmV0dXJuIGZpeG1hZGRkaXYyX1NTKHgsIGEsIGIpOworfQogCi1GREtfSU5MSU5FIEZJWFBfREJMIGZQb3cyQWRkRGl2MihGSVhQX0RCTCB4LCBGSVhQX0RCTCBhKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeHBhZGRkaXYyX0QoeCwgYSk7IH0KLUZES19JTkxJTkUgRklYUF9EQkwgZlBvdzJBZGREaXYyKEZJWFBfREJMIHgsIEZJWFBfU0dMIGEpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4cGFkZGRpdjJfUyh4LCBhKTsgfQotCitGREtfSU5MSU5FIEZJWFBfREJMIGZQb3cyQWRkRGl2MihGSVhQX0RCTCB4LCBGSVhQX0RCTCBhKSB7CisgIHJldHVybiBmaXhwYWRkZGl2Ml9EKHgsIGEpOworfQorRkRLX0lOTElORSBGSVhQX0RCTCBmUG93MkFkZERpdjIoRklYUF9EQkwgeCwgRklYUF9TR0wgYSkgeworICByZXR1cm4gZml4cGFkZGRpdjJfUyh4LCBhKTsKK30KIAogLyogeSA9IDIqKHgrMC41KmEqYikgPSAoMngrYSpiKSAqLwotRkRLX0lOTElORSBGSVhQX0RCTCBmTXVsdEFkZChGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX0RCTCBiKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRfREQoeCwgYSwgYik7IH0KLWlubGluZSBGSVhQX0RCTCBmTXVsdEFkZChGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX0RCTCBiKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRfU0QoeCwgYSwgYik7IH0KLWlubGluZSBGSVhQX0RCTCBmTXVsdEFkZChGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX1NHTCBiKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRfRFMoeCwgYSwgYik7IH0KLWlubGluZSBGSVhQX0RCTCBmTXVsdEFkZChGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX1NHTCBiKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRfU1MoeCwgYSwgYik7IH0KK0ZES19JTkxJTkUgRklYUF9EQkwgZk11bHRBZGQoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9EQkwgYikgeworICByZXR1cm4gZml4bWFkZF9ERCh4LCBhLCBiKTsKK30KK2lubGluZSBGSVhQX0RCTCBmTXVsdEFkZChGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX0RCTCBiKSB7CisgIHJldHVybiBmaXhtYWRkX1NEKHgsIGEsIGIpOworfQoraW5saW5lIEZJWFBfREJMIGZNdWx0QWRkKEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfU0dMIGIpIHsKKyAgcmV0dXJuIGZpeG1hZGRfRFMoeCwgYSwgYik7Cit9CitpbmxpbmUgRklYUF9EQkwgZk11bHRBZGQoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9TR0wgYikgeworICByZXR1cm4gZml4bWFkZF9TUyh4LCBhLCBiKTsKK30KIAotaW5saW5lIEZJWFBfREJMIGZQb3cyQWRkKEZJWFBfREJMIHgsIEZJWFBfREJMIGEpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4cGFkZF9EKHgsIGEpOyB9Ci1pbmxpbmUgRklYUF9EQkwgZlBvdzJBZGQoRklYUF9EQkwgeCwgRklYUF9TR0wgYSkKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhwYWRkX1MoeCwgYSk7IH0KLQoraW5saW5lIEZJWFBfREJMIGZQb3cyQWRkKEZJWFBfREJMIHgsIEZJWFBfREJMIGEpIHsgcmV0dXJuIGZpeHBhZGRfRCh4LCBhKTsgfQoraW5saW5lIEZJWFBfREJMIGZQb3cyQWRkKEZJWFBfREJMIHgsIEZJWFBfU0dMIGEpIHsgcmV0dXJuIGZpeHBhZGRfUyh4LCBhKTsgfQogCiAvKiB5ID0gKHgtMC41KmEqYikgKi8KLWlubGluZSBGSVhQX0RCTCBmTXVsdFN1YkRpdjIoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9EQkwgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtc3ViZGl2Ml9ERCh4LCBhLCBiKTsgfQotaW5saW5lIEZJWFBfREJMIGZNdWx0U3ViRGl2MihGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX0RCTCBiKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1zdWJkaXYyX1NEKHgsIGEsIGIpOyB9Ci1pbmxpbmUgRklYUF9EQkwgZk11bHRTdWJEaXYyKEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfU0dMIGIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bXN1YmRpdjJfRFMoeCwgYSwgYik7IH0KLWlubGluZSBGSVhQX0RCTCBmTXVsdFN1YkRpdjIoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9TR0wgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtc3ViZGl2Ml9TUyh4LCBhLCBiKTsgfQoraW5saW5lIEZJWFBfREJMIGZNdWx0U3ViRGl2MihGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX0RCTCBiKSB7CisgIHJldHVybiBmaXhtc3ViZGl2Ml9ERCh4LCBhLCBiKTsKK30KK2lubGluZSBGSVhQX0RCTCBmTXVsdFN1YkRpdjIoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9EQkwgYikgeworICByZXR1cm4gZml4bXN1YmRpdjJfU0QoeCwgYSwgYik7Cit9CitpbmxpbmUgRklYUF9EQkwgZk11bHRTdWJEaXYyKEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfU0dMIGIpIHsKKyAgcmV0dXJuIGZpeG1zdWJkaXYyX0RTKHgsIGEsIGIpOworfQoraW5saW5lIEZJWFBfREJMIGZNdWx0U3ViRGl2MihGSVhQX0RCTCB4LCBGSVhQX1NHTCBhLCBGSVhQX1NHTCBiKSB7CisgIHJldHVybiBmaXhtc3ViZGl2Ml9TUyh4LCBhLCBiKTsKK30KIAogLyogeSA9IDIqKHgtMC41KmEqYikgPSAoMip4LWEqYikgKi8KLUZES19JTkxJTkUgRklYUF9EQkwgZk11bHRTdWIoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9EQkwgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtc3ViX0REKHgsIGEsIGIpOyB9Ci1pbmxpbmUgRklYUF9EQkwgZk11bHRTdWIoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9EQkwgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtc3ViX1NEKHgsIGEsIGIpOyB9Ci1pbmxpbmUgRklYUF9EQkwgZk11bHRTdWIoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9TR0wgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtc3ViX0RTKHgsIGEsIGIpOyB9Ci1pbmxpbmUgRklYUF9EQkwgZk11bHRTdWIoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9TR0wgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtc3ViX1NTKHgsIGEsIGIpOyB9CitGREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0U3ViKEZJWFBfREJMIHgsIEZJWFBfREJMIGEsIEZJWFBfREJMIGIpIHsKKyAgcmV0dXJuIGZpeG1zdWJfREQoeCwgYSwgYik7Cit9CitpbmxpbmUgRklYUF9EQkwgZk11bHRTdWIoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9EQkwgYikgeworICByZXR1cm4gZml4bXN1Yl9TRCh4LCBhLCBiKTsKK30KK2lubGluZSBGSVhQX0RCTCBmTXVsdFN1YihGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX1NHTCBiKSB7CisgIHJldHVybiBmaXhtc3ViX0RTKHgsIGEsIGIpOworfQoraW5saW5lIEZJWFBfREJMIGZNdWx0U3ViKEZJWFBfREJMIHgsIEZJWFBfU0dMIGEsIEZJWFBfU0dMIGIpIHsKKyAgcmV0dXJuIGZpeG1zdWJfU1MoeCwgYSwgYik7Cit9CiAKLUZES19JTkxJTkUgRklYUF9EQkwgZk11bHRBZGREaXYyQml0RXhhY3QoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9EQkwgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtYWRkZGl2MkJpdEV4YWN0X0REKHgsIGEsIGIpOyB9Ci1GREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0QWRkRGl2MkJpdEV4YWN0KEZJWFBfREJMIHgsIEZJWFBfU0dMIGEsIEZJWFBfREJMIGIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bWFkZGRpdjJCaXRFeGFjdF9TRCh4LCBhLCBiKTsgfQotRkRLX0lOTElORSBGSVhQX0RCTCBmTXVsdEFkZERpdjJCaXRFeGFjdChGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX1NHTCBiKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1hZGRkaXYyQml0RXhhY3RfRFMoeCwgYSwgYik7IH0KLUZES19JTkxJTkUgRklYUF9EQkwgZk11bHRTdWJEaXYyQml0RXhhY3QoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9EQkwgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtc3ViZGl2MkJpdEV4YWN0X0REKHgsIGEsIGIpOyB9Ci1GREtfSU5MSU5FIEZJWFBfREJMIGZNdWx0U3ViRGl2MkJpdEV4YWN0KEZJWFBfREJMIHgsIEZJWFBfU0dMIGEsIEZJWFBfREJMIGIpCi0gICAgICAgICAgICAgICAgeyByZXR1cm4gZml4bXN1YmRpdjJCaXRFeGFjdF9TRCh4LCBhLCBiKTsgfQotRkRLX0lOTElORSBGSVhQX0RCTCBmTXVsdFN1YkRpdjJCaXRFeGFjdChGSVhQX0RCTCB4LCBGSVhQX0RCTCBhLCBGSVhQX1NHTCBiKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1zdWJkaXYyQml0RXhhY3RfRFMoeCwgYSwgYik7IH0KK0ZES19JTkxJTkUgRklYUF9EQkwgZk11bHRBZGREaXYyQml0RXhhY3QoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9EQkwgYikgeworICByZXR1cm4gZml4bWFkZGRpdjJCaXRFeGFjdF9ERCh4LCBhLCBiKTsKK30KK0ZES19JTkxJTkUgRklYUF9EQkwgZk11bHRBZGREaXYyQml0RXhhY3QoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9EQkwgYikgeworICByZXR1cm4gZml4bWFkZGRpdjJCaXRFeGFjdF9TRCh4LCBhLCBiKTsKK30KK0ZES19JTkxJTkUgRklYUF9EQkwgZk11bHRBZGREaXYyQml0RXhhY3QoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9TR0wgYikgeworICByZXR1cm4gZml4bWFkZGRpdjJCaXRFeGFjdF9EUyh4LCBhLCBiKTsKK30KK0ZES19JTkxJTkUgRklYUF9EQkwgZk11bHRTdWJEaXYyQml0RXhhY3QoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9EQkwgYikgeworICByZXR1cm4gZml4bXN1YmRpdjJCaXRFeGFjdF9ERCh4LCBhLCBiKTsKK30KK0ZES19JTkxJTkUgRklYUF9EQkwgZk11bHRTdWJEaXYyQml0RXhhY3QoRklYUF9EQkwgeCwgRklYUF9TR0wgYSwgRklYUF9EQkwgYikgeworICByZXR1cm4gZml4bXN1YmRpdjJCaXRFeGFjdF9TRCh4LCBhLCBiKTsKK30KK0ZES19JTkxJTkUgRklYUF9EQkwgZk11bHRTdWJEaXYyQml0RXhhY3QoRklYUF9EQkwgeCwgRklYUF9EQkwgYSwgRklYUF9TR0wgYikgeworICByZXR1cm4gZml4bXN1YmRpdjJCaXRFeGFjdF9EUyh4LCBhLCBiKTsKK30KIAogI2luY2x1ZGUgImZpeG1pbm1heC5oIgogCi1GREtfSU5MSU5FIEZJWFBfREJMIGZNaW4oRklYUF9EQkwgYSwgRklYUF9EQkwgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtaW5fRChhLGIpOyB9Ci1GREtfSU5MSU5FIEZJWFBfREJMIGZNYXgoRklYUF9EQkwgYSwgRklYUF9EQkwgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtYXhfRChhLGIpOyB9CitGREtfSU5MSU5FIEZJWFBfREJMIGZNaW4oRklYUF9EQkwgYSwgRklYUF9EQkwgYikgeyByZXR1cm4gZml4bWluX0QoYSwgYik7IH0KK0ZES19JTkxJTkUgRklYUF9EQkwgZk1heChGSVhQX0RCTCBhLCBGSVhQX0RCTCBiKSB7IHJldHVybiBmaXhtYXhfRChhLCBiKTsgfQogCi1GREtfSU5MSU5FIEZJWFBfU0dMIGZNaW4oRklYUF9TR0wgYSwgRklYUF9TR0wgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtaW5fUyhhLGIpOyB9Ci1GREtfSU5MSU5FIEZJWFBfU0dMIGZNYXgoRklYUF9TR0wgYSwgRklYUF9TR0wgYikKLSAgICAgICAgICAgICAgICB7IHJldHVybiBmaXhtYXhfUyhhLGIpOyB9CitGREtfSU5MSU5FIEZJWFBfU0dMIGZNaW4oRklYUF9TR0wgYSwgRklYUF9TR0wgYikgeyByZXR1cm4gZml4bWluX1MoYSwgYik7IH0KK0ZES19JTkxJTkUgRklYUF9TR0wgZk1heChGSVhQX1NHTCBhLCBGSVhQX1NHTCBiKSB7IHJldHVybiBmaXhtYXhfUyhhLCBiKTsgfQogCi0vKiB3b3JrYXJvdW5kIGZvciBUSSBDNnggY29tcGlsZXIgYnV0IG5vdCBmb3IgVEkgQVJNOUUgKi8KLSNpZiAoKCFkZWZpbmVkKF9fVElfQ09NUElMRVJfVkVSU0lPTl9fKSB8fCBkZWZpbmVkKF9fVElfVE1TNDcwX1Y1X18pKSAmJiAhZGVmaW5lZChfX0xQNjRfXykpIHx8IChGSVhfRlJBQ1QgPT0gMSkKLUZES19JTkxJTkUgSU5UIGZNYXgoSU5UIGEsIElOVCBiKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1heF9JKGEsYik7IH0KLUZES19JTkxJTkUgSU5UIGZNaW4oSU5UIGEsIElOVCBiKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1pbl9JKGEsYik7IH0KKyNpZiAhZGVmaW5lZChfX0xQNjRfXykKK0ZES19JTkxJTkUgSU5UIGZNYXgoSU5UIGEsIElOVCBiKSB7IHJldHVybiBmaXhtYXhfSShhLCBiKTsgfQorRkRLX0lOTElORSBJTlQgZk1pbihJTlQgYSwgSU5UIGIpIHsgcmV0dXJuIGZpeG1pbl9JKGEsIGIpOyB9CisjaWYgIWRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX194ODZfNjRfXykKK0ZES19JTkxJTkUgU0hPUlQgZk1heChTSE9SVCBhLCBTSE9SVCBiKSB7IHJldHVybiBmaXhtYXhfUyhhLCBiKTsgfQorRkRLX0lOTElORSBTSE9SVCBmTWluKFNIT1JUIGEsIFNIT1JUIGIpIHsgcmV0dXJuIGZpeG1pbl9TKGEsIGIpOyB9CisjZW5kaWYKICNlbmRpZgogCi1pbmxpbmUgVUlOVCBmTWF4KFVJTlQgYSwgVUlOVCBiKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1heF9VSShhLGIpOyB9Ci1pbmxpbmUgVUlOVCBmTWluKFVJTlQgYSwgVUlOVCBiKQotICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeG1pbl9VSShhLGIpOyB9CitpbmxpbmUgVUlOVCBmTWF4KFVJTlQgYSwgVUlOVCBiKSB7IHJldHVybiBmaXhtYXhfVUkoYSwgYik7IH0KK2lubGluZSBVSU5UIGZNaW4oVUlOVCBhLCBVSU5UIGIpIHsgcmV0dXJuIGZpeG1pbl9VSShhLCBiKTsgfQorCitpbmxpbmUgVUNIQVIgZk1heChVQ0hBUiBhLCBVQ0hBUiBiKSB7CisgIHJldHVybiAoVUNIQVIpZml4bWF4X1VJKChVSU5UKWEsIChVSU5UKWIpOworfQoraW5saW5lIFVDSEFSIGZNaW4oVUNIQVIgYSwgVUNIQVIgYikgeworICByZXR1cm4gKFVDSEFSKWZpeG1pbl9VSSgoVUlOVClhLCAoVUlOVCliKTsKK30KIAogLyogQ29tcGxleCBkYXRhIHR5cGVzICovCiB0eXBlZGVmIHNob3VsZEJlVW5pb24gewpAQCAtMzU3LDcgKzQzMSw4IEBACiAgIH0gdjsKICAgLyogd29yZCByZXByZXNlbnRhdGlvbiBmb3IgbWVtb3J5IG1vdmUgKi8KICAgTE9ORyB3OwotfSBGSVhQX1NQSzsKK30KK0ZJWFBfU1BLOwogCiB0eXBlZGVmIHNob3VsZEJlVW5pb24gewogICAvKiB2ZWN0b3IgcmVwcmVzZW50YXRpb24gZm9yIGFyaXRobWV0aWMgKi8KQEAgLTM2NywxMiArNDQyLDEyIEBACiAgIH0gdjsKICAgLyogd29yZCByZXByZXNlbnRhdGlvbiBmb3IgbWVtb3J5IG1vdmUgKi8KICAgSU5UNjQgdzsKLX0gRklYUF9EUEs7Cit9CitGSVhQX0RQSzsKIAogI2luY2x1ZGUgImZpeG11bC5oIgogI2luY2x1ZGUgImZpeG1hZGQuaCIKICNpbmNsdWRlICJjcGx4X211bC5oIgotI2luY2x1ZGUgInNjYWxlLmgiCiAjaW5jbHVkZSAiZml4cG9pbnRfbWF0aC5oIgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL2NwbHhfbXVsLmggYi9saWJGREsvaW5jbHVkZS9jcGx4X211bC5oCmluZGV4IGNlNWM5ZjcuLmViMWFmY2UgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL2NwbHhfbXVsLmgKKysrIGIvbGliRkRLL2luY2x1ZGUvY3BseF9tdWwuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxMTQgKzkwLDExMyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOgorCiAgICBEZXNjcmlwdGlvbjogZml4ZWQgcG9pbnQgaW50cmluc2ljcwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIWRlZmluZWQoQ1BMWF9NVUxfSCkKKyNkZWZpbmUgQ1BMWF9NVUxfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCi0jaWYgIWRlZmluZWQoX19DUExYX011bHRfSF9fKQotI2RlZmluZSBfX0NQTFhfTXVsdF9IX18KLQotI2lmIGRlZmluZWQoX19DQ19BUk0pIHx8IGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfTV9BUk0pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KLSNpbmNsdWRlICJhcm0vY3BseF9tdWwuaCIKKyNpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX01fQVJNKQorI2luY2x1ZGUgImFybS9jcGx4X211bF9hcm0uaCIKIAogI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX21pcHNfXykgJiYgX19taXBzX2lzYV9yZXYgPCA2Ci0jaW5jbHVkZSAibWlwcy9jcGx4X211bC5oIgorI2luY2x1ZGUgIm1pcHMvY3BseF9tdWxfbWlwcy5oIgogCiAjZW5kaWYgLyogI2lmIGRlZmluZWQgYWxsIGNvcmVzOiBiZmluLCBhcm0sIGV0Yy4gKi8KIAotLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgKi8KIAogLyogRmFsbGJhY2sgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbnMgKi8KIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngxNlgyKQogI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTZYMgogCi1pbmxpbmUgdm9pZCBjcGx4TXVsdERpdjIoIEZJWFBfREJMICpjX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX0ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCAgYl9SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgIGJfSW0pCi17Ci0gICpjX1JlID0gZk11bHREaXYyKGFfUmUsYl9SZSkgLSBmTXVsdERpdjIoYV9JbSxiX0ltKTsKLSAgKmNfSW0gPSBmTXVsdERpdjIoYV9SZSxiX0ltKSArIGZNdWx0RGl2MihhX0ltLGJfUmUpOworaW5saW5lIHZvaWQgY3BseE11bHREaXYyKEZJWFBfREJMICpjX1JlLCBGSVhQX0RCTCAqY19JbSwgY29uc3QgRklYUF9EQkwgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhX0ltLCBjb25zdCBGSVhQX1NHTCBiX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGJfSW0pIHsKKyAgKmNfUmUgPSBmTXVsdERpdjIoYV9SZSwgYl9SZSkgLSBmTXVsdERpdjIoYV9JbSwgYl9JbSk7CisgICpjX0ltID0gZk11bHREaXYyKGFfUmUsIGJfSW0pICsgZk11bHREaXYyKGFfSW0sIGJfUmUpOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9jcGx4TXVsdERpdjJfMTZ4MTZYMikKKyNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHREaXYyXzE2eDE2WDIKKworaW5saW5lIHZvaWQgY3BseE11bHREaXYyKEZJWFBfREJMICpjX1JlLCBGSVhQX0RCTCAqY19JbSwgY29uc3QgRklYUF9TR0wgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBhX0ltLCBjb25zdCBGSVhQX1NHTCBiX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGJfSW0pIHsKKyAgKmNfUmUgPSBmTXVsdERpdjIoYV9SZSwgYl9SZSkgLSBmTXVsdERpdjIoYV9JbSwgYl9JbSk7CisgICpjX0ltID0gZk11bHREaXYyKGFfUmUsIGJfSW0pICsgZk11bHREaXYyKGFfSW0sIGJfUmUpOworfQorCitpbmxpbmUgdm9pZCBjcGx4TXVsdERpdjIoRklYUF9TR0wgKmNfUmUsIEZJWFBfU0dMICpjX0ltLCBjb25zdCBGSVhQX1NHTCBhX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGFfSW0sIGNvbnN0IEZJWFBfU0dMIGJfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgYl9JbSkgeworICAqY19SZSA9IEZYX0RCTDJGWF9TR0woZk11bHREaXYyKGFfUmUsIGJfUmUpIC0gZk11bHREaXYyKGFfSW0sIGJfSW0pKTsKKyAgKmNfSW0gPSBGWF9EQkwyRlhfU0dMKGZNdWx0RGl2MihhX1JlLCBiX0ltKSArIGZNdWx0RGl2MihhX0ltLCBiX1JlKSk7CiB9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngxNikKICNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDE2CiAKLWlubGluZSB2b2lkIGNwbHhNdWx0RGl2MiggRklYUF9EQkwgKmNfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjX0ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhX0ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NQSyB3ICkKLXsKK2lubGluZSB2b2lkIGNwbHhNdWx0RGl2MihGSVhQX0RCTCAqY19SZSwgRklYUF9EQkwgKmNfSW0sIGNvbnN0IEZJWFBfREJMIGFfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9JbSwgY29uc3QgRklYUF9TUEsgdykgewogICBjcGx4TXVsdERpdjIoY19SZSwgY19JbSwgYV9SZSwgYV9JbSwgdy52LnJlLCB3LnYuaW0pOwogfQogI2VuZGlmCiAKLSNpZiAhZGVmaW5lZChGVU5DVElPTl9jcGx4TXVsdEFkZERpdjJfMzJ4MTZYMikKLSNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHRBZGREaXYyXzMyeDE2WDIKKyNpZiAhZGVmaW5lZChGVU5DVElPTl9jcGx4TXVsdERpdjJfMTZ4MTYpCisjZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8xNngxNgogCi1pbmxpbmUgdm9pZCBjcGx4TXVsdEFkZERpdjIoIEZJWFBfREJMICpjX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX0ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCAgYl9SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgIGJfSW0pCi17Ci0gICpjX1JlICs9IGZNdWx0RGl2MihhX1JlLGJfUmUpIC0gZk11bHREaXYyKGFfSW0sYl9JbSk7Ci0gICpjX0ltICs9IGZNdWx0RGl2MihhX1JlLGJfSW0pICsgZk11bHREaXYyKGFfSW0sYl9SZSk7CitpbmxpbmUgdm9pZCBjcGx4TXVsdERpdjIoRklYUF9EQkwgKmNfUmUsIEZJWFBfREJMICpjX0ltLCBjb25zdCBGSVhQX1NHTCBhX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGFfSW0sIGNvbnN0IEZJWFBfU1BLIHcpIHsKKyAgY3BseE11bHREaXYyKGNfUmUsIGNfSW0sIGFfUmUsIGFfSW0sIHcudi5yZSwgdy52LmltKTsKK30KKworaW5saW5lIHZvaWQgY3BseE11bHREaXYyKEZJWFBfU0dMICpjX1JlLCBGSVhQX1NHTCAqY19JbSwgY29uc3QgRklYUF9TR0wgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBhX0ltLCBjb25zdCBGSVhQX1NQSyB3KSB7CisgIGNwbHhNdWx0RGl2MihjX1JlLCBjX0ltLCBhX1JlLCBhX0ltLCB3LnYucmUsIHcudi5pbSk7CiB9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2NwbHhNdWx0U3ViRGl2Ml8zMngxNlgyKQogI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdFN1YkRpdjJfMzJ4MTZYMgogCi1pbmxpbmUgdm9pZCBjcGx4TXVsdFN1YkRpdjIoIEZJWFBfREJMICpjX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX0ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCAgYl9SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgIGJfSW0pCi17Ci0gICpjX1JlIC09IGZNdWx0RGl2MihhX1JlLGJfUmUpIC0gZk11bHREaXYyKGFfSW0sYl9JbSk7Ci0gICpjX0ltIC09IGZNdWx0RGl2MihhX1JlLGJfSW0pICsgZk11bHREaXYyKGFfSW0sYl9SZSk7CitpbmxpbmUgdm9pZCBjcGx4TXVsdFN1YkRpdjIoRklYUF9EQkwgKmNfUmUsIEZJWFBfREJMICpjX0ltLCBjb25zdCBGSVhQX0RCTCBhX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGFfSW0sIGNvbnN0IEZJWFBfU0dMIGJfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgYl9JbSkgeworICAqY19SZSAtPSBmTXVsdERpdjIoYV9SZSwgYl9SZSkgLSBmTXVsdERpdjIoYV9JbSwgYl9JbSk7CisgICpjX0ltIC09IGZNdWx0RGl2MihhX1JlLCBiX0ltKSArIGZNdWx0RGl2MihhX0ltLCBiX1JlKTsKIH0KICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDMyWDIpCiAjZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngzMlgyCiAKLWlubGluZSB2b2lkIGNwbHhNdWx0RGl2MiggRklYUF9EQkwgKmNfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjX0ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYV9SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfSW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBiX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYl9JbSkKLXsKLSAgKmNfUmUgPSBmTXVsdERpdjIoYV9SZSxiX1JlKSAtIGZNdWx0RGl2MihhX0ltLGJfSW0pOwotICAqY19JbSA9IGZNdWx0RGl2MihhX1JlLGJfSW0pICsgZk11bHREaXYyKGFfSW0sYl9SZSk7CitpbmxpbmUgdm9pZCBjcGx4TXVsdERpdjIoRklYUF9EQkwgKmNfUmUsIEZJWFBfREJMICpjX0ltLCBjb25zdCBGSVhQX0RCTCBhX1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGFfSW0sIGNvbnN0IEZJWFBfREJMIGJfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYl9JbSkgeworICAqY19SZSA9IGZNdWx0RGl2MihhX1JlLCBiX1JlKSAtIGZNdWx0RGl2MihhX0ltLCBiX0ltKTsKKyAgKmNfSW0gPSBmTXVsdERpdjIoYV9SZSwgYl9JbSkgKyBmTXVsdERpdjIoYV9JbSwgYl9SZSk7CiB9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngzMikKICNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHREaXYyXzMyeDMyCiAKLWlubGluZSB2b2lkIGNwbHhNdWx0RGl2MiggRklYUF9EQkwgKmNfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjX0ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYV9SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfSW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfRFBLICB3KQoteworaW5saW5lIHZvaWQgY3BseE11bHREaXYyKEZJWFBfREJMICpjX1JlLCBGSVhQX0RCTCAqY19JbSwgY29uc3QgRklYUF9EQkwgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhX0ltLCBjb25zdCBGSVhQX0RQSyB3KSB7CiAgIGNwbHhNdWx0RGl2MihjX1JlLCBjX0ltLCBhX1JlLCBhX0ltLCB3LnYucmUsIHcudi5pbSk7CiB9CiAjZW5kaWYKQEAgLTE5NCw0NCArMjA0LDM5IEBACiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fY3BseE11bHRTdWJEaXYyXzMyeDMyWDIpCiAjZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0U3ViRGl2Ml8zMngzMlgyCiAKLWlubGluZSB2b2lkIGNwbHhNdWx0U3ViRGl2MiggRklYUF9EQkwgKmNfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjX0ltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYV9SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfSW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBiX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAgYl9JbSkKLXsKLSAgKmNfUmUgLT0gZk11bHREaXYyKGFfUmUsYl9SZSkgLSBmTXVsdERpdjIoYV9JbSxiX0ltKTsKLSAgKmNfSW0gLT0gZk11bHREaXYyKGFfUmUsYl9JbSkgKyBmTXVsdERpdjIoYV9JbSxiX1JlKTsKK2lubGluZSB2b2lkIGNwbHhNdWx0U3ViRGl2MihGSVhQX0RCTCAqY19SZSwgRklYUF9EQkwgKmNfSW0sIGNvbnN0IEZJWFBfREJMIGFfUmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9JbSwgY29uc3QgRklYUF9EQkwgYl9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBiX0ltKSB7CisgICpjX1JlIC09IGZNdWx0RGl2MihhX1JlLCBiX1JlKSAtIGZNdWx0RGl2MihhX0ltLCBiX0ltKTsKKyAgKmNfSW0gLT0gZk11bHREaXYyKGFfUmUsIGJfSW0pICsgZk11bHREaXYyKGFfSW0sIGJfUmUpOwogfQogI2VuZGlmCiAKLS8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCisgIC8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAqLwogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fY3BseE11bHRfMzJ4MTZYMikKICNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHRfMzJ4MTZYMgogCi1pbmxpbmUgdm9pZCBjcGx4TXVsdCggRklYUF9EQkwgKmNfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNfSW0sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgIGFfSW0sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgIGJfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgIGJfSW0pCi17Ci0gICpjX1JlID0gZk11bHQoYV9SZSxiX1JlKSAtIGZNdWx0KGFfSW0sYl9JbSk7Ci0gICpjX0ltID0gZk11bHQoYV9SZSxiX0ltKSArIGZNdWx0KGFfSW0sYl9SZSk7CitpbmxpbmUgdm9pZCBjcGx4TXVsdChGSVhQX0RCTCAqY19SZSwgRklYUF9EQkwgKmNfSW0sIGNvbnN0IEZJWFBfREJMIGFfUmUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhX0ltLCBjb25zdCBGSVhQX1NHTCBiX1JlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgYl9JbSkgeworICAqY19SZSA9IGZNdWx0KGFfUmUsIGJfUmUpIC0gZk11bHQoYV9JbSwgYl9JbSk7CisgICpjX0ltID0gZk11bHQoYV9SZSwgYl9JbSkgKyBmTXVsdChhX0ltLCBiX1JlKTsKK30KK2lubGluZSB2b2lkIGNwbHhNdWx0KEZJWFBfU0dMICpjX1JlLCBGSVhQX1NHTCAqY19JbSwgY29uc3QgRklYUF9TR0wgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGFfSW0sIGNvbnN0IEZJWFBfU0dMIGJfUmUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCBiX0ltKSB7CisgICpjX1JlID0gRlhfREJMMkZYX1NHTChmTXVsdChhX1JlLCBiX1JlKSAtIGZNdWx0KGFfSW0sIGJfSW0pKTsKKyAgKmNfSW0gPSBGWF9EQkwyRlhfU0dMKGZNdWx0KGFfUmUsIGJfSW0pICsgZk11bHQoYV9JbSwgYl9SZSkpOwogfQogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9jcGx4TXVsdF8zMngxNikKICNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHRfMzJ4MTYKIAotaW5saW5lIHZvaWQgY3BseE11bHQoIEZJWFBfREJMICpjX1JlLAotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjX0ltLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGFfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9JbSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NQSyB3ICkKLXsKK2lubGluZSB2b2lkIGNwbHhNdWx0KEZJWFBfREJMICpjX1JlLCBGSVhQX0RCTCAqY19JbSwgY29uc3QgRklYUF9EQkwgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGFfSW0sIGNvbnN0IEZJWFBfU1BLIHcpIHsKICAgY3BseE11bHQoY19SZSwgY19JbSwgYV9SZSwgYV9JbSwgdy52LnJlLCB3LnYuaW0pOwogfQogI2VuZGlmCkBAIC0yMzksMzEgKzI0NCwyMyBAQAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2NwbHhNdWx0XzMyeDMyWDIpCiAjZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0XzMyeDMyWDIKIAotaW5saW5lIHZvaWQgY3BseE11bHQoIEZJWFBfREJMICpjX1JlLAotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjX0ltLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX1JlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX0ltLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBiX1JlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBiX0ltKQotewotICAqY19SZSA9IGZNdWx0KGFfUmUsYl9SZSkgLSBmTXVsdChhX0ltLGJfSW0pOwotICAqY19JbSA9IGZNdWx0KGFfUmUsYl9JbSkgKyBmTXVsdChhX0ltLGJfUmUpOworaW5saW5lIHZvaWQgY3BseE11bHQoRklYUF9EQkwgKmNfUmUsIEZJWFBfREJMICpjX0ltLCBjb25zdCBGSVhQX0RCTCBhX1JlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9JbSwgY29uc3QgRklYUF9EQkwgYl9SZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGJfSW0pIHsKKyAgKmNfUmUgPSBmTXVsdChhX1JlLCBiX1JlKSAtIGZNdWx0KGFfSW0sIGJfSW0pOworICAqY19JbSA9IGZNdWx0KGFfUmUsIGJfSW0pICsgZk11bHQoYV9JbSwgYl9SZSk7CiB9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2NwbHhNdWx0XzMyeDMyKQogI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdF8zMngzMgotaW5saW5lIHZvaWQgY3BseE11bHQoIEZJWFBfREJMICpjX1JlLAotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjX0ltLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX1JlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICBhX0ltLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfRFBLICB3KQoteworaW5saW5lIHZvaWQgY3BseE11bHQoRklYUF9EQkwgKmNfUmUsIEZJWFBfREJMICpjX0ltLCBjb25zdCBGSVhQX0RCTCBhX1JlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYV9JbSwgY29uc3QgRklYUF9EUEsgdykgewogICBjcGx4TXVsdChjX1JlLCBjX0ltLCBhX1JlLCBhX0ltLCB3LnYucmUsIHcudi5pbSk7CiB9CiAjZW5kaWYKIAotLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KKyAgLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICovCiAKLSNlbmRpZiAvKiBfX0NQTFhfTXVsdF9IX18gKi8KLQorI2VuZGlmIC8qIENQTFhfTVVMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL2RjdC5oIGIvbGliRkRLL2luY2x1ZGUvZGN0LmgKaW5kZXggYWYxZWRkMy4uMzA4YWZjYiAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvZGN0LmgKKysrIGIvbGliRkRLL2luY2x1ZGUvZGN0LmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjQgKzkwLDI2IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CisKICAgIERlc2NyaXB0aW9uOiBMaWJyYXJ5IGZ1bmN0aW9ucyB0byBjYWxjdWxhdGUgc3RhbmRhcmQgRENUcy4gVGhpcyB3aWxsIG1vc3QKICAgICAgICAgICAgICAgICBsaWtlbHkgYmUgcmVwbGFjZWQgYnkgaGFuZC1vcHRpbWl6ZWQgZnVuY3Rpb25zIGZvciB0aGUgc3BlY2lmaWMKICAgICAgICAgICAgICAgICB0YXJnZXQgcHJvY2Vzc29yLgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIF9fZGN0X0gKLSNkZWZpbmUgX19kY3RfSAotCi0KKyNpZm5kZWYgRENUX0gKKyNkZWZpbmUgRENUX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAordm9pZCBkY3RfZ2V0VGFibGVzKGNvbnN0IEZJWFBfV1RQICoqcHR3aWRkbGUsIGNvbnN0IEZJWFBfU1RQICoqc2luX3R3aWRkbGUsCisgICAgICAgICAgICAgICAgICAgaW50ICpzaW5fc3RlcCwgaW50IGxlbmd0aCk7CisKIC8qKgogICogXGJyaWVmIENhbGN1bGF0ZSBEQ1QgdHlwZSBJSSBvZiBnaXZlbiBsZW5ndGguIFRoZSBEQ1QgSVYgaXMKICAqICAgICAgICBjYWxjdWxhdGVkIGJ5IGEgY29tcGxleCBGRlQsIHdpdGggc29tZSBwcmUgYW5kIHBvc3QgdHdpZGRlbGluZy4KQEAgLTEyMSw2ICsxMzQsMTkgQEAKIHZvaWQgZGN0X0lJSShGSVhQX0RCTCAqcERhdCwgRklYUF9EQkwgKnRtcCwgaW50IHNpemUsIGludCAqcERhdF9lKTsKIAogLyoqCisgKiBcYnJpZWYgQ2FsY3VsYXRlIERTVCB0eXBlIElJSSBvZiBnaXZlbiBsZW5ndGguIFRoZSBEU1QgSUlJIGlzCisgKiAgICAgICAgY2FsY3VsYXRlZCBieSBhIERDVCBJSUkgb2YgbWlycm9yZWQgaW5wdXQgYW5kIHNpZ24tZmxpcHBpbmcgb2Ygb2RkCisgKiAgICAgICAgb3V0cHV0IGNvZWZmaWNpZW50cy4KKyAqICAgICAgICBOb3RlIHRoYXQgdGhlIGZhY3RvciAwLjUgZm9yIHRoZSBzdW0gdGVybSB4W04tMV0gaXMgMS4wIGluc3RlYWQgb2YKKyAqIDAuNS4gQSBmYWN0b3Igb2Ygc3FydCgyL04pIGlzIE5PVCBhcHBsaWVkLgorICogXHBhcmFtIHBEYXQgcG9pbnRlciB0byBpbnB1dC9vdXRwdXQgZGF0YSAoaW4gcGxhY2UgcHJvY2Vzc2luZykuCisgKiBccGFyYW0gc2l6ZSBzaXplIG9mIHBEYXQuCisgKiBccGFyYW0gcERhdF9lIHBvaW50ZXIgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBleHBvbmVudCBvZiB0aGUgZGF0YQorICogICAgICAgICAgICAgICByZWZlcmVuY2VkIGJ5IHBEYXQuIFRoZSBleHBvbmVudCBpcyB1cGRhdGVkIGFjY29yZGluZ2x5LgorICovCit2b2lkIGRzdF9JSUkoRklYUF9EQkwgKnBEYXQsIEZJWFBfREJMICp0bXAsIGludCBzaXplLCBpbnQgKnBEYXRfZSk7CisKKy8qKgogICogXGJyaWVmIENhbGN1bGF0ZSBEQ1QgdHlwZSBJViBvZiBnaXZlbiBsZW5ndGguIFRoZSBEQ1QgSVYgaXMKICAqICAgICAgICBjYWxjdWxhdGVkIGJ5IGEgY29tcGxleCBGRlQsIHdpdGggc29tZSBwcmUgYW5kIHBvc3QgdHdpZGRlbGluZy4KICAqICAgICAgICBBIGZhY3RvciBvZiBzcXJ0KDIvTikgaXMgTk9UIGFwcGxpZWQuCkBAIC0xMjksNyArMTU1LDcgQEAKICAqIFxwYXJhbSBwRGF0X2UgcG9pbnRlciB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGV4cG9uZW50IG9mIHRoZSBkYXRhCiAgKiAgICAgICAgICAgICAgIHJlZmVyZW5jZWQgYnkgcERhdC4gVGhlIGV4cG9uZW50IGlzIHVwZGF0ZWQgYWNjb3JkaW5nbHkuCiAgKi8KLXZvaWQgZGN0X0lWKEZJWFBfREJMICpwRGF0LGludCBzaXplLCBpbnQgKnBEYXRfZSk7Cit2b2lkIGRjdF9JVihGSVhQX0RCTCAqcERhdCwgaW50IHNpemUsIGludCAqcERhdF9lKTsKIAogLyoqCiAgKiBcYnJpZWYgQ2FsY3VsYXRlIERTVCB0eXBlIElWIG9mIGdpdmVuIGxlbmd0aC4gVGhlIERTVCBJViBpcwpAQCAtMTQwLDggKzE2Niw2IEBACiAgKiBccGFyYW0gcERhdF9lIHBvaW50ZXIgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBleHBvbmVudCBvZiB0aGUgZGF0YQogICogICAgICAgICAgICAgICByZWZlcmVuY2VkIGJ5IHBEYXQuIFRoZSBleHBvbmVudCBpcyB1cGRhdGVkIGFjY29yZGluZ2x5LgogICovCi12b2lkIGRzdF9JVihGSVhQX0RCTCAqcERhdCxpbnQgc2l6ZSwgaW50ICpwRGF0X2UpOwotCi0KK3ZvaWQgZHN0X0lWKEZJWFBfREJMICpwRGF0LCBpbnQgc2l6ZSwgaW50ICpwRGF0X2UpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL2ZmdC5oIGIvbGliRkRLL2luY2x1ZGUvZmZ0LmgKaW5kZXggNjE2ZjM1MC4uMzU3NmVkMyAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvZmZ0LmgKKysrIGIvbGliRkRLL2luY2x1ZGUvZmZ0LmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTcgKzkwLDE4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsLCBEU1AgU29sdXRpb25zCisKICAgIERlc2NyaXB0aW9uOiBGaXggcG9pbnQgRkZUCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgX19GRlRfSF9fCi0jZGVmaW5lIF9fRkZUX0hfXworI2lmbmRlZiBGRlRfSAorI2RlZmluZSBGRlRfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCkBAIC05NywxMCArMTA5LDEwIEBACiAgKiBcYnJpZWYgUGVyZm9ybSBhbiBpbnBsYWNlIGNvbXBsZXggdmFsdWVkIEZGVCBvZiBsZW5ndGggMl5uCiAgKgogICogXHBhcmFtIGxlbmd0aCBMZW5ndGggb2YgdGhlIEZGVCB0byBiZSBjYWxjdWxhdGVkLgotICogXHBhcmFtIHBJbnB1dCBJbnB1dC9PdXRwdXQgZGF0YSBidWZmZXIuIFRoZSBpbnB1dCBkYXRhIG11c3QgaGF2ZSBhdCBsZWFzdCAxIGJpdCBzY2FsZSBoZWFkcm9vbS4KLSAqICAgICAgICAgIFRoZSB2YWx1ZXMgYXJlIGludGVybGVhdmVkLCByZWFsL2ltYWcgcGFpcnMuCi0gKiBccGFyYW0gc2NhbGVmYWN0b3IgUG9pbnRlciB0byBhbiBJTlQsIHdoaWNoIGNvbnRhaW5zIHRoZSBjdXJyZW50IHNjYWxlIG9mIHRoZSBpbnB1dCBkYXRhLAotICogICAgICAgICAgICAgICAgICAgIHdoaWNoIGlzIHVwZGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBGRlQgc2NhbGUuCisgKiBccGFyYW0gcElucHV0IElucHV0L091dHB1dCBkYXRhIGJ1ZmZlci4gVGhlIGlucHV0IGRhdGEgbXVzdCBoYXZlIGF0IGxlYXN0IDEKKyAqIGJpdCBzY2FsZSBoZWFkcm9vbS4gVGhlIHZhbHVlcyBhcmUgaW50ZXJsZWF2ZWQsIHJlYWwvaW1hZyBwYWlycy4KKyAqIFxwYXJhbSBzY2FsZWZhY3RvciBQb2ludGVyIHRvIGFuIElOVCwgd2hpY2ggY29udGFpbnMgdGhlIGN1cnJlbnQgc2NhbGUgb2YgdGhlCisgKiBpbnB1dCBkYXRhLCB3aGljaCBpcyB1cGRhdGVkIGFjY29yZGluZyB0byB0aGUgRkZUIHNjYWxlLgogICovCiB2b2lkIGZmdChpbnQgbGVuZ3RoLCBGSVhQX0RCTCAqcElucHV0LCBJTlQgKnNjYWxlZmFjdG9yKTsKIApAQCAtMTA4LDE0NiArMTIwLDE0NCBAQAogICogXGJyaWVmIFBlcmZvcm0gYW4gaW5wbGFjZSBjb21wbGV4IHZhbHVlZCBJRkZUIG9mIGxlbmd0aCAyXm4KICAqCiAgKiBccGFyYW0gbGVuZ3RoIExlbmd0aCBvZiB0aGUgRkZUIHRvIGJlIGNhbGN1bGF0ZWQuCi0gKiBccGFyYW0gcElucHV0IElucHV0L091dHB1dCBkYXRhIGJ1ZmZlci4gVGhlIGlucHV0IGRhdGEgbXVzdCBoYXZlIGF0IGxlYXN0IDEgYml0IHNjYWxlIGhlYWRyb29tLgotICogICAgICAgICAgVGhlIHZhbHVlcyBhcmUgaW50ZXJsZWF2ZWQsIHJlYWwvaW1hZyBwYWlycy4KLSAqIFxwYXJhbSBzY2FsZWZhY3RvciBQb2ludGVyIHRvIGFuIElOVCwgd2hpY2ggY29udGFpbnMgdGhlIGN1cnJlbnQgc2NhbGUgb2YgdGhlIGlucHV0IGRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgdXBkYXRlZCBhY2NvcmRpbmcgdG8gdGhlIElGRlQgc2NhbGUuCisgKiBccGFyYW0gcElucHV0IElucHV0L091dHB1dCBkYXRhIGJ1ZmZlci4gVGhlIGlucHV0IGRhdGEgbXVzdCBoYXZlIGF0IGxlYXN0IDEKKyAqIGJpdCBzY2FsZSBoZWFkcm9vbS4gVGhlIHZhbHVlcyBhcmUgaW50ZXJsZWF2ZWQsIHJlYWwvaW1hZyBwYWlycy4KKyAqIFxwYXJhbSBzY2FsZWZhY3RvciBQb2ludGVyIHRvIGFuIElOVCwgd2hpY2ggY29udGFpbnMgdGhlIGN1cnJlbnQgc2NhbGUgb2YgdGhlCisgKiBpbnB1dCBkYXRhLCB3aGljaCBpcyB1cGRhdGVkIGFjY29yZGluZyB0byB0aGUgSUZGVCBzY2FsZS4KICAqLwogdm9pZCBpZmZ0KGludCBsZW5ndGgsIEZJWFBfREJMICpwSW5wdXQsIElOVCAqc2NhbGVmYWN0b3IpOwogCi0KIC8qCiAgKiBGcmVxdWVudGx5IHVzZWQgYW5kIGZpeGVkIHNob3J0IGxlbmd0aCBGRlRzLgogICovCiAKLUxOS19TRUNUSU9OX0NPREVfTDEKLXN0YXRpYyB2b2lkIEZPUkNFSU5MSU5FIGZmdF80KEZJWFBfREJMICp4KQotewotICAgIEZJWFBfREJMIGEwMCwgYTEwLCBhMjAsIGEzMCwgdG1wMCwgdG1wMTsKLQotICAgIGEwMCA9ICh4WzBdICsgeFs0XSk+PjE7ICAvKiBSZSBBICsgUmUgQiAqLwotICAgIGExMCA9ICh4WzJdICsgeFs2XSk+PjE7ICAvKiBSZSBDICsgUmUgRCAqLwotICAgIGEyMCA9ICh4WzFdICsgeFs1XSk+PjE7ICAvKiBJbSBBICsgSW0gQiAqLwotICAgIGEzMCA9ICh4WzNdICsgeFs3XSk+PjE7ICAvKiBJbSBDICsgSW0gRCAqLwotCi0gICAgeFswXSA9IGEwMCArIGExMDsgICAgICAgLyogUmUgQScgPSBSZSBBICsgUmUgQiArIFJlIEMgKyBSZSBEICovCi0gICAgeFsxXSA9IGEyMCArIGEzMDsgICAgICAgLyogSW0gQScgPSBJbSBBICsgSW0gQiArIEltIEMgKyBJbSBEICovCi0KLSAgICB0bXAwID0gYTAwIC0geFs0XTsgICAgICAgLyogUmUgQSAtIFJlIEIgKi8KLSAgICB0bXAxID0gYTIwIC0geFs1XTsgICAgICAgLyogSW0gQSAtIEltIEIgKi8KLQotICAgIHhbNF0gPSBhMDAgLSBhMTA7ICAgICAgIC8qIFJlIEMnID0gUmUgQSArIFJlIEIgLSBSZSBDIC0gUmUgRCAqLwotICAgIHhbNV0gPSBhMjAgLSBhMzA7ICAgICAgIC8qIEltIEMnID0gSW0gQSArIEltIEIgLSBJbSBDIC0gSW0gRCAqLwotCi0gICAgYTEwID0gYTEwIC0geFs2XTsgICAgICAgLyogUmUgQyAtIFJlIEQgKi8KLSAgICBhMzAgPSBhMzAgLSB4WzddOyAgICAgICAvKiBJbSBDIC0gSW0gRCAqLwotCi0gICAgeFsyXSA9IHRtcDAgKyBhMzA7ICAgICAgIC8qIFJlIEInID0gUmUgQSAtIFJlIEIgKyBJbSBDIC0gSW0gRCAqLwotICAgIHhbNl0gPSB0bXAwIC0gYTMwOyAgICAgICAvKiBSZSBEJyA9IFJlIEEgLSBSZSBCIC0gSW0gQyArIEltIEQgKi8KLSAgICB4WzNdID0gdG1wMSAtIGExMDsgICAgICAgLyogSW0gQicgPSBJbSBBIC0gSW0gQiAtIFJlIEMgKyBSZSBEICovCi0gICAgeFs3XSA9IHRtcDEgKyBhMTA7ICAgICAgIC8qIEltIEQnID0gSW0gQSAtIEltIEIgKyBSZSBDIC0gUmUgRCAqLwotfQotCi1MTktfU0VDVElPTl9DT0RFX0wxCi1zdGF0aWMgdm9pZCBGT1JDRUlOTElORSBmZnRfOChGSVhQX0RCTCAqeCkKLXsKLSAgICAgICNkZWZpbmUgV19QaUZPVVJUSCBTVEMoMHg1YTgyNzk5YSkKLQotICAgICAgRklYUF9EQkwgYTAwLCBhMTAsIGEyMCwgYTMwOwotICAgICAgRklYUF9EQkwgeVsxNl07Ci0KLSAgICAgIGEwMCA9ICh4WzBdICsgeFs4XSk+PjE7Ci0gICAgICBhMTAgPSAgeFs0XSArIHhbMTJdOwotICAgICAgYTIwID0gKHhbMV0gKyB4WzldKT4+MTsKLSAgICAgIGEzMCA9ICB4WzVdICsgeFsxM107Ci0KLSAgICAgIHlbMF0gPSBhMDAgKyAoYTEwPj4xKTsKLSAgICAgIHlbNF0gPSBhMDAgLSAoYTEwPj4xKTsKLSAgICAgIHlbMV0gPSBhMjAgKyAoYTMwPj4xKTsKLSAgICAgIHlbNV0gPSBhMjAgLSAoYTMwPj4xKTsKLQotICAgICAgYTAwID0gYTAwICAgICAgLSB4WzhdOwotICAgICAgYTEwID0gKGExMD4+MSkgLSB4WzEyXTsKLSAgICAgIGEyMCA9IGEyMCAgICAgIC0geFs5XTsKLSAgICAgIGEzMCA9IChhMzA+PjEpIC0geFsxM107Ci0KLSAgICAgIHlbMl0gPSBhMDAgKyBhMzA7Ci0gICAgICB5WzZdID0gYTAwIC0gYTMwOwotICAgICAgeVszXSA9IGEyMCAtIGExMDsKLSAgICAgIHlbN10gPSBhMjAgKyBhMTA7Ci0KLSAgICAgIGEwMCA9ICh4WzJdICsgeFsxMF0pPj4xOwotICAgICAgYTEwID0gIHhbNl0gKyB4WzE0XTsKLSAgICAgIGEyMCA9ICh4WzNdICsgeFsxMV0pPj4xOwotICAgICAgYTMwID0gIHhbN10gKyB4WzE1XTsKLQotICAgICAgeVs4XSAgPSBhMDAgKyAoYTEwPj4xKTsKLSAgICAgIHlbMTJdID0gYTAwIC0gKGExMD4+MSk7Ci0gICAgICB5WzldICA9IGEyMCArIChhMzA+PjEpOwotICAgICAgeVsxM10gPSBhMjAgLSAoYTMwPj4xKTsKLQotICAgICAgYTAwID0gYTAwICAgICAgLSB4WzEwXTsKLSAgICAgIGExMCA9IChhMTA+PjEpIC0geFsxNF07Ci0gICAgICBhMjAgPSBhMjAgICAgICAtIHhbMTFdOwotICAgICAgYTMwID0gKGEzMD4+MSkgLSB4WzE1XTsKLQotICAgICAgeVsxMF0gPSBhMDAgKyBhMzA7Ci0gICAgICB5WzE0XSA9IGEwMCAtIGEzMDsKLSAgICAgIHlbMTFdID0gYTIwIC0gYTEwOwotICAgICAgeVsxNV0gPSBhMjAgKyBhMTA7Ci0KLSAgICAgIEZJWFBfREJMIHZyLCB2aSwgdXIsIHVpOwotCi0gICAgICB1ciA9IHlbMF0+PjE7Ci0gICAgICB1aSA9IHlbMV0+PjE7Ci0gICAgICB2ciA9IHlbOF07Ci0gICAgICB2aSA9IHlbOV07Ci0gICAgICB4WzBdID0gdXIgKyAodnI+PjEpOwotICAgICAgeFsxXSA9IHVpICsgKHZpPj4xKTsKLSAgICAgIHhbOF0gPSB1ciAtICh2cj4+MSk7Ci0gICAgICB4WzldID0gdWkgLSAodmk+PjEpOwotCi0gICAgICB1ciA9IHlbNF0+PjE7Ci0gICAgICB1aSA9IHlbNV0+PjE7Ci0gICAgICB2aSA9IHlbMTJdOwotICAgICAgdnIgPSB5WzEzXTsKLSAgICAgIHhbNF0gID0gdXIgKyAodnI+PjEpOwotICAgICAgeFs1XSAgPSB1aSAtICh2aT4+MSk7Ci0gICAgICB4WzEyXSA9IHVyIC0gKHZyPj4xKTsKLSAgICAgIHhbMTNdID0gdWkgKyAodmk+PjEpOwotCi0gICAgICB1ciA9IHlbMTBdOwotICAgICAgdWkgPSB5WzExXTsKLSAgICAgIHZyID0gZk11bHREaXYyKHVpK3VyLFdfUGlGT1VSVEgpOwotICAgICAgdmkgPSBmTXVsdERpdjIodWktdXIsV19QaUZPVVJUSCk7Ci0gICAgICB1ciA9IHlbMl07Ci0gICAgICB1aSA9IHlbM107Ci0gICAgICB4WzJdICA9ICh1cj4+MSkgKyB2cjsKLSAgICAgIHhbM10gID0gKHVpPj4xKSArIHZpOwotICAgICAgeFsxMF0gPSAodXI+PjEpIC0gdnI7Ci0gICAgICB4WzExXSA9ICh1aT4+MSkgLSB2aTsKLQotICAgICAgdXIgPSB5WzE0XTsKLSAgICAgIHVpID0geVsxNV07Ci0gICAgICB2ciA9IGZNdWx0RGl2Mih1aS11cixXX1BpRk9VUlRIKTsKLSAgICAgIHZpID0gZk11bHREaXYyKHVpK3VyLFdfUGlGT1VSVEgpOwotICAgICAgdXIgPSB5WzZdOwotICAgICAgdWkgPSB5WzddOwotICAgICAgeFs2XSAgPSAodXI+PjEpICsgdnI7Ci0gICAgICB4WzddICA9ICh1aT4+MSkgLSB2aTsKLSAgICAgIHhbMTRdID0gKHVyPj4xKSAtIHZyOwotICAgICAgeFsxNV0gPSAodWk+PjEpICsgdmk7Ci19Ci0KKyNpZm5kZWYgRlVOQ1RJT05fZmZ0XzQKIC8qKgotICogXGJyaWVmIEZGVCBvZiBmaXhlZCBsZW5ndGggMTYKKyAqIFxicmllZiBQZXJmb3JtIGFuIGlucGxhY2UgY29tcGxleCB2YWx1ZWQgRkZUIG9mIGxlbmd0aCA0CisgKgorICogXHBhcmFtIHBJbnB1dCBJbnB1dC9PdXRwdXQgZGF0YSBidWZmZXIuIFRoZSBpbnB1dCBkYXRhIG11c3QgaGF2ZSBhdCBsZWFzdCAxCisgKiBiaXQgc2NhbGUgaGVhZHJvb20uIFRoZSB2YWx1ZXMgYXJlIGludGVybGVhdmVkLCByZWFsL2ltYWcgcGFpcnMuCiAgKi8KLWlubGluZSB2b2lkIGZmdF8xNihGSVhQX0RCTCAqeCk7CitMTktfU0VDVElPTl9DT0RFX0wxCitzdGF0aWMgdm9pZCBGREtfRk9SQ0VJTkxJTkUgZmZ0XzQoRklYUF9EQkwgKngpIHsKKyAgRklYUF9EQkwgYTAwLCBhMTAsIGEyMCwgYTMwLCB0bXAwLCB0bXAxOwogCi0vKioKLSAqIFxicmllZiBGRlQgb2YgZml4ZWQgbGVuZ3RoIDMyCi0gKi8KLWlubGluZSB2b2lkIGZmdF8zMihGSVhQX0RCTCAqeCk7CisgIGEwMCA9ICh4WzBdICsgeFs0XSkgPj4gMTsgLyogUmUgQSArIFJlIEIgKi8KKyAgYTEwID0gKHhbMl0gKyB4WzZdKSA+PiAxOyAvKiBSZSBDICsgUmUgRCAqLworICBhMjAgPSAoeFsxXSArIHhbNV0pID4+IDE7IC8qIEltIEEgKyBJbSBCICovCisgIGEzMCA9ICh4WzNdICsgeFs3XSkgPj4gMTsgLyogSW0gQyArIEltIEQgKi8KIAorICB4WzBdID0gYTAwICsgYTEwOyAvKiBSZSBBJyA9IFJlIEEgKyBSZSBCICsgUmUgQyArIFJlIEQgKi8KKyAgeFsxXSA9IGEyMCArIGEzMDsgLyogSW0gQScgPSBJbSBBICsgSW0gQiArIEltIEMgKyBJbSBEICovCisKKyAgdG1wMCA9IGEwMCAtIHhbNF07IC8qIFJlIEEgLSBSZSBCICovCisgIHRtcDEgPSBhMjAgLSB4WzVdOyAvKiBJbSBBIC0gSW0gQiAqLworCisgIHhbNF0gPSBhMDAgLSBhMTA7IC8qIFJlIEMnID0gUmUgQSArIFJlIEIgLSBSZSBDIC0gUmUgRCAqLworICB4WzVdID0gYTIwIC0gYTMwOyAvKiBJbSBDJyA9IEltIEEgKyBJbSBCIC0gSW0gQyAtIEltIEQgKi8KKworICBhMTAgPSBhMTAgLSB4WzZdOyAvKiBSZSBDIC0gUmUgRCAqLworICBhMzAgPSBhMzAgLSB4WzddOyAvKiBJbSBDIC0gSW0gRCAqLworCisgIHhbMl0gPSB0bXAwICsgYTMwOyAvKiBSZSBCJyA9IFJlIEEgLSBSZSBCICsgSW0gQyAtIEltIEQgKi8KKyAgeFs2XSA9IHRtcDAgLSBhMzA7IC8qIFJlIEQnID0gUmUgQSAtIFJlIEIgLSBJbSBDICsgSW0gRCAqLworICB4WzNdID0gdG1wMSAtIGExMDsgLyogSW0gQicgPSBJbSBBIC0gSW0gQiAtIFJlIEMgKyBSZSBEICovCisgIHhbN10gPSB0bXAxICsgYTEwOyAvKiBJbSBEJyA9IEltIEEgLSBJbSBCICsgUmUgQyAtIFJlIEQgKi8KK30KKyNlbmRpZiAvKiBGVU5DVElPTl9mZnRfNCAqLworCisjaWZuZGVmIEZVTkNUSU9OX2ZmdF84CitMTktfU0VDVElPTl9DT0RFX0wxCitzdGF0aWMgdm9pZCBGREtfRk9SQ0VJTkxJTkUgZmZ0XzgoRklYUF9EQkwgKngpIHsKKyAgRklYUF9TUEsgd19QaUZPVVJUSCA9IHt7RklYUF9TR0woMHg1QTgyKSwgRklYUF9TR0woMHg1QTgyKX19OworCisgIEZJWFBfREJMIGEwMCwgYTEwLCBhMjAsIGEzMDsKKyAgRklYUF9EQkwgeVsxNl07CisKKyAgYTAwID0gKHhbMF0gKyB4WzhdKSA+PiAxOworICBhMTAgPSB4WzRdICsgeFsxMl07CisgIGEyMCA9ICh4WzFdICsgeFs5XSkgPj4gMTsKKyAgYTMwID0geFs1XSArIHhbMTNdOworCisgIHlbMF0gPSBhMDAgKyAoYTEwID4+IDEpOworICB5WzRdID0gYTAwIC0gKGExMCA+PiAxKTsKKyAgeVsxXSA9IGEyMCArIChhMzAgPj4gMSk7CisgIHlbNV0gPSBhMjAgLSAoYTMwID4+IDEpOworCisgIGEwMCA9IGEwMCAtIHhbOF07CisgIGExMCA9IChhMTAgPj4gMSkgLSB4WzEyXTsKKyAgYTIwID0gYTIwIC0geFs5XTsKKyAgYTMwID0gKGEzMCA+PiAxKSAtIHhbMTNdOworCisgIHlbMl0gPSBhMDAgKyBhMzA7CisgIHlbNl0gPSBhMDAgLSBhMzA7CisgIHlbM10gPSBhMjAgLSBhMTA7CisgIHlbN10gPSBhMjAgKyBhMTA7CisKKyAgYTAwID0gKHhbMl0gKyB4WzEwXSkgPj4gMTsKKyAgYTEwID0geFs2XSArIHhbMTRdOworICBhMjAgPSAoeFszXSArIHhbMTFdKSA+PiAxOworICBhMzAgPSB4WzddICsgeFsxNV07CisKKyAgeVs4XSA9IGEwMCArIChhMTAgPj4gMSk7CisgIHlbMTJdID0gYTAwIC0gKGExMCA+PiAxKTsKKyAgeVs5XSA9IGEyMCArIChhMzAgPj4gMSk7CisgIHlbMTNdID0gYTIwIC0gKGEzMCA+PiAxKTsKKworICBhMDAgPSBhMDAgLSB4WzEwXTsKKyAgYTEwID0gKGExMCA+PiAxKSAtIHhbMTRdOworICBhMjAgPSBhMjAgLSB4WzExXTsKKyAgYTMwID0gKGEzMCA+PiAxKSAtIHhbMTVdOworCisgIHlbMTBdID0gYTAwICsgYTMwOworICB5WzE0XSA9IGEwMCAtIGEzMDsKKyAgeVsxMV0gPSBhMjAgLSBhMTA7CisgIHlbMTVdID0gYTIwICsgYTEwOworCisgIEZJWFBfREJMIHZyLCB2aSwgdXIsIHVpOworCisgIHVyID0geVswXSA+PiAxOworICB1aSA9IHlbMV0gPj4gMTsKKyAgdnIgPSB5WzhdOworICB2aSA9IHlbOV07CisgIHhbMF0gPSB1ciArICh2ciA+PiAxKTsKKyAgeFsxXSA9IHVpICsgKHZpID4+IDEpOworICB4WzhdID0gdXIgLSAodnIgPj4gMSk7CisgIHhbOV0gPSB1aSAtICh2aSA+PiAxKTsKKworICB1ciA9IHlbNF0gPj4gMTsKKyAgdWkgPSB5WzVdID4+IDE7CisgIHZpID0geVsxMl07CisgIHZyID0geVsxM107CisgIHhbNF0gPSB1ciArICh2ciA+PiAxKTsKKyAgeFs1XSA9IHVpIC0gKHZpID4+IDEpOworICB4WzEyXSA9IHVyIC0gKHZyID4+IDEpOworICB4WzEzXSA9IHVpICsgKHZpID4+IDEpOworCisgIHVyID0geVsxMF07CisgIHVpID0geVsxMV07CisKKyAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB1aSwgdXIsIHdfUGlGT1VSVEgpOworCisgIHVyID0geVsyXTsKKyAgdWkgPSB5WzNdOworICB4WzJdID0gKHVyID4+IDEpICsgdnI7CisgIHhbM10gPSAodWkgPj4gMSkgKyB2aTsKKyAgeFsxMF0gPSAodXIgPj4gMSkgLSB2cjsKKyAgeFsxMV0gPSAodWkgPj4gMSkgLSB2aTsKKworICB1ciA9IHlbMTRdOworICB1aSA9IHlbMTVdOworCisgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgdWksIHVyLCB3X1BpRk9VUlRIKTsKKworICB1ciA9IHlbNl07CisgIHVpID0geVs3XTsKKyAgeFs2XSA9ICh1ciA+PiAxKSArIHZyOworICB4WzddID0gKHVpID4+IDEpIC0gdmk7CisgIHhbMTRdID0gKHVyID4+IDEpIC0gdnI7CisgIHhbMTVdID0gKHVpID4+IDEpICsgdmk7Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fZmZ0XzggKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9mZnRfcmFkMi5oIGIvbGliRkRLL2luY2x1ZGUvZmZ0X3JhZDIuaAppbmRleCA5MGQxNGRhLi5iODIwYjdkIDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9mZnRfcmFkMi5oCisrKyBiL2xpYkZESy9pbmNsdWRlL2ZmdF9yYWQyLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNTYgKzkwLDMyIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyLCBNLiBHYXllcgorCiAgICBEZXNjcmlwdGlvbjoKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfRkZUX1JBRDJfSAotI2RlZmluZSBfRkZUX1JBRDJfSAotCisjaWZuZGVmIEZGVF9SQUQyX0gKKyNkZWZpbmUgRkZUX1JBRDJfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCiAvKioKICAqIFxicmllZiBQZXJmb3JtZSBhbiBpbnBsYWNlICBjb21wbGV4IHZhbHVlZCBGRlQgb2YgMl5uIGxlbmd0aAogICoKLSAqIFxwYXJhbSB4IElucHV0L091dHB1dCBkYXRhIGJ1ZmZlci4gVGhlIGlucHV0IGRhdGEgbXVzdCBoYXZlIGF0IGxlYXN0IDEgYml0IHNjYWxlIGhlYWRyb29tLgotICogICAgICAgICAgVGhlIHZhbHVlcyBhcmUgaW50ZXJsZWF2ZWQsIHJlYWwvaW1hZyBwYWlycy4KKyAqIFxwYXJhbSB4IElucHV0L091dHB1dCBkYXRhIGJ1ZmZlci4gVGhlIGlucHV0IGRhdGEgbXVzdCBoYXZlIGF0IGxlYXN0IDEgYml0CisgKiBzY2FsZSBoZWFkcm9vbS4gVGhlIHZhbHVlcyBhcmUgaW50ZXJsZWF2ZWQsIHJlYWwvaW1hZyBwYWlycy4KICAqIFxwYXJhbSBsZG4gbG9nMiBvZiBGRlQgbGVuZ3RoCi0gKiBccGFyYW0gdHJpZ2RhdGEgUG9pbnRlciB0byBhIHNpbmV0YWJsZSBvZiBhIGxlbmd0aCBvZiBhdCBsZWFzdCAoMl5sZG4pLzIgc2luZSB2YWx1ZXMuCisgKiBccGFyYW0gdHJpZ2RhdGEgUG9pbnRlciB0byBhIHNpbmV0YWJsZSBvZiBhIGxlbmd0aCBvZiBhdCBsZWFzdCAoMl5sZG4pLzIgc2luZQorICogdmFsdWVzLgogICogXHBhcmFtIHRyaWdEYXRhU2l6ZSBsZW5ndGggb2YgdGhlIHNpbmV0YWJsZSAidHJpZ2RhdGEiLgogICovCi12b2lkIGRpdF9mZnQoRklYUF9EQkwgKngsIGNvbnN0IElOVCBsZG4sIGNvbnN0IEZJWFBfU1RQICp0cmlnZGF0YSwgY29uc3QgSU5UIHRyaWdEYXRhU2l6ZSkgOwordm9pZCBkaXRfZmZ0KEZJWFBfREJMICp4LCBjb25zdCBJTlQgbGRuLCBjb25zdCBGSVhQX1NUUCAqdHJpZ2RhdGEsCisgICAgICAgICAgICAgY29uc3QgSU5UIHRyaWdEYXRhU2l6ZSk7CiAKLS8qKgotICogXGJyaWVmIFBlcmZvcm1lIGFuIGlucGxhY2UgY29tcGxleCB2YWx1ZWQgaW52ZXJzZSBGRlQgb2YgMl5uIGxlbmd0aAotICoKLSAqIFxwYXJhbSB4IElucHV0L091dHB1dCBkYXRhIGJ1ZmZlci4gVGhlIGlucHV0IGRhdGEgbXVzdCBoYXZlIGF0IGxlYXN0IDEgYml0IHNjYWxlIGhlYWRyb29tLgotICogICAgICAgICAgVGhlIHZhbHVlcyBhcmUgaW50ZXJsZWF2ZWQsIHJlYWwvaW1hZyBwYWlycy4KLSAqIFxwYXJhbSBsZG4gbG9nMiBvZiBGRlQgbGVuZ3RoCi0gKiBccGFyYW0gdHJpZ2RhdGEgUG9pbnRlciB0byBhIHNpbmV0YWJsZSBvZiBhIGxlbmd0aCBvZiBhdCBsZWFzdCAoMl5sZG4pLzIgc2luZSB2YWx1ZXMuCi0gKiBccGFyYW0gdHJpZ0RhdGFTaXplIGxlbmd0aCBvZiB0aGUgc2luZXRhYmxlICJ0cmlnZGF0YSIuCi0gKi8KLXZvaWQgZGl0X2lmZnQoRklYUF9EQkwgKngsIGNvbnN0IElOVCBsZG4sIGNvbnN0IEZJWFBfU1RQICp0cmlnZGF0YSwgY29uc3QgSU5UIHRyaWdEYXRhU2l6ZSkgOwotCi0vKiBSZXN0IG9mIHRoZSB3b3JsZC4gKi8KLQotI2RlZmluZSBTQ0FMRUZBQ1RPUjIwNDggICAgICAgMTAKLSNkZWZpbmUgU0NBTEVGQUNUT1IxMDI0ICAgICAgICA5Ci0jZGVmaW5lIFNDQUxFRkFDVE9SNTEyICAgICAgICAgOAotI2RlZmluZSBTQ0FMRUZBQ1RPUjI1NiAgICAgICAgIDcKLSNkZWZpbmUgU0NBTEVGQUNUT1IxMjggICAgICAgICA2Ci0jZGVmaW5lIFNDQUxFRkFDVE9SNjQgICAgICAgICAgNQotI2RlZmluZSBTQ0FMRUZBQ1RPUjMyICAgICAgICAgIDQKLSNkZWZpbmUgU0NBTEVGQUNUT1IxNiAgICAgICAgICAzCi0jZGVmaW5lIFNDQUxFRkFDVE9SOCAgICAgICAgICAgMgotI2RlZmluZSBTQ0FMRUZBQ1RPUjQgICAgICAgICAgIDEKLSNkZWZpbmUgU0NBTEVGQUNUT1IyICAgICAgICAgICAxCi0KLSNlbmRpZiAvKiBfRkZUX1JBRDJfSCAqLwotCisjZW5kaWYgLyogRkZUX1JBRDJfSCAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvZml4bWFkZC5oIGIvbGliRkRLL2luY2x1ZGUvZml4bWFkZC5oCmluZGV4IDg1MWI3YTIuLjE2NzI0NTYgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL2ZpeG1hZGQuaAorKysgYi9saWJGREsvaW5jbHVkZS9maXhtYWRkLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTcgKzkwLDE4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgTS4gTG9od2Fzc2VyLCBNLiBHYXllcgorCiAgICBEZXNjcmlwdGlvbjogZml4ZWQgcG9pbnQgaW50cmluc2ljcwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgIWRlZmluZWQoX19GSVhNQUREX0hfXykKLSNkZWZpbmUgX19GSVhNQUREX0hfXworI2lmICFkZWZpbmVkKEZJWE1BRERfSCkKKyNkZWZpbmUgRklYTUFERF9ICiAKICNpbmNsdWRlICJGREtfYXJjaGRlZi5oIgogI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgpAQCAtOTgsOSArMTEwLDYgQEAKICNpZiBkZWZpbmVkKF9fYXJtX18pCiAjaW5jbHVkZSAiYXJtL2ZpeG1hZGRfYXJtLmgiCiAKLSNlbGlmIGRlZmluZWQoX19taXBzX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KLSNpbmNsdWRlICJtaXBzL2ZpeG1hZGRfbWlwcy5oIgotCiAjZW5kaWYgLyogYWxsIGNvcmVzICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMTIsMTIgKzEyMSwxMyBAQAogLyogRGl2aWRlIGJ5IHR3byB2ZXJzaW9ucy4gKi8KIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1hZGRkaXYyX0REKQotaW5saW5lIEZJWFBfREJMIGZpeG1hZGRkaXYyX0REIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKQotICAgICAgICAgICAgeyByZXR1cm4gKHggKyBmTXVsdERpdjIgKGEsIGIpKTsgfQoraW5saW5lIEZJWFBfREJMIGZpeG1hZGRkaXYyX0REKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfREJMIGIpIHsKKyAgcmV0dXJuICh4ICsgZk11bHREaXYyKGEsIGIpKTsKK30KICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bWFkZGRpdjJfU0QpCi1pbmxpbmUgRklYUF9EQkwgZml4bWFkZGRpdjJfU0QgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfU0dMIGEsIGNvbnN0IEZJWFBfREJMIGIpIHsKK2lubGluZSBGSVhQX0RCTCBmaXhtYWRkZGl2Ml9TRChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CiAjaWZkZWYgRlVOQ1RJT05fZml4bWFkZGRpdjJfRFMKICAgcmV0dXJuIGZpeG1hZGRkaXYyX0RTKHgsIGIsIGEpOwogI2Vsc2UKQEAgLTEyNyw3ICsxMzcsNyBAQAogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtYWRkZGl2Ml9EUykKLWlubGluZSBGSVhQX0RCTCBmaXhtYWRkZGl2Ml9EUyAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9TR0wgYikgeworaW5saW5lIEZJWFBfREJMIGZpeG1hZGRkaXYyX0RTKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfU0dMIGIpIHsKICNpZmRlZiBGVU5DVElPTl9maXhtYWRkZGl2Ml9TRAogICByZXR1cm4gZml4bWFkZGRpdjJfU0QoeCwgYiwgYSk7CiAjZWxzZQpAQCAtMTM3LDE3ICsxNDcsMTkgQEAKICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bWFkZGRpdjJfU1MpCi1pbmxpbmUgRklYUF9EQkwgZml4bWFkZGRpdjJfU1MgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfU0dMIGEsIGNvbnN0IEZJWFBfU0dMIGIpCi0gICAgICAgICAgICB7IHJldHVybiB4ICsgZk11bHREaXYyKGEsYik7IH0KK2lubGluZSBGSVhQX0RCTCBmaXhtYWRkZGl2Ml9TUyhGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX1NHTCBiKSB7CisgIHJldHVybiB4ICsgZk11bHREaXYyKGEsIGIpOworfQogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtc3ViZGl2Ml9ERCkKLWlubGluZSBGSVhQX0RCTCBmaXhtc3ViZGl2Ml9ERCAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikKLSAgICAgICAgICAgIHsgcmV0dXJuICh4IC0gZk11bHREaXYyIChhLCBiKSk7IH0KK2lubGluZSBGSVhQX0RCTCBmaXhtc3ViZGl2Ml9ERChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CisgIHJldHVybiAoeCAtIGZNdWx0RGl2MihhLCBiKSk7Cit9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1zdWJkaXYyX1NEKQotaW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyX1NEIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CitpbmxpbmUgRklYUF9EQkwgZml4bXN1YmRpdjJfU0QoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9EQkwgYikgewogI2lmZGVmIEZVTkNUSU9OX2ZpeG1zdWJkaXYyX0RTCiAgIHJldHVybiBmaXhtc3ViZGl2Ml9EUyh4LCBiLCBhKTsKICNlbHNlCkBAIC0xNTcsNyArMTY5LDcgQEAKICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXN1YmRpdjJfRFMpCi1pbmxpbmUgRklYUF9EQkwgZml4bXN1YmRpdjJfRFMgKEZJWFBfREJMIHgsIGNvbnN0IEZJWFBfREJMIGEsIGNvbnN0IEZJWFBfU0dMIGIpIHsKK2lubGluZSBGSVhQX0RCTCBmaXhtc3ViZGl2Ml9EUyhGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX1NHTCBiKSB7CiAjaWZkZWYgRlVOQ1RJT05fZml4bXN1YmRpdjJfU0QKICAgcmV0dXJuIGZpeG1zdWJkaXYyX1NEKHgsIGIsIGEpOwogI2Vsc2UKQEAgLTE2NywyMCArMTc5LDIyIEBACiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1zdWJkaXYyX1NTKQotaW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyX1NTIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX1NHTCBiKQotICAgICAgICAgICAgeyByZXR1cm4geCAtIGZNdWx0RGl2MihhLGIpOyB9CitpbmxpbmUgRklYUF9EQkwgZml4bXN1YmRpdjJfU1MoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9TR0wgYikgeworICByZXR1cm4geCAtIGZNdWx0RGl2MihhLCBiKTsKK30KICNlbmRpZgogCi0KICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtYWRkZGl2MkJpdEV4YWN0X0REKQogI2RlZmluZSBGVU5DVElPTl9maXhtYWRkZGl2MkJpdEV4YWN0X0RECi1pbmxpbmUgRklYUF9EQkwgZml4bWFkZGRpdjJCaXRFeGFjdF9ERCAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikgeworaW5saW5lIEZJWFBfREJMIGZpeG1hZGRkaXYyQml0RXhhY3RfREQoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGIpIHsKICAgcmV0dXJuIHggKyBmTXVsdERpdjJCaXRFeGFjdChhLCBiKTsKIH0KICNlbmRpZgogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1hZGRkaXYyQml0RXhhY3RfU0QpCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG1hZGRkaXYyQml0RXhhY3RfU0QKLWlubGluZSBGSVhQX0RCTCBmaXhtYWRkZGl2MkJpdEV4YWN0X1NEIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CitpbmxpbmUgRklYUF9EQkwgZml4bWFkZGRpdjJCaXRFeGFjdF9TRChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYikgewogI2lmZGVmIEZVTkNUSU9OX2ZpeG1hZGRkaXYyQml0RXhhY3RfRFMKICAgcmV0dXJuIGZpeG1hZGRkaXYyQml0RXhhY3RfRFMoeCwgYiwgYSk7CiAjZWxzZQpAQCAtMTkwLDcgKzIwNCw4IEBACiAjZW5kaWYKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtYWRkZGl2MkJpdEV4YWN0X0RTKQogI2RlZmluZSBGVU5DVElPTl9maXhtYWRkZGl2MkJpdEV4YWN0X0RTCi1pbmxpbmUgRklYUF9EQkwgZml4bWFkZGRpdjJCaXRFeGFjdF9EUyAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9TR0wgYikgeworaW5saW5lIEZJWFBfREJMIGZpeG1hZGRkaXYyQml0RXhhY3RfRFMoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGIpIHsKICNpZmRlZiBGVU5DVElPTl9maXhtYWRkZGl2MkJpdEV4YWN0X1NECiAgIHJldHVybiBmaXhtYWRkZGl2MkJpdEV4YWN0X1NEKHgsIGIsIGEpOwogI2Vsc2UKQEAgLTIwMSwxMyArMjE2LDE1IEBACiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtc3ViZGl2MkJpdEV4YWN0X0REKQogI2RlZmluZSBGVU5DVElPTl9maXhtc3ViZGl2MkJpdEV4YWN0X0RECi1pbmxpbmUgRklYUF9EQkwgZml4bXN1YmRpdjJCaXRFeGFjdF9ERCAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9EQkwgYikgeworaW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyQml0RXhhY3RfREQoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGIpIHsKICAgcmV0dXJuIHggLSBmTXVsdERpdjJCaXRFeGFjdChhLCBiKTsKIH0KICNlbmRpZgogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1zdWJkaXYyQml0RXhhY3RfU0QpCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG1zdWJkaXYyQml0RXhhY3RfU0QKLWlubGluZSBGSVhQX0RCTCBmaXhtc3ViZGl2MkJpdEV4YWN0X1NEIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CitpbmxpbmUgRklYUF9EQkwgZml4bXN1YmRpdjJCaXRFeGFjdF9TRChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgYikgewogI2lmZGVmIEZVTkNUSU9OX2ZpeG1zdWJkaXYyQml0RXhhY3RfRFMKICAgcmV0dXJuIGZpeG1zdWJkaXYyQml0RXhhY3RfRFMoeCwgYiwgYSk7CiAjZWxzZQpAQCAtMjE3LDcgKzIzNCw4IEBACiAjZW5kaWYKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtc3ViZGl2MkJpdEV4YWN0X0RTKQogI2RlZmluZSBGVU5DVElPTl9maXhtc3ViZGl2MkJpdEV4YWN0X0RTCi1pbmxpbmUgRklYUF9EQkwgZml4bXN1YmRpdjJCaXRFeGFjdF9EUyAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9TR0wgYikgeworaW5saW5lIEZJWFBfREJMIGZpeG1zdWJkaXYyQml0RXhhY3RfRFMoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGIpIHsKICNpZmRlZiBGVU5DVElPTl9maXhtc3ViZGl2MkJpdEV4YWN0X1NECiAgIHJldHVybiBmaXhtc3ViZGl2MkJpdEV4YWN0X1NEKHgsIGIsIGEpOwogI2Vsc2UKQEAgLTIyNiwxNCArMjQ0LDE1IEBACiB9CiAjZW5kaWYKIAotLyogTm9ybWFsIHZlcnNpb25zICovCisgIC8qIE5vcm1hbCB2ZXJzaW9ucyAqLwogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bWFkZF9ERCkKLWlubGluZSBGSVhQX0RCTCBmaXhtYWRkX0REIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKQotICAgICAgICAgICAgeyByZXR1cm4gZml4bWFkZGRpdjJfREQoeCxhLGIpPDwxOyB9CitpbmxpbmUgRklYUF9EQkwgZml4bWFkZF9ERChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CisgIHJldHVybiBmaXhtYWRkZGl2Ml9ERCh4LCBhLCBiKSA8PCAxOworfQogI2VuZGlmCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bWFkZF9TRCkKLWlubGluZSBGSVhQX0RCTCBmaXhtYWRkX1NEIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CitpbmxpbmUgRklYUF9EQkwgZml4bWFkZF9TRChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CiAjaWZkZWYgRlVOQ1RJT05fZml4bWFkZF9EUwogICByZXR1cm4gZml4bWFkZF9EUyh4LCBiLCBhKTsKICNlbHNlCkBAIC0yNDIsNyArMjYxLDcgQEAKIH0KICNlbmRpZgogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1hZGRfRFMpCi1pbmxpbmUgRklYUF9EQkwgZml4bWFkZF9EUyAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9TR0wgYikgeworaW5saW5lIEZJWFBfREJMIGZpeG1hZGRfRFMoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9TR0wgYikgewogI2lmZGVmIEZVTkNUSU9OX2ZpeG1hZGRfU0QKICAgcmV0dXJuIGZpeG1hZGRfU0QoeCwgYiwgYSk7CiAjZWxzZQpAQCAtMjUxLDE2ICsyNzAsMTggQEAKIH0KICNlbmRpZgogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1hZGRfU1MpCi1pbmxpbmUgRklYUF9EQkwgZml4bWFkZF9TUyAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9TR0wgYikKLSAgICAgICAgICAgIHsgcmV0dXJuICh4ICsgZk11bHREaXYyKGEsYikpPDwxOyB9CitpbmxpbmUgRklYUF9EQkwgZml4bWFkZF9TUyhGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX1NHTCBiKSB7CisgIHJldHVybiAoeCArIGZNdWx0RGl2MihhLCBiKSkgPDwgMTsKK30KICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXN1Yl9ERCkKLWlubGluZSBGSVhQX0RCTCBmaXhtc3ViX0REIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKQotICAgICAgICAgICAgeyByZXR1cm4gZml4bXN1YmRpdjJfREQoeCxhLGIpPDwxOyB9CitpbmxpbmUgRklYUF9EQkwgZml4bXN1Yl9ERChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CisgIHJldHVybiBmaXhtc3ViZGl2Ml9ERCh4LCBhLCBiKSA8PCAxOworfQogI2VuZGlmCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXN1Yl9TRCkKLWlubGluZSBGSVhQX0RCTCBmaXhtc3ViX1NEIChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CitpbmxpbmUgRklYUF9EQkwgZml4bXN1Yl9TRChGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CiAjaWZkZWYgRlVOQ1RJT05fZml4bXN1Yl9EUwogICByZXR1cm4gZml4bXN1Yl9EUyh4LCBiLCBhKTsKICNlbHNlCkBAIC0yNjksNyArMjkwLDcgQEAKIH0KICNlbmRpZgogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1zdWJfRFMpCi1pbmxpbmUgRklYUF9EQkwgZml4bXN1Yl9EUyAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9TR0wgYikgeworaW5saW5lIEZJWFBfREJMIGZpeG1zdWJfRFMoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgRklYUF9TR0wgYikgewogI2lmZGVmIEZVTkNUSU9OX2ZpeG1zdWJfU0QKICAgcmV0dXJuIGZpeG1zdWJfU0QoeCwgYiwgYSk7CiAjZWxzZQpAQCAtMjc4LDI5ICsyOTksMzUgQEAKIH0KICNlbmRpZgogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG1zdWJfU1MpCi1pbmxpbmUgRklYUF9EQkwgZml4bXN1Yl9TUyAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9TR0wgYikKLSAgICAgICAgICAgIHsgcmV0dXJuICh4IC0gZk11bHREaXYyKGEsYikpPDwxOyB9CitpbmxpbmUgRklYUF9EQkwgZml4bXN1Yl9TUyhGSVhQX0RCTCB4LCBjb25zdCBGSVhQX1NHTCBhLCBjb25zdCBGSVhQX1NHTCBiKSB7CisgIHJldHVybiAoeCAtIGZNdWx0RGl2MihhLCBiKSkgPDwgMTsKK30KICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4cG93MmFkZGRpdjJfRCkKLWlubGluZSBJTlQgZml4cGFkZGRpdjJfRCAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSkKLSAgICAgICAgICAgIHsgcmV0dXJuICh4ICsgZlBvdzJEaXYyKGEpKTsgfQorI2lmZGVmIEZVTkNUSU9OX2ZpeG1hZGRkaXYyX0RECisjZGVmaW5lIGZpeHBhZGRkaXYyX0QoeCwgYSkgZml4bWFkZGRpdjJfREQoeCwgYSwgYSkKKyNlbHNlCitpbmxpbmUgSU5UIGZpeHBhZGRkaXYyX0QoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSkgeworICByZXR1cm4gKHggKyBmUG93MkRpdjIoYSkpOworfQorI2VuZGlmCiAjZW5kaWYKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhwb3cyYWRkX0QpCi1pbmxpbmUgSU5UIGZpeHBhZGRfRCAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSkKLSAgICAgICAgICAgIHsgIHJldHVybiAoeCArIGZQb3cyKGEpKTsgfQoraW5saW5lIElOVCBmaXhwYWRkX0QoRklYUF9EQkwgeCwgY29uc3QgRklYUF9EQkwgYSkgeyByZXR1cm4gKHggKyBmUG93MihhKSk7IH0KICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4cG93MmFkZGRpdjJfUykKLWlubGluZSBJTlQgZml4cGFkZGRpdjJfUyAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSkKLSAgICAgICAgICAgIHsgcmV0dXJuICh4ICsgZlBvdzJEaXYyKGEpKTsgfQorI2lmZGVmIEZVTkNUSU9OX2ZpeG1hZGRkaXYyX1NTCisjZGVmaW5lIGZpeHBhZGRkaXYyX1MoeCwgYSkgZml4bWFkZGRpdjJfU1MoeCwgYSwgYSkKKyNlbHNlCitpbmxpbmUgSU5UIGZpeHBhZGRkaXYyX1MoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSkgeworICByZXR1cm4gKHggKyBmUG93MkRpdjIoYSkpOworfQorI2VuZGlmCiAjZW5kaWYKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhwb3cyYWRkX1MpCi1pbmxpbmUgSU5UIGZpeHBhZGRfUyAoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSkKLSAgICAgICAgICAgIHsgIHJldHVybiAoeCArIGZQb3cyKGEpKTsgfQoraW5saW5lIElOVCBmaXhwYWRkX1MoRklYUF9EQkwgeCwgY29uc3QgRklYUF9TR0wgYSkgeyByZXR1cm4gKHggKyBmUG93MihhKSk7IH0KICNlbmRpZgogCi0KLQotI2VuZGlmIC8vIF9fRklYTUFERF9IX18KLQorI2VuZGlmIC8qIEZJWE1BRERfSCAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvZml4bWlubWF4LmggYi9saWJGREsvaW5jbHVkZS9maXhtaW5tYXguaAppbmRleCA1YTUyODI0Li42OWVmMzVkIDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9maXhtaW5tYXguaAorKysgYi9saWJGREsvaW5jbHVkZS9maXhtaW5tYXguaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw0MiArOTAsNDIgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIsIE0uIEdheWVyCisKICAgIERlc2NyaXB0aW9uOiBtaW4vbWF4IGlubGluZSBmdW5jdGlvbnMgYW5kIGRlZmluZXMKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBGSVhNSU5NQVhfX0gKLSNkZWZpbmUgRklYTUlOTUFYX19ICisjaWZuZGVmIEZJWE1JTk1BWF9ICisjZGVmaW5lIEZJWE1JTk1BWF9ICiAKICNpbmNsdWRlICJGREtfYXJjaGRlZi5oIgogI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgogCi0vKiBJbmxpbmUgRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBzbWFsbGVyL2JpZ2dlciB2YWx1ZSBvZiB0d28gdmFsdWVzIHdpdGggc2FtZSB0eXBlLiAqLworLyogSW5saW5lIEZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgc21hbGxlci9iaWdnZXIgdmFsdWUgb2YgdHdvIHZhbHVlcyB3aXRoIHNhbWUKKyAqIHR5cGUuICovCiAKLQotdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBUIGZpeG1pbiAoVCBhLCBUIGIpCi17Ci0JcmV0dXJuIChhIDwgYiA/IGEgOiBiKTsKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIFQgZml4bWluKFQgYSwgVCBiKSB7CisgIHJldHVybiAoYSA8IGIgPyBhIDogYik7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgVCBmaXhtYXggKFQgYSwgVCBiKQotewotCXJldHVybiAoYSA+IGIgPyBhIDogYik7Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBUIGZpeG1heChUIGEsIFQgYikgeworICByZXR1cm4gKGEgPiBiID8gYSA6IGIpOwogfQogCi0jZGVmaW5lIGZpeG1heF9EKGEsYikgZml4bWF4KGEsYikKLSNkZWZpbmUgZml4bWluX0QoYSxiKSBmaXhtaW4oYSxiKQotI2RlZmluZSBmaXhtYXhfUyhhLGIpIGZpeG1heChhLGIpCi0jZGVmaW5lIGZpeG1pbl9TKGEsYikgZml4bWluKGEsYikKLSNkZWZpbmUgZml4bWF4X0koYSxiKSBmaXhtYXgoYSxiKQotI2RlZmluZSBmaXhtaW5fSShhLGIpIGZpeG1pbihhLGIpCi0jZGVmaW5lIGZpeG1heF9VSShhLGIpIGZpeG1heChhLGIpCi0jZGVmaW5lIGZpeG1pbl9VSShhLGIpIGZpeG1pbihhLGIpCi0KKyNkZWZpbmUgZml4bWF4X0QoYSwgYikgZml4bWF4KGEsIGIpCisjZGVmaW5lIGZpeG1pbl9EKGEsIGIpIGZpeG1pbihhLCBiKQorI2RlZmluZSBmaXhtYXhfUyhhLCBiKSBmaXhtYXgoYSwgYikKKyNkZWZpbmUgZml4bWluX1MoYSwgYikgZml4bWluKGEsIGIpCisjZGVmaW5lIGZpeG1heF9JKGEsIGIpIGZpeG1heChhLCBiKQorI2RlZmluZSBmaXhtaW5fSShhLCBiKSBmaXhtaW4oYSwgYikKKyNkZWZpbmUgZml4bWF4X1VJKGEsIGIpIGZpeG1heChhLCBiKQorI2RlZmluZSBmaXhtaW5fVUkoYSwgYikgZml4bWluKGEsIGIpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvZml4bXVsLmggYi9saWJGREsvaW5jbHVkZS9maXhtdWwuaAppbmRleCBlYTRiYzZjLi5hNTFjYTBjIDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9maXhtdWwuaAorKysgYi9saWJGREsvaW5jbHVkZS9maXhtdWwuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyOSArOTAsMjkgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBTdGVmYW4gR2V3aW5uZXIKKwogICAgRGVzY3JpcHRpb246IGZpeGVkIHBvaW50IG11bHRpcGxpY2F0aW9uCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZiAhZGVmaW5lZChfX0ZJWE1VTF9IX18pCi0jZGVmaW5lIF9fRklYTVVMX0hfXworI2lmICFkZWZpbmVkKEZJWE1VTF9IKQorI2RlZmluZSBGSVhNVUxfSAogCiAjaW5jbHVkZSAiRkRLX2FyY2hkZWYuaCIKICNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKIAotCiAjaWYgZGVmaW5lZChfX2FybV9fKQogI2luY2x1ZGUgImFybS9maXhtdWxfYXJtLmgiCiAKLSNlbGlmIGRlZmluZWQoX19taXBzX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyNlbGlmIGRlZmluZWQoX19taXBzX18pCiAjaW5jbHVkZSAibWlwcy9maXhtdWxfbWlwcy5oIgogCi0jZWxpZiBkZWZpbmVkKF9feDg2X18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyNlbGlmIGRlZmluZWQoX194ODZfXykKICNpbmNsdWRlICJ4ODYvZml4bXVsX3g4Ni5oIgogCiAjZW5kaWYgLyogYWxsIGNvcmVzICovCkBAIC0xMTQsMTczICsxMjUsMTcxIEBACiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxkaXYyX0REKQogI2RlZmluZSBGVU5DVElPTl9maXhtdWxkaXYyX0RECi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0NDX0FSTSkgfHwgZGVmaW5lZChfX0FOQUxPR19FWFRFTlNJT05TX18pIHx8IGRlZmluZWQoX19USV9DT01QSUxFUl9WRVJTSU9OX18pCi0jcHJhZ21hIG1lc3NhZ2UgKCJFeHRyZW1lbHkgc2xvdyBpbXBsZW1lbnRhdGlvbiBvZiBmaXhtdWxkaXYyX0REICEhIikKLSNlbHNlCi0jd2FybmluZyBFeHRyZW1lbHkgc2xvdyBpbXBsZW1lbnRhdGlvbiBvZiBmaXhtdWxkaXYyX0REICEhCi0jZW5kaWYKLWlubGluZSBMT05HIGZpeG11bGRpdjJfREQgKGNvbnN0IExPTkcgYSwgY29uc3QgTE9ORyBiKQotewotICByZXR1cm4gKExPTkcpICgoKChJTlQ2NClhKSAqIGIpID4+IDMyKSA7CitpbmxpbmUgTE9ORyBmaXhtdWxkaXYyX0REKGNvbnN0IExPTkcgYSwgY29uc3QgTE9ORyBiKSB7CisgIHJldHVybiAoTE9ORykoKCgoSU5UNjQpYSkgKiBiKSA+PiAzMik7CiB9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9ERCkKICNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2MkJpdEV4YWN0X0RECi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0NDX0FSTSkgfHwgZGVmaW5lZChfX0FOQUxPR19FWFRFTlNJT05TX18pIHx8IGRlZmluZWQoX19USV9DT01QSUxFUl9WRVJTSU9OX18pCi0jcHJhZ21hIG1lc3NhZ2UgKCJFeHRyZW1lbHkgc2xvdyBpbXBsZW1lbnRhdGlvbiBvZiBmaXhtdWxkaXYyQml0RXhhY3RfREQgISEiKQotI2Vsc2UKLSN3YXJuaW5nIEV4dHJlbWVseSBzbG93IGltcGxlbWVudGF0aW9uIG9mIGZpeG11bGRpdjJCaXRFeGFjdF9ERCAhIQotI2VuZGlmCi1pbmxpbmUgTE9ORyBmaXhtdWxkaXYyQml0RXhhY3RfREQgKGNvbnN0IExPTkcgYSwgY29uc3QgTE9ORyBiKQotewotICByZXR1cm4gKExPTkcpICgoKChJTlQ2NClhKSAqIGIpID4+IDMyKSA7CitpbmxpbmUgTE9ORyBmaXhtdWxkaXYyQml0RXhhY3RfREQoY29uc3QgTE9ORyBhLCBjb25zdCBMT05HIGIpIHsKKyAgcmV0dXJuIChMT05HKSgoKChJTlQ2NClhKSAqIGIpID4+IDMyKTsKIH0KICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXVsX0REKQogI2RlZmluZSBGVU5DVElPTl9maXhtdWxfREQKLWlubGluZSBMT05HIGZpeG11bF9ERCAoY29uc3QgTE9ORyBhLCBjb25zdCBMT05HIGIpCi0gIHsgcmV0dXJuIGZpeG11bGRpdjJfREQgKGEsIGIpIDw8IDEgOyB9CitpbmxpbmUgTE9ORyBmaXhtdWxfREQoY29uc3QgTE9ORyBhLCBjb25zdCBMT05HIGIpIHsKKyAgcmV0dXJuIGZpeG11bGRpdjJfREQoYSwgYikgPDwgMTsKK30KICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXVsQml0RXhhY3RfREQpCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bEJpdEV4YWN0X0RECi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0NDX0FSTSkgfHwgZGVmaW5lZChfX0FOQUxPR19FWFRFTlNJT05TX18pIHx8IGRlZmluZWQoX19USV9DT01QSUxFUl9WRVJTSU9OX18pIHx8IGRlZmluZWQoX19YVEVOU0FfXykKLSNwcmFnbWEgbWVzc2FnZSAoIkV4dHJlbWVseSBzbG93IGltcGxlbWVudGF0aW9uIG9mIGZpeG11bEJpdEV4YWN0X0REICEhIikKLSNlbHNlCi0jd2FybmluZyBFeHRyZW1lbHkgc2xvdyBpbXBsZW1lbnRhdGlvbiBvZiBmaXhtdWxCaXRFeGFjdF9ERCAhIQotI2VuZGlmCi1pbmxpbmUgTE9ORyBmaXhtdWxCaXRFeGFjdF9ERCAoY29uc3QgTE9ORyBhLCBjb25zdCBMT05HIGIpCi17Ci0gIHJldHVybiAoIChMT05HKSAoKCgoSU5UNjQpYSkgKiBiKSA+PiAzMikgKSA8PCAxOworaW5saW5lIExPTkcgZml4bXVsQml0RXhhY3RfREQoY29uc3QgTE9ORyBhLCBjb25zdCBMT05HIGIpIHsKKyAgcmV0dXJuICgoTE9ORykoKCgoSU5UNjQpYSkgKiBiKSA+PiAzMikpIDw8IDE7CiB9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG11bGRpdjJfU1MpCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJfU1MKLWlubGluZSBMT05HIGZpeG11bGRpdjJfU1MgKGNvbnN0IFNIT1JUIGEsIGNvbnN0IFNIT1JUIGIpCi0gIHsgcmV0dXJuICgoTE9ORylhKmIpOyB9CitpbmxpbmUgTE9ORyBmaXhtdWxkaXYyX1NTKGNvbnN0IFNIT1JUIGEsIGNvbnN0IFNIT1JUIGIpIHsKKyAgcmV0dXJuICgoTE9ORylhICogYik7Cit9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG11bF9TUykKICNkZWZpbmUgRlVOQ1RJT05fZml4bXVsX1NTCi1pbmxpbmUgTE9ORyBmaXhtdWxfU1MgKGNvbnN0IFNIT1JUIGEsIGNvbnN0IFNIT1JUIGIpCi0gIHsgcmV0dXJuIChhKmIpIDw8MTsgfQoraW5saW5lIExPTkcgZml4bXVsX1NTKGNvbnN0IFNIT1JUIGEsIGNvbnN0IFNIT1JUIGIpIHsgcmV0dXJuIChhICogYikgPDwgMTsgfQogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxkaXYyX1NEKQogI2RlZmluZSBGVU5DVElPTl9maXhtdWxkaXYyX1NECi1pbmxpbmUgTE9ORyBmaXhtdWxkaXYyX1NEIChjb25zdCBTSE9SVCBhLCBjb25zdCBMT05HIGIpCitpbmxpbmUgTE9ORyBmaXhtdWxkaXYyX1NEKGNvbnN0IFNIT1JUIGEsIGNvbnN0IExPTkcgYikKICNpZmRlZiBGVU5DVElPTl9maXhtdWxkaXYyX0RTCi0gIHsgcmV0dXJuIGZpeG11bGRpdjJfRFMoYiwgYSk7IH0KK3sKKyAgcmV0dXJuIGZpeG11bGRpdjJfRFMoYiwgYSk7Cit9CiAjZWxzZQotICB7IHJldHVybiBmaXhtdWxkaXYyX0REKEZYX1NHTDJGWF9EQkwoYSksIGIpOyB9Cit7CisgIHJldHVybiBmaXhtdWxkaXYyX0REKEZYX1NHTDJGWF9EQkwoYSksIGIpOworfQogI2VuZGlmCiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG11bGRpdjJfRFMpCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJfRFMKLWlubGluZSBMT05HIGZpeG11bGRpdjJfRFMgKGNvbnN0IExPTkcgYSwgY29uc3QgU0hPUlQgYikKK2lubGluZSBMT05HIGZpeG11bGRpdjJfRFMoY29uc3QgTE9ORyBhLCBjb25zdCBTSE9SVCBiKQogI2lmZGVmIEZVTkNUSU9OX2ZpeG11bGRpdjJfU0QKLSAgeyByZXR1cm4gZml4bXVsZGl2Ml9TRChiLCBhKTsgfQoreworICByZXR1cm4gZml4bXVsZGl2Ml9TRChiLCBhKTsKK30KICNlbHNlCi0gIHsgcmV0dXJuIGZpeG11bGRpdjJfREQoYSwgRlhfU0dMMkZYX0RCTChiKSk7IH0KK3sKKyAgcmV0dXJuIGZpeG11bGRpdjJfREQoYSwgRlhfU0dMMkZYX0RCTChiKSk7Cit9CiAjZW5kaWYKICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4bXVsZGl2MkJpdEV4YWN0X1NEKQogI2RlZmluZSBGVU5DVElPTl9maXhtdWxkaXYyQml0RXhhY3RfU0QKLWlubGluZSBMT05HIGZpeG11bGRpdjJCaXRFeGFjdF9TRCAoY29uc3QgU0hPUlQgYSwgY29uc3QgTE9ORyBiKQoraW5saW5lIExPTkcgZml4bXVsZGl2MkJpdEV4YWN0X1NEKGNvbnN0IFNIT1JUIGEsIGNvbnN0IExPTkcgYikKICNpZmRlZiBGVU5DVElPTl9maXhtdWxkaXYyQml0RXhhY3RfRFMKLSAgeyByZXR1cm4gZml4bXVsZGl2MkJpdEV4YWN0X0RTKGIsIGEpOyB9Cit7CisgIHJldHVybiBmaXhtdWxkaXYyQml0RXhhY3RfRFMoYiwgYSk7Cit9CiAjZWxzZQotICB7IHJldHVybiAoTE9ORykgKCgoKElOVDY0KWEpICogYikgPj4gMTYpIDsgfQoreworICByZXR1cm4gKExPTkcpKCgoKElOVDY0KWEpICogYikgPj4gMTYpOworfQogI2VuZGlmCiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9EUykKICNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2MkJpdEV4YWN0X0RTCi1pbmxpbmUgTE9ORyBmaXhtdWxkaXYyQml0RXhhY3RfRFMgKGNvbnN0IExPTkcgYSwgY29uc3QgU0hPUlQgYikKK2lubGluZSBMT05HIGZpeG11bGRpdjJCaXRFeGFjdF9EUyhjb25zdCBMT05HIGEsIGNvbnN0IFNIT1JUIGIpCiAjaWZkZWYgRlVOQ1RJT05fZml4bXVsZGl2MkJpdEV4YWN0X1NECi0gIHsgcmV0dXJuIGZpeG11bGRpdjJCaXRFeGFjdF9TRChiLCBhKTsgfQoreworICByZXR1cm4gZml4bXVsZGl2MkJpdEV4YWN0X1NEKGIsIGEpOworfQogI2Vsc2UKLSAgeyByZXR1cm4gKExPTkcpICgoKChJTlQ2NClhKSAqIGIpID4+IDE2KSA7IH0KK3sKKyAgcmV0dXJuIChMT05HKSgoKChJTlQ2NClhKSAqIGIpID4+IDE2KTsKK30KICNlbmRpZgogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxfU0QpCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bF9TRAotaW5saW5lIExPTkcgZml4bXVsX1NEIChjb25zdCBTSE9SVCBhLCBjb25zdCBMT05HIGIpIHsKK2lubGluZSBMT05HIGZpeG11bF9TRChjb25zdCBTSE9SVCBhLCBjb25zdCBMT05HIGIpIHsKICNpZmRlZiBGVU5DVElPTl9maXhtdWxfRFMKLSAgcmV0dXJuIGZpeG11bF9TRChiLCBhKTsKKyAgcmV0dXJuIGZpeG11bF9EUyhiLCBhKTsKICNlbHNlCi0gIHJldHVybiBmaXhtdWxkaXYyX1NEIChhLCBiKSA8PCAxIDsKKyAgcmV0dXJuIGZpeG11bGRpdjJfU0QoYSwgYikgPDwgMTsKICNlbmRpZgogfQogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxfRFMpCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bF9EUwotaW5saW5lIExPTkcgZml4bXVsX0RTIChjb25zdCBMT05HIGEsIGNvbnN0IFNIT1JUIGIpIHsKK2lubGluZSBMT05HIGZpeG11bF9EUyhjb25zdCBMT05HIGEsIGNvbnN0IFNIT1JUIGIpIHsKICNpZmRlZiBGVU5DVElPTl9maXhtdWxfU0QKICAgcmV0dXJuIGZpeG11bF9TRChiLCBhKTsKICNlbHNlCi0gIHJldHVybiBmaXhtdWxkaXYyX0RTKGEsIGIpIDw8IDEgOworICByZXR1cm4gZml4bXVsZGl2Ml9EUyhhLCBiKSA8PCAxOwogI2VuZGlmCiB9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeG11bEJpdEV4YWN0X1NEKQogI2RlZmluZSBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9TRAotaW5saW5lIExPTkcgZml4bXVsQml0RXhhY3RfU0QgKGNvbnN0IFNIT1JUIGEsIGNvbnN0IExPTkcgYikKK2lubGluZSBMT05HIGZpeG11bEJpdEV4YWN0X1NEKGNvbnN0IFNIT1JUIGEsIGNvbnN0IExPTkcgYikKICNpZmRlZiBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9EUwotICB7IHJldHVybiBmaXhtdWxCaXRFeGFjdF9EUyhiLCBhKTsgfQoreworICByZXR1cm4gZml4bXVsQml0RXhhY3RfRFMoYiwgYSk7Cit9CiAjZWxzZQotICB7IHJldHVybiAoTE9ORykgKCgoKChJTlQ2NClhKSAqIGIpID4+IDE2KSA8PCAxKTsgfQoreworICByZXR1cm4gKExPTkcpKCgoKChJTlQ2NClhKSAqIGIpID4+IDE2KSA8PCAxKTsKK30KICNlbmRpZgogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9EUykKICNkZWZpbmUgRlVOQ1RJT05fZml4bXVsQml0RXhhY3RfRFMKLWlubGluZSBMT05HIGZpeG11bEJpdEV4YWN0X0RTIChjb25zdCBMT05HIGEsIGNvbnN0IFNIT1JUIGIpCitpbmxpbmUgTE9ORyBmaXhtdWxCaXRFeGFjdF9EUyhjb25zdCBMT05HIGEsIGNvbnN0IFNIT1JUIGIpCiAjaWZkZWYgRlVOQ1RJT05fZml4bXVsQml0RXhhY3RfU0QKLSAgeyByZXR1cm4gZml4bXVsQml0RXhhY3RfU0QoYiwgYSk7IH0KK3sKKyAgcmV0dXJuIGZpeG11bEJpdEV4YWN0X1NEKGIsIGEpOworfQogI2Vsc2UKLSAgeyByZXR1cm4gKExPTkcpICgoKCgoSU5UNjQpYSkgKiBiKSA+PiAxNikgPDwgMSk7IH0KK3sKKyAgcmV0dXJuIChMT05HKSgoKCgoSU5UNjQpYSkgKiBiKSA+PiAxNikgPDwgMSk7Cit9CiAjZW5kaWYKICNlbmRpZgogCi0KICNpZiAhZGVmaW5lZChGVU5DVElPTl9maXhwb3cyZGl2Ml9EKQotI2lmZGVmIEFSQ0hfV0FfMTZCSVRNVUxUCi0jZXJyb3IgRmFsbGJhY2sgZm9yIGZpeHBvdzJkaXYyX0QgaXMgbm90IDE2IGJpdCBzYWZlICEKLSNlbmRpZgogI2RlZmluZSBGVU5DVElPTl9maXhwb3cyZGl2Ml9ECi1pbmxpbmUgTE9ORyBmaXhwb3cyZGl2Ml9EIChjb25zdCBMT05HIGEpCi0gIHsgcmV0dXJuIGZpeG11bGRpdjJfREQoYSwgYSk7IH0KK2lubGluZSBMT05HIGZpeHBvdzJkaXYyX0QoY29uc3QgTE9ORyBhKSB7IHJldHVybiBmaXhtdWxkaXYyX0REKGEsIGEpOyB9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeHBvdzJfRCkKLSNpZmRlZiBBUkNIX1dBXzE2QklUTVVMVAotI2Vycm9yIEZhbGxiYWNrIGZvciBmaXhwb3cyX0QgaXMgbm90IDE2IGJpdCBzYWZlICEKLSNlbmRpZgogI2RlZmluZSBGVU5DVElPTl9maXhwb3cyX0QKLWlubGluZSBMT05HIGZpeHBvdzJfRCAoY29uc3QgTE9ORyBhKQotICB7IHJldHVybiBmaXhwb3cyZGl2Ml9EKGEpPDwxOyB9CitpbmxpbmUgTE9ORyBmaXhwb3cyX0QoY29uc3QgTE9ORyBhKSB7IHJldHVybiBmaXhwb3cyZGl2Ml9EKGEpIDw8IDE7IH0KICNlbmRpZgogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZml4cG93MmRpdjJfUykKICNkZWZpbmUgRlVOQ1RJT05fZml4cG93MmRpdjJfUwotaW5saW5lIExPTkcgZml4cG93MmRpdjJfUyAoY29uc3QgU0hPUlQgYSkKLSAgeyByZXR1cm4gZml4bXVsZGl2Ml9TUyhhLCBhKTsgfQoraW5saW5lIExPTkcgZml4cG93MmRpdjJfUyhjb25zdCBTSE9SVCBhKSB7IHJldHVybiBmaXhtdWxkaXYyX1NTKGEsIGEpOyB9CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZpeHBvdzJfUykKICNkZWZpbmUgRlVOQ1RJT05fZml4cG93Ml9TCi1pbmxpbmUgTE9ORyBmaXhwb3cyX1MgKGNvbnN0IFNIT1JUIGEpCi0gIHsgcmV0dXJuIGZpeHBvdzJkaXYyX1MoYSk8PDE7IH0KK2lubGluZSBMT05HIGZpeHBvdzJfUyhjb25zdCBTSE9SVCBhKSB7CisgIExPTkcgcmVzdWx0ID0gZml4cG93MmRpdjJfUyhhKSA8PCAxOworICByZXR1cm4gcmVzdWx0IF4gKHJlc3VsdCA+PiAzMSk7Cit9CiAjZW5kaWYKIAotCi0jZW5kaWYgLyogX19GSVhNVUxfSF9fICovCisjZW5kaWYgLyogRklYTVVMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL2ZpeHBvaW50X21hdGguaCBiL2xpYkZESy9pbmNsdWRlL2ZpeHBvaW50X21hdGguaAppbmRleCAwZDUwZjBhLi4zODA1ODkyIDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9maXhwb2ludF9tYXRoLmgKKysrIGIvbGliRkRLL2luY2x1ZGUvZml4cG9pbnRfbWF0aC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIxICs5MCw3NyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIE0uIEdheWVyCisKICAgIERlc2NyaXB0aW9uOiBGaXhlZCBwb2ludCBzcGVjaWZpYyBtYXRoZW1hdGljYWwgZnVuY3Rpb25zCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgX19maXhwb2ludF9tYXRoX0gKLSNkZWZpbmUgX19maXhwb2ludF9tYXRoX0gKLQorI2lmbmRlZiBGSVhQT0lOVF9NQVRIX0gKKyNkZWZpbmUgRklYUE9JTlRfTUFUSF9ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCisjaW5jbHVkZSAic2NhbGUuaCIKIAorLyoKKyAqIERhdGEgZGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIExEX0RBVEFfU0NBTElORyAoNjQuMGYpCisjZGVmaW5lIExEX0RBVEFfU0hJRlQgNiAvKiBwb3coMiwgTERfREFUQV9TSElGVCkgPSBMRF9EQVRBX1NDQUxJTkcgKi8KKworI2RlZmluZSBNQVhfTERfUFJFQ0lTSU9OIDEwCisjZGVmaW5lIExEX1BSRUNJU0lPTiAxMAorCisvKiBUYXlsb3Igc2VyaWVzIGNvZWZmaWNpZW50cyBmb3IgbG4oMS14KSwgY2VudGVyZWQgYXQgMCAoTWFjTGF1cmluIHBvbHlub21pYWwpLgorICovCisjaWZuZGVmIExEQ09FRkZfMTZCSVQKK0xOS19TRUNUSU9OX0NPTlNUREFUQV9MMQorc3RhdGljIGNvbnN0IEZJWFBfREJMIGxkQ29lZmZbTUFYX0xEX1BSRUNJU0lPTl0gPSB7CisgICAgRkwyRlhDT05TVF9EQkwoLTEuMCksICAgICAgIEZMMkZYQ09OU1RfREJMKC0xLjAgLyAyLjApLAorICAgIEZMMkZYQ09OU1RfREJMKC0xLjAgLyAzLjApLCBGTDJGWENPTlNUX0RCTCgtMS4wIC8gNC4wKSwKKyAgICBGTDJGWENPTlNUX0RCTCgtMS4wIC8gNS4wKSwgRkwyRlhDT05TVF9EQkwoLTEuMCAvIDYuMCksCisgICAgRkwyRlhDT05TVF9EQkwoLTEuMCAvIDcuMCksIEZMMkZYQ09OU1RfREJMKC0xLjAgLyA4LjApLAorICAgIEZMMkZYQ09OU1RfREJMKC0xLjAgLyA5LjApLCBGTDJGWENPTlNUX0RCTCgtMS4wIC8gMTAuMCl9OworI2Vsc2UgIC8qIExEQ09FRkZfMTZCSVQgKi8KK0xOS19TRUNUSU9OX0NPTlNUREFUQV9MMQorc3RhdGljIGNvbnN0IEZJWFBfU0dMIGxkQ29lZmZbTUFYX0xEX1BSRUNJU0lPTl0gPSB7CisgICAgRkwyRlhDT05TVF9TR0woLTEuMCksICAgICAgIEZMMkZYQ09OU1RfU0dMKC0xLjAgLyAyLjApLAorICAgIEZMMkZYQ09OU1RfU0dMKC0xLjAgLyAzLjApLCBGTDJGWENPTlNUX1NHTCgtMS4wIC8gNC4wKSwKKyAgICBGTDJGWENPTlNUX1NHTCgtMS4wIC8gNS4wKSwgRkwyRlhDT05TVF9TR0woLTEuMCAvIDYuMCksCisgICAgRkwyRlhDT05TVF9TR0woLTEuMCAvIDcuMCksIEZMMkZYQ09OU1RfU0dMKC0xLjAgLyA4LjApLAorICAgIEZMMkZYQ09OU1RfU0dMKC0xLjAgLyA5LjApLCBGTDJGWENPTlNUX1NHTCgtMS4wIC8gMTAuMCl9OworI2VuZGlmIC8qIExEQ09FRkZfMTZCSVQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IGludlNxcnROb3JtMgorICAgIGRlc2NyaXB0aW9uOiAgZGVsaXZlcnMgMS9zcXJ0KG9wKSBub3JtYWxpemVkIHRvIC41Li4uMSBhbmQgdGhlIHNoaWZ0IHZhbHVlCitvZiB0aGUgT1VUUFVUCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTUVJUX0JJVFMgNworI2RlZmluZSBTUVJUX1ZBTFVFUyAoMTI4ICsgMikKKyNkZWZpbmUgU1FSVF9CSVRTX01BU0sgMHg3ZgorI2RlZmluZSBTUVJUX0ZSQUNUX0JJVFNfTUFTSyAweDAwN0ZGRkZGCisKK2V4dGVybiBjb25zdCBGSVhQX0RCTCBpbnZTcXJ0VGFiW1NRUlRfVkFMVUVTXTsKKworLyoKKyAqIEhhcmR3YXJlIHNwZWNpZmljIGltcGxlbWVudGF0aW9ucworICovCisKKyNpZiBkZWZpbmVkKF9feDg2X18pCisjaW5jbHVkZSAieDg2L2ZpeHBvaW50X21hdGhfeDg2LmgiCisjZW5kaWYgLyogdGFyZ2V0IGFyY2hpdGVjdHVyZSBzZWxlY3RvciAqLworCisvKgorICogRmFsbGJhY2sgaW1wbGVtZW50YXRpb25zCisgKi8KICNpZiAhZGVmaW5lZChGVU5DVElPTl9mSXNMZXNzVGhhbikKIC8qKgogICogXGJyaWVmIENvbXBhcmVzIHR3byBmaXhwb2ludCB2YWx1ZXMgaW5jbC4gc2NhbGluZy4KQEAgLTEwMyw2MSArMTcwLDgzIEBACiAgKiBccGFyYW0gYl9lIGV4cG9uZW50IG9mIHRoZSBzZWNvbmQgaW5wdXQgdmFsdWUuCiAgKiBccmV0dXJuIG5vbi16ZXJvIGlmIChhX20qMl5hX2UpIDwgKGJfbSoyXmJfZSksIDAgb3RoZXJ3aXNlCiAgKi8KLUZES19JTkxJTkUgSU5UIGZJc0xlc3NUaGFuKEZJWFBfREJMIGFfbSwgSU5UIGFfZSwgRklYUF9EQkwgYl9tLCBJTlQgYl9lKQoteworRkRLX0lOTElORSBJTlQgZklzTGVzc1RoYW4oRklYUF9EQkwgYV9tLCBJTlQgYV9lLCBGSVhQX0RCTCBiX20sIElOVCBiX2UpIHsKICAgaWYgKGFfZSA+IGJfZSkgewotICAgIHJldHVybiAoYl9tID4+IGZNaW4oYV9lLWJfZSwgREZSQUNUX0JJVFMtMSkgPiBhX20pOworICAgIHJldHVybiAoKGJfbSA+PiBmTWluKGFfZSAtIGJfZSwgREZSQUNUX0JJVFMgLSAxKSkgPiBhX20pOwogICB9IGVsc2UgewotICAgIHJldHVybiAoYV9tID4+IGZNaW4oYl9lLWFfZSwgREZSQUNUX0JJVFMtMSkgPCBiX20pOworICAgIHJldHVybiAoKGFfbSA+PiBmTWluKGJfZSAtIGFfZSwgREZSQUNUX0JJVFMgLSAxKSkgPCBiX20pOwogICB9CiB9CiAKLUZES19JTkxJTkUgSU5UIGZJc0xlc3NUaGFuKEZJWFBfU0dMIGFfbSwgSU5UIGFfZSwgRklYUF9TR0wgYl9tLCBJTlQgYl9lKQoteworRkRLX0lOTElORSBJTlQgZklzTGVzc1RoYW4oRklYUF9TR0wgYV9tLCBJTlQgYV9lLCBGSVhQX1NHTCBiX20sIElOVCBiX2UpIHsKICAgaWYgKGFfZSA+IGJfZSkgewotICAgIHJldHVybiAoYl9tID4+IGZNaW4oYV9lLWJfZSwgRlJBQ1RfQklUUy0xKSA+IGFfbSk7CisgICAgcmV0dXJuICgoYl9tID4+IGZNaW4oYV9lIC0gYl9lLCBGUkFDVF9CSVRTIC0gMSkpID4gYV9tKTsKICAgfSBlbHNlIHsKLSAgICByZXR1cm4gKGFfbSA+PiBmTWluKGJfZS1hX2UsIEZSQUNUX0JJVFMtMSkgPCBiX20pOworICAgIHJldHVybiAoKGFfbSA+PiBmTWluKGJfZSAtIGFfZSwgRlJBQ1RfQklUUyAtIDEpKSA8IGJfbSk7CiAgIH0KIH0KICNlbmRpZgogCi0KLQotI2RlZmluZSBMRF9EQVRBX1NDQUxJTkcgKDY0LjBmKQotI2RlZmluZSBMRF9EQVRBX1NISUZUICAgNiAgIC8qIHBvdygyLCBMRF9EQVRBX1NISUZUKSA9IExEX0RBVEFfU0NBTElORyAqLwotCiAvKioKICAqIFxicmllZiBkZXByZWNhdGVkLiBVc2UgZkxvZzIoKSBpbnN0ZWFkLgogICovCi1GSVhQX0RCTCBDYWxjTGREYXRhKEZJWFBfREJMIG9wKTsKKyNkZWZpbmUgQ2FsY0xkRGF0YShvcCkgZkxvZzIob3AsIDApCiAKIHZvaWQgTGREYXRhVmVjdG9yKEZJWFBfREJMICpzcmNWZWN0b3IsIEZJWFBfREJMICpkZXN0VmVjdG9yLCBJTlQgbnVtYmVyKTsKIAotRklYUF9EQkwgQ2FsY0ludkxkRGF0YShGSVhQX0RCTCBvcCk7CitleHRlcm4gY29uc3QgVUlOVCBleHAyX3RhYl9sb25nWzMyXTsKK2V4dGVybiBjb25zdCBVSU5UIGV4cDJ3X3RhYl9sb25nWzMyXTsKK2V4dGVybiBjb25zdCBVSU5UIGV4cDJ4X3RhYl9sb25nWzMyXTsKIAorTE5LX1NFQ1RJT05fQ09ERV9MMQorRkRLX0lOTElORSBGSVhQX0RCTCBDYWxjSW52TGREYXRhKGNvbnN0IEZJWFBfREJMIHgpIHsKKyAgaW50IHNldF96ZXJvID0gKHggPCBGTDJGWENPTlNUX0RCTCgtMzEuMCAvIDY0LjApKSA/IDAgOiAxOworICBpbnQgc2V0X21heCA9ICh4ID49IEZMMkZYQ09OU1RfREJMKDMxLjAgLyA2NC4wKSkgfCAoeCA9PSBGTDJGWENPTlNUX0RCTCgwLjApKTsKIAotdm9pZCAgICAgSW5pdExkSW50KCk7CisgIEZJWFBfU0dMIGZyYWMgPSAoRklYUF9TR0wpKChMT05HKXggJiAweDNGRik7CisgIFVJTlQgaW5kZXgzID0gKFVJTlQpKExPTkcpKHggPj4gMTApICYgMHgxRjsKKyAgVUlOVCBpbmRleDIgPSAoVUlOVCkoTE9ORykoeCA+PiAxNSkgJiAweDFGOworICBVSU5UIGluZGV4MSA9IChVSU5UKShMT05HKSh4ID4+IDIwKSAmIDB4MUY7CisgIGludCBleHAgPSBmTWluKDMxLCAoKHggPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgPyAoMzEgLSAoaW50KSh4ID4+IDI1KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChpbnQpKC0oeCA+PiAyNSkpKSk7CisKKyAgVUlOVCBsb29rdXAxID0gZXhwMl90YWJfbG9uZ1tpbmRleDFdICogc2V0X3plcm87CisgIFVJTlQgbG9va3VwMiA9IGV4cDJ3X3RhYl9sb25nW2luZGV4Ml07CisgIFVJTlQgbG9va3VwMyA9IGV4cDJ4X3RhYl9sb25nW2luZGV4M107CisgIFVJTlQgbG9va3VwM2YgPQorICAgICAgbG9va3VwMyArIChVSU5UKShMT05HKWZNdWx0RGl2MigoRklYUF9EQkwpKDB4MDAxNjMwMkYpLCAoRklYUF9TR0wpZnJhYyk7CisKKyAgVUlOVCBsb29rdXAxMiA9IChVSU5UKShMT05HKWZNdWx0KChGSVhQX0RCTClsb29rdXAxLCAoRklYUF9EQkwpbG9va3VwMik7CisgIFVJTlQgbG9va3VwID0gKFVJTlQpKExPTkcpZk11bHQoKEZJWFBfREJMKWxvb2t1cDEyLCAoRklYUF9EQkwpbG9va3VwM2YpOworCisgIEZJWFBfREJMIHJldFZhbCA9IChsb29rdXAgPDwgMykgPj4gZXhwOworCisgIGlmIChzZXRfbWF4KSB7CisgICAgcmV0VmFsID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CisgIH0KKworICByZXR1cm4gcmV0VmFsOworfQorCit2b2lkIEluaXRMZEludCgpOwogRklYUF9EQkwgQ2FsY0xkSW50KElOVCBpKTsKIAogZXh0ZXJuIGNvbnN0IFVTSE9SVCBzcXJ0X3RhYls0OV07CiAKLWlubGluZSBGSVhQX0RCTCBzcXJ0Rml4cF9sb29rdXAoRklYUF9EQkwgeCkKLXsKK2lubGluZSBGSVhQX0RCTCBzcXJ0Rml4cF9sb29rdXAoRklYUF9EQkwgeCkgewogICBVSU5UIHkgPSAoSU5UKXg7Ci0gIFVDSEFSIGlzX3plcm89KHk9PTApOwotICBJTlQgemVyb3M9Zml4bm9ybXpfRCh5KSAmIDB4MWU7Ci0gIHk8PD16ZXJvczsKLSAgVUlOVCBpZHg9KHk+PjI2KS0xNjsKLSAgVVNIT1JUIGZyYWM9KHk+PjEwKSYweGZmZmY7Ci0gIFVTSE9SVCBuZnJhYz0weGZmZmZeZnJhYzsKLSAgVUlOVCB0PW5mcmFjKnNxcnRfdGFiW2lkeF0rZnJhYypzcXJ0X3RhYltpZHgrMV07Ci0gIHQ9dD4+KHplcm9zPj4xKTsKLSAgcmV0dXJuKGlzX3plcm8gPyAwIDogdCk7CisgIFVDSEFSIGlzX3plcm8gPSAoeSA9PSAwKTsKKyAgSU5UIHplcm9zID0gZml4bm9ybXpfRCh5KSAmIDB4MWU7CisgIHkgPDw9IHplcm9zOworICBVSU5UIGlkeCA9ICh5ID4+IDI2KSAtIDE2OworICBVU0hPUlQgZnJhYyA9ICh5ID4+IDEwKSAmIDB4ZmZmZjsKKyAgVVNIT1JUIG5mcmFjID0gMHhmZmZmIF4gZnJhYzsKKyAgVUlOVCB0ID0gKFVJTlQpbmZyYWMgKiBzcXJ0X3RhYltpZHhdICsgKFVJTlQpZnJhYyAqIHNxcnRfdGFiW2lkeCArIDFdOworICB0ID0gdCA+PiAoemVyb3MgPj4gMSk7CisgIHJldHVybiAoaXNfemVybyA/IDAgOiB0KTsKIH0KIAotaW5saW5lIEZJWFBfREJMIHNxcnRGaXhwX2xvb2t1cChGSVhQX0RCTCB4LCBJTlQgKnhfZSkKLXsKK2lubGluZSBGSVhQX0RCTCBzcXJ0Rml4cF9sb29rdXAoRklYUF9EQkwgeCwgSU5UICp4X2UpIHsKICAgVUlOVCB5ID0gKElOVCl4OwogICBJTlQgZTsKIApAQCAtMTY2LDEwNiArMjU1LDE1MyBAQAogICB9CiAKICAgLyogTm9ybWFsaXplICovCi0gIGU9Zml4bm9ybXpfRCh5KTsKLSAgeTw8PWU7Ci0gIGUgID0gKnhfZSAtIGUgKyAyOworICBlID0gZml4bm9ybXpfRCh5KTsKKyAgeSA8PD0gZTsKKyAgZSA9ICp4X2UgLSBlICsgMjsKIAogICAvKiBDb3JyZWN0IG9kZCBleHBvbmVudC4gKi8KICAgaWYgKGUgJiAxKSB7CiAgICAgeSA+Pj0gMTsKLSAgICBlICsrOworICAgIGUrKzsKICAgfQogICAvKiBHZXQgc3F1YXJlIHJvb3QgKi8KLSAgVUlOVCBpZHg9KHk+PjI2KS0xNjsKLSAgVVNIT1JUIGZyYWM9KHk+PjEwKSYweGZmZmY7Ci0gIFVTSE9SVCBuZnJhYz0weGZmZmZeZnJhYzsKLSAgVUlOVCB0PW5mcmFjKnNxcnRfdGFiW2lkeF0rZnJhYypzcXJ0X3RhYltpZHgrMV07CisgIFVJTlQgaWR4ID0gKHkgPj4gMjYpIC0gMTY7CisgIFVTSE9SVCBmcmFjID0gKHkgPj4gMTApICYgMHhmZmZmOworICBVU0hPUlQgbmZyYWMgPSAweGZmZmYgXiBmcmFjOworICBVSU5UIHQgPSAoVUlOVCluZnJhYyAqIHNxcnRfdGFiW2lkeF0gKyAoVUlOVClmcmFjICogc3FydF90YWJbaWR4ICsgMV07CiAKICAgLyogV3JpdGUgYmFjayBleHBvbmVudCAqLwogICAqeF9lID0gZSA+PiAxOwotICByZXR1cm4gKEZJWFBfREJMKShMT05HKSh0Pj4xKTsKKyAgcmV0dXJuIChGSVhQX0RCTCkoTE9ORykodCA+PiAxKTsKIH0KIAotCi0KLUZJWFBfREJMIHNxcnRGaXhwKEZJWFBfREJMIG9wKTsKLQogdm9pZCBJbml0SW52U3FydFRhYigpOwogCi1GSVhQX0RCTCBpbnZTcXJ0Tm9ybTIoRklYUF9EQkwgb3AsIElOVCAqc2hpZnQpOwotCisjaWZuZGVmIEZVTkNUSU9OX2ludlNxcnROb3JtMgorLyoqCisgKiBcYnJpZWYgY2FsY3VsYXRlIDEuMC9zcXJ0KG9wKQorICogXHBhcmFtIG9wX20gbWFudGlzc2Egb2YgaW5wdXQgdmFsdWUuCisgKiBccGFyYW0gcmVzdWx0X2UgcG9pbnRlciB0byByZXR1cm4gdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQKKyAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdAorICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIGZ1bmN0aW9ubmFtZTogaW52Rml4cAotICAgIGRlc2NyaXB0aW9uOiAgZGVsaXZlcnMgMS8ob3ApCi0KKyAgZGVsaXZlcnMgMS9zcXJ0KG9wKSBub3JtYWxpemVkIHRvIC41Li4uMSBhbmQgdGhlIHNoaWZ0IHZhbHVlIG9mIHRoZSBPVVRQVVQsCisgIGkuZS4gdGhlIGRlbm9ybWFsaXplZCByZXN1bHQgaXMgMS9zcXJ0KG9wKSA9IGludlNxcnROb3JtKG9wKSAqIDJeKHNoaWZ0KQorICB1c2VzIE5ld3Rvbi1pdGVyYXRpb24gZm9yIGFwcHJveGltYXRpb24KKyAgICAgIFEobisxKSA9IFEobikgKyBRKG4pICogKDAuNSAtIDIgKiBWICogUShuKV4yKQorICAgICAgd2l0aCBRID0gMC41KiBWIF4tMC41OyAwLjUgPD0gViA8IDEuMAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbmxpbmUgRklYUF9EQkwgaW52Rml4cChGSVhQX0RCTCBvcCkKLXsKLSAgICBJTlQgdG1wX2V4cCA7Ci0gICAgRklYUF9EQkwgdG1wX2ludiA9IGludlNxcnROb3JtMihvcCwgJnRtcF9leHApIDsKLSAgICBGREtfQVNTRVJUKCgzMS0oMip0bXBfZXhwKzEpKT49MCkgOwotICAgIHJldHVybiAoIGZQb3cyRGl2MiggKEZJWFBfREJMKXRtcF9pbnYgKSA+PiAoMzEtKDIqdG1wX2V4cCsxKSkgKSA7CitzdGF0aWMgRkRLX0ZPUkNFSU5MSU5FIEZJWFBfREJMIGludlNxcnROb3JtMihGSVhQX0RCTCBvcCwgSU5UICpzaGlmdCkgeworICBGSVhQX0RCTCB2YWwgPSBvcDsKKyAgRklYUF9EQkwgcmVnMSwgcmVnMjsKKworICBpZiAodmFsID09IEZMMkZYQ09OU1RfREJMKDAuMCkpIHsKKyAgICAqc2hpZnQgPSAxNjsKKyAgICByZXR1cm4gKChMT05HKU1BWFZBTF9EQkwpOyAvKiBtYXhpbXVtIHBvc2l0aXZlIHZhbHVlICovCisgIH0KKworI2RlZmluZSBJTlZTUVJUTk9STTJfTElORUFSX0lOVEVSUE9MQVRFCisjZGVmaW5lIElOVlNRUlROT1JNMl9MSU5FQVJfSU5URVJQT0xBVEVfSFEKKworICAvKiBub3JtYWxpemUgaW5wdXQsIGNhbGN1bGF0ZSBzaGlmdCB2YWx1ZSAqLworICBGREtfQVNTRVJUKHZhbCA+IEZMMkZYQ09OU1RfREJMKDAuMCkpOworICAqc2hpZnQgPSBmTm9ybXoodmFsKSAtIDE7IC8qIENvdW50TGVhZGluZ0JpdHMoKSBpcyBub3QgbmVjZXNzYXJ5IGhlcmUgc2luY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0IHZhbHVlIGlzIGFsd2F5cyA+IDAgKi8KKyAgdmFsIDw8PSAqc2hpZnQ7ICAgICAgICAgICAvKiBub3JtYWxpemVkIGlucHV0IFYgKi8KKyAgKnNoaWZ0ICs9IDI7ICAgICAgICAgICAgICAvKiBiaWFzIGZvciBleHBvbmVudCAqLworCisjaWYgZGVmaW5lZChJTlZTUVJUTk9STTJfTElORUFSX0lOVEVSUE9MQVRFKQorICBJTlQgaW5kZXggPQorICAgICAgKElOVCkodmFsID4+IChERlJBQ1RfQklUUyAtIDEgLSAoU1FSVF9CSVRTICsgMSkpKSAmIFNRUlRfQklUU19NQVNLOworICBGSVhQX0RCTCBGcmFjdCA9CisgICAgICAoRklYUF9EQkwpKCgoSU5UKXZhbCAmIFNRUlRfRlJBQ1RfQklUU19NQVNLKSA8PCAoU1FSVF9CSVRTICsgMSkpOworICBGSVhQX0RCTCBkaWZmID0gaW52U3FydFRhYltpbmRleCArIDFdIC0gaW52U3FydFRhYltpbmRleF07CisgIHJlZzEgPSBpbnZTcXJ0VGFiW2luZGV4XSArIChmTXVsdERpdjIoZGlmZiwgRnJhY3QpIDw8IDEpOworI2lmIGRlZmluZWQoSU5WU1FSVE5PUk0yX0xJTkVBUl9JTlRFUlBPTEFURV9IUSkKKyAgLyogcmVnMSA9IHRbaV0gKyAodFtpKzFdLXRbaV0pKmZyYWN0IC4uLiBhbHJlYWR5IGNvbXB1dGVkIC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoMS1mcmFjdClmcmFjdCoodFtpKzJdLXRbaSsxXSkvMiAqLworICBpZiAoRnJhY3QgIT0gKEZJWFBfREJMKTApIHsKKyAgICAvKiBmcmFjdCA9IGZyYWN0ICogKDEgLSBmcmFjdCkgKi8KKyAgICBGcmFjdCA9IGZNdWx0RGl2MihGcmFjdCwgKEZJWFBfREJMKSgoVUxPTkcpMHg4MDAwMDAwMCAtIChVTE9ORylGcmFjdCkpIDw8IDE7CisgICAgZGlmZiA9IGRpZmYgLSAoaW52U3FydFRhYltpbmRleCArIDJdIC0gaW52U3FydFRhYltpbmRleCArIDFdKTsKKyAgICByZWcxID0gZk11bHRBZGREaXYyKHJlZzEsIEZyYWN0LCBkaWZmKTsKKyAgfQorI2VuZGlmIC8qIElOVlNRUlROT1JNMl9MSU5FQVJfSU5URVJQT0xBVEVfSFEgKi8KKyNlbHNlCisjZXJyb3IgXAorICAgICJFaXRoZXIgZGVmaW5lIElOVlNRUlROT1JNMl9ORVdUT05fSVRFUkFURSBvciBJTlZTUVJUTk9STTJfTElORUFSX0lOVEVSUE9MQVRFIgorI2VuZGlmCisgIC8qIGNhbGN1bGF0ZSB0aGUgb3V0cHV0IGV4cG9uZW50ID0gaW5wdXQgZXhwLzIgKi8KKyAgaWYgKCpzaGlmdCAmIDB4MDAwMDAwMDEpIHsgLyogb2RkIHNoaWZ0IHZhbHVlcyA/ICovCisgICAgLyogTm90ZTogRG8gbm90IHVzZSByb3VuZGVkIHZhbHVlIDB4NUE4Mjc5OUEgdG8gYXZvaWQgb3ZlcmZsb3cgd2l0aAorICAgICAqIHNoaWZ0LWJ5LTIgKi8KKyAgICByZWcyID0gKEZJWFBfREJMKTB4NUE4Mjc5OTk7CisgICAgLyogRkwyRlhDT05TVF9EQkwoMC43MDcxMDY3ODExODY1NDc1MjQ0MDA4NDQzNjIxMDQ4NDlmKTsqLyAvKiAxL3NxcnQoMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICByZWcxID0gZk11bHREaXYyKHJlZzEsIHJlZzIpIDw8IDI7CisgIH0KKworICAqc2hpZnQgPSAqc2hpZnQgPj4gMTsKKworICByZXR1cm4gKHJlZzEpOworfQorI2VuZGlmIC8qIEZVTkNUSU9OX2ludlNxcnROb3JtMiAqLworCisjaWZuZGVmIEZVTkNUSU9OX3NxcnRGaXhwCitzdGF0aWMgRkRLX0ZPUkNFSU5MSU5FIEZJWFBfREJMIHNxcnRGaXhwKEZJWFBfREJMIG9wKSB7CisgIElOVCB0bXBfZXhwID0gMDsKKyAgRklYUF9EQkwgdG1wX2ludiA9IGludlNxcnROb3JtMihvcCwgJnRtcF9leHApOworCisgIEZES19BU1NFUlQodG1wX2V4cCA+IDApOworICByZXR1cm4gKChGSVhQX0RCTCkoZk11bHREaXYyKChvcCA8PCAodG1wX2V4cCAtIDEpKSwgdG1wX2ludikgPDwgMikpOworfQorI2VuZGlmIC8qIEZVTkNUSU9OX3NxcnRGaXhwICovCisKKyNpZm5kZWYgRlVOQ1RJT05faW52Rml4cAorLyoqCisgKiBcYnJpZWYgY2FsY3VsYXRlIDEuMC9vcAorICogXHBhcmFtIG9wIG1hbnRpc3NhIG9mIHRoZSBpbnB1dCB2YWx1ZS4KKyAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdCB3aXRoIGltcGxpY2l0IGV4cG9uZW50IG9mIDMxCisgKiBcZXhjZXB0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIG9wPTAsMSBzZXR0aW5nIG1heC4gcG9zaXRpdmUgdmFsdWUKKyAqLworc3RhdGljIGlubGluZSBGSVhQX0RCTCBpbnZGaXhwKEZJWFBfREJMIG9wKSB7CisgIGlmICgob3AgPT0gKEZJWFBfREJMKTB4MDAwMDAwMDApIHx8IChvcCA9PSAoRklYUF9EQkwpMHgwMDAwMDAwMSkpIHsKKyAgICByZXR1cm4gKChMT05HKU1BWFZBTF9EQkwpOworICB9CisgIElOVCB0bXBfZXhwOworICBGSVhQX0RCTCB0bXBfaW52ID0gaW52U3FydE5vcm0yKG9wLCAmdG1wX2V4cCk7CisgIEZES19BU1NFUlQoKDMxIC0gKDIgKiB0bXBfZXhwICsgMSkpID49IDApOworICBpbnQgc2hpZnQgPSAzMSAtICgyICogdG1wX2V4cCArIDEpOworICB0bXBfaW52ID0gZlBvdzJEaXYyKHRtcF9pbnYpOworICBpZiAoc2hpZnQpIHsKKyAgICB0bXBfaW52ID0gKCh0bXBfaW52ID4+IChzaGlmdCAtIDEpKSArIChGSVhQX0RCTCkxKSA+PiAxOworICB9CisgIHJldHVybiB0bXBfaW52OwogfQogCisvKioKKyAqIFxicmllZiBjYWxjdWxhdGUgMS4wLyhvcF9tICogMl5vcF9lKQorICogXHBhcmFtIG9wX20gbWFudGlzc2Egb2YgdGhlIGlucHV0IHZhbHVlLgorICogXHBhcmFtIG9wX2UgcG9pbnRlciBpbnRvIHdlcmUgdGhlIGV4cG9uZW50IG9mIHRoZSBpbnB1dCB2YWx1ZSBpcyBzdG9yZWQsIGFuZAorICogdGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZCBpbnRvLgorICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CisgKi8KK3N0YXRpYyBpbmxpbmUgRklYUF9EQkwgaW52Rml4cChGSVhQX0RCTCBvcF9tLCBpbnQgKm9wX2UpIHsKKyAgaWYgKChvcF9tID09IChGSVhQX0RCTCkweDAwMDAwMDAwKSB8fCAob3BfbSA9PSAoRklYUF9EQkwpMHgwMDAwMDAwMSkpIHsKKyAgICAqb3BfZSA9IDMxIC0gKm9wX2U7CisgICAgcmV0dXJuICgoTE9ORylNQVhWQUxfREJMKTsKKyAgfQogCisgIElOVCB0bXBfZXhwOworICBGSVhQX0RCTCB0bXBfaW52ID0gaW52U3FydE5vcm0yKG9wX20sICZ0bXBfZXhwKTsKIAotI2lmIGRlZmluZWQoX19taXBzX18pICYmIChfX0dOVUNfXz09MikKLQotI2RlZmluZSBGVU5DVElPTl9zY2h1cl9kaXYKLWlubGluZSBGSVhQX0RCTCBzY2h1cl9kaXYoRklYUF9EQkwgbnVtLEZJWFBfREJMIGRlbnVtLCBJTlQgY291bnQpCi17Ci0gIElOVCByZXN1bHQsIHRtcCA7Ci0gICBfX2FzbV9fICgic3JsICUxLCAlMiwgMTVcbiIKLSAgICAgICAgICAgICJkaXYgJTMsICUxXG4iIDogIj1sbyIgKHJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiVkIiAodG1wKSwgImQiIChkZW51bSkgLCAgImQiIChudW0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJoaSIgKSA7Ci0gIHJldHVybiByZXN1bHQ8PDE2IDsKKyAgKm9wX2UgPSAodG1wX2V4cCA8PCAxKSAtICpvcF9lICsgMTsKKyAgcmV0dXJuIGZQb3cyRGl2Mih0bXBfaW52KTsKIH0KKyNlbmRpZiAvKiBGVU5DVElPTl9pbnZGaXhwICovCiAKLS8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCi0jZWxpZiBkZWZpbmVkKF9fbWlwc19fKSAmJiAoX19HTlVDX189PTMpCisjaWZuZGVmIEZVTkNUSU9OX3NjaHVyX2RpdgogCi0jZGVmaW5lIEZVTkNUSU9OX3NjaHVyX2RpdgotaW5saW5lIEZJWFBfREJMIHNjaHVyX2RpdihGSVhQX0RCTCBudW0sRklYUF9EQkwgZGVudW0sIElOVCBjb3VudCkKLXsKLSAgSU5UIHJlc3VsdCwgdG1wOwotCi0gICBfX2FzbV9fICgic3JsICAlW3RtcF0sICVbZGVudW1dLCAxNVxuIgotICAgICAgICAgICAgImRpdiAlW3Jlc3VsdF0sICVbbnVtXSwgJVt0bXBdXG4iCi0gICAgICAgICAgICA6IFt0bXBdICIrciIgKHRtcCksIFtyZXN1bHRdIj1yIihyZXN1bHQpCi0gICAgICAgICAgICA6IFtkZW51bV0iciIoZGVudW0pLCBbbnVtXSJyIihudW0pCi0gICAgICAgICAgICA6ICJoaSIsICJsbyIpOwotICByZXR1cm4gcmVzdWx0IDw8IChERlJBQ1RfQklUUy0xNik7Ci19Ci0KLS8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCi0jZWxpZiBkZWZpbmVkKFNJTVVMQVRFX01JUFNfRElWKQotCi0jZGVmaW5lIEZVTkNUSU9OX3NjaHVyX2RpdgotaW5saW5lIEZJWFBfREJMIHNjaHVyX2RpdihGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbnVtLCBJTlQgY291bnQpCi17Ci0gICAgRkRLX0FTU0VSVCAoY291bnQ8PURGUkFDVF9CSVRTLTEpOwotICAgIEZES19BU1NFUlQgKG51bT49KEZJWFBfREJMKTApOwotICAgIEZES19BU1NFUlQgKGRlbnVtPihGSVhQX0RCTCkwKTsKLSAgICBGREtfQVNTRVJUIChudW0gPD0gZGVudW0pOwotCi0gICAgSU5UIHRtcCA9IGRlbnVtID4+IChjb3VudC0xKTsKLSAgICBJTlQgcmVzdWx0ID0gMDsKLQotICAgIHdoaWxlIChudW0gPiB0bXApCi0gICAgewotICAgICAgICBudW0gLT0gdG1wOwotICAgICAgICByZXN1bHQrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0IDw8IChERlJBQ1RfQklUUy1jb3VudCk7Ci19Ci0KLS8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCi0jZW5kaWYgLyogdGFyZ2V0IGFyY2hpdGVjdHVyZSBzZWxlY3RvciAqLwotCi0jaWYgIWRlZmluZWQoRlVOQ1RJT05fc2NodXJfZGl2KQogLyoqCiAgKiBcYnJpZWYgRGl2aWRlIHR3byBGSVhQX0RCTCB2YWx1ZXMgd2l0aCBnaXZlbiBwcmVjaXNpb24uCiAgKiBccGFyYW0gbnVtIGRpdmlkZW5kCkBAIC0yNzMsMzEgKzQwOSwzNCBAQAogICogXHBhcmFtIGNvdW50IGFtb3VudCBvZiBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSByZXN1bHQgKHN0YXJ0aW5nIHRvIHRoZSBNU0IpCiAgKiBccmV0dXJuIG51bS9kaXZpc29yCiAgKi8KLUZJWFBfREJMIHNjaHVyX2RpdihGSVhQX0RCTCBudW0sRklYUF9EQkwgZGVudW0sIElOVCBjb3VudCk7Ci0jZW5kaWYKIAorRklYUF9EQkwgc2NodXJfZGl2KEZJWFBfREJMIG51bSwgRklYUF9EQkwgZGVudW0sIElOVCBjb3VudCk7CiAKKyNlbmRpZiAvKiBGVU5DVElPTl9zY2h1cl9kaXYgKi8KIAotRklYUF9EQkwgbXVsX2RibF9zZ2xfcm5kIChjb25zdCBGSVhQX0RCTCBvcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIG9wMik7CitGSVhQX0RCTCBtdWxfZGJsX3NnbF9ybmQoY29uc3QgRklYUF9EQkwgb3AxLCBjb25zdCBGSVhQX1NHTCBvcDIpOwogCisjaWZuZGVmIEZVTkNUSU9OX2ZNdWx0Tm9ybQogLyoqCiAgKiBcYnJpZWYgbXVsdGlwbHkgdHdvIHZhbHVlcyB3aXRoIG5vcm1hbGl6YXRpb24sIHRodXMgbWF4IHByZWNpc2lvbi4KICAqIEF1dGhvcjogUm9iZXJ0IFdlaWRuZXIKICAqCiAgKiBccGFyYW0gZjEgZmlyc3QgZmFjdG9yCi0gKiBccGFyYW0gZjIgc2Vjb2QgZmFjdG9yCi0gKiBccGFyYW0gcmVzdWx0X2UgcG9pbnRlciB0byBhbiBJTlQgd2hlcmUgdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQgaXMgc3RvcmVkIGludG8KKyAqIFxwYXJhbSBmMiBzZWNvbmQgZmFjdG9yCisgKiBccGFyYW0gcmVzdWx0X2UgcG9pbnRlciB0byBhbiBJTlQgd2hlcmUgdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQgaXMgc3RvcmVkCisgKiBpbnRvCiAgKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSBwcm9kdWN0IGYxKmYyCiAgKi8KLUZJWFBfREJMIGZNdWx0Tm9ybSgKLSAgICAgICAgRklYUF9EQkwgZjEsCi0gICAgICAgIEZJWFBfREJMIGYyLAotICAgICAgICBJTlQgKnJlc3VsdF9lCi0gICAgICAgICk7CitGSVhQX0RCTCBmTXVsdE5vcm0oRklYUF9EQkwgZjEsIEZJWFBfREJMIGYyLCBJTlQgKnJlc3VsdF9lKTsKIAotaW5saW5lIEZJWFBfREJMIGZNdWx0Tm9ybShGSVhQX0RCTCBmMSwgRklYUF9EQkwgZjIpCi17CisvKioKKyAqIFxicmllZiBNdWx0aXBseSAyIHZhbHVlcyB1c2luZyBtYXhpbXVtIHByZWNpc2lvbi4gVGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQKKyAqIGlzIDAuCisgKiBccGFyYW0gZjFfbSBtYW50aXNzYSBvZiBmYWN0b3IgMQorICogXHBhcmFtIGYyX20gbWFudGlzc2Egb2YgZmFjdG9yIDIKKyAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdCB3aXRoIGV4cG9uZW50IGVxdWFsIHRvIDAKKyAqLworaW5saW5lIEZJWFBfREJMIGZNdWx0Tm9ybShGSVhQX0RCTCBmMSwgRklYUF9EQkwgZjIpIHsKICAgRklYUF9EQkwgbTsKICAgSU5UIGU7CiAKQEAgLTMwOSwyMyArNDQ4LDIzMSBAQAogfQogCiAvKioKKyAqIFxicmllZiBNdWx0aXBseSAyIHZhbHVlcyB3aXRoIGV4cG9uZW50IGFuZCB1c2UgZ2l2ZW4gZXhwb25lbnQgZm9yIHRoZQorICogbWFudGlzc2Egb2YgdGhlIHJlc3VsdC4KKyAqIFxwYXJhbSBmMV9tIG1hbnRpc3NhIG9mIGZhY3RvciAxCisgKiBccGFyYW0gZjFfZSBleHBvbmVudCBvZiBmYWN0b3IgMQorICogXHBhcmFtIGYyX20gbWFudGlzc2Egb2YgZmFjdG9yIDIKKyAqIFxwYXJhbSBmMl9lIGV4cG9uZW50IG9mIGZhY3RvciAyCisgKiBccGFyYW0gcmVzdWx0X2UgZXhwb25lbnQgZm9yIHRoZSByZXR1cm5lZCBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CisgKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQgd2l0aCBleHBvbmVudCBlcXVhbCB0byByZXN1bHRfZQorICovCitpbmxpbmUgRklYUF9EQkwgZk11bHROb3JtKEZJWFBfREJMIGYxX20sIElOVCBmMV9lLCBGSVhQX0RCTCBmMl9tLCBJTlQgZjJfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHJlc3VsdF9lKSB7CisgIEZJWFBfREJMIG07CisgIElOVCBlOworCisgIG0gPSBmTXVsdE5vcm0oZjFfbSwgZjJfbSwgJmUpOworCisgIG0gPSBzY2FsZVZhbHVlU2F0dXJhdGUobSwgZSArIGYxX2UgKyBmMl9lIC0gcmVzdWx0X2UpOworCisgIHJldHVybiBtOworfQorI2VuZGlmIC8qIEZVTkNUSU9OX2ZNdWx0Tm9ybSAqLworCisjaWZuZGVmIEZVTkNUSU9OX2ZNdWx0SQorLyoqCisgKiBcYnJpZWYgTXVsdGlwbGllcyBhIGZyYWN0aW9uYWwgdmFsdWUgYW5kIGEgaW50ZWdlciB2YWx1ZSBhbmQgcGVyZm9ybXMKKyAqIHJvdW5kaW5nIHRvIG5lYXJlc3QKKyAqIFxwYXJhbSBhIGZyYWN0aW9uYWwgdmFsdWUKKyAqIFxwYXJhbSBiIGludGVnZXIgdmFsdWUKKyAqIFxyZXR1cm4gaW50ZWdlciB2YWx1ZQorICovCitpbmxpbmUgSU5UIGZNdWx0SShGSVhQX0RCTCBhLCBJTlQgYikgeworICBGSVhQX0RCTCBtLCBtaTsKKyAgSU5UIG1fZTsKKworICBtID0gZk11bHROb3JtKGEsIChGSVhQX0RCTCliLCAmbV9lKTsKKworICBpZiAobV9lIDwgKElOVCkwKSB7CisgICAgaWYgKG1fZSA+IChJTlQpLURGUkFDVF9CSVRTKSB7CisgICAgICBtID0gbSA+PiAoKC1tX2UpIC0gMSk7CisgICAgICBtaSA9IChtICsgKEZJWFBfREJMKTEpID4+IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIG1pID0gKEZJWFBfREJMKTA7CisgICAgfQorICB9IGVsc2UgeworICAgIG1pID0gc2NhbGVWYWx1ZVNhdHVyYXRlKG0sIG1fZSk7CisgIH0KKworICByZXR1cm4gKChJTlQpbWkpOworfQorI2VuZGlmIC8qIEZVTkNUSU9OX2ZNdWx0SSAqLworCisjaWZuZGVmIEZVTkNUSU9OX2ZNdWx0SWZsb29yCisvKioKKyAqIFxicmllZiBNdWx0aXBsaWVzIGEgZnJhY3Rpb25hbCB2YWx1ZSBhbmQgYSBpbnRlZ2VyIHZhbHVlIGFuZCBwZXJmb3JtcyBmbG9vcgorICogcm91bmRpbmcKKyAqIFxwYXJhbSBhIGZyYWN0aW9uYWwgdmFsdWUKKyAqIFxwYXJhbSBiIGludGVnZXIgdmFsdWUKKyAqIFxyZXR1cm4gaW50ZWdlciB2YWx1ZQorICovCitpbmxpbmUgSU5UIGZNdWx0SWZsb29yKEZJWFBfREJMIGEsIElOVCBiKSB7CisgIEZJWFBfREJMIG0sIG1pOworICBJTlQgbV9lOworCisgIG0gPSBmTXVsdE5vcm0oYSwgKEZJWFBfREJMKWIsICZtX2UpOworCisgIGlmIChtX2UgPCAoSU5UKTApIHsKKyAgICBpZiAobV9lID4gKElOVCktREZSQUNUX0JJVFMpIHsKKyAgICAgIG1pID0gbSA+PiAoLW1fZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1pID0gKEZJWFBfREJMKTA7CisgICAgICBpZiAobSA8IChGSVhQX0RCTCkwKSB7CisgICAgICAgIG1pID0gKEZJWFBfREJMKS0xOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtaSA9IHNjYWxlVmFsdWVTYXR1cmF0ZShtLCBtX2UpOworICB9CisKKyAgcmV0dXJuICgoSU5UKW1pKTsKK30KKyNlbmRpZiAvKiBGVU5DVElPTl9mTXVsdElmbG9vciAqLworCisjaWZuZGVmIEZVTkNUSU9OX2ZNdWx0SWNlaWwKKy8qKgorICogXGJyaWVmIE11bHRpcGxpZXMgYSBmcmFjdGlvbmFsIHZhbHVlIGFuZCBhIGludGVnZXIgdmFsdWUgYW5kIHBlcmZvcm1zIGNlaWwKKyAqIHJvdW5kaW5nCisgKiBccGFyYW0gYSBmcmFjdGlvbmFsIHZhbHVlCisgKiBccGFyYW0gYiBpbnRlZ2VyIHZhbHVlCisgKiBccmV0dXJuIGludGVnZXIgdmFsdWUKKyAqLworaW5saW5lIElOVCBmTXVsdEljZWlsKEZJWFBfREJMIGEsIElOVCBiKSB7CisgIEZJWFBfREJMIG0sIG1pOworICBJTlQgbV9lOworCisgIG0gPSBmTXVsdE5vcm0oYSwgKEZJWFBfREJMKWIsICZtX2UpOworCisgIGlmIChtX2UgPCAoSU5UKTApIHsKKyAgICBpZiAobV9lID4gKElOVCktREZSQUNUX0JJVFMpIHsKKyAgICAgIG1pID0gKG0gPj4gKC1tX2UpKTsKKyAgICAgIGlmICgoTE9ORyltICYgKCgxIDw8ICgtbV9lKSkgLSAxKSkgeworICAgICAgICBtaSA9IG1pICsgKEZJWFBfREJMKTE7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG1pID0gKEZJWFBfREJMKTE7CisgICAgICBpZiAobSA8IChGSVhQX0RCTCkwKSB7CisgICAgICAgIG1pID0gKEZJWFBfREJMKTA7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIG1pID0gc2NhbGVWYWx1ZVNhdHVyYXRlKG0sIG1fZSk7CisgIH0KKworICByZXR1cm4gKChJTlQpbWkpOworfQorI2VuZGlmIC8qIEZVTkNUSU9OX2ZNdWx0SWNlaWwgKi8KKworI2lmbmRlZiBGVU5DVElPTl9mRGl2Tm9ybQorLyoqCiAgKiBcYnJpZWYgRGl2aWRlIDIgRklYUF9EQkwgdmFsdWVzIHdpdGggbm9ybWFsaXphdGlvbiBvZiBpbnB1dCB2YWx1ZXMuCiAgKiBccGFyYW0gbnVtIG51bWVyYXRvcgotICogXHBhcmFtIGRlbnVtIGRlbm9taW50YXRvcgotICogXHJldHVybiBudW0vZGVudW0gd2l0aCBleHBvbmVudCA9IDAKKyAqIFxwYXJhbSBkZW51bSBkZW5vbWluYXRvcgorICogXHBhcmFtIHJlc3VsdF9lIHBvaW50ZXIgdG8gYW4gSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IGlzIHN0b3JlZAorICogaW50bworICogXHJldHVybiBudW0vZGVudW0gd2l0aCBleHBvbmVudCA9ICpyZXN1bHRfZQogICovCiBGSVhQX0RCTCBmRGl2Tm9ybShGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbm9tLCBJTlQgKnJlc3VsdF9lKTsKIAogLyoqCi0gKiBcYnJpZWYgRGl2aWRlIDIgRklYUF9EQkwgdmFsdWVzIHdpdGggbm9ybWFsaXphdGlvbiBvZiBpbnB1dCB2YWx1ZXMuCisgKiBcYnJpZWYgRGl2aWRlIDIgcG9zaXRpdmUgRklYUF9EQkwgdmFsdWVzIHdpdGggbm9ybWFsaXphdGlvbiBvZiBpbnB1dCB2YWx1ZXMuCiAgKiBccGFyYW0gbnVtIG51bWVyYXRvcgotICogXHBhcmFtIGRlbnVtIGRlbm9taW50YXRvcgotICogXHBhcmFtIHJlc3VsdF9lIHBvaW50ZXIgdG8gYW4gSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IGlzIHN0b3JlZCBpbnRvCi0gKiBccmV0dXJuIG51bS9kZW51bSB3aXRoIGV4cG9uZW50ID0gKnJlc3VsdF9lCisgKiBccGFyYW0gZGVudW0gZGVub21pbmF0b3IKKyAqIFxyZXR1cm4gbnVtL2RlbnVtIHdpdGggZXhwb25lbnQgPSAwCiAgKi8KIEZJWFBfREJMIGZEaXZOb3JtKEZJWFBfREJMIG51bSwgRklYUF9EQkwgZGVub20pOwogCiAvKioKKyAqIFxicmllZiBEaXZpZGUgMiBzaWduZWQgRklYUF9EQkwgdmFsdWVzIHdpdGggbm9ybWFsaXphdGlvbiBvZiBpbnB1dCB2YWx1ZXMuCisgKiBccGFyYW0gbnVtIG51bWVyYXRvcgorICogXHBhcmFtIGRlbnVtIGRlbm9taW5hdG9yCisgKiBccGFyYW0gcmVzdWx0X2UgcG9pbnRlciB0byBhbiBJTlQgd2hlcmUgdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQgaXMgc3RvcmVkCisgKiBpbnRvCisgKiBccmV0dXJuIG51bS9kZW51bSB3aXRoIGV4cG9uZW50ID0gKnJlc3VsdF9lCisgKi8KK0ZJWFBfREJMIGZEaXZOb3JtU2lnbmVkKEZJWFBfREJMIExfbnVtLCBGSVhQX0RCTCBMX2RlbnVtLCBJTlQgKnJlc3VsdF9lKTsKKworLyoqCisgKiBcYnJpZWYgRGl2aWRlIDIgc2lnbmVkIEZJWFBfREJMIHZhbHVlcyB3aXRoIG5vcm1hbGl6YXRpb24gb2YgaW5wdXQgdmFsdWVzLgorICogXHBhcmFtIG51bSBudW1lcmF0b3IKKyAqIFxwYXJhbSBkZW51bSBkZW5vbWluYXRvcgorICogXHJldHVybiBudW0vZGVudW0gd2l0aCBleHBvbmVudCA9IDAKKyAqLworRklYUF9EQkwgZkRpdk5vcm1TaWduZWQoRklYUF9EQkwgbnVtLCBGSVhQX0RCTCBkZW5vbSk7CisjZW5kaWYgLyogRlVOQ1RJT05fZkRpdk5vcm0gKi8KKworLyoqCisgKiBcYnJpZWYgQWRqdXN0IG1hbnRpc3NhIHRvIGV4cG9uZW50IC0xCisgKiBccGFyYW0gYV9tIG1hbnRpc3NhIG9mIHZhbHVlIHRvIGJlIGFkanVzdGVkCisgKiBccGFyYW0gcEFfZSBwb2ludGVyIHRvIHRoZSBleHBvbmVuIG9mIGFfbQorICogXHJldHVybiBhZGp1c3RlZCBtYW50aXNzYQorICovCitpbmxpbmUgRklYUF9EQkwgZkFkanVzdChGSVhQX0RCTCBhX20sIElOVCAqcEFfZSkgeworICBJTlQgc2hpZnQ7CisKKyAgc2hpZnQgPSBmTm9ybShhX20pIC0gMTsKKyAgKnBBX2UgLT0gc2hpZnQ7CisKKyAgcmV0dXJuIHNjYWxlVmFsdWUoYV9tLCBzaGlmdCk7Cit9CisKKyNpZm5kZWYgRlVOQ1RJT05fZkFkZE5vcm0KKy8qKgorICogXGJyaWVmIEFkZCB0d28gdmFsdWVzIHdpdGggbm9ybWFsaXphdGlvbgorICogXHBhcmFtIGFfbSBtYW50aXNzYSBvZiBmaXJzdCBzdW1tYW5kCisgKiBccGFyYW0gYV9lIGV4cG9uZW50IG9mIGZpcnN0IHN1bW1hbmQKKyAqIFxwYXJhbSBhX20gbWFudGlzc2Egb2Ygc2Vjb25kIHN1bW1hbmQKKyAqIFxwYXJhbSBhX2UgZXhwb25lbnQgb2Ygc2Vjb25kIHN1bW1hbmQKKyAqIFxwYXJhbSBwUmVzdWx0X2UgcG9pbnRlciB0byB3aGVyZSB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZAorICogdG8uCisgKiBccmV0dXJuIG1hbnRpc3NhIG9mIHJlc3VsdAorICovCitpbmxpbmUgRklYUF9EQkwgZkFkZE5vcm0oRklYUF9EQkwgYV9tLCBJTlQgYV9lLCBGSVhQX0RCTCBiX20sIElOVCBiX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwUmVzdWx0X2UpIHsKKyAgSU5UIHJlc3VsdF9lOworICBGSVhQX0RCTCByZXN1bHRfbTsKKworICAvKiBJZiBvbmUgb2YgdGhlIHN1bW1hbmRzIGlzIHplcm8sIHJldHVybiB0aGUgb3RoZXIuCisgICAgIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciB0aGUgc3VtbWF0aW9uIG9mIGEgdmVyeSBzbWFsbCBudW1iZXIgdG8gemVybyAqLworICBpZiAoYV9tID09IChGSVhQX0RCTCkwKSB7CisgICAgKnBSZXN1bHRfZSA9IGJfZTsKKyAgICByZXR1cm4gYl9tOworICB9CisgIGlmIChiX20gPT0gKEZJWFBfREJMKTApIHsKKyAgICAqcFJlc3VsdF9lID0gYV9lOworICAgIHJldHVybiBhX207CisgIH0KKworICBhX20gPSBmQWRqdXN0KGFfbSwgJmFfZSk7CisgIGJfbSA9IGZBZGp1c3QoYl9tLCAmYl9lKTsKKworICBpZiAoYV9lID4gYl9lKSB7CisgICAgcmVzdWx0X20gPSBhX20gKyAoYl9tID4+IGZNaW4oYV9lIC0gYl9lLCBERlJBQ1RfQklUUyAtIDEpKTsKKyAgICByZXN1bHRfZSA9IGFfZTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHRfbSA9IChhX20gPj4gZk1pbihiX2UgLSBhX2UsIERGUkFDVF9CSVRTIC0gMSkpICsgYl9tOworICAgIHJlc3VsdF9lID0gYl9lOworICB9CisKKyAgKnBSZXN1bHRfZSA9IHJlc3VsdF9lOworICByZXR1cm4gcmVzdWx0X207Cit9CisKK2lubGluZSBGSVhQX0RCTCBmQWRkTm9ybShGSVhQX0RCTCBhX20sIElOVCBhX2UsIEZJWFBfREJMIGJfbSwgSU5UIGJfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgcmVzdWx0X2UpIHsKKyAgRklYUF9EQkwgcmVzdWx0X207CisKKyAgYV9tID0gc2NhbGVWYWx1ZShhX20sIGFfZSAtIHJlc3VsdF9lKTsKKyAgYl9tID0gc2NhbGVWYWx1ZShiX20sIGJfZSAtIHJlc3VsdF9lKTsKKworICByZXN1bHRfbSA9IGFfbSArIGJfbTsKKworICByZXR1cm4gcmVzdWx0X207Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fZkFkZE5vcm0gKi8KKworLyoqCiAgKiBcYnJpZWYgRGl2aWRlIDIgRklYUF9EQkwgdmFsdWVzIHdpdGggbm9ybWFsaXphdGlvbiBvZiBpbnB1dCB2YWx1ZXMuCiAgKiBccGFyYW0gbnVtIG51bWVyYXRvcgogICogXHBhcmFtIGRlbnVtIGRlbm9taW50YXRvcgpAQCAtMzMzLDggKzY4MCw4NCBAQAogICovCiBGSVhQX0RCTCBmRGl2Tm9ybUhpZ2hQcmVjKEZJWFBfREJMIExfbnVtLCBGSVhQX0RCTCBMX2RlbnVtLCBJTlQgKnJlc3VsdF9lKTsKIAorI2lmbmRlZiBGVU5DVElPTl9mUG93CiAvKioKLSAqIFxicmllZiBDYWxjdWxhdGUgbG9nKGFyZ3VtZW50KS9sb2coMikgKGxvZ2FyaXRobSB3aXRoIGJhc2UgMikuIGRlcHJlY2F0ZWQuIFVzZSBmTG9nMigpIGluc3RlYWQuCisgKiBcYnJpZWYgcmV0dXJuIDIgXiAoZXhwX20gKiAyXmV4cF9lKQorICogXHBhcmFtIGV4cF9tIG1hbnRpc3NhIG9mIHRoZSBleHBvbmVudCB0byAyLjBmCisgKiBccGFyYW0gZXhwX2UgZXhwb25lbnQgb2YgdGhlIGV4cG9uZW50IHRvIDIuMGYKKyAqIFxwYXJhbSByZXN1bHRfZSBwb2ludGVyIHRvIGEgSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IHdpbGwgYmUKKyAqIHN0b3JlZCBpbnRvCisgKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQKKyAqLworRklYUF9EQkwgZjJQb3coY29uc3QgRklYUF9EQkwgZXhwX20sIGNvbnN0IElOVCBleHBfZSwgSU5UICpyZXN1bHRfZSk7CisKKy8qKgorICogXGJyaWVmIHJldHVybiAyIF4gKGV4cF9tICogMl5leHBfZSkuIFRoaXMgdmVyc2lvbiByZXR1cm5zIG9ubHkgdGhlIG1hbnRpc3NhCisgKiB3aXRoIGltcGxpY2l0IGV4cG9uZW50IG9mIHplcm8uCisgKiBccGFyYW0gZXhwX20gbWFudGlzc2Egb2YgdGhlIGV4cG9uZW50IHRvIDIuMGYKKyAqIFxwYXJhbSBleHBfZSBleHBvbmVudCBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgorICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CisgKi8KK0ZJWFBfREJMIGYyUG93KGNvbnN0IEZJWFBfREJMIGV4cF9tLCBjb25zdCBJTlQgZXhwX2UpOworCisvKioKKyAqIFxicmllZiByZXR1cm4geCBeIChleHBfbSAqIDJeZXhwX2UpLCB3aGVyZSBsb2cyKHgpID0gYmFzZUxkX20gKiAyXihiYXNlTGRfZSkuCisgKiBUaGlzIHNhdmVzIHRoZSBuZWVkIHRvIGNvbXB1dGUgbG9nMigpIG9mIGNvbnN0YW50IHZhbHVlcyAod2hlbiB4IGlzIGEKKyAqIGNvbnN0YW50KS4KKyAqIFxwYXJhbSBiYXNlTGRfbSBtYW50aXNzYSBvZiBsb2cyKCkgb2YgeC4KKyAqIFxwYXJhbSBiYXNlTGRfZSBleHBvbmVudCBvZiBsb2cyKCkgb2YgeC4KKyAqIFxwYXJhbSBleHBfbSBtYW50aXNzYSBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgorICogXHBhcmFtIGV4cF9lIGV4cG9uZW50IG9mIHRoZSBleHBvbmVudCB0byAyLjBmCisgKiBccGFyYW0gcmVzdWx0X2UgcG9pbnRlciB0byBhIElOVCB3aGVyZSB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCB3aWxsIGJlCisgKiBzdG9yZWQgaW50bworICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CisgKi8KK0ZJWFBfREJMIGZMZFBvdyhGSVhQX0RCTCBiYXNlTGRfbSwgSU5UIGJhc2VMZF9lLCBGSVhQX0RCTCBleHBfbSwgSU5UIGV4cF9lLAorICAgICAgICAgICAgICAgIElOVCAqcmVzdWx0X2UpOworCisvKioKKyAqIFxicmllZiByZXR1cm4geCBeIChleHBfbSAqIDJeZXhwX2UpLCB3aGVyZSBsb2cyKHgpID0gYmFzZUxkX20gKiAyXihiYXNlTGRfZSkuCisgKiBUaGlzIHNhdmVzIHRoZSBuZWVkIHRvIGNvbXB1dGUgbG9nMigpIG9mIGNvbnN0YW50IHZhbHVlcyAod2hlbiB4IGlzIGEKKyAqIGNvbnN0YW50KS4gVGhpcyB2ZXJzaW9uIGRvZXMgbm90IHJldHVybiBhbiBleHBvbmVudCwgd2hpY2ggaXMKKyAqIGltcGxpY2l0bHkgMC4KKyAqIFxwYXJhbSBiYXNlTGRfbSBtYW50aXNzYSBvZiBsb2cyKCkgb2YgeC4KKyAqIFxwYXJhbSBiYXNlTGRfZSBleHBvbmVudCBvZiBsb2cyKCkgb2YgeC4KKyAqIFxwYXJhbSBleHBfbSBtYW50aXNzYSBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgorICogXHBhcmFtIGV4cF9lIGV4cG9uZW50IG9mIHRoZSBleHBvbmVudCB0byAyLjBmCisgKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQKKyAqLworRklYUF9EQkwgZkxkUG93KEZJWFBfREJMIGJhc2VMZF9tLCBJTlQgYmFzZUxkX2UsIEZJWFBfREJMIGV4cF9tLCBJTlQgZXhwX2UpOworCisvKioKKyAqIFxicmllZiByZXR1cm4gKGJhc2VfbSAqIDJeYmFzZV9lKSBeIChleHAgKiAyXmV4cF9lKS4gVXNlIGZMZFBvdygpIGluc3RlYWQKKyAqIHdoZW5ldmVyIHBvc3NpYmxlLgorICogXHBhcmFtIGJhc2VfbSBtYW50aXNzYSBvZiB0aGUgYmFzZS4KKyAqIFxwYXJhbSBiYXNlX2UgZXhwb25lbnQgb2YgdGhlIGJhc2UuCisgKiBccGFyYW0gZXhwX20gbWFudGlzc2Egb2YgcG93ZXIgdG8gYmUgY2FsY3VsYXRlZCBvZiB0aGUgYmFzZS4KKyAqIFxwYXJhbSBleHBfZSBleHBvbmVudCBvZiBwb3dlciB0byBiZSBjYWxjdWxhdGVkIG9mIHRoZSBiYXNlLgorICogXHBhcmFtIHJlc3VsdF9lIHBvaW50ZXIgdG8gYSBJTlQgd2hlcmUgdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQgd2lsbCBiZQorICogc3RvcmVkIGludG8uCisgKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQuCisgKi8KK0ZJWFBfREJMIGZQb3coRklYUF9EQkwgYmFzZV9tLCBJTlQgYmFzZV9lLCBGSVhQX0RCTCBleHBfbSwgSU5UIGV4cF9lLAorICAgICAgICAgICAgICBJTlQgKnJlc3VsdF9lKTsKKworLyoqCisgKiBcYnJpZWYgcmV0dXJuIChiYXNlX20gKiAyXmJhc2VfZSkgXiBOCisgKiBccGFyYW0gYmFzZV9tIG1hbnRpc3NhIG9mIHRoZSBiYXNlCisgKiBccGFyYW0gYmFzZV9lIGV4cG9uZW50IG9mIHRoZSBiYXNlCisgKiBccGFyYW0gTiBwb3dlciB0byBiZSBjYWxjdWxhdGVkIG9mIHRoZSBiYXNlCisgKiBccGFyYW0gcmVzdWx0X2UgcG9pbnRlciB0byBhIElOVCB3aGVyZSB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCB3aWxsIGJlCisgKiBzdG9yZWQgaW50bworICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CisgKi8KK0ZJWFBfREJMIGZQb3dJbnQoRklYUF9EQkwgYmFzZV9tLCBJTlQgYmFzZV9lLCBJTlQgTiwgSU5UICpyZXN1bHRfZSk7CisjZW5kaWYgLyogI2lmbmRlZiBGVU5DVElPTl9mUG93ICovCisKKyNpZm5kZWYgRlVOQ1RJT05fZkxvZzIKKy8qKgorICogXGJyaWVmIENhbGN1bGF0ZSBsb2coYXJndW1lbnQpL2xvZygyKSAobG9nYXJpdGhtIHdpdGggYmFzZSAyKS4gZGVwcmVjYXRlZC4KKyAqIFVzZSBmTG9nMigpIGluc3RlYWQuCiAgKiBccGFyYW0gYXJnIG1hbnRpc3NhIG9mIHRoZSBhcmd1bWVudAogICogXHBhcmFtIGFyZ19lIGV4cG9uZW50IG9mIHRoZSBhcmd1bWVudAogICogXHBhcmFtIHJlc3VsdF9lIHBvaW50ZXIgdG8gYW4gSU5UIHRvIHN0b3JlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0CkBAIC0zNDQsODMgKzc2Nyw3NCBAQAogRklYUF9EQkwgQ2FsY0xvZzIoRklYUF9EQkwgYXJnLCBJTlQgYXJnX2UsIElOVCAqcmVzdWx0X2UpOwogCiAvKioKLSAqIFxicmllZiByZXR1cm4gMiBeIChleHAgKiAyXmV4cF9lKQotICogXHBhcmFtIGV4cF9tIG1hbnRpc3NhIG9mIHRoZSBleHBvbmVudCB0byAyLjBmCi0gKiBccGFyYW0gZXhwX2UgZXhwb25lbnQgb2YgdGhlIGV4cG9uZW50IHRvIDIuMGYKLSAqIFxwYXJhbSByZXN1bHRfZSBwb2ludGVyIHRvIGEgSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkIGludG8KLSAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdAotICovCi1GSVhQX0RCTCBmMlBvdyhjb25zdCBGSVhQX0RCTCBleHBfbSwgY29uc3QgSU5UIGV4cF9lLCBJTlQgKnJlc3VsdF9lKTsKLQotLyoqCi0gKiBcYnJpZWYgcmV0dXJuIDIgXiAoZXhwX20gKiAyXmV4cF9lKS4gVGhpcyB2ZXJzaW9uIHJldHVybnMgb25seSB0aGUgbWFudGlzc2Egd2l0aCBpbXBsaWNpdCBleHBvbmVudCBvZiB6ZXJvLgotICogXHBhcmFtIGV4cF9tIG1hbnRpc3NhIG9mIHRoZSBleHBvbmVudCB0byAyLjBmCi0gKiBccGFyYW0gZXhwX2UgZXhwb25lbnQgb2YgdGhlIGV4cG9uZW50IHRvIDIuMGYKLSAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdAotICovCi1GSVhQX0RCTCBmMlBvdyhjb25zdCBGSVhQX0RCTCBleHBfbSwgY29uc3QgSU5UIGV4cF9lKTsKLQotLyoqCi0gKiBcYnJpZWYgcmV0dXJuIHggXiAoZXhwICogMl5leHBfZSksIHdoZXJlIGxvZzIoeCkgPSBiYXNlTGRfbSAqIDJeKGJhc2VMZF9lKS4gVGhpcyBzYXZlcwotICogICAgICAgIHRoZSBuZWVkIHRvIGNvbXB1dGUgbG9nMigpIG9mIGNvbnN0YW50IHZhbHVlcyAod2hlbiB4IGlzIGEgY29uc3RhbnQpLgotICogXHBhcmFtIGxkeF9tIG1hbnRpc3NhIG9mIGxvZzIoKSBvZiB4LgotICogXHBhcmFtIGxkeF9lIGV4cG9uZW50IG9mIGxvZzIoKSBvZiB4LgotICogXHBhcmFtIGV4cF9tIG1hbnRpc3NhIG9mIHRoZSBleHBvbmVudCB0byAyLjBmCi0gKiBccGFyYW0gZXhwX2UgZXhwb25lbnQgb2YgdGhlIGV4cG9uZW50IHRvIDIuMGYKLSAqIFxwYXJhbSByZXN1bHRfZSBwb2ludGVyIHRvIGEgSU5UIHdoZXJlIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkIGludG8KLSAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdAotICovCi1GSVhQX0RCTCBmTGRQb3coCi0gICAgICAgIEZJWFBfREJMIGJhc2VMZF9tLAotICAgICAgICBJTlQgYmFzZUxkX2UsCi0gICAgICAgIEZJWFBfREJMIGV4cF9tLCBJTlQgZXhwX2UsCi0gICAgICAgIElOVCAqcmVzdWx0X2UKLSAgICAgICAgKTsKLQotLyoqCi0gKiBcYnJpZWYgcmV0dXJuIHggXiAoZXhwICogMl5leHBfZSksIHdoZXJlIGxvZzIoeCkgPSBiYXNlTGRfbSAqIDJeKGJhc2VMZF9lKS4gVGhpcyBzYXZlcwotICogICAgICAgIHRoZSBuZWVkIHRvIGNvbXB1dGUgbG9nMigpIG9mIGNvbnN0YW50IHZhbHVlcyAod2hlbiB4IGlzIGEgY29uc3RhbnQpLiBUaGlzIHZlcnNpb24KLSAqICAgICAgICBkb2VzIG5vdCByZXR1cm4gYW4gZXhwb25lbnQsIHdoaWNoIGlzIGltcGxpY2l0bHkgMC4KLSAqIFxwYXJhbSBsZHhfbSBtYW50aXNzYSBvZiBsb2cyKCkgb2YgeC4KLSAqIFxwYXJhbSBsZHhfZSBleHBvbmVudCBvZiBsb2cyKCkgb2YgeC4KLSAqIFxwYXJhbSBleHBfbSBtYW50aXNzYSBvZiB0aGUgZXhwb25lbnQgdG8gMi4wZgotICogXHBhcmFtIGV4cF9lIGV4cG9uZW50IG9mIHRoZSBleHBvbmVudCB0byAyLjBmCi0gKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQKLSAqLwotRklYUF9EQkwgZkxkUG93KAotICAgICAgICBGSVhQX0RCTCBiYXNlTGRfbSwgSU5UIGJhc2VMZF9lLAotICAgICAgICBGSVhQX0RCTCBleHBfbSwgSU5UIGV4cF9lCi0gICAgICAgICk7Ci0KLS8qKgotICogXGJyaWVmIHJldHVybiAoYmFzZSAqIDJeYmFzZV9lKSBeIChleHAgKiAyXmV4cF9lKS4gVXNlIGZMZFBvdygpIGluc3RlYWQgd2hlbmV2ZXIgcG9zc2libGUuCi0gKiBccGFyYW0gYmFzZV9tIG1hbnRpc3NhIG9mIHRoZSBiYXNlLgotICogXHBhcmFtIGJhc2VfZSBleHBvbmVudCBvZiB0aGUgYmFzZS4KLSAqIFxwYXJhbSBleHBfbSBtYW50aXNzYSBvZiBwb3dlciB0byBiZSBjYWxjdWxhdGVkIG9mIHRoZSBiYXNlLgotICogXHBhcmFtIGV4cF9lIGV4cG9uZW50IG9mIHBvd2VyIHRvIGJlIGNhbGN1bGF0ZWQgb2YgdGhlIGJhc2UuCi0gKiBccGFyYW0gcmVzdWx0X2UgcG9pbnRlciB0byBhIElOVCB3aGVyZSB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZCBpbnRvLgotICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0LgotICovCi1GSVhQX0RCTCBmUG93KEZJWFBfREJMIGJhc2VfbSwgSU5UIGJhc2VfZSwgRklYUF9EQkwgZXhwX20sIElOVCBleHBfZSwgSU5UICpyZXN1bHRfZSk7Ci0KLS8qKgotICogXGJyaWVmIHJldHVybiAoYmFzZSAqIDJeYmFzZV9lKSBeIE4KLSAqIFxwYXJhbSBiYXNlIG1hbnRpc3NhIG9mIHRoZSBiYXNlCi0gKiBccGFyYW0gYmFzZV9lIGV4cG9uZW50IG9mIHRoZSBiYXNlCi0gKiBccGFyYW0gcG93ZXIgdG8gYmUgY2FsY3VsYXRlZCBvZiB0aGUgYmFzZQotICogXHBhcmFtIHJlc3VsdF9lIHBvaW50ZXIgdG8gYSBJTlQgd2hlcmUgdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQgaW50bwotICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0Ci0gKi8KLUZJWFBfREJMIGZQb3dJbnQoRklYUF9EQkwgYmFzZV9tLCBJTlQgYmFzZV9lLCBJTlQgTiwgSU5UICpyZXN1bHRfZSk7Ci0KLS8qKgogICogXGJyaWVmIGNhbGN1bGF0ZSBsb2dhcml0aG0gb2YgYmFzZSAyIG9mIHhfbSAqIDJeKHhfZSkKICAqIFxwYXJhbSB4X20gbWFudGlzc2Egb2YgdGhlIGlucHV0IHZhbHVlLgogICogXHBhcmFtIHhfZSBleHBvbmVudCBvZiB0aGUgaW5wdXQgdmFsdWUuCiAgKiBccGFyYW0gcG9pbnRlciB0byBhbiBJTlQgd2hlcmUgdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQgaXMgcmV0dXJuZWQgaW50by4KICAqIFxyZXR1cm4gbWFudGlzc2Egb2YgdGhlIHJlc3VsdC4KICAqLwotRklYUF9EQkwgZkxvZzIoRklYUF9EQkwgeF9tLCBJTlQgeF9lLCBJTlQgKnJlc3VsdF9lKTsKK0ZES19JTkxJTkUgRklYUF9EQkwgZkxvZzIoRklYUF9EQkwgeF9tLCBJTlQgeF9lLCBJTlQgKnJlc3VsdF9lKSB7CisgIEZJWFBfREJMIHJlc3VsdF9tOworCisgIC8qIFNob3J0IGN1dCBmb3IgemVybyBhbmQgbmVnYXRpdmUgbnVtYmVycy4gKi8KKyAgaWYgKHhfbSA8PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICpyZXN1bHRfZSA9IERGUkFDVF9CSVRTIC0gMTsKKyAgICByZXR1cm4gRkwyRlhDT05TVF9EQkwoLTEuMGYpOworICB9CisKKyAgLyogQ2FsY3VsYXRlIGxvZzIoKSAqLworICB7CisgICAgRklYUF9EQkwgeDJfbTsKKworICAgIC8qIE1vdmUgaW5wdXQgdmFsdWUgeF9tICogMl54X2UgdG93YXJkIDEuMCwgd2hlcmUgdGhlIHRheWxvciBhcHByb3hpbWF0aW9uCisgICAgICAgb2YgdGhlIGZ1bmN0aW9uIGxvZygxLXgpIGNlbnRlcmVkIGF0IDAgaXMgbW9zdCBhY2N1cmF0ZS4gKi8KKyAgICB7CisgICAgICBJTlQgYl9ub3JtOworCisgICAgICBiX25vcm0gPSBmTm9ybXooeF9tKSAtIDE7CisgICAgICB4Ml9tID0geF9tIDw8IGJfbm9ybTsKKyAgICAgIHhfZSA9IHhfZSAtIGJfbm9ybTsKKyAgICB9CisKKyAgICAvKiBtYXAgeCBmcm9tIGxvZyh4KSBkb21haW4gdG8gbG9nKDEteCkgZG9tYWluLiAqLworICAgIHgyX20gPSAtKHgyX20gKyBGTDJGWENPTlNUX0RCTCgtMS4wKSk7CisKKyAgICAvKiBUYXlsb3IgcG9seW5vbWlhbCBhcHByb3hpbWF0aW9uIG9mIGxuKDEteCkgKi8KKyAgICB7CisgICAgICBGSVhQX0RCTCBweDJfbTsKKyAgICAgIHJlc3VsdF9tID0gRkwyRlhDT05TVF9EQkwoMC4wKTsKKyAgICAgIHB4Ml9tID0geDJfbTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTERfUFJFQ0lTSU9OOyBpKyspIHsKKyAgICAgICAgcmVzdWx0X20gPSBmTXVsdEFkZERpdjIocmVzdWx0X20sIGxkQ29lZmZbaV0sIHB4Ml9tKTsKKyAgICAgICAgcHgyX20gPSBmTXVsdChweDJfbSwgeDJfbSk7CisgICAgICB9CisgICAgfQorICAgIC8qIE11bHRpcGx5IHJlc3VsdCB3aXRoIDEvbG4oMikgPSAxLjAgKyAwLjQ0MjY5NTA0MDg4OCAoZ2V0IGxvZzIoeCkgZnJvbQorICAgICAqIGxuKHgpIHJlc3VsdCkuICovCisgICAgcmVzdWx0X20gPQorICAgICAgICBmTXVsdEFkZERpdjIocmVzdWx0X20sIHJlc3VsdF9tLAorICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMi4wICogMC40NDI2OTUwNDA4ODg5NjM0MDczNTk5MjQ2ODEwMDE5KSk7CisKKyAgICAvKiBBZGQgZXhwb25lbnQgcGFydC4gbG9nMih4X20gKiAyXnhfZSkgPSBsb2cyKHhfbSkgKyB4X2UgKi8KKyAgICBpZiAoeF9lICE9IDApIHsKKyAgICAgIGludCBlbm9ybTsKKworICAgICAgZW5vcm0gPSBERlJBQ1RfQklUUyAtIGZOb3JtKChGSVhQX0RCTCl4X2UpOworICAgICAgLyogVGhlIC0xIGluIHRoZSByaWdodCBzaGlmdCBvZiByZXN1bHRfbSBjb21wZW5zYXRlcyB0aGUgZk11bHREaXYyKCkgYWJvdmUKKyAgICAgICAqIGluIHRoZSB0YXlsb3IgcG9seW5vbWlhbCBldmFsdWF0aW9uIGxvb3AuKi8KKyAgICAgIHJlc3VsdF9tID0gKHJlc3VsdF9tID4+IChlbm9ybSAtIDEpKSArCisgICAgICAgICAgICAgICAgICgoRklYUF9EQkwpeF9lIDw8IChERlJBQ1RfQklUUyAtIDEgLSBlbm9ybSkpOworCisgICAgICAqcmVzdWx0X2UgPSBlbm9ybTsKKyAgICB9IGVsc2UgeworICAgICAgLyogMSBjb21wZW5zYXRlcyB0aGUgZk11bHREaXYyKCkgYWJvdmUgaW4gdGhlIHRheWxvciBwb2x5bm9taWFsIGV2YWx1YXRpb24KKyAgICAgICAqIGxvb3AuKi8KKyAgICAgICpyZXN1bHRfZSA9IDE7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdF9tOworfQogCiAvKioKICAqIFxicmllZiBjYWxjdWxhdGUgbG9nYXJpdGhtIG9mIGJhc2UgMiBvZiB4X20gKiAyXih4X2UpCkBAIC00MjgsMTYgKzg0MiwyNyBAQAogICogXHBhcmFtIHhfZSBleHBvbmVudCBvZiB0aGUgaW5wdXQgdmFsdWUuCiAgKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQgd2l0aCBpbXBsaWNpdCBleHBvbmVudCBvZiBMRF9EQVRBX1NISUZULgogICovCi1GSVhQX0RCTCBmTG9nMihGSVhQX0RCTCB4X20sIElOVCB4X2UpOworRkRLX0lOTElORSBGSVhQX0RCTCBmTG9nMihGSVhQX0RCTCB4X20sIElOVCB4X2UpIHsKKyAgaWYgKHhfbSA8PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgIHhfbSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKKyAgfSBlbHNlIHsKKyAgICBJTlQgcmVzdWx0X2U7CisgICAgeF9tID0gZkxvZzIoeF9tLCB4X2UsICZyZXN1bHRfZSk7CisgICAgeF9tID0gc2NhbGVWYWx1ZSh4X20sIHJlc3VsdF9lIC0gTERfREFUQV9TSElGVCk7CisgIH0KKyAgcmV0dXJuIHhfbTsKK30KIAorI2VuZGlmIC8qIEZVTkNUSU9OX2ZMb2cyICovCisKKyNpZm5kZWYgRlVOQ1RJT05fZkFkZFNhdHVyYXRlCiAvKioKICAqIFxicmllZiBBZGQgd2l0aCBzYXR1cmF0aW9uIG9mIHRoZSByZXN1bHQuCiAgKiBccGFyYW0gYSBmaXJzdCBzdW1tYW5kCiAgKiBccGFyYW0gYiBzZWNvbmQgc3VtbWFuZAogICogXHJldHVybiBzYXR1cmF0ZWQgc3VtIG9mIGEgYW5kIGIuCiAgKi8KLWlubGluZSBGSVhQX1NHTCBmQWRkU2F0dXJhdGUoY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9TR0wgYikKLXsKK2lubGluZSBGSVhQX1NHTCBmQWRkU2F0dXJhdGUoY29uc3QgRklYUF9TR0wgYSwgY29uc3QgRklYUF9TR0wgYikgewogICBMT05HIHN1bTsKIAogICBzdW0gPSAoTE9ORykoU0hPUlQpYSArIChMT05HKShTSE9SVCliOwpAQCAtNDUxLDE5ICs4NzYsMjYgQEAKICAqIFxwYXJhbSBiIHNlY29uZCBzdW1tYW5kCiAgKiBccmV0dXJuIHNhdHVyYXRlZCBzdW0gb2YgYSBhbmQgYi4KICAqLwotaW5saW5lIEZJWFBfREJMIGZBZGRTYXR1cmF0ZShjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKQoteworaW5saW5lIEZJWFBfREJMIGZBZGRTYXR1cmF0ZShjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBGSVhQX0RCTCBiKSB7CiAgIExPTkcgc3VtOwogCi0gIHN1bSA9IChMT05HKShhPj4xKSArIChMT05HKShiPj4xKTsKLSAgc3VtID0gZk1heChmTWluKChJTlQpc3VtLCAoSU5UKShNQVhWQUxfREJMPj4xKSksIChJTlQpKE1JTlZBTF9EQkw+PjEpKTsKLSAgcmV0dXJuIChGSVhQX0RCTCkoTE9ORykoc3VtPDwxKTsKKyAgc3VtID0gKExPTkcpKGEgPj4gMSkgKyAoTE9ORykoYiA+PiAxKTsKKyAgc3VtID0gZk1heChmTWluKChJTlQpc3VtLCAoSU5UKShNQVhWQUxfREJMID4+IDEpKSwgKElOVCkoTUlOVkFMX0RCTCA+PiAxKSk7CisgIHJldHVybiAoRklYUF9EQkwpKExPTkcpKHN1bSA8PCAxKTsKIH0KKyNlbmRpZiAvKiBGVU5DVElPTl9mQWRkU2F0dXJhdGUgKi8KIAotLy8jZGVmaW5lIFRFU1RfUk9VTkRJTkcKK0lOVCBmaXhwX2Zsb29yVG9JbnQoRklYUF9EQkwgZl9pbnAsIElOVCBzZik7CitGSVhQX0RCTCBmaXhwX2Zsb29yKEZJWFBfREJMIGZfaW5wLCBJTlQgc2YpOwogCitJTlQgZml4cF9jZWlsVG9JbnQoRklYUF9EQkwgZl9pbnAsIElOVCBzZik7CitGSVhQX0RCTCBmaXhwX2NlaWwoRklYUF9EQkwgZl9pbnAsIElOVCBzZik7CiAKK0lOVCBmaXhwX3RydW5jYXRlVG9JbnQoRklYUF9EQkwgZl9pbnAsIElOVCBzZik7CitGSVhQX0RCTCBmaXhwX3RydW5jYXRlKEZJWFBfREJMIGZfaW5wLCBJTlQgc2YpOwogCitJTlQgZml4cF9yb3VuZFRvSW50KEZJWFBfREJMIGZfaW5wLCBJTlQgc2YpOworRklYUF9EQkwgZml4cF9yb3VuZChGSVhQX0RCTCBmX2lucCwgSU5UIHNmKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKQEAgLTQ3MSwyNSArOTAzLDE5IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgZXh0ZXJuIGNvbnN0IEZJWFBfREJMIGludkNvdW50WzgwXTsKK2V4dGVybiBjb25zdCBGSVhQX0RCTCBpbnZDb3VudFs4MF07CiAKLSAgTE5LX1NFQ1RJT05fSU5JVENPREUKLSAgaW5saW5lIHZvaWQgSW5pdEludkludCh2b2lkKSB7fQotCitMTktfU0VDVElPTl9JTklUQ09ERQoraW5saW5lIHZvaWQgSW5pdEludkludCh2b2lkKSB7fQogCiAvKioKICAqIFxicmllZiBDYWxjdWxhdGUgdGhlIHZhbHVlIG9mIDEvaSB3aGVyZSBpIGlzIGEgaW50ZWdlciB2YWx1ZS4gSXQgc3VwcG9ydHMKLSAqICAgICAgICBpbnB1dCB2YWx1ZXMgZnJvbSAxIHVwdG8gODAuCisgKiAgICAgICAgaW5wdXQgdmFsdWVzIGZyb20gMSB1cHRvICg4MC0xKS4KICAqIFxwYXJhbSBpbnRWYWx1ZSBJbnRlZ2VyIGlucHV0IHZhbHVlLgogICogXHBhcmFtIEZJWFBfREJMIHJlcHJlc2VudGF0aW9uIG9mIDEvaW50VmFsdWUKICAqLwotaW5saW5lIEZJWFBfREJMIEdldEludkludChpbnQgaW50VmFsdWUpCi17Ci0gIEZES19BU1NFUlQoKGludFZhbHVlID4gMCkgJiYgKGludFZhbHVlIDwgODApKTsKLSAgRkRLX0FTU0VSVChpbnRWYWx1ZTw4MCk7Ci0JcmV0dXJuIGludkNvdW50W2ludFZhbHVlXTsKK2lubGluZSBGSVhQX0RCTCBHZXRJbnZJbnQoaW50IGludFZhbHVlKSB7CisgIHJldHVybiBpbnZDb3VudFtmTWluKGZNYXgoaW50VmFsdWUsIDApLCA4MCAtIDEpXTsKIH0KIAotCi0jZW5kaWYKLQorI2VuZGlmIC8qIEZJWFBPSU5UX01BVEhfSCAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvaHVmZl9ub2Rlcy5oIGIvbGliRkRLL2luY2x1ZGUvaHVmZl9ub2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZGE1ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJGREsvaW5jbHVkZS9odWZmX25vZGVzLmgKQEAgLTAsMCArMSwyNTggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE9tZXIgT3NtYW4KKworICAgRGVzY3JpcHRpb246IE1QRUctRCBTQUMvVVNBQy9TQU9DIEh1ZmZtYW4gUGFydDAgVGFibGVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSFVGRl9OT0RFU19ICisjZGVmaW5lIEhVRkZfTk9ERVNfSAorCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICBTSE9SVCBub2RlVGFiWzM5XVsyXTsKKworfSBIVUZGX1JFU19OT0RFUzsKKworLyogMUQgTm9kZXMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgU0hPUlQgbm9kZVRhYlszMF1bMl07CisKK30gSFVGRl9DTERfTk9EXzFEOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFNIT1JUIG5vZGVUYWJbN11bMl07CisKK30gSFVGRl9JQ0NfTk9EXzFEOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFNIT1JUIG5vZGVUYWJbNTBdWzJdOworCit9IEhVRkZfQ1BDX05PRF8xRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBTSE9SVCBub2RlVGFiWzE1XVsyXTsKKworfSBIVUZGX09MRF9OT0RfMUQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU0hPUlQgbm9kZVRhYls2M11bMl07CisKK30gSFVGRl9OUkdfTk9EXzFEOworCisvKiAyRCBOb2RlcyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBTSE9SVCBsYXYzWzE1XVsyXTsKKyAgU0hPUlQgbGF2NVszNV1bMl07CisgIFNIT1JUIGxhdjdbNjNdWzJdOworICBTSE9SVCBsYXY5Wzk5XVsyXTsKKworfSBIVUZGX0NMRF9OT0RfMkQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU0hPUlQgbGF2MVszXVsyXTsKKyAgU0hPUlQgbGF2M1sxNV1bMl07CisgIFNIT1JUIGxhdjVbMzVdWzJdOworICBTSE9SVCBsYXY3WzYzXVsyXTsKKworfSBIVUZGX0lDQ19OT0RfMkQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU0hPUlQgbGF2M1sxNV1bMl07CisgIFNIT1JUIGxhdjZbNDhdWzJdOworICBTSE9SVCBsYXY5Wzk5XVsyXTsKKyAgU0hPUlQgbGF2MTJbMTY4XVsyXTsKKworfSBIVUZGX09MRF9OT0RfMkQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU0hPUlQgbGF2M1sxNV1bMl07CisgIFNIT1JUIGxhdjVbMzVdWzJdOworICBTSE9SVCBsYXY3WzYzXVsyXTsKKyAgU0hPUlQgbGF2OVs5OV1bMl07CisKK30gSFVGRl9OUkdfTk9EXzJEX2RmOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFNIT1JUIGxhdjNbMTVdWzJdOworICBTSE9SVCBsYXY2WzQ4XVsyXTsKKyAgU0hPUlQgbGF2OVs5OV1bMl07CisgIFNIT1JUIGxhdjEyWzE2OF1bMl07CisKK30gSFVGRl9OUkdfTk9EXzJEX2R0OworCit0eXBlZGVmIHN0cnVjdCB7CisgIEhVRkZfTlJHX05PRF8yRF9kZiBkZlsyXTsKKyAgSFVGRl9OUkdfTk9EXzJEX2R0IGR0WzJdOworICBIVUZGX05SR19OT0RfMkRfZGYgZHBbMl07CisKK30gSFVGRl9OUkdfTk9EXzJEOworCisvKiBDb21wbGV0ZSBicyBQYXJhbWV0ZXIgTm9kZXMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgSFVGRl9DTERfTk9EXzFEICpoMURbM107CisgIGNvbnN0IEhVRkZfQ0xEX05PRF8yRCAqaDJEWzNdWzJdOworCit9IEhVRkZfQ0xEX05PREVTOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IEhVRkZfSUNDX05PRF8xRCAqaDFEWzNdOworICBjb25zdCBIVUZGX0lDQ19OT0RfMkQgKmgyRFszXVsyXTsKKworfSBIVUZGX0lDQ19OT0RFUzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBIVUZGX09MRF9OT0RfMUQgKmgxRFszXTsKKyAgY29uc3QgSFVGRl9PTERfTk9EXzJEICpoMkRbM11bMl07CisKK30gSFVGRl9PTERfTk9ERVM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgSFVGRl9OUkdfTk9EXzFEICpoMURbM107CisgIGNvbnN0IEhVRkZfTlJHX05PRF8yRCAqaDJEOworCit9IEhVRkZfTlJHX05PREVTOworCisvKiBwYXJhbWV0ZXIgaW5zdGFuY2UgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgU0hPUlQgY2xkWzMwXVsyXTsKKyAgU0hPUlQgaWNjWzddWzJdOworICBTSE9SVCBpcGRbN11bMl07CisgIFNIT1JUIG9sZFsxNV1bMl07CisgIFNIT1JUIG5yZ1s2M11bMl07Cit9IEhVRkZfUFQwX05PREVTOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFNIT1JUIG5vZGVUYWJbM11bMl07CisKK30gSFVGRl9MQVZfTk9ERVM7CisKKy8qIFVTQUMgc3BlY2lmaWMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgU0hPUlQgbm9kZVRhYls3XVsyXTsKKworfSBIVUZGX0lQRF9OT0RfMUQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU0hPUlQgbGF2MVszXVsyXTsKKyAgU0hPUlQgbGF2M1sxNV1bMl07CisgIFNIT1JUIGxhdjVbMzVdWzJdOworICBTSE9SVCBsYXY3WzYzXVsyXTsKKworfSBIVUZGX0lQRF9OT0RfMkQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgSFVGRl9JUERfTk9EXzFEIGgxRFszXTsKKyAgSFVGRl9JUERfTk9EXzJEIGgyRFszXVsyXTsKKworfSBIVUZGX0lQRF9OT0RFUzsKKworLyogbm9uLWxvc3N5IGNvZGluZyBkZWNvZGVyICovCitleHRlcm4gY29uc3QgSFVGRl9QVDBfTk9ERVMgRkRLX2h1ZmZQYXJ0ME5vZGVzOworZXh0ZXJuIGNvbnN0IEhVRkZfTEFWX05PREVTIEZES19odWZmTGF2SWR4Tm9kZXM7CisKK2V4dGVybiBjb25zdCBIVUZGX0lDQ19OT0RFUyBGREtfaHVmZklDQ05vZGVzOworZXh0ZXJuIGNvbnN0IEhVRkZfQ0xEX05PREVTIEZES19odWZmQ0xETm9kZXM7CitleHRlcm4gY29uc3QgSFVGRl9SRVNfTk9ERVMgRkRLX2h1ZmZSZXNoYXBlTm9kZXM7CisKK2V4dGVybiBjb25zdCBIVUZGX09MRF9OT0RFUyBodWZmT0xETm9kZXM7CisKK2V4dGVybiBjb25zdCBIVUZGX0lQRF9OT0RFUyBGREtfaHVmZklQRE5vZGVzOworCisjZW5kaWYgLyogSFVGRl9OT0RFU19IICovCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9tZGN0LmggYi9saWJGREsvaW5jbHVkZS9tZGN0LmgKaW5kZXggZTFjMmQ3NC4uMTM4MjM3NCAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvbWRjdC5oCisrKyBiL2xpYkZESy9pbmNsdWRlL21kY3QuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzMyArOTAsNDcgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKLSAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyLCBKb3NlZiBIb2VwZmwKLSAgIERlc2NyaXB0aW9uOiBNRENUIHJvdXRpbmVzCisgICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlciwgSm9zZWYgSG9lcGZsLCBZb3VsaXkgTmlub3YsIERhbmllbCBIYWdlbAogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogTURDVC9NRFNUIHJvdXRpbmVzCiAKLSNpZm5kZWYgX19NRENUX0hfXwotI2RlZmluZSBfX01EQ1RfSF9fCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KKyNpZm5kZWYgTURDVF9ICisjZGVmaW5lIE1EQ1RfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCi0jZGVmaW5lIE1EQ1RfT1VUX0hFQURST09NICAgICAyIC8qIE91dHB1dCBhZGRpdGlvbmFsIGhlYWRyb29tICovCi0jZGVmaW5lIE1EQ1RfT1VUUFVUX1NDQUxFICAgIChERlJBQ1RfQklUUy1TQU1QTEVfQklUUy1NRENUX09VVF9IRUFEUk9PTSkKLS8qIFJlZmVyIHRvICJPdXRwdXQgd29yZCBsZW5ndGgiIGluIElTTy9JRUMgMTQ0OTYtMzoyMDA4KEUpIDIzLjIuMy42ICovCi0jZGVmaW5lIE1EQ1RfT1VUUFVUX0dBSU4gICAgICAxNgorI2RlZmluZSBNRENUX09VVF9IRUFEUk9PTSAyIC8qIE91dHB1dCBhZGRpdGlvbmFsIGhlYWRyb29tICovCisjZGVmaW5lIFBDTV9PVVRfQklUUyBTQU1QTEVfQklUUworI2RlZmluZSBQQ01fT1VUX0hFQURST09NIDggLyogTXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlcyBhcyBETVhIX0hFQURST09NICovCiAKLSNpZiAoU0FNUExFX0JJVFMgPT0gREZSQUNUX0JJVFMpCi0jZGVmaW5lIElNRENUX1NDQUxFKHgpIChJTlRfUENNKVNBVFVSQVRFX0xFRlRfU0hJRlQoeCwgLU1EQ1RfT1VUUFVUX1NDQUxFLCBTQU1QTEVfQklUUykKKyNkZWZpbmUgTURDVF9PVVRQVVRfU0NBTEUgKC1NRENUX09VVF9IRUFEUk9PTSArIChERlJBQ1RfQklUUyAtIFNBTVBMRV9CSVRTKSkKKy8qIFJlZmVyIHRvICJPdXRwdXQgd29yZCBsZW5ndGgiIGluIElTTy9JRUMgMTQ0OTYtMzoyMDA4KEUpIDIzLjIuMy42ICovCisjZGVmaW5lIE1EQ1RfT1VUUFVUX0dBSU4gMTYKKworI2lmIChNRENUX09VVFBVVF9TQ0FMRSA+PSAwKQorI2RlZmluZSBJTURDVF9TQ0FMRSh4KSBTQVRVUkFURV9SSUdIVF9TSElGVCh4LCBNRENUX09VVFBVVF9TQ0FMRSwgUENNX09VVF9CSVRTKQogI2Vsc2UKLSNkZWZpbmUgSU1EQ1RfU0NBTEUoeCkgKElOVF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQoeCwgTURDVF9PVVRQVVRfU0NBTEUsIFNBTVBMRV9CSVRTKQorI2RlZmluZSBJTURDVF9TQ0FMRSh4KSBTQVRVUkFURV9MRUZUX1NISUZUKHgsIC1NRENUX09VVFBVVF9TQ0FMRSwgUENNX09VVF9CSVRTKQogI2VuZGlmCiAjZGVmaW5lIElNRENUX1NDQUxFX0RCTCh4KSAoRklYUF9EQkwpKHgpCisjZGVmaW5lIElNRENUX1NDQUxFX0RCTF9MU0gxKHgpIFNBVFVSQVRFX0xFRlRfU0hJRlRfQUxUKCh4KSwgMSwgREZSQUNUX0JJVFMpCisKKyNkZWZpbmUgTUxUX0ZMQUdfQ1VSUl9BTElBU19TWU1NRVRSWSAxCisKK3R5cGVkZWYgZW51bSB7CisgIEJMT0NLX0xPTkcgPSAwLCAvKiBub3JtYWwgbG9uZyBibG9jayAqLworICBCTE9DS19TVEFSVCwgICAgLyogbG9uZyBzdGFydCBibG9jayAqLworICBCTE9DS19TSE9SVCwgICAgLyogOCBzaG9ydCBibG9ja3Mgc2VxdWVuY2UgKi8KKyAgQkxPQ0tfU1RPUCAgICAgIC8qIGxvbmcgc3RvcCBibG9jayovCit9IEJMT0NLX1RZUEU7CisKK3R5cGVkZWYgZW51bSB7IFNIQVBFX1NJTkUgPSAwLCBTSEFQRV9LQkQsIFNIQVBFX0xPTCB9IFdJTkRPV19TSEFQRTsKIAogLyoqCiAgKiBcYnJpZWYgTURDVCBwZXJzaXN0ZW50IGRhdGEKQEAgLTExNCwxOCArMTM5LDI0IEBACiAgIHVuaW9uIHsKICAgICBGSVhQX0RCTCAqZnJlcTsKICAgICBGSVhQX0RCTCAqdGltZTsKLSAgfSBvdmVybGFwOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQb2ludGVyIHRvIG92ZXJsYXAgbWVtb3J5ICovCisgIH0gb3ZlcmxhcDsgLyoqPCBQb2ludGVyIHRvIG92ZXJsYXAgbWVtb3J5ICovCiAKLSAgY29uc3QgRklYUF9XVFAgKnByZXZfd3JzOyAgICAgICAgLyoqPCBwb2ludGVyIHRvIHByZXZpb3VzIHJpZ2h0IHdpbmRvdyBzbG9wZSAgKi8KLSAgaW50IHByZXZfdGw7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBwcmV2aW91cyB0cmFuZm9ybSBsZW5ndGggKi8KLSAgaW50IHByZXZfbnI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBwcmV2aW91cyByaWdodCB3aW5kb3cgb2Zmc2V0ICovCi0gIGludCBwcmV2X2ZyOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgcHJldmlvdXMgcmlnaHQgd2luZG93IHNsb3BlIGxlbmd0aCAqLwotICBpbnQgb3Zfb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAvKio8IG92ZXJsYXAgdGltZSBkYXRhIGZpbGwgbGV2ZWwgKi8KLSAgaW50IG92X3NpemU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBPdmVybGFwIGJ1ZmZlciBzaXplIGluIHdvcmRzICovCisgIGNvbnN0IEZJWFBfV1RQICpwcmV2X3dyczsgLyoqPCBwb2ludGVyIHRvIHByZXZpb3VzIHJpZ2h0IHdpbmRvdyBzbG9wZSAgKi8KKyAgaW50IHByZXZfdGw7ICAgICAgICAgICAgICAvKio8IHByZXZpb3VzIHRyYW5zZm9ybSBsZW5ndGggKi8KKyAgaW50IHByZXZfbnI7ICAgICAgICAgICAgICAvKio8IHByZXZpb3VzIHJpZ2h0IHdpbmRvdyBvZmZzZXQgKi8KKyAgaW50IHByZXZfZnI7ICAgICAgICAgICAgICAvKio8IHByZXZpb3VzIHJpZ2h0IHdpbmRvdyBzbG9wZSBsZW5ndGggKi8KKyAgaW50IG92X29mZnNldDsgICAgICAgICAgICAvKio8IG92ZXJsYXAgdGltZSBkYXRhIGZpbGwgbGV2ZWwgKi8KKyAgaW50IG92X3NpemU7ICAgICAgICAgICAgICAvKio8IE92ZXJsYXAgYnVmZmVyIHNpemUgaW4gd29yZHMgKi8KIAorICBpbnQgcHJldkFsaWFzU3ltbWV0cnk7CisgIGludCBwcmV2UHJldkFsaWFzU3ltbWV0cnk7CisKKyAgRklYUF9EQkwgKnBGYWNaaXI7CisgIEZJWFBfREJMICpwQXN5bU92bHA7IC8qKjwgcG9pbnRlciB0byBhc3ltbWV0cmljIG92ZXJsYXAgKHVzZWQgZm9yIHN0ZXJlbyBMUEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbikgKi8KIH0gbWRjdF90OwogCi10eXBlZGVmIG1kY3RfdCogSF9NRENUOwordHlwZWRlZiBtZGN0X3QgKkhfTURDVDsKIAogLyoqCiAgKiBcYnJpZWYgSW5pdGlhbGl6ZSBhcyB2YWxpZCBNRENUIGhhbmRsZQpAQCAtMTMzLDY4ICsxNjQsNTIgQEAKICAqIFxwYXJhbSBoTWRjdCBoYW5kbGUgb2YgYW4gYWxsb2NhdGVkIE1EQ1QgaGFuZGxlLgogICogXHBhcmFtIG92ZXJsYXAgcG9pbnRlciB0byBGSVhQX0RCTCBvdmVybGFwIGJ1ZmZlci4KICAqIFxwYXJhbSBvdmVybGFwQnVmZmVyU2l6ZSBzaXplIGluIEZJWFBfREJMcyBvZiB0aGUgZ2l2ZW4gb3ZlcmxhcCBidWZmZXIuCi0gKiBccmV0dXJuIHZvaWQKICAqLwotdm9pZCBtZGN0X2luaXQoIEhfTURDVCBoTWRjdCwKLSAgICAgICAgICAgICAgICBGSVhQX0RCTCAqb3ZlcmxhcCwKLSAgICAgICAgICAgICAgICBJTlQgb3ZlcmxhcEJ1ZmZlclNpemUgKTsKK3ZvaWQgbWRjdF9pbml0KEhfTURDVCBoTWRjdCwgRklYUF9EQkwgKm92ZXJsYXAsIElOVCBvdmVybGFwQnVmZmVyU2l6ZSk7CiAKIC8qKgotICogXGJyaWVmIHBlcmZvcm0gTURDVCB0cmFuc2Zvcm0gKHRpbWUgZG9tYWluIHRvIGZyZXF1ZW5jeSBkb21haW4pIHdpdGggZ2l2ZW4gcGFyYW1ldGVycy4KKyAqIFxicmllZiBwZXJmb3JtIE1EQ1QgdHJhbnNmb3JtICh0aW1lIGRvbWFpbiB0byBmcmVxdWVuY3kgZG9tYWluKSB3aXRoIGdpdmVuCisgKiBwYXJhbWV0ZXJzLgogICoKICAqIFxwYXJhbSBoTWRjdCBoYW5kbGUgb2YgYW4gYWxsb2NhdGVkIE1EQ1QgaGFuZGxlLgotICogXHBhcmFtIHNwZWN0cnVtIHBvaW50ZXIgdG8gd2hlcmUgdGhlIHJlc3VsdGluZyBNRENUIHNwZWN0cnVtIHdpbGwgYmUgc3RvcmVkIGludG8uCi0gKiBccGFyYW0gc2NhbGVmYWN0b3IgcG9pbnRlciB0byB0aGUgaW5wdXQgc2NhbGUgc2hpZnQgdmFsdWUuIFVwZGF0ZWQgYWNjb3JkaW5nbHkgb24gcmV0dXJuLgotICogXHBhcmFtIGlucHV0IHBvaW50ZXIgdG8gaW5wdXQgdGltZSBkb21haW4gc2lnbmFsCi0gKiBccGFyYW0gdGwgdHJhbnNmb3JtYXRpb24gbGVuZ3RoLgotICogXHBhcmFtIG5yIHJpZ2h0IHdpbmRvdyBzbG9wZSBvZmZzZXQgKGFtb3VudCBvZiB3aW5kb3cgY29lZmZpY2llbnRzIGFzc3VtZWQgdG8gYmUgMS4wKQotICogXHBhcmFtIGZyIHJpZ2h0IG92ZXJsYXAgd2luZG93IHNsb3BlIGxlbmd0aAotICogXHBhcmFtIHdycyBwb2ludGVyIHRvIHRoZSByaWdodCBzaWRlIG92ZXJsYXAgd2luZG93IGNvZWZmaWNpZW50cy4KKyAqIFxwYXJhbSBwVGltZURhdGEgcG9pbnRlciB0byBpbnB1dCB0aW1lIGRvbWFpbiBzaWduYWwKKyAqIFxwYXJhbSBub0luU2FtcGxlcyBudW1iZXIgb2YgaW5wdXQgc2FtcGxlcworICogXHBhcmFtIG1kY3REYXRhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIHJlc3VsdGluZyBNRENUIHNwZWN0cnVtIHdpbGwgYmUgc3RvcmVkCisgKiBpbnRvLgorICogXHBhcmFtIG5TcGVjIG51bWJlciBvZiBzcGVjdHJhCisgKiBccGFyYW0gcE1kY3REYXRhX2UgcG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSBleHBvbmVudC4gVXBkYXRlZCBhY2NvcmRpbmdseSBvbgorICogcmV0dXJuIGZvciBvdXRwdXQgZGF0YS4KICAqIFxyZXR1cm4gbnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgcHJvY2Vzc2VkLgogICovCi1JTlQgIG1kY3RfYmxvY2soCi0gICAgICAgIEhfTURDVCBoTWRjdCwKLSAgICAgICAgRklYUF9EQkwgKnNwZWN0cnVtLAotICAgICAgICBJTlQgKnNjYWxlZmFjdG9yLAotICAgICAgICBJTlRfUENNICppbnB1dCwKLSAgICAgICAgSU5UIHRsLAotICAgICAgICBJTlQgbnIsCi0gICAgICAgIElOVCBmciwKLSAgICAgICAgY29uc3QgRklYUF9XVEIgKndycyApOwotCitJTlQgbWRjdF9ibG9jayhIX01EQ1QgaE1kY3QsIGNvbnN0IElOVF9QQ00gKnBUaW1lRGF0YSwgY29uc3QgSU5UIG5vSW5TYW1wbGVzLAorICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3REYXRhLCBjb25zdCBJTlQgblNwZWMsIGNvbnN0IElOVCB0bCwKKyAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfV1RQICpwUmlnaHRXaW5kb3dQYXJ0LCBjb25zdCBJTlQgZnIsCisgICAgICAgICAgICAgICBTSE9SVCAqcE1kY3REYXRhX2UpOwogCiAvKioKLSAqIFxicmllZiBhZGQvbXVsdGlwbHkgMi9OIHRyYW5zZm9ybSBnYWluIGFuZCBNUEVHNCBwYXJ0IDMgZGVmaW5lZCBvdXRwdXQgZ2FpbiAoc2VlIGRlZmluaXRpb24KLSAqICAgICAgICBvZiBNRENUX09VVFBVVF9HQUlOKSB0byBnaXZlbiBtYW50aXNzYSBmYWN0b3IgYW5kIGV4cG9uZW50LgotICogXHBhcmFtIHBHYWluIHBvaW50ZXIgdG8gdGhlIG1hbnRpc3NhIG9mIGEgZ2FpbiBmYWN0b3IgdG8gYmUgYXBwbGllZCB0byBJTURDVCBkYXRhLgotICogXHBhcmFtIHBFeHBvbmVudCBwb2ludGVyIHRvIHRoZSBleHBvbmVudCBvZiBhIGdhaW4gZmFjdG9yIHRvIGJlIGFwcGxpZWQgdG8gSU1EQ1QgZGF0YS4KLSAqIFxwYXJhbSB0bCBsZW5ndGggb2YgdGhlIElNRENUIHdoZXJlIHRoZSBnYWluICpwR2FpbiAqICgyIF4gKnBFeHBvbmVudCkgd2lsbCBiZSBhcHBsaWVkIHRvLgorICogXGJyaWVmIGFkZC9tdWx0aXBseSAyL04gdHJhbnNmb3JtIGdhaW4gYW5kIE1QRUc0IHBhcnQgMyBkZWZpbmVkIG91dHB1dCBnYWluCisgKiAoc2VlIGRlZmluaXRpb24gb2YgTURDVF9PVVRQVVRfR0FJTikgdG8gZ2l2ZW4gbWFudGlzc2EgZmFjdG9yIGFuZCBleHBvbmVudC4KKyAqIFxwYXJhbSBwR2FpbiBwb2ludGVyIHRvIHRoZSBtYW50aXNzYSBvZiBhIGdhaW4gZmFjdG9yIHRvIGJlIGFwcGxpZWQgdG8gSU1EQ1QKKyAqIGRhdGEuCisgKiBccGFyYW0gcEV4cG9uZW50IHBvaW50ZXIgdG8gdGhlIGV4cG9uZW50IG9mIGEgZ2FpbiBmYWN0b3IgdG8gYmUgYXBwbGllZCB0bworICogSU1EQ1QgZGF0YS4KKyAqIFxwYXJhbSB0bCBsZW5ndGggb2YgdGhlIElNRENUIHdoZXJlIHRoZSBnYWluICpwR2FpbiAqICgyIF4gKnBFeHBvbmVudCkgd2lsbAorICogYmUgYXBwbGllZCB0by4KICAqLwotdm9pZCBpbWRjdF9nYWluKAotICAgICAgICBGSVhQX0RCTCAqcEdhaW4sCi0gICAgICAgIGludCAqcEV4cG9uZW50LAotICAgICAgICBpbnQgdGwKLSAgICAgICAgKTsKK3ZvaWQgaW1kY3RfZ2FpbihGSVhQX0RCTCAqcEdhaW4sIGludCAqcEV4cG9uZW50LCBpbnQgdGwpOwogCiAvKioKLSAqIFxicmllZiBkcmFpbiBidWZmZXJlZCBvdXRwdXQgc2FtcGxlcyBpbnRvIGdpdmVuIGJ1ZmZlci4gQ2hhbmdlcyB0aGUgTURDVCBzdGF0ZS4KKyAqIFxicmllZiBkcmFpbiBidWZmZXJlZCBvdXRwdXQgc2FtcGxlcyBpbnRvIGdpdmVuIGJ1ZmZlci4gQ2hhbmdlcyB0aGUgTURDVAorICogc3RhdGUuCiAgKi8KLUlOVCBpbWRjdF9kcmFpbigKLSAgICAgICAgSF9NRENUIGhNZGN0LAotICAgICAgICBGSVhQX0RCTCAqIHBUaW1lRGF0YSwKLSAgICAgICAgSU5UIG5yU2FtcGxlc1Jvb20KLSAgICAgICAgKTsKLQorSU5UIGltZGN0X2RyYWluKEhfTURDVCBoTWRjdCwgRklYUF9EQkwgKnBUaW1lRGF0YSwgSU5UIG5yU2FtcGxlc1Jvb20pOwogCiAvKioKLSAqIFxicmllZiBDb3B5IG92ZXJsYXAgdGltZSBkb21haW4gZGF0YSB0byBnaXZlbiBidWZmZXIuIERvZXMgbm90IGNoYW5nZSB0aGUgTURDVCBzdGF0ZS4KKyAqIFxicmllZiBDb3B5IG92ZXJsYXAgdGltZSBkb21haW4gZGF0YSB0byBnaXZlbiBidWZmZXIuIERvZXMgbm90IGNoYW5nZSB0aGUKKyAqIE1EQ1Qgc3RhdGUuCiAgKiBccmV0dXJuIG51bWJlciBvZiBhY3R1YWxseSBjb3BpZWQgc2FtcGxlcyAob3YgKyBucikuCiAgKi8KLUlOVCBpbWRjdF9jb3B5X292X2FuZF9ucigKLSAgICAgICAgSF9NRENUIGhNZGN0LAotICAgICAgICBGSVhQX0RCTCAqIHBUaW1lRGF0YSwKLSAgICAgICAgSU5UIG5yU2FtcGxlcwotICAgICAgICApOworSU5UIGltZGN0X2NvcHlfb3ZfYW5kX25yKEhfTURDVCBoTWRjdCwgRklYUF9EQkwgKnBUaW1lRGF0YSwgSU5UIG5yU2FtcGxlcyk7CiAKIC8qKgogICogXGJyaWVmIEFkYXB0IE1EQ1QgcGFyYW1ldGVycyBmb3Igbm9uLW1hdGNoaW5nIHdpbmRvdyBzbG9wZXMuCkBAIC0yMDUsMzkgKzIyMCwzNCBAQAogICogXHBhcmFtIHdscyBwb2ludGVyIHRvIHRoZSBsZWZ0IHNpZGUgb3ZlcmxhcCB3aW5kb3cgY29lZmZpY2llbnRzLgogICogXHBhcmFtIG5vT3V0U2FtcGxlcyBkZXNpcmVkIG51bWJlciBvZiBvdXRwdXQgc2FtcGxlcy4KICAqLwotdm9pZCBpbWRjdF9hZGFwdF9wYXJhbWV0ZXJzKEhfTURDVCBoTWRjdCwgaW50ICpwZmwsIGludCAqcG5sLCBpbnQgdGwsIGNvbnN0IEZJWFBfV1RQICp3bHMsIGludCBub091dFNhbXBsZXMpOwordm9pZCBpbWRjdF9hZGFwdF9wYXJhbWV0ZXJzKEhfTURDVCBoTWRjdCwgaW50ICpwZmwsIGludCAqcG5sLCBpbnQgdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9XVFAgKndscywgaW50IG5vT3V0U2FtcGxlcyk7CiAKIC8qKgotICogXGJyaWVmIHBlcmZvcm0gc2V2ZXJhbCBpbnZlcnNlIE1EQ1QgdHJhbnNmb3JtcyAoZnJlcXVlbmN5IGRvbWFpbiB0byB0aW1lIGRvbWFpbikgd2l0aCBnaXZlbiBwYXJhbWV0ZXJzLgorICogXGJyaWVmIHBlcmZvcm0gc2V2ZXJhbCBpbnZlcnNlIE1MVCB0cmFuc2Zvcm1zIChmcmVxdWVuY3kgZG9tYWluIHRvIHRpbWUKKyAqIGRvbWFpbikgd2l0aCBnaXZlbiBwYXJhbWV0ZXJzLgogICoKICAqIFxwYXJhbSBoTWRjdCBoYW5kbGUgb2YgYW4gYWxsb2NhdGVkIE1EQ1QgaGFuZGxlLgotICogXHBhcmFtIG91dHB1dCBwb2ludGVyIHRvIHdoZXJlIHRoZSBvdXRwdXQgdGltZSBkb21haW4gc2lnbmFsIHdpbGwgYmUgc3RvcmVkIGludG8uCi0gKiBccGFyYW0gc3RyaWRlIHRoZSBzdHJpZGUgZmFjdG9yIGZvciBhY2Nlc3NpbmcgdGltZSBkb21haW4gc2FtcGxlcyBpbiBvdXRwdXQuCisgKiBccGFyYW0gb3V0cHV0IHBvaW50ZXIgdG8gd2hlcmUgdGhlIG91dHB1dCB0aW1lIGRvbWFpbiBzaWduYWwgd2lsbCBiZSBzdG9yZWQKKyAqIGludG8uCiAgKiBccGFyYW0gc3BlY3RydW0gcG9pbnRlciB0byB0aGUgaW5wdXQgTURDVCBzcGVjdHJhLgotICogXHBhcmFtIHNjYWxlZmFjdG9ycyBzY2FsZSBzaGlmdCB2YWx1ZXMgb2YgdGhlIGlucHV0IHNwZWN0cnVtLgorICogXHBhcmFtIHNjYWxlZmFjdG9ycyBleHBvbmVudHMgb2YgdGhlIGlucHV0IHNwZWN0cnVtLgogICogXHBhcmFtIG5TcGVjIG51bWJlciBvZiBNRENUIHNwZWN0cnVtcy4KICAqIFxwYXJhbSBub091dFNhbXBsZXMgZGVzaXJlZCBudW1iZXIgb2Ygb3V0cHV0IHNhbXBsZXMuCiAgKiBccGFyYW0gdGwgdHJhbnNmb3JtIGxlbmd0aC4KICAqIFxwYXJhbSB3bHMgcG9pbnRlciB0byB0aGUgbGVmdCBzaWRlIG92ZXJsYXAgd2luZG93IGNvZWZmaWNpZW50cy4KICAqIFxwYXJhbSBmbCBsZWZ0IG92ZXJsYXAgd2luZG93IHNpZGUgbGVuZ3RoLgotICogXHBhcmFtIHdycyBwb2ludGVyIHRvIHRoZSByaWdodCBzaWRlIG92ZXJsYXAgd2luZG93IGNvZWZmaWNpZW50cyBvZiBhbGwgaW5kaXZpZHVhbCBJTURDVHMuCisgKiBccGFyYW0gd3JzIHBvaW50ZXIgdG8gdGhlIHJpZ2h0IHNpZGUgb3ZlcmxhcCB3aW5kb3cgY29lZmZpY2llbnRzIG9mIGFsbAorICogaW5kaXZpZHVhbCBJTURDVHMuCiAgKiBccGFyYW0gZnIgcmlnaHQgb3ZlcmxhcCB3aW5kb3cgc2lkZSBsZW5ndGggb2YgYWxsIGluZGl2aWR1YWwgSU1EQ1RzLgogICogXHBhcmFtIGdhaW4gZmFjdG9yIHRvIGFwcGx5IHRvIG91dHB1dCBzYW1wbGVzIChpZiAhPSAwKS4KKyAqIFxwYXJhbSBmbGFncyBmbGFncyBjb250cm9sbGluZyB0aGUgdHlwZSBvZiB0cmFuc2Zvcm0KICAqIFxyZXR1cm4gbnVtYmVyIG9mIG91dHB1dCBzYW1wbGVzIHJldHVybmVkLgogICovCi1JTlQgIGltZGN0X2Jsb2NrKAotICAgICAgICBIX01EQ1QgaE1kY3QsCi0gICAgICAgIEZJWFBfREJMICpvdXRwdXQsCi0gICAgICAgIEZJWFBfREJMICpzcGVjdHJ1bSwKLSAgICAgICAgY29uc3QgU0hPUlQgc2NhbGVmYWN0b3JbXSwKLSAgICAgICAgY29uc3QgSU5UIG5TcGVjLAotICAgICAgICBjb25zdCBJTlQgbm9PdXRTYW1wbGVzLAotICAgICAgICBjb25zdCBJTlQgdGwsCi0gICAgICAgIGNvbnN0IEZJWFBfV1RQICp3bHMsCi0gICAgICAgIElOVCBmbCwKLSAgICAgICAgY29uc3QgRklYUF9XVFAgKndycywKLSAgICAgICAgY29uc3QgSU5UIGZyLAotICAgICAgICBGSVhQX0RCTCBnYWluICk7CitJTlQgaW1sdF9ibG9jayhIX01EQ1QgaE1kY3QsIEZJWFBfREJMICpvdXRwdXQsIEZJWFBfREJMICpzcGVjdHJ1bSwKKyAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUIHNjYWxlZmFjdG9yW10sIGNvbnN0IElOVCBuU3BlYywKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCBub091dFNhbXBsZXMsIGNvbnN0IElOVCB0bCwgY29uc3QgRklYUF9XVFAgKndscywKKyAgICAgICAgICAgICAgIElOVCBmbCwgY29uc3QgRklYUF9XVFAgKndycywgY29uc3QgSU5UIGZyLCBGSVhQX0RCTCBnYWluLAorICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKIAotCi0jZW5kaWYgLyogX19NRENUX0hfXyAqLworI2VuZGlmIC8qIE1EQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvbWlwcy9hYnNfbWlwcy5oIGIvbGliRkRLL2luY2x1ZGUvbWlwcy9hYnNfbWlwcy5oCmluZGV4IDNiOWY4NzYuLmRiYjIwNjMgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL21pcHMvYWJzX21pcHMuaAorKysgYi9saWJGREsvaW5jbHVkZS9taXBzL2Fic19taXBzLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjkgKzkwLDM2IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CisKICAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBpbnRyaW5zaWNzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChBQlNfTUlQU19IKQorI2RlZmluZSBBQlNfTUlQU19ICiAKICNpZiBkZWZpbmVkKF9fbWlwc19fKQogCiAjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX21pcHNfXykKIAotICAjaWYgZGVmaW5lZChfX21pcHNfZHNwKQotICAgICNkZWZpbmUgRlVOQ1RJT05fZml4YWJzX0QKLSAgICAjZGVmaW5lIEZVTkNUSU9OX2ZpeGFic19JCi0gICAgI2RlZmluZSBGVU5DVElPTl9maXhhYnNfUwotICAgIGlubGluZSBGSVhQX0RCTCBmaXhhYnNfRChGSVhQX0RCTCB4KSB7IHJldHVybiBfX2J1aWx0aW5fbWlwc19hYnNxX3Nfdyh4KTsgfQotICAgIGlubGluZSBGSVhQX1NHTCBmaXhhYnNfUyhGSVhQX1NHTCB4KSB7IHJldHVybiAoKHgpID4gKEZJWFBfU0dMKSgwKSkgPyAoeCkgOiAtKHgpIDsgfQotICAgIGlubGluZSBJTlQgZml4YWJzX0koSU5UIHgpICAgICAgICAgICB7IHJldHVybiBfX2J1aWx0aW5fbWlwc19hYnNxX3Nfdyh4KTsgfQotICAjZW5kaWYgLyogX19taXBzX2RzcCAqLworI2lmIGRlZmluZWQoX19taXBzX2RzcCkKKyNkZWZpbmUgRlVOQ1RJT05fZml4YWJzX0QKKyNkZWZpbmUgRlVOQ1RJT05fZml4YWJzX0kKKyNkZWZpbmUgRlVOQ1RJT05fZml4YWJzX1MKK2lubGluZSBGSVhQX0RCTCBmaXhhYnNfRChGSVhQX0RCTCB4KSB7IHJldHVybiBfX2J1aWx0aW5fbWlwc19hYnNxX3Nfdyh4KTsgfQoraW5saW5lIEZJWFBfU0dMIGZpeGFic19TKEZJWFBfU0dMIHgpIHsKKyAgcmV0dXJuICgoeCkgPiAoRklYUF9TR0wpKDApKSA/ICh4KSA6IC0oeCk7Cit9CitpbmxpbmUgSU5UIGZpeGFic19JKElOVCB4KSB7IHJldHVybiBfX2J1aWx0aW5fbWlwc19hYnNxX3Nfdyh4KTsgfQorI2VuZGlmIC8qIF9fbWlwc19kc3AgKi8KIAogI2VuZGlmIC8qIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19taXBzX18pICovCiAKICNlbmRpZiAvKl9fbWlwc19fICovCiAKKyNlbmRpZiAvKiAhZGVmaW5lZChBQlNfTUlQU19IKSAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvbWlwcy9jbHpfbWlwcy5oIGIvbGliRkRLL2luY2x1ZGUvbWlwcy9jbHpfbWlwcy5oCmluZGV4IGZmNDBhMDkuLjc0OGY2YzIgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL21pcHMvY2x6X21pcHMuaAorKysgYi9saWJGREsvaW5jbHVkZS9taXBzL2Nsel9taXBzLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNDAgKzkwLDQ1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CisKICAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBpbnRyaW5zaWNzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChDTFpfTUlQU19IKQorI2RlZmluZSBDTFpfTUlQU19ICiAKICNpZiBkZWZpbmVkKF9fbWlwc19fKQogCi0jaWYgZGVmaW5lZChfX21pcHNfXykgJiYgKF9fR05VQ19fPT0yKSAmJiAobWlwcz49MzIpCisjaWYgZGVmaW5lZChfX21pcHNfXykgJiYgKF9fR05VQ19fID09IDIpICYmIChtaXBzID49IDMyKQogCi0gICNkZWZpbmUgRlVOQ1RJT05fZml4bm9ybXpfRAotICBpbmxpbmUgSU5UIGZpeG5vcm16X0QoTE9ORyB2YWx1ZSkKLSAgewotICAgIElOVCByZXN1bHQ7Ci0gICAgX19hc21fXyAoImNseiAlMCwlMSIgOiAiPWQiIChyZXN1bHQpIDogImQiICh2YWx1ZSkpOworI2RlZmluZSBGVU5DVElPTl9maXhub3Jtel9ECitpbmxpbmUgSU5UIGZpeG5vcm16X0QoTE9ORyB2YWx1ZSkgeworICBJTlQgcmVzdWx0OworICBfX2FzbV9fKCJjbHogJTAsJTEiIDogIj1kIihyZXN1bHQpIDogImQiKHZhbHVlKSk7CiAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9CisgIHJldHVybiByZXN1bHQ7Cit9CiAKLSNlbGlmIGRlZmluZWQoX19taXBzX18pICYmIChfX0dOVUNfXz09MykgJiYgKF9fbWlwcz49MzIpCisjZWxpZiBkZWZpbmVkKF9fbWlwc19fKSAmJiAoX19HTlVDX18gPT0gMykgJiYgKF9fbWlwcyA+PSAzMikKIAotICAjZGVmaW5lIEZVTkNUSU9OX2ZpeG5vcm16X0QKLSAgSU5UIGlubGluZSBmaXhub3Jtel9EKExPTkcgdmFsdWUpCi0gIHsKLSAgICBJTlQgcmVzdWx0OwotICAgIF9fYXNtX18gKCJjbHogJVtyZXN1bHRdLCAlW3ZhbHVlXSIgOiBbcmVzdWx0XSAiPXIiIChyZXN1bHQpIDogW3ZhbHVlXSAiciIgKHZhbHVlKSkgOworI2RlZmluZSBGVU5DVElPTl9maXhub3Jtel9ECitJTlQgaW5saW5lIGZpeG5vcm16X0QoTE9ORyB2YWx1ZSkgeworICBJTlQgcmVzdWx0OworICBfX2FzbV9fKCJjbHogJVtyZXN1bHRdLCAlW3ZhbHVlXSIKKyAgICAgICAgICA6IFtyZXN1bHRdICI9ciIocmVzdWx0KQorICAgICAgICAgIDogW3ZhbHVlXSAiciIodmFsdWUpKTsKIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KIAogI2VuZGlmCiAKICNlbmRpZiAvKiBfX21pcHNfXyAqLwogCisjZW5kaWYgLyogIWRlZmluZWQoQ0xaX01JUFNfSCkgKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL21pcHMvY3BseF9tdWwuaCBiL2xpYkZESy9pbmNsdWRlL21pcHMvY3BseF9tdWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjZGJkMC4uMDAwMDAwMAotLS0gYS9saWJGREsvaW5jbHVkZS9taXBzL2NwbHhfbXVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6Ci0gICBEZXNjcmlwdGlvbjogZml4ZWQgcG9pbnQgaW50cmluc2ljcwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19taXBzX18pICYmIF9fbWlwc19pc2FfcmV2IDwgNgotCi0KLS8vI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTYKLS8vI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTZYMgotI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MzJYMgotLy8jZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0XzMyeDE2Ci0vLyNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHRfMzJ4MTZYMgotI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdF8zMngzMlgyCi0KLSNpZiBkZWZpbmVkKEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngzMlgyKQotaW5saW5lIHZvaWQgY3BseE11bHREaXYyKCBGSVhQX0RCTCAqY19SZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNfSW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICBhX1JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgYV9JbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgIGJfUmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICBiX0ltKQotewotICBJTlQgcmVzdWx0OwotCi0gICBfX2FzbV9fICgibXVsdCAlW2FfUmVdLCAlW2JfUmVdO1xuIgotICAgICAgICAgICAgIm1zdWIgJVthX0ltXSwgJVtiX0ltXTtcbiIKLSAgICAgICAgICAgICJtZmhpICVbcmVzdWx0XTtcbiIKLSAgICAgICA6IFtyZXN1bHRdIj1yIihyZXN1bHQpCi0gICAgICAgOiBbYV9SZV0iZCIoYV9SZSksIFtiX1JlXSJkIihiX1JlKSwgIFthX0ltXSJkIihhX0ltKSwgW2JfSW1dImQiKGJfSW0pCi0gICAgICAgOiAibG8iKTsKLQotICAgKmNfUmUgPSByZXN1bHQ7Ci0KLSAgIF9fYXNtX18gKCJtdWx0ICVbYV9SZV0sICVbYl9JbV07XG4iCi0gICAgICAgICAgICAibWFkZCAlW2FfSW1dLCAlW2JfUmVdO1xuIgotICAgICAgICAgICAgIm1maGkgJVtyZXN1bHRdO1xuIgotICAgICAgIDogW3Jlc3VsdF0iPXIiKHJlc3VsdCkgCi0gICAgICAgOiBbYV9SZV0iciIoYV9SZSksIFtiX0ltXSJyIihiX0ltKSwgW2FfSW1dInIiKGFfSW0pLCBbYl9SZV0iciIoYl9SZSkKLSAgICAgICA6ICJsbyIpOwotICAgKmNfSW0gPSByZXN1bHQ7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoRlVOQ1RJT05fY3BseE11bHRfMzJ4MzJYMikKLWlubGluZSB2b2lkIGNwbHhNdWx0KCBGSVhQX0RCTCAqY19SZSwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY19JbSwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgYV9SZSwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgYV9JbSwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgYl9SZSwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgYl9JbSkKLXsKLSAgSU5UIHJlc3VsdDsKLQotICAgX19hc21fXyAoIm11bHQgJVthX1JlXSwgJVtiX1JlXTtcbiIKLSAgICAgICAgICAgICJtc3ViICVbYV9JbV0sICVbYl9JbV07XG4iCi0gICAgICAgICAgICAibWZoaSAlW3Jlc3VsdF07XG4iCi0gICAgICAgICAgICAvLyJleHRyX3cgJVtyZXN1bHRdLCAzMTtcbiIKLSAgICAgICAgOiBbcmVzdWx0XSI9ciIocmVzdWx0KQotICAgICAgICA6IFthX1JlXSJyIihhX1JlKSwgW2JfUmVdInIiKGJfUmUpLCBbYV9JbV0iciIoYV9JbSksIFtiX0ltXSJyIihiX0ltKQotICAgICAgICA6ICJsbyIpOwotICAgKmNfUmUgPSByZXN1bHQ8PDE7Ci0KLSAgIF9fYXNtX18gKCJtdWx0ICVbYV9SZV0sICVbYl9JbV07XG4iCi0gICAgICAgICAgICAibWFkZCAlW2FfSW1dLCAlW2JfUmVdO1xuIgotICAgICAgICAgICAgIm1maGkgJVtyZXN1bHRdO1xuIgotICAgICAgICAgICAgLy8iZXh0cl93ICVbcmVzdWx0XSwgMzE7XG4iCi0gICAgICAgIDogW3Jlc3VsdF0iPXIiKHJlc3VsdCkKLSAgICAgICAgOiBbYV9SZV0iciIoYV9SZSksIFtiX0ltXSJyIihiX0ltKSwgW2FfSW1dInIiKGFfSW0pLCBbYl9SZV0iciIoYl9SZSkKLSAgICAgICAgOiAibG8iKTsKLSAgICpjX0ltID0gcmVzdWx0PDwxOwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fbWlwc19fKSAqLwotCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9taXBzL2NwbHhfbXVsX21pcHMuaCBiL2xpYkZESy9pbmNsdWRlL21pcHMvY3BseF9tdWxfbWlwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYWUxMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJGREsvaW5jbHVkZS9taXBzL2NwbHhfbXVsX21pcHMuaApAQCAtMCwwICsxLDE3MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBmaXhlZCBwb2ludCBpbnRyaW5zaWNzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChDUExYX01VTF9NSVBTX0gpCisjZGVmaW5lIENQTFhfTVVMX01JUFNfSAorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX21pcHNfXykgJiYgX19taXBzX2lzYV9yZXYgPCA2CisKKy8vI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTYKKy8vI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MTZYMgorI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdERpdjJfMzJ4MzJYMgorLy8jZGVmaW5lIEZVTkNUSU9OX2NwbHhNdWx0XzMyeDE2CisvLyNkZWZpbmUgRlVOQ1RJT05fY3BseE11bHRfMzJ4MTZYMgorI2RlZmluZSBGVU5DVElPTl9jcGx4TXVsdF8zMngzMlgyCisKKyNpZiBkZWZpbmVkKEZVTkNUSU9OX2NwbHhNdWx0RGl2Ml8zMngzMlgyKQoraW5saW5lIHZvaWQgY3BseE11bHREaXYyKEZJWFBfREJMICpjX1JlLCBGSVhQX0RCTCAqY19JbSwgRklYUF9EQkwgYV9SZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBhX0ltLCBGSVhQX0RCTCBiX1JlLCBGSVhQX0RCTCBiX0ltKSB7CisgIElOVCByZXN1bHQ7CisKKyAgX19hc21fXygKKyAgICAgICJtdWx0ICVbYV9SZV0sICVbYl9SZV07XG4iCisgICAgICAibXN1YiAlW2FfSW1dLCAlW2JfSW1dO1xuIgorICAgICAgIm1maGkgJVtyZXN1bHRdO1xuIgorICAgICAgOiBbcmVzdWx0XSAiPXIiKHJlc3VsdCkKKyAgICAgIDogW2FfUmVdICJkIihhX1JlKSwgW2JfUmVdICJkIihiX1JlKSwgW2FfSW1dICJkIihhX0ltKSwgW2JfSW1dICJkIihiX0ltKQorICAgICAgOiAibG8iKTsKKworICAqY19SZSA9IHJlc3VsdDsKKworICBfX2FzbV9fKAorICAgICAgIm11bHQgJVthX1JlXSwgJVtiX0ltXTtcbiIKKyAgICAgICJtYWRkICVbYV9JbV0sICVbYl9SZV07XG4iCisgICAgICAibWZoaSAlW3Jlc3VsdF07XG4iCisgICAgICA6IFtyZXN1bHRdICI9ciIocmVzdWx0KQorICAgICAgOiBbYV9SZV0gInIiKGFfUmUpLCBbYl9JbV0gInIiKGJfSW0pLCBbYV9JbV0gInIiKGFfSW0pLCBbYl9SZV0gInIiKGJfUmUpCisgICAgICA6ICJsbyIpOworICAqY19JbSA9IHJlc3VsdDsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGVU5DVElPTl9jcGx4TXVsdF8zMngzMlgyKQoraW5saW5lIHZvaWQgY3BseE11bHQoRklYUF9EQkwgKmNfUmUsIEZJWFBfREJMICpjX0ltLCBGSVhQX0RCTCBhX1JlLAorICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgYV9JbSwgRklYUF9EQkwgYl9SZSwgRklYUF9EQkwgYl9JbSkgeworICBJTlQgcmVzdWx0OworCisgIF9fYXNtX18oCisgICAgICAibXVsdCAlW2FfUmVdLCAlW2JfUmVdO1xuIgorICAgICAgIm1zdWIgJVthX0ltXSwgJVtiX0ltXTtcbiIKKyAgICAgICJtZmhpICVbcmVzdWx0XTtcbiIKKyAgICAgIC8vImV4dHJfdyAlW3Jlc3VsdF0sIDMxO1xuIgorICAgICAgOiBbcmVzdWx0XSAiPXIiKHJlc3VsdCkKKyAgICAgIDogW2FfUmVdICJyIihhX1JlKSwgW2JfUmVdICJyIihiX1JlKSwgW2FfSW1dICJyIihhX0ltKSwgW2JfSW1dICJyIihiX0ltKQorICAgICAgOiAibG8iKTsKKyAgKmNfUmUgPSByZXN1bHQgPDwgMTsKKworICBfX2FzbV9fKAorICAgICAgIm11bHQgJVthX1JlXSwgJVtiX0ltXTtcbiIKKyAgICAgICJtYWRkICVbYV9JbV0sICVbYl9SZV07XG4iCisgICAgICAibWZoaSAlW3Jlc3VsdF07XG4iCisgICAgICAvLyJleHRyX3cgJVtyZXN1bHRdLCAzMTtcbiIKKyAgICAgIDogW3Jlc3VsdF0gIj1yIihyZXN1bHQpCisgICAgICA6IFthX1JlXSAiciIoYV9SZSksIFtiX0ltXSAiciIoYl9JbSksIFthX0ltXSAiciIoYV9JbSksIFtiX1JlXSAiciIoYl9SZSkKKyAgICAgIDogImxvIik7CisgICpjX0ltID0gcmVzdWx0IDw8IDE7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19taXBzX18pICovCisKKyNlbmRpZiAvKiAhZGVmaW5lZChDUExYX01VTF9NSVBTX0gpICovCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9taXBzL2ZpeG1hZGRfbWlwcy5oIGIvbGliRkRLL2luY2x1ZGUvbWlwcy9maXhtYWRkX21pcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1NzVmYi4uMDAwMDAwMAotLS0gYS9saWJGREsvaW5jbHVkZS9taXBzL2ZpeG1hZGRfbWlwcy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6Ci0gICBEZXNjcmlwdGlvbjogZml4ZWQgcG9pbnQgaW50cmluc2ljcwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiBkZWZpbmVkKF9fbWlwc19fKQotCi0KLSNlbmRpZiAvKiBfX21pcHNfXyAqLwotCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9taXBzL2ZpeG11bF9taXBzLmggYi9saWJGREsvaW5jbHVkZS9taXBzL2ZpeG11bF9taXBzLmgKaW5kZXggNzM2OTNlMi4uMDZjZjUzMCAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvbWlwcy9maXhtdWxfbWlwcy5oCisrKyBiL2xpYkZESy9pbmNsdWRlL21pcHMvZml4bXVsX21pcHMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzMCArOTAsMzUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKKwogICAgRGVzY3JpcHRpb246IGZpeGVkIHBvaW50IGludHJpbnNpY3MKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKEZJWE1VTF9NSVBTX0gpCisjZGVmaW5lIEZJWE1VTF9NSVBTX0gKIAogI2lmIGRlZmluZWQoX19taXBzX18pCiAKLSNpZiAoX19HTlVDX18pICYmIGRlZmluZWQoX19taXBzX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyNpZiAoX19HTlVDX18pICYmIGRlZmluZWQoX19taXBzX18pCiAvKiBNSVBTIEdDQyBiYXNlZCBjb21waWxlciAqLwogCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJfREQKIAogI2RlZmluZSBGVU5DVElPTl9maXhtdWxkaXYyQml0RXhhY3RfREQKLSNkZWZpbmUgZml4bXVsZGl2MkJpdEV4YWN0X0REKGEsYikgZml4bXVsZGl2Ml9ERChhLGIpCisjZGVmaW5lIGZpeG11bGRpdjJCaXRFeGFjdF9ERChhLCBiKSBmaXhtdWxkaXYyX0REKGEsIGIpCiAKLWlubGluZSBJTlQgZml4bXVsZGl2Ml9ERCAoY29uc3QgSU5UIGEsIGNvbnN0IElOVCBiKQotewotICBJTlQgcmVzdWx0IDsKLSAgcmVzdWx0ID0gKChsb25nIGxvbmcpYSAqIGIpPj4zMjsKLSAgcmV0dXJuIHJlc3VsdCA7CitpbmxpbmUgSU5UIGZpeG11bGRpdjJfREQoY29uc3QgSU5UIGEsIGNvbnN0IElOVCBiKSB7CisgIElOVCByZXN1bHQ7CisKKyAgcmVzdWx0ID0gKChsb25nIGxvbmcpYSAqIGIpID4+IDMyOworCisgIHJldHVybiByZXN1bHQ7CiB9CiAKICNlbmRpZiAvKiAoX19HTlVDX18pICYmIGRlZmluZWQoX19taXBzX18pICovCkBAIC0xMTEsMyArMTI3LDQgQEAKIAogI2RlZmluZSBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9ERAogI2RlZmluZSBmaXhtdWxCaXRFeGFjdF9ERCBmaXhtdWxfREQKKyNlbmRpZiAvKiAhZGVmaW5lZChGSVhNVUxfTUlQU19IKSAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvbWlwcy9zY2FsZS5oIGIvbGliRkRLL2luY2x1ZGUvbWlwcy9zY2FsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGYyOWRhLi4wMDAwMDAwCi0tLSBhL2xpYkZESy9pbmNsdWRlL21pcHMvc2NhbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIEF1dGhvcihzKToKLSAgIERlc2NyaXB0aW9uOgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgTUlQU19TQ0FMRV9ICi0jZGVmaW5lIE1JUFNfU0NBTEVfSAotCi0jaWYgZGVmaW5lZChfX21pcHNfZHNwKQotCi0vKiEKLSoKLSogIFxicmllZiAgU2NhbGUgaW5wdXQgdmFsdWUgYnkgMl57c2NhbGV9IGFuZCBzYXR1cmF0ZSBvdXRwdXQgdG8gMl57ZEJpdHMtMX0KLSogIFxyZXR1cm4gc2NhbGVkIGFuZCBzYXR1cmF0ZWQgdmFsdWUKLSoKLSogIFRoaXMgbWFjcm8gc2NhbGVzIHNyYyB2YWx1ZSByaWdodCBvciBsZWZ0IGFuZCBhcHBsaWVzIHNhdHVyYXRpb24gdG8gKDJeZEJpdHMpLTEKLSogIG1heGltYSBvdXRwdXQuCi0qLwotI2RlZmluZSBTQVRVUkFURV9SSUdIVF9TSElGVChzcmMsIHNjYWxlLCBkQml0cykgICAgICAgXAotICAgICAgICAgIChfX2J1aWx0aW5fbWlwc19zaGxsX3Nfdygoc3JjKT4+c2NhbGUsKERGUkFDVF9CSVRTLShkQml0cykpKT4+KERGUkFDVF9CSVRTLShkQml0cykpKQotCi0KLSNlbmRpZiAvKl9fbWlwc19kc3AgKi8KLQotI2VuZGlmIC8qIE1JUFNfU0NBTEVfSCAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvbWlwcy9zY2FsZV9taXBzLmggYi9saWJGREsvaW5jbHVkZS9taXBzL3NjYWxlX21pcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzE0MWZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliRkRLL2luY2x1ZGUvbWlwcy9zY2FsZV9taXBzLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQ0FMRV9NSVBTX0gKKyNkZWZpbmUgU0NBTEVfTUlQU19ICisKKyNpZiBkZWZpbmVkKF9fbWlwc19kc3ApCisKKy8qIQorICoKKyAqICBcYnJpZWYgIFNjYWxlIGlucHV0IHZhbHVlIGJ5IDJee3NjYWxlfSBhbmQgc2F0dXJhdGUgb3V0cHV0IHRvIDJee2RCaXRzLTF9CisgKiAgXHJldHVybiBzY2FsZWQgYW5kIHNhdHVyYXRlZCB2YWx1ZQorICoKKyAqICBUaGlzIG1hY3JvIHNjYWxlcyBzcmMgdmFsdWUgcmlnaHQgb3IgbGVmdCBhbmQgYXBwbGllcyBzYXR1cmF0aW9uIHRvCisgKiAoMl5kQml0cyktMSBtYXhpbWEgb3V0cHV0LgorICovCisjZGVmaW5lIFNBVFVSQVRFX1JJR0hUX1NISUZUKHNyYywgc2NhbGUsIGRCaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoX19idWlsdGluX21pcHNfc2hsbF9zX3coKHNyYykgPj4gKHNjYWxlKSwgKERGUkFDVF9CSVRTIC0gKGRCaXRzKSkpID4+IFwKKyAgIChERlJBQ1RfQklUUyAtIChkQml0cykpKQorCisjZW5kaWYgLypfX21pcHNfZHNwICovCisKKyNlbmRpZiAvKiBTQ0FMRV9NSVBTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL21pcHMvc2NyYW1ibGUuaCBiL2xpYkZESy9pbmNsdWRlL21pcHMvc2NyYW1ibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YyZmU2ZS4uMDAwMDAwMAotLS0gYS9saWJGREsvaW5jbHVkZS9taXBzL3NjcmFtYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6Ci0gICBEZXNjcmlwdGlvbjoKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIE1JUFNfU0NSQU1CTEVfSAotI2RlZmluZSBNSVBTX1NDUkFNQkxFX0gKLQotI2RlZmluZSBGVU5DVElPTl9zY3JhbWJsZQotCi0jaWYgZGVmaW5lZChGVU5DVElPTl9zY3JhbWJsZSkKLWlubGluZSB2b2lkIHNjcmFtYmxlKEZJWFBfREJMICp4LCBJTlQgbikgewotICBJTlQgbSxqOwotICBpbnQgbGRuPTE7Ci0gIGRvIHtsZG4rKzt9IHdoaWxlKCgxPDxsZG4pPG4pOwotCi0gIGZvciAobT0xLGo9MDsgbTxuLTE7IG0rKykKLSAgewotICAgIGogPSBfX2J1aWx0aW5fbWlwc19iaXRyZXYobSkgPj4gKDE2LWxkbik7Ci0KLSAgICBpZiAoaj5tKQotICAgIHsKLSAgICAgIEZJWFBfREJMIHRtcDsKLSAgICAgIHRtcD14WzIqbV07Ci0gICAgICB4WzIqbV09eFsyKmpdOwotICAgICAgeFsyKmpdPXRtcDsKLQotICAgICAgdG1wPXhbMiptKzFdOwotICAgICAgeFsyKm0rMV09eFsyKmorMV07Ci0gICAgICB4WzIqaisxXT10bXA7Ci0gICAgfQotICB9Ci19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIE1JUFNfU0NSQU1CTEVfSCAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvbWlwcy9zY3JhbWJsZV9taXBzLmggYi9saWJGREsvaW5jbHVkZS9taXBzL3NjcmFtYmxlX21pcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGMyZTZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliRkRLL2luY2x1ZGUvbWlwcy9zY3JhbWJsZV9taXBzLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQ1JBTUJMRV9NSVBTX0gKKyNkZWZpbmUgU0NSQU1CTEVfTUlQU19ICisKKyNkZWZpbmUgRlVOQ1RJT05fc2NyYW1ibGUKKworI2lmIGRlZmluZWQoRlVOQ1RJT05fc2NyYW1ibGUpCitpbmxpbmUgdm9pZCBzY3JhbWJsZShGSVhQX0RCTCAqeCwgSU5UIG4pIHsKKyAgSU5UIG0sIGo7CisgIGludCBsZG4gPSAxOworICBkbyB7CisgICAgbGRuKys7CisgIH0gd2hpbGUgKCgxIDw8IGxkbikgPCBuKTsKKworICBmb3IgKG0gPSAxLCBqID0gMDsgbSA8IG4gLSAxOyBtKyspIHsKKyAgICBqID0gX19idWlsdGluX21pcHNfYml0cmV2KG0pID4+ICgxNiAtIGxkbik7CisKKyAgICBpZiAoaiA+IG0pIHsKKyAgICAgIEZJWFBfREJMIHRtcDsKKyAgICAgIHRtcCA9IHhbMiAqIG1dOworICAgICAgeFsyICogbV0gPSB4WzIgKiBqXTsKKyAgICAgIHhbMiAqIGpdID0gdG1wOworCisgICAgICB0bXAgPSB4WzIgKiBtICsgMV07CisgICAgICB4WzIgKiBtICsgMV0gPSB4WzIgKiBqICsgMV07CisgICAgICB4WzIgKiBqICsgMV0gPSB0bXA7CisgICAgfQorICB9Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNDUkFNQkxFX01JUFNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvbmxjX2RlYy5oIGIvbGliRkRLL2luY2x1ZGUvbmxjX2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYTk3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJGREsvaW5jbHVkZS9ubGNfZGVjLmgKQEAgLTAsMCArMSwxODcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE9tZXIgT3NtYW4KKworICAgRGVzY3JpcHRpb246IFNBQy9TQU9DIERlYyBOb2lzZWxlc3MgQ29kaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTkxDX0RFQ19ICisjZGVmaW5lIE5MQ19ERUNfSAorCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImh1ZmZfbm9kZXMuaCIKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKK3R5cGVkZWYgZW51bSB7CisKKyAgU0FDX0RFQ09ERVIsCisgIFNBT0NfREVDT0RFUiwKKyAgVVNBQ19ERUNPREVSCisKK30gREVDT0RFUl9UWVBFOworCit0eXBlZGVmIGVudW0geworICB0X0NMRCwKKyAgdF9JQ0MsCisgIHRfSVBELAorICB0X09MRCwKKyAgdF9JT0MsCisgIHRfTlJHLAorICB0X0RDTEQsCisgIHRfRE1HLAorICB0X1BERworCit9IERBVEFfVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKworICBCQUNLV0FSRFMgPSAweDAsCisgIEZPUldBUkRTID0gMHgxCisKK30gRElSRUNUSU9OOworCit0eXBlZGVmIGVudW0geworCisgIERJRkZfRlJFUSA9IDB4MCwKKyAgRElGRl9USU1FID0gMHgxCisKK30gRElGRl9UWVBFOworCit0eXBlZGVmIGVudW0geworCisgIEhVRkZfMUQgPSAweDAsCisgIEhVRkZfMkQgPSAweDEKKworfSBDT0RJTkdfU0NIRU1FOworCit0eXBlZGVmIGVudW0geworCisgIEZSRVFfUEFJUiA9IDB4MCwKKyAgVElNRV9QQUlSID0gMHgxCisKK30gUEFJUklORzsKKworI2lmbmRlZiBIVUZGREVDX1BBUkFNUworI2RlZmluZSBIVUZGREVDX1BBUk1TCisKKyNkZWZpbmUgUEFJUl9TSElGVCA0CisjZGVmaW5lIFBBSVJfTUFTSyAweGYKKworI2RlZmluZSBNQVhfRU5UUklFUyAxNjgKKyNkZWZpbmUgSEFORExFX0hVRkZfTk9ERSBjb25zdCBTSE9SVCgqKVtNQVhfRU5UUklFU11bMl0KKworI2VuZGlmIC8qIEhVRkZERUNQQVJBTVMgKi8KKworI2RlZmluZSBIVUZGREVDX09LIDAKKyNkZWZpbmUgSFVGRkRFQ19OT1RPSyAoLTEpCisKK3R5cGVkZWYgaW50IEVSUk9SX3Q7CisKK0VSUk9SX3QgRWNEYXRhUGFpckRlYyhERUNPREVSX1RZUEUgREVDT0RFUiwgSEFORExFX0ZES19CSVRTVFJFQU0gc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqYWFPdXREYXRhMSwgU0NIQVIgKmFhT3V0RGF0YTIsIFNDSEFSICphSGlzdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICBEQVRBX1RZUEUgZGF0YV90eXBlLCBpbnQgc3RhcnRCYW5kLCBpbnQgZGF0YUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgIGludCBwYWlyX2ZsYWcsIGludCBjb2Fyc2VfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dEaWZmVGltZUJhY2tfZmxhZyk7CisKKy8qIG5lZWRlZCBmb3IgR0VTLSAmIFNUUC10b29sICovCitFUlJPUl90IGh1ZmZfZGVjX3Jlc2hhcGUoSEFORExFX0ZES19CSVRTVFJFQU0gc3RybSwgaW50ICpvdXRfZGF0YSwgaW50IG51bV92YWwpOworCitleHRlcm4gRVJST1JfdCBzeW1fcmVzdG9yZUlQRChIQU5ETEVfRkRLX0JJVFNUUkVBTSBzdHJtLCBpbnQgbGF2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgZGF0YVsyXSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUvcW1mLmggYi9saWJGREsvaW5jbHVkZS9xbWYuaAppbmRleCBiZTY5NDc3Li42MDljNmYxIDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9xbWYuaAorKysgYi9saWJGREsvaW5jbHVkZS9xbWYuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNzAgKzkwLDIxMiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZSAgIHFtZi5oCi0gIFxicmllZiAgQ29tcGxleCBxbWYgYW5hbHlzaXMvc3ludGhlc2lzICAgCisgIFxicmllZiAgQ29tcGxleCBxbWYgYW5hbHlzaXMvc3ludGhlc2lzCiAgIFxhdXRob3IgTWFya3VzIFdlcm5lcgogCiAqLwotI2lmbmRlZiBfX1FNRl9ICi0jZGVmaW5lIF9fUU1GX0gKIAotCisjaWZuZGVmIFFNRl9ICisjZGVmaW5lIFFNRl9ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgogI2luY2x1ZGUgImRjdC5oIgogCi0vKgotICogRmlsdGVyIGNvZWZmaWNpZW50IHR5cGUgZGVmaW5pdGlvbgotICovCi0jaWZkZWYgUU1GX0RBVEFfMTZCSVQKLSNkZWZpbmUgRklYUF9RTUYgRklYUF9TR0wKLSNkZWZpbmUgRlhfREJMMkZYX1FNRiBGWF9EQkwyRlhfU0dMCi0jZGVmaW5lIEZYX1FNRjJGWF9EQkwgRlhfU0dMMkZYX0RCTAotI2RlZmluZSBRRlJBQ1RfQklUUyBGUkFDVF9CSVRTCi0jZWxzZQotI2RlZmluZSBGSVhQX1FNRiBGSVhQX0RCTAotI2RlZmluZSBGWF9EQkwyRlhfUU1GCi0jZGVmaW5lIEZYX1FNRjJGWF9EQkwKLSNkZWZpbmUgUUZSQUNUX0JJVFMgREZSQUNUX0JJVFMKLSNlbmRpZgotCi0vKiBBUk0gbmVvbiBvcHRpbWl6ZWQgUU1GIGFuYWx5c2lzIGZpbHRlciByZXF1aXJlcyAzMiBiaXQgaW5wdXQuCi0gICBJbXBsZW1lbnRlZCBmb3IgUlZDVCBvbmx5LCBjdXJyZW50bHkgZGlzYWJsZWQuIFNlZSBzcmMvYXJtL3FtZl9hcm0uY3BwOjQ1ICovCiAjZGVmaW5lIEZJWFBfUUFTIEZJWFBfUENNCiAjZGVmaW5lIFFBU19CSVRTIFNBTVBMRV9CSVRTCiAKLSNpZmRlZiBRTUZTWU5fU1RBVEVTXzE2QklUCi0jZGVmaW5lIEZJWFBfUVNTIEZJWFBfU0dMCi0jZGVmaW5lIFFTU19CSVRTIEZSQUNUX0JJVFMKLSNlbHNlCiAjZGVmaW5lIEZJWFBfUVNTIEZJWFBfREJMCiAjZGVmaW5lIFFTU19CSVRTIERGUkFDVF9CSVRTCi0jZW5kaWYKIAogLyogRmxhZ3MgZm9yIFFNRiBpbnRpYWxpemF0aW9uICovCiAvKiBMb3cgUG93ZXIgbW9kZSBmbGFnICovCi0jZGVmaW5lIFFNRl9GTEFHX0xQICAgICAgICAgICAxCi0vKiBGaWx0ZXIgaXMgbm90IHN5bWV0cmljLiBUaGlzIGZsYWcgaXMgc2V0IGludGVybmFsbHkgaW4gdGhlIFFNRiBpbml0aWFsaXphdGlvbiBhcyByZXF1aXJlZC4gKi8KKyNkZWZpbmUgUU1GX0ZMQUdfTFAgMQorLyogRmlsdGVyIGlzIG5vdCBzeW1tZXRyaWMuIFRoaXMgZmxhZyBpcyBzZXQgaW50ZXJuYWxseSBpbiB0aGUgUU1GCisgKiBpbml0aWFsaXphdGlvbiBhcyByZXF1aXJlZC4gKi8KKy8qIERPIE5PVCBQQVNTIFRISVMgRkxBRyBUTyBxbWZJbml0QW5hbHlzaXNGaWx0ZXJCYW5rIG9yCisgKiBxbWZJbml0U3ludGhlc2lzRmlsdGVyQmFuayAqLwogI2RlZmluZSBRTUZfRkxBR19OT05TWU1NRVRSSUMgMgogLyogQ29tcGxleCBMb3cgRGVsYXkgRmlsdGVyIEJhbmsgKG9yIHN0ZCBzeW1tZXRyaWMgZmlsdGVyIGJhbmspICovCi0jZGVmaW5lIFFNRl9GTEFHX0NMREZCICAgICAgICA0CisjZGVmaW5lIFFNRl9GTEFHX0NMREZCIDQKIC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBzdGF0ZXMgc2hvdWxkIGJlIGtlcHQuICovCi0jZGVmaW5lIFFNRl9GTEFHX0tFRVBfU1RBVEVTICA4CisjZGVmaW5lIFFNRl9GTEFHX0tFRVBfU1RBVEVTIDgKIC8qIENvbXBsZXggTG93IERlbGF5IEZpbHRlciBCYW5rIHVzZWQgaW4gTVBFRyBTdXJyb3VuZCBFbmNvZGVyICovCi0jZGVmaW5lIFFNRl9GTEFHX01QU0xERkIgICAgIDE2Ci0vKiBDb21wbGV4IExvdyBEZWxheSBGaWx0ZXIgQmFuayB1c2VkIGluIE1QRUcgU3Vycm91bmQgRW5jb2RlciBhbGxvd3MgYSBvcHRpbWl6ZWQgY2FsY3VsYXRpb24gb2YgdGhlIG1vZHVsYXRpb24gaW4gcW1mRm9yd2FyZE1vZHVsYXRpb25IUSgpICovCi0jZGVmaW5lIFFNRl9GTEFHX01QU0xERkJfT1BUSU1JWkVfTU9EVUxBVElPTiAgMzIKLS8qIEZsYWcgdG8gaW5kaWNhdGUgSEUtQUFDIGRvd24tc2FtcGxlZCBTQlIgbW9kZSAoZGVjb2RlcikgLT4gYWRhcHQgYW5hbHlzaXMgcG9zdCB0d2lkZGxpbmcgKi8KLSNkZWZpbmUgUU1GX0ZMQUdfRE9XTlNBTVBMRUQgIDY0CisjZGVmaW5lIFFNRl9GTEFHX01QU0xERkIgMTYKKy8qIENvbXBsZXggTG93IERlbGF5IEZpbHRlciBCYW5rIHVzZWQgaW4gTVBFRyBTdXJyb3VuZCBFbmNvZGVyIGFsbG93cyBhCisgKiBvcHRpbWl6ZWQgY2FsY3VsYXRpb24gb2YgdGhlIG1vZHVsYXRpb24gaW4gcW1mRm9yd2FyZE1vZHVsYXRpb25IUSgpICovCisjZGVmaW5lIFFNRl9GTEFHX01QU0xERkJfT1BUSU1JWkVfTU9EVUxBVElPTiAzMgorLyogRmxhZyB0byBpbmRpY2F0ZSBIRS1BQUMgZG93bi1zYW1wbGVkIFNCUiBtb2RlIChkZWNvZGVyKSAtPiBhZGFwdCBhbmFseXNpcworICogcG9zdCB0d2lkZGxpbmcgKi8KKyNkZWZpbmUgUU1GX0ZMQUdfRE9XTlNBTVBMRUQgNjQKIAorI2RlZmluZSBRTUZfTUFYX1NZTlRIRVNJU19CQU5EUyAoNjQpCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGludCBsYl9zY2FsZTsgICAgICAgIC8qITwgU2NhbGUgb2YgbG93IGJhbmQgYXJlYSAgICAgICAgICAgICAgICAgICAqLwotICBpbnQgb3ZfbGJfc2NhbGU7ICAgICAvKiE8IFNjYWxlIG9mIGFkanVzdGVkIG92ZXJsYXAgbG93IGJhbmQgYXJlYSAgKi8KLSAgaW50IGhiX3NjYWxlOyAgICAgICAgLyohPCBTY2FsZSBvZiBoaWdoIGJhbmQgYXJlYSAgICAgICAgICAgICAgICAgICovCi0gIGludCBvdl9oYl9zY2FsZTsgICAgIC8qITwgU2NhbGUgb2YgYWRqdXN0ZWQgb3ZlcmxhcCBoaWdoIGJhbmQgYXJlYSAqLworLyohCisgKiBcYnJpZWYgQWxnb3JpdGhtaWMgc2NhbGluZyBpbiBzYnJGb3J3YXJkTW9kdWxhdGlvbigpCisgKgorICogVGhlIHNjYWxpbmcgaW4gc2JyRm9yd2FyZE1vZHVsYXRpb24oKSBpcyBjYXVzZWQgYnk6CisgKgorICogICBcbGkgMSBSX1NISUZUIGluIHNickZvcndhcmRNb2R1bGF0aW9uKCkKKyAqICAgXGxpIDUvNiBSX1NISUZUIGluIGRjdDMoKSBpZiB1c2luZyAzMi82NCBCYW5kcworICogICBcbGkgMSBvbWl0dGVkIGdhaW4gb2YgMi4wIGluIHFtZkZvcndhcmRNb2R1bGF0aW9uKCkKKyAqLworI2RlZmluZSBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX0FOQUxZU0lTX0ZJTFRFUkJBTksgNworCisvKiEKKyAqIFxicmllZiBBbGdvcml0aG1pYyBzY2FsaW5nIGluIGNwbHhTeW50aGVzaXNRbWZGaWx0ZXJpbmcoKQorICoKKyAqIFRoZSBzY2FsaW5nIGluIGNwbHhTeW50aGVzaXNRbWZGaWx0ZXJpbmcoKSBpcyBjYXVzZWQgYnk6CisgKgorICogICBcbGkgIDUvNiBSX1NISUZUIGluIGRjdDIoKSBpZiB1c2luZyAzMi82NCBCYW5kcworICogICBcbGkgIDEgb21pdHRlZCBnYWluIG9mIDIuMCBpbiBxbWZJbnZlcnNlTW9kdWxhdGlvbigpCisgKiAgIFxsaSAtNiBkaXZpc2lvbiBieSA2NCBpbiBzeW50aGVzaXMgZmlsdGVyYmFuaworICogICBcbGkgeCBiaXRzIGV4dGVybmFsIGluZmx1ZW5jZQorICovCisjZGVmaW5lIEFMR09SSVRITUlDX1NDQUxJTkdfSU5fU1lOVEhFU0lTX0ZJTFRFUkJBTksgMQorCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBsYl9zY2FsZTsgICAgLyohPCBTY2FsZSBvZiBsb3cgYmFuZCBhcmVhICAgICAgICAgICAgICAgICAgICovCisgIGludCBvdl9sYl9zY2FsZTsgLyohPCBTY2FsZSBvZiBhZGp1c3RlZCBvdmVybGFwIGxvdyBiYW5kIGFyZWEgICovCisgIGludCBoYl9zY2FsZTsgICAgLyohPCBTY2FsZSBvZiBoaWdoIGJhbmQgYXJlYSAgICAgICAgICAgICAgICAgICovCisgIGludCBvdl9oYl9zY2FsZTsgLyohPCBTY2FsZSBvZiBhZGp1c3RlZCBvdmVybGFwIGhpZ2ggYmFuZCBhcmVhICovCiB9IFFNRl9TQ0FMRV9GQUNUT1I7CiAKLXN0cnVjdCBRTUZfRklMVEVSX0JBTksKLXsKLSAgY29uc3QgRklYUF9QRlQgKnBfZmlsdGVyOyAgICAgLyohPCBQb2ludGVyIHRvIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK3N0cnVjdCBRTUZfRklMVEVSX0JBTksgeworICBjb25zdCBGSVhQX1BGVCAqcF9maWx0ZXI7IC8qITwgUG9pbnRlciB0byBmaWx0ZXIgY29lZmZpY2llbnRzICovCiAKLSAgdm9pZCAqRmlsdGVyU3RhdGVzOyAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGJ1ZmZlciBvZiBmaWx0ZXIgc3RhdGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9QQ00gaW4gYW5hbHlzZSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBpbiBzeW50aGVzaXMgZmlsdGVyICovCi0gIGludCBGaWx0ZXJTaXplOyAgICAgICAgICAgICAgIC8qITwgU2l6ZSBvZiBwcm90b3R5cGUgZmlsdGVyLiAqLwotICBjb25zdCBGSVhQX1FUVyAqdF9jb3M7ICAgICAgICAvKiE8IE1vZHVsYXRpb24gdGFibGVzLiAqLworICB2b2lkICpGaWx0ZXJTdGF0ZXM7ICAgIC8qITwgUG9pbnRlciB0byBidWZmZXIgb2YgZmlsdGVyIHN0YXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9QQ00gaW4gYW5hbHlzZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGluIHN5bnRoZXNpcyBmaWx0ZXIgKi8KKyAgaW50IEZpbHRlclNpemU7ICAgICAgICAvKiE8IFNpemUgb2YgcHJvdG90eXBlIGZpbHRlci4gKi8KKyAgY29uc3QgRklYUF9RVFcgKnRfY29zOyAvKiE8IE1vZHVsYXRpb24gdGFibGVzLiAqLwogICBjb25zdCBGSVhQX1FUVyAqdF9zaW47Ci0gIGludCBmaWx0ZXJTY2FsZTsgICAgICAgICAgICAgIC8qITwgZmlsdGVyIHNjYWxlICovCisgIGludCBmaWx0ZXJTY2FsZTsgLyohPCBmaWx0ZXIgc2NhbGUgKi8KIAotICBpbnQgbm9fY2hhbm5lbHM7ICAgICAgICAgICAgICAvKiE8IFRvdGFsIG51bWJlciBvZiBjaGFubmVscyAoc3ViYmFuZHMpICovCi0gIGludCBub19jb2w7ICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWUgc2xvdHMgICAgICAgKi8KLSAgaW50IGxzYjsgICAgICAgICAgICAgICAgICAgICAgLyohPCBUb3Agb2YgbG93IHN1YmJhbmRzICovCi0gIGludCB1c2I7ICAgICAgICAgICAgICAgICAgICAgIC8qITwgVG9wIG9mIGhpZ2ggc3ViYmFuZHMgKi8KKyAgaW50IG5vX2NoYW5uZWxzOyAvKiE8IFRvdGFsIG51bWJlciBvZiBjaGFubmVscyAoc3ViYmFuZHMpICovCisgIGludCBub19jb2w7ICAgICAgLyohPCBOdW1iZXIgb2YgdGltZSBzbG90cyAgICAgICAqLworICBpbnQgbHNiOyAgICAgICAgIC8qITwgVG9wIG9mIGxvdyBzdWJiYW5kcyAqLworICBpbnQgdXNiOyAgICAgICAgIC8qITwgVG9wIG9mIGhpZ2ggc3ViYmFuZHMgKi8KIAotICBpbnQgb3V0U2NhbGVmYWN0b3I7ICAgICAgICAgICAvKiE8IFNjYWxlIGZhY3RvciBvZiBvdXRwdXQgZGF0YSAoc3luIG9ubHkpICovCi0gIEZJWFBfREJMIG91dEdhaW47ICAgICAgICAgICAgIC8qITwgR2FpbiBvdXRwdXQgZGF0YSAoc3luIG9ubHkpIChpbml0IHdpdGggMHg4MDAwMDAwMCB0byBpZ25vcmUpICovCisgIGludCBzeW5TY2FsZWZhY3RvcjsgLyohPCBTY2FsZSBmYWN0b3Igb2Ygc3ludGhlc2lzIHFtZiAoc3luIG9ubHkpICovCisgIGludCBvdXRTY2FsZWZhY3RvcjsgLyohPCBTY2FsZSBmYWN0b3Igb2Ygb3V0cHV0IGRhdGEgKHN5biBvbmx5KSAqLworICBGSVhQX0RCTCBvdXRHYWluX207IC8qITwgTWFudGlzc2Egb2YgZ2FpbiBvdXRwdXQgZGF0YSAoc3luIG9ubHkpIChpbml0IHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwIHRvIGlnbm9yZSkgKi8KKyAgaW50IG91dEdhaW5fZTsgICAgICAvKiE8IEV4cG9uZW50IG9mIGdhaW4gb3V0cHV0IGRhdGEgKHN5biBvbmx5KSAqLwogCi0gIFVJTlQgZmxhZ3M7ICAgICAgICAgICAgICAgICAgIC8qITwgZmxhZ3MgKi8KLSAgVUNIQVIgcF9zdHJpZGU7ICAgICAgICAgICAgICAgLyohPCBTdHJpZGUgRmFjdG9yIG9mIHBvbHlwaGFzZSBmaWx0ZXJzICovCi0KKyAgVUlOVCBmbGFnczsgICAgIC8qITwgZmxhZ3MgKi8KKyAgVUNIQVIgcF9zdHJpZGU7IC8qITwgU3RyaWRlIEZhY3RvciBvZiBwb2x5cGhhc2UgZmlsdGVycyAqLwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgUU1GX0ZJTFRFUl9CQU5LICpIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LOwogCi12b2lkCi1xbWZBbmFseXNpc0ZpbHRlcmluZyggSEFORExFX1FNRl9GSUxURVJfQkFOSyBhbmFRbWYsICAvKiE8IEhhbmRsZSBvZiBRbWYgQW5hbHlzaXMgQmFuayAgICovCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKipxbWZSZWFsLCAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcmVhbCBzdWJiYW5kIHNsb3RzICovCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKipxbWZJbWFnLCAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gaW1hZyBzdWJiYW5kIHNsb3RzICovCi0gICAgICAgICAgICAgICAgICAgICAgUU1GX1NDQUxFX0ZBQ1RPUiAqc2NhbGVGYWN0b3IsICAvKiE8IFNjYWxlIGZhY3RvcnMgb2YgUU1GIGRhdGEgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UX1BDTSAqdGltZUluLCAgICAgICAgICAvKiE8IFRpbWUgc2lnbmFsICovCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICBzdHJpZGUsICAgICAgICAgICAgICAvKiE8IFN0cmlkZSBmYWN0b3Igb2YgYXVkaW8gZGF0YSAgICovCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgICpwV29ya0J1ZmZlciAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gdGVtcG9yYWwgd29ya2luZyBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICApOwordm9pZCBxbWZBbmFseXNpc0ZpbHRlcmluZygKKyAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGFuYVFtZiwgLyohPCBIYW5kbGUgb2YgUW1mIEFuYWx5c2lzIEJhbmsgICAqLworICAgIEZJWFBfREJMICoqcW1mUmVhbCwgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcmVhbCBzdWJiYW5kIHNsb3RzICovCisgICAgRklYUF9EQkwgKipxbWZJbWFnLCAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBpbWFnIHN1YmJhbmQgc2xvdHMgKi8KKyAgICBRTUZfU0NBTEVfRkFDVE9SICpzY2FsZUZhY3RvciwgLyohPCBTY2FsZSBmYWN0b3JzIG9mIFFNRiBkYXRhICAgICAqLworICAgIGNvbnN0IExPTkcgKnRpbWVJbiwgICAgICAgICAgICAvKiE8IFRpbWUgc2lnbmFsICovCisgICAgY29uc3QgaW50IHRpbWVJbl9lLCAgICAgICAgICAgIC8qITwgRXhwb25lbnQgb2YgYXVkaW8gZGF0YSAgICAgICAgKi8KKyAgICBjb25zdCBpbnQgc3RyaWRlLCAgICAgICAgICAgICAgLyohPCBTdHJpZGUgZmFjdG9yIG9mIGF1ZGlvIGRhdGEgICAqLworICAgIEZJWFBfREJMICpwV29ya0J1ZmZlciAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gdGVtcG9yYXJ5IHdvcmtpbmcgYnVmZmVyICovCispOwogCi12b2lkCi1xbWZTeW50aGVzaXNGaWx0ZXJpbmcoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mLCAgICAgICAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgICovCi0gICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAqKlFtZkJ1ZmZlclJlYWwsICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcmVhbCBzdWJiYW5kIHNsb3RzICovCi0gICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAqKlFtZkJ1ZmZlckltYWcsICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gaW1hZyBzdWJiYW5kIHNsb3RzICovCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFNRl9TQ0FMRV9GQUNUT1IgKnNjYWxlRmFjdG9yLCAvKiE8IFNjYWxlIGZhY3RvcnMgb2YgUU1GIGRhdGEgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgIG92X2xlbiwgICAgICAgICAgICAgICAgICAvKiE8IExlbmd0aCBvZiBiYW5kIG92ZXJsYXAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgKnRpbWVPdXQsICAgICAgICAgICAgICAgICAvKiE8IFRpbWUgc2lnbmFsICovCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgIHN0cmlkZSwgICAgICAgICAgICAgICAgICAvKiE8IFN0cmlkZSBmYWN0b3Igb2YgYXVkaW8gZGF0YSAgICovCi0gICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAgKnBXb3JrQnVmZmVyICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gdGVtcG9yYWwgd29ya2luZyBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKTsKK3ZvaWQgcW1mQW5hbHlzaXNGaWx0ZXJpbmcoCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBhbmFRbWYsIC8qITwgSGFuZGxlIG9mIFFtZiBBbmFseXNpcyBCYW5rICAgKi8KKyAgICBGSVhQX0RCTCAqKnFtZlJlYWwsICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHJlYWwgc3ViYmFuZCBzbG90cyAqLworICAgIEZJWFBfREJMICoqcW1mSW1hZywgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gaW1hZyBzdWJiYW5kIHNsb3RzICovCisgICAgUU1GX1NDQUxFX0ZBQ1RPUiAqc2NhbGVGYWN0b3IsIC8qITwgU2NhbGUgZmFjdG9ycyBvZiBRTUYgZGF0YSAgICAgKi8KKyAgICBjb25zdCBJTlRfUENNICp0aW1lSW4sICAgICAgICAgLyohPCBUaW1lIHNpZ25hbCAqLworICAgIGNvbnN0IGludCB0aW1lSW5fZSwgICAgICAgICAgICAvKiE8IEV4cG9uZW50IG9mIGF1ZGlvIGRhdGEgICAgICAgICovCisgICAgY29uc3QgaW50IHN0cmlkZSwgICAgICAgICAgICAgIC8qITwgU3RyaWRlIGZhY3RvciBvZiBhdWRpbyBkYXRhICAgKi8KKyAgICBGSVhQX0RCTCAqcFdvcmtCdWZmZXIgICAgICAgICAgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFsIHdvcmtpbmcgYnVmZmVyICovCispOwogCi1pbnQKLXFtZkluaXRBbmFseXNpc0ZpbHRlckJhbmsoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgaF9RbWYsIC8qITwgUU1GIEhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RQVMgKnBGaWx0ZXJTdGF0ZXMsICAgICAgLyohPCBQb2ludGVyIHRvIGZpbHRlciBzdGF0ZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub0NvbHMsICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWUgc2xvdHMgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbHNiLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBsb3dlciBiYW5kcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzYiwgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdXBwZXIgYmFuZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19jaGFubmVscywgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGNyaXRpY2FsbHkgc2FtcGxlZCBiYW5kcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsgICAgICAgICAgICAgICAgICAgLyohPCBGbGFncyAqLwordm9pZCBxbWZTeW50aGVzaXNGaWx0ZXJpbmcoCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsICAgICAgIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAgKi8KKyAgICBGSVhQX0RCTCAqKlFtZkJ1ZmZlclJlYWwsICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHJlYWwgc3ViYmFuZCBzbG90cyAqLworICAgIEZJWFBfREJMICoqUW1mQnVmZmVySW1hZywgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gaW1hZyBzdWJiYW5kIHNsb3RzICovCisgICAgY29uc3QgUU1GX1NDQUxFX0ZBQ1RPUiAqc2NhbGVGYWN0b3IsIC8qITwgU2NhbGUgZmFjdG9ycyBvZiBRTUYgZGF0YSAgICAgKi8KKyAgICBjb25zdCBpbnQgb3ZfbGVuLCAgICAgICAgICAgICAgICAgICAgLyohPCBMZW5ndGggb2YgYmFuZCBvdmVybGFwICAgICAgICAqLworICAgIElOVF9QQ00gKnRpbWVPdXQsICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWUgc2lnbmFsICovCisgICAgY29uc3QgSU5UIHN0cmlkZSwgICAgICAgICAgICAgICAgICAgIC8qITwgU3RyaWRlIGZhY3RvciBvZiBhdWRpbyBkYXRhICAgKi8KKyAgICBGSVhQX0RCTCAqcFdvcmtCdWZmZXIgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFyeSB3b3JraW5nIGJ1ZmZlci4gSXQgbXVzdCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbmVkICovCispOwogCi12b2lkCi1xbWZBbmFseXNpc0ZpbHRlcmluZ1Nsb3QoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgYW5hUW1mLCAgLyohPCBIYW5kbGUgb2YgUW1mIFN5bnRoZXNpcyBCYW5rICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAgICAgICpxbWZSZWFsLCAgICAgICAgIC8qITwgTG93IGFuZCBIaWdoIGJhbmQsIHJlYWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgICAgICAqcW1mSW1hZywgICAgICAgICAvKiE8IExvdyBhbmQgSGlnaCBiYW5kLCBpbWFnICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVF9QQ00gKnRpbWVJbiwgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgIHN0cmlkZSwgICAgICAgICAgLyohPCBzdHJpZGUgZmFjdG9yIG9mIGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAgICAgKnBXb3JrQnVmZmVyICAgICAgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFsIHdvcmtpbmcgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgKTsKK2ludCBxbWZJbml0QW5hbHlzaXNGaWx0ZXJCYW5rKAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgaF9RbWYsIC8qITwgUU1GIEhhbmRsZSAqLworICAgIEZJWFBfUUFTICpwRmlsdGVyU3RhdGVzLCAgICAgIC8qITwgUG9pbnRlciB0byBmaWx0ZXIgc3RhdGUgYnVmZmVyICovCisgICAgaW50IG5vQ29scywgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZSBzbG90cyAgKi8KKyAgICBpbnQgbHNiLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBsb3dlciBiYW5kcyAqLworICAgIGludCB1c2IsICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHVwcGVyIGJhbmRzICovCisgICAgaW50IG5vX2NoYW5uZWxzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgY3JpdGljYWxseSBzYW1wbGVkIGJhbmRzICovCisgICAgaW50IGZsYWdzKTsgICAgICAgICAgICAgICAgICAgLyohPCBGbGFncyAqLwogCi1pbnQKLXFtZkluaXRTeW50aGVzaXNGaWx0ZXJCYW5rKCBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGhfUW1mLCAvKiE8IFFNRiBIYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FTUyAqcEZpbHRlclN0YXRlcywgICAgICAvKiE8IFBvaW50ZXIgdG8gZmlsdGVyIHN0YXRlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub0NvbHMsICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWUgc2xvdHMgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxzYiwgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgbG93ZXIgYmFuZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNiLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB1cHBlciBiYW5kcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19jaGFubmVscywgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGNyaXRpY2FsbHkgc2FtcGxlZCBiYW5kcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7ICAgICAgICAgICAgICAgICAgIC8qITwgRmxhZ3MgKi8KK3ZvaWQgcW1mQW5hbHlzaXNGaWx0ZXJpbmdTbG90KAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgYW5hUW1mLCAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgICovCisgICAgRklYUF9EQkwgKnFtZlJlYWwsICAgICAgICAgICAgIC8qITwgTG93IGFuZCBIaWdoIGJhbmQsIHJlYWwgKi8KKyAgICBGSVhQX0RCTCAqcW1mSW1hZywgICAgICAgICAgICAgLyohPCBMb3cgYW5kIEhpZ2ggYmFuZCwgaW1hZyAqLworICAgIGNvbnN0IExPTkcgKnRpbWVJbiwgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gaW5wdXQgKi8KKyAgICBjb25zdCBpbnQgc3RyaWRlLCAgICAgICAgICAgICAgLyohPCBzdHJpZGUgZmFjdG9yIG9mIGlucHV0ICovCisgICAgRklYUF9EQkwgKnBXb3JrQnVmZmVyICAgICAgICAgIC8qITwgcG9pbnRlciB0byB0ZW1wb3Jhcnkgd29ya2luZyBidWZmZXIgKi8KKyk7CiAKLXZvaWQgcW1mU3ludGhlc2lzRmlsdGVyaW5nU2xvdCggSEFORExFX1FNRl9GSUxURVJfQkFOSyAgc3luUW1mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1FNRiAqcmVhbFNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfUU1GICppbWFnU2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgIHNjYWxlRmFjdG9ySGlnaEJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgICp0aW1lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAgICAgICAqcFdvcmtCdWZmZXIpOwordm9pZCBxbWZBbmFseXNpc0ZpbHRlcmluZ1Nsb3QoCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBhbmFRbWYsIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAgKi8KKyAgICBGSVhQX0RCTCAqcW1mUmVhbCwgICAgICAgICAgICAgLyohPCBMb3cgYW5kIEhpZ2ggYmFuZCwgcmVhbCAqLworICAgIEZJWFBfREJMICpxbWZJbWFnLCAgICAgICAgICAgICAvKiE8IExvdyBhbmQgSGlnaCBiYW5kLCBpbWFnICovCisgICAgY29uc3QgSU5UX1BDTSAqdGltZUluLCAgICAgICAgIC8qITwgUG9pbnRlciB0byBpbnB1dCAqLworICAgIGNvbnN0IGludCBzdHJpZGUsICAgICAgICAgICAgICAvKiE8IHN0cmlkZSBmYWN0b3Igb2YgaW5wdXQgKi8KKyAgICBGSVhQX0RCTCAqcFdvcmtCdWZmZXIgICAgICAgICAgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFsIHdvcmtpbmcgYnVmZmVyICovCispOworaW50IHFtZkluaXRTeW50aGVzaXNGaWx0ZXJCYW5rKAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgaF9RbWYsIC8qITwgUU1GIEhhbmRsZSAqLworICAgIEZJWFBfUVNTICpwRmlsdGVyU3RhdGVzLCAgICAgIC8qITwgUG9pbnRlciB0byBmaWx0ZXIgc3RhdGUgYnVmZmVyICovCisgICAgaW50IG5vQ29scywgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZSBzbG90cyAgKi8KKyAgICBpbnQgbHNiLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBsb3dlciBiYW5kcyAqLworICAgIGludCB1c2IsICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHVwcGVyIGJhbmRzICovCisgICAgaW50IG5vX2NoYW5uZWxzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgY3JpdGljYWxseSBzYW1wbGVkIGJhbmRzICovCisgICAgaW50IGZsYWdzKTsgICAgICAgICAgICAgICAgICAgLyohPCBGbGFncyAqLwogCi12b2lkCi1xbWZDaGFuZ2VPdXRTY2FsZWZhY3RvciAoSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsICAgICAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0U2NhbGVmYWN0b3IgICAgICAgICAgICAgICAgIC8qITwgTmV3IHNjYWxpbmcgZmFjdG9yIGZvciBvdXRwdXQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKTsKK3ZvaWQgcW1mU3ludGhlc2lzRmlsdGVyaW5nU2xvdChIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHN5blFtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqcmVhbFNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmltYWdTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZUZhY3Rvckxvd0JhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNjYWxlRmFjdG9ySGlnaEJhbmQsIElOVF9QQ00gKnRpbWVPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbWVPdXRfZSwgRklYUF9EQkwgKnBXb3JrQnVmZmVyKTsKIAotdm9pZAotcW1mQ2hhbmdlT3V0R2FpbiAoSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsICAgICAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgKi8KLSAgICAgICAgICAgICAgICAgIEZJWFBfREJMIG91dHB1dEdhaW4gICAgICAgICAgICAgICAgLyohPCBOZXcgZ2FpbiBmb3Igb3V0cHV0IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgKTsKK3ZvaWQgcW1mQ2hhbmdlT3V0U2NhbGVmYWN0b3IoCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAqLworICAgIGludCBvdXRTY2FsZWZhY3RvciAgICAgICAgICAgICAvKiE8IE5ldyBzY2FsaW5nIGZhY3RvciBmb3Igb3V0cHV0IGRhdGEgKi8KKyk7CiAKK2ludCBxbWZHZXRPdXRTY2FsZWZhY3RvcigKKyAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHN5blFtZiAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgKi8KKyk7CiAKK3ZvaWQgcW1mQ2hhbmdlT3V0R2FpbigKKyAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHN5blFtZiwgLyohPCBIYW5kbGUgb2YgUW1mIFN5bnRoZXNpcyBCYW5rICovCisgICAgRklYUF9EQkwgb3V0cHV0R2FpbiwgICAgICAgICAgIC8qITwgTmV3IGdhaW4gZm9yIG91dHB1dCBkYXRhIChtYW50aXNzYSkgKi8KKyAgICBpbnQgb3V0cHV0R2FpblNjYWxlICAgICAgICAgICAgLyohPCBOZXcgZ2FpbiBmb3Igb3V0cHV0IGRhdGEgKGV4cG9uZW50KSAqLworKTsKK3ZvaWQgcW1mU3luUHJvdG90eXBlRmlyU2xvdCgKKyAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHFtZiwKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcmVhbFNsb3QsIC8qITwgSW5wdXQ6IFBvaW50ZXIgdG8gcmVhbCBTbG90ICovCisgICAgRklYUF9EQkwgKlJFU1RSSUNUIGltYWdTbG90LCAvKiE8IElucHV0OiBQb2ludGVyIHRvIGltYWcgU2xvdCAqLworICAgIElOVF9QQ00gKlJFU1RSSUNUIHRpbWVPdXQsICAgLyohPCBUaW1lIGRvbWFpbiBkYXRhICovCisgICAgY29uc3QgaW50IHRpbWVPdXRfZSk7CiAKLSNlbmRpZiAvKiBfX1FNRl9IICovCisjZW5kaWYgLyppZm5kZWYgUU1GX0ggICAgICAgKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL3FtZl9wY20uaCBiL2xpYkZESy9pbmNsdWRlL3FtZl9wY20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjRlMGNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliRkRLL2luY2x1ZGUvcW1mX3BjbS5oCkBAIC0wLDAgKzEsNDA1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXJrdXMgTG9od2Fzc2VyLCBKb3NlZiBIb2VwZmwsIE1hbnVlbCBKYW5kZXIKKworICAgRGVzY3JpcHRpb246IFFNRiBmaWx0ZXJiYW5rCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgUU1GX1BDTV9ICisjZGVmaW5lIFFNRl9QQ01fSAorCisvKgorICAgQWxsIFN5bnRoZXNpcyBmdW5jdGlvbnMgZGVwZW5kZW50IG9uIGRhdGF0eXBlIElOVF9QQ01fUU1GT1VUCisgICBTaG91bGQgb25seSBiZSBpbmNsdWRlZCBieSBxbWYuY3BwLCBidXQgbm90IGNvbXBpbGVkIHNlcGFyYXRlbHksIHBsZWFzZQorICAgZXhjbHVkZSBjb21waWxhdGlvbiBmcm9tIHByb2plY3QsIGlmIGRvbmUgb3RoZXJ3aXNlLiBJcyBvcHRpb25hbCBpbmNsdWRlZAorICAgdHdpY2UgdG8gZHVwbGljYXRlIGFsbCBmdW5jdGlvbnMgd2l0aCB0d28gZGlmZmVyZW50IHByZS1kZWZpbml0aW9ucywgYXM6CisgICAgICAgICNkZWZpbmUgSU5UX1BDTV9RTUZPVVQgTE9ORworICAgIGFuZCAuLi4KKyAgICAgICAgI2RlZmluZSBJTlRfUENNX1FNRk9VVCBTSE9SVAorICAgIG5lZWRlZCB0byBydW4gUU1GIHN5bnRoZXNpcyBpbiBib3RoIDE2Yml0IGFuZCAzMmJpdCBzYW1wbGUgb3V0cHV0IGZvcm1hdC4KKyovCisKKyNkZWZpbmUgUVNTQ0FMRSAoMCkKKyNkZWZpbmUgRlhfREJMMkZYX1FTUyh4KSAoeCkKKyNkZWZpbmUgRlhfUVNTMkZYX0RCTCh4KSAoeCkKKworLyohCisgIFxicmllZiBQZXJmb3JtIFN5bnRoZXNpcyBQcm90b3R5cGUgRmlsdGVyaW5nIG9uIGEgc2luZ2xlIHNsb3Qgb2YgaW5wdXQgZGF0YS4KKworICBUaGUgZmlsdGVyIHRha2VzIDIgKiBxbWYtPm5vX2NoYW5uZWxzIG9mIGlucHV0IGRhdGEgYW5kCisgIGdlbmVyYXRlcyBxbWYtPm5vX2NoYW5uZWxzIHRpbWUgZG9tYWluIG91dHB1dCBzYW1wbGVzLgorKi8KKy8qIHN0YXRpYyAqLworI2lmbmRlZiBGVU5DVElPTl9xbWZTeW5Qcm90b3R5cGVGaXJTbG90Cit2b2lkIHFtZlN5blByb3RvdHlwZUZpclNsb3QoCisjZWxzZQordm9pZCBxbWZTeW5Qcm90b3R5cGVGaXJTbG90X2ZhbGxiYWNrKAorI2VuZGlmCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBxbWYsCisgICAgRklYUF9EQkwgKlJFU1RSSUNUIHJlYWxTbG90LCAgICAgIC8qITwgSW5wdXQ6IFBvaW50ZXIgdG8gcmVhbCBTbG90ICovCisgICAgRklYUF9EQkwgKlJFU1RSSUNUIGltYWdTbG90LCAgICAgIC8qITwgSW5wdXQ6IFBvaW50ZXIgdG8gaW1hZyBTbG90ICovCisgICAgSU5UX1BDTV9RTUZPVVQgKlJFU1RSSUNUIHRpbWVPdXQsIC8qITwgVGltZSBkb21haW4gZGF0YSAqLworICAgIGludCBzdHJpZGUpIHsKKyAgRklYUF9RU1MgKkZpbHRlclN0YXRlcyA9IChGSVhQX1FTUyAqKXFtZi0+RmlsdGVyU3RhdGVzOworICBpbnQgbm9fY2hhbm5lbHMgPSBxbWYtPm5vX2NoYW5uZWxzOworICBjb25zdCBGSVhQX1BGVCAqcF9GaWx0ZXIgPSBxbWYtPnBfZmlsdGVyOworICBpbnQgcF9zdHJpZGUgPSBxbWYtPnBfc3RyaWRlOworICBpbnQgajsKKyAgRklYUF9RU1MgKlJFU1RSSUNUIHN0YSA9IEZpbHRlclN0YXRlczsKKyAgY29uc3QgRklYUF9QRlQgKlJFU1RSSUNUIHBfZmx0LCAqUkVTVFJJQ1QgcF9mbHRtOworICBpbnQgc2NhbGUgPSAoREZSQUNUX0JJVFMgLSBTQU1QTEVfQklUU19RTUZPVVQpIC0gMSAtIHFtZi0+b3V0U2NhbGVmYWN0b3IgLQorICAgICAgICAgICAgICBxbWYtPm91dEdhaW5fZTsKKworICBwX2ZsdCA9CisgICAgICBwX0ZpbHRlciArIHBfc3RyaWRlICogUU1GX05PX1BPTFk7IC8qICAgICAgICAgICAgICAgICAgICAgNXRoIG9mIDMzMCAqLworICBwX2ZsdG0gPSBwX0ZpbHRlciArIChxbWYtPkZpbHRlclNpemUgLyAyKSAtCisgICAgICAgICAgIHBfc3RyaWRlICogUU1GX05PX1BPTFk7IC8qIDUgKyAoMzIwIC0gMio1KSA9IDMxNXRoIG9mIDMzMCAqLworCisgIEZJWFBfU0dMIGdhaW4gPSBGWF9EQkwyRlhfU0dMKHFtZi0+b3V0R2Fpbl9tKTsKKworICBGSVhQX0RCTCBybmRfdmFsID0gMDsKKworICBpZiAoc2NhbGUgPiAwKSB7CisgICAgaWYgKHNjYWxlIDwgKERGUkFDVF9CSVRTIC0gMSkpCisgICAgICBybmRfdmFsID0gRklYUF9EQkwoMSA8PCAoc2NhbGUgLSAxKSk7CisgICAgZWxzZQorICAgICAgc2NhbGUgPSAoREZSQUNUX0JJVFMgLSAxKTsKKyAgfSBlbHNlIHsKKyAgICBzY2FsZSA9IGZNYXgoc2NhbGUsIC0oREZSQUNUX0JJVFMgLSAxKSk7CisgIH0KKworICBmb3IgKGogPSBub19jaGFubmVscyAtIDE7IGogPj0gMDsgai0tKSB7CisgICAgRklYUF9EQkwgaW1hZyA9IGltYWdTbG90W2pdOyAvKiBub19jaGFubmVscy0xIC4uIDAgKi8KKyAgICBGSVhQX0RCTCByZWFsID0gcmVhbFNsb3Rbal07IC8qIG5vX2NoYW5uZWxzLTEgLi4gMCAqLworICAgIHsKKyAgICAgIElOVF9QQ01fUU1GT1VUIHRtcDsKKyAgICAgIEZJWFBfREJMIEFyZSA9IGZNdWx0QWRkRGl2MihGWF9RU1MyRlhfREJMKHN0YVswXSksIHBfZmx0bVswXSwgcmVhbCk7CisKKyAgICAgIC8qIFRoaXMgUENNIGZvcm1hdHRpbmcgcGVyZm9ybXM6CisgICAgICAgICAtIG11bHRpcGxpY2F0aW9uIHdpdGggMTYtYml0IGdhaW4sIGlmIG5vdCAtMS4wZgorICAgICAgICAgLSByb3VuZGluZywgaWYgc2hpZnQgcmlnaHQgaXMgYXBwbGllZAorICAgICAgICAgLSBhcHBseSBzaGlmdCBsZWZ0IChvciByaWdodCkgd2l0aCBzYXR1cmF0aW9uIHRvIDMyIChvciAxNikgYml0cworICAgICAgICAgLSBzdG9yZSBvdXRwdXQgd2l0aCAtLXN0cmlkZSBpbiAzMiAob3IgMTYpIGJpdCBmb3JtYXQKKyAgICAgICovCisgICAgICBpZiAoZ2FpbiAhPSAoRklYUF9TR0wpKC0zMjc2OCkpIC8qIC0xLjBmICovCisgICAgICB7CisgICAgICAgIEFyZSA9IGZNdWx0KEFyZSwgZ2Fpbik7CisgICAgICB9CisgICAgICBpZiAoc2NhbGUgPj0gMCkgeworICAgICAgICBGREtfQVNTRVJUKAorICAgICAgICAgICAgQXJlIDw9CisgICAgICAgICAgICAoQXJlICsgcm5kX3ZhbCkpOyAvKiBSb3VuZC1hZGRpdGlvbiBtdXN0IG5vdCBvdmVyZmxvdywgbWlnaHQgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFsIGZvciBybmRfdmFsPTAgKi8KKyAgICAgICAgdG1wID0gKElOVF9QQ01fUU1GT1VUKSgKKyAgICAgICAgICAgIFNBVFVSQVRFX1JJR0hUX1NISUZUKEFyZSArIHJuZF92YWwsIHNjYWxlLCBTQU1QTEVfQklUU19RTUZPVVQpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRtcCA9IChJTlRfUENNX1FNRk9VVCkoCisgICAgICAgICAgICBTQVRVUkFURV9MRUZUX1NISUZUKEFyZSwgLXNjYWxlLCBTQU1QTEVfQklUU19RTUZPVVQpKTsKKyAgICAgIH0KKworICAgICAgeyB0aW1lT3V0WyhqKSpzdHJpZGVdID0gdG1wOyB9CisgICAgfQorCisgICAgc3RhWzBdID0gRlhfREJMMkZYX1FTUyhmTXVsdEFkZERpdjIoRlhfUVNTMkZYX0RCTChzdGFbMV0pLCBwX2ZsdFs0XSwgaW1hZykpOworICAgIHN0YVsxXSA9CisgICAgICAgIEZYX0RCTDJGWF9RU1MoZk11bHRBZGREaXYyKEZYX1FTUzJGWF9EQkwoc3RhWzJdKSwgcF9mbHRtWzFdLCByZWFsKSk7CisgICAgc3RhWzJdID0gRlhfREJMMkZYX1FTUyhmTXVsdEFkZERpdjIoRlhfUVNTMkZYX0RCTChzdGFbM10pLCBwX2ZsdFszXSwgaW1hZykpOworICAgIHN0YVszXSA9CisgICAgICAgIEZYX0RCTDJGWF9RU1MoZk11bHRBZGREaXYyKEZYX1FTUzJGWF9EQkwoc3RhWzRdKSwgcF9mbHRtWzJdLCByZWFsKSk7CisgICAgc3RhWzRdID0gRlhfREJMMkZYX1FTUyhmTXVsdEFkZERpdjIoRlhfUVNTMkZYX0RCTChzdGFbNV0pLCBwX2ZsdFsyXSwgaW1hZykpOworICAgIHN0YVs1XSA9CisgICAgICAgIEZYX0RCTDJGWF9RU1MoZk11bHRBZGREaXYyKEZYX1FTUzJGWF9EQkwoc3RhWzZdKSwgcF9mbHRtWzNdLCByZWFsKSk7CisgICAgc3RhWzZdID0gRlhfREJMMkZYX1FTUyhmTXVsdEFkZERpdjIoRlhfUVNTMkZYX0RCTChzdGFbN10pLCBwX2ZsdFsxXSwgaW1hZykpOworICAgIHN0YVs3XSA9CisgICAgICAgIEZYX0RCTDJGWF9RU1MoZk11bHRBZGREaXYyKEZYX1FTUzJGWF9EQkwoc3RhWzhdKSwgcF9mbHRtWzRdLCByZWFsKSk7CisgICAgc3RhWzhdID0gRlhfREJMMkZYX1FTUyhmTXVsdERpdjIocF9mbHRbMF0sIGltYWcpKTsKKyAgICBwX2ZsdCArPSAocF9zdHJpZGUgKiBRTUZfTk9fUE9MWSk7CisgICAgcF9mbHRtIC09IChwX3N0cmlkZSAqIFFNRl9OT19QT0xZKTsKKyAgICBzdGEgKz0gOTsgIC8vID0gKDIqUU1GX05PX1BPTFktMSk7CisgIH0KK30KKworI2lmbmRlZiBGVU5DVElPTl9xbWZTeW5Qcm90b3R5cGVGaXJTbG90X05vblN5bW1ldHJpYworLyohCisgIFxicmllZiBQZXJmb3JtIFN5bnRoZXNpcyBQcm90b3R5cGUgRmlsdGVyaW5nIG9uIGEgc2luZ2xlIHNsb3Qgb2YgaW5wdXQgZGF0YS4KKworICBUaGUgZmlsdGVyIHRha2VzIDIgKiBxbWYtPm5vX2NoYW5uZWxzIG9mIGlucHV0IGRhdGEgYW5kCisgIGdlbmVyYXRlcyBxbWYtPm5vX2NoYW5uZWxzIHRpbWUgZG9tYWluIG91dHB1dCBzYW1wbGVzLgorKi8KK3N0YXRpYyB2b2lkIHFtZlN5blByb3RvdHlwZUZpclNsb3RfTm9uU3ltbWV0cmljKAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgcW1mLAorICAgIEZJWFBfREJMICpSRVNUUklDVCByZWFsU2xvdCwgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIHJlYWwgU2xvdCAqLworICAgIEZJWFBfREJMICpSRVNUUklDVCBpbWFnU2xvdCwgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIGltYWcgU2xvdCAqLworICAgIElOVF9QQ01fUU1GT1VUICpSRVNUUklDVCB0aW1lT3V0LCAvKiE8IFRpbWUgZG9tYWluIGRhdGEgKi8KKyAgICBpbnQgc3RyaWRlKSB7CisgIEZJWFBfUVNTICpGaWx0ZXJTdGF0ZXMgPSAoRklYUF9RU1MgKilxbWYtPkZpbHRlclN0YXRlczsKKyAgaW50IG5vX2NoYW5uZWxzID0gcW1mLT5ub19jaGFubmVsczsKKyAgY29uc3QgRklYUF9QRlQgKnBfRmlsdGVyID0gcW1mLT5wX2ZpbHRlcjsKKyAgaW50IHBfc3RyaWRlID0gcW1mLT5wX3N0cmlkZTsKKyAgaW50IGo7CisgIEZJWFBfUVNTICpSRVNUUklDVCBzdGEgPSBGaWx0ZXJTdGF0ZXM7CisgIGNvbnN0IEZJWFBfUEZUICpSRVNUUklDVCBwX2ZsdCwgKlJFU1RSSUNUIHBfZmx0bTsKKyAgaW50IHNjYWxlID0gKERGUkFDVF9CSVRTIC0gU0FNUExFX0JJVFNfUU1GT1VUKSAtIDEgLSBxbWYtPm91dFNjYWxlZmFjdG9yIC0KKyAgICAgICAgICAgICAgcW1mLT5vdXRHYWluX2U7CisKKyAgcF9mbHQgPSBwX0ZpbHRlcjsgLyohPCBQb2ludGVyIHRvIGZpcnN0IGhhbGYgb2YgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworICBwX2ZsdG0gPQorICAgICAgJnBfZmx0W3FtZi0+RmlsdGVyU2l6ZSAvIDJdOyAvKiBhdCBpbmRleCAzMjAsIG92ZXJhbGwgNjQwIGNvZWZmaWNpZW50cyAqLworCisgIEZJWFBfU0dMIGdhaW4gPSBGWF9EQkwyRlhfU0dMKHFtZi0+b3V0R2Fpbl9tKTsKKworICBGSVhQX0RCTCBybmRfdmFsID0gKEZJWFBfREJMKTA7CisKKyAgaWYgKHNjYWxlID4gMCkgeworICAgIGlmIChzY2FsZSA8IChERlJBQ1RfQklUUyAtIDEpKQorICAgICAgcm5kX3ZhbCA9IEZJWFBfREJMKDEgPDwgKHNjYWxlIC0gMSkpOworICAgIGVsc2UKKyAgICAgIHNjYWxlID0gKERGUkFDVF9CSVRTIC0gMSk7CisgIH0gZWxzZSB7CisgICAgc2NhbGUgPSBmTWF4KHNjYWxlLCAtKERGUkFDVF9CSVRTIC0gMSkpOworICB9CisKKyAgZm9yIChqID0gbm9fY2hhbm5lbHMgLSAxOyBqID49IDA7IGotLSkgeworICAgIEZJWFBfREJMIGltYWcgPSBpbWFnU2xvdFtqXTsgLyogbm9fY2hhbm5lbHMtMSAuLiAwICovCisgICAgRklYUF9EQkwgcmVhbCA9IHJlYWxTbG90W2pdOyAvKiBub19jaGFubmVscy0xIC4uIDAgKi8KKyAgICB7CisgICAgICBJTlRfUENNX1FNRk9VVCB0bXA7CisgICAgICBGSVhQX0RCTCBBcmUgPSBzdGFbMF0gKyBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MihwX2ZsdG1bNF0sIHJlYWwpKTsKKworICAgICAgLyogVGhpcyBQQ00gZm9ybWF0dGluZyBwZXJmb3JtczoKKyAgICAgICAgIC0gbXVsdGlwbGljYXRpb24gd2l0aCAxNi1iaXQgZ2FpbiwgaWYgbm90IC0xLjBmCisgICAgICAgICAtIHJvdW5kaW5nLCBpZiBzaGlmdCByaWdodCBpcyBhcHBsaWVkCisgICAgICAgICAtIGFwcGx5IHNoaWZ0IGxlZnQgKG9yIHJpZ2h0KSB3aXRoIHNhdHVyYXRpb24gdG8gMzIgKG9yIDE2KSBiaXRzCisgICAgICAgICAtIHN0b3JlIG91dHB1dCB3aXRoIC0tc3RyaWRlIGluIDMyIChvciAxNikgYml0IGZvcm1hdAorICAgICAgKi8KKyAgICAgIGlmIChnYWluICE9IChGSVhQX1NHTCkoLTMyNzY4KSkgLyogLTEuMGYgKi8KKyAgICAgIHsKKyAgICAgICAgQXJlID0gZk11bHQoQXJlLCBnYWluKTsKKyAgICAgIH0KKyAgICAgIGlmIChzY2FsZSA+IDApIHsKKyAgICAgICAgRkRLX0FTU0VSVChBcmUgPAorICAgICAgICAgICAgICAgICAgIChBcmUgKyBybmRfdmFsKSk7IC8qIFJvdW5kLWFkZGl0aW9uIG11c3Qgbm90IG92ZXJmbG93ICovCisgICAgICAgIHRtcCA9IChJTlRfUENNX1FNRk9VVCkoCisgICAgICAgICAgICBTQVRVUkFURV9SSUdIVF9TSElGVChBcmUgKyBybmRfdmFsLCBzY2FsZSwgU0FNUExFX0JJVFNfUU1GT1VUKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0bXAgPSAoSU5UX1BDTV9RTUZPVVQpKAorICAgICAgICAgICAgU0FUVVJBVEVfTEVGVF9TSElGVChBcmUsIC1zY2FsZSwgU0FNUExFX0JJVFNfUU1GT1VUKSk7CisgICAgICB9CisgICAgICB0aW1lT3V0W2ogKiBzdHJpZGVdID0gdG1wOworICAgIH0KKworICAgIHN0YVswXSA9IHN0YVsxXSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKHBfZmx0WzRdLCBpbWFnKSk7CisgICAgc3RhWzFdID0gc3RhWzJdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIocF9mbHRtWzNdLCByZWFsKSk7CisgICAgc3RhWzJdID0gc3RhWzNdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIocF9mbHRbM10sIGltYWcpKTsKKworICAgIHN0YVszXSA9IHN0YVs0XSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKHBfZmx0bVsyXSwgcmVhbCkpOworICAgIHN0YVs0XSA9IHN0YVs1XSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKHBfZmx0WzJdLCBpbWFnKSk7CisgICAgc3RhWzVdID0gc3RhWzZdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIocF9mbHRtWzFdLCByZWFsKSk7CisgICAgc3RhWzZdID0gc3RhWzddICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIocF9mbHRbMV0sIGltYWcpKTsKKworICAgIHN0YVs3XSA9IHN0YVs4XSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKHBfZmx0bVswXSwgcmVhbCkpOworICAgIHN0YVs4XSA9IEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKHBfZmx0WzBdLCBpbWFnKSk7CisKKyAgICBwX2ZsdCArPSAocF9zdHJpZGUgKiBRTUZfTk9fUE9MWSk7CisgICAgcF9mbHRtICs9IChwX3N0cmlkZSAqIFFNRl9OT19QT0xZKTsKKyAgICBzdGEgKz0gOTsgIC8vID0gKDIqUU1GX05PX1BPTFktMSk7CisgIH0KK30KKyNlbmRpZiAvKiBGVU5DVElPTl9xbWZTeW5Qcm90b3R5cGVGaXJTbG90X05vblN5bW1ldHJpYyAqLworCit2b2lkIHFtZlN5bnRoZXNpc0ZpbHRlcmluZ1Nsb3QoSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnJlYWxTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICppbWFnU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JMb3dCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZUZhY3RvckhpZ2hCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ01fUU1GT1VUICp0aW1lT3V0LCBjb25zdCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwV29ya0J1ZmZlcikgeworICBpZiAoIShzeW5RbWYtPmZsYWdzICYgUU1GX0ZMQUdfTFApKQorICAgIHFtZkludmVyc2VNb2R1bGF0aW9uSFEoc3luUW1mLCByZWFsU2xvdCwgaW1hZ1Nsb3QsIHNjYWxlRmFjdG9yTG93QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9ySGlnaEJhbmQsIHBXb3JrQnVmZmVyKTsKKyAgZWxzZSB7CisgICAgaWYgKHN5blFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19DTERGQikgeworICAgICAgcW1mSW52ZXJzZU1vZHVsYXRpb25MUF9vZGQoc3luUW1mLCByZWFsU2xvdCwgc2NhbGVGYWN0b3JMb3dCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JIaWdoQmFuZCwgcFdvcmtCdWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICBxbWZJbnZlcnNlTW9kdWxhdGlvbkxQX2V2ZW4oc3luUW1mLCByZWFsU2xvdCwgc2NhbGVGYWN0b3JMb3dCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9ySGlnaEJhbmQsIHBXb3JrQnVmZmVyKTsKKyAgICB9CisgIH0KKworICBpZiAoc3luUW1mLT5mbGFncyAmIFFNRl9GTEFHX05PTlNZTU1FVFJJQykgeworICAgIHFtZlN5blByb3RvdHlwZUZpclNsb3RfTm9uU3ltbWV0cmljKHN5blFtZiwgcFdvcmtCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIgKyBzeW5RbWYtPm5vX2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVPdXQsIHN0cmlkZSk7CisgIH0gZWxzZSB7CisgICAgcW1mU3luUHJvdG90eXBlRmlyU2xvdChzeW5RbWYsIHBXb3JrQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIgKyBzeW5RbWYtPm5vX2NoYW5uZWxzLCB0aW1lT3V0LCBzdHJpZGUpOworICB9Cit9CisKKy8qIQorICoKKyAqIFxicmllZiBQZXJmb3JtIGNvbXBsZXgtdmFsdWVkIHN1YmJhbmQgc3ludGhlc2lzIG9mIHRoZQorICogICAgICAgIGxvdyBiYW5kIGFuZCB0aGUgaGlnaCBiYW5kIGFuZCBzdG9yZSB0aGUKKyAqICAgICAgICB0aW1lIGRvbWFpbiBkYXRhIGluIHRpbWVPdXQKKyAqCisgKiBGaXJzdCBzdGVwOiBDYWxjdWxhdGUgdGhlIHByb3BlciBzY2FsaW5nIGZhY3RvciBvZiBjdXJyZW50CisgKiBzcGVjdHJhbCBkYXRhIGluIHFtZlJlYWwvcW1mSW1hZywgb2xkIHNwZWN0cmFsIGRhdGEgaW4gdGhlIG92ZXJsYXAKKyAqIHJhbmdlIGFuZCBmaWx0ZXIgc3RhdGVzLgorICoKKyAqIFNlY29uZCBzdGVwOiBQZXJmb3JtIEZyZXF1ZW5jeS10by1UaW1lIG1hcHBpbmcgd2l0aCBpbnZlcnNlCisgKiBNb2R1bGF0aW9uIHNsb3Qtd2lzZS4KKyAqCisgKiBUaGlyZCBzdGVwOiBQZXJmb3JtIEZJUi1maWx0ZXIgc2xvdC13aXNlLiBUbyBzYXZlIHNwYWNlIGZvciBmaWx0ZXIKKyAqIHN0YXRlcywgdGhlIE1BQyBvcGVyYXRpb25zIGFyZSBleGVjdXRlZCBkaXJlY3RseSBvbiB0aGUgZmlsdGVyIHN0YXRlcworICogaW5zdGVhZCBvZiBhY2N1bXVsYXRpbmcgc2V2ZXJhbCBwcm9kdWN0cyBpbiB0aGUgYWNjdW11bGF0b3IuIFRoZQorICogYnVmZmVyIHNoaWZ0IGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSByZXBsYWNlZCBieSBhCisgKiBtb2R1bG8gb3BlcmF0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgb24gc29tZSBEU1BzLgorICoKKyAqIExhc3Qgc3RlcDogQ29weSB0aGUgdXBwZXIgcGFydCBvZiB0aGUgc3BlY3RyYWwgZGF0YSB0byB0aGUgb3ZlcmxhcCBidWZmZXIuCisgKgorICogVGhlIHFtZiBjb2VmZmljaWVudCB0YWJsZSBpcyBzeW1tZXRyaWMuIFRoZSBzeW1tZXRyeSBpcyBleHBsb2l0ZWQgYnkKKyAqIHNocmlua2luZyB0aGUgY29lZmZpY2llbnQgdGFibGUgdG8gaGFsZiB0aGUgc2l6ZS4gVGhlIGFkZHJlc3NpbmcgbW9kZQorICogdGFrZXMgY2FyZSBvZiB0aGUgc3ltbWV0cmllcy4gIElmIHRoZSAjZGVmaW5lICNRTUZUQUJMRV9GVUxMIGlzIHNldCwKKyAqIGNvZWZmaWNpZW50IGFkZHJlc3Npbmcgd29ya3Mgb24gdGhlIGZ1bGwgdGFibGUgc2l6ZS4gVGhlIGNvZGUgd2lsbCBiZQorICogc2xpZ2h0bHkgZmFzdGVyIGFuZCBzbGlnaHRseSBtb3JlIGNvbXBhY3QuCisgKgorICogV29ya2J1ZmZlciByZXF1aXJlbWVudDogMiB4IHNpemVvZigqKlFtZkJ1ZmZlclJlYWwpICogc3luUW1mLT5ub19jaGFubmVscworICogVGhlIHdvcmtidWZmZXIgbXVzdCBiZSBhbGlnbmVkCisgKi8KK3ZvaWQgcW1mU3ludGhlc2lzRmlsdGVyaW5nKAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mLCAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgICovCisgICAgRklYUF9EQkwgKipRbWZCdWZmZXJSZWFsLCAgICAgIC8qITwgTG93IGFuZCBIaWdoIGJhbmQsIHJlYWwgKi8KKyAgICBGSVhQX0RCTCAqKlFtZkJ1ZmZlckltYWcsICAgICAgLyohPCBMb3cgYW5kIEhpZ2ggYmFuZCwgaW1hZyAqLworICAgIGNvbnN0IFFNRl9TQ0FMRV9GQUNUT1IgKnNjYWxlRmFjdG9yLAorICAgIGNvbnN0IElOVCBvdl9sZW4sICAgICAgICAvKiE8IHNwbGl0IFNsb3Qgb2Ygb3ZlcmxhcCBhbmQgYWN0dWFsIHNsb3RzICovCisgICAgSU5UX1BDTV9RTUZPVVQgKnRpbWVPdXQsIC8qITwgUG9pbnRlciB0byBvdXRwdXQgKi8KKyAgICBjb25zdCBJTlQgc3RyaWRlLCAgICAgICAgLyohPCBzdHJpZGUgZmFjdG9yIG9mIG91dHB1dCAqLworICAgIEZJWFBfREJMICpwV29ya0J1ZmZlciAgICAvKiE8IHBvaW50ZXIgdG8gdGVtcG9yYWwgd29ya2luZyBidWZmZXIgKi8KKykgeworICBpbnQgaTsKKyAgaW50IEwgPSBzeW5RbWYtPm5vX2NoYW5uZWxzOworICBpbnQgc2NhbGVGYWN0b3JIaWdoQmFuZDsKKyAgaW50IHNjYWxlRmFjdG9yTG93QmFuZF9vdiwgc2NhbGVGYWN0b3JMb3dCYW5kX25vX292OworCisgIEZES19BU1NFUlQoc3luUW1mLT5ub19jaGFubmVscyA+PSBzeW5RbWYtPmxzYik7CisgIEZES19BU1NFUlQoc3luUW1mLT5ub19jaGFubmVscyA+PSBzeW5RbWYtPnVzYik7CisKKyAgLyogYWRhcHQgc2NhbGluZyAqLworICBzY2FsZUZhY3RvckhpZ2hCYW5kID0gLUFMR09SSVRITUlDX1NDQUxJTkdfSU5fQU5BTFlTSVNfRklMVEVSQkFOSyAtCisgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3Rvci0+aGJfc2NhbGUgLSBzeW5RbWYtPmZpbHRlclNjYWxlOworICBzY2FsZUZhY3Rvckxvd0JhbmRfb3YgPSAtQUxHT1JJVEhNSUNfU0NBTElOR19JTl9BTkFMWVNJU19GSUxURVJCQU5LIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3ItPm92X2xiX3NjYWxlIC0gc3luUW1mLT5maWx0ZXJTY2FsZTsKKyAgc2NhbGVGYWN0b3JMb3dCYW5kX25vX292ID0gLUFMR09SSVRITUlDX1NDQUxJTkdfSU5fQU5BTFlTSVNfRklMVEVSQkFOSyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9yLT5sYl9zY2FsZSAtIHN5blFtZi0+ZmlsdGVyU2NhbGU7CisKKyAgZm9yIChpID0gMDsgaSA8IHN5blFtZi0+bm9fY29sOyBpKyspIC8qIC0tLS0tIG5vX2NvbCBsb29wIC0tLS0tICovCisgIHsKKyAgICBjb25zdCBGSVhQX0RCTCAqUW1mQnVmZmVySW1hZ1Nsb3QgPSBOVUxMOworCisgICAgaW50IHNjYWxlRmFjdG9yTG93QmFuZCA9CisgICAgICAgIChpIDwgb3ZfbGVuKSA/IHNjYWxlRmFjdG9yTG93QmFuZF9vdiA6IHNjYWxlRmFjdG9yTG93QmFuZF9ub19vdjsKKworICAgIGlmICghKHN5blFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19MUCkpIFFtZkJ1ZmZlckltYWdTbG90ID0gUW1mQnVmZmVySW1hZ1tpXTsKKworICAgIHFtZlN5bnRoZXNpc0ZpbHRlcmluZ1Nsb3Qoc3luUW1mLCBRbWZCdWZmZXJSZWFsW2ldLCBRbWZCdWZmZXJJbWFnU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZCwgc2NhbGVGYWN0b3JIaWdoQmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVPdXQgKyAoaSAqIEwgKiBzdHJpZGUpLCBzdHJpZGUsIHBXb3JrQnVmZmVyKTsKKyAgfSAvKiBub19jb2wgbG9vcCAgaSAgKi8KK30KKyNlbmRpZiAvKiBRTUZfUENNX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL3NjYWxlLmggYi9saWJGREsvaW5jbHVkZS9zY2FsZS5oCmluZGV4IDE1ODdmOWYuLjA3YmQzYWYgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL3NjYWxlLmgKKysrIGIvbGliRkRLL2luY2x1ZGUvc2NhbGUuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKKwogICAgRGVzY3JpcHRpb246IFNjYWxpbmcgb3BlcmF0aW9ucwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIFNDQUxFX0gKICNkZWZpbmUgU0NBTEVfSApAQCAtOTUsMTkgKzEwNyw0MSBAQAogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAjaW5jbHVkZSAiZml4bWlubWF4LmgiCiAKLSAgI2RlZmluZSBTQ0FMRV9JTkxJTkUgaW5saW5lCisjZGVmaW5lIFNDQUxFX0lOTElORQogCisjaWYgZGVmaW5lZChfX2FybV9fKQorI2luY2x1ZGUgImFybS9zY2FsZV9hcm0uaCIKIAotI2lmIGRlZmluZWQoX19hcm1fXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwotI2luY2x1ZGUgImFybS9zY2FsZS5oIgotCi0jZWxpZiBkZWZpbmVkKF9fbWlwc19fKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCi0jaW5jbHVkZSAibWlwcy9zY2FsZS5oIgorI2VsaWYgZGVmaW5lZChfX21pcHNfXykKKyNpbmNsdWRlICJtaXBzL3NjYWxlX21pcHMuaCIKIAogI2VuZGlmCiAKLQotI2luY2x1ZGUgIi4uL3NyYy9zY2FsZS5jcHAiCit2b2lkIHNjYWxlVmFsdWVzKEZJWFBfU0dMICp2ZWN0b3IsIElOVCBsZW4sIElOVCBzY2FsZWZhY3Rvcik7Cit2b2lkIHNjYWxlVmFsdWVzKEZJWFBfREJMICp2ZWN0b3IsIElOVCBsZW4sIElOVCBzY2FsZWZhY3Rvcik7Cit2b2lkIHNjYWxlVmFsdWVzKEZJWFBfREJMICpkc3QsIGNvbnN0IEZJWFBfREJMICpzcmMsIElOVCBsZW4sIElOVCBzY2FsZWZhY3Rvcik7CisjaWYgKFNBTVBMRV9CSVRTID09IDE2KQordm9pZCBzY2FsZVZhbHVlcyhGSVhQX1BDTSAqZHN0LCBjb25zdCBGSVhQX0RCTCAqc3JjLCBJTlQgbGVuLCBJTlQgc2NhbGVmYWN0b3IpOworI2VuZGlmCit2b2lkIHNjYWxlVmFsdWVzKEZJWFBfUENNICpkc3QsIGNvbnN0IEZJWFBfU0dMICpzcmMsIElOVCBsZW4sIElOVCBzY2FsZWZhY3Rvcik7Cit2b2lkIHNjYWxlQ3BseFZhbHVlcyhGSVhQX0RCTCAqcl9kc3QsIEZJWFBfREJMICppX2RzdCwgY29uc3QgRklYUF9EQkwgKnJfc3JjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmlfc3JjLCBJTlQgbGVuLCBJTlQgc2NhbGVmYWN0b3IpOwordm9pZCBzY2FsZVZhbHVlc1dpdGhGYWN0b3IoRklYUF9EQkwgKnZlY3RvciwgRklYUF9EQkwgZmFjdG9yLCBJTlQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNjYWxlZmFjdG9yKTsKK3ZvaWQgc2NhbGVWYWx1ZXNTYXR1cmF0ZShGSVhQX0RCTCAqdmVjdG9yLCBJTlQgbGVuLCBJTlQgc2NhbGVmYWN0b3IpOwordm9pZCBzY2FsZVZhbHVlc1NhdHVyYXRlKEZJWFBfREJMICpkc3QsIEZJWFBfREJMICpzcmMsIElOVCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNjYWxlZmFjdG9yKTsKK3ZvaWQgc2NhbGVWYWx1ZXNTYXR1cmF0ZShGSVhQX1NHTCAqZHN0LCBGSVhQX0RCTCAqc3JjLCBJTlQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzY2FsZWZhY3Rvcik7Cit2b2lkIHNjYWxlVmFsdWVzU2F0dXJhdGUoSU5UX1BDTSAqZHN0LCBGSVhQX0RCTCAqc3JjLCBJTlQgbGVuLCBJTlQgc2NhbGVmYWN0b3IpOwordm9pZCBzY2FsZVZhbHVlc1NhdHVyYXRlKEZJWFBfU0dMICp2ZWN0b3IsIElOVCBsZW4sIElOVCBzY2FsZWZhY3Rvcik7Cit2b2lkIHNjYWxlVmFsdWVzU2F0dXJhdGUoRklYUF9TR0wgKmRzdCwgRklYUF9TR0wgKnNyYywgSU5UIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IpOwordm9pZCBzY2FsZVZhbHVlc1NhdHVyYXRlKElOVF9QQ00gKmRzdCwgSU5UX1BDTSAqc3JjLCBJTlQgbGVuLCBJTlQgc2NhbGVmYWN0b3IpOworSU5UIGdldFNjYWxlZmFjdG9yU2hvcnQoY29uc3QgU0hPUlQgKnZlY3RvciwgSU5UIGxlbik7CitJTlQgZ2V0U2NhbGVmYWN0b3JQQ00oY29uc3QgSU5UX1BDTSAqdmVjdG9yLCBJTlQgbGVuLCBJTlQgc3RyaWRlKTsKK0lOVCBnZXRTY2FsZWZhY3Rvcihjb25zdCBGSVhQX0RCTCAqdmVjdG9yLCBJTlQgbGVuKTsKK0lOVCBnZXRTY2FsZWZhY3Rvcihjb25zdCBGSVhQX1NHTCAqdmVjdG9yLCBJTlQgbGVuKTsKIAogI2lmbmRlZiBGVU5DVElPTl9zY2FsZVZhbHVlCiAvKiEKQEAgLTExOCwxNSArMTUyLDIxIEBACiAgKgogICovCiAjZGVmaW5lIEZVTkNUSU9OX3NjYWxlVmFsdWUKLWlubGluZQotRklYUF9EQkwgc2NhbGVWYWx1ZShjb25zdCBGSVhQX0RCTCB2YWx1ZSwgLyohPCBWYWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgICAvKiE8IFNjYWxlZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgKQotewotICBpZihzY2FsZWZhY3RvciA+IDApCi0gICAgcmV0dXJuICh2YWx1ZTw8c2NhbGVmYWN0b3IpOworaW5saW5lIEZJWFBfREJMIHNjYWxlVmFsdWUoY29uc3QgRklYUF9EQkwgdmFsdWUsIC8qITwgVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzY2FsZWZhY3RvciAgICAgICAvKiE8IFNjYWxlZmFjdG9yICovCispIHsKKyAgaWYgKHNjYWxlZmFjdG9yID4gMCkKKyAgICByZXR1cm4gKHZhbHVlIDw8IHNjYWxlZmFjdG9yKTsKICAgZWxzZQotICAgIHJldHVybiAodmFsdWU+Pigtc2NhbGVmYWN0b3IpKTsKKyAgICByZXR1cm4gKHZhbHVlID4+ICgtc2NhbGVmYWN0b3IpKTsKK30KK2lubGluZSBGSVhQX1NHTCBzY2FsZVZhbHVlKGNvbnN0IEZJWFBfU0dMIHZhbHVlLCAvKiE8IFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgICAgICAgLyohPCBTY2FsZWZhY3RvciAqLworKSB7CisgIGlmIChzY2FsZWZhY3RvciA+IDApCisgICAgcmV0dXJuICh2YWx1ZSA8PCBzY2FsZWZhY3Rvcik7CisgIGVsc2UKKyAgICByZXR1cm4gKHZhbHVlID4+ICgtc2NhbGVmYWN0b3IpKTsKIH0KICNlbmRpZgogCkBAIC0xNDAsMjcgKzE4MCwyOCBAQAogICoKICAqLwogI2RlZmluZSBGVU5DVElPTl9zY2FsZVZhbHVlU2F0dXJhdGUKLWlubGluZQotRklYUF9EQkwgc2NhbGVWYWx1ZVNhdHVyYXRlKAotICAgICAgICBjb25zdCBGSVhQX0RCTCB2YWx1ZSwKLSAgICAgICAgSU5UIHNjYWxlZmFjdG9yCi0gICAgICAgICkKLXsKLSAgaWYoc2NhbGVmYWN0b3IgPiAwKSB7Ci0gICAgaWYgKGZOb3JtKHZhbHVlKSA8IHNjYWxlZmFjdG9yICYmIHZhbHVlICE9IChGSVhQX0RCTCkwKSB7Ci0gICAgICBpZiAodmFsdWUgPiAoRklYUF9EQkwpMCkgewotICAgICAgICByZXR1cm4gKEZJWFBfREJMKU1BWFZBTF9EQkw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gKEZJWFBfREJMKU1JTlZBTF9EQkw7Ci0gICAgICB9CitpbmxpbmUgRklYUF9EQkwgc2NhbGVWYWx1ZVNhdHVyYXRlKGNvbnN0IEZJWFBfREJMIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgLyogaW4gcmFuZ2UgLTMxIC4uLiArMzEgKi8KKykgeworICBpbnQgaGVhZHJvb20gPSBmaXhub3Jtel9EKAorICAgICAgKElOVCl2YWx1ZSBeIChJTlQpKCh2YWx1ZSA+PiAzMSkpKTsgLyogaGVhZHJvb20gaW4gcmFuZ2UgMS4uLjMyICovCisgIGlmIChzY2FsZWZhY3RvciA+PSAwKSB7CisgICAgLyogc2hpZnQgbGVmdDogc2F0dXJhdGUgaW4gY2FzZSBvZiBoZWFkcm9vbSBsZXNzL2VxdWFsIHNjYWxlZmFjdG9yICovCisgICAgaWYgKGhlYWRyb29tIDw9IHNjYWxlZmFjdG9yKSB7CisgICAgICBpZiAodmFsdWUgPiAoRklYUF9EQkwpMCkKKyAgICAgICAgcmV0dXJuIChGSVhQX0RCTClNQVhWQUxfREJMOyAvKiAweDdGRkYuRkZGRiAqLworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gKEZJWFBfREJMKU1JTlZBTF9EQkwgKyAoRklYUF9EQkwpMTsgLyogMHg4MDAwLjAwMDEgKi8KICAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICh2YWx1ZTw8c2NhbGVmYWN0b3IpOworICAgICAgcmV0dXJuIGZNYXgoKHZhbHVlIDw8IHNjYWxlZmFjdG9yKSwgKEZJWFBfREJMKU1JTlZBTF9EQkwgKyAoRklYUF9EQkwpMSk7CiAgICAgfQogICB9IGVsc2UgewotICAgIGlmICgtKERGUkFDVF9CSVRTLTEpID4gc2NhbGVmYWN0b3IpIHsKKyAgICBzY2FsZWZhY3RvciA9IC1zY2FsZWZhY3RvcjsKKyAgICAvKiBzaGlmdCByaWdodDogY2xlYXIgaW4gY2FzZSBvZiAzMi1oZWFkcm9vbSBncmVhdGVyL2VxdWFsIC1zY2FsZWZhY3RvciAqLworICAgIGlmICgoREZSQUNUX0JJVFMgLSBoZWFkcm9vbSkgPD0gc2NhbGVmYWN0b3IpIHsKICAgICAgIHJldHVybiAoRklYUF9EQkwpMDsKICAgICB9IGVsc2UgewotICAgIHJldHVybiAodmFsdWU+Pigtc2NhbGVmYWN0b3IpKTsKKyAgICAgIHJldHVybiBmTWF4KCh2YWx1ZSA+PiBzY2FsZWZhY3RvciksIChGSVhQX0RCTClNSU5WQUxfREJMICsgKEZJWFBfREJMKTEpOwogICAgIH0KICAgfQogfQpAQCAtMTc1LDE0ICsyMTYsMTIgQEAKICAqCiAgKi8KICNkZWZpbmUgRlVOQ1RJT05fc2NhbGVWYWx1ZUluUGxhY2UKLWlubGluZQotdm9pZCBzY2FsZVZhbHVlSW5QbGFjZSgKLSAgICAgICAgRklYUF9EQkwgKnZhbHVlLCAvKiE8IFZhbHVlICovCi0gICAgICAgIElOVCBzY2FsZWZhY3RvciAgIC8qITwgU2NhbGVmYWN0b3IgKi8KLSAgICAgICAgKQoteworaW5saW5lIHZvaWQgc2NhbGVWYWx1ZUluUGxhY2UoRklYUF9EQkwgKnZhbHVlLCAvKiE8IFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgIC8qITwgU2NhbGVmYWN0b3IgKi8KKykgewogICBJTlQgbmV3c2NhbGU7Ci0gIC8qIE5vdGU6IFRoZSBhc3NpZ25tZW50IGluc2lkZSB0aGUgaWYgY29uZGl0aW9uYWwgYWxsb3dzIGNvbWJpbmluZyBhIGxvYWQgd2l0aCB0aGUgY29tcGFyZSB0byB6ZXJvIChvbiBBUk0gYW5kIG1heWJlIG90aGVycykgKi8KKyAgLyogTm90ZTogVGhlIGFzc2lnbm1lbnQgaW5zaWRlIHRoZSBpZiBjb25kaXRpb25hbCBhbGxvd3MgY29tYmluaW5nIGEgbG9hZCB3aXRoCisgICAqIHRoZSBjb21wYXJlIHRvIHplcm8gKG9uIEFSTSBhbmQgbWF5YmUgb3RoZXJzKSAqLwogICBpZiAoKG5ld3NjYWxlID0gKHNjYWxlZmFjdG9yKSkgPj0gMCkgewogICAgICoodmFsdWUpIDw8PSBuZXdzY2FsZTsKICAgfSBlbHNlIHsKQEAgLTE5MSwzNCArMjMwLDM3IEBACiB9CiAjZW5kaWYKIAotLyohCi0gKgotICogIFxicmllZiAgU2NhbGUgaW5wdXQgdmFsdWUgYnkgMl57c2NhbGV9IGFuZCBzYXR1cmF0ZSBvdXRwdXQgdG8gMl57ZEJpdHMtMX0KLSAqICBccmV0dXJuIHNjYWxlZCBhbmQgc2F0dXJhdGVkIHZhbHVlCi0gKgotICogIFRoaXMgbWFjcm8gc2NhbGVzIHNyYyB2YWx1ZSByaWdodCBvciBsZWZ0IGFuZCBhcHBsaWVzIHNhdHVyYXRpb24gdG8gKDJeZEJpdHMpLTEKLSAqICBtYXhpbWEgb3V0cHV0LgotICovCisgIC8qIQorICAgKgorICAgKiAgXGJyaWVmICBTY2FsZSBpbnB1dCB2YWx1ZSBieSAyXntzY2FsZX0gYW5kIHNhdHVyYXRlIG91dHB1dCB0byAyXntkQml0cy0xfQorICAgKiAgXHJldHVybiBzY2FsZWQgYW5kIHNhdHVyYXRlZCB2YWx1ZQorICAgKgorICAgKiAgVGhpcyBtYWNybyBzY2FsZXMgc3JjIHZhbHVlIHJpZ2h0IG9yIGxlZnQgYW5kIGFwcGxpZXMgc2F0dXJhdGlvbiB0bworICAgKiAoMl5kQml0cyktMSBtYXhpbWEgb3V0cHV0LgorICAgKi8KIAogI2lmbmRlZiBTQVRVUkFURV9SSUdIVF9TSElGVAotICAjZGVmaW5lIFNBVFVSQVRFX1JJR0hUX1NISUZUKHNyYywgc2NhbGUsIGRCaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICggKCgoTE9ORykoc3JjKT4+KHNjYWxlKSkgPiAoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0xKSkgICAgICA/IChMT05HKSgoKDFVKTw8KChkQml0cyktMSkpLTEpICAgIFwKLSAgICAgICAgICAgICAgOiAoKChMT05HKShzcmMpPj4oc2NhbGUpKSA8IH4oKExPTkcpKCgoMVUpPDwoKGRCaXRzKS0xKSktMSkpKSA/IH4oKExPTkcpKCgoMVUpPDwoKGRCaXRzKS0xKSktMSkpIFwKLSAgICAgICAgICAgICAgOiAoKExPTkcpKHNyYykgPj4gKHNjYWxlKSkgKQorI2RlZmluZSBTQVRVUkFURV9SSUdIVF9TSElGVChzcmMsIHNjYWxlLCBkQml0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoTE9ORykoc3JjKSA+PiAoc2NhbGUpKSA+IChMT05HKSgoKDFVKSA8PCAoKGRCaXRzKS0xKSkgLSAxKSkgICAgICAgICAgXAorICAgICAgID8gKExPTkcpKCgoMVUpIDw8ICgoZEJpdHMpLTEpKSAtIDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogKCgoTE9ORykoc3JjKSA+PiAoc2NhbGUpKSA8IH4oKExPTkcpKCgoMVUpIDw8ICgoZEJpdHMpLTEpKSAtIDEpKSkgXAorICAgICAgICAgICAgID8gfigoTE9ORykoKCgxVSkgPDwgKChkQml0cyktMSkpIC0gMSkpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIDogKChMT05HKShzcmMpID4+IChzY2FsZSkpKQogI2VuZGlmCiAKICNpZm5kZWYgU0FUVVJBVEVfTEVGVF9TSElGVAotICAjZGVmaW5lIFNBVFVSQVRFX0xFRlRfU0hJRlQoc3JjLCBzY2FsZSwgZEJpdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICggKChMT05HKShzcmMpID4gKChMT05HKSgoKDFVKTw8KChkQml0cyktMSkpLTEpPj4oc2NhbGUpKSkgICAgPyAoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0xKSAgICAgIFwKLSAgICAgICAgICAgICAgOiAoKExPTkcpKHNyYykgPCB+KChMT05HKSgoKDFVKTw8KChkQml0cyktMSkpLTEpPj4oc2NhbGUpKSkgPyB+KChMT05HKSgoKDFVKTw8KChkQml0cyktMSkpLTEpKSAgIFwKLSAgICAgICAgICAgICAgOiAoKExPTkcpKHNyYykgPDwgKHNjYWxlKSkgKQorI2RlZmluZSBTQVRVUkFURV9MRUZUX1NISUZUKHNyYywgc2NhbGUsIGRCaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoTE9ORykoc3JjKSA+ICgoTE9ORykoKCgxVSkgPDwgKChkQml0cyktMSkpIC0gMSkgPj4gKHNjYWxlKSkpICAgICAgICBcCisgICAgICAgPyAoTE9ORykoKCgxVSkgPDwgKChkQml0cyktMSkpIC0gMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogKChMT05HKShzcmMpIDwgfigoTE9ORykoKCgxVSkgPDwgKChkQml0cyktMSkpIC0gMSkgPj4gKHNjYWxlKSkpIFwKKyAgICAgICAgICAgICA/IH4oKExPTkcpKCgoMVUpIDw8ICgoZEJpdHMpLTEpKSAtIDEpKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgOiAoKExPTkcpKHNyYykgPDwgKHNjYWxlKSkpCiAjZW5kaWYKIAogI2lmbmRlZiBTQVRVUkFURV9TSElGVAotI2RlZmluZSBTQVRVUkFURV9TSElGVChzcmMsIHNjYWxlLCBkQml0cykgICAgICAgICAgICAgICBcCi0gICAgICggKChzY2FsZSkgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgPyBTQVRVUkFURV9MRUZUX1NISUZUKChzcmMpLCAtKHNjYWxlKSwgKGRCaXRzKSkgICBcCi0gICAgICA6IFNBVFVSQVRFX1JJR0hUX1NISUZUKChzcmMpLCAoc2NhbGUpLCAoZEJpdHMpKSApCisjZGVmaW5lIFNBVFVSQVRFX1NISUZUKHNyYywgc2NhbGUsIGRCaXRzKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoc2NhbGUpIDwgMCkgPyBTQVRVUkFURV9MRUZUX1NISUZUKChzcmMpLCAtKHNjYWxlKSwgKGRCaXRzKSkgXAorICAgICAgICAgICAgICAgICA6IFNBVFVSQVRFX1JJR0hUX1NISUZUKChzcmMpLCAoc2NhbGUpLCAoZEJpdHMpKSkKICNlbmRpZgogCiAvKgpAQCAtMjI2LDI1ICsyNjgsMzEgQEAKICAqIHRvIGF2b2lkIHByb2JsZW1zIHdoZW4gaW52ZXJ0aW5nIHRoZSBzaWduIG9mIHRoZSByZXN1bHQuCiAgKi8KICNpZm5kZWYgU0FUVVJBVEVfTEVGVF9TSElGVF9BTFQKLSNkZWZpbmUgU0FUVVJBVEVfTEVGVF9TSElGVF9BTFQoc3JjLCBzY2FsZSwgZEJpdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAoICgoTE9ORykoc3JjKSA+ICgoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0xKT4+KHNjYWxlKSkpICAgID8gKExPTkcpKCgoMVUpPDwoKGRCaXRzKS0xKSktMSkgICAgICBcCi0gICAgICAgICAgICAgIDogKChMT05HKShzcmMpIDwgfigoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0yKT4+KHNjYWxlKSkpID8gfigoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0yKSkgICBcCi0gICAgICAgICAgICAgIDogKChMT05HKShzcmMpIDw8IChzY2FsZSkpICkKKyNkZWZpbmUgU0FUVVJBVEVfTEVGVF9TSElGVF9BTFQoc3JjLCBzY2FsZSwgZEJpdHMpICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKExPTkcpKHNyYykgPiAoKExPTkcpKCgoMVUpIDw8ICgoZEJpdHMpLTEpKSAtIDEpID4+IChzY2FsZSkpKSAgICAgICAgXAorICAgICAgID8gKExPTkcpKCgoMVUpIDw8ICgoZEJpdHMpLTEpKSAtIDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA6ICgoTE9ORykoc3JjKSA8IH4oKExPTkcpKCgoMVUpIDw8ICgoZEJpdHMpLTEpKSAtIDIpID4+IChzY2FsZSkpKSBcCisgICAgICAgICAgICAgPyB+KChMT05HKSgoKDFVKSA8PCAoKGRCaXRzKS0xKSkgLSAyKSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIDogKChMT05HKShzcmMpIDw8IChzY2FsZSkpKQogI2VuZGlmCiAKICNpZm5kZWYgU0FUVVJBVEVfUklHSFRfU0hJRlRfQUxUCi0gICNkZWZpbmUgU0FUVVJBVEVfUklHSFRfU0hJRlRfQUxUKHNyYywgc2NhbGUsIGRCaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKCAoKChMT05HKShzcmMpPj4oc2NhbGUpKSA+IChMT05HKSgoKDFVKTw8KChkQml0cyktMSkpLTEpKSAgICAgID8gKExPTkcpKCgoMVUpPDwoKGRCaXRzKS0xKSktMSkgICAgXAotICAgICAgICAgICAgICA6ICgoKExPTkcpKHNyYyk+PihzY2FsZSkpIDwgfigoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0yKSkpID8gfigoTE9ORykoKCgxVSk8PCgoZEJpdHMpLTEpKS0yKSkgXAotICAgICAgICAgICAgICA6ICgoTE9ORykoc3JjKSA+PiAoc2NhbGUpKSApCisjZGVmaW5lIFNBVFVSQVRFX1JJR0hUX1NISUZUX0FMVChzcmMsIHNjYWxlLCBkQml0cykgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKChMT05HKShzcmMpID4+IChzY2FsZSkpID4gKExPTkcpKCgoMVUpIDw8ICgoZEJpdHMpLTEpKSAtIDEpKSAgICAgICAgICBcCisgICAgICAgPyAoTE9ORykoKCgxVSkgPDwgKChkQml0cyktMSkpIC0gMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiAoKChMT05HKShzcmMpID4+IChzY2FsZSkpIDwgfigoTE9ORykoKCgxVSkgPDwgKChkQml0cyktMSkpIC0gMikpKSBcCisgICAgICAgICAgICAgPyB+KChMT05HKSgoKDFVKSA8PCAoKGRCaXRzKS0xKSkgLSAyKSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgOiAoKExPTkcpKHNyYykgPj4gKHNjYWxlKSkpCiAjZW5kaWYKIAogI2lmbmRlZiBTQVRVUkFURV9JTlRfUENNX1JJR0hUX1NISUZUCi0jZGVmaW5lIFNBVFVSQVRFX0lOVF9QQ01fUklHSFRfU0hJRlQoc3JjLCBzY2FsZSkgU0FUVVJBVEVfUklHSFRfU0hJRlQoc3JjLCBzY2FsZSwgU0FNUExFX0JJVFMpCisjZGVmaW5lIFNBVFVSQVRFX0lOVF9QQ01fUklHSFRfU0hJRlQoc3JjLCBzY2FsZSkgXAorICBTQVRVUkFURV9SSUdIVF9TSElGVChzcmMsIHNjYWxlLCBTQU1QTEVfQklUUykKICNlbmRpZgogCiAjaWZuZGVmIFNBVFVSQVRFX0lOVF9QQ01fTEVGVF9TSElGVAotI2RlZmluZSBTQVRVUkFURV9JTlRfUENNX0xFRlRfU0hJRlQoc3JjLCBzY2FsZSkgU0FUVVJBVEVfTEVGVF9TSElGVChzcmMsIHNjYWxlLCBTQU1QTEVfQklUUykKKyNkZWZpbmUgU0FUVVJBVEVfSU5UX1BDTV9MRUZUX1NISUZUKHNyYywgc2NhbGUpIFwKKyAgU0FUVVJBVEVfTEVGVF9TSElGVChzcmMsIHNjYWxlLCBTQU1QTEVfQklUUykKICNlbmRpZgogCiAjZW5kaWYgLyogI2lmbmRlZiBTQ0FMRV9IICovCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9zY3JhbWJsZS5oIGIvbGliRkRLL2luY2x1ZGUvc2NyYW1ibGUuaAppbmRleCBjZWFmNTI3Li5mMDdlYmVkIDEwMDY0NAotLS0gYS9saWJGREsvaW5jbHVkZS9zY3JhbWJsZS5oCisrKyBiL2xpYkZESy9pbmNsdWRlL3NjcmFtYmxlLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CisKICAgIERlc2NyaXB0aW9uOgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIFNDUkFNQkxFX0gKICNkZWZpbmUgU0NSQU1CTEVfSApAQCAtOTQsMTAgKzEwNiwxMCBAQAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAogI2lmIGRlZmluZWQoX19hcm1fXykKLSNpbmNsdWRlICJhcm0vc2NyYW1ibGUuaCIKKyNpbmNsdWRlICJhcm0vc2NyYW1ibGVfYXJtLmgiCiAKLSNlbGlmIGRlZmluZWQoX19taXBzX18pICYmIGRlZmluZWQoX19taXBzX2RzcCkJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwotI2luY2x1ZGUgIm1pcHMvc2NyYW1ibGUuaCIKKyNlbGlmIGRlZmluZWQoX19taXBzX18pICYmIGRlZmluZWQoX19taXBzX2RzcCkKKyNpbmNsdWRlICJtaXBzL3NjcmFtYmxlX21pcHMuaCIKIAogI2VuZGlmCiAKQEAgLTExMCw1MyArMTIyLDI5IEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiAhZGVmaW5lZChGVU5DVElPTl9zY3JhbWJsZV9zZ2wpCi0KLWlubGluZSB2b2lkIHNjcmFtYmxlX3NnbChGSVhQX1NHTCAqeCwgSU5UIG4pCi17Ci0gIElOVCBtLGssajsKLQotICBmb3IgKG09MSxqPTA7IG08bi0xOyBtKyspCi0gIHsKLSAgICB7Zm9yKGs9bj4+MTsgKCEoKGpePWspJmspKTsgaz4+PTEpO30KLQotICAgIGlmIChqPm0pCi0gICAgewotICAgICAgRklYUF9TR0wgdG1wOwotICAgICAgdG1wPXhbMiptXTsKLSAgICAgIHhbMiptXT14WzIqal07Ci0gICAgICB4WzIqal09dG1wOwotCi0gICAgICB0bXA9eFsyKm0rMV07Ci0gICAgICB4WzIqbSsxXT14WzIqaisxXTsKLSAgICAgIHhbMipqKzFdPXRtcDsKLSAgICB9Ci0gIH0KLX0KLSNlbmRpZgotCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fc2NyYW1ibGUpCiAKIC8qIGRlZmF1bHQgc2NyYW1ibGUgZnVuY3Rpb25hbGl0eSAqLwotaW5saW5lIHZvaWQgc2NyYW1ibGUoRklYUF9EQkwgKngsIElOVCBuKQotewotICBJTlQgbSxrLGo7Ci0gIEZES19BU1NFUlQoISgoKFVJTlQ2NCl4KSYoQUxJR05NRU5UX0RFRkFVTFQtMSkpKTsKK2lubGluZSB2b2lkIHNjcmFtYmxlKEZJWFBfREJMICp4LCBJTlQgbGVuZ3RoKSB7CisgIElOVCBtLCBrLCBqOworICBGREtfQVNTRVJUKCEoKChJTlQpKElOVDY0KXgpICYgKEFMSUdOTUVOVF9ERUZBVUxUIC0gMSkpKTsKKyAgQ19BTExPQ19BTElHTkVEX0NIRUNLKHgpOwogCi0gIGZvciAobT0xLGo9MDsgbTxuLTE7IG0rKykKLSAgewotICAgIHtmb3Ioaz1uPj4xOyAoISgoal49aykmaykpOyBrPj49MSk7fQotCi0gICAgaWYgKGo+bSkKKyAgZm9yIChtID0gMSwgaiA9IDA7IG0gPCBsZW5ndGggLSAxOyBtKyspIHsKICAgICB7Ci0gICAgICBGSVhQX0RCTCB0bXA7Ci0gICAgICB0bXA9eFsyKm1dOwotICAgICAgeFsyKm1dPXhbMipqXTsKLSAgICAgIHhbMipqXT10bXA7CisgICAgICBmb3IgKGsgPSBsZW5ndGggPj4gMTsgKCEoKGogXj0gaykgJiBrKSk7IGsgPj49IDEpCisgICAgICAgIDsKKyAgICB9CiAKLSAgICAgIHRtcD14WzIqbSsxXTsKLSAgICAgIHhbMiptKzFdPXhbMipqKzFdOwotICAgICAgeFsyKmorMV09dG1wOworICAgIGlmIChqID4gbSkgeworICAgICAgRklYUF9EQkwgdG1wOworICAgICAgdG1wID0geFsyICogbV07CisgICAgICB4WzIgKiBtXSA9IHhbMiAqIGpdOworICAgICAgeFsyICogal0gPSB0bXA7CisKKyAgICAgIHRtcCA9IHhbMiAqIG0gKyAxXTsKKyAgICAgIHhbMiAqIG0gKyAxXSA9IHhbMiAqIGogKyAxXTsKKyAgICAgIHhbMiAqIGogKyAxXSA9IHRtcDsKICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL3g4Ni9hYnNfeDg2LmggYi9saWJGREsvaW5jbHVkZS94ODYvYWJzX3g4Ni5oCmluZGV4IDk2Mzc0ZWMuLmVmZDY0MzMgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL3g4Ni9hYnNfeDg2LmgKKysrIGIvbGliRkRLL2luY2x1ZGUveDg2L2Fic194ODYuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyOCArOTAsMzQgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKKwogICAgRGVzY3JpcHRpb246IGZpeGVkIHBvaW50IGludHJpbnNpY3MKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKEFCU19YODZfSCkKKyNkZWZpbmUgQUJTX1g4Nl9ICisKICNpZiBkZWZpbmVkKF9feDg2X18pCiAKLSAgI2lmIGRlZmluZWQoX194ODZfNjRfXykKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pCiAKLSAgICBpbmxpbmUgSU5UIGZpeGFic19EKElOVCB4KSAgICAgIHsgcmV0dXJuICgoeCkgPiAoSU5UKSgwKSkgICAgICA/ICh4KSA6IC0oeCkgOyB9Ci0gICAgaW5saW5lIElOVCBmaXhhYnNfUyhJTlQgeCkgICAgICB7IHJldHVybiAoKHgpID4gKElOVCkoMCkpICAgICAgPyAoeCkgOiAtKHgpIDsgfQoraW5saW5lIElOVCBmaXhhYnNfRChJTlQgeCkgeyByZXR1cm4gKCh4KSA+IChJTlQpKDApKSA/ICh4KSA6IC0oeCk7IH0KK2lubGluZSBJTlQgZml4YWJzX1MoSU5UIHgpIHsgcmV0dXJuICgoeCkgPiAoSU5UKSgwKSkgPyAoeCkgOiAtKHgpOyB9CiAKLSAgICAjZGVmaW5lIGZpeGFic19JKHgpIGZpeGFic19EKHgpCisjZGVmaW5lIGZpeGFic19JKHgpIGZpeGFic19EKHgpCiAKLSAgICAjZGVmaW5lIEZVTkNUSU9OX2ZpeGFic19TCi0gICAgI2RlZmluZSBGVU5DVElPTl9maXhhYnNfRAotICAgICNkZWZpbmUgRlVOQ1RJT05fZml4YWJzX0kKKyNkZWZpbmUgRlVOQ1RJT05fZml4YWJzX1MKKyNkZWZpbmUgRlVOQ1RJT05fZml4YWJzX0QKKyNkZWZpbmUgRlVOQ1RJT05fZml4YWJzX0kKIAotICAjZW5kaWYgLyogX194ODZfNjRfXyAqLworI2VuZGlmIC8qIF9feDg2XzY0X18gKi8KIAogI2VuZGlmIC8qX194ODZfXyAqLwogCisjZW5kaWYgLyogIWRlZmluZWQoQUJTX1g4Nl9IKSAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUveDg2L2Nsel94ODYuaCBiL2xpYkZESy9pbmNsdWRlL3g4Ni9jbHpfeDg2LmgKaW5kZXggMWJjNDNlNS4uYmFkY2EyOSAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUveDg2L2Nsel94ODYuaAorKysgYi9saWJGREsvaW5jbHVkZS94ODYvY2x6X3g4Ni5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDc2ICs5MCw3NiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAotICAgQXV0aG9yKHMpOgotICAgRGVzY3JpcHRpb246IGZpeGVkIHBvaW50IGludHJpbnNpY3MKKyAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiB4ODYgdmVyc2lvbiBvZiBjb3VudCBsZWFkaW5nIHplcm8gLyBiaXRzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChDTFpfWDg2X0gpCisjZGVmaW5lIENMWl9YODZfSAogCiAjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX194ODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSkKIAotICAjZGVmaW5lIEZVTkNUSU9OX2ZpeG5vcm16X0QKLSAgI2RlZmluZSBGVU5DVElPTl9maXhub3JtX0QKKyNkZWZpbmUgRlVOQ1RJT05fZml4bm9ybXpfRAorI2RlZmluZSBGVU5DVElPTl9maXhub3JtX0QKIAotICBpbmxpbmUgSU5UIGZpeG5vcm16X0QoTE9ORyB2YWx1ZSkKLSAgewotICAgIElOVCByZXN1bHQ7CitpbmxpbmUgSU5UIGZpeG5vcm16X0QoTE9ORyB2YWx1ZSkgeworICBJTlQgcmVzdWx0OwogCi0gICAgaWYgKHZhbHVlICE9IDApIHsKLSAgICAgIHJlc3VsdCA9IF9fYnVpbHRpbl9jbHoodmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgPSAzMjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgaWYgKHZhbHVlICE9IDApIHsKKyAgICByZXN1bHQgPSBfX2J1aWx0aW5fY2x6KHZhbHVlKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSAzMjsKICAgfQorICByZXR1cm4gcmVzdWx0OworfQogCi0gIGlubGluZSBJTlQgZml4bm9ybV9EKExPTkcgdmFsdWUpCi0gIHsKLSAgICBJTlQgcmVzdWx0OwotICAgIGlmICh2YWx1ZSA9PSAwKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHZhbHVlIDwgMCkgewotICAgICAgdmFsdWUgPSB+dmFsdWU7Ci0gICAgfQotICAgIHJlc3VsdCA9ICBmaXhub3Jtel9EKHZhbHVlKTsKLSAgICByZXR1cm4gcmVzdWx0IC0gMTsKK2lubGluZSBJTlQgZml4bm9ybV9EKExPTkcgdmFsdWUpIHsKKyAgSU5UIHJlc3VsdDsKKyAgaWYgKHZhbHVlID09IDApIHsKKyAgICByZXR1cm4gMDsKICAgfQorICBpZiAodmFsdWUgPCAwKSB7CisgICAgdmFsdWUgPSB+dmFsdWU7CisgIH0KKyAgcmVzdWx0ID0gZml4bm9ybXpfRCh2YWx1ZSk7CisgIHJldHVybiByZXN1bHQgLSAxOworfQogCi0KLSNlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmIChkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX01fWDY0KSkKKyNlbGlmIChfTVNDX1ZFUiA+IDEyMDApICYmIChkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX01fWDY0KSkKIAogI2luY2x1ZGUgPGludHJpbi5oPgogCi0gICNkZWZpbmUgRlVOQ1RJT05fZml4bm9ybXpfRAotICAjZGVmaW5lIEZVTkNUSU9OX2ZpeG5vcm1fRAorI2RlZmluZSBGVU5DVElPTl9maXhub3Jtel9ECisjZGVmaW5lIEZVTkNUSU9OX2ZpeG5vcm1fRAogCi0gIGlubGluZSBJTlQgZml4bm9ybXpfRChMT05HIHZhbHVlKQotICB7Ci0gICAgdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOwotICAgIHVuc2lnbmVkIGNoYXIgZXJyOwotICAgIGVyciA9IF9CaXRTY2FuUmV2ZXJzZSgmcmVzdWx0LCB2YWx1ZSk7Ci0gICAgaWYgKGVycikgewotICAgICAgcmV0dXJuIDMxIC0gcmVzdWx0OwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gMzI7Ci0gICAgfQoraW5saW5lIElOVCBmaXhub3Jtel9EKExPTkcgdmFsdWUpIHsKKyAgdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOworICB1bnNpZ25lZCBjaGFyIGVycjsKKyAgZXJyID0gX0JpdFNjYW5SZXZlcnNlKCZyZXN1bHQsIHZhbHVlKTsKKyAgaWYgKGVycikgeworICAgIHJldHVybiAzMSAtIHJlc3VsdDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMzI7CiAgIH0KK30KIAotICBpbmxpbmUgSU5UIGZpeG5vcm1fRChMT05HIHZhbHVlKQotICB7Ci0gICAgSU5UIHJlc3VsdDsKLSAgICBpZiAodmFsdWUgPT0gMCkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICh2YWx1ZSA8IDApIHsKLSAgICAgIHZhbHVlID0gfnZhbHVlOwotICAgIH0KLSAgICByZXN1bHQgPSAgZml4bm9ybXpfRCh2YWx1ZSk7Ci0gICAgcmV0dXJuIHJlc3VsdCAtIDE7CitpbmxpbmUgSU5UIGZpeG5vcm1fRChMT05HIHZhbHVlKSB7CisgIElOVCByZXN1bHQ7CisgIGlmICh2YWx1ZSA9PSAwKSB7CisgICAgcmV0dXJuIDA7CiAgIH0KKyAgaWYgKHZhbHVlIDwgMCkgeworICAgIHZhbHVlID0gfnZhbHVlOworICB9CisgIHJlc3VsdCA9IGZpeG5vcm16X0QodmFsdWUpOworICByZXR1cm4gcmVzdWx0IC0gMTsKK30KIAogI2VuZGlmIC8qIHRvb2xjaGFpbiAqLworI2VuZGlmIC8qICFkZWZpbmVkKENMWl9YODZfSCkgKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9pbmNsdWRlL3g4Ni9maXhtdWxfeDg2LmggYi9saWJGREsvaW5jbHVkZS94ODYvZml4bXVsX3g4Ni5oCmluZGV4IDdiNzRjYzcuLjg0ZTYzMTYgMTAwNjQ0Ci0tLSBhL2xpYkZESy9pbmNsdWRlL3g4Ni9maXhtdWxfeDg2LmgKKysrIGIvbGliRkRLL2luY2x1ZGUveDg2L2ZpeG11bF94ODYuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKKwogICAgRGVzY3JpcHRpb246IGZpeGVkIHBvaW50IGludHJpbnNpY3MKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKEZJWE1VTF9YODZfSCkKKyNkZWZpbmUgRklYTVVMX1g4Nl9ICiAKICNpZiBkZWZpbmVkKF9feDg2X18pCiAKQEAgLTk2LDE4ICsxMTEsMTcgQEAKICNkZWZpbmUgRlVOQ1RJT05fZml4bXVsX0RECiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJfREQKICNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2MkJpdEV4YWN0X0RECi0jZGVmaW5lIGZpeG11bGRpdjJCaXRFeGFjdF9ERChhLGIpIGZpeG11bGRpdjJfREQoYSxiKQorI2RlZmluZSBmaXhtdWxkaXYyQml0RXhhY3RfREQoYSwgYikgZml4bXVsZGl2Ml9ERChhLCBiKQogI2RlZmluZSBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9ERAotI2RlZmluZSBmaXhtdWxCaXRFeGFjdF9ERChhLGIpIGZpeG11bF9ERChhLGIpCisjZGVmaW5lIGZpeG11bEJpdEV4YWN0X0REKGEsIGIpIGZpeG11bF9ERChhLCBiKQogCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9EUwotI2RlZmluZSBmaXhtdWxkaXYyQml0RXhhY3RfRFMoYSxiKSBmaXhtdWxkaXYyX0RTKGEsYikKKyNkZWZpbmUgZml4bXVsZGl2MkJpdEV4YWN0X0RTKGEsIGIpIGZpeG11bGRpdjJfRFMoYSwgYikKIAogI2RlZmluZSBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9EUwotI2RlZmluZSBmaXhtdWxCaXRFeGFjdF9EUyhhLGIpIGZpeG11bF9EUyhhLGIpCisjZGVmaW5lIGZpeG11bEJpdEV4YWN0X0RTKGEsIGIpIGZpeG11bF9EUyhhLCBiKQogCi1pbmxpbmUgSU5UIGZpeG11bF9ERCAoSU5UIGEsIGNvbnN0IElOVCBiKQoteworaW5saW5lIElOVCBmaXhtdWxfREQoSU5UIGEsIGNvbnN0IElOVCBiKSB7CiAgIF9fYXNtCiAgIHsKICAgICBtb3YgZWF4LCBhCkBAIC0xMTUsNTkgKzEyOSw1MyBAQAogICAgIHNobCBlZHgsIDEKICAgICBtb3YgYSwgZWR4CiAgIH0KLSAgcmV0dXJuIGEgOworICByZXR1cm4gYTsKIH0KIAotCi1pbmxpbmUgSU5UIGZpeG11bGRpdjJfREQgKElOVCBhLCBjb25zdCBJTlQgYikKLXsKK2lubGluZSBJTlQgZml4bXVsZGl2Ml9ERChJTlQgYSwgY29uc3QgSU5UIGIpIHsKICAgX19hc20KICAgewogICAgIG1vdiBlYXgsIGEKICAgICBpbXVsIGIKICAgICBtb3YgYSwgZWR4CiAgIH0KLSAgcmV0dXJuIGEgOworICByZXR1cm4gYTsKIH0KIAotLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KLSNlbGlmIChkZWZpbmVkKF9fR05VQ19fKXx8ZGVmaW5lZChfX2dudV9saW51eF9fKSkgJiYgZGVmaW5lZChfX3g4Nl9fKQorLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqLworI2VsaWYgKGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19nbnVfbGludXhfXykpICYmIGRlZmluZWQoX194ODZfXykKIAogI2RlZmluZSBGVU5DVElPTl9maXhtdWxfREQKICNkZWZpbmUgRlVOQ1RJT05fZml4bXVsZGl2Ml9ERAogCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9ERAotI2RlZmluZSBmaXhtdWxkaXYyQml0RXhhY3RfREQoYSxiKSBmaXhtdWxkaXYyX0REKGEsYikKKyNkZWZpbmUgZml4bXVsZGl2MkJpdEV4YWN0X0REKGEsIGIpIGZpeG11bGRpdjJfREQoYSwgYikKIAogI2RlZmluZSBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9ERAotI2RlZmluZSBmaXhtdWxCaXRFeGFjdF9ERChhLGIpIGZpeG11bF9ERChhLGIpCisjZGVmaW5lIGZpeG11bEJpdEV4YWN0X0REKGEsIGIpIGZpeG11bF9ERChhLCBiKQogCiAjZGVmaW5lIEZVTkNUSU9OX2ZpeG11bGRpdjJCaXRFeGFjdF9EUwotI2RlZmluZSBmaXhtdWxkaXYyQml0RXhhY3RfRFMoYSxiKSBmaXhtdWxkaXYyX0RTKGEsYikKKyNkZWZpbmUgZml4bXVsZGl2MkJpdEV4YWN0X0RTKGEsIGIpIGZpeG11bGRpdjJfRFMoYSwgYikKIAogI2RlZmluZSBGVU5DVElPTl9maXhtdWxCaXRFeGFjdF9EUwotI2RlZmluZSBmaXhtdWxCaXRFeGFjdF9EUyhhLGIpIGZpeG11bF9EUyhhLGIpCisjZGVmaW5lIGZpeG11bEJpdEV4YWN0X0RTKGEsIGIpIGZpeG11bF9EUyhhLCBiKQogCi1pbmxpbmUgSU5UIGZpeG11bF9ERCAoSU5UIGEsIGNvbnN0IElOVCBiKQoteworaW5saW5lIElOVCBmaXhtdWxfREQoSU5UIGEsIGNvbnN0IElOVCBiKSB7CiAgIElOVCByZXN1bHQ7CiAKLSAgYXNtKCAiaW11bCAlMjtcbiIKLSAgICAgICAic2hsICQxLCAlMDtcbiIKLSAgICAgICAgICAgIDogIj1kIihyZXN1bHQpLCAiK2EiKGEpCi0gICAgICAgICAgICA6ICJyIihiKSApOworICBhc20oImltdWwgJTI7XG4iCisgICAgICAic2hsICQxLCAlMDtcbiIKKyAgICAgIDogIj1kIihyZXN1bHQpLCAiK2EiKGEpCisgICAgICA6ICJyIihiKSk7CiAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotCi1pbmxpbmUgSU5UIGZpeG11bGRpdjJfREQgKElOVCBhLCBjb25zdCBJTlQgYikKLXsKK2lubGluZSBJTlQgZml4bXVsZGl2Ml9ERChJTlQgYSwgY29uc3QgSU5UIGIpIHsKICAgSU5UIHJlc3VsdDsKIAotICBhc20gKCAiaW11bCAlMjsiCi0gICAgICAgICAgICAgOiAiPWQiKHJlc3VsdCksICIrYSIoYSkKLSAgICAgICAgICAgICA6ICJyIihiKSApOworICBhc20oImltdWwgJTI7IiA6ICI9ZCIocmVzdWx0KSwgIithIihhKSA6ICJyIihiKSk7CiAKICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTE3NiwzICsxODQsNCBAQAogCiAjZW5kaWYgLyogX194ODZfXyAqLwogCisjZW5kaWYgLyogIWRlZmluZWQoRklYTVVMX1g4Nl9IKSAqLwpkaWZmIC0tZ2l0IGEvbGliRkRLL2luY2x1ZGUveDg2L2ZpeHBvaW50X21hdGhfeDg2LmggYi9saWJGREsvaW5jbHVkZS94ODYvZml4cG9pbnRfbWF0aF94ODYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODFmYjI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliRkRLL2luY2x1ZGUveDg2L2ZpeHBvaW50X21hdGhfeDg2LmgKQEAgLTAsMCArMSwyMDggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKKworICAgRGVzY3JpcHRpb246IEZpeGVkIHBvaW50IHNwZWNpZmljIG1hdGhlbWF0aWNhbCBmdW5jdGlvbnMgZm9yIHg4NgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIWRlZmluZWQoRklYUE9JTlRfTUFUSF9YODZfSCkKKyNkZWZpbmUgRklYUE9JTlRfTUFUSF9YODZfSAorCisjZGVmaW5lIEZVTkNUSU9OX3NxcnRGaXhwCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpZmRlZiBGVU5DVElPTl9zcXJ0Rml4cAorc3RhdGljIGlubGluZSBGSVhQX0RCTCBzcXJ0Rml4cChjb25zdCBGSVhQX0RCTCBvcCkgeworICBGSVhQX0RCTCByZXN1bHQ7CisgIC8qIHJlc3VsdCA9CisgICAqIChGSVhQX0RCTCkoSU5UKShzcXJ0KChkb3VibGUpKElOVClvcCkqNDYzNDAuOTUwMDExODQxNTc4NTU5MTMzNzM2MTE0OTAzKTsKKyAgICovCisgIHJlc3VsdCA9IChGSVhQX0RCTCkoSU5UKShzcXJ0KChmbG9hdCkoSU5UKW9wKSAqIDQ2MzQwLjk0OTJmKTsKKyAgRkRLX0FTU0VSVChyZXN1bHQgPj0gKEZJWFBfREJMKTApOworICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8qIEZVTkNUSU9OX3NxcnRGaXhwICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNkZWZpbmUgRlVOQ1RJT05faW52U3FydE5vcm0yCisvKioKKyAqIFxicmllZiBjYWxjdWxhdGUgMS4wL3NxcnQob3ApCisgKiBccGFyYW0gb3BfbSBtYW50aXNzYSBvZiBpbnB1dCB2YWx1ZS4KKyAqIFxwYXJhbSByZXN1bHRfZSBwb2ludGVyIHRvIHJldHVybiB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdAorICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CisgKi8KKyNpZmRlZiBGVU5DVElPTl9pbnZTcXJ0Tm9ybTIKK2lubGluZSBGSVhQX0RCTCBpbnZTcXJ0Tm9ybTIoRklYUF9EQkwgb3BfbSwgSU5UICpyZXN1bHRfZSkgeworICBmbG9hdCByZXN1bHQ7CisgIGlmIChvcF9tID09IChGSVhQX0RCTCkwKSB7CisgICAgKnJlc3VsdF9lID0gMTY7CisgICAgcmV0dXJuICgoTE9ORykweDdmZmZmZmZmKTsKKyAgfQorICByZXN1bHQgPSAoZmxvYXQpKDEuMCAvIHNxcnQoMC41ZiAqIChmbG9hdCkoSU5UKW9wX20pKTsKKyAgcmVzdWx0ID0gKGZsb2F0KWxkZXhwKGZyZXhwZihyZXN1bHQsIHJlc3VsdF9lKSwgREZSQUNUX0JJVFMgLSAxKTsKKyAgKnJlc3VsdF9lICs9IDE1OworCisgIEZES19BU1NFUlQocmVzdWx0ID49IDApOworICByZXR1cm4gKEZJWFBfREJMKShJTlQpcmVzdWx0OworfQorI2VuZGlmIC8qIEZVTkNUSU9OX2ludlNxcnROb3JtMiAqLworCisjZGVmaW5lIEZVTkNUSU9OX2ludkZpeHAKKy8qKgorICogXGJyaWVmIGNhbGN1bGF0ZSAxLjAvb3AKKyAqIFxwYXJhbSBvcCBtYW50aXNzYSBvZiB0aGUgaW5wdXQgdmFsdWUuCisgKiBccmV0dXJuIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQgd2l0aCBpbXBsaXppdCBleHBvbmVudCBvZiAzMQorICovCisjaWZkZWYgRlVOQ1RJT05faW52Rml4cAoraW5saW5lIEZJWFBfREJMIGludkZpeHAoRklYUF9EQkwgb3ApIHsKKyAgZmxvYXQgcmVzdWx0OworICBJTlQgcmVzdWx0X2U7CisgIGlmICgob3AgPT0gKEZJWFBfREJMKTApIHx8IChvcCA9PSAoRklYUF9EQkwpMSkpIHsKKyAgICByZXR1cm4gKChMT05HKTB4N2ZmZmZmZmYpOworICB9CisgIHJlc3VsdCA9IChmbG9hdCkoMS4wIC8gKGZsb2F0KShJTlQpb3ApOworICByZXN1bHQgPSBmcmV4cGYocmVzdWx0LCAmcmVzdWx0X2UpOworICByZXN1bHQgPSBsZGV4cGYocmVzdWx0LCAzMSArIHJlc3VsdF9lKTsKKworICByZXR1cm4gKEZJWFBfREJMKShJTlQpcmVzdWx0OworfQorCisvKioKKyAqIFxicmllZiBjYWxjdWxhdGUgMS4wLyhvcF9tICogMl5vcF9lKQorICogXHBhcmFtIG9wX20gbWFudGlzc2Egb2YgdGhlIGlucHV0IHZhbHVlLgorICogXHBhcmFtIG9wX2UgcG9pbnRlciBpbnRvIHdlcmUgdGhlIGV4cG9uZW50IG9mIHRoZSBpbnB1dCB2YWx1ZSBpcyBzdG9yZWQsIGFuZAorICogdGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZCBpbnRvLgorICogXHJldHVybiBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CisgKi8KK2lubGluZSBGSVhQX0RCTCBpbnZGaXhwKEZJWFBfREJMIG9wX20sIGludCAqb3BfZSkgeworICBmbG9hdCByZXN1bHQ7CisgIElOVCByZXN1bHRfZTsKKyAgaWYgKChvcF9tID09IChGSVhQX0RCTCkweDAwMDAwMDAwKSB8fCAob3BfbSA9PSAoRklYUF9EQkwpMHgwMDAwMDAwMSkpIHsKKyAgICAqb3BfZSA9IDMxIC0gKm9wX2U7CisgICAgcmV0dXJuICgoTE9ORykweDdmZmZmZmZmKTsKKyAgfQorICByZXN1bHQgPSAoZmxvYXQpKDEuMCAvIChmbG9hdCkoSU5UKW9wX20pOworICByZXN1bHQgPSBsZGV4cGYoZnJleHBmKHJlc3VsdCwgJnJlc3VsdF9lKSwgREZSQUNUX0JJVFMgLSAxKTsKKyAgKm9wX2UgPSByZXN1bHRfZSAtICpvcF9lICsgMzE7CisgIHJldHVybiAoRklYUF9EQkwpKElOVClyZXN1bHQ7Cit9CisjZW5kaWYgLyogRlVOQ1RJT05faW52Rml4cCAqLworCisjZGVmaW5lIEZVTkNUSU9OX3NjaHVyX2RpdgorLyoqCisgKiBcYnJpZWYgRGl2aWRlIHR3byBGSVhQX0RCTCB2YWx1ZXMgd2l0aCBnaXZlbiBwcmVjaXNpb24uCisgKiBccGFyYW0gbnVtIGRpdmlkZW5kCisgKiBccGFyYW0gZGVudW0gZGl2aXNvcgorICogXHBhcmFtIGNvdW50IGFtb3VudCBvZiBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSByZXN1bHQgKHN0YXJ0aW5nIHRvIHRoZSBNU0IpCisgKiBccmV0dXJuIG51bS9kaXZpc29yCisgKi8KKyNpZmRlZiBGVU5DVElPTl9zY2h1cl9kaXYKK2lubGluZSBGSVhQX0RCTCBzY2h1cl9kaXYoRklYUF9EQkwgbnVtLCBGSVhQX0RCTCBkZW51bSwgSU5UIGNvdW50KSB7CisgICh2b2lkKWNvdW50OworICAvKiBzYW1lIGFzc2VydHMgdGhhbiBmb3IgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gKi8KKyAgRkRLX0FTU0VSVChudW0gPj0gKEZJWFBfREJMKTApOworICBGREtfQVNTRVJUKGRlbnVtID4gKEZJWFBfREJMKTApOworICBGREtfQVNTRVJUKG51bSA8PSBkZW51bSk7CisKKyAgcmV0dXJuIChudW0gPT0gZGVudW0pID8gKEZJWFBfREJMKU1BWFZBTF9EQkwKKyAgICAgICAgICAgICAgICAgICAgICAgIDogKEZJWFBfREJMKShJTlQpKCgoSU5UNjQpKElOVCludW0gPDwgMzEpIC8gKElOVClkZW51bSk7Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fc2NodXJfZGl2ICovCisjZW5kaWYgLyogIWRlZmluZWQoRklYUE9JTlRfTUFUSF9YODZfSCkgKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9zcmMvRkRLX2JpdGJ1ZmZlci5jcHAgYi9saWJGREsvc3JjL0ZES19iaXRidWZmZXIuY3BwCmluZGV4IDY4MGNlYWUuLmE5OTBjNTggMTAwNjQ0Ci0tLSBhL2xpYkZESy9zcmMvRkRLX2JpdGJ1ZmZlci5jcHAKKysrIGIvbGliRkRLL3NyYy9GREtfYml0YnVmZmVyLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNjAgKzkwLDE1MiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIKKwogICAgRGVzY3JpcHRpb246IGNvbW1vbiBiaXRidWZmZXIgcmVhZC93cml0ZSByb3V0aW5lcwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiRkRLX2JpdGJ1ZmZlci5oIgogCi0KLQotCiAjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAjaW5jbHVkZSAiZml4bWlubWF4LmgiCiAKLWNvbnN0IFVJTlQgQml0TWFzayBbMzIrMV0gPQotewotICAgICAgICAgMHgwLCAgICAgICAgMHgxLCAgICAgICAgMHgzLCAgICAgICAgMHg3LAotICAgICAgICAgMHhmLCAgICAgICAweDFmLCAgICAgICAweDNmLCAgICAgICAweDdmLAotICAgICAgICAweGZmLCAgICAgIDB4MWZmLCAgICAgIDB4M2ZmLCAgICAgIDB4N2ZmLAotICAgICAgIDB4ZmZmLCAgICAgMHgxZmZmLCAgICAgMHgzZmZmLCAgICAgMHg3ZmZmLAotICAgICAgMHhmZmZmLCAgICAweDFmZmZmLCAgICAweDNmZmZmLCAgICAweDdmZmZmLAotICAgICAweGZmZmZmLCAgIDB4MWZmZmZmLCAgIDB4M2ZmZmZmLCAgIDB4N2ZmZmZmLAotICAgIDB4ZmZmZmZmLCAgMHgxZmZmZmZmLCAgMHgzZmZmZmZmLCAgMHg3ZmZmZmZmLAotICAgMHhmZmZmZmZmLCAweDFmZmZmZmZmLCAweDNmZmZmZmZmLCAweDdmZmZmZmZmLAotICAweGZmZmZmZmZmCi19OworY29uc3QgVUlOVCBCaXRNYXNrWzMyICsgMV0gPSB7CisgICAgMHgwLCAgICAgICAgMHgxLCAgICAgICAgMHgzLCAgICAgICAweDcsICAgICAgIDB4ZiwgICAgICAgMHgxZiwKKyAgICAweDNmLCAgICAgICAweDdmLCAgICAgICAweGZmLCAgICAgIDB4MWZmLCAgICAgMHgzZmYsICAgICAweDdmZiwKKyAgICAweGZmZiwgICAgICAweDFmZmYsICAgICAweDNmZmYsICAgIDB4N2ZmZiwgICAgMHhmZmZmLCAgICAweDFmZmZmLAorICAgIDB4M2ZmZmYsICAgIDB4N2ZmZmYsICAgIDB4ZmZmZmYsICAgMHgxZmZmZmYsICAweDNmZmZmZiwgIDB4N2ZmZmZmLAorICAgIDB4ZmZmZmZmLCAgIDB4MWZmZmZmZiwgIDB4M2ZmZmZmZiwgMHg3ZmZmZmZmLCAweGZmZmZmZmYsIDB4MWZmZmZmZmYsCisgICAgMHgzZmZmZmZmZiwgMHg3ZmZmZmZmZiwgMHhmZmZmZmZmZn07CiAKLWNvbnN0IFVJTlQgKmNvbnN0IFJFU1RSSUNUIHBCaXRNYXNrID0gQml0TWFzazsKK3ZvaWQgRkRLX0NyZWF0ZUJpdEJ1ZmZlcihIQU5ETEVfRkRLX0JJVEJVRiAqaEJpdEJ1ZiwgVUNIQVIgKnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBidWZTaXplKSB7CisgIEZES19Jbml0Qml0QnVmZmVyKCpoQml0QnVmLCBwQnVmZmVyLCBidWZTaXplLCAwKTsKIAotdm9pZCBGREtfQ3JlYXRlQml0QnVmZmVyIChIQU5ETEVfRkRLX0JJVEJVRiAqaEJpdEJ1ZiwgVUNIQVIgKnBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYnVmU2l6ZSkKLXsKLSAgIEZES19Jbml0Qml0QnVmZmVyICgqaEJpdEJ1ZiwgcEJ1ZmZlciwgYnVmU2l6ZSwgMCk7Ci0KLSAgIEZES21lbWNsZWFyKCgqaEJpdEJ1ZiktPkJ1ZmZlciwgYnVmU2l6ZSpzaXplb2YoVUNIQVIpKTsKKyAgRkRLbWVtY2xlYXIoKCpoQml0QnVmKS0+QnVmZmVyLCBidWZTaXplICogc2l6ZW9mKFVDSEFSKSk7CiB9CiAKLXZvaWQgRkRLX0RlbGV0ZUJpdEJ1ZmZlciAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZikgeyA7IH0KK3ZvaWQgRkRLX0RlbGV0ZUJpdEJ1ZmZlcihIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmKSB7IDsgfQogCi12b2lkIEZES19Jbml0Qml0QnVmZmVyIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBVQ0hBUiAqcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYnVmU2l6ZSwgVUlOVCB2YWxpZEJpdHMpCi17Ci0gICBoQml0QnVmLT5WYWxpZEJpdHMgICA9IHZhbGlkQml0cyA7Ci0gICBoQml0QnVmLT5SZWFkT2Zmc2V0ICA9IDAgOwotICAgaEJpdEJ1Zi0+V3JpdGVPZmZzZXQgPSAwIDsKLSAgIGhCaXRCdWYtPkJpdENudCAgICAgID0gMCA7Ci0gICBoQml0QnVmLT5CaXROZHggICAgICA9IDAgOwordm9pZCBGREtfSW5pdEJpdEJ1ZmZlcihIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBVQ0hBUiAqcEJ1ZmZlciwgVUlOVCBidWZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHZhbGlkQml0cykgeworICBoQml0QnVmLT5WYWxpZEJpdHMgPSB2YWxpZEJpdHM7CisgIGhCaXRCdWYtPlJlYWRPZmZzZXQgPSAwOworICBoQml0QnVmLT5Xcml0ZU9mZnNldCA9IDA7CisgIGhCaXRCdWYtPkJpdENudCA9IDA7CisgIGhCaXRCdWYtPkJpdE5keCA9IDA7CiAKLSAgIGhCaXRCdWYtPkJ1ZmZlciAgICAgID0gcEJ1ZmZlciA7Ci0gICBoQml0QnVmLT5idWZTaXplICAgICA9IGJ1ZlNpemUgOwotICAgaEJpdEJ1Zi0+YnVmQml0cyAgICAgPSAoYnVmU2l6ZSA8PCAzKSA7Ci0jaWYgZGVmaW5lZChGREtfREVCVUcpIHx8IGRlZmluZWQoREVCVUcpCi0gICAvKmFzc3VyZSBidWZzaXplICgyXm4pICovCi0gICBpZiAoYnVmU2l6ZSE9MCkgewotICAgICBVSU5UIHggPSAwLCBuPWJ1ZlNpemU7Ci0gICAgIGZvciAoeD0wOyBuPjA7IHgrKyxuPj49MSkge30KLSAgICAgaWYgKCBidWZTaXplICE9ICgxPDwoeC0xKSkgKSB7Ci0gICAgICAgRkRLcHJpbnRmRXJyKCJFcnJvcjogYnVmU2l6ZWluIEZES19Jbml0Qml0QnVmZmVyKCkgIT0gKDJebiksICVkXG4iLCBidWZTaXplKTsKLSAgICAgfQotICAgfQotI2VuZGlmCi19Ci0KLXZvaWQgRkRLX1Jlc2V0Qml0QnVmZmVyICggSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiApCi17Ci0gICBoQml0QnVmLT5WYWxpZEJpdHMgICA9IDAgOwotICAgaEJpdEJ1Zi0+UmVhZE9mZnNldCAgPSAwIDsKLSAgIGhCaXRCdWYtPldyaXRlT2Zmc2V0ID0gMCA7Ci0gICBoQml0QnVmLT5CaXRDbnQgICAgICA9IDAgOwotICAgaEJpdEJ1Zi0+Qml0TmR4ICAgICAgPSAwIDsKLX0KLQotSU5UICBGREtfZ2V0IChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBjb25zdCBVSU5UIG51bWJlck9mQml0cykKLXsKLSAgVUlOVCBieXRlT2Zmc2V0ID0gaEJpdEJ1Zi0+Qml0TmR4ID4+IDMgOwotICBVSU5UIGJpdE9mZnNldCAgPSBoQml0QnVmLT5CaXROZHggJiAweDA3IDsKLQotICBoQml0QnVmLT5CaXROZHggICAgID0gKGhCaXRCdWYtPkJpdE5keCArIG51bWJlck9mQml0cykgJiAoaEJpdEJ1Zi0+YnVmQml0cyAtIDEpIDsKLSAgaEJpdEJ1Zi0+Qml0Q250ICAgICs9ICBudW1iZXJPZkJpdHMgOwotICBoQml0QnVmLT5WYWxpZEJpdHMgLT0gIG51bWJlck9mQml0cyA7Ci0KLSAgVUlOVCBieXRlTWFzayA9IGhCaXRCdWYtPmJ1ZlNpemUgLSAxIDsKLQotICBVSU5UIHR4ID0gKGhCaXRCdWYtPkJ1ZmZlciBbIGJ5dGVPZmZzZXQgICAgJiBieXRlTWFza10gPDwgMjQpIHwKLSAgICAgICAgICAgIChoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzEpICYgYnl0ZU1hc2tdIDw8IDE2KSB8Ci0gICAgICAgICAgICAoaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldCsyKSAmIGJ5dGVNYXNrXSA8PCAgOCkgfAotICAgICAgICAgICAgIGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQrMykgJiBieXRlTWFza107Ci0KLSAgaWYgKGJpdE9mZnNldCkKKyAgaEJpdEJ1Zi0+QnVmZmVyID0gcEJ1ZmZlcjsKKyAgaEJpdEJ1Zi0+YnVmU2l6ZSA9IGJ1ZlNpemU7CisgIGhCaXRCdWYtPmJ1ZkJpdHMgPSAoYnVmU2l6ZSA8PCAzKTsKKyAgLyphc3N1cmUgYnVmc2l6ZSAoMl5uKSAqLworICBGREtfQVNTRVJUKGhCaXRCdWYtPlZhbGlkQml0cyA8PSBoQml0QnVmLT5idWZCaXRzKTsKKyAgRkRLX0FTU0VSVCgoYnVmU2l6ZSA+IDApICYmIChidWZTaXplIDw9IE1BWF9CVUZTSVpFX0JZVEVTKSk7CiAgIHsKLSAgICB0eCA8PD0gYml0T2Zmc2V0OwotICAgIHR4IHw9IGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQrNCkgJiBieXRlTWFza10gPj4gKDgtYml0T2Zmc2V0KTsKLSAgfQotCi0gIHJldHVybiAodHggPj4gKDMyIC0gbnVtYmVyT2ZCaXRzKSkgOwotfQotCi1JTlQgRkRLX2dldDMyIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmKQotewotICBVSU5UIEJpdE5keCA9IGhCaXRCdWYtPkJpdE5keCArIDMyOwotICBpZiAoQml0TmR4IDw9IGhCaXRCdWYtPmJ1ZkJpdHMpCi0gIHsKLSAgICBoQml0QnVmLT5CaXROZHggPSBCaXROZHg7Ci0gICAgaEJpdEJ1Zi0+Qml0Q250ICs9ICAzMjsKLSAgICBoQml0QnVmLT5WYWxpZEJpdHMgLT0gMzI7Ci0KLSAgICBVSU5UIGJ5dGVPZmZzZXQgPSAoQml0TmR4LTEpID4+IDM7Ci0gICAgVUlOVCBjYWNoZSA9IChoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQtMyldIDw8IDI0KSB8Ci0gICAgICAgICAgICAgICAgIChoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQtMildIDw8IDE2KSB8Ci0gICAgICAgICAgICAgICAgIChoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQtMSldIDw8ICA4KSB8Ci0gICAgICAgICAgICAgICAgICBoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQtMCldOwotCi0gICAgaWYgKCAoQml0TmR4ID0gKEJpdE5keCY3KSkgIT0gMCApIHsKLSAgICAgIGNhY2hlID0gKGNhY2hlID4+ICg4LUJpdE5keCkpIHwgKChVSU5UKWhCaXRCdWYtPkJ1ZmZlciBbYnl0ZU9mZnNldC00XSA8PCAoMjQrQml0TmR4KSk7CisgICAgVUlOVCB4ID0gMCwgbiA9IGJ1ZlNpemU7CisgICAgZm9yICh4ID0gMDsgbiA+IDA7IHgrKywgbiA+Pj0gMSkgewogICAgIH0KLSAgICByZXR1cm4gKGNhY2hlKSA7CisgICAgaWYgKGJ1ZlNpemUgIT0gKChVSU5UKTEgPDwgKHggLSAxKSkpIHsKKyAgICAgIEZES19BU1NFUlQoMCk7CisgICAgfQogICB9Ci0gIGVsc2UKLSAgewotICAgIC8qIGV4b3RpYyBwYXRoLCB1c2VkIG9ubHkgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCB3aGVuIHdyYXBwaW5nIGFyb3VuZCAqLwotICAgIGludCBuQml0cyA9IChJTlQpaEJpdEJ1Zi0+YnVmQml0cy0oSU5UKWhCaXRCdWYtPkJpdE5keDsKK30KIAotICAgIFVJTlQgY2FjaGUgPSBGREtfZ2V0IChoQml0QnVmLG5CaXRzKTw8ICgzMi1uQml0cyk7Ci0gICAgY2FjaGUgfD0gKEZES19nZXQgKGhCaXRCdWYsMzItbkJpdHMpKTsKK3ZvaWQgRkRLX1Jlc2V0Qml0QnVmZmVyKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYpIHsKKyAgaEJpdEJ1Zi0+VmFsaWRCaXRzID0gMDsKKyAgaEJpdEJ1Zi0+UmVhZE9mZnNldCA9IDA7CisgIGhCaXRCdWYtPldyaXRlT2Zmc2V0ID0gMDsKKyAgaEJpdEJ1Zi0+Qml0Q250ID0gMDsKKyAgaEJpdEJ1Zi0+Qml0TmR4ID0gMDsKK30KKworI2lmbmRlZiBGVU5DVElPTl9GREtfZ2V0CitJTlQgRkRLX2dldChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBjb25zdCBVSU5UIG51bWJlck9mQml0cykgeworICBVSU5UIGJ5dGVPZmZzZXQgPSBoQml0QnVmLT5CaXROZHggPj4gMzsKKyAgVUlOVCBiaXRPZmZzZXQgPSBoQml0QnVmLT5CaXROZHggJiAweDA3OworCisgIGhCaXRCdWYtPkJpdE5keCA9IChoQml0QnVmLT5CaXROZHggKyBudW1iZXJPZkJpdHMpICYgKGhCaXRCdWYtPmJ1ZkJpdHMgLSAxKTsKKyAgaEJpdEJ1Zi0+Qml0Q250ICs9IG51bWJlck9mQml0czsKKyAgaEJpdEJ1Zi0+VmFsaWRCaXRzIC09IG51bWJlck9mQml0czsKKworICBVSU5UIGJ5dGVNYXNrID0gaEJpdEJ1Zi0+YnVmU2l6ZSAtIDE7CisKKyAgVUlOVCB0eCA9IChoQml0QnVmLT5CdWZmZXJbYnl0ZU9mZnNldCAmIGJ5dGVNYXNrXSA8PCAyNCkgfAorICAgICAgICAgICAgKGhCaXRCdWYtPkJ1ZmZlclsoYnl0ZU9mZnNldCArIDEpICYgYnl0ZU1hc2tdIDw8IDE2KSB8CisgICAgICAgICAgICAoaEJpdEJ1Zi0+QnVmZmVyWyhieXRlT2Zmc2V0ICsgMikgJiBieXRlTWFza10gPDwgOCkgfAorICAgICAgICAgICAgaEJpdEJ1Zi0+QnVmZmVyWyhieXRlT2Zmc2V0ICsgMykgJiBieXRlTWFza107CisKKyAgaWYgKGJpdE9mZnNldCkgeworICAgIHR4IDw8PSBiaXRPZmZzZXQ7CisgICAgdHggfD0gaEJpdEJ1Zi0+QnVmZmVyWyhieXRlT2Zmc2V0ICsgNCkgJiBieXRlTWFza10gPj4gKDggLSBiaXRPZmZzZXQpOworICB9CisKKyAgcmV0dXJuICh0eCA+PiAoMzIgLSBudW1iZXJPZkJpdHMpKTsKK30KKyNlbmRpZiAvKiAjaWZuZGVmIEZVTkNUSU9OX0ZES19nZXQgKi8KKworI2lmbmRlZiBGVU5DVElPTl9GREtfZ2V0MzIKK0lOVCBGREtfZ2V0MzIoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZikgeworICBVSU5UIEJpdE5keCA9IGhCaXRCdWYtPkJpdE5keCArIDMyOworICBoQml0QnVmLT5CaXROZHggPSBCaXROZHggJiAoaEJpdEJ1Zi0+YnVmQml0cyAtIDEpOworICBoQml0QnVmLT5CaXRDbnQgKz0gMzI7CisgIGhCaXRCdWYtPlZhbGlkQml0cyA9IChVSU5UKSgoSU5UKWhCaXRCdWYtPlZhbGlkQml0cyAtIChJTlQpMzIpOworCisgIFVJTlQgYnl0ZU9mZnNldCA9IChCaXROZHggLSAxKSA+PiAzOworICBpZiAoQml0TmR4IDw9IGhCaXRCdWYtPmJ1ZkJpdHMpIHsKKyAgICBVSU5UIGNhY2hlID0gKGhCaXRCdWYtPkJ1ZmZlclsoYnl0ZU9mZnNldCAtIDMpXSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICAoaEJpdEJ1Zi0+QnVmZmVyWyhieXRlT2Zmc2V0IC0gMildIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgIChoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQgLSAxKV0gPDwgOCkgfAorICAgICAgICAgICAgICAgICBoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQgLSAwKV07CisKKyAgICBpZiAoKEJpdE5keCA9IChCaXROZHggJiA3KSkgIT0gMCkgeworICAgICAgY2FjaGUgPSAoY2FjaGUgPj4gKDggLSBCaXROZHgpKSB8CisgICAgICAgICAgICAgICgoVUlOVCloQml0QnVmLT5CdWZmZXJbYnl0ZU9mZnNldCAtIDRdIDw8ICgyNCArIEJpdE5keCkpOworICAgIH0KKyAgICByZXR1cm4gKGNhY2hlKTsKKyAgfSBlbHNlIHsKKyAgICBVSU5UIGJ5dGVfbWFzayA9IGhCaXRCdWYtPmJ1ZlNpemUgLSAxOworICAgIFVJTlQgY2FjaGUgPSAoaEJpdEJ1Zi0+QnVmZmVyWyhieXRlT2Zmc2V0IC0gMykgJiBieXRlX21hc2tdIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgIChoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQgLSAyKSAmIGJ5dGVfbWFza10gPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgKGhCaXRCdWYtPkJ1ZmZlclsoYnl0ZU9mZnNldCAtIDEpICYgYnl0ZV9tYXNrXSA8PCA4KSB8CisgICAgICAgICAgICAgICAgIGhCaXRCdWYtPkJ1ZmZlclsoYnl0ZU9mZnNldCAtIDApICYgYnl0ZV9tYXNrXTsKKworICAgIGlmICgoQml0TmR4ID0gKEJpdE5keCAmIDcpKSAhPSAwKSB7CisgICAgICBjYWNoZSA9IChjYWNoZSA+PiAoOCAtIEJpdE5keCkpIHwKKyAgICAgICAgICAgICAgKChVSU5UKWhCaXRCdWYtPkJ1ZmZlclsoYnl0ZU9mZnNldCAtIDQpICYgYnl0ZV9tYXNrXQorICAgICAgICAgICAgICAgPDwgKDI0ICsgQml0TmR4KSk7CisgICAgfQogICAgIHJldHVybiAoY2FjaGUpOwogICB9CiB9CisjZW5kaWYKIAotSU5UIEZES19nZXRCd2QgKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYsIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKQotewotICBVSU5UIGJ5dGVPZmZzZXQgPSBoQml0QnVmLT5CaXROZHggPj4gMyA7Ci0gIFVJTlQgYml0T2Zmc2V0ICA9IGhCaXRCdWYtPkJpdE5keCAmIDB4MDcgOwotICBVSU5UIGJ5dGVNYXNrICAgPSBoQml0QnVmLT5idWZTaXplIC0gMSA7CitJTlQgRkRLX2dldEJ3ZChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBjb25zdCBVSU5UIG51bWJlck9mQml0cykgeworICBVSU5UIGJ5dGVPZmZzZXQgPSBoQml0QnVmLT5CaXROZHggPj4gMzsKKyAgVUlOVCBiaXRPZmZzZXQgPSBoQml0QnVmLT5CaXROZHggJiAweDA3OworICBVSU5UIGJ5dGVNYXNrID0gaEJpdEJ1Zi0+YnVmU2l6ZSAtIDE7CiAgIGludCBpOwogCi0gIGhCaXRCdWYtPkJpdE5keCAgICAgPSAoaEJpdEJ1Zi0+Qml0TmR4IC0gbnVtYmVyT2ZCaXRzKSAmIChoQml0QnVmLT5idWZCaXRzIC0gMSkgOwotICBoQml0QnVmLT5CaXRDbnQgICAgLT0gIG51bWJlck9mQml0cyA7Ci0gIGhCaXRCdWYtPlZhbGlkQml0cyArPSAgbnVtYmVyT2ZCaXRzIDsKKyAgaEJpdEJ1Zi0+Qml0TmR4ID0gKGhCaXRCdWYtPkJpdE5keCAtIG51bWJlck9mQml0cykgJiAoaEJpdEJ1Zi0+YnVmQml0cyAtIDEpOworICBoQml0QnVmLT5CaXRDbnQgLT0gbnVtYmVyT2ZCaXRzOworICBoQml0QnVmLT5WYWxpZEJpdHMgKz0gbnVtYmVyT2ZCaXRzOwogCi0gIFVJTlQgdHggPSBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0LTMpICYgYnl0ZU1hc2tdIDw8IDI0IHwKLSAgICAgICAgICAgIGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQtMikgJiBieXRlTWFza10gPDwgMTYgfAotICAgICAgICAgICAgaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldC0xKSAmIGJ5dGVNYXNrXSA8PCAgOCB8Ci0gICAgICAgICAgICBoQml0QnVmLT5CdWZmZXIgWyBieXRlT2Zmc2V0ICAgICYgYnl0ZU1hc2tdIDsKKyAgVUlOVCB0eCA9IGhCaXRCdWYtPkJ1ZmZlclsoYnl0ZU9mZnNldCAtIDMpICYgYnl0ZU1hc2tdIDw8IDI0IHwKKyAgICAgICAgICAgIGhCaXRCdWYtPkJ1ZmZlclsoYnl0ZU9mZnNldCAtIDIpICYgYnl0ZU1hc2tdIDw8IDE2IHwKKyAgICAgICAgICAgIGhCaXRCdWYtPkJ1ZmZlclsoYnl0ZU9mZnNldCAtIDEpICYgYnl0ZU1hc2tdIDw8IDggfAorICAgICAgICAgICAgaEJpdEJ1Zi0+QnVmZmVyW2J5dGVPZmZzZXQgJiBieXRlTWFza107CiAgIFVJTlQgdHhhID0gMHgwOwogCi0gIHR4ID4+PSAoOCAtIGJpdE9mZnNldCkgOworICB0eCA+Pj0gKDggLSBiaXRPZmZzZXQpOwogCi0gIGlmIChiaXRPZmZzZXQgJiYgbnVtYmVyT2ZCaXRzID4gMjQpCi0gIHsKLSAgICB0eCB8PSBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0LTQpICYgYnl0ZU1hc2tdIDw8ICgyNCArIGJpdE9mZnNldCkgOworICBpZiAoYml0T2Zmc2V0ICYmIG51bWJlck9mQml0cyA+IDI0KSB7CisgICAgdHggfD0gaEJpdEJ1Zi0+QnVmZmVyWyhieXRlT2Zmc2V0IC0gNCkgJiBieXRlTWFza10gPDwgKDI0ICsgYml0T2Zmc2V0KTsKICAgfQogCiAgIC8qIGluIHBsYWNlIHR1cm4gYXJvdW5kICovCkBAIC0yNDAsMjQxICsyNDMsMjc2IEBACiAgICAgVUlOVCBiaXRNYXNrUiA9IDB4MDAwMDAwMDEgPDwgaTsKICAgICBVSU5UIGJpdE1hc2tMID0gMHg4MDAwMDAwMCA+PiBpOwogCi0gICAgdHhhIHw9ICh0eCAmIGJpdE1hc2tSKSA8PCAoMzEgLSAoaTw8MSkpOwotICAgIHR4YSB8PSAodHggJiBiaXRNYXNrTCkgPj4gKDMxIC0gKGk8PDEpKTsKKyAgICB0eGEgfD0gKHR4ICYgYml0TWFza1IpIDw8ICgzMSAtIChpIDw8IDEpKTsKKyAgICB0eGEgfD0gKHR4ICYgYml0TWFza0wpID4+ICgzMSAtIChpIDw8IDEpKTsKICAgfQogCi0gIHJldHVybiAodHhhID4+ICgzMiAtIG51bWJlck9mQml0cykpIDsKKyAgcmV0dXJuICh0eGEgPj4gKDMyIC0gbnVtYmVyT2ZCaXRzKSk7CiB9CiAKLXZvaWQgRkRLX3B1dCAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiwgVUlOVCB2YWx1ZSwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpCi17Ci0gIFVJTlQgYnl0ZU9mZnNldCA9IGhCaXRCdWYtPkJpdE5keCA+PiAzIDsKLSAgVUlOVCBiaXRPZmZzZXQgID0gaEJpdEJ1Zi0+Qml0TmR4ICYgMHgwNyA7Cit2b2lkIEZES19wdXQoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiwgVUlOVCB2YWx1ZSwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpIHsKKyAgaWYgKG51bWJlck9mQml0cyAhPSAwKSB7CisgICAgVUlOVCBieXRlT2Zmc2V0MCA9IGhCaXRCdWYtPkJpdE5keCA+PiAzOworICAgIFVJTlQgYml0T2Zmc2V0ID0gaEJpdEJ1Zi0+Qml0TmR4ICYgMHg3OwogCi0gIGhCaXRCdWYtPkJpdE5keCAgICAgPSAoaEJpdEJ1Zi0+Qml0TmR4ICsgbnVtYmVyT2ZCaXRzKSAmIChoQml0QnVmLT5idWZCaXRzIC0gMSkgOwotICBoQml0QnVmLT5CaXRDbnQgICAgKz0gIG51bWJlck9mQml0cyA7Ci0gIGhCaXRCdWYtPlZhbGlkQml0cyArPSAgbnVtYmVyT2ZCaXRzIDsKKyAgICBoQml0QnVmLT5CaXROZHggPSAoaEJpdEJ1Zi0+Qml0TmR4ICsgbnVtYmVyT2ZCaXRzKSAmIChoQml0QnVmLT5idWZCaXRzIC0gMSk7CisgICAgaEJpdEJ1Zi0+Qml0Q250ICs9IG51bWJlck9mQml0czsKKyAgICBoQml0QnVmLT5WYWxpZEJpdHMgKz0gbnVtYmVyT2ZCaXRzOwogCi0gIFVJTlQgYnl0ZU1hc2sgPSBoQml0QnVmLT5idWZTaXplIC0gMSA7CisgICAgVUlOVCBieXRlTWFzayA9IGhCaXRCdWYtPmJ1ZlNpemUgLSAxOwogCi0gIFVJTlQgdG1wICA9IHZhbHVlPDwoMzItbnVtYmVyT2ZCaXRzKT4+Yml0T2Zmc2V0OwotICBVSU5UIG1hc2sgPSB+Qml0TWFza1soMzItYml0T2Zmc2V0KV0gfCAoQml0TWFzayBbKDMyLW51bWJlck9mQml0cyldID4+IGJpdE9mZnNldCkgOworICAgIFVJTlQgYnl0ZU9mZnNldDEgPSAoYnl0ZU9mZnNldDAgKyAxKSAmIGJ5dGVNYXNrOworICAgIFVJTlQgYnl0ZU9mZnNldDIgPSAoYnl0ZU9mZnNldDAgKyAyKSAmIGJ5dGVNYXNrOworICAgIFVJTlQgYnl0ZU9mZnNldDMgPSAoYnl0ZU9mZnNldDAgKyAzKSAmIGJ5dGVNYXNrOwogCi0gIGhCaXRCdWYtPkJ1ZmZlciBbIGJ5dGVPZmZzZXQgICAgJiBieXRlTWFza10gID0gKGhCaXRCdWYtPkJ1ZmZlciBbIGJ5dGVPZmZzZXQgICAgJiBieXRlTWFza10mKG1hc2s+PjI0KSkgfCAoVUNIQVIpKHRtcD4+MjQpOwotICBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzEpICYgYnl0ZU1hc2tdICA9IChoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzEpICYgYnl0ZU1hc2tdJihtYXNrPj4xNikpIHwgKFVDSEFSKSh0bXA+PjE2KTsKLSAgaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldCsyKSAmIGJ5dGVNYXNrXSAgPSAoaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldCsyKSAmIGJ5dGVNYXNrXSYobWFzaz4+OCkpICB8IChVQ0hBUikodG1wPj44KTsKLSAgaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldCszKSAmIGJ5dGVNYXNrXSAgPSAoaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldCszKSAmIGJ5dGVNYXNrXSYobWFzaykpICAgICB8IChVQ0hBUikodG1wKTsKKyAgICAvLyBDcmVhdGUgdG1wIGNvbnRhaW5pbmcgZnJlZSBiaXRzIGF0IHRoZSBsZWZ0IGJvcmRlciBmb2xsb3dlZCBieSBiaXRzIHRvCisgICAgLy8gd3JpdGUsIExTQidzIGFyZSBjbGVhcmVkLCBpZiBhdmFpbGFibGUgQ3JlYXRlIG1hc2sgdG8gYXBwbHkgdXBvbiBhbGwKKyAgICAvLyBidWZmZXIgYnl0ZXMKKyAgICBVSU5UIHRtcCA9ICh2YWx1ZSA8PCAoMzIgLSBudW1iZXJPZkJpdHMpKSA+PiBiaXRPZmZzZXQ7CisgICAgVUlOVCBtYXNrID0gfigoQml0TWFza1tudW1iZXJPZkJpdHNdIDw8ICgzMiAtIG51bWJlck9mQml0cykpID4+IGJpdE9mZnNldCk7CiAKLSAgaWYgKGJpdE9mZnNldCAmJiBudW1iZXJPZkJpdHMgPiAyNCkKLSAgewotICAgIGhCaXRCdWYtPkJ1ZmZlciBbKGJ5dGVPZmZzZXQrNCkgJiBieXRlTWFza10gID0gKFVDSEFSKSh2YWx1ZTw8KDQwLW51bWJlck9mQml0cyk+PmJpdE9mZnNldCkgfAotICAgICAgICAgICAgICAgKCBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0KzQpICYgYnl0ZU1hc2tdICYgQml0TWFza1soNDAtbnVtYmVyT2ZCaXRzLWJpdE9mZnNldCldICkgOworICAgIC8vIHJlYWQgYWxsIDQgYnl0ZXMgZnJvbSBidWZmZXIgYW5kIGNyZWF0ZSBhIDMyLWJpdCBjYWNoZQorICAgIFVJTlQgY2FjaGUgPSAoKChVSU5UKWhCaXRCdWYtPkJ1ZmZlcltieXRlT2Zmc2V0MF0pIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgICgoKFVJTlQpaEJpdEJ1Zi0+QnVmZmVyW2J5dGVPZmZzZXQxXSkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgKCgoVUlOVCloQml0QnVmLT5CdWZmZXJbYnl0ZU9mZnNldDJdKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICgoKFVJTlQpaEJpdEJ1Zi0+QnVmZmVyW2J5dGVPZmZzZXQzXSkgPDwgMCk7CisKKyAgICBjYWNoZSA9IChjYWNoZSAmIG1hc2spIHwgdG1wOworICAgIGhCaXRCdWYtPkJ1ZmZlcltieXRlT2Zmc2V0MF0gPSAoVUNIQVIpKGNhY2hlID4+IDI0KTsKKyAgICBoQml0QnVmLT5CdWZmZXJbYnl0ZU9mZnNldDFdID0gKFVDSEFSKShjYWNoZSA+PiAxNik7CisgICAgaEJpdEJ1Zi0+QnVmZmVyW2J5dGVPZmZzZXQyXSA9IChVQ0hBUikoY2FjaGUgPj4gOCk7CisgICAgaEJpdEJ1Zi0+QnVmZmVyW2J5dGVPZmZzZXQzXSA9IChVQ0hBUikoY2FjaGUgPj4gMCk7CisKKyAgICBpZiAoKGJpdE9mZnNldCArIG51bWJlck9mQml0cykgPiAzMikgeworICAgICAgVUlOVCBieXRlT2Zmc2V0NCA9IChieXRlT2Zmc2V0MCArIDQpICYgYnl0ZU1hc2s7CisgICAgICAvLyByZW1haW5pbmcgYml0czogaW4gcmFuZ2UgMS4uNworICAgICAgLy8gcmVwbGFjZSBNU0JpdHMgb2YgbmV4dCBieXRlIGluIGJ1ZmZlciBieSBMU0JpdHMgb2YgInZhbHVlIgorICAgICAgaW50IGJpdHMgPSAoYml0T2Zmc2V0ICsgbnVtYmVyT2ZCaXRzKSAmIDc7CisgICAgICBjYWNoZSA9CisgICAgICAgICAgKFVJTlQpaEJpdEJ1Zi0+QnVmZmVyW2J5dGVPZmZzZXQ0XSAmICh+KEJpdE1hc2tbYml0c10gPDwgKDggLSBiaXRzKSkpOworICAgICAgY2FjaGUgfD0gdmFsdWUgPDwgKDggLSBiaXRzKTsKKyAgICAgIGhCaXRCdWYtPkJ1ZmZlcltieXRlT2Zmc2V0NF0gPSAoVUNIQVIpY2FjaGU7CisgICAgfQogICB9CiB9CiAKLXZvaWQgRkRLX3B1dEJ3ZCAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiwgVUlOVCB2YWx1ZSwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpCi17Ci0gIFVJTlQgYnl0ZU9mZnNldCA9IGhCaXRCdWYtPkJpdE5keCA+PiAzIDsKLSAgVUlOVCBiaXRPZmZzZXQgID0gNyAtIChoQml0QnVmLT5CaXROZHggJiAweDA3KSA7Ci0gIFVJTlQgYnl0ZU1hc2sgICA9IGhCaXRCdWYtPmJ1ZlNpemUgLSAxIDsKK3ZvaWQgRkRLX3B1dEJ3ZChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBVSU5UIHZhbHVlLAorICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbnVtYmVyT2ZCaXRzKSB7CisgIFVJTlQgYnl0ZU9mZnNldCA9IGhCaXRCdWYtPkJpdE5keCA+PiAzOworICBVSU5UIGJpdE9mZnNldCA9IDcgLSAoaEJpdEJ1Zi0+Qml0TmR4ICYgMHgwNyk7CisgIFVJTlQgYnl0ZU1hc2sgPSBoQml0QnVmLT5idWZTaXplIC0gMTsKIAotICBVSU5UIG1hc2sgPSB+KEJpdE1hc2tbbnVtYmVyT2ZCaXRzXSA8PCBiaXRPZmZzZXQpIDsKKyAgVUlOVCBtYXNrID0gfihCaXRNYXNrW251bWJlck9mQml0c10gPDwgYml0T2Zmc2V0KTsKICAgVUlOVCB0bXAgPSAweDAwMDA7Ci0gIGludCAgaTsKKyAgaW50IGk7CiAKLSAgaEJpdEJ1Zi0+Qml0TmR4ICAgICA9IChoQml0QnVmLT5CaXROZHggLSBudW1iZXJPZkJpdHMpICYgKGhCaXRCdWYtPmJ1ZkJpdHMgLSAxKSA7Ci0gIGhCaXRCdWYtPkJpdENudCAgICAtPSAgbnVtYmVyT2ZCaXRzIDsKLSAgaEJpdEJ1Zi0+VmFsaWRCaXRzIC09ICBudW1iZXJPZkJpdHMgOworICBoQml0QnVmLT5CaXROZHggPSAoaEJpdEJ1Zi0+Qml0TmR4IC0gbnVtYmVyT2ZCaXRzKSAmIChoQml0QnVmLT5idWZCaXRzIC0gMSk7CisgIGhCaXRCdWYtPkJpdENudCAtPSBudW1iZXJPZkJpdHM7CisgIGhCaXRCdWYtPlZhbGlkQml0cyAtPSBudW1iZXJPZkJpdHM7CiAKICAgLyogaW4gcGxhY2UgdHVybiBhcm91bmQgKi8KICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKICAgICBVSU5UIGJpdE1hc2tSID0gMHgwMDAwMDAwMSA8PCBpOwogICAgIFVJTlQgYml0TWFza0wgPSAweDgwMDAwMDAwID4+IGk7CiAKLSAgICB0bXAgfD0gKHZhbHVlICYgYml0TWFza1IpIDw8ICgzMSAtIChpPDwxKSk7Ci0gICAgdG1wIHw9ICh2YWx1ZSAmIGJpdE1hc2tMKSA+PiAoMzEgLSAoaTw8MSkpOworICAgIHRtcCB8PSAodmFsdWUgJiBiaXRNYXNrUikgPDwgKDMxIC0gKGkgPDwgMSkpOworICAgIHRtcCB8PSAodmFsdWUgJiBiaXRNYXNrTCkgPj4gKDMxIC0gKGkgPDwgMSkpOwogICB9CiAgIHZhbHVlID0gdG1wOwotICB0bXAgICA9IHZhbHVlPj4oMzItbnVtYmVyT2ZCaXRzKTw8Yml0T2Zmc2V0OworICB0bXAgPSB2YWx1ZSA+PiAoMzIgLSBudW1iZXJPZkJpdHMpIDw8IGJpdE9mZnNldDsKIAotICBoQml0QnVmLT5CdWZmZXIgWyBieXRlT2Zmc2V0ICAgICYgYnl0ZU1hc2tdICA9IChoQml0QnVmLT5CdWZmZXIgWyBieXRlT2Zmc2V0ICAgICYgYnl0ZU1hc2tdJihtYXNrKSkgICAgIHwgKFVDSEFSKSh0bXApOwotICBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0LTEpICYgYnl0ZU1hc2tdICA9IChoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0LTEpICYgYnl0ZU1hc2tdJihtYXNrPj44KSkgIHwgKFVDSEFSKSh0bXA+PjgpOwotICBoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0LTIpICYgYnl0ZU1hc2tdICA9IChoQml0QnVmLT5CdWZmZXIgWyhieXRlT2Zmc2V0LTIpICYgYnl0ZU1hc2tdJihtYXNrPj4xNikpIHwgKFVDSEFSKSh0bXA+PjE2KTsKLSAgaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldC0zKSAmIGJ5dGVNYXNrXSAgPSAoaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldC0zKSAmIGJ5dGVNYXNrXSYobWFzaz4+MjQpKSB8IChVQ0hBUikodG1wPj4yNCk7CisgIGhCaXRCdWYtPkJ1ZmZlcltieXRlT2Zmc2V0ICYgYnl0ZU1hc2tdID0KKyAgICAgIChoQml0QnVmLT5CdWZmZXJbYnl0ZU9mZnNldCAmIGJ5dGVNYXNrXSAmIChtYXNrKSkgfCAoVUNIQVIpKHRtcCk7CisgIGhCaXRCdWYtPkJ1ZmZlclsoYnl0ZU9mZnNldCAtIDEpICYgYnl0ZU1hc2tdID0KKyAgICAgIChoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQgLSAxKSAmIGJ5dGVNYXNrXSAmIChtYXNrID4+IDgpKSB8CisgICAgICAoVUNIQVIpKHRtcCA+PiA4KTsKKyAgaEJpdEJ1Zi0+QnVmZmVyWyhieXRlT2Zmc2V0IC0gMikgJiBieXRlTWFza10gPQorICAgICAgKGhCaXRCdWYtPkJ1ZmZlclsoYnl0ZU9mZnNldCAtIDIpICYgYnl0ZU1hc2tdICYgKG1hc2sgPj4gMTYpKSB8CisgICAgICAoVUNIQVIpKHRtcCA+PiAxNik7CisgIGhCaXRCdWYtPkJ1ZmZlclsoYnl0ZU9mZnNldCAtIDMpICYgYnl0ZU1hc2tdID0KKyAgICAgIChoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQgLSAzKSAmIGJ5dGVNYXNrXSAmIChtYXNrID4+IDI0KSkgfAorICAgICAgKFVDSEFSKSh0bXAgPj4gMjQpOwogCi0gIGlmICgoYml0T2Zmc2V0ICsgbnVtYmVyT2ZCaXRzKSA+IDMyKQotICB7Ci0gICAgaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldC00KSAmIGJ5dGVNYXNrXSAgPSAoVUNIQVIpKHZhbHVlPj4oNjQtbnVtYmVyT2ZCaXRzLWJpdE9mZnNldCkpIHwKLSAgICAgICAgICAgICAgICggaEJpdEJ1Zi0+QnVmZmVyIFsoYnl0ZU9mZnNldC00KSAmIGJ5dGVNYXNrXSAmIH4oQml0TWFza1tiaXRPZmZzZXRdID4+ICgzMi1udW1iZXJPZkJpdHMpKSApIDsKKyAgaWYgKChiaXRPZmZzZXQgKyBudW1iZXJPZkJpdHMpID4gMzIpIHsKKyAgICBoQml0QnVmLT5CdWZmZXJbKGJ5dGVPZmZzZXQgLSA0KSAmIGJ5dGVNYXNrXSA9CisgICAgICAgIChVQ0hBUikodmFsdWUgPj4gKDY0IC0gbnVtYmVyT2ZCaXRzIC0gYml0T2Zmc2V0KSkgfAorICAgICAgICAoaEJpdEJ1Zi0+QnVmZmVyWyhieXRlT2Zmc2V0IC0gNCkgJiBieXRlTWFza10gJgorICAgICAgICAgfihCaXRNYXNrW2JpdE9mZnNldF0gPj4gKDMyIC0gbnVtYmVyT2ZCaXRzKSkpOwogICB9CiB9CiAKKyNpZm5kZWYgRlVOQ1RJT05fRkRLX3B1c2hCYWNrCit2b2lkIEZES19wdXNoQmFjayhIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBjb25zdCBVSU5UIG51bWJlck9mQml0cywKKyAgICAgICAgICAgICAgICAgIFVDSEFSIGNvbmZpZykgeworICBoQml0QnVmLT5CaXRDbnQgPSAoVUlOVCkoKElOVCloQml0QnVmLT5CaXRDbnQgLSAoSU5UKW51bWJlck9mQml0cyk7CisgIGhCaXRCdWYtPlZhbGlkQml0cyA9CisgICAgICAoY29uZmlnID09IDApID8gKFVJTlQpKChJTlQpaEJpdEJ1Zi0+VmFsaWRCaXRzICsgKElOVCludW1iZXJPZkJpdHMpCisgICAgICAgICAgICAgICAgICAgIDogKChVSU5UKSgoSU5UKWhCaXRCdWYtPlZhbGlkQml0cyAtIChJTlQpbnVtYmVyT2ZCaXRzKSk7CisgIGhCaXRCdWYtPkJpdE5keCA9ICgoVUlOVCkoKElOVCloQml0QnVmLT5CaXROZHggLSAoSU5UKW51bWJlck9mQml0cykpICYKKyAgICAgICAgICAgICAgICAgICAgKGhCaXRCdWYtPmJ1ZkJpdHMgLSAxKTsKK30KKyNlbmRpZgogCi12b2lkIEZES19wdXNoQmFjayAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMsIFVDSEFSIGNvbmZpZykKLXsKLSAgaEJpdEJ1Zi0+Qml0Q250ICAgIC09IG51bWJlck9mQml0cyA7Ci0gIGhCaXRCdWYtPlZhbGlkQml0cyArPSAoY29uZmlnPT0wKSA/IG51bWJlck9mQml0cyA6ICgtKElOVCludW1iZXJPZkJpdHMpIDsKLSAgaEJpdEJ1Zi0+Qml0TmR4ICAgICA9IChoQml0QnVmLT5CaXROZHggLSBudW1iZXJPZkJpdHMpICYgKGhCaXRCdWYtPmJ1ZkJpdHMgLSAxKSA7Cit2b2lkIEZES19wdXNoRm9yd2FyZChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBjb25zdCBVSU5UIG51bWJlck9mQml0cywKKyAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGNvbmZpZykgeworICBoQml0QnVmLT5CaXRDbnQgPSAoVUlOVCkoKElOVCloQml0QnVmLT5CaXRDbnQgKyAoSU5UKW51bWJlck9mQml0cyk7CisgIGhCaXRCdWYtPlZhbGlkQml0cyA9CisgICAgICAoY29uZmlnID09IDApID8gKChVSU5UKSgoSU5UKWhCaXRCdWYtPlZhbGlkQml0cyAtIChJTlQpbnVtYmVyT2ZCaXRzKSkKKyAgICAgICAgICAgICAgICAgICAgOiAoVUlOVCkoKElOVCloQml0QnVmLT5WYWxpZEJpdHMgKyAoSU5UKW51bWJlck9mQml0cyk7CisgIGhCaXRCdWYtPkJpdE5keCA9CisgICAgICAoVUlOVCkoKElOVCloQml0QnVmLT5CaXROZHggKyAoSU5UKW51bWJlck9mQml0cykgJiAoaEJpdEJ1Zi0+YnVmQml0cyAtIDEpOwogfQogCi12b2lkIEZES19wdXNoRm9yd2FyZCAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiwgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMsIFVDSEFSIGNvbmZpZykKLXsKLSAgaEJpdEJ1Zi0+Qml0Q250ICAgICs9IG51bWJlck9mQml0cyA7Ci0gIGhCaXRCdWYtPlZhbGlkQml0cyAtPSAoY29uZmlnPT0wKSA/IG51bWJlck9mQml0cyA6ICgtKElOVCludW1iZXJPZkJpdHMpIDsKLSAgaEJpdEJ1Zi0+Qml0TmR4ICAgICA9IChoQml0QnVmLT5CaXROZHggKyBudW1iZXJPZkJpdHMpICYgKGhCaXRCdWYtPmJ1ZkJpdHMgLSAxKSA7Ci19Cit2b2lkIEZES19ieXRlQWxpZ24oSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiwgVUNIQVIgY29uZmlnKSB7CisgIElOVCBhbGlnbm1lbnQgPSBoQml0QnVmLT5CaXRDbnQgJiAweDA3OwogCi0KLXZvaWQgRkRLX2J5dGVBbGlnbiAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiwgVUNIQVIgY29uZmlnKQotewotICBJTlQgYWxpZ25tZW50ID0gaEJpdEJ1Zi0+Qml0Q250ICYgMHgwNyA7Ci0KLSAgaWYgKGFsaWdubWVudCkKLSAgewotICAgIGlmIChjb25maWc9PTApCi0gICAgICBGREtfcHVzaEZvcndhcmQgKGhCaXRCdWYsIDggLSBhbGlnbm1lbnQsIGNvbmZpZykgOyAvKiBCU19SRUFERVIgKi8KKyAgaWYgKGFsaWdubWVudCkgeworICAgIGlmIChjb25maWcgPT0gMCkKKyAgICAgIEZES19wdXNoRm9yd2FyZChoQml0QnVmLCA4IC0gYWxpZ25tZW50LCBjb25maWcpOyAvKiBCU19SRUFERVIgKi8KICAgICBlbHNlCi0gICAgICBGREtfcHV0IChoQml0QnVmLDAgLCA4IC0gYWxpZ25tZW50KSA7ICAgICAgICAgICAgICAvKiBCU19XUklURVIgKi8KKyAgICAgIEZES19wdXQoaEJpdEJ1ZiwgMCwgOCAtIGFsaWdubWVudCk7IC8qIEJTX1dSSVRFUiAqLwogICB9CiAKLSAgaEJpdEJ1Zi0+Qml0Q250ID0gMCA7CisgIGhCaXRCdWYtPkJpdENudCA9IDA7CiB9CiAKLVVJTlQgRkRLX2dldFZhbGlkQml0cyAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZikKLXsKLSAgICByZXR1cm4gaEJpdEJ1Zi0+VmFsaWRCaXRzOworI2lmbmRlZiBGVU5DVElPTl9GREtfZ2V0VmFsaWRCaXRzCitVSU5UIEZES19nZXRWYWxpZEJpdHMoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZikgeyByZXR1cm4gaEJpdEJ1Zi0+VmFsaWRCaXRzOyB9CisjZW5kaWYgLyogI2lmbmRlZiBGVU5DVElPTl9GREtfZ2V0VmFsaWRCaXRzICovCisKK0lOVCBGREtfZ2V0RnJlZUJpdHMoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZikgeworICByZXR1cm4gKGhCaXRCdWYtPmJ1ZkJpdHMgLSBoQml0QnVmLT5WYWxpZEJpdHMpOwogfQogCi1JTlQgRkRLX2dldEZyZWVCaXRzIChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmKQotewotICAgIHJldHVybiAoaEJpdEJ1Zi0+YnVmQml0cyAtIGhCaXRCdWYtPlZhbGlkQml0cykgOwordm9pZCBGREtfc2V0Qml0Q250KEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYsIGNvbnN0IFVJTlQgdmFsdWUpIHsKKyAgaEJpdEJ1Zi0+Qml0Q250ID0gdmFsdWU7CiB9CiAKLXZvaWQgRkRLX3NldEJpdENudCAoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiwgY29uc3QgVUlOVCB2YWx1ZSkKLXsKLSAgaEJpdEJ1Zi0+Qml0Q250ID0gdmFsdWUgOwotfQorSU5UIEZES19nZXRCaXRDbnQoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZikgeyByZXR1cm4gaEJpdEJ1Zi0+Qml0Q250OyB9CiAKLUlOVCBGREtfZ2V0Qml0Q250IChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmKQotewotICByZXR1cm4gaEJpdEJ1Zi0+Qml0Q250IDsKLX0KK3ZvaWQgRkRLX0ZlZWQoSEFORExFX0ZES19CSVRCVUYgaEJpdEJ1ZiwgY29uc3QgVUNIQVIgKlJFU1RSSUNUIGlucHV0QnVmZmVyLAorICAgICAgICAgICAgICBjb25zdCBVSU5UIGJ1ZmZlclNpemUsIFVJTlQgKmJ5dGVzVmFsaWQpIHsKKyAgaW5wdXRCdWZmZXIgPSAmaW5wdXRCdWZmZXJbYnVmZmVyU2l6ZSAtICpieXRlc1ZhbGlkXTsKIAotdm9pZCBGREtfRmVlZChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLAotICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICpSRVNUUklDVCBpbnB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAqYnl0ZXNWYWxpZCkKLXsKLSAgaW5wdXRCdWZmZXIgPSAmaW5wdXRCdWZmZXIgW2J1ZmZlclNpemUgLSAqYnl0ZXNWYWxpZF0gOworICBVSU5UIGJUb3RhbCA9IDA7CiAKLSAgVUlOVCBiVG90YWwgPSAwIDsKKyAgVUlOVCBiVG9SZWFkID0gKGhCaXRCdWYtPmJ1ZkJpdHMgLSBoQml0QnVmLT5WYWxpZEJpdHMpID4+IDM7CisgIFVJTlQgbm9PZkJ5dGVzID0KKyAgICAgIGZNaW4oYlRvUmVhZCwKKyAgICAgICAgICAgKmJ5dGVzVmFsaWQpOyAgLy8oYlRvUmVhZCA8ICpieXRlc1ZhbGlkKSA/IGJUb1JlYWQgOiAqYnl0ZXNWYWxpZCA7CiAKLSAgVUlOVCBiVG9SZWFkICAgPSAoaEJpdEJ1Zi0+YnVmQml0cyAtIGhCaXRCdWYtPlZhbGlkQml0cykgPj4gMyA7Ci0gIFVJTlQgbm9PZkJ5dGVzID0gZk1pbihiVG9SZWFkLCAqYnl0ZXNWYWxpZCk7IC8vKGJUb1JlYWQgPCAqYnl0ZXNWYWxpZCkgPyBiVG9SZWFkIDogKmJ5dGVzVmFsaWQgOwotCi0gIHdoaWxlIChub09mQnl0ZXMgPiAwKQotICB7CisgIHdoaWxlIChub09mQnl0ZXMgPiAwKSB7CiAgICAgLyogc3BsaXQgcmVhZCB0byBidWZmZXIgc2l6ZSAqLwotICAgIGJUb1JlYWQgPSBoQml0QnVmLT5idWZTaXplIC0gaEJpdEJ1Zi0+UmVhZE9mZnNldCA7Ci0gICAgYlRvUmVhZCA9IGZNaW4oYlRvUmVhZCwgbm9PZkJ5dGVzKTsgLy8oYlRvUmVhZCA8IG5vT2ZCeXRlcykgPyBiVG9SZWFkIDogbm9PZkJ5dGVzIDsKKyAgICBiVG9SZWFkID0gaEJpdEJ1Zi0+YnVmU2l6ZSAtIGhCaXRCdWYtPlJlYWRPZmZzZXQ7CisgICAgYlRvUmVhZCA9IGZNaW4oYlRvUmVhZCwKKyAgICAgICAgICAgICAgICAgICBub09mQnl0ZXMpOyAgLy8oYlRvUmVhZCA8IG5vT2ZCeXRlcykgPyBiVG9SZWFkIDogbm9PZkJ5dGVzIDsKIAogICAgIC8qIGNvcHkgJ2JUb1JlYWQnIGJ5dGVzIGZyb20gJ3B0cicgdG8gaW5wdXRidWZmZXIgKi8KLSAgICBGREttZW1jcHkoJmhCaXRCdWYtPkJ1ZmZlcltoQml0QnVmLT5SZWFkT2Zmc2V0XSwgaW5wdXRCdWZmZXIsIGJUb1JlYWQqc2l6ZW9mKFVDSEFSKSk7CisgICAgRkRLbWVtY3B5KCZoQml0QnVmLT5CdWZmZXJbaEJpdEJ1Zi0+UmVhZE9mZnNldF0sIGlucHV0QnVmZmVyLAorICAgICAgICAgICAgICBiVG9SZWFkICogc2l6ZW9mKFVDSEFSKSk7CiAKICAgICAvKiBhZGQgbm9PZkJpdHMgdG8gbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYnVmZmVyICovCi0gICAgaEJpdEJ1Zi0+VmFsaWRCaXRzICArPSBiVG9SZWFkIDw8IDMgOwotICAgIGJUb3RhbCAgICAgICArPSBiVG9SZWFkIDsKLSAgICBpbnB1dEJ1ZmZlciAgKz0gYlRvUmVhZCA7CisgICAgaEJpdEJ1Zi0+VmFsaWRCaXRzICs9IGJUb1JlYWQgPDwgMzsKKyAgICBiVG90YWwgKz0gYlRvUmVhZDsKKyAgICBpbnB1dEJ1ZmZlciArPSBiVG9SZWFkOwogCi0gICAgaEJpdEJ1Zi0+UmVhZE9mZnNldCAgPSAoaEJpdEJ1Zi0+UmVhZE9mZnNldCArIGJUb1JlYWQpICYgKGhCaXRCdWYtPmJ1ZlNpemUgLSAxKSA7Ci0gICAgbm9PZkJ5dGVzICAgIC09IGJUb1JlYWQgOworICAgIGhCaXRCdWYtPlJlYWRPZmZzZXQgPQorICAgICAgICAoaEJpdEJ1Zi0+UmVhZE9mZnNldCArIGJUb1JlYWQpICYgKGhCaXRCdWYtPmJ1ZlNpemUgLSAxKTsKKyAgICBub09mQnl0ZXMgLT0gYlRvUmVhZDsKICAgfQogCi0gICpieXRlc1ZhbGlkIC09IGJUb3RhbCA7CisgICpieXRlc1ZhbGlkIC09IGJUb3RhbDsKIH0KIAotdm9pZCBDb3B5QWxpZ25lZEJsb2NrIChIQU5ETEVfRkRLX0JJVEJVRiBoX0JpdEJ1ZlNyYywgVUNIQVIgKlJFU1RSSUNUIGRzdEJ1ZmZlciwgVUlOVCBiVG9SZWFkKQotewotICBVSU5UIGJ5dGVPZmZzZXQgPSBoX0JpdEJ1ZlNyYy0+Qml0TmR4ID4+IDMgOwotICBjb25zdCBVSU5UIGJ5dGVNYXNrID0gaF9CaXRCdWZTcmMtPmJ1ZlNpemUgLSAxIDsKK3ZvaWQgQ29weUFsaWduZWRCbG9jayhIQU5ETEVfRkRLX0JJVEJVRiBoX0JpdEJ1ZlNyYywgVUNIQVIgKlJFU1RSSUNUIGRzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICBVSU5UIGJUb1JlYWQpIHsKKyAgVUlOVCBieXRlT2Zmc2V0ID0gaF9CaXRCdWZTcmMtPkJpdE5keCA+PiAzOworICBjb25zdCBVSU5UIGJ5dGVNYXNrID0gaF9CaXRCdWZTcmMtPmJ1ZlNpemUgLSAxOwogCiAgIFVDSEFSICpSRVNUUklDVCBwQkJCID0gaF9CaXRCdWZTcmMtPkJ1ZmZlcjsKLSAgZm9yIChVSU5UIGkgPSAwIDsgaSA8IGJUb1JlYWQgOyBpKyspCi0gIHsKLSAgICBkc3RCdWZmZXJbaV0gPSBwQkJCWyhieXRlT2Zmc2V0K2kpICYgYnl0ZU1hc2tdIDsKKyAgZm9yIChVSU5UIGkgPSAwOyBpIDwgYlRvUmVhZDsgaSsrKSB7CisgICAgZHN0QnVmZmVyW2ldID0gcEJCQlsoYnl0ZU9mZnNldCArIGkpICYgYnl0ZU1hc2tdOwogICB9CiAKLSAgYlRvUmVhZCA8PD0gMyA7CisgIGJUb1JlYWQgPDw9IDM7CiAKLSAgaF9CaXRCdWZTcmMtPkJpdE5keCA9IChoX0JpdEJ1ZlNyYy0+Qml0TmR4ICsgYlRvUmVhZCkgJiAoaF9CaXRCdWZTcmMtPmJ1ZkJpdHMgLSAxKSA7Ci0gIGhfQml0QnVmU3JjLT5CaXRDbnQgKz0gYlRvUmVhZCA7Ci0gIGhfQml0QnVmU3JjLT5WYWxpZEJpdHMgLT0gYlRvUmVhZCA7CisgIGhfQml0QnVmU3JjLT5CaXROZHggPQorICAgICAgKGhfQml0QnVmU3JjLT5CaXROZHggKyBiVG9SZWFkKSAmIChoX0JpdEJ1ZlNyYy0+YnVmQml0cyAtIDEpOworICBoX0JpdEJ1ZlNyYy0+Qml0Q250ICs9IGJUb1JlYWQ7CisgIGhfQml0QnVmU3JjLT5WYWxpZEJpdHMgLT0gYlRvUmVhZDsKIH0KIAotdm9pZCBGREtfQ29weSAoSEFORExFX0ZES19CSVRCVUYgaF9CaXRCdWZEc3QsIEhBTkRMRV9GREtfQklUQlVGIGhfQml0QnVmU3JjLCBVSU5UICpieXRlc1ZhbGlkKQotewordm9pZCBGREtfQ29weShIQU5ETEVfRkRLX0JJVEJVRiBoX0JpdEJ1ZkRzdCwgSEFORExFX0ZES19CSVRCVUYgaF9CaXRCdWZTcmMsCisgICAgICAgICAgICAgIFVJTlQgKmJ5dGVzVmFsaWQpIHsKICAgSU5UIGJUb3RhbCA9IDA7CiAKLSAgLyogbGltaXQgbm9PZkJ5dGVzIHRvIHZhbGlkIGJ5dGVzIGluIHNyYyBidWZmZXIgYW5kIGF2YWlsYWJsZSBieXRlcyBpbiBkc3QgYnVmZmVyICovCi0gIFVJTlQgYlRvUmVhZCAgID0gaF9CaXRCdWZTcmMtPlZhbGlkQml0cyA+PiAzIDsKLSAgVUlOVCBub09mQnl0ZXMgPSBmTWluKGJUb1JlYWQsICpieXRlc1ZhbGlkKTsgLy8oKmJ5dGVzVmFsaWQgPCBiVG9SZWFkKSA/ICpieXRlc1ZhbGlkIDogYlRvUmVhZCA7Ci0gIGJUb1JlYWQgICA9IEZES19nZXRGcmVlQml0cyhoX0JpdEJ1ZkRzdCk7Ci0gIG5vT2ZCeXRlcyA9IGZNaW4oYlRvUmVhZCwgbm9PZkJ5dGVzKTsgLy8oYlRvUmVhZCA8IG5vT2ZCeXRlcykgPyBiVG9SZWFkIDogbm9PZkJ5dGVzOworICAvKiBsaW1pdCBub09mQnl0ZXMgdG8gdmFsaWQgYnl0ZXMgaW4gc3JjIGJ1ZmZlciBhbmQgYXZhaWxhYmxlIGJ5dGVzIGluIGRzdAorICAgKiBidWZmZXIgKi8KKyAgVUlOVCBiVG9SZWFkID0gaF9CaXRCdWZTcmMtPlZhbGlkQml0cyA+PiAzOworICBVSU5UIG5vT2ZCeXRlcyA9CisgICAgICBmTWluKGJUb1JlYWQsCisgICAgICAgICAgICpieXRlc1ZhbGlkKTsgIC8vKCpieXRlc1ZhbGlkIDwgYlRvUmVhZCkgPyAqYnl0ZXNWYWxpZCA6IGJUb1JlYWQgOworICBiVG9SZWFkID0gRkRLX2dldEZyZWVCaXRzKGhfQml0QnVmRHN0KTsKKyAgbm9PZkJ5dGVzID0KKyAgICAgIGZNaW4oYlRvUmVhZCwgbm9PZkJ5dGVzKTsgIC8vKGJUb1JlYWQgPCBub09mQnl0ZXMpID8gYlRvUmVhZCA6IG5vT2ZCeXRlczsKIAotICB3aGlsZSAobm9PZkJ5dGVzID4gMCkKLSAgeworICB3aGlsZSAobm9PZkJ5dGVzID4gMCkgewogICAgIC8qIFNwbGl0IFJlYWQgdG8gYnVmZmVyIHNpemUgKi8KLSAgICBiVG9SZWFkID0gaF9CaXRCdWZEc3QtPmJ1ZlNpemUgLSBoX0JpdEJ1ZkRzdC0+UmVhZE9mZnNldCA7Ci0gICAgYlRvUmVhZCA9IGZNaW4obm9PZkJ5dGVzLCBiVG9SZWFkKTsgLy8obm9PZkJ5dGVzIDwgYlRvUmVhZCkgPyBub09mQnl0ZXMgOiBiVG9SZWFkIDsKKyAgICBiVG9SZWFkID0gaF9CaXRCdWZEc3QtPmJ1ZlNpemUgLSBoX0JpdEJ1ZkRzdC0+UmVhZE9mZnNldDsKKyAgICBiVG9SZWFkID0gZk1pbihub09mQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgYlRvUmVhZCk7ICAvLyhub09mQnl0ZXMgPCBiVG9SZWFkKSA/IG5vT2ZCeXRlcyA6IGJUb1JlYWQgOwogCiAgICAgLyogY29weSAnYlRvUmVhZCcgYnl0ZXMgZnJvbSBidWZmZXIgdG8gYnVmZmVyICovCiAgICAgaWYgKCEoaF9CaXRCdWZTcmMtPkJpdE5keCAmIDB4MDcpKSB7Ci0gICAgICBDb3B5QWxpZ25lZEJsb2NrIChoX0JpdEJ1ZlNyYywgaF9CaXRCdWZEc3QtPkJ1ZmZlciArIGhfQml0QnVmRHN0LT5SZWFkT2Zmc2V0LCBiVG9SZWFkKSA7CisgICAgICBDb3B5QWxpZ25lZEJsb2NrKGhfQml0QnVmU3JjLAorICAgICAgICAgICAgICAgICAgICAgICBoX0JpdEJ1ZkRzdC0+QnVmZmVyICsgaF9CaXRCdWZEc3QtPlJlYWRPZmZzZXQsIGJUb1JlYWQpOwogICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKFVJTlQgaSA9IDA7IGkgPCBiVG9SZWFkOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGhfQml0QnVmRHN0LT5CdWZmZXIgW2hfQml0QnVmRHN0LT5SZWFkT2Zmc2V0ICsgaV0gPSAoVUNIQVIpRkRLX2dldChoX0JpdEJ1ZlNyYyw4KTsKKyAgICAgIGZvciAoVUlOVCBpID0gMDsgaSA8IGJUb1JlYWQ7IGkrKykgeworICAgICAgICBoX0JpdEJ1ZkRzdC0+QnVmZmVyW2hfQml0QnVmRHN0LT5SZWFkT2Zmc2V0ICsgaV0gPQorICAgICAgICAgICAgKFVDSEFSKUZES19nZXQoaF9CaXRCdWZTcmMsIDgpOwogICAgICAgfQogICAgIH0KIAogICAgIC8qIGFkZCBub09mQml0cyB0byBudW1iZXIgb2YgdmFsaWQgYml0cyBpbiBidWZmZXIgKi8KLSAgICBoX0JpdEJ1ZkRzdC0+VmFsaWRCaXRzICArPSBiVG9SZWFkIDw8IDMgOwotICAgIGJUb3RhbCAgICAgICArPSBiVG9SZWFkOworICAgIGhfQml0QnVmRHN0LT5WYWxpZEJpdHMgKz0gYlRvUmVhZCA8PCAzOworICAgIGJUb3RhbCArPSBiVG9SZWFkOwogCi0gICAgaF9CaXRCdWZEc3QtPlJlYWRPZmZzZXQgID0gKGhfQml0QnVmRHN0LT5SZWFkT2Zmc2V0ICsgYlRvUmVhZCkgJiAoaF9CaXRCdWZEc3QtPmJ1ZlNpemUtMSk7Ci0gICAgbm9PZkJ5dGVzICAgIC09IGJUb1JlYWQ7CisgICAgaF9CaXRCdWZEc3QtPlJlYWRPZmZzZXQgPQorICAgICAgICAoaF9CaXRCdWZEc3QtPlJlYWRPZmZzZXQgKyBiVG9SZWFkKSAmIChoX0JpdEJ1ZkRzdC0+YnVmU2l6ZSAtIDEpOworICAgIG5vT2ZCeXRlcyAtPSBiVG9SZWFkOwogICB9CiAKLSAgKmJ5dGVzVmFsaWQgLT1iVG90YWw7CisgICpieXRlc1ZhbGlkIC09IGJUb3RhbDsKIH0KIAotdm9pZCBGREtfRmV0Y2ggKEhBTkRMRV9GREtfQklUQlVGIGhCaXRCdWYsIFVDSEFSICpvdXRCdWYsIFVJTlQgKndyaXRlQnl0ZXMpCi17Cit2b2lkIEZES19GZXRjaChIQU5ETEVfRkRLX0JJVEJVRiBoQml0QnVmLCBVQ0hBUiAqb3V0QnVmLCBVSU5UICp3cml0ZUJ5dGVzKSB7CiAgIFVDSEFSICpSRVNUUklDVCBvdXRwdXRCdWZmZXIgPSBvdXRCdWY7Ci0gIFVJTlQgYlRvdGFsID0gMCA7CisgIFVJTlQgYlRvdGFsID0gMDsKIAotICBVSU5UIGJUb1dyaXRlICA9IChoQml0QnVmLT5WYWxpZEJpdHMpID4+IDMgOwotICBVSU5UIG5vT2ZCeXRlcyA9IGZNaW4oYlRvV3JpdGUsICp3cml0ZUJ5dGVzKTsgLy8oYlRvV3JpdGUgPCAqd3JpdGVCeXRlcykgPyBiVG9Xcml0ZSA6ICp3cml0ZUJ5dGVzIDsKKyAgVUlOVCBiVG9Xcml0ZSA9IChoQml0QnVmLT5WYWxpZEJpdHMpID4+IDM7CisgIFVJTlQgbm9PZkJ5dGVzID0KKyAgICAgIGZNaW4oYlRvV3JpdGUsCisgICAgICAgICAgICp3cml0ZUJ5dGVzKTsgIC8vKGJUb1dyaXRlIDwgKndyaXRlQnl0ZXMpID8gYlRvV3JpdGUgOiAqd3JpdGVCeXRlcyA7CiAKLSAgd2hpbGUgKG5vT2ZCeXRlcyA+IDApCi0gIHsKKyAgd2hpbGUgKG5vT2ZCeXRlcyA+IDApIHsKICAgICAvKiBzcGxpdCB3cml0ZSB0byBidWZmZXIgc2l6ZSAqLwotICAgIGJUb1dyaXRlID0gaEJpdEJ1Zi0+YnVmU2l6ZSAtIGhCaXRCdWYtPldyaXRlT2Zmc2V0IDsKLSAgICBiVG9Xcml0ZSA9IGZNaW4oYlRvV3JpdGUsIG5vT2ZCeXRlcyk7IC8vKGJUb1dyaXRlIDwgbm9PZkJ5dGVzKSA/IGJUb1dyaXRlIDogbm9PZkJ5dGVzIDsKKyAgICBiVG9Xcml0ZSA9IGhCaXRCdWYtPmJ1ZlNpemUgLSBoQml0QnVmLT5Xcml0ZU9mZnNldDsKKyAgICBiVG9Xcml0ZSA9IGZNaW4oCisgICAgICAgIGJUb1dyaXRlLCBub09mQnl0ZXMpOyAgLy8oYlRvV3JpdGUgPCBub09mQnl0ZXMpID8gYlRvV3JpdGUgOiBub09mQnl0ZXMgOwogCiAgICAgLyogY29weSAnYlRvV3JpdGUnIGJ5dGVzIGZyb20gYml0YnVmZmVyIHRvIG91dHB1dGJ1ZmZlciAqLwotICAgIEZES21lbWNweShvdXRwdXRCdWZmZXIsICZoQml0QnVmLT5CdWZmZXJbaEJpdEJ1Zi0+V3JpdGVPZmZzZXRdLCBiVG9Xcml0ZSpzaXplb2YoVUNIQVIpKTsKKyAgICBGREttZW1jcHkob3V0cHV0QnVmZmVyLCAmaEJpdEJ1Zi0+QnVmZmVyW2hCaXRCdWYtPldyaXRlT2Zmc2V0XSwKKyAgICAgICAgICAgICAgYlRvV3JpdGUgKiBzaXplb2YoVUNIQVIpKTsKIAogICAgIC8qIHN1YiBub09mQml0cyBmcm9tIG51bWJlciBvZiB2YWxpZCBiaXRzIGluIGJ1ZmZlciAqLwotICAgIGhCaXRCdWYtPlZhbGlkQml0cyAgLT0gYlRvV3JpdGUgPDwgMyA7Ci0gICAgYlRvdGFsICAgICAgICs9IGJUb1dyaXRlIDsKLSAgICBvdXRwdXRCdWZmZXIgKz0gYlRvV3JpdGUgOworICAgIGhCaXRCdWYtPlZhbGlkQml0cyAtPSBiVG9Xcml0ZSA8PCAzOworICAgIGJUb3RhbCArPSBiVG9Xcml0ZTsKKyAgICBvdXRwdXRCdWZmZXIgKz0gYlRvV3JpdGU7CiAKLSAgICBoQml0QnVmLT5Xcml0ZU9mZnNldCAgPSAoaEJpdEJ1Zi0+V3JpdGVPZmZzZXQgKyBiVG9Xcml0ZSkgJiAoaEJpdEJ1Zi0+YnVmU2l6ZSAtIDEpIDsKLSAgICBub09mQnl0ZXMgICAgLT0gYlRvV3JpdGUgOworICAgIGhCaXRCdWYtPldyaXRlT2Zmc2V0ID0KKyAgICAgICAgKGhCaXRCdWYtPldyaXRlT2Zmc2V0ICsgYlRvV3JpdGUpICYgKGhCaXRCdWYtPmJ1ZlNpemUgLSAxKTsKKyAgICBub09mQnl0ZXMgLT0gYlRvV3JpdGU7CiAgIH0KIAotICAqd3JpdGVCeXRlcyA9IGJUb3RhbCA7CisgICp3cml0ZUJ5dGVzID0gYlRvdGFsOwogfQotCmRpZmYgLS1naXQgYS9saWJGREsvc3JjL0ZES19jb3JlLmNwcCBiL2xpYkZESy9zcmMvRkRLX2NvcmUuY3BwCmluZGV4IDFkOGFjN2IuLjc1ZWE4YTIgMTAwNjQ0Ci0tLSBhL2xpYkZESy9zcmMvRkRLX2NvcmUuY3BwCisrKyBiL2xpYkZESy9zcmMvRkRLX2NvcmUuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIxICs5MCwyMiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCisKICAgIERlc2NyaXB0aW9uOiBGREsgdG9vbHMgdmVyc2lvbmluZyBzdXBwb3J0CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJGREtfY29yZS5oIgogCiAvKiBGREsgdG9vbHMgbGlicmFyeSBpbmZvICovCi0jZGVmaW5lIEZES19UT09MU19MSUJfVkwwIDIKLSNkZWZpbmUgRkRLX1RPT0xTX0xJQl9WTDEgMwotI2RlZmluZSBGREtfVE9PTFNfTElCX1ZMMiA2CisjZGVmaW5lIEZES19UT09MU19MSUJfVkwwIDMKKyNkZWZpbmUgRkRLX1RPT0xTX0xJQl9WTDEgMAorI2RlZmluZSBGREtfVE9PTFNfTElCX1ZMMiAwCiAjZGVmaW5lIEZES19UT09MU19MSUJfVElUTEUgIkZESyBUb29scyIKICNpZmRlZiBfX0FORFJPSURfXwogI2RlZmluZSBGREtfVE9PTFNfTElCX0JVSUxEX0RBVEUgIiIKQEAgLTEwMyw4ICsxMTUsNyBAQAogI2RlZmluZSBGREtfVE9PTFNfTElCX0JVSUxEX1RJTUUgX19USU1FX18KICNlbmRpZgogCi1pbnQgRkRLX3Rvb2xzR2V0TGliSW5mbyhMSUJfSU5GTyAqaW5mbykKLXsKK2ludCBGREtfdG9vbHNHZXRMaWJJbmZvKExJQl9JTkZPICppbmZvKSB7CiAgIFVJTlQgdjsKICAgaW50IGk7CiAKQEAgLTExNCwyMCArMTI1LDIxIEBACiAKICAgLyogc2VhcmNoIGZvciBuZXh0IGZyZWUgdGFiICovCiAgIGkgPSBGREtsaWJJbmZvX2xvb2t1cChpbmZvLCBGREtfVE9PTFMpOwotICBpZiAoaTwwKSByZXR1cm4gLTE7CisgIGlmIChpIDwgMCkgcmV0dXJuIC0xOwogCiAgIGluZm8gKz0gaTsKIAogICB2ID0gTElCX1ZFUlNJT04oRkRLX1RPT0xTX0xJQl9WTDAsIEZES19UT09MU19MSUJfVkwxLCBGREtfVE9PTFNfTElCX1ZMMik7CiAKLSAgRkRLc3ByaW50ZihpbmZvLT52ZXJzaW9uU3RyLCAiJWQuJWQuJWQiLCAoKHYgPj4gMjQpICYgMHhmZiksICgodiA+PiAxNikgJiAweGZmKSwgKCh2ID4+IDggKSAmIDB4ZmYpKTsKKyAgRkRLc3ByaW50ZihpbmZvLT52ZXJzaW9uU3RyLCAiJWQuJWQuJWQiLCAoKHYgPj4gMjQpICYgMHhmZiksCisgICAgICAgICAgICAgKCh2ID4+IDE2KSAmIDB4ZmYpLCAoKHYgPj4gOCkgJiAweGZmKSk7CiAKICAgaW5mby0+bW9kdWxlX2lkID0gRkRLX1RPT0xTOwogICBpbmZvLT52ZXJzaW9uID0gdjsKLSAgaW5mby0+YnVpbGRfZGF0ZSA9IChjaGFyICopRkRLX1RPT0xTX0xJQl9CVUlMRF9EQVRFOwotICBpbmZvLT5idWlsZF90aW1lID0gKGNoYXIgKilGREtfVE9PTFNfTElCX0JVSUxEX1RJTUU7Ci0gIGluZm8tPnRpdGxlICAgICAgPSAoY2hhciAqKUZES19UT09MU19MSUJfVElUTEU7Ci0gIGluZm8tPmZsYWdzID0gMDsKKyAgaW5mby0+YnVpbGRfZGF0ZSA9IEZES19UT09MU19MSUJfQlVJTERfREFURTsKKyAgaW5mby0+YnVpbGRfdGltZSA9IEZES19UT09MU19MSUJfQlVJTERfVElNRTsKKyAgaW5mby0+dGl0bGUgPSBGREtfVE9PTFNfTElCX1RJVExFOworICBpbmZvLT5mbGFncyA9IDE7CiAKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9saWJGREsvc3JjL0ZES19jcmMuY3BwIGIvbGliRkRLL3NyYy9GREtfY3JjLmNwcAppbmRleCAxN2Q0N2FkLi5lMjA4MzM4IDEwMDY0NAotLS0gYS9saWJGREsvc3JjL0ZES19jcmMuY3BwCisrKyBiL2xpYkZESy9zcmMvRkRLX2NyYy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQ5ICs5MCwxNjQgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjoKLSAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBDUkMgY2FsY3VsYXRpb24KKyAgIEF1dGhvcihzKToKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IENSQyBjYWxjdWxhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiRkRLX2NyYy5oIgogCi0KLQogLyotLS0tLS0tLS0tLS0tLS0tIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qKgotICogXGJyaWVmICBUaGlzIHRhYmxlIGRlZmluZXMgcHJlY2FsY3VsYXRlZCBsb29rdXAgdGFibGVzIGZvciBjcmMgcG9seW5vbSAgeF4xNiArIHheMTUgKyB4XjIgKyB4XjAuCisgKiBcYnJpZWYgIFRoaXMgdGFibGUgZGVmaW5lcyBwcmVjYWxjdWxhdGVkIGxvb2t1cCB0YWJsZXMgZm9yIGNyYyBwb2x5bm9tICB4XjE2CisgKiArIHheMTUgKyB4XjIgKyB4XjAuCiAgKi8KLXN0YXRpYyBjb25zdCBVU0hPUlQgY3JjTG9va3VwXzE2XzE1XzJfMFsyNTZdID0KLXsKLSAgMHgwMDAwLCAweDgwMDUsIDB4ODAwZiwgMHgwMDBhLCAweDgwMWIsIDB4MDAxZSwgMHgwMDE0LCAweDgwMTEsCi0gIDB4ODAzMywgMHgwMDM2LCAweDAwM2MsIDB4ODAzOSwgMHgwMDI4LCAweDgwMmQsIDB4ODAyNywgMHgwMDIyLAotICAweDgwNjMsIDB4MDA2NiwgMHgwMDZjLCAweDgwNjksIDB4MDA3OCwgMHg4MDdkLCAweDgwNzcsIDB4MDA3MiwKLSAgMHgwMDUwLCAweDgwNTUsIDB4ODA1ZiwgMHgwMDVhLCAweDgwNGIsIDB4MDA0ZSwgMHgwMDQ0LCAweDgwNDEsCi0gIDB4ODBjMywgMHgwMGM2LCAweDAwY2MsIDB4ODBjOSwgMHgwMGQ4LCAweDgwZGQsIDB4ODBkNywgMHgwMGQyLAotICAweDAwZjAsIDB4ODBmNSwgMHg4MGZmLCAweDAwZmEsIDB4ODBlYiwgMHgwMGVlLCAweDAwZTQsIDB4ODBlMSwKLSAgMHgwMGEwLCAweDgwYTUsIDB4ODBhZiwgMHgwMGFhLCAweDgwYmIsIDB4MDBiZSwgMHgwMGI0LCAweDgwYjEsCi0gIDB4ODA5MywgMHgwMDk2LCAweDAwOWMsIDB4ODA5OSwgMHgwMDg4LCAweDgwOGQsIDB4ODA4NywgMHgwMDgyLAotICAweDgxODMsIDB4MDE4NiwgMHgwMThjLCAweDgxODksIDB4MDE5OCwgMHg4MTlkLCAweDgxOTcsIDB4MDE5MiwKLSAgMHgwMWIwLCAweDgxYjUsIDB4ODFiZiwgMHgwMWJhLCAweDgxYWIsIDB4MDFhZSwgMHgwMWE0LCAweDgxYTEsCi0gIDB4MDFlMCwgMHg4MWU1LCAweDgxZWYsIDB4MDFlYSwgMHg4MWZiLCAweDAxZmUsIDB4MDFmNCwgMHg4MWYxLAotICAweDgxZDMsIDB4MDFkNiwgMHgwMWRjLCAweDgxZDksIDB4MDFjOCwgMHg4MWNkLCAweDgxYzcsIDB4MDFjMiwKLSAgMHgwMTQwLCAweDgxNDUsIDB4ODE0ZiwgMHgwMTRhLCAweDgxNWIsIDB4MDE1ZSwgMHgwMTU0LCAweDgxNTEsCi0gIDB4ODE3MywgMHgwMTc2LCAweDAxN2MsIDB4ODE3OSwgMHgwMTY4LCAweDgxNmQsIDB4ODE2NywgMHgwMTYyLAotICAweDgxMjMsIDB4MDEyNiwgMHgwMTJjLCAweDgxMjksIDB4MDEzOCwgMHg4MTNkLCAweDgxMzcsIDB4MDEzMiwKLSAgMHgwMTEwLCAweDgxMTUsIDB4ODExZiwgMHgwMTFhLCAweDgxMGIsIDB4MDEwZSwgMHgwMTA0LCAweDgxMDEsCi0gIDB4ODMwMywgMHgwMzA2LCAweDAzMGMsIDB4ODMwOSwgMHgwMzE4LCAweDgzMWQsIDB4ODMxNywgMHgwMzEyLAotICAweDAzMzAsIDB4ODMzNSwgMHg4MzNmLCAweDAzM2EsIDB4ODMyYiwgMHgwMzJlLCAweDAzMjQsIDB4ODMyMSwKLSAgMHgwMzYwLCAweDgzNjUsIDB4ODM2ZiwgMHgwMzZhLCAweDgzN2IsIDB4MDM3ZSwgMHgwMzc0LCAweDgzNzEsCi0gIDB4ODM1MywgMHgwMzU2LCAweDAzNWMsIDB4ODM1OSwgMHgwMzQ4LCAweDgzNGQsIDB4ODM0NywgMHgwMzQyLAotICAweDAzYzAsIDB4ODNjNSwgMHg4M2NmLCAweDAzY2EsIDB4ODNkYiwgMHgwM2RlLCAweDAzZDQsIDB4ODNkMSwKLSAgMHg4M2YzLCAweDAzZjYsIDB4MDNmYywgMHg4M2Y5LCAweDAzZTgsIDB4ODNlZCwgMHg4M2U3LCAweDAzZTIsCi0gIDB4ODNhMywgMHgwM2E2LCAweDAzYWMsIDB4ODNhOSwgMHgwM2I4LCAweDgzYmQsIDB4ODNiNywgMHgwM2IyLAotICAweDAzOTAsIDB4ODM5NSwgMHg4MzlmLCAweDAzOWEsIDB4ODM4YiwgMHgwMzhlLCAweDAzODQsIDB4ODM4MSwKLSAgMHgwMjgwLCAweDgyODUsIDB4ODI4ZiwgMHgwMjhhLCAweDgyOWIsIDB4MDI5ZSwgMHgwMjk0LCAweDgyOTEsCi0gIDB4ODJiMywgMHgwMmI2LCAweDAyYmMsIDB4ODJiOSwgMHgwMmE4LCAweDgyYWQsIDB4ODJhNywgMHgwMmEyLAotICAweDgyZTMsIDB4MDJlNiwgMHgwMmVjLCAweDgyZTksIDB4MDJmOCwgMHg4MmZkLCAweDgyZjcsIDB4MDJmMiwKLSAgMHgwMmQwLCAweDgyZDUsIDB4ODJkZiwgMHgwMmRhLCAweDgyY2IsIDB4MDJjZSwgMHgwMmM0LCAweDgyYzEsCi0gIDB4ODI0MywgMHgwMjQ2LCAweDAyNGMsIDB4ODI0OSwgMHgwMjU4LCAweDgyNWQsIDB4ODI1NywgMHgwMjUyLAotICAweDAyNzAsIDB4ODI3NSwgMHg4MjdmLCAweDAyN2EsIDB4ODI2YiwgMHgwMjZlLCAweDAyNjQsIDB4ODI2MSwKLSAgMHgwMjIwLCAweDgyMjUsIDB4ODIyZiwgMHgwMjJhLCAweDgyM2IsIDB4MDIzZSwgMHgwMjM0LCAweDgyMzEsCi0gIDB4ODIxMywgMHgwMjE2LCAweDAyMWMsIDB4ODIxOSwgMHgwMjA4LCAweDgyMGQsIDB4ODIwNywgMHgwMjAyCi19Oworc3RhdGljIGNvbnN0IFVTSE9SVCBjcmNMb29rdXBfMTZfMTVfMl8wWzI1Nl0gPSB7CisgICAgMHgwMDAwLCAweDgwMDUsIDB4ODAwZiwgMHgwMDBhLCAweDgwMWIsIDB4MDAxZSwgMHgwMDE0LCAweDgwMTEsIDB4ODAzMywKKyAgICAweDAwMzYsIDB4MDAzYywgMHg4MDM5LCAweDAwMjgsIDB4ODAyZCwgMHg4MDI3LCAweDAwMjIsIDB4ODA2MywgMHgwMDY2LAorICAgIDB4MDA2YywgMHg4MDY5LCAweDAwNzgsIDB4ODA3ZCwgMHg4MDc3LCAweDAwNzIsIDB4MDA1MCwgMHg4MDU1LCAweDgwNWYsCisgICAgMHgwMDVhLCAweDgwNGIsIDB4MDA0ZSwgMHgwMDQ0LCAweDgwNDEsIDB4ODBjMywgMHgwMGM2LCAweDAwY2MsIDB4ODBjOSwKKyAgICAweDAwZDgsIDB4ODBkZCwgMHg4MGQ3LCAweDAwZDIsIDB4MDBmMCwgMHg4MGY1LCAweDgwZmYsIDB4MDBmYSwgMHg4MGViLAorICAgIDB4MDBlZSwgMHgwMGU0LCAweDgwZTEsIDB4MDBhMCwgMHg4MGE1LCAweDgwYWYsIDB4MDBhYSwgMHg4MGJiLCAweDAwYmUsCisgICAgMHgwMGI0LCAweDgwYjEsIDB4ODA5MywgMHgwMDk2LCAweDAwOWMsIDB4ODA5OSwgMHgwMDg4LCAweDgwOGQsIDB4ODA4NywKKyAgICAweDAwODIsIDB4ODE4MywgMHgwMTg2LCAweDAxOGMsIDB4ODE4OSwgMHgwMTk4LCAweDgxOWQsIDB4ODE5NywgMHgwMTkyLAorICAgIDB4MDFiMCwgMHg4MWI1LCAweDgxYmYsIDB4MDFiYSwgMHg4MWFiLCAweDAxYWUsIDB4MDFhNCwgMHg4MWExLCAweDAxZTAsCisgICAgMHg4MWU1LCAweDgxZWYsIDB4MDFlYSwgMHg4MWZiLCAweDAxZmUsIDB4MDFmNCwgMHg4MWYxLCAweDgxZDMsIDB4MDFkNiwKKyAgICAweDAxZGMsIDB4ODFkOSwgMHgwMWM4LCAweDgxY2QsIDB4ODFjNywgMHgwMWMyLCAweDAxNDAsIDB4ODE0NSwgMHg4MTRmLAorICAgIDB4MDE0YSwgMHg4MTViLCAweDAxNWUsIDB4MDE1NCwgMHg4MTUxLCAweDgxNzMsIDB4MDE3NiwgMHgwMTdjLCAweDgxNzksCisgICAgMHgwMTY4LCAweDgxNmQsIDB4ODE2NywgMHgwMTYyLCAweDgxMjMsIDB4MDEyNiwgMHgwMTJjLCAweDgxMjksIDB4MDEzOCwKKyAgICAweDgxM2QsIDB4ODEzNywgMHgwMTMyLCAweDAxMTAsIDB4ODExNSwgMHg4MTFmLCAweDAxMWEsIDB4ODEwYiwgMHgwMTBlLAorICAgIDB4MDEwNCwgMHg4MTAxLCAweDgzMDMsIDB4MDMwNiwgMHgwMzBjLCAweDgzMDksIDB4MDMxOCwgMHg4MzFkLCAweDgzMTcsCisgICAgMHgwMzEyLCAweDAzMzAsIDB4ODMzNSwgMHg4MzNmLCAweDAzM2EsIDB4ODMyYiwgMHgwMzJlLCAweDAzMjQsIDB4ODMyMSwKKyAgICAweDAzNjAsIDB4ODM2NSwgMHg4MzZmLCAweDAzNmEsIDB4ODM3YiwgMHgwMzdlLCAweDAzNzQsIDB4ODM3MSwgMHg4MzUzLAorICAgIDB4MDM1NiwgMHgwMzVjLCAweDgzNTksIDB4MDM0OCwgMHg4MzRkLCAweDgzNDcsIDB4MDM0MiwgMHgwM2MwLCAweDgzYzUsCisgICAgMHg4M2NmLCAweDAzY2EsIDB4ODNkYiwgMHgwM2RlLCAweDAzZDQsIDB4ODNkMSwgMHg4M2YzLCAweDAzZjYsIDB4MDNmYywKKyAgICAweDgzZjksIDB4MDNlOCwgMHg4M2VkLCAweDgzZTcsIDB4MDNlMiwgMHg4M2EzLCAweDAzYTYsIDB4MDNhYywgMHg4M2E5LAorICAgIDB4MDNiOCwgMHg4M2JkLCAweDgzYjcsIDB4MDNiMiwgMHgwMzkwLCAweDgzOTUsIDB4ODM5ZiwgMHgwMzlhLCAweDgzOGIsCisgICAgMHgwMzhlLCAweDAzODQsIDB4ODM4MSwgMHgwMjgwLCAweDgyODUsIDB4ODI4ZiwgMHgwMjhhLCAweDgyOWIsIDB4MDI5ZSwKKyAgICAweDAyOTQsIDB4ODI5MSwgMHg4MmIzLCAweDAyYjYsIDB4MDJiYywgMHg4MmI5LCAweDAyYTgsIDB4ODJhZCwgMHg4MmE3LAorICAgIDB4MDJhMiwgMHg4MmUzLCAweDAyZTYsIDB4MDJlYywgMHg4MmU5LCAweDAyZjgsIDB4ODJmZCwgMHg4MmY3LCAweDAyZjIsCisgICAgMHgwMmQwLCAweDgyZDUsIDB4ODJkZiwgMHgwMmRhLCAweDgyY2IsIDB4MDJjZSwgMHgwMmM0LCAweDgyYzEsIDB4ODI0MywKKyAgICAweDAyNDYsIDB4MDI0YywgMHg4MjQ5LCAweDAyNTgsIDB4ODI1ZCwgMHg4MjU3LCAweDAyNTIsIDB4MDI3MCwgMHg4Mjc1LAorICAgIDB4ODI3ZiwgMHgwMjdhLCAweDgyNmIsIDB4MDI2ZSwgMHgwMjY0LCAweDgyNjEsIDB4MDIyMCwgMHg4MjI1LCAweDgyMmYsCisgICAgMHgwMjJhLCAweDgyM2IsIDB4MDIzZSwgMHgwMjM0LCAweDgyMzEsIDB4ODIxMywgMHgwMjE2LCAweDAyMWMsIDB4ODIxOSwKKyAgICAweDAyMDgsIDB4ODIwZCwgMHg4MjA3LCAweDAyMDJ9OwogCiAvKioKLSAqIFxicmllZiAgVGhpcyB0YWJsZSBkZWZpbmVzIHByZWNhbGN1bGF0ZWQgbG9va3VwIHRhYmxlcyBmb3IgY3JjIHBvbHlub20gIHheMTYgKyB4XjEyICsgeF41ICsgeF4wLgorICogXGJyaWVmICBUaGlzIHRhYmxlIGRlZmluZXMgcHJlY2FsY3VsYXRlZCBsb29rdXAgdGFibGVzIGZvciBjcmMgcG9seW5vbSAgeF4xNgorICogKyB4XjEyICsgeF41ICsgeF4wLgogICovCi1zdGF0aWMgY29uc3QgVVNIT1JUIGNyY0xvb2t1cF8xNl8xMl81XzBbMjU2XSA9Ci17Ci0gIDB4MDAwMCwgMHgxMDIxLCAweDIwNDIsIDB4MzA2MywgMHg0MDg0LCAweDUwYTUsIDB4NjBjNiwgMHg3MGU3LAotICAweDgxMDgsIDB4OTEyOSwgMHhhMTRhLCAweGIxNmIsIDB4YzE4YywgMHhkMWFkLCAweGUxY2UsIDB4ZjFlZiwKLSAgMHgxMjMxLCAweDAyMTAsIDB4MzI3MywgMHgyMjUyLCAweDUyYjUsIDB4NDI5NCwgMHg3MmY3LCAweDYyZDYsCi0gIDB4OTMzOSwgMHg4MzE4LCAweGIzN2IsIDB4YTM1YSwgMHhkM2JkLCAweGMzOWMsIDB4ZjNmZiwgMHhlM2RlLAotICAweDI0NjIsIDB4MzQ0MywgMHgwNDIwLCAweDE0MDEsIDB4NjRlNiwgMHg3NGM3LCAweDQ0YTQsIDB4NTQ4NSwKLSAgMHhhNTZhLCAweGI1NGIsIDB4ODUyOCwgMHg5NTA5LCAweGU1ZWUsIDB4ZjVjZiwgMHhjNWFjLCAweGQ1OGQsCi0gIDB4MzY1MywgMHgyNjcyLCAweDE2MTEsIDB4MDYzMCwgMHg3NmQ3LCAweDY2ZjYsIDB4NTY5NSwgMHg0NmI0LAotICAweGI3NWIsIDB4YTc3YSwgMHg5NzE5LCAweDg3MzgsIDB4ZjdkZiwgMHhlN2ZlLCAweGQ3OWQsIDB4YzdiYywKLSAgMHg0OGM0LCAweDU4ZTUsIDB4Njg4NiwgMHg3OGE3LCAweDA4NDAsIDB4MTg2MSwgMHgyODAyLCAweDM4MjMsCi0gIDB4YzljYywgMHhkOWVkLCAweGU5OGUsIDB4ZjlhZiwgMHg4OTQ4LCAweDk5NjksIDB4YTkwYSwgMHhiOTJiLAotICAweDVhZjUsIDB4NGFkNCwgMHg3YWI3LCAweDZhOTYsIDB4MWE3MSwgMHgwYTUwLCAweDNhMzMsIDB4MmExMiwKLSAgMHhkYmZkLCAweGNiZGMsIDB4ZmJiZiwgMHhlYjllLCAweDliNzksIDB4OGI1OCwgMHhiYjNiLCAweGFiMWEsCi0gIDB4NmNhNiwgMHg3Yzg3LCAweDRjZTQsIDB4NWNjNSwgMHgyYzIyLCAweDNjMDMsIDB4MGM2MCwgMHgxYzQxLAotICAweGVkYWUsIDB4ZmQ4ZiwgMHhjZGVjLCAweGRkY2QsIDB4YWQyYSwgMHhiZDBiLCAweDhkNjgsIDB4OWQ0OSwKLSAgMHg3ZTk3LCAweDZlYjYsIDB4NWVkNSwgMHg0ZWY0LCAweDNlMTMsIDB4MmUzMiwgMHgxZTUxLCAweDBlNzAsCi0gIDB4ZmY5ZiwgMHhlZmJlLCAweGRmZGQsIDB4Y2ZmYywgMHhiZjFiLCAweGFmM2EsIDB4OWY1OSwgMHg4Zjc4LAotICAweDkxODgsIDB4ODFhOSwgMHhiMWNhLCAweGExZWIsIDB4ZDEwYywgMHhjMTJkLCAweGYxNGUsIDB4ZTE2ZiwKLSAgMHgxMDgwLCAweDAwYTEsIDB4MzBjMiwgMHgyMGUzLCAweDUwMDQsIDB4NDAyNSwgMHg3MDQ2LCAweDYwNjcsCi0gIDB4ODNiOSwgMHg5Mzk4LCAweGEzZmIsIDB4YjNkYSwgMHhjMzNkLCAweGQzMWMsIDB4ZTM3ZiwgMHhmMzVlLAotICAweDAyYjEsIDB4MTI5MCwgMHgyMmYzLCAweDMyZDIsIDB4NDIzNSwgMHg1MjE0LCAweDYyNzcsIDB4NzI1NiwKLSAgMHhiNWVhLCAweGE1Y2IsIDB4OTVhOCwgMHg4NTg5LCAweGY1NmUsIDB4ZTU0ZiwgMHhkNTJjLCAweGM1MGQsCi0gIDB4MzRlMiwgMHgyNGMzLCAweDE0YTAsIDB4MDQ4MSwgMHg3NDY2LCAweDY0NDcsIDB4NTQyNCwgMHg0NDA1LAotICAweGE3ZGIsIDB4YjdmYSwgMHg4Nzk5LCAweDk3YjgsIDB4ZTc1ZiwgMHhmNzdlLCAweGM3MWQsIDB4ZDczYywKLSAgMHgyNmQzLCAweDM2ZjIsIDB4MDY5MSwgMHgxNmIwLCAweDY2NTcsIDB4NzY3NiwgMHg0NjE1LCAweDU2MzQsCi0gIDB4ZDk0YywgMHhjOTZkLCAweGY5MGUsIDB4ZTkyZiwgMHg5OWM4LCAweDg5ZTksIDB4Yjk4YSwgMHhhOWFiLAotICAweDU4NDQsIDB4NDg2NSwgMHg3ODA2LCAweDY4MjcsIDB4MThjMCwgMHgwOGUxLCAweDM4ODIsIDB4MjhhMywKLSAgMHhjYjdkLCAweGRiNWMsIDB4ZWIzZiwgMHhmYjFlLCAweDhiZjksIDB4OWJkOCwgMHhhYmJiLCAweGJiOWEsCi0gIDB4NGE3NSwgMHg1YTU0LCAweDZhMzcsIDB4N2ExNiwgMHgwYWYxLCAweDFhZDAsIDB4MmFiMywgMHgzYTkyLAotICAweGZkMmUsIDB4ZWQwZiwgMHhkZDZjLCAweGNkNGQsIDB4YmRhYSwgMHhhZDhiLCAweDlkZTgsIDB4OGRjOSwKLSAgMHg3YzI2LCAweDZjMDcsIDB4NWM2NCwgMHg0YzQ1LCAweDNjYTIsIDB4MmM4MywgMHgxY2UwLCAweDBjYzEsCi0gIDB4ZWYxZiwgMHhmZjNlLCAweGNmNWQsIDB4ZGY3YywgMHhhZjliLCAweGJmYmEsIDB4OGZkOSwgMHg5ZmY4LAotICAweDZlMTcsIDB4N2UzNiwgMHg0ZTU1LCAweDVlNzQsIDB4MmU5MywgMHgzZWIyLCAweDBlZDEsIDB4MWVmMAotfTsKK3N0YXRpYyBjb25zdCBVU0hPUlQgY3JjTG9va3VwXzE2XzEyXzVfMFsyNTZdID0geworICAgIDB4MDAwMCwgMHgxMDIxLCAweDIwNDIsIDB4MzA2MywgMHg0MDg0LCAweDUwYTUsIDB4NjBjNiwgMHg3MGU3LCAweDgxMDgsCisgICAgMHg5MTI5LCAweGExNGEsIDB4YjE2YiwgMHhjMThjLCAweGQxYWQsIDB4ZTFjZSwgMHhmMWVmLCAweDEyMzEsIDB4MDIxMCwKKyAgICAweDMyNzMsIDB4MjI1MiwgMHg1MmI1LCAweDQyOTQsIDB4NzJmNywgMHg2MmQ2LCAweDkzMzksIDB4ODMxOCwgMHhiMzdiLAorICAgIDB4YTM1YSwgMHhkM2JkLCAweGMzOWMsIDB4ZjNmZiwgMHhlM2RlLCAweDI0NjIsIDB4MzQ0MywgMHgwNDIwLCAweDE0MDEsCisgICAgMHg2NGU2LCAweDc0YzcsIDB4NDRhNCwgMHg1NDg1LCAweGE1NmEsIDB4YjU0YiwgMHg4NTI4LCAweDk1MDksIDB4ZTVlZSwKKyAgICAweGY1Y2YsIDB4YzVhYywgMHhkNThkLCAweDM2NTMsIDB4MjY3MiwgMHgxNjExLCAweDA2MzAsIDB4NzZkNywgMHg2NmY2LAorICAgIDB4NTY5NSwgMHg0NmI0LCAweGI3NWIsIDB4YTc3YSwgMHg5NzE5LCAweDg3MzgsIDB4ZjdkZiwgMHhlN2ZlLCAweGQ3OWQsCisgICAgMHhjN2JjLCAweDQ4YzQsIDB4NThlNSwgMHg2ODg2LCAweDc4YTcsIDB4MDg0MCwgMHgxODYxLCAweDI4MDIsIDB4MzgyMywKKyAgICAweGM5Y2MsIDB4ZDllZCwgMHhlOThlLCAweGY5YWYsIDB4ODk0OCwgMHg5OTY5LCAweGE5MGEsIDB4YjkyYiwgMHg1YWY1LAorICAgIDB4NGFkNCwgMHg3YWI3LCAweDZhOTYsIDB4MWE3MSwgMHgwYTUwLCAweDNhMzMsIDB4MmExMiwgMHhkYmZkLCAweGNiZGMsCisgICAgMHhmYmJmLCAweGViOWUsIDB4OWI3OSwgMHg4YjU4LCAweGJiM2IsIDB4YWIxYSwgMHg2Y2E2LCAweDdjODcsIDB4NGNlNCwKKyAgICAweDVjYzUsIDB4MmMyMiwgMHgzYzAzLCAweDBjNjAsIDB4MWM0MSwgMHhlZGFlLCAweGZkOGYsIDB4Y2RlYywgMHhkZGNkLAorICAgIDB4YWQyYSwgMHhiZDBiLCAweDhkNjgsIDB4OWQ0OSwgMHg3ZTk3LCAweDZlYjYsIDB4NWVkNSwgMHg0ZWY0LCAweDNlMTMsCisgICAgMHgyZTMyLCAweDFlNTEsIDB4MGU3MCwgMHhmZjlmLCAweGVmYmUsIDB4ZGZkZCwgMHhjZmZjLCAweGJmMWIsIDB4YWYzYSwKKyAgICAweDlmNTksIDB4OGY3OCwgMHg5MTg4LCAweDgxYTksIDB4YjFjYSwgMHhhMWViLCAweGQxMGMsIDB4YzEyZCwgMHhmMTRlLAorICAgIDB4ZTE2ZiwgMHgxMDgwLCAweDAwYTEsIDB4MzBjMiwgMHgyMGUzLCAweDUwMDQsIDB4NDAyNSwgMHg3MDQ2LCAweDYwNjcsCisgICAgMHg4M2I5LCAweDkzOTgsIDB4YTNmYiwgMHhiM2RhLCAweGMzM2QsIDB4ZDMxYywgMHhlMzdmLCAweGYzNWUsIDB4MDJiMSwKKyAgICAweDEyOTAsIDB4MjJmMywgMHgzMmQyLCAweDQyMzUsIDB4NTIxNCwgMHg2Mjc3LCAweDcyNTYsIDB4YjVlYSwgMHhhNWNiLAorICAgIDB4OTVhOCwgMHg4NTg5LCAweGY1NmUsIDB4ZTU0ZiwgMHhkNTJjLCAweGM1MGQsIDB4MzRlMiwgMHgyNGMzLCAweDE0YTAsCisgICAgMHgwNDgxLCAweDc0NjYsIDB4NjQ0NywgMHg1NDI0LCAweDQ0MDUsIDB4YTdkYiwgMHhiN2ZhLCAweDg3OTksIDB4OTdiOCwKKyAgICAweGU3NWYsIDB4Zjc3ZSwgMHhjNzFkLCAweGQ3M2MsIDB4MjZkMywgMHgzNmYyLCAweDA2OTEsIDB4MTZiMCwgMHg2NjU3LAorICAgIDB4NzY3NiwgMHg0NjE1LCAweDU2MzQsIDB4ZDk0YywgMHhjOTZkLCAweGY5MGUsIDB4ZTkyZiwgMHg5OWM4LCAweDg5ZTksCisgICAgMHhiOThhLCAweGE5YWIsIDB4NTg0NCwgMHg0ODY1LCAweDc4MDYsIDB4NjgyNywgMHgxOGMwLCAweDA4ZTEsIDB4Mzg4MiwKKyAgICAweDI4YTMsIDB4Y2I3ZCwgMHhkYjVjLCAweGViM2YsIDB4ZmIxZSwgMHg4YmY5LCAweDliZDgsIDB4YWJiYiwgMHhiYjlhLAorICAgIDB4NGE3NSwgMHg1YTU0LCAweDZhMzcsIDB4N2ExNiwgMHgwYWYxLCAweDFhZDAsIDB4MmFiMywgMHgzYTkyLCAweGZkMmUsCisgICAgMHhlZDBmLCAweGRkNmMsIDB4Y2Q0ZCwgMHhiZGFhLCAweGFkOGIsIDB4OWRlOCwgMHg4ZGM5LCAweDdjMjYsIDB4NmMwNywKKyAgICAweDVjNjQsIDB4NGM0NSwgMHgzY2EyLCAweDJjODMsIDB4MWNlMCwgMHgwY2MxLCAweGVmMWYsIDB4ZmYzZSwgMHhjZjVkLAorICAgIDB4ZGY3YywgMHhhZjliLCAweGJmYmEsIDB4OGZkOSwgMHg5ZmY4LCAweDZlMTcsIDB4N2UzNiwgMHg0ZTU1LCAweDVlNzQsCisgICAgMHgyZTkzLCAweDNlYjIsIDB4MGVkMSwgMHgxZWYwfTsKIAorLyoqCisgKiBcYnJpZWYgIFRoaXMgdGFibGUgZGVmaW5lcyBwcmVjYWxjdWxhdGVkIGxvb2t1cCB0YWJsZXMgZm9yIGNyYyBwb2x5bm9tICB4XjE2CisgKiArIHheMTUgKyB4XjUgKyB4XjAuCisgKi8KKworc3RhdGljIGNvbnN0IFVTSE9SVCBjcmNMb29rdXBfMTZfMTVfNV8wWzI1Nl0gPSB7CisgICAgMHgwMDAwLCAweDgwMjEsIDB4ODA2MywgMHgwMDQyLCAweDgwZTcsIDB4MDBjNiwgMHgwMDg0LCAweDgwYTUsIDB4ODFlZiwKKyAgICAweDAxY2UsIDB4MDE4YywgMHg4MWFkLCAweDAxMDgsIDB4ODEyOSwgMHg4MTZiLCAweDAxNGEsIDB4ODNmZiwgMHgwM2RlLAorICAgIDB4MDM5YywgMHg4M2JkLCAweDAzMTgsIDB4ODMzOSwgMHg4MzdiLCAweDAzNWEsIDB4MDIxMCwgMHg4MjMxLCAweDgyNzMsCisgICAgMHgwMjUyLCAweDgyZjcsIDB4MDJkNiwgMHgwMjk0LCAweDgyYjUsIDB4ODdkZiwgMHgwN2ZlLCAweDA3YmMsIDB4ODc5ZCwKKyAgICAweDA3MzgsIDB4ODcxOSwgMHg4NzViLCAweDA3N2EsIDB4MDYzMCwgMHg4NjExLCAweDg2NTMsIDB4MDY3MiwgMHg4NmQ3LAorICAgIDB4MDZmNiwgMHgwNmI0LCAweDg2OTUsIDB4MDQyMCwgMHg4NDAxLCAweDg0NDMsIDB4MDQ2MiwgMHg4NGM3LCAweDA0ZTYsCisgICAgMHgwNGE0LCAweDg0ODUsIDB4ODVjZiwgMHgwNWVlLCAweDA1YWMsIDB4ODU4ZCwgMHgwNTI4LCAweDg1MDksIDB4ODU0YiwKKyAgICAweDA1NmEsIDB4OGY5ZiwgMHgwZmJlLCAweDBmZmMsIDB4OGZkZCwgMHgwZjc4LCAweDhmNTksIDB4OGYxYiwgMHgwZjNhLAorICAgIDB4MGU3MCwgMHg4ZTUxLCAweDhlMTMsIDB4MGUzMiwgMHg4ZTk3LCAweDBlYjYsIDB4MGVmNCwgMHg4ZWQ1LCAweDBjNjAsCisgICAgMHg4YzQxLCAweDhjMDMsIDB4MGMyMiwgMHg4Yzg3LCAweDBjYTYsIDB4MGNlNCwgMHg4Y2M1LCAweDhkOGYsIDB4MGRhZSwKKyAgICAweDBkZWMsIDB4OGRjZCwgMHgwZDY4LCAweDhkNDksIDB4OGQwYiwgMHgwZDJhLCAweDA4NDAsIDB4ODg2MSwgMHg4ODIzLAorICAgIDB4MDgwMiwgMHg4OGE3LCAweDA4ODYsIDB4MDhjNCwgMHg4OGU1LCAweDg5YWYsIDB4MDk4ZSwgMHgwOWNjLCAweDg5ZWQsCisgICAgMHgwOTQ4LCAweDg5NjksIDB4ODkyYiwgMHgwOTBhLCAweDhiYmYsIDB4MGI5ZSwgMHgwYmRjLCAweDhiZmQsIDB4MGI1OCwKKyAgICAweDhiNzksIDB4OGIzYiwgMHgwYjFhLCAweDBhNTAsIDB4OGE3MSwgMHg4YTMzLCAweDBhMTIsIDB4OGFiNywgMHgwYTk2LAorICAgIDB4MGFkNCwgMHg4YWY1LCAweDlmMWYsIDB4MWYzZSwgMHgxZjdjLCAweDlmNWQsIDB4MWZmOCwgMHg5ZmQ5LCAweDlmOWIsCisgICAgMHgxZmJhLCAweDFlZjAsIDB4OWVkMSwgMHg5ZTkzLCAweDFlYjIsIDB4OWUxNywgMHgxZTM2LCAweDFlNzQsIDB4OWU1NSwKKyAgICAweDFjZTAsIDB4OWNjMSwgMHg5YzgzLCAweDFjYTIsIDB4OWMwNywgMHgxYzI2LCAweDFjNjQsIDB4OWM0NSwgMHg5ZDBmLAorICAgIDB4MWQyZSwgMHgxZDZjLCAweDlkNGQsIDB4MWRlOCwgMHg5ZGM5LCAweDlkOGIsIDB4MWRhYSwgMHgxOGMwLCAweDk4ZTEsCisgICAgMHg5OGEzLCAweDE4ODIsIDB4OTgyNywgMHgxODA2LCAweDE4NDQsIDB4OTg2NSwgMHg5OTJmLCAweDE5MGUsIDB4MTk0YywKKyAgICAweDk5NmQsIDB4MTljOCwgMHg5OWU5LCAweDk5YWIsIDB4MTk4YSwgMHg5YjNmLCAweDFiMWUsIDB4MWI1YywgMHg5YjdkLAorICAgIDB4MWJkOCwgMHg5YmY5LCAweDliYmIsIDB4MWI5YSwgMHgxYWQwLCAweDlhZjEsIDB4OWFiMywgMHgxYTkyLCAweDlhMzcsCisgICAgMHgxYTE2LCAweDFhNTQsIDB4OWE3NSwgMHgxMDgwLCAweDkwYTEsIDB4OTBlMywgMHgxMGMyLCAweDkwNjcsIDB4MTA0NiwKKyAgICAweDEwMDQsIDB4OTAyNSwgMHg5MTZmLCAweDExNGUsIDB4MTEwYywgMHg5MTJkLCAweDExODgsIDB4OTFhOSwgMHg5MWViLAorICAgIDB4MTFjYSwgMHg5MzdmLCAweDEzNWUsIDB4MTMxYywgMHg5MzNkLCAweDEzOTgsIDB4OTNiOSwgMHg5M2ZiLCAweDEzZGEsCisgICAgMHgxMjkwLCAweDkyYjEsIDB4OTJmMywgMHgxMmQyLCAweDkyNzcsIDB4MTI1NiwgMHgxMjE0LCAweDkyMzUsIDB4OTc1ZiwKKyAgICAweDE3N2UsIDB4MTczYywgMHg5NzFkLCAweDE3YjgsIDB4OTc5OSwgMHg5N2RiLCAweDE3ZmEsIDB4MTZiMCwgMHg5NjkxLAorICAgIDB4OTZkMywgMHgxNmYyLCAweDk2NTcsIDB4MTY3NiwgMHgxNjM0LCAweDk2MTUsIDB4MTRhMCwgMHg5NDgxLCAweDk0YzMsCisgICAgMHgxNGUyLCAweDk0NDcsIDB4MTQ2NiwgMHgxNDI0LCAweDk0MDUsIDB4OTU0ZiwgMHgxNTZlLCAweDE1MmMsIDB4OTUwZCwKKyAgICAweDE1YTgsIDB4OTU4OSwgMHg5NWNiLCAweDE1ZWEsCit9OwogCiAvKi0tLS0tLS0tLS0tLS0tLSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgaW5saW5lIElOVCBjYWxjQ3JjX0JpdHMoCi0gICAgICAgIFVTSE9SVCAqIGNvbnN0ICAgICAgICAgICAgICAgICAgcENyYywKLSAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICBjcmNNYXNrLAotICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIGNyY1BvbHksCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgICAgICAgICAgaEJzLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5CaXRzCi0gICAgICAgICk7CitzdGF0aWMgaW5saW5lIElOVCBjYWxjQ3JjX0JpdHMoVVNIT1JUICpjb25zdCBwQ3JjLCBVU0hPUlQgY3JjTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgY3JjUG9seSwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuQml0cyk7CiAKLXN0YXRpYyBpbmxpbmUgSU5UIGNhbGNDcmNfQnl0ZXMoCi0gICAgICAgIFVTSE9SVCAqIGNvbnN0ICAgICAgICAgICAgICAgICAgcENyYywKLSAgICAgICAgY29uc3QgVVNIT1JUICogICAgICAgICAgICAgICAgICBwQ3JjTG9va3VwLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICAgICAgICAgIGhCcywKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQnl0ZXMKLSAgICAgICAgKTsKK3N0YXRpYyBpbmxpbmUgSU5UIGNhbGNDcmNfQnl0ZXMoVVNIT1JUICpjb25zdCBwQ3JjLCBjb25zdCBVU0hPUlQgKnBDcmNMb29rdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgSU5UIG5CeXRlcyk7CiAKLXN0YXRpYyB2b2lkIGNyY0NhbGMoCi0gICAgICAgIEhBTkRMRV9GREtfQ1JDSU5GTyAgICAgICAgICAgICAgaENyY0luZm8sCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgICAgICAgICAgaEJzLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIHJlZwotICAgICAgICApOwotCitzdGF0aWMgdm9pZCBjcmNDYWxjKEhBTkRMRV9GREtfQ1JDSU5GTyBoQ3JjSW5mbywgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgcmVnKTsKIAogLyotLS0tLS0tLS0tLS0tIGZ1bmN0aW9uIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0qLwogCi12b2lkIEZES2NyY0luaXQoCi0gICAgICAgIEhBTkRMRV9GREtfQ1JDSU5GTyAgICAgICAgICAgICAgaENyY0luZm8sCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICAgICAgY3JjUG9seSwKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgICAgICBjcmNTdGFydFZhbHVlLAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgICAgIGNyY0xlbgotICAgICAgICApCi17Cit2b2lkIEZES2NyY0luaXQoSEFORExFX0ZES19DUkNJTkZPIGhDcmNJbmZvLCBjb25zdCBVSU5UIGNyY1BvbHksCisgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBjcmNTdGFydFZhbHVlLCBjb25zdCBVSU5UIGNyY0xlbikgewogICAvKiBjcmMgcG9seW5vbSBleGFtcGxlOgorICB4XjE2ICsgeF4xNSArIHheNSArIHheMCAgICAgICAgKDEpIDEwMDAgMDAwMCAwMDEwIDAwMDEgLT4gMHg4MDIxCiAgIHheMTYgKyB4XjE1ICsgeF4yICsgeF4wICAgICAgICAoMSkgMTAwMCAwMDAwIDAwMDAgMDEwMSAtPiAweDgwMDUKICAgeF4xNiArIHheMTIgKyB4XjUgKyB4XjAgICAgICAgICgxKSAwMDAxIDAwMDAgMDAxMCAwMDAxIC0+IDB4MTAyMQogICB4XjggKyB4XjQgKyB4XjMgKyB4XjIgKyB4XjAgICAgICAgICAgICAgICgxKSAwMDAxIDExMDEgLT4gMHgwMDFkICovCiAKLSAgaENyY0luZm8tPmNyY0xlbiAgICAgPSBjcmNMZW47Ci0gIGhDcmNJbmZvLT5jcmNQb2x5ICAgID0gY3JjUG9seTsKKyAgaENyY0luZm8tPmNyY0xlbiA9IGNyY0xlbjsKKyAgaENyY0luZm8tPmNyY1BvbHkgPSBjcmNQb2x5OwogICBoQ3JjSW5mby0+c3RhcnRWYWx1ZSA9IGNyY1N0YXJ0VmFsdWU7Ci0gIGhDcmNJbmZvLT5jcmNNYXNrICAgID0gKGNyY0xlbikgPyAoMTw8KGNyY0xlbi0xKSkgOiAwOworICBoQ3JjSW5mby0+Y3JjTWFzayA9IChjcmNMZW4pID8gKDEgPDwgKGNyY0xlbiAtIDEpKSA6IDA7CiAKICAgRkRLY3JjUmVzZXQoaENyY0luZm8pOwogCi0gIGhDcmNJbmZvLT5wQ3JjTG9va3VwID0gMDsKKyAgaENyY0luZm8tPnBDcmNMb29rdXAgPQorICAgICAgMDsgLyogUHJlc2V0IDAgZm9yICJjcmNMZW4iICE9IDE2IG9yIHVua25vd24gMTYtYml0IHBvbHlub21zICJjcmNQb2x5IiAqLwogCi0gIGlmIChoQ3JjSW5mby0+Y3JjTGVuPT0xNikgewotICAgIHN3aXRjaCAoIGNyY1BvbHkgKSB7CisgIGlmIChoQ3JjSW5mby0+Y3JjTGVuID09IDE2KSB7CisgICAgc3dpdGNoIChjcmNQb2x5KSB7CisgICAgICBjYXNlIDB4ODAyMToKKyAgICAgICAgaENyY0luZm8tPnBDcmNMb29rdXAgPSBjcmNMb29rdXBfMTZfMTVfNV8wOworICAgICAgICBicmVhazsKICAgICAgIGNhc2UgMHg4MDA1OgogICAgICAgICBoQ3JjSW5mby0+cENyY0xvb2t1cCA9IGNyY0xvb2t1cF8xNl8xNV8yXzA7CiAgICAgICAgIGJyZWFrOwpAQCAtMjMxLDc3ICsyNTcsNjUgQEAKICAgICAgIGNhc2UgMHgwMDFkOgogICAgICAgZGVmYXVsdDoKICAgICAgICAgLyogbm8gbG9va3VwIHRhYmxlICovCi0gICAgICAgIGhDcmNJbmZvLT5wQ3JjTG9va3VwID0gMDsKKyAgICAgICAgYnJlYWs7CiAgICAgfQogICB9Ci0KLQogfQogCi12b2lkIEZES2NyY1Jlc2V0KEhBTkRMRV9GREtfQ1JDSU5GTyBoQ3JjSW5mbykKLXsKK3ZvaWQgRkRLY3JjUmVzZXQoSEFORExFX0ZES19DUkNJTkZPIGhDcmNJbmZvKSB7CiAgIGludCBpOwogCiAgIGhDcmNJbmZvLT5jcmNWYWx1ZSA9IGhDcmNJbmZvLT5zdGFydFZhbHVlOwogCi0gIGZvcihpPTA7aTxNQVhfQ1JDX1JFR1M7aSsrKSB7CisgIGZvciAoaSA9IDA7IGkgPCBNQVhfQ1JDX1JFR1M7IGkrKykgewogICAgIGhDcmNJbmZvLT5jcmNSZWdEYXRhW2ldLmlzQWN0aXZlID0gMDsKICAgfQogICBoQ3JjSW5mby0+cmVnU3RhcnQgPSAwOwotICBoQ3JjSW5mby0+cmVnU3RvcCAgPSAwOworICBoQ3JjSW5mby0+cmVnU3RvcCA9IDA7CiB9CiAKLUlOVCBGREtjcmNTdGFydFJlZygKLSAgICAgICAgSEFORExFX0ZES19DUkNJTkZPICAgICAgICAgICAgICBoQ3JjSW5mbywKLSAgICAgICAgY29uc3QgSEFORExFX0ZES19CSVRTVFJFQU0gICAgICBoQnMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgbUJpdHMKLSAgICAgICAgKQoteworSU5UIEZES2NyY1N0YXJ0UmVnKEhBTkRMRV9GREtfQ1JDSU5GTyBoQ3JjSW5mbywgY29uc3QgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBtQml0cykgewogICBpbnQgcmVnID0gaENyY0luZm8tPnJlZ1N0YXJ0OwogCi0gIEZES19BU1NFUlQoaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS5pc0FjdGl2ZT09MCk7Ci0gIGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10uaXNBY3RpdmUgICAgICA9IDE7Ci0gIGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10ubWF4Qml0cyAgICAgICA9IG1CaXRzOwotICBoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLnZhbGlkQml0cyAgICAgPSBGREtnZXRWYWxpZEJpdHMoaEJzKSA7CisgIEZES19BU1NFUlQoaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS5pc0FjdGl2ZSA9PSAwKTsKKyAgaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS5pc0FjdGl2ZSA9IDE7CisgIGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10ubWF4Qml0cyA9IG1CaXRzOworICBoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLnZhbGlkQml0cyA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CiAgIGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10uYml0QnVmQ250Qml0cyA9IDA7CiAKLSAgaENyY0luZm8tPnJlZ1N0YXJ0ID0gKGhDcmNJbmZvLT5yZWdTdGFydCsxKSVNQVhfQ1JDX1JFR1M7CisgIGhDcmNJbmZvLT5yZWdTdGFydCA9IChoQ3JjSW5mby0+cmVnU3RhcnQgKyAxKSAlIE1BWF9DUkNfUkVHUzsKIAogICByZXR1cm4gKHJlZyk7CiB9CiAKLUlOVCBGREtjcmNFbmRSZWcoCi0gICAgICAgIEhBTkRMRV9GREtfQ1JDSU5GTyAgICAgICAgICAgICAgaENyY0luZm8sCi0gICAgICAgIGNvbnN0IEhBTkRMRV9GREtfQklUU1RSRUFNICAgICAgaEJzLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIHJlZwotICAgICAgICApCi17Ci0gIEZES19BU1NFUlQoKHJlZz09KElOVCloQ3JjSW5mby0+cmVnU3RvcCkmJihoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLmlzQWN0aXZlPT0xKSk7CitJTlQgRkRLY3JjRW5kUmVnKEhBTkRMRV9GREtfQ1JDSU5GTyBoQ3JjSW5mbywgY29uc3QgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICBjb25zdCBJTlQgcmVnKSB7CisgIEZES19BU1NFUlQoKHJlZyA9PSAoSU5UKWhDcmNJbmZvLT5yZWdTdG9wKSAmJgorICAgICAgICAgICAgIChoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLmlzQWN0aXZlID09IDEpKTsKIAotICBpZiAoaEJzLT5Db25maWdDYWNoZT09QlNfV1JJVEVSKSB7Ci0gICAgaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS5iaXRCdWZDbnRCaXRzID0gRkRLZ2V0VmFsaWRCaXRzKGhCcykgLSBoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLnZhbGlkQml0czsKLSAgfQotICBlbHNlIHsKLSAgICBoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLmJpdEJ1ZkNudEJpdHMgPSBoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLnZhbGlkQml0cyAtIEZES2dldFZhbGlkQml0cyhoQnMpOworICBpZiAoaEJzLT5Db25maWdDYWNoZSA9PSBCU19XUklURVIpIHsKKyAgICBoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLmJpdEJ1ZkNudEJpdHMgPQorICAgICAgICAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpIC0gaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS52YWxpZEJpdHM7CisgIH0gZWxzZSB7CisgICAgaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS5iaXRCdWZDbnRCaXRzID0KKyAgICAgICAgaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS52YWxpZEJpdHMgLSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpOwogICB9CiAKICAgaWYgKGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10ubWF4Qml0cyA9PSAwKSB7CiAgICAgaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS5tYXhCaXRzID0gaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS5iaXRCdWZDbnRCaXRzOwogICB9CiAKLSAgY3JjQ2FsYyggaENyY0luZm8sIGhCcywgcmVnKTsKKyAgY3JjQ2FsYyhoQ3JjSW5mbywgaEJzLCByZWcpOwogCiAgIGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10uaXNBY3RpdmUgPSAwOwotICBoQ3JjSW5mby0+cmVnU3RvcCA9IChoQ3JjSW5mby0+cmVnU3RvcCsxKSVNQVhfQ1JDX1JFR1M7CisgIGhDcmNJbmZvLT5yZWdTdG9wID0gKGhDcmNJbmZvLT5yZWdTdG9wICsgMSkgJSBNQVhfQ1JDX1JFR1M7CiAKICAgcmV0dXJuIDA7CiB9CiAKLVVTSE9SVCBGREtjcmNHZXRDUkMoCi0gICAgICAgIGNvbnN0IEhBTkRMRV9GREtfQ1JDSU5GTyAgICAgICAgaENyY0luZm8KLSAgICAgICAgKQotewotICByZXR1cm4gKCBoQ3JjSW5mby0+Y3JjVmFsdWUgJiAoKChoQ3JjSW5mby0+Y3JjTWFzay0xKTw8MSkrMSkgKTsKK1VTSE9SVCBGREtjcmNHZXRDUkMoY29uc3QgSEFORExFX0ZES19DUkNJTkZPIGhDcmNJbmZvKSB7CisgIHJldHVybiAoaENyY0luZm8tPmNyY1ZhbHVlICYgKCgoaENyY0luZm8tPmNyY01hc2sgLSAxKSA8PCAxKSArIDEpKTsKIH0KIAogLyoqCkBAIC0zMDksNyArMzIzLDggQEAKICAqCiAgKiBDYWxjdWxhdGUgY3JjIHN0YXJ0aW5nIGF0IGN1cnJlbnQgYml0c3RyZWFtIHBvc3Rpb24gb3ZlciBuQml0cy4KICAqCi0gKiBccGFyYW0gcENyYyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gb3V0bHlpbmcgYWxsb2NhdGVkIGNyYyBpbmZvIHN0cnVjdHVyZS4KKyAqIFxwYXJhbSBwQ3JjICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBvdXRseWluZyBhbGxvY2F0ZWQgY3JjIGluZm8KKyAqIHN0cnVjdHVyZS4KICAqIFxwYXJhbSBjcmNNYXNrICAgICAgICAgICAgICAgQ3JjTWFzayBpbiB1c2UuCiAgKiBccGFyYW0gY3JjUG9seSAgICAgICAgICAgICAgIENyYyBwb2x5bm9tIGluIHVzZS4KICAqIFxwYXJhbSBoQnMgICAgICAgICAgICAgICAgICAgSGFuZGxlIHRvIGN1cnJlbnQgYml0IGJ1ZmZlciBzdHJ1Y3R1cmUuCkBAIC0zMTcsMzEgKzMzMiwyMyBAQAogICoKICAqIFxyZXR1cm4gIE51bWJlciBvZiBwcm9jZXNzZWQgYml0cy4KICAqLwotc3RhdGljIGlubGluZSBJTlQgY2FsY0NyY19CaXRzKAotICAgICAgICBVU0hPUlQgKiBjb25zdCAgICAgICAgICAgICAgICAgIHBDcmMsCi0gICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgY3JjTWFzaywKLSAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICBjcmNQb2x5LAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICAgICAgICAgIGhCcywKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQml0cwotICAgICAgICApCi17CitzdGF0aWMgaW5saW5lIElOVCBjYWxjQ3JjX0JpdHMoVVNIT1JUICpjb25zdCBwQ3JjLCBVU0hPUlQgY3JjTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgY3JjUG9seSwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuQml0cykgewogICBpbnQgaTsKICAgVVNIT1JUIGNyYyA9ICpwQ3JjOyAvKiBnZXQgY3JjIHZhbHVlICovCiAKLSAgaWYgKGhCcyE9TlVMTCkgeworICBpZiAoaEJzICE9IE5VTEwpIHsKICAgICBmb3IgKGkgPSAwOyAoaSA8IG5CaXRzKTsgaSsrKSB7Ci0gICAgICBVU0hPUlQgdG1wID0gRkRLcmVhZEJpdHMoaEJzLDEpOyAgICAgLy8gcHJvY2VzcyBzaW5nbGUgYml0Ci0gICAgICB0bXAgXj0gKCAoY3JjICYgY3JjTWFzaykgPyAxIDogMCApOwotICAgICAgdG1wICo9IGNyY1BvbHk7CisgICAgICBVU0hPUlQgdG1wID0gRkRLcmVhZEJpdChoQnMpOyAgLy8gcHJvY2VzcyBzaW5nbGUgYml0CisgICAgICB0bXAgXj0gKChjcmMgJiBjcmNNYXNrKSA/IDEgOiAwKTsKKyAgICAgIGlmICh0bXAgIT0gMCkgdG1wID0gY3JjUG9seTsKICAgICAgIGNyYyA8PD0gMTsKICAgICAgIGNyYyBePSB0bXA7CiAgICAgfQotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIGZvciAoaSA9IDA7IChpIDwgbkJpdHMpOyBpKyspIHsKLSAgICAgIFVTSE9SVCB0bXAgPSAwOyAgICAgLy8gcHJvY2VzcyBzaW5nbGUgYml0Ci0gICAgICB0bXAgXj0gKCAoY3JjICYgY3JjTWFzaykgPyAxIDogMCApOwotICAgICAgdG1wICo9IGNyY1BvbHk7CisgICAgICBVU0hPUlQgdG1wID0gKGNyYyAmIGNyY01hc2spID8gY3JjUG9seSA6IDA7ICAvLyBwcm9jZXNzIHNpbmdsZSBiaXQKICAgICAgIGNyYyA8PD0gMTsKICAgICAgIGNyYyBePSB0bXA7CiAgICAgfQpAQCAtMzU2LDEwNCArMzYzLDExNyBAQAogICoKICAqIENhbGN1bGF0ZSBjcmMgc3RhcnRpbmcgYXQgY3VycmVudCBiaXRzdHJlYW0gcG9zdGlvbiBvdmVyIG5CeXRlcy4KICAqCi0gKiBccGFyYW0gcENyYyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gb3V0bHlpbmcgYWxsb2NhdGVkIGNyYyBpbmZvIHN0cnVjdHVyZS4KLSAqIFxwYXJhbSBwQ3JjTG9va3VwICAgICAgICAgICAgUG9pbnRlciB0byBsb29rdXAgdGFibGUgdXNlZCBmb3IgZmFzdCBjcmMgY2FsY3VsYXRpb24uCisgKiBccGFyYW0gcENyYyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gb3V0bHlpbmcgYWxsb2NhdGVkIGNyYyBpbmZvCisgKiBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gcENyY0xvb2t1cCAgICAgICAgICAgIFBvaW50ZXIgdG8gbG9va3VwIHRhYmxlIHVzZWQgZm9yIGZhc3QgY3JjCisgKiBjYWxjdWxhdGlvbi4KICAqIFxwYXJhbSBoQnMgICAgICAgICAgICAgICAgICAgSGFuZGxlIHRvIGN1cnJlbnQgYml0IGJ1ZmZlciBzdHJ1Y3R1cmUuCiAgKiBccGFyYW0gbkJpdHMgICAgICAgICAgICAgICAgIE51bWJlciBvZiBwcm9jZXNzaW5nIGJ5dGVzLgogICoKICAqIFxyZXR1cm4gIE51bWJlciBvZiBwcm9jZXNzZWQgYml0cy4KICAqLwotc3RhdGljIGlubGluZSBJTlQgY2FsY0NyY19CeXRlcygKLSAgICAgICAgVVNIT1JUICogY29uc3QgICAgICAgICAgICAgICAgICBwQ3JjLAotICAgICAgICBjb25zdCBVU0hPUlQgKiAgICAgICAgICAgICAgICAgIHBDcmNMb29rdXAsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgICAgICAgICAgaEJzLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5CeXRlcwotICAgICAgICApCi17CisKK3N0YXRpYyBpbmxpbmUgSU5UIGNhbGNDcmNfQnl0ZXMoVVNIT1JUICpjb25zdCBwQ3JjLCBjb25zdCBVU0hPUlQgKnBDcmNMb29rdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgSU5UIG5CeXRlcykgewogICBpbnQgaTsKICAgVVNIT1JUIGNyYyA9ICpwQ3JjOyAvKiBnZXQgY3JjIHZhbHVlICovCiAKLSAgaWYgKGhCcyE9TlVMTCkgewotICAgIGZvciAoaT0wOyBpPG5CeXRlczsgaSsrKSB7Ci0gICAgICBjcmMgPSAoY3JjPDw4KV5wQ3JjTG9va3VwWygoY3JjPj44KV4oKFVDSEFSKUZES3JlYWRCaXRzKGhCcyw4KSkpJjB4RkZdOworICBpZiAoaEJzICE9IE5VTEwpIHsKKyAgICBVTE9ORyBkYXRhOworICAgIElOVCBiaXRzOworICAgIGZvciAoaSA9IDA7IGkgPCAobkJ5dGVzID4+IDIpOyBpKyspIHsKKyAgICAgIGRhdGEgPSAoVUxPTkcpRkRLcmVhZEJpdHMoaEJzLCAzMik7CisgICAgICBjcmMgPQorICAgICAgICAgIChjcmMgPDwgOCkgXiBwQ3JjTG9va3VwWygoY3JjID4+IDgpIF4gKChVU0hPUlQpKGRhdGEgPj4gMjQpKSkgJiAweEZGXTsKKyAgICAgIGNyYyA9CisgICAgICAgICAgKGNyYyA8PCA4KSBeIHBDcmNMb29rdXBbKChjcmMgPj4gOCkgXiAoKFVTSE9SVCkoZGF0YSA+PiAxNikpKSAmIDB4RkZdOworICAgICAgY3JjID0KKyAgICAgICAgICAoY3JjIDw8IDgpIF4gcENyY0xvb2t1cFsoKGNyYyA+PiA4KSBeICgoVVNIT1JUKShkYXRhID4+IDgpKSkgJiAweEZGXTsKKyAgICAgIGNyYyA9CisgICAgICAgICAgKGNyYyA8PCA4KSBeIHBDcmNMb29rdXBbKChjcmMgPj4gOCkgXiAoKFVTSE9SVCkoZGF0YSA+PiAwKSkpICYgMHhGRl07CiAgICAgfQotICB9Ci0gIGVsc2UgewotICAgIGZvciAoaT0wOyBpPG5CeXRlczsgaSsrKSB7Ci0gICAgICBjcmMgPSAoY3JjPDw4KV5wQ3JjTG9va3VwWygoY3JjPj44KV4oKFVDSEFSKTApKSYweEZGXTsKKyAgICBiaXRzID0gKG5CeXRlcyAmIDMpIDw8IDM7CisgICAgaWYgKGJpdHMgPiAwKSB7CisgICAgICBkYXRhID0gKFVMT05HKUZES3JlYWRCaXRzKGhCcywgYml0cyk7CisgICAgICBmb3IgKGJpdHMgLT0gODsgYml0cyA+PSAwOyBiaXRzIC09IDgpCisgICAgICAgIGNyYyA9IChjcmMgPDwgOCkgXgorICAgICAgICAgICAgICBwQ3JjTG9va3VwWygoY3JjID4+IDgpIF4gKFVTSE9SVCkoZGF0YSA+PiBiaXRzKSkgJiAweEZGXTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IG5CeXRlczsgaSsrKSB7CisgICAgICBjcmMgPSAoY3JjIDw8IDgpIF4gcENyY0xvb2t1cFsoY3JjID4+IDgpICYgMHhGRl07CiAgICAgfQogICB9CiAKICAgKnBDcmMgPSBjcmM7IC8qIHVwZGF0ZSBjcmMgdmFsdWUgKi8KIAotICByZXR1cm4gKGkpOworICByZXR1cm4gKG5CeXRlcyk7CiB9CiAKIC8qKgogICogXGJyaWVmICBDYWxjdWxhdGUgY3JjLgogICoKLSAqIENhbGN1bGF0ZSBjcmMuIExlbmdodCBkZXBlbmRzIG9uIG1CaXRzIHBhcmFtZXRlciBpbiBGREtjcmNTdGFydFJlZygpIGNvbmZpZ3VyYXRpb24uCisgKiBDYWxjdWxhdGUgY3JjLiBMZW5naHQgZGVwZW5kcyBvbiBtQml0cyBwYXJhbWV0ZXIgaW4gRkRLY3JjU3RhcnRSZWcoKQorICogY29uZmlndXJhdGlvbi4KICAqCi0gKiBccGFyYW0gaENyY0luZm8gICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gb3V0bHlpbmcgYWxsb2NhdGVkIGNyYyBpbmZvIHN0cnVjdHVyZS4KKyAqIFxwYXJhbSBoQ3JjSW5mbyAgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBvdXRseWluZyBhbGxvY2F0ZWQgY3JjIGluZm8KKyAqIHN0cnVjdHVyZS4KICAqIFxwYXJhbSBoQnMgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBjdXJyZW50IGJpdCBidWZmZXIgc3RydWN0dXJlLgogICogXHBhcmFtIHJlZyAgICAgICAgICAgICAgICAgICBDcmMgcmVnaW9uIElELgogICoKICAqIFxyZXR1cm4gIE51bWJlciBvZiBwcm9jZXNzZWQgYml0cy4KICAqLwotc3RhdGljIHZvaWQgY3JjQ2FsYygKLSAgICAgICAgSEFORExFX0ZES19DUkNJTkZPICAgICAgICAgICAgICBoQ3JjSW5mbywKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgICAgICAgICBoQnMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgcmVnCi0gICAgICAgICkKLXsKK3N0YXRpYyB2b2lkIGNyY0NhbGMoSEFORExFX0ZES19DUkNJTkZPIGhDcmNJbmZvLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCByZWcpIHsKICAgVVNIT1JUIGNyYyA9IGhDcmNJbmZvLT5jcmNWYWx1ZTsKICAgQ0NyY1JlZ0RhdGEgKnJEID0gJmhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ107CiAgIEZES19CSVRTVFJFQU0gYnNSZWFkZXI7CiAKLSAgaWYgKGhCcy0+Q29uZmlnQ2FjaGU9PUJTX1JFQURFUikgeworICBpZiAoaEJzLT5Db25maWdDYWNoZSA9PSBCU19SRUFERVIpIHsKICAgICBic1JlYWRlciA9ICpoQnM7Ci0gICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoJmJzUmVhZGVyLCAtKElOVCkockQtPnZhbGlkQml0cy1GREtnZXRWYWxpZEJpdHMoJmJzUmVhZGVyKSkpOwotICB9Ci0gIGVsc2UgewotICAgIEZES2luaXRCaXRTdHJlYW0oJmJzUmVhZGVyLCBoQnMtPmhCaXRCdWYuQnVmZmVyLCBoQnMtPmhCaXRCdWYuYnVmU2l6ZSwgaEJzLT5oQml0QnVmLlZhbGlkQml0cywgQlNfUkVBREVSKTsKKyAgICBGREtwdXNoQmlEaXJlY3Rpb25hbCgmYnNSZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgLShyRC0+dmFsaWRCaXRzIC0gKElOVClGREtnZXRWYWxpZEJpdHMoJmJzUmVhZGVyKSkpOworICB9IGVsc2UgeworICAgIEZES2luaXRCaXRTdHJlYW0oJmJzUmVhZGVyLCBoQnMtPmhCaXRCdWYuQnVmZmVyLCBoQnMtPmhCaXRCdWYuYnVmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGhCcy0+aEJpdEJ1Zi5WYWxpZEJpdHMsIEJTX1JFQURFUik7CiAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoJmJzUmVhZGVyLCByRC0+dmFsaWRCaXRzKTsKICAgfQogCiAgIGludCBiaXRzLCByQml0czsKLSAgckJpdHMgPSAockQtPm1heEJpdHM+PTApID8gckQtPm1heEJpdHMgOiAtckQtPm1heEJpdHM7IC8qIHJhbWFpbmluZyBiaXRzICovCi0gIGlmICgockQtPm1heEJpdHM+MCkgJiYgKCgoSU5UKXJELT5iaXRCdWZDbnRCaXRzPj4zPDwzKTxyQml0cykgKSB7CisgIHJCaXRzID0gKHJELT5tYXhCaXRzID49IDApID8gckQtPm1heEJpdHMgOiAtckQtPm1heEJpdHM7IC8qIHJhbWFpbmluZyBiaXRzICovCisgIGlmICgockQtPm1heEJpdHMgPiAwKSAmJiAoKHJELT5iaXRCdWZDbnRCaXRzID4+IDMgPDwgMykgPCByQml0cykpIHsKICAgICBiaXRzID0gckQtPmJpdEJ1ZkNudEJpdHM7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgYml0cyA9IHJCaXRzOwogICB9CiAKICAgaW50IHdvcmRzID0gYml0cyA+PiAzOyAgLyogcHJvY2Vzc2luZyBieXRlcyAqLwogICBpbnQgbUJpdHMgPSBiaXRzICYgMHg3OyAvKiBtb2R1bG8gYml0cyAqLwogCi0gIGlmKGhDcmNJbmZvLT5wQ3JjTG9va3VwKSB7Ci0gICAgckJpdHMgLT0gKGNhbGNDcmNfQnl0ZXMoJmNyYywgaENyY0luZm8tPnBDcmNMb29rdXAsICZic1JlYWRlciwgd29yZHMpPDwzKTsKLSAgfQotICBlbHNlIHsKLSAgICByQml0cyAtPSBjYWxjQ3JjX0JpdHMoJmNyYywgaENyY0luZm8tPmNyY01hc2ssIGhDcmNJbmZvLT5jcmNQb2x5LCAmYnNSZWFkZXIsIHdvcmRzPDwzICk7CisgIGlmIChoQ3JjSW5mby0+cENyY0xvb2t1cCkgeworICAgIHJCaXRzIC09IChjYWxjQ3JjX0J5dGVzKCZjcmMsIGhDcmNJbmZvLT5wQ3JjTG9va3VwLCAmYnNSZWFkZXIsIHdvcmRzKSA8PCAzKTsKKyAgfSBlbHNlIHsKKyAgICByQml0cyAtPSBjYWxjQ3JjX0JpdHMoJmNyYywgaENyY0luZm8tPmNyY01hc2ssIGhDcmNJbmZvLT5jcmNQb2x5LCAmYnNSZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRzIDw8IDMpOwogICB9CiAKICAgLyogcmVtYWluaW5nIHZhbGlkIGJpdHMqLwotICBpZihtQml0cyE9MCkgewotICAgIHJCaXRzIC09IGNhbGNDcmNfQml0cygmY3JjLCBoQ3JjSW5mby0+Y3JjTWFzaywgaENyY0luZm8tPmNyY1BvbHksICZic1JlYWRlciwgbUJpdHMgKTsKKyAgaWYgKG1CaXRzICE9IDApIHsKKyAgICByQml0cyAtPSBjYWxjQ3JjX0JpdHMoJmNyYywgaENyY0luZm8tPmNyY01hc2ssIGhDcmNJbmZvLT5jcmNQb2x5LCAmYnNSZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRzKTsKICAgfQogCi0gIGlmIChyQml0cyE9MCkgeworICBpZiAockJpdHMgIT0gMCkgewogICAgIC8qIHplcm8gYnl0ZXMgKi8KLSAgICBpZiAoIChoQ3JjSW5mby0+cENyY0xvb2t1cCkgJiYgKHJCaXRzPjgpICkgewotICAgICAgckJpdHMgLT0gKGNhbGNDcmNfQnl0ZXMoJmNyYywgaENyY0luZm8tPnBDcmNMb29rdXAsIE5VTEwsIHJCaXRzPj4zKTw8Myk7CisgICAgaWYgKChoQ3JjSW5mby0+cENyY0xvb2t1cCkgJiYgKHJCaXRzID4gOCkpIHsKKyAgICAgIHJCaXRzIC09CisgICAgICAgICAgKGNhbGNDcmNfQnl0ZXMoJmNyYywgaENyY0luZm8tPnBDcmNMb29rdXAsIE5VTEwsIHJCaXRzID4+IDMpIDw8IDMpOwogICAgIH0KICAgICAvKiByZW1haW5pbmcgemVybyBiaXRzICovCi0gICAgaWYgKHJCaXRzIT0wKSB7Ci0gICAgICByQml0cyAtPSBjYWxjQ3JjX0JpdHMoJmNyYywgaENyY0luZm8tPmNyY01hc2ssIGhDcmNJbmZvLT5jcmNQb2x5LCBOVUxMLCByQml0cyApOworICAgIGlmIChyQml0cyAhPSAwKSB7CisgICAgICBjYWxjQ3JjX0JpdHMoJmNyYywgaENyY0luZm8tPmNyY01hc2ssIGhDcmNJbmZvLT5jcmNQb2x5LCBOVUxMLCByQml0cyk7CiAgICAgfQogICB9CiAKICAgaENyY0luZm8tPmNyY1ZhbHVlID0gY3JjOwogfQotCmRpZmYgLS1naXQgYS9saWJGREsvc3JjL0ZES19kZWNvcnJlbGF0ZS5jcHAgYi9saWJGREsvc3JjL0ZES19kZWNvcnJlbGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2NjViNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYkZESy9zcmMvRkRLX2RlY29ycmVsYXRlLmNwcApAQCAtMCwwICsxLDE3NDQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hcmt1cyBMb2h3YXNzZXIKKworICAgRGVzY3JpcHRpb246IEZESyBUb29scyBEZWNvcnJlbGF0b3IKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkZES19kZWNvcnJlbGF0ZS5oIgorCisjZGVmaW5lIFBDX05VTV9CQU5EUyAoOCkKKyNkZWZpbmUgUENfTlVNX0hZQl9CQU5EUyAoUENfTlVNX0JBTkRTIC0gMyArIDEwKQorCisjZGVmaW5lIERVQ0tfQUxQSEEgKDAuOGYpCisjZGVmaW5lIERVQ0tfR0FNTUEgKDEuNWYpCisjZGVmaW5lIEFCU19USFIgKDFlLTlmICogMzI3NjggKiAzMjc2OCkKKyNkZWZpbmUgQUJTX1RIUl9GREsgKChGSVhQX0RCTCkxKQorCisjZGVmaW5lIERFQ09SUl9aRVJPX1BBRERJTkcgMAorCisjZGVmaW5lIERFQ09SUl9GSUxURVJfT1JERVJfQkFORF8wX01QUyAoMjApCisjZGVmaW5lIERFQ09SUl9GSUxURVJfT1JERVJfQkFORF8xX01QUyAoMTUpCisjZGVmaW5lIERFQ09SUl9GSUxURVJfT1JERVJfQkFORF8yX01QUyAoNikKKyNkZWZpbmUgREVDT1JSX0ZJTFRFUl9PUkRFUl9CQU5EXzNfTVBTICgzKQorCisjZGVmaW5lIERFQ09SUl9GSUxURVJfT1JERVJfQkFORF8wX1VTQUMgKDEwKQorI2RlZmluZSBERUNPUlJfRklMVEVSX09SREVSX0JBTkRfMV9VU0FDICg4KQorI2RlZmluZSBERUNPUlJfRklMVEVSX09SREVSX0JBTkRfMl9VU0FDICgzKQorI2RlZmluZSBERUNPUlJfRklMVEVSX09SREVSX0JBTkRfM19VU0FDICgyKQorCisjZGVmaW5lIERFQ09SUl9GSUxURVJfT1JERVJfQkFORF8wX0xEICgwKQorI2RlZmluZSBERUNPUlJfRklMVEVSX09SREVSX0JBTkRfMV9MRCAoREVDT1JSX0ZJTFRFUl9PUkRFUl9CQU5EXzFfTVBTKQorI2RlZmluZSBERUNPUlJfRklMVEVSX09SREVSX0JBTkRfMl9MRCAoREVDT1JSX0ZJTFRFUl9PUkRFUl9CQU5EXzJfTVBTKQorI2RlZmluZSBERUNPUlJfRklMVEVSX09SREVSX0JBTkRfM19MRCAoREVDT1JSX0ZJTFRFUl9PUkRFUl9CQU5EXzNfTVBTKQorCisjZGVmaW5lIE1BWF9ERUNPUlJfU0VFRF9NUFMgXAorICAoNSkgLyogNCBpcyB3b3JzdCBjYXNlIGZvciA3MjcyIG1vZGUgZm9yIGxvdyBwb3dlciAqLworICAgICAgLyogNSBpcyB3b3JzdCBjYXNlIGZvciA3MjcxIGFuZCA3MjcyIG1vZGUgZm9yIGhpZ2ggcXVhbGl0eSAqLworI2RlZmluZSBNQVhfREVDT1JSX1NFRURfVVNBQyAoMSkKKyNkZWZpbmUgTUFYX0RFQ09SUl9TRUVEX0xEICg0KQorCisjZGVmaW5lIERFQ09SUl9GSUxURVJfT1JERVJfUFMgKDEyKQorI2RlZmluZSBOVU1fREVDT1JSX0NPTkZJR1MgXAorICAoMykgLyogZGlmZmVyZW50IGNvbmZpZ3MgZGVmaW5lZCBieSBic0RlY29yckNvbmZpZyBiaXRzdHJlYW0gZmllbGQgKi8KKworLyogUkVWX2JhbmRPZmZzZXRfLi4uIHRhYmxlcyBtYXAgKGh5YnJpZCkgYmFuZHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcmV2ZXJiCisgICBiYW5kcy4gV2l0aGluIGVhY2ggcmV2ZXJiIGJhbmQgdGhlIHNhbWUgcHJvY2Vzc2luZyBpcyBhcHBsaWVkLiBJbnN0ZWFkIG9mIFFNRgorICAgc3BsaXQgZnJlcXVlbmNpZXMgdGhlIGNvcnJlc3BvbmRpbmcgaHlicmlkIGJhbmQgb2Zmc2V0cyBhcmUgc3RvcmVkIGRpcmVjdGx5CisgKi8KK3N0YXRpYyBjb25zdCBVQ0hBUiBSRVZfYmFuZE9mZnNldF9NUFNfSFFbTlVNX0RFQ09SUl9DT05GSUdTXVsoNCldID0geworICAgIHs4LCAyMSwgMzAsIDcxfSwgezgsIDU2LCA3MSwgNzF9LCB7MCwgMjEsIDcxLCA3MX19OworLyogUkVWX2JhbmRPZmZzZXRfVVNBQ1tdIGFyZSBlcXVpdmFsZW50IHRvIFJFVl9iYW5kT2Zmc2V0X01QU19IUSAqLworc3RhdGljIGNvbnN0IFVDSEFSIFJFVl9iYW5kT2Zmc2V0X1BTX0hRWyg0KV0gPSB7MzAsIDQyLCA3MSwgNzF9Oworc3RhdGljIGNvbnN0IFVDSEFSIFJFVl9iYW5kT2Zmc2V0X1BTX0xQWyg0KV0gPSB7MTQsIDQyLCA3MSwgNzF9Oworc3RhdGljIGNvbnN0IFVDSEFSIFJFVl9iYW5kT2Zmc2V0X0xEW05VTV9ERUNPUlJfQ09ORklHU11bKDQpXSA9IHsKKyAgICB7MCwgMTQsIDIzLCA2NH0sIHswLCA0OSwgNjQsIDY0fSwgezAsIDE0LCA2NCwgNjR9fTsKKworLyogUkVWX2RlbGF5Xy4uLiB0YWJsZXMgZGVmaW5lIHRoZSBudW1iZXIgb2YgZGVsYXkgZWxlbWVudHMgd2l0aGluIGVhY2ggcmV2ZXJiCisgKiBiYW5kICovCisvKiBSRVZfZmlsdGVyT3JkZXJfLi4uIHRhYmxlcyBkZWZpbmUgdGhlIGZpbHRlciBvcmRlciB3aXRoaW4gZWFjaCByZXZlcmIgYmFuZCAqLworc3RhdGljIGNvbnN0IFVDSEFSIFJFVl9kZWxheV9NUFNbKDQpXSA9IHs4LCA3LCAyLCAxfTsKK3N0YXRpYyBjb25zdCBTQ0hBUiBSRVZfZmlsdGVyT3JkZXJfTVBTWyg0KV0gPSB7CisgICAgREVDT1JSX0ZJTFRFUl9PUkRFUl9CQU5EXzBfTVBTLCBERUNPUlJfRklMVEVSX09SREVSX0JBTkRfMV9NUFMsCisgICAgREVDT1JSX0ZJTFRFUl9PUkRFUl9CQU5EXzJfTVBTLCBERUNPUlJfRklMVEVSX09SREVSX0JBTkRfM19NUFN9Oworc3RhdGljIGNvbnN0IFVDSEFSIFJFVl9kZWxheV9QU19IUVsoNCldID0gezIsIDE0LCAxLCAwfTsKK3N0YXRpYyBjb25zdCBVQ0hBUiBSRVZfZGVsYXlfUFNfTFBbKDQpXSA9IHs4LCAxNCwgMSwgMH07CitzdGF0aWMgY29uc3QgU0NIQVIgUkVWX2ZpbHRlck9yZGVyX1BTWyg0KV0gPSB7REVDT1JSX0ZJTFRFUl9PUkRFUl9QUywgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xfTsKK3N0YXRpYyBjb25zdCBVQ0hBUiBSRVZfZGVsYXlfVVNBQ1soNCldID0gezExLCAxMCwgNSwgMn07CitzdGF0aWMgY29uc3QgU0NIQVIgUkVWX2ZpbHRlck9yZGVyX1VTQUNbKDQpXSA9IHsKKyAgICBERUNPUlJfRklMVEVSX09SREVSX0JBTkRfMF9VU0FDLCBERUNPUlJfRklMVEVSX09SREVSX0JBTkRfMV9VU0FDLAorICAgIERFQ09SUl9GSUxURVJfT1JERVJfQkFORF8yX1VTQUMsIERFQ09SUl9GSUxURVJfT1JERVJfQkFORF8zX1VTQUN9OworCisvKiBSRVZfZmlsdFR5cGVfLi4uIHRhYmxlcyBkZWZpbmUgdGhlIHR5cGUgb2YgcHJvY2Vzc2luZyAoZmlsdGVyaW5nIHdpdGgKKyAgIGRpZmZlcmVudCBwcm9wZXJ0aWVzIG9yIHB1cmUgZGVsYXkpIGRvbmUgaW4gZWFjaCByZXZlcmIgYmFuZC4gVGhpcyBpcyBtYXBwZWQKKyAgIHRvIHNwZWNpYWxpemVkIHJvdXRpbmVzLiAqLworc3RhdGljIGNvbnN0IFJFVkJBTkRfRklMVF9UWVBFIFJFVl9maWx0VHlwZV9NUFNbKDQpXSA9IHsKKyAgICBDT01NT05fUkVBTCwgQ09NTU9OX1JFQUwsIENPTU1PTl9SRUFMLCBDT01NT05fUkVBTH07CisKK3N0YXRpYyBjb25zdCBSRVZCQU5EX0ZJTFRfVFlQRSBSRVZfZmlsdFR5cGVfUFNbKDQpXSA9IHtJTkRFUF9DUExYX1BTLCBERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUxBWSwgTk9UX0VYSVNUfTsKKworLyogaW5pdGlhbGl6YXRpb24gdmFsdWVzIG9mIHJpbmcgYnVmZmVyIG9mZnNldHMgZm9yIHRoZSAzIGNvbmNhdGVuYXRlZCBhbGxwYXNzCisgKiBmaWx0ZXJzIChQUyB0eXBlIGRlY29ycmVsYXRvcikuICovCitzdGF0aWMgY29uc3QgVUNIQVIgc3RhdGVCdWZmZXJPZmZzZXRJbml0WygzKV0gPSB7MCwgNiwgMTR9OworCitzdGF0aWMgY29uc3QgUkVWQkFORF9GSUxUX1RZUEUgUkVWX2ZpbHRUeXBlX0xEWyg0KV0gPSB7CisgICAgTk9UX0VYSVNULCBDT01NT05fUkVBTCwgQ09NTU9OX1JFQUwsIENPTU1PTl9SRUFMfTsKKworLyoqKiBtYXBwaW5nIG9mIGh5YnJpZCBiYW5kcyB0byBwcm9jZXNzaW5nICgvcGFyYW1ldGVyPykgYmFuZHMgKioqLworLyogdGFibGUgZm9yIFBTIGRlY29yciBydW5uaW5nIGluIGxlZ2FjeSBQUyBkZWNvZGVyLiAqLworc3RhdGljIGNvbnN0IFVDSEFSIGtlcm5lbHNfMjBfdG9fNzFfUFNbKDcxKSArIDFdID0geworICAgIDAsICAwLCAgMSwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTQsCisgICAgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwKKyAgICAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LAorICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTl9OworCisvKioqIG1hcHBpbmcgb2YgcHJvY2Vzc2luZyAoL3BhcmFtZXRlcj8pIGJhbmRzIHRvIGh5YnJpZCBiYW5kcyAqKiovCisvKiB0YWJsZSBmb3IgUFMgZGVjb3JyIHJ1bm5pbmcgaW4gbGVnYWN5IFBTIGRlY29kZXIuICovCitzdGF0aWMgY29uc3QgVUNIQVIga2VybmVsc18yMF90b183MV9vZmZzZXRfUFNbKDIwKSArIDFdID0geworICAgIDAsIDIsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxOCwgMjEsIDI1LCAzMCwgNDIsIDcxfTsKKworc3RhdGljIGNvbnN0IFVDSEFSIGtlcm5lbHNfMjhfdG9fNzFbKDcxKSArIDFdID0geworICAgIDAsICAwLCAgMSwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgICAgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjIsIDIyLCAyMiwgMjMsIDIzLCAyMywKKyAgICAyMywgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LAorICAgIDI2LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjd9OworCitzdGF0aWMgY29uc3QgVUNIQVIga2VybmVsc18yOF90b183MV9vZmZzZXRbKDI4KSArIDFdID0geworICAgIDAsICAyLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsCisgICAgMTcsIDE4LCAxOSwgMjEsIDIzLCAyNSwgMjcsIDMwLCAzMywgMzcsIDQyLCA0OCwgNTUsIDcxfTsKKworLyogTEQtTVBTIGRlZmluZWQgaW4gU0FPQyBzdGFuZGFydCAobWFwcGluZyBxbWYgLT4gcGFyYW0gYmFuZHMpKi8KK3N0YXRpYyBjb25zdCBVQ0hBUiBrZXJuZWxzXzIzX3RvXzY0Wyg2NCkgKyAxXSA9IHsKKyAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgMTAsIDExLCAxMiwgMTIsIDEzLCAxMywgMTQsCisgICAgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsIDE5LCAxOSwgMTksIDE5LAorICAgIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjIsIDIyLCAyMiwKKyAgICAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsCit9OworCitzdGF0aWMgY29uc3QgVUNIQVIga2VybmVsc18yM190b182NF9vZmZzZXRbKDIzKSArIDFdID0geworICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICAxMCwgMTEsCisgICAgMTIsIDE0LCAxNiwgMTgsIDIwLCAyMywgMjYsIDMwLCAzNSwgNDEsIDQ4LCA2NH07CisKK3N0YXRpYyBpbmxpbmUgaW50IFNwYXRpYWxEZWNHZXRQcm9jZXNzaW5nQmFuZChpbnQgaHlicmlkQmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqdGFiKSB7CisgIHJldHVybiB0YWJbaHlicmlkQmFuZF07Cit9CisKKy8qIGhlbHBlciBpbmxpbmUgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbmxpbmUgaW50IFNwYXRpYWxEZWNHZXRRbWZCYW5kKGludCBwYXJhbUJhbmQsIGNvbnN0IFVDSEFSICp0YWIpIHsKKyAgcmV0dXJuIChpbnQpdGFiW3BhcmFtQmFuZF07Cit9CisKKyNkZWZpbmUgRFVDS0VSX01BWF9OUkdfU0NBTEUgKDI0KQorI2RlZmluZSBEVUNLRVJfSEVBRFJPT01fQklUUyAoMykKKworI2RlZmluZSBGSUxURVJfU0YgKDIpCisKKyNpZmRlZiBBUkNIX1BSRUZFUl9NVUxUXzMyeDMyCisjZGVmaW5lIEZJWFBfRFVDS19HQUlOIEZJWFBfREJMCisjZGVmaW5lIEZYX0RCTDJGWF9EVUNLX0dBSU4KKyNkZWZpbmUgRkwyRlhDT05TVF9EVUNLIEZMMkZYQ09OU1RfREJMCisjZWxzZQorI2RlZmluZSBGSVhQX0RVQ0tfR0FJTiBGSVhQX1NHTAorI2RlZmluZSBGWF9EQkwyRlhfRFVDS19HQUlOIEZYX0RCTDJGWF9TR0wKKyNkZWZpbmUgRkwyRlhDT05TVF9EVUNLIEZMMkZYQ09OU1RfU0dMCisjZW5kaWYKKyNkZWZpbmUgUFNfRFVDS19QRUFLX0RFQ0FZX0ZBQ1RPUiAoMC43NjU5MjgzMzgzNjQ2NDlmKQorI2RlZmluZSBQU19EVUNLX0ZJTFRFUl9DT0VGRiAoMC4yNWYpCisjZGVmaW5lIERVQ0tfQUxQSEFfRkRLIEZMMkZYQ09OU1RfRFVDSyhEVUNLX0FMUEhBKQorI2RlZmluZSBEVUNLX09ORV9NSU5VU19BTFBIQV9YNF9GREsgRkwyRlhDT05TVF9EVUNLKDQuMGYgKiAoMS4wZiAtIERVQ0tfQUxQSEEpKQorI2RlZmluZSBEVUNLX0dBTU1BX0ZESyBGTDJGWENPTlNUX0RVQ0soRFVDS19HQU1NQSAvIDIpCisjZGVmaW5lIFBTX0RVQ0tfUEVBS19ERUNBWV9GQUNUT1JfRkRLIEZMMkZYQ09OU1RfRFVDSyhQU19EVUNLX1BFQUtfREVDQVlfRkFDVE9SKQorI2RlZmluZSBQU19EVUNLX0ZJTFRFUl9DT0VGRl9GREsgRkwyRlhDT05TVF9EVUNLKFBTX0RVQ0tfRklMVEVSX0NPRUZGKQorUkFNX0FMSUdOCitjb25zdCBGSVhQX1NUUCBEZWNvcnJQc0NvZWZmc0NwbHhbXVs0XSA9IHsKKyAgICB7U1RDUCgweDVkNjk0MGViLCAweDU3ODMxNTNlKSwgU1RDUCgweGFkY2Q0MWE4LCAweDBlMDM3M2VkKSwKKyAgICAgU1RDUCgweGJhZDQxZjNlLCAweDE0ZmJhMDQ1KSwgU1RDUCgweGMxZWI2Njk0LCAweDA4ODMyMjdkKX0sCisgICAge1NUQ1AoMHg1ZDY5NDBlYiwgMHhhODdjZWFjMiksIFNUQ1AoMHhhZGNkNDFhOCwgMHhmMWZjOGMxMyksCisgICAgIFNUQ1AoMHhiYWQ0MWYzZSwgMHhlYjA0NWZiYiksIFNUQ1AoMHhjMWViNjY5NCwgMHhmNzdjZGQ4Myl9LAorICAgIHtTVENQKDB4YWVjMjQxNjIsIDB4NjJlOWQ3NWIpLCBTVENQKDB4YjcxNjkzMTYsIDB4Mjg3NTEwNDgpLAorICAgICBTVENQKDB4ZDIyNGMwY2MsIDB4MzdlMDUwNTApLCBTVENQKDB4YzY4MDg2NGYsIDB4MThlODhjYmEpfSwKKyAgICB7U1RDUCgweGFlYzI0MTYyLCAweDlkMTYyOGE1KSwgU1RDUCgweGI3MTY5MzE2LCAweGQ3OGFlZmI4KSwKKyAgICAgU1RDUCgweGQyMjRjMGNjLCAweGM4MWZhZmIwKSwgU1RDUCgweGM2ODA4NjRmLCAweGU3MTc3MzQ2KX0sCisgICAge1NUQ1AoMHg5ODAxMjM0MSwgMHg0YWEwMGVkMSksIFNUQ1AoMHhjODljYTFiMiwgMHhjMWFiNmJmZiksCisgICAgIFNUQ1AoMHhmOGVhMzk0ZSwgMHhiODEwNmJmNCksIFNUQ1AoMHhjZjU0MmQ3MywgMHhkODg4Yjk5Yil9LAorICAgIHtTVENQKDB4NDNiMTM3YjMsIDB4NmNhMmNhNDApLCBTVENQKDB4ZTA2NDljYzQsIDB4YjJkNjljY2EpLAorICAgICBTVENQKDB4MjIxMzBjMjEsIDB4YzA0MDUzODIpLCBTVENQKDB4ZGJiZjhmYmEsIDB4Y2NlM2M3Y2MpfSwKKyAgICB7U1RDUCgweDI4ZmM0ZDcxLCAweDg2YmQzYjg3KSwgU1RDUCgweDA5Y2NmZWI5LCAweGFkMzE5YmFmKSwKKyAgICAgU1RDUCgweDQ2ZTUxZjAyLCAweGYxZTVlYTU1KSwgU1RDUCgweGYzMGQ1ZTM0LCAweGMyYjBlMzM1KX0sCisgICAge1NUQ1AoMHhjNzk4Zjc1NiwgMHg3MmU3M2M3ZCksIFNUQ1AoMHgzYjZjM2MxZSwgMHhjNTgwZGM3MiksCisgICAgIFNUQ1AoMHgyODI4YTZiYSwgMHgzYzFhMTRmYiksIFNUQ1AoMHgxNGI3MzNiYiwgMHhjNGRjYWFlMSl9LAorICAgIHtTVENQKDB4NDZkY2FkZDMsIDB4OTU2Nzk1YzcpLCBTVENQKDB4NTJmMzJmYWUsIDB4Zjc4MDQ4Y2QpLAorICAgICBTVENQKDB4ZDdkNzU5NDYsIDB4M2MxYTE0ZmIpLCBTVENQKDB4MzA2MDE3Y2IsIDB4ZDgyYzBhNzUpfSwKKyAgICB7U1RDUCgweGFiZTE5N2RlLCAweDYwN2E2NzVlKSwgU1RDUCgweDQ2MGNlZjZlLCAweDJkM2IyNjRlKSwKKyAgICAgU1RDUCgweGI5MWFlMGZlLCAweGYxZTVlYTU1KSwgU1RDUCgweDNlMDNlNWUwLCAweGY3MDY1OTBlKX0sCisgICAge1NUQ1AoMHhiMWI0ZjUwOSwgMHg5YWJjYWY1ZiksIFNUQ1AoMHhmZWIwYjRiZSwgMHg1MzVmYjhiYSksCisgICAgIFNUQ1AoMHgxYmE5NmY4ZSwgMHhiZDM3ZTZkOCksIFNUQ1AoMHgzMGY2ZGJiYiwgMHgyNzFhMDc0Myl9LAorICAgIHtTVENQKDB4Y2U3NWI1MmEsIDB4ODlmOWJlNjEpLCBTVENQKDB4YjI2ZTRkZGEsIDB4MTAxMDU0YzUpLAorICAgICBTVENQKDB4MWE0NzVkMmUsIDB4M2Y3MTRiMTkpLCBTVENQKDB4ZjQ5MWYxNTQsIDB4M2E2YmFmNDYpfSwKKyAgICB7U1RDUCgweGVlOGZkZmNiLCAweDgxMzE4MWZhKSwgU1RDUCgweGUxMWUxYTAwLCAweGJiOWE2MDM5KSwKKyAgICAgU1RDUCgweGMzZTU4MmY1LCAweGU3MWFiNTMzKSwgU1RDUCgweGM5ZWIzNWUyLCAweDBmZmQyMTJhKX0sCisgICAge1NUQ1AoMHgwZmQ3ZDkyZiwgMHg4MGZiZjk3NSksIFNUQ1AoMHgzOGFkY2NiYywgMHhkNTcxYmJmNCksCisgICAgIFNUQ1AoMHgzOGMzYWVmYywgMHhlODdjYzc5NCksIFNUQ1AoMHhkYWZlOGMzZCwgMHhkOWIxNjEwMCl9LAorICAgIHtTVENQKDB4MzAwZDllMTAsIDB4ODk1Y2MzNTkpLCBTVENQKDB4MzJiOTg0M2UsIDB4MmI1MmFkY2MpLAorICAgICBTVENQKDB4ZTlkZWQ5ZjQsIDB4MzU2Y2UwZWQpLCBTVENQKDB4MGZkZDVjYTMsIDB4ZDA3MjkzMmUpfSwKKyAgICB7U1RDUCgweDRkMDNiNGY4LCAweDk5YzJkZWMzKSwgU1RDUCgweGUyYmM4ZDk0LCAweDM3NDRlMTk1KSwKKyAgICAgU1RDUCgweGViNDBlYzU1LCAweGNkZTllZDIyKSwgU1RDUCgweDJlNjdlMjMxLCAweGY4OTM0NzBiKX0sCisgICAge1NUQ1AoMHg2NGM0ZGViMywgMHhiMTEyNzkwZiksIFNUQ1AoMHhjN2IzMjY4MiwgMHhmMDk5MTcyZCksCisgICAgIFNUQ1AoMHgyZWJmNDRjZiwgMHgxMzVkMDE0YSksIFNUQ1AoMHgxYTJiYWNkNSwgMHgyMzMzNDI1NCl9LAorICAgIHtTVENQKDB4NzViNWY5YWEsIDB4Y2RiODFlMTQpLCBTVENQKDB4MDI4ZDliYjEsIDB4YzlkYzQ1YjkpLAorICAgICBTVENQKDB4ZDQ5Nzg5M2YsIDB4MTFmYWVlZTkpLCBTVENQKDB4ZWU0MGZmNzEsIDB4MjRhOTFiODUpfSwKKyAgICB7U1RDUCgweDdlYjFjZDgxLCAweGVkYzNmZWVjKSwgU1RDUCgweDMxNDkxODk3LCAweGY3NjVmNmQ4KSwKKyAgICAgU1RDUCgweDEwOThkYzg5LCAweGQ3ZWU1NzRlKSwgU1RDUCgweGRhNmI4MTZkLCAweDAxMWYzNWNmKX0sCisgICAge1NUQ1AoMHg3ZjFjZGUwMSwgMHgwZjBiNzcyNyksIFNUQ1AoMHgxMThjZTQ5ZCwgMHgyYTVlY2RhNCksCisgICAgIFNUQ1AoMHgwZjM2Y2EyOCwgMHgyNGJhZGFhMyksIFNUQ1AoMHhlZjI5MDhhNCwgMHhlMWVlMzc0Myl9LAorICAgIHtTVENQKDB4NzZlZmVlMjUsIDB4MmY0ZThjM2EpLCBTVENQKDB4ZGRlM2JlMmEsIDB4MTdmOTIyMTUpLAorICAgICBTVENQKDB4ZGU5YmYzNmMsIDB4ZjIyYjQ4MzkpLCBTVENQKDB4MTEyOGZjMGMsIDB4ZTVjOTVmNWEpfSwKKyAgICB7U1RDUCgweDY2Yjg3ZDY1LCAweDRjNWVkZTQyKSwgU1RDUCgweGU0M2YzNTFhLCAweGU2YmYyMmRjKSwKKyAgICAgU1RDUCgweDFlMGQzZTg1LCAweGYzOGQ1YTlhKSwgU1RDUCgweDFjMGY0NGEzLCAweDAyYzkyZmUzKX0sCisgICAge1NUQ1AoMHg0ZjhmMzZiNywgMHg2NDQ1NjgwZiksIFNUQ1AoMHgxMDg2N2VhMiwgMHhlMzA3Mjc0MCksCisgICAgIFNUQ1AoMHhmNGVmNmNmYSwgMHgxYWI2NzA3NiksIFNUQ1AoMHgwOTU2MmE4YSwgMHgxNzQyYmI4Yil9LAorICAgIHtTVENQKDB4MzMwNGY2ZWMsIDB4NzU2NDgxMmEpLCBTVENQKDB4MWJlNGYxYTgsIDB4MDg5NGQ3NWEpLAorICAgICBTVENQKDB4ZjY1MTdmNWIsIDB4ZThhMDVkOTgpLCBTVENQKDB4ZjFiYjAwNTMsIDB4MTBhNzg4NTMpfSwKKyAgICB7U1RDUCgweDEzMDdiMmM1LCAweDdlOTNkNTMyKSwgU1RDUCgweGZlMDk4ZTI3LCAweDE4ZjAyYTU4KSwKKyAgICAgU1RDUCgweDE0MDhkNDU5LCAweDA4NGM2ZTQ0KSwgU1RDUCgweGVkYWZlNWJkLCAweGZiYzE1YjJlKX0sCisgICAge1NUQ1AoMHhmMWMxMTFjZCwgMHg3ZjM0NmM5NyksIFNUQ1AoMHhlYjVjYTZhMCwgMHgwMmVmZWU5MyksCisgICAgIFNUQ1AoMHhlZjRkZjliNiwgMHgwNmVhNWJlNCksIFNUQ1AoMHhmYzE0OTI4OSwgMHhmMGQ1M2NlNCl9LAorICAgIHtTVENQKDB4ZDE3MTAwMDEsIDB4NzczYjZiZWIpLCBTVENQKDB4ZmExYWViOGMsIDB4ZjA2NjU1ZmYpLAorICAgICBTVENQKDB4MDU4ODQ5ODMsIDB4ZjJhNGM3YzUpLCBTVENQKDB4MDk0ZjEzZGYsIDB4Zjc5YzAxYmYpfSwKKyAgICB7U1RDUCgweGI0NDZiZTBiLCAweDY3MzJjZmNhKSwgU1RDUCgweDBhNzQzNzUyLCAweGY5MjIwZGZhKSwKKyAgICAgU1RDUCgweDA0MjYzNzIyLCAweDBhMDQ2YTJjKSwgU1RDUCgweDA4Y2VkODBiLCAweDAzNDdlOWMyKX0sCisgICAge1NUQ1AoMHg5YzNiMTIwMiwgMHg1MDMwMThhNSksIFNUQ1AoMHgwNWZjZjAxYSwgMHgwNWNkODUyOSksCisgICAgIFNUQ1AoMHhmOTUyNjNlMiwgMHhmZDNiZGIzZiksIFNUQ1AoMHgwMGM2OGNmOSwgMHgwNjM3Y2I3Zil9LAorICAgIHtTVENQKDB4OGFlZTI3MTAsIDB4MzNjMTg3ZWMpLCBTVENQKDB4ZmRkMjUzZjgsIDB4MDM4ZTA5YjkpLAorICAgICBTVENQKDB4MDM1NmNlMGYsIDB4ZmU5ZGVkOWYpLCBTVENQKDB4ZmQ2YzMwNTQsIDB4MDFjODA2MGEpfX07CisKK2NvbnN0IEZJWFBfREVDT1JSIERlY29yck51bWVyYXRvclJlYWwwX1VTQUMKKyAgICBbTUFYX0RFQ09SUl9TRUVEX1VTQUNdW0RFQ09SUl9GSUxURVJfT1JERVJfQkFORF8wX1VTQUMgKyAxXSA9IHsKKyAgICAgICAge0RFQ09SUigweDA1YmY0ODgwKSwgREVDT1JSKDB4MDgzMjFjMDApLCBERUNPUlIoMHhlOTMxNWVlMCksCisgICAgICAgICBERUNPUlIoMHgwN2Q5ZGQyMCksIERFQ09SUigweDAyMjI0OTk0KSwgREVDT1JSKDB4MDAwOWQyMDApLAorICAgICAgICAgREVDT1JSKDB4ZjhhMjkzNTgpLCBERUNPUlIoMHhmNGUzMTBkMCksIERFQ09SUigweGVmOTAxZmMwKSwKKyAgICAgICAgIERFQ09SUigweGViZGEwNDYwKSwgREVDT1JSKDB4NDAwMDAwMDApfX07CisKK2NvbnN0IEZJWFBfREVDT1JSIERlY29yck51bWVyYXRvclJlYWwxX1VTQUMKKyAgICBbTUFYX0RFQ09SUl9TRUVEX1VTQUNdW0RFQ09SUl9GSUxURVJfT1JERVJfQkFORF8xX1VTQUMgKyAxXSA9IHsKKyAgICAgICAge0RFQ09SUigweGY4MmY4Mzc4KSwgREVDT1JSKDB4ZmVmNTg4YzIpLCBERUNPUlIoMHgwMmVkZGJkOCksCisgICAgICAgICBERUNPUlIoMHgwNDFjMjQ1MCksIERFQ09SUigweGY3ZWRjZDYwKSwgREVDT1JSKDB4MDdlMjkzMTApLAorICAgICAgICAgREVDT1JSKDB4ZmE0ZWNlNDgpLCBERUNPUlIoMHhlZDlmOGEyMCksIERFQ09SUigweDQwMDAwMDAwKX19OworCisvKiBpZGVudGljYWwgdG8gTVBTIGNvZWZmcyBmb3IgcmV2ZXJiIGJhbmQgMzogRGVjb3JyTnVtZXJhdG9yUmVhbDNbMF0gKi8KK2NvbnN0IEZJWFBfREVDT1JSCisgICAgRGVjb3JyTnVtZXJhdG9yUmVhbDJfVVNBQ1tNQVhfREVDT1JSX1NFRURfVVNBQ10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0RFQ09SUl9GSUxURVJfT1JERVJfQkFORF8yX1VTQUMgKyAxXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtERUNPUlIoMHgwMjQ4ZThhOCksIERFQ09SUigweGZkZTk1ODM4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgwODQ4MjNjMCksIERFQ09SUigweDQwMDAwMDAwKX19OworCitjb25zdCBGSVhQX0RFQ09SUgorICAgIERlY29yck51bWVyYXRvclJlYWwzX1VTQUNbTUFYX0RFQ09SUl9TRUVEX1VTQUNdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtERUNPUlJfRklMVEVSX09SREVSX0JBTkRfM19VU0FDICsgMV0gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REVDT1JSKDB4ZmYyYjAyMGMpLCBERUNPUlIoMHgwMjM5MzgzMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4NDAwMDAwMDApfX07CisKKy8qIGNvbnN0IEZJWFBfREVDT1JSIERlY29yck51bWVyYXRvclJlYWwwX0xEW01BWF9ERUNPUlJfU0VFRF9MRF1bXSBkb2VzIG5vdAorICogZXhpc3QgKi8KKworUkFNX0FMSUdOCitjb25zdCBGSVhQX0RFQ09SUiBEZWNvcnJOdW1lcmF0b3JSZWFsMV9MRFtNQVhfREVDT1JSX1NFRURfTERdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtERUNPUlJfRklMVEVSX09SREVSX0JBTkRfMV9MRCArIDFdID0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGYzMTBjYjI5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgxOTMyZDc0NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MGNjMmQ5MTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGRkZGUwNjRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhmMjM0YTYyNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MTk4NTUxYTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDE3MTQxYjZhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhmMjk4ODAzZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZWY5OGJlOTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDA5ZWExNzA2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgyOGZiZGZmNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MWE4NjllYjkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGRlZWZlMTQ3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhjZGUyYWRkYSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MTNkZGM2MTkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDQwMDAwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MDQxZDdkYmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDAxYjczMDljKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhmYjU5OTgzNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MDkyZmM1ZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGYyZmQ3YzI1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhkZDUxZTJlYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZjYyZmU3MmIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDBiMTVkNTg4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhmMWYwOTFhNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZWQxYmJiZmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDAzNTI2ODk5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgxODBjYjI1NiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZWNmMTQzM2QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGY2MjZhYjk1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgxOTdkZDI3ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4NDAwMDAwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgxNTdhNzg2YyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MDAyOGM5OGMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGY1ZWZmNTdiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgxMWY3ZDA0ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZjM5MGQyOGQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDE4OTQ3MDgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhlNWRjMjMxOSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZjRjYzAyMzUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDIzOTRkNDdmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhlMDY5MjMwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MDNhMWE3NzMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGZiYzliMDkyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgxNWEwMTczYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MGU5ZWNkZjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGQzMDliMmM3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHg0MDAwMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGUwY2U3MDNiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhlNTA4YjY3MiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZWYzNjIzOTgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGZmZTc4OGVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgyZmRhMzc0OSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4NDY3MWMwYzYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDNjMDAzNDk0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgyMzg3NzA3YyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZDIxMDdkMmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGIzZTQ3ZTA4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhhY2QwYWJjYSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4YzcwNzkxZGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDBiNTg2ZTg1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgyZjExY2RhNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4M2E0YTIxMGIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDQwMDAwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCit9OworCitSQU1fQUxJR04KK2NvbnN0IEZJWFBfREVDT1JSIERlY29yck51bWVyYXRvclJlYWwyX0xEW01BWF9ERUNPUlJfU0VFRF9MRF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0RFQ09SUl9GSUxURVJfT1JERVJfQkFORF8yX0xEICsgMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlJfWkVST19QQURESU5HXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhmZmI0YTIzNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MDFhYzcxYTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGYyYmNhMDEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhmZTNkNzU5MyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MDkzZTk5NzYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGYyYzVmM2Y1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHg0MDAwMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGUzMDNhZmI4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhjZDcwYzJiYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZjFlMmFkN2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDBjOGZmYmUyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgyMWY4MGFiZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4M2QwODQxMGMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDQwMDAwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZTI2ODA5ZDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDBlZmJjZmE0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgyMTBjMWE5NyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZmU2MGFmNGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGVkYTAxYTUxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgwMGZhZjQ2OCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4NDAwMDAwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgxZWRjNWQ2NCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZTViMmUzNWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGU5NGIxYzQ1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgzMGE2ZjFlMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4ZjA0ZTUyZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGUzMGRlNDVhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHg0MDAwMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorfTsKKworUkFNX0FMSUdOCitjb25zdCBGSVhQX0RFQ09SUiBEZWNvcnJOdW1lcmF0b3JSZWFsM19MRFtNQVhfREVDT1JSX1NFRURfTERdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtERUNPUlJfRklMVEVSX09SREVSX0JBTkRfM19MRCArIDFdID0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDAyNDhlOGE3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhmZGU5NTgzYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MDg0ODIzYmIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDQwMDAwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MWRiMjJkMGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGZjNzczOTkyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgwZTgxOWE3NCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4NDAwMDAwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHgwZmNiOTIzYSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MDE1NGI3ZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGU3MGNiNjQ3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHg0MDAwMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweGUzOWY1NTliKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPUlIoMHhlMDZkZDZjYSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT1JSKDB4MTlmNzFmNzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09SUigweDQwMDAwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCit9OworCitGSVhQX0RCTCAqZ2V0QWRkckRpcmVjdFNpZ25hbE1heFZhbChIQU5ETEVfREVDT1JSX0RFQyBzZWxmKSB7CisgIHJldHVybiAmKHNlbGYtPmR1Y2tlci5tYXhWYWxEaXJlY3REYXRhKTsKK30KKworc3RhdGljIElOVCBEZWNvcnJGaWx0ZXJJbml0KERFQ09SUl9GSUxURVJfSU5TVEFOQ0UgKmNvbnN0IHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9NUFMgKnBTdGF0ZUJ1ZmZlckNwbHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBEZWxheUJ1ZmZlckNwbHgsIElOVCAqb2Zmc2V0U3RhdGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpvZmZzZXREZWxheUJ1ZmZlciwgSU5UIGNvbnN0IGRlY29ycl9zZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjb25zdCByZXZlcmJfYmFuZCwgSU5UIGNvbnN0IHVzZUZyYWN0RGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNvbnN0IG5vU2FtcGxlRGVsYXksIElOVCBjb25zdCBmaWx0ZXJPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREtfREVDT1JSX1RZUEUgY29uc3QgZGVjb3JyVHlwZSkgeworICBJTlQgZXJyb3JDb2RlID0gMDsKKyAgc3dpdGNoIChkZWNvcnJUeXBlKSB7CisgICAgY2FzZSBERUNPUlJfVVNBQzoKKyAgICAgIGlmICh1c2VGcmFjdERlbGF5KSB7CisgICAgICAgIHJldHVybiAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRkRLX0FTU0VSVChkZWNvcnJfc2VlZCA9PSAwKTsKKworICAgICAgICBzd2l0Y2ggKHJldmVyYl9iYW5kKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgc2VsZi0+bnVtZXJhdG9yUmVhbCA9IERlY29yck51bWVyYXRvclJlYWwwX1VTQUNbZGVjb3JyX3NlZWRdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgc2VsZi0+bnVtZXJhdG9yUmVhbCA9IERlY29yck51bWVyYXRvclJlYWwxX1VTQUNbZGVjb3JyX3NlZWRdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgc2VsZi0+bnVtZXJhdG9yUmVhbCA9IERlY29yck51bWVyYXRvclJlYWwyX1VTQUNbZGVjb3JyX3NlZWRdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgc2VsZi0+bnVtZXJhdG9yUmVhbCA9IERlY29yck51bWVyYXRvclJlYWwzX1VTQUNbZGVjb3JyX3NlZWRdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgREVDT1JSX0xEOgorICAgICAgRkRLX0FTU0VSVChkZWNvcnJfc2VlZCA8IE1BWF9ERUNPUlJfU0VFRF9MRCk7CisgICAgICBzd2l0Y2ggKHJldmVyYl9iYW5kKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBzZWxmLT5udW1lcmF0b3JSZWFsID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIHNlbGYtPm51bWVyYXRvclJlYWwgPSBEZWNvcnJOdW1lcmF0b3JSZWFsMV9MRFtkZWNvcnJfc2VlZF07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBzZWxmLT5udW1lcmF0b3JSZWFsID0gRGVjb3JyTnVtZXJhdG9yUmVhbDJfTERbZGVjb3JyX3NlZWRdOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgc2VsZi0+bnVtZXJhdG9yUmVhbCA9IERlY29yck51bWVyYXRvclJlYWwzX0xEW2RlY29ycl9zZWVkXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMTsKKyAgfQorCisgIHNlbGYtPnN0YXRlQ3BseCA9IHBTdGF0ZUJ1ZmZlckNwbHggKyAoKm9mZnNldFN0YXRlQnVmZmVyKTsKKyAgKm9mZnNldFN0YXRlQnVmZmVyICs9IDIgKiBmaWx0ZXJPcmRlcjsKKyAgc2VsZi0+RGVsYXlCdWZmZXJDcGx4ID0gcERlbGF5QnVmZmVyQ3BseCArICgqb2Zmc2V0RGVsYXlCdWZmZXIpOworICAqb2Zmc2V0RGVsYXlCdWZmZXIgKz0gMiAqIG5vU2FtcGxlRGVsYXk7CisKKyAgcmV0dXJuIGVycm9yQ29kZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UIERlY29yckZpbHRlckluaXRQUyhERUNPUlJfRklMVEVSX0lOU1RBTkNFICpjb25zdCBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9NUFMgKnBTdGF0ZUJ1ZmZlckNwbHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcERlbGF5QnVmZmVyQ3BseCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqb2Zmc2V0U3RhdGVCdWZmZXIsIElOVCAqb2Zmc2V0RGVsYXlCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY29uc3QgaHlicmlkQmFuZCwgSU5UIGNvbnN0IHJldmVyYkJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY29uc3Qgbm9TYW1wbGVEZWxheSkgeworICBJTlQgZXJyb3JDb2RlID0gMDsKKworICBpZiAocmV2ZXJiQmFuZCA9PSAwKSB7CisgICAgc2VsZi0+Y29lZmZzUGFja2VkID0gRGVjb3JyUHNDb2VmZnNDcGx4W2h5YnJpZEJhbmRdOworCisgICAgc2VsZi0+c3RhdGVDcGx4ID0gcFN0YXRlQnVmZmVyQ3BseCArICgqb2Zmc2V0U3RhdGVCdWZmZXIpOworICAgICpvZmZzZXRTdGF0ZUJ1ZmZlciArPSAyICogREVDT1JSX0ZJTFRFUl9PUkRFUl9QUzsKKyAgfQorCisgIHNlbGYtPkRlbGF5QnVmZmVyQ3BseCA9IHBEZWxheUJ1ZmZlckNwbHggKyAoKm9mZnNldERlbGF5QnVmZmVyKTsKKyAgKm9mZnNldERlbGF5QnVmZmVyICs9IDIgKiBub1NhbXBsZURlbGF5OworCisgIHJldHVybiBlcnJvckNvZGU7Cit9CisKK0xOS19TRUNUSU9OX0NPREVfTDEKK3N0YXRpYyBJTlQgRGVjb3JyRmlsdGVyQXBwbHlQQVNTKERFQ09SUl9GSUxURVJfSU5TVEFOQ0UgY29uc3QgZmlsdGVyW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqZGF0YVJlYWxJbiwgRklYUF9EQkwgKmRhdGFJbWFnSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqZGF0YVJlYWxPdXQsIEZJWFBfREJMICpkYXRhSW1hZ091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdGFydCwgSU5UIHN0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgcmV2ZXJiQmFuZE5vU2FtcGxlRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgcmV2ZXJiQmFuZERlbGF5QnVmZmVySW5kZXgpIHsKKyAgSU5UIGk7CisgIElOVCBvZmZzZXQgPSAyICogcmV2ZXJiQmFuZE5vU2FtcGxlRGVsYXk7CisgIEZJWFBfTVBTICpwRGVsYXlCdWZmZXIgPQorICAgICAgJmZpbHRlcltzdGFydF0uRGVsYXlCdWZmZXJDcGx4W3JldmVyYkJhbmREZWxheUJ1ZmZlckluZGV4XTsKKworICAvKiBNZW1vcnkgZm9yIHRoZSBkZWxheWxpbmUgaGFzIGJlZW4gYWxsb2NhdGVkIGluIGEgY29uc2VjdXRpdmUgb3JkZXIsIHNvIHdlCisgICAgIGNhbiBhZGRyZXNzIGZyb20gZmlsdGVyIHRvIGZpbHRlciB3aXRoIGEgY29uc3RhbnQgbGVuZ3RoLgorICAgICBCZSBhd2FyZSB0aGF0IHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0IG9mIHRoZSBkZWxheWxpbmUgYXJlIHN0b3JlZCBpbgorICAgICBpbnRlcmxlYXZlZCBvcmRlci4KKyAgKi8KKyAgaWYgKGRhdGFJbWFnSW4gPT0gTlVMTCkgeworICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSsrKSB7CisgICAgICBGSVhQX0RCTCB0bXA7CisKKyAgICAgIHRtcCA9ICpwRGVsYXlCdWZmZXI7CisgICAgICAqcERlbGF5QnVmZmVyID0gZGF0YVJlYWxJbltpXTsKKyAgICAgIGRhdGFSZWFsT3V0W2ldID0gdG1wOworICAgICAgcERlbGF5QnVmZmVyICs9IG9mZnNldDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKChpID0gc3RvcCAtIHN0YXJ0KSAhPSAwKSB7CisgICAgICBkYXRhUmVhbEluICs9IHN0YXJ0OworICAgICAgZGF0YUltYWdJbiArPSBzdGFydDsKKyAgICAgIGRhdGFSZWFsT3V0ICs9IHN0YXJ0OworICAgICAgZGF0YUltYWdPdXQgKz0gc3RhcnQ7CisjaWZkZWYgRlVOQ1RJT05fRGVjb3JyRmlsdGVyQXBwbHlQQVNTX2Z1bmMxCisgICAgICBEZWNvcnJGaWx0ZXJBcHBseVBBU1NfZnVuYzEoaSwgZGF0YVJlYWxJbiwgZGF0YUltYWdJbiwgZGF0YVJlYWxPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUltYWdPdXQsIHBEZWxheUJ1ZmZlciwgb2Zmc2V0KTsKKyNlbHNlCisgICAgICBkbyB7CisgICAgICAgIEZJWFBfREJMIGRlbGF5X3JlLCBkZWxheV9pbSwgcmVhbCwgaW1hZzsKKworICAgICAgICByZWFsID0gKmRhdGFSZWFsSW4rKzsKKyAgICAgICAgaW1hZyA9ICpkYXRhSW1hZ0luKys7CisgICAgICAgIGRlbGF5X3JlID0gcERlbGF5QnVmZmVyWzBdOworICAgICAgICBkZWxheV9pbSA9IHBEZWxheUJ1ZmZlclsxXTsKKyAgICAgICAgcERlbGF5QnVmZmVyWzBdID0gcmVhbDsKKyAgICAgICAgcERlbGF5QnVmZmVyWzFdID0gaW1hZzsKKyAgICAgICAgKmRhdGFSZWFsT3V0KysgPSBkZWxheV9yZTsKKyAgICAgICAgKmRhdGFJbWFnT3V0KysgPSBkZWxheV9pbTsKKyAgICAgICAgcERlbGF5QnVmZmVyICs9IG9mZnNldDsKKyAgICAgIH0gd2hpbGUgKC0taSAhPSAwKTsKKyNlbmRpZgorICAgIH0KKyAgfQorCisgIHJldHVybiAoSU5UKTA7Cit9CisKKyNpZm5kZWYgRlVOQ1RJT05fRGVjb3JyRmlsdGVyQXBwbHlSRUFMCitMTktfU0VDVElPTl9DT0RFX0wxCitzdGF0aWMgSU5UIERlY29yckZpbHRlckFwcGx5UkVBTChERUNPUlJfRklMVEVSX0lOU1RBTkNFIGNvbnN0IGZpbHRlcltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmRhdGFSZWFsSW4sIEZJWFBfREJMICpkYXRhSW1hZ0luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmRhdGFSZWFsT3V0LCBGSVhQX0RCTCAqZGF0YUltYWdPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhcnQsIElOVCBzdG9wLCBJTlQgcmV2ZXJiRmlsdGVyT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgcmV2ZXJiQmFuZE5vU2FtcGxlRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgcmV2ZXJiQmFuZERlbGF5QnVmZmVySW5kZXgpIHsKKyAgSU5UIGksIGo7CisgIEZJWFBfREJMIHhSZWFsLCB4SW1hZywgeVJlYWwsIHlJbWFnOworCisgIGNvbnN0IEZJWFBfREVDT1JSICpwRmlsdGVyID0gZmlsdGVyW3N0YXJ0XS5udW1lcmF0b3JSZWFsOworCisgIElOVCBvZmZzZXREZWxheUJ1ZmZlciA9ICgyICogcmV2ZXJiQmFuZE5vU2FtcGxlRGVsYXkpIC0gMTsKKyAgRklYUF9NUFMgKnBEZWxheUJ1ZmZlciA9CisgICAgICAmZmlsdGVyW3N0YXJ0XS5EZWxheUJ1ZmZlckNwbHhbcmV2ZXJiQmFuZERlbGF5QnVmZmVySW5kZXhdOworCisgIElOVCBvZmZzZXRTdGF0ZXMgPSAyICogcmV2ZXJiRmlsdGVyT3JkZXI7CisgIEZJWFBfREJMICpwU3RhdGVzID0gZmlsdGVyW3N0YXJ0XS5zdGF0ZUNwbHg7CisKKyAgLyogTWVtb3J5IGZvciB0aGUgZGVsYXlsaW5lIGhhcyBiZWVuIGFsbG9jYXRlZCBpbiBhIGNvbnNlY3V0aXZlIG9yZGVyLCBzbyB3ZQorICAgICBjYW4gYWRkcmVzcyBmcm9tIGZpbHRlciB0byBmaWx0ZXIgd2l0aCBhIGNvbnN0YW50IGxlbmd0aC4gVGhlIHNhbWUgaXMgdmFsaWQKKyAgICAgZm9yIHRoZSBzdGF0ZXMuCisgICAgIEJlIGF3YXJlIHRoYXQgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnQgb2YgdGhlIGRlbGF5bGluZSBhbmQgdGhlIHN0YXRlcyBhcmUKKyAgICAgc3RvcmVkIGluIGludGVybGVhdmVkIG9yZGVyLgorICAgICBBbGwgZmlsdGVyIGluIGEgcmV2ZXJiIGJhbmQgaGF2ZSB0aGUgc2FtZSBmaWx0ZXIgY29lZmZpY2llbnRzLgorICAgICBFeHBsb2l0IHN5bW1ldHJ5OiBudW1lcmF0b3JSZWFsW2ldID0KKyAgICAgZGVub21pbmF0b3JSZWFsW3JldmVyYkZpbHRlckxlbmd0aC0xLWldIERvIG5vdCBhY2N1bXVsYXRlIHRoZSBoaWdoZXN0CisgICAgIHN0YXRlcyB3aGljaCBhcmUgYWx3YXlzIHplcm8uCisgICovCisgIGlmIChyZXZlcmJGaWx0ZXJPcmRlciA9PSAyKSB7CisgICAgRklYUF9ERUNPUlIgbkZpbHQwTCwgbkZpbHQwSDsKKworICAgIG5GaWx0MEwgPSBwRmlsdGVyWzBdOworICAgIG5GaWx0MEggPSBwRmlsdGVyWzFdOworCisgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wOyBpKyspIHsKKyAgICAgIHhSZWFsID0gKnBEZWxheUJ1ZmZlcjsKKyAgICAgICpwRGVsYXlCdWZmZXIgPSBkYXRhUmVhbEluW2ldOworICAgICAgcERlbGF5QnVmZmVyKys7CisKKyAgICAgIHhJbWFnID0gKnBEZWxheUJ1ZmZlcjsKKyAgICAgICpwRGVsYXlCdWZmZXIgPSBkYXRhSW1hZ0luW2ldOworICAgICAgcERlbGF5QnVmZmVyICs9IG9mZnNldERlbGF5QnVmZmVyOworCisgICAgICB5UmVhbCA9IChwU3RhdGVzWzBdICsgZk11bHREaXYyKHhSZWFsLCBuRmlsdDBMKSkgPDwgRklMVEVSX1NGOworICAgICAgeUltYWcgPSAocFN0YXRlc1sxXSArIGZNdWx0RGl2Mih4SW1hZywgbkZpbHQwTCkpIDw8IEZJTFRFUl9TRjsKKworICAgICAgZGF0YVJlYWxPdXRbaV0gPSB5UmVhbDsKKyAgICAgIGRhdGFJbWFnT3V0W2ldID0geUltYWc7CisKKyAgICAgIHBTdGF0ZXNbMF0gPQorICAgICAgICAgIHBTdGF0ZXNbMl0gKyBmTXVsdERpdjIoeFJlYWwsIG5GaWx0MEgpIC0gZk11bHREaXYyKHlSZWFsLCBuRmlsdDBIKTsKKyAgICAgIHBTdGF0ZXNbMV0gPQorICAgICAgICAgIHBTdGF0ZXNbM10gKyBmTXVsdERpdjIoeEltYWcsIG5GaWx0MEgpIC0gZk11bHREaXYyKHlJbWFnLCBuRmlsdDBIKTsKKyAgICAgIHBTdGF0ZXNbMl0gPSAoeFJlYWwgPj4gRklMVEVSX1NGKSAtIGZNdWx0RGl2Mih5UmVhbCwgbkZpbHQwTCk7CisgICAgICBwU3RhdGVzWzNdID0gKHhJbWFnID4+IEZJTFRFUl9TRikgLSBmTXVsdERpdjIoeUltYWcsIG5GaWx0MEwpOworICAgICAgcFN0YXRlcyArPSBvZmZzZXRTdGF0ZXM7CisgICAgfQorICB9IGVsc2UgaWYgKHJldmVyYkZpbHRlck9yZGVyID09IDMpIHsKKyAgICBGSVhQX0RFQ09SUiBuRmlsdDBMLCBuRmlsdDBILCBuRmlsdDFMOworCisgICAgbkZpbHQwTCA9IHBGaWx0ZXJbMF07CisgICAgbkZpbHQwSCA9IHBGaWx0ZXJbMV07CisgICAgbkZpbHQxTCA9IHBGaWx0ZXJbMl07CisKKyAgICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0b3A7IGkrKykgeworICAgICAgeFJlYWwgPSAqcERlbGF5QnVmZmVyOworICAgICAgKnBEZWxheUJ1ZmZlciA9IGRhdGFSZWFsSW5baV07CisgICAgICBwRGVsYXlCdWZmZXIrKzsKKworICAgICAgeEltYWcgPSAqcERlbGF5QnVmZmVyOworICAgICAgKnBEZWxheUJ1ZmZlciA9IGRhdGFJbWFnSW5baV07CisgICAgICBwRGVsYXlCdWZmZXIgKz0gb2Zmc2V0RGVsYXlCdWZmZXI7CisKKyAgICAgIHlSZWFsID0gKHBTdGF0ZXNbMF0gKyBmTXVsdERpdjIoeFJlYWwsIG5GaWx0MEwpKSA8PCBGSUxURVJfU0Y7CisgICAgICB5SW1hZyA9IChwU3RhdGVzWzFdICsgZk11bHREaXYyKHhJbWFnLCBuRmlsdDBMKSkgPDwgRklMVEVSX1NGOworCisgICAgICBkYXRhUmVhbE91dFtpXSA9IHlSZWFsOworICAgICAgZGF0YUltYWdPdXRbaV0gPSB5SW1hZzsKKworICAgICAgcFN0YXRlc1swXSA9CisgICAgICAgICAgcFN0YXRlc1syXSArIGZNdWx0RGl2Mih4UmVhbCwgbkZpbHQwSCkgLSBmTXVsdERpdjIoeVJlYWwsIG5GaWx0MUwpOworICAgICAgcFN0YXRlc1sxXSA9CisgICAgICAgICAgcFN0YXRlc1szXSArIGZNdWx0RGl2Mih4SW1hZywgbkZpbHQwSCkgLSBmTXVsdERpdjIoeUltYWcsIG5GaWx0MUwpOworICAgICAgcFN0YXRlc1syXSA9CisgICAgICAgICAgcFN0YXRlc1s0XSArIGZNdWx0RGl2Mih4UmVhbCwgbkZpbHQxTCkgLSBmTXVsdERpdjIoeVJlYWwsIG5GaWx0MEgpOworICAgICAgcFN0YXRlc1szXSA9CisgICAgICAgICAgcFN0YXRlc1s1XSArIGZNdWx0RGl2Mih4SW1hZywgbkZpbHQxTCkgLSBmTXVsdERpdjIoeUltYWcsIG5GaWx0MEgpOworICAgICAgcFN0YXRlc1s0XSA9ICh4UmVhbCA+PiBGSUxURVJfU0YpIC0gZk11bHREaXYyKHlSZWFsLCBuRmlsdDBMKTsKKyAgICAgIHBTdGF0ZXNbNV0gPSAoeEltYWcgPj4gRklMVEVSX1NGKSAtIGZNdWx0RGl2Mih5SW1hZywgbkZpbHQwTCk7CisgICAgICBwU3RhdGVzICs9IG9mZnNldFN0YXRlczsKKyAgICB9CisgIH0gZWxzZSBpZiAocmV2ZXJiRmlsdGVyT3JkZXIgPT0gNikgeworICAgIEZJWFBfREVDT1JSIG5GaWx0MEwsIG5GaWx0MEgsIG5GaWx0MUwsIG5GaWx0MUgsIG5GaWx0MkwsIG5GaWx0Mkg7CisKKyAgICBuRmlsdDBMID0gcEZpbHRlclswXTsKKyAgICBuRmlsdDBIID0gcEZpbHRlclsxXTsKKyAgICBuRmlsdDFMID0gcEZpbHRlclsyXTsKKyAgICBuRmlsdDFIID0gcEZpbHRlclszXTsKKyAgICBuRmlsdDJMID0gcEZpbHRlcls0XTsKKyAgICBuRmlsdDJIID0gcEZpbHRlcls1XTsKKworICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSsrKSB7CisgICAgICB4UmVhbCA9ICpwRGVsYXlCdWZmZXI7CisgICAgICAqcERlbGF5QnVmZmVyID0gZGF0YVJlYWxJbltpXTsKKyAgICAgIHBEZWxheUJ1ZmZlcisrOworCisgICAgICB4SW1hZyA9ICpwRGVsYXlCdWZmZXI7CisgICAgICAqcERlbGF5QnVmZmVyID0gZGF0YUltYWdJbltpXTsKKyAgICAgIHBEZWxheUJ1ZmZlciArPSBvZmZzZXREZWxheUJ1ZmZlcjsKKworICAgICAgeVJlYWwgPSAocFN0YXRlc1swXSArIGZNdWx0RGl2Mih4UmVhbCwgbkZpbHQwTCkpIDw8IEZJTFRFUl9TRjsKKyAgICAgIHlJbWFnID0gKHBTdGF0ZXNbMV0gKyBmTXVsdERpdjIoeEltYWcsIG5GaWx0MEwpKSA8PCBGSUxURVJfU0Y7CisgICAgICBkYXRhUmVhbE91dFtpXSA9IHlSZWFsOworICAgICAgZGF0YUltYWdPdXRbaV0gPSB5SW1hZzsKKworICAgICAgcFN0YXRlc1swXSA9CisgICAgICAgICAgcFN0YXRlc1syXSArIGZNdWx0RGl2Mih4UmVhbCwgbkZpbHQwSCkgLSBmTXVsdERpdjIoeVJlYWwsIG5GaWx0MkgpOworICAgICAgcFN0YXRlc1sxXSA9CisgICAgICAgICAgcFN0YXRlc1szXSArIGZNdWx0RGl2Mih4SW1hZywgbkZpbHQwSCkgLSBmTXVsdERpdjIoeUltYWcsIG5GaWx0MkgpOworICAgICAgcFN0YXRlc1syXSA9CisgICAgICAgICAgcFN0YXRlc1s0XSArIGZNdWx0RGl2Mih4UmVhbCwgbkZpbHQxTCkgLSBmTXVsdERpdjIoeVJlYWwsIG5GaWx0MkwpOworICAgICAgcFN0YXRlc1szXSA9CisgICAgICAgICAgcFN0YXRlc1s1XSArIGZNdWx0RGl2Mih4SW1hZywgbkZpbHQxTCkgLSBmTXVsdERpdjIoeUltYWcsIG5GaWx0MkwpOworICAgICAgcFN0YXRlc1s0XSA9CisgICAgICAgICAgcFN0YXRlc1s2XSArIGZNdWx0RGl2Mih4UmVhbCwgbkZpbHQxSCkgLSBmTXVsdERpdjIoeVJlYWwsIG5GaWx0MUgpOworICAgICAgcFN0YXRlc1s1XSA9CisgICAgICAgICAgcFN0YXRlc1s3XSArIGZNdWx0RGl2Mih4SW1hZywgbkZpbHQxSCkgLSBmTXVsdERpdjIoeUltYWcsIG5GaWx0MUgpOworICAgICAgcFN0YXRlc1s2XSA9CisgICAgICAgICAgcFN0YXRlc1s4XSArIGZNdWx0RGl2Mih4UmVhbCwgbkZpbHQyTCkgLSBmTXVsdERpdjIoeVJlYWwsIG5GaWx0MUwpOworICAgICAgcFN0YXRlc1s3XSA9CisgICAgICAgICAgcFN0YXRlc1s5XSArIGZNdWx0RGl2Mih4SW1hZywgbkZpbHQyTCkgLSBmTXVsdERpdjIoeUltYWcsIG5GaWx0MUwpOworICAgICAgcFN0YXRlc1s4XSA9CisgICAgICAgICAgcFN0YXRlc1sxMF0gKyBmTXVsdERpdjIoeFJlYWwsIG5GaWx0MkgpIC0gZk11bHREaXYyKHlSZWFsLCBuRmlsdDBIKTsKKyAgICAgIHBTdGF0ZXNbOV0gPQorICAgICAgICAgIHBTdGF0ZXNbMTFdICsgZk11bHREaXYyKHhJbWFnLCBuRmlsdDJIKSAtIGZNdWx0RGl2Mih5SW1hZywgbkZpbHQwSCk7CisgICAgICBwU3RhdGVzWzEwXSA9ICh4UmVhbCA+PiBGSUxURVJfU0YpIC0gZk11bHREaXYyKHlSZWFsLCBuRmlsdDBMKTsKKyAgICAgIHBTdGF0ZXNbMTFdID0gKHhJbWFnID4+IEZJTFRFUl9TRikgLSBmTXVsdERpdjIoeUltYWcsIG5GaWx0MEwpOworICAgICAgcFN0YXRlcyArPSBvZmZzZXRTdGF0ZXM7CisgICAgfQorICB9IGVsc2UgeworICAgIEZJWFBfREVDT1JSIG5GaWx0MEwsIG5GaWx0MEg7CisgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wOyBpKyspIHsKKyAgICAgIHhSZWFsID0gKnBEZWxheUJ1ZmZlcjsKKyAgICAgICpwRGVsYXlCdWZmZXIgPSBkYXRhUmVhbEluW2ldOworICAgICAgcERlbGF5QnVmZmVyKys7CisKKyAgICAgIHhJbWFnID0gKnBEZWxheUJ1ZmZlcjsKKyAgICAgICpwRGVsYXlCdWZmZXIgPSBkYXRhSW1hZ0luW2ldOworICAgICAgcERlbGF5QnVmZmVyICs9IG9mZnNldERlbGF5QnVmZmVyOworCisgICAgICBuRmlsdDBMID0gcEZpbHRlclswXTsKKyAgICAgIHlSZWFsID0gKHBTdGF0ZXNbMF0gKyBmTXVsdERpdjIoeFJlYWwsIG5GaWx0MEwpKSA8PCAyOworICAgICAgeUltYWcgPSAocFN0YXRlc1sxXSArIGZNdWx0RGl2Mih4SW1hZywgbkZpbHQwTCkpIDw8IDI7CisgICAgICBkYXRhUmVhbE91dFtpXSA9IHlSZWFsOworICAgICAgZGF0YUltYWdPdXRbaV0gPSB5SW1hZzsKKworICAgICAgZm9yIChqID0gMTsgaiA8IHJldmVyYkZpbHRlck9yZGVyOyBqKyspIHsKKyAgICAgICAgbkZpbHQwTCA9IHBGaWx0ZXJbal07CisgICAgICAgIG5GaWx0MEggPSBwRmlsdGVyW3JldmVyYkZpbHRlck9yZGVyIC0gal07CisgICAgICAgIHBTdGF0ZXNbMiAqIGogLSAyXSA9IHBTdGF0ZXNbMiAqIGpdICsgZk11bHREaXYyKHhSZWFsLCBuRmlsdDBMKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2Mih5UmVhbCwgbkZpbHQwSCk7CisgICAgICAgIHBTdGF0ZXNbMiAqIGogLSAxXSA9IHBTdGF0ZXNbMiAqIGogKyAxXSArIGZNdWx0RGl2Mih4SW1hZywgbkZpbHQwTCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoeUltYWcsIG5GaWx0MEgpOworICAgICAgfQorICAgICAgbkZpbHQwTCA9IHBGaWx0ZXJbal07CisgICAgICBuRmlsdDBIID0gcEZpbHRlcltyZXZlcmJGaWx0ZXJPcmRlciAtIGpdOworICAgICAgcFN0YXRlc1syICogaiAtIDJdID0KKyAgICAgICAgICBmTXVsdERpdjIoeFJlYWwsIG5GaWx0MEwpIC0gZk11bHREaXYyKHlSZWFsLCBuRmlsdDBIKTsKKyAgICAgIHBTdGF0ZXNbMiAqIGogLSAxXSA9CisgICAgICAgICAgZk11bHREaXYyKHhJbWFnLCBuRmlsdDBMKSAtIGZNdWx0RGl2Mih5SW1hZywgbkZpbHQwSCk7CisKKyAgICAgIHBTdGF0ZXMgKz0gb2Zmc2V0U3RhdGVzOworICAgIH0KKyAgfQorCisgIHJldHVybiAoSU5UKTA7Cit9CisjZW5kaWYgLyogI2lmbmRlZiBGVU5DVElPTl9EZWNvcnJGaWx0ZXJBcHBseVJFQUwgKi8KKworI2lmbmRlZiBGVU5DVElPTl9EZWNvcnJGaWx0ZXJBcHBseUNQTFhfUFMKK0xOS19TRUNUSU9OX0NPREVfTDEKK3N0YXRpYyBJTlQgRGVjb3JyRmlsdGVyQXBwbHlDUExYX1BTKAorICAgIERFQ09SUl9GSUxURVJfSU5TVEFOQ0UgY29uc3QgZmlsdGVyW10sIEZJWFBfREJMICpkYXRhUmVhbEluLAorICAgIEZJWFBfREJMICpkYXRhSW1hZ0luLCBGSVhQX0RCTCAqZGF0YVJlYWxPdXQsIEZJWFBfREJMICpkYXRhSW1hZ091dCwKKyAgICBJTlQgc3RhcnQsIElOVCBzdG9wLCBJTlQgcmV2ZXJiRmlsdGVyT3JkZXIsIElOVCByZXZlcmJCYW5kTm9TYW1wbGVEZWxheSwKKyAgICBJTlQgcmV2ZXJiQmFuZERlbGF5QnVmZmVySW5kZXgsIFVDSEFSICpzdGF0ZUJ1ZmZlck9mZnNldCkgeworICAvKiByID0gcmVhbCwgaiA9IGltYWdpbmFyeSAqLworICBGSVhQX0RCTCByX2RhdGFfYSwgal9kYXRhX2EsIHJfZGF0YV9iLCBqX2RhdGFfYiwgcl9zdGFnZV9tdWx0LCBqX3N0YWdlX211bHQ7CisgIEZJWFBfU1RQIHJqX2NvZWZmOworCisgIC8qIGdldCBwb2ludGVyIHRvIGN1cnJlbnQgcG9zaXRpb24gaW4gaW5wdXQgZGVsYXkgYnVmZmVyIG9mIGZpbHRlciB3aXRoCisgICAqIHN0YXJ0aW5nLWluZGV4ICovCisgIEZJWFBfREJMICpwRGVsYXlCdWZmZXIgPQorICAgICAgJmZpbHRlcltzdGFydF0uRGVsYXlCdWZmZXJDcGx4W3JldmVyYkJhbmREZWxheUJ1ZmZlckluZGV4XTsgLyogaW5jcmVhc2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSAyIGV2ZXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciBjYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAqLworICAvKiBkZXRlcm1pbmUgdGhlIGluY3JlbWVudCBmb3IgdGhpcyBwb2ludGVyIHRvIGdldCB0byB0aGUgY29ycmVjdCBwb3NpdGlvbiBpbgorICAgKiB0aGUgZGVsYXkgYnVmZmVyIG9mIHRoZSBuZXh0IGZpbHRlciAqLworICBJTlQgb2Zmc2V0RGVsYXlCdWZmZXIgPSAoMiAqIHJldmVyYkJhbmROb1NhbXBsZURlbGF5KSAtIDE7CisKKyAgLyogcG9pbnRlciB0byBjdXJyZW50IHBvc2l0aW9uIGluIHN0YXRlIGJ1ZmZlciAqLworICBGSVhQX0RCTCAqcFN0YXRlcyA9IGZpbHRlcltzdGFydF0uc3RhdGVDcGx4OworICBJTlQgcFN0YXRlc0luY3JlbWVudCA9IDIgKiByZXZlcmJGaWx0ZXJPcmRlcjsKKworICAvKiBzdGF0ZUJ1ZmZlck9mZnNldC1wb2ludGVycyAqLworICBGSVhQX0RCTCAqcFN0YXRlQnVmZmVyT2Zmc2V0MCA9IHBTdGF0ZXMgKyBzdGF0ZUJ1ZmZlck9mZnNldFswXTsKKyAgRklYUF9EQkwgKnBTdGF0ZUJ1ZmZlck9mZnNldDEgPSBwU3RhdGVzICsgc3RhdGVCdWZmZXJPZmZzZXRbMV07CisgIEZJWFBfREJMICpwU3RhdGVCdWZmZXJPZmZzZXQyID0gcFN0YXRlcyArIHN0YXRlQnVmZmVyT2Zmc2V0WzJdOworCisgIC8qIHRyYXZlcnNlIGFsbCBoeWJyaWQtYmFuZHMgaW5iZXR3ZWVuIHN0YXJ0LSBhbmQgc3RvcC1pbmRleCAqLworICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpKyspIHsKKyAgICAvKiAxLiBpbnB1dCBkZWxheSAocmVhbC9pbWFnaW5hcnkgdmFsdWVzIGludGVybGVhdmVkKSAqLworCisgICAgLyogbG9hZCBkZWxheWVkIHJlYWwgaW5wdXQgdmFsdWUgKi8KKyAgICByX2RhdGFfYSA9ICpwRGVsYXlCdWZmZXI7CisgICAgLyogc3RvcmUgaW5jb21pbmcgcmVhbCBkYXRhIHZhbHVlIHRvIGRlbGF5IGJ1ZmZlciBhbmQgaW5jcmVtZW50IHBvaW50ZXIgKi8KKyAgICAqcERlbGF5QnVmZmVyKysgPSBkYXRhUmVhbEluW2ldOworCisgICAgLyogbG9hZCBkZWxheWVkIGltYWdpbmFyeSBpbnB1dCB2YWx1ZSAqLworICAgIGpfZGF0YV9hID0gKnBEZWxheUJ1ZmZlcjsKKyAgICAvKiBzdG9yZSBpbmNvbWluZyBpbWFnaW5hcnkgZGF0YSB2YWx1ZSB0byBkZWxheSBidWZmZXIgKi8KKyAgICAqcERlbGF5QnVmZmVyID0gZGF0YUltYWdJbltpXTsKKyAgICAvKiBpbmNyZWFzZSBkZWxheSBidWZmZXIgYnkgb2Zmc2V0ICovCisgICAgcERlbGF5QnVmZmVyICs9IG9mZnNldERlbGF5QnVmZmVyOworCisgICAgLyogMi4gUGhpKGspLXN0YWdlICovCisKKyAgICAvKiBjcmVhdGUgcG9pbnRlciB0byBjb2VmZmljaWVudCB0YWJsZSAocmVhbCBhbmQgaW1hZ2luYXJ5IGNvZWZmaWNpZW50cworICAgICAqIGludGVybGVhdmVkKSAqLworICAgIGNvbnN0IEZJWFBfU1RQICpwQ29lZmZzID0gZmlsdGVyW2ldLmNvZWZmc1BhY2tlZDsKKworICAgIC8qIHRoZSBmaXJzdCB0d28gZW50cmllcyBvZiB0aGUgY29lZmZpY2llbnQgdGFibGUgYXJlIHRoZQorICAgICAqIFBoaShrKS1tdWx0aXBsaWNhbnRzICovCisgICAgcmpfY29lZmYgPSAqcENvZWZmcysrOworICAgIC8qIG11bHRpcGx5IHZhbHVlIGZyb20gaW5wdXQgZGVsYXkgYnVmZmVyIGJ5IGxvb2tlZC11cCB2YWx1ZXMgKi8KKyAgICBjcGx4TXVsdERpdjIoJnJfZGF0YV9iLCAmal9kYXRhX2IsIHJfZGF0YV9hLCBqX2RhdGFfYSwgcmpfY29lZmYpOworCisgICAgLyogMy4gcHJvY2VzcyBhbGwgdGhyZWUgZmlsdGVyIHN0YWdlcyAqLworCisgICAgLyogc3RhZ2UgMCAqLworCisgICAgLyogZ2V0IGNvZWZmaWNpZW50cyBmcm9tIGxvb2t1cCB0YWJsZSAqLworICAgIHJqX2NvZWZmID0gKnBDb2VmZnMrKzsKKworICAgIC8qIG11bHRpcGx5IG91dHB1dCBvZiBsYXN0IHN0YWdlIGJ5IGNvZWZmaWNpZW50ICovCisgICAgY3BseE11bHREaXYyKCZyX3N0YWdlX211bHQsICZqX3N0YWdlX211bHQsIHJfZGF0YV9iLCBqX2RhdGFfYiwgcmpfY29lZmYpOworICAgIHJfc3RhZ2VfbXVsdCA8PD0gMTsKKyAgICBqX3N0YWdlX211bHQgPDw9IDE7CisKKyAgICAvKiByZWFkIGFuZCBhZGQgdmFsdWUgZnJvbSBzdGF0ZSBidWZmZXIgKHRoaXMgaXMgdGhlIGlucHV0IGZvciB0aGUgbmV4dAorICAgICAqIHN0YWdlKSAqLworICAgIHJfZGF0YV9hID0gcl9zdGFnZV9tdWx0ICsgcFN0YXRlQnVmZmVyT2Zmc2V0MFswXTsKKyAgICBqX2RhdGFfYSA9IGpfc3RhZ2VfbXVsdCArIHBTdGF0ZUJ1ZmZlck9mZnNldDBbMV07CisKKyAgICAvKiBuZWdhdGUgcl9kYXRhX2EgdG8gcGVyZm9ybSBtdWx0aXBsaWNhdGlvbiB3aXRoIGNvbXBsZXggY29uanVnYXRlIG9mCisgICAgICogcmpfY29lZmYgKi8KKyAgICBjcGx4TXVsdERpdjIoJnJfc3RhZ2VfbXVsdCwgJmpfc3RhZ2VfbXVsdCwgLXJfZGF0YV9hLCBqX2RhdGFfYSwgcmpfY29lZmYpOworCisgICAgLyogYWRkIHN0YWdlIGlucHV0IHRvIHNoaWZ0ZWQgcmVzdWx0ICovCisgICAgcl9zdGFnZV9tdWx0ID0gcl9kYXRhX2IgKyAocl9zdGFnZV9tdWx0IDw8IDEpOworICAgIGpfc3RhZ2VfbXVsdCA9IGpfZGF0YV9iIC0gKGpfc3RhZ2VfbXVsdCA8PCAxKTsKKworICAgIC8qIHN0b3JlIHJlc3VsdCB0byBzdGF0ZSBidWZmZXIgKi8KKyAgICBwU3RhdGVCdWZmZXJPZmZzZXQwWzBdID0gcl9zdGFnZV9tdWx0OworICAgIHBTdGF0ZUJ1ZmZlck9mZnNldDBbMV0gPSBqX3N0YWdlX211bHQ7CisgICAgcFN0YXRlQnVmZmVyT2Zmc2V0MCArPSBwU3RhdGVzSW5jcmVtZW50OworCisgICAgLyogc3RhZ2UgMSAqLworCisgICAgLyogZ2V0IGNvZWZmaWNpZW50cyBmcm9tIGxvb2t1cCB0YWJsZSAqLworICAgIHJqX2NvZWZmID0gKnBDb2VmZnMrKzsKKworICAgIC8qIG11bHRpcGx5IG91dHB1dCBvZiBsYXN0IHN0YWdlIGJ5IGNvZWZmaWNpZW50ICovCisgICAgY3BseE11bHREaXYyKCZyX3N0YWdlX211bHQsICZqX3N0YWdlX211bHQsIHJfZGF0YV9hLCBqX2RhdGFfYSwgcmpfY29lZmYpOworICAgIHJfc3RhZ2VfbXVsdCA8PD0gMTsKKyAgICBqX3N0YWdlX211bHQgPDw9IDE7CisKKyAgICAvKiByZWFkIGFuZCBhZGQgdmFsdWUgZnJvbSBzdGF0ZSBidWZmZXIgKHRoaXMgaXMgdGhlIGlucHV0IGZvciB0aGUgbmV4dAorICAgICAqIHN0YWdlKSAqLworICAgIHJfZGF0YV9iID0gcl9zdGFnZV9tdWx0ICsgcFN0YXRlQnVmZmVyT2Zmc2V0MVswXTsKKyAgICBqX2RhdGFfYiA9IGpfc3RhZ2VfbXVsdCArIHBTdGF0ZUJ1ZmZlck9mZnNldDFbMV07CisKKyAgICAvKiBuZWdhdGUgcl9kYXRhX2IgdG8gcGVyZm9ybSBtdWx0aXBsaWNhdGlvbiB3aXRoIGNvbXBsZXggY29uanVnYXRlIG9mCisgICAgICogcmpfY29lZmYgKi8KKyAgICBjcGx4TXVsdERpdjIoJnJfc3RhZ2VfbXVsdCwgJmpfc3RhZ2VfbXVsdCwgLXJfZGF0YV9iLCBqX2RhdGFfYiwgcmpfY29lZmYpOworCisgICAgLyogYWRkIHN0YWdlIGlucHV0IHRvIHNoaWZ0ZWQgcmVzdWx0ICovCisgICAgcl9zdGFnZV9tdWx0ID0gcl9kYXRhX2EgKyAocl9zdGFnZV9tdWx0IDw8IDEpOworICAgIGpfc3RhZ2VfbXVsdCA9IGpfZGF0YV9hIC0gKGpfc3RhZ2VfbXVsdCA8PCAxKTsKKworICAgIC8qIHN0b3JlIHJlc3VsdCB0byBzdGF0ZSBidWZmZXIgKi8KKyAgICBwU3RhdGVCdWZmZXJPZmZzZXQxWzBdID0gcl9zdGFnZV9tdWx0OworICAgIHBTdGF0ZUJ1ZmZlck9mZnNldDFbMV0gPSBqX3N0YWdlX211bHQ7CisgICAgcFN0YXRlQnVmZmVyT2Zmc2V0MSArPSBwU3RhdGVzSW5jcmVtZW50OworCisgICAgLyogc3RhZ2UgMiAqLworCisgICAgLyogZ2V0IGNvZWZmaWNpZW50cyBmcm9tIGxvb2t1cCB0YWJsZSAqLworICAgIHJqX2NvZWZmID0gKnBDb2VmZnMrKzsKKworICAgIC8qIG11bHRpcGx5IG91dHB1dCBvZiBsYXN0IHN0YWdlIGJ5IGNvZWZmaWNpZW50ICovCisgICAgY3BseE11bHREaXYyKCZyX3N0YWdlX211bHQsICZqX3N0YWdlX211bHQsIHJfZGF0YV9iLCBqX2RhdGFfYiwgcmpfY29lZmYpOworICAgIHJfc3RhZ2VfbXVsdCA8PD0gMTsKKyAgICBqX3N0YWdlX211bHQgPDw9IDE7CisKKyAgICAvKiByZWFkIGFuZCBhZGQgdmFsdWUgZnJvbSBzdGF0ZSBidWZmZXIgKHRoaXMgaXMgdGhlIGlucHV0IGZvciB0aGUgbmV4dAorICAgICAqIHN0YWdlKSAqLworICAgIHJfZGF0YV9hID0gcl9zdGFnZV9tdWx0ICsgcFN0YXRlQnVmZmVyT2Zmc2V0MlswXTsKKyAgICBqX2RhdGFfYSA9IGpfc3RhZ2VfbXVsdCArIHBTdGF0ZUJ1ZmZlck9mZnNldDJbMV07CisKKyAgICAvKiBuZWdhdGUgcl9kYXRhX2EgdG8gcGVyZm9ybSBtdWx0aXBsaWNhdGlvbiB3aXRoIGNvbXBsZXggY29uanVnYXRlIG9mCisgICAgICogcmpfY29lZmYgKi8KKyAgICBjcGx4TXVsdERpdjIoJnJfc3RhZ2VfbXVsdCwgJmpfc3RhZ2VfbXVsdCwgLXJfZGF0YV9hLCBqX2RhdGFfYSwgcmpfY29lZmYpOworCisgICAgLyogYWRkIHN0YWdlIGlucHV0IHRvIHNoaWZ0ZWQgcmVzdWx0ICovCisgICAgcl9zdGFnZV9tdWx0ID0gcl9kYXRhX2IgKyAocl9zdGFnZV9tdWx0IDw8IDEpOworICAgIGpfc3RhZ2VfbXVsdCA9IGpfZGF0YV9iIC0gKGpfc3RhZ2VfbXVsdCA8PCAxKTsKKworICAgIC8qIHN0b3JlIHJlc3VsdCB0byBzdGF0ZSBidWZmZXIgKi8KKyAgICBwU3RhdGVCdWZmZXJPZmZzZXQyWzBdID0gcl9zdGFnZV9tdWx0OworICAgIHBTdGF0ZUJ1ZmZlck9mZnNldDJbMV0gPSBqX3N0YWdlX211bHQ7CisgICAgcFN0YXRlQnVmZmVyT2Zmc2V0MiArPSBwU3RhdGVzSW5jcmVtZW50OworCisgICAgLyogd3JpdGUgZmlsdGVyIG91dHB1dCAqLworICAgIGRhdGFSZWFsT3V0W2ldID0gcl9kYXRhX2EgPDwgMTsKKyAgICBkYXRhSW1hZ091dFtpXSA9IGpfZGF0YV9hIDw8IDE7CisKKyAgfSAvKiBlbmQgb2YgYmFuZC9maWx0ZXIgbG9vcCAob3V0ZXIgbG9vcCkgKi8KKworICAvKiB1cGRhdGUgc3RhdGVCdWZmZXJPZmZzZXQgd2l0aCByZXNwZWN0IHRvIHJpbmcgYnVmZmVyIGJvdW5kYXJpZXMgKi8KKyAgaWYgKHN0YXRlQnVmZmVyT2Zmc2V0WzBdID09IDQpCisgICAgc3RhdGVCdWZmZXJPZmZzZXRbMF0gPSAwOworICBlbHNlCisgICAgc3RhdGVCdWZmZXJPZmZzZXRbMF0gKz0gMjsKKworICBpZiAoc3RhdGVCdWZmZXJPZmZzZXRbMV0gPT0gMTIpCisgICAgc3RhdGVCdWZmZXJPZmZzZXRbMV0gPSA2OworICBlbHNlCisgICAgc3RhdGVCdWZmZXJPZmZzZXRbMV0gKz0gMjsKKworICBpZiAoc3RhdGVCdWZmZXJPZmZzZXRbMl0gPT0gMjIpCisgICAgc3RhdGVCdWZmZXJPZmZzZXRbMl0gPSAxNDsKKyAgZWxzZQorICAgIHN0YXRlQnVmZmVyT2Zmc2V0WzJdICs9IDI7CisKKyAgcmV0dXJuIChJTlQpMDsKK30KKworI2VuZGlmIC8qIEZVTkNUSU9OX0RlY29yckZpbHRlckFwcGx5Q1BMWF9QUyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQgRHVja2VySW5pdChEVUNLRVJfSU5TVEFOQ0UgKmNvbnN0IHNlbGYsIGludCBjb25zdCBoeWJyaWRCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFydGlhbGx5Q29tcGxleCwgY29uc3QgRkRLX0RVQ0tFUl9UWVBFIGR1Y2tlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG5QYXJhbUJhbmRzLCBpbnQgaW5pdFN0YXRlc0ZsYWcpIHsKKyAgSU5UIGVycm9yQ29kZSA9IDA7CisKKyAgaWYgKHNlbGYpIHsKKyAgICBzd2l0Y2ggKG5QYXJhbUJhbmRzKSB7CisgICAgICBjYXNlICgyMCk6CisgICAgICAgIEZES19BU1NFUlQoaHlicmlkQmFuZHMgPT0gNzEpOworICAgICAgICBzZWxmLT5tYXBIeWJCYW5kczJQcm9jQmFuZHMgPSBrZXJuZWxzXzIwX3RvXzcxX1BTOworICAgICAgICBzZWxmLT5tYXBQcm9jQmFuZHMySHliQmFuZHMgPSBrZXJuZWxzXzIwX3RvXzcxX29mZnNldF9QUzsKKyAgICAgICAgc2VsZi0+cGFyYW1ldGVyQmFuZHMgPSAoMjApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgKDI4KToKKworICAgICAgICBzZWxmLT5tYXBIeWJCYW5kczJQcm9jQmFuZHMgPSBrZXJuZWxzXzI4X3RvXzcxOworICAgICAgICBzZWxmLT5tYXBQcm9jQmFuZHMySHliQmFuZHMgPSBrZXJuZWxzXzI4X3RvXzcxX29mZnNldDsKKyAgICAgICAgc2VsZi0+cGFyYW1ldGVyQmFuZHMgPSAoMjgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgKDIzKToKKyAgICAgICAgRkRLX0FTU0VSVChoeWJyaWRCYW5kcyA9PSA2NCB8fCBoeWJyaWRCYW5kcyA9PSAzMik7CisgICAgICAgIHNlbGYtPm1hcEh5YkJhbmRzMlByb2NCYW5kcyA9IGtlcm5lbHNfMjNfdG9fNjQ7CisgICAgICAgIHNlbGYtPm1hcFByb2NCYW5kczJIeWJCYW5kcyA9IGtlcm5lbHNfMjNfdG9fNjRfb2Zmc2V0OworICAgICAgICBzZWxmLT5wYXJhbWV0ZXJCYW5kcyA9ICgyMyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHNlbGYtPnFzX25leHQgPSAmc2VsZi0+bWFwUHJvY0JhbmRzMkh5YkJhbmRzWzFdOworCisgICAgc2VsZi0+bWF4VmFsRGlyZWN0RGF0YSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKKyAgICBzZWxmLT5tYXhWYWxSZXZlcmJEYXRhID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOworICAgIHNlbGYtPnNjYWxlRGlyZWN0TnJnID0gMiAqIERVQ0tFUl9NQVhfTlJHX1NDQUxFOworICAgIHNlbGYtPnNjYWxlUmV2ZXJiTnJnID0gMiAqIERVQ0tFUl9NQVhfTlJHX1NDQUxFOworICAgIHNlbGYtPnNjYWxlU21vb3RoRGlyUmV2TnJnID0gMiAqIERVQ0tFUl9NQVhfTlJHX1NDQUxFOworICAgIHNlbGYtPmhlYWRyb29tU21vb3RoRGlyUmV2TnJnID0gMiAqIERVQ0tFUl9NQVhfTlJHX1NDQUxFOworICAgIHNlbGYtPmh5YnJpZEJhbmRzID0gaHlicmlkQmFuZHM7CisgICAgc2VsZi0+cGFydGlhbGx5Q29tcGxleCA9IHBhcnRpYWxseUNvbXBsZXg7CisKKyAgICBpZiAoaW5pdFN0YXRlc0ZsYWcgJiYgKGR1Y2tlclR5cGUgPT0gRFVDS0VSX1BTKSkgeworICAgICAgaW50IHBiOworICAgICAgZm9yIChwYiA9IDA7IHBiIDwgc2VsZi0+cGFyYW1ldGVyQmFuZHM7IHBiKyspIHsKKyAgICAgICAgc2VsZi0+U21vb3RoRGlyUmV2TnJnW3BiXSA9IChGSVhQX01QUykwOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlCisgICAgZXJyb3JDb2RlID0gMTsKKworICByZXR1cm4gZXJyb3JDb2RlOworfQorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRlVOQ1RJT05fRHVja2VyQ2FsY0VuZXJneQorc3RhdGljIElOVCBEdWNrZXJDYWxjRW5lcmd5KERVQ0tFUl9JTlNUQU5DRSAqY29uc3Qgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBjb25zdCBpbnB1dFJlYWxbKDcxKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgY29uc3QgaW5wdXRJbWFnWyg3MSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGVuZXJneVsoMjgpXSwgRklYUF9EQkwgaW5wdXRNYXhWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgKm5yZ1NjYWxlLCBpbnQgbW9kZSwgLyogMToocHMpIDA6KGVsc2UpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0SHliQmFuZCkgeworICBJTlQgZXJyID0gMDsKKyAgaW50IHFzLCBtYXhIeWJCYW5kOworICBpbnQgbWF4SHlicmlkQmFuZCA9IHNlbGYtPmh5YnJpZEJhbmRzIC0gMTsKKworICBtYXhIeWJCYW5kID0gbWF4SHlicmlkQmFuZDsKKworICBGREttZW1jbGVhcihlbmVyZ3ksICgyOCkgKiBzaXplb2YoRklYUF9EQkwpKTsKKworICBpZiAobW9kZSA9PSAxKSB7CisgICAgaW50IHBiOworICAgIGludCBjbHo7CisgICAgRklYUF9EQkwgbWF4VmFsID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOworCisgICAgaWYgKG1heFZhbCA9PSBGTDJGWENPTlNUX0RCTCgtMS4wZikpIHsKKyNpZmRlZiBGVU5DVElPTl9EdWNrZXJDYWxjRW5lcmd5X2Z1bmMyCisgICAgICBtYXhWYWwgPSBEdWNrZXJDYWxjRW5lcmd5X2Z1bmMyKGlucHV0UmVhbCwgaW5wdXRJbWFnLCBzdGFydEh5YkJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEh5YkJhbmQsIG1heEh5YnJpZEJhbmQpOworI2Vsc2UKKyAgICAgIEZJWFBfREJMIGxvY2FsTWF4VmFsID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICBmb3IgKHFzID0gc3RhcnRIeWJCYW5kOyBxcyA8PSBtYXhIeWJCYW5kOyBxcysrKSB7CisgICAgICAgIGxvY2FsTWF4VmFsIHw9IGZBYnMoaW5wdXRSZWFsW3FzXSk7CisgICAgICAgIGxvY2FsTWF4VmFsIHw9IGZBYnMoaW5wdXRJbWFnW3FzXSk7CisgICAgICB9CisgICAgICBmb3IgKDsgcXMgPD0gbWF4SHlicmlkQmFuZDsgcXMrKykgeworICAgICAgICBsb2NhbE1heFZhbCB8PSBmQWJzKGlucHV0UmVhbFtxc10pOworICAgICAgfQorICAgICAgbWF4VmFsID0gbG9jYWxNYXhWYWw7CisjZW5kaWYKKyAgICB9CisKKyAgICBjbHogPSBmaXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKG1heFZhbCkgLSBEVUNLRVJfSEVBRFJPT01fQklUUyk7CisgICAgY2x6ID0gZml4TWluKGNseiwgRFVDS0VSX01BWF9OUkdfU0NBTEUpOworICAgICpucmdTY2FsZSA9IChTQ0hBUiljbHogPDwgMTsKKworICAgIC8qIEluaXRpYWxpemUgcGIgc2luY2UgaXQgd291bGQgc3RheSB1bmluaXRpYWxpemVkIGZvciB0aGUgY2FzZSBzdGFydEh5YkJhbmQKKyAgICAgKiA+IG1heEh5YkJhbmQuICovCisgICAgcGIgPSBTcGF0aWFsRGVjR2V0UHJvY2Vzc2luZ0JhbmQobWF4SHliQmFuZCwgc2VsZi0+bWFwSHliQmFuZHMyUHJvY0JhbmRzKTsKKyAgICBmb3IgKHFzID0gc3RhcnRIeWJCYW5kOyBxcyA8PSBtYXhIeWJCYW5kOyBxcysrKSB7CisgICAgICBwYiA9IFNwYXRpYWxEZWNHZXRQcm9jZXNzaW5nQmFuZChxcywgc2VsZi0+bWFwSHliQmFuZHMyUHJvY0JhbmRzKTsKKyAgICAgIGVuZXJneVtwYl0gKz0KKyAgICAgICAgICAoZlBvdzJEaXYyKGlucHV0UmVhbFtxc10gPDwgY2x6KSArIGZQb3cyRGl2MihpbnB1dEltYWdbcXNdIDw8IGNseikpOworICAgIH0KKyAgICBwYisrOworCisgICAgZm9yICg7IHBiIDw9IFNwYXRpYWxEZWNHZXRQcm9jZXNzaW5nQmFuZChtYXhIeWJyaWRCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+bWFwSHliQmFuZHMyUHJvY0JhbmRzKTsKKyAgICAgICAgIHBiKyspIHsKKyAgICAgIEZES19BU1NFUlQocGIgIT0gU3BhdGlhbERlY0dldFByb2Nlc3NpbmdCYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcXMgLSAxLCBzZWxmLT5tYXBIeWJCYW5kczJQcm9jQmFuZHMpKTsKKyAgICAgIGludCBxc19uZXh0OworICAgICAgRklYUF9EQkwgbnJnID0gMDsKKyAgICAgIHFzX25leHQgPSAoaW50KXNlbGYtPnFzX25leHRbcGJdOworICAgICAgZm9yICg7IHFzIDwgcXNfbmV4dDsgcXMrKykgeworICAgICAgICBucmcgKz0gZlBvdzJEaXYyKGlucHV0UmVhbFtxc10gPDwgY2x6KTsKKyAgICAgIH0KKyAgICAgIGVuZXJneVtwYl0gPSBucmc7CisgICAgfQorICB9IGVsc2UgeworICAgIGludCBjbHo7CisgICAgRklYUF9EQkwgbWF4VmFsID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOworCisgICAgbWF4VmFsID0gaW5wdXRNYXhWYWw7CisKKyAgICBpZiAobWF4VmFsID09IEZMMkZYQ09OU1RfREJMKC0xLjBmKSkgeworI2lmZGVmIEZVTkNUSU9OX0R1Y2tlckNhbGNFbmVyZ3lfZnVuYzIKKyAgICAgIG1heFZhbCA9IER1Y2tlckNhbGNFbmVyZ3lfZnVuYzIoaW5wdXRSZWFsLCBpbnB1dEltYWcsIHN0YXJ0SHliQmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SHliQmFuZCwgbWF4SHlicmlkQmFuZCk7CisjZWxzZQorICAgICAgRklYUF9EQkwgbG9jYWxNYXhWYWwgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgIGZvciAocXMgPSBzdGFydEh5YkJhbmQ7IHFzIDw9IG1heEh5YkJhbmQ7IHFzKyspIHsKKyAgICAgICAgbG9jYWxNYXhWYWwgfD0gZkFicyhpbnB1dFJlYWxbcXNdKTsKKyAgICAgICAgbG9jYWxNYXhWYWwgfD0gZkFicyhpbnB1dEltYWdbcXNdKTsKKyAgICAgIH0KKyAgICAgIGZvciAoOyBxcyA8PSBtYXhIeWJyaWRCYW5kOyBxcysrKSB7CisgICAgICAgIGxvY2FsTWF4VmFsIHw9IGZBYnMoaW5wdXRSZWFsW3FzXSk7CisgICAgICB9CisgICAgICBtYXhWYWwgPSBsb2NhbE1heFZhbDsKKyNlbmRpZgorICAgIH0KKworICAgIGNseiA9IGZpeE1heCgwLCBDbnRMZWFkaW5nWmVyb3MobWF4VmFsKSAtIERVQ0tFUl9IRUFEUk9PTV9CSVRTKTsKKyAgICBjbHogPSBmaXhNaW4oY2x6LCBEVUNLRVJfTUFYX05SR19TQ0FMRSk7CisgICAgKm5yZ1NjYWxlID0gKFNDSEFSKWNseiA8PCAxOworCisjaWZkZWYgRlVOQ1RJT05fRHVja2VyQ2FsY0VuZXJneV9mdW5jNAorICAgIER1Y2tlckNhbGNFbmVyZ3lfZnVuYzQoaW5wdXRSZWFsLCBpbnB1dEltYWcsIGVuZXJneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPm1hcEh5YkJhbmRzMlByb2NCYW5kcywgY2x6LCBzdGFydEh5YkJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhIeWJCYW5kLCBtYXhIeWJyaWRCYW5kKTsKKyNlbHNlCisgICAgZm9yIChxcyA9IHN0YXJ0SHliQmFuZDsgcXMgPD0gbWF4SHliQmFuZDsgcXMrKykgeworICAgICAgaW50IHBiID0gU3BhdGlhbERlY0dldFByb2Nlc3NpbmdCYW5kKHFzLCBzZWxmLT5tYXBIeWJCYW5kczJQcm9jQmFuZHMpOworICAgICAgZW5lcmd5W3BiXSArPQorICAgICAgICAgIChmUG93MkRpdjIoaW5wdXRSZWFsW3FzXSA8PCBjbHopICsgZlBvdzJEaXYyKGlucHV0SW1hZ1txc10gPDwgY2x6KSk7CisgICAgfQorCisgICAgZm9yICg7IHFzIDw9IG1heEh5YnJpZEJhbmQ7IHFzKyspIHsKKyAgICAgIGludCBwYiA9IFNwYXRpYWxEZWNHZXRQcm9jZXNzaW5nQmFuZChxcywgc2VsZi0+bWFwSHliQmFuZHMyUHJvY0JhbmRzKTsKKyAgICAgIGVuZXJneVtwYl0gKz0gZlBvdzJEaXYyKGlucHV0UmVhbFtxc10gPDwgY2x6KTsKKyAgICB9CisjZW5kaWYgLyogRlVOQ1RJT05fRHVja2VyQ2FsY0VuZXJneV9mdW5jNCAqLworICB9CisKKyAgeworICAgIC8qIENhdGNoIG92ZXJmbG93cyB3aGljaCBoYXZlIGJlZW4gb2JzZXJ2ZWQgaW4gZXJyZWQgYml0c3RyZWFtcyB0byBhdm9pZAorICAgICAqIGFzc2VydGlvbiBmYWlsdXJlcyBsYXRlci4gKi8KKyAgICBpbnQgcGI7CisgICAgZm9yIChwYiA9IDA7IHBiIDwgKDI4KTsgcGIrKykgeworICAgICAgZW5lcmd5W3BiXSA9IChGSVhQX0RCTCkoKExPTkcpZW5lcmd5W3BiXSAmIChMT05HKU1BWFZBTF9EQkwpOworICAgIH0KKyAgfQorICByZXR1cm4gZXJyOworfQorI2VuZGlmIC8qICNpZm5kZWYgRlVOQ1RJT05fRHVja2VyQ2FsY0VuZXJneSAqLworCitMTktfU0VDVElPTl9DT0RFX0wxCitzdGF0aWMgSU5UIER1Y2tlckFwcGx5KERVQ0tFUl9JTlNUQU5DRSAqY29uc3Qgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgY29uc3QgZGlyZWN0TnJnWygyOCldLAorICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBvdXRwdXRSZWFsWyg3MSldLCBGSVhQX0RCTCBvdXRwdXRJbWFnWyg3MSldLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRIeWJCYW5kKSB7CisgIElOVCBlcnIgPSAwOworICBpbnQgcXMgPSBzdGFydEh5YkJhbmQ7CisgIGludCBxc19uZXh0ID0gMDsKKyAgaW50IHBiID0gMDsKKyAgaW50IHN0YXJ0UGFyYW1CYW5kID0gMDsKKyAgaW50IGh5YkJhbmRzOworICBpbnQgaHlicmlkQmFuZHMgPSBzZWxmLT5oeWJyaWRCYW5kczsKKworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocmV2ZXJiTnJnLCBGSVhQX0RCTCwgKDI4KSk7CisKKyAgRklYUF9EQkwgKnNtb290aERpclJldk5yZyA9ICZzZWxmLT5TbW9vdGhEaXJSZXZOcmdbMF07CisgIEZJWFBfRFVDS19HQUlOIGR1Y2tHYWluID0gMDsKKworICBpbnQgZG9TY2FsZU5yZyA9IDA7CisgIGludCBzY2FsZURpcmVjdE5yZyA9IDA7CisgIGludCBzY2FsZVJldmVyYk5yZyA9IDA7CisgIGludCBzY2FsZVNtb290aERpclJldk5yZyA9IDA7CisgIEZJWFBfREJMIG1heERpclJldk5yZyA9IEZMMkZYQ09OU1RfREJMKDAuMCk7CisKKyAgaHliQmFuZHMgPSBoeWJyaWRCYW5kczsKKworICBzdGFydFBhcmFtQmFuZCA9CisgICAgICBTcGF0aWFsRGVjR2V0UHJvY2Vzc2luZ0JhbmQoc3RhcnRIeWJCYW5kLCBzZWxmLT5tYXBIeWJCYW5kczJQcm9jQmFuZHMpOworCisgIER1Y2tlckNhbGNFbmVyZ3koc2VsZiwgb3V0cHV0UmVhbCwgb3V0cHV0SW1hZywgcmV2ZXJiTnJnLAorICAgICAgICAgICAgICAgICAgIHNlbGYtPm1heFZhbFJldmVyYkRhdGEsICYoc2VsZi0+c2NhbGVSZXZlcmJOcmcpLCAwLAorICAgICAgICAgICAgICAgICAgIHN0YXJ0SHliQmFuZCk7CisKKyAgaWYgKChzZWxmLT5zY2FsZURpcmVjdE5yZyAhPSBzZWxmLT5zY2FsZVJldmVyYk5yZykgfHwKKyAgICAgIChzZWxmLT5zY2FsZURpcmVjdE5yZyAhPSBzZWxmLT5zY2FsZVNtb290aERpclJldk5yZykgfHwKKyAgICAgIChzZWxmLT5oZWFkcm9vbVNtb290aERpclJldk5yZyA9PSAwKSkgeworICAgIGludCBzY2FsZTsKKworICAgIHNjYWxlID0gZml4TWluKHNlbGYtPnNjYWxlRGlyZWN0TnJnLCBzZWxmLT5zY2FsZVNtb290aERpclJldk5yZyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5oZWFkcm9vbVNtb290aERpclJldk5yZyAtIDEpOworICAgIHNjYWxlID0gZml4TWluKHNjYWxlLCBzZWxmLT5zY2FsZVJldmVyYk5yZyk7CisKKyAgICBzY2FsZURpcmVjdE5yZyA9IGZNYXgoZk1pbihzZWxmLT5zY2FsZURpcmVjdE5yZyAtIHNjYWxlLCAoREZSQUNUX0JJVFMgLSAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0oREZSQUNUX0JJVFMgLSAxKSk7CisgICAgc2NhbGVSZXZlcmJOcmcgPSBmTWF4KGZNaW4oc2VsZi0+c2NhbGVSZXZlcmJOcmcgLSBzY2FsZSwgKERGUkFDVF9CSVRTIC0gMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAtKERGUkFDVF9CSVRTIC0gMSkpOworICAgIHNjYWxlU21vb3RoRGlyUmV2TnJnID0KKyAgICAgICAgZk1heChmTWluKHNlbGYtPnNjYWxlU21vb3RoRGlyUmV2TnJnIC0gc2NhbGUsIChERlJBQ1RfQklUUyAtIDEpKSwKKyAgICAgICAgICAgICAtKERGUkFDVF9CSVRTIC0gMSkpOworCisgICAgc2VsZi0+c2NhbGVTbW9vdGhEaXJSZXZOcmcgPSAoU0NIQVIpc2NhbGU7CisKKyAgICBkb1NjYWxlTnJnID0gMTsKKyAgfQorICBmb3IgKHBiID0gc3RhcnRQYXJhbUJhbmQ7IHBiIDwgc2VsZi0+cGFyYW1ldGVyQmFuZHM7IHBiKyspIHsKKyAgICBGSVhQX0RCTCB0bXAxOworICAgIEZJWFBfREJMIHRtcDI7CisgICAgSU5UIHM7CisKKyAgICAvKiBzbW9vdGhEaXJSZXZOcmdbMipwYiAgXSA9IGZNdWx0KHNtb290aERpclJldk5yZ1syKnBiICBdLERVQ0tfQUxQSEFfRkRLKSArCisgICAgICAgZk11bHREaXYyKGRpcmVjdE5yZ1twYl0sRFVDS19PTkVfTUlOVVNfQUxQSEFfWDRfRkRLKTsKKyAgICAgICBzbW9vdGhEaXJSZXZOcmdbMipwYisxXSA9IGZNdWx0KHNtb290aERpclJldk5yZ1syKnBiKzFdLERVQ0tfQUxQSEFfRkRLKSArCisgICAgICAgZk11bHREaXYyKHJldmVyYk5yZ1twYl0sRFVDS19PTkVfTUlOVVNfQUxQSEFfWDRfRkRLKTsgdG1wMSA9CisgICAgICAgZk11bHQoc21vb3RoRGlyUmV2TnJnWzIqcGJdLERVQ0tfR0FNTUFfRkRLKTsgdG1wMiA9CisgICAgICAgc21vb3RoRGlyUmV2TnJnWzIqcGIrMV0gPj4gMTsKKyAgICAqLworICAgIHRtcDEgPSBzbW9vdGhEaXJSZXZOcmdbMiAqIHBiICsgMF07CisgICAgdG1wMiA9IHNtb290aERpclJldk5yZ1syICogcGIgKyAxXTsKKyAgICB0bXAxID0gZk11bHQodG1wMSwgRFVDS19BTFBIQV9GREspOworICAgIHRtcDIgPSBmTXVsdCh0bXAyLCBEVUNLX0FMUEhBX0ZESyk7CisKKyAgICBpZiAoZG9TY2FsZU5yZykgeworICAgICAgaW50IHNjYWxlU21vb3RoRGlyUmV2TnJnX2FzRXhwb25lbnQgPSAtc2NhbGVTbW9vdGhEaXJSZXZOcmc7CisKKyAgICAgIHRtcDEgPSBzY2FsZVZhbHVlKHRtcDEsIHNjYWxlU21vb3RoRGlyUmV2TnJnX2FzRXhwb25lbnQpOworICAgICAgdG1wMiA9IHNjYWxlVmFsdWUodG1wMiwgc2NhbGVTbW9vdGhEaXJSZXZOcmdfYXNFeHBvbmVudCk7CisgICAgICB0bXAxID0gZk11bHRBZGREaXYyKHRtcDEsIGRpcmVjdE5yZ1twYl0gPj4gc2NhbGVEaXJlY3ROcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERVQ0tfT05FX01JTlVTX0FMUEhBX1g0X0ZESyk7CisgICAgICB0bXAyID0gZk11bHRBZGREaXYyKHRtcDIsIHJldmVyYk5yZ1twYl0gPj4gc2NhbGVSZXZlcmJOcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERVQ0tfT05FX01JTlVTX0FMUEhBX1g0X0ZESyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRtcDEgPSBmTXVsdEFkZERpdjIodG1wMSwgZGlyZWN0TnJnW3BiXSwgRFVDS19PTkVfTUlOVVNfQUxQSEFfWDRfRkRLKTsKKyAgICAgIHRtcDIgPSBmTXVsdEFkZERpdjIodG1wMiwgcmV2ZXJiTnJnW3BiXSwgRFVDS19PTkVfTUlOVVNfQUxQSEFfWDRfRkRLKTsKKyAgICB9CisKKyAgICBzbW9vdGhEaXJSZXZOcmdbMiAqIHBiXSA9IHRtcDE7CisgICAgc21vb3RoRGlyUmV2TnJnWzIgKiBwYiArIDFdID0gdG1wMjsKKworICAgIG1heERpclJldk5yZyB8PSBmQWJzKHRtcDEpOworICAgIG1heERpclJldk5yZyB8PSBmQWJzKHRtcDIpOworCisgICAgdG1wMSA9IGZNdWx0KHRtcDEsIERVQ0tfR0FNTUFfRkRLKTsKKyAgICB0bXAyID0gdG1wMiA+PiAxOworCisgICAgcXNfbmV4dCA9IGZNaW4oKGludClzZWxmLT5xc19uZXh0W3BiXSwgc2VsZi0+aHlicmlkQmFuZHMpOworCisgICAgaWYgKHRtcDIgPiB0bXAxKSB7IC8qIHRydWUgZm9yIGFib3V0IDIwJSAqLworICAgICAgLyogZ2FpbiBzbWFsbGVyIHRoYW4gMS4wICovCisgICAgICB0bXAxID0gc3FydEZpeHAodG1wMSk7CisgICAgICB0bXAyID0gaW52U3FydE5vcm0yKHRtcDIsICZzKTsKKyAgICAgIGR1Y2tHYWluID0gRlhfREJMMkZYX0RVQ0tfR0FJTihmTXVsdERpdjIodG1wMSwgdG1wMikgPDwgcyk7CisgICAgfSBlbHNlIHsgLyogdHJ1ZSBmb3IgYWJvdXQgODAgJSAqLworICAgICAgdG1wMiA9IHNtb290aERpclJldk5yZ1syICogcGJdID4+IDE7CisgICAgICB0bXAxID0gZk11bHQoc21vb3RoRGlyUmV2TnJnWzIgKiBwYiArIDFdLCBEVUNLX0dBTU1BX0ZESyk7CisgICAgICBpZiAodG1wMiA+IHRtcDEpIHsgLyogdHJ1ZSBmb3IgYWJvdXQgMjAlICovCisgICAgICAgIGlmICh0bXAxIDw9ICh0bXAyID4+IDIpKSB7CisgICAgICAgICAgLyogbGltaXQgZ2FpbiB0byAyLjAgKi8KKyAgICAgICAgICBpZiAocXMgPCBoeWJCYW5kcykgeworICAgICAgICAgICAgZm9yICg7IHFzIDwgcXNfbmV4dDsgcXMrKykgeworICAgICAgICAgICAgICBvdXRwdXRSZWFsW3FzXSA9IG91dHB1dFJlYWxbcXNdIDw8IDE7CisgICAgICAgICAgICAgIG91dHB1dEltYWdbcXNdID0gb3V0cHV0SW1hZ1txc10gPDwgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICg7IHFzIDwgcXNfbmV4dDsgcXMrKykgeworICAgICAgICAgICAgICBvdXRwdXRSZWFsW3FzXSA9IG91dHB1dFJlYWxbcXNdIDw8IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIC8qIHNraXAgZ2VuZXJhbCBnYWluKm91dHB1dCBzZWN0aW9uICovCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogZ2FpbiBmcm9tIDEuMCB0byAyLjAgKi8KKyAgICAgICAgICB0bXAyID0gc3FydEZpeHAodG1wMiA+PiAyKTsKKyAgICAgICAgICB0bXAxID0gaW52U3FydE5vcm0yKHRtcDEsICZzKTsKKyAgICAgICAgICBkdWNrR2FpbiA9IEZYX0RCTDJGWF9EVUNLX0dBSU4oZk11bHQodG1wMSwgdG1wMikgPDwgcyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7IC8qIHRydWUgZm9yIGFib3V0IDYwJSAqLworICAgICAgICAvKiBnYWluID0gMS4wOyBvdXRwdXQgZG9lcyBub3QgY2hhbmdlOyB1cGRhdGUgcXMgaW5kZXggKi8KKyAgICAgICAgcXMgPSBxc19uZXh0OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBGVU5DVElPTl9EdWNrZXJBcHBseV9mdW5jMQorICAgIHFzID0gRHVja2VyQXBwbHlfZnVuYzEocXMsIGh5YkJhbmRzLCBxc19uZXh0LCBvdXRwdXRSZWFsLCBvdXRwdXRJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVja0dhaW4pOworI2Vsc2UKKyAgICAvKiBnZW5lcmFsIGdhaW4qb3V0cHV0IHNlY3Rpb24gKi8KKyAgICBpZiAocXMgPCBoeWJCYW5kcykgeyAgICAgICAgICAgLyogdHJ1ZSBmb3IgYWJvdXQgMzklICovCisgICAgICBmb3IgKDsgcXMgPCBxc19uZXh0OyBxcysrKSB7IC8qIHJ1bnMgYWJvdXQgMiB0aW1lcyAqLworICAgICAgICBvdXRwdXRSZWFsW3FzXSA9IGZNdWx0RGl2MihvdXRwdXRSZWFsW3FzXSwgZHVja0dhaW4pIDw8IDI7CisgICAgICAgIG91dHB1dEltYWdbcXNdID0gZk11bHREaXYyKG91dHB1dEltYWdbcXNdLCBkdWNrR2FpbikgPDwgMjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yICg7IHFzIDwgcXNfbmV4dDsgcXMrKykgeworICAgICAgICBvdXRwdXRSZWFsW3FzXSA9IGZNdWx0RGl2MihvdXRwdXRSZWFsW3FzXSwgZHVja0dhaW4pIDw8IDI7CisgICAgICB9CisgICAgfQorI2VuZGlmCisgIH0gLyogcGIgKi8KKworICBzZWxmLT5oZWFkcm9vbVNtb290aERpclJldk5yZyA9CisgICAgICAoU0NIQVIpZml4TWF4KDAsIENudExlYWRpbmdaZXJvcyhtYXhEaXJSZXZOcmcpIC0gMSk7CisKKyAgQ19BTExPQ19TQ1JBVENIX0VORChyZXZlcmJOcmcsIEZJWFBfREJMLCAoMjgpKTsKKworICByZXR1cm4gZXJyOworfQorCitMTktfU0VDVElPTl9DT0RFX0wxCitzdGF0aWMgSU5UIER1Y2tlckFwcGx5UFMoRFVDS0VSX0lOU1RBTkNFICpjb25zdCBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGNvbnN0IGRpcmVjdE5yZ1soMjgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBvdXRwdXRSZWFsWyg3MSldLCBGSVhQX0RCTCBvdXRwdXRJbWFnWyg3MSldLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydEh5YkJhbmQpIHsKKyAgaW50IHFzID0gc3RhcnRIeWJCYW5kOworICBpbnQgcGIgPSAwOworICBpbnQgc3RhcnRQYXJhbUJhbmQgPQorICAgICAgU3BhdGlhbERlY0dldFByb2Nlc3NpbmdCYW5kKHN0YXJ0SHliQmFuZCwgc2VsZi0+bWFwSHliQmFuZHMyUHJvY0JhbmRzKTsKKyAgaW50IGh5YkJhbmRzOworCisgIGludCBkb1NjYWxlTnJnID0gMDsKKyAgaW50IHNjYWxlRGlyZWN0TnJnID0gMDsKKyAgaW50IHNjYWxlU21vb3RoRGlyUmV2TnJnID0gMDsKKyAgRklYUF9EQkwgbWF4RGlyUmV2TnJnID0gRkwyRlhDT05TVF9EQkwoMC4wKTsKKworICBpZiAoKHNlbGYtPnNjYWxlRGlyZWN0TnJnICE9IHNlbGYtPnNjYWxlU21vb3RoRGlyUmV2TnJnKSB8fAorICAgICAgKHNlbGYtPmhlYWRyb29tU21vb3RoRGlyUmV2TnJnID09IDApKSB7CisgICAgaW50IHNjYWxlOworCisgICAgc2NhbGUgPSBmaXhNaW4oc2VsZi0+c2NhbGVEaXJlY3ROcmcsIHNlbGYtPnNjYWxlU21vb3RoRGlyUmV2TnJnICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmhlYWRyb29tU21vb3RoRGlyUmV2TnJnIC0gMik7CisKKyAgICBzY2FsZURpcmVjdE5yZyA9IGZNYXgoZk1pbihzZWxmLT5zY2FsZURpcmVjdE5yZyAtIHNjYWxlLCAoREZSQUNUX0JJVFMgLSAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0oREZSQUNUX0JJVFMgLSAxKSk7CisgICAgc2NhbGVTbW9vdGhEaXJSZXZOcmcgPQorICAgICAgICBmTWF4KGZNaW4oc2VsZi0+c2NhbGVTbW9vdGhEaXJSZXZOcmcgLSBzY2FsZSwgKERGUkFDVF9CSVRTIC0gMSkpLAorICAgICAgICAgICAgIC0oREZSQUNUX0JJVFMgLSAxKSk7CisKKyAgICBzZWxmLT5zY2FsZVNtb290aERpclJldk5yZyA9IChTQ0hBUilzY2FsZTsKKworICAgIGRvU2NhbGVOcmcgPSAxOworICB9CisKKyAgaHliQmFuZHMgPSBzZWxmLT5oeWJyaWRCYW5kczsKKworICBGREtfQVNTRVJUKChzZWxmLT5wYXJhbWV0ZXJCYW5kcyA9PSAoMjgpKSB8fCAoc2VsZi0+cGFyYW1ldGVyQmFuZHMgPT0gKDIwKSkpOworICBmb3IgKHBiID0gc3RhcnRQYXJhbUJhbmQ7IHBiIDwgc2VsZi0+cGFyYW1ldGVyQmFuZHM7IHBiKyspIHsKKyAgICBGSVhQX0RCTCBkaXJlY3ROcmcyID0gZGlyZWN0TnJnW3BiXTsKKworICAgIGlmIChkb1NjYWxlTnJnKSB7CisgICAgICBkaXJlY3ROcmcyID0gc2NhbGVWYWx1ZShkaXJlY3ROcmcyLCAtc2NhbGVEaXJlY3ROcmcpOworICAgICAgc2VsZi0+cGVha0RpZmZbcGJdID0KKyAgICAgICAgICBzY2FsZVZhbHVlKHNlbGYtPnBlYWtEaWZmW3BiXSwgLXNjYWxlU21vb3RoRGlyUmV2TnJnKTsKKyAgICAgIHNlbGYtPnBlYWtEZWNheVtwYl0gPQorICAgICAgICAgIHNjYWxlVmFsdWUoc2VsZi0+cGVha0RlY2F5W3BiXSwgLXNjYWxlU21vb3RoRGlyUmV2TnJnKTsKKyAgICAgIHNlbGYtPlNtb290aERpclJldk5yZ1twYl0gPQorICAgICAgICAgIHNjYWxlVmFsdWUoc2VsZi0+U21vb3RoRGlyUmV2TnJnW3BiXSwgLXNjYWxlU21vb3RoRGlyUmV2TnJnKTsKKyAgICB9CisgICAgc2VsZi0+cGVha0RlY2F5W3BiXSA9IGZpeE1heCgKKyAgICAgICAgZGlyZWN0TnJnMiwgZk11bHQoc2VsZi0+cGVha0RlY2F5W3BiXSwgUFNfRFVDS19QRUFLX0RFQ0FZX0ZBQ1RPUl9GREspKTsKKyAgICBzZWxmLT5wZWFrRGlmZltwYl0gPQorICAgICAgICBzZWxmLT5wZWFrRGlmZltwYl0gKworICAgICAgICBmTXVsdChQU19EVUNLX0ZJTFRFUl9DT0VGRl9GREssCisgICAgICAgICAgICAgIChzZWxmLT5wZWFrRGVjYXlbcGJdIC0gZGlyZWN0TnJnMiAtIHNlbGYtPnBlYWtEaWZmW3BiXSkpOworICAgIHNlbGYtPlNtb290aERpclJldk5yZ1twYl0gPQorICAgICAgICBmaXhNYXgoc2VsZi0+U21vb3RoRGlyUmV2TnJnW3BiXSArCisgICAgICAgICAgICAgICAgICAgZk11bHQoUFNfRFVDS19GSUxURVJfQ09FRkZfRkRLLAorICAgICAgICAgICAgICAgICAgICAgICAgIChkaXJlY3ROcmcyIC0gc2VsZi0+U21vb3RoRGlyUmV2TnJnW3BiXSkpLAorICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMCkpOworCisgICAgbWF4RGlyUmV2TnJnIHw9IGZBYnMoc2VsZi0+cGVha0RpZmZbcGJdKTsKKyAgICBtYXhEaXJSZXZOcmcgfD0gZkFicyhzZWxmLT5TbW9vdGhEaXJSZXZOcmdbcGJdKTsKKworICAgIGlmICgoc2VsZi0+cGVha0RpZmZbcGJdID09IEZMMkZYQ09OU1RfREJMKDApKSAmJgorICAgICAgICAoc2VsZi0+U21vb3RoRGlyUmV2TnJnW3BiXSA9PSBGTDJGWENPTlNUX0RCTCgwKSkpIHsKKyAgICAgIGludCBxc19uZXh0OworCisgICAgICBxcyA9IGZNYXgocXMsIFNwYXRpYWxEZWNHZXRRbWZCYW5kKHBiLCBzZWxmLT5tYXBQcm9jQmFuZHMySHliQmFuZHMpKTsKKyAgICAgIHFzX25leHQgPSBmTWluKChpbnQpc2VsZi0+cXNfbmV4dFtwYl0sIHNlbGYtPmh5YnJpZEJhbmRzKTsKKworICAgICAgRklYUF9EQkwgKnBPdXRwdXRSZWFsID0gJm91dHB1dFJlYWxbcXNdOworICAgICAgRklYUF9EQkwgKnBPdXRwdXRJbWFnID0gJm91dHB1dEltYWdbcXNdOworCisgICAgICBpZiAocXMgPCBoeWJCYW5kcykgeworICAgICAgICBmb3IgKDsgcXMgPCBxc19uZXh0OyBxcysrKSB7CisgICAgICAgICAgKnBPdXRwdXRSZWFsKysgPSBGTDJGWENPTlNUX0RCTCgwKTsKKyAgICAgICAgICAqcE91dHB1dEltYWcrKyA9IEZMMkZYQ09OU1RfREJMKDApOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKDsgcXMgPCBxc19uZXh0OyBxcysrKSB7CisgICAgICAgICAgKnBPdXRwdXRSZWFsKysgPSBGTDJGWENPTlNUX0RCTCgwKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoc2VsZi0+cGVha0RpZmZbcGJdICE9IEZMMkZYQ09OU1RfREJMKDApKSB7CisgICAgICBGSVhQX0RCTCBtdWx0aXBsaWNhdGlvbiA9CisgICAgICAgICAgZk11bHQoRkwyRlhDT05TVF9EVUNLKDAuNzVmKSwgc2VsZi0+cGVha0RpZmZbcGJdKTsKKyAgICAgIGlmIChtdWx0aXBsaWNhdGlvbiA+IChzZWxmLT5TbW9vdGhEaXJSZXZOcmdbcGJdID4+IDEpKSB7CisgICAgICAgIEZJWFBfREJMIG51bSwgZGVub20sIGR1Y2tHYWluOworICAgICAgICBpbnQgc2NhbGUsIHFzX25leHQ7CisKKyAgICAgICAgLyogaW1wbGVtZW50IHgveSBhcyAoc3FydCh4KSppbnZTcXJ0KHkpKV4yICovCisgICAgICAgIG51bSA9IHNxcnRGaXhwKHNlbGYtPlNtb290aERpclJldk5yZ1twYl0gPj4gMSk7CisgICAgICAgIGRlbm9tID0gc2VsZi0+cGVha0RpZmZbcGJdICsKKyAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTChBQlNfVEhSIC8gKDMyNzY4LjBmICogMzI3NjguMGYgKiAxMjguMGYgKiAxLjVmKSk7CisgICAgICAgIGRlbm9tID0gaW52U3FydE5vcm0yKGRlbm9tLCAmc2NhbGUpOworCisgICAgICAgIC8qIGR1Y2sgb3V0cHV0IHdoZXRoZXIgZHVja0dhaW4gIT0gMS5mICovCisgICAgICAgIHFzID0gZk1heChxcywgU3BhdGlhbERlY0dldFFtZkJhbmQocGIsIHNlbGYtPm1hcFByb2NCYW5kczJIeWJCYW5kcykpOworICAgICAgICBxc19uZXh0ID0gZk1pbigoaW50KXNlbGYtPnFzX25leHRbcGJdLCBzZWxmLT5oeWJyaWRCYW5kcyk7CisKKyAgICAgICAgZHVja0dhaW4gPSBmTXVsdChudW0sIGRlbm9tKTsKKyAgICAgICAgZHVja0dhaW4gPSBmUG93MkRpdjIoZHVja0dhaW4gPDwgc2NhbGUpOworICAgICAgICBkdWNrR2FpbiA9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RVQ0soMi5mIC8gMy5mKSwgZHVja0dhaW4pIDw8IDM7CisKKyAgICAgICAgRklYUF9EQkwgKnBPdXRwdXRSZWFsID0gJm91dHB1dFJlYWxbcXNdOworICAgICAgICBGSVhQX0RCTCAqcE91dHB1dEltYWcgPSAmb3V0cHV0SW1hZ1txc107CisKKyAgICAgICAgaWYgKHFzIDwgaHliQmFuZHMpIHsKKyAgICAgICAgICBmb3IgKDsgcXMgPCBxc19uZXh0OyBxcysrKSB7CisgICAgICAgICAgICAqcE91dHB1dFJlYWwgPSBmTXVsdCgqcE91dHB1dFJlYWwsIGR1Y2tHYWluKTsKKyAgICAgICAgICAgIHBPdXRwdXRSZWFsKys7IC8qIGRvbid0IG1vdmUgaW4gZnJvbnQgb2YgIj0iIGFib3ZlLCBiZWNhdXNlIHRoZW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFjdCBjbGFzcyB0cmVhdHMgaXQgZGlmZmVyZW50bHkgYW5kIHByb3ZpZGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cm9uZyBhcmd1bWVudCB0byBmTXVsdCgpIChzZWVuIG9uIHdpbjMyL21zdmM4KSAqLworICAgICAgICAgICAgKnBPdXRwdXRJbWFnID0gZk11bHQoKnBPdXRwdXRJbWFnLCBkdWNrR2Fpbik7CisgICAgICAgICAgICBwT3V0cHV0SW1hZysrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKDsgcXMgPCBxc19uZXh0OyBxcysrKSB7CisgICAgICAgICAgICAqcE91dHB1dFJlYWwgPSBmTXVsdCgqcE91dHB1dFJlYWwsIGR1Y2tHYWluKTsKKyAgICAgICAgICAgIHBPdXRwdXRSZWFsKys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IC8qIHBiICovCisKKyAgc2VsZi0+aGVhZHJvb21TbW9vdGhEaXJSZXZOcmcgPQorICAgICAgKFNDSEFSKWZpeE1heCgwLCBDbnRMZWFkaW5nWmVyb3MobWF4RGlyUmV2TnJnKSAtIDEpOworCisgIHJldHVybiAwOworfQorCitJTlQgRkRLZGVjb3JyZWxhdGVPcGVuKEhBTkRMRV9ERUNPUlJfREVDIGhEZWNvcnJEZWMsIEZJWFBfREJMICpidWZmZXJDcGx4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYnVmTGVuKSB7CisgIEhBTkRMRV9ERUNPUlJfREVDIHNlbGYgPSBoRGVjb3JyRGVjOworCisgIGlmIChidWZMZW4gPCAoMiAqICgoODI1KSArICgzNzMpKSkpIHJldHVybiAxOworCisgIC8qIGFzc2lnbiBhbGwgbWVtb3J5IHRvIHN0YXRlQnVmZmVyQ3BseC4gSXQgaXMgcmVhc3NpZ25lZCBkdXJpbmcKKyAgICogRkRLZGVjb3JyZWxhdGVJbml0KCkgKi8KKyAgc2VsZi0+c3RhdGVCdWZmZXJDcGx4ID0gYnVmZmVyQ3BseDsKKyAgc2VsZi0+TF9zdGF0ZUJ1ZmZlckNwbHggPSAwOworCisgIHNlbGYtPmRlbGF5QnVmZmVyQ3BseCA9IE5VTEw7CisgIHNlbGYtPkxfZGVsYXlCdWZmZXJDcGx4ID0gMDsKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaXN0cmlidXRlQnVmZmVyKEhBTkRMRV9ERUNPUlJfREVDIHNlbGYsIGNvbnN0IGludCBMX3N0YXRlQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBMX2RlbGF5QnVmKSB7CisgIC8qIGZhY3RvciAyIGJlY2F1c2Ugb2YgY29tcGxleCB2YWx1ZXMgKi8KKyAgaWYgKCgyICogKCg4MjUpICsgKDM3MykpKSA8IDIgKiAoTF9zdGF0ZUJ1ZiArIExfZGVsYXlCdWYpKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBzZWxmLT5MX3N0YXRlQnVmZmVyQ3BseCA9IDIgKiBMX3N0YXRlQnVmOworICBzZWxmLT5kZWxheUJ1ZmZlckNwbHggPSBzZWxmLT5zdGF0ZUJ1ZmZlckNwbHggKyAyICogTF9zdGF0ZUJ1ZjsKKyAgc2VsZi0+TF9kZWxheUJ1ZmZlckNwbHggPSAyICogTF9kZWxheUJ1ZjsKKworICByZXR1cm4gMDsKK30KK0lOVCBGREtkZWNvcnJlbGF0ZUluaXQoSEFORExFX0RFQ09SUl9ERUMgaERlY29yckRlYywgY29uc3QgSU5UIG5ySHliQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZES19ERUNPUlJfVFlQRSBkZWNvcnJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGREtfRFVDS0VSX1RZUEUgZHVja2VyVHlwZSwgY29uc3QgSU5UIGRlY29yckNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNlZWQsIGNvbnN0IElOVCBwYXJ0aWFsbHlDb21wbGV4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgdXNlRnJhY3REZWxheSwgY29uc3QgSU5UIGlzTGVnYWN5UFMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpbml0U3RhdGVzRmxhZykgeworICBJTlQgZXJyb3JDb2RlID0gMDsKKyAgaW50IGksIHJiLCBpX3N0YXJ0OworICBpbnQgblBhcmFtQmFuZHMgPSAyODsKKworICBJTlQgb2Zmc2V0U3RhdGVCdWZmZXIgPSAwOworICBJTlQgb2Zmc2V0RGVsYXlCdWZmZXIgPSAwOworCisgIGNvbnN0IFVDSEFSICpSRVZfYmFuZE9mZnNldDsKKworICBjb25zdCBTQ0hBUiAqUkVWX2ZpbHRlck9yZGVyOworCisgIGhEZWNvcnJEZWMtPnBhcnRpYWxseUNvbXBsZXggPSBwYXJ0aWFsbHlDb21wbGV4OworICBoRGVjb3JyRGVjLT5udW1iaW5zID0gbnJIeWJCYW5kczsKKworICBzd2l0Y2ggKGRlY29yclR5cGUpIHsKKyAgICBjYXNlIERFQ09SUl9QUzoKKyAgICAgIC8qIGlnbm9yZSBkZWNvcnJDb25maWcsIHNlZWQgKi8KKyAgICAgIGlmIChwYXJ0aWFsbHlDb21wbGV4KSB7CisgICAgICAgIGhEZWNvcnJEZWMtPlJFVl9iYW5kT2Zmc2V0ID0gUkVWX2JhbmRPZmZzZXRfUFNfTFA7CisgICAgICAgIGhEZWNvcnJEZWMtPlJFVl9kZWxheSA9IFJFVl9kZWxheV9QU19MUDsKKyAgICAgICAgZXJyb3JDb2RlID0gZGlzdHJpYnV0ZUJ1ZmZlcihoRGVjb3JyRGVjLCAoMTY4KSwgKDUzMykpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaERlY29yckRlYy0+UkVWX2JhbmRPZmZzZXQgPSBSRVZfYmFuZE9mZnNldF9QU19IUTsKKyAgICAgICAgaERlY29yckRlYy0+UkVWX2RlbGF5ID0gUkVWX2RlbGF5X1BTX0hROworICAgICAgICBlcnJvckNvZGUgPSBkaXN0cmlidXRlQnVmZmVyKGhEZWNvcnJEZWMsICgzNjApLCAoMjU3KSk7CisgICAgICB9CisgICAgICBoRGVjb3JyRGVjLT5SRVZfZmlsdGVyT3JkZXIgPSBSRVZfZmlsdGVyT3JkZXJfUFM7CisgICAgICBoRGVjb3JyRGVjLT5SRVZfZmlsdFR5cGUgPSBSRVZfZmlsdFR5cGVfUFM7CisKKyAgICAgIC8qIEluaXRpYWxpemUgcmluZyBidWZmZXIgb2Zmc2V0cyBmb3IgUFMgc3BlY2lmaWMgZmlsdGVyIGltcGxlbWVudGF0aW9uLgorICAgICAgICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgKDMpOyBpKyspCisgICAgICAgIGhEZWNvcnJEZWMtPnN0YXRlQnVmZmVyT2Zmc2V0W2ldID0gc3RhdGVCdWZmZXJPZmZzZXRJbml0W2ldOworCisgICAgICBicmVhazsKKyAgICBjYXNlIERFQ09SUl9VU0FDOgorICAgICAgaWYgKHBhcnRpYWxseUNvbXBsZXgpIHJldHVybiAxOworICAgICAgaWYgKHNlZWQgIT0gMCkgcmV0dXJuIDE7CisgICAgICBoRGVjb3JyRGVjLT5SRVZfYmFuZE9mZnNldCA9CisgICAgICAgICAgUkVWX2JhbmRPZmZzZXRfTVBTX0hRW2RlY29yckNvbmZpZ107IC8qIHJldmVyYiBiYW5kIGxheW91dCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0ZWQgZnJvbSBNUFMgc3RhbmRhcmQgKi8KKyAgICAgIGhEZWNvcnJEZWMtPlJFVl9maWx0ZXJPcmRlciA9IFJFVl9maWx0ZXJPcmRlcl9VU0FDOworICAgICAgaERlY29yckRlYy0+UkVWX2RlbGF5ID0gUkVWX2RlbGF5X1VTQUM7CisgICAgICBpZiAodXNlRnJhY3REZWxheSkgeworICAgICAgICByZXR1cm4gMTsgLyogbm90IHlldCBzdXBwb3J0ZWQgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhEZWNvcnJEZWMtPlJFVl9maWx0VHlwZSA9IFJFVl9maWx0VHlwZV9NUFM7IC8qIHRoZSBmaWx0ZXIgdHlwZXMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRlZCBmcm9tIE1QUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZCAqLworICAgICAgfQorICAgICAgLyogYnNEZWNvcnJDb25maWcgPT0gMSBpcyB3b3JzdCBjYXNlICovCisgICAgICBlcnJvckNvZGUgPSBkaXN0cmlidXRlQnVmZmVyKGhEZWNvcnJEZWMsICg1MDkpLCAoNjQzKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERFQ09SUl9MRDoKKyAgICAgIGlmIChwYXJ0aWFsbHlDb21wbGV4KSByZXR1cm4gMTsKKyAgICAgIGlmICh1c2VGcmFjdERlbGF5KSByZXR1cm4gMTsKKyAgICAgIGlmIChkZWNvcnJDb25maWcgPiAyKSByZXR1cm4gMTsKKyAgICAgIGlmIChzZWVkID4gKE1BWF9ERUNPUlJfU0VFRF9MRCAtIDEpKSByZXR1cm4gMTsKKyAgICAgIGlmICghKG5ySHliQmFuZHMgPT0gNjQgfHwgbnJIeWJCYW5kcyA9PSAzMikpCisgICAgICAgIHJldHVybiAxOyAvKiBhY3R1YWxseSBqdXN0IHFtZiBiYW5kcyBhbmQgbm8gaHlicmlkIGJhbmRzICovCisgICAgICBoRGVjb3JyRGVjLT5SRVZfYmFuZE9mZnNldCA9IFJFVl9iYW5kT2Zmc2V0X0xEW2RlY29yckNvbmZpZ107CisgICAgICBoRGVjb3JyRGVjLT5SRVZfZmlsdGVyT3JkZXIgPSBSRVZfZmlsdGVyT3JkZXJfTVBTOyAvKiB0aGUgZmlsdGVyIG9yZGVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGluaGVyaXRlZCBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUFMgc3RhbmRhcmQgKi8KKyAgICAgIGhEZWNvcnJEZWMtPlJFVl9kZWxheSA9CisgICAgICAgICAgUkVWX2RlbGF5X01QUzsgLyogdGhlIGRlbGF5cyBpbiBlYWNoIHJldmVyYiBiYW5kIGFyZSBpbmhlcml0ZWQgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QUyBzdGFuZGFyZCAqLworICAgICAgaERlY29yckRlYy0+UkVWX2ZpbHRUeXBlID0gUkVWX2ZpbHRUeXBlX0xEOworICAgICAgZXJyb3JDb2RlID0gZGlzdHJpYnV0ZUJ1ZmZlcihoRGVjb3JyRGVjLCAoODI1KSwgKDM3MykpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKGVycm9yQ29kZSkgeworICAgIHJldHVybiBlcnJvckNvZGU7CisgIH0KKworICBpZiAoaW5pdFN0YXRlc0ZsYWcpIHsKKyAgICBGREttZW1jbGVhcigKKyAgICAgICAgaERlY29yckRlYy0+c3RhdGVCdWZmZXJDcGx4LAorICAgICAgICBoRGVjb3JyRGVjLT5MX3N0YXRlQnVmZmVyQ3BseCAqIHNpemVvZigqaERlY29yckRlYy0+c3RhdGVCdWZmZXJDcGx4KSk7CisgICAgRkRLbWVtY2xlYXIoCisgICAgICAgIGhEZWNvcnJEZWMtPmRlbGF5QnVmZmVyQ3BseCwKKyAgICAgICAgaERlY29yckRlYy0+TF9kZWxheUJ1ZmZlckNwbHggKiBzaXplb2YoKmhEZWNvcnJEZWMtPmRlbGF5QnVmZmVyQ3BseCkpOworICAgIEZES21lbWNsZWFyKGhEZWNvcnJEZWMtPnJldmVyYkJhbmREZWxheUJ1ZmZlckluZGV4LAorICAgICAgICAgICAgICAgIHNpemVvZihoRGVjb3JyRGVjLT5yZXZlcmJCYW5kRGVsYXlCdWZmZXJJbmRleCkpOworICB9CisKKyAgUkVWX2JhbmRPZmZzZXQgPSBoRGVjb3JyRGVjLT5SRVZfYmFuZE9mZnNldDsKKworICBSRVZfZmlsdGVyT3JkZXIgPSBoRGVjb3JyRGVjLT5SRVZfZmlsdGVyT3JkZXI7CisKKyAgaV9zdGFydCA9IDA7CisgIGZvciAocmIgPSAwOyByYiA8ICg0KTsgcmIrKykgeworICAgIGludCBpX3N0b3A7CisKKyAgICBpX3N0b3AgPSBSRVZfYmFuZE9mZnNldFtyYl07CisKKyAgICBpZiAoaV9zdG9wIDw9IGlfc3RhcnQpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGZvciAoaSA9IGlfc3RhcnQ7IGkgPCBpX3N0b3A7IGkrKykgeworICAgICAgc3dpdGNoIChkZWNvcnJUeXBlKSB7CisgICAgICAgIGNhc2UgREVDT1JSX1BTOgorICAgICAgICAgIGVycm9yQ29kZSA9IERlY29yckZpbHRlckluaXRQUygKKyAgICAgICAgICAgICAgJmhEZWNvcnJEZWMtPkZpbHRlcltpXSwgaERlY29yckRlYy0+c3RhdGVCdWZmZXJDcGx4LAorICAgICAgICAgICAgICBoRGVjb3JyRGVjLT5kZWxheUJ1ZmZlckNwbHgsICZvZmZzZXRTdGF0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgJm9mZnNldERlbGF5QnVmZmVyLCBpLCByYiwgaERlY29yckRlYy0+UkVWX2RlbGF5W3JiXSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZXJyb3JDb2RlID0gRGVjb3JyRmlsdGVySW5pdCgKKyAgICAgICAgICAgICAgJmhEZWNvcnJEZWMtPkZpbHRlcltpXSwgaERlY29yckRlYy0+c3RhdGVCdWZmZXJDcGx4LAorICAgICAgICAgICAgICBoRGVjb3JyRGVjLT5kZWxheUJ1ZmZlckNwbHgsICZvZmZzZXRTdGF0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgJm9mZnNldERlbGF5QnVmZmVyLCBzZWVkLCByYiwgdXNlRnJhY3REZWxheSwKKyAgICAgICAgICAgICAgaERlY29yckRlYy0+UkVWX2RlbGF5W3JiXSwgUkVWX2ZpbHRlck9yZGVyW3JiXSwgZGVjb3JyVHlwZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaV9zdGFydCA9IGlfc3RvcDsKKyAgfSAvKiBsb29wIG92ZXIgcmV2ZXJiQmFuZHMgKi8KKworICBpZiAoIShvZmZzZXRTdGF0ZUJ1ZmZlciA8PSBoRGVjb3JyRGVjLT5MX3N0YXRlQnVmZmVyQ3BseCkgfHwKKyAgICAgICEob2Zmc2V0RGVsYXlCdWZmZXIgPD0gaERlY29yckRlYy0+TF9kZWxheUJ1ZmZlckNwbHgpKSB7CisgICAgcmV0dXJuIGVycm9yQ29kZSA9IDE7CisgIH0KKworICBpZiAoZHVja2VyVHlwZSA9PSBEVUNLRVJfQVVUT01BVElDKSB7CisgICAgLyogQ2hvb3NlIGNvcnJlY3QgZHVja2VyIHR5cGUgYWNjb3JkaW5nIHRvIHN0YW5kYXJkczogKi8KKyAgICBzd2l0Y2ggKGRlY29yclR5cGUpIHsKKyAgICAgIGNhc2UgREVDT1JSX1BTOgorICAgICAgICBoRGVjb3JyRGVjLT5kdWNrZXIuZHVja2VyVHlwZSA9IERVQ0tFUl9QUzsKKyAgICAgICAgaWYgKGlzTGVnYWN5UFMpIHsKKyAgICAgICAgICBuUGFyYW1CYW5kcyA9ICgyMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgblBhcmFtQmFuZHMgPSAoMjgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBERUNPUlJfVVNBQzoKKyAgICAgICAgaERlY29yckRlYy0+ZHVja2VyLmR1Y2tlclR5cGUgPSBEVUNLRVJfTVBTOworICAgICAgICBuUGFyYW1CYW5kcyA9ICgyOCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBERUNPUlJfTEQ6CisgICAgICAgIGhEZWNvcnJEZWMtPmR1Y2tlci5kdWNrZXJUeXBlID0gRFVDS0VSX01QUzsKKyAgICAgICAgblBhcmFtQmFuZHMgPSAoMjMpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIGVycm9yQ29kZSA9IER1Y2tlckluaXQoCisgICAgICAmaERlY29yckRlYy0+ZHVja2VyLCBoRGVjb3JyRGVjLT5udW1iaW5zLCBoRGVjb3JyRGVjLT5wYXJ0aWFsbHlDb21wbGV4LAorICAgICAgaERlY29yckRlYy0+ZHVja2VyLmR1Y2tlclR5cGUsIG5QYXJhbUJhbmRzLCBpbml0U3RhdGVzRmxhZyk7CisKKyAgcmV0dXJuIGVycm9yQ29kZTsKK30KKworSU5UIEZES2RlY29ycmVsYXRlQ2xvc2UoSEFORExFX0RFQ09SUl9ERUMgaERlY29yckRlYykgeworICBJTlQgZXJyID0gMDsKKworICBpZiAoaERlY29yckRlYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBoRGVjb3JyRGVjLT5zdGF0ZUJ1ZmZlckNwbHggPSBOVUxMOworICBoRGVjb3JyRGVjLT5MX3N0YXRlQnVmZmVyQ3BseCA9IDA7CisgIGhEZWNvcnJEZWMtPmRlbGF5QnVmZmVyQ3BseCA9IE5VTEw7CisgIGhEZWNvcnJEZWMtPkxfZGVsYXlCdWZmZXJDcGx4ID0gMDsKKworICByZXR1cm4gZXJyOworfQorCitMTktfU0VDVElPTl9DT0RFX0wxCitJTlQgRkRLZGVjb3JyZWxhdGVBcHBseShIQU5ETEVfREVDT1JSX0RFQyBoRGVjb3JyRGVjLCBGSVhQX0RCTCAqZGF0YVJlYWxJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpkYXRhSW1hZ0luLCBGSVhQX0RCTCAqZGF0YVJlYWxPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqZGF0YUltYWdPdXQsIGNvbnN0IElOVCBzdGFydEh5YkJhbmQpIHsKKyAgSEFORExFX0RFQ09SUl9ERUMgc2VsZiA9IGhEZWNvcnJEZWM7CisgIElOVCBlcnIgPSAwOworICBJTlQgcmIsIHN0b3AsIHN0YXJ0OworCisgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICBpbnQgbkh5YkJhbmRzID0gMDsKKyAgICAvKiBjb3B5IG5ldyBzYW1wbGVzICovCisgICAgbkh5YkJhbmRzID0gc2VsZi0+bnVtYmluczsKKworICAgIEZJWFBfREJMIGRpcmVjdE5yZ1soMjgpXTsKKworICAgIER1Y2tlckNhbGNFbmVyZ3koCisgICAgICAgICZzZWxmLT5kdWNrZXIsIGRhdGFSZWFsSW4sIGRhdGFJbWFnSW4sIGRpcmVjdE5yZywKKyAgICAgICAgc2VsZi0+ZHVja2VyLm1heFZhbERpcmVjdERhdGEsICYoc2VsZi0+ZHVja2VyLnNjYWxlRGlyZWN0TnJnKSwKKyAgICAgICAgKHNlbGYtPmR1Y2tlci5kdWNrZXJUeXBlID09IERVQ0tFUl9QUykgPyAxIDogMCwgc3RhcnRIeWJCYW5kKTsKKworICAgIC8qIGNvbXBsZXgtdmFsdWVkIGh5YnJpZCBiYW5kcyAqLworICAgIGZvciAoc3RvcCA9IDAsIHJiID0gMDsgcmIgPCAoNCk7IHJiKyspIHsKKyAgICAgIHN0YXJ0ID0gZk1heChzdG9wLCBzdGFydEh5YkJhbmQpOworICAgICAgc3RvcCA9IGZNaW4oc2VsZi0+UkVWX2JhbmRPZmZzZXRbcmJdLCAoVUNIQVIpbkh5YkJhbmRzKTsKKworICAgICAgaWYgKHN0YXJ0IDwgc3RvcCkgeworICAgICAgICBzd2l0Y2ggKGhEZWNvcnJEZWMtPlJFVl9maWx0VHlwZVtyYl0pIHsKKyAgICAgICAgICBjYXNlIERFTEFZOgorICAgICAgICAgICAgZXJyID0gRGVjb3JyRmlsdGVyQXBwbHlQQVNTKCZzZWxmLT5GaWx0ZXJbMF0sIGRhdGFSZWFsSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUltYWdJbiwgZGF0YVJlYWxPdXQsIGRhdGFJbWFnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBzdG9wLCBzZWxmLT5SRVZfZGVsYXlbcmJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnJldmVyYkJhbmREZWxheUJ1ZmZlckluZGV4W3JiXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIElOREVQX0NQTFhfUFM6CisgICAgICAgICAgICBlcnIgPSBEZWNvcnJGaWx0ZXJBcHBseUNQTFhfUFMoCisgICAgICAgICAgICAgICAgJnNlbGYtPkZpbHRlclswXSwgZGF0YVJlYWxJbiwgZGF0YUltYWdJbiwgZGF0YVJlYWxPdXQsCisgICAgICAgICAgICAgICAgZGF0YUltYWdPdXQsIHN0YXJ0LCBzdG9wLCBzZWxmLT5SRVZfZmlsdGVyT3JkZXJbcmJdLAorICAgICAgICAgICAgICAgIHNlbGYtPlJFVl9kZWxheVtyYl0sIHNlbGYtPnJldmVyYkJhbmREZWxheUJ1ZmZlckluZGV4W3JiXSwKKyAgICAgICAgICAgICAgICBzZWxmLT5zdGF0ZUJ1ZmZlck9mZnNldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIENPTU1PTl9SRUFMOgorICAgICAgICAgICAgZXJyID0gRGVjb3JyRmlsdGVyQXBwbHlSRUFMKAorICAgICAgICAgICAgICAgICZzZWxmLT5GaWx0ZXJbMF0sIGRhdGFSZWFsSW4sIGRhdGFJbWFnSW4sIGRhdGFSZWFsT3V0LAorICAgICAgICAgICAgICAgIGRhdGFJbWFnT3V0LCBzdGFydCwgc3RvcCwgc2VsZi0+UkVWX2ZpbHRlck9yZGVyW3JiXSwKKyAgICAgICAgICAgICAgICBzZWxmLT5SRVZfZGVsYXlbcmJdLCBzZWxmLT5yZXZlcmJCYW5kRGVsYXlCdWZmZXJJbmRleFtyYl0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGVyciA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgIH0gLyogaWYgc3RhcnQgPCBzdG9wICovCisgICAgfSAgIC8qIGxvb3Agb3ZlciByZXZlcmIgYmFuZHMgKi8KKworICAgIGZvciAocmIgPSAwOyByYiA8ICg0KTsgcmIrKykgeworICAgICAgc2VsZi0+cmV2ZXJiQmFuZERlbGF5QnVmZmVySW5kZXhbcmJdICs9IDI7CisgICAgICBpZiAoc2VsZi0+cmV2ZXJiQmFuZERlbGF5QnVmZmVySW5kZXhbcmJdID49IDIgKiBzZWxmLT5SRVZfZGVsYXlbcmJdKQorICAgICAgICBzZWxmLT5yZXZlcmJCYW5kRGVsYXlCdWZmZXJJbmRleFtyYl0gPSAwOworICAgIH0KKworICAgIHN3aXRjaCAoc2VsZi0+ZHVja2VyLmR1Y2tlclR5cGUpIHsKKyAgICAgIGNhc2UgRFVDS0VSX1BTOgorICAgICAgICBlcnIgPSBEdWNrZXJBcHBseVBTKCZzZWxmLT5kdWNrZXIsIGRpcmVjdE5yZywgZGF0YVJlYWxPdXQsIGRhdGFJbWFnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SHliQmFuZCk7CisgICAgICAgIGlmIChlcnIgIT0gMCkgZ290byBiYWlsOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGVyciA9IER1Y2tlckFwcGx5KCZzZWxmLT5kdWNrZXIsIGRpcmVjdE5yZywgZGF0YVJlYWxPdXQsIGRhdGFJbWFnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEh5YkJhbmQpOworICAgICAgICBpZiAoZXJyICE9IDApIGdvdG8gYmFpbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKK2JhaWw6CisgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9saWJGREsvc3JjL0ZES19oeWJyaWQuY3BwIGIvbGliRkRLL3NyYy9GREtfaHlicmlkLmNwcAppbmRleCAyMDgxNmY1Li5iNjYxZjgyIDEwMDY0NAotLS0gYS9saWJGREsvc3JjL0ZES19oeWJyaWQuY3BwCisrKyBiL2xpYkZESy9zcmMvRkRLX2h5YnJpZC5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjk5ICs5MCwzNDQgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKLSAgIEF1dGhvcihzKTogTWFya3VzIExvaHdhc3NlcgorICAgQXV0aG9yKHMpOiAgIE1hcmt1cyBMb2h3YXNzZXIKKwogICAgRGVzY3JpcHRpb246IEZESyBUb29scyBIeWJyaWQgRmlsdGVyYmFuawogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiRkRLX2h5YnJpZC5oIgogCi0KICNpbmNsdWRlICJmZnQuaCIKIAogLyotLS0tLS0tLS0tLS0tLS0gZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIEZGVF9JRFhfUihhKSAgKDIqYSkKLSNkZWZpbmUgRkZUX0lEWF9JKGEpICAoMiphKzEpCisjZGVmaW5lIEZGVF9JRFhfUihhKSAoMiAqIGEpCisjZGVmaW5lIEZGVF9JRFhfSShhKSAoMiAqIGEgKyAxKQogCi0jZGVmaW5lIEhZQl9DT0VGOF8wICAoIDAuMDA3NDYwODI5NDk4MTJmICkKLSNkZWZpbmUgSFlCX0NPRUY4XzEgICggMC4wMjI3MDQyMDk0OTgyNWYgKQotI2RlZmluZSBIWUJfQ09FRjhfMiAgKCAwLjA0NTQ2ODY1OTMwNDczZiApCi0jZGVmaW5lIEhZQl9DT0VGOF8zICAoIDAuMDcyNjYxMTM5Mjk1OTFmICkKLSNkZWZpbmUgSFlCX0NPRUY4XzQgICggMC4wOTg4NTEwODU3NTI2NGYgKQotI2RlZmluZSBIWUJfQ09FRjhfNSAgKCAwLjExNzkzNzEwNTY3MjE3ZiApCi0jZGVmaW5lIEhZQl9DT0VGOF82ICAoIDAuMTI1MDAwMDAwMDAwMDBmICkKLSNkZWZpbmUgSFlCX0NPRUY4XzcgICggSFlCX0NPRUY4XzUgKQotI2RlZmluZSBIWUJfQ09FRjhfOCAgKCBIWUJfQ09FRjhfNCApCi0jZGVmaW5lIEhZQl9DT0VGOF85ICAoIEhZQl9DT0VGOF8zICkKLSNkZWZpbmUgSFlCX0NPRUY4XzEwICggSFlCX0NPRUY4XzIgKQotI2RlZmluZSBIWUJfQ09FRjhfMTEgKCBIWUJfQ09FRjhfMSApCi0jZGVmaW5lIEhZQl9DT0VGOF8xMiAoIEhZQl9DT0VGOF8wICkKLQorI2RlZmluZSBIWUJfQ09FRjhfMCAoMC4wMDc0NjA4Mjk0OTgxMmYpCisjZGVmaW5lIEhZQl9DT0VGOF8xICgwLjAyMjcwNDIwOTQ5ODI1ZikKKyNkZWZpbmUgSFlCX0NPRUY4XzIgKDAuMDQ1NDY4NjU5MzA0NzNmKQorI2RlZmluZSBIWUJfQ09FRjhfMyAoMC4wNzI2NjExMzkyOTU5MWYpCisjZGVmaW5lIEhZQl9DT0VGOF80ICgwLjA5ODg1MTA4NTc1MjY0ZikKKyNkZWZpbmUgSFlCX0NPRUY4XzUgKDAuMTE3OTM3MTA1NjcyMTdmKQorI2RlZmluZSBIWUJfQ09FRjhfNiAoMC4xMjUwMDAwMDAwMDAwMGYpCisjZGVmaW5lIEhZQl9DT0VGOF83IChIWUJfQ09FRjhfNSkKKyNkZWZpbmUgSFlCX0NPRUY4XzggKEhZQl9DT0VGOF80KQorI2RlZmluZSBIWUJfQ09FRjhfOSAoSFlCX0NPRUY4XzMpCisjZGVmaW5lIEhZQl9DT0VGOF8xMCAoSFlCX0NPRUY4XzIpCisjZGVmaW5lIEhZQl9DT0VGOF8xMSAoSFlCX0NPRUY4XzEpCisjZGVmaW5lIEhZQl9DT0VGOF8xMiAoSFlCX0NPRUY4XzApCiAKIC8qLS0tLS0tLS0tLS0tLS0tIHN0cnVjdHVyZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYgZGVmaW5lZChBUkNIX1BSRUZFUl9NVUxUXzMyeDE2KQotICAjZGVmaW5lIEZJWFBfSFRCIEZJWFBfU0dMICAgICAgICAgICAgICAgLyogU0dMIGRhdGEgdHlwZS4gKi8KLSAgI2RlZmluZSBGSVhQX0hUUCBGSVhQX1NQSyAgICAgICAgICAgICAgIC8qIFBhY2tlZCBTR0wgZGF0YSB0eXBlLiAqLwotICAjZGVmaW5lIEhUQyhhKSAoRlhfREJMMkZYQ09OU1RfU0dMKGEpKSAgLyogQ2FzdCB0byBTR0wgKi8KLSAgI2RlZmluZSBGTDJGWENPTlNUX0hUQiBGTDJGWENPTlNUX1NHTAorI2RlZmluZSBGSVhQX0hUQiBGSVhQX1NHTCAgICAgICAgICAgICAgLyogU0dMIGRhdGEgdHlwZS4gKi8KKyNkZWZpbmUgRklYUF9IVFAgRklYUF9TUEsgICAgICAgICAgICAgIC8qIFBhY2tlZCBTR0wgZGF0YSB0eXBlLiAqLworI2RlZmluZSBIVEMoYSkgKEZYX0RCTDJGWENPTlNUX1NHTChhKSkgLyogQ2FzdCB0byBTR0wgKi8KKyNkZWZpbmUgRkwyRlhDT05TVF9IVEIgRkwyRlhDT05TVF9TR0wKICNlbHNlCi0gICNkZWZpbmUgRklYUF9IVEIgRklYUF9EQkwgICAgICAgICAgICAgICAvKiBTR0wgZGF0YSB0eXBlLiAqLwotICAjZGVmaW5lIEZJWFBfSFRQIEZJWFBfRFBLICAgICAgICAgICAgICAgLyogUGFja2VkIERCTCBkYXRhIHR5cGUuICovCi0gICNkZWZpbmUgSFRDKGEpICgoRklYUF9EQkwpKExPTkcpKGEpKSAgICAvKiBDYXN0IHRvIERCTCAqLwotICAjZGVmaW5lIEZMMkZYQ09OU1RfSFRCIEZMMkZYQ09OU1RfREJMCisjZGVmaW5lIEZJWFBfSFRCIEZJWFBfREJMICAgICAgICAgICAgLyogU0dMIGRhdGEgdHlwZS4gKi8KKyNkZWZpbmUgRklYUF9IVFAgRklYUF9EUEsgICAgICAgICAgICAvKiBQYWNrZWQgREJMIGRhdGEgdHlwZS4gKi8KKyNkZWZpbmUgSFRDKGEpICgoRklYUF9EQkwpKExPTkcpKGEpKSAvKiBDYXN0IHRvIERCTCAqLworI2RlZmluZSBGTDJGWENPTlNUX0hUQiBGTDJGWENPTlNUX0RCTAogI2VuZGlmCiAKLSNkZWZpbmUgSFRDUChyZWFsLGltYWcpIHsgeyBIVEMocmVhbCksIEhUQyhpbWFnKSB9IH0gLyogSG93IHRvIGFycmFuZ2UgdGhlIHBhY2tlZCB2YWx1ZXMuICovCisjZGVmaW5lIEhUQ1AocmVhbCwgaW1hZykgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgSFRDKHJlYWwpLCBIVEMoaW1hZykgfSBcCisgIH0gLyogSG93IHRvIGFycmFuZ2UgdGhlIHBhY2tlZCB2YWx1ZXMuICovCiAKLQotc3RydWN0IEZES19IWUJSSURfU0VUVVAKLXsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIG5yUW1mQmFuZHM7ICAgICAgICAgIC8qITwgTnVtYmVyIG9mIFFNRiBiYW5kcyB0byBiZSBjb252ZXJ0ZWQgdG8gaHlicmlkLiAqLwotICAgIFVDSEFSICAgICAgICAgICAgICAgbkh5YkJhbmRzWzNdOyAgICAgICAgLyohPCBOdW1iZXIgb2YgSHlicmlkIGJhbmRzIGdlbmVyYXRlZCBieSBuclFtZkJhbmRzLiAqLwotICAgIFNDSEFSICAgICAgICAgICAgICAga0h5YnJpZFszXTsgICAgICAgICAgLyohPCBGaWx0ZXIgY29uZmlndXJhdGlvbiBvZiBlYWNoIFFNRiBiYW5kLiAqLwotICAgIFVDSEFSICAgICAgICAgICAgICAgcHJvdG9MZW47ICAgICAgICAgICAgLyohPCBQcm90b3R5cGUgZmlsdGVyIGxlbmd0aC4gKi8KLSAgICBVQ0hBUiAgICAgICAgICAgICAgIGZpbHRlckRlbGF5OyAgICAgICAgIC8qITwgRGVsYXkgY2F1c2VkIGJ5IGh5YnJpZCBmaWx0ZXIuICovCi0gICAgY29uc3QgSU5UICAgICAgICAgICpwUmVhZElkeFRhYmxlOyAgICAgICAvKiE8IEhlbHBlciB0YWJsZSB0byBhY2Nlc3MgaW5wdXQgZGF0YSByaW5nYnVmZmVyLiAqLwotCitzdHJ1Y3QgRkRLX0hZQlJJRF9TRVRVUCB7CisgIFVDSEFSIG5yUW1mQmFuZHM7ICAgLyohPCBOdW1iZXIgb2YgUU1GIGJhbmRzIHRvIGJlIGNvbnZlcnRlZCB0byBoeWJyaWQuICovCisgIFVDSEFSIG5IeWJCYW5kc1szXTsgLyohPCBOdW1iZXIgb2YgSHlicmlkIGJhbmRzIGdlbmVyYXRlZCBieSBuclFtZkJhbmRzLiAqLworICBTQ0hBUiBrSHlicmlkWzNdOyAgIC8qITwgRmlsdGVyIGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBRTUYgYmFuZC4gKi8KKyAgVUNIQVIgcHJvdG9MZW47ICAgICAvKiE8IFByb3RvdHlwZSBmaWx0ZXIgbGVuZ3RoLiAqLworICBVQ0hBUiBmaWx0ZXJEZWxheTsgIC8qITwgRGVsYXkgY2F1c2VkIGJ5IGh5YnJpZCBmaWx0ZXIuICovCisgIGNvbnN0IElOVAorICAgICAgKnBSZWFkSWR4VGFibGU7IC8qITwgSGVscGVyIHRhYmxlIHRvIGFjY2VzcyBpbnB1dCBkYXRhIHJpbmdidWZmZXIuICovCiB9OwogCiAvKi0tLS0tLS0tLS0tLS0tLSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBjb25zdCBJTlQgcmluZ2J1ZmZJZHhUYWJbMioxM10gPSB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIgfTsKK3N0YXRpYyBjb25zdCBJTlQgcmluZ2J1ZmZJZHhUYWJbMiAqIDEzXSA9IHswLCAxLCAgMiwgIDMsICA0LCA1LCAgNiwgIDcsIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwgMTAsIDExLCAxMiwgMCwgMSwgIDIsICAzLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTJ9OwogCi1zdGF0aWMgY29uc3QgRkRLX0hZQlJJRF9TRVRVUCBzZXR1cF8zXzE2ID0geyAzLCB7IDgsIDQsIDR9LCB7ICA4LCAgNCwgIDR9LCAxMywgKDEzLTEpLzIsIHJpbmdidWZmSWR4VGFifTsKLXN0YXRpYyBjb25zdCBGREtfSFlCUklEX1NFVFVQIHNldHVwXzNfMTIgPSB7IDMsIHsgOCwgMiwgMn0sIHsgIDgsICAyLCAgMn0sIDEzLCAoMTMtMSkvMiwgcmluZ2J1ZmZJZHhUYWJ9Owotc3RhdGljIGNvbnN0IEZES19IWUJSSURfU0VUVVAgc2V0dXBfM18xMCA9IHsgMywgeyA2LCAyLCAyfSwgeyAtOCwgLTIsICAyfSwgMTMsICgxMy0xKS8yLCByaW5nYnVmZklkeFRhYn07Ci0KK3N0YXRpYyBjb25zdCBGREtfSFlCUklEX1NFVFVQIHNldHVwXzNfMTYgPSB7MywgIHs4LCA0LCA0fSwgICAgezgsIDQsIDR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMywgKDEzIC0gMSkgLyAyLCByaW5nYnVmZklkeFRhYn07CitzdGF0aWMgY29uc3QgRkRLX0hZQlJJRF9TRVRVUCBzZXR1cF8zXzEyID0gezMsICB7OCwgMiwgMn0sICAgIHs4LCAyLCAyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMsICgxMyAtIDEpIC8gMiwgcmluZ2J1ZmZJZHhUYWJ9Oworc3RhdGljIGNvbnN0IEZES19IWUJSSURfU0VUVVAgc2V0dXBfM18xMCA9IHszLCAgezYsIDIsIDJ9LCAgICB7LTgsIC0yLCAyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMsICgxMyAtIDEpIC8gMiwgcmluZ2J1ZmZJZHhUYWJ9OwogCiBzdGF0aWMgY29uc3QgRklYUF9IVFAgSHliRmlsdGVyQ29lZjhbXSA9IHsKLSAgSFRDUCgweDEwMDAwMDAwLCAweDAwMDAwMDAwKSwgSFRDUCgweDBkZjI2NDA3LCAweGZhMzkxODgyKSwgSFRDUCgweGZmNTMyMTA5LCAweDAwYWNkZWY3KSwgSFRDUCgweDA4ZjI2ZDM2LCAweGY3MGQ5MmNhKSwKLSAgSFRDUCgweGZlZTM0YjVmLCAweDAyYWY1NzBmKSwgSFRDUCgweDAzOGYyNzZlLCAweGY3Njg0NzkzKSwgSFRDUCgweDAwMDAwMDAwLCAweDA1ZDFlYWMyKSwgSFRDUCgweDAwMDAwMDAwLCAweDA1ZDFlYWMyKSwKLSAgSFRDUCgweDAzOGYyNzZlLCAweDA4OTdiODZkKSwgSFRDUCgweGZlZTM0YjVmLCAweGZkNTBhOGYxKSwgSFRDUCgweDA4ZjI2ZDM2LCAweDA4ZjI2ZDM2KSwgSFRDUCgweGZmNTMyMTA5LCAweGZmNTMyMTA5KSwKLSAgSFRDUCgweDBkZjI2NDA3LCAweDA1YzZlNzdlKQotfTsKKyAgICBIVENQKDB4MTAwMDAwMDAsIDB4MDAwMDAwMDApLCBIVENQKDB4MGRmMjY0MDcsIDB4ZmEzOTE4ODIpLAorICAgIEhUQ1AoMHhmZjUzMjEwOSwgMHgwMGFjZGVmNyksIEhUQ1AoMHgwOGYyNmQzNiwgMHhmNzBkOTJjYSksCisgICAgSFRDUCgweGZlZTM0YjVmLCAweDAyYWY1NzBmKSwgSFRDUCgweDAzOGYyNzZlLCAweGY3Njg0NzkzKSwKKyAgICBIVENQKDB4MDAwMDAwMDAsIDB4MDVkMWVhYzIpLCBIVENQKDB4MDAwMDAwMDAsIDB4MDVkMWVhYzIpLAorICAgIEhUQ1AoMHgwMzhmMjc2ZSwgMHgwODk3Yjg2ZCksIEhUQ1AoMHhmZWUzNGI1ZiwgMHhmZDUwYThmMSksCisgICAgSFRDUCgweDA4ZjI2ZDM2LCAweDA4ZjI2ZDM2KSwgSFRDUCgweGZmNTMyMTA5LCAweGZmNTMyMTA5KSwKKyAgICBIVENQKDB4MGRmMjY0MDcsIDB4MDVjNmU3N2UpfTsKIAotc3RhdGljIGNvbnN0IEZJWFBfSFRCIEh5YkZpbHRlckNvZWYyWzEzXSA9IHsKLSAgRkwyRlhDT05TVF9IVEIoIDAuMDAwMDAwMDAwMDAwMDBmKSwgRkwyRlhDT05TVF9IVEIoIDAuMDE4OTk0ODc1MjYwNDlmKSwgRkwyRlhDT05TVF9IVEIoIDAuMDAwMDAwMDAwMDAwMDBmKSwgRkwyRlhDT05TVF9IVEIoLTAuMDcyOTMxMzkxNjc1MzhmKSwgRkwyRlhDT05TVF9IVEIoIDAuMDAwMDAwMDAwMDAwMDBmKSwgRkwyRlhDT05TVF9IVEIoIDAuMzA1OTY2MzA1NDUxNjhmKSwKLSAgRkwyRlhDT05TVF9IVEIoIDAuNTAwMDAwMDAwMDAwMDBmKSwgRkwyRlhDT05TVF9IVEIoIDAuMzA1OTY2MzA1NDUxNjhmKSwgRkwyRlhDT05TVF9IVEIoIDAuMDAwMDAwMDAwMDAwMDBmKSwgRkwyRlhDT05TVF9IVEIoLTAuMDcyOTMxMzkxNjc1MzhmKSwgRkwyRlhDT05TVF9IVEIoIDAuMDAwMDAwMDAwMDAwMDBmKSwgRkwyRlhDT05TVF9IVEIoIDAuMDE4OTk0ODc1MjYwNDlmKSwKLSAgRkwyRlhDT05TVF9IVEIoIDAuMDAwMDAwMDAwMDAwMDBmKQotfTsKK3N0YXRpYyBjb25zdCBGSVhQX0hUQiBIeWJGaWx0ZXJDb2VmMlszXSA9IHtGTDJGWENPTlNUX0hUQigwLjAxODk5NDg3NTI2MDQ5ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9IVEIoLTAuMDcyOTMxMzkxNjc1MzhmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0hUQigwLjMwNTk2NjMwNTQ1MTY4Zil9OwogCi1zdGF0aWMgY29uc3QgRklYUF9IVEIgSHliRmlsdGVyQ29lZjRbMTNdID0gewotICBGTDJGWENPTlNUX0hUQigtMC4wMDMwNTE1MTkyNzMwNWYpLCBGTDJGWENPTlNUX0hUQigtMC4wMDc5NDg2MjMxNjIwM2YpLCBGTDJGWENPTlNUX0hUQiggICAgICAgICAgICAgIDAuMGYpLCBGTDJGWENPTlNUX0hUQiggMC4wNDMxODkyNDAzODc1NmYpLCBGTDJGWENPTlNUX0hUQiggMC4xMjU0MjQ0ODIxMDQ0NWYpLCBGTDJGWENPTlNUX0hUQiggMC4yMTIyNzgwNzA0OTE2MGYpLAotICBGTDJGWENPTlNUX0hUQiggICAgICAgICAgICAgMC4yNWYpLCBGTDJGWENPTlNUX0hUQiggMC4yMTIyNzgwNzA0OTE2MGYpLCBGTDJGWENPTlNUX0hUQiggMC4xMjU0MjQ0ODIxMDQ0NWYpLCBGTDJGWENPTlNUX0hUQiggMC4wNDMxODkyNDAzODc1NmYpLCBGTDJGWENPTlNUX0hUQiggICAgICAgICAgICAgIDAuMGYpLCBGTDJGWENPTlNUX0hUQigtMC4wMDc5NDg2MjMxNjIwM2YpLAotICBGTDJGWENPTlNUX0hUQigtMC4wMDMwNTE1MTkyNzMwNWYpCi19Oworc3RhdGljIGNvbnN0IEZJWFBfSFRCIEh5YkZpbHRlckNvZWY0WzEzXSA9IHtGTDJGWENPTlNUX0hUQigtMC4wMDMwNTE1MTkyNzMwNWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0hUQigtMC4wMDc5NDg2MjMxNjIwM2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0hUQigwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9IVEIoMC4wNDMxODkyNDAzODc1NmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0hUQigwLjEyNTQyNDQ4MjEwNDQ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfSFRCKDAuMjEyMjc4MDcwNDkxNjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9IVEIoMC4yNWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0hUQigwLjIxMjI3ODA3MDQ5MTYwZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfSFRCKDAuMTI1NDI0NDgyMTA0NDVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9IVEIoMC4wNDMxODkyNDAzODc1NmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0hUQigwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9IVEIoLTAuMDA3OTQ4NjIzMTYyMDNmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9IVEIoLTAuMDAzMDUxNTE5MjczMDVmKX07CiAKIC8qLS0tLS0tLS0tLS0tLS0tIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIElOVCBrQ2hhbm5lbEZpbHRlcmluZygKLSAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcFFtZlJlYWwsCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZJbWFnLAotICAgICAgICBjb25zdCBJTlQgKmNvbnN0ICAgICAgICAgICBwUmVhZElkeCwKLSAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgbUh5YnJpZFJlYWwsCi0gICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIG1IeWJyaWRJbWFnLAotICAgICAgICBjb25zdCBTQ0hBUiAgICAgICAgICAgICAgICBoeWJyaWRDb25maWcKLSAgICAgICAgKTsKLQorc3RhdGljIElOVCBrQ2hhbm5lbEZpbHRlcmluZyhjb25zdCBGSVhQX0RCTCAqY29uc3QgcFFtZlJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBwUW1mSW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpjb25zdCBwUmVhZElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNvbnN0IG1IeWJyaWRSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY29uc3QgbUh5YnJpZEltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDSEFSIGh5YnJpZENvbmZpZyk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tIGZ1bmN0aW9uIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0qLwogCi1JTlQgRkRLaHlicmlkQW5hbHlzaXNPcGVuKAotICAgICAgICBIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSICBoQW5hbHlzaXNIeWJGaWx0ZXIsCi0gICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIHBMRm1lbW9yeSwKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgTEZtZW1vcnlTaXplLAotICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBwSEZtZW1vcnksCi0gICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgIEhGbWVtb3J5U2l6ZQotICAgICAgICApCi17CitJTlQgRkRLaHlicmlkQW5hbHlzaXNPcGVuKEhBTkRMRV9GREtfQU5BX0hZQl9GSUxURVIgaEFuYWx5c2lzSHliRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY29uc3QgcExGbWVtb3J5LCBjb25zdCBVSU5UIExGbWVtb3J5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNvbnN0IHBIRm1lbW9yeSwgY29uc3QgVUlOVCBIRm1lbW9yeVNpemUpIHsKICAgSU5UIGVyciA9IDA7CiAKICAgLyogU2F2ZSBwb2ludGVyIHRvIGV4dGVybiBtZW1vcnkuICovCi0gIGhBbmFseXNpc0h5YkZpbHRlci0+cExGbWVtb3J5ICAgID0gcExGbWVtb3J5OworICBoQW5hbHlzaXNIeWJGaWx0ZXItPnBMRm1lbW9yeSA9IHBMRm1lbW9yeTsKICAgaEFuYWx5c2lzSHliRmlsdGVyLT5MRm1lbW9yeVNpemUgPSBMRm1lbW9yeVNpemU7CiAKLSAgaEFuYWx5c2lzSHliRmlsdGVyLT5wSEZtZW1vcnkgICAgPSBwSEZtZW1vcnk7CisgIGhBbmFseXNpc0h5YkZpbHRlci0+cEhGbWVtb3J5ID0gcEhGbWVtb3J5OwogICBoQW5hbHlzaXNIeWJGaWx0ZXItPkhGbWVtb3J5U2l6ZSA9IEhGbWVtb3J5U2l6ZTsKIAogICByZXR1cm4gZXJyOwogfQogCi1JTlQgRkRLaHlicmlkQW5hbHlzaXNJbml0KAotICAgICAgICBIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSICBoQW5hbHlzaXNIeWJGaWx0ZXIsCi0gICAgICAgIGNvbnN0IEZES19IWUJSSURfTU9ERSAgICAgIG1vZGUsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIHFtZkJhbmRzLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBjcGx4QmFuZHMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIGluaXRTdGF0ZXNGbGFnCi0gICAgICAgICkKLXsKLSAgICBpbnQgazsKLSAgICBJTlQgZXJyID0gMDsKLSAgICBGSVhQX0RCTCAqcE1lbSA9IE5VTEw7Ci0gICAgSEFORExFX0ZES19IWUJSSURfU0VUVVAgc2V0dXAgPSBOVUxMOworSU5UIEZES2h5YnJpZEFuYWx5c2lzSW5pdChIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSIGhBbmFseXNpc0h5YkZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkRLX0hZQlJJRF9NT0RFIG1vZGUsIGNvbnN0IElOVCBxbWZCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGNwbHhCYW5kcywgY29uc3QgSU5UIGluaXRTdGF0ZXNGbGFnKSB7CisgIGludCBrOworICBJTlQgZXJyID0gMDsKKyAgRklYUF9EQkwgKnBNZW0gPSBOVUxMOworICBIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUCBzZXR1cCA9IE5VTEw7CiAKLSAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICAgIGNhc2UgVEhSRUVfVE9fVEVOOiAgICAgc2V0dXAgPSAoSEFORExFX0ZES19IWUJSSURfU0VUVVApJnNldHVwXzNfMTA7IGJyZWFrOwotICAgICAgY2FzZSBUSFJFRV9UT19UV0VMVkU6ICBzZXR1cCA9IChIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUCkmc2V0dXBfM18xMjsgYnJlYWs7Ci0gICAgICBjYXNlIFRIUkVFX1RPX1NJWFRFRU46IHNldHVwID0gKEhBTkRMRV9GREtfSFlCUklEX1NFVFVQKSZzZXR1cF8zXzE2OyBicmVhazsKLSAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgZXJyID0gLTE7IGdvdG8gYmFpbDsKLSAgICB9CisgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgVEhSRUVfVE9fVEVOOgorICAgICAgc2V0dXAgPSAmc2V0dXBfM18xMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEhSRUVfVE9fVFdFTFZFOgorICAgICAgc2V0dXAgPSAmc2V0dXBfM18xMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEhSRUVfVE9fU0lYVEVFTjoKKyAgICAgIHNldHVwID0gJnNldHVwXzNfMTY7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZXJyID0gLTE7CisgICAgICBnb3RvIGJhaWw7CisgIH0KIAotICAgIC8qIEluaXRpYWxpemUgaGFuZGxlLiAqLwotICAgIGhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwICAgICAgPSBzZXR1cDsKLSAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGcG9zID0gc2V0dXAtPnByb3RvTGVuLTE7CisgIC8qIEluaXRpYWxpemUgaGFuZGxlLiAqLworICBoQW5hbHlzaXNIeWJGaWx0ZXItPnBTZXR1cCA9IHNldHVwOworICBpZiAoaW5pdFN0YXRlc0ZsYWcpIHsKKyAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGcG9zID0gc2V0dXAtPnByb3RvTGVuIC0gMTsKICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGcG9zID0gMDsKLSAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPm5yQmFuZHMgICAgID0gcW1mQmFuZHM7Ci0gICAgaEFuYWx5c2lzSHliRmlsdGVyLT5jcGx4QmFuZHMgICA9IGNwbHhCYW5kczsKLSAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmhmTW9kZSAgICAgID0gMDsKKyAgfQorICBoQW5hbHlzaXNIeWJGaWx0ZXItPm5yQmFuZHMgPSBxbWZCYW5kczsKKyAgaEFuYWx5c2lzSHliRmlsdGVyLT5jcGx4QmFuZHMgPSBjcGx4QmFuZHM7CisgIGhBbmFseXNpc0h5YkZpbHRlci0+aGZNb2RlID0gMDsKIAotICAgIC8qIENoZWNrIGF2YWlsYWJsZSBtZW1vcnkuICovCi0gICAgaWYgKCAoKDIqc2V0dXAtPm5yUW1mQmFuZHMqc2V0dXAtPnByb3RvTGVuKnNpemVvZihGSVhQX0RCTCkpID4gaEFuYWx5c2lzSHliRmlsdGVyLT5MRm1lbW9yeVNpemUpCi0gICAgICB8fCAoKHNldHVwLT5maWx0ZXJEZWxheSooKHFtZkJhbmRzLXNldHVwLT5uclFtZkJhbmRzKSsoY3BseEJhbmRzLXNldHVwLT5uclFtZkJhbmRzKSkqc2l6ZW9mKEZJWFBfREJMKSkgPiBoQW5hbHlzaXNIeWJGaWx0ZXItPkhGbWVtb3J5U2l6ZSkgKQotICAgIHsKLSAgICAgIGVyciA9IC0yOworICAvKiBDaGVjayBhdmFpbGFibGUgbWVtb3J5LiAqLworICBpZiAoKCgyICogc2V0dXAtPm5yUW1mQmFuZHMgKiBzZXR1cC0+cHJvdG9MZW4gKiBzaXplb2YoRklYUF9EQkwpKSA+CisgICAgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5MRm1lbW9yeVNpemUpKSB7CisgICAgZXJyID0gLTI7CisgICAgZ290byBiYWlsOworICB9CisgIGlmIChoQW5hbHlzaXNIeWJGaWx0ZXItPkhGbWVtb3J5U2l6ZSAhPSAwKSB7CisgICAgaWYgKCgoc2V0dXAtPmZpbHRlckRlbGF5ICoKKyAgICAgICAgICAoKHFtZkJhbmRzIC0gc2V0dXAtPm5yUW1mQmFuZHMpICsgKGNwbHhCYW5kcyAtIHNldHVwLT5uclFtZkJhbmRzKSkgKgorICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkpID4gaEFuYWx5c2lzSHliRmlsdGVyLT5IRm1lbW9yeVNpemUpKSB7CisgICAgICBlcnIgPSAtMzsKICAgICAgIGdvdG8gYmFpbDsKICAgICB9CisgIH0KIAotICAgIC8qIERpc3RyaWJ1dCBMRiBtZW1vcnkuICovCi0gICAgcE1lbSA9IGhBbmFseXNpc0h5YkZpbHRlci0+cExGbWVtb3J5OwotICAgIGZvciAoaz0wOyBrPHNldHVwLT5uclFtZkJhbmRzOyBrKyspIHsKLSAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZSZWFsW2tdID0gcE1lbTsgcE1lbSArPSBzZXR1cC0+cHJvdG9MZW47Ci0gICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGSW1hZ1trXSA9IHBNZW07IHBNZW0gKz0gc2V0dXAtPnByb3RvTGVuOwotICAgIH0KKyAgLyogRGlzdHJpYnV0ZSBMRiBtZW1vcnkuICovCisgIHBNZW0gPSBoQW5hbHlzaXNIeWJGaWx0ZXItPnBMRm1lbW9yeTsKKyAgZm9yIChrID0gMDsgayA8IHNldHVwLT5uclFtZkJhbmRzOyBrKyspIHsKKyAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGUmVhbFtrXSA9IHBNZW07CisgICAgcE1lbSArPSBzZXR1cC0+cHJvdG9MZW47CisgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRkltYWdba10gPSBwTWVtOworICAgIHBNZW0gKz0gc2V0dXAtPnByb3RvTGVuOworICB9CiAKLSAgICAvKiBEaXN0cmlidXQgSEYgbWVtb3J5LiAqLworICAvKiBEaXN0cmlidXRlIEhGIG1lbW9yeS4gKi8KKyAgaWYgKGhBbmFseXNpc0h5YkZpbHRlci0+SEZtZW1vcnlTaXplICE9IDApIHsKICAgICBwTWVtID0gaEFuYWx5c2lzSHliRmlsdGVyLT5wSEZtZW1vcnk7Ci0gICAgZm9yIChrPTA7IGs8c2V0dXAtPmZpbHRlckRlbGF5OyBrKyspIHsKLSAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZSZWFsW2tdID0gcE1lbTsgcE1lbSArPSAocW1mQmFuZHMtc2V0dXAtPm5yUW1mQmFuZHMpOwotICAgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRkltYWdba10gPSBwTWVtOyBwTWVtICs9IChjcGx4QmFuZHMtc2V0dXAtPm5yUW1mQmFuZHMpOworICAgIGZvciAoayA9IDA7IGsgPCBzZXR1cC0+ZmlsdGVyRGVsYXk7IGsrKykgeworICAgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRlJlYWxba10gPSBwTWVtOworICAgICAgcE1lbSArPSAocW1mQmFuZHMgLSBzZXR1cC0+bnJRbWZCYW5kcyk7CisgICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGSW1hZ1trXSA9IHBNZW07CisgICAgICBwTWVtICs9IChjcGx4QmFuZHMgLSBzZXR1cC0+bnJRbWZCYW5kcyk7CisgICAgfQorICB9CisKKyAgaWYgKGluaXRTdGF0ZXNGbGFnKSB7CisgICAgLyogQ2xlYXIgTEYgYnVmZmVyICovCisgICAgZm9yIChrID0gMDsgayA8IHNldHVwLT5uclFtZkJhbmRzOyBrKyspIHsKKyAgICAgIEZES21lbWNsZWFyKGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZSZWFsW2tdLAorICAgICAgICAgICAgICAgICAgc2V0dXAtPnByb3RvTGVuICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBGREttZW1jbGVhcihoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGSW1hZ1trXSwKKyAgICAgICAgICAgICAgICAgIHNldHVwLT5wcm90b0xlbiAqIHNpemVvZihGSVhQX0RCTCkpOwogICAgIH0KIAotICAgIGlmIChpbml0U3RhdGVzRmxhZykgewotICAgICAgLyogQ2xlYXIgTEYgYnVmZmVyICovCi0gICAgICBmb3IgKGs9MDsgazxzZXR1cC0+bnJRbWZCYW5kczsgaysrKSB7Ci0gICAgICAgIEZES21lbWNsZWFyKGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZSZWFsW2tdLCBzZXR1cC0+cHJvdG9MZW4qc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgICAgIEZES21lbWNsZWFyKGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZJbWFnW2tdLCBzZXR1cC0+cHJvdG9MZW4qc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgICB9Ci0KKyAgICBpZiAoaEFuYWx5c2lzSHliRmlsdGVyLT5IRm1lbW9yeVNpemUgIT0gMCkgewogICAgICAgaWYgKHFtZkJhbmRzID4gc2V0dXAtPm5yUW1mQmFuZHMpIHsKLSAgICAgIC8qIENsZWFyIEhGIGJ1ZmZlciAqLwotICAgICAgZm9yIChrPTA7IGs8c2V0dXAtPmZpbHRlckRlbGF5OyBrKyspIHsKLSAgICAgICAgRkRLbWVtY2xlYXIoaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRlJlYWxba10sIChxbWZCYW5kcy1zZXR1cC0+bnJRbWZCYW5kcykqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgICAgIEZES21lbWNsZWFyKGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZJbWFnW2tdLCAoY3BseEJhbmRzLXNldHVwLT5uclFtZkJhbmRzKSpzaXplb2YoRklYUF9EQkwpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgfQotCi1iYWlsOgotICAgIHJldHVybiBlcnI7Ci19Ci0KLUlOVCBGREtoeWJyaWRBbmFseXNpc1NjYWxlU3RhdGVzKAotICAgICAgICBIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSICBoQW5hbHlzaXNIeWJGaWx0ZXIsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIHNjYWxpbmdWYWx1ZQotICAgICAgICApCi17Ci0gICAgSU5UIGVyciA9IDA7Ci0KLSAgICBpZiAoaEFuYWx5c2lzSHliRmlsdGVyPT1OVUxMKSB7Ci0gICAgICBlcnIgPSAxOyAvKiBpbnZhbGlkIGhhbmRsZSAqLwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGludCBrOwotICAgICAgSEFORExFX0ZES19IWUJSSURfU0VUVVAgc2V0dXAgPSBoQW5hbHlzaXNIeWJGaWx0ZXItPnBTZXR1cDsKLQotICAgICAgLyogU2NhbGUgTEYgYnVmZmVyICovCi0gICAgICBmb3IgKGs9MDsgazxzZXR1cC0+bnJRbWZCYW5kczsgaysrKSB7Ci0gICAgICAgIHNjYWxlVmFsdWVzKGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZSZWFsW2tdLCBzZXR1cC0+cHJvdG9MZW4sIHNjYWxpbmdWYWx1ZSk7Ci0gICAgICAgIHNjYWxlVmFsdWVzKGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZJbWFnW2tdLCBzZXR1cC0+cHJvdG9MZW4sIHNjYWxpbmdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaEFuYWx5c2lzSHliRmlsdGVyLT5uckJhbmRzID4gc2V0dXAtPm5yUW1mQmFuZHMpIHsKLSAgICAgICAgLyogU2NhbGUgSEYgYnVmZmVyICovCi0gICAgICAgIGZvciAoaz0wOyBrPHNldHVwLT5maWx0ZXJEZWxheTsgaysrKSB7Ci0gICAgICAgICAgc2NhbGVWYWx1ZXMoaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRlJlYWxba10sIChoQW5hbHlzaXNIeWJGaWx0ZXItPm5yQmFuZHMtc2V0dXAtPm5yUW1mQmFuZHMpLCBzY2FsaW5nVmFsdWUpOwotICAgICAgICAgIHNjYWxlVmFsdWVzKGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZJbWFnW2tdLCAoaEFuYWx5c2lzSHliRmlsdGVyLT5jcGx4QmFuZHMtc2V0dXAtPm5yUW1mQmFuZHMpLCBzY2FsaW5nVmFsdWUpOworICAgICAgICAvKiBDbGVhciBIRiBidWZmZXIgKi8KKyAgICAgICAgZm9yIChrID0gMDsgayA8IHNldHVwLT5maWx0ZXJEZWxheTsgaysrKSB7CisgICAgICAgICAgRkRLbWVtY2xlYXIoaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRlJlYWxba10sCisgICAgICAgICAgICAgICAgICAgICAgKHFtZkJhbmRzIC0gc2V0dXAtPm5yUW1mQmFuZHMpICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgRkRLbWVtY2xlYXIoaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRkltYWdba10sCisgICAgICAgICAgICAgICAgICAgICAgKGNwbHhCYW5kcyAtIHNldHVwLT5uclFtZkJhbmRzKSAqIHNpemVvZihGSVhQX0RCTCkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBlcnI7CisgIH0KKworYmFpbDoKKyAgcmV0dXJuIGVycjsKIH0KIAotSU5UIEZES2h5YnJpZEFuYWx5c2lzQXBwbHkoCi0gICAgICAgIEhBTkRMRV9GREtfQU5BX0hZQl9GSUxURVIgIGhBbmFseXNpc0h5YkZpbHRlciwKLSAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcFFtZlJlYWwsCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZJbWFnLAotICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBwSHlicmlkUmVhbCwKLSAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcEh5YnJpZEltYWcpCi17Ci0gICAgaW50IGssIGh5Yk9mZnNldCA9IDA7Ci0gICAgSU5UIGVyciA9IDA7Ci0gICAgY29uc3QgaW50IG5yUW1mQmFuZHNMRiA9IGhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwLT5uclFtZkJhbmRzOyAvKiBudW1iZXIgb2YgUU1GIGJhbmRzIHRvIGJlIGNvbnZlcnRlZCB0byBoeWJyaWQgKi8KK0lOVCBGREtoeWJyaWRBbmFseXNpc1NjYWxlU3RhdGVzKEhBTkRMRV9GREtfQU5BX0hZQl9GSUxURVIgaEFuYWx5c2lzSHliRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNjYWxpbmdWYWx1ZSkgeworICBJTlQgZXJyID0gMDsKIAotICAgIGNvbnN0IGludCB3cml0SW5kZXggPSBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGcG9zOwotICAgIGludCByZWFkSW5kZXggPSBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGcG9zOworICBpZiAoaEFuYWx5c2lzSHliRmlsdGVyID09IE5VTEwpIHsKKyAgICBlcnIgPSAxOyAvKiBpbnZhbGlkIGhhbmRsZSAqLworICB9IGVsc2UgeworICAgIGludCBrOworICAgIEhBTkRMRV9GREtfSFlCUklEX1NFVFVQIHNldHVwID0gaEFuYWx5c2lzSHliRmlsdGVyLT5wU2V0dXA7CiAKLSAgICBpZiAoKytyZWFkSW5kZXg+PWhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwLT5wcm90b0xlbikgcmVhZEluZGV4ID0gMDsKLSAgICBjb25zdCBJTlQqIHBCdWZmZXJMRnJlYWRJZHggPSAmaEFuYWx5c2lzSHliRmlsdGVyLT5wU2V0dXAtPnBSZWFkSWR4VGFibGVbcmVhZEluZGV4XTsKKyAgICAvKiBTY2FsZSBMRiBidWZmZXIgKi8KKyAgICBmb3IgKGsgPSAwOyBrIDwgc2V0dXAtPm5yUW1mQmFuZHM7IGsrKykgeworICAgICAgc2NhbGVWYWx1ZXMoaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRlJlYWxba10sIHNldHVwLT5wcm90b0xlbiwKKyAgICAgICAgICAgICAgICAgIHNjYWxpbmdWYWx1ZSk7CisgICAgICBzY2FsZVZhbHVlcyhoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGSW1hZ1trXSwgc2V0dXAtPnByb3RvTGVuLAorICAgICAgICAgICAgICAgICAgc2NhbGluZ1ZhbHVlKTsKKyAgICB9CisgICAgaWYgKGhBbmFseXNpc0h5YkZpbHRlci0+bnJCYW5kcyA+IHNldHVwLT5uclFtZkJhbmRzKSB7CisgICAgICAvKiBTY2FsZSBIRiBidWZmZXIgKi8KKyAgICAgIGZvciAoayA9IDA7IGsgPCBzZXR1cC0+ZmlsdGVyRGVsYXk7IGsrKykgeworICAgICAgICBzY2FsZVZhbHVlcyhoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGUmVhbFtrXSwKKyAgICAgICAgICAgICAgICAgICAgKGhBbmFseXNpc0h5YkZpbHRlci0+bnJCYW5kcyAtIHNldHVwLT5uclFtZkJhbmRzKSwKKyAgICAgICAgICAgICAgICAgICAgc2NhbGluZ1ZhbHVlKTsKKyAgICAgICAgc2NhbGVWYWx1ZXMoaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRkltYWdba10sCisgICAgICAgICAgICAgICAgICAgIChoQW5hbHlzaXNIeWJGaWx0ZXItPmNwbHhCYW5kcyAtIHNldHVwLT5uclFtZkJhbmRzKSwKKyAgICAgICAgICAgICAgICAgICAgc2NhbGluZ1ZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGVycjsKK30KIAotICAgIC8qCi0gICAgICogTEYgYnVmZmVyLgotICAgICAqLwotICAgIGZvciAoaz0wOyBrPG5yUW1mQmFuZHNMRjsgaysrKSB7Ci0gICAgICAgIC8qIE5ldyBpbnB1dCBzYW1wbGUuICovCi0gICAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZSZWFsW2tdW3dyaXRJbmRleF0gPSBwUW1mUmVhbFtrXTsKLSAgICAgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRkltYWdba11bd3JpdEluZGV4XSA9IHBRbWZJbWFnW2tdOworSU5UIEZES2h5YnJpZEFuYWx5c2lzQXBwbHkoSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiBoQW5hbHlzaXNIeWJGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgcFFtZlJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgcFFtZkltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY29uc3QgcEh5YnJpZFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY29uc3QgcEh5YnJpZEltYWcpIHsKKyAgaW50IGssIGh5Yk9mZnNldCA9IDA7CisgIElOVCBlcnIgPSAwOworICBjb25zdCBpbnQgbnJRbWZCYW5kc0xGID0KKyAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwCisgICAgICAgICAgLT5uclFtZkJhbmRzOyAvKiBudW1iZXIgb2YgUU1GIGJhbmRzIHRvIGJlIGNvbnZlcnRlZCB0byBoeWJyaWQgKi8KKworICBjb25zdCBpbnQgd3JpdEluZGV4ID0gaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRnBvczsKKyAgaW50IHJlYWRJbmRleCA9IGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZwb3M7CisKKyAgaWYgKCsrcmVhZEluZGV4ID49IGhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwLT5wcm90b0xlbikgcmVhZEluZGV4ID0gMDsKKyAgY29uc3QgSU5UICpwQnVmZmVyTEZyZWFkSWR4ID0KKyAgICAgICZoQW5hbHlzaXNIeWJGaWx0ZXItPnBTZXR1cC0+cFJlYWRJZHhUYWJsZVtyZWFkSW5kZXhdOworCisgIC8qCisgICAqIExGIGJ1ZmZlci4KKyAgICovCisgIGZvciAoayA9IDA7IGsgPCBuclFtZkJhbmRzTEY7IGsrKykgeworICAgIC8qIE5ldyBpbnB1dCBzYW1wbGUuICovCisgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRlJlYWxba11bd3JpdEluZGV4XSA9IHBRbWZSZWFsW2tdOworICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZJbWFnW2tdW3dyaXRJbmRleF0gPSBwUW1mSW1hZ1trXTsKIAogICAgIC8qIFBlcmZvcm0gaHlicmlkIGZpbHRlcmluZy4gKi8KLSAgICAgICAga0NoYW5uZWxGaWx0ZXJpbmcoCi0gICAgICAgICAgICAgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRlJlYWxba10sCi0gICAgICAgICAgICAgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRkltYWdba10sCi0gICAgICAgICAgICAgICAgcEJ1ZmZlckxGcmVhZElkeCwKLSAgICAgICAgICAgICAgICBwSHlicmlkUmVhbCtoeWJPZmZzZXQsCi0gICAgICAgICAgICAgICAgcEh5YnJpZEltYWcraHliT2Zmc2V0LAotICAgICAgICAgICAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwLT5rSHlicmlkW2tdKTsKKyAgICBlcnIgfD0KKyAgICAgICAga0NoYW5uZWxGaWx0ZXJpbmcoaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJMRlJlYWxba10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZJbWFnW2tdLCBwQnVmZmVyTEZyZWFkSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwSHlicmlkUmVhbCArIGh5Yk9mZnNldCwgcEh5YnJpZEltYWcgKyBoeWJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwLT5rSHlicmlkW2tdKTsKIAotICAgICAgICBoeWJPZmZzZXQgKz0gaEFuYWx5c2lzSHliRmlsdGVyLT5wU2V0dXAtPm5IeWJCYW5kc1trXTsKLSAgICB9CisgICAgaHliT2Zmc2V0ICs9IGhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwLT5uSHliQmFuZHNba107CisgIH0KIAotICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVyTEZwb3MgPSByZWFkSW5kZXg7IC8qIEluZGV4IHdoZXJlIHRvIHdyaXRlIG5leHQgaW5wdXQgc2FtcGxlLiAqLworICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckxGcG9zID0KKyAgICAgIHJlYWRJbmRleDsgLyogSW5kZXggd2hlcmUgdG8gd3JpdGUgbmV4dCBpbnB1dCBzYW1wbGUuICovCiAKLSAgICBpZiAoaEFuYWx5c2lzSHliRmlsdGVyLT5uckJhbmRzID4gbnJRbWZCYW5kc0xGKSB7CisgIGlmIChoQW5hbHlzaXNIeWJGaWx0ZXItPm5yQmFuZHMgPiBuclFtZkJhbmRzTEYpIHsKICAgICAvKgogICAgICAqIEhGIGJ1ZmZlci4KICAgICAgKi8KLSAgICBpZiAoaEFuYWx5c2lzSHliRmlsdGVyLT5oZk1vZGUhPTApIHsKLSAgICAgICAgLyogSEYgZGVsYXkgY29tcGVuc2F0aW9uIHdhcyBhcHBsaWVkIG91dHNpZGUuICovCi0gICAgICAgIEZES21lbWNweShwSHlicmlkUmVhbCtoeWJPZmZzZXQsICZwUW1mUmVhbFtuclFtZkJhbmRzTEZdLCAoaEFuYWx5c2lzSHliRmlsdGVyLT5uckJhbmRzLW5yUW1mQmFuZHNMRikqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgICAgIEZES21lbWNweShwSHlicmlkSW1hZytoeWJPZmZzZXQsICZwUW1mSW1hZ1tuclFtZkJhbmRzTEZdLCAoaEFuYWx5c2lzSHliRmlsdGVyLT5jcGx4QmFuZHMtbnJRbWZCYW5kc0xGKSpzaXplb2YoRklYUF9EQkwpKTsKKyAgICBpZiAoaEFuYWx5c2lzSHliRmlsdGVyLT5oZk1vZGUgIT0gMCkgeworICAgICAgLyogSEYgZGVsYXkgY29tcGVuc2F0aW9uIHdhcyBhcHBsaWVkIG91dHNpZGUuICovCisgICAgICBGREttZW1jcHkoCisgICAgICAgICAgcEh5YnJpZFJlYWwgKyBoeWJPZmZzZXQsICZwUW1mUmVhbFtuclFtZkJhbmRzTEZdLAorICAgICAgICAgIChoQW5hbHlzaXNIeWJGaWx0ZXItPm5yQmFuZHMgLSBuclFtZkJhbmRzTEYpICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBGREttZW1jcHkoCisgICAgICAgICAgcEh5YnJpZEltYWcgKyBoeWJPZmZzZXQsICZwUW1mSW1hZ1tuclFtZkJhbmRzTEZdLAorICAgICAgICAgIChoQW5hbHlzaXNIeWJGaWx0ZXItPmNwbHhCYW5kcyAtIG5yUW1mQmFuZHNMRikgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICB9IGVsc2UgeworICAgICAgRkRLX0FTU0VSVChoQW5hbHlzaXNIeWJGaWx0ZXItPkhGbWVtb3J5U2l6ZSAhPSAwKTsKKyAgICAgIC8qIEhGIGRlbGF5IGNvbXBlbnNhdGlvbiwgZmlsdGVybGVuZ3RoLzIuICovCisgICAgICBGREttZW1jcHkoCisgICAgICAgICAgcEh5YnJpZFJlYWwgKyBoeWJPZmZzZXQsCisgICAgICAgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRlJlYWxbaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRnBvc10sCisgICAgICAgICAgKGhBbmFseXNpc0h5YkZpbHRlci0+bnJCYW5kcyAtIG5yUW1mQmFuZHNMRikgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIEZES21lbWNweSgKKyAgICAgICAgICBwSHlicmlkSW1hZyArIGh5Yk9mZnNldCwKKyAgICAgICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGSW1hZ1toQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGcG9zXSwKKyAgICAgICAgICAoaEFuYWx5c2lzSHliRmlsdGVyLT5jcGx4QmFuZHMgLSBuclFtZkJhbmRzTEYpICogc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgICAgIEZES21lbWNweSgKKyAgICAgICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGUmVhbFtoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGcG9zXSwKKyAgICAgICAgICAmcFFtZlJlYWxbbnJRbWZCYW5kc0xGXSwKKyAgICAgICAgICAoaEFuYWx5c2lzSHliRmlsdGVyLT5uckJhbmRzIC0gbnJRbWZCYW5kc0xGKSAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgRkRLbWVtY3B5KAorICAgICAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZJbWFnW2hBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZwb3NdLAorICAgICAgICAgICZwUW1mSW1hZ1tuclFtZkJhbmRzTEZdLAorICAgICAgICAgIChoQW5hbHlzaXNIeWJGaWx0ZXItPmNwbHhCYW5kcyAtIG5yUW1mQmFuZHNMRikgKiBzaXplb2YoRklYUF9EQkwpKTsKKworICAgICAgaWYgKCsraEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRnBvcyA+PQorICAgICAgICAgIGhBbmFseXNpc0h5YkZpbHRlci0+cFNldHVwLT5maWx0ZXJEZWxheSkKKyAgICAgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRnBvcyA9IDA7CiAgICAgfQotICAgIGVsc2UgewotICAgICAgICAvKiBIRiBkZWxheSBjb21wZW5zYXRpb24sIGZpbHRlcmxlbmd0aC8yLiAqLwotICAgIEZES21lbWNweShwSHlicmlkUmVhbCtoeWJPZmZzZXQsIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZSZWFsW2hBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZwb3NdLCAoaEFuYWx5c2lzSHliRmlsdGVyLT5uckJhbmRzLW5yUW1mQmFuZHNMRikqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgRkRLbWVtY3B5KHBIeWJyaWRJbWFnK2h5Yk9mZnNldCwgaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRkltYWdbaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRnBvc10sIChoQW5hbHlzaXNIeWJGaWx0ZXItPmNwbHhCYW5kcy1uclFtZkJhbmRzTEYpKnNpemVvZihGSVhQX0RCTCkpOworICB9IC8qIHByb2Nlc3MgSEYgcGFydCovCiAKLSAgICBGREttZW1jcHkoaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRlJlYWxbaEFuYWx5c2lzSHliRmlsdGVyLT5idWZmZXJIRnBvc10sICZwUW1mUmVhbFtuclFtZkJhbmRzTEZdLCAoaEFuYWx5c2lzSHliRmlsdGVyLT5uckJhbmRzLW5yUW1mQmFuZHNMRikqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgRkRLbWVtY3B5KGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZJbWFnW2hBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZwb3NdLCAmcFFtZkltYWdbbnJRbWZCYW5kc0xGXSwgKGhBbmFseXNpc0h5YkZpbHRlci0+Y3BseEJhbmRzLW5yUW1mQmFuZHNMRikqc2l6ZW9mKEZJWFBfREJMKSk7Ci0KLSAgICBpZiAoKytoQW5hbHlzaXNIeWJGaWx0ZXItPmJ1ZmZlckhGcG9zPj1oQW5hbHlzaXNIeWJGaWx0ZXItPnBTZXR1cC0+ZmlsdGVyRGVsYXkpIGhBbmFseXNpc0h5YkZpbHRlci0+YnVmZmVySEZwb3MgPSAwOwotICAgIH0KLSAgICB9IC8qIHByb2Nlc3MgSEYgcGFydCovCi0KLSAgICByZXR1cm4gZXJyOworICByZXR1cm4gZXJyOwogfQogCi1JTlQgRkRLaHlicmlkQW5hbHlzaXNDbG9zZSgKLSAgICAgICAgSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiBoQW5hbHlzaXNIeWJGaWx0ZXIKLSAgICAgICAgKQoteworSU5UIEZES2h5YnJpZEFuYWx5c2lzQ2xvc2UoSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiBoQW5hbHlzaXNIeWJGaWx0ZXIpIHsKICAgSU5UIGVyciA9IDA7CiAKICAgaWYgKGhBbmFseXNpc0h5YkZpbHRlciAhPSBOVUxMKSB7Ci0gICAgaEFuYWx5c2lzSHliRmlsdGVyLT5wTEZtZW1vcnkgICAgPSBOVUxMOwotICAgIGhBbmFseXNpc0h5YkZpbHRlci0+cEhGbWVtb3J5ICAgID0gTlVMTDsKKyAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPnBMRm1lbW9yeSA9IE5VTEw7CisgICAgaEFuYWx5c2lzSHliRmlsdGVyLT5wSEZtZW1vcnkgPSBOVUxMOwogICAgIGhBbmFseXNpc0h5YkZpbHRlci0+TEZtZW1vcnlTaXplID0gMDsKICAgICBoQW5hbHlzaXNIeWJGaWx0ZXItPkhGbWVtb3J5U2l6ZSA9IDA7CiAgIH0KQEAgLTM3OSwzMzEgKzQzNSwzNzkgQEAKICAgcmV0dXJuIGVycjsKIH0KIAotSU5UIEZES2h5YnJpZFN5bnRoZXNpc0luaXQoCi0gICAgICAgIEhBTkRMRV9GREtfU1lOX0hZQl9GSUxURVIgIGhTeW50aGVzaXNIeWJGaWx0ZXIsCi0gICAgICAgIGNvbnN0IEZES19IWUJSSURfTU9ERSAgICAgIG1vZGUsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIHFtZkJhbmRzLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBjcGx4QmFuZHMKLSAgICAgICAgKQotewotICAgIElOVCBlcnIgPSAwOwotICAgIEhBTkRMRV9GREtfSFlCUklEX1NFVFVQIHNldHVwID0gTlVMTDsKK0lOVCBGREtoeWJyaWRTeW50aGVzaXNJbml0KEhBTkRMRV9GREtfU1lOX0hZQl9GSUxURVIgaFN5bnRoZXNpc0h5YkZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZES19IWUJSSURfTU9ERSBtb2RlLCBjb25zdCBJTlQgcW1mQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgY3BseEJhbmRzKSB7CisgIElOVCBlcnIgPSAwOworICBIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUCBzZXR1cCA9IE5VTEw7CiAKLSAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICAgIGNhc2UgVEhSRUVfVE9fVEVOOiAgICAgc2V0dXAgPSAoSEFORExFX0ZES19IWUJSSURfU0VUVVApJnNldHVwXzNfMTA7IGJyZWFrOwotICAgICAgY2FzZSBUSFJFRV9UT19UV0VMVkU6ICBzZXR1cCA9IChIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUCkmc2V0dXBfM18xMjsgYnJlYWs7Ci0gICAgICBjYXNlIFRIUkVFX1RPX1NJWFRFRU46IHNldHVwID0gKEhBTkRMRV9GREtfSFlCUklEX1NFVFVQKSZzZXR1cF8zXzE2OyBicmVhazsKLSAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgZXJyID0gLTE7IGdvdG8gYmFpbDsKLSAgICB9CisgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgVEhSRUVfVE9fVEVOOgorICAgICAgc2V0dXAgPSAmc2V0dXBfM18xMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEhSRUVfVE9fVFdFTFZFOgorICAgICAgc2V0dXAgPSAmc2V0dXBfM18xMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEhSRUVfVE9fU0lYVEVFTjoKKyAgICAgIHNldHVwID0gJnNldHVwXzNfMTY7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZXJyID0gLTE7CisgICAgICBnb3RvIGJhaWw7CisgIH0KIAotICAgIGhTeW50aGVzaXNIeWJGaWx0ZXItPnBTZXR1cCAgICAgID0gc2V0dXA7Ci0gICAgaFN5bnRoZXNpc0h5YkZpbHRlci0+bnJCYW5kcyAgICAgPSBxbWZCYW5kczsKLSAgICBoU3ludGhlc2lzSHliRmlsdGVyLT5jcGx4QmFuZHMgICA9IGNwbHhCYW5kczsKKyAgaFN5bnRoZXNpc0h5YkZpbHRlci0+cFNldHVwID0gc2V0dXA7CisgIGhTeW50aGVzaXNIeWJGaWx0ZXItPm5yQmFuZHMgPSBxbWZCYW5kczsKKyAgaFN5bnRoZXNpc0h5YkZpbHRlci0+Y3BseEJhbmRzID0gY3BseEJhbmRzOwogCiBiYWlsOgotICAgIHJldHVybiBlcnI7CisgIHJldHVybiBlcnI7CiB9CiAKK3ZvaWQgRkRLaHlicmlkU3ludGhlc2lzQXBwbHkoSEFORExFX0ZES19TWU5fSFlCX0ZJTFRFUiBoU3ludGhlc2lzSHliRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgcEh5YnJpZFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBwSHlicmlkSW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNvbnN0IHBRbWZSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY29uc3QgcFFtZkltYWcpIHsKKyAgaW50IGssIG4sIGh5Yk9mZnNldCA9IDA7CisgIGNvbnN0IElOVCBuclFtZkJhbmRzTEYgPSBoU3ludGhlc2lzSHliRmlsdGVyLT5wU2V0dXAtPm5yUW1mQmFuZHM7CiAKLUlOVCBGREtoeWJyaWRTeW50aGVzaXNBcHBseSgKLSAgICAgICAgSEFORExFX0ZES19TWU5fSFlCX0ZJTFRFUiAgaFN5bnRoZXNpc0h5YkZpbHRlciwKLSAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcEh5YnJpZFJlYWwsCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBIeWJyaWRJbWFnLAotICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBwUW1mUmVhbCwKLSAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcFFtZkltYWcKLSAgICAgICAgKQotewotICAgIGludCBrLCBuLCBoeWJPZmZzZXQ9MDsKLSAgICBJTlQgZXJyID0gMDsKLSAgICBjb25zdCBJTlQgbnJRbWZCYW5kc0xGID0gaFN5bnRoZXNpc0h5YkZpbHRlci0+cFNldHVwLT5uclFtZkJhbmRzOworICAvKgorICAgKiBMRiBidWZmZXIuCisgICAqLworICBmb3IgKGsgPSAwOyBrIDwgbnJRbWZCYW5kc0xGOyBrKyspIHsKKyAgICBjb25zdCBpbnQgbkh5YkJhbmRzID0gaFN5bnRoZXNpc0h5YkZpbHRlci0+cFNldHVwLT5uSHliQmFuZHNba107CiAKKyAgICBGSVhQX0RCTCBhY2N1MSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgRklYUF9EQkwgYWNjdTIgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworCisgICAgLyogUGVyZm9ybSBoeWJyaWQgZmlsdGVyaW5nLiAqLworICAgIGZvciAobiA9IDA7IG4gPCBuSHliQmFuZHM7IG4rKykgeworICAgICAgYWNjdTEgKz0gcEh5YnJpZFJlYWxbaHliT2Zmc2V0ICsgbl07CisgICAgICBhY2N1MiArPSBwSHlicmlkSW1hZ1toeWJPZmZzZXQgKyBuXTsKKyAgICB9CisgICAgcFFtZlJlYWxba10gPSBhY2N1MTsKKyAgICBwUW1mSW1hZ1trXSA9IGFjY3UyOworCisgICAgaHliT2Zmc2V0ICs9IG5IeWJCYW5kczsKKyAgfQorCisgIGlmIChoU3ludGhlc2lzSHliRmlsdGVyLT5uckJhbmRzID4gbnJRbWZCYW5kc0xGKSB7CiAgICAgLyoKLSAgICAgKiBMRiBidWZmZXIuCisgICAgICogSEYgYnVmZmVyLgogICAgICAqLwotICAgIGZvciAoaz0wOyBrPG5yUW1mQmFuZHNMRjsgaysrKSB7Ci0gICAgICBjb25zdCBpbnQgbkh5YkJhbmRzID0gaFN5bnRoZXNpc0h5YkZpbHRlci0+cFNldHVwLT5uSHliQmFuZHNba107CisgICAgRkRLbWVtY3B5KCZwUW1mUmVhbFtuclFtZkJhbmRzTEZdLCAmcEh5YnJpZFJlYWxbaHliT2Zmc2V0XSwKKyAgICAgICAgICAgICAgKGhTeW50aGVzaXNIeWJGaWx0ZXItPm5yQmFuZHMgLSBuclFtZkJhbmRzTEYpICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgRkRLbWVtY3B5KAorICAgICAgICAmcFFtZkltYWdbbnJRbWZCYW5kc0xGXSwgJnBIeWJyaWRJbWFnW2h5Yk9mZnNldF0sCisgICAgICAgIChoU3ludGhlc2lzSHliRmlsdGVyLT5jcGx4QmFuZHMgLSBuclFtZkJhbmRzTEYpICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIH0KIAotICAgICAgRklYUF9EQkwgYWNjdTEgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwotICAgICAgRklYUF9EQkwgYWNjdTIgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwotCi0gICAgICAvKiBQZXJmb3JtIGh5YnJpZCBmaWx0ZXJpbmcuICovCi0gICAgICBmb3IgKG49MDsgbjxuSHliQmFuZHM7IG4rKykgewotICAgICAgICAgIGFjY3UxICs9IHBIeWJyaWRSZWFsW2h5Yk9mZnNldCtuXTsKLSAgICAgICAgICBhY2N1MiArPSBwSHlicmlkSW1hZ1toeWJPZmZzZXQrbl07Ci0gICAgICB9Ci0gICAgICBwUW1mUmVhbFtrXSA9IGFjY3UxOwotICAgICAgcFFtZkltYWdba10gPSBhY2N1MjsKLQotICAgICAgaHliT2Zmc2V0ICs9IG5IeWJCYW5kczsKLSAgICB9Ci0KLSAgICBpZiAoaFN5bnRoZXNpc0h5YkZpbHRlci0+bnJCYW5kcyA+IG5yUW1mQmFuZHNMRikgewotICAgICAgLyoKLSAgICAgICAqIEhGIGJ1ZmZlci4KLSAgICAgICAqLwotICAgIEZES21lbWNweSgmcFFtZlJlYWxbbnJRbWZCYW5kc0xGXSwgJnBIeWJyaWRSZWFsW2h5Yk9mZnNldF0sIChoU3ludGhlc2lzSHliRmlsdGVyLT5uckJhbmRzLW5yUW1mQmFuZHNMRikqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgRkRLbWVtY3B5KCZwUW1mSW1hZ1tuclFtZkJhbmRzTEZdLCAmcEh5YnJpZEltYWdbaHliT2Zmc2V0XSwgKGhTeW50aGVzaXNIeWJGaWx0ZXItPmNwbHhCYW5kcy1uclFtZkJhbmRzTEYpKnNpemVvZihGSVhQX0RCTCkpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7CisgIHJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgZHVhbENoYW5uZWxGaWx0ZXJpbmcoCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZSZWFsLAotICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mSW1hZywKLSAgICAgICAgY29uc3QgSU5UICpjb25zdCAgICAgICAgICAgcFJlYWRJZHgsCi0gICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIG1IeWJyaWRSZWFsLAotICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBtSHlicmlkSW1hZywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgaW52ZXJ0Ci0gICAgICAgICkKLXsKLSAgICBjb25zdCBGSVhQX0hUQiAqcCA9IEh5YkZpbHRlckNvZWYyOworc3RhdGljIHZvaWQgZHVhbENoYW5uZWxGaWx0ZXJpbmcoY29uc3QgRklYUF9EQkwgKmNvbnN0IHBRbWZSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHBRbWZJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpjb25zdCBwUmVhZElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb25zdCBtSHlicmlkUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb25zdCBtSHlicmlkSW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpbnZlcnQpIHsKKyAgRklYUF9EQkwgcjEsIHI2OworICBGSVhQX0RCTCBpMSwgaTY7CiAKLSAgICBGSVhQX0RCTCAgcjEsIHI2OwotICAgIEZJWFBfREJMICBpMSwgaTY7CisgIGNvbnN0IEZJWFBfSFRCIGYwID0gSHliRmlsdGVyQ29lZjJbMF07IC8qIGNvcnJlc3BvbmRzIHRvIHAxIGFuZCBwMTEgKi8KKyAgY29uc3QgRklYUF9IVEIgZjEgPSBIeWJGaWx0ZXJDb2VmMlsxXTsgLyogY29ycmVzcG9uZHMgdG8gcDMgYW5kIHA5ICAqLworICBjb25zdCBGSVhQX0hUQiBmMiA9IEh5YkZpbHRlckNvZWYyWzJdOyAvKiBjb3JyZXNwb25kcyB0byBwNSBhbmQgcDcgICovCiAKLSAgICAvKiBzeW1tZXRyaWMgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotICAgIHIxICA9IGZNdWx0RGl2MihwWzFdLCBwUW1mUmVhbFtwUmVhZElkeFsxXV0pICsgZk11bHREaXYyKHBbMV0sIHBRbWZSZWFsW3BSZWFkSWR4WzExXV0pIDsKLSAgICBpMSAgPSBmTXVsdERpdjIocFsxXSwgcFFtZkltYWdbcFJlYWRJZHhbMV1dKSArIGZNdWx0RGl2MihwWzFdLCBwUW1mSW1hZ1twUmVhZElkeFsxMV1dKSA7Ci0gICAgcjEgKz0gZk11bHREaXYyKHBbM10sIHBRbWZSZWFsW3BSZWFkSWR4WzNdXSkgKyBmTXVsdERpdjIocFszXSwgcFFtZlJlYWxbcFJlYWRJZHhbIDldXSkgOwotICAgIGkxICs9IGZNdWx0RGl2MihwWzNdLCBwUW1mSW1hZ1twUmVhZElkeFszXV0pICsgZk11bHREaXYyKHBbM10sIHBRbWZJbWFnW3BSZWFkSWR4WyA5XV0pIDsKLSAgICByMSArPSBmTXVsdERpdjIocFs1XSwgcFFtZlJlYWxbcFJlYWRJZHhbNV1dKSArIGZNdWx0RGl2MihwWzVdLCBwUW1mUmVhbFtwUmVhZElkeFsgN11dKSA7Ci0gICAgaTEgKz0gZk11bHREaXYyKHBbNV0sIHBRbWZJbWFnW3BSZWFkSWR4WzVdXSkgKyBmTXVsdERpdjIocFs1XSwgcFFtZkltYWdbcFJlYWRJZHhbIDddXSkgOwotICAgIHI2ICA9IGZNdWx0RGl2MihwWzZdLCBwUW1mUmVhbFtwUmVhZElkeFs2XV0pIDsKLSAgICBpNiAgPSBmTXVsdERpdjIocFs2XSwgcFFtZkltYWdbcFJlYWRJZHhbNl1dKSA7CisgIC8qIHN5bW1ldHJpYyBmaWx0ZXIgY29lZmZpY2llbnRzICovCisgIHIxID0gZk11bHREaXYyKGYwLCBwUW1mUmVhbFtwUmVhZElkeFsxXV0pICsKKyAgICAgICBmTXVsdERpdjIoZjAsIHBRbWZSZWFsW3BSZWFkSWR4WzExXV0pOworICBpMSA9IGZNdWx0RGl2MihmMCwgcFFtZkltYWdbcFJlYWRJZHhbMV1dKSArCisgICAgICAgZk11bHREaXYyKGYwLCBwUW1mSW1hZ1twUmVhZElkeFsxMV1dKTsKKyAgcjEgKz0gZk11bHREaXYyKGYxLCBwUW1mUmVhbFtwUmVhZElkeFszXV0pICsKKyAgICAgICAgZk11bHREaXYyKGYxLCBwUW1mUmVhbFtwUmVhZElkeFs5XV0pOworICBpMSArPSBmTXVsdERpdjIoZjEsIHBRbWZJbWFnW3BSZWFkSWR4WzNdXSkgKworICAgICAgICBmTXVsdERpdjIoZjEsIHBRbWZJbWFnW3BSZWFkSWR4WzldXSk7CisgIHIxICs9IGZNdWx0RGl2MihmMiwgcFFtZlJlYWxbcFJlYWRJZHhbNV1dKSArCisgICAgICAgIGZNdWx0RGl2MihmMiwgcFFtZlJlYWxbcFJlYWRJZHhbN11dKTsKKyAgaTEgKz0gZk11bHREaXYyKGYyLCBwUW1mSW1hZ1twUmVhZElkeFs1XV0pICsKKyAgICAgICAgZk11bHREaXYyKGYyLCBwUW1mSW1hZ1twUmVhZElkeFs3XV0pOwogCi0gICAgaWYgKGludmVydCkgewotICAgICAgbUh5YnJpZFJlYWxbMV0gPSAocjEgKyByNikgPDwgMTsKLSAgICAgIG1IeWJyaWRJbWFnWzFdID0gKGkxICsgaTYpIDw8IDE7CisgIHI2ID0gcFFtZlJlYWxbcFJlYWRJZHhbNl1dID4+IDI7CisgIGk2ID0gcFFtZkltYWdbcFJlYWRJZHhbNl1dID4+IDI7CiAKLSAgICAgIG1IeWJyaWRSZWFsWzBdID0gKHI2IC0gcjEpIDw8IDE7Ci0gICAgICBtSHlicmlkSW1hZ1swXSA9IChpNiAtIGkxKSA8PCAxOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIG1IeWJyaWRSZWFsWzBdID0gKHIxICsgcjYpIDw8IDE7Ci0gICAgICBtSHlicmlkSW1hZ1swXSA9IChpMSArIGk2KSA8PCAxOworICBGREtfQVNTRVJUKChpbnZlcnQgPT0gMCkgfHwgKGludmVydCA9PSAxKSk7CisgIG1IeWJyaWRSZWFsWzAgKyBpbnZlcnRdID0gKHI2ICsgcjEpIDw8IDE7CisgIG1IeWJyaWRJbWFnWzAgKyBpbnZlcnRdID0gKGk2ICsgaTEpIDw8IDE7CiAKLSAgICAgIG1IeWJyaWRSZWFsWzFdID0gKHI2IC0gcjEpIDw8IDE7Ci0gICAgICBtSHlicmlkSW1hZ1sxXSA9IChpNiAtIGkxKSA8PCAxOwotICAgIH0KKyAgbUh5YnJpZFJlYWxbMSAtIGludmVydF0gPSAocjYgLSByMSkgPDwgMTsKKyAgbUh5YnJpZEltYWdbMSAtIGludmVydF0gPSAoaTYgLSBpMSkgPDwgMTsKIH0KIAotc3RhdGljIHZvaWQgZm91ckNoYW5uZWxGaWx0ZXJpbmcoCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAgICAgIHBRbWZSZWFsLAotICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mSW1hZywKLSAgICAgICAgY29uc3QgSU5UICpjb25zdCAgICAgICAgICAgcFJlYWRJZHgsCi0gICAgICAgIEZJWFBfREJMICpjb25zdCAgICAgICAgICAgIG1IeWJyaWRSZWFsLAotICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBtSHlicmlkSW1hZywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgaW52ZXJ0Ci0gICAgICAgICkKLXsKLSAgICBjb25zdCBGSVhQX0hUQiAqcCA9IEh5YkZpbHRlckNvZWY0Oworc3RhdGljIHZvaWQgZm91ckNoYW5uZWxGaWx0ZXJpbmcoY29uc3QgRklYUF9EQkwgKmNvbnN0IHBRbWZSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHBRbWZJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpjb25zdCBwUmVhZElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb25zdCBtSHlicmlkUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb25zdCBtSHlicmlkSW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpbnZlcnQpIHsKKyAgY29uc3QgRklYUF9IVEIgKnAgPSBIeWJGaWx0ZXJDb2VmNDsKIAotICAgIEZJWFBfREJMIGZmdFs4XTsKKyAgRklYUF9EQkwgZmZ0WzhdOwogCi0gICAgc3RhdGljIGNvbnN0IEZJWFBfREJMICBjclsxM10gPSB7Ci0gICAgICBGTDJGWENPTlNUX0RCTCggICAgICAgICAgICAgICAwLmYpLCBGTDJGWENPTlNUX0RCTCgtMC43MDcxMDY3ODExODY1NWYpLCBGTDJGWENPTlNUX0RCTCggICAgICAgICAgICAgIC0xLmYpLAotICAgICAgRkwyRlhDT05TVF9EQkwoLTAuNzA3MTA2NzgxMTg2NTVmKSwgRkwyRlhDT05TVF9EQkwoICAgICAgICAgICAgICAgMC5mKSwgRkwyRlhDT05TVF9EQkwoIDAuNzA3MTA2NzgxMTg2NTVmKSwKLSAgICAgIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgIDEuZiksCi0gICAgICBGTDJGWENPTlNUX0RCTCggMC43MDcxMDY3ODExODY1NWYpLCBGTDJGWENPTlNUX0RCTCggICAgICAgICAgICAgICAwLmYpLCBGTDJGWENPTlNUX0RCTCgtMC43MDcxMDY3ODExODY1NWYpLAotICAgICAgRkwyRlhDT05TVF9EQkwoICAgICAgICAgICAgICAtMS5mKSwgRkwyRlhDT05TVF9EQkwoLTAuNzA3MTA2NzgxMTg2NTVmKSwgRkwyRlhDT05TVF9EQkwoICAgICAgICAgICAgICAgMC5mKQotICAgIH07Ci0gICAgc3RhdGljIGNvbnN0IEZJWFBfREJMICBjaVsxM10gPSB7Ci0gICAgICBGTDJGWENPTlNUX0RCTCggICAgICAgICAgICAgIC0xLmYpLCBGTDJGWENPTlNUX0RCTCgtMC43MDcxMDY3ODExODY1NWYpLCBGTDJGWENPTlNUX0RCTCggICAgICAgICAgICAgICAwLmYpLAotICAgICAgRkwyRlhDT05TVF9EQkwoIDAuNzA3MTA2NzgxMTg2NTVmKSwgRkwyRlhDT05TVF9EQkwoICAgICAgICAgICAgICAgMS5mKSwgRkwyRlhDT05TVF9EQkwoIDAuNzA3MTA2NzgxMTg2NTVmKSwKLSAgICAgIEZMMkZYQ09OU1RfREJMKCAgICAgICAgICAgICAgIDAuZiksCi0gICAgICBGTDJGWENPTlNUX0RCTCgtMC43MDcxMDY3ODExODY1NWYpLCBGTDJGWENPTlNUX0RCTCggICAgICAgICAgICAgIC0xLmYpLCBGTDJGWENPTlNUX0RCTCgtMC43MDcxMDY3ODExODY1NWYpLAotICAgICAgRkwyRlhDT05TVF9EQkwoICAgICAgICAgICAgICAgMC5mKSwgRkwyRlhDT05TVF9EQkwoIDAuNzA3MTA2NzgxMTg2NTVmKSwgRkwyRlhDT05TVF9EQkwoICAgICAgICAgICAgICAgMS5mKQotICAgIH07CisgIHN0YXRpYyBjb25zdCBGSVhQX0RCTCBjclsxM10gPSB7CisgICAgICBGTDJGWENPTlNUX0RCTCgwLmYpLCAgRkwyRlhDT05TVF9EQkwoLTAuNzA3MTA2NzgxMTg2NTVmKSwKKyAgICAgIEZMMkZYQ09OU1RfREJMKC0xLmYpLCBGTDJGWENPTlNUX0RCTCgtMC43MDcxMDY3ODExODY1NWYpLAorICAgICAgRkwyRlhDT05TVF9EQkwoMC5mKSwgIEZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTVmKSwKKyAgICAgIEZMMkZYQ09OU1RfREJMKDEuZiksICBGTDJGWENPTlNUX0RCTCgwLjcwNzEwNjc4MTE4NjU1ZiksCisgICAgICBGTDJGWENPTlNUX0RCTCgwLmYpLCAgRkwyRlhDT05TVF9EQkwoLTAuNzA3MTA2NzgxMTg2NTVmKSwKKyAgICAgIEZMMkZYQ09OU1RfREJMKC0xLmYpLCBGTDJGWENPTlNUX0RCTCgtMC43MDcxMDY3ODExODY1NWYpLAorICAgICAgRkwyRlhDT05TVF9EQkwoMC5mKX07CisgIHN0YXRpYyBjb25zdCBGSVhQX0RCTCBjaVsxM10gPSB7CisgICAgICBGTDJGWENPTlNUX0RCTCgtMS5mKSwgRkwyRlhDT05TVF9EQkwoLTAuNzA3MTA2NzgxMTg2NTVmKSwKKyAgICAgIEZMMkZYQ09OU1RfREJMKDAuZiksICBGTDJGWENPTlNUX0RCTCgwLjcwNzEwNjc4MTE4NjU1ZiksCisgICAgICBGTDJGWENPTlNUX0RCTCgxLmYpLCAgRkwyRlhDT05TVF9EQkwoMC43MDcxMDY3ODExODY1NWYpLAorICAgICAgRkwyRlhDT05TVF9EQkwoMC5mKSwgIEZMMkZYQ09OU1RfREJMKC0wLjcwNzEwNjc4MTE4NjU1ZiksCisgICAgICBGTDJGWENPTlNUX0RCTCgtMS5mKSwgRkwyRlhDT05TVF9EQkwoLTAuNzA3MTA2NzgxMTg2NTVmKSwKKyAgICAgIEZMMkZYQ09OU1RfREJMKDAuZiksICBGTDJGWENPTlNUX0RCTCgwLjcwNzEwNjc4MTE4NjU1ZiksCisgICAgICBGTDJGWENPTlNUX0RCTCgxLmYpfTsKIAorICAvKiBGSVIgZmlsdGVyLiAqLworICAvKiBwcmUgdHdpZGRlbGluZyB3aXRoIHByZS10d2lkZGxpbmcgY29lZmZpY2llbnRzIGNbbl0gICovCisgIC8qIG11bHRpcGxpY2F0aW9uIHdpdGggZmlsdGVyIGNvZWZmaWNpZW50cyBwW25dICAgICAgICAgKi8KKyAgLyogaGludDogKGEgKyBpYikqKGMgKyBpZCkgPSAoYSpjIC0gYipkKSArIGkoYSpkICsgYipjKSAqLworICAvKiB3cml0ZSB0byBmZnQgY29lZmZpY2llbnQgbicgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGZmdFtGRlRfSURYX1IoMCldID0KKyAgICAgIChmTXVsdChwWzEwXSwgKGZNdWx0U3ViKGZNdWx0RGl2MihjclsyXSwgcFFtZlJlYWxbcFJlYWRJZHhbMl1dKSwgY2lbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZ1twUmVhZElkeFsyXV0pKSkgKworICAgICAgIGZNdWx0KHBbNl0sIChmTXVsdFN1YihmTXVsdERpdjIoY3JbNl0sIHBRbWZSZWFsW3BSZWFkSWR4WzZdXSksIGNpWzZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZ1twUmVhZElkeFs2XV0pKSkgKworICAgICAgIGZNdWx0KHBbMl0sIChmTXVsdFN1YihmTXVsdERpdjIoY3JbMTBdLCBwUW1mUmVhbFtwUmVhZElkeFsxMF1dKSwgY2lbMTBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZ1twUmVhZElkeFsxMF1dKSkpKTsKKyAgZmZ0W0ZGVF9JRFhfSSgwKV0gPQorICAgICAgKGZNdWx0KHBbMTBdLCAoZk11bHRBZGQoZk11bHREaXYyKGNpWzJdLCBwUW1mUmVhbFtwUmVhZElkeFsyXV0pLCBjclsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzJdXSkpKSArCisgICAgICAgZk11bHQocFs2XSwgKGZNdWx0QWRkKGZNdWx0RGl2MihjaVs2XSwgcFFtZlJlYWxbcFJlYWRJZHhbNl1dKSwgY3JbNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzZdXSkpKSArCisgICAgICAgZk11bHQocFsyXSwgKGZNdWx0QWRkKGZNdWx0RGl2MihjaVsxMF0sIHBRbWZSZWFsW3BSZWFkSWR4WzEwXV0pLCBjclsxMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzEwXV0pKSkpOwogCi0gICAgLyogRklSIGZpbHRlci4gKi8KLSAgICAvKiBwcmUgdHdpZGRlbGluZyB3aXRoIHByZS10d2lkZGxpbmcgY29lZmZpY2llbnRzIGNbbl0gICovCi0gICAgLyogbXVsdGlwbGljYXRpb24gd2l0aCBmaWx0ZXIgY29lZmZpY2llbnRzIHBbbl0gICAgICAgICAqLwotICAgIC8qIGhpbnQ6IChhICsgaWIpKihjICsgaWQpID0gKGEqYyAtIGIqZCkgKyBpKGEqZCArIGIqYykgKi8KLSAgICAvKiB3cml0ZSB0byBmZnQgY29lZmZpY2llbnQgbicgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZmZ0W0ZGVF9JRFhfUigwKV0gPSAgKCBmTXVsdChwWzEwXSwgKCBmTXVsdFN1YihmTXVsdERpdjIoY3JbIDJdLCBwUW1mUmVhbFtwUmVhZElkeFsgMl1dKSwgY2lbIDJdLCBwUW1mSW1hZ1twUmVhZElkeFsgMl1dKSkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDZdLCAoIGZNdWx0U3ViKGZNdWx0RGl2MihjclsgNl0sIHBRbWZSZWFsW3BSZWFkSWR4WyA2XV0pLCBjaVsgNl0sIHBRbWZJbWFnW3BSZWFkSWR4WyA2XV0pKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgMl0sICggZk11bHRTdWIoZk11bHREaXYyKGNyWzEwXSwgcFFtZlJlYWxbcFJlYWRJZHhbMTBdXSksIGNpWzEwXSwgcFFtZkltYWdbcFJlYWRJZHhbMTBdXSkpKSApOwotICAgIGZmdFtGRlRfSURYX0koMCldID0gICggZk11bHQocFsxMF0sICggZk11bHRBZGQoZk11bHREaXYyKGNpWyAyXSwgcFFtZlJlYWxbcFJlYWRJZHhbIDJdXSksIGNyWyAyXSwgcFFtZkltYWdbcFJlYWRJZHhbIDJdXSkpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyA2XSwgKCBmTXVsdEFkZChmTXVsdERpdjIoY2lbIDZdLCBwUW1mUmVhbFtwUmVhZElkeFsgNl1dKSwgY3JbIDZdLCBwUW1mSW1hZ1twUmVhZElkeFsgNl1dKSkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDJdLCAoIGZNdWx0QWRkKGZNdWx0RGl2MihjaVsxMF0sIHBRbWZSZWFsW3BSZWFkSWR4WzEwXV0pLCBjclsxMF0sIHBRbWZJbWFnW3BSZWFkSWR4WzEwXV0pKSkgKTsKKyAgLyogdHdpZGRsZSBkZWUgZHVtICovCisgIGZmdFtGRlRfSURYX1IoMSldID0KKyAgICAgIChmTXVsdChwWzldLCAoZk11bHRTdWIoZk11bHREaXYyKGNyWzNdLCBwUW1mUmVhbFtwUmVhZElkeFszXV0pLCBjaVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZkltYWdbcFJlYWRJZHhbM11dKSkpICsKKyAgICAgICBmTXVsdChwWzVdLCAoZk11bHRTdWIoZk11bHREaXYyKGNyWzddLCBwUW1mUmVhbFtwUmVhZElkeFs3XV0pLCBjaVs3XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZkltYWdbcFJlYWRJZHhbN11dKSkpICsKKyAgICAgICBmTXVsdChwWzFdLCAoZk11bHRTdWIoZk11bHREaXYyKGNyWzExXSwgcFFtZlJlYWxbcFJlYWRJZHhbMTFdXSksIGNpWzExXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZkltYWdbcFJlYWRJZHhbMTFdXSkpKSk7CisgIGZmdFtGRlRfSURYX0koMSldID0KKyAgICAgIChmTXVsdChwWzldLCAoZk11bHRBZGQoZk11bHREaXYyKGNpWzNdLCBwUW1mUmVhbFtwUmVhZElkeFszXV0pLCBjclszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZkltYWdbcFJlYWRJZHhbM11dKSkpICsKKyAgICAgICBmTXVsdChwWzVdLCAoZk11bHRBZGQoZk11bHREaXYyKGNpWzddLCBwUW1mUmVhbFtwUmVhZElkeFs3XV0pLCBjcls3XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZkltYWdbcFJlYWRJZHhbN11dKSkpICsKKyAgICAgICBmTXVsdChwWzFdLCAoZk11bHRBZGQoZk11bHREaXYyKGNpWzExXSwgcFFtZlJlYWxbcFJlYWRJZHhbMTFdXSksIGNyWzExXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZkltYWdbcFJlYWRJZHhbMTFdXSkpKSk7CiAKLSAgICAvKiB0d2lkZGxlIGRlZSBkdW0gKi8KLSAgICBmZnRbRkZUX0lEWF9SKDEpXSA9ICAoIGZNdWx0KHBbIDldLCAoIGZNdWx0U3ViKGZNdWx0RGl2MihjclsgM10sIHBRbWZSZWFsW3BSZWFkSWR4WyAzXV0pLCBjaVsgM10sIHBRbWZJbWFnW3BSZWFkSWR4WyAzXV0pKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgNV0sICggZk11bHRTdWIoZk11bHREaXYyKGNyWyA3XSwgcFFtZlJlYWxbcFJlYWRJZHhbIDddXSksIGNpWyA3XSwgcFFtZkltYWdbcFJlYWRJZHhbIDddXSkpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyAxXSwgKCBmTXVsdFN1YihmTXVsdERpdjIoY3JbMTFdLCBwUW1mUmVhbFtwUmVhZElkeFsxMV1dKSwgY2lbMTFdLCBwUW1mSW1hZ1twUmVhZElkeFsxMV1dKSkpICk7Ci0gICAgZmZ0W0ZGVF9JRFhfSSgxKV0gPSAgKCBmTXVsdChwWyA5XSwgKCBmTXVsdEFkZChmTXVsdERpdjIoY2lbIDNdLCBwUW1mUmVhbFtwUmVhZElkeFsgM11dKSwgY3JbIDNdLCBwUW1mSW1hZ1twUmVhZElkeFsgM11dKSkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDVdLCAoIGZNdWx0QWRkKGZNdWx0RGl2MihjaVsgN10sIHBRbWZSZWFsW3BSZWFkSWR4WyA3XV0pLCBjclsgN10sIHBRbWZJbWFnW3BSZWFkSWR4WyA3XV0pKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgMV0sICggZk11bHRBZGQoZk11bHREaXYyKGNpWzExXSwgcFFtZlJlYWxbcFJlYWRJZHhbMTFdXSksIGNyWzExXSwgcFFtZkltYWdbcFJlYWRJZHhbMTFdXSkpKSApOworICAvKiB0d2lkZGxlIGRlZSBkZWUgKi8KKyAgZmZ0W0ZGVF9JRFhfUigyKV0gPQorICAgICAgKGZNdWx0KHBbMTJdLCAoZk11bHRTdWIoZk11bHREaXYyKGNyWzBdLCBwUW1mUmVhbFtwUmVhZElkeFswXV0pLCBjaVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzBdXSkpKSArCisgICAgICAgZk11bHQocFs4XSwgKGZNdWx0U3ViKGZNdWx0RGl2Mihjcls0XSwgcFFtZlJlYWxbcFJlYWRJZHhbNF1dKSwgY2lbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzRdXSkpKSArCisgICAgICAgZk11bHQocFs0XSwgKGZNdWx0U3ViKGZNdWx0RGl2Mihjcls4XSwgcFFtZlJlYWxbcFJlYWRJZHhbOF1dKSwgY2lbOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzhdXSkpKSArCisgICAgICAgZk11bHQocFswXSwgKGZNdWx0U3ViKGZNdWx0RGl2MihjclsxMl0sIHBRbWZSZWFsW3BSZWFkSWR4WzEyXV0pLCBjaVsxMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzEyXV0pKSkpOworICBmZnRbRkZUX0lEWF9JKDIpXSA9CisgICAgICAoZk11bHQocFsxMl0sIChmTXVsdEFkZChmTXVsdERpdjIoY2lbMF0sIHBRbWZSZWFsW3BSZWFkSWR4WzBdXSksIGNyWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZkltYWdbcFJlYWRJZHhbMF1dKSkpICsKKyAgICAgICBmTXVsdChwWzhdLCAoZk11bHRBZGQoZk11bHREaXYyKGNpWzRdLCBwUW1mUmVhbFtwUmVhZElkeFs0XV0pLCBjcls0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZkltYWdbcFJlYWRJZHhbNF1dKSkpICsKKyAgICAgICBmTXVsdChwWzRdLCAoZk11bHRBZGQoZk11bHREaXYyKGNpWzhdLCBwUW1mUmVhbFtwUmVhZElkeFs4XV0pLCBjcls4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZkltYWdbcFJlYWRJZHhbOF1dKSkpICsKKyAgICAgICBmTXVsdChwWzBdLCAoZk11bHRBZGQoZk11bHREaXYyKGNpWzEyXSwgcFFtZlJlYWxbcFJlYWRJZHhbMTJdXSksIGNyWzEyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZkltYWdbcFJlYWRJZHhbMTJdXSkpKSk7CiAKLSAgICAvKiB0d2lkZGxlIGRlZSBkZWUgKi8KLSAgICBmZnRbRkZUX0lEWF9SKDIpXSA9ICAoIGZNdWx0KHBbMTJdLCAoIGZNdWx0U3ViKGZNdWx0RGl2MihjclsgMF0sIHBRbWZSZWFsW3BSZWFkSWR4WyAwXV0pLCBjaVsgMF0sIHBRbWZJbWFnW3BSZWFkSWR4WyAwXV0pKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgOF0sICggZk11bHRTdWIoZk11bHREaXYyKGNyWyA0XSwgcFFtZlJlYWxbcFJlYWRJZHhbIDRdXSksIGNpWyA0XSwgcFFtZkltYWdbcFJlYWRJZHhbIDRdXSkpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyA0XSwgKCBmTXVsdFN1YihmTXVsdERpdjIoY3JbIDhdLCBwUW1mUmVhbFtwUmVhZElkeFsgOF1dKSwgY2lbIDhdLCBwUW1mSW1hZ1twUmVhZElkeFsgOF1dKSkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDBdLCAoIGZNdWx0U3ViKGZNdWx0RGl2MihjclsxMl0sIHBRbWZSZWFsW3BSZWFkSWR4WzEyXV0pLCBjaVsxMl0sIHBRbWZJbWFnW3BSZWFkSWR4WzEyXV0pKSkgKTsKLSAgICBmZnRbRkZUX0lEWF9JKDIpXSA9ICAoIGZNdWx0KHBbMTJdLCAoIGZNdWx0QWRkKGZNdWx0RGl2MihjaVsgMF0sIHBRbWZSZWFsW3BSZWFkSWR4WyAwXV0pLCBjclsgMF0sIHBRbWZJbWFnW3BSZWFkSWR4WyAwXV0pKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgOF0sICggZk11bHRBZGQoZk11bHREaXYyKGNpWyA0XSwgcFFtZlJlYWxbcFJlYWRJZHhbIDRdXSksIGNyWyA0XSwgcFFtZkltYWdbcFJlYWRJZHhbIDRdXSkpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyA0XSwgKCBmTXVsdEFkZChmTXVsdERpdjIoY2lbIDhdLCBwUW1mUmVhbFtwUmVhZElkeFsgOF1dKSwgY3JbIDhdLCBwUW1mSW1hZ1twUmVhZElkeFsgOF1dKSkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDBdLCAoIGZNdWx0QWRkKGZNdWx0RGl2MihjaVsxMl0sIHBRbWZSZWFsW3BSZWFkSWR4WzEyXV0pLCBjclsxMl0sIHBRbWZJbWFnW3BSZWFkSWR4WzEyXV0pKSkgKTsKKyAgZmZ0W0ZGVF9JRFhfUigzKV0gPQorICAgICAgKGZNdWx0KHBbMTFdLCAoZk11bHRTdWIoZk11bHREaXYyKGNyWzFdLCBwUW1mUmVhbFtwUmVhZElkeFsxXV0pLCBjaVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzFdXSkpKSArCisgICAgICAgZk11bHQocFs3XSwgKGZNdWx0U3ViKGZNdWx0RGl2Mihjcls1XSwgcFFtZlJlYWxbcFJlYWRJZHhbNV1dKSwgY2lbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzVdXSkpKSArCisgICAgICAgZk11bHQocFszXSwgKGZNdWx0U3ViKGZNdWx0RGl2Mihjcls5XSwgcFFtZlJlYWxbcFJlYWRJZHhbOV1dKSwgY2lbOV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzldXSkpKSk7CisgIGZmdFtGRlRfSURYX0koMyldID0KKyAgICAgIChmTXVsdChwWzExXSwgKGZNdWx0QWRkKGZNdWx0RGl2MihjaVsxXSwgcFFtZlJlYWxbcFJlYWRJZHhbMV1dKSwgY3JbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZ1twUmVhZElkeFsxXV0pKSkgKworICAgICAgIGZNdWx0KHBbN10sIChmTXVsdEFkZChmTXVsdERpdjIoY2lbNV0sIHBRbWZSZWFsW3BSZWFkSWR4WzVdXSksIGNyWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZ1twUmVhZElkeFs1XV0pKSkgKworICAgICAgIGZNdWx0KHBbM10sIChmTXVsdEFkZChmTXVsdERpdjIoY2lbOV0sIHBRbWZSZWFsW3BSZWFkSWR4WzldXSksIGNyWzldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZ1twUmVhZElkeFs5XV0pKSkpOwogCi0gICAgZmZ0W0ZGVF9JRFhfUigzKV0gPSAgKCBmTXVsdChwWzExXSwgKCBmTXVsdFN1YihmTXVsdERpdjIoY3JbIDFdLCBwUW1mUmVhbFtwUmVhZElkeFsgMV1dKSwgY2lbIDFdLCBwUW1mSW1hZ1twUmVhZElkeFsgMV1dKSkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDddLCAoIGZNdWx0U3ViKGZNdWx0RGl2MihjclsgNV0sIHBRbWZSZWFsW3BSZWFkSWR4WyA1XV0pLCBjaVsgNV0sIHBRbWZJbWFnW3BSZWFkSWR4WyA1XV0pKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQocFsgM10sICggZk11bHRTdWIoZk11bHREaXYyKGNyWyA5XSwgcFFtZlJlYWxbcFJlYWRJZHhbIDldXSksIGNpWyA5XSwgcFFtZkltYWdbcFJlYWRJZHhbIDldXSkpKSApOwotICAgIGZmdFtGRlRfSURYX0koMyldID0gICggZk11bHQocFsxMV0sICggZk11bHRBZGQoZk11bHREaXYyKGNpWyAxXSwgcFFtZlJlYWxbcFJlYWRJZHhbIDFdXSksIGNyWyAxXSwgcFFtZkltYWdbcFJlYWRJZHhbIDFdXSkpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChwWyA3XSwgKCBmTXVsdEFkZChmTXVsdERpdjIoY2lbIDVdLCBwUW1mUmVhbFtwUmVhZElkeFsgNV1dKSwgY3JbIDVdLCBwUW1mSW1hZ1twUmVhZElkeFsgNV1dKSkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHBbIDNdLCAoIGZNdWx0QWRkKGZNdWx0RGl2MihjaVsgOV0sIHBRbWZSZWFsW3BSZWFkSWR4WyA5XV0pLCBjclsgOV0sIHBRbWZJbWFnW3BSZWFkSWR4WyA5XV0pKSkgKTsKKyAgLyogZmZ0IG1vZHVsYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogaGVyZTogZmFzdCBtYW51YWwgZmZ0IG1vZHVsYXRpb24gZm9yIGEgZmZ0IG9mIGxlbmd0aCBNPTQgICAgICAgICAgKi8KKyAgLyogZmZ0XzR7eFtuXX0gPSB4WzBdKmV4cCgtaSoyKnBpLzQqbSowKSArIHhbMV0qZXhwKC1pKjIqcGkvNCptKjEpICsKKyAgeFsyXSpleHAoLWkqMipwaS80Km0qMikgKyB4WzNdKmV4cCgtaSoyKnBpLzQqbSozKSAgICovCiAKLSAgICAvKiBmZnQgbW9kdWxhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIGhlcmU6IGZhc3QgbWFudWFsIGZmdCBtb2R1bGF0aW9uIGZvciBhIGZmdCBvZiBsZW5ndGggTT00ICAgICAgICAgICovCi0gICAgLyogZmZ0XzR7eFtuXX0gPSB4WzBdKmV4cCgtaSoyKnBpLzQqbSowKSArIHhbMV0qZXhwKC1pKjIqcGkvNCptKjEpICsKLSAgICB4WzJdKmV4cCgtaSoyKnBpLzQqbSoyKSArIHhbM10qZXhwKC1pKjIqcGkvNCptKjMpICAgKi8KKyAgLyoKKyAgZmZ0IGJpbiBtPTA6CisgIFhbMCwgbl0gPSB4WzBdICsgICB4WzFdICsgeFsyXSArICAgeFszXQorICAqLworICBtSHlicmlkUmVhbFswXSA9IGZmdFtGRlRfSURYX1IoMCldICsgZmZ0W0ZGVF9JRFhfUigxKV0gKyBmZnRbRkZUX0lEWF9SKDIpXSArCisgICAgICAgICAgICAgICAgICAgZmZ0W0ZGVF9JRFhfUigzKV07CisgIG1IeWJyaWRJbWFnWzBdID0gZmZ0W0ZGVF9JRFhfSSgwKV0gKyBmZnRbRkZUX0lEWF9JKDEpXSArIGZmdFtGRlRfSURYX0koMildICsKKyAgICAgICAgICAgICAgICAgICBmZnRbRkZUX0lEWF9JKDMpXTsKIAotICAgIC8qCi0gICAgZmZ0IGJpbiBtPTA6Ci0gICAgWFswLCBuXSA9IHhbMF0gKyAgIHhbMV0gKyB4WzJdICsgICB4WzNdCi0gICAgKi8KLSAgICBtSHlicmlkUmVhbFswXSA9IGZmdFtGRlRfSURYX1IoMCldICsgZmZ0W0ZGVF9JRFhfUigxKV0gKyBmZnRbRkZUX0lEWF9SKDIpXSArIGZmdFtGRlRfSURYX1IoMyldOwotICAgIG1IeWJyaWRJbWFnWzBdID0gZmZ0W0ZGVF9JRFhfSSgwKV0gKyBmZnRbRkZUX0lEWF9JKDEpXSArIGZmdFtGRlRfSURYX0koMildICsgZmZ0W0ZGVF9JRFhfSSgzKV07CisgIC8qCisgIGZmdCBiaW4gbT0xOgorICBYWzEsIG5dID0geFswXSAtIGkqeFsxXSAtIHhbMl0gKyBpKnhbM10KKyAgKi8KKyAgbUh5YnJpZFJlYWxbMV0gPSBmZnRbRkZUX0lEWF9SKDApXSArIGZmdFtGRlRfSURYX0koMSldIC0gZmZ0W0ZGVF9JRFhfUigyKV0gLQorICAgICAgICAgICAgICAgICAgIGZmdFtGRlRfSURYX0koMyldOworICBtSHlicmlkSW1hZ1sxXSA9IGZmdFtGRlRfSURYX0koMCldIC0gZmZ0W0ZGVF9JRFhfUigxKV0gLSBmZnRbRkZUX0lEWF9JKDIpXSArCisgICAgICAgICAgICAgICAgICAgZmZ0W0ZGVF9JRFhfUigzKV07CiAKLSAgICAvKgotICAgIGZmdCBiaW4gbT0xOgotICAgIFhbMSwgbl0gPSB4WzBdIC0gaSp4WzFdIC0geFsyXSArIGkqeFszXQotICAgICovCi0gICAgbUh5YnJpZFJlYWxbMV0gPSBmZnRbRkZUX0lEWF9SKDApXSArIGZmdFtGRlRfSURYX0koMSldIC0gZmZ0W0ZGVF9JRFhfUigyKV0gLSBmZnRbRkZUX0lEWF9JKDMpXTsKLSAgICBtSHlicmlkSW1hZ1sxXSA9IGZmdFtGRlRfSURYX0koMCldIC0gZmZ0W0ZGVF9JRFhfUigxKV0gLSBmZnRbRkZUX0lEWF9JKDIpXSArIGZmdFtGRlRfSURYX1IoMyldOworICAvKgorICBmZnQgYmluIG09MjoKKyAgWFsyLCBuXSA9IHhbMF0gLSAgIHhbMV0gKyB4WzJdIC0gICB4WzNdCisgICovCisgIG1IeWJyaWRSZWFsWzJdID0gZmZ0W0ZGVF9JRFhfUigwKV0gLSBmZnRbRkZUX0lEWF9SKDEpXSArIGZmdFtGRlRfSURYX1IoMildIC0KKyAgICAgICAgICAgICAgICAgICBmZnRbRkZUX0lEWF9SKDMpXTsKKyAgbUh5YnJpZEltYWdbMl0gPSBmZnRbRkZUX0lEWF9JKDApXSAtIGZmdFtGRlRfSURYX0koMSldICsgZmZ0W0ZGVF9JRFhfSSgyKV0gLQorICAgICAgICAgICAgICAgICAgIGZmdFtGRlRfSURYX0koMyldOwogCi0gICAgLyoKLSAgICBmZnQgYmluIG09MjoKLSAgICBYWzIsIG5dID0geFswXSAtICAgeFsxXSArIHhbMl0gLSAgIHhbM10KLSAgICAqLwotICAgIG1IeWJyaWRSZWFsWzJdID0gZmZ0W0ZGVF9JRFhfUigwKV0gLSBmZnRbRkZUX0lEWF9SKDEpXSArIGZmdFtGRlRfSURYX1IoMildIC0gZmZ0W0ZGVF9JRFhfUigzKV07Ci0gICAgbUh5YnJpZEltYWdbMl0gPSBmZnRbRkZUX0lEWF9JKDApXSAtIGZmdFtGRlRfSURYX0koMSldICsgZmZ0W0ZGVF9JRFhfSSgyKV0gLSBmZnRbRkZUX0lEWF9JKDMpXTsKLQotICAgIC8qCi0gICAgZmZ0IGJpbiBtPTM6Ci0gICAgWFszLCBuXSA9IHhbMF0gKyBqKnhbMV0gLSB4WzJdIC0gaip4WzNdCi0gICAgKi8KLSAgICBtSHlicmlkUmVhbFszXSA9IGZmdFtGRlRfSURYX1IoMCldIC0gZmZ0W0ZGVF9JRFhfSSgxKV0gLSBmZnRbRkZUX0lEWF9SKDIpXSArIGZmdFtGRlRfSURYX0koMyldOwotICAgIG1IeWJyaWRJbWFnWzNdID0gZmZ0W0ZGVF9JRFhfSSgwKV0gKyBmZnRbRkZUX0lEWF9SKDEpXSAtIGZmdFtGRlRfSURYX0koMildIC0gZmZ0W0ZGVF9JRFhfUigzKV07CisgIC8qCisgIGZmdCBiaW4gbT0zOgorICBYWzMsIG5dID0geFswXSArIGoqeFsxXSAtIHhbMl0gLSBqKnhbM10KKyAgKi8KKyAgbUh5YnJpZFJlYWxbM10gPSBmZnRbRkZUX0lEWF9SKDApXSAtIGZmdFtGRlRfSURYX0koMSldIC0gZmZ0W0ZGVF9JRFhfUigyKV0gKworICAgICAgICAgICAgICAgICAgIGZmdFtGRlRfSURYX0koMyldOworICBtSHlicmlkSW1hZ1szXSA9IGZmdFtGRlRfSURYX0koMCldICsgZmZ0W0ZGVF9JRFhfUigxKV0gLSBmZnRbRkZUX0lEWF9JKDIpXSAtCisgICAgICAgICAgICAgICAgICAgZmZ0W0ZGVF9JRFhfUigzKV07CiB9CiAKK3N0YXRpYyB2b2lkIGVpZ2h0Q2hhbm5lbEZpbHRlcmluZyhjb25zdCBGSVhQX0RCTCAqY29uc3QgcFFtZlJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHBRbWZJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqY29uc3QgcFJlYWRJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNvbnN0IG1IeWJyaWRSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb25zdCBtSHlicmlkSW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaW52ZXJ0KSB7CisgIGNvbnN0IEZJWFBfSFRQICpwID0gSHliRmlsdGVyQ29lZjg7CisgIElOVCBrLCBzYzsKIAotc3RhdGljIHZvaWQgZWlnaHRDaGFubmVsRmlsdGVyaW5nKAotICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mUmVhbCwKLSAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcFFtZkltYWcsCi0gICAgICAgIGNvbnN0IElOVCAqY29uc3QgICAgICAgICAgIHBSZWFkSWR4LAotICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBtSHlicmlkUmVhbCwKLSAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgbUh5YnJpZEltYWcsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIGludmVydAotICAgICAgICApCi17Ci0gICAgY29uc3QgRklYUF9IVFAgKnAgPSBIeWJGaWx0ZXJDb2VmODsKLSAgICBJTlQgaywgc2M7CisgIEZJWFBfREJMIG1mZnRbMTYgKyBBTElHTk1FTlRfREVGQVVMVF07CisgIEZJWFBfREJMICpwZmZ0ID0gKEZJWFBfREJMICopQUxJR05fUFRSKG1mZnQpOwogCi0gICAgRklYUF9EQkwgbWZmdFsxNitBTElHTk1FTlRfREVGQVVMVF07Ci0gICAgRklYUF9EQkwgKnBmZnQgPSAoRklYUF9EQkwqKUFMSUdOX1BUUihtZmZ0KTsKKyAgRklYUF9EQkwgYWNjdTEsIGFjY3UyLCBhY2N1MywgYWNjdTQ7CiAKLSAgICBGSVhQX0RCTCBhY2N1MSwgYWNjdTIsIGFjY3UzLCBhY2N1NDsKKyAgLyogcHJlIHR3aWRkZWxpbmcgKi8KKyAgcGZmdFtGRlRfSURYX1IoMCldID0KKyAgICAgIHBRbWZSZWFsW3BSZWFkSWR4WzZdXSA+PgorICAgICAgKDMgKyAxKTsgLyogZk11bHREaXYyKHBbMF0udi5yZSwgcFFtZlJlYWxbcFJlYWRJZHhbNl1dKTsgKi8KKyAgcGZmdFtGRlRfSURYX0koMCldID0KKyAgICAgIHBRbWZJbWFnW3BSZWFkSWR4WzZdXSA+PgorICAgICAgKDMgKyAxKTsgLyogZk11bHREaXYyKHBbMF0udi5yZSwgcFFtZkltYWdbcFJlYWRJZHhbNl1dKTsgKi8KIAotICAgIC8qIHByZSB0d2lkZGVsaW5nICovCi0gICAgcGZmdFtGRlRfSURYX1IoMCldID0gZk11bHREaXYyKHBbMF0udi5yZSwgcFFtZlJlYWxbcFJlYWRJZHhbNl1dKTsKLSAgICBwZmZ0W0ZGVF9JRFhfSSgwKV0gPSBmTXVsdERpdjIocFswXS52LnJlLCBwUW1mSW1hZ1twUmVhZElkeFs2XV0pOworICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIHBRbWZSZWFsW3BSZWFkSWR4WzddXSwgcFFtZkltYWdbcFJlYWRJZHhbN11dLAorICAgICAgICAgICAgICAgcFsxXSk7CisgIHBmZnRbRkZUX0lEWF9SKDEpXSA9IGFjY3UxOworICBwZmZ0W0ZGVF9JRFhfSSgxKV0gPSBhY2N1MjsKIAotICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgcFFtZlJlYWxbcFJlYWRJZHhbN11dLCBwUW1mSW1hZ1twUmVhZElkeFs3XV0sIHBbMV0pOwotICAgIHBmZnRbRkZUX0lEWF9SKDEpXSA9IGFjY3UxOwotICAgIHBmZnRbRkZUX0lEWF9JKDEpXSA9IGFjY3UyOworICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIHBRbWZSZWFsW3BSZWFkSWR4WzBdXSwgcFFtZkltYWdbcFJlYWRJZHhbMF1dLAorICAgICAgICAgICAgICAgcFsyXSk7CisgIGNwbHhNdWx0RGl2MigmYWNjdTMsICZhY2N1NCwgcFFtZlJlYWxbcFJlYWRJZHhbOF1dLCBwUW1mSW1hZ1twUmVhZElkeFs4XV0sCisgICAgICAgICAgICAgICBwWzNdKTsKKyAgcGZmdFtGRlRfSURYX1IoMildID0gYWNjdTEgKyBhY2N1MzsKKyAgcGZmdFtGRlRfSURYX0koMildID0gYWNjdTIgKyBhY2N1NDsKIAotICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgcFFtZlJlYWxbcFJlYWRJZHhbMF1dLCBwUW1mSW1hZ1twUmVhZElkeFswXV0sIHBbMl0pOwotICAgIGNwbHhNdWx0RGl2MigmYWNjdTMsICZhY2N1NCwgcFFtZlJlYWxbcFJlYWRJZHhbOF1dLCBwUW1mSW1hZ1twUmVhZElkeFs4XV0sIHBbM10pOwotICAgIHBmZnRbRkZUX0lEWF9SKDIpXSA9IGFjY3UxICsgYWNjdTM7Ci0gICAgcGZmdFtGRlRfSURYX0koMildID0gYWNjdTIgKyBhY2N1NDsKKyAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBwUW1mUmVhbFtwUmVhZElkeFsxXV0sIHBRbWZJbWFnW3BSZWFkSWR4WzFdXSwKKyAgICAgICAgICAgICAgIHBbNF0pOworICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIHBRbWZSZWFsW3BSZWFkSWR4WzldXSwgcFFtZkltYWdbcFJlYWRJZHhbOV1dLAorICAgICAgICAgICAgICAgcFs1XSk7CisgIHBmZnRbRkZUX0lEWF9SKDMpXSA9IGFjY3UxICsgYWNjdTM7CisgIHBmZnRbRkZUX0lEWF9JKDMpXSA9IGFjY3UyICsgYWNjdTQ7CiAKLSAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIHBRbWZSZWFsW3BSZWFkSWR4WzFdXSwgcFFtZkltYWdbcFJlYWRJZHhbMV1dLCBwWzRdKTsKLSAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIHBRbWZSZWFsW3BSZWFkSWR4WzldXSwgcFFtZkltYWdbcFJlYWRJZHhbOV1dLCBwWzVdKTsKLSAgICBwZmZ0W0ZGVF9JRFhfUigzKV0gPSBhY2N1MSArIGFjY3UzOwotICAgIHBmZnRbRkZUX0lEWF9JKDMpXSA9IGFjY3UyICsgYWNjdTQ7CisgIHBmZnRbRkZUX0lEWF9SKDQpXSA9IGZNdWx0RGl2MihwUW1mSW1hZ1twUmVhZElkeFsxMF1dLCBwWzddLnYuaW0pIC0KKyAgICAgICAgICAgICAgICAgICAgICAgZk11bHREaXYyKHBRbWZJbWFnW3BSZWFkSWR4WzJdXSwgcFs2XS52LmltKTsKKyAgcGZmdFtGRlRfSURYX0koNCldID0gZk11bHREaXYyKHBRbWZSZWFsW3BSZWFkSWR4WzJdXSwgcFs2XS52LmltKSAtCisgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihwUW1mUmVhbFtwUmVhZElkeFsxMF1dLCBwWzddLnYuaW0pOwogCi0gICAgcGZmdFtGRlRfSURYX1IoNCldID0gZk11bHREaXYyKHBRbWZJbWFnW3BSZWFkSWR4WzEwXV0sIHBbN10udi5pbSkgLSBmTXVsdERpdjIocFFtZkltYWdbcFJlYWRJZHhbIDJdXSwgcFs2XS52LmltKTsKLSAgICBwZmZ0W0ZGVF9JRFhfSSg0KV0gPSBmTXVsdERpdjIocFFtZlJlYWxbcFJlYWRJZHhbIDJdXSwgcFs2XS52LmltKSAtIGZNdWx0RGl2MihwUW1mUmVhbFtwUmVhZElkeFsxMF1dLCBwWzddLnYuaW0pOworICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIHBRbWZSZWFsW3BSZWFkSWR4WzNdXSwgcFFtZkltYWdbcFJlYWRJZHhbM11dLAorICAgICAgICAgICAgICAgcFs4XSk7CisgIGNwbHhNdWx0RGl2MigmYWNjdTMsICZhY2N1NCwgcFFtZlJlYWxbcFJlYWRJZHhbMTFdXSwgcFFtZkltYWdbcFJlYWRJZHhbMTFdXSwKKyAgICAgICAgICAgICAgIHBbOV0pOworICBwZmZ0W0ZGVF9JRFhfUig1KV0gPSBhY2N1MSArIGFjY3UzOworICBwZmZ0W0ZGVF9JRFhfSSg1KV0gPSBhY2N1MiArIGFjY3U0OwogCi0gICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBwUW1mUmVhbFtwUmVhZElkeFsgM11dLCBwUW1mSW1hZ1twUmVhZElkeFsgM11dLCBwWzhdKTsKLSAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIHBRbWZSZWFsW3BSZWFkSWR4WzExXV0sIHBRbWZJbWFnW3BSZWFkSWR4WzExXV0sIHBbOV0pOwotICAgIHBmZnRbRkZUX0lEWF9SKDUpXSA9IGFjY3UxICsgYWNjdTM7Ci0gICAgcGZmdFtGRlRfSURYX0koNSldID0gYWNjdTIgKyBhY2N1NDsKKyAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBwUW1mUmVhbFtwUmVhZElkeFs0XV0sIHBRbWZJbWFnW3BSZWFkSWR4WzRdXSwKKyAgICAgICAgICAgICAgIHBbMTBdKTsKKyAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCBwUW1mUmVhbFtwUmVhZElkeFsxMl1dLCBwUW1mSW1hZ1twUmVhZElkeFsxMl1dLAorICAgICAgICAgICAgICAgcFsxMV0pOworICBwZmZ0W0ZGVF9JRFhfUig2KV0gPSBhY2N1MSArIGFjY3UzOworICBwZmZ0W0ZGVF9JRFhfSSg2KV0gPSBhY2N1MiArIGFjY3U0OwogCi0gICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBwUW1mUmVhbFtwUmVhZElkeFsgNF1dLCBwUW1mSW1hZ1twUmVhZElkeFsgNF1dLCBwWzEwXSk7Ci0gICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCBwUW1mUmVhbFtwUmVhZElkeFsxMl1dLCBwUW1mSW1hZ1twUmVhZElkeFsxMl1dLCBwWzExXSk7Ci0gICAgcGZmdFtGRlRfSURYX1IoNildID0gYWNjdTEgKyBhY2N1MzsKLSAgICBwZmZ0W0ZGVF9JRFhfSSg2KV0gPSBhY2N1MiArIGFjY3U0OworICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIHBRbWZSZWFsW3BSZWFkSWR4WzVdXSwgcFFtZkltYWdbcFJlYWRJZHhbNV1dLAorICAgICAgICAgICAgICAgcFsxMl0pOworICBwZmZ0W0ZGVF9JRFhfUig3KV0gPSBhY2N1MTsKKyAgcGZmdFtGRlRfSURYX0koNyldID0gYWNjdTI7CiAKLSAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIHBRbWZSZWFsW3BSZWFkSWR4WyA1XV0sIHBRbWZJbWFnW3BSZWFkSWR4WyA1XV0sIHBbMTJdKTsKLSAgICBwZmZ0W0ZGVF9JRFhfUig3KV0gPSBhY2N1MTsKLSAgICBwZmZ0W0ZGVF9JRFhfSSg3KV0gPSBhY2N1MjsKKyAgLyogZmZ0IG1vZHVsYXRpb24gKi8KKyAgZmZ0XzgocGZmdCk7CisgIHNjID0gMSArIDI7CiAKLSAgICAvKiBmZnQgbW9kdWxhdGlvbiAqLwotICAgIGZmdF84IChwZmZ0KTsKLSAgICBzYyA9IDEgKyAyOworICBpZiAoaW52ZXJ0KSB7CisgICAgbUh5YnJpZFJlYWxbMF0gPSBwZmZ0W0ZGVF9JRFhfUig3KV0gPDwgc2M7CisgICAgbUh5YnJpZEltYWdbMF0gPSBwZmZ0W0ZGVF9JRFhfSSg3KV0gPDwgc2M7CisgICAgbUh5YnJpZFJlYWxbMV0gPSBwZmZ0W0ZGVF9JRFhfUigwKV0gPDwgc2M7CisgICAgbUh5YnJpZEltYWdbMV0gPSBwZmZ0W0ZGVF9JRFhfSSgwKV0gPDwgc2M7CiAKLSAgICBpZiAoaW52ZXJ0KSB7Ci0gICAgICBtSHlicmlkUmVhbFswXSAgPSBwZmZ0W0ZGVF9JRFhfUig3KV0gPDwgc2M7Ci0gICAgICBtSHlicmlkSW1hZ1swXSAgPSBwZmZ0W0ZGVF9JRFhfSSg3KV0gPDwgc2M7Ci0gICAgICBtSHlicmlkUmVhbFsxXSAgPSBwZmZ0W0ZGVF9JRFhfUigwKV0gPDwgc2M7Ci0gICAgICBtSHlicmlkSW1hZ1sxXSAgPSBwZmZ0W0ZGVF9JRFhfSSgwKV0gPDwgc2M7CisgICAgbUh5YnJpZFJlYWxbMl0gPSBwZmZ0W0ZGVF9JRFhfUig2KV0gPDwgc2M7CisgICAgbUh5YnJpZEltYWdbMl0gPSBwZmZ0W0ZGVF9JRFhfSSg2KV0gPDwgc2M7CisgICAgbUh5YnJpZFJlYWxbM10gPSBwZmZ0W0ZGVF9JRFhfUigxKV0gPDwgc2M7CisgICAgbUh5YnJpZEltYWdbM10gPSBwZmZ0W0ZGVF9JRFhfSSgxKV0gPDwgc2M7CiAKLSAgICAgIG1IeWJyaWRSZWFsWzJdICA9IHBmZnRbRkZUX0lEWF9SKDYpXSA8PCBzYzsKLSAgICAgIG1IeWJyaWRJbWFnWzJdICA9IHBmZnRbRkZUX0lEWF9JKDYpXSA8PCBzYzsKLSAgICAgIG1IeWJyaWRSZWFsWzNdICA9IHBmZnRbRkZUX0lEWF9SKDEpXSA8PCBzYzsKLSAgICAgIG1IeWJyaWRJbWFnWzNdICA9IHBmZnRbRkZUX0lEWF9JKDEpXSA8PCBzYzsKKyAgICBtSHlicmlkUmVhbFs0XSA9IHBmZnRbRkZUX0lEWF9SKDIpXSA8PCBzYzsKKyAgICBtSHlicmlkUmVhbFs0XSArPSBwZmZ0W0ZGVF9JRFhfUig1KV0gPDwgc2M7CisgICAgbUh5YnJpZEltYWdbNF0gPSBwZmZ0W0ZGVF9JRFhfSSgyKV0gPDwgc2M7CisgICAgbUh5YnJpZEltYWdbNF0gKz0gcGZmdFtGRlRfSURYX0koNSldIDw8IHNjOwogCi0gICAgICBtSHlicmlkUmVhbFs0XSAgPSBwZmZ0W0ZGVF9JRFhfUigyKV0gPDwgc2M7Ci0gICAgICBtSHlicmlkUmVhbFs0XSArPSBwZmZ0W0ZGVF9JRFhfUig1KV0gPDwgc2M7Ci0gICAgICBtSHlicmlkSW1hZ1s0XSAgPSBwZmZ0W0ZGVF9JRFhfSSgyKV0gPDwgc2M7Ci0gICAgICBtSHlicmlkSW1hZ1s0XSArPSBwZmZ0W0ZGVF9JRFhfSSg1KV0gPDwgc2M7Ci0KLSAgICAgIG1IeWJyaWRSZWFsWzVdICA9IHBmZnRbRkZUX0lEWF9SKDMpXSA8PCBzYzsKLSAgICAgIG1IeWJyaWRSZWFsWzVdICs9IHBmZnRbRkZUX0lEWF9SKDQpXSA8PCBzYzsKLSAgICAgIG1IeWJyaWRJbWFnWzVdICA9IHBmZnRbRkZUX0lEWF9JKDMpXSA8PCBzYzsKLSAgICAgIG1IeWJyaWRJbWFnWzVdICs9IHBmZnRbRkZUX0lEWF9JKDQpXSA8PCBzYzsKKyAgICBtSHlicmlkUmVhbFs1XSA9IHBmZnRbRkZUX0lEWF9SKDMpXSA8PCBzYzsKKyAgICBtSHlicmlkUmVhbFs1XSArPSBwZmZ0W0ZGVF9JRFhfUig0KV0gPDwgc2M7CisgICAgbUh5YnJpZEltYWdbNV0gPSBwZmZ0W0ZGVF9JRFhfSSgzKV0gPDwgc2M7CisgICAgbUh5YnJpZEltYWdbNV0gKz0gcGZmdFtGRlRfSURYX0koNCldIDw8IHNjOworICB9IGVsc2UgeworICAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspIHsKKyAgICAgIG1IeWJyaWRSZWFsW2tdID0gcGZmdFtGRlRfSURYX1IoayldIDw8IHNjOworICAgICAgbUh5YnJpZEltYWdba10gPSBwZmZ0W0ZGVF9JRFhfSShrKV0gPDwgc2M7CiAgICAgfQotICAgIGVsc2UgewotICAgICAgZm9yKGs9MDsgazw4O2srKyApIHsKLSAgICAgICAgbUh5YnJpZFJlYWxba10gPSBwZmZ0W0ZGVF9JRFhfUihrKV0gPDwgc2M7Ci0gICAgICAgIG1IeWJyaWRJbWFnW2tdID0gcGZmdFtGRlRfSURYX0koayldIDw8IHNjOwotICAgICAgfQotICAgIH0KKyAgfQogfQogCi1zdGF0aWMgSU5UIGtDaGFubmVsRmlsdGVyaW5nKAotICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgICAgICBwUW1mUmVhbCwKLSAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcFFtZkltYWcsCi0gICAgICAgIGNvbnN0IElOVCAqY29uc3QgICAgICAgICAgIHBSZWFkSWR4LAotICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBtSHlicmlkUmVhbCwKLSAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgbUh5YnJpZEltYWcsCi0gICAgICAgIGNvbnN0IFNDSEFSICAgICAgICAgICAgICAgIGh5YnJpZENvbmZpZwotICAgICAgICApCi17Ci0gICAgSU5UIGVyciA9IDA7CitzdGF0aWMgSU5UIGtDaGFubmVsRmlsdGVyaW5nKGNvbnN0IEZJWFBfREJMICpjb25zdCBwUW1mUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHBRbWZJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgKmNvbnN0IHBSZWFkSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqY29uc3QgbUh5YnJpZFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb25zdCBtSHlicmlkSW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NIQVIgaHlicmlkQ29uZmlnKSB7CisgIElOVCBlcnIgPSAwOwogCi0gICAgc3dpdGNoIChoeWJyaWRDb25maWcpIHsKLSAgICAgIGNhc2UgIDI6Ci0gICAgICBjYXNlIC0yOgotICAgICAgICBkdWFsQ2hhbm5lbEZpbHRlcmluZyhwUW1mUmVhbCwgcFFtZkltYWcsIHBSZWFkSWR4LCBtSHlicmlkUmVhbCwgbUh5YnJpZEltYWcsIChoeWJyaWRDb25maWc8MCkgPyAxIDogMCApOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgIDQ6Ci0gICAgICBjYXNlIC00OgotICAgICAgICBmb3VyQ2hhbm5lbEZpbHRlcmluZyhwUW1mUmVhbCwgcFFtZkltYWcsIHBSZWFkSWR4LCBtSHlicmlkUmVhbCwgbUh5YnJpZEltYWcsIChoeWJyaWRDb25maWc8MCkgPyAxIDogMCApOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgIDg6Ci0gICAgICBjYXNlIC04OgotICAgICAgICBlaWdodENoYW5uZWxGaWx0ZXJpbmcocFFtZlJlYWwsIHBRbWZJbWFnLCBwUmVhZElkeCwgbUh5YnJpZFJlYWwsIG1IeWJyaWRJbWFnLCAoaHlicmlkQ29uZmlnPDApID8gMSA6IDAgKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBlcnIgPSAtMTsKLSAgICB9CisgIHN3aXRjaCAoaHlicmlkQ29uZmlnKSB7CisgICAgY2FzZSAyOgorICAgIGNhc2UgLTI6CisgICAgICBkdWFsQ2hhbm5lbEZpbHRlcmluZyhwUW1mUmVhbCwgcFFtZkltYWcsIHBSZWFkSWR4LCBtSHlicmlkUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IeWJyaWRJbWFnLCAoaHlicmlkQ29uZmlnIDwgMCkgPyAxIDogMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgY2FzZSAtNDoKKyAgICAgIGZvdXJDaGFubmVsRmlsdGVyaW5nKHBRbWZSZWFsLCBwUW1mSW1hZywgcFJlYWRJZHgsIG1IeWJyaWRSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbUh5YnJpZEltYWcsIChoeWJyaWRDb25maWcgPCAwKSA/IDEgOiAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICBjYXNlIC04OgorICAgICAgZWlnaHRDaGFubmVsRmlsdGVyaW5nKHBRbWZSZWFsLCBwUW1mSW1hZywgcFJlYWRJZHgsIG1IeWJyaWRSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IeWJyaWRJbWFnLCAoaHlicmlkQ29uZmlnIDwgMCkgPyAxIDogMCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZXJyID0gLTE7CisgIH0KIAotICAgIHJldHVybiBlcnI7CisgIHJldHVybiBlcnI7CiB9Ci0KLQotCmRpZmYgLS1naXQgYS9saWJGREsvc3JjL0ZES19scGMuY3BwIGIvbGliRkRLL3NyYy9GREtfbHBjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDdlNjkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliRkRLL3NyYy9GREtfbHBjLmNwcApAQCAtMCwwICsxLDQ4NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgorCisgICBEZXNjcmlwdGlvbjogTFBDIHJlbGF0ZWQgZnVuY3Rpb25zCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJGREtfbHBjLmgiCisKKy8qIEludGVybmFsIHNjYWxpbmcgb2YgTFBDIHN5bnRoZXNpcyB0byBhdm9pZCBvdmVyZmxvdyBvZiBmaWx0ZSBzdGF0ZXMuCisgICBUaGlzIGRlcGVuZHMgb24gdGhlIExQQyBvcmRlciwgYmVjYXVzZSB0aGUgTFBDIG9yZGVyIGRlZmluZXMgdGhlIGFtb3VudAorICAgb2YgTUFDIG9wZXJhdGlvbnMuICovCitzdGF0aWMgU0NIQVIgb3JkZXJfbGRbTFBDX01BWF9PUkRFUl0gPSB7CisgICAgLyogQXNzdW1lIHRoYXQgU3ludGhlc2lzIGZpbHRlciBvdXRwdXQgZG9lcyBub3QgY2xpcCBhbmQgZmlsdGVyCisgICAgICAgYWNjdSBkb2VzIGNoYW5nZSBubyBtb3JlIHRoYW4gMS4wIGZvciBlYWNoIGl0ZXJhdGlvbi4KKyAgICAgICBjZWlsKDAuNSpsb2coKDE6MjQpKS9sb2coMikpICovCisgICAgMCwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgMywgMywgMywgM307CisKKy8qIElJUkxhdHRpY2UgKi8KKyNpZm5kZWYgRlVOQ1RJT05fQ0xwY19TeW50aGVzaXNMYXR0aWNlX1NHTAordm9pZCBDTHBjX1N5bnRoZXNpc0xhdHRpY2UoRklYUF9EQkwgKnNpZ25hbCwgY29uc3QgaW50IHNpZ25hbF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNpZ25hbF9lLCBjb25zdCBpbnQgc2lnbmFsX2Vfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGluYywgY29uc3QgRklYUF9TR0wgKmNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG9yZGVyLCBGSVhQX0RCTCAqc3RhdGUpIHsKKyAgaW50IGksIGo7CisgIEZJWFBfREJMICpwU2lnbmFsOworICBpbnQgc2hpZnQ7CisKKyAgRkRLX0FTU0VSVChvcmRlciA8PSBMUENfTUFYX09SREVSKTsKKyAgRkRLX0FTU0VSVChvcmRlciA+IDApOworCisgIGlmIChpbmMgPT0gLTEpCisgICAgcFNpZ25hbCA9ICZzaWduYWxbc2lnbmFsX3NpemUgLSAxXTsKKyAgZWxzZQorICAgIHBTaWduYWwgPSAmc2lnbmFsWzBdOworCisgIC8qCisgICAgdG1wID0geChrKSAtIEsoTSkqZyhNKTsKKyAgICBmb3IgbT1NLTE6LTE6MQorICAgICAgICAgICAgdG1wID0gdG1wIC0gSyhtKSAqIGcobSk7CisgICAgICAgICAgICBnKG0rMSkgPSBnKG0pICsgSyhtKSAqIHRtcDsKKyAgICBlbmRmb3IKKyAgICBnKDEpID0gdG1wOworCisgICAgeShrKSA9IHRtcDsKKyAgKi8KKworICBzaGlmdCA9IC1vcmRlcl9sZFtvcmRlciAtIDFdOworCisgIGZvciAoaSA9IHNpZ25hbF9zaXplOyBpICE9IDA7IGktLSkgeworICAgIEZJWFBfREJMICpwU3RhdGUgPSBzdGF0ZSArIG9yZGVyIC0gMTsKKyAgICBjb25zdCBGSVhQX1NHTCAqcENvZWZmID0gY29lZmYgKyBvcmRlciAtIDE7CisgICAgRklYUF9EQkwgdG1wOworCisgICAgdG1wID0gc2NhbGVWYWx1ZSgqcFNpZ25hbCwgc2hpZnQgKyBzaWduYWxfZSkgLQorICAgICAgICAgIGZNdWx0RGl2MigqcENvZWZmLS0sICpwU3RhdGUtLSk7CisgICAgZm9yIChqID0gb3JkZXIgLSAxOyBqICE9IDA7IGotLSkgeworICAgICAgdG1wID0gZk11bHRTdWJEaXYyKHRtcCwgcENvZWZmWzBdLCBwU3RhdGVbMF0pOworICAgICAgcFN0YXRlWzFdID0gcFN0YXRlWzBdICsgKGZNdWx0RGl2MigqcENvZWZmLS0sIHRtcCkgPDwgMik7CisgICAgICBwU3RhdGUtLTsKKyAgICB9CisKKyAgICAqcFNpZ25hbCA9IHNjYWxlVmFsdWVTYXR1cmF0ZSh0bXAsIC1zaGlmdCAtIHNpZ25hbF9lX291dCk7CisKKyAgICAvKiBleHBvbmVudCBvZiBzdGF0ZVtdIGlzIC0xICovCisgICAgcFN0YXRlWzFdID0gdG1wIDw8IDE7CisgICAgcFNpZ25hbCArPSBpbmM7CisgIH0KK30KKyNlbmRpZgorCisjaWZuZGVmIEZVTkNUSU9OX0NMcGNfU3ludGhlc2lzTGF0dGljZV9EQkwKK3ZvaWQgQ0xwY19TeW50aGVzaXNMYXR0aWNlKEZJWFBfREJMICpzaWduYWwsIGNvbnN0IGludCBzaWduYWxfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzaWduYWxfZSwgY29uc3QgaW50IHNpZ25hbF9lX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbmMsIGNvbnN0IEZJWFBfREJMICpjb2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvcmRlciwgRklYUF9EQkwgKnN0YXRlKSB7CisgIGludCBpLCBqOworICBGSVhQX0RCTCAqcFNpZ25hbDsKKworICBGREtfQVNTRVJUKG9yZGVyIDw9IExQQ19NQVhfT1JERVIpOworICBGREtfQVNTRVJUKG9yZGVyID4gMCk7CisKKyAgaWYgKGluYyA9PSAtMSkKKyAgICBwU2lnbmFsID0gJnNpZ25hbFtzaWduYWxfc2l6ZSAtIDFdOworICBlbHNlCisgICAgcFNpZ25hbCA9ICZzaWduYWxbMF07CisKKyAgRkRLX0FTU0VSVChzaWduYWxfc2l6ZSA+IDApOworICBmb3IgKGkgPSBzaWduYWxfc2l6ZTsgaSAhPSAwOyBpLS0pIHsKKyAgICBGSVhQX0RCTCAqcFN0YXRlID0gc3RhdGUgKyBvcmRlciAtIDE7CisgICAgY29uc3QgRklYUF9EQkwgKnBDb2VmZiA9IGNvZWZmICsgb3JkZXIgLSAxOworICAgIEZJWFBfREJMIHRtcCwgYWNjdTsKKworICAgIGFjY3UgPQorICAgICAgICBmTXVsdFN1YkRpdjIoc2NhbGVWYWx1ZSgqcFNpZ25hbCwgc2lnbmFsX2UgLSAxKSwgKnBDb2VmZi0tLCAqcFN0YXRlLS0pOworICAgIHRtcCA9IFNBVFVSQVRFX0xFRlRfU0hJRlRfQUxUKGFjY3UsIDEsIERGUkFDVF9CSVRTKTsKKworICAgIGZvciAoaiA9IG9yZGVyIC0gMTsgaiAhPSAwOyBqLS0pIHsKKyAgICAgIGFjY3UgPSBmTXVsdFN1YkRpdjIodG1wID4+IDEsIHBDb2VmZlswXSwgcFN0YXRlWzBdKTsKKyAgICAgIHRtcCA9IFNBVFVSQVRFX0xFRlRfU0hJRlRfQUxUKGFjY3UsIDEsIERGUkFDVF9CSVRTKTsKKworICAgICAgYWNjdSA9IGZNdWx0QWRkRGl2MihwU3RhdGVbMF0gPj4gMSwgKnBDb2VmZi0tLCB0bXApOworICAgICAgcFN0YXRlWzFdID0gU0FUVVJBVEVfTEVGVF9TSElGVF9BTFQoYWNjdSwgMSwgREZSQUNUX0JJVFMpOworCisgICAgICBwU3RhdGUtLTsKKyAgICB9CisKKyAgICAqcFNpZ25hbCA9IHNjYWxlVmFsdWUodG1wLCAtc2lnbmFsX2Vfb3V0KTsKKworICAgIC8qIGV4cG9uZW50IG9mIHN0YXRlW10gaXMgMCAqLworICAgIHBTdGF0ZVsxXSA9IHRtcDsKKyAgICBwU2lnbmFsICs9IGluYzsKKyAgfQorfQorCisjZW5kaWYKKworLyogTFBDX1NZTlRIRVNJU19JSVIgdmVyc2lvbiAqLwordm9pZCBDTHBjX1N5bnRoZXNpcyhGSVhQX0RCTCAqc2lnbmFsLCBjb25zdCBpbnQgc2lnbmFsX3NpemUsIGNvbnN0IGludCBzaWduYWxfZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGluYywgY29uc3QgRklYUF9MUENfVE5TICpscGNDb2VmZl9tLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbHBjQ29lZmZfZSwgY29uc3QgaW50IG9yZGVyLCBGSVhQX0RCTCAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgIGludCAqcFN0YXRlSW5kZXgpIHsKKyAgaW50IGksIGo7CisgIEZJWFBfREJMICpwU2lnbmFsOworICBpbnQgc3RhdGVJbmRleCA9ICpwU3RhdGVJbmRleDsKKworICBGSVhQX0xQQ19UTlMgY29lZmZbMiAqIExQQ19NQVhfT1JERVJdOworICBGREttZW1jcHkoJmNvZWZmWzBdLCBscGNDb2VmZl9tLCBvcmRlciAqIHNpemVvZihGSVhQX0xQQ19UTlMpKTsKKyAgRkRLbWVtY3B5KCZjb2VmZltvcmRlcl0sIGxwY0NvZWZmX20sIG9yZGVyICogc2l6ZW9mKEZJWFBfTFBDX1ROUykpOworCisgIEZES19BU1NFUlQob3JkZXIgPD0gTFBDX01BWF9PUkRFUik7CisgIEZES19BU1NFUlQoc3RhdGVJbmRleCA8IG9yZGVyKTsKKworICBpZiAoaW5jID09IC0xKQorICAgIHBTaWduYWwgPSAmc2lnbmFsW3NpZ25hbF9zaXplIC0gMV07CisgIGVsc2UKKyAgICBwU2lnbmFsID0gJnNpZ25hbFswXTsKKworICAvKiB5KG4pID0geChuKSAtIGxwY1sxXSp5KG4tMSkgLSAuLi4gLSBscGNbb3JkZXJdKnkobi1vcmRlcikgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgc2lnbmFsX3NpemU7IGkrKykgeworICAgIEZJWFBfREJMIHg7CisgICAgY29uc3QgRklYUF9MUENfVE5TICpwQ29lZmYgPSBjb2VmZiArIG9yZGVyIC0gc3RhdGVJbmRleDsKKworICAgIHggPSBzY2FsZVZhbHVlKCpwU2lnbmFsLCAtKGxwY0NvZWZmX2UgKyAxKSk7CisgICAgZm9yIChqID0gMDsgaiA8IG9yZGVyOyBqKyspIHsKKyAgICAgIHggLT0gZk11bHREaXYyKHN0YXRlW2pdLCBwQ29lZmZbal0pOworICAgIH0KKyAgICB4ID0gU0FUVVJBVEVfU0hJRlQoeCwgLWxwY0NvZWZmX2UgLSAxLCBERlJBQ1RfQklUUyk7CisKKyAgICAvKiBVcGRhdGUgc3RhdGVzICovCisgICAgc3RhdGVJbmRleCA9ICgoc3RhdGVJbmRleCAtIDEpIDwgMCkgPyAob3JkZXIgLSAxKSA6IChzdGF0ZUluZGV4IC0gMSk7CisgICAgc3RhdGVbc3RhdGVJbmRleF0gPSB4OworCisgICAgKnBTaWduYWwgPSBzY2FsZVZhbHVlKHgsIHNpZ25hbF9lKTsKKyAgICBwU2lnbmFsICs9IGluYzsKKyAgfQorCisgICpwU3RhdGVJbmRleCA9IHN0YXRlSW5kZXg7Cit9CisvKiBkZWZhdWx0IHZlcnNpb24gKi8KK3ZvaWQgQ0xwY19TeW50aGVzaXMoRklYUF9EQkwgKnNpZ25hbCwgY29uc3QgaW50IHNpZ25hbF9zaXplLCBjb25zdCBpbnQgc2lnbmFsX2UsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbmMsIGNvbnN0IEZJWFBfTFBDICpscGNDb2VmZl9tLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbHBjQ29lZmZfZSwgY29uc3QgaW50IG9yZGVyLCBGSVhQX0RCTCAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgIGludCAqcFN0YXRlSW5kZXgpIHsKKyAgaW50IGksIGo7CisgIEZJWFBfREJMICpwU2lnbmFsOworICBpbnQgc3RhdGVJbmRleCA9ICpwU3RhdGVJbmRleDsKKworICBGSVhQX0xQQyBjb2VmZlsyICogTFBDX01BWF9PUkRFUl07CisgIEZES21lbWNweSgmY29lZmZbMF0sIGxwY0NvZWZmX20sIG9yZGVyICogc2l6ZW9mKEZJWFBfTFBDKSk7CisgIEZES21lbWNweSgmY29lZmZbb3JkZXJdLCBscGNDb2VmZl9tLCBvcmRlciAqIHNpemVvZihGSVhQX0xQQykpOworCisgIEZES19BU1NFUlQob3JkZXIgPD0gTFBDX01BWF9PUkRFUik7CisgIEZES19BU1NFUlQoc3RhdGVJbmRleCA8IG9yZGVyKTsKKworICBpZiAoaW5jID09IC0xKQorICAgIHBTaWduYWwgPSAmc2lnbmFsW3NpZ25hbF9zaXplIC0gMV07CisgIGVsc2UKKyAgICBwU2lnbmFsID0gJnNpZ25hbFswXTsKKworICAvKiB5KG4pID0geChuKSAtIGxwY1sxXSp5KG4tMSkgLSAuLi4gLSBscGNbb3JkZXJdKnkobi1vcmRlcikgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgc2lnbmFsX3NpemU7IGkrKykgeworICAgIEZJWFBfREJMIHg7CisgICAgY29uc3QgRklYUF9MUEMgKnBDb2VmZiA9IGNvZWZmICsgb3JkZXIgLSBzdGF0ZUluZGV4OworCisgICAgeCA9IHNjYWxlVmFsdWUoKnBTaWduYWwsIC0obHBjQ29lZmZfZSArIDEpKTsKKyAgICBmb3IgKGogPSAwOyBqIDwgb3JkZXI7IGorKykgeworICAgICAgeCAtPSBmTXVsdERpdjIoc3RhdGVbal0sIHBDb2VmZltqXSk7CisgICAgfQorICAgIHggPSBTQVRVUkFURV9TSElGVCh4LCAtbHBjQ29lZmZfZSAtIDEsIERGUkFDVF9CSVRTKTsKKworICAgIC8qIFVwZGF0ZSBzdGF0ZXMgKi8KKyAgICBzdGF0ZUluZGV4ID0gKChzdGF0ZUluZGV4IC0gMSkgPCAwKSA/IChvcmRlciAtIDEpIDogKHN0YXRlSW5kZXggLSAxKTsKKyAgICBzdGF0ZVtzdGF0ZUluZGV4XSA9IHg7CisKKyAgICAqcFNpZ25hbCA9IHNjYWxlVmFsdWUoeCwgc2lnbmFsX2UpOworICAgIHBTaWduYWwgKz0gaW5jOworICB9CisKKyAgKnBTdGF0ZUluZGV4ID0gc3RhdGVJbmRleDsKK30KKworLyogRklSICovCit2b2lkIENMcGNfQW5hbHlzaXMoRklYUF9EQkwgKlJFU1RSSUNUIHNpZ25hbCwgY29uc3QgaW50IHNpZ25hbF9zaXplLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfTFBDIGxwY0NvZWZmX21bXSwgY29uc3QgaW50IGxwY0NvZWZmX2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG9yZGVyLCBGSVhQX0RCTCAqUkVTVFJJQ1QgZmlsdFN0YXRlLAorICAgICAgICAgICAgICAgICAgIGludCAqZmlsdFN0YXRlSW5kZXgpIHsKKyAgaW50IHN0YXRlSW5kZXg7CisgIElOVCBpLCBqLCBzaGlmdCA9IGxwY0NvZWZmX2UgKyAxOyAvKiArMSwgYmVjYXVzZSBmTXVsdERpdjIgKi8KKyAgRklYUF9EQkwgdG1wOworCisgIGlmIChvcmRlciA8PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChmaWx0U3RhdGVJbmRleCAhPSBOVUxMKSB7CisgICAgc3RhdGVJbmRleCA9ICpmaWx0U3RhdGVJbmRleDsKKyAgfSBlbHNlIHsKKyAgICBzdGF0ZUluZGV4ID0gMDsKKyAgfQorCisgIC8qIGtlZXAgZmlsdGVyIGNvZWZmaWNpZW50cyB0d2ljZSBhbmQgc2F2ZSBtZW1vcnkgY29weSBvcGVyYXRpb24gaW4KKyAgICAgbW9kdWxvIHN0YXRlIGJ1ZmZlciAqLworICBGSVhQX0xQQyBjb2VmZlsyICogTFBDX01BWF9PUkRFUl07CisgIEZJWFBfTFBDICpwQ29lZmY7CisgIEZES21lbWNweSgmY29lZmZbMF0sIGxwY0NvZWZmX20sIG9yZGVyICogc2l6ZW9mKEZJWFBfTFBDKSk7CisgIEZES21lbWNweSgmY29lZmZbb3JkZXJdLCBscGNDb2VmZl9tLCBvcmRlciAqIHNpemVvZihGSVhQX0xQQykpOworCisgIC8qCisgICAgICAjIEFuYWx5c2lzIGZpbHRlciwgb2J0YWluIHJlc2lkdWFsLgorICAgICAgZm9yIGsgPSAwOkJMLTEKKyAgICAgICAgICAgICAgZXJyKGktQkwraykgPSBhICogaW5wdXRTaWduYWwoaS1CTCtrOi0xOmktQkwtTStrKTsKKyAgICAgIGVuZGZvcgorICAgKi8KKworICBGREtfQVNTRVJUKHNoaWZ0ID49IDApOworCisgIGZvciAoaiA9IDA7IGogPCBzaWduYWxfc2l6ZTsgaisrKSB7CisgICAgcENvZWZmID0gJmNvZWZmWyhvcmRlciAtIHN0YXRlSW5kZXgpXTsKKworICAgIHRtcCA9IHNpZ25hbFtqXSA+PiBzaGlmdDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgb3JkZXI7IGkrKykgeworICAgICAgdG1wID0gZk11bHRBZGREaXYyKHRtcCwgcENvZWZmW2ldLCBmaWx0U3RhdGVbaV0pOworICAgIH0KKworICAgIHN0YXRlSW5kZXggPQorICAgICAgICAoKHN0YXRlSW5kZXggLSAxKSA8IDApID8gKHN0YXRlSW5kZXggLSAxICsgb3JkZXIpIDogKHN0YXRlSW5kZXggLSAxKTsKKyAgICBmaWx0U3RhdGVbc3RhdGVJbmRleF0gPSBzaWduYWxbal07CisKKyAgICBzaWduYWxbal0gPSB0bXAgPDwgc2hpZnQ7CisgIH0KKworICBpZiAoZmlsdFN0YXRlSW5kZXggIT0gTlVMTCkgeworICAgICpmaWx0U3RhdGVJbmRleCA9IHN0YXRlSW5kZXg7CisgIH0KK30KKworLyogRm9yIHRoZSBMUENfU1lOVEhFU0lTX0lJUiB2ZXJzaW9uICovCitJTlQgQ0xwY19QYXJjb3JUb0xwYyhjb25zdCBGSVhQX0xQQ19UTlMgcmVmbENvZWZmW10sIEZJWFBfTFBDX1ROUyBMcGNDb2VmZltdLAorICAgICAgICAgICAgICAgICAgICAgSU5UIG51bU9mQ29lZmYsIEZJWFBfREJMIHdvcmtCdWZmZXJbXSkgeworICBJTlQgaSwgajsKKyAgSU5UIHNoaWZ0dmFsLAorICAgICAgcGFyMkxwY1NoaWZ0VmFsID0gNjsgLyogNiBzaG91bGQgYmUgZW5vdWdoLCBiZWMuIG1heChudW1PZkNvZWZmKSA9IDIwICovCisgIEZJWFBfREJMIG1heFZhbCA9IChGSVhQX0RCTCkwOworCisgIHdvcmtCdWZmZXJbMF0gPSBGWF9MUENfVE5TMkZYX0RCTChyZWZsQ29lZmZbMF0pID4+IHBhcjJMcGNTaGlmdFZhbDsKKyAgZm9yIChpID0gMTsgaSA8IG51bU9mQ29lZmY7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCBpIC8gMjsgaisrKSB7CisgICAgICBGSVhQX0RCTCB0bXAxLCB0bXAyOworCisgICAgICB0bXAxID0gd29ya0J1ZmZlcltqXTsKKyAgICAgIHRtcDIgPSB3b3JrQnVmZmVyW2kgLSAxIC0gal07CisgICAgICB3b3JrQnVmZmVyW2pdICs9IGZNdWx0KHJlZmxDb2VmZltpXSwgdG1wMik7CisgICAgICB3b3JrQnVmZmVyW2kgLSAxIC0gal0gKz0gZk11bHQocmVmbENvZWZmW2ldLCB0bXAxKTsKKyAgICB9CisgICAgaWYgKGkgJiAxKSB7CisgICAgICB3b3JrQnVmZmVyW2pdICs9IGZNdWx0KHJlZmxDb2VmZltpXSwgd29ya0J1ZmZlcltqXSk7CisgICAgfQorCisgICAgd29ya0J1ZmZlcltpXSA9IEZYX0xQQ19UTlMyRlhfREJMKHJlZmxDb2VmZltpXSkgPj4gcGFyMkxwY1NoaWZ0VmFsOworICB9CisKKyAgLyogY2FsY3VsYXRlIGV4cG9uZW50ICovCisgIGZvciAoaSA9IDA7IGkgPCBudW1PZkNvZWZmOyBpKyspIHsKKyAgICBtYXhWYWwgPSBmTWF4KG1heFZhbCwgZkFicyh3b3JrQnVmZmVyW2ldKSk7CisgIH0KKworICBzaGlmdHZhbCA9IGZNaW4oZk5vcm0obWF4VmFsKSwgcGFyMkxwY1NoaWZ0VmFsKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtT2ZDb2VmZjsgaSsrKSB7CisgICAgTHBjQ29lZmZbaV0gPSBGWF9EQkwyRlhfTFBDX1ROUyh3b3JrQnVmZmVyW2ldIDw8IHNoaWZ0dmFsKTsKKyAgfQorCisgIHJldHVybiAocGFyMkxwY1NoaWZ0VmFsIC0gc2hpZnR2YWwpOworfQorLyogRGVmYXVsdCB2ZXJzaW9uICovCitJTlQgQ0xwY19QYXJjb3JUb0xwYyhjb25zdCBGSVhQX0xQQyByZWZsQ29lZmZbXSwgRklYUF9MUEMgTHBjQ29lZmZbXSwKKyAgICAgICAgICAgICAgICAgICAgIElOVCBudW1PZkNvZWZmLCBGSVhQX0RCTCB3b3JrQnVmZmVyW10pIHsKKyAgSU5UIGksIGo7CisgIElOVCBzaGlmdHZhbCwKKyAgICAgIHBhcjJMcGNTaGlmdFZhbCA9IDY7IC8qIDYgc2hvdWxkIGJlIGVub3VnaCwgYmVjLiBtYXgobnVtT2ZDb2VmZikgPSAyMCAqLworICBGSVhQX0RCTCBtYXhWYWwgPSAoRklYUF9EQkwpMDsKKworICB3b3JrQnVmZmVyWzBdID0gRlhfTFBDMkZYX0RCTChyZWZsQ29lZmZbMF0pID4+IHBhcjJMcGNTaGlmdFZhbDsKKyAgZm9yIChpID0gMTsgaSA8IG51bU9mQ29lZmY7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCBpIC8gMjsgaisrKSB7CisgICAgICBGSVhQX0RCTCB0bXAxLCB0bXAyOworCisgICAgICB0bXAxID0gd29ya0J1ZmZlcltqXTsKKyAgICAgIHRtcDIgPSB3b3JrQnVmZmVyW2kgLSAxIC0gal07CisgICAgICB3b3JrQnVmZmVyW2pdICs9IGZNdWx0KHJlZmxDb2VmZltpXSwgdG1wMik7CisgICAgICB3b3JrQnVmZmVyW2kgLSAxIC0gal0gKz0gZk11bHQocmVmbENvZWZmW2ldLCB0bXAxKTsKKyAgICB9CisgICAgaWYgKGkgJiAxKSB7CisgICAgICB3b3JrQnVmZmVyW2pdICs9IGZNdWx0KHJlZmxDb2VmZltpXSwgd29ya0J1ZmZlcltqXSk7CisgICAgfQorCisgICAgd29ya0J1ZmZlcltpXSA9IEZYX0xQQzJGWF9EQkwocmVmbENvZWZmW2ldKSA+PiBwYXIyTHBjU2hpZnRWYWw7CisgIH0KKworICAvKiBjYWxjdWxhdGUgZXhwb25lbnQgKi8KKyAgZm9yIChpID0gMDsgaSA8IG51bU9mQ29lZmY7IGkrKykgeworICAgIG1heFZhbCA9IGZNYXgobWF4VmFsLCBmQWJzKHdvcmtCdWZmZXJbaV0pKTsKKyAgfQorCisgIHNoaWZ0dmFsID0gZk1pbihmTm9ybShtYXhWYWwpLCBwYXIyTHBjU2hpZnRWYWwpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1PZkNvZWZmOyBpKyspIHsKKyAgICBMcGNDb2VmZltpXSA9IEZYX0RCTDJGWF9MUEMod29ya0J1ZmZlcltpXSA8PCBzaGlmdHZhbCk7CisgIH0KKworICByZXR1cm4gKHBhcjJMcGNTaGlmdFZhbCAtIHNoaWZ0dmFsKTsKK30KKwordm9pZCBDTHBjX0F1dG9Ub1BhcmNvcihGSVhQX0RCTCBhY29ycltdLCBjb25zdCBpbnQgYWNvcnJfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRklYUF9MUEMgcmVmbENvZWZmW10sIGNvbnN0IGludCBudW1PZkNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcFByZWRpY3Rpb25HYWluX20sIElOVCAqcFByZWRpY3Rpb25HYWluX2UpIHsKKyAgSU5UIGksIGosIHNjYWxlID0gMDsKKyAgRklYUF9EQkwgcGFyY29yV29ya0J1ZmZlcltMUENfTUFYX09SREVSXTsKKworICBGSVhQX0RCTCAqd29ya0J1ZmZlciA9IHBhcmNvcldvcmtCdWZmZXI7CisgIEZJWFBfREJMIGF1dG9Db3JyXzAgPSBhY29yclswXTsKKworICBGREttZW1jbGVhcihyZWZsQ29lZmYsIG51bU9mQ29lZmYgKiBzaXplb2YoRklYUF9MUEMpKTsKKworICBpZiAoYXV0b0NvcnJfMCA9PSBGTDJGWENPTlNUX0RCTCgwLjApKSB7CisgICAgaWYgKHBQcmVkaWN0aW9uR2Fpbl9tICE9IE5VTEwpIHsKKyAgICAgICpwUHJlZGljdGlvbkdhaW5fbSA9IEZMMkZYQ09OU1RfREJMKDAuNWYpOworICAgICAgKnBQcmVkaWN0aW9uR2Fpbl9lID0gMTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgRkRLbWVtY3B5KHdvcmtCdWZmZXIsIGFjb3JyICsgMSwgbnVtT2ZDb2VmZiAqIHNpemVvZihGSVhQX0RCTCkpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtT2ZDb2VmZjsgaSsrKSB7CisgICAgTE9ORyBzaWduID0gKChMT05HKXdvcmtCdWZmZXJbMF0gPj4gKERGUkFDVF9CSVRTIC0gMSkpOworICAgIEZJWFBfREJMIHRtcCA9IChGSVhQX0RCTCkoKExPTkcpd29ya0J1ZmZlclswXSBeIHNpZ24pOworCisgICAgLyogQ2hlY2sgcHJlY29uZGl0aW9ucyBmb3IgZGl2aXNpb24gZnVuY3Rpb246IG51bTw9ZGVudW0gICAgICAgICAgICAgKi8KKyAgICAvKiBGb3IgMXN0IGl0ZXJhdGlvbiBhY29yclswXSBjYW5ub3QgYmUgMCwgaXQgaXMgY2hlY2tlZCBiZWZvcmUgbG9vcCAqLworICAgIC8qIER1ZSB0byBleG9yIG9wZXJhdGlvbiB3aXRoICJzaWduIiwgbnVtKD10bXApIGlzIGdyZWF0ZXIvZXF1YWwgMCAgICovCisgICAgaWYgKGFjb3JyWzBdIDwgdG1wKSBicmVhazsKKworICAgIC8qIHRtcCA9IGRpdihudW0sIGRlbnVtLCAxNikgKi8KKyAgICB0bXAgPSAoRklYUF9EQkwpKChMT05HKXNjaHVyX2Rpdih0bXAsIGFjb3JyWzBdLCBGUkFDVF9CSVRTKSBeICh+c2lnbikpOworCisgICAgcmVmbENvZWZmW2ldID0gRlhfREJMMkZYX0xQQyh0bXApOworCisgICAgZm9yIChqID0gbnVtT2ZDb2VmZiAtIGkgLSAxOyBqID49IDA7IGotLSkgeworICAgICAgRklYUF9EQkwgYWNjdTEgPSBmTXVsdCh0bXAsIGFjb3JyW2pdKTsKKyAgICAgIEZJWFBfREJMIGFjY3UyID0gZk11bHQodG1wLCB3b3JrQnVmZmVyW2pdKTsKKyAgICAgIHdvcmtCdWZmZXJbal0gKz0gYWNjdTE7CisgICAgICBhY29ycltqXSArPSBhY2N1MjsKKyAgICB9CisgICAgLyogQ2hlY2sgcHJlY29uZGl0aW9ucyBmb3IgZGl2aXNpb24gZnVuY3Rpb246IGRlbnVtICg9YWNvcnJbMF0pID4gMCAqLworICAgIGlmIChhY29yclswXSA9PSAoRklYUF9EQkwpMCkgYnJlYWs7CisKKyAgICB3b3JrQnVmZmVyKys7CisgIH0KKworICBpZiAocFByZWRpY3Rpb25HYWluX20gIT0gTlVMTCkgeworICAgIGlmIChhY29yclswXSA+IChGSVhQX0RCTCkwKSB7CisgICAgICAvKiBwcmVkaWN0aW9uIGdhaW4gPSBzaWduYWwgcG93ZXIgLyBlcnJvciAocmVzaWR1YWwpIHBvd2VyICovCisgICAgICAqcFByZWRpY3Rpb25HYWluX20gPSBmRGl2Tm9ybVNpZ25lZChhdXRvQ29ycl8wLCBhY29yclswXSwgJnNjYWxlKTsKKyAgICAgICpwUHJlZGljdGlvbkdhaW5fZSA9IHNjYWxlOworICAgIH0gZWxzZSB7CisgICAgICAqcFByZWRpY3Rpb25HYWluX20gPSAoRklYUF9EQkwpMDsKKyAgICAgICpwUHJlZGljdGlvbkdhaW5fZSA9IDA7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWJGREsvc3JjL0ZES19tYXRyaXhDYWxsb2MuY3BwIGIvbGliRkRLL3NyYy9GREtfbWF0cml4Q2FsbG9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDVjNTIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliRkRLL3NyYy9GREtfbWF0cml4Q2FsbG9jLmNwcApAQCAtMCwwICsxLDMxNSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBtYXRyaXggbWVtb3J5IGFsbG9jYXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkZES19tYXRyaXhDYWxsb2MuaCIKKworI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCisKK3ZvaWQgKmZka0NhbGxvY01hdHJpeDFEX2FsaWduZWQoVUlOVCBkaW0xLCBVSU5UIHNpemUpIHsKKyAgcmV0dXJuIEZES2FhbGxvYyhkaW0xICogc2l6ZSwgQUxJR05NRU5UX0RFRkFVTFQpOworfQorCit2b2lkICpmZGtDYWxsb2NNYXRyaXgxRF9pbnQoVUlOVCBkaW0sIFVJTlQgc2l6ZSwgTUVNT1JZX1NFQ1RJT04gcykgeworICByZXR1cm4gRkRLY2FsbG9jX0woZGltLCBzaXplLCBzKTsKK30KKwordm9pZCAqZmRrQ2FsbG9jTWF0cml4MURfaW50X2FsaWduZWQoVUlOVCBkaW0sIFVJTlQgc2l6ZSwgTUVNT1JZX1NFQ1RJT04gcykgeworICByZXR1cm4gRkRLYWFsbG9jX0woZGltICogc2l6ZSwgQUxJR05NRU5UX0RFRkFVTFQsIHMpOworfQorCit2b2lkIGZka0ZyZWVNYXRyaXgxRCh2b2lkICpwKSB7CisgIGlmIChwICE9IE5VTEwpIHsKKyAgICBGREtmcmVlX0wocCk7CisgIH0KK30KKwordm9pZCBmZGtGcmVlTWF0cml4MURfYWxpZ25lZCh2b2lkICpwKSB7CisgIGlmIChwICE9IE5VTEwpIHsKKyAgICBGREthZnJlZV9MKHApOworICB9Cit9CisKK3ZvaWQgKmZka0NhbGxvY01hdHJpeDFEKFVJTlQgZGltMSwgVUlOVCBzaXplKSB7IHJldHVybiBGREtjYWxsb2MoZGltMSwgc2l6ZSk7IH0KKworLyogMkQgKi8KK3ZvaWQgKipmZGtDYWxsb2NNYXRyaXgyRChVSU5UIGRpbTEsIFVJTlQgZGltMiwgVUlOVCBzaXplKSB7CisgIHZvaWQgKipwMTsKKyAgVUlOVCBpOworICBjaGFyICpwMjsKKyAgaWYgKCFkaW0xIHx8ICFkaW0yKSByZXR1cm4gTlVMTDsKKyAgaWYgKChwMSA9ICh2b2lkICoqKWZka0NhbGxvY01hdHJpeDFEKGRpbTEsIHNpemVvZih2b2lkICopKSkgPT0gTlVMTCkgeworICAgIGdvdG8gYmFpbDsKKyAgfQorICBpZiAoKHAyID0gKGNoYXIgKilmZGtDYWxsb2NNYXRyaXgxRChkaW0xICogZGltMiwgc2l6ZSkpID09IE5VTEwpIHsKKyAgICBmZGtGcmVlTWF0cml4MUQocDEpOworICAgIHAxID0gTlVMTDsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IGRpbTE7IGkrKykgeworICAgIHAxW2ldID0gcDI7CisgICAgcDIgKz0gZGltMiAqIHNpemU7CisgIH0KK2JhaWw6CisgIHJldHVybiBwMTsKK30KKwordm9pZCAqKmZka0NhbGxvY01hdHJpeDJEX2FsaWduZWQoVUlOVCBkaW0xLCBVSU5UIGRpbTIsIFVJTlQgc2l6ZSkgeworICB2b2lkICoqcDE7CisgIFVJTlQgaTsKKyAgY2hhciAqcDI7CisgIGlmICghZGltMSB8fCAhZGltMikgcmV0dXJuIE5VTEw7CisgIGlmICgocDEgPSAodm9pZCAqKilmZGtDYWxsb2NNYXRyaXgxRChkaW0xLCBzaXplb2Yodm9pZCAqKSkpID09IE5VTEwpIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAgaWYgKChwMiA9IChjaGFyICopZmRrQ2FsbG9jTWF0cml4MURfYWxpZ25lZChkaW0xICogZGltMiwgc2l6ZSkpID09IE5VTEwpIHsKKyAgICBmZGtGcmVlTWF0cml4MUQocDEpOworICAgIHAxID0gTlVMTDsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IGRpbTE7IGkrKykgeworICAgIHAxW2ldID0gcDI7CisgICAgcDIgKz0gZGltMiAqIHNpemU7CisgIH0KK2JhaWw6CisgIHJldHVybiBwMTsKK30KKwordm9pZCBmZGtGcmVlTWF0cml4MkQodm9pZCAqKnApIHsKKyAgaWYgKCFwKSByZXR1cm47CisgIGZka0ZyZWVNYXRyaXgxRChwWzBdKTsKKyAgZmRrRnJlZU1hdHJpeDFEKHApOworfQorCit2b2lkIGZka0ZyZWVNYXRyaXgyRF9hbGlnbmVkKHZvaWQgKipwKSB7CisgIGlmICghcCkgcmV0dXJuOworICBmZGtGcmVlTWF0cml4MURfYWxpZ25lZChwWzBdKTsKKyAgZmRrRnJlZU1hdHJpeDFEKHApOworfQorCit2b2lkICoqZmRrQ2FsbG9jTWF0cml4MkRfaW50KFVJTlQgZGltMSwgVUlOVCBkaW0yLCBVSU5UIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FTU9SWV9TRUNUSU9OIHMpIHsKKyAgdm9pZCAqKnAxOworICBVSU5UIGk7CisgIGNoYXIgKnAyOworCisgIGlmICghZGltMSB8fCAhZGltMikgcmV0dXJuIE5VTEw7CisgIGlmICgocDEgPSAodm9pZCAqKilmZGtDYWxsb2NNYXRyaXgxRF9pbnQoZGltMSwgc2l6ZW9mKHZvaWQgKiksIHMpKSA9PSBOVUxMKSB7CisgICAgZ290byBiYWlsOworICB9CisgIGlmICgocDIgPSAoY2hhciAqKWZka0NhbGxvY01hdHJpeDFEX2ludChkaW0xICogZGltMiwgc2l6ZSwgcykpID09IE5VTEwpIHsKKyAgICBmZGtGcmVlTWF0cml4MUQocDEpOworICAgIHAxID0gTlVMTDsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IGRpbTE7IGkrKykgeworICAgIHAxW2ldID0gcDI7CisgICAgcDIgKz0gZGltMiAqIHNpemU7CisgIH0KK2JhaWw6CisgIHJldHVybiBwMTsKK30KKwordm9pZCAqKmZka0NhbGxvY01hdHJpeDJEX2ludF9hbGlnbmVkKFVJTlQgZGltMSwgVUlOVCBkaW0yLCBVSU5UIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVNT1JZX1NFQ1RJT04gcykgeworICB2b2lkICoqcDE7CisgIFVJTlQgaTsKKyAgY2hhciAqcDI7CisKKyAgaWYgKCFkaW0xIHx8ICFkaW0yKSByZXR1cm4gTlVMTDsKKyAgaWYgKChwMSA9ICh2b2lkICoqKWZka0NhbGxvY01hdHJpeDFEX2ludChkaW0xLCBzaXplb2Yodm9pZCAqKSwgcykpID09IE5VTEwpIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAgaWYgKChwMiA9IChjaGFyICopZmRrQ2FsbG9jTWF0cml4MURfaW50X2FsaWduZWQoZGltMSAqIGRpbTIsIHNpemUsIHMpKSA9PQorICAgICAgTlVMTCkgeworICAgIGZka0ZyZWVNYXRyaXgxRChwMSk7CisgICAgcDEgPSBOVUxMOworICAgIGdvdG8gYmFpbDsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgZGltMTsgaSsrKSB7CisgICAgcDFbaV0gPSBwMjsKKyAgICBwMiArPSBkaW0yICogc2l6ZTsKKyAgfQorYmFpbDoKKyAgcmV0dXJuIHAxOworfQorCisvKiAzRCAqLwordm9pZCAqKipmZGtDYWxsb2NNYXRyaXgzRChVSU5UIGRpbTEsIFVJTlQgZGltMiwgVUlOVCBkaW0zLCBVSU5UIHNpemUpIHsKKyAgdm9pZCAqKipwMTsKKyAgVUlOVCBpLCBqOworICB2b2lkICoqcDI7CisgIGNoYXIgKnAzOworCisgIGlmICghZGltMSB8fCAhZGltMiB8fCAhZGltMykgcmV0dXJuIE5VTEw7CisgIGlmICgocDEgPSAodm9pZCAqKiopZmRrQ2FsbG9jTWF0cml4MUQoZGltMSwgc2l6ZW9mKHZvaWQgKiopKSkgPT0gTlVMTCkgeworICAgIGdvdG8gYmFpbDsKKyAgfQorICBpZiAoKHAyID0gKHZvaWQgKiopZmRrQ2FsbG9jTWF0cml4MUQoZGltMSAqIGRpbTIsIHNpemVvZih2b2lkICopKSkgPT0gTlVMTCkgeworICAgIGZka0ZyZWVNYXRyaXgxRChwMSk7CisgICAgcDEgPSBOVUxMOworICAgIGdvdG8gYmFpbDsKKyAgfQorICBwMVswXSA9IHAyOworICBpZiAoKHAzID0gKGNoYXIgKilmZGtDYWxsb2NNYXRyaXgxRChkaW0xICogZGltMiAqIGRpbTMsIHNpemUpKSA9PSBOVUxMKSB7CisgICAgZmRrRnJlZU1hdHJpeDFEKHAxKTsKKyAgICBmZGtGcmVlTWF0cml4MUQocDIpOworICAgIHAxID0gTlVMTDsKKyAgICBwMiA9IE5VTEw7CisgICAgZ290byBiYWlsOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBkaW0xOyBpKyspIHsKKyAgICBwMVtpXSA9IHAyOworICAgIGZvciAoaiA9IDA7IGogPCBkaW0yOyBqKyspIHsKKyAgICAgIHAyW2pdID0gcDM7CisgICAgICBwMyArPSBkaW0zICogc2l6ZTsKKyAgICB9CisgICAgcDIgKz0gZGltMjsKKyAgfQorYmFpbDoKKyAgcmV0dXJuIHAxOworfQorCit2b2lkIGZka0ZyZWVNYXRyaXgzRCh2b2lkICoqKnApIHsKKyAgaWYgKCFwKSByZXR1cm47CisgIGlmIChwWzBdICE9IE5VTEwpIGZka0ZyZWVNYXRyaXgxRChwWzBdWzBdKTsKKyAgZmRrRnJlZU1hdHJpeDFEKHBbMF0pOworICBmZGtGcmVlTWF0cml4MUQocCk7Cit9CisKK3ZvaWQgKioqZmRrQ2FsbG9jTWF0cml4M0RfaW50KFVJTlQgZGltMSwgVUlOVCBkaW0yLCBVSU5UIGRpbTMsIFVJTlQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FTU9SWV9TRUNUSU9OIHMpIHsKKyAgdm9pZCAqKipwMTsKKyAgVUlOVCBpLCBqOworICB2b2lkICoqcDI7CisgIGNoYXIgKnAzOworCisgIGlmICghZGltMSB8fCAhZGltMiB8fCAhZGltMykgcmV0dXJuIE5VTEw7CisgIGlmICgocDEgPSAodm9pZCAqKiopZmRrQ2FsbG9jTWF0cml4MURfaW50KGRpbTEsIHNpemVvZih2b2lkICoqKSwgcykpID09CisgICAgICBOVUxMKSB7CisgICAgZ290byBiYWlsOworICB9CisgIGlmICgocDIgPSAodm9pZCAqKilmZGtDYWxsb2NNYXRyaXgxRF9pbnQoZGltMSAqIGRpbTIsIHNpemVvZih2b2lkICopLCBzKSkgPT0KKyAgICAgIE5VTEwpIHsKKyAgICBmZGtGcmVlTWF0cml4MUQocDEpOworICAgIHAxID0gTlVMTDsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAgcDFbMF0gPSBwMjsKKyAgaWYgKChwMyA9IChjaGFyICopZmRrQ2FsbG9jTWF0cml4MURfaW50KGRpbTEgKiBkaW0yICogZGltMywgc2l6ZSwgcykpID09CisgICAgICBOVUxMKSB7CisgICAgZmRrRnJlZU1hdHJpeDFEKHAxKTsKKyAgICBmZGtGcmVlTWF0cml4MUQocDIpOworICAgIHAxID0gTlVMTDsKKyAgICBwMiA9IE5VTEw7CisgICAgZ290byBiYWlsOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBkaW0xOyBpKyspIHsKKyAgICBwMVtpXSA9IHAyOworICAgIGZvciAoaiA9IDA7IGogPCBkaW0yOyBqKyspIHsKKyAgICAgIHAyW2pdID0gcDM7CisgICAgICBwMyArPSBkaW0zICogc2l6ZTsKKyAgICB9CisgICAgcDIgKz0gZGltMjsKKyAgfQorYmFpbDoKKyAgcmV0dXJuIHAxOworfQpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9GREtfcW1mX2RvbWFpbi5jcHAgYi9saWJGREsvc3JjL0ZES19xbWZfZG9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDNhMzcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliRkRLL3NyYy9GREtfcW1mX2RvbWFpbi5jcHAKQEAgLTAsMCArMSwxMDE3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXR0aGlhcyBIaWxkZW5icmFuZAorCisgICBEZXNjcmlwdGlvbjogTW9kdWxlIHRvIGVmZmljaWVudGx5IGhhbmRsZSBRTUYgZGF0YSBmb3IgbXVsdGlwbGUgY2hhbm5lbHMgYW5kCisgICAgICAgICAgICAgICAgdG8gc2hhcmUgdGhlIGRhdGEgYmV0d2VlbiBlLmcuIFNCUiBhbmQgTVBTCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJGREtfcW1mX2RvbWFpbi5oIgorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjZGVmaW5lIFdPUktCVUZGRVIxX1RBRyAwCisjZGVmaW5lIFdPUktCVUZGRVIyX1RBRyAxCisKKyNkZWZpbmUgV09SS0JVRkZFUjNfVEFHIDQKKyNkZWZpbmUgV09SS0JVRkZFUjRfVEFHIDUKKyNkZWZpbmUgV09SS0JVRkZFUjVfVEFHIDYKKyNkZWZpbmUgV09SS0JVRkZFUjZfVEFHIDcKKworQ19BTExPQ19NRU1fT1ZFUkxBWShRbWZXb3JrQnVmZmVyQ29yZTEsIEZJWFBfREJMLCBRTUZfV0JfU0VDVElPTl9TSVpFLAorICAgICAgICAgICAgICAgICAgICBTRUNUX0RBVEFfTDEsIFdPUktCVUZGRVIxX1RBRykKK0NfQUxMT0NfTUVNX09WRVJMQVkoUW1mV29ya0J1ZmZlckNvcmUyLCBGSVhQX0RCTCwgUU1GX1dCX1NFQ1RJT05fU0laRSwKKyAgICAgICAgICAgICAgICAgICAgU0VDVF9EQVRBX0wyLCBXT1JLQlVGRkVSMl9UQUcpCitDX0FMTE9DX01FTV9PVkVSTEFZKFFtZldvcmtCdWZmZXJDb3JlMywgRklYUF9EQkwsIFFNRl9XQl9TRUNUSU9OX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIFNFQ1RfREFUQV9MMiwgV09SS0JVRkZFUjNfVEFHKQorQ19BTExPQ19NRU1fT1ZFUkxBWShRbWZXb3JrQnVmZmVyQ29yZTQsIEZJWFBfREJMLCBRTUZfV0JfU0VDVElPTl9TSVpFLAorICAgICAgICAgICAgICAgICAgICBTRUNUX0RBVEFfTDIsIFdPUktCVUZGRVI0X1RBRykKK0NfQUxMT0NfTUVNX09WRVJMQVkoUW1mV29ya0J1ZmZlckNvcmU1LCBGSVhQX0RCTCwgUU1GX1dCX1NFQ1RJT05fU0laRSwKKyAgICAgICAgICAgICAgICAgICAgU0VDVF9EQVRBX0wyLCBXT1JLQlVGRkVSNV9UQUcpCitDX0FMTE9DX01FTV9PVkVSTEFZKFFtZldvcmtCdWZmZXJDb3JlNiwgRklYUF9EQkwsIFFNRl9XQl9TRUNUSU9OX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIFNFQ1RfREFUQV9MMiwgV09SS0JVRkZFUjZfVEFHKQorCisvKiEgQW5hbHlzaXMgc3RhdGVzIGJ1ZmZlci4gPGJyPgorICAgIERpbWVuc2lvbjogIygoOCkgKyAoMSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0NfQUxMT0NfTUVNMihBbmFRbWZTdGF0ZXMsIEZJWFBfUUFTLCAxMCAqIFFNRl9ET01BSU5fTUFYX0FOQUxZU0lTX1FNRl9CQU5EUywKKyAgICAgICAgICAgICAoKDgpICsgKDEpKSkKKworLyohIFN5bnRoZXNpcyBzdGF0ZXMgYnVmZmVyLiA8YnI+CisgICAgRGltZW5zaW9uOiAjKCg4KSArICgxKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitDX0FMTE9DX01FTTIoU3luUW1mU3RhdGVzLCBGSVhQX1FTUywgOSAqIFFNRl9ET01BSU5fTUFYX1NZTlRIRVNJU19RTUZfQkFORFMsCisgICAgICAgICAgICAgKCg4KSArICgxKSkpCisKKy8qISBQb2ludGVyIHRvIHJlYWwgcW1mIGRhdGEgZm9yIGVhY2ggdGltZSBzbG90LiA8YnI+CisgICAgRGltZW5zaW9uOiAjKCg4KSArICgxKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworQ19BTExPQ19NRU0yKFFtZlNsb3RzUmVhbCwgRklYUF9EQkwgKiwKKyAgICAgICAgICAgICBRTUZfRE9NQUlOX01BWF9USU1FU0xPVFMgKyBRTUZfRE9NQUlOX01BWF9PVl9USU1FU0xPVFMsCisgICAgICAgICAgICAgKCg4KSArICgxKSkpCisKKy8qISBQb2ludGVyIHRvIGltYWdpbmFyeSBxbWYgZGF0YSBmb3IgZWFjaCB0aW1lIHNsb3QuIDxicj4KKyAgICBEaW1lbnNpb246ICMoKDgpICsgKDEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitDX0FMTE9DX01FTTIoUW1mU2xvdHNJbWFnLCBGSVhQX0RCTCAqLAorICAgICAgICAgICAgIFFNRl9ET01BSU5fTUFYX1RJTUVTTE9UUyArIFFNRl9ET01BSU5fTUFYX09WX1RJTUVTTE9UUywKKyAgICAgICAgICAgICAoKDgpICsgKDEpKSkKKworLyohIFFNRiBvdmVybGFwIGJ1ZmZlci4gPGJyPgorICAgIERpbWVuc2lvbjogIygoOCkgKyAoMSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0NfQUFMTE9DX01FTTIoUW1mT3ZlcmxhcEJ1ZmZlciwgRklYUF9EQkwsCisgICAgICAgICAgICAgIDIgKiBRTUZfRE9NQUlOX01BWF9PVl9USU1FU0xPVFMgKiBRTUZfRE9NQUlOX01BWF9RTUZfUFJPQ19CQU5EUywKKyAgICAgICAgICAgICAgKCg4KSArICgxKSkpCisKKy8qISBBbmFseXNpcyBzdGF0ZXMgYnVmZmVyLiA8YnI+CisgICAgRGltZW5zaW9uOiAjKCg4KSArICgxKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworQ19BTExPQ19NRU0yKEFuYVFtZlN0YXRlczE2LCBGSVhQX1FBUywgMTAgKiBRTUZfRE9NQUlOX0FOQUxZU0lTX1FNRl9CQU5EU18xNiwKKyAgICAgICAgICAgICAoKDgpICsgKDEpKSkKKworLyohIEFuYWx5c2lzIHN0YXRlcyBidWZmZXIuIDxicj4KKyAgICBEaW1lbnNpb246ICMoKDgpICsgKDEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitDX0FMTE9DX01FTTIoQW5hUW1mU3RhdGVzMjQsIEZJWFBfUUFTLCAxMCAqIFFNRl9ET01BSU5fQU5BTFlTSVNfUU1GX0JBTkRTXzI0LAorICAgICAgICAgICAgICgoOCkgKyAoMSkpKQorCisvKiEgQW5hbHlzaXMgc3RhdGVzIGJ1ZmZlci4gPGJyPgorICAgIERpbWVuc2lvbjogIygoOCkgKyAoMSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0NfQUxMT0NfTUVNMihBbmFRbWZTdGF0ZXMzMiwgRklYUF9RQVMsIDEwICogUU1GX0RPTUFJTl9BTkFMWVNJU19RTUZfQkFORFNfMzIsCisgICAgICAgICAgICAgKCg4KSArICgxKSkpCisKKy8qISBQb2ludGVyIHRvIHJlYWwgcW1mIGRhdGEgZm9yIGVhY2ggdGltZSBzbG90LiA8YnI+CisgICAgRGltZW5zaW9uOiAjKCg4KSArICgxKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworQ19BTExPQ19NRU0yKFFtZlNsb3RzUmVhbDE2LCBGSVhQX0RCTCAqLAorICAgICAgICAgICAgIFFNRl9ET01BSU5fVElNRVNMT1RTXzE2ICsgUU1GX0RPTUFJTl9PVl9USU1FU0xPVFNfMTYsICgoOCkgKyAoMSkpKQorCisvKiEgUG9pbnRlciB0byByZWFsIHFtZiBkYXRhIGZvciBlYWNoIHRpbWUgc2xvdC4gPGJyPgorICAgIERpbWVuc2lvbjogIygoOCkgKyAoMSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0NfQUxMT0NfTUVNMihRbWZTbG90c1JlYWwzMiwgRklYUF9EQkwgKiwKKyAgICAgICAgICAgICBRTUZfRE9NQUlOX1RJTUVTTE9UU18zMiArIFFNRl9ET01BSU5fT1ZfVElNRVNMT1RTXzMyLCAoKDgpICsgKDEpKSkKKworLyohIFBvaW50ZXIgdG8gaW1hZ2luYXJ5IHFtZiBkYXRhIGZvciBlYWNoIHRpbWUgc2xvdC4gPGJyPgorICAgIERpbWVuc2lvbjogIygoOCkgKyAoMSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0NfQUxMT0NfTUVNMihRbWZTbG90c0ltYWcxNiwgRklYUF9EQkwgKiwKKyAgICAgICAgICAgICBRTUZfRE9NQUlOX1RJTUVTTE9UU18xNiArIFFNRl9ET01BSU5fT1ZfVElNRVNMT1RTXzE2LCAoKDgpICsgKDEpKSkKKworLyohIFBvaW50ZXIgdG8gaW1hZ2luYXJ5IHFtZiBkYXRhIGZvciBlYWNoIHRpbWUgc2xvdC4gPGJyPgorICAgIERpbWVuc2lvbjogIygoOCkgKyAoMSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0NfQUxMT0NfTUVNMihRbWZTbG90c0ltYWczMiwgRklYUF9EQkwgKiwKKyAgICAgICAgICAgICBRTUZfRE9NQUlOX1RJTUVTTE9UU18zMiArIFFNRl9ET01BSU5fT1ZfVElNRVNMT1RTXzMyLCAoKDgpICsgKDEpKSkKKworLyohIFFNRiBvdmVybGFwIGJ1ZmZlci4gPGJyPgorICAgIERpbWVuc2lvbjogIygoOCkgKyAoMSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0NfQUFMTE9DX01FTTIoUW1mT3ZlcmxhcEJ1ZmZlcjE2LCBGSVhQX0RCTCwKKyAgICAgICAgICAgICAgMiAqIFFNRl9ET01BSU5fT1ZfVElNRVNMT1RTXzE2ICogUU1GX0RPTUFJTl9NQVhfUU1GX1BST0NfQkFORFMsCisgICAgICAgICAgICAgICgoOCkgKyAoMSkpKQorCisvKiEgUU1GIG92ZXJsYXAgYnVmZmVyLiA8YnI+CisgICAgRGltZW5zaW9uOiAjKCg4KSArICgxKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworQ19BQUxMT0NfTUVNMihRbWZPdmVybGFwQnVmZmVyMzIsIEZJWFBfREJMLAorICAgICAgICAgICAgICAyICogUU1GX0RPTUFJTl9PVl9USU1FU0xPVFNfMzIgKiBRTUZfRE9NQUlOX01BWF9RTUZfUFJPQ19CQU5EUywKKyAgICAgICAgICAgICAgKCg4KSArICgxKSkpCisKK3N0YXRpYyBpbnQgRkRLX1FtZkRvbWFpbl9GcmVlUGVyc2lzdGVudE1lbW9yeShIQU5ETEVfRkRLX1FNRl9ET01BSU4gcWQpIHsKKyAgaW50IGVyciA9IDA7CisgIGludCBjaDsKKworICBmb3IgKGNoID0gMDsgY2ggPCAoKDgpICsgKDEpKTsgY2grKykgeworICAgIGlmIChxZC0+UW1mRG9tYWluSW5bY2hdLnBBbmFRbWZTdGF0ZXMpIHsKKyAgICAgIGlmIChxZC0+Z2xvYmFsQ29uZi5uQmFuZHNBbmFseXNpcyA9PSBRTUZfRE9NQUlOX0FOQUxZU0lTX1FNRl9CQU5EU18xNikgeworICAgICAgICBGcmVlQW5hUW1mU3RhdGVzMTYoJnFkLT5RbWZEb21haW5JbltjaF0ucEFuYVFtZlN0YXRlcyk7CisgICAgICB9IGVsc2UgaWYgKHFkLT5nbG9iYWxDb25mLm5CYW5kc0FuYWx5c2lzID09CisgICAgICAgICAgICAgICAgIFFNRl9ET01BSU5fQU5BTFlTSVNfUU1GX0JBTkRTXzI0KSB7CisgICAgICAgIEZyZWVBbmFRbWZTdGF0ZXMyNCgmcWQtPlFtZkRvbWFpbkluW2NoXS5wQW5hUW1mU3RhdGVzKTsKKyAgICAgIH0gZWxzZSBpZiAocWQtPmdsb2JhbENvbmYubkJhbmRzQW5hbHlzaXMgPT0KKyAgICAgICAgICAgICAgICAgUU1GX0RPTUFJTl9BTkFMWVNJU19RTUZfQkFORFNfMzIpIHsKKyAgICAgICAgRnJlZUFuYVFtZlN0YXRlczMyKCZxZC0+UW1mRG9tYWluSW5bY2hdLnBBbmFRbWZTdGF0ZXMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRnJlZUFuYVFtZlN0YXRlcygmcWQtPlFtZkRvbWFpbkluW2NoXS5wQW5hUW1mU3RhdGVzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocWQtPlFtZkRvbWFpbkluW2NoXS5wT3ZlcmxhcEJ1ZmZlcikgeworICAgICAgaWYgKHFkLT5nbG9iYWxDb25mLm5RbWZPdlRpbWVTbG90cyA9PSBRTUZfRE9NQUlOX09WX1RJTUVTTE9UU18xNikgeworICAgICAgICBGcmVlUW1mT3ZlcmxhcEJ1ZmZlcjE2KCZxZC0+UW1mRG9tYWluSW5bY2hdLnBPdmVybGFwQnVmZmVyKTsKKyAgICAgIH0gZWxzZSBpZiAocWQtPmdsb2JhbENvbmYublFtZk92VGltZVNsb3RzID09IFFNRl9ET01BSU5fT1ZfVElNRVNMT1RTXzMyKSB7CisgICAgICAgIEZyZWVRbWZPdmVybGFwQnVmZmVyMzIoJnFkLT5RbWZEb21haW5JbltjaF0ucE92ZXJsYXBCdWZmZXIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRnJlZVFtZk92ZXJsYXBCdWZmZXIoJnFkLT5RbWZEb21haW5JbltjaF0ucE92ZXJsYXBCdWZmZXIpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChxZC0+UW1mRG9tYWluSW5bY2hdLmhRbWZTbG90c1JlYWwpIHsKKyAgICAgIGlmIChxZC0+Z2xvYmFsQ29uZi5uUW1mVGltZVNsb3RzID09IFFNRl9ET01BSU5fVElNRVNMT1RTXzE2KSB7CisgICAgICAgIEZyZWVRbWZTbG90c1JlYWwxNigmcWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNSZWFsKTsKKyAgICAgIH0gZWxzZSBpZiAocWQtPmdsb2JhbENvbmYublFtZlRpbWVTbG90cyA9PSBRTUZfRE9NQUlOX1RJTUVTTE9UU18zMikgeworICAgICAgICBGcmVlUW1mU2xvdHNSZWFsMzIoJnFkLT5RbWZEb21haW5JbltjaF0uaFFtZlNsb3RzUmVhbCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBGcmVlUW1mU2xvdHNSZWFsKCZxZC0+UW1mRG9tYWluSW5bY2hdLmhRbWZTbG90c1JlYWwpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChxZC0+UW1mRG9tYWluSW5bY2hdLmhRbWZTbG90c0ltYWcpIHsKKyAgICAgIGlmIChxZC0+Z2xvYmFsQ29uZi5uUW1mVGltZVNsb3RzID09IFFNRl9ET01BSU5fVElNRVNMT1RTXzE2KSB7CisgICAgICAgIEZyZWVRbWZTbG90c0ltYWcxNigmcWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNJbWFnKTsKKyAgICAgIH0KKyAgICAgIGlmIChxZC0+Z2xvYmFsQ29uZi5uUW1mVGltZVNsb3RzID09IFFNRl9ET01BSU5fVElNRVNMT1RTXzMyKSB7CisgICAgICAgIEZyZWVRbWZTbG90c0ltYWczMigmcWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNJbWFnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZyZWVRbWZTbG90c0ltYWcoJnFkLT5RbWZEb21haW5JbltjaF0uaFFtZlNsb3RzSW1hZyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZm9yIChjaCA9IDA7IGNoIDwgKCg4KSArICgxKSk7IGNoKyspIHsKKyAgICBpZiAocWQtPlFtZkRvbWFpbk91dFtjaF0ucFN5blFtZlN0YXRlcykgeworICAgICAgRnJlZVN5blFtZlN0YXRlcygmcWQtPlFtZkRvbWFpbk91dFtjaF0ucFN5blFtZlN0YXRlcyk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBGREtfUW1mRG9tYWluX0FsbG9jYXRlUGVyc2lzdGVudE1lbW9yeShIQU5ETEVfRkRLX1FNRl9ET01BSU4gcWQpIHsKKyAgaW50IGVyciA9IDA7CisgIGludCBjaDsKKyAgSEFORExFX0ZES19RTUZfRE9NQUlOX0dDIGdjID0gJnFkLT5nbG9iYWxDb25mOworCisgIGlmICgoZ2MtPm5JbnB1dENoYW5uZWxzID4gKCg4KSArICgxKSkpIHx8IChnYy0+bk91dHB1dENoYW5uZWxzID4gKCg4KSArICgxKSkpKQorICAgIHJldHVybiBlcnIgPSAxOworICBmb3IgKGNoID0gMDsgY2ggPCBnYy0+bklucHV0Q2hhbm5lbHM7IGNoKyspIHsKKyAgICBpbnQgc2l6ZTsKKworICAgIHNpemUgPSBnYy0+bkJhbmRzQW5hbHlzaXMgKiAxMDsKKyAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgIGlmIChnYy0+bkJhbmRzQW5hbHlzaXMgPT0gUU1GX0RPTUFJTl9BTkFMWVNJU19RTUZfQkFORFNfMTYpIHsKKyAgICAgICAgaWYgKHFkLT5RbWZEb21haW5JbltjaF0ucEFuYVFtZlN0YXRlcyA9PSBOVUxMKSB7CisgICAgICAgICAgaWYgKE5VTEwgPT0KKyAgICAgICAgICAgICAgKHFkLT5RbWZEb21haW5JbltjaF0ucEFuYVFtZlN0YXRlcyA9IEdldEFuYVFtZlN0YXRlczE2KGNoKSkpCisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoZ2MtPm5CYW5kc0FuYWx5c2lzID09IFFNRl9ET01BSU5fQU5BTFlTSVNfUU1GX0JBTkRTXzI0KSB7CisgICAgICAgIGlmIChxZC0+UW1mRG9tYWluSW5bY2hdLnBBbmFRbWZTdGF0ZXMgPT0gTlVMTCkgeworICAgICAgICAgIGlmIChOVUxMID09CisgICAgICAgICAgICAgIChxZC0+UW1mRG9tYWluSW5bY2hdLnBBbmFRbWZTdGF0ZXMgPSBHZXRBbmFRbWZTdGF0ZXMyNChjaCkpKQorICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGdjLT5uQmFuZHNBbmFseXNpcyA9PSBRTUZfRE9NQUlOX0FOQUxZU0lTX1FNRl9CQU5EU18zMikgeworICAgICAgICBpZiAocWQtPlFtZkRvbWFpbkluW2NoXS5wQW5hUW1mU3RhdGVzID09IE5VTEwpIHsKKyAgICAgICAgICBpZiAoTlVMTCA9PQorICAgICAgICAgICAgICAocWQtPlFtZkRvbWFpbkluW2NoXS5wQW5hUW1mU3RhdGVzID0gR2V0QW5hUW1mU3RhdGVzMzIoY2gpKSkKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHFkLT5RbWZEb21haW5JbltjaF0ucEFuYVFtZlN0YXRlcyA9PSBOVUxMKSB7CisgICAgICAgICAgaWYgKE5VTEwgPT0gKHFkLT5RbWZEb21haW5JbltjaF0ucEFuYVFtZlN0YXRlcyA9IEdldEFuYVFtZlN0YXRlcyhjaCkpKQorICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHFkLT5RbWZEb21haW5JbltjaF0ucEFuYVFtZlN0YXRlcyA9IE5VTEw7CisgICAgfQorCisgICAgc2l6ZSA9IGdjLT5uUW1mT3ZUaW1lU2xvdHMgKyBnYy0+blFtZlRpbWVTbG90czsKKyAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgIGlmIChnYy0+blFtZlRpbWVTbG90cyA9PSBRTUZfRE9NQUlOX1RJTUVTTE9UU18xNikgeworICAgICAgICBpZiAocWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNSZWFsID09IE5VTEwpIHsKKyAgICAgICAgICBpZiAoTlVMTCA9PQorICAgICAgICAgICAgICAocWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNSZWFsID0gR2V0UW1mU2xvdHNSZWFsMTYoY2gpKSkKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAocWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNJbWFnID09IE5VTEwpIHsKKyAgICAgICAgICBpZiAoTlVMTCA9PQorICAgICAgICAgICAgICAocWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNJbWFnID0gR2V0UW1mU2xvdHNJbWFnMTYoY2gpKSkKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChnYy0+blFtZlRpbWVTbG90cyA9PSBRTUZfRE9NQUlOX1RJTUVTTE9UU18zMikgeworICAgICAgICBpZiAocWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNSZWFsID09IE5VTEwpIHsKKyAgICAgICAgICBpZiAoTlVMTCA9PQorICAgICAgICAgICAgICAocWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNSZWFsID0gR2V0UW1mU2xvdHNSZWFsMzIoY2gpKSkKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAocWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNJbWFnID09IE5VTEwpIHsKKyAgICAgICAgICBpZiAoTlVMTCA9PQorICAgICAgICAgICAgICAocWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNJbWFnID0gR2V0UW1mU2xvdHNJbWFnMzIoY2gpKSkKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHFkLT5RbWZEb21haW5JbltjaF0uaFFtZlNsb3RzUmVhbCA9PSBOVUxMKSB7CisgICAgICAgICAgaWYgKE5VTEwgPT0gKHFkLT5RbWZEb21haW5JbltjaF0uaFFtZlNsb3RzUmVhbCA9IEdldFFtZlNsb3RzUmVhbChjaCkpKQorICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICAgIGlmIChxZC0+UW1mRG9tYWluSW5bY2hdLmhRbWZTbG90c0ltYWcgPT0gTlVMTCkgeworICAgICAgICAgIGlmIChOVUxMID09IChxZC0+UW1mRG9tYWluSW5bY2hdLmhRbWZTbG90c0ltYWcgPSBHZXRRbWZTbG90c0ltYWcoY2gpKSkKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBxZC0+UW1mRG9tYWluSW5bY2hdLmhRbWZTbG90c1JlYWwgPSBOVUxMOworICAgICAgcWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNJbWFnID0gTlVMTDsKKyAgICB9CisKKyAgICBzaXplID0gZ2MtPm5RbWZPdlRpbWVTbG90cyAqIGdjLT5uUW1mUHJvY0JhbmRzICogQ01QTFhfTU9EOworICAgIGlmIChzaXplID4gMCkgeworICAgICAgaWYgKGdjLT5uUW1mT3ZUaW1lU2xvdHMgPT0gUU1GX0RPTUFJTl9PVl9USU1FU0xPVFNfMTYpIHsKKyAgICAgICAgaWYgKHFkLT5RbWZEb21haW5JbltjaF0ucE92ZXJsYXBCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgIGlmIChOVUxMID09CisgICAgICAgICAgICAgIChxZC0+UW1mRG9tYWluSW5bY2hdLnBPdmVybGFwQnVmZmVyID0gR2V0UW1mT3ZlcmxhcEJ1ZmZlcjE2KGNoKSkpCisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoZ2MtPm5RbWZPdlRpbWVTbG90cyA9PSBRTUZfRE9NQUlOX09WX1RJTUVTTE9UU18zMikgeworICAgICAgICBpZiAocWQtPlFtZkRvbWFpbkluW2NoXS5wT3ZlcmxhcEJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgaWYgKE5VTEwgPT0KKyAgICAgICAgICAgICAgKHFkLT5RbWZEb21haW5JbltjaF0ucE92ZXJsYXBCdWZmZXIgPSBHZXRRbWZPdmVybGFwQnVmZmVyMzIoY2gpKSkKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHFkLT5RbWZEb21haW5JbltjaF0ucE92ZXJsYXBCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgIGlmIChOVUxMID09CisgICAgICAgICAgICAgIChxZC0+UW1mRG9tYWluSW5bY2hdLnBPdmVybGFwQnVmZmVyID0gR2V0UW1mT3ZlcmxhcEJ1ZmZlcihjaCkpKQorICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHFkLT5RbWZEb21haW5JbltjaF0ucE92ZXJsYXBCdWZmZXIgPSBOVUxMOworICAgIH0KKyAgfQorCisgIGZvciAoY2ggPSAwOyBjaCA8IGdjLT5uT3V0cHV0Q2hhbm5lbHM7IGNoKyspIHsKKyAgICBpbnQgc2l6ZSA9IGdjLT5uQmFuZHNTeW50aGVzaXMgKiA5OworICAgIGlmIChzaXplID4gMCkgeworICAgICAgaWYgKHFkLT5RbWZEb21haW5PdXRbY2hdLnBTeW5RbWZTdGF0ZXMgPT0gTlVMTCkgeworICAgICAgICBpZiAoTlVMTCA9PSAocWQtPlFtZkRvbWFpbk91dFtjaF0ucFN5blFtZlN0YXRlcyA9IEdldFN5blFtZlN0YXRlcyhjaCkpKQorICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcWQtPlFtZkRvbWFpbk91dFtjaF0ucFN5blFtZlN0YXRlcyA9IE5VTEw7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGVycjsKKworYmFpbDoKKyAgRkRLX1FtZkRvbWFpbl9GcmVlUGVyc2lzdGVudE1lbW9yeShxZCk7CisgIHJldHVybiAtMTsKK30KKworUU1GX0RPTUFJTl9FUlJPUiBGREtfUW1mRG9tYWluX0NsZWFyUGVyc2lzdGVudE1lbW9yeSgKKyAgICBIQU5ETEVfRkRLX1FNRl9ET01BSU4gaHFkKSB7CisgIFFNRl9ET01BSU5fRVJST1IgZXJyID0gUU1GX0RPTUFJTl9PSzsKKyAgaW50IGNoLCBzaXplOworICBpZiAoaHFkKSB7CisgICAgSEFORExFX0ZES19RTUZfRE9NQUlOX0dDIGdjID0gJmhxZC0+Z2xvYmFsQ29uZjsKKworICAgIHNpemUgPSBnYy0+blFtZk92VGltZVNsb3RzICogZ2MtPm5RbWZQcm9jQmFuZHMgKiBDTVBMWF9NT0Q7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgZ2MtPm5JbnB1dENoYW5uZWxzOyBjaCsrKSB7CisgICAgICBpZiAoaHFkLT5RbWZEb21haW5JbltjaF0ucE92ZXJsYXBCdWZmZXIpIHsKKyAgICAgICAgRkRLbWVtY2xlYXIoaHFkLT5RbWZEb21haW5JbltjaF0ucE92ZXJsYXBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIHNpemUgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKEZES19RbWZEb21haW5fSW5pdEZpbHRlckJhbmsoaHFkLCAwKSkgeworICAgICAgZXJyID0gUU1GX0RPTUFJTl9JTklUX0VSUk9SOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBlcnIgPSBRTUZfRE9NQUlOX0lOSVRfRVJST1I7CisgIH0KKyAgcmV0dXJuIGVycjsKK30KKworLyoKKyAgIEZES19nZXRXb3JrQnVmZmVyCisKKyAgICBQYXJhbWV0ZXJzOgorCisgICAgcFdvcmtCdWZmZXIgICAgICAgIGk6IGFycmF5IG9mIHBvaW50ZXJzIHdoaWNoIHBvaW50IHRvIGRpZmZlcmVudCB3b3JrYnVmZmVyCisgICBzZWN0aW9ucyB3b3JrQnVmZmVyT2Zmc2V0ICAgaTogb2Zmc2V0IGluIHRoZSB3b3JrYnVmZmVyIHRvIHRoZSByZXF1ZXN0ZWQKKyAgIG1lbW9yeSBtZW1TaXplICAgICAgICAgICAgaTogc2l6ZSBvZiByZXF1ZXN0ZWQgbWVtb3J5CisKKyAgICBGdW5jdGlvbjoKKworICAgIFRoZSBmdW5jdGlvbnMgcmV0dXJucyB0aGUgYWRkcmVzcyB0byB0aGUgcmVxdWVzdGVkIG1lbW9yeSBpbiB0aGUgd29ya2J1ZmZlci4KKworICAgIFRoZSBvdmVyYWxsIHdvcmtidWZmZXIgaXMgZGl2aWRlZCBpbnRvIHNldmVyYWwgc2VjdGlvbnMuIFRoZXJlIGFyZQorICAgUU1GX01BWF9XQl9TRUNUSU9OUyBzZWN0aW9ucyBvZiBzaXplIFFNRl9XQl9TRUNUSU9OX1NJWkUuIFRoZSBmdW5jdGlvbgorICAgc2VsZWN0cyB0aGUgd29ya2J1ZmZlciBzZWN0aW9uIHdpdGggdGhlIGhlbHAgb2YgdGhlIHdvcmtCdWZmZXJPZmZzZXQgYW5kIHRoYW4KKyAgIGl0IHZlcmlmaWVzIHdoZXRoZXIgdGhlIHJlcXVlc3RlZCBhbW91bnQgb2YgbWVtb3J5IGZpdHMgaW50byB0aGUgc2VsZWN0ZWQKKyAgIHdvcmtidWZmZXIgc2VjdGlvbi4KKworICAgIFJldHVybnM6CisKKyAgICBhZGRyZXNzIHRvIHdvcmtidWZmZXIKKyovCitzdGF0aWMgRklYUF9EQkwgKkZES19nZXRXb3JrQnVmZmVyKEZJWFBfREJMICoqcFdvcmtCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCB3b3JrQnVmZmVyT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgd29ya0J1ZmZlclNlY3RTaXplLCBVU0hPUlQgbWVtU2l6ZSkgeworICBpbnQgaWR4MTsKKyAgaW50IGlkeDI7CisgIEZJWFBfREJMICpwd2I7CisKKyAgLyogYSBzZWN0aW9uIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgbnVtYmVyIG9mIHByb2Nlc3NpbmcgYmFuZHMgKGN1cnJlbnRseQorICAgKiBhbHdheXMgNjQpICovCisgIEZES19BU1NFUlQoKHdvcmtCdWZmZXJTZWN0U2l6ZSAlIDY0KSA9PSAwKTsKKworICAvKiBjYWxjdWxhdGUgb2Zmc2V0IHdpdGhpbiB0aGUgc2VjdGlvbiAqLworICBpZHgyID0gd29ya0J1ZmZlck9mZnNldCAlIHdvcmtCdWZmZXJTZWN0U2l6ZTsKKyAgLyogY2FsY3VsYXRlIHNlY3Rpb24gbnVtYmVyICovCisgIGlkeDEgPSAod29ya0J1ZmZlck9mZnNldCAtIGlkeDIpIC8gd29ya0J1ZmZlclNlY3RTaXplOworICAvKiBtYXhpbXVtIHNlY3Rpb25udW1iZXIgaXMgUU1GX01BWF9XQl9TRUNUSU9OUyAqLworICBGREtfQVNTRVJUKGlkeDEgPCBRTUZfTUFYX1dCX1NFQ1RJT05TKTsKKworICAvKiBjaGVjaywgd2hldGhlciB3b3JrYnVmZmVyIGlzIGF2YWlsYWJsZSAgKi8KKyAgRkRLX0FTU0VSVChwV29ya0J1ZmZlcltpZHgxXSAhPSBOVUxMKTsKKworICAvKiBjaGVjaywgd2hldGhlciBidWZmZXIgZml0cyBpbnRvIHNlbGVjdGVkIHNlY3Rpb24gKi8KKyAgRkRLX0FTU0VSVCgoaWR4MiArIG1lbVNpemUpIDw9IHdvcmtCdWZmZXJTZWN0U2l6ZSk7CisKKyAgLyogZ2V0IHJlcXVlc3RlZCBhZGRyZXNzIHRvIHdvcmtidWZmZXIgKi8KKyAgcHdiID0gJnBXb3JrQnVmZmVyW2lkeDFdW2lkeDJdOworCisgIHJldHVybiBwd2I7Cit9CisKK3N0YXRpYyBpbnQgRkRLX1FtZkRvbWFpbl9GZWVkV29ya0J1ZmZlcihIQU5ETEVfRkRLX1FNRl9ET01BSU4gcWQsIGludCBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnBXb3JrQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCB3b3JrQnVmZmVyT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCB3b3JrQnVmZmVyU2VjdFNpemUsIGludCBzaXplKSB7CisgIGludCBlcnIgPSAwOworICBpbnQgbWVtX25lZWRlZDsKKworICBtZW1fbmVlZGVkID0gcWQtPlFtZkRvbWFpbkluW2NoXS53b3JrQnVmX25CYW5kcyAqCisgICAgICAgICAgICAgICBxZC0+UW1mRG9tYWluSW5bY2hdLndvcmtCdWZfblRpbWVTbG90cyAqIENNUExYX01PRDsKKyAgaWYgKG1lbV9uZWVkZWQgPiBzaXplKSB7CisgICAgcmV0dXJuIChlcnIgPSAxKTsKKyAgfQorICBxZC0+UW1mRG9tYWluSW5bY2hdLnBXb3JrQnVmZmVyID0gcFdvcmtCdWZmZXI7CisgIHFkLT5RbWZEb21haW5JbltjaF0ud29ya0J1ZmZlck9mZnNldCA9IHdvcmtCdWZmZXJPZmZzZXQ7CisgIHFkLT5RbWZEb21haW5JbltjaF0ud29ya0J1ZmZlclNlY3RTaXplID0gd29ya0J1ZmZlclNlY3RTaXplOworCisgIHJldHVybiBlcnI7Cit9CisKK2ludCBGREtfUW1mRG9tYWluX0lzSW5pdGlhbGl6ZWQoY29uc3QgSEFORExFX0ZES19RTUZfRE9NQUlOIHFkKSB7CisgIEZES19BU1NFUlQocWQgIT0gTlVMTCk7CisgIHJldHVybiAoKHFkLT5RbWZEb21haW5JblswXS5wQW5hUW1mU3RhdGVzID09IE5VTEwpICYmCisgICAgICAgICAgKHFkLT5RbWZEb21haW5PdXRbMF0ucFN5blFtZlN0YXRlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICA/IDAKKyAgICAgICAgICAgICA6IDE7Cit9CisKK2ludCBGREtfUW1mRG9tYWluX0luaXRGaWx0ZXJCYW5rKEhBTkRMRV9GREtfUU1GX0RPTUFJTiBxZCwgVUlOVCBleHRyYV9mbGFncykgeworICBGREtfQVNTRVJUKHFkICE9IE5VTEwpOworICBpbnQgZXJyID0gMDsKKyAgaW50IGNoLCB0czsKKyAgSEFORExFX0ZES19RTUZfRE9NQUlOX0dDIGdjID0gJnFkLT5nbG9iYWxDb25mOworICBpbnQgbm9Db2xzID0gZ2MtPm5RbWZUaW1lU2xvdHM7CisgIGludCBsc2IgPSBnYy0+bkJhbmRzQW5hbHlzaXM7CisgIGludCB1c2IgPSBmTWluKChJTlQpZ2MtPm5CYW5kc1N5bnRoZXNpcywgNjQpOworICBpbnQgblByb2NCYW5kcyA9IGdjLT5uUW1mUHJvY0JhbmRzOworICBGREtfQVNTRVJUKG5Qcm9jQmFuZHMgJSBBTElHTk1FTlRfREVGQVVMVCA9PSAwKTsKKworICBpZiAoZXh0cmFfZmxhZ3MgJiBRTUZfRkxBR19NUFNMREZCKSB7CisgICAgZ2MtPmZsYWdzICY9IH5RTUZfRkxBR19DTERGQjsKKyAgICBnYy0+ZmxhZ3MgfD0gUU1GX0ZMQUdfTVBTTERGQjsKKyAgfQorICBmb3IgKGNoID0gMDsgY2ggPCBnYy0+bklucHV0Q2hhbm5lbHM7IGNoKyspIHsKKyAgICAvKiBkaXN0cmlidXRlIG1lbW9yeSB0byBzbG90cyBhcnJheSAqLworICAgIEZJWFBfREJMICpwdHJPdiA9CisgICAgICAgIHFkLT5RbWZEb21haW5JbltjaF0ucE92ZXJsYXBCdWZmZXI7IC8qIHBlcnNpc3RlbnQgbWVtb3J5IGZvciBvdmVybGFwICovCisgICAgaWYgKChwdHJPdiA9PSBOVUxMKSAmJiAoZ2MtPm5RbWZPdlRpbWVTbG90cyAhPSAwKSkgeworICAgICAgZXJyID0gMTsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIC8qIFRoaXMgYXNzdW1lcyB0aGUgd29ya2J1ZmZlciBkZWZpbmVkIGZvciBjaDAgaXMgdGhlIGJpZyBvbmUgYmVpbmcgdXNlZCB0bworICAgICAqIGhvbGQgb25lIGZ1bGwgZnJhbWUgb2YgUU1GIGRhdGEuICovCisgICAgRklYUF9EQkwgKipwdHIgPQorICAgICAgICBxZC0+UW1mRG9tYWluSW5bZk1pbihjaCwgZk1heCgoSU5UKWdjLT5uUW1mUHJvY0NoYW5uZWxzIC0gMSwgMCkpXQorICAgICAgICAgICAgLnBXb3JrQnVmZmVyOyAvKiBub24tcGVyc2lzdGVudCB3b3JrYnVmZmVyICovCisgICAgVVNIT1JUIHdvcmtCdWZmZXJPZmZzZXQgPQorICAgICAgICBxZC0+UW1mRG9tYWluSW5bZk1pbihjaCwgZk1heCgoSU5UKWdjLT5uUW1mUHJvY0NoYW5uZWxzIC0gMSwgMCkpXQorICAgICAgICAgICAgLndvcmtCdWZmZXJPZmZzZXQ7CisgICAgVVNIT1JUIHdvcmtCdWZmZXJTZWN0U2l6ZSA9CisgICAgICAgIHFkLT5RbWZEb21haW5JbltmTWluKGNoLCBmTWF4KChJTlQpZ2MtPm5RbWZQcm9jQ2hhbm5lbHMgLSAxLCAwKSldCisgICAgICAgICAgICAud29ya0J1ZmZlclNlY3RTaXplOworCisgICAgaWYgKChwdHIgPT0gTlVMTCkgJiYgKGdjLT5uUW1mVGltZVNsb3RzICE9IDApKSB7CisgICAgICBlcnIgPSAxOworICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBxZC0+UW1mRG9tYWluSW5bY2hdLnBHbG9iYWxDb25mID0gZ2M7CisgICAgZm9yICh0cyA9IDA7IHRzIDwgZ2MtPm5RbWZPdlRpbWVTbG90czsgdHMrKykgeworICAgICAgcWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNSZWFsW3RzXSA9IHB0ck92OworICAgICAgcHRyT3YgKz0gblByb2NCYW5kczsKKyAgICAgIHFkLT5RbWZEb21haW5JbltjaF0uaFFtZlNsb3RzSW1hZ1t0c10gPSBwdHJPdjsKKyAgICAgIHB0ck92ICs9IG5Qcm9jQmFuZHM7CisgICAgfQorICAgIGZvciAoOyB0cyA8IChnYy0+blFtZk92VGltZVNsb3RzICsgZ2MtPm5RbWZUaW1lU2xvdHMpOyB0cysrKSB7CisgICAgICBxZC0+UW1mRG9tYWluSW5bY2hdLmhRbWZTbG90c1JlYWxbdHNdID0gRkRLX2dldFdvcmtCdWZmZXIoCisgICAgICAgICAgcHRyLCB3b3JrQnVmZmVyT2Zmc2V0LCB3b3JrQnVmZmVyU2VjdFNpemUsIG5Qcm9jQmFuZHMpOworICAgICAgd29ya0J1ZmZlck9mZnNldCArPSBuUHJvY0JhbmRzOworICAgICAgcWQtPlFtZkRvbWFpbkluW2NoXS5oUW1mU2xvdHNJbWFnW3RzXSA9IEZES19nZXRXb3JrQnVmZmVyKAorICAgICAgICAgIHB0ciwgd29ya0J1ZmZlck9mZnNldCwgd29ya0J1ZmZlclNlY3RTaXplLCBuUHJvY0JhbmRzKTsKKyAgICAgIHdvcmtCdWZmZXJPZmZzZXQgKz0gblByb2NCYW5kczsKKyAgICB9CisgICAgZXJyIHw9IHFtZkluaXRBbmFseXNpc0ZpbHRlckJhbmsoCisgICAgICAgICZxZC0+UW1mRG9tYWluSW5bY2hdLmZiLCBxZC0+UW1mRG9tYWluSW5bY2hdLnBBbmFRbWZTdGF0ZXMsIG5vQ29scywKKyAgICAgICAgKHFkLT5RbWZEb21haW5JbltjaF0uZmIubHNiID09IDApID8gbHNiIDogcWQtPlFtZkRvbWFpbkluW2NoXS5mYi5sc2IsCisgICAgICAgIChxZC0+UW1mRG9tYWluSW5bY2hdLmZiLnVzYiA9PSAwKSA/IHVzYiA6IHFkLT5RbWZEb21haW5JbltjaF0uZmIudXNiLAorICAgICAgICBnYy0+bkJhbmRzQW5hbHlzaXMsIGdjLT5mbGFncyB8IGV4dHJhX2ZsYWdzKTsKKyAgfQorCisgIGZvciAoY2ggPSAwOyBjaCA8IGdjLT5uT3V0cHV0Q2hhbm5lbHM7IGNoKyspIHsKKyAgICBGSVhQX0RCTCBvdXRHYWluX20gPSBxZC0+UW1mRG9tYWluT3V0W2NoXS5mYi5vdXRHYWluX207CisgICAgaW50IG91dEdhaW5fZSA9IHFkLT5RbWZEb21haW5PdXRbY2hdLmZiLm91dEdhaW5fZTsKKyAgICBpbnQgb3V0U2NhbGUgPSBxbWZHZXRPdXRTY2FsZWZhY3RvcigmcWQtPlFtZkRvbWFpbk91dFtjaF0uZmIpOworICAgIGVyciB8PSBxbWZJbml0U3ludGhlc2lzRmlsdGVyQmFuaygKKyAgICAgICAgJnFkLT5RbWZEb21haW5PdXRbY2hdLmZiLCBxZC0+UW1mRG9tYWluT3V0W2NoXS5wU3luUW1mU3RhdGVzLCBub0NvbHMsCisgICAgICAgIChxZC0+UW1mRG9tYWluT3V0W2NoXS5mYi5sc2IgPT0gMCkgPyBsc2IgOiBxZC0+UW1mRG9tYWluT3V0W2NoXS5mYi5sc2IsCisgICAgICAgIChxZC0+UW1mRG9tYWluT3V0W2NoXS5mYi51c2IgPT0gMCkgPyB1c2IgOiBxZC0+UW1mRG9tYWluT3V0W2NoXS5mYi51c2IsCisgICAgICAgIGdjLT5uQmFuZHNTeW50aGVzaXMsIGdjLT5mbGFncyB8IGV4dHJhX2ZsYWdzKTsKKyAgICBpZiAob3V0R2Fpbl9tICE9IChGSVhQX0RCTCkwKSB7CisgICAgICBxbWZDaGFuZ2VPdXRHYWluKCZxZC0+UW1mRG9tYWluT3V0W2NoXS5mYiwgb3V0R2Fpbl9tLCBvdXRHYWluX2UpOworICAgIH0KKyAgICBpZiAob3V0U2NhbGUpIHsKKyAgICAgIHFtZkNoYW5nZU91dFNjYWxlZmFjdG9yKCZxZC0+UW1mRG9tYWluT3V0W2NoXS5mYiwgb3V0U2NhbGUpOworICAgIH0KKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgRkRLX1FtZkRvbWFpbl9TYXZlT3ZlcmxhcChIQU5ETEVfRkRLX1FNRl9ET01BSU5fSU4gcWRfY2gsIGludCBvZmZzZXQpIHsKKyAgRkRLX0FTU0VSVChxZF9jaCAhPSBOVUxMKTsKKyAgaW50IHRzOworICBIQU5ETEVfRkRLX1FNRl9ET01BSU5fR0MgZ2MgPSBxZF9jaC0+cEdsb2JhbENvbmY7CisgIGludCBvdlNsb3RzID0gZ2MtPm5RbWZPdlRpbWVTbG90czsKKyAgaW50IG5Db2xzID0gZ2MtPm5RbWZUaW1lU2xvdHM7CisgIGludCBuUHJvY0JhbmRzID0gZ2MtPm5RbWZQcm9jQmFuZHM7CisgIEZJWFBfREJMICoqcW1mUmVhbCA9IHFkX2NoLT5oUW1mU2xvdHNSZWFsOworICBGSVhQX0RCTCAqKnFtZkltYWcgPSBxZF9jaC0+aFFtZlNsb3RzSW1hZzsKKyAgUU1GX1NDQUxFX0ZBQ1RPUiAqcFNjYWxpbmcgPSAmcWRfY2gtPnNjYWxpbmc7CisKKyAgLyogZm9yIGhpZ2ggcGFydCBpdCB3b3VsZCBiZSBlbm91Z2ggdG8gc2F2ZSBvbmx5IHVzZWQgcGFydCBvZiBvdmVybGFwIGFyZWEgKi8KKyAgaWYgKHFtZkltYWcgIT0gTlVMTCkgeworICAgIGZvciAodHMgPSBvZmZzZXQ7IHRzIDwgb3ZTbG90czsgdHMrKykgeworICAgICAgRkRLbWVtY3B5KHFtZlJlYWxbdHNdLCBxbWZSZWFsW25Db2xzICsgdHNdLAorICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkgKiBuUHJvY0JhbmRzKTsKKyAgICAgIEZES21lbWNweShxbWZJbWFnW3RzXSwgcW1mSW1hZ1tuQ29scyArIHRzXSwKKyAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogblByb2NCYW5kcyk7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAodHMgPSAwOyB0cyA8IG92U2xvdHM7IHRzKyspIHsKKyAgICAgIEZES21lbWNweShxbWZSZWFsW3RzXSwgcW1mUmVhbFtuQ29scyArIHRzXSwKKyAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogblByb2NCYW5kcyk7CisgICAgfQorICB9CisgIHBTY2FsaW5nLT5vdl9sYl9zY2FsZSA9IHBTY2FsaW5nLT5sYl9zY2FsZTsKK30KKworICAvKiBDb252ZXJ0IGhlYWRyb29tIGJpdHMgdG8gZXhwb25lbnQgKi8KKyNkZWZpbmUgU0NBTEUyRVhQKHMpICgxNSAtIChzKSkKKyNkZWZpbmUgRVhQMlNDQUxFKGUpICgxNSAtIChlKSkKKwordm9pZCBGREtfUW1mRG9tYWluX0dldFNsb3QoY29uc3QgSEFORExFX0ZES19RTUZfRE9NQUlOX0lOIHFkX2NoLCBjb25zdCBpbnQgdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3RhcnRfYmFuZCwgY29uc3QgaW50IHN0b3BfYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwUW1mT3V0UmVhbCwgRklYUF9EQkwgKnBRbWZPdXRJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGV4cF9vdXQpIHsKKyAgRkRLX0FTU0VSVChxZF9jaCAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChwUW1mT3V0UmVhbCAhPSBOVUxMKTsKKyAgSEFORExFX0ZES19RTUZfRE9NQUlOX0dDIGdjID0gcWRfY2gtPnBHbG9iYWxDb25mOworICBjb25zdCBGSVhQX0RCTCAqcmVhbCA9IHFkX2NoLT5oUW1mU2xvdHNSZWFsW3RzXTsKKyAgY29uc3QgRklYUF9EQkwgKmltYWcgPSBxZF9jaC0+aFFtZlNsb3RzSW1hZ1t0c107CisgIGNvbnN0IGludCBvdlNsb3RzID0gZ2MtPm5RbWZPdlRpbWVTbG90czsKKyAgY29uc3QgaW50IGV4cF9sYiA9IFNDQUxFMkVYUCgodHMgPCBvdlNsb3RzKSA/IHFkX2NoLT5zY2FsaW5nLm92X2xiX3NjYWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBxZF9jaC0+c2NhbGluZy5sYl9zY2FsZSk7CisgIGNvbnN0IGludCBleHBfaGIgPSBTQ0FMRTJFWFAocWRfY2gtPnNjYWxpbmcuaGJfc2NhbGUpOworICBjb25zdCBpbnQgbHNiID0gcWRfY2gtPmZiLmxzYjsKKyAgY29uc3QgaW50IHVzYiA9IHFkX2NoLT5mYi51c2I7CisgIGludCBiID0gc3RhcnRfYmFuZDsKKyAgaW50IGxiX3NmLCBoYl9zZjsKKworICBpbnQgdGFyZ2V0X2V4cCA9CisgICAgICBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX0FOQUxZU0lTX0ZJTFRFUkJBTksgKyBxZF9jaC0+ZmIuZmlsdGVyU2NhbGU7CisKKyAgRkRLX0FTU0VSVCh0cyA8IChnYy0+blFtZlRpbWVTbG90cyArIGdjLT5uUW1mT3ZUaW1lU2xvdHMpKTsKKyAgRkRLX0FTU0VSVChzdGFydF9iYW5kID49IDApOworICBGREtfQVNTRVJUKHN0b3BfYmFuZCA8PSBnYy0+blFtZlByb2NCYW5kcyk7CisKKyAgaWYgKHFkX2NoLT5mYi5ub19jaGFubmVscyA9PSAyNCkgeworICAgIHRhcmdldF9leHAgLT0gMTsKKyAgfQorCisgIC8qIExpbWl0IHNjYWxpbmcgZmFjdG9ycyB0byBtYXhpbXVtIG5lZ2F0aXZlIHZhbHVlIHRvIGF2b2lkIGZhdWx0eSBiZWhhdmlvdXIKKyAgICAgZHVlIHRvIHJpZ2h0LXNoaWZ0cy4gQ29ycmVzcG9uZGluZyBhc3NlcnRzIHdlcmUgb2JzZXJ2ZWQgZHVyaW5nIHJvYnVzdG5lc3MKKyAgICAgdGVzdGluZy4KKyAgICovCisgIGxiX3NmID0gZk1heChleHBfbGIgLSB0YXJnZXRfZXhwIC0gZXhwX291dCwgLTMxKTsKKyAgRkRLX0FTU0VSVChsYl9zZiA8IDMyKTsKKyAgaGJfc2YgPSBmTWF4KGV4cF9oYiAtIHRhcmdldF9leHAgLSBleHBfb3V0LCAtMzEpOworICBGREtfQVNTRVJUKGhiX3NmIDwgMzIpOworCisgIGlmIChwUW1mT3V0SW1hZyA9PSBOVUxMKSB7CisgICAgZm9yICg7IGIgPCBmTWluKGxzYiwgc3RvcF9iYW5kKTsgYisrKSB7CisgICAgICBwUW1mT3V0UmVhbFtiXSA9IHNjYWxlVmFsdWUocmVhbFtiXSwgbGJfc2YpOworICAgIH0KKyAgICBmb3IgKDsgYiA8IGZNaW4odXNiLCBzdG9wX2JhbmQpOyBiKyspIHsKKyAgICAgIHBRbWZPdXRSZWFsW2JdID0gc2NhbGVWYWx1ZShyZWFsW2JdLCBoYl9zZik7CisgICAgfQorICAgIGZvciAoOyBiIDwgc3RvcF9iYW5kOyBiKyspIHsKKyAgICAgIHBRbWZPdXRSZWFsW2JdID0gKEZJWFBfREJMKTA7CisgICAgfQorICB9IGVsc2UgeworICAgIEZES19BU1NFUlQoaW1hZyAhPSBOVUxMKTsKKyAgICBmb3IgKDsgYiA8IGZNaW4obHNiLCBzdG9wX2JhbmQpOyBiKyspIHsKKyAgICAgIHBRbWZPdXRSZWFsW2JdID0gc2NhbGVWYWx1ZShyZWFsW2JdLCBsYl9zZik7CisgICAgICBwUW1mT3V0SW1hZ1tiXSA9IHNjYWxlVmFsdWUoaW1hZ1tiXSwgbGJfc2YpOworICAgIH0KKyAgICBmb3IgKDsgYiA8IGZNaW4odXNiLCBzdG9wX2JhbmQpOyBiKyspIHsKKyAgICAgIHBRbWZPdXRSZWFsW2JdID0gc2NhbGVWYWx1ZShyZWFsW2JdLCBoYl9zZik7CisgICAgICBwUW1mT3V0SW1hZ1tiXSA9IHNjYWxlVmFsdWUoaW1hZ1tiXSwgaGJfc2YpOworICAgIH0KKyAgICBmb3IgKDsgYiA8IHN0b3BfYmFuZDsgYisrKSB7CisgICAgICBwUW1mT3V0UmVhbFtiXSA9IChGSVhQX0RCTCkwOworICAgICAgcFFtZk91dEltYWdbYl0gPSAoRklYUF9EQkwpMDsKKyAgICB9CisgIH0KK30KKwordm9pZCBGREtfUW1mRG9tYWluX0dldFdvcmtCdWZmZXIoY29uc3QgSEFORExFX0ZES19RTUZfRE9NQUlOX0lOIHFkX2NoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRzLCBGSVhQX0RCTCAqKnBwUW1mUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcHBRbWZJbWFnKSB7CisgIEZES19BU1NFUlQocWRfY2ggIT0gTlVMTCk7CisgIEZES19BU1NFUlQocHBRbWZSZWFsICE9IE5VTEwpOworICBGREtfQVNTRVJUKHBwUW1mSW1hZyAhPSBOVUxMKTsKKyAgY29uc3QgaW50IGJhbmRzID0gcWRfY2gtPndvcmtCdWZfbkJhbmRzOworICBGSVhQX0RCTCAqKnBXb3JrQnVmID0gcWRfY2gtPnBXb3JrQnVmZmVyOworICBVU0hPUlQgd29ya0J1ZmZlck9mZnNldCA9IHFkX2NoLT53b3JrQnVmZmVyT2Zmc2V0OworICBVU0hPUlQgd29ya0J1ZmZlclNlY3RTaXplID0gcWRfY2gtPndvcmtCdWZmZXJTZWN0U2l6ZTsKKworICBGREtfQVNTRVJUKGJhbmRzID4gMCk7CisgIEZES19BU1NFUlQodHMgPCBxZF9jaC0+d29ya0J1Zl9uVGltZVNsb3RzKTsKKworICAqcHBRbWZSZWFsID0gRkRLX2dldFdvcmtCdWZmZXIoCisgICAgICBwV29ya0J1Ziwgd29ya0J1ZmZlck9mZnNldCArICh0cyAqIENNUExYX01PRCArIDApICogYmFuZHMsCisgICAgICB3b3JrQnVmZmVyU2VjdFNpemUsIGJhbmRzKTsKKyAgKnBwUW1mSW1hZyA9IEZES19nZXRXb3JrQnVmZmVyKAorICAgICAgcFdvcmtCdWYsIHdvcmtCdWZmZXJPZmZzZXQgKyAodHMgKiBDTVBMWF9NT0QgKyAxKSAqIGJhbmRzLAorICAgICAgd29ya0J1ZmZlclNlY3RTaXplLCBiYW5kcyk7Cit9CisKK3ZvaWQgRkRLX1FtZkRvbWFpbl9Xb3JrQnVmZmVyMlByb2NDaGFubmVsKAorICAgIGNvbnN0IEhBTkRMRV9GREtfUU1GX0RPTUFJTl9JTiBxZF9jaCkgeworICBGREtfQVNTRVJUKHFkX2NoICE9IE5VTEwpOworICBIQU5ETEVfRkRLX1FNRl9ET01BSU5fR0MgZ2MgPSBxZF9jaC0+cEdsb2JhbENvbmY7CisgIEZJWFBfREJMICoqcFdvcmtCdWYgPSBxZF9jaC0+cFdvcmtCdWZmZXI7CisgIFVTSE9SVCB3b3JrQnVmZmVyT2Zmc2V0ID0gcWRfY2gtPndvcmtCdWZmZXJPZmZzZXQ7CisgIFVTSE9SVCB3b3JrQnVmZmVyU2VjdFNpemUgPSBxZF9jaC0+d29ya0J1ZmZlclNlY3RTaXplOworCisgIGlmIChGREtfZ2V0V29ya0J1ZmZlcihwV29ya0J1Ziwgd29ya0J1ZmZlck9mZnNldCwgd29ya0J1ZmZlclNlY3RTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgcWRfY2gtPndvcmtCdWZfbkJhbmRzKSA9PQorICAgICAgcWRfY2gtPmhRbWZTbG90c1JlYWxbZ2MtPm5RbWZPdlRpbWVTbG90c10pIHsKKyAgICAvKiB3b3JrIGJ1ZmZlciBpcyBwYXJ0IG9mIHByb2Nlc3NpbmcgY2hhbm5lbCA9PiBub3RoaW5nIHRvIGRvICovCisgICAgcmV0dXJuOworICB9IGVsc2UgeworICAgIC8qIGNvcHkgcGFya2VkIG5ldyBRTUYgZGF0YSB0byBwcm9jZXNzaW5nIGNoYW5uZWwgKi8KKyAgICBjb25zdCBpbnQgYmFuZHMgPSBxZF9jaC0+d29ya0J1Zl9uQmFuZHM7CisgICAgY29uc3QgaW50IHNsb3RzID0gcWRfY2gtPndvcmtCdWZfblRpbWVTbG90czsKKyAgICBpbnQgdHM7CisgICAgZm9yICh0cyA9IDA7IHRzIDwgc2xvdHM7IHRzKyspIHsKKyAgICAgIEZES21lbWNweShxZF9jaC0+aFFtZlNsb3RzUmVhbFtnYy0+blFtZk92VGltZVNsb3RzICsgdHNdLAorICAgICAgICAgICAgICAgIEZES19nZXRXb3JrQnVmZmVyKHBXb3JrQnVmLCB3b3JrQnVmZmVyT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtCdWZmZXJTZWN0U2l6ZSwgYmFuZHMpLAorICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkgKiBiYW5kcyk7ICAvLyBwYXJrQnVmX3RvX2FuYU1hdHJpeAorICAgICAgd29ya0J1ZmZlck9mZnNldCArPSBiYW5kczsKKyAgICAgIEZES21lbWNweShxZF9jaC0+aFFtZlNsb3RzSW1hZ1tnYy0+blFtZk92VGltZVNsb3RzICsgdHNdLAorICAgICAgICAgICAgICAgIEZES19nZXRXb3JrQnVmZmVyKHBXb3JrQnVmLCB3b3JrQnVmZmVyT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtCdWZmZXJTZWN0U2l6ZSwgYmFuZHMpLAorICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkgKiBiYW5kcyk7CisgICAgICB3b3JrQnVmZmVyT2Zmc2V0ICs9IGJhbmRzOworICAgIH0KKyAgfQorfQorCit2b2lkIEZES19RbWZEb21haW5fUW1mRGF0YTJIQkUoSEFORExFX0ZES19RTUZfRE9NQUlOX0lOIHFkX2NoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcHBRbWZSZWFsLCBGSVhQX0RCTCAqKnBwUW1mSW1hZykgeworICBGREtfQVNTRVJUKHFkX2NoICE9IE5VTEwpOworICBGREtfQVNTRVJUKHBwUW1mUmVhbCAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChwcFFtZkltYWcgIT0gTlVMTCk7CisgIEhBTkRMRV9GREtfUU1GX0RPTUFJTl9HQyBnYyA9IHFkX2NoLT5wR2xvYmFsQ29uZjsKKyAgRklYUF9EQkwgKipwV29ya0J1ZiA9IHFkX2NoLT5wV29ya0J1ZmZlcjsKKyAgVVNIT1JUIHdvcmtCdWZmZXJPZmZzZXQgPSBxZF9jaC0+d29ya0J1ZmZlck9mZnNldDsKKyAgVVNIT1JUIHdvcmtCdWZmZXJTZWN0U2l6ZSA9IHFkX2NoLT53b3JrQnVmZmVyU2VjdFNpemU7CisKKyAgaWYgKEZES19nZXRXb3JrQnVmZmVyKHBXb3JrQnVmLCB3b3JrQnVmZmVyT2Zmc2V0LCB3b3JrQnVmZmVyU2VjdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBxZF9jaC0+d29ya0J1Zl9uQmFuZHMpID09CisgICAgICBxZF9jaC0+aFFtZlNsb3RzUmVhbFtnYy0+blFtZk92VGltZVNsb3RzXSkgeyAgLy8gbGVmdCBjaGFubmVsIChhbmFNYXRyaXgpCisgICAgaW50IHRzOworICAgIGNvbnN0IGludCBiYW5kcyA9IGdjLT5uQmFuZHNBbmFseXNpczsKKyAgICBjb25zdCBpbnQgc2xvdHMgPSBxZF9jaC0+d29ya0J1Zl9uVGltZVNsb3RzOworICAgIEZES19BU1NFUlQoYmFuZHMgPD0gNjQpOworICAgIGZvciAodHMgPSAwOyB0cyA8IHNsb3RzOyB0cysrKSB7CisgICAgICAvKiBjb3B5IGN1cnJlbnQgZGF0YSBvZiBwcm9jZXNzaW5nIGNoYW5uZWwgKi8KKyAgICAgIEZJWFBfREJMIHRtcFs2NF07ICAvLyBvbmUgc2xvdAorICAgICAgLyogcmVhbCAqLworICAgICAgRkRLbWVtY3B5KHRtcCwgcWRfY2gtPmhRbWZTbG90c1JlYWxbZ2MtPm5RbWZPdlRpbWVTbG90cyArIHRzXSwKKyAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogYmFuZHMpOyAgLy8gYW5hTWF0cml4X3RvX3RtcAorICAgICAgRkRLbWVtY3B5KHFkX2NoLT5oUW1mU2xvdHNSZWFsW2djLT5uUW1mT3ZUaW1lU2xvdHMgKyB0c10sIHBwUW1mUmVhbFt0c10sCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIGJhbmRzKTsgIC8vIEhCRV90b19hbmFNYXRyaXgKKyAgICAgIEZES21lbWNweShwcFFtZlJlYWxbdHNdLCB0bXAsIHNpemVvZihGSVhQX0RCTCkgKiBiYW5kcyk7ICAvLyB0bXBfdG9fSEJFCisgICAgICAvKiBpbWFnICovCisgICAgICBGREttZW1jcHkodG1wLCBxZF9jaC0+aFFtZlNsb3RzSW1hZ1tnYy0+blFtZk92VGltZVNsb3RzICsgdHNdLAorICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkgKiBiYW5kcyk7CisgICAgICBGREttZW1jcHkocWRfY2gtPmhRbWZTbG90c0ltYWdbZ2MtPm5RbWZPdlRpbWVTbG90cyArIHRzXSwgcHBRbWZJbWFnW3RzXSwKKyAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogYmFuZHMpOworICAgICAgRkRLbWVtY3B5KHBwUW1mSW1hZ1t0c10sIHRtcCwgc2l6ZW9mKEZJWFBfREJMKSAqIGJhbmRzKTsKKyAgICB9CisgIH0gZWxzZSB7ICAvLyByaWdodCBjaGFubmVsIChwYXJrQnVmKQorICAgIGNvbnN0IGludCBiYW5kcyA9IHFkX2NoLT53b3JrQnVmX25CYW5kczsKKyAgICBjb25zdCBpbnQgc2xvdHMgPSBxZF9jaC0+d29ya0J1Zl9uVGltZVNsb3RzOworICAgIGludCB0czsKKyAgICBGREtfQVNTRVJUKHFkX2NoLT53b3JrQnVmX25CYW5kcyA9PSBnYy0+bkJhbmRzQW5hbHlzaXMpOworICAgIGZvciAodHMgPSAwOyB0cyA8IHNsb3RzOyB0cysrKSB7CisgICAgICAvKiBjb3B5IEhCRSBRTUYgZGF0YSBidWZmZXIgdG8gcHJvY2Vzc2luZyBjaGFubmVsICovCisgICAgICBGREttZW1jcHkocWRfY2gtPmhRbWZTbG90c1JlYWxbZ2MtPm5RbWZPdlRpbWVTbG90cyArIHRzXSwgcHBRbWZSZWFsW3RzXSwKKyAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogYmFuZHMpOyAgLy8gSEJFX3RvX2FuYU1hdHJpeAorICAgICAgRkRLbWVtY3B5KHFkX2NoLT5oUW1mU2xvdHNJbWFnW2djLT5uUW1mT3ZUaW1lU2xvdHMgKyB0c10sIHBwUW1mSW1hZ1t0c10sCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIGJhbmRzKTsKKyAgICAgIC8qIGNvcHkgcGFya2VkIG5ldyBRTUYgZGF0YSB0byBIQkUgUU1GIGRhdGEgYnVmZmVyICovCisgICAgICBGREttZW1jcHkocHBRbWZSZWFsW3RzXSwKKyAgICAgICAgICAgICAgICBGREtfZ2V0V29ya0J1ZmZlcihwV29ya0J1Ziwgd29ya0J1ZmZlck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrQnVmZmVyU2VjdFNpemUsIGJhbmRzKSwKKyAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogYmFuZHMpOyAgLy8gcGFya0J1Zl90b19IQkUKKyAgICAgIHdvcmtCdWZmZXJPZmZzZXQgKz0gYmFuZHM7CisgICAgICBGREttZW1jcHkocHBRbWZJbWFnW3RzXSwKKyAgICAgICAgICAgICAgICBGREtfZ2V0V29ya0J1ZmZlcihwV29ya0J1Ziwgd29ya0J1ZmZlck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrQnVmZmVyU2VjdFNpemUsIGJhbmRzKSwKKyAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogYmFuZHMpOworICAgICAgd29ya0J1ZmZlck9mZnNldCArPSBiYW5kczsKKyAgICB9CisgIH0KK30KKwordm9pZCBGREtfUW1mRG9tYWluX0NsZWFyUmVxdWVzdGVkKEhBTkRMRV9GREtfUU1GX0RPTUFJTl9HQyBoZ2MpIHsKKyAgaGdjLT5xbWZEb21haW5FeHBsaWNpdENvbmZpZyA9IDA7CisgIGhnYy0+ZmxhZ3NfcmVxdWVzdGVkID0gMDsKKyAgaGdjLT5uSW5wdXRDaGFubmVsc19yZXF1ZXN0ZWQgPSAwOworICBoZ2MtPm5PdXRwdXRDaGFubmVsc19yZXF1ZXN0ZWQgPSAwOworICBoZ2MtPm5CYW5kc0FuYWx5c2lzX3JlcXVlc3RlZCA9IDA7CisgIGhnYy0+bkJhbmRzU3ludGhlc2lzX3JlcXVlc3RlZCA9IDA7CisgIGhnYy0+blFtZlRpbWVTbG90c19yZXF1ZXN0ZWQgPSAwOworICBoZ2MtPm5RbWZPdlRpbWVTbG90c19yZXF1ZXN0ZWQgPSAwOworICBoZ2MtPm5RbWZQcm9jQmFuZHNfcmVxdWVzdGVkID0gMDsKKyAgaGdjLT5uUW1mUHJvY0NoYW5uZWxzX3JlcXVlc3RlZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIEZES19RbWZEb21haW5fQ2xlYXJDb25maWd1cmVkKEhBTkRMRV9GREtfUU1GX0RPTUFJTl9HQyBoZ2MpIHsKKyAgaGdjLT5mbGFncyA9IDA7CisgIGhnYy0+bklucHV0Q2hhbm5lbHMgPSAwOworICBoZ2MtPm5PdXRwdXRDaGFubmVscyA9IDA7CisgIGhnYy0+bkJhbmRzQW5hbHlzaXMgPSAwOworICBoZ2MtPm5CYW5kc1N5bnRoZXNpcyA9IDA7CisgIGhnYy0+blFtZlRpbWVTbG90cyA9IDA7CisgIGhnYy0+blFtZk92VGltZVNsb3RzID0gMDsKKyAgaGdjLT5uUW1mUHJvY0JhbmRzID0gMDsKKyAgaGdjLT5uUW1mUHJvY0NoYW5uZWxzID0gMDsKK30KKworc3RhdGljIHZvaWQgRkRLX1FtZkRvbWFpbl9DbGVhckZpbHRlckJhbmsoSEFORExFX0ZES19RTUZfRE9NQUlOIGhxZCkgeworICBpbnQgY2g7CisKKyAgZm9yIChjaCA9IDA7IGNoIDwgKCg4KSArICgxKSk7IGNoKyspIHsKKyAgICBGREttZW1jbGVhcigmaHFkLT5RbWZEb21haW5JbltjaF0uZmIsIHNpemVvZihocWQtPlFtZkRvbWFpbkluW2NoXS5mYikpOworICB9CisKKyAgZm9yIChjaCA9IDA7IGNoIDwgKCg4KSArICgxKSk7IGNoKyspIHsKKyAgICBGREttZW1jbGVhcigmaHFkLT5RbWZEb21haW5PdXRbY2hdLmZiLCBzaXplb2YoaHFkLT5RbWZEb21haW5JbltjaF0uZmIpKTsKKyAgfQorfQorCitRTUZfRE9NQUlOX0VSUk9SIEZES19RbWZEb21haW5fQ29uZmlndXJlKEhBTkRMRV9GREtfUU1GX0RPTUFJTiBocWQpIHsKKyAgRkRLX0FTU0VSVChocWQgIT0gTlVMTCk7CisgIFFNRl9ET01BSU5fRVJST1IgZXJyID0gUU1GX0RPTUFJTl9PSzsKKyAgaW50IGksIHNpemVfbWFpbiwgc2l6ZSwgc2l6ZV90ZW1wID0gMDsKKworICBIQU5ETEVfRkRLX1FNRl9ET01BSU5fR0MgaGdjID0gJmhxZC0+Z2xvYmFsQ29uZjsKKyAgRklYUF9EQkwgKipwV29ya0J1ZmZlciA9IGhnYy0+cFdvcmtCdWZmZXI7CisKKyAgaW50IGhhc0NoYW5nZWQgPSAwOworCisgIGlmICgoaGdjLT5uUW1mUHJvY0NoYW5uZWxzX3JlcXVlc3RlZCA+IDApICYmCisgICAgICAoaGdjLT5uUW1mUHJvY0JhbmRzX3JlcXVlc3RlZCAhPSA2NCkpIHsKKyAgICByZXR1cm4gUU1GX0RPTUFJTl9JTklUX0VSUk9SOworICB9CisgIGlmIChoZ2MtPm5CYW5kc0FuYWx5c2lzX3JlcXVlc3RlZCA+IGhnYy0+blFtZlByb2NCYW5kc19yZXF1ZXN0ZWQpIHsKKyAgICAvKiBJbiBnZW5lcmFsIHRoZSBvdXRwdXQgb2YgdGhlIHFtZiBhbmFseXNpcyBpcyB3cml0dGVuIHRvIFFNRiBtZW1vcnkgc2xvdHMKKyAgICAgICB3aGljaCBzaXplIGlzIGRlZmluZWQgYnkgblFtZlByb2NCYW5kcy4gbkJhbmRzU3ludGhlc2lzIG1heSBiZSBsYXJnZXIKKyAgICAgICB0aGFuIG5RbWZQcm9jQmFuZHMuIFRoaXMgaXMgZS5nLiB0aGUgY2FzZSBpZiB0aGUgUU1GIGJhc2VkIHJlc2FtcGxlciBpcworICAgICAgIHVzZWQuCisgICAgKi8KKyAgICByZXR1cm4gUU1GX0RPTUFJTl9JTklUX0VSUk9SOworICB9CisKKyAgLyogMS4gYWRqdXN0IGNoYW5nZSBvZiBwcm9jZXNzaW5nIGNoYW5uZWxzIGJ5IGNvbXBhcmlzb24gb2YgY3VycmVudCBhbmQKKyAgICogcmVxdWVzdGVkIHBhcmFtZXRlcnMgKi8KKyAgaWYgKChoZ2MtPm5RbWZQcm9jQ2hhbm5lbHMgIT0gaGdjLT5uUW1mUHJvY0NoYW5uZWxzX3JlcXVlc3RlZCkgfHwKKyAgICAgIChoZ2MtPm5RbWZQcm9jQmFuZHMgIT0gaGdjLT5uUW1mUHJvY0JhbmRzX3JlcXVlc3RlZCkgfHwKKyAgICAgIChoZ2MtPm5RbWZUaW1lU2xvdHMgIT0gaGdjLT5uUW1mVGltZVNsb3RzX3JlcXVlc3RlZCkpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGdjLT5uUW1mUHJvY0NoYW5uZWxzX3JlcXVlc3RlZDsgaSsrKSB7CisgICAgICBocWQtPlFtZkRvbWFpbkluW2ldLndvcmtCdWZfbkJhbmRzID0gaGdjLT5uUW1mUHJvY0JhbmRzX3JlcXVlc3RlZDsKKyAgICAgIGhnYy0+blFtZlByb2NCYW5kcyA9IGhnYy0+blFtZlByb2NCYW5kc19yZXF1ZXN0ZWQ7CisKKyAgICAgIGhxZC0+UW1mRG9tYWluSW5baV0ud29ya0J1Zl9uVGltZVNsb3RzID0gaGdjLT5uUW1mVGltZVNsb3RzX3JlcXVlc3RlZDsKKyAgICB9CisKKyAgICBoZ2MtPm5RbWZQcm9jQ2hhbm5lbHMgPQorICAgICAgICBoZ2MtPm5RbWZQcm9jQ2hhbm5lbHNfcmVxdWVzdGVkOyAvKiBrZWVwIGhpZ2hlc3QgdmFsdWUgZW5jb3VudGVyZWQgc28KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFyIGFzIGFsbG9jYXRlZCAqLworCisgICAgaGFzQ2hhbmdlZCA9IDE7CisgIH0KKworICAvKiAyLiByZWFsbG9jYXRlIHBlcnNpc3RlbnQgbWVtb3J5IGlmIG5lY2Vzc2FyeSAoYW5hbHlzaXMgc3RhdGUtYnVmZmVycywKKyAgICogdGltZXNsb3QtcG9pbnRlci1hcnJheSwgb3ZlcmxhcC1idWZmZXJzLCBzeW50aGVzaXMgc3RhdGUtYnVmZmVycykgKi8KKyAgaWYgKChoZ2MtPm5JbnB1dENoYW5uZWxzICE9IGhnYy0+bklucHV0Q2hhbm5lbHNfcmVxdWVzdGVkKSB8fAorICAgICAgKGhnYy0+bkJhbmRzQW5hbHlzaXMgIT0gaGdjLT5uQmFuZHNBbmFseXNpc19yZXF1ZXN0ZWQpIHx8CisgICAgICAoaGdjLT5uUW1mVGltZVNsb3RzICE9IGhnYy0+blFtZlRpbWVTbG90c19yZXF1ZXN0ZWQpIHx8CisgICAgICAoaGdjLT5uUW1mT3ZUaW1lU2xvdHMgIT0gaGdjLT5uUW1mT3ZUaW1lU2xvdHNfcmVxdWVzdGVkKSB8fAorICAgICAgKGhnYy0+bk91dHB1dENoYW5uZWxzICE9IGhnYy0+bk91dHB1dENoYW5uZWxzX3JlcXVlc3RlZCkgfHwKKyAgICAgIChoZ2MtPm5CYW5kc1N5bnRoZXNpcyAhPSBoZ2MtPm5CYW5kc1N5bnRoZXNpc19yZXF1ZXN0ZWQpIHx8CisgICAgICAoaGdjLT5wYXJrQ2hhbm5lbCAhPSBoZ2MtPnBhcmtDaGFubmVsX3JlcXVlc3RlZCkpIHsKKyAgICBoZ2MtPm5JbnB1dENoYW5uZWxzID0gaGdjLT5uSW5wdXRDaGFubmVsc19yZXF1ZXN0ZWQ7CisgICAgaGdjLT5uQmFuZHNBbmFseXNpcyA9IGhnYy0+bkJhbmRzQW5hbHlzaXNfcmVxdWVzdGVkOworICAgIGhnYy0+blFtZlRpbWVTbG90cyA9IGhnYy0+blFtZlRpbWVTbG90c19yZXF1ZXN0ZWQ7CisgICAgaGdjLT5uUW1mT3ZUaW1lU2xvdHMgPSBoZ2MtPm5RbWZPdlRpbWVTbG90c19yZXF1ZXN0ZWQ7CisgICAgaGdjLT5uT3V0cHV0Q2hhbm5lbHMgPSBoZ2MtPm5PdXRwdXRDaGFubmVsc19yZXF1ZXN0ZWQ7CisgICAgaGdjLT5uQmFuZHNTeW50aGVzaXMgPSBoZ2MtPm5CYW5kc1N5bnRoZXNpc19yZXF1ZXN0ZWQ7CisgICAgaGdjLT5wYXJrQ2hhbm5lbCA9IGhnYy0+cGFya0NoYW5uZWxfcmVxdWVzdGVkOworCisgICAgaWYgKEZES19RbWZEb21haW5fQWxsb2NhdGVQZXJzaXN0ZW50TWVtb3J5KGhxZCkpIHsKKyAgICAgIGVyciA9IFFNRl9ET01BSU5fT1VUX09GX01FTU9SWTsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiAzLiBzZXQgcmVxdWVzdC1mbGFnIGZvciBkb3duc2FtcGxlZCBTQlIgKi8KKyAgICBpZiAoKGhnYy0+bkJhbmRzQW5hbHlzaXMgPT0gMzIpICYmIChoZ2MtPm5CYW5kc1N5bnRoZXNpcyA9PSAzMikgJiYKKyAgICAgICAgIShoZ2MtPmZsYWdzICYgKFFNRl9GTEFHX0NMREZCIHwgUU1GX0ZMQUdfTVBTTERGQikpKSB7CisgICAgICBoZ2MtPmZsYWdzX3JlcXVlc3RlZCB8PSBRTUZfRkxBR19ET1dOU0FNUExFRDsKKyAgICB9CisgICAgaWYgKChoZ2MtPmZsYWdzX3JlcXVlc3RlZCAmIFFNRl9GTEFHX01QU0xERkIpICYmCisgICAgICAgIChoZ2MtPmZsYWdzX3JlcXVlc3RlZCAmIFFNRl9GTEFHX0NMREZCKSkgeworICAgICAgaGdjLT5mbGFnc19yZXF1ZXN0ZWQgJj0gflFNRl9GTEFHX0NMREZCOworICAgIH0KKworICAgIGhhc0NoYW5nZWQgPSAxOworICB9CisKKyAgLyogNC4gaW5pdGlhbGl6ZSB0YWJsZXMgYW5kIGJ1ZmZlciBmb3IgUU1GLXJlc2FtcGxlciAqLworCisgIC8qIDUuIHNldCByZXF1ZXN0ZWQgZmxhZ3MgKi8KKyAgaWYgKGhnYy0+ZmxhZ3MgIT0gaGdjLT5mbGFnc19yZXF1ZXN0ZWQpIHsKKyAgICBoZ2MtPmZsYWdzID0gaGdjLT5mbGFnc19yZXF1ZXN0ZWQ7CisgICAgaGFzQ2hhbmdlZCA9IDE7CisgIH0KKworICBpZiAoaGFzQ2hhbmdlZCkgeworICAgIC8qIDYuIHJlY2FsY3VsYXRlIGFuZCBjaGVjayBzaXplIG9mIHJlcXVpcmVkIHdvcmtidWZmZXItc3BhY2UgKi8KKworICAgIGlmIChoZ2MtPnBhcmtDaGFubmVsICYmIChocWQtPmdsb2JhbENvbmYublFtZlByb2NDaGFubmVscyA9PSAxKSkgeworICAgICAgLyogY29uZmlndXJlIHRlbXAgUU1GIGJ1ZmZlciBmb3IgcGFya2luZyByaWdodCBjaGFubmVsIE1QUzIxMiBvdXRwdXQsCisgICAgICAgKiAoVVNBQyBzdGVyZW9Db25maWdJbmRleCAzIG9ubHkpICovCisgICAgICBocWQtPlFtZkRvbWFpbkluWzFdLndvcmtCdWZfbkJhbmRzID0gaHFkLT5nbG9iYWxDb25mLm5CYW5kc0FuYWx5c2lzOworICAgICAgaHFkLT5RbWZEb21haW5JblsxXS53b3JrQnVmX25UaW1lU2xvdHMgPSBocWQtPmdsb2JhbENvbmYublFtZlRpbWVTbG90czsKKyAgICAgIHNpemVfdGVtcCA9IGhxZC0+UW1mRG9tYWluSW5bMV0ud29ya0J1Zl9uQmFuZHMgKgorICAgICAgICAgICAgICAgICAgaHFkLT5RbWZEb21haW5JblsxXS53b3JrQnVmX25UaW1lU2xvdHMgKiBDTVBMWF9NT0Q7CisgICAgfQorCisgICAgc2l6ZV9tYWluID0gaHFkLT5RbWZEb21haW5JblswXS53b3JrQnVmX25CYW5kcyAqCisgICAgICAgICAgICAgICAgaHFkLT5RbWZEb21haW5JblswXS53b3JrQnVmX25UaW1lU2xvdHMgKiBDTVBMWF9NT0Q7CisKKyAgICBzaXplID0gc2l6ZV9tYWluICogaGdjLT5uUW1mUHJvY0NoYW5uZWxzICsgc2l6ZV90ZW1wOworCisgICAgaWYgKHNpemUgPiAoUU1GX01BWF9XQl9TRUNUSU9OUyAqIFFNRl9XQl9TRUNUSU9OX1NJWkUpKSB7CisgICAgICBlcnIgPSBRTUZfRE9NQUlOX09VVF9PRl9NRU1PUlk7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogNy4gYWxsb2NhdGUgYWRkaXRpb25hbCB3b3JrYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmICgoc2l6ZSA+IDAgLyogKlFNRl9XQl9TRUNUSU9OX1NJWkUgKi8pICYmIChwV29ya0J1ZmZlclswXSA9PSBOVUxMKSkgeworICAgICAgLyogZ2V0IHdvcmsgYnVmZmVyIG9mIHNpemUgUU1GX1dCX1NFQ1RJT05fU0laRSAqLworICAgICAgcFdvcmtCdWZmZXJbMF0gPSBHZXRRbWZXb3JrQnVmZmVyQ29yZTYoKTsKKyAgICB9CisKKyAgICBpZiAoKHNpemUgPiAxICogUU1GX1dCX1NFQ1RJT05fU0laRSkgJiYgKHBXb3JrQnVmZmVyWzFdID09IE5VTEwpKSB7CisgICAgICAvKiBnZXQgd29yayBidWZmZXIgb2Ygc2l6ZSBRTUZfV0JfU0VDVElPTl9TSVpFICovCisgICAgICBwV29ya0J1ZmZlclsxXSA9IEdldFFtZldvcmtCdWZmZXJDb3JlMSgpOworICAgIH0KKworICAgIGlmICgoc2l6ZSA+IDIgKiBRTUZfV0JfU0VDVElPTl9TSVpFKSAmJiAocFdvcmtCdWZmZXJbMl0gPT0gTlVMTCkpIHsKKyAgICAgIC8qIGdldCB3b3JrIGJ1ZmZlciBvZiBzaXplIFFNRl9XQl9TRUNUSU9OX1NJWkUgKi8KKyAgICAgIHBXb3JrQnVmZmVyWzJdID0gR2V0UW1mV29ya0J1ZmZlckNvcmUzKCk7CisgICAgfQorCisgICAgaWYgKChzaXplID4gMyAqIFFNRl9XQl9TRUNUSU9OX1NJWkUpICYmIChwV29ya0J1ZmZlclszXSA9PSBOVUxMKSkgeworICAgICAgLyogZ2V0IHdvcmsgYnVmZmVyIG9mIHNpemUgUU1GX1dCX1NFQ1RJT05fU0laRSAqLworICAgICAgcFdvcmtCdWZmZXJbM10gPSBHZXRRbWZXb3JrQnVmZmVyQ29yZTQoKTsKKyAgICB9CisKKyAgICBpZiAoKHNpemUgPiA0ICogUU1GX1dCX1NFQ1RJT05fU0laRSkgJiYgKHBXb3JrQnVmZmVyWzRdID09IE5VTEwpKSB7CisgICAgICAvKiBnZXQgd29yayBidWZmZXIgb2Ygc2l6ZSBRTUZfV0JfU0VDVElPTl9TSVpFICovCisgICAgICBwV29ya0J1ZmZlcls0XSA9IEdldFFtZldvcmtCdWZmZXJDb3JlNSgpOworICAgIH0KKworICAgIC8qIDguIGRpc3RyaWJ1dGUgd29ya2J1ZmZlciBvdmVyIHByb2Nlc3NpbmcgY2hhbm5lbHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaGdjLT5uUW1mUHJvY0NoYW5uZWxzOyBpKyspIHsKKyAgICAgIEZES19RbWZEb21haW5fRmVlZFdvcmtCdWZmZXIoaHFkLCBpLCBwV29ya0J1ZmZlciwgc2l6ZV9tYWluICogaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU1GX1dCX1NFQ1RJT05fU0laRSwgc2l6ZV9tYWluKTsKKyAgICB9CisgICAgaWYgKGhnYy0+cGFya0NoYW5uZWwpIHsKKyAgICAgIGZvciAoOyBpIDwgaGdjLT5uSW5wdXRDaGFubmVsczsgaSsrKSB7CisgICAgICAgIEZES19RbWZEb21haW5fRmVlZFdvcmtCdWZmZXIoaHFkLCAxLCBwV29ya0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX21haW4gKiBoZ2MtPm5RbWZQcm9jQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU1GX1dCX1NFQ1RJT05fU0laRSwgc2l6ZV90ZW1wKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiA5LiAocmUtKWluaXQgZmlsdGVyYmFuayAqLworICAgIGZvciAoaSA9IDA7IGkgPCBoZ2MtPm5PdXRwdXRDaGFubmVsczsgaSsrKSB7CisgICAgICBpZiAoKGhxZC0+UW1mRG9tYWluT3V0W2ldLmZiLmxzYiA9PSAwKSAmJgorICAgICAgICAgIChocWQtPlFtZkRvbWFpbk91dFtpXS5mYi51c2IgPT0gMCkpIHsKKyAgICAgICAgLyogQWx0aG91Z2ggbHNiIGFuZCB1c2IgYXJlIHNldCBpbiB0aGUgU0JSIG1vZHVsZSwgdGhleSBhcmUgaW5pdGlhbGl6ZWQKKyAgICAgICAgICogYXQgdGhpcyBwb2ludCBkdWUgdG8gdGhlIGNhc2Ugb2YgdXNpbmcgTVBTIHdpdGhvdXQgU0JSLiAqLworICAgICAgICBocWQtPlFtZkRvbWFpbk91dFtpXS5mYi5sc2IgPSBoZ2MtPm5CYW5kc0FuYWx5c2lzX3JlcXVlc3RlZDsKKyAgICAgICAgaHFkLT5RbWZEb21haW5PdXRbaV0uZmIudXNiID0KKyAgICAgICAgICAgIGZNaW4oKElOVCloZ2MtPm5CYW5kc1N5bnRoZXNpc19yZXF1ZXN0ZWQsIDY0KTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKEZES19RbWZEb21haW5fSW5pdEZpbHRlckJhbmsoaHFkLCAwKSkgeworICAgICAgZXJyID0gUU1GX0RPTUFJTl9JTklUX0VSUk9SOworICAgIH0KKyAgfQorCitiYWlsOgorICBpZiAoZXJyID09IFFNRl9ET01BSU5fT1VUX09GX01FTU9SWSkgeworICAgIEZES19RbWZEb21haW5fRnJlZVBlcnNpc3RlbnRNZW1vcnkoaHFkKTsKKyAgICBGREtfUW1mRG9tYWluX0NsZWFyQ29uZmlndXJlZCgmaHFkLT5nbG9iYWxDb25mKTsKKyAgfQorICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBGREtfUW1mRG9tYWluX0ZyZWVXb3JrQnVmZmVyKEhBTkRMRV9GREtfUU1GX0RPTUFJTiBocWQpIHsKKyAgRklYUF9EQkwgKipwV29ya0J1ZmZlciA9IGhxZC0+Z2xvYmFsQ29uZi5wV29ya0J1ZmZlcjsKKworICBpZiAocFdvcmtCdWZmZXJbMF0pIEZyZWVRbWZXb3JrQnVmZmVyQ29yZTYoJnBXb3JrQnVmZmVyWzBdKTsKKyAgaWYgKHBXb3JrQnVmZmVyWzFdKSBGcmVlUW1mV29ya0J1ZmZlckNvcmUxKCZwV29ya0J1ZmZlclsxXSk7CisgIGlmIChwV29ya0J1ZmZlclsyXSkgRnJlZVFtZldvcmtCdWZmZXJDb3JlMygmcFdvcmtCdWZmZXJbMl0pOworICBpZiAocFdvcmtCdWZmZXJbM10pIEZyZWVRbWZXb3JrQnVmZmVyQ29yZTQoJnBXb3JrQnVmZmVyWzNdKTsKKyAgaWYgKHBXb3JrQnVmZmVyWzRdKSBGcmVlUW1mV29ya0J1ZmZlckNvcmU1KCZwV29ya0J1ZmZlcls0XSk7Cit9CisKK3ZvaWQgRkRLX1FtZkRvbWFpbl9GcmVlTWVtKEhBTkRMRV9GREtfUU1GX0RPTUFJTiBocWQpIHsKKyAgRkRLX1FtZkRvbWFpbl9GcmVlV29ya0J1ZmZlcihocWQpOworCisgIEZES19RbWZEb21haW5fRnJlZVBlcnNpc3RlbnRNZW1vcnkoaHFkKTsKKworICBGREtfUW1mRG9tYWluX0NsZWFyRmlsdGVyQmFuayhocWQpOworCisgIEZES19RbWZEb21haW5fQ2xlYXJDb25maWd1cmVkKCZocWQtPmdsb2JhbENvbmYpOworCisgIEZES19RbWZEb21haW5fQ2xlYXJSZXF1ZXN0ZWQoJmhxZC0+Z2xvYmFsQ29uZik7Cit9CisKK3ZvaWQgRkRLX1FtZkRvbWFpbl9DbG9zZShIQU5ETEVfRkRLX1FNRl9ET01BSU4gaHFkKSB7CisgIEZES19RbWZEb21haW5fRnJlZVdvcmtCdWZmZXIoaHFkKTsKKworICBGREtfUW1mRG9tYWluX0ZyZWVQZXJzaXN0ZW50TWVtb3J5KGhxZCk7Cit9CmRpZmYgLS1naXQgYS9saWJGREsvc3JjL0ZES190b29sc19yb20uY3BwIGIvbGliRkRLL3NyYy9GREtfdG9vbHNfcm9tLmNwcAppbmRleCBmOTEyMWQxLi4wMDk1ODc4IDEwMDY0NAotLS0gYS9saWJGREsvc3JjL0ZES190b29sc19yb20uY3BwCisrKyBiL2xpYkZESy9zcmMvRkRLX3Rvb2xzX3JvbS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTE0OSArOTAsMzk5NCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBPbGl2ZXIgTW9zZXIKKwogICAgRGVzY3JpcHRpb246IFJPTSB0YWJsZXMgdXNlZCBieSBGREsgdG9vbHMKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgIkZES190b29sc19yb20uaCIKIAotCi0KLQotCi0KLQotCi0KLQotCiBSQU1fQUxJR04KIExOS19TRUNUSU9OX0NPTlNUREFUQQotY29uc3QgRklYUF9TVFAgU2luZVRhYmxlNDgwW10gPQotewotICBTVENQKDB4N2ZmZmZmZmYsIDB4MDAwMDAwMDApLCBTVENQKDB4N2ZmZmQzMTUsIDB4MDA2YjNiOWIpLCBTVENQKDB4N2ZmZjRjNTQsIDB4MDBkNjc2ZWIpLCBTVENQKDB4N2ZmZTZiYmYsIDB4MDE0MWIxYTUpLAotICBTVENQKDB4N2ZmZDMxNTQsIDB4MDFhY2ViN2MpLCBTVENQKDB4N2ZmYjlkMTUsIDB4MDIxODI0MjcpLCBTVENQKDB4N2ZmOWFmMDQsIDB4MDI4MzViNWEpLCBTVENQKDB4N2ZmNzY3MjEsIDB4MDJlZTkwYzgpLAotICBTVENQKDB4N2ZmNGM1NmYsIDB4MDM1OWM0MjgpLCBTVENQKDB4N2ZmMWM5ZWYsIDB4MDNjNGY1MmYpLCBTVENQKDB4N2ZlZTc0YTIsIDB4MDQzMDIzOGYpLCBTVENQKDB4N2ZlYWM1OGQsIDB4MDQ5YjRmMDApLAotICBTVENQKDB4N2ZlNmJjYjAsIDB4MDUwNjc3MzQpLCBTVENQKDB4N2ZlMjVhMGYsIDB4MDU3MTliZTIpLCBTVENQKDB4N2ZkZDlkYWQsIDB4MDVkY2JjYmUpLCBTVENQKDB4N2ZkODg3OGUsIDB4MDY0N2Q5N2MpLAotICBTVENQKDB4N2ZkMzE3YjQsIDB4MDZiMmYxZDIpLCBTVENQKDB4N2ZjZDRlMjQsIDB4MDcxZTA1NzUpLCBTVENQKDB4N2ZjNzJhZTIsIDB4MDc4OTE0MTgpLCBTVENQKDB4N2ZjMGFkZjIsIDB4MDdmNDFkNzIpLAotICBTVENQKDB4N2ZiOWQ3NTksIDB4MDg1ZjIxMzcpLCBTVENQKDB4N2ZiMmE3MWIsIDB4MDhjYTFmMWIpLCBTVENQKDB4N2ZhYjFkM2QsIDB4MDkzNTE2ZDQpLCBTVENQKDB4N2ZhMzM5YzUsIDB4MDlhMDA4MTcpLAotICBTVENQKDB4N2Y5YWZjYjksIDB4MGEwYWYyOTkpLCBTVENQKDB4N2Y5MjY2MWQsIDB4MGE3NWQ2MGUpLCBTVENQKDB4N2Y4OTc1ZjksIDB4MGFlMGIyMmMpLCBTVENQKDB4N2Y4MDJjNTIsIDB4MGI0Yjg2YTgpLAotICBTVENQKDB4N2Y3Njg5MmYsIDB4MGJiNjUzMzYpLCBTVENQKDB4N2Y2YzhjOTYsIDB4MGMyMTE3OGMpLCBTVENQKDB4N2Y2MjM2OGYsIDB4MGM4YmQzNWUpLCBTVENQKDB4N2Y1Nzg3MjEsIDB4MGNmNjg2NjIpLAotICBTVENQKDB4N2Y0YzdlNTQsIDB4MGQ2MTMwNGUpLCBTVENQKDB4N2Y0MTFjMmYsIDB4MGRjYmQwZDUpLCBTVENQKDB4N2YzNTYwYjksIDB4MGUzNjY3YWQpLCBTVENQKDB4N2YyOTRiZmQsIDB4MGVhMGY0OGMpLAotICBTVENQKDB4N2YxY2RlMDEsIDB4MGYwYjc3MjcpLCBTVENQKDB4N2YxMDE2Y2UsIDB4MGY3NWVmMzMpLCBTVENQKDB4N2YwMmY2NmYsIDB4MGZlMDVjNjQpLCBTVENQKDB4N2VmNTdjZWEsIDB4MTA0YWJlNzEpLAotICBTVENQKDB4N2VlN2FhNGMsIDB4MTBiNTE1MGYpLCBTVENQKDB4N2VkOTdlOWMsIDB4MTExZjVmZjQpLCBTVENQKDB4N2VjYWY5ZTUsIDB4MTE4OTllZDMpLCBTVENQKDB4N2ViYzFjMzEsIDB4MTFmM2QxNjQpLAotICBTVENQKDB4N2VhY2U1OGEsIDB4MTI1ZGY3NWIpLCBTVENQKDB4N2U5ZDU1ZmMsIDB4MTJjODEwNmYpLCBTVENQKDB4N2U4ZDZkOTEsIDB4MTMzMjFjNTMpLCBTVENQKDB4N2U3ZDJjNTQsIDB4MTM5YzFhYmYpLAotICBTVENQKDB4N2U2YzkyNTEsIDB4MTQwNjBiNjgpLCBTVENQKDB4N2U1YjlmOTMsIDB4MTQ2ZmVlMDMpLCBTVENQKDB4N2U0YTU0MjYsIDB4MTRkOWMyNDUpLCBTVENQKDB4N2UzOGIwMTcsIDB4MTU0Mzg3ZTYpLAotICBTVENQKDB4N2UyNmIzNzEsIDB4MTVhZDNlOWEpLCBTVENQKDB4N2UxNDVlNDIsIDB4MTYxNmU2MTgpLCBTVENQKDB4N2UwMWIwOTYsIDB4MTY4MDdlMTUpLCBTVENQKDB4N2RlZWFhN2EsIDB4MTZlYTA2NDYpLAotICBTVENQKDB4N2RkYjRiZmMsIDB4MTc1MzdlNjMpLCBTVENQKDB4N2RjNzk1MjksIDB4MTdiY2U2MjEpLCBTVENQKDB4N2RiMzg2MGYsIDB4MTgyNjNkMzYpLCBTVENQKDB4N2Q5ZjFlYmQsIDB4MTg4ZjgzNTcpLAotICBTVENQKDB4N2Q4YTVmNDAsIDB4MThmOGI4M2MpLCBTVENQKDB4N2Q3NTQ3YTcsIDB4MTk2MWRiOWIpLCBTVENQKDB4N2Q1ZmQ4MDEsIDB4MTljYWVkMjkpLCBTVENQKDB4N2Q0YTEwNWQsIDB4MWEzM2VjOWMpLAotICBTVENQKDB4N2QzM2YwY2EsIDB4MWE5Y2Q5YWMpLCBTVENQKDB4N2QxZDc5NTgsIDB4MWIwNWI0MGYpLCBTVENQKDB4N2QwNmFhMTYsIDB4MWI2ZTdiN2EpLCBTVENQKDB4N2NlZjgzMTUsIDB4MWJkNzJmYTQpLAotICBTVENQKDB4N2NkODA0NjQsIDB4MWMzZmQwNDUpLCBTVENQKDB4N2NjMDJlMTUsIDB4MWNhODVkMTIpLCBTVENQKDB4N2NhODAwMzgsIDB4MWQxMGQ1YzIpLCBTVENQKDB4N2M4ZjdhZGUsIDB4MWQ3OTNhMGIpLAotICBTVENQKDB4N2M3NjllMTgsIDB4MWRlMTg5YTYpLCBTVENQKDB4N2M1ZDY5ZjcsIDB4MWU0OWM0NDcpLCBTVENQKDB4N2M0M2RlOGUsIDB4MWViMWU5YTcpLCBTVENQKDB4N2MyOWZiZWUsIDB4MWYxOWY5N2IpLAotICBTVENQKDB4N2MwZmMyMmEsIDB4MWY4MWYzN2MpLCBTVENQKDB4N2JmNTMxNTMsIDB4MWZlOWQ3NWYpLCBTVENQKDB4N2JkYTQ5N2QsIDB4MjA1MWE0ZGQpLCBTVENQKDB4N2JiZjBhYmEsIDB4MjBiOTViYWMpLAotICBTVENQKDB4N2JhMzc1MWQsIDB4MjEyMGZiODMpLCBTVENQKDB4N2I4Nzg4YmEsIDB4MjE4ODg0MWEpLCBTVENQKDB4N2I2YjQ1YTUsIDB4MjFlZmY1MjgpLCBTVENQKDB4N2I0ZWFiZjEsIDB4MjI1NzRlNjUpLAotICBTVENQKDB4N2IzMWJiYjIsIDB4MjJiZThmODcpLCBTVENQKDB4N2IxNDc0ZmQsIDB4MjMyNWI4NDcpLCBTVENQKDB4N2FmNmQ3ZTYsIDB4MjM4Y2M4NWQpLCBTVENQKDB4N2FkOGU0ODIsIDB4MjNmM2JmN2UpLAotICBTVENQKDB4N2FiYTlhZTYsIDB4MjQ1YTlkNjUpLCBTVENQKDB4N2E5YmZiMjcsIDB4MjRjMTYxYzcpLCBTVENQKDB4N2E3ZDA1NWIsIDB4MjUyODBjNWUpLCBTVENQKDB4N2E1ZGI5OTcsIDB4MjU4ZTljZTApLAotICBTVENQKDB4N2EzZTE3ZjIsIDB4MjVmNTEzMDcpLCBTVENQKDB4N2ExZTIwODIsIDB4MjY1YjZlOGEpLCBTVENQKDB4NzlmZGQzNWMsIDB4MjZjMWFmMjIpLCBTVENQKDB4NzlkZDMwOTgsIDB4MjcyN2Q0ODYpLAotICBTVENQKDB4NzliYzM4NGQsIDB4Mjc4ZGRlNmUpLCBTVENQKDB4Nzk5YWVhOTIsIDB4MjdmM2NjOTQpLCBTVENQKDB4Nzk3OTQ3N2QsIDB4Mjg1OTllYjApLCBTVENQKDB4Nzk1NzRmMjgsIDB4MjhiZjU0N2IpLAotICBTVENQKDB4NzkzNTAxYTksIDB4MjkyNGVkYWMpLCBTVENQKDB4NzkxMjVmMTksIDB4Mjk4YTY5ZmMpLCBTVENQKDB4NzhlZjY3OGYsIDB4MjllZmM5MjUpLCBTVENQKDB4NzhjYzFiMjYsIDB4MmE1NTBhZGYpLAotICBTVENQKDB4NzhhODc5ZjQsIDB4MmFiYTJlZTQpLCBTVENQKDB4Nzg4NDg0MTQsIDB4MmIxZjM0ZWIpLCBTVENQKDB4Nzg2MDM5OWUsIDB4MmI4NDFjYWYpLCBTVENQKDB4NzgzYjlhYWQsIDB4MmJlOGU1ZTgpLAotICBTVENQKDB4NzgxNmE3NTksIDB4MmM0ZDkwNTApLCBTVENQKDB4NzdmMTVmYmMsIDB4MmNiMjFiYTApLCBTVENQKDB4NzdjYmMzZjIsIDB4MmQxNjg3OTIpLCBTVENQKDB4NzdhNWQ0MTMsIDB4MmQ3YWQzZGUpLAotICBTVENQKDB4Nzc3ZjkwM2MsIDB4MmRkZjAwNDApLCBTVENQKDB4Nzc1OGY4ODYsIDB4MmU0MzBjNmYpLCBTVENQKDB4NzczMjBkMGQsIDB4MmVhNmY4MjcpLCBTVENQKDB4NzcwYWNkZWMsIDB4MmYwYWMzMjApLAotICBTVENQKDB4NzZlMzNiM2YsIDB4MmY2ZTZkMTYpLCBTVENQKDB4NzZiYjU1MjEsIDB4MmZkMWY1YzEpLCBTVENQKDB4NzY5MzFiYWUsIDB4MzAzNTVjZGQpLCBTVENQKDB4NzY2YThmMDQsIDB4MzA5OGEyMjMpLAotICBTVENQKDB4NzY0MWFmM2QsIDB4MzBmYmM1NGQpLCBTVENQKDB4NzYxODdjNzcsIDB4MzE1ZWM2MTcpLCBTVENQKDB4NzVlZWY2Y2UsIDB4MzFjMWE0M2IpLCBTVENQKDB4NzVjNTFlNjEsIDB4MzIyNDVmNzIpLAotICBTVENQKDB4NzU5YWYzNGMsIDB4MzI4NmY3NzkpLCBTVENQKDB4NzU3MDc1YWMsIDB4MzJlOTZjMDkpLCBTVENQKDB4NzU0NWE1YTAsIDB4MzM0YmJjZGUpLCBTVENQKDB4NzUxYTgzNDYsIDB4MzNhZGU5YjMpLAotICBTVENQKDB4NzRlZjBlYmMsIDB4MzQwZmYyNDIpLCBTVENQKDB4NzRjMzQ4MjAsIDB4MzQ3MWQ2NDcpLCBTVENQKDB4NzQ5NzJmOTIsIDB4MzRkMzk1N2UpLCBTVENQKDB4NzQ2YWM1MmYsIDB4MzUzNTJmYTEpLAotICBTVENQKDB4NzQzZTA5MTgsIDB4MzU5NmE0NmMpLCBTVENQKDB4NzQxMGZiNmIsIDB4MzVmN2YzOWMpLCBTVENQKDB4NzNlMzljNDksIDB4MzY1OTFjZWEpLCBTVENQKDB4NzNiNWViZDEsIDB4MzZiYTIwMTQpLAotICBTVENQKDB4NzM4N2VhMjMsIDB4MzcxYWZjZDUpLCBTVENQKDB4NzM1OTk3NjAsIDB4Mzc3YmIyZTkpLCBTVENQKDB4NzMyYWYzYTcsIDB4MzdkYzQyMGMpLCBTVENQKDB4NzJmYmZmMWIsIDB4MzgzY2E5ZmIpLAotICBTVENQKDB4NzJjY2I5ZGIsIDB4Mzg5Y2VhNzIpLCBTVENQKDB4NzI5ZDI0MDksIDB4MzhmZDAzMmQpLCBTVENQKDB4NzI2ZDNkYzYsIDB4Mzk1Y2YzZTkpLCBTVENQKDB4NzIzZDA3MzQsIDB4MzliY2JjNjMpLAotICBTVENQKDB4NzIwYzgwNzUsIDB4M2ExYzVjNTcpLCBTVENQKDB4NzFkYmE5YWIsIDB4M2E3YmQzODIpLCBTVENQKDB4NzFhYTgyZjcsIDB4M2FkYjIxYTEpLCBTVENQKDB4NzE3OTBjN2UsIDB4M2IzYTQ2NzIpLAotICBTVENQKDB4NzE0NzQ2NjAsIDB4M2I5OTQxYjEpLCBTVENQKDB4NzExNTMwYzIsIDB4M2JmODEzMWMpLCBTVENQKDB4NzBlMmNiYzYsIDB4M2M1NmJhNzApLCBTVENQKDB4NzBiMDE3OTAsIDB4M2NiNTM3NmIpLAotICBTVENQKDB4NzA3ZDE0NDMsIDB4M2QxMzg5Y2IpLCBTVENQKDB4NzA0OWMyMDMsIDB4M2Q3MWIxNGQpLCBTVENQKDB4NzAxNjIwZjUsIDB4M2RjZmFkYjApLCBTVENQKDB4NmZlMjMxM2MsIDB4M2UyZDdlYjEpLAotICBTVENQKDB4NmZhZGYyZmMsIDB4M2U4YjI0MGUpLCBTVENQKDB4NmY3OTY2NWIsIDB4M2VlODlkODYpLCBTVENQKDB4NmY0NDhiN2UsIDB4M2Y0NWVhZDgpLCBTVENQKDB4NmYwZjYyODksIDB4M2ZhMzBiYzEpLAotICBTVENQKDB4NmVkOWViYTEsIDB4NDAwMDAwMDApLCBTVENQKDB4NmVhNDI2ZWQsIDB4NDA1Y2M3NTQpLCBTVENQKDB4NmU2ZTE0OTIsIDB4NDBiOTYxN2QpLCBTVENQKDB4NmUzN2I0YjYsIDB4NDExNWNlMzgpLAotICBTVENQKDB4NmUwMTA3ODAsIDB4NDE3MjBkNDYpLCBTVENQKDB4NmRjYTBkMTQsIDB4NDFjZTFlNjUpLCBTVENQKDB4NmQ5MmM1OWIsIDB4NDIyYTAxNTQpLCBTVENQKDB4NmQ1YjMxM2IsIDB4NDI4NWI1ZDQpLAotICBTVENQKDB4NmQyMzUwMWIsIDB4NDJlMTNiYTQpLCBTVENQKDB4NmNlYjIyNjEsIDB4NDMzYzkyODMpLCBTVENQKDB4NmNiMmE4MzcsIDB4NDM5N2JhMzIpLCBTVENQKDB4NmM3OWUxYzIsIDB4NDNmMmIyNzEpLAotICBTVENQKDB4NmM0MGNmMmMsIDB4NDQ0ZDdhZmYpLCBTVENQKDB4NmMwNzcwOWIsIDB4NDRhODEzOWUpLCBTVENQKDB4NmJjZGM2MzksIDB4NDUwMjdjMGMpLCBTVENQKDB4NmI5M2QwMmUsIDB4NDU1Y2I0MGMpLAotICBTVENQKDB4NmI1OThlYTMsIDB4NDViNmJiNWUpLCBTVENQKDB4NmIxZjAxYzAsIDB4NDYxMDkxYzIpLCBTVENQKDB4NmFlNDI5YWUsIDB4NDY2YTM2ZjkpLCBTVENQKDB4NmFhOTA2OTcsIDB4NDZjM2FhYzUpLAotICBTVENQKDB4NmE2ZDk4YTQsIDB4NDcxY2VjZTcpLCBTVENQKDB4NmEzMWUwMDAsIDB4NDc3NWZkMWYpLCBTVENQKDB4NjlmNWRjZDMsIDB4NDdjZWRiMzEpLCBTVENQKDB4NjliOThmNDgsIDB4NDgyNzg2ZGMpLAotICBTVENQKDB4Njk3Y2Y3OGEsIDB4NDg3ZmZmZTQpLCBTVENQKDB4Njk0MDE1YzMsIDB4NDhkODQ2MDkpLCBTVENQKDB4NjkwMmVhMWQsIDB4NDkzMDU5MGYpLCBTVENQKDB4NjhjNTc0YzQsIDB4NDk4ODM4YjYpLAotICBTVENQKDB4Njg4N2I1ZTIsIDB4NDlkZmU0YzIpLCBTVENQKDB4Njg0OWFkYTMsIDB4NGEzNzVjZjUpLCBTVENQKDB4NjgwYjVjMzMsIDB4NGE4ZWExMTEpLCBTVENQKDB4NjdjY2MxYmUsIDB4NGFlNWIwZGEpLAotICBTVENQKDB4Njc4ZGRlNmUsIDB4NGIzYzhjMTIpLCBTVENQKDB4Njc0ZWIyNzEsIDB4NGI5MzMyN2MpLCBTVENQKDB4NjcwZjNkZjMsIDB4NGJlOWEzZGIpLCBTVENQKDB4NjZjZjgxMjAsIDB4NGMzZmRmZjQpLAotICBTVENQKDB4NjY4ZjdjMjUsIDB4NGM5NWU2ODgpLCBTVENQKDB4NjY0ZjJmMmUsIDB4NGNlYmI3NWMpLCBTVENQKDB4NjYwZTlhNmEsIDB4NGQ0MTUyMzQpLCBTVENQKDB4NjVjZGJlMDUsIDB4NGQ5NmI2ZDMpLAotICBTVENQKDB4NjU4YzlhMmQsIDB4NGRlYmU0ZmUpLCBTVENQKDB4NjU0YjJmMTAsIDB4NGU0MGRjNzkpLCBTVENQKDB4NjUwOTdjZGIsIDB4NGU5NTlkMDgpLCBTVENQKDB4NjRjNzgzYmQsIDB4NGVlYTI2NzApLAotICBTVENQKDB4NjQ4NTQzZTQsIDB4NGYzZTc4NzUpLCBTVENQKDB4NjQ0MmJkN2UsIDB4NGY5MjkyZGMpLCBTVENQKDB4NjNmZmYwYmEsIDB4NGZlNjc1NmEpLCBTVENQKDB4NjNiY2RkYzcsIDB4NTAzYTFmZTUpLAotICBTVENQKDB4NjM3OTg0ZDQsIDB4NTA4ZDkyMTEpLCBTVENQKDB4NjMzNWU2MTEsIDB4NTBlMGNiYjQpLCBTVENQKDB4NjJmMjAxYWMsIDB4NTEzM2NjOTQpLCBTVENQKDB4NjJhZGQ3ZDYsIDB4NTE4Njk0NzYpLAotICBTVENQKDB4NjI2OTY4YmUsIDB4NTFkOTIzMjEpLCBTVENQKDB4NjIyNGI0OTUsIDB4NTIyYjc4NTkpLCBTVENQKDB4NjFkZmJiOGEsIDB4NTI3ZDkzZTYpLCBTVENQKDB4NjE5YTdkY2UsIDB4NTJjZjc1OGYpLAotICBTVENQKDB4NjE1NGZiOTEsIDB4NTMyMTFkMTgpLCBTVENQKDB4NjEwZjM1MDUsIDB4NTM3MjhhNGEpLCBTVENQKDB4NjBjOTJhNWEsIDB4NTNjM2JjZWEpLCBTVENQKDB4NjA4MmRiYzEsIDB4NTQxNGI0YzEpLAotICBTVENQKDB4NjAzYzQ5NmMsIDB4NTQ2NTcxOTQpLCBTVENQKDB4NWZmNTczOGQsIDB4NTRiNWYzMmMpLCBTVENQKDB4NWZhZTVhNTUsIDB4NTUwNjM5NTEpLCBTVENQKDB4NWY2NmZkZjUsIDB4NTU1NjQzYzgpLAotICBTVENQKDB4NWYxZjVlYTEsIDB4NTVhNjEyNWMpLCBTVENQKDB4NWVkNzdjOGEsIDB4NTVmNWE0ZDIpLCBTVENQKDB4NWU4ZjU3ZTIsIDB4NTY0NGZhZjQpLCBTVENQKDB4NWU0NmYwZGQsIDB4NTY5NDE0OGIpLAotICBTVENQKDB4NWRmZTQ3YWQsIDB4NTZlMmYxNWQpLCBTVENQKDB4NWRiNTVjODYsIDB4NTczMTkxMzUpLCBTVENQKDB4NWQ2YzJmOTksIDB4NTc3ZmYzZGEpLCBTVENQKDB4NWQyMmMxMWMsIDB4NTdjZTE5MTcpLAotICBTVENQKDB4NWNkOTExNDAsIDB4NTgxYzAwYjMpLCBTVENQKDB4NWM4ZjIwM2IsIDB4NTg2OWFhNzkpLCBTVENQKDB4NWM0NGVlNDAsIDB4NThiNzE2MzIpLCBTVENQKDB4NWJmYTdiODIsIDB4NTkwNDQzYTcpLAotICBTVENQKDB4NWJhZmM4MzcsIDB4NTk1MTMyYTIpLCBTVENQKDB4NWI2NGQ0OTIsIDB4NTk5ZGUyZWUpLCBTVENQKDB4NWIxOWEwYzgsIDB4NTllYTU0NTQpLCBTVENQKDB4NWFjZTJkMGYsIDB4NWEzNjg2OWYpLAotICBTVENQKDB4NWE4Mjc5OWEsIDB4NWE4Mjc5OWEpCi19OwotCi0KLVJBTV9BTElHTgotTE5LX1NFQ1RJT05fQ09OU1REQVRBCi1MTktfU0VDVElPTl9DT05TVERBVEFfTDEKLWNvbnN0IEZJWFBfU1RQIFNpbmVUYWJsZTUxMltdID0KLXsKLSAgU1RDUCgweDdmZmZmZmZmLCAweDAwMDAwMDAwKSwgU1RDUCgweDdmZmZkODg2LCAweDAwNjQ4N2UzKSwgU1RDUCgweDdmZmY2MjE2LCAweDAwYzkwZjg4KSwgU1RDUCgweDdmZmU5Y2IyLCAweDAxMmQ5NmIxKSwKLSAgU1RDUCgweDdmZmQ4ODVhLCAweDAxOTIxZDIwKSwgU1RDUCgweDdmZmMyNTBmLCAweDAxZjZhMjk3KSwgU1RDUCgweDdmZmE3MmQxLCAweDAyNWIyNmQ3KSwgU1RDUCgweDdmZjg3MWEyLCAweDAyYmZhOWE0KSwKLSAgU1RDUCgweDdmZjYyMTgyLCAweDAzMjQyYWJmKSwgU1RDUCgweDdmZjM4Mjc0LCAweDAzODhhOWVhKSwgU1RDUCgweDdmZjA5NDc4LCAweDAzZWQyNmU2KSwgU1RDUCgweDdmZWQ1NzkxLCAweDA0NTFhMTc3KSwKLSAgU1RDUCgweDdmZTljYmMwLCAweDA0YjYxOTVkKSwgU1RDUCgweDdmZTVmMTA4LCAweDA1MWE4ZTVjKSwgU1RDUCgweDdmZTFjNzZiLCAweDA1N2YwMDM1KSwgU1RDUCgweDdmZGQ0ZWVjLCAweDA1ZTM2ZWE5KSwKLSAgU1RDUCgweDdmZDg4NzhlLCAweDA2NDdkOTdjKSwgU1RDUCgweDdmZDM3MTUzLCAweDA2YWM0MDZmKSwgU1RDUCgweDdmY2UwYzNlLCAweDA3MTBhMzQ1KSwgU1RDUCgweDdmYzg1ODU0LCAweDA3NzUwMWJlKSwKLSAgU1RDUCgweDdmYzI1NTk2LCAweDA3ZDk1YjllKSwgU1RDUCgweDdmYmMwNDBhLCAweDA4M2RiMGE3KSwgU1RDUCgweDdmYjU2M2IzLCAweDA4YTIwMDlhKSwgU1RDUCgweDdmYWU3NDk1LCAweDA5MDY0YjNhKSwKLSAgU1RDUCgweDdmYTczNmI0LCAweDA5NmE5MDQ5KSwgU1RDUCgweDdmOWZhYTE1LCAweDA5Y2VjZjg5KSwgU1RDUCgweDdmOTdjZWJkLCAweDBhMzMwOGJkKSwgU1RDUCgweDdmOGZhNGIwLCAweDBhOTczYmE1KSwKLSAgU1RDUCgweDdmODcyYmYzLCAweDBhZmI2ODA1KSwgU1RDUCgweDdmN2U2NDhjLCAweDBiNWY4ZDlmKSwgU1RDUCgweDdmNzU0ZTgwLCAweDBiYzNhYzM1KSwgU1RDUCgweDdmNmJlOWQ0LCAweDBjMjdjMzg5KSwKLSAgU1RDUCgweDdmNjIzNjhmLCAweDBjOGJkMzVlKSwgU1RDUCgweDdmNTgzNGI3LCAweDBjZWZkYjc2KSwgU1RDUCgweDdmNGRlNDUxLCAweDBkNTNkYjkyKSwgU1RDUCgweDdmNDM0NTYzLCAweDBkYjdkMzc2KSwKLSAgU1RDUCgweDdmMzg1N2Y2LCAweDBlMWJjMmU0KSwgU1RDUCgweDdmMmQxYzBlLCAweDBlN2ZhOTllKSwgU1RDUCgweDdmMjE5MWI0LCAweDBlZTM4NzY2KSwgU1RDUCgweDdmMTViOGVlLCAweDBmNDc1YmZmKSwKLSAgU1RDUCgweDdmMDk5MWM0LCAweDBmYWIyNzJiKSwgU1RDUCgweDdlZmQxYzNjLCAweDEwMGVlOGFkKSwgU1RDUCgweDdlZjA1ODYwLCAweDEwNzJhMDQ4KSwgU1RDUCgweDdlZTM0NjM2LCAweDEwZDY0ZGJkKSwKLSAgU1RDUCgweDdlZDVlNWM2LCAweDExMzlmMGNmKSwgU1RDUCgweDdlYzgzNzFhLCAweDExOWQ4OTQxKSwgU1RDUCgweDdlYmEzYTM5LCAweDEyMDExNmQ1KSwgU1RDUCgweDdlYWJlZjJjLCAweDEyNjQ5OTRlKSwKLSAgU1RDUCgweDdlOWQ1NWZjLCAweDEyYzgxMDZmKSwgU1RDUCgweDdlOGU2ZWIyLCAweDEzMmI3YmY5KSwgU1RDUCgweDdlN2YzOTU3LCAweDEzOGVkYmIxKSwgU1RDUCgweDdlNmZiNWY0LCAweDEzZjIyZjU4KSwKLSAgU1RDUCgweDdlNWZlNDkzLCAweDE0NTU3NmIxKSwgU1RDUCgweDdlNGZjNTNlLCAweDE0YjhiMTdmKSwgU1RDUCgweDdlM2Y1N2ZmLCAweDE1MWJkZjg2KSwgU1RDUCgweDdlMmU5Y2RmLCAweDE1N2YwMDg2KSwKLSAgU1RDUCgweDdlMWQ5M2VhLCAweDE1ZTIxNDQ1KSwgU1RDUCgweDdlMGMzZDI5LCAweDE2NDUxYTgzKSwgU1RDUCgweDdkZmE5OGE4LCAweDE2YTgxMzA1KSwgU1RDUCgweDdkZThhNjcwLCAweDE3MGFmZDhkKSwKLSAgU1RDUCgweDdkZDY2NjhmLCAweDE3NmRkOWRlKSwgU1RDUCgweDdkYzNkOTBkLCAweDE3ZDBhN2JjKSwgU1RDUCgweDdkYjBmZGY4LCAweDE4MzM2NmU5KSwgU1RDUCgweDdkOWRkNTVhLCAweDE4OTYxNzI4KSwKLSAgU1RDUCgweDdkOGE1ZjQwLCAweDE4ZjhiODNjKSwgU1RDUCgweDdkNzY5YmI1LCAweDE5NWI0OWVhKSwgU1RDUCgweDdkNjI4YWM2LCAweDE5YmRjYmYzKSwgU1RDUCgweDdkNGUyYzdmLCAweDFhMjAzZTFiKSwKLSAgU1RDUCgweDdkMzk4MGVjLCAweDFhODJhMDI2KSwgU1RDUCgweDdkMjQ4ODFiLCAweDFhZTRmMWQ2KSwgU1RDUCgweDdkMGY0MjE4LCAweDFiNDczMmVmKSwgU1RDUCgweDdjZjlhZWYwLCAweDFiYTk2MzM1KSwKLSAgU1RDUCgweDdjZTNjZWIyLCAweDFjMGI4MjZhKSwgU1RDUCgweDdjY2RhMTY5LCAweDFjNmQ5MDUzKSwgU1RDUCgweDdjYjcyNzI0LCAweDFjY2Y4Y2IzKSwgU1RDUCgweDdjYTA1ZmYxLCAweDFkMzE3NzRkKSwKLSAgU1RDUCgweDdjODk0YmRlLCAweDFkOTM0ZmU1KSwgU1RDUCgweDdjNzFlYWY5LCAweDFkZjUxNjNmKSwgU1RDUCgweDdjNWEzZDUwLCAweDFlNTZjYTFlKSwgU1RDUCgweDdjNDI0MmYyLCAweDFlYjg2YjQ2KSwKLSAgU1RDUCgweDdjMjlmYmVlLCAweDFmMTlmOTdiKSwgU1RDUCgweDdjMTE2ODUzLCAweDFmN2I3NDgxKSwgU1RDUCgweDdiZjg4ODMwLCAweDFmZGNkYzFiKSwgU1RDUCgweDdiZGY1Yjk0LCAweDIwM2UzMDBkKSwKLSAgU1RDUCgweDdiYzVlMjkwLCAweDIwOWY3MDFjKSwgU1RDUCgweDdiYWMxZDMxLCAweDIxMDA5YzBjKSwgU1RDUCgweDdiOTIwYjg5LCAweDIxNjFiM2EwKSwgU1RDUCgweDdiNzdhZGE4LCAweDIxYzJiNjljKSwKLSAgU1RDUCgweDdiNWQwMzllLCAweDIyMjNhNGM1KSwgU1RDUCgweDdiNDIwZDdhLCAweDIyODQ3ZGUwKSwgU1RDUCgweDdiMjZjYjRmLCAweDIyZTU0MWFmKSwgU1RDUCgweDdiMGIzZDJjLCAweDIzNDVlZmY4KSwKLSAgU1RDUCgweDdhZWY2MzIzLCAweDIzYTY4ODdmKSwgU1RDUCgweDdhZDMzZDQ1LCAweDI0MDcwYjA4KSwgU1RDUCgweDdhYjZjYmE0LCAweDI0Njc3NzU4KSwgU1RDUCgweDdhOWEwZTUwLCAweDI0YzdjZDMzKSwKLSAgU1RDUCgweDdhN2QwNTViLCAweDI1MjgwYzVlKSwgU1RDUCgweDdhNWZiMGQ4LCAweDI1ODgzNDlkKSwgU1RDUCgweDdhNDIxMGQ4LCAweDI1ZTg0NWI2KSwgU1RDUCgweDdhMjQyNTZmLCAweDI2NDgzZjZjKSwKLSAgU1RDUCgweDdhMDVlZWFkLCAweDI2YTgyMTg2KSwgU1RDUCgweDc5ZTc2Y2E3LCAweDI3MDdlYmM3KSwgU1RDUCgweDc5Yzg5ZjZlLCAweDI3Njc5ZGY0KSwgU1RDUCgweDc5YTk4NzE1LCAweDI3YzczN2QzKSwKLSAgU1RDUCgweDc5OGEyM2IxLCAweDI4MjZiOTI4KSwgU1RDUCgweDc5NmE3NTU0LCAweDI4ODYyMWI5KSwgU1RDUCgweDc5NGE3YzEyLCAweDI4ZTU3MTRiKSwgU1RDUCgweDc5MmEzN2ZlLCAweDI5NDRhN2EyKSwKLSAgU1RDUCgweDc5MDlhOTJkLCAweDI5YTNjNDg1KSwgU1RDUCgweDc4ZThjZmIyLCAweDJhMDJjN2I4KSwgU1RDUCgweDc4YzdhYmEyLCAweDJhNjFiMTAxKSwgU1RDUCgweDc4YTYzZDExLCAweDJhYzA4MDI2KSwKLSAgU1RDUCgweDc4ODQ4NDE0LCAweDJiMWYzNGViKSwgU1RDUCgweDc4NjI4MGJmLCAweDJiN2RjZjE3KSwgU1RDUCgweDc4NDAzMzI5LCAweDJiZGM0ZTZmKSwgU1RDUCgweDc4MWQ5YjY1LCAweDJjM2FiMmI5KSwKLSAgU1RDUCgweDc3ZmFiOTg5LCAweDJjOThmYmJhKSwgU1RDUCgweDc3ZDc4ZGFhLCAweDJjZjcyOTM5KSwgU1RDUCgweDc3YjQxN2RmLCAweDJkNTUzYWZjKSwgU1RDUCgweDc3OTA1ODNlLCAweDJkYjMzMGM3KSwKLSAgU1RDUCgweDc3NmM0ZWRiLCAweDJlMTEwYTYyKSwgU1RDUCgweDc3NDdmYmNlLCAweDJlNmVjNzkyKSwgU1RDUCgweDc3MjM1ZjJkLCAweDJlY2M2ODFlKSwgU1RDUCgweDc2ZmU3OTBlLCAweDJmMjllYmNjKSwKLSAgU1RDUCgweDc2ZDk0OTg5LCAweDJmODc1MjYyKSwgU1RDUCgweDc2YjNkMGI0LCAweDJmZTQ5YmE3KSwgU1RDUCgweDc2OGUwZWE2LCAweDMwNDFjNzYxKSwgU1RDUCgweDc2NjgwMzc2LCAweDMwOWVkNTU2KSwKLSAgU1RDUCgweDc2NDFhZjNkLCAweDMwZmJjNTRkKSwgU1RDUCgweDc2MWIxMjExLCAweDMxNTg5NzBlKSwgU1RDUCgweDc1ZjQyYzBiLCAweDMxYjU0YTVlKSwgU1RDUCgweDc1Y2NmZDQyLCAweDMyMTFkZjA0KSwKLSAgU1RDUCgweDc1YTU4NWNmLCAweDMyNmU1NGM3KSwgU1RDUCgweDc1N2RjNWNhLCAweDMyY2FhYjZmKSwgU1RDUCgweDc1NTViZDRjLCAweDMzMjZlMmMzKSwgU1RDUCgweDc1MmQ2YzZjLCAweDMzODJmYTg4KSwKLSAgU1RDUCgweDc1MDRkMzQ1LCAweDMzZGVmMjg3KSwgU1RDUCgweDc0ZGJmMWVmLCAweDM0M2FjYTg3KSwgU1RDUCgweDc0YjJjODg0LCAweDM0OTY4MjUwKSwgU1RDUCgweDc0ODk1NzFjLCAweDM0ZjIxOWE4KSwKLSAgU1RDUCgweDc0NWY5ZGQxLCAweDM1NGQ5MDU3KSwgU1RDUCgweDc0MzU5Y2JkLCAweDM1YThlNjI1KSwgU1RDUCgweDc0MGI1M2ZiLCAweDM2MDQxYWQ5KSwgU1RDUCgweDczZTBjM2EzLCAweDM2NWYyZTNiKSwKLSAgU1RDUCgweDczYjVlYmQxLCAweDM2YmEyMDE0KSwgU1RDUCgweDczOGFjYzllLCAweDM3MTRmMDJhKSwgU1RDUCgweDczNWY2NjI2LCAweDM3NmY5ZTQ2KSwgU1RDUCgweDczMzNiODgzLCAweDM3Y2EyYTMwKSwKLSAgU1RDUCgweDczMDdjM2QwLCAweDM4MjQ5M2IwKSwgU1RDUCgweDcyZGI4ODI4LCAweDM4N2VkYThlKSwgU1RDUCgweDcyYWYwNWE3LCAweDM4ZDhmZTkzKSwgU1RDUCgweDcyODIzYzY3LCAweDM5MzJmZjg3KSwKLSAgU1RDUCgweDcyNTUyYzg1LCAweDM5OGNkZDMyKSwgU1RDUCgweDcyMjdkNjFjLCAweDM5ZTY5NzVlKSwgU1RDUCgweDcxZmEzOTQ5LCAweDNhNDAyZGQyKSwgU1RDUCgweDcxY2M1NjI2LCAweDNhOTlhMDU3KSwKLSAgU1RDUCgweDcxOWUyY2QyLCAweDNhZjJlZWI3KSwgU1RDUCgweDcxNmZiZDY4LCAweDNiNGMxOGJhKSwgU1RDUCgweDcxNDEwODA1LCAweDNiYTUxZTI5KSwgU1RDUCgweDcxMTIwY2M1LCAweDNiZmRmZWNkKSwKLSAgU1RDUCgweDcwZTJjYmM2LCAweDNjNTZiYTcwKSwgU1RDUCgweDcwYjM0NTI1LCAweDNjYWY1MGRhKSwgU1RDUCgweDcwODM3OGZmLCAweDNkMDdjMWQ2KSwgU1RDUCgweDcwNTM2NzcxLCAweDNkNjAwZDJjKSwKLSAgU1RDUCgweDcwMjMxMDlhLCAweDNkYjgzMmE2KSwgU1RDUCgweDZmZjI3NDk3LCAweDNlMTAzMjBkKSwgU1RDUCgweDZmYzE5Mzg1LCAweDNlNjgwYjJjKSwgU1RDUCgweDZmOTA2ZDg0LCAweDNlYmZiZGNkKSwKLSAgU1RDUCgweDZmNWYwMmIyLCAweDNmMTc0OWI4KSwgU1RDUCgweDZmMmQ1MzJjLCAweDNmNmVhZWI4KSwgU1RDUCgweDZlZmI1ZjEyLCAweDNmYzVlYzk4KSwgU1RDUCgweDZlYzkyNjgzLCAweDQwMWQwMzIxKSwKLSAgU1RDUCgweDZlOTZhOTlkLCAweDQwNzNmMjFkKSwgU1RDUCgweDZlNjNlODdmLCAweDQwY2FiOTU4KSwgU1RDUCgweDZlMzBlMzRhLCAweDQxMjE1ODliKSwgU1RDUCgweDZkZmQ5YTFjLCAweDQxNzdjZmIxKSwKLSAgU1RDUCgweDZkY2EwZDE0LCAweDQxY2UxZTY1KSwgU1RDUCgweDZkOTYzYzU0LCAweDQyMjQ0NDgxKSwgU1RDUCgweDZkNjIyN2ZhLCAweDQyN2E0MWQwKSwgU1RDUCgweDZkMmRkMDI3LCAweDQyZDAxNjFlKSwKLSAgU1RDUCgweDZjZjkzNGZjLCAweDQzMjVjMTM1KSwgU1RDUCgweDZjYzQ1Njk4LCAweDQzN2I0MmUxKSwgU1RDUCgweDZjOGYzNTFjLCAweDQzZDA5YWVkKSwgU1RDUCgweDZjNTlkMGE5LCAweDQ0MjVjOTIzKSwKLSAgU1RDUCgweDZjMjQyOTYwLCAweDQ0N2FjZDUwKSwgU1RDUCgweDZiZWUzZjYyLCAweDQ0Y2ZhNzQwKSwgU1RDUCgweDZiYjgxMmQxLCAweDQ1MjQ1NmJkKSwgU1RDUCgweDZiODFhM2NkLCAweDQ1NzhkYjkzKSwKLSAgU1RDUCgweDZiNGFmMjc5LCAweDQ1Y2QzNThmKSwgU1RDUCgweDZiMTNmZWY1LCAweDQ2MjE2NDdkKSwgU1RDUCgweDZhZGNjOTY0LCAweDQ2NzU2ODI4KSwgU1RDUCgweDZhYTU1MWU5LCAweDQ2Yzk0MDVjKSwKLSAgU1RDUCgweDZhNmQ5OGE0LCAweDQ3MWNlY2U3KSwgU1RDUCgweDZhMzU5ZGI5LCAweDQ3NzA2ZDkzKSwgU1RDUCgweDY5ZmQ2MTRhLCAweDQ3YzNjMjJmKSwgU1RDUCgweDY5YzRlMzdhLCAweDQ4MTZlYTg2KSwKLSAgU1RDUCgweDY5OGMyNDZjLCAweDQ4NjllNjY1KSwgU1RDUCgweDY5NTMyNDQyLCAweDQ4YmNiNTk5KSwgU1RDUCgweDY5MTllMzIwLCAweDQ5MGY1N2VlKSwgU1RDUCgweDY4ZTA2MTI5LCAweDQ5NjFjZDMzKSwKLSAgU1RDUCgweDY4YTY5ZTgxLCAweDQ5YjQxNTMzKSwgU1RDUCgweDY4NmM5YjRiLCAweDRhMDYyZmJkKSwgU1RDUCgweDY4MzI1N2FiLCAweDRhNTgxYzllKSwgU1RDUCgweDY3ZjdkM2M1LCAweDRhYTlkYmEyKSwKLSAgU1RDUCgweDY3YmQwZmJkLCAweDRhZmI2Yzk4KSwgU1RDUCgweDY3ODIwYmI3LCAweDRiNGNjZjRkKSwgU1RDUCgweDY3NDZjN2Q4LCAweDRiOWUwMzkwKSwgU1RDUCgweDY3MGI0NDQ0LCAweDRiZWYwOTJkKSwKLSAgU1RDUCgweDY2Y2Y4MTIwLCAweDRjM2ZkZmY0KSwgU1RDUCgweDY2OTM3ZTkxLCAweDRjOTA4N2IxKSwgU1RDUCgweDY2NTczY2JiLCAweDRjZTEwMDM0KSwgU1RDUCgweDY2MWFiYmM1LCAweDRkMzE0OTRiKSwKLSAgU1RDUCgweDY1ZGRmYmQzLCAweDRkODE2MmM0KSwgU1RDUCgweDY1YTBmZDBiLCAweDRkZDE0YzZlKSwgU1RDUCgweDY1NjNiZjkyLCAweDRlMjEwNjE3KSwgU1RDUCgweDY1MjY0MzhmLCAweDRlNzA4ZjhmKSwKLSAgU1RDUCgweDY0ZTg4OTI2LCAweDRlYmZlOGE1KSwgU1RDUCgweDY0YWE5MDdmLCAweDRmMGYxMTI2KSwgU1RDUCgweDY0NmM1OWJmLCAweDRmNWUwOGUzKSwgU1RDUCgweDY0MmRlNTBkLCAweDRmYWNjZmFiKSwKLSAgU1RDUCgweDYzZWYzMjkwLCAweDRmZmI2NTRkKSwgU1RDUCgweDYzYjA0MjZkLCAweDUwNDljOTk5KSwgU1RDUCgweDYzNzExNGNjLCAweDUwOTdmYzVlKSwgU1RDUCgweDYzMzFhOWQ0LCAweDUwZTVmZDZkKSwKLSAgU1RDUCgweDYyZjIwMWFjLCAweDUxMzNjYzk0KSwgU1RDUCgweDYyYjIxYzdiLCAweDUxODE2OWE1KSwgU1RDUCgweDYyNzFmYTY5LCAweDUxY2VkNDZlKSwgU1RDUCgweDYyMzE5YjlkLCAweDUyMWMwY2MyKSwKLSAgU1RDUCgweDYxZjEwMDNmLCAweDUyNjkxMjZlKSwgU1RDUCgweDYxYjAyODc2LCAweDUyYjVlNTQ2KSwgU1RDUCgweDYxNmYxNDZjLCAweDUzMDI4NTE4KSwgU1RDUCgweDYxMmRjNDQ3LCAweDUzNGVmMWI1KSwKLSAgU1RDUCgweDYwZWMzODMwLCAweDUzOWIyYWYwKSwgU1RDUCgweDYwYWE3MDUwLCAweDUzZTczMDk3KSwgU1RDUCgweDYwNjg2Y2NmLCAweDU0MzMwMjdkKSwgU1RDUCgweDYwMjYyZGQ2LCAweDU0N2VhMDczKSwKLSAgU1RDUCgweDVmZTNiMzhkLCAweDU0Y2EwYTRiKSwgU1RDUCgweDVmYTBmZTFmLCAweDU1MTUzZmQ0KSwgU1RDUCgweDVmNWUwZGIzLCAweDU1NjA0MGUyKSwgU1RDUCgweDVmMWFlMjc0LCAweDU1YWIwZDQ2KSwKLSAgU1RDUCgweDVlZDc3YzhhLCAweDU1ZjVhNGQyKSwgU1RDUCgweDVlOTNkYzFmLCAweDU2NDAwNzU4KSwgU1RDUCgweDVlNTAwMTVkLCAweDU2OGEzNGE5KSwgU1RDUCgweDVlMGJlYzZlLCAweDU2ZDQyYzk5KSwKLSAgU1RDUCgweDVkYzc5ZDdjLCAweDU3MWRlZWZhKSwgU1RDUCgweDVkODMxNGIxLCAweDU3Njc3YjlkKSwgU1RDUCgweDVkM2U1MjM3LCAweDU3YjBkMjU2KSwgU1RDUCgweDVjZjk1NjM4LCAweDU3ZjlmMmY4KSwKLSAgU1RDUCgweDVjYjQyMGUwLCAweDU4NDJkZDU0KSwgU1RDUCgweDVjNmViMjU4LCAweDU4OGI5MTQwKSwgU1RDUCgweDVjMjkwYWNjLCAweDU4ZDQwZThjKSwgU1RDUCgweDViZTMyYTY3LCAweDU5MWM1NTBlKSwKLSAgU1RDUCgweDViOWQxMTU0LCAweDU5NjQ2NDk4KSwgU1RDUCgweDViNTZiZmJkLCAweDU5YWMzY2ZkKSwgU1RDUCgweDViMTAzNWNmLCAweDU5ZjNkZTEyKSwgU1RDUCgweDVhYzk3M2I1LCAweDVhM2I0N2FiKSwKLSAgU1RDUCgweDVhODI3OTlhLCAweDVhODI3OTlhKQotfTsKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLS8qIGdlbmVyYXRlX2ZmdF90YWJsZXMubSA0IDE1ICovCi1SQU1fQUxJR04KLUxOS19TRUNUSU9OX0NPTlNUREFUQQotY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDYwW10gPQotewotICBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4NzliYzM4NGQpLAotICBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4Njc4ZGRlNmUpLAotICBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NGIzYzhjMTIpLAotICBTVEMoMHg3NGVmMGViYyksIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4Mjc4ZGRlNmUpLAotICBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MDAwMDAwMDApLAotICBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4ZDg3MjIxOTEpLAotICBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4YjRjMzczZWQpLAotICBTVEMoMHg1NWE2MTI1YyksIFNUQygweGYyOWVjZmIxKSwgU1RDKDB4OTg3MjIxOTEpLAotICBTVEMoMHg0YjNjOGMxMiksIFNUQygweGQ4NzIyMTkxKSwgU1RDKDB4ODY0M2M3YjIpLAotICBTVEMoMHg0MDAwMDAwMCksIFNUQygweGJmZmZmZmZmKSwgU1RDKDB4ODAwMDAwMDApLAotICBTVEMoMHgzNDBmZjI0MiksIFNUQygweGFhNTllZGEzKSwgU1RDKDB4ODY0M2M3YjIpLAotICBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDk4NzIyMTkxKSwgU1RDKDB4OTg3MjIxOTEpLAotICBTVEMoMHgxYTljZDlhYyksIFNUQygweDhiMTBmMTQzKSwgU1RDKDB4YjRjMzczZWQpLAotICBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDgyY2MwZjM1KSwgU1RDKDB4ZDg3MjIxOTEpLAotfTsKLVJBTV9BTElHTgotTE5LX1NFQ1RJT05fQ09OU1REQVRBCi1jb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnNjBbXSA9Ci17Ci0gIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgyNzhkZGU2ZSksCi0gIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHg0YjNjOGMxMiksCi0gIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg2NzhkZGU2ZSksCi0gIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg3OWJjMzg0ZCksCi0gIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg3ZmZmZmZmZiksCi0gIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3OWJjMzg0ZCksCi0gIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg2NzhkZGU2ZSksCi0gIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg0YjNjOGMxMiksCi0gIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHgyNzhkZGU2ZSksCi0gIFNUQygweDZlZDllYmExKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHgwMDAwMDAwMCksCi0gIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHhkODcyMjE5MSksCi0gIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHhiNGMzNzNlZCksCi0gIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHg5ODcyMjE5MSksCi0gIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHg4NjQzYzdiMiksCi19OwotCi0KLQotUkFNX0FMSUdOCi1MTktfU0VDVElPTl9DT05TVERBVEEKLWNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWwyNDBbXSA9Ci17Ci0gIFNUQygweDdmZjRjNTZmKSwgU1RDKDB4N2ZkMzE3YjQpLCBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdkZGI0YmZjKSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3Yzc2OWUxOCksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4N2FiYTlhZTYpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc4YTg3OWY0KSwgU1RDKDB4Nzc3ZjkwM2MpLCBTVEMoMHg3NjQxYWYzZCksCi0gIFNUQygweDdmZDMxN2I0KSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc3N2Y5MDNjKSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NmI1OThlYTMpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDYzNzk4NGQ0KSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg1YTgyNzk5YSksCi0gIFNUQygweDdmOWFmY2I5KSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3Yzc2OWUxOCksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2MTU0ZmI5MSksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NTMyMTFkMTgpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDQyZTEzYmE0KSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHgzMGZiYzU0ZCksCi0gIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHgwMDAwMDAwMCksCi0gIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGVmNGFlYWYwKSwgU1RDKDB4ZGVkZjA0N2MpLCBTVEMoMHhjZjA0M2FiMiksCi0gIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgxNDA2MGI2OCksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZWJmOWY0OTcpLCBTVEMoMHhkODcyMjE5MSksIFNUQygweGM1ZTNhM2E4KSwgU1RDKDB4YjRjMzczZWQpLCBTVEMoMHhhNTdkODY2NSksCi0gIFNUQygweDdkZGI0YmZjKSwgU1RDKDB4Nzc3ZjkwM2MpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDI0NWE5ZDY1KSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHhmNWY1MGQ2NiksIFNUQygweGRlZGYwNDdjKSwgU1RDKDB4YzhlNTAzMmEpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweGEzMjZlZWJmKSwgU1RDKDB4OTRhNjcxNWMpLCBTVEMoMHg4OWJlNTBjMiksCi0gIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4ZjI5ZWNmYjEpLCBTVEMoMHhkODcyMjE5MSksIFNUQygweGJmZmZmZmZmKSwgU1RDKDB4YWE1OWVkYTMpLCBTVEMoMHg5ODcyMjE5MSksIFNUQygweDhiMTBmMTQzKSwgU1RDKDB4ODJjYzBmMzUpLCBTVEMoMHg4MDAwMDAwMCksCi0gIFNUQygweDdjNzY5ZTE4KSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2MTU0ZmI5MSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgxNDA2MGI2OCksIFNUQygweGY1ZjUwZDY2KSwgU1RDKDB4ZDg3MjIxOTEpLCBTVEMoMHhiZDFlYzQ1YiksIFNUQygweGE1N2Q4NjY1KSwgU1RDKDB4OTJkY2FmZTQpLCBTVEMoMHg4NjQzYzdiMiksIFNUQygweDgwNjUwMzQ2KSwgU1RDKDB4ODE5MzZkYWUpLCBTVEMoMHg4OWJlNTBjMiksCi0gIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGRlZGYwNDdjKSwgU1RDKDB4YmZmZmZmZmYpLCBTVEMoMHhhNTdkODY2NSksIFNUQygweDkxMjYxNDVlKSwgU1RDKDB4ODQ1YzhhZTIpLCBTVEMoMHg4MDAwMDAwMCksIFNUQygweDg0NWM4YWUyKSwgU1RDKDB4OTEyNjE0NWUpLCBTVEMoMHhhNTdkODY2NSksCi0gIFNUQygweDdhYmE5YWU2KSwgU1RDKDB4NmI1OThlYTMpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHhlYmY5ZjQ5NyksIFNUQygweGM4ZTUwMzJhKSwgU1RDKDB4YWE1OWVkYTMpLCBTVEMoMHg5MmRjYWZlNCksIFNUQygweDg0NWM4YWUyKSwgU1RDKDB4ODAwYjNhOTApLCBTVEMoMHg4NjQzYzdiMiksIFNUQygweDk2ODMwODc1KSwgU1RDKDB4YWY3MjZkZWUpLCBTVEMoMHhjZjA0M2FiMiksCi0gIFNUQygweDc5YmMzODRkKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhkODcyMjE5MSksIFNUQygweGI0YzM3M2VkKSwgU1RDKDB4OTg3MjIxOTEpLCBTVEMoMHg4NjQzYzdiMiksIFNUQygweDgwMDAwMDAwKSwgU1RDKDB4ODY0M2M3YjIpLCBTVEMoMHg5ODcyMjE5MSksIFNUQygweGI0YzM3M2VkKSwgU1RDKDB4ZDg3MjIxOTEpLCBTVEMoMHhmZmZmZmZmZiksCi0gIFNUQygweDc4YTg3OWY0KSwgU1RDKDB4NjM3OTg0ZDQpLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4ZWY0YWVhZjApLCBTVEMoMHhjNWUzYTNhOCksIFNUQygweGEzMjZlZWJmKSwgU1RDKDB4OGIxMGYxNDMpLCBTVEMoMHg4MDY1MDM0NiksIFNUQygweDg0NWM4YWUyKSwgU1RDKDB4OTY4MzA4NzUpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweGRiYTU2MjlhKSwgU1RDKDB4MDZiMmYxZDIpLCBTVEMoMHgzMGZiYzU0ZCksCi0gIFNUQygweDc3N2Y5MDNjKSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4ZGVkZjA0N2MpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweDk0YTY3MTVjKSwgU1RDKDB4ODJjYzBmMzUpLCBTVEMoMHg4MTkzNmRhZSksIFNUQygweDkxMjYxNDVlKSwgU1RDKDB4YWY3MjZkZWUpLCBTVEMoMHhkODcyMjE5MSksIFNUQygweDA2YjJmMWQyKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHg1YTgyNzk5YSksCi19OwotUkFNX0FMSUdOCi1MTktfU0VDVElPTl9DT05TVERBVEEKLWNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvckltYWcyNDBbXSA9Ci17Ci0gIFNUQygweDAzNTljNDI4KSwgU1RDKDB4MDZiMmYxZDIpLCBTVEMoMHgwYTBhZjI5OSksIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgxNDA2MGI2OCksIFNUQygweDE3NTM3ZTYzKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgxZGUxODlhNiksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MjQ1YTlkNjUpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDJhYmEyZWU0KSwgU1RDKDB4MmRkZjAwNDApLCBTVEMoMHgzMGZiYzU0ZCksCi0gIFNUQygweDA2YjJmMWQyKSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHgxNDA2MGI2OCksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDJkZGYwMDQwKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NDViNmJiNWUpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDUwOGQ5MjExKSwgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg1YTgyNzk5YSksCi0gIFNUQygweDBhMGFmMjk5KSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgxZGUxODlhNiksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDQyZTEzYmE0KSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3NjQxYWYzZCksCi0gIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZmZmZmZmZiksCi0gIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3NjQxYWYzZCksCi0gIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1YTgyNzk5YSksCi0gIFNUQygweDE3NTM3ZTYzKSwgU1RDKDB4MmRkZjAwNDApLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDdhYmE5YWU2KSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzM4N2VhMjMpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDU4MWMwMGIzKSwgU1RDKDB4NDViNmJiNWUpLCBTVEMoMHgzMGZiYzU0ZCksCi0gIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgwMDAwMDAwMCksCi0gIFNUQygweDFkZTE4OWE2KSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdmOWFmY2I5KSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDBhMGFmMjk5KSwgU1RDKDB4ZWJmOWY0OTcpLCBTVEMoMHhjZjA0M2FiMiksCi0gIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDZlZDllYmExKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGRlZGYwNDdjKSwgU1RDKDB4YmZmZmZmZmYpLCBTVEMoMHhhNTdkODY2NSksCi0gIFNUQygweDI0NWE5ZDY1KSwgU1RDKDB4NDViNmJiNWUpLCBTVEMoMHg2MTU0ZmI5MSksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDczODdlYTIzKSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4ZmNhNjNiZDcpLCBTVEMoMHhkODcyMjE5MSksIFNUQygweGI3ODAwMDFiKSwgU1RDKDB4OWM4NjdiMmIpLCBTVEMoMHg4OWJlNTBjMiksCi0gIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZDg3MjIxOTEpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweDk4NzIyMTkxKSwgU1RDKDB4ODY0M2M3YjIpLCBTVEMoMHg4MDAwMDAwMCksCi0gIFNUQygweDJhYmEyZWU0KSwgU1RDKDB4NTA4ZDkyMTEpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDU4MWMwMGIzKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHgwYTBhZjI5OSksIFNUQygweGRlZGYwNDdjKSwgU1RDKDB4Yjc4MDAwMWIpLCBTVEMoMHg5ODcyMjE5MSksIFNUQygweDg1NDU2NTE5KSwgU1RDKDB4ODAyY2U4NGIpLCBTVEMoMHg4OWJlNTBjMiksCi0gIFNUQygweDJkZGYwMDQwKSwgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDQ1YjZiYjVlKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHhlYmY5ZjQ5NyksIFNUQygweGJmZmZmZmZmKSwgU1RDKDB4OWM4NjdiMmIpLCBTVEMoMHg4NjQzYzdiMiksIFNUQygweDgwMmNlODRiKSwgU1RDKDB4OGIxMGYxNDMpLCBTVEMoMHhhNTdkODY2NSksCitjb25zdCBGSVhQX1NUUCBTaW5lVGFibGU4MFtdID0geworICAgIFNUQ1AoMHg3ZmZmZmZmZiwgMHgwMDAwMDAwMCksIFNUQ1AoMHg3ZmY5YWYwNCwgMHgwMjgzNWI1YSksCisgICAgU1RDUCgweDdmZTZiY2IwLCAweDA1MDY3NzM0KSwgU1RDUCgweDdmYzcyYWUyLCAweDA3ODkxNDE4KSwKKyAgICBTVENQKDB4N2Y5YWZjYjksIDB4MGEwYWYyOTkpLCBTVENQKDB4N2Y2MjM2OGYsIDB4MGM4YmQzNWUpLAorICAgIFNUQ1AoMHg3ZjFjZGUwMSwgMHgwZjBiNzcyNyksIFNUQ1AoMHg3ZWNhZjllNSwgMHgxMTg5OWVkMyksCisgICAgU1RDUCgweDdlNmM5MjUxLCAweDE0MDYwYjY4KSwgU1RDUCgweDdlMDFiMDk2LCAweDE2ODA3ZTE1KSwKKyAgICBTVENQKDB4N2Q4YTVmNDAsIDB4MThmOGI4M2MpLCBTVENQKDB4N2QwNmFhMTYsIDB4MWI2ZTdiN2EpLAorICAgIFNUQ1AoMHg3Yzc2OWUxOCwgMHgxZGUxODlhNiksIFNUQ1AoMHg3YmRhNDk3ZCwgMHgyMDUxYTRkZCksCisgICAgU1RDUCgweDdiMzFiYmIyLCAweDIyYmU4Zjg3KSwgU1RDUCgweDdhN2QwNTViLCAweDI1MjgwYzVlKSwKKyAgICBTVENQKDB4NzliYzM4NGQsIDB4Mjc4ZGRlNmUpLCBTVENQKDB4NzhlZjY3OGYsIDB4MjllZmM5MjUpLAorICAgIFNUQ1AoMHg3ODE2YTc1OSwgMHgyYzRkOTA1MCksIFNUQ1AoMHg3NzMyMGQwZCwgMHgyZWE2ZjgyNyksCisgICAgU1RDUCgweDc2NDFhZjNkLCAweDMwZmJjNTRkKSwgU1RDUCgweDc1NDVhNWEwLCAweDMzNGJiY2RlKSwKKyAgICBTVENQKDB4NzQzZTA5MTgsIDB4MzU5NmE0NmMpLCBTVENQKDB4NzMyYWYzYTcsIDB4MzdkYzQyMGMpLAorICAgIFNUQ1AoMHg3MjBjODA3NSwgMHgzYTFjNWM1NyksIFNUQ1AoMHg3MGUyY2JjNiwgMHgzYzU2YmE3MCksCisgICAgU1RDUCgweDZmYWRmMmZjLCAweDNlOGIyNDBlKSwgU1RDUCgweDZlNmUxNDkyLCAweDQwYjk2MTdkKSwKKyAgICBTVENQKDB4NmQyMzUwMWIsIDB4NDJlMTNiYTQpLCBTVENQKDB4NmJjZGM2MzksIDB4NDUwMjdjMGMpLAorICAgIFNUQ1AoMHg2YTZkOThhNCwgMHg0NzFjZWNlNyksIFNUQ1AoMHg2OTAyZWExZCwgMHg0OTMwNTkwZiksCisgICAgU1RDUCgweDY3OGRkZTZlLCAweDRiM2M4YzEyKSwgU1RDUCgweDY2MGU5YTZhLCAweDRkNDE1MjM0KSwKKyAgICBTVENQKDB4NjQ4NTQzZTQsIDB4NGYzZTc4NzUpLCBTVENQKDB4NjJmMjAxYWMsIDB4NTEzM2NjOTQpLAorICAgIFNUQ1AoMHg2MTU0ZmI5MSwgMHg1MzIxMWQxOCksIFNUQ1AoMHg1ZmFlNWE1NSwgMHg1NTA2Mzk1MSksCisgICAgU1RDUCgweDVkZmU0N2FkLCAweDU2ZTJmMTVkKSwgU1RDUCgweDVjNDRlZTQwLCAweDU4YjcxNjMyKSwKKyAgICBTVENQKDB4NWE4Mjc5OWEsIDB4NWE4Mjc5OWEpLAogfTsKIAogUkFNX0FMSUdOCiBMTktfU0VDVElPTl9DT05TVERBVEEKLWNvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWw0ODBbXSA9Ci17Ci0gIFNUQygweDdmZmQzMTU0KSwgU1RDKDB4N2ZmNGM1NmYpLCBTVEMoMHg3ZmU2YmNiMCksIFNUQygweDdmZDMxN2I0KSwgU1RDKDB4N2ZiOWQ3NTkpLCBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDdmNzY4OTJmKSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZjFjZGUwMSksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2VhY2U1OGEpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdlMjZiMzcxKSwgU1RDKDB4N2RkYjRiZmMpLCBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4N2NkODA0NjQpLCBTVEMoMHg3Yzc2OWUxOCksIFNUQygweDdjMGZjMjJhKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3YjMxYmJiMiksIFNUQygweDdhYmE5YWU2KSwgU1RDKDB4N2EzZTE3ZjIpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc5MzUwMWE5KSwgU1RDKDB4NzhhODc5ZjQpLCBTVEMoMHg3ODE2YTc1OSksIFNUQygweDc3N2Y5MDNjKSwgU1RDKDB4NzZlMzNiM2YpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDc1OWFmMzRjKSwKLSAgU1RDKDB4N2ZmNGM1NmYpLCBTVEMoMHg3ZmQzMTdiNCksIFNUQygweDdmOWFmY2I5KSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2RkYjRiZmMpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdjNzY5ZTE4KSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3YWJhOWFlNiksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzhhODc5ZjQpLCBTVEMoMHg3NzdmOTAzYyksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg3Mzg3ZWEyMyksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NzA3ZDE0NDMpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4NmI1OThlYTMpLCBTVEMoMHg2OTdjZjc4YSksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg2Mzc5ODRkNCksIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg1Y2Q5MTE0MCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NTgxYzAwYjMpLAotICBTVEMoMHg3ZmU2YmNiMCksIFNUQygweDdmOWFmY2I5KSwgU1RDKDB4N2YxY2RlMDEpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdkOGE1ZjQwKSwgU1RDKDB4N2M3NjllMTgpLCBTVEMoMHg3YjMxYmJiMiksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzgxNmE3NTkpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDc0M2UwOTE4KSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2ZmFkZjJmYyksIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDY0ODU0M2U0KSwgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg1ZGZlNDdhZCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NTZlMmYxNWQpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDRmM2U3ODc1KSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg0NzFjZWNlNyksIFNUQygweDQyZTEzYmE0KSwgU1RDKDB4M2U4YjI0MGUpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDM1OTZhNDZjKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgyYzRkOTA1MCksCi0gIFNUQygweDdmZDMxN2I0KSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc3N2Y5MDNjKSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NmI1OThlYTMpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDYzNzk4NGQ0KSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NTA4ZDkyMTEpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDQ1YjZiYjVlKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4MmRkZjAwNDApLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgxNDA2MGI2OCksIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4MDZiMmYxZDIpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGY5NGQwZTJkKSwKLSAgU1RDKDB4N2ZiOWQ3NTkpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdkOGE1ZjQwKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3OTM1MDFhOSksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NzJjY2I5ZGIpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDZhNmQ5OGE0KSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg2MDNjNDk2YyksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NTQ2NTcxOTQpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDQ3MWNlY2U3KSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgzODljZWE3MiksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MjkyNGVkYWMpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgwODVmMjEzNyksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZjdhMGRlYzgpLCBTVEMoMHhlZjRhZWFmMCksIFNUQygweGU3MDc0N2MzKSwgU1RDKDB4ZGVkZjA0N2MpLCBTVEMoMHhkNmRiMTI1MyksIFNUQygweGNmMDQzYWIyKSwgU1RDKDB4Yzc2MzE1OGQpLAotICBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2M3NjllMTgpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDUzMjExZDE4KSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDFkZTE4OWE2KSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgwYTBhZjI5OSksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZjVmNTBkNjYpLCBTVEMoMHhlYmY5ZjQ5NyksIFNUQygweGUyMWU3NjU5KSwgU1RDKDB4ZDg3MjIxOTEpLCBTVEMoMHhjZjA0M2FiMiksIFNUQygweGM1ZTNhM2E4KSwgU1RDKDB4YmQxZWM0NWIpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweGFjZGVlMmU3KSwgU1RDKDB4YTU3ZDg2NjUpLCBTVEMoMHg5ZWFiMDQ2ZSksCi0gIFNUQygweDdmNzY4OTJmKSwgU1RDKDB4N2RkYjRiZmMpLCBTVEMoMHg3YjMxYmJiMiksIFNUQygweDc3N2Y5MDNjKSwgU1RDKDB4NzJjY2I5ZGIpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDY2OGY3YzI1KSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg1NmUyZjE1ZCksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4NDQ0ZDdhZmYpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDJmNmU2ZDE2KSwgU1RDKDB4MjQ1YTlkNjUpLCBTVEMoMHgxOGY4YjgzYyksIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4MDFhY2ViN2MpLCBTVEMoMHhmNWY1MGQ2NiksIFNUQygweGVhNTJjMTY1KSwgU1RDKDB4ZGVkZjA0N2MpLCBTVEMoMHhkM2IyNmZhZiksIFNUQygweGM4ZTUwMzJhKSwgU1RDKDB4YmU4ZGYyYjkpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweGFiOWE4ZTZiKSwgU1RDKDB4YTMyNmVlYmYpLCBTVEMoMHg5YjdhYmMxYiksIFNUQygweDk0YTY3MTVjKSwgU1RDKDB4OGViOGI5OWYpLCBTVEMoMHg4OWJlNTBjMiksIFNUQygweDg1YzFlODBkKSwKLSAgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZjI5ZWNmYjEpLCBTVEMoMHhlNTYzMjY1MyksIFNUQygweGQ4NzIyMTkxKSwgU1RDKDB4Y2JmMDBkYmQpLCBTVEMoMHhiZmZmZmZmZiksIFNUQygweGI0YzM3M2VkKSwgU1RDKDB4YWE1OWVkYTMpLCBTVEMoMHhhMGUwYTE1ZSksIFNUQygweDk4NzIyMTkxKSwgU1RDKDB4OTEyNjE0NWUpLCBTVEMoMHg4YjEwZjE0MyksIFNUQygweDg2NDNjN2IyKSwgU1RDKDB4ODJjYzBmMzUpLCBTVEMoMHg4MGIzODFhYiksIFNUQygweDgwMDAwMDAwKSwgU1RDKDB4ODBiMzgxYWIpLAotICBTVEMoMHg3ZjFjZGUwMSksIFNUQygweDdjNzY5ZTE4KSwgU1RDKDB4NzgxNmE3NTkpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDZhNmQ5OGE0KSwgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg1NmUyZjE1ZCksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4M2U4YjI0MGUpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDIyYmU4Zjg3KSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgwNTA2NzczNCksIFNUQygweGY1ZjUwZDY2KSwgU1RDKDB4ZTcwNzQ3YzMpLCBTVEMoMHhkODcyMjE5MSksIFNUQygweGNhNjk1YjkzKSwgU1RDKDB4YmQxZWM0NWIpLCBTVEMoMHhiMGMxODc4YSksIFNUQygweGE1N2Q4NjY1KSwgU1RDKDB4OWI3YWJjMWIpLCBTVEMoMHg5MmRjYWZlNCksIFNUQygweDhiYzFmNmU3KSwgU1RDKDB4ODY0M2M3YjIpLCBTVEMoMHg4Mjc1YTBiZiksIFNUQygweDgwNjUwMzQ2KSwgU1RDKDB4ODAxOTQzNGYpLCBTVEMoMHg4MTkzNmRhZSksIFNUQygweDg0Y2U0NDRkKSwgU1RDKDB4ODliZTUwYzIpLCBTVEMoMHg5MDUyMGQwMyksCi0gIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGVmNGFlYWYwKSwgU1RDKDB4ZGVkZjA0N2MpLCBTVEMoMHhjZjA0M2FiMiksIFNUQygweGJmZmZmZmZmKSwgU1RDKDB4YjIxNDFiMDEpLCBTVEMoMHhhNTdkODY2NSksIFNUQygweDlhNzM2NWQyKSwgU1RDKDB4OTEyNjE0NWUpLCBTVEMoMHg4OWJlNTBjMiksIFNUQygweDg0NWM4YWUyKSwgU1RDKDB4ODExODU1YjMpLCBTVEMoMHg4MDAwMDAwMCksIFNUQygweDgxMTg1NWIzKSwgU1RDKDB4ODQ1YzhhZTIpLCBTVEMoMHg4OWJlNTBjMiksIFNUQygweDkxMjYxNDVlKSwgU1RDKDB4OWE3MzY1ZDIpLCBTVEMoMHhhNTdkODY2NSksIFNUQygweGIyMTQxYjAxKSwKLSAgU1RDKDB4N2VhY2U1OGEpLCBTVEMoMHg3YWJhOWFlNiksIFNUQygweDc0M2UwOTE4KSwgU1RDKDB4NmI1OThlYTMpLCBTVEMoMHg2MDNjNDk2YyksIFNUQygweDUzMjExZDE4KSwgU1RDKDB4NDQ0ZDdhZmYpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDIyYmU4Zjg3KSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHhmZTUzMTQ4MyksIFNUQygweGViZjlmNDk3KSwgU1RDKDB4ZGEwYWVjZjgpLCBTVEMoMHhjOGU1MDMyYSksIFNUQygweGI4ZTMxMzE4KSwgU1RDKDB4YWE1OWVkYTMpLCBTVEMoMHg5ZDk2OTc0MSksIFNUQygweDkyZGNhZmU0KSwgU1RDKDB4OGE2NTBjYjMpLCBTVEMoMHg4NDVjOGFlMiksIFNUQygweDgwZTMyMWZlKSwgU1RDKDB4ODAwYjNhOTApLCBTVEMoMHg4MWQ5NGM4ZSksIFNUQygweDg2NDNjN2IyKSwgU1RDKDB4OGQzMzQ2MjQpLCBTVEMoMHg5NjgzMDg3NSksIFNUQygweGEyMDFiODUyKSwgU1RDKDB4YWY3MjZkZWUpLCBTVEMoMHhiZThkZjJiOSksIFNUQygweGNmMDQzYWIyKSwgU1RDKDB4ZTA3ZTBjODMpLAotICBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGViZjlmNDk3KSwgU1RDKDB4ZDg3MjIxOTEpLCBTVEMoMHhjNWUzYTNhOCksIFNUQygweGI0YzM3M2VkKSwgU1RDKDB4YTU3ZDg2NjUpLCBTVEMoMHg5ODcyMjE5MSksIFNUQygweDhkZjM3ZjhhKSwgU1RDKDB4ODY0M2M3YjIpLCBTVEMoMHg4MTkzNmRhZSksIFNUQygweDgwMDAwMDAwKSwgU1RDKDB4ODE5MzZkYWUpLCBTVEMoMHg4NjQzYzdiMiksIFNUQygweDhkZjM3ZjhhKSwgU1RDKDB4OTg3MjIxOTEpLCBTVEMoMHhhNTdkODY2NSksIFNUQygweGI0YzM3M2VkKSwgU1RDKDB4YzVlM2EzYTgpLCBTVEMoMHhkODcyMjE5MSksIFNUQygweGViZjlmNDk3KSwgU1RDKDB4ZmZmZmZmZmYpLCBTVEMoMHgxNDA2MGI2OCksCi0gIFNUQygweDdlMjZiMzcxKSwgU1RDKDB4NzhhODc5ZjQpLCBTVEMoMHg2ZmFkZjJmYyksIFNUQygweDYzNzk4NGQ0KSwgU1RDKDB4NTQ2NTcxOTQpLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDJmNmU2ZDE2KSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgwNTA2NzczNCksIFNUQygweGVmNGFlYWYwKSwgU1RDKDB4ZGEwYWVjZjgpLCBTVEMoMHhjNWUzYTNhOCksIFNUQygweGIzNmExOTc3KSwgU1RDKDB4YTMyNmVlYmYpLCBTVEMoMHg5NTkyNjc1YiksIFNUQygweDhiMTBmMTQzKSwgU1RDKDB4ODNmMDNkZDUpLCBTVEMoMHg4MDY1MDM0NiksIFNUQygweDgwODk3NmQwKSwgU1RDKDB4ODQ1YzhhZTIpLCBTVEMoMHg4YmMxZjZlNyksIFNUQygweDk2ODMwODc1KSwgU1RDKDB4YTQ1MDM3YzgpLCBTVEMoMHhiNGMzNzNlZCksIFNUQygweGM3NjMxNThkKSwgU1RDKDB4ZGJhNTYyOWEpLCBTVEMoMHhmMGY0ODhkOCksIFNUQygweDA2YjJmMWQyKSwgU1RDKDB4MWMzZmQwNDUpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDQ0NGQ3YWZmKSwKLSAgU1RDKDB4N2RkYjRiZmMpLCBTVEMoMHg3NzdmOTAzYyksIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4MjQ1YTlkNjUpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweGY1ZjUwZDY2KSwgU1RDKDB4ZGVkZjA0N2MpLCBTVEMoMHhjOGU1MDMyYSksIFNUQygweGI0YzM3M2VkKSwgU1RDKDB4YTMyNmVlYmYpLCBTVEMoMHg5NGE2NzE1YyksIFNUQygweDg5YmU1MGMyKSwgU1RDKDB4ODJjYzBmMzUpLCBTVEMoMHg4MDBiM2E5MCksIFNUQygweDgxOTM2ZGFlKSwgU1RDKDB4ODc1Nzg2MGIpLCBTVEMoMHg5MTI2MTQ1ZSksIFNUQygweDllYWIwNDZlKSwgU1RDKDB4YWY3MjZkZWUpLCBTVEMoMHhjMmVjNzYzNCksIFNUQygweGQ4NzIyMTkxKSwgU1RDKDB4ZWY0YWVhZjApLCBTVEMoMHgwNmIyZjFkMiksIFNUQygweDFkZTE4OWE2KSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHg0ODdmZmZlNCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4Njk3Y2Y3OGEpLAotfTsKLVJBTV9BTElHTgotTE5LX1NFQ1RJT05fQ09OU1REQVRBCi1jb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnNDgwW10gPQotewotICBTVEMoMHgwMWFjZWI3YyksIFNUQygweDAzNTljNDI4KSwgU1RDKDB4MDUwNjc3MzQpLCBTVEMoMHgwNmIyZjFkMiksIFNUQygweDA4NWYyMTM3KSwgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHgwYmI2NTMzNiksIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4MGYwYjc3MjcpLCBTVEMoMHgxMGI1MTUwZiksIFNUQygweDEyNWRmNzViKSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgxNWFkM2U5YSksIFNUQygweDE3NTM3ZTYzKSwgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDFjM2ZkMDQ1KSwgU1RDKDB4MWRlMTg5YTYpLCBTVEMoMHgxZjgxZjM3YyksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MjJiZThmODcpLCBTVEMoMHgyNDVhOWQ2NSksIFNUQygweDI1ZjUxMzA3KSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgyOTI0ZWRhYyksIFNUQygweDJhYmEyZWU0KSwgU1RDKDB4MmM0ZDkwNTApLCBTVEMoMHgyZGRmMDA0MCksIFNUQygweDJmNmU2ZDE2KSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgzMjg2Zjc3OSksCi0gIFNUQygweDAzNTljNDI4KSwgU1RDKDB4MDZiMmYxZDIpLCBTVEMoMHgwYTBhZjI5OSksIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgxNDA2MGI2OCksIFNUQygweDE3NTM3ZTYzKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgxZGUxODlhNiksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MjQ1YTlkNjUpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDJhYmEyZWU0KSwgU1RDKDB4MmRkZjAwNDApLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4MzcxYWZjZDUpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDNkMTM4OWNiKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDQ1YjZiYjVlKSwgU1RDKDB4NDg3ZmZmZTQpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4NTA4ZDkyMTEpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NTgxYzAwYjMpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDVjZDkxMTQwKSwKLSAgU1RDKDB4MDUwNjc3MzQpLCBTVEMoMHgwYTBhZjI5OSksIFNUQygweDBmMGI3NzI3KSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgxOGY4YjgzYyksIFNUQygweDFkZTE4OWE2KSwgU1RDKDB4MjJiZThmODcpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDJjNGQ5MDUwKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgzNTk2YTQ2YyksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4M2U4YjI0MGUpLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDQ3MWNlY2U3KSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg0ZjNlNzg3NSksIFNUQygweDUzMjExZDE4KSwgU1RDKDB4NTZlMmYxNWQpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDVkZmU0N2FkKSwgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg2NDg1NDNlNCksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDZmYWRmMmZjKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3NDNlMDkxOCksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NzgxNmE3NTkpLAotICBTVEMoMHgwNmIyZjFkMiksIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgyZGRmMDA0MCksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDQ1YjZiYjVlKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg1MDhkOTIxMSksIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDYzNzk4NGQ0KSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2YjU5OGVhMyksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3NGVmMGViYyksIFNUQygweDc3N2Y5MDNjKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdmZDMxN2I0KSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3ZmQzMTdiNCksCi0gIFNUQygweDA4NWYyMTM3KSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgxOGY4YjgzYyksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MjkyNGVkYWMpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDM4OWNlYTcyKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg0NzFjZWNlNyksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4NTQ2NTcxOTQpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDYwM2M0OTZjKSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg2YTZkOThhNCksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NzJjY2I5ZGIpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDc5MzUwMWE5KSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2ZiOWQ3NTkpLCBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDdmYjlkNzU5KSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzkzNTAxYTkpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDcyY2NiOWRiKSwKLSAgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHgxNDA2MGI2OCksIFNUQygweDFkZTE4OWE2KSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDUzMjExZDE4KSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2MTU0ZmI5MSksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3Yzc2OWUxOCksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDdmOWFmY2I5KSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3Yzc2OWUxOCksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2MTU0ZmI5MSksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NTMyMTFkMTgpLAotICBTVEMoMHgwYmI2NTMzNiksIFNUQygweDE3NTM3ZTYzKSwgU1RDKDB4MjJiZThmODcpLCBTVEMoMHgyZGRmMDA0MCksIFNUQygweDM4OWNlYTcyKSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHg0Yzk1ZTY4OCksIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NWRmZTQ3YWQpLCBTVEMoMHg2NThjOWEyZCksIFNUQygweDZjNDBjZjJjKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3NmUzM2IzZiksIFNUQygweDdhYmE5YWU2KSwgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdmZmQzMTU0KSwgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3ZTI2YjM3MSksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzgxNmE3NTkpLCBTVEMoMHg3Mzg3ZWEyMyksIFNUQygweDZlMDEwNzgwKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2MDNjNDk2YyksIFNUQygweDU4MWMwMGIzKSwgU1RDKDB4NGYzZTc4NzUpLCBTVEMoMHg0NWI2YmI1ZSksIFNUQygweDNiOTk0MWIxKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgyNWY1MTMwNyksCi0gIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGYyOWVjZmIxKSwKLSAgU1RDKDB4MGYwYjc3MjcpLCBTVEMoMHgxZGUxODlhNiksIFNUQygweDJjNGQ5MDUwKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHg0NzFjZWNlNyksIFNUQygweDUzMjExZDE4KSwgU1RDKDB4NWRmZTQ3YWQpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDZmYWRmMmZjKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3YjMxYmJiMiksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2ZlNmJjYjApLCBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDdkOGE1ZjQwKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3NDNlMDkxOCksIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4NjQ4NTQzZTQpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDRmM2U3ODc1KSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHgzNTk2YTQ2YyksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHgwYTBhZjI5OSksIFNUQygweGZhZjk4OGNiKSwgU1RDKDB4ZWJmOWY0OTcpLCBTVEMoMHhkZDQxNzA3OCksIFNUQygweGNmMDQzYWIyKSwgU1RDKDB4YzE3NGRiZjEpLAotICBTVEMoMHgxMGI1MTUwZiksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2NThjOWEyZCksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhlZjRhZWFmMCksIFNUQygweGRlZGYwNDdjKSwgU1RDKDB4Y2YwNDNhYjIpLCBTVEMoMHhiZmZmZmZmZiksIFNUQygweGIyMTQxYjAxKSwgU1RDKDB4YTU3ZDg2NjUpLCBTVEMoMHg5YTczNjVkMiksCi0gIFNUQygweDEyNWRmNzViKSwgU1RDKDB4MjQ1YTlkNjUpLCBTVEMoMHgzNTk2YTQ2YyksIFNUQygweDQ1YjZiYjVlKSwgU1RDKDB4NTQ2NTcxOTQpLCBTVEMoMHg2MTU0ZmI5MSksIFNUQygweDZjNDBjZjJjKSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg3YjMxYmJiMiksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2ZmZDMxNTQpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdhM2UxN2YyKSwgU1RDKDB4NzM4N2VhMjMpLCBTVEMoMHg2YTZkOThhNCksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NTFkOTIzMjEpLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDMyODZmNzc5KSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgwZjBiNzcyNyksIFNUQygweGZjYTYzYmQ3KSwgU1RDKDB4ZWE1MmMxNjUpLCBTVEMoMHhkODcyMjE5MSksIFNUQygweGM3NjMxNThkKSwgU1RDKDB4Yjc4MDAwMWIpLCBTVEMoMHhhOTFkMGVhMiksIFNUQygweDljODY3YjJiKSwgU1RDKDB4OTFmZWY4N2YpLCBTVEMoMHg4OWJlNTBjMiksIFNUQygweDgzZjAzZGQ1KSwKLSAgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGViZjlmNDk3KSwgU1RDKDB4ZDg3MjIxOTEpLCBTVEMoMHhjNWUzYTNhOCksIFNUQygweGI0YzM3M2VkKSwgU1RDKDB4YTU3ZDg2NjUpLCBTVEMoMHg5ODcyMjE5MSksIFNUQygweDhkZjM3ZjhhKSwgU1RDKDB4ODY0M2M3YjIpLCBTVEMoMHg4MTkzNmRhZSksIFNUQygweDgwMDAwMDAwKSwgU1RDKDB4ODE5MzZkYWUpLAotICBTVEMoMHgxNWFkM2U5YSksIFNUQygweDJhYmEyZWU0KSwgU1RDKDB4M2U4YjI0MGUpLCBTVEMoMHg1MDhkOTIxMSksIFNUQygweDYwM2M0OTZjKSwgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHg3NmUzM2IzZiksIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4N2ZlNmJjYjApLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdhM2UxN2YyKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2NjhmN2MyNSksIFNUQygweDU4MWMwMGIzKSwgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDFmODFmMzdjKSwgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHhmNDQ5YWNjOSksIFNUQygweGRlZGYwNDdjKSwgU1RDKDB4Y2E2OTViOTMpLCBTVEMoMHhiNzgwMDAxYiksIFNUQygweGE2YWVjZDVkKSwgU1RDKDB4OTg3MjIxOTEpLCBTVEMoMHg4ZDMzNDYyNCksIFNUQygweDg1NDU2NTE5KSwgU1RDKDB4ODBlMzIxZmUpLCBTVEMoMHg4MDJjZTg0YiksIFNUQygweDgzMjdmYjliKSwgU1RDKDB4ODliZTUwYzIpLCBTVEMoMHg5M2JmMzBkMyksCi0gIFNUQygweDE3NTM3ZTYzKSwgU1RDKDB4MmRkZjAwNDApLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDdhYmE5YWU2KSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzM4N2VhMjMpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDU4MWMwMGIzKSwgU1RDKDB4NDViNmJiNWUpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MDM1OWM0MjgpLCBTVEMoMHhlYmY5ZjQ5NyksIFNUQygweGQ1NDVkMTFiKSwgU1RDKDB4YmZmZmZmZmYpLCBTVEMoMHhhY2RlZTJlNyksIFNUQygweDljODY3YjJiKSwgU1RDKDB4OGY4MmViYmMpLCBTVEMoMHg4NjQzYzdiMiksIFNUQygweDgxMTg1NWIzKSwgU1RDKDB4ODAyY2U4NGIpLCBTVEMoMHg4Mzg5NjFlNyksIFNUQygweDhiMTBmMTQzKSwgU1RDKDB4OTY4MzA4NzUpLCBTVEMoMHhhNTdkODY2NSksIFNUQygweGI3ODAwMDFiKSwKLX07Ci0KLQotUkFNX0FMSUdOCi1MTktfU0VDVElPTl9DT05TVERBVEEKLWNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3cxMDI0W10gPQotewotICBXVENQKDB4N2ZmZmZkODgsIDB4MDAxOTIxZmIpLCBXVENQKDB4N2ZmZmU5Y2IsIDB4MDA0YjY1ZWUpLCBXVENQKDB4N2ZmZmMyNTEsIDB4MDA3ZGE5ZDQpLCBXVENQKDB4N2ZmZjg3MTksIDB4MDBhZmVkYTgpLAotICBXVENQKDB4N2ZmZjM4MjQsIDB4MDBlMjMxNjApLCBXVENQKDB4N2ZmZWQ1NzIsIDB4MDExNDc0ZjYpLCBXVENQKDB4N2ZmZTVmMDMsIDB4MDE0NmI4NjApLCBXVENQKDB4N2ZmZGQ0ZDcsIDB4MDE3OGZiOTkpLAotICBXVENQKDB4N2ZmZDM2ZWUsIDB4MDFhYjNlOTcpLCBXVENQKDB4N2ZmYzg1NDksIDB4MDFkZDgxNTQpLCBXVENQKDB4N2ZmYmJmZTYsIDB4MDIwZmMzYzYpLCBXVENQKDB4N2ZmYWU2YzcsIDB4MDI0MjA1ZTgpLAotICBXVENQKDB4N2ZmOWY5ZWMsIDB4MDI3NDQ3YjApLCBXVENQKDB4N2ZmOGY5NTQsIDB4MDJhNjg5MTcpLCBXVENQKDB4N2ZmN2U1MDAsIDB4MDJkOGNhMTYpLCBXVENQKDB4N2ZmNmJjZjAsIDB4MDMwYjBhYTQpLAotICBXVENQKDB4N2ZmNTgxMjUsIDB4MDMzZDRhYmIpLCBXVENQKDB4N2ZmNDMxOWQsIDB4MDM2ZjhhNTEpLCBXVENQKDB4N2ZmMmNlNWIsIDB4MDNhMWM5NjApLCBXVENQKDB4N2ZmMTU3NWQsIDB4MDNkNDA3ZGYpLAotICBXVENQKDB4N2ZlZmNjYTQsIDB4MDQwNjQ1YzcpLCBXVENQKDB4N2ZlZTJlMzAsIDB4MDQzODgzMTApLCBXVENQKDB4N2ZlYzdjMDIsIDB4MDQ2YWJmYjMpLCBXVENQKDB4N2ZlYWI2MWEsIDB4MDQ5Y2ZiYTcpLAotICBXVENQKDB4N2ZlOGRjNzgsIDB4MDRjZjM2ZTUpLCBXVENQKDB4N2ZlNmVmMWMsIDB4MDUwMTcxNjUpLCBXVENQKDB4N2ZlNGVlMDYsIDB4MDUzM2FiMjApLCBXVENQKDB4N2ZlMmQ5MzgsIDB4MDU2NWU0MGQpLAotICBXVENQKDB4N2ZlMGIwYjEsIDB4MDU5ODFjMjYpLCBXVENQKDB4N2ZkZTc0NzEsIDB4MDVjYTUzNjEpLCBXVENQKDB4N2ZkYzI0N2EsIDB4MDVmYzg5YjgpLCBXVENQKDB4N2ZkOWMwY2EsIDB4MDYyZWJmMjIpLAotICBXVENQKDB4N2ZkNzQ5NjQsIDB4MDY2MGYzOTgpLCBXVENQKDB4N2ZkNGJlNDYsIDB4MDY5MzI3MTMpLCBXVENQKDB4N2ZkMjFmNzIsIDB4MDZjNTU5OGEpLCBXVENQKDB4N2ZjZjZjZTgsIDB4MDZmNzhhZjYpLAotICBXVENQKDB4N2ZjY2E2YTcsIDB4MDcyOWJiNGUpLCBXVENQKDB4N2ZjOWNjYjIsIDB4MDc1YmVhOGMpLCBXVENQKDB4N2ZjNmRmMDgsIDB4MDc4ZTE4YTcpLCBXVENQKDB4N2ZjM2RkYTksIDB4MDdjMDQ1OTgpLAotICBXVENQKDB4N2ZjMGM4OTYsIDB4MDdmMjcxNTcpLCBXVENQKDB4N2ZiZDlmZDAsIDB4MDgyNDliZGQpLCBXVENQKDB4N2ZiYTYzNTcsIDB4MDg1NmM1MjApLCBXVENQKDB4N2ZiNzEzMmIsIDB4MDg4OGVkMWIpLAotICBXVENQKDB4N2ZiM2FmNGUsIDB4MDhiYjEzYzUpLCBXVENQKDB4N2ZiMDM3YmYsIDB4MDhlZDM5MTYpLCBXVENQKDB4N2ZhY2FjN2YsIDB4MDkxZjVkMDYpLCBXVENQKDB4N2ZhOTBkOGUsIDB4MDk1MTdmOGYpLAotICBXVENQKDB4N2ZhNTVhZWUsIDB4MDk4M2EwYTcpLCBXVENQKDB4N2ZhMTk0OWUsIDB4MDliNWMwNDgpLCBXVENQKDB4N2Y5ZGJhYTAsIDB4MDllN2RlNmEpLCBXVENQKDB4N2Y5OWNjZjQsIDB4MGExOWZiMDQpLAotICBXVENQKDB4N2Y5NWNiOWEsIDB4MGE0YzE2MTApLCBXVENQKDB4N2Y5MWI2OTQsIDB4MGE3ZTJmODUpLCBXVENQKDB4N2Y4ZDhkZTEsIDB4MGFiMDQ3NWMpLCBXVENQKDB4N2Y4OTUxODIsIDB4MGFlMjVkOGQpLAotICBXVENQKDB4N2Y4NTAxNzksIDB4MGIxNDcyMTEpLCBXVENQKDB4N2Y4MDlkYzUsIDB4MGI0Njg0ZGYpLCBXVENQKDB4N2Y3YzI2NjgsIDB4MGI3ODk1ZjApLCBXVENQKDB4N2Y3NzliNjIsIDB4MGJhYWE1M2IpLAotICBXVENQKDB4N2Y3MmZjYjQsIDB4MGJkY2IyYmIpLCBXVENQKDB4N2Y2ZTRhNWUsIDB4MGMwZWJlNjYpLCBXVENQKDB4N2Y2OTg0NjEsIDB4MGM0MGM4MzUpLCBXVENQKDB4N2Y2NGFhYmYsIDB4MGM3MmQwMjApLAotICBXVENQKDB4N2Y1ZmJkNzcsIDB4MGNhNGQ2MjApLCBXVENQKDB4N2Y1YWJjOGEsIDB4MGNkNmRhMmQpLCBXVENQKDB4N2Y1NWE3ZmEsIDB4MGQwOGRjM2YpLCBXVENQKDB4N2Y1MDdmYzcsIDB4MGQzYWRjNGUpLAotICBXVENQKDB4N2Y0YjQzZjIsIDB4MGQ2Y2RhNTMpLCBXVENQKDB4N2Y0NWY0N2IsIDB4MGQ5ZWQ2NDYpLCBXVENQKDB4N2Y0MDkxNjQsIDB4MGRkMGQwMWYpLCBXVENQKDB4N2YzYjFhYWQsIDB4MGUwMmM3ZDcpLAotICBXVENQKDB4N2YzNTkwNTcsIDB4MGUzNGJkNjYpLCBXVENQKDB4N2YyZmYyNjMsIDB4MGU2NmIwYzMpLCBXVENQKDB4N2YyYTQwZDIsIDB4MGU5OGExZTkpLCBXVENQKDB4N2YyNDdiYTUsIDB4MGVjYTkwY2UpLAotICBXVENQKDB4N2YxZWEyZGMsIDB4MGVmYzdkNmIpLCBXVENQKDB4N2YxOGI2NzksIDB4MGYyZTY3YjgpLCBXVENQKDB4N2YxMmI2N2MsIDB4MGY2MDRmYWYpLCBXVENQKDB4N2YwY2EyZTcsIDB4MGY5MjM1NDYpLAotICBXVENQKDB4N2YwNjdiYmEsIDB4MGZjNDE4NzYpLCBXVENQKDB4N2YwMDQwZjYsIDB4MGZmNWY5MzgpLCBXVENQKDB4N2VmOWYyOWQsIDB4MTAyN2Q3ODQpLCBXVENQKDB4N2VmMzkwYWUsIDB4MTA1OWIzNTIpLAotICBXVENQKDB4N2VlZDFiMmMsIDB4MTA4YjhjOWIpLCBXVENQKDB4N2VlNjkyMTcsIDB4MTBiZDYzNTYpLCBXVENQKDB4N2VkZmY1NzAsIDB4MTBlZjM3N2QpLCBXVENQKDB4N2VkOTQ1MzgsIDB4MTEyMTA5MDcpLAotICBXVENQKDB4N2VkMjgxNzEsIDB4MTE1MmQ3ZWQpLCBXVENQKDB4N2VjYmFhMWEsIDB4MTE4NGE0MjcpLCBXVENQKDB4N2VjNGJmMzYsIDB4MTFiNjZkYWQpLCBXVENQKDB4N2ViZGMwYzYsIDB4MTFlODM0NzgpLAotICBXVENQKDB4N2ViNmFlY2EsIDB4MTIxOWY4ODApLCBXVENQKDB4N2VhZjg5NDMsIDB4MTI0YmI5YmUpLCBXVENQKDB4N2VhODUwMzMsIDB4MTI3ZDc4MjkpLCBXVENQKDB4N2VhMTAzOWIsIDB4MTJhZjMzYmEpLAotICBXVENQKDB4N2U5OWEzN2MsIDB4MTJlMGVjNmEpLCBXVENQKDB4N2U5MjJmZDYsIDB4MTMxMmEyMzApLCBXVENQKDB4N2U4YWE4YWMsIDB4MTM0NDU1MDUpLCBXVENQKDB4N2U4MzBkZmYsIDB4MTM3NjA0ZTIpLAotICBXVENQKDB4N2U3YjVmY2UsIDB4MTNhN2IxYmYpLCBXVENQKDB4N2U3MzllMWQsIDB4MTNkOTViOTMpLCBXVENQKDB4N2U2YmM4ZWIsIDB4MTQwYjAyNTgpLCBXVENQKDB4N2U2M2UwM2IsIDB4MTQzY2E2MDUpLAotICBXVENQKDB4N2U1YmU0MGMsIDB4MTQ2ZTQ2OTQpLCBXVENQKDB4N2U1M2Q0NjIsIDB4MTQ5ZmUzZmMpLCBXVENQKDB4N2U0YmIxM2MsIDB4MTRkMTdlMzYpLCBXVENQKDB4N2U0MzdhOWMsIDB4MTUwMzE1M2EpLAotICBXVENQKDB4N2UzYjMwODMsIDB4MTUzNGE5MDEpLCBXVENQKDB4N2UzMmQyZjQsIDB4MTU2NjM5ODIpLCBXVENQKDB4N2UyYTYxZWQsIDB4MTU5N2M2YjcpLCBXVENQKDB4N2UyMWRkNzMsIDB4MTVjOTUwOTcpLAotICBXVENQKDB4N2UxOTQ1ODQsIDB4MTVmYWQ3MWIpLCBXVENQKDB4N2UxMDlhMjQsIDB4MTYyYzVhM2IpLCBXVENQKDB4N2UwN2RiNTIsIDB4MTY1ZGQ5ZjApLCBXVENQKDB4N2RmZjA5MTEsIDB4MTY4ZjU2MzIpLAotICBXVENQKDB4N2RmNjIzNjIsIDB4MTZjMGNlZjkpLCBXVENQKDB4N2RlZDJhNDcsIDB4MTZmMjQ0M2UpLCBXVENQKDB4N2RlNDFkYzAsIDB4MTcyM2I1ZjkpLCBXVENQKDB4N2RkYWZkY2UsIDB4MTc1NTI0MjIpLAotICBXVENQKDB4N2RkMWNhNzUsIDB4MTc4NjhlYjMpLCBXVENQKDB4N2RjODgzYjQsIDB4MTdiN2Y1YTMpLCBXVENQKDB4N2RiZjI5OGQsIDB4MTdlOTU4ZWEpLCBXVENQKDB4N2RiNWJjMDIsIDB4MTgxYWI4ODEpLAotICBXVENQKDB4N2RhYzNiMTUsIDB4MTg0YzE0NjEpLCBXVENQKDB4N2RhMmE2YzYsIDB4MTg3ZDZjODIpLCBXVENQKDB4N2Q5OGZmMTcsIDB4MThhZWMwZGIpLCBXVENQKDB4N2Q4ZjQ0MDksIDB4MThlMDExNjcpLAotICBXVENQKDB4N2Q4NTc1OWYsIDB4MTkxMTVlMWMpLCBXVENQKDB4N2Q3YjkzZGEsIDB4MTk0MmE2ZjMpLCBXVENQKDB4N2Q3MTllYmEsIDB4MTk3M2ViZTYpLCBXVENQKDB4N2Q2Nzk2NDIsIDB4MTlhNTJjZWIpLAotICBXVENQKDB4N2Q1ZDdhNzQsIDB4MTlkNjY5ZmMpLCBXVENQKDB4N2Q1MzRiNTAsIDB4MWEwN2EzMTEpLCBXVENQKDB4N2Q0OTA4ZDksIDB4MWEzOGQ4MjMpLCBXVENQKDB4N2QzZWIzMGYsIDB4MWE2YTA5MjkpLAotICBXVENQKDB4N2QzNDQ5ZjUsIDB4MWE5YjM2MWQpLCBXVENQKDB4N2QyOWNkOGMsIDB4MWFjYzVlZjYpLCBXVENQKDB4N2QxZjNkZDYsIDB4MWFmZDgzYWQpLCBXVENQKDB4N2QxNDlhZDUsIDB4MWIyZWE0M2EpLAotICBXVENQKDB4N2QwOWU0ODksIDB4MWI1ZmMwOTcpLCBXVENQKDB4N2NmZjFhZjUsIDB4MWI5MGQ4YmIpLCBXVENQKDB4N2NmNDNlMWEsIDB4MWJjMWVjOWUpLCBXVENQKDB4N2NlOTRkZmIsIDB4MWJmMmZjM2EpLAotICBXVENQKDB4N2NkZTRhOTgsIDB4MWMyNDA3ODYpLCBXVENQKDB4N2NkMzMzZjMsIDB4MWM1NTBlN2MpLCBXVENQKDB4N2NjODBhMGYsIDB4MWM4NjExMTMpLCBXVENQKDB4N2NiY2NjZWMsIDB4MWNiNzBmNDMpLAotICBXVENQKDB4N2NiMTdjOGQsIDB4MWNlODA5MDYpLCBXVENQKDB4N2NhNjE4ZjMsIDB4MWQxOGZlNTQpLCBXVENQKDB4N2M5YWEyMjEsIDB4MWQ0OWVmMjYpLCBXVENQKDB4N2M4ZjE4MTcsIDB4MWQ3YWRiNzMpLAotICBXVENQKDB4N2M4MzdhZDgsIDB4MWRhYmMzMzQpLCBXVENQKDB4N2M3N2NhNjUsIDB4MWRkY2E2NjIpLCBXVENQKDB4N2M2YzA2YzAsIDB4MWUwZDg0ZjUpLCBXVENQKDB4N2M2MDJmZWMsIDB4MWUzZTVlZTUpLAotICBXVENQKDB4N2M1NDQ1ZTksIDB4MWU2ZjM0MmMpLCBXVENQKDB4N2M0ODQ4YmEsIDB4MWVhMDA0YzEpLCBXVENQKDB4N2MzYzM4NjAsIDB4MWVkMGQwOWQpLCBXVENQKDB4N2MzMDE0ZGUsIDB4MWYwMTk3YjgpLAotICBXVENQKDB4N2MyM2RlMzUsIDB4MWYzMjVhMGIpLCBXVENQKDB4N2MxNzk0NjcsIDB4MWY2MzE3OGYpLCBXVENQKDB4N2MwYjM3NzcsIDB4MWY5M2QwM2MpLCBXVENQKDB4N2JmZWM3NjUsIDB4MWZjNDg0MGEpLAotICBXVENQKDB4N2JmMjQ0MzQsIDB4MWZmNTMyZjIpLCBXVENQKDB4N2JlNWFkZTYsIDB4MjAyNWRjZWMpLCBXVENQKDB4N2JkOTA0N2MsIDB4MjA1NjgxZjEpLCBXVENQKDB4N2JjYzQ3ZmEsIDB4MjA4NzIxZjkpLAotICBXVENQKDB4N2JiZjc4NjAsIDB4MjBiN2JjZmUpLCBXVENQKDB4N2JiMjk1YjAsIDB4MjBlODUyZjYpLCBXVENQKDB4N2JhNTlmZWUsIDB4MjExOGUzZGMpLCBXVENQKDB4N2I5ODk3MTksIDB4MjE0OTZmYTcpLAotICBXVENQKDB4N2I4YjdiMzYsIDB4MjE3OWY2NGYpLCBXVENQKDB4N2I3ZTRjNDUsIDB4MjFhYTc3Y2YpLCBXVENQKDB4N2I3MTBhNDksIDB4MjFkYWY0MWQpLCBXVENQKDB4N2I2M2I1NDMsIDB4MjIwYjZiMzIpLAotICBXVENQKDB4N2I1NjRkMzYsIDB4MjIzYmRkMDgpLCBXVENQKDB4N2I0OGQyMjUsIDB4MjI2YzQ5OTYpLCBXVENQKDB4N2IzYjQ0MTAsIDB4MjI5Y2IwZDUpLCBXVENQKDB4N2IyZGEyZmEsIDB4MjJjZDEyYmQpLAotICBXVENQKDB4N2IxZmVlZTUsIDB4MjJmZDZmNDgpLCBXVENQKDB4N2IxMjI3ZDMsIDB4MjMyZGM2NmQpLCBXVENQKDB4N2IwNDRkYzcsIDB4MjM1ZTE4MjYpLCBXVENQKDB4N2FmNjYwYzIsIDB4MjM4ZTY0NmEpLAotICBXVENQKDB4N2FlODYwYzcsIDB4MjNiZWFiMzMpLCBXVENQKDB4N2FkYTRkZDgsIDB4MjNlZWVjNzgpLCBXVENQKDB4N2FjYzI3ZjcsIDB4MjQxZjI4MzMpLCBXVENQKDB4N2FiZGVmMjUsIDB4MjQ0ZjVlNWMpLAotICBXVENQKDB4N2FhZmEzNjcsIDB4MjQ3ZjhlZWMpLCBXVENQKDB4N2FhMTQ0YmMsIDB4MjRhZmI5ZGEpLCBXVENQKDB4N2E5MmQzMjksIDB4MjRkZmRmMjApLCBXVENQKDB4N2E4NDRlYWUsIDB4MjUwZmZlYjcpLAotICBXVENQKDB4N2E3NWI3NGYsIDB4MjU0MDE4OTYpLCBXVENQKDB4N2E2NzBkMGQsIDB4MjU3MDJjYjcpLCBXVENQKDB4N2E1ODRmZWIsIDB4MjVhMDNiMTEpLCBXVENQKDB4N2E0OTdmZWIsIDB4MjVkMDQzOWYpLAotICBXVENQKDB4N2EzYTlkMGYsIDB4MjYwMDQ2NTcpLCBXVENQKDB4N2EyYmE3NWEsIDB4MjYzMDQzMzMpLCBXVENQKDB4N2ExYzllY2UsIDB4MjY2MDNhMmMpLCBXVENQKDB4N2EwZDgzNmQsIDB4MjY5MDJiMzkpLAotICBXVENQKDB4NzlmZTU1MzksIDB4MjZjMDE2NTUpLCBXVENQKDB4NzllZjE0MzYsIDB4MjZlZmZiNzYpLCBXVENQKDB4NzlkZmMwNjQsIDB4MjcxZmRhOTYpLCBXVENQKDB4NzlkMDU5YzgsIDB4Mjc0ZmIzYWUpLAotICBXVENQKDB4NzljMGUwNjIsIDB4Mjc3Zjg2YjUpLCBXVENQKDB4NzliMTU0MzUsIDB4MjdhZjUzYTYpLCBXVENQKDB4NzlhMWI1NDUsIDB4MjdkZjFhNzcpLCBXVENQKDB4Nzk5MjAzOTIsIDB4MjgwZWRiMjMpLAotICBXVENQKDB4Nzk4MjNmMjAsIDB4MjgzZTk1YTEpLCBXVENQKDB4Nzk3MjY3ZjIsIDB4Mjg2ZTQ5ZWEpLCBXVENQKDB4Nzk2MjdlMDgsIDB4Mjg5ZGY3ZjgpLCBXVENQKDB4Nzk1MjgxNjcsIDB4MjhjZDlmYzEpLAotICBXVENQKDB4Nzk0MjcyMTAsIDB4MjhmZDQxNDApLCBXVENQKDB4NzkzMjUwMDYsIDB4MjkyY2RjNmQpLCBXVENQKDB4NzkyMjFiNGIsIDB4Mjk1YzcxNDApLCBXVENQKDB4NzkxMWQzZTIsIDB4Mjk4YmZmYjIpLAotICBXVENQKDB4NzkwMTc5Y2QsIDB4MjliYjg3YmMpLCBXVENQKDB4NzhmMTBkMGYsIDB4MjllYjA5NTcpLCBXVENQKDB4NzhlMDhkYWIsIDB4MmExYTg0N2IpLCBXVENQKDB4NzhjZmZiYTMsIDB4MmE0OWY5MjApLAotICBXVENQKDB4NzhiZjU2ZjksIDB4MmE3OTY3NDApLCBXVENQKDB4NzhhZTlmYjAsIDB4MmFhOGNlZDMpLCBXVENQKDB4Nzg5ZGQ1Y2IsIDB4MmFkODJmZDIpLCBXVENQKDB4Nzg4Y2Y5NGMsIDB4MmIwNzhhMzYpLAotICBXVENQKDB4Nzg3YzBhMzYsIDB4MmIzNmRkZjcpLCBXVENQKDB4Nzg2YjA4OGMsIDB4MmI2NjJiMGUpLCBXVENQKDB4Nzg1OWY0NGYsIDB4MmI5NTcxNzMpLCBXVENQKDB4Nzg0OGNkODMsIDB4MmJjNGIxMjApLAotICBXVENQKDB4NzgzNzk0MmIsIDB4MmJmM2VhMGQpLCBXVENQKDB4NzgyNjQ4NDksIDB4MmMyMzFjMzMpLCBXVENQKDB4NzgxNGU5ZGYsIDB4MmM1MjQ3OGEpLCBXVENQKDB4NzgwMzc4ZjEsIDB4MmM4MTZjMGMpLAotICBXVENQKDB4NzdmMWY1ODEsIDB4MmNiMDg5YjEpLCBXVENQKDB4NzdlMDVmOTEsIDB4MmNkZmEwNzEpLCBXVENQKDB4NzdjZWI3MjUsIDB4MmQwZWIwNDYpLCBXVENQKDB4NzdiY2ZjM2YsIDB4MmQzZGI5MjgpLAotICBXVENQKDB4NzdhYjJlZTIsIDB4MmQ2Y2JiMTApLCBXVENQKDB4Nzc5OTRmMTEsIDB4MmQ5YmI1ZjYpLCBXVENQKDB4Nzc4NzVjY2UsIDB4MmRjYWE5ZDUpLCBXVENQKDB4Nzc3NTU4MWQsIDB4MmRmOTk2YTMpLAotICBXVENQKDB4Nzc2MzQwZmYsIDB4MmUyODdjNWEpLCBXVENQKDB4Nzc1MTE3NzgsIDB4MmU1NzVhZjMpLCBXVENQKDB4NzczZWRiOGIsIDB4MmU4NjMyNjcpLCBXVENQKDB4NzcyYzhkM2EsIDB4MmViNTAyYWUpLAotICBXVENQKDB4NzcxYTJjODgsIDB4MmVlM2NiYzEpLCBXVENQKDB4NzcwN2I5NzksIDB4MmYxMjhkOTkpLCBXVENQKDB4NzZmNTM0MGUsIDB4MmY0MTQ4MmUpLCBXVENQKDB4NzZlMjljNGIsIDB4MmY2ZmZiN2EpLAotICBXVENQKDB4NzZjZmYyMzIsIDB4MmY5ZWE3NzUpLCBXVENQKDB4NzZiZDM1YzcsIDB4MmZjZDRjMTkpLCBXVENQKDB4NzZhYTY3MGQsIDB4MmZmYmU5NWQpLCBXVENQKDB4NzY5Nzg2MDUsIDB4MzAyYTdmM2EpLAotICBXVENQKDB4NzY4NDkyYjQsIDB4MzA1OTBkYWIpLCBXVENQKDB4NzY3MThkMWMsIDB4MzA4Nzk0YTYpLCBXVENQKDB4NzY1ZTc1NDAsIDB4MzBiNjE0MjYpLCBXVENQKDB4NzY0YjRiMjMsIDB4MzBlNDhjMjIpLAotICBXVENQKDB4NzYzODBlYzgsIDB4MzExMmZjOTUpLCBXVENQKDB4NzYyNGMwMzEsIDB4MzE0MTY1NzYpLCBXVENQKDB4NzYxMTVmNjMsIDB4MzE2ZmM2YmUpLCBXVENQKDB4NzVmZGVjNjAsIDB4MzE5ZTIwNjcpLAotICBXVENQKDB4NzVlYTY3MmEsIDB4MzFjYzcyNjkpLCBXVENQKDB4NzVkNmNmYzUsIDB4MzFmYWJjYmQpLCBXVENQKDB4NzVjMzI2MzQsIDB4MzIyOGZmNWMpLCBXVENQKDB4NzVhZjZhN2IsIDB4MzI1NzNhM2YpLAotICBXVENQKDB4NzU5YjljOWIsIDB4MzI4NTZkNWUpLCBXVENQKDB4NzU4N2JjOTgsIDB4MzJiMzk4YjMpLCBXVENQKDB4NzU3M2NhNzUsIDB4MzJlMWJjMzYpLCBXVENQKDB4NzU1ZmM2MzUsIDB4MzMwZmQ3ZTEpLAotICBXVENQKDB4NzU0YmFmZGMsIDB4MzMzZGViYWIpLCBXVENQKDB4NzUzNzg3NmMsIDB4MzM2YmY3OGYpLCBXVENQKDB4NzUyMzRjZTgsIDB4MzM5OWZiODUpLCBXVENQKDB4NzUwZjAwNTQsIDB4MzNjN2Y3ODUpLAotICBXVENQKDB4NzRmYWExYjMsIDB4MzNmNWViODkpLCBXVENQKDB4NzRlNjMxMDgsIDB4MzQyM2Q3OGEpLCBXVENQKDB4NzRkMWFlNTUsIDB4MzQ1MWJiODEpLCBXVENQKDB4NzRiZDE5OWYsIDB4MzQ3Zjk3NjYpLAotICBXVENQKDB4NzRhODcyZTgsIDB4MzRhZDZiMzIpLCBXVENQKDB4NzQ5M2JhMzQsIDB4MzRkYjM2ZGYpLCBXVENQKDB4NzQ3ZWVmODUsIDB4MzUwOGZhNjYpLCBXVENQKDB4NzQ2YTEyZGYsIDB4MzUzNmI1YmUpLAotICBXVENQKDB4NzQ1NTI0NDYsIDB4MzU2NDY4ZTIpLCBXVENQKDB4NzQ0MDIzYmMsIDB4MzU5MjEzYzkpLCBXVENQKDB4NzQyYjExNDQsIDB4MzViZmI2NmUpLCBXVENQKDB4NzQxNWVjZTIsIDB4MzVlZDUwYzkpLAotICBXVENQKDB4NzQwMGI2OWEsIDB4MzYxYWUyZDMpLCBXVENQKDB4NzNlYjZlNmUsIDB4MzY0ODZjODYpLCBXVENQKDB4NzNkNjE0NjEsIDB4MzY3NWVkZDkpLCBXVENQKDB4NzNjMGE4NzgsIDB4MzZhMzY2YzYpLAotICBXVENQKDB4NzNhYjJhYjQsIDB4MzZkMGQ3NDYpLCBXVENQKDB4NzM5NTliMWIsIDB4MzZmZTNmNTIpLCBXVENQKDB4NzM3ZmY5YWUsIDB4MzcyYjllZTMpLCBXVENQKDB4NzM2YTQ2NzEsIDB4Mzc1OGY1ZjIpLAotICBXVENQKDB4NzM1NDgxNjgsIDB4Mzc4NjQ0NzcpLCBXVENQKDB4NzMzZWFhOTYsIDB4MzdiMzhhNmQpLCBXVENQKDB4NzMyOGMxZmYsIDB4MzdlMGM3Y2MpLCBXVENQKDB4NzMxMmM3YTUsIDB4MzgwZGZjOGQpLAotICBXVENQKDB4NzJmY2JiOGMsIDB4MzgzYjI4YTkpLCBXVENQKDB4NzJlNjlkYjcsIDB4Mzg2ODRjMTkpLCBXVENQKDB4NzJkMDZlMmIsIDB4Mzg5NTY2ZDYpLCBXVENQKDB4NzJiYTJjZWEsIDB4MzhjMjc4ZDkpLAotICBXVENQKDB4NzJhM2Q5ZjcsIDB4MzhlZjgyMWMpLCBXVENQKDB4NzI4ZDc1NTcsIDB4MzkxYzgyOTcpLCBXVENQKDB4NzI3NmZmMGQsIDB4Mzk0OTdhNDMpLCBXVENQKDB4NzI2MDc3MWIsIDB4Mzk3NjY5MTkpLAotICBXVENQKDB4NzI0OWRkODYsIDB4MzlhMzRmMTMpLCBXVENQKDB4NzIzMzMyNTEsIDB4MzlkMDJjMmEpLCBXVENQKDB4NzIxYzc1ODAsIDB4MzlmZDAwNTYpLCBXVENQKDB4NzIwNWE3MTYsIDB4M2EyOWNiOTEpLAotICBXVENQKDB4NzFlZWM3MTYsIDB4M2E1NjhkZDQpLCBXVENQKDB4NzFkN2Q1ODUsIDB4M2E4MzQ3MTcpLCBXVENQKDB4NzFjMGQyNjUsIDB4M2FhZmY3NTUpLCBXVENQKDB4NzFhOWJkYmEsIDB4M2FkYzllODYpLAotICBXVENQKDB4NzE5Mjk3ODksIDB4M2IwOTNjYTMpLCBXVENQKDB4NzE3YjVmZDMsIDB4M2IzNWQxYTUpLCBXVENQKDB4NzE2NDE2OWQsIDB4M2I2MjVkODYpLCBXVENQKDB4NzE0Y2JiZWIsIDB4M2I4ZWUwM2UpLAotICBXVENQKDB4NzEzNTRmYzAsIDB4M2JiYjU5YzcpLCBXVENQKDB4NzExZGQyMjAsIDB4M2JlN2NhMWEpLCBXVENQKDB4NzEwNjQzMGUsIDB4M2MxNDMxMzApLCBXVENQKDB4NzBlZWEyOGUsIDB4M2M0MDhmMDMpLAotICBXVENQKDB4NzBkNmYwYTQsIDB4M2M2Y2UzOGEpLCBXVENQKDB4NzBiZjJkNTMsIDB4M2M5OTJlYzApLCBXVENQKDB4NzBhNzU4OWYsIDB4M2NjNTcwOWUpLCBXVENQKDB4NzA4ZjcyOGIsIDB4M2NmMWE5MWMpLAotICBXVENQKDB4NzA3NzdiMWMsIDB4M2QxZGQ4MzUpLCBXVENQKDB4NzA1ZjcyNTUsIDB4M2Q0OWZkZTEpLCBXVENQKDB4NzA0NzU4MzksIDB4M2Q3NjFhMTkpLCBXVENQKDB4NzAyZjJjY2QsIDB4M2RhMjJjZDcpLAotICBXVENQKDB4NzAxNmYwMTQsIDB4M2RjZTM2MTQpLCBXVENQKDB4NmZmZWEyMTIsIDB4M2RmYTM1YzgpLCBXVENQKDB4NmZlNjQyY2EsIDB4M2UyNjJiZWUpLCBXVENQKDB4NmZjZGQyNDEsIDB4M2U1MjE4N2YpLAotICBXVENQKDB4NmZiNTUwN2EsIDB4M2U3ZGZiNzMpLCBXVENQKDB4NmY5Y2JkNzksIDB4M2VhOWQ0YzMpLCBXVENQKDB4NmY4NDE5NDIsIDB4M2VkNWE0NmIpLCBXVENQKDB4NmY2YjYzZDgsIDB4M2YwMTZhNjEpLAotICBXVENQKDB4NmY1MjlkNDAsIDB4M2YyZDI2YTApLCBXVENQKDB4NmYzOWM1N2QsIDB4M2Y1OGQ5MjEpLCBXVENQKDB4NmYyMGRjOTIsIDB4M2Y4NDgxZGQpLCBXVENQKDB4NmYwN2UyODUsIDB4M2ZiMDIwY2UpLAotICBXVENQKDB4NmVlZWQ3NTgsIDB4M2ZkYmI1ZWMpLCBXVENQKDB4NmVkNWJiMTAsIDB4NDAwNzQxMzIpLCBXVENQKDB4NmViYzhkYjAsIDB4NDAzMmMyOTcpLCBXVENQKDB4NmVhMzRmM2QsIDB4NDA1ZTNhMTYpLAotICBXVENQKDB4NmU4OWZmYjksIDB4NDA4OWE3YTgpLCBXVENQKDB4NmU3MDlmMmEsIDB4NDBiNTBiNDYpLCBXVENQKDB4NmU1NzJkOTMsIDB4NDBlMDY0ZWEpLCBXVENQKDB4NmUzZGFhZjgsIDB4NDEwYmI0OGMpLAotICBXVENQKDB4NmUyNDE3NWMsIDB4NDEzNmZhMjcpLCBXVENQKDB4NmUwYTcyYzUsIDB4NDE2MjM1YjIpLCBXVENQKDB4NmRmMGJkMzUsIDB4NDE4ZDY3MjkpLCBXVENQKDB4NmRkNmY2YjEsIDB4NDFiODhlODQpLAotICBXVENQKDB4NmRiZDFmM2MsIDB4NDFlM2FiYmMpLCBXVENQKDB4NmRhMzM2ZGMsIDB4NDIwZWJlY2IpLCBXVENQKDB4NmQ4OTNkOTMsIDB4NDIzOWM3YWEpLCBXVENQKDB4NmQ2ZjMzNjUsIDB4NDI2NGM2NTMpLAotICBXVENQKDB4NmQ1NTE4NTgsIDB4NDI4ZmJhYmUpLCBXVENQKDB4NmQzYWVjNmUsIDB4NDJiYWE0ZTYpLCBXVENQKDB4NmQyMGFmYWMsIDB4NDJlNTg0YzMpLCBXVENQKDB4NmQwNjYyMTUsIDB4NDMxMDVhNTApLAotICBXVENQKDB4NmNlYzAzYWYsIDB4NDMzYjI1ODUpLCBXVENQKDB4NmNkMTk0N2MsIDB4NDM2NWU2NWIpLCBXVENQKDB4NmNiNzE0ODIsIDB4NDM5MDljY2QpLCBXVENQKDB4NmM5YzgzYzMsIDB4NDNiYjQ4ZDQpLAotICBXVENQKDB4NmM4MWUyNDUsIDB4NDNlNWVhNjgpLCBXVENQKDB4NmM2NzMwMGIsIDB4NDQxMDgxODQpLCBXVENQKDB4NmM0YzZkMWEsIDB4NDQzYjBlMjEpLCBXVENQKDB4NmMzMTk5NzUsIDB4NDQ2NTkwMzkpLAotICBXVENQKDB4NmMxNmI1MjEsIDB4NDQ5MDA3YzQpLCBXVENQKDB4NmJmYmMwMjEsIDB4NDRiYTc0YmQpLCBXVENQKDB4NmJlMGJhN2IsIDB4NDRlNGQ3MWMpLCBXVENQKDB4NmJjNWE0MzEsIDB4NDUwZjJlZGIpLAotICBXVENQKDB4NmJhYTdkNDksIDB4NDUzOTdiZjQpLCBXVENQKDB4NmI4ZjQ1YzcsIDB4NDU2M2JlNjApLCBXVENQKDB4NmI3M2ZkYWUsIDB4NDU4ZGY2MTkpLCBXVENQKDB4NmI1OGE1MDMsIDB4NDViODIzMTgpLAotICBXVENQKDB4NmIzZDNiY2IsIDB4NDVlMjQ1NTYpLCBXVENQKDB4NmIyMWMyMDgsIDB4NDYwYzVjY2UpLCBXVENQKDB4NmIwNjM3YzEsIDB4NDYzNjY5NzgpLCBXVENQKDB4NmFlYTljZjgsIDB4NDY2MDZiNGUpLAotICBXVENQKDB4NmFjZWYxYjIsIDB4NDY4YTYyNGEpLCBXVENQKDB4NmFiMzM1ZjQsIDB4NDZiNDRlNjUpLCBXVENQKDB4NmE5NzY5YzEsIDB4NDZkZTJmOTkpLCBXVENQKDB4NmE3YjhkMWUsIDB4NDcwODA1ZGYpLAotICBXVENQKDB4NmE1ZmEwMTAsIDB4NDczMWQxMzEpLCBXVENQKDB4NmE0M2EyOWEsIDB4NDc1YjkxODgpLCBXVENQKDB4NmEyNzk0YzEsIDB4NDc4NTQ2ZGUpLCBXVENQKDB4NmEwYjc2ODksIDB4NDdhZWYxMmMpLAotICBXVENQKDB4NjllZjQ3ZjYsIDB4NDdkODkwNmQpLCBXVENQKDB4NjlkMzA5MGUsIDB4NDgwMjI0OTkpLCBXVENQKDB4NjliNmI5ZDMsIDB4NDgyYmFkYWIpLCBXVENQKDB4Njk5YTVhNGMsIDB4NDg1NTJiOWIpLAotICBXVENQKDB4Njk3ZGVhN2IsIDB4NDg3ZTllNjQpLCBXVENQKDB4Njk2MTZhNjUsIDB4NDhhODA1ZmYpLCBXVENQKDB4Njk0NGRhMTAsIDB4NDhkMTYyNjUpLCBXVENQKDB4NjkyODM5N2UsIDB4NDhmYWIzOTEpLAotICBXVENQKDB4NjkwYjg4YjUsIDB4NDkyM2Y5N2IpLCBXVENQKDB4NjhlZWM3YjksIDB4NDk0ZDM0MWUpLCBXVENQKDB4NjhkMWY2OGYsIDB4NDk3NjYzNzMpLCBXVENQKDB4NjhiNTE1M2EsIDB4NDk5Zjg3NzQpLAotICBXVENQKDB4Njg5ODIzYmYsIDB4NDljOGEwMWIpLCBXVENQKDB4Njg3YjIyMjQsIDB4NDlmMWFkNjEpLCBXVENQKDB4Njg1ZTEwNmMsIDB4NGExYWFmM2YpLCBXVENQKDB4Njg0MGVlOWIsIDB4NGE0M2E1YjApLAotICBXVENQKDB4NjgyM2JjYjcsIDB4NGE2YzkwYWQpLCBXVENQKDB4NjgwNjdhYzMsIDB4NGE5NTcwMzApLCBXVENQKDB4NjdlOTI4YzUsIDB4NGFiZTQ0MzMpLCBXVENQKDB4NjdjYmM2YzAsIDB4NGFlNzBjYWYpLAotICBXVENQKDB4NjdhZTU0YmEsIDB4NGIwZmM5OWQpLCBXVENQKDB4Njc5MGQyYjYsIDB4NGIzODdhZjkpLCBXVENQKDB4Njc3MzQwYmEsIDB4NGI2MTIwYmIpLCBXVENQKDB4Njc1NTllY2EsIDB4NGI4OWJhZGQpLAotICBXVENQKDB4NjczN2VjZWEsIDB4NGJiMjQ5NTgpLCBXVENQKDB4NjcxYTJiMjAsIDB4NGJkYWNjMjgpLCBXVENQKDB4NjZmYzU5NmYsIDB4NGMwMzQzNDUpLCBXVENQKDB4NjZkZTc3ZGMsIDB4NGMyYmFlYTkpLAotICBXVENQKDB4NjZjMDg2NmQsIDB4NGM1NDBlNGUpLCBXVENQKDB4NjZhMjg1MjQsIDB4NGM3YzYyMmQpLCBXVENQKDB4NjY4NDc0MDgsIDB4NGNhNGFhNDEpLCBXVENQKDB4NjY2NjUzMWQsIDB4NGNjY2U2ODQpLAotICBXVENQKDB4NjY0ODIyNjcsIDB4NGNmNTE2ZWUpLCBXVENQKDB4NjYyOWUxZWMsIDB4NGQxZDNiN2EpLCBXVENQKDB4NjYwYjkxYWYsIDB4NGQ0NTU0MjIpLCBXVENQKDB4NjVlZDMxYjUsIDB4NGQ2ZDYwZGYpLAotICBXVENQKDB4NjVjZWMyMDQsIDB4NGQ5NTYxYWMpLCBXVENQKDB4NjViMDQyOWYsIDB4NGRiZDU2ODIpLCBXVENQKDB4NjU5MWIzOGMsIDB4NGRlNTNmNWEpLCBXVENQKDB4NjU3MzE0Y2YsIDB4NGUwZDFjMzApLAotICBXVENQKDB4NjU1NDY2NmQsIDB4NGUzNGVjZmMpLCBXVENQKDB4NjUzNWE4NmIsIDB4NGU1Y2IxYjkpLCBXVENQKDB4NjUxNmRhY2QsIDB4NGU4NDZhNjApLCBXVENQKDB4NjRmN2ZkOTgsIDB4NGVhYzE2ZWIpLAotICBXVENQKDB4NjRkOTEwZDEsIDB4NGVkM2I3NTUpLCBXVENQKDB4NjRiYTE0N2QsIDB4NGVmYjRiOTYpLCBXVENQKDB4NjQ5YjA4YTAsIDB4NGYyMmQzYWEpLCBXVENQKDB4NjQ3YmVkM2YsIDB4NGY0YTRmODkpLAotICBXVENQKDB4NjQ1Y2MyNjAsIDB4NGY3MWJmMmUpLCBXVENQKDB4NjQzZDg4MDYsIDB4NGY5OTIyOTMpLCBXVENQKDB4NjQxZTNlMzgsIDB4NGZjMDc5YjEpLCBXVENQKDB4NjNmZWU0ZjgsIDB4NGZlN2M0ODMpLAotICBXVENQKDB4NjNkZjdjNGQsIDB4NTAwZjAzMDIpLCBXVENQKDB4NjNjMDA0M2IsIDB4NTAzNjM1MjkpLCBXVENQKDB4NjNhMDdjYzcsIDB4NTA1ZDVhZjEpLCBXVENQKDB4NjM4MGU1ZjYsIDB4NTA4NDc0NTQpLAotICBXVENQKDB4NjM2MTNmY2QsIDB4NTBhYjgxNGQpLCBXVENQKDB4NjM0MThhNTAsIDB4NTBkMjgxZDUpLCBXVENQKDB4NjMyMWM1ODUsIDB4NTBmOTc1ZTYpLCBXVENQKDB4NjMwMWYxNzEsIDB4NTEyMDVkN2IpLAotICBXVENQKDB4NjJlMjBlMTcsIDB4NTE0NzM4OGMpLCBXVENQKDB4NjJjMjFiN2UsIDB4NTE2ZTA3MTUpLCBXVENQKDB4NjJhMjE5YWEsIDB4NTE5NGM5MTApLCBXVENQKDB4NjI4MjA4YTEsIDB4NTFiYjdlNzUpLAotICBXVENQKDB4NjI2MWU4NjYsIDB4NTFlMjI3NDApLCBXVENQKDB4NjI0MWI4ZmYsIDB4NTIwOGMzNmEpLCBXVENQKDB4NjIyMTdhNzIsIDB4NTIyZjUyZWUpLCBXVENQKDB4NjIwMTJjYzIsIDB4NTI1NWQ1YzUpLAotICBXVENQKDB4NjFlMGNmZjUsIDB4NTI3YzRiZWEpLCBXVENQKDB4NjFjMDY0MTAsIDB4NTJhMmI1NTYpLCBXVENQKDB4NjE5ZmU5MTgsIDB4NTJjOTEyMDQpLCBXVENQKDB4NjE3ZjVmMTIsIDB4NTJlZjYxZWUpLAotICBXVENQKDB4NjE1ZWM2MDMsIDB4NTMxNWE1MGUpLCBXVENQKDB4NjEzZTFkZjAsIDB4NTMzYmRiNWQpLCBXVENQKDB4NjExZDY2ZGUsIDB4NTM2MjA0ZDcpLCBXVENQKDB4NjBmY2EwZDIsIDB4NTM4ODIxNzUpLAotICBXVENQKDB4NjBkYmNiZDEsIDB4NTNhZTMxMzEpLCBXVENQKDB4NjBiYWU3ZTEsIDB4NTNkNDM0MDYpLCBXVENQKDB4NjA5OWY1MDUsIDB4NTNmYTI5ZWQpLCBXVENQKDB4NjA3OGYzNDQsIDB4NTQyMDEyZTEpLAotICBXVENQKDB4NjA1N2UyYTIsIDB4NTQ0NWVlZGIpLCBXVENQKDB4NjAzNmMzMjUsIDB4NTQ2YmJkZDcpLCBXVENQKDB4NjAxNTk0ZDEsIDB4NTQ5MTdmY2UpLCBXVENQKDB4NWZmNDU3YWQsIDB4NTRiNzM0YmEpLAotICBXVENQKDB4NWZkMzBiYmMsIDB4NTRkY2RjOTYpLCBXVENQKDB4NWZiMWIxMDQsIDB4NTUwMjc3NWMpLCBXVENQKDB4NWY5MDQ3OGEsIDB4NTUyODA1MDUpLCBXVENQKDB4NWY2ZWNmNTMsIDB4NTU0ZDg1OGQpLAotICBXVENQKDB4NWY0ZDQ4NjUsIDB4NTU3MmY4ZWQpLCBXVENQKDB4NWYyYmIyYzUsIDB4NTU5ODVmMjApLCBXVENQKDB4NWYwYTBlNzcsIDB4NTViZGI4MWYpLCBXVENQKDB4NWVlODViODIsIDB4NTVlMzAzZTYpLAotICBXVENQKDB4NWVjNjk5ZTksIDB4NTYwODQyNmUpLCBXVENQKDB4NWVhNGM5YjMsIDB4NTYyZDczYjIpLCBXVENQKDB4NWU4MmVhZTUsIDB4NTY1Mjk3YWIpLCBXVENQKDB4NWU2MGZkODQsIDB4NTY3N2FlNTQpLAotICBXVENQKDB4NWUzZjAxOTQsIDB4NTY5Y2I3YTgpLCBXVENQKDB4NWUxY2Y3MWMsIDB4NTZjMWIzYTEpLCBXVENQKDB4NWRmYWRlMjAsIDB4NTZlNmEyMzkpLCBXVENQKDB4NWRkOGI2YTcsIDB4NTcwYjgzNjkpLAotICBXVENQKDB4NWRiNjgwYjQsIDB4NTczMDU3MmUpLCBXVENQKDB4NWQ5NDNjNGUsIDB4NTc1NTFkODApLCBXVENQKDB4NWQ3MWU5NzksIDB4NTc3OWQ2NWIpLCBXVENQKDB4NWQ0Zjg4M2IsIDB4NTc5ZTgxYjgpLAotICBXVENQKDB4NWQyZDE4OWEsIDB4NTdjMzFmOTIpLCBXVENQKDB4NWQwYTlhOWEsIDB4NTdlN2FmZTQpLCBXVENQKDB4NWNlODBlNDEsIDB4NTgwYzMyYTcpLCBXVENQKDB4NWNjNTczOTQsIDB4NTgzMGE3ZDYpLAotICBXVENQKDB4NWNhMmNhOTksIDB4NTg1NTBmNmMpLCBXVENQKDB4NWM4MDEzNTQsIDB4NTg3OTY5NjIpLCBXVENQKDB4NWM1ZDRkY2MsIDB4NTg5ZGI1YjMpLCBXVENQKDB4NWMzYTdhMDUsIDB4NThjMWY0NWIpLAotICBXVENQKDB4NWMxNzk4MDYsIDB4NThlNjI1NTIpLCBXVENQKDB4NWJmNGE3ZDIsIDB4NTkwYTQ4OTMpLCBXVENQKDB4NWJkMWE5NzEsIDB4NTkyZTVlMTkpLCBXVENQKDB4NWJhZTljZTcsIDB4NTk1MjY1ZGYpLAotICBXVENQKDB4NWI4YjgyMzksIDB4NTk3NjVmZGUpLCBXVENQKDB4NWI2ODU5NmQsIDB4NTk5YTRjMTIpLCBXVENQKDB4NWI0NTIyODgsIDB4NTliZTJhNzQpLCBXVENQKDB4NWIyMWRkOTAsIDB4NTllMWZhZmYpLAotICBXVENQKDB4NWFmZThhOGIsIDB4NWEwNWJkYWUpLCBXVENQKDB4NWFkYjI5N2QsIDB4NWEyOTcyN2IpLCBXVENQKDB4NWFiN2JhNmMsIDB4NWE0ZDE5NjApLCBXVENQKDB4NWE5NDNkNWUsIDB4NWE3MGIyNTgpLAorY29uc3QgRklYUF9TVFAgU2luZVRhYmxlMzg0W10gPSB7CisgICAgU1RDUCgweDdmZmZmZmZmLCAweDAwMDAwMDAwKSwgU1RDUCgweDdmZmZiOWQxLCAweDAwODYwYTc5KSwKKyAgICBTVENQKDB4N2ZmZWU3NDQsIDB4MDEwYzE0NjApLCBTVENQKDB4N2ZmZDg4NWEsIDB4MDE5MjFkMjApLAorICAgIFNUQ1AoMHg3ZmZiOWQxNSwgMHgwMjE4MjQyNyksIFNUQ1AoMHg3ZmY5MjU3NywgMHgwMjllMjhlMiksCisgICAgU1RDUCgweDdmZjYyMTgyLCAweDAzMjQyYWJmKSwgU1RDUCgweDdmZjI5MTNhLCAweDAzYWEyOTJhKSwKKyAgICBTVENQKDB4N2ZlZTc0YTIsIDB4MDQzMDIzOGYpLCBTVENQKDB4N2ZlOWNiYzAsIDB4MDRiNjE5NWQpLAorICAgIFNUQ1AoMHg3ZmU0OTY5OCwgMHgwNTNjMGEwMSksIFNUQ1AoMHg3ZmRlZDUzMCwgMHgwNWMxZjRlNyksCisgICAgU1RDUCgweDdmZDg4NzhlLCAweDA2NDdkOTdjKSwgU1RDUCgweDdmZDFhZGI5LCAweDA2Y2RiNzJmKSwKKyAgICBTVENQKDB4N2ZjYTQ3YjksIDB4MDc1MzhkNmIpLCBTVENQKDB4N2ZjMjU1OTYsIDB4MDdkOTViOWUpLAorICAgIFNUQ1AoMHg3ZmI5ZDc1OSwgMHgwODVmMjEzNyksIFNUQ1AoMHg3ZmIwY2QwYSwgMHgwOGU0ZGRhMCksCisgICAgU1RDUCgweDdmYTczNmI0LCAweDA5NmE5MDQ5KSwgU1RDUCgweDdmOWQxNDYxLCAweDA5ZjAzODlmKSwKKyAgICBTVENQKDB4N2Y5MjY2MWQsIDB4MGE3NWQ2MGUpLCBTVENQKDB4N2Y4NzJiZjMsIDB4MGFmYjY4MDUpLAorICAgIFNUQ1AoMHg3ZjdiNjVlZiwgMHgwYjgwZWRmMSksIFNUQ1AoMHg3ZjZmMTQxZiwgMHgwYzA2Njc0MCksCisgICAgU1RDUCgweDdmNjIzNjhmLCAweDBjOGJkMzVlKSwgU1RDUCgweDdmNTRjZDRmLCAweDBkMTEzMWJhKSwKKyAgICBTVENQKDB4N2Y0NmQ4NmMsIDB4MGQ5NjgxYzIpLCBTVENQKDB4N2YzODU3ZjYsIDB4MGUxYmMyZTQpLAorICAgIFNUQ1AoMHg3ZjI5NGJmZCwgMHgwZWEwZjQ4YyksIFNUQ1AoMHg3ZjE5YjQ5MSwgMHgwZjI2MTYyYSksCisgICAgU1RDUCgweDdmMDk5MWM0LCAweDBmYWIyNzJiKSwgU1RDUCgweDdlZjhlM2E2LCAweDEwMzAyNmZlKSwKKyAgICBTVENQKDB4N2VlN2FhNGMsIDB4MTBiNTE1MGYpLCBTVENQKDB4N2VkNWU1YzYsIDB4MTEzOWYwY2YpLAorICAgIFNUQ1AoMHg3ZWMzOTYyYSwgMHgxMWJlYjlhYSksIFNUQ1AoMHg3ZWIwYmI4YSwgMHgxMjQzNmYxMCksCisgICAgU1RDUCgweDdlOWQ1NWZjLCAweDEyYzgxMDZmKSwgU1RDUCgweDdlODk2NTk1LCAweDEzNGM5ZDM0KSwKKyAgICBTVENQKDB4N2U3NGVhNmEsIDB4MTNkMTE0ZDApLCBTVENQKDB4N2U1ZmU0OTMsIDB4MTQ1NTc2YjEpLAorICAgIFNUQ1AoMHg3ZTRhNTQyNiwgMHgxNGQ5YzI0NSksIFNUQ1AoMHg3ZTM0MzkzYiwgMHgxNTVkZjZmYyksCisgICAgU1RDUCgweDdlMWQ5M2VhLCAweDE1ZTIxNDQ1KSwgU1RDUCgweDdlMDY2NDRjLCAweDE2NjYxOThkKSwKKyAgICBTVENQKDB4N2RlZWFhN2EsIDB4MTZlYTA2NDYpLCBTVENQKDB4N2RkNjY2OGYsIDB4MTc2ZGQ5ZGUpLAorICAgIFNUQ1AoMHg3ZGJkOThhNCwgMHgxN2YxOTNjNSksIFNUQ1AoMHg3ZGE0NDBkNiwgMHgxODc1MzM2YSksCisgICAgU1RDUCgweDdkOGE1ZjQwLCAweDE4ZjhiODNjKSwgU1RDUCgweDdkNmZmM2ZlLCAweDE5N2MyMWFkKSwKKyAgICBTVENQKDB4N2Q1NGZmMmUsIDB4MTlmZjZmMmEpLCBTVENQKDB4N2QzOTgwZWMsIDB4MWE4MmEwMjYpLAorICAgIFNUQ1AoMHg3ZDFkNzk1OCwgMHgxYjA1YjQwZiksIFNUQ1AoMHg3ZDAwZTg4ZiwgMHgxYjg4YWE1NSksCisgICAgU1RDUCgweDdjZTNjZWIyLCAweDFjMGI4MjZhKSwgU1RDUCgweDdjYzYyYmRmLCAweDFjOGUzYmJlKSwKKyAgICBTVENQKDB4N2NhODAwMzgsIDB4MWQxMGQ1YzIpLCBTVENQKDB4N2M4OTRiZGUsIDB4MWQ5MzRmZTUpLAorICAgIFNUQ1AoMHg3YzZhMGVmMiwgMHgxZTE1YTk5YSksIFNUQ1AoMHg3YzRhNDk5NiwgMHgxZTk3ZTI1MSksCisgICAgU1RDUCgweDdjMjlmYmVlLCAweDFmMTlmOTdiKSwgU1RDUCgweDdjMDkyNjFkLCAweDFmOWJlZThhKSwKKyAgICBTVENQKDB4N2JlN2M4NDcsIDB4MjAxZGMwZWYpLCBTVENQKDB4N2JjNWUyOTAsIDB4MjA5ZjcwMWMpLAorICAgIFNUQ1AoMHg3YmEzNzUxZCwgMHgyMTIwZmI4MyksIFNUQ1AoMHg3YjgwODAxNSwgMHgyMWEyNjI5NSksCisgICAgU1RDUCgweDdiNWQwMzllLCAweDIyMjNhNGM1KSwgU1RDUCgweDdiMzhmZmRlLCAweDIyYTRjMTg1KSwKKyAgICBTVENQKDB4N2IxNDc0ZmQsIDB4MjMyNWI4NDcpLCBTVENQKDB4N2FlZjYzMjMsIDB4MjNhNjg4N2YpLAorICAgIFNUQ1AoMHg3YWM5Y2E3YSwgMHgyNDI3MzE5ZCksIFNUQ1AoMHg3YWEzYWIyOSwgMHgyNGE3YjMxNyksCisgICAgU1RDUCgweDdhN2QwNTViLCAweDI1MjgwYzVlKSwgU1RDUCgweDdhNTVkOTNhLCAweDI1YTgzY2U2KSwKKyAgICBTVENQKDB4N2EyZTI2ZjIsIDB4MjYyODQ0MjIpLCBTVENQKDB4N2EwNWVlYWQsIDB4MjZhODIxODYpLAorICAgIFNUQ1AoMHg3OWRkMzA5OCwgMHgyNzI3ZDQ4NiksIFNUQ1AoMHg3OWIzZWNlMCwgMHgyN2E3NWM5NSksCisgICAgU1RDUCgweDc5OGEyM2IxLCAweDI4MjZiOTI4KSwgU1RDUCgweDc5NWZkNTNhLCAweDI4YTVlOWI0KSwKKyAgICBTVENQKDB4NzkzNTAxYTksIDB4MjkyNGVkYWMpLCBTVENQKDB4NzkwOWE5MmQsIDB4MjlhM2M0ODUpLAorICAgIFNUQ1AoMHg3OGRkY2JmNSwgMHgyYTIyNmRiNSksIFNUQ1AoMHg3OGIxNmEzMiwgMHgyYWEwZThiMCksCisgICAgU1RDUCgweDc4ODQ4NDE0LCAweDJiMWYzNGViKSwgU1RDUCgweDc4NTcxOWNjLCAweDJiOWQ1MWRkKSwKKyAgICBTVENQKDB4NzgyOTJiOGQsIDB4MmMxYjNlZmIpLCBTVENQKDB4NzdmYWI5ODksIDB4MmM5OGZiYmEpLAorICAgIFNUQ1AoMHg3N2NiYzNmMiwgMHgyZDE2ODc5MiksIFNUQ1AoMHg3NzljNGFmYywgMHgyZDkzZTFmOCksCisgICAgU1RDUCgweDc3NmM0ZWRiLCAweDJlMTEwYTYyKSwgU1RDUCgweDc3M2JjZmM0LCAweDJlOGUwMDQ4KSwKKyAgICBTVENQKDB4NzcwYWNkZWMsIDB4MmYwYWMzMjApLCBTVENQKDB4NzZkOTQ5ODksIDB4MmY4NzUyNjIpLAorICAgIFNUQ1AoMHg3NmE3NDJkMSwgMHgzMDAzYWQ4NSksIFNUQ1AoMHg3Njc0YjlmYSwgMHgzMDdmZDQwMSksCisgICAgU1RDUCgweDc2NDFhZjNkLCAweDMwZmJjNTRkKSwgU1RDUCgweDc2MGUyMmQxLCAweDMxNzc4MGUyKSwKKyAgICBTVENQKDB4NzVkYTE0ZWYsIDB4MzFmMzA2MzgpLCBTVENQKDB4NzVhNTg1Y2YsIDB4MzI2ZTU0YzcpLAorICAgIFNUQ1AoMHg3NTcwNzVhYywgMHgzMmU5NmMwOSksIFNUQ1AoMHg3NTNhZTRjMCwgMHgzMzY0NGI3NiksCisgICAgU1RDUCgweDc1MDRkMzQ1LCAweDMzZGVmMjg3KSwgU1RDUCgweDc0Y2U0MTc3LCAweDM0NTk2MGI3KSwKKyAgICBTVENQKDB4NzQ5NzJmOTIsIDB4MzRkMzk1N2UpLCBTVENQKDB4NzQ1ZjlkZDEsIDB4MzU0ZDkwNTcpLAorICAgIFNUQ1AoMHg3NDI3OGM3MiwgMHgzNWM3NTBiYyksIFNUQ1AoMHg3M2VlZmJiMywgMHgzNjQwZDYyNyksCisgICAgU1RDUCgweDczYjVlYmQxLCAweDM2YmEyMDE0KSwgU1RDUCgweDczN2M1ZDBiLCAweDM3MzMyZGZkKSwKKyAgICBTVENQKDB4NzM0MjRmYTAsIDB4MzdhYmZmNWQpLCBTVENQKDB4NzMwN2MzZDAsIDB4MzgyNDkzYjApLAorICAgIFNUQ1AoMHg3MmNjYjlkYiwgMHgzODljZWE3MiksIFNUQ1AoMHg3MjkxMzIwMSwgMHgzOTE1MDMxZiksCisgICAgU1RDUCgweDcyNTUyYzg1LCAweDM5OGNkZDMyKSwgU1RDUCgweDcyMThhOWE3LCAweDNhMDQ3ODJhKSwKKyAgICBTVENQKDB4NzFkYmE5YWIsIDB4M2E3YmQzODIpLCBTVENQKDB4NzE5ZTJjZDIsIDB4M2FmMmVlYjcpLAorICAgIFNUQ1AoMHg3MTYwMzM2MSwgMHgzYjY5Yzk0NyksIFNUQ1AoMHg3MTIxYmQ5YywgMHgzYmUwNjJiMCksCisgICAgU1RDUCgweDcwZTJjYmM2LCAweDNjNTZiYTcwKSwgU1RDUCgweDcwYTM1ZTI1LCAweDNjY2NkMDA0KSwKKyAgICBTVENQKDB4NzA2Mzc0ZmYsIDB4M2Q0MmEyZWMpLCBTVENQKDB4NzAyMzEwOWEsIDB4M2RiODMyYTYpLAorICAgIFNUQ1AoMHg2ZmUyMzEzYywgMHgzZTJkN2ViMSksIFNUQ1AoMHg2ZmEwZDcyYywgMHgzZWEyODY4YyksCisgICAgU1RDUCgweDZmNWYwMmIyLCAweDNmMTc0OWI4KSwgU1RDUCgweDZmMWNiNDE2LCAweDNmOGJjN2I0KSwKKyAgICBTVENQKDB4NmVkOWViYTEsIDB4NDAwMDAwMDApLCBTVENQKDB4NmU5NmE5OWQsIDB4NDA3M2YyMWQpLAorICAgIFNUQ1AoMHg2ZTUyZWU1MiwgMHg0MGU3OWQ4YyksIFNUQ1AoMHg2ZTBlYmEwYywgMHg0MTViMDFjZSksCisgICAgU1RDUCgweDZkY2EwZDE0LCAweDQxY2UxZTY1KSwgU1RDUCgweDZkODRlN2I3LCAweDQyNDBmMmQxKSwKKyAgICBTVENQKDB4NmQzZjRhNDAsIDB4NDJiMzdlOTYpLCBTVENQKDB4NmNmOTM0ZmMsIDB4NDMyNWMxMzUpLAorICAgIFNUQ1AoMHg2Y2IyYTgzNywgMHg0Mzk3YmEzMiksIFNUQ1AoMHg2YzZiYTQzZSwgMHg0NDA5NjkxMCksCisgICAgU1RDUCgweDZjMjQyOTYwLCAweDQ0N2FjZDUwKSwgU1RDUCgweDZiZGMzN2ViLCAweDQ0ZWJlNjc5KSwKKyAgICBTVENQKDB4NmI5M2QwMmUsIDB4NDU1Y2I0MGMpLCBTVENQKDB4NmI0YWYyNzksIDB4NDVjZDM1OGYpLAorICAgIFNUQ1AoMHg2YjAxOWYxYSwgMHg0NjNkNmE4NyksIFNUQ1AoMHg2YWI3ZDY2MywgMHg0NmFkNTI3OCksCisgICAgU1RDUCgweDZhNmQ5OGE0LCAweDQ3MWNlY2U3KSwgU1RDUCgweDZhMjJlNjMwLCAweDQ3OGMzOTVhKSwKKyAgICBTVENQKDB4NjlkN2JmNTcsIDB4NDdmYjM3NTcpLCBTVENQKDB4Njk4YzI0NmMsIDB4NDg2OWU2NjUpLAorICAgIFNUQ1AoMHg2OTQwMTVjMywgMHg0OGQ4NDYwOSksIFNUQ1AoMHg2OGYzOTNhZSwgMHg0OTQ2NTVjYyksCisgICAgU1RDUCgweDY4YTY5ZTgxLCAweDQ5YjQxNTMzKSwgU1RDUCgweDY4NTkzNjkxLCAweDRhMjE4M2M4KSwKKyAgICBTVENQKDB4NjgwYjVjMzMsIDB4NGE4ZWExMTEpLCBTVENQKDB4NjdiZDBmYmQsIDB4NGFmYjZjOTgpLAorICAgIFNUQ1AoMHg2NzZlNTE4MywgMHg0YjY3ZTVlNCksIFNUQ1AoMHg2NzFmMjFkYywgMHg0YmQ0MGM4MCksCisgICAgU1RDUCgweDY2Y2Y4MTIwLCAweDRjM2ZkZmY0KSwgU1RDUCgweDY2N2Y2ZmE1LCAweDRjYWI1ZmM5KSwKKyAgICBTVENQKDB4NjYyZWVkYzMsIDB4NGQxNjhiOGIpLCBTVENQKDB4NjVkZGZiZDMsIDB4NGQ4MTYyYzQpLAorICAgIFNUQ1AoMHg2NThjOWEyZCwgMHg0ZGViZTRmZSksIFNUQ1AoMHg2NTNhYzkyYiwgMHg0ZTU2MTFjNSksCisgICAgU1RDUCgweDY0ZTg4OTI2LCAweDRlYmZlOGE1KSwgU1RDUCgweDY0OTVkYTc5LCAweDRmMjk2OTI4KSwKKyAgICBTVENQKDB4NjQ0MmJkN2UsIDB4NGY5MjkyZGMpLCBTVENQKDB4NjNlZjMyOTAsIDB4NGZmYjY1NGQpLAorICAgIFNUQ1AoMHg2MzliM2EwYiwgMHg1MDYzZTAwOCksIFNUQ1AoMHg2MzQ2ZDQ0YiwgMHg1MGNjMDI5YyksCisgICAgU1RDUCgweDYyZjIwMWFjLCAweDUxMzNjYzk0KSwgU1RDUCgweDYyOWNjMjhjLCAweDUxOWIzZDgwKSwKKyAgICBTVENQKDB4NjI0NzE3NDksIDB4NTIwMjU0ZWYpLCBTVENQKDB4NjFmMTAwM2YsIDB4NTI2OTEyNmUpLAorICAgIFNUQ1AoMHg2MTlhN2RjZSwgMHg1MmNmNzU4ZiksIFNUQ1AoMHg2MTQzOTA1MywgMHg1MzM1N2RkZiksCisgICAgU1RDUCgweDYwZWMzODMwLCAweDUzOWIyYWYwKSwgU1RDUCgweDYwOTQ3NWMzLCAweDU0MDA3YzUxKSwKKyAgICBTVENQKDB4NjAzYzQ5NmMsIDB4NTQ2NTcxOTQpLCBTVENQKDB4NWZlM2IzOGQsIDB4NTRjYTBhNGIpLAorICAgIFNUQ1AoMHg1ZjhhYjQ4NywgMHg1NTJlNDYwNSksIFNUQ1AoMHg1ZjMxNGNiYSwgMHg1NTkyMjQ1NyksCisgICAgU1RDUCgweDVlZDc3YzhhLCAweDU1ZjVhNGQyKSwgU1RDUCgweDVlN2Q0NDU4LCAweDU2NThjNzA5KSwKKyAgICBTVENQKDB4NWUyMmE0ODcsIDB4NTZiYjhhOTApLCBTVENQKDB4NWRjNzlkN2MsIDB4NTcxZGVlZmEpLAorICAgIFNUQ1AoMHg1ZDZjMmY5OSwgMHg1NzdmZjNkYSksIFNUQ1AoMHg1ZDEwNWI0NCwgMHg1N2UxOThjNyksCisgICAgU1RDUCgweDVjYjQyMGUwLCAweDU4NDJkZDU0KSwgU1RDUCgweDVjNTc4MGQzLCAweDU4YTNjMTE4KSwKKyAgICBTVENQKDB4NWJmYTdiODIsIDB4NTkwNDQzYTcpLCBTVENQKDB4NWI5ZDExNTQsIDB4NTk2NDY0OTgpLAorICAgIFNUQ1AoMHg1YjNmNDJhZSwgMHg1OWM0MjM4MSksIFNUQ1AoMHg1YWUxMGZmOSwgMHg1YTIzN2ZmYSksCisgICAgU1RDUCgweDVhODI3OTlhLCAweDVhODI3OTlhKSwKIH07CiAKIFJBTV9BTElHTgogTE5LX1NFQ1RJT05fQ09OU1REQVRBCi1jb25zdCBGSVhQX1dUUCBLQkRXaW5kb3cxMDI0W10gPQotewotICBXVENQKDB4N2ZmZmZmYTQsIDB4MDAwOTk2MmYpLCBXVENQKDB4N2ZmZmZmMzksIDB4MDAwZTE2ZmIpLCBXVENQKDB4N2ZmZmZlYmYsIDB4MDAxMWVhNjUpLCBXVENQKDB4N2ZmZmZlMzQsIDB4MDAxNTc1MGUpLAotICBXVENQKDB4N2ZmZmZkOTYsIDB4MDAxOGRjNzQpLCBXVENQKDB4N2ZmZmZjZTUsIDB4MDAxYzMzMmUpLCBXVENQKDB4N2ZmZmZjMWYsIDB4MDAxZjgzZjUpLCBXVENQKDB4N2ZmZmZiNDMsIDB4MDAyMmQ1OWEpLAotICBXVENQKDB4N2ZmZmZhNGYsIDB4MDAyNjJjYzIpLCBXVENQKDB4N2ZmZmY5NDIsIDB4MDAyOThjYzQpLCBXVENQKDB4N2ZmZmY4MWEsIDB4MDAyY2Y4MWYpLCBXVENQKDB4N2ZmZmY2ZDYsIDB4MDAzMDcwYzQpLAotICBXVENQKDB4N2ZmZmY1NzMsIDB4MDAzM2Y4NDApLCBXVENQKDB4N2ZmZmYzZjEsIDB4MDAzNzhmZDkpLCBXVENQKDB4N2ZmZmYyNGQsIDB4MDAzYjM4YTEpLCBXVENQKDB4N2ZmZmYwODUsIDB4MDAzZWYzODEpLAotICBXVENQKDB4N2ZmZmVlOTgsIDB4MDA0MmMxNDcpLCBXVENQKDB4N2ZmZmVjODMsIDB4MDA0NmEyYTgpLCBXVENQKDB4N2ZmZmVhNDQsIDB4MDA0YTk4NDcpLCBXVENQKDB4N2ZmZmU3ZDgsIDB4MDA0ZWEyYjcpLAotICBXVENQKDB4N2ZmZmU1M2YsIDB4MDA1MmMyODMpLCBXVENQKDB4N2ZmZmUyNzQsIDB4MDA1NmY4MjkpLCBXVENQKDB4N2ZmZmRmNzYsIDB4MDA1YjQ0MjIpLCBXVENQKDB4N2ZmZmRjNDMsIDB4MDA1ZmE2ZGQpLAotICBXVENQKDB4N2ZmZmQ4ZDYsIDB4MDA2NDIwYzgpLCBXVENQKDB4N2ZmZmQ1MmYsIDB4MDA2OGIyNDkpLCBXVENQKDB4N2ZmZmQxNDksIDB4MDA2ZDViYzQpLCBXVENQKDB4N2ZmZmNkMjIsIDB4MDA3MjFkOWEpLAotICBXVENQKDB4N2ZmZmM4YjYsIDB4MDA3NmY4MjgpLCBXVENQKDB4N2ZmZmM0MDQsIDB4MDA3YmViY2EpLCBXVENQKDB4N2ZmZmJmMDYsIDB4MDA4MGY4ZDkpLCBXVENQKDB4N2ZmZmI5YmIsIDB4MDA4NjFmYWUpLAotICBXVENQKDB4N2ZmZmI0MWUsIDB4MDA4YjYwOWUpLCBXVENQKDB4N2ZmZmFlMmMsIDB4MDA5MGJiZmYpLCBXVENQKDB4N2ZmZmE3ZTEsIDB4MDA5NjMyMjQpLCBXVENQKDB4N2ZmZmExM2EsIDB4MDA5YmMzNjIpLAotICBXVENQKDB4N2ZmZjlhMzIsIDB4MDBhMTcwMDkpLCBXVENQKDB4N2ZmZjkyYzUsIDB4MDBhNzM4NmMpLCBXVENQKDB4N2ZmZjhhZjAsIDB4MDBhZDFjZGMpLCBXVENQKDB4N2ZmZjgyYWQsIDB4MDBiMzFkYTgpLAotICBXVENQKDB4N2ZmZjc5ZjksIDB4MDBiOTNiMjEpLCBXVENQKDB4N2ZmZjcwY2YsIDB4MDBiZjc1OTYpLCBXVENQKDB4N2ZmZjY3MmEsIDB4MDBjNWNkNTcpLCBXVENQKDB4N2ZmZjVkMDUsIDB4MDBjYzQyYjEpLAotICBXVENQKDB4N2ZmZjUyNWMsIDB4MDBkMmQ1ZjMpLCBXVENQKDB4N2ZmZjQ3MjksIDB4MDBkOTg3NmMpLCBXVENQKDB4N2ZmZjNiNjYsIDB4MDBlMDU3NjkpLCBXVENQKDB4N2ZmZjJmMTAsIDB4MDBlNzQ2MzgpLAotICBXVENQKDB4N2ZmZjIyMWYsIDB4MDBlZTU0MjYpLCBXVENQKDB4N2ZmZjE0OGUsIDB4MDBmNTgxODIpLCBXVENQKDB4N2ZmZjA2NTgsIDB4MDBmY2NlOTcpLCBXVENQKDB4N2ZmZWY3NzYsIDB4MDEwNDNiYjMpLAotICBXVENQKDB4N2ZmZWU3ZTIsIDB4MDEwYmM5MjMpLCBXVENQKDB4N2ZmZWQ3OTUsIDB4MDExMzc3MzMpLCBXVENQKDB4N2ZmZWM2OGEsIDB4MDExYjQ2MzEpLCBXVENQKDB4N2ZmZWI0YmEsIDB4MDEyMzM2NjkpLAotICBXVENQKDB4N2ZmZWEyMWQsIDB4MDEyYjQ4MjcpLCBXVENQKDB4N2ZmZThlYWMsIDB4MDEzMzdiYjgpLCBXVENQKDB4N2ZmZTdhNjEsIDB4MDEzYmQxNjcpLCBXVENQKDB4N2ZmZTY1MzMsIDB4MDE0NDQ5ODIpLAotICBXVENQKDB4N2ZmZTRmMWMsIDB4MDE0Y2U0NTQpLCBXVENQKDB4N2ZmZTM4MTMsIDB4MDE1NWEyMjkpLCBXVENQKDB4N2ZmZTIwMTEsIDB4MDE1ZTgzNGQpLCBXVENQKDB4N2ZmZTA3MGQsIDB4MDE2Nzg4MGMpLAotICBXVENQKDB4N2ZmZGVjZmYsIDB4MDE3MGIwYjIpLCBXVENQKDB4N2ZmZGQxZGYsIDB4MDE3OWZkOGIpLCBXVENQKDB4N2ZmZGI1YTIsIDB4MDE4MzZlZTEpLCBXVENQKDB4N2ZmZDk4NDIsIDB4MDE4ZDA1MDApLAotICBXVENQKDB4N2ZmZDc5YjMsIDB4MDE5NmMwMzUpLCBXVENQKDB4N2ZmZDU5ZWUsIDB4MDFhMGEwY2EpLCBXVENQKDB4N2ZmZDM4ZTgsIDB4MDFhYWE3MGEpLCBXVENQKDB4N2ZmZDE2OTcsIDB4MDFiNGQzNDEpLAotICBXVENQKDB4N2ZmY2YyZjIsIDB4MDFiZjI1YjkpLCBXVENQKDB4N2ZmY2NkZWUsIDB4MDFjOTllYmQpLCBXVENQKDB4N2ZmY2E3ODAsIDB4MDFkNDNlOTkpLCBXVENQKDB4N2ZmYzdmOWUsIDB4MDFkZjA1OTcpLAotICBXVENQKDB4N2ZmYzU2M2QsIDB4MDFlOWY0MDEpLCBXVENQKDB4N2ZmYzJiNTEsIDB4MDFmNTBhMjIpLCBXVENQKDB4N2ZmYmZlY2YsIDB4MDIwMDQ4NDQpLCBXVENQKDB4N2ZmYmQwYWIsIDB4MDIwYmFlYjEpLAotICBXVENQKDB4N2ZmYmEwZGEsIDB4MDIxNzNkYjQpLCBXVENQKDB4N2ZmYjZmNGYsIDB4MDIyMmY1OTYpLCBXVENQKDB4N2ZmYjNiZmQsIDB4MDIyZWQ2YTEpLCBXVENQKDB4N2ZmYjA2ZDgsIDB4MDIzYWUxMWYpLAotICBXVENQKDB4N2ZmYWNmZDMsIDB4MDI0NzE1NTgpLCBXVENQKDB4N2ZmYTk2ZTAsIDB4MDI1MzczOTcpLCBXVENQKDB4N2ZmYTViZjIsIDB4MDI1ZmZjMjUpLCBXVENQKDB4N2ZmYTFlZmMsIDB4MDI2Y2FmNGEpLAotICBXVENQKDB4N2ZmOWRmZWUsIDB4MDI3OThkNGYpLCBXVENQKDB4N2ZmOTllYmIsIDB4MDI4Njk2N2MpLCBXVENQKDB4N2ZmOTViNTUsIDB4MDI5M2NiMWIpLCBXVENQKDB4N2ZmOTE1YWIsIDB4MDJhMTJiNzIpLAotICBXVENQKDB4N2ZmOGNkYWYsIDB4MDJhZWI3Y2IpLCBXVENQKDB4N2ZmODgzNTEsIDB4MDJiYzcwNmQpLCBXVENQKDB4N2ZmODM2ODIsIDB4MDJjYTU1OWYpLCBXVENQKDB4N2ZmN2U3MzEsIDB4MDJkODY3YTkpLAotICBXVENQKDB4N2ZmNzk1NGUsIDB4MDJlNmE2ZDIpLCBXVENQKDB4N2ZmNzQwYzgsIDB4MDJmNTEzNjEpLCBXVENQKDB4N2ZmNmU5OGUsIDB4MDMwM2FkOWMpLCBXVENQKDB4N2ZmNjhmOGYsIDB4MDMxMjc1Y2EpLAotICBXVENQKDB4N2ZmNjMyYmEsIDB4MDMyMTZjMzApLCBXVENQKDB4N2ZmNWQyZmIsIDB4MDMzMDkxMTYpLCBXVENQKDB4N2ZmNTcwNDIsIDB4MDMzZmU0YmYpLCBXVENQKDB4N2ZmNTBhN2EsIDB4MDM0ZjY3NzMpLAotICBXVENQKDB4N2ZmNGExOTIsIDB4MDM1ZjE5NzUpLCBXVENQKDB4N2ZmNDM1NzYsIDB4MDM2ZWZiMGEpLCBXVENQKDB4N2ZmM2M2MTIsIDB4MDM3ZjBjNzgpLCBXVENQKDB4N2ZmMzUzNTMsIDB4MDM4ZjRlMDIpLAotICBXVENQKDB4N2ZmMmRkMjQsIDB4MDM5ZmJmZWIpLCBXVENQKDB4N2ZmMjYzNzAsIDB4MDNiMDYyNzkpLCBXVENQKDB4N2ZmMWU2MjMsIDB4MDNjMTM1ZWQpLCBXVENQKDB4N2ZmMTY1MjcsIDB4MDNkMjNhOGIpLAotICBXVENQKDB4N2ZmMGUwNjcsIDB4MDNlMzcwOTUpLCBXVENQKDB4N2ZmMDU3Y2MsIDB4MDNmNGQ4NGUpLCBXVENQKDB4N2ZlZmNiNDAsIDB4MDQwNjcxZjcpLCBXVENQKDB4N2ZlZjNhYWQsIDB4MDQxODNkZDMpLAotICBXVENQKDB4N2ZlZWE1ZmEsIDB4MDQyYTNjMjIpLCBXVENQKDB4N2ZlZTBkMTEsIDB4MDQzYzZkMjUpLCBXVENQKDB4N2ZlZDZmZGEsIDB4MDQ0ZWQxMWQpLCBXVENQKDB4N2ZlY2NlM2QsIDB4MDQ2MTY4NDkpLAotICBXVENQKDB4N2ZlYzI4MjEsIDB4MDQ3NDMyZWIpLCBXVENQKDB4N2ZlYjdkNmMsIDB4MDQ4NzMxNDApLCBXVENQKDB4N2ZlYWNlMDcsIDB4MDQ5YTYzODgpLCBXVENQKDB4N2ZlYTE5ZDYsIDB4MDRhZGNhMDEpLAotICBXVENQKDB4N2ZlOTYwYzAsIDB4MDRjMTY0ZWEpLCBXVENQKDB4N2ZlOGEyYWEsIDB4MDRkNTM0ODEpLCBXVENQKDB4N2ZlN2RmNzksIDB4MDRlOTM5MDIpLCBXVENQKDB4N2ZlNzE3MTIsIDB4MDRmZDcyYWEpLAotICBXVENQKDB4N2ZlNjQ5NWEsIDB4MDUxMWUxYjYpLCBXVENQKDB4N2ZlNTc2MzQsIDB4MDUyNjg2NjMpLCBXVENQKDB4N2ZlNDlkODMsIDB4MDUzYjYwZWIpLCBXVENQKDB4N2ZlM2JmMmIsIDB4MDU1MDcxODkpLAotICBXVENQKDB4N2ZlMmRiMGYsIDB4MDU2NWI4NzkpLCBXVENQKDB4N2ZlMWYxMTAsIDB4MDU3YjM1ZjQpLCBXVENQKDB4N2ZlMTAxMTEsIDB4MDU5MGVhMzUpLCBXVENQKDB4N2ZlMDBhZjMsIDB4MDVhNmQ1NzQpLAotICBXVENQKDB4N2ZkZjBlOTcsIDB4MDViY2Y3ZWEpLCBXVENQKDB4N2ZkZTBiZGQsIDB4MDVkMzUxY2YpLCBXVENQKDB4N2ZkZDAyYTYsIDB4MDVlOWUzNWMpLCBXVENQKDB4N2ZkYmYyZDIsIDB4MDYwMGFjYzgpLAotICBXVENQKDB4N2ZkYWRjNDAsIDB4MDYxN2FlNDgpLCBXVENQKDB4N2ZkOWJlY2YsIDB4MDYyZWU4MTQpLCBXVENQKDB4N2ZkODlhNWUsIDB4MDY0NjVhNjIpLCBXVENQKDB4N2ZkNzZlY2EsIDB4MDY1ZTA1NjUpLAotICBXVENQKDB4N2ZkNjNiZjEsIDB4MDY3NWU5NTQpLCBXVENQKDB4N2ZkNTAxYjAsIDB4MDY4ZTA2NjIpLCBXVENQKDB4N2ZkM2JmZTQsIDB4MDZhNjVjYzMpLCBXVENQKDB4N2ZkMjc2NmEsIDB4MDZiZWVjYWEpLAotICBXVENQKDB4N2ZkMTI1MWUsIDB4MDZkN2I2NDgpLCBXVENQKDB4N2ZjZmNiZGEsIDB4MDZmMGI5ZDEpLCBXVENQKDB4N2ZjZTZhN2EsIDB4MDcwOWY3NzUpLCBXVENQKDB4N2ZjZDAwZDgsIDB4MDcyMzZmNjUpLAotICBXVENQKDB4N2ZjYjhlY2YsIDB4MDczZDIxZDIpLCBXVENQKDB4N2ZjYTE0MzksIDB4MDc1NzBlZWEpLCBXVENQKDB4N2ZjODkwZWQsIDB4MDc3MTM2ZGQpLCBXVENQKDB4N2ZjNzA0YzcsIDB4MDc4Yjk5ZGEpLAotICBXVENQKDB4N2ZjNTZmOWQsIDB4MDdhNjM4MGQpLCBXVENQKDB4N2ZjM2QxNDcsIDB4MDdjMTExYTQpLCBXVENQKDB4N2ZjMjI5OWUsIDB4MDdkYzI2Y2MpLCBXVENQKDB4N2ZjMDc4NzgsIDB4MDdmNzc3YjEpLAotICBXVENQKDB4N2ZiZWJkYWMsIDB4MDgxMzA0N2QpLCBXVENQKDB4N2ZiY2Y5MGYsIDB4MDgyZWNkNWIpLCBXVENQKDB4N2ZiYjJhNzgsIDB4MDg0YWQyNzYpLCBXVENQKDB4N2ZiOTUxYmMsIDB4MDg2NzEzZjcpLAotICBXVENQKDB4N2ZiNzZlYWYsIDB4MDg4MzkyMDYpLCBXVENQKDB4N2ZiNTgxMjYsIDB4MDhhMDRjY2IpLCBXVENQKDB4N2ZiMzg4ZjQsIDB4MDhiZDQ0NmUpLCBXVENQKDB4N2ZiMTg1ZWUsIDB4MDhkYTc5MTUpLAotICBXVENQKDB4N2ZhZjc3ZTUsIDB4MDhmN2VhZTcpLCBXVENQKDB4N2ZhZDVlYWQsIDB4MDkxNTlhMDkpLCBXVENQKDB4N2ZhYjNhMTcsIDB4MDkzMzg2OWYpLCBXVENQKDB4N2ZhOTA5ZjYsIDB4MDk1MWIwY2QpLAotICBXVENQKDB4N2ZhNmNlMWEsIDB4MDk3MDE4YjcpLCBXVENQKDB4N2ZhNDg2NTMsIDB4MDk4ZWJlN2YpLCBXVENQKDB4N2ZhMjMyNzMsIDB4MDlhZGEyNDgpLCBXVENQKDB4N2Y5ZmQyNDksIDB4MDljY2M0MzEpLAotICBXVENQKDB4N2Y5ZDY1YTQsIDB4MDllYzI0NWIpLCBXVENQKDB4N2Y5YWVjNTMsIDB4MGEwYmMyZTcpLCBXVENQKDB4N2Y5ODY2MjUsIDB4MGEyYjlmZjMpLCBXVENQKDB4N2Y5NWQyZTcsIDB4MGE0YmJiOWUpLAotICBXVENQKDB4N2Y5MzMyNjcsIDB4MGE2YzE2MDQpLCBXVENQKDB4N2Y5MDg0NzIsIDB4MGE4Y2FmNDMpLCBXVENQKDB4N2Y4ZGM4ZDUsIDB4MGFhZDg3NzYpLCBXVENQKDB4N2Y4YWZmNWMsIDB4MGFjZTllYjkpLAotICBXVENQKDB4N2Y4ODI3ZDMsIDB4MGFlZmY1MjYpLCBXVENQKDB4N2Y4NTQyMDQsIDB4MGIxMThhZDgpLCBXVENQKDB4N2Y4MjRkYmIsIDB4MGIzMzVmZTYpLCBXVENQKDB4N2Y3ZjRhYzMsIDB4MGI1NTc0NjkpLAotICBXVENQKDB4N2Y3YzM4ZTQsIDB4MGI3N2M4NzkpLCBXVENQKDB4N2Y3OTE3ZTksIDB4MGI5YTVjMmIpLCBXVENQKDB4N2Y3NWU3OWIsIDB4MGJiZDJmOTcpLCBXVENQKDB4N2Y3MmE3YzMsIDB4MGJlMDQyZDApLAotICBXVENQKDB4N2Y2ZjU4MjgsIDB4MGMwMzk1ZWMpLCBXVENQKDB4N2Y2YmY4OTIsIDB4MGMyNzI4ZmQpLCBXVENQKDB4N2Y2ODg4YzksIDB4MGM0YWZjMTYpLCBXVENQKDB4N2Y2NTA4OTQsIDB4MGM2ZjBmNGEpLAotICBXVENQKDB4N2Y2MTc3YjksIDB4MGM5MzYyYTgpLCBXVENQKDB4N2Y1ZGQ1ZmYsIDB4MGNiN2Y2NDIpLCBXVENQKDB4N2Y1YTIzMmEsIDB4MGNkY2NhMjYpLCBXVENQKDB4N2Y1NjVmMDAsIDB4MGQwMWRlNjMpLAotICBXVENQKDB4N2Y1Mjg5NDcsIDB4MGQyNzMzMDcpLCBXVENQKDB4N2Y0ZWExYzIsIDB4MGQ0Y2M4MWYpLCBXVENQKDB4N2Y0YWE4MzUsIDB4MGQ3MjlkYjcpLCBXVENQKDB4N2Y0NjljNjUsIDB4MGQ5OGIzZGEpLAotICBXVENQKDB4N2Y0MjdlMTMsIDB4MGRiZjBhOTIpLCBXVENQKDB4N2YzZTRkMDQsIDB4MGRlNWExZTkpLCBXVENQKDB4N2YzYTA4ZjksIDB4MGUwYzc5ZTcpLCBXVENQKDB4N2YzNWIxYjQsIDB4MGUzMzkyOTUpLAotICBXVENQKDB4N2YzMTQ2ZjgsIDB4MGU1YWViZmEpLCBXVENQKDB4N2YyY2M4ODQsIDB4MGU4Mjg2MWEpLCBXVENQKDB4N2YyODM2MWIsIDB4MGVhYTYwZmQpLCBXVENQKDB4N2YyMzhmN2MsIDB4MGVkMjdjYTUpLAotICBXVENQKDB4N2YxZWQ0NjcsIDB4MGVmYWQ5MTcpLCBXVENQKDB4N2YxYTA0OWQsIDB4MGYyMzc2NTYpLCBXVENQKDB4N2YxNTFmZGMsIDB4MGY0YzU0NjIpLCBXVENQKDB4N2YxMDI1ZTMsIDB4MGY3NTczM2QpLAotICBXVENQKDB4N2YwYjE2NzIsIDB4MGY5ZWQyZTYpLCBXVENQKDB4N2YwNWYxNDYsIDB4MGZjODczNWUpLCBXVENQKDB4N2YwMGI2MWQsIDB4MGZmMjU0YTEpLCBXVENQKDB4N2VmYjY0YjQsIDB4MTAxYzc2YWUpLAotICBXVENQKDB4N2VmNWZjY2EsIDB4MTA0NmQ5ODEpLCBXVENQKDB4N2VmMDdlMTksIDB4MTA3MTdkMTUpLCBXVENQKDB4N2VlYWU4NjAsIDB4MTA5YzYxNjUpLCBXVENQKDB4N2VlNTNiNWIsIDB4MTBjNzg2NmEpLAotICBXVENQKDB4N2VkZjc2YzQsIDB4MTBmMmVjMWUpLCBXVENQKDB4N2VkOTlhNTgsIDB4MTExZTkyNzkpLCBXVENQKDB4N2VkM2E1ZDEsIDB4MTE0YTc5NzEpLCBXVENQKDB4N2VjZDk4ZWIsIDB4MTE3NmEwZmMpLAotICBXVENQKDB4N2VjNzczNjAsIDB4MTFhMzA5MTApLCBXVENQKDB4N2VjMTM0ZWIsIDB4MTFjZmIxYTEpLCBXVENQKDB4N2ViYWRkNDQsIDB4MTFmYzlhYTIpLCBXVENQKDB4N2ViNDZjMjcsIDB4MTIyOWM0MDYpLAotICBXVENQKDB4N2VhZGUxNGMsIDB4MTI1NzJkYmYpLCBXVENQKDB4N2VhNzNjNmMsIDB4MTI4NGQ3YmMpLCBXVENQKDB4N2VhMDdkNDEsIDB4MTJiMmMxZWQpLCBXVENQKDB4N2U5OWEzODIsIDB4MTJlMGVjNDIpLAotICBXVENQKDB4N2U5MmFlZTcsIDB4MTMwZjU2YTgpLCBXVENQKDB4N2U4YjlmMmEsIDB4MTMzZTAxMGIpLCBXVENQKDB4N2U4NDc0MDIsIDB4MTM2Y2ViNTkpLCBXVENQKDB4N2U3ZDJkMjUsIDB4MTM5YzE1N2IpLAotICBXVENQKDB4N2U3NWNhNGMsIDB4MTNjYjdmNWQpLCBXVENQKDB4N2U2ZTRiMmQsIDB4MTNmYjI4ZTYpLCBXVENQKDB4N2U2NmFmN2YsIDB4MTQyYjEyMDApLCBXVENQKDB4N2U1ZWY2ZjgsIDB4MTQ1YjNhOTIpLAotICBXVENQKDB4N2U1NzIxNTAsIDB4MTQ4YmEyODEpLCBXVENQKDB4N2U0ZjJlM2IsIDB4MTRiYzQ5YjQpLCBXVENQKDB4N2U0NzFkNzAsIDB4MTRlZDMwMGYpLCBXVENQKDB4N2UzZWVlYTUsIDB4MTUxZTU1NzUpLAotICBXVENQKDB4N2UzNmExOGUsIDB4MTU0ZmI5YzkpLCBXVENQKDB4N2UyZTM1ZTIsIDB4MTU4MTVjZWQpLCBXVENQKDB4N2UyNWFiNTYsIDB4MTViMzNlYzEpLCBXVENQKDB4N2UxZDAxOWUsIDB4MTVlNTVmMjUpLAotICBXVENQKDB4N2UxNDM4NmUsIDB4MTYxN2JkZjkpLCBXVENQKDB4N2UwYjRmN2QsIDB4MTY0YTViMTkpLCBXVENQKDB4N2UwMjQ2N2UsIDB4MTY3ZDM2NjIpLCBXVENQKDB4N2RmOTFkMjUsIDB4MTZiMDRmYjIpLAotICBXVENQKDB4N2RlZmQzMjcsIDB4MTZlM2E2ZTIpLCBXVENQKDB4N2RlNjY4MzcsIDB4MTcxNzNiY2UpLCBXVENQKDB4N2RkY2RjMGEsIDB4MTc0YjBlNGQpLCBXVENQKDB4N2RkMzJlNTMsIDB4MTc3ZjFlMzkpLAotICBXVENQKDB4N2RjOTVlYzYsIDB4MTdiMzZiNjkpLCBXVENQKDB4N2RiZjZkMTcsIDB4MTdlN2Y1YjMpLCBXVENQKDB4N2RiNTU4ZjksIDB4MTgxY2JjZWMpLCBXVENQKDB4N2RhYjIyMWYsIDB4MTg1MWMwZTkpLAotICBXVENQKDB4N2RhMGM4M2MsIDB4MTg4NzAxN2QpLCBXVENQKDB4N2Q5NjRiMDUsIDB4MThiYzdlN2MpLCBXVENQKDB4N2Q4YmFhMmIsIDB4MThmMjM3YjYpLCBXVENQKDB4N2Q4MGU1NjMsIDB4MTkyODJjZmQpLAotICBXVENQKDB4N2Q3NWZjNWUsIDB4MTk1ZTVlMjApLCBXVENQKDB4N2Q2YWVlZDAsIDB4MTk5NGNhZWUpLCBXVENQKDB4N2Q1ZmJjNmQsIDB4MTljYjczMzUpLCBXVENQKDB4N2Q1NDY0ZTYsIDB4MWEwMjU2YzIpLAotICBXVENQKDB4N2Q0OGU3ZWYsIDB4MWEzOTc1NjEpLCBXVENQKDB4N2QzZDQ1M2IsIDB4MWE3MGNlZGUpLCBXVENQKDB4N2QzMTdjN2MsIDB4MWFhODYzMDEpLCBXVENQKDB4N2QyNThkNjUsIDB4MWFlMDMxOTUpLAotICBXVENQKDB4N2QxOTc3YWEsIDB4MWIxODNhNjMpLCBXVENQKDB4N2QwZDNhZmMsIDB4MWI1MDdkMzApLCBXVENQKDB4N2QwMGQ3MTAsIDB4MWI4OGY5YzUpLCBXVENQKDB4N2NmNDRiOTcsIDB4MWJjMWFmZTYpLAotICBXVENQKDB4N2NlNzk4NDYsIDB4MWJmYTlmNTgpLCBXVENQKDB4N2NkYWJjY2UsIDB4MWMzM2M3ZTApLCBXVENQKDB4N2NjZGI4ZTQsIDB4MWM2ZDI5M2YpLCBXVENQKDB4N2NjMDhjMzksIDB4MWNhNmMzMzcpLAotICBXVENQKDB4N2NiMzM2ODIsIDB4MWNlMDk1OGEpLCBXVENQKDB4N2NhNWI3NzIsIDB4MWQxYTlmZjgpLCBXVENQKDB4N2M5ODBlYmQsIDB4MWQ1NGUyNDApLCBXVENQKDB4N2M4YTNjMTQsIDB4MWQ4ZjVjMjEpLAotICBXVENQKDB4N2M3YzNmMmUsIDB4MWRjYTBkNTYpLCBXVENQKDB4N2M2ZTE3YmMsIDB4MWUwNGY1OWYpLCBXVENQKDB4N2M1ZmM1NzMsIDB4MWU0MDE0YjQpLCBXVENQKDB4N2M1MTQ4MDcsIDB4MWU3YjZhNTMpLAotICBXVENQKDB4N2M0MjlmMmMsIDB4MWViNmY2MzMpLCBXVENQKDB4N2MzM2NhOTYsIDB4MWVmMmI4MGYpLCBXVENQKDB4N2MyNGM5ZmEsIDB4MWYyZWFmOWUpLCBXVENQKDB4N2MxNTlkMGQsIDB4MWY2YWRjOTgpLAotICBXVENQKDB4N2MwNjQzODMsIDB4MWZhNzNlYjIpLCBXVENQKDB4N2JmNmJkMTEsIDB4MWZlM2Q1YTMpLCBXVENQKDB4N2JlNzA5NmMsIDB4MjAyMGExMWUpLCBXVENQKDB4N2JkNzI4NGEsIDB4MjA1ZGEwZDgpLAotICBXVENQKDB4N2JjNzE5NjAsIDB4MjA5YWQ0ODMpLCBXVENQKDB4N2JiNmRjNjUsIDB4MjBkODNiZDEpLCBXVENQKDB4N2JhNjcxMGQsIDB4MjExNWQ2NzQpLCBXVENQKDB4N2I5NWQ3MTAsIDB4MjE1M2E0MWIpLAotICBXVENQKDB4N2I4NTBlMjQsIDB4MjE5MWE0NzYpLCBXVENQKDB4N2I3NDE1ZmYsIDB4MjFjZmQ3MzQpLCBXVENQKDB4N2I2MmVlNTksIDB4MjIwZTNjMDIpLCBXVENQKDB4N2I1MTk2ZTksIDB4MjI0Y2QyOGQpLAotICBXVENQKDB4N2I0MDBmNjcsIDB4MjI4YjlhODIpLCBXVENQKDB4N2IyZTU3OGEsIDB4MjJjYTkzOGEpLCBXVENQKDB4N2IxYzZmMGIsIDB4MjMwOWJkNTIpLCBXVENQKDB4N2IwYTU1YTEsIDB4MjM0OTE3ODMpLAotICBXVENQKDB4N2FmODBiMDcsIDB4MjM4OGExYzQpLCBXVENQKDB4N2FlNThlZjUsIDB4MjNjODViYmYpLCBXVENQKDB4N2FkMmUxMjQsIDB4MjQwODQ1MWEpLCBXVENQKDB4N2FjMDAxNGUsIDB4MjQ0ODVkN2MpLAotICBXVENQKDB4N2FhY2VmMmUsIDB4MjQ4OGE0OGEpLCBXVENQKDB4N2E5OWFhN2UsIDB4MjRjOTE5ZTkpLCBXVENQKDB4N2E4NjMyZjgsIDB4MjUwOWJkM2QpLCBXVENQKDB4N2E3Mjg4NTgsIDB4MjU0YThlMjkpLAotICBXVENQKDB4N2E1ZWFhNWEsIDB4MjU4YjhjNTApLCBXVENQKDB4N2E0YTk4YjksIDB4MjVjY2I3NTMpLCBXVENQKDB4N2EzNjUzMzMsIDB4MjYwZTBlZDMpLCBXVENQKDB4N2EyMWQ5ODMsIDB4MjY0ZjkyNzEpLAotICBXVENQKDB4N2EwZDJiNjgsIDB4MjY5MTQxY2IpLCBXVENQKDB4NzlmODQ4OWUsIDB4MjZkMzFjODApLCBXVENQKDB4NzllMzMwZTQsIDB4MjcxNTIyMmYpLCBXVENQKDB4NzljZGUzZjgsIDB4Mjc1NzUyNzMpLAotICBXVENQKDB4NzliODYxOWEsIDB4Mjc5OWFjZWEpLCBXVENQKDB4NzlhMmE5ODksIDB4MjdkYzMxMzApLCBXVENQKDB4Nzk4Y2JiODUsIDB4MjgxZWRlZGYpLCBXVENQKDB4Nzk3Njk3NGUsIDB4Mjg2MWI1OTEpLAotICBXVENQKDB4Nzk2MDNjYTUsIDB4MjhhNGI0ZTApLCBXVENQKDB4Nzk0OWFiNGMsIDB4MjhlN2RjNjUpLCBXVENQKDB4NzkzMmUzMDQsIDB4MjkyYjJiYjgpLCBXVENQKDB4NzkxYmUzOTAsIDB4Mjk2ZWEyNzApLAotICBXVENQKDB4NzkwNGFjYjMsIDB4MjliMjQwMjQpLCBXVENQKDB4NzhlZDNlMzAsIDB4MjlmNjA0NmIpLCBXVENQKDB4NzhkNTk3Y2MsIDB4MmEzOWVlZDgpLCBXVENQKDB4NzhiZGI5NGEsIDB4MmE3ZGZmMDIpLAotICBXVENQKDB4NzhhNWEyNzAsIDB4MmFjMjM0N2MpLCBXVENQKDB4Nzg4ZDUzMDQsIDB4MmIwNjhlZGEpLCBXVENQKDB4Nzg3NGNhY2IsIDB4MmI0YjBkYWUpLCBXVENQKDB4Nzg1YzA5OGQsIDB4MmI4ZmIwOGEpLAotICBXVENQKDB4Nzg0MzBmMTEsIDB4MmJkNDc3MDApLCBXVENQKDB4NzgyOWRiMWYsIDB4MmMxOTYwYTEpLCBXVENQKDB4NzgxMDZkN2YsIDB4MmM1ZTZjZmQpLCBXVENQKDB4NzdmNmM1ZmIsIDB4MmNhMzliYTMpLAotICBXVENQKDB4NzdkY2U0NWMsIDB4MmNlOGVjMjMpLCBXVENQKDB4NzdjMmM4NmUsIDB4MmQyZTVlMGIpLCBXVENQKDB4NzdhODcxZmEsIDB4MmQ3M2YwZTgpLCBXVENQKDB4Nzc4ZGUwY2QsIDB4MmRiOWE0NDkpLAotICBXVENQKDB4Nzc3MzE0YjIsIDB4MmRmZjc3YjgpLCBXVENQKDB4Nzc1ODBkNzgsIDB4MmU0NTZhYzQpLCBXVENQKDB4NzczY2NhZWIsIDB4MmU4YjdjZjYpLCBXVENQKDB4NzcyMTRjZGIsIDB4MmVkMWFkZGIpLAotICBXVENQKDB4NzcwNTkzMTUsIDB4MmYxN2ZjZmIpLCBXVENQKDB4NzZlOTlkNjksIDB4MmY1ZTY5ZTIpLCBXVENQKDB4NzZjZDZiYTksIDB4MmZhNGY0MTkpLCBXVENQKDB4NzZiMGZkYTQsIDB4MmZlYjliMjcpLAotICBXVENQKDB4NzY5NDUzMmUsIDB4MzAzMjVlOTYpLCBXVENQKDB4NzY3NzZjMTcsIDB4MzA3OTNkZWUpLCBXVENQKDB4NzY1YTQ4MzQsIDB4MzBjMDM4YjUpLCBXVENQKDB4NzYzY2U3NTksIDB4MzEwNzRlNzIpLAotICBXVENQKDB4NzYxZjQ5NTksIDB4MzE0ZTdlYWIpLCBXVENQKDB4NzYwMTZlMGIsIDB4MzE5NWM4ZTYpLCBXVENQKDB4NzVlMzU1NDUsIDB4MzFkZDJjYTkpLCBXVENQKDB4NzVjNGZlZGMsIDB4MzIyNGE5NzkpLAotICBXVENQKDB4NzVhNjZhYWIsIDB4MzI2YzNlZDgpLCBXVENQKDB4NzU4Nzk4ODcsIDB4MzJiM2VjNGQpLCBXVENQKDB4NzU2ODg4NGIsIDB4MzJmYmIxNTkpLCBXVENQKDB4NzU0OTM5ZDEsIDB4MzM0MzhkODEpLAotICBXVENQKDB4NzUyOWFjZjQsIDB4MzM4YjgwNDUpLCBXVENQKDB4NzUwOWUxOGUsIDB4MzNkMzg5MmEpLCBXVENQKDB4NzRlOWQ3N2QsIDB4MzQxYmE3YjEpLCBXVENQKDB4NzRjOThlOWUsIDB4MzQ2M2RiNWEpLAotICBXVENQKDB4NzRhOTA2Y2QsIDB4MzRhYzIzYTcpLCBXVENQKDB4NzQ4ODNmZWMsIDB4MzRmNDgwMTkpLCBXVENQKDB4NzQ2NzM5ZDgsIDB4MzUzY2YwMmYpLCBXVENQKDB4NzQ0NWY0NzIsIDB4MzU4NTczNmEpLAotICBXVENQKDB4NzQyNDZmOWMsIDB4MzVjZTA5NDkpLCBXVENQKDB4NzQwMmFiMzcsIDB4MzYxNmIxNGMpLCBXVENQKDB4NzNlMGE3MjcsIDB4MzY1ZjZhZjApLCBXVENQKDB4NzNiZTYzNTAsIDB4MzZhODM1YjUpLAotICBXVENQKDB4NzM5YmRmOTUsIDB4MzZmMTExMTgpLCBXVENQKDB4NzM3OTFiZGQsIDB4MzczOWZjOTgpLCBXVENQKDB4NzM1NjE4MGUsIDB4Mzc4MmY3YjIpLCBXVENQKDB4NzMzMmQ0MTAsIDB4MzdjYzAxZTMpLAotICBXVENQKDB4NzMwZjRmYzksIDB4MzgxNTFhYTgpLCBXVENQKDB4NzJlYjhiMjQsIDB4Mzg1ZTQxN2UpLCBXVENQKDB4NzJjNzg2MGEsIDB4MzhhNzc1ZTEpLCBXVENQKDB4NzJhMzQwNjYsIDB4MzhmMGI3NGQpLAotICBXVENQKDB4NzI3ZWJhMjQsIDB4MzkzYTA1M2UpLCBXVENQKDB4NzI1OWYzMzEsIDB4Mzk4MzVmMzApLCBXVENQKDB4NzIzNGViNzksIDB4MzljY2M0OWUpLCBXVENQKDB4NzIwZmEyZWIsIDB4M2ExNjM1MDMpLAotICBXVENQKDB4NzFlYTE5NzcsIDB4M2E1ZmFmZGEpLCBXVENQKDB4NzFjNDRmMGMsIDB4M2FhOTM0OWUpLCBXVENQKDB4NzE5ZTQzOWQsIDB4M2FmMmMyY2EpLCBXVENQKDB4NzE3N2Y3MWEsIDB4M2IzYzU5ZDcpLAotICBXVENQKDB4NzE1MTY5NzgsIDB4M2I4NWY5NDApLCBXVENQKDB4NzEyYTlhYWEsIDB4M2JjZmEwN2UpLCBXVENQKDB4NzEwMzhhYTQsIDB4M2MxOTRmMGQpLCBXVENQKDB4NzBkYzM5NWUsIDB4M2M2MzA0NjQpLAotICBXVENQKDB4NzBiNGE2Y2QsIDB4M2NhY2JmZmYpLCBXVENQKDB4NzA4Y2QyZTksIDB4M2NmNjgxNTUpLCBXVENQKDB4NzA2NGJkYWIsIDB4M2Q0MDQ3ZTEpLCBXVENQKDB4NzAzYzY3MGQsIDB4M2Q4YTEzMWMpLAotICBXVENQKDB4NzAxM2NmMGEsIDB4M2RkM2UyN2UpLCBXVENQKDB4NmZlYWY1OWMsIDB4M2UxZGI1ODApLCBXVENQKDB4NmZjMWRhYzEsIDB4M2U2NzhiOWIpLCBXVENQKDB4NmY5ODdlNzYsIDB4M2ViMTY0NDkpLAotICBXVENQKDB4NmY2ZWUwYjksIDB4M2VmYjNmMDEpLCBXVENQKDB4NmY0NTAxOGIsIDB4M2Y0NTFiM2QpLCBXVENQKDB4NmYxYWUwZWIsIDB4M2Y4ZWY4NzQpLCBXVENQKDB4NmVmMDdlZGIsIDB4M2ZkOGQ2MjApLAotICBXVENQKDB4NmVjNWRiNWQsIDB4NDAyMmIzYjkpLCBXVENQKDB4NmU5YWY2NzUsIDB4NDA2YzkwYjcpLCBXVENQKDB4NmU2ZmQwMjcsIDB4NDBiNjZjOTMpLCBXVENQKDB4NmU0NDY4NzksIDB4NDEwMDQ2YzUpLAotICBXVENQKDB4NmUxOGJmNzEsIDB4NDE0YTFlYzYpLCBXVENQKDB4NmRlY2Q1MTcsIDB4NDE5M2Y0MGQpLCBXVENQKDB4NmRjMGE5NzIsIDB4NDFkZGM2MTUpLCBXVENQKDB4NmQ5NDNjOGQsIDB4NDIyNzk0NTUpLAotICBXVENQKDB4NmQ2NzhlNzEsIDB4NDI3MTVlNDUpLCBXVENQKDB4NmQzYTlmMmEsIDB4NDJiYjIzNWYpLCBXVENQKDB4NmQwZDZlYzUsIDB4NDMwNGUzMWEpLCBXVENQKDB4NmNkZmZkNGYsIDB4NDM0ZTljZjEpLAotICBXVENQKDB4NmNiMjRhZDYsIDB4NDM5ODUwNWIpLCBXVENQKDB4NmM4NDU3NmIsIDB4NDNlMWZjZDEpLCBXVENQKDB4NmM1NjIzMWMsIDB4NDQyYmExY2QpLCBXVENQKDB4NmMyN2FkZmQsIDB4NDQ3NTNlYzcpLAotICBXVENQKDB4NmJmOGY4MWUsIDB4NDRiZWQzM2EpLCBXVENQKDB4NmJjYTAxOTUsIDB4NDUwODVlOWQpLCBXVENQKDB4NmI5YWNhNzUsIDB4NDU1MWUwNmIpLCBXVENQKDB4NmI2YjUyZDUsIDB4NDU5YjU4MWUpLAotICBXVENQKDB4NmIzYjlhYzksIDB4NDVlNGM1MmYpLCBXVENQKDB4NmIwYmEyNmIsIDB4NDYyZTI3MTcpLCBXVENQKDB4NmFkYjY5ZDMsIDB4NDY3NzdkNTIpLCBXVENQKDB4NmFhYWYxMWIsIDB4NDZjMGM3NWEpLAotICBXVENQKDB4NmE3YTM4NWMsIDB4NDcwYTA0YTkpLCBXVENQKDB4NmE0OTNmYjMsIDB4NDc1MzM0YjkpLCBXVENQKDB4NmExODA3M2QsIDB4NDc5YzU3MDcpLCBXVENQKDB4NjllNjhmMTcsIDB4NDdlNTZiMGMpLAotICBXVENQKDB4NjliNGQ3NjEsIDB4NDgyZTcwNDUpLCBXVENQKDB4Njk4MmUwMzksIDB4NDg3NzY2MmMpLCBXVENQKDB4Njk1MGE5YzAsIDB4NDhjMDRjM2YpLCBXVENQKDB4NjkxZTM0MWEsIDB4NDkwOTIxZjgpLAotICBXVENQKDB4NjhlYjdmNjcsIDB4NDk1MWU2ZDUpLCBXVENQKDB4NjhiODhiY2QsIDB4NDk5YTlhNTEpLCBXVENQKDB4Njg4NTU5NzAsIDB4NDllMzNiZWIpLCBXVENQKDB4Njg1MWU4NzUsIDB4NGEyYmNiMWYpLAotICBXVENQKDB4NjgxZTM5MDUsIDB4NGE3NDQ3NmIpLCBXVENQKDB4NjdlYTRiNDcsIDB4NGFiY2IwNGMpLCBXVENQKDB4NjdiNjFmNjMsIDB4NGIwNTA1NDEpLCBXVENQKDB4Njc4MWI1ODUsIDB4NGI0ZDQ1YzkpLAotICBXVENQKDB4Njc0ZDBkZDYsIDB4NGI5NTcxNjIpLCBXVENQKDB4NjcxODI4ODMsIDB4NGJkZDg3OGMpLCBXVENQKDB4NjZlMzA1YjgsIDB4NGMyNTg3YzYpLCBXVENQKDB4NjZhZGE1YTUsIDB4NGM2ZDcxOTApLAotICBXVENQKDB4NjY3ODA4NzgsIDB4NGNiNTQ0NmEpLCBXVENQKDB4NjY0MjJlNjAsIDB4NGNmY2ZmZDUpLCBXVENQKDB4NjYwYzE3OTAsIDB4NGQ0NGEzNTMpLCBXVENQKDB4NjVkNWM0MzksIDB4NGQ4YzJlNjQpLAotICBXVENQKDB4NjU5ZjM0OGUsIDB4NGRkM2EwOGMpLCBXVENQKDB4NjU2ODY4YzMsIDB4NGUxYWY5NGIpLCBXVENQKDB4NjUzMTYxMGQsIDB4NGU2MjM4MjUpLCBXVENQKDB4NjRmYTFkYTMsIDB4NGVhOTVjOWQpLAotICBXVENQKDB4NjRjMjllYmIsIDB4NGVmMDY2MzcpLCBXVENQKDB4NjQ4YWU0OGQsIDB4NGYzNzU0NzcpLCBXVENQKDB4NjQ1MmVmNTMsIDB4NGY3ZTI2ZTEpLCBXVENQKDB4NjQxYWJmNDYsIDB4NGZjNGRjZmIpLAotICBXVENQKDB4NjNlMjU0YTIsIDB4NTAwYjc2NDkpLCBXVENQKDB4NjNhOWFmYTIsIDB4NTA1MWYyNTMpLCBXVENQKDB4NjM3MGQwODMsIDB4NTA5ODUwOWYpLCBXVENQKDB4NjMzN2I3ODQsIDB4NTBkZTkwYjMpLAotICBXVENQKDB4NjJmZTY0ZTMsIDB4NTEyNGIyMTgpLCBXVENQKDB4NjJjNGQ4ZTAsIDB4NTE2YWI0NTUpLCBXVENQKDB4NjI4YjEzYmMsIDB4NTFiMDk2ZjMpLCBXVENQKDB4NjI1MTE1YjgsIDB4NTFmNjU5N2IpLAotICBXVENQKDB4NjIxNmRmMTgsIDB4NTIzYmZiNzgpLCBXVENQKDB4NjFkYzcwMWYsIDB4NTI4MTdjNzIpLCBXVENQKDB4NjFhMWM5MTIsIDB4NTJjNmRiZjUpLCBXVENQKDB4NjE2NmVhMzYsIDB4NTMwYzE5OGQpLAotICBXVENQKDB4NjEyYmQzZDIsIDB4NTM1MTM0YzUpLCBXVENQKDB4NjBmMDg2MmQsIDB4NTM5NjJkMmEpLCBXVENQKDB4NjBiNTAxOTAsIDB4NTNkYjAyNGEpLCBXVENQKDB4NjA3OTQ2NDQsIDB4NTQxZmIzYjEpLAotICBXVENQKDB4NjAzZDU0OTQsIDB4NTQ2NDQwZWYpLCBXVENQKDB4NjAwMTJjY2EsIDB4NTRhOGE5OTIpLCBXVENQKDB4NWZjNGNmMzMsIDB4NTRlY2VkMmIpLCBXVENQKDB4NWY4ODNjMWMsIDB4NTUzMTBiNDgpLAotICBXVENQKDB4NWY0YjczZDIsIDB4NTU3NTAzN2MpLCBXVENQKDB4NWYwZTc2YTUsIDB4NTViOGQ1NTgpLCBXVENQKDB4NWVkMTQ0ZTUsIDB4NTVmYzgwNmYpLCBXVENQKDB4NWU5M2RlZTEsIDB4NTY0MDA0NTIpLAotICBXVENQKDB4NWU1NjQ0ZWMsIDB4NTY4MzYwOTYpLCBXVENQKDB4NWUxODc3NTcsIDB4NTZjNjk0Y2YpLCBXVENQKDB4NWRkYTc2NzcsIDB4NTcwOWEwOTIpLCBXVENQKDB4NWQ5YzQyOWYsIDB4NTc0YzgzNzQpLAotICBXVENQKDB4NWQ1ZGRjMjQsIDB4NTc4ZjNkMGQpLCBXVENQKDB4NWQxZjQzNWQsIDB4NTdkMWNjZjIpLCBXVENQKDB4NWNlMDc4YTAsIDB4NTgxNDMyYmQpLCBXVENQKDB4NWNhMTdjNDUsIDB4NTg1NjZlMDQpLAotICBXVENQKDB4NWM2MjRlYTQsIDB4NTg5ODdlNjMpLCBXVENQKDB4NWMyMmYwMTYsIDB4NThkYTYzNzIpLCBXVENQKDB4NWJlMzYwZjYsIDB4NTkxYzFjY2MpLCBXVENQKDB4NWJhM2ExOWYsIDB4NTk1ZGFhMGQpLAotICBXVENQKDB4NWI2M2IyNmMsIDB4NTk5ZjBhZDEpLCBXVENQKDB4NWIyMzkzYmEsIDB4NTllMDNlYjYpLCBXVENQKDB4NWFlMzQ1ZTcsIDB4NWEyMTQ1NTgpLCBXVENQKDB4NWFhMmM5NTEsIDB4NWE2MjFlNTYpLAorY29uc3QgRklYUF9TVFAgU2luZVRhYmxlNDgwW10gPSB7CisgICAgU1RDUCgweDdmZmZmZmZmLCAweDAwMDAwMDAwKSwgU1RDUCgweDdmZmZkMzE1LCAweDAwNmIzYjliKSwKKyAgICBTVENQKDB4N2ZmZjRjNTQsIDB4MDBkNjc2ZWIpLCBTVENQKDB4N2ZmZTZiYmYsIDB4MDE0MWIxYTUpLAorICAgIFNUQ1AoMHg3ZmZkMzE1NCwgMHgwMWFjZWI3YyksIFNUQ1AoMHg3ZmZiOWQxNSwgMHgwMjE4MjQyNyksCisgICAgU1RDUCgweDdmZjlhZjA0LCAweDAyODM1YjVhKSwgU1RDUCgweDdmZjc2NzIxLCAweDAyZWU5MGM4KSwKKyAgICBTVENQKDB4N2ZmNGM1NmYsIDB4MDM1OWM0MjgpLCBTVENQKDB4N2ZmMWM5ZWYsIDB4MDNjNGY1MmYpLAorICAgIFNUQ1AoMHg3ZmVlNzRhMiwgMHgwNDMwMjM4ZiksIFNUQ1AoMHg3ZmVhYzU4ZCwgMHgwNDliNGYwMCksCisgICAgU1RDUCgweDdmZTZiY2IwLCAweDA1MDY3NzM0KSwgU1RDUCgweDdmZTI1YTBmLCAweDA1NzE5YmUyKSwKKyAgICBTVENQKDB4N2ZkZDlkYWQsIDB4MDVkY2JjYmUpLCBTVENQKDB4N2ZkODg3OGUsIDB4MDY0N2Q5N2MpLAorICAgIFNUQ1AoMHg3ZmQzMTdiNCwgMHgwNmIyZjFkMiksIFNUQ1AoMHg3ZmNkNGUyNCwgMHgwNzFlMDU3NSksCisgICAgU1RDUCgweDdmYzcyYWUyLCAweDA3ODkxNDE4KSwgU1RDUCgweDdmYzBhZGYyLCAweDA3ZjQxZDcyKSwKKyAgICBTVENQKDB4N2ZiOWQ3NTksIDB4MDg1ZjIxMzcpLCBTVENQKDB4N2ZiMmE3MWIsIDB4MDhjYTFmMWIpLAorICAgIFNUQ1AoMHg3ZmFiMWQzZCwgMHgwOTM1MTZkNCksIFNUQ1AoMHg3ZmEzMzljNSwgMHgwOWEwMDgxNyksCisgICAgU1RDUCgweDdmOWFmY2I5LCAweDBhMGFmMjk5KSwgU1RDUCgweDdmOTI2NjFkLCAweDBhNzVkNjBlKSwKKyAgICBTVENQKDB4N2Y4OTc1ZjksIDB4MGFlMGIyMmMpLCBTVENQKDB4N2Y4MDJjNTIsIDB4MGI0Yjg2YTgpLAorICAgIFNUQ1AoMHg3Zjc2ODkyZiwgMHgwYmI2NTMzNiksIFNUQ1AoMHg3ZjZjOGM5NiwgMHgwYzIxMTc4YyksCisgICAgU1RDUCgweDdmNjIzNjhmLCAweDBjOGJkMzVlKSwgU1RDUCgweDdmNTc4NzIxLCAweDBjZjY4NjYyKSwKKyAgICBTVENQKDB4N2Y0YzdlNTQsIDB4MGQ2MTMwNGUpLCBTVENQKDB4N2Y0MTFjMmYsIDB4MGRjYmQwZDUpLAorICAgIFNUQ1AoMHg3ZjM1NjBiOSwgMHgwZTM2NjdhZCksIFNUQ1AoMHg3ZjI5NGJmZCwgMHgwZWEwZjQ4YyksCisgICAgU1RDUCgweDdmMWNkZTAxLCAweDBmMGI3NzI3KSwgU1RDUCgweDdmMTAxNmNlLCAweDBmNzVlZjMzKSwKKyAgICBTVENQKDB4N2YwMmY2NmYsIDB4MGZlMDVjNjQpLCBTVENQKDB4N2VmNTdjZWEsIDB4MTA0YWJlNzEpLAorICAgIFNUQ1AoMHg3ZWU3YWE0YywgMHgxMGI1MTUwZiksIFNUQ1AoMHg3ZWQ5N2U5YywgMHgxMTFmNWZmNCksCisgICAgU1RDUCgweDdlY2FmOWU1LCAweDExODk5ZWQzKSwgU1RDUCgweDdlYmMxYzMxLCAweDExZjNkMTY0KSwKKyAgICBTVENQKDB4N2VhY2U1OGEsIDB4MTI1ZGY3NWIpLCBTVENQKDB4N2U5ZDU1ZmMsIDB4MTJjODEwNmYpLAorICAgIFNUQ1AoMHg3ZThkNmQ5MSwgMHgxMzMyMWM1MyksIFNUQ1AoMHg3ZTdkMmM1NCwgMHgxMzljMWFiZiksCisgICAgU1RDUCgweDdlNmM5MjUxLCAweDE0MDYwYjY4KSwgU1RDUCgweDdlNWI5ZjkzLCAweDE0NmZlZTAzKSwKKyAgICBTVENQKDB4N2U0YTU0MjYsIDB4MTRkOWMyNDUpLCBTVENQKDB4N2UzOGIwMTcsIDB4MTU0Mzg3ZTYpLAorICAgIFNUQ1AoMHg3ZTI2YjM3MSwgMHgxNWFkM2U5YSksIFNUQ1AoMHg3ZTE0NWU0MiwgMHgxNjE2ZTYxOCksCisgICAgU1RDUCgweDdlMDFiMDk2LCAweDE2ODA3ZTE1KSwgU1RDUCgweDdkZWVhYTdhLCAweDE2ZWEwNjQ2KSwKKyAgICBTVENQKDB4N2RkYjRiZmMsIDB4MTc1MzdlNjMpLCBTVENQKDB4N2RjNzk1MjksIDB4MTdiY2U2MjEpLAorICAgIFNUQ1AoMHg3ZGIzODYwZiwgMHgxODI2M2QzNiksIFNUQ1AoMHg3ZDlmMWViZCwgMHgxODhmODM1NyksCisgICAgU1RDUCgweDdkOGE1ZjQwLCAweDE4ZjhiODNjKSwgU1RDUCgweDdkNzU0N2E3LCAweDE5NjFkYjliKSwKKyAgICBTVENQKDB4N2Q1ZmQ4MDEsIDB4MTljYWVkMjkpLCBTVENQKDB4N2Q0YTEwNWQsIDB4MWEzM2VjOWMpLAorICAgIFNUQ1AoMHg3ZDMzZjBjYSwgMHgxYTljZDlhYyksIFNUQ1AoMHg3ZDFkNzk1OCwgMHgxYjA1YjQwZiksCisgICAgU1RDUCgweDdkMDZhYTE2LCAweDFiNmU3YjdhKSwgU1RDUCgweDdjZWY4MzE1LCAweDFiZDcyZmE0KSwKKyAgICBTVENQKDB4N2NkODA0NjQsIDB4MWMzZmQwNDUpLCBTVENQKDB4N2NjMDJlMTUsIDB4MWNhODVkMTIpLAorICAgIFNUQ1AoMHg3Y2E4MDAzOCwgMHgxZDEwZDVjMiksIFNUQ1AoMHg3YzhmN2FkZSwgMHgxZDc5M2EwYiksCisgICAgU1RDUCgweDdjNzY5ZTE4LCAweDFkZTE4OWE2KSwgU1RDUCgweDdjNWQ2OWY3LCAweDFlNDljNDQ3KSwKKyAgICBTVENQKDB4N2M0M2RlOGUsIDB4MWViMWU5YTcpLCBTVENQKDB4N2MyOWZiZWUsIDB4MWYxOWY5N2IpLAorICAgIFNUQ1AoMHg3YzBmYzIyYSwgMHgxZjgxZjM3YyksIFNUQ1AoMHg3YmY1MzE1MywgMHgxZmU5ZDc1ZiksCisgICAgU1RDUCgweDdiZGE0OTdkLCAweDIwNTFhNGRkKSwgU1RDUCgweDdiYmYwYWJhLCAweDIwYjk1YmFjKSwKKyAgICBTVENQKDB4N2JhMzc1MWQsIDB4MjEyMGZiODMpLCBTVENQKDB4N2I4Nzg4YmEsIDB4MjE4ODg0MWEpLAorICAgIFNUQ1AoMHg3YjZiNDVhNSwgMHgyMWVmZjUyOCksIFNUQ1AoMHg3YjRlYWJmMSwgMHgyMjU3NGU2NSksCisgICAgU1RDUCgweDdiMzFiYmIyLCAweDIyYmU4Zjg3KSwgU1RDUCgweDdiMTQ3NGZkLCAweDIzMjViODQ3KSwKKyAgICBTVENQKDB4N2FmNmQ3ZTYsIDB4MjM4Y2M4NWQpLCBTVENQKDB4N2FkOGU0ODIsIDB4MjNmM2JmN2UpLAorICAgIFNUQ1AoMHg3YWJhOWFlNiwgMHgyNDVhOWQ2NSksIFNUQ1AoMHg3YTliZmIyNywgMHgyNGMxNjFjNyksCisgICAgU1RDUCgweDdhN2QwNTViLCAweDI1MjgwYzVlKSwgU1RDUCgweDdhNWRiOTk3LCAweDI1OGU5Y2UwKSwKKyAgICBTVENQKDB4N2EzZTE3ZjIsIDB4MjVmNTEzMDcpLCBTVENQKDB4N2ExZTIwODIsIDB4MjY1YjZlOGEpLAorICAgIFNUQ1AoMHg3OWZkZDM1YywgMHgyNmMxYWYyMiksIFNUQ1AoMHg3OWRkMzA5OCwgMHgyNzI3ZDQ4NiksCisgICAgU1RDUCgweDc5YmMzODRkLCAweDI3OGRkZTZlKSwgU1RDUCgweDc5OWFlYTkyLCAweDI3ZjNjYzk0KSwKKyAgICBTVENQKDB4Nzk3OTQ3N2QsIDB4Mjg1OTllYjApLCBTVENQKDB4Nzk1NzRmMjgsIDB4MjhiZjU0N2IpLAorICAgIFNUQ1AoMHg3OTM1MDFhOSwgMHgyOTI0ZWRhYyksIFNUQ1AoMHg3OTEyNWYxOSwgMHgyOThhNjlmYyksCisgICAgU1RDUCgweDc4ZWY2NzhmLCAweDI5ZWZjOTI1KSwgU1RDUCgweDc4Y2MxYjI2LCAweDJhNTUwYWRmKSwKKyAgICBTVENQKDB4NzhhODc5ZjQsIDB4MmFiYTJlZTQpLCBTVENQKDB4Nzg4NDg0MTQsIDB4MmIxZjM0ZWIpLAorICAgIFNUQ1AoMHg3ODYwMzk5ZSwgMHgyYjg0MWNhZiksIFNUQ1AoMHg3ODNiOWFhZCwgMHgyYmU4ZTVlOCksCisgICAgU1RDUCgweDc4MTZhNzU5LCAweDJjNGQ5MDUwKSwgU1RDUCgweDc3ZjE1ZmJjLCAweDJjYjIxYmEwKSwKKyAgICBTVENQKDB4NzdjYmMzZjIsIDB4MmQxNjg3OTIpLCBTVENQKDB4NzdhNWQ0MTMsIDB4MmQ3YWQzZGUpLAorICAgIFNUQ1AoMHg3NzdmOTAzYywgMHgyZGRmMDA0MCksIFNUQ1AoMHg3NzU4Zjg4NiwgMHgyZTQzMGM2ZiksCisgICAgU1RDUCgweDc3MzIwZDBkLCAweDJlYTZmODI3KSwgU1RDUCgweDc3MGFjZGVjLCAweDJmMGFjMzIwKSwKKyAgICBTVENQKDB4NzZlMzNiM2YsIDB4MmY2ZTZkMTYpLCBTVENQKDB4NzZiYjU1MjEsIDB4MmZkMWY1YzEpLAorICAgIFNUQ1AoMHg3NjkzMWJhZSwgMHgzMDM1NWNkZCksIFNUQ1AoMHg3NjZhOGYwNCwgMHgzMDk4YTIyMyksCisgICAgU1RDUCgweDc2NDFhZjNkLCAweDMwZmJjNTRkKSwgU1RDUCgweDc2MTg3Yzc3LCAweDMxNWVjNjE3KSwKKyAgICBTVENQKDB4NzVlZWY2Y2UsIDB4MzFjMWE0M2IpLCBTVENQKDB4NzVjNTFlNjEsIDB4MzIyNDVmNzIpLAorICAgIFNUQ1AoMHg3NTlhZjM0YywgMHgzMjg2Zjc3OSksIFNUQ1AoMHg3NTcwNzVhYywgMHgzMmU5NmMwOSksCisgICAgU1RDUCgweDc1NDVhNWEwLCAweDMzNGJiY2RlKSwgU1RDUCgweDc1MWE4MzQ2LCAweDMzYWRlOWIzKSwKKyAgICBTVENQKDB4NzRlZjBlYmMsIDB4MzQwZmYyNDIpLCBTVENQKDB4NzRjMzQ4MjAsIDB4MzQ3MWQ2NDcpLAorICAgIFNUQ1AoMHg3NDk3MmY5MiwgMHgzNGQzOTU3ZSksIFNUQ1AoMHg3NDZhYzUyZiwgMHgzNTM1MmZhMSksCisgICAgU1RDUCgweDc0M2UwOTE4LCAweDM1OTZhNDZjKSwgU1RDUCgweDc0MTBmYjZiLCAweDM1ZjdmMzljKSwKKyAgICBTVENQKDB4NzNlMzljNDksIDB4MzY1OTFjZWEpLCBTVENQKDB4NzNiNWViZDEsIDB4MzZiYTIwMTQpLAorICAgIFNUQ1AoMHg3Mzg3ZWEyMywgMHgzNzFhZmNkNSksIFNUQ1AoMHg3MzU5OTc2MCwgMHgzNzdiYjJlOSksCisgICAgU1RDUCgweDczMmFmM2E3LCAweDM3ZGM0MjBjKSwgU1RDUCgweDcyZmJmZjFiLCAweDM4M2NhOWZiKSwKKyAgICBTVENQKDB4NzJjY2I5ZGIsIDB4Mzg5Y2VhNzIpLCBTVENQKDB4NzI5ZDI0MDksIDB4MzhmZDAzMmQpLAorICAgIFNUQ1AoMHg3MjZkM2RjNiwgMHgzOTVjZjNlOSksIFNUQ1AoMHg3MjNkMDczNCwgMHgzOWJjYmM2MyksCisgICAgU1RDUCgweDcyMGM4MDc1LCAweDNhMWM1YzU3KSwgU1RDUCgweDcxZGJhOWFiLCAweDNhN2JkMzgyKSwKKyAgICBTVENQKDB4NzFhYTgyZjcsIDB4M2FkYjIxYTEpLCBTVENQKDB4NzE3OTBjN2UsIDB4M2IzYTQ2NzIpLAorICAgIFNUQ1AoMHg3MTQ3NDY2MCwgMHgzYjk5NDFiMSksIFNUQ1AoMHg3MTE1MzBjMiwgMHgzYmY4MTMxYyksCisgICAgU1RDUCgweDcwZTJjYmM2LCAweDNjNTZiYTcwKSwgU1RDUCgweDcwYjAxNzkwLCAweDNjYjUzNzZiKSwKKyAgICBTVENQKDB4NzA3ZDE0NDMsIDB4M2QxMzg5Y2IpLCBTVENQKDB4NzA0OWMyMDMsIDB4M2Q3MWIxNGQpLAorICAgIFNUQ1AoMHg3MDE2MjBmNSwgMHgzZGNmYWRiMCksIFNUQ1AoMHg2ZmUyMzEzYywgMHgzZTJkN2ViMSksCisgICAgU1RDUCgweDZmYWRmMmZjLCAweDNlOGIyNDBlKSwgU1RDUCgweDZmNzk2NjViLCAweDNlZTg5ZDg2KSwKKyAgICBTVENQKDB4NmY0NDhiN2UsIDB4M2Y0NWVhZDgpLCBTVENQKDB4NmYwZjYyODksIDB4M2ZhMzBiYzEpLAorICAgIFNUQ1AoMHg2ZWQ5ZWJhMSwgMHg0MDAwMDAwMCksIFNUQ1AoMHg2ZWE0MjZlZCwgMHg0MDVjYzc1NCksCisgICAgU1RDUCgweDZlNmUxNDkyLCAweDQwYjk2MTdkKSwgU1RDUCgweDZlMzdiNGI2LCAweDQxMTVjZTM4KSwKKyAgICBTVENQKDB4NmUwMTA3ODAsIDB4NDE3MjBkNDYpLCBTVENQKDB4NmRjYTBkMTQsIDB4NDFjZTFlNjUpLAorICAgIFNUQ1AoMHg2ZDkyYzU5YiwgMHg0MjJhMDE1NCksIFNUQ1AoMHg2ZDViMzEzYiwgMHg0Mjg1YjVkNCksCisgICAgU1RDUCgweDZkMjM1MDFiLCAweDQyZTEzYmE0KSwgU1RDUCgweDZjZWIyMjYxLCAweDQzM2M5MjgzKSwKKyAgICBTVENQKDB4NmNiMmE4MzcsIDB4NDM5N2JhMzIpLCBTVENQKDB4NmM3OWUxYzIsIDB4NDNmMmIyNzEpLAorICAgIFNUQ1AoMHg2YzQwY2YyYywgMHg0NDRkN2FmZiksIFNUQ1AoMHg2YzA3NzA5YiwgMHg0NGE4MTM5ZSksCisgICAgU1RDUCgweDZiY2RjNjM5LCAweDQ1MDI3YzBjKSwgU1RDUCgweDZiOTNkMDJlLCAweDQ1NWNiNDBjKSwKKyAgICBTVENQKDB4NmI1OThlYTMsIDB4NDViNmJiNWUpLCBTVENQKDB4NmIxZjAxYzAsIDB4NDYxMDkxYzIpLAorICAgIFNUQ1AoMHg2YWU0MjlhZSwgMHg0NjZhMzZmOSksIFNUQ1AoMHg2YWE5MDY5NywgMHg0NmMzYWFjNSksCisgICAgU1RDUCgweDZhNmQ5OGE0LCAweDQ3MWNlY2U3KSwgU1RDUCgweDZhMzFlMDAwLCAweDQ3NzVmZDFmKSwKKyAgICBTVENQKDB4NjlmNWRjZDMsIDB4NDdjZWRiMzEpLCBTVENQKDB4NjliOThmNDgsIDB4NDgyNzg2ZGMpLAorICAgIFNUQ1AoMHg2OTdjZjc4YSwgMHg0ODdmZmZlNCksIFNUQ1AoMHg2OTQwMTVjMywgMHg0OGQ4NDYwOSksCisgICAgU1RDUCgweDY5MDJlYTFkLCAweDQ5MzA1OTBmKSwgU1RDUCgweDY4YzU3NGM0LCAweDQ5ODgzOGI2KSwKKyAgICBTVENQKDB4Njg4N2I1ZTIsIDB4NDlkZmU0YzIpLCBTVENQKDB4Njg0OWFkYTMsIDB4NGEzNzVjZjUpLAorICAgIFNUQ1AoMHg2ODBiNWMzMywgMHg0YThlYTExMSksIFNUQ1AoMHg2N2NjYzFiZSwgMHg0YWU1YjBkYSksCisgICAgU1RDUCgweDY3OGRkZTZlLCAweDRiM2M4YzEyKSwgU1RDUCgweDY3NGViMjcxLCAweDRiOTMzMjdjKSwKKyAgICBTVENQKDB4NjcwZjNkZjMsIDB4NGJlOWEzZGIpLCBTVENQKDB4NjZjZjgxMjAsIDB4NGMzZmRmZjQpLAorICAgIFNUQ1AoMHg2NjhmN2MyNSwgMHg0Yzk1ZTY4OCksIFNUQ1AoMHg2NjRmMmYyZSwgMHg0Y2ViYjc1YyksCisgICAgU1RDUCgweDY2MGU5YTZhLCAweDRkNDE1MjM0KSwgU1RDUCgweDY1Y2RiZTA1LCAweDRkOTZiNmQzKSwKKyAgICBTVENQKDB4NjU4YzlhMmQsIDB4NGRlYmU0ZmUpLCBTVENQKDB4NjU0YjJmMTAsIDB4NGU0MGRjNzkpLAorICAgIFNUQ1AoMHg2NTA5N2NkYiwgMHg0ZTk1OWQwOCksIFNUQ1AoMHg2NGM3ODNiZCwgMHg0ZWVhMjY3MCksCisgICAgU1RDUCgweDY0ODU0M2U0LCAweDRmM2U3ODc1KSwgU1RDUCgweDY0NDJiZDdlLCAweDRmOTI5MmRjKSwKKyAgICBTVENQKDB4NjNmZmYwYmEsIDB4NGZlNjc1NmEpLCBTVENQKDB4NjNiY2RkYzcsIDB4NTAzYTFmZTUpLAorICAgIFNUQ1AoMHg2Mzc5ODRkNCwgMHg1MDhkOTIxMSksIFNUQ1AoMHg2MzM1ZTYxMSwgMHg1MGUwY2JiNCksCisgICAgU1RDUCgweDYyZjIwMWFjLCAweDUxMzNjYzk0KSwgU1RDUCgweDYyYWRkN2Q2LCAweDUxODY5NDc2KSwKKyAgICBTVENQKDB4NjI2OTY4YmUsIDB4NTFkOTIzMjEpLCBTVENQKDB4NjIyNGI0OTUsIDB4NTIyYjc4NTkpLAorICAgIFNUQ1AoMHg2MWRmYmI4YSwgMHg1MjdkOTNlNiksIFNUQ1AoMHg2MTlhN2RjZSwgMHg1MmNmNzU4ZiksCisgICAgU1RDUCgweDYxNTRmYjkxLCAweDUzMjExZDE4KSwgU1RDUCgweDYxMGYzNTA1LCAweDUzNzI4YTRhKSwKKyAgICBTVENQKDB4NjBjOTJhNWEsIDB4NTNjM2JjZWEpLCBTVENQKDB4NjA4MmRiYzEsIDB4NTQxNGI0YzEpLAorICAgIFNUQ1AoMHg2MDNjNDk2YywgMHg1NDY1NzE5NCksIFNUQ1AoMHg1ZmY1NzM4ZCwgMHg1NGI1ZjMyYyksCisgICAgU1RDUCgweDVmYWU1YTU1LCAweDU1MDYzOTUxKSwgU1RDUCgweDVmNjZmZGY1LCAweDU1NTY0M2M4KSwKKyAgICBTVENQKDB4NWYxZjVlYTEsIDB4NTVhNjEyNWMpLCBTVENQKDB4NWVkNzdjOGEsIDB4NTVmNWE0ZDIpLAorICAgIFNUQ1AoMHg1ZThmNTdlMiwgMHg1NjQ0ZmFmNCksIFNUQ1AoMHg1ZTQ2ZjBkZCwgMHg1Njk0MTQ4YiksCisgICAgU1RDUCgweDVkZmU0N2FkLCAweDU2ZTJmMTVkKSwgU1RDUCgweDVkYjU1Yzg2LCAweDU3MzE5MTM1KSwKKyAgICBTVENQKDB4NWQ2YzJmOTksIDB4NTc3ZmYzZGEpLCBTVENQKDB4NWQyMmMxMWMsIDB4NTdjZTE5MTcpLAorICAgIFNUQ1AoMHg1Y2Q5MTE0MCwgMHg1ODFjMDBiMyksIFNUQ1AoMHg1YzhmMjAzYiwgMHg1ODY5YWE3OSksCisgICAgU1RDUCgweDVjNDRlZTQwLCAweDU4YjcxNjMyKSwgU1RDUCgweDViZmE3YjgyLCAweDU5MDQ0M2E3KSwKKyAgICBTVENQKDB4NWJhZmM4MzcsIDB4NTk1MTMyYTIpLCBTVENQKDB4NWI2NGQ0OTIsIDB4NTk5ZGUyZWUpLAorICAgIFNUQ1AoMHg1YjE5YTBjOCwgMHg1OWVhNTQ1NCksIFNUQ1AoMHg1YWNlMmQwZiwgMHg1YTM2ODY5ZiksCisgICAgU1RDUCgweDVhODI3OTlhLCAweDVhODI3OTlhKSwKIH07CiAKIFJBTV9BTElHTgogTE5LX1NFQ1RJT05fQ09OU1REQVRBCi1jb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MTI4W10gPQotewotICBXVENQKDB4N2ZmZjYyMTYsIDB4MDBjOTBmODgpLCBXVENQKDB4N2ZmYTcyZDEsIDB4MDI1YjI2ZDcpLCBXVENQKDB4N2ZmMDk0NzgsIDB4MDNlZDI2ZTYpLCBXVENQKDB4N2ZlMWM3NmIsIDB4MDU3ZjAwMzUpLAotICBXVENQKDB4N2ZjZTBjM2UsIDB4MDcxMGEzNDUpLCBXVENQKDB4N2ZiNTYzYjMsIDB4MDhhMjAwOWEpLCBXVENQKDB4N2Y5N2NlYmQsIDB4MGEzMzA4YmQpLCBXVENQKDB4N2Y3NTRlODAsIDB4MGJjM2FjMzUpLAotICBXVENQKDB4N2Y0ZGU0NTEsIDB4MGQ1M2RiOTIpLCBXVENQKDB4N2YyMTkxYjQsIDB4MGVlMzg3NjYpLCBXVENQKDB4N2VmMDU4NjAsIDB4MTA3MmEwNDgpLCBXVENQKDB4N2ViYTNhMzksIDB4MTIwMTE2ZDUpLAotICBXVENQKDB4N2U3ZjM5NTcsIDB4MTM4ZWRiYjEpLCBXVENQKDB4N2UzZjU3ZmYsIDB4MTUxYmRmODYpLCBXVENQKDB4N2RmYTk4YTgsIDB4MTZhODEzMDUpLCBXVENQKDB4N2RiMGZkZjgsIDB4MTgzMzY2ZTkpLAotICBXVENQKDB4N2Q2MjhhYzYsIDB4MTliZGNiZjMpLCBXVENQKDB4N2QwZjQyMTgsIDB4MWI0NzMyZWYpLCBXVENQKDB4N2NiNzI3MjQsIDB4MWNjZjhjYjMpLCBXVENQKDB4N2M1YTNkNTAsIDB4MWU1NmNhMWUpLAotICBXVENQKDB4N2JmODg4MzAsIDB4MWZkY2RjMWIpLCBXVENQKDB4N2I5MjBiODksIDB4MjE2MWIzYTApLCBXVENQKDB4N2IyNmNiNGYsIDB4MjJlNTQxYWYpLCBXVENQKDB4N2FiNmNiYTQsIDB4MjQ2Nzc3NTgpLAotICBXVENQKDB4N2E0MjEwZDgsIDB4MjVlODQ1YjYpLCBXVENQKDB4NzljODlmNmUsIDB4Mjc2NzlkZjQpLCBXVENQKDB4Nzk0YTdjMTIsIDB4MjhlNTcxNGIpLCBXVENQKDB4NzhjN2FiYTIsIDB4MmE2MWIxMDEpLAotICBXVENQKDB4Nzg0MDMzMjksIDB4MmJkYzRlNmYpLCBXVENQKDB4NzdiNDE3ZGYsIDB4MmQ1NTNhZmMpLCBXVENQKDB4NzcyMzVmMmQsIDB4MmVjYzY4MWUpLCBXVENQKDB4NzY4ZTBlYTYsIDB4MzA0MWM3NjEpLAotICBXVENQKDB4NzVmNDJjMGIsIDB4MzFiNTRhNWUpLCBXVENQKDB4NzU1NWJkNGMsIDB4MzMyNmUyYzMpLCBXVENQKDB4NzRiMmM4ODQsIDB4MzQ5NjgyNTApLCBXVENQKDB4NzQwYjUzZmIsIDB4MzYwNDFhZDkpLAotICBXVENQKDB4NzM1ZjY2MjYsIDB4Mzc2ZjllNDYpLCBXVENQKDB4NzJhZjA1YTcsIDB4MzhkOGZlOTMpLCBXVENQKDB4NzFmYTM5NDksIDB4M2E0MDJkZDIpLCBXVENQKDB4NzE0MTA4MDUsIDB4M2JhNTFlMjkpLAotICBXVENQKDB4NzA4Mzc4ZmYsIDB4M2QwN2MxZDYpLCBXVENQKDB4NmZjMTkzODUsIDB4M2U2ODBiMmMpLCBXVENQKDB4NmVmYjVmMTIsIDB4M2ZjNWVjOTgpLCBXVENQKDB4NmUzMGUzNGEsIDB4NDEyMTU4OWIpLAotICBXVENQKDB4NmQ2MjI3ZmEsIDB4NDI3YTQxZDApLCBXVENQKDB4NmM4ZjM1MWMsIDB4NDNkMDlhZWQpLCBXVENQKDB4NmJiODEyZDEsIDB4NDUyNDU2YmQpLCBXVENQKDB4NmFkY2M5NjQsIDB4NDY3NTY4MjgpLAotICBXVENQKDB4NjlmZDYxNGEsIDB4NDdjM2MyMmYpLCBXVENQKDB4NjkxOWUzMjAsIDB4NDkwZjU3ZWUpLCBXVENQKDB4NjgzMjU3YWIsIDB4NGE1ODFjOWUpLCBXVENQKDB4Njc0NmM3ZDgsIDB4NGI5ZTAzOTApLAotICBXVENQKDB4NjY1NzNjYmIsIDB4NGNlMTAwMzQpLCBXVENQKDB4NjU2M2JmOTIsIDB4NGUyMTA2MTcpLCBXVENQKDB4NjQ2YzU5YmYsIDB4NGY1ZTA4ZTMpLCBXVENQKDB4NjM3MTE0Y2MsIDB4NTA5N2ZjNWUpLAotICBXVENQKDB4NjI3MWZhNjksIDB4NTFjZWQ0NmUpLCBXVENQKDB4NjE2ZjE0NmMsIDB4NTMwMjg1MTgpLCBXVENQKDB4NjA2ODZjY2YsIDB4NTQzMzAyN2QpLCBXVENQKDB4NWY1ZTBkYjMsIDB4NTU2MDQwZTIpLAotICBXVENQKDB4NWU1MDAxNWQsIDB4NTY4YTM0YTkpLCBXVENQKDB4NWQzZTUyMzcsIDB4NTdiMGQyNTYpLCBXVENQKDB4NWMyOTBhY2MsIDB4NThkNDBlOGMpLCBXVENQKDB4NWIxMDM1Y2YsIDB4NTlmM2RlMTIpLAorY29uc3QgRklYUF9TVFAgU2luZVRhYmxlNTEyW10gPSB7CisgICAgU1RDUCgweDdmZmZmZmZmLCAweDAwMDAwMDAwKSwgU1RDUCgweDdmZmZkODg2LCAweDAwNjQ4N2UzKSwKKyAgICBTVENQKDB4N2ZmZjYyMTYsIDB4MDBjOTBmODgpLCBTVENQKDB4N2ZmZTljYjIsIDB4MDEyZDk2YjEpLAorICAgIFNUQ1AoMHg3ZmZkODg1YSwgMHgwMTkyMWQyMCksIFNUQ1AoMHg3ZmZjMjUwZiwgMHgwMWY2YTI5NyksCisgICAgU1RDUCgweDdmZmE3MmQxLCAweDAyNWIyNmQ3KSwgU1RDUCgweDdmZjg3MWEyLCAweDAyYmZhOWE0KSwKKyAgICBTVENQKDB4N2ZmNjIxODIsIDB4MDMyNDJhYmYpLCBTVENQKDB4N2ZmMzgyNzQsIDB4MDM4OGE5ZWEpLAorICAgIFNUQ1AoMHg3ZmYwOTQ3OCwgMHgwM2VkMjZlNiksIFNUQ1AoMHg3ZmVkNTc5MSwgMHgwNDUxYTE3NyksCisgICAgU1RDUCgweDdmZTljYmMwLCAweDA0YjYxOTVkKSwgU1RDUCgweDdmZTVmMTA4LCAweDA1MWE4ZTVjKSwKKyAgICBTVENQKDB4N2ZlMWM3NmIsIDB4MDU3ZjAwMzUpLCBTVENQKDB4N2ZkZDRlZWMsIDB4MDVlMzZlYTkpLAorICAgIFNUQ1AoMHg3ZmQ4ODc4ZSwgMHgwNjQ3ZDk3YyksIFNUQ1AoMHg3ZmQzNzE1MywgMHgwNmFjNDA2ZiksCisgICAgU1RDUCgweDdmY2UwYzNlLCAweDA3MTBhMzQ1KSwgU1RDUCgweDdmYzg1ODU0LCAweDA3NzUwMWJlKSwKKyAgICBTVENQKDB4N2ZjMjU1OTYsIDB4MDdkOTViOWUpLCBTVENQKDB4N2ZiYzA0MGEsIDB4MDgzZGIwYTcpLAorICAgIFNUQ1AoMHg3ZmI1NjNiMywgMHgwOGEyMDA5YSksIFNUQ1AoMHg3ZmFlNzQ5NSwgMHgwOTA2NGIzYSksCisgICAgU1RDUCgweDdmYTczNmI0LCAweDA5NmE5MDQ5KSwgU1RDUCgweDdmOWZhYTE1LCAweDA5Y2VjZjg5KSwKKyAgICBTVENQKDB4N2Y5N2NlYmQsIDB4MGEzMzA4YmQpLCBTVENQKDB4N2Y4ZmE0YjAsIDB4MGE5NzNiYTUpLAorICAgIFNUQ1AoMHg3Zjg3MmJmMywgMHgwYWZiNjgwNSksIFNUQ1AoMHg3ZjdlNjQ4YywgMHgwYjVmOGQ5ZiksCisgICAgU1RDUCgweDdmNzU0ZTgwLCAweDBiYzNhYzM1KSwgU1RDUCgweDdmNmJlOWQ0LCAweDBjMjdjMzg5KSwKKyAgICBTVENQKDB4N2Y2MjM2OGYsIDB4MGM4YmQzNWUpLCBTVENQKDB4N2Y1ODM0YjcsIDB4MGNlZmRiNzYpLAorICAgIFNUQ1AoMHg3ZjRkZTQ1MSwgMHgwZDUzZGI5MiksIFNUQ1AoMHg3ZjQzNDU2MywgMHgwZGI3ZDM3NiksCisgICAgU1RDUCgweDdmMzg1N2Y2LCAweDBlMWJjMmU0KSwgU1RDUCgweDdmMmQxYzBlLCAweDBlN2ZhOTllKSwKKyAgICBTVENQKDB4N2YyMTkxYjQsIDB4MGVlMzg3NjYpLCBTVENQKDB4N2YxNWI4ZWUsIDB4MGY0NzViZmYpLAorICAgIFNUQ1AoMHg3ZjA5OTFjNCwgMHgwZmFiMjcyYiksIFNUQ1AoMHg3ZWZkMWMzYywgMHgxMDBlZThhZCksCisgICAgU1RDUCgweDdlZjA1ODYwLCAweDEwNzJhMDQ4KSwgU1RDUCgweDdlZTM0NjM2LCAweDEwZDY0ZGJkKSwKKyAgICBTVENQKDB4N2VkNWU1YzYsIDB4MTEzOWYwY2YpLCBTVENQKDB4N2VjODM3MWEsIDB4MTE5ZDg5NDEpLAorICAgIFNUQ1AoMHg3ZWJhM2EzOSwgMHgxMjAxMTZkNSksIFNUQ1AoMHg3ZWFiZWYyYywgMHgxMjY0OTk0ZSksCisgICAgU1RDUCgweDdlOWQ1NWZjLCAweDEyYzgxMDZmKSwgU1RDUCgweDdlOGU2ZWIyLCAweDEzMmI3YmY5KSwKKyAgICBTVENQKDB4N2U3ZjM5NTcsIDB4MTM4ZWRiYjEpLCBTVENQKDB4N2U2ZmI1ZjQsIDB4MTNmMjJmNTgpLAorICAgIFNUQ1AoMHg3ZTVmZTQ5MywgMHgxNDU1NzZiMSksIFNUQ1AoMHg3ZTRmYzUzZSwgMHgxNGI4YjE3ZiksCisgICAgU1RDUCgweDdlM2Y1N2ZmLCAweDE1MWJkZjg2KSwgU1RDUCgweDdlMmU5Y2RmLCAweDE1N2YwMDg2KSwKKyAgICBTVENQKDB4N2UxZDkzZWEsIDB4MTVlMjE0NDUpLCBTVENQKDB4N2UwYzNkMjksIDB4MTY0NTFhODMpLAorICAgIFNUQ1AoMHg3ZGZhOThhOCwgMHgxNmE4MTMwNSksIFNUQ1AoMHg3ZGU4YTY3MCwgMHgxNzBhZmQ4ZCksCisgICAgU1RDUCgweDdkZDY2NjhmLCAweDE3NmRkOWRlKSwgU1RDUCgweDdkYzNkOTBkLCAweDE3ZDBhN2JjKSwKKyAgICBTVENQKDB4N2RiMGZkZjgsIDB4MTgzMzY2ZTkpLCBTVENQKDB4N2Q5ZGQ1NWEsIDB4MTg5NjE3MjgpLAorICAgIFNUQ1AoMHg3ZDhhNWY0MCwgMHgxOGY4YjgzYyksIFNUQ1AoMHg3ZDc2OWJiNSwgMHgxOTViNDllYSksCisgICAgU1RDUCgweDdkNjI4YWM2LCAweDE5YmRjYmYzKSwgU1RDUCgweDdkNGUyYzdmLCAweDFhMjAzZTFiKSwKKyAgICBTVENQKDB4N2QzOTgwZWMsIDB4MWE4MmEwMjYpLCBTVENQKDB4N2QyNDg4MWIsIDB4MWFlNGYxZDYpLAorICAgIFNUQ1AoMHg3ZDBmNDIxOCwgMHgxYjQ3MzJlZiksIFNUQ1AoMHg3Y2Y5YWVmMCwgMHgxYmE5NjMzNSksCisgICAgU1RDUCgweDdjZTNjZWIyLCAweDFjMGI4MjZhKSwgU1RDUCgweDdjY2RhMTY5LCAweDFjNmQ5MDUzKSwKKyAgICBTVENQKDB4N2NiNzI3MjQsIDB4MWNjZjhjYjMpLCBTVENQKDB4N2NhMDVmZjEsIDB4MWQzMTc3NGQpLAorICAgIFNUQ1AoMHg3Yzg5NGJkZSwgMHgxZDkzNGZlNSksIFNUQ1AoMHg3YzcxZWFmOSwgMHgxZGY1MTYzZiksCisgICAgU1RDUCgweDdjNWEzZDUwLCAweDFlNTZjYTFlKSwgU1RDUCgweDdjNDI0MmYyLCAweDFlYjg2YjQ2KSwKKyAgICBTVENQKDB4N2MyOWZiZWUsIDB4MWYxOWY5N2IpLCBTVENQKDB4N2MxMTY4NTMsIDB4MWY3Yjc0ODEpLAorICAgIFNUQ1AoMHg3YmY4ODgzMCwgMHgxZmRjZGMxYiksIFNUQ1AoMHg3YmRmNWI5NCwgMHgyMDNlMzAwZCksCisgICAgU1RDUCgweDdiYzVlMjkwLCAweDIwOWY3MDFjKSwgU1RDUCgweDdiYWMxZDMxLCAweDIxMDA5YzBjKSwKKyAgICBTVENQKDB4N2I5MjBiODksIDB4MjE2MWIzYTApLCBTVENQKDB4N2I3N2FkYTgsIDB4MjFjMmI2OWMpLAorICAgIFNUQ1AoMHg3YjVkMDM5ZSwgMHgyMjIzYTRjNSksIFNUQ1AoMHg3YjQyMGQ3YSwgMHgyMjg0N2RlMCksCisgICAgU1RDUCgweDdiMjZjYjRmLCAweDIyZTU0MWFmKSwgU1RDUCgweDdiMGIzZDJjLCAweDIzNDVlZmY4KSwKKyAgICBTVENQKDB4N2FlZjYzMjMsIDB4MjNhNjg4N2YpLCBTVENQKDB4N2FkMzNkNDUsIDB4MjQwNzBiMDgpLAorICAgIFNUQ1AoMHg3YWI2Y2JhNCwgMHgyNDY3Nzc1OCksIFNUQ1AoMHg3YTlhMGU1MCwgMHgyNGM3Y2QzMyksCisgICAgU1RDUCgweDdhN2QwNTViLCAweDI1MjgwYzVlKSwgU1RDUCgweDdhNWZiMGQ4LCAweDI1ODgzNDlkKSwKKyAgICBTVENQKDB4N2E0MjEwZDgsIDB4MjVlODQ1YjYpLCBTVENQKDB4N2EyNDI1NmYsIDB4MjY0ODNmNmMpLAorICAgIFNUQ1AoMHg3YTA1ZWVhZCwgMHgyNmE4MjE4NiksIFNUQ1AoMHg3OWU3NmNhNywgMHgyNzA3ZWJjNyksCisgICAgU1RDUCgweDc5Yzg5ZjZlLCAweDI3Njc5ZGY0KSwgU1RDUCgweDc5YTk4NzE1LCAweDI3YzczN2QzKSwKKyAgICBTVENQKDB4Nzk4YTIzYjEsIDB4MjgyNmI5MjgpLCBTVENQKDB4Nzk2YTc1NTQsIDB4Mjg4NjIxYjkpLAorICAgIFNUQ1AoMHg3OTRhN2MxMiwgMHgyOGU1NzE0YiksIFNUQ1AoMHg3OTJhMzdmZSwgMHgyOTQ0YTdhMiksCisgICAgU1RDUCgweDc5MDlhOTJkLCAweDI5YTNjNDg1KSwgU1RDUCgweDc4ZThjZmIyLCAweDJhMDJjN2I4KSwKKyAgICBTVENQKDB4NzhjN2FiYTIsIDB4MmE2MWIxMDEpLCBTVENQKDB4NzhhNjNkMTEsIDB4MmFjMDgwMjYpLAorICAgIFNUQ1AoMHg3ODg0ODQxNCwgMHgyYjFmMzRlYiksIFNUQ1AoMHg3ODYyODBiZiwgMHgyYjdkY2YxNyksCisgICAgU1RDUCgweDc4NDAzMzI5LCAweDJiZGM0ZTZmKSwgU1RDUCgweDc4MWQ5YjY1LCAweDJjM2FiMmI5KSwKKyAgICBTVENQKDB4NzdmYWI5ODksIDB4MmM5OGZiYmEpLCBTVENQKDB4NzdkNzhkYWEsIDB4MmNmNzI5MzkpLAorICAgIFNUQ1AoMHg3N2I0MTdkZiwgMHgyZDU1M2FmYyksIFNUQ1AoMHg3NzkwNTgzZSwgMHgyZGIzMzBjNyksCisgICAgU1RDUCgweDc3NmM0ZWRiLCAweDJlMTEwYTYyKSwgU1RDUCgweDc3NDdmYmNlLCAweDJlNmVjNzkyKSwKKyAgICBTVENQKDB4NzcyMzVmMmQsIDB4MmVjYzY4MWUpLCBTVENQKDB4NzZmZTc5MGUsIDB4MmYyOWViY2MpLAorICAgIFNUQ1AoMHg3NmQ5NDk4OSwgMHgyZjg3NTI2MiksIFNUQ1AoMHg3NmIzZDBiNCwgMHgyZmU0OWJhNyksCisgICAgU1RDUCgweDc2OGUwZWE2LCAweDMwNDFjNzYxKSwgU1RDUCgweDc2NjgwMzc2LCAweDMwOWVkNTU2KSwKKyAgICBTVENQKDB4NzY0MWFmM2QsIDB4MzBmYmM1NGQpLCBTVENQKDB4NzYxYjEyMTEsIDB4MzE1ODk3MGUpLAorICAgIFNUQ1AoMHg3NWY0MmMwYiwgMHgzMWI1NGE1ZSksIFNUQ1AoMHg3NWNjZmQ0MiwgMHgzMjExZGYwNCksCisgICAgU1RDUCgweDc1YTU4NWNmLCAweDMyNmU1NGM3KSwgU1RDUCgweDc1N2RjNWNhLCAweDMyY2FhYjZmKSwKKyAgICBTVENQKDB4NzU1NWJkNGMsIDB4MzMyNmUyYzMpLCBTVENQKDB4NzUyZDZjNmMsIDB4MzM4MmZhODgpLAorICAgIFNUQ1AoMHg3NTA0ZDM0NSwgMHgzM2RlZjI4NyksIFNUQ1AoMHg3NGRiZjFlZiwgMHgzNDNhY2E4NyksCisgICAgU1RDUCgweDc0YjJjODg0LCAweDM0OTY4MjUwKSwgU1RDUCgweDc0ODk1NzFjLCAweDM0ZjIxOWE4KSwKKyAgICBTVENQKDB4NzQ1ZjlkZDEsIDB4MzU0ZDkwNTcpLCBTVENQKDB4NzQzNTljYmQsIDB4MzVhOGU2MjUpLAorICAgIFNUQ1AoMHg3NDBiNTNmYiwgMHgzNjA0MWFkOSksIFNUQ1AoMHg3M2UwYzNhMywgMHgzNjVmMmUzYiksCisgICAgU1RDUCgweDczYjVlYmQxLCAweDM2YmEyMDE0KSwgU1RDUCgweDczOGFjYzllLCAweDM3MTRmMDJhKSwKKyAgICBTVENQKDB4NzM1ZjY2MjYsIDB4Mzc2ZjllNDYpLCBTVENQKDB4NzMzM2I4ODMsIDB4MzdjYTJhMzApLAorICAgIFNUQ1AoMHg3MzA3YzNkMCwgMHgzODI0OTNiMCksIFNUQ1AoMHg3MmRiODgyOCwgMHgzODdlZGE4ZSksCisgICAgU1RDUCgweDcyYWYwNWE3LCAweDM4ZDhmZTkzKSwgU1RDUCgweDcyODIzYzY3LCAweDM5MzJmZjg3KSwKKyAgICBTVENQKDB4NzI1NTJjODUsIDB4Mzk4Y2RkMzIpLCBTVENQKDB4NzIyN2Q2MWMsIDB4MzllNjk3NWUpLAorICAgIFNUQ1AoMHg3MWZhMzk0OSwgMHgzYTQwMmRkMiksIFNUQ1AoMHg3MWNjNTYyNiwgMHgzYTk5YTA1NyksCisgICAgU1RDUCgweDcxOWUyY2QyLCAweDNhZjJlZWI3KSwgU1RDUCgweDcxNmZiZDY4LCAweDNiNGMxOGJhKSwKKyAgICBTVENQKDB4NzE0MTA4MDUsIDB4M2JhNTFlMjkpLCBTVENQKDB4NzExMjBjYzUsIDB4M2JmZGZlY2QpLAorICAgIFNUQ1AoMHg3MGUyY2JjNiwgMHgzYzU2YmE3MCksIFNUQ1AoMHg3MGIzNDUyNSwgMHgzY2FmNTBkYSksCisgICAgU1RDUCgweDcwODM3OGZmLCAweDNkMDdjMWQ2KSwgU1RDUCgweDcwNTM2NzcxLCAweDNkNjAwZDJjKSwKKyAgICBTVENQKDB4NzAyMzEwOWEsIDB4M2RiODMyYTYpLCBTVENQKDB4NmZmMjc0OTcsIDB4M2UxMDMyMGQpLAorICAgIFNUQ1AoMHg2ZmMxOTM4NSwgMHgzZTY4MGIyYyksIFNUQ1AoMHg2ZjkwNmQ4NCwgMHgzZWJmYmRjZCksCisgICAgU1RDUCgweDZmNWYwMmIyLCAweDNmMTc0OWI4KSwgU1RDUCgweDZmMmQ1MzJjLCAweDNmNmVhZWI4KSwKKyAgICBTVENQKDB4NmVmYjVmMTIsIDB4M2ZjNWVjOTgpLCBTVENQKDB4NmVjOTI2ODMsIDB4NDAxZDAzMjEpLAorICAgIFNUQ1AoMHg2ZTk2YTk5ZCwgMHg0MDczZjIxZCksIFNUQ1AoMHg2ZTYzZTg3ZiwgMHg0MGNhYjk1OCksCisgICAgU1RDUCgweDZlMzBlMzRhLCAweDQxMjE1ODliKSwgU1RDUCgweDZkZmQ5YTFjLCAweDQxNzdjZmIxKSwKKyAgICBTVENQKDB4NmRjYTBkMTQsIDB4NDFjZTFlNjUpLCBTVENQKDB4NmQ5NjNjNTQsIDB4NDIyNDQ0ODEpLAorICAgIFNUQ1AoMHg2ZDYyMjdmYSwgMHg0MjdhNDFkMCksIFNUQ1AoMHg2ZDJkZDAyNywgMHg0MmQwMTYxZSksCisgICAgU1RDUCgweDZjZjkzNGZjLCAweDQzMjVjMTM1KSwgU1RDUCgweDZjYzQ1Njk4LCAweDQzN2I0MmUxKSwKKyAgICBTVENQKDB4NmM4ZjM1MWMsIDB4NDNkMDlhZWQpLCBTVENQKDB4NmM1OWQwYTksIDB4NDQyNWM5MjMpLAorICAgIFNUQ1AoMHg2YzI0Mjk2MCwgMHg0NDdhY2Q1MCksIFNUQ1AoMHg2YmVlM2Y2MiwgMHg0NGNmYTc0MCksCisgICAgU1RDUCgweDZiYjgxMmQxLCAweDQ1MjQ1NmJkKSwgU1RDUCgweDZiODFhM2NkLCAweDQ1NzhkYjkzKSwKKyAgICBTVENQKDB4NmI0YWYyNzksIDB4NDVjZDM1OGYpLCBTVENQKDB4NmIxM2ZlZjUsIDB4NDYyMTY0N2QpLAorICAgIFNUQ1AoMHg2YWRjYzk2NCwgMHg0Njc1NjgyOCksIFNUQ1AoMHg2YWE1NTFlOSwgMHg0NmM5NDA1YyksCisgICAgU1RDUCgweDZhNmQ5OGE0LCAweDQ3MWNlY2U3KSwgU1RDUCgweDZhMzU5ZGI5LCAweDQ3NzA2ZDkzKSwKKyAgICBTVENQKDB4NjlmZDYxNGEsIDB4NDdjM2MyMmYpLCBTVENQKDB4NjljNGUzN2EsIDB4NDgxNmVhODYpLAorICAgIFNUQ1AoMHg2OThjMjQ2YywgMHg0ODY5ZTY2NSksIFNUQ1AoMHg2OTUzMjQ0MiwgMHg0OGJjYjU5OSksCisgICAgU1RDUCgweDY5MTllMzIwLCAweDQ5MGY1N2VlKSwgU1RDUCgweDY4ZTA2MTI5LCAweDQ5NjFjZDMzKSwKKyAgICBTVENQKDB4NjhhNjllODEsIDB4NDliNDE1MzMpLCBTVENQKDB4Njg2YzliNGIsIDB4NGEwNjJmYmQpLAorICAgIFNUQ1AoMHg2ODMyNTdhYiwgMHg0YTU4MWM5ZSksIFNUQ1AoMHg2N2Y3ZDNjNSwgMHg0YWE5ZGJhMiksCisgICAgU1RDUCgweDY3YmQwZmJkLCAweDRhZmI2Yzk4KSwgU1RDUCgweDY3ODIwYmI3LCAweDRiNGNjZjRkKSwKKyAgICBTVENQKDB4Njc0NmM3ZDgsIDB4NGI5ZTAzOTApLCBTVENQKDB4NjcwYjQ0NDQsIDB4NGJlZjA5MmQpLAorICAgIFNUQ1AoMHg2NmNmODEyMCwgMHg0YzNmZGZmNCksIFNUQ1AoMHg2NjkzN2U5MSwgMHg0YzkwODdiMSksCisgICAgU1RDUCgweDY2NTczY2JiLCAweDRjZTEwMDM0KSwgU1RDUCgweDY2MWFiYmM1LCAweDRkMzE0OTRiKSwKKyAgICBTVENQKDB4NjVkZGZiZDMsIDB4NGQ4MTYyYzQpLCBTVENQKDB4NjVhMGZkMGIsIDB4NGRkMTRjNmUpLAorICAgIFNUQ1AoMHg2NTYzYmY5MiwgMHg0ZTIxMDYxNyksIFNUQ1AoMHg2NTI2NDM4ZiwgMHg0ZTcwOGY4ZiksCisgICAgU1RDUCgweDY0ZTg4OTI2LCAweDRlYmZlOGE1KSwgU1RDUCgweDY0YWE5MDdmLCAweDRmMGYxMTI2KSwKKyAgICBTVENQKDB4NjQ2YzU5YmYsIDB4NGY1ZTA4ZTMpLCBTVENQKDB4NjQyZGU1MGQsIDB4NGZhY2NmYWIpLAorICAgIFNUQ1AoMHg2M2VmMzI5MCwgMHg0ZmZiNjU0ZCksIFNUQ1AoMHg2M2IwNDI2ZCwgMHg1MDQ5Yzk5OSksCisgICAgU1RDUCgweDYzNzExNGNjLCAweDUwOTdmYzVlKSwgU1RDUCgweDYzMzFhOWQ0LCAweDUwZTVmZDZkKSwKKyAgICBTVENQKDB4NjJmMjAxYWMsIDB4NTEzM2NjOTQpLCBTVENQKDB4NjJiMjFjN2IsIDB4NTE4MTY5YTUpLAorICAgIFNUQ1AoMHg2MjcxZmE2OSwgMHg1MWNlZDQ2ZSksIFNUQ1AoMHg2MjMxOWI5ZCwgMHg1MjFjMGNjMiksCisgICAgU1RDUCgweDYxZjEwMDNmLCAweDUyNjkxMjZlKSwgU1RDUCgweDYxYjAyODc2LCAweDUyYjVlNTQ2KSwKKyAgICBTVENQKDB4NjE2ZjE0NmMsIDB4NTMwMjg1MTgpLCBTVENQKDB4NjEyZGM0NDcsIDB4NTM0ZWYxYjUpLAorICAgIFNUQ1AoMHg2MGVjMzgzMCwgMHg1MzliMmFmMCksIFNUQ1AoMHg2MGFhNzA1MCwgMHg1M2U3MzA5NyksCisgICAgU1RDUCgweDYwNjg2Y2NmLCAweDU0MzMwMjdkKSwgU1RDUCgweDYwMjYyZGQ2LCAweDU0N2VhMDczKSwKKyAgICBTVENQKDB4NWZlM2IzOGQsIDB4NTRjYTBhNGIpLCBTVENQKDB4NWZhMGZlMWYsIDB4NTUxNTNmZDQpLAorICAgIFNUQ1AoMHg1ZjVlMGRiMywgMHg1NTYwNDBlMiksIFNUQ1AoMHg1ZjFhZTI3NCwgMHg1NWFiMGQ0NiksCisgICAgU1RDUCgweDVlZDc3YzhhLCAweDU1ZjVhNGQyKSwgU1RDUCgweDVlOTNkYzFmLCAweDU2NDAwNzU4KSwKKyAgICBTVENQKDB4NWU1MDAxNWQsIDB4NTY4YTM0YTkpLCBTVENQKDB4NWUwYmVjNmUsIDB4NTZkNDJjOTkpLAorICAgIFNUQ1AoMHg1ZGM3OWQ3YywgMHg1NzFkZWVmYSksIFNUQ1AoMHg1ZDgzMTRiMSwgMHg1NzY3N2I5ZCksCisgICAgU1RDUCgweDVkM2U1MjM3LCAweDU3YjBkMjU2KSwgU1RDUCgweDVjZjk1NjM4LCAweDU3ZjlmMmY4KSwKKyAgICBTVENQKDB4NWNiNDIwZTAsIDB4NTg0MmRkNTQpLCBTVENQKDB4NWM2ZWIyNTgsIDB4NTg4YjkxNDApLAorICAgIFNUQ1AoMHg1YzI5MGFjYywgMHg1OGQ0MGU4YyksIFNUQ1AoMHg1YmUzMmE2NywgMHg1OTFjNTUwZSksCisgICAgU1RDUCgweDViOWQxMTU0LCAweDU5NjQ2NDk4KSwgU1RDUCgweDViNTZiZmJkLCAweDU5YWMzY2ZkKSwKKyAgICBTVENQKDB4NWIxMDM1Y2YsIDB4NTlmM2RlMTIpLCBTVENQKDB4NWFjOTczYjUsIDB4NWEzYjQ3YWIpLAorICAgIFNUQ1AoMHg1YTgyNzk5YSwgMHg1YTgyNzk5YSksCiB9OwogCiBSQU1fQUxJR04KIExOS19TRUNUSU9OX0NPTlNUREFUQQotY29uc3QgRklYUF9XVFAgS0JEV2luZG93MTI4W10gPQotewotICBXVENQKDB4N2ZmZmZmZmUsIDB4MDAwMTZmNjMpLCBXVENQKDB4N2ZmZmZmZjEsIDB4MDAwM2UzODIpLCBXVENQKDB4N2ZmZmZmYzcsIDB4MDAwNzhmNjQpLCBXVENQKDB4N2ZmZmZmNWQsIDB4MDAwY2MzMjMpLAotICBXVENQKDB4N2ZmZmZlNzYsIDB4MDAxM2Q5ZWQpLCBXVENQKDB4N2ZmZmZjYWEsIDB4MDAxZDNhOWQpLCBXVENQKDB4N2ZmZmY5NTMsIDB4MDAyOTU4MWYpLCBXVENQKDB4N2ZmZmYzNzIsIDB4MDAzOGIxYmQpLAotICBXVENQKDB4N2ZmZmU5OGIsIDB4MDA0YmQzNGQpLCBXVENQKDB4N2ZmZmQ5NzUsIDB4MDA2MzU1MzgpLCBXVENQKDB4N2ZmZmMwMjQsIDB4MDA3ZmRjNjQpLCBXVENQKDB4N2ZmZjk5NWIsIDB4MDBhMjE5ZjEpLAotICBXVENQKDB4N2ZmZjVmNWIsIDB4MDBjYWNhZDApLCBXVENQKDB4N2ZmZjBhNzUsIDB4MDBmYWI3MmQpLCBXVENQKDB4N2ZmZTkwOTEsIDB4MDEzMmIxYWYpLCBXVENQKDB4N2ZmZGU0OWUsIDB4MDE3Mzk2ODkpLAotICBXVENQKDB4N2ZmY2Y1ZWYsIDB4MDFiZTRhNjMpLCBXVENQKDB4N2ZmYmFmODQsIDB4MDIxM2I5MTApLCBXVENQKDB4N2ZmOWY3M2EsIDB4MDI3NGQ0MWUpLCBXVENQKDB4N2ZmN2FjZjEsIDB4MDJlMjkxM2EpLAotICBXVENQKDB4N2ZmNGE5OWEsIDB4MDM1ZGU4NmMpLCBXVENQKDB4N2ZmMGJlM2QsIDB4MDNlN2QyMzMpLCBXVENQKDB4N2ZlYmIyZjEsIDB4MDQ4MTQ1N2MpLCBXVENQKDB4N2ZlNTQ1ZDQsIDB4MDUyYjM1N2MpLAotICBXVENQKDB4N2ZkZDJhMDIsIDB4MDVlNjhmNzcpLCBXVENQKDB4N2ZkMzA2OTUsIDB4MDZiNDM4NmYpLCBXVENQKDB4N2ZjNjc1YjQsIDB4MDc5NTBhY2IpLCBXVENQKDB4N2ZiNzAzYmUsIDB4MDg4OWQzZWYpLAotICBXVENQKDB4N2ZhNDJlODksIDB4MDk5MzUxZTApLCBXVENQKDB4N2Y4ZDY0ZDgsIDB4MGFiMjMwZTApLCBXVENQKDB4N2Y3MjA1ZjgsIDB4MGJlNzA5MjMpLCBXVENQKDB4N2Y1MTYxOTUsIDB4MGQzMjVjOTMpLAotICBXVENQKDB4N2YyYWI3ZDAsIDB4MGU5NDk0YWUpLCBXVENQKDB4N2VmZDM5OTcsIDB4MTAwZTAwODUpLCBXVENQKDB4N2VjODA5NGEsIDB4MTE5ZWQyZWYpLCBXVENQKDB4N2U4YTNiYTcsIDB4MTM0NzIwZDgpLAotICBXVENQKDB4N2U0MmQ5MDYsIDB4MTUwNmRmZGMpLCBXVENQKDB4N2RmMGRlZTQsIDB4MTZkZGU1MGIpLCBXVENQKDB4N2Q5MzQxYjQsIDB4MThjYmUzZjcpLCBXVENQKDB4N2QyOGVmMDIsIDB4MWFkMDZlMDcpLAotICBXVENQKDB4N2NiMGNmY2MsIDB4MWNlYWYyMTUpLCBXVENQKDB4N2MyOWNiMjAsIDB4MWYxYWJjNGYpLCBXVENQKDB4N2I5MmM4ZWIsIDB4MjE1ZWY2NzcpLCBXVENQKDB4N2FlYWI0ZWMsIDB4MjNiNmE4NjcpLAotICBXVENQKDB4N2EzMDgxZDAsIDB4MjYyMGI4ZWMpLCBXVENQKDB4Nzk2MzJjNWEsIDB4Mjg5YmVlZjUpLCBXVENQKDB4Nzg4MWJlOTUsIDB4MmIyNmYzMGIpLCBXVENQKDB4Nzc4YjUzMDQsIDB4MmRjMDUxMWYpLAotICBXVENQKDB4NzY3ZjE3YzAsIDB4MzA2NjdhYTIpLCBXVENQKDB4NzU1YzUxNzgsIDB4MzMxN2M4ZGQpLCBXVENQKDB4NzQyMjVlNTAsIDB4MzVkMjdmOTgpLCBXVENQKDB4NzJkMGI4ODcsIDB4Mzg5NGNmZjMpLAotICBXVENQKDB4NzE2NmY4ZTcsIDB4M2I1Y2RiN2IpLCBXVENQKDB4NmZlNGQ4ZTgsIDB4M2UyOGI3NzApLCBXVENQKDB4NmU0YTM0OTEsIDB4NDBmNjcwMmEpLCBXVENQKDB4NmM5NzBiZmMsIDB4NDNjNDBjYWEpLAotICBXVENQKDB4NmFjYjg0ODMsIDB4NDY4ZjkyMzEpLCBXVENQKDB4NjhlN2U5OTQsIDB4NDk1NzA3ZjUpLCBXVENQKDB4NjZlY2FkMWMsIDB4NGMxODdhYzcpLCBXVENQKDB4NjRkYTY3OTcsIDB4NGVkMjAwYzUpLAotICBXVENQKDB4NjJiMWQ3YjcsIDB4NTE4MWJjZWEpLCBXVENQKDB4NjA3M2UxYWUsIDB4NTQyNWUyOGUpLCBXVENQKDB4NWUyMThlMTYsIDB4NTZiY2I4YzIpLCBXVENQKDB4NWJiYzA4NzUsIDB4NTk0NDlkNzYpLAotfTsKLQotCi0KLQotCi0KLQotCi1SQU1fQUxJR04KLUxOS19TRUNUSU9OX0NPTlNUREFUQQotY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzk2MFtdID0KLXsKLSAgV1RDUCgweDdmZmZmZDMxLCAweDAwMWFjZWVhKSwgV1RDUCgweDdmZmZlNmJjLCAweDAwNTA2Y2I5KSwgV1RDUCgweDdmZmZiOWQxLCAweDAwODYwYTc5KSwgV1RDUCgweDdmZmY3NjcxLCAweDAwYmJhODIyKSwKLSAgV1RDUCgweDdmZmYxYzliLCAweDAwZjE0NWFiKSwgV1RDUCgweDdmZmVhYzUwLCAweDAxMjZlMzA5KSwgV1RDUCgweDdmZmUyNTkwLCAweDAxNWM4MDMzKSwgV1RDUCgweDdmZmQ4ODVhLCAweDAxOTIxZDIwKSwKLSAgV1RDUCgweDdmZmNkNGIwLCAweDAxYzdiOWM2KSwgV1RDUCgweDdmZmMwYTkxLCAweDAxZmQ1NjFkKSwgV1RDUCgweDdmZmIyOWZkLCAweDAyMzJmMjFhKSwgV1RDUCgweDdmZmEzMmY0LCAweDAyNjg4ZGI0KSwKLSAgV1RDUCgweDdmZjkyNTc3LCAweDAyOWUyOGUyKSwgV1RDUCgweDdmZjgwMTg2LCAweDAyZDNjMzliKSwgV1RDUCgweDdmZjZjNzIwLCAweDAzMDk1ZGQ1KSwgV1RDUCgweDdmZjU3NjQ3LCAweDAzM2VmNzg2KSwKLSAgV1RDUCgweDdmZjQwZWZhLCAweDAzNzQ5MGE1KSwgV1RDUCgweDdmZjI5MTNhLCAweDAzYWEyOTJhKSwgV1RDUCgweDdmZjBmZDA3LCAweDAzZGZjMTA5KSwgV1RDUCgweDdmZWY1MjYwLCAweDA0MTU1ODNiKSwKLSAgV1RDUCgweDdmZWQ5MTQ4LCAweDA0NGFlZWI1KSwgV1RDUCgweDdmZWJiOWJkLCAweDA0ODA4NDZlKSwgV1RDUCgweDdmZTljYmMwLCAweDA0YjYxOTVkKSwgV1RDUCgweDdmZTdjNzUyLCAweDA0ZWJhZDc5KSwKLSAgV1RDUCgweDdmZTVhYzcyLCAweDA1MjE0MGI3KSwgV1RDUCgweDdmZTM3YjIyLCAweDA1NTZkMzBmKSwgV1RDUCgweDdmZTEzMzYxLCAweDA1OGM2NDc4KSwgV1RDUCgweDdmZGVkNTMwLCAweDA1YzFmNGU3KSwKLSAgV1RDUCgweDdmZGM2MDhmLCAweDA1Zjc4NDUzKSwgV1RDUCgweDdmZDlkNTdmLCAweDA2MmQxMmI0KSwgV1RDUCgweDdmZDczNDAxLCAweDA2NjI5ZmZlKSwgV1RDUCgweDdmZDQ3YzE0LCAweDA2OTgyYzJiKSwKLSAgV1RDUCgweDdmZDFhZGI5LCAweDA2Y2RiNzJmKSwgV1RDUCgweDdmY2VjOGYxLCAweDA3MDM0MTAxKSwgV1RDUCgweDdmY2JjZGJjLCAweDA3MzhjOTk4KSwgV1RDUCgweDdmYzhiYzFiLCAweDA3NmU1MGViKSwKLSAgV1RDUCgweDdmYzU5NDBlLCAweDA3YTNkNmYwKSwgV1RDUCgweDdmYzI1NTk2LCAweDA3ZDk1YjllKSwgV1RDUCgweDdmYmYwMGIzLCAweDA4MGVkZWVjKSwgV1RDUCgweDdmYmI5NTY3LCAweDA4NDQ2MGNmKSwKLSAgV1RDUCgweDdmYjgxM2IwLCAweDA4NzllMTQwKSwgV1RDUCgweDdmYjQ3YjkxLCAweDA4YWY2MDMzKSwgV1RDUCgweDdmYjBjZDBhLCAweDA4ZTRkZGEwKSwgV1RDUCgweDdmYWQwODFiLCAweDA5MWE1OTdlKSwKLSAgV1RDUCgweDdmYTkyY2M1LCAweDA5NGZkM2MzKSwgV1RDUCgweDdmYTUzYjA5LCAweDA5ODU0YzY2KSwgV1RDUCgweDdmYTEzMmU4LCAweDA5YmFjMzVkKSwgV1RDUCgweDdmOWQxNDYxLCAweDA5ZjAzODlmKSwKLSAgV1RDUCgweDdmOThkZjc3LCAweDBhMjVhYzIzKSwgV1RDUCgweDdmOTQ5NDI5LCAweDBhNWIxZGRlKSwgV1RDUCgweDdmOTAzMjc5LCAweDBhOTA4ZGM5KSwgV1RDUCgweDdmOGJiYTY2LCAweDBhYzVmYmQ5KSwKLSAgV1RDUCgweDdmODcyYmYzLCAweDBhZmI2ODA1KSwgV1RDUCgweDdmODI4NzFmLCAweDBiMzBkMjQ0KSwgV1RDUCgweDdmN2RjYmVjLCAweDBiNjYzYThjKSwgV1RDUCgweDdmNzhmYTViLCAweDBiOWJhMGQ1KSwKLSAgV1RDUCgweDdmNzQxMjZiLCAweDBiZDEwNTEzKSwgV1RDUCgweDdmNmYxNDFmLCAweDBjMDY2NzQwKSwgV1RDUCgweDdmNjlmZjc2LCAweDBjM2JjNzRmKSwgV1RDUCgweDdmNjRkNDczLCAweDBjNzEyNTNhKSwKLSAgV1RDUCgweDdmNWY5MzE1LCAweDBjYTY4MGY1KSwgV1RDUCgweDdmNWEzYjVlLCAweDBjZGJkYTc5KSwgV1RDUCgweDdmNTRjZDRmLCAweDBkMTEzMWJhKSwgV1RDUCgweDdmNGY0OGU4LCAweDBkNDY4NmIxKSwKLSAgV1RDUCgweDdmNDlhZTJhLCAweDBkN2JkOTU0KSwgV1RDUCgweDdmNDNmZDE4LCAweDBkYjEyOTk5KSwgV1RDUCgweDdmM2UzNWIwLCAweDBkZTY3Nzc2KSwgV1RDUCgweDdmMzg1N2Y2LCAweDBlMWJjMmU0KSwKLSAgV1RDUCgweDdmMzI2M2U5LCAweDBlNTEwYmQ4KSwgV1RDUCgweDdmMmM1OThhLCAweDBlODY1MjQ4KSwgV1RDUCgweDdmMjYzOGRiLCAweDBlYmI5NjJjKSwgV1RDUCgweDdmMjAwMWRkLCAweDBlZjBkNzdiKSwKLSAgV1RDUCgweDdmMTliNDkxLCAweDBmMjYxNjJhKSwgV1RDUCgweDdmMTM1MGY4LCAweDBmNWI1MjMxKSwgV1RDUCgweDdmMGNkNzEyLCAweDBmOTA4Yjg2KSwgV1RDUCgweDdmMDY0NmUyLCAweDBmYzVjMjIwKSwKLSAgV1RDUCgweDdlZmZhMDY5LCAweDBmZmFmNWY2KSwgV1RDUCgweDdlZjhlM2E2LCAweDEwMzAyNmZlKSwgV1RDUCgweDdlZjIxMDlkLCAweDEwNjU1NTJlKSwgV1RDUCgweDdlZWIyNzRkLCAweDEwOWE4MDdlKSwKLSAgV1RDUCgweDdlZTQyN2I5LCAweDEwY2ZhOGU1KSwgV1RDUCgweDdlZGQxMWUxLCAweDExMDRjZTU4KSwgV1RDUCgweDdlZDVlNWM2LCAweDExMzlmMGNmKSwgV1RDUCgweDdlY2VhMzZiLCAweDExNmYxMDQwKSwKLSAgV1RDUCgweDdlYzc0YWNmLCAweDExYTQyY2EyKSwgV1RDUCgweDdlYmZkYmY1LCAweDExZDk0NWViKSwgV1RDUCgweDdlYjg1NmRlLCAweDEyMGU1YzEzKSwgV1RDUCgweDdlYjBiYjhhLCAweDEyNDM2ZjEwKSwKLSAgV1RDUCgweDdlYTkwOWZjLCAweDEyNzg3ZWQ4KSwgV1RDUCgweDdlYTE0MjM1LCAweDEyYWQ4YjYzKSwgV1RDUCgweDdlOTk2NDM2LCAweDEyZTI5NGE3KSwgV1RDUCgweDdlOTE3MDAwLCAweDEzMTc5YTliKSwKLSAgV1RDUCgweDdlODk2NTk1LCAweDEzNGM5ZDM0KSwgV1RDUCgweDdlODE0NGY2LCAweDEzODE5YzZjKSwgV1RDUCgweDdlNzkwZTI1LCAweDEzYjY5ODM2KSwgV1RDUCgweDdlNzBjMTI0LCAweDEzZWI5MDhjKSwKLSAgV1RDUCgweDdlNjg1ZGYyLCAweDE0MjA4NTYzKSwgV1RDUCgweDdlNWZlNDkzLCAweDE0NTU3NmIxKSwgV1RDUCgweDdlNTc1NTA4LCAweDE0OGE2NDZlKSwgV1RDUCgweDdlNGVhZjUxLCAweDE0YmY0ZTkxKSwKLSAgV1RDUCgweDdlNDVmMzcxLCAweDE0ZjQzNTEwKSwgV1RDUCgweDdlM2QyMTY5LCAweDE1MjkxN2UxKSwgV1RDUCgweDdlMzQzOTNiLCAweDE1NWRmNmZjKSwgV1RDUCgweDdlMmIzYWU4LCAweDE1OTJkMjU3KSwKLSAgV1RDUCgweDdlMjIyNjcyLCAweDE1YzdhOWVhKSwgV1RDUCgweDdlMThmYmRhLCAweDE1ZmM3ZGFhKSwgV1RDUCgweDdlMGZiYjIyLCAweDE2MzE0ZDhlKSwgV1RDUCgweDdlMDY2NDRjLCAweDE2NjYxOThkKSwKLSAgV1RDUCgweDdkZmNmNzU5LCAweDE2OWFlMTlmKSwgV1RDUCgweDdkZjM3NDRiLCAweDE2Y2ZhNWI5KSwgV1RDUCgweDdkZTlkYjIzLCAweDE3MDQ2NWQyKSwgV1RDUCgweDdkZTAyYmU0LCAweDE3MzkyMWUyKSwKLSAgV1RDUCgweDdkZDY2NjhmLCAweDE3NmRkOWRlKSwgV1RDUCgweDdkY2M4YjI1LCAweDE3YTI4ZGJlKSwgV1RDUCgweDdkYzI5OWE5LCAweDE3ZDczZDc5KSwgV1RDUCgweDdkYjg5MjFjLCAweDE4MGJlOTA0KSwKLSAgV1RDUCgweDdkYWU3NDdmLCAweDE4NDA5MDU4KSwgV1RDUCgweDdkYTQ0MGQ2LCAweDE4NzUzMzZhKSwgV1RDUCgweDdkOTlmNzIxLCAweDE4YTlkMjMxKSwgV1RDUCgweDdkOGY5NzYyLCAweDE4ZGU2Y2E1KSwKLSAgV1RDUCgweDdkODUyMTljLCAweDE5MTMwMmJjKSwgV1RDUCgweDdkN2E5NWNmLCAweDE5NDc5NDZjKSwgV1RDUCgweDdkNmZmM2ZlLCAweDE5N2MyMWFkKSwgV1RDUCgweDdkNjUzYzJiLCAweDE5YjBhYTc1KSwKLSAgV1RDUCgweDdkNWE2ZTU3LCAweDE5ZTUyZWJiKSwgV1RDUCgweDdkNGY4YTg1LCAweDFhMTlhZTc2KSwgV1RDUCgweDdkNDQ5MGI2LCAweDFhNGUyOTlkKSwgV1RDUCgweDdkMzk4MGVjLCAweDFhODJhMDI2KSwKLSAgV1RDUCgweDdkMmU1YjJhLCAweDFhYjcxMjA4KSwgV1RDUCgweDdkMjMxZjcwLCAweDFhZWI3ZjNhKSwgV1RDUCgweDdkMTdjZGMyLCAweDFiMWZlN2IzKSwgV1RDUCgweDdkMGM2NjIxLCAweDFiNTQ0YjZhKSwKLSAgV1RDUCgweDdkMDBlODhmLCAweDFiODhhYTU1KSwgV1RDUCgweDdjZjU1NTBlLCAweDFiYmQwNDZjKSwgV1RDUCgweDdjZTlhYmExLCAweDFiZjE1OWE0KSwgV1RDUCgweDdjZGRlYzQ4LCAweDFjMjVhOWY2KSwKLSAgV1RDUCgweDdjZDIxNzA3LCAweDFjNTlmNTU3KSwgV1RDUCgweDdjYzYyYmRmLCAweDFjOGUzYmJlKSwgV1RDUCgweDdjYmEyYWQzLCAweDFjYzI3ZDIzKSwgV1RDUCgweDdjYWUxM2U0LCAweDFjZjZiOTdjKSwKLSAgV1RDUCgweDdjYTFlNzE1LCAweDFkMmFmMGMxKSwgV1RDUCgweDdjOTVhNDY3LCAweDFkNWYyMmU3KSwgV1RDUCgweDdjODk0YmRlLCAweDFkOTM0ZmU1KSwgV1RDUCgweDdjN2NkZDdiLCAweDFkYzc3N2IzKSwKLSAgV1RDUCgweDdjNzA1OTQwLCAweDFkZmI5YTQ4KSwgV1RDUCgweDdjNjNiZjJmLCAweDFlMmZiNzlhKSwgV1RDUCgweDdjNTcwZjRiLCAweDFlNjNjZmEwKSwgV1RDUCgweDdjNGE0OTk2LCAweDFlOTdlMjUxKSwKLSAgV1RDUCgweDdjM2Q2ZTEzLCAweDFlY2JlZmE0KSwgV1RDUCgweDdjMzA3Y2MyLCAweDFlZmZmNzhmKSwgV1RDUCgweDdjMjM3NWE4LCAweDFmMzNmYTBhKSwgV1RDUCgweDdjMTY1OGM1LCAweDFmNjdmNzBiKSwKLSAgV1RDUCgweDdjMDkyNjFkLCAweDFmOWJlZThhKSwgV1RDUCgweDdiZmJkZGIxLCAweDFmY2ZlMDdkKSwgV1RDUCgweDdiZWU3Zjg1LCAweDIwMDNjY2RiKSwgV1RDUCgweDdiZTEwYjk5LCAweDIwMzdiMzliKSwKLSAgV1RDUCgweDdiZDM4MWYxLCAweDIwNmI5NGI0KSwgV1RDUCgweDdiYzVlMjkwLCAweDIwOWY3MDFjKSwgV1RDUCgweDdiYjgyZDc2LCAweDIwZDM0NWNjKSwgV1RDUCgweDdiYWE2MmE4LCAweDIxMDcxNWI4KSwKLSAgV1RDUCgweDdiOWM4MjI2LCAweDIxM2FkZmRhKSwgV1RDUCgweDdiOGU4YmY1LCAweDIxNmVhNDI2KSwgV1RDUCgweDdiODA4MDE1LCAweDIxYTI2Mjk1KSwgV1RDUCgweDdiNzI1ZThhLCAweDIxZDYxYjFlKSwKLSAgV1RDUCgweDdiNjQyNzU2LCAweDIyMDljZGI2KSwgV1RDUCgweDdiNTVkYTdjLCAweDIyM2Q3YTU1KSwgV1RDUCgweDdiNDc3N2ZlLCAweDIyNzEyMGYzKSwgV1RDUCgweDdiMzhmZmRlLCAweDIyYTRjMTg1KSwKLSAgV1RDUCgweDdiMmE3MjFmLCAweDIyZDg1YzA0KSwgV1RDUCgweDdiMWJjZWM0LCAweDIzMGJmMDY1KSwgV1RDUCgweDdiMGQxNWQwLCAweDIzM2Y3ZWEwKSwgV1RDUCgweDdhZmU0NzQ0LCAweDIzNzMwNmFiKSwKLSAgV1RDUCgweDdhZWY2MzIzLCAweDIzYTY4ODdmKSwgV1RDUCgweDdhZTA2OTcxLCAweDIzZGEwNDExKSwgV1RDUCgweDdhZDE1YTJmLCAweDI0MGQ3OTU4KSwgV1RDUCgweDdhYzIzNTYxLCAweDI0NDBlODRkKSwKLSAgV1RDUCgweDdhYjJmYjA5LCAweDI0NzQ1MGU0KSwgV1RDUCgweDdhYTNhYjI5LCAweDI0YTdiMzE3KSwgV1RDUCgweDdhOTQ0NWM1LCAweDI0ZGIwZWRiKSwgV1RDUCgweDdhODRjYWRlLCAweDI1MGU2NDI3KSwKLSAgV1RDUCgweDdhNzUzYTc5LCAweDI1NDFiMmYzKSwgV1RDUCgweDdhNjU5NDk2LCAweDI1NzRmYjM2KSwgV1RDUCgweDdhNTVkOTNhLCAweDI1YTgzY2U2KSwgV1RDUCgweDdhNDYwODY3LCAweDI1ZGI3N2ZhKSwKLSAgV1RDUCgweDdhMzYyMjIwLCAweDI2MGVhYzZhKSwgV1RDUCgweDdhMjYyNjY4LCAweDI2NDFkYTJkKSwgV1RDUCgweDdhMTYxNTQwLCAweDI2NzUwMTM5KSwgV1RDUCgweDdhMDVlZWFkLCAweDI2YTgyMTg2KSwKLSAgV1RDUCgweDc5ZjViMmIxLCAweDI2ZGIzYjBhKSwgV1RDUCgweDc5ZTU2MTRmLCAweDI3MGU0ZGJkKSwgV1RDUCgweDc5ZDRmYTg5LCAweDI3NDE1OTk2KSwgV1RDUCgweDc5YzQ3ZTYzLCAweDI3NzQ1ZThjKSwKLSAgV1RDUCgweDc5YjNlY2UwLCAweDI3YTc1Yzk1KSwgV1RDUCgweDc5YTM0NjAyLCAweDI3ZGE1M2E5KSwgV1RDUCgweDc5OTI4OWNjLCAweDI4MGQ0M2JmKSwgV1RDUCgweDc5ODFiODQxLCAweDI4NDAyY2NlKSwKLSAgV1RDUCgweDc5NzBkMTY1LCAweDI4NzMwZWNkKSwgV1RDUCgweDc5NWZkNTNhLCAweDI4YTVlOWI0KSwgV1RDUCgweDc5NGVjM2MzLCAweDI4ZDhiZDc4KSwgV1RDUCgweDc5M2Q5ZDAzLCAweDI5MGI4YTEyKSwKLSAgV1RDUCgweDc5MmM2MGZlLCAweDI5M2U0Zjc4KSwgV1RDUCgweDc5MWIwZmI1LCAweDI5NzEwZGExKSwgV1RDUCgweDc5MDlhOTJkLCAweDI5YTNjNDg1KSwgV1RDUCgweDc4ZjgyZDY4LCAweDI5ZDY3NDFiKSwKLSAgV1RDUCgweDc4ZTY5YzY5LCAweDJhMDkxYzU5KSwgV1RDUCgweDc4ZDRmNjM0LCAweDJhM2JiZDM3KSwgV1RDUCgweDc4YzMzYWNiLCAweDJhNmU1NmFjKSwgV1RDUCgweDc4YjE2YTMyLCAweDJhYTBlOGIwKSwKLSAgV1RDUCgweDc4OWY4NDZiLCAweDJhZDM3MzM4KSwgV1RDUCgweDc4OGQ4OTdiLCAweDJiMDVmNjNkKSwgV1RDUCgweDc4N2I3OTYzLCAweDJiMzg3MWI1KSwgV1RDUCgweDc4Njk1NDI4LCAweDJiNmFlNTk4KSwKLSAgV1RDUCgweDc4NTcxOWNjLCAweDJiOWQ1MWRkKSwgV1RDUCgweDc4NDRjYTUzLCAweDJiY2ZiNjdiKSwgV1RDUCgweDc4MzI2NWMwLCAweDJjMDIxMzY5KSwgV1RDUCgweDc4MWZlYzE1LCAweDJjMzQ2ODllKSwKLSAgV1RDUCgweDc4MGQ1ZDU3LCAweDJjNjZiNjExKSwgV1RDUCgweDc3ZmFiOTg5LCAweDJjOThmYmJhKSwgV1RDUCgweDc3ZTgwMGFkLCAweDJjY2IzOTkwKSwgV1RDUCgweDc3ZDUzMmM3LCAweDJjZmQ2ZjhhKSwKLSAgV1RDUCgweDc3YzI0ZmRiLCAweDJkMmY5ZDlmKSwgV1RDUCgweDc3YWY1N2ViLCAweDJkNjFjM2M3KSwgV1RDUCgweDc3OWM0YWZjLCAweDJkOTNlMWY4KSwgV1RDUCgweDc3ODkyOTEwLCAweDJkYzVmODI5KSwKLSAgV1RDUCgweDc3NzVmMjJhLCAweDJkZjgwNjUzKSwgV1RDUCgweDc3NjJhNjRmLCAweDJlMmEwYzZjKSwgV1RDUCgweDc3NGY0NTgxLCAweDJlNWMwYTZiKSwgV1RDUCgweDc3M2JjZmM0LCAweDJlOGUwMDQ4KSwKLSAgV1RDUCgweDc3Mjg0NTFjLCAweDJlYmZlZGZhKSwgV1RDUCgweDc3MTRhNThiLCAweDJlZjFkMzc3KSwgV1RDUCgweDc3MDBmMTE1LCAweDJmMjNiMGI5KSwgV1RDUCgweDc2ZWQyN2JlLCAweDJmNTU4NWI1KSwKLSAgV1RDUCgweDc2ZDk0OTg5LCAweDJmODc1MjYyKSwgV1RDUCgweDc2YzU1Njc5LCAweDJmYjkxNmI5KSwgV1RDUCgweDc2YjE0ZTkzLCAweDJmZWFkMmIwKSwgV1RDUCgweDc2OWQzMWQ5LCAweDMwMWM4NjNmKSwKLSAgV1RDUCgweDc2ODkwMDUwLCAweDMwNGUzMTVkKSwgV1RDUCgweDc2NzRiOWZhLCAweDMwN2ZkNDAxKSwgV1RDUCgweDc2NjA1ZWRiLCAweDMwYjE2ZTIzKSwgV1RDUCgweDc2NGJlZWY4LCAweDMwZTJmZmI5KSwKLSAgV1RDUCgweDc2Mzc2YTUyLCAweDMxMTQ4OGJjKSwgV1RDUCgweDc2MjJkMGVmLCAweDMxNDYwOTIyKSwgV1RDUCgweDc2MGUyMmQxLCAweDMxNzc4MGUyKSwgV1RDUCgweDc1Zjk1ZmZjLCAweDMxYThlZmY1KSwKLSAgV1RDUCgweDc1ZTQ4ODc0LCAweDMxZGE1NjUxKSwgV1RDUCgweDc1Y2Y5YzNkLCAweDMyMGJiM2VlKSwgV1RDUCgweDc1YmE5YjVhLCAweDMyM2QwOGMzKSwgV1RDUCgweDc1YTU4NWNmLCAweDMyNmU1NGM3KSwKLSAgV1RDUCgweDc1OTA1YmEwLCAweDMyOWY5N2YzKSwgV1RDUCgweDc1N2IxY2NmLCAweDMyZDBkMjNjKSwgV1RDUCgweDc1NjVjOTYyLCAweDMzMDIwMzliKSwgV1RDUCgweDc1NTA2MTVjLCAweDMzMzMyYzA2KSwKLSAgV1RDUCgweDc1M2FlNGMwLCAweDMzNjQ0Yjc2KSwgV1RDUCgweDc1MjU1MzkyLCAweDMzOTU2MWUxKSwgV1RDUCgweDc1MGZhZGQ3LCAweDMzYzY2ZjQwKSwgV1RDUCgweDc0ZjlmMzkxLCAweDMzZjc3Mzg4KSwKLSAgV1RDUCgweDc0ZTQyNGM1LCAweDM0Mjg2ZWIzKSwgV1RDUCgweDc0Y2U0MTc3LCAweDM0NTk2MGI3KSwgV1RDUCgweDc0Yjg0OWFhLCAweDM0OGE0OThiKSwgV1RDUCgweDc0YTIzZDYyLCAweDM0YmIyOTI3KSwKLSAgV1RDUCgweDc0OGMxY2E0LCAweDM0ZWJmZjgzKSwgV1RDUCgweDc0NzVlNzcyLCAweDM1MWNjYzk2KSwgV1RDUCgweDc0NWY5ZGQxLCAweDM1NGQ5MDU3KSwgV1RDUCgweDc0NDkzZmM1LCAweDM1N2U0YWJlKSwKLSAgV1RDUCgweDc0MzJjZDUxLCAweDM1YWVmYmMyKSwgV1RDUCgweDc0MWM0NjdiLCAweDM1ZGZhMzVhKSwgV1RDUCgweDc0MDVhYjQ1LCAweDM2MTA0MTdmKSwgV1RDUCgweDczZWVmYmIzLCAweDM2NDBkNjI3KSwKLSAgV1RDUCgweDczZDgzN2NhLCAweDM2NzE2MTRiKSwgV1RDUCgweDczYzE1ZjhkLCAweDM2YTFlMmUwKSwgV1RDUCgweDczYWE3MzAxLCAweDM2ZDI1YWUwKSwgV1RDUCgweDczOTM3MjJhLCAweDM3MDJjOTQyKSwKLSAgV1RDUCgweDczN2M1ZDBiLCAweDM3MzMyZGZkKSwgV1RDUCgweDczNjUzM2E5LCAweDM3NjM4OTA4KSwgV1RDUCgweDczNGRmNjA3LCAweDM3OTNkYTViKSwgV1RDUCgweDczMzZhNDJiLCAweDM3YzQyMWVlKSwKLSAgV1RDUCgweDczMWYzZTE3LCAweDM3ZjQ1ZmI3KSwgV1RDUCgweDczMDdjM2QwLCAweDM4MjQ5M2IwKSwgV1RDUCgweDcyZjAzNTVhLCAweDM4NTRiZGNmKSwgV1RDUCgweDcyZDg5MmJhLCAweDM4ODRkZTBiKSwKLSAgV1RDUCgweDcyYzBkYmYzLCAweDM4YjRmNDVkKSwgV1RDUCgweDcyYTkxMTA5LCAweDM4ZTUwMGJjKSwgV1RDUCgweDcyOTEzMjAxLCAweDM5MTUwMzFmKSwgV1RDUCgweDcyNzkzZWRmLCAweDM5NDRmYjdlKSwKLSAgV1RDUCgweDcyNjEzN2E4LCAweDM5NzRlOWQwKSwgV1RDUCgweDcyNDkxYzVlLCAweDM5YTRjZTBlKSwgV1RDUCgweDcyMzBlZDA3LCAweDM5ZDRhODJmKSwgV1RDUCgweDcyMThhOWE3LCAweDNhMDQ3ODJhKSwKLSAgV1RDUCgweDcyMDA1MjQyLCAweDNhMzQzZGY3KSwgV1RDUCgweDcxZTdlNmRjLCAweDNhNjNmOThkKSwgV1RDUCgweDcxY2Y2NzdhLCAweDNhOTNhYWU1KSwgV1RDUCgweDcxYjZkNDIwLCAweDNhYzM1MWY2KSwKLSAgV1RDUCgweDcxOWUyY2QyLCAweDNhZjJlZWI3KSwgV1RDUCgweDcxODU3MTk1LCAweDNiMjI4MTIwKSwgV1RDUCgweDcxNmNhMjZjLCAweDNiNTIwOTJhKSwgV1RDUCgweDcxNTNiZjVkLCAweDNiODE4NmNhKSwKLSAgV1RDUCgweDcxM2FjODZiLCAweDNiYjBmOWZhKSwgV1RDUCgweDcxMjFiZDljLCAweDNiZTA2MmIwKSwgV1RDUCgweDcxMDg5ZWYyLCAweDNjMGZjMGU2KSwgV1RDUCgweDcwZWY2Yzc0LCAweDNjM2YxNDkxKSwKLSAgV1RDUCgweDcwZDYyNjI1LCAweDNjNmU1ZGFhKSwgV1RDUCgweDcwYmNjYzA5LCAweDNjOWQ5YzI4KSwgV1RDUCgweDcwYTM1ZTI1LCAweDNjY2NkMDA0KSwgV1RDUCgweDcwODlkYzdlLCAweDNjZmJmOTM1KSwKLSAgV1RDUCgweDcwNzA0NzE4LCAweDNkMmIxN2IzKSwgV1RDUCgweDcwNTY5ZGY4LCAweDNkNWEyYjc1KSwgV1RDUCgweDcwM2NlMTIyLCAweDNkODkzNDc0KSwgV1RDUCgweDcwMjMxMDlhLCAweDNkYjgzMmE2KSwKLSAgV1RDUCgweDcwMDkyYzY1LCAweDNkZTcyNjA0KSwgV1RDUCgweDZmZWYzNDg4LCAweDNlMTYwZTg1KSwgV1RDUCgweDZmZDUyOTA3LCAweDNlNDRlYzIyKSwgV1RDUCgweDZmYmIwOWU3LCAweDNlNzNiZWQyKSwKLSAgV1RDUCgweDZmYTBkNzJjLCAweDNlYTI4NjhjKSwgV1RDUCgweDZmODY5MGRiLCAweDNlZDE0MzQ5KSwgV1RDUCgweDZmNmMzNmY4LCAweDNlZmZmNTAxKSwgV1RDUCgweDZmNTFjOTg5LCAweDNmMmU5YmFiKSwKLSAgV1RDUCgweDZmMzc0ODkxLCAweDNmNWQzNzNlKSwgV1RDUCgweDZmMWNiNDE2LCAweDNmOGJjN2I0KSwgV1RDUCgweDZmMDIwYzFjLCAweDNmYmE0ZDAzKSwgV1RDUCgweDZlZTc1MGE4LCAweDNmZThjNzI0KSwKLSAgV1RDUCgweDZlY2M4MWJlLCAweDQwMTczNjBlKSwgV1RDUCgweDZlYjE5ZjY0LCAweDQwNDU5OWI5KSwgV1RDUCgweDZlOTZhOTlkLCAweDQwNzNmMjFkKSwgV1RDUCgweDZlN2JhMDZmLCAweDQwYTIzZjMyKSwKLSAgV1RDUCgweDZlNjA4M2RlLCAweDQwZDA4MGYwKSwgV1RDUCgweDZlNDU1M2VmLCAweDQwZmViNzRmKSwgV1RDUCgweDZlMmExMGE4LCAweDQxMmNlMjQ2KSwgV1RDUCgweDZlMGViYTBjLCAweDQxNWIwMWNlKSwKLSAgV1RDUCgweDZkZjM1MDIwLCAweDQxODkxNWRlKSwgV1RDUCgweDZkZDdkMmVhLCAweDQxYjcxZTZmKSwgV1RDUCgweDZkYmM0MjZlLCAweDQxZTUxYjc3KSwgV1RDUCgweDZkYTA5ZWIxLCAweDQyMTMwY2YwKSwKLSAgV1RDUCgweDZkODRlN2I3LCAweDQyNDBmMmQxKSwgV1RDUCgweDZkNjkxZDg3LCAweDQyNmVjZDEyKSwgV1RDUCgweDZkNGQ0MDIzLCAweDQyOWM5YmFiKSwgV1RDUCgweDZkMzE0ZjkzLCAweDQyY2E1ZTk0KSwKLSAgV1RDUCgweDZkMTU0YmQ5LCAweDQyZjgxNWM1KSwgV1RDUCgweDZjZjkzNGZjLCAweDQzMjVjMTM1KSwgV1RDUCgweDZjZGQwYjAwLCAweDQzNTM2MGRlKSwgV1RDUCgweDZjYzBjZGVhLCAweDQzODBmNGI3KSwKLSAgV1RDUCgweDZjYTQ3ZGJmLCAweDQzYWU3Y2I3KSwgV1RDUCgweDZjODgxYTg0LCAweDQzZGJmOGQ3KSwgV1RDUCgweDZjNmJhNDNlLCAweDQ0MDk2OTEwKSwgV1RDUCgweDZjNGYxYWYyLCAweDQ0MzZjZDU4KSwKLSAgV1RDUCgweDZjMzI3ZWE2LCAweDQ0NjQyNWE4KSwgV1RDUCgweDZjMTVjZjVkLCAweDQ0OTE3MWY4KSwgV1RDUCgweDZiZjkwZDFkLCAweDQ0YmViMjQwKSwgV1RDUCgweDZiZGMzN2ViLCAweDQ0ZWJlNjc5KSwKLSAgV1RDUCgweDZiYmY0ZmNkLCAweDQ1MTkwZTk5KSwgV1RDUCgweDZiYTI1NGM3LCAweDQ1NDYyYTlhKSwgV1RDUCgweDZiODU0NmRlLCAweDQ1NzMzYTczKSwgV1RDUCgweDZiNjgyNjE3LCAweDQ1YTAzZTFkKSwKLSAgV1RDUCgweDZiNGFmMjc5LCAweDQ1Y2QzNThmKSwgV1RDUCgweDZiMmRhYzA2LCAweDQ1ZmEyMGMyKSwgV1RDUCgweDZiMTA1MmM2LCAweDQ2MjZmZmFlKSwgV1RDUCgweDZhZjJlNmJjLCAweDQ2NTNkMjRiKSwKLSAgV1RDUCgweDZhZDU2N2VmLCAweDQ2ODA5ODkxKSwgV1RDUCgweDZhYjdkNjYzLCAweDQ2YWQ1Mjc4KSwgV1RDUCgweDZhOWEzMjFkLCAweDQ2ZDlmZmY4KSwgV1RDUCgweDZhN2M3YjIzLCAweDQ3MDZhMTBhKSwKLSAgV1RDUCgweDZhNWViMTdhLCAweDQ3MzMzNWE1KSwgV1RDUCgweDZhNDBkNTI3LCAweDQ3NWZiZGMzKSwgV1RDUCgweDZhMjJlNjMwLCAweDQ3OGMzOTVhKSwgV1RDUCgweDZhMDRlNDk5LCAweDQ3YjhhODY0KSwKLSAgV1RDUCgweDY5ZTZkMDY3LCAweDQ3ZTUwYWQ4KSwgV1RDUCgweDY5YzhhOWExLCAweDQ4MTE2MGFlKSwgV1RDUCgweDY5YWE3MDRjLCAweDQ4M2RhOWUwKSwgV1RDUCgweDY5OGMyNDZjLCAweDQ4NjllNjY1KSwKLSAgV1RDUCgweDY5NmRjNjA3LCAweDQ4OTYxNjM1KSwgV1RDUCgweDY5NGY1NTIzLCAweDQ4YzIzOTQ5KSwgV1RDUCgweDY5MzBkMWM0LCAweDQ4ZWU0Zjk4KSwgV1RDUCgweDY5MTIzYmYxLCAweDQ5MWE1OTFjKSwKLSAgV1RDUCgweDY4ZjM5M2FlLCAweDQ5NDY1NWNjKSwgV1RDUCgweDY4ZDRkOTAwLCAweDQ5NzI0NWExKSwgV1RDUCgweDY4YjYwYmVlLCAweDQ5OWUyODkyKSwgV1RDUCgweDY4OTcyYzdkLCAweDQ5YzlmZTk5KSwKLSAgV1RDUCgweDY4NzgzYWIxLCAweDQ5ZjVjN2FlKSwgV1RDUCgweDY4NTkzNjkxLCAweDRhMjE4M2M4KSwgV1RDUCgweDY4M2EyMDIyLCAweDRhNGQzMmUxKSwgV1RDUCgweDY4MWFmNzZhLCAweDRhNzhkNGYwKSwKLSAgV1RDUCgweDY3ZmJiYzZkLCAweDRhYTQ2OWVlKSwgV1RDUCgweDY3ZGM2ZjMxLCAweDRhY2ZmMWQzKSwgV1RDUCgweDY3YmQwZmJkLCAweDRhZmI2Yzk4KSwgV1RDUCgweDY3OWQ5ZTE0LCAweDRiMjZkYTM1KSwKLSAgV1RDUCgweDY3N2UxYTNlLCAweDRiNTIzYWEyKSwgV1RDUCgweDY3NWU4NDNlLCAweDRiN2Q4ZGQ4KSwgV1RDUCgweDY3M2VkYzFjLCAweDRiYThkM2NmKSwgV1RDUCgweDY3MWYyMWRjLCAweDRiZDQwYzgwKSwKLSAgV1RDUCgweDY2ZmY1NTg0LCAweDRiZmYzN2UyKSwgV1RDUCgweDY2ZGY3NzFhLCAweDRjMmE1NWVmKSwgV1RDUCgweDY2YmY4NmEzLCAweDRjNTU2NjlmKSwgV1RDUCgweDY2OWY4NDI1LCAweDRjODA2OWVhKSwKLSAgV1RDUCgweDY2N2Y2ZmE1LCAweDRjYWI1ZmM5KSwgV1RDUCgweDY2NWY0OTI5LCAweDRjZDY0ODM0KSwgV1RDUCgweDY2M2YxMGI3LCAweDRkMDEyMzI0KSwgV1RDUCgweDY2MWVjNjU0LCAweDRkMmJmMDkxKSwKLSAgV1RDUCgweDY1ZmU2YTA2LCAweDRkNTZiMDczKSwgV1RDUCgweDY1ZGRmYmQzLCAweDRkODE2MmM0KSwgV1RDUCgweDY1YmQ3YmMwLCAweDRkYWMwNzdiKSwgV1RDUCgweDY1OWNlOWQ0LCAweDRkZDY5ZTkyKSwKLSAgV1RDUCgweDY1N2M0NjEzLCAweDRlMDEyODAwKSwgV1RDUCgweDY1NWI5MDgzLCAweDRlMmJhM2JlKSwgV1RDUCgweDY1M2FjOTJiLCAweDRlNTYxMWM1KSwgV1RDUCgweDY1MTlmMDEwLCAweDRlODA3MjBlKSwKLSAgV1RDUCgweDY0ZjkwNTM4LCAweDRlYWFjNDkwKSwgV1RDUCgweDY0ZDgwOGE4LCAweDRlZDUwOTQ1KSwgV1RDUCgweDY0YjZmYTY2LCAweDRlZmY0MDI1KSwgV1RDUCgweDY0OTVkYTc5LCAweDRmMjk2OTI4KSwKLSAgV1RDUCgweDY0NzRhOGU1LCAweDRmNTM4NDQ4KSwgV1RDUCgweDY0NTM2NWIyLCAweDRmN2Q5MTdjKSwgV1RDUCgweDY0MzIxMGU0LCAweDRmYTc5MGJlKSwgV1RDUCgweDY0MTBhYTgxLCAweDRmZDE4MjA2KSwKLSAgV1RDUCgweDYzZWYzMjkwLCAweDRmZmI2NTRkKSwgV1RDUCgweDYzY2RhOTE2LCAweDUwMjUzYThiKSwgV1RDUCgweDYzYWMwZTE5LCAweDUwNGYwMWJhKSwgV1RDUCgweDYzOGE2MTllLCAweDUwNzhiYWQxKSwKLSAgV1RDUCgweDYzNjhhM2FkLCAweDUwYTI2NWM5KSwgV1RDUCgweDYzNDZkNDRiLCAweDUwY2MwMjljKSwgV1RDUCgweDYzMjRmMzdkLCAweDUwZjU5MTQxKSwgV1RDUCgweDYzMDMwMTRhLCAweDUxMWYxMWIyKSwKLSAgV1RDUCgweDYyZTBmZGI4LCAweDUxNDg4M2U3KSwgV1RDUCgweDYyYmVlOGNjLCAweDUxNzFlN2Q5KSwgV1RDUCgweDYyOWNjMjhjLCAweDUxOWIzZDgwKSwgV1RDUCgweDYyN2E4YjAwLCAweDUxYzQ4NGQ2KSwKLSAgV1RDUCgweDYyNTg0MjJjLCAweDUxZWRiZGQ0KSwgV1RDUCgweDYyMzVlODE2LCAweDUyMTZlODcxKSwgV1RDUCgweDYyMTM3Y2M1LCAweDUyNDAwNGE3KSwgV1RDUCgweDYxZjEwMDNmLCAweDUyNjkxMjZlKSwKLSAgV1RDUCgweDYxY2U3Mjg5LCAweDUyOTIxMWMwKSwgV1RDUCgweDYxYWJkM2FiLCAweDUyYmIwMjk1KSwgV1RDUCgweDYxODkyM2E5LCAweDUyZTNlNGU2KSwgV1RDUCgweDYxNjY2Mjg5LCAweDUzMGNiOGFjKSwKLSAgV1RDUCgweDYxNDM5MDUzLCAweDUzMzU3ZGRmKSwgV1RDUCgweDYxMjBhZDBkLCAweDUzNWUzNDc5KSwgV1RDUCgweDYwZmRiOGJiLCAweDUzODZkYzcyKSwgV1RDUCgweDYwZGFiMzY1LCAweDUzYWY3NWMzKSwKLSAgV1RDUCgweDYwYjc5ZDEwLCAweDUzZDgwMDY1KSwgV1RDUCgweDYwOTQ3NWMzLCAweDU0MDA3YzUxKSwgV1RDUCgweDYwNzEzZDg0LCAweDU0MjhlOTgwKSwgV1RDUCgweDYwNGRmNDU5LCAweDU0NTE0N2ViKSwKLSAgV1RDUCgweDYwMmE5YTQ4LCAweDU0Nzk5NzhhKSwgV1RDUCgweDYwMDcyZjU3LCAweDU0YTFkODU3KSwgV1RDUCgweDVmZTNiMzhkLCAweDU0Y2EwYTRiKSwgV1RDUCgweDVmYzAyNmYwLCAweDU0ZjIyZDVkKSwKLSAgV1RDUCgweDVmOWM4OTg3LCAweDU1MWE0MTg5KSwgV1RDUCgweDVmNzhkYjU2LCAweDU1NDI0NmM2KSwgV1RDUCgweDVmNTUxYzY1LCAweDU1NmEzZDBkKSwgV1RDUCgweDVmMzE0Y2JhLCAweDU1OTIyNDU3KSwKLSAgV1RDUCgweDVmMGQ2YzViLCAweDU1YjlmYzllKSwgV1RDUCgweDVlZTk3YjRmLCAweDU1ZTFjNWRhKSwgV1RDUCgweDVlYzU3OTliLCAweDU2MDk4MDA1KSwgV1RDUCgweDVlYTE2NzQ3LCAweDU2MzEyYjE3KSwKLSAgV1RDUCgweDVlN2Q0NDU4LCAweDU2NThjNzA5KSwgV1RDUCgweDVlNTkxMGQ0LCAweDU2ODA1M2Q1KSwgV1RDUCgweDVlMzRjY2MzLCAweDU2YTdkMTc0KSwgV1RDUCgweDVlMTA3ODJiLCAweDU2Y2YzZmRlKSwKLSAgV1RDUCgweDVkZWMxMzExLCAweDU2ZjY5ZjBkKSwgV1RDUCgweDVkYzc5ZDdjLCAweDU3MWRlZWZhKSwgV1RDUCgweDVkYTMxNzczLCAweDU3NDUyZjlkKSwgV1RDUCgweDVkN2U4MGZjLCAweDU3NmM2MGYxKSwKLSAgV1RDUCgweDVkNTlkYTFlLCAweDU3OTM4MmVlKSwgV1RDUCgweDVkMzUyMmRlLCAweDU3YmE5NThkKSwgV1RDUCgweDVkMTA1YjQ0LCAweDU3ZTE5OGM3KSwgV1RDUCgweDVjZWI4MzU1LCAweDU4MDg4Yzk2KSwKLSAgV1RDUCgweDVjYzY5YjE5LCAweDU4MmY3MGYzKSwgV1RDUCgweDVjYTFhMjk1LCAweDU4NTY0NWQ3KSwgV1RDUCgweDVjN2M5OWQxLCAweDU4N2QwYjNiKSwgV1RDUCgweDVjNTc4MGQzLCAweDU4YTNjMTE4KSwKLSAgV1RDUCgweDVjMzI1N2EwLCAweDU4Y2E2NzY3KSwgV1RDUCgweDVjMGQxZTQxLCAweDU4ZjBmZTIzKSwgV1RDUCgweDViZTdkNGJhLCAweDU5MTc4NTQzKSwgV1RDUCgweDViYzI3YjE0LCAweDU5M2RmY2MyKSwKLSAgV1RDUCgweDViOWQxMTU0LCAweDU5NjQ2NDk4KSwgV1RDUCgweDViNzc5NzgwLCAweDU5OGFiY2JlKSwgV1RDUCgweDViNTIwZGExLCAweDU5YjEwNTJmKSwgV1RDUCgweDViMmM3M2JiLCAweDU5ZDczZGUzKSwKLSAgV1RDUCgweDViMDZjOWQ2LCAweDU5ZmQ2NmQ0KSwgV1RDUCgweDVhZTEwZmY5LCAweDVhMjM3ZmZhKSwgV1RDUCgweDVhYmI0NjI5LCAweDVhNDk4OTUwKSwgV1RDUCgweDVhOTU2YzZlLCAweDVhNmY4MmNlKSwKK2NvbnN0IEZJWFBfU1RQIFNpbmVUYWJsZTEwMjRbXSA9IHsKKyAgICBTVENQKDB4N2ZmZmZmZmYsIDB4MDAwMDAwMDApLCBTVENQKDB4N2ZmZmY2MjEsIDB4MDAzMjQzZjUpLAorICAgIFNUQ1AoMHg3ZmZmZDg4NiwgMHgwMDY0ODdlMyksIFNUQ1AoMHg3ZmZmYTcyYywgMHgwMDk2Y2JjMSksCisgICAgU1RDUCgweDdmZmY2MjE2LCAweDAwYzkwZjg4KSwgU1RDUCgweDdmZmYwOTQzLCAweDAwZmI1MzMwKSwKKyAgICBTVENQKDB4N2ZmZTljYjIsIDB4MDEyZDk2YjEpLCBTVENQKDB4N2ZmZTFjNjUsIDB4MDE1ZmRhMDMpLAorICAgIFNUQ1AoMHg3ZmZkODg1YSwgMHgwMTkyMWQyMCksIFNUQ1AoMHg3ZmZjZTA5MywgMHgwMWM0NWZmZSksCisgICAgU1RDUCgweDdmZmMyNTBmLCAweDAxZjZhMjk3KSwgU1RDUCgweDdmZmI1NWNlLCAweDAyMjhlNGUyKSwKKyAgICBTVENQKDB4N2ZmYTcyZDEsIDB4MDI1YjI2ZDcpLCBTVENQKDB4N2ZmOTdjMTgsIDB4MDI4ZDY4NzApLAorICAgIFNUQ1AoMHg3ZmY4NzFhMiwgMHgwMmJmYTlhNCksIFNUQ1AoMHg3ZmY3NTM3MCwgMHgwMmYxZWE2YyksCisgICAgU1RDUCgweDdmZjYyMTgyLCAweDAzMjQyYWJmKSwgU1RDUCgweDdmZjRkYmQ5LCAweDAzNTY2YTk2KSwKKyAgICBTVENQKDB4N2ZmMzgyNzQsIDB4MDM4OGE5ZWEpLCBTVENQKDB4N2ZmMjE1NTMsIDB4MDNiYWU4YjIpLAorICAgIFNUQ1AoMHg3ZmYwOTQ3OCwgMHgwM2VkMjZlNiksIFNUQ1AoMHg3ZmVlZmZlMSwgMHgwNDFmNjQ4MCksCisgICAgU1RDUCgweDdmZWQ1NzkxLCAweDA0NTFhMTc3KSwgU1RDUCgweDdmZWI5Yjg1LCAweDA0ODNkZGMzKSwKKyAgICBTVENQKDB4N2ZlOWNiYzAsIDB4MDRiNjE5NWQpLCBTVENQKDB4N2ZlN2U4NDEsIDB4MDRlODU0M2UpLAorICAgIFNUQ1AoMHg3ZmU1ZjEwOCwgMHgwNTFhOGU1YyksIFNUQ1AoMHg3ZmUzZTYxNiwgMHgwNTRjYzdiMSksCisgICAgU1RDUCgweDdmZTFjNzZiLCAweDA1N2YwMDM1KSwgU1RDUCgweDdmZGY5NTA4LCAweDA1YjEzN2RmKSwKKyAgICBTVENQKDB4N2ZkZDRlZWMsIDB4MDVlMzZlYTkpLCBTVENQKDB4N2ZkYWY1MTksIDB4MDYxNWE0OGIpLAorICAgIFNUQ1AoMHg3ZmQ4ODc4ZSwgMHgwNjQ3ZDk3YyksIFNUQ1AoMHg3ZmQ2MDY0YywgMHgwNjdhMGQ3NiksCisgICAgU1RDUCgweDdmZDM3MTUzLCAweDA2YWM0MDZmKSwgU1RDUCgweDdmZDBjOGEzLCAweDA2ZGU3MjYyKSwKKyAgICBTVENQKDB4N2ZjZTBjM2UsIDB4MDcxMGEzNDUpLCBTVENQKDB4N2ZjYjNjMjMsIDB4MDc0MmQzMTEpLAorICAgIFNUQ1AoMHg3ZmM4NTg1NCwgMHgwNzc1MDFiZSksIFNUQ1AoMHg3ZmM1NjBjZiwgMHgwN2E3MmY0NSksCisgICAgU1RDUCgweDdmYzI1NTk2LCAweDA3ZDk1YjllKSwgU1RDUCgweDdmYmYzNmFhLCAweDA4MGI4NmMyKSwKKyAgICBTVENQKDB4N2ZiYzA0MGEsIDB4MDgzZGIwYTcpLCBTVENQKDB4N2ZiOGJkYjgsIDB4MDg2ZmQ5NDcpLAorICAgIFNUQ1AoMHg3ZmI1NjNiMywgMHgwOGEyMDA5YSksIFNUQ1AoMHg3ZmIxZjVmYywgMHgwOGQ0MjY5OSksCisgICAgU1RDUCgweDdmYWU3NDk1LCAweDA5MDY0YjNhKSwgU1RDUCgweDdmYWFkZjdjLCAweDA5Mzg2ZTc4KSwKKyAgICBTVENQKDB4N2ZhNzM2YjQsIDB4MDk2YTkwNDkpLCBTVENQKDB4N2ZhMzdhM2MsIDB4MDk5Y2IwYTcpLAorICAgIFNUQ1AoMHg3ZjlmYWExNSwgMHgwOWNlY2Y4OSksIFNUQ1AoMHg3ZjliYzY0MCwgMHgwYTAwZWNlOCksCisgICAgU1RDUCgweDdmOTdjZWJkLCAweDBhMzMwOGJkKSwgU1RDUCgweDdmOTNjMzhjLCAweDBhNjUyMmZlKSwKKyAgICBTVENQKDB4N2Y4ZmE0YjAsIDB4MGE5NzNiYTUpLCBTVENQKDB4N2Y4YjcyMjcsIDB4MGFjOTUyYWEpLAorICAgIFNUQ1AoMHg3Zjg3MmJmMywgMHgwYWZiNjgwNSksIFNUQ1AoMHg3ZjgyZDIxNCwgMHgwYjJkN2JhZiksCisgICAgU1RDUCgweDdmN2U2NDhjLCAweDBiNWY4ZDlmKSwgU1RDUCgweDdmNzllMzVhLCAweDBiOTE5ZGNmKSwKKyAgICBTVENQKDB4N2Y3NTRlODAsIDB4MGJjM2FjMzUpLCBTVENQKDB4N2Y3MGE1ZmUsIDB4MGJmNWI4Y2IpLAorICAgIFNUQ1AoMHg3ZjZiZTlkNCwgMHgwYzI3YzM4OSksIFNUQ1AoMHg3ZjY3MWEwNSwgMHgwYzU5Y2M2OCksCisgICAgU1RDUCgweDdmNjIzNjhmLCAweDBjOGJkMzVlKSwgU1RDUCgweDdmNWQzZjc1LCAweDBjYmRkODY1KSwKKyAgICBTVENQKDB4N2Y1ODM0YjcsIDB4MGNlZmRiNzYpLCBTVENQKDB4N2Y1MzE2NTUsIDB4MGQyMWRjODcpLAorICAgIFNUQ1AoMHg3ZjRkZTQ1MSwgMHgwZDUzZGI5MiksIFNUQ1AoMHg3ZjQ4OWVhYSwgMHgwZDg1ZDg4ZiksCisgICAgU1RDUCgweDdmNDM0NTYzLCAweDBkYjdkMzc2KSwgU1RDUCgweDdmM2RkODdjLCAweDBkZTljYzQwKSwKKyAgICBTVENQKDB4N2YzODU3ZjYsIDB4MGUxYmMyZTQpLCBTVENQKDB4N2YzMmMzZDEsIDB4MGU0ZGI3NWIpLAorICAgIFNUQ1AoMHg3ZjJkMWMwZSwgMHgwZTdmYTk5ZSksIFNUQ1AoMHg3ZjI3NjBhZiwgMHgwZWIxOTlhNCksCisgICAgU1RDUCgweDdmMjE5MWI0LCAweDBlZTM4NzY2KSwgU1RDUCgweDdmMWJhZjFlLCAweDBmMTU3MmRjKSwKKyAgICBTVENQKDB4N2YxNWI4ZWUsIDB4MGY0NzViZmYpLCBTVENQKDB4N2YwZmFmMjUsIDB4MGY3OTQyYzcpLAorICAgIFNUQ1AoMHg3ZjA5OTFjNCwgMHgwZmFiMjcyYiksIFNUQ1AoMHg3ZjAzNjBjYiwgMHgwZmRkMDkyNiksCisgICAgU1RDUCgweDdlZmQxYzNjLCAweDEwMGVlOGFkKSwgU1RDUCgweDdlZjZjNDE4LCAweDEwNDBjNWJiKSwKKyAgICBTVENQKDB4N2VmMDU4NjAsIDB4MTA3MmEwNDgpLCBTVENQKDB4N2VlOWQ5MTQsIDB4MTBhNDc4NGIpLAorICAgIFNUQ1AoMHg3ZWUzNDYzNiwgMHgxMGQ2NGRiZCksIFNUQ1AoMHg3ZWRjOWZjNiwgMHgxMTA4MjA5NiksCisgICAgU1RDUCgweDdlZDVlNWM2LCAweDExMzlmMGNmKSwgU1RDUCgweDdlY2YxODM3LCAweDExNmJiZTYwKSwKKyAgICBTVENQKDB4N2VjODM3MWEsIDB4MTE5ZDg5NDEpLCBTVENQKDB4N2VjMTQyNzAsIDB4MTFjZjUxNmEpLAorICAgIFNUQ1AoMHg3ZWJhM2EzOSwgMHgxMjAxMTZkNSksIFNUQ1AoMHg3ZWIzMWU3OCwgMHgxMjMyZDk3OSksCisgICAgU1RDUCgweDdlYWJlZjJjLCAweDEyNjQ5OTRlKSwgU1RDUCgweDdlYTRhYzU4LCAweDEyOTY1NjRkKSwKKyAgICBTVENQKDB4N2U5ZDU1ZmMsIDB4MTJjODEwNmYpLCBTVENQKDB4N2U5NWVjMWEsIDB4MTJmOWM3YWEpLAorICAgIFNUQ1AoMHg3ZThlNmViMiwgMHgxMzJiN2JmOSksIFNUQ1AoMHg3ZTg2ZGRjNiwgMHgxMzVkMmQ1MyksCisgICAgU1RDUCgweDdlN2YzOTU3LCAweDEzOGVkYmIxKSwgU1RDUCgweDdlNzc4MTY2LCAweDEzYzA4NzBhKSwKKyAgICBTVENQKDB4N2U2ZmI1ZjQsIDB4MTNmMjJmNTgpLCBTVENQKDB4N2U2N2Q3MDMsIDB4MTQyM2Q0OTIpLAorICAgIFNUQ1AoMHg3ZTVmZTQ5MywgMHgxNDU1NzZiMSksIFNUQ1AoMHg3ZTU3ZGVhNywgMHgxNDg3MTVhZSksCisgICAgU1RDUCgweDdlNGZjNTNlLCAweDE0YjhiMTdmKSwgU1RDUCgweDdlNDc5ODViLCAweDE0ZWE0YTFmKSwKKyAgICBTVENQKDB4N2UzZjU3ZmYsIDB4MTUxYmRmODYpLCBTVENQKDB4N2UzNzA0MmEsIDB4MTU0ZDcxYWEpLAorICAgIFNUQ1AoMHg3ZTJlOWNkZiwgMHgxNTdmMDA4NiksIFNUQ1AoMHg3ZTI2MjIxZiwgMHgxNWIwOGMxMiksCisgICAgU1RDUCgweDdlMWQ5M2VhLCAweDE1ZTIxNDQ1KSwgU1RDUCgweDdlMTRmMjQyLCAweDE2MTM5OTE4KSwKKyAgICBTVENQKDB4N2UwYzNkMjksIDB4MTY0NTFhODMpLCBTVENQKDB4N2UwMzc0YTAsIDB4MTY3Njk4N2YpLAorICAgIFNUQ1AoMHg3ZGZhOThhOCwgMHgxNmE4MTMwNSksIFNUQ1AoMHg3ZGYxYTk0MiwgMHgxNmQ5OGEwYyksCisgICAgU1RDUCgweDdkZThhNjcwLCAweDE3MGFmZDhkKSwgU1RDUCgweDdkZGY5MDM0LCAweDE3M2M2ZDgwKSwKKyAgICBTVENQKDB4N2RkNjY2OGYsIDB4MTc2ZGQ5ZGUpLCBTVENQKDB4N2RjZDI5ODEsIDB4MTc5ZjQyOWYpLAorICAgIFNUQ1AoMHg3ZGMzZDkwZCwgMHgxN2QwYTdiYyksIFNUQ1AoMHg3ZGJhNzUzNCwgMHgxODAyMDkyYyksCisgICAgU1RDUCgweDdkYjBmZGY4LCAweDE4MzM2NmU5KSwgU1RDUCgweDdkYTc3MzU5LCAweDE4NjRjMGVhKSwKKyAgICBTVENQKDB4N2Q5ZGQ1NWEsIDB4MTg5NjE3MjgpLCBTVENQKDB4N2Q5NDIzZmMsIDB4MThjNzY5OWIpLAorICAgIFNUQ1AoMHg3ZDhhNWY0MCwgMHgxOGY4YjgzYyksIFNUQ1AoMHg3ZDgwODcyOCwgMHgxOTJhMDMwNCksCisgICAgU1RDUCgweDdkNzY5YmI1LCAweDE5NWI0OWVhKSwgU1RDUCgweDdkNmM5Y2U5LCAweDE5OGM4Y2U3KSwKKyAgICBTVENQKDB4N2Q2MjhhYzYsIDB4MTliZGNiZjMpLCBTVENQKDB4N2Q1ODY1NGQsIDB4MTllZjA3MDcpLAorICAgIFNUQ1AoMHg3ZDRlMmM3ZiwgMHgxYTIwM2UxYiksIFNUQ1AoMHg3ZDQzZTA1ZSwgMHgxYTUxNzEyOCksCisgICAgU1RDUCgweDdkMzk4MGVjLCAweDFhODJhMDI2KSwgU1RDUCgweDdkMmYwZTJiLCAweDFhYjNjYjBkKSwKKyAgICBTVENQKDB4N2QyNDg4MWIsIDB4MWFlNGYxZDYpLCBTVENQKDB4N2QxOWVlYmYsIDB4MWIxNjE0NzkpLAorICAgIFNUQ1AoMHg3ZDBmNDIxOCwgMHgxYjQ3MzJlZiksIFNUQ1AoMHg3ZDA0ODIyOCwgMHgxYjc4NGQzMCksCisgICAgU1RDUCgweDdjZjlhZWYwLCAweDFiYTk2MzM1KSwgU1RDUCgweDdjZWVjODczLCAweDFiZGE3NGY2KSwKKyAgICBTVENQKDB4N2NlM2NlYjIsIDB4MWMwYjgyNmEpLCBTVENQKDB4N2NkOGMxYWUsIDB4MWMzYzhiOGMpLAorICAgIFNUQ1AoMHg3Y2NkYTE2OSwgMHgxYzZkOTA1MyksIFNUQ1AoMHg3Y2MyNmRlNSwgMHgxYzllOTBiOCksCisgICAgU1RDUCgweDdjYjcyNzI0LCAweDFjY2Y4Y2IzKSwgU1RDUCgweDdjYWJjZDI4LCAweDFkMDA4NDNkKSwKKyAgICBTVENQKDB4N2NhMDVmZjEsIDB4MWQzMTc3NGQpLCBTVENQKDB4N2M5NGRmODMsIDB4MWQ2MjY1ZGQpLAorICAgIFNUQ1AoMHg3Yzg5NGJkZSwgMHgxZDkzNGZlNSksIFNUQ1AoMHg3YzdkYTUwNSwgMHgxZGM0MzU1ZSksCisgICAgU1RDUCgweDdjNzFlYWY5LCAweDFkZjUxNjNmKSwgU1RDUCgweDdjNjYxZGJjLCAweDFlMjVmMjgyKSwKKyAgICBTVENQKDB4N2M1YTNkNTAsIDB4MWU1NmNhMWUpLCBTVENQKDB4N2M0ZTQ5YjcsIDB4MWU4NzlkMGQpLAorICAgIFNUQ1AoMHg3YzQyNDJmMiwgMHgxZWI4NmI0NiksIFNUQ1AoMHg3YzM2MjkwNCwgMHgxZWU5MzRjMyksCisgICAgU1RDUCgweDdjMjlmYmVlLCAweDFmMTlmOTdiKSwgU1RDUCgweDdjMWRiYmIzLCAweDFmNGFiOTY4KSwKKyAgICBTVENQKDB4N2MxMTY4NTMsIDB4MWY3Yjc0ODEpLCBTVENQKDB4N2MwNTAxZDIsIDB4MWZhYzJhYmYpLAorICAgIFNUQ1AoMHg3YmY4ODgzMCwgMHgxZmRjZGMxYiksIFNUQ1AoMHg3YmViZmI3MCwgMHgyMDBkODg4ZCksCisgICAgU1RDUCgweDdiZGY1Yjk0LCAweDIwM2UzMDBkKSwgU1RDUCgweDdiZDJhODllLCAweDIwNmVkMjk1KSwKKyAgICBTVENQKDB4N2JjNWUyOTAsIDB4MjA5ZjcwMWMpLCBTVENQKDB4N2JiOTA5NmIsIDB4MjBkMDA4OWMpLAorICAgIFNUQ1AoMHg3YmFjMWQzMSwgMHgyMTAwOWMwYyksIFNUQ1AoMHg3YjlmMWRlNiwgMHgyMTMxMmE2NSksCisgICAgU1RDUCgweDdiOTIwYjg5LCAweDIxNjFiM2EwKSwgU1RDUCgweDdiODRlNjFmLCAweDIxOTIzN2I1KSwKKyAgICBTVENQKDB4N2I3N2FkYTgsIDB4MjFjMmI2OWMpLCBTVENQKDB4N2I2YTYyMjcsIDB4MjFmMzMwNGYpLAorICAgIFNUQ1AoMHg3YjVkMDM5ZSwgMHgyMjIzYTRjNSksIFNUQ1AoMHg3YjRmOTIwZSwgMHgyMjU0MTNmOCksCisgICAgU1RDUCgweDdiNDIwZDdhLCAweDIyODQ3ZGUwKSwgU1RDUCgweDdiMzQ3NWU1LCAweDIyYjRlMjc0KSwKKyAgICBTVENQKDB4N2IyNmNiNGYsIDB4MjJlNTQxYWYpLCBTVENQKDB4N2IxOTBkYmMsIDB4MjMxNTliODgpLAorICAgIFNUQ1AoMHg3YjBiM2QyYywgMHgyMzQ1ZWZmOCksIFNUQ1AoMHg3YWZkNTlhNCwgMHgyMzc2M2VmNyksCisgICAgU1RDUCgweDdhZWY2MzIzLCAweDIzYTY4ODdmKSwgU1RDUCgweDdhZTE1OWFlLCAweDIzZDZjYzg3KSwKKyAgICBTVENQKDB4N2FkMzNkNDUsIDB4MjQwNzBiMDgpLCBTVENQKDB4N2FjNTBkZWMsIDB4MjQzNzQzZmEpLAorICAgIFNUQ1AoMHg3YWI2Y2JhNCwgMHgyNDY3Nzc1OCksIFNUQ1AoMHg3YWE4NzY2ZiwgMHgyNDk3YTUxNyksCisgICAgU1RDUCgweDdhOWEwZTUwLCAweDI0YzdjZDMzKSwgU1RDUCgweDdhOGI5MzQ4LCAweDI0ZjdlZmEyKSwKKyAgICBTVENQKDB4N2E3ZDA1NWIsIDB4MjUyODBjNWUpLCBTVENQKDB4N2E2ZTY0OGEsIDB4MjU1ODIzNWYpLAorICAgIFNUQ1AoMHg3YTVmYjBkOCwgMHgyNTg4MzQ5ZCksIFNUQ1AoMHg3YTUwZWE0NywgMHgyNWI4NDAxMiksCisgICAgU1RDUCgweDdhNDIxMGQ4LCAweDI1ZTg0NWI2KSwgU1RDUCgweDdhMzMyNDkwLCAweDI2MTg0NTgxKSwKKyAgICBTVENQKDB4N2EyNDI1NmYsIDB4MjY0ODNmNmMpLCBTVENQKDB4N2ExNTEzNzgsIDB4MjY3ODMzNzApLAorICAgIFNUQ1AoMHg3YTA1ZWVhZCwgMHgyNmE4MjE4NiksIFNUQ1AoMHg3OWY2YjcxMSwgMHgyNmQ4MDlhNSksCisgICAgU1RDUCgweDc5ZTc2Y2E3LCAweDI3MDdlYmM3KSwgU1RDUCgweDc5ZDgwZjZmLCAweDI3MzdjN2UzKSwKKyAgICBTVENQKDB4NzljODlmNmUsIDB4Mjc2NzlkZjQpLCBTVENQKDB4NzliOTFjYTQsIDB4Mjc5NzZkZjEpLAorICAgIFNUQ1AoMHg3OWE5ODcxNSwgMHgyN2M3MzdkMyksIFNUQ1AoMHg3OTk5ZGVjNCwgMHgyN2Y2ZmI5MiksCisgICAgU1RDUCgweDc5OGEyM2IxLCAweDI4MjZiOTI4KSwgU1RDUCgweDc5N2E1NWUwLCAweDI4NTY3MDhkKSwKKyAgICBTVENQKDB4Nzk2YTc1NTQsIDB4Mjg4NjIxYjkpLCBTVENQKDB4Nzk1YTgyMGUsIDB4MjhiNWNjYTUpLAorICAgIFNUQ1AoMHg3OTRhN2MxMiwgMHgyOGU1NzE0YiksIFNUQ1AoMHg3OTNhNjM2MSwgMHgyOTE1MGZhMSksCisgICAgU1RDUCgweDc5MmEzN2ZlLCAweDI5NDRhN2EyKSwgU1RDUCgweDc5MTlmOWVjLCAweDI5NzQzOTQ2KSwKKyAgICBTVENQKDB4NzkwOWE5MmQsIDB4MjlhM2M0ODUpLCBTVENQKDB4NzhmOTQ1YzMsIDB4MjlkMzQ5NTgpLAorICAgIFNUQ1AoMHg3OGU4Y2ZiMiwgMHgyYTAyYzdiOCksIFNUQ1AoMHg3OGQ4NDZmYiwgMHgyYTMyM2Y5ZSksCisgICAgU1RDUCgweDc4YzdhYmEyLCAweDJhNjFiMTAxKSwgU1RDUCgweDc4YjZmZGE4LCAweDJhOTExYmRjKSwKKyAgICBTVENQKDB4NzhhNjNkMTEsIDB4MmFjMDgwMjYpLCBTVENQKDB4Nzg5NTY5ZGYsIDB4MmFlZmRkZDgpLAorICAgIFNUQ1AoMHg3ODg0ODQxNCwgMHgyYjFmMzRlYiksIFNUQ1AoMHg3ODczOGJiMywgMHgyYjRlODU1OCksCisgICAgU1RDUCgweDc4NjI4MGJmLCAweDJiN2RjZjE3KSwgU1RDUCgweDc4NTE2MzNiLCAweDJiYWQxMjIxKSwKKyAgICBTVENQKDB4Nzg0MDMzMjksIDB4MmJkYzRlNmYpLCBTVENQKDB4NzgyZWYwOGIsIDB4MmMwYjgzZmEpLAorICAgIFNUQ1AoMHg3ODFkOWI2NSwgMHgyYzNhYjJiOSksIFNUQ1AoMHg3ODBjMzNiOCwgMHgyYzY5ZGFhNiksCisgICAgU1RDUCgweDc3ZmFiOTg5LCAweDJjOThmYmJhKSwgU1RDUCgweDc3ZTkyY2Q5LCAweDJjYzgxNWVlKSwKKyAgICBTVENQKDB4NzdkNzhkYWEsIDB4MmNmNzI5MzkpLCBTVENQKDB4NzdjNWRjMDEsIDB4MmQyNjM1OTYpLAorICAgIFNUQ1AoMHg3N2I0MTdkZiwgMHgyZDU1M2FmYyksIFNUQ1AoMHg3N2EyNDE0OCwgMHgyZDg0Mzk2NCksCisgICAgU1RDUCgweDc3OTA1ODNlLCAweDJkYjMzMGM3KSwgU1RDUCgweDc3N2U1Y2MzLCAweDJkZTIyMTFlKSwKKyAgICBTVENQKDB4Nzc2YzRlZGIsIDB4MmUxMTBhNjIpLCBTVENQKDB4Nzc1YTJlODksIDB4MmUzZmVjOGIpLAorICAgIFNUQ1AoMHg3NzQ3ZmJjZSwgMHgyZTZlYzc5MiksIFNUQ1AoMHg3NzM1YjZhZiwgMHgyZTlkOWI3MCksCisgICAgU1RDUCgweDc3MjM1ZjJkLCAweDJlY2M2ODFlKSwgU1RDUCgweDc3MTBmNTRjLCAweDJlZmIyZDk1KSwKKyAgICBTVENQKDB4NzZmZTc5MGUsIDB4MmYyOWViY2MpLCBTVENQKDB4NzZlYmVhNzcsIDB4MmY1OGEyYmUpLAorICAgIFNUQ1AoMHg3NmQ5NDk4OSwgMHgyZjg3NTI2MiksIFNUQ1AoMHg3NmM2OTY0NywgMHgyZmI1ZmFiMiksCisgICAgU1RDUCgweDc2YjNkMGI0LCAweDJmZTQ5YmE3KSwgU1RDUCgweDc2YTBmOGQyLCAweDMwMTMzNTM5KSwKKyAgICBTVENQKDB4NzY4ZTBlYTYsIDB4MzA0MWM3NjEpLCBTVENQKDB4NzY3YjEyMzEsIDB4MzA3MDUyMTcpLAorICAgIFNUQ1AoMHg3NjY4MDM3NiwgMHgzMDllZDU1NiksIFNUQ1AoMHg3NjU0ZTI3OSwgMHgzMGNkNTExNSksCisgICAgU1RDUCgweDc2NDFhZjNkLCAweDMwZmJjNTRkKSwgU1RDUCgweDc2MmU2OWM0LCAweDMxMmEzMWY4KSwKKyAgICBTVENQKDB4NzYxYjEyMTEsIDB4MzE1ODk3MGUpLCBTVENQKDB4NzYwN2E4MjgsIDB4MzE4NmY0ODcpLAorICAgIFNUQ1AoMHg3NWY0MmMwYiwgMHgzMWI1NGE1ZSksIFNUQ1AoMHg3NWUwOWRiZCwgMHgzMWUzOTg4OSksCisgICAgU1RDUCgweDc1Y2NmZDQyLCAweDMyMTFkZjA0KSwgU1RDUCgweDc1Yjk0YTljLCAweDMyNDAxZGM2KSwKKyAgICBTVENQKDB4NzVhNTg1Y2YsIDB4MzI2ZTU0YzcpLCBTVENQKDB4NzU5MWFlZGQsIDB4MzI5Yzg0MDIpLAorICAgIFNUQ1AoMHg3NTdkYzVjYSwgMHgzMmNhYWI2ZiksIFNUQ1AoMHg3NTY5Y2E5OSwgMHgzMmY4Y2IwNyksCisgICAgU1RDUCgweDc1NTViZDRjLCAweDMzMjZlMmMzKSwgU1RDUCgweDc1NDE5ZGU3LCAweDMzNTRmMjliKSwKKyAgICBTVENQKDB4NzUyZDZjNmMsIDB4MzM4MmZhODgpLCBTVENQKDB4NzUxOTI4ZTAsIDB4MzNiMGZhODQpLAorICAgIFNUQ1AoMHg3NTA0ZDM0NSwgMHgzM2RlZjI4NyksIFNUQ1AoMHg3NGYwNmI5ZSwgMHgzNDBjZTI4YiksCisgICAgU1RDUCgweDc0ZGJmMWVmLCAweDM0M2FjYTg3KSwgU1RDUCgweDc0Yzc2NjNhLCAweDM0NjhhYTc2KSwKKyAgICBTVENQKDB4NzRiMmM4ODQsIDB4MzQ5NjgyNTApLCBTVENQKDB4NzQ5ZTE4Y2QsIDB4MzRjNDUyMGQpLAorICAgIFNUQ1AoMHg3NDg5NTcxYywgMHgzNGYyMTlhOCksIFNUQ1AoMHg3NDc0ODM3MSwgMHgzNTFmZDkxOCksCisgICAgU1RDUCgweDc0NWY5ZGQxLCAweDM1NGQ5MDU3KSwgU1RDUCgweDc0NGFhNjNmLCAweDM1N2IzZjVkKSwKKyAgICBTVENQKDB4NzQzNTljYmQsIDB4MzVhOGU2MjUpLCBTVENQKDB4NzQyMDgxNTAsIDB4MzVkNjg0YTYpLAorICAgIFNUQ1AoMHg3NDBiNTNmYiwgMHgzNjA0MWFkOSksIFNUQ1AoMHg3M2Y2MTRjMCwgMHgzNjMxYThiOCksCisgICAgU1RDUCgweDczZTBjM2EzLCAweDM2NWYyZTNiKSwgU1RDUCgweDczY2I2MGE4LCAweDM2OGNhYjVjKSwKKyAgICBTVENQKDB4NzNiNWViZDEsIDB4MzZiYTIwMTQpLCBTVENQKDB4NzNhMDY1MjIsIDB4MzZlNzhjNWIpLAorICAgIFNUQ1AoMHg3MzhhY2M5ZSwgMHgzNzE0ZjAyYSksIFNUQ1AoMHg3Mzc1MjI0OSwgMHgzNzQyNGI3YiksCisgICAgU1RDUCgweDczNWY2NjI2LCAweDM3NmY5ZTQ2KSwgU1RDUCgweDczNDk5ODM4LCAweDM3OWNlODg1KSwKKyAgICBTVENQKDB4NzMzM2I4ODMsIDB4MzdjYTJhMzApLCBTVENQKDB4NzMxZGM3MGEsIDB4MzdmNzYzNDEpLAorICAgIFNUQ1AoMHg3MzA3YzNkMCwgMHgzODI0OTNiMCksIFNUQ1AoMHg3MmYxYWVkOSwgMHgzODUxYmI3NyksCisgICAgU1RDUCgweDcyZGI4ODI4LCAweDM4N2VkYThlKSwgU1RDUCgweDcyYzU0ZmMxLCAweDM4YWJmMGVmKSwKKyAgICBTVENQKDB4NzJhZjA1YTcsIDB4MzhkOGZlOTMpLCBTVENQKDB4NzI5OGE5ZGQsIDB4MzkwNjAzNzMpLAorICAgIFNUQ1AoMHg3MjgyM2M2NywgMHgzOTMyZmY4NyksIFNUQ1AoMHg3MjZiYmQ0OCwgMHgzOTVmZjJjOSksCisgICAgU1RDUCgweDcyNTUyYzg1LCAweDM5OGNkZDMyKSwgU1RDUCgweDcyM2U4YTIwLCAweDM5YjliZWJjKSwKKyAgICBTVENQKDB4NzIyN2Q2MWMsIDB4MzllNjk3NWUpLCBTVENQKDB4NzIxMTEwN2UsIDB4M2ExMzY3MTIpLAorICAgIFNUQ1AoMHg3MWZhMzk0OSwgMHgzYTQwMmRkMiksIFNUQ1AoMHg3MWUzNTA4MCwgMHgzYTZjZWI5NiksCisgICAgU1RDUCgweDcxY2M1NjI2LCAweDNhOTlhMDU3KSwgU1RDUCgweDcxYjU0YTQxLCAweDNhYzY0YzBmKSwKKyAgICBTVENQKDB4NzE5ZTJjZDIsIDB4M2FmMmVlYjcpLCBTVENQKDB4NzE4NmZkZGUsIDB4M2IxZjg4NDgpLAorICAgIFNUQ1AoMHg3MTZmYmQ2OCwgMHgzYjRjMThiYSksIFNUQ1AoMHg3MTU4NmI3NCwgMHgzYjc4YTAwNyksCisgICAgU1RDUCgweDcxNDEwODA1LCAweDNiYTUxZTI5KSwgU1RDUCgweDcxMjk5MzFmLCAweDNiZDE5MzE4KSwKKyAgICBTVENQKDB4NzExMjBjYzUsIDB4M2JmZGZlY2QpLCBTVENQKDB4NzBmYTc0ZmMsIDB4M2MyYTYxNDIpLAorICAgIFNUQ1AoMHg3MGUyY2JjNiwgMHgzYzU2YmE3MCksIFNUQ1AoMHg3MGNiMTEyOCwgMHgzYzgzMGE1MCksCisgICAgU1RDUCgweDcwYjM0NTI1LCAweDNjYWY1MGRhKSwgU1RDUCgweDcwOWI2N2MwLCAweDNjZGI4ZTA5KSwKKyAgICBTVENQKDB4NzA4Mzc4ZmYsIDB4M2QwN2MxZDYpLCBTVENQKDB4NzA2Yjc4ZTMsIDB4M2QzM2VjMzkpLAorICAgIFNUQ1AoMHg3MDUzNjc3MSwgMHgzZDYwMGQyYyksIFNUQ1AoMHg3MDNiNDRhZCwgMHgzZDhjMjRhOCksCisgICAgU1RDUCgweDcwMjMxMDlhLCAweDNkYjgzMmE2KSwgU1RDUCgweDcwMGFjYjNjLCAweDNkZTQzNzFmKSwKKyAgICBTVENQKDB4NmZmMjc0OTcsIDB4M2UxMDMyMGQpLCBTVENQKDB4NmZkYTBjYWUsIDB4M2UzYzIzNjkpLAorICAgIFNUQ1AoMHg2ZmMxOTM4NSwgMHgzZTY4MGIyYyksIFNUQ1AoMHg2ZmE5MDkyMSwgMHgzZTkzZTk1MCksCisgICAgU1RDUCgweDZmOTA2ZDg0LCAweDNlYmZiZGNkKSwgU1RDUCgweDZmNzdjMGIzLCAweDNlZWI4ODljKSwKKyAgICBTVENQKDB4NmY1ZjAyYjIsIDB4M2YxNzQ5YjgpLCBTVENQKDB4NmY0NjMzODMsIDB4M2Y0MzAxMTkpLAorICAgIFNUQ1AoMHg2ZjJkNTMyYywgMHgzZjZlYWViOCksIFNUQ1AoMHg2ZjE0NjFiMCwgMHgzZjlhNTI5MCksCisgICAgU1RDUCgweDZlZmI1ZjEyLCAweDNmYzVlYzk4KSwgU1RDUCgweDZlZTI0YjU3LCAweDNmZjE3Y2NhKSwKKyAgICBTVENQKDB4NmVjOTI2ODMsIDB4NDAxZDAzMjEpLCBTVENQKDB4NmVhZmYwOTksIDB4NDA0ODdmOTQpLAorICAgIFNUQ1AoMHg2ZTk2YTk5ZCwgMHg0MDczZjIxZCksIFNUQ1AoMHg2ZTdkNTE5MywgMHg0MDlmNWFiNiksCisgICAgU1RDUCgweDZlNjNlODdmLCAweDQwY2FiOTU4KSwgU1RDUCgweDZlNGE2ZTY2LCAweDQwZjYwZGZiKSwKKyAgICBTVENQKDB4NmUzMGUzNGEsIDB4NDEyMTU4OWIpLCBTVENQKDB4NmUxNzQ3MzAsIDB4NDE0Yzk5MmYpLAorICAgIFNUQ1AoMHg2ZGZkOWExYywgMHg0MTc3Y2ZiMSksIFNUQ1AoMHg2ZGUzZGMxMSwgMHg0MWEyZmMxYSksCisgICAgU1RDUCgweDZkY2EwZDE0LCAweDQxY2UxZTY1KSwgU1RDUCgweDZkYjAyZDI5LCAweDQxZjkzNjg5KSwKKyAgICBTVENQKDB4NmQ5NjNjNTQsIDB4NDIyNDQ0ODEpLCBTVENQKDB4NmQ3YzNhOTgsIDB4NDI0ZjQ4NDUpLAorICAgIFNUQ1AoMHg2ZDYyMjdmYSwgMHg0MjdhNDFkMCksIFNUQ1AoMHg2ZDQ4MDQ3ZSwgMHg0MmE1MzExYiksCisgICAgU1RDUCgweDZkMmRkMDI3LCAweDQyZDAxNjFlKSwgU1RDUCgweDZkMTM4YWZiLCAweDQyZmFmMGQ0KSwKKyAgICBTVENQKDB4NmNmOTM0ZmMsIDB4NDMyNWMxMzUpLCBTVENQKDB4NmNkZWNlMmYsIDB4NDM1MDg3M2MpLAorICAgIFNUQ1AoMHg2Y2M0NTY5OCwgMHg0MzdiNDJlMSksIFNUQ1AoMHg2Y2E5Y2UzYiwgMHg0M2E1ZjQxZSksCisgICAgU1RDUCgweDZjOGYzNTFjLCAweDQzZDA5YWVkKSwgU1RDUCgweDZjNzQ4YjNmLCAweDQzZmIzNzQ2KSwKKyAgICBTVENQKDB4NmM1OWQwYTksIDB4NDQyNWM5MjMpLCBTVENQKDB4NmMzZjA1NWQsIDB4NDQ1MDUwN2UpLAorICAgIFNUQ1AoMHg2YzI0Mjk2MCwgMHg0NDdhY2Q1MCksIFNUQ1AoMHg2YzA5M2NiNiwgMHg0NGE1M2Y5MyksCisgICAgU1RDUCgweDZiZWUzZjYyLCAweDQ0Y2ZhNzQwKSwgU1RDUCgweDZiZDMzMTZhLCAweDQ0ZmEwNDUwKSwKKyAgICBTVENQKDB4NmJiODEyZDEsIDB4NDUyNDU2YmQpLCBTVENQKDB4NmI5Y2UzOWIsIDB4NDU0ZTllODApLAorICAgIFNUQ1AoMHg2YjgxYTNjZCwgMHg0NTc4ZGI5MyksIFNUQ1AoMHg2YjY2NTM2YiwgMHg0NWEzMGRmMCksCisgICAgU1RDUCgweDZiNGFmMjc5LCAweDQ1Y2QzNThmKSwgU1RDUCgweDZiMmY4MGZiLCAweDQ1Zjc1MjZiKSwKKyAgICBTVENQKDB4NmIxM2ZlZjUsIDB4NDYyMTY0N2QpLCBTVENQKDB4NmFmODZjNmMsIDB4NDY0YjZiYmUpLAorICAgIFNUQ1AoMHg2YWRjYzk2NCwgMHg0Njc1NjgyOCksIFNUQ1AoMHg2YWMxMTVlMiwgMHg0NjlmNTliNCksCisgICAgU1RDUCgweDZhYTU1MWU5LCAweDQ2Yzk0MDVjKSwgU1RDUCgweDZhODk3ZDdkLCAweDQ2ZjMxYzFhKSwKKyAgICBTVENQKDB4NmE2ZDk4YTQsIDB4NDcxY2VjZTcpLCBTVENQKDB4NmE1MWEzNjEsIDB4NDc0NmIyYmMpLAorICAgIFNUQ1AoMHg2YTM1OWRiOSwgMHg0NzcwNmQ5MyksIFNUQ1AoMHg2YTE5ODdiMCwgMHg0NzlhMWQ2NyksCisgICAgU1RDUCgweDY5ZmQ2MTRhLCAweDQ3YzNjMjJmKSwgU1RDUCgweDY5ZTEyYThjLCAweDQ3ZWQ1YmU2KSwKKyAgICBTVENQKDB4NjljNGUzN2EsIDB4NDgxNmVhODYpLCBTVENQKDB4NjlhODhjMTksIDB4NDg0MDZlMDgpLAorICAgIFNUQ1AoMHg2OThjMjQ2YywgMHg0ODY5ZTY2NSksIFNUQ1AoMHg2OTZmYWM3OCwgMHg0ODkzNTM5NyksCisgICAgU1RDUCgweDY5NTMyNDQyLCAweDQ4YmNiNTk5KSwgU1RDUCgweDY5MzY4YmNlLCAweDQ4ZTYwYzYyKSwKKyAgICBTVENQKDB4NjkxOWUzMjAsIDB4NDkwZjU3ZWUpLCBTVENQKDB4NjhmZDJhM2QsIDB4NDkzODk4MzYpLAorICAgIFNUQ1AoMHg2OGUwNjEyOSwgMHg0OTYxY2QzMyksIFNUQ1AoMHg2OGMzODdlOSwgMHg0OThhZjZkZiksCisgICAgU1RDUCgweDY4YTY5ZTgxLCAweDQ5YjQxNTMzKSwgU1RDUCgweDY4ODlhNGY2LCAweDQ5ZGQyODJhKSwKKyAgICBTVENQKDB4Njg2YzliNGIsIDB4NGEwNjJmYmQpLCBTVENQKDB4Njg0ZjgxODYsIDB4NGEyZjJiZTYpLAorICAgIFNUQ1AoMHg2ODMyNTdhYiwgMHg0YTU4MWM5ZSksIFNUQ1AoMHg2ODE1MWRiZSwgMHg0YTgxMDFkZSksCisgICAgU1RDUCgweDY3ZjdkM2M1LCAweDRhYTlkYmEyKSwgU1RDUCgweDY3ZGE3OWMzLCAweDRhZDJhOWUyKSwKKyAgICBTVENQKDB4NjdiZDBmYmQsIDB4NGFmYjZjOTgpLCBTVENQKDB4Njc5Zjk1YjcsIDB4NGIyNDIzYmUpLAorICAgIFNUQ1AoMHg2NzgyMGJiNywgMHg0YjRjY2Y0ZCksIFNUQ1AoMHg2NzY0NzFjMCwgMHg0Yjc1NmY0MCksCisgICAgU1RDUCgweDY3NDZjN2Q4LCAweDRiOWUwMzkwKSwgU1RDUCgweDY3MjkwZTAyLCAweDRiYzY4YzM2KSwKKyAgICBTVENQKDB4NjcwYjQ0NDQsIDB4NGJlZjA5MmQpLCBTVENQKDB4NjZlZDZhYTEsIDB4NGMxNzdhNmUpLAorICAgIFNUQ1AoMHg2NmNmODEyMCwgMHg0YzNmZGZmNCksIFNUQ1AoMHg2NmIxODdjMywgMHg0YzY4MzliNyksCisgICAgU1RDUCgweDY2OTM3ZTkxLCAweDRjOTA4N2IxKSwgU1RDUCgweDY2NzU2NThjLCAweDRjYjhjOWRkKSwKKyAgICBTVENQKDB4NjY1NzNjYmIsIDB4NGNlMTAwMzQpLCBTVENQKDB4NjYzOTA0MjIsIDB4NGQwOTJhYjApLAorICAgIFNUQ1AoMHg2NjFhYmJjNSwgMHg0ZDMxNDk0YiksIFNUQ1AoMHg2NWZjNjNhOSwgMHg0ZDU5NWJmZSksCisgICAgU1RDUCgweDY1ZGRmYmQzLCAweDRkODE2MmM0KSwgU1RDUCgweDY1YmY4NDQ3LCAweDRkYTk1ZDk2KSwKKyAgICBTVENQKDB4NjVhMGZkMGIsIDB4NGRkMTRjNmUpLCBTVENQKDB4NjU4MjY2MjIsIDB4NGRmOTJmNDYpLAorICAgIFNUQ1AoMHg2NTYzYmY5MiwgMHg0ZTIxMDYxNyksIFNUQ1AoMHg2NTQ1MDk1ZiwgMHg0ZTQ4ZDBkZCksCisgICAgU1RDUCgweDY1MjY0MzhmLCAweDRlNzA4ZjhmKSwgU1RDUCgweDY1MDc2ZTI1LCAweDRlOTg0MjI5KSwKKyAgICBTVENQKDB4NjRlODg5MjYsIDB4NGViZmU4YTUpLCBTVENQKDB4NjRjOTk0OTgsIDB4NGVlNzgyZmIpLAorICAgIFNUQ1AoMHg2NGFhOTA3ZiwgMHg0ZjBmMTEyNiksIFNUQ1AoMHg2NDhiN2NlMCwgMHg0ZjM2OTMyMCksCisgICAgU1RDUCgweDY0NmM1OWJmLCAweDRmNWUwOGUzKSwgU1RDUCgweDY0NGQyNzIyLCAweDRmODU3MjY5KSwKKyAgICBTVENQKDB4NjQyZGU1MGQsIDB4NGZhY2NmYWIpLCBTVENQKDB4NjQwZTkzODYsIDB4NGZkNDIwYTQpLAorICAgIFNUQ1AoMHg2M2VmMzI5MCwgMHg0ZmZiNjU0ZCksIFNUQ1AoMHg2M2NmYzIzMSwgMHg1MDIyOWRhMSksCisgICAgU1RDUCgweDYzYjA0MjZkLCAweDUwNDljOTk5KSwgU1RDUCgweDYzOTBiMzRhLCAweDUwNzBlOTJmKSwKKyAgICBTVENQKDB4NjM3MTE0Y2MsIDB4NTA5N2ZjNWUpLCBTVENQKDB4NjM1MTY2ZjksIDB4NTBiZjAzMWYpLAorICAgIFNUQ1AoMHg2MzMxYTlkNCwgMHg1MGU1ZmQ2ZCksIFNUQ1AoMHg2MzExZGQ2NCwgMHg1MTBjZWI0MCksCisgICAgU1RDUCgweDYyZjIwMWFjLCAweDUxMzNjYzk0KSwgU1RDUCgweDYyZDIxNmIzLCAweDUxNWFhMTYyKSwKKyAgICBTVENQKDB4NjJiMjFjN2IsIDB4NTE4MTY5YTUpLCBTVENQKDB4NjI5MjEzMGMsIDB4NTFhODI1NTUpLAorICAgIFNUQ1AoMHg2MjcxZmE2OSwgMHg1MWNlZDQ2ZSksIFNUQ1AoMHg2MjUxZDI5OCwgMHg1MWY1NzZlYSksCisgICAgU1RDUCgweDYyMzE5YjlkLCAweDUyMWMwY2MyKSwgU1RDUCgweDYyMTE1NTdlLCAweDUyNDI5NWYwKSwKKyAgICBTVENQKDB4NjFmMTAwM2YsIDB4NTI2OTEyNmUpLCBTVENQKDB4NjFkMDliZTUsIDB4NTI4ZjgyMzgpLAorICAgIFNUQ1AoMHg2MWIwMjg3NiwgMHg1MmI1ZTU0NiksIFNUQ1AoMHg2MThmYTVmNywgMHg1MmRjM2I5MiksCisgICAgU1RDUCgweDYxNmYxNDZjLCAweDUzMDI4NTE4KSwgU1RDUCgweDYxNGU3M2RhLCAweDUzMjhjMWQwKSwKKyAgICBTVENQKDB4NjEyZGM0NDcsIDB4NTM0ZWYxYjUpLCBTVENQKDB4NjEwZDA1YjcsIDB4NTM3NTE0YzIpLAorICAgIFNUQ1AoMHg2MGVjMzgzMCwgMHg1MzliMmFmMCksIFNUQ1AoMHg2MGNiNWJiNywgMHg1M2MxMzQzOSksCisgICAgU1RDUCgweDYwYWE3MDUwLCAweDUzZTczMDk3KSwgU1RDUCgweDYwODk3NjAxLCAweDU0MGQyMDA1KSwKKyAgICBTVENQKDB4NjA2ODZjY2YsIDB4NTQzMzAyN2QpLCBTVENQKDB4NjA0NzU0YmYsIDB4NTQ1OGQ3ZjkpLAorICAgIFNUQ1AoMHg2MDI2MmRkNiwgMHg1NDdlYTA3MyksIFNUQ1AoMHg2MDA0ZjgxOSwgMHg1NGE0NWJlNiksCisgICAgU1RDUCgweDVmZTNiMzhkLCAweDU0Y2EwYTRiKSwgU1RDUCgweDVmYzI2MDM4LCAweDU0ZWZhYjljKSwKKyAgICBTVENQKDB4NWZhMGZlMWYsIDB4NTUxNTNmZDQpLCBTVENQKDB4NWY3ZjhkNDYsIDB4NTUzYWM2ZWUpLAorICAgIFNUQ1AoMHg1ZjVlMGRiMywgMHg1NTYwNDBlMiksIFNUQ1AoMHg1ZjNjN2Y2YiwgMHg1NTg1YWRhZCksCisgICAgU1RDUCgweDVmMWFlMjc0LCAweDU1YWIwZDQ2KSwgU1RDUCgweDVlZjkzNmQxLCAweDU1ZDA1ZmFhKSwKKyAgICBTVENQKDB4NWVkNzdjOGEsIDB4NTVmNWE0ZDIpLCBTVENQKDB4NWViNWIzYTIsIDB4NTYxYWRjYjkpLAorICAgIFNUQ1AoMHg1ZTkzZGMxZiwgMHg1NjQwMDc1OCksIFNUQ1AoMHg1ZTcxZjYwNiwgMHg1NjY1MjRhYSksCisgICAgU1RDUCgweDVlNTAwMTVkLCAweDU2OGEzNGE5KSwgU1RDUCgweDVlMmRmZTI5LCAweDU2YWYzNzUwKSwKKyAgICBTVENQKDB4NWUwYmVjNmUsIDB4NTZkNDJjOTkpLCBTVENQKDB4NWRlOWNjMzMsIDB4NTZmOTE0N2UpLAorICAgIFNUQ1AoMHg1ZGM3OWQ3YywgMHg1NzFkZWVmYSksIFNUQ1AoMHg1ZGE1NjA0ZiwgMHg1NzQyYmMwNiksCisgICAgU1RDUCgweDVkODMxNGIxLCAweDU3Njc3YjlkKSwgU1RDUCgweDVkNjBiYWE3LCAweDU3OGMyZGJhKSwKKyAgICBTVENQKDB4NWQzZTUyMzcsIDB4NTdiMGQyNTYpLCBTVENQKDB4NWQxYmRiNjUsIDB4NTdkNTY5NmQpLAorICAgIFNUQ1AoMHg1Y2Y5NTYzOCwgMHg1N2Y5ZjJmOCksIFNUQ1AoMHg1Y2Q2YzJiNSwgMHg1ODFlNmVmMSksCisgICAgU1RDUCgweDVjYjQyMGUwLCAweDU4NDJkZDU0KSwgU1RDUCgweDVjOTE3MGJmLCAweDU4NjczZTFiKSwKKyAgICBTVENQKDB4NWM2ZWIyNTgsIDB4NTg4YjkxNDApLCBTVENQKDB4NWM0YmU1YjAsIDB4NThhZmQ2YmQpLAorICAgIFNUQ1AoMHg1YzI5MGFjYywgMHg1OGQ0MGU4YyksIFNUQ1AoMHg1YzA2MjFiMiwgMHg1OGY4MzhhOSksCisgICAgU1RDUCgweDViZTMyYTY3LCAweDU5MWM1NTBlKSwgU1RDUCgweDViYzAyNGYwLCAweDU5NDA2M2I1KSwKKyAgICBTVENQKDB4NWI5ZDExNTQsIDB4NTk2NDY0OTgpLCBTVENQKDB4NWI3OWVmOTYsIDB4NTk4ODU3YjIpLAorICAgIFNUQ1AoMHg1YjU2YmZiZCwgMHg1OWFjM2NmZCksIFNUQ1AoMHg1YjMzODFjZSwgMHg1OWQwMTQ3NSksCisgICAgU1RDUCgweDViMTAzNWNmLCAweDU5ZjNkZTEyKSwgU1RDUCgweDVhZWNkYmM1LCAweDVhMTc5OWQxKSwKKyAgICBTVENQKDB4NWFjOTczYjUsIDB4NWEzYjQ3YWIpLCBTVENQKDB4NWFhNWZkYTUsIDB4NWE1ZWU3OWEpLAorICAgIFNUQ1AoMHg1YTgyNzk5YSwgMHg1YTgyNzk5YSksCiB9OwogCiBSQU1fQUxJR04KIExOS19TRUNUSU9OX0NPTlNUREFUQQotY29uc3QgRklYUF9XVFAgS0JEV2luZG93OTYwW10gPQotewotICBXVENQKDB4N2ZmZmZmOWUsIDB4MDAwOWU2YWMpLCBXVENQKDB4N2ZmZmZmMmIsIDB4MDAwZTk2ZDUpLCBXVENQKDB4N2ZmZmZlYTYsIDB4MDAxMjk4N2UpLCBXVENQKDB4N2ZmZmZlMGUsIDB4MDAxNjUyYjYpLAotICBXVENQKDB4N2ZmZmZkNjAsIDB4MDAxOWViY2UpLCBXVENQKDB4N2ZmZmZjOWMsIDB4MDAxZDc2YmYpLCBXVENQKDB4N2ZmZmZiYmYsIDB4MDAyMGZlNzkpLCBXVENQKDB4N2ZmZmZhYzksIDB4MDAyNDg5ZWYpLAotICBXVENQKDB4N2ZmZmY5YjcsIDB4MDAyODFkZTIpLCBXVENQKDB4N2ZmZmY4ODcsIDB4MDAyYmJkYmIpLCBXVENQKDB4N2ZmZmY3MzcsIDB4MDAyZjZjMGQpLCBXVENQKDB4N2ZmZmY1YzYsIDB4MDAzMzJhZDgpLAotICBXVENQKDB4N2ZmZmY0MzEsIDB4MDAzNmZiYjkpLCBXVENQKDB4N2ZmZmYyNzYsIDB4MDAzYWUwMDQpLCBXVENQKDB4N2ZmZmYwOTIsIDB4MDAzZWQ4ZDgpLCBXVENQKDB4N2ZmZmVlODQsIDB4MDA0MmU3MmYpLAotICBXVENQKDB4N2ZmZmVjNDgsIDB4MDA0NzBiZTMpLCBXVENQKDB4N2ZmZmU5ZGQsIDB4MDA0YjQ3YjgpLCBXVENQKDB4N2ZmZmU3M2YsIDB4MDA0ZjliNWYpLCBXVENQKDB4N2ZmZmU0NmIsIDB4MDA1NDA3N2EpLAotICBXVENQKDB4N2ZmZmUxNWYsIDB4MDA1ODhjYTEpLCBXVENQKDB4N2ZmZmRlMTcsIDB4MDA1ZDJiNjEpLCBXVENQKDB4N2ZmZmRhOTEsIDB4MDA2MWU0NDIpLCBXVENQKDB4N2ZmZmQ2YzksIDB4MDA2NmI3YzIpLAotICBXVENQKDB4N2ZmZmQyYmIsIDB4MDA2YmE2NWMpLCBXVENQKDB4N2ZmZmNlNjUsIDB4MDA3MGIwODcpLCBXVENQKDB4N2ZmZmM5YzIsIDB4MDA3NWQ2YjUpLCBXVENQKDB4N2ZmZmM0Y2YsIDB4MDA3YjE5NTUpLAotICBXVENQKDB4N2ZmZmJmODcsIDB4MDA4MDc4ZDUpLCBXVENQKDB4N2ZmZmI5ZTcsIDB4MDA4NWY1YTApLCBXVENQKDB4N2ZmZmIzZWEsIDB4MDA4YjkwMWQpLCBXVENQKDB4N2ZmZmFkOGMsIDB4MDA5MTQ4YjQpLAotICBXVENQKDB4N2ZmZmE2YzksIDB4MDA5NzFmY2IpLCBXVENQKDB4N2ZmZjlmOWMsIDB4MDA5ZDE1YzcpLCBXVENQKDB4N2ZmZjk4MDAsIDB4MDBhMzJiMGIpLCBXVENQKDB4N2ZmZjhmZjAsIDB4MDBhOTVmZjkpLAotICBXVENQKDB4N2ZmZjg3NjcsIDB4MDBhZmI0ZjQpLCBXVENQKDB4N2ZmZjdlNWYsIDB4MDBiNjJhNWMpLCBXVENQKDB4N2ZmZjc0ZDQsIDB4MDBiY2MwOTMpLCBXVENQKDB4N2ZmZjZhYzAsIDB4MDBjMzc3ZjgpLAotICBXVENQKDB4N2ZmZjYwMWMsIDB4MDBjYTUwZWIpLCBXVENQKDB4N2ZmZjU0ZTMsIDB4MDBkMTRiY2IpLCBXVENQKDB4N2ZmZjQ5MGUsIDB4MDBkODY4ZjcpLCBXVENQKDB4N2ZmZjNjOTgsIDB4MDBkZmE4Y2UpLAotICBXVENQKDB4N2ZmZjJmNzksIDB4MDBlNzBiYWQpLCBXVENQKDB4N2ZmZjIxYWMsIDB4MDBlZTkxZjMpLCBXVENQKDB4N2ZmZjEzMjgsIDB4MDBmNjNiZmUpLCBXVENQKDB4N2ZmZjAzZTcsIDB4MDBmZTBhMmMpLAotICBXVENQKDB4N2ZmZWYzZTEsIDB4MDEwNWZjZDkpLCBXVENQKDB4N2ZmZWUzMTAsIDB4MDEwZTE0NjIpLCBXVENQKDB4N2ZmZWQxNmEsIDB4MDExNjUxMjYpLCBXVENQKDB4N2ZmZWJlZTksIDB4MDExZWIzODEpLAotICBXVENQKDB4N2ZmZWFiODMsIDB4MDEyNzNiZDApLCBXVENQKDB4N2ZmZTk3MzEsIDB4MDEyZmVhNmYpLCBXVENQKDB4N2ZmZTgxZWEsIDB4MDEzOGJmYmMpLCBXVENQKDB4N2ZmZTZiYTQsIDB4MDE0MWJjMTIpLAotICBXVENQKDB4N2ZmZTU0NTcsIDB4MDE0YWRmY2UpLCBXVENQKDB4N2ZmZTNiZmEsIDB4MDE1NDJiNGQpLCBXVENQKDB4N2ZmZTIyODIsIDB4MDE1ZDllZTkpLCBXVENQKDB4N2ZmZTA3ZTYsIDB4MDE2NzNiMDEpLAotICBXVENQKDB4N2ZmZGVjMWIsIDB4MDE3MGZmZWUpLCBXVENQKDB4N2ZmZGNmMTcsIDB4MDE3YWVlMGUpLCBXVENQKDB4N2ZmZGIwZDAsIDB4MDE4NTA1YmMpLCBXVENQKDB4N2ZmZDkxM2IsIDB4MDE4ZjQ3NTQpLAotICBXVENQKDB4N2ZmZDcwNGIsIDB4MDE5OWIzMzApLCBXVENQKDB4N2ZmZDRkZjcsIDB4MDFhNDQ5YWQpLCBXVENQKDB4N2ZmZDJhMzEsIDB4MDFhZjBiMjUpLCBXVENQKDB4N2ZmZDA0ZWYsIDB4MDFiOWY3ZjQpLAotICBXVENQKDB4N2ZmY2RlMjMsIDB4MDFjNTEwNzQpLCBXVENQKDB4N2ZmY2I1YzEsIDB4MDFkMDU1MDEpLCBXVENQKDB4N2ZmYzhiYmMsIDB4MDFkYmM1ZjUpLCBXVENQKDB4N2ZmYzYwMDYsIDB4MDFlNzYzYWIpLAotICBXVENQKDB4N2ZmYzMyOTMsIDB4MDFmMzJlN2QpLCBXVENQKDB4N2ZmYzAzNTQsIDB4MDFmZjI2YzUpLCBXVENQKDB4N2ZmYmQyM2IsIDB4MDIwYjRjZGUpLCBXVENQKDB4N2ZmYjlmM2EsIDB4MDIxN2ExMjApLAotICBXVENQKDB4N2ZmYjZhNDEsIDB4MDIyNDIzZTYpLCBXVENQKDB4N2ZmYjMzNDIsIDB4MDIzMGQ1OGEpLCBXVENQKDB4N2ZmYWZhMmQsIDB4MDIzZGI2NjQpLCBXVENQKDB4N2ZmYWJlZjIsIDB4MDI0YWM2Y2UpLAotICBXVENQKDB4N2ZmYTgxODAsIDB4MDI1ODA3MjApLCBXVENQKDB4N2ZmYTQxYzksIDB4MDI2NTc3YjMpLCBXVENQKDB4N2ZmOWZmYjksIDB4MDI3MzE4ZTApLCBXVENQKDB4N2ZmOWJiNDEsIDB4MDI4MGVhZmYpLAotICBXVENQKDB4N2ZmOTc0NGUsIDB4MDI4ZWVlNjgpLCBXVENQKDB4N2ZmOTJhY2YsIDB4MDI5ZDIzNzEpLCBXVENQKDB4N2ZmOGRlYjEsIDB4MDJhYjhhNzQpLCBXVENQKDB4N2ZmODhmZTIsIDB4MDJiYTIzYzcpLAotICBXVENQKDB4N2ZmODNlNGQsIDB4MDJjOGVmYzApLCBXVENQKDB4N2ZmN2U5ZTEsIDB4MDJkN2VlYjcpLCBXVENQKDB4N2ZmNzkyODgsIDB4MDJlNzIxMDEpLCBXVENQKDB4N2ZmNzM4MmYsIDB4MDJmNjg2ZjUpLAotICBXVENQKDB4N2ZmNmRhYzEsIDB4MDMwNjIwZTkpLCBXVENQKDB4N2ZmNjdhMjksIDB4MDMxNWVmMzEpLCBXVENQKDB4N2ZmNjE2NTEsIDB4MDMyNWYyMjQpLCBXVENQKDB4N2ZmNWFmMjMsIDB4MDMzNjJhMTQpLAotICBXVENQKDB4N2ZmNTQ0OGEsIDB4MDM0Njk3NTgpLCBXVENQKDB4N2ZmNGQ2NmQsIDB4MDM1NzNhNDIpLCBXVENQKDB4N2ZmNDY0YjcsIDB4MDM2ODEzMjcpLCBXVENQKDB4N2ZmM2VmNGYsIDB4MDM3OTIyNWEpLAotICBXVENQKDB4N2ZmMzc2MWQsIDB4MDM4YTY4MmUpLCBXVENQKDB4N2ZmMmY5MGEsIDB4MDM5YmU0ZjQpLCBXVENQKDB4N2ZmMjc3ZmIsIDB4MDNhZDk5MDApLCBXVENQKDB4N2ZmMWYyZDgsIDB4MDNiZjg0YTMpLAotICBXVENQKDB4N2ZmMTY5ODYsIDB4MDNkMWE4MmUpLCBXVENQKDB4N2ZmMGRiZWMsIDB4MDNlNDAzZjMpLCBXVENQKDB4N2ZmMDQ5ZWYsIDB4MDNmNjk4NDApLCBXVENQKDB4N2ZlZmIzNzMsIDB4MDQwOTY1NjgpLAotICBXVENQKDB4N2ZlZjE4NWQsIDB4MDQxYzZiYjgpLCBXVENQKDB4N2ZlZTc4OTAsIDB4MDQyZmFiODEpLCBXVENQKDB4N2ZlZGQzZjEsIDB4MDQ0MzI1MTApLCBXVENQKDB4N2ZlZDJhNjEsIDB4MDQ1NmQ4YjQpLAotICBXVENQKDB4N2ZlYzdiYzQsIDB4MDQ2YWM2YmEpLCBXVENQKDB4N2ZlYmM3ZmIsIDB4MDQ3ZWVmNzApLCBXVENQKDB4N2ZlYjBlZTgsIDB4MDQ5MzUzMjIpLCBXVENQKDB4N2ZlYTUwNmIsIDB4MDRhN2YyMWQpLAotICBXVENQKDB4N2ZlOThjNjUsIDB4MDRiY2NjYWIpLCBXVENQKDB4N2ZlOGMyYjcsIDB4MDRkMWUzMTgpLCBXVENQKDB4N2ZlN2YzM2UsIDB4MDRlNzM1YWYpLCBXVENQKDB4N2ZlNzFkZGIsIDB4MDRmY2M0YmEpLAotICBXVENQKDB4N2ZlNjQyNmMsIDB4MDUxMjkwODEpLCBXVENQKDB4N2ZlNTYwY2UsIDB4MDUyODk5NGQpLCBXVENQKDB4N2ZlNDc4ZGYsIDB4MDUzZWRmNjgpLCBXVENQKDB4N2ZlMzhhN2MsIDB4MDU1NTYzMTgpLAotICBXVENQKDB4N2ZlMjk1ODEsIDB4MDU2YzI0YTUpLCBXVENQKDB4N2ZlMTk5Y2EsIDB4MDU4MzI0NTUpLCBXVENQKDB4N2ZlMDk3MzMsIDB4MDU5YTYyNmUpLCBXVENQKDB4N2ZkZjhkOTUsIDB4MDViMWRmMzUpLAotICBXVENQKDB4N2ZkZTdjY2IsIDB4MDVjOTlhZWYpLCBXVENQKDB4N2ZkZDY0YWYsIDB4MDVlMTk1ZTApLCBXVENQKDB4N2ZkYzQ1MWEsIDB4MDVmOWQwNGIpLCBXVENQKDB4N2ZkYjFkZTQsIDB4MDYxMjRhNzMpLAotICBXVENQKDB4N2ZkOWVlZTUsIDB4MDYyYjA0OTkpLCBXVENQKDB4N2ZkOGI3ZjUsIDB4MDY0M2ZmMDApLCBXVENQKDB4N2ZkNzc4ZWMsIDB4MDY1ZDM5ZTcpLCBXVENQKDB4N2ZkNjMxOWUsIDB4MDY3NmI1OGYpLAotICBXVENQKDB4N2ZkNGUxZTIsIDB4MDY5MDcyMzcpLCBXVENQKDB4N2ZkMzg5OGQsIDB4MDZhYTcwMWQpLCBXVENQKDB4N2ZkMjI4NzMsIDB4MDZjNGFmODApLCBXVENQKDB4N2ZkMGJlNmEsIDB4MDZkZjMwOWMpLAotICBXVENQKDB4N2ZjZjRiNDQsIDB4MDZmOWYzYWQpLCBXVENQKDB4N2ZjZGNlZDQsIDB4MDcxNGY4ZjApLCBXVENQKDB4N2ZjYzQ4ZWQsIDB4MDczMDQwOWYpLCBXVENQKDB4N2ZjYWI5NjAsIDB4MDc0YmNhZjUpLAotICBXVENQKDB4N2ZjOTFmZmYsIDB4MDc2Nzk4MmEpLCBXVENQKDB4N2ZjNzdjOWEsIDB4MDc4M2E4NzcpLCBXVENQKDB4N2ZjNWNmMDIsIDB4MDc5ZmZjMTQpLCBXVENQKDB4N2ZjNDE3MDUsIDB4MDdiYzkzMzgpLAotICBXVENQKDB4N2ZjMjU0NzQsIDB4MDdkOTZlMTkpLCBXVENQKDB4N2ZjMDg3MWIsIDB4MDdmNjhjZWQpLCBXVENQKDB4N2ZiZWFlY2EsIDB4MDgxM2VmZTcpLCBXVENQKDB4N2ZiY2NiNGMsIDB4MDgzMTk3M2QpLAotICBXVENQKDB4N2ZiYWRjNzAsIDB4MDg0ZjgzMjApLCBXVENQKDB4N2ZiOGUyMDAsIDB4MDg2ZGIzYzMpLCBXVENQKDB4N2ZiNmRiYzgsIDB4MDg4YzI5NTcpLCBXVENQKDB4N2ZiNGM5OTMsIDB4MDhhYWU0MGMpLAotICBXVENQKDB4N2ZiMmFiMmIsIDB4MDhjOWU0MTIpLCBXVENQKDB4N2ZiMDgwNWEsIDB4MDhlOTI5OTcpLCBXVENQKDB4N2ZhZTQ4ZTksIDB4MDkwOGI0YzkpLCBXVENQKDB4N2ZhYzA0YTAsIDB4MDkyODg1ZDYpLAotICBXVENQKDB4N2ZhOWIzNDcsIDB4MDk0ODljZTgpLCBXVENQKDB4N2ZhNzU0YTYsIDB4MDk2OGZhMmMpLCBXVENQKDB4N2ZhNGU4ODQsIDB4MDk4OTlkY2IpLCBXVENQKDB4N2ZhMjZlYTYsIDB4MDlhYTg3ZWUpLAotICBXVENQKDB4N2Y5ZmU2ZDEsIDB4MDljYmI4YmUpLCBXVENQKDB4N2Y5ZDUwY2MsIDB4MDllZDMwNjIpLCBXVENQKDB4N2Y5YWFjNWEsIDB4MGEwZWVmMDApLCBXVENQKDB4N2Y5N2Y5M2YsIDB4MGEzMGY0YmYpLAotICBXVENQKDB4N2Y5NTM3M2UsIDB4MGE1MzQxYzIpLCBXVENQKDB4N2Y5MjY2MWIsIDB4MGE3NWQ2MmUpLCBXVENQKDB4N2Y4Zjg1OTYsIDB4MGE5OGIyMjQpLCBXVENQKDB4N2Y4Yzk1NzIsIDB4MGFiYmQ1YzcpLAotICBXVENQKDB4N2Y4OTk1NmYsIDB4MGFkZjQxMzcpLCBXVENQKDB4N2Y4Njg1NGQsIDB4MGIwMmY0OTQpLCBXVENQKDB4N2Y4MzY0Y2QsIDB4MGIyNmVmZmQpLCBXVENQKDB4N2Y4MDMzYWUsIDB4MGI0YjMzOGYpLAotICBXVENQKDB4N2Y3Y2YxYWUsIDB4MGI2ZmJmNjcpLCBXVENQKDB4N2Y3OTllOGIsIDB4MGI5NDkzYTApLCBXVENQKDB4N2Y3NjNhMDMsIDB4MGJiOWIwNTYpLCBXVENQKDB4N2Y3MmMzZDIsIDB4MGJkZjE1YTIpLAotICBXVENQKDB4N2Y2ZjNiYjUsIDB4MGMwNGMzOWMpLCBXVENQKDB4N2Y2YmExNjgsIDB4MGMyYWJhNWQpLCBXVENQKDB4N2Y2N2Y0YTYsIDB4MGM1MGY5ZmEpLCBXVENQKDB4N2Y2NDM1MjksIDB4MGM3NzgyOGEpLAotICBXVENQKDB4N2Y2MDYyYWMsIDB4MGM5ZTU0MjApLCBXVENQKDB4N2Y1YzdjZTgsIDB4MGNjNTZlZDEpLCBXVENQKDB4N2Y1ODgzOTcsIDB4MGNlY2QyYWUpLCBXVENQKDB4N2Y1NDc2NzAsIDB4MGQxNDdmYzgpLAotICBXVENQKDB4N2Y1MDU1MmMsIDB4MGQzYzc2MzApLCBXVENQKDB4N2Y0YzFmODMsIDB4MGQ2NGI1ZjYpLCBXVENQKDB4N2Y0N2Q1MmEsIDB4MGQ4ZDNmMjYpLCBXVENQKDB4N2Y0Mzc1ZDksIDB4MGRiNjExY2UpLAotICBXVENQKDB4N2YzZjAxNDQsIDB4MGRkZjJkZmEpLCBXVENQKDB4N2YzYTc3MjMsIDB4MGUwODkzYjQpLCBXVENQKDB4N2YzNWQ3MjksIDB4MGUzMjQzMDYpLCBXVENQKDB4N2YzMTIxMGEsIDB4MGU1YzNiZjkpLAotICBXVENQKDB4N2YyYzU0N2IsIDB4MGU4NjdlOTQpLCBXVENQKDB4N2YyNzcxMmUsIDB4MGViMTBhZGQpLCBXVENQKDB4N2YyMjc2ZDgsIDB4MGVkYmUwZGEpLCBXVENQKDB4N2YxZDY1MjksIDB4MGYwNzAwOGUpLAotICBXVENQKDB4N2YxODNiZDMsIDB4MGYzMjY5ZmMpLCBXVENQKDB4N2YxMmZhODksIDB4MGY1ZTFkMjcpLCBXVENQKDB4N2YwZGEwZmIsIDB4MGY4YTFhMGUpLCBXVENQKDB4N2YwODJlZDgsIDB4MGZiNjYwYjEpLAotICBXVENQKDB4N2YwMmEzZDIsIDB4MGZlMmYxMGYpLCBXVENQKDB4N2VmY2ZmOTgsIDB4MTAwZmNiMjUpLCBXVENQKDB4N2VmNzQxZDksIDB4MTAzY2VlZWUpLCBXVENQKDB4N2VmMTZhNDIsIDB4MTA2YTVjNjYpLAotICBXVENQKDB4N2VlYjc4ODQsIDB4MTA5ODEzODYpLCBXVENQKDB4N2VlNTZjNGEsIDB4MTBjNjE0NDcpLCBXVENQKDB4N2VkZjQ1NDMsIDB4MTBmNDVlYTApLCBXVENQKDB4N2VkOTAzMWIsIDB4MTEyMmYyODgpLAotICBXVENQKDB4N2VkMmE1N2YsIDB4MTE1MWNmZjMpLCBXVENQKDB4N2VjYzJjMWEsIDB4MTE4MGY2ZDUpLCBXVENQKDB4N2VjNTk2OTksIDB4MTFiMDY3MjApLCBXVENQKDB4N2ViZWU0YTYsIDB4MTFlMDIwYzgpLAotICBXVENQKDB4N2ViODE1ZWQsIDB4MTIxMDIzYmEpLCBXVENQKDB4N2ViMTJhMTgsIDB4MTI0MDZmZTgpLCBXVENQKDB4N2VhYTIwZDEsIDB4MTI3MTA1M2UpLCBXVENQKDB4N2VhMmY5YzIsIDB4MTJhMWUzYTkpLAotICBXVENQKDB4N2U5YmI0OTQsIDB4MTJkMzBiMTUpLCBXVENQKDB4N2U5NDUwZjAsIDB4MTMwNDdiNmMpLCBXVENQKDB4N2U4Y2NlN2YsIDB4MTMzNjM0OTcpLCBXVENQKDB4N2U4NTJjZTksIDB4MTM2ODM2N2YpLAotICBXVENQKDB4N2U3ZDZiZDYsIDB4MTM5YTgxMDkpLCBXVENQKDB4N2U3NThhZWUsIDB4MTNjZDE0MWIpLCBXVENQKDB4N2U2ZDg5ZDksIDB4MTNmZmVmOTkpLCBXVENQKDB4N2U2NTY4M2QsIDB4MTQzMzEzNjgpLAotICBXVENQKDB4N2U1ZDI1YzEsIDB4MTQ2NjdmNjcpLCBXVENQKDB4N2U1NGMyMGIsIDB4MTQ5YTMzNzkpLCBXVENQKDB4N2U0YzNjYzMsIDB4MTRjZTJmN2MpLCBXVENQKDB4N2U0Mzk1OGUsIDB4MTUwMjczNGYpLAotICBXVENQKDB4N2UzYWNjMTEsIDB4MTUzNmZlY2UpLCBXVENQKDB4N2UzMWRmZjIsIDB4MTU2YmQxZDYpLCBXVENQKDB4N2UyOGQwZDcsIDB4MTVhMGVjNDEpLCBXVENQKDB4N2UxZjllNjMsIDB4MTVkNjRkZTkpLAotICBXVENQKDB4N2UxNjQ4M2QsIDB4MTYwYmY2YTUpLCBXVENQKDB4N2UwY2NlMDgsIDB4MTY0MWU2NGMpLCBXVENQKDB4N2UwMzJmNmEsIDB4MTY3ODFjYjQpLCBXVENQKDB4N2RmOTZjMDUsIDB4MTZhZTk5YjIpLAotICBXVENQKDB4N2RlZjgzN2UsIDB4MTZlNTVkMTgpLCBXVENQKDB4N2RlNTc1NzksIDB4MTcxYzY2YmEpLCBXVENQKDB4N2RkYjQxOWEsIDB4MTc1M2I2NjcpLCBXVENQKDB4N2RkMGU3ODQsIDB4MTc4YjRiZWYpLAotICBXVENQKDB4N2RjNjY2ZDksIDB4MTdjMzI3MjEpLCBXVENQKDB4N2RiYmJmM2UsIDB4MTdmYjQ3Y2EpLCBXVENQKDB4N2RiMGYwNTYsIDB4MTgzM2FkYjUpLCBXVENQKDB4N2RhNWY5YzMsIDB4MTg2YzU4YWUpLAotICBXVENQKDB4N2Q5YWRiMjksIDB4MThhNTQ4N2QpLCBXVENQKDB4N2Q4Zjk0MjksIDB4MThkZTdjZWMpLCBXVENQKDB4N2Q4NDI0NjcsIDB4MTkxN2Y1YzEpLCBXVENQKDB4N2Q3ODhiODYsIDB4MTk1MWIyYzIpLAotICBXVENQKDB4N2Q2Y2M5MjcsIDB4MTk4YmIzYjQpLCBXVENQKDB4N2Q2MGRjZWQsIDB4MTljNWY4NWEpLCBXVENQKDB4N2Q1NGM2N2MsIDB4MWEwMDgwNzcpLCBXVENQKDB4N2Q0ODg1NzQsIDB4MWEzYjRiY2IpLAotICBXVENQKDB4N2QzYzE5NzksIDB4MWE3NjVhMTcpLCBXVENQKDB4N2QyZjgyMmQsIDB4MWFiMWFiMTgpLCBXVENQKDB4N2QyMmJmMzIsIDB4MWFlZDNlOGQpLCBXVENQKDB4N2QxNWQwMmIsIDB4MWIyOTE0MzIpLAotICBXVENQKDB4N2QwOGI0YmEsIDB4MWI2NTJiYzEpLCBXVENQKDB4N2NmYjZjODIsIDB4MWJhMTg0ZjUpLCBXVENQKDB4N2NlZGY3MjUsIDB4MWJkZTFmODYpLCBXVENQKDB4N2NlMDU0NDUsIDB4MWMxYWZiMmMpLAotICBXVENQKDB4N2NkMjgzODYsIDB4MWM1ODE3OWMpLCBXVENQKDB4N2NjNDg0ODksIDB4MWM5NTc0OGQpLCBXVENQKDB4N2NiNjU2ZjMsIDB4MWNkMzExYjEpLCBXVENQKDB4N2NhN2ZhNjUsIDB4MWQxMGVlYmQpLAotICBXVENQKDB4N2M5OTZlODMsIDB4MWQ0ZjBiNjApLCBXVENQKDB4N2M4YWIyZjAsIDB4MWQ4ZDY3NGMpLCBXVENQKDB4N2M3YmM3NGYsIDB4MWRjYzAyMzApLCBXVENQKDB4N2M2Y2FiNDQsIDB4MWUwYWRiYmIpLAotICBXVENQKDB4N2M1ZDVlNzEsIDB4MWU0OWYzOTgpLCBXVENQKDB4N2M0ZGUwN2MsIDB4MWU4OTQ5NzMpLCBXVENQKDB4N2MzZTMxMDgsIDB4MWVjOGRjZjgpLCBXVENQKDB4N2MyZTRmYjksIDB4MWYwOGFkZDApLAotICBXVENQKDB4N2MxZTNjMzQsIDB4MWY0OGJiYTMpLCBXVENQKDB4N2MwZGY2MWQsIDB4MWY4OTA2MTgpLCBXVENQKDB4N2JmZDdkMTgsIDB4MWZjOThjZDYpLCBXVENQKDB4N2JlY2QwY2MsIDB4MjAwYTRmODApLAotICBXVENQKDB4N2JkYmYwZGQsIDB4MjA0YjRkYmMpLCBXVENQKDB4N2JjYWRjZjEsIDB4MjA4Yzg3MmMpLCBXVENQKDB4N2JiOTk0YWUsIDB4MjBjZGZiNzEpLCBXVENQKDB4N2JhODE3YjksIDB4MjEwZmFhMmMpLAotICBXVENQKDB4N2I5NjY1YmIsIDB4MjE1MTkyZmMpLCBXVENQKDB4N2I4NDdlNTgsIDB4MjE5M2I1N2YpLCBXVENQKDB4N2I3MjYxMzksIDB4MjFkNjExNTMpLCBXVENQKDB4N2I2MDBlMDUsIDB4MjIxOGE2MTQpLAotICBXVENQKDB4N2I0ZDg0NjMsIDB4MjI1YjczNWQpLCBXVENQKDB4N2IzYWMzZmMsIDB4MjI5ZTc4YzcpLCBXVENQKDB4N2IyN2NjNzksIDB4MjJlMWI1ZWIpLCBXVENQKDB4N2IxNDlkODIsIDB4MjMyNTJhNjIpLAotICBXVENQKDB4N2IwMTM2YzEsIDB4MjM2OGQ1YzIpLCBXVENQKDB4N2FlZDk3ZGYsIDB4MjNhY2I3YTApLCBXVENQKDB4N2FkOWMwODcsIDB4MjNmMGNmOTIpLCBXVENQKDB4N2FjNWIwNjMsIDB4MjQzNTFkMmEpLAotICBXVENQKDB4N2FiMTY3MWUsIDB4MjQ3OTlmZmMpLCBXVENQKDB4N2E5Y2U0NjQsIDB4MjRiZTU3OTkpLCBXVENQKDB4N2E4ODI3ZTEsIDB4MjUwMzQzOTEpLCBXVENQKDB4N2E3MzMxNDIsIDB4MjU0ODYzNzUpLAotICBXVENQKDB4N2E1ZTAwMzMsIDB4MjU4ZGI2ZDIpLCBXVENQKDB4N2E0ODk0NjEsIDB4MjVkMzNkMzUpLCBXVENQKDB4N2EzMmVkN2MsIDB4MjYxOGY2MmMpLCBXVENQKDB4N2ExZDBiMzEsIDB4MjY1ZWUxNDMpLAotICBXVENQKDB4N2EwNmVkMmYsIDB4MjZhNGZlMDIpLCBXVENQKDB4NzlmMDkzMjcsIDB4MjZlYjRiZjUpLCBXVENQKDB4NzlkOWZjYzgsIDB4MjczMWNhYTMpLCBXVENQKDB4NzljMzI5YzIsIDB4Mjc3ODc5OTUpLAotICBXVENQKDB4NzlhYzE5YzksIDB4MjdiZjU4NTApLCBXVENQKDB4Nzk5NGNjOGQsIDB4MjgwNjY2NWMpLCBXVENQKDB4Nzk3ZDQxYzEsIDB4Mjg0ZGEzM2MpLCBXVENQKDB4Nzk2NTc5MTgsIDB4Mjg5NTBlNzQpLAotICBXVENQKDB4Nzk0ZDcyNDcsIDB4MjhkY2E3ODgpLCBXVENQKDB4NzkzNTJkMDEsIDB4MjkyNDZkZmEpLCBXVENQKDB4NzkxY2E4ZmMsIDB4Mjk2YzYxNGEpLCBXVENQKDB4NzkwM2U1ZWUsIDB4MjliNDgwZjkpLAotICBXVENQKDB4NzhlYWUzOGQsIDB4MjlmY2NjODcpLCBXVENQKDB4NzhkMWExOTEsIDB4MmE0NTQzNzIpLCBXVENQKDB4NzhiODFmYjEsIDB4MmE4ZGU1MzcpLCBXVENQKDB4Nzg5ZTVkYTYsIDB4MmFkNmIxNTUpLAotICBXVENQKDB4Nzg4NDViMjksIDB4MmIxZmE3NDUpLCBXVENQKDB4Nzg2YTE3ZjUsIDB4MmI2OGM2ODQpLCBXVENQKDB4Nzg0ZjkzYzQsIDB4MmJiMjBlOGMpLCBXVENQKDB4NzgzNGNlNTMsIDB4MmJmYjdlZDcpLAotICBXVENQKDB4NzgxOWM3NWMsIDB4MmM0NTE2ZGMpLCBXVENQKDB4NzdmZTdlOWUsIDB4MmM4ZWQ2MTUpLCBXVENQKDB4NzdlMmYzZDcsIDB4MmNkOGJiZjcpLCBXVENQKDB4NzdjNzI2YzUsIDB4MmQyMmM3ZmEpLAotICBXVENQKDB4NzdhYjE3MjgsIDB4MmQ2Y2Y5OTMpLCBXVENQKDB4Nzc4ZWM0YzAsIDB4MmRiNzUwMzcpLCBXVENQKDB4Nzc3MjJmNGUsIDB4MmUwMWNiNTkpLCBXVENQKDB4Nzc1NTU2OTUsIDB4MmU0YzZhNmQpLAotICBXVENQKDB4NzczODNhNTgsIDB4MmU5NzJjZTYpLCBXVENQKDB4NzcxYWRhNWEsIDB4MmVlMjEyMzUpLCBXVENQKDB4NzZmZDM2NjAsIDB4MmYyZDE5Y2MpLCBXVENQKDB4NzZkZjRlMzAsIDB4MmY3ODQzMWEpLAotICBXVENQKDB4NzZjMTIxOTAsIDB4MmZjMzhkOTEpLCBXVENQKDB4NzZhMmIwNDcsIDB4MzAwZWY4OWQpLCBXVENQKDB4NzY4M2ZhMWUsIDB4MzA1YTgzYWYpLCBXVENQKDB4NzY2NGZlZGUsIDB4MzBhNjJlMzQpLAotICBXVENQKDB4NzY0NWJlNTEsIDB4MzBmMWY3OTgpLCBXVENQKDB4NzYyNjM4NDIsIDB4MzEzZGRmNDkpLCBXVENQKDB4NzYwNjZjN2UsIDB4MzE4OWU0YjEpLCBXVENQKDB4NzVlNjVhZDEsIDB4MzFkNjA3M2QpLAotICBXVENQKDB4NzVjNjAzMDksIDB4MzIyMjQ2NTcpLCBXVENQKDB4NzVhNTY0ZjYsIDB4MzI2ZWExNjgpLCBXVENQKDB4NzU4NDgwNjcsIDB4MzJiYjE3ZGEpLCBXVENQKDB4NzU2MzU1MmQsIDB4MzMwN2E5MTcpLAotICBXVENQKDB4NzU0MWUzMWEsIDB4MzM1NDU0ODYpLCBXVENQKDB4NzUyMDJhMDIsIDB4MzNhMTE5OGUpLCBXVENQKDB4NzRmZTI5YjgsIDB4MzNlZGY3OTgpLCBXVENQKDB4NzRkYmUyMTEsIDB4MzQzYWVlMDkpLAotICBXVENQKDB4NzRiOTUyZTMsIDB4MzQ4N2ZjNDgpLCBXVENQKDB4NzQ5NjdjMDYsIDB4MzRkNTIxYmIpLCBXVENQKDB4NzQ3MzVkNTEsIDB4MzUyMjVkYzcpLCBXVENQKDB4NzQ0ZmY2OWYsIDB4MzU2ZmFmY2YpLAotICBXVENQKDB4NzQyYzQ3YzksIDB4MzViZDE3M2EpLCBXVENQKDB4NzQwODUwYWIsIDB4MzYwYTkzNjkpLCBXVENQKDB4NzNlNDExMjEsIDB4MzY1ODIzYzEpLCBXVENQKDB4NzNiZjg5MDksIDB4MzZhNWM3YTQpLAotICBXVENQKDB4NzM5YWI4NDIsIDB4MzZmMzdlNzUpLCBXVENQKDB4NzM3NTllYWIsIDB4Mzc0MTQ3OTYpLCBXVENQKDB4NzM1MDNjMjYsIDB4Mzc4ZjIyNjgpLCBXVENQKDB4NzMyYTkwOTUsIDB4MzdkZDBlNGMpLAotICBXVENQKDB4NzMwNDliZGEsIDB4MzgyYjBhYTQpLCBXVENQKDB4NzJkZTVkZGIsIDB4Mzg3OTE2ZDApLCBXVENQKDB4NzJiN2Q2N2QsIDB4MzhjNzMyMzApLCBXVENQKDB4NzI5MTA1YTYsIDB4MzkxNTVjMjQpLAotICBXVENQKDB4NzI2OWViM2YsIDB4Mzk2Mzk0MGMpLCBXVENQKDB4NzI0Mjg3MzAsIDB4MzliMWQ5NDYpLCBXVENQKDB4NzIxYWQ5NjQsIDB4M2EwMDJiMzEpLCBXVENQKDB4NzFmMmUxYzUsIDB4M2E0ZTg5MmMpLAotICBXVENQKDB4NzFjYWEwNDIsIDB4M2E5Y2YyOTYpLCBXVENQKDB4NzFhMjE0YzcsIDB4M2FlYjY2Y2MpLCBXVENQKDB4NzE3OTNmNDMsIDB4M2IzOWU1MmMpLCBXVENQKDB4NzE1MDFmYTYsIDB4M2I4ODZkMTQpLAotICBXVENQKDB4NzEyNmI1ZTMsIDB4M2JkNmZkZTEpLCBXVENQKDB4NzBmZDAxZWIsIDB4M2MyNTk2ZjEpLCBXVENQKDB4NzBkMzAzYjIsIDB4M2M3NDM3OWYpLCBXVENQKDB4NzBhOGJiMmUsIDB4M2NjMmRmNDkpLAotICBXVENQKDB4NzA3ZTI4NTUsIDB4M2QxMThkNGMpLCBXVENQKDB4NzA1MzRiMWUsIDB4M2Q2MDQxMDMpLCBXVENQKDB4NzAyODIzODEsIDB4M2RhZWY5Y2MpLCBXVENQKDB4NmZmY2IxN2EsIDB4M2RmZGI3MDIpLAotICBXVENQKDB4NmZkMGY1MDQsIDB4M2U0Yzc4MDApLCBXVENQKDB4NmZhNGVlMWEsIDB4M2U5YjNjMjUpLCBXVENQKDB4NmY3ODljYmIsIDB4M2VlYTAyY2EpLCBXVENQKDB4NmY0YzAwZTUsIDB4M2YzOGNiNGIpLAotICBXVENQKDB4NmYxZjFhOWEsIDB4M2Y4Nzk1MDUpLCBXVENQKDB4NmVmMWU5ZGEsIDB4M2ZkNjVmNTMpLCBXVENQKDB4NmVjNDZlYTksIDB4NDAyNTI5OTApLCBXVENQKDB4NmU5NmE5MGIsIDB4NDA3M2YzMTgpLAotICBXVENQKDB4NmU2ODk5MDUsIDB4NDBjMmJiNDYpLCBXVENQKDB4NmUzYTNlOWQsIDB4NDExMTgxNzYpLCBXVENQKDB4NmUwYjk5ZGQsIDB4NDE2MDQ1MDQpLCBXVENQKDB4NmRkY2FhY2MsIDB4NDFhZjA1NGEpLAotICBXVENQKDB4NmRhZDcxNzcsIDB4NDFmZGMxYTUpLCBXVENQKDB4NmQ3ZGVkZTgsIDB4NDI0Yzc5NzApLCBXVENQKDB4NmQ0ZTIwMmUsIDB4NDI5YjJjMDYpLCBXVENQKDB4NmQxZTA4NTUsIDB4NDJlOWQ4YzQpLAotICBXVENQKDB4NmNlZGE2NmYsIDB4NDMzODdmMDUpLCBXVENQKDB4NmNiY2ZhOGQsIDB4NDM4NzFlMjYpLCBXVENQKDB4NmM4YzA0YzAsIDB4NDNkNWI1ODEpLCBXVENQKDB4NmM1YWM1MWQsIDB4NDQyNDQ0NzQpLAotICBXVENQKDB4NmMyOTNiYjgsIDB4NDQ3MmNhNWEpLCBXVENQKDB4NmJmNzY4YTgsIDB4NDRjMTQ2OTApLCBXVENQKDB4NmJjNTRjMDYsIDB4NDUwZmI4NzMpLCBXVENQKDB4NmI5MmU1ZTksIDB4NDU1ZTFmNWYpLAotICBXVENQKDB4NmI2MDM2NmMsIDB4NDVhYzdhYjIpLCBXVENQKDB4NmIyZDNkYWIsIDB4NDVmYWM5YzgpLCBXVENQKDB4NmFmOWZiYzIsIDB4NDY0OTBiZmYpLCBXVENQKDB4NmFjNjcwZDEsIDB4NDY5NzQwYjUpLAotICBXVENQKDB4NmE5MjljZjYsIDB4NDZlNTY3NDcpLCBXVENQKDB4NmE1ZTgwNTMsIDB4NDczMzdmMTMpLCBXVENQKDB4NmEyYTFiMGEsIDB4NDc4MTg3NzkpLCBXVENQKDB4NjlmNTZkM2UsIDB4NDdjZjdmZDYpLAotICBXVENQKDB4NjljMDc3MTUsIDB4NDgxZDY3OGEpLCBXVENQKDB4Njk4YjM4YjQsIDB4NDg2YjNkZjMpLCBXVENQKDB4Njk1NWIyNDMsIDB4NDhiOTAyNzIpLCBXVENQKDB4NjkxZmUzZWMsIDB4NDkwNmI0NjYpLAotICBXVENQKDB4NjhlOWNkZDgsIDB4NDk1NDUzMzApLCBXVENQKDB4NjhiMzcwMzMsIDB4NDlhMWRlMzApLCBXVENQKDB4Njg3Y2NiMjksIDB4NDllZjU0YzgpLCBXVENQKDB4Njg0NWRlZTksIDB4NGEzY2I2NTcpLAotICBXVENQKDB4NjgwZWFiYTMsIDB4NGE4YTAyNDIpLCBXVENQKDB4NjdkNzMxODcsIDB4NGFkNzM3ZTkpLCBXVENQKDB4Njc5ZjcwYzcsIDB4NGIyNDU2YWYpLCBXVENQKDB4Njc2NzY5OTcsIDB4NGI3MTVkZjcpLAotICBXVENQKDB4NjcyZjFjMmIsIDB4NGJiZTRkMjUpLCBXVENQKDB4NjZmNjg4YmEsIDB4NGMwYjIzOWMpLCBXVENQKDB4NjZiZGFmN2IsIDB4NGM1N2UwYzIpLCBXVENQKDB4NjY4NDkwYTYsIDB4NGNhNDgzZmEpLAotICBXVENQKDB4NjY0YjJjNzYsIDB4NGNmMTBjYWMpLCBXVENQKDB4NjYxMTgzMjYsIDB4NGQzZDdhM2IpLCBXVENQKDB4NjVkNzk0ZjMsIDB4NGQ4OWNjMGYpLCBXVENQKDB4NjU5ZDYyMWEsIDB4NGRkNjAxOGYpLAotICBXVENQKDB4NjU2MmVhZGEsIDB4NGUyMjFhMjIpLCBXVENQKDB4NjUyODJmNzQsIDB4NGU2ZTE1MzApLCBXVENQKDB4NjRlZDMwMmIsIDB4NGViOWYyMjIpLCBXVENQKDB4NjRiMWVkNDAsIDB4NGYwNWIwNjEpLAotICBXVENQKDB4NjQ3NjY2ZjgsIDB4NGY1MTRmNTcpLCBXVENQKDB4NjQzYTlkOTksIDB4NGY5Y2NlNmYpLCBXVENQKDB4NjNmZTkxNmEsIDB4NGZlODJkMTMpLCBXVENQKDB4NjNjMjQyYjIsIDB4NTAzMzZhYWYpLAotICBXVENQKDB4NjM4NWIxYmMsIDB4NTA3ZTg2YjApLCBXVENQKDB4NjM0OGRlZDEsIDB4NTBjOTgwODIpLCBXVENQKDB4NjMwYmNhM2YsIDB4NTExNDU3OTMpLCBXVENQKDB4NjJjZTc0NTEsIDB4NTE1ZjBiNTEpLAotICBXVENQKDB4NjI5MGRkNTcsIDB4NTFhOTliMmIpLCBXVENQKDB4NjI1MzA1YTAsIDB4NTFmNDA2OTIpLCBXVENQKDB4NjIxNGVkN2QsIDB4NTIzZTRjZjUpLCBXVENQKDB4NjFkNjk1NDEsIDB4NTI4ODZkYzUpLAotICBXVENQKDB4NjE5N2ZkM2UsIDB4NTJkMjY4NzUpLCBXVENQKDB4NjE1OTI1YzksIDB4NTMxYzNjNzcpLCBXVENQKDB4NjExYTBmMzksIDB4NTM2NWU5M2UpLCBXVENQKDB4NjBkYWI5ZTMsIDB4NTNhZjZlM2UpLAotICBXVENQKDB4NjA5YjI2MjEsIDB4NTNmOGNhZWQpLCBXVENQKDB4NjA1YjU0NGMsIDB4NTQ0MWZlYzApLCBXVENQKDB4NjAxYjQ0YmYsIDB4NTQ4YjA5MmUpLCBXVENQKDB4NWZkYWY3ZDUsIDB4NTRkM2U5YWUpLAotICBXVENQKDB4NWY5YTZkZWIsIDB4NTUxYzlmYjcpLCBXVENQKDB4NWY1OWE3NjEsIDB4NTU2NTJhYzMpLCBXVENQKDB4NWYxOGE0OTQsIDB4NTVhZDhhNGQpLCBXVENQKDB4NWVkNzY1ZTYsIDB4NTVmNWJkY2QpLAotICBXVENQKDB4NWU5NWViYjgsIDB4NTYzZGM0YzEpLCBXVENQKDB4NWU1NDM2NmQsIDB4NTY4NTllYTMpLCBXVENQKDB4NWUxMjQ2NmEsIDB4NTZjZDRhZjMpLCBXVENQKDB4NWRkMDFjMTMsIDB4NTcxNGM5MmQpLAotICBXVENQKDB4NWQ4ZGI3Y2YsIDB4NTc1YzE4ZDApLCBXVENQKDB4NWQ0YjFhMDUsIDB4NTdhMzM5NWUpLCBXVENQKDB4NWQwODQzMWUsIDB4NTdlYTJhNTYpLCBXVENQKDB4NWNjNTMzODQsIDB4NTgzMGViM2EpLAotICBXVENQKDB4NWM4MWViYTAsIDB4NTg3NzdiOGUpLCBXVENQKDB4NWMzZTZiZGYsIDB4NThiZGRhZDUpLCBXVENQKDB4NWJmYWI0YWYsIDB4NTkwNDA4OTMpLCBXVENQKDB4NWJiNmM2N2MsIDB4NTk0YTA0NGYpLAotICBXVENQKDB4NWI3MmExYjYsIDB4NTk4ZmNkOGUpLCBXVENQKDB4NWIyZTQ2Y2UsIDB4NTlkNTYzZDkpLCBXVENQKDB4NWFlOWI2MzQsIDB4NWExYWM2YjgpLCBXVENQKDB4NWFhNGYwNWEsIDB4NWE1ZmY1YjUpLAorY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDZbXSA9IHsKKyAgICBTVEMoMHg0MDAwMDAwMCksCisgICAgU1RDKDB4YzAwMDAwMDApLAogfTsKIAogUkFNX0FMSUdOCiBMTktfU0VDVElPTl9DT05TVERBVEEKLWNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3cxMjBbXSA9Ci17Ci0gIFdUQ1AoMHg3ZmZmNGM1NCwgMHgwMGQ2NzZlYiksIFdUQ1AoMHg3ZmY5YWYwNCwgMHgwMjgzNWI1YSksIFdUQ1AoMHg3ZmVlNzRhMiwgMHgwNDMwMjM4ZiksIFdUQ1AoMHg3ZmRkOWRhZCwgMHgwNWRjYmNiZSksCi0gIFdUQ1AoMHg3ZmM3MmFlMiwgMHgwNzg5MTQxOCksIFdUQ1AoMHg3ZmFiMWQzZCwgMHgwOTM1MTZkNCksIFdUQ1AoMHg3Zjg5NzVmOSwgMHgwYWUwYjIyYyksIFdUQ1AoMHg3ZjYyMzY4ZiwgMHgwYzhiZDM1ZSksCi0gIFdUQ1AoMHg3ZjM1NjBiOSwgMHgwZTM2NjdhZCksIFdUQ1AoMHg3ZjAyZjY2ZiwgMHgwZmUwNWM2NCksIFdUQ1AoMHg3ZWNhZjllNSwgMHgxMTg5OWVkMyksIFdUQ1AoMHg3ZThkNmQ5MSwgMHgxMzMyMWM1MyksCi0gIFdUQ1AoMHg3ZTRhNTQyNiwgMHgxNGQ5YzI0NSksIFdUQ1AoMHg3ZTAxYjA5NiwgMHgxNjgwN2UxNSksIFdUQ1AoMHg3ZGIzODYwZiwgMHgxODI2M2QzNiksIFdUQ1AoMHg3ZDVmZDgwMSwgMHgxOWNhZWQyOSksCi0gIFdUQ1AoMHg3ZDA2YWExNiwgMHgxYjZlN2I3YSksIFdUQ1AoMHg3Y2E4MDAzOCwgMHgxZDEwZDVjMiksIFdUQ1AoMHg3YzQzZGU4ZSwgMHgxZWIxZTlhNyksIFdUQ1AoMHg3YmRhNDk3ZCwgMHgyMDUxYTRkZCksCi0gIFdUQ1AoMHg3YjZiNDVhNSwgMHgyMWVmZjUyOCksIFdUQ1AoMHg3YWY2ZDdlNiwgMHgyMzhjYzg1ZCksIFdUQ1AoMHg3YTdkMDU1YiwgMHgyNTI4MGM1ZSksIFdUQ1AoMHg3OWZkZDM1YywgMHgyNmMxYWYyMiksCi0gIFdUQ1AoMHg3OTc5NDc3ZCwgMHgyODU5OWViMCksIFdUQ1AoMHg3OGVmNjc4ZiwgMHgyOWVmYzkyNSksIFdUQ1AoMHg3ODYwMzk5ZSwgMHgyYjg0MWNhZiksIFdUQ1AoMHg3N2NiYzNmMiwgMHgyZDE2ODc5MiksCi0gIFdUQ1AoMHg3NzMyMGQwZCwgMHgyZWE2ZjgyNyksIFdUQ1AoMHg3NjkzMWJhZSwgMHgzMDM1NWNkZCksIFdUQ1AoMHg3NWVlZjZjZSwgMHgzMWMxYTQzYiksIFdUQ1AoMHg3NTQ1YTVhMCwgMHgzMzRiYmNkZSksCi0gIFdUQ1AoMHg3NDk3MmY5MiwgMHgzNGQzOTU3ZSksIFdUQ1AoMHg3M2UzOWM0OSwgMHgzNjU5MWNlYSksIFdUQ1AoMHg3MzJhZjNhNywgMHgzN2RjNDIwYyksIFdUQ1AoMHg3MjZkM2RjNiwgMHgzOTVjZjNlOSksCi0gIFdUQ1AoMHg3MWFhODJmNywgMHgzYWRiMjFhMSksIFdUQ1AoMHg3MGUyY2JjNiwgMHgzYzU2YmE3MCksIFdUQ1AoMHg3MDE2MjBmNSwgMHgzZGNmYWRiMCksIFdUQ1AoMHg2ZjQ0OGI3ZSwgMHgzZjQ1ZWFkOCksCi0gIFdUQ1AoMHg2ZTZlMTQ5MiwgMHg0MGI5NjE3ZCksIFdUQ1AoMHg2ZDkyYzU5YiwgMHg0MjJhMDE1NCksIFdUQ1AoMHg2Y2IyYTgzNywgMHg0Mzk3YmEzMiksIFdUQ1AoMHg2YmNkYzYzOSwgMHg0NTAyN2MwYyksCi0gIFdUQ1AoMHg2YWU0MjlhZSwgMHg0NjZhMzZmOSksIFdUQ1AoMHg2OWY1ZGNkMywgMHg0N2NlZGIzMSksIFdUQ1AoMHg2OTAyZWExZCwgMHg0OTMwNTkwZiksIFdUQ1AoMHg2ODBiNWMzMywgMHg0YThlYTExMSksCi0gIFdUQ1AoMHg2NzBmM2RmMywgMHg0YmU5YTNkYiksIFdUQ1AoMHg2NjBlOWE2YSwgMHg0ZDQxNTIzNCksIFdUQ1AoMHg2NTA5N2NkYiwgMHg0ZTk1OWQwOCksIFdUQ1AoMHg2M2ZmZjBiYSwgMHg0ZmU2NzU2YSksCi0gIFdUQ1AoMHg2MmYyMDFhYywgMHg1MTMzY2M5NCksIFdUQ1AoMHg2MWRmYmI4YSwgMHg1MjdkOTNlNiksIFdUQ1AoMHg2MGM5MmE1YSwgMHg1M2MzYmNlYSksIFdUQ1AoMHg1ZmFlNWE1NSwgMHg1NTA2Mzk1MSksCi0gIFdUQ1AoMHg1ZThmNTdlMiwgMHg1NjQ0ZmFmNCksIFdUQ1AoMHg1ZDZjMmY5OSwgMHg1NzdmZjNkYSksIFdUQ1AoMHg1YzQ0ZWU0MCwgMHg1OGI3MTYzMiksIFdUQ1AoMHg1YjE5YTBjOCwgMHg1OWVhNTQ1NCksCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnNltdID0geworICAgIFNUQygweDZlZDllYmExKSwKKyAgICBTVEMoMHg2ZWQ5ZWJhMSksCiB9OwogCiBSQU1fQUxJR04KIExOS19TRUNUSU9OX0NPTlNUREFUQQotY29uc3QgRklYUF9XVFAgS0JEV2luZG93MTIwW10gPQotewotICBXVENQKDB4N2ZmZmZmZmUsIDB4MDAwMTdiNmYpLCBXVENQKDB4N2ZmZmZmZWYsIDB4MDAwNDJkMmYpLCBXVENQKDB4N2ZmZmZmYmIsIDB4MDAwODQ5ZDApLCBXVENQKDB4N2ZmZmZmMzYsIDB4MDAwZTM0OTQpLAotICBXVENQKDB4N2ZmZmZlMGMsIDB4MDAxNjVlZmQpLCBXVENQKDB4N2ZmZmZiYWMsIDB4MDAyMTQ5YmUpLCBXVENQKDB4N2ZmZmY3MmUsIDB4MDAyZjg1NGMpLCBXVENQKDB4N2ZmZmVmMjQsIDB4MDA0MWIyMzUpLAotICBXVENQKDB4N2ZmZmUxNjcsIDB4MDA1ODgxNGYpLCBXVENQKDB4N2ZmZmNhY2QsIDB4MDA3NGIzYWYpLCBXVENQKDB4N2ZmZmE2ZDAsIDB4MDA5NzFhNjcpLCBXVENQKDB4N2ZmZjZmMWUsIDB4MDBjMDk2MGUpLAotICBXVENQKDB4N2ZmZjFiMTIsIDB4MDBmMjE2MDIpLCBXVENQKDB4N2ZmZTlmMGIsIDB4MDEyYzk3NzUpLCBXVENQKDB4N2ZmZGViYjIsIDB4MDE3MTI0MjgpLCBXVENQKDB4N2ZmY2VkMWIsIDB4MDFjMGQwZjcpLAotICBXVENQKDB4N2ZmYjg5YzIsIDB4MDIxY2JjMTIpLCBXVENQKDB4N2ZmOWExN2MsIDB4MDI4NjBiMDUpLCBXVENQKDB4N2ZmNzBjMzksIDB4MDJmZGU4NzUpLCBXVENQKDB4N2ZmMzk4YmMsIDB4MDM4NTgxYjMpLAotICBXVENQKDB4N2ZlZjBiM2IsIDB4MDQxZTA0MGMpLCBXVENQKDB4N2ZlOTFiZjMsIDB4MDRjODk5ZjQpLCBXVENQKDB4N2ZlMTc1YmEsIDB4MDU4NjY4MDMpLCBXVENQKDB4N2ZkN2I0OTMsIDB4MDY1ODg5ZDUpLAotICBXVENQKDB4N2ZjYjY0NTksIDB4MDc0MDBlZDQpLCBXVENQKDB4N2ZiYmZmODIsIDB4MDgzZGY2ZTkpLCBXVENQKDB4N2ZhOGVlMDksIDB4MDk1MzJmMzcpLCBXVENQKDB4N2Y5MTg0OWEsIDB4MGE4MDhlZDEpLAotICBXVENQKDB4N2Y3NTAzZjIsIDB4MGJjNmQzODEpLCBXVENQKDB4N2Y1Mjk4OWEsIDB4MGQyNjllYjApLCBXVENQKDB4N2YyOTVhZjQsIDB4MGVhMDcyNzApLCBXVENQKDB4N2VmODRmYjYsIDB4MTAzNGFlYjYpLAotICBXVENQKDB4N2ViZTY4YzUsIDB4MTFlMzhlZDIpLCBXVENQKDB4N2U3YTg2ODYsIDB4MTNhZDI3MzMpLCBXVENQKDB4N2UyYjc5YTMsIDB4MTU5MTYzNmQpLCBXVENQKDB4N2RkMDA1M2MsIDB4MTc5MDA0YTcpLAotICBXVENQKDB4N2Q2NmUxOGIsIDB4MTlhOGEwNWYpLCBXVENQKDB4N2NlZWJlZjAsIDB4MWJkYTlmYTIpLCBXVENQKDB4N2M2NjQ5NTMsIDB4MWUyNTNlYTEpLCBXVENQKDB4N2JjYzJiZTgsIDB4MjA4NzhjY2UpLAotICBXVENQKDB4N2IxZjE1MjYsIDB4MjMwMDZkNWQpLCBXVENQKDB4N2E1ZGJiMDEsIDB4MjU4ZTk4NDgpLCBXVENQKDB4Nzk4NmRmM2UsIDB4MjgzMDliYzYpLCBXVENQKDB4Nzg5OTUzZTAsIDB4MmFlNGRlM2UpLAotICBXVENQKDB4Nzc5M2ZmODgsIDB4MmRhOWEwYTgpLCBXVENQKDB4NzY3NWUxY2MsIDB4MzA3ZDAxNjMpLCBXVENQKDB4NzUzZTE3NjMsIDB4MzM1Y2ZmNzIpLCBXVENQKDB4NzNlYmRlMTAsIDB4MzY0NzdlMWYpLAotICBXVENQKDB4NzI3ZTk4NGUsIDB4MzkzYTQ4ZjEpLCBXVENQKDB4NzBmNWQwOWIsIDB4M2MzMzE3ZjkpLCBXVENQKDB4NmY1MTNjNjAsIDB4M2YyZjk0NWMpLCBXVENQKDB4NmQ5MGJlNjEsIDB4NDIyZDVkMTgpLAotICBXVENQKDB4NmJiNDY4YjEsIDB4NDUyYTBiZjMpLCBXVENQKDB4NjliYzdlMWUsIDB4NDgyMzNhODEpLCBXVENQKDB4NjdhOTczMTcsIDB4NGIxNjg3M2UpLCBXVENQKDB4NjU3YmVkZmEsIDB4NGUwMTlhOWQpLAotICBXVENQKDB4NjMzNGM2ZDIsIDB4NTBlMjJjMGIpLCBXVENQKDB4NjBkNTA2ODksIDB4NTNiNjA2Y2IpLCBXVENQKDB4NWU1ZGU1ODgsIDB4NTY3YjBlYTcpLCBXVENQKDB4NWJkMGM5YzYsIDB4NTkyZjQ0NjApLAorY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDEyW10gPSB7CisgICAgU1RDKDB4NmVkOWViYTEpLAorICAgIFNUQygweDQwMDAwMDAwKSwKKyAgICBTVEMoMHg0MDAwMDAwMCksCisgICAgU1RDKDB4YzAwMDAwMDApLAogfTsKIAogUkFNX0FMSUdOCiBMTktfU0VDVElPTl9DT05TVERBVEEKLWNvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3c1MTJbXSA9Ci17Ci0gIFdUQ1AoMHg3ZmZmZjYyMSwgMHgwMDMyNDNmNSksIFdUQ1AoMHg3ZmZmYTcyYywgMHgwMDk2Y2JjMSksIFdUQ1AoMHg3ZmZmMDk0MywgMHgwMGZiNTMzMCksIFdUQ1AoMHg3ZmZlMWM2NSwgMHgwMTVmZGEwMyksCi0gIFdUQ1AoMHg3ZmZjZTA5MywgMHgwMWM0NWZmZSksIFdUQ1AoMHg3ZmZiNTVjZSwgMHgwMjI4ZTRlMiksIFdUQ1AoMHg3ZmY5N2MxOCwgMHgwMjhkNjg3MCksIFdUQ1AoMHg3ZmY3NTM3MCwgMHgwMmYxZWE2YyksCi0gIFdUQ1AoMHg3ZmY0ZGJkOSwgMHgwMzU2NmE5NiksIFdUQ1AoMHg3ZmYyMTU1MywgMHgwM2JhZThiMiksIFdUQ1AoMHg3ZmVlZmZlMSwgMHgwNDFmNjQ4MCksIFdUQ1AoMHg3ZmViOWI4NSwgMHgwNDgzZGRjMyksCi0gIFdUQ1AoMHg3ZmU3ZTg0MSwgMHgwNGU4NTQzZSksIFdUQ1AoMHg3ZmUzZTYxNiwgMHgwNTRjYzdiMSksIFdUQ1AoMHg3ZmRmOTUwOCwgMHgwNWIxMzdkZiksIFdUQ1AoMHg3ZmRhZjUxOSwgMHgwNjE1YTQ4YiksCi0gIFdUQ1AoMHg3ZmQ2MDY0YywgMHgwNjdhMGQ3NiksIFdUQ1AoMHg3ZmQwYzhhMywgMHgwNmRlNzI2MiksIFdUQ1AoMHg3ZmNiM2MyMywgMHgwNzQyZDMxMSksIFdUQ1AoMHg3ZmM1NjBjZiwgMHgwN2E3MmY0NSksCi0gIFdUQ1AoMHg3ZmJmMzZhYSwgMHgwODBiODZjMiksIFdUQ1AoMHg3ZmI4YmRiOCwgMHgwODZmZDk0NyksIFdUQ1AoMHg3ZmIxZjVmYywgMHgwOGQ0MjY5OSksIFdUQ1AoMHg3ZmFhZGY3YywgMHgwOTM4NmU3OCksCi0gIFdUQ1AoMHg3ZmEzN2EzYywgMHgwOTljYjBhNyksIFdUQ1AoMHg3ZjliYzY0MCwgMHgwYTAwZWNlOCksIFdUQ1AoMHg3ZjkzYzM4YywgMHgwYTY1MjJmZSksIFdUQ1AoMHg3ZjhiNzIyNywgMHgwYWM5NTJhYSksCi0gIFdUQ1AoMHg3ZjgyZDIxNCwgMHgwYjJkN2JhZiksIFdUQ1AoMHg3Zjc5ZTM1YSwgMHgwYjkxOWRjZiksIFdUQ1AoMHg3ZjcwYTVmZSwgMHgwYmY1YjhjYiksIFdUQ1AoMHg3ZjY3MWEwNSwgMHgwYzU5Y2M2OCksCi0gIFdUQ1AoMHg3ZjVkM2Y3NSwgMHgwY2JkZDg2NSksIFdUQ1AoMHg3ZjUzMTY1NSwgMHgwZDIxZGM4NyksIFdUQ1AoMHg3ZjQ4OWVhYSwgMHgwZDg1ZDg4ZiksIFdUQ1AoMHg3ZjNkZDg3YywgMHgwZGU5Y2M0MCksCi0gIFdUQ1AoMHg3ZjMyYzNkMSwgMHgwZTRkYjc1YiksIFdUQ1AoMHg3ZjI3NjBhZiwgMHgwZWIxOTlhNCksIFdUQ1AoMHg3ZjFiYWYxZSwgMHgwZjE1NzJkYyksIFdUQ1AoMHg3ZjBmYWYyNSwgMHgwZjc5NDJjNyksCi0gIFdUQ1AoMHg3ZjAzNjBjYiwgMHgwZmRkMDkyNiksIFdUQ1AoMHg3ZWY2YzQxOCwgMHgxMDQwYzViYiksIFdUQ1AoMHg3ZWU5ZDkxNCwgMHgxMGE0Nzg0YiksIFdUQ1AoMHg3ZWRjOWZjNiwgMHgxMTA4MjA5NiksCi0gIFdUQ1AoMHg3ZWNmMTgzNywgMHgxMTZiYmU2MCksIFdUQ1AoMHg3ZWMxNDI3MCwgMHgxMWNmNTE2YSksIFdUQ1AoMHg3ZWIzMWU3OCwgMHgxMjMyZDk3OSksIFdUQ1AoMHg3ZWE0YWM1OCwgMHgxMjk2NTY0ZCksCi0gIFdUQ1AoMHg3ZTk1ZWMxYSwgMHgxMmY5YzdhYSksIFdUQ1AoMHg3ZTg2ZGRjNiwgMHgxMzVkMmQ1MyksIFdUQ1AoMHg3ZTc3ODE2NiwgMHgxM2MwODcwYSksIFdUQ1AoMHg3ZTY3ZDcwMywgMHgxNDIzZDQ5MiksCi0gIFdUQ1AoMHg3ZTU3ZGVhNywgMHgxNDg3MTVhZSksIFdUQ1AoMHg3ZTQ3OTg1YiwgMHgxNGVhNGExZiksIFdUQ1AoMHg3ZTM3MDQyYSwgMHgxNTRkNzFhYSksIFdUQ1AoMHg3ZTI2MjIxZiwgMHgxNWIwOGMxMiksCi0gIFdUQ1AoMHg3ZTE0ZjI0MiwgMHgxNjEzOTkxOCksIFdUQ1AoMHg3ZTAzNzRhMCwgMHgxNjc2OTg3ZiksIFdUQ1AoMHg3ZGYxYTk0MiwgMHgxNmQ5OGEwYyksIFdUQ1AoMHg3ZGRmOTAzNCwgMHgxNzNjNmQ4MCksCi0gIFdUQ1AoMHg3ZGNkMjk4MSwgMHgxNzlmNDI5ZiksIFdUQ1AoMHg3ZGJhNzUzNCwgMHgxODAyMDkyYyksIFdUQ1AoMHg3ZGE3NzM1OSwgMHgxODY0YzBlYSksIFdUQ1AoMHg3ZDk0MjNmYywgMHgxOGM3Njk5YiksCi0gIFdUQ1AoMHg3ZDgwODcyOCwgMHgxOTJhMDMwNCksIFdUQ1AoMHg3ZDZjOWNlOSwgMHgxOThjOGNlNyksIFdUQ1AoMHg3ZDU4NjU0ZCwgMHgxOWVmMDcwNyksIFdUQ1AoMHg3ZDQzZTA1ZSwgMHgxYTUxNzEyOCksCi0gIFdUQ1AoMHg3ZDJmMGUyYiwgMHgxYWIzY2IwZCksIFdUQ1AoMHg3ZDE5ZWViZiwgMHgxYjE2MTQ3OSksIFdUQ1AoMHg3ZDA0ODIyOCwgMHgxYjc4NGQzMCksIFdUQ1AoMHg3Y2VlYzg3MywgMHgxYmRhNzRmNiksCi0gIFdUQ1AoMHg3Y2Q4YzFhZSwgMHgxYzNjOGI4YyksIFdUQ1AoMHg3Y2MyNmRlNSwgMHgxYzllOTBiOCksIFdUQ1AoMHg3Y2FiY2QyOCwgMHgxZDAwODQzZCksIFdUQ1AoMHg3Yzk0ZGY4MywgMHgxZDYyNjVkZCksCi0gIFdUQ1AoMHg3YzdkYTUwNSwgMHgxZGM0MzU1ZSksIFdUQ1AoMHg3YzY2MWRiYywgMHgxZTI1ZjI4MiksIFdUQ1AoMHg3YzRlNDliNywgMHgxZTg3OWQwZCksIFdUQ1AoMHg3YzM2MjkwNCwgMHgxZWU5MzRjMyksCi0gIFdUQ1AoMHg3YzFkYmJiMywgMHgxZjRhYjk2OCksIFdUQ1AoMHg3YzA1MDFkMiwgMHgxZmFjMmFiZiksIFdUQ1AoMHg3YmViZmI3MCwgMHgyMDBkODg4ZCksIFdUQ1AoMHg3YmQyYTg5ZSwgMHgyMDZlZDI5NSksCi0gIFdUQ1AoMHg3YmI5MDk2YiwgMHgyMGQwMDg5YyksIFdUQ1AoMHg3YjlmMWRlNiwgMHgyMTMxMmE2NSksIFdUQ1AoMHg3Yjg0ZTYxZiwgMHgyMTkyMzdiNSksIFdUQ1AoMHg3YjZhNjIyNywgMHgyMWYzMzA0ZiksCi0gIFdUQ1AoMHg3YjRmOTIwZSwgMHgyMjU0MTNmOCksIFdUQ1AoMHg3YjM0NzVlNSwgMHgyMmI0ZTI3NCksIFdUQ1AoMHg3YjE5MGRiYywgMHgyMzE1OWI4OCksIFdUQ1AoMHg3YWZkNTlhNCwgMHgyMzc2M2VmNyksCi0gIFdUQ1AoMHg3YWUxNTlhZSwgMHgyM2Q2Y2M4NyksIFdUQ1AoMHg3YWM1MGRlYywgMHgyNDM3NDNmYSksIFdUQ1AoMHg3YWE4NzY2ZiwgMHgyNDk3YTUxNyksIFdUQ1AoMHg3YThiOTM0OCwgMHgyNGY3ZWZhMiksCi0gIFdUQ1AoMHg3YTZlNjQ4YSwgMHgyNTU4MjM1ZiksIFdUQ1AoMHg3YTUwZWE0NywgMHgyNWI4NDAxMiksIFdUQ1AoMHg3YTMzMjQ5MCwgMHgyNjE4NDU4MSksIFdUQ1AoMHg3YTE1MTM3OCwgMHgyNjc4MzM3MCksCi0gIFdUQ1AoMHg3OWY2YjcxMSwgMHgyNmQ4MDlhNSksIFdUQ1AoMHg3OWQ4MGY2ZiwgMHgyNzM3YzdlMyksIFdUQ1AoMHg3OWI5MWNhNCwgMHgyNzk3NmRmMSksIFdUQ1AoMHg3OTk5ZGVjNCwgMHgyN2Y2ZmI5MiksCi0gIFdUQ1AoMHg3OTdhNTVlMCwgMHgyODU2NzA4ZCksIFdUQ1AoMHg3OTVhODIwZSwgMHgyOGI1Y2NhNSksIFdUQ1AoMHg3OTNhNjM2MSwgMHgyOTE1MGZhMSksIFdUQ1AoMHg3OTE5ZjllYywgMHgyOTc0Mzk0NiksCi0gIFdUQ1AoMHg3OGY5NDVjMywgMHgyOWQzNDk1OCksIFdUQ1AoMHg3OGQ4NDZmYiwgMHgyYTMyM2Y5ZSksIFdUQ1AoMHg3OGI2ZmRhOCwgMHgyYTkxMWJkYyksIFdUQ1AoMHg3ODk1NjlkZiwgMHgyYWVmZGRkOCksCi0gIFdUQ1AoMHg3ODczOGJiMywgMHgyYjRlODU1OCksIFdUQ1AoMHg3ODUxNjMzYiwgMHgyYmFkMTIyMSksIFdUQ1AoMHg3ODJlZjA4YiwgMHgyYzBiODNmYSksIFdUQ1AoMHg3ODBjMzNiOCwgMHgyYzY5ZGFhNiksCi0gIFdUQ1AoMHg3N2U5MmNkOSwgMHgyY2M4MTVlZSksIFdUQ1AoMHg3N2M1ZGMwMSwgMHgyZDI2MzU5NiksIFdUQ1AoMHg3N2EyNDE0OCwgMHgyZDg0Mzk2NCksIFdUQ1AoMHg3NzdlNWNjMywgMHgyZGUyMjExZSksCi0gIFdUQ1AoMHg3NzVhMmU4OSwgMHgyZTNmZWM4YiksIFdUQ1AoMHg3NzM1YjZhZiwgMHgyZTlkOWI3MCksIFdUQ1AoMHg3NzEwZjU0YywgMHgyZWZiMmQ5NSksIFdUQ1AoMHg3NmViZWE3NywgMHgyZjU4YTJiZSksCi0gIFdUQ1AoMHg3NmM2OTY0NywgMHgyZmI1ZmFiMiksIFdUQ1AoMHg3NmEwZjhkMiwgMHgzMDEzMzUzOSksIFdUQ1AoMHg3NjdiMTIzMSwgMHgzMDcwNTIxNyksIFdUQ1AoMHg3NjU0ZTI3OSwgMHgzMGNkNTExNSksCi0gIFdUQ1AoMHg3NjJlNjljNCwgMHgzMTJhMzFmOCksIFdUQ1AoMHg3NjA3YTgyOCwgMHgzMTg2ZjQ4NyksIFdUQ1AoMHg3NWUwOWRiZCwgMHgzMWUzOTg4OSksIFdUQ1AoMHg3NWI5NGE5YywgMHgzMjQwMWRjNiksCi0gIFdUQ1AoMHg3NTkxYWVkZCwgMHgzMjljODQwMiksIFdUQ1AoMHg3NTY5Y2E5OSwgMHgzMmY4Y2IwNyksIFdUQ1AoMHg3NTQxOWRlNywgMHgzMzU0ZjI5YiksIFdUQ1AoMHg3NTE5MjhlMCwgMHgzM2IwZmE4NCksCi0gIFdUQ1AoMHg3NGYwNmI5ZSwgMHgzNDBjZTI4YiksIFdUQ1AoMHg3NGM3NjYzYSwgMHgzNDY4YWE3NiksIFdUQ1AoMHg3NDllMThjZCwgMHgzNGM0NTIwZCksIFdUQ1AoMHg3NDc0ODM3MSwgMHgzNTFmZDkxOCksCi0gIFdUQ1AoMHg3NDRhYTYzZiwgMHgzNTdiM2Y1ZCksIFdUQ1AoMHg3NDIwODE1MCwgMHgzNWQ2ODRhNiksIFdUQ1AoMHg3M2Y2MTRjMCwgMHgzNjMxYThiOCksIFdUQ1AoMHg3M2NiNjBhOCwgMHgzNjhjYWI1YyksCi0gIFdUQ1AoMHg3M2EwNjUyMiwgMHgzNmU3OGM1YiksIFdUQ1AoMHg3Mzc1MjI0OSwgMHgzNzQyNGI3YiksIFdUQ1AoMHg3MzQ5OTgzOCwgMHgzNzljZTg4NSksIFdUQ1AoMHg3MzFkYzcwYSwgMHgzN2Y3NjM0MSksCi0gIFdUQ1AoMHg3MmYxYWVkOSwgMHgzODUxYmI3NyksIFdUQ1AoMHg3MmM1NGZjMSwgMHgzOGFiZjBlZiksIFdUQ1AoMHg3Mjk4YTlkZCwgMHgzOTA2MDM3MyksIFdUQ1AoMHg3MjZiYmQ0OCwgMHgzOTVmZjJjOSksCi0gIFdUQ1AoMHg3MjNlOGEyMCwgMHgzOWI5YmViYyksIFdUQ1AoMHg3MjExMTA3ZSwgMHgzYTEzNjcxMiksIFdUQ1AoMHg3MWUzNTA4MCwgMHgzYTZjZWI5NiksIFdUQ1AoMHg3MWI1NGE0MSwgMHgzYWM2NGMwZiksCi0gIFdUQ1AoMHg3MTg2ZmRkZSwgMHgzYjFmODg0OCksIFdUQ1AoMHg3MTU4NmI3NCwgMHgzYjc4YTAwNyksIFdUQ1AoMHg3MTI5OTMxZiwgMHgzYmQxOTMxOCksIFdUQ1AoMHg3MGZhNzRmYywgMHgzYzJhNjE0MiksCi0gIFdUQ1AoMHg3MGNiMTEyOCwgMHgzYzgzMGE1MCksIFdUQ1AoMHg3MDliNjdjMCwgMHgzY2RiOGUwOSksIFdUQ1AoMHg3MDZiNzhlMywgMHgzZDMzZWMzOSksIFdUQ1AoMHg3MDNiNDRhZCwgMHgzZDhjMjRhOCksCi0gIFdUQ1AoMHg3MDBhY2IzYywgMHgzZGU0MzcxZiksIFdUQ1AoMHg2ZmRhMGNhZSwgMHgzZTNjMjM2OSksIFdUQ1AoMHg2ZmE5MDkyMSwgMHgzZTkzZTk1MCksIFdUQ1AoMHg2Zjc3YzBiMywgMHgzZWViODg5YyksCi0gIFdUQ1AoMHg2ZjQ2MzM4MywgMHgzZjQzMDExOSksIFdUQ1AoMHg2ZjE0NjFiMCwgMHgzZjlhNTI5MCksIFdUQ1AoMHg2ZWUyNGI1NywgMHgzZmYxN2NjYSksIFdUQ1AoMHg2ZWFmZjA5OSwgMHg0MDQ4N2Y5NCksCi0gIFdUQ1AoMHg2ZTdkNTE5MywgMHg0MDlmNWFiNiksIFdUQ1AoMHg2ZTRhNmU2NiwgMHg0MGY2MGRmYiksIFdUQ1AoMHg2ZTE3NDczMCwgMHg0MTRjOTkyZiksIFdUQ1AoMHg2ZGUzZGMxMSwgMHg0MWEyZmMxYSksCi0gIFdUQ1AoMHg2ZGIwMmQyOSwgMHg0MWY5MzY4OSksIFdUQ1AoMHg2ZDdjM2E5OCwgMHg0MjRmNDg0NSksIFdUQ1AoMHg2ZDQ4MDQ3ZSwgMHg0MmE1MzExYiksIFdUQ1AoMHg2ZDEzOGFmYiwgMHg0MmZhZjBkNCksCi0gIFdUQ1AoMHg2Y2RlY2UyZiwgMHg0MzUwODczYyksIFdUQ1AoMHg2Y2E5Y2UzYiwgMHg0M2E1ZjQxZSksIFdUQ1AoMHg2Yzc0OGIzZiwgMHg0M2ZiMzc0NiksIFdUQ1AoMHg2YzNmMDU1ZCwgMHg0NDUwNTA3ZSksCi0gIFdUQ1AoMHg2YzA5M2NiNiwgMHg0NGE1M2Y5MyksIFdUQ1AoMHg2YmQzMzE2YSwgMHg0NGZhMDQ1MCksIFdUQ1AoMHg2YjljZTM5YiwgMHg0NTRlOWU4MCksIFdUQ1AoMHg2YjY2NTM2YiwgMHg0NWEzMGRmMCksCi0gIFdUQ1AoMHg2YjJmODBmYiwgMHg0NWY3NTI2YiksIFdUQ1AoMHg2YWY4NmM2YywgMHg0NjRiNmJiZSksIFdUQ1AoMHg2YWMxMTVlMiwgMHg0NjlmNTliNCksIFdUQ1AoMHg2YTg5N2Q3ZCwgMHg0NmYzMWMxYSksCi0gIFdUQ1AoMHg2YTUxYTM2MSwgMHg0NzQ2YjJiYyksIFdUQ1AoMHg2YTE5ODdiMCwgMHg0NzlhMWQ2NyksIFdUQ1AoMHg2OWUxMmE4YywgMHg0N2VkNWJlNiksIFdUQ1AoMHg2OWE4OGMxOSwgMHg0ODQwNmUwOCksCi0gIFdUQ1AoMHg2OTZmYWM3OCwgMHg0ODkzNTM5NyksIFdUQ1AoMHg2OTM2OGJjZSwgMHg0OGU2MGM2MiksIFdUQ1AoMHg2OGZkMmEzZCwgMHg0OTM4OTgzNiksIFdUQ1AoMHg2OGMzODdlOSwgMHg0OThhZjZkZiksCi0gIFdUQ1AoMHg2ODg5YTRmNiwgMHg0OWRkMjgyYSksIFdUQ1AoMHg2ODRmODE4NiwgMHg0YTJmMmJlNiksIFdUQ1AoMHg2ODE1MWRiZSwgMHg0YTgxMDFkZSksIFdUQ1AoMHg2N2RhNzljMywgMHg0YWQyYTllMiksCi0gIFdUQ1AoMHg2NzlmOTViNywgMHg0YjI0MjNiZSksIFdUQ1AoMHg2NzY0NzFjMCwgMHg0Yjc1NmY0MCksIFdUQ1AoMHg2NzI5MGUwMiwgMHg0YmM2OGMzNiksIFdUQ1AoMHg2NmVkNmFhMSwgMHg0YzE3N2E2ZSksCi0gIFdUQ1AoMHg2NmIxODdjMywgMHg0YzY4MzliNyksIFdUQ1AoMHg2Njc1NjU4YywgMHg0Y2I4YzlkZCksIFdUQ1AoMHg2NjM5MDQyMiwgMHg0ZDA5MmFiMCksIFdUQ1AoMHg2NWZjNjNhOSwgMHg0ZDU5NWJmZSksCi0gIFdUQ1AoMHg2NWJmODQ0NywgMHg0ZGE5NWQ5NiksIFdUQ1AoMHg2NTgyNjYyMiwgMHg0ZGY5MmY0NiksIFdUQ1AoMHg2NTQ1MDk1ZiwgMHg0ZTQ4ZDBkZCksIFdUQ1AoMHg2NTA3NmUyNSwgMHg0ZTk4NDIyOSksCi0gIFdUQ1AoMHg2NGM5OTQ5OCwgMHg0ZWU3ODJmYiksIFdUQ1AoMHg2NDhiN2NlMCwgMHg0ZjM2OTMyMCksIFdUQ1AoMHg2NDRkMjcyMiwgMHg0Zjg1NzI2OSksIFdUQ1AoMHg2NDBlOTM4NiwgMHg0ZmQ0MjBhNCksCi0gIFdUQ1AoMHg2M2NmYzIzMSwgMHg1MDIyOWRhMSksIFdUQ1AoMHg2MzkwYjM0YSwgMHg1MDcwZTkyZiksIFdUQ1AoMHg2MzUxNjZmOSwgMHg1MGJmMDMxZiksIFdUQ1AoMHg2MzExZGQ2NCwgMHg1MTBjZWI0MCksCi0gIFdUQ1AoMHg2MmQyMTZiMywgMHg1MTVhYTE2MiksIFdUQ1AoMHg2MjkyMTMwYywgMHg1MWE4MjU1NSksIFdUQ1AoMHg2MjUxZDI5OCwgMHg1MWY1NzZlYSksIFdUQ1AoMHg2MjExNTU3ZSwgMHg1MjQyOTVmMCksCi0gIFdUQ1AoMHg2MWQwOWJlNSwgMHg1MjhmODIzOCksIFdUQ1AoMHg2MThmYTVmNywgMHg1MmRjM2I5MiksIFdUQ1AoMHg2MTRlNzNkYSwgMHg1MzI4YzFkMCksIFdUQ1AoMHg2MTBkMDViNywgMHg1Mzc1MTRjMiksCi0gIFdUQ1AoMHg2MGNiNWJiNywgMHg1M2MxMzQzOSksIFdUQ1AoMHg2MDg5NzYwMSwgMHg1NDBkMjAwNSksIFdUQ1AoMHg2MDQ3NTRiZiwgMHg1NDU4ZDdmOSksIFdUQ1AoMHg2MDA0ZjgxOSwgMHg1NGE0NWJlNiksCi0gIFdUQ1AoMHg1ZmMyNjAzOCwgMHg1NGVmYWI5YyksIFdUQ1AoMHg1ZjdmOGQ0NiwgMHg1NTNhYzZlZSksIFdUQ1AoMHg1ZjNjN2Y2YiwgMHg1NTg1YWRhZCksIFdUQ1AoMHg1ZWY5MzZkMSwgMHg1NWQwNWZhYSksCi0gIFdUQ1AoMHg1ZWI1YjNhMiwgMHg1NjFhZGNiOSksIFdUQ1AoMHg1ZTcxZjYwNiwgMHg1NjY1MjRhYSksIFdUQ1AoMHg1ZTJkZmUyOSwgMHg1NmFmMzc1MCksIFdUQ1AoMHg1ZGU5Y2MzMywgMHg1NmY5MTQ3ZSksCi0gIFdUQ1AoMHg1ZGE1NjA0ZiwgMHg1NzQyYmMwNiksIFdUQ1AoMHg1ZDYwYmFhNywgMHg1NzhjMmRiYSksIFdUQ1AoMHg1ZDFiZGI2NSwgMHg1N2Q1Njk2ZCksIFdUQ1AoMHg1Y2Q2YzJiNSwgMHg1ODFlNmVmMSksCi0gIFdUQ1AoMHg1YzkxNzBiZiwgMHg1ODY3M2UxYiksIFdUQ1AoMHg1YzRiZTViMCwgMHg1OGFmZDZiZCksIFdUQ1AoMHg1YzA2MjFiMiwgMHg1OGY4MzhhOSksIFdUQ1AoMHg1YmMwMjRmMCwgMHg1OTQwNjNiNSksCi0gIFdUQ1AoMHg1Yjc5ZWY5NiwgMHg1OTg4NTdiMiksIFdUQ1AoMHg1YjMzODFjZSwgMHg1OWQwMTQ3NSksIFdUQ1AoMHg1YWVjZGJjNSwgMHg1YTE3OTlkMSksIFdUQ1AoMHg1YWE1ZmRhNSwgMHg1YTVlZTc5YSksCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnMTJbXSA9IHsKKyAgICBTVEMoMHg0MDAwMDAwMCksCisgICAgU1RDKDB4NmVkOWViYTEpLAorICAgIFNUQygweDZlZDllYmExKSwKKyAgICBTVEMoMHg2ZWQ5ZWJhMSksCiB9OwogCi0vKiBUaGUgd2luZG93IGNvZWZmaWNpZW50cyBhcmUgY2FsY3VsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGE6Ci0gKiBOPUZSQU1FX0xFTl9MT05HX0xENDgwCi0gKiB3aW5bbl09c2luKHBpKihuKzAuNSkvKDIqTikpICAgZm9yIG49MCwuLixOLTEgKi8KIFJBTV9BTElHTgogTE5LX1NFQ1RJT05fQ09OU1REQVRBCi1jb25zdCBGSVhQX1dUUCBTaW5lV2luZG93NDgwWzQ4MF0gPQotewotICBXVENQKDB4N2ZmZmY0YzUsIDB4MDAzNTlkZDIpLCBXVENQKDB4N2ZmZjlhZWYsIDB4MDBhMGQ5NTEpLCBXVENQKDB4N2ZmZWU3NDQsIDB4MDEwYzE0NjApLCBXVENQKDB4N2ZmZGQ5YzQsIDB4MDE3NzRlYjIpLAotICBXVENQKDB4N2ZmYzcyNmYsIDB4MDFlMjg3ZmMpLCBXVENQKDB4N2ZmYWIxNDcsIDB4MDI0ZGJmZjQpLCBXVENQKDB4N2ZmODk2NGQsIDB4MDJiOGY2NGUpLCBXVENQKDB4N2ZmNjIxODIsIDB4MDMyNDJhYmYpLAotICBXVENQKDB4N2ZmMzUyZTgsIDB4MDM4ZjVjZmIpLCBXVENQKDB4N2ZmMDJhODIsIDB4MDNmYThjYjgpLCBXVENQKDB4N2ZlY2E4NTEsIDB4MDQ2NWI5YWEpLCBXVENQKDB4N2ZlOGNjNTcsIDB4MDRkMGUzODYpLAotICBXVENQKDB4N2ZlNDk2OTgsIDB4MDUzYzBhMDEpLCBXVENQKDB4N2ZlMDA3MTYsIDB4MDVhNzJjY2YpLCBXVENQKDB4N2ZkYjFkZDUsIDB4MDYxMjRiYTUpLCBXVENQKDB4N2ZkNWRhZDgsIDB4MDY3ZDY2MzkpLAotICBXVENQKDB4N2ZkMDNlMjMsIDB4MDZlODdjM2YpLCBXVENQKDB4N2ZjYTQ3YjksIDB4MDc1MzhkNmIpLCBXVENQKDB4N2ZjM2Y3YTAsIDB4MDdiZTk5NzMpLCBXVENQKDB4N2ZiZDRkZGEsIDB4MDgyOWEwMGMpLAotICBXVENQKDB4N2ZiNjRhNmUsIDB4MDg5NGEwZWEpLCBXVENQKDB4N2ZhZWVkNWYsIDB4MDhmZjliYzIpLCBXVENQKDB4N2ZhNzM2YjQsIDB4MDk2YTkwNDkpLCBXVENQKDB4N2Y5ZjI2NzEsIDB4MDlkNTdlMzUpLAotICBXVENQKDB4N2Y5NmJjOWMsIDB4MGE0MDY1M2EpLCBXVENQKDB4N2Y4ZGY5M2MsIDB4MGFhYjQ1MGQpLCBXVENQKDB4N2Y4NGRjNTUsIDB4MGIxNjFkNjMpLCBXVENQKDB4N2Y3YjY1ZWYsIDB4MGI4MGVkZjEpLAotICBXVENQKDB4N2Y3MTk2MTEsIDB4MGJlYmI2NmMpLCBXVENQKDB4N2Y2NzZjYzAsIDB4MGM1Njc2OGEpLCBXVENQKDB4N2Y1Y2VhMDUsIDB4MGNjMTJkZmYpLCBXVENQKDB4N2Y1MjBkZTYsIDB4MGQyYmRjODApLAotICBXVENQKDB4N2Y0NmQ4NmMsIDB4MGQ5NjgxYzIpLCBXVENQKDB4N2YzYjQ5OWQsIDB4MGUwMTFkN2MpLCBXVENQKDB4N2YyZjYxODMsIDB4MGU2YmFmNjEpLCBXVENQKDB4N2YyMzIwMjYsIDB4MGVkNjM3MjcpLAotICBXVENQKDB4N2YxNjg1OGUsIDB4MGY0MGI0ODMpLCBXVENQKDB4N2YwOTkxYzQsIDB4MGZhYjI3MmIpLCBXVENQKDB4N2VmYzQ0ZDAsIDB4MTAxNThlZDQpLCBXVENQKDB4N2VlZTllYmUsIDB4MTA3ZmViMzMpLAotICBXVENQKDB4N2VlMDlmOTUsIDB4MTBlYTNiZmQpLCBXVENQKDB4N2VkMjQ3NjEsIDB4MTE1NDgwZTkpLCBXVENQKDB4N2VjMzk2MmEsIDB4MTFiZWI5YWEpLCBXVENQKDB4N2ViNDhiZmIsIDB4MTIyOGU1ZjgpLAotICBXVENQKDB4N2VhNTI4ZTAsIDB4MTI5MzA1ODYpLCBXVENQKDB4N2U5NTZjZTEsIDB4MTJmZDE4MGIpLCBXVENQKDB4N2U4NTU4MGMsIDB4MTM2NzFkM2QpLCBXVENQKDB4N2U3NGVhNmEsIDB4MTNkMTE0ZDApLAotICBXVENQKDB4N2U2NDI0MDgsIDB4MTQzYWZlN2IpLCBXVENQKDB4N2U1MzA0ZjIsIDB4MTRhNGQ5ZjQpLCBXVENQKDB4N2U0MThkMzIsIDB4MTUwZWE2ZWYpLCBXVENQKDB4N2UyZmJjZDYsIDB4MTU3ODY1MjIpLAotICBXVENQKDB4N2UxZDkzZWEsIDB4MTVlMjE0NDUpLCBXVENQKDB4N2UwYjEyN2EsIDB4MTY0YmI0MGIpLCBXVENQKDB4N2RmODM4OTUsIDB4MTZiNTQ0MmIpLCBXVENQKDB4N2RlNTA2NDYsIDB4MTcxZWM0NWMpLAotICBXVENQKDB4N2RkMTdiOWMsIDB4MTc4ODM0NTIpLCBXVENQKDB4N2RiZDk4YTQsIDB4MTdmMTkzYzUpLCBXVENQKDB4N2RhOTVkNmMsIDB4MTg1YWUyNjkpLCBXVENQKDB4N2Q5NGNhMDMsIDB4MThjNDFmZjYpLAotICBXVENQKDB4N2Q3ZmRlNzYsIDB4MTkyZDRjMjEpLCBXVENQKDB4N2Q2YTlhZDUsIDB4MTk5NjY2YTApLCBXVENQKDB4N2Q1NGZmMmUsIDB4MTlmZjZmMmEpLCBXVENQKDB4N2QzZjBiOTAsIDB4MWE2ODY1NzUpLAotICBXVENQKDB4N2QyOGMwMGMsIDB4MWFkMTQ5MzgpLCBXVENQKDB4N2QxMjFjYjAsIDB4MWIzYTFhMjgpLCBXVENQKDB4N2NmYjIxOGMsIDB4MWJhMmQ3ZmMpLCBXVENQKDB4N2NlM2NlYjIsIDB4MWMwYjgyNmEpLAotICBXVENQKDB4N2NjYzI0MzAsIDB4MWM3NDE5MmEpLCBXVENQKDB4N2NiNDIyMTcsIDB4MWNkYzliZjIpLCBXVENQKDB4N2M5YmM4N2EsIDB4MWQ0NTBhNzgpLCBXVENQKDB4N2M4MzE3NjcsIDB4MWRhZDY0NzMpLAotICBXVENQKDB4N2M2YTBlZjIsIDB4MWUxNWE5OWEpLCBXVENQKDB4N2M1MGFmMmIsIDB4MWU3ZGQ5YTQpLCBXVENQKDB4N2MzNmY4MjQsIDB4MWVlNWY0NDcpLCBXVENQKDB4N2MxY2U5ZWYsIDB4MWY0ZGY5M2EpLAotICBXVENQKDB4N2MwMjg0OWYsIDB4MWZiNWU4MzYpLCBXVENQKDB4N2JlN2M4NDcsIDB4MjAxZGMwZWYpLCBXVENQKDB4N2JjY2I0ZjgsIDB4MjA4NTgzMWYpLCBXVENQKDB4N2JiMTRhYzUsIDB4MjBlZDJlN2IpLAotICBXVENQKDB4N2I5NTg5YzMsIDB4MjE1NGMyYmIpLCBXVENQKDB4N2I3OTcyMDUsIDB4MjFiYzNmOTcpLCBXVENQKDB4N2I1ZDAzOWUsIDB4MjIyM2E0YzUpLCBXVENQKDB4N2I0MDNlYTIsIDB4MjI4YWYxZmUpLAotICBXVENQKDB4N2IyMzIzMjUsIDB4MjJmMjI2ZjgpLCBXVENQKDB4N2IwNWIxM2QsIDB4MjM1OTQzNmMpLCBXVENQKDB4N2FlN2U4ZmMsIDB4MjNjMDQ3MTApLCBXVENQKDB4N2FjOWNhN2EsIDB4MjQyNzMxOWQpLAotICBXVENQKDB4N2FhYjU1Y2EsIDB4MjQ4ZTAyY2IpLCBXVENQKDB4N2E4YzhiMDEsIDB4MjRmNGJhNTApLCBXVENQKDB4N2E2ZDZhMzcsIDB4MjU1YjU3ZTYpLCBXVENQKDB4N2E0ZGYzODAsIDB4MjVjMWRiNDQpLAotICBXVENQKDB4N2EyZTI2ZjIsIDB4MjYyODQ0MjIpLCBXVENQKDB4N2EwZTA0YTQsIDB4MjY4ZTkyMzgpLCBXVENQKDB4NzllZDhjYWQsIDB4MjZmNGM1M2UpLCBXVENQKDB4NzljY2JmMjIsIDB4Mjc1YWRjZWUpLAotICBXVENQKDB4NzlhYjljMWMsIDB4MjdjMGQ4ZmUpLCBXVENQKDB4Nzk4YTIzYjEsIDB4MjgyNmI5MjgpLCBXVENQKDB4Nzk2ODU1ZjksIDB4Mjg4YzdkMjQpLCBXVENQKDB4Nzk0NjMzMGMsIDB4MjhmMjI0YWIpLAotICBXVENQKDB4NzkyM2JiMDEsIDB4Mjk1N2FmNzQpLCBXVENQKDB4NzkwMGVkZjIsIDB4MjliZDFkM2EpLCBXVENQKDB4NzhkZGNiZjUsIDB4MmEyMjZkYjUpLCBXVENQKDB4NzhiYTU1MjQsIDB4MmE4N2EwOWQpLAotICBXVENQKDB4Nzg5Njg5OTgsIDB4MmFlY2I1YWMpLCBXVENQKDB4Nzg3MjY5NmEsIDB4MmI1MWFjOWEpLCBXVENQKDB4Nzg0ZGY0YjMsIDB4MmJiNjg1MjIpLCBXVENQKDB4NzgyOTJiOGQsIDB4MmMxYjNlZmIpLAotICBXVENQKDB4NzgwNDBlMTIsIDB4MmM3ZmQ5ZTApLCBXVENQKDB4NzdkZTljNWIsIDB4MmNlNDU1ODkpLCBXVENQKDB4NzdiOGQ2ODMsIDB4MmQ0OGIxYjEpLCBXVENQKDB4Nzc5MmJjYTUsIDB4MmRhY2VlMTEpLAotICBXVENQKDB4Nzc2YzRlZGIsIDB4MmUxMTBhNjIpLCBXVENQKDB4Nzc0NThkNDAsIDB4MmU3NTA2NWUpLCBXVENQKDB4NzcxZTc3ZjAsIDB4MmVkOGUxYzApLCBXVENQKDB4NzZmNzBmMDUsIDB4MmYzYzljNDApLAotICBXVENQKDB4NzZjZjUyOWMsIDB4MmZhMDM1OTkpLCBXVENQKDB4NzZhNzQyZDEsIDB4MzAwM2FkODUpLCBXVENQKDB4NzY3ZWRmYmUsIDB4MzA2NzAzYmYpLCBXVENQKDB4NzY1NjI5ODIsIDB4MzBjYTM4MDApLAotICBXVENQKDB4NzYyZDIwMzgsIDB4MzEyZDRhMDMpLCBXVENQKDB4NzYwM2MzZmQsIDB4MzE5MDM5ODIpLCBXVENQKDB4NzVkYTE0ZWYsIDB4MzFmMzA2MzgpLCBXVENQKDB4NzViMDEzMjksIDB4MzI1NWFmZTApLAotICBXVENQKDB4NzU4NWJlY2IsIDB4MzJiODM2MzQpLCBXVENQKDB4NzU1YjE3ZjIsIDB4MzMxYTk4ZWYpLCBXVENQKDB4NzUzMDFlYmIsIDB4MzM3Y2Q3Y2QpLCBXVENQKDB4NzUwNGQzNDUsIDB4MzNkZWYyODcpLAotICBXVENQKDB4NzRkOTM1YWUsIDB4MzQ0MGU4ZGEpLCBXVENQKDB4NzRhZDQ2MTUsIDB4MzRhMmJhODEpLCBXVENQKDB4NzQ4MTA0OTksIDB4MzUwNDY3MzYpLCBXVENQKDB4NzQ1NDcxNTgsIDB4MzU2NWVlYjYpLAotICBXVENQKDB4NzQyNzhjNzIsIDB4MzVjNzUwYmMpLCBXVENQKDB4NzNmYTU2MDcsIDB4MzYyODhkMDMpLCBXVENQKDB4NzNjY2NlMzYsIDB4MzY4OWEzNDgpLCBXVENQKDB4NzM5ZWY1MWYsIDB4MzZlYTkzNDYpLAotICBXVENQKDB4NzM3MGNhZTIsIDB4Mzc0YjVjYjkpLCBXVENQKDB4NzM0MjRmYTAsIDB4MzdhYmZmNWQpLCBXVENQKDB4NzMxMzgzNzksIDB4MzgwYzdhZWUpLCBXVENQKDB4NzJlNDY2OGYsIDB4Mzg2Y2NmMmEpLAotICBXVENQKDB4NzJiNGY5MDIsIDB4MzhjY2ZiY2IpLCBXVENQKDB4NzI4NTNhZjMsIDB4MzkyZDAwOGYpLCBXVENQKDB4NzI1NTJjODUsIDB4Mzk4Y2RkMzIpLCBXVENQKDB4NzIyNGNkZDgsIDB4MzllYzkxNzIpLAotICBXVENQKDB4NzFmNDFmMGYsIDB4M2E0YzFkMDkpLCBXVENQKDB4NzFjMzIwNGMsIDB4M2FhYjdmYjcpLCBXVENQKDB4NzE5MWQxYjEsIDB4M2IwYWI5MzcpLCBXVENQKDB4NzE2MDMzNjEsIDB4M2I2OWM5NDcpLAotICBXVENQKDB4NzEyZTQ1N2YsIDB4M2JjOGFmYTUpLCBXVENQKDB4NzBmYzA4MmQsIDB4M2MyNzZjMGQpLCBXVENQKDB4NzBjOTdiOTAsIDB4M2M4NWZlM2QpLCBXVENQKDB4NzA5NjlmY2EsIDB4M2NlNDY1ZjMpLAotICBXVENQKDB4NzA2Mzc0ZmYsIDB4M2Q0MmEyZWMpLCBXVENQKDB4NzAyZmZiNTQsIDB4M2RhMGI0ZTcpLCBXVENQKDB4NmZmYzMyZWIsIDB4M2RmZTliYTEpLCBXVENQKDB4NmZjODFiZWEsIDB4M2U1YzU2ZDgpLAotICBXVENQKDB4NmY5M2I2NzYsIDB4M2ViOWU2NGIpLCBXVENQKDB4NmY1ZjAyYjIsIDB4M2YxNzQ5YjgpLCBXVENQKDB4NmYyYTAwYzQsIDB4M2Y3NDgwZGQpLCBXVENQKDB4NmVmNGIwZDEsIDB4M2ZkMThiN2EpLAotICBXVENQKDB4NmViZjEyZmYsIDB4NDAyZTY5NGMpLCBXVENQKDB4NmU4OTI3NzIsIDB4NDA4YjFhMTIpLCBXVENQKDB4NmU1MmVlNTIsIDB4NDBlNzlkOGMpLCBXVENQKDB4NmUxYzY3YzQsIDB4NDE0M2YzNzkpLAotICBXVENQKDB4NmRlNTkzZWUsIDB4NDFhMDFiOTcpLCBXVENQKDB4NmRhZTcyZjcsIDB4NDFmYzE1YTYpLCBXVENQKDB4NmQ3NzA1MDYsIDB4NDI1N2UxNjYpLCBXVENQKDB4NmQzZjRhNDAsIDB4NDJiMzdlOTYpLAotICBXVENQKDB4NmQwNzQyY2YsIDB4NDMwZWVjZjYpLCBXVENQKDB4NmNjZWVlZDgsIDB4NDM2YTJjNDUpLCBXVENQKDB4NmM5NjRlODMsIDB4NDNjNTNjNDQpLCBXVENQKDB4NmM1ZDYxZjksIDB4NDQyMDFjYjIpLAotICBXVENQKDB4NmMyNDI5NjAsIDB4NDQ3YWNkNTApLCBXVENQKDB4NmJlYWE0ZTIsIDB4NDRkNTRkZGYpLCBXVENQKDB4NmJiMGQ0YTcsIDB4NDUyZjllMWUpLCBXVENQKDB4NmI3NmI4ZDYsIDB4NDU4OWJkY2YpLAotICBXVENQKDB4NmIzYzUxOWEsIDB4NDVlM2FjYjEpLCBXVENQKDB4NmIwMTlmMWEsIDB4NDYzZDZhODcpLCBXVENQKDB4NmFjNmExODAsIDB4NDY5NmY3MTApLCBXVENQKDB4NmE4YjU4ZjYsIDB4NDZmMDUyMGYpLAotICBXVENQKDB4NmE0ZmM1YTYsIDB4NDc0OTdiNDQpLCBXVENQKDB4NmExM2U3YjgsIDB4NDdhMjcyNzEpLCBXVENQKDB4NjlkN2JmNTcsIDB4NDdmYjM3NTcpLCBXVENQKDB4Njk5YjRjYWQsIDB4NDg1M2M5YjkpLAotICBXVENQKDB4Njk1ZThmZTUsIDB4NDhhYzI5NTcpLCBXVENQKDB4NjkyMTg5MjksIDB4NDkwNDU1ZjQpLCBXVENQKDB4NjhlNDM4YTQsIDB4NDk1YzRmNTIpLCBXVENQKDB4NjhhNjllODEsIDB4NDliNDE1MzMpLAotICBXVENQKDB4Njg2OGJhZWMsIDB4NGEwYmE3NWIpLCBXVENQKDB4NjgyYThlMGYsIDB4NGE2MzA1OGEpLCBXVENQKDB4NjdlYzE4MTcsIDB4NGFiYTJmODQpLCBXVENQKDB4NjdhZDU5MmYsIDB4NGIxMTI1MGMpLAotICBXVENQKDB4Njc2ZTUxODMsIDB4NGI2N2U1ZTQpLCBXVENQKDB4NjcyZjAxM2YsIDB4NGJiZTcxZDEpLCBXVENQKDB4NjZlZjY4OTEsIDB4NGMxNGM4OTQpLCBXVENQKDB4NjZhZjg3YTQsIDB4NGM2YWU5ZjIpLAotICBXVENQKDB4NjY2ZjVlYTYsIDB4NGNjMGQ1YWUpLCBXVENQKDB4NjYyZWVkYzMsIDB4NGQxNjhiOGIpLCBXVENQKDB4NjVlZTM1MjksIDB4NGQ2YzBiNGUpLCBXVENQKDB4NjVhZDM1MDUsIDB4NGRjMTU0YmIpLAotICBXVENQKDB4NjU2YmVkODQsIDB4NGUxNjY3OTUpLCBXVENQKDB4NjUyYTVlZDYsIDB4NGU2YjQzYTIpLCBXVENQKDB4NjRlODg5MjYsIDB4NGViZmU4YTUpLCBXVENQKDB4NjRhNjZjYTUsIDB4NGYxNDU2NjIpLAotICBXVENQKDB4NjQ2NDA5N2YsIDB4NGY2ODhjYTApLCBXVENQKDB4NjQyMTVmZTUsIDB4NGZiYzhiMjIpLCBXVENQKDB4NjNkZTcwMDMsIDB4NTAxMDUxYWUpLCBXVENQKDB4NjM5YjNhMGIsIDB4NTA2M2UwMDgpLAotICBXVENQKDB4NjM1N2JlMmEsIDB4NTBiNzM1ZjgpLCBXVENQKDB4NjMxM2ZjOTAsIDB4NTEwYTUzNDApLCBXVENQKDB4NjJjZmY1NmMsIDB4NTE1ZDM3YTkpLCBXVENQKDB4NjI4YmE4ZWYsIDB4NTFhZmUyZjYpLAotICBXVENQKDB4NjI0NzE3NDksIDB4NTIwMjU0ZWYpLCBXVENQKDB4NjIwMjQwYTgsIDB4NTI1NDhkNTkpLCBXVENQKDB4NjFiZDI1M2YsIDB4NTJhNjhiZmIpLCBXVENQKDB4NjE3N2M1M2MsIDB4NTJmODUwOWIpLAotICBXVENQKDB4NjEzMjIwZDIsIDB4NTM0OWRhZmYpLCBXVENQKDB4NjBlYzM4MzAsIDB4NTM5YjJhZjApLCBXVENQKDB4NjBhNjBiODgsIDB4NTNlYzQwMzIpLCBXVENQKDB4NjA1ZjliMGIsIDB4NTQzZDFhOGUpLAotICBXVENQKDB4NjAxOGU2ZWIsIDB4NTQ4ZGI5Y2IpLCBXVENQKDB4NWZkMWVmNTksIDB4NTRkZTFkYjEpLCBXVENQKDB4NWY4YWI0ODcsIDB4NTUyZTQ2MDUpLCBXVENQKDB4NWY0MzM2YTcsIDB4NTU3ZTMyOTIpLAotICBXVENQKDB4NWVmYjc1ZWEsIDB4NTVjZGUzMWUpLCBXVENQKDB4NWViMzcyODUsIDB4NTYxZDU3NzEpLCBXVENQKDB4NWU2YjJjYTgsIDB4NTY2YzhmNTUpLCBXVENQKDB4NWUyMmE0ODcsIDB4NTZiYjhhOTApLAotICBXVENQKDB4NWRkOWRhNTUsIDB4NTcwYTQ4ZWMpLCBXVENQKDB4NWQ5MGNlNDUsIDB4NTc1OGNhMzEpLCBXVENQKDB4NWQ0NzgwOGEsIDB4NTdhNzBlMjkpLCBXVENQKDB4NWNmZGYxNTcsIDB4NTdmNTE0OWQpLAotICBXVENQKDB4NWNiNDIwZTAsIDB4NTg0MmRkNTQpLCBXVENQKDB4NWM2YTBmNTksIDB4NTg5MDY4MWEpLCBXVENQKDB4NWMxZmJjZjYsIDB4NThkZGI0YjgpLCBXVENQKDB4NWJkNTI5ZWIsIDB4NTkyYWMyZjcpLAotICBXVENQKDB4NWI4YTU2NmMsIDB4NTk3NzkyYTEpLCBXVENQKDB4NWIzZjQyYWUsIDB4NTljNDIzODEpLCBXVENQKDB4NWFmM2VlZTYsIDB4NWExMDc1NjEpLCBXVENQKDB4NWFhODViNDgsIDB4NWE1Yzg4MGEpLAorY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDI0W10gPSB7CisgICAgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NDAwMDAwMDApLAorICAgIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhkZWRmMDQ3ZCksIFNUQygweGMwMDAwMDAwKSwKKyAgICBTVEMoMHhhNTdkODY2NiksIFNUQygweDkxMjYxNDVmKSwgU1RDKDB4ODQ1YzhhZTMpLAogfTsKIAorUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfU1RCIFJvdFZlY3RvckltYWcyNFtdID0geworICAgIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDZlZDllYmExKSwKKyAgICBTVEMoMHg3YmEzNzUxZCksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg2ZWQ5ZWJhMSksCisgICAgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDIxMjBmYjgzKSwKK307CiAKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsNDhbXSA9IHsKKyAgICBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3YmEzNzUxZCksCisgICAgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NWE4Mjc5OWEpLAorICAgIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDAwMDAwMDAwKSwKKyAgICBTVEMoMHg2NThjOWEyZCksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4Y2YwNDNhYjMpLCBTVEMoMHg1YTgyNzk5YSksCisgICAgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhhNTdkODY2NiksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4ZGVkZjA0N2QpLAorICAgIFNUQygweDg5YmU1MGMzKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHhjMDAwMDAwMCksIFNUQygweDgwMDAwMDAwKSwKKyAgICBTVEMoMHgzMGZiYzU0ZCksIFNUQygweGE1N2Q4NjY2KSwgU1RDKDB4ODliZTUwYzMpLCBTVEMoMHgyMTIwZmI4MyksCisgICAgU1RDKDB4OTEyNjE0NWYpLCBTVEMoMHhhNTdkODY2NiksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4ODQ1YzhhZTMpLAorICAgIFNUQygweGNmMDQzYWIzKSwKK307CiAKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnNDhbXSA9IHsKKyAgICBTVEMoMHgxMGI1MTUwZiksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgyMTIwZmI4MyksCisgICAgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4NWE4Mjc5OWEpLAorICAgIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDdmZmZmZmZmKSwKKyAgICBTVEMoMHg0ZGViZTRmZSksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg1YTgyNzk5YSksCisgICAgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4N2JhMzc1MWQpLAorICAgIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDAwMDAwMDAwKSwKKyAgICBTVEMoMHg3NjQxYWYzZCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4Y2YwNDNhYjMpLCBTVEMoMHg3YmEzNzUxZCksCisgICAgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHhhNTdkODY2NiksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4MjEyMGZiODMpLAorICAgIFNUQygweDg5YmU1MGMzKSwKK307CiAKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsODBbXSA9IHsKKyAgICBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2M3NjllMTgpLCBTVEMoMHg3OWJjMzg0ZCksCisgICAgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4Njc4ZGRlNmUpLAorICAgIFNUQygweDdjNzY5ZTE4KSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2MTU0ZmI5MSksIFNUQygweDRiM2M4YzEyKSwKKyAgICBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHgyNzhkZGU2ZSksCisgICAgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MDAwMDAwMDApLAorICAgIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHgxNDA2MGI2OCksIFNUQygweGQ4NzIyMTkyKSwKKyAgICBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4ZjVmNTBkNjcpLCBTVEMoMHhiNGMzNzNlZSksCisgICAgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweGQ4NzIyMTkyKSwgU1RDKDB4OTg3MjIxOTIpLAorICAgIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHhiZDFlYzQ1YyksIFNUQygweDg2NDNjN2IzKSwKKyAgICBTVEMoMHg1YTgyNzk5YSksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHg4MDAwMDAwMCksCisgICAgU1RDKDB4NTMyMTFkMTgpLCBTVEMoMHhlYmY5ZjQ5OCksIFNUQygweDkyZGNhZmU1KSwgU1RDKDB4ODY0M2M3YjMpLAorICAgIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4ZDg3MjIxOTIpLCBTVEMoMHg4NjQzYzdiMyksIFNUQygweDk4NzIyMTkyKSwKKyAgICBTVEMoMHg0MmUxM2JhNCksIFNUQygweGM1ZTNhM2E5KSwgU1RDKDB4ODA2NTAzNDcpLCBTVEMoMHhiNGMzNzNlZSksCisgICAgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHhiNGMzNzNlZSksIFNUQygweDgxOTM2ZGFmKSwgU1RDKDB4ZDg3MjIxOTIpLAorICAgIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHg4OWJlNTBjMyksIFNUQygweDAwMDAwMDAwKSwKK307CiAKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnODBbXSA9IHsKKyAgICBTVEMoMHgwYTBhZjI5OSksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MWRlMTg5YTYpLCBTVEMoMHgyNzhkZGU2ZSksCisgICAgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4NGIzYzhjMTIpLAorICAgIFNUQygweDFkZTE4OWE2KSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDY3OGRkZTZlKSwKKyAgICBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg3OWJjMzg0ZCksCisgICAgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4N2ZmZmZmZmYpLAorICAgIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDc5YmMzODRkKSwKKyAgICBTVEMoMHg0MmUxM2JhNCksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg2NzhkZGU2ZSksCisgICAgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NGIzYzhjMTIpLAorICAgIFNUQygweDUzMjExZDE4KSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDI3OGRkZTZlKSwKKyAgICBTVEMoMHg1YTgyNzk5YSksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHgwMDAwMDAwMCksCisgICAgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDQyZTEzYmE0KSwgU1RDKDB4ZDg3MjIxOTIpLAorICAgIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweGI0YzM3M2VlKSwKKyAgICBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHg5ODcyMjE5MiksCisgICAgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweGViZjlmNDk4KSwgU1RDKDB4ODY0M2M3YjMpLAorICAgIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHhjZjA0M2FiMyksIFNUQygweDgwMDAwMDAwKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsOTZbXSA9IHsKKyAgICBTVEMoMHg3ZmI5ZDc1OSksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3YmEzNzUxZCksCisgICAgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NmVkOWViYTEpLAorICAgIFNUQygweDc5MzUwMWE5KSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDVhODI3OTlhKSwKKyAgICBTVEMoMHg3MmNjYjlkYiksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg0MDAwMDAwMCksCisgICAgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4MjEyMGZiODMpLAorICAgIFNUQygweDYwM2M0OTZjKSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDAwMDAwMDAwKSwKKyAgICBTVEMoMHg1NDY1NzE5NCksIFNUQygweGVmNGFlYWYxKSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHhkZWRmMDQ3ZCksCisgICAgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHhjZjA0M2FiMyksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4YzAwMDAwMDApLAorICAgIFNUQygweDM4OWNlYTcyKSwgU1RDKDB4YjIxNDFiMDIpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweGE1N2Q4NjY2KSwKKyAgICBTVEMoMHgyOTI0ZWRhYyksIFNUQygweDlhNzM2NWQzKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHg5MTI2MTQ1ZiksCisgICAgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHg4OWJlNTBjMyksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4ODQ1YzhhZTMpLAorICAgIFNUQygweDA4NWYyMTM3KSwgU1RDKDB4ODExODU1YjQpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweDgwMDAwMDAwKSwKKyAgICBTVEMoMHhmN2EwZGVjOSksIFNUQygweDgxMTg1NWI0KSwgU1RDKDB4ZWY0YWVhZjEpLCBTVEMoMHg4NDVjOGFlMyksCisgICAgU1RDKDB4ZTcwNzQ3YzQpLCBTVEMoMHg4OWJlNTBjMyksIFNUQygweGRlZGYwNDdkKSwgU1RDKDB4OTEyNjE0NWYpLAorICAgIFNUQygweGQ2ZGIxMjU0KSwgU1RDKDB4OWE3MzY1ZDMpLCBTVEMoMHhjZjA0M2FiMyksIFNUQygweGE1N2Q4NjY2KSwKKyAgICBTVEMoMHhjNzYzMTU4ZSksIFNUQygweGIyMTQxYjAyKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnOTZbXSA9IHsKKyAgICBTVEMoMHgwODVmMjEzNyksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgyMTIwZmI4MyksCisgICAgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4NDAwMDAwMDApLAorICAgIFNUQygweDI5MjRlZGFjKSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDVhODI3OTlhKSwKKyAgICBTVEMoMHgzODljZWE3MiksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg2ZWQ5ZWJhMSksCisgICAgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4N2JhMzc1MWQpLAorICAgIFNUQygweDU0NjU3MTk0KSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDdmZmZmZmZmKSwKKyAgICBTVEMoMHg2MDNjNDk2YyksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg3YmEzNzUxZCksCisgICAgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NmVkOWViYTEpLAorICAgIFNUQygweDcyY2NiOWRiKSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDVhODI3OTlhKSwKKyAgICBTVEMoMHg3OTM1MDFhOSksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg0MDAwMDAwMCksCisgICAgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4MjEyMGZiODMpLAorICAgIFNUQygweDdmYjlkNzU5KSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDAwMDAwMDAwKSwKKyAgICBTVEMoMHg3ZmI5ZDc1OSksIFNUQygweGVmNGFlYWYxKSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHhkZWRmMDQ3ZCksCisgICAgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHhjZjA0M2FiMyksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4YzAwMDAwMDApLAorICAgIFNUQygweDc5MzUwMWE5KSwgU1RDKDB4YjIxNDFiMDIpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweGE1N2Q4NjY2KSwKKyAgICBTVEMoMHg3MmNjYjlkYiksIFNUQygweDlhNzM2NWQzKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsMzg0W10gPSB7CisgICAgU1RDKDB4N2ZmYjlkMTUpLCBTVEMoMHg3ZmVlNzRhMiksIFNUQygweDdmZDg4NzhlKSwgU1RDKDB4N2ZiOWQ3NTkpLAorICAgIFNUQygweDdmOTI2NjFkKSwgU1RDKDB4N2Y2MjM2OGYpLCBTVEMoMHg3ZjI5NGJmZCksIFNUQygweDdlZTdhYTRjKSwKKyAgICBTVEMoMHg3ZTlkNTVmYyksIFNUQygweDdlNGE1NDI2KSwgU1RDKDB4N2RlZWFhN2EpLCBTVEMoMHg3ZmVlNzRhMiksCisgICAgU1RDKDB4N2ZiOWQ3NTkpLCBTVEMoMHg3ZjYyMzY4ZiksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2U0YTU0MjYpLAorICAgIFNUQygweDdkOGE1ZjQwKSwgU1RDKDB4N2NhODAwMzgpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDdhN2QwNTViKSwKKyAgICBTVEMoMHg3OTM1MDFhOSksIFNUQygweDc3Y2JjM2YyKSwgU1RDKDB4N2ZkODg3OGUpLCBTVEMoMHg3ZjYyMzY4ZiksCisgICAgU1RDKDB4N2U5ZDU1ZmMpLCBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDdjMjlmYmVlKSwgU1RDKDB4N2E3ZDA1NWIpLAorICAgIFNUQygweDc4ODQ4NDE0KSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3M2I1ZWJkMSksIFNUQygweDcwZTJjYmM2KSwKKyAgICBTVEMoMHg2ZGNhMGQxNCksIFNUQygweDdmYjlkNzU5KSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3ZDhhNWY0MCksCisgICAgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3OTM1MDFhOSksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NzJjY2I5ZGIpLAorICAgIFNUQygweDZlZDllYmExKSwgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg2NThjOWEyZCksIFNUQygweDYwM2M0OTZjKSwKKyAgICBTVEMoMHg3ZjkyNjYxZCksIFNUQygweDdlNGE1NDI2KSwgU1RDKDB4N2MyOWZiZWUpLCBTVEMoMHg3OTM1MDFhOSksCisgICAgU1RDKDB4NzU3MDc1YWMpLCBTVEMoMHg3MGUyY2JjNiksIFNUQygweDZiOTNkMDJlKSwgU1RDKDB4NjU4YzlhMmQpLAorICAgIFNUQygweDVlZDc3YzhhKSwgU1RDKDB4NTc3ZmYzZGEpLCBTVEMoMHg0ZjkyOTJkYyksIFNUQygweDdmNjIzNjhmKSwKKyAgICBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDdhN2QwNTViKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3MGUyY2JjNiksCisgICAgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg2MmYyMDFhYyksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NTEzM2NjOTQpLAorICAgIFNUQygweDQ3MWNlY2U3KSwgU1RDKDB4M2M1NmJhNzApLCBTVEMoMHg3ZjI5NGJmZCksIFNUQygweDdjYTgwMDM4KSwKKyAgICBTVEMoMHg3ODg0ODQxNCksIFNUQygweDcyY2NiOWRiKSwgU1RDKDB4NmI5M2QwMmUpLCBTVEMoMHg2MmYyMDFhYyksCisgICAgU1RDKDB4NTkwNDQzYTcpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDQxY2UxZTY1KSwgU1RDKDB4MzRkMzk1N2UpLAorICAgIFNUQygweDI3MjdkNDg2KSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDc2NDFhZjNkKSwKKyAgICBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0ZGViZTRmZSksCisgICAgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MTBiNTE1MGYpLAorICAgIFNUQygweDdlOWQ1NWZjKSwgU1RDKDB4N2E3ZDA1NWIpLCBTVEMoMHg3M2I1ZWJkMSksIFNUQygweDZhNmQ5OGE0KSwKKyAgICBTVEMoMHg1ZWQ3N2M4YSksIFNUQygweDUxMzNjYzk0KSwgU1RDKDB4NDFjZTFlNjUpLCBTVEMoMHgzMGZiYzU0ZCksCisgICAgU1RDKDB4MWYxOWY5N2IpLCBTVEMoMHgwYzhiZDM1ZSksIFNUQygweGY5YjgyNjg0KSwgU1RDKDB4N2U0YTU0MjYpLAorICAgIFNUQygweDc5MzUwMWE5KSwgU1RDKDB4NzBlMmNiYzYpLCBTVEMoMHg2NThjOWEyZCksIFNUQygweDU3N2ZmM2RhKSwKKyAgICBTVEMoMHg0NzFjZWNlNyksIFNUQygweDM0ZDM5NTdlKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgwYzhiZDM1ZSksCisgICAgU1RDKDB4ZjdhMGRlYzkpLCBTVEMoMHhlMmVmMmEzZSksIFNUQygweDdkZWVhYTdhKSwgU1RDKDB4NzdjYmMzZjIpLAorICAgIFNUQygweDZkY2EwZDE0KSwgU1RDKDB4NjAzYzQ5NmMpLCBTVEMoMHg0ZjkyOTJkYyksIFNUQygweDNjNTZiYTcwKSwKKyAgICBTVEMoMHgyNzI3ZDQ4NiksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4ZjliODI2ODQpLCBTVEMoMHhlMmVmMmEzZSksCisgICAgU1RDKDB4Y2QxNjkzZjcpLCBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NmE2ZDk4YTQpLAorICAgIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDE4ZjhiODNjKSwKKyAgICBTVEMoMHgwMDAwMDAwMCksIFNUQygweGU3MDc0N2M0KSwgU1RDKDB4Y2YwNDNhYjMpLCBTVEMoMHhiOGUzMTMxOSksCisgICAgU1RDKDB4N2QxZDc5NTgpLCBTVEMoMHg3NDk3MmY5MiksIFNUQygweDY2Y2Y4MTIwKSwgU1RDKDB4NTQ2NTcxOTQpLAorICAgIFNUQygweDNlMmQ3ZWIxKSwgU1RDKDB4MjUyODBjNWUpLCBTVEMoMHgwYTc1ZDYwZSksIFNUQygweGVmNGFlYWYxKSwKKyAgICBTVEMoMHhkNGUwY2IxNSksIFNUQygweGJjNjg0NWNlKSwgU1RDKDB4YTZmYmJjNTkpLCBTVEMoMHg3Y2E4MDAzOCksCisgICAgU1RDKDB4NzJjY2I5ZGIpLCBTVEMoMHg2MmYyMDFhYyksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4MzRkMzk1N2UpLAorICAgIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4ZmJjZmRjNzEpLCBTVEMoMHhkZWRmMDQ3ZCksIFNUQygweGMzYTk0NTkwKSwKKyAgICBTVEMoMHhhYjlhOGU2YyksIFNUQygweDk3ZjRhM2NkKSwgU1RDKDB4N2MyOWZiZWUpLCBTVEMoMHg3MGUyY2JjNiksCisgICAgU1RDKDB4NWVkNzdjOGEpLCBTVEMoMHg0NzFjZWNlNyksIFNUQygweDJiMWYzNGViKSwgU1RDKDB4MGM4YmQzNWUpLAorICAgIFNUQygweGVkMzdlZjkxKSwgU1RDKDB4Y2YwNDNhYjMpLCBTVEMoMHhiM2MwMjAwYyksIFNUQygweDlkMGRmZTU0KSwKKyAgICBTVEMoMHg4YzRhMTQyZiksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg1YTgyNzk5YSksCisgICAgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZGVkZjA0N2QpLAorICAgIFNUQygweGMwMDAwMDAwKSwgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHg5MTI2MTQ1ZiksIFNUQygweDg0NWM4YWUzKSwKKyAgICBTVEMoMHg3YjE0NzRmZCksIFNUQygweDZjYjJhODM3KSwgU1RDKDB4NTVmNWE0ZDIpLCBTVEMoMHgzODljZWE3MiksCisgICAgU1RDKDB4MTZlYTA2NDYpLCBTVEMoMHhmMzc0MmNhMiksIFNUQygweGQwZjUzY2UwKSwgU1RDKDB4YjIxNDFiMDIpLAorICAgIFNUQygweDk5MzA3ZWUwKSwgU1RDKDB4ODgzNDNjMGUpLCBTVEMoMHg4MDZkOTllMyksIFNUQygweDdhN2QwNTViKSwKKyAgICBTVEMoMHg2YTZkOThhNCksIFNUQygweDUxMzNjYzk0KSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgwYzhiZDM1ZSksCisgICAgU1RDKDB4ZTcwNzQ3YzQpLCBTVEMoMHhjM2E5NDU5MCksIFNUQygweGE1N2Q4NjY2KSwgU1RDKDB4OGYxZDM0M2EpLAorICAgIFNUQygweDgyNzVhMGMwKSwgU1RDKDB4ODA5ZGM5NzEpLCBTVEMoMHg3OWRkMzA5OCksIFNUQygweDY4MGI1YzMzKSwKKyAgICBTVEMoMHg0YzNmZGZmNCksIFNUQygweDI5MjRlZGFjKSwgU1RDKDB4MDIxODI0MjcpLCBTVEMoMHhkYWQ3ZjNhMiksCisgICAgU1RDKDB4YjcyN2I5ZjcpLCBTVEMoMHg5YTczNjVkMyksIFNUQygweDg3N2I3YmVjKSwgU1RDKDB4ODAxMThiNWUpLAorICAgIFNUQygweDg0ZWI4YjAzKSwgU1RDKDB4NzkzNTAxYTkpLCBTVEMoMHg2NThjOWEyZCksIFNUQygweDQ3MWNlY2U3KSwKKyAgICBTVEMoMHgyMTIwZmI4MyksIFNUQygweGY3YTBkZWM5KSwgU1RDKDB4Y2YwNDNhYjMpLCBTVEMoMHhhYjlhOGU2YyksCisgICAgU1RDKDB4OTEyNjE0NWYpLCBTVEMoMHg4Mjc1YTBjMCksIFNUQygweDgxMTg1NWI0KSwgU1RDKDB4OGQzMzQ2MjUpLAorICAgIFNUQygweDc4ODQ4NDE0KSwgU1RDKDB4NjJmMjAxYWMpLCBTVEMoMHg0MWNlMWU2NSksIFNUQygweDE4ZjhiODNjKSwKKyAgICBTVEMoMHhlZDM3ZWY5MSksIFNUQygweGMzYTk0NTkwKSwgU1RDKDB4YTEyODgzNzYpLCBTVEMoMHg4OWJlNTBjMyksCisgICAgU1RDKDB4ODAyNzc4NzIpLCBTVEMoMHg4NTgyZmFhNSksIFNUQygweDk5MzA3ZWUwKSwgU1RDKDB4NzdjYmMzZjIpLAorICAgIFNUQygweDYwM2M0OTZjKSwgU1RDKDB4M2M1NmJhNzApLCBTVEMoMHgxMGI1MTUwZiksIFNUQygweGUyZWYyYTNlKSwKKyAgICBTVEMoMHhiOGUzMTMxOSksIFNUQygweDk3ZjRhM2NkKSwgU1RDKDB4ODQ1YzhhZTMpLCBTVEMoMHg4MDlkYzk3MSksCisgICAgU1RDKDB4OGQzMzQ2MjUpLCBTVEMoMHhhODgwMGMyNiksIFNUQygweDc3MGFjZGVjKSwgU1RDKDB4NWQ2YzJmOTkpLAorICAgIFNUQygweDM2YmEyMDE0KSwgU1RDKDB4MDg1ZjIxMzcpLCBTVEMoMHhkOGQ4MmI3YSksIFNUQygweGFlY2MzMzZjKSwKKyAgICBTVEMoMHg5MDFkY2VjNCksIFNUQygweDgxMTg1NWI0KSwgU1RDKDB4ODNkNjA0MTIpLCBTVEMoMHg5N2Y0YTNjZCksCisgICAgU1RDKDB4YmFhMzRiZjQpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4MzBmYmM1NGQpLAorICAgIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4Y2YwNDNhYjMpLCBTVEMoMHhhNTdkODY2NiksIFNUQygweDg5YmU1MGMzKSwKKyAgICBTVEMoMHg4MDAwMDAwMCksIFNUQygweDg5YmU1MGMzKSwgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHhjZjA0M2FiMyksCisgICAgU1RDKDB4NzU3MDc1YWMpLCBTVEMoMHg1NzdmZjNkYSksIFNUQygweDJiMWYzNGViKSwgU1RDKDB4ZjdhMGRlYzkpLAorICAgIFNUQygweGM1ODQyYzdlKSwgU1RDKDB4OWQwZGZlNTQpLCBTVEMoMHg4NGViOGIwMyksIFNUQygweDgxMTg1NWI0KSwKKyAgICBTVEMoMHg5MjM1ZjJlYyksIFNUQygweGI1NzE1ZWVmKSwgU1RDKDB4ZTRmYTRiZjEpLCBTVEMoMHg3NDk3MmY5MiksCisgICAgU1RDKDB4NTQ2NTcxOTQpLCBTVEMoMHgyNTI4MGM1ZSksIFNUQygweGVmNGFlYWYxKSwgU1RDKDB4YmM2ODQ1Y2UpLAorICAgIFNUQygweDk1OTI2NzVjKSwgU1RDKDB4ODFiNWFiZGEpLCBTVEMoMHg4NDVjOGFlMyksIFNUQygweDlkMGRmZTU0KSwKKyAgICBTVEMoMHhjNzYzMTU4ZSksIFNUQygweGZiY2ZkYzcxKSwgU1RDKDB4NzNiNWViZDEpLCBTVEMoMHg1MTMzY2M5NCksCisgICAgU1RDKDB4MWYxOWY5N2IpLCBTVEMoMHhlNzA3NDdjNCksIFNUQygweGIzYzAyMDBjKSwgU1RDKDB4OGYxZDM0M2EpLAorICAgIFNUQygweDgwMjc3ODcyKSwgU1RDKDB4ODliZTUwYzMpLCBTVEMoMHhhYTBhNWIyZSksIFNUQygweGRhZDdmM2EyKSwKKyAgICBTVEMoMHgxMmM4MTA2ZiksIFNUQygweDcyY2NiOWRiKSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHgxOGY4YjgzYyksCisgICAgU1RDKDB4ZGVkZjA0N2QpLCBTVEMoMHhhYjlhOGU2YyksIFNUQygweDg5YmU1MGMzKSwgU1RDKDB4ODA0NjI4YTcpLAorICAgIFNUQygweDkxMjYxNDVmKSwgU1RDKDB4YjhlMzEzMTkpLCBTVEMoMHhlZjRhZWFmMSksIFNUQygweDI5MjRlZGFjKSwKKyAgICBTVEMoMHg3MWRiYTlhYiksIFNUQygweDRhOGVhMTExKSwgU1RDKDB4MTJjODEwNmYpLCBTVEMoMHhkNmRiMTI1NCksCisgICAgU1RDKDB4YTQwNTg0N2UpLCBTVEMoMHg4NTgyZmFhNSksIFNUQygweDgyMTE1NTg2KSwgU1RDKDB4OWE3MzY1ZDMpLAorICAgIFNUQygweGM5NDVkZmVjKSwgU1RDKDB4MDQzMDIzOGYpLCBTVEMoMHgzZTJkN2ViMSksIFNUQygweDcwZTJjYmM2KSwKKyAgICBTVEMoMHg0NzFjZWNlNyksIFNUQygweDBjOGJkMzVlKSwgU1RDKDB4Y2YwNDNhYjMpLCBTVEMoMHg5ZDBkZmU1NCksCisgICAgU1RDKDB4ODI3NWEwYzApLCBTVEMoMHg4NTgyZmFhNSksIFNUQygweGE1N2Q4NjY2KSwgU1RDKDB4ZGFkN2YzYTIpLAorICAgIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4NTEzM2NjOTQpLCBTVEMoMHg2ZmUyMzEzYyksIFNUQygweDQzOTdiYTMyKSwKKyAgICBTVEMoMHgwNjQ3ZDk3YyksIFNUQygweGM3NjMxNThlKSwgU1RDKDB4OTZiZmVhM2QpLCBTVEMoMHg4MDlkYzk3MSksCisgICAgU1RDKDB4OGE4ZjhhNTQpLCBTVEMoMHhiMjE0MWIwMiksIFNUQygweGVkMzdlZjkxKSwgU1RDKDB4MmQxNjg3OTIpLAorICAgIFNUQygweDYxOWE3ZGNlKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnMzg0W10gPSB7CisgICAgU1RDKDB4MDIxODI0MjcpLCBTVEMoMHgwNDMwMjM4ZiksIFNUQygweDA2NDdkOTdjKSwgU1RDKDB4MDg1ZjIxMzcpLAorICAgIFNUQygweDBhNzVkNjBlKSwgU1RDKDB4MGM4YmQzNWUpLCBTVEMoMHgwZWEwZjQ4YyksIFNUQygweDEwYjUxNTBmKSwKKyAgICBTVEMoMHgxMmM4MTA2ZiksIFNUQygweDE0ZDljMjQ1KSwgU1RDKDB4MTZlYTA2NDYpLCBTVEMoMHgwNDMwMjM4ZiksCisgICAgU1RDKDB4MDg1ZjIxMzcpLCBTVEMoMHgwYzhiZDM1ZSksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MTRkOWMyNDUpLAorICAgIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4MWQxMGQ1YzIpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDI1MjgwYzVlKSwKKyAgICBTVEMoMHgyOTI0ZWRhYyksIFNUQygweDJkMTY4NzkyKSwgU1RDKDB4MDY0N2Q5N2MpLCBTVEMoMHgwYzhiZDM1ZSksCisgICAgU1RDKDB4MTJjODEwNmYpLCBTVEMoMHgxOGY4YjgzYyksIFNUQygweDFmMTlmOTdiKSwgU1RDKDB4MjUyODBjNWUpLAorICAgIFNUQygweDJiMWYzNGViKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgzNmJhMjAxNCksIFNUQygweDNjNTZiYTcwKSwKKyAgICBTVEMoMHg0MWNlMWU2NSksIFNUQygweDA4NWYyMTM3KSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgxOGY4YjgzYyksCisgICAgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgyOTI0ZWRhYyksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4Mzg5Y2VhNzIpLAorICAgIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDU0NjU3MTk0KSwKKyAgICBTVEMoMHgwYTc1ZDYwZSksIFNUQygweDE0ZDljMjQ1KSwgU1RDKDB4MWYxOWY5N2IpLCBTVEMoMHgyOTI0ZWRhYyksCisgICAgU1RDKDB4MzJlOTZjMDkpLCBTVEMoMHgzYzU2YmE3MCksIFNUQygweDQ1NWNiNDBjKSwgU1RDKDB4NGRlYmU0ZmUpLAorICAgIFNUQygweDU1ZjVhNGQyKSwgU1RDKDB4NWQ2YzJmOTkpLCBTVEMoMHg2NDQyYmQ3ZSksIFNUQygweDBjOGJkMzVlKSwKKyAgICBTVEMoMHgxOGY4YjgzYyksIFNUQygweDI1MjgwYzVlKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgzYzU2YmE3MCksCisgICAgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHg1MTMzY2M5NCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NjJmMjAxYWMpLAorICAgIFNUQygweDZhNmQ5OGE0KSwgU1RDKDB4NzBlMmNiYzYpLCBTVEMoMHgwZWEwZjQ4YyksIFNUQygweDFkMTBkNWMyKSwKKyAgICBTVEMoMHgyYjFmMzRlYiksIFNUQygweDM4OWNlYTcyKSwgU1RDKDB4NDU1Y2I0MGMpLCBTVEMoMHg1MTMzY2M5NCksCisgICAgU1RDKDB4NWJmYTdiODIpLCBTVEMoMHg2NThjOWEyZCksIFNUQygweDZkY2EwZDE0KSwgU1RDKDB4NzQ5NzJmOTIpLAorICAgIFNUQygweDc5ZGQzMDk4KSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDMwZmJjNTRkKSwKKyAgICBTVEMoMHg0MDAwMDAwMCksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2NThjOWEyZCksCisgICAgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4N2VlN2FhNGMpLAorICAgIFNUQygweDEyYzgxMDZmKSwgU1RDKDB4MjUyODBjNWUpLCBTVEMoMHgzNmJhMjAxNCksIFNUQygweDQ3MWNlY2U3KSwKKyAgICBTVEMoMHg1NWY1YTRkMiksIFNUQygweDYyZjIwMWFjKSwgU1RDKDB4NmRjYTBkMTQpLCBTVEMoMHg3NjQxYWYzZCksCisgICAgU1RDKDB4N2MyOWZiZWUpLCBTVEMoMHg3ZjYyMzY4ZiksIFNUQygweDdmZDg4NzhlKSwgU1RDKDB4MTRkOWMyNDUpLAorICAgIFNUQygweDI5MjRlZGFjKSwgU1RDKDB4M2M1NmJhNzApLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDVkNmMyZjk5KSwKKyAgICBTVEMoMHg2YTZkOThhNCksIFNUQygweDc0OTcyZjkyKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3ZjYyMzY4ZiksCisgICAgU1RDKDB4N2ZiOWQ3NTkpLCBTVEMoMHg3Y2E4MDAzOCksIFNUQygweDE2ZWEwNjQ2KSwgU1RDKDB4MmQxNjg3OTIpLAorICAgIFNUQygweDQxY2UxZTY1KSwgU1RDKDB4NTQ2NTcxOTQpLCBTVEMoMHg2NDQyYmQ3ZSksIFNUQygweDcwZTJjYmM2KSwKKyAgICBTVEMoMHg3OWRkMzA5OCksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2ZkODg3OGUpLCBTVEMoMHg3Y2E4MDAzOCksCisgICAgU1RDKDB4NzU3MDc1YWMpLCBTVEMoMHgxOGY4YjgzYyksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4NDcxY2VjZTcpLAorICAgIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDdkOGE1ZjQwKSwKKyAgICBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDdkOGE1ZjQwKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg2YTZkOThhNCksCisgICAgU1RDKDB4MWIwNWI0MGYpLCBTVEMoMHgzNGQzOTU3ZSksIFNUQygweDRjM2ZkZmY0KSwgU1RDKDB4NjAzYzQ5NmMpLAorICAgIFNUQygweDZmZTIzMTNjKSwgU1RDKDB4N2E3ZDA1NWIpLCBTVEMoMHg3ZjkyNjYxZCksIFNUQygweDdlZTdhYTRjKSwKKyAgICBTVEMoMHg3ODg0ODQxNCksIFNUQygweDZjYjJhODM3KSwgU1RDKDB4NWJmYTdiODIpLCBTVEMoMHgxZDEwZDVjMiksCisgICAgU1RDKDB4Mzg5Y2VhNzIpLCBTVEMoMHg1MTMzY2M5NCksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NzQ5NzJmOTIpLAorICAgIFNUQygweDdkOGE1ZjQwKSwgU1RDKDB4N2ZlZTc0YTIpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDcwZTJjYmM2KSwKKyAgICBTVEMoMHg2MDNjNDk2YyksIFNUQygweDRhOGVhMTExKSwgU1RDKDB4MWYxOWY5N2IpLCBTVEMoMHgzYzU2YmE3MCksCisgICAgU1RDKDB4NTVmNWE0ZDIpLCBTVEMoMHg2YTZkOThhNCksIFNUQygweDc4ODQ4NDE0KSwgU1RDKDB4N2Y2MjM2OGYpLAorICAgIFNUQygweDdlOWQ1NWZjKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg2NmNmODEyMCksIFNUQygweDUxMzNjYzk0KSwKKyAgICBTVEMoMHgzNmJhMjAxNCksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg1YTgyNzk5YSksCisgICAgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4N2JhMzc1MWQpLAorICAgIFNUQygweDZlZDllYmExKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDIxMjBmYjgzKSwKKyAgICBTVEMoMHgyMzI1Yjg0NyksIFNUQygweDQzOTdiYTMyKSwgU1RDKDB4NWVkNzdjOGEpLCBTVEMoMHg3MmNjYjlkYiksCisgICAgU1RDKDB4N2RlZWFhN2EpLCBTVEMoMHg3ZjYyMzY4ZiksIFNUQygweDc3MGFjZGVjKSwgU1RDKDB4NjU4YzlhMmQpLAorICAgIFNUQygweDRjM2ZkZmY0KSwgU1RDKDB4MmQxNjg3OTIpLCBTVEMoMHgwYTc1ZDYwZSksIFNUQygweDI1MjgwYzVlKSwKKyAgICBTVEMoMHg0NzFjZWNlNyksIFNUQygweDYyZjIwMWFjKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3ZjYyMzY4ZiksCisgICAgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg3MGUyY2JjNiksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4M2M1NmJhNzApLAorICAgIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4ZjM3NDJjYTIpLCBTVEMoMHgyNzI3ZDQ4NiksIFNUQygweDRhOGVhMTExKSwKKyAgICBTVEMoMHg2NmNmODEyMCksIFNUQygweDc5MzUwMWE5KSwgU1RDKDB4N2ZmYjlkMTUpLCBTVEMoMHg3YTdkMDU1YiksCisgICAgU1RDKDB4Njk0MDE1YzMpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDJiMWYzNGViKSwgU1RDKDB4MDQzMDIzOGYpLAorICAgIFNUQygweGRjZGE0N2I5KSwgU1RDKDB4MjkyNGVkYWMpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDZhNmQ5OGE0KSwKKyAgICBTVEMoMHg3YmEzNzUxZCksIFNUQygweDdmYjlkNzU5KSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg2MDNjNDk2YyksCisgICAgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgxOGY4YjgzYyksIFNUQygweGVmNGFlYWYxKSwgU1RDKDB4Yzc2MzE1OGUpLAorICAgIFNUQygweDJiMWYzNGViKSwgU1RDKDB4NTEzM2NjOTQpLCBTVEMoMHg2ZGNhMGQxNCksIFNUQygweDdkOGE1ZjQwKSwKKyAgICBTVEMoMHg3ZTlkNTVmYyksIFNUQygweDcwZTJjYmM2KSwgU1RDKDB4NTVmNWE0ZDIpLCBTVEMoMHgzMGZiYzU0ZCksCisgICAgU1RDKDB4MDY0N2Q5N2MpLCBTVEMoMHhkYWQ3ZjNhMiksIFNUQygweGIzYzAyMDBjKSwgU1RDKDB4MmQxNjg3OTIpLAorICAgIFNUQygweDU0NjU3MTk0KSwgU1RDKDB4NzBlMmNiYzYpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdjYTgwMDM4KSwKKyAgICBTVEMoMHg2YTZkOThhNCksIFNUQygweDRhOGVhMTExKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHhmMzc0MmNhMiksCisgICAgU1RDKDB4Yzc2MzE1OGUpLCBTVEMoMHhhMjkzZDA2NyksIFNUQygweDJmMGFjMzIwKSwgU1RDKDB4NTc3ZmYzZGEpLAorICAgIFNUQygweDczYjVlYmQxKSwgU1RDKDB4N2ZiOWQ3NTkpLCBTVEMoMHg3OWRkMzA5OCksIFNUQygweDYyZjIwMWFjKSwKKyAgICBTVEMoMHgzZTJkN2ViMSksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4ZTBlNjA2ODUpLCBTVEMoMHhiNTcxNWVlZiksCisgICAgU1RDKDB4OTQ2YzJmZDIpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NzY0MWFmM2QpLAorICAgIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDMwZmJjNTRkKSwKKyAgICBTVEMoMHgwMDAwMDAwMCksIFNUQygweGNmMDQzYWIzKSwgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHg4OWJlNTBjMyksCisgICAgU1RDKDB4MzJlOTZjMDkpLCBTVEMoMHg1ZDZjMmY5OSksIFNUQygweDc4ODQ4NDE0KSwgU1RDKDB4N2ZiOWQ3NTkpLAorICAgIFNUQygweDcxZGJhOWFiKSwgU1RDKDB4NTEzM2NjOTQpLCBTVEMoMHgyMzI1Yjg0NyksIFNUQygweGVmNGFlYWYxKSwKKyAgICBTVEMoMHhiZTMxZTE5YiksIFNUQygweDk3ZjRhM2NkKSwgU1RDKDB4ODJlMjg2YTgpLCBTVEMoMHgzNGQzOTU3ZSksCisgICAgU1RDKDB4NjAzYzQ5NmMpLCBTVEMoMHg3YTdkMDU1YiksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4NmNiMmE4MzcpLAorICAgIFNUQygweDQ3MWNlY2U3KSwgU1RDKDB4MTRkOWMyNDUpLCBTVEMoMHhkZWRmMDQ3ZCksIFNUQygweGFlY2MzMzZjKSwKKyAgICBTVEMoMHg4ZDMzNDYyNSksIFNUQygweDgwMTE4YjVlKSwgU1RDKDB4MzZiYTIwMTQpLCBTVEMoMHg2MmYyMDFhYyksCisgICAgU1RDKDB4N2MyOWZiZWUpLCBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDY2Y2Y4MTIwKSwgU1RDKDB4M2M1NmJhNzApLAorICAgIFNUQygweDA2NDdkOTdjKSwgU1RDKDB4Y2YwNDNhYjMpLCBTVEMoMHhhMTI4ODM3NiksIFNUQygweDg1ODJmYWE1KSwKKyAgICBTVEMoMHg4MTYyYWEwNCksIFNUQygweDM4OWNlYTcyKSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg3ZDhhNWY0MCksCisgICAgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg2MDNjNDk2YyksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4ZjdhMGRlYzkpLAorICAgIFNUQygweGMwMDAwMDAwKSwgU1RDKDB4OTU5MjY3NWMpLCBTVEMoMHg4MTE4NTViNCksIFNUQygweDg2Y2FmZTU3KSwKKyAgICBTVEMoMHgzYTdiZDM4MiksIFNUQygweDY4MGI1YzMzKSwgU1RDKDB4N2U5ZDU1ZmMpLCBTVEMoMHg3OTM1MDFhOSksCisgICAgU1RDKDB4NTkwNDQzYTcpLCBTVEMoMHgyNTI4MGM1ZSksIFNUQygweGU5MTVmOWJhKSwgU1RDKDB4YjIxNDFiMDIpLAorICAgIFNUQygweDhjNGExNDJmKSwgU1RDKDB4ODAxMThiNWUpLCBTVEMoMHg5MDFkY2VjNCksIFNUQygweDNjNTZiYTcwKSwKKyAgICBTVEMoMHg2YTZkOThhNCksIFNUQygweDdmNjIzNjhmKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg1MTMzY2M5NCksCisgICAgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHhkYWQ3ZjNhMiksIFNUQygweGE1N2Q4NjY2KSwgU1RDKDB4ODU4MmZhYTUpLAorICAgIFNUQygweDgyNzVhMGMwKSwgU1RDKDB4OWQwZGZlNTQpLCBTVEMoMHgzZTJkN2ViMSksIFNUQygweDZjYjJhODM3KSwKKyAgICBTVEMoMHg3ZmQ4ODc4ZSksIFNUQygweDcyY2NiOWRiKSwgU1RDKDB4NDhkODQ2MDkpLCBTVEMoMHgwYzhiZDM1ZSksCisgICAgU1RDKDB4Y2QxNjkzZjcpLCBTVEMoMHg5YTczNjVkMyksIFNUQygweDgxNjJhYTA0KSwgU1RDKDB4ODgzNDNjMGUpLAorICAgIFNUQygweGFkMzA4YTcxKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsNjBbXSA9IHsKKyAgICBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3ZDMzZjBjYSksCisgICAgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4Njc4ZGRlNmUpLAorICAgIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDI3OGRkZTZlKSwKKyAgICBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHg2NzhkZGU2ZSksCisgICAgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHhkODcyMjE5MiksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4MGQ2MTMwNGUpLAorICAgIFNUQygweGI0YzM3M2VlKSwgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHhmMjllY2ZiMiksIFNUQygweDk4NzIyMTkyKSwKKyAgICBTVEMoMHg0YjNjOGMxMiksIFNUQygweGQ4NzIyMTkyKSwgU1RDKDB4ODY0M2M3YjMpLCBTVEMoMHg0MDAwMDAwMCksCisgICAgU1RDKDB4YzAwMDAwMDApLCBTVEMoMHg4MDAwMDAwMCksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4YWE1OWVkYTQpLAorICAgIFNUQygweDg2NDNjN2IzKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHg5ODcyMjE5MiksIFNUQygweDk4NzIyMTkyKSwKKyAgICBTVEMoMHgxYTljZDlhYyksIFNUQygweDhiMTBmMTQ0KSwgU1RDKDB4YjRjMzczZWUpLCBTVEMoMHgwZDYxMzA0ZSksCisgICAgU1RDKDB4ODJjYzBmMzYpLCBTVEMoMHhkODcyMjE5MiksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9TVEIgUm90VmVjdG9ySW1hZzYwW10gPSB7CisgICAgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MWE5Y2Q5YWMpLAorICAgIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDRiM2M4YzEyKSwKKyAgICBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg3OWJjMzg0ZCksCisgICAgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4NGIzYzhjMTIpLAorICAgIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDdmNGM3ZTU0KSwKKyAgICBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg0YjNjOGMxMiksCisgICAgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4NmVkOWViYTEpLAorICAgIFNUQygweDZlZDllYmExKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHg3NGVmMGViYyksIFNUQygweDVmMWY1ZWExKSwKKyAgICBTVEMoMHhkODcyMjE5MiksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHhiNGMzNzNlZSksCisgICAgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDk4NzIyMTkyKSwgU1RDKDB4N2Y0YzdlNTQpLAorICAgIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4ODY0M2M3YjMpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfU1RCIFJvdFZlY3RvclJlYWwxMjBbXSA9IHsKKyAgICBTVEMoMHg3ZmQzMTdiNCksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3ZDMzZjBjYSksCisgICAgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc3N2Y5MDNjKSwgU1RDKDB4N2Y0YzdlNTQpLAorICAgIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3NGVmMGViYyksIFNUQygweDZlZDllYmExKSwKKyAgICBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3OWJjMzg0ZCksCisgICAgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NGIzYzhjMTIpLAorICAgIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3NGVmMGViYyksIFNUQygweDY3OGRkZTZlKSwKKyAgICBTVEMoMHg1NWE2MTI1YyksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgwZDYxMzA0ZSksCisgICAgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NDAwMDAwMDApLAorICAgIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhkZWRmMDQ3ZCksIFNUQygweDc5YmMzODRkKSwKKyAgICBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgwMDAwMDAwMCksCisgICAgU1RDKDB4ZDg3MjIxOTIpLCBTVEMoMHhiNGMzNzNlZSksIFNUQygweDc3N2Y5MDNjKSwgU1RDKDB4NWYxZjVlYTEpLAorICAgIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHhkZWRmMDQ3ZCksIFNUQygweGI0YzM3M2VlKSwKKyAgICBTVEMoMHg5NGE2NzE1ZCksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHgyNzhkZGU2ZSksCisgICAgU1RDKDB4ZjI5ZWNmYjIpLCBTVEMoMHhjMDAwMDAwMCksIFNUQygweDk4NzIyMTkyKSwgU1RDKDB4ODJjYzBmMzYpLAorICAgIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHgxNDA2MGI2OCksIFNUQygweGQ4NzIyMTkyKSwKKyAgICBTVEMoMHhhNTdkODY2NiksIFNUQygweDg2NDNjN2IzKSwgU1RDKDB4ODE5MzZkYWYpLCBTVEMoMHg2ZWQ5ZWJhMSksCisgICAgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGMwMDAwMDAwKSwgU1RDKDB4OTEyNjE0NWYpLAorICAgIFNUQygweDgwMDAwMDAwKSwgU1RDKDB4OTEyNjE0NWYpLCBTVEMoMHg2YjU5OGVhMyksIFNUQygweDM0MGZmMjQyKSwKKyAgICBTVEMoMHhlYmY5ZjQ5OCksIFNUQygweGFhNTllZGE0KSwgU1RDKDB4ODQ1YzhhZTMpLCBTVEMoMHg4NjQzYzdiMyksCisgICAgU1RDKDB4YWY3MjZkZWYpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4ZDg3MjIxOTIpLAorICAgIFNUQygweDk4NzIyMTkyKSwgU1RDKDB4ODAwMDAwMDApLCBTVEMoMHg5ODcyMjE5MiksIFNUQygweGQ4NzIyMTkyKSwKKyAgICBTVEMoMHg2Mzc5ODRkNCksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4YzVlM2EzYTkpLCBTVEMoMHg4YjEwZjE0NCksCisgICAgU1RDKDB4ODQ1YzhhZTMpLCBTVEMoMHhiNGMzNzNlZSksIFNUQygweDA2YjJmMWQyKSwgU1RDKDB4NWYxZjVlYTEpLAorICAgIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4YjRjMzczZWUpLCBTVEMoMHg4MmNjMGYzNiksIFNUQygweDkxMjYxNDVmKSwKKyAgICBTVEMoMHhkODcyMjE5MiksIFNUQygweDM0MGZmMjQyKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnMTIwW10gPSB7CisgICAgU1RDKDB4MDZiMmYxZDIpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4MWE5Y2Q5YWMpLAorICAgIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgyZGRmMDA0MCksIFNUQygweDBkNjEzMDRlKSwKKyAgICBTVEMoMHgxYTljZDlhYyksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHg0MDAwMDAwMCksCisgICAgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDE0MDYwYjY4KSwgU1RDKDB4Mjc4ZGRlNmUpLAorICAgIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDY3OGRkZTZlKSwKKyAgICBTVEMoMHg3MjBjODA3NSksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHg0YjNjOGMxMiksCisgICAgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4N2Y0YzdlNTQpLAorICAgIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDZlZDllYmExKSwKKyAgICBTVEMoMHg3YmEzNzUxZCksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHgyNzhkZGU2ZSksCisgICAgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4N2ZmZmZmZmYpLAorICAgIFNUQygweDc5YmMzODRkKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHgyZGRmMDA0MCksIFNUQygweDU1YTYxMjVjKSwKKyAgICBTVEMoMHg3MjBjODA3NSksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg2NzhkZGU2ZSksCisgICAgU1RDKDB4NDViNmJiNWUpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NzliYzM4NGQpLAorICAgIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDFhOWNkOWFjKSwKKyAgICBTVEMoMHgzYTFjNWM1NyksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3OWJjMzg0ZCksCisgICAgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweGViZjlmNDk4KSwgU1RDKDB4NDAwMDAwMDApLAorICAgIFNUQygweDZlZDllYmExKSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDQwMDAwMDAwKSwKKyAgICBTVEMoMHgwMDAwMDAwMCksIFNUQygweGMwMDAwMDAwKSwgU1RDKDB4NDViNmJiNWUpLCBTVEMoMHg3NGVmMGViYyksCisgICAgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4ZDg3MjIxOTIpLAorICAgIFNUQygweDljODY3YjJjKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc5YmMzODRkKSwKKyAgICBTVEMoMHg0YjNjOGMxMiksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4YjRjMzczZWUpLCBTVEMoMHg4NjQzYzdiMyksCisgICAgU1RDKDB4NTA4ZDkyMTEpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4MzQwZmYyNDIpLAorICAgIFNUQygweGRlZGYwNDdkKSwgU1RDKDB4OTg3MjIxOTIpLCBTVEMoMHg4MDJjZTg0YyksIFNUQygweDU1YTYxMjVjKSwKKyAgICBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHhjMDAwMDAwMCksCisgICAgU1RDKDB4ODY0M2M3YjMpLCBTVEMoMHg4YjEwZjE0NCksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDE5MltdID0geworICAgIFNUQygweDdmZWU3NGEyKSwgU1RDKDB4N2ZiOWQ3NTkpLCBTVEMoMHg3ZjYyMzY4ZiksIFNUQygweDdlZTdhYTRjKSwKKyAgICBTVEMoMHg3ZTRhNTQyNiksIFNUQygweDdkOGE1ZjQwKSwgU1RDKDB4N2NhODAwMzgpLCBTVEMoMHg3YmEzNzUxZCksCisgICAgU1RDKDB4N2E3ZDA1NWIpLCBTVEMoMHg3OTM1MDFhOSksIFNUQygweDc3Y2JjM2YyKSwgU1RDKDB4NzY0MWFmM2QpLAorICAgIFNUQygweDc0OTcyZjkyKSwgU1RDKDB4NzJjY2I5ZGIpLCBTVEMoMHg3MGUyY2JjNiksIFNUQygweDdmYjlkNzU5KSwKKyAgICBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdkOGE1ZjQwKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3OTM1MDFhOSksCisgICAgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3MmNjYjlkYiksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NmE2ZDk4YTQpLAorICAgIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NjAzYzQ5NmMpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDU0NjU3MTk0KSwKKyAgICBTVEMoMHg0ZGViZTRmZSksIFNUQygweDQ3MWNlY2U3KSwgU1RDKDB4N2Y2MjM2OGYpLCBTVEMoMHg3ZDhhNWY0MCksCisgICAgU1RDKDB4N2E3ZDA1NWIpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDcwZTJjYmM2KSwgU1RDKDB4NmE2ZDk4YTQpLAorICAgIFNUQygweDYyZjIwMWFjKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1MTMzY2M5NCksIFNUQygweDQ3MWNlY2U3KSwKKyAgICBTVEMoMHgzYzU2YmE3MCksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MjUyODBjNWUpLCBTVEMoMHgxOGY4YjgzYyksCisgICAgU1RDKDB4MGM4YmQzNWUpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzY0MWFmM2QpLAorICAgIFNUQygweDZlZDllYmExKSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDRkZWJlNGZlKSwKKyAgICBTVEMoMHg0MDAwMDAwMCksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgxMGI1MTUwZiksCisgICAgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhlZjRhZWFmMSksIFNUQygweGRlZGYwNDdkKSwgU1RDKDB4Y2YwNDNhYjMpLAorICAgIFNUQygweDdlNGE1NDI2KSwgU1RDKDB4NzkzNTAxYTkpLCBTVEMoMHg3MGUyY2JjNiksIFNUQygweDY1OGM5YTJkKSwKKyAgICBTVEMoMHg1NzdmZjNkYSksIFNUQygweDQ3MWNlY2U3KSwgU1RDKDB4MzRkMzk1N2UpLCBTVEMoMHgyMTIwZmI4MyksCisgICAgU1RDKDB4MGM4YmQzNWUpLCBTVEMoMHhmN2EwZGVjOSksIFNUQygweGUyZWYyYTNlKSwgU1RDKDB4Y2YwNDNhYjMpLAorICAgIFNUQygweGJjNjg0NWNlKSwgU1RDKDB4YWI5YThlNmMpLCBTVEMoMHg5ZDBkZmU1NCksIFNUQygweDdkOGE1ZjQwKSwKKyAgICBTVEMoMHg3NjQxYWYzZCksIFNUQygweDZhNmQ5OGE0KSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0NzFjZWNlNyksCisgICAgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgxOGY4YjgzYyksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZTcwNzQ3YzQpLAorICAgIFNUQygweGNmMDQzYWIzKSwgU1RDKDB4YjhlMzEzMTkpLCBTVEMoMHhhNTdkODY2NiksIFNUQygweDk1OTI2NzVjKSwKKyAgICBTVEMoMHg4OWJlNTBjMyksIFNUQygweDgyNzVhMGMwKSwgU1RDKDB4N2NhODAwMzgpLCBTVEMoMHg3MmNjYjlkYiksCisgICAgU1RDKDB4NjJmMjAxYWMpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDM0ZDM5NTdlKSwgU1RDKDB4MThmOGI4M2MpLAorICAgIFNUQygweGZiY2ZkYzcxKSwgU1RDKDB4ZGVkZjA0N2QpLCBTVEMoMHhjM2E5NDU5MCksIFNUQygweGFiOWE4ZTZjKSwKKyAgICBTVEMoMHg5N2Y0YTNjZCksIFNUQygweDg5YmU1MGMzKSwgU1RDKDB4ODFiNWFiZGEpLCBTVEMoMHg4MDQ2MjhhNyksCisgICAgU1RDKDB4ODU4MmZhYTUpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NWE4Mjc5OWEpLAorICAgIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGRlZGYwNDdkKSwKKyAgICBTVEMoMHhjMDAwMDAwMCksIFNUQygweGE1N2Q4NjY2KSwgU1RDKDB4OTEyNjE0NWYpLCBTVEMoMHg4NDVjOGFlMyksCisgICAgU1RDKDB4ODAwMDAwMDApLCBTVEMoMHg4NDVjOGFlMyksIFNUQygweDkxMjYxNDVmKSwgU1RDKDB4YTU3ZDg2NjYpLAorICAgIFNUQygweDdhN2QwNTViKSwgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg1MTMzY2M5NCksIFNUQygweDMwZmJjNTRkKSwKKyAgICBTVEMoMHgwYzhiZDM1ZSksIFNUQygweGU3MDc0N2M0KSwgU1RDKDB4YzNhOTQ1OTApLCBTVEMoMHhhNTdkODY2NiksCisgICAgU1RDKDB4OGYxZDM0M2EpLCBTVEMoMHg4Mjc1YTBjMCksIFNUQygweDgwOWRjOTcxKSwgU1RDKDB4ODliZTUwYzMpLAorICAgIFNUQygweDlkMGRmZTU0KSwgU1RDKDB4YjhlMzEzMTkpLCBTVEMoMHhkYWQ3ZjNhMiksIFNUQygweDc5MzUwMWE5KSwKKyAgICBTVEMoMHg2NThjOWEyZCksIFNUQygweDQ3MWNlY2U3KSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHhmN2EwZGVjOSksCisgICAgU1RDKDB4Y2YwNDNhYjMpLCBTVEMoMHhhYjlhOGU2YyksIFNUQygweDkxMjYxNDVmKSwgU1RDKDB4ODI3NWEwYzApLAorICAgIFNUQygweDgxMTg1NWI0KSwgU1RDKDB4OGQzMzQ2MjUpLCBTVEMoMHhhNTdkODY2NiksIFNUQygweGM3NjMxNThlKSwKKyAgICBTVEMoMHhlZjRhZWFmMSksIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4NzdjYmMzZjIpLCBTVEMoMHg2MDNjNDk2YyksCisgICAgU1RDKDB4M2M1NmJhNzApLCBTVEMoMHgxMGI1MTUwZiksIFNUQygweGUyZWYyYTNlKSwgU1RDKDB4YjhlMzEzMTkpLAorICAgIFNUQygweDk3ZjRhM2NkKSwgU1RDKDB4ODQ1YzhhZTMpLCBTVEMoMHg4MDlkYzk3MSksIFNUQygweDhkMzM0NjI1KSwKKyAgICBTVEMoMHhhODgwMGMyNiksIFNUQygweGNmMDQzYWIzKSwgU1RDKDB4ZmJjZmRjNzEpLCBTVEMoMHgyOTI0ZWRhYyksCisgICAgU1RDKDB4NTEzM2NjOTQpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfU1RCIFJvdFZlY3RvckltYWcxOTJbXSA9IHsKKyAgICBTVEMoMHgwNDMwMjM4ZiksIFNUQygweDA4NWYyMTM3KSwgU1RDKDB4MGM4YmQzNWUpLCBTVEMoMHgxMGI1MTUwZiksCisgICAgU1RDKDB4MTRkOWMyNDUpLCBTVEMoMHgxOGY4YjgzYyksIFNUQygweDFkMTBkNWMyKSwgU1RDKDB4MjEyMGZiODMpLAorICAgIFNUQygweDI1MjgwYzVlKSwgU1RDKDB4MjkyNGVkYWMpLCBTVEMoMHgyZDE2ODc5MiksIFNUQygweDMwZmJjNTRkKSwKKyAgICBTVEMoMHgzNGQzOTU3ZSksIFNUQygweDM4OWNlYTcyKSwgU1RDKDB4M2M1NmJhNzApLCBTVEMoMHgwODVmMjEzNyksCisgICAgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgxOGY4YjgzYyksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MjkyNGVkYWMpLAorICAgIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4Mzg5Y2VhNzIpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDQ3MWNlY2U3KSwKKyAgICBTVEMoMHg0ZGViZTRmZSksIFNUQygweDU0NjU3MTk0KSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2MDNjNDk2YyksCisgICAgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg2YTZkOThhNCksIFNUQygweDBjOGJkMzVlKSwgU1RDKDB4MThmOGI4M2MpLAorICAgIFNUQygweDI1MjgwYzVlKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgzYzU2YmE3MCksIFNUQygweDQ3MWNlY2U3KSwKKyAgICBTVEMoMHg1MTMzY2M5NCksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NjJmMjAxYWMpLCBTVEMoMHg2YTZkOThhNCksCisgICAgU1RDKDB4NzBlMmNiYzYpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDdhN2QwNTViKSwgU1RDKDB4N2Q4YTVmNDApLAorICAgIFNUQygweDdmNjIzNjhmKSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDMwZmJjNTRkKSwKKyAgICBTVEMoMHg0MDAwMDAwMCksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2NThjOWEyZCksCisgICAgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4N2VlN2FhNGMpLAorICAgIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDc2NDFhZjNkKSwKKyAgICBTVEMoMHgxNGQ5YzI0NSksIFNUQygweDI5MjRlZGFjKSwgU1RDKDB4M2M1NmJhNzApLCBTVEMoMHg0ZGViZTRmZSksCisgICAgU1RDKDB4NWQ2YzJmOTkpLCBTVEMoMHg2YTZkOThhNCksIFNUQygweDc0OTcyZjkyKSwgU1RDKDB4N2JhMzc1MWQpLAorICAgIFNUQygweDdmNjIzNjhmKSwgU1RDKDB4N2ZiOWQ3NTkpLCBTVEMoMHg3Y2E4MDAzOCksIFNUQygweDc2NDFhZjNkKSwKKyAgICBTVEMoMHg2Y2IyYTgzNyksIFNUQygweDYwM2M0OTZjKSwgU1RDKDB4NTEzM2NjOTQpLCBTVEMoMHgxOGY4YjgzYyksCisgICAgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHg0NzFjZWNlNyksIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NmE2ZDk4YTQpLAorICAgIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDdkOGE1ZjQwKSwKKyAgICBTVEMoMHg3NjQxYWYzZCksIFNUQygweDZhNmQ5OGE0KSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0NzFjZWNlNyksCisgICAgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgxOGY4YjgzYyksIFNUQygweDFkMTBkNWMyKSwgU1RDKDB4Mzg5Y2VhNzIpLAorICAgIFNUQygweDUxMzNjYzk0KSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg3NDk3MmY5MiksIFNUQygweDdkOGE1ZjQwKSwKKyAgICBTVEMoMHg3ZmVlNzRhMiksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzBlMmNiYzYpLCBTVEMoMHg2MDNjNDk2YyksCisgICAgU1RDKDB4NGE4ZWExMTEpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDE0ZDljMjQ1KSwgU1RDKDB4ZjdhMGRlYzkpLAorICAgIFNUQygweGRhZDdmM2EyKSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDVhODI3OTlhKSwKKyAgICBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3YmEzNzUxZCksCisgICAgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MjEyMGZiODMpLAorICAgIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZGVkZjA0N2QpLCBTVEMoMHhjMDAwMDAwMCksIFNUQygweGE1N2Q4NjY2KSwKKyAgICBTVEMoMHgyNTI4MGM1ZSksIFNUQygweDQ3MWNlY2U3KSwgU1RDKDB4NjJmMjAxYWMpLCBTVEMoMHg3NjQxYWYzZCksCisgICAgU1RDKDB4N2Y2MjM2OGYpLCBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDcwZTJjYmM2KSwgU1RDKDB4NWE4Mjc5OWEpLAorICAgIFNUQygweDNjNTZiYTcwKSwgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHhmMzc0MmNhMiksIFNUQygweGNmMDQzYWIzKSwKKyAgICBTVEMoMHhhZWNjMzM2YyksIFNUQygweDk1OTI2NzVjKSwgU1RDKDB4ODU4MmZhYTUpLCBTVEMoMHgyOTI0ZWRhYyksCisgICAgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHg2YTZkOThhNCksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4N2ZiOWQ3NTkpLAorICAgIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NjAzYzQ5NmMpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDE4ZjhiODNjKSwKKyAgICBTVEMoMHhlZjRhZWFmMSksIFNUQygweGM3NjMxNThlKSwgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHg4ZDMzNDYyNSksCisgICAgU1RDKDB4ODExODU1YjQpLCBTVEMoMHg4Mjc1YTBjMCksIFNUQygweDJkMTY4NzkyKSwgU1RDKDB4NTQ2NTcxOTQpLAorICAgIFNUQygweDcwZTJjYmM2KSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3Y2E4MDAzOCksIFNUQygweDZhNmQ5OGE0KSwKKyAgICBTVEMoMHg0YThlYTExMSksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4ZjM3NDJjYTIpLCBTVEMoMHhjNzYzMTU4ZSksCisgICAgU1RDKDB4YTI5M2QwNjcpLCBTVEMoMHg4OWJlNTBjMyksIFNUQygweDgwMTE4YjVlKSwgU1RDKDB4ODZjYWZlNTcpLAorICAgIFNUQygweDlkMGRmZTU0KSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsMjQwW10gPSB7CisgICAgU1RDKDB4N2ZmNGM1NmYpLCBTVEMoMHg3ZmQzMTdiNCksIFNUQygweDdmOWFmY2I5KSwgU1RDKDB4N2Y0YzdlNTQpLAorICAgIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3ZGRiNGJmYyksIFNUQygweDdkMzNmMGNhKSwKKyAgICBTVEMoMHg3Yzc2OWUxOCksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4N2FiYTlhZTYpLCBTVEMoMHg3OWJjMzg0ZCksCisgICAgU1RDKDB4NzhhODc5ZjQpLCBTVEMoMHg3NzdmOTAzYyksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4N2ZkMzE3YjQpLAorICAgIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdiYTM3NTFkKSwKKyAgICBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc3N2Y5MDNjKSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg3MjBjODA3NSksCisgICAgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2YjU5OGVhMyksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NjM3OTg0ZDQpLAorICAgIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDdlNmM5MjUxKSwKKyAgICBTVEMoMHg3Yzc2OWUxOCksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3MjBjODA3NSksCisgICAgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4NWE4Mjc5OWEpLAorICAgIFNUQygweDUzMjExZDE4KSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDNhMWM1YzU3KSwKKyAgICBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3OWJjMzg0ZCksCisgICAgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NWYxZjVlYTEpLAorICAgIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDM0MGZmMjQyKSwKKyAgICBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHgwMDAwMDAwMCksCisgICAgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3YmEzNzUxZCksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NmVkOWViYTEpLAorICAgIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDQwMDAwMDAwKSwKKyAgICBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgwMDAwMDAwMCksCisgICAgU1RDKDB4ZWY0YWVhZjEpLCBTVEMoMHhkZWRmMDQ3ZCksIFNUQygweGNmMDQzYWIzKSwgU1RDKDB4N2U2YzkyNTEpLAorICAgIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDVhODI3OTlhKSwKKyAgICBTVEMoMHg0YjNjOGMxMiksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgxNDA2MGI2OCksCisgICAgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhlYmY5ZjQ5OCksIFNUQygweGQ4NzIyMTkyKSwgU1RDKDB4YzVlM2EzYTkpLAorICAgIFNUQygweGI0YzM3M2VlKSwgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHg3ZGRiNGJmYyksIFNUQygweDc3N2Y5MDNjKSwKKyAgICBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHgzYTFjNWM1NyksCisgICAgU1RDKDB4MjQ1YTlkNjUpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweGY1ZjUwZDY3KSwgU1RDKDB4ZGVkZjA0N2QpLAorICAgIFNUQygweGM4ZTUwMzJiKSwgU1RDKDB4YjRjMzczZWUpLCBTVEMoMHhhMzI2ZWVjMCksIFNUQygweDk0YTY3MTVkKSwKKyAgICBTVEMoMHg4OWJlNTBjMyksIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg2NzhkZGU2ZSksCisgICAgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MGQ2MTMwNGUpLAorICAgIFNUQygweGYyOWVjZmIyKSwgU1RDKDB4ZDg3MjIxOTIpLCBTVEMoMHhjMDAwMDAwMCksIFNUQygweGFhNTllZGE0KSwKKyAgICBTVEMoMHg5ODcyMjE5MiksIFNUQygweDhiMTBmMTQ0KSwgU1RDKDB4ODJjYzBmMzYpLCBTVEMoMHg4MDAwMDAwMCksCisgICAgU1RDKDB4N2M3NjllMTgpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4NGIzYzhjMTIpLAorICAgIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHhmNWY1MGQ2NyksIFNUQygweGQ4NzIyMTkyKSwKKyAgICBTVEMoMHhiZDFlYzQ1YyksIFNUQygweGE1N2Q4NjY2KSwgU1RDKDB4OTJkY2FmZTUpLCBTVEMoMHg4NjQzYzdiMyksCisgICAgU1RDKDB4ODA2NTAzNDcpLCBTVEMoMHg4MTkzNmRhZiksIFNUQygweDg5YmU1MGMzKSwgU1RDKDB4N2JhMzc1MWQpLAorICAgIFNUQygweDZlZDllYmExKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDIxMjBmYjgzKSwKKyAgICBTVEMoMHgwMDAwMDAwMCksIFNUQygweGRlZGYwNDdkKSwgU1RDKDB4YzAwMDAwMDApLCBTVEMoMHhhNTdkODY2NiksCisgICAgU1RDKDB4OTEyNjE0NWYpLCBTVEMoMHg4NDVjOGFlMyksIFNUQygweDgwMDAwMDAwKSwgU1RDKDB4ODQ1YzhhZTMpLAorICAgIFNUQygweDkxMjYxNDVmKSwgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHg3YWJhOWFlNiksIFNUQygweDZiNTk4ZWEzKSwKKyAgICBTVEMoMHg1MzIxMWQxOCksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHhlYmY5ZjQ5OCksCisgICAgU1RDKDB4YzhlNTAzMmIpLCBTVEMoMHhhYTU5ZWRhNCksIFNUQygweDkyZGNhZmU1KSwgU1RDKDB4ODQ1YzhhZTMpLAorICAgIFNUQygweDgwMGIzYTkxKSwgU1RDKDB4ODY0M2M3YjMpLCBTVEMoMHg5NjgzMDg3NiksIFNUQygweGFmNzI2ZGVmKSwKKyAgICBTVEMoMHhjZjA0M2FiMyksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg0YjNjOGMxMiksCisgICAgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGQ4NzIyMTkyKSwgU1RDKDB4YjRjMzczZWUpLAorICAgIFNUQygweDk4NzIyMTkyKSwgU1RDKDB4ODY0M2M3YjMpLCBTVEMoMHg4MDAwMDAwMCksIFNUQygweDg2NDNjN2IzKSwKKyAgICBTVEMoMHg5ODcyMjE5MiksIFNUQygweGI0YzM3M2VlKSwgU1RDKDB4ZDg3MjIxOTIpLCBTVEMoMHgwMDAwMDAwMCksCisgICAgU1RDKDB4NzhhODc5ZjQpLCBTVEMoMHg2Mzc5ODRkNCksIFNUQygweDQyZTEzYmE0KSwgU1RDKDB4MWE5Y2Q5YWMpLAorICAgIFNUQygweGVmNGFlYWYxKSwgU1RDKDB4YzVlM2EzYTkpLCBTVEMoMHhhMzI2ZWVjMCksIFNUQygweDhiMTBmMTQ0KSwKKyAgICBTVEMoMHg4MDY1MDM0NyksIFNUQygweDg0NWM4YWUzKSwgU1RDKDB4OTY4MzA4NzYpLCBTVEMoMHhiNGMzNzNlZSksCisgICAgU1RDKDB4ZGJhNTYyOWIpLCBTVEMoMHgwNmIyZjFkMiksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4Nzc3ZjkwM2MpLAorICAgIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweGRlZGYwNDdkKSwKKyAgICBTVEMoMHhiNGMzNzNlZSksIFNUQygweDk0YTY3MTVkKSwgU1RDKDB4ODJjYzBmMzYpLCBTVEMoMHg4MTkzNmRhZiksCisgICAgU1RDKDB4OTEyNjE0NWYpLCBTVEMoMHhhZjcyNmRlZiksIFNUQygweGQ4NzIyMTkyKSwgU1RDKDB4MDZiMmYxZDIpLAorICAgIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4NWE4Mjc5OWEpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfU1RCIFJvdFZlY3RvckltYWcyNDBbXSA9IHsKKyAgICBTVEMoMHgwMzU5YzQyOCksIFNUQygweDA2YjJmMWQyKSwgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHgwZDYxMzA0ZSksCisgICAgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgxNDA2MGI2OCksIFNUQygweDE3NTM3ZTYzKSwgU1RDKDB4MWE5Y2Q5YWMpLAorICAgIFNUQygweDFkZTE4OWE2KSwgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgyNDVhOWQ2NSksIFNUQygweDI3OGRkZTZlKSwKKyAgICBTVEMoMHgyYWJhMmVlNCksIFNUQygweDJkZGYwMDQwKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgwNmIyZjFkMiksCisgICAgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHgxNDA2MGI2OCksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MjEyMGZiODMpLAorICAgIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MmRkZjAwNDApLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDNhMWM1YzU3KSwKKyAgICBTVEMoMHg0MDAwMDAwMCksIFNUQygweDQ1YjZiYjVlKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg1MDhkOTIxMSksCisgICAgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDBhMGFmMjk5KSwgU1RDKDB4MTQwNjBiNjgpLAorICAgIFNUQygweDFkZTE4OWE2KSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDNhMWM1YzU3KSwKKyAgICBTVEMoMHg0MmUxM2JhNCksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NTMyMTFkMTgpLCBTVEMoMHg1YTgyNzk5YSksCisgICAgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4NzIwYzgwNzUpLAorICAgIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4MGQ2MTMwNGUpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDI3OGRkZTZlKSwKKyAgICBTVEMoMHgzNDBmZjI0MiksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg1NWE2MTI1YyksCisgICAgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NzRlZjBlYmMpLAorICAgIFNUQygweDc5YmMzODRkKSwgU1RDKDB4N2QzM2YwY2EpLCBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdmZmZmZmZmKSwKKyAgICBTVEMoMHgxMGI1MTUwZiksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHg0MDAwMDAwMCksCisgICAgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDY1OGM5YTJkKSwgU1RDKDB4NmVkOWViYTEpLAorICAgIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdmZmZmZmZmKSwKKyAgICBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHgxNDA2MGI2OCksCisgICAgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NWE4Mjc5OWEpLAorICAgIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDdlNmM5MjUxKSwKKyAgICBTVEMoMHg3ZmZmZmZmZiksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3MjBjODA3NSksCisgICAgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDE3NTM3ZTYzKSwgU1RDKDB4MmRkZjAwNDApLAorICAgIFNUQygweDQyZTEzYmE0KSwgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg2NThjOWEyZCksIFNUQygweDcyMGM4MDc1KSwKKyAgICBTVEMoMHg3YWJhOWFlNiksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3YmEzNzUxZCksCisgICAgU1RDKDB4NzM4N2VhMjMpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDU4MWMwMGIzKSwgU1RDKDB4NDViNmJiNWUpLAorICAgIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDRiM2M4YzEyKSwKKyAgICBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3ZjRjN2U1NCksCisgICAgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NWYxZjVlYTEpLAorICAgIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDAwMDAwMDAwKSwKKyAgICBTVEMoMHgxZGUxODlhNiksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4NTMyMTFkMTgpLCBTVEMoMHg2NzhkZGU2ZSksCisgICAgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3ZTZjOTI1MSksIFNUQygweDdmOWFmY2I5KSwgU1RDKDB4NzliYzM4NGQpLAorICAgIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDI3OGRkZTZlKSwKKyAgICBTVEMoMHgwYTBhZjI5OSksIFNUQygweGViZjlmNDk4KSwgU1RDKDB4Y2YwNDNhYjMpLCBTVEMoMHgyMTIwZmI4MyksCisgICAgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDZlZDllYmExKSwgU1RDKDB4N2JhMzc1MWQpLAorICAgIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDVhODI3OTlhKSwKKyAgICBTVEMoMHg0MDAwMDAwMCksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhkZWRmMDQ3ZCksCisgICAgU1RDKDB4YzAwMDAwMDApLCBTVEMoMHhhNTdkODY2NiksIFNUQygweDI0NWE5ZDY1KSwgU1RDKDB4NDViNmJiNWUpLAorICAgIFNUQygweDYxNTRmYjkxKSwgU1RDKDB4NzRlZjBlYmMpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdlNmM5MjUxKSwKKyAgICBTVEMoMHg3Mzg3ZWEyMyksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHgyMTIwZmI4MyksCisgICAgU1RDKDB4ZmNhNjNiZDgpLCBTVEMoMHhkODcyMjE5MiksIFNUQygweGI3ODAwMDFjKSwgU1RDKDB4OWM4NjdiMmMpLAorICAgIFNUQygweDg5YmU1MGMzKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDY3OGRkZTZlKSwKKyAgICBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg2NzhkZGU2ZSksCisgICAgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZDg3MjIxOTIpLAorICAgIFNUQygweGI0YzM3M2VlKSwgU1RDKDB4OTg3MjIxOTIpLCBTVEMoMHg4NjQzYzdiMyksIFNUQygweDgwMDAwMDAwKSwKKyAgICBTVEMoMHgyYWJhMmVlNCksIFNUQygweDUwOGQ5MjExKSwgU1RDKDB4NmQyMzUwMWIpLCBTVEMoMHg3ZDMzZjBjYSksCisgICAgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDU4MWMwMGIzKSwgU1RDKDB4MzQwZmYyNDIpLAorICAgIFNUQygweDBhMGFmMjk5KSwgU1RDKDB4ZGVkZjA0N2QpLCBTVEMoMHhiNzgwMDAxYyksIFNUQygweDk4NzIyMTkyKSwKKyAgICBTVEMoMHg4NTQ1NjUxYSksIFNUQygweDgwMmNlODRjKSwgU1RDKDB4ODliZTUwYzMpLCBTVEMoMHgyZGRmMDA0MCksCisgICAgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2JhMzc1MWQpLAorICAgIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NDViNmJiNWUpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweGViZjlmNDk4KSwKKyAgICBTVEMoMHhjMDAwMDAwMCksIFNUQygweDljODY3YjJjKSwgU1RDKDB4ODY0M2M3YjMpLCBTVEMoMHg4MDJjZTg0YyksCisgICAgU1RDKDB4OGIxMGYxNDQpLCBTVEMoMHhhNTdkODY2NiksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9TVEIgUm90VmVjdG9yUmVhbDQ4MFtdID0geworICAgIFNUQygweDdmZmQzMTU0KSwgU1RDKDB4N2ZmNGM1NmYpLCBTVEMoMHg3ZmU2YmNiMCksIFNUQygweDdmZDMxN2I0KSwKKyAgICBTVEMoMHg3ZmI5ZDc1OSksIFNUQygweDdmOWFmY2I5KSwgU1RDKDB4N2Y3Njg5MmYpLCBTVEMoMHg3ZjRjN2U1NCksCisgICAgU1RDKDB4N2YxY2RlMDEpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdlYWNlNThhKSwgU1RDKDB4N2U2YzkyNTEpLAorICAgIFNUQygweDdlMjZiMzcxKSwgU1RDKDB4N2RkYjRiZmMpLCBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDdkMzNmMGNhKSwKKyAgICBTVEMoMHg3Y2Q4MDQ2NCksIFNUQygweDdjNzY5ZTE4KSwgU1RDKDB4N2MwZmMyMmEpLCBTVEMoMHg3YmEzNzUxZCksCisgICAgU1RDKDB4N2IzMWJiYjIpLCBTVEMoMHg3YWJhOWFlNiksIFNUQygweDdhM2UxN2YyKSwgU1RDKDB4NzliYzM4NGQpLAorICAgIFNUQygweDc5MzUwMWE5KSwgU1RDKDB4NzhhODc5ZjQpLCBTVEMoMHg3ODE2YTc1OSksIFNUQygweDc3N2Y5MDNjKSwKKyAgICBTVEMoMHg3NmUzM2IzZiksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NzU5YWYzNGMpLCBTVEMoMHg3ZmY0YzU2ZiksCisgICAgU1RDKDB4N2ZkMzE3YjQpLCBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2VlN2FhNGMpLAorICAgIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2RkYjRiZmMpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdjNzY5ZTE4KSwKKyAgICBTVEMoMHg3YmEzNzUxZCksIFNUQygweDdhYmE5YWU2KSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3OGE4NzlmNCksCisgICAgU1RDKDB4Nzc3ZjkwM2MpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4NzM4N2VhMjMpLAorICAgIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NzA3ZDE0NDMpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDZkMjM1MDFiKSwKKyAgICBTVEMoMHg2YjU5OGVhMyksIFNUQygweDY5N2NmNzhhKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2NThjOWEyZCksCisgICAgU1RDKDB4NjM3OTg0ZDQpLCBTVEMoMHg2MTU0ZmI5MSksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NWNkOTExNDApLAorICAgIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NTgxYzAwYjMpLCBTVEMoMHg3ZmU2YmNiMCksIFNUQygweDdmOWFmY2I5KSwKKyAgICBTVEMoMHg3ZjFjZGUwMSksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg3Yzc2OWUxOCksCisgICAgU1RDKDB4N2IzMWJiYjIpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc4MTZhNzU5KSwgU1RDKDB4NzY0MWFmM2QpLAorICAgIFNUQygweDc0M2UwOTE4KSwgU1RDKDB4NzIwYzgwNzUpLCBTVEMoMHg2ZmFkZjJmYyksIFNUQygweDZkMjM1MDFiKSwKKyAgICBTVEMoMHg2YTZkOThhNCksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NjQ4NTQzZTQpLCBTVEMoMHg2MTU0ZmI5MSksCisgICAgU1RDKDB4NWRmZTQ3YWQpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDU2ZTJmMTVkKSwgU1RDKDB4NTMyMTFkMTgpLAorICAgIFNUQygweDRmM2U3ODc1KSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg0NzFjZWNlNyksIFNUQygweDQyZTEzYmE0KSwKKyAgICBTVEMoMHgzZThiMjQwZSksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4MzU5NmE0NmMpLCBTVEMoMHgzMGZiYzU0ZCksCisgICAgU1RDKDB4MmM0ZDkwNTApLCBTVEMoMHg3ZmQzMTdiNCksIFNUQygweDdmNGM3ZTU0KSwgU1RDKDB4N2U2YzkyNTEpLAorICAgIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc3N2Y5MDNjKSwKKyAgICBTVEMoMHg3NGVmMGViYyksIFNUQygweDcyMGM4MDc1KSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2YjU5OGVhMyksCisgICAgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2Mzc5ODRkNCksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NWE4Mjc5OWEpLAorICAgIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NTA4ZDkyMTEpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDQ1YjZiYjVlKSwKKyAgICBTVEMoMHg0MDAwMDAwMCksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHgyZGRmMDA0MCksCisgICAgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDFhOWNkOWFjKSwgU1RDKDB4MTQwNjBiNjgpLAorICAgIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4MDZiMmYxZDIpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGY5NGQwZTJlKSwKKyAgICBTVEMoMHg3ZmI5ZDc1OSksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2Q4YTVmNDApLCBTVEMoMHg3YmEzNzUxZCksCisgICAgU1RDKDB4NzkzNTAxYTkpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDcyY2NiOWRiKSwgU1RDKDB4NmVkOWViYTEpLAorICAgIFNUQygweDZhNmQ5OGE0KSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg2MDNjNDk2YyksIFNUQygweDVhODI3OTlhKSwKKyAgICBTVEMoMHg1NDY1NzE5NCksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHg0MDAwMDAwMCksCisgICAgU1RDKDB4Mzg5Y2VhNzIpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDI5MjRlZGFjKSwgU1RDKDB4MjEyMGZiODMpLAorICAgIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgwODVmMjEzNyksIFNUQygweDAwMDAwMDAwKSwKKyAgICBTVEMoMHhmN2EwZGVjOSksIFNUQygweGVmNGFlYWYxKSwgU1RDKDB4ZTcwNzQ3YzQpLCBTVEMoMHhkZWRmMDQ3ZCksCisgICAgU1RDKDB4ZDZkYjEyNTQpLCBTVEMoMHhjZjA0M2FiMyksIFNUQygweGM3NjMxNThlKSwgU1RDKDB4N2Y5YWZjYjkpLAorICAgIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2M3NjllMTgpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc2NDFhZjNkKSwKKyAgICBTVEMoMHg3MjBjODA3NSksIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2MTU0ZmI5MSksCisgICAgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NDJlMTNiYTQpLAorICAgIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDFkZTE4OWE2KSwKKyAgICBTVEMoMHgxNDA2MGI2OCksIFNUQygweDBhMGFmMjk5KSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhmNWY1MGQ2NyksCisgICAgU1RDKDB4ZWJmOWY0OTgpLCBTVEMoMHhlMjFlNzY1YSksIFNUQygweGQ4NzIyMTkyKSwgU1RDKDB4Y2YwNDNhYjMpLAorICAgIFNUQygweGM1ZTNhM2E5KSwgU1RDKDB4YmQxZWM0NWMpLCBTVEMoMHhiNGMzNzNlZSksIFNUQygweGFjZGVlMmU4KSwKKyAgICBTVEMoMHhhNTdkODY2NiksIFNUQygweDllYWIwNDZmKSwgU1RDKDB4N2Y3Njg5MmYpLCBTVEMoMHg3ZGRiNGJmYyksCisgICAgU1RDKDB4N2IzMWJiYjIpLCBTVEMoMHg3NzdmOTAzYyksIFNUQygweDcyY2NiOWRiKSwgU1RDKDB4NmQyMzUwMWIpLAorICAgIFNUQygweDY2OGY3YzI1KSwgU1RDKDB4NWYxZjVlYTEpLCBTVEMoMHg1NmUyZjE1ZCksIFNUQygweDRkZWJlNGZlKSwKKyAgICBTVEMoMHg0NDRkN2FmZiksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4MmY2ZTZkMTYpLCBTVEMoMHgyNDVhOWQ2NSksCisgICAgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDAxYWNlYjdjKSwgU1RDKDB4ZjVmNTBkNjcpLAorICAgIFNUQygweGVhNTJjMTY2KSwgU1RDKDB4ZGVkZjA0N2QpLCBTVEMoMHhkM2IyNmZiMCksIFNUQygweGM4ZTUwMzJiKSwKKyAgICBTVEMoMHhiZThkZjJiYSksIFNUQygweGI0YzM3M2VlKSwgU1RDKDB4YWI5YThlNmMpLCBTVEMoMHhhMzI2ZWVjMCksCisgICAgU1RDKDB4OWI3YWJjMWMpLCBTVEMoMHg5NGE2NzE1ZCksIFNUQygweDhlYjhiOWEwKSwgU1RDKDB4ODliZTUwYzMpLAorICAgIFNUQygweDg1YzFlODBlKSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDc5YmMzODRkKSwKKyAgICBTVEMoMHg3NGVmMGViYyksIFNUQygweDZlZDllYmExKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1ZjFmNWVhMSksCisgICAgU1RDKDB4NTVhNjEyNWMpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MzQwZmYyNDIpLAorICAgIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDAwMDAwMDAwKSwKKyAgICBTVEMoMHhmMjllY2ZiMiksIFNUQygweGU1NjMyNjU0KSwgU1RDKDB4ZDg3MjIxOTIpLCBTVEMoMHhjYmYwMGRiZSksCisgICAgU1RDKDB4YzAwMDAwMDApLCBTVEMoMHhiNGMzNzNlZSksIFNUQygweGFhNTllZGE0KSwgU1RDKDB4YTBlMGExNWYpLAorICAgIFNUQygweDk4NzIyMTkyKSwgU1RDKDB4OTEyNjE0NWYpLCBTVEMoMHg4YjEwZjE0NCksIFNUQygweDg2NDNjN2IzKSwKKyAgICBTVEMoMHg4MmNjMGYzNiksIFNUQygweDgwYjM4MWFjKSwgU1RDKDB4ODAwMDAwMDApLCBTVEMoMHg4MGIzODFhYyksCisgICAgU1RDKDB4N2YxY2RlMDEpLCBTVEMoMHg3Yzc2OWUxOCksIFNUQygweDc4MTZhNzU5KSwgU1RDKDB4NzIwYzgwNzUpLAorICAgIFNUQygweDZhNmQ5OGE0KSwgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg1NmUyZjE1ZCksIFNUQygweDRiM2M4YzEyKSwKKyAgICBTVEMoMHgzZThiMjQwZSksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4MjJiZThmODcpLCBTVEMoMHgxNDA2MGI2OCksCisgICAgU1RDKDB4MDUwNjc3MzQpLCBTVEMoMHhmNWY1MGQ2NyksIFNUQygweGU3MDc0N2M0KSwgU1RDKDB4ZDg3MjIxOTIpLAorICAgIFNUQygweGNhNjk1Yjk0KSwgU1RDKDB4YmQxZWM0NWMpLCBTVEMoMHhiMGMxODc4YiksIFNUQygweGE1N2Q4NjY2KSwKKyAgICBTVEMoMHg5YjdhYmMxYyksIFNUQygweDkyZGNhZmU1KSwgU1RDKDB4OGJjMWY2ZTgpLCBTVEMoMHg4NjQzYzdiMyksCisgICAgU1RDKDB4ODI3NWEwYzApLCBTVEMoMHg4MDY1MDM0NyksIFNUQygweDgwMTk0MzUwKSwgU1RDKDB4ODE5MzZkYWYpLAorICAgIFNUQygweDg0Y2U0NDRlKSwgU1RDKDB4ODliZTUwYzMpLCBTVEMoMHg5MDUyMGQwNCksIFNUQygweDdlZTdhYTRjKSwKKyAgICBTVEMoMHg3YmEzNzUxZCksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg2NThjOWEyZCksCisgICAgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg0ZGViZTRmZSksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MzBmYmM1NGQpLAorICAgIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGVmNGFlYWYxKSwKKyAgICBTVEMoMHhkZWRmMDQ3ZCksIFNUQygweGNmMDQzYWIzKSwgU1RDKDB4YzAwMDAwMDApLCBTVEMoMHhiMjE0MWIwMiksCisgICAgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHg5YTczNjVkMyksIFNUQygweDkxMjYxNDVmKSwgU1RDKDB4ODliZTUwYzMpLAorICAgIFNUQygweDg0NWM4YWUzKSwgU1RDKDB4ODExODU1YjQpLCBTVEMoMHg4MDAwMDAwMCksIFNUQygweDgxMTg1NWI0KSwKKyAgICBTVEMoMHg4NDVjOGFlMyksIFNUQygweDg5YmU1MGMzKSwgU1RDKDB4OTEyNjE0NWYpLCBTVEMoMHg5YTczNjVkMyksCisgICAgU1RDKDB4YTU3ZDg2NjYpLCBTVEMoMHhiMjE0MWIwMiksIFNUQygweDdlYWNlNThhKSwgU1RDKDB4N2FiYTlhZTYpLAorICAgIFNUQygweDc0M2UwOTE4KSwgU1RDKDB4NmI1OThlYTMpLCBTVEMoMHg2MDNjNDk2YyksIFNUQygweDUzMjExZDE4KSwKKyAgICBTVEMoMHg0NDRkN2FmZiksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4MjJiZThmODcpLCBTVEMoMHgxMGI1MTUwZiksCisgICAgU1RDKDB4ZmU1MzE0ODQpLCBTVEMoMHhlYmY5ZjQ5OCksIFNUQygweGRhMGFlY2Y5KSwgU1RDKDB4YzhlNTAzMmIpLAorICAgIFNUQygweGI4ZTMxMzE5KSwgU1RDKDB4YWE1OWVkYTQpLCBTVEMoMHg5ZDk2OTc0MiksIFNUQygweDkyZGNhZmU1KSwKKyAgICBTVEMoMHg4YTY1MGNiNCksIFNUQygweDg0NWM4YWUzKSwgU1RDKDB4ODBlMzIxZmYpLCBTVEMoMHg4MDBiM2E5MSksCisgICAgU1RDKDB4ODFkOTRjOGYpLCBTVEMoMHg4NjQzYzdiMyksIFNUQygweDhkMzM0NjI1KSwgU1RDKDB4OTY4MzA4NzYpLAorICAgIFNUQygweGEyMDFiODUzKSwgU1RDKDB4YWY3MjZkZWYpLCBTVEMoMHhiZThkZjJiYSksIFNUQygweGNmMDQzYWIzKSwKKyAgICBTVEMoMHhlMDdlMGM4NCksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3MjBjODA3NSksCisgICAgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4M2ExYzVjNTcpLAorICAgIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MTQwNjBiNjgpLCBTVEMoMHgwMDAwMDAwMCksIFNUQygweGViZjlmNDk4KSwKKyAgICBTVEMoMHhkODcyMjE5MiksIFNUQygweGM1ZTNhM2E5KSwgU1RDKDB4YjRjMzczZWUpLCBTVEMoMHhhNTdkODY2NiksCisgICAgU1RDKDB4OTg3MjIxOTIpLCBTVEMoMHg4ZGYzN2Y4YiksIFNUQygweDg2NDNjN2IzKSwgU1RDKDB4ODE5MzZkYWYpLAorICAgIFNUQygweDgwMDAwMDAwKSwgU1RDKDB4ODE5MzZkYWYpLCBTVEMoMHg4NjQzYzdiMyksIFNUQygweDhkZjM3ZjhiKSwKKyAgICBTVEMoMHg5ODcyMjE5MiksIFNUQygweGE1N2Q4NjY2KSwgU1RDKDB4YjRjMzczZWUpLCBTVEMoMHhjNWUzYTNhOSksCisgICAgU1RDKDB4ZDg3MjIxOTIpLCBTVEMoMHhlYmY5ZjQ5OCksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4MTQwNjBiNjgpLAorICAgIFNUQygweDdlMjZiMzcxKSwgU1RDKDB4NzhhODc5ZjQpLCBTVEMoMHg2ZmFkZjJmYyksIFNUQygweDYzNzk4NGQ0KSwKKyAgICBTVEMoMHg1NDY1NzE5NCksIFNUQygweDQyZTEzYmE0KSwgU1RDKDB4MmY2ZTZkMTYpLCBTVEMoMHgxYTljZDlhYyksCisgICAgU1RDKDB4MDUwNjc3MzQpLCBTVEMoMHhlZjRhZWFmMSksIFNUQygweGRhMGFlY2Y5KSwgU1RDKDB4YzVlM2EzYTkpLAorICAgIFNUQygweGIzNmExOTc4KSwgU1RDKDB4YTMyNmVlYzApLCBTVEMoMHg5NTkyNjc1YyksIFNUQygweDhiMTBmMTQ0KSwKKyAgICBTVEMoMHg4M2YwM2RkNiksIFNUQygweDgwNjUwMzQ3KSwgU1RDKDB4ODA4OTc2ZDEpLCBTVEMoMHg4NDVjOGFlMyksCisgICAgU1RDKDB4OGJjMWY2ZTgpLCBTVEMoMHg5NjgzMDg3NiksIFNUQygweGE0NTAzN2M5KSwgU1RDKDB4YjRjMzczZWUpLAorICAgIFNUQygweGM3NjMxNThlKSwgU1RDKDB4ZGJhNTYyOWIpLCBTVEMoMHhmMGY0ODhkOSksIFNUQygweDA2YjJmMWQyKSwKKyAgICBTVEMoMHgxYzNmZDA0NSksIFNUQygweDMwZmJjNTRkKSwgU1RDKDB4NDQ0ZDdhZmYpLCBTVEMoMHg3ZGRiNGJmYyksCisgICAgU1RDKDB4Nzc3ZjkwM2MpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NGRlYmU0ZmUpLAorICAgIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4MjQ1YTlkNjUpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweGY1ZjUwZDY3KSwKKyAgICBTVEMoMHhkZWRmMDQ3ZCksIFNUQygweGM4ZTUwMzJiKSwgU1RDKDB4YjRjMzczZWUpLCBTVEMoMHhhMzI2ZWVjMCksCisgICAgU1RDKDB4OTRhNjcxNWQpLCBTVEMoMHg4OWJlNTBjMyksIFNUQygweDgyY2MwZjM2KSwgU1RDKDB4ODAwYjNhOTEpLAorICAgIFNUQygweDgxOTM2ZGFmKSwgU1RDKDB4ODc1Nzg2MGMpLCBTVEMoMHg5MTI2MTQ1ZiksIFNUQygweDllYWIwNDZmKSwKKyAgICBTVEMoMHhhZjcyNmRlZiksIFNUQygweGMyZWM3NjM1KSwgU1RDKDB4ZDg3MjIxOTIpLCBTVEMoMHhlZjRhZWFmMSksCisgICAgU1RDKDB4MDZiMmYxZDIpLCBTVEMoMHgxZGUxODlhNiksIFNUQygweDM0MGZmMjQyKSwgU1RDKDB4NDg3ZmZmZTQpLAorICAgIFNUQygweDVhODI3OTlhKSwgU1RDKDB4Njk3Y2Y3OGEpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfU1RCIFJvdFZlY3RvckltYWc0ODBbXSA9IHsKKyAgICBTVEMoMHgwMWFjZWI3YyksIFNUQygweDAzNTljNDI4KSwgU1RDKDB4MDUwNjc3MzQpLCBTVEMoMHgwNmIyZjFkMiksCisgICAgU1RDKDB4MDg1ZjIxMzcpLCBTVEMoMHgwYTBhZjI5OSksIFNUQygweDBiYjY1MzM2KSwgU1RDKDB4MGQ2MTMwNGUpLAorICAgIFNUQygweDBmMGI3NzI3KSwgU1RDKDB4MTBiNTE1MGYpLCBTVEMoMHgxMjVkZjc1YiksIFNUQygweDE0MDYwYjY4KSwKKyAgICBTVEMoMHgxNWFkM2U5YSksIFNUQygweDE3NTM3ZTYzKSwgU1RDKDB4MThmOGI4M2MpLCBTVEMoMHgxYTljZDlhYyksCisgICAgU1RDKDB4MWMzZmQwNDUpLCBTVEMoMHgxZGUxODlhNiksIFNUQygweDFmODFmMzdjKSwgU1RDKDB4MjEyMGZiODMpLAorICAgIFNUQygweDIyYmU4Zjg3KSwgU1RDKDB4MjQ1YTlkNjUpLCBTVEMoMHgyNWY1MTMwNyksIFNUQygweDI3OGRkZTZlKSwKKyAgICBTVEMoMHgyOTI0ZWRhYyksIFNUQygweDJhYmEyZWU0KSwgU1RDKDB4MmM0ZDkwNTApLCBTVEMoMHgyZGRmMDA0MCksCisgICAgU1RDKDB4MmY2ZTZkMTYpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDMyODZmNzc5KSwgU1RDKDB4MDM1OWM0MjgpLAorICAgIFNUQygweDA2YjJmMWQyKSwgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDEwYjUxNTBmKSwKKyAgICBTVEMoMHgxNDA2MGI2OCksIFNUQygweDE3NTM3ZTYzKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgxZGUxODlhNiksCisgICAgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgyNDVhOWQ2NSksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4MmFiYTJlZTQpLAorICAgIFNUQygweDJkZGYwMDQwKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgzNDBmZjI0MiksIFNUQygweDM3MWFmY2Q1KSwKKyAgICBTVEMoMHgzYTFjNWM1NyksIFNUQygweDNkMTM4OWNiKSwgU1RDKDB4NDAwMDAwMDApLCBTVEMoMHg0MmUxM2JhNCksCisgICAgU1RDKDB4NDViNmJiNWUpLCBTVEMoMHg0ODdmZmZlNCksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NGRlYmU0ZmUpLAorICAgIFNUQygweDUwOGQ5MjExKSwgU1RDKDB4NTMyMTFkMTgpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDU4MWMwMGIzKSwKKyAgICBTVEMoMHg1YTgyNzk5YSksIFNUQygweDVjZDkxMTQwKSwgU1RDKDB4MDUwNjc3MzQpLCBTVEMoMHgwYTBhZjI5OSksCisgICAgU1RDKDB4MGYwYjc3MjcpLCBTVEMoMHgxNDA2MGI2OCksIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4MWRlMTg5YTYpLAorICAgIFNUQygweDIyYmU4Zjg3KSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgyYzRkOTA1MCksIFNUQygweDMwZmJjNTRkKSwKKyAgICBTVEMoMHgzNTk2YTQ2YyksIFNUQygweDNhMWM1YzU3KSwgU1RDKDB4M2U4YjI0MGUpLCBTVEMoMHg0MmUxM2JhNCksCisgICAgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweDRmM2U3ODc1KSwgU1RDKDB4NTMyMTFkMTgpLAorICAgIFNUQygweDU2ZTJmMTVkKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1ZGZlNDdhZCksIFNUQygweDYxNTRmYjkxKSwKKyAgICBTVEMoMHg2NDg1NDNlNCksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NmE2ZDk4YTQpLCBTVEMoMHg2ZDIzNTAxYiksCisgICAgU1RDKDB4NmZhZGYyZmMpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDc0M2UwOTE4KSwgU1RDKDB4NzY0MWFmM2QpLAorICAgIFNUQygweDc4MTZhNzU5KSwgU1RDKDB4MDZiMmYxZDIpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDE0MDYwYjY4KSwKKyAgICBTVEMoMHgxYTljZDlhYyksIFNUQygweDIxMjBmYjgzKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgyZGRmMDA0MCksCisgICAgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHgzYTFjNWM1NyksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NDViNmJiNWUpLAorICAgIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NTA4ZDkyMTEpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDVhODI3OTlhKSwKKyAgICBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDYzNzk4NGQ0KSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2YjU5OGVhMyksCisgICAgU1RDKDB4NmVkOWViYTEpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDc0ZWYwZWJjKSwgU1RDKDB4Nzc3ZjkwM2MpLAorICAgIFNUQygweDc5YmMzODRkKSwgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDdlNmM5MjUxKSwKKyAgICBTVEMoMHg3ZjRjN2U1NCksIFNUQygweDdmZDMxN2I0KSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3ZmQzMTdiNCksCisgICAgU1RDKDB4MDg1ZjIxMzcpLCBTVEMoMHgxMGI1MTUwZiksIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4MjEyMGZiODMpLAorICAgIFNUQygweDI5MjRlZGFjKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgzODljZWE3MiksIFNUQygweDQwMDAwMDAwKSwKKyAgICBTVEMoMHg0NzFjZWNlNyksIFNUQygweDRkZWJlNGZlKSwgU1RDKDB4NTQ2NTcxOTQpLCBTVEMoMHg1YTgyNzk5YSksCisgICAgU1RDKDB4NjAzYzQ5NmMpLCBTVEMoMHg2NThjOWEyZCksIFNUQygweDZhNmQ5OGE0KSwgU1RDKDB4NmVkOWViYTEpLAorICAgIFNUQygweDcyY2NiOWRiKSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3OTM1MDFhOSksIFNUQygweDdiYTM3NTFkKSwKKyAgICBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2ZiOWQ3NTkpLCBTVEMoMHg3ZmZmZmZmZiksCisgICAgU1RDKDB4N2ZiOWQ3NTkpLCBTVEMoMHg3ZWU3YWE0YyksIFNUQygweDdkOGE1ZjQwKSwgU1RDKDB4N2JhMzc1MWQpLAorICAgIFNUQygweDc5MzUwMWE5KSwgU1RDKDB4NzY0MWFmM2QpLCBTVEMoMHg3MmNjYjlkYiksIFNUQygweDBhMGFmMjk5KSwKKyAgICBTVEMoMHgxNDA2MGI2OCksIFNUQygweDFkZTE4OWE2KSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHgzMGZiYzU0ZCksCisgICAgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NTMyMTFkMTgpLAorICAgIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NjE1NGZiOTEpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDZkMjM1MDFiKSwKKyAgICBTVEMoMHg3MjBjODA3NSksIFNUQygweDc2NDFhZjNkKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3Yzc2OWUxOCksCisgICAgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3ZjlhZmNiOSksIFNUQygweDdmZmZmZmZmKSwgU1RDKDB4N2Y5YWZjYjkpLAorICAgIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2M3NjllMTgpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDc2NDFhZjNkKSwKKyAgICBTVEMoMHg3MjBjODA3NSksIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2MTU0ZmI5MSksCisgICAgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1MzIxMWQxOCksIFNUQygweDBiYjY1MzM2KSwgU1RDKDB4MTc1MzdlNjMpLAorICAgIFNUQygweDIyYmU4Zjg3KSwgU1RDKDB4MmRkZjAwNDApLCBTVEMoMHgzODljZWE3MiksIFNUQygweDQyZTEzYmE0KSwKKyAgICBTVEMoMHg0Yzk1ZTY4OCksIFNUQygweDU1YTYxMjVjKSwgU1RDKDB4NWRmZTQ3YWQpLCBTVEMoMHg2NThjOWEyZCksCisgICAgU1RDKDB4NmM0MGNmMmMpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDc2ZTMzYjNmKSwgU1RDKDB4N2FiYTlhZTYpLAorICAgIFNUQygweDdkOGE1ZjQwKSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZmZkMzE1NCksIFNUQygweDdmOWFmY2I5KSwKKyAgICBTVEMoMHg3ZTI2YjM3MSksIFNUQygweDdiYTM3NTFkKSwgU1RDKDB4NzgxNmE3NTkpLCBTVEMoMHg3Mzg3ZWEyMyksCisgICAgU1RDKDB4NmUwMTA3ODApLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDYwM2M0OTZjKSwgU1RDKDB4NTgxYzAwYjMpLAorICAgIFNUQygweDRmM2U3ODc1KSwgU1RDKDB4NDViNmJiNWUpLCBTVEMoMHgzYjk5NDFiMSksIFNUQygweDMwZmJjNTRkKSwKKyAgICBTVEMoMHgyNWY1MTMwNyksIFNUQygweDBkNjEzMDRlKSwgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgyNzhkZGU2ZSksCisgICAgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NTVhNjEyNWMpLAorICAgIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDc0ZWYwZWJjKSwKKyAgICBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDdkMzNmMGNhKSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZmZmZmZmZiksCisgICAgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZDMzZjBjYSksIFNUQygweDc5YmMzODRkKSwgU1RDKDB4NzRlZjBlYmMpLAorICAgIFNUQygweDZlZDllYmExKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg1ZjFmNWVhMSksIFNUQygweDU1YTYxMjVjKSwKKyAgICBTVEMoMHg0YjNjOGMxMiksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4MzQwZmYyNDIpLCBTVEMoMHgyNzhkZGU2ZSksCisgICAgU1RDKDB4MWE5Y2Q5YWMpLCBTVEMoMHgwZDYxMzA0ZSksIFNUQygweDAwMDAwMDAwKSwgU1RDKDB4ZjI5ZWNmYjIpLAorICAgIFNUQygweDBmMGI3NzI3KSwgU1RDKDB4MWRlMTg5YTYpLCBTVEMoMHgyYzRkOTA1MCksIFNUQygweDNhMWM1YzU3KSwKKyAgICBTVEMoMHg0NzFjZWNlNyksIFNUQygweDUzMjExZDE4KSwgU1RDKDB4NWRmZTQ3YWQpLCBTVEMoMHg2NzhkZGU2ZSksCisgICAgU1RDKDB4NmZhZGYyZmMpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDdiMzFiYmIyKSwgU1RDKDB4N2U2YzkyNTEpLAorICAgIFNUQygweDdmZTZiY2IwKSwgU1RDKDB4N2Y5YWZjYjkpLCBTVEMoMHg3ZDhhNWY0MCksIFNUQygweDc5YmMzODRkKSwKKyAgICBTVEMoMHg3NDNlMDkxOCksIFNUQygweDZkMjM1MDFiKSwgU1RDKDB4NjQ4NTQzZTQpLCBTVEMoMHg1YTgyNzk5YSksCisgICAgU1RDKDB4NGYzZTc4NzUpLCBTVEMoMHg0MmUxM2JhNCksIFNUQygweDM1OTZhNDZjKSwgU1RDKDB4Mjc4ZGRlNmUpLAorICAgIFNUQygweDE4ZjhiODNjKSwgU1RDKDB4MGEwYWYyOTkpLCBTVEMoMHhmYWY5ODhjYyksIFNUQygweGViZjlmNDk4KSwKKyAgICBTVEMoMHhkZDQxNzA3OSksIFNUQygweGNmMDQzYWIzKSwgU1RDKDB4YzE3NGRiZjIpLCBTVEMoMHgxMGI1MTUwZiksCisgICAgU1RDKDB4MjEyMGZiODMpLCBTVEMoMHgzMGZiYzU0ZCksIFNUQygweDQwMDAwMDAwKSwgU1RDKDB4NGRlYmU0ZmUpLAorICAgIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NjU4YzlhMmQpLCBTVEMoMHg2ZWQ5ZWJhMSksIFNUQygweDc2NDFhZjNkKSwKKyAgICBTVEMoMHg3YmEzNzUxZCksIFNUQygweDdlZTdhYTRjKSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3ZWU3YWE0YyksCisgICAgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3NjQxYWYzZCksIFNUQygweDZlZDllYmExKSwgU1RDKDB4NjU4YzlhMmQpLAorICAgIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NGRlYmU0ZmUpLCBTVEMoMHg0MDAwMDAwMCksIFNUQygweDMwZmJjNTRkKSwKKyAgICBTVEMoMHgyMTIwZmI4MyksIFNUQygweDEwYjUxNTBmKSwgU1RDKDB4MDAwMDAwMDApLCBTVEMoMHhlZjRhZWFmMSksCisgICAgU1RDKDB4ZGVkZjA0N2QpLCBTVEMoMHhjZjA0M2FiMyksIFNUQygweGMwMDAwMDAwKSwgU1RDKDB4YjIxNDFiMDIpLAorICAgIFNUQygweGE1N2Q4NjY2KSwgU1RDKDB4OWE3MzY1ZDMpLCBTVEMoMHgxMjVkZjc1YiksIFNUQygweDI0NWE5ZDY1KSwKKyAgICBTVEMoMHgzNTk2YTQ2YyksIFNUQygweDQ1YjZiYjVlKSwgU1RDKDB4NTQ2NTcxOTQpLCBTVEMoMHg2MTU0ZmI5MSksCisgICAgU1RDKDB4NmM0MGNmMmMpLCBTVEMoMHg3NGVmMGViYyksIFNUQygweDdiMzFiYmIyKSwgU1RDKDB4N2VlN2FhNGMpLAorICAgIFNUQygweDdmZmQzMTU0KSwgU1RDKDB4N2U2YzkyNTEpLCBTVEMoMHg3YTNlMTdmMiksIFNUQygweDczODdlYTIzKSwKKyAgICBTVEMoMHg2YTZkOThhNCksIFNUQygweDVmMWY1ZWExKSwgU1RDKDB4NTFkOTIzMjEpLCBTVEMoMHg0MmUxM2JhNCksCisgICAgU1RDKDB4MzI4NmY3NzkpLCBTVEMoMHgyMTIwZmI4MyksIFNUQygweDBmMGI3NzI3KSwgU1RDKDB4ZmNhNjNiZDgpLAorICAgIFNUQygweGVhNTJjMTY2KSwgU1RDKDB4ZDg3MjIxOTIpLCBTVEMoMHhjNzYzMTU4ZSksIFNUQygweGI3ODAwMDFjKSwKKyAgICBTVEMoMHhhOTFkMGVhMyksIFNUQygweDljODY3YjJjKSwgU1RDKDB4OTFmZWY4ODApLCBTVEMoMHg4OWJlNTBjMyksCisgICAgU1RDKDB4ODNmMDNkZDYpLCBTVEMoMHgxNDA2MGI2OCksIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4M2ExYzVjNTcpLAorICAgIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg2NzhkZGU2ZSksIFNUQygweDcyMGM4MDc1KSwKKyAgICBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDdlNmM5MjUxKSwgU1RDKDB4N2ZmZmZmZmYpLCBTVEMoMHg3ZTZjOTI1MSksCisgICAgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3MjBjODA3NSksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NWE4Mjc5OWEpLAorICAgIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4M2ExYzVjNTcpLCBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDE0MDYwYjY4KSwKKyAgICBTVEMoMHgwMDAwMDAwMCksIFNUQygweGViZjlmNDk4KSwgU1RDKDB4ZDg3MjIxOTIpLCBTVEMoMHhjNWUzYTNhOSksCisgICAgU1RDKDB4YjRjMzczZWUpLCBTVEMoMHhhNTdkODY2NiksIFNUQygweDk4NzIyMTkyKSwgU1RDKDB4OGRmMzdmOGIpLAorICAgIFNUQygweDg2NDNjN2IzKSwgU1RDKDB4ODE5MzZkYWYpLCBTVEMoMHg4MDAwMDAwMCksIFNUQygweDgxOTM2ZGFmKSwKKyAgICBTVEMoMHgxNWFkM2U5YSksIFNUQygweDJhYmEyZWU0KSwgU1RDKDB4M2U4YjI0MGUpLCBTVEMoMHg1MDhkOTIxMSksCisgICAgU1RDKDB4NjAzYzQ5NmMpLCBTVEMoMHg2ZDIzNTAxYiksIFNUQygweDc2ZTMzYjNmKSwgU1RDKDB4N2QzM2YwY2EpLAorICAgIFNUQygweDdmZTZiY2IwKSwgU1RDKDB4N2VlN2FhNGMpLCBTVEMoMHg3YTNlMTdmMiksIFNUQygweDcyMGM4MDc1KSwKKyAgICBTVEMoMHg2NjhmN2MyNSksIFNUQygweDU4MWMwMGIzKSwgU1RDKDB4NDcxY2VjZTcpLCBTVEMoMHgzNDBmZjI0MiksCisgICAgU1RDKDB4MWY4MWYzN2MpLCBTVEMoMHgwYTBhZjI5OSksIFNUQygweGY0NDlhY2NhKSwgU1RDKDB4ZGVkZjA0N2QpLAorICAgIFNUQygweGNhNjk1Yjk0KSwgU1RDKDB4Yjc4MDAwMWMpLCBTVEMoMHhhNmFlY2Q1ZSksIFNUQygweDk4NzIyMTkyKSwKKyAgICBTVEMoMHg4ZDMzNDYyNSksIFNUQygweDg1NDU2NTFhKSwgU1RDKDB4ODBlMzIxZmYpLCBTVEMoMHg4MDJjZTg0YyksCisgICAgU1RDKDB4ODMyN2ZiOWMpLCBTVEMoMHg4OWJlNTBjMyksIFNUQygweDkzYmYzMGQ0KSwgU1RDKDB4MTc1MzdlNjMpLAorICAgIFNUQygweDJkZGYwMDQwKSwgU1RDKDB4NDJlMTNiYTQpLCBTVEMoMHg1NWE2MTI1YyksIFNUQygweDY1OGM5YTJkKSwKKyAgICBTVEMoMHg3MjBjODA3NSksIFNUQygweDdhYmE5YWU2KSwgU1RDKDB4N2Y0YzdlNTQpLCBTVEMoMHg3ZjlhZmNiOSksCisgICAgU1RDKDB4N2JhMzc1MWQpLCBTVEMoMHg3Mzg3ZWEyMyksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NTgxYzAwYjMpLAorICAgIFNUQygweDQ1YjZiYjVlKSwgU1RDKDB4MzBmYmM1NGQpLCBTVEMoMHgxYTljZDlhYyksIFNUQygweDAzNTljNDI4KSwKKyAgICBTVEMoMHhlYmY5ZjQ5OCksIFNUQygweGQ1NDVkMTFjKSwgU1RDKDB4YzAwMDAwMDApLCBTVEMoMHhhY2RlZTJlOCksCisgICAgU1RDKDB4OWM4NjdiMmMpLCBTVEMoMHg4ZjgyZWJiZCksIFNUQygweDg2NDNjN2IzKSwgU1RDKDB4ODExODU1YjQpLAorICAgIFNUQygweDgwMmNlODRjKSwgU1RDKDB4ODM4OTYxZTgpLCBTVEMoMHg4YjEwZjE0NCksIFNUQygweDk2ODMwODc2KSwKKyAgICBTVEMoMHhhNTdkODY2NiksIFNUQygweGI3ODAwMDFjKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JSZWFsMjBbXSA9IHsKKyAgICBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NGIzYzhjMTIpLCBTVEMoMHg2NzhkZGU2ZSksCisgICAgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHhkODcyMjE5MiksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4ZDg3MjIxOTIpLAorICAgIFNUQygweDg2NDNjN2IzKSwgU1RDKDB4Mjc4ZGRlNmUpLCBTVEMoMHg5ODcyMjE5MiksIFNUQygweDk4NzIyMTkyKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1NUQiBSb3RWZWN0b3JJbWFnMjBbXSA9IHsKKyAgICBTVEMoMHgyNzhkZGU2ZSksIFNUQygweDRiM2M4YzEyKSwgU1RDKDB4Njc4ZGRlNmUpLCBTVEMoMHg0YjNjOGMxMiksCisgICAgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg3OWJjMzg0ZCksIFNUQygweDY3OGRkZTZlKSwgU1RDKDB4NzliYzM4NGQpLAorICAgIFNUQygweDI3OGRkZTZlKSwgU1RDKDB4NzliYzM4NGQpLCBTVEMoMHg0YjNjOGMxMiksIFNUQygweGI0YzM3M2VlKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93OFtdID0geworICAgIFdUQ1AoMHg3ZjYyMzY4ZiwgMHgwYzhiZDM1ZSksCisgICAgV1RDUCgweDdhN2QwNTViLCAweDI1MjgwYzVlKSwKKyAgICBXVENQKDB4NzBlMmNiYzYsIDB4M2M1NmJhNzApLAorICAgIFdUQ1AoMHg2MmYyMDFhYywgMHg1MTMzY2M5NCksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzEyW10gPSB7CisgICAgV1RDUCgweDdmYjlkNzU5LCAweDA4NWYyMTM3KSwgV1RDUCgweDdkOGE1ZjQwLCAweDE4ZjhiODNjKSwKKyAgICBXVENQKDB4NzkzNTAxYTksIDB4MjkyNGVkYWMpLCBXVENQKDB4NzJjY2I5ZGIsIDB4Mzg5Y2VhNzIpLAorICAgIFdUQ1AoMHg2YTZkOThhNCwgMHg0NzFjZWNlNyksIFdUQ1AoMHg2MDNjNDk2YywgMHg1NDY1NzE5NCksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzE2W10gPSB7CisgICAgV1RDUCgweDdmZDg4NzhlLCAweDA2NDdkOTdjKSwgV1RDUCgweDdlOWQ1NWZjLCAweDEyYzgxMDZmKSwKKyAgICBXVENQKDB4N2MyOWZiZWUsIDB4MWYxOWY5N2IpLCBXVENQKDB4Nzg4NDg0MTQsIDB4MmIxZjM0ZWIpLAorICAgIFdUQ1AoMHg3M2I1ZWJkMSwgMHgzNmJhMjAxNCksIFdUQ1AoMHg2ZGNhMGQxNCwgMHg0MWNlMWU2NSksCisgICAgV1RDUCgweDY2Y2Y4MTIwLCAweDRjM2ZkZmY0KSwgV1RDUCgweDVlZDc3YzhhLCAweDU1ZjVhNGQyKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MjBbXSA9IHsKKyAgICBXVENQKDB4N2ZlNmJjYjAsIDB4MDUwNjc3MzQpLCBXVENQKDB4N2YxY2RlMDEsIDB4MGYwYjc3MjcpLAorICAgIFdUQ1AoMHg3ZDhhNWY0MCwgMHgxOGY4YjgzYyksIFdUQ1AoMHg3YjMxYmJiMiwgMHgyMmJlOGY4NyksCisgICAgV1RDUCgweDc4MTZhNzU5LCAweDJjNGQ5MDUwKSwgV1RDUCgweDc0M2UwOTE4LCAweDM1OTZhNDZjKSwKKyAgICBXVENQKDB4NmZhZGYyZmMsIDB4M2U4YjI0MGUpLCBXVENQKDB4NmE2ZDk4YTQsIDB4NDcxY2VjZTcpLAorICAgIFdUQ1AoMHg2NDg1NDNlNCwgMHg0ZjNlNzg3NSksIFdUQ1AoMHg1ZGZlNDdhZCwgMHg1NmUyZjE1ZCksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzI0W10gPSB7CisgICAgV1RDUCgweDdmZWU3NGEyLCAweDA0MzAyMzhmKSwgV1RDUCgweDdmNjIzNjhmLCAweDBjOGJkMzVlKSwKKyAgICBXVENQKDB4N2U0YTU0MjYsIDB4MTRkOWMyNDUpLCBXVENQKDB4N2NhODAwMzgsIDB4MWQxMGQ1YzIpLAorICAgIFdUQ1AoMHg3YTdkMDU1YiwgMHgyNTI4MGM1ZSksIFdUQ1AoMHg3N2NiYzNmMiwgMHgyZDE2ODc5MiksCisgICAgV1RDUCgweDc0OTcyZjkyLCAweDM0ZDM5NTdlKSwgV1RDUCgweDcwZTJjYmM2LCAweDNjNTZiYTcwKSwKKyAgICBXVENQKDB4NmNiMmE4MzcsIDB4NDM5N2JhMzIpLCBXVENQKDB4NjgwYjVjMzMsIDB4NGE4ZWExMTEpLAorICAgIFdUQ1AoMHg2MmYyMDFhYywgMHg1MTMzY2M5NCksIFdUQ1AoMHg1ZDZjMmY5OSwgMHg1NzdmZjNkYSksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzMyW10gPSB7CisgICAgV1RDUCgweDdmZjYyMTgyLCAweDAzMjQyYWJmKSwgV1RDUCgweDdmYTczNmI0LCAweDA5NmE5MDQ5KSwKKyAgICBXVENQKDB4N2YwOTkxYzQsIDB4MGZhYjI3MmIpLCBXVENQKDB4N2UxZDkzZWEsIDB4MTVlMjE0NDUpLAorICAgIFdUQ1AoMHg3Y2UzY2ViMiwgMHgxYzBiODI2YSksIFdUQ1AoMHg3YjVkMDM5ZSwgMHgyMjIzYTRjNSksCisgICAgV1RDUCgweDc5OGEyM2IxLCAweDI4MjZiOTI4KSwgV1RDUCgweDc3NmM0ZWRiLCAweDJlMTEwYTYyKSwKKyAgICBXVENQKDB4NzUwNGQzNDUsIDB4MzNkZWYyODcpLCBXVENQKDB4NzI1NTJjODUsIDB4Mzk4Y2RkMzIpLAorICAgIFdUQ1AoMHg2ZjVmMDJiMiwgMHgzZjE3NDliOCksIFdUQ1AoMHg2YzI0Mjk2MCwgMHg0NDdhY2Q1MCksCisgICAgV1RDUCgweDY4YTY5ZTgxLCAweDQ5YjQxNTMzKSwgV1RDUCgweDY0ZTg4OTI2LCAweDRlYmZlOGE1KSwKKyAgICBXVENQKDB4NjBlYzM4MzAsIDB4NTM5YjJhZjApLCBXVENQKDB4NWNiNDIwZTAsIDB4NTg0MmRkNTQpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3c0MFtdID0geworICAgIFdUQ1AoMHg3ZmY5YWYwNCwgMHgwMjgzNWI1YSksIFdUQ1AoMHg3ZmM3MmFlMiwgMHgwNzg5MTQxOCksCisgICAgV1RDUCgweDdmNjIzNjhmLCAweDBjOGJkMzVlKSwgV1RDUCgweDdlY2FmOWU1LCAweDExODk5ZWQzKSwKKyAgICBXVENQKDB4N2UwMWIwOTYsIDB4MTY4MDdlMTUpLCBXVENQKDB4N2QwNmFhMTYsIDB4MWI2ZTdiN2EpLAorICAgIFdUQ1AoMHg3YmRhNDk3ZCwgMHgyMDUxYTRkZCksIFdUQ1AoMHg3YTdkMDU1YiwgMHgyNTI4MGM1ZSksCisgICAgV1RDUCgweDc4ZWY2NzhmLCAweDI5ZWZjOTI1KSwgV1RDUCgweDc3MzIwZDBkLCAweDJlYTZmODI3KSwKKyAgICBXVENQKDB4NzU0NWE1YTAsIDB4MzM0YmJjZGUpLCBXVENQKDB4NzMyYWYzYTcsIDB4MzdkYzQyMGMpLAorICAgIFdUQ1AoMHg3MGUyY2JjNiwgMHgzYzU2YmE3MCksIFdUQ1AoMHg2ZTZlMTQ5MiwgMHg0MGI5NjE3ZCksCisgICAgV1RDUCgweDZiY2RjNjM5LCAweDQ1MDI3YzBjKSwgV1RDUCgweDY5MDJlYTFkLCAweDQ5MzA1OTBmKSwKKyAgICBXVENQKDB4NjYwZTlhNmEsIDB4NGQ0MTUyMzQpLCBXVENQKDB4NjJmMjAxYWMsIDB4NTEzM2NjOTQpLAorICAgIFdUQ1AoMHg1ZmFlNWE1NSwgMHg1NTA2Mzk1MSksIFdUQ1AoMHg1YzQ0ZWU0MCwgMHg1OGI3MTYzMiksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzQ4W10gPSB7CisgICAgV1RDUCgweDdmZmI5ZDE1LCAweDAyMTgyNDI3KSwgV1RDUCgweDdmZDg4NzhlLCAweDA2NDdkOTdjKSwKKyAgICBXVENQKDB4N2Y5MjY2MWQsIDB4MGE3NWQ2MGUpLCBXVENQKDB4N2YyOTRiZmQsIDB4MGVhMGY0OGMpLAorICAgIFdUQ1AoMHg3ZTlkNTVmYywgMHgxMmM4MTA2ZiksIFdUQ1AoMHg3ZGVlYWE3YSwgMHgxNmVhMDY0NiksCisgICAgV1RDUCgweDdkMWQ3OTU4LCAweDFiMDViNDBmKSwgV1RDUCgweDdjMjlmYmVlLCAweDFmMTlmOTdiKSwKKyAgICBXVENQKDB4N2IxNDc0ZmQsIDB4MjMyNWI4NDcpLCBXVENQKDB4NzlkZDMwOTgsIDB4MjcyN2Q0ODYpLAorICAgIFdUQ1AoMHg3ODg0ODQxNCwgMHgyYjFmMzRlYiksIFdUQ1AoMHg3NzBhY2RlYywgMHgyZjBhYzMyMCksCisgICAgV1RDUCgweDc1NzA3NWFjLCAweDMyZTk2YzA5KSwgV1RDUCgweDczYjVlYmQxLCAweDM2YmEyMDE0KSwKKyAgICBXVENQKDB4NzFkYmE5YWIsIDB4M2E3YmQzODIpLCBXVENQKDB4NmZlMjMxM2MsIDB4M2UyZDdlYjEpLAorICAgIFdUQ1AoMHg2ZGNhMGQxNCwgMHg0MWNlMWU2NSksIFdUQ1AoMHg2YjkzZDAyZSwgMHg0NTVjYjQwYyksCisgICAgV1RDUCgweDY5NDAxNWMzLCAweDQ4ZDg0NjA5KSwgV1RDUCgweDY2Y2Y4MTIwLCAweDRjM2ZkZmY0KSwKKyAgICBXVENQKDB4NjQ0MmJkN2UsIDB4NGY5MjkyZGMpLCBXVENQKDB4NjE5YTdkY2UsIDB4NTJjZjc1OGYpLAorICAgIFdUQ1AoMHg1ZWQ3N2M4YSwgMHg1NWY1YTRkMiksIFdUQ1AoMHg1YmZhN2I4MiwgMHg1OTA0NDNhNyksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzY0W10gPSB7CisgICAgV1RDUCgweDdmZmQ4ODVhLCAweDAxOTIxZDIwKSwgV1RDUCgweDdmZTljYmMwLCAweDA0YjYxOTVkKSwKKyAgICBXVENQKDB4N2ZjMjU1OTYsIDB4MDdkOTViOWUpLCBXVENQKDB4N2Y4NzJiZjMsIDB4MGFmYjY4MDUpLAorICAgIFdUQ1AoMHg3ZjM4NTdmNiwgMHgwZTFiYzJlNCksIFdUQ1AoMHg3ZWQ1ZTVjNiwgMHgxMTM5ZjBjZiksCisgICAgV1RDUCgweDdlNWZlNDkzLCAweDE0NTU3NmIxKSwgV1RDUCgweDdkZDY2NjhmLCAweDE3NmRkOWRlKSwKKyAgICBXVENQKDB4N2QzOTgwZWMsIDB4MWE4MmEwMjYpLCBXVENQKDB4N2M4OTRiZGUsIDB4MWQ5MzRmZTUpLAorICAgIFdUQ1AoMHg3YmM1ZTI5MCwgMHgyMDlmNzAxYyksIFdUQ1AoMHg3YWVmNjMyMywgMHgyM2E2ODg3ZiksCisgICAgV1RDUCgweDdhMDVlZWFkLCAweDI2YTgyMTg2KSwgV1RDUCgweDc5MDlhOTJkLCAweDI5YTNjNDg1KSwKKyAgICBXVENQKDB4NzdmYWI5ODksIDB4MmM5OGZiYmEpLCBXVENQKDB4NzZkOTQ5ODksIDB4MmY4NzUyNjIpLAorICAgIFdUQ1AoMHg3NWE1ODVjZiwgMHgzMjZlNTRjNyksIFdUQ1AoMHg3NDVmOWRkMSwgMHgzNTRkOTA1NyksCisgICAgV1RDUCgweDczMDdjM2QwLCAweDM4MjQ5M2IwKSwgV1RDUCgweDcxOWUyY2QyLCAweDNhZjJlZWI3KSwKKyAgICBXVENQKDB4NzAyMzEwOWEsIDB4M2RiODMyYTYpLCBXVENQKDB4NmU5NmE5OWQsIDB4NDA3M2YyMWQpLAorICAgIFdUQ1AoMHg2Y2Y5MzRmYywgMHg0MzI1YzEzNSksIFdUQ1AoMHg2YjRhZjI3OSwgMHg0NWNkMzU4ZiksCisgICAgV1RDUCgweDY5OGMyNDZjLCAweDQ4NjllNjY1KSwgV1RDUCgweDY3YmQwZmJkLCAweDRhZmI2Yzk4KSwKKyAgICBXVENQKDB4NjVkZGZiZDMsIDB4NGQ4MTYyYzQpLCBXVENQKDB4NjNlZjMyOTAsIDB4NGZmYjY1NGQpLAorICAgIFdUQ1AoMHg2MWYxMDAzZiwgMHg1MjY5MTI2ZSksIFdUQ1AoMHg1ZmUzYjM4ZCwgMHg1NGNhMGE0YiksCisgICAgV1RDUCgweDVkYzc5ZDdjLCAweDU3MWRlZWZhKSwgV1RDUCgweDViOWQxMTU0LCAweDU5NjQ2NDk4KSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93OTZbXSA9IHsKKyAgICBXVENQKDB4N2ZmZWU3NDQsIDB4MDEwYzE0NjApLCBXVENQKDB4N2ZmNjIxODIsIDB4MDMyNDJhYmYpLAorICAgIFdUQ1AoMHg3ZmU0OTY5OCwgMHgwNTNjMGEwMSksIFdUQ1AoMHg3ZmNhNDdiOSwgMHgwNzUzOGQ2YiksCisgICAgV1RDUCgweDdmYTczNmI0LCAweDA5NmE5MDQ5KSwgV1RDUCgweDdmN2I2NWVmLCAweDBiODBlZGYxKSwKKyAgICBXVENQKDB4N2Y0NmQ4NmMsIDB4MGQ5NjgxYzIpLCBXVENQKDB4N2YwOTkxYzQsIDB4MGZhYjI3MmIpLAorICAgIFdUQ1AoMHg3ZWMzOTYyYSwgMHgxMWJlYjlhYSksIFdUQ1AoMHg3ZTc0ZWE2YSwgMHgxM2QxMTRkMCksCisgICAgV1RDUCgweDdlMWQ5M2VhLCAweDE1ZTIxNDQ1KSwgV1RDUCgweDdkYmQ5OGE0LCAweDE3ZjE5M2M1KSwKKyAgICBXVENQKDB4N2Q1NGZmMmUsIDB4MTlmZjZmMmEpLCBXVENQKDB4N2NlM2NlYjIsIDB4MWMwYjgyNmEpLAorICAgIFdUQ1AoMHg3YzZhMGVmMiwgMHgxZTE1YTk5YSksIFdUQ1AoMHg3YmU3Yzg0NywgMHgyMDFkYzBlZiksCisgICAgV1RDUCgweDdiNWQwMzllLCAweDIyMjNhNGM1KSwgV1RDUCgweDdhYzljYTdhLCAweDI0MjczMTlkKSwKKyAgICBXVENQKDB4N2EyZTI2ZjIsIDB4MjYyODQ0MjIpLCBXVENQKDB4Nzk4YTIzYjEsIDB4MjgyNmI5MjgpLAorICAgIFdUQ1AoMHg3OGRkY2JmNSwgMHgyYTIyNmRiNSksIFdUQ1AoMHg3ODI5MmI4ZCwgMHgyYzFiM2VmYiksCisgICAgV1RDUCgweDc3NmM0ZWRiLCAweDJlMTEwYTYyKSwgV1RDUCgweDc2YTc0MmQxLCAweDMwMDNhZDg1KSwKKyAgICBXVENQKDB4NzVkYTE0ZWYsIDB4MzFmMzA2MzgpLCBXVENQKDB4NzUwNGQzNDUsIDB4MzNkZWYyODcpLAorICAgIFdUQ1AoMHg3NDI3OGM3MiwgMHgzNWM3NTBiYyksIFdUQ1AoMHg3MzQyNGZhMCwgMHgzN2FiZmY1ZCksCisgICAgV1RDUCgweDcyNTUyYzg1LCAweDM5OGNkZDMyKSwgV1RDUCgweDcxNjAzMzYxLCAweDNiNjljOTQ3KSwKKyAgICBXVENQKDB4NzA2Mzc0ZmYsIDB4M2Q0MmEyZWMpLCBXVENQKDB4NmY1ZjAyYjIsIDB4M2YxNzQ5YjgpLAorICAgIFdUQ1AoMHg2ZTUyZWU1MiwgMHg0MGU3OWQ4YyksIFdUQ1AoMHg2ZDNmNGE0MCwgMHg0MmIzN2U5NiksCisgICAgV1RDUCgweDZjMjQyOTYwLCAweDQ0N2FjZDUwKSwgV1RDUCgweDZiMDE5ZjFhLCAweDQ2M2Q2YTg3KSwKKyAgICBXVENQKDB4NjlkN2JmNTcsIDB4NDdmYjM3NTcpLCBXVENQKDB4NjhhNjllODEsIDB4NDliNDE1MzMpLAorICAgIFdUQ1AoMHg2NzZlNTE4MywgMHg0YjY3ZTVlNCksIFdUQ1AoMHg2NjJlZWRjMywgMHg0ZDE2OGI4YiksCisgICAgV1RDUCgweDY0ZTg4OTI2LCAweDRlYmZlOGE1KSwgV1RDUCgweDYzOWIzYTBiLCAweDUwNjNlMDA4KSwKKyAgICBXVENQKDB4NjI0NzE3NDksIDB4NTIwMjU0ZWYpLCBXVENQKDB4NjBlYzM4MzAsIDB4NTM5YjJhZjApLAorICAgIFdUQ1AoMHg1ZjhhYjQ4NywgMHg1NTJlNDYwNSksIFdUQ1AoMHg1ZTIyYTQ4NywgMHg1NmJiOGE5MCksCisgICAgV1RDUCgweDVjYjQyMGUwLCAweDU4NDJkZDU0KSwgV1RDUCgweDViM2Y0MmFlLCAweDU5YzQyMzgxKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MTIwW10gPSB7CisgICAgV1RDUCgweDdmZmY0YzU0LCAweDAwZDY3NmViKSwgV1RDUCgweDdmZjlhZjA0LCAweDAyODM1YjVhKSwKKyAgICBXVENQKDB4N2ZlZTc0YTIsIDB4MDQzMDIzOGYpLCBXVENQKDB4N2ZkZDlkYWQsIDB4MDVkY2JjYmUpLAorICAgIFdUQ1AoMHg3ZmM3MmFlMiwgMHgwNzg5MTQxOCksIFdUQ1AoMHg3ZmFiMWQzZCwgMHgwOTM1MTZkNCksCisgICAgV1RDUCgweDdmODk3NWY5LCAweDBhZTBiMjJjKSwgV1RDUCgweDdmNjIzNjhmLCAweDBjOGJkMzVlKSwKKyAgICBXVENQKDB4N2YzNTYwYjksIDB4MGUzNjY3YWQpLCBXVENQKDB4N2YwMmY2NmYsIDB4MGZlMDVjNjQpLAorICAgIFdUQ1AoMHg3ZWNhZjllNSwgMHgxMTg5OWVkMyksIFdUQ1AoMHg3ZThkNmQ5MSwgMHgxMzMyMWM1MyksCisgICAgV1RDUCgweDdlNGE1NDI2LCAweDE0ZDljMjQ1KSwgV1RDUCgweDdlMDFiMDk2LCAweDE2ODA3ZTE1KSwKKyAgICBXVENQKDB4N2RiMzg2MGYsIDB4MTgyNjNkMzYpLCBXVENQKDB4N2Q1ZmQ4MDEsIDB4MTljYWVkMjkpLAorICAgIFdUQ1AoMHg3ZDA2YWExNiwgMHgxYjZlN2I3YSksIFdUQ1AoMHg3Y2E4MDAzOCwgMHgxZDEwZDVjMiksCisgICAgV1RDUCgweDdjNDNkZThlLCAweDFlYjFlOWE3KSwgV1RDUCgweDdiZGE0OTdkLCAweDIwNTFhNGRkKSwKKyAgICBXVENQKDB4N2I2YjQ1YTUsIDB4MjFlZmY1MjgpLCBXVENQKDB4N2FmNmQ3ZTYsIDB4MjM4Y2M4NWQpLAorICAgIFdUQ1AoMHg3YTdkMDU1YiwgMHgyNTI4MGM1ZSksIFdUQ1AoMHg3OWZkZDM1YywgMHgyNmMxYWYyMiksCisgICAgV1RDUCgweDc5Nzk0NzdkLCAweDI4NTk5ZWIwKSwgV1RDUCgweDc4ZWY2NzhmLCAweDI5ZWZjOTI1KSwKKyAgICBXVENQKDB4Nzg2MDM5OWUsIDB4MmI4NDFjYWYpLCBXVENQKDB4NzdjYmMzZjIsIDB4MmQxNjg3OTIpLAorICAgIFdUQ1AoMHg3NzMyMGQwZCwgMHgyZWE2ZjgyNyksIFdUQ1AoMHg3NjkzMWJhZSwgMHgzMDM1NWNkZCksCisgICAgV1RDUCgweDc1ZWVmNmNlLCAweDMxYzFhNDNiKSwgV1RDUCgweDc1NDVhNWEwLCAweDMzNGJiY2RlKSwKKyAgICBXVENQKDB4NzQ5NzJmOTIsIDB4MzRkMzk1N2UpLCBXVENQKDB4NzNlMzljNDksIDB4MzY1OTFjZWEpLAorICAgIFdUQ1AoMHg3MzJhZjNhNywgMHgzN2RjNDIwYyksIFdUQ1AoMHg3MjZkM2RjNiwgMHgzOTVjZjNlOSksCisgICAgV1RDUCgweDcxYWE4MmY3LCAweDNhZGIyMWExKSwgV1RDUCgweDcwZTJjYmM2LCAweDNjNTZiYTcwKSwKKyAgICBXVENQKDB4NzAxNjIwZjUsIDB4M2RjZmFkYjApLCBXVENQKDB4NmY0NDhiN2UsIDB4M2Y0NWVhZDgpLAorICAgIFdUQ1AoMHg2ZTZlMTQ5MiwgMHg0MGI5NjE3ZCksIFdUQ1AoMHg2ZDkyYzU5YiwgMHg0MjJhMDE1NCksCisgICAgV1RDUCgweDZjYjJhODM3LCAweDQzOTdiYTMyKSwgV1RDUCgweDZiY2RjNjM5LCAweDQ1MDI3YzBjKSwKKyAgICBXVENQKDB4NmFlNDI5YWUsIDB4NDY2YTM2ZjkpLCBXVENQKDB4NjlmNWRjZDMsIDB4NDdjZWRiMzEpLAorICAgIFdUQ1AoMHg2OTAyZWExZCwgMHg0OTMwNTkwZiksIFdUQ1AoMHg2ODBiNWMzMywgMHg0YThlYTExMSksCisgICAgV1RDUCgweDY3MGYzZGYzLCAweDRiZTlhM2RiKSwgV1RDUCgweDY2MGU5YTZhLCAweDRkNDE1MjM0KSwKKyAgICBXVENQKDB4NjUwOTdjZGIsIDB4NGU5NTlkMDgpLCBXVENQKDB4NjNmZmYwYmEsIDB4NGZlNjc1NmEpLAorICAgIFdUQ1AoMHg2MmYyMDFhYywgMHg1MTMzY2M5NCksIFdUQ1AoMHg2MWRmYmI4YSwgMHg1MjdkOTNlNiksCisgICAgV1RDUCgweDYwYzkyYTVhLCAweDUzYzNiY2VhKSwgV1RDUCgweDVmYWU1YTU1LCAweDU1MDYzOTUxKSwKKyAgICBXVENQKDB4NWU4ZjU3ZTIsIDB4NTY0NGZhZjQpLCBXVENQKDB4NWQ2YzJmOTksIDB4NTc3ZmYzZGEpLAorICAgIFdUQ1AoMHg1YzQ0ZWU0MCwgMHg1OGI3MTYzMiksIFdUQ1AoMHg1YjE5YTBjOCwgMHg1OWVhNTQ1NCksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzEyOFtdID0geworICAgIFdUQ1AoMHg3ZmZmNjIxNiwgMHgwMGM5MGY4OCksIFdUQ1AoMHg3ZmZhNzJkMSwgMHgwMjViMjZkNyksCisgICAgV1RDUCgweDdmZjA5NDc4LCAweDAzZWQyNmU2KSwgV1RDUCgweDdmZTFjNzZiLCAweDA1N2YwMDM1KSwKKyAgICBXVENQKDB4N2ZjZTBjM2UsIDB4MDcxMGEzNDUpLCBXVENQKDB4N2ZiNTYzYjMsIDB4MDhhMjAwOWEpLAorICAgIFdUQ1AoMHg3Zjk3Y2ViZCwgMHgwYTMzMDhiZCksIFdUQ1AoMHg3Zjc1NGU4MCwgMHgwYmMzYWMzNSksCisgICAgV1RDUCgweDdmNGRlNDUxLCAweDBkNTNkYjkyKSwgV1RDUCgweDdmMjE5MWI0LCAweDBlZTM4NzY2KSwKKyAgICBXVENQKDB4N2VmMDU4NjAsIDB4MTA3MmEwNDgpLCBXVENQKDB4N2ViYTNhMzksIDB4MTIwMTE2ZDUpLAorICAgIFdUQ1AoMHg3ZTdmMzk1NywgMHgxMzhlZGJiMSksIFdUQ1AoMHg3ZTNmNTdmZiwgMHgxNTFiZGY4NiksCisgICAgV1RDUCgweDdkZmE5OGE4LCAweDE2YTgxMzA1KSwgV1RDUCgweDdkYjBmZGY4LCAweDE4MzM2NmU5KSwKKyAgICBXVENQKDB4N2Q2MjhhYzYsIDB4MTliZGNiZjMpLCBXVENQKDB4N2QwZjQyMTgsIDB4MWI0NzMyZWYpLAorICAgIFdUQ1AoMHg3Y2I3MjcyNCwgMHgxY2NmOGNiMyksIFdUQ1AoMHg3YzVhM2Q1MCwgMHgxZTU2Y2ExZSksCisgICAgV1RDUCgweDdiZjg4ODMwLCAweDFmZGNkYzFiKSwgV1RDUCgweDdiOTIwYjg5LCAweDIxNjFiM2EwKSwKKyAgICBXVENQKDB4N2IyNmNiNGYsIDB4MjJlNTQxYWYpLCBXVENQKDB4N2FiNmNiYTQsIDB4MjQ2Nzc3NTgpLAorICAgIFdUQ1AoMHg3YTQyMTBkOCwgMHgyNWU4NDViNiksIFdUQ1AoMHg3OWM4OWY2ZSwgMHgyNzY3OWRmNCksCisgICAgV1RDUCgweDc5NGE3YzEyLCAweDI4ZTU3MTRiKSwgV1RDUCgweDc4YzdhYmEyLCAweDJhNjFiMTAxKSwKKyAgICBXVENQKDB4Nzg0MDMzMjksIDB4MmJkYzRlNmYpLCBXVENQKDB4NzdiNDE3ZGYsIDB4MmQ1NTNhZmMpLAorICAgIFdUQ1AoMHg3NzIzNWYyZCwgMHgyZWNjNjgxZSksIFdUQ1AoMHg3NjhlMGVhNiwgMHgzMDQxYzc2MSksCisgICAgV1RDUCgweDc1ZjQyYzBiLCAweDMxYjU0YTVlKSwgV1RDUCgweDc1NTViZDRjLCAweDMzMjZlMmMzKSwKKyAgICBXVENQKDB4NzRiMmM4ODQsIDB4MzQ5NjgyNTApLCBXVENQKDB4NzQwYjUzZmIsIDB4MzYwNDFhZDkpLAorICAgIFdUQ1AoMHg3MzVmNjYyNiwgMHgzNzZmOWU0NiksIFdUQ1AoMHg3MmFmMDVhNywgMHgzOGQ4ZmU5MyksCisgICAgV1RDUCgweDcxZmEzOTQ5LCAweDNhNDAyZGQyKSwgV1RDUCgweDcxNDEwODA1LCAweDNiYTUxZTI5KSwKKyAgICBXVENQKDB4NzA4Mzc4ZmYsIDB4M2QwN2MxZDYpLCBXVENQKDB4NmZjMTkzODUsIDB4M2U2ODBiMmMpLAorICAgIFdUQ1AoMHg2ZWZiNWYxMiwgMHgzZmM1ZWM5OCksIFdUQ1AoMHg2ZTMwZTM0YSwgMHg0MTIxNTg5YiksCisgICAgV1RDUCgweDZkNjIyN2ZhLCAweDQyN2E0MWQwKSwgV1RDUCgweDZjOGYzNTFjLCAweDQzZDA5YWVkKSwKKyAgICBXVENQKDB4NmJiODEyZDEsIDB4NDUyNDU2YmQpLCBXVENQKDB4NmFkY2M5NjQsIDB4NDY3NTY4MjgpLAorICAgIFdUQ1AoMHg2OWZkNjE0YSwgMHg0N2MzYzIyZiksIFdUQ1AoMHg2OTE5ZTMyMCwgMHg0OTBmNTdlZSksCisgICAgV1RDUCgweDY4MzI1N2FiLCAweDRhNTgxYzllKSwgV1RDUCgweDY3NDZjN2Q4LCAweDRiOWUwMzkwKSwKKyAgICBXVENQKDB4NjY1NzNjYmIsIDB4NGNlMTAwMzQpLCBXVENQKDB4NjU2M2JmOTIsIDB4NGUyMTA2MTcpLAorICAgIFdUQ1AoMHg2NDZjNTliZiwgMHg0ZjVlMDhlMyksIFdUQ1AoMHg2MzcxMTRjYywgMHg1MDk3ZmM1ZSksCisgICAgV1RDUCgweDYyNzFmYTY5LCAweDUxY2VkNDZlKSwgV1RDUCgweDYxNmYxNDZjLCAweDUzMDI4NTE4KSwKKyAgICBXVENQKDB4NjA2ODZjY2YsIDB4NTQzMzAyN2QpLCBXVENQKDB4NWY1ZTBkYjMsIDB4NTU2MDQwZTIpLAorICAgIFdUQ1AoMHg1ZTUwMDE1ZCwgMHg1NjhhMzRhOSksIFdUQ1AoMHg1ZDNlNTIzNywgMHg1N2IwZDI1NiksCisgICAgV1RDUCgweDVjMjkwYWNjLCAweDU4ZDQwZThjKSwgV1RDUCgweDViMTAzNWNmLCAweDU5ZjNkZTEyKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MTYwW10gPSB7CisgICAgV1RDUCgweDdmZmY5YWVmLCAweDAwYTBkOTUxKSwgV1RDUCgweDdmZmM3MjZmLCAweDAxZTI4N2ZjKSwKKyAgICBXVENQKDB4N2ZmNjIxODIsIDB4MDMyNDJhYmYpLCBXVENQKDB4N2ZlY2E4NTEsIDB4MDQ2NWI5YWEpLAorICAgIFdUQ1AoMHg3ZmUwMDcxNiwgMHgwNWE3MmNjZiksIFdUQ1AoMHg3ZmQwM2UyMywgMHgwNmU4N2MzZiksCisgICAgV1RDUCgweDdmYmQ0ZGRhLCAweDA4MjlhMDBjKSwgV1RDUCgweDdmYTczNmI0LCAweDA5NmE5MDQ5KSwKKyAgICBXVENQKDB4N2Y4ZGY5M2MsIDB4MGFhYjQ1MGQpLCBXVENQKDB4N2Y3MTk2MTEsIDB4MGJlYmI2NmMpLAorICAgIFdUQ1AoMHg3ZjUyMGRlNiwgMHgwZDJiZGM4MCksIFdUQ1AoMHg3ZjJmNjE4MywgMHgwZTZiYWY2MSksCisgICAgV1RDUCgweDdmMDk5MWM0LCAweDBmYWIyNzJiKSwgV1RDUCgweDdlZTA5Zjk1LCAweDEwZWEzYmZkKSwKKyAgICBXVENQKDB4N2ViNDhiZmIsIDB4MTIyOGU1ZjgpLCBXVENQKDB4N2U4NTU4MGMsIDB4MTM2NzFkM2QpLAorICAgIFdUQ1AoMHg3ZTUzMDRmMiwgMHgxNGE0ZDlmNCksIFdUQ1AoMHg3ZTFkOTNlYSwgMHgxNWUyMTQ0NSksCisgICAgV1RDUCgweDdkZTUwNjQ2LCAweDE3MWVjNDVjKSwgV1RDUCgweDdkYTk1ZDZjLCAweDE4NWFlMjY5KSwKKyAgICBXVENQKDB4N2Q2YTlhZDUsIDB4MTk5NjY2YTApLCBXVENQKDB4N2QyOGMwMGMsIDB4MWFkMTQ5MzgpLAorICAgIFdUQ1AoMHg3Y2UzY2ViMiwgMHgxYzBiODI2YSksIFdUQ1AoMHg3YzliYzg3YSwgMHgxZDQ1MGE3OCksCisgICAgV1RDUCgweDdjNTBhZjJiLCAweDFlN2RkOWE0KSwgV1RDUCgweDdjMDI4NDlmLCAweDFmYjVlODM2KSwKKyAgICBXVENQKDB4N2JiMTRhYzUsIDB4MjBlZDJlN2IpLCBXVENQKDB4N2I1ZDAzOWUsIDB4MjIyM2E0YzUpLAorICAgIFdUQ1AoMHg3YjA1YjEzZCwgMHgyMzU5NDM2YyksIFdUQ1AoMHg3YWFiNTVjYSwgMHgyNDhlMDJjYiksCisgICAgV1RDUCgweDdhNGRmMzgwLCAweDI1YzFkYjQ0KSwgV1RDUCgweDc5ZWQ4Y2FkLCAweDI2ZjRjNTNlKSwKKyAgICBXVENQKDB4Nzk4YTIzYjEsIDB4MjgyNmI5MjgpLCBXVENQKDB4NzkyM2JiMDEsIDB4Mjk1N2FmNzQpLAorICAgIFdUQ1AoMHg3OGJhNTUyNCwgMHgyYTg3YTA5ZCksIFdUQ1AoMHg3ODRkZjRiMywgMHgyYmI2ODUyMiksCisgICAgV1RDUCgweDc3ZGU5YzViLCAweDJjZTQ1NTg5KSwgV1RDUCgweDc3NmM0ZWRiLCAweDJlMTEwYTYyKSwKKyAgICBXVENQKDB4NzZmNzBmMDUsIDB4MmYzYzljNDApLCBXVENQKDB4NzY3ZWRmYmUsIDB4MzA2NzAzYmYpLAorICAgIFdUQ1AoMHg3NjAzYzNmZCwgMHgzMTkwMzk4MiksIFdUQ1AoMHg3NTg1YmVjYiwgMHgzMmI4MzYzNCksCisgICAgV1RDUCgweDc1MDRkMzQ1LCAweDMzZGVmMjg3KSwgV1RDUCgweDc0ODEwNDk5LCAweDM1MDQ2NzM2KSwKKyAgICBXVENQKDB4NzNmYTU2MDcsIDB4MzYyODhkMDMpLCBXVENQKDB4NzM3MGNhZTIsIDB4Mzc0YjVjYjkpLAorICAgIFdUQ1AoMHg3MmU0NjY4ZiwgMHgzODZjY2YyYSksIFdUQ1AoMHg3MjU1MmM4NSwgMHgzOThjZGQzMiksCisgICAgV1RDUCgweDcxYzMyMDRjLCAweDNhYWI3ZmI3KSwgV1RDUCgweDcxMmU0NTdmLCAweDNiYzhhZmE1KSwKKyAgICBXVENQKDB4NzA5NjlmY2EsIDB4M2NlNDY1ZjMpLCBXVENQKDB4NmZmYzMyZWIsIDB4M2RmZTliYTEpLAorICAgIFdUQ1AoMHg2ZjVmMDJiMiwgMHgzZjE3NDliOCksIFdUQ1AoMHg2ZWJmMTJmZiwgMHg0MDJlNjk0YyksCisgICAgV1RDUCgweDZlMWM2N2M0LCAweDQxNDNmMzc5KSwgV1RDUCgweDZkNzcwNTA2LCAweDQyNTdlMTY2KSwKKyAgICBXVENQKDB4NmNjZWVlZDgsIDB4NDM2YTJjNDUpLCBXVENQKDB4NmMyNDI5NjAsIDB4NDQ3YWNkNTApLAorICAgIFdUQ1AoMHg2Yjc2YjhkNiwgMHg0NTg5YmRjZiksIFdUQ1AoMHg2YWM2YTE4MCwgMHg0Njk2ZjcxMCksCisgICAgV1RDUCgweDZhMTNlN2I4LCAweDQ3YTI3MjcxKSwgV1RDUCgweDY5NWU4ZmU1LCAweDQ4YWMyOTU3KSwKKyAgICBXVENQKDB4NjhhNjllODEsIDB4NDliNDE1MzMpLCBXVENQKDB4NjdlYzE4MTcsIDB4NGFiYTJmODQpLAorICAgIFdUQ1AoMHg2NzJmMDEzZiwgMHg0YmJlNzFkMSksIFdUQ1AoMHg2NjZmNWVhNiwgMHg0Y2MwZDVhZSksCisgICAgV1RDUCgweDY1YWQzNTA1LCAweDRkYzE1NGJiKSwgV1RDUCgweDY0ZTg4OTI2LCAweDRlYmZlOGE1KSwKKyAgICBXVENQKDB4NjQyMTVmZTUsIDB4NGZiYzhiMjIpLCBXVENQKDB4NjM1N2JlMmEsIDB4NTBiNzM1ZjgpLAorICAgIFdUQ1AoMHg2MjhiYThlZiwgMHg1MWFmZTJmNiksIFdUQ1AoMHg2MWJkMjUzZiwgMHg1MmE2OGJmYiksCisgICAgV1RDUCgweDYwZWMzODMwLCAweDUzOWIyYWYwKSwgV1RDUCgweDYwMThlNmViLCAweDU0OGRiOWNiKSwKKyAgICBXVENQKDB4NWY0MzM2YTcsIDB4NTU3ZTMyOTIpLCBXVENQKDB4NWU2YjJjYTgsIDB4NTY2YzhmNTUpLAorICAgIFdUQ1AoMHg1ZDkwY2U0NSwgMHg1NzU4Y2EzMSksIFdUQ1AoMHg1Y2I0MjBlMCwgMHg1ODQyZGQ1NCksCisgICAgV1RDUCgweDViZDUyOWViLCAweDU5MmFjMmY3KSwgV1RDUCgweDVhZjNlZWU2LCAweDVhMTA3NTYxKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MTkyW10gPSB7CisgICAgV1RDUCgweDdmZmZiOWQxLCAweDAwODYwYTc5KSwgV1RDUCgweDdmZmQ4ODVhLCAweDAxOTIxZDIwKSwKKyAgICBXVENQKDB4N2ZmOTI1NzcsIDB4MDI5ZTI4ZTIpLCBXVENQKDB4N2ZmMjkxM2EsIDB4MDNhYTI5MmEpLAorICAgIFdUQ1AoMHg3ZmU5Y2JjMCwgMHgwNGI2MTk1ZCksIFdUQ1AoMHg3ZmRlZDUzMCwgMHgwNWMxZjRlNyksCisgICAgV1RDUCgweDdmZDFhZGI5LCAweDA2Y2RiNzJmKSwgV1RDUCgweDdmYzI1NTk2LCAweDA3ZDk1YjllKSwKKyAgICBXVENQKDB4N2ZiMGNkMGEsIDB4MDhlNGRkYTApLCBXVENQKDB4N2Y5ZDE0NjEsIDB4MDlmMDM4OWYpLAorICAgIFdUQ1AoMHg3Zjg3MmJmMywgMHgwYWZiNjgwNSksIFdUQ1AoMHg3ZjZmMTQxZiwgMHgwYzA2Njc0MCksCisgICAgV1RDUCgweDdmNTRjZDRmLCAweDBkMTEzMWJhKSwgV1RDUCgweDdmMzg1N2Y2LCAweDBlMWJjMmU0KSwKKyAgICBXVENQKDB4N2YxOWI0OTEsIDB4MGYyNjE2MmEpLCBXVENQKDB4N2VmOGUzYTYsIDB4MTAzMDI2ZmUpLAorICAgIFdUQ1AoMHg3ZWQ1ZTVjNiwgMHgxMTM5ZjBjZiksIFdUQ1AoMHg3ZWIwYmI4YSwgMHgxMjQzNmYxMCksCisgICAgV1RDUCgweDdlODk2NTk1LCAweDEzNGM5ZDM0KSwgV1RDUCgweDdlNWZlNDkzLCAweDE0NTU3NmIxKSwKKyAgICBXVENQKDB4N2UzNDM5M2IsIDB4MTU1ZGY2ZmMpLCBXVENQKDB4N2UwNjY0NGMsIDB4MTY2NjE5OGQpLAorICAgIFdUQ1AoMHg3ZGQ2NjY4ZiwgMHgxNzZkZDlkZSksIFdUQ1AoMHg3ZGE0NDBkNiwgMHgxODc1MzM2YSksCisgICAgV1RDUCgweDdkNmZmM2ZlLCAweDE5N2MyMWFkKSwgV1RDUCgweDdkMzk4MGVjLCAweDFhODJhMDI2KSwKKyAgICBXVENQKDB4N2QwMGU4OGYsIDB4MWI4OGFhNTUpLCBXVENQKDB4N2NjNjJiZGYsIDB4MWM4ZTNiYmUpLAorICAgIFdUQ1AoMHg3Yzg5NGJkZSwgMHgxZDkzNGZlNSksIFdUQ1AoMHg3YzRhNDk5NiwgMHgxZTk3ZTI1MSksCisgICAgV1RDUCgweDdjMDkyNjFkLCAweDFmOWJlZThhKSwgV1RDUCgweDdiYzVlMjkwLCAweDIwOWY3MDFjKSwKKyAgICBXVENQKDB4N2I4MDgwMTUsIDB4MjFhMjYyOTUpLCBXVENQKDB4N2IzOGZmZGUsIDB4MjJhNGMxODUpLAorICAgIFdUQ1AoMHg3YWVmNjMyMywgMHgyM2E2ODg3ZiksIFdUQ1AoMHg3YWEzYWIyOSwgMHgyNGE3YjMxNyksCisgICAgV1RDUCgweDdhNTVkOTNhLCAweDI1YTgzY2U2KSwgV1RDUCgweDdhMDVlZWFkLCAweDI2YTgyMTg2KSwKKyAgICBXVENQKDB4NzliM2VjZTAsIDB4MjdhNzVjOTUpLCBXVENQKDB4Nzk1ZmQ1M2EsIDB4MjhhNWU5YjQpLAorICAgIFdUQ1AoMHg3OTA5YTkyZCwgMHgyOWEzYzQ4NSksIFdUQ1AoMHg3OGIxNmEzMiwgMHgyYWEwZThiMCksCisgICAgV1RDUCgweDc4NTcxOWNjLCAweDJiOWQ1MWRkKSwgV1RDUCgweDc3ZmFiOTg5LCAweDJjOThmYmJhKSwKKyAgICBXVENQKDB4Nzc5YzRhZmMsIDB4MmQ5M2UxZjgpLCBXVENQKDB4NzczYmNmYzQsIDB4MmU4ZTAwNDgpLAorICAgIFdUQ1AoMHg3NmQ5NDk4OSwgMHgyZjg3NTI2MiksIFdUQ1AoMHg3Njc0YjlmYSwgMHgzMDdmZDQwMSksCisgICAgV1RDUCgweDc2MGUyMmQxLCAweDMxNzc4MGUyKSwgV1RDUCgweDc1YTU4NWNmLCAweDMyNmU1NGM3KSwKKyAgICBXVENQKDB4NzUzYWU0YzAsIDB4MzM2NDRiNzYpLCBXVENQKDB4NzRjZTQxNzcsIDB4MzQ1OTYwYjcpLAorICAgIFdUQ1AoMHg3NDVmOWRkMSwgMHgzNTRkOTA1NyksIFdUQ1AoMHg3M2VlZmJiMywgMHgzNjQwZDYyNyksCisgICAgV1RDUCgweDczN2M1ZDBiLCAweDM3MzMyZGZkKSwgV1RDUCgweDczMDdjM2QwLCAweDM4MjQ5M2IwKSwKKyAgICBXVENQKDB4NzI5MTMyMDEsIDB4MzkxNTAzMWYpLCBXVENQKDB4NzIxOGE5YTcsIDB4M2EwNDc4MmEpLAorICAgIFdUQ1AoMHg3MTllMmNkMiwgMHgzYWYyZWViNyksIFdUQ1AoMHg3MTIxYmQ5YywgMHgzYmUwNjJiMCksCisgICAgV1RDUCgweDcwYTM1ZTI1LCAweDNjY2NkMDA0KSwgV1RDUCgweDcwMjMxMDlhLCAweDNkYjgzMmE2KSwKKyAgICBXVENQKDB4NmZhMGQ3MmMsIDB4M2VhMjg2OGMpLCBXVENQKDB4NmYxY2I0MTYsIDB4M2Y4YmM3YjQpLAorICAgIFdUQ1AoMHg2ZTk2YTk5ZCwgMHg0MDczZjIxZCksIFdUQ1AoMHg2ZTBlYmEwYywgMHg0MTViMDFjZSksCisgICAgV1RDUCgweDZkODRlN2I3LCAweDQyNDBmMmQxKSwgV1RDUCgweDZjZjkzNGZjLCAweDQzMjVjMTM1KSwKKyAgICBXVENQKDB4NmM2YmE0M2UsIDB4NDQwOTY5MTApLCBXVENQKDB4NmJkYzM3ZWIsIDB4NDRlYmU2NzkpLAorICAgIFdUQ1AoMHg2YjRhZjI3OSwgMHg0NWNkMzU4ZiksIFdUQ1AoMHg2YWI3ZDY2MywgMHg0NmFkNTI3OCksCisgICAgV1RDUCgweDZhMjJlNjMwLCAweDQ3OGMzOTVhKSwgV1RDUCgweDY5OGMyNDZjLCAweDQ4NjllNjY1KSwKKyAgICBXVENQKDB4NjhmMzkzYWUsIDB4NDk0NjU1Y2MpLCBXVENQKDB4Njg1OTM2OTEsIDB4NGEyMTgzYzgpLAorICAgIFdUQ1AoMHg2N2JkMGZiZCwgMHg0YWZiNmM5OCksIFdUQ1AoMHg2NzFmMjFkYywgMHg0YmQ0MGM4MCksCisgICAgV1RDUCgweDY2N2Y2ZmE1LCAweDRjYWI1ZmM5KSwgV1RDUCgweDY1ZGRmYmQzLCAweDRkODE2MmM0KSwKKyAgICBXVENQKDB4NjUzYWM5MmIsIDB4NGU1NjExYzUpLCBXVENQKDB4NjQ5NWRhNzksIDB4NGYyOTY5MjgpLAorICAgIFdUQ1AoMHg2M2VmMzI5MCwgMHg0ZmZiNjU0ZCksIFdUQ1AoMHg2MzQ2ZDQ0YiwgMHg1MGNjMDI5YyksCisgICAgV1RDUCgweDYyOWNjMjhjLCAweDUxOWIzZDgwKSwgV1RDUCgweDYxZjEwMDNmLCAweDUyNjkxMjZlKSwKKyAgICBXVENQKDB4NjE0MzkwNTMsIDB4NTMzNTdkZGYpLCBXVENQKDB4NjA5NDc1YzMsIDB4NTQwMDdjNTEpLAorICAgIFdUQ1AoMHg1ZmUzYjM4ZCwgMHg1NGNhMGE0YiksIFdUQ1AoMHg1ZjMxNGNiYSwgMHg1NTkyMjQ1NyksCisgICAgV1RDUCgweDVlN2Q0NDU4LCAweDU2NThjNzA5KSwgV1RDUCgweDVkYzc5ZDdjLCAweDU3MWRlZWZhKSwKKyAgICBXVENQKDB4NWQxMDViNDQsIDB4NTdlMTk4YzcpLCBXVENQKDB4NWM1NzgwZDMsIDB4NThhM2MxMTgpLAorICAgIFdUQ1AoMHg1YjlkMTE1NCwgMHg1OTY0NjQ5OCksIFdUQ1AoMHg1YWUxMGZmOSwgMHg1YTIzN2ZmYSksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzI0MFtdID0geworICAgIFdUQ1AoMHg3ZmZmZDMxNSwgMHgwMDZiM2I5YiksIFdUQ1AoMHg3ZmZlNmJiZiwgMHgwMTQxYjFhNSksCisgICAgV1RDUCgweDdmZmI5ZDE1LCAweDAyMTgyNDI3KSwgV1RDUCgweDdmZjc2NzIxLCAweDAyZWU5MGM4KSwKKyAgICBXVENQKDB4N2ZmMWM5ZWYsIDB4MDNjNGY1MmYpLCBXVENQKDB4N2ZlYWM1OGQsIDB4MDQ5YjRmMDApLAorICAgIFdUQ1AoMHg3ZmUyNWEwZiwgMHgwNTcxOWJlMiksIFdUQ1AoMHg3ZmQ4ODc4ZSwgMHgwNjQ3ZDk3YyksCisgICAgV1RDUCgweDdmY2Q0ZTI0LCAweDA3MWUwNTc1KSwgV1RDUCgweDdmYzBhZGYyLCAweDA3ZjQxZDcyKSwKKyAgICBXVENQKDB4N2ZiMmE3MWIsIDB4MDhjYTFmMWIpLCBXVENQKDB4N2ZhMzM5YzUsIDB4MDlhMDA4MTcpLAorICAgIFdUQ1AoMHg3ZjkyNjYxZCwgMHgwYTc1ZDYwZSksIFdUQ1AoMHg3ZjgwMmM1MiwgMHgwYjRiODZhOCksCisgICAgV1RDUCgweDdmNmM4Yzk2LCAweDBjMjExNzhjKSwgV1RDUCgweDdmNTc4NzIxLCAweDBjZjY4NjYyKSwKKyAgICBXVENQKDB4N2Y0MTFjMmYsIDB4MGRjYmQwZDUpLCBXVENQKDB4N2YyOTRiZmQsIDB4MGVhMGY0OGMpLAorICAgIFdUQ1AoMHg3ZjEwMTZjZSwgMHgwZjc1ZWYzMyksIFdUQ1AoMHg3ZWY1N2NlYSwgMHgxMDRhYmU3MSksCisgICAgV1RDUCgweDdlZDk3ZTljLCAweDExMWY1ZmY0KSwgV1RDUCgweDdlYmMxYzMxLCAweDExZjNkMTY0KSwKKyAgICBXVENQKDB4N2U5ZDU1ZmMsIDB4MTJjODEwNmYpLCBXVENQKDB4N2U3ZDJjNTQsIDB4MTM5YzFhYmYpLAorICAgIFdUQ1AoMHg3ZTViOWY5MywgMHgxNDZmZWUwMyksIFdUQ1AoMHg3ZTM4YjAxNywgMHgxNTQzODdlNiksCisgICAgV1RDUCgweDdlMTQ1ZTQyLCAweDE2MTZlNjE4KSwgV1RDUCgweDdkZWVhYTdhLCAweDE2ZWEwNjQ2KSwKKyAgICBXVENQKDB4N2RjNzk1MjksIDB4MTdiY2U2MjEpLCBXVENQKDB4N2Q5ZjFlYmQsIDB4MTg4ZjgzNTcpLAorICAgIFdUQ1AoMHg3ZDc1NDdhNywgMHgxOTYxZGI5YiksIFdUQ1AoMHg3ZDRhMTA1ZCwgMHgxYTMzZWM5YyksCisgICAgV1RDUCgweDdkMWQ3OTU4LCAweDFiMDViNDBmKSwgV1RDUCgweDdjZWY4MzE1LCAweDFiZDcyZmE0KSwKKyAgICBXVENQKDB4N2NjMDJlMTUsIDB4MWNhODVkMTIpLCBXVENQKDB4N2M4ZjdhZGUsIDB4MWQ3OTNhMGIpLAorICAgIFdUQ1AoMHg3YzVkNjlmNywgMHgxZTQ5YzQ0NyksIFdUQ1AoMHg3YzI5ZmJlZSwgMHgxZjE5Zjk3YiksCisgICAgV1RDUCgweDdiZjUzMTUzLCAweDFmZTlkNzVmKSwgV1RDUCgweDdiYmYwYWJhLCAweDIwYjk1YmFjKSwKKyAgICBXVENQKDB4N2I4Nzg4YmEsIDB4MjE4ODg0MWEpLCBXVENQKDB4N2I0ZWFiZjEsIDB4MjI1NzRlNjUpLAorICAgIFdUQ1AoMHg3YjE0NzRmZCwgMHgyMzI1Yjg0NyksIFdUQ1AoMHg3YWQ4ZTQ4MiwgMHgyM2YzYmY3ZSksCisgICAgV1RDUCgweDdhOWJmYjI3LCAweDI0YzE2MWM3KSwgV1RDUCgweDdhNWRiOTk3LCAweDI1OGU5Y2UwKSwKKyAgICBXVENQKDB4N2ExZTIwODIsIDB4MjY1YjZlOGEpLCBXVENQKDB4NzlkZDMwOTgsIDB4MjcyN2Q0ODYpLAorICAgIFdUQ1AoMHg3OTlhZWE5MiwgMHgyN2YzY2M5NCksIFdUQ1AoMHg3OTU3NGYyOCwgMHgyOGJmNTQ3YiksCisgICAgV1RDUCgweDc5MTI1ZjE5LCAweDI5OGE2OWZjKSwgV1RDUCgweDc4Y2MxYjI2LCAweDJhNTUwYWRmKSwKKyAgICBXVENQKDB4Nzg4NDg0MTQsIDB4MmIxZjM0ZWIpLCBXVENQKDB4NzgzYjlhYWQsIDB4MmJlOGU1ZTgpLAorICAgIFdUQ1AoMHg3N2YxNWZiYywgMHgyY2IyMWJhMCksIFdUQ1AoMHg3N2E1ZDQxMywgMHgyZDdhZDNkZSksCisgICAgV1RDUCgweDc3NThmODg2LCAweDJlNDMwYzZmKSwgV1RDUCgweDc3MGFjZGVjLCAweDJmMGFjMzIwKSwKKyAgICBXVENQKDB4NzZiYjU1MjEsIDB4MmZkMWY1YzEpLCBXVENQKDB4NzY2YThmMDQsIDB4MzA5OGEyMjMpLAorICAgIFdUQ1AoMHg3NjE4N2M3NywgMHgzMTVlYzYxNyksIFdUQ1AoMHg3NWM1MWU2MSwgMHgzMjI0NWY3MiksCisgICAgV1RDUCgweDc1NzA3NWFjLCAweDMyZTk2YzA5KSwgV1RDUCgweDc1MWE4MzQ2LCAweDMzYWRlOWIzKSwKKyAgICBXVENQKDB4NzRjMzQ4MjAsIDB4MzQ3MWQ2NDcpLCBXVENQKDB4NzQ2YWM1MmYsIDB4MzUzNTJmYTEpLAorICAgIFdUQ1AoMHg3NDEwZmI2YiwgMHgzNWY3ZjM5YyksIFdUQ1AoMHg3M2I1ZWJkMSwgMHgzNmJhMjAxNCksCisgICAgV1RDUCgweDczNTk5NzYwLCAweDM3N2JiMmU5KSwgV1RDUCgweDcyZmJmZjFiLCAweDM4M2NhOWZiKSwKKyAgICBXVENQKDB4NzI5ZDI0MDksIDB4MzhmZDAzMmQpLCBXVENQKDB4NzIzZDA3MzQsIDB4MzliY2JjNjMpLAorICAgIFdUQ1AoMHg3MWRiYTlhYiwgMHgzYTdiZDM4MiksIFdUQ1AoMHg3MTc5MGM3ZSwgMHgzYjNhNDY3MiksCisgICAgV1RDUCgweDcxMTUzMGMyLCAweDNiZjgxMzFjKSwgV1RDUCgweDcwYjAxNzkwLCAweDNjYjUzNzZiKSwKKyAgICBXVENQKDB4NzA0OWMyMDMsIDB4M2Q3MWIxNGQpLCBXVENQKDB4NmZlMjMxM2MsIDB4M2UyZDdlYjEpLAorICAgIFdUQ1AoMHg2Zjc5NjY1YiwgMHgzZWU4OWQ4NiksIFdUQ1AoMHg2ZjBmNjI4OSwgMHgzZmEzMGJjMSksCisgICAgV1RDUCgweDZlYTQyNmVkLCAweDQwNWNjNzU0KSwgV1RDUCgweDZlMzdiNGI2LCAweDQxMTVjZTM4KSwKKyAgICBXVENQKDB4NmRjYTBkMTQsIDB4NDFjZTFlNjUpLCBXVENQKDB4NmQ1YjMxM2IsIDB4NDI4NWI1ZDQpLAorICAgIFdUQ1AoMHg2Y2ViMjI2MSwgMHg0MzNjOTI4MyksIFdUQ1AoMHg2Yzc5ZTFjMiwgMHg0M2YyYjI3MSksCisgICAgV1RDUCgweDZjMDc3MDliLCAweDQ0YTgxMzllKSwgV1RDUCgweDZiOTNkMDJlLCAweDQ1NWNiNDBjKSwKKyAgICBXVENQKDB4NmIxZjAxYzAsIDB4NDYxMDkxYzIpLCBXVENQKDB4NmFhOTA2OTcsIDB4NDZjM2FhYzUpLAorICAgIFdUQ1AoMHg2YTMxZTAwMCwgMHg0Nzc1ZmQxZiksIFdUQ1AoMHg2OWI5OGY0OCwgMHg0ODI3ODZkYyksCisgICAgV1RDUCgweDY5NDAxNWMzLCAweDQ4ZDg0NjA5KSwgV1RDUCgweDY4YzU3NGM0LCAweDQ5ODgzOGI2KSwKKyAgICBXVENQKDB4Njg0OWFkYTMsIDB4NGEzNzVjZjUpLCBXVENQKDB4NjdjY2MxYmUsIDB4NGFlNWIwZGEpLAorICAgIFdUQ1AoMHg2NzRlYjI3MSwgMHg0YjkzMzI3YyksIFdUQ1AoMHg2NmNmODEyMCwgMHg0YzNmZGZmNCksCisgICAgV1RDUCgweDY2NGYyZjJlLCAweDRjZWJiNzVjKSwgV1RDUCgweDY1Y2RiZTA1LCAweDRkOTZiNmQzKSwKKyAgICBXVENQKDB4NjU0YjJmMTAsIDB4NGU0MGRjNzkpLCBXVENQKDB4NjRjNzgzYmQsIDB4NGVlYTI2NzApLAorICAgIFdUQ1AoMHg2NDQyYmQ3ZSwgMHg0ZjkyOTJkYyksIFdUQ1AoMHg2M2JjZGRjNywgMHg1MDNhMWZlNSksCisgICAgV1RDUCgweDYzMzVlNjExLCAweDUwZTBjYmI0KSwgV1RDUCgweDYyYWRkN2Q2LCAweDUxODY5NDc2KSwKKyAgICBXVENQKDB4NjIyNGI0OTUsIDB4NTIyYjc4NTkpLCBXVENQKDB4NjE5YTdkY2UsIDB4NTJjZjc1OGYpLAorICAgIFdUQ1AoMHg2MTBmMzUwNSwgMHg1MzcyOGE0YSksIFdUQ1AoMHg2MDgyZGJjMSwgMHg1NDE0YjRjMSksCisgICAgV1RDUCgweDVmZjU3MzhkLCAweDU0YjVmMzJjKSwgV1RDUCgweDVmNjZmZGY1LCAweDU1NTY0M2M4KSwKKyAgICBXVENQKDB4NWVkNzdjOGEsIDB4NTVmNWE0ZDIpLCBXVENQKDB4NWU0NmYwZGQsIDB4NTY5NDE0OGIpLAorICAgIFdUQ1AoMHg1ZGI1NWM4NiwgMHg1NzMxOTEzNSksIFdUQ1AoMHg1ZDIyYzExYywgMHg1N2NlMTkxNyksCisgICAgV1RDUCgweDVjOGYyMDNiLCAweDU4NjlhYTc5KSwgV1RDUCgweDViZmE3YjgyLCAweDU5MDQ0M2E3KSwKKyAgICBXVENQKDB4NWI2NGQ0OTIsIDB4NTk5ZGUyZWUpLCBXVENQKDB4NWFjZTJkMGYsIDB4NWEzNjg2OWYpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3cyNTZbXSA9IHsKKyAgICBXVENQKDB4N2ZmZmQ4ODYsIDB4MDA2NDg3ZTMpLCBXVENQKDB4N2ZmZTljYjIsIDB4MDEyZDk2YjEpLAorICAgIFdUQ1AoMHg3ZmZjMjUwZiwgMHgwMWY2YTI5NyksIFdUQ1AoMHg3ZmY4NzFhMiwgMHgwMmJmYTlhNCksCisgICAgV1RDUCgweDdmZjM4Mjc0LCAweDAzODhhOWVhKSwgV1RDUCgweDdmZWQ1NzkxLCAweDA0NTFhMTc3KSwKKyAgICBXVENQKDB4N2ZlNWYxMDgsIDB4MDUxYThlNWMpLCBXVENQKDB4N2ZkZDRlZWMsIDB4MDVlMzZlYTkpLAorICAgIFdUQ1AoMHg3ZmQzNzE1MywgMHgwNmFjNDA2ZiksIFdUQ1AoMHg3ZmM4NTg1NCwgMHgwNzc1MDFiZSksCisgICAgV1RDUCgweDdmYmMwNDBhLCAweDA4M2RiMGE3KSwgV1RDUCgweDdmYWU3NDk1LCAweDA5MDY0YjNhKSwKKyAgICBXVENQKDB4N2Y5ZmFhMTUsIDB4MDljZWNmODkpLCBXVENQKDB4N2Y4ZmE0YjAsIDB4MGE5NzNiYTUpLAorICAgIFdUQ1AoMHg3ZjdlNjQ4YywgMHgwYjVmOGQ5ZiksIFdUQ1AoMHg3ZjZiZTlkNCwgMHgwYzI3YzM4OSksCisgICAgV1RDUCgweDdmNTgzNGI3LCAweDBjZWZkYjc2KSwgV1RDUCgweDdmNDM0NTYzLCAweDBkYjdkMzc2KSwKKyAgICBXVENQKDB4N2YyZDFjMGUsIDB4MGU3ZmE5OWUpLCBXVENQKDB4N2YxNWI4ZWUsIDB4MGY0NzViZmYpLAorICAgIFdUQ1AoMHg3ZWZkMWMzYywgMHgxMDBlZThhZCksIFdUQ1AoMHg3ZWUzNDYzNiwgMHgxMGQ2NGRiZCksCisgICAgV1RDUCgweDdlYzgzNzFhLCAweDExOWQ4OTQxKSwgV1RDUCgweDdlYWJlZjJjLCAweDEyNjQ5OTRlKSwKKyAgICBXVENQKDB4N2U4ZTZlYjIsIDB4MTMyYjdiZjkpLCBXVENQKDB4N2U2ZmI1ZjQsIDB4MTNmMjJmNTgpLAorICAgIFdUQ1AoMHg3ZTRmYzUzZSwgMHgxNGI4YjE3ZiksIFdUQ1AoMHg3ZTJlOWNkZiwgMHgxNTdmMDA4NiksCisgICAgV1RDUCgweDdlMGMzZDI5LCAweDE2NDUxYTgzKSwgV1RDUCgweDdkZThhNjcwLCAweDE3MGFmZDhkKSwKKyAgICBXVENQKDB4N2RjM2Q5MGQsIDB4MTdkMGE3YmMpLCBXVENQKDB4N2Q5ZGQ1NWEsIDB4MTg5NjE3MjgpLAorICAgIFdUQ1AoMHg3ZDc2OWJiNSwgMHgxOTViNDllYSksIFdUQ1AoMHg3ZDRlMmM3ZiwgMHgxYTIwM2UxYiksCisgICAgV1RDUCgweDdkMjQ4ODFiLCAweDFhZTRmMWQ2KSwgV1RDUCgweDdjZjlhZWYwLCAweDFiYTk2MzM1KSwKKyAgICBXVENQKDB4N2NjZGExNjksIDB4MWM2ZDkwNTMpLCBXVENQKDB4N2NhMDVmZjEsIDB4MWQzMTc3NGQpLAorICAgIFdUQ1AoMHg3YzcxZWFmOSwgMHgxZGY1MTYzZiksIFdUQ1AoMHg3YzQyNDJmMiwgMHgxZWI4NmI0NiksCisgICAgV1RDUCgweDdjMTE2ODUzLCAweDFmN2I3NDgxKSwgV1RDUCgweDdiZGY1Yjk0LCAweDIwM2UzMDBkKSwKKyAgICBXVENQKDB4N2JhYzFkMzEsIDB4MjEwMDljMGMpLCBXVENQKDB4N2I3N2FkYTgsIDB4MjFjMmI2OWMpLAorICAgIFdUQ1AoMHg3YjQyMGQ3YSwgMHgyMjg0N2RlMCksIFdUQ1AoMHg3YjBiM2QyYywgMHgyMzQ1ZWZmOCksCisgICAgV1RDUCgweDdhZDMzZDQ1LCAweDI0MDcwYjA4KSwgV1RDUCgweDdhOWEwZTUwLCAweDI0YzdjZDMzKSwKKyAgICBXVENQKDB4N2E1ZmIwZDgsIDB4MjU4ODM0OWQpLCBXVENQKDB4N2EyNDI1NmYsIDB4MjY0ODNmNmMpLAorICAgIFdUQ1AoMHg3OWU3NmNhNywgMHgyNzA3ZWJjNyksIFdUQ1AoMHg3OWE5ODcxNSwgMHgyN2M3MzdkMyksCisgICAgV1RDUCgweDc5NmE3NTU0LCAweDI4ODYyMWI5KSwgV1RDUCgweDc5MmEzN2ZlLCAweDI5NDRhN2EyKSwKKyAgICBXVENQKDB4NzhlOGNmYjIsIDB4MmEwMmM3YjgpLCBXVENQKDB4NzhhNjNkMTEsIDB4MmFjMDgwMjYpLAorICAgIFdUQ1AoMHg3ODYyODBiZiwgMHgyYjdkY2YxNyksIFdUQ1AoMHg3ODFkOWI2NSwgMHgyYzNhYjJiOSksCisgICAgV1RDUCgweDc3ZDc4ZGFhLCAweDJjZjcyOTM5KSwgV1RDUCgweDc3OTA1ODNlLCAweDJkYjMzMGM3KSwKKyAgICBXVENQKDB4Nzc0N2ZiY2UsIDB4MmU2ZWM3OTIpLCBXVENQKDB4NzZmZTc5MGUsIDB4MmYyOWViY2MpLAorICAgIFdUQ1AoMHg3NmIzZDBiNCwgMHgyZmU0OWJhNyksIFdUQ1AoMHg3NjY4MDM3NiwgMHgzMDllZDU1NiksCisgICAgV1RDUCgweDc2MWIxMjExLCAweDMxNTg5NzBlKSwgV1RDUCgweDc1Y2NmZDQyLCAweDMyMTFkZjA0KSwKKyAgICBXVENQKDB4NzU3ZGM1Y2EsIDB4MzJjYWFiNmYpLCBXVENQKDB4NzUyZDZjNmMsIDB4MzM4MmZhODgpLAorICAgIFdUQ1AoMHg3NGRiZjFlZiwgMHgzNDNhY2E4NyksIFdUQ1AoMHg3NDg5NTcxYywgMHgzNGYyMTlhOCksCisgICAgV1RDUCgweDc0MzU5Y2JkLCAweDM1YThlNjI1KSwgV1RDUCgweDczZTBjM2EzLCAweDM2NWYyZTNiKSwKKyAgICBXVENQKDB4NzM4YWNjOWUsIDB4MzcxNGYwMmEpLCBXVENQKDB4NzMzM2I4ODMsIDB4MzdjYTJhMzApLAorICAgIFdUQ1AoMHg3MmRiODgyOCwgMHgzODdlZGE4ZSksIFdUQ1AoMHg3MjgyM2M2NywgMHgzOTMyZmY4NyksCisgICAgV1RDUCgweDcyMjdkNjFjLCAweDM5ZTY5NzVlKSwgV1RDUCgweDcxY2M1NjI2LCAweDNhOTlhMDU3KSwKKyAgICBXVENQKDB4NzE2ZmJkNjgsIDB4M2I0YzE4YmEpLCBXVENQKDB4NzExMjBjYzUsIDB4M2JmZGZlY2QpLAorICAgIFdUQ1AoMHg3MGIzNDUyNSwgMHgzY2FmNTBkYSksIFdUQ1AoMHg3MDUzNjc3MSwgMHgzZDYwMGQyYyksCisgICAgV1RDUCgweDZmZjI3NDk3LCAweDNlMTAzMjBkKSwgV1RDUCgweDZmOTA2ZDg0LCAweDNlYmZiZGNkKSwKKyAgICBXVENQKDB4NmYyZDUzMmMsIDB4M2Y2ZWFlYjgpLCBXVENQKDB4NmVjOTI2ODMsIDB4NDAxZDAzMjEpLAorICAgIFdUQ1AoMHg2ZTYzZTg3ZiwgMHg0MGNhYjk1OCksIFdUQ1AoMHg2ZGZkOWExYywgMHg0MTc3Y2ZiMSksCisgICAgV1RDUCgweDZkOTYzYzU0LCAweDQyMjQ0NDgxKSwgV1RDUCgweDZkMmRkMDI3LCAweDQyZDAxNjFlKSwKKyAgICBXVENQKDB4NmNjNDU2OTgsIDB4NDM3YjQyZTEpLCBXVENQKDB4NmM1OWQwYTksIDB4NDQyNWM5MjMpLAorICAgIFdUQ1AoMHg2YmVlM2Y2MiwgMHg0NGNmYTc0MCksIFdUQ1AoMHg2YjgxYTNjZCwgMHg0NTc4ZGI5MyksCisgICAgV1RDUCgweDZiMTNmZWY1LCAweDQ2MjE2NDdkKSwgV1RDUCgweDZhYTU1MWU5LCAweDQ2Yzk0MDVjKSwKKyAgICBXVENQKDB4NmEzNTlkYjksIDB4NDc3MDZkOTMpLCBXVENQKDB4NjljNGUzN2EsIDB4NDgxNmVhODYpLAorICAgIFdUQ1AoMHg2OTUzMjQ0MiwgMHg0OGJjYjU5OSksIFdUQ1AoMHg2OGUwNjEyOSwgMHg0OTYxY2QzMyksCisgICAgV1RDUCgweDY4NmM5YjRiLCAweDRhMDYyZmJkKSwgV1RDUCgweDY3ZjdkM2M1LCAweDRhYTlkYmEyKSwKKyAgICBXVENQKDB4Njc4MjBiYjcsIDB4NGI0Y2NmNGQpLCBXVENQKDB4NjcwYjQ0NDQsIDB4NGJlZjA5MmQpLAorICAgIFdUQ1AoMHg2NjkzN2U5MSwgMHg0YzkwODdiMSksIFdUQ1AoMHg2NjFhYmJjNSwgMHg0ZDMxNDk0YiksCisgICAgV1RDUCgweDY1YTBmZDBiLCAweDRkZDE0YzZlKSwgV1RDUCgweDY1MjY0MzhmLCAweDRlNzA4ZjhmKSwKKyAgICBXVENQKDB4NjRhYTkwN2YsIDB4NGYwZjExMjYpLCBXVENQKDB4NjQyZGU1MGQsIDB4NGZhY2NmYWIpLAorICAgIFdUQ1AoMHg2M2IwNDI2ZCwgMHg1MDQ5Yzk5OSksIFdUQ1AoMHg2MzMxYTlkNCwgMHg1MGU1ZmQ2ZCksCisgICAgV1RDUCgweDYyYjIxYzdiLCAweDUxODE2OWE1KSwgV1RDUCgweDYyMzE5YjlkLCAweDUyMWMwY2MyKSwKKyAgICBXVENQKDB4NjFiMDI4NzYsIDB4NTJiNWU1NDYpLCBXVENQKDB4NjEyZGM0NDcsIDB4NTM0ZWYxYjUpLAorICAgIFdUQ1AoMHg2MGFhNzA1MCwgMHg1M2U3MzA5NyksIFdUQ1AoMHg2MDI2MmRkNiwgMHg1NDdlYTA3MyksCisgICAgV1RDUCgweDVmYTBmZTFmLCAweDU1MTUzZmQ0KSwgV1RDUCgweDVmMWFlMjc0LCAweDU1YWIwZDQ2KSwKKyAgICBXVENQKDB4NWU5M2RjMWYsIDB4NTY0MDA3NTgpLCBXVENQKDB4NWUwYmVjNmUsIDB4NTZkNDJjOTkpLAorICAgIFdUQ1AoMHg1ZDgzMTRiMSwgMHg1NzY3N2I5ZCksIFdUQ1AoMHg1Y2Y5NTYzOCwgMHg1N2Y5ZjJmOCksCisgICAgV1RDUCgweDVjNmViMjU4LCAweDU4OGI5MTQwKSwgV1RDUCgweDViZTMyYTY3LCAweDU5MWM1NTBlKSwKKyAgICBXVENQKDB4NWI1NmJmYmQsIDB4NTlhYzNjZmQpLCBXVENQKDB4NWFjOTczYjUsIDB4NWEzYjQ3YWIpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3czODRbXSA9IHsKKyAgICBXVENQKDB4N2ZmZmVlNzQsIDB4MDA0MzA1NDYpLCBXVENQKDB4N2ZmZjYyMTYsIDB4MDBjOTBmODgpLAorICAgIFdUQ1AoMHg3ZmZlNDk1YiwgMHgwMTRmMThlZSksIFdUQ1AoMHg3ZmZjYTQ0MywgMHgwMWQ1MjBlNCksCisgICAgV1RDUCgweDdmZmE3MmQxLCAweDAyNWIyNmQ3KSwgV1RDUCgweDdmZjdiNTA3LCAweDAyZTEyYTM2KSwKKyAgICBXVENQKDB4N2ZmNDZhZTgsIDB4MDM2NzJhNmMpLCBXVENQKDB4N2ZmMDk0NzgsIDB4MDNlZDI2ZTYpLAorICAgIFdUQ1AoMHg3ZmVjMzFiYSwgMHgwNDczMWYxMyksIFdUQ1AoMHg3ZmU3NDJiNCwgMHgwNGY5MTI1ZSksCisgICAgV1RDUCgweDdmZTFjNzZiLCAweDA1N2YwMDM1KSwgV1RDUCgweDdmZGJiZmU2LCAweDA2MDRlODA1KSwKKyAgICBXVENQKDB4N2ZkNTJjMjksIDB4MDY4YWM5M2IpLCBXVENQKDB4N2ZjZTBjM2UsIDB4MDcxMGEzNDUpLAorICAgIFdUQ1AoMHg3ZmM2NjAyYywgMHgwNzk2NzU4ZiksIFdUQ1AoMHg3ZmJlMjdmYSwgMHgwODFjM2Y4NyksCisgICAgV1RDUCgweDdmYjU2M2IzLCAweDA4YTIwMDlhKSwgV1RDUCgweDdmYWMxMzVmLCAweDA5MjdiODM2KSwKKyAgICBXVENQKDB4N2ZhMjM3MGEsIDB4MDlhZDY1YzgpLCBXVENQKDB4N2Y5N2NlYmQsIDB4MGEzMzA4YmQpLAorICAgIFdUQ1AoMHg3ZjhjZGE4NCwgMHgwYWI4YTA4MiksIFdUQ1AoMHg3ZjgxNWE2YiwgMHgwYjNlMmM4NiksCisgICAgV1RDUCgweDdmNzU0ZTgwLCAweDBiYzNhYzM1KSwgV1RDUCgweDdmNjhiNmNlLCAweDBjNDkxZWZlKSwKKyAgICBXVENQKDB4N2Y1YjkzNjQsIDB4MGNjZTg0NGUpLCBXVENQKDB4N2Y0ZGU0NTEsIDB4MGQ1M2RiOTIpLAorICAgIFdUQ1AoMHg3ZjNmYTlhMiwgMHgwZGQ5MjQzOSksIFdUQ1AoMHg3ZjMwZTM2OSwgMHgwZTVlNWRiMCksCisgICAgV1RDUCgweDdmMjE5MWI0LCAweDBlZTM4NzY2KSwgV1RDUCgweDdmMTFiNDk1LCAweDBmNjhhMGM4KSwKKyAgICBXVENQKDB4N2YwMTRjMWUsIDB4MGZlZGE5NDMpLCBXVENQKDB4N2VmMDU4NjAsIDB4MTA3MmEwNDgpLAorICAgIFdUQ1AoMHg3ZWRlZDk2ZCwgMHgxMGY3ODU0MyksIFdUQ1AoMHg3ZWNjY2Y1YSwgMHgxMTdjNTdhMiksCisgICAgV1RDUCgweDdlYmEzYTM5LCAweDEyMDExNmQ1KSwgV1RDUCgweDdlYTcxYTIwLCAweDEyODVjMjQ5KSwKKyAgICBXVENQKDB4N2U5MzZmMjIsIDB4MTMwYTU5NmUpLCBXVENQKDB4N2U3ZjM5NTcsIDB4MTM4ZWRiYjEpLAorICAgIFdUQ1AoMHg3ZTZhNzhkMywgMHgxNDEzNDg4MSksIFdUQ1AoMHg3ZTU1MmRhZSwgMHgxNDk3OWY0ZSksCisgICAgV1RDUCgweDdlM2Y1N2ZmLCAweDE1MWJkZjg2KSwgV1RDUCgweDdlMjhmN2RlLCAweDE1YTAwODk3KSwKKyAgICBXVENQKDB4N2UxMjBkNjMsIDB4MTYyNDE5ZjIpLCBXVENQKDB4N2RmYTk4YTgsIDB4MTZhODEzMDUpLAorICAgIFdUQ1AoMHg3ZGUyOTljNiwgMHgxNzJiZjMzZiksIFdUQ1AoMHg3ZGNhMTBkOCwgMHgxN2FmYmExMSksCisgICAgV1RDUCgweDdkYjBmZGY4LCAweDE4MzM2NmU5KSwgV1RDUCgweDdkOTc2MTQyLCAweDE4YjZmOTM2KSwKKyAgICBXVENQKDB4N2Q3ZDNhZDMsIDB4MTkzYTcwNmEpLCBXVENQKDB4N2Q2MjhhYzYsIDB4MTliZGNiZjMpLAorICAgIFdUQ1AoMHg3ZDQ3NTEzOSwgMHgxYTQxMGI0MSksIFdUQ1AoMHg3ZDJiOGU0YSwgMHgxYWM0MmRjNSksCisgICAgV1RDUCgweDdkMGY0MjE4LCAweDFiNDczMmVmKSwgV1RDUCgweDdjZjI2Y2MxLCAweDFiY2ExYTJmKSwKKyAgICBXVENQKDB4N2NkNTBlNjUsIDB4MWM0Y2UyZjYpLCBXVENQKDB4N2NiNzI3MjQsIDB4MWNjZjhjYjMpLAorICAgIFdUQ1AoMHg3Yzk4YjcxZiwgMHgxZDUyMTZkOCksIFdUQ1AoMHg3Yzc5YmU3OCwgMHgxZGQ0ODBkNiksCisgICAgV1RDUCgweDdjNWEzZDUwLCAweDFlNTZjYTFlKSwgV1RDUCgweDdjM2EzM2NhLCAweDFlZDhmMjIwKSwKKyAgICBXVENQKDB4N2MxOWEyMDksIDB4MWY1YWY4NGYpLCBXVENQKDB4N2JmODg4MzAsIDB4MWZkY2RjMWIpLAorICAgIFdUQ1AoMHg3YmQ2ZTY2NSwgMHgyMDVlOWNmNiksIFdUQ1AoMHg3YmI0YmNjYiwgMHgyMGUwM2E1MSksCisgICAgV1RDUCgweDdiOTIwYjg5LCAweDIxNjFiM2EwKSwgV1RDUCgweDdiNmVkMmM1LCAweDIxZTMwODUzKSwKKyAgICBXVENQKDB4N2I0YjEyYTQsIDB4MjI2NDM3ZGMpLCBXVENQKDB4N2IyNmNiNGYsIDB4MjJlNTQxYWYpLAorICAgIFdUQ1AoMHg3YjAxZmNlZCwgMHgyMzY2MjUzZCksIFdUQ1AoMHg3YWRjYTdhNiwgMHgyM2U2ZTFmYSksCisgICAgV1RDUCgweDdhYjZjYmE0LCAweDI0Njc3NzU4KSwgV1RDUCgweDdhOTA2OTBmLCAweDI0ZTdlNGM5KSwKKyAgICBXVENQKDB4N2E2OTgwMTIsIDB4MjU2ODI5YzIpLCBXVENQKDB4N2E0MjEwZDgsIDB4MjVlODQ1YjYpLAorICAgIFdUQ1AoMHg3YTFhMWI4YywgMHgyNjY4MzgxOCksIFdUQ1AoMHg3OWYxYTA1YSwgMHgyNmU4MDA1YiksCisgICAgV1RDUCgweDc5Yzg5ZjZlLCAweDI3Njc5ZGY0KSwgV1RDUCgweDc5OWYxOGY0LCAweDI3ZTcxMDU3KSwKKyAgICBXVENQKDB4Nzk3NTBkMWMsIDB4Mjg2NjU2ZjgpLCBXVENQKDB4Nzk0YTdjMTIsIDB4MjhlNTcxNGIpLAorICAgIFdUQ1AoMHg3OTFmNjYwNSwgMHgyOTY0NWVjNSksIFdUQ1AoMHg3OGYzY2IyNSwgMHgyOWUzMWVkYiksCisgICAgV1RDUCgweDc4YzdhYmEyLCAweDJhNjFiMTAxKSwgV1RDUCgweDc4OWIwN2FiLCAweDJhZTAxNGFlKSwKKyAgICBXVENQKDB4Nzg2ZGRmNzIsIDB4MmI1ZTQ5NTYpLCBXVENQKDB4Nzg0MDMzMjksIDB4MmJkYzRlNmYpLAorICAgIFdUQ1AoMHg3ODEyMDMwMCwgMHgyYzVhMjM2ZiksIFdUQ1AoMHg3N2UzNGYyYywgMHgyY2Q3YzdjYyksCisgICAgV1RDUCgweDc3YjQxN2RmLCAweDJkNTUzYWZjKSwgV1RDUCgweDc3ODQ1ZDRlLCAweDJkZDI3Yzc1KSwKKyAgICBXVENQKDB4Nzc1NDFmYWIsIDB4MmU0ZjhiYWUpLCBXVENQKDB4NzcyMzVmMmQsIDB4MmVjYzY4MWUpLAorICAgIFdUQ1AoMHg3NmYyMWMwOSwgMHgyZjQ5MTEzZCksIFdUQ1AoMHg3NmMwNTY3NCwgMHgyZmM1ODY4MCksCisgICAgV1RDUCgweDc2OGUwZWE2LCAweDMwNDFjNzYxKSwgV1RDUCgweDc2NWI0NGQ1LCAweDMwYmRkMzU2KSwKKyAgICBXVENQKDB4NzYyN2Y5MzksIDB4MzEzOWE5ZDcpLCBXVENQKDB4NzVmNDJjMGIsIDB4MzFiNTRhNWUpLAorICAgIFdUQ1AoMHg3NWJmZGQ4MywgMHgzMjMwYjQ2MSksIFdUQ1AoMHg3NThiMGRkYiwgMHgzMmFiZTc1YSksCisgICAgV1RDUCgweDc1NTViZDRjLCAweDMzMjZlMmMzKSwgV1RDUCgweDc1MWZlYzExLCAweDMzYTFhNjEyKSwKKyAgICBXVENQKDB4NzRlOTlhNjUsIDB4MzQxYzMwYzQpLCBXVENQKDB4NzRiMmM4ODQsIDB4MzQ5NjgyNTApLAorICAgIFdUQ1AoMHg3NDdiNzZhOSwgMHgzNTEwOWEzMSksIFdUQ1AoMHg3NDQzYTUxMiwgMHgzNThhNzdlMCksCisgICAgV1RDUCgweDc0MGI1M2ZiLCAweDM2MDQxYWQ5KSwgV1RDUCgweDczZDI4M2EyLCAweDM2N2Q4Mjk2KSwKKyAgICBXVENQKDB4NzM5OTM0NDcsIDB4MzZmNmFlOTEpLCBXVENQKDB4NzM1ZjY2MjYsIDB4Mzc2ZjllNDYpLAorICAgIFdUQ1AoMHg3MzI1MTk4MSwgMHgzN2U4NTEzMCksIFdUQ1AoMHg3MmVhNGU5NiwgMHgzODYwYzZjYiksCisgICAgV1RDUCgweDcyYWYwNWE3LCAweDM4ZDhmZTkzKSwgV1RDUCgweDcyNzMzZWYzLCAweDM5NTBmODA0KSwKKyAgICBXVENQKDB4NzIzNmZhYmUsIDB4MzljOGIyOWEpLCBXVENQKDB4NzFmYTM5NDksIDB4M2E0MDJkZDIpLAorICAgIFdUQ1AoMHg3MWJjZmFkNiwgMHgzYWI3NjkyOSksIFdUQ1AoMHg3MTdmM2ZhOCwgMHgzYjJlNjQxYyksCisgICAgV1RDUCgweDcxNDEwODA1LCAweDNiYTUxZTI5KSwgV1RDUCgweDcxMDI1NDJmLCAweDNjMWI5NmNlKSwKKyAgICBXVENQKDB4NzBjMzI0NmIsIDB4M2M5MWNkODgpLCBXVENQKDB4NzA4Mzc4ZmYsIDB4M2QwN2MxZDYpLAorICAgIFdUQ1AoMHg3MDQzNTIzMCwgMHgzZDdkNzMzNyksIFdUQ1AoMHg3MDAyYjA0NSwgMHgzZGYyZTEyOSksCisgICAgV1RDUCgweDZmYzE5Mzg1LCAweDNlNjgwYjJjKSwgV1RDUCgweDZmN2ZmYzM3LCAweDNlZGNmMGMwKSwKKyAgICBXVENQKDB4NmYzZGVhYTQsIDB4M2Y1MTkxNjQpLCBXVENQKDB4NmVmYjVmMTIsIDB4M2ZjNWVjOTgpLAorICAgIFdUQ1AoMHg2ZWI4NTljYywgMHg0MDNhMDFkYyksIFdUQ1AoMHg2ZTc0ZGIxYywgMHg0MGFkZDBiMiksCisgICAgV1RDUCgweDZlMzBlMzRhLCAweDQxMjE1ODliKSwgV1RDUCgweDZkZWM3MmEyLCAweDQxOTQ5OTE3KSwKKyAgICBXVENQKDB4NmRhNzg5NmUsIDB4NDIwNzkxYTgpLCBXVENQKDB4NmQ2MjI3ZmEsIDB4NDI3YTQxZDApLAorICAgIFdUQ1AoMHg2ZDFjNGU5MywgMHg0MmVjYTkxMiksIFdUQ1AoMHg2Y2Q1ZmQ4NSwgMHg0MzVlYzZmMCksCisgICAgV1RDUCgweDZjOGYzNTFjLCAweDQzZDA5YWVkKSwgV1RDUCgweDZjNDdmNWE3LCAweDQ0NDIyNDhiKSwKKyAgICBXVENQKDB4NmMwMDNmNzQsIDB4NDRiMzYzNGYpLCBXVENQKDB4NmJiODEyZDEsIDB4NDUyNDU2YmQpLAorICAgIFdUQ1AoMHg2YjZmNzAwZSwgMHg0NTk0ZmU1OCksIFdUQ1AoMHg2YjI2NTc3OSwgMHg0NjA1NTlhNCksCisgICAgV1RDUCgweDZhZGNjOTY0LCAweDQ2NzU2ODI4KSwgV1RDUCgweDZhOTJjNjFmLCAweDQ2ZTUyOTY3KSwKKyAgICBXVENQKDB4NmE0ODRkZmMsIDB4NDc1NDljZTcpLCBXVENQKDB4NjlmZDYxNGEsIDB4NDdjM2MyMmYpLAorICAgIFdUQ1AoMHg2OWIyMDA1ZSwgMHg0ODMyOThjNCksIFdUQ1AoMHg2OTY2MmI4YSwgMHg0OGExMjAyYyksCisgICAgV1RDUCgweDY5MTllMzIwLCAweDQ5MGY1N2VlKSwgV1RDUCgweDY4Y2QyNzc1LCAweDQ5N2QzZjkzKSwKKyAgICBXVENQKDB4Njg3ZmY4ZGMsIDB4NDllYWQ2YTApLCBXVENQKDB4NjgzMjU3YWIsIDB4NGE1ODFjOWUpLAorICAgIFdUQ1AoMHg2N2U0NDQzNiwgMHg0YWM1MTExNCksIFdUQ1AoMHg2Nzk1YmVkMywgMHg0YjMxYjM4ZCksCisgICAgV1RDUCgweDY3NDZjN2Q4LCAweDRiOWUwMzkwKSwgV1RDUCgweDY2Zjc1ZjliLCAweDRjMGEwMGE2KSwKKyAgICBXVENQKDB4NjZhNzg2NzUsIDB4NGM3NWFhNWEpLCBXVENQKDB4NjY1NzNjYmIsIDB4NGNlMTAwMzQpLAorICAgIFdUQ1AoMHg2NjA2ODJjNywgMHg0ZDRjMDFjMCksIFdUQ1AoMHg2NWI1NThmMSwgMHg0ZGI2YWU4OCksCisgICAgV1RDUCgweDY1NjNiZjkyLCAweDRlMjEwNjE3KSwgV1RDUCgweDY1MTFiNzAzLCAweDRlOGIwN2Y5KSwKKyAgICBXVENQKDB4NjRiZjNmOWYsIDB4NGVmNGIzYjkpLCBXVENQKDB4NjQ2YzU5YmYsIDB4NGY1ZTA4ZTMpLAorICAgIFdUQ1AoMHg2NDE5MDViZiwgMHg0ZmM3MDcwNCksIFdUQ1AoMHg2M2M1NDNmYSwgMHg1MDJmYWRhOSksCisgICAgV1RDUCgweDYzNzExNGNjLCAweDUwOTdmYzVlKSwgV1RDUCgweDYzMWM3ODkyLCAweDUwZmZmMmIyKSwKKyAgICBXVENQKDB4NjJjNzZmYTcsIDB4NTE2NzkwMzMpLCBXVENQKDB4NjI3MWZhNjksIDB4NTFjZWQ0NmUpLAorICAgIFdUQ1AoMHg2MjFjMTkzNywgMHg1MjM1YmVmNCksIFdUQ1AoMHg2MWM1Y2M2ZCwgMHg1MjljNGY1MSksCisgICAgV1RDUCgweDYxNmYxNDZjLCAweDUzMDI4NTE4KSwgV1RDUCgweDYxMTdmMTkxLCAweDUzNjg1ZmQ2KSwKKyAgICBXVENQKDB4NjBjMDY0M2QsIDB4NTNjZGRmMWQpLCBXVENQKDB4NjA2ODZjY2YsIDB4NTQzMzAyN2QpLAorICAgIFdUQ1AoMHg2MDEwMGJhOCwgMHg1NDk3Yzk4OCksIFdUQ1AoMHg1ZmI3NDEyOSwgMHg1NGZjMzNjZSksCisgICAgV1RDUCgweDVmNWUwZGIzLCAweDU1NjA0MGUyKSwgV1RDUCgweDVmMDQ3MWE4LCAweDU1YzNmMDU2KSwKKyAgICBXVENQKDB4NWVhYTZkNmIsIDB4NTYyNzQxYmQpLCBXVENQKDB4NWU1MDAxNWQsIDB4NTY4YTM0YTkpLAorICAgIFdUQ1AoMHg1ZGY1MmRlMywgMHg1NmVjYzhhZiksIFdUQ1AoMHg1ZDk5ZjM1ZiwgMHg1NzRlZmQ2MiksCisgICAgV1RDUCgweDVkM2U1MjM3LCAweDU3YjBkMjU2KSwgV1RDUCgweDVjZTI0YWNkLCAweDU4MTI0NzIwKSwKKyAgICBXVENQKDB4NWM4NWRkODgsIDB4NTg3MzViNTYpLCBXVENQKDB4NWMyOTBhY2MsIDB4NThkNDBlOGMpLAorICAgIFdUQ1AoMHg1YmNiZDMwMCwgMHg1OTM0NjA1YSksIFdUQ1AoMHg1YjZlMzY4OSwgMHg1OTk0NTA1NCksCisgICAgV1RDUCgweDViMTAzNWNmLCAweDU5ZjNkZTEyKSwgV1RDUCgweDVhYjFkMTM4LCAweDVhNTMwOTJjKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93NDgwW10gPSB7CisgICAgV1RDUCgweDdmZmZmNGM1LCAweDAwMzU5ZGQyKSwgV1RDUCgweDdmZmY5YWVmLCAweDAwYTBkOTUxKSwKKyAgICBXVENQKDB4N2ZmZWU3NDQsIDB4MDEwYzE0NjApLCBXVENQKDB4N2ZmZGQ5YzQsIDB4MDE3NzRlYjIpLAorICAgIFdUQ1AoMHg3ZmZjNzI2ZiwgMHgwMWUyODdmYyksIFdUQ1AoMHg3ZmZhYjE0NywgMHgwMjRkYmZmNCksCisgICAgV1RDUCgweDdmZjg5NjRkLCAweDAyYjhmNjRlKSwgV1RDUCgweDdmZjYyMTgyLCAweDAzMjQyYWJmKSwKKyAgICBXVENQKDB4N2ZmMzUyZTgsIDB4MDM4ZjVjZmIpLCBXVENQKDB4N2ZmMDJhODIsIDB4MDNmYThjYjgpLAorICAgIFdUQ1AoMHg3ZmVjYTg1MSwgMHgwNDY1YjlhYSksIFdUQ1AoMHg3ZmU4Y2M1NywgMHgwNGQwZTM4NiksCisgICAgV1RDUCgweDdmZTQ5Njk4LCAweDA1M2MwYTAxKSwgV1RDUCgweDdmZTAwNzE2LCAweDA1YTcyY2NmKSwKKyAgICBXVENQKDB4N2ZkYjFkZDUsIDB4MDYxMjRiYTUpLCBXVENQKDB4N2ZkNWRhZDgsIDB4MDY3ZDY2MzkpLAorICAgIFdUQ1AoMHg3ZmQwM2UyMywgMHgwNmU4N2MzZiksIFdUQ1AoMHg3ZmNhNDdiOSwgMHgwNzUzOGQ2YiksCisgICAgV1RDUCgweDdmYzNmN2EwLCAweDA3YmU5OTczKSwgV1RDUCgweDdmYmQ0ZGRhLCAweDA4MjlhMDBjKSwKKyAgICBXVENQKDB4N2ZiNjRhNmUsIDB4MDg5NGEwZWEpLCBXVENQKDB4N2ZhZWVkNWYsIDB4MDhmZjliYzIpLAorICAgIFdUQ1AoMHg3ZmE3MzZiNCwgMHgwOTZhOTA0OSksIFdUQ1AoMHg3ZjlmMjY3MSwgMHgwOWQ1N2UzNSksCisgICAgV1RDUCgweDdmOTZiYzljLCAweDBhNDA2NTNhKSwgV1RDUCgweDdmOGRmOTNjLCAweDBhYWI0NTBkKSwKKyAgICBXVENQKDB4N2Y4NGRjNTUsIDB4MGIxNjFkNjMpLCBXVENQKDB4N2Y3YjY1ZWYsIDB4MGI4MGVkZjEpLAorICAgIFdUQ1AoMHg3ZjcxOTYxMSwgMHgwYmViYjY2YyksIFdUQ1AoMHg3ZjY3NmNjMCwgMHgwYzU2NzY4YSksCisgICAgV1RDUCgweDdmNWNlYTA1LCAweDBjYzEyZGZmKSwgV1RDUCgweDdmNTIwZGU2LCAweDBkMmJkYzgwKSwKKyAgICBXVENQKDB4N2Y0NmQ4NmMsIDB4MGQ5NjgxYzIpLCBXVENQKDB4N2YzYjQ5OWQsIDB4MGUwMTFkN2MpLAorICAgIFdUQ1AoMHg3ZjJmNjE4MywgMHgwZTZiYWY2MSksIFdUQ1AoMHg3ZjIzMjAyNiwgMHgwZWQ2MzcyNyksCisgICAgV1RDUCgweDdmMTY4NThlLCAweDBmNDBiNDgzKSwgV1RDUCgweDdmMDk5MWM0LCAweDBmYWIyNzJiKSwKKyAgICBXVENQKDB4N2VmYzQ0ZDAsIDB4MTAxNThlZDQpLCBXVENQKDB4N2VlZTllYmUsIDB4MTA3ZmViMzMpLAorICAgIFdUQ1AoMHg3ZWUwOWY5NSwgMHgxMGVhM2JmZCksIFdUQ1AoMHg3ZWQyNDc2MSwgMHgxMTU0ODBlOSksCisgICAgV1RDUCgweDdlYzM5NjJhLCAweDExYmViOWFhKSwgV1RDUCgweDdlYjQ4YmZiLCAweDEyMjhlNWY4KSwKKyAgICBXVENQKDB4N2VhNTI4ZTAsIDB4MTI5MzA1ODYpLCBXVENQKDB4N2U5NTZjZTEsIDB4MTJmZDE4MGIpLAorICAgIFdUQ1AoMHg3ZTg1NTgwYywgMHgxMzY3MWQzZCksIFdUQ1AoMHg3ZTc0ZWE2YSwgMHgxM2QxMTRkMCksCisgICAgV1RDUCgweDdlNjQyNDA4LCAweDE0M2FmZTdiKSwgV1RDUCgweDdlNTMwNGYyLCAweDE0YTRkOWY0KSwKKyAgICBXVENQKDB4N2U0MThkMzIsIDB4MTUwZWE2ZWYpLCBXVENQKDB4N2UyZmJjZDYsIDB4MTU3ODY1MjIpLAorICAgIFdUQ1AoMHg3ZTFkOTNlYSwgMHgxNWUyMTQ0NSksIFdUQ1AoMHg3ZTBiMTI3YSwgMHgxNjRiYjQwYiksCisgICAgV1RDUCgweDdkZjgzODk1LCAweDE2YjU0NDJiKSwgV1RDUCgweDdkZTUwNjQ2LCAweDE3MWVjNDVjKSwKKyAgICBXVENQKDB4N2RkMTdiOWMsIDB4MTc4ODM0NTIpLCBXVENQKDB4N2RiZDk4YTQsIDB4MTdmMTkzYzUpLAorICAgIFdUQ1AoMHg3ZGE5NWQ2YywgMHgxODVhZTI2OSksIFdUQ1AoMHg3ZDk0Y2EwMywgMHgxOGM0MWZmNiksCisgICAgV1RDUCgweDdkN2ZkZTc2LCAweDE5MmQ0YzIxKSwgV1RDUCgweDdkNmE5YWQ1LCAweDE5OTY2NmEwKSwKKyAgICBXVENQKDB4N2Q1NGZmMmUsIDB4MTlmZjZmMmEpLCBXVENQKDB4N2QzZjBiOTAsIDB4MWE2ODY1NzUpLAorICAgIFdUQ1AoMHg3ZDI4YzAwYywgMHgxYWQxNDkzOCksIFdUQ1AoMHg3ZDEyMWNiMCwgMHgxYjNhMWEyOCksCisgICAgV1RDUCgweDdjZmIyMThjLCAweDFiYTJkN2ZjKSwgV1RDUCgweDdjZTNjZWIyLCAweDFjMGI4MjZhKSwKKyAgICBXVENQKDB4N2NjYzI0MzAsIDB4MWM3NDE5MmEpLCBXVENQKDB4N2NiNDIyMTcsIDB4MWNkYzliZjIpLAorICAgIFdUQ1AoMHg3YzliYzg3YSwgMHgxZDQ1MGE3OCksIFdUQ1AoMHg3YzgzMTc2NywgMHgxZGFkNjQ3MyksCisgICAgV1RDUCgweDdjNmEwZWYyLCAweDFlMTVhOTlhKSwgV1RDUCgweDdjNTBhZjJiLCAweDFlN2RkOWE0KSwKKyAgICBXVENQKDB4N2MzNmY4MjQsIDB4MWVlNWY0NDcpLCBXVENQKDB4N2MxY2U5ZWYsIDB4MWY0ZGY5M2EpLAorICAgIFdUQ1AoMHg3YzAyODQ5ZiwgMHgxZmI1ZTgzNiksIFdUQ1AoMHg3YmU3Yzg0NywgMHgyMDFkYzBlZiksCisgICAgV1RDUCgweDdiY2NiNGY4LCAweDIwODU4MzFmKSwgV1RDUCgweDdiYjE0YWM1LCAweDIwZWQyZTdiKSwKKyAgICBXVENQKDB4N2I5NTg5YzMsIDB4MjE1NGMyYmIpLCBXVENQKDB4N2I3OTcyMDUsIDB4MjFiYzNmOTcpLAorICAgIFdUQ1AoMHg3YjVkMDM5ZSwgMHgyMjIzYTRjNSksIFdUQ1AoMHg3YjQwM2VhMiwgMHgyMjhhZjFmZSksCisgICAgV1RDUCgweDdiMjMyMzI1LCAweDIyZjIyNmY4KSwgV1RDUCgweDdiMDViMTNkLCAweDIzNTk0MzZjKSwKKyAgICBXVENQKDB4N2FlN2U4ZmMsIDB4MjNjMDQ3MTApLCBXVENQKDB4N2FjOWNhN2EsIDB4MjQyNzMxOWQpLAorICAgIFdUQ1AoMHg3YWFiNTVjYSwgMHgyNDhlMDJjYiksIFdUQ1AoMHg3YThjOGIwMSwgMHgyNGY0YmE1MCksCisgICAgV1RDUCgweDdhNmQ2YTM3LCAweDI1NWI1N2U2KSwgV1RDUCgweDdhNGRmMzgwLCAweDI1YzFkYjQ0KSwKKyAgICBXVENQKDB4N2EyZTI2ZjIsIDB4MjYyODQ0MjIpLCBXVENQKDB4N2EwZTA0YTQsIDB4MjY4ZTkyMzgpLAorICAgIFdUQ1AoMHg3OWVkOGNhZCwgMHgyNmY0YzUzZSksIFdUQ1AoMHg3OWNjYmYyMiwgMHgyNzVhZGNlZSksCisgICAgV1RDUCgweDc5YWI5YzFjLCAweDI3YzBkOGZlKSwgV1RDUCgweDc5OGEyM2IxLCAweDI4MjZiOTI4KSwKKyAgICBXVENQKDB4Nzk2ODU1ZjksIDB4Mjg4YzdkMjQpLCBXVENQKDB4Nzk0NjMzMGMsIDB4MjhmMjI0YWIpLAorICAgIFdUQ1AoMHg3OTIzYmIwMSwgMHgyOTU3YWY3NCksIFdUQ1AoMHg3OTAwZWRmMiwgMHgyOWJkMWQzYSksCisgICAgV1RDUCgweDc4ZGRjYmY1LCAweDJhMjI2ZGI1KSwgV1RDUCgweDc4YmE1NTI0LCAweDJhODdhMDlkKSwKKyAgICBXVENQKDB4Nzg5Njg5OTgsIDB4MmFlY2I1YWMpLCBXVENQKDB4Nzg3MjY5NmEsIDB4MmI1MWFjOWEpLAorICAgIFdUQ1AoMHg3ODRkZjRiMywgMHgyYmI2ODUyMiksIFdUQ1AoMHg3ODI5MmI4ZCwgMHgyYzFiM2VmYiksCisgICAgV1RDUCgweDc4MDQwZTEyLCAweDJjN2ZkOWUwKSwgV1RDUCgweDc3ZGU5YzViLCAweDJjZTQ1NTg5KSwKKyAgICBXVENQKDB4NzdiOGQ2ODMsIDB4MmQ0OGIxYjEpLCBXVENQKDB4Nzc5MmJjYTUsIDB4MmRhY2VlMTEpLAorICAgIFdUQ1AoMHg3NzZjNGVkYiwgMHgyZTExMGE2MiksIFdUQ1AoMHg3NzQ1OGQ0MCwgMHgyZTc1MDY1ZSksCisgICAgV1RDUCgweDc3MWU3N2YwLCAweDJlZDhlMWMwKSwgV1RDUCgweDc2ZjcwZjA1LCAweDJmM2M5YzQwKSwKKyAgICBXVENQKDB4NzZjZjUyOWMsIDB4MmZhMDM1OTkpLCBXVENQKDB4NzZhNzQyZDEsIDB4MzAwM2FkODUpLAorICAgIFdUQ1AoMHg3NjdlZGZiZSwgMHgzMDY3MDNiZiksIFdUQ1AoMHg3NjU2Mjk4MiwgMHgzMGNhMzgwMCksCisgICAgV1RDUCgweDc2MmQyMDM4LCAweDMxMmQ0YTAzKSwgV1RDUCgweDc2MDNjM2ZkLCAweDMxOTAzOTgyKSwKKyAgICBXVENQKDB4NzVkYTE0ZWYsIDB4MzFmMzA2MzgpLCBXVENQKDB4NzViMDEzMjksIDB4MzI1NWFmZTApLAorICAgIFdUQ1AoMHg3NTg1YmVjYiwgMHgzMmI4MzYzNCksIFdUQ1AoMHg3NTViMTdmMiwgMHgzMzFhOThlZiksCisgICAgV1RDUCgweDc1MzAxZWJiLCAweDMzN2NkN2NkKSwgV1RDUCgweDc1MDRkMzQ1LCAweDMzZGVmMjg3KSwKKyAgICBXVENQKDB4NzRkOTM1YWUsIDB4MzQ0MGU4ZGEpLCBXVENQKDB4NzRhZDQ2MTUsIDB4MzRhMmJhODEpLAorICAgIFdUQ1AoMHg3NDgxMDQ5OSwgMHgzNTA0NjczNiksIFdUQ1AoMHg3NDU0NzE1OCwgMHgzNTY1ZWViNiksCisgICAgV1RDUCgweDc0Mjc4YzcyLCAweDM1Yzc1MGJjKSwgV1RDUCgweDczZmE1NjA3LCAweDM2Mjg4ZDAzKSwKKyAgICBXVENQKDB4NzNjY2NlMzYsIDB4MzY4OWEzNDgpLCBXVENQKDB4NzM5ZWY1MWYsIDB4MzZlYTkzNDYpLAorICAgIFdUQ1AoMHg3MzcwY2FlMiwgMHgzNzRiNWNiOSksIFdUQ1AoMHg3MzQyNGZhMCwgMHgzN2FiZmY1ZCksCisgICAgV1RDUCgweDczMTM4Mzc5LCAweDM4MGM3YWVlKSwgV1RDUCgweDcyZTQ2NjhmLCAweDM4NmNjZjJhKSwKKyAgICBXVENQKDB4NzJiNGY5MDIsIDB4MzhjY2ZiY2IpLCBXVENQKDB4NzI4NTNhZjMsIDB4MzkyZDAwOGYpLAorICAgIFdUQ1AoMHg3MjU1MmM4NSwgMHgzOThjZGQzMiksIFdUQ1AoMHg3MjI0Y2RkOCwgMHgzOWVjOTE3MiksCisgICAgV1RDUCgweDcxZjQxZjBmLCAweDNhNGMxZDA5KSwgV1RDUCgweDcxYzMyMDRjLCAweDNhYWI3ZmI3KSwKKyAgICBXVENQKDB4NzE5MWQxYjEsIDB4M2IwYWI5MzcpLCBXVENQKDB4NzE2MDMzNjEsIDB4M2I2OWM5NDcpLAorICAgIFdUQ1AoMHg3MTJlNDU3ZiwgMHgzYmM4YWZhNSksIFdUQ1AoMHg3MGZjMDgyZCwgMHgzYzI3NmMwZCksCisgICAgV1RDUCgweDcwYzk3YjkwLCAweDNjODVmZTNkKSwgV1RDUCgweDcwOTY5ZmNhLCAweDNjZTQ2NWYzKSwKKyAgICBXVENQKDB4NzA2Mzc0ZmYsIDB4M2Q0MmEyZWMpLCBXVENQKDB4NzAyZmZiNTQsIDB4M2RhMGI0ZTcpLAorICAgIFdUQ1AoMHg2ZmZjMzJlYiwgMHgzZGZlOWJhMSksIFdUQ1AoMHg2ZmM4MWJlYSwgMHgzZTVjNTZkOCksCisgICAgV1RDUCgweDZmOTNiNjc2LCAweDNlYjllNjRiKSwgV1RDUCgweDZmNWYwMmIyLCAweDNmMTc0OWI4KSwKKyAgICBXVENQKDB4NmYyYTAwYzQsIDB4M2Y3NDgwZGQpLCBXVENQKDB4NmVmNGIwZDEsIDB4M2ZkMThiN2EpLAorICAgIFdUQ1AoMHg2ZWJmMTJmZiwgMHg0MDJlNjk0YyksIFdUQ1AoMHg2ZTg5Mjc3MiwgMHg0MDhiMWExMiksCisgICAgV1RDUCgweDZlNTJlZTUyLCAweDQwZTc5ZDhjKSwgV1RDUCgweDZlMWM2N2M0LCAweDQxNDNmMzc5KSwKKyAgICBXVENQKDB4NmRlNTkzZWUsIDB4NDFhMDFiOTcpLCBXVENQKDB4NmRhZTcyZjcsIDB4NDFmYzE1YTYpLAorICAgIFdUQ1AoMHg2ZDc3MDUwNiwgMHg0MjU3ZTE2NiksIFdUQ1AoMHg2ZDNmNGE0MCwgMHg0MmIzN2U5NiksCisgICAgV1RDUCgweDZkMDc0MmNmLCAweDQzMGVlY2Y2KSwgV1RDUCgweDZjY2VlZWQ4LCAweDQzNmEyYzQ1KSwKKyAgICBXVENQKDB4NmM5NjRlODMsIDB4NDNjNTNjNDQpLCBXVENQKDB4NmM1ZDYxZjksIDB4NDQyMDFjYjIpLAorICAgIFdUQ1AoMHg2YzI0Mjk2MCwgMHg0NDdhY2Q1MCksIFdUQ1AoMHg2YmVhYTRlMiwgMHg0NGQ1NGRkZiksCisgICAgV1RDUCgweDZiYjBkNGE3LCAweDQ1MmY5ZTFlKSwgV1RDUCgweDZiNzZiOGQ2LCAweDQ1ODliZGNmKSwKKyAgICBXVENQKDB4NmIzYzUxOWEsIDB4NDVlM2FjYjEpLCBXVENQKDB4NmIwMTlmMWEsIDB4NDYzZDZhODcpLAorICAgIFdUQ1AoMHg2YWM2YTE4MCwgMHg0Njk2ZjcxMCksIFdUQ1AoMHg2YThiNThmNiwgMHg0NmYwNTIwZiksCisgICAgV1RDUCgweDZhNGZjNWE2LCAweDQ3NDk3YjQ0KSwgV1RDUCgweDZhMTNlN2I4LCAweDQ3YTI3MjcxKSwKKyAgICBXVENQKDB4NjlkN2JmNTcsIDB4NDdmYjM3NTcpLCBXVENQKDB4Njk5YjRjYWQsIDB4NDg1M2M5YjkpLAorICAgIFdUQ1AoMHg2OTVlOGZlNSwgMHg0OGFjMjk1NyksIFdUQ1AoMHg2OTIxODkyOSwgMHg0OTA0NTVmNCksCisgICAgV1RDUCgweDY4ZTQzOGE0LCAweDQ5NWM0ZjUyKSwgV1RDUCgweDY4YTY5ZTgxLCAweDQ5YjQxNTMzKSwKKyAgICBXVENQKDB4Njg2OGJhZWMsIDB4NGEwYmE3NWIpLCBXVENQKDB4NjgyYThlMGYsIDB4NGE2MzA1OGEpLAorICAgIFdUQ1AoMHg2N2VjMTgxNywgMHg0YWJhMmY4NCksIFdUQ1AoMHg2N2FkNTkyZiwgMHg0YjExMjUwYyksCisgICAgV1RDUCgweDY3NmU1MTgzLCAweDRiNjdlNWU0KSwgV1RDUCgweDY3MmYwMTNmLCAweDRiYmU3MWQxKSwKKyAgICBXVENQKDB4NjZlZjY4OTEsIDB4NGMxNGM4OTQpLCBXVENQKDB4NjZhZjg3YTQsIDB4NGM2YWU5ZjIpLAorICAgIFdUQ1AoMHg2NjZmNWVhNiwgMHg0Y2MwZDVhZSksIFdUQ1AoMHg2NjJlZWRjMywgMHg0ZDE2OGI4YiksCisgICAgV1RDUCgweDY1ZWUzNTI5LCAweDRkNmMwYjRlKSwgV1RDUCgweDY1YWQzNTA1LCAweDRkYzE1NGJiKSwKKyAgICBXVENQKDB4NjU2YmVkODQsIDB4NGUxNjY3OTUpLCBXVENQKDB4NjUyYTVlZDYsIDB4NGU2YjQzYTIpLAorICAgIFdUQ1AoMHg2NGU4ODkyNiwgMHg0ZWJmZThhNSksIFdUQ1AoMHg2NGE2NmNhNSwgMHg0ZjE0NTY2MiksCisgICAgV1RDUCgweDY0NjQwOTdmLCAweDRmNjg4Y2EwKSwgV1RDUCgweDY0MjE1ZmU1LCAweDRmYmM4YjIyKSwKKyAgICBXVENQKDB4NjNkZTcwMDMsIDB4NTAxMDUxYWUpLCBXVENQKDB4NjM5YjNhMGIsIDB4NTA2M2UwMDgpLAorICAgIFdUQ1AoMHg2MzU3YmUyYSwgMHg1MGI3MzVmOCksIFdUQ1AoMHg2MzEzZmM5MCwgMHg1MTBhNTM0MCksCisgICAgV1RDUCgweDYyY2ZmNTZjLCAweDUxNWQzN2E5KSwgV1RDUCgweDYyOGJhOGVmLCAweDUxYWZlMmY2KSwKKyAgICBXVENQKDB4NjI0NzE3NDksIDB4NTIwMjU0ZWYpLCBXVENQKDB4NjIwMjQwYTgsIDB4NTI1NDhkNTkpLAorICAgIFdUQ1AoMHg2MWJkMjUzZiwgMHg1MmE2OGJmYiksIFdUQ1AoMHg2MTc3YzUzYywgMHg1MmY4NTA5YiksCisgICAgV1RDUCgweDYxMzIyMGQyLCAweDUzNDlkYWZmKSwgV1RDUCgweDYwZWMzODMwLCAweDUzOWIyYWYwKSwKKyAgICBXVENQKDB4NjBhNjBiODgsIDB4NTNlYzQwMzIpLCBXVENQKDB4NjA1ZjliMGIsIDB4NTQzZDFhOGUpLAorICAgIFdUQ1AoMHg2MDE4ZTZlYiwgMHg1NDhkYjljYiksIFdUQ1AoMHg1ZmQxZWY1OSwgMHg1NGRlMWRiMSksCisgICAgV1RDUCgweDVmOGFiNDg3LCAweDU1MmU0NjA1KSwgV1RDUCgweDVmNDMzNmE3LCAweDU1N2UzMjkyKSwKKyAgICBXVENQKDB4NWVmYjc1ZWEsIDB4NTVjZGUzMWUpLCBXVENQKDB4NWViMzcyODUsIDB4NTYxZDU3NzEpLAorICAgIFdUQ1AoMHg1ZTZiMmNhOCwgMHg1NjZjOGY1NSksIFdUQ1AoMHg1ZTIyYTQ4NywgMHg1NmJiOGE5MCksCisgICAgV1RDUCgweDVkZDlkYTU1LCAweDU3MGE0OGVjKSwgV1RDUCgweDVkOTBjZTQ1LCAweDU3NThjYTMxKSwKKyAgICBXVENQKDB4NWQ0NzgwOGEsIDB4NTdhNzBlMjkpLCBXVENQKDB4NWNmZGYxNTcsIDB4NTdmNTE0OWQpLAorICAgIFdUQ1AoMHg1Y2I0MjBlMCwgMHg1ODQyZGQ1NCksIFdUQ1AoMHg1YzZhMGY1OSwgMHg1ODkwNjgxYSksCisgICAgV1RDUCgweDVjMWZiY2Y2LCAweDU4ZGRiNGI4KSwgV1RDUCgweDViZDUyOWViLCAweDU5MmFjMmY3KSwKKyAgICBXVENQKDB4NWI4YTU2NmMsIDB4NTk3NzkyYTEpLCBXVENQKDB4NWIzZjQyYWUsIDB4NTljNDIzODEpLAorICAgIFdUQ1AoMHg1YWYzZWVlNiwgMHg1YTEwNzU2MSksIFdUQ1AoMHg1YWE4NWI0OCwgMHg1YTVjODgwYSksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzUxMltdID0geworICAgIFdUQ1AoMHg3ZmZmZjYyMSwgMHgwMDMyNDNmNSksIFdUQ1AoMHg3ZmZmYTcyYywgMHgwMDk2Y2JjMSksCisgICAgV1RDUCgweDdmZmYwOTQzLCAweDAwZmI1MzMwKSwgV1RDUCgweDdmZmUxYzY1LCAweDAxNWZkYTAzKSwKKyAgICBXVENQKDB4N2ZmY2UwOTMsIDB4MDFjNDVmZmUpLCBXVENQKDB4N2ZmYjU1Y2UsIDB4MDIyOGU0ZTIpLAorICAgIFdUQ1AoMHg3ZmY5N2MxOCwgMHgwMjhkNjg3MCksIFdUQ1AoMHg3ZmY3NTM3MCwgMHgwMmYxZWE2YyksCisgICAgV1RDUCgweDdmZjRkYmQ5LCAweDAzNTY2YTk2KSwgV1RDUCgweDdmZjIxNTUzLCAweDAzYmFlOGIyKSwKKyAgICBXVENQKDB4N2ZlZWZmZTEsIDB4MDQxZjY0ODApLCBXVENQKDB4N2ZlYjliODUsIDB4MDQ4M2RkYzMpLAorICAgIFdUQ1AoMHg3ZmU3ZTg0MSwgMHgwNGU4NTQzZSksIFdUQ1AoMHg3ZmUzZTYxNiwgMHgwNTRjYzdiMSksCisgICAgV1RDUCgweDdmZGY5NTA4LCAweDA1YjEzN2RmKSwgV1RDUCgweDdmZGFmNTE5LCAweDA2MTVhNDhiKSwKKyAgICBXVENQKDB4N2ZkNjA2NGMsIDB4MDY3YTBkNzYpLCBXVENQKDB4N2ZkMGM4YTMsIDB4MDZkZTcyNjIpLAorICAgIFdUQ1AoMHg3ZmNiM2MyMywgMHgwNzQyZDMxMSksIFdUQ1AoMHg3ZmM1NjBjZiwgMHgwN2E3MmY0NSksCisgICAgV1RDUCgweDdmYmYzNmFhLCAweDA4MGI4NmMyKSwgV1RDUCgweDdmYjhiZGI4LCAweDA4NmZkOTQ3KSwKKyAgICBXVENQKDB4N2ZiMWY1ZmMsIDB4MDhkNDI2OTkpLCBXVENQKDB4N2ZhYWRmN2MsIDB4MDkzODZlNzgpLAorICAgIFdUQ1AoMHg3ZmEzN2EzYywgMHgwOTljYjBhNyksIFdUQ1AoMHg3ZjliYzY0MCwgMHgwYTAwZWNlOCksCisgICAgV1RDUCgweDdmOTNjMzhjLCAweDBhNjUyMmZlKSwgV1RDUCgweDdmOGI3MjI3LCAweDBhYzk1MmFhKSwKKyAgICBXVENQKDB4N2Y4MmQyMTQsIDB4MGIyZDdiYWYpLCBXVENQKDB4N2Y3OWUzNWEsIDB4MGI5MTlkY2YpLAorICAgIFdUQ1AoMHg3ZjcwYTVmZSwgMHgwYmY1YjhjYiksIFdUQ1AoMHg3ZjY3MWEwNSwgMHgwYzU5Y2M2OCksCisgICAgV1RDUCgweDdmNWQzZjc1LCAweDBjYmRkODY1KSwgV1RDUCgweDdmNTMxNjU1LCAweDBkMjFkYzg3KSwKKyAgICBXVENQKDB4N2Y0ODllYWEsIDB4MGQ4NWQ4OGYpLCBXVENQKDB4N2YzZGQ4N2MsIDB4MGRlOWNjNDApLAorICAgIFdUQ1AoMHg3ZjMyYzNkMSwgMHgwZTRkYjc1YiksIFdUQ1AoMHg3ZjI3NjBhZiwgMHgwZWIxOTlhNCksCisgICAgV1RDUCgweDdmMWJhZjFlLCAweDBmMTU3MmRjKSwgV1RDUCgweDdmMGZhZjI1LCAweDBmNzk0MmM3KSwKKyAgICBXVENQKDB4N2YwMzYwY2IsIDB4MGZkZDA5MjYpLCBXVENQKDB4N2VmNmM0MTgsIDB4MTA0MGM1YmIpLAorICAgIFdUQ1AoMHg3ZWU5ZDkxNCwgMHgxMGE0Nzg0YiksIFdUQ1AoMHg3ZWRjOWZjNiwgMHgxMTA4MjA5NiksCisgICAgV1RDUCgweDdlY2YxODM3LCAweDExNmJiZTYwKSwgV1RDUCgweDdlYzE0MjcwLCAweDExY2Y1MTZhKSwKKyAgICBXVENQKDB4N2ViMzFlNzgsIDB4MTIzMmQ5NzkpLCBXVENQKDB4N2VhNGFjNTgsIDB4MTI5NjU2NGQpLAorICAgIFdUQ1AoMHg3ZTk1ZWMxYSwgMHgxMmY5YzdhYSksIFdUQ1AoMHg3ZTg2ZGRjNiwgMHgxMzVkMmQ1MyksCisgICAgV1RDUCgweDdlNzc4MTY2LCAweDEzYzA4NzBhKSwgV1RDUCgweDdlNjdkNzAzLCAweDE0MjNkNDkyKSwKKyAgICBXVENQKDB4N2U1N2RlYTcsIDB4MTQ4NzE1YWUpLCBXVENQKDB4N2U0Nzk4NWIsIDB4MTRlYTRhMWYpLAorICAgIFdUQ1AoMHg3ZTM3MDQyYSwgMHgxNTRkNzFhYSksIFdUQ1AoMHg3ZTI2MjIxZiwgMHgxNWIwOGMxMiksCisgICAgV1RDUCgweDdlMTRmMjQyLCAweDE2MTM5OTE4KSwgV1RDUCgweDdlMDM3NGEwLCAweDE2NzY5ODdmKSwKKyAgICBXVENQKDB4N2RmMWE5NDIsIDB4MTZkOThhMGMpLCBXVENQKDB4N2RkZjkwMzQsIDB4MTczYzZkODApLAorICAgIFdUQ1AoMHg3ZGNkMjk4MSwgMHgxNzlmNDI5ZiksIFdUQ1AoMHg3ZGJhNzUzNCwgMHgxODAyMDkyYyksCisgICAgV1RDUCgweDdkYTc3MzU5LCAweDE4NjRjMGVhKSwgV1RDUCgweDdkOTQyM2ZjLCAweDE4Yzc2OTliKSwKKyAgICBXVENQKDB4N2Q4MDg3MjgsIDB4MTkyYTAzMDQpLCBXVENQKDB4N2Q2YzljZTksIDB4MTk4YzhjZTcpLAorICAgIFdUQ1AoMHg3ZDU4NjU0ZCwgMHgxOWVmMDcwNyksIFdUQ1AoMHg3ZDQzZTA1ZSwgMHgxYTUxNzEyOCksCisgICAgV1RDUCgweDdkMmYwZTJiLCAweDFhYjNjYjBkKSwgV1RDUCgweDdkMTllZWJmLCAweDFiMTYxNDc5KSwKKyAgICBXVENQKDB4N2QwNDgyMjgsIDB4MWI3ODRkMzApLCBXVENQKDB4N2NlZWM4NzMsIDB4MWJkYTc0ZjYpLAorICAgIFdUQ1AoMHg3Y2Q4YzFhZSwgMHgxYzNjOGI4YyksIFdUQ1AoMHg3Y2MyNmRlNSwgMHgxYzllOTBiOCksCisgICAgV1RDUCgweDdjYWJjZDI4LCAweDFkMDA4NDNkKSwgV1RDUCgweDdjOTRkZjgzLCAweDFkNjI2NWRkKSwKKyAgICBXVENQKDB4N2M3ZGE1MDUsIDB4MWRjNDM1NWUpLCBXVENQKDB4N2M2NjFkYmMsIDB4MWUyNWYyODIpLAorICAgIFdUQ1AoMHg3YzRlNDliNywgMHgxZTg3OWQwZCksIFdUQ1AoMHg3YzM2MjkwNCwgMHgxZWU5MzRjMyksCisgICAgV1RDUCgweDdjMWRiYmIzLCAweDFmNGFiOTY4KSwgV1RDUCgweDdjMDUwMWQyLCAweDFmYWMyYWJmKSwKKyAgICBXVENQKDB4N2JlYmZiNzAsIDB4MjAwZDg4OGQpLCBXVENQKDB4N2JkMmE4OWUsIDB4MjA2ZWQyOTUpLAorICAgIFdUQ1AoMHg3YmI5MDk2YiwgMHgyMGQwMDg5YyksIFdUQ1AoMHg3YjlmMWRlNiwgMHgyMTMxMmE2NSksCisgICAgV1RDUCgweDdiODRlNjFmLCAweDIxOTIzN2I1KSwgV1RDUCgweDdiNmE2MjI3LCAweDIxZjMzMDRmKSwKKyAgICBXVENQKDB4N2I0ZjkyMGUsIDB4MjI1NDEzZjgpLCBXVENQKDB4N2IzNDc1ZTUsIDB4MjJiNGUyNzQpLAorICAgIFdUQ1AoMHg3YjE5MGRiYywgMHgyMzE1OWI4OCksIFdUQ1AoMHg3YWZkNTlhNCwgMHgyMzc2M2VmNyksCisgICAgV1RDUCgweDdhZTE1OWFlLCAweDIzZDZjYzg3KSwgV1RDUCgweDdhYzUwZGVjLCAweDI0Mzc0M2ZhKSwKKyAgICBXVENQKDB4N2FhODc2NmYsIDB4MjQ5N2E1MTcpLCBXVENQKDB4N2E4YjkzNDgsIDB4MjRmN2VmYTIpLAorICAgIFdUQ1AoMHg3YTZlNjQ4YSwgMHgyNTU4MjM1ZiksIFdUQ1AoMHg3YTUwZWE0NywgMHgyNWI4NDAxMiksCisgICAgV1RDUCgweDdhMzMyNDkwLCAweDI2MTg0NTgxKSwgV1RDUCgweDdhMTUxMzc4LCAweDI2NzgzMzcwKSwKKyAgICBXVENQKDB4NzlmNmI3MTEsIDB4MjZkODA5YTUpLCBXVENQKDB4NzlkODBmNmYsIDB4MjczN2M3ZTMpLAorICAgIFdUQ1AoMHg3OWI5MWNhNCwgMHgyNzk3NmRmMSksIFdUQ1AoMHg3OTk5ZGVjNCwgMHgyN2Y2ZmI5MiksCisgICAgV1RDUCgweDc5N2E1NWUwLCAweDI4NTY3MDhkKSwgV1RDUCgweDc5NWE4MjBlLCAweDI4YjVjY2E1KSwKKyAgICBXVENQKDB4NzkzYTYzNjEsIDB4MjkxNTBmYTEpLCBXVENQKDB4NzkxOWY5ZWMsIDB4Mjk3NDM5NDYpLAorICAgIFdUQ1AoMHg3OGY5NDVjMywgMHgyOWQzNDk1OCksIFdUQ1AoMHg3OGQ4NDZmYiwgMHgyYTMyM2Y5ZSksCisgICAgV1RDUCgweDc4YjZmZGE4LCAweDJhOTExYmRjKSwgV1RDUCgweDc4OTU2OWRmLCAweDJhZWZkZGQ4KSwKKyAgICBXVENQKDB4Nzg3MzhiYjMsIDB4MmI0ZTg1NTgpLCBXVENQKDB4Nzg1MTYzM2IsIDB4MmJhZDEyMjEpLAorICAgIFdUQ1AoMHg3ODJlZjA4YiwgMHgyYzBiODNmYSksIFdUQ1AoMHg3ODBjMzNiOCwgMHgyYzY5ZGFhNiksCisgICAgV1RDUCgweDc3ZTkyY2Q5LCAweDJjYzgxNWVlKSwgV1RDUCgweDc3YzVkYzAxLCAweDJkMjYzNTk2KSwKKyAgICBXVENQKDB4NzdhMjQxNDgsIDB4MmQ4NDM5NjQpLCBXVENQKDB4Nzc3ZTVjYzMsIDB4MmRlMjIxMWUpLAorICAgIFdUQ1AoMHg3NzVhMmU4OSwgMHgyZTNmZWM4YiksIFdUQ1AoMHg3NzM1YjZhZiwgMHgyZTlkOWI3MCksCisgICAgV1RDUCgweDc3MTBmNTRjLCAweDJlZmIyZDk1KSwgV1RDUCgweDc2ZWJlYTc3LCAweDJmNThhMmJlKSwKKyAgICBXVENQKDB4NzZjNjk2NDcsIDB4MmZiNWZhYjIpLCBXVENQKDB4NzZhMGY4ZDIsIDB4MzAxMzM1MzkpLAorICAgIFdUQ1AoMHg3NjdiMTIzMSwgMHgzMDcwNTIxNyksIFdUQ1AoMHg3NjU0ZTI3OSwgMHgzMGNkNTExNSksCisgICAgV1RDUCgweDc2MmU2OWM0LCAweDMxMmEzMWY4KSwgV1RDUCgweDc2MDdhODI4LCAweDMxODZmNDg3KSwKKyAgICBXVENQKDB4NzVlMDlkYmQsIDB4MzFlMzk4ODkpLCBXVENQKDB4NzViOTRhOWMsIDB4MzI0MDFkYzYpLAorICAgIFdUQ1AoMHg3NTkxYWVkZCwgMHgzMjljODQwMiksIFdUQ1AoMHg3NTY5Y2E5OSwgMHgzMmY4Y2IwNyksCisgICAgV1RDUCgweDc1NDE5ZGU3LCAweDMzNTRmMjliKSwgV1RDUCgweDc1MTkyOGUwLCAweDMzYjBmYTg0KSwKKyAgICBXVENQKDB4NzRmMDZiOWUsIDB4MzQwY2UyOGIpLCBXVENQKDB4NzRjNzY2M2EsIDB4MzQ2OGFhNzYpLAorICAgIFdUQ1AoMHg3NDllMThjZCwgMHgzNGM0NTIwZCksIFdUQ1AoMHg3NDc0ODM3MSwgMHgzNTFmZDkxOCksCisgICAgV1RDUCgweDc0NGFhNjNmLCAweDM1N2IzZjVkKSwgV1RDUCgweDc0MjA4MTUwLCAweDM1ZDY4NGE2KSwKKyAgICBXVENQKDB4NzNmNjE0YzAsIDB4MzYzMWE4YjgpLCBXVENQKDB4NzNjYjYwYTgsIDB4MzY4Y2FiNWMpLAorICAgIFdUQ1AoMHg3M2EwNjUyMiwgMHgzNmU3OGM1YiksIFdUQ1AoMHg3Mzc1MjI0OSwgMHgzNzQyNGI3YiksCisgICAgV1RDUCgweDczNDk5ODM4LCAweDM3OWNlODg1KSwgV1RDUCgweDczMWRjNzBhLCAweDM3Zjc2MzQxKSwKKyAgICBXVENQKDB4NzJmMWFlZDksIDB4Mzg1MWJiNzcpLCBXVENQKDB4NzJjNTRmYzEsIDB4MzhhYmYwZWYpLAorICAgIFdUQ1AoMHg3Mjk4YTlkZCwgMHgzOTA2MDM3MyksIFdUQ1AoMHg3MjZiYmQ0OCwgMHgzOTVmZjJjOSksCisgICAgV1RDUCgweDcyM2U4YTIwLCAweDM5YjliZWJjKSwgV1RDUCgweDcyMTExMDdlLCAweDNhMTM2NzEyKSwKKyAgICBXVENQKDB4NzFlMzUwODAsIDB4M2E2Y2ViOTYpLCBXVENQKDB4NzFiNTRhNDEsIDB4M2FjNjRjMGYpLAorICAgIFdUQ1AoMHg3MTg2ZmRkZSwgMHgzYjFmODg0OCksIFdUQ1AoMHg3MTU4NmI3NCwgMHgzYjc4YTAwNyksCisgICAgV1RDUCgweDcxMjk5MzFmLCAweDNiZDE5MzE4KSwgV1RDUCgweDcwZmE3NGZjLCAweDNjMmE2MTQyKSwKKyAgICBXVENQKDB4NzBjYjExMjgsIDB4M2M4MzBhNTApLCBXVENQKDB4NzA5YjY3YzAsIDB4M2NkYjhlMDkpLAorICAgIFdUQ1AoMHg3MDZiNzhlMywgMHgzZDMzZWMzOSksIFdUQ1AoMHg3MDNiNDRhZCwgMHgzZDhjMjRhOCksCisgICAgV1RDUCgweDcwMGFjYjNjLCAweDNkZTQzNzFmKSwgV1RDUCgweDZmZGEwY2FlLCAweDNlM2MyMzY5KSwKKyAgICBXVENQKDB4NmZhOTA5MjEsIDB4M2U5M2U5NTApLCBXVENQKDB4NmY3N2MwYjMsIDB4M2VlYjg4OWMpLAorICAgIFdUQ1AoMHg2ZjQ2MzM4MywgMHgzZjQzMDExOSksIFdUQ1AoMHg2ZjE0NjFiMCwgMHgzZjlhNTI5MCksCisgICAgV1RDUCgweDZlZTI0YjU3LCAweDNmZjE3Y2NhKSwgV1RDUCgweDZlYWZmMDk5LCAweDQwNDg3Zjk0KSwKKyAgICBXVENQKDB4NmU3ZDUxOTMsIDB4NDA5ZjVhYjYpLCBXVENQKDB4NmU0YTZlNjYsIDB4NDBmNjBkZmIpLAorICAgIFdUQ1AoMHg2ZTE3NDczMCwgMHg0MTRjOTkyZiksIFdUQ1AoMHg2ZGUzZGMxMSwgMHg0MWEyZmMxYSksCisgICAgV1RDUCgweDZkYjAyZDI5LCAweDQxZjkzNjg5KSwgV1RDUCgweDZkN2MzYTk4LCAweDQyNGY0ODQ1KSwKKyAgICBXVENQKDB4NmQ0ODA0N2UsIDB4NDJhNTMxMWIpLCBXVENQKDB4NmQxMzhhZmIsIDB4NDJmYWYwZDQpLAorICAgIFdUQ1AoMHg2Y2RlY2UyZiwgMHg0MzUwODczYyksIFdUQ1AoMHg2Y2E5Y2UzYiwgMHg0M2E1ZjQxZSksCisgICAgV1RDUCgweDZjNzQ4YjNmLCAweDQzZmIzNzQ2KSwgV1RDUCgweDZjM2YwNTVkLCAweDQ0NTA1MDdlKSwKKyAgICBXVENQKDB4NmMwOTNjYjYsIDB4NDRhNTNmOTMpLCBXVENQKDB4NmJkMzMxNmEsIDB4NDRmYTA0NTApLAorICAgIFdUQ1AoMHg2YjljZTM5YiwgMHg0NTRlOWU4MCksIFdUQ1AoMHg2YjY2NTM2YiwgMHg0NWEzMGRmMCksCisgICAgV1RDUCgweDZiMmY4MGZiLCAweDQ1Zjc1MjZiKSwgV1RDUCgweDZhZjg2YzZjLCAweDQ2NGI2YmJlKSwKKyAgICBXVENQKDB4NmFjMTE1ZTIsIDB4NDY5ZjU5YjQpLCBXVENQKDB4NmE4OTdkN2QsIDB4NDZmMzFjMWEpLAorICAgIFdUQ1AoMHg2YTUxYTM2MSwgMHg0NzQ2YjJiYyksIFdUQ1AoMHg2YTE5ODdiMCwgMHg0NzlhMWQ2NyksCisgICAgV1RDUCgweDY5ZTEyYThjLCAweDQ3ZWQ1YmU2KSwgV1RDUCgweDY5YTg4YzE5LCAweDQ4NDA2ZTA4KSwKKyAgICBXVENQKDB4Njk2ZmFjNzgsIDB4NDg5MzUzOTcpLCBXVENQKDB4NjkzNjhiY2UsIDB4NDhlNjBjNjIpLAorICAgIFdUQ1AoMHg2OGZkMmEzZCwgMHg0OTM4OTgzNiksIFdUQ1AoMHg2OGMzODdlOSwgMHg0OThhZjZkZiksCisgICAgV1RDUCgweDY4ODlhNGY2LCAweDQ5ZGQyODJhKSwgV1RDUCgweDY4NGY4MTg2LCAweDRhMmYyYmU2KSwKKyAgICBXVENQKDB4NjgxNTFkYmUsIDB4NGE4MTAxZGUpLCBXVENQKDB4NjdkYTc5YzMsIDB4NGFkMmE5ZTIpLAorICAgIFdUQ1AoMHg2NzlmOTViNywgMHg0YjI0MjNiZSksIFdUQ1AoMHg2NzY0NzFjMCwgMHg0Yjc1NmY0MCksCisgICAgV1RDUCgweDY3MjkwZTAyLCAweDRiYzY4YzM2KSwgV1RDUCgweDY2ZWQ2YWExLCAweDRjMTc3YTZlKSwKKyAgICBXVENQKDB4NjZiMTg3YzMsIDB4NGM2ODM5YjcpLCBXVENQKDB4NjY3NTY1OGMsIDB4NGNiOGM5ZGQpLAorICAgIFdUQ1AoMHg2NjM5MDQyMiwgMHg0ZDA5MmFiMCksIFdUQ1AoMHg2NWZjNjNhOSwgMHg0ZDU5NWJmZSksCisgICAgV1RDUCgweDY1YmY4NDQ3LCAweDRkYTk1ZDk2KSwgV1RDUCgweDY1ODI2NjIyLCAweDRkZjkyZjQ2KSwKKyAgICBXVENQKDB4NjU0NTA5NWYsIDB4NGU0OGQwZGQpLCBXVENQKDB4NjUwNzZlMjUsIDB4NGU5ODQyMjkpLAorICAgIFdUQ1AoMHg2NGM5OTQ5OCwgMHg0ZWU3ODJmYiksIFdUQ1AoMHg2NDhiN2NlMCwgMHg0ZjM2OTMyMCksCisgICAgV1RDUCgweDY0NGQyNzIyLCAweDRmODU3MjY5KSwgV1RDUCgweDY0MGU5Mzg2LCAweDRmZDQyMGE0KSwKKyAgICBXVENQKDB4NjNjZmMyMzEsIDB4NTAyMjlkYTEpLCBXVENQKDB4NjM5MGIzNGEsIDB4NTA3MGU5MmYpLAorICAgIFdUQ1AoMHg2MzUxNjZmOSwgMHg1MGJmMDMxZiksIFdUQ1AoMHg2MzExZGQ2NCwgMHg1MTBjZWI0MCksCisgICAgV1RDUCgweDYyZDIxNmIzLCAweDUxNWFhMTYyKSwgV1RDUCgweDYyOTIxMzBjLCAweDUxYTgyNTU1KSwKKyAgICBXVENQKDB4NjI1MWQyOTgsIDB4NTFmNTc2ZWEpLCBXVENQKDB4NjIxMTU1N2UsIDB4NTI0Mjk1ZjApLAorICAgIFdUQ1AoMHg2MWQwOWJlNSwgMHg1MjhmODIzOCksIFdUQ1AoMHg2MThmYTVmNywgMHg1MmRjM2I5MiksCisgICAgV1RDUCgweDYxNGU3M2RhLCAweDUzMjhjMWQwKSwgV1RDUCgweDYxMGQwNWI3LCAweDUzNzUxNGMyKSwKKyAgICBXVENQKDB4NjBjYjViYjcsIDB4NTNjMTM0MzkpLCBXVENQKDB4NjA4OTc2MDEsIDB4NTQwZDIwMDUpLAorICAgIFdUQ1AoMHg2MDQ3NTRiZiwgMHg1NDU4ZDdmOSksIFdUQ1AoMHg2MDA0ZjgxOSwgMHg1NGE0NWJlNiksCisgICAgV1RDUCgweDVmYzI2MDM4LCAweDU0ZWZhYjljKSwgV1RDUCgweDVmN2Y4ZDQ2LCAweDU1M2FjNmVlKSwKKyAgICBXVENQKDB4NWYzYzdmNmIsIDB4NTU4NWFkYWQpLCBXVENQKDB4NWVmOTM2ZDEsIDB4NTVkMDVmYWEpLAorICAgIFdUQ1AoMHg1ZWI1YjNhMiwgMHg1NjFhZGNiOSksIFdUQ1AoMHg1ZTcxZjYwNiwgMHg1NjY1MjRhYSksCisgICAgV1RDUCgweDVlMmRmZTI5LCAweDU2YWYzNzUwKSwgV1RDUCgweDVkZTljYzMzLCAweDU2ZjkxNDdlKSwKKyAgICBXVENQKDB4NWRhNTYwNGYsIDB4NTc0MmJjMDYpLCBXVENQKDB4NWQ2MGJhYTcsIDB4NTc4YzJkYmEpLAorICAgIFdUQ1AoMHg1ZDFiZGI2NSwgMHg1N2Q1Njk2ZCksIFdUQ1AoMHg1Y2Q2YzJiNSwgMHg1ODFlNmVmMSksCisgICAgV1RDUCgweDVjOTE3MGJmLCAweDU4NjczZTFiKSwgV1RDUCgweDVjNGJlNWIwLCAweDU4YWZkNmJkKSwKKyAgICBXVENQKDB4NWMwNjIxYjIsIDB4NThmODM4YTkpLCBXVENQKDB4NWJjMDI0ZjAsIDB4NTk0MDYzYjUpLAorICAgIFdUQ1AoMHg1Yjc5ZWY5NiwgMHg1OTg4NTdiMiksIFdUQ1AoMHg1YjMzODFjZSwgMHg1OWQwMTQ3NSksCisgICAgV1RDUCgweDVhZWNkYmM1LCAweDVhMTc5OWQxKSwgV1RDUCgweDVhYTVmZGE1LCAweDVhNWVlNzlhKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBTaW5lV2luZG93NzY4W10gPSB7CisgICAgV1RDUCgweDdmZmZmYjlkLCAweDAwMjE4MmE0KSwgV1RDUCgweDdmZmZkODg2LCAweDAwNjQ4N2UzKSwKKyAgICBXVENQKDB4N2ZmZjkyNTcsIDB4MDBhNzhkMDYpLCBXVENQKDB4N2ZmZjI5MTAsIDB4MDBlYTkxZmMpLAorICAgIFdUQ1AoMHg3ZmZlOWNiMiwgMHgwMTJkOTZiMSksIFdUQ1AoMHg3ZmZkZWQzZCwgMHgwMTcwOWIxMyksCisgICAgV1RDUCgweDdmZmQxYWIyLCAweDAxYjM5ZjExKSwgV1RDUCgweDdmZmMyNTBmLCAweDAxZjZhMjk3KSwKKyAgICBXVENQKDB4N2ZmYjBjNTYsIDB4MDIzOWE1OTMpLCBXVENQKDB4N2ZmOWQwODcsIDB4MDI3Y2E3ZjMpLAorICAgIFdUQ1AoMHg3ZmY4NzFhMiwgMHgwMmJmYTlhNCksIFdUQ1AoMHg3ZmY2ZWZhNywgMHgwMzAyYWE5NSksCisgICAgV1RDUCgweDdmZjU0YTk4LCAweDAzNDVhYWIyKSwgV1RDUCgweDdmZjM4Mjc0LCAweDAzODhhOWVhKSwKKyAgICBXVENQKDB4N2ZmMTk3M2IsIDB4MDNjYmE4MjkpLCBXVENQKDB4N2ZlZjg4ZWYsIDB4MDQwZWE1NWUpLAorICAgIFdUQ1AoMHg3ZmVkNTc5MSwgMHgwNDUxYTE3NyksIFdUQ1AoMHg3ZmViMDMxZiwgMHgwNDk0OWM2MCksCisgICAgV1RDUCgweDdmZTg4YjljLCAweDA0ZDc5NjA4KSwgV1RDUCgweDdmZTVmMTA4LCAweDA1MWE4ZTVjKSwKKyAgICBXVENQKDB4N2ZlMzMzNjQsIDB4MDU1ZDg1NGEpLCBXVENQKDB4N2ZlMDUyYWYsIDB4MDVhMDdhYmYpLAorICAgIFdUQ1AoMHg3ZmRkNGVlYywgMHgwNWUzNmVhOSksIFdUQ1AoMHg3ZmRhMjgxYiwgMHgwNjI2NjBmNiksCisgICAgV1RDUCgweDdmZDZkZTNkLCAweDA2Njk1MTk0KSwgV1RDUCgweDdmZDM3MTUzLCAweDA2YWM0MDZmKSwKKyAgICBXVENQKDB4N2ZjZmUxNWQsIDB4MDZlZjJkNzYpLCBXVENQKDB4N2ZjYzJlNWQsIDB4MDczMjE4OTcpLAorICAgIFdUQ1AoMHg3ZmM4NTg1NCwgMHgwNzc1MDFiZSksIFdUQ1AoMHg3ZmM0NWY0MiwgMHgwN2I3ZThkYSksCisgICAgV1RDUCgweDdmYzA0MzI5LCAweDA3ZmFjZGQ5KSwgV1RDUCgweDdmYmMwNDBhLCAweDA4M2RiMGE3KSwKKyAgICBXVENQKDB4N2ZiN2ExZTYsIDB4MDg4MDkxMzMpLCBXVENQKDB4N2ZiMzFjYmYsIDB4MDhjMzZmNmEpLAorICAgIFdUQ1AoMHg3ZmFlNzQ5NSwgMHgwOTA2NGIzYSksIFdUQ1AoMHg3ZmE5YTk2YSwgMHgwOTQ5MjQ5MSksCisgICAgV1RDUCgweDdmYTRiYjNmLCAweDA5OGJmYjVjKSwgV1RDUCgweDdmOWZhYTE1LCAweDA5Y2VjZjg5KSwKKyAgICBXVENQKDB4N2Y5YTc1ZWYsIDB4MGExMWExMDYpLCBXVENQKDB4N2Y5NTFlY2MsIDB4MGE1NDZmYzApLAorICAgIFdUQ1AoMHg3ZjhmYTRiMCwgMHgwYTk3M2JhNSksIFdUQ1AoMHg3ZjhhMDc5YSwgMHgwYWRhMDRhMyksCisgICAgV1RDUCgweDdmODQ0NzhlLCAweDBiMWNjYWE3KSwgV1RDUCgweDdmN2U2NDhjLCAweDBiNWY4ZDlmKSwKKyAgICBXVENQKDB4N2Y3ODVlOTYsIDB4MGJhMjRkNzkpLCBXVENQKDB4N2Y3MjM1YWQsIDB4MGJlNTBhMjMpLAorICAgIFdUQ1AoMHg3ZjZiZTlkNCwgMHgwYzI3YzM4OSksIFdUQ1AoMHg3ZjY1N2IwYywgMHgwYzZhNzk5YiksCisgICAgV1RDUCgweDdmNWVlOTU3LCAweDBjYWQyYzQ1KSwgV1RDUCgweDdmNTgzNGI3LCAweDBjZWZkYjc2KSwKKyAgICBXVENQKDB4N2Y1MTVkMmQsIDB4MGQzMjg3MWEpLCBXVENQKDB4N2Y0YTYyYmIsIDB4MGQ3NTJmMjApLAorICAgIFdUQ1AoMHg3ZjQzNDU2MywgMHgwZGI3ZDM3NiksIFdUQ1AoMHg3ZjNjMDUyOCwgMHgwZGZhNzQwOSksCisgICAgV1RDUCgweDdmMzRhMjBiLCAweDBlM2QxMGM3KSwgV1RDUCgweDdmMmQxYzBlLCAweDBlN2ZhOTllKSwKKyAgICBXVENQKDB4N2YyNTczMzQsIDB4MGVjMjNlN2IpLCBXVENQKDB4N2YxZGE3N2UsIDB4MGYwNGNmNGMpLAorICAgIFdUQ1AoMHg3ZjE1YjhlZSwgMHgwZjQ3NWJmZiksIFdUQ1AoMHg3ZjBkYTc4NywgMHgwZjg5ZTQ4MiksCisgICAgV1RDUCgweDdmMDU3MzRiLCAweDBmY2M2OGMyKSwgV1RDUCgweDdlZmQxYzNjLCAweDEwMGVlOGFkKSwKKyAgICBXVENQKDB4N2VmNGEyNWQsIDB4MTA1MTY0MzIpLCBXVENQKDB4N2VlYzA1YWYsIDB4MTA5M2RiM2QpLAorICAgIFdUQ1AoMHg3ZWUzNDYzNiwgMHgxMGQ2NGRiZCksIFdUQ1AoMHg3ZWRhNjNmMywgMHgxMTE4YmI5ZiksCisgICAgV1RDUCgweDdlZDE1ZWU5LCAweDExNWIyNGQxKSwgV1RDUCgweDdlYzgzNzFhLCAweDExOWQ4OTQxKSwKKyAgICBXVENQKDB4N2ViZWVjODksIDB4MTFkZmU4ZGMpLCBXVENQKDB4N2ViNTdmMzksIDB4MTIyMjQzOTIpLAorICAgIFdUQ1AoMHg3ZWFiZWYyYywgMHgxMjY0OTk0ZSksIFdUQ1AoMHg3ZWEyM2M2NSwgMHgxMmE2ZWEwMCksCisgICAgV1RDUCgweDdlOTg2NmU2LCAweDEyZTkzNTk0KSwgV1RDUCgweDdlOGU2ZWIyLCAweDEzMmI3YmY5KSwKKyAgICBXVENQKDB4N2U4NDUzY2MsIDB4MTM2ZGJkMWQpLCBXVENQKDB4N2U3YTE2MzYsIDB4MTNhZmY4ZWQpLAorICAgIFdUQ1AoMHg3ZTZmYjVmNCwgMHgxM2YyMmY1OCksIFdUQ1AoMHg3ZTY1MzMwOCwgMHgxNDM0NjA0YSksCisgICAgV1RDUCgweDdlNWE4ZDc1LCAweDE0NzY4YmIzKSwgV1RDUCgweDdlNGZjNTNlLCAweDE0YjhiMTdmKSwKKyAgICBXVENQKDB4N2U0NGRhNjYsIDB4MTRmYWQxOWUpLCBXVENQKDB4N2UzOWNjZjAsIDB4MTUzY2ViZmIpLAorICAgIFdUQ1AoMHg3ZTJlOWNkZiwgMHgxNTdmMDA4NiksIFdUQ1AoMHg3ZTIzNGEzNiwgMHgxNWMxMGYyZCksCisgICAgV1RDUCgweDdlMTdkNGY4LCAweDE2MDMxN2RjKSwgV1RDUCgweDdlMGMzZDI5LCAweDE2NDUxYTgzKSwKKyAgICBXVENQKDB4N2UwMDgyY2IsIDB4MTY4NzE3MGYpLCBXVENQKDB4N2RmNGE1ZTIsIDB4MTZjOTBkNmUpLAorICAgIFdUQ1AoMHg3ZGU4YTY3MCwgMHgxNzBhZmQ4ZCksIFdUQ1AoMHg3ZGRjODQ3YSwgMHgxNzRjZTc1YiksCisgICAgV1RDUCgweDdkZDA0MDAzLCAweDE3OGVjYWM2KSwgV1RDUCgweDdkYzNkOTBkLCAweDE3ZDBhN2JjKSwKKyAgICBXVENQKDB4N2RiNzRmOWQsIDB4MTgxMjdlMmEpLCBXVENQKDB4N2RhYWEzYjUsIDB4MTg1NDRkZmYpLAorICAgIFdUQ1AoMHg3ZDlkZDU1YSwgMHgxODk2MTcyOCksIFdUQ1AoMHg3ZDkwZTQ4ZiwgMHgxOGQ3ZDk5MyksCisgICAgV1RDUCgweDdkODNkMTU2LCAweDE5MTk5NTJmKSwgV1RDUCgweDdkNzY5YmI1LCAweDE5NWI0OWVhKSwKKyAgICBXVENQKDB4N2Q2OTQzYWUsIDB4MTk5Y2Y3YjApLCBXVENQKDB4N2Q1YmM5NDYsIDB4MTlkZTllNzIpLAorICAgIFdUQ1AoMHg3ZDRlMmM3ZiwgMHgxYTIwM2UxYiksIFdUQ1AoMHg3ZDQwNmQ1ZSwgMHgxYTYxZDY5YiksCisgICAgV1RDUCgweDdkMzI4YmU2LCAweDFhYTM2N2RmKSwgV1RDUCgweDdkMjQ4ODFiLCAweDFhZTRmMWQ2KSwKKyAgICBXVENQKDB4N2QxNjYyMDEsIDB4MWIyNjc0NmQpLCBXVENQKDB4N2QwODE5OWMsIDB4MWI2N2VmOTMpLAorICAgIFdUQ1AoMHg3Y2Y5YWVmMCwgMHgxYmE5NjMzNSksIFdUQ1AoMHg3Y2ViMjIwMSwgMHgxYmVhY2Y0MiksCisgICAgV1RDUCgweDdjZGM3MmQzLCAweDFjMmMzM2E3KSwgV1RDUCgweDdjY2RhMTY5LCAweDFjNmQ5MDUzKSwKKyAgICBXVENQKDB4N2NiZWFkYzgsIDB4MWNhZWU1MzQpLCBXVENQKDB4N2NhZjk3ZjQsIDB4MWNmMDMyMzgpLAorICAgIFdUQ1AoMHg3Y2EwNWZmMSwgMHgxZDMxNzc0ZCksIFdUQ1AoMHg3YzkxMDVjMywgMHgxZDcyYjQ2MSksCisgICAgV1RDUCgweDdjODE4OTZmLCAweDFkYjNlOTYyKSwgV1RDUCgweDdjNzFlYWY5LCAweDFkZjUxNjNmKSwKKyAgICBXVENQKDB4N2M2MjJhNjQsIDB4MWUzNjNhZTUpLCBXVENQKDB4N2M1MjQ3YjYsIDB4MWU3NzU3NDMpLAorICAgIFdUQ1AoMHg3YzQyNDJmMiwgMHgxZWI4NmI0NiksIFdUQ1AoMHg3YzMyMWMxZSwgMHgxZWY5NzZkZSksCisgICAgV1RDUCgweDdjMjFkMzNjLCAweDFmM2E3OWY3KSwgV1RDUCgweDdjMTE2ODUzLCAweDFmN2I3NDgxKSwKKyAgICBXVENQKDB4N2MwMGRiNjYsIDB4MWZiYzY2NjkpLCBXVENQKDB4N2JmMDJjN2IsIDB4MWZmZDRmOWUpLAorICAgIFdUQ1AoMHg3YmRmNWI5NCwgMHgyMDNlMzAwZCksIFdUQ1AoMHg3YmNlNjhiOCwgMHgyMDdmMDdhNiksCisgICAgV1RDUCgweDdiYmQ1M2ViLCAweDIwYmZkNjU2KSwgV1RDUCgweDdiYWMxZDMxLCAweDIxMDA5YzBjKSwKKyAgICBXVENQKDB4N2I5YWM0OTAsIDB4MjE0MTU4YjUpLCBXVENQKDB4N2I4OTRhMGIsIDB4MjE4MjBjNDEpLAorICAgIFdUQ1AoMHg3Yjc3YWRhOCwgMHgyMWMyYjY5YyksIFdUQ1AoMHg3YjY1ZWY2YywgMHgyMjAzNTdiNiksCisgICAgV1RDUCgweDdiNTQwZjViLCAweDIyNDNlZjdkKSwgV1RDUCgweDdiNDIwZDdhLCAweDIyODQ3ZGUwKSwKKyAgICBXVENQKDB4N2IyZmU5Y2YsIDB4MjJjNTAyY2IpLCBXVENQKDB4N2IxZGE0NWUsIDB4MjMwNTdlMmUpLAorICAgIFdUQ1AoMHg3YjBiM2QyYywgMHgyMzQ1ZWZmOCksIFdUQ1AoMHg3YWY4YjQzZiwgMHgyMzg2NTgxNiksCisgICAgV1RDUCgweDdhZTYwOTliLCAweDIzYzZiNjc2KSwgV1RDUCgweDdhZDMzZDQ1LCAweDI0MDcwYjA4KSwKKyAgICBXVENQKDB4N2FjMDRmNDQsIDB4MjQ0NzU1YjkpLCBXVENQKDB4N2FhZDNmOWIsIDB4MjQ4Nzk2NzgpLAorICAgIFdUQ1AoMHg3YTlhMGU1MCwgMHgyNGM3Y2QzMyksIFdUQ1AoMHg3YTg2YmI2OCwgMHgyNTA3ZjlkOCksCisgICAgV1RDUCgweDdhNzM0NmU5LCAweDI1NDgxYzU3KSwgV1RDUCgweDdhNWZiMGQ4LCAweDI1ODgzNDlkKSwKKyAgICBXVENQKDB4N2E0YmY5M2EsIDB4MjVjODQyOTkpLCBXVENQKDB4N2EzODIwMTUsIDB4MjYwODQ2MzkpLAorICAgIFdUQ1AoMHg3YTI0MjU2ZiwgMHgyNjQ4M2Y2YyksIFdUQ1AoMHg3YTEwMDk0YywgMHgyNjg4MmUyMSksCisgICAgV1RDUCgweDc5ZmJjYmIyLCAweDI2YzgxMjQ1KSwgV1RDUCgweDc5ZTc2Y2E3LCAweDI3MDdlYmM3KSwKKyAgICBXVENQKDB4NzlkMmVjMzAsIDB4Mjc0N2JhOTUpLCBXVENQKDB4NzliZTRhNTMsIDB4Mjc4NzdlOWYpLAorICAgIFdUQ1AoMHg3OWE5ODcxNSwgMHgyN2M3MzdkMyksIFdUQ1AoMHg3OTk0YTI3ZCwgMHgyODA2ZTYxZiksCisgICAgV1RDUCgweDc5N2Y5YzkwLCAweDI4NDY4OTcxKSwgV1RDUCgweDc5NmE3NTU0LCAweDI4ODYyMWI5KSwKKyAgICBXVENQKDB4Nzk1NTJjY2UsIDB4MjhjNWFlZTUpLCBXVENQKDB4NzkzZmMzMDUsIDB4MjkwNTMwZTMpLAorICAgIFdUQ1AoMHg3OTJhMzdmZSwgMHgyOTQ0YTdhMiksIFdUQ1AoMHg3OTE0OGJiZiwgMHgyOTg0MTMxMSksCisgICAgV1RDUCgweDc4ZmViZTRlLCAweDI5YzM3MzFlKSwgV1RDUCgweDc4ZThjZmIyLCAweDJhMDJjN2I4KSwKKyAgICBXVENQKDB4NzhkMmJmZWYsIDB4MmE0MjEwY2UpLCBXVENQKDB4NzhiYzhmMGQsIDB4MmE4MTRlNGQpLAorICAgIFdUQ1AoMHg3OGE2M2QxMSwgMHgyYWMwODAyNiksIFdUQ1AoMHg3ODhmY2EwMSwgMHgyYWZmYTY0NiksCisgICAgV1RDUCgweDc4NzkzNWU0LCAweDJiM2VjMDljKSwgV1RDUCgweDc4NjI4MGJmLCAweDJiN2RjZjE3KSwKKyAgICBXVENQKDB4Nzg0YmFhOWEsIDB4MmJiY2QxYTYpLCBXVENQKDB4NzgzNGIzN2EsIDB4MmJmYmM4MzcpLAorICAgIFdUQ1AoMHg3ODFkOWI2NSwgMHgyYzNhYjJiOSksIFdUQ1AoMHg3ODA2NjI2MiwgMHgyYzc5OTExYiksCisgICAgV1RDUCgweDc3ZWYwODc3LCAweDJjYjg2MzRiKSwgV1RDUCgweDc3ZDc4ZGFhLCAweDJjZjcyOTM5KSwKKyAgICBXVENQKDB4NzdiZmYyMDMsIDB4MmQzNWUyZDMpLCBXVENQKDB4NzdhODM1ODcsIDB4MmQ3NDkwMDgpLAorICAgIFdUQ1AoMHg3NzkwNTgzZSwgMHgyZGIzMzBjNyksIFdUQ1AoMHg3Nzc4NWEyZCwgMHgyZGYxYzRmZSksCisgICAgV1RDUCgweDc3NjAzYjVhLCAweDJlMzA0YzlkKSwgV1RDUCgweDc3NDdmYmNlLCAweDJlNmVjNzkyKSwKKyAgICBXVENQKDB4NzcyZjliOGUsIDB4MmVhZDM1Y2QpLCBXVENQKDB4NzcxNzFhYTEsIDB4MmVlYjk3M2IpLAorICAgIFdUQ1AoMHg3NmZlNzkwZSwgMHgyZjI5ZWJjYyksIFdUQ1AoMHg3NmU1YjZkYywgMHgyZjY4MzM2ZiksCisgICAgV1RDUCgweDc2Y2NkNDExLCAweDJmYTY2ZTEzKSwgV1RDUCgweDc2YjNkMGI0LCAweDJmZTQ5YmE3KSwKKyAgICBXVENQKDB4NzY5YWFjY2MsIDB4MzAyMmJjMTkpLCBXVENQKDB4NzY4MTY4NWYsIDB4MzA2MGNmNTkpLAorICAgIFdUQ1AoMHg3NjY4MDM3NiwgMHgzMDllZDU1NiksIFdUQ1AoMHg3NjRlN2UxNywgMHgzMGRjY2RmZSksCisgICAgV1RDUCgweDc2MzRkODQ4LCAweDMxMWFiOTQxKSwgV1RDUCgweDc2MWIxMjExLCAweDMxNTg5NzBlKSwKKyAgICBXVENQKDB4NzYwMTJiNzksIDB4MzE5NjY3NTMpLCBXVENQKDB4NzVlNzI0ODcsIDB4MzFkNDJhMDApLAorICAgIFdUQ1AoMHg3NWNjZmQ0MiwgMHgzMjExZGYwNCksIFdUQ1AoMHg3NWIyYjViMiwgMHgzMjRmODY0ZSksCisgICAgV1RDUCgweDc1OTg0ZGRjLCAweDMyOGQxZmNjKSwgV1RDUCgweDc1N2RjNWNhLCAweDMyY2FhYjZmKSwKKyAgICBXVENQKDB4NzU2MzFkODIsIDB4MzMwODI5MjUpLCBXVENQKDB4NzU0ODU1MGIsIDB4MzM0NTk4ZGUpLAorICAgIFdUQ1AoMHg3NTJkNmM2YywgMHgzMzgyZmE4OCksIFdUQ1AoMHg3NTEyNjNhZSwgMHgzM2MwNGUxMyksCisgICAgV1RDUCgweDc0ZjczYWQ3LCAweDMzZmQ5MzZlKSwgV1RDUCgweDc0ZGJmMWVmLCAweDM0M2FjYTg3KSwKKyAgICBXVENQKDB4NzRjMDg4ZmUsIDB4MzQ3N2YzNTApLCBXVENQKDB4NzRhNTAwMGEsIDB4MzRiNTBkYjUpLAorICAgIFdUQ1AoMHg3NDg5NTcxYywgMHgzNGYyMTlhOCksIFdUQ1AoMHg3NDZkOGUzYSwgMHgzNTJmMTcxNiksCisgICAgV1RDUCgweDc0NTFhNTZlLCAweDM1NmMwNWYwKSwgV1RDUCgweDc0MzU5Y2JkLCAweDM1YThlNjI1KSwKKyAgICBXVENQKDB4NzQxOTc0MzEsIDB4MzVlNWI3YTMpLCBXVENQKDB4NzNmZDJiZDAsIDB4MzYyMjdhNWIpLAorICAgIFdUQ1AoMHg3M2UwYzNhMywgMHgzNjVmMmUzYiksIFdUQ1AoMHg3M2M0M2JiMSwgMHgzNjliZDMzNCksCisgICAgV1RDUCgweDczYTc5NDAyLCAweDM2ZDg2OTM0KSwgV1RDUCgweDczOGFjYzllLCAweDM3MTRmMDJhKSwKKyAgICBXVENQKDB4NzM2ZGU1OGQsIDB4Mzc1MTY4MDcpLCBXVENQKDB4NzM1MGRlZDcsIDB4Mzc4ZGQwYjkpLAorICAgIFdUQ1AoMHg3MzMzYjg4MywgMHgzN2NhMmEzMCksIFdUQ1AoMHg3MzE2NzI5YSwgMHgzODA2NzQ1YyksCisgICAgV1RDUCgweDcyZjkwZDI0LCAweDM4NDJhZjJiKSwgV1RDUCgweDcyZGI4ODI4LCAweDM4N2VkYThlKSwKKyAgICBXVENQKDB4NzJiZGUzYWYsIDB4MzhiYWY2NzQpLCBXVENQKDB4NzJhMDFmYzIsIDB4MzhmNzAyY2QpLAorICAgIFdUQ1AoMHg3MjgyM2M2NywgMHgzOTMyZmY4NyksIFdUQ1AoMHg3MjY0MzlhOCwgMHgzOTZlZWM5MyksCisgICAgV1RDUCgweDcyNDYxNzhjLCAweDM5YWFjOWUwKSwgV1RDUCgweDcyMjdkNjFjLCAweDM5ZTY5NzVlKSwKKyAgICBXVENQKDB4NzIwOTc1NjAsIDB4M2EyMjU0ZmMpLCBXVENQKDB4NzFlYWY1NjEsIDB4M2E1ZTAyYWEpLAorICAgIFdUQ1AoMHg3MWNjNTYyNiwgMHgzYTk5YTA1NyksIFdUQ1AoMHg3MWFkOTdiOSwgMHgzYWQ1MmRmNCksCisgICAgV1RDUCgweDcxOGViYTIyLCAweDNiMTBhYjcwKSwgV1RDUCgweDcxNmZiZDY4LCAweDNiNGMxOGJhKSwKKyAgICBXVENQKDB4NzE1MGExOTUsIDB4M2I4Nzc1YzIpLCBXVENQKDB4NzEzMTY2YjEsIDB4M2JjMmMyNzkpLAorICAgIFdUQ1AoMHg3MTEyMGNjNSwgMHgzYmZkZmVjZCksIFdUQ1AoMHg3MGYyOTNkOSwgMHgzYzM5MmFhZiksCisgICAgV1RDUCgweDcwZDJmYmY2LCAweDNjNzQ0NjBlKSwgV1RDUCgweDcwYjM0NTI1LCAweDNjYWY1MGRhKSwKKyAgICBXVENQKDB4NzA5MzZmNmUsIDB4M2NlYTRiMDQpLCBXVENQKDB4NzA3MzdhZDksIDB4M2QyNTM0NzkpLAorICAgIFdUQ1AoMHg3MDUzNjc3MSwgMHgzZDYwMGQyYyksIFdUQ1AoMHg3MDMzMzUzZCwgMHgzZDlhZDUwYiksCisgICAgV1RDUCgweDcwMTJlNDQ3LCAweDNkZDU4YzA2KSwgV1RDUCgweDZmZjI3NDk3LCAweDNlMTAzMjBkKSwKKyAgICBXVENQKDB4NmZkMWU2MzUsIDB4M2U0YWM3MTEpLCBXVENQKDB4NmZiMTM5MmMsIDB4M2U4NTRiMDEpLAorICAgIFdUQ1AoMHg2ZjkwNmQ4NCwgMHgzZWJmYmRjZCksIFdUQ1AoMHg2ZjZmODM0NiwgMHgzZWZhMWY2NSksCisgICAgV1RDUCgweDZmNGU3YTdiLCAweDNmMzQ2ZmI4KSwgV1RDUCgweDZmMmQ1MzJjLCAweDNmNmVhZWI4KSwKKyAgICBXVENQKDB4NmYwYzBkNjIsIDB4M2ZhOGRjNTQpLCBXVENQKDB4NmVlYWE5MjcsIDB4M2ZlMmY4N2MpLAorICAgIFdUQ1AoMHg2ZWM5MjY4MywgMHg0MDFkMDMyMSksIFdUQ1AoMHg2ZWE3ODU3ZiwgMHg0MDU2ZmMzMSksCisgICAgV1RDUCgweDZlODVjNjI2LCAweDQwOTBlMzllKSwgV1RDUCgweDZlNjNlODdmLCAweDQwY2FiOTU4KSwKKyAgICBXVENQKDB4NmU0MWVjOTUsIDB4NDEwNDdkNGUpLCBXVENQKDB4NmUxZmQyNzEsIDB4NDEzZTJmNzEpLAorICAgIFdUQ1AoMHg2ZGZkOWExYywgMHg0MTc3Y2ZiMSksIFdUQ1AoMHg2ZGRiNDM5ZiwgMHg0MWIxNWRmZSksCisgICAgV1RDUCgweDZkYjhjZjA0LCAweDQxZWFkYTQ5KSwgV1RDUCgweDZkOTYzYzU0LCAweDQyMjQ0NDgxKSwKKyAgICBXVENQKDB4NmQ3MzhiOTksIDB4NDI1ZDljOTcpLCBXVENQKDB4NmQ1MGJjZGMsIDB4NDI5NmUyN2IpLAorICAgIFdUQ1AoMHg2ZDJkZDAyNywgMHg0MmQwMTYxZSksIFdUQ1AoMHg2ZDBhYzU4NCwgMHg0MzA5Mzc3MCksCisgICAgV1RDUCgweDZjZTc5Y2ZjLCAweDQzNDI0NjYxKSwgV1RDUCgweDZjYzQ1Njk4LCAweDQzN2I0MmUxKSwKKyAgICBXVENQKDB4NmNhMGYyNjIsIDB4NDNiNDJjZTEpLCBXVENQKDB4NmM3ZDcwNjUsIDB4NDNlZDA0NTIpLAorICAgIFdUQ1AoMHg2YzU5ZDBhOSwgMHg0NDI1YzkyMyksIFdUQ1AoMHg2YzM2MTMzOSwgMHg0NDVlN2I0NiksCisgICAgV1RDUCgweDZjMTIzODFlLCAweDQ0OTcxYWFhKSwgV1RDUCgweDZiZWUzZjYyLCAweDQ0Y2ZhNzQwKSwKKyAgICBXVENQKDB4NmJjYTI5MTAsIDB4NDUwODIwZjgpLCBXVENQKDB4NmJhNWY1MzAsIDB4NDU0MDg3YzQpLAorICAgIFdUQ1AoMHg2YjgxYTNjZCwgMHg0NTc4ZGI5MyksIFdUQ1AoMHg2YjVkMzRmMSwgMHg0NWIxMWM1NyksCisgICAgV1RDUCgweDZiMzhhOGE2LCAweDQ1ZTk0OWZmKSwgV1RDUCgweDZiMTNmZWY1LCAweDQ2MjE2NDdkKSwKKyAgICBXVENQKDB4NmFlZjM3ZTksIDB4NDY1OTZiYzEpLCBXVENQKDB4NmFjYTUzOGMsIDB4NDY5MTVmYmIpLAorICAgIFdUQ1AoMHg2YWE1NTFlOSwgMHg0NmM5NDA1YyksIFdUQ1AoMHg2YTgwMzMwOCwgMHg0NzAxMGQ5NiksCisgICAgV1RDUCgweDZhNWFmNmY1LCAweDQ3MzhjNzU4KSwgV1RDUCgweDZhMzU5ZGI5LCAweDQ3NzA2ZDkzKSwKKyAgICBXVENQKDB4NmExMDI3NjAsIDB4NDdhODAwMzkpLCBXVENQKDB4NjllYTkzZjIsIDB4NDdkZjdmM2EpLAorICAgIFdUQ1AoMHg2OWM0ZTM3YSwgMHg0ODE2ZWE4NiksIFdUQ1AoMHg2OTlmMTYwNCwgMHg0ODRlNDIwZiksCisgICAgV1RDUCgweDY5NzkyYjk4LCAweDQ4ODU4NWM1KSwgV1RDUCgweDY5NTMyNDQyLCAweDQ4YmNiNTk5KSwKKyAgICBXVENQKDB4NjkyZDAwMGMsIDB4NDhmM2QxN2MpLCBXVENQKDB4NjkwNmJmMDAsIDB4NDkyYWQ5NWYpLAorICAgIFdUQ1AoMHg2OGUwNjEyOSwgMHg0OTYxY2QzMyksIFdUQ1AoMHg2OGI5ZTY5MiwgMHg0OTk4YWNlOSksCisgICAgV1RDUCgweDY4OTM0ZjQ0LCAweDQ5Y2Y3ODcxKSwgV1RDUCgweDY4NmM5YjRiLCAweDRhMDYyZmJkKSwKKyAgICBXVENQKDB4Njg0NWNhYjEsIDB4NGEzY2QyYmUpLCBXVENQKDB4NjgxZWRkODEsIDB4NGE3MzYxNjUpLAorICAgIFdUQ1AoMHg2N2Y3ZDNjNSwgMHg0YWE5ZGJhMiksIFdUQ1AoMHg2N2QwYWQ4OCwgMHg0YWUwNDE2NyksCisgICAgV1RDUCgweDY3YTk2YWQ1LCAweDRiMTY5MmE1KSwgV1RDUCgweDY3ODIwYmI3LCAweDRiNGNjZjRkKSwKKyAgICBXVENQKDB4Njc1YTkwMzgsIDB4NGI4MmY3NTApLCBXVENQKDB4NjczMmY4NjMsIDB4NGJiOTBhYTApLAorICAgIFdUQ1AoMHg2NzBiNDQ0NCwgMHg0YmVmMDkyZCksIFdUQ1AoMHg2NmUzNzNlNCwgMHg0YzI0ZjJlOSksCisgICAgV1RDUCgweDY2YmI4NzUwLCAweDRjNWFjN2M0KSwgV1RDUCgweDY2OTM3ZTkxLCAweDRjOTA4N2IxKSwKKyAgICBXVENQKDB4NjY2YjU5YjMsIDB4NGNjNjMyYTApLCBXVENQKDB4NjY0MzE4YzAsIDB4NGNmYmM4ODMpLAorICAgIFdUQ1AoMHg2NjFhYmJjNSwgMHg0ZDMxNDk0YiksIFdUQ1AoMHg2NWYyNDJjYywgMHg0ZDY2YjRlOSksCisgICAgV1RDUCgweDY1YzlhZGRmLCAweDRkOWMwYjRmKSwgV1RDUCgweDY1YTBmZDBiLCAweDRkZDE0YzZlKSwKKyAgICBXVENQKDB4NjU3ODMwNWEsIDB4NGUwNjc4MzcpLCBXVENQKDB4NjU0ZjQ3ZDcsIDB4NGUzYjhlOWQpLAorICAgIFdUQ1AoMHg2NTI2NDM4ZiwgMHg0ZTcwOGY4ZiksIFdUQ1AoMHg2NGZkMjM4YiwgMHg0ZWE1N2IwMSksCisgICAgV1RDUCgweDY0ZDNlN2Q3LCAweDRlZGE1MGUyKSwgV1RDUCgweDY0YWE5MDdmLCAweDRmMGYxMTI2KSwKKyAgICBXVENQKDB4NjQ4MTFkOGUsIDB4NGY0M2JiYmQpLCBXVENQKDB4NjQ1NzhmMGYsIDB4NGY3ODUwOTkpLAorICAgIFdUQ1AoMHg2NDJkZTUwZCwgMHg0ZmFjY2ZhYiksIFdUQ1AoMHg2NDA0MWY5NSwgMHg0ZmUxMzhlNSksCisgICAgV1RDUCgweDYzZGEzZWIxLCAweDUwMTU4YzM5KSwgV1RDUCgweDYzYjA0MjZkLCAweDUwNDljOTk5KSwKKyAgICBXVENQKDB4NjM4NjJhZDUsIDB4NTA3ZGYwZjYpLCBXVENQKDB4NjM1YmY3ZjMsIDB4NTBiMjAyNDEpLAorICAgIFdUQ1AoMHg2MzMxYTlkNCwgMHg1MGU1ZmQ2ZCksIFdUQ1AoMHg2MzA3NDA4NCwgMHg1MTE5ZTI2YiksCisgICAgV1RDUCgweDYyZGNiYzBkLCAweDUxNGRiMTJkKSwgV1RDUCgweDYyYjIxYzdiLCAweDUxODE2OWE1KSwKKyAgICBXVENQKDB4NjI4NzYxZGIsIDB4NTFiNTBiYzQpLCBXVENQKDB4NjI1YzhjMzgsIDB4NTFlODk3N2QpLAorICAgIFdUQ1AoMHg2MjMxOWI5ZCwgMHg1MjFjMGNjMiksIFdUQ1AoMHg2MjA2OTAxNywgMHg1MjRmNmI4MyksCisgICAgV1RDUCgweDYxZGI2OWIxLCAweDUyODJiM2I0KSwgV1RDUCgweDYxYjAyODc2LCAweDUyYjVlNTQ2KSwKKyAgICBXVENQKDB4NjE4NGNjNzQsIDB4NTJlOTAwMmEpLCBXVENQKDB4NjE1OTU1YjYsIDB4NTMxYzA0NTQpLAorICAgIFdUQ1AoMHg2MTJkYzQ0NywgMHg1MzRlZjFiNSksIFdUQ1AoMHg2MTAyMTgzNCwgMHg1MzgxYzgzZiksCisgICAgV1RDUCgweDYwZDY1MTg4LCAweDUzYjQ4N2U1KSwgV1RDUCgweDYwYWE3MDUwLCAweDUzZTczMDk3KSwKKyAgICBXVENQKDB4NjA3ZTc0OTcsIDB4NTQxOWMyNDkpLCBXVENQKDB4NjA1MjVlNmIsIDB4NTQ0YzNjZWMpLAorICAgIFdUQ1AoMHg2MDI2MmRkNiwgMHg1NDdlYTA3MyksIFdUQ1AoMHg1ZmY5ZTJlNSwgMHg1NGIwZWNkMCksCisgICAgV1RDUCgweDVmY2Q3ZGE0LCAweDU0ZTMyMWY1KSwgV1RDUCgweDVmYTBmZTFmLCAweDU1MTUzZmQ0KSwKKyAgICBXVENQKDB4NWY3NDY0NjIsIDB4NTU0NzQ2NjApLCBXVENQKDB4NWY0N2IwN2EsIDB4NTU3OTM1OGIpLAorICAgIFdUQ1AoMHg1ZjFhZTI3NCwgMHg1NWFiMGQ0NiksIFdUQ1AoMHg1ZWVkZmE1YSwgMHg1NWRjY2Q4NiksCisgICAgV1RDUCgweDVlYzBmODM5LCAweDU2MGU3NjNiKSwgV1RDUCgweDVlOTNkYzFmLCAweDU2NDAwNzU4KSwKKyAgICBXVENQKDB4NWU2NmE2MTcsIDB4NTY3MTgwZDApLCBXVENQKDB4NWUzOTU2MmQsIDB4NTZhMmUyOTUpLAorICAgIFdUQ1AoMHg1ZTBiZWM2ZSwgMHg1NmQ0MmM5OSksIFdUQ1AoMHg1ZGRlNjhlNywgMHg1NzA1NWVkMCksCisgICAgV1RDUCgweDVkYjBjYmE0LCAweDU3MzY3OTJiKSwgV1RDUCgweDVkODMxNGIxLCAweDU3Njc3YjlkKSwKKyAgICBXVENQKDB4NWQ1NTQ0MWIsIDB4NTc5ODY2MTkpLCBXVENQKDB4NWQyNzU5ZWUsIDB4NTdjOTM4OTEpLAorICAgIFdUQ1AoMHg1Y2Y5NTYzOCwgMHg1N2Y5ZjJmOCksIFdUQ1AoMHg1Y2NiMzkwNSwgMHg1ODJhOTU0MCksCisgICAgV1RDUCgweDVjOWQwMjYwLCAweDU4NWIxZjVjKSwgV1RDUCgweDVjNmViMjU4LCAweDU4OGI5MTQwKSwKKyAgICBXVENQKDB4NWM0MDQ4ZjksIDB4NThiYmVhZGQpLCBXVENQKDB4NWMxMWM2NGYsIDB4NThlYzJjMjYpLAorICAgIFdUQ1AoMHg1YmUzMmE2NywgMHg1OTFjNTUwZSksIFdUQ1AoMHg1YmI0NzU0ZSwgMHg1OTRjNjU4OCksCisgICAgV1RDUCgweDViODVhNzExLCAweDU5N2M1ZDg3KSwgV1RDUCgweDViNTZiZmJkLCAweDU5YWMzY2ZkKSwKKyAgICBXVENQKDB4NWIyN2JmNWUsIDB4NTlkYzAzZGUpLCBXVENQKDB4NWFmOGE2MDIsIDB4NWEwYmIyMWMpLAorICAgIFdUQ1AoMHg1YWM5NzNiNSwgMHg1YTNiNDdhYiksIFdUQ1AoMHg1YTlhMjg4NCwgMHg1YTZhYzQ3YyksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9XVFAgU2luZVdpbmRvdzk2MFtdID0geworICAgIFdUQ1AoMHg3ZmZmZmQzMSwgMHgwMDFhY2VlYSksIFdUQ1AoMHg3ZmZmZTZiYywgMHgwMDUwNmNiOSksCisgICAgV1RDUCgweDdmZmZiOWQxLCAweDAwODYwYTc5KSwgV1RDUCgweDdmZmY3NjcxLCAweDAwYmJhODIyKSwKKyAgICBXVENQKDB4N2ZmZjFjOWIsIDB4MDBmMTQ1YWIpLCBXVENQKDB4N2ZmZWFjNTAsIDB4MDEyNmUzMDkpLAorICAgIFdUQ1AoMHg3ZmZlMjU5MCwgMHgwMTVjODAzMyksIFdUQ1AoMHg3ZmZkODg1YSwgMHgwMTkyMWQyMCksCisgICAgV1RDUCgweDdmZmNkNGIwLCAweDAxYzdiOWM2KSwgV1RDUCgweDdmZmMwYTkxLCAweDAxZmQ1NjFkKSwKKyAgICBXVENQKDB4N2ZmYjI5ZmQsIDB4MDIzMmYyMWEpLCBXVENQKDB4N2ZmYTMyZjQsIDB4MDI2ODhkYjQpLAorICAgIFdUQ1AoMHg3ZmY5MjU3NywgMHgwMjllMjhlMiksIFdUQ1AoMHg3ZmY4MDE4NiwgMHgwMmQzYzM5YiksCisgICAgV1RDUCgweDdmZjZjNzIwLCAweDAzMDk1ZGQ1KSwgV1RDUCgweDdmZjU3NjQ3LCAweDAzM2VmNzg2KSwKKyAgICBXVENQKDB4N2ZmNDBlZmEsIDB4MDM3NDkwYTUpLCBXVENQKDB4N2ZmMjkxM2EsIDB4MDNhYTI5MmEpLAorICAgIFdUQ1AoMHg3ZmYwZmQwNywgMHgwM2RmYzEwOSksIFdUQ1AoMHg3ZmVmNTI2MCwgMHgwNDE1NTgzYiksCisgICAgV1RDUCgweDdmZWQ5MTQ4LCAweDA0NGFlZWI1KSwgV1RDUCgweDdmZWJiOWJkLCAweDA0ODA4NDZlKSwKKyAgICBXVENQKDB4N2ZlOWNiYzAsIDB4MDRiNjE5NWQpLCBXVENQKDB4N2ZlN2M3NTIsIDB4MDRlYmFkNzkpLAorICAgIFdUQ1AoMHg3ZmU1YWM3MiwgMHgwNTIxNDBiNyksIFdUQ1AoMHg3ZmUzN2IyMiwgMHgwNTU2ZDMwZiksCisgICAgV1RDUCgweDdmZTEzMzYxLCAweDA1OGM2NDc4KSwgV1RDUCgweDdmZGVkNTMwLCAweDA1YzFmNGU3KSwKKyAgICBXVENQKDB4N2ZkYzYwOGYsIDB4MDVmNzg0NTMpLCBXVENQKDB4N2ZkOWQ1N2YsIDB4MDYyZDEyYjQpLAorICAgIFdUQ1AoMHg3ZmQ3MzQwMSwgMHgwNjYyOWZmZSksIFdUQ1AoMHg3ZmQ0N2MxNCwgMHgwNjk4MmMyYiksCisgICAgV1RDUCgweDdmZDFhZGI5LCAweDA2Y2RiNzJmKSwgV1RDUCgweDdmY2VjOGYxLCAweDA3MDM0MTAxKSwKKyAgICBXVENQKDB4N2ZjYmNkYmMsIDB4MDczOGM5OTgpLCBXVENQKDB4N2ZjOGJjMWIsIDB4MDc2ZTUwZWIpLAorICAgIFdUQ1AoMHg3ZmM1OTQwZSwgMHgwN2EzZDZmMCksIFdUQ1AoMHg3ZmMyNTU5NiwgMHgwN2Q5NWI5ZSksCisgICAgV1RDUCgweDdmYmYwMGIzLCAweDA4MGVkZWVjKSwgV1RDUCgweDdmYmI5NTY3LCAweDA4NDQ2MGNmKSwKKyAgICBXVENQKDB4N2ZiODEzYjAsIDB4MDg3OWUxNDApLCBXVENQKDB4N2ZiNDdiOTEsIDB4MDhhZjYwMzMpLAorICAgIFdUQ1AoMHg3ZmIwY2QwYSwgMHgwOGU0ZGRhMCksIFdUQ1AoMHg3ZmFkMDgxYiwgMHgwOTFhNTk3ZSksCisgICAgV1RDUCgweDdmYTkyY2M1LCAweDA5NGZkM2MzKSwgV1RDUCgweDdmYTUzYjA5LCAweDA5ODU0YzY2KSwKKyAgICBXVENQKDB4N2ZhMTMyZTgsIDB4MDliYWMzNWQpLCBXVENQKDB4N2Y5ZDE0NjEsIDB4MDlmMDM4OWYpLAorICAgIFdUQ1AoMHg3Zjk4ZGY3NywgMHgwYTI1YWMyMyksIFdUQ1AoMHg3Zjk0OTQyOSwgMHgwYTViMWRkZSksCisgICAgV1RDUCgweDdmOTAzMjc5LCAweDBhOTA4ZGM5KSwgV1RDUCgweDdmOGJiYTY2LCAweDBhYzVmYmQ5KSwKKyAgICBXVENQKDB4N2Y4NzJiZjMsIDB4MGFmYjY4MDUpLCBXVENQKDB4N2Y4Mjg3MWYsIDB4MGIzMGQyNDQpLAorICAgIFdUQ1AoMHg3ZjdkY2JlYywgMHgwYjY2M2E4YyksIFdUQ1AoMHg3Zjc4ZmE1YiwgMHgwYjliYTBkNSksCisgICAgV1RDUCgweDdmNzQxMjZiLCAweDBiZDEwNTEzKSwgV1RDUCgweDdmNmYxNDFmLCAweDBjMDY2NzQwKSwKKyAgICBXVENQKDB4N2Y2OWZmNzYsIDB4MGMzYmM3NGYpLCBXVENQKDB4N2Y2NGQ0NzMsIDB4MGM3MTI1M2EpLAorICAgIFdUQ1AoMHg3ZjVmOTMxNSwgMHgwY2E2ODBmNSksIFdUQ1AoMHg3ZjVhM2I1ZSwgMHgwY2RiZGE3OSksCisgICAgV1RDUCgweDdmNTRjZDRmLCAweDBkMTEzMWJhKSwgV1RDUCgweDdmNGY0OGU4LCAweDBkNDY4NmIxKSwKKyAgICBXVENQKDB4N2Y0OWFlMmEsIDB4MGQ3YmQ5NTQpLCBXVENQKDB4N2Y0M2ZkMTgsIDB4MGRiMTI5OTkpLAorICAgIFdUQ1AoMHg3ZjNlMzViMCwgMHgwZGU2Nzc3NiksIFdUQ1AoMHg3ZjM4NTdmNiwgMHgwZTFiYzJlNCksCisgICAgV1RDUCgweDdmMzI2M2U5LCAweDBlNTEwYmQ4KSwgV1RDUCgweDdmMmM1OThhLCAweDBlODY1MjQ4KSwKKyAgICBXVENQKDB4N2YyNjM4ZGIsIDB4MGViYjk2MmMpLCBXVENQKDB4N2YyMDAxZGQsIDB4MGVmMGQ3N2IpLAorICAgIFdUQ1AoMHg3ZjE5YjQ5MSwgMHgwZjI2MTYyYSksIFdUQ1AoMHg3ZjEzNTBmOCwgMHgwZjViNTIzMSksCisgICAgV1RDUCgweDdmMGNkNzEyLCAweDBmOTA4Yjg2KSwgV1RDUCgweDdmMDY0NmUyLCAweDBmYzVjMjIwKSwKKyAgICBXVENQKDB4N2VmZmEwNjksIDB4MGZmYWY1ZjYpLCBXVENQKDB4N2VmOGUzYTYsIDB4MTAzMDI2ZmUpLAorICAgIFdUQ1AoMHg3ZWYyMTA5ZCwgMHgxMDY1NTUyZSksIFdUQ1AoMHg3ZWViMjc0ZCwgMHgxMDlhODA3ZSksCisgICAgV1RDUCgweDdlZTQyN2I5LCAweDEwY2ZhOGU1KSwgV1RDUCgweDdlZGQxMWUxLCAweDExMDRjZTU4KSwKKyAgICBXVENQKDB4N2VkNWU1YzYsIDB4MTEzOWYwY2YpLCBXVENQKDB4N2VjZWEzNmIsIDB4MTE2ZjEwNDApLAorICAgIFdUQ1AoMHg3ZWM3NGFjZiwgMHgxMWE0MmNhMiksIFdUQ1AoMHg3ZWJmZGJmNSwgMHgxMWQ5NDVlYiksCisgICAgV1RDUCgweDdlYjg1NmRlLCAweDEyMGU1YzEzKSwgV1RDUCgweDdlYjBiYjhhLCAweDEyNDM2ZjEwKSwKKyAgICBXVENQKDB4N2VhOTA5ZmMsIDB4MTI3ODdlZDgpLCBXVENQKDB4N2VhMTQyMzUsIDB4MTJhZDhiNjMpLAorICAgIFdUQ1AoMHg3ZTk5NjQzNiwgMHgxMmUyOTRhNyksIFdUQ1AoMHg3ZTkxNzAwMCwgMHgxMzE3OWE5YiksCisgICAgV1RDUCgweDdlODk2NTk1LCAweDEzNGM5ZDM0KSwgV1RDUCgweDdlODE0NGY2LCAweDEzODE5YzZjKSwKKyAgICBXVENQKDB4N2U3OTBlMjUsIDB4MTNiNjk4MzYpLCBXVENQKDB4N2U3MGMxMjQsIDB4MTNlYjkwOGMpLAorICAgIFdUQ1AoMHg3ZTY4NWRmMiwgMHgxNDIwODU2MyksIFdUQ1AoMHg3ZTVmZTQ5MywgMHgxNDU1NzZiMSksCisgICAgV1RDUCgweDdlNTc1NTA4LCAweDE0OGE2NDZlKSwgV1RDUCgweDdlNGVhZjUxLCAweDE0YmY0ZTkxKSwKKyAgICBXVENQKDB4N2U0NWYzNzEsIDB4MTRmNDM1MTApLCBXVENQKDB4N2UzZDIxNjksIDB4MTUyOTE3ZTEpLAorICAgIFdUQ1AoMHg3ZTM0MzkzYiwgMHgxNTVkZjZmYyksIFdUQ1AoMHg3ZTJiM2FlOCwgMHgxNTkyZDI1NyksCisgICAgV1RDUCgweDdlMjIyNjcyLCAweDE1YzdhOWVhKSwgV1RDUCgweDdlMThmYmRhLCAweDE1ZmM3ZGFhKSwKKyAgICBXVENQKDB4N2UwZmJiMjIsIDB4MTYzMTRkOGUpLCBXVENQKDB4N2UwNjY0NGMsIDB4MTY2NjE5OGQpLAorICAgIFdUQ1AoMHg3ZGZjZjc1OSwgMHgxNjlhZTE5ZiksIFdUQ1AoMHg3ZGYzNzQ0YiwgMHgxNmNmYTViOSksCisgICAgV1RDUCgweDdkZTlkYjIzLCAweDE3MDQ2NWQyKSwgV1RDUCgweDdkZTAyYmU0LCAweDE3MzkyMWUyKSwKKyAgICBXVENQKDB4N2RkNjY2OGYsIDB4MTc2ZGQ5ZGUpLCBXVENQKDB4N2RjYzhiMjUsIDB4MTdhMjhkYmUpLAorICAgIFdUQ1AoMHg3ZGMyOTlhOSwgMHgxN2Q3M2Q3OSksIFdUQ1AoMHg3ZGI4OTIxYywgMHgxODBiZTkwNCksCisgICAgV1RDUCgweDdkYWU3NDdmLCAweDE4NDA5MDU4KSwgV1RDUCgweDdkYTQ0MGQ2LCAweDE4NzUzMzZhKSwKKyAgICBXVENQKDB4N2Q5OWY3MjEsIDB4MThhOWQyMzEpLCBXVENQKDB4N2Q4Zjk3NjIsIDB4MThkZTZjYTUpLAorICAgIFdUQ1AoMHg3ZDg1MjE5YywgMHgxOTEzMDJiYyksIFdUQ1AoMHg3ZDdhOTVjZiwgMHgxOTQ3OTQ2YyksCisgICAgV1RDUCgweDdkNmZmM2ZlLCAweDE5N2MyMWFkKSwgV1RDUCgweDdkNjUzYzJiLCAweDE5YjBhYTc1KSwKKyAgICBXVENQKDB4N2Q1YTZlNTcsIDB4MTllNTJlYmIpLCBXVENQKDB4N2Q0ZjhhODUsIDB4MWExOWFlNzYpLAorICAgIFdUQ1AoMHg3ZDQ0OTBiNiwgMHgxYTRlMjk5ZCksIFdUQ1AoMHg3ZDM5ODBlYywgMHgxYTgyYTAyNiksCisgICAgV1RDUCgweDdkMmU1YjJhLCAweDFhYjcxMjA4KSwgV1RDUCgweDdkMjMxZjcwLCAweDFhZWI3ZjNhKSwKKyAgICBXVENQKDB4N2QxN2NkYzIsIDB4MWIxZmU3YjMpLCBXVENQKDB4N2QwYzY2MjEsIDB4MWI1NDRiNmEpLAorICAgIFdUQ1AoMHg3ZDAwZTg4ZiwgMHgxYjg4YWE1NSksIFdUQ1AoMHg3Y2Y1NTUwZSwgMHgxYmJkMDQ2YyksCisgICAgV1RDUCgweDdjZTlhYmExLCAweDFiZjE1OWE0KSwgV1RDUCgweDdjZGRlYzQ4LCAweDFjMjVhOWY2KSwKKyAgICBXVENQKDB4N2NkMjE3MDcsIDB4MWM1OWY1NTcpLCBXVENQKDB4N2NjNjJiZGYsIDB4MWM4ZTNiYmUpLAorICAgIFdUQ1AoMHg3Y2JhMmFkMywgMHgxY2MyN2QyMyksIFdUQ1AoMHg3Y2FlMTNlNCwgMHgxY2Y2Yjk3YyksCisgICAgV1RDUCgweDdjYTFlNzE1LCAweDFkMmFmMGMxKSwgV1RDUCgweDdjOTVhNDY3LCAweDFkNWYyMmU3KSwKKyAgICBXVENQKDB4N2M4OTRiZGUsIDB4MWQ5MzRmZTUpLCBXVENQKDB4N2M3Y2RkN2IsIDB4MWRjNzc3YjMpLAorICAgIFdUQ1AoMHg3YzcwNTk0MCwgMHgxZGZiOWE0OCksIFdUQ1AoMHg3YzYzYmYyZiwgMHgxZTJmYjc5YSksCisgICAgV1RDUCgweDdjNTcwZjRiLCAweDFlNjNjZmEwKSwgV1RDUCgweDdjNGE0OTk2LCAweDFlOTdlMjUxKSwKKyAgICBXVENQKDB4N2MzZDZlMTMsIDB4MWVjYmVmYTQpLCBXVENQKDB4N2MzMDdjYzIsIDB4MWVmZmY3OGYpLAorICAgIFdUQ1AoMHg3YzIzNzVhOCwgMHgxZjMzZmEwYSksIFdUQ1AoMHg3YzE2NThjNSwgMHgxZjY3ZjcwYiksCisgICAgV1RDUCgweDdjMDkyNjFkLCAweDFmOWJlZThhKSwgV1RDUCgweDdiZmJkZGIxLCAweDFmY2ZlMDdkKSwKKyAgICBXVENQKDB4N2JlZTdmODUsIDB4MjAwM2NjZGIpLCBXVENQKDB4N2JlMTBiOTksIDB4MjAzN2IzOWIpLAorICAgIFdUQ1AoMHg3YmQzODFmMSwgMHgyMDZiOTRiNCksIFdUQ1AoMHg3YmM1ZTI5MCwgMHgyMDlmNzAxYyksCisgICAgV1RDUCgweDdiYjgyZDc2LCAweDIwZDM0NWNjKSwgV1RDUCgweDdiYWE2MmE4LCAweDIxMDcxNWI4KSwKKyAgICBXVENQKDB4N2I5YzgyMjYsIDB4MjEzYWRmZGEpLCBXVENQKDB4N2I4ZThiZjUsIDB4MjE2ZWE0MjYpLAorICAgIFdUQ1AoMHg3YjgwODAxNSwgMHgyMWEyNjI5NSksIFdUQ1AoMHg3YjcyNWU4YSwgMHgyMWQ2MWIxZSksCisgICAgV1RDUCgweDdiNjQyNzU2LCAweDIyMDljZGI2KSwgV1RDUCgweDdiNTVkYTdjLCAweDIyM2Q3YTU1KSwKKyAgICBXVENQKDB4N2I0Nzc3ZmUsIDB4MjI3MTIwZjMpLCBXVENQKDB4N2IzOGZmZGUsIDB4MjJhNGMxODUpLAorICAgIFdUQ1AoMHg3YjJhNzIxZiwgMHgyMmQ4NWMwNCksIFdUQ1AoMHg3YjFiY2VjNCwgMHgyMzBiZjA2NSksCisgICAgV1RDUCgweDdiMGQxNWQwLCAweDIzM2Y3ZWEwKSwgV1RDUCgweDdhZmU0NzQ0LCAweDIzNzMwNmFiKSwKKyAgICBXVENQKDB4N2FlZjYzMjMsIDB4MjNhNjg4N2YpLCBXVENQKDB4N2FlMDY5NzEsIDB4MjNkYTA0MTEpLAorICAgIFdUQ1AoMHg3YWQxNWEyZiwgMHgyNDBkNzk1OCksIFdUQ1AoMHg3YWMyMzU2MSwgMHgyNDQwZTg0ZCksCisgICAgV1RDUCgweDdhYjJmYjA5LCAweDI0NzQ1MGU0KSwgV1RDUCgweDdhYTNhYjI5LCAweDI0YTdiMzE3KSwKKyAgICBXVENQKDB4N2E5NDQ1YzUsIDB4MjRkYjBlZGIpLCBXVENQKDB4N2E4NGNhZGUsIDB4MjUwZTY0MjcpLAorICAgIFdUQ1AoMHg3YTc1M2E3OSwgMHgyNTQxYjJmMyksIFdUQ1AoMHg3YTY1OTQ5NiwgMHgyNTc0ZmIzNiksCisgICAgV1RDUCgweDdhNTVkOTNhLCAweDI1YTgzY2U2KSwgV1RDUCgweDdhNDYwODY3LCAweDI1ZGI3N2ZhKSwKKyAgICBXVENQKDB4N2EzNjIyMjAsIDB4MjYwZWFjNmEpLCBXVENQKDB4N2EyNjI2NjgsIDB4MjY0MWRhMmQpLAorICAgIFdUQ1AoMHg3YTE2MTU0MCwgMHgyNjc1MDEzOSksIFdUQ1AoMHg3YTA1ZWVhZCwgMHgyNmE4MjE4NiksCisgICAgV1RDUCgweDc5ZjViMmIxLCAweDI2ZGIzYjBhKSwgV1RDUCgweDc5ZTU2MTRmLCAweDI3MGU0ZGJkKSwKKyAgICBXVENQKDB4NzlkNGZhODksIDB4Mjc0MTU5OTYpLCBXVENQKDB4NzljNDdlNjMsIDB4Mjc3NDVlOGMpLAorICAgIFdUQ1AoMHg3OWIzZWNlMCwgMHgyN2E3NWM5NSksIFdUQ1AoMHg3OWEzNDYwMiwgMHgyN2RhNTNhOSksCisgICAgV1RDUCgweDc5OTI4OWNjLCAweDI4MGQ0M2JmKSwgV1RDUCgweDc5ODFiODQxLCAweDI4NDAyY2NlKSwKKyAgICBXVENQKDB4Nzk3MGQxNjUsIDB4Mjg3MzBlY2QpLCBXVENQKDB4Nzk1ZmQ1M2EsIDB4MjhhNWU5YjQpLAorICAgIFdUQ1AoMHg3OTRlYzNjMywgMHgyOGQ4YmQ3OCksIFdUQ1AoMHg3OTNkOWQwMywgMHgyOTBiOGExMiksCisgICAgV1RDUCgweDc5MmM2MGZlLCAweDI5M2U0Zjc4KSwgV1RDUCgweDc5MWIwZmI1LCAweDI5NzEwZGExKSwKKyAgICBXVENQKDB4NzkwOWE5MmQsIDB4MjlhM2M0ODUpLCBXVENQKDB4NzhmODJkNjgsIDB4MjlkNjc0MWIpLAorICAgIFdUQ1AoMHg3OGU2OWM2OSwgMHgyYTA5MWM1OSksIFdUQ1AoMHg3OGQ0ZjYzNCwgMHgyYTNiYmQzNyksCisgICAgV1RDUCgweDc4YzMzYWNiLCAweDJhNmU1NmFjKSwgV1RDUCgweDc4YjE2YTMyLCAweDJhYTBlOGIwKSwKKyAgICBXVENQKDB4Nzg5Zjg0NmIsIDB4MmFkMzczMzgpLCBXVENQKDB4Nzg4ZDg5N2IsIDB4MmIwNWY2M2QpLAorICAgIFdUQ1AoMHg3ODdiNzk2MywgMHgyYjM4NzFiNSksIFdUQ1AoMHg3ODY5NTQyOCwgMHgyYjZhZTU5OCksCisgICAgV1RDUCgweDc4NTcxOWNjLCAweDJiOWQ1MWRkKSwgV1RDUCgweDc4NDRjYTUzLCAweDJiY2ZiNjdiKSwKKyAgICBXVENQKDB4NzgzMjY1YzAsIDB4MmMwMjEzNjkpLCBXVENQKDB4NzgxZmVjMTUsIDB4MmMzNDY4OWUpLAorICAgIFdUQ1AoMHg3ODBkNWQ1NywgMHgyYzY2YjYxMSksIFdUQ1AoMHg3N2ZhYjk4OSwgMHgyYzk4ZmJiYSksCisgICAgV1RDUCgweDc3ZTgwMGFkLCAweDJjY2IzOTkwKSwgV1RDUCgweDc3ZDUzMmM3LCAweDJjZmQ2ZjhhKSwKKyAgICBXVENQKDB4NzdjMjRmZGIsIDB4MmQyZjlkOWYpLCBXVENQKDB4NzdhZjU3ZWIsIDB4MmQ2MWMzYzcpLAorICAgIFdUQ1AoMHg3NzljNGFmYywgMHgyZDkzZTFmOCksIFdUQ1AoMHg3Nzg5MjkxMCwgMHgyZGM1ZjgyOSksCisgICAgV1RDUCgweDc3NzVmMjJhLCAweDJkZjgwNjUzKSwgV1RDUCgweDc3NjJhNjRmLCAweDJlMmEwYzZjKSwKKyAgICBXVENQKDB4Nzc0ZjQ1ODEsIDB4MmU1YzBhNmIpLCBXVENQKDB4NzczYmNmYzQsIDB4MmU4ZTAwNDgpLAorICAgIFdUQ1AoMHg3NzI4NDUxYywgMHgyZWJmZWRmYSksIFdUQ1AoMHg3NzE0YTU4YiwgMHgyZWYxZDM3NyksCisgICAgV1RDUCgweDc3MDBmMTE1LCAweDJmMjNiMGI5KSwgV1RDUCgweDc2ZWQyN2JlLCAweDJmNTU4NWI1KSwKKyAgICBXVENQKDB4NzZkOTQ5ODksIDB4MmY4NzUyNjIpLCBXVENQKDB4NzZjNTU2NzksIDB4MmZiOTE2YjkpLAorICAgIFdUQ1AoMHg3NmIxNGU5MywgMHgyZmVhZDJiMCksIFdUQ1AoMHg3NjlkMzFkOSwgMHgzMDFjODYzZiksCisgICAgV1RDUCgweDc2ODkwMDUwLCAweDMwNGUzMTVkKSwgV1RDUCgweDc2NzRiOWZhLCAweDMwN2ZkNDAxKSwKKyAgICBXVENQKDB4NzY2MDVlZGIsIDB4MzBiMTZlMjMpLCBXVENQKDB4NzY0YmVlZjgsIDB4MzBlMmZmYjkpLAorICAgIFdUQ1AoMHg3NjM3NmE1MiwgMHgzMTE0ODhiYyksIFdUQ1AoMHg3NjIyZDBlZiwgMHgzMTQ2MDkyMiksCisgICAgV1RDUCgweDc2MGUyMmQxLCAweDMxNzc4MGUyKSwgV1RDUCgweDc1Zjk1ZmZjLCAweDMxYThlZmY1KSwKKyAgICBXVENQKDB4NzVlNDg4NzQsIDB4MzFkYTU2NTEpLCBXVENQKDB4NzVjZjljM2QsIDB4MzIwYmIzZWUpLAorICAgIFdUQ1AoMHg3NWJhOWI1YSwgMHgzMjNkMDhjMyksIFdUQ1AoMHg3NWE1ODVjZiwgMHgzMjZlNTRjNyksCisgICAgV1RDUCgweDc1OTA1YmEwLCAweDMyOWY5N2YzKSwgV1RDUCgweDc1N2IxY2NmLCAweDMyZDBkMjNjKSwKKyAgICBXVENQKDB4NzU2NWM5NjIsIDB4MzMwMjAzOWIpLCBXVENQKDB4NzU1MDYxNWMsIDB4MzMzMzJjMDYpLAorICAgIFdUQ1AoMHg3NTNhZTRjMCwgMHgzMzY0NGI3NiksIFdUQ1AoMHg3NTI1NTM5MiwgMHgzMzk1NjFlMSksCisgICAgV1RDUCgweDc1MGZhZGQ3LCAweDMzYzY2ZjQwKSwgV1RDUCgweDc0ZjlmMzkxLCAweDMzZjc3Mzg4KSwKKyAgICBXVENQKDB4NzRlNDI0YzUsIDB4MzQyODZlYjMpLCBXVENQKDB4NzRjZTQxNzcsIDB4MzQ1OTYwYjcpLAorICAgIFdUQ1AoMHg3NGI4NDlhYSwgMHgzNDhhNDk4YiksIFdUQ1AoMHg3NGEyM2Q2MiwgMHgzNGJiMjkyNyksCisgICAgV1RDUCgweDc0OGMxY2E0LCAweDM0ZWJmZjgzKSwgV1RDUCgweDc0NzVlNzcyLCAweDM1MWNjYzk2KSwKKyAgICBXVENQKDB4NzQ1ZjlkZDEsIDB4MzU0ZDkwNTcpLCBXVENQKDB4NzQ0OTNmYzUsIDB4MzU3ZTRhYmUpLAorICAgIFdUQ1AoMHg3NDMyY2Q1MSwgMHgzNWFlZmJjMiksIFdUQ1AoMHg3NDFjNDY3YiwgMHgzNWRmYTM1YSksCisgICAgV1RDUCgweDc0MDVhYjQ1LCAweDM2MTA0MTdmKSwgV1RDUCgweDczZWVmYmIzLCAweDM2NDBkNjI3KSwKKyAgICBXVENQKDB4NzNkODM3Y2EsIDB4MzY3MTYxNGIpLCBXVENQKDB4NzNjMTVmOGQsIDB4MzZhMWUyZTApLAorICAgIFdUQ1AoMHg3M2FhNzMwMSwgMHgzNmQyNWFlMCksIFdUQ1AoMHg3MzkzNzIyYSwgMHgzNzAyYzk0MiksCisgICAgV1RDUCgweDczN2M1ZDBiLCAweDM3MzMyZGZkKSwgV1RDUCgweDczNjUzM2E5LCAweDM3NjM4OTA4KSwKKyAgICBXVENQKDB4NzM0ZGY2MDcsIDB4Mzc5M2RhNWIpLCBXVENQKDB4NzMzNmE0MmIsIDB4MzdjNDIxZWUpLAorICAgIFdUQ1AoMHg3MzFmM2UxNywgMHgzN2Y0NWZiNyksIFdUQ1AoMHg3MzA3YzNkMCwgMHgzODI0OTNiMCksCisgICAgV1RDUCgweDcyZjAzNTVhLCAweDM4NTRiZGNmKSwgV1RDUCgweDcyZDg5MmJhLCAweDM4ODRkZTBiKSwKKyAgICBXVENQKDB4NzJjMGRiZjMsIDB4MzhiNGY0NWQpLCBXVENQKDB4NzJhOTExMDksIDB4MzhlNTAwYmMpLAorICAgIFdUQ1AoMHg3MjkxMzIwMSwgMHgzOTE1MDMxZiksIFdUQ1AoMHg3Mjc5M2VkZiwgMHgzOTQ0ZmI3ZSksCisgICAgV1RDUCgweDcyNjEzN2E4LCAweDM5NzRlOWQwKSwgV1RDUCgweDcyNDkxYzVlLCAweDM5YTRjZTBlKSwKKyAgICBXVENQKDB4NzIzMGVkMDcsIDB4MzlkNGE4MmYpLCBXVENQKDB4NzIxOGE5YTcsIDB4M2EwNDc4MmEpLAorICAgIFdUQ1AoMHg3MjAwNTI0MiwgMHgzYTM0M2RmNyksIFdUQ1AoMHg3MWU3ZTZkYywgMHgzYTYzZjk4ZCksCisgICAgV1RDUCgweDcxY2Y2NzdhLCAweDNhOTNhYWU1KSwgV1RDUCgweDcxYjZkNDIwLCAweDNhYzM1MWY2KSwKKyAgICBXVENQKDB4NzE5ZTJjZDIsIDB4M2FmMmVlYjcpLCBXVENQKDB4NzE4NTcxOTUsIDB4M2IyMjgxMjApLAorICAgIFdUQ1AoMHg3MTZjYTI2YywgMHgzYjUyMDkyYSksIFdUQ1AoMHg3MTUzYmY1ZCwgMHgzYjgxODZjYSksCisgICAgV1RDUCgweDcxM2FjODZiLCAweDNiYjBmOWZhKSwgV1RDUCgweDcxMjFiZDljLCAweDNiZTA2MmIwKSwKKyAgICBXVENQKDB4NzEwODllZjIsIDB4M2MwZmMwZTYpLCBXVENQKDB4NzBlZjZjNzQsIDB4M2MzZjE0OTEpLAorICAgIFdUQ1AoMHg3MGQ2MjYyNSwgMHgzYzZlNWRhYSksIFdUQ1AoMHg3MGJjY2MwOSwgMHgzYzlkOWMyOCksCisgICAgV1RDUCgweDcwYTM1ZTI1LCAweDNjY2NkMDA0KSwgV1RDUCgweDcwODlkYzdlLCAweDNjZmJmOTM1KSwKKyAgICBXVENQKDB4NzA3MDQ3MTgsIDB4M2QyYjE3YjMpLCBXVENQKDB4NzA1NjlkZjgsIDB4M2Q1YTJiNzUpLAorICAgIFdUQ1AoMHg3MDNjZTEyMiwgMHgzZDg5MzQ3NCksIFdUQ1AoMHg3MDIzMTA5YSwgMHgzZGI4MzJhNiksCisgICAgV1RDUCgweDcwMDkyYzY1LCAweDNkZTcyNjA0KSwgV1RDUCgweDZmZWYzNDg4LCAweDNlMTYwZTg1KSwKKyAgICBXVENQKDB4NmZkNTI5MDcsIDB4M2U0NGVjMjIpLCBXVENQKDB4NmZiYjA5ZTcsIDB4M2U3M2JlZDIpLAorICAgIFdUQ1AoMHg2ZmEwZDcyYywgMHgzZWEyODY4YyksIFdUQ1AoMHg2Zjg2OTBkYiwgMHgzZWQxNDM0OSksCisgICAgV1RDUCgweDZmNmMzNmY4LCAweDNlZmZmNTAxKSwgV1RDUCgweDZmNTFjOTg5LCAweDNmMmU5YmFiKSwKKyAgICBXVENQKDB4NmYzNzQ4OTEsIDB4M2Y1ZDM3M2UpLCBXVENQKDB4NmYxY2I0MTYsIDB4M2Y4YmM3YjQpLAorICAgIFdUQ1AoMHg2ZjAyMGMxYywgMHgzZmJhNGQwMyksIFdUQ1AoMHg2ZWU3NTBhOCwgMHgzZmU4YzcyNCksCisgICAgV1RDUCgweDZlY2M4MWJlLCAweDQwMTczNjBlKSwgV1RDUCgweDZlYjE5ZjY0LCAweDQwNDU5OWI5KSwKKyAgICBXVENQKDB4NmU5NmE5OWQsIDB4NDA3M2YyMWQpLCBXVENQKDB4NmU3YmEwNmYsIDB4NDBhMjNmMzIpLAorICAgIFdUQ1AoMHg2ZTYwODNkZSwgMHg0MGQwODBmMCksIFdUQ1AoMHg2ZTQ1NTNlZiwgMHg0MGZlYjc0ZiksCisgICAgV1RDUCgweDZlMmExMGE4LCAweDQxMmNlMjQ2KSwgV1RDUCgweDZlMGViYTBjLCAweDQxNWIwMWNlKSwKKyAgICBXVENQKDB4NmRmMzUwMjAsIDB4NDE4OTE1ZGUpLCBXVENQKDB4NmRkN2QyZWEsIDB4NDFiNzFlNmYpLAorICAgIFdUQ1AoMHg2ZGJjNDI2ZSwgMHg0MWU1MWI3NyksIFdUQ1AoMHg2ZGEwOWViMSwgMHg0MjEzMGNmMCksCisgICAgV1RDUCgweDZkODRlN2I3LCAweDQyNDBmMmQxKSwgV1RDUCgweDZkNjkxZDg3LCAweDQyNmVjZDEyKSwKKyAgICBXVENQKDB4NmQ0ZDQwMjMsIDB4NDI5YzliYWIpLCBXVENQKDB4NmQzMTRmOTMsIDB4NDJjYTVlOTQpLAorICAgIFdUQ1AoMHg2ZDE1NGJkOSwgMHg0MmY4MTVjNSksIFdUQ1AoMHg2Y2Y5MzRmYywgMHg0MzI1YzEzNSksCisgICAgV1RDUCgweDZjZGQwYjAwLCAweDQzNTM2MGRlKSwgV1RDUCgweDZjYzBjZGVhLCAweDQzODBmNGI3KSwKKyAgICBXVENQKDB4NmNhNDdkYmYsIDB4NDNhZTdjYjcpLCBXVENQKDB4NmM4ODFhODQsIDB4NDNkYmY4ZDcpLAorICAgIFdUQ1AoMHg2YzZiYTQzZSwgMHg0NDA5NjkxMCksIFdUQ1AoMHg2YzRmMWFmMiwgMHg0NDM2Y2Q1OCksCisgICAgV1RDUCgweDZjMzI3ZWE2LCAweDQ0NjQyNWE4KSwgV1RDUCgweDZjMTVjZjVkLCAweDQ0OTE3MWY4KSwKKyAgICBXVENQKDB4NmJmOTBkMWQsIDB4NDRiZWIyNDApLCBXVENQKDB4NmJkYzM3ZWIsIDB4NDRlYmU2NzkpLAorICAgIFdUQ1AoMHg2YmJmNGZjZCwgMHg0NTE5MGU5OSksIFdUQ1AoMHg2YmEyNTRjNywgMHg0NTQ2MmE5YSksCisgICAgV1RDUCgweDZiODU0NmRlLCAweDQ1NzMzYTczKSwgV1RDUCgweDZiNjgyNjE3LCAweDQ1YTAzZTFkKSwKKyAgICBXVENQKDB4NmI0YWYyNzksIDB4NDVjZDM1OGYpLCBXVENQKDB4NmIyZGFjMDYsIDB4NDVmYTIwYzIpLAorICAgIFdUQ1AoMHg2YjEwNTJjNiwgMHg0NjI2ZmZhZSksIFdUQ1AoMHg2YWYyZTZiYywgMHg0NjUzZDI0YiksCisgICAgV1RDUCgweDZhZDU2N2VmLCAweDQ2ODA5ODkxKSwgV1RDUCgweDZhYjdkNjYzLCAweDQ2YWQ1Mjc4KSwKKyAgICBXVENQKDB4NmE5YTMyMWQsIDB4NDZkOWZmZjgpLCBXVENQKDB4NmE3YzdiMjMsIDB4NDcwNmExMGEpLAorICAgIFdUQ1AoMHg2YTVlYjE3YSwgMHg0NzMzMzVhNSksIFdUQ1AoMHg2YTQwZDUyNywgMHg0NzVmYmRjMyksCisgICAgV1RDUCgweDZhMjJlNjMwLCAweDQ3OGMzOTVhKSwgV1RDUCgweDZhMDRlNDk5LCAweDQ3YjhhODY0KSwKKyAgICBXVENQKDB4NjllNmQwNjcsIDB4NDdlNTBhZDgpLCBXVENQKDB4NjljOGE5YTEsIDB4NDgxMTYwYWUpLAorICAgIFdUQ1AoMHg2OWFhNzA0YywgMHg0ODNkYTllMCksIFdUQ1AoMHg2OThjMjQ2YywgMHg0ODY5ZTY2NSksCisgICAgV1RDUCgweDY5NmRjNjA3LCAweDQ4OTYxNjM1KSwgV1RDUCgweDY5NGY1NTIzLCAweDQ4YzIzOTQ5KSwKKyAgICBXVENQKDB4NjkzMGQxYzQsIDB4NDhlZTRmOTgpLCBXVENQKDB4NjkxMjNiZjEsIDB4NDkxYTU5MWMpLAorICAgIFdUQ1AoMHg2OGYzOTNhZSwgMHg0OTQ2NTVjYyksIFdUQ1AoMHg2OGQ0ZDkwMCwgMHg0OTcyNDVhMSksCisgICAgV1RDUCgweDY4YjYwYmVlLCAweDQ5OWUyODkyKSwgV1RDUCgweDY4OTcyYzdkLCAweDQ5YzlmZTk5KSwKKyAgICBXVENQKDB4Njg3ODNhYjEsIDB4NDlmNWM3YWUpLCBXVENQKDB4Njg1OTM2OTEsIDB4NGEyMTgzYzgpLAorICAgIFdUQ1AoMHg2ODNhMjAyMiwgMHg0YTRkMzJlMSksIFdUQ1AoMHg2ODFhZjc2YSwgMHg0YTc4ZDRmMCksCisgICAgV1RDUCgweDY3ZmJiYzZkLCAweDRhYTQ2OWVlKSwgV1RDUCgweDY3ZGM2ZjMxLCAweDRhY2ZmMWQzKSwKKyAgICBXVENQKDB4NjdiZDBmYmQsIDB4NGFmYjZjOTgpLCBXVENQKDB4Njc5ZDllMTQsIDB4NGIyNmRhMzUpLAorICAgIFdUQ1AoMHg2NzdlMWEzZSwgMHg0YjUyM2FhMiksIFdUQ1AoMHg2NzVlODQzZSwgMHg0YjdkOGRkOCksCisgICAgV1RDUCgweDY3M2VkYzFjLCAweDRiYThkM2NmKSwgV1RDUCgweDY3MWYyMWRjLCAweDRiZDQwYzgwKSwKKyAgICBXVENQKDB4NjZmZjU1ODQsIDB4NGJmZjM3ZTIpLCBXVENQKDB4NjZkZjc3MWEsIDB4NGMyYTU1ZWYpLAorICAgIFdUQ1AoMHg2NmJmODZhMywgMHg0YzU1NjY5ZiksIFdUQ1AoMHg2NjlmODQyNSwgMHg0YzgwNjllYSksCisgICAgV1RDUCgweDY2N2Y2ZmE1LCAweDRjYWI1ZmM5KSwgV1RDUCgweDY2NWY0OTI5LCAweDRjZDY0ODM0KSwKKyAgICBXVENQKDB4NjYzZjEwYjcsIDB4NGQwMTIzMjQpLCBXVENQKDB4NjYxZWM2NTQsIDB4NGQyYmYwOTEpLAorICAgIFdUQ1AoMHg2NWZlNmEwNiwgMHg0ZDU2YjA3MyksIFdUQ1AoMHg2NWRkZmJkMywgMHg0ZDgxNjJjNCksCisgICAgV1RDUCgweDY1YmQ3YmMwLCAweDRkYWMwNzdiKSwgV1RDUCgweDY1OWNlOWQ0LCAweDRkZDY5ZTkyKSwKKyAgICBXVENQKDB4NjU3YzQ2MTMsIDB4NGUwMTI4MDApLCBXVENQKDB4NjU1YjkwODMsIDB4NGUyYmEzYmUpLAorICAgIFdUQ1AoMHg2NTNhYzkyYiwgMHg0ZTU2MTFjNSksIFdUQ1AoMHg2NTE5ZjAxMCwgMHg0ZTgwNzIwZSksCisgICAgV1RDUCgweDY0ZjkwNTM4LCAweDRlYWFjNDkwKSwgV1RDUCgweDY0ZDgwOGE4LCAweDRlZDUwOTQ1KSwKKyAgICBXVENQKDB4NjRiNmZhNjYsIDB4NGVmZjQwMjUpLCBXVENQKDB4NjQ5NWRhNzksIDB4NGYyOTY5MjgpLAorICAgIFdUQ1AoMHg2NDc0YThlNSwgMHg0ZjUzODQ0OCksIFdUQ1AoMHg2NDUzNjViMiwgMHg0ZjdkOTE3YyksCisgICAgV1RDUCgweDY0MzIxMGU0LCAweDRmYTc5MGJlKSwgV1RDUCgweDY0MTBhYTgxLCAweDRmZDE4MjA2KSwKKyAgICBXVENQKDB4NjNlZjMyOTAsIDB4NGZmYjY1NGQpLCBXVENQKDB4NjNjZGE5MTYsIDB4NTAyNTNhOGIpLAorICAgIFdUQ1AoMHg2M2FjMGUxOSwgMHg1MDRmMDFiYSksIFdUQ1AoMHg2MzhhNjE5ZSwgMHg1MDc4YmFkMSksCisgICAgV1RDUCgweDYzNjhhM2FkLCAweDUwYTI2NWM5KSwgV1RDUCgweDYzNDZkNDRiLCAweDUwY2MwMjljKSwKKyAgICBXVENQKDB4NjMyNGYzN2QsIDB4NTBmNTkxNDEpLCBXVENQKDB4NjMwMzAxNGEsIDB4NTExZjExYjIpLAorICAgIFdUQ1AoMHg2MmUwZmRiOCwgMHg1MTQ4ODNlNyksIFdUQ1AoMHg2MmJlZThjYywgMHg1MTcxZTdkOSksCisgICAgV1RDUCgweDYyOWNjMjhjLCAweDUxOWIzZDgwKSwgV1RDUCgweDYyN2E4YjAwLCAweDUxYzQ4NGQ2KSwKKyAgICBXVENQKDB4NjI1ODQyMmMsIDB4NTFlZGJkZDQpLCBXVENQKDB4NjIzNWU4MTYsIDB4NTIxNmU4NzEpLAorICAgIFdUQ1AoMHg2MjEzN2NjNSwgMHg1MjQwMDRhNyksIFdUQ1AoMHg2MWYxMDAzZiwgMHg1MjY5MTI2ZSksCisgICAgV1RDUCgweDYxY2U3Mjg5LCAweDUyOTIxMWMwKSwgV1RDUCgweDYxYWJkM2FiLCAweDUyYmIwMjk1KSwKKyAgICBXVENQKDB4NjE4OTIzYTksIDB4NTJlM2U0ZTYpLCBXVENQKDB4NjE2NjYyODksIDB4NTMwY2I4YWMpLAorICAgIFdUQ1AoMHg2MTQzOTA1MywgMHg1MzM1N2RkZiksIFdUQ1AoMHg2MTIwYWQwZCwgMHg1MzVlMzQ3OSksCisgICAgV1RDUCgweDYwZmRiOGJiLCAweDUzODZkYzcyKSwgV1RDUCgweDYwZGFiMzY1LCAweDUzYWY3NWMzKSwKKyAgICBXVENQKDB4NjBiNzlkMTAsIDB4NTNkODAwNjUpLCBXVENQKDB4NjA5NDc1YzMsIDB4NTQwMDdjNTEpLAorICAgIFdUQ1AoMHg2MDcxM2Q4NCwgMHg1NDI4ZTk4MCksIFdUQ1AoMHg2MDRkZjQ1OSwgMHg1NDUxNDdlYiksCisgICAgV1RDUCgweDYwMmE5YTQ4LCAweDU0Nzk5NzhhKSwgV1RDUCgweDYwMDcyZjU3LCAweDU0YTFkODU3KSwKKyAgICBXVENQKDB4NWZlM2IzOGQsIDB4NTRjYTBhNGIpLCBXVENQKDB4NWZjMDI2ZjAsIDB4NTRmMjJkNWQpLAorICAgIFdUQ1AoMHg1ZjljODk4NywgMHg1NTFhNDE4OSksIFdUQ1AoMHg1Zjc4ZGI1NiwgMHg1NTQyNDZjNiksCisgICAgV1RDUCgweDVmNTUxYzY1LCAweDU1NmEzZDBkKSwgV1RDUCgweDVmMzE0Y2JhLCAweDU1OTIyNDU3KSwKKyAgICBXVENQKDB4NWYwZDZjNWIsIDB4NTViOWZjOWUpLCBXVENQKDB4NWVlOTdiNGYsIDB4NTVlMWM1ZGEpLAorICAgIFdUQ1AoMHg1ZWM1Nzk5YiwgMHg1NjA5ODAwNSksIFdUQ1AoMHg1ZWExNjc0NywgMHg1NjMxMmIxNyksCisgICAgV1RDUCgweDVlN2Q0NDU4LCAweDU2NThjNzA5KSwgV1RDUCgweDVlNTkxMGQ0LCAweDU2ODA1M2Q1KSwKKyAgICBXVENQKDB4NWUzNGNjYzMsIDB4NTZhN2QxNzQpLCBXVENQKDB4NWUxMDc4MmIsIDB4NTZjZjNmZGUpLAorICAgIFdUQ1AoMHg1ZGVjMTMxMSwgMHg1NmY2OWYwZCksIFdUQ1AoMHg1ZGM3OWQ3YywgMHg1NzFkZWVmYSksCisgICAgV1RDUCgweDVkYTMxNzczLCAweDU3NDUyZjlkKSwgV1RDUCgweDVkN2U4MGZjLCAweDU3NmM2MGYxKSwKKyAgICBXVENQKDB4NWQ1OWRhMWUsIDB4NTc5MzgyZWUpLCBXVENQKDB4NWQzNTIyZGUsIDB4NTdiYTk1OGQpLAorICAgIFdUQ1AoMHg1ZDEwNWI0NCwgMHg1N2UxOThjNyksIFdUQ1AoMHg1Y2ViODM1NSwgMHg1ODA4OGM5NiksCisgICAgV1RDUCgweDVjYzY5YjE5LCAweDU4MmY3MGYzKSwgV1RDUCgweDVjYTFhMjk1LCAweDU4NTY0NWQ3KSwKKyAgICBXVENQKDB4NWM3Yzk5ZDEsIDB4NTg3ZDBiM2IpLCBXVENQKDB4NWM1NzgwZDMsIDB4NThhM2MxMTgpLAorICAgIFdUQ1AoMHg1YzMyNTdhMCwgMHg1OGNhNjc2NyksIFdUQ1AoMHg1YzBkMWU0MSwgMHg1OGYwZmUyMyksCisgICAgV1RDUCgweDViZTdkNGJhLCAweDU5MTc4NTQzKSwgV1RDUCgweDViYzI3YjE0LCAweDU5M2RmY2MyKSwKKyAgICBXVENQKDB4NWI5ZDExNTQsIDB4NTk2NDY0OTgpLCBXVENQKDB4NWI3Nzk3ODAsIDB4NTk4YWJjYmUpLAorICAgIFdUQ1AoMHg1YjUyMGRhMSwgMHg1OWIxMDUyZiksIFdUQ1AoMHg1YjJjNzNiYiwgMHg1OWQ3M2RlMyksCisgICAgV1RDUCgweDViMDZjOWQ2LCAweDU5ZmQ2NmQ0KSwgV1RDUCgweDVhZTEwZmY5LCAweDVhMjM3ZmZhKSwKKyAgICBXVENQKDB4NWFiYjQ2MjksIDB4NWE0OTg5NTApLCBXVENQKDB4NWE5NTZjNmUsIDB4NWE2ZjgyY2UpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIFNpbmVXaW5kb3cxMDI0W10gPSB7CisgICAgV1RDUCgweDdmZmZmZDg4LCAweDAwMTkyMWZiKSwgV1RDUCgweDdmZmZlOWNiLCAweDAwNGI2NWVlKSwKKyAgICBXVENQKDB4N2ZmZmMyNTEsIDB4MDA3ZGE5ZDQpLCBXVENQKDB4N2ZmZjg3MTksIDB4MDBhZmVkYTgpLAorICAgIFdUQ1AoMHg3ZmZmMzgyNCwgMHgwMGUyMzE2MCksIFdUQ1AoMHg3ZmZlZDU3MiwgMHgwMTE0NzRmNiksCisgICAgV1RDUCgweDdmZmU1ZjAzLCAweDAxNDZiODYwKSwgV1RDUCgweDdmZmRkNGQ3LCAweDAxNzhmYjk5KSwKKyAgICBXVENQKDB4N2ZmZDM2ZWUsIDB4MDFhYjNlOTcpLCBXVENQKDB4N2ZmYzg1NDksIDB4MDFkZDgxNTQpLAorICAgIFdUQ1AoMHg3ZmZiYmZlNiwgMHgwMjBmYzNjNiksIFdUQ1AoMHg3ZmZhZTZjNywgMHgwMjQyMDVlOCksCisgICAgV1RDUCgweDdmZjlmOWVjLCAweDAyNzQ0N2IwKSwgV1RDUCgweDdmZjhmOTU0LCAweDAyYTY4OTE3KSwKKyAgICBXVENQKDB4N2ZmN2U1MDAsIDB4MDJkOGNhMTYpLCBXVENQKDB4N2ZmNmJjZjAsIDB4MDMwYjBhYTQpLAorICAgIFdUQ1AoMHg3ZmY1ODEyNSwgMHgwMzNkNGFiYiksIFdUQ1AoMHg3ZmY0MzE5ZCwgMHgwMzZmOGE1MSksCisgICAgV1RDUCgweDdmZjJjZTViLCAweDAzYTFjOTYwKSwgV1RDUCgweDdmZjE1NzVkLCAweDAzZDQwN2RmKSwKKyAgICBXVENQKDB4N2ZlZmNjYTQsIDB4MDQwNjQ1YzcpLCBXVENQKDB4N2ZlZTJlMzAsIDB4MDQzODgzMTApLAorICAgIFdUQ1AoMHg3ZmVjN2MwMiwgMHgwNDZhYmZiMyksIFdUQ1AoMHg3ZmVhYjYxYSwgMHgwNDljZmJhNyksCisgICAgV1RDUCgweDdmZThkYzc4LCAweDA0Y2YzNmU1KSwgV1RDUCgweDdmZTZlZjFjLCAweDA1MDE3MTY1KSwKKyAgICBXVENQKDB4N2ZlNGVlMDYsIDB4MDUzM2FiMjApLCBXVENQKDB4N2ZlMmQ5MzgsIDB4MDU2NWU0MGQpLAorICAgIFdUQ1AoMHg3ZmUwYjBiMSwgMHgwNTk4MWMyNiksIFdUQ1AoMHg3ZmRlNzQ3MSwgMHgwNWNhNTM2MSksCisgICAgV1RDUCgweDdmZGMyNDdhLCAweDA1ZmM4OWI4KSwgV1RDUCgweDdmZDljMGNhLCAweDA2MmViZjIyKSwKKyAgICBXVENQKDB4N2ZkNzQ5NjQsIDB4MDY2MGYzOTgpLCBXVENQKDB4N2ZkNGJlNDYsIDB4MDY5MzI3MTMpLAorICAgIFdUQ1AoMHg3ZmQyMWY3MiwgMHgwNmM1NTk4YSksIFdUQ1AoMHg3ZmNmNmNlOCwgMHgwNmY3OGFmNiksCisgICAgV1RDUCgweDdmY2NhNmE3LCAweDA3MjliYjRlKSwgV1RDUCgweDdmYzljY2IyLCAweDA3NWJlYThjKSwKKyAgICBXVENQKDB4N2ZjNmRmMDgsIDB4MDc4ZTE4YTcpLCBXVENQKDB4N2ZjM2RkYTksIDB4MDdjMDQ1OTgpLAorICAgIFdUQ1AoMHg3ZmMwYzg5NiwgMHgwN2YyNzE1NyksIFdUQ1AoMHg3ZmJkOWZkMCwgMHgwODI0OWJkZCksCisgICAgV1RDUCgweDdmYmE2MzU3LCAweDA4NTZjNTIwKSwgV1RDUCgweDdmYjcxMzJiLCAweDA4ODhlZDFiKSwKKyAgICBXVENQKDB4N2ZiM2FmNGUsIDB4MDhiYjEzYzUpLCBXVENQKDB4N2ZiMDM3YmYsIDB4MDhlZDM5MTYpLAorICAgIFdUQ1AoMHg3ZmFjYWM3ZiwgMHgwOTFmNWQwNiksIFdUQ1AoMHg3ZmE5MGQ4ZSwgMHgwOTUxN2Y4ZiksCisgICAgV1RDUCgweDdmYTU1YWVlLCAweDA5ODNhMGE3KSwgV1RDUCgweDdmYTE5NDllLCAweDA5YjVjMDQ4KSwKKyAgICBXVENQKDB4N2Y5ZGJhYTAsIDB4MDllN2RlNmEpLCBXVENQKDB4N2Y5OWNjZjQsIDB4MGExOWZiMDQpLAorICAgIFdUQ1AoMHg3Zjk1Y2I5YSwgMHgwYTRjMTYxMCksIFdUQ1AoMHg3ZjkxYjY5NCwgMHgwYTdlMmY4NSksCisgICAgV1RDUCgweDdmOGQ4ZGUxLCAweDBhYjA0NzVjKSwgV1RDUCgweDdmODk1MTgyLCAweDBhZTI1ZDhkKSwKKyAgICBXVENQKDB4N2Y4NTAxNzksIDB4MGIxNDcyMTEpLCBXVENQKDB4N2Y4MDlkYzUsIDB4MGI0Njg0ZGYpLAorICAgIFdUQ1AoMHg3ZjdjMjY2OCwgMHgwYjc4OTVmMCksIFdUQ1AoMHg3Zjc3OWI2MiwgMHgwYmFhYTUzYiksCisgICAgV1RDUCgweDdmNzJmY2I0LCAweDBiZGNiMmJiKSwgV1RDUCgweDdmNmU0YTVlLCAweDBjMGViZTY2KSwKKyAgICBXVENQKDB4N2Y2OTg0NjEsIDB4MGM0MGM4MzUpLCBXVENQKDB4N2Y2NGFhYmYsIDB4MGM3MmQwMjApLAorICAgIFdUQ1AoMHg3ZjVmYmQ3NywgMHgwY2E0ZDYyMCksIFdUQ1AoMHg3ZjVhYmM4YSwgMHgwY2Q2ZGEyZCksCisgICAgV1RDUCgweDdmNTVhN2ZhLCAweDBkMDhkYzNmKSwgV1RDUCgweDdmNTA3ZmM3LCAweDBkM2FkYzRlKSwKKyAgICBXVENQKDB4N2Y0YjQzZjIsIDB4MGQ2Y2RhNTMpLCBXVENQKDB4N2Y0NWY0N2IsIDB4MGQ5ZWQ2NDYpLAorICAgIFdUQ1AoMHg3ZjQwOTE2NCwgMHgwZGQwZDAxZiksIFdUQ1AoMHg3ZjNiMWFhZCwgMHgwZTAyYzdkNyksCisgICAgV1RDUCgweDdmMzU5MDU3LCAweDBlMzRiZDY2KSwgV1RDUCgweDdmMmZmMjYzLCAweDBlNjZiMGMzKSwKKyAgICBXVENQKDB4N2YyYTQwZDIsIDB4MGU5OGExZTkpLCBXVENQKDB4N2YyNDdiYTUsIDB4MGVjYTkwY2UpLAorICAgIFdUQ1AoMHg3ZjFlYTJkYywgMHgwZWZjN2Q2YiksIFdUQ1AoMHg3ZjE4YjY3OSwgMHgwZjJlNjdiOCksCisgICAgV1RDUCgweDdmMTJiNjdjLCAweDBmNjA0ZmFmKSwgV1RDUCgweDdmMGNhMmU3LCAweDBmOTIzNTQ2KSwKKyAgICBXVENQKDB4N2YwNjdiYmEsIDB4MGZjNDE4NzYpLCBXVENQKDB4N2YwMDQwZjYsIDB4MGZmNWY5MzgpLAorICAgIFdUQ1AoMHg3ZWY5ZjI5ZCwgMHgxMDI3ZDc4NCksIFdUQ1AoMHg3ZWYzOTBhZSwgMHgxMDU5YjM1MiksCisgICAgV1RDUCgweDdlZWQxYjJjLCAweDEwOGI4YzliKSwgV1RDUCgweDdlZTY5MjE3LCAweDEwYmQ2MzU2KSwKKyAgICBXVENQKDB4N2VkZmY1NzAsIDB4MTBlZjM3N2QpLCBXVENQKDB4N2VkOTQ1MzgsIDB4MTEyMTA5MDcpLAorICAgIFdUQ1AoMHg3ZWQyODE3MSwgMHgxMTUyZDdlZCksIFdUQ1AoMHg3ZWNiYWExYSwgMHgxMTg0YTQyNyksCisgICAgV1RDUCgweDdlYzRiZjM2LCAweDExYjY2ZGFkKSwgV1RDUCgweDdlYmRjMGM2LCAweDExZTgzNDc4KSwKKyAgICBXVENQKDB4N2ViNmFlY2EsIDB4MTIxOWY4ODApLCBXVENQKDB4N2VhZjg5NDMsIDB4MTI0YmI5YmUpLAorICAgIFdUQ1AoMHg3ZWE4NTAzMywgMHgxMjdkNzgyOSksIFdUQ1AoMHg3ZWExMDM5YiwgMHgxMmFmMzNiYSksCisgICAgV1RDUCgweDdlOTlhMzdjLCAweDEyZTBlYzZhKSwgV1RDUCgweDdlOTIyZmQ2LCAweDEzMTJhMjMwKSwKKyAgICBXVENQKDB4N2U4YWE4YWMsIDB4MTM0NDU1MDUpLCBXVENQKDB4N2U4MzBkZmYsIDB4MTM3NjA0ZTIpLAorICAgIFdUQ1AoMHg3ZTdiNWZjZSwgMHgxM2E3YjFiZiksIFdUQ1AoMHg3ZTczOWUxZCwgMHgxM2Q5NWI5MyksCisgICAgV1RDUCgweDdlNmJjOGViLCAweDE0MGIwMjU4KSwgV1RDUCgweDdlNjNlMDNiLCAweDE0M2NhNjA1KSwKKyAgICBXVENQKDB4N2U1YmU0MGMsIDB4MTQ2ZTQ2OTQpLCBXVENQKDB4N2U1M2Q0NjIsIDB4MTQ5ZmUzZmMpLAorICAgIFdUQ1AoMHg3ZTRiYjEzYywgMHgxNGQxN2UzNiksIFdUQ1AoMHg3ZTQzN2E5YywgMHgxNTAzMTUzYSksCisgICAgV1RDUCgweDdlM2IzMDgzLCAweDE1MzRhOTAxKSwgV1RDUCgweDdlMzJkMmY0LCAweDE1NjYzOTgyKSwKKyAgICBXVENQKDB4N2UyYTYxZWQsIDB4MTU5N2M2YjcpLCBXVENQKDB4N2UyMWRkNzMsIDB4MTVjOTUwOTcpLAorICAgIFdUQ1AoMHg3ZTE5NDU4NCwgMHgxNWZhZDcxYiksIFdUQ1AoMHg3ZTEwOWEyNCwgMHgxNjJjNWEzYiksCisgICAgV1RDUCgweDdlMDdkYjUyLCAweDE2NWRkOWYwKSwgV1RDUCgweDdkZmYwOTExLCAweDE2OGY1NjMyKSwKKyAgICBXVENQKDB4N2RmNjIzNjIsIDB4MTZjMGNlZjkpLCBXVENQKDB4N2RlZDJhNDcsIDB4MTZmMjQ0M2UpLAorICAgIFdUQ1AoMHg3ZGU0MWRjMCwgMHgxNzIzYjVmOSksIFdUQ1AoMHg3ZGRhZmRjZSwgMHgxNzU1MjQyMiksCisgICAgV1RDUCgweDdkZDFjYTc1LCAweDE3ODY4ZWIzKSwgV1RDUCgweDdkYzg4M2I0LCAweDE3YjdmNWEzKSwKKyAgICBXVENQKDB4N2RiZjI5OGQsIDB4MTdlOTU4ZWEpLCBXVENQKDB4N2RiNWJjMDIsIDB4MTgxYWI4ODEpLAorICAgIFdUQ1AoMHg3ZGFjM2IxNSwgMHgxODRjMTQ2MSksIFdUQ1AoMHg3ZGEyYTZjNiwgMHgxODdkNmM4MiksCisgICAgV1RDUCgweDdkOThmZjE3LCAweDE4YWVjMGRiKSwgV1RDUCgweDdkOGY0NDA5LCAweDE4ZTAxMTY3KSwKKyAgICBXVENQKDB4N2Q4NTc1OWYsIDB4MTkxMTVlMWMpLCBXVENQKDB4N2Q3YjkzZGEsIDB4MTk0MmE2ZjMpLAorICAgIFdUQ1AoMHg3ZDcxOWViYSwgMHgxOTczZWJlNiksIFdUQ1AoMHg3ZDY3OTY0MiwgMHgxOWE1MmNlYiksCisgICAgV1RDUCgweDdkNWQ3YTc0LCAweDE5ZDY2OWZjKSwgV1RDUCgweDdkNTM0YjUwLCAweDFhMDdhMzExKSwKKyAgICBXVENQKDB4N2Q0OTA4ZDksIDB4MWEzOGQ4MjMpLCBXVENQKDB4N2QzZWIzMGYsIDB4MWE2YTA5MjkpLAorICAgIFdUQ1AoMHg3ZDM0NDlmNSwgMHgxYTliMzYxZCksIFdUQ1AoMHg3ZDI5Y2Q4YywgMHgxYWNjNWVmNiksCisgICAgV1RDUCgweDdkMWYzZGQ2LCAweDFhZmQ4M2FkKSwgV1RDUCgweDdkMTQ5YWQ1LCAweDFiMmVhNDNhKSwKKyAgICBXVENQKDB4N2QwOWU0ODksIDB4MWI1ZmMwOTcpLCBXVENQKDB4N2NmZjFhZjUsIDB4MWI5MGQ4YmIpLAorICAgIFdUQ1AoMHg3Y2Y0M2UxYSwgMHgxYmMxZWM5ZSksIFdUQ1AoMHg3Y2U5NGRmYiwgMHgxYmYyZmMzYSksCisgICAgV1RDUCgweDdjZGU0YTk4LCAweDFjMjQwNzg2KSwgV1RDUCgweDdjZDMzM2YzLCAweDFjNTUwZTdjKSwKKyAgICBXVENQKDB4N2NjODBhMGYsIDB4MWM4NjExMTMpLCBXVENQKDB4N2NiY2NjZWMsIDB4MWNiNzBmNDMpLAorICAgIFdUQ1AoMHg3Y2IxN2M4ZCwgMHgxY2U4MDkwNiksIFdUQ1AoMHg3Y2E2MThmMywgMHgxZDE4ZmU1NCksCisgICAgV1RDUCgweDdjOWFhMjIxLCAweDFkNDllZjI2KSwgV1RDUCgweDdjOGYxODE3LCAweDFkN2FkYjczKSwKKyAgICBXVENQKDB4N2M4MzdhZDgsIDB4MWRhYmMzMzQpLCBXVENQKDB4N2M3N2NhNjUsIDB4MWRkY2E2NjIpLAorICAgIFdUQ1AoMHg3YzZjMDZjMCwgMHgxZTBkODRmNSksIFdUQ1AoMHg3YzYwMmZlYywgMHgxZTNlNWVlNSksCisgICAgV1RDUCgweDdjNTQ0NWU5LCAweDFlNmYzNDJjKSwgV1RDUCgweDdjNDg0OGJhLCAweDFlYTAwNGMxKSwKKyAgICBXVENQKDB4N2MzYzM4NjAsIDB4MWVkMGQwOWQpLCBXVENQKDB4N2MzMDE0ZGUsIDB4MWYwMTk3YjgpLAorICAgIFdUQ1AoMHg3YzIzZGUzNSwgMHgxZjMyNWEwYiksIFdUQ1AoMHg3YzE3OTQ2NywgMHgxZjYzMTc4ZiksCisgICAgV1RDUCgweDdjMGIzNzc3LCAweDFmOTNkMDNjKSwgV1RDUCgweDdiZmVjNzY1LCAweDFmYzQ4NDBhKSwKKyAgICBXVENQKDB4N2JmMjQ0MzQsIDB4MWZmNTMyZjIpLCBXVENQKDB4N2JlNWFkZTYsIDB4MjAyNWRjZWMpLAorICAgIFdUQ1AoMHg3YmQ5MDQ3YywgMHgyMDU2ODFmMSksIFdUQ1AoMHg3YmNjNDdmYSwgMHgyMDg3MjFmOSksCisgICAgV1RDUCgweDdiYmY3ODYwLCAweDIwYjdiY2ZlKSwgV1RDUCgweDdiYjI5NWIwLCAweDIwZTg1MmY2KSwKKyAgICBXVENQKDB4N2JhNTlmZWUsIDB4MjExOGUzZGMpLCBXVENQKDB4N2I5ODk3MTksIDB4MjE0OTZmYTcpLAorICAgIFdUQ1AoMHg3YjhiN2IzNiwgMHgyMTc5ZjY0ZiksIFdUQ1AoMHg3YjdlNGM0NSwgMHgyMWFhNzdjZiksCisgICAgV1RDUCgweDdiNzEwYTQ5LCAweDIxZGFmNDFkKSwgV1RDUCgweDdiNjNiNTQzLCAweDIyMGI2YjMyKSwKKyAgICBXVENQKDB4N2I1NjRkMzYsIDB4MjIzYmRkMDgpLCBXVENQKDB4N2I0OGQyMjUsIDB4MjI2YzQ5OTYpLAorICAgIFdUQ1AoMHg3YjNiNDQxMCwgMHgyMjljYjBkNSksIFdUQ1AoMHg3YjJkYTJmYSwgMHgyMmNkMTJiZCksCisgICAgV1RDUCgweDdiMWZlZWU1LCAweDIyZmQ2ZjQ4KSwgV1RDUCgweDdiMTIyN2QzLCAweDIzMmRjNjZkKSwKKyAgICBXVENQKDB4N2IwNDRkYzcsIDB4MjM1ZTE4MjYpLCBXVENQKDB4N2FmNjYwYzIsIDB4MjM4ZTY0NmEpLAorICAgIFdUQ1AoMHg3YWU4NjBjNywgMHgyM2JlYWIzMyksIFdUQ1AoMHg3YWRhNGRkOCwgMHgyM2VlZWM3OCksCisgICAgV1RDUCgweDdhY2MyN2Y3LCAweDI0MWYyODMzKSwgV1RDUCgweDdhYmRlZjI1LCAweDI0NGY1ZTVjKSwKKyAgICBXVENQKDB4N2FhZmEzNjcsIDB4MjQ3ZjhlZWMpLCBXVENQKDB4N2FhMTQ0YmMsIDB4MjRhZmI5ZGEpLAorICAgIFdUQ1AoMHg3YTkyZDMyOSwgMHgyNGRmZGYyMCksIFdUQ1AoMHg3YTg0NGVhZSwgMHgyNTBmZmViNyksCisgICAgV1RDUCgweDdhNzViNzRmLCAweDI1NDAxODk2KSwgV1RDUCgweDdhNjcwZDBkLCAweDI1NzAyY2I3KSwKKyAgICBXVENQKDB4N2E1ODRmZWIsIDB4MjVhMDNiMTEpLCBXVENQKDB4N2E0OTdmZWIsIDB4MjVkMDQzOWYpLAorICAgIFdUQ1AoMHg3YTNhOWQwZiwgMHgyNjAwNDY1NyksIFdUQ1AoMHg3YTJiYTc1YSwgMHgyNjMwNDMzMyksCisgICAgV1RDUCgweDdhMWM5ZWNlLCAweDI2NjAzYTJjKSwgV1RDUCgweDdhMGQ4MzZkLCAweDI2OTAyYjM5KSwKKyAgICBXVENQKDB4NzlmZTU1MzksIDB4MjZjMDE2NTUpLCBXVENQKDB4NzllZjE0MzYsIDB4MjZlZmZiNzYpLAorICAgIFdUQ1AoMHg3OWRmYzA2NCwgMHgyNzFmZGE5NiksIFdUQ1AoMHg3OWQwNTljOCwgMHgyNzRmYjNhZSksCisgICAgV1RDUCgweDc5YzBlMDYyLCAweDI3N2Y4NmI1KSwgV1RDUCgweDc5YjE1NDM1LCAweDI3YWY1M2E2KSwKKyAgICBXVENQKDB4NzlhMWI1NDUsIDB4MjdkZjFhNzcpLCBXVENQKDB4Nzk5MjAzOTIsIDB4MjgwZWRiMjMpLAorICAgIFdUQ1AoMHg3OTgyM2YyMCwgMHgyODNlOTVhMSksIFdUQ1AoMHg3OTcyNjdmMiwgMHgyODZlNDllYSksCisgICAgV1RDUCgweDc5NjI3ZTA4LCAweDI4OWRmN2Y4KSwgV1RDUCgweDc5NTI4MTY3LCAweDI4Y2Q5ZmMxKSwKKyAgICBXVENQKDB4Nzk0MjcyMTAsIDB4MjhmZDQxNDApLCBXVENQKDB4NzkzMjUwMDYsIDB4MjkyY2RjNmQpLAorICAgIFdUQ1AoMHg3OTIyMWI0YiwgMHgyOTVjNzE0MCksIFdUQ1AoMHg3OTExZDNlMiwgMHgyOThiZmZiMiksCisgICAgV1RDUCgweDc5MDE3OWNkLCAweDI5YmI4N2JjKSwgV1RDUCgweDc4ZjEwZDBmLCAweDI5ZWIwOTU3KSwKKyAgICBXVENQKDB4NzhlMDhkYWIsIDB4MmExYTg0N2IpLCBXVENQKDB4NzhjZmZiYTMsIDB4MmE0OWY5MjApLAorICAgIFdUQ1AoMHg3OGJmNTZmOSwgMHgyYTc5Njc0MCksIFdUQ1AoMHg3OGFlOWZiMCwgMHgyYWE4Y2VkMyksCisgICAgV1RDUCgweDc4OWRkNWNiLCAweDJhZDgyZmQyKSwgV1RDUCgweDc4OGNmOTRjLCAweDJiMDc4YTM2KSwKKyAgICBXVENQKDB4Nzg3YzBhMzYsIDB4MmIzNmRkZjcpLCBXVENQKDB4Nzg2YjA4OGMsIDB4MmI2NjJiMGUpLAorICAgIFdUQ1AoMHg3ODU5ZjQ0ZiwgMHgyYjk1NzE3MyksIFdUQ1AoMHg3ODQ4Y2Q4MywgMHgyYmM0YjEyMCksCisgICAgV1RDUCgweDc4Mzc5NDJiLCAweDJiZjNlYTBkKSwgV1RDUCgweDc4MjY0ODQ5LCAweDJjMjMxYzMzKSwKKyAgICBXVENQKDB4NzgxNGU5ZGYsIDB4MmM1MjQ3OGEpLCBXVENQKDB4NzgwMzc4ZjEsIDB4MmM4MTZjMGMpLAorICAgIFdUQ1AoMHg3N2YxZjU4MSwgMHgyY2IwODliMSksIFdUQ1AoMHg3N2UwNWY5MSwgMHgyY2RmYTA3MSksCisgICAgV1RDUCgweDc3Y2ViNzI1LCAweDJkMGViMDQ2KSwgV1RDUCgweDc3YmNmYzNmLCAweDJkM2RiOTI4KSwKKyAgICBXVENQKDB4NzdhYjJlZTIsIDB4MmQ2Y2JiMTApLCBXVENQKDB4Nzc5OTRmMTEsIDB4MmQ5YmI1ZjYpLAorICAgIFdUQ1AoMHg3Nzg3NWNjZSwgMHgyZGNhYTlkNSksIFdUQ1AoMHg3Nzc1NTgxZCwgMHgyZGY5OTZhMyksCisgICAgV1RDUCgweDc3NjM0MGZmLCAweDJlMjg3YzVhKSwgV1RDUCgweDc3NTExNzc4LCAweDJlNTc1YWYzKSwKKyAgICBXVENQKDB4NzczZWRiOGIsIDB4MmU4NjMyNjcpLCBXVENQKDB4NzcyYzhkM2EsIDB4MmViNTAyYWUpLAorICAgIFdUQ1AoMHg3NzFhMmM4OCwgMHgyZWUzY2JjMSksIFdUQ1AoMHg3NzA3Yjk3OSwgMHgyZjEyOGQ5OSksCisgICAgV1RDUCgweDc2ZjUzNDBlLCAweDJmNDE0ODJlKSwgV1RDUCgweDc2ZTI5YzRiLCAweDJmNmZmYjdhKSwKKyAgICBXVENQKDB4NzZjZmYyMzIsIDB4MmY5ZWE3NzUpLCBXVENQKDB4NzZiZDM1YzcsIDB4MmZjZDRjMTkpLAorICAgIFdUQ1AoMHg3NmFhNjcwZCwgMHgyZmZiZTk1ZCksIFdUQ1AoMHg3Njk3ODYwNSwgMHgzMDJhN2YzYSksCisgICAgV1RDUCgweDc2ODQ5MmI0LCAweDMwNTkwZGFiKSwgV1RDUCgweDc2NzE4ZDFjLCAweDMwODc5NGE2KSwKKyAgICBXVENQKDB4NzY1ZTc1NDAsIDB4MzBiNjE0MjYpLCBXVENQKDB4NzY0YjRiMjMsIDB4MzBlNDhjMjIpLAorICAgIFdUQ1AoMHg3NjM4MGVjOCwgMHgzMTEyZmM5NSksIFdUQ1AoMHg3NjI0YzAzMSwgMHgzMTQxNjU3NiksCisgICAgV1RDUCgweDc2MTE1ZjYzLCAweDMxNmZjNmJlKSwgV1RDUCgweDc1ZmRlYzYwLCAweDMxOWUyMDY3KSwKKyAgICBXVENQKDB4NzVlYTY3MmEsIDB4MzFjYzcyNjkpLCBXVENQKDB4NzVkNmNmYzUsIDB4MzFmYWJjYmQpLAorICAgIFdUQ1AoMHg3NWMzMjYzNCwgMHgzMjI4ZmY1YyksIFdUQ1AoMHg3NWFmNmE3YiwgMHgzMjU3M2EzZiksCisgICAgV1RDUCgweDc1OWI5YzliLCAweDMyODU2ZDVlKSwgV1RDUCgweDc1ODdiYzk4LCAweDMyYjM5OGIzKSwKKyAgICBXVENQKDB4NzU3M2NhNzUsIDB4MzJlMWJjMzYpLCBXVENQKDB4NzU1ZmM2MzUsIDB4MzMwZmQ3ZTEpLAorICAgIFdUQ1AoMHg3NTRiYWZkYywgMHgzMzNkZWJhYiksIFdUQ1AoMHg3NTM3ODc2YywgMHgzMzZiZjc4ZiksCisgICAgV1RDUCgweDc1MjM0Y2U4LCAweDMzOTlmYjg1KSwgV1RDUCgweDc1MGYwMDU0LCAweDMzYzdmNzg1KSwKKyAgICBXVENQKDB4NzRmYWExYjMsIDB4MzNmNWViODkpLCBXVENQKDB4NzRlNjMxMDgsIDB4MzQyM2Q3OGEpLAorICAgIFdUQ1AoMHg3NGQxYWU1NSwgMHgzNDUxYmI4MSksIFdUQ1AoMHg3NGJkMTk5ZiwgMHgzNDdmOTc2NiksCisgICAgV1RDUCgweDc0YTg3MmU4LCAweDM0YWQ2YjMyKSwgV1RDUCgweDc0OTNiYTM0LCAweDM0ZGIzNmRmKSwKKyAgICBXVENQKDB4NzQ3ZWVmODUsIDB4MzUwOGZhNjYpLCBXVENQKDB4NzQ2YTEyZGYsIDB4MzUzNmI1YmUpLAorICAgIFdUQ1AoMHg3NDU1MjQ0NiwgMHgzNTY0NjhlMiksIFdUQ1AoMHg3NDQwMjNiYywgMHgzNTkyMTNjOSksCisgICAgV1RDUCgweDc0MmIxMTQ0LCAweDM1YmZiNjZlKSwgV1RDUCgweDc0MTVlY2UyLCAweDM1ZWQ1MGM5KSwKKyAgICBXVENQKDB4NzQwMGI2OWEsIDB4MzYxYWUyZDMpLCBXVENQKDB4NzNlYjZlNmUsIDB4MzY0ODZjODYpLAorICAgIFdUQ1AoMHg3M2Q2MTQ2MSwgMHgzNjc1ZWRkOSksIFdUQ1AoMHg3M2MwYTg3OCwgMHgzNmEzNjZjNiksCisgICAgV1RDUCgweDczYWIyYWI0LCAweDM2ZDBkNzQ2KSwgV1RDUCgweDczOTU5YjFiLCAweDM2ZmUzZjUyKSwKKyAgICBXVENQKDB4NzM3ZmY5YWUsIDB4MzcyYjllZTMpLCBXVENQKDB4NzM2YTQ2NzEsIDB4Mzc1OGY1ZjIpLAorICAgIFdUQ1AoMHg3MzU0ODE2OCwgMHgzNzg2NDQ3NyksIFdUQ1AoMHg3MzNlYWE5NiwgMHgzN2IzOGE2ZCksCisgICAgV1RDUCgweDczMjhjMWZmLCAweDM3ZTBjN2NjKSwgV1RDUCgweDczMTJjN2E1LCAweDM4MGRmYzhkKSwKKyAgICBXVENQKDB4NzJmY2JiOGMsIDB4MzgzYjI4YTkpLCBXVENQKDB4NzJlNjlkYjcsIDB4Mzg2ODRjMTkpLAorICAgIFdUQ1AoMHg3MmQwNmUyYiwgMHgzODk1NjZkNiksIFdUQ1AoMHg3MmJhMmNlYSwgMHgzOGMyNzhkOSksCisgICAgV1RDUCgweDcyYTNkOWY3LCAweDM4ZWY4MjFjKSwgV1RDUCgweDcyOGQ3NTU3LCAweDM5MWM4Mjk3KSwKKyAgICBXVENQKDB4NzI3NmZmMGQsIDB4Mzk0OTdhNDMpLCBXVENQKDB4NzI2MDc3MWIsIDB4Mzk3NjY5MTkpLAorICAgIFdUQ1AoMHg3MjQ5ZGQ4NiwgMHgzOWEzNGYxMyksIFdUQ1AoMHg3MjMzMzI1MSwgMHgzOWQwMmMyYSksCisgICAgV1RDUCgweDcyMWM3NTgwLCAweDM5ZmQwMDU2KSwgV1RDUCgweDcyMDVhNzE2LCAweDNhMjljYjkxKSwKKyAgICBXVENQKDB4NzFlZWM3MTYsIDB4M2E1NjhkZDQpLCBXVENQKDB4NzFkN2Q1ODUsIDB4M2E4MzQ3MTcpLAorICAgIFdUQ1AoMHg3MWMwZDI2NSwgMHgzYWFmZjc1NSksIFdUQ1AoMHg3MWE5YmRiYSwgMHgzYWRjOWU4NiksCisgICAgV1RDUCgweDcxOTI5Nzg5LCAweDNiMDkzY2EzKSwgV1RDUCgweDcxN2I1ZmQzLCAweDNiMzVkMWE1KSwKKyAgICBXVENQKDB4NzE2NDE2OWQsIDB4M2I2MjVkODYpLCBXVENQKDB4NzE0Y2JiZWIsIDB4M2I4ZWUwM2UpLAorICAgIFdUQ1AoMHg3MTM1NGZjMCwgMHgzYmJiNTljNyksIFdUQ1AoMHg3MTFkZDIyMCwgMHgzYmU3Y2ExYSksCisgICAgV1RDUCgweDcxMDY0MzBlLCAweDNjMTQzMTMwKSwgV1RDUCgweDcwZWVhMjhlLCAweDNjNDA4ZjAzKSwKKyAgICBXVENQKDB4NzBkNmYwYTQsIDB4M2M2Y2UzOGEpLCBXVENQKDB4NzBiZjJkNTMsIDB4M2M5OTJlYzApLAorICAgIFdUQ1AoMHg3MGE3NTg5ZiwgMHgzY2M1NzA5ZSksIFdUQ1AoMHg3MDhmNzI4YiwgMHgzY2YxYTkxYyksCisgICAgV1RDUCgweDcwNzc3YjFjLCAweDNkMWRkODM1KSwgV1RDUCgweDcwNWY3MjU1LCAweDNkNDlmZGUxKSwKKyAgICBXVENQKDB4NzA0NzU4MzksIDB4M2Q3NjFhMTkpLCBXVENQKDB4NzAyZjJjY2QsIDB4M2RhMjJjZDcpLAorICAgIFdUQ1AoMHg3MDE2ZjAxNCwgMHgzZGNlMzYxNCksIFdUQ1AoMHg2ZmZlYTIxMiwgMHgzZGZhMzVjOCksCisgICAgV1RDUCgweDZmZTY0MmNhLCAweDNlMjYyYmVlKSwgV1RDUCgweDZmY2RkMjQxLCAweDNlNTIxODdmKSwKKyAgICBXVENQKDB4NmZiNTUwN2EsIDB4M2U3ZGZiNzMpLCBXVENQKDB4NmY5Y2JkNzksIDB4M2VhOWQ0YzMpLAorICAgIFdUQ1AoMHg2Zjg0MTk0MiwgMHgzZWQ1YTQ2YiksIFdUQ1AoMHg2ZjZiNjNkOCwgMHgzZjAxNmE2MSksCisgICAgV1RDUCgweDZmNTI5ZDQwLCAweDNmMmQyNmEwKSwgV1RDUCgweDZmMzljNTdkLCAweDNmNThkOTIxKSwKKyAgICBXVENQKDB4NmYyMGRjOTIsIDB4M2Y4NDgxZGQpLCBXVENQKDB4NmYwN2UyODUsIDB4M2ZiMDIwY2UpLAorICAgIFdUQ1AoMHg2ZWVlZDc1OCwgMHgzZmRiYjVlYyksIFdUQ1AoMHg2ZWQ1YmIxMCwgMHg0MDA3NDEzMiksCisgICAgV1RDUCgweDZlYmM4ZGIwLCAweDQwMzJjMjk3KSwgV1RDUCgweDZlYTM0ZjNkLCAweDQwNWUzYTE2KSwKKyAgICBXVENQKDB4NmU4OWZmYjksIDB4NDA4OWE3YTgpLCBXVENQKDB4NmU3MDlmMmEsIDB4NDBiNTBiNDYpLAorICAgIFdUQ1AoMHg2ZTU3MmQ5MywgMHg0MGUwNjRlYSksIFdUQ1AoMHg2ZTNkYWFmOCwgMHg0MTBiYjQ4YyksCisgICAgV1RDUCgweDZlMjQxNzVjLCAweDQxMzZmYTI3KSwgV1RDUCgweDZlMGE3MmM1LCAweDQxNjIzNWIyKSwKKyAgICBXVENQKDB4NmRmMGJkMzUsIDB4NDE4ZDY3MjkpLCBXVENQKDB4NmRkNmY2YjEsIDB4NDFiODhlODQpLAorICAgIFdUQ1AoMHg2ZGJkMWYzYywgMHg0MWUzYWJiYyksIFdUQ1AoMHg2ZGEzMzZkYywgMHg0MjBlYmVjYiksCisgICAgV1RDUCgweDZkODkzZDkzLCAweDQyMzljN2FhKSwgV1RDUCgweDZkNmYzMzY1LCAweDQyNjRjNjUzKSwKKyAgICBXVENQKDB4NmQ1NTE4NTgsIDB4NDI4ZmJhYmUpLCBXVENQKDB4NmQzYWVjNmUsIDB4NDJiYWE0ZTYpLAorICAgIFdUQ1AoMHg2ZDIwYWZhYywgMHg0MmU1ODRjMyksIFdUQ1AoMHg2ZDA2NjIxNSwgMHg0MzEwNWE1MCksCisgICAgV1RDUCgweDZjZWMwM2FmLCAweDQzM2IyNTg1KSwgV1RDUCgweDZjZDE5NDdjLCAweDQzNjVlNjViKSwKKyAgICBXVENQKDB4NmNiNzE0ODIsIDB4NDM5MDljY2QpLCBXVENQKDB4NmM5YzgzYzMsIDB4NDNiYjQ4ZDQpLAorICAgIFdUQ1AoMHg2YzgxZTI0NSwgMHg0M2U1ZWE2OCksIFdUQ1AoMHg2YzY3MzAwYiwgMHg0NDEwODE4NCksCisgICAgV1RDUCgweDZjNGM2ZDFhLCAweDQ0M2IwZTIxKSwgV1RDUCgweDZjMzE5OTc1LCAweDQ0NjU5MDM5KSwKKyAgICBXVENQKDB4NmMxNmI1MjEsIDB4NDQ5MDA3YzQpLCBXVENQKDB4NmJmYmMwMjEsIDB4NDRiYTc0YmQpLAorICAgIFdUQ1AoMHg2YmUwYmE3YiwgMHg0NGU0ZDcxYyksIFdUQ1AoMHg2YmM1YTQzMSwgMHg0NTBmMmVkYiksCisgICAgV1RDUCgweDZiYWE3ZDQ5LCAweDQ1Mzk3YmY0KSwgV1RDUCgweDZiOGY0NWM3LCAweDQ1NjNiZTYwKSwKKyAgICBXVENQKDB4NmI3M2ZkYWUsIDB4NDU4ZGY2MTkpLCBXVENQKDB4NmI1OGE1MDMsIDB4NDViODIzMTgpLAorICAgIFdUQ1AoMHg2YjNkM2JjYiwgMHg0NWUyNDU1NiksIFdUQ1AoMHg2YjIxYzIwOCwgMHg0NjBjNWNjZSksCisgICAgV1RDUCgweDZiMDYzN2MxLCAweDQ2MzY2OTc4KSwgV1RDUCgweDZhZWE5Y2Y4LCAweDQ2NjA2YjRlKSwKKyAgICBXVENQKDB4NmFjZWYxYjIsIDB4NDY4YTYyNGEpLCBXVENQKDB4NmFiMzM1ZjQsIDB4NDZiNDRlNjUpLAorICAgIFdUQ1AoMHg2YTk3NjljMSwgMHg0NmRlMmY5OSksIFdUQ1AoMHg2YTdiOGQxZSwgMHg0NzA4MDVkZiksCisgICAgV1RDUCgweDZhNWZhMDEwLCAweDQ3MzFkMTMxKSwgV1RDUCgweDZhNDNhMjlhLCAweDQ3NWI5MTg4KSwKKyAgICBXVENQKDB4NmEyNzk0YzEsIDB4NDc4NTQ2ZGUpLCBXVENQKDB4NmEwYjc2ODksIDB4NDdhZWYxMmMpLAorICAgIFdUQ1AoMHg2OWVmNDdmNiwgMHg0N2Q4OTA2ZCksIFdUQ1AoMHg2OWQzMDkwZSwgMHg0ODAyMjQ5OSksCisgICAgV1RDUCgweDY5YjZiOWQzLCAweDQ4MmJhZGFiKSwgV1RDUCgweDY5OWE1YTRjLCAweDQ4NTUyYjliKSwKKyAgICBXVENQKDB4Njk3ZGVhN2IsIDB4NDg3ZTllNjQpLCBXVENQKDB4Njk2MTZhNjUsIDB4NDhhODA1ZmYpLAorICAgIFdUQ1AoMHg2OTQ0ZGExMCwgMHg0OGQxNjI2NSksIFdUQ1AoMHg2OTI4Mzk3ZSwgMHg0OGZhYjM5MSksCisgICAgV1RDUCgweDY5MGI4OGI1LCAweDQ5MjNmOTdiKSwgV1RDUCgweDY4ZWVjN2I5LCAweDQ5NGQzNDFlKSwKKyAgICBXVENQKDB4NjhkMWY2OGYsIDB4NDk3NjYzNzMpLCBXVENQKDB4NjhiNTE1M2EsIDB4NDk5Zjg3NzQpLAorICAgIFdUQ1AoMHg2ODk4MjNiZiwgMHg0OWM4YTAxYiksIFdUQ1AoMHg2ODdiMjIyNCwgMHg0OWYxYWQ2MSksCisgICAgV1RDUCgweDY4NWUxMDZjLCAweDRhMWFhZjNmKSwgV1RDUCgweDY4NDBlZTliLCAweDRhNDNhNWIwKSwKKyAgICBXVENQKDB4NjgyM2JjYjcsIDB4NGE2YzkwYWQpLCBXVENQKDB4NjgwNjdhYzMsIDB4NGE5NTcwMzApLAorICAgIFdUQ1AoMHg2N2U5MjhjNSwgMHg0YWJlNDQzMyksIFdUQ1AoMHg2N2NiYzZjMCwgMHg0YWU3MGNhZiksCisgICAgV1RDUCgweDY3YWU1NGJhLCAweDRiMGZjOTlkKSwgV1RDUCgweDY3OTBkMmI2LCAweDRiMzg3YWY5KSwKKyAgICBXVENQKDB4Njc3MzQwYmEsIDB4NGI2MTIwYmIpLCBXVENQKDB4Njc1NTllY2EsIDB4NGI4OWJhZGQpLAorICAgIFdUQ1AoMHg2NzM3ZWNlYSwgMHg0YmIyNDk1OCksIFdUQ1AoMHg2NzFhMmIyMCwgMHg0YmRhY2MyOCksCisgICAgV1RDUCgweDY2ZmM1OTZmLCAweDRjMDM0MzQ1KSwgV1RDUCgweDY2ZGU3N2RjLCAweDRjMmJhZWE5KSwKKyAgICBXVENQKDB4NjZjMDg2NmQsIDB4NGM1NDBlNGUpLCBXVENQKDB4NjZhMjg1MjQsIDB4NGM3YzYyMmQpLAorICAgIFdUQ1AoMHg2Njg0NzQwOCwgMHg0Y2E0YWE0MSksIFdUQ1AoMHg2NjY2NTMxZCwgMHg0Y2NjZTY4NCksCisgICAgV1RDUCgweDY2NDgyMjY3LCAweDRjZjUxNmVlKSwgV1RDUCgweDY2MjllMWVjLCAweDRkMWQzYjdhKSwKKyAgICBXVENQKDB4NjYwYjkxYWYsIDB4NGQ0NTU0MjIpLCBXVENQKDB4NjVlZDMxYjUsIDB4NGQ2ZDYwZGYpLAorICAgIFdUQ1AoMHg2NWNlYzIwNCwgMHg0ZDk1NjFhYyksIFdUQ1AoMHg2NWIwNDI5ZiwgMHg0ZGJkNTY4MiksCisgICAgV1RDUCgweDY1OTFiMzhjLCAweDRkZTUzZjVhKSwgV1RDUCgweDY1NzMxNGNmLCAweDRlMGQxYzMwKSwKKyAgICBXVENQKDB4NjU1NDY2NmQsIDB4NGUzNGVjZmMpLCBXVENQKDB4NjUzNWE4NmIsIDB4NGU1Y2IxYjkpLAorICAgIFdUQ1AoMHg2NTE2ZGFjZCwgMHg0ZTg0NmE2MCksIFdUQ1AoMHg2NGY3ZmQ5OCwgMHg0ZWFjMTZlYiksCisgICAgV1RDUCgweDY0ZDkxMGQxLCAweDRlZDNiNzU1KSwgV1RDUCgweDY0YmExNDdkLCAweDRlZmI0Yjk2KSwKKyAgICBXVENQKDB4NjQ5YjA4YTAsIDB4NGYyMmQzYWEpLCBXVENQKDB4NjQ3YmVkM2YsIDB4NGY0YTRmODkpLAorICAgIFdUQ1AoMHg2NDVjYzI2MCwgMHg0ZjcxYmYyZSksIFdUQ1AoMHg2NDNkODgwNiwgMHg0Zjk5MjI5MyksCisgICAgV1RDUCgweDY0MWUzZTM4LCAweDRmYzA3OWIxKSwgV1RDUCgweDYzZmVlNGY4LCAweDRmZTdjNDgzKSwKKyAgICBXVENQKDB4NjNkZjdjNGQsIDB4NTAwZjAzMDIpLCBXVENQKDB4NjNjMDA0M2IsIDB4NTAzNjM1MjkpLAorICAgIFdUQ1AoMHg2M2EwN2NjNywgMHg1MDVkNWFmMSksIFdUQ1AoMHg2MzgwZTVmNiwgMHg1MDg0NzQ1NCksCisgICAgV1RDUCgweDYzNjEzZmNkLCAweDUwYWI4MTRkKSwgV1RDUCgweDYzNDE4YTUwLCAweDUwZDI4MWQ1KSwKKyAgICBXVENQKDB4NjMyMWM1ODUsIDB4NTBmOTc1ZTYpLCBXVENQKDB4NjMwMWYxNzEsIDB4NTEyMDVkN2IpLAorICAgIFdUQ1AoMHg2MmUyMGUxNywgMHg1MTQ3Mzg4YyksIFdUQ1AoMHg2MmMyMWI3ZSwgMHg1MTZlMDcxNSksCisgICAgV1RDUCgweDYyYTIxOWFhLCAweDUxOTRjOTEwKSwgV1RDUCgweDYyODIwOGExLCAweDUxYmI3ZTc1KSwKKyAgICBXVENQKDB4NjI2MWU4NjYsIDB4NTFlMjI3NDApLCBXVENQKDB4NjI0MWI4ZmYsIDB4NTIwOGMzNmEpLAorICAgIFdUQ1AoMHg2MjIxN2E3MiwgMHg1MjJmNTJlZSksIFdUQ1AoMHg2MjAxMmNjMiwgMHg1MjU1ZDVjNSksCisgICAgV1RDUCgweDYxZTBjZmY1LCAweDUyN2M0YmVhKSwgV1RDUCgweDYxYzA2NDEwLCAweDUyYTJiNTU2KSwKKyAgICBXVENQKDB4NjE5ZmU5MTgsIDB4NTJjOTEyMDQpLCBXVENQKDB4NjE3ZjVmMTIsIDB4NTJlZjYxZWUpLAorICAgIFdUQ1AoMHg2MTVlYzYwMywgMHg1MzE1YTUwZSksIFdUQ1AoMHg2MTNlMWRmMCwgMHg1MzNiZGI1ZCksCisgICAgV1RDUCgweDYxMWQ2NmRlLCAweDUzNjIwNGQ3KSwgV1RDUCgweDYwZmNhMGQyLCAweDUzODgyMTc1KSwKKyAgICBXVENQKDB4NjBkYmNiZDEsIDB4NTNhZTMxMzEpLCBXVENQKDB4NjBiYWU3ZTEsIDB4NTNkNDM0MDYpLAorICAgIFdUQ1AoMHg2MDk5ZjUwNSwgMHg1M2ZhMjllZCksIFdUQ1AoMHg2MDc4ZjM0NCwgMHg1NDIwMTJlMSksCisgICAgV1RDUCgweDYwNTdlMmEyLCAweDU0NDVlZWRiKSwgV1RDUCgweDYwMzZjMzI1LCAweDU0NmJiZGQ3KSwKKyAgICBXVENQKDB4NjAxNTk0ZDEsIDB4NTQ5MTdmY2UpLCBXVENQKDB4NWZmNDU3YWQsIDB4NTRiNzM0YmEpLAorICAgIFdUQ1AoMHg1ZmQzMGJiYywgMHg1NGRjZGM5NiksIFdUQ1AoMHg1ZmIxYjEwNCwgMHg1NTAyNzc1YyksCisgICAgV1RDUCgweDVmOTA0NzhhLCAweDU1MjgwNTA1KSwgV1RDUCgweDVmNmVjZjUzLCAweDU1NGQ4NThkKSwKKyAgICBXVENQKDB4NWY0ZDQ4NjUsIDB4NTU3MmY4ZWQpLCBXVENQKDB4NWYyYmIyYzUsIDB4NTU5ODVmMjApLAorICAgIFdUQ1AoMHg1ZjBhMGU3NywgMHg1NWJkYjgxZiksIFdUQ1AoMHg1ZWU4NWI4MiwgMHg1NWUzMDNlNiksCisgICAgV1RDUCgweDVlYzY5OWU5LCAweDU2MDg0MjZlKSwgV1RDUCgweDVlYTRjOWIzLCAweDU2MmQ3M2IyKSwKKyAgICBXVENQKDB4NWU4MmVhZTUsIDB4NTY1Mjk3YWIpLCBXVENQKDB4NWU2MGZkODQsIDB4NTY3N2FlNTQpLAorICAgIFdUQ1AoMHg1ZTNmMDE5NCwgMHg1NjljYjdhOCksIFdUQ1AoMHg1ZTFjZjcxYywgMHg1NmMxYjNhMSksCisgICAgV1RDUCgweDVkZmFkZTIwLCAweDU2ZTZhMjM5KSwgV1RDUCgweDVkZDhiNmE3LCAweDU3MGI4MzY5KSwKKyAgICBXVENQKDB4NWRiNjgwYjQsIDB4NTczMDU3MmUpLCBXVENQKDB4NWQ5NDNjNGUsIDB4NTc1NTFkODApLAorICAgIFdUQ1AoMHg1ZDcxZTk3OSwgMHg1Nzc5ZDY1YiksIFdUQ1AoMHg1ZDRmODgzYiwgMHg1NzllODFiOCksCisgICAgV1RDUCgweDVkMmQxODlhLCAweDU3YzMxZjkyKSwgV1RDUCgweDVkMGE5YTlhLCAweDU3ZTdhZmU0KSwKKyAgICBXVENQKDB4NWNlODBlNDEsIDB4NTgwYzMyYTcpLCBXVENQKDB4NWNjNTczOTQsIDB4NTgzMGE3ZDYpLAorICAgIFdUQ1AoMHg1Y2EyY2E5OSwgMHg1ODU1MGY2YyksIFdUQ1AoMHg1YzgwMTM1NCwgMHg1ODc5Njk2MiksCisgICAgV1RDUCgweDVjNWQ0ZGNjLCAweDU4OWRiNWIzKSwgV1RDUCgweDVjM2E3YTA1LCAweDU4YzFmNDViKSwKKyAgICBXVENQKDB4NWMxNzk4MDYsIDB4NThlNjI1NTIpLCBXVENQKDB4NWJmNGE3ZDIsIDB4NTkwYTQ4OTMpLAorICAgIFdUQ1AoMHg1YmQxYTk3MSwgMHg1OTJlNWUxOSksIFdUQ1AoMHg1YmFlOWNlNywgMHg1OTUyNjVkZiksCisgICAgV1RDUCgweDViOGI4MjM5LCAweDU5NzY1ZmRlKSwgV1RDUCgweDViNjg1OTZkLCAweDU5OWE0YzEyKSwKKyAgICBXVENQKDB4NWI0NTIyODgsIDB4NTliZTJhNzQpLCBXVENQKDB4NWIyMWRkOTAsIDB4NTllMWZhZmYpLAorICAgIFdUQ1AoMHg1YWZlOGE4YiwgMHg1YTA1YmRhZSksIFdUQ1AoMHg1YWRiMjk3ZCwgMHg1YTI5NzI3YiksCisgICAgV1RDUCgweDVhYjdiYTZjLCAweDVhNGQxOTYwKSwgV1RDUCgweDVhOTQzZDVlLCAweDVhNzBiMjU4KSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBLQkRXaW5kb3c5NltdID0geworICAgIFdUQ1AoMHg3ZmZmZmZmZCwgMHgwMDAxYTgzOCksIFdUQ1AoMHg3ZmZmZmZlMiwgMHgwMDA1NmU4MyksCisgICAgV1RDUCgweDdmZmZmZjc5LCAweDAwMGI5ZmRhKSwgV1RDUCgweDdmZmZmZTQ1LCAweDAwMTUwZThlKSwKKyAgICBXVENQKDB4N2ZmZmZiNGQsIDB4MDAyMmFlZWIpLCBXVENQKDB4N2ZmZmY0YzYsIDB4MDAzNTliMzYpLAorICAgIFdUQ1AoMHg3ZmZmZTc5MiwgMHgwMDRmMTRmZiksIFdUQ1AoMHg3ZmZmY2U4YiwgMHgwMDcwODU4YyksCisgICAgV1RDUCgweDdmZmZhMThmLCAweDAwOWI3ZDc1KSwgV1RDUCgweDdmZmY1NDM5LCAweDAwZDFiMzUzKSwKKyAgICBXVENQKDB4N2ZmZWQ0NDIsIDB4MDExNTAxOGYpLCBXVENQKDB4N2ZmZTA3NzUsIDB4MDE2NzYzMzUpLAorICAgIFdUQ1AoMHg3ZmZjYzkzNywgMHgwMWNhZWZjYiksIFdUQ1AoMHg3ZmZhZTc5ZiwgMHgwMjQxZDYyZSksCisgICAgV1RDUCgweDdmZjgyMDE5LCAweDAyY2U1NjdmKSwgV1RDUCgweDdmZjQxYmE0LCAweDAzNzJiYjI1KSwKKyAgICBXVENQKDB4N2ZlZTZhYzMsIDB4MDQzMTUwZmMpLCBXVENQKDB4N2ZlNjgxMjksIDB4MDUwYzVlYzgpLAorICAgIFdUQ1AoMHg3ZmRiYjE2NCwgMHgwNjA2MWMwZiksIFdUQ1AoMHg3ZmNkMjg5NCwgMHgwNzIwYTc3OSksCisgICAgV1RDUCgweDdmYjllYTgwLCAweDA4NWRmY2UyKSwgV1RDUCgweDdmYTBjZTJlLCAweDA5YmZlYjRkKSwKKyAgICBXVENQKDB4N2Y4MDdiNDUsIDB4MGI0ODBhZTIpLCBXVENQKDB4N2Y1NzY4ODAsIDB4MGNmN2IzMzkpLAorICAgIFdUQ1AoMHg3ZjIzZGI0ZSwgMHgwZWNmZjIxMiksIFdUQ1AoMHg3ZWUzZThlZSwgMHgxMGQxODJjMCksCisgICAgV1RDUCgweDdlOTU3OTFmLCAweDEyZmNjNjcwKSwgV1RDUCgweDdlMzY0YTc0LCAweDE1NTFiZDg4KSwKKyAgICBXVENQKDB4N2RjM2Y4NjQsIDB4MTdkMDAyMzgpLCBXVENQKDB4N2QzYzAyZmQsIDB4MWE3NmM0N2UpLAorICAgIFdUQ1AoMHg3YzliZDgyYSwgMHgxZDQ0YzdhZCksIFdUQ1AoMHg3YmUwZGU1NiwgMHgyMDM4NjFhMSksCisgICAgV1RDUCgweDdiMDg4MDNkLCAweDIzNGY3YmE2KSwgV1RDUCgweDdhMTAzOTkzLCAweDI2ODc5NTMwKSwKKyAgICBXVENQKDB4NzhmNWE0NDIsIDB4MjlkZGM4NTQpLCBXVENQKDB4NzdiNjg1ZGUsIDB4MmQ0ZWQwMGYpLAorICAgIFdUQ1AoMHg3NjUwZGNmNSwgMHgzMGQ3MTAzZCksIFdUQ1AoMHg3NGMyZWRlNCwgMHgzNDcyOWYyZCksCisgICAgV1RDUCgweDczMGI0ZWRiLCAweDM4MWQ1MGFkKSwgV1RDUCgweDcxMjhmMmMxLCAweDNiZDJjMjczKSwKKyAgICBXVENQKDB4NmYxYjMyYTksIDB4M2Y4ZTY5OGYpLCBXVENQKDB4NmNlMWQ1YTAsIDB4NDM0YmEwZDYpLAorICAgIFdUQ1AoMHg2YTdkMTZhMywgMHg0NzA1YjdlNSksIFdUQ1AoMHg2N2VkYTg5MCwgMHg0YWI4MDI4OCksCisgICAgV1RDUCgweDY1MzRiN2Y4LCAweDRlNWRlODQyKSwgV1RDUCgweDYyNTNlYWNkLCAweDUxZjJmMzlhKSwKKyAgICBXVENQKDB4NWY0ZDVkZTEsIDB4NTU3MmUwZjcpLCBXVENQKDB4NWMyM2EwNGEsIDB4NThkOWFjYjkpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIEtCRFdpbmRvdzEyMFtdID0geworICAgIFdUQ1AoMHg3ZmZmZmZmZSwgMHgwMDAxN2I2ZiksIFdUQ1AoMHg3ZmZmZmZlZiwgMHgwMDA0MmQyZiksCisgICAgV1RDUCgweDdmZmZmZmJiLCAweDAwMDg0OWQwKSwgV1RDUCgweDdmZmZmZjM2LCAweDAwMGUzNDk0KSwKKyAgICBXVENQKDB4N2ZmZmZlMGMsIDB4MDAxNjVlZmQpLCBXVENQKDB4N2ZmZmZiYWMsIDB4MDAyMTQ5YmUpLAorICAgIFdUQ1AoMHg3ZmZmZjcyZSwgMHgwMDJmODU0YyksIFdUQ1AoMHg3ZmZmZWYyNCwgMHgwMDQxYjIzNSksCisgICAgV1RDUCgweDdmZmZlMTY3LCAweDAwNTg4MTRmKSwgV1RDUCgweDdmZmZjYWNkLCAweDAwNzRiM2FmKSwKKyAgICBXVENQKDB4N2ZmZmE2ZDAsIDB4MDA5NzFhNjcpLCBXVENQKDB4N2ZmZjZmMWUsIDB4MDBjMDk2MGUpLAorICAgIFdUQ1AoMHg3ZmZmMWIxMiwgMHgwMGYyMTYwMiksIFdUQ1AoMHg3ZmZlOWYwYiwgMHgwMTJjOTc3NSksCisgICAgV1RDUCgweDdmZmRlYmIyLCAweDAxNzEyNDI4KSwgV1RDUCgweDdmZmNlZDFiLCAweDAxYzBkMGY3KSwKKyAgICBXVENQKDB4N2ZmYjg5YzIsIDB4MDIxY2JjMTIpLCBXVENQKDB4N2ZmOWExN2MsIDB4MDI4NjBiMDUpLAorICAgIFdUQ1AoMHg3ZmY3MGMzOSwgMHgwMmZkZTg3NSksIFdUQ1AoMHg3ZmYzOThiYywgMHgwMzg1ODFiMyksCisgICAgV1RDUCgweDdmZWYwYjNiLCAweDA0MWUwNDBjKSwgV1RDUCgweDdmZTkxYmYzLCAweDA0Yzg5OWY0KSwKKyAgICBXVENQKDB4N2ZlMTc1YmEsIDB4MDU4NjY4MDMpLCBXVENQKDB4N2ZkN2I0OTMsIDB4MDY1ODg5ZDUpLAorICAgIFdUQ1AoMHg3ZmNiNjQ1OSwgMHgwNzQwMGVkNCksIFdUQ1AoMHg3ZmJiZmY4MiwgMHgwODNkZjZlOSksCisgICAgV1RDUCgweDdmYThlZTA5LCAweDA5NTMyZjM3KSwgV1RDUCgweDdmOTE4NDlhLCAweDBhODA4ZWQxKSwKKyAgICBXVENQKDB4N2Y3NTAzZjIsIDB4MGJjNmQzODEpLCBXVENQKDB4N2Y1Mjk4OWEsIDB4MGQyNjllYjApLAorICAgIFdUQ1AoMHg3ZjI5NWFmNCwgMHgwZWEwNzI3MCksIFdUQ1AoMHg3ZWY4NGZiNiwgMHgxMDM0YWViNiksCisgICAgV1RDUCgweDdlYmU2OGM1LCAweDExZTM4ZWQyKSwgV1RDUCgweDdlN2E4Njg2LCAweDEzYWQyNzMzKSwKKyAgICBXVENQKDB4N2UyYjc5YTMsIDB4MTU5MTYzNmQpLCBXVENQKDB4N2RkMDA1M2MsIDB4MTc5MDA0YTcpLAorICAgIFdUQ1AoMHg3ZDY2ZTE4YiwgMHgxOWE4YTA1ZiksIFdUQ1AoMHg3Y2VlYmVmMCwgMHgxYmRhOWZhMiksCisgICAgV1RDUCgweDdjNjY0OTUzLCAweDFlMjUzZWExKSwgV1RDUCgweDdiY2MyYmU4LCAweDIwODc4Y2NlKSwKKyAgICBXVENQKDB4N2IxZjE1MjYsIDB4MjMwMDZkNWQpLCBXVENQKDB4N2E1ZGJiMDEsIDB4MjU4ZTk4NDgpLAorICAgIFdUQ1AoMHg3OTg2ZGYzZSwgMHgyODMwOWJjNiksIFdUQ1AoMHg3ODk5NTNlMCwgMHgyYWU0ZGUzZSksCisgICAgV1RDUCgweDc3OTNmZjg4LCAweDJkYTlhMGE4KSwgV1RDUCgweDc2NzVlMWNjLCAweDMwN2QwMTYzKSwKKyAgICBXVENQKDB4NzUzZTE3NjMsIDB4MzM1Y2ZmNzIpLCBXVENQKDB4NzNlYmRlMTAsIDB4MzY0NzdlMWYpLAorICAgIFdUQ1AoMHg3MjdlOTg0ZSwgMHgzOTNhNDhmMSksIFdUQ1AoMHg3MGY1ZDA5YiwgMHgzYzMzMTdmOSksCisgICAgV1RDUCgweDZmNTEzYzYwLCAweDNmMmY5NDVjKSwgV1RDUCgweDZkOTBiZTYxLCAweDQyMmQ1ZDE4KSwKKyAgICBXVENQKDB4NmJiNDY4YjEsIDB4NDUyYTBiZjMpLCBXVENQKDB4NjliYzdlMWUsIDB4NDgyMzNhODEpLAorICAgIFdUQ1AoMHg2N2E5NzMxNywgMHg0YjE2ODczZSksIFdUQ1AoMHg2NTdiZWRmYSwgMHg0ZTAxOWE5ZCksCisgICAgV1RDUCgweDYzMzRjNmQyLCAweDUwZTIyYzBiKSwgV1RDUCgweDYwZDUwNjg5LCAweDUzYjYwNmNiKSwKKyAgICBXVENQKDB4NWU1ZGU1ODgsIDB4NTY3YjBlYTcpLCBXVENQKDB4NWJkMGM5YzYsIDB4NTkyZjQ0NjApLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIEtCRFdpbmRvdzEyOFtdID0geworICAgIFdUQ1AoMHg3ZmZmZmZmZSwgMHgwMDAxNmY2MyksIFdUQ1AoMHg3ZmZmZmZmMSwgMHgwMDAzZTM4MiksCisgICAgV1RDUCgweDdmZmZmZmM3LCAweDAwMDc4ZjY0KSwgV1RDUCgweDdmZmZmZjVkLCAweDAwMGNjMzIzKSwKKyAgICBXVENQKDB4N2ZmZmZlNzYsIDB4MDAxM2Q5ZWQpLCBXVENQKDB4N2ZmZmZjYWEsIDB4MDAxZDNhOWQpLAorICAgIFdUQ1AoMHg3ZmZmZjk1MywgMHgwMDI5NTgxZiksIFdUQ1AoMHg3ZmZmZjM3MiwgMHgwMDM4YjFiZCksCisgICAgV1RDUCgweDdmZmZlOThiLCAweDAwNGJkMzRkKSwgV1RDUCgweDdmZmZkOTc1LCAweDAwNjM1NTM4KSwKKyAgICBXVENQKDB4N2ZmZmMwMjQsIDB4MDA3ZmRjNjQpLCBXVENQKDB4N2ZmZjk5NWIsIDB4MDBhMjE5ZjEpLAorICAgIFdUQ1AoMHg3ZmZmNWY1YiwgMHgwMGNhY2FkMCksIFdUQ1AoMHg3ZmZmMGE3NSwgMHgwMGZhYjcyZCksCisgICAgV1RDUCgweDdmZmU5MDkxLCAweDAxMzJiMWFmKSwgV1RDUCgweDdmZmRlNDllLCAweDAxNzM5Njg5KSwKKyAgICBXVENQKDB4N2ZmY2Y1ZWYsIDB4MDFiZTRhNjMpLCBXVENQKDB4N2ZmYmFmODQsIDB4MDIxM2I5MTApLAorICAgIFdUQ1AoMHg3ZmY5ZjczYSwgMHgwMjc0ZDQxZSksIFdUQ1AoMHg3ZmY3YWNmMSwgMHgwMmUyOTEzYSksCisgICAgV1RDUCgweDdmZjRhOTlhLCAweDAzNWRlODZjKSwgV1RDUCgweDdmZjBiZTNkLCAweDAzZTdkMjMzKSwKKyAgICBXVENQKDB4N2ZlYmIyZjEsIDB4MDQ4MTQ1N2MpLCBXVENQKDB4N2ZlNTQ1ZDQsIDB4MDUyYjM1N2MpLAorICAgIFdUQ1AoMHg3ZmRkMmEwMiwgMHgwNWU2OGY3NyksIFdUQ1AoMHg3ZmQzMDY5NSwgMHgwNmI0Mzg2ZiksCisgICAgV1RDUCgweDdmYzY3NWI0LCAweDA3OTUwYWNiKSwgV1RDUCgweDdmYjcwM2JlLCAweDA4ODlkM2VmKSwKKyAgICBXVENQKDB4N2ZhNDJlODksIDB4MDk5MzUxZTApLCBXVENQKDB4N2Y4ZDY0ZDgsIDB4MGFiMjMwZTApLAorICAgIFdUQ1AoMHg3ZjcyMDVmOCwgMHgwYmU3MDkyMyksIFdUQ1AoMHg3ZjUxNjE5NSwgMHgwZDMyNWM5MyksCisgICAgV1RDUCgweDdmMmFiN2QwLCAweDBlOTQ5NGFlKSwgV1RDUCgweDdlZmQzOTk3LCAweDEwMGUwMDg1KSwKKyAgICBXVENQKDB4N2VjODA5NGEsIDB4MTE5ZWQyZWYpLCBXVENQKDB4N2U4YTNiYTcsIDB4MTM0NzIwZDgpLAorICAgIFdUQ1AoMHg3ZTQyZDkwNiwgMHgxNTA2ZGZkYyksIFdUQ1AoMHg3ZGYwZGVlNCwgMHgxNmRkZTUwYiksCisgICAgV1RDUCgweDdkOTM0MWI0LCAweDE4Y2JlM2Y3KSwgV1RDUCgweDdkMjhlZjAyLCAweDFhZDA2ZTA3KSwKKyAgICBXVENQKDB4N2NiMGNmY2MsIDB4MWNlYWYyMTUpLCBXVENQKDB4N2MyOWNiMjAsIDB4MWYxYWJjNGYpLAorICAgIFdUQ1AoMHg3YjkyYzhlYiwgMHgyMTVlZjY3NyksIFdUQ1AoMHg3YWVhYjRlYywgMHgyM2I2YTg2NyksCisgICAgV1RDUCgweDdhMzA4MWQwLCAweDI2MjBiOGVjKSwgV1RDUCgweDc5NjMyYzVhLCAweDI4OWJlZWY1KSwKKyAgICBXVENQKDB4Nzg4MWJlOTUsIDB4MmIyNmYzMGIpLCBXVENQKDB4Nzc4YjUzMDQsIDB4MmRjMDUxMWYpLAorICAgIFdUQ1AoMHg3NjdmMTdjMCwgMHgzMDY2N2FhMiksIFdUQ1AoMHg3NTVjNTE3OCwgMHgzMzE3YzhkZCksCisgICAgV1RDUCgweDc0MjI1ZTUwLCAweDM1ZDI3Zjk4KSwgV1RDUCgweDcyZDBiODg3LCAweDM4OTRjZmYzKSwKKyAgICBXVENQKDB4NzE2NmY4ZTcsIDB4M2I1Y2RiN2IpLCBXVENQKDB4NmZlNGQ4ZTgsIDB4M2UyOGI3NzApLAorICAgIFdUQ1AoMHg2ZTRhMzQ5MSwgMHg0MGY2NzAyYSksIFdUQ1AoMHg2Yzk3MGJmYywgMHg0M2M0MGNhYSksCisgICAgV1RDUCgweDZhY2I4NDgzLCAweDQ2OGY5MjMxKSwgV1RDUCgweDY4ZTdlOTk0LCAweDQ5NTcwN2Y1KSwKKyAgICBXVENQKDB4NjZlY2FkMWMsIDB4NGMxODdhYzcpLCBXVENQKDB4NjRkYTY3OTcsIDB4NGVkMjAwYzUpLAorICAgIFdUQ1AoMHg2MmIxZDdiNywgMHg1MTgxYmNlYSksIFdUQ1AoMHg2MDczZTFhZSwgMHg1NDI1ZTI4ZSksCisgICAgV1RDUCgweDVlMjE4ZTE2LCAweDU2YmNiOGMyKSwgV1RDUCgweDViYmMwODc1LCAweDU5NDQ5ZDc2KSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1dUUCBLQkRXaW5kb3cyNTZbXSA9IHsKKyAgICBXVENQKDB4N2ZmZmZmZmYsIDB4MDAwMTAzYzgpLCBXVENQKDB4N2ZmZmZmZmMsIDB4MDAwMjAzYWQpLAorICAgIFdUQ1AoMHg3ZmZmZmZmNSwgMHgwMDAzNDEwYSksIFdUQ1AoMHg3ZmZmZmZlOSwgMHgwMDA0YzZjZSksCisgICAgV1RDUCgweDdmZmZmZmQ0LCAweDAwMDY5ZWUwKSwgV1RDUCgweDdmZmZmZmIyLCAweDAwMDhkMzc2KSwKKyAgICBXVENQKDB4N2ZmZmZmN2QsIDB4MDAwYjZmNWEpLCBXVENQKDB4N2ZmZmZmMmUsIDB4MDAwZTdkZmQpLAorICAgIFdUQ1AoMHg3ZmZmZmViYSwgMHgwMDEyMGI4MyksIFdUQ1AoMHg3ZmZmZmUxNiwgMHgwMDE2MjRjZCksCisgICAgV1RDUCgweDdmZmZmZDMwLCAweDAwMWFkNzc4KSwgV1RDUCgweDdmZmZmYmYzLCAweDAwMjAzMWUyKSwKKyAgICBXVENQKDB4N2ZmZmZhNDgsIDB4MDAyNjQzMzApLCBXVENQKDB4N2ZmZmY4MGQsIDB4MDAyZDFiNGIpLAorICAgIFdUQ1AoMHg3ZmZmZjUxZCwgMHgwMDM0Y2FlNiksIFdUQ1AoMHg3ZmZmZjE0NywgMHgwMDNkNjM3YyksCisgICAgV1RDUCgweDdmZmZlYzU0LCAweDAwNDZmNzUxKSwgV1RDUCgweDdmZmZlNWZlLCAweDAwNTE5OTc0KSwKKyAgICBXVENQKDB4N2ZmZmRkZjMsIDB4MDA1ZDVkYmEpLCBXVENQKDB4N2ZmZmQzZDIsIDB4MDA2YTU4YzEpLAorICAgIFdUQ1AoMHg3ZmZmYzcyYSwgMHgwMDc4OWZlYiksIFdUQ1AoMHg3ZmZmYjc3MiwgMHgwMDg4NDk1ZCksCisgICAgV1RDUCgweDdmZmZhNDBlLCAweDAwOTk2YmZiKSwgV1RDUCgweDdmZmY4YzQ2LCAweDAwYWMxZjYzKSwKKyAgICBXVENQKDB4N2ZmZjZmNDYsIDB4MDBjMDdiZWMpLCBXVENQKDB4N2ZmZjRjMTksIDB4MDBkNjlhOWIpLAorICAgIFdUQ1AoMHg3ZmZmMjFhNiwgMHgwMGVlOTUyMyksIFdUQ1AoMHg3ZmZlZWVhYiwgMHgwMTA4ODVkOSksCisgICAgV1RDUCgweDdmZmViMWI4LCAweDAxMjQ4N2IxKSwgV1RDUCgweDdmZmU2OTJmLCAweDAxNDJiNjMxKSwKKyAgICBXVENQKDB4N2ZmZTEzMzUsIDB4MDE2MzJkNmYpLCBXVENQKDB4N2ZmZGFkYjgsIDB4MDE4NjBhMDApLAorICAgIFdUQ1AoMHg3ZmZkMzY2MSwgMHgwMWFiNjhmMyksIFdUQ1AoMHg3ZmZjYWE5MSwgMHgwMWQzNjdjNSksCisgICAgV1RDUCgweDdmZmMwNzViLCAweDAxZmUyNDUzKSwgV1RDUCgweDdmZmI0OTdlLCAweDAyMmJiY2QwKSwKKyAgICBXVENQKDB4N2ZmYTZkNTksIDB4MDI1YzRmYmEpLCBXVENQKDB4N2ZmOTZlZWIsIDB4MDI4ZmZiYzcpLAorICAgIFdUQ1AoMHg3ZmY4NDljNiwgMHgwMmM2ZGZkYiksIFdUQ1AoMHg3ZmY2ZjkwYiwgMHgwMzAxMWFmYyksCisgICAgV1RDUCgweDdmZjU3NzYwLCAweDAzM2VjYzNhKSwgV1RDUCgweDdmZjNiZWU3LCAweDAzODAxMmE4KSwKKyAgICBXVENQKDB4N2ZmMWM5MzksIDB4MDNjNTBkNDcpLCBXVENQKDB4N2ZlZjhmNWEsIDB4MDQwZGRhZjYpLAorICAgIFdUQ1AoMHg3ZmVkMDliNCwgMHgwNDVhOWE2NCksIFdUQ1AoMHg3ZmVhMzAwZSwgMHgwNGFiNjlmOSksCisgICAgV1RDUCgweDdmZTZmOTgwLCAweDA1MDA2N2M3KSwgV1RDUCgweDdmZTM1YzcwLCAweDA1NTliMTdiKSwKKyAgICBXVENQKDB4N2ZkZjRlODgsIDB4MDViNzY0NDMpLCBXVENQKDB4N2ZkYWM0YWQsIDB4MDYxOTljYzQpLAorICAgIFdUQ1AoMHg3ZmQ1YjJmOCwgMHgwNjgwNzZmZSksIFdUQ1AoMHg3ZmQwMGNhZiwgMHgwNmVjMGU0MSksCisgICAgV1RDUCgweDdmYzljNDQxLCAweDA3NWM3ZDE2KSwgV1RDUCgweDdmYzJjYjNiLCAweDA3ZDFkZDJjKSwKKyAgICBXVENQKDB4N2ZiYjEyNDIsIDB4MDg0YzQ3NDUpLCBXVENQKDB4N2ZiMjg5MTUsIDB4MDhjYmQzMjMpLAorICAgIFdUQ1AoMHg3ZmE5MWU3ZSwgMHgwOTUwOTc3OCksIFdUQ1AoMHg3ZjllYzA1OSwgMHgwOWRhYTljYyksCisgICAgV1RDUCgweDdmOTM1Yjg3LCAweDBhNmExZTc0KSwgV1RDUCgweDdmODZkYmYyLCAweDBhZmYwODc3KSwKKyAgICBXVENQKDB4N2Y3OTJjOGEsIDB4MGI5OTc5ODMpLCBXVENQKDB4N2Y2YTM3NDYsIDB4MGMzOTgxZDYpLAorICAgIFdUQ1AoMHg3ZjU5ZTUyMCwgMHgwY2RmMzAzMCksIFdUQ1AoMHg3ZjQ4MWUxYywgMHgwZDhhOTFjMyksCisgICAgV1RDUCgweDdmMzRjOTQ5LCAweDBlM2JiMjIyKSwgV1RDUCgweDdmMWZjY2MzLCAweDBlZjI5YjMwKSwKKyAgICBXVENQKDB4N2YwOTBkYmMsIDB4MGZhZjU1MTMpLCBXVENQKDB4N2VmMDcwN2QsIDB4MTA3MWU2MjkpLAorICAgIFdUQ1AoMHg3ZWQ1ZDg3MiwgMHgxMTNhNTJmNCksIFdUQ1AoMHg3ZWI5MjgzMSwgMHgxMjA4OWUxNCksCisgICAgV1RDUCgweDdlOWE0MTgzLCAweDEyZGNjODM2KSwgV1RDUCgweDdlNzkwNTcxLCAweDEzYjZkMDEwKSwKKyAgICBXVENQKDB4N2U1NTU0NGUsIDB4MTQ5NmIyNGYpLCBXVENQKDB4N2UyZjBkYzgsIDB4MTU3YzY5OTgpLAorICAgIFdUQ1AoMHg3ZTA2MTBmMSwgMHgxNjY3ZWU3NyksIFdUQ1AoMHg3ZGRhM2M1NCwgMHgxNzU5Mzc2MCksCisgICAgV1RDUCgweDdkYWI2ZTA2LCAweDE4NTAzOGEzKSwgV1RDUCgweDdkNzk4M2IzLCAweDE5NGNlNDZlKSwKKyAgICBXVENQKDB4N2Q0NDVhYjUsIDB4MWE0ZjJhYzQpLCBXVENQKDB4N2QwYmQwMjgsIDB4MWI1NmY5ODEpLAorICAgIFdUQ1AoMHg3Y2NmYzBmZCwgMHgxYzY0M2M1NCksIFdUQ1AoMHg3YzkwMGExMSwgMHgxZDc2ZGNjMiksCisgICAgV1RDUCgweDdjNGM4ODQ0LCAweDFlOGVjMjI3KSwgV1RDUCgweDdjMDUxODhkLCAweDFmYWJkMWJiKSwKKyAgICBXVENQKDB4N2JiOTk4MTcsIDB4MjBjZGVlOTIpLCBXVENQKDB4N2I2OWU0NTUsIDB4MjFmNGY5YTYpLAorICAgIFdUQ1AoMHg3YjE1ZGIxYSwgMHgyMzIwZDFkYyksIFdUQ1AoMHg3YWJkNWFiOCwgMHgyNDUxNTQwYyksCisgICAgV1RDUCgweDdhNjA0MjEzLCAweDI1ODY1YjA5KSwgV1RDUCgweDc5ZmU3MGJmLCAweDI2YmZiZmFmKSwKKyAgICBXVENQKDB4Nzk5N2M3MTYsIDB4MjdmZDU4ZWQpLCBXVENQKDB4NzkyYzI2NTQsIDB4MjkzZWZiZDApLAorICAgIFdUQ1AoMHg3OGJiNzBiMCwgMHgyYTg0N2I5NyksIFdUQ1AoMHg3ODQ1ODk3NiwgMHgyYmNkYTliYiksCisgICAgV1RDUCgweDc3Y2E1NTFkLCAweDJkMWE1NjA4KSwgV1RDUCgweDc3NDliOTY1LCAweDJlNmE0ZWE2KSwKKyAgICBXVENQKDB4NzZjMzlkNjgsIDB4MmZiZDYwMzYpLCBXVENQKDB4NzYzN2U5YjgsIDB4MzExMzU1ZGMpLAorICAgIFdUQ1AoMHg3NWE2ODg3MywgMHgzMjZiZjk1YSksIFdUQ1AoMHg3NTBmNjU1OSwgMHgzM2M3MTMyNiksCisgICAgV1RDUCgweDc0NzI2ZGUxLCAweDM1MjQ2YTdlKSwgV1RDUCgweDczY2Y5MTRmLCAweDM2ODNjNTgyKSwKKyAgICBXVENQKDB4NzMyNmMwYzgsIDB4MzdlNGU5NGIpLCBXVENQKDB4NzI3N2VmNWYsIDB4Mzk0NzlhMDgpLAorICAgIFdUQ1AoMHg3MWMzMTIyZiwgMHgzYWFiOWIxNCksIFdUQ1AoMHg3MTA4MjA2MywgMHgzYzEwYWYxMSksCisgICAgV1RDUCgweDcwNDcxMzRhLCAweDNkNzY5ODA3KSwgV1RDUCgweDZmN2ZlNjYxLCAweDNlZGQxNzdjKSwKKyAgICBXVENQKDB4NmViMjk3NjMsIDB4NDA0M2VlOTIpLCBXVENQKDB4NmRkZjI2NTEsIDB4NDFhYWRlMjYpLAorICAgIFdUQ1AoMHg2ZDA1OTU3YywgMHg0MzExYTZlOCksIFdUQ1AoMHg2YzI1ZTk4ZiwgMHg0NDc4MDk3YiksCisgICAgV1RDUCgweDZiNDAyOTkxLCAweDQ1ZGRjNjkzKSwgV1RDUCgweDZhNTQ1ZWYwLCAweDQ3NDI5ZjEzKSwKKyAgICBXVENQKDB4Njk2Mjk1N2YsIDB4NDhhNjU0MjcpLCBXVENQKDB4Njg2YWRiN2MsIDB4NGEwOGE3NjQpLAorICAgIFdUQ1AoMHg2NzZkNDE4ZCwgMHg0YjY5NWFlOCksIFdUQ1AoMHg2NjY5ZGFjMiwgMHg0Y2M4MzE3MSksCisgICAgV1RDUCgweDY1NjBiYzkwLCAweDRlMjRlZTdkKSwgV1RDUCgweDY0NTFmZWNmLCAweDRmN2Y1NjY4KSwKKyAgICBXVENQKDB4NjMzZGJiYjEsIDB4NTBkNzJlODUpLCBXVENQKDB4NjIyNDBmYmQsIDB4NTIyYzNkM2IpLAorICAgIFdUQ1AoMHg2MTA1MTljNywgMHg1MzdlNGExZiksIFdUQ1AoMHg1ZmUwZmFlMywgMHg1NGNkMWUxMCksCisgICAgV1RDUCgweDVlYjdkNjVjLCAweDU2MTg4MzRjKSwgV1RDUCgweDVkODlkMWE1LCAweDU3NjA0NTkwKSwKKyAgICBXVENQKDB4NWM1NzE0NGIsIDB4NThhNDMyMjcpLCBXVENQKDB4NWIxZmM3ZTYsIDB4NTllNDE4MDgpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIEtCRFdpbmRvdzc2OFtdID0geworICAgIFdUQ1AoMHg3ZmZmZmY4NSwgMHgwMDBiMTFkOSksIFdUQ1AoMHg3ZmZmZmVmMCwgMHgwMDEwN2FhOSksCisgICAgV1RDUCgweDdmZmZmZTNlLCAweDAwMTUzNTFjKSwgV1RDUCgweDdmZmZmZDZjLCAweDAwMTliMGExKSwKKyAgICBXVENQKDB4N2ZmZmZjNzcsIDB4MDAxZTE2NTYpLCBXVENQKDB4N2ZmZmZiNWIsIDB4MDAyMjdhODApLAorICAgIFdUQ1AoMHg3ZmZmZmExNiwgMHgwMDI2ZThkMyksIFdUQ1AoMHg3ZmZmZjhhNCwgMHgwMDJiNjhjOSksCisgICAgV1RDUCgweDdmZmZmNzAwLCAweDAwMmZmZjhhKSwgV1RDUCgweDdmZmZmNTI4LCAweDAwMzRiMGQ5KSwKKyAgICBXVENQKDB4N2ZmZmYzMTYsIDB4MDAzOTdmOWMpLCBXVENQKDB4N2ZmZmYwYzYsIDB4MDAzZTZlMjIpLAorICAgIFdUQ1AoMHg3ZmZmZWUzNSwgMHgwMDQzN2U1MyksIFdUQ1AoMHg3ZmZmZWI1YiwgMHgwMDQ4YjFkMCksCisgICAgV1RDUCgweDdmZmZlODM2LCAweDAwNGUwYTA1KSwgV1RDUCgweDdmZmZlNGJlLCAweDAwNTM4ODM3KSwKKyAgICBXVENQKDB4N2ZmZmUwZWYsIDB4MDA1OTJkOGUpLCBXVENQKDB4N2ZmZmRjYzMsIDB4MDA1ZWZiMWEpLAorICAgIFdUQ1AoMHg3ZmZmZDgzMiwgMHgwMDY0ZjFkYSksIFdUQ1AoMHg3ZmZmZDMzNywgMHgwMDZiMTJjMSksCisgICAgV1RDUCgweDdmZmZjZGNiLCAweDAwNzE1ZWI0KSwgV1RDUCgweDdmZmZjN2U3LCAweDAwNzdkNjkyKSwKKyAgICBXVENQKDB4N2ZmZmMxODIsIDB4MDA3ZTdiMzApLCBXVENQKDB4N2ZmZmJhOTYsIDB4MDA4NTRkNjEpLAorICAgIFdUQ1AoMHg3ZmZmYjMxYiwgMHgwMDhjNGRmMCksIFdUQ1AoMHg3ZmZmYWIwNiwgMHgwMDkzN2RhNiksCisgICAgV1RDUCgweDdmZmZhMjUxLCAweDAwOWFkZDQ4KSwgV1RDUCgweDdmZmY5OGYxLCAweDAwYTI2ZDk4KSwKKyAgICBXVENQKDB4N2ZmZjhlZGQsIDB4MDBhYTJmNTcpLCBXVENQKDB4N2ZmZjg0MGIsIDB4MDBiMjIzNDMpLAorICAgIFdUQ1AoMHg3ZmZmNzg3MCwgMHgwMGJhNGExOSksIFdUQ1AoMHg3ZmZmNmMwMiwgMHgwMGMyYTQ5NSksCisgICAgV1RDUCgweDdmZmY1ZWI1LCAweDAwY2IzMzcxKSwgV1RDUCgweDdmZmY1MDdlLCAweDAwZDNmNzY3KSwKKyAgICBXVENQKDB4N2ZmZjQxNTAsIDB4MDBkY2YxMzApLCBXVENQKDB4N2ZmZjMxMWYsIDB4MDBlNjIxODMpLAorICAgIFdUQ1AoMHg3ZmZmMWZkZSwgMHgwMGVmODkxOSksIFdUQ1AoMHg3ZmZmMGQ3ZiwgMHgwMGY5MjhhNyksCisgICAgV1RDUCgweDdmZmVmOWY0LCAweDAxMDMwMGU1KSwgV1RDUCgweDdmZmVlNTJmLCAweDAxMGQxMjg4KSwKKyAgICBXVENQKDB4N2ZmZWNmMjAsIDB4MDExNzVlNDcpLCBXVENQKDB4N2ZmZWI3YjgsIDB4MDEyMWU0ZDYpLAorICAgIFdUQ1AoMHg3ZmZlOWVlNiwgMHgwMTJjYTZlYiksIFdUQ1AoMHg3ZmZlODQ5YiwgMHgwMTM3YTUzYiksCisgICAgV1RDUCgweDdmZmU2OGM0LCAweDAxNDJlMDdhKSwgV1RDUCgweDdmZmU0YjUwLCAweDAxNGU1OTVjKSwKKyAgICBXVENQKDB4N2ZmZTJjMmMsIDB4MDE1YTEwOTUpLCBXVENQKDB4N2ZmZTBiNDUsIDB4MDE2NjA2ZGEpLAorICAgIFdUQ1AoMHg3ZmZkZTg4OCwgMHgwMTcyM2NkZSksIFdUQ1AoMHg3ZmZkYzNkZiwgMHgwMTdlYjM1MyksCisgICAgV1RDUCgweDdmZmQ5ZDM3LCAweDAxOGI2YWVkKSwgV1RDUCgweDdmZmQ3NDc5LCAweDAxOTg2NDVmKSwKKyAgICBXVENQKDB4N2ZmZDQ5OTAsIDB4MDFhNWEwNWIpLCBXVENQKDB4N2ZmZDFjNjMsIDB4MDFiMzFmOTIpLAorICAgIFdUQ1AoMHg3ZmZjZWNkYywgMHgwMWMwZTJiOCksIFdUQ1AoMHg3ZmZjYmFlMiwgMHgwMWNlZWE3ZCksCisgICAgV1RDUCgweDdmZmM4NjVjLCAweDAxZGQzNzkzKSwgV1RDUCgweDdmZmM0ZjJmLCAweDAxZWJjYWFhKSwKKyAgICBXVENQKDB4N2ZmYzE1NDIsIDB4MDFmYWE0NzIpLCBXVENQKDB4N2ZmYmQ4NzksIDB4MDIwOWM1OWMpLAorICAgIFdUQ1AoMHg3ZmZiOThiNywgMHgwMjE5MmVkNyksIFdUQ1AoMHg3ZmZiNTVlMCwgMHgwMjI4ZTBkMiksCisgICAgV1RDUCgweDdmZmIwZmQ2LCAweDAyMzhkYzNjKSwgV1RDUCgweDdmZmFjNjc5LCAweDAyNDkyMWMzKSwKKyAgICBXVENQKDB4N2ZmYTc5YWMsIDB4MDI1OWIyMTUpLCBXVENQKDB4N2ZmYTI5NGQsIDB4MDI2YThkZGUpLAorICAgIFdUQ1AoMHg3ZmY5ZDUzYiwgMHgwMjdiYjVjYyksIFdUQ1AoMHg3ZmY5N2Q1NCwgMHgwMjhkMmE4YSksCisgICAgV1RDUCgweDdmZjkyMTc1LCAweDAyOWVlY2MzKSwgV1RDUCgweDdmZjhjMTdhLCAweDAyYjBmZDIzKSwKKyAgICBXVENQKDB4N2ZmODVkM2YsIDB4MDJjMzVjNTMpLCBXVENQKDB4N2ZmN2Y0OWQsIDB4MDJkNjBhZmQpLAorICAgIFdUQ1AoMHg3ZmY3ODc2ZSwgMHgwMmU5MDljYSksIFdUQ1AoMHg3ZmY3MTU4YiwgMHgwMmZjNTk2MCksCisgICAgV1RDUCgweDdmZjY5ZWNhLCAweDAzMGZmYTY5KSwgV1RDUCgweDdmZjYyMzAzLCAweDAzMjNlZDg5KSwKKyAgICBXVENQKDB4N2ZmNWEyMGEsIDB4MDMzODMzNjcpLCBXVENQKDB4N2ZmNTFiYjMsIDB4MDM0Y2NjYTcpLAorICAgIFdUQ1AoMHg3ZmY0OGZkMywgMHgwMzYxYjllZCksIFdUQ1AoMHg3ZmYzZmUzYywgMHgwMzc2ZmJkZCksCisgICAgV1RDUCgweDdmZjM2NmJlLCAweDAzOGM5MzE3KSwgV1RDUCgweDdmZjJjOTI5LCAweDAzYTI4MDNlKSwKKyAgICBXVENQKDB4N2ZmMjI1NGUsIDB4MDNiOGMzZjIpLCBXVENQKDB4N2ZmMTdhZmEsIDB4MDNjZjVlZDEpLAorICAgIFdUQ1AoMHg3ZmYwYzlmOSwgMHgwM2U2NTE3YSksIFdUQ1AoMHg3ZmYwMTIxOCwgMHgwM2ZkOWM4YSksCisgICAgV1RDUCgweDdmZWY1MzIxLCAweDA0MTU0MDljKSwgV1RDUCgweDdmZWU4Y2RlLCAweDA0MmQzZTRkKSwKKyAgICBXVENQKDB4N2ZlZGJmMTcsIDB4MDQ0NTk2MzQpLCBXVENQKDB4N2ZlY2U5OTMsIDB4MDQ1ZTQ4ZWMpLAorICAgIFdUQ1AoMHg3ZmVjMGMxOCwgMHgwNDc3NTcwYSksIFdUQ1AoMHg3ZmViMjY2YSwgMHgwNDkwYzEyNyksCisgICAgV1RDUCgweDdmZWEzODRlLCAweDA0YWE4N2Q1KSwgV1RDUCgweDdmZTk0MTg2LCAweDA0YzRhYmFhKSwKKyAgICBXVENQKDB4N2ZlODQxZDMsIDB4MDRkZjJkMzcpLCBXVENQKDB4N2ZlNzM4ZjQsIDB4MDRmYTBkMGQpLAorICAgIFdUQ1AoMHg3ZmU2MjZhOSwgMHgwNTE1NGJiYyksIFdUQ1AoMHg3ZmU1MGFhZiwgMHgwNTMwZTlkMyksCisgICAgV1RDUCgweDdmZTNlNGMxLCAweDA1NGNlN2RkKSwgV1RDUCgweDdmZTJiNDliLCAweDA1Njk0NjY3KSwKKyAgICBXVENQKDB4N2ZlMTc5ZjYsIDB4MDU4NjA1ZmEpLCBXVENQKDB4N2ZlMDM0OGIsIDB4MDVhMzI3MWUpLAorICAgIFdUQ1AoMHg3ZmRlZTQxMCwgMHgwNWMwYWE1YyksIFdUQ1AoMHg3ZmRkODgzYiwgMHgwNWRlOTAzOCksCisgICAgV1RDUCgweDdmZGMyMGMxLCAweDA1ZmNkOTM1KSwgV1RDUCgweDdmZGFhZDUzLCAweDA2MWI4NWQ2KSwKKyAgICBXVENQKDB4N2ZkOTJkYTUsIDB4MDYzYTk2OWMpLCBXVENQKDB4N2ZkN2ExNjYsIDB4MDY1YTBjMDYpLAorICAgIFdUQ1AoMHg3ZmQ2MDg0NCwgMHgwNjc5ZTY5MCksIFdUQ1AoMHg3ZmQ0NjFlZSwgMHgwNjlhMjZiNiksCisgICAgV1RDUCgweDdmZDJhZTEwLCAweDA2YmFjY2YyKSwgV1RDUCgweDdmZDBlYzU1LCAweDA2ZGJkOWJkKSwKKyAgICBXVENQKDB4N2ZjZjFjNjUsIDB4MDZmZDRkOGMpLCBXVENQKDB4N2ZjZDNkZTksIDB4MDcxZjI4ZDMpLAorICAgIFdUQ1AoMHg3ZmNiNTA4OCwgMHgwNzQxNmMwNiksIFdUQ1AoMHg3ZmM5NTNlNiwgMHgwNzY0MTc5NCksCisgICAgV1RDUCgweDdmYzc0N2E4LCAweDA3ODcyYmVlKSwgV1RDUCgweDdmYzUyYjcwLCAweDA3YWFhOTdmKSwKKyAgICBXVENQKDB4N2ZjMmZlZGYsIDB4MDdjZTkwYjQpLCBXVENQKDB4N2ZjMGMxOTUsIDB4MDdmMmUxZjQpLAorICAgIFdUQ1AoMHg3ZmJlNzMyZiwgMHgwODE3OWRhNyksIFdUQ1AoMHg3ZmJjMTM0YiwgMHgwODNjYzQzMSksCisgICAgV1RDUCgweDdmYjlhMTgzLCAweDA4NjI1NWY3KSwgV1RDUCgweDdmYjcxZDcyLCAweDA4ODg1MzU5KSwKKyAgICBXVENQKDB4N2ZiNDg2YWYsIDB4MDhhZWJjYjUpLCBXVENQKDB4N2ZiMWRjZDMsIDB4MDhkNTkyNjkpLAorICAgIFdUQ1AoMHg3ZmFmMWY3MiwgMHgwOGZjZDRjZiksIFdUQ1AoMHg3ZmFjNGUyMSwgMHgwOTI0ODQ0MCksCisgICAgV1RDUCgweDdmYTk2ODczLCAweDA5NGNhMTExKSwgV1RDUCgweDdmYTY2ZGY4LCAweDA5NzUyYjk4KSwKKyAgICBXVENQKDB4N2ZhMzVlNDAsIDB4MDk5ZTI0MjUpLCBXVENQKDB4N2ZhMDM4ZGIsIDB4MDljNzhiMDkpLAorICAgIFdUQ1AoMHg3ZjljZmQ1NCwgMHgwOWYxNjA5MCksIFdUQ1AoMHg3Zjk5YWIzOCwgMHgwYTFiYTUwNyksCisgICAgV1RDUCgweDdmOTY0MjEwLCAweDBhNDY1OGI2KSwgV1RDUCgweDdmOTJjMTY1LCAweDBhNzE3YmUyKSwKKyAgICBXVENQKDB4N2Y4ZjI4YmYsIDB4MGE5ZDBlZDEpLCBXVENQKDB4N2Y4Yjc3YTQsIDB4MGFjOTExYzQpLAorICAgIFdUQ1AoMHg3Zjg3YWQ5NywgMHgwYWY1ODRmYiksIFdUQ1AoMHg3ZjgzY2ExZCwgMHgwYjIyNjhiMiksCisgICAgV1RDUCgweDdmN2ZjY2I1LCAweDBiNGZiZDIzKSwgV1RDUCgweDdmN2JiNGUyLCAweDBiN2Q4Mjg4KSwKKyAgICBXVENQKDB4N2Y3NzgyMjEsIDB4MGJhYmI5MTUpLCBXVENQKDB4N2Y3MzMzZjEsIDB4MGJkYTYwZmQpLAorICAgIFdUQ1AoMHg3ZjZlYzljZCwgMHgwYzA5N2E3MiksIFdUQ1AoMHg3ZjZhNDMzMCwgMHgwYzM5MDVhMSksCisgICAgV1RDUCgweDdmNjU5Zjk0LCAweDBjNjkwMmI2KSwgV1RDUCgweDdmNjBkZTcwLCAweDBjOTk3MWQ5KSwKKyAgICBXVENQKDB4N2Y1YmZmM2IsIDB4MGNjYTUzMzEpLCBXVENQKDB4N2Y1NzAxNmIsIDB4MGNmYmE2ZTMpLAorICAgIFdUQ1AoMHg3ZjUxZTQ3NCwgMHgwZDJkNmQwZSksIFdUQ1AoMHg3ZjRjYTdjOCwgMHgwZDVmYTVkMiksCisgICAgV1RDUCgweDdmNDc0YWQ5LCAweDBkOTI1MTRhKSwgV1RDUCgweDdmNDFjZDE3LCAweDBkYzU2ZjkwKSwKKyAgICBXVENQKDB4N2YzYzJkZjEsIDB4MGRmOTAwYmIpLCBXVENQKDB4N2YzNjZjZDUsIDB4MGUyZDA0ZGUpLAorICAgIFdUQ1AoMHg3ZjMwODkyZSwgMHgwZTYxN2MwYSksIFdUQ1AoMHg3ZjJhODI2OSwgMHgwZTk2NjY0ZSksCisgICAgV1RDUCgweDdmMjQ1N2VmLCAweDBlY2JjM2I1KSwgV1RDUCgweDdmMWUwOTI5LCAweDBmMDE5NDQ5KSwKKyAgICBXVENQKDB4N2YxNzk1N2UsIDB4MGYzN2Q4MGYpLCBXVENQKDB4N2YxMGZjNTUsIDB4MGY2ZThmMGMpLAorICAgIFdUQ1AoMHg3ZjBhM2QxNCwgMHgwZmE1Yjk0MCksIFdUQ1AoMHg3ZjAzNTcxZCwgMHgwZmRkNTZhOCksCisgICAgV1RDUCgweDdlZmM0OWQ0LCAweDEwMTU2NzQwKSwgV1RDUCgweDdlZjUxNDliLCAweDEwNGRlYjAwKSwKKyAgICBXVENQKDB4N2VlZGI2ZDIsIDB4MTA4NmUxZGQpLCBXVENQKDB4N2VlNjJmZGEsIDB4MTBjMDRiY2EpLAorICAgIFdUQ1AoMHg3ZWRlN2YxMSwgMHgxMGZhMjhiNyksIFdUQ1AoMHg3ZWQ2YTNkNSwgMHgxMTM0Nzg5MCksCisgICAgV1RDUCgweDdlY2U5ZDgxLCAweDExNmYzYjNmKSwgV1RDUCgweDdlYzY2YjczLCAweDExYWE3MGFjKSwKKyAgICBXVENQKDB4N2ViZTBkMDQsIDB4MTFlNjE4YmEpLCBXVENQKDB4N2ViNTgxOGQsIDB4MTIyMjMzNGMpLAorICAgIFdUQ1AoMHg3ZWFjYzg2OSwgMHgxMjVlYzAzZSksIFdUQ1AoMHg3ZWEzZTBlZiwgMHgxMjliYmY2ZSksCisgICAgV1RDUCgweDdlOWFjYTc1LCAweDEyZDkzMGIyKSwgV1RDUCgweDdlOTE4NDUyLCAweDEzMTcxM2UyKSwKKyAgICBXVENQKDB4N2U4ODBkZGIsIDB4MTM1NTY4Y2YpLCBXVENQKDB4N2U3ZTY2NjUsIDB4MTM5NDJmNDkpLAorICAgIFdUQ1AoMHg3ZTc0OGQ0MywgMHgxM2QzNjcxZSksIFdUQ1AoMHg3ZTZhODFjOCwgMHgxNDEzMTAxNyksCisgICAgV1RDUCgweDdlNjA0MzQ3LCAweDE0NTMyOWZhKSwgV1RDUCgweDdlNTVkMTExLCAweDE0OTNiNDhjKSwKKyAgICBXVENQKDB4N2U0YjJhNzYsIDB4MTRkNGFmOGUpLCBXVENQKDB4N2U0MDRlYzgsIDB4MTUxNjFhYmUpLAorICAgIFdUQ1AoMHg3ZTM1M2Q1NSwgMHgxNTU3ZjVkNyksIFdUQ1AoMHg3ZTI5ZjU2YywgMHgxNTlhNDA5MCksCisgICAgV1RDUCgweDdlMWU3NjVjLCAweDE1ZGNmYWEwKSwgV1RDUCgweDdlMTJiZjcyLCAweDE2MjAyM2I3KSwKKyAgICBXVENQKDB4N2UwNmNmZmMsIDB4MTY2M2JiODYpLCBXVENQKDB4N2RmYWE3NDYsIDB4MTZhN2MxYjkpLAorICAgIFdUQ1AoMHg3ZGVlNDQ5ZSwgMHgxNmVjMzVmNyksIFdUQ1AoMHg3ZGUxYTc0ZSwgMHgxNzMxMTdlOSksCisgICAgV1RDUCgweDdkZDRjZWEzLCAweDE3NzY2NzMxKSwgV1RDUCgweDdkYzdiOWU3LCAweDE3YmMyMzZmKSwKKyAgICBXVENQKDB4N2RiYTY4NjUsIDB4MTgwMjRjNDApLCBXVENQKDB4N2RhY2Q5NjgsIDB4MTg0OGUxM2YpLAorICAgIFdUQ1AoMHg3ZDlmMGMzYSwgMHgxODhmZTIwNCksIFdUQ1AoMHg3ZDkxMDAyNSwgMHgxOGQ3NGUyMiksCisgICAgV1RDUCgweDdkODJiNDcyLCAweDE5MWYyNTJjKSwgV1RDUCgweDdkNzQyODZjLCAweDE5Njc2NmFlKSwKKyAgICBXVENQKDB4N2Q2NTViNWIsIDB4MTliMDEyMzYpLCBXVENQKDB4N2Q1NjRjOGEsIDB4MTlmOTI3NGIpLAorICAgIFdUQ1AoMHg3ZDQ2ZmI0MCwgMHgxYTQyYTU3NCksIFdUQ1AoMHg3ZDM3NjZjOCwgMHgxYThjOGMzMiksCisgICAgV1RDUCgweDdkMjc4ZTZhLCAweDFhZDZkYjA2KSwgV1RDUCgweDdkMTc3MTZmLCAweDFiMjE5MTZjKSwKKyAgICBXVENQKDB4N2QwNzBmMjIsIDB4MWI2Y2FlZGYpLCBXVENQKDB4N2NmNjY2Y2IsIDB4MWJiODMyZDUpLAorICAgIFdUQ1AoMHg3Y2U1NzdiMywgMHgxYzA0MWNjMiksIFdUQ1AoMHg3Y2Q0NDEyNCwgMHgxYzUwNmMxNyksCisgICAgV1RDUCgweDdjYzJjMjY5LCAweDFjOWQyMDQ0KSwgV1RDUCgweDdjYjBmYWNhLCAweDFjZWEzOGIyKSwKKyAgICBXVENQKDB4N2M5ZWU5OTIsIDB4MWQzN2I0Y2MpLCBXVENQKDB4N2M4YzhlMGMsIDB4MWQ4NTkzZjUpLAorICAgIFdUQ1AoMHg3Yzc5ZTc4MiwgMHgxZGQzZDU5MiksIFdUQ1AoMHg3YzY2ZjU0MSwgMHgxZTIyNzkwMyksCisgICAgV1RDUCgweDdjNTNiNjkyLCAweDFlNzE3ZGEzKSwgV1RDUCgweDdjNDAyYWMzLCAweDFlYzBlMmNmKSwKKyAgICBXVENQKDB4N2MyYzUxMjAsIDB4MWYxMGE3ZGMpLCBXVENQKDB4N2MxODI4ZjYsIDB4MWY2MGNjMjEpLAorICAgIFdUQ1AoMHg3YzAzYjE5MywgMHgxZmIxNGVlZiksIFdUQ1AoMHg3YmVlZWE0NCwgMHgyMDAyMmY5NiksCisgICAgV1RDUCgweDdiZDlkMjU5LCAweDIwNTM2ZDYxKSwgV1RDUCgweDdiYzQ2OTIxLCAweDIwYTUwNzlhKSwKKyAgICBXVENQKDB4N2JhZWFkZWMsIDB4MjBmNmZkOGEpLCBXVENQKDB4N2I5OGEwMGIsIDB4MjE0OTRlNzMpLAorICAgIFdUQ1AoMHg3YjgyM2VjZiwgMHgyMTliZjk5OCksIFdUQ1AoMHg3YjZiODk4YiwgMHgyMWVlZmUzNyksCisgICAgV1RDUCgweDdiNTQ3ZjkzLCAweDIyNDI1YjhkKSwgV1RDUCgweDdiM2QyMDNhLCAweDIyOTYxMGQ0KSwKKyAgICBXVENQKDB4N2IyNTZhZDUsIDB4MjJlYTFkNDIpLCBXVENQKDB4N2IwZDVlYmIsIDB4MjMzZTgwMGMpLAorICAgIFdUQ1AoMHg3YWY0ZmI0MiwgMHgyMzkzMzg2NCksIFdUQ1AoMHg3YWRjM2ZjMiwgMHgyM2U4NDU3YSksCisgICAgV1RDUCgweDdhYzMyYjk1LCAweDI0M2RhNjc5KSwgV1RDUCgweDdhYTliZTE0LCAweDI0OTM1YThkKSwKKyAgICBXVENQKDB4N2E4ZmY2OWEsIDB4MjRlOTYwZGQpLCBXVENQKDB4N2E3NWQ0ODUsIDB4MjUzZmI4OGUpLAorICAgIFdUQ1AoMHg3YTViNTczMSwgMHgyNTk2NjBjMyksIFdUQ1AoMHg3YTQwN2RmZSwgMHgyNWVkNTg5YyksCisgICAgV1RDUCgweDdhMjU0ODRjLCAweDI2NDQ5ZjM4KSwgV1RDUCgweDdhMDliNTdjLCAweDI2OWMzM2IxKSwKKyAgICBXVENQKDB4NzllZGM0ZjEsIDB4MjZmNDE1MjIpLCBXVENQKDB4NzlkMTc2MGUsIDB4Mjc0YzQyYTApLAorICAgIFdUQ1AoMHg3OWI0YzgzYiwgMHgyN2E0YmI0MCksIFdUQ1AoMHg3OTk3YmFkZCwgMHgyN2ZkN2UxNSksCisgICAgV1RDUCgweDc5N2E0ZDVlLCAweDI4NTY4YTJmKSwgV1RDUCgweDc5NWM3ZjI2LCAweDI4YWZkZTlhKSwKKyAgICBXVENQKDB4NzkzZTRmYTMsIDB4MjkwOTdhNjMpLCBXVENQKDB4NzkxZmJlNDAsIDB4Mjk2MzVjOTIpLAorICAgIFdUQ1AoMHg3OTAwY2E2ZSwgMHgyOWJkODQyZSksIFdUQ1AoMHg3OGUxNzM5YywgMHgyYTE3ZjAzZSksCisgICAgV1RDUCgweDc4YzFiOTNkLCAweDJhNzI5ZmMyKSwgV1RDUCgweDc4YTE5YWM0LCAweDJhY2Q5MWJjKSwKKyAgICBXVENQKDB4Nzg4MTE3YTcsIDB4MmIyOGM1MmEpLCBXVENQKDB4Nzg2MDJmNWUsIDB4MmI4NDM5MDkpLAorICAgIFdUQ1AoMHg3ODNlZTE2MywgMHgyYmRmZWM1NCksIFdUQ1AoMHg3ODFkMmQyZiwgMHgyYzNiZGUwMiksCisgICAgV1RDUCgweDc3ZmIxMjQxLCAweDJjOTgwZDBhKSwgV1RDUCgweDc3ZDg5MDE3LCAweDJjZjQ3ODYyKSwKKyAgICBXVENQKDB4NzdiNWE2MzIsIDB4MmQ1MTFlZmIpLCBXVENQKDB4Nzc5MjU0MTYsIDB4MmRhZGZmYzYpLAorICAgIFdUQ1AoMHg3NzZlOTk0NywgMHgyZTBiMTliMyksIFdUQ1AoMHg3NzRhNzU0ZCwgMHgyZTY4NmJhZSksCisgICAgV1RDUCgweDc3MjVlN2IwLCAweDJlYzVmNGE0KSwgV1RDUCgweDc3MDBlZmZkLCAweDJmMjNiMzdkKSwKKyAgICBXVENQKDB4NzZkYjhkYmYsIDB4MmY4MWE3MjEpLCBXVENQKDB4NzZiNWMwODgsIDB4MmZkZmNlNzcpLAorICAgIFdUQ1AoMHg3NjhmODdlOCwgMHgzMDNlMjg2MyksIFdUQ1AoMHg3NjY4ZTM3NSwgMHgzMDljYjNjOCksCisgICAgV1RDUCgweDc2NDFkMmM0LCAweDMwZmI2Zjg4KSwgV1RDUCgweDc2MWE1NTZlLCAweDMxNWE1YTgyKSwKKyAgICBXVENQKDB4NzVmMjZiMGUsIDB4MzFiOTczOTQpLCBXVENQKDB4NzVjYTEzNDEsIDB4MzIxOGI5OWMpLAorICAgIFdUQ1AoMHg3NWExNGRhOCwgMHgzMjc4MmI3NCksIFdUQ1AoMHg3NTc4MTllNCwgMHgzMmQ3YzdmNiksCisgICAgV1RDUCgweDc1NGU3NzlhLCAweDMzMzc4ZGZjKSwgV1RDUCgweDc1MjQ2NjcxLCAweDMzOTc3YzViKSwKKyAgICBXVENQKDB4NzRmOWU2MTMsIDB4MzNmNzkxZTkpLCBXVENQKDB4NzRjZWY2MmIsIDB4MzQ1N2NkN2MpLAorICAgIFdUQ1AoMHg3NGEzOTY2YSwgMHgzNGI4MmRlNiksIFdUQ1AoMHg3NDc3YzY3ZiwgMHgzNTE4YjFmOSksCisgICAgV1RDUCgweDc0NGI4NjFlLCAweDM1Nzk1ODg3KSwgV1RDUCgweDc0MWVkNGZmLCAweDM1ZGEyMDVlKSwKKyAgICBXVENQKDB4NzNmMWIyZGEsIDB4MzYzYjA4NGUpLCBXVENQKDB4NzNjNDFmNmIsIDB4MzY5YzBmMjQpLAorICAgIFdUQ1AoMHg3Mzk2MWE3MSwgMHgzNmZkMzNhYyksIFdUQ1AoMHg3MzY3YTNhYywgMHgzNzVlNzRiMSksCisgICAgV1RDUCgweDczMzhiYWUxLCAweDM3YmZkMGZmKSwgV1RDUCgweDczMDk1ZmQ3LCAweDM4MjE0NzVmKSwKKyAgICBXVENQKDB4NzJkOTkyNTcsIDB4Mzg4MmQ2OTkpLCBXVENQKDB4NzJhOTUyMmQsIDB4MzhlNDdkNzUpLAorICAgIFdUQ1AoMHg3Mjc4OWYyOCwgMHgzOTQ2M2FiYSksIFdUQ1AoMHg3MjQ3NzkxYiwgMHgzOWE4MGQyZSksCisgICAgV1RDUCgweDcyMTVkZmRhLCAweDNhMDlmMzk3KSwgV1RDUCgweDcxZTNkMzNkLCAweDNhNmJlY2JhKSwKKyAgICBXVENQKDB4NzFiMTUzMWYsIDB4M2FjZGY3NWEpLCBXVENQKDB4NzE3ZTVmNWQsIDB4M2IzMDEyM2IpLAorICAgIFdUQ1AoMHg3MTRhZjdkNywgMHgzYjkyM2MyMCksIFdUQ1AoMHg3MTE3MWM3MiwgMHgzYmY0NzNjYyksCisgICAgV1RDUCgweDcwZTJjZDE0LCAweDNjNTZiN2ZmKSwgV1RDUCgweDcwYWUwOWE2LCAweDNjYjkwNzdiKSwKKyAgICBXVENQKDB4NzA3OGQyMTUsIDB4M2QxYjYxMDEpLCBXVENQKDB4NzA0MzI2NGYsIDB4M2Q3ZGMzNTMpLAorICAgIFdUQ1AoMHg3MDBkMDY0OCwgMHgzZGUwMmQyZSksIFdUQ1AoMHg2ZmQ2NzFmNSwgMHgzZTQyOWQ1NSksCisgICAgV1RDUCgweDZmOWY2OTRmLCAweDNlYTUxMjg1KSwgV1RDUCgweDZmNjdlYzUyLCAweDNmMDc4YjdmKSwKKyAgICBXVENQKDB4NmYyZmZhZmIsIDB4M2Y2YTA3MDEpLCBXVENQKDB4NmVmNzk1NGUsIDB4M2ZjYzgzY2EpLAorICAgIFdUQ1AoMHg2ZWJlYmI0ZSwgMHg0MDJmMDA5YSksIFdUQ1AoMHg2ZTg1NmQwNSwgMHg0MDkxN2MyZSksCisgICAgV1RDUCgweDZlNGJhYTdlLCAweDQwZjNmNTQ2KSwgV1RDUCgweDZlMTE3M2M2LCAweDQxNTY2YWExKSwKKyAgICBXVENQKDB4NmRkNmM4ZWYsIDB4NDFiOGRhZmMpLCBXVENQKDB4NmQ5YmFhMGYsIDB4NDIxYjQ1MTgpLAorICAgIFdUQ1AoMHg2ZDYwMTczZCwgMHg0MjdkYTdiMSksIFdUQ1AoMHg2ZDI0MTA5NCwgMHg0MmUwMDE4OSksCisgICAgV1RDUCgweDZjZTc5NjMyLCAweDQzNDI1MTVlKSwgV1RDUCgweDZjYWFhODM5LCAweDQzYTQ5NWVmKSwKKyAgICBXVENQKDB4NmM2ZDQ2Y2UsIDB4NDQwNmNkZmQpLCBXVENQKDB4NmMyZjcyMTgsIDB4NDQ2OGY4NDgpLAorICAgIFdUQ1AoMHg2YmYxMmE0MiwgMHg0NGNiMTM4ZiksIFdUQ1AoMHg2YmIyNmY3YiwgMHg0NTJkMWU5NCksCisgICAgV1RDUCgweDZiNzM0MWY1LCAweDQ1OGYxODE4KSwgV1RDUCgweDZiMzNhMWUzLCAweDQ1ZjBmZWRlKSwKKyAgICBXVENQKDB4NmFmMzhmN2UsIDB4NDY1MmQxYTYpLCBXVENQKDB4NmFiMzBiMDEsIDB4NDZiNDhmMzQpLAorICAgIFdUQ1AoMHg2YTcyMTRhYiwgMHg0NzE2MzY0YyksIFdUQ1AoMHg2YTMwYWNiZCwgMHg0Nzc3YzViMiksCisgICAgV1RDUCgweDY5ZWVkMzdjLCAweDQ3ZDkzYzJhKSwgV1RDUCgweDY5YWM4OTMwLCAweDQ4M2E5ODdhKSwKKyAgICBXVENQKDB4Njk2OWNlMjQsIDB4NDg5YmQ5NjgpLCBXVENQKDB4NjkyNmEyYTgsIDB4NDhmY2ZkYmIpLAorICAgIFdUQ1AoMHg2OGUzMDcwYywgMHg0OTVlMDQzYiksIFdUQ1AoMHg2ODllZmJhNywgMHg0OWJlZWJiMCksCisgICAgV1RDUCgweDY4NWE4MGNmLCAweDRhMWZiMmU1KSwgV1RDUCgweDY4MTU5NmUxLCAweDRhODA1OGE0KSwKKyAgICBXVENQKDB4NjdkMDNlM2IsIDB4NGFlMGRiYjgpLCBXVENQKDB4Njc4YTc3M2YsIDB4NGI0MTNhZWUpLAorICAgIFdUQ1AoMHg2NzQ0NDI1MywgMHg0YmExNzUxNCksIFdUQ1AoMHg2NmZkOWZkZSwgMHg0YzAxODhmOCksCisgICAgV1RDUCgweDY2YjY5MDRjLCAweDRjNjE3NTZiKSwgV1RDUCgweDY2NmYxNDBkLCAweDRjYzEzOTNkKSwKKyAgICBXVENQKDB4NjYyNzJiOTEsIDB4NGQyMGQzNDEpLCBXVENQKDB4NjVkZWQ3NGQsIDB4NGQ4MDQyNGEpLAorICAgIFdUQ1AoMHg2NTk2MTdiYiwgMHg0ZGRmODUyZCksIFdUQ1AoMHg2NTRjZWQ1NSwgMHg0ZTNlOWFjMSksCisgICAgV1RDUCgweDY1MDM1ODliLCAweDRlOWQ4MWRjKSwgV1RDUCgweDY0Yjk1YTBkLCAweDRlZmMzOTU5KSwKKyAgICBXVENQKDB4NjQ2ZWYyMzAsIDB4NGY1YWMwMTApLCBXVENQKDB4NjQyNDIxOGQsIDB4NGZiOTE0ZGYpLAorICAgIFdUQ1AoMHg2M2Q4ZThhZSwgMHg1MDE3MzZhMSksIFdUQ1AoMHg2MzhkNDgyMiwgMHg1MDc1MjQzOCksCisgICAgV1RDUCgweDYzNDE0MDdhLCAweDUwZDJkYzgyKSwgV1RDUCgweDYyZjRkMjRiLCAweDUxMzA1ZTYxKSwKKyAgICBXVENQKDB4NjJhN2ZlMmIsIDB4NTE4ZGE4YmIpLCBXVENQKDB4NjI1YWM0YjUsIDB4NTFlYWJhNzQpLAorICAgIFdUQ1AoMHg2MjBkMjY4NiwgMHg1MjQ3OTI3MyksIFdUQ1AoMHg2MWJmMjQ0MCwgMHg1MmE0MmZhMiksCisgICAgV1RDUCgweDYxNzBiZTg1LCAweDUzMDA5MGVhKSwgV1RDUCgweDYxMjFmNWZiLCAweDUzNWNiNTNhKSwKKyAgICBXVENQKDB4NjBkMmNiNGUsIDB4NTNiODliN2UpLCBXVENQKDB4NjA4MzNmMjgsIDB4NTQxNDQyYTgpLAorICAgIFdUQ1AoMHg2MDMzNTIzOSwgMHg1NDZmYTlhOSksIFdUQ1AoMHg1ZmUzMDUzMywgMHg1NGNhY2Y3NyksCisgICAgV1RDUCgweDVmOTI1OGNjLCAweDU1MjViMzA2KSwgV1RDUCgweDVmNDE0ZGJiLCAweDU1ODA1MzUwKSwKKyAgICBXVENQKDB4NWVlZmU0YmMsIDB4NTVkYWFmNGUpLCBXVENQKDB4NWU5ZTFlOGMsIDB4NTYzNGM1ZmUpLAorICAgIFdUQ1AoMHg1ZTRiZmJlYywgMHg1NjhlOTY1YyksIFdUQ1AoMHg1ZGY5N2Q5ZSwgMHg1NmU4MWY2YyksCisgICAgV1RDUCgweDVkYTZhNDZhLCAweDU3NDE2MDJlKSwgV1RDUCgweDVkNTM3MTE4LCAweDU3OWE1N2E4KSwKKyAgICBXVENQKDB4NWNmZmU0NzQsIDB4NTdmMzA0ZTIpLCBXVENQKDB4NWNhYmZmNGMsIDB4NTg0YjY2ZTQpLAorICAgIFdUQ1AoMHg1YzU3YzI3MSwgMHg1OGEzN2NiYiksIFdUQ1AoMHg1YzAzMmViNywgMHg1OGZiNDU3NiksCisgICAgV1RDUCgweDViYWU0NGY0LCAweDU5NTJjMDI0KSwgV1RDUCgweDViNTkwNjAyLCAweDU5YTllYmQ4KSwKKyAgICBXVENQKDB4NWIwMzcyYmIsIDB4NWEwMGM3YTgpLCBXVENQKDB4NWFhZDhiZmUsIDB4NWE1NzUyYWMpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIEtCRFdpbmRvdzk2MFtdID0geworICAgIFdUQ1AoMHg3ZmZmZmY5ZSwgMHgwMDA5ZTZhYyksIFdUQ1AoMHg3ZmZmZmYyYiwgMHgwMDBlOTZkNSksCisgICAgV1RDUCgweDdmZmZmZWE2LCAweDAwMTI5ODdlKSwgV1RDUCgweDdmZmZmZTBlLCAweDAwMTY1MmI2KSwKKyAgICBXVENQKDB4N2ZmZmZkNjAsIDB4MDAxOWViY2UpLCBXVENQKDB4N2ZmZmZjOWMsIDB4MDAxZDc2YmYpLAorICAgIFdUQ1AoMHg3ZmZmZmJiZiwgMHgwMDIwZmU3OSksIFdUQ1AoMHg3ZmZmZmFjOSwgMHgwMDI0ODllZiksCisgICAgV1RDUCgweDdmZmZmOWI3LCAweDAwMjgxZGUyKSwgV1RDUCgweDdmZmZmODg3LCAweDAwMmJiZGJiKSwKKyAgICBXVENQKDB4N2ZmZmY3MzcsIDB4MDAyZjZjMGQpLCBXVENQKDB4N2ZmZmY1YzYsIDB4MDAzMzJhZDgpLAorICAgIFdUQ1AoMHg3ZmZmZjQzMSwgMHgwMDM2ZmJiOSksIFdUQ1AoMHg3ZmZmZjI3NiwgMHgwMDNhZTAwNCksCisgICAgV1RDUCgweDdmZmZmMDkyLCAweDAwM2VkOGQ4KSwgV1RDUCgweDdmZmZlZTg0LCAweDAwNDJlNzJmKSwKKyAgICBXVENQKDB4N2ZmZmVjNDgsIDB4MDA0NzBiZTMpLCBXVENQKDB4N2ZmZmU5ZGQsIDB4MDA0YjQ3YjgpLAorICAgIFdUQ1AoMHg3ZmZmZTczZiwgMHgwMDRmOWI1ZiksIFdUQ1AoMHg3ZmZmZTQ2YiwgMHgwMDU0MDc3YSksCisgICAgV1RDUCgweDdmZmZlMTVmLCAweDAwNTg4Y2ExKSwgV1RDUCgweDdmZmZkZTE3LCAweDAwNWQyYjYxKSwKKyAgICBXVENQKDB4N2ZmZmRhOTEsIDB4MDA2MWU0NDIpLCBXVENQKDB4N2ZmZmQ2YzksIDB4MDA2NmI3YzIpLAorICAgIFdUQ1AoMHg3ZmZmZDJiYiwgMHgwMDZiYTY1YyksIFdUQ1AoMHg3ZmZmY2U2NSwgMHgwMDcwYjA4NyksCisgICAgV1RDUCgweDdmZmZjOWMyLCAweDAwNzVkNmI1KSwgV1RDUCgweDdmZmZjNGNmLCAweDAwN2IxOTU1KSwKKyAgICBXVENQKDB4N2ZmZmJmODcsIDB4MDA4MDc4ZDUpLCBXVENQKDB4N2ZmZmI5ZTcsIDB4MDA4NWY1YTApLAorICAgIFdUQ1AoMHg3ZmZmYjNlYSwgMHgwMDhiOTAxZCksIFdUQ1AoMHg3ZmZmYWQ4YywgMHgwMDkxNDhiNCksCisgICAgV1RDUCgweDdmZmZhNmM5LCAweDAwOTcxZmNiKSwgV1RDUCgweDdmZmY5ZjljLCAweDAwOWQxNWM3KSwKKyAgICBXVENQKDB4N2ZmZjk4MDAsIDB4MDBhMzJiMGIpLCBXVENQKDB4N2ZmZjhmZjAsIDB4MDBhOTVmZjkpLAorICAgIFdUQ1AoMHg3ZmZmODc2NywgMHgwMGFmYjRmNCksIFdUQ1AoMHg3ZmZmN2U1ZiwgMHgwMGI2MmE1YyksCisgICAgV1RDUCgweDdmZmY3NGQ0LCAweDAwYmNjMDkzKSwgV1RDUCgweDdmZmY2YWMwLCAweDAwYzM3N2Y4KSwKKyAgICBXVENQKDB4N2ZmZjYwMWMsIDB4MDBjYTUwZWIpLCBXVENQKDB4N2ZmZjU0ZTMsIDB4MDBkMTRiY2IpLAorICAgIFdUQ1AoMHg3ZmZmNDkwZSwgMHgwMGQ4NjhmNyksIFdUQ1AoMHg3ZmZmM2M5OCwgMHgwMGRmYThjZSksCisgICAgV1RDUCgweDdmZmYyZjc5LCAweDAwZTcwYmFkKSwgV1RDUCgweDdmZmYyMWFjLCAweDAwZWU5MWYzKSwKKyAgICBXVENQKDB4N2ZmZjEzMjgsIDB4MDBmNjNiZmUpLCBXVENQKDB4N2ZmZjAzZTcsIDB4MDBmZTBhMmMpLAorICAgIFdUQ1AoMHg3ZmZlZjNlMSwgMHgwMTA1ZmNkOSksIFdUQ1AoMHg3ZmZlZTMxMCwgMHgwMTBlMTQ2MiksCisgICAgV1RDUCgweDdmZmVkMTZhLCAweDAxMTY1MTI2KSwgV1RDUCgweDdmZmViZWU5LCAweDAxMWViMzgxKSwKKyAgICBXVENQKDB4N2ZmZWFiODMsIDB4MDEyNzNiZDApLCBXVENQKDB4N2ZmZTk3MzEsIDB4MDEyZmVhNmYpLAorICAgIFdUQ1AoMHg3ZmZlODFlYSwgMHgwMTM4YmZiYyksIFdUQ1AoMHg3ZmZlNmJhNCwgMHgwMTQxYmMxMiksCisgICAgV1RDUCgweDdmZmU1NDU3LCAweDAxNGFkZmNlKSwgV1RDUCgweDdmZmUzYmZhLCAweDAxNTQyYjRkKSwKKyAgICBXVENQKDB4N2ZmZTIyODIsIDB4MDE1ZDllZTkpLCBXVENQKDB4N2ZmZTA3ZTYsIDB4MDE2NzNiMDEpLAorICAgIFdUQ1AoMHg3ZmZkZWMxYiwgMHgwMTcwZmZlZSksIFdUQ1AoMHg3ZmZkY2YxNywgMHgwMTdhZWUwZSksCisgICAgV1RDUCgweDdmZmRiMGQwLCAweDAxODUwNWJjKSwgV1RDUCgweDdmZmQ5MTNiLCAweDAxOGY0NzU0KSwKKyAgICBXVENQKDB4N2ZmZDcwNGIsIDB4MDE5OWIzMzApLCBXVENQKDB4N2ZmZDRkZjcsIDB4MDFhNDQ5YWQpLAorICAgIFdUQ1AoMHg3ZmZkMmEzMSwgMHgwMWFmMGIyNSksIFdUQ1AoMHg3ZmZkMDRlZiwgMHgwMWI5ZjdmNCksCisgICAgV1RDUCgweDdmZmNkZTIzLCAweDAxYzUxMDc0KSwgV1RDUCgweDdmZmNiNWMxLCAweDAxZDA1NTAxKSwKKyAgICBXVENQKDB4N2ZmYzhiYmMsIDB4MDFkYmM1ZjUpLCBXVENQKDB4N2ZmYzYwMDYsIDB4MDFlNzYzYWIpLAorICAgIFdUQ1AoMHg3ZmZjMzI5MywgMHgwMWYzMmU3ZCksIFdUQ1AoMHg3ZmZjMDM1NCwgMHgwMWZmMjZjNSksCisgICAgV1RDUCgweDdmZmJkMjNiLCAweDAyMGI0Y2RlKSwgV1RDUCgweDdmZmI5ZjNhLCAweDAyMTdhMTIwKSwKKyAgICBXVENQKDB4N2ZmYjZhNDEsIDB4MDIyNDIzZTYpLCBXVENQKDB4N2ZmYjMzNDIsIDB4MDIzMGQ1OGEpLAorICAgIFdUQ1AoMHg3ZmZhZmEyZCwgMHgwMjNkYjY2NCksIFdUQ1AoMHg3ZmZhYmVmMiwgMHgwMjRhYzZjZSksCisgICAgV1RDUCgweDdmZmE4MTgwLCAweDAyNTgwNzIwKSwgV1RDUCgweDdmZmE0MWM5LCAweDAyNjU3N2IzKSwKKyAgICBXVENQKDB4N2ZmOWZmYjksIDB4MDI3MzE4ZTApLCBXVENQKDB4N2ZmOWJiNDEsIDB4MDI4MGVhZmYpLAorICAgIFdUQ1AoMHg3ZmY5NzQ0ZSwgMHgwMjhlZWU2OCksIFdUQ1AoMHg3ZmY5MmFjZiwgMHgwMjlkMjM3MSksCisgICAgV1RDUCgweDdmZjhkZWIxLCAweDAyYWI4YTc0KSwgV1RDUCgweDdmZjg4ZmUyLCAweDAyYmEyM2M3KSwKKyAgICBXVENQKDB4N2ZmODNlNGQsIDB4MDJjOGVmYzApLCBXVENQKDB4N2ZmN2U5ZTEsIDB4MDJkN2VlYjcpLAorICAgIFdUQ1AoMHg3ZmY3OTI4OCwgMHgwMmU3MjEwMSksIFdUQ1AoMHg3ZmY3MzgyZiwgMHgwMmY2ODZmNSksCisgICAgV1RDUCgweDdmZjZkYWMxLCAweDAzMDYyMGU5KSwgV1RDUCgweDdmZjY3YTI5LCAweDAzMTVlZjMxKSwKKyAgICBXVENQKDB4N2ZmNjE2NTEsIDB4MDMyNWYyMjQpLCBXVENQKDB4N2ZmNWFmMjMsIDB4MDMzNjJhMTQpLAorICAgIFdUQ1AoMHg3ZmY1NDQ4YSwgMHgwMzQ2OTc1OCksIFdUQ1AoMHg3ZmY0ZDY2ZCwgMHgwMzU3M2E0MiksCisgICAgV1RDUCgweDdmZjQ2NGI3LCAweDAzNjgxMzI3KSwgV1RDUCgweDdmZjNlZjRmLCAweDAzNzkyMjVhKSwKKyAgICBXVENQKDB4N2ZmMzc2MWQsIDB4MDM4YTY4MmUpLCBXVENQKDB4N2ZmMmY5MGEsIDB4MDM5YmU0ZjQpLAorICAgIFdUQ1AoMHg3ZmYyNzdmYiwgMHgwM2FkOTkwMCksIFdUQ1AoMHg3ZmYxZjJkOCwgMHgwM2JmODRhMyksCisgICAgV1RDUCgweDdmZjE2OTg2LCAweDAzZDFhODJlKSwgV1RDUCgweDdmZjBkYmVjLCAweDAzZTQwM2YzKSwKKyAgICBXVENQKDB4N2ZmMDQ5ZWYsIDB4MDNmNjk4NDApLCBXVENQKDB4N2ZlZmIzNzMsIDB4MDQwOTY1NjgpLAorICAgIFdUQ1AoMHg3ZmVmMTg1ZCwgMHgwNDFjNmJiOCksIFdUQ1AoMHg3ZmVlNzg5MCwgMHgwNDJmYWI4MSksCisgICAgV1RDUCgweDdmZWRkM2YxLCAweDA0NDMyNTEwKSwgV1RDUCgweDdmZWQyYTYxLCAweDA0NTZkOGI0KSwKKyAgICBXVENQKDB4N2ZlYzdiYzQsIDB4MDQ2YWM2YmEpLCBXVENQKDB4N2ZlYmM3ZmIsIDB4MDQ3ZWVmNzApLAorICAgIFdUQ1AoMHg3ZmViMGVlOCwgMHgwNDkzNTMyMiksIFdUQ1AoMHg3ZmVhNTA2YiwgMHgwNGE3ZjIxZCksCisgICAgV1RDUCgweDdmZTk4YzY1LCAweDA0YmNjY2FiKSwgV1RDUCgweDdmZThjMmI3LCAweDA0ZDFlMzE4KSwKKyAgICBXVENQKDB4N2ZlN2YzM2UsIDB4MDRlNzM1YWYpLCBXVENQKDB4N2ZlNzFkZGIsIDB4MDRmY2M0YmEpLAorICAgIFdUQ1AoMHg3ZmU2NDI2YywgMHgwNTEyOTA4MSksIFdUQ1AoMHg3ZmU1NjBjZSwgMHgwNTI4OTk0ZCksCisgICAgV1RDUCgweDdmZTQ3OGRmLCAweDA1M2VkZjY4KSwgV1RDUCgweDdmZTM4YTdjLCAweDA1NTU2MzE4KSwKKyAgICBXVENQKDB4N2ZlMjk1ODEsIDB4MDU2YzI0YTUpLCBXVENQKDB4N2ZlMTk5Y2EsIDB4MDU4MzI0NTUpLAorICAgIFdUQ1AoMHg3ZmUwOTczMywgMHgwNTlhNjI2ZSksIFdUQ1AoMHg3ZmRmOGQ5NSwgMHgwNWIxZGYzNSksCisgICAgV1RDUCgweDdmZGU3Y2NiLCAweDA1Yzk5YWVmKSwgV1RDUCgweDdmZGQ2NGFmLCAweDA1ZTE5NWUwKSwKKyAgICBXVENQKDB4N2ZkYzQ1MWEsIDB4MDVmOWQwNGIpLCBXVENQKDB4N2ZkYjFkZTQsIDB4MDYxMjRhNzMpLAorICAgIFdUQ1AoMHg3ZmQ5ZWVlNSwgMHgwNjJiMDQ5OSksIFdUQ1AoMHg3ZmQ4YjdmNSwgMHgwNjQzZmYwMCksCisgICAgV1RDUCgweDdmZDc3OGVjLCAweDA2NWQzOWU3KSwgV1RDUCgweDdmZDYzMTllLCAweDA2NzZiNThmKSwKKyAgICBXVENQKDB4N2ZkNGUxZTIsIDB4MDY5MDcyMzcpLCBXVENQKDB4N2ZkMzg5OGQsIDB4MDZhYTcwMWQpLAorICAgIFdUQ1AoMHg3ZmQyMjg3MywgMHgwNmM0YWY4MCksIFdUQ1AoMHg3ZmQwYmU2YSwgMHgwNmRmMzA5YyksCisgICAgV1RDUCgweDdmY2Y0YjQ0LCAweDA2ZjlmM2FkKSwgV1RDUCgweDdmY2RjZWQ0LCAweDA3MTRmOGYwKSwKKyAgICBXVENQKDB4N2ZjYzQ4ZWQsIDB4MDczMDQwOWYpLCBXVENQKDB4N2ZjYWI5NjAsIDB4MDc0YmNhZjUpLAorICAgIFdUQ1AoMHg3ZmM5MWZmZiwgMHgwNzY3OTgyYSksIFdUQ1AoMHg3ZmM3N2M5YSwgMHgwNzgzYTg3NyksCisgICAgV1RDUCgweDdmYzVjZjAyLCAweDA3OWZmYzE0KSwgV1RDUCgweDdmYzQxNzA1LCAweDA3YmM5MzM4KSwKKyAgICBXVENQKDB4N2ZjMjU0NzQsIDB4MDdkOTZlMTkpLCBXVENQKDB4N2ZjMDg3MWIsIDB4MDdmNjhjZWQpLAorICAgIFdUQ1AoMHg3ZmJlYWVjYSwgMHgwODEzZWZlNyksIFdUQ1AoMHg3ZmJjY2I0YywgMHgwODMxOTczZCksCisgICAgV1RDUCgweDdmYmFkYzcwLCAweDA4NGY4MzIwKSwgV1RDUCgweDdmYjhlMjAwLCAweDA4NmRiM2MzKSwKKyAgICBXVENQKDB4N2ZiNmRiYzgsIDB4MDg4YzI5NTcpLCBXVENQKDB4N2ZiNGM5OTMsIDB4MDhhYWU0MGMpLAorICAgIFdUQ1AoMHg3ZmIyYWIyYiwgMHgwOGM5ZTQxMiksIFdUQ1AoMHg3ZmIwODA1YSwgMHgwOGU5Mjk5NyksCisgICAgV1RDUCgweDdmYWU0OGU5LCAweDA5MDhiNGM5KSwgV1RDUCgweDdmYWMwNGEwLCAweDA5Mjg4NWQ2KSwKKyAgICBXVENQKDB4N2ZhOWIzNDcsIDB4MDk0ODljZTgpLCBXVENQKDB4N2ZhNzU0YTYsIDB4MDk2OGZhMmMpLAorICAgIFdUQ1AoMHg3ZmE0ZTg4NCwgMHgwOTg5OWRjYiksIFdUQ1AoMHg3ZmEyNmVhNiwgMHgwOWFhODdlZSksCisgICAgV1RDUCgweDdmOWZlNmQxLCAweDA5Y2JiOGJlKSwgV1RDUCgweDdmOWQ1MGNjLCAweDA5ZWQzMDYyKSwKKyAgICBXVENQKDB4N2Y5YWFjNWEsIDB4MGEwZWVmMDApLCBXVENQKDB4N2Y5N2Y5M2YsIDB4MGEzMGY0YmYpLAorICAgIFdUQ1AoMHg3Zjk1MzczZSwgMHgwYTUzNDFjMiksIFdUQ1AoMHg3ZjkyNjYxYiwgMHgwYTc1ZDYyZSksCisgICAgV1RDUCgweDdmOGY4NTk2LCAweDBhOThiMjI0KSwgV1RDUCgweDdmOGM5NTcyLCAweDBhYmJkNWM3KSwKKyAgICBXVENQKDB4N2Y4OTk1NmYsIDB4MGFkZjQxMzcpLCBXVENQKDB4N2Y4Njg1NGQsIDB4MGIwMmY0OTQpLAorICAgIFdUQ1AoMHg3ZjgzNjRjZCwgMHgwYjI2ZWZmZCksIFdUQ1AoMHg3ZjgwMzNhZSwgMHgwYjRiMzM4ZiksCisgICAgV1RDUCgweDdmN2NmMWFlLCAweDBiNmZiZjY3KSwgV1RDUCgweDdmNzk5ZThiLCAweDBiOTQ5M2EwKSwKKyAgICBXVENQKDB4N2Y3NjNhMDMsIDB4MGJiOWIwNTYpLCBXVENQKDB4N2Y3MmMzZDIsIDB4MGJkZjE1YTIpLAorICAgIFdUQ1AoMHg3ZjZmM2JiNSwgMHgwYzA0YzM5YyksIFdUQ1AoMHg3ZjZiYTE2OCwgMHgwYzJhYmE1ZCksCisgICAgV1RDUCgweDdmNjdmNGE2LCAweDBjNTBmOWZhKSwgV1RDUCgweDdmNjQzNTI5LCAweDBjNzc4MjhhKSwKKyAgICBXVENQKDB4N2Y2MDYyYWMsIDB4MGM5ZTU0MjApLCBXVENQKDB4N2Y1YzdjZTgsIDB4MGNjNTZlZDEpLAorICAgIFdUQ1AoMHg3ZjU4ODM5NywgMHgwY2VjZDJhZSksIFdUQ1AoMHg3ZjU0NzY3MCwgMHgwZDE0N2ZjOCksCisgICAgV1RDUCgweDdmNTA1NTJjLCAweDBkM2M3NjMwKSwgV1RDUCgweDdmNGMxZjgzLCAweDBkNjRiNWY2KSwKKyAgICBXVENQKDB4N2Y0N2Q1MmEsIDB4MGQ4ZDNmMjYpLCBXVENQKDB4N2Y0Mzc1ZDksIDB4MGRiNjExY2UpLAorICAgIFdUQ1AoMHg3ZjNmMDE0NCwgMHgwZGRmMmRmYSksIFdUQ1AoMHg3ZjNhNzcyMywgMHgwZTA4OTNiNCksCisgICAgV1RDUCgweDdmMzVkNzI5LCAweDBlMzI0MzA2KSwgV1RDUCgweDdmMzEyMTBhLCAweDBlNWMzYmY5KSwKKyAgICBXVENQKDB4N2YyYzU0N2IsIDB4MGU4NjdlOTQpLCBXVENQKDB4N2YyNzcxMmUsIDB4MGViMTBhZGQpLAorICAgIFdUQ1AoMHg3ZjIyNzZkOCwgMHgwZWRiZTBkYSksIFdUQ1AoMHg3ZjFkNjUyOSwgMHgwZjA3MDA4ZSksCisgICAgV1RDUCgweDdmMTgzYmQzLCAweDBmMzI2OWZjKSwgV1RDUCgweDdmMTJmYTg5LCAweDBmNWUxZDI3KSwKKyAgICBXVENQKDB4N2YwZGEwZmIsIDB4MGY4YTFhMGUpLCBXVENQKDB4N2YwODJlZDgsIDB4MGZiNjYwYjEpLAorICAgIFdUQ1AoMHg3ZjAyYTNkMiwgMHgwZmUyZjEwZiksIFdUQ1AoMHg3ZWZjZmY5OCwgMHgxMDBmY2IyNSksCisgICAgV1RDUCgweDdlZjc0MWQ5LCAweDEwM2NlZWVlKSwgV1RDUCgweDdlZjE2YTQyLCAweDEwNmE1YzY2KSwKKyAgICBXVENQKDB4N2VlYjc4ODQsIDB4MTA5ODEzODYpLCBXVENQKDB4N2VlNTZjNGEsIDB4MTBjNjE0NDcpLAorICAgIFdUQ1AoMHg3ZWRmNDU0MywgMHgxMGY0NWVhMCksIFdUQ1AoMHg3ZWQ5MDMxYiwgMHgxMTIyZjI4OCksCisgICAgV1RDUCgweDdlZDJhNTdmLCAweDExNTFjZmYzKSwgV1RDUCgweDdlY2MyYzFhLCAweDExODBmNmQ1KSwKKyAgICBXVENQKDB4N2VjNTk2OTksIDB4MTFiMDY3MjApLCBXVENQKDB4N2ViZWU0YTYsIDB4MTFlMDIwYzgpLAorICAgIFdUQ1AoMHg3ZWI4MTVlZCwgMHgxMjEwMjNiYSksIFdUQ1AoMHg3ZWIxMmExOCwgMHgxMjQwNmZlOCksCisgICAgV1RDUCgweDdlYWEyMGQxLCAweDEyNzEwNTNlKSwgV1RDUCgweDdlYTJmOWMyLCAweDEyYTFlM2E5KSwKKyAgICBXVENQKDB4N2U5YmI0OTQsIDB4MTJkMzBiMTUpLCBXVENQKDB4N2U5NDUwZjAsIDB4MTMwNDdiNmMpLAorICAgIFdUQ1AoMHg3ZThjY2U3ZiwgMHgxMzM2MzQ5NyksIFdUQ1AoMHg3ZTg1MmNlOSwgMHgxMzY4MzY3ZiksCisgICAgV1RDUCgweDdlN2Q2YmQ2LCAweDEzOWE4MTA5KSwgV1RDUCgweDdlNzU4YWVlLCAweDEzY2QxNDFiKSwKKyAgICBXVENQKDB4N2U2ZDg5ZDksIDB4MTNmZmVmOTkpLCBXVENQKDB4N2U2NTY4M2QsIDB4MTQzMzEzNjgpLAorICAgIFdUQ1AoMHg3ZTVkMjVjMSwgMHgxNDY2N2Y2NyksIFdUQ1AoMHg3ZTU0YzIwYiwgMHgxNDlhMzM3OSksCisgICAgV1RDUCgweDdlNGMzY2MzLCAweDE0Y2UyZjdjKSwgV1RDUCgweDdlNDM5NThlLCAweDE1MDI3MzRmKSwKKyAgICBXVENQKDB4N2UzYWNjMTEsIDB4MTUzNmZlY2UpLCBXVENQKDB4N2UzMWRmZjIsIDB4MTU2YmQxZDYpLAorICAgIFdUQ1AoMHg3ZTI4ZDBkNywgMHgxNWEwZWM0MSksIFdUQ1AoMHg3ZTFmOWU2MywgMHgxNWQ2NGRlOSksCisgICAgV1RDUCgweDdlMTY0ODNkLCAweDE2MGJmNmE1KSwgV1RDUCgweDdlMGNjZTA4LCAweDE2NDFlNjRjKSwKKyAgICBXVENQKDB4N2UwMzJmNmEsIDB4MTY3ODFjYjQpLCBXVENQKDB4N2RmOTZjMDUsIDB4MTZhZTk5YjIpLAorICAgIFdUQ1AoMHg3ZGVmODM3ZSwgMHgxNmU1NWQxOCksIFdUQ1AoMHg3ZGU1NzU3OSwgMHgxNzFjNjZiYSksCisgICAgV1RDUCgweDdkZGI0MTlhLCAweDE3NTNiNjY3KSwgV1RDUCgweDdkZDBlNzg0LCAweDE3OGI0YmVmKSwKKyAgICBXVENQKDB4N2RjNjY2ZDksIDB4MTdjMzI3MjEpLCBXVENQKDB4N2RiYmJmM2UsIDB4MTdmYjQ3Y2EpLAorICAgIFdUQ1AoMHg3ZGIwZjA1NiwgMHgxODMzYWRiNSksIFdUQ1AoMHg3ZGE1ZjljMywgMHgxODZjNThhZSksCisgICAgV1RDUCgweDdkOWFkYjI5LCAweDE4YTU0ODdkKSwgV1RDUCgweDdkOGY5NDI5LCAweDE4ZGU3Y2VjKSwKKyAgICBXVENQKDB4N2Q4NDI0NjcsIDB4MTkxN2Y1YzEpLCBXVENQKDB4N2Q3ODhiODYsIDB4MTk1MWIyYzIpLAorICAgIFdUQ1AoMHg3ZDZjYzkyNywgMHgxOThiYjNiNCksIFdUQ1AoMHg3ZDYwZGNlZCwgMHgxOWM1Zjg1YSksCisgICAgV1RDUCgweDdkNTRjNjdjLCAweDFhMDA4MDc3KSwgV1RDUCgweDdkNDg4NTc0LCAweDFhM2I0YmNiKSwKKyAgICBXVENQKDB4N2QzYzE5NzksIDB4MWE3NjVhMTcpLCBXVENQKDB4N2QyZjgyMmQsIDB4MWFiMWFiMTgpLAorICAgIFdUQ1AoMHg3ZDIyYmYzMiwgMHgxYWVkM2U4ZCksIFdUQ1AoMHg3ZDE1ZDAyYiwgMHgxYjI5MTQzMiksCisgICAgV1RDUCgweDdkMDhiNGJhLCAweDFiNjUyYmMxKSwgV1RDUCgweDdjZmI2YzgyLCAweDFiYTE4NGY1KSwKKyAgICBXVENQKDB4N2NlZGY3MjUsIDB4MWJkZTFmODYpLCBXVENQKDB4N2NlMDU0NDUsIDB4MWMxYWZiMmMpLAorICAgIFdUQ1AoMHg3Y2QyODM4NiwgMHgxYzU4MTc5YyksIFdUQ1AoMHg3Y2M0ODQ4OSwgMHgxYzk1NzQ4ZCksCisgICAgV1RDUCgweDdjYjY1NmYzLCAweDFjZDMxMWIxKSwgV1RDUCgweDdjYTdmYTY1LCAweDFkMTBlZWJkKSwKKyAgICBXVENQKDB4N2M5OTZlODMsIDB4MWQ0ZjBiNjApLCBXVENQKDB4N2M4YWIyZjAsIDB4MWQ4ZDY3NGMpLAorICAgIFdUQ1AoMHg3YzdiYzc0ZiwgMHgxZGNjMDIzMCksIFdUQ1AoMHg3YzZjYWI0NCwgMHgxZTBhZGJiYiksCisgICAgV1RDUCgweDdjNWQ1ZTcxLCAweDFlNDlmMzk4KSwgV1RDUCgweDdjNGRlMDdjLCAweDFlODk0OTczKSwKKyAgICBXVENQKDB4N2MzZTMxMDgsIDB4MWVjOGRjZjgpLCBXVENQKDB4N2MyZTRmYjksIDB4MWYwOGFkZDApLAorICAgIFdUQ1AoMHg3YzFlM2MzNCwgMHgxZjQ4YmJhMyksIFdUQ1AoMHg3YzBkZjYxZCwgMHgxZjg5MDYxOCksCisgICAgV1RDUCgweDdiZmQ3ZDE4LCAweDFmYzk4Y2Q2KSwgV1RDUCgweDdiZWNkMGNjLCAweDIwMGE0ZjgwKSwKKyAgICBXVENQKDB4N2JkYmYwZGQsIDB4MjA0YjRkYmMpLCBXVENQKDB4N2JjYWRjZjEsIDB4MjA4Yzg3MmMpLAorICAgIFdUQ1AoMHg3YmI5OTRhZSwgMHgyMGNkZmI3MSksIFdUQ1AoMHg3YmE4MTdiOSwgMHgyMTBmYWEyYyksCisgICAgV1RDUCgweDdiOTY2NWJiLCAweDIxNTE5MmZjKSwgV1RDUCgweDdiODQ3ZTU4LCAweDIxOTNiNTdmKSwKKyAgICBXVENQKDB4N2I3MjYxMzksIDB4MjFkNjExNTMpLCBXVENQKDB4N2I2MDBlMDUsIDB4MjIxOGE2MTQpLAorICAgIFdUQ1AoMHg3YjRkODQ2MywgMHgyMjViNzM1ZCksIFdUQ1AoMHg3YjNhYzNmYywgMHgyMjllNzhjNyksCisgICAgV1RDUCgweDdiMjdjYzc5LCAweDIyZTFiNWViKSwgV1RDUCgweDdiMTQ5ZDgyLCAweDIzMjUyYTYyKSwKKyAgICBXVENQKDB4N2IwMTM2YzEsIDB4MjM2OGQ1YzIpLCBXVENQKDB4N2FlZDk3ZGYsIDB4MjNhY2I3YTApLAorICAgIFdUQ1AoMHg3YWQ5YzA4NywgMHgyM2YwY2Y5MiksIFdUQ1AoMHg3YWM1YjA2MywgMHgyNDM1MWQyYSksCisgICAgV1RDUCgweDdhYjE2NzFlLCAweDI0Nzk5ZmZjKSwgV1RDUCgweDdhOWNlNDY0LCAweDI0YmU1Nzk5KSwKKyAgICBXVENQKDB4N2E4ODI3ZTEsIDB4MjUwMzQzOTEpLCBXVENQKDB4N2E3MzMxNDIsIDB4MjU0ODYzNzUpLAorICAgIFdUQ1AoMHg3YTVlMDAzMywgMHgyNThkYjZkMiksIFdUQ1AoMHg3YTQ4OTQ2MSwgMHgyNWQzM2QzNSksCisgICAgV1RDUCgweDdhMzJlZDdjLCAweDI2MThmNjJjKSwgV1RDUCgweDdhMWQwYjMxLCAweDI2NWVlMTQzKSwKKyAgICBXVENQKDB4N2EwNmVkMmYsIDB4MjZhNGZlMDIpLCBXVENQKDB4NzlmMDkzMjcsIDB4MjZlYjRiZjUpLAorICAgIFdUQ1AoMHg3OWQ5ZmNjOCwgMHgyNzMxY2FhMyksIFdUQ1AoMHg3OWMzMjljMiwgMHgyNzc4Nzk5NSksCisgICAgV1RDUCgweDc5YWMxOWM5LCAweDI3YmY1ODUwKSwgV1RDUCgweDc5OTRjYzhkLCAweDI4MDY2NjVjKSwKKyAgICBXVENQKDB4Nzk3ZDQxYzEsIDB4Mjg0ZGEzM2MpLCBXVENQKDB4Nzk2NTc5MTgsIDB4Mjg5NTBlNzQpLAorICAgIFdUQ1AoMHg3OTRkNzI0NywgMHgyOGRjYTc4OCksIFdUQ1AoMHg3OTM1MmQwMSwgMHgyOTI0NmRmYSksCisgICAgV1RDUCgweDc5MWNhOGZjLCAweDI5NmM2MTRhKSwgV1RDUCgweDc5MDNlNWVlLCAweDI5YjQ4MGY5KSwKKyAgICBXVENQKDB4NzhlYWUzOGQsIDB4MjlmY2NjODcpLCBXVENQKDB4NzhkMWExOTEsIDB4MmE0NTQzNzIpLAorICAgIFdUQ1AoMHg3OGI4MWZiMSwgMHgyYThkZTUzNyksIFdUQ1AoMHg3ODllNWRhNiwgMHgyYWQ2YjE1NSksCisgICAgV1RDUCgweDc4ODQ1YjI5LCAweDJiMWZhNzQ1KSwgV1RDUCgweDc4NmExN2Y1LCAweDJiNjhjNjg0KSwKKyAgICBXVENQKDB4Nzg0ZjkzYzQsIDB4MmJiMjBlOGMpLCBXVENQKDB4NzgzNGNlNTMsIDB4MmJmYjdlZDcpLAorICAgIFdUQ1AoMHg3ODE5Yzc1YywgMHgyYzQ1MTZkYyksIFdUQ1AoMHg3N2ZlN2U5ZSwgMHgyYzhlZDYxNSksCisgICAgV1RDUCgweDc3ZTJmM2Q3LCAweDJjZDhiYmY3KSwgV1RDUCgweDc3YzcyNmM1LCAweDJkMjJjN2ZhKSwKKyAgICBXVENQKDB4NzdhYjE3MjgsIDB4MmQ2Y2Y5OTMpLCBXVENQKDB4Nzc4ZWM0YzAsIDB4MmRiNzUwMzcpLAorICAgIFdUQ1AoMHg3NzcyMmY0ZSwgMHgyZTAxY2I1OSksIFdUQ1AoMHg3NzU1NTY5NSwgMHgyZTRjNmE2ZCksCisgICAgV1RDUCgweDc3MzgzYTU4LCAweDJlOTcyY2U2KSwgV1RDUCgweDc3MWFkYTVhLCAweDJlZTIxMjM1KSwKKyAgICBXVENQKDB4NzZmZDM2NjAsIDB4MmYyZDE5Y2MpLCBXVENQKDB4NzZkZjRlMzAsIDB4MmY3ODQzMWEpLAorICAgIFdUQ1AoMHg3NmMxMjE5MCwgMHgyZmMzOGQ5MSksIFdUQ1AoMHg3NmEyYjA0NywgMHgzMDBlZjg5ZCksCisgICAgV1RDUCgweDc2ODNmYTFlLCAweDMwNWE4M2FmKSwgV1RDUCgweDc2NjRmZWRlLCAweDMwYTYyZTM0KSwKKyAgICBXVENQKDB4NzY0NWJlNTEsIDB4MzBmMWY3OTgpLCBXVENQKDB4NzYyNjM4NDIsIDB4MzEzZGRmNDkpLAorICAgIFdUQ1AoMHg3NjA2NmM3ZSwgMHgzMTg5ZTRiMSksIFdUQ1AoMHg3NWU2NWFkMSwgMHgzMWQ2MDczZCksCisgICAgV1RDUCgweDc1YzYwMzA5LCAweDMyMjI0NjU3KSwgV1RDUCgweDc1YTU2NGY2LCAweDMyNmVhMTY4KSwKKyAgICBXVENQKDB4NzU4NDgwNjcsIDB4MzJiYjE3ZGEpLCBXVENQKDB4NzU2MzU1MmQsIDB4MzMwN2E5MTcpLAorICAgIFdUQ1AoMHg3NTQxZTMxYSwgMHgzMzU0NTQ4NiksIFdUQ1AoMHg3NTIwMmEwMiwgMHgzM2ExMTk4ZSksCisgICAgV1RDUCgweDc0ZmUyOWI4LCAweDMzZWRmNzk4KSwgV1RDUCgweDc0ZGJlMjExLCAweDM0M2FlZTA5KSwKKyAgICBXVENQKDB4NzRiOTUyZTMsIDB4MzQ4N2ZjNDgpLCBXVENQKDB4NzQ5NjdjMDYsIDB4MzRkNTIxYmIpLAorICAgIFdUQ1AoMHg3NDczNWQ1MSwgMHgzNTIyNWRjNyksIFdUQ1AoMHg3NDRmZjY5ZiwgMHgzNTZmYWZjZiksCisgICAgV1RDUCgweDc0MmM0N2M5LCAweDM1YmQxNzNhKSwgV1RDUCgweDc0MDg1MGFiLCAweDM2MGE5MzY5KSwKKyAgICBXVENQKDB4NzNlNDExMjEsIDB4MzY1ODIzYzEpLCBXVENQKDB4NzNiZjg5MDksIDB4MzZhNWM3YTQpLAorICAgIFdUQ1AoMHg3MzlhYjg0MiwgMHgzNmYzN2U3NSksIFdUQ1AoMHg3Mzc1OWVhYiwgMHgzNzQxNDc5NiksCisgICAgV1RDUCgweDczNTAzYzI2LCAweDM3OGYyMjY4KSwgV1RDUCgweDczMmE5MDk1LCAweDM3ZGQwZTRjKSwKKyAgICBXVENQKDB4NzMwNDliZGEsIDB4MzgyYjBhYTQpLCBXVENQKDB4NzJkZTVkZGIsIDB4Mzg3OTE2ZDApLAorICAgIFdUQ1AoMHg3MmI3ZDY3ZCwgMHgzOGM3MzIzMCksIFdUQ1AoMHg3MjkxMDVhNiwgMHgzOTE1NWMyNCksCisgICAgV1RDUCgweDcyNjllYjNmLCAweDM5NjM5NDBjKSwgV1RDUCgweDcyNDI4NzMwLCAweDM5YjFkOTQ2KSwKKyAgICBXVENQKDB4NzIxYWQ5NjQsIDB4M2EwMDJiMzEpLCBXVENQKDB4NzFmMmUxYzUsIDB4M2E0ZTg5MmMpLAorICAgIFdUQ1AoMHg3MWNhYTA0MiwgMHgzYTljZjI5NiksIFdUQ1AoMHg3MWEyMTRjNywgMHgzYWViNjZjYyksCisgICAgV1RDUCgweDcxNzkzZjQzLCAweDNiMzllNTJjKSwgV1RDUCgweDcxNTAxZmE2LCAweDNiODg2ZDE0KSwKKyAgICBXVENQKDB4NzEyNmI1ZTMsIDB4M2JkNmZkZTEpLCBXVENQKDB4NzBmZDAxZWIsIDB4M2MyNTk2ZjEpLAorICAgIFdUQ1AoMHg3MGQzMDNiMiwgMHgzYzc0Mzc5ZiksIFdUQ1AoMHg3MGE4YmIyZSwgMHgzY2MyZGY0OSksCisgICAgV1RDUCgweDcwN2UyODU1LCAweDNkMTE4ZDRjKSwgV1RDUCgweDcwNTM0YjFlLCAweDNkNjA0MTAzKSwKKyAgICBXVENQKDB4NzAyODIzODEsIDB4M2RhZWY5Y2MpLCBXVENQKDB4NmZmY2IxN2EsIDB4M2RmZGI3MDIpLAorICAgIFdUQ1AoMHg2ZmQwZjUwNCwgMHgzZTRjNzgwMCksIFdUQ1AoMHg2ZmE0ZWUxYSwgMHgzZTliM2MyNSksCisgICAgV1RDUCgweDZmNzg5Y2JiLCAweDNlZWEwMmNhKSwgV1RDUCgweDZmNGMwMGU1LCAweDNmMzhjYjRiKSwKKyAgICBXVENQKDB4NmYxZjFhOWEsIDB4M2Y4Nzk1MDUpLCBXVENQKDB4NmVmMWU5ZGEsIDB4M2ZkNjVmNTMpLAorICAgIFdUQ1AoMHg2ZWM0NmVhOSwgMHg0MDI1Mjk5MCksIFdUQ1AoMHg2ZTk2YTkwYiwgMHg0MDczZjMxOCksCisgICAgV1RDUCgweDZlNjg5OTA1LCAweDQwYzJiYjQ2KSwgV1RDUCgweDZlM2EzZTlkLCAweDQxMTE4MTc2KSwKKyAgICBXVENQKDB4NmUwYjk5ZGQsIDB4NDE2MDQ1MDQpLCBXVENQKDB4NmRkY2FhY2MsIDB4NDFhZjA1NGEpLAorICAgIFdUQ1AoMHg2ZGFkNzE3NywgMHg0MWZkYzFhNSksIFdUQ1AoMHg2ZDdkZWRlOCwgMHg0MjRjNzk3MCksCisgICAgV1RDUCgweDZkNGUyMDJlLCAweDQyOWIyYzA2KSwgV1RDUCgweDZkMWUwODU1LCAweDQyZTlkOGM0KSwKKyAgICBXVENQKDB4NmNlZGE2NmYsIDB4NDMzODdmMDUpLCBXVENQKDB4NmNiY2ZhOGQsIDB4NDM4NzFlMjYpLAorICAgIFdUQ1AoMHg2YzhjMDRjMCwgMHg0M2Q1YjU4MSksIFdUQ1AoMHg2YzVhYzUxZCwgMHg0NDI0NDQ3NCksCisgICAgV1RDUCgweDZjMjkzYmI4LCAweDQ0NzJjYTVhKSwgV1RDUCgweDZiZjc2OGE4LCAweDQ0YzE0NjkwKSwKKyAgICBXVENQKDB4NmJjNTRjMDYsIDB4NDUwZmI4NzMpLCBXVENQKDB4NmI5MmU1ZTksIDB4NDU1ZTFmNWYpLAorICAgIFdUQ1AoMHg2YjYwMzY2YywgMHg0NWFjN2FiMiksIFdUQ1AoMHg2YjJkM2RhYiwgMHg0NWZhYzljOCksCisgICAgV1RDUCgweDZhZjlmYmMyLCAweDQ2NDkwYmZmKSwgV1RDUCgweDZhYzY3MGQxLCAweDQ2OTc0MGI1KSwKKyAgICBXVENQKDB4NmE5MjljZjYsIDB4NDZlNTY3NDcpLCBXVENQKDB4NmE1ZTgwNTMsIDB4NDczMzdmMTMpLAorICAgIFdUQ1AoMHg2YTJhMWIwYSwgMHg0NzgxODc3OSksIFdUQ1AoMHg2OWY1NmQzZSwgMHg0N2NmN2ZkNiksCisgICAgV1RDUCgweDY5YzA3NzE1LCAweDQ4MWQ2NzhhKSwgV1RDUCgweDY5OGIzOGI0LCAweDQ4NmIzZGYzKSwKKyAgICBXVENQKDB4Njk1NWIyNDMsIDB4NDhiOTAyNzIpLCBXVENQKDB4NjkxZmUzZWMsIDB4NDkwNmI0NjYpLAorICAgIFdUQ1AoMHg2OGU5Y2RkOCwgMHg0OTU0NTMzMCksIFdUQ1AoMHg2OGIzNzAzMywgMHg0OWExZGUzMCksCisgICAgV1RDUCgweDY4N2NjYjI5LCAweDQ5ZWY1NGM4KSwgV1RDUCgweDY4NDVkZWU5LCAweDRhM2NiNjU3KSwKKyAgICBXVENQKDB4NjgwZWFiYTMsIDB4NGE4YTAyNDIpLCBXVENQKDB4NjdkNzMxODcsIDB4NGFkNzM3ZTkpLAorICAgIFdUQ1AoMHg2NzlmNzBjNywgMHg0YjI0NTZhZiksIFdUQ1AoMHg2NzY3Njk5NywgMHg0YjcxNWRmNyksCisgICAgV1RDUCgweDY3MmYxYzJiLCAweDRiYmU0ZDI1KSwgV1RDUCgweDY2ZjY4OGJhLCAweDRjMGIyMzljKSwKKyAgICBXVENQKDB4NjZiZGFmN2IsIDB4NGM1N2UwYzIpLCBXVENQKDB4NjY4NDkwYTYsIDB4NGNhNDgzZmEpLAorICAgIFdUQ1AoMHg2NjRiMmM3NiwgMHg0Y2YxMGNhYyksIFdUQ1AoMHg2NjExODMyNiwgMHg0ZDNkN2EzYiksCisgICAgV1RDUCgweDY1ZDc5NGYzLCAweDRkODljYzBmKSwgV1RDUCgweDY1OWQ2MjFhLCAweDRkZDYwMThmKSwKKyAgICBXVENQKDB4NjU2MmVhZGEsIDB4NGUyMjFhMjIpLCBXVENQKDB4NjUyODJmNzQsIDB4NGU2ZTE1MzApLAorICAgIFdUQ1AoMHg2NGVkMzAyYiwgMHg0ZWI5ZjIyMiksIFdUQ1AoMHg2NGIxZWQ0MCwgMHg0ZjA1YjA2MSksCisgICAgV1RDUCgweDY0NzY2NmY4LCAweDRmNTE0ZjU3KSwgV1RDUCgweDY0M2E5ZDk5LCAweDRmOWNjZTZmKSwKKyAgICBXVENQKDB4NjNmZTkxNmEsIDB4NGZlODJkMTMpLCBXVENQKDB4NjNjMjQyYjIsIDB4NTAzMzZhYWYpLAorICAgIFdUQ1AoMHg2Mzg1YjFiYywgMHg1MDdlODZiMCksIFdUQ1AoMHg2MzQ4ZGVkMSwgMHg1MGM5ODA4MiksCisgICAgV1RDUCgweDYzMGJjYTNmLCAweDUxMTQ1NzkzKSwgV1RDUCgweDYyY2U3NDUxLCAweDUxNWYwYjUxKSwKKyAgICBXVENQKDB4NjI5MGRkNTcsIDB4NTFhOTliMmIpLCBXVENQKDB4NjI1MzA1YTAsIDB4NTFmNDA2OTIpLAorICAgIFdUQ1AoMHg2MjE0ZWQ3ZCwgMHg1MjNlNGNmNSksIFdUQ1AoMHg2MWQ2OTU0MSwgMHg1Mjg4NmRjNSksCisgICAgV1RDUCgweDYxOTdmZDNlLCAweDUyZDI2ODc1KSwgV1RDUCgweDYxNTkyNWM5LCAweDUzMWMzYzc3KSwKKyAgICBXVENQKDB4NjExYTBmMzksIDB4NTM2NWU5M2UpLCBXVENQKDB4NjBkYWI5ZTMsIDB4NTNhZjZlM2UpLAorICAgIFdUQ1AoMHg2MDliMjYyMSwgMHg1M2Y4Y2FlZCksIFdUQ1AoMHg2MDViNTQ0YywgMHg1NDQxZmVjMCksCisgICAgV1RDUCgweDYwMWI0NGJmLCAweDU0OGIwOTJlKSwgV1RDUCgweDVmZGFmN2Q1LCAweDU0ZDNlOWFlKSwKKyAgICBXVENQKDB4NWY5YTZkZWIsIDB4NTUxYzlmYjcpLCBXVENQKDB4NWY1OWE3NjEsIDB4NTU2NTJhYzMpLAorICAgIFdUQ1AoMHg1ZjE4YTQ5NCwgMHg1NWFkOGE0ZCksIFdUQ1AoMHg1ZWQ3NjVlNiwgMHg1NWY1YmRjZCksCisgICAgV1RDUCgweDVlOTVlYmI4LCAweDU2M2RjNGMxKSwgV1RDUCgweDVlNTQzNjZkLCAweDU2ODU5ZWEzKSwKKyAgICBXVENQKDB4NWUxMjQ2NmEsIDB4NTZjZDRhZjMpLCBXVENQKDB4NWRkMDFjMTMsIDB4NTcxNGM5MmQpLAorICAgIFdUQ1AoMHg1ZDhkYjdjZiwgMHg1NzVjMThkMCksIFdUQ1AoMHg1ZDRiMWEwNSwgMHg1N2EzMzk1ZSksCisgICAgV1RDUCgweDVkMDg0MzFlLCAweDU3ZWEyYTU2KSwgV1RDUCgweDVjYzUzMzg0LCAweDU4MzBlYjNhKSwKKyAgICBXVENQKDB4NWM4MWViYTAsIDB4NTg3NzdiOGUpLCBXVENQKDB4NWMzZTZiZGYsIDB4NThiZGRhZDUpLAorICAgIFdUQ1AoMHg1YmZhYjRhZiwgMHg1OTA0MDg5MyksIFdUQ1AoMHg1YmI2YzY3YywgMHg1OTRhMDQ0ZiksCisgICAgV1RDUCgweDViNzJhMWI2LCAweDU5OGZjZDhlKSwgV1RDUCgweDViMmU0NmNlLCAweDU5ZDU2M2Q5KSwKKyAgICBXVENQKDB4NWFlOWI2MzQsIDB4NWExYWM2YjgpLCBXVENQKDB4NWFhNGYwNWEsIDB4NWE1ZmY1YjUpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfV1RQIEtCRFdpbmRvdzEwMjRbXSA9IHsKKyAgICBXVENQKDB4N2ZmZmZmYTQsIDB4MDAwOTk2MmYpLCBXVENQKDB4N2ZmZmZmMzksIDB4MDAwZTE2ZmIpLAorICAgIFdUQ1AoMHg3ZmZmZmViZiwgMHgwMDExZWE2NSksIFdUQ1AoMHg3ZmZmZmUzNCwgMHgwMDE1NzUwZSksCisgICAgV1RDUCgweDdmZmZmZDk2LCAweDAwMThkYzc0KSwgV1RDUCgweDdmZmZmY2U1LCAweDAwMWMzMzJlKSwKKyAgICBXVENQKDB4N2ZmZmZjMWYsIDB4MDAxZjgzZjUpLCBXVENQKDB4N2ZmZmZiNDMsIDB4MDAyMmQ1OWEpLAorICAgIFdUQ1AoMHg3ZmZmZmE0ZiwgMHgwMDI2MmNjMiksIFdUQ1AoMHg3ZmZmZjk0MiwgMHgwMDI5OGNjNCksCisgICAgV1RDUCgweDdmZmZmODFhLCAweDAwMmNmODFmKSwgV1RDUCgweDdmZmZmNmQ2LCAweDAwMzA3MGM0KSwKKyAgICBXVENQKDB4N2ZmZmY1NzMsIDB4MDAzM2Y4NDApLCBXVENQKDB4N2ZmZmYzZjEsIDB4MDAzNzhmZDkpLAorICAgIFdUQ1AoMHg3ZmZmZjI0ZCwgMHgwMDNiMzhhMSksIFdUQ1AoMHg3ZmZmZjA4NSwgMHgwMDNlZjM4MSksCisgICAgV1RDUCgweDdmZmZlZTk4LCAweDAwNDJjMTQ3KSwgV1RDUCgweDdmZmZlYzgzLCAweDAwNDZhMmE4KSwKKyAgICBXVENQKDB4N2ZmZmVhNDQsIDB4MDA0YTk4NDcpLCBXVENQKDB4N2ZmZmU3ZDgsIDB4MDA0ZWEyYjcpLAorICAgIFdUQ1AoMHg3ZmZmZTUzZiwgMHgwMDUyYzI4MyksIFdUQ1AoMHg3ZmZmZTI3NCwgMHgwMDU2ZjgyOSksCisgICAgV1RDUCgweDdmZmZkZjc2LCAweDAwNWI0NDIyKSwgV1RDUCgweDdmZmZkYzQzLCAweDAwNWZhNmRkKSwKKyAgICBXVENQKDB4N2ZmZmQ4ZDYsIDB4MDA2NDIwYzgpLCBXVENQKDB4N2ZmZmQ1MmYsIDB4MDA2OGIyNDkpLAorICAgIFdUQ1AoMHg3ZmZmZDE0OSwgMHgwMDZkNWJjNCksIFdUQ1AoMHg3ZmZmY2QyMiwgMHgwMDcyMWQ5YSksCisgICAgV1RDUCgweDdmZmZjOGI2LCAweDAwNzZmODI4KSwgV1RDUCgweDdmZmZjNDA0LCAweDAwN2JlYmNhKSwKKyAgICBXVENQKDB4N2ZmZmJmMDYsIDB4MDA4MGY4ZDkpLCBXVENQKDB4N2ZmZmI5YmIsIDB4MDA4NjFmYWUpLAorICAgIFdUQ1AoMHg3ZmZmYjQxZSwgMHgwMDhiNjA5ZSksIFdUQ1AoMHg3ZmZmYWUyYywgMHgwMDkwYmJmZiksCisgICAgV1RDUCgweDdmZmZhN2UxLCAweDAwOTYzMjI0KSwgV1RDUCgweDdmZmZhMTNhLCAweDAwOWJjMzYyKSwKKyAgICBXVENQKDB4N2ZmZjlhMzIsIDB4MDBhMTcwMDkpLCBXVENQKDB4N2ZmZjkyYzUsIDB4MDBhNzM4NmMpLAorICAgIFdUQ1AoMHg3ZmZmOGFmMCwgMHgwMGFkMWNkYyksIFdUQ1AoMHg3ZmZmODJhZCwgMHgwMGIzMWRhOCksCisgICAgV1RDUCgweDdmZmY3OWY5LCAweDAwYjkzYjIxKSwgV1RDUCgweDdmZmY3MGNmLCAweDAwYmY3NTk2KSwKKyAgICBXVENQKDB4N2ZmZjY3MmEsIDB4MDBjNWNkNTcpLCBXVENQKDB4N2ZmZjVkMDUsIDB4MDBjYzQyYjEpLAorICAgIFdUQ1AoMHg3ZmZmNTI1YywgMHgwMGQyZDVmMyksIFdUQ1AoMHg3ZmZmNDcyOSwgMHgwMGQ5ODc2YyksCisgICAgV1RDUCgweDdmZmYzYjY2LCAweDAwZTA1NzY5KSwgV1RDUCgweDdmZmYyZjEwLCAweDAwZTc0NjM4KSwKKyAgICBXVENQKDB4N2ZmZjIyMWYsIDB4MDBlZTU0MjYpLCBXVENQKDB4N2ZmZjE0OGUsIDB4MDBmNTgxODIpLAorICAgIFdUQ1AoMHg3ZmZmMDY1OCwgMHgwMGZjY2U5NyksIFdUQ1AoMHg3ZmZlZjc3NiwgMHgwMTA0M2JiMyksCisgICAgV1RDUCgweDdmZmVlN2UyLCAweDAxMGJjOTIzKSwgV1RDUCgweDdmZmVkNzk1LCAweDAxMTM3NzMzKSwKKyAgICBXVENQKDB4N2ZmZWM2OGEsIDB4MDExYjQ2MzEpLCBXVENQKDB4N2ZmZWI0YmEsIDB4MDEyMzM2NjkpLAorICAgIFdUQ1AoMHg3ZmZlYTIxZCwgMHgwMTJiNDgyNyksIFdUQ1AoMHg3ZmZlOGVhYywgMHgwMTMzN2JiOCksCisgICAgV1RDUCgweDdmZmU3YTYxLCAweDAxM2JkMTY3KSwgV1RDUCgweDdmZmU2NTMzLCAweDAxNDQ0OTgyKSwKKyAgICBXVENQKDB4N2ZmZTRmMWMsIDB4MDE0Y2U0NTQpLCBXVENQKDB4N2ZmZTM4MTMsIDB4MDE1NWEyMjkpLAorICAgIFdUQ1AoMHg3ZmZlMjAxMSwgMHgwMTVlODM0ZCksIFdUQ1AoMHg3ZmZlMDcwZCwgMHgwMTY3ODgwYyksCisgICAgV1RDUCgweDdmZmRlY2ZmLCAweDAxNzBiMGIyKSwgV1RDUCgweDdmZmRkMWRmLCAweDAxNzlmZDhiKSwKKyAgICBXVENQKDB4N2ZmZGI1YTIsIDB4MDE4MzZlZTEpLCBXVENQKDB4N2ZmZDk4NDIsIDB4MDE4ZDA1MDApLAorICAgIFdUQ1AoMHg3ZmZkNzliMywgMHgwMTk2YzAzNSksIFdUQ1AoMHg3ZmZkNTllZSwgMHgwMWEwYTBjYSksCisgICAgV1RDUCgweDdmZmQzOGU4LCAweDAxYWFhNzBhKSwgV1RDUCgweDdmZmQxNjk3LCAweDAxYjRkMzQxKSwKKyAgICBXVENQKDB4N2ZmY2YyZjIsIDB4MDFiZjI1YjkpLCBXVENQKDB4N2ZmY2NkZWUsIDB4MDFjOTllYmQpLAorICAgIFdUQ1AoMHg3ZmZjYTc4MCwgMHgwMWQ0M2U5OSksIFdUQ1AoMHg3ZmZjN2Y5ZSwgMHgwMWRmMDU5NyksCisgICAgV1RDUCgweDdmZmM1NjNkLCAweDAxZTlmNDAxKSwgV1RDUCgweDdmZmMyYjUxLCAweDAxZjUwYTIyKSwKKyAgICBXVENQKDB4N2ZmYmZlY2YsIDB4MDIwMDQ4NDQpLCBXVENQKDB4N2ZmYmQwYWIsIDB4MDIwYmFlYjEpLAorICAgIFdUQ1AoMHg3ZmZiYTBkYSwgMHgwMjE3M2RiNCksIFdUQ1AoMHg3ZmZiNmY0ZiwgMHgwMjIyZjU5NiksCisgICAgV1RDUCgweDdmZmIzYmZkLCAweDAyMmVkNmExKSwgV1RDUCgweDdmZmIwNmQ4LCAweDAyM2FlMTFmKSwKKyAgICBXVENQKDB4N2ZmYWNmZDMsIDB4MDI0NzE1NTgpLCBXVENQKDB4N2ZmYTk2ZTAsIDB4MDI1MzczOTcpLAorICAgIFdUQ1AoMHg3ZmZhNWJmMiwgMHgwMjVmZmMyNSksIFdUQ1AoMHg3ZmZhMWVmYywgMHgwMjZjYWY0YSksCisgICAgV1RDUCgweDdmZjlkZmVlLCAweDAyNzk4ZDRmKSwgV1RDUCgweDdmZjk5ZWJiLCAweDAyODY5NjdjKSwKKyAgICBXVENQKDB4N2ZmOTViNTUsIDB4MDI5M2NiMWIpLCBXVENQKDB4N2ZmOTE1YWIsIDB4MDJhMTJiNzIpLAorICAgIFdUQ1AoMHg3ZmY4Y2RhZiwgMHgwMmFlYjdjYiksIFdUQ1AoMHg3ZmY4ODM1MSwgMHgwMmJjNzA2ZCksCisgICAgV1RDUCgweDdmZjgzNjgyLCAweDAyY2E1NTlmKSwgV1RDUCgweDdmZjdlNzMxLCAweDAyZDg2N2E5KSwKKyAgICBXVENQKDB4N2ZmNzk1NGUsIDB4MDJlNmE2ZDIpLCBXVENQKDB4N2ZmNzQwYzgsIDB4MDJmNTEzNjEpLAorICAgIFdUQ1AoMHg3ZmY2ZTk4ZSwgMHgwMzAzYWQ5YyksIFdUQ1AoMHg3ZmY2OGY4ZiwgMHgwMzEyNzVjYSksCisgICAgV1RDUCgweDdmZjYzMmJhLCAweDAzMjE2YzMwKSwgV1RDUCgweDdmZjVkMmZiLCAweDAzMzA5MTE2KSwKKyAgICBXVENQKDB4N2ZmNTcwNDIsIDB4MDMzZmU0YmYpLCBXVENQKDB4N2ZmNTBhN2EsIDB4MDM0ZjY3NzMpLAorICAgIFdUQ1AoMHg3ZmY0YTE5MiwgMHgwMzVmMTk3NSksIFdUQ1AoMHg3ZmY0MzU3NiwgMHgwMzZlZmIwYSksCisgICAgV1RDUCgweDdmZjNjNjEyLCAweDAzN2YwYzc4KSwgV1RDUCgweDdmZjM1MzUzLCAweDAzOGY0ZTAyKSwKKyAgICBXVENQKDB4N2ZmMmRkMjQsIDB4MDM5ZmJmZWIpLCBXVENQKDB4N2ZmMjYzNzAsIDB4MDNiMDYyNzkpLAorICAgIFdUQ1AoMHg3ZmYxZTYyMywgMHgwM2MxMzVlZCksIFdUQ1AoMHg3ZmYxNjUyNywgMHgwM2QyM2E4YiksCisgICAgV1RDUCgweDdmZjBlMDY3LCAweDAzZTM3MDk1KSwgV1RDUCgweDdmZjA1N2NjLCAweDAzZjRkODRlKSwKKyAgICBXVENQKDB4N2ZlZmNiNDAsIDB4MDQwNjcxZjcpLCBXVENQKDB4N2ZlZjNhYWQsIDB4MDQxODNkZDMpLAorICAgIFdUQ1AoMHg3ZmVlYTVmYSwgMHgwNDJhM2MyMiksIFdUQ1AoMHg3ZmVlMGQxMSwgMHgwNDNjNmQyNSksCisgICAgV1RDUCgweDdmZWQ2ZmRhLCAweDA0NGVkMTFkKSwgV1RDUCgweDdmZWNjZTNkLCAweDA0NjE2ODQ5KSwKKyAgICBXVENQKDB4N2ZlYzI4MjEsIDB4MDQ3NDMyZWIpLCBXVENQKDB4N2ZlYjdkNmMsIDB4MDQ4NzMxNDApLAorICAgIFdUQ1AoMHg3ZmVhY2UwNywgMHgwNDlhNjM4OCksIFdUQ1AoMHg3ZmVhMTlkNiwgMHgwNGFkY2EwMSksCisgICAgV1RDUCgweDdmZTk2MGMwLCAweDA0YzE2NGVhKSwgV1RDUCgweDdmZThhMmFhLCAweDA0ZDUzNDgxKSwKKyAgICBXVENQKDB4N2ZlN2RmNzksIDB4MDRlOTM5MDIpLCBXVENQKDB4N2ZlNzE3MTIsIDB4MDRmZDcyYWEpLAorICAgIFdUQ1AoMHg3ZmU2NDk1YSwgMHgwNTExZTFiNiksIFdUQ1AoMHg3ZmU1NzYzNCwgMHgwNTI2ODY2MyksCisgICAgV1RDUCgweDdmZTQ5ZDgzLCAweDA1M2I2MGViKSwgV1RDUCgweDdmZTNiZjJiLCAweDA1NTA3MTg5KSwKKyAgICBXVENQKDB4N2ZlMmRiMGYsIDB4MDU2NWI4NzkpLCBXVENQKDB4N2ZlMWYxMTAsIDB4MDU3YjM1ZjQpLAorICAgIFdUQ1AoMHg3ZmUxMDExMSwgMHgwNTkwZWEzNSksIFdUQ1AoMHg3ZmUwMGFmMywgMHgwNWE2ZDU3NCksCisgICAgV1RDUCgweDdmZGYwZTk3LCAweDA1YmNmN2VhKSwgV1RDUCgweDdmZGUwYmRkLCAweDA1ZDM1MWNmKSwKKyAgICBXVENQKDB4N2ZkZDAyYTYsIDB4MDVlOWUzNWMpLCBXVENQKDB4N2ZkYmYyZDIsIDB4MDYwMGFjYzgpLAorICAgIFdUQ1AoMHg3ZmRhZGM0MCwgMHgwNjE3YWU0OCksIFdUQ1AoMHg3ZmQ5YmVjZiwgMHgwNjJlZTgxNCksCisgICAgV1RDUCgweDdmZDg5YTVlLCAweDA2NDY1YTYyKSwgV1RDUCgweDdmZDc2ZWNhLCAweDA2NWUwNTY1KSwKKyAgICBXVENQKDB4N2ZkNjNiZjEsIDB4MDY3NWU5NTQpLCBXVENQKDB4N2ZkNTAxYjAsIDB4MDY4ZTA2NjIpLAorICAgIFdUQ1AoMHg3ZmQzYmZlNCwgMHgwNmE2NWNjMyksIFdUQ1AoMHg3ZmQyNzY2YSwgMHgwNmJlZWNhYSksCisgICAgV1RDUCgweDdmZDEyNTFlLCAweDA2ZDdiNjQ4KSwgV1RDUCgweDdmY2ZjYmRhLCAweDA2ZjBiOWQxKSwKKyAgICBXVENQKDB4N2ZjZTZhN2EsIDB4MDcwOWY3NzUpLCBXVENQKDB4N2ZjZDAwZDgsIDB4MDcyMzZmNjUpLAorICAgIFdUQ1AoMHg3ZmNiOGVjZiwgMHgwNzNkMjFkMiksIFdUQ1AoMHg3ZmNhMTQzOSwgMHgwNzU3MGVlYSksCisgICAgV1RDUCgweDdmYzg5MGVkLCAweDA3NzEzNmRkKSwgV1RDUCgweDdmYzcwNGM3LCAweDA3OGI5OWRhKSwKKyAgICBXVENQKDB4N2ZjNTZmOWQsIDB4MDdhNjM4MGQpLCBXVENQKDB4N2ZjM2QxNDcsIDB4MDdjMTExYTQpLAorICAgIFdUQ1AoMHg3ZmMyMjk5ZSwgMHgwN2RjMjZjYyksIFdUQ1AoMHg3ZmMwNzg3OCwgMHgwN2Y3NzdiMSksCisgICAgV1RDUCgweDdmYmViZGFjLCAweDA4MTMwNDdkKSwgV1RDUCgweDdmYmNmOTBmLCAweDA4MmVjZDViKSwKKyAgICBXVENQKDB4N2ZiYjJhNzgsIDB4MDg0YWQyNzYpLCBXVENQKDB4N2ZiOTUxYmMsIDB4MDg2NzEzZjcpLAorICAgIFdUQ1AoMHg3ZmI3NmVhZiwgMHgwODgzOTIwNiksIFdUQ1AoMHg3ZmI1ODEyNiwgMHgwOGEwNGNjYiksCisgICAgV1RDUCgweDdmYjM4OGY0LCAweDA4YmQ0NDZlKSwgV1RDUCgweDdmYjE4NWVlLCAweDA4ZGE3OTE1KSwKKyAgICBXVENQKDB4N2ZhZjc3ZTUsIDB4MDhmN2VhZTcpLCBXVENQKDB4N2ZhZDVlYWQsIDB4MDkxNTlhMDkpLAorICAgIFdUQ1AoMHg3ZmFiM2ExNywgMHgwOTMzODY5ZiksIFdUQ1AoMHg3ZmE5MDlmNiwgMHgwOTUxYjBjZCksCisgICAgV1RDUCgweDdmYTZjZTFhLCAweDA5NzAxOGI3KSwgV1RDUCgweDdmYTQ4NjUzLCAweDA5OGViZTdmKSwKKyAgICBXVENQKDB4N2ZhMjMyNzMsIDB4MDlhZGEyNDgpLCBXVENQKDB4N2Y5ZmQyNDksIDB4MDljY2M0MzEpLAorICAgIFdUQ1AoMHg3ZjlkNjVhNCwgMHgwOWVjMjQ1YiksIFdUQ1AoMHg3ZjlhZWM1MywgMHgwYTBiYzJlNyksCisgICAgV1RDUCgweDdmOTg2NjI1LCAweDBhMmI5ZmYzKSwgV1RDUCgweDdmOTVkMmU3LCAweDBhNGJiYjllKSwKKyAgICBXVENQKDB4N2Y5MzMyNjcsIDB4MGE2YzE2MDQpLCBXVENQKDB4N2Y5MDg0NzIsIDB4MGE4Y2FmNDMpLAorICAgIFdUQ1AoMHg3ZjhkYzhkNSwgMHgwYWFkODc3NiksIFdUQ1AoMHg3ZjhhZmY1YywgMHgwYWNlOWViOSksCisgICAgV1RDUCgweDdmODgyN2QzLCAweDBhZWZmNTI2KSwgV1RDUCgweDdmODU0MjA0LCAweDBiMTE4YWQ4KSwKKyAgICBXVENQKDB4N2Y4MjRkYmIsIDB4MGIzMzVmZTYpLCBXVENQKDB4N2Y3ZjRhYzMsIDB4MGI1NTc0NjkpLAorICAgIFdUQ1AoMHg3ZjdjMzhlNCwgMHgwYjc3Yzg3OSksIFdUQ1AoMHg3Zjc5MTdlOSwgMHgwYjlhNWMyYiksCisgICAgV1RDUCgweDdmNzVlNzliLCAweDBiYmQyZjk3KSwgV1RDUCgweDdmNzJhN2MzLCAweDBiZTA0MmQwKSwKKyAgICBXVENQKDB4N2Y2ZjU4MjgsIDB4MGMwMzk1ZWMpLCBXVENQKDB4N2Y2YmY4OTIsIDB4MGMyNzI4ZmQpLAorICAgIFdUQ1AoMHg3ZjY4ODhjOSwgMHgwYzRhZmMxNiksIFdUQ1AoMHg3ZjY1MDg5NCwgMHgwYzZmMGY0YSksCisgICAgV1RDUCgweDdmNjE3N2I5LCAweDBjOTM2MmE4KSwgV1RDUCgweDdmNWRkNWZmLCAweDBjYjdmNjQyKSwKKyAgICBXVENQKDB4N2Y1YTIzMmEsIDB4MGNkY2NhMjYpLCBXVENQKDB4N2Y1NjVmMDAsIDB4MGQwMWRlNjMpLAorICAgIFdUQ1AoMHg3ZjUyODk0NywgMHgwZDI3MzMwNyksIFdUQ1AoMHg3ZjRlYTFjMiwgMHgwZDRjYzgxZiksCisgICAgV1RDUCgweDdmNGFhODM1LCAweDBkNzI5ZGI3KSwgV1RDUCgweDdmNDY5YzY1LCAweDBkOThiM2RhKSwKKyAgICBXVENQKDB4N2Y0MjdlMTMsIDB4MGRiZjBhOTIpLCBXVENQKDB4N2YzZTRkMDQsIDB4MGRlNWExZTkpLAorICAgIFdUQ1AoMHg3ZjNhMDhmOSwgMHgwZTBjNzllNyksIFdUQ1AoMHg3ZjM1YjFiNCwgMHgwZTMzOTI5NSksCisgICAgV1RDUCgweDdmMzE0NmY4LCAweDBlNWFlYmZhKSwgV1RDUCgweDdmMmNjODg0LCAweDBlODI4NjFhKSwKKyAgICBXVENQKDB4N2YyODM2MWIsIDB4MGVhYTYwZmQpLCBXVENQKDB4N2YyMzhmN2MsIDB4MGVkMjdjYTUpLAorICAgIFdUQ1AoMHg3ZjFlZDQ2NywgMHgwZWZhZDkxNyksIFdUQ1AoMHg3ZjFhMDQ5ZCwgMHgwZjIzNzY1NiksCisgICAgV1RDUCgweDdmMTUxZmRjLCAweDBmNGM1NDYyKSwgV1RDUCgweDdmMTAyNWUzLCAweDBmNzU3MzNkKSwKKyAgICBXVENQKDB4N2YwYjE2NzIsIDB4MGY5ZWQyZTYpLCBXVENQKDB4N2YwNWYxNDYsIDB4MGZjODczNWUpLAorICAgIFdUQ1AoMHg3ZjAwYjYxZCwgMHgwZmYyNTRhMSksIFdUQ1AoMHg3ZWZiNjRiNCwgMHgxMDFjNzZhZSksCisgICAgV1RDUCgweDdlZjVmY2NhLCAweDEwNDZkOTgxKSwgV1RDUCgweDdlZjA3ZTE5LCAweDEwNzE3ZDE1KSwKKyAgICBXVENQKDB4N2VlYWU4NjAsIDB4MTA5YzYxNjUpLCBXVENQKDB4N2VlNTNiNWIsIDB4MTBjNzg2NmEpLAorICAgIFdUQ1AoMHg3ZWRmNzZjNCwgMHgxMGYyZWMxZSksIFdUQ1AoMHg3ZWQ5OWE1OCwgMHgxMTFlOTI3OSksCisgICAgV1RDUCgweDdlZDNhNWQxLCAweDExNGE3OTcxKSwgV1RDUCgweDdlY2Q5OGViLCAweDExNzZhMGZjKSwKKyAgICBXVENQKDB4N2VjNzczNjAsIDB4MTFhMzA5MTApLCBXVENQKDB4N2VjMTM0ZWIsIDB4MTFjZmIxYTEpLAorICAgIFdUQ1AoMHg3ZWJhZGQ0NCwgMHgxMWZjOWFhMiksIFdUQ1AoMHg3ZWI0NmMyNywgMHgxMjI5YzQwNiksCisgICAgV1RDUCgweDdlYWRlMTRjLCAweDEyNTcyZGJmKSwgV1RDUCgweDdlYTczYzZjLCAweDEyODRkN2JjKSwKKyAgICBXVENQKDB4N2VhMDdkNDEsIDB4MTJiMmMxZWQpLCBXVENQKDB4N2U5OWEzODIsIDB4MTJlMGVjNDIpLAorICAgIFdUQ1AoMHg3ZTkyYWVlNywgMHgxMzBmNTZhOCksIFdUQ1AoMHg3ZThiOWYyYSwgMHgxMzNlMDEwYiksCisgICAgV1RDUCgweDdlODQ3NDAyLCAweDEzNmNlYjU5KSwgV1RDUCgweDdlN2QyZDI1LCAweDEzOWMxNTdiKSwKKyAgICBXVENQKDB4N2U3NWNhNGMsIDB4MTNjYjdmNWQpLCBXVENQKDB4N2U2ZTRiMmQsIDB4MTNmYjI4ZTYpLAorICAgIFdUQ1AoMHg3ZTY2YWY3ZiwgMHgxNDJiMTIwMCksIFdUQ1AoMHg3ZTVlZjZmOCwgMHgxNDViM2E5MiksCisgICAgV1RDUCgweDdlNTcyMTUwLCAweDE0OGJhMjgxKSwgV1RDUCgweDdlNGYyZTNiLCAweDE0YmM0OWI0KSwKKyAgICBXVENQKDB4N2U0NzFkNzAsIDB4MTRlZDMwMGYpLCBXVENQKDB4N2UzZWVlYTUsIDB4MTUxZTU1NzUpLAorICAgIFdUQ1AoMHg3ZTM2YTE4ZSwgMHgxNTRmYjljOSksIFdUQ1AoMHg3ZTJlMzVlMiwgMHgxNTgxNWNlZCksCisgICAgV1RDUCgweDdlMjVhYjU2LCAweDE1YjMzZWMxKSwgV1RDUCgweDdlMWQwMTllLCAweDE1ZTU1ZjI1KSwKKyAgICBXVENQKDB4N2UxNDM4NmUsIDB4MTYxN2JkZjkpLCBXVENQKDB4N2UwYjRmN2QsIDB4MTY0YTViMTkpLAorICAgIFdUQ1AoMHg3ZTAyNDY3ZSwgMHgxNjdkMzY2MiksIFdUQ1AoMHg3ZGY5MWQyNSwgMHgxNmIwNGZiMiksCisgICAgV1RDUCgweDdkZWZkMzI3LCAweDE2ZTNhNmUyKSwgV1RDUCgweDdkZTY2ODM3LCAweDE3MTczYmNlKSwKKyAgICBXVENQKDB4N2RkY2RjMGEsIDB4MTc0YjBlNGQpLCBXVENQKDB4N2RkMzJlNTMsIDB4MTc3ZjFlMzkpLAorICAgIFdUQ1AoMHg3ZGM5NWVjNiwgMHgxN2IzNmI2OSksIFdUQ1AoMHg3ZGJmNmQxNywgMHgxN2U3ZjViMyksCisgICAgV1RDUCgweDdkYjU1OGY5LCAweDE4MWNiY2VjKSwgV1RDUCgweDdkYWIyMjFmLCAweDE4NTFjMGU5KSwKKyAgICBXVENQKDB4N2RhMGM4M2MsIDB4MTg4NzAxN2QpLCBXVENQKDB4N2Q5NjRiMDUsIDB4MThiYzdlN2MpLAorICAgIFdUQ1AoMHg3ZDhiYWEyYiwgMHgxOGYyMzdiNiksIFdUQ1AoMHg3ZDgwZTU2MywgMHgxOTI4MmNmZCksCisgICAgV1RDUCgweDdkNzVmYzVlLCAweDE5NWU1ZTIwKSwgV1RDUCgweDdkNmFlZWQwLCAweDE5OTRjYWVlKSwKKyAgICBXVENQKDB4N2Q1ZmJjNmQsIDB4MTljYjczMzUpLCBXVENQKDB4N2Q1NDY0ZTYsIDB4MWEwMjU2YzIpLAorICAgIFdUQ1AoMHg3ZDQ4ZTdlZiwgMHgxYTM5NzU2MSksIFdUQ1AoMHg3ZDNkNDUzYiwgMHgxYTcwY2VkZSksCisgICAgV1RDUCgweDdkMzE3YzdjLCAweDFhYTg2MzAxKSwgV1RDUCgweDdkMjU4ZDY1LCAweDFhZTAzMTk1KSwKKyAgICBXVENQKDB4N2QxOTc3YWEsIDB4MWIxODNhNjMpLCBXVENQKDB4N2QwZDNhZmMsIDB4MWI1MDdkMzApLAorICAgIFdUQ1AoMHg3ZDAwZDcxMCwgMHgxYjg4ZjljNSksIFdUQ1AoMHg3Y2Y0NGI5NywgMHgxYmMxYWZlNiksCisgICAgV1RDUCgweDdjZTc5ODQ2LCAweDFiZmE5ZjU4KSwgV1RDUCgweDdjZGFiY2NlLCAweDFjMzNjN2UwKSwKKyAgICBXVENQKDB4N2NjZGI4ZTQsIDB4MWM2ZDI5M2YpLCBXVENQKDB4N2NjMDhjMzksIDB4MWNhNmMzMzcpLAorICAgIFdUQ1AoMHg3Y2IzMzY4MiwgMHgxY2UwOTU4YSksIFdUQ1AoMHg3Y2E1Yjc3MiwgMHgxZDFhOWZmOCksCisgICAgV1RDUCgweDdjOTgwZWJkLCAweDFkNTRlMjQwKSwgV1RDUCgweDdjOGEzYzE0LCAweDFkOGY1YzIxKSwKKyAgICBXVENQKDB4N2M3YzNmMmUsIDB4MWRjYTBkNTYpLCBXVENQKDB4N2M2ZTE3YmMsIDB4MWUwNGY1OWYpLAorICAgIFdUQ1AoMHg3YzVmYzU3MywgMHgxZTQwMTRiNCksIFdUQ1AoMHg3YzUxNDgwNywgMHgxZTdiNmE1MyksCisgICAgV1RDUCgweDdjNDI5ZjJjLCAweDFlYjZmNjMzKSwgV1RDUCgweDdjMzNjYTk2LCAweDFlZjJiODBmKSwKKyAgICBXVENQKDB4N2MyNGM5ZmEsIDB4MWYyZWFmOWUpLCBXVENQKDB4N2MxNTlkMGQsIDB4MWY2YWRjOTgpLAorICAgIFdUQ1AoMHg3YzA2NDM4MywgMHgxZmE3M2ViMiksIFdUQ1AoMHg3YmY2YmQxMSwgMHgxZmUzZDVhMyksCisgICAgV1RDUCgweDdiZTcwOTZjLCAweDIwMjBhMTFlKSwgV1RDUCgweDdiZDcyODRhLCAweDIwNWRhMGQ4KSwKKyAgICBXVENQKDB4N2JjNzE5NjAsIDB4MjA5YWQ0ODMpLCBXVENQKDB4N2JiNmRjNjUsIDB4MjBkODNiZDEpLAorICAgIFdUQ1AoMHg3YmE2NzEwZCwgMHgyMTE1ZDY3NCksIFdUQ1AoMHg3Yjk1ZDcxMCwgMHgyMTUzYTQxYiksCisgICAgV1RDUCgweDdiODUwZTI0LCAweDIxOTFhNDc2KSwgV1RDUCgweDdiNzQxNWZmLCAweDIxY2ZkNzM0KSwKKyAgICBXVENQKDB4N2I2MmVlNTksIDB4MjIwZTNjMDIpLCBXVENQKDB4N2I1MTk2ZTksIDB4MjI0Y2QyOGQpLAorICAgIFdUQ1AoMHg3YjQwMGY2NywgMHgyMjhiOWE4MiksIFdUQ1AoMHg3YjJlNTc4YSwgMHgyMmNhOTM4YSksCisgICAgV1RDUCgweDdiMWM2ZjBiLCAweDIzMDliZDUyKSwgV1RDUCgweDdiMGE1NWExLCAweDIzNDkxNzgzKSwKKyAgICBXVENQKDB4N2FmODBiMDcsIDB4MjM4OGExYzQpLCBXVENQKDB4N2FlNThlZjUsIDB4MjNjODViYmYpLAorICAgIFdUQ1AoMHg3YWQyZTEyNCwgMHgyNDA4NDUxYSksIFdUQ1AoMHg3YWMwMDE0ZSwgMHgyNDQ4NWQ3YyksCisgICAgV1RDUCgweDdhYWNlZjJlLCAweDI0ODhhNDhhKSwgV1RDUCgweDdhOTlhYTdlLCAweDI0YzkxOWU5KSwKKyAgICBXVENQKDB4N2E4NjMyZjgsIDB4MjUwOWJkM2QpLCBXVENQKDB4N2E3Mjg4NTgsIDB4MjU0YThlMjkpLAorICAgIFdUQ1AoMHg3YTVlYWE1YSwgMHgyNThiOGM1MCksIFdUQ1AoMHg3YTRhOThiOSwgMHgyNWNjYjc1MyksCisgICAgV1RDUCgweDdhMzY1MzMzLCAweDI2MGUwZWQzKSwgV1RDUCgweDdhMjFkOTgzLCAweDI2NGY5MjcxKSwKKyAgICBXVENQKDB4N2EwZDJiNjgsIDB4MjY5MTQxY2IpLCBXVENQKDB4NzlmODQ4OWUsIDB4MjZkMzFjODApLAorICAgIFdUQ1AoMHg3OWUzMzBlNCwgMHgyNzE1MjIyZiksIFdUQ1AoMHg3OWNkZTNmOCwgMHgyNzU3NTI3MyksCisgICAgV1RDUCgweDc5Yjg2MTlhLCAweDI3OTlhY2VhKSwgV1RDUCgweDc5YTJhOTg5LCAweDI3ZGMzMTMwKSwKKyAgICBXVENQKDB4Nzk4Y2JiODUsIDB4MjgxZWRlZGYpLCBXVENQKDB4Nzk3Njk3NGUsIDB4Mjg2MWI1OTEpLAorICAgIFdUQ1AoMHg3OTYwM2NhNSwgMHgyOGE0YjRlMCksIFdUQ1AoMHg3OTQ5YWI0YywgMHgyOGU3ZGM2NSksCisgICAgV1RDUCgweDc5MzJlMzA0LCAweDI5MmIyYmI4KSwgV1RDUCgweDc5MWJlMzkwLCAweDI5NmVhMjcwKSwKKyAgICBXVENQKDB4NzkwNGFjYjMsIDB4MjliMjQwMjQpLCBXVENQKDB4NzhlZDNlMzAsIDB4MjlmNjA0NmIpLAorICAgIFdUQ1AoMHg3OGQ1OTdjYywgMHgyYTM5ZWVkOCksIFdUQ1AoMHg3OGJkYjk0YSwgMHgyYTdkZmYwMiksCisgICAgV1RDUCgweDc4YTVhMjcwLCAweDJhYzIzNDdjKSwgV1RDUCgweDc4OGQ1MzA0LCAweDJiMDY4ZWRhKSwKKyAgICBXVENQKDB4Nzg3NGNhY2IsIDB4MmI0YjBkYWUpLCBXVENQKDB4Nzg1YzA5OGQsIDB4MmI4ZmIwOGEpLAorICAgIFdUQ1AoMHg3ODQzMGYxMSwgMHgyYmQ0NzcwMCksIFdUQ1AoMHg3ODI5ZGIxZiwgMHgyYzE5NjBhMSksCisgICAgV1RDUCgweDc4MTA2ZDdmLCAweDJjNWU2Y2ZkKSwgV1RDUCgweDc3ZjZjNWZiLCAweDJjYTM5YmEzKSwKKyAgICBXVENQKDB4NzdkY2U0NWMsIDB4MmNlOGVjMjMpLCBXVENQKDB4NzdjMmM4NmUsIDB4MmQyZTVlMGIpLAorICAgIFdUQ1AoMHg3N2E4NzFmYSwgMHgyZDczZjBlOCksIFdUQ1AoMHg3NzhkZTBjZCwgMHgyZGI5YTQ0OSksCisgICAgV1RDUCgweDc3NzMxNGIyLCAweDJkZmY3N2I4KSwgV1RDUCgweDc3NTgwZDc4LCAweDJlNDU2YWM0KSwKKyAgICBXVENQKDB4NzczY2NhZWIsIDB4MmU4YjdjZjYpLCBXVENQKDB4NzcyMTRjZGIsIDB4MmVkMWFkZGIpLAorICAgIFdUQ1AoMHg3NzA1OTMxNSwgMHgyZjE3ZmNmYiksIFdUQ1AoMHg3NmU5OWQ2OSwgMHgyZjVlNjllMiksCisgICAgV1RDUCgweDc2Y2Q2YmE5LCAweDJmYTRmNDE5KSwgV1RDUCgweDc2YjBmZGE0LCAweDJmZWI5YjI3KSwKKyAgICBXVENQKDB4NzY5NDUzMmUsIDB4MzAzMjVlOTYpLCBXVENQKDB4NzY3NzZjMTcsIDB4MzA3OTNkZWUpLAorICAgIFdUQ1AoMHg3NjVhNDgzNCwgMHgzMGMwMzhiNSksIFdUQ1AoMHg3NjNjZTc1OSwgMHgzMTA3NGU3MiksCisgICAgV1RDUCgweDc2MWY0OTU5LCAweDMxNGU3ZWFiKSwgV1RDUCgweDc2MDE2ZTBiLCAweDMxOTVjOGU2KSwKKyAgICBXVENQKDB4NzVlMzU1NDUsIDB4MzFkZDJjYTkpLCBXVENQKDB4NzVjNGZlZGMsIDB4MzIyNGE5NzkpLAorICAgIFdUQ1AoMHg3NWE2NmFhYiwgMHgzMjZjM2VkOCksIFdUQ1AoMHg3NTg3OTg4NywgMHgzMmIzZWM0ZCksCisgICAgV1RDUCgweDc1Njg4ODRiLCAweDMyZmJiMTU5KSwgV1RDUCgweDc1NDkzOWQxLCAweDMzNDM4ZDgxKSwKKyAgICBXVENQKDB4NzUyOWFjZjQsIDB4MzM4YjgwNDUpLCBXVENQKDB4NzUwOWUxOGUsIDB4MzNkMzg5MmEpLAorICAgIFdUQ1AoMHg3NGU5ZDc3ZCwgMHgzNDFiYTdiMSksIFdUQ1AoMHg3NGM5OGU5ZSwgMHgzNDYzZGI1YSksCisgICAgV1RDUCgweDc0YTkwNmNkLCAweDM0YWMyM2E3KSwgV1RDUCgweDc0ODgzZmVjLCAweDM0ZjQ4MDE5KSwKKyAgICBXVENQKDB4NzQ2NzM5ZDgsIDB4MzUzY2YwMmYpLCBXVENQKDB4NzQ0NWY0NzIsIDB4MzU4NTczNmEpLAorICAgIFdUQ1AoMHg3NDI0NmY5YywgMHgzNWNlMDk0OSksIFdUQ1AoMHg3NDAyYWIzNywgMHgzNjE2YjE0YyksCisgICAgV1RDUCgweDczZTBhNzI3LCAweDM2NWY2YWYwKSwgV1RDUCgweDczYmU2MzUwLCAweDM2YTgzNWI1KSwKKyAgICBXVENQKDB4NzM5YmRmOTUsIDB4MzZmMTExMTgpLCBXVENQKDB4NzM3OTFiZGQsIDB4MzczOWZjOTgpLAorICAgIFdUQ1AoMHg3MzU2MTgwZSwgMHgzNzgyZjdiMiksIFdUQ1AoMHg3MzMyZDQxMCwgMHgzN2NjMDFlMyksCisgICAgV1RDUCgweDczMGY0ZmM5LCAweDM4MTUxYWE4KSwgV1RDUCgweDcyZWI4YjI0LCAweDM4NWU0MTdlKSwKKyAgICBXVENQKDB4NzJjNzg2MGEsIDB4MzhhNzc1ZTEpLCBXVENQKDB4NzJhMzQwNjYsIDB4MzhmMGI3NGQpLAorICAgIFdUQ1AoMHg3MjdlYmEyNCwgMHgzOTNhMDUzZSksIFdUQ1AoMHg3MjU5ZjMzMSwgMHgzOTgzNWYzMCksCisgICAgV1RDUCgweDcyMzRlYjc5LCAweDM5Y2NjNDllKSwgV1RDUCgweDcyMGZhMmViLCAweDNhMTYzNTAzKSwKKyAgICBXVENQKDB4NzFlYTE5NzcsIDB4M2E1ZmFmZGEpLCBXVENQKDB4NzFjNDRmMGMsIDB4M2FhOTM0OWUpLAorICAgIFdUQ1AoMHg3MTllNDM5ZCwgMHgzYWYyYzJjYSksIFdUQ1AoMHg3MTc3ZjcxYSwgMHgzYjNjNTlkNyksCisgICAgV1RDUCgweDcxNTE2OTc4LCAweDNiODVmOTQwKSwgV1RDUCgweDcxMmE5YWFhLCAweDNiY2ZhMDdlKSwKKyAgICBXVENQKDB4NzEwMzhhYTQsIDB4M2MxOTRmMGQpLCBXVENQKDB4NzBkYzM5NWUsIDB4M2M2MzA0NjQpLAorICAgIFdUQ1AoMHg3MGI0YTZjZCwgMHgzY2FjYmZmZiksIFdUQ1AoMHg3MDhjZDJlOSwgMHgzY2Y2ODE1NSksCisgICAgV1RDUCgweDcwNjRiZGFiLCAweDNkNDA0N2UxKSwgV1RDUCgweDcwM2M2NzBkLCAweDNkOGExMzFjKSwKKyAgICBXVENQKDB4NzAxM2NmMGEsIDB4M2RkM2UyN2UpLCBXVENQKDB4NmZlYWY1OWMsIDB4M2UxZGI1ODApLAorICAgIFdUQ1AoMHg2ZmMxZGFjMSwgMHgzZTY3OGI5YiksIFdUQ1AoMHg2Zjk4N2U3NiwgMHgzZWIxNjQ0OSksCisgICAgV1RDUCgweDZmNmVlMGI5LCAweDNlZmIzZjAxKSwgV1RDUCgweDZmNDUwMThiLCAweDNmNDUxYjNkKSwKKyAgICBXVENQKDB4NmYxYWUwZWIsIDB4M2Y4ZWY4NzQpLCBXVENQKDB4NmVmMDdlZGIsIDB4M2ZkOGQ2MjApLAorICAgIFdUQ1AoMHg2ZWM1ZGI1ZCwgMHg0MDIyYjNiOSksIFdUQ1AoMHg2ZTlhZjY3NSwgMHg0MDZjOTBiNyksCisgICAgV1RDUCgweDZlNmZkMDI3LCAweDQwYjY2YzkzKSwgV1RDUCgweDZlNDQ2ODc5LCAweDQxMDA0NmM1KSwKKyAgICBXVENQKDB4NmUxOGJmNzEsIDB4NDE0YTFlYzYpLCBXVENQKDB4NmRlY2Q1MTcsIDB4NDE5M2Y0MGQpLAorICAgIFdUQ1AoMHg2ZGMwYTk3MiwgMHg0MWRkYzYxNSksIFdUQ1AoMHg2ZDk0M2M4ZCwgMHg0MjI3OTQ1NSksCisgICAgV1RDUCgweDZkNjc4ZTcxLCAweDQyNzE1ZTQ1KSwgV1RDUCgweDZkM2E5ZjJhLCAweDQyYmIyMzVmKSwKKyAgICBXVENQKDB4NmQwZDZlYzUsIDB4NDMwNGUzMWEpLCBXVENQKDB4NmNkZmZkNGYsIDB4NDM0ZTljZjEpLAorICAgIFdUQ1AoMHg2Y2IyNGFkNiwgMHg0Mzk4NTA1YiksIFdUQ1AoMHg2Yzg0NTc2YiwgMHg0M2UxZmNkMSksCisgICAgV1RDUCgweDZjNTYyMzFjLCAweDQ0MmJhMWNkKSwgV1RDUCgweDZjMjdhZGZkLCAweDQ0NzUzZWM3KSwKKyAgICBXVENQKDB4NmJmOGY4MWUsIDB4NDRiZWQzM2EpLCBXVENQKDB4NmJjYTAxOTUsIDB4NDUwODVlOWQpLAorICAgIFdUQ1AoMHg2YjlhY2E3NSwgMHg0NTUxZTA2YiksIFdUQ1AoMHg2YjZiNTJkNSwgMHg0NTliNTgxZSksCisgICAgV1RDUCgweDZiM2I5YWM5LCAweDQ1ZTRjNTJmKSwgV1RDUCgweDZiMGJhMjZiLCAweDQ2MmUyNzE3KSwKKyAgICBXVENQKDB4NmFkYjY5ZDMsIDB4NDY3NzdkNTIpLCBXVENQKDB4NmFhYWYxMWIsIDB4NDZjMGM3NWEpLAorICAgIFdUQ1AoMHg2YTdhMzg1YywgMHg0NzBhMDRhOSksIFdUQ1AoMHg2YTQ5M2ZiMywgMHg0NzUzMzRiOSksCisgICAgV1RDUCgweDZhMTgwNzNkLCAweDQ3OWM1NzA3KSwgV1RDUCgweDY5ZTY4ZjE3LCAweDQ3ZTU2YjBjKSwKKyAgICBXVENQKDB4NjliNGQ3NjEsIDB4NDgyZTcwNDUpLCBXVENQKDB4Njk4MmUwMzksIDB4NDg3NzY2MmMpLAorICAgIFdUQ1AoMHg2OTUwYTljMCwgMHg0OGMwNGMzZiksIFdUQ1AoMHg2OTFlMzQxYSwgMHg0OTA5MjFmOCksCisgICAgV1RDUCgweDY4ZWI3ZjY3LCAweDQ5NTFlNmQ1KSwgV1RDUCgweDY4Yjg4YmNkLCAweDQ5OWE5YTUxKSwKKyAgICBXVENQKDB4Njg4NTU5NzAsIDB4NDllMzNiZWIpLCBXVENQKDB4Njg1MWU4NzUsIDB4NGEyYmNiMWYpLAorICAgIFdUQ1AoMHg2ODFlMzkwNSwgMHg0YTc0NDc2YiksIFdUQ1AoMHg2N2VhNGI0NywgMHg0YWJjYjA0YyksCisgICAgV1RDUCgweDY3YjYxZjYzLCAweDRiMDUwNTQxKSwgV1RDUCgweDY3ODFiNTg1LCAweDRiNGQ0NWM5KSwKKyAgICBXVENQKDB4Njc0ZDBkZDYsIDB4NGI5NTcxNjIpLCBXVENQKDB4NjcxODI4ODMsIDB4NGJkZDg3OGMpLAorICAgIFdUQ1AoMHg2NmUzMDViOCwgMHg0YzI1ODdjNiksIFdUQ1AoMHg2NmFkYTVhNSwgMHg0YzZkNzE5MCksCisgICAgV1RDUCgweDY2NzgwODc4LCAweDRjYjU0NDZhKSwgV1RDUCgweDY2NDIyZTYwLCAweDRjZmNmZmQ1KSwKKyAgICBXVENQKDB4NjYwYzE3OTAsIDB4NGQ0NGEzNTMpLCBXVENQKDB4NjVkNWM0MzksIDB4NGQ4YzJlNjQpLAorICAgIFdUQ1AoMHg2NTlmMzQ4ZSwgMHg0ZGQzYTA4YyksIFdUQ1AoMHg2NTY4NjhjMywgMHg0ZTFhZjk0YiksCisgICAgV1RDUCgweDY1MzE2MTBkLCAweDRlNjIzODI1KSwgV1RDUCgweDY0ZmExZGEzLCAweDRlYTk1YzlkKSwKKyAgICBXVENQKDB4NjRjMjllYmIsIDB4NGVmMDY2MzcpLCBXVENQKDB4NjQ4YWU0OGQsIDB4NGYzNzU0NzcpLAorICAgIFdUQ1AoMHg2NDUyZWY1MywgMHg0ZjdlMjZlMSksIFdUQ1AoMHg2NDFhYmY0NiwgMHg0ZmM0ZGNmYiksCisgICAgV1RDUCgweDYzZTI1NGEyLCAweDUwMGI3NjQ5KSwgV1RDUCgweDYzYTlhZmEyLCAweDUwNTFmMjUzKSwKKyAgICBXVENQKDB4NjM3MGQwODMsIDB4NTA5ODUwOWYpLCBXVENQKDB4NjMzN2I3ODQsIDB4NTBkZTkwYjMpLAorICAgIFdUQ1AoMHg2MmZlNjRlMywgMHg1MTI0YjIxOCksIFdUQ1AoMHg2MmM0ZDhlMCwgMHg1MTZhYjQ1NSksCisgICAgV1RDUCgweDYyOGIxM2JjLCAweDUxYjA5NmYzKSwgV1RDUCgweDYyNTExNWI4LCAweDUxZjY1OTdiKSwKKyAgICBXVENQKDB4NjIxNmRmMTgsIDB4NTIzYmZiNzgpLCBXVENQKDB4NjFkYzcwMWYsIDB4NTI4MTdjNzIpLAorICAgIFdUQ1AoMHg2MWExYzkxMiwgMHg1MmM2ZGJmNSksIFdUQ1AoMHg2MTY2ZWEzNiwgMHg1MzBjMTk4ZCksCisgICAgV1RDUCgweDYxMmJkM2QyLCAweDUzNTEzNGM1KSwgV1RDUCgweDYwZjA4NjJkLCAweDUzOTYyZDJhKSwKKyAgICBXVENQKDB4NjBiNTAxOTAsIDB4NTNkYjAyNGEpLCBXVENQKDB4NjA3OTQ2NDQsIDB4NTQxZmIzYjEpLAorICAgIFdUQ1AoMHg2MDNkNTQ5NCwgMHg1NDY0NDBlZiksIFdUQ1AoMHg2MDAxMmNjYSwgMHg1NGE4YTk5MiksCisgICAgV1RDUCgweDVmYzRjZjMzLCAweDU0ZWNlZDJiKSwgV1RDUCgweDVmODgzYzFjLCAweDU1MzEwYjQ4KSwKKyAgICBXVENQKDB4NWY0YjczZDIsIDB4NTU3NTAzN2MpLCBXVENQKDB4NWYwZTc2YTUsIDB4NTViOGQ1NTgpLAorICAgIFdUQ1AoMHg1ZWQxNDRlNSwgMHg1NWZjODA2ZiksIFdUQ1AoMHg1ZTkzZGVlMSwgMHg1NjQwMDQ1MiksCisgICAgV1RDUCgweDVlNTY0NGVjLCAweDU2ODM2MDk2KSwgV1RDUCgweDVlMTg3NzU3LCAweDU2YzY5NGNmKSwKKyAgICBXVENQKDB4NWRkYTc2NzcsIDB4NTcwOWEwOTIpLCBXVENQKDB4NWQ5YzQyOWYsIDB4NTc0YzgzNzQpLAorICAgIFdUQ1AoMHg1ZDVkZGMyNCwgMHg1NzhmM2QwZCksIFdUQ1AoMHg1ZDFmNDM1ZCwgMHg1N2QxY2NmMiksCisgICAgV1RDUCgweDVjZTA3OGEwLCAweDU4MTQzMmJkKSwgV1RDUCgweDVjYTE3YzQ1LCAweDU4NTY2ZTA0KSwKKyAgICBXVENQKDB4NWM2MjRlYTQsIDB4NTg5ODdlNjMpLCBXVENQKDB4NWMyMmYwMTYsIDB4NThkYTYzNzIpLAorICAgIFdUQ1AoMHg1YmUzNjBmNiwgMHg1OTFjMWNjYyksIFdUQ1AoMHg1YmEzYTE5ZiwgMHg1OTVkYWEwZCksCisgICAgV1RDUCgweDViNjNiMjZjLCAweDU5OWYwYWQxKSwgV1RDUCgweDViMjM5M2JhLCAweDU5ZTAzZWI2KSwKKyAgICBXVENQKDB4NWFlMzQ1ZTcsIDB4NWEyMTQ1NTgpLCBXVENQKDB4NWFhMmM5NTEsIDB4NWE2MjFlNTYpLAorfTsKIAogLyoqCi0gKiBcYnJpZWYgSGVscGVyIHRhYmxlIGNvbnRhaW5pbmcgdGhlIGxlbmd0aCwgcmFzdGVyYW5kIHNoYXBlIG1hcHBpbmcgdG8gaW5kaXZpZHVhbCB3aW5kb3cgc2xvcGUgdGFibGVzLgotICogWzA6IHNpbmUgXVswOiByYWRpeDIgcmFzdGVyICAgICAgICBdW2NlaWwobG9nMihsZW5ndGgpKSBsZW5ndGggICA0ICAgIC4uIDEwMjQgXQotICogICAgICAgICAgIFsxOiAxMG1zIHJhc3RlciAgICAgICAgICBdW2NlaWwobG9nMihsZW5ndGgpKSBsZW5ndGggICAzLjI1IC4uICA5NjAgXQotICogICAgICAgICAgIFsyOiAzLzQgb2YgcmFkaXggMiByYXN0ZXJdW2NlaWwobG9nMihsZW5ndGgpKSBsZW5ndGggICAzICAgIC4uICA3NjggXQotICogWzE6IEtCRCAgXVswOiByYWRpeDIgcmFzdGVyICAgICAgICBdW2NlaWwobG9nMihsZW5ndGgpKSBsZW5ndGggMTI4ICAgIC4uIDEwMjQgXQotICogICAgICAgICAgIFsxOiAxMG1zIHJhc3RlciAgICAgICAgICBdW2NlaWwobG9nMihsZW5ndGgpKSBsZW5ndGggMTIwICAgIC4uICA5NjAgXQotICogICAgICAgICAgIFsyOiAzLzQgb2YgcmFkaXggMiByYXN0ZXJdW2NlaWwobG9nMihsZW5ndGgpKSBsZW5ndGggIDk2ICAgIC4uICA3NjggXQorICogXGJyaWVmIEhlbHBlciB0YWJsZSBjb250YWluaW5nIHRoZSBsZW5ndGgsIHJhc3RlcmFuZCBzaGFwZSBtYXBwaW5nIHRvCisgKiBpbmRpdmlkdWFsIHdpbmRvdyBzbG9wZSB0YWJsZXMuIFswOiBzaW5lIF1bMDogcmFkaXgyIHJhc3RlcgorICogXVtjZWlsKGxvZzIobGVuZ3RoKSkgbGVuZ3RoICAgNCAgICAuLiAxMDI0IF0gWzE6IDEwbXMgcmFzdGVyCisgKiBdW2NlaWwobG9nMihsZW5ndGgpKSBsZW5ndGggICAzLjI1IC4uICA5NjAgXSBbMjogMy80IG9mIHJhZGl4IDIKKyAqIHJhc3Rlcl1bY2VpbChsb2cyKGxlbmd0aCkpIGxlbmd0aCAgIDMgICAgLi4gIDc2OCBdIFsxOiBLQkQgIF1bMDoKKyAqIHJhZGl4MiByYXN0ZXIgICAgICAgIF1bY2VpbChsb2cyKGxlbmd0aCkpIGxlbmd0aCAxMjggICAgLi4gMTAyNCBdIFsxOiAxMG1zCisgKiByYXN0ZXIgICAgICAgICAgXVtjZWlsKGxvZzIobGVuZ3RoKSkgbGVuZ3RoIDEyMCAgICAuLiAgOTYwIF0gWzI6CisgKiAzLzQgb2YgcmFkaXggMiByYXN0ZXJdW2NlaWwobG9nMihsZW5ndGgpKSBsZW5ndGggIDk2ICAgIC4uICA3NjggXQogICovCi1jb25zdCBGSVhQX1dUUCAqY29uc3Qgd2luZG93U2xvcGVzWzJdWzNdWzldID0KLXsKLSAgeyAvKiBTaW5lICovCi0gICAgeyAvKiBSYWRpeCAyICovCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBTaW5lV2luZG93MzIsCi0gICAgICBTaW5lV2luZG93NjQsCi0gICAgICBTaW5lV2luZG93MTI4LAotICAgICAgTlVMTCwKLSAgICAgIFNpbmVXaW5kb3c1MTIsCi0gICAgICBTaW5lV2luZG93MTAyNAotICAgIH0sCi0gICAgeyAvKiAxMG1zIHJhc3RlciAqLworY29uc3QgRklYUF9XVFAgKmNvbnN0IHdpbmRvd1Nsb3Blc1syXVs0XVs5XSA9IHsKKyAgICB7IC8qIFNpbmUgKi8KKyAgICAgey8qIFJhZGl4IDIgKi8KKyAgICAgIE5VTEwsIFNpbmVXaW5kb3c4LCBTaW5lV2luZG93MTYsIFNpbmVXaW5kb3czMiwgU2luZVdpbmRvdzY0LAorICAgICAgU2luZVdpbmRvdzEyOCwgU2luZVdpbmRvdzI1NiwgU2luZVdpbmRvdzUxMiwgU2luZVdpbmRvdzEwMjR9LAorICAgICB7ICAgICAgLyogMTBtcyByYXN0ZXIgKi8KICAgICAgIE5VTEwsIC8qIDMuMjUgKi8KICAgICAgIE5VTEwsIC8qIDcuNSAqLwotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgU2luZVdpbmRvdzEyMCwgCi0gICAgICBOVUxMLAotICAgICAgU2luZVdpbmRvdzQ4MCwKLSAgICAgIFNpbmVXaW5kb3c5NjAKLSAgICB9LAotICAgIHsgLyogMy80IHJhZGl4MiByYXN0ZXIgKi8KKyAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIFNpbmVXaW5kb3cxMjAsIFNpbmVXaW5kb3cyNDAsIFNpbmVXaW5kb3c0ODAsCisgICAgICBTaW5lV2luZG93OTYwfSwKKyAgICAgeyAgICAgIC8qIDMvNCByYWRpeDIgcmFzdGVyICovCiAgICAgICBOVUxMLCAvKiAzICovCiAgICAgICBOVUxMLCAvKiA2ICovCi0jaWZkZWYgSU5DTFVERV9TaW5lV2luZG93MTIKLSAgICAgIFNpbmVXaW5kb3cxMiwKLSNlbHNlCi0gICAgICBOVUxMLAotI2VuZGlmCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwKLSAgICB9Ci0gIH0sCi0gIHsgLyogS0JEICovCi0gICAgeyAvKiBSYWRpeCAyICovCi0gICAgICBLQkRXaW5kb3cxMjgsCi0gICAgICBOVUxMLAotICAgICAgU2luZVdpbmRvdzUxMiwKLSAgICAgIEtCRFdpbmRvdzEwMjQKLSAgICB9LAotICAgIHsgLyogMTBtcyByYXN0ZXIgKi8KLSAgICAgIEtCRFdpbmRvdzEyMCwKLSAgICAgIE5VTEwsCi0gICAgICBTaW5lV2luZG93NDgwLAotICAgICAgS0JEV2luZG93OTYwCi0gICAgfSwKLSAgICB7IC8qIDMvNCByYWRpeDIgcmFzdGVyICovCi0gICAgICBOVUxMLAotICAgICAgTlVMTCwKLSAgICAgIE5VTEwsCi0gICAgICBOVUxMCi0gICAgfQotICB9Ci19OworICAgICAgU2luZVdpbmRvdzEyLCBTaW5lV2luZG93MjQsIFNpbmVXaW5kb3c0OCwgU2luZVdpbmRvdzk2LCBTaW5lV2luZG93MTkyLAorICAgICAgU2luZVdpbmRvdzM4NCwgU2luZVdpbmRvdzc2OH0sCisgICAgIHsKKyAgICAgICAgIC8qIDMvNCByYWRpeDIgcmFzdGVyICovCisgICAgICAgICBOVUxMLAorICAgICAgICAgTlVMTCwgLyogMyAqLworICAgICAgICAgTlVMTCwgLyogNiAqLworICAgICAgICAgU2luZVdpbmRvdzIwLAorICAgICAgICAgU2luZVdpbmRvdzQwLAorICAgICAgICAgTlVMTCwKKyAgICAgICAgIFNpbmVXaW5kb3cxNjAsCisgICAgICAgICBOVUxMLAorICAgICAgICAgTlVMTCwKKyAgICAgfX0sCisgICAgeyAvKiBLQkQgKi8KKyAgICAgey8qIFJhZGl4IDIgKi8KKyAgICAgIE5VTEwsIEtCRFdpbmRvdzEyOCwgS0JEV2luZG93MjU2LCBTaW5lV2luZG93NTEyLCBLQkRXaW5kb3cxMDI0fSwKKyAgICAgey8qIDEwbXMgcmFzdGVyICovCisgICAgICBOVUxMLCBLQkRXaW5kb3cxMjAsIE5VTEwsIFNpbmVXaW5kb3c0ODAsIEtCRFdpbmRvdzk2MH0sCisgICAgIHsvKiAzLzQgcmFkaXgyIHJhc3RlciAqLworICAgICAgTlVMTCwgS0JEV2luZG93OTYsCisgICAgICBTaW5lV2luZG93MTkyLCAvKiBUaGlzIGVudHJ5IG1pZ2h0IGJlIGFjY2Vzc2VkIGZvciBlcnJlZCBiaXQgc3RyZWFtcy4gKi8KKyAgICAgIE5VTEwsIEtCRFdpbmRvdzc2OH0sCisgICAgIHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfX19OwogCi1jb25zdCBGSVhQX1dUUCAqIEZES2dldFdpbmRvd1Nsb3BlKGludCBsZW5ndGgsIGludCBzaGFwZSkKLXsKLSAgY29uc3QgRklYUF9XVFAgKiB3ID0gTlVMTDsKK2NvbnN0IEZJWFBfV1RQICpGREtnZXRXaW5kb3dTbG9wZShpbnQgbGVuZ3RoLCBpbnQgc2hhcGUpIHsKKyAgY29uc3QgRklYUF9XVFAgKncgPSBOVUxMOwogICBpbnQgcmFzdGVyLCBsZDJfbGVuZ3RoOwogCiAgIC8qIEdldCBsZDIgb2YgbGVuZ3RoIC0gMiArIDEKICAgICAgLTI6IGJlY2F1c2UgZmlyc3QgdGFibGUgZW50cnkgaXMgd2luZG93IG9mIHNpemUgNAogICAgICArMTogYmVjYXVzZSB3ZSBhbHJlYWR5IGluY2x1ZGUgKzEgYmVjYXVzZSBvZiBjZWlsKGxvZzIobGVuZ3RoKSkgKi8KLSAgbGQyX2xlbmd0aCA9IERGUkFDVF9CSVRTLTEtZk5vcm16KChGSVhQX0RCTClsZW5ndGgpIC0gMTsKKyAgbGQyX2xlbmd0aCA9IERGUkFDVF9CSVRTIC0gMSAtIGZOb3JteigoRklYUF9EQkwpbGVuZ3RoKSAtIDE7CiAKICAgLyogRXh0cmFjdCBzb3J0IG9mICJlaWdlbnZhbHVlIiAodGhlIDQgbGVmdCBtb3N0IGJpdHMpIG9mIGxlbmd0aC4gKi8KLSAgc3dpdGNoICggKGxlbmd0aCkgPj4gKGxkMl9sZW5ndGgtMikgKSB7CisgIHN3aXRjaCAoKGxlbmd0aCkgPj4gKGxkMl9sZW5ndGggLSAyKSkgewogICAgIGNhc2UgMHg4OiAvKiByYWRpeCAyICovCiAgICAgICByYXN0ZXIgPSAwOwogICAgICAgbGQyX2xlbmd0aC0tOyAvKiByZXZlcnQgKyAxIGJlY2F1c2Ugb2YgY2VpbChsb2cyKGxlbmd0aCkpIGZyb20gYWJvdmUuICovCkBAIC0xMjM3LDkzICs0MDkzLDMzIEBACiAgICAgICBicmVhazsKICAgfQogCi0gIC8qIFRoZSB0YWJsZSBmb3Igc2luZSB3aW5kb3dzIChzaGFwZSA9PSAwKSBpcyA1IGVudHJpZXMgbG9uZ2VyLiAqLworICAvKiBUaGUgdGFibGUgZm9yIHNpbmUgd2luZG93cyAoc2hhcGUgPT0gMCkgaXMgNCBlbnRyaWVzIGxvbmdlci4gKi8KICAgaWYgKHNoYXBlID09IDEpIHsKLSAgICBsZDJfbGVuZ3RoLT01OworICAgIGxkMl9sZW5ndGggLT0gNDsKICAgfQogCiAgIC8qIExvb2sgdXAgdGFibGUgKi8KLSAgdyA9IHdpbmRvd1Nsb3Blc1tzaGFwZSYxXVtyYXN0ZXJdW2xkMl9sZW5ndGhdOworICB3ID0gd2luZG93U2xvcGVzW3NoYXBlICYgMV1bcmFzdGVyXVtsZDJfbGVuZ3RoXTsKIAogICBGREtfQVNTRVJUKHcgIT0gTlVMTCk7CiAKICAgcmV0dXJuIHc7CiB9CiAKLQotLyoKLSAqIFFNRiBmaWx0ZXIgYW5kIHR3aWRkbGUgdGFibGVzCi0gKi8KKyAgLyoKKyAgICogUU1GIGZpbHRlciBhbmQgdHdpZGRsZSB0YWJsZXMKKyAgICovCiAKICNpZmRlZiBRTUZfQ09FRkZfMTZCSVQKLSNkZWZpbmUgUUZDKHgpICBGWF9EQkwyRlhDT05TVF9TR0woeCkKLSNkZWZpbmUgUVRDRkwoeCkgIEZMMkZYQ09OU1RfU0dMKHgpCi0jZGVmaW5lIFFUQyh4KSAgICBGWF9EQkwyRlhDT05TVF9TR0woeCkKKyNkZWZpbmUgUUZDKHgpIEZYX0RCTDJGWENPTlNUX1NHTCh4KQorI2RlZmluZSBRVENGTCh4KSBGTDJGWENPTlNUX1NHTCh4KQorI2RlZmluZSBRVEMoeCkgRlhfREJMMkZYQ09OU1RfU0dMKHgpCiAjZWxzZQogI2RlZmluZSBRRkMoeCkgKChGSVhQX0RCTCkoeCkpCi0jZGVmaW5lIFFUQ0ZMKHgpICBGTDJGWENPTlNUX0RCTCh4KQotI2RlZmluZSBRVEMoeCkgICgoRklYUF9EQkwpKHgpKQorI2RlZmluZSBRVENGTCh4KSBGTDJGWENPTlNUX0RCTCh4KQorI2RlZmluZSBRVEMoeCkgKChGSVhQX0RCTCkoeCkpCiAjZW5kaWYgLyogQVJDSF9QUkVGRVJfTVVMVF8zMngxNiAqLwogCi0jaWZuZGVmIExPV19QT1dFUl9TQlJfT05MWQotLyohCi0gIFxuYW1lIFFNRi1Ud2lkZGxlCi0gIFxicmllZiBRTUYgdHdpZGRsZSBmYWN0b3JzCi0KLSAgTD0zMiwgZ2Fpbj0yLjAsIGFuZ2xlID0gMC43NQotKi8KLQotY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zMzJbMzJdID0KLXsKLSAgUVRDRkwoIDAuOTk5MzIyMzg0NTg4MzVmKSxRVENGTCggMC45OTM5MDY5NzAwMDIzNmYpLFFUQ0ZMKCAwLjk4MzEwNTQ4NzQzMTIyZiksUVRDRkwoIDAuOTY2OTc2NDcxMDQ0ODVmKSwKLSAgUVRDRkwoIDAuOTQ1NjA3MzI1MzgwNTJmKSxRVENGTCggMC45MTkxMTM4NTE2OTAwNmYpLFFUQ0ZMKCAwLjg4NzYzOTYyMDQwMjg1ZiksUVRDRkwoIDAuODUxMzU1MTkzMTA1MjdmKSwKLSAgUVRDRkwoIDAuODEwNDU3MTk4MjUyNTlmKSxRVENGTCggMC43NjUxNjcyNjU2MjI0NmYpLFFUQ0ZMKCAwLjcxNTczMDgyNTI4MzgyZiksUVRDRkwoIDAuNjYyNDE1Nzc3NTkwMTdmKSwKLSAgUVRDRkwoIDAuNjA1NTExMDQxNDA0MzNmKSxRVENGTCggMC41NDUzMjQ5ODg0MjIwNWYpLFFUQ0ZMKCAwLjQ4MjE4Mzc3MjA3OTEyZiksUVRDRkwoIDAuNDE2NDI5NTYwMDk3NjRmKSwKLSAgUVRDRkwoIDAuMzQ4NDE4NjgwMjQ5NDNmKSxRVENGTCggMC4yNzg1MTk2ODkzODUwNWYpLFFUQ0ZMKCAwLjIwNzExMTM3NjE5MjIyZiksUVRDRkwoIDAuMTM0NTgwNzA4NTA3MTNmKSwKLSAgUVRDRkwoIDAuMDYxMzIwNzM2MzAyMjFmKSxRVENGTCgtMC4wMTIyNzE1MzgyODU3MmYpLFFUQ0ZMKC0wLjA4NTc5NzMxMjM0NDQ0ZiksUVRDRkwoLTAuMTU4ODU4MTQzMzMzODZmKSwKLSAgUVRDRkwoLTAuMjMxMDU4MTA4MjgwNjdmKSxRVENGTCgtMC4zMDIwMDU5NDkzMTkyM2YpLFFUQ0ZMKC0wLjM3MTMxNzE5Mzk1MTg0ZiksUVRDRkwoLTAuNDM4NjE2MjM4NTM4NTNmKSwKLSAgUVRDRkwoLTAuNTAzNTM4MzgzNzI1NzJmKSxRVENGTCgtMC41NjU3MzE4MTA3ODM2MWYpLFFUQ0ZMKC0wLjYyNDg1OTQ4ODE0MjM5ZiksUVRDRkwoLTAuNjgwNjAwOTk3Nzk1NDVmKQotfTsKLQotY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luMzJbMzJdID0KLXsKLSAgUVRDRkwoIDAuMDM2ODA3MjIyOTQxMzZmKSxRVENGTCggMC4xMTAyMjIyMDcyOTM4OGYpLFFUQ0ZMKCAwLjE4MzAzOTg4Nzk1NTE0ZiksUVRDRkwoIDAuMjU0ODY1NjU5NjA0NTFmKSwKLSAgUVRDRkwoIDAuMzI1MzEwMjkyMTYyMjZmKSxRVENGTCggMC4zOTM5OTIwNDAwNjEwNWYpLFFUQ0ZMKCAwLjQ2MDUzODcxMDk1ODI0ZiksUVRDRkwoIDAuNTI0NTg5NjgyNjc4NDdmKSwKLSAgUVRDRkwoIDAuNTg1Nzk3ODU3NDU2NDRmKSxRVENGTCggMC42NDM4MzE1NDI4ODk3OWYpLFFUQ0ZMKCAwLjY5ODM3NjI0OTQwODk3ZiksUVRDRkwoIDAuNzQ5MTM2Mzk0NTIzNDZmKSwKLSAgUVRDRkwoIDAuNzk1ODM2OTA0NjA4ODhmKSxRVENGTCggMC44MzgyMjQ3MDU1NTQ4NGYpLFFUQ0ZMKCAwLjg3NjA3MDA5NDE5NTQxZiksUVRDRkwoIDAuOTA5MTY3OTgzMDkwNTJmKSwKLSAgUVRDRkwoIDAuOTM3MzM5MDExOTEyNTdmKSxRVENGTCggMC45NjA0MzA1MTk0MTU1N2YpLFFUQ0ZMKCAwLjk3ODMxNzM3MDcxOTYzZiksUVRDRkwoIDAuOTkwOTAyNjM1NDI3NzhmKSwKLSAgUVRDRkwoIDAuOTk4MTE4MTEyOTAwMTVmKSxRVENGTCggMC45OTk5MjQ3MDE4MzkxNGYpLFFUQ0ZMKCAwLjk5NjMxMjYxMjE4Mjc4ZiksUVRDRkwoIDAuOTg3MzAxNDE4MTU3ODZmKSwKLSAgUVRDRkwoIDAuOTcyOTM5OTUyMjA1NTZmKSxRVENGTCggMC45NTMzMDYwNDAzNTQxOWYpLFFUQ0ZMKCAwLjkyODUwNjA4MDQ3MzIyZiksUVRDRkwoIDAuODk4Njc0NDY1NjkzOTVmKSwKLSAgUVRDRkwoIDAuODYzOTcyODU2MTIxNTlmKSxRVENGTCggMC44MjQ1ODkzMDI3ODUwM2YpLFFUQ0ZMKCAwLjc4MDczNzIyODU3MjA5ZiksUVRDRkwoIDAuNzMyNjU0MjcxNjcyNDFmKQotfTsKLWNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczY0WzY0XSA9IHsKLSAgUVRDKDB4N2ZmNjIxODEpLCBRVEMoMHg3ZmE3MzZiMyksIFFUQygweDdmMDk5MWMzKSwgUVRDKDB4N2UxZDkzZTkpLCBRVEMoMHg3Y2UzY2ViMSksIFFUQygweDdiNWQwMzlkKSwgUVRDKDB4Nzk4YTIzYjApLCBRVEMoMHg3NzZjNGVkYSksCi0gIFFUQygweDc1MDRkMzQ0KSwgUVRDKDB4NzI1NTJjODQpLCBRVEMoMHg2ZjVmMDJiMSksIFFUQygweDZjMjQyOTVmKSwgUVRDKDB4NjhhNjllODApLCBRVEMoMHg2NGU4ODkyNSksIFFUQygweDYwZWMzODJmKSwgUVRDKDB4NWNiNDIwZGYpLAotICBRVEMoMHg1ODQyZGQ1NCksIFFUQygweDUzOWIyYWVmKSwgUVRDKDB4NGViZmU4YTQpLCBRVEMoMHg0OWI0MTUzMyksIFFUQygweDQ0N2FjZDUwKSwgUVRDKDB4M2YxNzQ5YjcpLCBRVEMoMHgzOThjZGQzMiksIFFUQygweDMzZGVmMjg3KSwKLSAgUVRDKDB4MmUxMTBhNjIpLCBRVEMoMHgyODI2YjkyOCksIFFUQygweDIyMjNhNGM1KSwgUVRDKDB4MWMwYjgyNmEpLCBRVEMoMHgxNWUyMTQ0NCksIFFUQygweDBmYWIyNzJiKSwgUVRDKDB4MDk2YTkwNDkpLCBRVEMoMHgwMzI0MmFiZiksCi0gIFFUQygweGZjZGJkNTQxKSwgUVRDKDB4ZjY5NTZmYjcpLCBRVEMoMHhmMDU0ZDhkNSksIFFUQygweGVhMWRlYmJjKSwgUVRDKDB4ZTNmNDdkOTYpLCBRVEMoMHhkZGRjNWIzYiksIFFUQygweGQ3ZDk0NmQ4KSwgUVRDKDB4ZDFlZWY1OWUpLAotICBRVEMoMHhjYzIxMGQ3OSksIFFUQygweGM2NzMyMmNlKSwgUVRDKDB4YzBlOGI2NDkpLCBRVEMoMHhiYjg1MzJiMCksIFFUQygweGI2NGJlYWNkKSwgUVRDKDB4YjE0MDE3NWMpLCBRVEMoMHhhYzY0ZDUxMSksIFFUQygweGE3YmQyMmFjKSwKLSAgUVRDKDB4YTM0YmRmMjEpLCBRVEMoMHg5ZjEzYzdkMSksIFFUQygweDliMTc3NmRiKSwgUVRDKDB4OTc1OTYxODApLCBRVEMoMHg5M2RiZDZhMSksIFFUQygweDkwYTBmZDRmKSwgUVRDKDB4OGRhYWQzN2MpLCBRVEMoMHg4YWZiMmNiYyksCi0gIFFUQygweDg4OTNiMTI2KSwgUVRDKDB4ODY3NWRjNTApLCBRVEMoMHg4NGEyZmM2MyksIFFUQygweDgzMWMzMTRmKSwgUVRDKDB4ODFlMjZjMTcpLCBRVEMoMHg4MGY2NmUzZCksIFFUQygweDgwNThjOTRkKSwgUVRDKDB4ODAwOWRlN2YpCi19OwotCi1jb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW42NFs2NF0gPSB7Ci0gIFFUQygweDAzMjQyYWJmKSwgUVRDKDB4MDk2YTkwNDkpLCBRVEMoMHgwZmFiMjcyYiksIFFUQygweDE1ZTIxNDQ0KSwgUVRDKDB4MWMwYjgyNmEpLCBRVEMoMHgyMjIzYTRjNSksIFFUQygweDI4MjZiOTI4KSwgUVRDKDB4MmUxMTBhNjIpLAotICBRVEMoMHgzM2RlZjI4NyksIFFUQygweDM5OGNkZDMyKSwgUVRDKDB4M2YxNzQ5YjcpLCBRVEMoMHg0NDdhY2Q1MCksIFFUQygweDQ5YjQxNTMzKSwgUVRDKDB4NGViZmU4YTQpLCBRVEMoMHg1MzliMmFlZiksIFFUQygweDU4NDJkZDU0KSwKLSAgUVRDKDB4NWNiNDIwZGYpLCBRVEMoMHg2MGVjMzgyZiksIFFUQygweDY0ZTg4OTI1KSwgUVRDKDB4NjhhNjllODApLCBRVEMoMHg2YzI0Mjk1ZiksIFFUQygweDZmNWYwMmIxKSwgUVRDKDB4NzI1NTJjODQpLCBRVEMoMHg3NTA0ZDM0NCksCi0gIFFUQygweDc3NmM0ZWRhKSwgUVRDKDB4Nzk4YTIzYjApLCBRVEMoMHg3YjVkMDM5ZCksIFFUQygweDdjZTNjZWIxKSwgUVRDKDB4N2UxZDkzZTkpLCBRVEMoMHg3ZjA5OTFjMyksIFFUQygweDdmYTczNmIzKSwgUVRDKDB4N2ZmNjIxODEpLAotICBRVEMoMHg3ZmY2MjE4MSksIFFUQygweDdmYTczNmIzKSwgUVRDKDB4N2YwOTkxYzMpLCBRVEMoMHg3ZTFkOTNlOSksIFFUQygweDdjZTNjZWIxKSwgUVRDKDB4N2I1ZDAzOWQpLCBRVEMoMHg3OThhMjNiMCksIFFUQygweDc3NmM0ZWRhKSwKLSAgUVRDKDB4NzUwNGQzNDQpLCBRVEMoMHg3MjU1MmM4NCksIFFUQygweDZmNWYwMmIxKSwgUVRDKDB4NmMyNDI5NWYpLCBRVEMoMHg2OGE2OWU4MCksIFFUQygweDY0ZTg4OTI1KSwgUVRDKDB4NjBlYzM4MmYpLCBRVEMoMHg1Y2I0MjBkZiksCi0gIFFUQygweDU4NDJkZDU0KSwgUVRDKDB4NTM5YjJhZWYpLCBRVEMoMHg0ZWJmZThhNCksIFFUQygweDQ5YjQxNTMzKSwgUVRDKDB4NDQ3YWNkNTApLCBRVEMoMHgzZjE3NDliNyksIFFUQygweDM5OGNkZDMyKSwgUVRDKDB4MzNkZWYyODcpLAotICBRVEMoMHgyZTExMGE2MiksIFFUQygweDI4MjZiOTI4KSwgUVRDKDB4MjIyM2E0YzUpLCBRVEMoMHgxYzBiODI2YSksIFFUQygweDE1ZTIxNDQ0KSwgUVRDKDB4MGZhYjI3MmIpLCBRVEMoMHgwOTZhOTA0OSksIFFUQygweDAzMjQyYWJmKQotfTsKLQotLy9AfQotCi0jZW5kaWYgLyogI2lmZGVmIExPV19QT1dFUl9TQlJfT05MWSAqLwotCi0KLQogLyohCiAgIFxuYW1lIFFNRgogICBcYnJpZWYgIFFNRi1UYWJsZQpAQCAtMTM4OCwxMjAgKzQxODQsMTEwNyBAQAogCiAgIFxzaG93aW5pdGlhbGl6ZXIKICovCi0vL0B7Ci0jaWYgUU1GX05PX1BPTFk9PTUKLUxOS19TRUNUSU9OX0NPTlNUREFUQV9MMQogUkFNX0FMSUdOCi1jb25zdCBGSVhQX1BGVCBxbWZfNjRbUU1GNjQwX1BGVF9UQUJMRV9TSVpFK1FNRl9OT19QT0xZXSA9Ci17Ci0gIFFGQygweDAwMDAwMDAwKSwgUUZDKDB4MDFiMmU0MWQpLCBRRkMoMHgyZTNhNzUzMiksIFFGQygweGQxYzU4YWNlKSwgUUZDKDB4ZmU0ZDFiZTMpLAotICBRRkMoMHhmZmVkZTUwZSksIFFGQygweDAxZDc4YmZjKSwgUUZDKDB4MmZhYTIyMWMpLCBRRkMoMHhkMzMzN2IzZSksIFFGQygweGZlNzBiOGQxKSwKLSAgUUZDKDB4ZmZlZDk3OGEpLCBRRkMoMHgwMWZkM2JhMCksIFFGQygweDMxMWFmM2E0KSwgUUZDKDB4ZDQ5ZmQ1NWYpLCBRRkMoMHhmZTkzM2RjMCksCi0gIFFGQygweGZmZWZjOWI5KSwgUUZDKDB4MDIyNDRhMjQpLCBRRkMoMHgzMjhjYzZmMCksIFFGQygweGQ2MGE0NmU2KSwgUUZDKDB4ZmViNDhkMGQpLAotICBRRkMoMHhmZmYwMDY1ZCksIFFGQygweDAyNGJmN2ExKSwgUUZDKDB4MzNmZjY3MGUpLCBRRkMoMHhkNzcyMmYwNCksIFFGQygweGZlZDRiZWMzKSwKLSAgUUZDKDB4ZmZlZmY2Y2EpLCBRRkMoMHgwMjc0YmE0MyksIFFGQygweDM1NzJlYzcwKSwgUUZDKDB4ZDhkN2YyMjApLCBRRkMoMHhmZWYzZjZhYiksCi0gIFFGQygweGZmZWY3YjhiKSwgUUZDKDB4MDI5ZTM1YjQpLCBRRkMoMHgzNmU2OTY5MSksIFFGQygweGRhM2IxNzZhKSwgUUZDKDB4ZmYxMjBkNzApLAotICBRRkMoMHhmZmVlZGZhNCksIFFGQygweDAyYzg5OTAxKSwgUUZDKDB4Mzg1YTQ5YzMpLCBRRkMoMHhkYjliNWIxMiksIFFGQygweGZmMmVmNzI1KSwKLSAgUUZDKDB4ZmZlZTE2NTApLCBRRkMoMHgwMmYzZTQ4ZCksIFFGQygweDM5Y2UwNDc3KSwgUUZDKDB4ZGNmODk4ZmIpLCBRRkMoMHhmZjRhYWJjOCksCi0gIFFGQygweGZmZWQ2NTFkKSwgUUZDKDB4MDMyMDExMTYpLCBRRkMoMHgzYjQxNTExNSksIFFGQygweGRlNTI5MDg3KSwgUUZDKDB4ZmY2NTQyZDEpLAotICBRRkMoMHhmZmVjYzMxYiksIFFGQygweDAzNGQwMWYxKSwgUUZDKDB4M2NiNDEyMTkpLCBRRkMoMHhkZmE5M2FiNSksIFFGQygweGZmN2VlM2YxKSwKLSAgUUZDKDB4ZmZlYmU3N2IpLCBRRkMoMHgwMzdhZDQzOCksIFFGQygweDNlMjViMTdlKSwgUUZDKDB4ZTBmYzQyMWUpLCBRRkMoMHhmZjk3NWMwMSksCi0gIFFGQygweGZmZWI1MGIyKSwgUUZDKDB4MDNhOTY2YmIpLCBRRkMoMHgzZjk2MmZiOCksIFFGQygweGUyNGI4ZjY3KSwgUUZDKDB4ZmZhZWE1ZDYpLAotICBRRkMoMHhmZmVhOTE5MiksIFFGQygweDAzZDhhZmU2KSwgUUZDKDB4NDEwNThiYzUpLCBRRkMoMHhlMzk2YTQ1ZCksIFFGQygweGZmYzRlMzY1KSwKLSAgUUZDKDB4ZmZlOWNhNzYpLCBRRkMoMHgwNDA4M2ZlYyksIFFGQygweDQyNzJhMzg1KSwgUUZDKDB4ZTRkZTBjYjApLCBRRkMoMHhmZmRhMTdmMiksCi0gIFFGQygweGZmZTk0MGY0KSwgUUZDKDB4MDQzODg5YzYpLCBRRkMoMHg0M2RlNjIwYSksIFFGQygweGU2MjBjNDc2KSwgUUZDKDB4ZmZlZTE4M2IpLAotICBRRkMoMHhmZmU4OGJhOCksIFFGQygweDA0Njk0MTAxKSwgUUZDKDB4NDU0N2RhZWEpLCBRRkMoMHhlNzVmOGJiOCksIFFGQygweDAwMDBlNzkwKSwKLSAgUUZDKDB4ZmZlODNhMDcpLCBRRkMoMHgwNDlhYTgyZiksIFFGQygweDQ2YWVhODU2KSwgUUZDKDB4ZTg5OTcxYjcpLCBRRkMoMHgwMDEzMWM3NSksCi0gIFFGQygweGZmZTc5ZTE2KSwgUUZDKDB4MDRjYzJmY2YpLCBRRkMoMHg0ODEyZjg0OCksIFFGQygweGU5Y2VhODRhKSwgUUZDKDB4MDAyM2I5ODkpLAotICBRRkMoMHhmZmU3NzQ2ZSksIFFGQygweDA0ZmUyMGJlKSwgUUZDKDB4NDk3M2ZlZjEpLCBRRkMoMHhlYWZlZTdmMSksIFFGQygweDAwMzNiOTI3KSwKLSAgUUZDKDB4ZmZlNmQ0NjYpLCBRRkMoMHgwNTMwM2Y4OCksIFFGQygweDRhZDIzN2EyKSwgUUZDKDB4ZWMyYTNmNjApLCBRRkMoMHgwMDQyNmYzNiksCi0gIFFGQygweGZmZTZhZmVkKSwgUUZDKDB4MDU2MjYyMDkpLCBRRkMoMHg0YzJjYTNkZiksIFFGQygweGVkNTBhMzFkKSwgUUZDKDB4MDA1MDRmNDEpLAotICBRRkMoMHhmZmU2NTQxNiksIFFGQygweDA1OTUwMTIyKSwgUUZDKDB4NGQ4Mzk3NmMpLCBRRkMoMHhlZTcxYjJmZSksIFFGQygweDAwNWQzNmRmKSwKLSAgUUZDKDB4ZmZlNjgxYzYpLCBRRkMoMHgwNWM3NmZlZCksIFFGQygweDRlZDYyYmUyKSwgUUZDKDB4ZWY4ZDRkN2IpLCBRRkMoMHgwMDY5MjhhMCksCi0gIFFGQygweGZmZTY2ZGQwKSwgUUZDKDB4MDVmOWMwNTEpLCBRRkMoMHg1MDI0ZDcwZSksIFFGQygweGYwYTM5NTlmKSwgUUZDKDB4MDA3NDAwYjgpLAotICBRRkMoMHhmZmU2NmZhYiksIFFGQygweDA2MmJmNWVjKSwgUUZDKDB4NTE2ZWVmYjgpLCBRRkMoMHhmMWI0NjFhYiksIFFGQygweDAwN2UwMzkzKSwKLSAgUUZDKDB4ZmZlNjk0MjMpLCBRRkMoMHgwNjVkZDU2YSksIFFGQygweDUyYjQ0OWRkKSwgUUZDKDB4ZjJiZjZlYTQpLCBRRkMoMHgwMDg3MmM2MyksCi0gIFFGQygweGZmZTZmZWQ0KSwgUUZDKDB4MDY4ZjhiNDQpLCBRRkMoMHg1M2Y0OTVhOSksIFFGQygweGYzYzRlODg3KSwgUUZDKDB4MDA4Zjg3YWEpLAotICBRRkMoMHhmZmU3NTM2MSksIFFGQygweDA2YzBmMGMwKSwgUUZDKDB4NTUyZjhmZjYpLCBRRkMoMHhmNGM0NzNjNiksIFFGQygweDAwOTZkY2MyKSwKLSAgUUZDKDB4ZmZlODA0MTQpLCBRRkMoMHgwNmYxODI1ZCksIFFGQygweDU2NjU0YmRjKSwgUUZDKDB4ZjViZTBmYTkpLCBRRkMoMHgwMDlkYTUyNiksCi0gIFFGQygweGZmZTg1YjRhKSwgUUZDKDB4MDcyMWJmMjIpLCBRRkMoMHg1Nzk1MDVmNCksIFFGQygweGY2YjFmM2MzKSwgUUZDKDB4MDBhMzUwOGYpLAotICBRRkMoMHhmZmU5NTRkMCksIFFGQygweDA3NTExMmEyKSwgUUZDKDB4NThiZWZhY2MpLCBRRkMoMHhmNzlmYTEzYSksIFFGQygweDAwYTg1ZTk0KSwKLSAgUUZDKDB4ZmZlYTM1M2EpLCBRRkMoMHgwNzdmZWRiMyksIFFGQygweDU5ZTJmNjllKSwgUUZDKDB4Zjg4NzUwN2MpLCBRRkMoMHgwMGFjYmQyZiksCi0gIFFGQygweGZmZWIzODQ5KSwgUUZDKDB4MDdhZDhjMjYpLCBRRkMoMHg1YjAwMWRiNyksIFFGQygweGY5NjkxNmY1KSwgUUZDKDB4MDBiMDZiNjgpLAotICBRRkMoMHhmZmVjODQwOSksIFFGQygweDA3ZGEyYjdmKSwgUUZDKDB4NWMxNmQwYWUpLCBRRkMoMHhmYTQ0YTA2OSksIFFGQygweDAwYjM2YWNkKSwKLSAgUUZDKDB4ZmZlZGM0MTgpLCBRRkMoMHgwODA2MTY3MSksIFFGQygweDVkMjZiZTliKSwgUUZDKDB4ZmIxOWI3YmQpLCBRRkMoMHgwMGI1OGM4ZCksCi0gIFFGQygweGZmZWYyMzk1KSwgUUZDKDB4MDgzMDM4OTcpLCBRRkMoMHg1ZTJmNjM2NiksIFFGQygweGZiZThmNWJkKSwgUUZDKDB4MDBiNzNhYjApLAotICBRRkMoMHhmZmYwZTdlZiksIFFGQygweDA4NTk0ODg3KSwgUUZDKDB4NWYzMGZmNWUpLCBRRkMoMHhmY2IxZDc0MCksIFFGQygweDAwYjg1ZjcwKSwKLSAgUUZDKDB4ZmZmMjk0YzMpLCBRRkMoMHgwODgwZmZkZCksIFFGQygweDYwMmIwYzdlKSwgUUZDKDB4ZmQ3NDc1ZDgpLCBRRkMoMHgwMGI4YzZiMCksCi0gIFFGQygweGZmZjQ4NzAwKSwgUUZDKDB4MDhhNzVkYTQpLCBRRkMoMHg2MTFkNThhMiksIFFGQygweGZlMzEwNjU3KSwgUUZDKDB4MDBiOGZlMGQpLAotICBRRkMoMHhmZmY2ODFkNiksIFFGQygweDA4Y2I0ZTIzKSwgUUZDKDB4NjIwN2YyMWYpLCBRRkMoMHhmZWU3MjNjNiksIFFGQygweDAwYjgzOTRiKSwKLSAgUUZDKDB4ZmZmOTFmYzkpLCBRRkMoMHgwOGVkZmVhYSksIFFGQygweDYyZWE2NDczKSwgUUZDKDB4ZmY5NmRiOGYpLCBRRkMoMHgwMGI3NGMzNyksCi0gIFFGQygweGZmZmI0MmIwKSwgUUZDKDB4MDkwZWMxZmMpLCBRRkMoMHg2M2M0NTI0MyksIFFGQygweDAwNDBjNDk3KSwgUUZDKDB4MDBiNWM4NjcpLAotICBRRkMoMHhmZmZkZmEyNCksIFFGQygweDA5MmQ3OTcwKSwgUUZDKDB4NjQ5NjQwNjIpLCBRRkMoMHgwMGU0MmZhMiksIFFGQygweDAwYjNkMTVjKSwKLSAgUUZDKDB4MDAwMDcxMzQpLCBRRkMoMHgwOTQ5ZWFhYyksIFFGQygweDY1NWY2M2YxKSwgUUZDKDB4MDE4MTZlMDYpLCBRRkMoMHgwMGIxOTc4ZCksCi0gIFFGQygweDAwMDM5NjA5KSwgUUZDKDB4MDk2M2VkNDYpLCBRRkMoMHg2NjFmZDZiNyksIFFGQygweDAyMTg2YTkyKSwgUUZDKDB4MDBhZjM3NGMpLAotICBRRkMoMHgwMDA2YjFjZiksIFFGQygweDA5N2MxZWU4KSwgUUZDKDB4NjZkNzY3MjQpLCBRRkMoMHgwMmE5OTA5NyksIFFGQygweDAwYWJlNzllKSwKLSAgUUZDKDB4MDAwOWFhM2YpLCBRRkMoMHgwOTkxNDBhNyksIFFGQygweDY3ODVjMjRjKSwgUUZDKDB4MDMzNDM1MzQpLCBRRkMoMHgwMGE4NzM5ZCksCi0gIFFGQygweDAwMGQzMWI1KSwgUUZDKDB4MDlhM2UxNjMpLCBRRkMoMHg2ODJiMzlhMyksIFFGQygweDAzYjhmOGRjKSwgUUZDKDB4MDBhNTIwYmIpLAotICBRRkMoMHgwMDEwYmM2MyksIFFGQygweDA5YjNkNzdmKSwgUUZDKDB4NjhjNzI2OWIpLCBRRkMoMHgwNDM3ZmIwYSksIFFGQygweDAwYTEwMzljKSwKLSAgUUZDKDB4MDAxNDcxZjgpLCBRRkMoMHgwOWMwZTU5ZiksIFFGQygweDY5NTk3MDljKSwgUUZDKDB4MDRiMGFkY2IpLCBRRkMoMHgwMDlkMTBiZiksCi0gIFFGQygweDAwMTg3MDNmKSwgUUZDKDB4MDljYWI5ZjIpLCBRRkMoMHg2OWUyOTc4MyksIFFGQygweDA1MjM3ZjlkKSwgUUZDKDB4MDA5OGI4NTUpLAotICBRRkMoMHgwMDFjMzU0OSksIFFGQygweDA5ZDE5Y2E5KSwgUUZDKDB4NmE2MTljNWUpLCBRRkMoMHgwNTkwYTY3ZCksIFFGQygweDAwOTQyNGM2KSwKLSAgUUZDKDB4MDAyMDY0ZjgpLCBRRkMoMHgwOWQ1MjcwOSksIFFGQygweDZhZDczZThkKSwgUUZDKDB4MDVmN2ZiOTApLCBRRkMoMHgwMDhmNGJmZCksCi0gIFFGQygweDAwMjRkZDUwKSwgUUZDKDB4MDlkNTU2MGIpLCBRRkMoMHg2YjQyYTg2MyksIFFGQygweDA2NTkzOTEyKSwgUUZDKDB4MDA4YTdkZDcpLAotICBRRkMoMHgwMDI5MzcxOCksIFFGQygweDA5ZDFmYTIzKSwgUUZDKDB4NmJhNDYyOWUpLCBRRkMoMHgwNmI1NTljMyksIFFGQygweDAwODVjMjE3KSwKLSAgUUZDKDB4MDAyZDhlNDIpLCBRRkMoMHgwOWNhZWIwZiksIFFGQygweDZiZmJkZDk3KSwgUUZDKDB4MDcwYmJmNTgpLCBRRkMoMHgwMDgwNzk5NCksCi0gIFFGQygweDAwMzI5YWI2KSwgUUZDKDB4MDljMDE4Y2UpLCBRRkMoMHg2YzQ5MjIxNiksIFFGQygweDA3NWNhOTBjKSwgUUZDKDB4MDA3YjM4NzUpLAotICBRRkMoMHgwMDM3NDVmOSksIFFGQygweDA5YjE4YTFkKSwgUUZDKDB4NmM4YzRjNzkpLCBRRkMoMHgwN2E4MTI3ZCksIFFGQygweDAwNzVmZGVkKSwKLSAgUUZDKDB4MDAzYzFmYTQpLCBRRkMoMHgwOTllYzNkYyksIFFGQygweDZjYzU5YmFhKSwgUUZDKDB4MDdlZTUwN2MpLCBRRkMoMHgwMDcwYzhhNSksCi0gIFFGQygweDAwNDEwM2Y1KSwgUUZDKDB4MDk4ODFkYzUpLCBRRkMoMHg2Y2Y0MDczZCksIFFGQygweDA4MmY1NTJlKSwgUUZDKDB4MDA2YjQ3ZmEpLAotICBRRkMoMHgwMDQ2NTM0OCksIFFGQygweDA5NmQwZTIxKSwgUUZDKDB4NmQxODUyMGQpLCBRRkMoMHgwODZiMWVlYyksIFFGQygweDAwNjVmZGU1KSwKLSAgUUZDKDB4MDA0YjZjNDYpLCBRRkMoMHgwOTRkN2VjMiksIFFGQygweDZkMzI3MzBlKSwgUUZDKDB4MDhhMjQ4OTkpLCBRRkMoMHgwMDYwOTBjNCksCi0gIFFGQygweDAwNTBiMTc3KSwgUUZDKDB4MDkyOTllYWQpLCBRRkMoMHg2ZDQxZDk2MyksIFFGQygweDA4ZDNlNDFiKSwgUUZDKDB4MDA1YjUzNzEpLAotICBRRkMoMHgwMDU1ZGJhMSksIFFGQygweDA5MDE1NjUxKSwgUUZDKDB4NmQ0NzRlMWQpLCBRRkMoMHgwOTAxNTY1MSksIFFGQygweDAwNTVkYmExKSwKLSAgUUZDKDB4ZmU0ZDFiZTMpLCBRRkMoMHhkMWM1OGFjZSksIFFGQygweDJlM2E3NTMyKSwgUUZDKDB4MDFiMmU0MWQpLCBRRkMoMHgwMDAwMDAwMCksCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfUEZUIHFtZl9wZmlsdDEyMFtdID0geworICAgIFFGQygweDAwMDAwMDAwKSwgUUZDKDB4MDFiMmU0MWQpLCBRRkMoMHgyZTNhNzUzMiksIFFGQygweGQxYzU4YWNlKSwKKyAgICBRRkMoMHhmZTRkMWJlMyksIFFGQygweGZmZWZjZGI1KSwgUUZDKDB4MDI4MjhlMTMpLCBRRkMoMHgzNWVlY2ZkMSksCisgICAgUUZDKDB4ZDk0ZTUzZTMpLCBRRkMoMHhmZWZkZmU0MiksIFFGQygweGZmZWMzMGIwKSwgUUZDKDB4MDM2YjhlMjApLAorICAgIFFGQygweDNkYWE3YzVjKSwgUUZDKDB4ZTA4YjNmYTYpLCBRRkMoMHhmZjhmMzNmYyksIFFGQygweGZmZTg4YmE4KSwKKyAgICBRRkMoMHgwNDY5NDEwMSksIFFGQygweDQ1NDdkYWViKSwgUUZDKDB4ZTc1ZjhiYjcpLCBRRkMoMHgwMDAwZTc5MCksCisgICAgUUZDKDB4ZmZlNjkxNTApLCBRRkMoMHgwNTczNDFiYyksIFFGQygweDRjOWVmNTBmKSwgUUZDKDB4ZWRiMGZkYmQpLAorICAgIFFGQygweDAwNTQ5Yzc2KSwgUUZDKDB4ZmZlNmRiNDMpLCBRRkMoMHgwNjdlZjk1MSksIFFGQygweDUzODlkMWJiKSwKKyAgICBRRkMoMHhmMzZkYmZlNiksIFFGQygweDAwOGNiZTkyKSwgUUZDKDB4ZmZlYTM1M2EpLCBRRkMoMHgwNzdmZWRiMyksCisgICAgUUZDKDB4NTllMmY2OWUpLCBRRkMoMHhmODg3NTA3YyksIFFGQygweDAwYWNiZDJmKSwgUUZDKDB4ZmZmMTc2ZTEpLAorICAgIFFGQygweDA4NjY4NWE0KSwgUUZDKDB4NWY4NDU5MTQpLCBRRkMoMHhmY2YyYjZjOCksIFFGQygweDAwYjg4MWRiKSwKKyAgICBRRkMoMHhmZmZkMTI1MyksIFFGQygweDA5MjMzYzQ5KSwgUUZDKDB4NjQ1MDQ2NTgpLCBRRkMoMHgwMGFkYjY5ZSksCisgICAgUUZDKDB4MDBiNDc5MGEpLCBRRkMoMHgwMDBkMzFiNSksIFFGQygweDA5YTNlMTYzKSwgUUZDKDB4NjgyYjM5YTQpLAorICAgIFFGQygweDAzYjhmOGRjKSwgUUZDKDB4MDBhNTIwYmIpLCBRRkMoMHgwMDIxZTI2YiksIFFGQygweDA5ZDUzNmI0KSwKKyAgICBRRkMoMHg2YWZiMGM4MCksIFFGQygweDA2MTg2NTY2KSwgUUZDKDB4MDA4ZGIxZjApLCBRRkMoMHgwMDNhODFjMCksCisgICAgUUZDKDB4MDlhNTA1ZjIpLCBRRkMoMHg2Y2IyODE0NSksIFFGQygweDA3ZDZlNjdjKSwgUUZDKDB4MDA3Mjg1MTIpLAorICAgIFFGQygweDAwNTVkYmExKSwgUUZDKDB4MDkwMTU2NTEpLCBRRkMoMHg2ZDQ3NGUxZCksIFFGQygweDA5MDE1NjUxKSwKKyAgICBRRkMoMHgwMDU1ZGJhMSksIFFGQygweGZlNGQxYmUzKSwgUUZDKDB4ZDFjNThhY2UpLCBRRkMoMHgyZTNhNzUzMiksCisgICAgUUZDKDB4MDFiMmU0MWQpLCBRRkMoMHgwMDAwMDAwMCksCiB9OwogCiBSQU1fQUxJR04KIExOS19TRUNUSU9OX0NPTlNUREFUQQotY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zX2Rvd25zYW1wMzJbXSA9Ci17Ci0gIFFUQygweDdmZDg4NzhlKSwgUVRDKDB4N2U5ZDU1ZmMpLCBRVEMoMHg3YzI5ZmJlZSksIFFUQygweDc4ODQ4NDE0KSwgUVRDKDB4NzNiNWViZDEpLCBRVEMoMHg2ZGNhMGQxNCksIFFUQygweDY2Y2Y4MTIwKSwgUVRDKDB4NWVkNzdjOGEpLAotICBRVEMoMHg1NWY1YTRkMiksIFFUQygweDRjM2ZkZmY0KSwgUVRDKDB4NDFjZTFlNjUpLCBRVEMoMHgzNmJhMjAxNCksIFFUQygweDJiMWYzNGViKSwgUVRDKDB4MWYxOWY5N2IpLCBRVEMoMHgxMmM4MTA2ZiksIFFUQygweDA2NDdkOTdjKSwKLSAgUVRDKDB4ZjliODI2ODQpLCBRVEMoMHhlZDM3ZWY5MSksIFFUQygweGUwZTYwNjg1KSwgUVRDKDB4ZDRlMGNiMTUpLCBRVEMoMHhjOTQ1ZGZlYyksIFFUQygweGJlMzFlMTliKSwgUVRDKDB4YjNjMDIwMGMpLCBRVEMoMHhhYTBhNWIyZSksCi0gIFFUQygweGExMjg4Mzc2KSwgUVRDKDB4OTkzMDdlZTApLCBRVEMoMHg5MjM1ZjJlYyksIFFUQygweDhjNGExNDJmKSwgUVRDKDB4ODc3YjdiZWMpLCBRVEMoMHg4M2Q2MDQxMiksIFFUQygweDgxNjJhYTA0KSwgUVRDKDB4ODAyNzc4NzIpLAorY29uc3QgRklYUF9QRlQgcW1mX3BmaWx0MjAwW10gPSB7CisgICAgUUZDKDB4MDAwMDAwMDApLCBRRkMoMHgwMWIyZTQxZCksIFFGQygweDJlM2E3NTMyKSwgUUZDKDB4ZDFjNThhY2UpLAorICAgIFFGQygweGZlNGQxYmUzKSwgUUZDKDB4ZmZlZmQ1ZDkpLCBRRkMoMHgwMjJjMzlhNCksIFFGQygweDMyZDZlNmY2KSwKKyAgICBRRkMoMHhkNjUyNDIxZiksIFFGQygweGZlYmFmZDY0KSwgUUZDKDB4ZmZlZjNkMmUpLCBRRkMoMHgwMmFmMmEzOSksCisgICAgUUZDKDB4Mzc3YjQ0YTYpLCBRRkMoMHhkYWM3ZmY0NyksIFFGQygweGZmMWQ5ZTFmKSwgUUZDKDB4ZmZlZDAzZTkpLAorICAgIFFGQygweDAzM2IwN2ZmKSwgUUZDKDB4M2MxZmM0ZTQpLCBRRkMoMHhkZjIwMjlkNSksIFFGQygweGZmNzRhMzdlKSwKKyAgICBRRkMoMHhmZmVhYjdjYyksIFFGQygweDAzY2YzYWRlKSwgUUZDKDB4NDBiYzEyZjYpLCBRRkMoMHhlMzU0NmNmOCksCisgICAgUUZDKDB4ZmZjMDcwYWYpLCBRRkMoMHhmZmU4OGJhOCksIFFGQygweDA0Njk0MTAxKSwgUUZDKDB4NDU0N2RhZWIpLAorICAgIFFGQygweGU3NWY4YmI3KSwgUUZDKDB4MDAwMGU3OTApLCBRRkMoMHhmZmU3NTQ2ZCksIFFGQygweDA1MDgyNmU2KSwKKyAgICBRRkMoMHg0OWJhMGE0OCksIFFGQygweGViM2FjNjNhKSwgUUZDKDB4MDAzNmFhNWQpLCBRRkMoMHhmZmU2NjY1YyksCisgICAgUUZDKDB4MDVhOTJkNzMpLCBRRkMoMHg0ZTBiMDYwMiksIFFGQygweGVlZTMyM2ZkKSwgUUZDKDB4MDA2MWZkZjkpLAorICAgIFFGQygweGZmZTY4NThkKSwgUUZDKDB4MDY0OWUyNmIpLCBRRkMoMHg1MjMyMjVjZiksIFFGQygweGYyNTQ5Y2E3KSwKKyAgICBRRkMoMHgwMDgzODI3NiksIFFGQygweGZmZTdlMGJkKSwgUUZDKDB4MDZlN2NiYTQpLCBRRkMoMHg1NjI3NTk3YyksCisgICAgUUZDKDB4ZjU4YzIzYWUpLCBRRkMoMHgwMDljNDlkZiksIFFGQygweGZmZWEzNTNhKSwgUUZDKDB4MDc3ZmVkYjMpLAorICAgIFFGQygweDU5ZTJmNjllKSwgUUZDKDB4Zjg4NzUwN2MpLCBRRkMoMHgwMGFjYmQyZiksIFFGQygweGZmZWUwYTY0KSwKKyAgICBRRkMoMHgwODBlODNhYyksIFFGQygweDVkNWJhYzVlKSwgUUZDKDB4ZmI0MzJhOGEpLCBRRkMoMHgwMGI1ZTI5NCksCisgICAgUUZDKDB4ZmZmMzVjMGYpLCBRRkMoMHgwODkwNTg5MyksIFFGQygweDYwOGJmN2MxKSwgUUZDKDB4ZmRiZmUyZDgpLAorICAgIFFGQygweDAwYjhkY2Q2KSwgUUZDKDB4ZmZmYTY3ZWQpLCBRRkMoMHgwOTAxYTcwZiksIFFGQygweDYzNmQyNjU3KSwKKyAgICBRRkMoMHhmZmZjY2RjNyksIFFGQygweDAwYjY2Mzg3KSwgUUZDKDB4MDAwMmY1MTIpLCBRRkMoMHgwOTVlYjk4ZSksCisgICAgUUZDKDB4NjVmOTU5NWQpLCBRRkMoMHgwMWZhMzgwZiksIFFGQygweDAwYWZiMGYzKSwgUUZDKDB4MDAwZDMxYjUpLAorICAgIFFGQygweDA5YTNlMTYzKSwgUUZDKDB4NjgyYjM5YTQpLCBRRkMoMHgwM2I4ZjhkYyksIFFGQygweDAwYTUyMGJiKSwKKyAgICBRRkMoMHgwMDE5MzE0MSksIFFGQygweDA5Y2MxYTdkKSwgUUZDKDB4NjlmYmZlZTMpLCBRRkMoMHgwNTM5NTQzMCksCisgICAgUUZDKDB4MDA5N2NlMDUpLCBRRkMoMHgwMDI2OWFkNCksIFFGQygweDA5ZDNmZTE0KSwgUUZDKDB4NmI2OWJmYWYpLAorICAgIFFGQygweDA2N2UxMmYyKSwgUUZDKDB4MDA4ODk5MjQpLCBRRkMoMHgwMDM1NjdkZSksIFFGQygweDA5Yjc1Y2NhKSwKKyAgICBRRkMoMHg2YzcxNmViOSksIFFGQygweDA3ODllODUwKSwgUUZDKDB4MDA3ODE1NTYpLCBRRkMoMHgwMDQ1NDM2YSksCisgICAgUUZDKDB4MDk3Mjc3YTkpLCBRRkMoMHg2ZDExMGZlNCksIFFGQygweDA4NWYyOWM2KSwgUUZDKDB4MDA2NzBjYjYpLAorICAgIFFGQygweDAwNTVkYmExKSwgUUZDKDB4MDkwMTU2NTEpLCBRRkMoMHg2ZDQ3NGUxZCksIFFGQygweDA5MDE1NjUxKSwKKyAgICBRRkMoMHgwMDU1ZGJhMSksIFFGQygweGZlNGQxYmUzKSwgUUZDKDB4ZDFjNThhY2UpLCBRRkMoMHgyZTNhNzUzMiksCisgICAgUUZDKDB4MDFiMmU0MWQpLCBRRkMoMHgwMDAwMDAwMCksCiB9OwogCiBSQU1fQUxJR04KIExOS19TRUNUSU9OX0NPTlNUREFUQQotY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luX2Rvd25zYW1wMzJbXSA9Ci17Ci0gIFFUQygweDA2NDdkOTdjKSwgUVRDKDB4MTJjODEwNmYpLCBRVEMoMHgxZjE5Zjk3YiksIFFUQygweDJiMWYzNGViKSwgUVRDKDB4MzZiYTIwMTQpLCBRVEMoMHg0MWNlMWU2NSksIFFUQygweDRjM2ZkZmY0KSwgUVRDKDB4NTVmNWE0ZDIpLAotICBRVEMoMHg1ZWQ3N2M4YSksIFFUQygweDY2Y2Y4MTIwKSwgUVRDKDB4NmRjYTBkMTQpLCBRVEMoMHg3M2I1ZWJkMSksIFFUQygweDc4ODQ4NDE0KSwgUVRDKDB4N2MyOWZiZWUpLCBRVEMoMHg3ZTlkNTVmYyksIFFUQygweDdmZDg4NzhlKSwKLSAgUVRDKDB4N2ZkODg3OGUpLCBRVEMoMHg3ZTlkNTVmYyksIFFUQygweDdjMjlmYmVlKSwgUVRDKDB4Nzg4NDg0MTQpLCBRVEMoMHg3M2I1ZWJkMSksIFFUQygweDZkY2EwZDE0KSwgUVRDKDB4NjZjZjgxMjApLCBRVEMoMHg1ZWQ3N2M4YSksCi0gIFFUQygweDU1ZjVhNGQyKSwgUVRDKDB4NGMzZmRmZjQpLCBRVEMoMHg0MWNlMWU2NSksIFFUQygweDM2YmEyMDE0KSwgUVRDKDB4MmIxZjM0ZWIpLCBRVEMoMHgxZjE5Zjk3YiksIFFUQygweDEyYzgxMDZmKSwgUVRDKDB4MDY0N2Q5N2MpLAorY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zNDBbXSA9IHsKKyAgICBRVEMoMHg3ZmVmNTI2MCksIFFUQygweDdmNjlmZjc2KSwgUVRDKDB4N2U1ZmU0OTMpLCBRVEMoMHg3Y2QyMTcwNyksCisgICAgUVRDKDB4N2FjMjM1NjEpLCBRVEMoMHg3ODMyNjVjMCksIFFUQygweDc1MjU1MzkyKSwgUVRDKDB4NzE5ZTJjZDIpLAorICAgIFFUQygweDZkYTA5ZWIxKSwgUVRDKDB4NjkzMGQxYzQpLCBRVEMoMHg2NDUzNjViMiksIFFUQygweDVmMGQ2YzViKSwKKyAgICBRVEMoMHg1OTY0NjQ5OCksIFFUQygweDUzNWUzNDc5KSwgUVRDKDB4NGQwMTIzMjQpLCBRVEMoMHg0NjUzZDI0YiksCisgICAgUVRDKDB4M2Y1ZDM3M2UpLCBRVEMoMHgzODI0OTNiMCksIFFUQygweDMwYjE2ZTIzKSwgUVRDKDB4MjkwYjhhMTIpLAorICAgIFFUQygweDIxM2FkZmRhKSwgUVRDKDB4MTk0Nzk0NmMpLCBRVEMoMHgxMTM5ZjBjZiksIFFUQygweDA5MWE1OTdlKSwKKyAgICBRVEMoMHgwMGYxNDVhYiksIFFUQygweGY4YzczNjY4KSwgUVRDKDB4ZjBhNGFkY2YpLCBRVEMoMHhlODkyMjYyMiksCisgICAgUVRDKDB4ZTA5ODA4ZjUpLCBRVEMoMHhkOGJlYTY2YSksIFFUQygweGQxMGUyYzg5KSwgUVRDKDB4Yzk4ZTllYjUpLAorICAgIFFUQygweGMyNDdjZDVhKSwgUVRDKDB4YmI0MTRkYzApLCBRVEMoMHhiNDgyNzIyOCksIFFUQygweGFlMTI0MjJjKSwKKyAgICBRVEMoMHhhN2Y3NzM2YSksIFFUQygweGEyMzg2Mjg0KSwgUVRDKDB4OWNkYjBjODMpLCBRVEMoMHg5N2U1MDg5NiksCiB9OwogCi0jZWxzZSAvKiBRTUZfTk9fUE9MWSA9PSA1ICovCi0jZW5kaWYgLyogUU1GX05PX1BPTFk9PTUgKi8KK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW40MFtdID0geworICAgIFFUQygweDA0MTU1ODNiKSwgUVRDKDB4MGMzYmM3NGYpLCBRVEMoMHgxNDU1NzZiMSksIFFUQygweDFjNTlmNTU3KSwKKyAgICBRVEMoMHgyNDQwZTg0ZCksIFFUQygweDJjMDIxMzY5KSwgUVRDKDB4MzM5NTYxZTEpLCBRVEMoMHgzYWYyZWViNyksCisgICAgUVRDKDB4NDIxMzBjZjApLCBRVEMoMHg0OGVlNGY5OCksIFFUQygweDRmN2Q5MTdjKSwgUVRDKDB4NTViOWZjOWUpLAorICAgIFFUQygweDViOWQxMTU0KSwgUVRDKDB4NjEyMGFkMGQpLCBRVEMoMHg2NjNmMTBiNyksIFFUQygweDZhZjJlNmJjKSwKKyAgICBRVEMoMHg2ZjM3NDg5MSksIFFUQygweDczMDdjM2QwKSwgUVRDKDB4NzY2MDVlZGIpLCBRVEMoMHg3OTNkOWQwMyksCisgICAgUVRDKDB4N2I5YzgyMjYpLCBRVEMoMHg3ZDdhOTVjZiksIFFUQygweDdlZDVlNWM2KSwgUVRDKDB4N2ZhZDA4MWIpLAorICAgIFFUQygweDdmZmYxYzliKSwgUVRDKDB4N2ZjYmNkYmMpLCBRVEMoMHg3ZjEzNTBmOCksIFFUQygweDdkZDY2NjhmKSwKKyAgICBRVEMoMHg3YzE2NThjNSksIFFUQygweDc5ZDRmYTg5KSwgUVRDKDB4NzcxNGE1OGIpLCBRVEMoMHg3M2Q4MzdjYSksCisgICAgUVRDKDB4NzAyMzEwOWEpLCBRVEMoMHg2YmY5MGQxZCksIFFUQygweDY3NWU4NDNlKSwgUVRDKDB4NjI1ODQyMmMpLAorICAgIFFUQygweDVjZWI4MzU1KSwgUVRDKDB4NTcxZGVlZmEpLCBRVEMoMHg1MGY1OTE0MSksIFFUQygweDRhNzhkNGYwKSwKK307CiAKKy8qIFRoaXMgZmlsdGVyIGlzIHNjYWxlZCAoMC44KnBmaWx0KSAqLworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfUEZUIHFtZl9wZmlsdDQwMFtdID0geworICAgIFFGQygweDAwMDAwMDAwKSwgUUZDKDB4MDE1YmU5YjEpLCBRRkMoMHgyNGZiOTBmNSksIFFGQygweGRiMDQ2ZjBiKSwKKyAgICBRRkMoMHhmZWE0MTY0ZiksIFFGQygweGZmZjE1ZWQ2KSwgUUZDKDB4MDE4YjUzYTgpLCBRRkMoMHgyNmQyYmQ0ZSksCisgICAgUUZDKDB4ZGNkODEyZjkpLCBRRkMoMHhmZWQxMjU5NSksIFFGQygweGZmZjMxMTdiKSwgUUZDKDB4MDFiY2ZhZTkpLAorICAgIFFGQygweDI4YWJlYmY4KSwgUUZDKDB4ZGVhODM0ZTUpLCBRRkMoMHhmZWZiZmRlYSksIFFGQygweGZmZjMyZTUzKSwKKyAgICBRRkMoMHgwMWYwNzVkZSksIFFGQygweDJhODZlNTQwKSwgUUZDKDB4ZTA3MzgzYzMpLCBRRkMoMHhmZjI0OTM2ZSksCisgICAgUUZDKDB4ZmZmMjk3NTgpLCBRRkMoMHgwMjI1YmI2MSksIFFGQygweDJjNjI5ZDUxKSwgUUZDKDB4ZTIzOTk5MDUpLAorICAgIFFGQygweGZmNGFlNGU2KSwgUUZDKDB4ZmZmMWFiNzMpLCBRRkMoMHgwMjVjYjZkNyksIFFGQygweDJlM2U2OWY5KSwKKyAgICBRRkMoMHhlM2ZhMTNmYyksIFFGQygweGZmNmVlZmQ0KSwgUUZDKDB4ZmZmMGNmZWQpLCBRRkMoMHgwMjk1YTAwMCksCisgICAgUUZDKDB4MzAxOTZhNTApLCBRRkMoMHhlNWIzNTRhYiksIFFGQygweGZmOTA4MmNiKSwgUUZDKDB4ZmZlZmQ0NDIpLAorICAgIFFGQygweDAyZDAxZDYxKSwgUUZDKDB4MzFmMmI2YWMpLCBRRkMoMHhlNzY1ZGFkYyksIFFGQygweGZmYjAwMzdmKSwKKyAgICBRRkMoMHhmZmVlZjk3MCksIFFGQygweDAzMGMyZjE4KSwgUUZDKDB4MzNjOWE4YzUpLCBRRkMoMHhlOTEwNTcyZCksCisgICAgUUZDKDB4ZmZjZDI2ZjIpLCBRRkMoMHhmZmVlMGY5MSksIFFGQygweDAzNDk0MDg4KSwgUUZDKDB4MzU5Y2U4YmUpLAorICAgIFFGQygweGVhYjI4MjY1KSwgUUZDKDB4ZmZlODEzM2YpLCBRRkMoMHhmZmVkM2M4NiksIFFGQygweDAzODc2NzM0KSwKKyAgICBRRkMoMHgzNzZjYWYyMiksIFFGQygweGVjNGM2ZmM2KSwgUUZDKDB4MDAwMGI5NDApLCBRRkMoMHhmZmVjYjA1ZiksCisgICAgUUZDKDB4MDNjNmIzMmIpLCBRRkMoMHgzOTM2YzE4NiksIFFGQygweGVkZGJmYTRhKSwgUUZDKDB4MDAxNzQzNzIpLAorICAgIFFGQygweGZmZWM0MzhhKSwgUUZDKDB4MDQwNjg1ODUpLCBRRkMoMHgzYWZiM2I2ZCksIFFGQygweGVmNjIzODJmKSwKKyAgICBRRkMoMHgwMDJiYmI3ZSksIFFGQygweGZmZWJjNWM3KSwgUUZDKDB4MDQ0NmFmNGYpLCBRRkMoMHgzY2I5MTU5ZiksCisgICAgUUZDKDB4ZjBkZTM1MTgpLCBRRkMoMHgwMDNlMDcxMyksIFFGQygweGZmZWI4NTE3KSwgUUZDKDB4MDQ4NzU3OGYpLAorICAgIFFGQygweDNlNmYzODAyKSwgUUZDKDB4ZjI0ZjRmZmQpLCBRRkMoMHgwMDRlNjRjNyksIFFGQygweGZmZWI4YjBkKSwKKyAgICBRRkMoMHgwNGM3Y2QwZCksIFFGQygweDQwMWQ3OGQ4KSwgUUZDKDB4ZjNiNjExNGMpLCBRRkMoMHgwMDVjY2Q2MCksCisgICAgUUZDKDB4ZmZlYjllMGEpLCBRRkMoMHgwNTA3ZTg1NSksIFFGQygweDQxYzFiN2Q5KSwgUUZDKDB4ZjUxMDdkNTIpLAorICAgIFFGQygweDAwNjkzNTJiKSwgUUZDKDB4ZmZlYzBjOTcpLCBRRkMoMHgwNTQ3ODllNCksIFFGQygweDQzNWM3NmQyKSwKKyAgICBRRkMoMHhmNjYwMDM4MCksIFFGQygweDAwNzNmZjQ0KSwgUUZDKDB4ZmZlY2IzY2EpLCBRRkMoMHgwNTg2M2M4MyksCisgICAgUUZDKDB4NDRlYzQ3OTYpLCBRRkMoMHhmN2EzNGZiZiksIFFGQygweDAwN2QwN2U1KSwgUUZDKDB4ZmZlZDY1YWUpLAorICAgIFFGQygweDA1YzNiZGRlKSwgUUZDKDB4NDY3MDJhMjgpLCBRRkMoMHhmOGRhNmIyOCksIFFGQygweDAwODQ0NGVmKSwKKyAgICBRRkMoMHhmZmVlOTBmYiksIFFGQygweDA1ZmZmMTVjKSwgUUZDKDB4NDdlOGM1NGMpLCBRRkMoMHhmYTA1ZDlmYyksCisgICAgUUZDKDB4MDA4YTMwZjIpLCBRRkMoMHhmZmVmZmY3OCksIFFGQygweDA2MzlkYjUzKSwgUUZDKDB4NDk1MmFiMWUpLAorICAgIFFGQygweGZiMjNkOTc3KSwgUUZDKDB4MDA4ZTkzMTMpLCBRRkMoMHhmZmYxYTFlYSksIFFGQygweDA2NzIwMmYwKSwKKyAgICBRRkMoMHg0YWFmYmQxOCksIFFGQygweGZjMzViYmEyKSwgUUZDKDB4MDA5MTgyMTApLCBRRkMoMHhmZmYzYTQ1ZiksCisgICAgUUZDKDB4MDZhNzQxYjcpLCBRRkMoMHg0YmZkZmIwNiksIFFGQygweGZkM2FlZTg1KSwgUUZDKDB4MDA5MzUwYjYpLAorICAgIFFGQygweGZmZjVlMzNmKSwgUUZDKDB4MDZkOWUwNzYpLCBRRkMoMHg0ZDNjYzYzNCksIFFGQygweGZlMzMxYmUwKSwKKyAgICBRRkMoMHgwMDkzZTNkZSksIFFGQygweGZmZjg2N2RlKSwgUUZDKDB4MDcwOTBiNGYpLCBRRkMoMHg0ZTZjYzFiMyksCisgICAgUUZDKDB4ZmYxZjRmZDIpLCBRRkMoMHgwMDkzNjEwOSksIFFGQygweGZmZmI4NjU4KSwgUUZDKDB4MDczNDg1YTUpLAorICAgIFFGQygweDRmOGE4NTEyKSwgUUZDKDB4ZmZmZDcxNmMpLCBRRkMoMHgwMDkxZTkzOSksIFFGQygweGZmZmVjNmFmKSwKKyAgICBRRkMoMHgwNzVjMjE1OSksIFFGQygweDUwOTg2MjI4KSwgUUZDKDB4MDBjZmI1MzYpLCBRRkMoMHgwMDhmN2Y4NSksCisgICAgUUZDKDB4MDAwMjVkYTgpLCBRRkMoMHgwNzdlZmFkOCksIFFGQygweDUxOTQ0NzdlKSwgUUZDKDB4MDE5NGY5YTYpLAorICAgIFFGQygweDAwOGM4ZDhmKSwgUUZDKDB4MDAwNjRlNjMpLCBRRkMoMHgwNzlkNDIzZiksIFFGQygweDUyN2RiNzVlKSwKKyAgICBRRkMoMHgwMjRkOWUxYyksIFFGQygweDAwODg2YjM2KSwgUUZDKDB4MDAwYThlMmEpLCBRRkMoMHgwN2I2NGRlOSksCisgICAgUUZDKDB4NTM1NWM3YjYpLCBRRkMoMHgwMmZhNjBiMCksIFFGQygweDAwODQxYTJmKSwgUUZDKDB4MDAwZjJiNGYpLAorICAgIFFGQygweDA3Yzk1NzA0KSwgUUZDKDB4NTQxOGJkNGEpLCBRRkMoMHgwMzk5ZWI2ZiksIFFGQygweDAwN2VlYTc5KSwKKyAgICBRRkMoMHgwMDE0Mjc2NyksIFFGQygweDA3ZDY3Yjk3KSwgUUZDKDB4NTRjOTk4YjYpLCBRRkMoMHgwNDJkZGNmMyksCisgICAgUUZDKDB4MDA3OTcxOWUpLCBRRkMoMHgwMDE5M2VlOCksIFFGQygweDA3ZGQyN2NmKSwgUUZDKDB4NTU2NjJjOTMpLAorICAgIFFGQygweDA0YjVkYTVjKSwgUUZDKDB4MDA3MzY5YjcpLCBRRkMoMHgwMDFlZTI0MyksIFFGQygweDA3ZGNjYjQ0KSwKKyAgICBRRkMoMHg1NWVlMzJmMiksIFFGQygweDA1MzFhOGMyKSwgUUZDKDB4MDA2ZDQ3NTApLCBRRkMoMHgwMDI0NzFjZSksCisgICAgUUZDKDB4MDdkNTg4ZDkpLCBRRkMoMHg1NjYzMTdhZCksIFFGQygweDA1YTJmZjdhKSwgUUZDKDB4MDA2NmM3YWEpLAorICAgIFFGQygweDAwMmFiOTdmKSwgUUZDKDB4MDdjNWUzZDUpLCBRRkMoMHg1NmMxMjU2MSksIFFGQygweDA2MDdlZDBkKSwKKyAgICBRRkMoMHgwMDYwMTExMiksIFFGQygweDAwMzBlMWFmKSwgUUZDKDB4MDdhZTk2OTgpLCBRRkMoMHg1NzBiZTllOCksCisgICAgUUZDKDB4MDY2MmE3OGEpLCBRRkMoMHgwMDU5NThiYiksIFFGQygweDAwMzc2OTIyKSwgUUZDKDB4MDc4ZWM2MjEpLAorICAgIFFGQygweDU3NDBkOTg0KSwgUUZDKDB4MDZiMjg3ZDEpLCBRRkMoMHgwMDUyNzA5MiksIFFGQygweDAwM2UwNjVjKSwKKyAgICBRRkMoMHgwNzY1Yjc0ZCksIFFGQygweDU3NjA3Y2NiKSwgUUZDKDB4MDZmODE5ZWMpLCBRRkMoMHgwMDRiOTM2MyksCisgICAgUUZDKDB4MDA0NGFmYjQpLCBRRkMoMHgwNzM0NDUwZSksIFFGQygweDU3NmMzZTdlKSwgUUZDKDB4MDczNDQ1MGUpLAorICAgIFFGQygweDAwNDRhZmI0KSwgUUZDKDB4ZmVhNDE2NGYpLCBRRkMoMHhkYjA0NmYwYiksIFFGQygweDI0ZmI5MGY1KSwKKyAgICBRRkMoMHgwMTViZTliMSksIFFGQygweDAwMDAwMDAwKSwKK307CiAKK2NvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczE2W10gPSB7CisgICAgUVRDKDB4N2ZjMjU1OTYpLCBRVEMoMHg3ZGQ2NjY4ZiksIFFUQygweDdhMDVlZWFkKSwgUVRDKDB4NzQ1ZjlkZDEpLAorICAgIFFUQygweDZjZjkzNGZjKSwgUVRDKDB4NjNlZjMyOTApLCBRVEMoMHg1OTY0NjQ5OCksIFFUQygweDRkODE2MmM0KSwKKyAgICBRVEMoMHg0MDczZjIxZCksIFFUQygweDMyNmU1NGM3KSwgUVRDKDB4MjNhNjg4N2YpLCBRVEMoMHgxNDU1NzZiMSksCisgICAgUVRDKDB4MDRiNjE5NWQpLCBRVEMoMHhmNTA0OTdmYiksIFFUQygweGU1N2Q1ZmRhKSwgUVRDKDB4ZDY1YzNiN2IpLAorfTsKK2NvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X3NpbjE2W10gPSB7CisgICAgUVRDKDB4MDdkOTViOWUpLCBRVEMoMHgxNzZkZDlkZSksIFFUQygweDI2YTgyMTg2KSwgUVRDKDB4MzU0ZDkwNTcpLAorICAgIFFUQygweDQzMjVjMTM1KSwgUVRDKDB4NGZmYjY1NGQpLCBRVEMoMHg1YjlkMTE1NCksIFFUQygweDY1ZGRmYmQzKSwKKyAgICBRVEMoMHg2ZTk2YTk5ZCksIFFUQygweDc1YTU4NWNmKSwgUVRDKDB4N2FlZjYzMjMpLCBRVEMoMHg3ZTVmZTQ5MyksCisgICAgUVRDKDB4N2ZlOWNiYzApLCBRVEMoMHg3Zjg3MmJmMyksIFFUQygweDdkMzk4MGVjKSwgUVRDKDB4NzkwOWE5MmQpLAorfTsKIAorUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfUEZUIHFtZl9wZmlsdDI0MFtdID0geworICAgIC8qIEZQIGZpbHRlciBpbXBsZW1lbnRhdGlvbiAqLworICAgIFFGQygweDAwMDAwMDAwKSwgUUZDKDB4MDEyMWVkNjgpLCBRRkMoMHgxZWQxYTM4MCksIFFGQygweGUxMmU1YzgwKSwKKyAgICBRRkMoMHhmZWRlMTI5OCksIFFGQygweGZmZjRiNDM4KSwgUUZDKDB4MDE2NGQ4ZGUpLCBRRkMoMHgyMTYxMDA2NCksCisgICAgUUZDKDB4ZTNiNjRlZjIpLCBRRkMoMHhmZjFiYTFiZSksIFFGQygweGZmZjUzM2NlKSwgUUZDKDB4MDFhYzVlYjgpLAorICAgIFFGQygweDIzZjQ4YThlKSwgUUZDKDB4ZTYzNDM3ZTQpLCBRRkMoMHhmZjUzZmVkNyksIFFGQygweGZmZjQwZWUwKSwKKyAgICBRRkMoMHgwMWY3ZWRiMyksIFFGQygweDI2ODk1ODU1KSwgUUZDKDB4ZThhNWJiNTUpLCBRRkMoMHhmZjg3MWQzMCksCisgICAgUUZDKDB4ZmZmMmNiMjApLCBRRkMoMHgwMjQ3YjQxNSksIFFGQygweDI5MWM1MmU0KSwgUUZDKDB4ZWIwNzdmYzcpLAorICAgIFFGQygweGZmYjRjZDUzKSwgUUZDKDB4ZmZmMThhMjIpLCBRRkMoMHgwMjliMDcwZSksIFFGQygweDJiYWEyOWFiKSwKKyAgICBRRkMoMHhlZDU3ZGExNSksIFFGQygweGZmZGQ0ZGYxKSwgUUZDKDB4ZmZmMDVkMWIpLCBRRkMoMHgwMmYwZDYwMCksCisgICAgUUZDKDB4MmUyZmU3NTUpLCBRRkMoMHhlZjk1MDdkNSksIFFGQygweDAwMDA5YTYwKSwgUUZDKDB4ZmZlZmFjMzYpLAorICAgIFFGQygweDAzNDhmY2JjKSwgUUZDKDB4MzBhOThjMWMpLCBRRkMoMHhmMWJiYThmMiksIFFGQygweDAwMWVlZDRjKSwKKyAgICBRRkMoMHhmZmVmMGI4YiksIFFGQygweDAzYTIyYmQyKSwgUUZDKDB4MzMxNGEzNzIpLCBRRkMoMHhmM2NiNTNkNSksCisgICAgUUZDKDB4MDAzODY4NGUpLCBRRkMoMHhmZmVlZjNlMCksIFFGQygweDAzZmJkNThiKSwgUUZDKDB4MzU2ZGU0YWIpLAorICAgIFFGQygweGY1YzI2M2MwKSwgUUZDKDB4MDA0ZDU1ZDApLCBRRkMoMHhmZmVmM2NkOCksIFFGQygweDA0NTRhNjM3KSwKKyAgICBRRkMoMHgzN2IxMzY3MiksIFFGQygweGY3OWU3ZmViKSwgUUZDKDB4MDA1ZGQ0NjEpLCBRRkMoMHhmZmYwMTYxOSksCisgICAgUUZDKDB4MDRhYmI5YzApLCBRRkMoMHgzOWRjNWMwMCksIFFGQygweGY5NWY5Mjc5KSwgUUZDKDB4MDA2YTViNGQpLAorICAgIFFGQygweGZmZjE3OGQyKSwgUUZDKDB4MDRmZmYzY2IpLCBRRkMoMHgzYmVjYTQ1NSksIFFGQygweGZiMDRlMDUwKSwKKyAgICBRRkMoMHgwMDczMjhjYSksIFFGQygweGZmZjM5MGYwKSwgUUZDKDB4MDU0ZmExZGMpLCBRRkMoMHgzZGRkNjY4ZSksCisgICAgUUZDKDB4ZmM4Yzc1NTApLCBRRkMoMHgwMDc4OGYxNiksIFFGQygweGZmZjY0ZjQwKSwgUUZDKDB4MDU5OWFlNmIpLAorICAgIFFGQygweDNmYWQ5MGM3KSwgUUZDKDB4ZmRmNzI0ODUpLCBRRkMoMHgwMDdiMDEzYyksIFFGQygweGZmZjlhYmU0KSwKKyAgICBRRkMoMHgwNWRjZGVjMCksIFFGQygweDQxNWFhMTU1KSwgUUZDKDB4ZmY0NGMyODQpLCBRRkMoMHgwMDdhZDBkZCksCisgICAgUUZDKDB4ZmZmZTBjMzcpLCBRRkMoMHgwNjE3N2Q4NyksIFFGQygweDQyZTAyZjAwKSwgUUZDKDB4MDA3M2NmMTQpLAorICAgIFFGQygweDAwNzg1MGIyKSwgUUZDKDB4MDAwMzE0ZGQpLCBRRkMoMHgwNjQ3ZmU4YiksIFFGQygweDQ0M2UwNDcyKSwKKyAgICBRRkMoMHgwMTg1ZGRiNyksIFFGQygweDAwNzQxMzI4KSwgUUZDKDB4MDAwOGNiY2UpLCBRRkMoMHgwNjZkNDBlYiksCisgICAgUUZDKDB4NDU3MjI2NTUpLCBRRkMoMHgwMjdiNTA5MyksIFFGQygweDAwNmUxNWQyKSwgUUZDKDB4MDAwZjY3YTgpLAorICAgIFFGQygweDA2ODRmNzcyKSwgUUZDKDB4NDY3ODk1MzkpLCBRRkMoMHgwMzUzN2JjOSksIFFGQygweDAwNjZjNzZkKSwKKyAgICBRRkMoMHgwMDE2OTZmMiksIFFGQygweDA2OGUyNDdjKSwgUUZDKDB4NDc1MjA4NTUpLCBRRkMoMHgwNDEwNDM5OSksCisgICAgUUZDKDB4MDA1ZTc2YTApLCBRRkMoMHgwMDFlNWVkNyksIFFGQygweDA2ODc0NzYwKSwgUUZDKDB4NDdmZDNlNTUpLAorICAgIFFGQygweDA0YjI3ZjkwKSwgUUZDKDB4MDA1NWE2NjMpLCBRRkMoMHgwMDI3MDEyYiksIFFGQygweDA2NmUwM2Y5KSwKKyAgICBRRkMoMHg0ODc3MDBjNyksIFFGQygweDA1MzllZWZjKSwgUUZDKDB4MDA0YzU4YjcpLCBRRkMoMHgwMDMwMDQyZiksCisgICAgUUZDKDB4MDY0MWIwYWIpLCBRRkMoMHg0OGMwYWZjNyksIFFGQygweDA1YTkwMTcyKSwgUUZDKDB4MDA0MmM5ZTcpLAorICAgIFFGQygweDAwMzkzZDE2KSwgUUZDKDB4MDYwMGU0MzUpLCBRRkMoMHg0OGRhMzQwMCksIFFGQygweDA2MDBlNDM1KSwKKyAgICBRRkMoMHgwMDM5M2QxNiksIFFGQygweGZlZGUxMjk4KSwgUUZDKDB4ZTEyZTVjODApLCBRRkMoMHgxZWQxYTM4MCksCisgICAgUUZDKDB4MDEyMWVkNjgpLCBRRkMoMHgwMDAwMDAwMCksCit9OwogCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zMjRbXSA9IHsKKyAgICBRVEMoMHg3ZmRlZDUzMCksIFFUQygweDdlZDVlNWM2KSwgUVRDKDB4N2NjNjJiZGYpLCBRVEMoMHg3OWIzZWNlMCksCisgICAgUVRDKDB4NzVhNTg1Y2YpLCBRVEMoMHg3MGEzNWUyNSksIFFUQygweDZhYjdkNjYzKSwgUVRDKDB4NjNlZjMyOTApLAorICAgIFFUQygweDVjNTc4MGQzKSwgUVRDKDB4NTQwMDdjNTEpLCBRVEMoMHg0YWZiNmM5OCksIFFUQygweDQxNWIwMWNlKSwKKyAgICBRVEMoMHgzNzMzMmRmZCksIFFUQygweDJjOThmYmJhKSwgUVRDKDB4MjFhMjYyOTUpLCBRVEMoMHgxNjY2MTk4ZCksCisgICAgUVRDKDB4MGFmYjY4MDUpLCBRVEMoMHhmZjc5ZjU4NyksIFFUQygweGYzZjk5OGMwKSwgUVRDKDB4ZTg5MjI2MjIpLAorICAgIFFUQygweGRkNWIzZTdiKSwgUVRDKDB4ZDI2YzFlMDgpLCBRVEMoMHhjN2RiNmM1MCksIFFUQygweGJkYmYwZDJmKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW4yNFtdID0geworICAgIFFUQygweDA1YzFmNGU3KSwgUVRDKDB4MTEzOWYwY2YpLCBRVEMoMHgxYzhlM2JiZSksIFFUQygweDI3YTc1Yzk1KSwKKyAgICBRVEMoMHgzMjZlNTRjNyksIFFUQygweDNjY2NkMDA0KSwgUVRDKDB4NDZhZDUyNzgpLCBRVEMoMHg0ZmZiNjU0ZCksCisgICAgUVRDKDB4NThhM2MxMTgpLCBRVEMoMHg2MDk0NzVjMyksIFFUQygweDY3YmQwZmJkKSwgUVRDKDB4NmUwZWJhMGMpLAorICAgIFFUQygweDczN2M1ZDBiKSwgUVRDKDB4NzdmYWI5ODkpLCBRVEMoMHg3YjgwODAxNSksIFFUQygweDdlMDY2NDRjKSwKKyAgICBRVEMoMHg3Zjg3MmJmMyksIFFUQygweDdmZmZiOWQxKSwgUVRDKDB4N2Y2ZjE0MWYpLCBRVEMoMHg3ZGQ2NjY4ZiksCisgICAgUVRDKDB4N2IzOGZmZGUpLCBRVEMoMHg3NzljNGFmYyksIFFUQygweDczMDdjM2QwKSwgUVRDKDB4NmQ4NGU3YjcpLAorfTsKKworLyogcW1mX3BmaWx0NjQwIGlzIHVzZWQgd2l0aCBzdHJpZGUgMiBpbnN0ZWFkIG9mIHFtZl9wZmlsdDMyMFtdICovCisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3MzMltdID0geworICAgIFFUQygweDdmZTljYmMwKSwgUVRDKDB4N2YzODU3ZjYpLCBRVEMoMHg3ZGQ2NjY4ZiksIFFUQygweDdiYzVlMjkwKSwKKyAgICBRVEMoMHg3OTA5YTkyZCksIFFUQygweDc1YTU4NWNmKSwgUVRDKDB4NzE5ZTJjZDIpLCBRVEMoMHg2Y2Y5MzRmYyksCisgICAgUVRDKDB4NjdiZDBmYmQpLCBRVEMoMHg2MWYxMDAzZiksIFFUQygweDViOWQxMTU0KSwgUVRDKDB4NTRjYTBhNGIpLAorICAgIFFUQygweDRkODE2MmM0KSwgUVRDKDB4NDVjZDM1OGYpLCBRVEMoMHgzZGI4MzJhNiksIFFUQygweDM1NGQ5MDU3KSwKKyAgICBRVEMoMHgyYzk4ZmJiYSksIFFUQygweDIzYTY4ODdmKSwgUVRDKDB4MWE4MmEwMjYpLCBRVEMoMHgxMTM5ZjBjZiksCisgICAgUVRDKDB4MDdkOTViOWUpLCBRVEMoMHhmZTZkZTJlMCksIFFUQygweGY1MDQ5N2ZiKSwgUVRDKDB4ZWJhYTg5NGYpLAorICAgIFFUQygweGUyNmNiMDFiKSwgUVRDKDB4ZDk1N2RlN2EpLCBRVEMoMHhkMDc4YWQ5ZSksIFFUQygweGM3ZGI2YzUwKSwKKyAgICBRVEMoMHhiZjhjMGRlMyksIFFUQygweGI3OTYxOTliKSwgUVRDKDB4YjAwNDlhYjMpLCBRVEMoMHhhOGUyMTEwNiksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luMzJbXSA9IHsKKyAgICBRVEMoMHgwNGI2MTk1ZCksIFFUQygweDBlMWJjMmU0KSwgUVRDKDB4MTc2ZGQ5ZGUpLCBRVEMoMHgyMDlmNzAxYyksCisgICAgUVRDKDB4MjlhM2M0ODUpLCBRVEMoMHgzMjZlNTRjNyksIFFUQygweDNhZjJlZWI3KSwgUVRDKDB4NDMyNWMxMzUpLAorICAgIFFUQygweDRhZmI2Yzk4KSwgUVRDKDB4NTI2OTEyNmUpLCBRVEMoMHg1OTY0NjQ5OCksIFFUQygweDVmZTNiMzhkKSwKKyAgICBRVEMoMHg2NWRkZmJkMyksIFFUQygweDZiNGFmMjc5KSwgUVRDKDB4NzAyMzEwOWEpLCBRVEMoMHg3NDVmOWRkMSksCisgICAgUVRDKDB4NzdmYWI5ODkpLCBRVEMoMHg3YWVmNjMyMyksIFFUQygweDdkMzk4MGVjKSwgUVRDKDB4N2VkNWU1YzYpLAorICAgIFFUQygweDdmYzI1NTk2KSwgUVRDKDB4N2ZmZDg4NWEpLCBRVEMoMHg3Zjg3MmJmMyksIFFUQygweDdlNWZlNDkzKSwKKyAgICBRVEMoMHg3Yzg5NGJkZSksIFFUQygweDdhMDVlZWFkKSwgUVRDKDB4NzZkOTQ5ODkpLCBRVEMoMHg3MzA3YzNkMCksCisgICAgUVRDKDB4NmU5NmE5OWQpLCBRVEMoMHg2OThjMjQ2YyksIFFUQygweDYzZWYzMjkwKSwgUVRDKDB4NWRjNzlkN2MpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2Nvc19kb3duc2FtcDMyW10gPSB7CisgICAgUVRDKDB4N2ZkODg3OGUpLCBRVEMoMHg3ZTlkNTVmYyksIFFUQygweDdjMjlmYmVlKSwgUVRDKDB4Nzg4NDg0MTQpLAorICAgIFFUQygweDczYjVlYmQxKSwgUVRDKDB4NmRjYTBkMTQpLCBRVEMoMHg2NmNmODEyMCksIFFUQygweDVlZDc3YzhhKSwKKyAgICBRVEMoMHg1NWY1YTRkMiksIFFUQygweDRjM2ZkZmY0KSwgUVRDKDB4NDFjZTFlNjUpLCBRVEMoMHgzNmJhMjAxNCksCisgICAgUVRDKDB4MmIxZjM0ZWIpLCBRVEMoMHgxZjE5Zjk3YiksIFFUQygweDEyYzgxMDZmKSwgUVRDKDB4MDY0N2Q5N2MpLAorICAgIFFUQygweGY5YjgyNjg0KSwgUVRDKDB4ZWQzN2VmOTEpLCBRVEMoMHhlMGU2MDY4NSksIFFUQygweGQ0ZTBjYjE1KSwKKyAgICBRVEMoMHhjOTQ1ZGZlYyksIFFUQygweGJlMzFlMTliKSwgUVRDKDB4YjNjMDIwMGMpLCBRVEMoMHhhYTBhNWIyZSksCisgICAgUVRDKDB4YTEyODgzNzYpLCBRVEMoMHg5OTMwN2VlMCksIFFUQygweDkyMzVmMmVjKSwgUVRDKDB4OGM0YTE0MmYpLAorICAgIFFUQygweDg3N2I3YmVjKSwgUVRDKDB4ODNkNjA0MTIpLCBRVEMoMHg4MTYyYWEwNCksIFFUQygweDgwMjc3ODcyKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW5fZG93bnNhbXAzMltdID0geworICAgIFFUQygweDA2NDdkOTdjKSwgUVRDKDB4MTJjODEwNmYpLCBRVEMoMHgxZjE5Zjk3YiksIFFUQygweDJiMWYzNGViKSwKKyAgICBRVEMoMHgzNmJhMjAxNCksIFFUQygweDQxY2UxZTY1KSwgUVRDKDB4NGMzZmRmZjQpLCBRVEMoMHg1NWY1YTRkMiksCisgICAgUVRDKDB4NWVkNzdjOGEpLCBRVEMoMHg2NmNmODEyMCksIFFUQygweDZkY2EwZDE0KSwgUVRDKDB4NzNiNWViZDEpLAorICAgIFFUQygweDc4ODQ4NDE0KSwgUVRDKDB4N2MyOWZiZWUpLCBRVEMoMHg3ZTlkNTVmYyksIFFUQygweDdmZDg4NzhlKSwKKyAgICBRVEMoMHg3ZmQ4ODc4ZSksIFFUQygweDdlOWQ1NWZjKSwgUVRDKDB4N2MyOWZiZWUpLCBRVEMoMHg3ODg0ODQxNCksCisgICAgUVRDKDB4NzNiNWViZDEpLCBRVEMoMHg2ZGNhMGQxNCksIFFUQygweDY2Y2Y4MTIwKSwgUVRDKDB4NWVkNzdjOGEpLAorICAgIFFUQygweDU1ZjVhNGQyKSwgUVRDKDB4NGMzZmRmZjQpLCBRVEMoMHg0MWNlMWU2NSksIFFUQygweDM2YmEyMDE0KSwKKyAgICBRVEMoMHgyYjFmMzRlYiksIFFUQygweDFmMTlmOTdiKSwgUVRDKDB4MTJjODEwNmYpLCBRVEMoMHgwNjQ3ZDk3YyksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9QRlQgcW1mX3BmaWx0NjQwW10gPSB7CisgICAgUUZDKDB4MDAwMDAwMDApLCBRRkMoMHgwMWIyZTQxZCksIFFGQygweDJlM2E3NTMyKSwgUUZDKDB4ZDFjNThhY2UpLAorICAgIFFGQygweGZlNGQxYmUzKSwgUUZDKDB4ZmZlZGU1MGUpLCBRRkMoMHgwMWQ3OGJmYyksIFFGQygweDJmYWEyMjFjKSwKKyAgICBRRkMoMHhkMzMzN2IzZCksIFFGQygweGZlNzBiOGQxKSwgUUZDKDB4ZmZlZDk3OGEpLCBRRkMoMHgwMWZkM2JhMCksCisgICAgUUZDKDB4MzExYWYzYTQpLCBRRkMoMHhkNDlmZDU1ZiksIFFGQygweGZlOTMzZGMwKSwgUUZDKDB4ZmZlZmM5YjkpLAorICAgIFFGQygweDAyMjQ0YTI1KSwgUUZDKDB4MzI4Y2M2ZjApLCBRRkMoMHhkNjBhNDZlNSksIFFGQygweGZlYjQ4ZDBkKSwKKyAgICBRRkMoMHhmZmYwMDY1ZCksIFFGQygweDAyNGJmN2ExKSwgUUZDKDB4MzNmZjY3MGUpLCBRRkMoMHhkNzcyMmYwNCksCisgICAgUUZDKDB4ZmVkNGJlYzMpLCBRRkMoMHhmZmVmZjZjYSksIFFGQygweDAyNzRiYTQzKSwgUUZDKDB4MzU3MmVjNzApLAorICAgIFFGQygweGQ4ZDdmMjFmKSwgUUZDKDB4ZmVmM2Y2YWIpLCBRRkMoMHhmZmVmN2I4YiksIFFGQygweDAyOWUzNWI0KSwKKyAgICBRRkMoMHgzNmU2OTY5MSksIFFGQygweGRhM2IxNzZhKSwgUUZDKDB4ZmYxMjBkNzApLCBRRkMoMHhmZmVlZGZhNCksCisgICAgUUZDKDB4MDJjODk5MDEpLCBRRkMoMHgzODVhNDljNCksIFFGQygweGRiOWI1YjEyKSwgUUZDKDB4ZmYyZWY3MjUpLAorICAgIFFGQygweGZmZWUxNjUwKSwgUUZDKDB4MDJmM2U0OGQpLCBRRkMoMHgzOWNlMDQ3NyksIFFGQygweGRjZjg5OGZiKSwKKyAgICBRRkMoMHhmZjRhYWJjOCksIFFGQygweGZmZWQ2NTFkKSwgUUZDKDB4MDMyMDExMTYpLCBRRkMoMHgzYjQxNTExNSksCisgICAgUUZDKDB4ZGU1MjkwODYpLCBRRkMoMHhmZjY1NDJkMSksIFFGQygweGZmZWNjMzFiKSwgUUZDKDB4MDM0ZDAxZjEpLAorICAgIFFGQygweDNjYjQxMjE5KSwgUUZDKDB4ZGZhOTNhYjUpLCBRRkMoMHhmZjdlZTNmMSksIFFGQygweGZmZWJlNzdiKSwKKyAgICBRRkMoMHgwMzdhZDQzOCksIFFGQygweDNlMjViMTdlKSwgUUZDKDB4ZTBmYzQyMWUpLCBRRkMoMHhmZjk3NWMwMSksCisgICAgUUZDKDB4ZmZlYjUwYjIpLCBRRkMoMHgwM2E5NjZiYyksIFFGQygweDNmOTYyZmI4KSwgUUZDKDB4ZTI0YjhmNjYpLAorICAgIFFGQygweGZmYWVhNWQ2KSwgUUZDKDB4ZmZlYTkxOTIpLCBRRkMoMHgwM2Q4YWZlNiksIFFGQygweDQxMDU4YmM2KSwKKyAgICBRRkMoMHhlMzk2YTQ1ZCksIFFGQygweGZmYzRlMzY1KSwgUUZDKDB4ZmZlOWNhNzYpLCBRRkMoMHgwNDA4M2ZlYyksCisgICAgUUZDKDB4NDI3MmEzODUpLCBRRkMoMHhlNGRlMGNiMCksIFFGQygweGZmZGExN2YyKSwgUUZDKDB4ZmZlOTQwZjQpLAorICAgIFFGQygweDA0Mzg4OWM2KSwgUUZDKDB4NDNkZTYyMGEpLCBRRkMoMHhlNjIwYzQ3NiksIFFGQygweGZmZWUxODNiKSwKKyAgICBRRkMoMHhmZmU4OGJhOCksIFFGQygweDA0Njk0MTAxKSwgUUZDKDB4NDU0N2RhZWIpLCBRRkMoMHhlNzVmOGJiNyksCisgICAgUUZDKDB4MDAwMGU3OTApLCBRRkMoMHhmZmU4M2EwNyksIFFGQygweDA0OWFhODJmKSwgUUZDKDB4NDZhZWE4NTYpLAorICAgIFFGQygweGU4OTk3MWI3KSwgUUZDKDB4MDAxMzFjNzUpLCBRRkMoMHhmZmU3OWUxNiksIFFGQygweDA0Y2MyZmNmKSwKKyAgICBRRkMoMHg0ODEyZjg0OCksIFFGQygweGU5Y2VhODRhKSwgUUZDKDB4MDAyM2I5ODkpLCBRRkMoMHhmZmU3NzQ2ZSksCisgICAgUUZDKDB4MDRmZTIwYmUpLCBRRkMoMHg0OTczZmVmMiksIFFGQygweGVhZmVlN2YxKSwgUUZDKDB4MDAzM2I5MjcpLAorICAgIFFGQygweGZmZTZkNDY2KSwgUUZDKDB4MDUzMDNmODgpLCBRRkMoMHg0YWQyMzdhMiksIFFGQygweGVjMmEzZjVmKSwKKyAgICBRRkMoMHgwMDQyNmYzNiksIFFGQygweGZmZTZhZmVkKSwgUUZDKDB4MDU2MjYyMDkpLCBRRkMoMHg0YzJjYTNkZiksCisgICAgUUZDKDB4ZWQ1MGEzMWQpLCBRRkMoMHgwMDUwNGY0MSksIFFGQygweGZmZTY1NDE2KSwgUUZDKDB4MDU5NTAxMjIpLAorICAgIFFGQygweDRkODM5NzZkKSwgUUZDKDB4ZWU3MWIyZmUpLCBRRkMoMHgwMDVkMzZkZiksIFFGQygweGZmZTY4MWM2KSwKKyAgICBRRkMoMHgwNWM3NmZlZCksIFFGQygweDRlZDYyYmUzKSwgUUZDKDB4ZWY4ZDRkN2IpLCBRRkMoMHgwMDY5MjhhMCksCisgICAgUUZDKDB4ZmZlNjZkZDApLCBRRkMoMHgwNWY5YzA1MSksIFFGQygweDUwMjRkNzBlKSwgUUZDKDB4ZjBhMzk1OWYpLAorICAgIFFGQygweDAwNzQwMGI4KSwgUUZDKDB4ZmZlNjZmYWIpLCBRRkMoMHgwNjJiZjVlYyksIFFGQygweDUxNmVlZmI5KSwKKyAgICBRRkMoMHhmMWI0NjFhYiksIFFGQygweDAwN2UwMzkzKSwgUUZDKDB4ZmZlNjk0MjMpLCBRRkMoMHgwNjVkZDU2YSksCisgICAgUUZDKDB4NTJiNDQ5ZGUpLCBRRkMoMHhmMmJmNmVhNCksIFFGQygweDAwODcyYzYzKSwgUUZDKDB4ZmZlNmZlZDQpLAorICAgIFFGQygweDA2OGY4YjQ0KSwgUUZDKDB4NTNmNDk1YWEpLCBRRkMoMHhmM2M0ZTg4NyksIFFGQygweDAwOGY4N2FhKSwKKyAgICBRRkMoMHhmZmU3NTM2MSksIFFGQygweDA2YzBmMGMwKSwgUUZDKDB4NTUyZjhmZjcpLCBRRkMoMHhmNGM0NzNjNSksCisgICAgUUZDKDB4MDA5NmRjYzIpLCBRRkMoMHhmZmU4MDQxNCksIFFGQygweDA2ZjE4MjVkKSwgUUZDKDB4NTY2NTRiZGQpLAorICAgIFFGQygweGY1YmUwZmE5KSwgUUZDKDB4MDA5ZGE1MjYpLCBRRkMoMHhmZmU4NWI0YSksIFFGQygweDA3MjFiZjIyKSwKKyAgICBRRkMoMHg1Nzk1MDVmNSksIFFGQygweGY2YjFmM2MzKSwgUUZDKDB4MDBhMzUwOGYpLCBRRkMoMHhmZmU5NTRkMCksCisgICAgUUZDKDB4MDc1MTEyYTIpLCBRRkMoMHg1OGJlZmFjZCksIFFGQygweGY3OWZhMTNhKSwgUUZDKDB4MDBhODVlOTQpLAorICAgIFFGQygweGZmZWEzNTNhKSwgUUZDKDB4MDc3ZmVkYjMpLCBRRkMoMHg1OWUyZjY5ZSksIFFGQygweGY4ODc1MDdjKSwKKyAgICBRRkMoMHgwMGFjYmQyZiksIFFGQygweGZmZWIzODQ5KSwgUUZDKDB4MDdhZDhjMjYpLCBRRkMoMHg1YjAwMWRiOCksCisgICAgUUZDKDB4Zjk2OTE2ZjUpLCBRRkMoMHgwMGIwNmI2OCksIFFGQygweGZmZWM4NDA5KSwgUUZDKDB4MDdkYTJiN2YpLAorICAgIFFGQygweDVjMTZkMGFlKSwgUUZDKDB4ZmE0NGEwNjkpLCBRRkMoMHgwMGIzNmFjZCksIFFGQygweGZmZWRjNDE4KSwKKyAgICBRRkMoMHgwODA2MTY3MSksIFFGQygweDVkMjZiZTliKSwgUUZDKDB4ZmIxOWI3YmQpLCBRRkMoMHgwMGI1OGM4ZCksCisgICAgUUZDKDB4ZmZlZjIzOTUpLCBRRkMoMHgwODMwMzg5NyksIFFGQygweDVlMmY2MzY3KSwgUUZDKDB4ZmJlOGY1YmQpLAorICAgIFFGQygweDAwYjczYWIwKSwgUUZDKDB4ZmZmMGU3ZWYpLCBRRkMoMHgwODU5NDg4OCksIFFGQygweDVmMzBmZjVmKSwKKyAgICBRRkMoMHhmY2IxZDc0MCksIFFGQygweDAwYjg1ZjcwKSwgUUZDKDB4ZmZmMjk0YzMpLCBRRkMoMHgwODgwZmZkZCksCisgICAgUUZDKDB4NjAyYjBjN2YpLCBRRkMoMHhmZDc0NzVkOCksIFFGQygweDAwYjhjNmIwKSwgUUZDKDB4ZmZmNDg3MDApLAorICAgIFFGQygweDA4YTc1ZGE0KSwgUUZDKDB4NjExZDU4YTMpLCBRRkMoMHhmZTMxMDY1NyksIFFGQygweDAwYjhmZTBkKSwKKyAgICBRRkMoMHhmZmY2ODFkNiksIFFGQygweDA4Y2I0ZTIzKSwgUUZDKDB4NjIwN2YyMjApLCBRRkMoMHhmZWU3MjNjNiksCisgICAgUUZDKDB4MDBiODM5NGIpLCBRRkMoMHhmZmY5MWZjOSksIFFGQygweDA4ZWRmZWFhKSwgUUZDKDB4NjJlYTY0NzQpLAorICAgIFFGQygweGZmOTZkYjhmKSwgUUZDKDB4MDBiNzRjMzcpLCBRRkMoMHhmZmZiNDJiMCksIFFGQygweDA5MGVjMWZkKSwKKyAgICBRRkMoMHg2M2M0NTI0MyksIFFGQygweDAwNDBjNDk3KSwgUUZDKDB4MDBiNWM4NjcpLCBRRkMoMHhmZmZkZmEyNCksCisgICAgUUZDKDB4MDkyZDc5NzApLCBRRkMoMHg2NDk2NDA2MyksIFFGQygweDAwZTQyZmEyKSwgUUZDKDB4MDBiM2QxNWMpLAorICAgIFFGQygweDAwMDA3MTM0KSwgUUZDKDB4MDk0OWVhYWMpLCBRRkMoMHg2NTVmNjNmMiksIFFGQygweDAxODE2ZTA2KSwKKyAgICBRRkMoMHgwMGIxOTc4ZCksIFFGQygweDAwMDM5NjA5KSwgUUZDKDB4MDk2M2VkNDYpLCBRRkMoMHg2NjFmZDZiOCksCisgICAgUUZDKDB4MDIxODZhOTIpLCBRRkMoMHgwMGFmMzc0YyksIFFGQygweDAwMDZiMWNmKSwgUUZDKDB4MDk3YzFlZTkpLAorICAgIFFGQygweDY2ZDc2NzI1KSwgUUZDKDB4MDJhOTkwOTcpLCBRRkMoMHgwMGFiZTc5ZSksIFFGQygweDAwMDlhYTNmKSwKKyAgICBRRkMoMHgwOTkxNDBhNyksIFFGQygweDY3ODVjMjRkKSwgUUZDKDB4MDMzNDM1MzQpLCBRRkMoMHgwMGE4NzM5ZCksCisgICAgUUZDKDB4MDAwZDMxYjUpLCBRRkMoMHgwOWEzZTE2MyksIFFGQygweDY4MmIzOWE0KSwgUUZDKDB4MDNiOGY4ZGMpLAorICAgIFFGQygweDAwYTUyMGJiKSwgUUZDKDB4MDAxMGJjNjMpLCBRRkMoMHgwOWIzZDc4MCksIFFGQygweDY4YzcyNjljKSwKKyAgICBRRkMoMHgwNDM3ZmIwYSksIFFGQygweDAwYTEwMzljKSwgUUZDKDB4MDAxNDcxZjgpLCBRRkMoMHgwOWMwZTU5ZiksCisgICAgUUZDKDB4Njk1OTcwOWQpLCBRRkMoMHgwNGIwYWRjYiksIFFGQygweDAwOWQxMGJmKSwgUUZDKDB4MDAxODcwM2YpLAorICAgIFFGQygweDA5Y2FiOWYyKSwgUUZDKDB4NjllMjk3ODQpLCBRRkMoMHgwNTIzN2Y5ZCksIFFGQygweDAwOThiODU1KSwKKyAgICBRRkMoMHgwMDFjMzU0OSksIFFGQygweDA5ZDE5Y2E5KSwgUUZDKDB4NmE2MTljNWUpLCBRRkMoMHgwNTkwYTY3ZCksCisgICAgUUZDKDB4MDA5NDI0YzYpLCBRRkMoMHgwMDIwNjRmOCksIFFGQygweDA5ZDUyNzA5KSwgUUZDKDB4NmFkNzNlOGUpLAorICAgIFFGQygweDA1ZjdmYjkwKSwgUUZDKDB4MDA4ZjRiZmQpLCBRRkMoMHgwMDI0ZGQ1MCksIFFGQygweDA5ZDU1NjBiKSwKKyAgICBRRkMoMHg2YjQyYTg2NCksIFFGQygweDA2NTkzOTEyKSwgUUZDKDB4MDA4YTdkZDcpLCBRRkMoMHgwMDI5MzcxOCksCisgICAgUUZDKDB4MDlkMWZhMjMpLCBRRkMoMHg2YmE0NjI5ZiksIFFGQygweDA2YjU1OWMzKSwgUUZDKDB4MDA4NWMyMTcpLAorICAgIFFGQygweDAwMmQ4ZTQyKSwgUUZDKDB4MDljYWViMGYpLCBRRkMoMHg2YmZiZGQ5OCksIFFGQygweDA3MGJiZjU4KSwKKyAgICBRRkMoMHgwMDgwNzk5NCksIFFGQygweDAwMzI5YWI2KSwgUUZDKDB4MDljMDE4Y2YpLCBRRkMoMHg2YzQ5MjIxNyksCisgICAgUUZDKDB4MDc1Y2E5MGMpLCBRRkMoMHgwMDdiMzg3NSksIFFGQygweDAwMzc0NWY5KSwgUUZDKDB4MDliMThhMWQpLAorICAgIFFGQygweDZjOGM0YzdhKSwgUUZDKDB4MDdhODEyN2QpLCBRRkMoMHgwMDc1ZmRlZCksIFFGQygweDAwM2MxZmE0KSwKKyAgICBRRkMoMHgwOTllYzNkYyksIFFGQygweDZjYzU5YmFiKSwgUUZDKDB4MDdlZTUwN2MpLCBRRkMoMHgwMDcwYzhhNSksCisgICAgUUZDKDB4MDA0MTAzZjUpLCBRRkMoMHgwOTg4MWRjNSksIFFGQygweDZjZjQwNzNlKSwgUUZDKDB4MDgyZjU1MmUpLAorICAgIFFGQygweDAwNmI0N2ZhKSwgUUZDKDB4MDA0NjUzNDgpLCBRRkMoMHgwOTZkMGUyMiksIFFGQygweDZkMTg1MjBlKSwKKyAgICBRRkMoMHgwODZiMWVlYyksIFFGQygweDAwNjVmZGU1KSwgUUZDKDB4MDA0YjZjNDYpLCBRRkMoMHgwOTRkN2VjMiksCisgICAgUUZDKDB4NmQzMjczMGYpLCBRRkMoMHgwOGEyNDg5OSksIFFGQygweDAwNjA5MGM0KSwgUUZDKDB4MDA1MGIxNzcpLAorICAgIFFGQygweDA5Mjk5ZWFkKSwgUUZDKDB4NmQ0MWQ5NjQpLCBRRkMoMHgwOGQzZTQxYiksIFFGQygweDAwNWI1MzcxKSwKKyAgICBRRkMoMHgwMDU1ZGJhMSksIFFGQygweDA5MDE1NjUxKSwgUUZDKDB4NmQ0NzRlMWQpLCBRRkMoMHgwOTAxNTY1MSksCisgICAgUUZDKDB4MDA1NWRiYTEpLCBRRkMoMHhmZTRkMWJlMyksIFFGQygweGQxYzU4YWNlKSwgUUZDKDB4MmUzYTc1MzIpLAorICAgIFFGQygweDAxYjJlNDFkKSwgUUZDKDB4MDAwMDAwMDApLAorfTsKKworLyogVGhpcyB2YXJpYW50IG9mIHRoZSB0YWJsZSBhYm92ZSBpcyB1c2VkIG9uIHBsYXRmb3JtcywgdGhhdCBoYXZlIHZlY3Rvcml6ZWQKKyAgIGFjY2VzcyB0byB0aGUgdGFibGUgcmVhZGluZyA0IGZpbHRlciBzZXRzIChlYWNoIG9mIDUgY29lZmZpY2llbnRzKSBpbiBhCisgICBibG9jay4gRm9ybWF0OiAxc3Qgcm93ICAgIGZsdFswXSBvZiA0IHNldHMgKGUuZy4gc2V0IDAsIDEsIDIsIDMpIDJuZCByb3cKKyAgIGZsdFsxXSBvZiA0IHNldHMgKGUuZy4gc2V0IDAsIDEsIDIsIDMpIDNyZCByb3cgICAgZmx0WzJdIG9mIDQgc2V0cyAoZS5nLiBzZXQKKyAgIDAsIDEsIDIsIDMpIDR0aCByb3cgICAgZmx0WzNdIG9mIDQgc2V0cyAoZS5nLiBzZXQgMCwgMSwgMiwgMykgNXRoIHJvdworICAgZmx0WzRdIG9mIDQgc2V0cyAoZS5nLiBzZXQgMCwgMSwgMiwgMykgVGhlcmUgYXJlIDMyIGJsb2NrcyBvZiAyMAorICAgY29lZmZpY2llbnRzLCBpbiB0b3RhbCA2NDAuIEVhY2ggb2YgdGhlIHJvd3MgbXVzdCBiZSBhdCBsZWFzdCA2NC1iaXQgYWxpZ25lZAorICAgKHNlZTogUkFNX0FMSUdOKS4KKyovCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorY29uc3QgRklYUF9QRlQgcW1mX3BmaWx0NjQwX3ZlY3RvcltdID0geworICAgIC8qLS0tLS0tLS0tLS0tLSAxIC4uIDQgLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHhGRkVERTUwRSksCisgICAgUUZDKDB4RkZFRDk3OEEpLAorICAgIFFGQygweEZGRUZDOUI5KSwKKyAgICBRRkMoMHhGRkYwMDY1RCksCisgICAgUUZDKDB4MDFENzhCRkMpLAorICAgIFFGQygweDAxRkQzQkEwKSwKKyAgICBRRkMoMHgwMjI0NEEyNSksCisgICAgUUZDKDB4MDI0QkY3QTEpLAorICAgIFFGQygweDJGQUEyMjFDKSwKKyAgICBRRkMoMHgzMTFBRjNBNCksCisgICAgUUZDKDB4MzI4Q0M2RjApLAorICAgIFFGQygweDMzRkY2NzBFKSwKKyAgICBRRkMoMHhEMzMzN0IzRCksCisgICAgUUZDKDB4RDQ5RkQ1NUYpLAorICAgIFFGQygweEQ2MEE0NkU1KSwKKyAgICBRRkMoMHhENzcyMkYwNCksCisgICAgUUZDKDB4RkU3MEI4RDEpLAorICAgIFFGQygweEZFOTMzREMwKSwKKyAgICBRRkMoMHhGRUI0OEQwRCksCisgICAgUUZDKDB4RkVENEJFQzMpLAorICAgIC8qLS0tLS0tLS0tLS0tLSA1IC4uIDggLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHhGRkVGRjZDQSksCisgICAgUUZDKDB4RkZFRjdCOEIpLAorICAgIFFGQygweEZGRUVERkE0KSwKKyAgICBRRkMoMHhGRkVFMTY1MCksCisgICAgUUZDKDB4MDI3NEJBNDMpLAorICAgIFFGQygweDAyOUUzNUI0KSwKKyAgICBRRkMoMHgwMkM4OTkwMSksCisgICAgUUZDKDB4MDJGM0U0OEQpLAorICAgIFFGQygweDM1NzJFQzcwKSwKKyAgICBRRkMoMHgzNkU2OTY5MSksCisgICAgUUZDKDB4Mzg1QTQ5QzQpLAorICAgIFFGQygweDM5Q0UwNDc3KSwKKyAgICBRRkMoMHhEOEQ3RjIxRiksCisgICAgUUZDKDB4REEzQjE3NkEpLAorICAgIFFGQygweERCOUI1QjEyKSwKKyAgICBRRkMoMHhEQ0Y4OThGQiksCisgICAgUUZDKDB4RkVGM0Y2QUIpLAorICAgIFFGQygweEZGMTIwRDcwKSwKKyAgICBRRkMoMHhGRjJFRjcyNSksCisgICAgUUZDKDB4RkY0QUFCQzgpLAorICAgIC8qLS0tLS0tLS0tLS0tLSA5IC4uIDEyIC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4RkZFRDY1MUQpLAorICAgIFFGQygweEZGRUNDMzFCKSwKKyAgICBRRkMoMHhGRkVCRTc3QiksCisgICAgUUZDKDB4RkZFQjUwQjIpLAorICAgIFFGQygweDAzMjAxMTE2KSwKKyAgICBRRkMoMHgwMzREMDFGMSksCisgICAgUUZDKDB4MDM3QUQ0MzgpLAorICAgIFFGQygweDAzQTk2NkJDKSwKKyAgICBRRkMoMHgzQjQxNTExNSksCisgICAgUUZDKDB4M0NCNDEyMTkpLAorICAgIFFGQygweDNFMjVCMTdFKSwKKyAgICBRRkMoMHgzRjk2MkZCOCksCisgICAgUUZDKDB4REU1MjkwODYpLAorICAgIFFGQygweERGQTkzQUI1KSwKKyAgICBRRkMoMHhFMEZDNDIxRSksCisgICAgUUZDKDB4RTI0QjhGNjYpLAorICAgIFFGQygweEZGNjU0MkQxKSwKKyAgICBRRkMoMHhGRjdFRTNGMSksCisgICAgUUZDKDB4RkY5NzVDMDEpLAorICAgIFFGQygweEZGQUVBNUQ2KSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gMTMgLi4gMTYgLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHhGRkVBOTE5MiksCisgICAgUUZDKDB4RkZFOUNBNzYpLAorICAgIFFGQygweEZGRTk0MEY0KSwKKyAgICBRRkMoMHhGRkU4OEJBOCksCisgICAgUUZDKDB4MDNEOEFGRTYpLAorICAgIFFGQygweDA0MDgzRkVDKSwKKyAgICBRRkMoMHgwNDM4ODlDNiksCisgICAgUUZDKDB4MDQ2OTQxMDEpLAorICAgIFFGQygweDQxMDU4QkM2KSwKKyAgICBRRkMoMHg0MjcyQTM4NSksCisgICAgUUZDKDB4NDNERTYyMEEpLAorICAgIFFGQygweDQ1NDdEQUVCKSwKKyAgICBRRkMoMHhFMzk2QTQ1RCksCisgICAgUUZDKDB4RTRERTBDQjApLAorICAgIFFGQygweEU2MjBDNDc2KSwKKyAgICBRRkMoMHhFNzVGOEJCNyksCisgICAgUUZDKDB4RkZDNEUzNjUpLAorICAgIFFGQygweEZGREExN0YyKSwKKyAgICBRRkMoMHhGRkVFMTgzQiksCisgICAgUUZDKDB4MDAwMEU3OTApLAorICAgIC8qLS0tLS0tLS0tLS0tLSAxNyAuLiAyMCAtLS0tLS0tLS0tLS0tLS0qLworICAgIFFGQygweEZGRTgzQTA3KSwKKyAgICBRRkMoMHhGRkU3OUUxNiksCisgICAgUUZDKDB4RkZFNzc0NkUpLAorICAgIFFGQygweEZGRTZENDY2KSwKKyAgICBRRkMoMHgwNDlBQTgyRiksCisgICAgUUZDKDB4MDRDQzJGQ0YpLAorICAgIFFGQygweDA0RkUyMEJFKSwKKyAgICBRRkMoMHgwNTMwM0Y4OCksCisgICAgUUZDKDB4NDZBRUE4NTYpLAorICAgIFFGQygweDQ4MTJGODQ4KSwKKyAgICBRRkMoMHg0OTczRkVGMiksCisgICAgUUZDKDB4NEFEMjM3QTIpLAorICAgIFFGQygweEU4OTk3MUI3KSwKKyAgICBRRkMoMHhFOUNFQTg0QSksCisgICAgUUZDKDB4RUFGRUU3RjEpLAorICAgIFFGQygweEVDMkEzRjVGKSwKKyAgICBRRkMoMHgwMDEzMUM3NSksCisgICAgUUZDKDB4MDAyM0I5ODkpLAorICAgIFFGQygweDAwMzNCOTI3KSwKKyAgICBRRkMoMHgwMDQyNkYzNiksCisgICAgLyotLS0tLS0tLS0tLS0tIDIxIC4uIDI0IC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4RkZFNkFGRUQpLAorICAgIFFGQygweEZGRTY1NDE2KSwKKyAgICBRRkMoMHhGRkU2ODFDNiksCisgICAgUUZDKDB4RkZFNjZERDApLAorICAgIFFGQygweDA1NjI2MjA5KSwKKyAgICBRRkMoMHgwNTk1MDEyMiksCisgICAgUUZDKDB4MDVDNzZGRUQpLAorICAgIFFGQygweDA1RjlDMDUxKSwKKyAgICBRRkMoMHg0QzJDQTNERiksCisgICAgUUZDKDB4NEQ4Mzk3NkQpLAorICAgIFFGQygweDRFRDYyQkUzKSwKKyAgICBRRkMoMHg1MDI0RDcwRSksCisgICAgUUZDKDB4RUQ1MEEzMUQpLAorICAgIFFGQygweEVFNzFCMkZFKSwKKyAgICBRRkMoMHhFRjhENEQ3QiksCisgICAgUUZDKDB4RjBBMzk1OUYpLAorICAgIFFGQygweDAwNTA0RjQxKSwKKyAgICBRRkMoMHgwMDVEMzZERiksCisgICAgUUZDKDB4MDA2OTI4QTApLAorICAgIFFGQygweDAwNzQwMEI4KSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gMjUgLi4gMjggLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHhGRkU2NkZBQiksCisgICAgUUZDKDB4RkZFNjk0MjMpLAorICAgIFFGQygweEZGRTZGRUQ0KSwKKyAgICBRRkMoMHhGRkU3NTM2MSksCisgICAgUUZDKDB4MDYyQkY1RUMpLAorICAgIFFGQygweDA2NURENTZBKSwKKyAgICBRRkMoMHgwNjhGOEI0NCksCisgICAgUUZDKDB4MDZDMEYwQzApLAorICAgIFFGQygweDUxNkVFRkI5KSwKKyAgICBRRkMoMHg1MkI0NDlERSksCisgICAgUUZDKDB4NTNGNDk1QUEpLAorICAgIFFGQygweDU1MkY4RkY3KSwKKyAgICBRRkMoMHhGMUI0NjFBQiksCisgICAgUUZDKDB4RjJCRjZFQTQpLAorICAgIFFGQygweEYzQzRFODg3KSwKKyAgICBRRkMoMHhGNEM0NzNDNSksCisgICAgUUZDKDB4MDA3RTAzOTMpLAorICAgIFFGQygweDAwODcyQzYzKSwKKyAgICBRRkMoMHgwMDhGODdBQSksCisgICAgUUZDKDB4MDA5NkRDQzIpLAorICAgIC8qLS0tLS0tLS0tLS0tLSAyOSAuLiAzMiAtLS0tLS0tLS0tLS0tLS0qLworICAgIFFGQygweEZGRTgwNDE0KSwKKyAgICBRRkMoMHhGRkU4NUI0QSksCisgICAgUUZDKDB4RkZFOTU0RDApLAorICAgIFFGQygweEZGRUEzNTNBKSwKKyAgICBRRkMoMHgwNkYxODI1RCksCisgICAgUUZDKDB4MDcyMUJGMjIpLAorICAgIFFGQygweDA3NTExMkEyKSwKKyAgICBRRkMoMHgwNzdGRURCMyksCisgICAgUUZDKDB4NTY2NTRCREQpLAorICAgIFFGQygweDU3OTUwNUY1KSwKKyAgICBRRkMoMHg1OEJFRkFDRCksCisgICAgUUZDKDB4NTlFMkY2OUUpLAorICAgIFFGQygweEY1QkUwRkE5KSwKKyAgICBRRkMoMHhGNkIxRjNDMyksCisgICAgUUZDKDB4Rjc5RkExM0EpLAorICAgIFFGQygweEY4ODc1MDdDKSwKKyAgICBRRkMoMHgwMDlEQTUyNiksCisgICAgUUZDKDB4MDBBMzUwOEYpLAorICAgIFFGQygweDAwQTg1RTk0KSwKKyAgICBRRkMoMHgwMEFDQkQyRiksCisgICAgLyotLS0tLS0tLS0tLS0tIDMzIC4uIDM2IC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4RkZFQjM4NDkpLAorICAgIFFGQygweEZGRUM4NDA5KSwKKyAgICBRRkMoMHhGRkVEQzQxOCksCisgICAgUUZDKDB4RkZFRjIzOTUpLAorICAgIFFGQygweDA3QUQ4QzI2KSwKKyAgICBRRkMoMHgwN0RBMkI3RiksCisgICAgUUZDKDB4MDgwNjE2NzEpLAorICAgIFFGQygweDA4MzAzODk3KSwKKyAgICBRRkMoMHg1QjAwMURCOCksCisgICAgUUZDKDB4NUMxNkQwQUUpLAorICAgIFFGQygweDVEMjZCRTlCKSwKKyAgICBRRkMoMHg1RTJGNjM2NyksCisgICAgUUZDKDB4Rjk2OTE2RjUpLAorICAgIFFGQygweEZBNDRBMDY5KSwKKyAgICBRRkMoMHhGQjE5QjdCRCksCisgICAgUUZDKDB4RkJFOEY1QkQpLAorICAgIFFGQygweDAwQjA2QjY4KSwKKyAgICBRRkMoMHgwMEIzNkFDRCksCisgICAgUUZDKDB4MDBCNThDOEQpLAorICAgIFFGQygweDAwQjczQUIwKSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gMzcgLi4gNDAgLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHhGRkYwRTdFRiksCisgICAgUUZDKDB4RkZGMjk0QzMpLAorICAgIFFGQygweEZGRjQ4NzAwKSwKKyAgICBRRkMoMHhGRkY2ODFENiksCisgICAgUUZDKDB4MDg1OTQ4ODgpLAorICAgIFFGQygweDA4ODBGRkREKSwKKyAgICBRRkMoMHgwOEE3NURBNCksCisgICAgUUZDKDB4MDhDQjRFMjMpLAorICAgIFFGQygweDVGMzBGRjVGKSwKKyAgICBRRkMoMHg2MDJCMEM3RiksCisgICAgUUZDKDB4NjExRDU4QTMpLAorICAgIFFGQygweDYyMDdGMjIwKSwKKyAgICBRRkMoMHhGQ0IxRDc0MCksCisgICAgUUZDKDB4RkQ3NDc1RDgpLAorICAgIFFGQygweEZFMzEwNjU3KSwKKyAgICBRRkMoMHhGRUU3MjNDNiksCisgICAgUUZDKDB4MDBCODVGNzApLAorICAgIFFGQygweDAwQjhDNkIwKSwKKyAgICBRRkMoMHgwMEI4RkUwRCksCisgICAgUUZDKDB4MDBCODM5NEIpLAorICAgIC8qLS0tLS0tLS0tLS0tLSA0MSAuLiA0NCAtLS0tLS0tLS0tLS0tLS0qLworICAgIFFGQygweEZGRjkxRkM5KSwKKyAgICBRRkMoMHhGRkZCNDJCMCksCisgICAgUUZDKDB4RkZGREZBMjQpLAorICAgIFFGQygweDAwMDA3MTM0KSwKKyAgICBRRkMoMHgwOEVERkVBQSksCisgICAgUUZDKDB4MDkwRUMxRkQpLAorICAgIFFGQygweDA5MkQ3OTcwKSwKKyAgICBRRkMoMHgwOTQ5RUFBQyksCisgICAgUUZDKDB4NjJFQTY0NzQpLAorICAgIFFGQygweDYzQzQ1MjQzKSwKKyAgICBRRkMoMHg2NDk2NDA2MyksCisgICAgUUZDKDB4NjU1RjYzRjIpLAorICAgIFFGQygweEZGOTZEQjhGKSwKKyAgICBRRkMoMHgwMDQwQzQ5NyksCisgICAgUUZDKDB4MDBFNDJGQTIpLAorICAgIFFGQygweDAxODE2RTA2KSwKKyAgICBRRkMoMHgwMEI3NEMzNyksCisgICAgUUZDKDB4MDBCNUM4NjcpLAorICAgIFFGQygweDAwQjNEMTVDKSwKKyAgICBRRkMoMHgwMEIxOTc4RCksCisgICAgLyotLS0tLS0tLS0tLS0tIDQ1IC4uIDQ4IC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4MDAwMzk2MDkpLAorICAgIFFGQygweDAwMDZCMUNGKSwKKyAgICBRRkMoMHgwMDA5QUEzRiksCisgICAgUUZDKDB4MDAwRDMxQjUpLAorICAgIFFGQygweDA5NjNFRDQ2KSwKKyAgICBRRkMoMHgwOTdDMUVFOSksCisgICAgUUZDKDB4MDk5MTQwQTcpLAorICAgIFFGQygweDA5QTNFMTYzKSwKKyAgICBRRkMoMHg2NjFGRDZCOCksCisgICAgUUZDKDB4NjZENzY3MjUpLAorICAgIFFGQygweDY3ODVDMjREKSwKKyAgICBRRkMoMHg2ODJCMzlBNCksCisgICAgUUZDKDB4MDIxODZBOTIpLAorICAgIFFGQygweDAyQTk5MDk3KSwKKyAgICBRRkMoMHgwMzM0MzUzNCksCisgICAgUUZDKDB4MDNCOEY4REMpLAorICAgIFFGQygweDAwQUYzNzRDKSwKKyAgICBRRkMoMHgwMEFCRTc5RSksCisgICAgUUZDKDB4MDBBODczOUQpLAorICAgIFFGQygweDAwQTUyMEJCKSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gNDkgLi4gNTIgLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHgwMDEwQkM2MyksCisgICAgUUZDKDB4MDAxNDcxRjgpLAorICAgIFFGQygweDAwMTg3MDNGKSwKKyAgICBRRkMoMHgwMDFDMzU0OSksCisgICAgUUZDKDB4MDlCM0Q3ODApLAorICAgIFFGQygweDA5QzBFNTlGKSwKKyAgICBRRkMoMHgwOUNBQjlGMiksCisgICAgUUZDKDB4MDlEMTlDQTkpLAorICAgIFFGQygweDY4QzcyNjlDKSwKKyAgICBRRkMoMHg2OTU5NzA5RCksCisgICAgUUZDKDB4NjlFMjk3ODQpLAorICAgIFFGQygweDZBNjE5QzVFKSwKKyAgICBRRkMoMHgwNDM3RkIwQSksCisgICAgUUZDKDB4MDRCMEFEQ0IpLAorICAgIFFGQygweDA1MjM3RjlEKSwKKyAgICBRRkMoMHgwNTkwQTY3RCksCisgICAgUUZDKDB4MDBBMTAzOUMpLAorICAgIFFGQygweDAwOUQxMEJGKSwKKyAgICBRRkMoMHgwMDk4Qjg1NSksCisgICAgUUZDKDB4MDA5NDI0QzYpLAorICAgIC8qLS0tLS0tLS0tLS0tLSA1MyAuLiA1NiAtLS0tLS0tLS0tLS0tLS0qLworICAgIFFGQygweDAwMjA2NEY4KSwKKyAgICBRRkMoMHgwMDI0REQ1MCksCisgICAgUUZDKDB4MDAyOTM3MTgpLAorICAgIFFGQygweDAwMkQ4RTQyKSwKKyAgICBRRkMoMHgwOUQ1MjcwOSksCisgICAgUUZDKDB4MDlENTU2MEIpLAorICAgIFFGQygweDA5RDFGQTIzKSwKKyAgICBRRkMoMHgwOUNBRUIwRiksCisgICAgUUZDKDB4NkFENzNFOEUpLAorICAgIFFGQygweDZCNDJBODY0KSwKKyAgICBRRkMoMHg2QkE0NjI5RiksCisgICAgUUZDKDB4NkJGQkREOTgpLAorICAgIFFGQygweDA1RjdGQjkwKSwKKyAgICBRRkMoMHgwNjU5MzkxMiksCisgICAgUUZDKDB4MDZCNTU5QzMpLAorICAgIFFGQygweDA3MEJCRjU4KSwKKyAgICBRRkMoMHgwMDhGNEJGRCksCisgICAgUUZDKDB4MDA4QTdERDcpLAorICAgIFFGQygweDAwODVDMjE3KSwKKyAgICBRRkMoMHgwMDgwNzk5NCksCisgICAgLyotLS0tLS0tLS0tLS0tIDU3IC4uIDYwIC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4MDAzMjlBQjYpLAorICAgIFFGQygweDAwMzc0NUY5KSwKKyAgICBRRkMoMHgwMDNDMUZBNCksCisgICAgUUZDKDB4MDA0MTAzRjUpLAorICAgIFFGQygweDA5QzAxOENGKSwKKyAgICBRRkMoMHgwOUIxOEExRCksCisgICAgUUZDKDB4MDk5RUMzREMpLAorICAgIFFGQygweDA5ODgxREM1KSwKKyAgICBRRkMoMHg2QzQ5MjIxNyksCisgICAgUUZDKDB4NkM4QzRDN0EpLAorICAgIFFGQygweDZDQzU5QkFCKSwKKyAgICBRRkMoMHg2Q0Y0MDczRSksCisgICAgUUZDKDB4MDc1Q0E5MEMpLAorICAgIFFGQygweDA3QTgxMjdEKSwKKyAgICBRRkMoMHgwN0VFNTA3QyksCisgICAgUUZDKDB4MDgyRjU1MkUpLAorICAgIFFGQygweDAwN0IzODc1KSwKKyAgICBRRkMoMHgwMDc1RkRFRCksCisgICAgUUZDKDB4MDA3MEM4QTUpLAorICAgIFFGQygweDAwNkI0N0ZBKSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gNjEgLi4gNjQgLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHgwMDQ2NTM0OCksCisgICAgUUZDKDB4MDA0QjZDNDYpLAorICAgIFFGQygweDAwNTBCMTc3KSwKKyAgICBRRkMoMHgwMDU1REJBMSksCisgICAgUUZDKDB4MDk2RDBFMjIpLAorICAgIFFGQygweDA5NEQ3RUMyKSwKKyAgICBRRkMoMHgwOTI5OUVBRCksCisgICAgUUZDKDB4MDkwMTU2NTEpLAorICAgIFFGQygweDZEMTg1MjBFKSwKKyAgICBRRkMoMHg2RDMyNzMwRiksCisgICAgUUZDKDB4NkQ0MUQ5NjQpLAorICAgIFFGQygweDZENDc0RTFEKSwKKyAgICBRRkMoMHgwODZCMUVFQyksCisgICAgUUZDKDB4MDhBMjQ4OTkpLAorICAgIFFGQygweDA4RDNFNDFCKSwKKyAgICBRRkMoMHgwOTAxNTY1MSksCisgICAgUUZDKDB4MDA2NUZERTUpLAorICAgIFFGQygweDAwNjA5MEM0KSwKKyAgICBRRkMoMHgwMDVCNTM3MSksCisgICAgUUZDKDB4MDA1NURCQTEpLAorICAgIC8qLS0tLS0tLS0tLS0tLSA2MyAuLiA2MCAtLS0tLS0tLS0tLS0tLS0qLworICAgIFFGQygweDAwNUI1MzcxKSwKKyAgICBRRkMoMHgwMDYwOTBDNCksCisgICAgUUZDKDB4MDA2NUZERTUpLAorICAgIFFGQygweDAwNkI0N0ZBKSwKKyAgICBRRkMoMHgwOEQzRTQxQiksCisgICAgUUZDKDB4MDhBMjQ4OTkpLAorICAgIFFGQygweDA4NkIxRUVDKSwKKyAgICBRRkMoMHgwODJGNTUyRSksCisgICAgUUZDKDB4NkQ0MUQ5NjQpLAorICAgIFFGQygweDZEMzI3MzBGKSwKKyAgICBRRkMoMHg2RDE4NTIwRSksCisgICAgUUZDKDB4NkNGNDA3M0UpLAorICAgIFFGQygweDA5Mjk5RUFEKSwKKyAgICBRRkMoMHgwOTREN0VDMiksCisgICAgUUZDKDB4MDk2RDBFMjIpLAorICAgIFFGQygweDA5ODgxREM1KSwKKyAgICBRRkMoMHgwMDUwQjE3NyksCisgICAgUUZDKDB4MDA0QjZDNDYpLAorICAgIFFGQygweDAwNDY1MzQ4KSwKKyAgICBRRkMoMHgwMDQxMDNGNSksCisgICAgLyotLS0tLS0tLS0tLS0tIDU5IC4uIDU2IC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4MDA3MEM4QTUpLAorICAgIFFGQygweDAwNzVGREVEKSwKKyAgICBRRkMoMHgwMDdCMzg3NSksCisgICAgUUZDKDB4MDA4MDc5OTQpLAorICAgIFFGQygweDA3RUU1MDdDKSwKKyAgICBRRkMoMHgwN0E4MTI3RCksCisgICAgUUZDKDB4MDc1Q0E5MEMpLAorICAgIFFGQygweDA3MEJCRjU4KSwKKyAgICBRRkMoMHg2Q0M1OUJBQiksCisgICAgUUZDKDB4NkM4QzRDN0EpLAorICAgIFFGQygweDZDNDkyMjE3KSwKKyAgICBRRkMoMHg2QkZCREQ5OCksCisgICAgUUZDKDB4MDk5RUMzREMpLAorICAgIFFGQygweDA5QjE4QTFEKSwKKyAgICBRRkMoMHgwOUMwMThDRiksCisgICAgUUZDKDB4MDlDQUVCMEYpLAorICAgIFFGQygweDAwM0MxRkE0KSwKKyAgICBRRkMoMHgwMDM3NDVGOSksCisgICAgUUZDKDB4MDAzMjlBQjYpLAorICAgIFFGQygweDAwMkQ4RTQyKSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gNTUgLi4gNTIgLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHgwMDg1QzIxNyksCisgICAgUUZDKDB4MDA4QTdERDcpLAorICAgIFFGQygweDAwOEY0QkZEKSwKKyAgICBRRkMoMHgwMDk0MjRDNiksCisgICAgUUZDKDB4MDZCNTU5QzMpLAorICAgIFFGQygweDA2NTkzOTEyKSwKKyAgICBRRkMoMHgwNUY3RkI5MCksCisgICAgUUZDKDB4MDU5MEE2N0QpLAorICAgIFFGQygweDZCQTQ2MjlGKSwKKyAgICBRRkMoMHg2QjQyQTg2NCksCisgICAgUUZDKDB4NkFENzNFOEUpLAorICAgIFFGQygweDZBNjE5QzVFKSwKKyAgICBRRkMoMHgwOUQxRkEyMyksCisgICAgUUZDKDB4MDlENTU2MEIpLAorICAgIFFGQygweDA5RDUyNzA5KSwKKyAgICBRRkMoMHgwOUQxOUNBOSksCisgICAgUUZDKDB4MDAyOTM3MTgpLAorICAgIFFGQygweDAwMjRERDUwKSwKKyAgICBRRkMoMHgwMDIwNjRGOCksCisgICAgUUZDKDB4MDAxQzM1NDkpLAorICAgIC8qLS0tLS0tLS0tLS0tLSA1MSAuLiA0OCAtLS0tLS0tLS0tLS0tLS0qLworICAgIFFGQygweDAwOThCODU1KSwKKyAgICBRRkMoMHgwMDlEMTBCRiksCisgICAgUUZDKDB4MDBBMTAzOUMpLAorICAgIFFGQygweDAwQTUyMEJCKSwKKyAgICBRRkMoMHgwNTIzN0Y5RCksCisgICAgUUZDKDB4MDRCMEFEQ0IpLAorICAgIFFGQygweDA0MzdGQjBBKSwKKyAgICBRRkMoMHgwM0I4RjhEQyksCisgICAgUUZDKDB4NjlFMjk3ODQpLAorICAgIFFGQygweDY5NTk3MDlEKSwKKyAgICBRRkMoMHg2OEM3MjY5QyksCisgICAgUUZDKDB4NjgyQjM5QTQpLAorICAgIFFGQygweDA5Q0FCOUYyKSwKKyAgICBRRkMoMHgwOUMwRTU5RiksCisgICAgUUZDKDB4MDlCM0Q3ODApLAorICAgIFFGQygweDA5QTNFMTYzKSwKKyAgICBRRkMoMHgwMDE4NzAzRiksCisgICAgUUZDKDB4MDAxNDcxRjgpLAorICAgIFFGQygweDAwMTBCQzYzKSwKKyAgICBRRkMoMHgwMDBEMzFCNSksCisgICAgLyotLS0tLS0tLS0tLS0tIDQ3IC4uIDQ0IC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4MDBBODczOUQpLAorICAgIFFGQygweDAwQUJFNzlFKSwKKyAgICBRRkMoMHgwMEFGMzc0QyksCisgICAgUUZDKDB4MDBCMTk3OEQpLAorICAgIFFGQygweDAzMzQzNTM0KSwKKyAgICBRRkMoMHgwMkE5OTA5NyksCisgICAgUUZDKDB4MDIxODZBOTIpLAorICAgIFFGQygweDAxODE2RTA2KSwKKyAgICBRRkMoMHg2Nzg1QzI0RCksCisgICAgUUZDKDB4NjZENzY3MjUpLAorICAgIFFGQygweDY2MUZENkI4KSwKKyAgICBRRkMoMHg2NTVGNjNGMiksCisgICAgUUZDKDB4MDk5MTQwQTcpLAorICAgIFFGQygweDA5N0MxRUU5KSwKKyAgICBRRkMoMHgwOTYzRUQ0NiksCisgICAgUUZDKDB4MDk0OUVBQUMpLAorICAgIFFGQygweDAwMDlBQTNGKSwKKyAgICBRRkMoMHgwMDA2QjFDRiksCisgICAgUUZDKDB4MDAwMzk2MDkpLAorICAgIFFGQygweDAwMDA3MTM0KSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gNDMgLi4gNDAgLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHgwMEIzRDE1QyksCisgICAgUUZDKDB4MDBCNUM4NjcpLAorICAgIFFGQygweDAwQjc0QzM3KSwKKyAgICBRRkMoMHgwMEI4Mzk0QiksCisgICAgUUZDKDB4MDBFNDJGQTIpLAorICAgIFFGQygweDAwNDBDNDk3KSwKKyAgICBRRkMoMHhGRjk2REI4RiksCisgICAgUUZDKDB4RkVFNzIzQzYpLAorICAgIFFGQygweDY0OTY0MDYzKSwKKyAgICBRRkMoMHg2M0M0NTI0MyksCisgICAgUUZDKDB4NjJFQTY0NzQpLAorICAgIFFGQygweDYyMDdGMjIwKSwKKyAgICBRRkMoMHgwOTJENzk3MCksCisgICAgUUZDKDB4MDkwRUMxRkQpLAorICAgIFFGQygweDA4RURGRUFBKSwKKyAgICBRRkMoMHgwOENCNEUyMyksCisgICAgUUZDKDB4RkZGREZBMjQpLAorICAgIFFGQygweEZGRkI0MkIwKSwKKyAgICBRRkMoMHhGRkY5MUZDOSksCisgICAgUUZDKDB4RkZGNjgxRDYpLAorICAgIC8qLS0tLS0tLS0tLS0tLSAzOSAuLiAzNiAtLS0tLS0tLS0tLS0tLS0qLworICAgIFFGQygweDAwQjhGRTBEKSwKKyAgICBRRkMoMHgwMEI4QzZCMCksCisgICAgUUZDKDB4MDBCODVGNzApLAorICAgIFFGQygweDAwQjczQUIwKSwKKyAgICBRRkMoMHhGRTMxMDY1NyksCisgICAgUUZDKDB4RkQ3NDc1RDgpLAorICAgIFFGQygweEZDQjFENzQwKSwKKyAgICBRRkMoMHhGQkU4RjVCRCksCisgICAgUUZDKDB4NjExRDU4QTMpLAorICAgIFFGQygweDYwMkIwQzdGKSwKKyAgICBRRkMoMHg1RjMwRkY1RiksCisgICAgUUZDKDB4NUUyRjYzNjcpLAorICAgIFFGQygweDA4QTc1REE0KSwKKyAgICBRRkMoMHgwODgwRkZERCksCisgICAgUUZDKDB4MDg1OTQ4ODgpLAorICAgIFFGQygweDA4MzAzODk3KSwKKyAgICBRRkMoMHhGRkY0ODcwMCksCisgICAgUUZDKDB4RkZGMjk0QzMpLAorICAgIFFGQygweEZGRjBFN0VGKSwKKyAgICBRRkMoMHhGRkVGMjM5NSksCisgICAgLyotLS0tLS0tLS0tLS0tIDM1IC4uIDMyIC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4MDBCNThDOEQpLAorICAgIFFGQygweDAwQjM2QUNEKSwKKyAgICBRRkMoMHgwMEIwNkI2OCksCisgICAgUUZDKDB4MDBBQ0JEMkYpLAorICAgIFFGQygweEZCMTlCN0JEKSwKKyAgICBRRkMoMHhGQTQ0QTA2OSksCisgICAgUUZDKDB4Rjk2OTE2RjUpLAorICAgIFFGQygweEY4ODc1MDdDKSwKKyAgICBRRkMoMHg1RDI2QkU5QiksCisgICAgUUZDKDB4NUMxNkQwQUUpLAorICAgIFFGQygweDVCMDAxREI4KSwKKyAgICBRRkMoMHg1OUUyRjY5RSksCisgICAgUUZDKDB4MDgwNjE2NzEpLAorICAgIFFGQygweDA3REEyQjdGKSwKKyAgICBRRkMoMHgwN0FEOEMyNiksCisgICAgUUZDKDB4MDc3RkVEQjMpLAorICAgIFFGQygweEZGRURDNDE4KSwKKyAgICBRRkMoMHhGRkVDODQwOSksCisgICAgUUZDKDB4RkZFQjM4NDkpLAorICAgIFFGQygweEZGRUEzNTNBKSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gMzEgLi4gMjggLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHgwMEE4NUU5NCksCisgICAgUUZDKDB4MDBBMzUwOEYpLAorICAgIFFGQygweDAwOURBNTI2KSwKKyAgICBRRkMoMHgwMDk2RENDMiksCisgICAgUUZDKDB4Rjc5RkExM0EpLAorICAgIFFGQygweEY2QjFGM0MzKSwKKyAgICBRRkMoMHhGNUJFMEZBOSksCisgICAgUUZDKDB4RjRDNDczQzUpLAorICAgIFFGQygweDU4QkVGQUNEKSwKKyAgICBRRkMoMHg1Nzk1MDVGNSksCisgICAgUUZDKDB4NTY2NTRCREQpLAorICAgIFFGQygweDU1MkY4RkY3KSwKKyAgICBRRkMoMHgwNzUxMTJBMiksCisgICAgUUZDKDB4MDcyMUJGMjIpLAorICAgIFFGQygweDA2RjE4MjVEKSwKKyAgICBRRkMoMHgwNkMwRjBDMCksCisgICAgUUZDKDB4RkZFOTU0RDApLAorICAgIFFGQygweEZGRTg1QjRBKSwKKyAgICBRRkMoMHhGRkU4MDQxNCksCisgICAgUUZDKDB4RkZFNzUzNjEpLAorICAgIC8qLS0tLS0tLS0tLS0tLSAyNyAuLiAyNCAtLS0tLS0tLS0tLS0tLS0qLworICAgIFFGQygweDAwOEY4N0FBKSwKKyAgICBRRkMoMHgwMDg3MkM2MyksCisgICAgUUZDKDB4MDA3RTAzOTMpLAorICAgIFFGQygweDAwNzQwMEI4KSwKKyAgICBRRkMoMHhGM0M0RTg4NyksCisgICAgUUZDKDB4RjJCRjZFQTQpLAorICAgIFFGQygweEYxQjQ2MUFCKSwKKyAgICBRRkMoMHhGMEEzOTU5RiksCisgICAgUUZDKDB4NTNGNDk1QUEpLAorICAgIFFGQygweDUyQjQ0OURFKSwKKyAgICBRRkMoMHg1MTZFRUZCOSksCisgICAgUUZDKDB4NTAyNEQ3MEUpLAorICAgIFFGQygweDA2OEY4QjQ0KSwKKyAgICBRRkMoMHgwNjVERDU2QSksCisgICAgUUZDKDB4MDYyQkY1RUMpLAorICAgIFFGQygweDA1RjlDMDUxKSwKKyAgICBRRkMoMHhGRkU2RkVENCksCisgICAgUUZDKDB4RkZFNjk0MjMpLAorICAgIFFGQygweEZGRTY2RkFCKSwKKyAgICBRRkMoMHhGRkU2NkREMCksCisgICAgLyotLS0tLS0tLS0tLS0tIDIzIC4uIDIwIC0tLS0tLS0tLS0tLS0tLSovCisgICAgUUZDKDB4MDA2OTI4QTApLAorICAgIFFGQygweDAwNUQzNkRGKSwKKyAgICBRRkMoMHgwMDUwNEY0MSksCisgICAgUUZDKDB4MDA0MjZGMzYpLAorICAgIFFGQygweEVGOEQ0RDdCKSwKKyAgICBRRkMoMHhFRTcxQjJGRSksCisgICAgUUZDKDB4RUQ1MEEzMUQpLAorICAgIFFGQygweEVDMkEzRjVGKSwKKyAgICBRRkMoMHg0RUQ2MkJFMyksCisgICAgUUZDKDB4NEQ4Mzk3NkQpLAorICAgIFFGQygweDRDMkNBM0RGKSwKKyAgICBRRkMoMHg0QUQyMzdBMiksCisgICAgUUZDKDB4MDVDNzZGRUQpLAorICAgIFFGQygweDA1OTUwMTIyKSwKKyAgICBRRkMoMHgwNTYyNjIwOSksCisgICAgUUZDKDB4MDUzMDNGODgpLAorICAgIFFGQygweEZGRTY4MUM2KSwKKyAgICBRRkMoMHhGRkU2NTQxNiksCisgICAgUUZDKDB4RkZFNkFGRUQpLAorICAgIFFGQygweEZGRTZENDY2KSwKKyAgICAvKi0tLS0tLS0tLS0tLS0gMTkgLi4gMTYgLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHgwMDMzQjkyNyksCisgICAgUUZDKDB4MDAyM0I5ODkpLAorICAgIFFGQygweDAwMTMxQzc1KSwKKyAgICBRRkMoMHgwMDAwRTc5MCksCisgICAgUUZDKDB4RUFGRUU3RjEpLAorICAgIFFGQygweEU5Q0VBODRBKSwKKyAgICBRRkMoMHhFODk5NzFCNyksCisgICAgUUZDKDB4RTc1RjhCQjcpLAorICAgIFFGQygweDQ5NzNGRUYyKSwKKyAgICBRRkMoMHg0ODEyRjg0OCksCisgICAgUUZDKDB4NDZBRUE4NTYpLAorICAgIFFGQygweDQ1NDdEQUVCKSwKKyAgICBRRkMoMHgwNEZFMjBCRSksCisgICAgUUZDKDB4MDRDQzJGQ0YpLAorICAgIFFGQygweDA0OUFBODJGKSwKKyAgICBRRkMoMHgwNDY5NDEwMSksCisgICAgUUZDKDB4RkZFNzc0NkUpLAorICAgIFFGQygweEZGRTc5RTE2KSwKKyAgICBRRkMoMHhGRkU4M0EwNyksCisgICAgUUZDKDB4RkZFODhCQTgpLAorICAgIC8qLS0tLS0tLS0tLS0tLSAxNSAuLiAxMiAtLS0tLS0tLS0tLS0tLS0qLworICAgIFFGQygweEZGRUUxODNCKSwKKyAgICBRRkMoMHhGRkRBMTdGMiksCisgICAgUUZDKDB4RkZDNEUzNjUpLAorICAgIFFGQygweEZGQUVBNUQ2KSwKKyAgICBRRkMoMHhFNjIwQzQ3NiksCisgICAgUUZDKDB4RTRERTBDQjApLAorICAgIFFGQygweEUzOTZBNDVEKSwKKyAgICBRRkMoMHhFMjRCOEY2NiksCisgICAgUUZDKDB4NDNERTYyMEEpLAorICAgIFFGQygweDQyNzJBMzg1KSwKKyAgICBRRkMoMHg0MTA1OEJDNiksCisgICAgUUZDKDB4M0Y5NjJGQjgpLAorICAgIFFGQygweDA0Mzg4OUM2KSwKKyAgICBRRkMoMHgwNDA4M0ZFQyksCisgICAgUUZDKDB4MDNEOEFGRTYpLAorICAgIFFGQygweDAzQTk2NkJDKSwKKyAgICBRRkMoMHhGRkU5NDBGNCksCisgICAgUUZDKDB4RkZFOUNBNzYpLAorICAgIFFGQygweEZGRUE5MTkyKSwKKyAgICBRRkMoMHhGRkVCNTBCMiksCisgICAgLyotLS0tLS0tLS0tLS0tIDExIC4uIDggLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHhGRjk3NUMwMSksCisgICAgUUZDKDB4RkY3RUUzRjEpLAorICAgIFFGQygweEZGNjU0MkQxKSwKKyAgICBRRkMoMHhGRjRBQUJDOCksCisgICAgUUZDKDB4RTBGQzQyMUUpLAorICAgIFFGQygweERGQTkzQUI1KSwKKyAgICBRRkMoMHhERTUyOTA4NiksCisgICAgUUZDKDB4RENGODk4RkIpLAorICAgIFFGQygweDNFMjVCMTdFKSwKKyAgICBRRkMoMHgzQ0I0MTIxOSksCisgICAgUUZDKDB4M0I0MTUxMTUpLAorICAgIFFGQygweDM5Q0UwNDc3KSwKKyAgICBRRkMoMHgwMzdBRDQzOCksCisgICAgUUZDKDB4MDM0RDAxRjEpLAorICAgIFFGQygweDAzMjAxMTE2KSwKKyAgICBRRkMoMHgwMkYzRTQ4RCksCisgICAgUUZDKDB4RkZFQkU3N0IpLAorICAgIFFGQygweEZGRUNDMzFCKSwKKyAgICBRRkMoMHhGRkVENjUxRCksCisgICAgUUZDKDB4RkZFRTE2NTApLAorICAgIC8qLS0tLS0tLS0tLS0tLSA3IC4uIDQgLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHhGRjJFRjcyNSksCisgICAgUUZDKDB4RkYxMjBENzApLAorICAgIFFGQygweEZFRjNGNkFCKSwKKyAgICBRRkMoMHhGRUQ0QkVDMyksCisgICAgUUZDKDB4REI5QjVCMTIpLAorICAgIFFGQygweERBM0IxNzZBKSwKKyAgICBRRkMoMHhEOEQ3RjIxRiksCisgICAgUUZDKDB4RDc3MjJGMDQpLAorICAgIFFGQygweDM4NUE0OUM0KSwKKyAgICBRRkMoMHgzNkU2OTY5MSksCisgICAgUUZDKDB4MzU3MkVDNzApLAorICAgIFFGQygweDMzRkY2NzBFKSwKKyAgICBRRkMoMHgwMkM4OTkwMSksCisgICAgUUZDKDB4MDI5RTM1QjQpLAorICAgIFFGQygweDAyNzRCQTQzKSwKKyAgICBRRkMoMHgwMjRCRjdBMSksCisgICAgUUZDKDB4RkZFRURGQTQpLAorICAgIFFGQygweEZGRUY3QjhCKSwKKyAgICBRRkMoMHhGRkVGRjZDQSksCisgICAgUUZDKDB4RkZGMDA2NUQpLAorICAgIC8qLS0tLS0tLS0tLS0tLSAzIC4uIDAgLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBRRkMoMHhGRUI0OEQwRCksCisgICAgUUZDKDB4RkU5MzNEQzApLAorICAgIFFGQygweEZFNzBCOEQxKSwKKyAgICBRRkMoMHhGRTREMUJFMyksCisgICAgUUZDKDB4RDYwQTQ2RTUpLAorICAgIFFGQygweEQ0OUZENTVGKSwKKyAgICBRRkMoMHhEMzMzN0IzRCksCisgICAgUUZDKDB4RDFDNThBQ0UpLAorICAgIFFGQygweDMyOENDNkYwKSwKKyAgICBRRkMoMHgzMTFBRjNBNCksCisgICAgUUZDKDB4MkZBQTIyMUMpLAorICAgIFFGQygweDJFM0E3NTMyKSwKKyAgICBRRkMoMHgwMjI0NEEyNSksCisgICAgUUZDKDB4MDFGRDNCQTApLAorICAgIFFGQygweDAxRDc4QkZDKSwKKyAgICBRRkMoMHgwMUIyRTQxRCksCisgICAgUUZDKDB4RkZFRkM5QjkpLAorICAgIFFGQygweEZGRUQ5NzhBKSwKKyAgICBRRkMoMHhGRkVERTUwRSksCisgICAgUUZDKDB4MDAwMDAwMDApLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczY0W10gPSB7CisgICAgUVRDKDB4N2ZmNjIxODIpLCBRVEMoMHg3ZmE3MzZiNCksIFFUQygweDdmMDk5MWM0KSwgUVRDKDB4N2UxZDkzZWEpLAorICAgIFFUQygweDdjZTNjZWIyKSwgUVRDKDB4N2I1ZDAzOWUpLCBRVEMoMHg3OThhMjNiMSksIFFUQygweDc3NmM0ZWRiKSwKKyAgICBRVEMoMHg3NTA0ZDM0NSksIFFUQygweDcyNTUyYzg1KSwgUVRDKDB4NmY1ZjAyYjIpLCBRVEMoMHg2YzI0Mjk2MCksCisgICAgUVRDKDB4NjhhNjllODEpLCBRVEMoMHg2NGU4ODkyNiksIFFUQygweDYwZWMzODMwKSwgUVRDKDB4NWNiNDIwZTApLAorICAgIFFUQygweDU4NDJkZDU0KSwgUVRDKDB4NTM5YjJhZjApLCBRVEMoMHg0ZWJmZThhNSksIFFUQygweDQ5YjQxNTMzKSwKKyAgICBRVEMoMHg0NDdhY2Q1MCksIFFUQygweDNmMTc0OWI4KSwgUVRDKDB4Mzk4Y2RkMzIpLCBRVEMoMHgzM2RlZjI4NyksCisgICAgUVRDKDB4MmUxMTBhNjIpLCBRVEMoMHgyODI2YjkyOCksIFFUQygweDIyMjNhNGM1KSwgUVRDKDB4MWMwYjgyNmEpLAorICAgIFFUQygweDE1ZTIxNDQ1KSwgUVRDKDB4MGZhYjI3MmIpLCBRVEMoMHgwOTZhOTA0OSksIFFUQygweDAzMjQyYWJmKSwKKyAgICBRVEMoMHhmY2RiZDU0MSksIFFUQygweGY2OTU2ZmI3KSwgUVRDKDB4ZjA1NGQ4ZDUpLCBRVEMoMHhlYTFkZWJiYiksCisgICAgUVRDKDB4ZTNmNDdkOTYpLCBRVEMoMHhkZGRjNWIzYiksIFFUQygweGQ3ZDk0NmQ4KSwgUVRDKDB4ZDFlZWY1OWUpLAorICAgIFFUQygweGNjMjEwZDc5KSwgUVRDKDB4YzY3MzIyY2UpLCBRVEMoMHhjMGU4YjY0OCksIFFUQygweGJiODUzMmIwKSwKKyAgICBRVEMoMHhiNjRiZWFjZCksIFFUQygweGIxNDAxNzViKSwgUVRDKDB4YWM2NGQ1MTApLCBRVEMoMHhhN2JkMjJhYyksCisgICAgUVRDKDB4YTM0YmRmMjApLCBRVEMoMHg5ZjEzYzdkMCksIFFUQygweDliMTc3NmRhKSwgUVRDKDB4OTc1OTYxN2YpLAorICAgIFFUQygweDkzZGJkNmEwKSwgUVRDKDB4OTBhMGZkNGUpLCBRVEMoMHg4ZGFhZDM3YiksIFFUQygweDhhZmIyY2JiKSwKKyAgICBRVEMoMHg4ODkzYjEyNSksIFFUQygweDg2NzVkYzRmKSwgUVRDKDB4ODRhMmZjNjIpLCBRVEMoMHg4MzFjMzE0ZSksCisgICAgUVRDKDB4ODFlMjZjMTYpLCBRVEMoMHg4MGY2NmUzYyksIFFUQygweDgwNThjOTRjKSwgUVRDKDB4ODAwOWRlN2UpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK2NvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X3NpbjY0W10gPSB7CisgICAgUVRDKDB4MDMyNDJhYmYpLCBRVEMoMHgwOTZhOTA0OSksIFFUQygweDBmYWIyNzJiKSwgUVRDKDB4MTVlMjE0NDUpLAorICAgIFFUQygweDFjMGI4MjZhKSwgUVRDKDB4MjIyM2E0YzUpLCBRVEMoMHgyODI2YjkyOCksIFFUQygweDJlMTEwYTYyKSwKKyAgICBRVEMoMHgzM2RlZjI4NyksIFFUQygweDM5OGNkZDMyKSwgUVRDKDB4M2YxNzQ5YjgpLCBRVEMoMHg0NDdhY2Q1MCksCisgICAgUVRDKDB4NDliNDE1MzMpLCBRVEMoMHg0ZWJmZThhNSksIFFUQygweDUzOWIyYWYwKSwgUVRDKDB4NTg0MmRkNTQpLAorICAgIFFUQygweDVjYjQyMGUwKSwgUVRDKDB4NjBlYzM4MzApLCBRVEMoMHg2NGU4ODkyNiksIFFUQygweDY4YTY5ZTgxKSwKKyAgICBRVEMoMHg2YzI0Mjk2MCksIFFUQygweDZmNWYwMmIyKSwgUVRDKDB4NzI1NTJjODUpLCBRVEMoMHg3NTA0ZDM0NSksCisgICAgUVRDKDB4Nzc2YzRlZGIpLCBRVEMoMHg3OThhMjNiMSksIFFUQygweDdiNWQwMzllKSwgUVRDKDB4N2NlM2NlYjIpLAorICAgIFFUQygweDdlMWQ5M2VhKSwgUVRDKDB4N2YwOTkxYzQpLCBRVEMoMHg3ZmE3MzZiNCksIFFUQygweDdmZjYyMTgyKSwKKyAgICBRVEMoMHg3ZmY2MjE4MiksIFFUQygweDdmYTczNmI0KSwgUVRDKDB4N2YwOTkxYzQpLCBRVEMoMHg3ZTFkOTNlYSksCisgICAgUVRDKDB4N2NlM2NlYjIpLCBRVEMoMHg3YjVkMDM5ZSksIFFUQygweDc5OGEyM2IxKSwgUVRDKDB4Nzc2YzRlZGIpLAorICAgIFFUQygweDc1MDRkMzQ1KSwgUVRDKDB4NzI1NTJjODUpLCBRVEMoMHg2ZjVmMDJiMiksIFFUQygweDZjMjQyOTYwKSwKKyAgICBRVEMoMHg2OGE2OWU4MSksIFFUQygweDY0ZTg4OTI2KSwgUVRDKDB4NjBlYzM4MzApLCBRVEMoMHg1Y2I0MjBlMCksCisgICAgUVRDKDB4NTg0MmRkNTQpLCBRVEMoMHg1MzliMmFmMCksIFFUQygweDRlYmZlOGE1KSwgUVRDKDB4NDliNDE1MzMpLAorICAgIFFUQygweDQ0N2FjZDUwKSwgUVRDKDB4M2YxNzQ5YjgpLCBRVEMoMHgzOThjZGQzMiksIFFUQygweDMzZGVmMjg3KSwKKyAgICBRVEMoMHgyZTExMGE2MiksIFFUQygweDI4MjZiOTI4KSwgUVRDKDB4MjIyM2E0YzUpLCBRVEMoMHgxYzBiODI2YSksCisgICAgUVRDKDB4MTVlMjE0NDUpLCBRVEMoMHgwZmFiMjcyYiksIFFUQygweDA5NmE5MDQ5KSwgUVRDKDB4MDMyNDJhYmYpLAorfTsKIAogLyoKICAqIExvdyBEZWxheSBRTUYgYWthIENMREZCCiAgKi8KIAogI2lmIGRlZmluZWQoUU1GX0NPRUZGXzE2QklUKQotI2RlZmluZSBRVENGTExEKHgpICBGTDJGWENPTlNUX1NHTCh4LyhmbG9hdCkoMTw8UU1GX0NMREZCX1BGVF9TQ0FMRSkpCi0jZGVmaW5lIFFUQ0ZMTERUKHgpICBGTDJGWENPTlNUX1NHTCh4KQorI2RlZmluZSBRVENGTExEKHgpIEZMMkZYQ09OU1RfU0dMKHggLyAoZmxvYXQpKDEgPDwgUU1GX0NMREZCX1BGVF9TQ0FMRSkpCisjZGVmaW5lIFFUQ0ZMTERUKHgpIEZMMkZYQ09OU1RfU0dMKHgpCiAjZWxzZQotI2RlZmluZSBRVENGTExEKHgpICBGTDJGWENPTlNUX0RCTCh4LyhmbG9hdCkoMTw8UU1GX0NMREZCX1BGVF9TQ0FMRSkpCi0jZGVmaW5lIFFUQ0ZMTERUKHgpICBGTDJGWENPTlNUX0RCTCh4KQorI2RlZmluZSBRVENGTExEKHgpIEZMMkZYQ09OU1RfREJMKHggLyAoZmxvYXQpKDEgPDwgUU1GX0NMREZCX1BGVF9TQ0FMRSkpCisjZGVmaW5lIFFUQ0ZMTERUKHgpIEZMMkZYQ09OU1RfREJMKHgpCiAjZW5kaWYKIAotCiAjaWZuZGVmIExPV19QT1dFUl9TQlJfT05MWQogLyohCiAgIFxuYW1lIFFNRi1Ud2lkZGxlCkBAIC0xNTEwLDczICs1MjkzLDE2MSBAQAogICBMPTMyLCBnYWluPTIuMCwgYW5nbGUgPSAwLjc1CiAqLwogLyogc2luL2NvcyAoYW5nbGUpIC8gMiAqLwotY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zMzJfY2xkZmJbMzJdID0gewotICBRVENGTExEVCgtNy4wNzEwNjdlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNzBlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNjRlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDczZS0wMSksCi0gIFFUQ0ZMTERUKC03LjA3MTA2MWUtMDEpLCBRVENGTExEVCg3LjA3MTA3NmUtMDEpLCBRVENGTExEVCg3LjA3MTA1OGUtMDEpLCBRVENGTExEVCgtNy4wNzEwODBlLTAxKSwKLSAgUVRDRkxMRFQoLTcuMDcxMDU1ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDgzZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDUyZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA4NmUtMDEpLAotICBRVENGTExEVCgtNy4wNzEwNDllLTAxKSwgUVRDRkxMRFQoNy4wNzEwODllLTAxKSwgUVRDRkxMRFQoNy4wNzEwNDZlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDkyZS0wMSksCi0gIFFUQ0ZMTERUKC03LjA3MTA0MmUtMDEpLCBRVENGTExEVCg3LjA3MTA5NWUtMDEpLCBRVENGTExEVCg3LjA3MTAzOWUtMDEpLCBRVENGTExEVCgtNy4wNzEwOThlLTAxKSwKLSAgUVRDRkxMRFQoLTcuMDcxMDM2ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMTAxZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDMzZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEwNGUtMDEpLAotICBRVENGTExEVCgtNy4wNzEwMzBlLTAxKSwgUVRDRkxMRFQoNy4wNzExMDdlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMjdlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTExZS0wMSksCi0gIFFUQ0ZMTERUKC03LjA3MTAyNGUtMDEpLCBRVENGTExEVCg3LjA3MTExNGUtMDEpLCBRVENGTExEVCg3LjA3MTAyMWUtMDEpLCBRVENGTExEVCgtNy4wNzExMTdlLTAxKSwKK2NvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczMyX2NsZGZiX2FuYVszMl0gPSB7CisgICAgLyogYW5hbHlzaXMgdHdpZGRsZSB0YWJsZSAqLworICAgIFFUQ0ZMTERUKC03LjA3MTA2N2UtMDEpLCBRVENGTExEVCg3LjA3MTA3MGUtMDEpLCAgUVRDRkxMRFQoNy4wNzEwNjRlLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwNzNlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDYxZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDc2ZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzEwNThlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTA4MGUtMDEpLCBRVENGTExEVCgtNy4wNzEwNTVlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTA4M2UtMDEpLCAgUVRDRkxMRFQoNy4wNzEwNTJlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTA4NmUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTA0OWUtMDEpLCBRVENGTExEVCg3LjA3MTA4OWUtMDEpLCAgUVRDRkxMRFQoNy4wNzEwNDZlLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwOTJlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDQyZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDk1ZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzEwMzllLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTA5OGUtMDEpLCBRVENGTExEVCgtNy4wNzEwMzZlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTEwMWUtMDEpLCAgUVRDRkxMRFQoNy4wNzEwMzNlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTEwNGUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTAzMGUtMDEpLCBRVENGTExEVCg3LjA3MTEwN2UtMDEpLCAgUVRDRkxMRFQoNy4wNzEwMjdlLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzExMTFlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDI0ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMTE0ZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzEwMjFlLTAxKSwgIFFUQ0ZMTERUKC03LjA3MTExN2UtMDEpLAorfTsKKworY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zMzJfY2xkZmJfc3luWzMyXSA9IHsKKyAgICAvKiBzeW50aGVzaXMgdHdpZGRsZSB0YWJsZSAqLworICAgIFFUQ0ZMTERUKDcuMDcxMDY3ZS0wMSksICBRVENGTExEVCgtNy4wNzEwNzBlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDY0ZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzEwNzNlLTAxKSwgIFFUQ0ZMTERUKDcuMDcxMDYxZS0wMSksICBRVENGTExEVCgtNy4wNzEwNzZlLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwNThlLTAxKSwgUVRDRkxMRFQoNy4wNzEwODBlLTAxKSwgIFFUQ0ZMTERUKDcuMDcxMDU1ZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMDgzZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA1MmUtMDEpLCBRVENGTExEVCg3LjA3MTA4NmUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDQ5ZS0wMSksICBRVENGTExEVCgtNy4wNzEwODllLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDQ2ZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzEwOTJlLTAxKSwgIFFUQ0ZMTERUKDcuMDcxMDQyZS0wMSksICBRVENGTExEVCgtNy4wNzEwOTVlLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwMzllLTAxKSwgUVRDRkxMRFQoNy4wNzEwOThlLTAxKSwgIFFUQ0ZMTERUKDcuMDcxMDM2ZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMTAxZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAzM2UtMDEpLCBRVENGTExEVCg3LjA3MTEwNGUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDMwZS0wMSksICBRVENGTExEVCgtNy4wNzExMDdlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDI3ZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzExMTFlLTAxKSwgIFFUQ0ZMTERUKDcuMDcxMDI0ZS0wMSksICBRVENGTExEVCgtNy4wNzExMTRlLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwMjFlLTAxKSwgUVRDRkxMRFQoNy4wNzExMTdlLTAxKSwKIH07CiAKIGNvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X3NpbjMyX2NsZGZiWzMyXSA9IHsKLSAgUVRDRkxMRFQoNy4wNzEwNjhlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNjVlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDcyZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA2MmUtMDEpLAotICBRVENGTExEVCg3LjA3MTA3NWUtMDEpLCBRVENGTExEVCg3LjA3MTA1OWUtMDEpLCBRVENGTExEVCgtNy4wNzEwNzhlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDU2ZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMDgxZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDUzZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA4NGUtMDEpLCBRVENGTExEVCgtNy4wNzEwNTBlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzEwODdlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNDdlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDkwZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA0NGUtMDEpLAotICBRVENGTExEVCg3LjA3MTA5M2UtMDEpLCBRVENGTExEVCg3LjA3MTA0MWUtMDEpLCBRVENGTExEVCgtNy4wNzEwOTZlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDM4ZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMDk5ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDM0ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEwM2UtMDEpLCBRVENGTExEVCgtNy4wNzEwMzFlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzExMDZlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMjhlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTA5ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAyNWUtMDEpLAotICBRVENGTExEVCg3LjA3MTExMmUtMDEpLCBRVENGTExEVCg3LjA3MTAyMmUtMDEpLCBRVENGTExEVCgtNy4wNzExMTVlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDE5ZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzEwNjhlLTAxKSwgIFFUQ0ZMTERUKDcuMDcxMDY1ZS0wMSksICBRVENGTExEVCgtNy4wNzEwNzJlLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwNjJlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNzVlLTAxKSwgIFFUQ0ZMTERUKDcuMDcxMDU5ZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMDc4ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA1NmUtMDEpLCBRVENGTExEVCg3LjA3MTA4MWUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDUzZS0wMSksICBRVENGTExEVCgtNy4wNzEwODRlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDUwZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzEwODdlLTAxKSwgIFFUQ0ZMTERUKDcuMDcxMDQ3ZS0wMSksICBRVENGTExEVCgtNy4wNzEwOTBlLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwNDRlLTAxKSwgUVRDRkxMRFQoNy4wNzEwOTNlLTAxKSwgIFFUQ0ZMTERUKDcuMDcxMDQxZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMDk2ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAzOGUtMDEpLCBRVENGTExEVCg3LjA3MTA5OWUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDM0ZS0wMSksICBRVENGTExEVCgtNy4wNzExMDNlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDMxZS0wMSksCisgICAgUVRDRkxMRFQoNy4wNzExMDZlLTAxKSwgIFFUQ0ZMTERUKDcuMDcxMDI4ZS0wMSksICBRVENGTExEVCgtNy4wNzExMDllLTAxKSwKKyAgICBRVENGTExEVCgtNy4wNzEwMjVlLTAxKSwgUVRDRkxMRFQoNy4wNzExMTJlLTAxKSwgIFFUQ0ZMTERUKDcuMDcxMDIyZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMTE1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAxOWUtMDEpLAogfTsKIAorLyogdHdpZGRsZXMgZm9yIFg9KDgsMTYpIGJhbmQgcW1mIGFyZSBjb3BpZWQgZnJvbSBmbG9hdCBzaW1wbGVwbGF5ZXIKKyAqIGltcGxlbWVudGF0aW9uOiBxbWZfcGhhc2VzaGlmdF9jb3NYX2NsZGZiX2FuYSAgPQorICogUU1GbGliX3R3aWRkbGUzUmVhbFhfU0JSTERfQSBxbWZfcGhhc2VzaGlmdF9jb3NYX2NsZGZiX3N5biAgPQorICogLShRTUZsaWJfdHdpZGRsZTNSZWFsWF9TQlJMRF9BKSBxbWZfcGhhc2VzaGlmdF9zaW5YX2NsZGZiICAgICAgPQorICogUU1GbGliX3R3aWRkbGUzSW1hZ1hfU0JSTERfQQorICovCisKKy8qIGNvcyAoKG4gKyAwLjUpKnBpKmFuZ2xlL0wpICwgb3JkZXIgPSAxNTksIEw9MTYgKi8KK2NvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczE2X2NsZGZiX2FuYVsxNl0gPSB7CisgICAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLAorICAgIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLCBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwKKyAgICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLCAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLAorICAgIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLCAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksCisgICAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLAorICAgIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLAorfTsKKworLyogY29zICgobiArIDAuNSkqcGkqYW5nbGUvTCkgLCBvcmRlciA9IDE1OSwgTD0xNiAqLworY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zMTZfY2xkZmJfc3luWzE2XSA9IHsKKyAgICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLCAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLAorICAgIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLCAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksCisgICAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLAorICAgIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLCBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwKKyAgICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLCAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLAorICAgIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksCit9OworCisvKiBzaW4gKChuICsgMC41KSpwaSphbmdsZS9MKSAsIG9yZGVyID0gMTU5LCBMPTE2ICovCitjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW4xNl9jbGRmYlsxNl0gPSB7CisgICAgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwgIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksICBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwKKyAgICBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwgIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksCisgICAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLCBRVENGTExEVCgwLjcwNzEwNjc4MTIpLAorICAgIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksICBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksCisgICAgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwgIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksICBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwKKyAgICBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwKK307CisKKy8qIGNvcyAoKG4gKyAwLjUpKnBpKmFuZ2xlL0wpICwgb3JkZXIgPSA3OSwgTD04ICovCitjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9jb3M4X2NsZGZiX2FuYVs4XSA9IHsKKyAgICBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwgIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksCisgICAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLCBRVENGTExEVCgwLjcwNzEwNjc4MTIpLAorICAgIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksICBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwKK307CisKK2NvbnN0IEZJWFBfUVRXIHFtZl9waGFzZXNoaWZ0X2NvczhfY2xkZmJfc3luWzhdID0geworICAgIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksICBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksCisgICAgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwgIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksICBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwKKyAgICBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwgUVRDRkxMRFQoMC43MDcxMDY3ODEyKSwKK307CisKKy8qIHNpbiAoKG4gKyAwLjUpKnBpKmFuZ2xlL0wpICwgb3JkZXIgPSA3OSwgTD04ICovCitjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW44X2NsZGZiWzhdID0geworICAgIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLCAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksCisgICAgUVRDRkxMRFQoLTAuNzA3MTA2NzgxMiksIFFUQ0ZMTERUKDAuNzA3MTA2NzgxMiksICBRVENGTExEVCgwLjcwNzEwNjc4MTIpLAorICAgIFFUQ0ZMTERUKC0wLjcwNzEwNjc4MTIpLCBRVENGTExEVCgtMC43MDcxMDY3ODEyKSwKK307CiAKIC8qIHNpbi9jb3MgKGFuZ2xlKSAvIDEyOCAqLwogY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfY29zNjRfY2xkZmJbNjRdID0gewotICBRVENGTExEVCg3LjA3MTA2OGUtMDEpLCBRVENGTExEVCgtNy4wNzEwNjZlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDcwZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDY1ZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMDcyZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA2M2UtMDEpLCBRVENGTExEVCgtNy4wNzEwNzRlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNjFlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzEwNzVlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDU5ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA3OGUtMDEpLCBRVENGTExEVCg3LjA3MTA1N2UtMDEpLAotICBRVENGTExEVCg3LjA3MTA4MGUtMDEpLCBRVENGTExEVCgtNy4wNzEwNTVlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDgxZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDUzZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMDgzZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA1MmUtMDEpLCBRVENGTExEVCgtNy4wNzEwODVlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNTBlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzEwODdlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDQ4ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA4OWUtMDEpLCBRVENGTExEVCg3LjA3MTA0NmUtMDEpLAotICBRVENGTExEVCg3LjA3MTA5MGUtMDEpLCBRVENGTExEVCgtNy4wNzEwNDRlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDkyZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDQyZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMDk1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA0MGUtMDEpLCBRVENGTExEVCgtNy4wNzEwOTZlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMzhlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzEwOThlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDM3ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEwMGUtMDEpLCBRVENGTExEVCg3LjA3MTAzNWUtMDEpLAotICBRVENGTExEVCg3LjA3MTEwMmUtMDEpLCBRVENGTExEVCgtNy4wNzEwMzNlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTAzZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDMxZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMTA1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAzMGUtMDEpLCBRVENGTExEVCgtNy4wNzExMDdlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMjhlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzExMDllLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDI1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTExMWUtMDEpLCBRVENGTExEVCg3LjA3MTAyNGUtMDEpLAotICBRVENGTExEVCg3LjA3MTExM2UtMDEpLCBRVENGTExEVCgtNy4wNzEwMjJlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTE1ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDIwZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMTE3ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAxOGUtMDEpLCBRVENGTExEVCgtNy4wNzExMThlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMTZlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzExMjBlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDE1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEyMmUtMDEpLCBRVENGTExEVCg3LjA3MTAxM2UtMDEpLAotICBRVENGTExEVCg3LjA3MTEyNGUtMDEpLCBRVENGTExEVCgtNy4wNzEwMTFlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTI2ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDA5ZS0wMSksCi0gfTsKLSBjb25zdCBGSVhQX1FUVyBxbWZfcGhhc2VzaGlmdF9zaW42NF9jbGRmYls2NF0gPSB7Ci0gIFFUQ0ZMTERUKDcuMDcxMDY3ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDY5ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA2NWUtMDEpLCBRVENGTExEVCgtNy4wNzEwNzFlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzEwNjRlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNzNlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDYyZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA3NWUtMDEpLAotICBRVENGTExEVCg3LjA3MTA2MGUtMDEpLCBRVENGTExEVCg3LjA3MTA3N2UtMDEpLCBRVENGTExEVCgtNy4wNzEwNThlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDc4ZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMDU2ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDgwZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA1NWUtMDEpLCBRVENGTExEVCgtNy4wNzEwODJlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzEwNTNlLTAxKSwgUVRDRkxMRFQoNy4wNzEwODRlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDUwZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA4NmUtMDEpLAotICBRVENGTExEVCg3LjA3MTA0OWUtMDEpLCBRVENGTExEVCg3LjA3MTA4OGUtMDEpLCBRVENGTExEVCgtNy4wNzEwNDdlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDkwZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMDQ1ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDkyZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA0M2UtMDEpLCBRVENGTExEVCgtNy4wNzEwOTNlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzEwNDFlLTAxKSwgUVRDRkxMRFQoNy4wNzEwOTVlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDQwZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA5N2UtMDEpLAotICBRVENGTExEVCg3LjA3MTAzOGUtMDEpLCBRVENGTExEVCg3LjA3MTA5OWUtMDEpLCBRVENGTExEVCgtNy4wNzEwMzZlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTAwZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMDM0ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMTAzZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAzMmUtMDEpLCBRVENGTExEVCgtNy4wNzExMDVlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzEwMzBlLTAxKSwgUVRDRkxMRFQoNy4wNzExMDZlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDI4ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEwOGUtMDEpLAotICBRVENGTExEVCg3LjA3MTAyN2UtMDEpLCBRVENGTExEVCg3LjA3MTExMGUtMDEpLCBRVENGTExEVCgtNy4wNzEwMjVlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTEyZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMDIzZS0wMSksIFFUQ0ZMTERUKDcuMDcxMTE0ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAyMWUtMDEpLCBRVENGTExEVCgtNy4wNzExMTVlLTAxKSwKLSAgUVRDRkxMRFQoNy4wNzEwMTllLTAxKSwgUVRDRkxMRFQoNy4wNzExMTdlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMDE3ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEyMGUtMDEpLAotICBRVENGTExEVCg3LjA3MTAxNWUtMDEpLCBRVENGTExEVCg3LjA3MTEyMWUtMDEpLCBRVENGTExEVCgtNy4wNzEwMTNlLTAxKSwgUVRDRkxMRFQoLTcuMDcxMTIzZS0wMSksCi0gIFFUQ0ZMTERUKDcuMDcxMDEyZS0wMSksIFFUQ0ZMTERUKDcuMDcxMTI1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTAxMGUtMDEpLCBRVENGTExEVCgtNy4wNzExMjdlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTA2OGUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDY2ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA3MGUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDY1ZS0wMSksICBRVENGTExEVCg3LjA3MTA3MmUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDYzZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMDc0ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDYxZS0wMSksICBRVENGTExEVCg3LjA3MTA3NWUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTA1OWUtMDEpLCBRVENGTExEVCgtNy4wNzEwNzhlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNTdlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTA4MGUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDU1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA4MWUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDUzZS0wMSksICBRVENGTExEVCg3LjA3MTA4M2UtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDUyZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMDg1ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDUwZS0wMSksICBRVENGTExEVCg3LjA3MTA4N2UtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTA0OGUtMDEpLCBRVENGTExEVCgtNy4wNzEwODllLTAxKSwgUVRDRkxMRFQoNy4wNzEwNDZlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTA5MGUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDQ0ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA5MmUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDQyZS0wMSksICBRVENGTExEVCg3LjA3MTA5NWUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDQwZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMDk2ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDM4ZS0wMSksICBRVENGTExEVCg3LjA3MTA5OGUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTAzN2UtMDEpLCBRVENGTExEVCgtNy4wNzExMDBlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMzVlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTEwMmUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDMzZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEwM2UtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDMxZS0wMSksICBRVENGTExEVCg3LjA3MTEwNWUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDMwZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMTA3ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDI4ZS0wMSksICBRVENGTExEVCg3LjA3MTEwOWUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTAyNWUtMDEpLCBRVENGTExEVCgtNy4wNzExMTFlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMjRlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTExM2UtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDIyZS0wMSksIFFUQ0ZMTERUKC03LjA3MTExNWUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDIwZS0wMSksICBRVENGTExEVCg3LjA3MTExN2UtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDE4ZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMTE4ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDE2ZS0wMSksICBRVENGTExEVCg3LjA3MTEyMGUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTAxNWUtMDEpLCBRVENGTExEVCgtNy4wNzExMjJlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMTNlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTEyNGUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDExZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEyNmUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDA5ZS0wMSksCit9OworY29uc3QgRklYUF9RVFcgcW1mX3BoYXNlc2hpZnRfc2luNjRfY2xkZmJbNjRdID0geworICAgIFFUQ0ZMTERUKDcuMDcxMDY3ZS0wMSksICBRVENGTExEVCg3LjA3MTA2OWUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDY1ZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMDcxZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDY0ZS0wMSksICBRVENGTExEVCg3LjA3MTA3M2UtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTA2MmUtMDEpLCBRVENGTExEVCgtNy4wNzEwNzVlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNjBlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTA3N2UtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDU4ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA3OGUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDU2ZS0wMSksICBRVENGTExEVCg3LjA3MTA4MGUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDU1ZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMDgyZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDUzZS0wMSksICBRVENGTExEVCg3LjA3MTA4NGUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTA1MGUtMDEpLCBRVENGTExEVCgtNy4wNzEwODZlLTAxKSwgUVRDRkxMRFQoNy4wNzEwNDllLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTA4OGUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDQ3ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTA5MGUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDQ1ZS0wMSksICBRVENGTExEVCg3LjA3MTA5MmUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDQzZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMDkzZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDQxZS0wMSksICBRVENGTExEVCg3LjA3MTA5NWUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTA0MGUtMDEpLCBRVENGTExEVCgtNy4wNzEwOTdlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMzhlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTA5OWUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDM2ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEwMGUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDM0ZS0wMSksICBRVENGTExEVCg3LjA3MTEwM2UtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDMyZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMTA1ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDMwZS0wMSksICBRVENGTExEVCg3LjA3MTEwNmUtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTAyOGUtMDEpLCBRVENGTExEVCgtNy4wNzExMDhlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMjdlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTExMGUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDI1ZS0wMSksIFFUQ0ZMTERUKC03LjA3MTExMmUtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDIzZS0wMSksICBRVENGTExEVCg3LjA3MTExNGUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDIxZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMTE1ZS0wMSksIFFUQ0ZMTERUKDcuMDcxMDE5ZS0wMSksICBRVENGTExEVCg3LjA3MTExN2UtMDEpLAorICAgIFFUQ0ZMTERUKC03LjA3MTAxN2UtMDEpLCBRVENGTExEVCgtNy4wNzExMjBlLTAxKSwgUVRDRkxMRFQoNy4wNzEwMTVlLTAxKSwKKyAgICBRVENGTExEVCg3LjA3MTEyMWUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDEzZS0wMSksIFFUQ0ZMTERUKC03LjA3MTEyM2UtMDEpLAorICAgIFFUQ0ZMTERUKDcuMDcxMDEyZS0wMSksICBRVENGTExEVCg3LjA3MTEyNWUtMDEpLCAgUVRDRkxMRFQoLTcuMDcxMDEwZS0wMSksCisgICAgUVRDRkxMRFQoLTcuMDcxMTI3ZS0wMSksCiB9OwogCiAvL0B9CiAKICNlbmRpZiAvKiAjaWZkZWYgTE9XX1BPV0VSX1NCUl9PTkxZICovCiAKLQotCiAvKiEKICAgXG5hbWUgUU1GCiAgIFxicmllZiAgUU1GLVRhYmxlCkBAIC0xNjIwLDIxMSArNTQ5MSw5ODMgQEAKIAogTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCiBSQU1fQUxJR04KLWNvbnN0IEZJWFBfUEZUIHFtZl9jbGRmYl82NDBbUU1GNjQwX0NMREZCX1BGVF9UQUJMRV9TSVpFXSA9Ci17Ci0gIFFUQ0ZMTEQoNi41NzE3NjBlLTA3KSwgUVRDRkxMRCgtOC4wMTAwNzllLTA2KSwgUVRDRkxMRCgtMS4yNTA3NDNlLTAzKSwgUVRDRkxMRCg4Ljk5NjM3MWUtMDMpLCBRVENGTExEKDUuMTI4NTU3ZS0wMSksCi0gIFFUQ0ZMTEQoNC4xMTgzNjBlLTA3KSwgUVRDRkxMRCgtMS40Njk5MzNlLTA1KSwgUVRDRkxMRCgtMS4xOTQ3NDNlLTAzKSwgUVRDRkxMRCg5LjY0MDI5OWUtMDMpLCBRVENGTExEKDUuMjk5NTEwZS0wMSksCi0gIFFUQ0ZMTEQoOC4xMDk5NTJlLTA3KSwgUVRDRkxMRCg0Ljg0MDU3OGUtMDYpLCBRVENGTExEKC0xLjE1MTc5NmUtMDMpLCBRVENGTExEKDEuMDMzMTI2ZS0wMiksIFFUQ0ZMTEQoNS40NzA2NTJlLTAxKSwKLSAgUVRDRkxMRCg3LjA5OTYzM2UtMDcpLCBRVENGTExEKDcuMTY3MTAxZS0wNiksIFFUQ0ZMTEQoLTEuMDk5MDAxZS0wMyksIFFUQ0ZMTEQoMS4xMDY5NTllLTAyKSwgUVRDRkxMRCg1LjY0MTUyM2UtMDEpLAotICBRVENGTExEKDYuODM0MjEwZS0wNyksIFFUQ0ZMTEQoMS4wODgzMjVlLTA1KSwgUVRDRkxMRCgtMS4wNDc2NTVlLTAzKSwgUVRDRkxMRCgxLjE4NjIxMWUtMDIpLCBRVENGTExEKDUuODExOTkzZS0wMSksCi0gIFFUQ0ZMTEQoNC4yOTI4NjJlLTA3KSwgUVRDRkxMRCgxLjAxMzI2MGUtMDUpLCBRVENGTExEKC05Ljg2MjAyN2UtMDQpLCBRVENGTExEKDEuMjcwNzQ3ZS0wMiksIFFUQ0ZMTEQoNS45ODE4NzdlLTAxKSwKLSAgUVRDRkxMRCgtNS40MjY1OTdlLTA5KSwgUVRDRkxMRCg1Ljg2OTcwN2UtMDYpLCBRVENGTExEKC05LjI5NDY2NWUtMDQpLCBRVENGTExEKDEuMzYxMDcyZS0wMiksIFFUQ0ZMTEQoNi4xNTEwMzFlLTAxKSwKLSAgUVRDRkxMRCg2LjM1NTMwM2UtMDgpLCBRVENGTExEKDEuMTI1MTM1ZS0wNSksIFFUQ0ZMTEQoLTkuNzY3NzA5ZS0wNCksIFFUQ0ZMTEQoMS40NTYyMDllLTAyKSwgUVRDRkxMRCg2LjMxOTI4NGUtMDEpLAotICBRVENGTExEKDUuNDkwNTcwZS0wNyksIFFUQ0ZMTEQoMi4wMTU0NDVlLTA1KSwgUVRDRkxMRCgtMS4wNDA1OThlLTAzKSwgUVRDRkxMRCgxLjU1Nzc1OWUtMDIpLCBRVENGTExEKDYuNDg2NDM4ZS0wMSksCi0gIFFUQ0ZMTEQoMS42MjAxNzFlLTA2KSwgUVRDRkxMRCgyLjgwMDQ1NmUtMDUpLCBRVENGTExEKC0xLjE0NjI2OGUtMDMpLCBRVENGTExEKDEuNjY1MTg4ZS0wMiksIFFUQ0ZMTEQoNi42NTIzMDRlLTAxKSwKLSAgUVRDRkxMRCgtNi4wMjUxMTBlLTEwKSwgUVRDRkxMRCg4Ljk3NTk3OGUtMDYpLCBRVENGTExEKC0xLjI5Mjg2NmUtMDMpLCBRVENGTExEKDEuNzc4MjQ5ZS0wMiksIFFUQ0ZMTEQoNi44MTY2NjhlLTAxKSwKLSAgUVRDRkxMRCgtNi4zMjU2NjRlLTEwKSwgUVRDRkxMRCg4LjU2MzgyMGUtMDYpLCBRVENGTExEKC0xLjE5NjYzOGUtMDMpLCBRVENGTExEKDEuODk3NTA2ZS0wMiksIFFUQ0ZMTEQoNi45NzkzMzdlLTAxKSwKLSAgUVRDRkxMRCgtNC4wMTM1MjVlLTA5KSwgUVRDRkxMRCgxLjE2ODg5NWUtMDUpLCBRVENGTExEKC05LjcyNjY5OWUtMDQpLCBRVENGTExEKDIuMDIzNTI1ZS0wMiksIFFUQ0ZMTEQoNy4xNDAwODdlLTAxKSwKLSAgUVRDRkxMRCgtNC4yNDQwOTFlLTA5KSwgUVRDRkxMRCg3LjMwMDU4OWUtMDYpLCBRVENGTExEKC04LjAyOTYyMGUtMDQpLCBRVENGTExEKDIuMTU2MzA1ZS0wMiksIFFUQ0ZMTEQoNy4yOTg3NDZlLTAxKSwKLSAgUVRDRkxMRCgtMS44NDY1NDhlLTA4KSwgUVRDRkxMRCgzLjk2NTM2NGUtMDYpLCBRVENGTExEKC02Ljc1NDkzNmUtMDQpLCBRVENGTExEKDIuMjk2NDcxZS0wMiksIFFUQ0ZMTEQoNy40NTUxMTJlLTAxKSwKLSAgUVRDRkxMRCgtMy44NzA1MzdlLTA5KSwgUVRDRkxMRCgxLjM3NDg5NmUtMDYpLCBRVENGTExEKC01Ljc5MTE0NWUtMDQpLCBRVENGTExEKDIuNDQzNDM0ZS0wMiksIFFUQ0ZMTEQoNy42MDkwNTFlLTAxKSwKLSAgUVRDRkxMRCgtOC44ODM0OTllLTEwKSwgUVRDRkxMRCgzLjc5ODUyMGUtMDcpLCBRVENGTExEKC00LjczMzE0OGUtMDQpLCBRVENGTExEKDIuNTk3OTU3ZS0wMiksIFFUQ0ZMTEQoNy43NjAzODZlLTAxKSwKLSAgUVRDRkxMRCg1LjMwMzUyOGUtMDgpLCBRVENGTExEKDQuNDY5NzI5ZS0wNiksIFFUQ0ZMTEQoLTIuOTk4NzQwZS0wNCksIFFUQ0ZMTEQoMi43NjAwOTFlLTAyKSwgUVRDRkxMRCg3LjkwODk5NWUtMDEpLAotICBRVENGTExEKDcuMzkxOTc0ZS0wOCksIFFUQ0ZMTEQoMi40NjE4NzdlLTA1KSwgUVRDRkxMRCg3Ljg4MjYyMGUtMDUpLCBRVENGTExEKDIuOTMxNTI2ZS0wMiksIFFUQ0ZMTEQoOC4wNTQ3MDFlLTAxKSwKLSAgUVRDRkxMRCgxLjcyMzIxN2UtMDkpLCBRVENGTExEKDQuMDA1MjY5ZS0wNSksIFFUQ0ZMTEQoNC43MDgwMTBlLTA0KSwgUVRDRkxMRCgzLjExMDg2MWUtMDIpLCBRVENGTExEKDguMTk3Mzg3ZS0wMSksCi0gIFFUQ0ZMTEQoMi40NDMwODVlLTA3KSwgUVRDRkxMRCg1LjI3Mjk4MmUtMDUpLCBRVENGTExEKDguMDg5ODEyZS0wNCksIFFUQ0ZMTEQoMy4yOTgxNTFlLTAyKSwgUVRDRkxMRCg4LjMzNjg2NGUtMDEpLAotICBRVENGTExEKDEuMzg3NTY3ZS0wOCksIFFUQ0ZMTEQoNC45MzkzOTJlLTA1KSwgUVRDRkxMRCgxLjEyNzE0MmUtMDMpLCBRVENGTExEKDMuNDkzMzAwZS0wMiksIFFUQ0ZMTEQoOC40NzI5ODdlLTAxKSwKLSAgUVRDRkxMRCgtNS42OTA1MzFlLTA2KSwgUVRDRkxMRCgtNC4yNTY0NDJlLTA1KSwgUVRDRkxMRCgxLjQxNzM2N2UtMDMpLCBRVENGTExEKDMuNjk2MzQzZS0wMiksIFFUQ0ZMTEQoOC42MDU1NDNlLTAxKSwKLSAgUVRDRkxMRCgzLjYyOTA2N2UtMDYpLCBRVENGTExEKDYuNTgyMzI4ZS0wNSksIFFUQ0ZMTEQoMS43MjUwMzBlLTAzKSwgUVRDRkxMRCgzLjkwNzEzOGUtMDIpLCBRVENGTExEKDguNzM0MzY3ZS0wMSksCi0gIFFUQ0ZMTEQoLTUuMzkzNTU2ZS0wOCksIFFUQ0ZMTEQoNi40ODE5MjFlLTA1KSwgUVRDRkxMRCgxLjk0ODA2OWUtMDMpLCBRVENGTExEKDQuMTI1NTcwZS0wMiksIFFUQ0ZMTEQoOC44NTkyMzJlLTAxKSwKLSAgUVRDRkxMRCgxLjM0OTk0NGUtMDcpLCBRVENGTExEKDMuMzY3OTk4ZS0wNSksIFFUQ0ZMTEQoMi4wMzM0NjVlLTAzKSwgUVRDRkxMRCg0LjM1NTU2OGUtMDIpLCBRVENGTExEKDguOTc5OTU5ZS0wMSksCi0gIFFUQ0ZMTEQoNy4zMjY2MTFlLTA5KSwgUVRDRkxMRCg0LjY5NDI1MmUtMDUpLCBRVENGTExEKDIuMjM5MTQzZS0wMyksIFFUQ0ZMTEQoNC41OTkwNjhlLTAyKSwgUVRDRkxMRCg5LjA5NjMxMWUtMDEpLAotICBRVENGTExEKDIuMzk5Njk2ZS0wNyksIFFUQ0ZMTEQoNi45MDQ0MTVlLTA1KSwgUVRDRkxMRCgyLjQ3MDQ1NmUtMDMpLCBRVENGTExEKDQuODQ5Mjg1ZS0wMiksIFFUQ0ZMTEQoOS4yMDgxOTVlLTAxKSwKLSAgUVRDRkxMRCgzLjMzMDk4MmUtMDcpLCBRVENGTExEKDUuNjQzMTAzZS0wNSksIFFUQ0ZMTEQoMi42MzA0NzJlLTAzKSwgUVRDRkxMRCg1LjEwNTYyMWUtMDIpLCBRVENGTExEKDkuMzE1NDQyZS0wMSksCi0gIFFUQ0ZMTEQoNC43Njc3OTRlLTA3KSwgUVRDRkxMRCg3LjA5NTg4N2UtMDUpLCBRVENGTExEKDIuNzAzMDE5ZS0wMyksIFFUQ0ZMTEQoNS4zNjgzMTNlLTAyKSwgUVRDRkxMRCg5LjQxNzk3NmUtMDEpLAotICBRVENGTExEKDMuNDI4NjYxZS0wNyksIFFUQ0ZMTEQoNy44NzI1OTNlLTA1KSwgUVRDRkxMRCgyLjcyOTEzN2UtMDMpLCBRVENGTExEKDUuNjM3MjE5ZS0wMiksIFFUQ0ZMTEQoOS41MTU2NzVlLTAxKSwKLSAgUVRDRkxMRCg4LjY3Njg0OGUtMDYpLCBRVENGTExEKDIuNjY2NDQ1ZS0wNCksIFFUQ0ZMTEQoMi43MTk3NDllLTAzKSwgUVRDRkxMRCg1LjkxMTM2M2UtMDIpLCBRVENGTExEKDkuNjA4NTIwZS0wMSksCi0gIFFUQ0ZMTEQoMi43MjIyOTZlLTA1KSwgUVRDRkxMRCg1LjgyMjIwMWUtMDQpLCBRVENGTExEKDIuNTMwOTA3ZS0wMyksIFFUQ0ZMTEQoNi4xOTI2OTNlLTAyKSwgUVRDRkxMRCg5LjY5NjQyNmUtMDEpLAotICBRVENGTExEKDMuNTc1NjUxZS0wNyksIFFUQ0ZMTEQoNy44NzAzNTVlLTA1KSwgUVRDRkxMRCgyLjIyNTUyNGUtMDMpLCBRVENGTExEKDYuNDgwNDQ5ZS0wMiksIFFUQ0ZMTEQoOS43Nzk0MDVlLTAxKSwKLSAgUVRDRkxMRCg2LjI5MzAwMmUtMDcpLCBRVENGTExEKDcuMjQ1MDk2ZS0wNSksIFFUQ0ZMTEQoMS44OTE5NzJlLTAzKSwgUVRDRkxMRCg2Ljc3MTY3NWUtMDIpLCBRVENGTExEKDkuODU3Mzg4ZS0wMSksCi0gIFFUQ0ZMTEQoMS4wNzAyNDNlLTA2KSwgUVRDRkxMRCg3LjE5NDE1MWUtMDUpLCBRVENGTExEKDEuNTU3MTEyZS0wMyksIFFUQ0ZMTEQoNy4wNjQ5NDhlLTAyKSwgUVRDRkxMRCg5LjkzMDM4MGUtMDEpLAotICBRVENGTExEKC0zLjIyNTkxM2UtMDcpLCBRVENGTExEKC03LjY3OTk1NWUtMDUpLCBRVENGTExEKDEuMTk0NzMxZS0wMyksIFFUQ0ZMTEQoNy4zNjA1NTllLTAyKSwgUVRDRkxMRCg5Ljk5ODI4NmUtMDEpLAotICBRVENGTExEKC05LjU5NzUxNmUtMDkpLCBRVENGTExEKC02LjA5MzM3M2UtMDUpLCBRVENGTExEKDYuNDE1NDAyZS0wNCksIFFUQ0ZMTEQoNy42NTc2NTBlLTAyKSwgUVRDRkxMRCgxLjAwNjEwOWUrMDApLAotICBRVENGTExEKC04LjkwODA0MWUtMDgpLCBRVENGTExEKC0xLjcyMTM0N2UtMDUpLCBRVENGTExEKDEuMDkyNTI2ZS0wNCksIFFUQ0ZMTEQoNy45NTU1NzFlLTAyKSwgUVRDRkxMRCgxLjAxMTg2OGUrMDApLAotICBRVENGTExEKC0yLjI4NTU2M2UtMDUpLCBRVENGTExEKC04Ljg4MjMwNWUtMDUpLCBRVENGTExEKDIuOTM0ODc2ZS0wNCksIFFUQ0ZMTEQoOC4yNTE5NjJlLTAyKSwgUVRDRkxMRCgxLjAxNzEwMGUrMDApLAotICBRVENGTExEKDEuMDEzNTc1ZS0wNSksIFFUQ0ZMTEQoNi40MTg2NThlLTA1KSwgUVRDRkxMRCg1LjcyMTIyM2UtMDQpLCBRVENGTExEKDguNTQ3NzE2ZS0wMiksIFFUQ0ZMTEQoMS4wMjE3OTllKzAwKSwKLSAgUVRDRkxMRCgtMS43MDY5NDFlLTA1KSwgUVRDRkxMRCgxLjc2OTI2MmUtMDQpLCBRVENGTExEKDYuOTc2NTYxZS0wNCksIFFUQ0ZMTEQoOC44NDE4MTNlLTAyKSwgUVRDRkxMRCgxLjAyNTk2N2UrMDApLAotICBRVENGTExEKDEuMzU2NzI4ZS0wNiksIFFUQ0ZMTEQoMi4yMDYzNDFlLTA1KSwgUVRDRkxMRCg3LjM3NjEwMWUtMDQpLCBRVENGTExEKDkuMTMzNTkxZS0wMiksIFFUQ0ZMTEQoMS4wMjk2MDFlKzAwKSwKLSAgUVRDRkxMRCgtMS4zOTg5MTNlLTA4KSwgUVRDRkxMRCgtNi41Mzg4NzllLTA2KSwgUVRDRkxMRCg3LjE1NDEyNGUtMDQpLCBRVENGTExEKDkuNDIxNjI0ZS0wMiksIFFUQ0ZMTEQoMS4wMzI3MTNlKzAwKSwKLSAgUVRDRkxMRCgzLjU1Mjk5MmUtMDgpLCBRVENGTExEKC0xLjA1MjcwN2UtMDUpLCBRVENGTExEKDcuMTM5OTIwZS0wNCksIFFUQ0ZMTEQoOS43MDUyNDBlLTAyKSwgUVRDRkxMRCgxLjAzNTMxMmUrMDApLAotICBRVENGTExEKDQuMjExMTc3ZS0wNyksIFFUQ0ZMTEQoLTkuMDc1NDMxZS0wNiksIFFUQ0ZMTEQoNi45NDQxMjNlLTA0KSwgUVRDRkxMRCg5Ljk4Mjk1OGUtMDIpLCBRVENGTExEKDEuMDM3NDIyZSswMCksCi0gIFFUQ0ZMTEQoNS40MzM3MTllLTA3KSwgUVRDRkxMRCgtMS43NDgyODVlLTA1KSwgUVRDRkxMRCg2Ljc2NjMyMGUtMDQpLCBRVENGTExEKDEuMDI1Mzk4ZS0wMSksIFFUQ0ZMTEQoMS4wMzkwNjJlKzAwKSwKLSAgUVRDRkxMRCg4LjIyNjYwMGUtMDgpLCBRVENGTExEKC0zLjQ5ODI4NmUtMDUpLCBRVENGTExEKDYuODg3Nzg0ZS0wNCksIFFUQ0ZMTEQoMS4wNTE2NDJlLTAxKSwgUVRDRkxMRCgxLjA0MDI2MmUrMDApLAotICBRVENGTExEKDEuMjcyNzA1ZS0wNyksIFFUQ0ZMTEQoLTQuNDg5NDkxZS0wNSksIFFUQ0ZMTEQoNi42NzMyNTBlLTA0KSwgUVRDRkxMRCgxLjA3Njk3MmUtMDEpLCBRVENGTExEKDEuMDQxMDQzZSswMCksCi0gIFFUQ0ZMTEQoMi41NDI1OThlLTA3KSwgUVRDRkxMRCgtNS40NDk4MTZlLTA1KSwgUVRDRkxMRCg1Ljk3MDY5N2UtMDQpLCBRVENGTExEKDEuMTAxMjE2ZS0wMSksIFFUQ0ZMTEQoMS4wNDE0MzRlKzAwKSwKLSAgUVRDRkxMRCg2LjMyMjc3MGUtMDcpLCBRVENGTExEKC01Ljg3NDE5OWUtMDUpLCBRVENGTExEKDQuNzQ5OTMxZS0wNCksIFFUQ0ZMTEQoMS4xMjQyOTZlLTAxKSwgUVRDRkxMRCgxLjA0MTQ0M2UrMDApLAotICBRVENGTExEKDIuODAxODgyZS0wOCksIFFUQ0ZMTEQoLTcuOTM0NTEwZS0wNSksIFFUQ0ZMTEQoMy4xODkzMzZlLTA0KSwgUVRDRkxMRCgxLjE0NjA0MmUtMDEpLCBRVENGTExEKDEuMDQxMDg3ZSswMCksCi0gIFFUQ0ZMTEQoNS44OTE5MDRlLTA3KSwgUVRDRkxMRCgtOC4wMzkyMzJlLTA1KSwgUVRDRkxMRCgxLjIxODIyNmUtMDQpLCBRVENGTExEKDEuMTY2Mzk5ZS0wMSksIFFUQ0ZMTEQoMS4wNDAzNTBlKzAwKSwKLSAgUVRDRkxMRCg3LjMwMTk1N2UtMDcpLCBRVENGTExEKC05LjkwNzYzMWUtMDUpLCBRVENGTExEKC0xLjMyNDI5MmUtMDQpLCBRVENGTExEKDEuMTg1MjQzZS0wMSksIFFUQ0ZMTEQoMS4wMzkyMjhlKzAwKSwKLSAgUVRDRkxMRCgtNC41MTg2MDNlLTA2KSwgUVRDRkxMRCgtMi4yMTcwMjVlLTA0KSwgUVRDRkxMRCgtNC4yNjg1NzVlLTA0KSwgUVRDRkxMRCgxLjIwMjU0NmUtMDEpLCBRVENGTExEKDEuMDM3NjgzZSswMCksCi0gIFFUQ0ZMTEQoLTMuNTYxNTg1ZS0wNiksIFFUQ0ZMTEQoLTIuNDE1MTY2ZS0wNCksIFFUQ0ZMTEQoLTcuODA0NTQ2ZS0wNCksIFFUQ0ZMTEQoMS4yMTgxODRlLTAxKSwgUVRDRkxMRCgxLjAzNTY5NGUrMDApLAotICBRVENGTExEKC0xLjA3NDcxN2UtMDcpLCBRVENGTExEKC0yLjEyMzY3MmUtMDQpLCBRVENGTExEKC0xLjE1NjY4MGUtMDMpLCBRVENGTExEKDEuMjMyMTMyZS0wMSksIFFUQ0ZMTEQoMS4wMzMyMDZlKzAwKSwKLSAgUVRDRkxMRCgxLjMyMzI2OGUtMDYpLCBRVENGTExEKC0yLjA3ODI5OWUtMDQpLCBRVENGTExEKC0xLjUyNTgxOWUtMDMpLCBRVENGTExEKDEuMjQ0MjcwZS0wMSksIFFUQ0ZMTEQoMS4wMzAxOTllKzAwKSwKLSAgUVRDRkxMRCgzLjM3NzgxNWUtMDYpLCBRVENGTExEKC0xLjg4NTI4NmUtMDQpLCBRVENGTExEKC0xLjkxNDExNWUtMDMpLCBRVENGTExEKDEuMjU0NjA1ZS0wMSksIFFUQ0ZMTEQoMS4wMjY2MTZlKzAwKSwKLSAgUVRDRkxMRCg1LjE2MTYwN2UtMDYpLCBRVENGTExEKC0xLjcyODY3M2UtMDQpLCBRVENGTExEKC0yLjI5MjgxNGUtMDMpLCBRVENGTExEKDEuMjYyOTk2ZS0wMSksIFFUQ0ZMTEQoMS4wMjI0NzBlKzAwKSwKLSAgUVRDRkxMRCg1LjkyNDAwMWUtMDYpLCBRVENGTExEKC0xLjc0NDg0MmUtMDQpLCBRVENGTExEKC0yLjY1ODA0MmUtMDMpLCBRVENGTExEKDEuMjY5NDE2ZS0wMSksIFFUQ0ZMTEQoMS4wMTc3MjllKzAwKSwKLSAgUVRDRkxMRCg2LjMxMDIwOGUtMDYpLCBRVENGTExEKC0xLjc4NDE5M2UtMDQpLCBRVENGTExEKC0zLjAwMDQyM2UtMDMpLCBRVENGTExEKDEuMjczNjQ4ZS0wMSksIFFUQ0ZMTEQoMS4wMTI1MDhlKzAwKSwKLSAgUVRDRkxMRCgzLjM1NzIxOWUtMDYpLCBRVENGTExEKC0yLjEzMTQwNmUtMDQpLCBRVENGTExEKC0zLjMxODg1OGUtMDMpLCBRVENGTExEKDEuMjc1NTYxZS0wMSksIFFUQ0ZMTEQoMS4wMDY4OTNlKzAwKSwKLSAgUVRDRkxMRCg1LjE4OTA4N2UtMDYpLCBRVENGTExEKC0yLjA3ODg4NmUtMDQpLCBRVENGTExEKC0zLjU5NzQ3NmUtMDMpLCBRVENGTExEKDEuMjc0NTY4ZS0wMSksIFFUQ0ZMTEQoMS4wMDE0NjNlKzAwKSwKLSAgUVRDRkxMRCg0LjE3ODA1MGUtMDYpLCBRVENGTExEKC00LjY2Mzc3OGUtMDUpLCBRVENGTExEKC0zLjg3MDg1MmUtMDMpLCBRVENGTExEKDEuMjczNTkxZS0wMSksIFFUQ0ZMTEQoOS45Mjc1NDRlLTAxKSwKLSAgUVRDRkxMRCg1LjM2NDgwN2UtMDYpLCBRVENGTExEKC01Ljg4OTI3N2UtMDYpLCBRVENGTExEKC00LjEzNTEzMGUtMDMpLCBRVENGTExEKDEuMjcyNDk5ZS0wMSksIFFUQ0ZMTEQoOS44MDc2OTJlLTAxKSwKLSAgUVRDRkxMRCg0LjA4MzcxOWUtMDYpLCBRVENGTExEKC0xLjc3NDEwOGUtMDUpLCBRVENGTExEKC00LjM1MTY2OGUtMDMpLCBRVENGTExEKDEuMjY4MjgxZS0wMSksIFFUQ0ZMTEQoOS42OTAwMTdlLTAxKSwKLSAgUVRDRkxMRCgzLjU2NzU4MWUtMDYpLCBRVENGTExEKC0yLjU5OTQ2OGUtMDgpLCBRVENGTExEKC00LjUxNzE5MGUtMDMpLCBRVENGTExEKDEuMjYxMjYyZS0wMSksIFFUQ0ZMTEQoOS41Njg4ODZlLTAxKSwKLSAgUVRDRkxMRCgzLjI2Mjc1NGUtMDYpLCBRVENGTExEKDEuMjYwNjQwZS0wNSksIFFUQ0ZMTEQoLTQuNjM2MjI4ZS0wMyksIFFUQ0ZMTEQoMS4yNTE0NzdlLTAxKSwgUVRDRkxMRCg5LjQ0MzgwM2UtMDEpLAotICBRVENGTExEKDIuMDQxMTI4ZS0wNiksIFFUQ0ZMTEQoMi4zNjQ1MTllLTA1KSwgUVRDRkxMRCgtNC43MDQzMjFlLTAzKSwgUVRDRkxMRCgxLjIzODg2OWUtMDEpLCBRVENGTExEKDkuMzEzODc0ZS0wMSksCi0gIFFUQ0ZMTEQoLTIuNTY3OTY1ZS0wOCksIFFUQ0ZMTEQoMi44MDY5NjNlLTA1KSwgUVRDRkxMRCgtNC43MjI1NjhlLTAzKSwgUVRDRkxMRCgxLjIyMzM3MWUtMDEpLCBRVENGTExEKDkuMTc5NjY2ZS0wMSksCi0gIFFUQ0ZMTEQoMi43MTQ4NzllLTA3KSwgUVRDRkxMRCg0LjQ5MzkxNmUtMDUpLCBRVENGTExEKC00LjY2MzI3NmUtMDMpLCBRVENGTExEKDEuMjA0ODU0ZS0wMSksIFFUQ0ZMTEQoOS4wNDEyODZlLTAxKSwKLSAgUVRDRkxMRCgyLjE1MDg4NGUtMDYpLCBRVENGTExEKDUuNDA4MTU1ZS0wNSksIFFUQ0ZMTEQoLTQuNTU0ODExZS0wMyksIFFUQ0ZMTEQoMS4xODMyMzNlLTAxKSwgUVRDRkxMRCg4Ljg5OTQ3NGUtMDEpLAotICBRVENGTExEKDUuODE4NTk1ZS0wNiksIFFUQ0ZMTEQoMy43NTk2MzBlLTA1KSwgUVRDRkxMRCgtNC4zNjk1NTRlLTAzKSwgUVRDRkxMRCgxLjE1ODM1OWUtMDEpLCBRVENGTExEKDguNzU0NjQxZS0wMSksCi0gIFFUQ0ZMTEQoLTEuNjg2MTM3ZS0wOSksIFFUQ0ZMTEQoMi41MTUxMThlLTA1KSwgUVRDRkxMRCgtNC4wOTEwMzNlLTAzKSwgUVRDRkxMRCgxLjEzMDE4MGUtMDEpLCBRVENGTExEKDguNjA3NDkyZS0wMSksCi0gIFFUQ0ZMTEQoLTEuNzc1MTkxZS0wOSksIFFUQ0ZMTEQoMi40MDY1MTdlLTA1KSwgUVRDRkxMRCgtMy43OTQ0MjVlLTAzKSwgUVRDRkxMRCgxLjA5ODU1MWUtMDEpLCBRVENGTExEKDguNDU4NDUwZS0wMSksCi0gIFFUQ0ZMTEQoLTIuMjIyMDcyZS0wOSksIFFUQ0ZMTEQoMy42Mjg1MTFlLTA1KSwgUVRDRkxMRCgtMy40NjAzNjNlLTAzKSwgUVRDRkxMRCgxLjA2MzQ1NWUtMDEpLCBRVENGTExEKDguMzA4MDQwZS0wMSksCi0gIFFUQ0ZMTEQoLTEuMjgwNjc1ZS0wOCksIFFUQ0ZMTEQoMi4yNDE1NDZlLTA1KSwgUVRDRkxMRCgtMy4wNjQzMTFlLTAzKSwgUVRDRkxMRCgxLjAyNDgwNWUtMDEpLCBRVENGTExEKDguMTU2NTIzZS0wMSksCi0gIFFUQ0ZMTEQoLTYuOTc3MDc4ZS0wOCksIFFUQ0ZMTEQoMS40OTkxNzBlLTA1KSwgUVRDRkxMRCgtMi42MjE1MzdlLTAzKSwgUVRDRkxMRCg5LjgyNjI1MWUtMDIpLCBRVENGTExEKDguMDA0MTY1ZS0wMSksCi0gIFFUQ0ZMTEQoLTEuNDA5OTI3ZS0wOCksIFFUQ0ZMTEQoNS4wMDk5MTNlLTA2KSwgUVRDRkxMRCgtMi4xMjQ2NDhlLTAzKSwgUVRDRkxMRCg5LjM2ODY1MmUtMDIpLCBRVENGTExEKDcuODUxMDEyZS0wMSksCi0gIFFUQ0ZMTEQoLTIuOTg2NDg5ZS0wOSksIFFUQ0ZMTEQoMS4yNzcxODRlLTA2KSwgUVRDRkxMRCgtMS41OTQ4NjFlLTAzKSwgUVRDRkxMRCg4Ljg3NTc1NmUtMDIpLCBRVENGTExEKDcuNjk3MDkzZS0wMSksCi0gIFFUQ0ZMTEQoMS44NzYwMjJlLTA3KSwgUVRDRkxMRCgxLjU4MDE4OWUtMDUpLCBRVENGTExEKC0xLjA2MTQ5OWUtMDMpLCBRVENGTExEKDguMzQ3MTUxZS0wMiksIFFUQ0ZMTEQoNy41NDIyOTRlLTAxKSwKLSAgUVRDRkxMRCgxLjczNzI3N2UtMDcpLCBRVENGTExEKDUuNTMzOTUzZS0wNSksIFFUQ0ZMTEQoLTYuMTY5ODU1ZS0wNCksIFFUQ0ZMTEQoNy43ODMzMDBlLTAyKSwgUVRDRkxMRCg3LjM4NjUxNWUtMDEpLAotICBRVENGTExEKDMuODE4NTg5ZS0wOSksIFFUQ0ZMTEQoOC44NzAxODJlLTA1KSwgUVRDRkxMRCgtMi4wMDQ4MjNlLTA0KSwgUVRDRkxMRCg3LjE4NDA3NGUtMDIpLCBRVENGTExEKDcuMjI5NTk5ZS0wMSksCi0gIFFUQ0ZMTEQoNS4xNDM2MTVlLTA3KSwgUVRDRkxMRCgxLjAzNTc4M2UtMDQpLCBRVENGTExEKDIuMDQ4NDk5ZS0wNCksIFFUQ0ZMTEQoNi41NTAyMDllLTAyKSwgUVRDRkxMRCg3LjA3MTQ0OGUtMDEpLAotICBRVENGTExEKDIuODIwMjkyZS0wOCksIFFUQ0ZMTEQoOS45OTA3NThlLTA1KSwgUVRDRkxMRCg1LjYyMTcyMWUtMDQpLCBRVENGTExEKDUuODgxMjk3ZS0wMiksIFFUQ0ZMTEQoNi45MTE5ODJlLTAxKSwKLSAgUVRDRkxMRCg0LjY3NzAxNmUtMDYpLCBRVENGTExEKDEuMTgxMDc4ZS0wNCksIFFUQ0ZMTEQoOS4zNzM5NzVlLTA0KSwgUVRDRkxMRCg1LjE3Nzk2NWUtMDIpLCBRVENGTExEKDYuNzUxMTk5ZS0wMSksCi0gIFFUQ0ZMTEQoMy4zNjE2ODJlLTA2KSwgUVRDRkxMRCgyLjEyNjM2NWUtMDUpLCBRVENGTExEKDEuMzQ0NjU3ZS0wMyksIFFUQ0ZMTEQoNC40Mzk2ODRlLTAyKSwgUVRDRkxMRCg2LjU4OTE0OWUtMDEpLAotICBRVENGTExEKC00Ljg4MDg0NWUtMDgpLCBRVENGTExEKDUuODYxODAwZS0wNSksIFFUQ0ZMTEQoMS44MTIxNzZlLTAzKSwgUVRDRkxMRCgzLjY2Njk0M2UtMDIpLCBRVENGTExEKDYuNDI1OTQwZS0wMSksCi0gIFFUQ0ZMTEQoMi4yNjc3MzFlLTA3KSwgUVRDRkxMRCg1LjAyMTkwNmUtMDUpLCBRVENGTExEKDIuMTcyODY2ZS0wMyksIFFUQ0ZMTEQoMi44NTc1MjhlLTAyKSwgUVRDRkxMRCg2LjI2MTcyNWUtMDEpLAotICBRVENGTExEKDUuMTU4MjEzZS0wOSksIFFUQ0ZMTEQoNC4xNTAwNzVlLTA1KSwgUVRDRkxMRCgxLjk4NTgyNWUtMDMpLCBRVENGTExEKDIuMDEyMjM3ZS0wMiksIFFUQ0ZMTEQoNi4wOTY2OTBlLTAxKSwKLSAgUVRDRkxMRCgtMi4wNjY5NjJlLTA3KSwgUVRDRkxMRCgzLjc5OTk3MmUtMDUpLCBRVENGTExEKDEuNjk3NjUzZS0wMyksIFFUQ0ZMTEQoMS4xMzIzMjRlLTAyKSwgUVRDRkxMRCg1LjkzMDk4MmUtMDEpLAotICBRVENGTExEKDQuODgzMzA1ZS0wNyksIFFUQ0ZMTEQoNi42MDY0NjJlLTA1KSwgUVRDRkxMRCgxLjQ3MTE2N2UtMDMpLCBRVENGTExEKDIuMTg0MjU3ZS0wMyksIFFUQ0ZMTEQoNS43NjQ3MzVlLTAxKSwKLSAgUVRDRkxMRCg4LjI1NDQzMGUtMDcpLCBRVENGTExEKDkuNzU1Njg1ZS0wNSksIFFUQ0ZMTEQoMS4yMzIxMzRlLTAzKSwgUVRDRkxMRCgtNy4yOTgxOThlLTAzKSwgUVRDRkxMRCg1LjU5ODA1MmUtMDEpLAotICBRVENGTExEKDkuNDY0NzgzZS0wNyksIFFUQ0ZMTEQoMS44MzExMjFlLTA0KSwgUVRDRkxMRCg4Ljk5MDI1NmUtMDQpLCBRVENGTExEKC0xLjcxMTMyNGUtMDIpLCBRVENGTExEKDUuNDMwOTkwZS0wMSksCi0gIFFUQ0ZMTEQoLTEuMjMyNjkzZS0wNSksIFFUQ0ZMTEQoLTUuOTAxNjE4ZS0wNyksIFFUQ0ZMTEQoNi4xNTAzMTdlLTA0KSwgUVRDRkxMRCgtMi43MjY0ODRlLTAyKSwgUVRDRkxMRCg1LjI2MzU1NGUtMDEpLAotICBRVENGTExEKDMuODY3NDgzZS0wNSksIFFUQ0ZMTEQoLTMuNTk1MDU0ZS0wNCksIFFUQ0ZMTEQoNi4zMDc4NDFlLTA0KSwgUVRDRkxMRCgtMy43NzU5MjhlLTAyKSwgUVRDRkxMRCg1LjA5NTcyMWUtMDEpLAotICBRVENGTExEKC05Ljg3MDU0OGUtMDcpLCBRVENGTExEKC0xLjgxNTgzN2UtMDQpLCBRVENGTExEKDQuMzY2NDQ3ZS0wNCksIFFUQ0ZMTEQoLTQuODU5MDA2ZS0wMiksIFFUQ0ZMTEQoNC45Mjc0NjRlLTAxKSwKLSAgUVRDRkxMRCgtMS4wODk1MDFlLTA2KSwgUVRDRkxMRCgtOS4yMDQ4NzZlLTA1KSwgUVRDRkxMRCgxLjQ5ODIzMmUtMDQpLCBRVENGTExEKC01Ljk3Mzc0MmUtMDIpLCBRVENGTExEKDQuNzU4NzU0ZS0wMSksCi0gIFFUQ0ZMTEQoLTEuNTY5MDAzZS0wNiksIFFUQ0ZMTEQoLTUuMTkyNDQ0ZS0wNSksIFFUQ0ZMTEQoLTkuMDk5NzIzZS0wNSksIFFUQ0ZMTEQoLTcuMTIwMzU3ZS0wMiksIFFUQ0ZMTEQoNC41ODk1ODNlLTAxKSwKLSAgUVRDRkxMRCgtMi43Nzg2MThlLTA3KSwgUVRDRkxMRCg2LjQ4Nzg4MGUtMDUpLCBRVENGTExEKC0zLjMzNzk2N2UtMDQpLCBRVENGTExEKC04LjI5ODEwM2UtMDIpLCBRVENGTExEKDQuNDIwMDE0ZS0wMSksCi0gIFFUQ0ZMTEQoNi43NTcwMTVlLTA5KSwgUVRDRkxMRCg1LjM5NzA2NWUtMDUpLCBRVENGTExEKC01LjU5OTM0OGUtMDQpLCBRVENGTExEKC05LjUwNjk2N2UtMDIpLCBRVENGTExEKDQuMjUwMTQ0ZS0wMSksCi0gIFFUQ0ZMTEQoMS40OTY0MzZlLTA3KSwgUVRDRkxMRCgyLjQ3MjAyNGUtMDUpLCBRVENGTExEKC03LjY3NzYzNGUtMDQpLCBRVENGTExEKC0xLjA3NDYzMWUtMDEpLCBRVENGTExEKDQuMDgwMTU1ZS0wMSksCi0gIFFUQ0ZMTEQoMi4wNjgyOTdlLTA1KSwgUVRDRkxMRCg5LjcxMTY4MmUtMDUpLCBRVENGTExEKC05LjczMDQ2MGUtMDQpLCBRVENGTExEKC0xLjIwMTYyOWUtMDEpLCBRVENGTExEKDMuOTEwMjQ0ZS0wMSksCi0gIFFUQ0ZMTEQoLTkuMzg4OTYzZS0wNiksIFFUQ0ZMTEQoNS4xNDQ5NjllLTA1KSwgUVRDRkxMRCgtMS4xMzE4NjBlLTAzKSwgUVRDRkxMRCgtMS4zMzE1NDVlLTAxKSwgUVRDRkxMRCgzLjc0MDY0NGUtMDEpLAotICBRVENGTExEKC0xLjQwMjkyNWUtMDUpLCBRVENGTExEKC0xLjAzOTI2NGUtMDQpLCBRVENGTExEKC0xLjI4MzI4MWUtMDMpLCBRVENGTExEKC0xLjQ2NDM4OWUtMDEpLCBRVENGTExEKDMuNTcxNTI4ZS0wMSksCi0gIFFUQ0ZMTEQoLTIuNzU3NjExZS0wNiksIFFUQ0ZMTEQoMi44NTM0MzdlLTA2KSwgUVRDRkxMRCgtMS40ODA1NDNlLTAzKSwgUVRDRkxMRCgtMS42MDAwNjJlLTAxKSwgUVRDRkxMRCgzLjQwMzA3NGUtMDEpLAotICBRVENGTExEKDIuOTQ1MjM5ZS0wOCksIFFUQ0ZMTEQoMS4zMzQwOTFlLTA1KSwgUVRDRkxMRCgtMS42OTkxNjFlLTAzKSwgUVRDRkxMRCgtMS43Mzg1NDJlLTAxKSwgUVRDRkxMRCgzLjIzNTI5OWUtMDEpLAotICBRVENGTExEKC03Ljg3MzMwNGUtMDgpLCBRVENGTExEKDIuNDQzMTYxZS0wNSksIFFUQ0ZMTEQoLTEuOTI0ODQ1ZS0wMyksIFFUQ0ZMTEQoLTEuODc5NzEyZS0wMSksIFFUQ0ZMTEQoMy4wNjgxODdlLTAxKSwKLSAgUVRDRkxMRCgtOS44OTcxOTRlLTA3KSwgUVRDRkxMRCgzLjU2ODU1NWUtMDUpLCBRVENGTExEKC0yLjE1MjM4MGUtMDMpLCBRVENGTExEKC0yLjAyMzU0OGUtMDEpLCBRVENGTExEKDIuOTAxNDkxZS0wMSksCi0gIFFUQ0ZMTEQoLTEuOTIyMDc0ZS0wNiksIFFUQ0ZMTEQoNi4xOTMzNzBlLTA1KSwgUVRDRkxMRCgtMi4zOTY0MDRlLTAzKSwgUVRDRkxMRCgtMi4xNjk5MjZlLTAxKSwgUVRDRkxMRCgyLjczNDk3N2UtMDEpLAotICBRVENGTExEKC0yLjc2NTY1MGUtMDcpLCBRVENGTExEKDEuMTc2MjM3ZS0wNCksIFFUQ0ZMTEQoLTIuNjUzODE5ZS0wMyksIFFUQ0ZMTEQoLTIuMzE4ODE1ZS0wMSksIFFUQ0ZMTEQoMi41NjgxNzZlLTAxKSwKLSAgUVRDRkxMRCgtNC42MzYxMDVlLTA3KSwgUVRDRkxMRCgxLjYzNTkwNmUtMDQpLCBRVENGTExEKC0yLjkyNzE1OWUtMDMpLCBRVENGTExEKC0yLjQ3MDA5OGUtMDEpLCBRVENGTExEKDIuNDAwNzY4ZS0wMSksCi0gIFFUQ0ZMTEQoLTkuNjA3MDY5ZS0wNyksIFFUQ0ZMTEQoMi4wNjAzOTRlLTA0KSwgUVRDRkxMRCgtMy4yMDkwOTNlLTAzKSwgUVRDRkxMRCgtMi42MjM3NDllLTAxKSwgUVRDRkxMRCgyLjIzMjI3N2UtMDEpLAotICBRVENGTExEKC0xLjkwNzkyN2UtMDYpLCBRVENGTExEKDIuMzQ2OTgxZS0wNCksIFFUQ0ZMTEQoLTMuNTA1NTMxZS0wMyksIFFUQ0ZMTEQoLTIuNzc5NjM4ZS0wMSksIFFUQ0ZMTEQoMi4wNjI2MDVlLTAxKSwKLSAgUVRDRkxMRCgtMS41NTEyNTFlLTA4KSwgUVRDRkxMRCgyLjUyMDYwN2UtMDQpLCBRVENGTExEKC0zLjgxMTYxMmUtMDMpLCBRVENGTExEKC0yLjkzNzcyNWUtMDEpLCBRVENGTExEKDEuODkxNTkwZS0wMSksCi0gIFFUQ0ZMTEQoLTEuNjUzNDY0ZS0wNiksIFFUQ0ZMTEQoMi41NTY0NTBlLTA0KSwgUVRDRkxMRCgtNC4xMzM2NDBlLTAzKSwgUVRDRkxMRCgtMy4wOTc4NjJlLTAxKSwgUVRDRkxMRCgxLjcxOTcyNmUtMDEpLAotICBRVENGTExEKC0yLjA0MzQ2NGUtMDYpLCBRVENGTExEKDMuMTU3NjY0ZS0wNCksIFFUQ0ZMTEQoLTQuNDQ4OTkzZS0wMyksIFFUQ0ZMTEQoLTMuMjU5OTk0ZS0wMSksIFFUQ0ZMTEQoMS41NDc0NjFlLTAxKSwKLSAgUVRDRkxMRCgxLjYyMjc4NmUtMDUpLCBRVENGTExEKDYuMjA1Njc2ZS0wNCksIFFUQ0ZMTEQoLTQuNzU0MTkyZS0wMyksIFFUQ0ZMTEQoLTMuNDIzOTQyZS0wMSksIFFUQ0ZMTEQoMS4zNzYxNTBlLTAxKSwKLSAgUVRDRkxMRCgxLjM5NTIyMWUtMDUpLCBRVENGTExEKDcuODQ3ODQwZS0wNCksIFFUQ0ZMTEQoLTUuMDYzODUxZS0wMyksIFFUQ0ZMTEQoLTMuNTg5NjI3ZS0wMSksIFFUQ0ZMTEQoMS4yMDY5MjRlLTAxKSwKLSAgUVRDRkxMRCg0LjU5MTAxMGUtMDcpLCBRVENGTExEKDkuMDE5MTI5ZS0wNCksIFFUQ0ZMTEQoLTUuMzk0NTcwZS0wMyksIFFUQ0ZMTEQoLTMuNzU2ODIyZS0wMSksIFFUQ0ZMTEQoMS4wNDIwMzNlLTAxKSwKLSAgUVRDRkxMRCgtNi4yNjE5NDRlLTA2KSwgUVRDRkxMRCgxLjA1NDk2M2UtMDMpLCBRVENGTExEKC01Ljc0MTEwM2UtMDMpLCBRVENGTExEKC0zLjkyNTQwOWUtMDEpLCBRVENGTExEKDguODI5NzQ1ZS0wMiksCi0gIFFUQ0ZMTEQoLTEuNjA2MDUxZS0wNSksIFFUQ0ZMTEQoMS4wODk0MjllLTAzKSwgUVRDRkxMRCgtNi4xMDkxNzllLTAzKSwgUVRDRkxMRCgtNC4wOTUxNjBlLTAxKSwgUVRDRkxMRCg3LjMyNTk3OWUtMDIpLAotICBRVENGTExEKC0yLjQ2NDIyOGUtMDUpLCBRVENGTExEKDEuMTIyNTAzZS0wMyksIFFUQ0ZMTEQoLTYuNTAwNTAzZS0wMyksIFFUQ0ZMTEQoLTQuMjY1OTUwZS0wMSksIFFUQ0ZMTEQoNS45MTg2NzhlLTAyKSwKLSAgUVRDRkxMRCgtMi45NzY4MjRlLTA1KSwgUVRDRkxMRCgxLjE3NzUxNWUtMDMpLCBRVENGTExEKC02LjkyNTE0MWUtMDMpLCBRVENGTExEKC00LjQzNzUzMGUtMDEpLCBRVENGTExEKDQuNjM0Njk2ZS0wMiksCi0gIFFUQ0ZMTEQoLTMuMTc3NDY4ZS0wNSksIFFUQ0ZMTEQoMS4yMjYxMTNlLTAzKSwgUVRDRkxMRCgtNy4zODA1NDRlLTAzKSwgUVRDRkxMRCgtNC42MDk4MjllLTAxKSwgUVRDRkxMRCgzLjQ1MDcxOWUtMDIpLAotICBRVENGTExEKC00LjM3MzMwMmUtMDUpLCBRVENGTExEKDEuMjYzNTY5ZS0wMyksIFFUQ0ZMTEQoLTcuODc2MzkzZS0wMyksIFFUQ0ZMTEQoLTQuNzgyNjUwZS0wMSksIFFUQ0ZMTEQoMi4zNTMwNjBlLTAyKSwKLSAgUVRDRkxMRCgtMy4yOTkwMDRlLTA1KSwgUVRDRkxMRCgxLjI4NzgxOWUtMDMpLCBRVENGTExEKC04LjQwNzc0OWUtMDMpLCBRVENGTExEKC00Ljk1NjE3NWUtMDEpLCBRVENGTExEKDEuMTI5NTgwZS0wMiksCitjb25zdCBGSVhQX1BGVCBxbWZfY2xkZmJfNjQwW1FNRjY0MF9DTERGQl9QRlRfVEFCTEVfU0laRV0gPSB7CisgICAgUVRDRkxMRCg2LjU3MTc2MGUtMDcpLCAgUVRDRkxMRCgtOC4wMTAwNzllLTA2KSwgUVRDRkxMRCgtMS4yNTA3NDNlLTAzKSwKKyAgICBRVENGTExEKDguOTk2MzcxZS0wMyksICBRVENGTExEKDUuMTI4NTU3ZS0wMSksICBRVENGTExEKDQuMTE4MzYwZS0wNyksCisgICAgUVRDRkxMRCgtMS40Njk5MzNlLTA1KSwgUVRDRkxMRCgtMS4xOTQ3NDNlLTAzKSwgUVRDRkxMRCg5LjY0MDI5OWUtMDMpLAorICAgIFFUQ0ZMTEQoNS4yOTk1MTBlLTAxKSwgIFFUQ0ZMTEQoOC4xMDk5NTJlLTA3KSwgIFFUQ0ZMTEQoNC44NDA1NzhlLTA2KSwKKyAgICBRVENGTExEKC0xLjE1MTc5NmUtMDMpLCBRVENGTExEKDEuMDMzMTI2ZS0wMiksICBRVENGTExEKDUuNDcwNjUyZS0wMSksCisgICAgUVRDRkxMRCg3LjA5OTYzM2UtMDcpLCAgUVRDRkxMRCg3LjE2NzEwMWUtMDYpLCAgUVRDRkxMRCgtMS4wOTkwMDFlLTAzKSwKKyAgICBRVENGTExEKDEuMTA2OTU5ZS0wMiksICBRVENGTExEKDUuNjQxNTIzZS0wMSksICBRVENGTExEKDYuODM0MjEwZS0wNyksCisgICAgUVRDRkxMRCgxLjA4ODMyNWUtMDUpLCAgUVRDRkxMRCgtMS4wNDc2NTVlLTAzKSwgUVRDRkxMRCgxLjE4NjIxMWUtMDIpLAorICAgIFFUQ0ZMTEQoNS44MTE5OTNlLTAxKSwgIFFUQ0ZMTEQoNC4yOTI4NjJlLTA3KSwgIFFUQ0ZMTEQoMS4wMTMyNjBlLTA1KSwKKyAgICBRVENGTExEKC05Ljg2MjAyN2UtMDQpLCBRVENGTExEKDEuMjcwNzQ3ZS0wMiksICBRVENGTExEKDUuOTgxODc3ZS0wMSksCisgICAgUVRDRkxMRCgtNS40MjY1OTdlLTA5KSwgUVRDRkxMRCg1Ljg2OTcwN2UtMDYpLCAgUVRDRkxMRCgtOS4yOTQ2NjVlLTA0KSwKKyAgICBRVENGTExEKDEuMzYxMDcyZS0wMiksICBRVENGTExEKDYuMTUxMDMxZS0wMSksICBRVENGTExEKDYuMzU1MzAzZS0wOCksCisgICAgUVRDRkxMRCgxLjEyNTEzNWUtMDUpLCAgUVRDRkxMRCgtOS43Njc3MDllLTA0KSwgUVRDRkxMRCgxLjQ1NjIwOWUtMDIpLAorICAgIFFUQ0ZMTEQoNi4zMTkyODRlLTAxKSwgIFFUQ0ZMTEQoNS40OTA1NzBlLTA3KSwgIFFUQ0ZMTEQoMi4wMTU0NDVlLTA1KSwKKyAgICBRVENGTExEKC0xLjA0MDU5OGUtMDMpLCBRVENGTExEKDEuNTU3NzU5ZS0wMiksICBRVENGTExEKDYuNDg2NDM4ZS0wMSksCisgICAgUVRDRkxMRCgxLjYyMDE3MWUtMDYpLCAgUVRDRkxMRCgyLjgwMDQ1NmUtMDUpLCAgUVRDRkxMRCgtMS4xNDYyNjhlLTAzKSwKKyAgICBRVENGTExEKDEuNjY1MTg4ZS0wMiksICBRVENGTExEKDYuNjUyMzA0ZS0wMSksICBRVENGTExEKC02LjAyNTExMGUtMTApLAorICAgIFFUQ0ZMTEQoOC45NzU5NzhlLTA2KSwgIFFUQ0ZMTEQoLTEuMjkyODY2ZS0wMyksIFFUQ0ZMTEQoMS43NzgyNDllLTAyKSwKKyAgICBRVENGTExEKDYuODE2NjY4ZS0wMSksICBRVENGTExEKC02LjMyNTY2NGUtMTApLCBRVENGTExEKDguNTYzODIwZS0wNiksCisgICAgUVRDRkxMRCgtMS4xOTY2MzhlLTAzKSwgUVRDRkxMRCgxLjg5NzUwNmUtMDIpLCAgUVRDRkxMRCg2Ljk3OTMzN2UtMDEpLAorICAgIFFUQ0ZMTEQoLTQuMDEzNTI1ZS0wOSksIFFUQ0ZMTEQoMS4xNjg4OTVlLTA1KSwgIFFUQ0ZMTEQoLTkuNzI2Njk5ZS0wNCksCisgICAgUVRDRkxMRCgyLjAyMzUyNWUtMDIpLCAgUVRDRkxMRCg3LjE0MDA4N2UtMDEpLCAgUVRDRkxMRCgtNC4yNDQwOTFlLTA5KSwKKyAgICBRVENGTExEKDcuMzAwNTg5ZS0wNiksICBRVENGTExEKC04LjAyOTYyMGUtMDQpLCBRVENGTExEKDIuMTU2MzA1ZS0wMiksCisgICAgUVRDRkxMRCg3LjI5ODc0NmUtMDEpLCAgUVRDRkxMRCgtMS44NDY1NDhlLTA4KSwgUVRDRkxMRCgzLjk2NTM2NGUtMDYpLAorICAgIFFUQ0ZMTEQoLTYuNzU0OTM2ZS0wNCksIFFUQ0ZMTEQoMi4yOTY0NzFlLTAyKSwgIFFUQ0ZMTEQoNy40NTUxMTJlLTAxKSwKKyAgICBRVENGTExEKC0zLjg3MDUzN2UtMDkpLCBRVENGTExEKDEuMzc0ODk2ZS0wNiksICBRVENGTExEKC01Ljc5MTE0NWUtMDQpLAorICAgIFFUQ0ZMTEQoMi40NDM0MzRlLTAyKSwgIFFUQ0ZMTEQoNy42MDkwNTFlLTAxKSwgIFFUQ0ZMTEQoLTguODgzNDk5ZS0xMCksCisgICAgUVRDRkxMRCgzLjc5ODUyMGUtMDcpLCAgUVRDRkxMRCgtNC43MzMxNDhlLTA0KSwgUVRDRkxMRCgyLjU5Nzk1N2UtMDIpLAorICAgIFFUQ0ZMTEQoNy43NjAzODZlLTAxKSwgIFFUQ0ZMTEQoNS4zMDM1MjhlLTA4KSwgIFFUQ0ZMTEQoNC40Njk3MjllLTA2KSwKKyAgICBRVENGTExEKC0yLjk5ODc0MGUtMDQpLCBRVENGTExEKDIuNzYwMDkxZS0wMiksICBRVENGTExEKDcuOTA4OTk1ZS0wMSksCisgICAgUVRDRkxMRCg3LjM5MTk3NGUtMDgpLCAgUVRDRkxMRCgyLjQ2MTg3N2UtMDUpLCAgUVRDRkxMRCg3Ljg4MjYyMGUtMDUpLAorICAgIFFUQ0ZMTEQoMi45MzE1MjZlLTAyKSwgIFFUQ0ZMTEQoOC4wNTQ3MDFlLTAxKSwgIFFUQ0ZMTEQoMS43MjMyMTdlLTA5KSwKKyAgICBRVENGTExEKDQuMDA1MjY5ZS0wNSksICBRVENGTExEKDQuNzA4MDEwZS0wNCksICBRVENGTExEKDMuMTEwODYxZS0wMiksCisgICAgUVRDRkxMRCg4LjE5NzM4N2UtMDEpLCAgUVRDRkxMRCgyLjQ0MzA4NWUtMDcpLCAgUVRDRkxMRCg1LjI3Mjk4MmUtMDUpLAorICAgIFFUQ0ZMTEQoOC4wODk4MTJlLTA0KSwgIFFUQ0ZMTEQoMy4yOTgxNTFlLTAyKSwgIFFUQ0ZMTEQoOC4zMzY4NjRlLTAxKSwKKyAgICBRVENGTExEKDEuMzg3NTY3ZS0wOCksICBRVENGTExEKDQuOTM5MzkyZS0wNSksICBRVENGTExEKDEuMTI3MTQyZS0wMyksCisgICAgUVRDRkxMRCgzLjQ5MzMwMGUtMDIpLCAgUVRDRkxMRCg4LjQ3Mjk4N2UtMDEpLCAgUVRDRkxMRCgtNS42OTA1MzFlLTA2KSwKKyAgICBRVENGTExEKC00LjI1NjQ0MmUtMDUpLCBRVENGTExEKDEuNDE3MzY3ZS0wMyksICBRVENGTExEKDMuNjk2MzQzZS0wMiksCisgICAgUVRDRkxMRCg4LjYwNTU0M2UtMDEpLCAgUVRDRkxMRCgzLjYyOTA2N2UtMDYpLCAgUVRDRkxMRCg2LjU4MjMyOGUtMDUpLAorICAgIFFUQ0ZMTEQoMS43MjUwMzBlLTAzKSwgIFFUQ0ZMTEQoMy45MDcxMzhlLTAyKSwgIFFUQ0ZMTEQoOC43MzQzNjdlLTAxKSwKKyAgICBRVENGTExEKC01LjM5MzU1NmUtMDgpLCBRVENGTExEKDYuNDgxOTIxZS0wNSksICBRVENGTExEKDEuOTQ4MDY5ZS0wMyksCisgICAgUVRDRkxMRCg0LjEyNTU3MGUtMDIpLCAgUVRDRkxMRCg4Ljg1OTIzMmUtMDEpLCAgUVRDRkxMRCgxLjM0OTk0NGUtMDcpLAorICAgIFFUQ0ZMTEQoMy4zNjc5OThlLTA1KSwgIFFUQ0ZMTEQoMi4wMzM0NjVlLTAzKSwgIFFUQ0ZMTEQoNC4zNTU1NjhlLTAyKSwKKyAgICBRVENGTExEKDguOTc5OTU5ZS0wMSksICBRVENGTExEKDcuMzI2NjExZS0wOSksICBRVENGTExEKDQuNjk0MjUyZS0wNSksCisgICAgUVRDRkxMRCgyLjIzOTE0M2UtMDMpLCAgUVRDRkxMRCg0LjU5OTA2OGUtMDIpLCAgUVRDRkxMRCg5LjA5NjMxMWUtMDEpLAorICAgIFFUQ0ZMTEQoMi4zOTk2OTZlLTA3KSwgIFFUQ0ZMTEQoNi45MDQ0MTVlLTA1KSwgIFFUQ0ZMTEQoMi40NzA0NTZlLTAzKSwKKyAgICBRVENGTExEKDQuODQ5Mjg1ZS0wMiksICBRVENGTExEKDkuMjA4MTk1ZS0wMSksICBRVENGTExEKDMuMzMwOTgyZS0wNyksCisgICAgUVRDRkxMRCg1LjY0MzEwM2UtMDUpLCAgUVRDRkxMRCgyLjYzMDQ3MmUtMDMpLCAgUVRDRkxMRCg1LjEwNTYyMWUtMDIpLAorICAgIFFUQ0ZMTEQoOS4zMTU0NDJlLTAxKSwgIFFUQ0ZMTEQoNC43Njc3OTRlLTA3KSwgIFFUQ0ZMTEQoNy4wOTU4ODdlLTA1KSwKKyAgICBRVENGTExEKDIuNzAzMDE5ZS0wMyksICBRVENGTExEKDUuMzY4MzEzZS0wMiksICBRVENGTExEKDkuNDE3OTc2ZS0wMSksCisgICAgUVRDRkxMRCgzLjQyODY2MWUtMDcpLCAgUVRDRkxMRCg3Ljg3MjU5M2UtMDUpLCAgUVRDRkxMRCgyLjcyOTEzN2UtMDMpLAorICAgIFFUQ0ZMTEQoNS42MzcyMTllLTAyKSwgIFFUQ0ZMTEQoOS41MTU2NzVlLTAxKSwgIFFUQ0ZMTEQoOC42NzY4NDhlLTA2KSwKKyAgICBRVENGTExEKDIuNjY2NDQ1ZS0wNCksICBRVENGTExEKDIuNzE5NzQ5ZS0wMyksICBRVENGTExEKDUuOTExMzYzZS0wMiksCisgICAgUVRDRkxMRCg5LjYwODUyMGUtMDEpLCAgUVRDRkxMRCgyLjcyMjI5NmUtMDUpLCAgUVRDRkxMRCg1LjgyMjIwMWUtMDQpLAorICAgIFFUQ0ZMTEQoMi41MzA5MDdlLTAzKSwgIFFUQ0ZMTEQoNi4xOTI2OTNlLTAyKSwgIFFUQ0ZMTEQoOS42OTY0MjZlLTAxKSwKKyAgICBRVENGTExEKDMuNTc1NjUxZS0wNyksICBRVENGTExEKDcuODcwMzU1ZS0wNSksICBRVENGTExEKDIuMjI1NTI0ZS0wMyksCisgICAgUVRDRkxMRCg2LjQ4MDQ0OWUtMDIpLCAgUVRDRkxMRCg5Ljc3OTQwNWUtMDEpLCAgUVRDRkxMRCg2LjI5MzAwMmUtMDcpLAorICAgIFFUQ0ZMTEQoNy4yNDUwOTZlLTA1KSwgIFFUQ0ZMTEQoMS44OTE5NzJlLTAzKSwgIFFUQ0ZMTEQoNi43NzE2NzVlLTAyKSwKKyAgICBRVENGTExEKDkuODU3Mzg4ZS0wMSksICBRVENGTExEKDEuMDcwMjQzZS0wNiksICBRVENGTExEKDcuMTk0MTUxZS0wNSksCisgICAgUVRDRkxMRCgxLjU1NzExMmUtMDMpLCAgUVRDRkxMRCg3LjA2NDk0OGUtMDIpLCAgUVRDRkxMRCg5LjkzMDM4MGUtMDEpLAorICAgIFFUQ0ZMTEQoLTMuMjI1OTEzZS0wNyksIFFUQ0ZMTEQoLTcuNjc5OTU1ZS0wNSksIFFUQ0ZMTEQoMS4xOTQ3MzFlLTAzKSwKKyAgICBRVENGTExEKDcuMzYwNTU5ZS0wMiksICBRVENGTExEKDkuOTk4Mjg2ZS0wMSksICBRVENGTExEKC05LjU5NzUxNmUtMDkpLAorICAgIFFUQ0ZMTEQoLTYuMDkzMzczZS0wNSksIFFUQ0ZMTEQoNi40MTU0MDJlLTA0KSwgIFFUQ0ZMTEQoNy42NTc2NTBlLTAyKSwKKyAgICBRVENGTExEKDEuMDA2MTA5ZSswMCksICBRVENGTExEKC04LjkwODA0MWUtMDgpLCBRVENGTExEKC0xLjcyMTM0N2UtMDUpLAorICAgIFFUQ0ZMTEQoMS4wOTI1MjZlLTA0KSwgIFFUQ0ZMTEQoNy45NTU1NzFlLTAyKSwgIFFUQ0ZMTEQoMS4wMTE4NjhlKzAwKSwKKyAgICBRVENGTExEKC0yLjI4NTU2M2UtMDUpLCBRVENGTExEKC04Ljg4MjMwNWUtMDUpLCBRVENGTExEKDIuOTM0ODc2ZS0wNCksCisgICAgUVRDRkxMRCg4LjI1MTk2MmUtMDIpLCAgUVRDRkxMRCgxLjAxNzEwMGUrMDApLCAgUVRDRkxMRCgxLjAxMzU3NWUtMDUpLAorICAgIFFUQ0ZMTEQoNi40MTg2NThlLTA1KSwgIFFUQ0ZMTEQoNS43MjEyMjNlLTA0KSwgIFFUQ0ZMTEQoOC41NDc3MTZlLTAyKSwKKyAgICBRVENGTExEKDEuMDIxNzk5ZSswMCksICBRVENGTExEKC0xLjcwNjk0MWUtMDUpLCBRVENGTExEKDEuNzY5MjYyZS0wNCksCisgICAgUVRDRkxMRCg2Ljk3NjU2MWUtMDQpLCAgUVRDRkxMRCg4Ljg0MTgxM2UtMDIpLCAgUVRDRkxMRCgxLjAyNTk2N2UrMDApLAorICAgIFFUQ0ZMTEQoMS4zNTY3MjhlLTA2KSwgIFFUQ0ZMTEQoMi4yMDYzNDFlLTA1KSwgIFFUQ0ZMTEQoNy4zNzYxMDFlLTA0KSwKKyAgICBRVENGTExEKDkuMTMzNTkxZS0wMiksICBRVENGTExEKDEuMDI5NjAxZSswMCksICBRVENGTExEKC0xLjM5ODkxM2UtMDgpLAorICAgIFFUQ0ZMTEQoLTYuNTM4ODc5ZS0wNiksIFFUQ0ZMTEQoNy4xNTQxMjRlLTA0KSwgIFFUQ0ZMTEQoOS40MjE2MjRlLTAyKSwKKyAgICBRVENGTExEKDEuMDMyNzEzZSswMCksICBRVENGTExEKDMuNTUyOTkyZS0wOCksICBRVENGTExEKC0xLjA1MjcwN2UtMDUpLAorICAgIFFUQ0ZMTEQoNy4xMzk5MjBlLTA0KSwgIFFUQ0ZMTEQoOS43MDUyNDBlLTAyKSwgIFFUQ0ZMTEQoMS4wMzUzMTJlKzAwKSwKKyAgICBRVENGTExEKDQuMjExMTc3ZS0wNyksICBRVENGTExEKC05LjA3NTQzMWUtMDYpLCBRVENGTExEKDYuOTQ0MTIzZS0wNCksCisgICAgUVRDRkxMRCg5Ljk4Mjk1OGUtMDIpLCAgUVRDRkxMRCgxLjAzNzQyMmUrMDApLCAgUVRDRkxMRCg1LjQzMzcxOWUtMDcpLAorICAgIFFUQ0ZMTEQoLTEuNzQ4Mjg1ZS0wNSksIFFUQ0ZMTEQoNi43NjYzMjBlLTA0KSwgIFFUQ0ZMTEQoMS4wMjUzOThlLTAxKSwKKyAgICBRVENGTExEKDEuMDM5MDYyZSswMCksICBRVENGTExEKDguMjI2NjAwZS0wOCksICBRVENGTExEKC0zLjQ5ODI4NmUtMDUpLAorICAgIFFUQ0ZMTEQoNi44ODc3ODRlLTA0KSwgIFFUQ0ZMTEQoMS4wNTE2NDJlLTAxKSwgIFFUQ0ZMTEQoMS4wNDAyNjJlKzAwKSwKKyAgICBRVENGTExEKDEuMjcyNzA1ZS0wNyksICBRVENGTExEKC00LjQ4OTQ5MWUtMDUpLCBRVENGTExEKDYuNjczMjUwZS0wNCksCisgICAgUVRDRkxMRCgxLjA3Njk3MmUtMDEpLCAgUVRDRkxMRCgxLjA0MTA0M2UrMDApLCAgUVRDRkxMRCgyLjU0MjU5OGUtMDcpLAorICAgIFFUQ0ZMTEQoLTUuNDQ5ODE2ZS0wNSksIFFUQ0ZMTEQoNS45NzA2OTdlLTA0KSwgIFFUQ0ZMTEQoMS4xMDEyMTZlLTAxKSwKKyAgICBRVENGTExEKDEuMDQxNDM0ZSswMCksICBRVENGTExEKDYuMzIyNzcwZS0wNyksICBRVENGTExEKC01Ljg3NDE5OWUtMDUpLAorICAgIFFUQ0ZMTEQoNC43NDk5MzFlLTA0KSwgIFFUQ0ZMTEQoMS4xMjQyOTZlLTAxKSwgIFFUQ0ZMTEQoMS4wNDE0NDNlKzAwKSwKKyAgICBRVENGTExEKDIuODAxODgyZS0wOCksICBRVENGTExEKC03LjkzNDUxMGUtMDUpLCBRVENGTExEKDMuMTg5MzM2ZS0wNCksCisgICAgUVRDRkxMRCgxLjE0NjA0MmUtMDEpLCAgUVRDRkxMRCgxLjA0MTA4N2UrMDApLCAgUVRDRkxMRCg1Ljg5MTkwNGUtMDcpLAorICAgIFFUQ0ZMTEQoLTguMDM5MjMyZS0wNSksIFFUQ0ZMTEQoMS4yMTgyMjZlLTA0KSwgIFFUQ0ZMTEQoMS4xNjYzOTllLTAxKSwKKyAgICBRVENGTExEKDEuMDQwMzUwZSswMCksICBRVENGTExEKDcuMzAxOTU3ZS0wNyksICBRVENGTExEKC05LjkwNzYzMWUtMDUpLAorICAgIFFUQ0ZMTEQoLTEuMzI0MjkyZS0wNCksIFFUQ0ZMTEQoMS4xODUyNDNlLTAxKSwgIFFUQ0ZMTEQoMS4wMzkyMjhlKzAwKSwKKyAgICBRVENGTExEKC00LjUxODYwM2UtMDYpLCBRVENGTExEKC0yLjIxNzAyNWUtMDQpLCBRVENGTExEKC00LjI2ODU3NWUtMDQpLAorICAgIFFUQ0ZMTEQoMS4yMDI1NDZlLTAxKSwgIFFUQ0ZMTEQoMS4wMzc2ODNlKzAwKSwgIFFUQ0ZMTEQoLTMuNTYxNTg1ZS0wNiksCisgICAgUVRDRkxMRCgtMi40MTUxNjZlLTA0KSwgUVRDRkxMRCgtNy44MDQ1NDZlLTA0KSwgUVRDRkxMRCgxLjIxODE4NGUtMDEpLAorICAgIFFUQ0ZMTEQoMS4wMzU2OTRlKzAwKSwgIFFUQ0ZMTEQoLTEuMDc0NzE3ZS0wNyksIFFUQ0ZMTEQoLTIuMTIzNjcyZS0wNCksCisgICAgUVRDRkxMRCgtMS4xNTY2ODBlLTAzKSwgUVRDRkxMRCgxLjIzMjEzMmUtMDEpLCAgUVRDRkxMRCgxLjAzMzIwNmUrMDApLAorICAgIFFUQ0ZMTEQoMS4zMjMyNjhlLTA2KSwgIFFUQ0ZMTEQoLTIuMDc4Mjk5ZS0wNCksIFFUQ0ZMTEQoLTEuNTI1ODE5ZS0wMyksCisgICAgUVRDRkxMRCgxLjI0NDI3MGUtMDEpLCAgUVRDRkxMRCgxLjAzMDE5OWUrMDApLCAgUVRDRkxMRCgzLjM3NzgxNWUtMDYpLAorICAgIFFUQ0ZMTEQoLTEuODg1Mjg2ZS0wNCksIFFUQ0ZMTEQoLTEuOTE0MTE1ZS0wMyksIFFUQ0ZMTEQoMS4yNTQ2MDVlLTAxKSwKKyAgICBRVENGTExEKDEuMDI2NjE2ZSswMCksICBRVENGTExEKDUuMTYxNjA3ZS0wNiksICBRVENGTExEKC0xLjcyODY3M2UtMDQpLAorICAgIFFUQ0ZMTEQoLTIuMjkyODE0ZS0wMyksIFFUQ0ZMTEQoMS4yNjI5OTZlLTAxKSwgIFFUQ0ZMTEQoMS4wMjI0NzBlKzAwKSwKKyAgICBRVENGTExEKDUuOTI0MDAxZS0wNiksICBRVENGTExEKC0xLjc0NDg0MmUtMDQpLCBRVENGTExEKC0yLjY1ODA0MmUtMDMpLAorICAgIFFUQ0ZMTEQoMS4yNjk0MTZlLTAxKSwgIFFUQ0ZMTEQoMS4wMTc3MjllKzAwKSwgIFFUQ0ZMTEQoNi4zMTAyMDhlLTA2KSwKKyAgICBRVENGTExEKC0xLjc4NDE5M2UtMDQpLCBRVENGTExEKC0zLjAwMDQyM2UtMDMpLCBRVENGTExEKDEuMjczNjQ4ZS0wMSksCisgICAgUVRDRkxMRCgxLjAxMjUwOGUrMDApLCAgUVRDRkxMRCgzLjM1NzIxOWUtMDYpLCAgUVRDRkxMRCgtMi4xMzE0MDZlLTA0KSwKKyAgICBRVENGTExEKC0zLjMxODg1OGUtMDMpLCBRVENGTExEKDEuMjc1NTYxZS0wMSksICBRVENGTExEKDEuMDA2ODkzZSswMCksCisgICAgUVRDRkxMRCg1LjE4OTA4N2UtMDYpLCAgUVRDRkxMRCgtMi4wNzg4ODZlLTA0KSwgUVRDRkxMRCgtMy41OTc0NzZlLTAzKSwKKyAgICBRVENGTExEKDEuMjc0NTY4ZS0wMSksICBRVENGTExEKDEuMDAxNDYzZSswMCksICBRVENGTExEKDQuMTc4MDUwZS0wNiksCisgICAgUVRDRkxMRCgtNC42NjM3NzhlLTA1KSwgUVRDRkxMRCgtMy44NzA4NTJlLTAzKSwgUVRDRkxMRCgxLjI3MzU5MWUtMDEpLAorICAgIFFUQ0ZMTEQoOS45Mjc1NDRlLTAxKSwgIFFUQ0ZMTEQoNS4zNjQ4MDdlLTA2KSwgIFFUQ0ZMTEQoLTUuODg5Mjc3ZS0wNiksCisgICAgUVRDRkxMRCgtNC4xMzUxMzBlLTAzKSwgUVRDRkxMRCgxLjI3MjQ5OWUtMDEpLCAgUVRDRkxMRCg5LjgwNzY5MmUtMDEpLAorICAgIFFUQ0ZMTEQoNC4wODM3MTllLTA2KSwgIFFUQ0ZMTEQoLTEuNzc0MTA4ZS0wNSksIFFUQ0ZMTEQoLTQuMzUxNjY4ZS0wMyksCisgICAgUVRDRkxMRCgxLjI2ODI4MWUtMDEpLCAgUVRDRkxMRCg5LjY5MDAxN2UtMDEpLCAgUVRDRkxMRCgzLjU2NzU4MWUtMDYpLAorICAgIFFUQ0ZMTEQoLTIuNTk5NDY4ZS0wOCksIFFUQ0ZMTEQoLTQuNTE3MTkwZS0wMyksIFFUQ0ZMTEQoMS4yNjEyNjJlLTAxKSwKKyAgICBRVENGTExEKDkuNTY4ODg2ZS0wMSksICBRVENGTExEKDMuMjYyNzU0ZS0wNiksICBRVENGTExEKDEuMjYwNjQwZS0wNSksCisgICAgUVRDRkxMRCgtNC42MzYyMjhlLTAzKSwgUVRDRkxMRCgxLjI1MTQ3N2UtMDEpLCAgUVRDRkxMRCg5LjQ0MzgwM2UtMDEpLAorICAgIFFUQ0ZMTEQoMi4wNDExMjhlLTA2KSwgIFFUQ0ZMTEQoMi4zNjQ1MTllLTA1KSwgIFFUQ0ZMTEQoLTQuNzA0MzIxZS0wMyksCisgICAgUVRDRkxMRCgxLjIzODg2OWUtMDEpLCAgUVRDRkxMRCg5LjMxMzg3NGUtMDEpLCAgUVRDRkxMRCgtMi41Njc5NjVlLTA4KSwKKyAgICBRVENGTExEKDIuODA2OTYzZS0wNSksICBRVENGTExEKC00LjcyMjU2OGUtMDMpLCBRVENGTExEKDEuMjIzMzcxZS0wMSksCisgICAgUVRDRkxMRCg5LjE3OTY2NmUtMDEpLCAgUVRDRkxMRCgyLjcxNDg3OWUtMDcpLCAgUVRDRkxMRCg0LjQ5MzkxNmUtMDUpLAorICAgIFFUQ0ZMTEQoLTQuNjYzMjc2ZS0wMyksIFFUQ0ZMTEQoMS4yMDQ4NTRlLTAxKSwgIFFUQ0ZMTEQoOS4wNDEyODZlLTAxKSwKKyAgICBRVENGTExEKDIuMTUwODg0ZS0wNiksICBRVENGTExEKDUuNDA4MTU1ZS0wNSksICBRVENGTExEKC00LjU1NDgxMWUtMDMpLAorICAgIFFUQ0ZMTEQoMS4xODMyMzNlLTAxKSwgIFFUQ0ZMTEQoOC44OTk0NzRlLTAxKSwgIFFUQ0ZMTEQoNS44MTg1OTVlLTA2KSwKKyAgICBRVENGTExEKDMuNzU5NjMwZS0wNSksICBRVENGTExEKC00LjM2OTU1NGUtMDMpLCBRVENGTExEKDEuMTU4MzU5ZS0wMSksCisgICAgUVRDRkxMRCg4Ljc1NDY0MWUtMDEpLCAgUVRDRkxMRCgtMS42ODYxMzdlLTA5KSwgUVRDRkxMRCgyLjUxNTExOGUtMDUpLAorICAgIFFUQ0ZMTEQoLTQuMDkxMDMzZS0wMyksIFFUQ0ZMTEQoMS4xMzAxODBlLTAxKSwgIFFUQ0ZMTEQoOC42MDc0OTJlLTAxKSwKKyAgICBRVENGTExEKC0xLjc3NTE5MWUtMDkpLCBRVENGTExEKDIuNDA2NTE3ZS0wNSksICBRVENGTExEKC0zLjc5NDQyNWUtMDMpLAorICAgIFFUQ0ZMTEQoMS4wOTg1NTFlLTAxKSwgIFFUQ0ZMTEQoOC40NTg0NTBlLTAxKSwgIFFUQ0ZMTEQoLTIuMjIyMDcyZS0wOSksCisgICAgUVRDRkxMRCgzLjYyODUxMWUtMDUpLCAgUVRDRkxMRCgtMy40NjAzNjNlLTAzKSwgUVRDRkxMRCgxLjA2MzQ1NWUtMDEpLAorICAgIFFUQ0ZMTEQoOC4zMDgwNDBlLTAxKSwgIFFUQ0ZMTEQoLTEuMjgwNjc1ZS0wOCksIFFUQ0ZMTEQoMi4yNDE1NDZlLTA1KSwKKyAgICBRVENGTExEKC0zLjA2NDMxMWUtMDMpLCBRVENGTExEKDEuMDI0ODA1ZS0wMSksICBRVENGTExEKDguMTU2NTIzZS0wMSksCisgICAgUVRDRkxMRCgtNi45NzcwNzhlLTA4KSwgUVRDRkxMRCgxLjQ5OTE3MGUtMDUpLCAgUVRDRkxMRCgtMi42MjE1MzdlLTAzKSwKKyAgICBRVENGTExEKDkuODI2MjUxZS0wMiksICBRVENGTExEKDguMDA0MTY1ZS0wMSksICBRVENGTExEKC0xLjQwOTkyN2UtMDgpLAorICAgIFFUQ0ZMTEQoNS4wMDk5MTNlLTA2KSwgIFFUQ0ZMTEQoLTIuMTI0NjQ4ZS0wMyksIFFUQ0ZMTEQoOS4zNjg2NTJlLTAyKSwKKyAgICBRVENGTExEKDcuODUxMDEyZS0wMSksICBRVENGTExEKC0yLjk4NjQ4OWUtMDkpLCBRVENGTExEKDEuMjc3MTg0ZS0wNiksCisgICAgUVRDRkxMRCgtMS41OTQ4NjFlLTAzKSwgUVRDRkxMRCg4Ljg3NTc1NmUtMDIpLCAgUVRDRkxMRCg3LjY5NzA5M2UtMDEpLAorICAgIFFUQ0ZMTEQoMS44NzYwMjJlLTA3KSwgIFFUQ0ZMTEQoMS41ODAxODllLTA1KSwgIFFUQ0ZMTEQoLTEuMDYxNDk5ZS0wMyksCisgICAgUVRDRkxMRCg4LjM0NzE1MWUtMDIpLCAgUVRDRkxMRCg3LjU0MjI5NGUtMDEpLCAgUVRDRkxMRCgxLjczNzI3N2UtMDcpLAorICAgIFFUQ0ZMTEQoNS41MzM5NTNlLTA1KSwgIFFUQ0ZMTEQoLTYuMTY5ODU1ZS0wNCksIFFUQ0ZMTEQoNy43ODMzMDBlLTAyKSwKKyAgICBRVENGTExEKDcuMzg2NTE1ZS0wMSksICBRVENGTExEKDMuODE4NTg5ZS0wOSksICBRVENGTExEKDguODcwMTgyZS0wNSksCisgICAgUVRDRkxMRCgtMi4wMDQ4MjNlLTA0KSwgUVRDRkxMRCg3LjE4NDA3NGUtMDIpLCAgUVRDRkxMRCg3LjIyOTU5OWUtMDEpLAorICAgIFFUQ0ZMTEQoNS4xNDM2MTVlLTA3KSwgIFFUQ0ZMTEQoMS4wMzU3ODNlLTA0KSwgIFFUQ0ZMTEQoMi4wNDg0OTllLTA0KSwKKyAgICBRVENGTExEKDYuNTUwMjA5ZS0wMiksICBRVENGTExEKDcuMDcxNDQ4ZS0wMSksICBRVENGTExEKDIuODIwMjkyZS0wOCksCisgICAgUVRDRkxMRCg5Ljk5MDc1OGUtMDUpLCAgUVRDRkxMRCg1LjYyMTcyMWUtMDQpLCAgUVRDRkxMRCg1Ljg4MTI5N2UtMDIpLAorICAgIFFUQ0ZMTEQoNi45MTE5ODJlLTAxKSwgIFFUQ0ZMTEQoNC42NzcwMTZlLTA2KSwgIFFUQ0ZMTEQoMS4xODEwNzhlLTA0KSwKKyAgICBRVENGTExEKDkuMzczOTc1ZS0wNCksICBRVENGTExEKDUuMTc3OTY1ZS0wMiksICBRVENGTExEKDYuNzUxMTk5ZS0wMSksCisgICAgUVRDRkxMRCgzLjM2MTY4MmUtMDYpLCAgUVRDRkxMRCgyLjEyNjM2NWUtMDUpLCAgUVRDRkxMRCgxLjM0NDY1N2UtMDMpLAorICAgIFFUQ0ZMTEQoNC40Mzk2ODRlLTAyKSwgIFFUQ0ZMTEQoNi41ODkxNDllLTAxKSwgIFFUQ0ZMTEQoLTQuODgwODQ1ZS0wOCksCisgICAgUVRDRkxMRCg1Ljg2MTgwMGUtMDUpLCAgUVRDRkxMRCgxLjgxMjE3NmUtMDMpLCAgUVRDRkxMRCgzLjY2Njk0M2UtMDIpLAorICAgIFFUQ0ZMTEQoNi40MjU5NDBlLTAxKSwgIFFUQ0ZMTEQoMi4yNjc3MzFlLTA3KSwgIFFUQ0ZMTEQoNS4wMjE5MDZlLTA1KSwKKyAgICBRVENGTExEKDIuMTcyODY2ZS0wMyksICBRVENGTExEKDIuODU3NTI4ZS0wMiksICBRVENGTExEKDYuMjYxNzI1ZS0wMSksCisgICAgUVRDRkxMRCg1LjE1ODIxM2UtMDkpLCAgUVRDRkxMRCg0LjE1MDA3NWUtMDUpLCAgUVRDRkxMRCgxLjk4NTgyNWUtMDMpLAorICAgIFFUQ0ZMTEQoMi4wMTIyMzdlLTAyKSwgIFFUQ0ZMTEQoNi4wOTY2OTBlLTAxKSwgIFFUQ0ZMTEQoLTIuMDY2OTYyZS0wNyksCisgICAgUVRDRkxMRCgzLjc5OTk3MmUtMDUpLCAgUVRDRkxMRCgxLjY5NzY1M2UtMDMpLCAgUVRDRkxMRCgxLjEzMjMyNGUtMDIpLAorICAgIFFUQ0ZMTEQoNS45MzA5ODJlLTAxKSwgIFFUQ0ZMTEQoNC44ODMzMDVlLTA3KSwgIFFUQ0ZMTEQoNi42MDY0NjJlLTA1KSwKKyAgICBRVENGTExEKDEuNDcxMTY3ZS0wMyksICBRVENGTExEKDIuMTg0MjU3ZS0wMyksICBRVENGTExEKDUuNzY0NzM1ZS0wMSksCisgICAgUVRDRkxMRCg4LjI1NDQzMGUtMDcpLCAgUVRDRkxMRCg5Ljc1NTY4NWUtMDUpLCAgUVRDRkxMRCgxLjIzMjEzNGUtMDMpLAorICAgIFFUQ0ZMTEQoLTcuMjk4MTk4ZS0wMyksIFFUQ0ZMTEQoNS41OTgwNTJlLTAxKSwgIFFUQ0ZMTEQoOS40NjQ3ODNlLTA3KSwKKyAgICBRVENGTExEKDEuODMxMTIxZS0wNCksICBRVENGTExEKDguOTkwMjU2ZS0wNCksICBRVENGTExEKC0xLjcxMTMyNGUtMDIpLAorICAgIFFUQ0ZMTEQoNS40MzA5OTBlLTAxKSwgIFFUQ0ZMTEQoLTEuMjMyNjkzZS0wNSksIFFUQ0ZMTEQoLTUuOTAxNjE4ZS0wNyksCisgICAgUVRDRkxMRCg2LjE1MDMxN2UtMDQpLCAgUVRDRkxMRCgtMi43MjY0ODRlLTAyKSwgUVRDRkxMRCg1LjI2MzU1NGUtMDEpLAorICAgIFFUQ0ZMTEQoMy44Njc0ODNlLTA1KSwgIFFUQ0ZMTEQoLTMuNTk1MDU0ZS0wNCksIFFUQ0ZMTEQoNi4zMDc4NDFlLTA0KSwKKyAgICBRVENGTExEKC0zLjc3NTkyOGUtMDIpLCBRVENGTExEKDUuMDk1NzIxZS0wMSksICBRVENGTExEKC05Ljg3MDU0OGUtMDcpLAorICAgIFFUQ0ZMTEQoLTEuODE1ODM3ZS0wNCksIFFUQ0ZMTEQoNC4zNjY0NDdlLTA0KSwgIFFUQ0ZMTEQoLTQuODU5MDA2ZS0wMiksCisgICAgUVRDRkxMRCg0LjkyNzQ2NGUtMDEpLCAgUVRDRkxMRCgtMS4wODk1MDFlLTA2KSwgUVRDRkxMRCgtOS4yMDQ4NzZlLTA1KSwKKyAgICBRVENGTExEKDEuNDk4MjMyZS0wNCksICBRVENGTExEKC01Ljk3Mzc0MmUtMDIpLCBRVENGTExEKDQuNzU4NzU0ZS0wMSksCisgICAgUVRDRkxMRCgtMS41NjkwMDNlLTA2KSwgUVRDRkxMRCgtNS4xOTI0NDRlLTA1KSwgUVRDRkxMRCgtOS4wOTk3MjNlLTA1KSwKKyAgICBRVENGTExEKC03LjEyMDM1N2UtMDIpLCBRVENGTExEKDQuNTg5NTgzZS0wMSksICBRVENGTExEKC0yLjc3ODYxOGUtMDcpLAorICAgIFFUQ0ZMTEQoNi40ODc4ODBlLTA1KSwgIFFUQ0ZMTEQoLTMuMzM3OTY3ZS0wNCksIFFUQ0ZMTEQoLTguMjk4MTAzZS0wMiksCisgICAgUVRDRkxMRCg0LjQyMDAxNGUtMDEpLCAgUVRDRkxMRCg2Ljc1NzAxNWUtMDkpLCAgUVRDRkxMRCg1LjM5NzA2NWUtMDUpLAorICAgIFFUQ0ZMTEQoLTUuNTk5MzQ4ZS0wNCksIFFUQ0ZMTEQoLTkuNTA2OTY3ZS0wMiksIFFUQ0ZMTEQoNC4yNTAxNDRlLTAxKSwKKyAgICBRVENGTExEKDEuNDk2NDM2ZS0wNyksICBRVENGTExEKDIuNDcyMDI0ZS0wNSksICBRVENGTExEKC03LjY3NzYzNGUtMDQpLAorICAgIFFUQ0ZMTEQoLTEuMDc0NjMxZS0wMSksIFFUQ0ZMTEQoNC4wODAxNTVlLTAxKSwgIFFUQ0ZMTEQoMi4wNjgyOTdlLTA1KSwKKyAgICBRVENGTExEKDkuNzExNjgyZS0wNSksICBRVENGTExEKC05LjczMDQ2MGUtMDQpLCBRVENGTExEKC0xLjIwMTYyOWUtMDEpLAorICAgIFFUQ0ZMTEQoMy45MTAyNDRlLTAxKSwgIFFUQ0ZMTEQoLTkuMzg4OTYzZS0wNiksIFFUQ0ZMTEQoNS4xNDQ5NjllLTA1KSwKKyAgICBRVENGTExEKC0xLjEzMTg2MGUtMDMpLCBRVENGTExEKC0xLjMzMTU0NWUtMDEpLCBRVENGTExEKDMuNzQwNjQ0ZS0wMSksCisgICAgUVRDRkxMRCgtMS40MDI5MjVlLTA1KSwgUVRDRkxMRCgtMS4wMzkyNjRlLTA0KSwgUVRDRkxMRCgtMS4yODMyODFlLTAzKSwKKyAgICBRVENGTExEKC0xLjQ2NDM4OWUtMDEpLCBRVENGTExEKDMuNTcxNTI4ZS0wMSksICBRVENGTExEKC0yLjc1NzYxMWUtMDYpLAorICAgIFFUQ0ZMTEQoMi44NTM0MzdlLTA2KSwgIFFUQ0ZMTEQoLTEuNDgwNTQzZS0wMyksIFFUQ0ZMTEQoLTEuNjAwMDYyZS0wMSksCisgICAgUVRDRkxMRCgzLjQwMzA3NGUtMDEpLCAgUVRDRkxMRCgyLjk0NTIzOWUtMDgpLCAgUVRDRkxMRCgxLjMzNDA5MWUtMDUpLAorICAgIFFUQ0ZMTEQoLTEuNjk5MTYxZS0wMyksIFFUQ0ZMTEQoLTEuNzM4NTQyZS0wMSksIFFUQ0ZMTEQoMy4yMzUyOTllLTAxKSwKKyAgICBRVENGTExEKC03Ljg3MzMwNGUtMDgpLCBRVENGTExEKDIuNDQzMTYxZS0wNSksICBRVENGTExEKC0xLjkyNDg0NWUtMDMpLAorICAgIFFUQ0ZMTEQoLTEuODc5NzEyZS0wMSksIFFUQ0ZMTEQoMy4wNjgxODdlLTAxKSwgIFFUQ0ZMTEQoLTkuODk3MTk0ZS0wNyksCisgICAgUVRDRkxMRCgzLjU2ODU1NWUtMDUpLCAgUVRDRkxMRCgtMi4xNTIzODBlLTAzKSwgUVRDRkxMRCgtMi4wMjM1NDhlLTAxKSwKKyAgICBRVENGTExEKDIuOTAxNDkxZS0wMSksICBRVENGTExEKC0xLjkyMjA3NGUtMDYpLCBRVENGTExEKDYuMTkzMzcwZS0wNSksCisgICAgUVRDRkxMRCgtMi4zOTY0MDRlLTAzKSwgUVRDRkxMRCgtMi4xNjk5MjZlLTAxKSwgUVRDRkxMRCgyLjczNDk3N2UtMDEpLAorICAgIFFUQ0ZMTEQoLTIuNzY1NjUwZS0wNyksIFFUQ0ZMTEQoMS4xNzYyMzdlLTA0KSwgIFFUQ0ZMTEQoLTIuNjUzODE5ZS0wMyksCisgICAgUVRDRkxMRCgtMi4zMTg4MTVlLTAxKSwgUVRDRkxMRCgyLjU2ODE3NmUtMDEpLCAgUVRDRkxMRCgtNC42MzYxMDVlLTA3KSwKKyAgICBRVENGTExEKDEuNjM1OTA2ZS0wNCksICBRVENGTExEKC0yLjkyNzE1OWUtMDMpLCBRVENGTExEKC0yLjQ3MDA5OGUtMDEpLAorICAgIFFUQ0ZMTEQoMi40MDA3NjhlLTAxKSwgIFFUQ0ZMTEQoLTkuNjA3MDY5ZS0wNyksIFFUQ0ZMTEQoMi4wNjAzOTRlLTA0KSwKKyAgICBRVENGTExEKC0zLjIwOTA5M2UtMDMpLCBRVENGTExEKC0yLjYyMzc0OWUtMDEpLCBRVENGTExEKDIuMjMyMjc3ZS0wMSksCisgICAgUVRDRkxMRCgtMS45MDc5MjdlLTA2KSwgUVRDRkxMRCgyLjM0Njk4MWUtMDQpLCAgUVRDRkxMRCgtMy41MDU1MzFlLTAzKSwKKyAgICBRVENGTExEKC0yLjc3OTYzOGUtMDEpLCBRVENGTExEKDIuMDYyNjA1ZS0wMSksICBRVENGTExEKC0xLjU1MTI1MWUtMDgpLAorICAgIFFUQ0ZMTEQoMi41MjA2MDdlLTA0KSwgIFFUQ0ZMTEQoLTMuODExNjEyZS0wMyksIFFUQ0ZMTEQoLTIuOTM3NzI1ZS0wMSksCisgICAgUVRDRkxMRCgxLjg5MTU5MGUtMDEpLCAgUVRDRkxMRCgtMS42NTM0NjRlLTA2KSwgUVRDRkxMRCgyLjU1NjQ1MGUtMDQpLAorICAgIFFUQ0ZMTEQoLTQuMTMzNjQwZS0wMyksIFFUQ0ZMTEQoLTMuMDk3ODYyZS0wMSksIFFUQ0ZMTEQoMS43MTk3MjZlLTAxKSwKKyAgICBRVENGTExEKC0yLjA0MzQ2NGUtMDYpLCBRVENGTExEKDMuMTU3NjY0ZS0wNCksICBRVENGTExEKC00LjQ0ODk5M2UtMDMpLAorICAgIFFUQ0ZMTEQoLTMuMjU5OTk0ZS0wMSksIFFUQ0ZMTEQoMS41NDc0NjFlLTAxKSwgIFFUQ0ZMTEQoMS42MjI3ODZlLTA1KSwKKyAgICBRVENGTExEKDYuMjA1Njc2ZS0wNCksICBRVENGTExEKC00Ljc1NDE5MmUtMDMpLCBRVENGTExEKC0zLjQyMzk0MmUtMDEpLAorICAgIFFUQ0ZMTEQoMS4zNzYxNTBlLTAxKSwgIFFUQ0ZMTEQoMS4zOTUyMjFlLTA1KSwgIFFUQ0ZMTEQoNy44NDc4NDBlLTA0KSwKKyAgICBRVENGTExEKC01LjA2Mzg1MWUtMDMpLCBRVENGTExEKC0zLjU4OTYyN2UtMDEpLCBRVENGTExEKDEuMjA2OTI0ZS0wMSksCisgICAgUVRDRkxMRCg0LjU5MTAxMGUtMDcpLCAgUVRDRkxMRCg5LjAxOTEyOWUtMDQpLCAgUVRDRkxMRCgtNS4zOTQ1NzBlLTAzKSwKKyAgICBRVENGTExEKC0zLjc1NjgyMmUtMDEpLCBRVENGTExEKDEuMDQyMDMzZS0wMSksICBRVENGTExEKC02LjI2MTk0NGUtMDYpLAorICAgIFFUQ0ZMTEQoMS4wNTQ5NjNlLTAzKSwgIFFUQ0ZMTEQoLTUuNzQxMTAzZS0wMyksIFFUQ0ZMTEQoLTMuOTI1NDA5ZS0wMSksCisgICAgUVRDRkxMRCg4LjgyOTc0NWUtMDIpLCAgUVRDRkxMRCgtMS42MDYwNTFlLTA1KSwgUVRDRkxMRCgxLjA4OTQyOWUtMDMpLAorICAgIFFUQ0ZMTEQoLTYuMTA5MTc5ZS0wMyksIFFUQ0ZMTEQoLTQuMDk1MTYwZS0wMSksIFFUQ0ZMTEQoNy4zMjU5NzllLTAyKSwKKyAgICBRVENGTExEKC0yLjQ2NDIyOGUtMDUpLCBRVENGTExEKDEuMTIyNTAzZS0wMyksICBRVENGTExEKC02LjUwMDUwM2UtMDMpLAorICAgIFFUQ0ZMTEQoLTQuMjY1OTUwZS0wMSksIFFUQ0ZMTEQoNS45MTg2NzhlLTAyKSwgIFFUQ0ZMTEQoLTIuOTc2ODI0ZS0wNSksCisgICAgUVRDRkxMRCgxLjE3NzUxNWUtMDMpLCAgUVRDRkxMRCgtNi45MjUxNDFlLTAzKSwgUVRDRkxMRCgtNC40Mzc1MzBlLTAxKSwKKyAgICBRVENGTExEKDQuNjM0Njk2ZS0wMiksICBRVENGTExEKC0zLjE3NzQ2OGUtMDUpLCBRVENGTExEKDEuMjI2MTEzZS0wMyksCisgICAgUVRDRkxMRCgtNy4zODA1NDRlLTAzKSwgUVRDRkxMRCgtNC42MDk4MjllLTAxKSwgUVRDRkxMRCgzLjQ1MDcxOWUtMDIpLAorICAgIFFUQ0ZMTEQoLTQuMzczMzAyZS0wNSksIFFUQ0ZMTEQoMS4yNjM1NjllLTAzKSwgIFFUQ0ZMTEQoLTcuODc2MzkzZS0wMyksCisgICAgUVRDRkxMRCgtNC43ODI2NTBlLTAxKSwgUVRDRkxMRCgyLjM1MzA2MGUtMDIpLCAgUVRDRkxMRCgtMy4yOTkwMDRlLTA1KSwKKyAgICBRVENGTExEKDEuMjg3ODE5ZS0wMyksICBRVENGTExEKC04LjQwNzc0OWUtMDMpLCBRVENGTExEKC00Ljk1NjE3NWUtMDEpLAorICAgIFFUQ0ZMTEQoMS4xMjk1ODBlLTAyKSwKIH07CiAKIFJBTV9BTElHTgotY29uc3QgRklYUF9QRlQgcW1mX2NsZGZiXzMyMFtRTUYzMjBfQ0xERkJfUEZUX1RBQkxFX1NJWkVdID0KLXsKLVFUQ0ZMTEQoNS4zNDUwNjBlLTA3KSwgUVRDRkxMRCgtMS4xMzU0NzFlLTA1KSwgUVRDRkxMRCgtMS4yMjI3NDNlLTAzKSwgUVRDRkxMRCg5LjMxODMzNWUtMDMpLCBRVENGTExEKDUuMjE0MDMzZS0wMSksCi1RVENGTExEKDcuNjA0NzkyZS0wNyksIFFUQ0ZMTEQoNi4wMDM4MzllLTA2KSwgUVRDRkxMRCgtMS4xMjUzOThlLTAzKSwgUVRDRkxMRCgxLjA3MDA0M2UtMDIpLCBRVENGTExEKDUuNTU2MDg3ZS0wMSksCi1RVENGTExEKDUuNTYzNTM2ZS0wNyksIFFUQ0ZMTEQoMS4wNTA3OTJlLTA1KSwgUVRDRkxMRCgtMS4wMTY5MjllLTAzKSwgUVRDRkxMRCgxLjIyODQ3OWUtMDIpLCBRVENGTExEKDUuODk2OTM1ZS0wMSksCi1RVENGTExEKDIuOTA2MzIyZS0wOCksIFFUQ0ZMTEQoOC41NjA1MjdlLTA2KSwgUVRDRkxMRCgtOS41MzExODdlLTA0KSwgUVRDRkxMRCgxLjQwODY0MGUtMDIpLCBRVENGTExEKDYuMjM1MTU3ZS0wMSksCi1RVENGTExEKDEuMDg0NjE0ZS0wNiksIFFUQ0ZMTEQoMi40MDc5NTFlLTA1KSwgUVRDRkxMRCgtMS4wOTM0MzNlLTAzKSwgUVRDRkxMRCgxLjYxMTQ3NGUtMDIpLCBRVENGTExEKDYuNTY5MzcxZS0wMSksCi1RVENGTExEKC02LjE3NTM4N2UtMTApLCBRVENGTExEKDguNzY5ODk5ZS0wNiksIFFUQ0ZMTEQoLTEuMjQ0NzUyZS0wMyksIFFUQ0ZMTEQoMS44Mzc4NzdlLTAyKSwgUVRDRkxMRCg2Ljg5ODAwM2UtMDEpLAotUVRDRkxMRCgtNC4xMjg4MDhlLTA5KSwgUVRDRkxMRCg5LjQ5NDc2N2UtMDYpLCBRVENGTExEKC04Ljg3ODE2MGUtMDQpLCBRVENGTExEKDIuMDg5OTE1ZS0wMiksIFFUQ0ZMTEQoNy4yMTk0MTZlLTAxKSwKLVFUQ0ZMTEQoLTEuMTE2ODAxZS0wOCksIFFUQ0ZMTEQoMi42NzAxMzBlLTA2KSwgUVRDRkxMRCgtNi4yNzMwNDFlLTA0KSwgUVRDRkxMRCgyLjM2OTk1MmUtMDIpLCBRVENGTExEKDcuNTMyMDgyZS0wMSksCi1RVENGTExEKDIuNjA3MzQ3ZS0wOCksIFFUQ0ZMTEQoMi40MjQ3OTBlLTA2KSwgUVRDRkxMRCgtMy44NjU5NDRlLTA0KSwgUVRDRkxMRCgyLjY3OTAyNGUtMDIpLCBRVENGTExEKDcuODM0NjkxZS0wMSksCi1RVENGTExEKDMuNzgyMTQ4ZS0wOCksIFFUQ0ZMTEQoMy4yMzM1NzNlLTA1KSwgUVRDRkxMRCgyLjc0ODEzNmUtMDQpLCBRVENGTExEKDMuMDIxMTkzZS0wMiksIFFUQ0ZMTEQoOC4xMjYwNDRlLTAxKSwKLVFUQ0ZMTEQoMS4yOTA5MjFlLTA3KSwgUVRDRkxMRCg1LjEwNjE4N2UtMDUpLCBRVENGTExEKDkuNjgwNjE1ZS0wNCksIFFUQ0ZMTEQoMy4zOTU3MjZlLTAyKSwgUVRDRkxMRCg4LjQwNDkyNWUtMDEpLAotUVRDRkxMRCgtMS4wMzA3MzJlLTA2KSwgUVRDRkxMRCgxLjE2Mjk0M2UtMDUpLCBRVENGTExEKDEuNTcxMTk4ZS0wMyksIFFUQ0ZMTEQoMy44MDE3NDBlLTAyKSwgUVRDRkxMRCg4LjY2OTk1NWUtMDEpLAotUVRDRkxMRCg0LjA1Mjk0MGUtMDgpLCBRVENGTExEKDQuOTI0OTYwZS0wNSksIFFUQ0ZMTEQoMS45OTA3NjdlLTAzKSwgUVRDRkxMRCg0LjI0MDU2OWUtMDIpLCBRVENGTExEKDguOTE5NTk1ZS0wMSksCi1RVENGTExEKDEuMjM2NDgxZS0wNyksIFFUQ0ZMTEQoNS43OTkzMzNlLTA1KSwgUVRDRkxMRCgyLjM1NDgwMGUtMDMpLCBRVENGTExEKDQuNzI0MTc3ZS0wMiksIFFUQ0ZMTEQoOS4xNTIyNTNlLTAxKSwKLVFUQ0ZMTEQoNC4wNDkzODhlLTA3KSwgUVRDRkxMRCg2LjM2OTQ5NmUtMDUpLCBRVENGTExEKDIuNjY2NzQ2ZS0wMyksIFFUQ0ZMTEQoNS4yMzY5NjdlLTAyKSwgUVRDRkxMRCg5LjM2NjcwOWUtMDEpLAotUVRDRkxMRCg0LjUwOTg1N2UtMDYpLCBRVENGTExEKDEuNzI2ODUyZS0wNCksIFFUQ0ZMTEQoMi43MjQ0NDNlLTAzKSwgUVRDRkxMRCg1Ljc3NDI5MWUtMDIpLCBRVENGTExEKDkuNTYyMDk3ZS0wMSksCi1RVENGTExEKDEuMzc5MDI2ZS0wNSksIFFUQ0ZMTEQoMy4zMDQ2MTllLTA0KSwgUVRDRkxMRCgyLjM3ODIxNmUtMDMpLCBRVENGTExEKDYuMzM2NTcxZS0wMiksIFFUQ0ZMTEQoOS43Mzc5MTZlLTAxKSwKLVFUQ0ZMTEQoOC40OTc3MTVlLTA3KSwgUVRDRkxMRCg3LjIxOTYyNGUtMDUpLCBRVENGTExEKDEuNzI0NTQyZS0wMyksIFFUQ0ZMTEQoNi45MTgzMTFlLTAyKSwgUVRDRkxMRCg5Ljg5Mzg4M2UtMDEpLAotUVRDRkxMRCgtMS42NjA5NDRlLTA3KSwgUVRDRkxMRCgtNi44ODY2NjRlLTA1KSwgUVRDRkxMRCg5LjE4MTM1NGUtMDQpLCBRVENGTExEKDcuNTA5MTA1ZS0wMiksIFFUQ0ZMTEQoMS4wMDI5NjllKzAwKSwKLVFUQ0ZMTEQoLTEuMTQ3MjM1ZS0wNSksIFFUQ0ZMTEQoLTUuMzAxODI2ZS0wNSksIFFUQ0ZMTEQoMi4wMTM3MDFlLTA0KSwgUVRDRkxMRCg4LjEwMzc2NmUtMDIpLCBRVENGTExEKDEuMDE0NDg0ZSswMCksCi1RVENGTExEKC0zLjQ2NjgyOWUtMDYpLCBRVENGTExEKDEuMjA1NTY0ZS0wNCksIFFUQ0ZMTEQoNi4zNDg4OTJlLTA0KSwgUVRDRkxMRCg4LjY5NDc2NWUtMDIpLCBRVENGTExEKDEuMDIzODgzZSswMCksCi1RVENGTExEKDYuNzEzNjkyZS0wNyksIFFUQ0ZMTEQoNy43NjIyNjhlLTA2KSwgUVRDRkxMRCg3LjI2NTExMmUtMDQpLCBRVENGTExEKDkuMjc3NjA4ZS0wMiksIFFUQ0ZMTEQoMS4wMzExNTdlKzAwKSwKLVFUQ0ZMTEQoMi4yODMyMzhlLTA3KSwgUVRDRkxMRCgtOS44MDEyNTNlLTA2KSwgUVRDRkxMRCg3LjA0MjAyMmUtMDQpLCBRVENGTExEKDkuODQ0MDk5ZS0wMiksIFFUQ0ZMTEQoMS4wMzYzNjdlKzAwKSwKLVFUQ0ZMTEQoMy4xMjgxODllLTA3KSwgUVRDRkxMRCgtMi42MjMyODVlLTA1KSwgUVRDRkxMRCg2LjgyNzA1MmUtMDQpLCBRVENGTExEKDEuMDM4NTIwZS0wMSksIFFUQ0ZMTEQoMS4wMzk2NjJlKzAwKSwKLVFUQ0ZMTEQoMS45MDc2NTJlLTA3KSwgUVRDRkxMRCgtNC45Njk2NTRlLTA1KSwgUVRDRkxMRCg2LjMyMTk3NGUtMDQpLCBRVENGTExEKDEuMDg5MDk0ZS0wMSksIFFUQ0ZMTEQoMS4wNDEyMzllKzAwKSwKLVFUQ0ZMTEQoMy4zMDE0NzllLTA3KSwgUVRDRkxMRCgtNi45MDQzNTRlLTA1KSwgUVRDRkxMRCgzLjk2OTYzNGUtMDQpLCBRVENGTExEKDEuMTM1MTY5ZS0wMSksIFFUQ0ZMTEQoMS4wNDEyNjVlKzAwKSwKLVFUQ0ZMTEQoNi41OTY5MzFlLTA3KSwgUVRDRkxMRCgtOC45NzM0MzFlLTA1KSwgUVRDRkxMRCgtNS4zMDMyNjBlLTA2KSwgUVRDRkxMRCgxLjE3NTgyMWUtMDEpLCBRVENGTExEKDEuMDM5Nzg5ZSswMCksCi1RVENGTExEKC00LjA0MDA5NGUtMDYpLCBRVENGTExEKC0yLjMxNjA5NmUtMDQpLCBRVENGTExEKC02LjAzNjU2MWUtMDQpLCBRVENGTExEKDEuMjEwMzY1ZS0wMSksIFFUQ0ZMTEQoMS4wMzY2ODllKzAwKSwKLVFUQ0ZMTEQoNi4wNzg5ODBlLTA3KSwgUVRDRkxMRCgtMi4xMDA5ODVlLTA0KSwgUVRDRkxMRCgtMS4zNDEyNDllLTAzKSwgUVRDRkxMRCgxLjIzODIwMWUtMDEpLCBRVENGTExEKDEuMDMxNzAyZSswMCksCi1RVENGTExEKDQuMjY5NzExZS0wNiksIFFUQ0ZMTEQoLTEuODA2OTc5ZS0wNCksIFFUQ0ZMTEQoLTIuMTAzNDY0ZS0wMyksIFFUQ0ZMTEQoMS4yNTg4MDBlLTAxKSwgUVRDRkxMRCgxLjAyNDU0M2UrMDApLAotUVRDRkxMRCg2LjExNzEwNWUtMDYpLCBRVENGTExEKC0xLjc2NDUxN2UtMDQpLCBRVENGTExEKC0yLjgyOTIzMmUtMDMpLCBRVENGTExEKDEuMjcxNTMyZS0wMSksIFFUQ0ZMTEQoMS4wMTUxMTllKzAwKSwKLVFUQ0ZMTEQoNC4yNzMxNTNlLTA2KSwgUVRDRkxMRCgtMi4xMDUxNDZlLTA0KSwgUVRDRkxMRCgtMy40NTgxNjdlLTAzKSwgUVRDRkxMRCgxLjI3NTA2NGUtMDEpLCBRVENGTExEKDEuMDA0MTc4ZSswMCksCi1RVENGTExEKDQuNzcxNDI4ZS0wNiksIFFUQ0ZMTEQoLTIuNjI2MzUzZS0wNSksIFFUQ0ZMTEQoLTQuMDAyOTkxZS0wMyksIFFUQ0ZMTEQoMS4yNzMwNDVlLTAxKSwgUVRDRkxMRCg5Ljg2NzYxOGUtMDEpLAotUVRDRkxMRCgzLjgyNTY1MGUtMDYpLCBRVENGTExEKC04Ljg4MzU0MGUtMDYpLCBRVENGTExEKC00LjQzNDQyOWUtMDMpLCBRVENGTExEKDEuMjY0NzcxZS0wMSksIFFUQ0ZMTEQoOS42Mjk0NTFlLTAxKSwKLVFUQ0ZMTEQoMi42NTE5NDFlLTA2KSwgUVRDRkxMRCgxLjgxMjU3OWUtMDUpLCBRVENGTExEKC00LjY3MDI3NGUtMDMpLCBRVENGTExEKDEuMjQ1MTczZS0wMSksIFFUQ0ZMTEQoOS4zNzg4MzllLTAxKSwKLVFUQ0ZMTEQoMS4yMjkwNDFlLTA3KSwgUVRDRkxMRCgzLjY1MDQ0MGUtMDUpLCBRVENGTExEKC00LjY5MjkyMmUtMDMpLCBRVENGTExEKDEuMjE0MTEzZS0wMSksIFFUQ0ZMTEQoOS4xMTA0NzZlLTAxKSwKLVFUQ0ZMTEQoMy45ODQ3MzllLTA2KSwgUVRDRkxMRCg0LjU4Mzg5MmUtMDUpLCBRVENGTExEKC00LjQ2MjE4M2UtMDMpLCBRVENGTExEKDEuMTcwNzk2ZS0wMSksIFFUQ0ZMTEQoOC44MjcwNTdlLTAxKSwKLVFUQ0ZMTEQoLTEuNzMwNjY0ZS0wOSksIFFUQ0ZMTEQoMi40NjA4MThlLTA1KSwgUVRDRkxMRCgtMy45NDI3MjllLTAzKSwgUVRDRkxMRCgxLjExNDM2NmUtMDEpLCBRVENGTExEKDguNTMyOTcxZS0wMSksCi1RVENGTExEKC03LjUxNDQxM2UtMDkpLCBRVENGTExEKDIuOTM1MDI5ZS0wNSksIFFUQ0ZMTEQoLTMuMjYyMzM3ZS0wMyksIFFUQ0ZMTEQoMS4wNDQxMzBlLTAxKSwgUVRDRkxMRCg4LjIzMjI4MWUtMDEpLAotUVRDRkxMRCgtNC4xOTM1MDNlLTA4KSwgUVRDRkxMRCgxLjAwMDA4MWUtMDUpLCBRVENGTExEKC0yLjM3MzA5MmUtMDMpLCBRVENGTExEKDkuNTk3NDUyZS0wMiksIFFUQ0ZMTEQoNy45Mjc1ODllLTAxKSwKLVFUQ0ZMTEQoOS4yMzA3ODZlLTA4KSwgUVRDRkxMRCg4LjUzOTUzOGUtMDYpLCBRVENGTExEKC0xLjMyODE4MGUtMDMpLCBRVENGTExEKDguNjExNDUzZS0wMiksIFFUQ0ZMTEQoNy42MTk2OTRlLTAxKSwKLVFUQ0ZMTEQoOC44NzczMTJlLTA4KSwgUVRDRkxMRCg3LjIwMjA2N2UtMDUpLCBRVENGTExEKC00LjA4NzMzOWUtMDQpLCBRVENGTExEKDcuNDgzNjg3ZS0wMiksIFFUQ0ZMTEQoNy4zMDgwNThlLTAxKSwKLVFUQ0ZMTEQoMi43MTI4MjJlLTA3KSwgUVRDRkxMRCgxLjAxNzQyOWUtMDQpLCBRVENGTExEKDMuODM1MTEwZS0wNCksIFFUQ0ZMTEQoNi4yMTU3NTNlLTAyKSwgUVRDRkxMRCg2Ljk5MTcxNWUtMDEpLAotUVRDRkxMRCg0LjAxOTM0OWUtMDYpLCBRVENGTExEKDYuOTY4NTcwZS0wNSksIFFUQ0ZMTEQoMS4xNDEwMjdlLTAzKSwgUVRDRkxMRCg0LjgwODgyNWUtMDIpLCBRVENGTExEKDYuNjcwMTc0ZS0wMSksCi1RVENGTExEKDguODk4MjMzZS0wOCksIFFUQ0ZMTEQoNS40NDE4NTNlLTA1KSwgUVRDRkxMRCgxLjk5MjUyMWUtMDMpLCBRVENGTExEKDMuMjYyMjM2ZS0wMiksIFFUQ0ZMTEQoNi4zNDM4MzNlLTAxKSwKLVFUQ0ZMTEQoLTEuMDA3NjkwZS0wNyksIFFUQ0ZMTEQoMy45NzUwMjRlLTA1KSwgUVRDRkxMRCgxLjg0MTczOWUtMDMpLCBRVENGTExEKDEuNTcyMjgxZS0wMiksIFFUQ0ZMTEQoNi4wMTM4MzZlLTAxKSwKLVFUQ0ZMTEQoNi41Njg4NjhlLTA3KSwgUVRDRkxMRCg4LjE4MTA3NGUtMDUpLCBRVENGTExEKDEuMzUxNjUxZS0wMyksIFFUQ0ZMTEQoLTIuNTU2OTcwZS0wMyksIFFUQ0ZMTEQoNS42ODEzOTNlLTAxKSwKLVFUQ0ZMTEQoLTUuNjkwMjI4ZS0wNiksIFFUQ0ZMTEQoOS4xMjYwOThlLTA1KSwgUVRDRkxMRCg3LjU3MDI4NmUtMDQpLCBRVENGTExEKC0yLjIxODkwNGUtMDIpLCBRVENGTExEKDUuMzQ3MjcyZS0wMSksCi1RVENGTExEKDEuODg0Mzg5ZS0wNSksIFFUQ0ZMTEQoLTIuNzA1NDQ2ZS0wNCksIFFUQ0ZMTEQoNS4zMzcxNDRlLTA0KSwgUVRDRkxMRCgtNC4zMTc0NjdlLTAyKSwgUVRDRkxMRCg1LjAxMTU5M2UtMDEpLAotUVRDRkxMRCgtMS4zMjkyNTJlLTA2KSwgUVRDRkxMRCgtNy4xOTg2NjBlLTA1KSwgUVRDRkxMRCgyLjk0MTI5NmUtMDUpLCBRVENGTExEKC02LjU0NzA0OWUtMDIpLCBRVENGTExEKDQuNjc0MTY4ZS0wMSksCi1RVENGTExEKC0xLjM1NTUyNGUtMDcpLCBRVENGTExEKDUuOTQyNDcyZS0wNSksIFFUQ0ZMTEQoLTQuNDY4NjU3ZS0wNCksIFFUQ0ZMTEQoLTguOTAyNTM1ZS0wMiksIFFUQ0ZMTEQoNC4zMzUwNzllLTAxKSwKLVFUQ0ZMTEQoMS4wNDE2MzFlLTA1KSwgUVRDRkxMRCg2LjA5MTg1M2UtMDUpLCBRVENGTExEKC04LjcwNDA0N2UtMDQpLCBRVENGTExEKC0xLjEzODEzMGUtMDEpLCBRVENGTExEKDMuOTk1MjAwZS0wMSksCi1RVENGTExEKC0xLjE3MDkxMWUtMDUpLCBRVENGTExEKC0yLjYyMzgzM2UtMDUpLCBRVENGTExEKC0xLjIwNzU3MGUtMDMpLCBRVENGTExEKC0xLjM5Nzk2N2UtMDEpLCBRVENGTExEKDMuNjU2MDg2ZS0wMSksCi1RVENGTExEKC0xLjM2NDA3OWUtMDYpLCBRVENGTExEKDguMDk3MTczZS0wNiksIFFUQ0ZMTEQoLTEuNTg5ODUyZS0wMyksIFFUQ0ZMTEQoLTEuNjY5MzAyZS0wMSksIFFUQ0ZMTEQoMy4zMTkxODdlLTAxKSwKLVFUQ0ZMTEQoLTUuMzQyMjYyZS0wNyksIFFUQ0ZMTEQoMy4wMDU4NThlLTA1KSwgUVRDRkxMRCgtMi4wMzg2MTJlLTAzKSwgUVRDRkxMRCgtMS45NTE2MzBlLTAxKSwgUVRDRkxMRCgyLjk4NDgzOWUtMDEpLAotUVRDRkxMRCgtMS4wOTkzMjBlLTA2KSwgUVRDRkxMRCg4Ljk3Nzg3MWUtMDUpLCBRVENGTExEKC0yLjUyNTExMWUtMDMpLCBRVENGTExEKC0yLjI0NDM3MWUtMDEpLCBRVENGTExEKDIuNjUxNTc3ZS0wMSksCi1RVENGTExEKC03LjEyMTU4N2UtMDcpLCBRVENGTExEKDEuODQ4MTUwZS0wNCksIFFUQ0ZMTEQoLTMuMDY4MTI2ZS0wMyksIFFUQ0ZMTEQoLTIuNTQ2OTI0ZS0wMSksIFFUQ0ZMTEQoMi4zMTY1MjNlLTAxKSwKLVFUQ0ZMTEQoLTkuNjE3MTk5ZS0wNyksIFFUQ0ZMTEQoMi40MzM3OTRlLTA0KSwgUVRDRkxMRCgtMy42NTg1NzJlLTAzKSwgUVRDRkxMRCgtMi44NTg2ODFlLTAxKSwgUVRDRkxMRCgxLjk3NzA5OGUtMDEpLAotUVRDRkxMRCgtMS44NDg0NjRlLTA2KSwgUVRDRkxMRCgyLjg1NzA1N2UtMDQpLCBRVENGTExEKC00LjI5MTMxNmUtMDMpLCBRVENGTExEKC0zLjE3ODkyOGUtMDEpLCBRVENGTExEKDEuNjMzNTk0ZS0wMSksCi1RVENGTExEKDEuNTA5MDA0ZS0wNSksIFFUQ0ZMTEQoNy4wMjY3NThlLTA0KSwgUVRDRkxMRCgtNC45MDkwMjFlLTAzKSwgUVRDRkxMRCgtMy41MDY3ODRlLTAxKSwgUVRDRkxMRCgxLjI5MTUzN2UtMDEpLAotUVRDRkxMRCgtMi45MDE0MjJlLTA2KSwgUVRDRkxMRCg5Ljc4NDM4MWUtMDQpLCBRVENGTExEKC01LjU2NzgzN2UtMDMpLCBRVENGTExEKC0zLjg0MTExNmUtMDEpLCBRVENGTExEKDkuNjI1MDM4ZS0wMiksCi1RVENGTExEKC0yLjAzNTE0MGUtMDUpLCBRVENGTExEKDEuMTA1OTY2ZS0wMyksIFFUQ0ZMTEQoLTYuMzA0ODQxZS0wMyksIFFUQ0ZMTEQoLTQuMTgwNTU1ZS0wMSksIFFUQ0ZMTEQoNi42MjIzMjhlLTAyKSwKLVFUQ0ZMTEQoLTMuMDc3MTQ2ZS0wNSksIFFUQ0ZMTEQoMS4yMDE4MTRlLTAzKSwgUVRDRkxMRCgtNy4xNTI4NDJlLTAzKSwgUVRDRkxMRCgtNC41MjM2ODBlLTAxKSwgUVRDRkxMRCg0LjA0MjcwN2UtMDIpLAotUVRDRkxMRCgtMy44MzYxNTNlLTA1KSwgUVRDRkxMRCgxLjI3NTY5NGUtMDMpLCBRVENGTExEKC04LjE0MjA3MWUtMDMpLCBRVENGTExEKC00Ljg2OTQxM2UtMDEpLCBRVENGTExEKDEuNzQxMzIwZS0wMiksCitjb25zdCBGSVhQX1BGVCBxbWZfY2xkZmJfMzIwW1FNRjMyMF9DTERGQl9QRlRfVEFCTEVfU0laRV0gPSB7CisgICAgUVRDRkxMRCg1LjM0NTA2MGUtMDcpLCAgUVRDRkxMRCgtMS4xMzU0NzFlLTA1KSwgUVRDRkxMRCgtMS4yMjI3NDNlLTAzKSwKKyAgICBRVENGTExEKDkuMzE4MzM1ZS0wMyksICBRVENGTExEKDUuMjE0MDMzZS0wMSksICBRVENGTExEKDcuNjA0NzkyZS0wNyksCisgICAgUVRDRkxMRCg2LjAwMzgzOWUtMDYpLCAgUVRDRkxMRCgtMS4xMjUzOThlLTAzKSwgUVRDRkxMRCgxLjA3MDA0M2UtMDIpLAorICAgIFFUQ0ZMTEQoNS41NTYwODdlLTAxKSwgIFFUQ0ZMTEQoNS41NjM1MzZlLTA3KSwgIFFUQ0ZMTEQoMS4wNTA3OTJlLTA1KSwKKyAgICBRVENGTExEKC0xLjAxNjkyOWUtMDMpLCBRVENGTExEKDEuMjI4NDc5ZS0wMiksICBRVENGTExEKDUuODk2OTM1ZS0wMSksCisgICAgUVRDRkxMRCgyLjkwNjMyMmUtMDgpLCAgUVRDRkxMRCg4LjU2MDUyN2UtMDYpLCAgUVRDRkxMRCgtOS41MzExODdlLTA0KSwKKyAgICBRVENGTExEKDEuNDA4NjQwZS0wMiksICBRVENGTExEKDYuMjM1MTU3ZS0wMSksICBRVENGTExEKDEuMDg0NjE0ZS0wNiksCisgICAgUVRDRkxMRCgyLjQwNzk1MWUtMDUpLCAgUVRDRkxMRCgtMS4wOTM0MzNlLTAzKSwgUVRDRkxMRCgxLjYxMTQ3NGUtMDIpLAorICAgIFFUQ0ZMTEQoNi41NjkzNzFlLTAxKSwgIFFUQ0ZMTEQoLTYuMTc1Mzg3ZS0xMCksIFFUQ0ZMTEQoOC43Njk4OTllLTA2KSwKKyAgICBRVENGTExEKC0xLjI0NDc1MmUtMDMpLCBRVENGTExEKDEuODM3ODc3ZS0wMiksICBRVENGTExEKDYuODk4MDAzZS0wMSksCisgICAgUVRDRkxMRCgtNC4xMjg4MDhlLTA5KSwgUVRDRkxMRCg5LjQ5NDc2N2UtMDYpLCAgUVRDRkxMRCgtOC44NzgxNjBlLTA0KSwKKyAgICBRVENGTExEKDIuMDg5OTE1ZS0wMiksICBRVENGTExEKDcuMjE5NDE2ZS0wMSksICBRVENGTExEKC0xLjExNjgwMWUtMDgpLAorICAgIFFUQ0ZMTEQoMi42NzAxMzBlLTA2KSwgIFFUQ0ZMTEQoLTYuMjczMDQxZS0wNCksIFFUQ0ZMTEQoMi4zNjk5NTJlLTAyKSwKKyAgICBRVENGTExEKDcuNTMyMDgyZS0wMSksICBRVENGTExEKDIuNjA3MzQ3ZS0wOCksICBRVENGTExEKDIuNDI0NzkwZS0wNiksCisgICAgUVRDRkxMRCgtMy44NjU5NDRlLTA0KSwgUVRDRkxMRCgyLjY3OTAyNGUtMDIpLCAgUVRDRkxMRCg3LjgzNDY5MWUtMDEpLAorICAgIFFUQ0ZMTEQoMy43ODIxNDhlLTA4KSwgIFFUQ0ZMTEQoMy4yMzM1NzNlLTA1KSwgIFFUQ0ZMTEQoMi43NDgxMzZlLTA0KSwKKyAgICBRVENGTExEKDMuMDIxMTkzZS0wMiksICBRVENGTExEKDguMTI2MDQ0ZS0wMSksICBRVENGTExEKDEuMjkwOTIxZS0wNyksCisgICAgUVRDRkxMRCg1LjEwNjE4N2UtMDUpLCAgUVRDRkxMRCg5LjY4MDYxNWUtMDQpLCAgUVRDRkxMRCgzLjM5NTcyNmUtMDIpLAorICAgIFFUQ0ZMTEQoOC40MDQ5MjVlLTAxKSwgIFFUQ0ZMTEQoLTEuMDMwNzMyZS0wNiksIFFUQ0ZMTEQoMS4xNjI5NDNlLTA1KSwKKyAgICBRVENGTExEKDEuNTcxMTk4ZS0wMyksICBRVENGTExEKDMuODAxNzQwZS0wMiksICBRVENGTExEKDguNjY5OTU1ZS0wMSksCisgICAgUVRDRkxMRCg0LjA1Mjk0MGUtMDgpLCAgUVRDRkxMRCg0LjkyNDk2MGUtMDUpLCAgUVRDRkxMRCgxLjk5MDc2N2UtMDMpLAorICAgIFFUQ0ZMTEQoNC4yNDA1NjllLTAyKSwgIFFUQ0ZMTEQoOC45MTk1OTVlLTAxKSwgIFFUQ0ZMTEQoMS4yMzY0ODFlLTA3KSwKKyAgICBRVENGTExEKDUuNzk5MzMzZS0wNSksICBRVENGTExEKDIuMzU0ODAwZS0wMyksICBRVENGTExEKDQuNzI0MTc3ZS0wMiksCisgICAgUVRDRkxMRCg5LjE1MjI1M2UtMDEpLCAgUVRDRkxMRCg0LjA0OTM4OGUtMDcpLCAgUVRDRkxMRCg2LjM2OTQ5NmUtMDUpLAorICAgIFFUQ0ZMTEQoMi42NjY3NDZlLTAzKSwgIFFUQ0ZMTEQoNS4yMzY5NjdlLTAyKSwgIFFUQ0ZMTEQoOS4zNjY3MDllLTAxKSwKKyAgICBRVENGTExEKDQuNTA5ODU3ZS0wNiksICBRVENGTExEKDEuNzI2ODUyZS0wNCksICBRVENGTExEKDIuNzI0NDQzZS0wMyksCisgICAgUVRDRkxMRCg1Ljc3NDI5MWUtMDIpLCAgUVRDRkxMRCg5LjU2MjA5N2UtMDEpLCAgUVRDRkxMRCgxLjM3OTAyNmUtMDUpLAorICAgIFFUQ0ZMTEQoMy4zMDQ2MTllLTA0KSwgIFFUQ0ZMTEQoMi4zNzgyMTZlLTAzKSwgIFFUQ0ZMTEQoNi4zMzY1NzFlLTAyKSwKKyAgICBRVENGTExEKDkuNzM3OTE2ZS0wMSksICBRVENGTExEKDguNDk3NzE1ZS0wNyksICBRVENGTExEKDcuMjE5NjI0ZS0wNSksCisgICAgUVRDRkxMRCgxLjcyNDU0MmUtMDMpLCAgUVRDRkxMRCg2LjkxODMxMWUtMDIpLCAgUVRDRkxMRCg5Ljg5Mzg4M2UtMDEpLAorICAgIFFUQ0ZMTEQoLTEuNjYwOTQ0ZS0wNyksIFFUQ0ZMTEQoLTYuODg2NjY0ZS0wNSksIFFUQ0ZMTEQoOS4xODEzNTRlLTA0KSwKKyAgICBRVENGTExEKDcuNTA5MTA1ZS0wMiksICBRVENGTExEKDEuMDAyOTY5ZSswMCksICBRVENGTExEKC0xLjE0NzIzNWUtMDUpLAorICAgIFFUQ0ZMTEQoLTUuMzAxODI2ZS0wNSksIFFUQ0ZMTEQoMi4wMTM3MDFlLTA0KSwgIFFUQ0ZMTEQoOC4xMDM3NjZlLTAyKSwKKyAgICBRVENGTExEKDEuMDE0NDg0ZSswMCksICBRVENGTExEKC0zLjQ2NjgyOWUtMDYpLCBRVENGTExEKDEuMjA1NTY0ZS0wNCksCisgICAgUVRDRkxMRCg2LjM0ODg5MmUtMDQpLCAgUVRDRkxMRCg4LjY5NDc2NWUtMDIpLCAgUVRDRkxMRCgxLjAyMzg4M2UrMDApLAorICAgIFFUQ0ZMTEQoNi43MTM2OTJlLTA3KSwgIFFUQ0ZMTEQoNy43NjIyNjhlLTA2KSwgIFFUQ0ZMTEQoNy4yNjUxMTJlLTA0KSwKKyAgICBRVENGTExEKDkuMjc3NjA4ZS0wMiksICBRVENGTExEKDEuMDMxMTU3ZSswMCksICBRVENGTExEKDIuMjgzMjM4ZS0wNyksCisgICAgUVRDRkxMRCgtOS44MDEyNTNlLTA2KSwgUVRDRkxMRCg3LjA0MjAyMmUtMDQpLCAgUVRDRkxMRCg5Ljg0NDA5OWUtMDIpLAorICAgIFFUQ0ZMTEQoMS4wMzYzNjdlKzAwKSwgIFFUQ0ZMTEQoMy4xMjgxODllLTA3KSwgIFFUQ0ZMTEQoLTIuNjIzMjg1ZS0wNSksCisgICAgUVRDRkxMRCg2LjgyNzA1MmUtMDQpLCAgUVRDRkxMRCgxLjAzODUyMGUtMDEpLCAgUVRDRkxMRCgxLjAzOTY2MmUrMDApLAorICAgIFFUQ0ZMTEQoMS45MDc2NTJlLTA3KSwgIFFUQ0ZMTEQoLTQuOTY5NjU0ZS0wNSksIFFUQ0ZMTEQoNi4zMjE5NzRlLTA0KSwKKyAgICBRVENGTExEKDEuMDg5MDk0ZS0wMSksICBRVENGTExEKDEuMDQxMjM5ZSswMCksICBRVENGTExEKDMuMzAxNDc5ZS0wNyksCisgICAgUVRDRkxMRCgtNi45MDQzNTRlLTA1KSwgUVRDRkxMRCgzLjk2OTYzNGUtMDQpLCAgUVRDRkxMRCgxLjEzNTE2OWUtMDEpLAorICAgIFFUQ0ZMTEQoMS4wNDEyNjVlKzAwKSwgIFFUQ0ZMTEQoNi41OTY5MzFlLTA3KSwgIFFUQ0ZMTEQoLTguOTczNDMxZS0wNSksCisgICAgUVRDRkxMRCgtNS4zMDMyNjBlLTA2KSwgUVRDRkxMRCgxLjE3NTgyMWUtMDEpLCAgUVRDRkxMRCgxLjAzOTc4OWUrMDApLAorICAgIFFUQ0ZMTEQoLTQuMDQwMDk0ZS0wNiksIFFUQ0ZMTEQoLTIuMzE2MDk2ZS0wNCksIFFUQ0ZMTEQoLTYuMDM2NTYxZS0wNCksCisgICAgUVRDRkxMRCgxLjIxMDM2NWUtMDEpLCAgUVRDRkxMRCgxLjAzNjY4OWUrMDApLCAgUVRDRkxMRCg2LjA3ODk4MGUtMDcpLAorICAgIFFUQ0ZMTEQoLTIuMTAwOTg1ZS0wNCksIFFUQ0ZMTEQoLTEuMzQxMjQ5ZS0wMyksIFFUQ0ZMTEQoMS4yMzgyMDFlLTAxKSwKKyAgICBRVENGTExEKDEuMDMxNzAyZSswMCksICBRVENGTExEKDQuMjY5NzExZS0wNiksICBRVENGTExEKC0xLjgwNjk3OWUtMDQpLAorICAgIFFUQ0ZMTEQoLTIuMTAzNDY0ZS0wMyksIFFUQ0ZMTEQoMS4yNTg4MDBlLTAxKSwgIFFUQ0ZMTEQoMS4wMjQ1NDNlKzAwKSwKKyAgICBRVENGTExEKDYuMTE3MTA1ZS0wNiksICBRVENGTExEKC0xLjc2NDUxN2UtMDQpLCBRVENGTExEKC0yLjgyOTIzMmUtMDMpLAorICAgIFFUQ0ZMTEQoMS4yNzE1MzJlLTAxKSwgIFFUQ0ZMTEQoMS4wMTUxMTllKzAwKSwgIFFUQ0ZMTEQoNC4yNzMxNTNlLTA2KSwKKyAgICBRVENGTExEKC0yLjEwNTE0NmUtMDQpLCBRVENGTExEKC0zLjQ1ODE2N2UtMDMpLCBRVENGTExEKDEuMjc1MDY0ZS0wMSksCisgICAgUVRDRkxMRCgxLjAwNDE3OGUrMDApLCAgUVRDRkxMRCg0Ljc3MTQyOGUtMDYpLCAgUVRDRkxMRCgtMi42MjYzNTNlLTA1KSwKKyAgICBRVENGTExEKC00LjAwMjk5MWUtMDMpLCBRVENGTExEKDEuMjczMDQ1ZS0wMSksICBRVENGTExEKDkuODY3NjE4ZS0wMSksCisgICAgUVRDRkxMRCgzLjgyNTY1MGUtMDYpLCAgUVRDRkxMRCgtOC44ODM1NDBlLTA2KSwgUVRDRkxMRCgtNC40MzQ0MjllLTAzKSwKKyAgICBRVENGTExEKDEuMjY0NzcxZS0wMSksICBRVENGTExEKDkuNjI5NDUxZS0wMSksICBRVENGTExEKDIuNjUxOTQxZS0wNiksCisgICAgUVRDRkxMRCgxLjgxMjU3OWUtMDUpLCAgUVRDRkxMRCgtNC42NzAyNzRlLTAzKSwgUVRDRkxMRCgxLjI0NTE3M2UtMDEpLAorICAgIFFUQ0ZMTEQoOS4zNzg4MzllLTAxKSwgIFFUQ0ZMTEQoMS4yMjkwNDFlLTA3KSwgIFFUQ0ZMTEQoMy42NTA0NDBlLTA1KSwKKyAgICBRVENGTExEKC00LjY5MjkyMmUtMDMpLCBRVENGTExEKDEuMjE0MTEzZS0wMSksICBRVENGTExEKDkuMTEwNDc2ZS0wMSksCisgICAgUVRDRkxMRCgzLjk4NDczOWUtMDYpLCAgUVRDRkxMRCg0LjU4Mzg5MmUtMDUpLCAgUVRDRkxMRCgtNC40NjIxODNlLTAzKSwKKyAgICBRVENGTExEKDEuMTcwNzk2ZS0wMSksICBRVENGTExEKDguODI3MDU3ZS0wMSksICBRVENGTExEKC0xLjczMDY2NGUtMDkpLAorICAgIFFUQ0ZMTEQoMi40NjA4MThlLTA1KSwgIFFUQ0ZMTEQoLTMuOTQyNzI5ZS0wMyksIFFUQ0ZMTEQoMS4xMTQzNjZlLTAxKSwKKyAgICBRVENGTExEKDguNTMyOTcxZS0wMSksICBRVENGTExEKC03LjUxNDQxM2UtMDkpLCBRVENGTExEKDIuOTM1MDI5ZS0wNSksCisgICAgUVRDRkxMRCgtMy4yNjIzMzdlLTAzKSwgUVRDRkxMRCgxLjA0NDEzMGUtMDEpLCAgUVRDRkxMRCg4LjIzMjI4MWUtMDEpLAorICAgIFFUQ0ZMTEQoLTQuMTkzNTAzZS0wOCksIFFUQ0ZMTEQoMS4wMDAwODFlLTA1KSwgIFFUQ0ZMTEQoLTIuMzczMDkyZS0wMyksCisgICAgUVRDRkxMRCg5LjU5NzQ1MmUtMDIpLCAgUVRDRkxMRCg3LjkyNzU4OWUtMDEpLCAgUVRDRkxMRCg5LjIzMDc4NmUtMDgpLAorICAgIFFUQ0ZMTEQoOC41Mzk1MzhlLTA2KSwgIFFUQ0ZMTEQoLTEuMzI4MTgwZS0wMyksIFFUQ0ZMTEQoOC42MTE0NTNlLTAyKSwKKyAgICBRVENGTExEKDcuNjE5Njk0ZS0wMSksICBRVENGTExEKDguODc3MzEyZS0wOCksICBRVENGTExEKDcuMjAyMDY3ZS0wNSksCisgICAgUVRDRkxMRCgtNC4wODczMzllLTA0KSwgUVRDRkxMRCg3LjQ4MzY4N2UtMDIpLCAgUVRDRkxMRCg3LjMwODA1OGUtMDEpLAorICAgIFFUQ0ZMTEQoMi43MTI4MjJlLTA3KSwgIFFUQ0ZMTEQoMS4wMTc0MjllLTA0KSwgIFFUQ0ZMTEQoMy44MzUxMTBlLTA0KSwKKyAgICBRVENGTExEKDYuMjE1NzUzZS0wMiksICBRVENGTExEKDYuOTkxNzE1ZS0wMSksICBRVENGTExEKDQuMDE5MzQ5ZS0wNiksCisgICAgUVRDRkxMRCg2Ljk2ODU3MGUtMDUpLCAgUVRDRkxMRCgxLjE0MTAyN2UtMDMpLCAgUVRDRkxMRCg0LjgwODgyNWUtMDIpLAorICAgIFFUQ0ZMTEQoNi42NzAxNzRlLTAxKSwgIFFUQ0ZMTEQoOC44OTgyMzNlLTA4KSwgIFFUQ0ZMTEQoNS40NDE4NTNlLTA1KSwKKyAgICBRVENGTExEKDEuOTkyNTIxZS0wMyksICBRVENGTExEKDMuMjYyMjM2ZS0wMiksICBRVENGTExEKDYuMzQzODMzZS0wMSksCisgICAgUVRDRkxMRCgtMS4wMDc2OTBlLTA3KSwgUVRDRkxMRCgzLjk3NTAyNGUtMDUpLCAgUVRDRkxMRCgxLjg0MTczOWUtMDMpLAorICAgIFFUQ0ZMTEQoMS41NzIyODFlLTAyKSwgIFFUQ0ZMTEQoNi4wMTM4MzZlLTAxKSwgIFFUQ0ZMTEQoNi41Njg4NjhlLTA3KSwKKyAgICBRVENGTExEKDguMTgxMDc0ZS0wNSksICBRVENGTExEKDEuMzUxNjUxZS0wMyksICBRVENGTExEKC0yLjU1Njk3MGUtMDMpLAorICAgIFFUQ0ZMTEQoNS42ODEzOTNlLTAxKSwgIFFUQ0ZMTEQoLTUuNjkwMjI4ZS0wNiksIFFUQ0ZMTEQoOS4xMjYwOThlLTA1KSwKKyAgICBRVENGTExEKDcuNTcwMjg2ZS0wNCksICBRVENGTExEKC0yLjIxODkwNGUtMDIpLCBRVENGTExEKDUuMzQ3MjcyZS0wMSksCisgICAgUVRDRkxMRCgxLjg4NDM4OWUtMDUpLCAgUVRDRkxMRCgtMi43MDU0NDZlLTA0KSwgUVRDRkxMRCg1LjMzNzE0NGUtMDQpLAorICAgIFFUQ0ZMTEQoLTQuMzE3NDY3ZS0wMiksIFFUQ0ZMTEQoNS4wMTE1OTNlLTAxKSwgIFFUQ0ZMTEQoLTEuMzI5MjUyZS0wNiksCisgICAgUVRDRkxMRCgtNy4xOTg2NjBlLTA1KSwgUVRDRkxMRCgyLjk0MTI5NmUtMDUpLCAgUVRDRkxMRCgtNi41NDcwNDllLTAyKSwKKyAgICBRVENGTExEKDQuNjc0MTY4ZS0wMSksICBRVENGTExEKC0xLjM1NTUyNGUtMDcpLCBRVENGTExEKDUuOTQyNDcyZS0wNSksCisgICAgUVRDRkxMRCgtNC40Njg2NTdlLTA0KSwgUVRDRkxMRCgtOC45MDI1MzVlLTAyKSwgUVRDRkxMRCg0LjMzNTA3OWUtMDEpLAorICAgIFFUQ0ZMTEQoMS4wNDE2MzFlLTA1KSwgIFFUQ0ZMTEQoNi4wOTE4NTNlLTA1KSwgIFFUQ0ZMTEQoLTguNzA0MDQ3ZS0wNCksCisgICAgUVRDRkxMRCgtMS4xMzgxMzBlLTAxKSwgUVRDRkxMRCgzLjk5NTIwMGUtMDEpLCAgUVRDRkxMRCgtMS4xNzA5MTFlLTA1KSwKKyAgICBRVENGTExEKC0yLjYyMzgzM2UtMDUpLCBRVENGTExEKC0xLjIwNzU3MGUtMDMpLCBRVENGTExEKC0xLjM5Nzk2N2UtMDEpLAorICAgIFFUQ0ZMTEQoMy42NTYwODZlLTAxKSwgIFFUQ0ZMTEQoLTEuMzY0MDc5ZS0wNiksIFFUQ0ZMTEQoOC4wOTcxNzNlLTA2KSwKKyAgICBRVENGTExEKC0xLjU4OTg1MmUtMDMpLCBRVENGTExEKC0xLjY2OTMwMmUtMDEpLCBRVENGTExEKDMuMzE5MTg3ZS0wMSksCisgICAgUVRDRkxMRCgtNS4zNDIyNjJlLTA3KSwgUVRDRkxMRCgzLjAwNTg1OGUtMDUpLCAgUVRDRkxMRCgtMi4wMzg2MTJlLTAzKSwKKyAgICBRVENGTExEKC0xLjk1MTYzMGUtMDEpLCBRVENGTExEKDIuOTg0ODM5ZS0wMSksICBRVENGTExEKC0xLjA5OTMyMGUtMDYpLAorICAgIFFUQ0ZMTEQoOC45Nzc4NzFlLTA1KSwgIFFUQ0ZMTEQoLTIuNTI1MTExZS0wMyksIFFUQ0ZMTEQoLTIuMjQ0MzcxZS0wMSksCisgICAgUVRDRkxMRCgyLjY1MTU3N2UtMDEpLCAgUVRDRkxMRCgtNy4xMjE1ODdlLTA3KSwgUVRDRkxMRCgxLjg0ODE1MGUtMDQpLAorICAgIFFUQ0ZMTEQoLTMuMDY4MTI2ZS0wMyksIFFUQ0ZMTEQoLTIuNTQ2OTI0ZS0wMSksIFFUQ0ZMTEQoMi4zMTY1MjNlLTAxKSwKKyAgICBRVENGTExEKC05LjYxNzE5OWUtMDcpLCBRVENGTExEKDIuNDMzNzk0ZS0wNCksICBRVENGTExEKC0zLjY1ODU3MmUtMDMpLAorICAgIFFUQ0ZMTEQoLTIuODU4NjgxZS0wMSksIFFUQ0ZMTEQoMS45NzcwOThlLTAxKSwgIFFUQ0ZMTEQoLTEuODQ4NDY0ZS0wNiksCisgICAgUVRDRkxMRCgyLjg1NzA1N2UtMDQpLCAgUVRDRkxMRCgtNC4yOTEzMTZlLTAzKSwgUVRDRkxMRCgtMy4xNzg5MjhlLTAxKSwKKyAgICBRVENGTExEKDEuNjMzNTk0ZS0wMSksICBRVENGTExEKDEuNTA5MDA0ZS0wNSksICBRVENGTExEKDcuMDI2NzU4ZS0wNCksCisgICAgUVRDRkxMRCgtNC45MDkwMjFlLTAzKSwgUVRDRkxMRCgtMy41MDY3ODRlLTAxKSwgUVRDRkxMRCgxLjI5MTUzN2UtMDEpLAorICAgIFFUQ0ZMTEQoLTIuOTAxNDIyZS0wNiksIFFUQ0ZMTEQoOS43ODQzODFlLTA0KSwgIFFUQ0ZMTEQoLTUuNTY3ODM3ZS0wMyksCisgICAgUVRDRkxMRCgtMy44NDExMTZlLTAxKSwgUVRDRkxMRCg5LjYyNTAzOGUtMDIpLCAgUVRDRkxMRCgtMi4wMzUxNDBlLTA1KSwKKyAgICBRVENGTExEKDEuMTA1OTY2ZS0wMyksICBRVENGTExEKC02LjMwNDg0MWUtMDMpLCBRVENGTExEKC00LjE4MDU1NWUtMDEpLAorICAgIFFUQ0ZMTEQoNi42MjIzMjhlLTAyKSwgIFFUQ0ZMTEQoLTMuMDc3MTQ2ZS0wNSksIFFUQ0ZMTEQoMS4yMDE4MTRlLTAzKSwKKyAgICBRVENGTExEKC03LjE1Mjg0MmUtMDMpLCBRVENGTExEKC00LjUyMzY4MGUtMDEpLCBRVENGTExEKDQuMDQyNzA3ZS0wMiksCisgICAgUVRDRkxMRCgtMy44MzYxNTNlLTA1KSwgUVRDRkxMRCgxLjI3NTY5NGUtMDMpLCAgUVRDRkxMRCgtOC4xNDIwNzFlLTAzKSwKKyAgICBRVENGTExEKC00Ljg2OTQxM2UtMDEpLCBRVENGTExEKDEuNzQxMzIwZS0wMiksCiB9OwogCitSQU1fQUxJR04KK2NvbnN0IEZJWFBfUEZUIHFtZl9jbGRmYl8xNjBbUU1GMTYwX0NMREZCX1BGVF9UQUJMRV9TSVpFXSA9IHsKKyAgICBRVENGTExEKDYuMTE0MTU2ZS0wNyksICBRVENGTExEKC00LjkyOTM3OGUtMDYpLCBRVENGTExEKC0xLjE3MzI3MGUtMDMpLAorICAgIFFUQ0ZMTEQoOS45ODU3ODFlLTAzKSwgIFFUQ0ZMTEQoNS4zODUwODFlLTAxKSwgIFFUQ0ZMTEQoMi4xMTkyOThlLTA3KSwKKyAgICBRVENGTExEKDguMDAxMTUyZS0wNiksICBRVENGTExEKC05LjU3ODM0NmUtMDQpLCBRVENGTExEKDEuMzE1OTEwZS0wMiksCisgICAgUVRDRkxMRCg2LjA2NjQ1NGUtMDEpLCAgUVRDRkxMRCg4LjA5Nzg0NWUtMDcpLCAgUVRDRkxMRCgxLjg0OTAyN2UtMDUpLAorICAgIFFUQ0ZMTEQoLTEuMjE5NTY3ZS0wMyksIFFUQ0ZMTEQoMS43MjE3MThlLTAyKSwgIFFUQ0ZMTEQoNi43MzQ0ODZlLTAxKSwKKyAgICBRVENGTExEKC0xLjEzNTQ3OGUtMDgpLCBRVENGTExEKDUuNjMyOTc2ZS0wNiksICBRVENGTExEKC03LjM5MjI3OGUtMDQpLAorICAgIFFUQ0ZMTEQoMi4yMjYzODhlLTAyKSwgIFFUQ0ZMTEQoNy4zNzY5MjllLTAxKSwgIFFUQ0ZMTEQoNi4zNDc3NTFlLTA4KSwKKyAgICBRVENGTExEKDEuNDU0NDI1ZS0wNSksICBRVENGTExEKC0xLjEwNTIzOWUtMDQpLCBRVENGTExEKDIuODQ1ODA4ZS0wMiksCisgICAgUVRDRkxMRCg3Ljk4MTg0OGUtMDEpLCAgUVRDRkxMRCgtMi44MzgzMjhlLTA2KSwgUVRDRkxMRCgzLjQxNDc0OWUtMDYpLAorICAgIFFUQ0ZMTEQoMS4yNzIyNTRlLTAzKSwgIFFUQ0ZMTEQoMy41OTQ4MjFlLTAyKSwgIFFUQ0ZMTEQoOC41MzkyNjVlLTAxKSwKKyAgICBRVENGTExEKDcuMTE2MDQ5ZS0wOCksICBRVENGTExEKDQuMDMxMTI1ZS0wNSksICBRVENGTExEKDIuMTM2MzA0ZS0wMyksCisgICAgUVRDRkxMRCg0LjQ3NzMxOGUtMDIpLCAgUVRDRkxMRCg5LjAzODEzNWUtMDEpLCAgUVRDRkxMRCg0LjA5ODIyN2UtMDcpLAorICAgIFFUQ0ZMTEQoNy40ODQyNDBlLTA1KSwgIFFUQ0ZMTEQoMi43MTYwNzhlLTAzKSwgIFFUQ0ZMTEQoNS41MDI3NjZlLTAyKSwKKyAgICBRVENGTExEKDkuNDY2ODI1ZS0wMSksICBRVENGTExEKDQuOTM0MzI3ZS0wNyksICBRVENGTExEKDcuNTU3NzI1ZS0wNSksCisgICAgUVRDRkxMRCgyLjA1ODc0OGUtMDMpLCAgUVRDRkxMRCg2LjYyNjA2MmUtMDIpLCAgUVRDRkxMRCg5LjgxODM5NmUtMDEpLAorICAgIFFUQ0ZMTEQoLTQuOTMzODk2ZS0wOCksIFFUQ0ZMTEQoLTMuOTA3MzYwZS0wNSksIFFUQ0ZMTEQoMy43NTM5NjRlLTA0KSwKKyAgICBRVENGTExEKDcuODA2NjEwZS0wMiksICBRVENGTExEKDEuMDA4OTg4ZSswMCksICBRVENGTExEKC03Ljg1NjM0MWUtMDYpLAorICAgIFFUQ0ZMTEQoOS45NDk0ODBlLTA1KSwgIFFUQ0ZMTEQoNy4xNzYzMzFlLTA0KSwgIFFUQ0ZMTEQoOC45ODc3MDJlLTAyKSwKKyAgICBRVENGTExEKDEuMDI3Nzg0ZSswMCksICBRVENGTExEKDQuODIyNDQ4ZS0wNyksICBRVENGTExEKC0xLjMyNzkxNGUtMDUpLAorICAgIFFUQ0ZMTEQoNi44NTUyMjJlLTA0KSwgIFFUQ0ZMTEQoMS4wMTE4NDdlLTAxKSwgIFFUQ0ZMTEQoMS4wMzgyNDJlKzAwKSwKKyAgICBRVENGTExEKDQuNDMyNjg0ZS0wNyksICBRVENGTExEKC01LjY2MjAwOGUtMDUpLCBRVENGTExEKDUuMzYwMzE0ZS0wNCksCisgICAgUVRDRkxMRCgxLjExMjc1NmUtMDEpLCAgUVRDRkxMRCgxLjA0MTQzOWUrMDApLCAgUVRDRkxMRCgtMS44OTQyMDRlLTA2KSwKKyAgICBRVENGTExEKC0xLjYwMzg5NGUtMDQpLCBRVENGTExEKC0yLjc5NjQzM2UtMDQpLCBRVENGTExEKDEuMTkzODk0ZS0wMSksCisgICAgUVRDRkxMRCgxLjAzODQ1NmUrMDApLCAgUVRDRkxMRCgyLjM1MDU0MWUtMDYpLCAgUVRDRkxMRCgtMS45ODE3OTNlLTA0KSwKKyAgICBRVENGTExEKC0xLjcxOTk2N2UtMDMpLCBRVENGTExEKDEuMjQ5NDM3ZS0wMSksICBRVENGTExEKDEuMDI4NDA3ZSswMCksCisgICAgUVRDRkxMRCg0LjgzMzcxM2UtMDYpLCAgUVRDRkxMRCgtMS45NTc3OTllLTA0KSwgUVRDRkxMRCgtMy4xNTk2NDBlLTAzKSwKKyAgICBRVENGTExEKDEuMjc0NjA1ZS0wMSksICBRVENGTExEKDEuMDA5NzAxZSswMCksICBRVENGTExEKDQuNzI0MjYzZS0wNiksCisgICAgUVRDRkxMRCgtMS4xODE1MThlLTA1KSwgUVRDRkxMRCgtNC4yNDMzOTllLTAzKSwgUVRDRkxMRCgxLjI3MDM5MGUtMDEpLAorICAgIFFUQ0ZMTEQoOS43NDg4NTRlLTAxKSwgIFFUQ0ZMTEQoMS4wMDc3MjRlLTA2KSwgIFFUQ0ZMTEQoMi41ODU3NDFlLTA1KSwKKyAgICBRVENGTExEKC00LjcxMzQ0NWUtMDMpLCBRVENGTExEKDEuMjMxMTIwZS0wMSksICBRVENGTExEKDkuMjQ2NzcwZS0wMSksCisgICAgUVRDRkxMRCgyLjkwODQ1NGUtMDYpLCAgUVRDRkxMRCgzLjEzNzM3NGUtMDUpLCAgUVRDRkxMRCgtNC4yMzAyOTNlLTAzKSwKKyAgICBRVENGTExEKDEuMTQ0MjY5ZS0wMSksICBRVENGTExEKDguNjgxMDY3ZS0wMSksICBRVENGTExEKC00LjEyODg3N2UtMDgpLAorICAgIFFUQ0ZMTEQoMS44NzAzNThlLTA1KSwgIFFUQ0ZMTEQoLTIuODQyOTI0ZS0wMyksIFFUQ0ZMTEQoMS4wMDM3MTVlLTAxKSwKKyAgICBRVENGTExEKDguMDgwMzQ0ZS0wMSksICBRVENGTExEKDEuODA2NjQ5ZS0wNyksICBRVENGTExEKDMuNTU3MDcxZS0wNSksCisgICAgUVRDRkxMRCgtOC4zOTI0MjJlLTA0KSwgUVRDRkxMRCg4LjA2NTIyNWUtMDIpLCAgUVRDRkxMRCg3LjQ2NDQwNWUtMDEpLAorICAgIFFUQ0ZMTEQoMi4zNTI2MDllLTA2KSwgIFFUQ0ZMTEQoMS4wOTAwNzdlLTA0KSwgIFFUQ0ZMTEQoNy40OTc4NDhlLTA0KSwKKyAgICBRVENGTExEKDUuNTI5NjMxZS0wMiksICBRVENGTExEKDYuODMxNTkxZS0wMSksICBRVENGTExEKDEuMTU5NjU3ZS0wNyksCisgICAgUVRDRkxMRCg0LjU4NTk5MGUtMDUpLCAgUVRDRkxMRCgyLjA3OTM0NmUtMDMpLCAgUVRDRkxMRCgyLjQzNDg4M2UtMDIpLAorICAgIFFUQ0ZMTEQoNi4xNzkyMDhlLTAxKSwgIFFUQ0ZMTEQoOC44NTk2MDZlLTA3KSwgIFFUQ0ZMTEQoMS40MDMzNDVlLTA0KSwKKyAgICBRVENGTExEKDEuMDY1NTgwZS0wMyksICBRVENGTExEKC0xLjIyMDU3MmUtMDIpLCBRVENGTExEKDUuNTE0NTIxZS0wMSksCisgICAgUVRDRkxMRCgtMS4wMzgyNzhlLTA2KSwgUVRDRkxMRCgtMS4zNjgxNjJlLTA0KSwgUVRDRkxMRCgyLjkzMjMzOWUtMDQpLAorICAgIFFUQ0ZMTEQoLTUuNDE2Mzc0ZS0wMiksIFFUQ0ZMTEQoNC44NDMxMDllLTAxKSwgIFFUQ0ZMTEQoNy44MjAwMzBlLTA4KSwKKyAgICBRVENGTExEKDMuOTM0NTQ0ZS0wNSksICBRVENGTExEKC02LjYzODQ5MWUtMDQpLCBRVENGTExEKC0xLjAxMjY2NGUtMDEpLAorICAgIFFUQ0ZMTEQoNC4xNjUxNTBlLTAxKSwgIFFUQ0ZMTEQoLTguMzkzNDMyZS0wNiksIFFUQ0ZMTEQoLTUuMDUzNjQ2ZS0wNSksCisgICAgUVRDRkxMRCgtMS4zODE5MTJlLTAzKSwgUVRDRkxMRCgtMS41MzIyMjVlLTAxKSwgUVRDRkxMRCgzLjQ4NzMwMWUtMDEpLAorICAgIFFUQ0ZMTEQoLTEuNDU1ODk3ZS0wNiksIFFUQ0ZMTEQoNC44ODA5NjJlLTA1KSwgIFFUQ0ZMTEQoLTIuMjc0MzkyZS0wMyksCisgICAgUVRDRkxMRCgtMi4wOTY3MzdlLTAxKSwgUVRDRkxMRCgyLjgxODIzNGUtMDEpLCAgUVRDRkxMRCgtMS40MzQzMTdlLTA2KSwKKyAgICBRVENGTExEKDIuMjAzNjg3ZS0wNCksICBRVENGTExEKC0zLjM1NzMxMmUtMDMpLCBRVENGTExEKC0yLjcwMTY5M2UtMDEpLAorICAgIFFUQ0ZMTEQoMi4xNDc0NDFlLTAxKSwgIFFUQ0ZMTEQoNy4wOTIxOTllLTA2KSwgIFFUQ0ZMTEQoNC42ODE2NzBlLTA0KSwKKyAgICBRVENGTExEKC00LjYwMTU5M2UtMDMpLCBRVENGTExEKC0zLjM0MTk2OGUtMDEpLCBRVENGTExEKDEuNDYxODA1ZS0wMSksCisgICAgUVRDRkxMRCgtMS4xMTYxMjNlLTA1KSwgUVRDRkxMRCgxLjA3MjE5NmUtMDMpLCAgUVRDRkxMRCgtNS45MjUxNDFlLTAzKSwKKyAgICBRVENGTExEKC00LjAxMDI4NWUtMDEpLCBRVENGTExEKDguMDc3ODYyZS0wMiksICBRVENGTExEKC0zLjc3NTM4NWUtMDUpLAorICAgIFFUQ0ZMTEQoMS4yNDQ4NDFlLTAzKSwgIFFUQ0ZMTEQoLTcuNjI4NDY5ZS0wMyksIFFUQ0ZMTEQoLTQuNjk2MjQwZS0wMSksCisgICAgUVRDRkxMRCgyLjkwMTg4OWUtMDIpLAorfTsKIAorUkFNX0FMSUdOCitjb25zdCBGSVhQX1BGVCBxbWZfY2xkZmJfODBbUU1GODBfQ0xERkJfUEZUX1RBQkxFX1NJWkVdID0geworICAgIFFUQ0ZMTEQoNi45NjY5MjFlLTA3KSwgIFFUQ0ZMTEQoOS4wMjUxNzZlLTA2KSwgIFFUQ0ZMTEQoLTEuMDczMzI4ZS0wMyksCisgICAgUVRDRkxMRCgxLjE0NjU4NWUtMDIpLCAgUVRDRkxMRCg1LjcyNjc1OGUtMDEpLCAgUVRDRkxMRCgtMi4zMjMwNDZlLTA5KSwKKyAgICBRVENGTExEKDEuMDEyNjM4ZS0wNSksICBRVENGTExEKC0xLjA4NDY1NGUtMDMpLCBRVENGTExEKDEuOTYwNTE1ZS0wMiksCisgICAgUVRDRkxMRCg3LjA1OTcxMmUtMDEpLCAgUVRDRkxMRCgxLjIzMDE1OWUtMDcpLCAgUVRDRkxMRCg0LjYzOTEyNmUtMDUpLAorICAgIFFUQ0ZMTEQoNi4zOTg5MTFlLTA0KSwgIFFUQ0ZMTEQoMy4yMDQ1MDZlLTAyKSwgIFFUQ0ZMTEQoOC4yNjcxMjVlLTAxKSwKKyAgICBRVENGTExEKDIuODY1MzM5ZS0wNyksICBRVENGTExEKDYuMjczNzU5ZS0wNSksICBRVENGTExEKDIuNTUwNDY0ZS0wMyksCisgICAgUVRDRkxMRCg0Ljk3NzQ1M2UtMDIpLCAgUVRDRkxMRCg5LjI2MTgxOGUtMDEpLCAgUVRDRkxMRCgzLjczODI1N2UtMDcpLAorICAgIFFUQ0ZMTEQoLTIuNDI5MDIxZS0wNiksIFFUQ0ZMTEQoMS4zNzU5MjFlLTAzKSwgIFFUQ0ZMTEQoNy4yMTI3NTRlLTAyKSwKKyAgICBRVENGTExEKDkuOTY0MzMzZS0wMSksICBRVENGTExEKDEuMDc3MDM5ZS0wOCksICBRVENGTExEKC04LjUzMjk3NmUtMDYpLAorICAgIFFUQ0ZMTEQoNy4xNDcwMjJlLTA0KSwgIFFUQ0ZMTEQoOS41NjM0MzJlLTAyKSwgIFFUQ0ZMTEQoMS4wMzQwMTJlKzAwKSwKKyAgICBRVENGTExEKDMuMDg2MDQ2ZS0wNyksICBRVENGTExEKC03Ljk4Njg3MGUtMDUpLCBRVENGTExEKDIuMjAzNzgxZS0wNCksCisgICAgUVRDRkxMRCgxLjE1NjIyMWUtMDEpLCAgUVRDRkxMRCgxLjA0MDcxOGUrMDApLCAgUVRDRkxMRCg1LjU0MjgwNGUtMDYpLAorICAgIFFUQ0ZMTEQoLTEuNzM2NzU3ZS0wNCksIFFUQ0ZMTEQoLTIuNDc1NDI4ZS0wMyksIFFUQ0ZMTEQoMS4yNjYyMDZlLTAxKSwKKyAgICBRVENGTExEKDEuMDIwMTAwZSswMCksICBRVENGTExEKDMuNDE1MTY4ZS0wNiksICBRVENGTExEKDYuMjkwMjAxZS0wNiksCisgICAgUVRDRkxMRCgtNC41NzY3MDllLTAzKSwgUVRDRkxMRCgxLjI1NjM3MGUtMDEpLCAgUVRDRkxMRCg5LjUwNjM0NGUtMDEpLAorICAgIFFUQ0ZMTEQoLTEuOTk4NjMyZS0wOSksIFFUQ0ZMTEQoMy4wMTc1MTRlLTA1KSwgIFFUQ0ZMTEQoLTMuNjI3Mzk0ZS0wMyksCisgICAgUVRDRkxMRCgxLjA4MTAwM2UtMDEpLCAgUVRDRkxMRCg4LjM4MzI0NWUtMDEpLCAgUVRDRkxMRCgyLjU5MDkwMGUtMDcpLAorICAgIFFUQ0ZMTEQoOS42MTQwMDRlLTA1KSwgIFFUQ0ZMTEQoMi4xODM3ODZlLTA2KSwgIFFUQ0ZMTEQoNi44NjcxNDFlLTAyKSwKKyAgICBRVENGTExEKDcuMTUwNTIzZS0wMSksICBRVENGTExEKDEuNDA4MTcyZS0wNyksICBRVENGTExEKDUuMjAzMjE3ZS0wNSksCisgICAgUVRDRkxMRCgxLjU4NDQxMGUtMDMpLCAgUVRDRkxMRCg2Ljc1Mzc0OWUtMDMpLCAgUVRDRkxMRCg1Ljg0Nzg1OGUtMDEpLAorICAgIFFUQ0ZMTEQoLTkuMjM0MzI2ZS0wNyksIFFUQ0ZMTEQoNi40NzcxODNlLTA2KSwgIFFUQ0ZMTEQoLTIuMTIzOTY5ZS0wNCksCisgICAgUVRDRkxMRCgtNy43MDkyMzBlLTAyKSwgUVRDRkxMRCg0LjUwNDc5OGUtMDEpLCAgUVRDRkxMRCgtMi40NjQwMzNlLTA4KSwKKyAgICBRVENGTExEKDEuODg4NjI2ZS0wNSksICBRVENGTExEKC0xLjgxMjAwM2UtMDMpLCBRVENGTExEKC0xLjgwOTEyN2UtMDEpLAorICAgIFFUQ0ZMTEQoMy4xNTE3NDNlLTAxKSwgIFFUQ0ZMTEQoLTguMzQ0ODgyZS0wNyksIFFUQ0ZMTEQoMi41Mzg1MjhlLTA0KSwKKyAgICBRVENGTExEKC0zLjk3MjYyNmUtMDMpLCBRVENGTExEKC0zLjAxNzc5M2UtMDEpLCBRVENGTExEKDEuODA1NjU4ZS0wMSksCisgICAgUVRDRkxMRCgtMi43MjA1MjZlLTA1KSwgUVRDRkxMRCgxLjE1MDAwOWUtMDMpLCAgUVRDRkxMRCgtNi43MTI4MjJlLTAzKSwKKyAgICBRVENGTExEKC00LjM1MTc0MGUtMDEpLCBRVENGTExEKDUuMjc2Njg3ZS0wMiksCit9OwogCisjaWYgZGVmaW5lZChRTUZfQ09FRkZfMTZCSVQpCisjZGVmaW5lIFFUTUZMTEQoeCkgRkwyRlhDT05TVF9TR0woeCAvIChmbG9hdCkoMSA8PCBRTUZfTVBTTERGQl9QRlRfU0NBTEUpKQorI2RlZmluZSBRVE1GTExEVCh4KSBGWF9EQkwyRlhDT05TVF9TR0woeCkKKyNlbHNlCisjZGVmaW5lIFFUTUZMTEQoeCkgRkwyRlhDT05TVF9EQkwoeCAvIChmbG9hdCkoMSA8PCBRTUZfTVBTTERGQl9QRlRfU0NBTEUpKQorI2RlZmluZSBRVE1GTExEVCh4KSAoRklYUF9EQkwpKHgpCisjZW5kaWYKIAorLyohCisgIFxuYW1lIFFNRgorICBcYnJpZWYgIFFNRi1UYWJsZQorICAgICAgICAgIDMyIGNoYW5uZWxzLCBOID0gMzIwLAogCisgIFRoZSBjb2VmZmljaWVudHMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgTVBTIExvdyBEZWxheSBjb2VmZmljaWVudCBzZXQKKyAgd2l0aCA2NDAgc2FtcGxlcy4gVGhlIGNvZWZmaWNpZW50cyBhcmUgaW50ZXJwb2xhdGVkIGFuZCByZWFycmFuZ2VkCisgIGluIHRoZSBmb2xsb3dpbmcgd2F5IGNvbXBhcmVkIHRvIHRoZSByZWZlcmVuY2U6CisKKyAgcW1mX21wc2xkZmJfMzIwWzBdICAgPSAocW1mXzY0X3JlZmVyZW5jZVsgIDBdICsgcW1mXzY0X3JlZmVyZW5jZVsgIDFdKS8yLjA7CisgIHFtZl9tcHNsZGZiXzMyMFsxXSAgID0gKHFtZl82NF9yZWZlcmVuY2VbMTI4XSArIHFtZl82NF9yZWZlcmVuY2VbMTI5XSkvMi4wOworICBxbWZfbXBzbGRmYl8zMjBbMl0gICA9IChxbWZfNjRfcmVmZXJlbmNlWzI1Nl0gKyBxbWZfNjRfcmVmZXJlbmNlWzI1N10pLzIuMDsKKyAgcW1mX21wc2xkZmJfMzIwWzNdICAgPSAocW1mXzY0X3JlZmVyZW5jZVszODRdICsgcW1mXzY0X3JlZmVyZW5jZVszODVdKS8yLjA7CisgIHFtZl9tcHNsZGZiXzMyMFs0XSAgID0gKHFtZl82NF9yZWZlcmVuY2VbNTEyXSArIHFtZl82NF9yZWZlcmVuY2VbNTEzXSkvMi4wOworCisgIHFtZl9tcHNsZGZiXzMyMFs1XSAgID0gKHFtZl82NF9yZWZlcmVuY2VbICAyXSArIHFtZl82NF9yZWZlcmVuY2VbICAzXSkvMi4wOworICBxbWZfbXBzbGRmYl8zMjBbNl0gICA9IChxbWZfNjRfcmVmZXJlbmNlWzEzMF0gKyBxbWZfNjRfcmVmZXJlbmNlWzEzMV0pLzIuMDsKKyAgcW1mX21wc2xkZmJfMzIwWzddICAgPSAocW1mXzY0X3JlZmVyZW5jZVsyNThdICsgcW1mXzY0X3JlZmVyZW5jZVsyNTldKS8yLjA7CisgIHFtZl9tcHNsZGZiXzMyMFs4XSAgID0gKHFtZl82NF9yZWZlcmVuY2VbMzg2XSArIHFtZl82NF9yZWZlcmVuY2VbMzg3XSkvMi4wOworICBxbWZfbXBzbGRmYl8zMjBbOV0gICA9IChxbWZfNjRfcmVmZXJlbmNlWzUxNF0gKyBxbWZfNjRfcmVmZXJlbmNlWzUxNV0pLzIuMDsKKyAgLgorICAuCisgIC4KKyAgcW1mX21wc2xkZmJfMzIwWzMxNV0gPSAocW1mXzY0X3JlZmVyZW5jZVsxMjZdICsgcW1mXzY0X3JlZmVyZW5jZVsxMjddKS8yLjA7CisgIHFtZl9tcHNsZGZiXzMyMFszMTZdID0gKHFtZl82NF9yZWZlcmVuY2VbMjU0XSArIHFtZl82NF9yZWZlcmVuY2VbMjU1XSkvMi4wOworICBxbWZfbXBzbGRmYl8zMjBbMzE3XSA9IChxbWZfNjRfcmVmZXJlbmNlWzM4Ml0gKyBxbWZfNjRfcmVmZXJlbmNlWzM4M10pLzIuMDsKKyAgcW1mX21wc2xkZmJfMzIwWzMxOF0gPSAocW1mXzY0X3JlZmVyZW5jZVs1MTBdICsgcW1mXzY0X3JlZmVyZW5jZVs1MTFdKS8yLjA7CisgIHFtZl9tcHNsZGZiXzMyMFszMTldID0gKHFtZl82NF9yZWZlcmVuY2VbNjM4XSArIHFtZl82NF9yZWZlcmVuY2VbNjM5XSkvMi4wOworCisgIFRoZSBmaWx0ZXIgb3V0cHV0IGlzIHJlcXVpcmVkIHRvIGJlIHNjYWxlZCBieSAxIGJpdC4KKworICBcc2hvd2luaXRpYWxpemVyCisqLworLy9AeworY29uc3QgRklYUF9QRlQgcW1mX21wc2xkZmJfMzIwW1FNRjMyMF9NUFNMREZCX1BGVF9UQUJMRV9TSVpFXSA9IHsKKyAgICBRVE1GTExEKDEuMDc3NzcyNTQwMmUtMDA0KSwgIFFUTUZMTEQoLTkuNDcwMzgwNjA5OWUtMDA0KSwKKyAgICBRVE1GTExEKDYuMTI4NjQzNjM5NGUtMDAzKSwgIFFUTUZMTEQoLTkuMDE2MTk2NDI5N2UtMDAyKSwKKyAgICBRVE1GTExEKDUuNTU1NDQwMTg3NWUtMDAxKSwgIFFUTUZMTEQoMS4yNzMxMzE2MzgzZS0wMDQpLAorICAgIFFUTUZMTEQoLTEuMjMxMTMzNDcyMmUtMDAzKSwgUVRNRkxMRCg0Ljk0NjgyMDkwMzZlLTAwMyksCisgICAgUVRNRkxMRCgtMS4xMzA1MDI2NzEwZS0wMDEpLCBRVE1GTExEKDUuMjk5MDQxODY3M2UtMDAxKSwKKyAgICBRVE1GTExEKDEuMTkyNzQxMjU2MWUtMDA0KSwgIFFUTUZMTEQoLTEuNTEyODIwMzY2OGUtMDAzKSwKKyAgICBRVE1GTExEKDMuNTc5NDUzMzMyM2UtMDAzKSwgIFFUTUZMTEQoLTEuMzY4MTIwMzEyN2UtMDAxKSwKKyAgICBRVE1GTExEKDUuMDQyMzMxMjE4N2UtMDAxKSwgIFFUTUZMTEQoMS4wMDA2MzgwNzYyZS0wMDQpLAorICAgIFFUTUZMTEQoLTEuNzkyNTA1ODQ5MmUtMDAzKSwgUVRNRkxMRCgyLjAxNjQwMzQ3OTVlLTAwMyksCisgICAgUVRNRkxMRCgtMS42MTM5NjQxNDA0ZS0wMDEpLCBRVE1GTExEKDQuNzg2MTAyNDczN2UtMDAxKSwKKyAgICBRVE1GTExEKDcuMjgyNjIwMjA4NmUtMDA1KSwgIFFUTUZMTEQoLTIuMDY5NzM0MDM2OWUtMDAzKSwKKyAgICBRVE1GTExEKDIuNDgzODk2OTY5NGUtMDA0KSwgIFFUTUZMTEQoLTEuODY3NDc1NjU4N2UtMDAxKSwKKyAgICBRVE1GTExEKDQuNTMxMTMzNzcwOWUtMDAxKSwgIFFUTUZMTEQoMy44ODA4MDE1MjMzZS0wMDUpLAorICAgIFFUTUZMTEQoLTIuMzQyOTA0NDUyMmUtMDAzKSwgUVRNRkxMRCgtMS43MzMxNTQ2NDA1ZS0wMDMpLAorICAgIFFUTUZMTEQoLTIuMTI4MDQ4ODM3MmUtMDAxKSwgUVRNRkxMRCg0LjI3ODE4MDAwMzJlLTAwMSksCisgICAgUVRNRkxMRCgtNS40MzU5NTg4ODMwZS0wMDcpLCBRVE1GTExEKC0yLjYxMTI2NjkxNDhlLTAwMyksCisgICAgUVRNRkxMRCgtMy45MzU3MjQ5NjI1ZS0wMDMpLCBRVE1GTExEKC0yLjM5NTAzNTkyMjVlLTAwMSksCisgICAgUVRNRkxMRCg0LjAyNzk4MDI2ODBlLTAwMSksICBRVE1GTExEKC00LjM2MTQ1NDkyMTNlLTAwNSksCisgICAgUVRNRkxMRCgtMi44NzQxNDU1MTcxZS0wMDMpLCBRVE1GTExEKC02LjM2NTUwNzg0MTFlLTAwMyksCisgICAgUVRNRkxMRCgtMi42Njc3NDcxMzk5ZS0wMDEpLCBRVE1GTExEKDMuNzgxMjUwNzE1M2UtMDAxKSwKKyAgICBRVE1GTExEKC04LjkwNDAxNTcwMzZlLTAwNSksIFFUTUZMTEQoLTMuMTMwODg4MTAwN2UtMDAzKSwKKyAgICBRVE1GTExEKC05LjAyNzU1NTU4NDllLTAwMyksIFFUTUZMTEQoLTIuOTQ1NDU1MDE0N2UtMDAxKSwKKyAgICBRVE1GTExEKDMuNTM4NjgzMDU2OGUtMDAxKSwgIFFUTUZMTEQoLTEuMzUxOTA0NjQ3OWUtMDA0KSwKKyAgICBRVE1GTExEKC0zLjM4MDg3MzI0MDVlLTAwMyksIFFUTUZMTEQoLTEuMTkyNTQwNjc1NGUtMDAyKSwKKyAgICBRVE1GTExEKC0zLjIyNzM5NDIyMzJlLTAwMSksIFFUTUZMTEQoMy4zMDA5Mzk3OTg0ZS0wMDEpLAorICAgIFFUTUZMTEQoLTEuODA0NTU3OTc4MmUtMDA0KSwgUVRNRkxMRCgtMy42MjM2ODMwMDU2ZS0wMDMpLAorICAgIFFUTUZMTEQoLTEuNTA2MTMxMTQyNGUtMDAyKSwgUVRNRkxMRCgtMy41MTI3NzA1MzM2ZS0wMDEpLAorICAgIFFUTUZMTEQoMy4wNjg2NTA5NjA5ZS0wMDEpLCAgUVRNRkxMRCgtMi4yMzk2ODAwMzQxZS0wMDQpLAorICAgIFFUTUZMTEQoLTMuODU4Nzk2MDg4MGUtMDAzKSwgUVRNRkxMRCgtMS44NDM1ODM1ODM4ZS0wMDIpLAorICAgIFFUTUZMTEQoLTMuODAwNzUyNzU5MGUtMDAxKSwgUVRNRkxMRCgyLjg0MjQwNjkyODVlLTAwMSksCisgICAgUVRNRkxMRCgtMi42NDE2OTc2NDcxZS0wMDQpLCBRVE1GTExEKC00LjA4NTkwMDI2MjBlLTAwMyksCisgICAgUVRNRkxMRCgtMi4yMDQ4MDIyNTk4ZS0wMDIpLCBRVE1GTExEKC00LjA5MDQ5MTUzMzNlLTAwMSksCisgICAgUVRNRkxMRCgyLjYyMjc1NzU1NDFlLTAwMSksICBRVE1GTExEKC0zLjAwMDE4ODczNTNlLTAwNCksCisgICAgUVRNRkxMRCgtNC4zMDQ1NTg5NzAwZS0wMDMpLCBRVE1GTExEKC0yLjU4OTQ5ODQ2MDNlLTAwMiksCisgICAgUVRNRkxMRCgtNC4zODExMDY0OTU5ZS0wMDEpLCBRVE1GTExEKDIuNDEwMjA0NDEwNmUtMDAxKSwKKyAgICBRVE1GTExEKC0zLjMwODMxNTY0NTBlLTAwNCksIFFUTUZMTEQoLTQuNTE0NTQ4NDYxOWUtMDAzKSwKKyAgICBRVE1GTExEKC0yLjk5NzIxMjExMTllLTAwMiksIFFUTUZMTEQoLTQuNjcxNzAwMDAwOGUtMDAxKSwKKyAgICBRVE1GTExEKDIuMjA1MjAwNzkxNGUtMDAxKSwgIFFUTUZMTEQoLTMuNTYxNDQ0NzU1MmUtMDA0KSwKKyAgICBRVE1GTExEKC00LjcxNTU5NTM5NDRlLTAwMyksIFFUTUZMTEQoLTMuNDI3Mjg5NDI2M2UtMDAyKSwKKyAgICBRVE1GTExEKC00Ljk2MTM1NzcxMjdlLTAwMSksIFFUTUZMTEQoMi4wMDgxNDQyNTk1ZS0wMDEpLAorICAgIFFUTUZMTEQoLTMuNzU3OTgyNjMxMmUtMDA0KSwgUVRNRkxMRCgtNC45MDcyOTg4MzMxZS0wMDMpLAorICAgIFFUTUZMTEQoLTMuODc4ODc4MDU3MGUtMDAyKSwgUVRNRkxMRCgtNS4yNDkxNTI3Nzk2ZS0wMDEpLAorICAgIFFUTUZMTEQoMS44MTkzODA4MTk4ZS0wMDEpLCAgUVRNRkxMRCgtMy44OTkzNzM5ODcyZS0wMDQpLAorICAgIFFUTUZMTEQoLTUuMDg5MzM1MTQzNmUtMDAzKSwgUVRNRkxMRCgtNC4zNTA5MDEwMjI2ZS0wMDIpLAorICAgIFFUTUZMTEQoLTUuNTM0MTQ4MjE2MmUtMDAxKSwgUVRNRkxMRCgxLjYzOTE5NzQ2ODhlLTAwMSksCisgICAgUVRNRkxMRCgtMy45OTEyODk5OTU2ZS0wMDQpLCBRVE1GTExEKC01LjI2MTUzODU1MDNlLTAwMyksCisgICAgUVRNRkxMRCgtNC44NDIxMTg1NDY0ZS0wMDIpLCBRVE1GTExEKC01LjgxNTQwMzQ2MTVlLTAwMSksCisgICAgUVRNRkxMRCgxLjQ2NzgyMDcwNDBlLTAwMSksICBRVE1GTExEKC00LjA0MjE5Njk2MDdlLTAwNCksCisgICAgUVRNRkxMRCgtNS40MjM2Nzk5NDc5ZS0wMDMpLCBRVE1GTExEKC01LjM1MTA2MDYyODllLTAwMiksCisgICAgUVRNRkxMRCgtNi4wOTE5Nzg1NTAwZS0wMDEpLCBRVE1GTExEKDEuMzA1NDE2NTI0NGUtMDAxKSwKKyAgICBRVE1GTExEKC00LjA2NDU0NzgyOTNlLTAwNCksIFFUTUZMTEQoLTUuNTc1NjY3MTM1NGUtMDAzKSwKKyAgICBRVE1GTExEKC01Ljg3NjAwNTQ0MTBlLTAwMiksIFFUTUZMTEQoLTYuMzYyOTM4ODgwOWUtMDAxKSwKKyAgICBRVE1GTExEKDEuMTUyMDkyNTE2NGUtMDAxKSwgIFFUTUZMTEQoLTQuMDcyMDkzODcwNWUtMDA0KSwKKyAgICBRVE1GTExEKC01LjcxNzM4MzY5NzZlLTAwMyksIFFUTUZMTEQoLTYuNDE0OTk5ODEyOGUtMDAyKSwKKyAgICBRVE1GTExEKC02LjYyNzM1ODE5ODJlLTAwMSksIFFUTUZMTEQoMS4wMDc4OTY1MTI3ZS0wMDEpLAorICAgIFFUTUZMTEQoLTQuMDgxMjczODAwN2UtMDA0KSwgUVRNRkxMRCgtNS44NDg4OTExMDE4ZS0wMDMpLAorICAgIFFUTUZMTEQoLTYuOTY1ODU2OTk5MmUtMDAyKSwgUVRNRkxMRCgtNi44ODQzMjIxNjY0ZS0wMDEpLAorICAgIFFUTUZMTEQoOC43MjgxNTU0OTM3ZS0wMDIpLCAgUVRNRkxMRCgtNC4xMTIwOTEyNjQ3ZS0wMDQpLAorICAgIFFUTUZMTEQoLTUuOTcwMzQzMDE2MWUtMDAzKSwgUVRNRkxMRCgtNy41MjYxMzU0NDQ2ZS0wMDIpLAorICAgIFFUTUZMTEQoLTcuMTMyOTM3OTA4MmUtMDAxKSwgUVRNRkxMRCg3LjQ2NzgwMzM1OTBlLTAwMiksCisgICAgUVRNRkxMRCgtNC4xODM4ODUxNzU3ZS0wMDQpLCBRVE1GTExEKC02LjA4MjEyODczMzRlLTAwMyksCisgICAgUVRNRkxMRCgtOC4wOTMxNzY3ODIxZS0wMDIpLCBRVE1GTExEKC03LjM3MjMzNjM4NzZlLTAwMSksCisgICAgUVRNRkxMRCg2LjI5NjYyNDk4ODNlLTAwMiksICBRVE1GTExEKC00LjMxNDgxMjI0OTVlLTAwNCksCisgICAgUVRNRkxMRCgtNi4xODQ3OTQwMDg3ZS0wMDMpLCBRVE1GTExEKC04LjY2NDA3OTAxMDVlLTAwMiksCisgICAgUVRNRkxMRCgtNy42MDE2NzgzNzE0ZS0wMDEpLCBRVE1GTExEKDUuMjEyODI2MjgxOGUtMDAyKSwKKyAgICBRVE1GTExEKC00LjUyMjk1MzgyMjdlLTAwNCksIFFUTUZMTEQoLTYuMjc5MTU0NjgwN2UtMDAzKSwKKyAgICBRVE1GTExEKC05LjIzNTcxMjg4NTllLTAwMiksIFFUTUZMTEQoLTcuODIwMTU4NjAwOGUtMDAxKSwKKyAgICBRVE1GTExEKDQuMjEzOTkxNzYxMmUtMDAyKSwgIFFUTUZMTEQoLTQuODIxMTI4MDk1NWUtMDA0KSwKKyAgICBRVE1GTExEKC02LjM2NjE5MzI5NDVlLTAwMyksIFFUTUZMTEQoLTkuODA0NzE4MTk2NGUtMDAyKSwKKyAgICBRVE1GTExEKC04LjAyNzAxMjM0ODJlLTAwMSksIFFUTUZMTEQoMy4yOTcyMzk1NDIwZS0wMDIpLAorICAgIFFUTUZMTEQoLTUuMjE5NjY3MjE4NmUtMDA0KSwgUVRNRkxMRCgtNi40NDcxMjMzNjM2ZS0wMDMpLAorICAgIFFUTUZMTEQoLTEuMDM2NzUyNjExNGUtMDAxKSwgUVRNRkxMRCgtOC4yMjE1MjMxNjU3ZS0wMDEpLAorICAgIFFUTUZMTEQoMi40NTg5ODAzMDcwZS0wMDIpLCAgUVRNRkxMRCgtNS43MjQ3OTQ0NjQyZS0wMDQpLAorICAgIFFUTUZMTEQoLTYuNTIzMjk3MTY4M2UtMDAzKSwgUVRNRkxMRCgtMS4wOTIwMzM5ODIzZS0wMDEpLAorICAgIFFUTUZMTEQoLTguNDAzMDIyODg1M2UtMDAxKSwgUVRNRkxMRCgxLjY5NTIxNTg4ODNlLTAwMiksCisgICAgUVRNRkxMRCgtNi4zMzQzNzg4NDk3ZS0wMDQpLCBRVE1GTExEKC02LjU5NjMzNzUzODJlLTAwMyksCisgICAgUVRNRkxMRCgtMS4xNDU5MTk0MTI0ZS0wMDEpLCBRVE1GTExEKC04LjU3MDkxMTg4NDNlLTAwMSksCisgICAgUVRNRkxMRCgxLjAwMDYwNzQ3OTRlLTAwMiksICBRVE1GTExEKC03LjA0NDk0MzA0OTZlLTAwNCksCisgICAgUVRNRkxMRCgtNi42NjgxODQ4ODM5ZS0wMDMpLCBRVE1GTExEKC0xLjE5Nzk5NjQzNzVlLTAwMSksCisgICAgUVRNRkxMRCgtOC43MjQ2NTE5MzI3ZS0wMDEpLCBRVE1GTExEKDMuNjk2ODA1MDk5MGUtMDAzKSwKKyAgICBRVE1GTExEKC03Ljk2MDk1OTMzNzdlLTAwNCksIFFUTUZMTEQoLTYuNzQwMzAxMzgxOGUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjI0NzgxNjUzMjllLTAwMSksIFFUTUZMTEQoLTguODYzMjMyMTM1OGUtMDAxKSwKKyAgICBRVE1GTExEKC0xLjYzNDQ0NjA4OTJlLTAwMyksIFFUTUZMTEQoLTkuMDIwMDQ1OTgxN2UtMDA0KSwKKyAgICBRVE1GTExEKC02LjgxNTExNDk4OTllLTAwMyksIFFUTUZMTEQoLTEuMjk0OTI1ODA4OWUtMDAxKSwKKyAgICBRVE1GTExEKC04Ljk4NjA3NzMwODdlLTAwMSksIFFUTUZMTEQoLTUuOTI4MzU0MzM3OGUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjAxMTY5NDMxNThlLTAwMyksIFFUTUZMTEQoLTYuODk1NTg5MTc2NmUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjMzODg4MDgwNzJlLTAwMSksIFFUTUZMTEQoLTkuMDkzMzQxODI3NGUtMDAxKSwKKyAgICBRVE1GTExEKC05LjY0NjY0ODU0MTFlLTAwMyksIFFUTUZMTEQoLTEuMTI0NDkzNTQ0OWUtMDAzKSwKKyAgICBRVE1GTExEKC02Ljk4MzUyMTM5NDRlLTAwMyksIFFUTUZMTEQoLTEuMzc5MTk5MDI4MGUtMDAxKSwKKyAgICBRVE1GTExEKC05LjE4NDY3MjIzNjRlLTAwMSksIFFUTUZMTEQoLTEuMjgzODk1MDM4MWUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjIzOTM5MDQ2MTdlLTAwMyksIFFUTUZMTEQoLTcuMDgwOTI0Njk3MmUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjQxNTM5MDUyMTNlLTAwMSksIFFUTUZMTEQoLTkuMjU5NzYzOTU2MWUtMDAxKSwKKyAgICBRVE1GTExEKC0xLjU1Mzk5MjE4MjBlLTAwMiksIFFUTUZMTEQoLTEuMzU0MjAzMzI2NmUtMDAzKSwKKyAgICBRVE1GTExEKC03LjE4OTUyNDgyNTdlLTAwMyksIFFUTUZMTEQoLTEuNDQ2OTYyNjU0NmUtMDAxKSwKKyAgICBRVE1GTExEKC05LjMxODM4NTEyNDJlLTAwMSksIFFUTUZMTEQoLTEuNzc4MzIzOTQ4NGUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjQ2Njk1MDE2ODhlLTAwMyksIFFUTUZMTEQoLTcuMzExMDAxNDIwMGUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjQ3MzQxNjk4NDFlLTAwMSksIFFUTUZMTEQoLTkuMzYwMzY3MDU5N2UtMDAxKSwKKyAgICBRVE1GTExEKC0xLjk1OTc3Mzg5ODFlLTAwMiksIFFUTUZMTEQoLTEuNTc1MzIyNDcyNWUtMDAzKSwKKyAgICBRVE1GTExEKC03LjQ0NjYyMjAxMDNlLTAwMyksIFFUTUZMTEQoLTEuNDk0MjU2NTU2MGUtMDAxKSwKKyAgICBRVE1GTExEKC05LjM4NTYxMzIwMzBlLTAwMSksIFFUTUZMTEQoLTIuMTAxMTUzNTA3OGUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjY3NzExNTIxNTBlLTAwMyksIFFUTUZMTEQoLTcuNTk3Mjk1NTY3NGUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjUwODk4NjM1MzllLTAwMSksIFFUTUZMTEQoLTkuMzk0MDk0OTQ0MGUtMDAxKSwKKyAgICBRVE1GTExEKC0yLjIwNDk4MTQ0NjNlLTAwMiksIFFUTUZMTEQoLTEuNzY5ODY3NzI1N2UtMDAzKSwKKyAgICBRVE1GTExEKC03Ljc2MzQ5MTk0MzVlLTAwMyksIFFUTUZMTEQoLTEuNTE3MTE4NTEzNmUtMDAxKSwKKyAgICBRVE1GTExEKC05LjM4NTg1MzQwOThlLTAwMSksIFFUTUZMTEQoLTIuMjczODI3NjA0OWUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjg1MTI5NjA1MjNlLTAwMyksIFFUTUZMTEQoLTcuOTQ1MDY0NDU1M2UtMDAzKSwKKyAgICBRVE1GTExEKC0xLjUxODE3NDcwNzllLTAwMSksIFFUTUZMTEQoLTkuMzYxMDAxMjUzMWUtMDAxKSwKKyAgICBRVE1GTExEKC0yLjMxMDEwODAyMDllLTAwMiksIFFUTUZMTEQoLTEuOTE5MjY1NzIwMWUtMDAzKSwKKyAgICBRVE1GTExEKC04LjE0MTM3MDQ5MDJlLTAwMyksIFFUTUZMTEQoLTEuNTExNjg5MTI2NWUtMDAxKSwKKyAgICBRVE1GTExEKC05LjMxOTcxOTA3NjJlLTAwMSksIFFUTUZMTEQoLTIuMzE2MzQ4NjI3MmUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjk3MTY5MDQ0OTllLTAwMyksIFFUTUZMTEQoLTguMzUwOTQwNDIxMmUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjQ5NzIwOTUxOTFlLTAwMSksIFFUTUZMTEQoLTkuMjYyMjUzMDQ2MGUtMDAxKSwKKyAgICBRVE1GTExEKC0yLjI5NTAwMzA4NjNlLTAwMiksIFFUTUZMTEQoLTIuMDA2NjYyMDc4MmUtMDAzKSwKKyAgICBRVE1GTExEKC04LjU3MTU3NjMyNzFlLTAwMyksIFFUTUZMTEQoLTEuNDc0MzA1NTQwM2UtMDAxKSwKKyAgICBRVE1GTExEKC05LjE4ODkxMzEwNjllLTAwMSksIFFUTUZMTEQoLTIuMjQ4NjY5OTc0NWUtMDAyKSwKKyAgICBRVE1GTExEKC0yLjAyMjcwNTczOTRlLTAwMyksIFFUTUZMTEQoLTguODAwNTU1OTUxOWUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjQ0MjU2Njk2MTFlLTAwMSksIFFUTUZMTEQoLTkuMTAwMDcxMTkxOGUtMDAxKSwKKyAgICBRVE1GTExEKC0yLjE3OTkxMzU5NTNlLTAwMiksIFFUTUZMTEQoLTIuMDE4NTUyNzM5MmUtMDAzKSwKKyAgICBRVE1GTExEKC05LjAzNDExNjc1MjRlLTAwMyksIFFUTUZMTEQoLTEuNDAxNjEwNjcyNWUtMDAxKSwKKyAgICBRVE1GTExEKC04Ljk5NjE2MTIyMjVlLTAwMSksIFFUTUZMTEQoLTIuMDkxNDM4MzIzM2UtMDAyKSwKKyAgICBRVE1GTExEKC0xLjk5MzIzMzgwMzdlLTAwMyksIFFUTUZMTEQoLTkuMjY3NDQxOTI4NGUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjM1MTA4MTU3OTllLTAwMSksIFFUTUZMTEQoLTguODc3NjY0ODA0NWUtMDAxKSwKKyAgICBRVE1GTExEKC0xLjk4NTkwOTQxNzNlLTAwMiksIFFUTUZMTEQoLTEuOTQ2MTA2NTUzMWUtMDAzKSwKKyAgICBRVE1GTExEKC05LjQ5NDg3Mjc2MzhlLTAwMyksIFFUTUZMTEQoLTEuMjkwNjU0MjQyMGUtMDAxKSwKKyAgICBRVE1GTExEKC04Ljc0NTExNTk5NTRlLTAwMSksIFFUTUZMTEQoLTEuODY2MDkwMjk3N2UtMDAyKSwKKyAgICBRVE1GTExEKC0xLjg3NzAwNTIxMjBlLTAwMyksIFFUTUZMTEQoLTkuNzEwMDEyOTM1MWUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjIyMDAzODA4NjJlLTAwMSksIFFUTUZMTEQoLTguNTk5MTAxMzA1MGUtMDAxKSwKKyAgICBRVE1GTExEKC0xLjczNDY5MjIzMDhlLTAwMiksIFFUTUZMTEQoLTEuNzg1OTg2NTkxMWUtMDAzKSwKKyAgICBRVE1GTExEKC05LjkwNTY0OTM0OTFlLTAwMyksIFFUTUZMTEQoLTEuMTM4OTc4MjI4MGUtMDAxKSwKKyAgICBRVE1GTExEKC04LjQ0MDI1NjExODhlLTAwMSksIFFUTUZMTEQoLTEuNTk0NDkzOTEwN2UtMDAyKSwKKyAgICBRVE1GTExEKC0xLjY3MzQxNjkzMzBlLTAwMyksIFFUTUZMTEQoLTEuMDA3Mzk4OTYzMGUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjA0NzI1OTg2NzJlLTAwMSksIFFUTUZMTEQoLTguMjY5MjUyNzc3MWUtMDAxKSwKKyAgICBRVE1GTExEKC0xLjQ0ODE3NDc1MjNlLTAwMiksIFFUTUZMTEQoLTEuNTM5OTgwMjk0MmUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjAyMDU5MDY4MTZlLTAwMiksIFFUTUZMTEQoLTkuNDQ3MDg4ODM3NmUtMDAyKSwKKyAgICBRVE1GTExEKC04LjA4NjgwNDE1MTVlLTAwMSksIFFUTUZMTEQoLTEuMjk4NDI0OTc0MWUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjM4NjU4NzI3NTJlLTAwMyksIFFUTUZMTEQoLTEuMDI5MTcwMzk3N2UtMDAyKSwKKyAgICBRVE1GTExEKC04LjMxMTk1NTYzMDhlLTAwMiksIFFUTUZMTEQoLTcuODkzNjU4ODc2NGUtMDAxKSwKKyAgICBRVE1GTExEKC0xLjE0Nzc5ODYzNTFlLTAwMiksIFFUTUZMTEQoLTEuMjE0NDM0ODU4NGUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjAzMjA5NjI0MDdlLTAwMiksIFFUTUZMTEQoLTcuMDY2MzM5OTk5NGUtMDAyKSwKKyAgICBRVE1GTExEKC03LjY5MDU5MzYwMDNlLTAwMSksIFFUTUZMTEQoLTkuOTg4NDg2NzY2OGUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjAyNDgyNjY2MjZlLTAwMyksIFFUTUZMTEQoLTEuMDI4Mjc2NDIxMWUtMDAyKSwKKyAgICBRVE1GTExEKC01LjcwOTg2MDQ3MzllLTAwMiksIFFUTUZMTEQoLTcuNDc4NDE0NzczOWUtMDAxKSwKKyAgICBRVE1GTExEKC04LjUzOTMyMDkwMTBlLTAwMyksIFFUTUZMTEQoLTguMTkxOTgwMzA1MWUtMDA0KSwKKyAgICBRVE1GTExEKC0xLjAxNjU3MTc0NTNlLTAwMiksIFFUTUZMTEQoLTQuMjQyNjE5ODcyMWUtMDAyKSwKKyAgICBRVE1GTExEKC03LjI1Nzk0NzkyMThlLTAwMSksIFFUTUZMTEQoLTcuMTUzMzQwNjE1M2UtMDAzKSwKKyAgICBRVE1GTExEKC01Ljk5MTQyODYyNDhlLTAwNCksIFFUTUZMTEQoLTkuOTU3OTcyOTE0MGUtMDAzKSwKKyAgICBRVE1GTExEKC0yLjY2NTIwMTIwMjBlLTAwMiksIFFUTUZMTEQoLTcuMDMwMDQxMjE3OGUtMDAxKSwKKyAgICBRVE1GTExEKC01Ljg1MDgxMTQ4ODllLTAwMyksIFFUTUZMTEQoLTMuNjYyNjg3Mzc3MWUtMDA0KSwKKyAgICBRVE1GTExEKC05LjY0NzUwOTA4MzJlLTAwMyksIFFUTUZMTEQoLTkuNzg3MTIxNzg3N2UtMDAzKSwKKyAgICBRVE1GTExEKC02Ljc5NTU1MTc3NjllLTAwMSksIFFUTUZMTEQoLTQuNjUxMjgzODQ1M2UtMDAzKSwKKyAgICBRVE1GTExEKC0xLjIyMjcxODEyODdlLTAwNCksIFFUTUZMTEQoLTkuMjIyMTMyMTUzOGUtMDAzKSwKKyAgICBRVE1GTExEKDguMTUyMzM5NjA3NWUtMDAzKSwgIFFUTUZMTEQoLTYuNTU1MzQ5MjMwOGUtMDAxKSwKKyAgICBRVE1GTExEKC0zLjU2OTk2ODA0NDhlLTAwMyksIFFUTUZMTEQoMS4zMDkwMDcyMDI1ZS0wMDQpLAorICAgIFFUTUZMTEQoLTguNjY5NTE3OTM0M2UtMDAzKSwgUVRNRkxMRCgyLjcxNDUxMDYzNDVlLTAwMiksCisgICAgUVRNRkxMRCgtNi4zMTAzMDQ0MDMzZS0wMDEpLCBRVE1GTExEKC0yLjYxODEwNzAxMzRlLTAwMyksCisgICAgUVRNRkxMRCgzLjkxMjg3Nzg3MzVlLTAwNCksICBRVE1GTExEKC03Ljk3NzM0OTY4MzZlLTAwMyksCisgICAgUVRNRkxMRCg0LjcxNjQ4NDk5MzdlLTAwMiksICBRVE1GTExEKC02LjA2MTMwMDAzOTNlLTAwMSksCisgICAgUVRNRkxMRCgtMS43OTA4ODcyMTA1ZS0wMDMpLCBRVE1GTExEKDYuNTc2MTkxNTE3NWUtMDA0KSwKKyAgICBRVE1GTExEKC03LjEzMzc5MTY4ODhlLTAwMyksIFFUTUZMTEQoNi44MTgxNTM3MDkyZS0wMDIpLAorICAgIFFUTUZMTEQoLTUuODA5MjgwODcyM2UtMDAxKSwgUVRNRkxMRCgtMS4wMTM1MDAxNTAzZS0wMDMpfTsKKworLyohCisgIFxuYW1lIFFNRgorICBcYnJpZWYgIFFNRi1UYWJsZQorICAgICAgICAgIDY0IGNoYW5uZWxzLCBOID0gNjQwLAorCisgIFRoZSBjb2VmZnMgYXJlIHJlYXJyYW5nZWQgY29tcGFyZWQgd2l0aCB0aGUgcmVmZXJlbmNlIGluIHRoZSBmb2xsb3dpbmcKKyAgd2F5OgorCisgIHFtZl82NFswXSAgID0gcW1mXzY0X3JlZmVyZW5jZVswXTsKKyAgcW1mXzY0WzFdICAgPSBxbWZfNjRfcmVmZXJlbmNlWzEyOF07CisgIHFtZl82NFsyXSAgID0gcW1mXzY0X3JlZmVyZW5jZVsyNTZdOworICBxbWZfNjRbM10gICA9IHFtZl82NF9yZWZlcmVuY2VbMzg0XTsKKyAgcW1mXzY0WzRdICAgPSBxbWZfNjRfcmVmZXJlbmNlWzUxMl07CisKKyAgcW1mXzY0WzVdICAgPSBxbWZfNjRfcmVmZXJlbmNlWzFdOworICBxbWZfNjRbNl0gICA9IHFtZl82NF9yZWZlcmVuY2VbMTI5XTsKKyAgcW1mXzY0WzddICAgPSBxbWZfNjRfcmVmZXJlbmNlWzI1N107CisgIHFtZl82NFs4XSAgID0gcW1mXzY0X3JlZmVyZW5jZVszODVdOworICBxbWZfNjRbOV0gICA9IHFtZl82NF9yZWZlcmVuY2VbNTEzXTsKKyAgLgorICAuCisgIC4KKyAgcW1mXzY0WzYzNV0gPSBxbWZfNjRfcmVmZXJlbmNlWzEyN10KKyAgcW1mXzY0WzYzNl0gPSBxbWZfNjRfcmVmZXJlbmNlWzI1NV07CisgIHFtZl82NFs2MzddID0gcW1mXzY0X3JlZmVyZW5jZVszODNdOworICBxbWZfNjRbNjM4XSA9IHFtZl82NF9yZWZlcmVuY2VbNTExXTsKKyAgcW1mXzY0WzYzOV0gPSBxbWZfNjRfcmVmZXJlbmNlWzYzOV07CisKKyAgVGhlIGZpbHRlciBvdXRwdXQgaXMgcmVxdWlyZWQgdG8gYmUgc2NhbGVkIGJ5IDEgYml0LgorCisgIFxzaG93aW5pdGlhbGl6ZXIKKyovCisvL0B7CitMTktfU0VDVElPTl9DT05TVERBVEFfTDEKK1JBTV9BTElHTgorY29uc3QgRklYUF9QRlQgcW1mX21wc2xkZmJfNjQwW1FNRjY0MF9NUFNMREZCX1BGVF9UQUJMRV9TSVpFXSA9IHsKKyAgICBRVE1GTExEKDkuMzg2MzAxMDk4OWUtMDA1KSwgIFFUTUZMTEQoLTguNzUzNjU4NjIxNmUtMDA0KSwKKyAgICBRVE1GTExEKDYuNDAxNjM0MzA5NGUtMDAzKSwgIFFUTUZMTEQoLTguNDU1MjgxNzA0N2UtMDAyKSwKKyAgICBRVE1GTExEKDUuNjE5NDQwMDc4N2UtMDAxKSwgIFFUTUZMTEQoMS4yMTY5MTQ5NzA0ZS0wMDQpLAorICAgIFFUTUZMTEQoLTEuMDE4NzEwMjAxNmUtMDAzKSwgUVRNRkxMRCg1Ljg1NTY1MzQzNTBlLTAwMyksCisgICAgUVRNRkxMRCgtOS41NzcxMTE4OTk5ZS0wMDIpLCBRVE1GTExEKDUuNDkxNDQwMjk2MmUtMDAxKSwKKyAgICBRVE1GTExEKDEuMjc5Mzc2NzM4MmUtMDA0KSwgIFFUTUZMTEQoLTEuMTYwNTMxMTg4NGUtMDAzKSwKKyAgICBRVE1GTExEKDUuMjY0OTc2NTI3NWUtMDAzKSwgIFFUTUZMTEQoLTEuMDcyMTY3MzA3MWUtMDAxKSwKKyAgICBRVE1GTExEKDUuMzYzMjE4MTg4M2UtMDAxKSwgIFFUTUZMTEQoMS4yNjY4ODYzOTI4ZS0wMDQpLAorICAgIFFUTUZMTEQoLTEuMzAxNzM1NjM5NmUtMDAzKSwgUVRNRkxMRCg0LjYyODY2NTI3OTZlLTAwMyksCisgICAgUVRNRkxMRCgtMS4xODg4Mzc5NjA0ZS0wMDEpLCBRVE1GTExEKDUuMjM0ODY1NTQ2MmUtMDAxKSwKKyAgICBRVE1GTExEKDEuMjI5NjU5MzkyM2UtMDA0KSwgIFFUTUZMTEQoLTEuNDQyNjM1MzE1NWUtMDAzKSwKKyAgICBRVE1GTExEKDMuOTQ1MzAxMjg2OWUtMDAzKSwgIFFUTUZMTEQoLTEuMzA3NjYyMTI5NGUtMDAxKSwKKyAgICBRVE1GTExEKDUuMTA2NDgzNjk3OWUtMDAxKSwgIFFUTUZMTEQoMS4xNTU4MjMxMTk5ZS0wMDQpLAorICAgIFFUTUZMTEQoLTEuNTgzMDA1MzAxN2UtMDAzKSwgUVRNRkxMRCgzLjIxMzYwNTM3NzhlLTAwMyksCisgICAgUVRNRkxMRCgtMS40Mjg1NzgzNDcwZS0wMDEpLCBRVE1GTExEKDQuOTc4MTc4MTQzNWUtMDAxKSwKKyAgICBRVE1GTExEKDEuMDU4Mjk4NTEyNGUtMDA0KSwgIFFUTUZMTEQoLTEuNzIyODUwNjA0MGUtMDAzKSwKKyAgICBRVE1GTExEKDIuNDMyMzY2NjAwM2UtMDAzKSwgIFFUTUZMTEQoLTEuNTUxNTE3NTQ2MmUtMDAxKSwKKyAgICBRVE1GTExEKDQuODUwMDM4MjkwMGUtMDAxKSwgIFFUTUZMTEQoOS40Mjk3NzY0MDA4ZS0wMDUpLAorICAgIFFUTUZMTEQoLTEuODYyMTYxMDk0M2UtMDAzKSwgUVRNRkxMRCgxLjYwMDQ0MDI0MjNlLTAwMyksCisgICAgUVRNRkxMRCgtMS42NzY0MTA1ODU2ZS0wMDEpLCBRVE1GTExEKDQuNzIyMTY2NjU3NGUtMDAxKSwKKyAgICBRVE1GTExEKDguMDUxNDU2ODI1M2UtMDA1KSwgIFFUTUZMTEQoLTIuMDAwODgxODI0NmUtMDAzKSwKKyAgICBRVE1GTExEKDcuMTY3MjY4Nzc3M2UtMDA0KSwgIFFUTUZMTEQoLTEuODAzMTg2MDg4OGUtMDAxKSwKKyAgICBRVE1GTExEKDQuNTk0NjU5NTA3M2UtMDAxKSwgIFFUTUZMTEQoNi41MTM3ODM1OTE4ZS0wMDUpLAorICAgIFFUTUZMTEQoLTIuMTM4NTg2NDgyMGUtMDAzKSwgUVRNRkxMRCgtMi4xOTk0NzQ2OTMwZS0wMDQpLAorICAgIFFUTUZMTEQoLTEuOTMxNzY1MjI4NWUtMDAxKSwgUVRNRkxMRCg0LjQ2NzYwODMzMjZlLTAwMSksCisgICAgUVRNRkxMRCg0LjgxMDEwNjQ3NDllLTAwNSksICBRVE1GTExEKC0yLjI3NTE5MDc4MThlLTAwMyksCisgICAgUVRNRkxMRCgtMS4yMTA0NTkyNzUyZS0wMDMpLCBRVE1GTExEKC0yLjA2MjA3MjAwODhlLTAwMSksCisgICAgUVRNRkxMRCg0LjM0MTEwOTA5NzBlLTAwMSksICBRVE1GTExEKDIuOTUxNDk2NzUzN2UtMDA1KSwKKyAgICBRVE1GTExEKC0yLjQxMDYxNzg4OThlLTAwMyksIFFUTUZMTEQoLTIuMjU1ODUwMDA1OWUtMDAzKSwKKyAgICBRVE1GTExEKC0yLjE5NDAyNTUxNjVlLTAwMSksIFFUTUZMTEQoNC4yMTUyNTA5MDkzZS0wMDEpLAorICAgIFFUTUZMTEQoOS44ODE0MTA3MzMyZS0wMDYpLCAgUVRNRkxMRCgtMi41NDQ4MzA3ODYxZS0wMDMpLAorICAgIFFUTUZMTEQoLTMuMzU2OTQ2ODY1MWUtMDAzKSwgUVRNRkxMRCgtMi4zMjc1NDAwNjk4ZS0wMDEpLAorICAgIFFUTUZMTEQoNC4wOTAxMjk0MzUxZS0wMDEpLCAgUVRNRkxMRCgtMS4wOTY4NjAyNTEwZS0wMDUpLAorICAgIFFUTUZMTEQoLTIuNjc3NzAzMDQzNGUtMDAzKSwgUVRNRkxMRCgtNC41MTQ1MDMyOTI3ZS0wMDMpLAorICAgIFFUTUZMTEQoLTIuNDYyNTMxNjI2MmUtMDAxKSwgUVRNRkxMRCgzLjk2NTgzMTEwMDllLTAwMSksCisgICAgUVRNRkxMRCgtMy4yNTU5MjU1NDg3ZS0wMDUpLCBRVE1GTExEKC0yLjgwOTE1MjAwNzFlLTAwMyksCisgICAgUVRNRkxMRCgtNS43MjkyMjU5Mjk4ZS0wMDMpLCBRVE1GTExEKC0yLjU5ODkwOTczNTdlLTAwMSksCisgICAgUVRNRkxMRCgzLjg0MjQ0NDQxOTllLTAwMSksICBRVE1GTExEKC01LjQ2Njk4NDI5MzllLTAwNSksCisgICAgUVRNRkxMRCgtMi45MzkxMzkwMjcxZS0wMDMpLCBRVE1GTExEKC03LjAwMTc4OTc1MjRlLTAwMyksCisgICAgUVRNRkxMRCgtMi43MzY1ODQ1NDQyZS0wMDEpLCBRVE1GTExEKDMuNzIwMDU2NzEyNmUtMDAxKSwKKyAgICBRVE1GTExEKC03Ljc1MDY1NjM2ODRlLTAwNSksIFFUTUZMTEQoLTMuMDY3NTI1ODAyMmUtMDAzKSwKKyAgICBRVE1GTExEKC04LjMzMjcwNTEyNTJlLTAwMyksIFFUTUZMTEQoLTIuODc1NDYyNDcyNGUtMDAxKSwKKyAgICBRVE1GTExEKDMuNTk4NzUyMzE5OGUtMDAxKSwgIFFUTUZMTEQoLTEuMDA1NzM3NDMxMWUtMDA0KSwKKyAgICBRVE1GTExEKC0zLjE5NDI1MDM5OTJlLTAwMyksIFFUTUZMTEQoLTkuNzIyNDA1MTEzM2UtMDAzKSwKKyAgICBRVE1GTExEKC0zLjAxNTQ0NzU1NzBlLTAwMSksIFFUTUZMTEQoMy40Nzg2MTQwOTE5ZS0wMDEpLAorICAgIFFUTUZMTEQoLTEuMjM2ODU1NzUwOWUtMDA0KSwgUVRNRkxMRCgtMy4zMTkyNTY0NzMzZS0wMDMpLAorICAgIFFUTUZMTEQoLTEuMTE3MTI1ODA1NWUtMDAyKSwgUVRNRkxMRCgtMy4xNTY0NDIwNDYyZS0wMDEpLAorICAgIFFUTUZMTEQoMy4zNTk3MjI3OTMxZS0wMDEpLCAgUVRNRkxMRCgtMS40NjY5NTM1NDQ5ZS0wMDQpLAorICAgIFFUTUZMTEQoLTMuNDQyNDkwMDA3N2UtMDAzKSwgUVRNRkxMRCgtMS4yNjc5NTU1NDUzZS0wMDIpLAorICAgIFFUTUZMTEQoLTMuMjk4MzQ2Njk4M2UtMDAxKSwgUVRNRkxMRCgzLjI0MjE1NzEwMTZlLTAwMSksCisgICAgUVRNRkxMRCgtMS42OTI4NTE4MDE2ZS0wMDQpLCBRVE1GTExEKC0zLjU2MzkxNDkxMzdlLTAwMyksCisgICAgUVRNRkxMRCgtMS40MjQ3NTA3Nzg4ZS0wMDIpLCBRVE1GTExEKC0zLjQ0MTA2MDc4MTVlLTAwMSksCisgICAgUVRNRkxMRCgzLjEyNTk5NDgwMTVlLTAwMSksICBRVE1GTExEKC0xLjkxNjI2NDAwOTJlLTAwNCksCisgICAgUVRNRkxMRCgtMy42ODM0NTEwOTc1ZS0wMDMpLCBRVE1GTExEKC0xLjU4NzUxMTQxMjhlLTAwMiksCisgICAgUVRNRkxMRCgtMy41ODQ0Nzk5ODc2ZS0wMDEpLCBRVE1GTExEKDMuMDExMzA3NDE4M2UtMDAxKSwKKyAgICBRVE1GTExEKC0yLjEzNDU3NTE4ODRlLTAwNCksIFFUTUZMTEQoLTMuODAwOTk0NzE2NmUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjc1NjIzOTMwOTllLTAwMiksIFFUTUZMTEQoLTMuNzI4NDk3MDI4NGUtMDAxKSwKKyAgICBRVE1GTExEKDIuODk4MTY4MjY1OGUtMDAxKSwgIFFUTUZMTEQoLTIuMzQ0Nzg1MDI1M2UtMDA0KSwKKyAgICBRVE1GTExEKC0zLjkxNjU5NzQ1OTVlLTAwMyksIFFUTUZMTEQoLTEuOTMwOTI3NjcxNWUtMDAyKSwKKyAgICBRVE1GTExEKC0zLjg3MzAwODc4NzZlLTAwMSksIFFUTUZMTEQoMi43ODY2NDU1OTEzZS0wMDEpLAorICAgIFFUTUZMTEQoLTIuNTQ2MjY2NzY5MWUtMDA0KSwgUVRNRkxMRCgtNC4wMzAxNjUyNjI1ZS0wMDMpLAorICAgIFFUTUZMTEQoLTIuMTExNTQ1NzYzOWUtMDAyKSwgUVRNRkxMRCgtNC4wMTc5MDU4OTA5ZS0wMDEpLAorICAgIFFUTUZMTEQoMi42NzY4MDUyNTc4ZS0wMDEpLCAgUVRNRkxMRCgtMi43MzcxMjg1MjUwZS0wMDQpLAorICAgIFFUTUZMTEQoLTQuMTQxNjM0Nzk1OGUtMDAzKSwgUVRNRkxMRCgtMi4yOTgwNTg1Njk0ZS0wMDIpLAorICAgIFFUTUZMTEQoLTQuMTYzMDc3NDczNmUtMDAxKSwgUVRNRkxMRCgyLjU2ODcwOTU1MjNlLTAwMSksCisgICAgUVRNRkxMRCgtMi45MTY1ODA0MTUzZS0wMDQpLCBRVE1GTExEKC00LjI1MDk2NzQwOTVlLTAwMyksCisgICAgUVRNRkxMRCgtMi40OTA0MjE3NTcxZS0wMDIpLCBRVE1GTExEKC00LjMwODQxMjk2OTFlLTAwMSksCisgICAgUVRNRkxMRCgyLjQ2MjQxODgyNDRlLTAwMSksICBRVE1GTExEKC0zLjA4Mzc5NzM0NjNlLTAwNCksCisgICAgUVRNRkxMRCgtNC4zNTgxNTA1MzA2ZS0wMDMpLCBRVE1GTExEKC0yLjY4ODU3NTM0OTdlLTAwMiksCisgICAgUVRNRkxMRCgtNC40NTM4MDAzMjA2ZS0wMDEpLCBRVE1GTExEKDIuMzU3OTg5ODQ3N2UtMDAxKSwKKyAgICBRVE1GTExEKC0zLjIzNzgyMDM0NjhlLTAwNCksIFFUTUZMTEQoLTQuNDYzMTUxMDk3M2UtMDAzKSwKKyAgICBRVE1GTExEKC0yLjg5MjQ1MzAzNzJlLTAwMiksIFFUTUZMTEQoLTQuNTk5MTI1MDg3M2UtMDAxKSwKKyAgICBRVE1GTExEKDIuMjU1NDc1NTIxMWUtMDAxKSwgIFFUTUZMTEQoLTMuMzc4ODEwNjUyMWUtMDA0KSwKKyAgICBRVE1GTExEKC00LjU2NTk0NTgyNjVlLTAwMyksIFFUTUZMTEQoLTMuMTAxOTcxMTg2N2UtMDAyKSwKKyAgICBRVE1GTExEKC00Ljc0NDI3NDYxNjJlLTAwMSksIFFUTUZMTEQoMi4xNTQ5MjU5MTI2ZS0wMDEpLAorICAgIFFUTUZMTEQoLTMuNTA1MzQwMTM3MWUtMDA0KSwgUVRNRkxMRCgtNC42NjY0Njk1MjU1ZS0wMDMpLAorICAgIFFUTUZMTEQoLTMuMzE3MDM1MzYyMWUtMDAyKSwgUVRNRkxMRCgtNC44ODkxMzIwODI1ZS0wMDEpLAorICAgIFFUTUZMTEQoMi4wNTYzODYzMjE4ZS0wMDEpLCAgUVRNRkxMRCgtMy42MTc1NDkzNzMzZS0wMDQpLAorICAgIFFUTUZMTEQoLTQuNzY0NzIwNzk3NWUtMDAzKSwgUVRNRkxMRCgtMy41Mzc1NDM4NjMxZS0wMDIpLAorICAgIFFUTUZMTEQoLTUuMDMzNTgzMDQ1MGUtMDAxKSwgUVRNRkxMRCgxLjk1OTkwMjE5NzFlLTAwMSksCisgICAgUVRNRkxMRCgtMy43MTU5NzE4MzQwZS0wMDQpLCBRVE1GTExEKC00Ljg2MDU4ODgxNTFlLTAwMyksCisgICAgUVRNRkxMRCgtMy43NjMzNzEzMzM1ZS0wMDIpLCBRVE1GTExEKC01LjE3NzUwOTc4NDdlLTAwMSksCisgICAgUVRNRkxMRCgxLjg2NTUxMTM4NzZlLTAwMSksICBRVE1GTExEKC0zLjc5OTk5MzcxOTRlLTAwNCksCisgICAgUVRNRkxMRCgtNC45NTQwMDgzODU1ZS0wMDMpLCBRVE1GTExEKC0zLjk5NDM4NDc4MDVlLTAwMiksCisgICAgUVRNRkxMRCgtNS4zMjA3OTU3NzQ1ZS0wMDEpLCBRVE1GTExEKDEuNzczMjUwNDAxMGUtMDAxKSwKKyAgICBRVE1GTExEKC0zLjg3MDU2MTc3NzFlLTAwNCksIFFUTUZMTEQoLTUuMDQ1MDQ2NTY0MmUtMDAzKSwKKyAgICBRVE1GTExEKC00LjIzMDQzODE3MjhlLTAwMiksIFFUTUZMTEQoLTUuNDYzMzIyNDAxMGUtMDAxKSwKKyAgICBRVE1GTExEKDEuNjgzMTUxNTcyOWUtMDAxKSwgIFFUTUZMTEQoLTMuOTI4MTg2MTk3M2UtMDA0KSwKKyAgICBRVE1GTExEKC01LjEzMzYyMzI1NzNlLTAwMyksIFFUTUZMTEQoLTQuNDcxMzYzODcyM2UtMDAyKSwKKyAgICBRVE1GTExEKC01LjYwNDk3MzQzNTRlLTAwMSksIFFUTUZMTEQoMS41OTUyNDM1MTM2ZS0wMDEpLAorICAgIFFUTUZMTEQoLTMuOTczNzY5NDg5N2UtMDA0KSwgUVRNRkxMRCgtNS4yMTk3Mzk4NjE4ZS0wMDMpLAorICAgIFFUTUZMTEQoLTQuNzE3MDIzMjk4MWUtMDAyKSwgUVRNRkxMRCgtNS43NDU2MzAyNjQzZS0wMDEpLAorICAgIFFUTUZMTEQoMS41MDk1NTAzNjI4ZS0wMDEpLCAgUVRNRkxMRCgtNC4wMDg4MTA3OTI2ZS0wMDQpLAorICAgIFFUTUZMTEQoLTUuMzAzMzM3MjM4N2UtMDAzKSwgUVRNRkxMRCgtNC45NjcyMTM3OTQ2ZS0wMDIpLAorICAgIFFUTUZMTEQoLTUuODg1MTc2NjU4NmUtMDAxKSwgUVRNRkxMRCgxLjQyNjA5MTA0NTFlLTAwMSksCisgICAgUVRNRkxMRCgtNC4wMzM4MzgzNDA1ZS0wMDQpLCBRVE1GTExEKC01LjM4NDM5NjI5NjBlLTAwMyksCisgICAgUVRNRkxMRCgtNS4yMjE3Mzc5MjEyZS0wMDIpLCBRVE1GTExEKC02LjAyMzQ5MzQwOTJlLTAwMSksCisgICAgUVRNRkxMRCgxLjM0NDg4NTUyODFlLTAwMSksICBRVE1GTExEKC00LjA1MDU1NTU4MDhlLTAwNCksCisgICAgUVRNRkxMRCgtNS40NjI5NjMxMzQxZS0wMDMpLCBRVE1GTExEKC01LjQ4MDM4Mjk2NDBlLTAwMiksCisgICAgUVRNRkxMRCgtNi4xNjA0NjQyODY4ZS0wMDEpLCBRVE1GTExEKDEuMjY1OTQ3NTIwN2UtMDAxKSwKKyAgICBRVE1GTExEKC00LjA2MTQ4ODE0MzZlLTAwNCksIFFUTUZMTEQoLTUuNTM4OTU4MTI0OGUtMDAzKSwKKyAgICBRVE1GTExEKC01Ljc0MjkxOTgxNzZlLTAwMiksIFFUTUZMTEQoLTYuMjk1OTczNjU4NmUtMDAxKSwKKyAgICBRVE1GTExEKDEuMTg5Mjg0MjUwMWUtMDAxKSwgIFFUTUZMTEQoLTQuMDY3NjA3NTE1MGUtMDA0KSwKKyAgICBRVE1GTExEKC01LjYxMjM3NjE0NjBlLTAwMyksIFFUTUZMTEQoLTYuMDA5MDkxNDM2OWUtMDAyKSwKKyAgICBRVE1GTExEKC02LjQyOTkwNDY5OTNlLTAwMSksIFFUTUZMTEQoMS4xMTQ5MDA3ODI3ZS0wMDEpLAorICAgIFFUTUZMTEQoLTQuMDcwOTMzMjA5N2UtMDA0KSwgUVRNRkxMRCgtNS42ODMyMzExNjc1ZS0wMDMpLAorICAgIFFUTUZMTEQoLTYuMjc4NjU4NjU4M2UtMDAyKSwgUVRNRkxMRCgtNi41NjIxNDI5NjgyZS0wMDEpLAorICAgIFFUTUZMTEQoMS4wNDI4MDQwNDc1ZS0wMDEpLCAgUVRNRkxMRCgtNC4wNzMyNTQ1MzEyZS0wMDQpLAorICAgIFFUTUZMTEQoLTUuNzUxNTM2NjkzNGUtMDAzKSwgUVRNRkxMRCgtNi41NTEzNDA5Njc0ZS0wMDIpLAorICAgIFFUTUZMTEQoLTYuNjkyNTczNDI4MmUtMDAxKSwgUVRNRkxMRCg5LjcyOTg4OTc4MDNlLTAwMiksCisgICAgUVRNRkxMRCgtNC4wNzcwODA4MTE4ZS0wMDQpLCBRVE1GTExEKC01LjgxNzI4NjIwNDVlLTAwMyksCisgICAgUVRNRkxMRCgtNi44MjY4NDcwNDY2ZS0wMDIpLCBRVE1GTExEKC02LjgyMTA4MzQyNjVlLTAwMSksCisgICAgUVRNRkxMRCg5LjA1NDUxNjI1NTllLTAwMiksICBRVE1GTExEKC00LjA4NTQ2NjQ5ODVlLTAwNCksCisgICAgUVRNRkxMRCgtNS44ODA0OTU5OTkwZS0wMDMpLCBRVE1GTExEKC03LjEwNDg2Njk1MTdlLTAwMiksCisgICAgUVRNRkxMRCgtNi45NDc1NjE1MDI1ZS0wMDEpLCBRVE1GTExEKDguNDAxNzk0NzMxNmUtMDAyKSwKKyAgICBRVE1GTExEKC00LjEwMDIyNDE3NzhlLTAwNCksIFFUTUZMTEQoLTUuOTQxMjExNzExNmUtMDAzKSwKKyAgICBRVE1GTExEKC03LjM4NTA5MjIyODdlLTAwMiksIFFUTUZMTEQoLTcuMDcxODk1NTk5NGUtMDAxKSwKKyAgICBRVE1GTExEKDcuNzcxNjU2NjYyMmUtMDAyKSwgIFFUTUZMTEQoLTQuMTIzOTU4NjQyNmUtMDA0KSwKKyAgICBRVE1GTExEKC01Ljk5OTQ3Mzg1NDllLTAwMyksIFFUTUZMTEQoLTcuNjY3MTc3OTE1NmUtMDAyKSwKKyAgICBRVE1GTExEKC03LjE5Mzk3OTYyMDllLTAwMSksIFFUTUZMTEQoNy4xNjM5NTA4MDA5ZS0wMDIpLAorICAgIFFUTUZMTEQoLTQuMTU5NDM3MDg1MGUtMDA0KSwgUVRNRkxMRCgtNi4wNTUzNTUwNzIwZS0wMDMpLAorICAgIFFUTUZMTEQoLTcuOTUwNzkwMjI2NWUtMDAyKSwgUVRNRkxMRCgtNy4zMTM3MDUwODY3ZS0wMDEpLAorICAgIFFUTUZMTEQoNi41Nzg0MTQ4ODcyZS0wMDIpLCAgUVRNRkxMRCgtNC4yMDgzMzM1NTc1ZS0wMDQpLAorICAgIFFUTUZMTEQoLTYuMTA4OTAyMzk0OGUtMDAzKSwgUVRNRkxMRCgtOC4yMzU1NjI1OTI3ZS0wMDIpLAorICAgIFFUTUZMTEQoLTcuNDMwOTY3Njg4NmUtMDAxKSwgUVRNRkxMRCg2LjAxNDgzNTQ2MjBlLTAwMiksCisgICAgUVRNRkxMRCgtNC4yNzMyNDc2MTQwZS0wMDQpLCBRVE1GTExEKC02LjE2MDIxNTk0MDNlLTAwMyksCisgICAgUVRNRkxMRCgtOC41MjExMDc1ODQyZS0wMDIpLCBRVE1GTExEKC03LjU0NTY2MzcxNDRlLTAwMSksCisgICAgUVRNRkxMRCg1LjQ3MzAyNjYzMzNlLTAwMiksICBRVE1GTExEKC00LjM1NjM3NzE3NjBlLTAwNCksCisgICAgUVRNRkxMRCgtNi4yMDkzNzIwNzcxZS0wMDMpLCBRVE1GTExEKC04LjgwNzA1MTE4MThlLTAwMiksCisgICAgUVRNRkxMRCgtNy42NTc2OTI0MzI0ZS0wMDEpLCBRVE1GTExEKDQuOTUyNjI1OTMwM2UtMDAyKSwKKyAgICBRVE1GTExEKC00LjQ2MDAzNTk5NzllLTAwNCksIFFUTUZMTEQoLTYuMjU2NTQyNjM0MmUtMDAzKSwKKyAgICBRVE1GTExEKC05LjA5Mjk3MDE5MjRlLTAwMiksIFFUTUZMTEQoLTcuNzY2OTU2Njg3MGUtMDAxKSwKKyAgICBRVE1GTExEKDQuNDUzMzA4MTM1M2UtMDAyKSwgIFFUTUZMTEQoLTQuNTg1ODcxNjQ3NmUtMDA0KSwKKyAgICBRVE1GTExEKC02LjMwMTc2NjcyNzFlLTAwMyksIFFUTUZMTEQoLTkuMzc4NDU0ODM0MmUtMDAyKSwKKyAgICBRVE1GTExEKC03Ljg3MzM2MDUxNDZlLTAwMSksIFFUTUZMTEQoMy45NzQ2NzUwMTQ2ZS0wMDIpLAorICAgIFFUTUZMTEQoLTQuNzM0NTg3NTY0NmUtMDA0KSwgUVRNRkxMRCgtNi4zNDUyNjIyODUzZS0wMDMpLAorICAgIFFUTUZMTEQoLTkuNjYzMDY5MjQ4MmUtMDAyKSwgUVRNRkxMRCgtNy45NzY4MDk3NDAxZS0wMDEpLAorICAgIFFUTUZMTEQoMy41MTYzOTEyOTIyZS0wMDIpLCAgUVRNRkxMRCgtNC45MDc2Njg5MTc0ZS0wMDQpLAorICAgIFFUTUZMTEQoLTYuMzg3MTI0MzAzN2UtMDAzKSwgUVRNRkxMRCgtOS45NDYzNjcxNDQ2ZS0wMDIpLAorICAgIFFUTUZMTEQoLTguMDc3MjE0OTU2M2UtMDAxKSwgUVRNRkxMRCgzLjA3ODA4Nzc5MThlLTAwMiksCisgICAgUVRNRkxMRCgtNS4xMDY3MTExNzgxZS0wMDQpLCBRVE1GTExEKC02LjQyNzU1Njc0MjBlLTAwMyksCisgICAgUVRNRkxMRCgtMS4wMjI3ODkxODAzZS0wMDEpLCBRVE1GTExEKC04LjE3NDQ5MTUyNDdlLTAwMSksCisgICAgUVRNRkxMRCgyLjY1OTA2MTU1MTFlLTAwMiksICBRVE1GTExEKC01LjMzMjYyMzI1OTJlLTAwNCksCisgICAgUVRNRkxMRCgtNi40NjY2OTA0NTA5ZS0wMDMpLCBRVE1GTExEKC0xLjA1MDcxNjExNzBlLTAwMSksCisgICAgUVRNRkxMRCgtOC4yNjg1NTQ4MDY3ZS0wMDEpLCBRVE1GTExEKDIuMjU4ODk5MjQ5MWUtMDAyKSwKKyAgICBRVE1GTExEKC01LjU4NTU2NDY0OTdlLTAwNCksIFFUTUZMTEQoLTYuNTA0NzI5MzkwMWUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjA3ODM2OTE3MDRlLTAwMSksIFFUTUZMTEQoLTguMzU5MzIyNTQ3OWUtMDAxKSwKKyAgICBRVE1GTExEKDEuODc3MjY0ODY0N2UtMDAyKSwgIFFUTUZMTEQoLTUuODY0MDIzNjk2NmUtMDA0KSwKKyAgICBRVE1GTExEKC02LjU0MTg2NTQxMjFlLTAwMyksIFFUTUZMTEQoLTEuMTA1Njk4Nzk0MWUtMDAxKSwKKyAgICBRVE1GTExEKC04LjQ0NjcyMzIyMjdlLTAwMSksIFFUTUZMTEQoMS41MTMxNjY4MTg4ZS0wMDIpLAorICAgIFFUTUZMTEQoLTYuMTY5MjY1MjUyNWUtMDA0KSwgUVRNRkxMRCgtNi41NzgzMjA2MzczZS0wMDMpLAorICAgIFFUTUZMTEQoLTEuMTMyNjU0Mzk4N2UtMDAxKSwgUVRNRkxMRCgtOC41MzA2ODQxMTM1ZS0wMDEpLAorICAgIFFUTUZMTEQoMS4xNjYxMTg0OTUyZS0wMDIpLCAgUVRNRkxMRCgtNi40OTk0OTMwMjkwZS0wMDQpLAorICAgIFFUTUZMTEQoLTYuNjE0MzU0NDM5MWUtMDAzKSwgUVRNRkxMRCgtMS4xNTkxODQ0MjYxZS0wMDEpLAorICAgIFFUTUZMTEQoLTguNjExMTQwMjUxMmUtMDAxKSwgUVRNRkxMRCg4LjM1MDk2NDYzNTZlLTAwMyksCisgICAgUVRNRkxMRCgtNi44NDk0MzI4Mjk4ZS0wMDQpLCBRVE1GTExEKC02LjY1MDIyODUxOTBlLTAwMyksCisgICAgUVRNRkxMRCgtMS4xODUyMzcxNjkzZS0wMDEpLCBRVE1GTExEKC04LjY4ODA0Mzk1MjBlLTAwMSksCisgICAgUVRNRkxMRCg1LjE4MzI5NDg4MTFlLTAwMyksICBRVE1GTExEKC03LjI0MDQ1Mzg1MTRlLTAwNCksCisgICAgUVRNRkxMRCgtNi42ODYxNDA3ODMxZS0wMDMpLCBRVE1GTExEKC0xLjIxMDc1NTcwNThlLTAwMSksCisgICAgUVRNRkxMRCgtOC43NjEyNTk5MTM0ZS0wMDEpLCBRVE1GTExEKDIuMjEwMzE1MzE2OWUtMDAzKSwKKyAgICBRVE1GTExEKC03LjcwNjExNDU1NjZlLTAwNCksIFFUTUZMTEQoLTYuNzIyMTI2MTU2MWUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjIzNTY4MDgwMzdlLTAwMSksIFFUTUZMTEQoLTguODMwNTgyNDk5NWUtMDAxKSwKKyAgICBRVE1GTExEKC00LjY4NTU4MDc4ODZlLTAwNCksIFFUTUZMTEQoLTguMjE1ODA0MTE4N2UtMDA0KSwKKyAgICBRVE1GTExEKC02Ljc1ODQ3NjYwNzVlLTAwMyksIFFUTUZMTEQoLTEuMjU5OTUyMTg3NWUtMDAxKSwKKyAgICBRVE1GTExEKC04Ljg5NTg4MjM2ODFlLTAwMSksIFFUTUZMTEQoLTIuODAwMzM0MDEyMWUtMDAzKSwKKyAgICBRVE1GTExEKC04Ljc0OTgxMDUxMzFlLTAwNCksIFFUTUZMTEQoLTYuNzk1Nzg2MzIxMmUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjI4MzUyMDQ2MDFlLTAwMSksIFFUTUZMTEQoLTguOTU3Mjk1NDE3OGUtMDAxKSwKKyAgICBRVE1GTExEKC00LjkyOTM3ODYyODdlLTAwMyksIFFUTUZMTEQoLTkuMjkwMjgxNDUwNGUtMDA0KSwKKyAgICBRVE1GTExEKC02LjgzNDQ0MzE5MjllLTAwMyksIFFUTUZMTEQoLTEuMzA2MzMxMTU3N2UtMDAxKSwKKyAgICBRVE1GTExEKC05LjAxNDg1ODYwMzVlLTAwMSksIFFUTUZMTEQoLTYuOTI3MzI5NTgxMmUtMDAzKSwKKyAgICBRVE1GTExEKC05LjgzODM0NjE1OTFlLTAwNCksIFFUTUZMTEQoLTYuODc0NjIzNzA4NGUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjMyODMyMzkzMDVlLTAwMSksIFFUTUZMTEQoLTkuMDY4NTAzMzc5OGUtMDAxKSwKKyAgICBRVE1GTExEKC04Ljc4NTc0NjA2MDNlLTAwMyksIFFUTUZMTEQoLTEuMDM5NTUzODk5M2UtMDAzKSwKKyAgICBRVE1GTExEKC02LjkxNjU1NDY0NDdlLTAwMyksIFFUTUZMTEQoLTEuMzQ5NDM3NjgzOGUtMDAxKSwKKyAgICBRVE1GTExEKC05LjExODE4MDI3NTBlLTAwMSksIFFUTUZMTEQoLTEuMDUwNzU1MTk1M2UtMDAyKSwKKyAgICBRVE1GTExEKC0xLjA5NTk2MjAxMjJlLTAwMyksIFFUTUZMTEQoLTYuOTYwNDUxMTM3M2UtMDAzKSwKKyAgICBRVE1GTExEKC0xLjM2OTYxMjA2NzllLTAwMSksIFFUTUZMTEQoLTkuMTYzODU2NTA2M2UtMDAxKSwKKyAgICBRVE1GTExEKC0xLjIxMDM3MDI4NzNlLTAwMiksIFFUTUZMTEQoLTEuMTUzMDI1MDc3N2UtMDAzKSwKKyAgICBRVE1GTExEKC03LjAwNjU5MTY1MTZlLTAwMyksIFFUTUZMTEQoLTEuMzg4Nzg1OTg4MWUtMDAxKSwKKyAgICBRVE1GTExEKC05LjIwNTQ4Nzk2NjVlLTAwMSksIFFUTUZMTEQoLTEuMzU3NDE5Nzg4OGUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjIxMDU5NjY0NTNlLTAwMyksIFFUTUZMTEQoLTcuMDU1MjQ5NTMwOGUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjQwNjg5Njg1OTRlLTAwMSksIFFUTUZMTEQoLTkuMjQzMDQwNjgwOWUtMDAxKSwKKyAgICBRVE1GTExEKC0xLjQ5MjMzNTgzMzZlLTAwMiksIFFUTUZMTEQoLTEuMjY4MTg0Mjc4MmUtMDAzKSwKKyAgICBRVE1GTExEKC03LjEwNjYwMDMyOTNlLTAwMyksIFFUTUZMTEQoLTEuNDIzODg0MTgzMmUtMDAxKSwKKyAgICBRVE1GTExEKC05LjI3NjQ4NzgyNzNlLTAwMSksIFFUTUZMTEQoLTEuNjE1NjQ4NTMwNGUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjMyNTY0MjkyMjllLTAwMyksIFFUTUZMTEQoLTcuMTYwODQzMzUwMGUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjQzOTY4NTk3MDVlLTAwMSksIFFUTUZMTEQoLTkuMzA1ODAzMTc5N2UtMDAxKSwKKyAgICBRVE1GTExEKC0xLjcyNzcxMTc4MTllLTAwMiksIFFUTUZMTEQoLTEuMzgyNzYzODQ2OGUtMDAzKSwKKyAgICBRVE1GTExEKC03LjIxODIwNjMwMTNlLTAwMyksIFFUTUZMTEQoLTEuNDU0MjM5MTg5NmUtMDAxKSwKKyAgICBRVE1GTExEKC05LjMzMDk2NjQ3MjZlLTAwMSksIFFUTUZMTEQoLTEuODI4OTM2MTE0OWUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjQzOTE5MDU4NjFlLTAwMyksIFFUTUZMTEQoLTcuMjc4OTE4NzU0M2UtMDAzKSwKKyAgICBRVE1GTExEKC0xLjQ2NzQ4MTg1MTZlLTAwMSksIFFUTUZMTEQoLTkuMzUxOTYxMDE2N2UtMDAxKSwKKyAgICBRVE1GTExEKC0xLjkxOTU2NjI4MTFlLTAwMiksIFFUTUZMTEQoLTEuNDk0NzA5NzUxNmUtMDAzKSwKKyAgICBRVE1GTExEKC03LjM0MzA4NDA4NTdlLTAwMyksIFFUTUZMTEQoLTEuNDc5MzUyMTE2NmUtMDAxKSwKKyAgICBRVE1GTExEKC05LjM2ODc3MzEwMjhlLTAwMSksIFFUTUZMTEQoLTEuOTk5OTgxMzI4OGUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjU0ODk1NDA1MjllLTAwMyksIFFUTUZMTEQoLTcuNDEwODgyNTA2NWUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjQ4OTc4NzEwMTdlLTAwMSksIFFUTUZMTEQoLTkuMzgxMzk3OTYyNmUtMDAxKSwKKyAgICBRVE1GTExEKC0yLjA3MDYxNDg4MThlLTAwMiksIFFUTUZMTEQoLTEuNjAxNjkwODkyMWUtMDAzKSwKKyAgICBRVE1GTExEKC03LjQ4MjM2MTUxNDFlLTAwMyksIFFUTUZMTEQoLTEuNDk4NzI2MDEwM2UtMDAxKSwKKyAgICBRVE1GTExEKC05LjM4OTgyOTAzOTZlLTAwMSksIFFUTUZMTEQoLTIuMTMxNjkxOTQ3NmUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjY1MjY4OTQxNzhlLTAwMyksIFFUTUZMTEQoLTcuNTU3NjkyNDcxOWUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjUwNjEwNTk1OTRlLTAwMSksIFFUTUZMTEQoLTkuMzk0MDY4MTIxOWUtMDAxKSwKKyAgICBRVE1GTExEKC0yLjE4MzUxODc0NTBlLTAwMiksIFFUTUZMTEQoLTEuNzAxNTQxMDEyMmUtMDAzKSwKKyAgICBRVE1GTExEKC03LjYzNjg5OTEyODZlLTAwMyksIFFUTUZMTEQoLTEuNTExODY2NzQ4M2UtMDAxKSwKKyAgICBRVE1GTExEKC05LjM5NDEyMTE3MDBlLTAwMSksIFFUTUZMTEQoLTIuMjI2NDQ0MzMzOGUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjc0Nzk3ODczNDhlLTAwMyksIFFUTUZMTEQoLTcuNzIwMDA1MjMyOGUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjUxNTk0NzcyOTNlLTAwMSksIFFUTUZMTEQoLTkuMzg5OTk3MTI0N2UtMDAxKSwKKyAgICBRVE1GTExEKC0yLjI2MDc5MDc2NTNlLTAwMiksIFFUTUZMTEQoLTEuNzkxNzU2NzE2NmUtMDAzKSwKKyAgICBRVE1GTExEKC03LjgwNjk3OTExOThlLTAwMyksIFFUTUZMTEQoLTEuNTE4Mjg5MTQ4OGUtMDAxKSwKKyAgICBRVE1GTExEKC05LjM4MTcwOTY5NDllLTAwMSksIFFUTUZMTEQoLTIuMjg2ODY0NDQ0NmUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjgzMjUyMDAwNzJlLTAwMyksIFFUTUZMTEQoLTcuODk3Nzg3NzI3NGUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjUxODgzMTk5ODFlLTAwMSksIFFUTUZMTEQoLTkuMzY5Mjc4NTUwMWUtMDAxKSwKKyAgICBRVE1GTExEKC0yLjMwNDkxODMxOTBlLTAwMiksIFFUTUZMTEQoLTEuODcwMDcyMjEzOWUtMDAzKSwKKyAgICBRVE1GTExEKC03Ljk5MjM0MDI1MThlLTAwMyksIFFUTUZMTEQoLTEuNTE3NTE3NTY2N2UtMDAxKSwKKyAgICBRVE1GTExEKC05LjM1MjcyNDU1MjJlLTAwMSksIFFUTUZMTEQoLTIuMzE1Mjk3NzIyOGUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjkwNDEyMzU3OTJlLTAwMyksIFFUTUZMTEQoLTguMDkwNTU4NDYxOGUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjUxNDI4OTA4MTFlLTAwMSksIFFUTUZMTEQoLTkuMzMyMDc1MTE5MGUtMDAxKSwKKyAgICBRVE1GTExEKC0yLjMxODM1MjQ2MDllLTAwMiksIFFUTUZMTEQoLTEuOTM0NDA3ODYxMGUtMDAzKSwKKyAgICBRVE1GTExEKC04LjE5MjE4MTU4NzJlLTAwMyksIFFUTUZMTEQoLTEuNTA5MDg5MDIyOWUtMDAxKSwKKyAgICBRVE1GTExEKC05LjMwNzM2MjQzNzJlLTAwMSksIFFUTUZMTEQoLTIuMzE0MzQ0NzkzNmUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjk2MDY5Mzg1ODZlLTAwMyksIFFUTUZMTEQoLTguMjk3MDQ1NzE1MmUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjUwMTg2Mjg1MzhlLTAwMSksIFFUTUZMTEQoLTkuMjc4NjE5Mjg5NGUtMDAxKSwKKyAgICBRVE1GTExEKC0yLjMwMzU4OTUwNzllLTAwMiksIFFUTUZMTEQoLTEuOTgyNjg3MDQxMmUtMDAzKSwKKyAgICBRVE1GTExEKC04LjQwNDgzNTEyNzNlLTAwMyksIFFUTUZMTEQoLTEuNDkyNTU2MTg0NWUtMDAxKSwKKyAgICBRVE1GTExEKC05LjI0NTg4NjIwNjZlLTAwMSksIFFUTUZMTEQoLTIuMjg2NDE2NDc4NWUtMDAyKSwKKyAgICBRVE1GTExEKC0yLjAwMDIxMjY2OTRlLTAwMyksIFFUTUZMTEQoLTguNTE1MjM1OTY3OWUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjQ4MTExNzAxMDFlLTAwMSksIFFUTUZMTEQoLTkuMjA5MjA0MzE2MWUtMDAxKSwKKyAgICBRVE1GTExEKC0yLjI2MzE3MDg1MzNlLTAwMiksIFFUTUZMTEQoLTIuMDEzMTExNzE5OWUtMDAzKSwKKyAgICBRVE1GTExEKC04LjYyNzkxNzYxNzZlLTAwMyksIFFUTUZMTEQoLTEuNDY3NDk0MDcwNWUtMDAxKSwKKyAgICBRVE1GTExEKC05LjE2ODYyMTMwMTdlLTAwMSksIFFUTUZMTEQoLTIuMjM0MTY5MDk1OGUtMDAyKSwKKyAgICBRVE1GTExEKC0yLjAyMTE1NjcxNzFlLTAwMyksIFFUTUZMTEQoLTguNzQyNTQ3NTk0MGUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjQ1MTYzNjI1NDhlLTAwMSksIFFUTUZMTEQoLTkuMTI0MTg3MjMxMWUtMDAxKSwKKyAgICBRVE1GTExEKC0yLjE5OTY5NjE5MDdlLTAwMiksIFFUTUZMTEQoLTIuMDI0MjU0NzYxNmUtMDAzKSwKKyAgICBRVE1GTExEKC04Ljg1ODU2NDMwOThlLTAwMyksIFFUTUZMTEQoLTEuNDMzNDk3NjY3M2UtMDAxKSwKKyAgICBRVE1GTExEKC05LjA3NTk1NTc0ODZlLTAwMSksIFFUTUZMTEQoLTIuMTYwMTMwODEzN2UtMDAyKSwKKyAgICBRVE1GTExEKC0yLjAyMjE4OTMyMTBlLTAwMyksIFFUTUZMTEQoLTguOTc1NTAzOTY2MmUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjQxMzAzMDMyNjRlLTAwMSksIFFUTUZMTEQoLTkuMDIzOTg1MjY2N2UtMDAxKSwKKyAgICBRVE1GTExEKC0yLjExNTgxNDc2MDNlLTAwMiksIFFUTUZMTEQoLTIuMDE0OTE2MzkwMmUtMDAzKSwKKyAgICBRVE1GTExEKC05LjA5MjcyOTUzODdlLTAwMyksIFFUTUZMTEQoLTEuMzkwMTkwODY5NmUtMDAxKSwKKyAgICBRVE1GTExEKC04Ljk2ODMzNzE3ODJlLTAwMSksIFFUTUZMTEQoLTIuMDY3MDYxNjk5OWUtMDAyKSwKKyAgICBRVE1GTExEKC0yLjAwMjI4ODgyMDJlLTAwMyksIFFUTUZMTEQoLTkuMjA5NTcxNDA2MmUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjM2NDkzNjUzMDZlLTAwMSksIFFUTUZMTEQoLTguOTA5MDcxNjgzOWUtMDAxKSwKKyAgICBRVE1GTExEKC0yLjAxNDIxMzI0MTZlLTAwMiksIFFUTUZMTEQoLTEuOTg0MTc4NTU0M2UtMDAzKSwKKyAgICBRVE1GTExEKC05LjMyNTMxMTUxOTJlLTAwMyksIFFUTUZMTEQoLTEuMzM3MjI2NjI5M2UtMDAxKSwKKyAgICBRVE1GTExEKC04Ljg0NjI1NzkyNTBlLTAwMSksIFFUTUZMTEQoLTEuOTU3NjA1Nzc5MmUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjk2MDYyNzAzNjJlLTAwMyksIFFUTUZMTEQoLTkuNDM5MjQwMjA5OGUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjMwNzAyMTk3NTVlLTAwMSksIFFUTUZMTEQoLTguNzc5OTY1MDQzMWUtMDAxKSwKKyAgICBRVE1GTExEKC0xLjg5NzYxMjU4NjZlLTAwMiksIFFUTUZMTEQoLTEuOTMxNTg1OTUzNmUtMDAzKSwKKyAgICBRVE1GTExEKC05LjU1MDUwNjI0OTFlLTAwMyksIFFUTUZMTEQoLTEuMjc0Mjg2NTA4NmUtMDAxKSwKKyAgICBRVE1GTExEKC04LjcxMDI2NjM1MTdlLTAwMSksIFFUTUZMTEQoLTEuODM0NTY4MDA4OGUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjg5NzAyODk5NjZlLTAwMyksIFFUTUZMTEQoLTkuNjU4MzM1NzA4MWUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjIzODk4NjEwNDdlLTAwMSksIFFUTUZMTEQoLTguNjM3MjM5OTMzMGUtMDAxKSwKKyAgICBRVE1GTExEKC0xLjc2ODc3MDYyNzdlLTAwMiksIFFUTUZMTEQoLTEuODU2OTgxNTQzOGUtMDAzKSwKKyAgICBRVE1GTExEKC05Ljc2MTY5MDE2MjFlLTAwMyksIFFUTUZMTEQoLTEuMjAxMDg5OTkzMWUtMDAxKSwKKyAgICBRVE1GTExEKC04LjU2MDk2MzI3MzBlLTAwMSksIFFUTUZMTEQoLTEuNzAwNjE0MDIwMmUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjgxMTQ1ODcyOTJlLTAwMyksIFFUTUZMTEQoLTkuODU5NzM1MTQ2MmUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjE2MDU2NTU0MDJlLTAwMSksIFFUTUZMTEQoLTguNDgxNTE5ODE4M2UtMDAxKSwKKyAgICBRVE1GTExEKC0xLjYzMDQzNjgxNTNlLTAwMiksIFFUTUZMTEQoLTEuNzYwNTE0MzM2NmUtMDAzKSwKKyAgICBRVE1GTExEKC05Ljk1MTU2NDQ4MzNlLTAwMyksIFFUTUZMTEQoLTEuMTE3MzkwOTE1OGUtMDAxKSwKKyAgICBRVE1GTExEKC04LjM5ODk5MTgyMzJlLTAwMSksIFFUTUZMTEQoLTEuNTU4NTUwOTEyOWUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjcwNDIwMDI4NzNlLTAwMyksIFFUTUZMTEQoLTEuMDAzNjAyNjEyOGUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjA3MTUzNTg3MDRlLTAwMSksIFFUTUZMTEQoLTguMzEzNDY4Njk0N2UtMDAxKSwKKyAgICBRVE1GTExEKC0xLjQ4NTMxNjI2OTFlLTAwMiksIFFUTUZMTEQoLTEuNjQyNjMzNTc4N2UtMDAzKSwKKyAgICBRVE1GTExEKC0xLjAxMTE5NTIyMDFlLTAwMiksIFFUTUZMTEQoLTEuMDIyOTgzODYzOWUtMDAxKSwKKyAgICBRVE1GTExEKC04LjIyNTAzNjg1OTVlLTAwMSksIFFUTUZMTEQoLTEuNDExMDMzMTQyNGUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjU3NTg4MDkxNjhlLTAwMyksIFFUTUZMTEQoLTEuMDE3ODIxMDIxNGUtMDAyKSwKKyAgICBRVE1GTExEKC05LjcxNzExODc0MDFlLTAwMiksIFFUTUZMTEQoLTguMTMzNzg5ODk3MGUtMDAxKSwKKyAgICBRVE1GTExEKC0xLjMzNjA4MDY3NDFlLTAwMiksIFFUTUZMTEQoLTEuNTA0MDc5Nzg4MGUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjAyMzM2MDM0MThlLTAwMiksIFFUTUZMTEQoLTkuMTc3MDU5NjgwMmUtMDAyKSwKKyAgICBRVE1GTExEKC04LjAzOTgxODQwNjFlLTAwMSksIFFUTUZMTEQoLTEuMjYwNzY5Mjc0MWUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjQyNzMzOTczOTJlLTAwMyksIFFUTUZMTEQoLTEuMDI3NjgyNzk2MWUtMDAyKSwKKyAgICBRVE1GTExEKC04LjYwOTUxNzY2MzdlLTAwMiksIFFUTUZMTEQoLTcuOTQzMjIyNTIyN2UtMDAxKSwKKyAgICBRVE1GTExEKC0xLjE4NTM1ODU5NTFlLTAwMiksIFFUTUZMTEQoLTEuMzQ1ODM0OTI3NmUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjAzMDY1Nzk5OTJlLTAwMiksIFFUTUZMTEQoLTguMDE0MzkyODUyOGUtMDAyKSwKKyAgICBRVE1GTExEKC03Ljg0NDA5NTIzMDFlLTAwMSksIFFUTUZMTEQoLTEuMTEwMjM4NTgxOWUtMDAyKSwKKyAgICBRVE1GTExEKC0xLjI1OTcyNTY1NzNlLTAwMyksIFFUTUZMTEQoLTEuMDMyMTU0NjM0NmUtMDAyKSwKKyAgICBRVE1GTExEKC03LjM5MTU5MjExNTJlLTAwMiksIFFUTUZMTEQoLTcuNzQyNTM3ODU2MWUtMDAxKSwKKyAgICBRVE1GTExEKC0xLjAzNTY5NjgyNjllLTAwMiksIFFUTUZMTEQoLTEuMTY5MTQzOTQzMWUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjAzMjAzNzg0NjdlLTAwMiksIFFUTUZMTEQoLTYuNzQxMDg3ODgzN2UtMDAyKSwKKyAgICBRVE1GTExEKC03LjYzODY0OTM0NDRlLTAwMSksIFFUTUZMTEQoLTkuNjIwMDA0MzMzNmUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjA3NDMwMDE0NzZlLTAwMyksIFFUTUZMTEQoLTEuMDMwMTYzMDAxM2UtMDAyKSwKKyAgICBRVE1GTExEKC02LjA2Mjg0NDc2ODJlLTAwMiksIFFUTUZMTEQoLTcuNTMyNTM0NTk5M2UtMDAxKSwKKyAgICBRVE1GTExEKC04Ljg5NDkyOTY2MjNlLTAwMyksIFFUTUZMTEQoLTkuNzUzNTMxMTk0M2UtMDA0KSwKKyAgICBRVE1GTExEKC0xLjAyNjM4OTg0MTBlLTAwMiksIFFUTUZMTEQoLTUuMzU2ODc1ODA3MGUtMDAyKSwKKyAgICBRVE1GTExEKC03LjQyNDI5NDk0ODZlLTAwMSksIFFUTUZMTEQoLTguMTgzNzExMjA4NGUtMDAzKSwKKyAgICBRVE1GTExEKC04LjcyNDg1OTIxNzJlLTAwNCksIFFUTUZMTEQoLTEuMDIwNTc1OTY2N2UtMDAyKSwKKyAgICBRVE1GTExEKC00LjYyMzI0NTA3NTNlLTAwMiksIFFUTUZMTEQoLTcuMzE0MDM1Mjk2NGUtMDAxKSwKKyAgICBRVE1GTExEKC03LjQ5MDEwMjIwMTdlLTAwMyksIFFUTUZMTEQoLTcuNjU5MTAxMzkzMWUtMDA0KSwKKyAgICBRVE1GTExEKC0xLjAxMjU2NzUyMzllLTAwMiksIFFUTUZMTEQoLTMuODYxOTk1MDQxNGUtMDAyKSwKKyAgICBRVE1GTExEKC03LjIwMTg1OTk1MTBlLTAwMSksIFFUTUZMTEQoLTYuODE2NTc5MDI5MGUtMDAzKSwKKyAgICBRVE1GTExEKC02LjU1ODA4NDI3ODRlLTAwNCksIFFUTUZMTEQoLTEuMDAyMjIxODMzOWUtMDAyKSwKKyAgICBRVE1GTExEKC0zLjA3MzI1NDc4NjRlLTAwMiksIFFUTUZMTEQoLTcuMDg3ODgxNTY1MWUtMDAxKSwKKyAgICBRVE1GTExEKC02LjE2NDI0MjA0NzhlLTAwMyksIFFUTUZMTEQoLTUuNDI0NzczNTUzNGUtMDA0KSwKKyAgICBRVE1GTExEKC05Ljg5MzcyODQyMDFlLTAwMyksIFFUTUZMTEQoLTIuMjU3MTQ3ODAzOWUtMDAyKSwKKyAgICBRVE1GTExEKC02Ljk3MjIwMTQ2NjZlLTAwMSksIFFUTUZMTEQoLTUuNTM3MzgxMzk1N2UtMDAzKSwKKyAgICBRVE1GTExEKC00LjI1OTY2MTk0NjBlLTAwNCksIFFUTUZMTEQoLTkuNzM4OTI5NTY5N2UtMDAzKSwKKyAgICBRVE1GTExEKC0xLjQxMzg1NzA5ODdlLTAwMiksIFFUTUZMTEQoLTYuODU0OTI5OTI0MGUtMDAxKSwKKyAgICBRVE1GTExEKC00LjkzNzI2MDg3NzNlLTAwMyksIFFUTUZMTEQoLTMuMDY1NzEyODA4MmUtMDA0KSwKKyAgICBRVE1GTExEKC05LjU1NjA4OTUyNzllLTAwMyksIFFUTUZMTEQoLTUuNDM1NjcyNTg4NmUtMDAzKSwKKyAgICBRVE1GTExEKC02LjczNjE3NDIyNThlLTAwMSksIFFUTUZMTEQoLTQuMzY1MzA3Mjc4OWUtMDAzKSwKKyAgICBRVE1GTExEKC0xLjg0NTE2MzIwNTllLTAwNCksIFFUTUZMTEQoLTkuMzQzODE5NjkyN2UtMDAzKSwKKyAgICBRVE1GTExEKDMuNTM0NjczMDE0N2UtMDAzKSwgIFFUTUZMTEQoLTYuNjE2MDQ0MDQ0NWUtMDAxKSwKKyAgICBRVE1GTExEKC0zLjgyNTE4MDkzMTBlLTAwMyksIFFUTUZMTEQoLTYuMDAyNzI5Nzg3N2UtMDA1KSwKKyAgICBRVE1GTExEKC05LjEwMDQ0NDYxNDllLTAwMyksIFFUTUZMTEQoMS4yNzcwMDA1NTAyZS0wMDIpLAorICAgIFFUTUZMTEQoLTYuNDk0NjU0NDE3MGUtMDAxKSwgUVRNRkxMRCgtMy4zMTQ3NTUzOTEzZS0wMDMpLAorICAgIFFUTUZMTEQoNi42NjE4MTgwNDI2ZS0wMDUpLCAgUVRNRkxMRCgtOC44MjQ1MjYzMzIzZS0wMDMpLAorICAgIFFUTUZMTEQoMi4yMjY3MjAxOTE1ZS0wMDIpLCAgUVRNRkxMRCgtNi4zNzIxMDMwOTUxZS0wMDEpLAorICAgIFFUTUZMTEQoLTIuODM4NzA5MTU4OGUtMDAzKSwgUVRNRkxMRCgxLjk1MTgzMjY3MzVlLTAwNCksCisgICAgUVRNRkxMRCgtOC41MTQ1MTA0Njc2ZS0wMDMpLCBRVE1GTExEKDMuMjAyMzAxMjYzOGUtMDAyKSwKKyAgICBRVE1GTExEKC02LjI0ODUwNTExNTVlLTAwMSksIFFUTUZMTEQoLTIuMzk3NTA0ODY4MGUtMDAzKSwKKyAgICBRVE1GTExEKDMuMjU0NTA0NDA4N2UtMDA0KSwgIFFUTUZMTEQoLTguMTY4NzgxMTc2MmUtMDAzKSwKKyAgICBRVE1GTExEKDQuMjAzMzgxMDE2OWUtMDAyKSwgIFFUTUZMTEQoLTYuMTIzOTgwMjgzN2UtMDAxKSwKKyAgICBRVE1GTExEKC0xLjk4MDcyMDMyMDdlLTAwMyksIFFUTUZMTEQoNC41NzEyNTEwNDczZS0wMDQpLAorICAgIFFUTUZMTEQoLTcuNzg1OTE3MjU5OGUtMDAzKSwgUVRNRkxMRCg1LjIyOTU4OTM0MzFlLTAwMiksCisgICAgUVRNRkxMRCgtNS45OTg2MTkxOTg4ZS0wMDEpLCBRVE1GTExEKC0xLjYwMTA1Mzk4MzllLTAwMyksCisgICAgUVRNRkxMRCg1LjkwMTUxNDA4NjllLTAwNCksICBRVE1GTExEKC03LjM2NDUzNzEwMTJlLTAwMyksCisgICAgUVRNRkxMRCg2LjI4MDUxMzg1MjhlLTAwMiksICBRVE1GTExEKC01Ljg3MjU1OTU0NzRlLTAwMSksCisgICAgUVRNRkxMRCgtMS4yMzIwNzQzNDA4ZS0wMDMpLCBRVE1GTExEKDcuMjUwODY4OTQ4MmUtMDA0KSwKKyAgICBRVE1GTExEKC02LjkwMzA0NjI3NjRlLTAwMyksIFFUTUZMTEQoNy4zNTU3OTM1NjU1ZS0wMDIpLAorICAgIFFUTUZMTEQoLTUuNzQ2MDAxNjAxMmUtMDAxKSwgUVRNRkxMRCgtNy45NDkyNjA3NjIwZS0wMDQpfTsKIAogLy9AewogLyohCkBAIC0xODMzLDk1ICs2NDc2LDY0IEBACiAvKiEgc2luICgzLjE0MTU5MjY1MzU4OTc5MzIzIC8gKDIqTCkgKiBuKSAsIEw9NjQqLwogTE5LX1NFQ1RJT05fQ09OU1REQVRBCiBSQU1fQUxJR04KLWNvbnN0IEZJWFBfV1RQIHNpbl90d2lkZGxlX0w2NFtdPQotewotICBXVENQKDB4N2ZmZmZmZmYsIDB4MDAwMDAwMDApLCBXVENQKDB4N2ZmNjIxODIsIDB4MDMyNDJhYmYpLCBXVENQKDB4N2ZkODg3OGUsIDB4MDY0N2Q5N2MpLCBXVENQKDB4N2ZhNzM2YjQsIDB4MDk2YTkwNDkpLAotICBXVENQKDB4N2Y2MjM2OGYsIDB4MGM4YmQzNWUpLCBXVENQKDB4N2YwOTkxYzQsIDB4MGZhYjI3MmIpLCBXVENQKDB4N2U5ZDU1ZmMsIDB4MTJjODEwNmYpLCBXVENQKDB4N2UxZDkzZWEsIDB4MTVlMjE0NDUpLAotICBXVENQKDB4N2Q4YTVmNDAsIDB4MThmOGI4M2MpLCBXVENQKDB4N2NlM2NlYjIsIDB4MWMwYjgyNmEpLCBXVENQKDB4N2MyOWZiZWUsIDB4MWYxOWY5N2IpLCBXVENQKDB4N2I1ZDAzOWUsIDB4MjIyM2E0YzUpLAotICBXVENQKDB4N2E3ZDA1NWIsIDB4MjUyODBjNWUpLCBXVENQKDB4Nzk4YTIzYjEsIDB4MjgyNmI5MjgpLCBXVENQKDB4Nzg4NDg0MTQsIDB4MmIxZjM0ZWIpLCBXVENQKDB4Nzc2YzRlZGIsIDB4MmUxMTBhNjIpLAotICBXVENQKDB4NzY0MWFmM2QsIDB4MzBmYmM1NGQpLCBXVENQKDB4NzUwNGQzNDUsIDB4MzNkZWYyODcpLCBXVENQKDB4NzNiNWViZDEsIDB4MzZiYTIwMTQpLCBXVENQKDB4NzI1NTJjODUsIDB4Mzk4Y2RkMzIpLAotICBXVENQKDB4NzBlMmNiYzYsIDB4M2M1NmJhNzApLCBXVENQKDB4NmY1ZjAyYjIsIDB4M2YxNzQ5YjgpLCBXVENQKDB4NmRjYTBkMTQsIDB4NDFjZTFlNjUpLCBXVENQKDB4NmMyNDI5NjAsIDB4NDQ3YWNkNTApLAotICBXVENQKDB4NmE2ZDk4YTQsIDB4NDcxY2VjZTcpLCBXVENQKDB4NjhhNjllODEsIDB4NDliNDE1MzMpLCBXVENQKDB4NjZjZjgxMjAsIDB4NGMzZmRmZjQpLCBXVENQKDB4NjRlODg5MjYsIDB4NGViZmU4YTUpLAotICBXVENQKDB4NjJmMjAxYWMsIDB4NTEzM2NjOTQpLCBXVENQKDB4NjBlYzM4MzAsIDB4NTM5YjJhZjApLCBXVENQKDB4NWVkNzdjOGEsIDB4NTVmNWE0ZDIpLCBXVENQKDB4NWNiNDIwZTAsIDB4NTg0MmRkNTQpLAotICBXVENQKDB4NWE4Mjc5OWEsIDB4NWE4Mjc5OWEpCi0gICwgV1RDUCgweDU4NDJkZDU0LCAweDVjYjQyMGUwKSwgV1RDUCgweDU1ZjVhNGQyLCAweDVlZDc3YzhhKSwgV1RDUCgweDUzOWIyYWYwLCAweDYwZWMzODMwKSwKLSAgV1RDUCgweDUxMzNjYzk0LCAweDYyZjIwMWFjKSwgV1RDUCgweDRlYmZlOGE1LCAweDY0ZTg4OTI2KSwgV1RDUCgweDRjM2ZkZmY0LCAweDY2Y2Y4MTIwKSwgV1RDUCgweDQ5YjQxNTMzLCAweDY4YTY5ZTgxKSwKLSAgV1RDUCgweDQ3MWNlY2U3LCAweDZhNmQ5OGE0KSwgV1RDUCgweDQ0N2FjZDUwLCAweDZjMjQyOTYwKSwgV1RDUCgweDQxY2UxZTY1LCAweDZkY2EwZDE0KSwgV1RDUCgweDNmMTc0OWI4LCAweDZmNWYwMmIyKSwKLSAgV1RDUCgweDNjNTZiYTcwLCAweDcwZTJjYmM2KSwgV1RDUCgweDM5OGNkZDMyLCAweDcyNTUyYzg1KSwgV1RDUCgweDM2YmEyMDE0LCAweDczYjVlYmQxKSwgV1RDUCgweDMzZGVmMjg3LCAweDc1MDRkMzQ1KSwKLSAgV1RDUCgweDMwZmJjNTRkLCAweDc2NDFhZjNkKSwgV1RDUCgweDJlMTEwYTYyLCAweDc3NmM0ZWRiKSwgV1RDUCgweDJiMWYzNGViLCAweDc4ODQ4NDE0KSwgV1RDUCgweDI4MjZiOTI4LCAweDc5OGEyM2IxKSwKLSAgV1RDUCgweDI1MjgwYzVlLCAweDdhN2QwNTViKSwgV1RDUCgweDIyMjNhNGM1LCAweDdiNWQwMzllKSwgV1RDUCgweDFmMTlmOTdiLCAweDdjMjlmYmVlKSwgV1RDUCgweDFjMGI4MjZhLCAweDdjZTNjZWIyKSwKLSAgV1RDUCgweDE4ZjhiODNjLCAweDdkOGE1ZjQwKSwgV1RDUCgweDE1ZTIxNDQ1LCAweDdlMWQ5M2VhKSwgV1RDUCgweDEyYzgxMDZmLCAweDdlOWQ1NWZjKSwgV1RDUCgweDBmYWIyNzJiLCAweDdmMDk5MWM0KSwKLSAgV1RDUCgweDBjOGJkMzVlLCAweDdmNjIzNjhmKSwgV1RDUCgweDA5NmE5MDQ5LCAweDdmYTczNmI0KSwgV1RDUCgweDA2NDdkOTdjLCAweDdmZDg4NzhlKSwgV1RDUCgweDAzMjQyYWJmLCAweDdmZjYyMTgyKQotfTsKK2NvbnN0IEZJWFBfV1RQIHNpbl90d2lkZGxlX0w2NFtdID0geworICAgIFdUQ1AoMHg3ZmZmZmZmZiwgMHgwMDAwMDAwMCksIFdUQ1AoMHg3ZmY2MjE4MiwgMHgwMzI0MmFiZiksCisgICAgV1RDUCgweDdmZDg4NzhlLCAweDA2NDdkOTdjKSwgV1RDUCgweDdmYTczNmI0LCAweDA5NmE5MDQ5KSwKKyAgICBXVENQKDB4N2Y2MjM2OGYsIDB4MGM4YmQzNWUpLCBXVENQKDB4N2YwOTkxYzQsIDB4MGZhYjI3MmIpLAorICAgIFdUQ1AoMHg3ZTlkNTVmYywgMHgxMmM4MTA2ZiksIFdUQ1AoMHg3ZTFkOTNlYSwgMHgxNWUyMTQ0NSksCisgICAgV1RDUCgweDdkOGE1ZjQwLCAweDE4ZjhiODNjKSwgV1RDUCgweDdjZTNjZWIyLCAweDFjMGI4MjZhKSwKKyAgICBXVENQKDB4N2MyOWZiZWUsIDB4MWYxOWY5N2IpLCBXVENQKDB4N2I1ZDAzOWUsIDB4MjIyM2E0YzUpLAorICAgIFdUQ1AoMHg3YTdkMDU1YiwgMHgyNTI4MGM1ZSksIFdUQ1AoMHg3OThhMjNiMSwgMHgyODI2YjkyOCksCisgICAgV1RDUCgweDc4ODQ4NDE0LCAweDJiMWYzNGViKSwgV1RDUCgweDc3NmM0ZWRiLCAweDJlMTEwYTYyKSwKKyAgICBXVENQKDB4NzY0MWFmM2QsIDB4MzBmYmM1NGQpLCBXVENQKDB4NzUwNGQzNDUsIDB4MzNkZWYyODcpLAorICAgIFdUQ1AoMHg3M2I1ZWJkMSwgMHgzNmJhMjAxNCksIFdUQ1AoMHg3MjU1MmM4NSwgMHgzOThjZGQzMiksCisgICAgV1RDUCgweDcwZTJjYmM2LCAweDNjNTZiYTcwKSwgV1RDUCgweDZmNWYwMmIyLCAweDNmMTc0OWI4KSwKKyAgICBXVENQKDB4NmRjYTBkMTQsIDB4NDFjZTFlNjUpLCBXVENQKDB4NmMyNDI5NjAsIDB4NDQ3YWNkNTApLAorICAgIFdUQ1AoMHg2YTZkOThhNCwgMHg0NzFjZWNlNyksIFdUQ1AoMHg2OGE2OWU4MSwgMHg0OWI0MTUzMyksCisgICAgV1RDUCgweDY2Y2Y4MTIwLCAweDRjM2ZkZmY0KSwgV1RDUCgweDY0ZTg4OTI2LCAweDRlYmZlOGE1KSwKKyAgICBXVENQKDB4NjJmMjAxYWMsIDB4NTEzM2NjOTQpLCBXVENQKDB4NjBlYzM4MzAsIDB4NTM5YjJhZjApLAorICAgIFdUQ1AoMHg1ZWQ3N2M4YSwgMHg1NWY1YTRkMiksIFdUQ1AoMHg1Y2I0MjBlMCwgMHg1ODQyZGQ1NCksCisgICAgV1RDUCgweDVhODI3OTlhLCAweDVhODI3OTlhKSwgV1RDUCgweDU4NDJkZDU0LCAweDVjYjQyMGUwKSwKKyAgICBXVENQKDB4NTVmNWE0ZDIsIDB4NWVkNzdjOGEpLCBXVENQKDB4NTM5YjJhZjAsIDB4NjBlYzM4MzApLAorICAgIFdUQ1AoMHg1MTMzY2M5NCwgMHg2MmYyMDFhYyksIFdUQ1AoMHg0ZWJmZThhNSwgMHg2NGU4ODkyNiksCisgICAgV1RDUCgweDRjM2ZkZmY0LCAweDY2Y2Y4MTIwKSwgV1RDUCgweDQ5YjQxNTMzLCAweDY4YTY5ZTgxKSwKKyAgICBXVENQKDB4NDcxY2VjZTcsIDB4NmE2ZDk4YTQpLCBXVENQKDB4NDQ3YWNkNTAsIDB4NmMyNDI5NjApLAorICAgIFdUQ1AoMHg0MWNlMWU2NSwgMHg2ZGNhMGQxNCksIFdUQ1AoMHgzZjE3NDliOCwgMHg2ZjVmMDJiMiksCisgICAgV1RDUCgweDNjNTZiYTcwLCAweDcwZTJjYmM2KSwgV1RDUCgweDM5OGNkZDMyLCAweDcyNTUyYzg1KSwKKyAgICBXVENQKDB4MzZiYTIwMTQsIDB4NzNiNWViZDEpLCBXVENQKDB4MzNkZWYyODcsIDB4NzUwNGQzNDUpLAorICAgIFdUQ1AoMHgzMGZiYzU0ZCwgMHg3NjQxYWYzZCksIFdUQ1AoMHgyZTExMGE2MiwgMHg3NzZjNGVkYiksCisgICAgV1RDUCgweDJiMWYzNGViLCAweDc4ODQ4NDE0KSwgV1RDUCgweDI4MjZiOTI4LCAweDc5OGEyM2IxKSwKKyAgICBXVENQKDB4MjUyODBjNWUsIDB4N2E3ZDA1NWIpLCBXVENQKDB4MjIyM2E0YzUsIDB4N2I1ZDAzOWUpLAorICAgIFdUQ1AoMHgxZjE5Zjk3YiwgMHg3YzI5ZmJlZSksIFdUQ1AoMHgxYzBiODI2YSwgMHg3Y2UzY2ViMiksCisgICAgV1RDUCgweDE4ZjhiODNjLCAweDdkOGE1ZjQwKSwgV1RDUCgweDE1ZTIxNDQ1LCAweDdlMWQ5M2VhKSwKKyAgICBXVENQKDB4MTJjODEwNmYsIDB4N2U5ZDU1ZmMpLCBXVENQKDB4MGZhYjI3MmIsIDB4N2YwOTkxYzQpLAorICAgIFdUQ1AoMHgwYzhiZDM1ZSwgMHg3ZjYyMzY4ZiksIFdUQ1AoMHgwOTZhOTA0OSwgMHg3ZmE3MzZiNCksCisgICAgV1RDUCgweDA2NDdkOTdjLCAweDdmZDg4NzhlKSwgV1RDUCgweDAzMjQyYWJmLCAweDdmZjYyMTgyKX07CiAKLUxOS19TRUNUSU9OX0NPTlNUREFUQQotUkFNX0FMSUdOCi1jb25zdCBGSVhQX1dUUCBTaW5lV2luZG93NjRbXSA9Ci17Ci0gIFdUQ1AoMHg3ZmZkODg1YSwgMHgwMTkyMWQyMCksIFdUQ1AoMHg3ZmU5Y2JjMCwgMHgwNGI2MTk1ZCksIFdUQ1AoMHg3ZmMyNTU5NiwgMHgwN2Q5NWI5ZSksIFdUQ1AoMHg3Zjg3MmJmMywgMHgwYWZiNjgwNSksCi0gIFdUQ1AoMHg3ZjM4NTdmNiwgMHgwZTFiYzJlNCksIFdUQ1AoMHg3ZWQ1ZTVjNiwgMHgxMTM5ZjBjZiksIFdUQ1AoMHg3ZTVmZTQ5MywgMHgxNDU1NzZiMSksIFdUQ1AoMHg3ZGQ2NjY4ZiwgMHgxNzZkZDlkZSksCi0gIFdUQ1AoMHg3ZDM5ODBlYywgMHgxYTgyYTAyNiksIFdUQ1AoMHg3Yzg5NGJkZSwgMHgxZDkzNGZlNSksIFdUQ1AoMHg3YmM1ZTI5MCwgMHgyMDlmNzAxYyksIFdUQ1AoMHg3YWVmNjMyMywgMHgyM2E2ODg3ZiksCi0gIFdUQ1AoMHg3YTA1ZWVhZCwgMHgyNmE4MjE4NiksIFdUQ1AoMHg3OTA5YTkyZCwgMHgyOWEzYzQ4NSksIFdUQ1AoMHg3N2ZhYjk4OSwgMHgyYzk4ZmJiYSksIFdUQ1AoMHg3NmQ5NDk4OSwgMHgyZjg3NTI2MiksCi0gIFdUQ1AoMHg3NWE1ODVjZiwgMHgzMjZlNTRjNyksIFdUQ1AoMHg3NDVmOWRkMSwgMHgzNTRkOTA1NyksIFdUQ1AoMHg3MzA3YzNkMCwgMHgzODI0OTNiMCksIFdUQ1AoMHg3MTllMmNkMiwgMHgzYWYyZWViNyksCi0gIFdUQ1AoMHg3MDIzMTA5YSwgMHgzZGI4MzJhNiksIFdUQ1AoMHg2ZTk2YTk5ZCwgMHg0MDczZjIxZCksIFdUQ1AoMHg2Y2Y5MzRmYywgMHg0MzI1YzEzNSksIFdUQ1AoMHg2YjRhZjI3OSwgMHg0NWNkMzU4ZiksCi0gIFdUQ1AoMHg2OThjMjQ2YywgMHg0ODY5ZTY2NSksIFdUQ1AoMHg2N2JkMGZiZCwgMHg0YWZiNmM5OCksIFdUQ1AoMHg2NWRkZmJkMywgMHg0ZDgxNjJjNCksIFdUQ1AoMHg2M2VmMzI5MCwgMHg0ZmZiNjU0ZCksCi0gIFdUQ1AoMHg2MWYxMDAzZiwgMHg1MjY5MTI2ZSksIFdUQ1AoMHg1ZmUzYjM4ZCwgMHg1NGNhMGE0YiksIFdUQ1AoMHg1ZGM3OWQ3YywgMHg1NzFkZWVmYSksIFdUQ1AoMHg1YjlkMTE1NCwgMHg1OTY0NjQ5OCksCi19OwotCi0KLUxOS19TRUNUSU9OX0NPTlNUREFUQQotUkFNX0FMSUdOCi1jb25zdCBGSVhQX1dUUCBTaW5lV2luZG93MzJbXSA9Ci17Ci0gIFdUQ1AoMHg3ZmY2MjE4MiwgMHgwMzI0MmFiZiksIFdUQ1AoMHg3ZmE3MzZiNCwgMHgwOTZhOTA0OSksIFdUQ1AoMHg3ZjA5OTFjNCwgMHgwZmFiMjcyYiksIFdUQ1AoMHg3ZTFkOTNlYSwgMHgxNWUyMTQ0NSksCi0gIFdUQ1AoMHg3Y2UzY2ViMiwgMHgxYzBiODI2YSksIFdUQ1AoMHg3YjVkMDM5ZSwgMHgyMjIzYTRjNSksIFdUQ1AoMHg3OThhMjNiMSwgMHgyODI2YjkyOCksIFdUQ1AoMHg3NzZjNGVkYiwgMHgyZTExMGE2MiksCi0gIFdUQ1AoMHg3NTA0ZDM0NSwgMHgzM2RlZjI4NyksIFdUQ1AoMHg3MjU1MmM4NSwgMHgzOThjZGQzMiksIFdUQ1AoMHg2ZjVmMDJiMiwgMHgzZjE3NDliOCksIFdUQ1AoMHg2YzI0Mjk2MCwgMHg0NDdhY2Q1MCksCi0gIFdUQ1AoMHg2OGE2OWU4MSwgMHg0OWI0MTUzMyksIFdUQ1AoMHg2NGU4ODkyNiwgMHg0ZWJmZThhNSksIFdUQ1AoMHg2MGVjMzgzMCwgMHg1MzliMmFmMCksIFdUQ1AoMHg1Y2I0MjBlMCwgMHg1ODQyZGQ1NCksCi19OwotCi0KLQotCi0KLQotCi0KLWNvbnN0IFVTSE9SVCBzcXJ0X3RhYls0OV09ewotMHg1YTgyLCAweDVkNGIsIDB4NjAwMCwgMHg2MmExLAotMHg2NTMxLCAweDY3YjEsIDB4NmEyMSwgMHg2Yzg0LAotMHg2ZWQ5LCAweDcxMjMsIDB4NzM2MCwgMHg3NTkzLAotMHg3N2JiLCAweDc5ZGEsIDB4N2JlZiwgMHg3ZGZiLAotMHg4MDAwLCAweDgxZmMsIDB4ODNmMCwgMHg4NWRkLAotMHg4N2MzLCAweDg5YTMsIDB4OGI3YywgMHg4ZDRlLAotMHg4ZjFiLCAweDkwZTIsIDB4OTJhNCwgMHg5NDYwLAotMHg5NjE3LCAweDk3Y2EsIDB4OTk3NywgMHg5YjIwLAotMHg5Y2M0LCAweDllNjQsIDB4YTAwMCwgMHhhMTk3LAotMHhhMzJiLCAweGE0YmEsIDB4YTY0NiwgMHhhN2NmLAotMHhhOTUzLCAweGFhZDUsIDB4YWM1MywgMHhhZGNkLAotMHhhZjQ1LCAweGIwYjksIDB4YjIyYiwgMHhiMzk5LAotMHhiNTA0fTsKK2NvbnN0IFVTSE9SVCBzcXJ0X3RhYls0OV0gPSB7CisgICAgMHg1YTgyLCAweDVkNGIsIDB4NjAwMCwgMHg2MmExLCAweDY1MzEsIDB4NjdiMSwgMHg2YTIxLCAweDZjODQsIDB4NmVkOSwKKyAgICAweDcxMjMsIDB4NzM2MCwgMHg3NTkzLCAweDc3YmIsIDB4NzlkYSwgMHg3YmVmLCAweDdkZmIsIDB4ODAwMCwgMHg4MWZjLAorICAgIDB4ODNmMCwgMHg4NWRkLCAweDg3YzMsIDB4ODlhMywgMHg4YjdjLCAweDhkNGUsIDB4OGYxYiwgMHg5MGUyLCAweDkyYTQsCisgICAgMHg5NDYwLCAweDk2MTcsIDB4OTdjYSwgMHg5OTc3LCAweDliMjAsIDB4OWNjNCwgMHg5ZTY0LCAweGEwMDAsIDB4YTE5NywKKyAgICAweGEzMmIsIDB4YTRiYSwgMHhhNjQ2LCAweGE3Y2YsIDB4YTk1MywgMHhhYWQ1LCAweGFjNTMsIDB4YWRjZCwgMHhhZjQ1LAorICAgIDB4YjBiOSwgMHhiMjJiLCAweGIzOTksIDB4YjUwNH07CiAKIExOS19TRUNUSU9OX0NPTlNUREFUQV9MMQotY29uc3QgRklYUF9EQkwgaW52Q291bnRbODBdPSAgLyogVGhpcyBjb3VsZCBiZSAxNi1iaXQgd2lkZSAqLwotewotICAgIDB4MDAwMDAwMDAsIDB4N2ZmZmZmZmYsIDB4NDAwMDAwMDAsIDB4MmFhYWFhYWIsIDB4MjAwMDAwMDAsCi0gICAgMHgxOTk5OTk5YSwgMHgxNTU1NTU1NSwgMHgxMjQ5MjQ5MiwgMHgxMDAwMDAwMCwgMHgwZTM4ZTM4ZSwKLSAgICAweDBjY2NjY2NkLCAweDBiYTJlOGJhLCAweDBhYWFhYWFiLCAweDA5ZDg5ZDhhLCAweDA5MjQ5MjQ5LAotICAgIDB4MDg4ODg4ODksIDB4MDgwMDAwMDAsIDB4MDc4Nzg3ODgsIDB4MDcxYzcxYzcsIDB4MDZiY2ExYWYsCi0gICAgMHgwNjY2NjY2NiwgMHgwNjE4NjE4NiwgMHgwNWQxNzQ1ZCwgMHgwNTkwYjIxNiwgMHgwNTU1NTU1NSwKLSAgICAweDA1MWViODUyLCAweDA0ZWM0ZWM1LCAweDA0YmRhMTJmLCAweDA0OTI0OTI1LCAweDA0NjllZTU4LAotICAgIDB4MDQ0NDQ0NDQsIDB4MDQyMTA4NDIsIDB4MDQwMDAwMDAsIDB4MDNlMGY4M2UsIDB4MDNjM2MzYzQsCi0gICAgMHgwM2E4M2E4NCwgMHgwMzhlMzhlNCwgMHgwMzc1OWYyMywgMHgwMzVlNTBkOCwgMHgwMzQ4MzQ4MywKLSAgICAweDAzMzMzMzMzLCAweDAzMWYzODMyLCAweDAzMGMzMGMzLCAweDAyZmEwYmU4LCAweDAyZThiYTJmLAotICAgIDB4MDJkODJkODMsIDB4MDJjODU5MGIsIDB4MDJiOTMxMDUsIDB4MDJhYWFhYWIsIDB4MDI5Y2JjMTUsCi0gICAgMHgwMjhmNWMyOSwgMHgwMjgyODI4MywgMHgwMjc2Mjc2MiwgMHgwMjZhNDM5ZiwgMHgwMjVlZDA5OCwKLSAgICAweDAyNTNjODI1LCAweDAyNDkyNDkyLCAweDAyM2VlMDkwLCAweDAyMzRmNzJjLCAweDAyMmI2M2NjLAotICAgIDB4MDIyMjIyMjIsIDB4MDIxOTJlMmEsIDB4MDIxMDg0MjEsIDB4MDIwODIwODIsIDB4MDIwMDAwMDAsCi0gICAgMHgwMWY4MWY4MiwgMHgwMWYwN2MxZiwgMHgwMWU5MTMxYiwgMHgwMWUxZTFlMiwgMHgwMWRhZTYwNywKLSAgICAweDAxZDQxZDQyLCAweDAxY2Q4NTY5LCAweDAxYzcxYzcyLCAweDAxYzBlMDcwLCAweDAxYmFjZjkxLAotICAgIDB4MDFiNGU4MWIsIDB4MDFhZjI4NmMsIDB4MDFhOThlZjYsIDB4MDFhNDFhNDIsIDB4MDE5ZWM4ZTkKLX07Ci0KK2NvbnN0IEZJWFBfREJMIGludkNvdW50WzgwXSA9IC8qIFRoaXMgY291bGQgYmUgMTYtYml0IHdpZGUgKi8KKyAgICB7MHgwMDAwMDAwMCwgMHg3ZmZmZmZmZiwgMHg0MDAwMDAwMCwgMHgyYWFhYWFhYiwgMHgyMDAwMDAwMCwgMHgxOTk5OTk5YSwKKyAgICAgMHgxNTU1NTU1NSwgMHgxMjQ5MjQ5MiwgMHgxMDAwMDAwMCwgMHgwZTM4ZTM4ZSwgMHgwY2NjY2NjZCwgMHgwYmEyZThiYSwKKyAgICAgMHgwYWFhYWFhYiwgMHgwOWQ4OWQ4YSwgMHgwOTI0OTI0OSwgMHgwODg4ODg4OSwgMHgwODAwMDAwMCwgMHgwNzg3ODc4OCwKKyAgICAgMHgwNzFjNzFjNywgMHgwNmJjYTFhZiwgMHgwNjY2NjY2NiwgMHgwNjE4NjE4NiwgMHgwNWQxNzQ1ZCwgMHgwNTkwYjIxNiwKKyAgICAgMHgwNTU1NTU1NSwgMHgwNTFlYjg1MiwgMHgwNGVjNGVjNSwgMHgwNGJkYTEyZiwgMHgwNDkyNDkyNSwgMHgwNDY5ZWU1OCwKKyAgICAgMHgwNDQ0NDQ0NCwgMHgwNDIxMDg0MiwgMHgwNDAwMDAwMCwgMHgwM2UwZjgzZSwgMHgwM2MzYzNjNCwgMHgwM2E4M2E4NCwKKyAgICAgMHgwMzhlMzhlNCwgMHgwMzc1OWYyMywgMHgwMzVlNTBkOCwgMHgwMzQ4MzQ4MywgMHgwMzMzMzMzMywgMHgwMzFmMzgzMiwKKyAgICAgMHgwMzBjMzBjMywgMHgwMmZhMGJlOCwgMHgwMmU4YmEyZiwgMHgwMmQ4MmQ4MywgMHgwMmM4NTkwYiwgMHgwMmI5MzEwNSwKKyAgICAgMHgwMmFhYWFhYiwgMHgwMjljYmMxNSwgMHgwMjhmNWMyOSwgMHgwMjgyODI4MywgMHgwMjc2Mjc2MiwgMHgwMjZhNDM5ZiwKKyAgICAgMHgwMjVlZDA5OCwgMHgwMjUzYzgyNSwgMHgwMjQ5MjQ5MiwgMHgwMjNlZTA5MCwgMHgwMjM0ZjcyYywgMHgwMjJiNjNjYywKKyAgICAgMHgwMjIyMjIyMiwgMHgwMjE5MmUyYSwgMHgwMjEwODQyMSwgMHgwMjA4MjA4MiwgMHgwMjAwMDAwMCwgMHgwMWY4MWY4MiwKKyAgICAgMHgwMWYwN2MxZiwgMHgwMWU5MTMxYiwgMHgwMWUxZTFlMiwgMHgwMWRhZTYwNywgMHgwMWQ0MWQ0MiwgMHgwMWNkODU2OSwKKyAgICAgMHgwMWM3MWM3MiwgMHgwMWMwZTA3MCwgMHgwMWJhY2Y5MSwgMHgwMWI0ZTgxYiwgMHgwMWFmMjg2YywgMHgwMWE5OGVmNiwKKyAgICAgMHgwMWE0MWE0MiwgMHgwMTllYzhlOX07CiAKIC8qCiAgKiBCaXRzdHJlYW0gZGF0YSBsaXN0cwpAQCAtMTkzMyw2MzQgKzY1NDUsNjA4IEBACiAgKi8KIAogc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2FhY19zY2VbXSA9IHsKLSAgYWR0c2NyY19zdGFydF9yZWcxLAotICBlbGVtZW50X2luc3RhbmNlX3RhZywKLSAgZ2xvYmFsX2dhaW4sCi0gIGljc19pbmZvLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICBwdWxzZSwKLSAgdG5zX2RhdGFfcHJlc2VudCwKLSAgdG5zX2RhdGEsCi0gIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCi0gIC8qIGdhaW5fY29udHJvbF9kYXRhLCAqLwotICBzcGVjdHJhbF9kYXRhLAotICBhZHRzY3JjX2VuZF9yZWcxLAotICBlbmRfb2Zfc2VxdWVuY2UKLX07CisgICAgYWR0c2NyY19zdGFydF9yZWcxLCBlbGVtZW50X2luc3RhbmNlX3RhZywgZ2xvYmFsX2dhaW4sIGljc19pbmZvLAorICAgIHNlY3Rpb25fZGF0YSwgc2NhbGVfZmFjdG9yX2RhdGEsIHB1bHNlLCB0bnNfZGF0YV9wcmVzZW50LCB0bnNfZGF0YSwKKyAgICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAorICAgIC8qIGdhaW5fY29udHJvbF9kYXRhLCAqLworICAgIHNwZWN0cmFsX2RhdGEsIGFkdHNjcmNfZW5kX3JlZzEsIGVuZF9vZl9zZXF1ZW5jZX07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfYWFjX3NjZSA9IHsKLSAgZWxfYWFjX3NjZSwKLSAgeyBOVUxMLCBOVUxMIH0KLX07CitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2FhY19zY2UgPSB7ZWxfYWFjX3NjZSwge05VTEwsIE5VTEx9fTsKIAotc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2FhY19jcGVbXSA9IHsKLSAgYWR0c2NyY19zdGFydF9yZWcxLAotICBlbGVtZW50X2luc3RhbmNlX3RhZywKLSAgY29tbW9uX3dpbmRvdywKLSAgbGlua19zZXF1ZW5jZQotfTsKKy8qIENDRSAqLworc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2FhY19jY2VbXSA9IHsKKyAgICBhZHRzY3JjX3N0YXJ0X3JlZzEsIGVsZW1lbnRfaW5zdGFuY2VfdGFnLAorICAgIGNvdXBsZWRfZWxlbWVudHMsIC8qIENDRSBzcGVjaWZpYyAqLworICAgIGdsb2JhbF9nYWluLCBpY3NfaW5mbywgc2VjdGlvbl9kYXRhLCBzY2FsZV9mYWN0b3JfZGF0YSwgcHVsc2UsCisgICAgdG5zX2RhdGFfcHJlc2VudCwgdG5zX2RhdGEsIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCisgICAgLyogZ2Fpbl9jb250cm9sX2RhdGEsICovCisgICAgc3BlY3RyYWxfZGF0YSwgZ2Fpbl9lbGVtZW50X2xpc3RzLCAvKiBDQ0Ugc3BlY2lmaWMgKi8KKyAgICBhZHRzY3JjX2VuZF9yZWcxLCBlbmRfb2Zfc2VxdWVuY2V9OwogCi1zdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfYWFjX2NwZTBbXSA9Ci17Ci0gIC8qY29tbW9uX3dpbmRvdyA9IDAqLwotICBnbG9iYWxfZ2FpbiwKLSAgaWNzX2luZm8sCi0gIHNlY3Rpb25fZGF0YSwKLSAgc2NhbGVfZmFjdG9yX2RhdGEsCi0gIHB1bHNlLAotICB0bnNfZGF0YV9wcmVzZW50LAotICB0bnNfZGF0YSwKLSAgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKLSAgLypnYWluX2NvbnRyb2xfZGF0YSwqLwotICBzcGVjdHJhbF9kYXRhLAotICBuZXh0X2NoYW5uZWwsCitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2FhY19jY2UgPSB7ZWxfYWFjX2NjZSwge05VTEwsIE5VTEx9fTsKIAotICBhZHRzY3JjX3N0YXJ0X3JlZzIsCi0gIGdsb2JhbF9nYWluLAotICBpY3NfaW5mbywKLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgcHVsc2UsCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIHRuc19kYXRhLAotICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAotICAvKmdhaW5fY29udHJvbF9kYXRhLCovCi0gIHNwZWN0cmFsX2RhdGEsCi0gIGFkdHNjcmNfZW5kX3JlZzEsCi0gIGFkdHNjcmNfZW5kX3JlZzIsCi0gIGVuZF9vZl9zZXF1ZW5jZQotfTsKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9hYWNfY3BlW10gPSB7YWR0c2NyY19zdGFydF9yZWcxLCBlbGVtZW50X2luc3RhbmNlX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uX3dpbmRvdywgbGlua19zZXF1ZW5jZX07CiAKLXN0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9hYWNfY3BlMVtdID0KLXsKLSAgLyogY29tbW9uX3dpbmRvdyA9IDEgKi8KLSAgaWNzX2luZm8sCi0gIG1zLAorc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2FhY19jcGUwW10gPSB7CisgICAgLypjb21tb25fd2luZG93ID0gMCovCisgICAgZ2xvYmFsX2dhaW4sIGljc19pbmZvLCBzZWN0aW9uX2RhdGEsIHNjYWxlX2ZhY3Rvcl9kYXRhLCBwdWxzZSwKKyAgICB0bnNfZGF0YV9wcmVzZW50LCB0bnNfZGF0YSwgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKKyAgICAvKmdhaW5fY29udHJvbF9kYXRhLCovCisgICAgc3BlY3RyYWxfZGF0YSwgbmV4dF9jaGFubmVsLAogCi0gIGdsb2JhbF9nYWluLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICBwdWxzZSwKLSAgdG5zX2RhdGFfcHJlc2VudCwKLSAgdG5zX2RhdGEsCi0gIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCi0gIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KLSAgc3BlY3RyYWxfZGF0YSwKLSAgbmV4dF9jaGFubmVsLAorICAgIGFkdHNjcmNfc3RhcnRfcmVnMiwgZ2xvYmFsX2dhaW4sIGljc19pbmZvLCBzZWN0aW9uX2RhdGEsIHNjYWxlX2ZhY3Rvcl9kYXRhLAorICAgIHB1bHNlLCB0bnNfZGF0YV9wcmVzZW50LCB0bnNfZGF0YSwgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKKyAgICAvKmdhaW5fY29udHJvbF9kYXRhLCovCisgICAgc3BlY3RyYWxfZGF0YSwgYWR0c2NyY19lbmRfcmVnMSwgYWR0c2NyY19lbmRfcmVnMiwgZW5kX29mX3NlcXVlbmNlfTsKIAotICBhZHRzY3JjX3N0YXJ0X3JlZzIsCi0gIGdsb2JhbF9nYWluLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICBwdWxzZSwKLSAgdG5zX2RhdGFfcHJlc2VudCwKLSAgdG5zX2RhdGEsCi0gIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCi0gIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KLSAgc3BlY3RyYWxfZGF0YSwKLSAgYWR0c2NyY19lbmRfcmVnMSwKLSAgYWR0c2NyY19lbmRfcmVnMiwKLSAgZW5kX29mX3NlcXVlbmNlCi19Oworc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2FhY19jcGUxW10gPSB7CisgICAgLyogY29tbW9uX3dpbmRvdyA9IDEgKi8KKyAgICBpY3NfaW5mbywgbXMsCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfYWFjX2NwZTAgPSB7Ci0gIGVsX2FhY19jcGUwLAotICB7IE5VTEwsIE5VTEwgfQotfTsKKyAgICBnbG9iYWxfZ2Fpbiwgc2VjdGlvbl9kYXRhLCBzY2FsZV9mYWN0b3JfZGF0YSwgcHVsc2UsIHRuc19kYXRhX3ByZXNlbnQsCisgICAgdG5zX2RhdGEsIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCisgICAgLypnYWluX2NvbnRyb2xfZGF0YSwqLworICAgIHNwZWN0cmFsX2RhdGEsIG5leHRfY2hhbm5lbCwKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9hYWNfY3BlMSA9IHsKLSAgZWxfYWFjX2NwZTEsCi0gIHsgTlVMTCwgTlVMTCB9Ci19OworICAgIGFkdHNjcmNfc3RhcnRfcmVnMiwgZ2xvYmFsX2dhaW4sIHNlY3Rpb25fZGF0YSwgc2NhbGVfZmFjdG9yX2RhdGEsIHB1bHNlLAorICAgIHRuc19kYXRhX3ByZXNlbnQsIHRuc19kYXRhLCBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAorICAgIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KKyAgICBzcGVjdHJhbF9kYXRhLCBhZHRzY3JjX2VuZF9yZWcxLCBhZHRzY3JjX2VuZF9yZWcyLCBlbmRfb2Zfc2VxdWVuY2V9OwogCi1zdGF0aWMgY29uc3QgZWxlbWVudF9saXN0X3Qgbm9kZV9hYWNfY3BlID0gewotICBlbF9hYWNfY3BlLAotICB7ICZub2RlX2FhY19jcGUwLCAmbm9kZV9hYWNfY3BlMSB9Ci19Oworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9hYWNfY3BlMCA9IHtlbF9hYWNfY3BlMCwge05VTEwsIE5VTEx9fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9hYWNfY3BlMSA9IHtlbF9hYWNfY3BlMSwge05VTEwsIE5VTEx9fTsKKworc3RhdGljIGNvbnN0IGVsZW1lbnRfbGlzdF90IG5vZGVfYWFjX2NwZSA9IHtlbF9hYWNfY3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Jm5vZGVfYWFjX2NwZTAsICZub2RlX2FhY19jcGUxfX07CiAKIC8qCiAgKiBBT1QgQy0gezE3LDIzfQogICogZXBDb25maWcgPSAwLDEKICAqLwogc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2FhY19zY2VfZXBjMFtdID0gewotICBlbGVtZW50X2luc3RhbmNlX3RhZywKLSAgZ2xvYmFsX2dhaW4sCi0gIGljc19pbmZvLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICBwdWxzZSwKLSAgdG5zX2RhdGFfcHJlc2VudCwKLSAgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKLSAgZ2Fpbl9jb250cm9sX2RhdGEsCi0gIGVzYzFfaGNyLCAgIC8qbGVuZ3RoX29mX3J2bGNfZXNjYXBlcywgbGVuZ3RoX29mX3J2bGNfc2YgKi8KLSAgZXNjMl9ydmxjLCAgLyogcnZsY19jb2Rfc2YsIHJ2bGNfZXNjX3NmICovCi0gIHRuc19kYXRhLAotICBzcGVjdHJhbF9kYXRhLAotICBlbmRfb2Zfc2VxdWVuY2UKLX07CisgICAgZWxlbWVudF9pbnN0YW5jZV90YWcsCisgICAgZ2xvYmFsX2dhaW4sCisgICAgaWNzX2luZm8sCisgICAgc2VjdGlvbl9kYXRhLAorICAgIHNjYWxlX2ZhY3Rvcl9kYXRhLAorICAgIHB1bHNlLAorICAgIHRuc19kYXRhX3ByZXNlbnQsCisgICAgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKKyAgICBnYWluX2NvbnRyb2xfZGF0YSwKKyAgICBlc2MxX2hjciwgIC8qbGVuZ3RoX29mX3J2bGNfZXNjYXBlcywgbGVuZ3RoX29mX3J2bGNfc2YgKi8KKyAgICBlc2MyX3J2bGMsIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLworICAgIHRuc19kYXRhLAorICAgIHNwZWN0cmFsX2RhdGEsCisgICAgZW5kX29mX3NlcXVlbmNlfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9hYWNfc2NlX2VwYzAgPSB7Ci0gIGVsX2FhY19zY2VfZXBjMCwKLSAgeyBOVUxMLCBOVUxMIH0KLX07CitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2FhY19zY2VfZXBjMCA9IHtlbF9hYWNfc2NlX2VwYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7TlVMTCwgTlVMTH19OwogCiBzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfYWFjX3NjZV9lcGMxW10gPSB7Ci0gIGVsZW1lbnRfaW5zdGFuY2VfdGFnLAotICBnbG9iYWxfZ2FpbiwKLSAgaWNzX2luZm8sCi0gIHNlY3Rpb25fZGF0YSwKLSAgc2NhbGVfZmFjdG9yX2RhdGEsCi0gIHB1bHNlLAotICB0bnNfZGF0YV9wcmVzZW50LAotICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAotICAvKmdhaW5fY29udHJvbF9kYXRhLCovCi0gIGVzYzFfaGNyLCAgIC8qbGVuZ3RoX29mX3J2bGNfZXNjYXBlcywgbGVuZ3RoX29mX3J2bGNfc2YgKi8KLSAgZXNjMl9ydmxjLCAgLyogcnZsY19jb2Rfc2YsIHJ2bGNfZXNjX3NmICovCi0gIHRuc19kYXRhLAotICBzcGVjdHJhbF9kYXRhLAotICBlbmRfb2Zfc2VxdWVuY2UKLX07CisgICAgZWxlbWVudF9pbnN0YW5jZV90YWcsIGdsb2JhbF9nYWluLCBpY3NfaW5mbywgc2VjdGlvbl9kYXRhLAorICAgIHNjYWxlX2ZhY3Rvcl9kYXRhLCBwdWxzZSwgdG5zX2RhdGFfcHJlc2VudCwgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKKyAgICAvKmdhaW5fY29udHJvbF9kYXRhLCovCisgICAgZXNjMV9oY3IsICAvKmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMsIGxlbmd0aF9vZl9ydmxjX3NmICovCisgICAgZXNjMl9ydmxjLCAvKiBydmxjX2NvZF9zZiwgcnZsY19lc2Nfc2YgKi8KKyAgICB0bnNfZGF0YSwgc3BlY3RyYWxfZGF0YSwgZW5kX29mX3NlcXVlbmNlfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9hYWNfc2NlX2VwYzEgPSB7Ci0gIGVsX2FhY19zY2VfZXBjMSwKLSAgeyBOVUxMLCBOVUxMIH0KLX07CitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2FhY19zY2VfZXBjMSA9IHtlbF9hYWNfc2NlX2VwYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7TlVMTCwgTlVMTH19OworCitzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfYWFjX2NwZV9lcGMwW10gPSB7ZWxlbWVudF9pbnN0YW5jZV90YWcsIGNvbW1vbl93aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua19zZXF1ZW5jZX07CiAKIHN0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9hYWNfY3BlMF9lcGMwW10gPSB7Ci0gIC8qIGNvbW1vbl93aW5kb3cgPSAwICovCi0gIC8qIEVTQyAxOiAqLwotICBnbG9iYWxfZ2FpbiwKLSAgaWNzX2luZm8sCi0gIC8qIGx0cF9kYXRhX3ByZXNlbnQsCi0gICAgIGx0cF9kYXRhLAotICAqLwotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICBwdWxzZSwKLSAgdG5zX2RhdGFfcHJlc2VudCwKLSAgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKLSAgLypnYWluX2NvbnRyb2xfZGF0YSwqLwotICBlc2MxX2hjciwgIC8qbGVuZ3RoX29mX3J2bGNfZXNjYXBlcywgbGVuZ3RoX29mX3J2bGNfc2YgKi8KLSAgLyogRVNDIDI6ICovCi0gIGVzYzJfcnZsYywgLyogcnZsY19jb2Rfc2YsIHJ2bGNfZXNjX3NmICovCi0gIC8qIEVTQyAzOiAqLwotICB0bnNfZGF0YSwKLSAgLyogRVNDIDQ6ICovCi0gIHNwZWN0cmFsX2RhdGEsCi0gIG5leHRfY2hhbm5lbCwKKyAgICAvKiBjb21tb25fd2luZG93ID0gMCAqLworICAgIC8qIEVTQyAxOiAqLworICAgIGdsb2JhbF9nYWluLCBpY3NfaW5mbywKKyAgICAvKiBsdHBfZGF0YV9wcmVzZW50LAorICAgICAgIGx0cF9kYXRhLAorICAgICovCisgICAgc2VjdGlvbl9kYXRhLCBzY2FsZV9mYWN0b3JfZGF0YSwgcHVsc2UsIHRuc19kYXRhX3ByZXNlbnQsCisgICAgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKKyAgICAvKmdhaW5fY29udHJvbF9kYXRhLCovCisgICAgZXNjMV9oY3IsIC8qbGVuZ3RoX29mX3J2bGNfZXNjYXBlcywgbGVuZ3RoX29mX3J2bGNfc2YgKi8KKyAgICAvKiBFU0MgMjogKi8KKyAgICBlc2MyX3J2bGMsIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLworICAgIC8qIEVTQyAzOiAqLworICAgIHRuc19kYXRhLAorICAgIC8qIEVTQyA0OiAqLworICAgIHNwZWN0cmFsX2RhdGEsIG5leHRfY2hhbm5lbCwKIAotICAvKiBFU0MgMTogKi8KLSAgZ2xvYmFsX2dhaW4sCi0gIGljc19pbmZvLAotICAvKiBsdHBfZGF0YV9wcmVzZW50LAotICAgICBsdHBfZGF0YSwKLSAgKi8KLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgcHVsc2UsCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCi0gIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KLSAgZXNjMV9oY3IsICAgLypsZW5ndGhfb2ZfcnZsY19lc2NhcGVzLCBsZW5ndGhfb2ZfcnZsY19zZiAqLwotICAvKiBFU0MgMjogKi8KLSAgZXNjMl9ydmxjLCAgLyogcnZsY19jb2Rfc2YsIHJ2bGNfZXNjX3NmICovCi0gIC8qIEVTQyAzOiAqLwotICB0bnNfZGF0YSwKLSAgLyogRVNDIDQ6ICovCi0gIHNwZWN0cmFsX2RhdGEsCi0gIGVuZF9vZl9zZXF1ZW5jZQotfTsKKyAgICAvKiBFU0MgMTogKi8KKyAgICBnbG9iYWxfZ2FpbiwgaWNzX2luZm8sCisgICAgLyogbHRwX2RhdGFfcHJlc2VudCwKKyAgICAgICBsdHBfZGF0YSwKKyAgICAqLworICAgIHNlY3Rpb25fZGF0YSwgc2NhbGVfZmFjdG9yX2RhdGEsIHB1bHNlLCB0bnNfZGF0YV9wcmVzZW50LAorICAgIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCisgICAgLypnYWluX2NvbnRyb2xfZGF0YSwqLworICAgIGVzYzFfaGNyLCAvKmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMsIGxlbmd0aF9vZl9ydmxjX3NmICovCisgICAgLyogRVNDIDI6ICovCisgICAgZXNjMl9ydmxjLCAvKiBydmxjX2NvZF9zZiwgcnZsY19lc2Nfc2YgKi8KKyAgICAvKiBFU0MgMzogKi8KKyAgICB0bnNfZGF0YSwKKyAgICAvKiBFU0MgNDogKi8KKyAgICBzcGVjdHJhbF9kYXRhLCBlbmRfb2Zfc2VxdWVuY2V9OwogCiBzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfYWFjX2NwZTFfZXBjMFtdID0gewotICAvKiBjb21tb25fd2luZG93ID0gMSAqLwotICAvKiBFU0MgMDogKi8KLSAgaWNzX2luZm8sCi0gIC8qIGx0cF9kYXRhX3ByZXNlbnQsCi0gICAgIGx0cF9kYXRhLAotICAgICBuZXh0X2NoYW5uZWwsCi0gICAgIGx0cF9kYXRhX3ByZXNlbnQsCi0gICAgIGx0cF9kYXRhLAotICAgICBuZXh0X2NoYW5uZWwsCi0gICovCi0gIG1zLAorICAgIC8qIGNvbW1vbl93aW5kb3cgPSAxICovCisgICAgLyogRVNDIDA6ICovCisgICAgaWNzX2luZm8sCisgICAgLyogbHRwX2RhdGFfcHJlc2VudCwKKyAgICAgICBsdHBfZGF0YSwKKyAgICAgICBuZXh0X2NoYW5uZWwsCisgICAgICAgbHRwX2RhdGFfcHJlc2VudCwKKyAgICAgICBsdHBfZGF0YSwKKyAgICAgICBuZXh0X2NoYW5uZWwsCisgICAgKi8KKyAgICBtcywKIAotICAvKiBFU0MgMTogKi8KLSAgZ2xvYmFsX2dhaW4sCi0gIHNlY3Rpb25fZGF0YSwKLSAgc2NhbGVfZmFjdG9yX2RhdGEsCi0gIHB1bHNlLAotICB0bnNfZGF0YV9wcmVzZW50LAotICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAotICAvKmdhaW5fY29udHJvbF9kYXRhLCovCi0gIGVzYzFfaGNyLCAgIC8qIGxlbmd0aF9vZl9yZW9yZGVyZWRfc3BlY3RyYWxfZGF0YSwgbGVuZ3RoX29mX2xvbmdlc3RfY29kZXdvcmQgKi8KLSAgLyogRVNDIDI6ICovCi0gIGVzYzJfcnZsYywgIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLwotICAvKiBFU0MgMzogKi8KLSAgdG5zX2RhdGEsCi0gIC8qIEVTQyA0OiAqLwotICBzcGVjdHJhbF9kYXRhLAotICBuZXh0X2NoYW5uZWwsCisgICAgLyogRVNDIDE6ICovCisgICAgZ2xvYmFsX2dhaW4sIHNlY3Rpb25fZGF0YSwgc2NhbGVfZmFjdG9yX2RhdGEsIHB1bHNlLCB0bnNfZGF0YV9wcmVzZW50LAorICAgIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCisgICAgLypnYWluX2NvbnRyb2xfZGF0YSwqLworICAgIGVzYzFfaGNyLCAvKiBsZW5ndGhfb2ZfcmVvcmRlcmVkX3NwZWN0cmFsX2RhdGEsIGxlbmd0aF9vZl9sb25nZXN0X2NvZGV3b3JkCisgICAgICAgICAgICAgICAqLworICAgIC8qIEVTQyAyOiAqLworICAgIGVzYzJfcnZsYywgLyogcnZsY19jb2Rfc2YsIHJ2bGNfZXNjX3NmICovCisgICAgLyogRVNDIDM6ICovCisgICAgdG5zX2RhdGEsCisgICAgLyogRVNDIDQ6ICovCisgICAgc3BlY3RyYWxfZGF0YSwgbmV4dF9jaGFubmVsLAogCi0gIC8qIEVTQyAxOiAqLwotICBnbG9iYWxfZ2FpbiwKLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgcHVsc2UsCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCi0gIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KLSAgZXNjMV9oY3IsICAgLyogbGVuZ3RoX29mX3Jlb3JkZXJlZF9zcGVjdHJhbF9kYXRhLCBsZW5ndGhfb2ZfbG9uZ2VzdF9jb2Rld29yZCAqLwotICAvKiBFU0MgMjogKi8KLSAgZXNjMl9ydmxjLCAgLyogcnZsY19jb2Rfc2YsIHJ2bGNfZXNjX3NmICovCi0gIC8qIEVTQyAzOiAqLwotICB0bnNfZGF0YSwKLSAgLyogRVNDIDQ6ICovCi0gIHNwZWN0cmFsX2RhdGEsCi0gIGVuZF9vZl9zZXF1ZW5jZQotfTsKKyAgICAvKiBFU0MgMTogKi8KKyAgICBnbG9iYWxfZ2Fpbiwgc2VjdGlvbl9kYXRhLCBzY2FsZV9mYWN0b3JfZGF0YSwgcHVsc2UsIHRuc19kYXRhX3ByZXNlbnQsCisgICAgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKKyAgICAvKmdhaW5fY29udHJvbF9kYXRhLCovCisgICAgZXNjMV9oY3IsIC8qIGxlbmd0aF9vZl9yZW9yZGVyZWRfc3BlY3RyYWxfZGF0YSwgbGVuZ3RoX29mX2xvbmdlc3RfY29kZXdvcmQKKyAgICAgICAgICAgICAgICovCisgICAgLyogRVNDIDI6ICovCisgICAgZXNjMl9ydmxjLCAvKiBydmxjX2NvZF9zZiwgcnZsY19lc2Nfc2YgKi8KKyAgICAvKiBFU0MgMzogKi8KKyAgICB0bnNfZGF0YSwKKyAgICAvKiBFU0MgNDogKi8KKyAgICBzcGVjdHJhbF9kYXRhLCBlbmRfb2Zfc2VxdWVuY2V9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2FhY19jcGUwX2VwYzAgPSB7Ci0gIGVsX2FhY19jcGUwX2VwYzAsCi0gIHsgTlVMTCwgTlVMTCB9Ci19Oworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9hYWNfY3BlMF9lcGMwID0ge2VsX2FhY19jcGUwX2VwYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge05VTEwsIE5VTEx9fTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9hYWNfY3BlMV9lcGMwID0gewotICBlbF9hYWNfY3BlMV9lcGMwLAotICB7IE5VTEwsIE5VTEwgfQotfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfYWFjX2NwZTFfZXBjMCA9IHtlbF9hYWNfY3BlMV9lcGMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMLCBOVUxMfX07CiAKIHN0YXRpYyBjb25zdCBlbGVtZW50X2xpc3RfdCBub2RlX2FhY19jcGVfZXBjMCA9IHsKLSAgZWxfYWFjX2NwZSwKLSAgeyAmbm9kZV9hYWNfY3BlMF9lcGMwLCAmbm9kZV9hYWNfY3BlMV9lcGMwIH0KLX07CisgICAgZWxfYWFjX2NwZV9lcGMwLCB7Jm5vZGVfYWFjX2NwZTBfZXBjMCwgJm5vZGVfYWFjX2NwZTFfZXBjMH19OwogCiBzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfYWFjX2NwZTBfZXBjMVtdID0gewotICBnbG9iYWxfZ2FpbiwKLSAgaWNzX2luZm8sCi0gIHNlY3Rpb25fZGF0YSwKLSAgc2NhbGVfZmFjdG9yX2RhdGEsCi0gIHB1bHNlLAotICB0bnNfZGF0YV9wcmVzZW50LAotICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAotICAvKmdhaW5fY29udHJvbF9kYXRhLCovCi0gIG5leHRfY2hhbm5lbCwKLSAgZ2xvYmFsX2dhaW4sCi0gIGljc19pbmZvLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICBwdWxzZSwKLSAgdG5zX2RhdGFfcHJlc2VudCwKLSAgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKLSAgLypnYWluX2NvbnRyb2xfZGF0YSwqLwotICBuZXh0X2NoYW5uZWwsCi0gIGVzYzFfaGNyLCAgLypsZW5ndGhfb2ZfcnZsY19lc2NhcGVzLCBsZW5ndGhfb2ZfcnZsY19zZiAqLwotICBuZXh0X2NoYW5uZWwsCi0gIGVzYzFfaGNyLCAgLypsZW5ndGhfb2ZfcnZsY19lc2NhcGVzLCBsZW5ndGhfb2ZfcnZsY19zZiAqLwotICBuZXh0X2NoYW5uZWwsCi0gIGVzYzJfcnZsYywgIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLwotICBuZXh0X2NoYW5uZWwsCi0gIGVzYzJfcnZsYywgIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLwotICBuZXh0X2NoYW5uZWwsCi0gIHRuc19kYXRhLAotICBuZXh0X2NoYW5uZWwsCi0gIHRuc19kYXRhLAotICBuZXh0X2NoYW5uZWwsCi0gIHNwZWN0cmFsX2RhdGEsCi0gIG5leHRfY2hhbm5lbCwKLSAgc3BlY3RyYWxfZGF0YSwKLSAgZW5kX29mX3NlcXVlbmNlCi19OworICAgIGdsb2JhbF9nYWluLCBpY3NfaW5mbywgc2VjdGlvbl9kYXRhLCBzY2FsZV9mYWN0b3JfZGF0YSwgcHVsc2UsCisgICAgdG5zX2RhdGFfcHJlc2VudCwgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKKyAgICAvKmdhaW5fY29udHJvbF9kYXRhLCovCisgICAgbmV4dF9jaGFubmVsLCBnbG9iYWxfZ2FpbiwgaWNzX2luZm8sIHNlY3Rpb25fZGF0YSwgc2NhbGVfZmFjdG9yX2RhdGEsIHB1bHNlLAorICAgIHRuc19kYXRhX3ByZXNlbnQsIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCisgICAgLypnYWluX2NvbnRyb2xfZGF0YSwqLworICAgIG5leHRfY2hhbm5lbCwgZXNjMV9oY3IsICAvKmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMsIGxlbmd0aF9vZl9ydmxjX3NmICovCisgICAgbmV4dF9jaGFubmVsLCBlc2MxX2hjciwgIC8qbGVuZ3RoX29mX3J2bGNfZXNjYXBlcywgbGVuZ3RoX29mX3J2bGNfc2YgKi8KKyAgICBuZXh0X2NoYW5uZWwsIGVzYzJfcnZsYywgLyogcnZsY19jb2Rfc2YsIHJ2bGNfZXNjX3NmICovCisgICAgbmV4dF9jaGFubmVsLCBlc2MyX3J2bGMsIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLworICAgIG5leHRfY2hhbm5lbCwgdG5zX2RhdGEsIG5leHRfY2hhbm5lbCwgdG5zX2RhdGEsIG5leHRfY2hhbm5lbCwgc3BlY3RyYWxfZGF0YSwKKyAgICBuZXh0X2NoYW5uZWwsIHNwZWN0cmFsX2RhdGEsIGVuZF9vZl9zZXF1ZW5jZX07CiAKIHN0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9hYWNfY3BlMV9lcGMxW10gPSB7Ci0gIGljc19pbmZvLAotICBtcywKLSAgbHRwX2RhdGFfcHJlc2VudCwKLSAgLyogbHRwX2RhdGEsICovCi0gIGdsb2JhbF9nYWluLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICBwdWxzZSwKLSAgdG5zX2RhdGFfcHJlc2VudCwKLSAgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKLSAgLypnYWluX2NvbnRyb2xfZGF0YSwqLwotICBuZXh0X2NoYW5uZWwsCisgICAgaWNzX2luZm8sIG1zLCBsdHBfZGF0YV9wcmVzZW50LAorICAgIC8qIGx0cF9kYXRhLCAqLworICAgIGdsb2JhbF9nYWluLCBzZWN0aW9uX2RhdGEsIHNjYWxlX2ZhY3Rvcl9kYXRhLCBwdWxzZSwgdG5zX2RhdGFfcHJlc2VudCwKKyAgICBnYWluX2NvbnRyb2xfZGF0YV9wcmVzZW50LAorICAgIC8qZ2Fpbl9jb250cm9sX2RhdGEsKi8KKyAgICBuZXh0X2NoYW5uZWwsCiAKLSAgbHRwX2RhdGFfcHJlc2VudCwKLSAgLyogbHRwX2RhdGEsICovCi0gIGdsb2JhbF9nYWluLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICBwdWxzZSwKLSAgdG5zX2RhdGFfcHJlc2VudCwKLSAgZ2Fpbl9jb250cm9sX2RhdGFfcHJlc2VudCwKLSAgLypnYWluX2NvbnRyb2xfZGF0YSwqLwotICBuZXh0X2NoYW5uZWwsCi0gIGVzYzFfaGNyLCAgLypsZW5ndGhfb2ZfcnZsY19lc2NhcGVzLCBsZW5ndGhfb2ZfcnZsY19zZiAqLwotICBuZXh0X2NoYW5uZWwsCi0gIGVzYzFfaGNyLCAgLypsZW5ndGhfb2ZfcnZsY19lc2NhcGVzLCBsZW5ndGhfb2ZfcnZsY19zZiAqLwotICBuZXh0X2NoYW5uZWwsCi0gIGVzYzJfcnZsYywgIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLwotICBuZXh0X2NoYW5uZWwsCi0gIGVzYzJfcnZsYywgIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLworICAgIGx0cF9kYXRhX3ByZXNlbnQsCisgICAgLyogbHRwX2RhdGEsICovCisgICAgZ2xvYmFsX2dhaW4sIHNlY3Rpb25fZGF0YSwgc2NhbGVfZmFjdG9yX2RhdGEsIHB1bHNlLCB0bnNfZGF0YV9wcmVzZW50LAorICAgIGdhaW5fY29udHJvbF9kYXRhX3ByZXNlbnQsCisgICAgLypnYWluX2NvbnRyb2xfZGF0YSwqLworICAgIG5leHRfY2hhbm5lbCwgZXNjMV9oY3IsICAvKmxlbmd0aF9vZl9ydmxjX2VzY2FwZXMsIGxlbmd0aF9vZl9ydmxjX3NmICovCisgICAgbmV4dF9jaGFubmVsLCBlc2MxX2hjciwgIC8qbGVuZ3RoX29mX3J2bGNfZXNjYXBlcywgbGVuZ3RoX29mX3J2bGNfc2YgKi8KKyAgICBuZXh0X2NoYW5uZWwsIGVzYzJfcnZsYywgLyogcnZsY19jb2Rfc2YsIHJ2bGNfZXNjX3NmICovCisgICAgbmV4dF9jaGFubmVsLCBlc2MyX3J2bGMsIC8qIHJ2bGNfY29kX3NmLCBydmxjX2VzY19zZiAqLwogCi0gIG5leHRfY2hhbm5lbCwKLSAgdG5zX2RhdGEsCi0gIG5leHRfY2hhbm5lbCwKLSAgdG5zX2RhdGEsCi0gIG5leHRfY2hhbm5lbCwKLSAgc3BlY3RyYWxfZGF0YSwKLSAgbmV4dF9jaGFubmVsLAotICBzcGVjdHJhbF9kYXRhLAotICBlbmRfb2Zfc2VxdWVuY2UKLX07CisgICAgbmV4dF9jaGFubmVsLCB0bnNfZGF0YSwgbmV4dF9jaGFubmVsLCB0bnNfZGF0YSwgbmV4dF9jaGFubmVsLCBzcGVjdHJhbF9kYXRhLAorICAgIG5leHRfY2hhbm5lbCwgc3BlY3RyYWxfZGF0YSwgZW5kX29mX3NlcXVlbmNlfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9hYWNfY3BlMF9lcGMxID0gewotICBlbF9hYWNfY3BlMF9lcGMxLAotICB7IE5VTEwsIE5VTEwgfQotfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfYWFjX2NwZTBfZXBjMSA9IHtlbF9hYWNfY3BlMF9lcGMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMLCBOVUxMfX07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfYWFjX2NwZTFfZXBjMSA9IHsKLSAgZWxfYWFjX2NwZTFfZXBjMSwKLSAgeyBOVUxMLCBOVUxMIH0KLX07CitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2FhY19jcGUxX2VwYzEgPSB7ZWxfYWFjX2NwZTFfZXBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7TlVMTCwgTlVMTH19OwogCiBzdGF0aWMgY29uc3QgZWxlbWVudF9saXN0X3Qgbm9kZV9hYWNfY3BlX2VwYzEgPSB7Ci0gIGVsX2FhY19jcGUsCi0gIHsgJm5vZGVfYWFjX2NwZTBfZXBjMSwgJm5vZGVfYWFjX2NwZTFfZXBjMSB9Ci19OworICAgIGVsX2FhY19jcGUsIHsmbm9kZV9hYWNfY3BlMF9lcGMxLCAmbm9kZV9hYWNfY3BlMV9lcGMxfX07CiAKIC8qCiAgKiBBT1QgPSAyMAogICogZXBDb25maWcgPSAwCiAgKi8KLXN0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9zY2FsX3NjZV9lcGMwW10gPSB7Ci0gIGljc19pbmZvLCAgICAgICAgICAgIC8qIEVTQyAxICovCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIGx0cF9kYXRhX3ByZXNlbnQsCi0gIC8qIGx0cF9kYXRhLCAqLwotICBnbG9iYWxfZ2FpbiwKLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgZXNjMV9oY3IsCi0gIGVzYzJfcnZsYywgICAgICAgICAgIC8qIEVTQyAyICovCi0gIHRuc19kYXRhLCAgICAgICAgICAgIC8qIEVTQyAzICovCi0gIHNwZWN0cmFsX2RhdGEsICAgICAgIC8qIEVTQyA0ICovCi0gIGVuZF9vZl9zZXF1ZW5jZQotfTsKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9zY2FsX3NjZV9lcGMwW10gPSB7aWNzX2luZm8sIC8qIEVTQyAxICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc19kYXRhX3ByZXNlbnQsIGx0cF9kYXRhX3ByZXNlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGx0cF9kYXRhLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfZ2Fpbiwgc2VjdGlvbl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9mYWN0b3JfZGF0YSwgZXNjMV9oY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzYzJfcnZsYywgICAgIC8qIEVTQyAyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc19kYXRhLCAgICAgIC8qIEVTQyAzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWN0cmFsX2RhdGEsIC8qIEVTQyA0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9vZl9zZXF1ZW5jZX07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfc2NhbF9zY2VfZXBjMCA9IHsKLSAgZWxfc2NhbF9zY2VfZXBjMCwKLSAgeyBOVUxMLCBOVUxMIH0KLX07CitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX3NjYWxfc2NlX2VwYzAgPSB7ZWxfc2NhbF9zY2VfZXBjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7TlVMTCwgTlVMTH19OwogCiBzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfc2NhbF9jcGVfZXBjMFtdID0gewotICBpY3NfaW5mbywgICAgICAgICAgICAvKiBFU0MgMCAqLwotICBtcywKLSAgdG5zX2RhdGFfcHJlc2VudCwgICAgLyogRVNDIDEgKGNoIDApICovCi0gIGx0cF9kYXRhX3ByZXNlbnQsCi0gIC8qIGx0cF9kYXRhLCAqLwotICBnbG9iYWxfZ2FpbiwKLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgZXNjMV9oY3IsCi0gIGVzYzJfcnZsYywgICAgICAgICAgIC8qIEVTQyAyIChjaCAwKSAqLwotICB0bnNfZGF0YSwgICAgICAgICAgICAvKiBFU0MgMyAoY2ggMCkgKi8KLSAgc3BlY3RyYWxfZGF0YSwgICAgICAgLyogRVNDIDQgKGNoIDApICovCi0gIG5leHRfY2hhbm5lbCwKLSAgdG5zX2RhdGFfcHJlc2VudCwgICAgLyogRVNDIDEgKGNoIDEpICovCi0gIGx0cF9kYXRhX3ByZXNlbnQsCi0gIGdsb2JhbF9nYWluLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICBlc2MxX2hjciwKLSAgZXNjMl9ydmxjLCAgICAgICAgICAgLyogRVNDIDIgKGNoIDEpICovCi0gIHRuc19kYXRhLCAgICAgICAgICAgIC8qIEVTQyAzIChjaCAxKSAqLwotICBzcGVjdHJhbF9kYXRhLCAgICAgICAvKiBFU0MgNCAoY2ggMSkgKi8KLSAgZW5kX29mX3NlcXVlbmNlCi19OworICAgIGljc19pbmZvLCAgICAgICAgICAgICAvKiBFU0MgMCAqLworICAgIG1zLCB0bnNfZGF0YV9wcmVzZW50LCAvKiBFU0MgMSAoY2ggMCkgKi8KKyAgICBsdHBfZGF0YV9wcmVzZW50LAorICAgIC8qIGx0cF9kYXRhLCAqLworICAgIGdsb2JhbF9nYWluLCBzZWN0aW9uX2RhdGEsIHNjYWxlX2ZhY3Rvcl9kYXRhLCBlc2MxX2hjciwKKyAgICBlc2MyX3J2bGMsICAgICAgICAgICAgICAgICAgICAgIC8qIEVTQyAyIChjaCAwKSAqLworICAgIHRuc19kYXRhLCAgICAgICAgICAgICAgICAgICAgICAgLyogRVNDIDMgKGNoIDApICovCisgICAgc3BlY3RyYWxfZGF0YSwgICAgICAgICAgICAgICAgICAvKiBFU0MgNCAoY2ggMCkgKi8KKyAgICBuZXh0X2NoYW5uZWwsIHRuc19kYXRhX3ByZXNlbnQsIC8qIEVTQyAxIChjaCAxKSAqLworICAgIGx0cF9kYXRhX3ByZXNlbnQsIGdsb2JhbF9nYWluLCBzZWN0aW9uX2RhdGEsIHNjYWxlX2ZhY3Rvcl9kYXRhLCBlc2MxX2hjciwKKyAgICBlc2MyX3J2bGMsICAgICAvKiBFU0MgMiAoY2ggMSkgKi8KKyAgICB0bnNfZGF0YSwgICAgICAvKiBFU0MgMyAoY2ggMSkgKi8KKyAgICBzcGVjdHJhbF9kYXRhLCAvKiBFU0MgNCAoY2ggMSkgKi8KKyAgICBlbmRfb2Zfc2VxdWVuY2V9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX3NjYWxfY3BlX2VwYzAgPSB7Ci0gIGVsX3NjYWxfY3BlX2VwYzAsCi0gIHsgTlVMTCwgTlVMTCB9Ci19Oworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9zY2FsX2NwZV9lcGMwID0ge2VsX3NjYWxfY3BlX2VwYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge05VTEwsIE5VTEx9fTsKIAogLyoKICAqIEFPVCA9IDIwCiAgKiBlcENvbmZpZyA9IDEKICAqLwogc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX3NjYWxfc2NlX2VwYzFbXSA9IHsKLSAgaWNzX2luZm8sCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIGx0cF9kYXRhX3ByZXNlbnQsCi0gIC8qIGx0cF9kYXRhLCAqLwotICBnbG9iYWxfZ2FpbiwKLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgZXNjMV9oY3IsCi0gIHRuc19kYXRhLAotICBzcGVjdHJhbF9kYXRhLAotICBlbmRfb2Zfc2VxdWVuY2UKLX07CisgICAgaWNzX2luZm8sIHRuc19kYXRhX3ByZXNlbnQsIGx0cF9kYXRhX3ByZXNlbnQsCisgICAgLyogbHRwX2RhdGEsICovCisgICAgZ2xvYmFsX2dhaW4sIHNlY3Rpb25fZGF0YSwgc2NhbGVfZmFjdG9yX2RhdGEsIGVzYzFfaGNyLCB0bnNfZGF0YSwKKyAgICBzcGVjdHJhbF9kYXRhLCBlbmRfb2Zfc2VxdWVuY2V9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX3NjYWxfc2NlX2VwYzEgPSB7Ci0gIGVsX3NjYWxfc2NlX2VwYzEsCi0gIHsgTlVMTCwgTlVMTCB9Ci19Oworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9zY2FsX3NjZV9lcGMxID0ge2VsX3NjYWxfc2NlX2VwYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge05VTEwsIE5VTEx9fTsKIAogc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX3NjYWxfY3BlX2VwYzFbXSA9IHsKLSAgaWNzX2luZm8sCi0gIG1zLAotICB0bnNfZGF0YV9wcmVzZW50LAotICBsdHBfZGF0YV9wcmVzZW50LAotICAvKiBsdHBfZGF0YSwgKi8KLSAgZ2xvYmFsX2dhaW4sCi0gIHNlY3Rpb25fZGF0YSwKLSAgc2NhbGVfZmFjdG9yX2RhdGEsCi0gIGVzYzFfaGNyLAotICBuZXh0X2NoYW5uZWwsCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIGx0cF9kYXRhX3ByZXNlbnQsCi0gIC8qIGx0cF9kYXRhLCAqLwotICBnbG9iYWxfZ2FpbiwKLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgZXNjMV9oY3IsCi0gIG5leHRfY2hhbm5lbCwKLSAgdG5zX2RhdGEsCi0gIG5leHRfY2hhbm5lbCwKLSAgdG5zX2RhdGEsCi0gIG5leHRfY2hhbm5lbCwKLSAgc3BlY3RyYWxfZGF0YSwKLSAgbmV4dF9jaGFubmVsLAotICBzcGVjdHJhbF9kYXRhLAotICBlbmRfb2Zfc2VxdWVuY2UKLX07CisgICAgaWNzX2luZm8sIG1zLCB0bnNfZGF0YV9wcmVzZW50LCBsdHBfZGF0YV9wcmVzZW50LAorICAgIC8qIGx0cF9kYXRhLCAqLworICAgIGdsb2JhbF9nYWluLCBzZWN0aW9uX2RhdGEsIHNjYWxlX2ZhY3Rvcl9kYXRhLCBlc2MxX2hjciwgbmV4dF9jaGFubmVsLAorICAgIHRuc19kYXRhX3ByZXNlbnQsIGx0cF9kYXRhX3ByZXNlbnQsCisgICAgLyogbHRwX2RhdGEsICovCisgICAgZ2xvYmFsX2dhaW4sIHNlY3Rpb25fZGF0YSwgc2NhbGVfZmFjdG9yX2RhdGEsIGVzYzFfaGNyLCBuZXh0X2NoYW5uZWwsCisgICAgdG5zX2RhdGEsIG5leHRfY2hhbm5lbCwgdG5zX2RhdGEsIG5leHRfY2hhbm5lbCwgc3BlY3RyYWxfZGF0YSwgbmV4dF9jaGFubmVsLAorICAgIHNwZWN0cmFsX2RhdGEsIGVuZF9vZl9zZXF1ZW5jZX07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfc2NhbF9jcGVfZXBjMSA9IHsKLSAgZWxfc2NhbF9jcGVfZXBjMSwKLSAgeyBOVUxMLCBOVUxMIH0KLX07CitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX3NjYWxfY3BlX2VwYzEgPSB7ZWxfc2NhbF9jcGVfZXBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7TlVMTCwgTlVMTH19OwogCiAvKgogICogUHNldWRvIEFPVCBmb3IgRFJNL0RSTSsgKHNpbWlsYXIgdG8gQU9UIDIwKQotICogRGVyaXZlZCBmcm9tIGVwQ29uZmlnID0gMQogICovCiBzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfZHJtX3NjZVtdID0gewotICBkcm1jcmNfc3RhcnRfcmVnLAotICBpY3NfaW5mbywKLSAgdG5zX2RhdGFfcHJlc2VudCwKLSAgbHRwX2RhdGFfcHJlc2VudCwKLSAgLyogbHRwX2RhdGEsICovCi0gIGdsb2JhbF9nYWluLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICBlc2MxX2hjciwKLSAgdG5zX2RhdGEsCi0gIGRybWNyY19lbmRfcmVnLAotICBzcGVjdHJhbF9kYXRhLAotICBlbmRfb2Zfc2VxdWVuY2UKLX07CisgICAgZHJtY3JjX3N0YXJ0X3JlZywgaWNzX2luZm8sIHRuc19kYXRhX3ByZXNlbnQsIGx0cF9kYXRhX3ByZXNlbnQsCisgICAgLyogbHRwX2RhdGEsICovCisgICAgZ2xvYmFsX2dhaW4sIHNlY3Rpb25fZGF0YSwgc2NhbGVfZmFjdG9yX2RhdGEsIGVzYzFfaGNyLCB0bnNfZGF0YSwKKyAgICBkcm1jcmNfZW5kX3JlZywgc3BlY3RyYWxfZGF0YSwgZW5kX29mX3NlcXVlbmNlfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9kcm1fc2NlID0gewotICBlbF9kcm1fc2NlLAotICB7IE5VTEwsIE5VTEwgfQotfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfZHJtX3NjZSA9IHtlbF9kcm1fc2NlLCB7TlVMTCwgTlVMTH19OwogCiBzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfZHJtX2NwZVtdID0gewotICBkcm1jcmNfc3RhcnRfcmVnLAotICBpY3NfaW5mbywKLSAgbXMsCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIGx0cF9kYXRhX3ByZXNlbnQsCi0gIC8qIGx0cF9kYXRhLCAqLwotICBnbG9iYWxfZ2FpbiwKLSAgc2VjdGlvbl9kYXRhLAotICBzY2FsZV9mYWN0b3JfZGF0YSwKLSAgZXNjMV9oY3IsCi0gIG5leHRfY2hhbm5lbCwKLSAgdG5zX2RhdGFfcHJlc2VudCwKLSAgbHRwX2RhdGFfcHJlc2VudCwKLSAgLyogbHRwX2RhdGEsICovCi0gIGdsb2JhbF9nYWluLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICBlc2MxX2hjciwKLSAgbmV4dF9jaGFubmVsLAotICB0bnNfZGF0YSwKLSAgbmV4dF9jaGFubmVsLAotICB0bnNfZGF0YSwKLSAgZHJtY3JjX2VuZF9yZWcsCi0gIG5leHRfY2hhbm5lbCwKLSAgc3BlY3RyYWxfZGF0YSwKLSAgbmV4dF9jaGFubmVsLAotICBzcGVjdHJhbF9kYXRhLAotICBlbmRfb2Zfc2VxdWVuY2UKLX07CisgICAgZHJtY3JjX3N0YXJ0X3JlZywgaWNzX2luZm8sIG1zLCB0bnNfZGF0YV9wcmVzZW50LCBsdHBfZGF0YV9wcmVzZW50LAorICAgIC8qIGx0cF9kYXRhLCAqLworICAgIGdsb2JhbF9nYWluLCBzZWN0aW9uX2RhdGEsIHNjYWxlX2ZhY3Rvcl9kYXRhLCBlc2MxX2hjciwgbmV4dF9jaGFubmVsLAorICAgIHRuc19kYXRhX3ByZXNlbnQsIGx0cF9kYXRhX3ByZXNlbnQsCisgICAgLyogbHRwX2RhdGEsICovCisgICAgZ2xvYmFsX2dhaW4sIHNlY3Rpb25fZGF0YSwgc2NhbGVfZmFjdG9yX2RhdGEsIGVzYzFfaGNyLCBuZXh0X2NoYW5uZWwsCisgICAgdG5zX2RhdGEsIG5leHRfY2hhbm5lbCwgdG5zX2RhdGEsIGRybWNyY19lbmRfcmVnLCBuZXh0X2NoYW5uZWwsCisgICAgc3BlY3RyYWxfZGF0YSwgbmV4dF9jaGFubmVsLCBzcGVjdHJhbF9kYXRhLCBlbmRfb2Zfc2VxdWVuY2V9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2RybV9jcGUgPSB7Ci0gIGVsX2RybV9jcGUsCi0gIHsgTlVMTCwgTlVMTCB9Ci19Oworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9kcm1fY3BlID0ge2VsX2RybV9jcGUsIHtOVUxMLCBOVUxMfX07CiAKIC8qCiAgKiBBT1QgPSAzOQogICogZXBDb25maWcgPSAwCiAgKi8KIHN0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9lbGRfc2NlX2VwYzBbXSA9IHsKLSAgZ2xvYmFsX2dhaW4sCi0gIGljc19pbmZvLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICB0bnNfZGF0YV9wcmVzZW50LAotICB0bnNfZGF0YSwKLSAgZXNjMV9oY3IsCi0gIGVzYzJfcnZsYywKLSAgc3BlY3RyYWxfZGF0YSwKLSAgZW5kX29mX3NlcXVlbmNlCi19OworICAgIGdsb2JhbF9nYWluLCBpY3NfaW5mbywgc2VjdGlvbl9kYXRhLCBzY2FsZV9mYWN0b3JfZGF0YSwgdG5zX2RhdGFfcHJlc2VudCwKKyAgICB0bnNfZGF0YSwgICAgZXNjMV9oY3IsIGVzYzJfcnZsYywgICAgc3BlY3RyYWxfZGF0YSwgICAgIGVuZF9vZl9zZXF1ZW5jZX07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfZWxkX3NjZV9lcGMwID0gewotICBlbF9lbGRfc2NlX2VwYzAsCi0gIHsgTlVMTCwgTlVMTCB9Ci19Oworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9lbGRfc2NlX2VwYzAgPSB7ZWxfZWxkX3NjZV9lcGMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge05VTEwsIE5VTEx9fTsKIAogI2RlZmluZSBub2RlX2VsZF9zY2VfZXBjMSBub2RlX2VsZF9zY2VfZXBjMAogCi1zdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfZWxkX2NwZV9lcGMwW10gPSB7Ci0gIGljc19pbmZvLAotICBtcywKLSAgZ2xvYmFsX2dhaW4sCi0gIHNlY3Rpb25fZGF0YSwKLSAgc2NhbGVfZmFjdG9yX2RhdGEsCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIHRuc19kYXRhLAotICBlc2MxX2hjciwKLSAgZXNjMl9ydmxjLAotICBzcGVjdHJhbF9kYXRhLAotICBuZXh0X2NoYW5uZWwsCi0gIGdsb2JhbF9nYWluLAotICBzZWN0aW9uX2RhdGEsCi0gIHNjYWxlX2ZhY3Rvcl9kYXRhLAotICB0bnNfZGF0YV9wcmVzZW50LAotICB0bnNfZGF0YSwKLSAgZXNjMV9oY3IsCi0gIGVzYzJfcnZsYywKLSAgc3BlY3RyYWxfZGF0YSwKLSAgZW5kX29mX3NlcXVlbmNlCi19Oworc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX2VsZF9jcGVfZXBjMFtdID0ge2ljc19pbmZvLCAgICAgICAgICBtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfZ2FpbiwgICAgICAgc2VjdGlvbl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2ZhY3Rvcl9kYXRhLCB0bnNfZGF0YV9wcmVzZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc19kYXRhLCAgICAgICAgICBlc2MxX2hjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2MyX3J2bGMsICAgICAgICAgc3BlY3RyYWxfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2NoYW5uZWwsICAgICAgZ2xvYmFsX2dhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbl9kYXRhLCAgICAgIHNjYWxlX2ZhY3Rvcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc19kYXRhX3ByZXNlbnQsICB0bnNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2MxX2hjciwgICAgICAgICAgZXNjMl9ydmxjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWN0cmFsX2RhdGEsICAgICBlbmRfb2Zfc2VxdWVuY2V9OwogCi1zdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfZWxkX2NwZV9lcGMxW10gPSB7Ci0gIGljc19pbmZvLAotICBtcywKLSAgZ2xvYmFsX2dhaW4sCi0gIHNlY3Rpb25fZGF0YSwKLSAgc2NhbGVfZmFjdG9yX2RhdGEsCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIG5leHRfY2hhbm5lbCwKLSAgZ2xvYmFsX2dhaW4sCi0gIHNlY3Rpb25fZGF0YSwKLSAgc2NhbGVfZmFjdG9yX2RhdGEsCi0gIHRuc19kYXRhX3ByZXNlbnQsCi0gIG5leHRfY2hhbm5lbCwKLSAgdG5zX2RhdGEsCi0gIG5leHRfY2hhbm5lbCwKLSAgdG5zX2RhdGEsCi0gIG5leHRfY2hhbm5lbCwKLSAgZXNjMV9oY3IsCi0gIGVzYzJfcnZsYywKLSAgc3BlY3RyYWxfZGF0YSwKLSAgbmV4dF9jaGFubmVsLAotICBlc2MxX2hjciwKLSAgZXNjMl9ydmxjLAotICBzcGVjdHJhbF9kYXRhLAotICBlbmRfb2Zfc2VxdWVuY2UKLX07CitzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfZWxkX2NwZV9lcGMxW10gPSB7aWNzX2luZm8sICAgICAgICAgIG1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF9nYWluLCAgICAgICBzZWN0aW9uX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfZmFjdG9yX2RhdGEsIHRuc19kYXRhX3ByZXNlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9jaGFubmVsLCAgICAgIGdsb2JhbF9nYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25fZGF0YSwgICAgICBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNfZGF0YV9wcmVzZW50LCAgbmV4dF9jaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc19kYXRhLCAgICAgICAgICBuZXh0X2NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zX2RhdGEsICAgICAgICAgIG5leHRfY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2MxX2hjciwgICAgICAgICAgZXNjMl9ydmxjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWN0cmFsX2RhdGEsICAgICBuZXh0X2NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjMV9oY3IsICAgICAgICAgIGVzYzJfcnZsYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjdHJhbF9kYXRhLCAgICAgZW5kX29mX3NlcXVlbmNlfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9lbGRfY3BlX2VwYzAgPSB7Ci0gIGVsX2VsZF9jcGVfZXBjMCwKLSAgeyBOVUxMLCBOVUxMIH0KLX07CitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2VsZF9jcGVfZXBjMCA9IHtlbF9lbGRfY3BlX2VwYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7TlVMTCwgTlVMTH19OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX2VsZF9jcGVfZXBjMSA9IHsKLSAgZWxfZWxkX2NwZV9lcGMxLAotICB7IE5VTEwsIE5VTEwgfQotfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfZWxkX2NwZV9lcGMxID0ge2VsX2VsZF9jcGVfZXBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMLCBOVUxMfX07CiAKKy8qCisgKiBBT1QgPSA0MgorICogZXBDb25maWcgPSAwCisgKi8KIAotY29uc3QgZWxlbWVudF9saXN0X3QgKiBnZXRCaXRzdHJlYW1FbGVtZW50TGlzdChBVURJT19PQkpFQ1RfVFlQRSBhb3QsIFNDSEFSIGVwQ29uZmlnLCBVQ0hBUiBuQ2hhbm5lbHMsIFVDSEFSIGxheWVyKQoteworc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX3VzYWNfY29yZW1vZGVbXSA9IHtjb3JlX21vZGUsIG5leHRfY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua19zZXF1ZW5jZX07CisKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF91c2FjX3NjZTBfZXBjMFtdID0geworICAgIHRuc19kYXRhX3ByZXNlbnQsCisgICAgLyogZmRfY2hhbm5lbF9zdHJlYW0gKi8KKyAgICBnbG9iYWxfZ2Fpbiwgbm9pc2UsIGljc19pbmZvLCB0d19kYXRhLCBzY2FsZV9mYWN0b3JfZGF0YV91c2FjLCB0bnNfZGF0YSwKKyAgICBhY19zcGVjdHJhbF9kYXRhLCBmYWNfZGF0YSwgZW5kX29mX3NlcXVlbmNlfTsKKworc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX3VzYWNfbGZlX2VwYzBbXSA9IHsKKyAgICAvKiBmZF9jaGFubmVsX3N0cmVhbSAqLworICAgIGdsb2JhbF9nYWluLCAgICAgIGljc19pbmZvLCBzY2FsZV9mYWN0b3JfZGF0YV91c2FjLAorICAgIGFjX3NwZWN0cmFsX2RhdGEsIGZhY19kYXRhLCBlbmRfb2Zfc2VxdWVuY2V9OworCitzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfdXNhY19scGRfZXBjMFtdID0ge2xwZF9jaGFubmVsX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX29mX3NlcXVlbmNlfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV91c2FjX3NjZTBfZXBjMCA9IHtlbF91c2FjX3NjZTBfZXBjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge05VTEwsIE5VTEx9fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV91c2FjX3NjZTFfZXBjMCA9IHtlbF91c2FjX2xwZF9lcGMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7TlVMTCwgTlVMTH19OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX3VzYWNfc2NlX2VwYzAgPSB7CisgICAgZWxfdXNhY19jb3JlbW9kZSwgeyZub2RlX3VzYWNfc2NlMF9lcGMwLCAmbm9kZV91c2FjX3NjZTFfZXBjMH19OworCitzdGF0aWMgY29uc3QgcmJkX2lkX3QgbGlzdF91c2FjX2NwZTAwX2VwYzBbXSA9IHt0bnNfYWN0aXZlLCBjb21tb25fd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua19zZXF1ZW5jZX07CisKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF91c2FjX2NvbW1vbl90d1tdID0ge2NvbW1vbl90dywgbGlua19zZXF1ZW5jZX07CisKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBsaXN0X3VzYWNfY3BlMDAwMF9lcGMwW10gPSB7CisgICAgLyogY29yZV9tb2RlMCA9IDAgKi8KKyAgICAvKiBjb3JlX21vZGUxID0gMCAqLworICAgIC8qIGNvbW1vbl93aW5kb3cgPSAwICovCisgICAgLyogY29tbW9uX3R3ID0gMCAqLworICAgIHRuc19kYXRhX3ByZXNlbnRfdXNhYywKKyAgICBnbG9iYWxfZ2FpbiwKKyAgICBub2lzZSwKKyAgICBpY3NfaW5mbywKKyAgICB0d19kYXRhLAorICAgIHNjYWxlX2ZhY3Rvcl9kYXRhX3VzYWMsCisgICAgdG5zX2RhdGEsCisgICAgYWNfc3BlY3RyYWxfZGF0YSwKKyAgICBmYWNfZGF0YSwKKyAgICBuZXh0X2NoYW5uZWwsCisgICAgZ2xvYmFsX2dhaW4sCisgICAgbm9pc2UsCisgICAgaWNzX2luZm8sCisgICAgdHdfZGF0YSwKKyAgICBzY2FsZV9mYWN0b3JfZGF0YV91c2FjLAorICAgIHRuc19kYXRhLAorICAgIGFjX3NwZWN0cmFsX2RhdGEsCisgICAgZmFjX2RhdGEsCisgICAgZW5kX29mX3NlcXVlbmNlfTsKKworc3RhdGljIGNvbnN0IHJiZF9pZF90IGxpc3RfdXNhY19jcGUwMDAxX2VwYzBbXSA9IHsKKyAgICAvKgorICAgIGNvcmVfbW9kZTAgPSAwCisgICAgY29yZV9tb2RlMSA9IDAKKyAgICBjb21tb25fd2luZG93ID0gMAorICAgIGNvbW1vbl90dyA9IDEKKyAgICAqLworICAgIHR3X2RhdGEsICB0bnNfZGF0YV9wcmVzZW50X3VzYWMsICBnbG9iYWxfZ2Fpbiwgbm9pc2UsCisgICAgaWNzX2luZm8sIHNjYWxlX2ZhY3Rvcl9kYXRhX3VzYWMsIHRuc19kYXRhLCAgICBhY19zcGVjdHJhbF9kYXRhLAorICAgIGZhY19kYXRhLCBuZXh0X2NoYW5uZWwsICAgICAgICAgICBnbG9iYWxfZ2Fpbiwgbm9pc2UsCisgICAgaWNzX2luZm8sIHNjYWxlX2ZhY3Rvcl9kYXRhX3VzYWMsIHRuc19kYXRhLCAgICBhY19zcGVjdHJhbF9kYXRhLAorICAgIGZhY19kYXRhLCBlbmRfb2Zfc2VxdWVuY2V9OworCitzdGF0aWMgY29uc3QgcmJkX2lkX3QgbGlzdF91c2FjX2NwZTAwMV9lcGMwW10gPSB7CisgICAgLyogY29yZV9tb2RlMCA9IDAgKi8KKyAgICAvKiBjb3JlX21vZGUxID0gMCAqLworICAgIC8qIGNvbW1vbl93aW5kb3cgPSAxICovCisgICAgaWNzX2luZm8sIGNvbW1vbl9tYXhfc2ZiLCBtcywgY29tbW9uX3R3LCBsaW5rX3NlcXVlbmNlfTsKKworc3RhdGljIGNvbnN0IHJiZF9pZF90IGxpc3RfdXNhY19jcGUwMDEwX2VwYzBbXSA9IHsKKyAgICAvKiBjb3JlX21vZGUwID0gMCAqLworICAgIC8qIGNvcmVfbW9kZTEgPSAwICovCisgICAgLyogY29tbW9uX3dpbmRvdyA9IDEgKi8KKyAgICAvKiBjb21tb25fdHcgPSAwICovCisgICAgdG5zX2RhdGFfcHJlc2VudF91c2FjLAorICAgIGdsb2JhbF9nYWluLAorICAgIG5vaXNlLAorICAgIHR3X2RhdGEsCisgICAgc2NhbGVfZmFjdG9yX2RhdGFfdXNhYywKKyAgICB0bnNfZGF0YSwKKyAgICBhY19zcGVjdHJhbF9kYXRhLAorICAgIGZhY19kYXRhLAorICAgIG5leHRfY2hhbm5lbCwKKyAgICBnbG9iYWxfZ2FpbiwKKyAgICBub2lzZSwKKyAgICB0d19kYXRhLAorICAgIHNjYWxlX2ZhY3Rvcl9kYXRhX3VzYWMsCisgICAgdG5zX2RhdGEsCisgICAgYWNfc3BlY3RyYWxfZGF0YSwKKyAgICBmYWNfZGF0YSwKKyAgICBlbmRfb2Zfc2VxdWVuY2V9OworCitzdGF0aWMgY29uc3QgcmJkX2lkX3QgbGlzdF91c2FjX2NwZTAwMTFfZXBjMFtdID0geworICAgIC8qIGNvcmVfbW9kZTAgPSAwICovCisgICAgLyogY29yZV9tb2RlMSA9IDAgKi8KKyAgICAvKiBjb21tb25fd2luZG93ID0gMSAqLworICAgIC8qIGNvbW1vbl90dyA9IDEgKi8KKyAgICB0d19kYXRhLAorICAgIHRuc19kYXRhX3ByZXNlbnRfdXNhYywKKyAgICBnbG9iYWxfZ2FpbiwKKyAgICBub2lzZSwKKyAgICBzY2FsZV9mYWN0b3JfZGF0YV91c2FjLAorICAgIHRuc19kYXRhLAorICAgIGFjX3NwZWN0cmFsX2RhdGEsCisgICAgZmFjX2RhdGEsCisgICAgbmV4dF9jaGFubmVsLAorICAgIGdsb2JhbF9nYWluLAorICAgIG5vaXNlLAorICAgIHNjYWxlX2ZhY3Rvcl9kYXRhX3VzYWMsCisgICAgdG5zX2RhdGEsCisgICAgYWNfc3BlY3RyYWxfZGF0YSwKKyAgICBmYWNfZGF0YSwKKyAgICBlbmRfb2Zfc2VxdWVuY2V9OworCitzdGF0aWMgY29uc3QgcmJkX2lkX3QgbGlzdF91c2FjX2NwZTEwX2VwYzBbXSA9IHsKKyAgICAvKiBjb3JlX21vZGUwID0gMSAqLworICAgIC8qIGNvcmVfbW9kZTEgPSAwICovCisgICAgbHBkX2NoYW5uZWxfc3RyZWFtLAorICAgIG5leHRfY2hhbm5lbCwKKyAgICB0bnNfZGF0YV9wcmVzZW50LAorICAgIGdsb2JhbF9nYWluLAorICAgIG5vaXNlLAorICAgIGljc19pbmZvLAorICAgIHR3X2RhdGEsCisgICAgc2NhbGVfZmFjdG9yX2RhdGFfdXNhYywKKyAgICB0bnNfZGF0YSwKKyAgICBhY19zcGVjdHJhbF9kYXRhLAorICAgIGZhY19kYXRhLAorICAgIGVuZF9vZl9zZXF1ZW5jZX07CisKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBsaXN0X3VzYWNfY3BlMDFfZXBjMFtdID0geworICAgIC8qIGNvcmVfbW9kZTAgPSAwICovCisgICAgLyogY29yZV9tb2RlMSA9IDEgKi8KKyAgICB0bnNfZGF0YV9wcmVzZW50LAorICAgIGdsb2JhbF9nYWluLAorICAgIG5vaXNlLAorICAgIGljc19pbmZvLAorICAgIHR3X2RhdGEsCisgICAgc2NhbGVfZmFjdG9yX2RhdGFfdXNhYywKKyAgICB0bnNfZGF0YSwKKyAgICBhY19zcGVjdHJhbF9kYXRhLAorICAgIGZhY19kYXRhLAorICAgIG5leHRfY2hhbm5lbCwKKyAgICBscGRfY2hhbm5lbF9zdHJlYW0sCisgICAgZW5kX29mX3NlcXVlbmNlfTsKKworc3RhdGljIGNvbnN0IHJiZF9pZF90IGxpc3RfdXNhY19jcGUxMV9lcGMwW10gPSB7CisgICAgLyogY29yZV9tb2RlMCA9IDEgKi8KKyAgICAvKiBjb3JlX21vZGUxID0gMSAqLworICAgIGxwZF9jaGFubmVsX3N0cmVhbSwgbmV4dF9jaGFubmVsLCBscGRfY2hhbm5lbF9zdHJlYW0sIGVuZF9vZl9zZXF1ZW5jZX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfdXNhY19jcGUwMDAwX2VwYzAgPSB7CisgICAgLyogY29yZV9tb2RlMCA9IDAgKi8KKyAgICAvKiBjb3JlX21vZGUxID0gMCAqLworICAgIC8qIGNvbW1vbl93aW5kb3cgPSAwICovCisgICAgLyogY29tbW9uX3R3ID0gMCAqLworICAgIGxpc3RfdXNhY19jcGUwMDAwX2VwYzAsCisgICAge05VTEwsIE5VTEx9fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV91c2FjX2NwZTAwMTBfZXBjMCA9IHsKKyAgICAvKiBjb3JlX21vZGUwID0gMCAqLworICAgIC8qIGNvcmVfbW9kZTEgPSAwICovCisgICAgLyogY29tbW9uX3dpbmRvdyA9IDEgKi8KKyAgICAvKiBjb21tb25fdHcgPSAwICovCisgICAgbGlzdF91c2FjX2NwZTAwMTBfZXBjMCwKKyAgICB7TlVMTCwgTlVMTH19OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX3VzYWNfY3BlMDAwMV9lcGMwID0geworICAgIC8qIGNvcmVfbW9kZTAgPSAwICovCisgICAgLyogY29yZV9tb2RlMSA9IDAgKi8KKyAgICAvKiBjb21tb25fd2luZG93ID0gMCAqLworICAgIC8qIGNvbW1vbl90dyA9IDEgKi8KKyAgICBsaXN0X3VzYWNfY3BlMDAwMV9lcGMwLAorICAgIHtOVUxMLCBOVUxMfX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfdXNhY19jcGUwMDExX2VwYzAgPSB7CisgICAgLyogY29yZV9tb2RlMCA9IDAgKi8KKyAgICAvKiBjb3JlX21vZGUxID0gMCAqLworICAgIC8qIGNvbW1vbl93aW5kb3cgPSAxICovCisgICAgLyogY29tbW9uX3R3ID0gMSAqLworICAgIGxpc3RfdXNhY19jcGUwMDExX2VwYzAsCisgICAge05VTEwsIE5VTEx9fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV91c2FjX2NwZTAwMF9lcGMwID0geworICAgIC8qIGNvcmVfbW9kZTAgPSAwICovCisgICAgLyogY29yZV9tb2RlMSA9IDAgKi8KKyAgICAvKiBjb21tb25fd2luZG93ID0gMCAqLworICAgIGVsX3VzYWNfY29tbW9uX3R3LAorICAgIHsmbm9kZV91c2FjX2NwZTAwMDBfZXBjMCwgJm5vZGVfdXNhY19jcGUwMDAxX2VwYzB9fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV91c2FjX2NwZTAwMV9lcGMwID0geworICAgIGxpc3RfdXNhY19jcGUwMDFfZXBjMCwgeyZub2RlX3VzYWNfY3BlMDAxMF9lcGMwLCAmbm9kZV91c2FjX2NwZTAwMTFfZXBjMH19OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX3VzYWNfY3BlMDBfZXBjMCA9IHsKKyAgICAvKiBjb3JlX21vZGUwID0gMCAqLworICAgIC8qIGNvcmVfbW9kZTEgPSAwICovCisgICAgbGlzdF91c2FjX2NwZTAwX2VwYzAsCisgICAgeyZub2RlX3VzYWNfY3BlMDAwX2VwYzAsICZub2RlX3VzYWNfY3BlMDAxX2VwYzB9fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV91c2FjX2NwZTEwX2VwYzAgPSB7CisgICAgLyogY29yZV9tb2RlMCA9IDEgKi8KKyAgICAvKiBjb3JlX21vZGUxID0gMCAqLworICAgIGxpc3RfdXNhY19jcGUxMF9lcGMwLAorICAgIHtOVUxMLCBOVUxMfX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfdXNhY19jcGUwMV9lcGMwID0ge2xpc3RfdXNhY19jcGUwMV9lcGMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge05VTEwsIE5VTEx9fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV91c2FjX2NwZTExX2VwYzAgPSB7bGlzdF91c2FjX2NwZTExX2VwYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7TlVMTCwgTlVMTH19OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX3VzYWNfY3BlMF9lcGMwID0geworICAgIC8qIGNvcmVfbW9kZTAgPSAwICovCisgICAgZWxfdXNhY19jb3JlbW9kZSwKKyAgICB7Jm5vZGVfdXNhY19jcGUwMF9lcGMwLCAmbm9kZV91c2FjX2NwZTAxX2VwYzB9fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV91c2FjX2NwZTFfZXBjMCA9IHsKKyAgICAvKiBjb3JlX21vZGUwID0gMSAqLworICAgIGVsX3VzYWNfY29yZW1vZGUsCisgICAgeyZub2RlX3VzYWNfY3BlMTBfZXBjMCwgJm5vZGVfdXNhY19jcGUxMV9lcGMwfX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfdXNhY19jcGVfZXBjMCA9IHsKKyAgICBlbF91c2FjX2NvcmVtb2RlLCB7Jm5vZGVfdXNhY19jcGUwX2VwYzAsICZub2RlX3VzYWNfY3BlMV9lcGMwfX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfdXNhY19sZmVfZXBjMCA9IHtlbF91c2FjX2xmZV9lcGMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtOVUxMLCBOVUxMfX07CisKK2NvbnN0IGVsZW1lbnRfbGlzdF90ICpnZXRCaXRzdHJlYW1FbGVtZW50TGlzdChBVURJT19PQkpFQ1RfVFlQRSBhb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgZXBDb25maWcsIFVDSEFSIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBsYXllciwgVUlOVCBlbEZsYWdzKSB7CiAgIHN3aXRjaCAoYW90KSB7CiAgICAgY2FzZSBBT1RfQUFDX0xDOgogICAgIGNhc2UgQU9UX1NCUjoKICAgICBjYXNlIEFPVF9QUzoKICAgICAgIEZES19BU1NFUlQoZXBDb25maWcgPT0gLTEpOwotICAgICAgaWYgKG5DaGFubmVscyA9PSAxKSB7Ci0gICAgICAgIHJldHVybiAmbm9kZV9hYWNfc2NlOworICAgICAgaWYgKGVsRmxhZ3MgJiBBQ19FTF9HQV9DQ0UpIHsKKyAgICAgICAgcmV0dXJuICZub2RlX2FhY19jY2U7CiAgICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gJm5vZGVfYWFjX2NwZTsKKyAgICAgICAgaWYgKG5DaGFubmVscyA9PSAxKSB7CisgICAgICAgICAgcmV0dXJuICZub2RlX2FhY19zY2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuICZub2RlX2FhY19jcGU7CisgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGJyZWFrOwogICAgIGNhc2UgQU9UX0VSX0FBQ19MQzoKICAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CiAgICAgICBpZiAobkNoYW5uZWxzID09IDEpIHsKQEAgLTI1NzUsNyArNzE2MSwxNiBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgcmV0dXJuICZub2RlX2FhY19jcGVfZXBjMTsKICAgICAgIH0KLSAgICAgIGJyZWFrOworICAgIGNhc2UgQU9UX1VTQUM6CisgICAgICBpZiAoZWxGbGFncyAmIEFDX0VMX1VTQUNfTEZFKSB7CisgICAgICAgIEZES19BU1NFUlQobkNoYW5uZWxzID09IDEpOworICAgICAgICByZXR1cm4gJm5vZGVfdXNhY19sZmVfZXBjMDsKKyAgICAgIH0KKyAgICAgIGlmIChuQ2hhbm5lbHMgPT0gMSkgeworICAgICAgICByZXR1cm4gJm5vZGVfdXNhY19zY2VfZXBjMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAmbm9kZV91c2FjX2NwZV9lcGMwOworICAgICAgfQogICAgIGNhc2UgQU9UX0VSX0FBQ19TQ0FMOgogICAgICAgaWYgKG5DaGFubmVscyA9PSAxKSB7CiAgICAgICAgIGlmIChlcENvbmZpZyA8PSAwKQpAQCAtMjU4OCw3ICs3MTgzLDYgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgIHJldHVybiAmbm9kZV9zY2FsX2NwZV9lcGMxOwogICAgICAgfQotICAgICAgYnJlYWs7CiAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKICAgICAgIGlmIChuQ2hhbm5lbHMgPT0gMSkgewogICAgICAgICBpZiAoZXBDb25maWcgPD0gMCkKQEAgLTI2MDQsMTcgKzcxOTgsNzQgQEAKICAgICBjYXNlIEFPVF9EUk1fQUFDOgogICAgIGNhc2UgQU9UX0RSTV9TQlI6CiAgICAgY2FzZSBBT1RfRFJNX01QRUdfUFM6CisgICAgY2FzZSBBT1RfRFJNX1NVUlJPVU5EOgogICAgICAgRkRLX0FTU0VSVChlcENvbmZpZyA9PSAxKTsKICAgICAgIGlmIChuQ2hhbm5lbHMgPT0gMSkgewogICAgICAgICByZXR1cm4gJm5vZGVfZHJtX3NjZTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiAmbm9kZV9kcm1fY3BlOwogICAgICAgfQotICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIGJyZWFrOwogICB9CiAgIHJldHVybiBOVUxMOwogfQogCisvKiBJbnZlcnNlIHNxdWFyZSByb290IHRhYmxlIGZvciBvcGVyYW5kcyBydW5uaW5nIGZyb20gMC41IHRvIH4xLjAgKi8KKy8qIChJTlQpICgwLjUgKyAxLjAvc3FydCgob3ApL0ZES3BvdygyLjAsMzEpKSk7ICAgICAgICAgICAgICAgICAgICAqLworLyogTm90ZTogRmlyc3QgdmFsdWUgaXMgcm5vdCByb3VuZGVkIGZvciBhY2N1cmFjeSByZWFzb25zICAgICAgICAgICovCisvKiBJbXBsaWNpdCBleHBvbmVudCBpcyAxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEV4YW1wbGVzOiAweDVBODI3OTlBID0gaW52U3FydE5vcm0yICgweDQwMDAuMDAwMCksIGV4cD0xICAgICAgICAqLworLyogICAgICAgICAgIDB4NUE4Mjc5OUEgPSBpbnZTcXJ0Tm9ybTIgKDB4NDAwMC4wMDAwKSwgZXhwPTEgICAgICAgICovCiAKK0xOS19TRUNUSU9OX0NPTlNUREFUQV9MMQorY29uc3QgRklYUF9EQkwgaW52U3FydFRhYltTUVJUX1ZBTFVFU10gPSB7CisgICAgMHg1QTgyNzk5OSwgMHg1QTI4N0UwMywgMHg1OUNGOENCQywgMHg1OTc3QTBBQywgMHg1OTIwQjRERiwgMHg1OENBQzQ4MCwKKyAgICAweDU4NzVDQURFLCAweDU4MjFDMzY0LCAweDU3Q0VBOTlELCAweDU3N0M3OTMwLCAweDU3MkIyREUwLCAweDU2REFDMzhFLAorICAgIDB4NTY4QjM2MzIsIDB4NTYzQzgxRTAsIDB4NTVFRUEyQzQsIDB4NTVBMTk1MjIsIDB4NTU1NTU1NTUsIDB4NTUwOURGRDAsCisgICAgMHg1NEJGMzExQSwgMHg1NDc1NDVEMCwgMHg1NDJDMUFBNCwgMHg1M0UzQUM1QiwgMHg1MzlCRjdDRCwgMHg1MzU0RjlFNywKKyAgICAweDUzMEVBRkE1LCAweDUyQzkxNjE4LCAweDUyODQyQTVGLCAweDUyM0ZFOUFDLCAweDUxRkM1MTQwLCAweDUxQjk1RTZCLAorICAgIDB4NTE3NzBFOEYsIDB4NTEzNTVGMUEsIDB4NTBGNDREODksIDB4NTBCM0Q3NjgsIDB4NTA3M0ZBNTAsIDB4NTAzNEIzRTcsCisgICAgMHg0RkY2MDFFMCwgMHg0RkI3RTFGQSwgMHg0RjdBNTIwMiwgMHg0RjNENEZDRiwgMHg0RjAwRDk0NCwgMHg0RUM0RUM0RiwKKyAgICAweDRFODk4NkVBLCAweDRFNEVBNzE4LCAweDRFMTQ0QUU5LCAweDREREE3MDczLCAweDREQTExNURBLCAweDRENjgzOTQ4LAorICAgIDB4NEQyRkQ4RjQsIDB4NENGN0YzMUIsIDB4NENDMDg2MDUsIDB4NEM4OTkwMDAsIDB4NEM1MzBGNjUsIDB4NEMxRDAyOTQsCisgICAgMHg0QkU3NjdGNSwgMHg0QkIyM0RGOSwgMHg0QjdEODMxNywgMHg0QjQ5MzVDRiwgMHg0QjE1NTRBNiwgMHg0QUUxREUyQSwKKyAgICAweDRBQUVEMEYwLCAweDRBN0MyQjkzLCAweDRBNDlFQ0IzLCAweDRBMTgxMkZBLCAweDQ5RTY5RDE2LCAweDQ5QjU4OUJCLAorICAgIDB4NDk4NEQ3QTQsIDB4NDk1NDg1OTIsIDB4NDkyNDkyNDksIDB4NDhGNEZDOTcsIDB4NDhDNUMzNEIsIDB4NDg5NkU1M0QsCisgICAgMHg0ODY4NjE0OCwgMHg0ODNBMzY0RCwgMHg0ODBDNjMzMiwgMHg0N0RFRTZFMSwgMHg0N0IxQzA0OSwgMHg0Nzg0RUU2MCwKKyAgICAweDQ3NTg3MDFDLCAweDQ3MkM0NDdDLCAweDQ3MDA2QTgxLCAweDQ2RDRFMTMwLCAweDQ2QTlBNzk0LCAweDQ2N0VCQ0JBLAorICAgIDB4NDY1NDFGQjQsIDB4NDYyOUNGOTgsIDB4NDVGRkNCODAsIDB4NDVENjEyOEEsIDB4NDVBQ0EzRDUsIDB4NDU4MzdFODgsCisgICAgMHg0NTVBQTFDQiwgMHg0NTMyMENDOCwgMHg0NTA5QkVCMCwgMHg0NEUxQjZCNCwgMHg0NEI5RjQwQiwgMHg0NDkyNzVFRCwKKyAgICAweDQ0NkIzQjk2LCAweDQ0NDQ0NDQ0LCAweDQ0MUQ4RjNCLCAweDQzRjcxQkJGLCAweDQzRDBFOTE3LCAweDQzQUFGNjhGLAorICAgIDB4NDM4NTQzNzQsIDB4NDM1RkNGMTUsIDB4NDMzQTk4QzYsIDB4NDMxNTlGREMsIDB4NDJGMEUzQUUsIDB4NDJDQzYzOTgsCisgICAgMHg0MkE4MUVGNiwgMHg0Mjg0MTUyNywgMHg0MjYwNDU4RSwgMHg0MjNDQUY4RCwgMHg0MjE5NTI4QiwgMHg0MUY2MkRGMiwKKyAgICAweDQxRDM0MTJBLCAweDQxQjA4QkEyLCAweDQxOEUwQ0M4LCAweDQxNkJDNDBELCAweDQxNDlCMEU1LCAweDQxMjdEMkMzLAorICAgIDB4NDEwNjI5MjAsIDB4NDBFNEIzNzQsIDB4NDBDMzcxM0IsIDB4NDBBMjYxRUYsIDB4NDA4MTg1MTIsIDB4NDA2MERBMjIsCisgICAgMHg0MDQwNjBBMSwgMHg0MDIwMTgxNCwgMHg0MDAwMDAwMCwgMHgzRkUwMTdFQyAvKiAsIDB4M0ZDMDVGNjEgKi8KK307CisKKy8qIG51bWJlciBvZiBjaGFubmVscyBvZiB0aGUgZm9ybWF0cyAqLworCitjb25zdCBJTlQgZm9ybWF0X25jaGFuW0ZES19ORk9STUFUUyArIDkgLSAyXSA9IHsKKyAgICAwLCAgLyogYW55IHNldC11cCwgQ2hDb25mSWR4ID0gMCAqLworICAgIDEsICAvKiBtb25vIENoQ29uZklkeCA9IDEgKi8KKyAgICAyLCAgLyogc3RlcmVvIENoQ29uZklkeCA9IDIgKi8KKyAgICAzLCAgLyogMy8wLjAgQ2hDb25mSWR4ID0gMyAqLworICAgIDQsICAvKiAzLzEuMCBDaENvbmZJZHggPSA0ICovCisgICAgNSwgIC8qIDMvMi4wIENoQ29uZklkeCA9IDUgKi8KKyAgICA2LCAgLyogNS4xIENoQ29uZklkeCA9IDYgKi8KKyAgICA4LCAgLyogNS8yLjEgQUxUIENoQ29uZklkeCA9IDcgKi8KKyAgICAwLCAgLyogRW1wdHkgbi5hLiBDaENvbmZJZHggPSA4ICovCisgICAgMywgIC8qIDIvMS4wIENoQ29uZklkeCA9IDkgKi8KKyAgICA0LCAgLyogMi8yLjAgQ2hDb25mSWR4ID0gMTAgKi8KKyAgICA3LCAgLyogMy8zLjEgQ2hDb25mSWR4ID0gMTEgKi8KKyAgICA4LCAgLyogMy80LjEgQ2hDb25mSWR4ID0gMTIgKi8KKyAgICAyNCwgLyogMjIuMiBDaENvbmZJZHggPSAxMyAqLworICAgIDgsICAvKiA1LzIuMSBDaENvbmZJZHggPSAxNCAqLworICAgIDEyLCAvKiA1LzUuMiBDaENvbmZJZHggPSAxNSAqLworICAgIDEwLCAvKiA1LzQuMSBDaENvbmZJZHggPSAxNiAqLworICAgIDEyLCAvKiA2LzUuMSBDaENvbmZJZHggPSAxNyAqLworICAgIDE0LCAvKiA2LzcuMSBDaENvbmZJZHggPSAxOCAqLworICAgIDEyLCAvKiA1LzYuMSBDaENvbmZJZHggPSAxOSAqLworICAgIDE0ICAvKiA3LzYuMSBDaENvbmZJZHggPSAyMCAqLworfTsKZGlmZiAtLWdpdCBhL2xpYkZESy9zcmMvRkRLX3RyaWdGY3RzLmNwcCBiL2xpYkZESy9zcmMvRkRLX3RyaWdGY3RzLmNwcAppbmRleCAxZjNhMDE3Li40YmI2MjYyIDEwMDY0NAotLS0gYS9saWJGREsvc3JjL0ZES190cmlnRmN0cy5jcHAKKysrIGIvbGliRkRLL3NyYy9GREtfdHJpZ0ZjdHMuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDI1MiArOTAsMjUxIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgSGFyaWNoYXJhbiBMYWtzaG1hbiwgTWFudWVsIEphbmRlcgorCiAgICBEZXNjcmlwdGlvbjogVHJpZ29ub21ldHJpYyBmdW5jdGlvbnMgZml4ZWQgcG9pbnQgZnJhY3Rpb25hbCBpbXBsZW1lbnRhdGlvbi4KIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgIkZES190cmlnRmN0cy5oIgogCiAjaW5jbHVkZSAiZml4cG9pbnRfbWF0aC5oIgogCi0KLQotCi0jZGVmaW5lIElNUFJPVkVfQVRBTjJfQUNDVVJBQ1kgIDEgIC8vIDAgLS0+IDU5IGRCIFNOUiAgICAgMSAtLT4gNjUgZEIgU05SCi0jZGVmaW5lIE1JTlNGVEFCICA3CisjZGVmaW5lIElNUFJPVkVfQVRBTjJfQUNDVVJBQ1kgMSAvKiAwIC0tPiA1OSBkQiBTTlIgICAgIDEgLS0+IDY1IGRCIFNOUiAqLworI2RlZmluZSBNSU5TRlRBQiA3CiAjZGVmaW5lIE1BWFNGVEFCIDI1CiAKICNpZiBJTVBST1ZFX0FUQU4yX0FDQ1VSQUNZCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgZl9hdGFuX2V4cGFuZF9yYW5nZVtNQVhTRlRBQi0oTUlOU0ZUQUItMSldICA9Ci17Ci0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiAgVGFibGUgaG9sZHMgZml4cF9hdGFuKCkgb3V0cHV0IHZhbHVlcyB3aGljaCBhcmUgb3V0c2lkZSBvZiBpbnB1dCByYW5nZQotICAgKiAgb2YgZml4cF9hdGFuKCkgdG8gaW1wcm92ZSBTTlIgb2YgZml4cF9hdGFuMigpLgotICAgKgotICAgKiAgVGhpcyBUYWJsZSBtaWdodCBhbHNvIGJlIHVzZWQgaW4gZml4cF9hdGFuKCkgW3RvZG9dIHNvIHRoZXJlIGEgd2lkZXIgaW5wdXQKLSAgICogIHJhbmdlIGNhbiBiZSBjb3ZlcmVkLCB0b28uCi0gICAqCi0gICAqICBNYXRsYWIgKGdlbmVyYXRlIHRhYmxlKToKLSAgICogICAgZm9yIHNjbCA9IDc6MjUgICAgICAgICAgICAlIE1JTlNGVEFCIC4uIE1BWFNGVEFCCi0gICAqICAgICAgYXQ9YXRhbigwLjUgKigyXnNjbCkpOyAgJSAwLjUgYmVjYXVzZSBnZXQgaW4gJ21pZGRsZScgYXJlYSBvZiBjdXJyZW50IHNjYWxlIGxldmVsICdzY2wnCi0gICAqICAgICAgYXQvMiAgICAgICAgICAgICAgICAgICAgJSBkaXYgYXQgYnkgQVRPX1NDQUxFCi0gICAqICAgIGVuZAotICAgKgotICAgKiAgVGFibGUgZGl2aWRlZCBieSAyPUFUT19TQ0FMRSAgPC0tICBTRj1BVE9fU0YKLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgRkwyRlhDT05TVF9EQkwoNy43NzU4NjI5OTA4NzIwOTllLTAwMSksIEZMMkZYQ09OU1RfREJMKDcuODE0OTE5OTI4NjczOTc4ZS0wMDEpLCBGTDJGWENPTlNUX0RCTCg3LjgzNDQ1MDQ4MzMxNDY0OGUtMDAxKSwKLSAgIEZMMkZYQ09OU1RfREJMKDcuODQ0MjE2MDIxMzkyMDg5ZS0wMDEpLCBGTDJGWENPTlNUX0RCTCg3Ljg0OTA5ODgyMzAyNjY4N2UtMDAxKSwgRkwyRlhDT05TVF9EQkwoNy44NTE1NDAyMjc5MTg1MDllLTAwMSksCi0gICBGTDJGWENPTlNUX0RCTCg3Ljg1Mjc2MDkzMDg3MzczN2UtMDAxKSwgRkwyRlhDT05TVF9EQkwoNy44NTMzNzEyODI0MTUwMTVlLTAwMSksIEZMMkZYQ09OU1RfREJMKDcuODUzNjc2NDU4MTkzNjEyZS0wMDEpLAotICAgRkwyRlhDT05TVF9EQkwoNy44NTM4MjkwNDYwODM5MDZlLTAwMSksIEZMMkZYQ09OU1RfREJMKDcuODUzOTA1MzQwMDI5MTc3ZS0wMDEpLCBGTDJGWENPTlNUX0RCTCg3Ljg1Mzk0MzQ4NzAwMTgyOGUtMDAxKSwKLSAgIEZMMkZYQ09OU1RfREJMKDcuODUzOTYyNTYwNDg4MTU1ZS0wMDEpLCBGTDJGWENPTlNUX0RCTCg3Ljg1Mzk3MjA5NzIzMTMxOWUtMDAxKSwgRkwyRlhDT05TVF9EQkwoNy44NTM5NzY4NjU2MDI5MDFlLTAwMSksCi0gICBGTDJGWENPTlNUX0RCTCg3Ljg1Mzk3OTI0OTc4ODY5MmUtMDAxKSwgRkwyRlhDT05TVF9EQkwoNy44NTM5ODA0NDE4ODE1ODdlLTAwMSksIEZMMkZYQ09OU1RfREJMKDcuODUzOTgxMDM3OTI4MDM1ZS0wMDEpLAotICAgRkwyRlhDT05TVF9EQkwoNy44NTM5ODEzMzU5NTEyNTllLTAwMSkKLSAgIC8vICAgICBwaS80ID0gMC43ODUzOTgxNjMzOTc0NDggPSBwaS8yL0FUT19TQ0FMRQorc3RhdGljIGNvbnN0IEZJWFBfREJMIGZfYXRhbl9leHBhbmRfcmFuZ2VbTUFYU0ZUQUIgLSAoTUlOU0ZUQUIgLSAxKV0gPSB7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICoKKyAgICAgKiAgVGFibGUgaG9sZHMgZml4cF9hdGFuKCkgb3V0cHV0IHZhbHVlcyB3aGljaCBhcmUgb3V0c2lkZSBvZiBpbnB1dCByYW5nZQorICAgICAqICBvZiBmaXhwX2F0YW4oKSB0byBpbXByb3ZlIFNOUiBvZiBmaXhwX2F0YW4yKCkuCisgICAgICoKKyAgICAgKiAgVGhpcyBUYWJsZSBtaWdodCBhbHNvIGJlIHVzZWQgaW4gZml4cF9hdGFuKCkgc28gdGhlcmUgYSB3aWRlciBpbnB1dAorICAgICAqICByYW5nZSBjYW4gYmUgY292ZXJlZCwgdG9vLgorICAgICAqCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIEZMMkZYQ09OU1RfREJMKDcuNzc1ODYyOTkwODcyMDk5ZS0wMDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDcuODE0OTE5OTI4NjczOTc4ZS0wMDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDcuODM0NDUwNDgzMzE0NjQ4ZS0wMDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDcuODQ0MjE2MDIxMzkyMDg5ZS0wMDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDcuODQ5MDk4ODIzMDI2Njg3ZS0wMDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDcuODUxNTQwMjI3OTE4NTA5ZS0wMDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDcuODUyNzYwOTMwODczNzM3ZS0wMDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDcuODUzMzcxMjgyNDE1MDE1ZS0wMDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDcuODUzNjc2NDU4MTkzNjEyZS0wMDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDcuODUzODI5MDQ2MDgzOTA2ZS0wMDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDcuODUzOTA1MzQwMDI5MTc3ZS0wMDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDcuODUzOTQzNDg3MDAxODI4ZS0wMDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDcuODUzOTYyNTYwNDg4MTU1ZS0wMDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDcuODUzOTcyMDk3MjMxMzE5ZS0wMDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDcuODUzOTc2ODY1NjAyOTAxZS0wMDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDcuODUzOTc5MjQ5Nzg4NjkyZS0wMDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDcuODUzOTgwNDQxODgxNTg3ZS0wMDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDcuODUzOTgxMDM3OTI4MDM1ZS0wMDEpLAorICAgIEZMMkZYQ09OU1RfREJMKDcuODUzOTgxMzM1OTUxMjU5ZS0wMDEpCisgICAgLyogcGkvNCA9IDAuNzg1Mzk4MTYzMzk3NDQ4ID0gcGkvMi9BVE9fU0NBTEUgKi8KIH07CiAjZW5kaWYKIAotRklYUF9EQkwgZml4cF9hdGFuMihGSVhQX0RCTCB5LCBGSVhQX0RCTCB4KQotewotICAgIEZJWFBfREJMIHE7Ci0gICAgRklYUF9EQkwgYXQ7ICAvLyBhdGFuICBvdXQKLSAgICBGSVhQX0RCTCBhdDI7IC8vIGF0YW4yIG91dAotICAgIEZJWFBfREJMIHJldCA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKLSAgICBJTlQgc2Ysc2ZvLHN0ZjsKK0ZJWFBfREJMIGZpeHBfYXRhbjIoRklYUF9EQkwgeSwgRklYUF9EQkwgeCkgeworICBGSVhQX0RCTCBxOworICBGSVhQX0RCTCBhdDsgIC8qIGF0YW4gIG91dCAqLworICBGSVhQX0RCTCBhdDI7IC8qIGF0YW4yIG91dCAqLworICBGSVhQX0RCTCByZXQgPSBGTDJGWENPTlNUX0RCTCgtMS4wZik7CisgIElOVCBzZiwgc2ZvLCBzdGY7CiAKLSAgICAvLyAtLS0gZGl2aXNpb24KKyAgLyogLS0tIGRpdmlzaW9uICovCiAKLSAgICBpZiAgICAgICh5ID4gRkwyRlhDT05TVF9EQkwoMC4wZikpCi0gICAgewotICAgICAgICBpZiAgICAgICh4ID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gIGZEaXZOb3JtSGlnaFByZWMoIHksIHgsICZzZik7IC8vIGJvdGggcG9zLgotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHggPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSAtZkRpdk5vcm1IaWdoUHJlYyggeSwteCwgJnNmKTsgLy8geCBuZWcuCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ly8oeCA9PUZMMkZYQ09OU1RfREJMKDAuMGYpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSAgRkwyRlhDT05TVF9EQkwoKzEuMGYpOyAgLy8geS94ID0gcG9zL3plcm8gPSArSW5mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2YgPSAwOwotICAgICAgICB9CisgIGlmICh5ID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICBpZiAoeCA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICBxID0gZkRpdk5vcm1IaWdoUHJlYyh5LCB4LCAmc2YpOyAvKiBib3RoIHBvcy4gKi8KKyAgICB9IGVsc2UgaWYgKHggPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgcSA9IC1mRGl2Tm9ybUhpZ2hQcmVjKHksIC14LCAmc2YpOyAvKiB4IG5lZy4gKi8KKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKHggPT0gRkwyRlhDT05TVF9EQkwoMC4wZikpICovCisgICAgICBxID0gRkwyRlhDT05TVF9EQkwoKzEuMGYpOyAgICAgICAgIC8qIHkveCA9IHBvcy96ZXJvID0gK0luZiAqLworICAgICAgc2YgPSAwOwogICAgIH0KLSAgICBlbHNlIGlmICh5IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpCi0gICAgewotICAgICAgICBpZiAgICAgICh4ID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gLWZEaXZOb3JtSGlnaFByZWMoLXksIHgsICZzZik7IC8vIHkgbmVnLgotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHggPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSAgZkRpdk5vcm1IaWdoUHJlYygteSwteCwgJnNmKTsgLy8gYm90aCBuZWcuCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ly8oeCA9PUZMMkZYQ09OU1RfREJMKDAuMGYpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSAgRkwyRlhDT05TVF9EQkwoLTEuMGYpOyAgLy8geS94ID0gbmVnL3plcm8gPSAtSW5mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2YgPSAwOwotICAgICAgICB9CisgIH0gZWxzZSBpZiAoeSA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgaWYgKHggPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgcSA9IC1mRGl2Tm9ybUhpZ2hQcmVjKC15LCB4LCAmc2YpOyAvKiB5IG5lZy4gKi8KKyAgICB9IGVsc2UgaWYgKHggPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgcSA9IGZEaXZOb3JtSGlnaFByZWMoLXksIC14LCAmc2YpOyAvKiBib3RoIG5lZy4gKi8KKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKHggPT0gRkwyRlhDT05TVF9EQkwoMC4wZikpICovCisgICAgICBxID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOyAgICAgICAgIC8qIHkveCA9IG5lZy96ZXJvID0gLUluZiAqLworICAgICAgc2YgPSAwOwogICAgIH0KLSAgICBlbHNlIHsgLy8gKHkgPT1GTDJGWENPTlNUX0RCTCgwLjBmKSkKLSAgICAgICAgcSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgICBzZiA9IDA7CisgIH0gZWxzZSB7IC8qICh5ID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAqLworICAgIHEgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICBzZiA9IDA7CisgIH0KKyAgc2ZvID0gc2Y7CisKKyAgLyogLS0tIGF0YW4oKSAqLworCisgIGlmIChzZm8gPiBBVElfU0YpIHsKKyAgLyogLS0tIGNvdWxkIG5vdCBjYWxjIGZpeHBfYXRhbigpIGhlcmUgYmVjIG9mIGlucHV0IGRhdGEgb3V0IG9mIHJhbmdlICovCisgIC8qICAgICA9PT4gdGhlcmVmb3JlIGdpdmUgYmFjayBib3VuZGFyeSB2YWx1ZXMgKi8KKworI2lmIElNUFJPVkVfQVRBTjJfQUNDVVJBQ1kKKyAgICBpZiAoc2ZvID4gTUFYU0ZUQUIpIHNmbyA9IE1BWFNGVEFCOworI2VuZGlmCisKKyAgICBpZiAocSA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisjaWYgSU1QUk9WRV9BVEFOMl9BQ0NVUkFDWQorICAgICAgYXQgPSArZl9hdGFuX2V4cGFuZF9yYW5nZVtzZm8gLSBBVElfU0YgLSAxXTsKKyNlbHNlCisgICAgICBhdCA9IEZMMkZYQ09OU1RfREJMKCtNX1BJIC8gMiAvIEFUT19TQ0FMRSk7CisjZW5kaWYKKyAgICB9IGVsc2UgaWYgKHEgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworI2lmIElNUFJPVkVfQVRBTjJfQUNDVVJBQ1kKKyAgICAgIGF0ID0gLWZfYXRhbl9leHBhbmRfcmFuZ2Vbc2ZvIC0gQVRJX1NGIC0gMV07CisjZWxzZQorICAgICAgYXQgPSBGTDJGWENPTlNUX0RCTCgtTV9QSSAvIDIgLyBBVE9fU0NBTEUpOworI2VuZGlmCisgICAgfSBlbHNlIHsgLyogcSA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSAqLworICAgICAgYXQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICB9Ci0gICAgc2ZvID0gc2Y7Ci0KLSAgICAvLyAtLS0gYXRhbigpCi0KLSAgICBpZiAgKCBzZm8gPiBBVElfU0YgKSB7Ci0gICAgICAgIC8vIC0tLSBjb3VsZCBub3QgY2FsYyBmaXhwX2F0YW4oKSBoZXJlIGJlYyBvZiBpbnB1dCBkYXRhIG91dCBvZiByYW5nZQotICAgICAgICAvLyAgICAgPT0+IHRoZXJlZm9yZSBnaXZlIGJhY2sgYm91bmRhcnkgdmFsdWVzCi0KLSAgICAgICAgI2lmIElNUFJPVkVfQVRBTjJfQUNDVVJBQ1kKLSAgICAgICAgaWYgKHNmbyA+IE1BWFNGVEFCKSBzZm8gPSBNQVhTRlRBQjsKLSAgICAgICAgI2VuZGlmCi0KLSAgICAgICAgaWYgICAgICAoICBxID4gRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7Ci0gICAgICAgICAgICNpZiBJTVBST1ZFX0FUQU4yX0FDQ1VSQUNZCi0gICAgICAgICAgICBhdCA9ICtmX2F0YW5fZXhwYW5kX3JhbmdlW3Nmby1BVElfU0YtMV07Ci0gICAgICAgICAgICNlbHNlCi0gICAgICAgICAgICBhdCA9IEZMMkZYQ09OU1RfREJMKCArTV9QSS8yIC8gQVRPX1NDQUxFKTsKLSAgICAgICAgICAgI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoICBxIDwgRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7Ci0gICAgICAgICAgICNpZiBJTVBST1ZFX0FUQU4yX0FDQ1VSQUNZCi0gICAgICAgICAgICBhdCA9IC1mX2F0YW5fZXhwYW5kX3JhbmdlW3Nmby1BVElfU0YtMV07Ci0gICAgICAgICAgICNlbHNlCi0gICAgICAgICAgICBhdCA9IEZMMkZYQ09OU1RfREJMKCAtTV9QSS8yIC8gQVRPX1NDQUxFKTsKLSAgICAgICAgICAgI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7ICAvLyBxPT0gRkwyRlhDT05TVF9EQkwoMC4wZikKLSAgICAgICAgICAgIGF0ID0gRkwyRlhDT05TVF9EQkwoIDAuMGYgKTsKLSAgICAgICAgfQotICAgIH1lbHNlewotICAgICAgICAvLyAtLS0gY2FsYyBvZiBmaXhwX2F0YW4oKSBpcyBwb3NzaWJsZTsgaW5wdXQgZGF0YSB3aXRoaW4gcmFuZ2UKLSAgICAgICAgLy8gICAgID09PiBzZXQgcSBvbiBmaXhlZCBzY2FsZSBsZXZlbCBhcyBkZXNpcmVkIGZyb20gZml4cF9hdGFuKCkKLSAgICAgICAgc3RmID0gc2ZvIC0gQVRJX1NGOwotICAgICAgICBpZiAoc3RmID4gMCkgIHEgPSBxIDw8IChJTlQpZk1pbiggc3RmLERGUkFDVF9CSVRTLTEpOwotICAgICAgICBlbHNlICAgICAgICAgIHEgPSBxID4+IChJTlQpZk1pbigtc3RmLERGUkFDVF9CSVRTLTEpOwotICAgICAgICBhdCA9IGZpeHBfYXRhbihxKTsgIC8vIEFUT19TRgotICAgIH0KLQotICAgIC8vIC0tLSBhdGFuMigpCi0KLSAgICBhdDIgPSBhdCA+PiAoQVQyT19TRiAtIEFUT19TRik7IC8vIG5vdyBBVDJPX1NGIGZvciBhdGFuMgotICAgIGlmICAgICAgKCAgeCA+IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgewotICAgICAgICByZXQgPSBhdDI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAgeCA8IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgewotICAgICAgICBpZiAoICB5ID49IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgewotICAgICAgICAgICAgcmV0ID0gYXQyICsgRkwyRlhDT05TVF9EQkwoIE1fUEkgLyBBVDJPX1NDQUxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IGF0MiAtIEZMMkZYQ09OU1RfREJMKCBNX1BJIC8gQVQyT19TQ0FMRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8vIHggPT0gMAotICAgICAgICBpZiAgICAgICggeSA+ICBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKLSAgICAgICAgICAgIHJldCA9IEZMMkZYQ09OU1RfREJMKCArTV9QSS8yIC8gQVQyT19TQ0FMRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHkgPCAgRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7Ci0gICAgICAgICAgICByZXQgPSBGTDJGWENPTlNUX0RCTCggLU1fUEkvMiAvIEFUMk9fU0NBTEUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCB5ID09IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgewotICAgICAgICAgICAgcmV0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotCi1GSVhQX0RCTCBmaXhwX2F0YW4oRklYUF9EQkwgeCkKLXsKLSAgICBJTlQgc2lnbjsKLSAgICBGSVhQX0RCTCByZXN1bHQsIHRlbXA7Ci0KLSAgICAvLyBTTlIgb2YgZml4cF9hdGFuKCkgPSA1NiBkQgotICAgIEZJWFBfREJMIE9ORUJZM1A1NiAgPSAoRklYUF9EQkwpMHgyNjgwMDAwMDsgLy8gMS4wLzMuNTYgaW4gcTMxCi0gICAgRklYUF9EQkwgUDI4MSAgICAgICA9IChGSVhQX0RCTCkweDAwMDEzMDAwOyAvLyAwLjI4MSBpbiBxMTgKLSAgICBGSVhQX0RCTCBPTkVQNTcxICAgID0gKEZJWFBfREJMKTB4NjQ4N2VmMDA7IC8vIDEuNTcxIGluIHEzMAotCi0gICAgaWYgKHggPCBGSVhQX0RCTCgwKSkgewotICAgICAgc2lnbiA9IDE7Ci0gICAgICB4ID0gLSB4IDsKLSAgICB9IGVsc2UgewotICAgICAgc2lnbiA9IDA7Ci0gICAgfQotCi0gICAgLyogY2FsYyBvZiBhcmN0YW4gKi8KLSAgICBpZih4IDwgKCBRKFFfQVRBTklOUCktRkwyRlhDT05TVF9EQkwoMC4wMDM5NSkpICkKLSAgICB7Ci0gICAgICAgIElOVCByZXNfZTsKLQotICAgICAgICB0ZW1wID0gZlBvdzIoeCk7ICAgICAgICAgICAgLy8gcTI1ICogcTI1IC0gKERGUkFDVF9CSVRTLTEpID0gcTE5Ci0gICAgICAgIHRlbXAgPSBmTXVsdCh0ZW1wLCBPTkVCWTNQNTYpOyAgICAgIC8vIHExOSAqIHEzMSAtIChERlJBQ1RfQklUUy0xKSA9IHExOQotICAgICAgICB0ZW1wID0gdGVtcCArIFEoMTkpOyAgICAgICAgICAgICAgICAvLyBxMTkgKyBxMTkgPSBxMTkKLSAgICAgICAgcmVzdWx0ID0gZkRpdk5vcm0oeCwgdGVtcCwgJnJlc19lKTsKLSAgICAgICAgcmVzdWx0ID0gc2NhbGVWYWx1ZShyZXN1bHQsIChRX0FUQU5PVVQtUV9BVEFOSU5QKzE5LURGUkFDVF9CSVRTKzEpICsgcmVzX2UgICk7Ci0gICAgfQotICAgIGVsc2UgaWYoIHggPCBGTDJGWENPTlNUX0RCTCgxLjI4LzY0LjApICkKLSAgICB7Ci0gICAgICAgIEZJWFBfREJMIGRlbHRhX2ZpeDsKLSAgICAgICAgRklYUF9EQkwgUElfQllfNCA9IEZMMkZYQ09OU1RfREJMKDMuMTQxNTkyNi80LjApID4+IDE7IC8qIHBpLzQgaW4gcTMwICovCi0KLSAgICAgICAgZGVsdGFfZml4ID0gKHggLSBGTDJGWENPTlNUX0RCTCgxLjAvNjQuMCkpIDw8IDU7IC8qIHEzMCAqLwotICAgICAgICByZXN1bHQgPSBQSV9CWV80ICsgKGRlbHRhX2ZpeCA+PiAxKSAtIChmUG93MkRpdjIoZGVsdGFfZml4KSk7Ci0gICAgfQorICB9IGVsc2UgeworICAgIC8qIC0tLSBjYWxjIG9mIGZpeHBfYXRhbigpIGlzIHBvc3NpYmxlOyBpbnB1dCBkYXRhIHdpdGhpbiByYW5nZSAqLworICAgIC8qICAgICA9PT4gc2V0IHEgb24gZml4ZWQgc2NhbGUgbGV2ZWwgYXMgZGVzaXJlZCBmcm9tIGZpeHBfYXRhbigpICovCisgICAgc3RmID0gc2ZvIC0gQVRJX1NGOworICAgIGlmIChzdGYgPiAwKQorICAgICAgcSA9IHEgPDwgKElOVClmTWluKHN0ZiwgREZSQUNUX0JJVFMgLSAxKTsKICAgICBlbHNlCi0gICAgewotICAgICAgICBJTlQgcmVzX2U7CisgICAgICBxID0gcSA+PiAoSU5UKWZNaW4oLXN0ZiwgREZSQUNUX0JJVFMgLSAxKTsKKyAgICBhdCA9IGZpeHBfYXRhbihxKTsgLyogQVRPX1NGICovCisgIH0KIAotICAgICAgICB0ZW1wID0gZlBvdzJEaXYyKHgpOyAgICAgICAgLy8gcTI1ICogcTI1IC0gKERGUkFDVF9CSVRTLTEpIC0gMSA9IHExOAotICAgICAgICB0ZW1wID0gdGVtcCArIFAyODE7ICAgICAgICAgICAgICAgICAvLyBxMTggKyBxMTggPSBxMTgKLSAgICAgICAgcmVzdWx0ID0gZkRpdk5vcm0oeCwgdGVtcCwgJnJlc19lKTsKLSAgICAgICAgcmVzdWx0ID0gc2NhbGVWYWx1ZShyZXN1bHQsIChRX0FUQU5PVVQtUV9BVEFOSU5QKzE4LURGUkFDVF9CSVRTKzEpICsgcmVzX2UgKTsKLSAgICAgICAgcmVzdWx0ID0gT05FUDU3MSAtIHJlc3VsdDsgICAgICAgICAgLy8gcTMwICsgcTMwID0gcTMwCi0gICAgfQotICAgIGlmIChzaWduKSB7Ci0gICAgICByZXN1bHQgPSAtcmVzdWx0OwotICAgIH0KKyAgLy8gLS0tIGF0YW4yKCkKIAotICAgIHJldHVybihyZXN1bHQpOworICBhdDIgPSBhdCA+PiAoQVQyT19TRiAtIEFUT19TRik7ICAvLyBub3cgQVQyT19TRiBmb3IgYXRhbjIKKyAgaWYgKHggPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgIHJldCA9IGF0MjsKKyAgfSBlbHNlIGlmICh4IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICBpZiAoeSA+PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgcmV0ID0gYXQyICsgRkwyRlhDT05TVF9EQkwoTV9QSSAvIEFUMk9fU0NBTEUpOworICAgIH0gZWxzZSB7CisgICAgICByZXQgPSBhdDIgLSBGTDJGWENPTlNUX0RCTChNX1BJIC8gQVQyT19TQ0FMRSk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIHggPT0gMAorICAgIGlmICh5ID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgIHJldCA9IEZMMkZYQ09OU1RfREJMKCtNX1BJIC8gMiAvIEFUMk9fU0NBTEUpOworICAgIH0gZWxzZSBpZiAoeSA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICByZXQgPSBGTDJGWENPTlNUX0RCTCgtTV9QSSAvIDIgLyBBVDJPX1NDQUxFKTsKKyAgICB9IGVsc2UgaWYgKHkgPT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgIHJldCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgIH0KKyAgfQorICByZXR1cm4gcmV0OwogfQogCitGSVhQX0RCTCBmaXhwX2F0YW4oRklYUF9EQkwgeCkgeworICBJTlQgc2lnbjsKKyAgRklYUF9EQkwgcmVzdWx0LCB0ZW1wOwogCisgIC8qIFNOUiBvZiBmaXhwX2F0YW4oKSA9IDU2IGRCICovCisgIEZJWFBfREJMIFAyODEgPSAoRklYUF9EQkwpMHgwMDAxMzAwMDsgICAgIC8vIDAuMjgxIGluIHExOAorICBGSVhQX0RCTCBPTkVQNTcxID0gKEZJWFBfREJMKTB4NjQ4N2VmMDA7ICAvLyAxLjU3MSBpbiBxMzAKKworICBpZiAoeCA8IEZJWFBfREJMKDApKSB7CisgICAgc2lnbiA9IDE7CisgICAgeCA9IC14OworICB9IGVsc2UgeworICAgIHNpZ24gPSAwOworICB9CisgIEZES19BU1NFUlQoRkwyRlhDT05TVF9EQkwoMS4wIC8gNjQuMCkgPT0gUShRX0FUQU5JTlApKTsKKyAgLyogY2FsYyBvZiBhcmN0YW4gKi8KKyAgaWYgKHggPCBGTDJGWENPTlNUX0RCTCgxLjAgLyA2NC4wKSkKKyAgLyoKKyAgICBDaGVieXNoZXYgcG9seW5vbWlhbCBhcHByb3hpbWF0aW9uIG9mIGF0YW4oeCkKKyAgICA1dGgtb3JkZXIgYXBwcm94aW1hdGlvbjogYXRhbih4KSA9IGExKnggKyBhMip4XjMgKyBhMyp4XjUgPSB4KGExICsgeF4yKihhMiArCisgICAgYTMqeF4yKSk7IGExID0gMC45OTQ5NDkzNjYxMTY2NTQwZiwgYTIgPSAwLjI4NzA2MDYzNTUzMjY1MjBmLCBhMyA9CisgICAgMC4wNzgwMzcxNzY0NDY0NDEwZjsgN3RoLW9yZGVyIGFwcHJveGltYXRpb246IGF0YW4oeCkgPSBhMSp4ICsgYTIqeF4zICsKKyAgICBhMyp4XjUgKyBhMyp4XjcgPSB4KGExICsgeF4yKihhMiArIHheMiooYTMgKyBhNCp4XjIpKSk7IGExID0KKyAgICAwLjk5OTEzMzQ0ODIyMjc4MDEsIGEyID0gLTAuMzIwNTMzMjkyMzgxNjY0MCwgYTMgPSAwLjE0NDk4MjQ5MDE0NDQ2NTAsIGE0ID0KKyAgICAtMC4wMzgyNTQ0NjQ5NzAyOTkwOyA3dGgtb3JkZXIgYXBwcm94aW1hdGlvbiBpbiB1c2UgKHRoZSBtb3N0IGFjY3VyYXRlCisgICAgc29sdXRpb24pCisgICovCisgIHsKKyAgICB4IDw8PSBBVElfU0Y7CisgICAgRklYUF9EQkwgeDIgPSBmUG93Mih4KTsKKyAgICB0ZW1wID0gZk11bHRBZGREaXYyKChGTDJGWENPTlNUX0RCTCgwLjE0NDk4MjQ5MDE0NDQ2NTBmKSA+PiAxKSwgeDIsCisgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgtMC4wMzgyNTQ0NjQ5NzAyOTkwKSk7CisgICAgdGVtcCA9IGZNdWx0QWRkRGl2MigoRkwyRlhDT05TVF9EQkwoLTAuMzIwNTMzMjkyMzgxNjY0MGYpID4+IDIpLCB4MiwgdGVtcCk7CisgICAgdGVtcCA9IGZNdWx0QWRkRGl2MigoRkwyRlhDT05TVF9EQkwoMC45OTkxMzM0NDgyMjI3ODAxZikgPj4gMyksIHgyLCB0ZW1wKTsKKyAgICByZXN1bHQgPSBmTXVsdCh4LCAodGVtcCA8PCAyKSk7CisgIH0gZWxzZSBpZiAoeCA8IEZMMkZYQ09OU1RfREJMKDEuMjggLyA2NC4wKSkgeworICAgIEZJWFBfREJMIGRlbHRhX2ZpeDsKKyAgICBGSVhQX0RCTCBQSV9CWV80ID0gRkwyRlhDT05TVF9EQkwoMy4xNDE1OTI2IC8gNC4wKSA+PiAxOyAvKiBwaS80IGluIHEzMCAqLworCisgICAgZGVsdGFfZml4ID0gKHggLSBGTDJGWENPTlNUX0RCTCgxLjAgLyA2NC4wKSkgPDwgNTsgLyogcTMwICovCisgICAgcmVzdWx0ID0gUElfQllfNCArIChkZWx0YV9maXggPj4gMSkgLSAoZlBvdzJEaXYyKGRlbHRhX2ZpeCkpOworICB9IGVsc2UgeworICAgIC8qIE90aGVyIGFwcHJveGltYXRpb24gZm9yIHx4fCA+IDEuMjggKi8KKyAgICBJTlQgcmVzX2U7CisKKyAgICB0ZW1wID0gZlBvdzJEaXYyKHgpOyAvKiBxMjUgKiBxMjUgLSAoREZSQUNUX0JJVFMtMSkgLSAxID0gcTE4ICovCisgICAgdGVtcCA9IHRlbXAgKyBQMjgxOyAgLyogcTE4ICsgcTE4ID0gcTE4ICovCisgICAgcmVzdWx0ID0gZkRpdk5vcm0oeCwgdGVtcCwgJnJlc19lKTsKKyAgICByZXN1bHQgPSBzY2FsZVZhbHVlKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChRX0FUQU5PVVQgLSBRX0FUQU5JTlAgKyAxOCAtIERGUkFDVF9CSVRTICsgMSkgKyByZXNfZSk7CisgICAgcmVzdWx0ID0gT05FUDU3MSAtIHJlc3VsdDsgLyogcTMwICsgcTMwID0gcTMwICovCisgIH0KKyAgaWYgKHNpZ24pIHsKKyAgICByZXN1bHQgPSAtcmVzdWx0OworICB9CisKKyAgcmV0dXJuIChyZXN1bHQpOworfQogCiAjaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgogCi1GSVhQX0RCTCBmaXhwX2NvcyhGSVhQX0RCTCB4LCBpbnQgc2NhbGUpCi17Ci0gICAgRklYUF9EQkwgcmVzaWR1YWwsIGVycm9yLCBzaW5lLCBjb3NpbmU7Ci0gICAgCi0gICAgcmVzaWR1YWwgPSBmaXhwX3Npbl9jb3NfcmVzaWR1YWxfaW5saW5lKHgsIHNjYWxlLCAmc2luZSwgJmNvc2luZSk7Ci0gICAgZXJyb3IgPSBmTXVsdChzaW5lLCByZXNpZHVhbCk7CitGSVhQX0RCTCBmaXhwX2NvcyhGSVhQX0RCTCB4LCBpbnQgc2NhbGUpIHsKKyAgRklYUF9EQkwgcmVzaWR1YWwsIGVycm9yLCBzaW5lLCBjb3NpbmU7CiAKLSAgICByZXR1cm4gY29zaW5lIC0gZXJyb3I7CisgIHJlc2lkdWFsID0gZml4cF9zaW5fY29zX3Jlc2lkdWFsX2lubGluZSh4LCBzY2FsZSwgJnNpbmUsICZjb3NpbmUpOworICBlcnJvciA9IGZNdWx0KHNpbmUsIHJlc2lkdWFsKTsKKworI2lmZGVmIFNJTkVUQUJMRV8xNkJJVAorICByZXR1cm4gY29zaW5lIC0gZXJyb3I7CisjZWxzZQorICAvKiBVbmRvIGRvd25zY2FsaW5nIGJ5IDEgd2hpY2ggd2FzIGRvbmUgYXQgZml4cF9zaW5fY29zX3Jlc2lkdWFsX2lubGluZSAqLworICByZXR1cm4gU0FUVVJBVEVfTEVGVF9TSElGVChjb3NpbmUgLSBlcnJvciwgMSwgREZSQUNUX0JJVFMpOworI2VuZGlmCiB9CiAKLUZJWFBfREJMIGZpeHBfc2luKEZJWFBfREJMIHgsIGludCBzY2FsZSkKLXsKLSAgICBGSVhQX0RCTCByZXNpZHVhbCwgZXJyb3IsIHNpbmUsIGNvc2luZTsKLSAgICAKLSAgICByZXNpZHVhbCA9IGZpeHBfc2luX2Nvc19yZXNpZHVhbF9pbmxpbmUoeCwgc2NhbGUsICZzaW5lLCAmY29zaW5lKTsKLSAgICBlcnJvciA9IGZNdWx0KGNvc2luZSwgcmVzaWR1YWwpOworRklYUF9EQkwgZml4cF9zaW4oRklYUF9EQkwgeCwgaW50IHNjYWxlKSB7CisgIEZJWFBfREJMIHJlc2lkdWFsLCBlcnJvciwgc2luZSwgY29zaW5lOwogCi0gICAgcmV0dXJuIHNpbmUgKyBlcnJvcjsKKyAgcmVzaWR1YWwgPSBmaXhwX3Npbl9jb3NfcmVzaWR1YWxfaW5saW5lKHgsIHNjYWxlLCAmc2luZSwgJmNvc2luZSk7CisgIGVycm9yID0gZk11bHQoY29zaW5lLCByZXNpZHVhbCk7CisKKyNpZmRlZiBTSU5FVEFCTEVfMTZCSVQKKyAgcmV0dXJuIHNpbmUgKyBlcnJvcjsKKyNlbHNlCisgIHJldHVybiBTQVRVUkFURV9MRUZUX1NISUZUKHNpbmUgKyBlcnJvciwgMSwgREZSQUNUX0JJVFMpOworI2VuZGlmCiB9CiAKLXZvaWQgZml4cF9jb3Nfc2luIChGSVhQX0RCTCB4LCBpbnQgc2NhbGUsIEZJWFBfREJMICpjb3MsIEZJWFBfREJMICpzaW4pCi17Ci0gICAgRklYUF9EQkwgcmVzaWR1YWwsIGVycm9yMCwgZXJyb3IxLCBzaW5lLCBjb3NpbmU7Ci0gICAgCi0gICAgcmVzaWR1YWwgPSBmaXhwX3Npbl9jb3NfcmVzaWR1YWxfaW5saW5lKHgsIHNjYWxlLCAmc2luZSwgJmNvc2luZSk7Ci0gICAgZXJyb3IwID0gZk11bHQoc2luZSwgcmVzaWR1YWwpOwotICAgIGVycm9yMSA9IGZNdWx0KGNvc2luZSwgcmVzaWR1YWwpOwotICAgICpjb3MgID0gY29zaW5lIC0gZXJyb3IwOwotICAgICpzaW4gID0gc2luZSArIGVycm9yMTsKK3ZvaWQgZml4cF9jb3Nfc2luKEZJWFBfREJMIHgsIGludCBzY2FsZSwgRklYUF9EQkwgKmNvcywgRklYUF9EQkwgKnNpbikgeworICBGSVhQX0RCTCByZXNpZHVhbCwgZXJyb3IwLCBlcnJvcjEsIHNpbmUsIGNvc2luZTsKKworICByZXNpZHVhbCA9IGZpeHBfc2luX2Nvc19yZXNpZHVhbF9pbmxpbmUoeCwgc2NhbGUsICZzaW5lLCAmY29zaW5lKTsKKyAgZXJyb3IwID0gZk11bHQoc2luZSwgcmVzaWR1YWwpOworICBlcnJvcjEgPSBmTXVsdChjb3NpbmUsIHJlc2lkdWFsKTsKKworI2lmZGVmIFNJTkVUQUJMRV8xNkJJVAorICAqY29zID0gY29zaW5lIC0gZXJyb3IwOworICAqc2luID0gc2luZSArIGVycm9yMTsKKyNlbHNlCisgICpjb3MgPSBTQVRVUkFURV9MRUZUX1NISUZUKGNvc2luZSAtIGVycm9yMCwgMSwgREZSQUNUX0JJVFMpOworICAqc2luID0gU0FUVVJBVEVfTEVGVF9TSElGVChzaW5lICsgZXJyb3IxLCAxLCBERlJBQ1RfQklUUyk7CisjZW5kaWYKIH0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9saWJGREsvc3JjL2FybS9hdXRvY29ycjJuZC5jcHAgYi9saWJGREsvc3JjL2FybS9hdXRvY29ycjJuZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNzZlMzAuLjAwMDAwMDAKLS0tIGEvbGliRkRLL3NyYy9hcm0vYXV0b2NvcnIybmQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIQotICoKLSAqIFxicmllZiBDYWxjdWxhdGUgc2Vjb25kIG9yZGVyIGF1dG9jb3JyZWxhdGlvbgotICoKLSAqLwotCi0KZGlmZiAtLWdpdCBhL2xpYkZESy9zcmMvYXJtL2RjdF9hcm0uY3BwIGIvbGliRkRLL3NyYy9hcm0vZGN0X2FybS5jcHAKaW5kZXggNTliNzczZS4uZGQ2NjEwOSAxMDA2NDQKLS0tIGEvbGliRkRLL3NyYy9hcm0vZGN0X2FybS5jcHAKKysrIGIvbGliRkRLL3NyYy9hcm0vZGN0X2FybS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksOSArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZkZWYgRlVOQ1RJT05fZGN0X0lWX2Z1bmMxCiAKQEAgLTkxLDExOSArMTA4LDE2OCBAQAogICAgICAgICAgV2l0aCB0aGlzIHZlcnNpb24sIHdlIHNhdmUgMiBjeWNsZXMgcGVyIGxvb3AgaXRlcmF0aW9uLgogKi8KIAotX19hc20gIHZvaWQgZGN0X0lWX2Z1bmMxKAotICAgIGludCBpLAotICAgIGNvbnN0IEZJWFBfU1BLICp0d2lkZGxlLAotICAgIEZJWFBfREJMICpSRVNUUklDVCBwRGF0XzAsCi0gICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEYXRfMSkKLXsKLSAgICAvKiBSZWdpc3RlciBtYXA6Ci0gICAgICAgcjAgICBpCi0gICAgICAgcjEgICB0d2lkZGxlCi0gICAgICAgcjIgICBwRGF0XzAKLSAgICAgICByMyAgIHBEYXRfMQotICAgICAgIHI0ICAgYWNjdTEKLSAgICAgICByNSAgIGFjY3UyCi0gICAgICAgcjYgICBhY2N1MwotICAgICAgIHI3ICAgYWNjdTQKLSAgICAgICByOCAgIHZhbF90dwotICAgICAgIHI5ICAgYWNjdVgKLSAgICAqLwotICAgIFBVU0ggICAge3I0LXI5fQorX19hc20gdm9pZCBkY3RfSVZfZnVuYzEoaW50IGksIGNvbnN0IEZJWFBfU1BLICp0d2lkZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEYXRfMCwgRklYUF9EQkwgKlJFU1RSSUNUIHBEYXRfMSkgeworICAvKiBSZWdpc3RlciBtYXA6CisgICAgIHIwICAgaQorICAgICByMSAgIHR3aWRkbGUKKyAgICAgcjIgICBwRGF0XzAKKyAgICAgcjMgICBwRGF0XzEKKyAgICAgcjQgICBhY2N1MQorICAgICByNSAgIGFjY3UyCisgICAgIHI2ICAgYWNjdTMKKyAgICAgcjcgICBhY2N1NAorICAgICByOCAgIHZhbF90dworICAgICByOSAgIGFjY3VYCisgICovCisgIFBVU0h7cjQgLSByOX0KIAotICAgICAvKiA0NCBjeWNsZXMgZm9yIDIgaXRlcmF0aW9ucyA9IDIyIGN5Y2xlcy9pdGVyYXRpb24gKi8KLWRjdF9JVl9sb29wMV9zdGFydAotLyogIEZpcnN0IGl0ZXJhdGlvbiAqLwotICAgIExEUiAgICAgcjgsIFtyMV0sICM0ICAgIC8vIHZhbF90dyA9ICp0d2lkZGxlKys7Ci0gICAgTERSICAgICByNSwgW3IyLCAjMF0gICAgLy8gYWNjdTIgPSBwRGF0XzBbMF0KLSAgICBMRFIgICAgIHI0LCBbcjMsICMwXSAgICAvLyBhY2N1MSA9IHBEYXRfMVswXQorICAvKiA0NCBjeWNsZXMgZm9yIDIgaXRlcmF0aW9ucyA9IDIyIGN5Y2xlcy9pdGVyYXRpb24gKi8KKyAgZGN0X0lWX2xvb3AxX3N0YXJ0CisgICAgICAvKiAgRmlyc3QgaXRlcmF0aW9uICovCisgICAgICBMRFIgcjgsCisgICAgICBbcjFdLAorIyA0IC8vIHZhbF90dyA9ICp0d2lkZGxlKys7CisgICAgICBMRFIgcjUsCisgICAgICBbIHIyLCAjMCBdICAvLyBhY2N1MiA9IHBEYXRfMFswXQorICAgICAgTERSIHI0LAorICAgICAgWyByMywgIzAgXSAgLy8gYWNjdTEgPSBwRGF0XzFbMF0KIAotICAgIFNNVUxXVCAgcjksIHI1LCByOCAgICAgIC8vIGFjY3VYID0gYWNjdTIqdmFsX3R3LmwKLSAgICBTTVVMV0IgIHI1LCByNSwgcjggICAgICAvLyBhY2N1MiA9IGFjY3UyKnZhbF90dy5oCi0gICAgUlNCICAgICByOSwgcjksICMwICAgICAgLy8gYWNjdVggPS1hY2N1Mip2YWxfdHcubAotICAgIFNNTEFXVCAgcjUsIHI0LCByOCwgcjUgIC8vIGFjY3UyID0gYWNjdTIqdmFsX3R3LmggKyBhY2N1MSp2YWxfdHcubAotICAgIFNNTEFXQiAgcjQsIHI0LCByOCwgcjkgIC8vIGFjY3UxID0gYWNjdTEqdmFsX3R3LmggLSBhY2N1Mip2YWxfdHcubAorICAgICAgU01VTFdUIHI5LAorICAgICAgcjUsCisgICAgICByOCAgLy8gYWNjdVggPSBhY2N1Mip2YWxfdHcubAorICAgICAgICAgIFNNVUxXQiByNSwKKyAgICAgIHI1LAorICAgICAgcjggIC8vIGFjY3UyID0gYWNjdTIqdmFsX3R3LmgKKyAgICAgICAgICBSU0IgcjksCisgICAgICByOSwKKyMgMCAvLyBhY2N1WCA9LWFjY3UyKnZhbF90dy5sCisgICAgICBTTUxBV1QgcjUsIHI0LCByOCwKKyAgICAgIHI1ICAvLyBhY2N1MiA9IGFjY3UyKnZhbF90dy5oICsgYWNjdTEqdmFsX3R3LmwKKyAgICAgICAgICBTTUxBV0IgcjQsCisgICAgICByNCwgcjgsCisgICAgICByOSAgLy8gYWNjdTEgPSBhY2N1MSp2YWxfdHcuaCAtIGFjY3UyKnZhbF90dy5sCiAKLSAgICBMRFIgICAgIHI4LCBbcjFdLCAjNCAgICAvLyB2YWxfdHcgPSAqdHdpZGRsZSsrOwotICAgIExEUiAgICAgcjcsIFtyMywgIy00XSAgIC8vIGFjY3U0ID0gcERhdF8xWy0xXQotICAgIExEUiAgICAgcjYsIFtyMiwgIzRdICAgIC8vIGFjY3UzID0gcERhdF8wWzFdCisgICAgICAgICAgTERSIHI4LAorICAgICAgW3IxXSwKKyMgNCAvLyB2YWxfdHcgPSAqdHdpZGRsZSsrOworICAgICAgTERSIHI3LAorICAgICAgWyByMywgIyAtIDQgXSAgLy8gYWNjdTQgPSBwRGF0XzFbLTFdCisgICAgICBMRFIgcjYsCisgICAgICBbIHIyLCAjNCBdICAvLyBhY2N1MyA9IHBEYXRfMFsxXQogCi0gICAgU01VTFdCICByOSwgcjcsIHI4ICAgICAgLy8gYWNjdVggPSBhY2N1NCp2YWxfdHcuaAotICAgIFNNVUxXVCAgcjcsIHI3LCByOCAgICAgIC8vIGFjY3U0ID0gYWNjdTQqdmFsX3R3LmwKLSAgICBSU0IgICAgIHI5LCByOSwgIzAgICAgICAvLyBhY2N1WCA9LWFjY3U0KnZhbF90dy5oCi0gICAgU01MQVdCICByNywgcjYsIHI4LCByNyAgLy8gYWNjdTQgPSBhY2N1NCp2YWxfdHcubCthY2N1Myp2YWxfdHcuaAotICAgIFNNTEFXVCAgcjYsIHI2LCByOCwgcjkgIC8vIGFjY3UzID0gYWNjdTMqdmFsX3R3LmwtYWNjdTQqdmFsX3R3LmgKKyAgICAgIFNNVUxXQiByOSwKKyAgICAgIHI3LAorICAgICAgcjggIC8vIGFjY3VYID0gYWNjdTQqdmFsX3R3LmgKKyAgICAgICAgICBTTVVMV1QgcjcsCisgICAgICByNywKKyAgICAgIHI4ICAvLyBhY2N1NCA9IGFjY3U0KnZhbF90dy5sCisgICAgICAgICAgUlNCIHI5LAorICAgICAgcjksCisjIDAgLy8gYWNjdVggPS1hY2N1NCp2YWxfdHcuaAorICAgICAgU01MQVdCIHI3LCByNiwgcjgsCisgICAgICByNyAgLy8gYWNjdTQgPSBhY2N1NCp2YWxfdHcubCthY2N1Myp2YWxfdHcuaAorICAgICAgICAgIFNNTEFXVCByNiwKKyAgICAgIHI2LCByOCwKKyAgICAgIHI5ICAvLyBhY2N1MyA9IGFjY3UzKnZhbF90dy5sLWFjY3U0KnZhbF90dy5oCiAKLSAgICBTVFIgICAgIHI1LCBbcjJdLCAjNCAgICAvLyAqcERhdF8wKysgPSBhY2N1MgotICAgIFNUUiAgICAgcjQsIFtyMl0sICM0ICAgIC8vICpwRGF0XzArKyA9IGFjY3UxCi0gICAgU1RSICAgICByNiwgW3IzXSwgIy00ICAgLy8gKnBEYXRfMS0tID0gYWNjdTMKLSAgICBTVFIgICAgIHI3LCBbcjNdLCAjLTQgICAvLyAqcERhdF8xLS0gPSBhY2N1NAorICAgICAgICAgIFNUUiByNSwKKyAgICAgIFtyMl0sCisjIDQgLy8gKnBEYXRfMCsrID0gYWNjdTIKKyAgICAgIFNUUiByNCwgW3IyXSwKKyMgNCAvLyAqcERhdF8wKysgPSBhY2N1MQorICAgICAgU1RSIHI2LCBbcjNdLAorIy0gNCAvLyAqcERhdF8xLS0gPSBhY2N1MworICAgICAgU1RSIHI3LCBbcjNdLAorIy0gNCAvLyAqcERhdF8xLS0gPSBhY2N1NAogCi0vKiAgU2Vjb25kIGl0ZXJhdGlvbiAqLwotICAgIExEUiAgICAgcjgsIFtyMV0sICM0ICAgIC8vIHZhbF90dyA9ICp0d2lkZGxlKys7Ci0gICAgTERSICAgICByNSwgW3IyLCAjMF0gICAgLy8gYWNjdTIgPSBwRGF0XzBbMF0KLSAgICBMRFIgICAgIHI0LCBbcjMsICMwXSAgICAvLyBhY2N1MSA9IHBEYXRfMVswXQorICAgICAgLyogIFNlY29uZCBpdGVyYXRpb24gKi8KKyAgICAgIExEUiByOCwgW3IxXSwKKyMgNCAvLyB2YWxfdHcgPSAqdHdpZGRsZSsrOworICAgICAgTERSIHI1LAorICAgICAgWyByMiwgIzAgXSAgLy8gYWNjdTIgPSBwRGF0XzBbMF0KKyAgICAgIExEUiByNCwKKyAgICAgIFsgcjMsICMwIF0gIC8vIGFjY3UxID0gcERhdF8xWzBdCiAKLSAgICBTTVVMV1QgIHI5LCByNSwgcjggICAgICAvLyBhY2N1WCA9IGFjY3UyKnZhbF90dy5sCi0gICAgU01VTFdCICByNSwgcjUsIHI4ICAgICAgLy8gYWNjdTIgPSBhY2N1Mip2YWxfdHcuaAotICAgIFJTQiAgICAgcjksIHI5LCAjMCAgICAgIC8vIGFjY3VYID0tYWNjdTIqdmFsX3R3LmwKLSAgICBTTUxBV1QgIHI1LCByNCwgcjgsIHI1ICAvLyBhY2N1MiA9IGFjY3UyKnZhbF90dy5oICsgYWNjdTEqdmFsX3R3LmwKLSAgICBTTUxBV0IgIHI0LCByNCwgcjgsIHI5ICAvLyBhY2N1MSA9IGFjY3UxKnZhbF90dy5oIC0gYWNjdTIqdmFsX3R3LmwKKyAgICAgIFNNVUxXVCByOSwKKyAgICAgIHI1LAorICAgICAgcjggIC8vIGFjY3VYID0gYWNjdTIqdmFsX3R3LmwKKyAgICAgICAgICBTTVVMV0IgcjUsCisgICAgICByNSwKKyAgICAgIHI4ICAvLyBhY2N1MiA9IGFjY3UyKnZhbF90dy5oCisgICAgICAgICAgUlNCIHI5LAorICAgICAgcjksCisjIDAgLy8gYWNjdVggPS1hY2N1Mip2YWxfdHcubAorICAgICAgU01MQVdUIHI1LCByNCwgcjgsCisgICAgICByNSAgLy8gYWNjdTIgPSBhY2N1Mip2YWxfdHcuaCArIGFjY3UxKnZhbF90dy5sCisgICAgICAgICAgU01MQVdCIHI0LAorICAgICAgcjQsIHI4LAorICAgICAgcjkgIC8vIGFjY3UxID0gYWNjdTEqdmFsX3R3LmggLSBhY2N1Mip2YWxfdHcubAogCi0gICAgTERSICAgICByOCwgW3IxXSwgIzQgICAgLy8gdmFsX3R3ID0gKnR3aWRkbGUrKzsKLSAgICBMRFIgICAgIHI3LCBbcjMsICMtNF0gICAvLyBhY2N1NCA9IHBEYXRfMVstMV0KLSAgICBMRFIgICAgIHI2LCBbcjIsICM0XSAgICAvLyBhY2N1MyA9IHBEYXRfMFsxXQorICAgICAgICAgIExEUiByOCwKKyAgICAgIFtyMV0sCisjIDQgLy8gdmFsX3R3ID0gKnR3aWRkbGUrKzsKKyAgICAgIExEUiByNywKKyAgICAgIFsgcjMsICMgLSA0IF0gIC8vIGFjY3U0ID0gcERhdF8xWy0xXQorICAgICAgTERSIHI2LAorICAgICAgWyByMiwgIzQgXSAgLy8gYWNjdTMgPSBwRGF0XzBbMV0KIAotICAgIFNNVUxXQiAgcjksIHI3LCByOCAgICAgIC8vIGFjY3VYID0gYWNjdTQqdmFsX3R3LmgKLSAgICBTTVVMV1QgIHI3LCByNywgcjggICAgICAvLyBhY2N1NCA9IGFjY3U0KnZhbF90dy5sCi0gICAgUlNCICAgICByOSwgcjksICMwICAgICAgLy8gYWNjdVggPS1hY2N1NCp2YWxfdHcuaAotICAgIFNNTEFXQiAgcjcsIHI2LCByOCwgcjcgIC8vIGFjY3U0ID0gYWNjdTQqdmFsX3R3LmwrYWNjdTMqdmFsX3R3LmgKLSAgICBTTUxBV1QgIHI2LCByNiwgcjgsIHI5ICAvLyBhY2N1MyA9IGFjY3UzKnZhbF90dy5sLWFjY3U0KnZhbF90dy5oCisgICAgICBTTVVMV0IgcjksCisgICAgICByNywKKyAgICAgIHI4ICAvLyBhY2N1WCA9IGFjY3U0KnZhbF90dy5oCisgICAgICAgICAgU01VTFdUIHI3LAorICAgICAgcjcsCisgICAgICByOCAgLy8gYWNjdTQgPSBhY2N1NCp2YWxfdHcubAorICAgICAgICAgIFJTQiByOSwKKyAgICAgIHI5LAorIyAwIC8vIGFjY3VYID0tYWNjdTQqdmFsX3R3LmgKKyAgICAgIFNNTEFXQiByNywgcjYsIHI4LAorICAgICAgcjcgIC8vIGFjY3U0ID0gYWNjdTQqdmFsX3R3LmwrYWNjdTMqdmFsX3R3LmgKKyAgICAgICAgICBTTUxBV1QgcjYsCisgICAgICByNiwgcjgsCisgICAgICByOSAgLy8gYWNjdTMgPSBhY2N1Myp2YWxfdHcubC1hY2N1NCp2YWxfdHcuaAogCi0gICAgU1RSICAgICByNSwgW3IyXSwgIzQgICAgLy8gKnBEYXRfMCsrID0gYWNjdTIKLSAgICBTVFIgICAgIHI0LCBbcjJdLCAjNCAgICAvLyAqcERhdF8wKysgPSBhY2N1MQotICAgIFNUUiAgICAgcjYsIFtyM10sICMtNCAgIC8vICpwRGF0XzEtLSA9IGFjY3UzCi0gICAgU1RSICAgICByNywgW3IzXSwgIy00ICAgLy8gKnBEYXRfMS0tID0gYWNjdTQKKyAgICAgICAgICBTVFIgcjUsCisgICAgICBbcjJdLAorIyA0IC8vICpwRGF0XzArKyA9IGFjY3UyCisgICAgICBTVFIgcjQsIFtyMl0sCisjIDQgLy8gKnBEYXRfMCsrID0gYWNjdTEKKyAgICAgIFNUUiByNiwgW3IzXSwKKyMtIDQgLy8gKnBEYXRfMS0tID0gYWNjdTMKKyAgICAgIFNUUiByNywgW3IzXSwKKyMtIDQgLy8gKnBEYXRfMS0tID0gYWNjdTQKIAotICAgIFNVQlMgICAgcjAsIHIwLCAjMQotICAgIEJORSAgICAgZGN0X0lWX2xvb3AxX3N0YXJ0CisgICAgICBTVUJTIHIwLCByMCwKKyMgMSBCTkUgZGN0X0lWX2xvb3AxX3N0YXJ0CiAKLSAgICBQT1AgICAgIHtyNC1yOX0KKyAgICAgIFBPUCB7IHI0IC0gcjkgfQogCi0gICAgQlggICAgICBscgorICBCWCBscgogfQogCiAjZW5kaWYgLyogRlVOQ1RJT05fZGN0X0lWX2Z1bmMxICovCiAKLQogI2lmZGVmIEZVTkNUSU9OX2RjdF9JVl9mdW5jMgogCi1GREtfSU5MSU5FCiAvKiBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpICovCi1zdGF0aWMgdm9pZCBkY3RfSVZfZnVuYzIoCi0gICAgaW50IGksCi0gICAgY29uc3QgRklYUF9TUEsgKnR3aWRkbGUsCi0gICAgRklYUF9EQkwgKnBEYXRfMCwKLSAgICBGSVhQX0RCTCAqcERhdF8xLAotICAgIGludCBpbmMpCi17CitzdGF0aWMgaW5saW5lIHZvaWQgZGN0X0lWX2Z1bmMyKGludCBpLCBjb25zdCBGSVhQX1NQSyAqdHdpZGRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBEYXRfMCwgRklYUF9EQkwgKnBEYXRfMSwgaW50IGluYykgewogICBGSVhQX0RCTCBhY2N1MSwgYWNjdTIsIGFjY3UzLCBhY2N1NCwgYWNjdVg7CiAgIExPTkcgdmFsX3R3OwogCiAgIGFjY3UxID0gcERhdF8xWy0yXTsKICAgYWNjdTIgPSBwRGF0XzFbLTFdOwogCi0gICotLXBEYXRfMSA9IC0ocERhdF8wWzFdPj4xKTsKLSAgKnBEYXRfMCsrID0gKHBEYXRfMFswXT4+MSk7CisgICotLXBEYXRfMSA9IC0ocERhdF8wWzFdID4+IDEpOworICAqcERhdF8wKysgPSAocERhdF8wWzBdID4+IDEpOwogCiAgIHR3aWRkbGUgKz0gaW5jOwogCi1fX2FzbQotICB7Ci0gICAgTERSICAgICB2YWxfdHcsIFt0d2lkZGxlXSwgaW5jLCBMU0wgIzIgICAgLy8gdmFsX3R3ID0gKnR3aWRkbGU7IHR3aWRkbGUgKz0gaW5jCisgIF9fYXNtIHsKKyAgICBMRFIgICAgIHZhbF90dywgW3R3aWRkbGVdLCBpbmMsIExTTCAjMiAgLy8gdmFsX3R3ID0gKnR3aWRkbGU7IHR3aWRkbGUgKz0gaW5jCiAgICAgQiAgICAgICBkY3RfSVZfbG9vcDJfMm5kX3BhcnQKIAotICAgIC8qIDQyIGN5Y2xlcyBmb3IgMiBpdGVyYXRpb25zID0gMjEgY3ljbGVzL2l0ZXJhdGlvbiAqLworICAgICAgICAvKiA0MiBjeWNsZXMgZm9yIDIgaXRlcmF0aW9ucyA9IDIxIGN5Y2xlcy9pdGVyYXRpb24gKi8KIGRjdF9JVl9sb29wMjoKICAgICBTTVVMV1QgIGFjY3VYLCBhY2N1MiwgdmFsX3R3CiAgICAgU01VTFdCICBhY2N1MiwgYWNjdTIsIHZhbF90dwpAQCAtMjI0LDcgKzI5MCw3IEBACiAgICAgTERSICAgICBhY2N1MSwgW3BEYXRfMSwgIy04XQogICAgIExEUiAgICAgYWNjdTIsIFtwRGF0XzEsICMtNF0KIAotICAgIExEUiAgICAgdmFsX3R3LCBbdHdpZGRsZV0sIGluYywgTFNMICMyICAgIC8vIHZhbF90dyA9ICp0d2lkZGxlOyB0d2lkZGxlICs9IGluYworICAgIExEUiAgICAgdmFsX3R3LCBbdHdpZGRsZV0sIGluYywgTFNMICMyICAvLyB2YWxfdHcgPSAqdHdpZGRsZTsgdHdpZGRsZSArPSBpbmMKIAogICAgIFNUUiAgICAgYWNjdVgsIFtwRGF0XzEsICMtNF0gIQogICAgIFNUUiAgICAgYWNjdTQsIFtwRGF0XzBdLCAjNApAQCAtMjUyLDcgKzMxOCw3IEBACiAgICAgU1RSICAgICBhY2N1WCwgW3BEYXRfMSwgIy00XSAhCiAgICAgU1RSICAgICBhY2N1NCwgW3BEYXRfMF0sICM0CiAKLSAgICBMRFIgICAgIHZhbF90dywgW3R3aWRkbGVdLCBpbmMsIExTTCAjMiAgICAvLyB2YWxfdHcgPSAqdHdpZGRsZTsgdHdpZGRsZSArPSBpbmMKKyAgICBMRFIgICAgIHZhbF90dywgW3R3aWRkbGVdLCBpbmMsIExTTCAjMiAgLy8gdmFsX3R3ID0gKnR3aWRkbGU7IHR3aWRkbGUgKz0gaW5jCiAKICAgICBTVUJTICAgIGksIGksICMxCiAgICAgQk5FICAgICBkY3RfSVZfbG9vcDIKQEAgLTI2Nyw5NiArMzMzLDE0OCBAQAogfQogI2VuZGlmIC8qIEZVTkNUSU9OX2RjdF9JVl9mdW5jMiAqLwogCi0KICNpZmRlZiBGVU5DVElPTl9kc3RfSVZfZnVuYzEKIAotX19hc20gdm9pZCBkc3RfSVZfZnVuYzEoCi0gICAgaW50IGksCi0gICAgY29uc3QgRklYUF9TUEsgKnR3aWRkbGUsCi0gICAgRklYUF9EQkwgKnBEYXRfMCwKLSAgICBGSVhQX0RCTCAqcERhdF8xKQotewotICAgIC8qIFJlZ2lzdGVyIG1hcDoKLSAgICAgICByMCAgIGkKLSAgICAgICByMSAgIHR3aWRkbGUKLSAgICAgICByMiAgIHBEYXRfMAotICAgICAgIHIzICAgcERhdF8xCi0gICAgICAgcjQgICBhY2N1MQotICAgICAgIHI1ICAgYWNjdTIKLSAgICAgICByNiAgIGFjY3UzCi0gICAgICAgcjcgICBhY2N1NAotICAgICAgIHI4ICAgdmFsX3R3Ci0gICAgICAgcjkgICBhY2N1WAotICAgICovCi0gICAgUFVTSCAgICB7cjQtcjl9CitfX2FzbSB2b2lkIGRzdF9JVl9mdW5jMShpbnQgaSwgY29uc3QgRklYUF9TUEsgKnR3aWRkbGUsIEZJWFBfREJMICpwRGF0XzAsCisgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcERhdF8xKSB7CisgIC8qIFJlZ2lzdGVyIG1hcDoKKyAgICAgcjAgICBpCisgICAgIHIxICAgdHdpZGRsZQorICAgICByMiAgIHBEYXRfMAorICAgICByMyAgIHBEYXRfMQorICAgICByNCAgIGFjY3UxCisgICAgIHI1ICAgYWNjdTIKKyAgICAgcjYgICBhY2N1MworICAgICByNyAgIGFjY3U0CisgICAgIHI4ICAgdmFsX3R3CisgICAgIHI5ICAgYWNjdVgKKyAgKi8KKyAgUFVTSHtyNCAtIHI5fQogCi1kc3RfSVZfbG9vcDEKLSAgICBMRFIgICAgIHI4LCBbcjFdLCAjNCAgICAgICAgICAgICAgIC8vIHZhbF90dyA9ICp0d2lkZGxlKysKLSAgICBMRFIgICAgIHI1LCBbcjJdICAgICAgICAgICAgICAgICAgIC8vIGFjY3UyID0gcERhdF8wWzBdCi0gICAgTERSICAgICByNiwgW3IyLCAjNF0gICAgICAgICAgICAgICAvLyBhY2N1MyA9IHBEYXRfMFsxXQotICAgIFJTQiAgICAgcjUsIHI1LCAjMCAgICAgICAgICAgICAgICAgLy8gYWNjdTIgPSAtYWNjdTIKLSAgICBTTVVMV1QgIHI5LCByNSwgcjggICAgICAgICAgICAgICAgIC8vIGFjY3VYID0gKC1hY2N1MikqdmFsX3R3LmwKLSAgICBMRFIgICAgIHI0LCBbcjMsICMtNF0gICAgICAgICAgICAgIC8vIGFjY3UxID0gcERhdF8xWy0xXQotICAgIFJTQiAgICAgcjksIHI5LCAjMCAgICAgICAgICAgICAgICAgLy8gYWNjdVggPSAtKC1hY2N1MikqdmFsX3R3LmwKLSAgICBTTUxBV0IgIHI5LCByNCwgcjgsIHI5ICAgICAgICAgICAgIC8vIGFjY3VYID0gYWNjdTEqdmFsX3R3LmgtKC1hY2N1MikqdmFsX3R3LmwKLSAgICBTTVVMV1QgIHI0LCByNCwgcjggICAgICAgICAgICAgICAgIC8vIGFjY3UxID0gYWNjdTEqdmFsX3R3LmwKLSAgICBMRFIgICAgIHI3LCBbcjMsICMtOF0gICAgICAgICAgICAgIC8vIGFjY3U0ID0gcERhdF8xWy0yXQotICAgIFNNTEFXQiAgcjUsIHI1LCByOCwgcjQgICAgICAgICAgICAgLy8gYWNjdTIgPSAoLWFjY3UyKSp2YWxfdHcudCthY2N1MSp2YWxfdHcubAotICAgIExEUiAgICAgcjgsIFtyMV0sICM0ICAgICAgICAgICAgICAgLy8gdmFsX3R3ID0gKnR3aWRkbGUrKwotICAgIFNUUiAgICAgcjUsIFtyMl0sICM0ICAgICAgICAgICAgICAgLy8gKnBEYXRfMCsrID0gYWNjdTIKLSAgICBTVFIgICAgIHI5LCBbcjJdLCAjNCAgICAgICAgICAgICAgIC8vICpwRGF0XzArKyA9IGFjY3UxIChhY2N1WCkKLSAgICBSU0IgICAgIHI3LCByNywgIzAgICAgICAgICAgICAgICAgIC8vIGFjY3U0ID0gLWFjY3U0Ci0gICAgU01VTFdCICByNSwgcjcsIHI4ICAgICAgICAgICAgICAgICAvLyBhY2N1MiA9ICgtYWNjdTQpKnZhbF90dy5oCi0gICAgU01VTFdCICByNCwgcjYsIHI4ICAgICAgICAgICAgICAgICAvLyBhY2N1MSA9ICgtYWNjdTQpKnZhbF90dy5sCi0gICAgUlNCICAgICByNSwgcjUsICMwICAgICAgICAgICAgICAgICAvLyBhY2N1MiA9IC0oLWFjY3U0KSp2YWxfdHcuaAotICAgIFNNTEFXVCAgcjYsIHI2LCByOCwgcjUgICAgICAgICAgICAgLy8gYWNjdTMgPSAoLWFjY3U0KSp2YWxfdHcubC0oLWFjY3UzKSp2YWxfdHcuaAotICAgIFNNTEFXVCAgcjcsIHI3LCByOCwgcjQgICAgICAgICAgICAgLy8gYWNjdTQgPSAoLWFjY3UzKSp2YWxfdHcubCsoLWFjY3U0KSp2YWxfdHcuaAotICAgIFNUUiAgICAgcjYsIFtyMywgIy00XSAhICAgICAgICAgICAgLy8gKi0tcERhdF8xID0gYWNjdTMKLSAgICBTVFIgICAgIHI3LCBbcjMsICMtNF0gISAgICAgICAgICAgIC8vICotLXBEYXRfMSA9IGFjY3U0CisgIGRzdF9JVl9sb29wMSBMRFIgcjgsCisgICAgICBbcjFdLAorIyA0IC8vIHZhbF90dyA9ICp0d2lkZGxlKysKKyAgICAgIExEUiByNSwKKyAgICAgIFtyMl0gIC8vIGFjY3UyID0gcERhdF8wWzBdCisgICAgICBMRFIgcjYsCisgICAgICBbIHIyLCAjNCBdICAvLyBhY2N1MyA9IHBEYXRfMFsxXQorICAgICAgUlNCIHI1LAorICAgICAgcjUsCisjIDAgLy8gYWNjdTIgPSAtYWNjdTIKKyAgICAgIFNNVUxXVCByOSwgcjUsCisgICAgICByOCAgLy8gYWNjdVggPSAoLWFjY3UyKSp2YWxfdHcubAorICAgICAgICAgIExEUiByNCwKKyAgICAgIFsgcjMsICMgLSA0IF0gIC8vIGFjY3UxID0gcERhdF8xWy0xXQorICAgICAgUlNCIHI5LAorICAgICAgcjksCisjIDAgLy8gYWNjdVggPSAtKC1hY2N1MikqdmFsX3R3LmwKKyAgICAgIFNNTEFXQiByOSwgcjQsIHI4LAorICAgICAgcjkgIC8vIGFjY3VYID0gYWNjdTEqdmFsX3R3LmgtKC1hY2N1MikqdmFsX3R3LmwKKyAgICAgICAgICBTTVVMV1QgcjQsCisgICAgICByNCwKKyAgICAgIHI4ICAvLyBhY2N1MSA9IGFjY3UxKnZhbF90dy5sCisgICAgICAgICAgTERSIHI3LAorICAgICAgWyByMywgIyAtIDggXSAgLy8gYWNjdTQgPSBwRGF0XzFbLTJdCisgICAgICBTTUxBV0IgcjUsCisgICAgICByNSwgcjgsCisgICAgICByNCAgLy8gYWNjdTIgPSAoLWFjY3UyKSp2YWxfdHcudCthY2N1MSp2YWxfdHcubAorICAgICAgICAgIExEUiByOCwKKyAgICAgIFtyMV0sCisjIDQgLy8gdmFsX3R3ID0gKnR3aWRkbGUrKworICAgICAgU1RSIHI1LCBbcjJdLAorIyA0IC8vICpwRGF0XzArKyA9IGFjY3UyCisgICAgICBTVFIgcjksIFtyMl0sCisjIDQgLy8gKnBEYXRfMCsrID0gYWNjdTEgKGFjY3VYKQorICAgICAgUlNCIHI3LCByNywKKyMgMCAvLyBhY2N1NCA9IC1hY2N1NAorICAgICAgU01VTFdCIHI1LCByNywKKyAgICAgIHI4ICAvLyBhY2N1MiA9ICgtYWNjdTQpKnZhbF90dy5oCisgICAgICAgICAgU01VTFdCIHI0LAorICAgICAgcjYsCisgICAgICByOCAgLy8gYWNjdTEgPSAoLWFjY3U0KSp2YWxfdHcubAorICAgICAgICAgIFJTQiByNSwKKyAgICAgIHI1LAorIyAwIC8vIGFjY3UyID0gLSgtYWNjdTQpKnZhbF90dy5oCisgICAgICBTTUxBV1QgcjYsIHI2LCByOCwKKyAgICAgIHI1ICAvLyBhY2N1MyA9ICgtYWNjdTQpKnZhbF90dy5sLSgtYWNjdTMpKnZhbF90dy5oCisgICAgICAgICAgU01MQVdUIHI3LAorICAgICAgcjcsIHI4LAorICAgICAgcjQgIC8vIGFjY3U0ID0gKC1hY2N1MykqdmFsX3R3LmwrKC1hY2N1NCkqdmFsX3R3LmgKKyAgICAgICAgICBTVFIgcjYsCisgICAgICBbIHIzLCAjIC0gNCBdICEgIC8vICotLXBEYXRfMSA9IGFjY3UzCisgICAgICBTVFIgcjcsCisgICAgICBbIHIzLCAjIC0gNCBdICEgIC8vICotLXBEYXRfMSA9IGFjY3U0CiAKLSAgICBMRFIgICAgIHI4LCBbcjFdLCAjNCAgICAgICAgICAgICAgIC8vIHZhbF90dyA9ICp0d2lkZGxlKysKLSAgICBMRFIgICAgIHI1LCBbcjJdICAgICAgICAgICAgICAgICAgIC8vIGFjY3UyID0gcERhdF8wWzBdCi0gICAgTERSICAgICByNiwgW3IyLCAjNF0gICAgICAgICAgICAgICAvLyBhY2N1MyA9IHBEYXRfMFsxXQotICAgIFJTQiAgICAgcjUsIHI1LCAjMCAgICAgICAgICAgICAgICAgLy8gYWNjdTIgPSAtYWNjdTIKLSAgICBTTVVMV1QgIHI5LCByNSwgcjggICAgICAgICAgICAgICAgIC8vIGFjY3VYID0gKC1hY2N1MikqdmFsX3R3LmwKLSAgICBMRFIgICAgIHI0LCBbcjMsICMtNF0gICAgICAgICAgICAgIC8vIGFjY3UxID0gcERhdF8xWy0xXQotICAgIFJTQiAgICAgcjksIHI5LCAjMCAgICAgICAgICAgICAgICAgLy8gYWNjdVggPSAtKC1hY2N1MikqdmFsX3R3LmwKLSAgICBTTUxBV0IgIHI5LCByNCwgcjgsIHI5ICAgICAgICAgICAgIC8vIGFjY3VYID0gYWNjdTEqdmFsX3R3LmgtKC1hY2N1MikqdmFsX3R3LmwKLSAgICBTTVVMV1QgIHI0LCByNCwgcjggICAgICAgICAgICAgICAgIC8vIGFjY3UxID0gYWNjdTEqdmFsX3R3LmwKLSAgICBMRFIgICAgIHI3LCBbcjMsICMtOF0gICAgICAgICAgICAgIC8vIGFjY3U0ID0gcERhdF8xWy0yXQotICAgIFNNTEFXQiAgcjUsIHI1LCByOCwgcjQgICAgICAgICAgICAgLy8gYWNjdTIgPSAoLWFjY3UyKSp2YWxfdHcudCthY2N1MSp2YWxfdHcubAotICAgIExEUiAgICAgcjgsIFtyMV0sICM0ICAgICAgICAgICAgICAgLy8gdmFsX3R3ID0gKnR3aWRkbGUrKwotICAgIFNUUiAgICAgcjUsIFtyMl0sICM0ICAgICAgICAgICAgICAgLy8gKnBEYXRfMCsrID0gYWNjdTIKLSAgICBTVFIgICAgIHI5LCBbcjJdLCAjNCAgICAgICAgICAgICAgIC8vICpwRGF0XzArKyA9IGFjY3UxIChhY2N1WCkKLSAgICBSU0IgICAgIHI3LCByNywgIzAgICAgICAgICAgICAgICAgIC8vIGFjY3U0ID0gLWFjY3U0Ci0gICAgU01VTFdCICByNSwgcjcsIHI4ICAgICAgICAgICAgICAgICAvLyBhY2N1MiA9ICgtYWNjdTQpKnZhbF90dy5oCi0gICAgU01VTFdCICByNCwgcjYsIHI4ICAgICAgICAgICAgICAgICAvLyBhY2N1MSA9ICgtYWNjdTQpKnZhbF90dy5sCi0gICAgUlNCICAgICByNSwgcjUsICMwICAgICAgICAgICAgICAgICAvLyBhY2N1MiA9IC0oLWFjY3U0KSp2YWxfdHcuaAotICAgIFNNTEFXVCAgcjYsIHI2LCByOCwgcjUgICAgICAgICAgICAgLy8gYWNjdTMgPSAoLWFjY3U0KSp2YWxfdHcubC0oLWFjY3UzKSp2YWxfdHcuaAotICAgIFNNTEFXVCAgcjcsIHI3LCByOCwgcjQgICAgICAgICAgICAgLy8gYWNjdTQgPSAoLWFjY3UzKSp2YWxfdHcubCsoLWFjY3U0KSp2YWxfdHcuaAotICAgIFNUUiAgICAgcjYsIFtyMywgIy00XSAhICAgICAgICAgICAgLy8gKi0tcERhdF8xID0gYWNjdTMKLSAgICBTVFIgICAgIHI3LCBbcjMsICMtNF0gISAgICAgICAgICAgIC8vICotLXBEYXRfMSA9IGFjY3U0CisgICAgICBMRFIgcjgsCisgICAgICBbcjFdLAorIyA0IC8vIHZhbF90dyA9ICp0d2lkZGxlKysKKyAgICAgIExEUiByNSwKKyAgICAgIFtyMl0gIC8vIGFjY3UyID0gcERhdF8wWzBdCisgICAgICBMRFIgcjYsCisgICAgICBbIHIyLCAjNCBdICAvLyBhY2N1MyA9IHBEYXRfMFsxXQorICAgICAgUlNCIHI1LAorICAgICAgcjUsCisjIDAgLy8gYWNjdTIgPSAtYWNjdTIKKyAgICAgIFNNVUxXVCByOSwgcjUsCisgICAgICByOCAgLy8gYWNjdVggPSAoLWFjY3UyKSp2YWxfdHcubAorICAgICAgICAgIExEUiByNCwKKyAgICAgIFsgcjMsICMgLSA0IF0gIC8vIGFjY3UxID0gcERhdF8xWy0xXQorICAgICAgUlNCIHI5LAorICAgICAgcjksCisjIDAgLy8gYWNjdVggPSAtKC1hY2N1MikqdmFsX3R3LmwKKyAgICAgIFNNTEFXQiByOSwgcjQsIHI4LAorICAgICAgcjkgIC8vIGFjY3VYID0gYWNjdTEqdmFsX3R3LmgtKC1hY2N1MikqdmFsX3R3LmwKKyAgICAgICAgICBTTVVMV1QgcjQsCisgICAgICByNCwKKyAgICAgIHI4ICAvLyBhY2N1MSA9IGFjY3UxKnZhbF90dy5sCisgICAgICAgICAgTERSIHI3LAorICAgICAgWyByMywgIyAtIDggXSAgLy8gYWNjdTQgPSBwRGF0XzFbLTJdCisgICAgICBTTUxBV0IgcjUsCisgICAgICByNSwgcjgsCisgICAgICByNCAgLy8gYWNjdTIgPSAoLWFjY3UyKSp2YWxfdHcudCthY2N1MSp2YWxfdHcubAorICAgICAgICAgIExEUiByOCwKKyAgICAgIFtyMV0sCisjIDQgLy8gdmFsX3R3ID0gKnR3aWRkbGUrKworICAgICAgU1RSIHI1LCBbcjJdLAorIyA0IC8vICpwRGF0XzArKyA9IGFjY3UyCisgICAgICBTVFIgcjksIFtyMl0sCisjIDQgLy8gKnBEYXRfMCsrID0gYWNjdTEgKGFjY3VYKQorICAgICAgUlNCIHI3LCByNywKKyMgMCAvLyBhY2N1NCA9IC1hY2N1NAorICAgICAgU01VTFdCIHI1LCByNywKKyAgICAgIHI4ICAvLyBhY2N1MiA9ICgtYWNjdTQpKnZhbF90dy5oCisgICAgICAgICAgU01VTFdCIHI0LAorICAgICAgcjYsCisgICAgICByOCAgLy8gYWNjdTEgPSAoLWFjY3U0KSp2YWxfdHcubAorICAgICAgICAgIFJTQiByNSwKKyAgICAgIHI1LAorIyAwIC8vIGFjY3UyID0gLSgtYWNjdTQpKnZhbF90dy5oCisgICAgICBTTUxBV1QgcjYsIHI2LCByOCwKKyAgICAgIHI1ICAvLyBhY2N1MyA9ICgtYWNjdTQpKnZhbF90dy5sLSgtYWNjdTMpKnZhbF90dy5oCisgICAgICAgICAgU01MQVdUIHI3LAorICAgICAgcjcsIHI4LAorICAgICAgcjQgIC8vIGFjY3U0ID0gKC1hY2N1MykqdmFsX3R3LmwrKC1hY2N1NCkqdmFsX3R3LmgKKyAgICAgICAgICBTVFIgcjYsCisgICAgICBbIHIzLCAjIC0gNCBdICEgIC8vICotLXBEYXRfMSA9IGFjY3UzCisgICAgICBTVFIgcjcsCisgICAgICBbIHIzLCAjIC0gNCBdICEgIC8vICotLXBEYXRfMSA9IGFjY3U0CiAKLSAgICBTVUJTICAgIHIwLCByMCwgIzQgICAgICAgICAgICAgICAgIC8vIGktPSA0Ci0gICAgQk5FICAgICBkc3RfSVZfbG9vcDEKKyAgICAgIFNVQlMgcjAsCisgICAgICByMCwKKyMgNCAvLyBpLT0gNAorICAgICAgQk5FIGRzdF9JVl9sb29wMQogCi0gICAgUE9QICAgICB7cjQtcjl9Ci0gICAgQlggICAgICBscgorICAgICAgICAgIFBPUHtyNCAtIHI5fSBCWCBscgogfQogI2VuZGlmIC8qIEZVTkNUSU9OX2RzdF9JVl9mdW5jMSAqLwogCiAjaWZkZWYgRlVOQ1RJT05fZHN0X0lWX2Z1bmMyCiAKLUZES19JTkxJTkUKIC8qIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkgKi8KLXN0YXRpYyB2b2lkIGRzdF9JVl9mdW5jMigKLSAgICBpbnQgaSwKLSAgICBjb25zdCBGSVhQX1NQSyAqdHdpZGRsZSwKLSAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdF8wLAotICAgIEZJWFBfREJMICpSRVNUUklDVCBwRGF0XzEsCi0gICAgaW50IGluYykKLXsKLSAgRklYUF9EQkwgYWNjdTEsYWNjdTIsYWNjdTMsYWNjdTQ7CitzdGF0aWMgaW5saW5lIHZvaWQgZHN0X0lWX2Z1bmMyKGludCBpLCBjb25zdCBGSVhQX1NQSyAqdHdpZGRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEYXRfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEYXRfMSwgaW50IGluYykgeworICBGSVhQX0RCTCBhY2N1MSwgYWNjdTIsIGFjY3UzLCBhY2N1NDsKICAgTE9ORyB2YWxfdHc7CiAKICAgYWNjdTQgPSBwRGF0XzBbMF07CkBAIC0zNzEsNzYgKzQ4OSw3NCBAQAogICAqcERhdF8wKysgPSBhY2N1MzsKICAgKnBEYXRfMS0tID0gYWNjdTQ7CiAKLQotICBfX2FzbQotICB7CisgIF9fYXNtIHsKICAgICBCICAgICAgIGRzdF9JVl9sb29wMl8ybmRfcGFydAogCi0gICAgLyogNTAgY3ljbGVzIGZvciAyIGl0ZXJhdGlvbnMgPSAyNSBjeWNsZXMvaXRlcmF0aW9uICovCisgICAgICAgIC8qIDUwIGN5Y2xlcyBmb3IgMiBpdGVyYXRpb25zID0gMjUgY3ljbGVzL2l0ZXJhdGlvbiAqLwogCiBkc3RfSVZfbG9vcDI6CiAKLSAgICBMRFIgICAgIHZhbF90dywgW3R3aWRkbGVdLCBpbmMsIExTTCAjMiAgICAvLyB2YWxfdHcgPSAqdHdpZGRsZTsgdHdpZGRsZSArPSBpbmMKKyAgICBMRFIgICAgIHZhbF90dywgW3R3aWRkbGVdLCBpbmMsIExTTCAjMiAgLy8gdmFsX3R3ID0gKnR3aWRkbGU7IHR3aWRkbGUgKz0gaW5jCiAKLSAgICBSU0IgICAgIGFjY3UyLCBhY2N1MiwgIzAgICAgICAgICAgICAgICAgICAvLyBhY2N1MiA9IC1hY2N1MgotICAgIFJTQiAgICAgYWNjdTEsIGFjY3UxLCAjMCAgICAgICAgICAgICAgICAgIC8vIGFjY3UxID0gLWFjY3UxCi0gICAgU01VTFdUICBhY2N1MywgYWNjdTIsIHZhbF90dyAgICAgICAgICAgICAgLy8gYWNjdTMgPSAoLWFjY3UyKSp2YWxfdHcubAotICAgIFNNVUxXVCAgYWNjdTQsIGFjY3UxLCB2YWxfdHcgICAgICAgICAgICAgIC8vIGFjY3U0ID0gKC1hY2N1MSkqdmFsX3R3LmwKLSAgICBSU0IgICAgIGFjY3UzLCBhY2N1MywgIzAgICAgICAgICAgICAgICAgICAvLyBhY2N1MyA9IC1hY2N1Mip2YWxfdHcubAotICAgIFNNTEFXQiAgYWNjdTEsIGFjY3UxLCB2YWxfdHcsIGFjY3UzICAgICAgIC8vIGFjY3UxID0gLWFjY3UxKnZhbF90dy5oLSgtYWNjdTIpKnZhbF90dy5sCi0gICAgU01MQVdCICBhY2N1MiwgYWNjdTIsIHZhbF90dywgYWNjdTQgICAgICAgLy8gYWNjdTIgPSAoLWFjY3UxKSp2YWxfdHcubCsoLWFjY3UyKSp2YWxfdHcuaAotICAgIFNUUiAgICAgYWNjdTEsIFtwRGF0XzFdLCAjLTQgICAgICAgICAgICAgIC8vICpwRGF0XzEtLSA9IGFjY3UxCi0gIAlTVFIgICAgIGFjY3UyLCBbcERhdF8wXSwgIzQgICAgICAgICAgICAgICAvLyAqcERhdF8wKysgPSBhY2N1MgorICAgIFJTQiAgICAgYWNjdTIsIGFjY3UyLCAjMCAgLy8gYWNjdTIgPSAtYWNjdTIKKyAgICBSU0IgICAgIGFjY3UxLCBhY2N1MSwgIzAgIC8vIGFjY3UxID0gLWFjY3UxCisgICAgU01VTFdUICBhY2N1MywgYWNjdTIsIHZhbF90dyAgLy8gYWNjdTMgPSAoLWFjY3UyKSp2YWxfdHcubAorICAgIFNNVUxXVCAgYWNjdTQsIGFjY3UxLCB2YWxfdHcgIC8vIGFjY3U0ID0gKC1hY2N1MSkqdmFsX3R3LmwKKyAgICBSU0IgICAgIGFjY3UzLCBhY2N1MywgIzAgIC8vIGFjY3UzID0gLWFjY3UyKnZhbF90dy5sCisgICAgU01MQVdCICBhY2N1MSwgYWNjdTEsIHZhbF90dywgYWNjdTMgIC8vIGFjY3UxID0gLWFjY3UxKnZhbF90dy5oLSgtYWNjdTIpKnZhbF90dy5sCisgICAgU01MQVdCICBhY2N1MiwgYWNjdTIsIHZhbF90dywgYWNjdTQgIC8vIGFjY3UyID0gKC1hY2N1MSkqdmFsX3R3LmwrKC1hY2N1MikqdmFsX3R3LmgKKyAgICBTVFIgICAgIGFjY3UxLCBbcERhdF8xXSwgIy00ICAvLyAqcERhdF8xLS0gPSBhY2N1MQorICAgIFNUUiAgICAgYWNjdTIsIFtwRGF0XzBdLCAjNCAgLy8gKnBEYXRfMCsrID0gYWNjdTIKIAotICAJTERSICAgICBhY2N1NCwgW3BEYXRfMF0gICAgICAgICAgICAgICAgICAgLy8gYWNjdTQgPSBwRGF0XzBbMF0KLSAgCUxEUiAgICAgYWNjdTMsIFtwRGF0XzAsICM0XSAgICAgICAgICAgICAgIC8vIGFjY3UzID0gcERhdF8wWzFdCisgICAgTERSICAgICBhY2N1NCwgW3BEYXRfMF0gIC8vIGFjY3U0ID0gcERhdF8wWzBdCisgICAgTERSICAgICBhY2N1MywgW3BEYXRfMCwgIzRdICAvLyBhY2N1MyA9IHBEYXRfMFsxXQogCi0gICAgUlNCICAgICBhY2N1NCwgYWNjdTQsICMwICAgICAgICAgICAgICAgICAgLy8gYWNjdTQgPSAtYWNjdTQKLSAgICBSU0IgICAgIGFjY3UzLCBhY2N1MywgIzAgICAgICAgICAgICAgICAgICAvLyBhY2N1MyA9IC1hY2N1MworICAgIFJTQiAgICAgYWNjdTQsIGFjY3U0LCAjMCAgLy8gYWNjdTQgPSAtYWNjdTQKKyAgICBSU0IgICAgIGFjY3UzLCBhY2N1MywgIzAgIC8vIGFjY3UzID0gLWFjY3UzCiAKLSAgICBTTVVMV0IgIGFjY3UxLCBhY2N1MywgdmFsX3R3ICAgICAgICAgICAgICAvLyBhY2N1MSA9ICgtYWNjdTMpKnZhbF90dy5oCi0gICAgU01VTFdUICBhY2N1MiwgYWNjdTMsIHZhbF90dyAgICAgICAgICAgICAgLy8gYWNjdTIgPSAoLWFjY3UzKSp2YWxfdHcubAotICAgIFJTQiAgICAgYWNjdTEsIGFjY3UxLCAjMCAgICAgICAgICAgICAgICAgIC8vIGFjY3UxID0gLSgtYWNjdTMpKnZhbF90dy5oCi0gICAgU01MQVdUICBhY2N1MywgYWNjdTQsIHZhbF90dywgYWNjdTEgICAgICAgLy8gYWNjdTMgPSAoLWFjY3U0KSp2YWxfdHcubC0oLWFjY3UzKSp2YWxfdHcuaAotICAgIFNNTEFXQiAgYWNjdTQsIGFjY3U0LCB2YWxfdHcsIGFjY3UyICAgICAgIC8vIGFjY3U0ID0gKC1hY2N1MykqdmFsX3R3LmwrKC1hY2N1NCkqdmFsX3R3LmgKKyAgICBTTVVMV0IgIGFjY3UxLCBhY2N1MywgdmFsX3R3ICAvLyBhY2N1MSA9ICgtYWNjdTMpKnZhbF90dy5oCisgICAgU01VTFdUICBhY2N1MiwgYWNjdTMsIHZhbF90dyAgLy8gYWNjdTIgPSAoLWFjY3UzKSp2YWxfdHcubAorICAgIFJTQiAgICAgYWNjdTEsIGFjY3UxLCAjMCAgLy8gYWNjdTEgPSAtKC1hY2N1MykqdmFsX3R3LmgKKyAgICBTTUxBV1QgIGFjY3UzLCBhY2N1NCwgdmFsX3R3LCBhY2N1MSAgLy8gYWNjdTMgPSAoLWFjY3U0KSp2YWxfdHcubC0oLWFjY3UzKSp2YWxfdHcuaAorICAgIFNNTEFXQiAgYWNjdTQsIGFjY3U0LCB2YWxfdHcsIGFjY3UyICAvLyBhY2N1NCA9ICgtYWNjdTMpKnZhbF90dy5sKygtYWNjdTQpKnZhbF90dy5oCiAKLSAgICBMRFIgICAgIGFjY3UxLCBbcERhdF8xLCAjLTRdICAgICAgICAgICAgICAvLyBhY2N1MSA9IHBEYXRfMVstMV0KLSAgICBMRFIgICAgIGFjY3UyLCBbcERhdF8xXSAgICAgICAgICAgICAgICAgICAvLyBhY2N1MiA9IHBEYXRfMVswXQorICAgIExEUiAgICAgYWNjdTEsIFtwRGF0XzEsICMtNF0gIC8vIGFjY3UxID0gcERhdF8xWy0xXQorICAgIExEUiAgICAgYWNjdTIsIFtwRGF0XzFdICAvLyBhY2N1MiA9IHBEYXRfMVswXQogCi0gICAgU1RSICAgICBhY2N1MywgW3BEYXRfMF0sICM0ICAgICAgICAgICAgICAgLy8gKnBEYXRfMCsrID0gYWNjdTMKLSAgICBTVFIgICAgIGFjY3U0LCBbcERhdF8xXSwgIy00ICAgICAgICAgICAgICAvLyAqcERhdF8xLS0gPSBhY2N1NAorICAgIFNUUiAgICAgYWNjdTMsIFtwRGF0XzBdLCAjNCAgLy8gKnBEYXRfMCsrID0gYWNjdTMKKyAgICBTVFIgICAgIGFjY3U0LCBbcERhdF8xXSwgIy00ICAvLyAqcERhdF8xLS0gPSBhY2N1NAogCiBkc3RfSVZfbG9vcDJfMm5kX3BhcnQ6CiAKLSAgICBMRFIgICAgIHZhbF90dywgW3R3aWRkbGVdLCBpbmMsIExTTCAjMiAgICAvLyB2YWxfdHcgPSAqdHdpZGRsZTsgdHdpZGRsZSArPSBpbmMKKyAgICBMRFIgICAgIHZhbF90dywgW3R3aWRkbGVdLCBpbmMsIExTTCAjMiAgLy8gdmFsX3R3ID0gKnR3aWRkbGU7IHR3aWRkbGUgKz0gaW5jCiAKLSAgICBSU0IgICAgIGFjY3UyLCBhY2N1MiwgIzAgICAgICAgICAgICAgICAgICAvLyBhY2N1MiA9IC1hY2N1MgotICAgIFJTQiAgICAgYWNjdTEsIGFjY3UxLCAjMCAgICAgICAgICAgICAgICAgIC8vIGFjY3UxID0gLWFjY3UxCi0gICAgU01VTFdUICBhY2N1MywgYWNjdTIsIHZhbF90dyAgICAgICAgICAgICAgLy8gYWNjdTMgPSAoLWFjY3UyKSp2YWxfdHcubAotICAgIFNNVUxXVCAgYWNjdTQsIGFjY3UxLCB2YWxfdHcgICAgICAgICAgICAgIC8vIGFjY3U0ID0gKC1hY2N1MSkqdmFsX3R3LmwKLSAgICBSU0IgICAgIGFjY3UzLCBhY2N1MywgIzAgICAgICAgICAgICAgICAgICAvLyBhY2N1MyA9IC1hY2N1Mip2YWxfdHcubAotICAgIFNNTEFXQiAgYWNjdTEsIGFjY3UxLCB2YWxfdHcsIGFjY3UzICAgICAgIC8vIGFjY3UxID0gLWFjY3UxKnZhbF90dy5oLSgtYWNjdTIpKnZhbF90dy5sCi0gICAgU01MQVdCICBhY2N1MiwgYWNjdTIsIHZhbF90dywgYWNjdTQgICAgICAgLy8gYWNjdTIgPSAoLWFjY3UxKSp2YWxfdHcubCsoLWFjY3UyKSp2YWxfdHcuaAotICAgIFNUUiAgICAgYWNjdTEsIFtwRGF0XzFdLCAjLTQgICAgICAgICAgICAgIC8vICpwRGF0XzEtLSA9IGFjY3UxCi0gIAlTVFIgICAgIGFjY3UyLCBbcERhdF8wXSwgIzQgICAgICAgICAgICAgICAvLyAqcERhdF8wKysgPSBhY2N1MgorICAgIFJTQiAgICAgYWNjdTIsIGFjY3UyLCAjMCAgLy8gYWNjdTIgPSAtYWNjdTIKKyAgICBSU0IgICAgIGFjY3UxLCBhY2N1MSwgIzAgIC8vIGFjY3UxID0gLWFjY3UxCisgICAgU01VTFdUICBhY2N1MywgYWNjdTIsIHZhbF90dyAgLy8gYWNjdTMgPSAoLWFjY3UyKSp2YWxfdHcubAorICAgIFNNVUxXVCAgYWNjdTQsIGFjY3UxLCB2YWxfdHcgIC8vIGFjY3U0ID0gKC1hY2N1MSkqdmFsX3R3LmwKKyAgICBSU0IgICAgIGFjY3UzLCBhY2N1MywgIzAgIC8vIGFjY3UzID0gLWFjY3UyKnZhbF90dy5sCisgICAgU01MQVdCICBhY2N1MSwgYWNjdTEsIHZhbF90dywgYWNjdTMgIC8vIGFjY3UxID0gLWFjY3UxKnZhbF90dy5oLSgtYWNjdTIpKnZhbF90dy5sCisgICAgU01MQVdCICBhY2N1MiwgYWNjdTIsIHZhbF90dywgYWNjdTQgIC8vIGFjY3UyID0gKC1hY2N1MSkqdmFsX3R3LmwrKC1hY2N1MikqdmFsX3R3LmgKKyAgICBTVFIgICAgIGFjY3UxLCBbcERhdF8xXSwgIy00ICAvLyAqcERhdF8xLS0gPSBhY2N1MQorICAgIFNUUiAgICAgYWNjdTIsIFtwRGF0XzBdLCAjNCAgLy8gKnBEYXRfMCsrID0gYWNjdTIKIAotICAJTERSICAgICBhY2N1NCwgW3BEYXRfMF0gICAgICAgICAgICAgICAgICAgLy8gYWNjdTQgPSBwRGF0XzBbMF0KLSAgCUxEUiAgICAgYWNjdTMsIFtwRGF0XzAsICM0XSAgICAgICAgICAgICAgIC8vIGFjY3UzID0gcERhdF8wWzFdCisgICAgTERSICAgICBhY2N1NCwgW3BEYXRfMF0gIC8vIGFjY3U0ID0gcERhdF8wWzBdCisgICAgTERSICAgICBhY2N1MywgW3BEYXRfMCwgIzRdICAvLyBhY2N1MyA9IHBEYXRfMFsxXQogCi0gICAgUlNCICAgICBhY2N1NCwgYWNjdTQsICMwICAgICAgICAgICAgICAgICAgLy8gYWNjdTQgPSAtYWNjdTQKLSAgICBSU0IgICAgIGFjY3UzLCBhY2N1MywgIzAgICAgICAgICAgICAgICAgICAvLyBhY2N1MyA9IC1hY2N1MworICAgIFJTQiAgICAgYWNjdTQsIGFjY3U0LCAjMCAgLy8gYWNjdTQgPSAtYWNjdTQKKyAgICBSU0IgICAgIGFjY3UzLCBhY2N1MywgIzAgIC8vIGFjY3UzID0gLWFjY3UzCiAKLSAgICBTTVVMV0IgIGFjY3UxLCBhY2N1MywgdmFsX3R3ICAgICAgICAgICAgICAvLyBhY2N1MSA9ICgtYWNjdTMpKnZhbF90dy5oCi0gICAgU01VTFdUICBhY2N1MiwgYWNjdTMsIHZhbF90dyAgICAgICAgICAgICAgLy8gYWNjdTIgPSAoLWFjY3UzKSp2YWxfdHcubAotICAgIFJTQiAgICAgYWNjdTEsIGFjY3UxLCAjMCAgICAgICAgICAgICAgICAgIC8vIGFjY3UxID0gLSgtYWNjdTMpKnZhbF90dy5oCi0gICAgU01MQVdUICBhY2N1MywgYWNjdTQsIHZhbF90dywgYWNjdTEgICAgICAgLy8gYWNjdTMgPSAoLWFjY3U0KSp2YWxfdHcubC0oLWFjY3UzKSp2YWxfdHcuaAotICAgIFNNTEFXQiAgYWNjdTQsIGFjY3U0LCB2YWxfdHcsIGFjY3UyICAgICAgIC8vIGFjY3U0ID0gKC1hY2N1MykqdmFsX3R3LmwrKC1hY2N1NCkqdmFsX3R3LmgKKyAgICBTTVVMV0IgIGFjY3UxLCBhY2N1MywgdmFsX3R3ICAvLyBhY2N1MSA9ICgtYWNjdTMpKnZhbF90dy5oCisgICAgU01VTFdUICBhY2N1MiwgYWNjdTMsIHZhbF90dyAgLy8gYWNjdTIgPSAoLWFjY3UzKSp2YWxfdHcubAorICAgIFJTQiAgICAgYWNjdTEsIGFjY3UxLCAjMCAgLy8gYWNjdTEgPSAtKC1hY2N1MykqdmFsX3R3LmgKKyAgICBTTUxBV1QgIGFjY3UzLCBhY2N1NCwgdmFsX3R3LCBhY2N1MSAgLy8gYWNjdTMgPSAoLWFjY3U0KSp2YWxfdHcubC0oLWFjY3UzKSp2YWxfdHcuaAorICAgIFNNTEFXQiAgYWNjdTQsIGFjY3U0LCB2YWxfdHcsIGFjY3UyICAvLyBhY2N1NCA9ICgtYWNjdTMpKnZhbF90dy5sKygtYWNjdTQpKnZhbF90dy5oCiAKLSAgICBMRFIgICAgIGFjY3UxLCBbcERhdF8xLCAjLTRdICAgICAgICAgICAgICAvLyBhY2N1MSA9IHBEYXRfMVstMV0KLSAgICBMRFIgICAgIGFjY3UyLCBbcERhdF8xXSAgICAgICAgICAgICAgICAgICAvLyBhY2N1MiA9IHBEYXRfMVswXQorICAgIExEUiAgICAgYWNjdTEsIFtwRGF0XzEsICMtNF0gIC8vIGFjY3UxID0gcERhdF8xWy0xXQorICAgIExEUiAgICAgYWNjdTIsIFtwRGF0XzFdICAvLyBhY2N1MiA9IHBEYXRfMVswXQogCi0gICAgU1RSICAgICBhY2N1MywgW3BEYXRfMF0sICM0ICAgICAgICAgICAgICAgLy8gKnBEYXRfMCsrID0gYWNjdTMKLSAgICBTVFIgICAgIGFjY3U0LCBbcERhdF8xXSwgIy00ICAgICAgICAgICAgICAvLyAqcERhdF8xLS0gPSBhY2N1NAorICAgIFNUUiAgICAgYWNjdTMsIFtwRGF0XzBdLCAjNCAgLy8gKnBEYXRfMCsrID0gYWNjdTMKKyAgICBTVFIgICAgIGFjY3U0LCBbcERhdF8xXSwgIy00ICAvLyAqcERhdF8xLS0gPSBhY2N1NAogCiAgICAgU1VCUyAgICBpLCBpLCAjMQogICAgIEJORSAgICAgZHN0X0lWX2xvb3AyCmRpZmYgLS1naXQgYS9saWJGREsvc3JjL2FybS9mZnRfcmFkMl9hcm0uY3BwIGIvbGliRkRLL3NyYy9hcm0vZmZ0X3JhZDJfYXJtLmNwcAppbmRleCBhNmUyZTQyLi4yYzAzYjExIDEwMDY0NAotLS0gYS9saWJGREsvc3JjL2FybS9mZnRfcmFkMl9hcm0uY3BwCisrKyBiL2xpYkZESy9zcmMvYXJtL2ZmdF9yYWQyX2FybS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjM5ICs5MCwyMjggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKKwogICAgRGVzY3JpcHRpb246IGRpdF9mZnQgQVJNIGFzc2VtYmxlciByZXBsYWNlbWVudHMuCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIE5FT04gb3B0aW1pemVkIEZGVCBjdXJyZW50bHkgYnVpbGRzIG9ubHkgd2l0aCBSVkNUIHRvb2xjaGFpbiAqLworI2lmbmRlZiBfX0ZGVF9SQUQyX0NQUF9fCisjZXJyb3IgXAorICAgICJEbyBub3QgY29tcGlsZSB0aGlzIGZpbGUgc2VwYXJhdGVseS4gSXQgaXMgaW5jbHVkZWQgb24gZGVtYW5kIGZyb20gZmZ0X3JhZDIuY3BwIgorI2VuZGlmCiAKICNpZm5kZWYgRlVOQ1RJT05fZGl0X2ZmdAotCi0vKiBJZiBkaXRfZmZ0IHdhcyBub3QgeWV0IGRlZmluZWQgYnkgQVJNLUNvcnRleCAuLi4gKi8KLQogI2lmIGRlZmluZWQoU0lORVRBQkxFXzE2QklUKQogCiAjZGVmaW5lIEZVTkNUSU9OX2RpdF9mZnQKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIGRhdGU6ICAgMjguMDcuMjAwNSAgIHNybAotCi0gICBDb250ZW50cy9kZXNjcmlwdGlvbjogZGl0LXR1a2V5LUZGVC1hbGdvcml0aG0KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiAjaWYgZGVmaW5lZChGVU5DVElPTl9kaXRfZmZ0KQogCit2b2lkIGRpdF9mZnQoRklYUF9EQkwgKngsIGNvbnN0IElOVCBsZG4sIGNvbnN0IEZJWFBfU1RQICp0cmlnZGF0YSwKKyAgICAgICAgICAgICBjb25zdCBJTlQgdHJpZ0RhdGFTaXplKSB7CisgIGNvbnN0IElOVCBuID0gMSA8PCBsZG47CisgIElOVCBpOwogCi12b2lkIGRpdF9mZnQoRklYUF9EQkwgKngsIGNvbnN0IElOVCBsZG4sIGNvbnN0IEZJWFBfU1RQICp0cmlnZGF0YSwgY29uc3QgSU5UIHRyaWdEYXRhU2l6ZSkKLXsKLSAgICBjb25zdCBJTlQgbj0xPDxsZG47Ci0gICAgSU5UIGk7CisgIHNjcmFtYmxlKHgsIG4pOworICAvKgorICAgKiAxKzIgc3RhZ2UgcmFkaXggNAorICAgKi8KIAotICAgIHNjcmFtYmxlKHgsbik7Ci0gICAgLyoKLSAgICAgKiAxKzIgc3RhZ2UgcmFkaXggNAotICAgICAqLworICBmb3IgKGkgPSAwOyBpIDwgbiAqIDI7IGkgKz0gOCkgeworICAgIEZJWFBfREJMIGEwMCwgYTEwLCBhMjAsIGEzMDsKKyAgICBhMDAgPSAoeFtpICsgMF0gKyB4W2kgKyAyXSkgPj4gMTsgLyogUmUgQSArIFJlIEIgKi8KKyAgICBhMTAgPSAoeFtpICsgNF0gKyB4W2kgKyA2XSkgPj4gMTsgLyogUmUgQyArIFJlIEQgKi8KKyAgICBhMjAgPSAoeFtpICsgMV0gKyB4W2kgKyAzXSkgPj4gMTsgLyogSW0gQSArIEltIEIgKi8KKyAgICBhMzAgPSAoeFtpICsgNV0gKyB4W2kgKyA3XSkgPj4gMTsgLyogSW0gQyArIEltIEQgKi8KIAotICAgIGZvciAoaT0wO2k8bioyO2krPTgpCisgICAgeFtpICsgMF0gPSBhMDAgKyBhMTA7IC8qIFJlIEEnID0gUmUgQSArIFJlIEIgKyBSZSBDICsgUmUgRCAqLworICAgIHhbaSArIDRdID0gYTAwIC0gYTEwOyAvKiBSZSBDJyA9IFJlIEEgKyBSZSBCIC0gUmUgQyAtIFJlIEQgKi8KKyAgICB4W2kgKyAxXSA9IGEyMCArIGEzMDsgLyogSW0gQScgPSBJbSBBICsgSW0gQiArIEltIEMgKyBJbSBEICovCisgICAgeFtpICsgNV0gPSBhMjAgLSBhMzA7IC8qIEltIEMnID0gSW0gQSArIEltIEIgLSBJbSBDIC0gSW0gRCAqLworCisgICAgYTAwID0gYTAwIC0geFtpICsgMl07IC8qIFJlIEEgLSBSZSBCICovCisgICAgYTEwID0gYTEwIC0geFtpICsgNl07IC8qIFJlIEMgLSBSZSBEICovCisgICAgYTIwID0gYTIwIC0geFtpICsgM107IC8qIEltIEEgLSBJbSBCICovCisgICAgYTMwID0gYTMwIC0geFtpICsgN107IC8qIEltIEMgLSBJbSBEICovCisKKyAgICB4W2kgKyAyXSA9IGEwMCArIGEzMDsgLyogUmUgQicgPSBSZSBBIC0gUmUgQiArIEltIEMgLSBJbSBEICovCisgICAgeFtpICsgNl0gPSBhMDAgLSBhMzA7IC8qIFJlIEQnID0gUmUgQSAtIFJlIEIgLSBJbSBDICsgSW0gRCAqLworICAgIHhbaSArIDNdID0gYTIwIC0gYTEwOyAvKiBJbSBCJyA9IEltIEEgLSBJbSBCIC0gUmUgQyArIFJlIEQgKi8KKyAgICB4W2kgKyA3XSA9IGEyMCArIGExMDsgLyogSW0gRCcgPSBJbSBBIC0gSW0gQiArIFJlIEMgLSBSZSBEICovCisgIH0KKworICBJTlQgbWggPSAxIDw8IDE7CisgIElOVCBsZG0gPSBsZG4gLSAyOworICBJTlQgdHJpZ3N0ZXAgPSB0cmlnRGF0YVNpemU7CisKKyAgZG8geworICAgIGNvbnN0IEZJWFBfU1RQICpwVHJpZ0RhdGEgPSB0cmlnZGF0YTsKKyAgICBJTlQgajsKKworICAgIG1oIDw8PSAxOworICAgIHRyaWdzdGVwID4+PSAxOworCisgICAgRkRLX0FTU0VSVCh0cmlnc3RlcCA+IDApOworCisgICAgLyogRG8gZmlyc3QgaXRlcmF0aW9uIHdpdGggYz0xLjAgYW5kIHM9MC4wIHNlcGFyYXRlbHkgdG8gYXZvaWQgbG9vc2luZyB0bworICAgICAgIG11Y2ggcHJlY2lzaW9uLiBCZXdhcmU6IFRoZSBpbXBhY3Qgb24gdGhlIG92ZXJhbCBGRlQgcHJlY2lzaW9uIGlzIHJhdGhlcgorICAgICAgIGxhcmdlLiAqLwogICAgIHsKLSAgICAgIEZJWFBfREJMIGEwMCwgYTEwLCBhMjAsIGEzMDsKLSAgICAgIGEwMCA9ICh4W2kgKyAwXSArIHhbaSArIDJdKT4+MTsgIC8qIFJlIEEgKyBSZSBCICovCi0gICAgICBhMTAgPSAoeFtpICsgNF0gKyB4W2kgKyA2XSk+PjE7ICAvKiBSZSBDICsgUmUgRCAqLwotICAgICAgYTIwID0gKHhbaSArIDFdICsgeFtpICsgM10pPj4xOyAgLyogSW0gQSArIEltIEIgKi8KLSAgICAgIGEzMCA9ICh4W2kgKyA1XSArIHhbaSArIDddKT4+MTsgIC8qIEltIEMgKyBJbSBEICovCisgICAgICBGSVhQX0RCTCAqeHQxID0geDsKKyAgICAgIGludCByID0gbjsKIAotICAgICAgeFtpICsgMF0gPSBhMDAgKyBhMTA7ICAgICAgIC8qIFJlIEEnID0gUmUgQSArIFJlIEIgKyBSZSBDICsgUmUgRCAqLwotICAgICAgeFtpICsgNF0gPSBhMDAgLSBhMTA7ICAgICAgIC8qIFJlIEMnID0gUmUgQSArIFJlIEIgLSBSZSBDIC0gUmUgRCAqLwotICAgICAgeFtpICsgMV0gPSBhMjAgKyBhMzA7ICAgICAgIC8qIEltIEEnID0gSW0gQSArIEltIEIgKyBJbSBDICsgSW0gRCAqLwotICAgICAgeFtpICsgNV0gPSBhMjAgLSBhMzA7ICAgICAgIC8qIEltIEMnID0gSW0gQSArIEltIEIgLSBJbSBDIC0gSW0gRCAqLworICAgICAgZG8geworICAgICAgICBGSVhQX0RCTCAqeHQyID0geHQxICsgKG1oIDw8IDEpOworICAgICAgICAvKgorICAgICAgICBGSVhQX0RCTCAqeHQxID0geCsgKChyKTw8MSk7CisgICAgICAgIEZJWFBfREJMICp4dDIgPSB4dDEgKyAobWg8PDEpOworICAgICAgICAqLworICAgICAgICBGSVhQX0RCTCB2ciwgdmksIHVyLCB1aTsKIAotICAgICAgYTAwID0gYTAwIC0geFtpICsgMl07ICAgICAgIC8qIFJlIEEgLSBSZSBCICovCi0gICAgICBhMTAgPSBhMTAgLSB4W2kgKyA2XTsgICAgICAgLyogUmUgQyAtIFJlIEQgKi8KLSAgICAgIGEyMCA9IGEyMCAtIHhbaSArIDNdOyAgICAgICAvKiBJbSBBIC0gSW0gQiAqLwotICAgICAgYTMwID0gYTMwIC0geFtpICsgN107ICAgICAgIC8qIEltIEMgLSBJbSBEICovCisgICAgICAgIC8vIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFt0MisxXSwgeFt0Ml0sIChGSVhQX1NHTCkxLjAsIChGSVhQX1NHTCkwLjApOworICAgICAgICB2aSA9IHh0MlsxXSA+PiAxOworICAgICAgICB2ciA9IHh0MlswXSA+PiAxOwogCi0gICAgICB4W2kgKyAyXSA9IGEwMCArIGEzMDsgICAgICAgLyogUmUgQicgPSBSZSBBIC0gUmUgQiArIEltIEMgLSBJbSBEICovCi0gICAgICB4W2kgKyA2XSA9IGEwMCAtIGEzMDsgICAgICAgLyogUmUgRCcgPSBSZSBBIC0gUmUgQiAtIEltIEMgKyBJbSBEICovCi0gICAgICB4W2kgKyAzXSA9IGEyMCAtIGExMDsgICAgICAgLyogSW0gQicgPSBJbSBBIC0gSW0gQiAtIFJlIEMgKyBSZSBEICovCi0gICAgICB4W2kgKyA3XSA9IGEyMCArIGExMDsgICAgICAgLyogSW0gRCcgPSBJbSBBIC0gSW0gQiArIFJlIEMgLSBSZSBEICovCisgICAgICAgIHVyID0geHQxWzBdID4+IDE7CisgICAgICAgIHVpID0geHQxWzFdID4+IDE7CisKKyAgICAgICAgeHQxWzBdID0gdXIgKyB2cjsKKyAgICAgICAgeHQxWzFdID0gdWkgKyB2aTsKKworICAgICAgICB4dDJbMF0gPSB1ciAtIHZyOworICAgICAgICB4dDJbMV0gPSB1aSAtIHZpOworCisgICAgICAgIHh0MSArPSBtaDsKKyAgICAgICAgeHQyICs9IG1oOworCisgICAgICAgIC8vIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFt0MisxXSwgeFt0Ml0sIChGSVhQX1NHTCkxLjAsIChGSVhQX1NHTCkwLjApOworICAgICAgICB2ciA9IHh0MlsxXSA+PiAxOworICAgICAgICB2aSA9IHh0MlswXSA+PiAxOworCisgICAgICAgIHVyID0geHQxWzBdID4+IDE7CisgICAgICAgIHVpID0geHQxWzFdID4+IDE7CisKKyAgICAgICAgeHQxWzBdID0gdXIgKyB2cjsKKyAgICAgICAgeHQxWzFdID0gdWkgLSB2aTsKKworICAgICAgICB4dDJbMF0gPSB1ciAtIHZyOworICAgICAgICB4dDJbMV0gPSB1aSArIHZpOworCisgICAgICAgIHh0MSA9IHh0MiArIG1oOworICAgICAgfSB3aGlsZSAoKHIgPSByIC0gKG1oIDw8IDEpKSAhPSAwKTsKICAgICB9CisgICAgZm9yIChqID0gNDsgaiA8IG1oOyBqICs9IDQpIHsKKyAgICAgIEZJWFBfREJMICp4dDEgPSB4ICsgKGogPj4gMSk7CisgICAgICBGSVhQX1NQSyBjczsKKyAgICAgIGludCByID0gbjsKIAotICAgIElOVCBtaCA9IDEgPDwgMTsKLSAgICBJTlQgbGRtID0gbGRuIC0gMjsKLSAgICBJTlQgdHJpZ3N0ZXAgPSB0cmlnRGF0YVNpemU7CisgICAgICBwVHJpZ0RhdGEgKz0gdHJpZ3N0ZXA7CisgICAgICBjcyA9ICpwVHJpZ0RhdGE7CiAKLSAgICBkbworICAgICAgZG8geworICAgICAgICBGSVhQX0RCTCAqeHQyID0geHQxICsgKG1oIDw8IDEpOworICAgICAgICBGSVhQX0RCTCB2ciwgdmksIHVyLCB1aTsKKworICAgICAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHh0MlsxXSwgeHQyWzBdLCBjcyk7CisKKyAgICAgICAgdXIgPSB4dDFbMF0gPj4gMTsKKyAgICAgICAgdWkgPSB4dDFbMV0gPj4gMTsKKworICAgICAgICB4dDFbMF0gPSB1ciArIHZyOworICAgICAgICB4dDFbMV0gPSB1aSArIHZpOworCisgICAgICAgIHh0MlswXSA9IHVyIC0gdnI7CisgICAgICAgIHh0MlsxXSA9IHVpIC0gdmk7CisKKyAgICAgICAgeHQxICs9IG1oOworICAgICAgICB4dDIgKz0gbWg7CisKKyAgICAgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4dDJbMV0sIHh0MlswXSwgY3MpOworCisgICAgICAgIHVyID0geHQxWzBdID4+IDE7CisgICAgICAgIHVpID0geHQxWzFdID4+IDE7CisKKyAgICAgICAgeHQxWzBdID0gdXIgKyB2cjsKKyAgICAgICAgeHQxWzFdID0gdWkgLSB2aTsKKworICAgICAgICB4dDJbMF0gPSB1ciAtIHZyOworICAgICAgICB4dDJbMV0gPSB1aSArIHZpOworCisgICAgICAgIC8qIFNhbWUgYXMgYWJvdmUgYnV0IGZvciB0MSx0MiB3aXRoIGo+bWgvNCBhbmQgdGh1cyBjcyBzd2FwcGVkICovCisgICAgICAgIHh0MSA9IHh0MSAtIChqKTsKKyAgICAgICAgeHQyID0geHQxICsgKG1oIDw8IDEpOworCisgICAgICAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeHQyWzBdLCB4dDJbMV0sIGNzKTsKKworICAgICAgICB1ciA9IHh0MVswXSA+PiAxOworICAgICAgICB1aSA9IHh0MVsxXSA+PiAxOworCisgICAgICAgIHh0MVswXSA9IHVyICsgdnI7CisgICAgICAgIHh0MVsxXSA9IHVpIC0gdmk7CisKKyAgICAgICAgeHQyWzBdID0gdXIgLSB2cjsKKyAgICAgICAgeHQyWzFdID0gdWkgKyB2aTsKKworICAgICAgICB4dDEgKz0gbWg7CisgICAgICAgIHh0MiArPSBtaDsKKworICAgICAgICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHh0MlswXSwgeHQyWzFdLCBjcyk7CisKKyAgICAgICAgdXIgPSB4dDFbMF0gPj4gMTsKKyAgICAgICAgdWkgPSB4dDFbMV0gPj4gMTsKKworICAgICAgICB4dDFbMF0gPSB1ciAtIHZyOworICAgICAgICB4dDFbMV0gPSB1aSAtIHZpOworCisgICAgICAgIHh0MlswXSA9IHVyICsgdnI7CisgICAgICAgIHh0MlsxXSA9IHVpICsgdmk7CisKKyAgICAgICAgeHQxID0geHQyICsgKGopOworICAgICAgfSB3aGlsZSAoKHIgPSByIC0gKG1oIDw8IDEpKSAhPSAwKTsKKyAgICB9CiAgICAgewotICAgICAgICBjb25zdCBGSVhQX1NUUCAqcFRyaWdEYXRhID0gdHJpZ2RhdGE7Ci0gICAgICAgIElOVCBqOworICAgICAgRklYUF9EQkwgKnh0MSA9IHggKyAobWggPj4gMSk7CisgICAgICBpbnQgciA9IG47CiAKLSAgICAgICAgbWggPDw9IDE7Ci0gICAgICAgIHRyaWdzdGVwID4+PSAxOworICAgICAgZG8geworICAgICAgICBGSVhQX0RCTCAqeHQyID0geHQxICsgKG1oIDw8IDEpOworICAgICAgICBGSVhQX0RCTCB2ciwgdmksIHVyLCB1aTsKIAotICAgICAgICBGREtfQVNTRVJUKHRyaWdzdGVwID4gMCk7CisgICAgICAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeHQyWzFdLCB4dDJbMF0sIFNUQygweDVhODI3OTlhKSwKKyAgICAgICAgICAgICAgICAgICAgIFNUQygweDVhODI3OTlhKSk7CiAKLSAgICAgICAgLyogRG8gZmlyc3QgaXRlcmF0aW9uIHdpdGggYz0xLjAgYW5kIHM9MC4wIHNlcGFyYXRlbHkgdG8gYXZvaWQgbG9vc2luZyB0byBtdWNoIHByZWNpc2lvbi4KLSAgICAgICAgICAgQmV3YXJlOiBUaGUgaW1wYWN0IG9uIHRoZSBvdmVyYWwgRkZUIHByZWNpc2lvbiBpcyByYXRoZXIgbGFyZ2UuICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZJWFBfREJMICp4dDEgPSB4OwotICAgICAgICAgICAgaW50IHIgPSBuOworICAgICAgICB1ciA9IHh0MVswXSA+PiAxOworICAgICAgICB1aSA9IHh0MVsxXSA+PiAxOwogCi0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgRklYUF9EQkwgKnh0MiA9IHh0MSArIChtaDw8MSk7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICBGSVhQX0RCTCAqeHQxID0geCsgKChyKTw8MSk7Ci0gICAgICAgICAgICAgICAgRklYUF9EQkwgKnh0MiA9IHh0MSArIChtaDw8MSk7Ci0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBGSVhQX0RCTCB2cix2aSx1cix1aTsgICAgICAgICAgICAgICAgIAorICAgICAgICB4dDFbMF0gPSB1ciArIHZyOworICAgICAgICB4dDFbMV0gPSB1aSArIHZpOwogCi0gICAgICAgICAgICAgICAgLy9jcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbdDIrMV0sIHhbdDJdLCAoRklYUF9TR0wpMS4wLCAoRklYUF9TR0wpMC4wKTsKLSAgICAgICAgICAgICAgICB2aSA9IHh0MlsxXT4+MTsKLSAgICAgICAgICAgICAgICB2ciA9IHh0MlswXT4+MTsKKyAgICAgICAgeHQyWzBdID0gdXIgLSB2cjsKKyAgICAgICAgeHQyWzFdID0gdWkgLSB2aTsKIAotICAgICAgICAgICAgICAgIHVyID0geHQxWzBdPj4xOwotICAgICAgICAgICAgICAgIHVpID0geHQxWzFdPj4xOworICAgICAgICB4dDEgKz0gbWg7CisgICAgICAgIHh0MiArPSBtaDsKIAotICAgICAgICAgICAgICAgIHh0MVswXSA9IHVyK3ZyOwotICAgICAgICAgICAgICAgIHh0MVsxXSA9IHVpK3ZpOworICAgICAgICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHh0MlsxXSwgeHQyWzBdLCBTVEMoMHg1YTgyNzk5YSksCisgICAgICAgICAgICAgICAgICAgICBTVEMoMHg1YTgyNzk5YSkpOwogCi0gICAgICAgICAgICAgICAgeHQyWzBdID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeHQyWzFdID0gdWktdmk7CisgICAgICAgIHVyID0geHQxWzBdID4+IDE7CisgICAgICAgIHVpID0geHQxWzFdID4+IDE7CiAKLSAgICAgICAgICAgICAgICB4dDEgKz0gbWg7Ci0gICAgICAgICAgICAgICAgeHQyICs9IG1oOworICAgICAgICB4dDFbMF0gPSB1ciArIHZyOworICAgICAgICB4dDFbMV0gPSB1aSAtIHZpOwogCi0gICAgICAgICAgICAgICAgLy9jcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbdDIrMV0sIHhbdDJdLCAoRklYUF9TR0wpMS4wLCAoRklYUF9TR0wpMC4wKTsKLSAgICAgICAgICAgICAgICB2ciA9IHh0MlsxXT4+MTsKLSAgICAgICAgICAgICAgICB2aSA9IHh0MlswXT4+MTsKKyAgICAgICAgeHQyWzBdID0gdXIgLSB2cjsKKyAgICAgICAgeHQyWzFdID0gdWkgKyB2aTsKIAotICAgICAgICAgICAgICAgIHVyID0geHQxWzBdPj4xOwotICAgICAgICAgICAgICAgIHVpID0geHQxWzFdPj4xOwotCi0gICAgICAgICAgICAgICAgeHQxWzBdID0gdXIrdnI7Ci0gICAgICAgICAgICAgICAgeHQxWzFdID0gdWktdmk7Ci0KLSAgICAgICAgICAgICAgICB4dDJbMF0gPSB1ci12cjsKLSAgICAgICAgICAgICAgICB4dDJbMV0gPSB1aSt2aTsKLQotICAgICAgICAgICAgICAgIHh0MSA9IHh0MiArIG1oOwotICAgICAgICAgICAgfSB3aGlsZSAoKHI9ci0obWg8PDEpKSAhPSAwKTsKLSAgICAgICAgfQotICAgICAgICBmb3Ioaj00OyBqPG1oOyBqKz00KQotICAgICAgICB7Ci0gICAgICAgICAgICBGSVhQX0RCTCAqeHQxID0geCArIChqPj4xKTsKLSAgICAgICAgICAgIEZJWFBfU1BLIGNzOwotICAgICAgICAgICAgaW50IHIgPSBuOwotCi0gICAgICAgICAgICBwVHJpZ0RhdGEgKz0gdHJpZ3N0ZXA7Ci0gICAgICAgICAgICBjcyA9ICpwVHJpZ0RhdGE7Ci0KLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRklYUF9EQkwgKnh0MiA9IHh0MSArIChtaDw8MSk7Ci0gICAgICAgICAgICAgICAgRklYUF9EQkwgdnIsdmksdXIsdWk7Ci0KLSAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHh0MlsxXSwgeHQyWzBdLCBjcyk7Ci0KLSAgICAgICAgICAgICAgICB1ciA9IHh0MVswXT4+MTsKLSAgICAgICAgICAgICAgICB1aSA9IHh0MVsxXT4+MTsKLQotICAgICAgICAgICAgICAgIHh0MVswXSA9IHVyK3ZyOwotICAgICAgICAgICAgICAgIHh0MVsxXSA9IHVpK3ZpOwotCi0gICAgICAgICAgICAgICAgeHQyWzBdID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeHQyWzFdID0gdWktdmk7Ci0KLSAgICAgICAgICAgICAgICB4dDEgKz0gbWg7Ci0gICAgICAgICAgICAgICAgeHQyICs9IG1oOwotCi0gICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4dDJbMV0sIHh0MlswXSwgY3MpOwotCi0gICAgICAgICAgICAgICAgdXIgPSB4dDFbMF0+PjE7Ci0gICAgICAgICAgICAgICAgdWkgPSB4dDFbMV0+PjE7Ci0KLSAgICAgICAgICAgICAgICB4dDFbMF0gPSB1cit2cjsKLSAgICAgICAgICAgICAgICB4dDFbMV0gPSB1aS12aTsKLQotICAgICAgICAgICAgICAgIHh0MlswXSA9IHVyLXZyOwotICAgICAgICAgICAgICAgIHh0MlsxXSA9IHVpK3ZpOwotCi0gICAgICAgICAgICAgICAgLyogU2FtZSBhcyBhYm92ZSBidXQgZm9yIHQxLHQyIHdpdGggaj5taC80IGFuZCB0aHVzIGNzIHN3YXBwZWQgKi8KLSAgICAgICAgICAgICAgICB4dDEgPSB4dDEgLSAoaik7Ci0gICAgICAgICAgICAgICAgeHQyID0geHQxICsgKG1oPDwxKTsKLQotICAgICAgICAgICAgICAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeHQyWzBdLCB4dDJbMV0sIGNzKTsKLQotICAgICAgICAgICAgICAgIHVyID0geHQxWzBdPj4xOwotICAgICAgICAgICAgICAgIHVpID0geHQxWzFdPj4xOwotCi0gICAgICAgICAgICAgICAgeHQxWzBdID0gdXIrdnI7Ci0gICAgICAgICAgICAgICAgeHQxWzFdID0gdWktdmk7Ci0KLSAgICAgICAgICAgICAgICB4dDJbMF0gPSB1ci12cjsKLSAgICAgICAgICAgICAgICB4dDJbMV0gPSB1aSt2aTsKLQotICAgICAgICAgICAgICAgIHh0MSArPSBtaDsKLSAgICAgICAgICAgICAgICB4dDIgKz0gbWg7Ci0KLSAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHh0MlswXSwgeHQyWzFdLCBjcyk7Ci0KLSAgICAgICAgICAgICAgICB1ciA9IHh0MVswXT4+MTsKLSAgICAgICAgICAgICAgICB1aSA9IHh0MVsxXT4+MTsKLQotICAgICAgICAgICAgICAgIHh0MVswXSA9IHVyLXZyOwotICAgICAgICAgICAgICAgIHh0MVsxXSA9IHVpLXZpOwotCi0gICAgICAgICAgICAgICAgeHQyWzBdID0gdXIrdnI7Ci0gICAgICAgICAgICAgICAgeHQyWzFdID0gdWkrdmk7Ci0KLSAgICAgICAgICAgICAgICB4dDEgPSB4dDIgKyAoaik7Ci0gICAgICAgICAgICB9ICB3aGlsZSAoKHI9ci0obWg8PDEpKSAhPSAwKTsKLSAgICAgICAgfQotICAgICAgICB7Ci0gICAgICAgICAgICBGSVhQX0RCTCAqeHQxID0geCArIChtaD4+MSk7Ci0gICAgICAgICAgICBpbnQgciA9IG47Ci0KLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRklYUF9EQkwgKnh0MiA9IHh0MSArIChtaDw8MSk7Ci0gICAgICAgICAgICAgICAgRklYUF9EQkwgdnIsdmksdXIsdWk7Ci0KLSAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHh0MlsxXSwgeHQyWzBdLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDVhODI3OTlhKSk7Ci0KLSAgICAgICAgICAgICAgICB1ciA9IHh0MVswXT4+MTsKLSAgICAgICAgICAgICAgICB1aSA9IHh0MVsxXT4+MTsKLQotICAgICAgICAgICAgICAgIHh0MVswXSA9IHVyK3ZyOwotICAgICAgICAgICAgICAgIHh0MVsxXSA9IHVpK3ZpOwotCi0gICAgICAgICAgICAgICAgeHQyWzBdID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeHQyWzFdID0gdWktdmk7Ci0KLSAgICAgICAgICAgICAgICB4dDEgKz0gbWg7Ci0gICAgICAgICAgICAgICAgeHQyICs9IG1oOwotCi0gICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4dDJbMV0sIHh0MlswXSwgU1RDKDB4NWE4Mjc5OWEpLCBTVEMoMHg1YTgyNzk5YSkpOwotCi0gICAgICAgICAgICAgICAgdXIgPSB4dDFbMF0+PjE7Ci0gICAgICAgICAgICAgICAgdWkgPSB4dDFbMV0+PjE7Ci0KLSAgICAgICAgICAgICAgICB4dDFbMF0gPSB1cit2cjsKLSAgICAgICAgICAgICAgICB4dDFbMV0gPSB1aS12aTsKLQotICAgICAgICAgICAgICAgIHh0MlswXSA9IHVyLXZyOwotICAgICAgICAgICAgICAgIHh0MlsxXSA9IHVpK3ZpOwotCi0gICAgICAgICAgICAgICAgeHQxID0geHQyICsgbWg7Ci0gICAgICAgICAgICB9ICB3aGlsZSAoKHI9ci0obWg8PDEpKSAhPSAwKTsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKC0tbGRtICE9IDApOworICAgICAgICB4dDEgPSB4dDIgKyBtaDsKKyAgICAgIH0gd2hpbGUgKChyID0gciAtIChtaCA8PCAxKSkgIT0gMCk7CisgICAgfQorICB9IHdoaWxlICgtLWxkbSAhPSAwKTsKIH0KIAogI2VuZGlmIC8qIGlmIGRlZmluZWQoRlVOQ1RJT05fZGl0X2ZmdCkgICovCmRpZmYgLS1naXQgYS9saWJGREsvc3JjL2FybS9xbWZfYXJtLmNwcCBiL2xpYkZESy9zcmMvYXJtL3FtZl9hcm0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmVlYmZiLi4wMDAwMDAwCi0tLSBhL2xpYkZESy9zcmMvYXJtL3FtZl9hcm0uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzY2ICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWYgKFFNRl9OT19QT0xZPT01KQotCi0jZGVmaW5lIEZVTkNUSU9OX3FtZkZvcndhcmRNb2R1bGF0aW9uTFBfb2RkCi0KLSNpZmRlZiBGVU5DVElPTl9xbWZGb3J3YXJkTW9kdWxhdGlvbkxQX29kZAotc3RhdGljIHZvaWQKLXFtZkZvcndhcmRNb2R1bGF0aW9uTFBfb2RkKCBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGFuYVFtZiwgLyohPCBIYW5kbGUgb2YgUW1mIEFuYWx5c2lzIEJhbmsgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9RTUYgKnRpbWVJbiwgICAgICAgIC8qITwgVGltZSBTaWduYWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqclN1YmJhbmQgKSAgICAgICAgICAgLyohPCBSZWFsIE91dHB1dCAqLwotewotICBpbnQgaTsKLSAgaW50IEwgPSBhbmFRbWYtPm5vX2NoYW5uZWxzOwotICBpbnQgTSA9IEw+PjE7Ci0gIGludCBzaGlmdCA9IChhbmFRbWYtPm5vX2NoYW5uZWxzPj42KSArIDE7Ci0gIGludCByU3ViYmFuZF9lID0gMDsKLQotICBGSVhQX1FNRiAqclN1YmJhbmRQdHIwID0gJnJTdWJiYW5kW00rMF07ICAgICAgICAgICAgICAgIC8qIHJ1bnMgd2l0aCBpbmNyZW1lbnQgKi8KLSAgRklYUF9RTUYgKnJTdWJiYW5kUHRyMSA9ICZyU3ViYmFuZFtNLTFdOyAgICAgICAgICAgICAgICAvKiBydW5zIHdpdGggZGVjcmVtZW50ICovCi0gIEZJWFBfUU1GICp0aW1lSW4wID0gKEZJWFBfREJMICopICZ0aW1lSW5bMF07ICAgICAgICAgICAgLyogcnVucyB3aXRoIGluY3JlbWVudCAqLwotICBGSVhQX1FNRiAqdGltZUluMSA9IChGSVhQX0RCTCAqKSAmdGltZUluW0xdOyAgICAgICAgICAgIC8qIHJ1bnMgd2l0aCBpbmNyZW1lbnQgKi8KLSAgRklYUF9RTUYgKnRpbWVJbjIgPSAoRklYUF9EQkwgKikgJnRpbWVJbltMLTFdOyAgICAgICAgICAvKiBydW5zIHdpdGggZGVjcmVtZW50ICovCi0gIEZJWFBfUU1GICp0aW1lSW4zID0gKEZJWFBfREJMICopICZ0aW1lSW5bMipMLTFdOyAgICAgICAgLyogcnVucyB3aXRoIGRlY3JlbWVudCAqLwotCi0gIGZvciAoaSA9IDA7IGkgPCBNOyBpKyspCi0gIHsKLSAgICAqclN1YmJhbmRQdHIwKysgPSAoKnRpbWVJbjItLSA+PiAxKSAtICgqdGltZUluMCsrID4+IHNoaWZ0KTsKLSAgICAqclN1YmJhbmRQdHIxLS0gPSAoKnRpbWVJbjErKyA+PiAxKSArICgqdGltZUluMy0tID4+IHNoaWZ0KTsKLSAgfQotCi0gIGRjdF9JVihyU3ViYmFuZCxMLCAmclN1YmJhbmRfZSk7Ci19Ci0jZW5kaWYgLyogRlVOQ1RJT05fcW1mRm9yd2FyZE1vZHVsYXRpb25MUF9vZGQgKi8KLQotCi0vKiBORU9OIG9wdGltaXplZCBRTUYgY3VycmVudGx5IGJ1aWx0cyBvbmx5IHdpdGggUlZDVCB0b29sY2hhaW4gKi8KLQotI2lmIGRlZmluZWQoX19BUk1fQVJDSF82X18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykKLQotI2lmIChTQU1QTEVfQklUUyA9PSAxNikKLSNkZWZpbmUgRlVOQ1RJT05fcW1mQW5hUHJvdG90eXBlRmlyU2xvdAotI2VuZGlmCi0KLSNpZmRlZiBGVU5DVElPTl9xbWZBbmFQcm90b3R5cGVGaXJTbG90Ci0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCi0KLWlubGluZSBJTlQgU01VTEJCIChjb25zdCBTSE9SVCBhLCBjb25zdCBMT05HIGIpCi17Ci0gIElOVCByZXN1bHQgOwotICBfX2FzbV9fICgic211bGJiICUwLCAlMSwgJTIiCi0gICAgIDogIj1yIiAocmVzdWx0KQotICAgICA6ICJyIiAoYSksICJyIiAoYikpIDsKLSAgcmV0dXJuIHJlc3VsdCA7Ci19Ci1pbmxpbmUgSU5UIFNNVUxCVCAoY29uc3QgU0hPUlQgYSwgY29uc3QgTE9ORyBiKQotewotICBJTlQgcmVzdWx0IDsKLSAgX19hc21fXyAoInNtdWxidCAlMCwgJTEsICUyIgotICAgICA6ICI9ciIgKHJlc3VsdCkKLSAgICAgOiAiciIgKGEpLCAiciIgKGIpKSA7Ci0gIHJldHVybiByZXN1bHQgOwotfQotCi1pbmxpbmUgSU5UIFNNTEFCQihjb25zdCBMT05HIGFjY3UsIGNvbnN0IFNIT1JUIGEsIGNvbnN0IExPTkcgYikKLXsKLSAgSU5UIHJlc3VsdCA7Ci0gIF9fYXNtX18gKCJzbWxhYmIgJTAsICUxLCAlMiwlMyIKLSAgICAgOiAiPXIiIChyZXN1bHQpCi0gICAgIDogInIiIChhKSwgInIiIChiKSwgInIiIChhY2N1KSkgOwotICByZXR1cm4gcmVzdWx0OwotfQotaW5saW5lIElOVCBTTUxBQlQoY29uc3QgTE9ORyBhY2N1LCBjb25zdCBTSE9SVCBhLCBjb25zdCBMT05HIGIpCi17Ci0gIElOVCByZXN1bHQgOwotICBfX2FzbV9fICgic21sYWJ0ICUwLCAlMSwgJTIsJTMiCi0gICAgIDogIj1yIiAocmVzdWx0KQotICAgICA6ICJyIiAoYSksICJyIiAoYiksICJyIiAoYWNjdSkpIDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLSNlbmRpZiAvKiBjb21waWxlciBzZWxlY3Rpb24gICovCi0KLQotdm9pZCBxbWZBbmFQcm90b3R5cGVGaXJTbG90KCBGSVhQX1FNRiAqYW5hbHlzaXNCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBub19jaGFubmVscywgICAgICAgICAgICAgLyohPCBOdW1iZXIgY2hhbm5lbHMgb2YgYW5hbHlzaXMgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfUEZUICpwX2ZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIHBfc3RyaWRlLCAgICAgICAgICAgICAgICAvKiE8IFN0aWRlIG9mIGFuYWx5c2lzIGZpbHRlciAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FBUyAqUkVTVFJJQ1QgcEZpbHRlclN0YXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgTE9ORyAqcF9mbHQgPSAoTE9ORyAqKSBwX2ZpbHRlcjsKLSAgTE9ORyBmbHQ7Ci0gIEZJWFBfUU1GICpSRVNUUklDVCBwRGF0YV8wID0gYW5hbHlzaXNCdWZmZXIgKyAyKm5vX2NoYW5uZWxzIC0gMTsKLSAgRklYUF9RTUYgKlJFU1RSSUNUIHBEYXRhXzEgPSBhbmFseXNpc0J1ZmZlcjsKLQotICBGSVhQX1FBUyAqUkVTVFJJQ1Qgc3RhXzAgPSAoRklYUF9RQVMgKilwRmlsdGVyU3RhdGVzOwotICBGSVhQX1FBUyAqUkVTVFJJQ1Qgc3RhXzEgPSAoRklYUF9RQVMgKilwRmlsdGVyU3RhdGVzICsgKDIqUU1GX05PX1BPTFkqbm9fY2hhbm5lbHMpIC0gMTsKLQotICBGSVhQX0RCTCBhY2N1MCwgYWNjdTE7Ci0gIEZJWFBfUUFTIHN0YTAsIHN0YTE7Ci0KLSAgaW50IHN0YVN0ZXAxID0gIG5vX2NoYW5uZWxzPDwxOwotICBpbnQgc3RhU3RlcDIgPSAobm9fY2hhbm5lbHM8PDMpIC0gMTsgLyogUmV3aW5kIG9uZSBsZXNzICovCi0KLSAgaWYgKHBfc3RyaWRlID09IDEpCi0gIHsKLSAgICAvKiBGSVIgZmlsdGVyIDAgKi8KLSAgICBmbHQgPSAqcF9mbHQrKzsKLSAgICBzdGExID0gKnN0YV8xOyAgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgYWNjdTEgPSBTTVVMQkIoICAgICAgICBzdGExLCBmbHQpOwotICAgIHN0YTEgPSAqc3RhXzE7ICBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7Ci0KLSAgICBmbHQgPSAqcF9mbHQrKzsKLSAgICBzdGExID0gKnN0YV8xOyAgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOwotICAgIHN0YTEgPSAqc3RhXzE7ICBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7Ci0KLSAgICBmbHQgPSAqcF9mbHQrKzsKLSAgICBzdGExID0gKnN0YV8xOyAgc3RhXzEgKz0gc3RhU3RlcDI7Ci0gICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOwotICAgICpwRGF0YV8xKysgPSBGWF9EQkwyRlhfUU1GKGFjY3UxPDwxKTsKLQotICAgIC8qIEZJUiBmaWx0ZXJzIDEuLjYzIDEyNy4uNjUgb3IgMS4uMzEgNjMuLjMzICovCi0gICAgbm9fY2hhbm5lbHMgPj49IDE7Ci0gICAgZm9yICg7IC0tbm9fY2hhbm5lbHM7ICkKLSAgICB7Ci0gICAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsgIC8qIDEsMyw1LCAuLi4gMjkvNjEgKi8KLSAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwotICAgICAgYWNjdTAgPSBTTVVMQlQoICAgICAgICBzdGEwLCBmbHQpOwotICAgICAgYWNjdTEgPSBTTVVMQlQoICAgICAgICBzdGExLCBmbHQpOwotCi0gICAgICBmbHQgPSAqcF9mbHQrKzsKLSAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwotICAgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7Ci0gICAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7Ci0KLSAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwotICAgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgICBhY2N1MCA9IFNNTEFCVCggYWNjdTAsIHN0YTAsIGZsdCk7Ci0gICAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7Ci0KLSAgICAgIGZsdCA9ICpwX2ZsdCsrOwotICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICAgIGFjY3UwID0gU01MQUJCKCBhY2N1MCwgc3RhMCwgZmx0KTsKLSAgICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKLQotICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgLT0gc3RhU3RlcDI7Ci0gICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSArPSBzdGFTdGVwMjsKLSAgICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKLSAgICAgIGFjY3UxID0gU01MQUJUKCBhY2N1MSwgc3RhMSwgZmx0KTsKLQotICAgICAgKnBEYXRhXzAtLSA9IEZYX0RCTDJGWF9RTUYoYWNjdTA8PDEpOwotICAgICAgKnBEYXRhXzErKyA9IEZYX0RCTDJGWF9RTUYoYWNjdTE8PDEpOwotCi0gICAgICAvKiBTYW1lIHNlcXVlbmNlIGFzIGFib3ZlLCBidXQgbWl4IEI9Ym90dG9tIHdpdGggVD1Ub3AgKi8KLQotICAgICAgZmx0ID0gKnBfZmx0Kys7Ci0gICAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsgIC8qIDIsNCw2LCAuLi4gMzAvNjIgKi8KLSAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwotICAgICAgYWNjdTAgPSBTTVVMQkIoICAgICAgICBzdGEwLCBmbHQpOwotICAgICAgYWNjdTEgPSBTTVVMQkIoICAgICAgICBzdGExLCBmbHQpOwotCi0gICAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKLSAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwotICAgICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOwotICAgICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwotCi0gICAgICBmbHQgPSAqcF9mbHQrKzsKLSAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwotICAgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7Ci0gICAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7Ci0KLSAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwotICAgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgICBhY2N1MCA9IFNNTEFCVCggYWNjdTAsIHN0YTAsIGZsdCk7Ci0gICAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7Ci0KLSAgICAgIGZsdCA9ICpwX2ZsdCsrOwotICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgLT0gc3RhU3RlcDI7Ci0gICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSArPSBzdGFTdGVwMjsKLSAgICAgIGFjY3UwID0gU01MQUJCKCBhY2N1MCwgc3RhMCwgZmx0KTsKLSAgICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKLQotICAgICAgKnBEYXRhXzAtLSA9IEZYX0RCTDJGWF9RTUYoYWNjdTA8PDEpOwotICAgICAgKnBEYXRhXzErKyA9IEZYX0RCTDJGWF9RTUYoYWNjdTE8PDEpOwotICAgIH0KLQotICAgIC8qIEZJUiBmaWx0ZXIgMzEvNjMgYW5kIDMzLzY1ICovCi0gICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgYWNjdTAgPSBTTVVMQlQoICAgICAgICBzdGEwLCBmbHQpOwotICAgIGFjY3UxID0gU01VTEJUKCAgICAgICAgc3RhMSwgZmx0KTsKLQotICAgIGZsdCA9ICpwX2ZsdCsrOwotICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwotICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwotICAgIGFjY3UwID0gU01MQUJCKCBhY2N1MCwgc3RhMCwgZmx0KTsKLSAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7Ci0KLSAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKLSAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICBhY2N1MCA9IFNNTEFCVCggYWNjdTAsIHN0YTAsIGZsdCk7Ci0gICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwotCi0gICAgZmx0ID0gKnBfZmx0Kys7Ci0gICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOwotICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKLQotICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wIC09IHN0YVN0ZXAyOwotICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xICs9IHN0YVN0ZXAyOwotICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKLSAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7Ci0KLSAgICAqcERhdGFfMC0tID0gRlhfREJMMkZYX1FNRihhY2N1MDw8MSk7Ci0gICAgKnBEYXRhXzErKyA9IEZYX0RCTDJGWF9RTUYoYWNjdTE8PDEpOwotCi0gICAgLyogRklSIGZpbHRlciAzMi82NCAqLwotICAgIGZsdCA9ICpwX2ZsdCsrOwotICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwotICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwotICAgIGFjY3UwID0gU01VTEJCKCAgICAgICAgc3RhMCwgZmx0KTsKLSAgICBhY2N1MSA9IFNNVUxCQiggICAgICAgIHN0YTEsIGZsdCk7Ci0KLSAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKLSAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICBhY2N1MCA9IFNNTEFCVCggYWNjdTAsIHN0YTAsIGZsdCk7Ci0gICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwotCi0gICAgZmx0ID0gKnBfZmx0Kys7Ci0gICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOwotICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKLQotICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwotICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwotICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKLSAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7Ci0KLSAgICBmbHQgPSAqcF9mbHQ7Ci0gICAgc3RhMCA9ICpzdGFfMDsKLSAgICBzdGExID0gKnN0YV8xOwotICAgIGFjY3UwID0gU01MQUJCKCBhY2N1MCwgc3RhMCwgZmx0KTsKLSAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7Ci0KLSAgICAqcERhdGFfMC0tID0gRlhfREJMMkZYX1FNRihhY2N1MDw8MSk7Ci0gICAgKnBEYXRhXzErKyA9IEZYX0RCTDJGWF9RTUYoYWNjdTE8PDEpOwotICB9Ci0gIGVsc2UKLSAgewotICAgIGludCBwZmx0U3RlcCA9IFFNRl9OT19QT0xZICogKHBfc3RyaWRlLTEpOwotCi0gICAgZmx0ID0gcF9mbHRbMF07Ci0gICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xIC09IHN0YVN0ZXAxOwotICAgIGFjY3UxID0gU01VTEJCKCAgICAgICAgc3RhMSwgZmx0KTsKLSAgICBzdGExID0gKnN0YV8xOyAgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwotCi0gICAgZmx0ID0gcF9mbHRbMV07Ci0gICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xIC09IHN0YVN0ZXAxOwotICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKLSAgICBzdGExID0gKnN0YV8xOyAgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwotCi0gICAgZmx0ID0gcF9mbHRbMl07IHBfZmx0ICs9IHBmbHRTdGVwOwotICAgIHN0YTEgPSAqc3RhXzE7ICBzdGFfMSArPSBzdGFTdGVwMjsKLSAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7Ci0gICAgKnBEYXRhXzErKyA9IEZYX0RCTDJGWF9RTUYoYWNjdTE8PDEpOwotCi0gICAgLyogRklSIGZpbHRlcnMgMS4uNjMgMTI3Li42NSBvciAxLi4zMSA2My4uMzMgKi8KLSAgICBmb3IgKDsgLS1ub19jaGFubmVsczsgKQotICAgIHsKLSAgICAgIGZsdCA9IHBfZmx0WzBdOwotICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICAgIGFjY3UwID0gU01VTEJCKCAgICAgICAgc3RhMCwgZmx0KTsKLSAgICAgIGFjY3UxID0gU01VTEJCKCAgICAgICAgc3RhMSwgZmx0KTsKLQotICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKLSAgICAgIGFjY3UxID0gU01MQUJUKCBhY2N1MSwgc3RhMSwgZmx0KTsKLQotICAgICAgZmx0ID0gcF9mbHRbMV07Ci0gICAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKLSAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwotICAgICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOwotICAgICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOwotCi0gICAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKLSAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwotICAgICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOwotICAgICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwotCi0gICAgICBmbHQgPSBwX2ZsdFsyXTsgcF9mbHQgKz0gcGZsdFN0ZXA7Ci0gICAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCAtPSBzdGFTdGVwMjsKLSAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xICs9IHN0YVN0ZXAyOwotICAgICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOwotICAgICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOwotCi0gICAgICAqcERhdGFfMC0tID0gRlhfREJMMkZYX1FNRihhY2N1MDw8MSk7Ci0gICAgICAqcERhdGFfMSsrID0gRlhfREJMMkZYX1FNRihhY2N1MTw8MSk7Ci0gICAgfQotCi0gICAgLyogRklSIGZpbHRlciAzMi82NCAqLwotICAgIGZsdCA9IHBfZmx0WzBdOwotICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwotICAgIGFjY3UwID0gU01VTEJCKCAgICAgICAgc3RhMCwgZmx0KTsKLSAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKLSAgICBhY2N1MCA9IFNNTEFCVCggYWNjdTAsIHN0YTAsIGZsdCk7Ci0KLSAgICBmbHQgPSBwX2ZsdFsxXTsKLSAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKLSAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7Ci0gICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOwotCi0gICAgZmx0ID0gcF9mbHRbMl07Ci0gICAgc3RhMCA9ICpzdGFfMDsKLSAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7Ci0gICAgKnBEYXRhXzAtLSA9IEZYX0RCTDJGWF9RTUYoYWNjdTA8PDEpOwotICB9Ci19Ci0jZW5kaWYgLyogRlVOQ1RJT05fcW1mQW5hUHJvdG90eXBlRmlyU2xvdCAqLwotI2VuZGlmIC8qICNpZiBkZWZpbmVkKF9fQ0NfQVJNKSAmJiBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKSAqLwotCi0jaWYgKCBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pICYmIChTQU1QTEVfQklUUyA9PSAxNikgKSAmJiAhZGVmaW5lZChRTUZfVEFCTEVfRlVMTCkKLQotI2RlZmluZSBGVU5DVElPTl9xbWZTeW5Qcm90b3R5cGVGaXJTbG90Ci0KLSNpZiBkZWZpbmVkKEZVTkNUSU9OX3FtZlN5blByb3RvdHlwZUZpclNsb3QpCi0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCi0KLWlubGluZSBJTlQgU01VTFdCIChjb25zdCBMT05HIGEsIGNvbnN0IExPTkcgYikKLXsKLSAgSU5UIHJlc3VsdCA7Ci0gIF9fYXNtX18gKCJzbXVsd2IgJTAsICUxLCAlMiIKLSAgICA6ICI9ciIgKHJlc3VsdCkKLSAgICA6ICJyIiAoYSksICJyIiAoYikpIDsKLQotICByZXR1cm4gcmVzdWx0IDsKLX0KLWlubGluZSBJTlQgU01VTFdUIChjb25zdCBMT05HIGEsIGNvbnN0IExPTkcgYikKLXsKLSAgSU5UIHJlc3VsdCA7Ci0gIF9fYXNtX18gKCJzbXVsd3QgJTAsICUxLCAlMiIKLSAgICA6ICI9ciIgKHJlc3VsdCkKLSAgICA6ICJyIiAoYSksICJyIiAoYikpIDsKLQotICByZXR1cm4gcmVzdWx0IDsKLX0KLQotaW5saW5lIElOVCBTTUxBV0IoY29uc3QgTE9ORyBhY2N1LCBjb25zdCBMT05HIGEsIGNvbnN0IExPTkcgYikKLXsKLSAgSU5UIHJlc3VsdDsKLSAgYXNtKCJzbWxhd2IgJTAsICUxLCAlMiwgJTMgIgotICAgICAgICA6ICI9ciIgKHJlc3VsdCkKLSAgICAgICAgOiAiciIgKGEpLCAiciIgKGIpLCAiciIgKGFjY3UpICk7Ci0gIHJldHVybiByZXN1bHQgOwotfQotCi1pbmxpbmUgSU5UIFNNTEFXVChjb25zdCBMT05HIGFjY3UsIGNvbnN0IExPTkcgYSwgY29uc3QgTE9ORyBiKQotewotICBJTlQgcmVzdWx0OwotICBhc20oInNtbGF3dCAlMCwgJTEsICUyLCAlMyAiCi0gICAgICAgIDogIj1yIiAocmVzdWx0KQotICAgICAgICA6ICJyIiAoYSksICJyIiAoYiksICJyIiAoYWNjdSkgKTsKLSAgcmV0dXJuIHJlc3VsdCA7Ci19Ci0KLSNlbmRpZiAvKiBBUk0gY29tcGlsZXIgc2VsZWN0b3IgKi8KLQotCi1zdGF0aWMgdm9pZCBxbWZTeW5Qcm90b3R5cGVGaXJTbG90MV9maWx0ZXIoRklYUF9RTUYgKlJFU1RSSUNUIHJlYWxTbG90LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqUkVTVFJJQ1QgaW1hZ1Nsb3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBwX2ZsdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RU1MgKlJFU1RSSUNUIHN0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcE15VGltZU91dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vX2NoYW5uZWxzKQotewotICAvKiBUaGlzIGNvZGUgd2FzIHRoZSBiYXNlIGZvciB0aGUgYWJvdmUgbGlzdGVkIGFzc2VtYmxlciBzZXF1ZW5jZSAqLwotICAvKiBJdCBjYW4gYmUgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2Ugb3IgZnVydGhlciBvcHRpbWl6YXRpb25zICAqLwotICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgcF9mbHRtID0gcF9mbHQgKyAxNTU7Ci0KLSAgZG8KLSAgewotICAgICBGSVhQX0RCTCByZXN1bHQ7Ci0gICAgIEZJWFBfREJMIEEsIEIsIHJlYWwsIGltYWcsIHN0YTA7Ci0KLSAgICAgcmVhbCA9ICotLXJlYWxTbG90OwotICAgICBpbWFnID0gKi0taW1hZ1Nsb3Q7Ci0gICAgIEIgPSBwX2ZsdFs0XTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzhdIFRvcD1bOV0gICAgICovCi0gICAgIEEgPSBwX2ZsdG1bM107ICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzMxNl0gVG9wPVszMTddICovCi0gICAgIHN0YTAgPSBzdGFbMF07ICAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIHN0YXRlWzBdICAgICAgICAgICovCi0gICAgIHN0YVswXSA9IFNNTEFXVCggc3RhWzFdLCBpbWFnLCBCICk7IHN0YSsrOyAvKiBpbmRleD05Li4uLi4uLi4uLi4zMTkgICovCi0gICAgIHN0YVswXSA9IFNNTEFXQiggc3RhWzFdLCByZWFsLCBBICk7IHN0YSsrOyAvKiBpbmRleD0zMTYuLi4uLi4uLi4uLjYgICovCi0gICAgIHN0YVswXSA9IFNNTEFXQiggc3RhWzFdLCBpbWFnLCBCICk7IHN0YSsrOyAvKiBpbmRleD04LDE4LCAgICAuLi4zMTggICovCi0gICAgIEIgPSBwX2ZsdFszXTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzZdIFRvcD1bN10gICAgICovCi0gICAgIHN0YVswXSA9IFNNTEFXVCggc3RhWzFdLCByZWFsLCBBICk7IHN0YSsrOyAvKiBpbmRleD0zMTcuLi4uLi4uLi4uLjcgICovCi0gICAgIEEgPSBwX2ZsdG1bNF07ICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzMxOF0gVG9wPVszMTldICovCi0gICAgIHN0YVswXSA9IFNNTEFXVCggc3RhWzFdLCBpbWFnLCBCICk7IHN0YSsrOyAvKiBpbmRleD03Li4uLi4uLi4uLi4zMTcgICovCi0gICAgIHN0YVswXSA9IFNNTEFXQiggc3RhWzFdLCByZWFsLCBBICk7IHN0YSsrOyAvKiBpbmRleD0zMTguLi4uLi4uLi4uLjggICovCi0gICAgIHN0YVswXSA9IFNNTEFXQiggc3RhWzFdLCBpbWFnLCBCICk7IHN0YSsrOyAvKiBpbmRleD02Li4uLi4uLi4uLi4zMTYgICovCi0gICAgIEIgPSBwX2ZsdFsyXTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209W1hdIFRvcD1bNV0gICAgICovCi0gICAgIHN0YVswXSA9IFNNTEFXVCggc3RhWzFdLCByZWFsLCBBICk7IHN0YSsrOyAvKiBpbmRleD05Li4uLi4uLi4uLi4zMTkgICovCi0gICAgIEEgPSBwX2ZsdG1bMl07ICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209W1hdIFRvcD1bMzE1XSAgICovCi0gICAgIHN0YVswXSA9ICAgICAgICAgU01VTFdUKCBpbWFnLCBCICk7IHN0YSsrOyAvKiBpbmRleD01LDE1LCAuLi4gICAzMTUgICovCi0gICAgIHJlc3VsdCA9IFNNTEFXVCggc3RhMCwgICByZWFsLCBBICk7ICAvKiBpbmRleD0zMTUuLi4uLi4uLi4uLjUgICovCi0KLSAgICAgcE15VGltZU91dFswXSA9IHJlc3VsdDsgcE15VGltZU91dCsrOwotCi0gICAgIHJlYWwgPSAqLS1yZWFsU2xvdDsKLSAgICAgaW1hZyA9ICotLWltYWdTbG90OwotICAgICBBID0gcF9mbHRtWzBdOyAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVszMTBdIFRvcD1bMzExXSAqLwotICAgICBCID0gcF9mbHRbN107ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVsxNF0gIFRvcD1bMTVdICAqLwotICAgICByZXN1bHQgPSBTTUxBV0IoIHN0YVswXSwgcmVhbCwgQSApOyAgLyogaW5kZXg9MzEwLi4uLi4uLi4uLi4wICAqLwotICAgICBzdGFbMF0gPSBTTUxBV0IoIHN0YVsxXSwgaW1hZywgQiApOyBzdGErKzsgLyogaW5kZXg9MTQuLi4uLi4uLi4uMzI0ICAqLwotICAgICBwTXlUaW1lT3V0WzBdID0gcmVzdWx0OyBwTXlUaW1lT3V0Kys7Ci0gICAgIEIgPSBwX2ZsdFs2XTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzEyXSAgVG9wPVsxM10gICovCi0gICAgIHN0YVswXSA9IFNNTEFXVCggc3RhWzFdLCByZWFsLCBBICk7IHN0YSsrOyAvKiBpbmRleD0zMTEuLi4uLi4uLi4uLjEgICovCi0gICAgIEEgPSBwX2ZsdG1bMV07ICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzMxMl0gVG9wPVszMTNdICovCi0gICAgIHN0YVswXSA9IFNNTEFXVCggc3RhWzFdLCBpbWFnLCBCICk7IHN0YSsrOyAvKiBpbmRleD0xMy4uLi4uLi4uLi4zMjMgICovCi0gICAgIHN0YVswXSA9IFNNTEFXQiggc3RhWzFdLCByZWFsLCBBICk7IHN0YSsrOyAvKiBpbmRleD0zMTIuLi4uLi4uLi4uLjIgICovCi0gICAgIHN0YVswXSA9IFNNTEFXQiggc3RhWzFdLCBpbWFnLCBCICk7IHN0YSsrOyAvKiBpbmRleD0xMi4uLi4uLi4uLi4zMjIgICovCi0gICAgIHN0YVswXSA9IFNNTEFXVCggc3RhWzFdLCByZWFsLCBBICk7IHN0YSsrOyAvKiBpbmRleD0zMTMuLi4uLi4uLi4uLjMgICovCi0gICAgIEEgPSBwX2ZsdG1bMl07ICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzMxNF0gVG9wPVszMTVdICovCi0gICAgIEIgPSBwX2ZsdFs1XTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzEwXSAgVG9wPVsxMV0gICovCi0gICAgIHN0YVswXSA9IFNNTEFXVCggc3RhWzFdLCBpbWFnLCBCICk7IHN0YSsrOyAvKiBpbmRleD0xMS4uLi4uLi4uLi4zMjEgICovCi0gICAgIHN0YVswXSA9IFNNTEFXQiggc3RhWzFdLCByZWFsLCBBICk7IHN0YSsrOyAvKiBpbmRleD0zMTQuLi4uLi4uLi4uLjQgICovCi0gICAgIHN0YVswXSA9ICAgICAgICAgU01VTFdCKCBpbWFnLCBCICk7IHN0YSsrOyAvKiBpbmRleD0xMC4uLi4uLi4uLi4zMjAgICovCi0KLQotICAgICBwX2ZsdCAgICArPSA1OwotICAgICBwX2ZsdG0gICAtPSA1OwotICB9IAotICB3aGlsZSAoKC0tbm9fY2hhbm5lbHMpICE9IDApOwotCi19Ci0KLQotCi1JTlQgcW1mU3luUHJvdG90eXBlRmlyU2xvdDIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgcW1mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqUkVTVFJJQ1QgcmVhbFNsb3QsICAgICAgICAgICAgLyohPCBJbnB1dDogUG9pbnRlciB0byByZWFsIFNsb3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKlJFU1RSSUNUIGltYWdTbG90LCAgICAgICAgICAgIC8qITwgSW5wdXQ6IFBvaW50ZXIgdG8gaW1hZyBTbG90ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICpSRVNUUklDVCB0aW1lT3V0LCAgICAgICAgICAgICAvKiE8IFRpbWUgZG9tYWluIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgIHN0cmlkZSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGltZSBvdXRwdXQgYnVmZmVyIHN0cmlkZSBmYWN0b3IqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgRklYUF9RU1MgKlJFU1RSSUNUIHN0YSA9IChGSVhQX1FTUyopcW1mLT5GaWx0ZXJTdGF0ZXM7Ci0gIGludCBub19jaGFubmVscyA9IHFtZi0+bm9fY2hhbm5lbHM7Ci0gIGludCBzY2FsZSA9ICgoREZSQUNUX0JJVFMtU0FNUExFX0JJVFMpLTEtcW1mLT5vdXRTY2FsZWZhY3Rvcik7Ci0KLSAgLyogV2UgbWFwIGFuIGFycnkgb2YgMTYtYml0IHZhbHVlcyB1cG9uIGFuIGFycmF5IG9mIDIqMTYtYml0IHZhbHVlcyB0byByZWFkIDIgdmFsdWVzIGluIG9uZSBzaG90ICovCi0gIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBwX2ZsdCAgPSAoRklYUF9EQkwgKikgcW1mLT5wX2ZpbHRlcjsgICAgICAgICAgIC8qIGxvdz1bMF0sICAgaGlnaD1bMV0gICAqLwotICBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgcF9mbHRtID0gKEZJWFBfREJMICopIHFtZi0+cF9maWx0ZXIgKyAxNTU7ICAgICAvKiBsb3c9WzMxMF0sIGhpZ2g9WzMxMV0gKi8KLQotICBGREtfQVNTRVJUKFNBTVBMRV9CSVRTLTEtcW1mLT5vdXRTY2FsZWZhY3RvciA+PSAwKTsgLy8gICAoREZSQUNUX0JJVFMtU0FNUExFX0JJVFMpLTEtcW1mLT5vdXRTY2FsZWZhY3RvciA+PSAwKTsKLSAgRkRLX0FTU0VSVChxbWYtPnBfc3RyaWRlPT0yICYmIHFtZi0+bm9fY2hhbm5lbHMgPT0gMzIpOwotCi0gIEZES19BU1NFUlQoKG5vX2NoYW5uZWxzJjMpID09IDApOyAgLyogc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgNCAqLwotCi0gIHJlYWxTbG90ICs9IG5vX2NoYW5uZWxzLTE7ICAgIC8vIH5+In5+Ci0gIGltYWdTbG90ICs9IG5vX2NoYW5uZWxzLTE7ICAgIC8vIG5vX2NoYW5uZWxzLTEgLi4gMAotCi0gIEZJWFBfREJMIE15VGltZU91dFszMl07Ci0gIEZJWFBfREJMICpwTXlUaW1lT3V0ID0gJk15VGltZU91dFswXTsKLQotICBmb3IgKG5vX2NoYW5uZWxzID0gbm9fY2hhbm5lbHM7IG5vX2NoYW5uZWxzLS07KQotICB7Ci0gICAgIEZJWFBfREJMIHJlc3VsdDsKLSAgICAgRklYUF9EQkwgQSwgQiwgcmVhbCwgaW1hZzsKLQotICAgICByZWFsID0gKnJlYWxTbG90LS07Ci0gICAgIGltYWcgPSAqaW1hZ1Nsb3QtLTsKLSAgICAgQSA9IHBfZmx0bVswXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMzEwXSBUb3A9WzMxMV0gKi8KLSAgICAgQiA9IHBfZmx0WzddOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMTRdICBUb3A9WzE1XSAgKi8KLSAgICAgcmVzdWx0ID0gU01MQVdCKCBzdGFbMF0sIHJlYWwsIEEgKTsgIC8qIGluZGV4PTMxMC4uLi4uLi4uLi4uMCAgKi8KLSAgICAgc3RhWzBdID0gU01MQVdCKCBzdGFbMV0sIGltYWcsIEIgKTsgc3RhKys7IC8qIGluZGV4PTE0Li4uLi4uLi4uLjMyNCAgKi8KLSAgICAgQiA9IHBfZmx0WzZdOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMTJdICBUb3A9WzEzXSAgKi8KLSAgICAgc3RhWzBdID0gU01MQVdUKCBzdGFbMV0sIHJlYWwsIEEgKTsgc3RhKys7IC8qIGluZGV4PTMxMS4uLi4uLi4uLi4uMSAgKi8KLSAgICAgQSA9IHBfZmx0bVsxXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMzEyXSBUb3A9WzMxM10gKi8KLSAgICAgc3RhWzBdID0gU01MQVdUKCBzdGFbMV0sIGltYWcsIEIgKTsgc3RhKys7IC8qIGluZGV4PTEzLi4uLi4uLi4uLjMyMyAgKi8KLSAgICAgc3RhWzBdID0gU01MQVdCKCBzdGFbMV0sIHJlYWwsIEEgKTsgc3RhKys7IC8qIGluZGV4PTMxMi4uLi4uLi4uLi4uMiAgKi8KLSAgICAgc3RhWzBdID0gU01MQVdCKCBzdGFbMV0sIGltYWcsIEIgKTsgc3RhKys7IC8qIGluZGV4PTEyLi4uLi4uLi4uLjMyMiAgKi8KLSAgICAgc3RhWzBdID0gU01MQVdUKCBzdGFbMV0sIHJlYWwsIEEgKTsgc3RhKys7IC8qIGluZGV4PTMxMy4uLi4uLi4uLi4uMyAgKi8KLSAgICAgQSA9IHBfZmx0bVsyXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMzE0XSBUb3A9WzMxNV0gKi8KLSAgICAgQiA9IHBfZmx0WzVdOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMTBdICBUb3A9WzExXSAgKi8KLSAgICAgc3RhWzBdID0gU01MQVdUKCBzdGFbMV0sIGltYWcsIEIgKTsgc3RhKys7IC8qIGluZGV4PTExLi4uLi4uLi4uLjMyMSAgKi8KLSAgICAgc3RhWzBdID0gU01MQVdCKCBzdGFbMV0sIHJlYWwsIEEgKTsgc3RhKys7IC8qIGluZGV4PTMxNC4uLi4uLi4uLi4uNCAgKi8KLSAgICAgc3RhWzBdID0gICAgICAgICBTTVVMV0IoIGltYWcsIEIgKTsgc3RhKys7IC8qIGluZGV4PTEwLi4uLi4uLi4uLjMyMCAgKi8KLQotICAgICBwTXlUaW1lT3V0WzBdID0gcmVzdWx0OyBwTXlUaW1lT3V0Kys7Ci0KLSAgICAgcF9mbHRtICAgLT0gNTsKLSAgICAgcF9mbHQgICAgKz0gNTsKLSAgfQotCi0gIHBNeVRpbWVPdXQgPSAmTXlUaW1lT3V0WzBdOwotI2lmIChTQU1QTEVfQklUUyA9PSAxNikgICAgICAKLSAgY29uc3QgRklYUF9EQkwgbWF4X3BvcyA9IChGSVhQX0RCTCkgMHgwMDAwN0ZGRiA8PCBzY2FsZTsKLSAgY29uc3QgRklYUF9EQkwgbWF4X25lZyA9IChGSVhQX0RCTCkgMHhGRkZGODAwMSA8PCBzY2FsZTsKLSNlbHNlCi0gIHNjYWxlID0gLXNjYWxlOwotICBjb25zdCBGSVhQX0RCTCBtYXhfcG9zID0gKEZJWFBfREJMKSAweDdGRkZGRkZGID4+IHNjYWxlOwotICBjb25zdCBGSVhQX0RCTCBtYXhfbmVnID0gKEZJWFBfREJMKSAweDgwMDAwMDAxID4+IHNjYWxlOyAgCi0jZW5kaWYKLSAgY29uc3QgRklYUF9EQkwgYWRkX25lZyA9ICgxIDw8IHNjYWxlKSAtIDE7Ci0KLSAgbm9fY2hhbm5lbHMgPSBxbWYtPm5vX2NoYW5uZWxzOwotCi0gIHRpbWVPdXQgKz0gbm9fY2hhbm5lbHMqc3RyaWRlOwotCi0gIEZES19BU1NFUlQoc2NhbGUgPj0gMCk7Ci0KLSAgaWYgKHFtZi0+b3V0R2FpbiAhPSAweDgwMDAwMDAwKQotICB7Ci0gICAgRklYUF9EQkwgZ2FpbiA9IHFtZi0+b3V0R2FpbjsKLSAgICBmb3IgKG5vX2NoYW5uZWxzPj49Mjsgbm9fY2hhbm5lbHMtLTspCi0gICAgewotICAgICAgRklYUF9EQkwgcmVzdWx0MSwgcmVzdWx0MjsKLQotICAgICAgcmVzdWx0MSA9IHBNeVRpbWVPdXRbMF07IHBNeVRpbWVPdXQrKzsKLSAgICAgIHJlc3VsdDIgPSBwTXlUaW1lT3V0WzBdOyBwTXlUaW1lT3V0Kys7Ci0KLSAgICAgIHJlc3VsdDEgPSBmTXVsdChyZXN1bHQxLGdhaW4pOwotICAgICAgdGltZU91dCAtPSBzdHJpZGU7Ci0gICAgICBpZiAocmVzdWx0MSA8IDApICAgICAgICByZXN1bHQxICs9IGFkZF9uZWc7Ci0gICAgICBpZiAocmVzdWx0MSA8IG1heF9uZWcpICByZXN1bHQxID0gbWF4X25lZzsKLSAgICAgIGlmIChyZXN1bHQxID4gbWF4X3BvcykgIHJlc3VsdDEgPSBtYXhfcG9zOwotI2lmIChTQU1QTEVfQklUUyA9PSAxNikKLSAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQxID4+IHNjYWxlOwotI2Vsc2UKLSAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQxIDw8IHNjYWxlOwotI2VuZGlmCi0KLSAgICAgIHJlc3VsdDIgPSBmTXVsdChyZXN1bHQyLGdhaW4pOwotICAgICAgdGltZU91dCAtPSBzdHJpZGU7Ci0gICAgICBpZiAocmVzdWx0MiA8IDApICAgICAgICByZXN1bHQyICs9IGFkZF9uZWc7Ci0gICAgICBpZiAocmVzdWx0MiA8IG1heF9uZWcpICByZXN1bHQyID0gbWF4X25lZzsKLSAgICAgIGlmIChyZXN1bHQyID4gbWF4X3BvcykgIHJlc3VsdDIgPSBtYXhfcG9zOwotI2lmIChTQU1QTEVfQklUUyA9PSAxNikKLSAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQyID4+IHNjYWxlOwotI2Vsc2UKLSAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQyIDw8IHNjYWxlOwotI2VuZGlmCi0KLSAgICAgIHJlc3VsdDEgPSBwTXlUaW1lT3V0WzBdOyBwTXlUaW1lT3V0Kys7Ci0gICAgICByZXN1bHQyID0gcE15VGltZU91dFswXTsgcE15VGltZU91dCsrOwotCi0gICAgICByZXN1bHQxID0gZk11bHQocmVzdWx0MSxnYWluKTsKLSAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOwotICAgICAgaWYgKHJlc3VsdDEgPCAwKSAgICAgICAgcmVzdWx0MSArPSBhZGRfbmVnOwotICAgICAgaWYgKHJlc3VsdDEgPCBtYXhfbmVnKSAgcmVzdWx0MSA9IG1heF9uZWc7Ci0gICAgICBpZiAocmVzdWx0MSA+IG1heF9wb3MpICByZXN1bHQxID0gbWF4X3BvczsKLSNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCi0gICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MSA+PiBzY2FsZTsKLSNlbHNlCi0gICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MSA8PCBzY2FsZTsKLSNlbmRpZgotCi0gICAgICByZXN1bHQyID0gZk11bHQocmVzdWx0MixnYWluKTsKLSAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOwotICAgICAgaWYgKHJlc3VsdDIgPCAwKSAgICAgICAgcmVzdWx0MiArPSBhZGRfbmVnOwotICAgICAgaWYgKHJlc3VsdDIgPCBtYXhfbmVnKSAgcmVzdWx0MiA9IG1heF9uZWc7Ci0gICAgICBpZiAocmVzdWx0MiA+IG1heF9wb3MpICByZXN1bHQyID0gbWF4X3BvczsKLSNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCi0gICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MiA+PiBzY2FsZTsKLSNlbHNlCi0gICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MiA8PCBzY2FsZTsKLSNlbmRpZgotICAgIH0KLSAgfQotICBlbHNlCi0gIHsKLSAgICBmb3IgKG5vX2NoYW5uZWxzPj49Mjsgbm9fY2hhbm5lbHMtLTspCi0gICAgewotICAgICAgRklYUF9EQkwgcmVzdWx0MSwgcmVzdWx0MjsKLSAgICAgIHJlc3VsdDEgPSBwTXlUaW1lT3V0WzBdOyBwTXlUaW1lT3V0Kys7Ci0gICAgICByZXN1bHQyID0gcE15VGltZU91dFswXTsgcE15VGltZU91dCsrOwotICAgICAgdGltZU91dCAtPSBzdHJpZGU7Ci0gICAgICBpZiAocmVzdWx0MSA8IDApICAgICAgICByZXN1bHQxICs9IGFkZF9uZWc7Ci0gICAgICBpZiAocmVzdWx0MSA8IG1heF9uZWcpICByZXN1bHQxID0gbWF4X25lZzsKLSAgICAgIGlmIChyZXN1bHQxID4gbWF4X3BvcykgIHJlc3VsdDEgPSBtYXhfcG9zOwotI2lmIChTQU1QTEVfQklUUyA9PSAxNikKLSAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQxID4+IHNjYWxlOwotI2Vsc2UKLSAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQxIDw8IHNjYWxlOwotI2VuZGlmCi0gICAgICAKLSAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOwotICAgICAgaWYgKHJlc3VsdDIgPCAwKSAgICAgICAgcmVzdWx0MiArPSBhZGRfbmVnOwotICAgICAgaWYgKHJlc3VsdDIgPCBtYXhfbmVnKSAgcmVzdWx0MiA9IG1heF9uZWc7Ci0gICAgICBpZiAocmVzdWx0MiA+IG1heF9wb3MpICByZXN1bHQyID0gbWF4X3BvczsKLSNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCi0gICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MiA+PiBzY2FsZTsKLSNlbHNlCi0gICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MiA8PCBzY2FsZTsKLSNlbmRpZgotICAgICAgCi0gICAgICByZXN1bHQxID0gcE15VGltZU91dFswXTsgcE15VGltZU91dCsrOwotICAgICAgcmVzdWx0MiA9IHBNeVRpbWVPdXRbMF07IHBNeVRpbWVPdXQrKzsKLSAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOwotICAgICAgaWYgKHJlc3VsdDEgPCAwKSAgICAgICAgcmVzdWx0MSArPSBhZGRfbmVnOwotICAgICAgaWYgKHJlc3VsdDEgPCBtYXhfbmVnKSAgcmVzdWx0MSA9IG1heF9uZWc7Ci0gICAgICBpZiAocmVzdWx0MSA+IG1heF9wb3MpICByZXN1bHQxID0gbWF4X3BvczsKLSNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCi0gICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MSA+PiBzY2FsZTsKLSNlbHNlCi0gICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MSA8PCBzY2FsZTsKLSNlbmRpZgotICAgICAgCi0gICAgICB0aW1lT3V0IC09IHN0cmlkZTsKLSAgICAgIGlmIChyZXN1bHQyIDwgMCkgICAgICAgIHJlc3VsdDIgKz0gYWRkX25lZzsKLSAgICAgIGlmIChyZXN1bHQyIDwgbWF4X25lZykgIHJlc3VsdDIgPSBtYXhfbmVnOwotICAgICAgaWYgKHJlc3VsdDIgPiBtYXhfcG9zKSAgcmVzdWx0MiA9IG1heF9wb3M7Ci0jaWYgKFNBTVBMRV9CSVRTID09IDE2KQotICAgICAgdGltZU91dFswXSA9IHJlc3VsdDIgPj4gc2NhbGU7Ci0jZWxzZQotICAgICAgdGltZU91dFswXSA9IHJlc3VsdDIgPDwgc2NhbGU7Ci0jZW5kaWYKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYwotdm9pZCBxbWZTeW5Qcm90b3R5cGVGaXJTbG90X2ZhbGxiYWNrKCBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHFtZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnJlYWxTbG90LCAgICAgIC8qITwgSW5wdXQ6IFBvaW50ZXIgdG8gcmVhbCBTbG90ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICppbWFnU2xvdCwgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIGltYWcgU2xvdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAqdGltZU91dCwgICAgICAgICAgICAgLyohPCBUaW1lIGRvbWFpbiBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICBzdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotCi0vKiEKLSAgXGJyaWVmIFBlcmZvcm0gU3ludGhlc2lzIFByb3RvdHlwZSBGaWx0ZXJpbmcgb24gYSBzaW5nbGUgc2xvdCBvZiBpbnB1dCBkYXRhLgotCi0gIFRoZSBmaWx0ZXIgdGFrZXMgMiAqICNNQVhfU1lOVEhFU0lTX0NIQU5ORUxTIG9mIGlucHV0IGRhdGEgYW5kCi0gIGdlbmVyYXRlcyAjTUFYX1NZTlRIRVNJU19DSEFOTkVMUyB0aW1lIGRvbWFpbiBvdXRwdXQgc2FtcGxlcy4KLSovCi0KLXN0YXRpYwotdm9pZCBxbWZTeW5Qcm90b3R5cGVGaXJTbG90KCBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHFtZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnJlYWxTbG90LCAgICAgIC8qITwgSW5wdXQ6IFBvaW50ZXIgdG8gcmVhbCBTbG90ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICppbWFnU2xvdCwgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIGltYWcgU2xvdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAqdGltZU91dCwgICAgICAgICAgICAgLyohPCBUaW1lIGRvbWFpbiBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICBzdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgSU5UIGVyciA9IC0xOwotCi0gICAgc3dpdGNoIChxbWYtPnBfc3RyaWRlKSB7Ci0gICAgY2FzZSAyOgotICAgICAgZXJyID0gcW1mU3luUHJvdG90eXBlRmlyU2xvdDIocW1mLCByZWFsU2xvdCwgaW1hZ1Nsb3QsIHRpbWVPdXQsIHN0cmlkZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZXJyID0gLTE7Ci0gICAgfQotCi0gICAgLyogZmFsbGJhY2sgaWYgY29uZmlndXJhdGlvbiBub3QgYXZhaWxhYmxlIG9yIGZhaWxlZCAqLwotICAgIGlmKGVyciE9MCkgewotICAgICAgICBxbWZTeW5Qcm90b3R5cGVGaXJTbG90X2ZhbGxiYWNrKHFtZiwgcmVhbFNsb3QsIGltYWdTbG90LCB0aW1lT3V0LCBzdHJpZGUpOwotICAgIH0KLX0KLSNlbmRpZiAvKiBGVU5DVElPTl9xbWZTeW5Qcm90b3R5cGVGaXJTbG90ICovCi0KLSNlbmRpZiAgLyogICggZGVmaW5lZChfX0NDX0FSTSkgJiYgZGVmaW5lZChfX0FSTV9BUkNIXzVURV9fKSAmJiAoU0FNUExFX0JJVFMgPT0gMTYpICkgJiYgIWRlZmluZWQoUU1GX1RBQkxFX0ZVTEwpICovCi0KLQotCi0vKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KLQotCi0KLSNlbmRpZiAgLyogKFFNRl9OT19QT0xZPT01KSAqLwotCmRpZmYgLS1naXQgYS9saWJGREsvc3JjL2FybS9zY2FsZV9hcm0uY3BwIGIvbGliRkRLL3NyYy9hcm0vc2NhbGVfYXJtLmNwcAppbmRleCBlMjgzN2VmLi45MmM5ZWRjIDEwMDY0NAotLS0gYS9saWJGREsvc3JjL2FybS9zY2FsZV9hcm0uY3BwCisrKyBiL2xpYkZESy9zcmMvYXJtL3NjYWxlX2FybS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNDAgKzkwLDM0IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCi0gICBBdXRob3Iocyk6IEFydGh1ciBUcml0dGhhcnQKKyAgIEF1dGhvcihzKTogICBBcnRodXIgVHJpdHRoYXJ0CisKICAgIERlc2NyaXB0aW9uOiBTY2FsaW5nIG9wZXJhdGlvbnMgZm9yIEFSTQogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBwcmV2ZW50IG11bHRpcGxlIGluY2x1c2lvbiB3aXRoIHJlLWRlZmluaXRpb25zICovCiAjaWZuZGVmIF9fSU5DTFVERV9TQ0FMRV9BUk1fXwogI2RlZmluZSBfX0lOQ0xVREVfU0NBTEVfQVJNX18KIAorI2lmICFkZWZpbmVkKEZVTkNUSU9OX3NjYWxlVmFsdWVzV2l0aEZhY3Rvcl9EQkwpCiAjZGVmaW5lIEZVTkNUSU9OX3NjYWxlVmFsdWVzV2l0aEZhY3Rvcl9EQkwKLQogU0NBTEVfSU5MSU5FCi12b2lkIHNjYWxlVmFsdWVzV2l0aEZhY3RvcigKLSAgICAgICAgRklYUF9EQkwgKnZlY3RvciwKLSAgICAgICAgRklYUF9EQkwgZmFjdG9yLAotICAgICAgICBJTlQgbGVuLAotICAgICAgICBJTlQgc2NhbGVmYWN0b3IKLSAgICAgICAgKQotewordm9pZCBzY2FsZVZhbHVlc1dpdGhGYWN0b3IoRklYUF9EQkwgKnZlY3RvciwgRklYUF9EQkwgZmFjdG9yLCBJTlQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNjYWxlZmFjdG9yKSB7CiAgIC8qIFRoaXMgY29kZSBjb21iaW5lcyB0aGUgZk11bHQgd2l0aCB0aGUgc2NhbGluZyAgICAgICAgICAgICAqLwogICAvKiBJdCBwZXJmb3JtcyBhIGZNdWx0RGl2MiBhbmQgaW5jcmVtZW50cyBzaGlmdCBieSAxICAgICAgICAgKi8KICAgaW50IHNoaWZ0ID0gc2NhbGVmYWN0b3IgKyAxOwogICBGSVhQX0RCTCAqbXlTcGVjID0gdmVjdG9yOwogCi0gIHNoaWZ0ID0gZml4bWluX0koc2hpZnQsKElOVClERlJBQ1RfQklUUy0xKTsKKyAgc2hpZnQgPSBmaXhtaW5fSShzaGlmdCwgKElOVClERlJBQ1RfQklUUyAtIDEpOwogCi0gIGlmIChzaGlmdCA+PSAwKQotICB7Ci0gICAgZm9yIChpbnQgaT0wOyBpPChsZW4+PjIpOyBpKyspCi0gICAgeworICBpZiAoc2hpZnQgPj0gMCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGxlbiA+PiAyKTsgaSsrKSB7CiAgICAgICBGSVhQX0RCTCB0bXAwID0gbXlTcGVjWzBdOwogICAgICAgRklYUF9EQkwgdG1wMSA9IG15U3BlY1sxXTsKICAgICAgIEZJWFBfREJMIHRtcDIgPSBteVNwZWNbMl07CkBAIC0xMzAsMTkgKzEzNSwxNSBAQAogICAgICAgKm15U3BlYysrID0gdG1wMjsKICAgICAgICpteVNwZWMrKyA9IHRtcDM7CiAgICAgfQotICAgIGZvciAoaW50IGk9bGVuJjM7IGktLTspCi0gICAgeworICAgIGZvciAoaW50IGkgPSBsZW4gJiAzOyBpLS07KSB7CiAgICAgICBGSVhQX0RCTCB0bXAwID0gbXlTcGVjWzBdOwogICAgICAgdG1wMCA9IGZNdWx0RGl2Mih0bXAwLCBmYWN0b3IpOwogICAgICAgdG1wMCA8PD0gc2hpZnQ7CiAgICAgICAqbXlTcGVjKysgPSB0bXAwOwogICAgIH0KLSAgfQotICBlbHNlCi0gIHsKKyAgfSBlbHNlIHsKICAgICBzaGlmdCA9IC1zaGlmdDsKLSAgICBmb3IgKGludCBpPTA7IGk8KGxlbj4+Mik7IGkrKykKLSAgICB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAobGVuID4+IDIpOyBpKyspIHsKICAgICAgIEZJWFBfREJMIHRtcDAgPSBteVNwZWNbMF07CiAgICAgICBGSVhQX0RCTCB0bXAxID0gbXlTcGVjWzFdOwogICAgICAgRklYUF9EQkwgdG1wMiA9IG15U3BlY1syXTsKQEAgLTE2MCw4ICsxNjEsNyBAQAogICAgICAgKm15U3BlYysrID0gdG1wMjsKICAgICAgICpteVNwZWMrKyA9IHRtcDM7CiAgICAgfQotICAgIGZvciAoaW50IGk9bGVuJjM7IGktLTspCi0gICAgeworICAgIGZvciAoaW50IGkgPSBsZW4gJiAzOyBpLS07KSB7CiAgICAgICBGSVhQX0RCTCB0bXAwID0gbXlTcGVjWzBdOwogICAgICAgdG1wMCA9IGZNdWx0RGl2Mih0bXAwLCBmYWN0b3IpOwogICAgICAgdG1wMCA+Pj0gc2hpZnQ7CkBAIC0xNjksNSArMTY5LDYgQEAKICAgICB9CiAgIH0KIH0KKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fc2NhbGVWYWx1ZXNXaXRoRmFjdG9yX0RCTCkgKi8KIAogI2VuZGlmIC8qICNpZm5kZWYgX19JTkNMVURFX1NDQUxFX0FSTV9fICovCmRpZmYgLS1naXQgYS9saWJGREsvc3JjL2F1dG9jb3JyMm5kLmNwcCBiL2xpYkZESy9zcmMvYXV0b2NvcnIybmQuY3BwCmluZGV4IGI3ZWFlN2MuLjcxOGE1NTUgMTAwNjQ0Ci0tLSBhL2xpYkZESy9zcmMvYXV0b2NvcnIybmQuY3BwCisrKyBiL2xpYkZESy9zcmMvYXV0b2NvcnIybmQuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQzICs5MCwzNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBNLiBMb2h3YXNzZXIKKwogICAgRGVzY3JpcHRpb246IGF1dG8tY29ycmVsYXRpb24gZnVuY3Rpb25zCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJhdXRvY29ycjJuZC5oIgogCi0KLQogLyogIElmIHRoZSBhY2N1bXVsYXRvciBkb2VzIG5vdCBwcm92aWRlIGVub3VnaCBvdmVyZmxvdyBiaXRzLAogICAgIHByb2R1Y3RzIGhhdmUgdG8gYmUgc2hpZnRlZCBkb3duIGluIHRoZSBhdXRvY29ycmVsYXRpb24gYmVsb3cuICovCiAjZGVmaW5lIFNISUZUX0ZBQ1RPUiAoNSkKICNkZWZpbmUgU0hJRlQgPj4gKFNISUZUX0ZBQ1RPUikKIAotCi0jaWYgZGVmaW5lZChfX0NDX0FSTSkgfHwgZGVmaW5lZChfX2FybV9fKQotI2luY2x1ZGUgImFybS9hdXRvY29ycjJuZC5jcHAiCi0jZW5kaWYKLQotCiAvKiEKICAqCiAgKiBcYnJpZWYgQ2FsY3VsYXRlIHNlY29uZCBvcmRlciBhdXRvY29ycmVsYXRpb24gdXNpbmcgMiBhY2N1bXVsYXRvcnMKICAqCiAgKi8KICNpZiAhZGVmaW5lZChGVU5DVElPTl9hdXRvQ29ycjJuZF9yZWFsKQotSU5UCi1hdXRvQ29ycjJuZF9yZWFsIChBQ09SUl9DT0VGUyAqYWMsICAgICAgICAgIC8qITwgUG9pbnRlciB0byBhdXRvY29ycmVsYXRpb24gY29lZmZzICovCi0gICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqcmVCdWZmZXIsIC8qITwgUG9pbnRlciB0byB0byByZWFsIHBhcnQgb2YgaW5wdXQgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxlbiAgICAgICAgICAgICAvKiE8IE51bWJlciBpbnB1dCBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICkKLXsKLSAgaW50ICAgaiwgYXV0b0NvcnJTY2FsaW5nLCBtU2NhbGU7CitJTlQgYXV0b0NvcnIybmRfcmVhbCgKKyAgICBBQ09SUl9DT0VGUyAqYWMsICAgICAgICAgIC8qITwgUG9pbnRlciB0byBhdXRvY29ycmVsYXRpb24gY29lZmZzICovCisgICAgY29uc3QgRklYUF9EQkwgKnJlQnVmZmVyLCAvKiE8IFBvaW50ZXIgdG8gdG8gcmVhbCBwYXJ0IG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICBjb25zdCBpbnQgbGVuICAgICAgICAgICAgIC8qITwgTnVtYmVyIGlucHV0IHNhbXBsZXMgKi8KKykgeworICBpbnQgaiwgYXV0b0NvcnJTY2FsaW5nLCBtU2NhbGU7CiAKICAgRklYUF9EQkwgYWNjdTEsIGFjY3UyLCBhY2N1MywgYWNjdTQsIGFjY3U1OwogCkBAIC0xMjgsMjcgKzEzMSwyNCBAQAogICAgIHIwMXIscjEycgogICAgIHIwMnIKICAgKi8KLSAgcFJlQnVmID0gcmVhbEJ1Zi0yOwotICBhY2N1NSA9ICggKGZNdWx0RGl2MihwUmVCdWZbMF0sIHBSZUJ1ZlsyXSkgKwotICAgICAgICAgICAgIGZNdWx0RGl2MihwUmVCdWZbMV0sIHBSZUJ1ZlszXSkpIFNISUZUKTsKKyAgcFJlQnVmID0gcmVhbEJ1ZiAtIDI7CisgIGFjY3U1ID0gKChmTXVsdERpdjIocFJlQnVmWzBdLCBwUmVCdWZbMl0pICsgZk11bHREaXYyKHBSZUJ1ZlsxXSwgcFJlQnVmWzNdKSkKKyAgICAgICAgICAgICAgIFNISUZUKTsKICAgcFJlQnVmKys7CiAKLSAgLy9sZW4gbXVzdCBiZSBldmVuCisgIC8qIGxlbiBtdXN0IGJlIGV2ZW4gKi8KICAgYWNjdTEgPSBmUG93MkRpdjIocFJlQnVmWzBdKSBTSElGVDsKICAgYWNjdTMgPSBmTXVsdERpdjIocFJlQnVmWzBdLCBwUmVCdWZbMV0pIFNISUZUOwogICBwUmVCdWYrKzsKIAotICBmb3IgKCBqID0gKGxlbiAtIDIpPj4xOyBqICE9IDA7IGotLSxwUmVCdWYrPTIgKSB7CisgIGZvciAoaiA9IChsZW4gLSAyKSA+PiAxOyBqICE9IDA7IGotLSwgcFJlQnVmICs9IDIpIHsKKyAgICBhY2N1MSArPSAoKGZQb3cyRGl2MihwUmVCdWZbMF0pICsgZlBvdzJEaXYyKHBSZUJ1ZlsxXSkpIFNISUZUKTsKIAotICAgIGFjY3UxICs9ICggKGZQb3cyRGl2MihwUmVCdWZbMF0pICsKLSAgICAgICAgICAgICAgICBmUG93MkRpdjIocFJlQnVmWzFdKSkgU0hJRlQpOworICAgIGFjY3UzICs9ICgoZk11bHREaXYyKHBSZUJ1ZlswXSwgcFJlQnVmWzFdKSArCisgICAgICAgICAgICAgICBmTXVsdERpdjIocFJlQnVmWzFdLCBwUmVCdWZbMl0pKSBTSElGVCk7CiAKLSAgICBhY2N1MyArPSAoIChmTXVsdERpdjIocFJlQnVmWzBdLCBwUmVCdWZbMV0pICsKLSAgICAgICAgICAgICAgICBmTXVsdERpdjIocFJlQnVmWzFdLCBwUmVCdWZbMl0pKSBTSElGVCk7Ci0KLSAgICBhY2N1NSArPSAoIChmTXVsdERpdjIocFJlQnVmWzBdLCBwUmVCdWZbMl0pICsKLSAgICAgICAgICAgICAgICBmTXVsdERpdjIocFJlQnVmWzFdLCBwUmVCdWZbM10pKSBTSElGVCk7Ci0KKyAgICBhY2N1NSArPSAoKGZNdWx0RGl2MihwUmVCdWZbMF0sIHBSZUJ1ZlsyXSkgKworICAgICAgICAgICAgICAgZk11bHREaXYyKHBSZUJ1ZlsxXSwgcFJlQnVmWzNdKSkgU0hJRlQpOwogICB9CiAKICAgYWNjdTIgPSAoZlBvdzJEaXYyKHJlYWxCdWZbLTJdKSBTSElGVCk7CkBAIC0xNTYsMTIgKzE1NiwxNCBAQAogCiAgIGFjY3UxICs9IChmUG93MkRpdjIocmVhbEJ1ZltsZW4gLSAyXSkgU0hJRlQpOwogCi0gIGFjY3U0ICA9IChmTXVsdERpdjIocmVhbEJ1ZlstMV0scmVhbEJ1ZlstMl0pIFNISUZUKTsKKyAgYWNjdTQgPSAoZk11bHREaXYyKHJlYWxCdWZbLTFdLCByZWFsQnVmWy0yXSkgU0hJRlQpOwogICBhY2N1NCArPSBhY2N1MzsKIAotICBhY2N1MyArPSAoZk11bHREaXYyKHJlYWxCdWZbbGVuIC0gMV0scmVhbEJ1ZltsZW4gLSAyXSkgU0hJRlQpOworICBhY2N1MyArPSAoZk11bHREaXYyKHJlYWxCdWZbbGVuIC0gMV0sIHJlYWxCdWZbbGVuIC0gMl0pIFNISUZUKTsKIAotICBtU2NhbGUgPSBDbnRMZWFkaW5nWmVyb3MoIChhY2N1MSB8IGFjY3UyIHwgZkFicyhhY2N1MykgfCBmQWJzKGFjY3U0KSB8IGZBYnMoYWNjdTUpKSApIC0gMTsKKyAgbVNjYWxlID0gQ250TGVhZGluZ1plcm9zKAorICAgICAgICAgICAgICAgKGFjY3UxIHwgYWNjdTIgfCBmQWJzKGFjY3UzKSB8IGZBYnMoYWNjdTQpIHwgZkFicyhhY2N1NSkpKSAtCisgICAgICAgICAgIDE7CiAgIGF1dG9Db3JyU2NhbGluZyA9IG1TY2FsZSAtIDEgLSBTSElGVF9GQUNUT1I7IC8qIC0xIGJlY2F1c2Ugb2YgZk11bHREaXYyKi8KIAogICAvKiBTY2FsZSB0byBjb21tb24gc2NhbGUgZmFjdG9yICovCkBAIC0xNzEsMzYgKzE3MywzMyBAQAogICBhYy0+cjEyciA9IGFjY3U0IDw8IG1TY2FsZTsKICAgYWMtPnIwMnIgPSBhY2N1NSA8PCBtU2NhbGU7CiAKLSAgYWMtPmRldCA9IChmTXVsdERpdjIoYWMtPnIxMXIsYWMtPnIyMnIpIC0gZk11bHREaXYyKGFjLT5yMTJyLGFjLT5yMTJyKSkgOwotICBtU2NhbGUgID0gQ291bnRMZWFkaW5nQml0cyhmQWJzKGFjLT5kZXQpKTsKKyAgYWMtPmRldCA9IChmTXVsdERpdjIoYWMtPnIxMXIsIGFjLT5yMjJyKSAtIGZNdWx0RGl2MihhYy0+cjEyciwgYWMtPnIxMnIpKTsKKyAgbVNjYWxlID0gQ291bnRMZWFkaW5nQml0cyhmQWJzKGFjLT5kZXQpKTsKIAotICBhYy0+ZGV0ICAgICA8PD0gbVNjYWxlOworICBhYy0+ZGV0IDw8PSBtU2NhbGU7CiAgIGFjLT5kZXRfc2NhbGUgPSBtU2NhbGUgLSAxOwogCiAgIHJldHVybiBhdXRvQ29yclNjYWxpbmc7CiB9CiAjZW5kaWYKIAotI2lmbmRlZiBMT1dfUE9XRVJfU0JSX09OTFkKICNpZiAhZGVmaW5lZChGVU5DVElPTl9hdXRvQ29ycjJuZF9jcGx4KQotSU5UCi1hdXRvQ29ycjJuZF9jcGx4IChBQ09SUl9DT0VGUyAqYWMsICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gYXV0b2NvcnJlbGF0aW9uIGNvZWZmcyAqLwotICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnJlQnVmZmVyLCAgLyohPCBQb2ludGVyIHRvIHJlYWwgcGFydCBvZiBpbnB1dCBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqaW1CdWZmZXIsICAvKiE8IFBvaW50ZXIgdG8gaW1hZyBwYXJ0IG9mIGlucHV0IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBsZW4gICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgKQoteworSU5UIGF1dG9Db3JyMm5kX2NwbHgoCisgICAgQUNPUlJfQ09FRlMgKmFjLCAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gYXV0b2NvcnJlbGF0aW9uIGNvZWZmcyAqLworICAgIGNvbnN0IEZJWFBfREJMICpyZUJ1ZmZlciwgLyohPCBQb2ludGVyIHRvIHJlYWwgcGFydCBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgY29uc3QgRklYUF9EQkwgKmltQnVmZmVyLCAvKiE8IFBvaW50ZXIgdG8gaW1hZyBwYXJ0IG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICBjb25zdCBpbnQgbGVuIC8qITwgTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKHNob3VsZCBiZSBzbWFsbGVyIHRoYW4gMTI4KSAqLworKSB7CisgIGludCBqLCBhdXRvQ29yclNjYWxpbmcsIG1TY2FsZSwgbGVuX3NjYWxlOwogCi0gIGludCAgIGosIGF1dG9Db3JyU2NhbGluZywgbVNjYWxlLCBsZW5fc2NhbGU7Ci0KLSAgRklYUF9EQkwgYWNjdTAsIGFjY3UxLGFjY3UyLCBhY2N1MywgYWNjdTQsIGFjY3U1LCBhY2N1NiwgYWNjdTcsIGFjY3U4OworICBGSVhQX0RCTCBhY2N1MCwgYWNjdTEsIGFjY3UyLCBhY2N1MywgYWNjdTQsIGFjY3U1LCBhY2N1NiwgYWNjdTcsIGFjY3U4OwogCiAgIGNvbnN0IEZJWFBfREJMICpwUmVCdWYsICpwSW1CdWY7CiAKICAgY29uc3QgRklYUF9EQkwgKnJlYWxCdWYgPSByZUJ1ZmZlcjsKICAgY29uc3QgRklYUF9EQkwgKmltYWdCdWYgPSBpbUJ1ZmZlcjsKIAotICAobGVuPjY0KSA/IChsZW5fc2NhbGUgPSA2KSA6IChsZW5fc2NhbGUgPSA1KTsKKyAgKGxlbiA+IDY0KSA/IChsZW5fc2NhbGUgPSA2KSA6IChsZW5fc2NhbGUgPSA1KTsKICAgLyoKICAgICByMDByLAogICAgIHIxMXIscjIycgpAQCAtMjEwLDQ2ICsyMDksNjMgQEAKICAgKi8KICAgYWNjdTEgPSBhY2N1MyA9IGFjY3U1ID0gYWNjdTcgPSBhY2N1OCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogCi0gIHBSZUJ1ZiAgPSByZWFsQnVmLTIsIHBJbUJ1ZiAgPSBpbWFnQnVmLTI7Ci0gIGFjY3U3ICs9ICggKGZNdWx0RGl2MihwUmVCdWZbMl0sIHBSZUJ1ZlswXSkgKyBmTXVsdERpdjIocEltQnVmWzJdLCBwSW1CdWZbMF0pKSA+PiBsZW5fc2NhbGUpOwotICBhY2N1OCArPSAoIChmTXVsdERpdjIocEltQnVmWzJdLCBwUmVCdWZbMF0pIC0gZk11bHREaXYyKHBSZUJ1ZlsyXSwgcEltQnVmWzBdKSkgPj4gbGVuX3NjYWxlKTsKKyAgcFJlQnVmID0gcmVhbEJ1ZiAtIDIsIHBJbUJ1ZiA9IGltYWdCdWYgLSAyOworICBhY2N1NyArPQorICAgICAgKChmTXVsdERpdjIocFJlQnVmWzJdLCBwUmVCdWZbMF0pICsgZk11bHREaXYyKHBJbUJ1ZlsyXSwgcEltQnVmWzBdKSkgPj4KKyAgICAgICBsZW5fc2NhbGUpOworICBhY2N1OCArPQorICAgICAgKChmTXVsdERpdjIocEltQnVmWzJdLCBwUmVCdWZbMF0pIC0gZk11bHREaXYyKHBSZUJ1ZlsyXSwgcEltQnVmWzBdKSkgPj4KKyAgICAgICBsZW5fc2NhbGUpOwogCi0gIHBSZUJ1ZiA9IHJlYWxCdWYtMSwgcEltQnVmID0gaW1hZ0J1Zi0xOwotICBmb3IgKCBqID0gKGxlbiAtIDEpOyBqICE9IDA7IGotLSxwUmVCdWYrKyxwSW1CdWYrKyApewotICAgIGFjY3UxICs9ICggKGZQb3cyRGl2MihwUmVCdWZbMF0gICAgICAgICAgICkgKyBmUG93MkRpdjIocEltQnVmWzBdICAgICAgICAgICApKSA+PiBsZW5fc2NhbGUpOwotICAgIGFjY3UzICs9ICggKGZNdWx0RGl2MihwUmVCdWZbMF0sIHBSZUJ1ZlsxXSkgKyBmTXVsdERpdjIocEltQnVmWzBdLCBwSW1CdWZbMV0pKSA+PiBsZW5fc2NhbGUpOwotICAgIGFjY3U1ICs9ICggKGZNdWx0RGl2MihwSW1CdWZbMV0sIHBSZUJ1ZlswXSkgLSBmTXVsdERpdjIocFJlQnVmWzFdLCBwSW1CdWZbMF0pKSA+PiBsZW5fc2NhbGUpOwotICAgIGFjY3U3ICs9ICggKGZNdWx0RGl2MihwUmVCdWZbMl0sIHBSZUJ1ZlswXSkgKyBmTXVsdERpdjIocEltQnVmWzJdLCBwSW1CdWZbMF0pKSA+PiBsZW5fc2NhbGUpOwotICAgIGFjY3U4ICs9ICggKGZNdWx0RGl2MihwSW1CdWZbMl0sIHBSZUJ1ZlswXSkgLSBmTXVsdERpdjIocFJlQnVmWzJdLCBwSW1CdWZbMF0pKSA+PiBsZW5fc2NhbGUpOworICBwUmVCdWYgPSByZWFsQnVmIC0gMSwgcEltQnVmID0gaW1hZ0J1ZiAtIDE7CisgIGZvciAoaiA9IChsZW4gLSAxKTsgaiAhPSAwOyBqLS0sIHBSZUJ1ZisrLCBwSW1CdWYrKykgeworICAgIGFjY3UxICs9ICgoZlBvdzJEaXYyKHBSZUJ1ZlswXSkgKyBmUG93MkRpdjIocEltQnVmWzBdKSkgPj4gbGVuX3NjYWxlKTsKKyAgICBhY2N1MyArPQorICAgICAgICAoKGZNdWx0RGl2MihwUmVCdWZbMF0sIHBSZUJ1ZlsxXSkgKyBmTXVsdERpdjIocEltQnVmWzBdLCBwSW1CdWZbMV0pKSA+PgorICAgICAgICAgbGVuX3NjYWxlKTsKKyAgICBhY2N1NSArPQorICAgICAgICAoKGZNdWx0RGl2MihwSW1CdWZbMV0sIHBSZUJ1ZlswXSkgLSBmTXVsdERpdjIocFJlQnVmWzFdLCBwSW1CdWZbMF0pKSA+PgorICAgICAgICAgbGVuX3NjYWxlKTsKKyAgICBhY2N1NyArPQorICAgICAgICAoKGZNdWx0RGl2MihwUmVCdWZbMl0sIHBSZUJ1ZlswXSkgKyBmTXVsdERpdjIocEltQnVmWzJdLCBwSW1CdWZbMF0pKSA+PgorICAgICAgICAgbGVuX3NjYWxlKTsKKyAgICBhY2N1OCArPQorICAgICAgICAoKGZNdWx0RGl2MihwSW1CdWZbMl0sIHBSZUJ1ZlswXSkgLSBmTXVsdERpdjIocFJlQnVmWzJdLCBwSW1CdWZbMF0pKSA+PgorICAgICAgICAgbGVuX3NjYWxlKTsKICAgfQogCi0gIGFjY3UyID0gKCAoZlBvdzJEaXYyKHJlYWxCdWZbLTJdKSArIGZQb3cyRGl2MihpbWFnQnVmWy0yXSkpID4+IGxlbl9zY2FsZSk7CisgIGFjY3UyID0gKChmUG93MkRpdjIocmVhbEJ1ZlstMl0pICsgZlBvdzJEaXYyKGltYWdCdWZbLTJdKSkgPj4gbGVuX3NjYWxlKTsKICAgYWNjdTIgKz0gYWNjdTE7CiAKLSAgYWNjdTEgKz0gKCAoZlBvdzJEaXYyKHJlYWxCdWZbbGVuLTJdKSArCi0gICAgICAgICAgICAgIGZQb3cyRGl2MihpbWFnQnVmW2xlbi0yXSkpID4+IGxlbl9zY2FsZSk7Ci0gIGFjY3UwID0gKCAoZlBvdzJEaXYyKHJlYWxCdWZbbGVuLTFdKSArCi0gICAgICAgICAgICAgZlBvdzJEaXYyKGltYWdCdWZbbGVuLTFdKSkgPj4gbGVuX3NjYWxlKSAtCi0gICAgICAgICAgKCAoZlBvdzJEaXYyKHJlYWxCdWZbLTFdKSArCi0gICAgICAgICAgICAgZlBvdzJEaXYyKGltYWdCdWZbLTFdKSkgPj4gbGVuX3NjYWxlKTsKKyAgYWNjdTEgKz0gKChmUG93MkRpdjIocmVhbEJ1ZltsZW4gLSAyXSkgKyBmUG93MkRpdjIoaW1hZ0J1ZltsZW4gLSAyXSkpID4+CisgICAgICAgICAgICBsZW5fc2NhbGUpOworICBhY2N1MCA9ICgoZlBvdzJEaXYyKHJlYWxCdWZbbGVuIC0gMV0pICsgZlBvdzJEaXYyKGltYWdCdWZbbGVuIC0gMV0pKSA+PgorICAgICAgICAgICBsZW5fc2NhbGUpIC0KKyAgICAgICAgICAoKGZQb3cyRGl2MihyZWFsQnVmWy0xXSkgKyBmUG93MkRpdjIoaW1hZ0J1ZlstMV0pKSA+PiBsZW5fc2NhbGUpOwogICBhY2N1MCArPSBhY2N1MTsKIAotICBhY2N1NCA9ICggKGZNdWx0RGl2MihyZWFsQnVmWy0xXSwgcmVhbEJ1ZlstMl0pICsKLSAgICAgICAgICAgICBmTXVsdERpdjIoaW1hZ0J1ZlstMV0sIGltYWdCdWZbLTJdKSkgPj4gbGVuX3NjYWxlKTsKKyAgYWNjdTQgPSAoKGZNdWx0RGl2MihyZWFsQnVmWy0xXSwgcmVhbEJ1ZlstMl0pICsKKyAgICAgICAgICAgIGZNdWx0RGl2MihpbWFnQnVmWy0xXSwgaW1hZ0J1ZlstMl0pKSA+PgorICAgICAgICAgICBsZW5fc2NhbGUpOwogICBhY2N1NCArPSBhY2N1MzsKIAotICBhY2N1MyArPSAoIChmTXVsdERpdjIocmVhbEJ1ZltsZW4tMV0sIHJlYWxCdWZbbGVuLTJdKSArCi0gICAgICAgICAgICAgIGZNdWx0RGl2MihpbWFnQnVmW2xlbi0xXSwgaW1hZ0J1ZltsZW4tMl0pKSA+PiBsZW5fc2NhbGUpOworICBhY2N1MyArPSAoKGZNdWx0RGl2MihyZWFsQnVmW2xlbiAtIDFdLCByZWFsQnVmW2xlbiAtIDJdKSArCisgICAgICAgICAgICAgZk11bHREaXYyKGltYWdCdWZbbGVuIC0gMV0sIGltYWdCdWZbbGVuIC0gMl0pKSA+PgorICAgICAgICAgICAgbGVuX3NjYWxlKTsKIAotICBhY2N1NiA9ICggKGZNdWx0RGl2MihpbWFnQnVmWy0xXSwgcmVhbEJ1ZlstMl0pIC0KLSAgICAgICAgICAgICBmTXVsdERpdjIocmVhbEJ1ZlstMV0sIGltYWdCdWZbLTJdKSkgPj4gbGVuX3NjYWxlKTsKKyAgYWNjdTYgPSAoKGZNdWx0RGl2MihpbWFnQnVmWy0xXSwgcmVhbEJ1ZlstMl0pIC0KKyAgICAgICAgICAgIGZNdWx0RGl2MihyZWFsQnVmWy0xXSwgaW1hZ0J1ZlstMl0pKSA+PgorICAgICAgICAgICBsZW5fc2NhbGUpOwogICBhY2N1NiArPSBhY2N1NTsKIAotICBhY2N1NSArPSAoIChmTXVsdERpdjIoaW1hZ0J1ZltsZW4gLSAxXSwgcmVhbEJ1ZltsZW4gLSAyXSkgLQotICAgICAgICAgICAgICBmTXVsdERpdjIocmVhbEJ1ZltsZW4gLSAxXSwgaW1hZ0J1ZltsZW4gLSAyXSkpID4+IGxlbl9zY2FsZSk7CisgIGFjY3U1ICs9ICgoZk11bHREaXYyKGltYWdCdWZbbGVuIC0gMV0sIHJlYWxCdWZbbGVuIC0gMl0pIC0KKyAgICAgICAgICAgICBmTXVsdERpdjIocmVhbEJ1ZltsZW4gLSAxXSwgaW1hZ0J1ZltsZW4gLSAyXSkpID4+CisgICAgICAgICAgICBsZW5fc2NhbGUpOwogCi0gIG1TY2FsZSA9IENudExlYWRpbmdaZXJvcyggKGFjY3UwIHwgYWNjdTEgfCBhY2N1MiB8IGZBYnMoYWNjdTMpIHwgZkFicyhhY2N1NCkgfCBmQWJzKGFjY3U1KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZBYnMoYWNjdTYpIHwgZkFicyhhY2N1NykgfCBmQWJzKGFjY3U4KSkgKSAtIDE7CisgIG1TY2FsZSA9CisgICAgICBDbnRMZWFkaW5nWmVyb3MoKGFjY3UwIHwgYWNjdTEgfCBhY2N1MiB8IGZBYnMoYWNjdTMpIHwgZkFicyhhY2N1NCkgfAorICAgICAgICAgICAgICAgICAgICAgICBmQWJzKGFjY3U1KSB8IGZBYnMoYWNjdTYpIHwgZkFicyhhY2N1NykgfCBmQWJzKGFjY3U4KSkpIC0KKyAgICAgIDE7CiAgIGF1dG9Db3JyU2NhbGluZyA9IG1TY2FsZSAtIDEgLSBsZW5fc2NhbGU7IC8qIC0xIGJlY2F1c2Ugb2YgZk11bHREaXYyKi8KIAogICAvKiBTY2FsZSB0byBjb21tb24gc2NhbGUgZmFjdG9yICovCkBAIC0yNjMsMTYgKzI3OSwxNSBAQAogICBhYy0+cjAyciA9IChGSVhQX0RCTClhY2N1NyA8PCBtU2NhbGU7CiAgIGFjLT5yMDJpID0gKEZJWFBfREJMKWFjY3U4IDw8IG1TY2FsZTsKIAotICBhYy0+ZGV0ID0gKCBmTXVsdERpdjIoYWMtPnIxMXIsYWMtPnIyMnIpID4+IDEgKSAtCi0gICAgICAgICAgICAoIChmTXVsdERpdjIoYWMtPnIxMnIsYWMtPnIxMnIpICsgZk11bHREaXYyKGFjLT5yMTJpLGFjLT5yMTJpKSkgPj4gMSApOwotICBtU2NhbGUgPSBDb3VudExlYWRpbmdCaXRzKGZBYnMoYWMtPmRldCkpOworICBhYy0+ZGV0ID0KKyAgICAgIChmTXVsdERpdjIoYWMtPnIxMXIsIGFjLT5yMjJyKSA+PiAxKSAtCisgICAgICAoKGZNdWx0RGl2MihhYy0+cjEyciwgYWMtPnIxMnIpICsgZk11bHREaXYyKGFjLT5yMTJpLCBhYy0+cjEyaSkpID4+IDEpOworICBtU2NhbGUgPSBDbnRMZWFkaW5nWmVyb3MoZkFicyhhYy0+ZGV0KSkgLSAxOwogCiAgIGFjLT5kZXQgPDw9IG1TY2FsZTsKICAgYWMtPmRldF9zY2FsZSA9IG1TY2FsZSAtIDI7CiAKICAgcmV0dXJuIGF1dG9Db3JyU2NhbGluZzsKIH0KKwogI2VuZGlmIC8qIEZVTkNUSU9OX2F1dG9Db3JyMm5kX2NwbHggKi8KLSNlbmRpZiAvKiBMT1dfUE9XRVJfU0JSX09OTFkgKi8KLQotCmRpZmYgLS1naXQgYS9saWJGREsvc3JjL2RjdC5jcHAgYi9saWJGREsvc3JjL2RjdC5jcHAKaW5kZXggMWU1YjkzZS4uYTQ1MTMzMSAxMDA2NDQKLS0tIGEvbGliRkRLL3NyYy9kY3QuY3BwCisrKyBiL2xpYkZESy9zcmMvZGN0LmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw5NCArOTAsMTYzIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlICAgZGN0LmNwcAotICBcYnJpZWYgIERDVCBJbXBsZW1lbnRhdGlvbnMgICAKLSAgTGlicmFyeSBmdW5jdGlvbnMgdG8gY2FsY3VsYXRlIHN0YW5kYXJkIERDVHMuIFRoaXMgd2lsbCBtb3N0IGxpa2VseSBiZSByZXBsYWNlZCBieSBoYW5kLW9wdGltaXplZAotICBmdW5jdGlvbnMgZm9yIHRoZSBzcGVjaWZpYyB0YXJnZXQgcHJvY2Vzc29yLgorICBcYnJpZWYgIERDVCBJbXBsZW1lbnRhdGlvbnMKKyAgTGlicmFyeSBmdW5jdGlvbnMgdG8gY2FsY3VsYXRlIHN0YW5kYXJkIERDVHMuIFRoaXMgd2lsbCBtb3N0IGxpa2VseSBiZQorICByZXBsYWNlZCBieSBoYW5kLW9wdGltaXplZCBmdW5jdGlvbnMgZm9yIHRoZSBzcGVjaWZpYyB0YXJnZXQgcHJvY2Vzc29yLgogCi0gIFRocmVlIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGRjdCB0eXBlIElJIGFuZCB0aGUgZGN0IHR5cGUgSUlJIHRyYW5zZm9ybXMgYXJlIHByb3ZpZGVkLgorICBUaHJlZSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBkY3QgdHlwZSBJSSBhbmQgdGhlIGRjdCB0eXBlIElJSQorICB0cmFuc2Zvcm1zIGFyZSBwcm92aWRlZC4KIAotICBCeSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyB3aGljaCBhcmUgYmFzZWQgb24gYSBzaW5nbGUsIHN0YW5kYXJkIGNvbXBsZXggRkZULWtlcm5lbCBhcmUgdXNlZCAoZGN0SUlfZigpIGFuZCBkY3RJSUlfZigpKS4KLSAgVGhlc2UgYXJlIHNwZWNpZmljYWxseSBoZWxwZnVsIGluIGNhc2VzIHdoZXJlIG9wdGltaXplZCBGRlQgbGlicmFyaWVzIGFyZSBhbHJlYWR5IGF2YWlsYWJsZS4gVGhlIEZGVCB1c2VkIGluIHRoZXNlCi0gIGltcGxlbWVudGF0aW9uIGlzIEZGVCByYWQyIGZyb20gRkRLX3Rvb2xzLgorICBCeSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyB3aGljaCBhcmUgYmFzZWQgb24gYSBzaW5nbGUsIHN0YW5kYXJkIGNvbXBsZXgKKyAgRkZULWtlcm5lbCBhcmUgdXNlZCAoZGN0SUlfZigpIGFuZCBkY3RJSUlfZigpKS4gVGhlc2UgYXJlIHNwZWNpZmljYWxseSBoZWxwZnVsCisgIGluIGNhc2VzIHdoZXJlIG9wdGltaXplZCBGRlQgbGlicmFyaWVzIGFyZSBhbHJlYWR5IGF2YWlsYWJsZS4gVGhlIEZGVCB1c2VkIGluCisgIHRoZXNlIGltcGxlbWVudGF0aW9uIGlzIEZGVCByYWQyIGZyb20gRkRLX3Rvb2xzLgogCi0gIE9mIGNvdXJzZSwgb25lIG1pZ2h0IGFsc28gdXNlIERDVC1saWJyYXJpZXMgc2hvdWxkIHRoZXkgYmUgYXZhaWxhYmxlLiBUaGUgRENUIGFuZCBEU1QKLSAgdHlwZSBJViBpbXBsZW1lbnRhdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGluIGEgdmVyc2lvbiBiYXNlZCBvbiBhIGNvbXBsZXggRkZUIGtlcm5lbC4KKyAgT2YgY291cnNlLCBvbmUgbWlnaHQgYWxzbyB1c2UgRENULWxpYnJhcmllcyBzaG91bGQgdGhleSBiZSBhdmFpbGFibGUuIFRoZSBEQ1QKKyAgYW5kIERTVCB0eXBlIElWIGltcGxlbWVudGF0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgaW4gYSB2ZXJzaW9uIGJhc2VkIG9uIGEKKyAgY29tcGxleCBGRlQga2VybmVsLgogKi8KIAogI2luY2x1ZGUgImRjdC5oIgogCi0KICNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCiAjaW5jbHVkZSAiZmZ0LmgiCiAKLQogI2lmIGRlZmluZWQoX19hcm1fXykKICNpbmNsdWRlICJhcm0vZGN0X2FybS5jcHAiCiAjZW5kaWYKIAordm9pZCBkY3RfZ2V0VGFibGVzKGNvbnN0IEZJWFBfV1RQICoqcHR3aWRkbGUsIGNvbnN0IEZJWFBfU1RQICoqc2luX3R3aWRkbGUsCisgICAgICAgICAgICAgICAgICAgaW50ICpzaW5fc3RlcCwgaW50IGxlbmd0aCkgeworICBjb25zdCBGSVhQX1dUUCAqdHdpZGRsZTsKKyAgaW50IGxkMl9sZW5ndGg7CisKKyAgLyogR2V0IGxkMiBvZiBsZW5ndGggLSAyICsgMQorICAgICAgLTI6IGJlY2F1c2UgZmlyc3QgdGFibGUgZW50cnkgaXMgd2luZG93IG9mIHNpemUgNAorICAgICAgKzE6IGJlY2F1c2Ugd2UgYWxyZWFkeSBpbmNsdWRlICsxIGJlY2F1c2Ugb2YgY2VpbChsb2cyKGxlbmd0aCkpICovCisgIGxkMl9sZW5ndGggPSBERlJBQ1RfQklUUyAtIDEgLSBmTm9ybXooKEZJWFBfREJMKWxlbmd0aCkgLSAxOworCisgIC8qIEV4dHJhY3Qgc29ydCBvZiAiZWlnZW52YWx1ZSIgKHRoZSA0IGxlZnQgbW9zdCBiaXRzKSBvZiBsZW5ndGguICovCisgIHN3aXRjaCAoKGxlbmd0aCkgPj4gKGxkMl9sZW5ndGggLSAxKSkgeworICAgIGNhc2UgMHg0OiAvKiByYWRpeCAyICovCisgICAgICAqc2luX3R3aWRkbGUgPSBTaW5lVGFibGUxMDI0OworICAgICAgKnNpbl9zdGVwID0gMSA8PCAoMTAgLSBsZDJfbGVuZ3RoKTsKKyAgICAgIHR3aWRkbGUgPSB3aW5kb3dTbG9wZXNbMF1bMF1bbGQyX2xlbmd0aCAtIDFdOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDc6IC8qIDEwIG1zICovCisgICAgICAqc2luX3R3aWRkbGUgPSBTaW5lVGFibGU0ODA7CisgICAgICAqc2luX3N0ZXAgPSAxIDw8ICg4IC0gbGQyX2xlbmd0aCk7CisgICAgICB0d2lkZGxlID0gd2luZG93U2xvcGVzWzBdWzFdW2xkMl9sZW5ndGhdOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDY6IC8qIDMvNCBvZiByYWRpeCAyICovCisgICAgICAqc2luX3R3aWRkbGUgPSBTaW5lVGFibGUzODQ7CisgICAgICAqc2luX3N0ZXAgPSAxIDw8ICg4IC0gbGQyX2xlbmd0aCk7CisgICAgICB0d2lkZGxlID0gd2luZG93U2xvcGVzWzBdWzJdW2xkMl9sZW5ndGhdOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDU6IC8qIDUvMTYgb2YgcmFkaXggMiovCisgICAgICAqc2luX3R3aWRkbGUgPSBTaW5lVGFibGU4MDsKKyAgICAgICpzaW5fc3RlcCA9IDEgPDwgKDYgLSBsZDJfbGVuZ3RoKTsKKyAgICAgIHR3aWRkbGUgPSB3aW5kb3dTbG9wZXNbMF1bM11bbGQyX2xlbmd0aF07CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgKnNpbl90d2lkZGxlID0gTlVMTDsKKyAgICAgICpzaW5fc3RlcCA9IDA7CisgICAgICB0d2lkZGxlID0gTlVMTDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKHB0d2lkZGxlICE9IE5VTEwpIHsKKyAgICBGREtfQVNTRVJUKHR3aWRkbGUgIT0gTlVMTCk7CisgICAgKnB0d2lkZGxlID0gdHdpZGRsZTsKKyAgfQorCisgIEZES19BU1NFUlQoKnNpbl9zdGVwID4gMCk7Cit9CiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9kY3RfSUlJKQogdm9pZCBkY3RfSUlJKEZJWFBfREJMICpwRGF0LCAvKiE8IHBvaW50ZXIgdG8gaW5wdXQvb3V0cHV0ICovCiAgICAgICAgICAgICAgRklYUF9EQkwgKnRtcCwgIC8qITwgcG9pbnRlciB0byB0ZW1wb3JhbCB3b3JraW5nIGJ1ZmZlciAqLwogICAgICAgICAgICAgIGludCBMLCAgICAgICAgICAvKiE8IGxlbmdodCBvZiB0cmFuc2Zvcm0gKi8KLSAgICAgICAgICAgICBpbnQgKnBEYXRfZQotICAgICAgICAgICAgICkKLXsKLSAgRkRLX0FTU0VSVChMID09IDY0IHx8IEwgPT0gMzIpOwotICBpbnQgIGk7CisgICAgICAgICAgICAgaW50ICpwRGF0X2UpIHsKKyAgY29uc3QgRklYUF9XVFAgKnNpbl90d2lkZGxlOworICBpbnQgaTsKICAgRklYUF9EQkwgeHIsIGFjY3UxLCBhY2N1MjsKLSAgaW50IGluYzsKLSAgaW50IE0gPSBMPj4xOwotICBpbnQgbGRfTTsKKyAgaW50IGluYywgaW5kZXg7CisgIGludCBNID0gTCA+PiAxOwogCi0gIGlmIChMID09IDY0KSAgbGRfTSA9IDU7Ci0gIGVsc2UgICAgICAgICAgbGRfTSA9IDQ7Ci0KLSAgLyogVGhpcyBsb29wIHBlcmZvcm1zIG11bHRpcGxpY2F0aW9uIGZvciBpbmRleCBpIChpKmluYykgKi8KLSAgaW5jID0gKDY0LzIpID4+IGxkX007IC8qIDY0L0wgKi8KKyAgRkRLX0FTU0VSVChMICUgNCA9PSAwKTsKKyAgZGN0X2dldFRhYmxlcyhOVUxMLCAmc2luX3R3aWRkbGUsICZpbmMsIEwpOworICBpbmMgPj49IDE7CiAKICAgRklYUF9EQkwgKnBUbXBfMCA9ICZ0bXBbMl07Ci0gIEZJWFBfREJMICpwVG1wXzEgPSAmdG1wWyhNLTEpKjJdOworICBGSVhQX0RCTCAqcFRtcF8xID0gJnRtcFsoTSAtIDEpICogMl07CiAKLSAgZm9yKGk9MTsgaTxNPj4xOyBpKysscFRtcF8wKz0yLHBUbXBfMS09MikgeworICBpbmRleCA9IDQgKiBpbmM7CiAKLSAgICBGSVhQX0RCTCBhY2N1MyxhY2N1NCxhY2N1NSxhY2N1NjsKKyAgLyogVGhpcyBsb29wIHBlcmZvcm1zIG11bHRpcGxpY2F0aW9uIGZvciBpbmRleCBpIChpKmluYykgKi8KKyAgZm9yIChpID0gMTsgaTxNPj4gMTsgaSsrLCBwVG1wXzAgKz0gMiwgcFRtcF8xIC09IDIpIHsKKyAgICBGSVhQX0RCTCBhY2N1MywgYWNjdTQsIGFjY3U1LCBhY2N1NjsKIAotICAgIGNwbHhNdWx0RGl2MigmYWNjdTIsICZhY2N1MSwgcERhdFtMIC0gaV0sIHBEYXRbaV0sIHNpbl90d2lkZGxlX0w2NFtpKmluY10pOwotICAgIGNwbHhNdWx0RGl2MigmYWNjdTQsICZhY2N1MywgcERhdFtNK2ldLCBwRGF0W00taV0sIHNpbl90d2lkZGxlX0w2NFsoTS1pKSppbmNdKTsKLSAgICBhY2N1MyA+Pj0gMTsgYWNjdTQgPj49IDE7CisgICAgY3BseE11bHREaXYyKCZhY2N1MiwgJmFjY3UxLCBwRGF0W0wgLSBpXSwgcERhdFtpXSwgc2luX3R3aWRkbGVbaSAqIGluY10pOworICAgIGNwbHhNdWx0RGl2MigmYWNjdTQsICZhY2N1MywgcERhdFtNICsgaV0sIHBEYXRbTSAtIGldLAorICAgICAgICAgICAgICAgICBzaW5fdHdpZGRsZVsoTSAtIGkpICogaW5jXSk7CisgICAgYWNjdTMgPj49IDE7CisgICAgYWNjdTQgPj49IDE7CiAKLSAgICAvKiBUaGlzIG1ldGhvZCBpcyBiZXR0ZXIgZm9yIEFSTTkyNiwgdGhhdCB1c2VzIG9wZXJhbmQyIHNoaWZ0ZWQgcmlnaHQgYnkgMSBhbHdheXMgKi8KLSAgICBjcGx4TXVsdERpdjIoJmFjY3U2LCAmYWNjdTUsIChhY2N1MyAtIChhY2N1MT4+MSkpLCAoKGFjY3UyPj4xKSArIGFjY3U0KSwgc2luX3R3aWRkbGVfTDY0Wyg0KmkpKmluY10pOwotICAgIHhyID0gKGFjY3UxPj4xKSArIGFjY3UzOwotICAgIHBUbXBfMFswXSA9ICh4cj4+MSkgLSBhY2N1NTsKLSAgICBwVG1wXzFbMF0gPSAoeHI+PjEpICsgYWNjdTU7CisgICAgLyogVGhpcyBtZXRob2QgaXMgYmV0dGVyIGZvciBBUk05MjYsIHRoYXQgdXNlcyBvcGVyYW5kMiBzaGlmdGVkIHJpZ2h0IGJ5IDEKKyAgICAgKiBhbHdheXMgKi8KKyAgICBpZiAoMiAqIGkgPCAoTSAvIDIpKSB7CisgICAgICBjcGx4TXVsdERpdjIoJmFjY3U2LCAmYWNjdTUsIChhY2N1MyAtIChhY2N1MSA+PiAxKSksCisgICAgICAgICAgICAgICAgICAgKChhY2N1MiA+PiAxKSArIGFjY3U0KSwgc2luX3R3aWRkbGVbaW5kZXhdKTsKKyAgICB9IGVsc2UgeworICAgICAgY3BseE11bHREaXYyKCZhY2N1NiwgJmFjY3U1LCAoKGFjY3UyID4+IDEpICsgYWNjdTQpLAorICAgICAgICAgICAgICAgICAgIChhY2N1MyAtIChhY2N1MSA+PiAxKSksIHNpbl90d2lkZGxlW2luZGV4XSk7CisgICAgICBhY2N1NiA9IC1hY2N1NjsKKyAgICB9CisgICAgeHIgPSAoYWNjdTEgPj4gMSkgKyBhY2N1MzsKKyAgICBwVG1wXzBbMF0gPSAoeHIgPj4gMSkgLSBhY2N1NTsKKyAgICBwVG1wXzFbMF0gPSAoeHIgPj4gMSkgKyBhY2N1NTsKIAotICAgIHhyID0gKGFjY3UyPj4xKSAtIGFjY3U0OwotICAgIHBUbXBfMFsxXSA9ICAoeHI+PjEpIC0gYWNjdTY7Ci0gICAgcFRtcF8xWzFdID0gLSgoeHI+PjEpICsgYWNjdTYpOworICAgIHhyID0gKGFjY3UyID4+IDEpIC0gYWNjdTQ7CisgICAgcFRtcF8wWzFdID0gKHhyID4+IDEpIC0gYWNjdTY7CisgICAgcFRtcF8xWzFdID0gLSgoeHIgPj4gMSkgKyBhY2N1Nik7CiAKKyAgICAvKiBDcmVhdGUgaW5kZXggaGVscGVyIHZhcmlhYmxlcyBmb3IgKDQqaSkqaW5jIGluZGV4ZWQgZXF1aXZhbGVudCB2YWx1ZXMgb2YKKyAgICAgKiBzaG9ydCB0YWJsZXMuICovCisgICAgaWYgKDIgKiBpIDwgKChNIC8gMikgLSAxKSkgeworICAgICAgaW5kZXggKz0gNCAqIGluYzsKKyAgICB9IGVsc2UgaWYgKDIgKiBpID49ICgoTSAvIDIpKSkgeworICAgICAgaW5kZXggLT0gNCAqIGluYzsKKyAgICB9CiAgIH0KIAotICB4ciAgICAgPSBmTXVsdERpdjIocERhdFtNXSwgc2luX3R3aWRkbGVfTDY0WzY0LzJdLnYucmUgKTsvKiBjb3MoKFBJLygyKkwpKSpNKTsgKi8KLSAgdG1wWzBdID0gKChwRGF0WzBdPj4xKSArIHhyKT4+MTsKLSAgdG1wWzFdID0gKChwRGF0WzBdPj4xKSAtIHhyKT4+MTsKKyAgeHIgPSBmTXVsdERpdjIocERhdFtNXSwgc2luX3R3aWRkbGVbTSAqIGluY10udi5yZSk7IC8qIGNvcygoUEkvKDIqTCkpKk0pOyAqLworICB0bXBbMF0gPSAoKHBEYXRbMF0gPj4gMSkgKyB4cikgPj4gMTsKKyAgdG1wWzFdID0gKChwRGF0WzBdID4+IDEpIC0geHIpID4+IDE7CiAKLSAgY3BseE11bHREaXYyKCZhY2N1MiwgJmFjY3UxLCBwRGF0W0wgLSAoTS8yKV0sIHBEYXRbTS8yXSwgc2luX3R3aWRkbGVfTDY0WzY0LzRdKTsKLSAgdG1wW01dICAgPSBhY2N1MT4+MTsKLSAgdG1wW00rMV0gPSBhY2N1Mj4+MTsKKyAgY3BseE11bHREaXYyKCZhY2N1MiwgJmFjY3UxLCBwRGF0W0wgLSAoTSAvIDIpXSwgcERhdFtNIC8gMl0sCisgICAgICAgICAgICAgICBzaW5fdHdpZGRsZVtNICogaW5jIC8gMl0pOworICB0bXBbTV0gPSBhY2N1MSA+PiAxOworICB0bXBbTSArIDFdID0gYWNjdTIgPj4gMTsKIAogICAvKiBkaXRfZmZ0IGV4cGVjdHMgMSBiaXQgc2NhbGVkIGlucHV0IHZhbHVlcyAqLwogICBmZnQoTSwgdG1wLCBwRGF0X2UpOwogCiAgIC8qIEFSTTkyNjogMTIgY3ljbGVzIHBlciAyLWl0ZXJhdGlvbiwgbm8gb3ZlcmhlYWQgY29kZSBieSBjb21waWxlciAqLwogICBwVG1wXzEgPSAmdG1wW0xdOwotICBmb3IgKGkgPSBNPj4xOyBpLS07KQotICB7CisgIGZvciAoaSA9IE0gPj4gMTsgaS0tOykgewogICAgIEZJWFBfREJMIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7CiAgICAgdG1wMSA9ICp0bXArKzsKICAgICB0bXAyID0gKnRtcCsrOwpAQCAtMTgwLDEzMSArMjYwLDEyMSBAQAogCiAgICpwRGF0X2UgKz0gMjsKIH0KKwordm9pZCBkc3RfSUlJKEZJWFBfREJMICpwRGF0LCAvKiE8IHBvaW50ZXIgdG8gaW5wdXQvb3V0cHV0ICovCisgICAgICAgICAgICAgRklYUF9EQkwgKnRtcCwgIC8qITwgcG9pbnRlciB0byB0ZW1wb3JhbCB3b3JraW5nIGJ1ZmZlciAqLworICAgICAgICAgICAgIGludCBMLCAgICAgICAgICAvKiE8IGxlbmdodCBvZiB0cmFuc2Zvcm0gKi8KKyAgICAgICAgICAgICBpbnQgKnBEYXRfZSkgeworICBpbnQgTDIgPSBMID4+IDE7CisgIGludCBpOworICBGSVhQX0RCTCB0OworCisgIC8qIG5vdGU6IERDVCBJSUkgaXMgcmV1c2VkIGhlcmUsIGRpcmVjdCBEU1QgSUlJIGltcGxlbWVudGF0aW9uIG1pZ2h0IGJlIG1vcmUKKyAgICogZWZmaWNpZW50ICovCisKKyAgLyogbWlycm9yIGlucHV0ICovCisgIGZvciAoaSA9IDA7IGkgPCBMMjsgaSsrKSB7CisgICAgdCA9IHBEYXRbaV07CisgICAgcERhdFtpXSA9IHBEYXRbTCAtIDEgLSBpXTsKKyAgICBwRGF0W0wgLSAxIC0gaV0gPSB0OworICB9CisKKyAgLyogRENULUlJSSAqLworICBkY3RfSUlJKHBEYXQsIHRtcCwgTCwgcERhdF9lKTsKKworICAvKiBmbGlwIHNpZ25zIGF0IG9kZCBpbmRpY2VzICovCisgIGZvciAoaSA9IDE7IGkgPCBMOyBpICs9IDIpIHBEYXRbaV0gPSAtcERhdFtpXTsKK30KKwogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9kY3RfSUkpCi12b2lkIGRjdF9JSShGSVhQX0RCTCAqcERhdCwgLyohPCBwb2ludGVyIHRvIGlucHV0L291dHB1dCAqLwotICAgICAgICAgICAgRklYUF9EQkwgKnRtcCwgIC8qITwgcG9pbnRlciB0byB0ZW1wb3JhbCB3b3JraW5nIGJ1ZmZlciAqLwotICAgICAgICAgICAgaW50IEwsICAgICAgICAgIC8qITwgbGVuZ2h0IG9mIHRyYW5zZm9ybSAqLwotICAgICAgICAgICAgaW50ICpwRGF0X2UKLSAgICAgICAgICAgICkKLXsKLSAgICBGREtfQVNTRVJUKEwgPT0gNjQgfHwgTCA9PSAzMik7Ci0gICAgRklYUF9EQkwgYWNjdTEsYWNjdTI7Ci0gICAgRklYUF9EQkwgKnBUbXBfMCwgKnBUbXBfMTsKK3ZvaWQgZGN0X0lJKAorICAgIEZJWFBfREJMICpwRGF0LCAvKiE8IHBvaW50ZXIgdG8gaW5wdXQvb3V0cHV0ICovCisgICAgRklYUF9EQkwgKnRtcCwgIC8qITwgcG9pbnRlciB0byB0ZW1wb3JhbCB3b3JraW5nIGJ1ZmZlciAqLworICAgIGludCBMLCAvKiE8IGxlbmdodCBvZiB0cmFuc2Zvcm0gKGhhcyB0byBiZSBhIG11bHRpcGxlIG9mIDggKG9yIDQgaW4gY2FzZQorICAgICAgICAgICAgICBEQ1RfSUlfTF9NVUxUSVBMRV9PRl80X1NVUFBPUlQgaXMgZGVmaW5lZCkgKi8KKyAgICBpbnQgKnBEYXRfZSkgeworICBjb25zdCBGSVhQX1dUUCAqc2luX3R3aWRkbGU7CisgIEZJWFBfREJMIGFjY3UxLCBhY2N1MjsKKyAgRklYUF9EQkwgKnBUbXBfMCwgKnBUbXBfMTsKIAotICAgIGludCBpOwotICAgIGludCBpbmM7Ci0gICAgaW50IE0gPSAgTD4+MTsKLSAgICBpbnQgbGRfTTsKKyAgaW50IGk7CisgIGludCBpbmMsIGluZGV4ID0gMDsKKyAgaW50IE0gPSBMID4+IDE7CiAKLSAgICBGREtfQVNTRVJUKEwgPT0gNjQgfHwgTCA9PSAzMik7Ci0gICAgbGRfTSA9IDQgKyAoTCA+PiA2KTsgIC8qIEw9NjQ6IDUsICBMPTMyOiA0ICovCisgIEZES19BU1NFUlQoTCAlIDQgPT0gMCk7CisgIGRjdF9nZXRUYWJsZXMoTlVMTCwgJnNpbl90d2lkZGxlLCAmaW5jLCBMKTsKKyAgaW5jID4+PSAxOwogCi0gICAgaW5jID0gKDY0LzIpID4+IGxkX007IC8qIEw9NjQ6IDEsICBMPTMyOiAyICovCisgIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTTsgaSsrKSB7CisgICAgICB0bXBbaV0gPSBwRGF0WzIgKiBpXSA+PiAxOyAvKiBkaXRfZmZ0IGV4cGVjdHMgMSBiaXQgc2NhbGVkIGlucHV0IHZhbHVlcyAqLworICAgICAgdG1wW0wgLSAxIC0gaV0gPQorICAgICAgICAgIHBEYXRbMiAqIGkgKyAxXSA+PiAxOyAvKiBkaXRfZmZ0IGV4cGVjdHMgMSBiaXQgc2NhbGVkIGlucHV0IHZhbHVlcyAqLworICAgIH0KKyAgfQogCi0gICAgRklYUF9EQkwgKnBkYXQgID0gJnBEYXRbMF07CisgIGZmdChNLCB0bXAsIHBEYXRfZSk7CisKKyAgcFRtcF8wID0gJnRtcFsyXTsKKyAgcFRtcF8xID0gJnRtcFsoTSAtIDEpICogMl07CisKKyAgaW5kZXggPSBpbmMgKiA0OworCisgIGZvciAoaSA9IDE7IGk8TT4+IDE7IGkrKywgcFRtcF8wICs9IDIsIHBUbXBfMSAtPSAyKSB7CisgICAgRklYUF9EQkwgYTEsIGEyOwogICAgIEZJWFBfREJMIGFjY3UzLCBhY2N1NDsKLSAgICBwVG1wXzAgPSAmdG1wWzBdOwotICAgIHBUbXBfMSA9ICZ0bXBbTC0xXTsKLSAgICBmb3IgKGkgPSBNPj4xOyBpLS07ICkKLSAgICB7Ci0gICAgICBhY2N1MSA9ICpwZGF0Kys7Ci0gICAgICBhY2N1MiA9ICpwZGF0Kys7Ci0gICAgICBhY2N1MyA9ICpwZGF0Kys7Ci0gICAgICBhY2N1NCA9ICpwZGF0Kys7Ci0gICAgICBhY2N1MSA+Pj0gMTsKLSAgICAgIGFjY3UyID4+PSAxOwotICAgICAgYWNjdTMgPj49IDE7Ci0gICAgICBhY2N1NCA+Pj0gMTsKLSAgICAgICpwVG1wXzArKyA9IGFjY3UxOwotICAgICAgKnBUbXBfMCsrID0gYWNjdTM7Ci0gICAgICAqcFRtcF8xLS0gPSBhY2N1MjsKLSAgICAgICpwVG1wXzEtLSA9IGFjY3U0OworCisgICAgYTEgPSAoKHBUbXBfMFsxXSA+PiAxKSArIChwVG1wXzFbMV0gPj4gMSkpOworICAgIGEyID0gKChwVG1wXzFbMF0gPj4gMSkgLSAocFRtcF8wWzBdID4+IDEpKTsKKworICAgIGlmICgyICogaSA8IChNIC8gMikpIHsKKyAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgYTIsIGExLCBzaW5fdHdpZGRsZVtpbmRleF0pOworICAgIH0gZWxzZSB7CisgICAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIGExLCBhMiwgc2luX3R3aWRkbGVbaW5kZXhdKTsKKyAgICAgIGFjY3UxID0gLWFjY3UxOwogICAgIH0KKyAgICBhY2N1MSA8PD0gMTsKKyAgICBhY2N1MiA8PD0gMTsKIAorICAgIGExID0gKChwVG1wXzBbMF0gPj4gMSkgKyAocFRtcF8xWzBdID4+IDEpKTsKKyAgICBhMiA9ICgocFRtcF8wWzFdID4+IDEpIC0gKHBUbXBfMVsxXSA+PiAxKSk7CiAKLSAgICBmZnQoTSwgdG1wLCBwRGF0X2UpOworICAgIGNwbHhNdWx0RGl2MigmYWNjdTMsICZhY2N1NCwgKGExICsgYWNjdTIpLCAtKGFjY3UxICsgYTIpLAorICAgICAgICAgICAgICAgICBzaW5fdHdpZGRsZVtpICogaW5jXSk7CisgICAgcERhdFtMIC0gaV0gPSBhY2N1NDsKKyAgICBwRGF0W2ldID0gYWNjdTM7CiAKLSAgICBwVG1wXzAgPSAmdG1wWzJdOwotICAgIHBUbXBfMSA9ICZ0bXBbKE0tMSkqMl07CisgICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCAoYTEgLSBhY2N1MiksIC0oYWNjdTEgLSBhMiksCisgICAgICAgICAgICAgICAgIHNpbl90d2lkZGxlWyhNIC0gaSkgKiBpbmNdKTsKKyAgICBwRGF0W00gKyBpXSA9IGFjY3U0OworICAgIHBEYXRbTSAtIGldID0gYWNjdTM7CiAKLSAgICBmb3IgKGk9MTsgaTxNPj4xOyBpKysscFRtcF8wKz0yLHBUbXBfMS09MikgewotCi0gICAgICBGSVhQX0RCTCBhMSxhMjsKLSAgICAgIEZJWFBfREJMIGFjY3UzLCBhY2N1NDsKLQotICAgICAgYTEgPSAoKHBUbXBfMFsxXT4+MSkgKyAocFRtcF8xWzFdPj4xKSk7Ci0gICAgICBhMiA9ICgocFRtcF8xWzBdPj4xKSAtIChwVG1wXzBbMF0+PjEpKTsKLQotICAgICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBhMiwgYTEsIHNpbl90d2lkZGxlX0w2NFsoNCppKSppbmNdKTsKLSAgICAgIGFjY3UxPDw9MTsgYWNjdTI8PD0xOwotCi0gICAgICBhMSA9ICgocFRtcF8wWzBdPj4xKSArIChwVG1wXzFbMF0+PjEpKTsKLSAgICAgIGEyID0gKChwVG1wXzBbMV0+PjEpIC0gKHBUbXBfMVsxXT4+MSkpOwotCi0gICAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIChhMSArIGFjY3UyKSwgLShhY2N1MSArIGEyKSwgc2luX3R3aWRkbGVfTDY0W2kqaW5jXSk7Ci0gICAgICBwRGF0W0wgLSBpXSA9IGFjY3U0OwotICAgICAgcERhdFtpXSAgICAgPSBhY2N1MzsKLQotICAgICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCAoYTEgLSBhY2N1MiksIC0oYWNjdTEgLSBhMiksIHNpbl90d2lkZGxlX0w2NFsoTS1pKSppbmNdKTsKLSAgICAgIHBEYXRbTSArIGldID0gYWNjdTQ7Ci0gICAgICBwRGF0W00gLSBpXSA9IGFjY3UzOwotCisgICAgLyogQ3JlYXRlIGluZGV4IGhlbHBlciB2YXJpYWJsZXMgZm9yICg0KmkpKmluYyBpbmRleGVkIGVxdWl2YWxlbnQgdmFsdWVzIG9mCisgICAgICogc2hvcnQgdGFibGVzLiAqLworICAgIGlmICgyICogaSA8ICgoTSAvIDIpIC0gMSkpIHsKKyAgICAgIGluZGV4ICs9IDQgKiBpbmM7CisgICAgfSBlbHNlIGlmICgyICogaSA+PSAoKE0gLyAyKSkpIHsKKyAgICAgIGluZGV4IC09IDQgKiBpbmM7CiAgICAgfQorICB9CiAKLSAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIHRtcFtNXSwgdG1wW00rMV0sIHNpbl90d2lkZGxlX0w2NFsoTS8yKSppbmNdKTsKLSAgICBwRGF0W0wgLSAoTS8yKV0gPSBhY2N1MjsKLSAgICBwRGF0W00vMl0gICAgICAgPSBhY2N1MTsKKyAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCB0bXBbTV0sIHRtcFtNICsgMV0sIHNpbl90d2lkZGxlWyhNIC8gMikgKiBpbmNdKTsKKyAgcERhdFtMIC0gKE0gLyAyKV0gPSBhY2N1MjsKKyAgcERhdFtNIC8gMl0gPSBhY2N1MTsKIAotICAgIHBEYXRbMF0gPSAodG1wWzBdPj4xKSsodG1wWzFdPj4xKTsKLSAgICBwRGF0W01dID0gIGZNdWx0KCgodG1wWzBdPj4xKS0odG1wWzFdPj4xKSksIHNpbl90d2lkZGxlX0w2NFs2NC8yXS52LnJlKTsvKiBjb3MoKFBJLygyKkwpKSpNKTsgKi8KKyAgcERhdFswXSA9ICh0bXBbMF0gPj4gMSkgKyAodG1wWzFdID4+IDEpOworICBwRGF0W01dID0gZk11bHQoKCh0bXBbMF0gPj4gMSkgLSAodG1wWzFdID4+IDEpKSwKKyAgICAgICAgICAgICAgICAgIHNpbl90d2lkZGxlW00gKiBpbmNdLnYucmUpOyAvKiBjb3MoKFBJLygyKkwpKSpNKTsgKi8KIAotICAgICpwRGF0X2UgKz0gMjsKKyAgKnBEYXRfZSArPSAyOwogfQogI2VuZGlmCiAKLXN0YXRpYwotdm9pZCBnZXRUYWJsZXMoY29uc3QgRklYUF9XVFAgKip0d2lkZGxlLCBjb25zdCBGSVhQX1NUUCAqKnNpbl90d2lkZGxlLCBpbnQgKnNpbl9zdGVwLCBpbnQgbGVuZ3RoKQotewotICBpbnQgbGQyX2xlbmd0aDsKLQotIC8qIEdldCBsZDIgb2YgbGVuZ3RoIC0gMiArIDEKLSAgICAgLTI6IGJlY2F1c2UgZmlyc3QgdGFibGUgZW50cnkgaXMgd2luZG93IG9mIHNpemUgNAotICAgICArMTogYmVjYXVzZSB3ZSBhbHJlYWR5IGluY2x1ZGUgKzEgYmVjYXVzZSBvZiBjZWlsKGxvZzIobGVuZ3RoKSkgKi8KLSAgbGQyX2xlbmd0aCA9IERGUkFDVF9CSVRTLTEtZk5vcm16KChGSVhQX0RCTClsZW5ndGgpIC0gMTsKLQotICAvKiBFeHRyYWN0IHNvcnQgb2YgImVpZ2VudmFsdWUiICh0aGUgNCBsZWZ0IG1vc3QgYml0cykgb2YgbGVuZ3RoLiAqLwotICBzd2l0Y2ggKCAobGVuZ3RoKSA+PiAobGQyX2xlbmd0aC0xKSApIHsKLSAgICBjYXNlIDB4NDogLyogcmFkaXggMiAqLwotICAgICAgKnNpbl90d2lkZGxlID0gU2luZVRhYmxlNTEyOwotICAgICAgKnNpbl9zdGVwID0gMTw8KDkgLSBsZDJfbGVuZ3RoKTsKLSAgICAgICp0d2lkZGxlID0gd2luZG93U2xvcGVzWzBdWzBdW2xkMl9sZW5ndGgtMV07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4NzogLyogMTAgbXMgKi8KLSAgICAgICpzaW5fdHdpZGRsZSA9IFNpbmVUYWJsZTQ4MDsKLSAgICAgICpzaW5fc3RlcCA9IDE8PCg4IC0gbGQyX2xlbmd0aCk7Ci0gICAgICAqdHdpZGRsZSA9IHdpbmRvd1Nsb3Blc1swXVsxXVtsZDJfbGVuZ3RoXTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2luX3R3aWRkbGUgPSBOVUxMOwotICAgICAgKnNpbl9zdGVwID0gMDsKLSAgICAgICp0d2lkZGxlID0gTlVMTDsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgRkRLX0FTU0VSVCgqdHdpZGRsZSAhPSBOVUxMKTsKLQotICBGREtfQVNTRVJUKCpzaW5fc3RlcCA+IDApOwotCi19Ci0KICNpZiAhZGVmaW5lZChGVU5DVElPTl9kY3RfSVYpCiAKLXZvaWQgZGN0X0lWKEZJWFBfREJMICpwRGF0LAotICAgICAgICAgICAgaW50IEwsCi0gICAgICAgICAgICBpbnQgKnBEYXRfZSkKLXsKK3ZvaWQgZGN0X0lWKEZJWFBfREJMICpwRGF0LCBpbnQgTCwgaW50ICpwRGF0X2UpIHsKICAgaW50IHNpbl9zdGVwID0gMDsKICAgaW50IE0gPSBMID4+IDE7CiAKQEAgLTMxMywxMiArMzgzLDE0IEBACiAKICAgRkRLX0FTU0VSVChMID49IDQpOwogCi0gIGdldFRhYmxlcygmdHdpZGRsZSwgJnNpbl90d2lkZGxlLCAmc2luX3N0ZXAsIEwpOworICBGREtfQVNTRVJUKEwgPj0gNCk7CisKKyAgZGN0X2dldFRhYmxlcygmdHdpZGRsZSwgJnNpbl90d2lkZGxlLCAmc2luX3N0ZXAsIEwpOwogCiAjaWZkZWYgRlVOQ1RJT05fZGN0X0lWX2Z1bmMxCi0gIGlmIChNPj00ICYmIChNJjMpID09IDApIHsKLSAgICAgLyogQVJNOTI2OiA0NCBjeWNsZXMgZm9yIDIgaXRlcmF0aW9ucyA9IDIyIGN5Y2xlcy9pdGVyYXRpb24gKi8KLSAgICBkY3RfSVZfZnVuYzEoTT4+MiwgdHdpZGRsZSwgICZwRGF0WzBdLCAmcERhdFtMLTFdKTsKKyAgaWYgKE0gPj0gNCAmJiAoTSAmIDMpID09IDApIHsKKyAgICAvKiBBUk05MjY6IDQ0IGN5Y2xlcyBmb3IgMiBpdGVyYXRpb25zID0gMjIgY3ljbGVzL2l0ZXJhdGlvbiAqLworICAgIGRjdF9JVl9mdW5jMShNID4+IDIsIHR3aWRkbGUsICZwRGF0WzBdLCAmcERhdFtMIC0gMV0pOwogICB9IGVsc2UKICNlbmRpZiAvKiBGVU5DVElPTl9kY3RfSVZfZnVuYzEgKi8KICAgewpAQCAtMzI3LDYzICszOTksNjUgQEAKICAgICBpbnQgaTsKIAogICAgIC8qIDI5IGN5Y2xlcyBvbiBBUk05MjYgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgTS0xOyBpKz0yLHBEYXRfMCs9MixwRGF0XzEtPTIpCi0gICAgewotICAgICAgRklYUF9EQkwgYWNjdTEsYWNjdTIsYWNjdTMsYWNjdTQ7CisgICAgZm9yIChpID0gMDsgaSA8IE0gLSAxOyBpICs9IDIsIHBEYXRfMCArPSAyLCBwRGF0XzEgLT0gMikgeworICAgICAgRklYUF9EQkwgYWNjdTEsIGFjY3UyLCBhY2N1MywgYWNjdTQ7CiAKLSAgICAgIGFjY3UxID0gcERhdF8xWzFdOyBhY2N1MiA9IHBEYXRfMFswXTsKLSAgICAgIGFjY3UzID0gcERhdF8wWzFdOyBhY2N1NCA9IHBEYXRfMVswXTsKKyAgICAgIGFjY3UxID0gcERhdF8xWzFdOworICAgICAgYWNjdTIgPSBwRGF0XzBbMF07CisgICAgICBhY2N1MyA9IHBEYXRfMFsxXTsKKyAgICAgIGFjY3U0ID0gcERhdF8xWzBdOwogCiAgICAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIGFjY3UxLCBhY2N1MiwgdHdpZGRsZVtpXSk7Ci0gICAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIGFjY3U0LCBhY2N1MywgdHdpZGRsZVtpKzFdKTsKKyAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTMsICZhY2N1NCwgYWNjdTQsIGFjY3UzLCB0d2lkZGxlW2kgKyAxXSk7CiAKLSAgICAgIHBEYXRfMFswXSA9IGFjY3UyOyBwRGF0XzBbMV0gPSBhY2N1MTsKLSAgICAgIHBEYXRfMVswXSA9IGFjY3U0OyBwRGF0XzFbMV0gPSAtYWNjdTM7CisgICAgICBwRGF0XzBbMF0gPSBhY2N1MjsKKyAgICAgIHBEYXRfMFsxXSA9IGFjY3UxOworICAgICAgcERhdF8xWzBdID0gYWNjdTQ7CisgICAgICBwRGF0XzFbMV0gPSAtYWNjdTM7CiAgICAgfQotICAgIGlmIChNJjEpCi0gICAgewotICAgICAgRklYUF9EQkwgYWNjdTEsYWNjdTI7CisgICAgaWYgKE0gJiAxKSB7CisgICAgICBGSVhQX0RCTCBhY2N1MSwgYWNjdTI7CiAKLSAgICAgIGFjY3UxID0gcERhdF8xWzFdOyBhY2N1MiA9IHBEYXRfMFswXTsKKyAgICAgIGFjY3UxID0gcERhdF8xWzFdOworICAgICAgYWNjdTIgPSBwRGF0XzBbMF07CiAKICAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTEsICZhY2N1MiwgYWNjdTEsIGFjY3UyLCB0d2lkZGxlW2ldKTsKIAotICAgICAgcERhdF8wWzBdID0gYWNjdTI7IHBEYXRfMFsxXSA9IGFjY3UxOworICAgICAgcERhdF8wWzBdID0gYWNjdTI7CisgICAgICBwRGF0XzBbMV0gPSBhY2N1MTsKICAgICB9CiAgIH0KIAogICBmZnQoTSwgcERhdCwgcERhdF9lKTsKIAogI2lmZGVmIEZVTkNUSU9OX2RjdF9JVl9mdW5jMgotICBpZiAoTT49NCAmJiAoTSYzKSA9PSAwKSB7Ci0gICAgIC8qIEFSTTkyNjogNDIgY3ljbGVzIGZvciAyIGl0ZXJhdGlvbnMgPSAyMSBjeWNsZXMvaXRlcmF0aW9uICovCi0gICAgZGN0X0lWX2Z1bmMyKE0+PjIsIHNpbl90d2lkZGxlLCAmcERhdFswXSwgJnBEYXRbTF0sIHNpbl9zdGVwKTsKKyAgaWYgKE0gPj0gNCAmJiAoTSAmIDMpID09IDApIHsKKyAgICAvKiBBUk05MjY6IDQyIGN5Y2xlcyBmb3IgMiBpdGVyYXRpb25zID0gMjEgY3ljbGVzL2l0ZXJhdGlvbiAqLworICAgIGRjdF9JVl9mdW5jMihNID4+IDIsIHNpbl90d2lkZGxlLCAmcERhdFswXSwgJnBEYXRbTF0sIHNpbl9zdGVwKTsKICAgfSBlbHNlCiAjZW5kaWYgLyogRlVOQ1RJT05fZGN0X0lWX2Z1bmMyICovCiAgIHsKICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdF8wID0gJnBEYXRbMF07CiAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEYXRfMSA9ICZwRGF0W0wgLSAyXTsKLSAgICBGSVhQX0RCTCBhY2N1MSxhY2N1MixhY2N1MyxhY2N1NDsKKyAgICBGSVhQX0RCTCBhY2N1MSwgYWNjdTIsIGFjY3UzLCBhY2N1NDsKICAgICBpbnQgaWR4LCBpOwogCiAgICAgLyogU2luIGFuZCBDb3MgdmFsdWVzIGFyZSAwLjBmIGFuZCAxLjBmICovCiAgICAgYWNjdTEgPSBwRGF0XzFbMF07CiAgICAgYWNjdTIgPSBwRGF0XzFbMV07CiAKLSAgICBwRGF0XzFbMV0gPSAtKHBEYXRfMFsxXT4+MSk7Ci0gICAgcERhdF8wWzBdID0gKHBEYXRfMFswXT4+MSk7Ci0KKyAgICBwRGF0XzFbMV0gPSAtKHBEYXRfMFsxXSA+PiAxKTsKKyAgICBwRGF0XzBbMF0gPSAocERhdF8wWzBdID4+IDEpOwogCiAgICAgLyogMjggY3ljbGVzIGZvciBBUk05MjYgKi8KLSAgICBmb3IgKGlkeCA9IHNpbl9zdGVwLGk9MTsgaTwoTSsxKT4+MTsgaSsrLCBpZHgrPXNpbl9zdGVwKQotICAgIHsKKyAgICBmb3IgKGlkeCA9IHNpbl9zdGVwLCBpID0gMTsgaTwoTSArIDEpPj4gMTsgaSsrLCBpZHggKz0gc2luX3N0ZXApIHsKICAgICAgIEZJWFBfU1RQIHR3ZCA9IHNpbl90d2lkZGxlW2lkeF07CiAgICAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIGFjY3UxLCBhY2N1MiwgdHdkKTsKLSAgICAgIHBEYXRfMFsxXSA9ICBhY2N1MzsKLSAgICAgIHBEYXRfMVswXSA9ICBhY2N1NDsKKyAgICAgIHBEYXRfMFsxXSA9IGFjY3UzOworICAgICAgcERhdF8xWzBdID0gYWNjdTQ7CiAKLSAgICAgIHBEYXRfMCs9MjsKLSAgICAgIHBEYXRfMS09MjsKKyAgICAgIHBEYXRfMCArPSAyOworICAgICAgcERhdF8xIC09IDI7CiAKICAgICAgIGNwbHhNdWx0RGl2MigmYWNjdTMsICZhY2N1NCwgcERhdF8wWzFdLCBwRGF0XzBbMF0sIHR3ZCk7CiAKQEAgLTM5MSwxMSArNDY1LDEwIEBACiAgICAgICBhY2N1MiA9IHBEYXRfMVsxXTsKIAogICAgICAgcERhdF8xWzFdID0gLWFjY3UzOwotICAgICAgcERhdF8wWzBdID0gIGFjY3U0OworICAgICAgcERhdF8wWzBdID0gYWNjdTQ7CiAgICAgfQogCi0gICAgaWYgKCAoTSYxKSA9PSAwICkKLSAgICB7CisgICAgaWYgKChNICYgMSkgPT0gMCkgewogICAgICAgLyogTGFzdCBTaW4gYW5kIENvcyB2YWx1ZSBwYWlyIGFyZSB0aGUgc2FtZSAqLwogICAgICAgYWNjdTEgPSBmTXVsdERpdjIoYWNjdTEsIFdUQygweDVhODI3OTlhKSk7CiAgICAgICBhY2N1MiA9IGZNdWx0RGl2MihhY2N1MiwgV1RDKDB4NWE4Mjc5OWEpKTsKQEAgLTQxMSw4NCArNDg0LDcxIEBACiAjZW5kaWYgLyogZGVmaW5lZCAoRlVOQ1RJT05fZGN0X0lWKSAqLwogCiAjaWYgIWRlZmluZWQoRlVOQ1RJT05fZHN0X0lWKQotdm9pZCBkc3RfSVYoRklYUF9EQkwgKnBEYXQsCi0gICAgICAgICAgICBpbnQgTCwKLSAgICAgICAgICAgIGludCAqcERhdF9lICkKLXsKK3ZvaWQgZHN0X0lWKEZJWFBfREJMICpwRGF0LCBpbnQgTCwgaW50ICpwRGF0X2UpIHsKICAgaW50IHNpbl9zdGVwID0gMDsKICAgaW50IE0gPSBMID4+IDE7CiAKICAgY29uc3QgRklYUF9XVFAgKnR3aWRkbGU7CiAgIGNvbnN0IEZJWFBfU1RQICpzaW5fdHdpZGRsZTsKIAotI2lmZGVmIERTVElWMl9FTkFCTEUKLSAgaWYgKEwgPT0gMikgewotICAgIGNvbnN0IEZJWFBfU1RQIHRhYiA9IFNUQ1AoMHg3NjQxQUYzRCwgMHgzMEZCOTQ1Mik7Ci0gICAgRklYUF9EQkwgdG1wMSwgdG1wMjsKLQotICAgIGNwbHhNdWx0RGl2MigmdG1wMiwgJnRtcDEsIHBEYXRbMF0sIHBEYXRbMV0sIHRhYik7Ci0KLSAgICBwRGF0WzBdID0gdG1wMTsKLSAgICBwRGF0WzFdID0gdG1wMjsKLQotICAgICpwRGF0X2UgKz0gMTsKLQotICAgIHJldHVybjsKLSAgfQotI2Vsc2UKICAgRkRLX0FTU0VSVChMID49IDQpOwotI2VuZGlmCiAKLSAgZ2V0VGFibGVzKCZ0d2lkZGxlLCAmc2luX3R3aWRkbGUsICZzaW5fc3RlcCwgTCk7CisgIEZES19BU1NFUlQoTCA+PSA0KTsKKworICBkY3RfZ2V0VGFibGVzKCZ0d2lkZGxlLCAmc2luX3R3aWRkbGUsICZzaW5fc3RlcCwgTCk7CiAKICNpZmRlZiBGVU5DVElPTl9kc3RfSVZfZnVuYzEKLSAgaWYgKCAoTT49NCkgJiYgKChNJjMpID09IDApICkgeworICBpZiAoKE0gPj0gNCkgJiYgKChNICYgMykgPT0gMCkpIHsKICAgICBkc3RfSVZfZnVuYzEoTSwgdHdpZGRsZSwgJnBEYXRbMF0sICZwRGF0W0xdKTsKICAgfSBlbHNlCiAjZW5kaWYKICAgewogICAgIEZJWFBfREJMICpSRVNUUklDVCBwRGF0XzAgPSAmcERhdFswXTsKICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdF8xID0gJnBEYXRbTCAtIDJdOwotCiAgICAgaW50IGk7CiAKICAgICAvKiAzNCBjeWNsZXMgb24gQVJNOTI2ICovCi0gICAgZm9yIChpID0gMDsgaSA8IE0tMTsgaSs9MixwRGF0XzArPTIscERhdF8xLT0yKQotICAgIHsKLSAgICAgIEZJWFBfREJMIGFjY3UxLGFjY3UyLGFjY3UzLGFjY3U0OworICAgIGZvciAoaSA9IDA7IGkgPCBNIC0gMTsgaSArPSAyLCBwRGF0XzAgKz0gMiwgcERhdF8xIC09IDIpIHsKKyAgICAgIEZJWFBfREJMIGFjY3UxLCBhY2N1MiwgYWNjdTMsIGFjY3U0OwogCi0gICAgICBhY2N1MSA9ICBwRGF0XzFbMV07IGFjY3UyID0gLXBEYXRfMFswXTsKLSAgICAgIGFjY3UzID0gIHBEYXRfMFsxXTsgYWNjdTQgPSAtcERhdF8xWzBdOworICAgICAgYWNjdTEgPSBwRGF0XzFbMV07CisgICAgICBhY2N1MiA9IC1wRGF0XzBbMF07CisgICAgICBhY2N1MyA9IHBEYXRfMFsxXTsKKyAgICAgIGFjY3U0ID0gLXBEYXRfMVswXTsKIAogICAgICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBhY2N1MSwgYWNjdTIsIHR3aWRkbGVbaV0pOwotICAgICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCBhY2N1NCwgYWNjdTMsIHR3aWRkbGVbaSsxXSk7CisgICAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIGFjY3U0LCBhY2N1MywgdHdpZGRsZVtpICsgMV0pOwogCi0gICAgICBwRGF0XzBbMF0gPSBhY2N1MjsgcERhdF8wWzFdID0gYWNjdTE7Ci0gICAgICBwRGF0XzFbMF0gPSBhY2N1NDsgcERhdF8xWzFdID0gLWFjY3UzOworICAgICAgcERhdF8wWzBdID0gYWNjdTI7CisgICAgICBwRGF0XzBbMV0gPSBhY2N1MTsKKyAgICAgIHBEYXRfMVswXSA9IGFjY3U0OworICAgICAgcERhdF8xWzFdID0gLWFjY3UzOwogICAgIH0KLSAgICBpZiAoTSYxKQotICAgIHsKLSAgICAgIEZJWFBfREJMIGFjY3UxLGFjY3UyOworICAgIGlmIChNICYgMSkgeworICAgICAgRklYUF9EQkwgYWNjdTEsIGFjY3UyOwogCi0gICAgICBhY2N1MSA9ICBwRGF0XzFbMV07IGFjY3UyID0gLXBEYXRfMFswXTsKKyAgICAgIGFjY3UxID0gcERhdF8xWzFdOworICAgICAgYWNjdTIgPSAtcERhdF8wWzBdOwogCiAgICAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIGFjY3UxLCBhY2N1MiwgdHdpZGRsZVtpXSk7CiAKLSAgICAgIHBEYXRfMFswXSA9IGFjY3UyOyBwRGF0XzBbMV0gPSBhY2N1MTsKKyAgICAgIHBEYXRfMFswXSA9IGFjY3UyOworICAgICAgcERhdF8wWzFdID0gYWNjdTE7CiAgICAgfQogICB9CiAKICAgZmZ0KE0sIHBEYXQsIHBEYXRfZSk7CiAKICNpZmRlZiBGVU5DVElPTl9kc3RfSVZfZnVuYzIKLSAgaWYgKCAoTT49NCkgJiYgKChNJjMpID09IDApICkgewotICAgIGRzdF9JVl9mdW5jMihNPj4yLCBzaW5fdHdpZGRsZSArIHNpbl9zdGVwLCAmcERhdFswXSwgJnBEYXRbTCAtIDFdLCBzaW5fc3RlcCk7CisgIGlmICgoTSA+PSA0KSAmJiAoKE0gJiAzKSA9PSAwKSkgeworICAgIGRzdF9JVl9mdW5jMihNID4+IDIsIHNpbl90d2lkZGxlICsgc2luX3N0ZXAsICZwRGF0WzBdLCAmcERhdFtMIC0gMV0sCisgICAgICAgICAgICAgICAgIHNpbl9zdGVwKTsKICAgfSBlbHNlCiAjZW5kaWYgLyogRlVOQ1RJT05fZHN0X0lWX2Z1bmMyICovCiAgIHsKICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdF8wOwogICAgIEZJWFBfREJMICpSRVNUUklDVCBwRGF0XzE7Ci0gICAgRklYUF9EQkwgYWNjdTEsYWNjdTIsYWNjdTMsYWNjdTQ7CisgICAgRklYUF9EQkwgYWNjdTEsIGFjY3UyLCBhY2N1MywgYWNjdTQ7CiAgICAgaW50IGlkeCwgaTsKIAogICAgIHBEYXRfMCA9ICZwRGF0WzBdOwpAQCAtNDk4LDM3ICs1NTgsMzUgQEAKICAgICBhY2N1MSA9IHBEYXRfMVswXTsKICAgICBhY2N1MiA9IHBEYXRfMVsxXTsKIAotICAgIHBEYXRfMVsxXSA9IC0ocERhdF8wWzBdPj4xKTsKLSAgICBwRGF0XzBbMF0gPSAocERhdF8wWzFdPj4xKTsKKyAgICBwRGF0XzFbMV0gPSAtKHBEYXRfMFswXSA+PiAxKTsKKyAgICBwRGF0XzBbMF0gPSAocERhdF8wWzFdID4+IDEpOwogCi0gICAgZm9yIChpZHggPSBzaW5fc3RlcCxpPTE7IGk8KE0rMSk+PjE7IGkrKywgaWR4Kz1zaW5fc3RlcCkKLSAgICB7CisgICAgZm9yIChpZHggPSBzaW5fc3RlcCwgaSA9IDE7IGk8KE0gKyAxKT4+IDE7IGkrKywgaWR4ICs9IHNpbl9zdGVwKSB7CiAgICAgICBGSVhQX1NUUCB0d2QgPSBzaW5fdHdpZGRsZVtpZHhdOwogCiAgICAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIGFjY3UxLCBhY2N1MiwgdHdkKTsKLSAgICAgIHBEYXRfMVswXSA9ICAtYWNjdTM7Ci0gICAgICBwRGF0XzBbMV0gPSAgLWFjY3U0OworICAgICAgcERhdF8xWzBdID0gLWFjY3UzOworICAgICAgcERhdF8wWzFdID0gLWFjY3U0OwogCi0gICAgICBwRGF0XzArPTI7Ci0gICAgICBwRGF0XzEtPTI7CisgICAgICBwRGF0XzAgKz0gMjsKKyAgICAgIHBEYXRfMSAtPSAyOwogCiAgICAgICBjcGx4TXVsdERpdjIoJmFjY3UzLCAmYWNjdTQsIHBEYXRfMFsxXSwgcERhdF8wWzBdLCB0d2QpOwogCiAgICAgICBhY2N1MSA9IHBEYXRfMVswXTsKICAgICAgIGFjY3UyID0gcERhdF8xWzFdOwogCi0gICAgICBwRGF0XzBbMF0gPSAgYWNjdTM7CisgICAgICBwRGF0XzBbMF0gPSBhY2N1MzsKICAgICAgIHBEYXRfMVsxXSA9IC1hY2N1NDsKICAgICB9CiAKLSAgICBpZiAoIChNJjEpID09IDAgKQotICAgIHsKKyAgICBpZiAoKE0gJiAxKSA9PSAwKSB7CiAgICAgICAvKiBMYXN0IFNpbiBhbmQgQ29zIHZhbHVlIHBhaXIgYXJlIHRoZSBzYW1lICovCiAgICAgICBhY2N1MSA9IGZNdWx0RGl2MihhY2N1MSwgV1RDKDB4NWE4Mjc5OWEpKTsKICAgICAgIGFjY3UyID0gZk11bHREaXYyKGFjY3UyLCBXVEMoMHg1YTgyNzk5YSkpOwogCi0gICAgICBwRGF0XzBbMV0gPSAtIGFjY3UxIC0gYWNjdTI7Ci0gICAgICBwRGF0XzFbMF0gPSAgIGFjY3UyIC0gYWNjdTE7CisgICAgICBwRGF0XzBbMV0gPSAtYWNjdTEgLSBhY2N1MjsKKyAgICAgIHBEYXRfMVswXSA9IGFjY3UyIC0gYWNjdTE7CiAgICAgfQogICB9CiAKQEAgLTUzNiw1ICs1OTQsMyBAQAogICAqcERhdF9lICs9IDI7CiB9CiAjZW5kaWYgLyogIWRlZmluZWQoRlVOQ1RJT05fZHN0X0lWKSAqLwotCi0KZGlmZiAtLWdpdCBhL2xpYkZESy9zcmMvZmZ0LmNwcCBiL2xpYkZESy9zcmMvZmZ0LmNwcAppbmRleCA2NTNhNzFhLi40ZTZmZGQyIDEwMDY0NAotLS0gYS9saWJGREsvc3JjL2ZmdC5jcHAKKysrIGIvbGliRkRLL3NyYy9mZnQuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQ1ICs5MCwxMzAgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwsIERTUCBTb2x1dGlvbnMKKwogICAgRGVzY3JpcHRpb246IEZpeCBwb2ludCBGRlQKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiZmZ0LmgiCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiZmZ0X3JhZDIuaCIKICNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCiAKKyNkZWZpbmUgV19QaUZPVVJUSCBTVEMoMHg1YTgyNzk5YSkKKy8vI2RlZmluZSBXX1BpRk9VUlRIICgoRklYUF9EQkwpKDB4NWE4Mjc5OWEpKQorI2lmbmRlZiBTVU1ESUZGX1BJRk9VUlRICisjZGVmaW5lIFNVTURJRkZfUElGT1VSVEgoZGlmZiwgc3VtLCBhLCBiKSBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklYUF9EQkwgd2EsIHdiOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2EgPSBmTXVsdERpdjIoYSwgV19QaUZPVVJUSCk7ICAgICAgICBcCisgICAgd2IgPSBmTXVsdERpdjIoYiwgV19QaUZPVVJUSCk7ICAgICAgICBcCisgICAgZGlmZiA9IHdiIC0gd2E7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3VtID0gd2IgKyB3YTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgU1VNRElGRl9QSUZPVVJUSDE2KGRpZmYsIHN1bSwgYSwgYikgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklYUF9TR0wgd2EsIHdiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3YSA9IEZYX0RCTDJGWF9TR0woZk11bHREaXYyKGEsIFdfUGlGT1VSVEgpKTsgXAorICAgIHdiID0gRlhfREJMMkZYX1NHTChmTXVsdERpdjIoYiwgV19QaUZPVVJUSCkpOyBcCisgICAgZGlmZiA9IHdiIC0gd2E7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdW0gPSB3YiArIHdhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZW5kaWYKIAorI2RlZmluZSBTQ0FMRUZBQ1RPUjIwNDggMTAKKyNkZWZpbmUgU0NBTEVGQUNUT1IxMDI0IDkKKyNkZWZpbmUgU0NBTEVGQUNUT1I1MTIgOAorI2RlZmluZSBTQ0FMRUZBQ1RPUjI1NiA3CisjZGVmaW5lIFNDQUxFRkFDVE9SMTI4IDYKKyNkZWZpbmUgU0NBTEVGQUNUT1I2NCA1CisjZGVmaW5lIFNDQUxFRkFDVE9SMzIgNAorI2RlZmluZSBTQ0FMRUZBQ1RPUjE2IDMKKyNkZWZpbmUgU0NBTEVGQUNUT1I4IDIKKyNkZWZpbmUgU0NBTEVGQUNUT1I0IDEKKyNkZWZpbmUgU0NBTEVGQUNUT1IyIDEKIAorI2RlZmluZSBTQ0FMRUZBQ1RPUjMgMQorI2RlZmluZSBTQ0FMRUZBQ1RPUjUgMQorI2RlZmluZSBTQ0FMRUZBQ1RPUjYgKFNDQUxFRkFDVE9SMiArIFNDQUxFRkFDVE9SMyArIDIpCisjZGVmaW5lIFNDQUxFRkFDVE9SNyAyCisjZGVmaW5lIFNDQUxFRkFDVE9SOSAyCisjZGVmaW5lIFNDQUxFRkFDVE9SMTAgNQorI2RlZmluZSBTQ0FMRUZBQ1RPUjEyIDMKKyNkZWZpbmUgU0NBTEVGQUNUT1IxNSAzCisjZGVmaW5lIFNDQUxFRkFDVE9SMTggKFNDQUxFRkFDVE9SMiArIFNDQUxFRkFDVE9SOSArIDIpCisjZGVmaW5lIFNDQUxFRkFDVE9SMjAgKFNDQUxFRkFDVE9SNCArIFNDQUxFRkFDVE9SNSArIDIpCisjZGVmaW5lIFNDQUxFRkFDVE9SMjEgKFNDQUxFRkFDVE9SMyArIFNDQUxFRkFDVE9SNyArIDIpCisjZGVmaW5lIFNDQUxFRkFDVE9SMjQgKFNDQUxFRkFDVE9SMiArIFNDQUxFRkFDVE9SMTIgKyAyKQorI2RlZmluZSBTQ0FMRUZBQ1RPUjMwIChTQ0FMRUZBQ1RPUjIgKyBTQ0FMRUZBQ1RPUjE1ICsgMikKKyNkZWZpbmUgU0NBTEVGQUNUT1I0MCAoU0NBTEVGQUNUT1I1ICsgU0NBTEVGQUNUT1I4ICsgMikKKyNkZWZpbmUgU0NBTEVGQUNUT1I0OCAoU0NBTEVGQUNUT1I0ICsgU0NBTEVGQUNUT1IxMiArIDIpCisjZGVmaW5lIFNDQUxFRkFDVE9SNjAgKFNDQUxFRkFDVE9SNCArIFNDQUxFRkFDVE9SMTUgKyAyKQorI2RlZmluZSBTQ0FMRUZBQ1RPUjgwIChTQ0FMRUZBQ1RPUjUgKyBTQ0FMRUZBQ1RPUjE2ICsgMikKKyNkZWZpbmUgU0NBTEVGQUNUT1I5NiAoU0NBTEVGQUNUT1IzICsgU0NBTEVGQUNUT1IzMiArIDIpCisjZGVmaW5lIFNDQUxFRkFDVE9SMTIwIChTQ0FMRUZBQ1RPUjggKyBTQ0FMRUZBQ1RPUjE1ICsgMikKKyNkZWZpbmUgU0NBTEVGQUNUT1IxNjAgKFNDQUxFRkFDVE9SMTAgKyBTQ0FMRUZBQ1RPUjE2ICsgMikKKyNkZWZpbmUgU0NBTEVGQUNUT1IxNjggKFNDQUxFRkFDVE9SMjEgKyBTQ0FMRUZBQ1RPUjggKyAyKQorI2RlZmluZSBTQ0FMRUZBQ1RPUjE5MiAoU0NBTEVGQUNUT1IxMiArIFNDQUxFRkFDVE9SMTYgKyAyKQorI2RlZmluZSBTQ0FMRUZBQ1RPUjI0MCAoU0NBTEVGQUNUT1IxNiArIFNDQUxFRkFDVE9SMTUgKyAyKQorI2RlZmluZSBTQ0FMRUZBQ1RPUjMyMCAoU0NBTEVGQUNUT1IxMCArIFNDQUxFRkFDVE9SMzIgKyAyKQorI2RlZmluZSBTQ0FMRUZBQ1RPUjMzNiAoU0NBTEVGQUNUT1IyMSArIFNDQUxFRkFDVE9SMTYgKyAyKQorI2RlZmluZSBTQ0FMRUZBQ1RPUjM4NCAoU0NBTEVGQUNUT1IxMiArIFNDQUxFRkFDVE9SMzIgKyAyKQorI2RlZmluZSBTQ0FMRUZBQ1RPUjQ4MCAoU0NBTEVGQUNUT1IzMiArIFNDQUxFRkFDVE9SMTUgKyAyKQogCisjaW5jbHVkZSAiZmZ0LmgiCiAKLSNkZWZpbmUgRjNDKHgpIFNUQyh4KQorI2lmbmRlZiBGVU5DVElPTl9mZnQyCiAKLSNkZWZpbmUgICAgIEMzMSAgICAgICAoRjNDKDB4OTEyNjE0NjgpKSAgICAgIC8qIEZMMkZYQ09OU1RfREJMKC0wLjg2NjAyNTQwKSAgICovCisvKiBQZXJmb3JtcyB0aGUgRkZUIG9mIGxlbmd0aCAyLiBJbnB1dCB2ZWN0b3IgdW5zY2FsZWQsIG91dHB1dCB2ZWN0b3Igc2NhbGVkCisgKiB3aXRoIGZhY3RvciAwLjUgKi8KK3N0YXRpYyBGREtfRk9SQ0VJTkxJTkUgdm9pZCBmZnQyKEZJWFBfREJMICpSRVNUUklDVCBwRGF0KSB7CisgIEZJWFBfREJMIHIxLCBpMTsKKyAgRklYUF9EQkwgcjIsIGkyOwogCi0vKiBQZXJmb3JtcyB0aGUgRkZUIG9mIGxlbmd0aCAzIGFjY29yZGluZyB0byB0aGUgYWxnb3JpdGhtIGFmdGVyIHdpbm9ncmFkLgotICAgTm8gc2NhbGluZyBvZiB0aGUgaW5wdXQgdmVjdG9yIGJlY2F1c2UgdGhlIHNjYWxpbmcgaXMgYWxyZWFkeSBkb25lIGluIHRoZSByb3RhdGlvbiB2ZWN0b3IuICovCi1zdGF0aWMgRk9SQ0VJTkxJTkUgdm9pZCBmZnQzKEZJWFBfREJMICpSRVNUUklDVCBwRGF0KQotewotICBGSVhQX0RCTCByMSxyMjsKLSAgRklYUF9EQkwgczEsczI7CiAgIC8qIHJlYWwgcGFydCAqLwotICByMSAgICAgID0gcERhdFsyXSArIHBEYXRbNF07Ci0gIHIyICAgICAgPSBmTXVsdCgocERhdFsyXSAtIHBEYXRbNF0pLCBDMzEpOwotICBwRGF0WzBdID0gcERhdFswXSArIHIxOwotICByMSAgICAgID0gcERhdFswXSAtIHIxIC0gKHIxPj4xKTsKKyAgcjEgPSBwRGF0WzJdOworICByMiA9IHBEYXRbMF07CiAKICAgLyogaW1hZ2luYXJ5IHBhcnQgKi8KLSAgczEgICAgICA9IHBEYXRbM10gKyBwRGF0WzVdOwotICBzMiAgICAgID0gZk11bHQoKHBEYXRbM10gLSBwRGF0WzVdKSwgQzMxKTsKLSAgcERhdFsxXSA9IHBEYXRbMV0gKyBzMTsKLSAgczEgICAgICA9IHBEYXRbMV0gLSBzMSAtIChzMT4+MSk7CisgIGkxID0gcERhdFszXTsKKyAgaTIgPSBwRGF0WzFdOworCisgIC8qIHJlYWwgcGFydCAqLworICBwRGF0WzBdID0gKHIyICsgcjEpID4+IDE7CisgIHBEYXRbMl0gPSAocjIgLSByMSkgPj4gMTsKKworICAvKiBpbWFnaW5hcnkgcGFydCAqLworICBwRGF0WzFdID0gKGkyICsgaTEpID4+IDE7CisgIHBEYXRbM10gPSAoaTIgLSBpMSkgPj4gMTsKK30KKyNlbmRpZiAvKiBGVU5DVElPTl9mZnQyICovCisKKyNkZWZpbmUgQzMxIChTVEMoMHg5MTI2MTQ2OCkpIC8qIEZMMkZYQ09OU1RfREJMKC0wLjg2NjAyNTQwKSA9IC1zcXJ0KDMpLzIgICovCisKKyNpZm5kZWYgRlVOQ1RJT05fZmZ0MworLyogUGVyZm9ybXMgdGhlIEZGVCBvZiBsZW5ndGggMyBhY2NvcmRpbmcgdG8gdGhlIGFsZ29yaXRobSBhZnRlciB3aW5vZ3JhZC4gKi8KK3N0YXRpYyBGREtfRk9SQ0VJTkxJTkUgdm9pZCBmZnQzKEZJWFBfREJMICpSRVNUUklDVCBwRGF0KSB7CisgIEZJWFBfREJMIHIxLCByMjsKKyAgRklYUF9EQkwgczEsIHMyOworICBGSVhQX0RCTCBwRDsKKworICAvKiByZWFsIHBhcnQgKi8KKyAgcjEgPSBwRGF0WzJdICsgcERhdFs0XTsKKyAgcjIgPSBmTXVsdERpdjIoKHBEYXRbMl0gLSBwRGF0WzRdKSwgQzMxKTsKKyAgcEQgPSBwRGF0WzBdID4+IDE7CisgIHBEYXRbMF0gPSBwRCArIChyMSA+PiAxKTsKKyAgcjEgPSBwRCAtIChyMSA+PiAyKTsKKworICAvKiBpbWFnaW5hcnkgcGFydCAqLworICBzMSA9IHBEYXRbM10gKyBwRGF0WzVdOworICBzMiA9IGZNdWx0RGl2MigocERhdFszXSAtIHBEYXRbNV0pLCBDMzEpOworICBwRCA9IHBEYXRbMV0gPj4gMTsKKyAgcERhdFsxXSA9IHBEICsgKHMxID4+IDEpOworICBzMSA9IHBEIC0gKHMxID4+IDIpOwogCiAgIC8qIGNvbWJpbmF0aW9uICovCiAgIHBEYXRbMl0gPSByMSAtIHMyOwpAQCAtMTI1LDYwICsyMjEsNjAgQEAKICAgcERhdFszXSA9IHMxICsgcjI7CiAgIHBEYXRbNV0gPSBzMSAtIHIyOwogfQotCisjZW5kaWYgLyogI2lmbmRlZiBGVU5DVElPTl9mZnQzICovCiAKICNkZWZpbmUgRjVDKHgpIFNUQyh4KQogCi0jZGVmaW5lICAgICBDNTEgICAgICAgKEY1QygweDc5YmMzODU0KSkgICAgICAvKiBGTDJGWENPTlNUX0RCTCggMC45NTEwNTY1MikgICAqLwotI2RlZmluZSAgICAgQzUyICAgICAgIChGNUMoMHg5ZDgzOWRiMCkpICAgICAgLyogRkwyRlhDT05TVF9EQkwoLTEuNTM4ODQxODAvMikgKi8KLSNkZWZpbmUgICAgIEM1MyAgICAgICAoRjVDKDB4ZDE4MDUzY2UpKSAgICAgIC8qIEZMMkZYQ09OU1RfREJMKC0wLjM2MzI3MTI2KSAgICovCi0jZGVmaW5lICAgICBDNTQgICAgICAgKEY1QygweDQ3OGRkZTY0KSkgICAgICAvKiBGTDJGWENPTlNUX0RCTCggMC41NTkwMTY5OSkgICAqLwotI2RlZmluZSAgICAgQzU1ICAgICAgIChGNUMoMHhiMDAwMDAwMSkpICAgICAgLyogRkwyRlhDT05TVF9EQkwoLTEuMjUvMikgICAgICAgKi8KKyNkZWZpbmUgQzUxIChGNUMoMHg3OWJjMzg1NCkpIC8qIEZMMkZYQ09OU1RfREJMKCAwLjk1MTA1NjUyKSAgICovCisjZGVmaW5lIEM1MiAoRjVDKDB4OWQ4MzlkYjApKSAvKiBGTDJGWENPTlNUX0RCTCgtMS41Mzg4NDE4MC8yKSAqLworI2RlZmluZSBDNTMgKEY1QygweGQxODA1M2NlKSkgLyogRkwyRlhDT05TVF9EQkwoLTAuMzYzMjcxMjYpICAgKi8KKyNkZWZpbmUgQzU0IChGNUMoMHg0NzhkZGU2NCkpIC8qIEZMMkZYQ09OU1RfREJMKCAwLjU1OTAxNjk5KSAgICovCisjZGVmaW5lIEM1NSAoRjVDKDB4YjAwMDAwMDEpKSAvKiBGTDJGWENPTlNUX0RCTCgtMS4yNS8yKSAgICAgICAqLwogCiAvKiBwZXJmb3JtcyB0aGUgRkZUIG9mIGxlbmd0aCA1IGFjY29yZGluZyB0byB0aGUgYWxnb3JpdGhtIGFmdGVyIHdpbm9ncmFkICovCi1zdGF0aWMgRk9SQ0VJTkxJTkUgdm9pZCBmZnQ1KEZJWFBfREJMICpSRVNUUklDVCBwRGF0KQotewotICBGSVhQX0RCTCByMSxyMixyMyxyNDsKLSAgRklYUF9EQkwgczEsczIsczMsczQ7CisvKiBUaGlzIHZlcnNpb24gd29ya3Mgd2l0aCBhIHByZXNjYWxlIG9mIDIgaW5zdGVhZCBvZiAzICovCitzdGF0aWMgRkRLX0ZPUkNFSU5MSU5FIHZvaWQgZmZ0NShGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdCkgeworICBGSVhQX0RCTCByMSwgcjIsIHIzLCByNDsKKyAgRklYUF9EQkwgczEsIHMyLCBzMywgczQ7CiAgIEZJWFBfREJMIHQ7CiAKICAgLyogcmVhbCBwYXJ0ICovCi0gIHIxICAgICAgPSBwRGF0WzJdICsgcERhdFs4XTsKLSAgcjQgICAgICA9IHBEYXRbMl0gLSBwRGF0WzhdOwotICByMyAgICAgID0gcERhdFs0XSArIHBEYXRbNl07Ci0gIHIyICAgICAgPSBwRGF0WzRdIC0gcERhdFs2XTsKLSAgdCAgICAgICA9IGZNdWx0KChyMS1yMyksIEM1NCk7Ci0gIHIxICAgICAgPSByMSArIHIzOwotICBwRGF0WzBdID0gcERhdFswXSArIHIxOwotICAvKiBCaXQgc2hpZnQgbGVmdCBiZWNhdXNlIG9mIHRoZSBjb25zdGFudCBDNTUgd2hpY2ggd2FzIHNjYWxlZCB3aXRoIHRoZSBmYWN0b3IgMC41IGJlY2F1c2Ugb2YgdGhlIHJlcHJlc2VudGF0aW9uIG9mCi0gICAgIHRoZSB2YWx1ZXMgYXMgZnJhY3RzICovCi0gIHIxICAgICAgPSBwRGF0WzBdICsgKGZNdWx0RGl2MihyMSwgQzU1KSA8PCgyKSk7Ci0gIHIzICAgICAgPSByMSAtIHQ7Ci0gIHIxICAgICAgPSByMSArIHQ7Ci0gIHQgICAgICAgPSBmTXVsdCgocjQgKyByMiksIEM1MSk7Ci0gIC8qIEJpdCBzaGlmdCBsZWZ0IGJlY2F1c2Ugb2YgdGhlIGNvbnN0YW50IEM1NSB3aGljaCB3YXMgc2NhbGVkIHdpdGggdGhlIGZhY3RvciAwLjUgYmVjYXVzZSBvZiB0aGUgcmVwcmVzZW50YXRpb24gb2YKLSAgICAgdGhlIHZhbHVlcyBhcyBmcmFjdHMgKi8KLSAgcjQgICAgICA9IHQgKyAoZk11bHREaXYyKHI0LCBDNTIpIDw8KDIpKTsKLSAgcjIgICAgICA9IHQgKyBmTXVsdChyMiwgQzUzKTsKKyAgcjEgPSAocERhdFsyXSArIHBEYXRbOF0pID4+IDE7CisgIHI0ID0gKHBEYXRbMl0gLSBwRGF0WzhdKSA+PiAxOworICByMyA9IChwRGF0WzRdICsgcERhdFs2XSkgPj4gMTsKKyAgcjIgPSAocERhdFs0XSAtIHBEYXRbNl0pID4+IDE7CisgIHQgPSBmTXVsdCgocjEgLSByMyksIEM1NCk7CisgIHIxID0gcjEgKyByMzsKKyAgcERhdFswXSA9IChwRGF0WzBdID4+IDEpICsgcjE7CisgIC8qIEJpdCBzaGlmdCBsZWZ0IGJlY2F1c2Ugb2YgdGhlIGNvbnN0YW50IEM1NSB3aGljaCB3YXMgc2NhbGVkIHdpdGggdGhlIGZhY3RvcgorICAgICAwLjUgYmVjYXVzZSBvZiB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlcyBhcyBmcmFjdHMgKi8KKyAgcjEgPSBwRGF0WzBdICsgKGZNdWx0RGl2MihyMSwgQzU1KSA8PCAoMikpOworICByMyA9IHIxIC0gdDsKKyAgcjEgPSByMSArIHQ7CisgIHQgPSBmTXVsdCgocjQgKyByMiksIEM1MSk7CisgIC8qIEJpdCBzaGlmdCBsZWZ0IGJlY2F1c2Ugb2YgdGhlIGNvbnN0YW50IEM1NSB3aGljaCB3YXMgc2NhbGVkIHdpdGggdGhlIGZhY3RvcgorICAgICAwLjUgYmVjYXVzZSBvZiB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlcyBhcyBmcmFjdHMgKi8KKyAgcjQgPSB0ICsgKGZNdWx0RGl2MihyNCwgQzUyKSA8PCAoMikpOworICByMiA9IHQgKyBmTXVsdChyMiwgQzUzKTsKIAogICAvKiBpbWFnaW5hcnkgcGFydCAqLwotICBzMSAgICAgID0gcERhdFszXSArIHBEYXRbOV07Ci0gIHM0ICAgICAgPSBwRGF0WzNdIC0gcERhdFs5XTsKLSAgczMgICAgICA9IHBEYXRbNV0gKyBwRGF0WzddOwotICBzMiAgICAgID0gcERhdFs1XSAtIHBEYXRbN107Ci0gIHQgICAgICAgPSBmTXVsdCgoczEgLSBzMyksIEM1NCk7Ci0gIHMxICAgICAgPSBzMSArIHMzOwotICBwRGF0WzFdID0gcERhdFsxXSArIHMxOwotICAvKiBCaXQgc2hpZnQgbGVmdCBiZWNhdXNlIG9mIHRoZSBjb25zdGFudCBDNTUgd2hpY2ggd2FzIHNjYWxlZCB3aXRoIHRoZSBmYWN0b3IgMC41IGJlY2F1c2Ugb2YgdGhlIHJlcHJlc2VudGF0aW9uIG9mCi0gICAgIHRoZSB2YWx1ZXMgYXMgZnJhY3RzICovCi0gIHMxICAgICAgPSBwRGF0WzFdICsgKGZNdWx0RGl2MihzMSwgQzU1KSA8PCgyKSk7Ci0gIHMzICAgICAgPSBzMSAtIHQ7Ci0gIHMxICAgICAgPSBzMSArIHQ7Ci0gIHQgICAgICAgPSBmTXVsdCgoczQgKyBzMiksIEM1MSk7Ci0gIC8qIEJpdCBzaGlmdCBsZWZ0IGJlY2F1c2Ugb2YgdGhlIGNvbnN0YW50IEM1NSB3aGljaCB3YXMgc2NhbGVkIHdpdGggdGhlIGZhY3RvciAwLjUgYmVjYXVzZSBvZiB0aGUgcmVwcmVzZW50YXRpb24gb2YKLSAgICAgdGhlIHZhbHVlcyBhcyBmcmFjdHMgKi8KLSAgczQgICAgICA9IHQgKyAoZk11bHREaXYyKHM0LCBDNTIpIDw8KDIpKTsKLSAgczIgICAgICA9IHQgKyBmTXVsdChzMiwgQzUzKTsKKyAgczEgPSAocERhdFszXSArIHBEYXRbOV0pID4+IDE7CisgIHM0ID0gKHBEYXRbM10gLSBwRGF0WzldKSA+PiAxOworICBzMyA9IChwRGF0WzVdICsgcERhdFs3XSkgPj4gMTsKKyAgczIgPSAocERhdFs1XSAtIHBEYXRbN10pID4+IDE7CisgIHQgPSBmTXVsdCgoczEgLSBzMyksIEM1NCk7CisgIHMxID0gczEgKyBzMzsKKyAgcERhdFsxXSA9IChwRGF0WzFdID4+IDEpICsgczE7CisgIC8qIEJpdCBzaGlmdCBsZWZ0IGJlY2F1c2Ugb2YgdGhlIGNvbnN0YW50IEM1NSB3aGljaCB3YXMgc2NhbGVkIHdpdGggdGhlIGZhY3RvcgorICAgICAwLjUgYmVjYXVzZSBvZiB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlcyBhcyBmcmFjdHMgKi8KKyAgczEgPSBwRGF0WzFdICsgKGZNdWx0RGl2MihzMSwgQzU1KSA8PCAoMikpOworICBzMyA9IHMxIC0gdDsKKyAgczEgPSBzMSArIHQ7CisgIHQgPSBmTXVsdCgoczQgKyBzMiksIEM1MSk7CisgIC8qIEJpdCBzaGlmdCBsZWZ0IGJlY2F1c2Ugb2YgdGhlIGNvbnN0YW50IEM1NSB3aGljaCB3YXMgc2NhbGVkIHdpdGggdGhlIGZhY3RvcgorICAgICAwLjUgYmVjYXVzZSBvZiB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlcyBhcyBmcmFjdHMgKi8KKyAgczQgPSB0ICsgKGZNdWx0RGl2MihzNCwgQzUyKSA8PCAoMikpOworICBzMiA9IHQgKyBmTXVsdChzMiwgQzUzKTsKIAogICAvKiBjb21iaW5hdGlvbiAqLwogICBwRGF0WzJdID0gcjEgKyBzMjsKQEAgLTE5MiwyMCArMjg4LDMyMiBAQAogICBwRGF0WzddID0gczMgLSByNDsKIH0KIAorI2RlZmluZSBGNUMoeCkgU1RDKHgpCiAKLQotCi0jZGVmaW5lIE4zICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIE41ICAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIE42ICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIE4xNSAgICAgICAgICAgICAgICAgICAxNQotCi0vKiBQZXJmb3JtcyB0aGUgRkZUIG9mIGxlbmd0aCAxNS4gSXQgaXMgc3BsaXQgaW50byBGRlRzIG9mIGxlbmd0aCAzIGFuZCBsZW5ndGggNS4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBmZnQxNShGSVhQX0RCTCAqcElucHV0KQorI2RlZmluZSBDNTEgKEY1QygweDc5YmMzODU0KSkgLyogRkwyRlhDT05TVF9EQkwoIDAuOTUxMDU2NTIpICAgKi8KKyNkZWZpbmUgQzUyIChGNUMoMHg5ZDgzOWRiMCkpIC8qIEZMMkZYQ09OU1RfREJMKC0xLjUzODg0MTgwLzIpICovCisjZGVmaW5lIEM1MyAoRjVDKDB4ZDE4MDUzY2UpKSAvKiBGTDJGWENPTlNUX0RCTCgtMC4zNjMyNzEyNikgICAqLworI2RlZmluZSBDNTQgKEY1QygweDQ3OGRkZTY0KSkgLyogRkwyRlhDT05TVF9EQkwoIDAuNTU5MDE2OTkpICAgKi8KKyNkZWZpbmUgQzU1IChGNUMoMHhiMDAwMDAwMSkpIC8qIEZMMkZYQ09OU1RfREJMKC0xLjI1LzIpICAgICAgICovCisvKioKKyAqIFxicmllZiAgICBGdW5jdGlvbiBwZXJmb3JtcyBhIGNvbXBsZXggMTAtcG9pbnQgRkZUCisgKiAgICAgICAgICAgVGhlIEZGVCBpcyBwZXJmb3JtZWQgaW5wbGFjZS4gVGhlIHJlc3VsdCBvZiB0aGUgRkZUCisgKiAgICAgICAgICAgaXMgc2NhbGVkIGJ5IFNDQUxFRkFDVE9SMTAgYml0cy4KKyAqCisgKiAgICAgICAgICAgV09QUyBGTEMgdmVyc2lvbjogICAgICAgICAgICAgICAgICAgIDEwOTMgY3ljbGVzCisgKiAgICAgICAgICAgV09QUyB3aXRoIDMyeDE2IGJpdCBtdWx0aXBsaWNhdGlvbnM6ICAxOTYgY3ljbGVzCisgKgorICogXHBhcmFtICAgIFtpL29dIHJlICAgIHJlYWwgaW5wdXQgLyBvdXRwdXQKKyAqIFxwYXJhbSAgICBbaS9vXSBpbSAgICBpbWFnIGlucHV0IC8gb3V0cHV0CisgKiBccGFyYW0gICAgW2kgIF0gcyAgICAgc3RyaWRlIHJlYWwgYW5kIGltYWcgaW5wdXQgLyBvdXRwdXQKKyAqCisgKiBccmV0dXJuICAgdm9pZAorICovCitzdGF0aWMgdm9pZCBmZnQxMChGSVhQX0RCTCAqeCkgIC8vIEZJWFBfREJMICpyZSwgRklYUF9EQkwgKmltLCBGSVhQX1NHTCBzKQogewotICBGSVhQX0RCTCAgYURzdFsyKk4xNV07Ci0gIEZJWFBfREJMICBhRHN0MVsyKk4xNV07Ci0gIGludCAgICBpLGssbDsKKyAgRklYUF9EQkwgdDsKKyAgRklYUF9EQkwgeDAsIHgxLCB4MiwgeDMsIHg0OworICBGSVhQX0RCTCByMSwgcjIsIHIzLCByNDsKKyAgRklYUF9EQkwgczEsIHMyLCBzMywgczQ7CisgIEZJWFBfREJMIHkwMCwgeTAxLCB5MDIsIHkwMywgeTA0LCB5MDUsIHkwNiwgeTA3LCB5MDgsIHkwOTsKKyAgRklYUF9EQkwgeTEwLCB5MTEsIHkxMiwgeTEzLCB5MTQsIHkxNSwgeTE2LCB5MTcsIHkxOCwgeTE5OworCisgIGNvbnN0IGludCBzID0gMTsgIC8vIHN0cmlkZSBmYWN0b3IKKworICAvKiAyIGZmdDUgc3RhZ2VzICovCisKKyAgLyogcmVhbCBwYXJ0ICovCisgIHgwID0gKHhbcyAqIDBdID4+IFNDQUxFRkFDVE9SMTApOworICB4MSA9ICh4W3MgKiA0XSA+PiBTQ0FMRUZBQ1RPUjEwKTsKKyAgeDIgPSAoeFtzICogOF0gPj4gU0NBTEVGQUNUT1IxMCk7CisgIHgzID0gKHhbcyAqIDEyXSA+PiBTQ0FMRUZBQ1RPUjEwKTsKKyAgeDQgPSAoeFtzICogMTZdID4+IFNDQUxFRkFDVE9SMTApOworCisgIHIxID0gKHgzICsgeDIpOworICByNCA9ICh4MyAtIHgyKTsKKyAgcjMgPSAoeDEgKyB4NCk7CisgIHIyID0gKHgxIC0geDQpOworICB0ID0gZk11bHQoKHIxIC0gcjMpLCBDNTQpOworICByMSA9IChyMSArIHIzKTsKKyAgeTAwID0gKHgwICsgcjEpOworICByMSA9ICh5MDAgKyAoKGZNdWx0KHIxLCBDNTUpIDw8IDEpKSk7CisgIHIzID0gKHIxIC0gdCk7CisgIHIxID0gKHIxICsgdCk7CisgIHQgPSBmTXVsdCgocjQgKyByMiksIEM1MSk7CisgIHI0ID0gKHQgKyAoZk11bHQocjQsIEM1MikgPDwgMSkpOworICByMiA9ICh0ICsgZk11bHQocjIsIEM1MykpOworCisgIC8qIGltYWdpbmFyeSBwYXJ0ICovCisgIHgwID0gKHhbcyAqIDAgKyAxXSA+PiBTQ0FMRUZBQ1RPUjEwKTsKKyAgeDEgPSAoeFtzICogNCArIDFdID4+IFNDQUxFRkFDVE9SMTApOworICB4MiA9ICh4W3MgKiA4ICsgMV0gPj4gU0NBTEVGQUNUT1IxMCk7CisgIHgzID0gKHhbcyAqIDEyICsgMV0gPj4gU0NBTEVGQUNUT1IxMCk7CisgIHg0ID0gKHhbcyAqIDE2ICsgMV0gPj4gU0NBTEVGQUNUT1IxMCk7CisKKyAgczEgPSAoeDMgKyB4Mik7CisgIHM0ID0gKHgzIC0geDIpOworICBzMyA9ICh4MSArIHg0KTsKKyAgczIgPSAoeDEgLSB4NCk7CisgIHQgPSBmTXVsdCgoczEgLSBzMyksIEM1NCk7CisgIHMxID0gKHMxICsgczMpOworICB5MDEgPSAoeDAgKyBzMSk7CisgIHMxID0gKHkwMSArIChmTXVsdChzMSwgQzU1KSA8PCAxKSk7CisgIHMzID0gKHMxIC0gdCk7CisgIHMxID0gKHMxICsgdCk7CisgIHQgPSBmTXVsdCgoczQgKyBzMiksIEM1MSk7CisgIHM0ID0gKHQgKyAoZk11bHQoczQsIEM1MikgPDwgMSkpOworICBzMiA9ICh0ICsgZk11bHQoczIsIEM1MykpOworCisgIC8qIGNvbWJpbmF0aW9uICovCisgIHkwNCA9IChyMSArIHMyKTsKKyAgeTE2ID0gKHIxIC0gczIpOworICB5MDggPSAocjMgLSBzNCk7CisgIHkxMiA9IChyMyArIHM0KTsKKworICB5MDUgPSAoczEgLSByMik7CisgIHkxNyA9IChzMSArIHIyKTsKKyAgeTA5ID0gKHMzICsgcjQpOworICB5MTMgPSAoczMgLSByNCk7CisKKyAgLyogcmVhbCBwYXJ0ICovCisgIHgwID0gKHhbcyAqIDEwXSA+PiBTQ0FMRUZBQ1RPUjEwKTsKKyAgeDEgPSAoeFtzICogMl0gPj4gU0NBTEVGQUNUT1IxMCk7CisgIHgyID0gKHhbcyAqIDZdID4+IFNDQUxFRkFDVE9SMTApOworICB4MyA9ICh4W3MgKiAxNF0gPj4gU0NBTEVGQUNUT1IxMCk7CisgIHg0ID0gKHhbcyAqIDE4XSA+PiBTQ0FMRUZBQ1RPUjEwKTsKKworICByMSA9ICh4MSArIHg0KTsKKyAgcjQgPSAoeDEgLSB4NCk7CisgIHIzID0gKHgzICsgeDIpOworICByMiA9ICh4MyAtIHgyKTsKKyAgdCA9IGZNdWx0KChyMSAtIHIzKSwgQzU0KTsKKyAgcjEgPSAocjEgKyByMyk7CisgIHkwMiA9ICh4MCArIHIxKTsKKyAgcjEgPSAoeTAyICsgKChmTXVsdChyMSwgQzU1KSA8PCAxKSkpOworICByMyA9IChyMSAtIHQpOworICByMSA9IChyMSArIHQpOworICB0ID0gZk11bHQoKChyNCArIHIyKSksIEM1MSk7CisgIHI0ID0gKHQgKyAoZk11bHQocjQsIEM1MikgPDwgMSkpOworICByMiA9ICh0ICsgZk11bHQocjIsIEM1MykpOworCisgIC8qIGltYWdpbmFyeSBwYXJ0ICovCisgIHgwID0gKHhbcyAqIDEwICsgMV0gPj4gU0NBTEVGQUNUT1IxMCk7CisgIHgxID0gKHhbcyAqIDIgKyAxXSA+PiBTQ0FMRUZBQ1RPUjEwKTsKKyAgeDIgPSAoeFtzICogNiArIDFdID4+IFNDQUxFRkFDVE9SMTApOworICB4MyA9ICh4W3MgKiAxNCArIDFdID4+IFNDQUxFRkFDVE9SMTApOworICB4NCA9ICh4W3MgKiAxOCArIDFdID4+IFNDQUxFRkFDVE9SMTApOworCisgIHMxID0gKHgxICsgeDQpOworICBzNCA9ICh4MSAtIHg0KTsKKyAgczMgPSAoeDMgKyB4Mik7CisgIHMyID0gKHgzIC0geDIpOworICB0ID0gZk11bHQoKHMxIC0gczMpLCBDNTQpOworICBzMSA9IChzMSArIHMzKTsKKyAgeTAzID0gKHgwICsgczEpOworICBzMSA9ICh5MDMgKyAoZk11bHQoczEsIEM1NSkgPDwgMSkpOworICBzMyA9IChzMSAtIHQpOworICBzMSA9IChzMSArIHQpOworICB0ID0gZk11bHQoKHM0ICsgczIpLCBDNTEpOworICBzNCA9ICh0ICsgKGZNdWx0KHM0LCBDNTIpIDw8IDEpKTsKKyAgczIgPSAodCArIGZNdWx0KHMyLCBDNTMpKTsKKworICAvKiBjb21iaW5hdGlvbiAqLworICB5MDYgPSAocjEgKyBzMik7CisgIHkxOCA9IChyMSAtIHMyKTsKKyAgeTEwID0gKHIzIC0gczQpOworICB5MTQgPSAocjMgKyBzNCk7CisKKyAgeTA3ID0gKHMxIC0gcjIpOworICB5MTkgPSAoczEgKyByMik7CisgIHkxMSA9IChzMyArIHI0KTsKKyAgeTE1ID0gKHMzIC0gcjQpOworCisgIC8qIDUgZmZ0MiBzdGFnZXMgKi8KKyAgeFtzICogMF0gPSAoeTAwICsgeTAyKTsKKyAgeFtzICogMCArIDFdID0gKHkwMSArIHkwMyk7CisgIHhbcyAqIDEwXSA9ICh5MDAgLSB5MDIpOworICB4W3MgKiAxMCArIDFdID0gKHkwMSAtIHkwMyk7CisKKyAgeFtzICogNF0gPSAoeTA0ICsgeTA2KTsKKyAgeFtzICogNCArIDFdID0gKHkwNSArIHkwNyk7CisgIHhbcyAqIDE0XSA9ICh5MDQgLSB5MDYpOworICB4W3MgKiAxNCArIDFdID0gKHkwNSAtIHkwNyk7CisKKyAgeFtzICogOF0gPSAoeTA4ICsgeTEwKTsKKyAgeFtzICogOCArIDFdID0gKHkwOSArIHkxMSk7CisgIHhbcyAqIDE4XSA9ICh5MDggLSB5MTApOworICB4W3MgKiAxOCArIDFdID0gKHkwOSAtIHkxMSk7CisKKyAgeFtzICogMTJdID0gKHkxMiArIHkxNCk7CisgIHhbcyAqIDEyICsgMV0gPSAoeTEzICsgeTE1KTsKKyAgeFtzICogMl0gPSAoeTEyIC0geTE0KTsKKyAgeFtzICogMiArIDFdID0gKHkxMyAtIHkxNSk7CisKKyAgeFtzICogMTZdID0gKHkxNiArIHkxOCk7CisgIHhbcyAqIDE2ICsgMV0gPSAoeTE3ICsgeTE5KTsKKyAgeFtzICogNl0gPSAoeTE2IC0geTE4KTsKKyAgeFtzICogNiArIDFdID0gKHkxNyAtIHkxOSk7Cit9CisKKyNpZm5kZWYgRlVOQ1RJT05fZmZ0MTIKKyNkZWZpbmUgRlVOQ1RJT05fZmZ0MTIKKworI3VuZGVmIEMzMQorI2RlZmluZSBDMzEgKFNUQygweDkxMjYxNDY4KSkgLyogRkwyRlhDT05TVF9EQkwoLTAuODY2MDI1NDApID0gLXNxcnQoMykvMiAgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGZmdDEyKEZJWFBfREJMICpwSW5wdXQpIHsKKyAgRklYUF9EQkwgYURzdFsyNF07CisgIEZJWFBfREJMICpwU3JjLCAqcERzdDsKKyAgaW50IGk7CisKKyAgcFNyYyA9IHBJbnB1dDsKKyAgcERzdCA9IGFEc3Q7CisgIEZJWFBfREJMIHIxLCByMiwgczEsIHMyLCBwRDsKKworICAvKiBGaXJzdCAzKjIgc2FtcGxlcyBhcmUgc2hpZnRlZCByaWdodCBieSAyIGJlZm9yZSBvdXRwdXQgKi8KKyAgcjEgPSBwU3JjWzhdICsgcFNyY1sxNl07CisgIHIyID0gZk11bHREaXYyKChwU3JjWzhdIC0gcFNyY1sxNl0pLCBDMzEpOworICBwRCA9IHBTcmNbMF0gPj4gMTsKKyAgcERzdFswXSA9IChwRCArIChyMSA+PiAxKSkgPj4gMTsKKyAgcjEgPSBwRCAtIChyMSA+PiAyKTsKKworICAvKiBpbWFnaW5hcnkgcGFydCAqLworICBzMSA9IHBTcmNbOV0gKyBwU3JjWzE3XTsKKyAgczIgPSBmTXVsdERpdjIoKHBTcmNbOV0gLSBwU3JjWzE3XSksIEMzMSk7CisgIHBEID0gcFNyY1sxXSA+PiAxOworICBwRHN0WzFdID0gKHBEICsgKHMxID4+IDEpKSA+PiAxOworICBzMSA9IHBEIC0gKHMxID4+IDIpOworCisgIC8qIGNvbWJpbmF0aW9uICovCisgIHBEc3RbMl0gPSAocjEgLSBzMikgPj4gMTsKKyAgcERzdFszXSA9IChzMSArIHIyKSA+PiAxOworICBwRHN0WzRdID0gKHIxICsgczIpID4+IDE7CisgIHBEc3RbNV0gPSAoczEgLSByMikgPj4gMTsKKyAgcFNyYyArPSAyOworICBwRHN0ICs9IDY7CisKKyAgY29uc3QgRklYUF9TVEIgKnBWZWNSZSA9IFJvdFZlY3RvclJlYWwxMjsKKyAgY29uc3QgRklYUF9TVEIgKnBWZWNJbSA9IFJvdFZlY3RvckltYWcxMjsKKyAgRklYUF9EQkwgcmUsIGltOworICBGSVhQX1NUQiB2cmUsIHZpbTsKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgIC8qIHNhbXBsZSAwLDEgYXJlIHNoaWZ0ZWQgcmlnaHQgYnkgMiBiZWZvcmUgb3V0cHV0ICovCisgICAgLyogc2FtcGxlIDIsMyA0LDUgYXJlIHNoaWZ0ZWQgcmlnaHQgYnkgMSBhbmQgY29tcGxleCBtdWx0aXBsaWVkIGJlZm9yZQorICAgICAqIG91dHB1dCAqLworCisgICAgcjEgPSBwU3JjWzhdICsgcFNyY1sxNl07CisgICAgcjIgPSBmTXVsdERpdjIoKHBTcmNbOF0gLSBwU3JjWzE2XSksIEMzMSk7CisgICAgcEQgPSBwU3JjWzBdID4+IDE7CisgICAgcERzdFswXSA9IChwRCArIChyMSA+PiAxKSkgPj4gMTsKKyAgICByMSA9IHBEIC0gKHIxID4+IDIpOworCisgICAgLyogaW1hZ2luYXJ5IHBhcnQgKi8KKyAgICBzMSA9IHBTcmNbOV0gKyBwU3JjWzE3XTsKKyAgICBzMiA9IGZNdWx0RGl2MigocFNyY1s5XSAtIHBTcmNbMTddKSwgQzMxKTsKKyAgICBwRCA9IHBTcmNbMV0gPj4gMTsKKyAgICBwRHN0WzFdID0gKHBEICsgKHMxID4+IDEpKSA+PiAxOworICAgIHMxID0gcEQgLSAoczEgPj4gMik7CisKKyAgICAvKiBjb21iaW5hdGlvbiAqLworICAgIHJlID0gKHIxIC0gczIpID4+IDA7CisgICAgaW0gPSAoczEgKyByMikgPj4gMDsKKyAgICB2cmUgPSAqcFZlY1JlKys7CisgICAgdmltID0gKnBWZWNJbSsrOworICAgIGNwbHhNdWx0RGl2MigmcERzdFszXSwgJnBEc3RbMl0sIGltLCByZSwgdnJlLCB2aW0pOworCisgICAgcmUgPSAocjEgKyBzMikgPj4gMDsKKyAgICBpbSA9IChzMSAtIHIyKSA+PiAwOworICAgIHZyZSA9ICpwVmVjUmUrKzsKKyAgICB2aW0gPSAqcFZlY0ltKys7CisgICAgY3BseE11bHREaXYyKCZwRHN0WzVdLCAmcERzdFs0XSwgaW0sIHJlLCB2cmUsIHZpbSk7CisKKyAgICBwRHN0ICs9IDY7CisgICAgcFNyYyArPSAyOworICB9CisgIC8qIHNhbXBsZSAwLDEgYXJlIHNoaWZ0ZWQgcmlnaHQgYnkgMiBiZWZvcmUgb3V0cHV0ICovCisgIC8qIHNhbXBsZSAyLDMgaXMgc2hpZnRlZCByaWdodCBieSAxIGFuZCBjb21wbGV4IG11bHRpcGxpZWQgd2l0aCAoMC4wLCsxLjApICovCisgIC8qIHNhbXBsZSA0LDUgaXMgc2hpZnRlZCByaWdodCBieSAxIGFuZCBjb21wbGV4IG11bHRpcGxpZWQgd2l0aCAoLTEuMCwwLjApICovCisgIHIxID0gcFNyY1s4XSArIHBTcmNbMTZdOworICByMiA9IGZNdWx0RGl2MigocFNyY1s4XSAtIHBTcmNbMTZdKSwgQzMxKTsKKyAgcEQgPSBwU3JjWzBdID4+IDE7CisgIHBEc3RbMF0gPSAocEQgKyAocjEgPj4gMSkpID4+IDE7CisgIHIxID0gcEQgLSAocjEgPj4gMik7CisKKyAgLyogaW1hZ2luYXJ5IHBhcnQgKi8KKyAgczEgPSBwU3JjWzldICsgcFNyY1sxN107CisgIHMyID0gZk11bHREaXYyKChwU3JjWzldIC0gcFNyY1sxN10pLCBDMzEpOworICBwRCA9IHBTcmNbMV0gPj4gMTsKKyAgcERzdFsxXSA9IChwRCArIChzMSA+PiAxKSkgPj4gMTsKKyAgczEgPSBwRCAtIChzMSA+PiAyKTsKKworICAvKiBjb21iaW5hdGlvbiAqLworICBwRHN0WzJdID0gKHMxICsgcjIpID4+IDE7CisgIHBEc3RbM10gPSAoczIgLSByMSkgPj4gMTsKKyAgcERzdFs0XSA9IC0oKHIxICsgczIpID4+IDEpOworICBwRHN0WzVdID0gKHIyIC0gczEpID4+IDE7CisKKyAgLyogUGVyZm9ybSAzIHRpbWVzIHRoZSBmZnQgb2YgbGVuZ3RoIDQuIFRoZSBpbnB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzcworICBvZiBhRHN0IGFuZCB0aGUgb3V0cHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzIG9mIHBJbnB1dC4gVGhlIGlucHV0IHZlY3RvcgorICBmb3IgdGhlIGZmdCBvZiBsZW5ndGggNCBpcyBidWlsdCBvZiB0aGUgaW50ZXJsZWF2ZWQgc2FtcGxlcyBpbiBhRHN0LCB0aGUKKyAgb3V0cHV0IHNhbXBsZXMgYXJlIHN0b3JlZCBjb25zZWN1dGl2ZWx5IGF0IHRoZSBhZGRyZXNzIG9mIHBJbnB1dC4KKyAgKi8KKyAgcFNyYyA9IGFEc3Q7CisgIHBEc3QgPSBwSW5wdXQ7CisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAvKiBpbmxpbmUgRkZUNCBtZXJnZWQgd2l0aCBpbmNvbWluZyByZXNvcnRpbmcgbG9vcCAqLworICAgIEZJWFBfREJMIGEwMCwgYTEwLCBhMjAsIGEzMCwgdG1wMCwgdG1wMTsKKworICAgIGEwMCA9IChwU3JjWzBdICsgcFNyY1sxMl0pID4+IDE7IC8qIFJlIEEgKyBSZSBCICovCisgICAgYTEwID0gKHBTcmNbNl0gKyBwU3JjWzE4XSkgPj4gMTsgLyogUmUgQyArIFJlIEQgKi8KKyAgICBhMjAgPSAocFNyY1sxXSArIHBTcmNbMTNdKSA+PiAxOyAvKiBJbSBBICsgSW0gQiAqLworICAgIGEzMCA9IChwU3JjWzddICsgcFNyY1sxOV0pID4+IDE7IC8qIEltIEMgKyBJbSBEICovCisKKyAgICBwRHN0WzBdID0gYTAwICsgYTEwOyAvKiBSZSBBJyA9IFJlIEEgKyBSZSBCICsgUmUgQyArIFJlIEQgKi8KKyAgICBwRHN0WzFdID0gYTIwICsgYTMwOyAvKiBJbSBBJyA9IEltIEEgKyBJbSBCICsgSW0gQyArIEltIEQgKi8KKworICAgIHRtcDAgPSBhMDAgLSBwU3JjWzEyXTsgLyogUmUgQSAtIFJlIEIgKi8KKyAgICB0bXAxID0gYTIwIC0gcFNyY1sxM107IC8qIEltIEEgLSBJbSBCICovCisKKyAgICBwRHN0WzEyXSA9IGEwMCAtIGExMDsgLyogUmUgQycgPSBSZSBBICsgUmUgQiAtIFJlIEMgLSBSZSBEICovCisgICAgcERzdFsxM10gPSBhMjAgLSBhMzA7IC8qIEltIEMnID0gSW0gQSArIEltIEIgLSBJbSBDIC0gSW0gRCAqLworCisgICAgYTEwID0gYTEwIC0gcFNyY1sxOF07IC8qIFJlIEMgLSBSZSBEICovCisgICAgYTMwID0gYTMwIC0gcFNyY1sxOV07IC8qIEltIEMgLSBJbSBEICovCisKKyAgICBwRHN0WzZdID0gdG1wMCArIGEzMDsgIC8qIFJlIEInID0gUmUgQSAtIFJlIEIgKyBJbSBDIC0gSW0gRCAqLworICAgIHBEc3RbMThdID0gdG1wMCAtIGEzMDsgLyogUmUgRCcgPSBSZSBBIC0gUmUgQiAtIEltIEMgKyBJbSBEICovCisgICAgcERzdFs3XSA9IHRtcDEgLSBhMTA7ICAvKiBJbSBCJyA9IEltIEEgLSBJbSBCIC0gUmUgQyArIFJlIEQgKi8KKyAgICBwRHN0WzE5XSA9IHRtcDEgKyBhMTA7IC8qIEltIEQnID0gSW0gQSAtIEltIEIgKyBSZSBDIC0gUmUgRCAqLworCisgICAgcFNyYyArPSAyOworICAgIHBEc3QgKz0gMjsKKyAgfQorfQorI2VuZGlmIC8qIEZVTkNUSU9OX2ZmdDEyICovCisKKyNpZm5kZWYgRlVOQ1RJT05fZmZ0MTUKKworI2RlZmluZSBOMyAzCisjZGVmaW5lIE41IDUKKyNkZWZpbmUgTjYgNgorI2RlZmluZSBOMTUgMTUKKworLyogUGVyZm9ybXMgdGhlIEZGVCBvZiBsZW5ndGggMTUuIEl0IGlzIHNwbGl0IGludG8gRkZUcyBvZiBsZW5ndGggMyBhbmQKKyAqIGxlbmd0aCA1LiAqLworc3RhdGljIGlubGluZSB2b2lkIGZmdDE1KEZJWFBfREJMICpwSW5wdXQpIHsKKyAgRklYUF9EQkwgYURzdFsyICogTjE1XTsKKyAgRklYUF9EQkwgYURzdDFbMiAqIE4xNV07CisgIGludCBpLCBrLCBsOwogCiAgIC8qIFNvcnQgaW5wdXQgdmVjdG9yIGZvciBmZnQncyBvZiBsZW5ndGggMwogICBpbnB1dDMoMDoyKSAgID0gW2lucHV0KDApIGlucHV0KDUpIGlucHV0KDEwKV07CkBAIC0yMTcsNDcgKzYxNSw0MyBAQAogICAgIGNvbnN0IEZJWFBfREJMICpwU3JjID0gcElucHV0OwogICAgIEZJWFBfREJMICpSRVNUUklDVCBwRHN0ID0gYURzdDsKICAgICAvKiBNZXJnZSAzIGxvb3BzIGludG8gb25lLCBza2lwIGNhbGwgb2YgZmZ0MyAqLwotICAgIGZvcihpPTAsbD0wLGs9MDsgaTxONTsgaSsrLCBrKz02KQotICAgIHsKLSAgICAgIHBEc3RbayswXSA9IHBTcmNbbF07Ci0gICAgICBwRHN0W2srMV0gPSBwU3JjW2wrMV07Ci0gICAgICBsICs9IDIqTjU7Ci0gICAgICBpZiAobCA+PSAoMipOMTUpKQotICAgICAgICAgIGwgLT0gKDIqTjE1KTsKKyAgICBmb3IgKGkgPSAwLCBsID0gMCwgayA9IDA7IGkgPCBONTsgaSsrLCBrICs9IDYpIHsKKyAgICAgIHBEc3RbayArIDBdID0gcFNyY1tsXTsKKyAgICAgIHBEc3RbayArIDFdID0gcFNyY1tsICsgMV07CisgICAgICBsICs9IDIgKiBONTsKKyAgICAgIGlmIChsID49ICgyICogTjE1KSkgbCAtPSAoMiAqIE4xNSk7CiAKLSAgICAgIHBEc3RbaysyXSA9IHBTcmNbbF07Ci0gICAgICBwRHN0W2srM10gPSBwU3JjW2wrMV07Ci0gICAgICBsICs9IDIqTjU7Ci0gICAgICBpZiAobCA+PSAoMipOMTUpKQotICAgICAgICAgIGwgLT0gKDIqTjE1KTsKLSAgICAgIHBEc3Rbays0XSA9IHBTcmNbbF07Ci0gICAgICBwRHN0W2srNV0gPSBwU3JjW2wrMV07Ci0gICAgICBsICs9ICgyKk41KSArICgyKk4zKTsKLSAgICAgIGlmIChsID49ICgyKk4xNSkpCi0gICAgICAgICAgbCAtPSAoMipOMTUpOworICAgICAgcERzdFtrICsgMl0gPSBwU3JjW2xdOworICAgICAgcERzdFtrICsgM10gPSBwU3JjW2wgKyAxXTsKKyAgICAgIGwgKz0gMiAqIE41OworICAgICAgaWYgKGwgPj0gKDIgKiBOMTUpKSBsIC09ICgyICogTjE1KTsKKyAgICAgIHBEc3RbayArIDRdID0gcFNyY1tsXTsKKyAgICAgIHBEc3RbayArIDVdID0gcFNyY1tsICsgMV07CisgICAgICBsICs9ICgyICogTjUpICsgKDIgKiBOMyk7CisgICAgICBpZiAobCA+PSAoMiAqIE4xNSkpIGwgLT0gKDIgKiBOMTUpOwogCiAgICAgICAvKiBmZnQzIG1lcmdlZCB3aXRoIHNoaWZ0IHJpZ2h0IGJ5IDIgbG9vcCAqLwotICAgICAgRklYUF9EQkwgcjEscjIscjM7Ci0gICAgICBGSVhQX0RCTCBzMSxzMjsKKyAgICAgIEZJWFBfREJMIHIxLCByMiwgcjM7CisgICAgICBGSVhQX0RCTCBzMSwgczI7CiAgICAgICAvKiByZWFsIHBhcnQgKi8KLSAgICAgIHIxICAgICAgPSBwRHN0W2srMl0gKyBwRHN0W2srNF07Ci0gICAgICByMiAgICAgID0gZk11bHQoKHBEc3RbaysyXSAtIHBEc3Rbays0XSksIEMzMSk7Ci0gICAgICBzMSAgICAgID0gcERzdFtrKzBdOwotICAgICAgcERzdFtrKzBdID0gKHMxICsgcjEpPj4yOwotICAgICAgcjEgICAgICA9IHMxIC0gKHIxPj4xKTsKKyAgICAgIHIxID0gcERzdFtrICsgMl0gKyBwRHN0W2sgKyA0XTsKKyAgICAgIHIyID0gZk11bHQoKHBEc3RbayArIDJdIC0gcERzdFtrICsgNF0pLCBDMzEpOworICAgICAgczEgPSBwRHN0W2sgKyAwXTsKKyAgICAgIHBEc3RbayArIDBdID0gKHMxICsgcjEpID4+IDI7CisgICAgICByMSA9IHMxIC0gKHIxID4+IDEpOwogCiAgICAgICAvKiBpbWFnaW5hcnkgcGFydCAqLwotICAgICAgczEgICAgICA9IHBEc3RbayszXSArIHBEc3Rbays1XTsKLSAgICAgIHMyICAgICAgPSBmTXVsdCgocERzdFtrKzNdIC0gcERzdFtrKzVdKSwgQzMxKTsKLSAgICAgIHIzICAgICAgPSBwRHN0W2srMV07Ci0gICAgICBwRHN0W2srMV0gPSAocjMgKyBzMSk+PjI7Ci0gICAgICBzMSAgICAgID0gcjMgLSAoczE+PjEpOworICAgICAgczEgPSBwRHN0W2sgKyAzXSArIHBEc3RbayArIDVdOworICAgICAgczIgPSBmTXVsdCgocERzdFtrICsgM10gLSBwRHN0W2sgKyA1XSksIEMzMSk7CisgICAgICByMyA9IHBEc3RbayArIDFdOworICAgICAgcERzdFtrICsgMV0gPSAocjMgKyBzMSkgPj4gMjsKKyAgICAgIHMxID0gcjMgLSAoczEgPj4gMSk7CiAKICAgICAgIC8qIGNvbWJpbmF0aW9uICovCi0gICAgICBwRHN0W2srMl0gPSAocjEgLSBzMik+PjI7Ci0gICAgICBwRHN0W2srNF0gPSAocjEgKyBzMik+PjI7Ci0gICAgICBwRHN0W2srM10gPSAoczEgKyByMik+PjI7Ci0gICAgICBwRHN0W2srNV0gPSAoczEgLSByMik+PjI7CisgICAgICBwRHN0W2sgKyAyXSA9IChyMSAtIHMyKSA+PiAyOworICAgICAgcERzdFtrICsgNF0gPSAocjEgKyBzMikgPj4gMjsKKyAgICAgIHBEc3RbayArIDNdID0gKHMxICsgcjIpID4+IDI7CisgICAgICBwRHN0W2sgKyA1XSA9IChzMSAtIHIyKSA+PiAyOwogICAgIH0KICAgfQogICAvKiBTb3J0IGlucHV0IHZlY3RvciBmb3IgZmZ0J3Mgb2YgbGVuZ3RoIDUKQEAgLTI2OCwxOSArNjYyLDE4IEBACiAgIHsKICAgICBjb25zdCBGSVhQX0RCTCAqcFNyYyA9IGFEc3Q7CiAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEc3QgPSBhRHN0MTsKLSAgICBmb3IoaT0wLGw9MCxrPTA7IGk8TjM7IGkrKywgays9MTApCi0gICAgewotICAgICAgbCA9IDIqaTsKLSAgICAgIHBEc3RbayswXSA9IHBTcmNbbCswXTsKLSAgICAgIHBEc3RbaysxXSA9IHBTcmNbbCsxXTsKLSAgICAgIHBEc3RbaysyXSA9IHBTcmNbbCswKygyKk4zKV07Ci0gICAgICBwRHN0W2srM10gPSBwU3JjW2wrMSsoMipOMyldOwotICAgICAgcERzdFtrKzRdID0gcFNyY1tsKzArKDQqTjMpXTsKLSAgICAgIHBEc3Rbays1XSA9IHBTcmNbbCsxKyg0Kk4zKV07Ci0gICAgICBwRHN0W2srNl0gPSBwU3JjW2wrMCsoNipOMyldOwotICAgICAgcERzdFtrKzddID0gcFNyY1tsKzErKDYqTjMpXTsKLSAgICAgIHBEc3Rbays4XSA9IHBTcmNbbCswKyg4Kk4zKV07Ci0gICAgICBwRHN0W2srOV0gPSBwU3JjW2wrMSsoOCpOMyldOworICAgIGZvciAoaSA9IDAsIGwgPSAwLCBrID0gMDsgaSA8IE4zOyBpKyssIGsgKz0gMTApIHsKKyAgICAgIGwgPSAyICogaTsKKyAgICAgIHBEc3RbayArIDBdID0gcFNyY1tsICsgMF07CisgICAgICBwRHN0W2sgKyAxXSA9IHBTcmNbbCArIDFdOworICAgICAgcERzdFtrICsgMl0gPSBwU3JjW2wgKyAwICsgKDIgKiBOMyldOworICAgICAgcERzdFtrICsgM10gPSBwU3JjW2wgKyAxICsgKDIgKiBOMyldOworICAgICAgcERzdFtrICsgNF0gPSBwU3JjW2wgKyAwICsgKDQgKiBOMyldOworICAgICAgcERzdFtrICsgNV0gPSBwU3JjW2wgKyAxICsgKDQgKiBOMyldOworICAgICAgcERzdFtrICsgNl0gPSBwU3JjW2wgKyAwICsgKDYgKiBOMyldOworICAgICAgcERzdFtrICsgN10gPSBwU3JjW2wgKyAxICsgKDYgKiBOMyldOworICAgICAgcERzdFtrICsgOF0gPSBwU3JjW2wgKyAwICsgKDggKiBOMyldOworICAgICAgcERzdFtrICsgOV0gPSBwU3JjW2wgKyAxICsgKDggKiBOMyldOwogICAgICAgZmZ0NSgmcERzdFtrXSk7CiAgICAgfQogICB9CkBAIC0yOTIsMTExMiArNjg1LDEyMzggQEAKICAgewogICAgIGNvbnN0IEZJWFBfREJMICpwU3JjID0gYURzdDE7CiAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEc3QgPSBwSW5wdXQ7Ci0gICAgZm9yKGk9MCxsPTAsaz0wOyBpPE4zOyBpKyssIGsrPTEwKQotICAgIHsKLSAgICAgIHBEc3RbayswXSA9IHBTcmNbbF07Ci0gICAgICBwRHN0W2srMV0gPSBwU3JjW2wrMV07Ci0gICAgICBsICs9ICgyKk42KTsKLSAgICAgIGlmIChsID49ICgyKk4xNSkpCi0gICAgICAgICAgbCAtPSAoMipOMTUpOwotICAgICAgcERzdFtrKzJdID0gcFNyY1tsXTsKLSAgICAgIHBEc3RbayszXSA9IHBTcmNbbCsxXTsKLSAgICAgIGwgKz0gKDIqTjYpOwotICAgICAgaWYgKGwgPj0gKDIqTjE1KSkKLSAgICAgICAgICBsIC09ICgyKk4xNSk7Ci0gICAgICBwRHN0W2srNF0gPSBwU3JjW2xdOwotICAgICAgcERzdFtrKzVdID0gcFNyY1tsKzFdOwotICAgICAgbCArPSAoMipONik7Ci0gICAgICBpZiAobCA+PSAoMipOMTUpKQotICAgICAgICAgIGwgLT0gKDIqTjE1KTsKLSAgICAgIHBEc3Rbays2XSA9IHBTcmNbbF07Ci0gICAgICBwRHN0W2srN10gPSBwU3JjW2wrMV07Ci0gICAgICBsICs9ICgyKk42KTsKLSAgICAgIGlmIChsID49ICgyKk4xNSkpCi0gICAgICAgICAgbCAtPSAoMipOMTUpOwotICAgICAgcERzdFtrKzhdID0gcFNyY1tsXTsKLSAgICAgIHBEc3Rbays5XSA9IHBTcmNbbCsxXTsKLSAgICAgIGwgKz0gMjsgICAgLyogbm8gbW9kdWxvIGNoZWNrIG5lZWRlZCwgaXQgY2Fubm90IG9jY3VyICovCisgICAgZm9yIChpID0gMCwgbCA9IDAsIGsgPSAwOyBpIDwgTjM7IGkrKywgayArPSAxMCkgeworICAgICAgcERzdFtrICsgMF0gPSBwU3JjW2xdOworICAgICAgcERzdFtrICsgMV0gPSBwU3JjW2wgKyAxXTsKKyAgICAgIGwgKz0gKDIgKiBONik7CisgICAgICBpZiAobCA+PSAoMiAqIE4xNSkpIGwgLT0gKDIgKiBOMTUpOworICAgICAgcERzdFtrICsgMl0gPSBwU3JjW2xdOworICAgICAgcERzdFtrICsgM10gPSBwU3JjW2wgKyAxXTsKKyAgICAgIGwgKz0gKDIgKiBONik7CisgICAgICBpZiAobCA+PSAoMiAqIE4xNSkpIGwgLT0gKDIgKiBOMTUpOworICAgICAgcERzdFtrICsgNF0gPSBwU3JjW2xdOworICAgICAgcERzdFtrICsgNV0gPSBwU3JjW2wgKyAxXTsKKyAgICAgIGwgKz0gKDIgKiBONik7CisgICAgICBpZiAobCA+PSAoMiAqIE4xNSkpIGwgLT0gKDIgKiBOMTUpOworICAgICAgcERzdFtrICsgNl0gPSBwU3JjW2xdOworICAgICAgcERzdFtrICsgN10gPSBwU3JjW2wgKyAxXTsKKyAgICAgIGwgKz0gKDIgKiBONik7CisgICAgICBpZiAobCA+PSAoMiAqIE4xNSkpIGwgLT0gKDIgKiBOMTUpOworICAgICAgcERzdFtrICsgOF0gPSBwU3JjW2xdOworICAgICAgcERzdFtrICsgOV0gPSBwU3JjW2wgKyAxXTsKKyAgICAgIGwgKz0gMjsgLyogbm8gbW9kdWxvIGNoZWNrIG5lZWRlZCwgaXQgY2Fubm90IG9jY3VyICovCiAgICAgfQogICB9CiB9CisjZW5kaWYgLyogRlVOQ1RJT05fZmZ0MTUgKi8KIAotI2RlZmluZSBXX1BpRk9VUlRIIFNUQygweDVhODI3OTlhKQotI2lmbmRlZiBTVU1ESUZGX1BJRk9VUlRICi0jZGVmaW5lIFNVTURJRkZfUElGT1VSVEgoZGlmZixzdW0sYSxiKSBcCi0gIHsgXAotICAgIEZJWFBfREJMIHdhLCB3YjtcCi0gICAgd2EgPSBmTXVsdERpdjIoYSwgV19QaUZPVVJUSCk7XAotICAgIHdiID0gZk11bHREaXYyKGIsIFdfUGlGT1VSVEgpO1wKLSAgICBkaWZmID0gd2IgLSB3YTtcCi0gICAgc3VtICA9IHdiICsgd2E7XAotICB9CisvKgorIFNlbGVjdCBzaGlmdCBwbGFjZW1lbnQuCisgU29tZSBwcm9jZXNzb3JzIGxpa2UgQVJNIG1heSBzaGlmdCAiZm9yIGZyZWUiIGluIGNvbWJpbmF0aW9uIHdpdGggYW4gYWRkaXRpb24KKyBvciBzdWJzdHJhY3Rpb24sIGJ1dCBvdGhlcnMgZG9uJ3Qgc28gZWl0aGVyIGNvbWJpbmluZyBzaGlmdCB3aXRoICsvLSBvciByZWR1Y2UKKyB0aGUgdG90YWwgYW1vdW50IG9yIHNoaWZ0IG9wZXJhdGlvbnMgaXMgb3B0aW1hbAorICovCisjaWYgIWRlZmluZWQoX19hcm1fXykKKyNkZWZpbmUgU0hJRlRfQSA+PiAxCisjZGVmaW5lIFNISUZUX0IKKyNlbHNlCisjZGVmaW5lIFNISUZUX0EKKyNkZWZpbmUgU0hJRlRfQiA+PiAxCiAjZW5kaWYKIAotLyogVGhpcyB2ZXJzaW9uIGlzIG1vcmUgb3ZlcmZsb3cgc2F2ZSwgYnV0IGxlc3MgY3ljbGUgb3B0aW1hbC4gKi8KLSNkZWZpbmUgU1VNRElGRl9FSUdUSCh4LCB5LCBpeCwgaXksIHZyLCB2aSwgdXIsIHVpKSBcCi0gIHZyID0gKHhbIDAgKyBpeF0+PjEpICsgKHhbMTYgKyBpeF0+PjEpOyAgLyogUmUgQSArIFJlIEIgKi8gXAotICB2aSA9ICh4WyA4ICsgaXhdPj4xKSArICh4WzI0ICsgaXhdPj4xKTsgICAgIC8qIFJlIEMgKyBSZSBEICovIFwKLSAgdXIgPSAoeFsgMSArIGl4XT4+MSkgKyAoeFsxNyArIGl4XT4+MSk7ICAvKiBJbSBBICsgSW0gQiAqLyBcCi0gIHVpID0gKHhbIDkgKyBpeF0+PjEpICsgKHhbMjUgKyBpeF0+PjEpOyAgICAgLyogSW0gQyArIEltIEQgKi8gXAotICB5WyAwICsgaXldID0gdnIgKyB2aTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8gICAgXAotICB5WyA0ICsgaXldID0gdnIgLSB2aTsgICAgIC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLyAgXAotICB5WyAxICsgaXldID0gdXIgKyB1aTsgICAgIC8qIEltIEEnID0gc3VtIG9mIGltYWcgdmFsdWVzICovICAgICAgXAotICB5WyA1ICsgaXldID0gdXIgLSB1aTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8gXAotICB2ciAtPSB4WzE2ICsgaXhdOyAgICAgICAgICAgICAgLyogUmUgQSAtIFJlIEIgKi8gXAotICB2aSA9IHZpIC0geFsyNCArIGl4XTsgICAgICAgICAgLyogUmUgQyAtIFJlIEQgKi8gXAotICB1ciAtPSB4WzE3ICsgaXhdOyAgICAgICAgICAgICAgLyogSW0gQSAtIEltIEIgKi8gXAotICB1aSA9IHVpIC0geFsyNSArIGl4XTsgICAgICAgICAgLyogSW0gQyAtIEltIEQgKi8gXAotICB5WyAyICsgaXldID0gdWkgKyB2cjsgICAgICAgICAgLyogUmUgQicgPSBJbSBDIC0gSW0gRCAgKyBSZSBBIC0gUmUgQiAqLyBcCi0gIHlbIDYgKyBpeV0gPSB2ciAtIHVpOyAgICAgICAgICAvKiBSZSBEJyA9IC1JbSBDICsgSW0gRCArIFJlIEEgLSBSZSBCICovIFwKLSAgeVsgMyArIGl5XSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLyAgXAotICB5WyA3ICsgaXldID0gdmkgKyB1cjsgICAgICAgICAgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KKyNpZm5kZWYgRlVOQ1RJT05fZmZ0XzE2IC8qIHdlIGNoZWNrLCBpZiBmZnRfMTYgKEZJWFBfREJMICopIGlzIG5vdCB5ZXQgZGVmaW5lZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotc3RhdGljIGNvbnN0IEZJWFBfU1RQIGZmdDE2X3cxNlsyXSA9ICB7IFNUQ1AoMHg3NjQxYWYzZCwgMHgzMGZiYzU0ZCksIFNUQ1AoMHgzMGZiYzU0ZCwgMHg3NjQxYWYzZCkgfTsKKy8qIFRoaXMgZGVmaW5lcyBwcmV2ZW50cyB0aGlzIGFycmF5IHRvIGJlIGRlY2xhcmVkIHR3aWNlLCBpZiAxNi1iaXQgZmZ0IGlzCisgKiBlbmFibGVkIHRvbyAqLworI2RlZmluZSBGVU5DVElPTl9EQVRBX2ZmdF8xNl93MTYKK3N0YXRpYyBjb25zdCBGSVhQX1NUUCBmZnQxNl93MTZbMl0gPSB7U1RDUCgweDc2NDFhZjNkLCAweDMwZmJjNTRkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RDUCgweDMwZmJjNTRkLCAweDc2NDFhZjNkKX07CiAKIExOS19TRUNUSU9OX0NPREVfTDEKLWlubGluZSB2b2lkIGZmdF8xNihGSVhQX0RCTCAqUkVTVFJJQ1QgeCkKLXsKLSAgRklYUF9EQkwgdnIsIHZpLCB1ciwgdWk7Ci0gIEZJWFBfREJMIHlbMzJdOworaW5saW5lIHZvaWQgZmZ0XzE2KEZJWFBfREJMICpSRVNUUklDVCB4KSB7CisgIEZJWFBfREJMIHZyLCB1cjsKKyAgRklYUF9EQkwgdnIyLCB1cjI7CisgIEZJWFBfREJMIHZyMywgdXIzOworICBGSVhQX0RCTCB2cjQsIHVyNDsKKyAgRklYUF9EQkwgdmksIHVpOworICBGSVhQX0RCTCB2aTIsIHVpMjsKKyAgRklYUF9EQkwgdmkzLCB1aTM7CiAKLSAgU1VNRElGRl9FSUdUSCh4LCB5LCAwLCAgMCwgdnIsIHZpLCB1ciwgdWkpOwotICBTVU1ESUZGX0VJR1RIKHgsIHksIDQsICA4LCB2ciwgdmksIHVyLCB1aSk7Ci0gIFNVTURJRkZfRUlHVEgoeCwgeSwgMiwgMTYsIHZyLCB2aSwgdXIsIHVpKTsKLSAgU1VNRElGRl9FSUdUSCh4LCB5LCA2LCAyNCwgdnIsIHZpLCB1ciwgdWkpOworICB2ciA9ICh4WzBdID4+IDEpICsgKHhbMTZdID4+IDEpOyAgICAgICAvKiBSZSBBICsgUmUgQiAqLworICB1ciA9ICh4WzFdID4+IDEpICsgKHhbMTddID4+IDEpOyAgICAgICAvKiBJbSBBICsgSW0gQiAqLworICB2aSA9ICh4WzhdIFNISUZUX0EpICsgKHhbMjRdIFNISUZUX0EpOyAvKiBSZSBDICsgUmUgRCAqLworICB1aSA9ICh4WzldIFNISUZUX0EpICsgKHhbMjVdIFNISUZUX0EpOyAvKiBJbSBDICsgSW0gRCAqLworICB4WzBdID0gdnIgKyAodmkgU0hJRlRfQik7ICAgICAgICAgICAgICAvKiBSZSBBJyA9IFJlQSArIFJlQiArUmVDICsgUmVEICovCisgIHhbMV0gPSB1ciArICh1aSBTSElGVF9CKTsgICAgICAgICAgICAgIC8qIEltIEEnID0gc3VtIG9mIGltYWcgdmFsdWVzICovCiAKLS8vIHh0MSA9ICAwCi0vLyB4dDIgPSAgOAotICB2ciA9IHlbIDhdOwotICB2aSA9IHlbIDldOwotICB1ciA9IHlbIDBdPj4xOwotICB1aSA9IHlbIDFdPj4xOwotICB4WyAwXSA9IHVyICsgKHZyPj4xKTsKLSAgeFsgMV0gPSB1aSArICh2aT4+MSk7Ci0gIHhbIDhdID0gdXIgLSAodnI+PjEpOwotICB4WyA5XSA9IHVpIC0gKHZpPj4xKTsKKyAgdnIyID0gKHhbNF0gPj4gMSkgKyAoeFsyMF0gPj4gMSk7IC8qIFJlIEEgKyBSZSBCICovCisgIHVyMiA9ICh4WzVdID4+IDEpICsgKHhbMjFdID4+IDEpOyAvKiBJbSBBICsgSW0gQiAqLwogCi0vLyB4dDEgPSAgNAotLy8geHQyID0gMTIKLSAgdnIgPSB5WzEzXTsKLSAgdmkgPSB5WzEyXTsKLSAgdXIgPSB5WyA0XT4+MTsKLSAgdWkgPSB5WyA1XT4+MTsKLSAgeFsgNF0gPSB1ciArICh2cj4+MSk7Ci0gIHhbIDVdID0gdWkgLSAodmk+PjEpOwotICB4WzEyXSA9IHVyIC0gKHZyPj4xKTsKLSAgeFsxM10gPSB1aSArICh2aT4+MSk7CisgIHhbNF0gPSB2ciAtICh2aSBTSElGVF9CKTsgLyogUmUgQycgPSAtKFJlQytSZUQpICsgKFJlQStSZUIpICovCisgIHhbNV0gPSB1ciAtICh1aSBTSElGVF9CKTsgLyogSW0gQycgPSAtSW0gQyAtSW0gRCArSW0gQSArSW0gQiAqLworICB2ciAtPSB4WzE2XTsgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCisgIHZpID0gKHZpIFNISUZUX0IpLXhbMjRdOyAgLyogUmUgQyAtIFJlIEQgKi8KKyAgdXIgLT0geFsxN107ICAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLworICB1aSA9ICh1aSBTSElGVF9CKS14WzI1XTsgIC8qIEltIEMgLSBJbSBEICovCiAKLS8vIHh0MSA9IDE2Ci0vLyB4dDIgPSAyNAotICB2ciA9IHlbMjRdOwotICB2aSA9IHlbMjVdOwotICB1ciA9IHlbMTZdPj4xOwotICB1aSA9IHlbMTddPj4xOwotICB4WzE2XSA9IHVyICsgKHZyPj4xKTsKLSAgeFsxN10gPSB1aSArICh2aT4+MSk7Ci0gIHhbMjRdID0gdXIgLSAodnI+PjEpOwotICB4WzI1XSA9IHVpIC0gKHZpPj4xKTsKKyAgdnIzID0gKHhbMl0gPj4gMSkgKyAoeFsxOF0gPj4gMSk7IC8qIFJlIEEgKyBSZSBCICovCisgIHVyMyA9ICh4WzNdID4+IDEpICsgKHhbMTldID4+IDEpOyAvKiBJbSBBICsgSW0gQiAqLwogCi0vLyB4dDEgPSAyMAotLy8geHQyID0gMjgKLSAgdnIgPSB5WzI5XTsKLSAgdmkgPSB5WzI4XTsKLSAgdXIgPSB5WzIwXT4+MTsKLSAgdWkgPSB5WzIxXT4+MTsKLSAgeFsyMF0gPSB1ciArICh2cj4+MSk7Ci0gIHhbMjFdID0gdWkgLSAodmk+PjEpOwotICB4WzI4XSA9IHVyIC0gKHZyPj4xKTsKLSAgeFsyOV0gPSB1aSArICh2aT4+MSk7CisgIHhbMl0gPSB1aSArIHZyOyAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCisgIHhbM10gPSB1ciAtIHZpOyAvKiBJbSBCJz0gLVJlIEMgKyBSZSBEICsgSW0gQSAtIEltIEIgKi8KKworICB2cjQgPSAoeFs2XSA+PiAxKSArICh4WzIyXSA+PiAxKTsgLyogUmUgQSArIFJlIEIgKi8KKyAgdXI0ID0gKHhbN10gPj4gMSkgKyAoeFsyM10gPj4gMSk7IC8qIEltIEEgKyBJbSBCICovCisKKyAgeFs2XSA9IHZyIC0gdWk7IC8qIFJlIEQnID0gLUltIEMgKyBJbSBEICsgUmUgQSAtIFJlIEIgKi8KKyAgeFs3XSA9IHZpICsgdXI7IC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCisKKyAgdmkyID0gKHhbMTJdIFNISUZUX0EpICsgKHhbMjhdIFNISUZUX0EpOyAvKiBSZSBDICsgUmUgRCAqLworICB1aTIgPSAoeFsxM10gU0hJRlRfQSkgKyAoeFsyOV0gU0hJRlRfQSk7IC8qIEltIEMgKyBJbSBEICovCisgIHhbOF0gPSB2cjIgKyAodmkyIFNISUZUX0IpOyAgICAgICAgICAgICAgLyogUmUgQScgPSBSZUEgKyBSZUIgK1JlQyArIFJlRCAqLworICB4WzldID0gdXIyICsgKHVpMiBTSElGVF9CKTsgICAgICAgICAgICAgIC8qIEltIEEnID0gc3VtIG9mIGltYWcgdmFsdWVzICovCisgIHhbMTJdID0gdnIyIC0gKHZpMiBTSElGVF9CKTsgICAgICAgICAgICAgLyogUmUgQycgPSAtKFJlQytSZUQpICsgKFJlQStSZUIpICovCisgIHhbMTNdID0gdXIyIC0gKHVpMiBTSElGVF9CKTsgICAgICAgICAgICAgLyogSW0gQycgPSAtSW0gQyAtSW0gRCArSW0gQSArSW0gQiAqLworICB2cjIgLT0geFsyMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCisgIHVyMiAtPSB4WzIxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW0gQSAtIEltIEIgKi8KKyAgdmkyID0gKHZpMiBTSElGVF9CKS14WzI4XTsgICAgICAgICAgICAgICAvKiBSZSBDIC0gUmUgRCAqLworICB1aTIgPSAodWkyIFNISUZUX0IpLXhbMjldOyAgICAgICAgICAgICAgIC8qIEltIEMgLSBJbSBEICovCisKKyAgdmkgPSAoeFsxMF0gU0hJRlRfQSkgKyAoeFsyNl0gU0hJRlRfQSk7IC8qIFJlIEMgKyBSZSBEICovCisgIHVpID0gKHhbMTFdIFNISUZUX0EpICsgKHhbMjddIFNISUZUX0EpOyAvKiBJbSBDICsgSW0gRCAqLworCisgIHhbMTBdID0gdWkyICsgdnIyOyAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCisgIHhbMTFdID0gdXIyIC0gdmkyOyAvKiBJbSBCJz0gLVJlIEMgKyBSZSBEICsgSW0gQSAtIEltIEIgKi8KKworICB2aTMgPSAoeFsxNF0gU0hJRlRfQSkgKyAoeFszMF0gU0hJRlRfQSk7IC8qIFJlIEMgKyBSZSBEICovCisgIHVpMyA9ICh4WzE1XSBTSElGVF9BKSArICh4WzMxXSBTSElGVF9BKTsgLyogSW0gQyArIEltIEQgKi8KKworICB4WzE0XSA9IHZyMiAtIHVpMjsgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLworICB4WzE1XSA9IHZpMiArIHVyMjsgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KKworICB4WzE2XSA9IHZyMyArICh2aSBTSElGVF9CKTsgLyogUmUgQScgPSBSZUEgKyBSZUIgK1JlQyArIFJlRCAqLworICB4WzE3XSA9IHVyMyArICh1aSBTSElGVF9CKTsgLyogSW0gQScgPSBzdW0gb2YgaW1hZyB2YWx1ZXMgKi8KKyAgeFsyMF0gPSB2cjMgLSAodmkgU0hJRlRfQik7IC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLworICB4WzIxXSA9IHVyMyAtICh1aSBTSElGVF9CKTsgLyogSW0gQycgPSAtSW0gQyAtSW0gRCArSW0gQSArSW0gQiAqLworICB2cjMgLT0geFsxOF07ICAgICAgICAgICAgICAgLyogUmUgQSAtIFJlIEIgKi8KKyAgdXIzIC09IHhbMTldOyAgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCisgIHZpID0gKHZpIFNISUZUX0IpLXhbMjZdOyAgICAvKiBSZSBDIC0gUmUgRCAqLworICB1aSA9ICh1aSBTSElGVF9CKS14WzI3XTsgICAgLyogSW0gQyAtIEltIEQgKi8KKyAgeFsxOF0gPSB1aSArIHZyMzsgICAgICAgICAgIC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KKyAgeFsxOV0gPSB1cjMgLSB2aTsgICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLworCisgIHhbMjRdID0gdnI0ICsgKHZpMyBTSElGVF9CKTsgLyogUmUgQScgPSBSZUEgKyBSZUIgK1JlQyArIFJlRCAqLworICB4WzI4XSA9IHZyNCAtICh2aTMgU0hJRlRfQik7IC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLworICB4WzI1XSA9IHVyNCArICh1aTMgU0hJRlRfQik7IC8qIEltIEEnID0gc3VtIG9mIGltYWcgdmFsdWVzICovCisgIHhbMjldID0gdXI0IC0gKHVpMyBTSElGVF9CKTsgLyogSW0gQycgPSAtSW0gQyAtSW0gRCArSW0gQSArSW0gQiAqLworICB2cjQgLT0geFsyMl07ICAgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCisgIHVyNCAtPSB4WzIzXTsgICAgICAgICAgICAgICAgLyogSW0gQSAtIEltIEIgKi8KKworICB4WzIyXSA9IHZyMyAtIHVpOyAvKiBSZSBEJyA9IC1JbSBDICsgSW0gRCArIFJlIEEgLSBSZSBCICovCisgIHhbMjNdID0gdmkgKyB1cjM7IC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCisKKyAgdmkzID0gKHZpMyBTSElGVF9CKS14WzMwXTsgLyogUmUgQyAtIFJlIEQgKi8KKyAgdWkzID0gKHVpMyBTSElGVF9CKS14WzMxXTsgLyogSW0gQyAtIEltIEQgKi8KKyAgeFsyNl0gPSB1aTMgKyB2cjQ7ICAgICAgICAgLyogUmUgQicgPSBJbSBDIC0gSW0gRCAgKyBSZSBBIC0gUmUgQiAqLworICB4WzMwXSA9IHZyNCAtIHVpMzsgICAgICAgICAvKiBSZSBEJyA9IC1JbSBDICsgSW0gRCArIFJlIEEgLSBSZSBCICovCisgIHhbMjddID0gdXI0IC0gdmkzOyAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLworICB4WzMxXSA9IHZpMyArIHVyNDsgICAgICAgICAvKiBJbSBEJz0gUmUgQyAtIFJlIEQgKyBJbSBBIC0gSW0gQiAqLworCisgIC8vIHh0MSA9ICAwCisgIC8vIHh0MiA9ICA4CisgIHZyID0geFs4XTsKKyAgdmkgPSB4WzldOworICB1ciA9IHhbMF0gPj4gMTsKKyAgdWkgPSB4WzFdID4+IDE7CisgIHhbMF0gPSB1ciArICh2ciA+PiAxKTsKKyAgeFsxXSA9IHVpICsgKHZpID4+IDEpOworICB4WzhdID0gdXIgLSAodnIgPj4gMSk7CisgIHhbOV0gPSB1aSAtICh2aSA+PiAxKTsKKworICAvLyB4dDEgPSAgNAorICAvLyB4dDIgPSAxMgorICB2ciA9IHhbMTNdOworICB2aSA9IHhbMTJdOworICB1ciA9IHhbNF0gPj4gMTsKKyAgdWkgPSB4WzVdID4+IDE7CisgIHhbNF0gPSB1ciArICh2ciA+PiAxKTsKKyAgeFs1XSA9IHVpIC0gKHZpID4+IDEpOworICB4WzEyXSA9IHVyIC0gKHZyID4+IDEpOworICB4WzEzXSA9IHVpICsgKHZpID4+IDEpOworCisgIC8vIHh0MSA9IDE2CisgIC8vIHh0MiA9IDI0CisgIHZyID0geFsyNF07CisgIHZpID0geFsyNV07CisgIHVyID0geFsxNl0gPj4gMTsKKyAgdWkgPSB4WzE3XSA+PiAxOworICB4WzE2XSA9IHVyICsgKHZyID4+IDEpOworICB4WzE3XSA9IHVpICsgKHZpID4+IDEpOworICB4WzI0XSA9IHVyIC0gKHZyID4+IDEpOworICB4WzI1XSA9IHVpIC0gKHZpID4+IDEpOworCisgIC8vIHh0MSA9IDIwCisgIC8vIHh0MiA9IDI4CisgIHZyID0geFsyOV07CisgIHZpID0geFsyOF07CisgIHVyID0geFsyMF0gPj4gMTsKKyAgdWkgPSB4WzIxXSA+PiAxOworICB4WzIwXSA9IHVyICsgKHZyID4+IDEpOworICB4WzIxXSA9IHVpIC0gKHZpID4+IDEpOworICB4WzI4XSA9IHVyIC0gKHZyID4+IDEpOworICB4WzI5XSA9IHVpICsgKHZpID4+IDEpOwogCiAgIC8vIHh0MSA9ICAyCi0vLyB4dDIgPSAxMAotICBTVU1ESUZGX1BJRk9VUlRIKHZpLCB2ciwgeVsxMF0sIHlbMTFdKQotICAvL3ZyID0gZk11bHREaXYyKCh5WzExXSArIHlbMTBdKSxXX1BpRk9VUlRIKTsKLSAgLy92aSA9IGZNdWx0RGl2MigoeVsxMV0gLSB5WzEwXSksV19QaUZPVVJUSCk7Ci0gIHVyID0geVsgMl07Ci0gIHVpID0geVsgM107Ci0gIHhbIDJdID0gKHVyPj4xKSArIHZyOwotICB4WyAzXSA9ICh1aT4+MSkgKyB2aTsKLSAgeFsxMF0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbMTFdID0gKHVpPj4xKSAtIHZpOworICAvLyB4dDIgPSAxMAorICBTVU1ESUZGX1BJRk9VUlRIKHZpLCB2ciwgeFsxMF0sIHhbMTFdKQorICAvLyB2ciA9IGZNdWx0RGl2MigoeFsxMV0gKyB4WzEwXSksV19QaUZPVVJUSCk7CisgIC8vIHZpID0gZk11bHREaXYyKCh4WzExXSAtIHhbMTBdKSxXX1BpRk9VUlRIKTsKKyAgdXIgPSB4WzJdOworICB1aSA9IHhbM107CisgIHhbMl0gPSAodXIgPj4gMSkgKyB2cjsKKyAgeFszXSA9ICh1aSA+PiAxKSArIHZpOworICB4WzEwXSA9ICh1ciA+PiAxKSAtIHZyOworICB4WzExXSA9ICh1aSA+PiAxKSAtIHZpOwogCi0vLyB4dDEgPSAgNgotLy8geHQyID0gMTQKLSAgU1VNRElGRl9QSUZPVVJUSCh2ciwgdmksIHlbMTRdLCB5WzE1XSkKLSAgdXIgPSB5WyA2XTsKLSAgdWkgPSB5WyA3XTsKLSAgeFsgNl0gPSAodXI+PjEpICsgdnI7Ci0gIHhbIDddID0gKHVpPj4xKSAtIHZpOwotICB4WzE0XSA9ICh1cj4+MSkgLSB2cjsKLSAgeFsxNV0gPSAodWk+PjEpICsgdmk7CisgIC8vIHh0MSA9ICA2CisgIC8vIHh0MiA9IDE0CisgIFNVTURJRkZfUElGT1VSVEgodnIsIHZpLCB4WzE0XSwgeFsxNV0pCisgIHVyID0geFs2XTsKKyAgdWkgPSB4WzddOworICB4WzZdID0gKHVyID4+IDEpICsgdnI7CisgIHhbN10gPSAodWkgPj4gMSkgLSB2aTsKKyAgeFsxNF0gPSAodXIgPj4gMSkgLSB2cjsKKyAgeFsxNV0gPSAodWkgPj4gMSkgKyB2aTsKIAotLy8geHQxID0gMTgKLS8vIHh0MiA9IDI2Ci0gIFNVTURJRkZfUElGT1VSVEgodmksIHZyLCB5WzI2XSwgeVsyN10pCi0gIHVyID0geVsxOF07Ci0gIHVpID0geVsxOV07Ci0gIHhbMThdID0gKHVyPj4xKSArIHZyOwotICB4WzE5XSA9ICh1aT4+MSkgKyB2aTsKLSAgeFsyNl0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbMjddID0gKHVpPj4xKSAtIHZpOworICAvLyB4dDEgPSAxOAorICAvLyB4dDIgPSAyNgorICBTVU1ESUZGX1BJRk9VUlRIKHZpLCB2ciwgeFsyNl0sIHhbMjddKQorICB1ciA9IHhbMThdOworICB1aSA9IHhbMTldOworICB4WzE4XSA9ICh1ciA+PiAxKSArIHZyOworICB4WzE5XSA9ICh1aSA+PiAxKSArIHZpOworICB4WzI2XSA9ICh1ciA+PiAxKSAtIHZyOworICB4WzI3XSA9ICh1aSA+PiAxKSAtIHZpOwogCi0vLyB4dDEgPSAyMgotLy8geHQyID0gMzAKLSAgU1VNRElGRl9QSUZPVVJUSCh2ciwgdmksIHlbMzBdLCB5WzMxXSkKLSAgdXIgPSB5WzIyXTsKLSAgdWkgPSB5WzIzXTsKLSAgeFsyMl0gPSAodXI+PjEpICsgdnI7Ci0gIHhbMjNdID0gKHVpPj4xKSAtIHZpOwotICB4WzMwXSA9ICh1cj4+MSkgLSB2cjsKLSAgeFszMV0gPSAodWk+PjEpICsgdmk7CisgIC8vIHh0MSA9IDIyCisgIC8vIHh0MiA9IDMwCisgIFNVTURJRkZfUElGT1VSVEgodnIsIHZpLCB4WzMwXSwgeFszMV0pCisgIHVyID0geFsyMl07CisgIHVpID0geFsyM107CisgIHhbMjJdID0gKHVyID4+IDEpICsgdnI7CisgIHhbMjNdID0gKHVpID4+IDEpIC0gdmk7CisgIHhbMzBdID0gKHVyID4+IDEpIC0gdnI7CisgIHhbMzFdID0gKHVpID4+IDEpICsgdmk7CiAKLS8vIHh0MSA9ICAwCi0vLyB4dDIgPSAxNgorICAvLyB4dDEgPSAgMAorICAvLyB4dDIgPSAxNgogICB2ciA9IHhbMTZdOwogICB2aSA9IHhbMTddOwotICB1ciA9IHhbIDBdPj4xOwotICB1aSA9IHhbIDFdPj4xOwotICB4WyAwXSA9IHVyICsgKHZyPj4xKTsKLSAgeFsgMV0gPSB1aSArICh2aT4+MSk7Ci0gIHhbMTZdID0gdXIgLSAodnI+PjEpOwotICB4WzE3XSA9IHVpIC0gKHZpPj4xKTsKKyAgdXIgPSB4WzBdID4+IDE7CisgIHVpID0geFsxXSA+PiAxOworICB4WzBdID0gdXIgKyAodnIgPj4gMSk7CisgIHhbMV0gPSB1aSArICh2aSA+PiAxKTsKKyAgeFsxNl0gPSB1ciAtICh2ciA+PiAxKTsKKyAgeFsxN10gPSB1aSAtICh2aSA+PiAxKTsKIAotLy8geHQxID0gIDgKLS8vIHh0MiA9IDI0CisgIC8vIHh0MSA9ICA4CisgIC8vIHh0MiA9IDI0CiAgIHZpID0geFsyNF07CiAgIHZyID0geFsyNV07Ci0gIHVyID0geFsgOF0+PjE7Ci0gIHVpID0geFsgOV0+PjE7Ci0gIHhbIDhdID0gdXIgKyAodnI+PjEpOwotICB4WyA5XSA9IHVpIC0gKHZpPj4xKTsKLSAgeFsyNF0gPSB1ciAtICh2cj4+MSk7Ci0gIHhbMjVdID0gdWkgKyAodmk+PjEpOworICB1ciA9IHhbOF0gPj4gMTsKKyAgdWkgPSB4WzldID4+IDE7CisgIHhbOF0gPSB1ciArICh2ciA+PiAxKTsKKyAgeFs5XSA9IHVpIC0gKHZpID4+IDEpOworICB4WzI0XSA9IHVyIC0gKHZyID4+IDEpOworICB4WzI1XSA9IHVpICsgKHZpID4+IDEpOwogCi0vLyB4dDEgPSAgMgotLy8geHQyID0gMTgKKyAgLy8geHQxID0gIDIKKyAgLy8geHQyID0gMTgKICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzE5XSwgeFsxOF0sIGZmdDE2X3cxNlswXSk7Ci0gIHVyID0geFsgMl07Ci0gIHVpID0geFsgM107Ci0gIHhbIDJdID0gKHVyPj4xKSArIHZyOwotICB4WyAzXSA9ICh1aT4+MSkgKyB2aTsKLSAgeFsxOF0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbMTldID0gKHVpPj4xKSAtIHZpOworICB1ciA9IHhbMl07CisgIHVpID0geFszXTsKKyAgeFsyXSA9ICh1ciA+PiAxKSArIHZyOworICB4WzNdID0gKHVpID4+IDEpICsgdmk7CisgIHhbMThdID0gKHVyID4+IDEpIC0gdnI7CisgIHhbMTldID0gKHVpID4+IDEpIC0gdmk7CiAKLS8vIHh0MSA9IDEwCi0vLyB4dDIgPSAyNgorICAvLyB4dDEgPSAxMAorICAvLyB4dDIgPSAyNgogICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbMjddLCB4WzI2XSwgZmZ0MTZfdzE2WzBdKTsKICAgdXIgPSB4WzEwXTsKICAgdWkgPSB4WzExXTsKLSAgeFsxMF0gPSAodXI+PjEpICsgdnI7Ci0gIHhbMTFdID0gKHVpPj4xKSAtIHZpOwotICB4WzI2XSA9ICh1cj4+MSkgLSB2cjsKLSAgeFsyN10gPSAodWk+PjEpICsgdmk7CisgIHhbMTBdID0gKHVyID4+IDEpICsgdnI7CisgIHhbMTFdID0gKHVpID4+IDEpIC0gdmk7CisgIHhbMjZdID0gKHVyID4+IDEpIC0gdnI7CisgIHhbMjddID0gKHVpID4+IDEpICsgdmk7CiAKLS8vIHh0MSA9ICA0Ci0vLyB4dDIgPSAyMAorICAvLyB4dDEgPSAgNAorICAvLyB4dDIgPSAyMAogICBTVU1ESUZGX1BJRk9VUlRIKHZpLCB2ciwgeFsyMF0sIHhbMjFdKQotICB1ciA9IHhbIDRdOwotICB1aSA9IHhbIDVdOwotICB4WyA0XSA9ICh1cj4+MSkgKyB2cjsKLSAgeFsgNV0gPSAodWk+PjEpICsgdmk7Ci0gIHhbMjBdID0gKHVyPj4xKSAtIHZyOwotICB4WzIxXSA9ICh1aT4+MSkgLSB2aTsKKyAgdXIgPSB4WzRdOworICB1aSA9IHhbNV07CisgIHhbNF0gPSAodXIgPj4gMSkgKyB2cjsKKyAgeFs1XSA9ICh1aSA+PiAxKSArIHZpOworICB4WzIwXSA9ICh1ciA+PiAxKSAtIHZyOworICB4WzIxXSA9ICh1aSA+PiAxKSAtIHZpOwogCi0vLyB4dDEgPSAxMgotLy8geHQyID0gMjgKKyAgLy8geHQxID0gMTIKKyAgLy8geHQyID0gMjgKICAgU1VNRElGRl9QSUZPVVJUSCh2ciwgdmksIHhbMjhdLCB4WzI5XSkKICAgdXIgPSB4WzEyXTsKICAgdWkgPSB4WzEzXTsKLSAgeFsxMl0gPSAodXI+PjEpICsgdnI7Ci0gIHhbMTNdID0gKHVpPj4xKSAtIHZpOwotICB4WzI4XSA9ICh1cj4+MSkgLSB2cjsKLSAgeFsyOV0gPSAodWk+PjEpICsgdmk7CisgIHhbMTJdID0gKHVyID4+IDEpICsgdnI7CisgIHhbMTNdID0gKHVpID4+IDEpIC0gdmk7CisgIHhbMjhdID0gKHVyID4+IDEpIC0gdnI7CisgIHhbMjldID0gKHVpID4+IDEpICsgdmk7CiAKLS8vIHh0MSA9ICA2Ci0vLyB4dDIgPSAyMgorICAvLyB4dDEgPSAgNgorICAvLyB4dDIgPSAyMgogICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbMjNdLCB4WzIyXSwgZmZ0MTZfdzE2WzFdKTsKLSAgdXIgPSB4WyA2XTsKLSAgdWkgPSB4WyA3XTsKLSAgeFsgNl0gPSAodXI+PjEpICsgdnI7Ci0gIHhbIDddID0gKHVpPj4xKSArIHZpOwotICB4WzIyXSA9ICh1cj4+MSkgLSB2cjsKLSAgeFsyM10gPSAodWk+PjEpIC0gdmk7CisgIHVyID0geFs2XTsKKyAgdWkgPSB4WzddOworICB4WzZdID0gKHVyID4+IDEpICsgdnI7CisgIHhbN10gPSAodWkgPj4gMSkgKyB2aTsKKyAgeFsyMl0gPSAodXIgPj4gMSkgLSB2cjsKKyAgeFsyM10gPSAodWkgPj4gMSkgLSB2aTsKIAotLy8geHQxID0gMTQKLS8vIHh0MiA9IDMwCisgIC8vIHh0MSA9IDE0CisgIC8vIHh0MiA9IDMwCiAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFszMV0sIHhbMzBdLCBmZnQxNl93MTZbMV0pOwogICB1ciA9IHhbMTRdOwogICB1aSA9IHhbMTVdOwotICB4WzE0XSA9ICh1cj4+MSkgKyB2cjsKLSAgeFsxNV0gPSAodWk+PjEpIC0gdmk7Ci0gIHhbMzBdID0gKHVyPj4xKSAtIHZyOwotICB4WzMxXSA9ICh1aT4+MSkgKyB2aTsKKyAgeFsxNF0gPSAodXIgPj4gMSkgKyB2cjsKKyAgeFsxNV0gPSAodWkgPj4gMSkgLSB2aTsKKyAgeFszMF0gPSAodXIgPj4gMSkgLSB2cjsKKyAgeFszMV0gPSAodWkgPj4gMSkgKyB2aTsKIH0KKyNlbmRpZiAvKiBGVU5DVElPTl9mZnRfMTYgKi8KIAogI2lmbmRlZiBGVU5DVElPTl9mZnRfMzIKLXN0YXRpYyBjb25zdCBGSVhQX1NUUCBmZnQzMl93MzJbNl0gPQotewotICBTVENQICgweDc2NDFhZjNkLCAweDMwZmJjNTRkKSwgU1RDUCgweDMwZmJjNTRkLCAweDc2NDFhZjNkKSwgU1RDUCgweDdkOGE1ZjQwLCAweDE4ZjhiODNjKSwKLSAgU1RDUCAoMHg2YTZkOThhNCwgMHg0NzFjZWNlNyksIFNUQ1AoMHg0NzFjZWNlNywgMHg2YTZkOThhNCksIFNUQ1AoMHgxOGY4YjgzYywgMHg3ZDhhNWY0MCkKLX07Ci0KLUxOS19TRUNUSU9OX0NPREVfTDEKLWlubGluZSB2b2lkIGZmdF8zMihGSVhQX0RCTCAqeCkKLXsKLQorc3RhdGljIGNvbnN0IEZJWFBfU1RQIGZmdDMyX3czMls2XSA9IHsKKyAgICBTVENQKDB4NzY0MWFmM2QsIDB4MzBmYmM1NGQpLCBTVENQKDB4MzBmYmM1NGQsIDB4NzY0MWFmM2QpLAorICAgIFNUQ1AoMHg3ZDhhNWY0MCwgMHgxOGY4YjgzYyksIFNUQ1AoMHg2YTZkOThhNCwgMHg0NzFjZWNlNyksCisgICAgU1RDUCgweDQ3MWNlY2U3LCAweDZhNmQ5OGE0KSwgU1RDUCgweDE4ZjhiODNjLCAweDdkOGE1ZjQwKX07CiAjZGVmaW5lIFdfUGlGT1VSVEggU1RDKDB4NWE4Mjc5OWEpCiAKLSAgRklYUF9EQkwgdnIsdmksdXIsdWk7Ci0gIEZJWFBfREJMIHlbNjRdOwotCitMTktfU0VDVElPTl9DT0RFX0wxCitpbmxpbmUgdm9pZCBmZnRfMzIoRklYUF9EQkwgKmNvbnN0IF94KSB7CiAgIC8qCiAgICAqIDErMiBzdGFnZSByYWRpeCA0CiAgICAqLwogCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gIC8vIGkgPSAwCi0gIHZyID0gKHhbIDBdICsgeFszMl0pPj4xOyAgLyogUmUgQSArIFJlIEIgKi8KLSAgdmkgPSAoeFsxNl0gKyB4WzQ4XSk7ICAgICAvKiBSZSBDICsgUmUgRCAqLwotICB1ciA9ICh4WyAxXSArIHhbMzNdKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCi0gIHVpID0gKHhbMTddICsgeFs0OV0pOyAgICAgLyogSW0gQyArIEltIEQgKi8KLQotICB5WyAwXSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KLSAgeVsgNF0gPSB2ciAtICh2aT4+MSk7ICAgICAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KLSAgeVsgMV0gPSB1ciArICh1aT4+MSk7ICAgICAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLwotICB5WyA1XSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KLQotICB2ciAtPSB4WzMyXTsgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCi0gIHZpID0gKHZpPj4xKSAtIHhbNDhdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KLSAgdXIgLT0geFszM107ICAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLwotICB1aSA9ICh1aT4+MSkgLSB4WzQ5XTsgICAgIC8qIEltIEMgLSBJbSBEICovCi0KLSAgeVsgMl0gPSB1aSArIHZyOyAgICAgICAgICAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCi0gIHlbIDZdID0gdnIgLSB1aTsgICAgICAgICAgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLwotICB5WyAzXSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwotICB5WyA3XSA9IHZpICsgdXI7ICAgICAgICAgIC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCi0KLSAgLy9pPTgKLSAgdnIgPSAoeFsgOF0gKyB4WzQwXSk+PjE7ICAvKiBSZSBBICsgUmUgQiAqLwotICB2aSA9ICh4WzI0XSArIHhbNTZdKTsgICAgIC8qIFJlIEMgKyBSZSBEICovCi0gIHVyID0gKHhbIDldICsgeFs0MV0pPj4xOyAgLyogSW0gQSArIEltIEIgKi8KLSAgdWkgPSAoeFsyNV0gKyB4WzU3XSk7ICAgICAvKiBJbSBDICsgSW0gRCAqLwotCi0gIHlbIDhdID0gdnIgKyAodmk+PjEpOyAgICAgLyogUmUgQScgPSBSZUEgKyBSZUIgK1JlQyArIFJlRCAqLwotICB5WzEyXSA9IHZyIC0gKHZpPj4xKTsgICAgIC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLwotICB5WyA5XSA9IHVyICsgKHVpPj4xKTsgICAgIC8qIEltIEEnID0gc3VtIG9mIGltYWcgdmFsdWVzICovCi0gIHlbMTNdID0gdXIgLSAodWk+PjEpOyAgICAgLyogSW0gQycgPSAtSW0gQyAtSW0gRCArSW0gQSArSW0gQiAqLwotCi0gIHZyIC09IHhbNDBdOyAgICAgICAgICAgICAgLyogUmUgQSAtIFJlIEIgKi8KLSAgdmkgPSAodmk+PjEpIC0geFs1Nl07ICAgICAvKiBSZSBDIC0gUmUgRCAqLwotICB1ciAtPSB4WzQxXTsgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCi0gIHVpID0gKHVpPj4xKSAtIHhbNTddOyAgICAgLyogSW0gQyAtIEltIEQgKi8KLQotICB5WzEwXSA9IHVpICsgdnI7ICAgICAgICAgIC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KLSAgeVsxNF0gPSB2ciAtIHVpOyAgICAgICAgICAvKiBSZSBEJyA9IC1JbSBDICsgSW0gRCArIFJlIEEgLSBSZSBCICovCi0gIHlbMTFdID0gdXIgLSB2aTsgICAgICAgICAgLyogSW0gQic9IC1SZSBDICsgUmUgRCArIEltIEEgLSBJbSBCICovCi0gIHlbMTVdID0gdmkgKyB1cjsgICAgICAgICAgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KLQotICAvL2k9MTYKLSAgdnIgPSAoeFsgNF0gKyB4WzM2XSk+PjE7ICAvKiBSZSBBICsgUmUgQiAqLwotICB2aSA9ICh4WzIwXSArIHhbNTJdKTsgICAgIC8qIFJlIEMgKyBSZSBEICovCi0gIHVyID0gKHhbIDVdICsgeFszN10pPj4xOyAgLyogSW0gQSArIEltIEIgKi8KLSAgdWkgPSAoeFsyMV0gKyB4WzUzXSk7ICAgICAvKiBJbSBDICsgSW0gRCAqLwotCi0gIHlbMTZdID0gdnIgKyAodmk+PjEpOyAgICAgLyogUmUgQScgPSBSZUEgKyBSZUIgK1JlQyArIFJlRCAqLwotICB5WzIwXSA9IHZyIC0gKHZpPj4xKTsgICAgIC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLwotICB5WzE3XSA9IHVyICsgKHVpPj4xKTsgICAgIC8qIEltIEEnID0gc3VtIG9mIGltYWcgdmFsdWVzICovCi0gIHlbMjFdID0gdXIgLSAodWk+PjEpOyAgICAgLyogSW0gQycgPSAtSW0gQyAtSW0gRCArSW0gQSArSW0gQiAqLwotCi0gIHZyIC09IHhbMzZdOyAgICAgICAgICAgICAgLyogUmUgQSAtIFJlIEIgKi8KLSAgdmkgPSAodmk+PjEpIC0geFs1Ml07ICAgICAvKiBSZSBDIC0gUmUgRCAqLwotICB1ciAtPSB4WzM3XTsgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCi0gIHVpID0gKHVpPj4xKSAtIHhbNTNdOyAgICAgLyogSW0gQyAtIEltIEQgKi8KLQotICB5WzE4XSA9IHVpICsgdnI7ICAgICAgICAgIC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KLSAgeVsyMl0gPSB2ciAtIHVpOyAgICAgICAgICAvKiBSZSBEJyA9IC1JbSBDICsgSW0gRCArIFJlIEEgLSBSZSBCICovCi0gIHlbMTldID0gdXIgLSB2aTsgICAgICAgICAgLyogSW0gQic9IC1SZSBDICsgUmUgRCArIEltIEEgLSBJbSBCICovCi0gIHlbMjNdID0gdmkgKyB1cjsgICAgICAgICAgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KLQotICAvL2k9MjQKLSAgdnIgPSAoeFsxMl0gKyB4WzQ0XSk+PjE7ICAvKiBSZSBBICsgUmUgQiAqLwotICB2aSA9ICh4WzI4XSArIHhbNjBdKTsgICAgIC8qIFJlIEMgKyBSZSBEICovCi0gIHVyID0gKHhbMTNdICsgeFs0NV0pPj4xOyAgLyogSW0gQSArIEltIEIgKi8KLSAgdWkgPSAoeFsyOV0gKyB4WzYxXSk7ICAgICAvKiBJbSBDICsgSW0gRCAqLwotCi0gIHlbMjRdID0gdnIgKyAodmk+PjEpOyAgICAgLyogUmUgQScgPSBSZUEgKyBSZUIgK1JlQyArIFJlRCAqLwotICB5WzI4XSA9IHZyIC0gKHZpPj4xKTsgICAgIC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLwotICB5WzI1XSA9IHVyICsgKHVpPj4xKTsgICAgIC8qIEltIEEnID0gc3VtIG9mIGltYWcgdmFsdWVzICovCi0gIHlbMjldID0gdXIgLSAodWk+PjEpOyAgICAgLyogSW0gQycgPSAtSW0gQyAtSW0gRCArSW0gQSArSW0gQiAqLwotCi0gIHZyIC09IHhbNDRdOyAgICAgICAgICAgICAgLyogUmUgQSAtIFJlIEIgKi8KLSAgdmkgPSAodmk+PjEpIC0geFs2MF07ICAgICAvKiBSZSBDIC0gUmUgRCAqLwotICB1ciAtPSB4WzQ1XTsgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCi0gIHVpID0gKHVpPj4xKSAtIHhbNjFdOyAgICAgLyogSW0gQyAtIEltIEQgKi8KLQotICB5WzI2XSA9IHVpICsgdnI7ICAgICAgICAgIC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KLSAgeVszMF0gPSB2ciAtIHVpOyAgICAgICAgICAvKiBSZSBEJyA9IC1JbSBDICsgSW0gRCArIFJlIEEgLSBSZSBCICovCi0gIHlbMjddID0gdXIgLSB2aTsgICAgICAgICAgLyogSW0gQic9IC1SZSBDICsgUmUgRCArIEltIEEgLSBJbSBCICovCi0gIHlbMzFdID0gdmkgKyB1cjsgICAgICAgICAgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KLQotICAvLyBpID0gMzIKLSAgdnIgPSAoeFsgMl0gKyB4WzM0XSk+PjE7ICAvKiBSZSBBICsgUmUgQiAqLwotICB2aSA9ICh4WzE4XSArIHhbNTBdKTsgICAgIC8qIFJlIEMgKyBSZSBEICovCi0gIHVyID0gKHhbIDNdICsgeFszNV0pPj4xOyAgLyogSW0gQSArIEltIEIgKi8KLSAgdWkgPSAoeFsxOV0gKyB4WzUxXSk7ICAgICAvKiBJbSBDICsgSW0gRCAqLwotCi0gIHlbMzJdID0gdnIgKyAodmk+PjEpOyAgICAgLyogUmUgQScgPSBSZUEgKyBSZUIgK1JlQyArIFJlRCAqLwotICB5WzM2XSA9IHZyIC0gKHZpPj4xKTsgICAgIC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLwotICB5WzMzXSA9IHVyICsgKHVpPj4xKTsgICAgIC8qIEltIEEnID0gc3VtIG9mIGltYWcgdmFsdWVzICovCi0gIHlbMzddID0gdXIgLSAodWk+PjEpOyAgICAgLyogSW0gQycgPSAtSW0gQyAtSW0gRCArSW0gQSArSW0gQiAqLwotCi0gIHZyIC09IHhbMzRdOyAgICAgICAgICAgICAgLyogUmUgQSAtIFJlIEIgKi8KLSAgdmkgPSAodmk+PjEpIC0geFs1MF07ICAgICAvKiBSZSBDIC0gUmUgRCAqLwotICB1ciAtPSB4WzM1XTsgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCi0gIHVpID0gKHVpPj4xKSAtIHhbNTFdOyAgICAgLyogSW0gQyAtIEltIEQgKi8KLQotICB5WzM0XSA9IHVpICsgdnI7ICAgICAgICAgIC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KLSAgeVszOF0gPSB2ciAtIHVpOyAgICAgICAgICAvKiBSZSBEJyA9IC1JbSBDICsgSW0gRCArIFJlIEEgLSBSZSBCICovCi0gIHlbMzVdID0gdXIgLSB2aTsgICAgICAgICAgLyogSW0gQic9IC1SZSBDICsgUmUgRCArIEltIEEgLSBJbSBCICovCi0gIHlbMzldID0gdmkgKyB1cjsgICAgICAgICAgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KLQotICAvL2k9NDAKLSAgdnIgPSAoeFsxMF0gKyB4WzQyXSk+PjE7ICAvKiBSZSBBICsgUmUgQiAqLwotICB2aSA9ICh4WzI2XSArIHhbNThdKTsgICAgIC8qIFJlIEMgKyBSZSBEICovCi0gIHVyID0gKHhbMTFdICsgeFs0M10pPj4xOyAgLyogSW0gQSArIEltIEIgKi8KLSAgdWkgPSAoeFsyN10gKyB4WzU5XSk7ICAgICAvKiBJbSBDICsgSW0gRCAqLwotCi0gIHlbNDBdID0gdnIgKyAodmk+PjEpOyAgICAgLyogUmUgQScgPSBSZUEgKyBSZUIgK1JlQyArIFJlRCAqLwotICB5WzQ0XSA9IHZyIC0gKHZpPj4xKTsgICAgIC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLwotICB5WzQxXSA9IHVyICsgKHVpPj4xKTsgICAgIC8qIEltIEEnID0gc3VtIG9mIGltYWcgdmFsdWVzICovCi0gIHlbNDVdID0gdXIgLSAodWk+PjEpOyAgICAgLyogSW0gQycgPSAtSW0gQyAtSW0gRCArSW0gQSArSW0gQiAqLwotCi0gIHZyIC09IHhbNDJdOyAgICAgICAgICAgICAgLyogUmUgQSAtIFJlIEIgKi8KLSAgdmkgPSAodmk+PjEpIC0geFs1OF07ICAgICAvKiBSZSBDIC0gUmUgRCAqLwotICB1ciAtPSB4WzQzXTsgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCi0gIHVpID0gKHVpPj4xKSAtIHhbNTldOyAgICAgLyogSW0gQyAtIEltIEQgKi8KLQotICB5WzQyXSA9IHVpICsgdnI7ICAgICAgICAgIC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KLSAgeVs0Nl0gPSB2ciAtIHVpOyAgICAgICAgICAvKiBSZSBEJyA9IC1JbSBDICsgSW0gRCArIFJlIEEgLSBSZSBCICovCi0gIHlbNDNdID0gdXIgLSB2aTsgICAgICAgICAgLyogSW0gQic9IC1SZSBDICsgUmUgRCArIEltIEEgLSBJbSBCICovCi0gIHlbNDddID0gdmkgKyB1cjsgICAgICAgICAgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KLQotICAvL2k9NDgKLSAgdnIgPSAoeFsgNl0gKyB4WzM4XSk+PjE7ICAvKiBSZSBBICsgUmUgQiAqLwotICB2aSA9ICh4WzIyXSArIHhbNTRdKTsgICAgIC8qIFJlIEMgKyBSZSBEICovCi0gIHVyID0gKHhbIDddICsgeFszOV0pPj4xOyAgLyogSW0gQSArIEltIEIgKi8KLSAgdWkgPSAoeFsyM10gKyB4WzU1XSk7ICAgICAvKiBJbSBDICsgSW0gRCAqLwotCi0gIHlbNDhdID0gdnIgKyAodmk+PjEpOyAgICAgLyogUmUgQScgPSBSZUEgKyBSZUIgK1JlQyArIFJlRCAqLwotICB5WzUyXSA9IHZyIC0gKHZpPj4xKTsgICAgIC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLwotICB5WzQ5XSA9IHVyICsgKHVpPj4xKTsgICAgIC8qIEltIEEnID0gc3VtIG9mIGltYWcgdmFsdWVzICovCi0gIHlbNTNdID0gdXIgLSAodWk+PjEpOyAgICAgLyogSW0gQycgPSAtSW0gQyAtSW0gRCArSW0gQSArSW0gQiAqLwotCi0gIHZyIC09IHhbMzhdOyAgICAgICAgICAgICAgLyogUmUgQSAtIFJlIEIgKi8KLSAgdmkgPSAodmk+PjEpIC0geFs1NF07ICAgICAvKiBSZSBDIC0gUmUgRCAqLwotICB1ciAtPSB4WzM5XTsgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCi0gIHVpID0gKHVpPj4xKSAtIHhbNTVdOyAgICAgLyogSW0gQyAtIEltIEQgKi8KLQotICB5WzUwXSA9IHVpICsgdnI7ICAgICAgICAgIC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KLSAgeVs1NF0gPSB2ciAtIHVpOyAgICAgICAgICAvKiBSZSBEJyA9IC1JbSBDICsgSW0gRCArIFJlIEEgLSBSZSBCICovCi0gIHlbNTFdID0gdXIgLSB2aTsgICAgICAgICAgLyogSW0gQic9IC1SZSBDICsgUmUgRCArIEltIEEgLSBJbSBCICovCi0gIHlbNTVdID0gdmkgKyB1cjsgICAgICAgICAgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KLQotICAvL2k9NTYKLSAgdnIgPSAoeFsxNF0gKyB4WzQ2XSk+PjE7ICAvKiBSZSBBICsgUmUgQiAqLwotICB2aSA9ICh4WzMwXSArIHhbNjJdKTsgICAgIC8qIFJlIEMgKyBSZSBEICovCi0gIHVyID0gKHhbMTVdICsgeFs0N10pPj4xOyAgLyogSW0gQSArIEltIEIgKi8KLSAgdWkgPSAoeFszMV0gKyB4WzYzXSk7ICAgICAvKiBJbSBDICsgSW0gRCAqLwotCi0gIHlbNTZdID0gdnIgKyAodmk+PjEpOyAgICAgLyogUmUgQScgPSBSZUEgKyBSZUIgK1JlQyArIFJlRCAqLwotICB5WzYwXSA9IHZyIC0gKHZpPj4xKTsgICAgIC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLwotICB5WzU3XSA9IHVyICsgKHVpPj4xKTsgICAgIC8qIEltIEEnID0gc3VtIG9mIGltYWcgdmFsdWVzICovCi0gIHlbNjFdID0gdXIgLSAodWk+PjEpOyAgICAgLyogSW0gQycgPSAtSW0gQyAtSW0gRCArSW0gQSArSW0gQiAqLwotCi0gIHZyIC09IHhbNDZdOyAgICAgICAgICAgICAgLyogUmUgQSAtIFJlIEIgKi8KLSAgdmkgPSAodmk+PjEpIC0geFs2Ml07ICAgICAvKiBSZSBDIC0gUmUgRCAqLwotICB1ciAtPSB4WzQ3XTsgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCi0gIHVpID0gKHVpPj4xKSAtIHhbNjNdOyAgICAgLyogSW0gQyAtIEltIEQgKi8KLQotICB5WzU4XSA9IHVpICsgdnI7ICAgICAgICAgIC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KLSAgeVs2Ml0gPSB2ciAtIHVpOyAgICAgICAgICAvKiBSZSBEJyA9IC1JbSBDICsgSW0gRCArIFJlIEEgLSBSZSBCICovCi0gIHlbNTldID0gdXIgLSB2aTsgICAgICAgICAgLyogSW0gQic9IC1SZSBDICsgUmUgRCArIEltIEEgLSBJbSBCICovCi0gIHlbNjNdID0gdmkgKyB1cjsgICAgICAgICAgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KLQotCi0gIEZJWFBfREJMICp4dCA9ICZ4WzBdOwotICBGSVhQX0RCTCAqeXQgPSAmeVswXTsKLQotICBpbnQgaiA9IDQ7Ci0gIGRvCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgIHsKLSAgICB2ciA9IHl0WzhdOwotICAgIHZpID0geXRbOV07Ci0gICAgdXIgPSB5dFswXT4+MTsKLSAgICB1aSA9IHl0WzFdPj4xOwotICAgIHh0WyAwXSA9IHVyICsgKHZyPj4xKTsKLSAgICB4dFsgMV0gPSB1aSArICh2aT4+MSk7Ci0gICAgeHRbIDhdID0gdXIgLSAodnI+PjEpOwotICAgIHh0WyA5XSA9IHVpIC0gKHZpPj4xKTsKKyAgICBGSVhQX0RCTCAqY29uc3QgeCA9IF94OworICAgIEZJWFBfREJMIHZpLCB1aTsKKyAgICBGSVhQX0RCTCB2aTIsIHVpMjsKKyAgICBGSVhQX0RCTCB2aTMsIHVpMzsKKyAgICBGSVhQX0RCTCB2ciwgdXI7CisgICAgRklYUF9EQkwgdnIyLCB1cjI7CisgICAgRklYUF9EQkwgdnIzLCB1cjM7CisgICAgRklYUF9EQkwgdnI0LCB1cjQ7CiAKLSAgICB2ciA9IHl0WzEzXTsKLSAgICB2aSA9IHl0WzEyXTsKLSAgICB1ciA9IHl0WzRdPj4xOwotICAgIHVpID0geXRbNV0+PjE7Ci0gICAgeHRbIDRdID0gdXIgKyAodnI+PjEpOwotICAgIHh0WyA1XSA9IHVpIC0gKHZpPj4xKTsKLSAgICB4dFsxMl0gPSB1ciAtICh2cj4+MSk7Ci0gICAgeHRbMTNdID0gdWkgKyAodmk+PjEpOworICAgIC8vIGkgPSAwCisgICAgdnIgPSAoeFswXSArIHhbMzJdKSA+PiAxOyAgICAgLyogUmUgQSArIFJlIEIgKi8KKyAgICB1ciA9ICh4WzFdICsgeFszM10pID4+IDE7ICAgICAvKiBJbSBBICsgSW0gQiAqLworICAgIHZpID0gKHhbMTZdICsgeFs0OF0pIFNISUZUX0E7IC8qIFJlIEMgKyBSZSBEICovCisgICAgdWkgPSAoeFsxN10gKyB4WzQ5XSkgU0hJRlRfQTsgLyogSW0gQyArIEltIEQgKi8KIAotICAgIFNVTURJRkZfUElGT1VSVEgodmksIHZyLCB5dFsxMF0sIHl0WzExXSkKLSAgICB1ciA9IHl0WzJdOwotICAgIHVpID0geXRbM107Ci0gICAgeHRbIDJdID0gKHVyPj4xKSArIHZyOwotICAgIHh0WyAzXSA9ICh1aT4+MSkgKyB2aTsKLSAgICB4dFsxMF0gPSAodXI+PjEpIC0gdnI7Ci0gICAgeHRbMTFdID0gKHVpPj4xKSAtIHZpOworICAgIHhbMF0gPSB2ciArICh2aSBTSElGVF9CKTsgLyogUmUgQScgPSBSZUEgKyBSZUIgK1JlQyArIFJlRCAqLworICAgIHhbMV0gPSB1ciArICh1aSBTSElGVF9CKTsgLyogSW0gQScgPSBzdW0gb2YgaW1hZyB2YWx1ZXMgKi8KIAotICAgIFNVTURJRkZfUElGT1VSVEgodnIsIHZpLCB5dFsxNF0sIHl0WzE1XSkKLSAgICB1ciA9IHl0WzZdOwotICAgIHVpID0geXRbN107CisgICAgdnIyID0gKHhbNF0gKyB4WzM2XSkgPj4gMTsgLyogUmUgQSArIFJlIEIgKi8KKyAgICB1cjIgPSAoeFs1XSArIHhbMzddKSA+PiAxOyAvKiBJbSBBICsgSW0gQiAqLwogCi0gICAgeHRbIDZdID0gKHVyPj4xKSArIHZyOwotICAgIHh0WyA3XSA9ICh1aT4+MSkgLSB2aTsKLSAgICB4dFsxNF0gPSAodXI+PjEpIC0gdnI7Ci0gICAgeHRbMTVdID0gKHVpPj4xKSArIHZpOwotICAgIHh0ICs9IDE2OwotICAgIHl0ICs9IDE2OwotICB9IHdoaWxlICgtLWogIT0gMCk7CisgICAgeFs0XSA9IHZyIC0gKHZpIFNISUZUX0IpOyAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KKyAgICB4WzVdID0gdXIgLSAodWkgU0hJRlRfQik7IC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KIAotICB2ciA9IHhbMTZdOwotICB2aSA9IHhbMTddOwotICB1ciA9IHhbIDBdPj4xOwotICB1aSA9IHhbIDFdPj4xOwotICB4WyAwXSA9IHVyICsgKHZyPj4xKTsKLSAgeFsgMV0gPSB1aSArICh2aT4+MSk7Ci0gIHhbMTZdID0gdXIgLSAodnI+PjEpOwotICB4WzE3XSA9IHVpIC0gKHZpPj4xKTsKKyAgICB2ciAtPSB4WzMyXTsgICAgICAgICAgICAgLyogUmUgQSAtIFJlIEIgKi8KKyAgICB1ciAtPSB4WzMzXTsgICAgICAgICAgICAgLyogSW0gQSAtIEltIEIgKi8KKyAgICB2aSA9ICh2aSBTSElGVF9CKS14WzQ4XTsgLyogUmUgQyAtIFJlIEQgKi8KKyAgICB1aSA9ICh1aSBTSElGVF9CKS14WzQ5XTsgLyogSW0gQyAtIEltIEQgKi8KIAotICB2aSA9IHhbMjRdOwotICB2ciA9IHhbMjVdOwotICB1ciA9IHhbIDhdPj4xOwotICB1aSA9IHhbIDldPj4xOwotICB4WyA4XSA9IHVyICsgKHZyPj4xKTsKLSAgeFsgOV0gPSB1aSAtICh2aT4+MSk7Ci0gIHhbMjRdID0gdXIgLSAodnI+PjEpOwotICB4WzI1XSA9IHVpICsgKHZpPj4xKTsKKyAgICB2cjMgPSAoeFsyXSArIHhbMzRdKSA+PiAxOyAvKiBSZSBBICsgUmUgQiAqLworICAgIHVyMyA9ICh4WzNdICsgeFszNV0pID4+IDE7IC8qIEltIEEgKyBJbSBCICovCiAKLSAgdnIgPSB4WzQ4XTsKLSAgdmkgPSB4WzQ5XTsKLSAgdXIgPSB4WzMyXT4+MTsKLSAgdWkgPSB4WzMzXT4+MTsKLSAgeFszMl0gPSB1ciArICh2cj4+MSk7Ci0gIHhbMzNdID0gdWkgKyAodmk+PjEpOwotICB4WzQ4XSA9IHVyIC0gKHZyPj4xKTsKLSAgeFs0OV0gPSB1aSAtICh2aT4+MSk7CisgICAgeFsyXSA9IHVpICsgdnI7IC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KKyAgICB4WzNdID0gdXIgLSB2aTsgLyogSW0gQic9IC1SZSBDICsgUmUgRCArIEltIEEgLSBJbSBCICovCiAKLSAgdmkgPSB4WzU2XTsKLSAgdnIgPSB4WzU3XTsKLSAgdXIgPSB4WzQwXT4+MTsKLSAgdWkgPSB4WzQxXT4+MTsKLSAgeFs0MF0gPSB1ciArICh2cj4+MSk7Ci0gIHhbNDFdID0gdWkgLSAodmk+PjEpOwotICB4WzU2XSA9IHVyIC0gKHZyPj4xKTsKLSAgeFs1N10gPSB1aSArICh2aT4+MSk7CisgICAgdnI0ID0gKHhbNl0gKyB4WzM4XSkgPj4gMTsgLyogUmUgQSArIFJlIEIgKi8KKyAgICB1cjQgPSAoeFs3XSArIHhbMzldKSA+PiAxOyAvKiBJbSBBICsgSW0gQiAqLwogCi0gIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFsxOV0sIHhbMThdLCBmZnQzMl93MzJbMF0pOwotICB1ciA9IHhbIDJdOwotICB1aSA9IHhbIDNdOwotICB4WyAyXSA9ICh1cj4+MSkgKyB2cjsKLSAgeFsgM10gPSAodWk+PjEpICsgdmk7Ci0gIHhbMThdID0gKHVyPj4xKSAtIHZyOwotICB4WzE5XSA9ICh1aT4+MSkgLSB2aTsKKyAgICB4WzZdID0gdnIgLSB1aTsgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLworICAgIHhbN10gPSB2aSArIHVyOyAvKiBJbSBEJz0gUmUgQyAtIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwogCi0gIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFsyN10sIHhbMjZdLCBmZnQzMl93MzJbMF0pOwotICB1ciA9IHhbMTBdOwotICB1aSA9IHhbMTFdOwotICB4WzEwXSA9ICh1cj4+MSkgKyB2cjsKLSAgeFsxMV0gPSAodWk+PjEpIC0gdmk7Ci0gIHhbMjZdID0gKHVyPj4xKSAtIHZyOwotICB4WzI3XSA9ICh1aT4+MSkgKyB2aTsKKyAgICAvLyBpPTE2CisgICAgdmkgPSAoeFsyMF0gKyB4WzUyXSkgU0hJRlRfQTsgLyogUmUgQyArIFJlIEQgKi8KKyAgICB1aSA9ICh4WzIxXSArIHhbNTNdKSBTSElGVF9BOyAvKiBJbSBDICsgSW0gRCAqLwogCi0gIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFs1MV0sIHhbNTBdLCBmZnQzMl93MzJbMF0pOwotICB1ciA9IHhbMzRdOwotICB1aSA9IHhbMzVdOwotICB4WzM0XSA9ICh1cj4+MSkgKyB2cjsKLSAgeFszNV0gPSAodWk+PjEpICsgdmk7Ci0gIHhbNTBdID0gKHVyPj4xKSAtIHZyOwotICB4WzUxXSA9ICh1aT4+MSkgLSB2aTsKKyAgICB4WzE2XSA9IHZyMiArICh2aSBTSElGVF9CKTsgLyogUmUgQScgPSBSZUEgKyBSZUIgK1JlQyArIFJlRCAqLworICAgIHhbMTddID0gdXIyICsgKHVpIFNISUZUX0IpOyAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLworICAgIHhbMjBdID0gdnIyIC0gKHZpIFNISUZUX0IpOyAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KKyAgICB4WzIxXSA9IHVyMiAtICh1aSBTSElGVF9CKTsgLyogSW0gQycgPSAtSW0gQyAtSW0gRCArSW0gQSArSW0gQiAqLwogCi0gIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFs1OV0sIHhbNThdLCBmZnQzMl93MzJbMF0pOwotICB1ciA9IHhbNDJdOwotICB1aSA9IHhbNDNdOwotICB4WzQyXSA9ICh1cj4+MSkgKyB2cjsKLSAgeFs0M10gPSAodWk+PjEpIC0gdmk7Ci0gIHhbNThdID0gKHVyPj4xKSAtIHZyOwotICB4WzU5XSA9ICh1aT4+MSkgKyB2aTsKKyAgICB2cjIgLT0geFszNl07ICAgICAgICAgICAgLyogUmUgQSAtIFJlIEIgKi8KKyAgICB1cjIgLT0geFszN107ICAgICAgICAgICAgLyogSW0gQSAtIEltIEIgKi8KKyAgICB2aSA9ICh2aSBTSElGVF9CKS14WzUyXTsgLyogUmUgQyAtIFJlIEQgKi8KKyAgICB1aSA9ICh1aSBTSElGVF9CKS14WzUzXTsgLyogSW0gQyAtIEltIEQgKi8KIAotICBTVU1ESUZGX1BJRk9VUlRIKHZpLCB2ciwgeFsyMF0sIHhbMjFdKQotICB1ciA9IHhbIDRdOwotICB1aSA9IHhbIDVdOwotICB4WyA0XSA9ICh1cj4+MSkgKyB2cjsKLSAgeFsgNV0gPSAodWk+PjEpICsgdmk7Ci0gIHhbMjBdID0gKHVyPj4xKSAtIHZyOwotICB4WzIxXSA9ICh1aT4+MSkgLSB2aTsKKyAgICB2aTIgPSAoeFsxOF0gKyB4WzUwXSkgU0hJRlRfQTsgLyogUmUgQyArIFJlIEQgKi8KKyAgICB1aTIgPSAoeFsxOV0gKyB4WzUxXSkgU0hJRlRfQTsgLyogSW0gQyArIEltIEQgKi8KIAotICBTVU1ESUZGX1BJRk9VUlRIKHZyLCB2aSwgeFsyOF0sIHhbMjldKQotICB1ciA9IHhbMTJdOwotICB1aSA9IHhbMTNdOwotICB4WzEyXSA9ICh1cj4+MSkgKyB2cjsKLSAgeFsxM10gPSAodWk+PjEpIC0gdmk7Ci0gIHhbMjhdID0gKHVyPj4xKSAtIHZyOwotICB4WzI5XSA9ICh1aT4+MSkgKyB2aTsKKyAgICB4WzE4XSA9IHVpICsgdnIyOyAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCisgICAgeFsxOV0gPSB1cjIgLSB2aTsgLyogSW0gQic9IC1SZSBDICsgUmUgRCArIEltIEEgLSBJbSBCICovCiAKLSAgU1VNRElGRl9QSUZPVVJUSCh2aSwgdnIsIHhbNTJdLCB4WzUzXSkKLSAgdXIgPSB4WzM2XTsKLSAgdWkgPSB4WzM3XTsKLSAgeFszNl0gPSAodXI+PjEpICsgdnI7Ci0gIHhbMzddID0gKHVpPj4xKSArIHZpOwotICB4WzUyXSA9ICh1cj4+MSkgLSB2cjsKLSAgeFs1M10gPSAodWk+PjEpIC0gdmk7CisgICAgdmkzID0gKHhbMjJdICsgeFs1NF0pIFNISUZUX0E7IC8qIFJlIEMgKyBSZSBEICovCisgICAgdWkzID0gKHhbMjNdICsgeFs1NV0pIFNISUZUX0E7IC8qIEltIEMgKyBJbSBEICovCiAKLSAgU1VNRElGRl9QSUZPVVJUSCh2ciwgdmksIHhbNjBdLCB4WzYxXSkKLSAgdXIgPSB4WzQ0XTsKLSAgdWkgPSB4WzQ1XTsKLSAgeFs0NF0gPSAodXI+PjEpICsgdnI7Ci0gIHhbNDVdID0gKHVpPj4xKSAtIHZpOwotICB4WzYwXSA9ICh1cj4+MSkgLSB2cjsKLSAgeFs2MV0gPSAodWk+PjEpICsgdmk7CisgICAgeFsyMl0gPSB2cjIgLSB1aTsgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLworICAgIHhbMjNdID0gdmkgKyB1cjI7IC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCiAKKyAgICAvLyBpID0gMzIKIAotICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbMjNdLCB4WzIyXSwgZmZ0MzJfdzMyWzFdKTsKLSAgdXIgPSB4WyA2XTsKLSAgdWkgPSB4WyA3XTsKLSAgeFsgNl0gPSAodXI+PjEpICsgdnI7Ci0gIHhbIDddID0gKHVpPj4xKSArIHZpOwotICB4WzIyXSA9ICh1cj4+MSkgLSB2cjsKLSAgeFsyM10gPSAodWk+PjEpIC0gdmk7CisgICAgeFszMl0gPSB2cjMgKyAodmkyIFNISUZUX0IpOyAvKiBSZSBBJyA9IFJlQSArIFJlQiArUmVDICsgUmVEICovCisgICAgeFszM10gPSB1cjMgKyAodWkyIFNISUZUX0IpOyAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLworICAgIHhbMzZdID0gdnIzIC0gKHZpMiBTSElGVF9CKTsgLyogUmUgQycgPSAtKFJlQytSZUQpICsgKFJlQStSZUIpICovCisgICAgeFszN10gPSB1cjMgLSAodWkyIFNISUZUX0IpOyAvKiBJbSBDJyA9IC1JbSBDIC1JbSBEICtJbSBBICtJbSBCICovCiAKLSAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzMxXSwgeFszMF0sIGZmdDMyX3czMlsxXSk7Ci0gIHVyID0geFsxNF07Ci0gIHVpID0geFsxNV07Ci0gIHhbMTRdID0gKHVyPj4xKSArIHZyOwotICB4WzE1XSA9ICh1aT4+MSkgLSB2aTsKLSAgeFszMF0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbMzFdID0gKHVpPj4xKSArIHZpOworICAgIHZyMyAtPSB4WzM0XTsgICAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCisgICAgdXIzIC09IHhbMzVdOyAgICAgICAgICAgICAgLyogSW0gQSAtIEltIEIgKi8KKyAgICB2aTIgPSAodmkyIFNISUZUX0IpLXhbNTBdOyAvKiBSZSBDIC0gUmUgRCAqLworICAgIHVpMiA9ICh1aTIgU0hJRlRfQikteFs1MV07IC8qIEltIEMgLSBJbSBEICovCiAKLSAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzU1XSwgeFs1NF0sIGZmdDMyX3czMlsxXSk7Ci0gIHVyID0geFszOF07Ci0gIHVpID0geFszOV07Ci0gIHhbMzhdID0gKHVyPj4xKSArIHZyOwotICB4WzM5XSA9ICh1aT4+MSkgKyB2aTsKLSAgeFs1NF0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbNTVdID0gKHVpPj4xKSAtIHZpOworICAgIHhbMzRdID0gdWkyICsgdnIzOyAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCisgICAgeFszNV0gPSB1cjMgLSB2aTI7IC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwogCi0gIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFs2M10sIHhbNjJdLCBmZnQzMl93MzJbMV0pOwotICB1ciA9IHhbNDZdOwotICB1aSA9IHhbNDddOworICAgIC8vIGk9NDgKIAotICB4WzQ2XSA9ICh1cj4+MSkgKyB2cjsKLSAgeFs0N10gPSAodWk+PjEpIC0gdmk7Ci0gIHhbNjJdID0gKHVyPj4xKSAtIHZyOwotICB4WzYzXSA9ICh1aT4+MSkgKyB2aTsKKyAgICB4WzQ4XSA9IHZyNCArICh2aTMgU0hJRlRfQik7IC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KKyAgICB4WzUyXSA9IHZyNCAtICh2aTMgU0hJRlRfQik7IC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLworICAgIHhbNDldID0gdXI0ICsgKHVpMyBTSElGVF9CKTsgLyogSW0gQScgPSBzdW0gb2YgaW1hZyB2YWx1ZXMgKi8KKyAgICB4WzUzXSA9IHVyNCAtICh1aTMgU0hJRlRfQik7IC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KIAotICB2ciA9IHhbMzJdOwotICB2aSA9IHhbMzNdOwotICB1ciA9IHhbIDBdPj4xOwotICB1aSA9IHhbIDFdPj4xOwotICB4WyAwXSA9IHVyICsgKHZyPj4xKTsKLSAgeFsgMV0gPSB1aSArICh2aT4+MSk7Ci0gIHhbMzJdID0gdXIgLSAodnI+PjEpOwotICB4WzMzXSA9IHVpIC0gKHZpPj4xKTsKKyAgICB2cjQgLT0geFszOF07IC8qIFJlIEEgLSBSZSBCICovCisgICAgdXI0IC09IHhbMzldOyAvKiBJbSBBIC0gSW0gQiAqLwogCi0gIHZpID0geFs0OF07Ci0gIHZyID0geFs0OV07Ci0gIHVyID0geFsxNl0+PjE7Ci0gIHVpID0geFsxN10+PjE7Ci0gIHhbMTZdID0gdXIgKyAodnI+PjEpOwotICB4WzE3XSA9IHVpIC0gKHZpPj4xKTsKLSAgeFs0OF0gPSB1ciAtICh2cj4+MSk7Ci0gIHhbNDldID0gdWkgKyAodmk+PjEpOworICAgIHhbMzhdID0gdnIzIC0gdWkyOyAvKiBSZSBEJyA9IC1JbSBDICsgSW0gRCArIFJlIEEgLSBSZSBCICovCisgICAgeFszOV0gPSB2aTIgKyB1cjM7IC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCiAKLSAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzM1XSwgeFszNF0sIGZmdDMyX3czMlsyXSk7Ci0gIHVyID0geFsgMl07Ci0gIHVpID0geFsgM107Ci0gIHhbIDJdID0gKHVyPj4xKSArIHZyOwotICB4WyAzXSA9ICh1aT4+MSkgKyB2aTsKLSAgeFszNF0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbMzVdID0gKHVpPj4xKSAtIHZpOworICAgIHZpMyA9ICh2aTMgU0hJRlRfQikteFs1NF07IC8qIFJlIEMgLSBSZSBEICovCisgICAgdWkzID0gKHVpMyBTSElGVF9CKS14WzU1XTsgLyogSW0gQyAtIEltIEQgKi8KIAotICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbNTFdLCB4WzUwXSwgZmZ0MzJfdzMyWzJdKTsKLSAgdXIgPSB4WzE4XTsKLSAgdWkgPSB4WzE5XTsKLSAgeFsxOF0gPSAodXI+PjEpICsgdnI7Ci0gIHhbMTldID0gKHVpPj4xKSAtIHZpOwotICB4WzUwXSA9ICh1cj4+MSkgLSB2cjsKLSAgeFs1MV0gPSAodWk+PjEpICsgdmk7CisgICAgeFs1MF0gPSB1aTMgKyB2cjQ7IC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KKyAgICB4WzU0XSA9IHZyNCAtIHVpMzsgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLworICAgIHhbNTFdID0gdXI0IC0gdmkzOyAvKiBJbSBCJz0gLVJlIEMgKyBSZSBEICsgSW0gQSAtIEltIEIgKi8KKyAgICB4WzU1XSA9IHZpMyArIHVyNDsgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KIAotICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbMzddLCB4WzM2XSwgZmZ0MzJfdzMyWzBdKTsKLSAgdXIgPSB4WyA0XTsKLSAgdWkgPSB4WyA1XTsKLSAgeFsgNF0gPSAodXI+PjEpICsgdnI7Ci0gIHhbIDVdID0gKHVpPj4xKSArIHZpOwotICB4WzM2XSA9ICh1cj4+MSkgLSB2cjsKLSAgeFszN10gPSAodWk+PjEpIC0gdmk7CisgICAgLy8gaT04CisgICAgdnIgPSAoeFs4XSArIHhbNDBdKSA+PiAxOyAgICAgLyogUmUgQSArIFJlIEIgKi8KKyAgICB1ciA9ICh4WzldICsgeFs0MV0pID4+IDE7ICAgICAvKiBJbSBBICsgSW0gQiAqLworICAgIHZpID0gKHhbMjRdICsgeFs1Nl0pIFNISUZUX0E7IC8qIFJlIEMgKyBSZSBEICovCisgICAgdWkgPSAoeFsyNV0gKyB4WzU3XSkgU0hJRlRfQTsgLyogSW0gQyArIEltIEQgKi8KIAotICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbNTNdLCB4WzUyXSwgZmZ0MzJfdzMyWzBdKTsKLSAgdXIgPSB4WzIwXTsKLSAgdWkgPSB4WzIxXTsKLSAgeFsyMF0gPSAodXI+PjEpICsgdnI7Ci0gIHhbMjFdID0gKHVpPj4xKSAtIHZpOwotICB4WzUyXSA9ICh1cj4+MSkgLSB2cjsKLSAgeFs1M10gPSAodWk+PjEpICsgdmk7CisgICAgeFs4XSA9IHZyICsgKHZpIFNISUZUX0IpOyAvKiBSZSBBJyA9IFJlQSArIFJlQiArUmVDICsgUmVEICovCisgICAgeFs5XSA9IHVyICsgKHVpIFNISUZUX0IpOyAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLwogCi0gIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFszOV0sIHhbMzhdLCBmZnQzMl93MzJbM10pOwotICB1ciA9IHhbIDZdOwotICB1aSA9IHhbIDddOwotICB4WyA2XSA9ICh1cj4+MSkgKyB2cjsKLSAgeFsgN10gPSAodWk+PjEpICsgdmk7Ci0gIHhbMzhdID0gKHVyPj4xKSAtIHZyOwotICB4WzM5XSA9ICh1aT4+MSkgLSB2aTsKKyAgICB2cjIgPSAoeFsxMl0gKyB4WzQ0XSkgPj4gMTsgLyogUmUgQSArIFJlIEIgKi8KKyAgICB1cjIgPSAoeFsxM10gKyB4WzQ1XSkgPj4gMTsgLyogSW0gQSArIEltIEIgKi8KIAotICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbNTVdLCB4WzU0XSwgZmZ0MzJfdzMyWzNdKTsKLSAgdXIgPSB4WzIyXTsKLSAgdWkgPSB4WzIzXTsKLSAgeFsyMl0gPSAodXI+PjEpICsgdnI7Ci0gIHhbMjNdID0gKHVpPj4xKSAtIHZpOwotICB4WzU0XSA9ICh1cj4+MSkgLSB2cjsKLSAgeFs1NV0gPSAodWk+PjEpICsgdmk7CisgICAgeFsxMl0gPSB2ciAtICh2aSBTSElGVF9CKTsgLyogUmUgQycgPSAtKFJlQytSZUQpICsgKFJlQStSZUIpICovCisgICAgeFsxM10gPSB1ciAtICh1aSBTSElGVF9CKTsgLyogSW0gQycgPSAtSW0gQyAtSW0gRCArSW0gQSArSW0gQiAqLwogCi0gIFNVTURJRkZfUElGT1VSVEgodmksIHZyLCB4WzQwXSwgeFs0MV0pCi0gIHVyID0geFsgOF07Ci0gIHVpID0geFsgOV07Ci0gIHhbIDhdID0gKHVyPj4xKSArIHZyOwotICB4WyA5XSA9ICh1aT4+MSkgKyB2aTsKLSAgeFs0MF0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbNDFdID0gKHVpPj4xKSAtIHZpOworICAgIHZyIC09IHhbNDBdOyAgICAgICAgICAgICAvKiBSZSBBIC0gUmUgQiAqLworICAgIHVyIC09IHhbNDFdOyAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLworICAgIHZpID0gKHZpIFNISUZUX0IpLXhbNTZdOyAvKiBSZSBDIC0gUmUgRCAqLworICAgIHVpID0gKHVpIFNISUZUX0IpLXhbNTddOyAvKiBJbSBDIC0gSW0gRCAqLwogCi0gIFNVTURJRkZfUElGT1VSVEgodnIsIHZpLCB4WzU2XSwgeFs1N10pCi0gIHVyID0geFsyNF07Ci0gIHVpID0geFsyNV07Ci0gIHhbMjRdID0gKHVyPj4xKSArIHZyOwotICB4WzI1XSA9ICh1aT4+MSkgLSB2aTsKLSAgeFs1Nl0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbNTddID0gKHVpPj4xKSArIHZpOworICAgIHZyMyA9ICh4WzEwXSArIHhbNDJdKSA+PiAxOyAvKiBSZSBBICsgUmUgQiAqLworICAgIHVyMyA9ICh4WzExXSArIHhbNDNdKSA+PiAxOyAvKiBJbSBBICsgSW0gQiAqLwogCi0gIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFs0M10sIHhbNDJdLCBmZnQzMl93MzJbNF0pOwotICB1ciA9IHhbMTBdOwotICB1aSA9IHhbMTFdOworICAgIHhbMTBdID0gdWkgKyB2cjsgLyogUmUgQicgPSBJbSBDIC0gSW0gRCAgKyBSZSBBIC0gUmUgQiAqLworICAgIHhbMTFdID0gdXIgLSB2aTsgLyogSW0gQic9IC1SZSBDICsgUmUgRCArIEltIEEgLSBJbSBCICovCiAKLSAgeFsxMF0gPSAodXI+PjEpICsgdnI7Ci0gIHhbMTFdID0gKHVpPj4xKSArIHZpOwotICB4WzQyXSA9ICh1cj4+MSkgLSB2cjsKLSAgeFs0M10gPSAodWk+PjEpIC0gdmk7CisgICAgdnI0ID0gKHhbMTRdICsgeFs0Nl0pID4+IDE7IC8qIFJlIEEgKyBSZSBCICovCisgICAgdXI0ID0gKHhbMTVdICsgeFs0N10pID4+IDE7IC8qIEltIEEgKyBJbSBCICovCiAKLSAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzU5XSwgeFs1OF0sIGZmdDMyX3czMls0XSk7Ci0gIHVyID0geFsyNl07Ci0gIHVpID0geFsyN107Ci0gIHhbMjZdID0gKHVyPj4xKSArIHZyOwotICB4WzI3XSA9ICh1aT4+MSkgLSB2aTsKLSAgeFs1OF0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbNTldID0gKHVpPj4xKSArIHZpOworICAgIHhbMTRdID0gdnIgLSB1aTsgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLworICAgIHhbMTVdID0gdmkgKyB1cjsgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KIAotICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbNDVdLCB4WzQ0XSwgZmZ0MzJfdzMyWzFdKTsKLSAgdXIgPSB4WzEyXTsKLSAgdWkgPSB4WzEzXTsKLSAgeFsxMl0gPSAodXI+PjEpICsgdnI7Ci0gIHhbMTNdID0gKHVpPj4xKSArIHZpOwotICB4WzQ0XSA9ICh1cj4+MSkgLSB2cjsKLSAgeFs0NV0gPSAodWk+PjEpIC0gdmk7CisgICAgLy8gaT0yNAorICAgIHZpID0gKHhbMjhdICsgeFs2MF0pIFNISUZUX0E7IC8qIFJlIEMgKyBSZSBEICovCisgICAgdWkgPSAoeFsyOV0gKyB4WzYxXSkgU0hJRlRfQTsgLyogSW0gQyArIEltIEQgKi8KIAotICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbNjFdLCB4WzYwXSwgZmZ0MzJfdzMyWzFdKTsKLSAgdXIgPSB4WzI4XTsKLSAgdWkgPSB4WzI5XTsKLSAgeFsyOF0gPSAodXI+PjEpICsgdnI7Ci0gIHhbMjldID0gKHVpPj4xKSAtIHZpOwotICB4WzYwXSA9ICh1cj4+MSkgLSB2cjsKLSAgeFs2MV0gPSAodWk+PjEpICsgdmk7CisgICAgeFsyNF0gPSB2cjIgKyAodmkgU0hJRlRfQik7IC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KKyAgICB4WzI4XSA9IHZyMiAtICh2aSBTSElGVF9CKTsgLyogUmUgQycgPSAtKFJlQytSZUQpICsgKFJlQStSZUIpICovCisgICAgeFsyNV0gPSB1cjIgKyAodWkgU0hJRlRfQik7IC8qIEltIEEnID0gc3VtIG9mIGltYWcgdmFsdWVzICovCisgICAgeFsyOV0gPSB1cjIgLSAodWkgU0hJRlRfQik7IC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KIAotICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbNDddLCB4WzQ2XSwgZmZ0MzJfdzMyWzVdKTsKLSAgdXIgPSB4WzE0XTsKLSAgdWkgPSB4WzE1XTsKLSAgeFsxNF0gPSAodXI+PjEpICsgdnI7Ci0gIHhbMTVdID0gKHVpPj4xKSArIHZpOwotICB4WzQ2XSA9ICh1cj4+MSkgLSB2cjsKLSAgeFs0N10gPSAodWk+PjEpIC0gdmk7CisgICAgdnIyIC09IHhbNDRdOyAgICAgICAgICAgIC8qIFJlIEEgLSBSZSBCICovCisgICAgdXIyIC09IHhbNDVdOyAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCisgICAgdmkgPSAodmkgU0hJRlRfQikteFs2MF07IC8qIFJlIEMgLSBSZSBEICovCisgICAgdWkgPSAodWkgU0hJRlRfQikteFs2MV07IC8qIEltIEMgLSBJbSBEICovCiAKLSAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzYzXSwgeFs2Ml0sIGZmdDMyX3czMls1XSk7Ci0gIHVyID0geFszMF07Ci0gIHVpID0geFszMV07Ci0gIHhbMzBdID0gKHVyPj4xKSArIHZyOwotICB4WzMxXSA9ICh1aT4+MSkgLSB2aTsKLSAgeFs2Ml0gPSAodXI+PjEpIC0gdnI7Ci0gIHhbNjNdID0gKHVpPj4xKSArIHZpOworICAgIHZpMiA9ICh4WzI2XSArIHhbNThdKSBTSElGVF9BOyAvKiBSZSBDICsgUmUgRCAqLworICAgIHVpMiA9ICh4WzI3XSArIHhbNTldKSBTSElGVF9BOyAvKiBJbSBDICsgSW0gRCAqLworCisgICAgeFsyNl0gPSB1aSArIHZyMjsgLyogUmUgQicgPSBJbSBDIC0gSW0gRCAgKyBSZSBBIC0gUmUgQiAqLworICAgIHhbMjddID0gdXIyIC0gdmk7IC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLworCisgICAgdmkzID0gKHhbMzBdICsgeFs2Ml0pIFNISUZUX0E7IC8qIFJlIEMgKyBSZSBEICovCisgICAgdWkzID0gKHhbMzFdICsgeFs2M10pIFNISUZUX0E7IC8qIEltIEMgKyBJbSBEICovCisKKyAgICB4WzMwXSA9IHZyMiAtIHVpOyAvKiBSZSBEJyA9IC1JbSBDICsgSW0gRCArIFJlIEEgLSBSZSBCICovCisgICAgeFszMV0gPSB2aSArIHVyMjsgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KKworICAgIC8vIGk9NDAKKworICAgIHhbNDBdID0gdnIzICsgKHZpMiBTSElGVF9CKTsgLyogUmUgQScgPSBSZUEgKyBSZUIgK1JlQyArIFJlRCAqLworICAgIHhbNDRdID0gdnIzIC0gKHZpMiBTSElGVF9CKTsgLyogUmUgQycgPSAtKFJlQytSZUQpICsgKFJlQStSZUIpICovCisgICAgeFs0MV0gPSB1cjMgKyAodWkyIFNISUZUX0IpOyAvKiBJbSBBJyA9IHN1bSBvZiBpbWFnIHZhbHVlcyAqLworICAgIHhbNDVdID0gdXIzIC0gKHVpMiBTSElGVF9CKTsgLyogSW0gQycgPSAtSW0gQyAtSW0gRCArSW0gQSArSW0gQiAqLworCisgICAgdnIzIC09IHhbNDJdOyAgICAgICAgICAgICAgLyogUmUgQSAtIFJlIEIgKi8KKyAgICB1cjMgLT0geFs0M107ICAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLworICAgIHZpMiA9ICh2aTIgU0hJRlRfQikteFs1OF07IC8qIFJlIEMgLSBSZSBEICovCisgICAgdWkyID0gKHVpMiBTSElGVF9CKS14WzU5XTsgLyogSW0gQyAtIEltIEQgKi8KKworICAgIHhbNDJdID0gdWkyICsgdnIzOyAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCisgICAgeFs0M10gPSB1cjMgLSB2aTI7IC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLworCisgICAgLy8gaT01NgorCisgICAgeFs1Nl0gPSB2cjQgKyAodmkzIFNISUZUX0IpOyAvKiBSZSBBJyA9IFJlQSArIFJlQiArUmVDICsgUmVEICovCisgICAgeFs2MF0gPSB2cjQgLSAodmkzIFNISUZUX0IpOyAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KKyAgICB4WzU3XSA9IHVyNCArICh1aTMgU0hJRlRfQik7IC8qIEltIEEnID0gc3VtIG9mIGltYWcgdmFsdWVzICovCisgICAgeFs2MV0gPSB1cjQgLSAodWkzIFNISUZUX0IpOyAvKiBJbSBDJyA9IC1JbSBDIC1JbSBEICtJbSBBICtJbSBCICovCisKKyAgICB2cjQgLT0geFs0Nl07IC8qIFJlIEEgLSBSZSBCICovCisgICAgdXI0IC09IHhbNDddOyAvKiBJbSBBIC0gSW0gQiAqLworCisgICAgeFs0Nl0gPSB2cjMgLSB1aTI7IC8qIFJlIEQnID0gLUltIEMgKyBJbSBEICsgUmUgQSAtIFJlIEIgKi8KKyAgICB4WzQ3XSA9IHZpMiArIHVyMzsgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KKworICAgIHZpMyA9ICh2aTMgU0hJRlRfQikteFs2Ml07IC8qIFJlIEMgLSBSZSBEICovCisgICAgdWkzID0gKHVpMyBTSElGVF9CKS14WzYzXTsgLyogSW0gQyAtIEltIEQgKi8KKworICAgIHhbNThdID0gdWkzICsgdnI0OyAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCisgICAgeFs2Ml0gPSB2cjQgLSB1aTM7IC8qIFJlIEQnID0gLUltIEMgKyBJbSBEICsgUmUgQSAtIFJlIEIgKi8KKyAgICB4WzU5XSA9IHVyNCAtIHZpMzsgLyogSW0gQic9IC1SZSBDICsgUmUgRCArIEltIEEgLSBJbSBCICovCisgICAgeFs2M10gPSB2aTMgKyB1cjQ7IC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCisgIH0KKworICB7CisgICAgRklYUF9EQkwgKnh0ID0gX3g7CisKKyAgICBpbnQgaiA9IDQ7CisgICAgZG8geworICAgICAgRklYUF9EQkwgdmksIHVpLCB2ciwgdXI7CisKKyAgICAgIHZyID0geHRbOF07CisgICAgICB2aSA9IHh0WzldOworICAgICAgdXIgPSB4dFswXSA+PiAxOworICAgICAgdWkgPSB4dFsxXSA+PiAxOworICAgICAgeHRbMF0gPSB1ciArICh2ciA+PiAxKTsKKyAgICAgIHh0WzFdID0gdWkgKyAodmkgPj4gMSk7CisgICAgICB4dFs4XSA9IHVyIC0gKHZyID4+IDEpOworICAgICAgeHRbOV0gPSB1aSAtICh2aSA+PiAxKTsKKworICAgICAgdnIgPSB4dFsxM107CisgICAgICB2aSA9IHh0WzEyXTsKKyAgICAgIHVyID0geHRbNF0gPj4gMTsKKyAgICAgIHVpID0geHRbNV0gPj4gMTsKKyAgICAgIHh0WzRdID0gdXIgKyAodnIgPj4gMSk7CisgICAgICB4dFs1XSA9IHVpIC0gKHZpID4+IDEpOworICAgICAgeHRbMTJdID0gdXIgLSAodnIgPj4gMSk7CisgICAgICB4dFsxM10gPSB1aSArICh2aSA+PiAxKTsKKworICAgICAgU1VNRElGRl9QSUZPVVJUSCh2aSwgdnIsIHh0WzEwXSwgeHRbMTFdKQorICAgICAgdXIgPSB4dFsyXTsKKyAgICAgIHVpID0geHRbM107CisgICAgICB4dFsyXSA9ICh1ciA+PiAxKSArIHZyOworICAgICAgeHRbM10gPSAodWkgPj4gMSkgKyB2aTsKKyAgICAgIHh0WzEwXSA9ICh1ciA+PiAxKSAtIHZyOworICAgICAgeHRbMTFdID0gKHVpID4+IDEpIC0gdmk7CisKKyAgICAgIFNVTURJRkZfUElGT1VSVEgodnIsIHZpLCB4dFsxNF0sIHh0WzE1XSkKKyAgICAgIHVyID0geHRbNl07CisgICAgICB1aSA9IHh0WzddOworCisgICAgICB4dFs2XSA9ICh1ciA+PiAxKSArIHZyOworICAgICAgeHRbN10gPSAodWkgPj4gMSkgLSB2aTsKKyAgICAgIHh0WzE0XSA9ICh1ciA+PiAxKSAtIHZyOworICAgICAgeHRbMTVdID0gKHVpID4+IDEpICsgdmk7CisgICAgICB4dCArPSAxNjsKKyAgICB9IHdoaWxlICgtLWogIT0gMCk7CisgIH0KKworICB7CisgICAgRklYUF9EQkwgKmNvbnN0IHggPSBfeDsKKyAgICBGSVhQX0RCTCB2aSwgdWksIHZyLCB1cjsKKworICAgIHZyID0geFsxNl07CisgICAgdmkgPSB4WzE3XTsKKyAgICB1ciA9IHhbMF0gPj4gMTsKKyAgICB1aSA9IHhbMV0gPj4gMTsKKyAgICB4WzBdID0gdXIgKyAodnIgPj4gMSk7CisgICAgeFsxXSA9IHVpICsgKHZpID4+IDEpOworICAgIHhbMTZdID0gdXIgLSAodnIgPj4gMSk7CisgICAgeFsxN10gPSB1aSAtICh2aSA+PiAxKTsKKworICAgIHZpID0geFsyNF07CisgICAgdnIgPSB4WzI1XTsKKyAgICB1ciA9IHhbOF0gPj4gMTsKKyAgICB1aSA9IHhbOV0gPj4gMTsKKyAgICB4WzhdID0gdXIgKyAodnIgPj4gMSk7CisgICAgeFs5XSA9IHVpIC0gKHZpID4+IDEpOworICAgIHhbMjRdID0gdXIgLSAodnIgPj4gMSk7CisgICAgeFsyNV0gPSB1aSArICh2aSA+PiAxKTsKKworICAgIHZyID0geFs0OF07CisgICAgdmkgPSB4WzQ5XTsKKyAgICB1ciA9IHhbMzJdID4+IDE7CisgICAgdWkgPSB4WzMzXSA+PiAxOworICAgIHhbMzJdID0gdXIgKyAodnIgPj4gMSk7CisgICAgeFszM10gPSB1aSArICh2aSA+PiAxKTsKKyAgICB4WzQ4XSA9IHVyIC0gKHZyID4+IDEpOworICAgIHhbNDldID0gdWkgLSAodmkgPj4gMSk7CisKKyAgICB2aSA9IHhbNTZdOworICAgIHZyID0geFs1N107CisgICAgdXIgPSB4WzQwXSA+PiAxOworICAgIHVpID0geFs0MV0gPj4gMTsKKyAgICB4WzQwXSA9IHVyICsgKHZyID4+IDEpOworICAgIHhbNDFdID0gdWkgLSAodmkgPj4gMSk7CisgICAgeFs1Nl0gPSB1ciAtICh2ciA+PiAxKTsKKyAgICB4WzU3XSA9IHVpICsgKHZpID4+IDEpOworCisgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzE5XSwgeFsxOF0sIGZmdDMyX3czMlswXSk7CisgICAgdXIgPSB4WzJdOworICAgIHVpID0geFszXTsKKyAgICB4WzJdID0gKHVyID4+IDEpICsgdnI7CisgICAgeFszXSA9ICh1aSA+PiAxKSArIHZpOworICAgIHhbMThdID0gKHVyID4+IDEpIC0gdnI7CisgICAgeFsxOV0gPSAodWkgPj4gMSkgLSB2aTsKKworICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFsyN10sIHhbMjZdLCBmZnQzMl93MzJbMF0pOworICAgIHVyID0geFsxMF07CisgICAgdWkgPSB4WzExXTsKKyAgICB4WzEwXSA9ICh1ciA+PiAxKSArIHZyOworICAgIHhbMTFdID0gKHVpID4+IDEpIC0gdmk7CisgICAgeFsyNl0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICB4WzI3XSA9ICh1aSA+PiAxKSArIHZpOworCisgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzUxXSwgeFs1MF0sIGZmdDMyX3czMlswXSk7CisgICAgdXIgPSB4WzM0XTsKKyAgICB1aSA9IHhbMzVdOworICAgIHhbMzRdID0gKHVyID4+IDEpICsgdnI7CisgICAgeFszNV0gPSAodWkgPj4gMSkgKyB2aTsKKyAgICB4WzUwXSA9ICh1ciA+PiAxKSAtIHZyOworICAgIHhbNTFdID0gKHVpID4+IDEpIC0gdmk7CisKKyAgICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbNTldLCB4WzU4XSwgZmZ0MzJfdzMyWzBdKTsKKyAgICB1ciA9IHhbNDJdOworICAgIHVpID0geFs0M107CisgICAgeFs0Ml0gPSAodXIgPj4gMSkgKyB2cjsKKyAgICB4WzQzXSA9ICh1aSA+PiAxKSAtIHZpOworICAgIHhbNThdID0gKHVyID4+IDEpIC0gdnI7CisgICAgeFs1OV0gPSAodWkgPj4gMSkgKyB2aTsKKworICAgIFNVTURJRkZfUElGT1VSVEgodmksIHZyLCB4WzIwXSwgeFsyMV0pCisgICAgdXIgPSB4WzRdOworICAgIHVpID0geFs1XTsKKyAgICB4WzRdID0gKHVyID4+IDEpICsgdnI7CisgICAgeFs1XSA9ICh1aSA+PiAxKSArIHZpOworICAgIHhbMjBdID0gKHVyID4+IDEpIC0gdnI7CisgICAgeFsyMV0gPSAodWkgPj4gMSkgLSB2aTsKKworICAgIFNVTURJRkZfUElGT1VSVEgodnIsIHZpLCB4WzI4XSwgeFsyOV0pCisgICAgdXIgPSB4WzEyXTsKKyAgICB1aSA9IHhbMTNdOworICAgIHhbMTJdID0gKHVyID4+IDEpICsgdnI7CisgICAgeFsxM10gPSAodWkgPj4gMSkgLSB2aTsKKyAgICB4WzI4XSA9ICh1ciA+PiAxKSAtIHZyOworICAgIHhbMjldID0gKHVpID4+IDEpICsgdmk7CisKKyAgICBTVU1ESUZGX1BJRk9VUlRIKHZpLCB2ciwgeFs1Ml0sIHhbNTNdKQorICAgIHVyID0geFszNl07CisgICAgdWkgPSB4WzM3XTsKKyAgICB4WzM2XSA9ICh1ciA+PiAxKSArIHZyOworICAgIHhbMzddID0gKHVpID4+IDEpICsgdmk7CisgICAgeFs1Ml0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICB4WzUzXSA9ICh1aSA+PiAxKSAtIHZpOworCisgICAgU1VNRElGRl9QSUZPVVJUSCh2ciwgdmksIHhbNjBdLCB4WzYxXSkKKyAgICB1ciA9IHhbNDRdOworICAgIHVpID0geFs0NV07CisgICAgeFs0NF0gPSAodXIgPj4gMSkgKyB2cjsKKyAgICB4WzQ1XSA9ICh1aSA+PiAxKSAtIHZpOworICAgIHhbNjBdID0gKHVyID4+IDEpIC0gdnI7CisgICAgeFs2MV0gPSAodWkgPj4gMSkgKyB2aTsKKworICAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFsyM10sIHhbMjJdLCBmZnQzMl93MzJbMV0pOworICAgIHVyID0geFs2XTsKKyAgICB1aSA9IHhbN107CisgICAgeFs2XSA9ICh1ciA+PiAxKSArIHZyOworICAgIHhbN10gPSAodWkgPj4gMSkgKyB2aTsKKyAgICB4WzIyXSA9ICh1ciA+PiAxKSAtIHZyOworICAgIHhbMjNdID0gKHVpID4+IDEpIC0gdmk7CisKKyAgICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbMzFdLCB4WzMwXSwgZmZ0MzJfdzMyWzFdKTsKKyAgICB1ciA9IHhbMTRdOworICAgIHVpID0geFsxNV07CisgICAgeFsxNF0gPSAodXIgPj4gMSkgKyB2cjsKKyAgICB4WzE1XSA9ICh1aSA+PiAxKSAtIHZpOworICAgIHhbMzBdID0gKHVyID4+IDEpIC0gdnI7CisgICAgeFszMV0gPSAodWkgPj4gMSkgKyB2aTsKKworICAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFs1NV0sIHhbNTRdLCBmZnQzMl93MzJbMV0pOworICAgIHVyID0geFszOF07CisgICAgdWkgPSB4WzM5XTsKKyAgICB4WzM4XSA9ICh1ciA+PiAxKSArIHZyOworICAgIHhbMzldID0gKHVpID4+IDEpICsgdmk7CisgICAgeFs1NF0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICB4WzU1XSA9ICh1aSA+PiAxKSAtIHZpOworCisgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzYzXSwgeFs2Ml0sIGZmdDMyX3czMlsxXSk7CisgICAgdXIgPSB4WzQ2XTsKKyAgICB1aSA9IHhbNDddOworCisgICAgeFs0Nl0gPSAodXIgPj4gMSkgKyB2cjsKKyAgICB4WzQ3XSA9ICh1aSA+PiAxKSAtIHZpOworICAgIHhbNjJdID0gKHVyID4+IDEpIC0gdnI7CisgICAgeFs2M10gPSAodWkgPj4gMSkgKyB2aTsKKworICAgIHZyID0geFszMl07CisgICAgdmkgPSB4WzMzXTsKKyAgICB1ciA9IHhbMF0gPj4gMTsKKyAgICB1aSA9IHhbMV0gPj4gMTsKKyAgICB4WzBdID0gdXIgKyAodnIgPj4gMSk7CisgICAgeFsxXSA9IHVpICsgKHZpID4+IDEpOworICAgIHhbMzJdID0gdXIgLSAodnIgPj4gMSk7CisgICAgeFszM10gPSB1aSAtICh2aSA+PiAxKTsKKworICAgIHZpID0geFs0OF07CisgICAgdnIgPSB4WzQ5XTsKKyAgICB1ciA9IHhbMTZdID4+IDE7CisgICAgdWkgPSB4WzE3XSA+PiAxOworICAgIHhbMTZdID0gdXIgKyAodnIgPj4gMSk7CisgICAgeFsxN10gPSB1aSAtICh2aSA+PiAxKTsKKyAgICB4WzQ4XSA9IHVyIC0gKHZyID4+IDEpOworICAgIHhbNDldID0gdWkgKyAodmkgPj4gMSk7CisKKyAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbMzVdLCB4WzM0XSwgZmZ0MzJfdzMyWzJdKTsKKyAgICB1ciA9IHhbMl07CisgICAgdWkgPSB4WzNdOworICAgIHhbMl0gPSAodXIgPj4gMSkgKyB2cjsKKyAgICB4WzNdID0gKHVpID4+IDEpICsgdmk7CisgICAgeFszNF0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICB4WzM1XSA9ICh1aSA+PiAxKSAtIHZpOworCisgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzUxXSwgeFs1MF0sIGZmdDMyX3czMlsyXSk7CisgICAgdXIgPSB4WzE4XTsKKyAgICB1aSA9IHhbMTldOworICAgIHhbMThdID0gKHVyID4+IDEpICsgdnI7CisgICAgeFsxOV0gPSAodWkgPj4gMSkgLSB2aTsKKyAgICB4WzUwXSA9ICh1ciA+PiAxKSAtIHZyOworICAgIHhbNTFdID0gKHVpID4+IDEpICsgdmk7CisKKyAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbMzddLCB4WzM2XSwgZmZ0MzJfdzMyWzBdKTsKKyAgICB1ciA9IHhbNF07CisgICAgdWkgPSB4WzVdOworICAgIHhbNF0gPSAodXIgPj4gMSkgKyB2cjsKKyAgICB4WzVdID0gKHVpID4+IDEpICsgdmk7CisgICAgeFszNl0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICB4WzM3XSA9ICh1aSA+PiAxKSAtIHZpOworCisgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzUzXSwgeFs1Ml0sIGZmdDMyX3czMlswXSk7CisgICAgdXIgPSB4WzIwXTsKKyAgICB1aSA9IHhbMjFdOworICAgIHhbMjBdID0gKHVyID4+IDEpICsgdnI7CisgICAgeFsyMV0gPSAodWkgPj4gMSkgLSB2aTsKKyAgICB4WzUyXSA9ICh1ciA+PiAxKSAtIHZyOworICAgIHhbNTNdID0gKHVpID4+IDEpICsgdmk7CisKKyAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbMzldLCB4WzM4XSwgZmZ0MzJfdzMyWzNdKTsKKyAgICB1ciA9IHhbNl07CisgICAgdWkgPSB4WzddOworICAgIHhbNl0gPSAodXIgPj4gMSkgKyB2cjsKKyAgICB4WzddID0gKHVpID4+IDEpICsgdmk7CisgICAgeFszOF0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICB4WzM5XSA9ICh1aSA+PiAxKSAtIHZpOworCisgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzU1XSwgeFs1NF0sIGZmdDMyX3czMlszXSk7CisgICAgdXIgPSB4WzIyXTsKKyAgICB1aSA9IHhbMjNdOworICAgIHhbMjJdID0gKHVyID4+IDEpICsgdnI7CisgICAgeFsyM10gPSAodWkgPj4gMSkgLSB2aTsKKyAgICB4WzU0XSA9ICh1ciA+PiAxKSAtIHZyOworICAgIHhbNTVdID0gKHVpID4+IDEpICsgdmk7CisKKyAgICBTVU1ESUZGX1BJRk9VUlRIKHZpLCB2ciwgeFs0MF0sIHhbNDFdKQorICAgIHVyID0geFs4XTsKKyAgICB1aSA9IHhbOV07CisgICAgeFs4XSA9ICh1ciA+PiAxKSArIHZyOworICAgIHhbOV0gPSAodWkgPj4gMSkgKyB2aTsKKyAgICB4WzQwXSA9ICh1ciA+PiAxKSAtIHZyOworICAgIHhbNDFdID0gKHVpID4+IDEpIC0gdmk7CisKKyAgICBTVU1ESUZGX1BJRk9VUlRIKHZyLCB2aSwgeFs1Nl0sIHhbNTddKQorICAgIHVyID0geFsyNF07CisgICAgdWkgPSB4WzI1XTsKKyAgICB4WzI0XSA9ICh1ciA+PiAxKSArIHZyOworICAgIHhbMjVdID0gKHVpID4+IDEpIC0gdmk7CisgICAgeFs1Nl0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICB4WzU3XSA9ICh1aSA+PiAxKSArIHZpOworCisgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzQzXSwgeFs0Ml0sIGZmdDMyX3czMls0XSk7CisgICAgdXIgPSB4WzEwXTsKKyAgICB1aSA9IHhbMTFdOworCisgICAgeFsxMF0gPSAodXIgPj4gMSkgKyB2cjsKKyAgICB4WzExXSA9ICh1aSA+PiAxKSArIHZpOworICAgIHhbNDJdID0gKHVyID4+IDEpIC0gdnI7CisgICAgeFs0M10gPSAodWkgPj4gMSkgLSB2aTsKKworICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFs1OV0sIHhbNThdLCBmZnQzMl93MzJbNF0pOworICAgIHVyID0geFsyNl07CisgICAgdWkgPSB4WzI3XTsKKyAgICB4WzI2XSA9ICh1ciA+PiAxKSArIHZyOworICAgIHhbMjddID0gKHVpID4+IDEpIC0gdmk7CisgICAgeFs1OF0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICB4WzU5XSA9ICh1aSA+PiAxKSArIHZpOworCisgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzQ1XSwgeFs0NF0sIGZmdDMyX3czMlsxXSk7CisgICAgdXIgPSB4WzEyXTsKKyAgICB1aSA9IHhbMTNdOworICAgIHhbMTJdID0gKHVyID4+IDEpICsgdnI7CisgICAgeFsxM10gPSAodWkgPj4gMSkgKyB2aTsKKyAgICB4WzQ0XSA9ICh1ciA+PiAxKSAtIHZyOworICAgIHhbNDVdID0gKHVpID4+IDEpIC0gdmk7CisKKyAgICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbNjFdLCB4WzYwXSwgZmZ0MzJfdzMyWzFdKTsKKyAgICB1ciA9IHhbMjhdOworICAgIHVpID0geFsyOV07CisgICAgeFsyOF0gPSAodXIgPj4gMSkgKyB2cjsKKyAgICB4WzI5XSA9ICh1aSA+PiAxKSAtIHZpOworICAgIHhbNjBdID0gKHVyID4+IDEpIC0gdnI7CisgICAgeFs2MV0gPSAodWkgPj4gMSkgKyB2aTsKKworICAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFs0N10sIHhbNDZdLCBmZnQzMl93MzJbNV0pOworICAgIHVyID0geFsxNF07CisgICAgdWkgPSB4WzE1XTsKKyAgICB4WzE0XSA9ICh1ciA+PiAxKSArIHZyOworICAgIHhbMTVdID0gKHVpID4+IDEpICsgdmk7CisgICAgeFs0Nl0gPSAodXIgPj4gMSkgLSB2cjsKKyAgICB4WzQ3XSA9ICh1aSA+PiAxKSAtIHZpOworCisgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzYzXSwgeFs2Ml0sIGZmdDMyX3czMls1XSk7CisgICAgdXIgPSB4WzMwXTsKKyAgICB1aSA9IHhbMzFdOworICAgIHhbMzBdID0gKHVyID4+IDEpICsgdnI7CisgICAgeFszMV0gPSAodWkgPj4gMSkgLSB2aTsKKyAgICB4WzYyXSA9ICh1ciA+PiAxKSAtIHZyOworICAgIHhbNjNdID0gKHVpID4+IDEpICsgdmk7CisgIH0KIH0KICNlbmRpZiAvKiAjaWZuZGVmIEZVTkNUSU9OX2ZmdF8zMiAqLwogCi0KIC8qKgogICogXGJyaWVmIEFwcGx5IHJvdGF0aW9uIHZlY3RvcnMgdG8gYSBkYXRhIGJ1ZmZlci4KICAqIFxwYXJhbSBjbCBsZW5ndGggb2YgZWFjaCByb3cgb2YgaW5wdXQgZGF0YS4KICAqIFxwYXJhbSBsIHRvdGFsIGxlbmd0aCBvZiBpbnB1dCBkYXRhLgotICogXHBhcmFtIHBWZWNSZSByZWFsIHBhcnQgb2Ygcm90YXRpb24gY2VvZmZpY2llbnQgdmVjdG9yLgotICogXHBhcmFtIHBWZWNJbSBpbWFnaW5hcnkgcGFydCBvZiByb3RhdGlvbiBjZW9mZmljaWVudCB2ZWN0b3IuCisgKiBccGFyYW0gcFZlY1JlIHJlYWwgcGFydCBvZiByb3RhdGlvbiBjb2VmZmljaWVudCB2ZWN0b3IuCisgKiBccGFyYW0gcFZlY0ltIGltYWdpbmFyeSBwYXJ0IG9mIHJvdGF0aW9uIGNvZWZmaWNpZW50IHZlY3Rvci4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIGZmdF9hcHBseV9yb3RfdmVjdG9yKEZJWFBfREJMICpSRVNUUklDVCBwRGF0YSwgY29uc3QgaW50IGNsLCBjb25zdCBpbnQgbCwgY29uc3QgRklYUF9TVEIgKnBWZWNSZSwgY29uc3QgRklYUF9TVEIgKnBWZWNJbSkKLXsKKworLyoKKyAgIFRoaXMgZGVmaW5lcyBwYXRjaGVzIGVhY2ggaW5hY2N1cmF0ZSAweDdGRkYgaS5lLiAwLjk5OTkgYW5kIHVzZXMgMHg4MDAwCisgICAoLTEuMCkgaW5zdGVhZC4gQXQgdGhlIGVuZCwgdGhlIHNpZ24gb2YgdGhlIHJlc3VsdCBpcyBpbnZlcnRlZAorKi8KKyNkZWZpbmUgbm9GRlRfQVBQTFlfUk9UX1ZFQ1RPUl9IUQorCisjaWZuZGVmIEZVTkNUSU9OX2ZmdF9hcHBseV9yb3RfdmVjdG9yX19GSVhQX0RCTAorc3RhdGljIGlubGluZSB2b2lkIGZmdF9hcHBseV9yb3RfdmVjdG9yKEZJWFBfREJMICpSRVNUUklDVCBwRGF0YSwgY29uc3QgaW50IGNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBsLCBjb25zdCBGSVhQX1NUQiAqcFZlY1JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU1RCICpwVmVjSW0pIHsKICAgRklYUF9EQkwgcmUsIGltOwogICBGSVhQX1NUQiB2cmUsIHZpbTsKIAogICBpbnQgaSwgYzsKIAotICBmb3IoaT0wOyBpPGNsOyBpKyspIHsKLSAgICByZSAgPSBwRGF0YVsyKmldOwotICAgIGltICA9IHBEYXRhWzIqaSsxXTsKKyAgZm9yIChpID0gMDsgaSA8IGNsOyBpKyspIHsKKyAgICByZSA9IHBEYXRhWzIgKiBpXTsKKyAgICBpbSA9IHBEYXRhWzIgKiBpICsgMV07CiAKLSAgICBwRGF0YVsyKmldICAgPSByZT4+MjsgLyogKiAwLjI1ICovCi0gICAgcERhdGFbMippKzFdID0gaW0+PjI7IC8qICogMC4yNSAqLworICAgIHBEYXRhWzIgKiBpXSA9IHJlID4+IDI7ICAgICAvKiAqIDAuMjUgKi8KKyAgICBwRGF0YVsyICogaSArIDFdID0gaW0gPj4gMjsgLyogKiAwLjI1ICovCiAgIH0KLSAgZm9yKDsgaTxsOyBpKz1jbCkKLSAgewotICAgIHJlICA9IHBEYXRhWzIqaV07Ci0gICAgaW0gID0gcERhdGFbMippKzFdOworICBmb3IgKDsgaSA8IGw7IGkgKz0gY2wpIHsKKyAgICByZSA9IHBEYXRhWzIgKiBpXTsKKyAgICBpbSA9IHBEYXRhWzIgKiBpICsgMV07CiAKLSAgICBwRGF0YVsyKmldICAgPSByZT4+MjsgLyogKiAwLjI1ICovCi0gICAgcERhdGFbMippKzFdID0gaW0+PjI7IC8qICogMC4yNSAqLworICAgIHBEYXRhWzIgKiBpXSA9IHJlID4+IDI7ICAgICAvKiAqIDAuMjUgKi8KKyAgICBwRGF0YVsyICogaSArIDFdID0gaW0gPj4gMjsgLyogKiAwLjI1ICovCiAKLSAgICBmb3IgKGM9aSsxOyBjPGkrY2w7IGMrKykKLSAgICB7Ci0gICAgICByZSAgPSBwRGF0YVsyKmNdPj4xOwotICAgICAgaW0gID0gcERhdGFbMipjKzFdPj4xOworICAgIGZvciAoYyA9IGkgKyAxOyBjIDwgaSArIGNsOyBjKyspIHsKKyAgICAgIHJlID0gcERhdGFbMiAqIGNdID4+IDE7CisgICAgICBpbSA9IHBEYXRhWzIgKiBjICsgMV0gPj4gMTsKICAgICAgIHZyZSA9ICpwVmVjUmUrKzsKICAgICAgIHZpbSA9ICpwVmVjSW0rKzsKIAotICAgICAgY3BseE11bHREaXYyKCZwRGF0YVsyKmMrMV0sICZwRGF0YVsyKmNdLCBpbSwgcmUsIHZyZSwgdmltKTsKKyAgICAgIGNwbHhNdWx0RGl2MigmcERhdGFbMiAqIGMgKyAxXSwgJnBEYXRhWzIgKiBjXSwgaW0sIHJlLCB2cmUsIHZpbSk7CiAgICAgfQogICB9CiB9Ci0KLSNkZWZpbmUgRkZUX1RXT19TVEFHRV9NQUNST19FTkFCTEUKLQotCi0jaWZkZWYgRkZUX1RXT19TVEFHRV9NQUNST19FTkFCTEUKLQotI2RlZmluZSBmZnROMihwSW5wdXQsIGxlbmd0aCwgZGltMSwgZGltMiwgZmZ0X2Z1bmMxLCBmZnRfZnVuYzIsIFJvdFZlY3RvclJlYWwsIFJvdFZlY3RvckltYWcpIFwKLXsgXAotICBpbnQgICAgICAgaSwgajsgXAotIFwKLSAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGFEc3QsIEZJWFBfREJMLCBsZW5ndGgqMik7IFwKLSAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGFEc3QyLCBGSVhQX0RCTCwgZGltMioyKTsgXAotIFwKLSAgRkRLX0FTU0VSVChsZW5ndGggPT0gZGltMSpkaW0yKTsgXAotIFwKLSAgLyogUGVyZm9ybSBkaW0yIHRpbWVzIHRoZSBmZnQgb2YgbGVuZ3RoIGRpbTEuIFRoZSBpbnB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzcyBvZiBwU3JjIGFuZCB0aGUgXAotICBvdXRwdXQgc2FtcGxlcyBhcmUgYXQgdGhlIGFkZHJlc3Mgb2YgcERzdC4gVGhlIGlucHV0IHZlY3RvciBmb3IgdGhlIGZmdCBvZiBsZW5ndGggZGltMSBpcyBidWlsdCBcCi0gIG9mIHRoZSBpbnRlcmxlYXZlZCBzYW1wbGVzIGluIHBTcmMsIHRoZSBvdXRwdXQgc2FtcGxlcyBhcmUgc3RvcmVkIGNvbnNlY3V0aXZlbHkuIFwKLSAgKi8gXAotICB7IFwKLSAgICBjb25zdCBGSVhQX0RCTCogcFNyYyA9IHBJbnB1dDsgXAotICAgIEZJWFBfREJMICAqUkVTVFJJQ1QgcERzdCA9IGFEc3Q7IFwKLSAgICBcCi0gICAgZm9yKGk9MDsgaTxkaW0yOyBpKyspIFwKLSAgICB7IFwKLSAgICAgIGZvcihqPTA7IGo8ZGltMTsgaisrKSBcCi0gICAgICB7IFwKLSAgICAgICAgcERzdFsyKmpdICAgPSBwU3JjWzIqaipkaW0yXTsgXAotICAgICAgICBwRHN0WzIqaisxXSA9IHBTcmNbMipqKmRpbTIrMV07IFwKLSAgICAgIH0gXAotICAgICAgXAotICAgICAgZmZ0X2Z1bmMxKHBEc3QpOyBcCi0gICAgICBwU3JjICs9IDI7IFwKLSAgICAgIHBEc3QgPSBwRHN0ICsgMipkaW0xOyBcCi0gICAgfSBcCi0gIH0gXAotICBcCi0gIC8qIFBlcmZvcm0gdGhlIG1vZHVsYXRpb24gb2YgdGhlIG91dHB1dCBvZiB0aGUgZmZ0IG9mIGxlbmd0aCBkaW0xICovIFwKLSAgZmZ0X2FwcGx5X3JvdF92ZWN0b3IoYURzdCwgZGltMSwgbGVuZ3RoLCBSb3RWZWN0b3JSZWFsLCBSb3RWZWN0b3JJbWFnKTsgXAotICBcCi0gIC8qIFBlcmZvcm0gZGltMSB0aW1lcyB0aGUgZmZ0IG9mIGxlbmd0aCBkaW0yLiBUaGUgaW5wdXQgc2FtcGxlcyBhcmUgYXQgdGhlIGFkZHJlc3Mgb2YgYURzdCBhbmQgdGhlIFwKLSAgb3V0cHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzIG9mIHBJbnB1dC4gVGhlIGlucHV0IHZlY3RvciBmb3IgdGhlIGZmdCBvZiBsZW5ndGggZGltMiBpcyBidWlsdCBcCi0gIG9mIHRoZSBpbnRlcmxlYXZlZCBzYW1wbGVzIGluIGFEc3QsIHRoZSBvdXRwdXQgc2FtcGxlcyBhcmUgc3RvcmVkIGNvbnNlY3V0aXZlbHkgYXQgdGhlIGFkZHJlc3MgXAotICBvZiBwSW5wdXQuIFwKLSAgKi8gXAotICB7IFwKLSAgICBjb25zdCBGSVhQX0RCTCogcFNyYyAgICAgICA9IGFEc3Q7IFwKLSAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERzdCAgICA9IGFEc3QyOyBcCi0gICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEc3RPdXQgPSBwSW5wdXQ7IFwKLSAgICBcCi0gICAgZm9yKGk9MDsgaTxkaW0xOyBpKyspIFwKLSAgICB7IFwKLSAgICAgIGZvcihqPTA7IGo8ZGltMjsgaisrKSBcCi0gICAgICB7IFwKLSAgICAgICAgcERzdFsyKmpdICAgPSBwU3JjWzIqaipkaW0xXTsgXAotICAgICAgICBwRHN0WzIqaisxXSA9IHBTcmNbMipqKmRpbTErMV07IFwKLSAgICAgIH0gXAotICAgICAgXAotICAgICAgZmZ0X2Z1bmMyKHBEc3QpOyBcCi0gICAgICBcCi0gICAgICBmb3Ioaj0wOyBqPGRpbTI7IGorKykgXAotICAgICAgeyBcCi0gICAgICAgIHBEc3RPdXRbMipqKmRpbTFdICAgPSBwRHN0WzIqal07IFwKLSAgICAgICAgcERzdE91dFsyKmoqZGltMSsxXSA9IHBEc3RbMipqKzFdOyBcCi0gICAgICB9IFwKLSAgICAgIHBTcmMgKz0gMjsgXAotICAgICAgcERzdE91dCArPSAyOyBcCi0gICAgfSBcCi0gIH0gXAotICBcCi0gIENfQUxMT0NfU0NSQVRDSF9FTkQoYURzdDIsIEZJWFBfREJMLCBkaW0yKjIpOyBcCi0gIENfQUxMT0NfU0NSQVRDSF9FTkQoYURzdCwgRklYUF9EQkwsIGxlbmd0aCoyKTsgXAotfSBcCi0KLSNlbHNlIC8qIEZGVF9UV09fU1RBR0VfTUFDUk9fRU5BQkxFICovCisjZW5kaWYgLyogRlVOQ1RJT05fZmZ0X2FwcGx5X3JvdF92ZWN0b3JfX0ZJWFBfREJMICovCiAKIC8qIHNlbGVjdCBlaXRoZXIgc3dpdGNoIGNhc2Ugb2YgZnVuY3Rpb24gcG9pbnRlci4gKi8KIC8vI2RlZmluZSBGRlRfVFdPX1NUQUdFX1NXSVRDSF9DQVNFCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmZnROMigKLSAgICAgICAgRklYUF9EQkwgKnBJbnB1dCwKLSAgICAgICAgY29uc3QgaW50IGxlbmd0aCwKLSAgICAgICAgY29uc3QgaW50IGRpbTEsCi0gICAgICAgIGNvbnN0IGludCBkaW0yLAotICAgICAgICB2b2lkICgqIGNvbnN0IGZmdDEpKEZJWFBfREJMICopLAotICAgICAgICB2b2lkICgqIGNvbnN0IGZmdDIpKEZJWFBfREJMICopLAotICAgICAgICBjb25zdCBGSVhQX1NUQiAqUm90VmVjdG9yUmVhbCwKLSAgICAgICAgY29uc3QgRklYUF9TVEIgKlJvdFZlY3RvckltYWcKLSAgICAgICAgKQotewotICAvKiBUaGUgcmVhbCBwYXJ0IG9mIHRoZSBpbnB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzc2VzIHdpdGggZXZlbiBpbmRpY2VzIGFuZCB0aGUgaW1hZ2luYXJ5Ci0gIHBhcnQgb2YgdGhlIGlucHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzZXMgd2l0aCBvZGQgaW5kaWNlcy4gVGhlIG91dHB1dCBzYW1wbGVzIGFyZSBzdG9yZWQKLSAgYXQgdGhlIGFkZHJlc3Mgb2YgcElucHV0CisjaWZuZGVmIEZVTkNUSU9OX2ZmdE4yX2Z1bmMKK3N0YXRpYyBpbmxpbmUgdm9pZCBmZnROMl9mdW5jKEZJWFBfREJMICpwSW5wdXQsIGNvbnN0IGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZGltMSwgY29uc3QgaW50IGRpbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqY29uc3QgZmZ0MSkoRklYUF9EQkwgKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqY29uc3QgZmZ0MikoRklYUF9EQkwgKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NUQiAqUm90VmVjdG9yUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU1RCICpSb3RWZWN0b3JJbWFnLCBGSVhQX0RCTCAqYURzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICphRHN0MikgeworICAvKiBUaGUgcmVhbCBwYXJ0IG9mIHRoZSBpbnB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzc2VzIHdpdGggZXZlbiBpbmRpY2VzCisgIGFuZCB0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgdGhlIGlucHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzZXMgd2l0aCBvZGQKKyAgaW5kaWNlcy4gVGhlIG91dHB1dCBzYW1wbGVzIGFyZSBzdG9yZWQgYXQgdGhlIGFkZHJlc3Mgb2YgcElucHV0CiAgICovCi0gIEZJWFBfREJMICAqcFNyYywgKnBEc3QsICpwRHN0T3V0OwotICBpbnQgICAgICAgaSwgajsKKyAgRklYUF9EQkwgKnBTcmMsICpwRHN0LCAqcERzdE91dDsKKyAgaW50IGk7CiAKLSAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGFEc3QsIEZJWFBfREJMLCBsZW5ndGgqMik7Ci0gIENfQUxMT0NfU0NSQVRDSF9TVEFSVChhRHN0MiwgRklYUF9EQkwsIGRpbTIqMik7Ci0gICAgIAotICBGREtfQVNTRVJUKGxlbmd0aCA9PSBkaW0xKmRpbTIpOworICBGREtfQVNTRVJUKGxlbmd0aCA9PSBkaW0xICogZGltMik7CiAKLSAgLyogUGVyZm9ybSBkaW0yIHRpbWVzIHRoZSBmZnQgb2YgbGVuZ3RoIGRpbTEuIFRoZSBpbnB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzcyBvZiBwU3JjIGFuZCB0aGUKLSAgb3V0cHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzIG9mIHBEc3QuIFRoZSBpbnB1dCB2ZWN0b3IgZm9yIHRoZSBmZnQgb2YgbGVuZ3RoIGRpbTEgaXMgYnVpbHQKLSAgb2YgdGhlIGludGVybGVhdmVkIHNhbXBsZXMgaW4gcFNyYywgdGhlIG91dHB1dCBzYW1wbGVzIGFyZSBzdG9yZWQgY29uc2VjdXRpdmVseS4KKyAgLyogUGVyZm9ybSBkaW0yIHRpbWVzIHRoZSBmZnQgb2YgbGVuZ3RoIGRpbTEuIFRoZSBpbnB1dCBzYW1wbGVzIGFyZSBhdCB0aGUKKyAgYWRkcmVzcyBvZiBwU3JjIGFuZCB0aGUgb3V0cHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzIG9mIHBEc3QuIFRoZSBpbnB1dAorICB2ZWN0b3IgZm9yIHRoZSBmZnQgb2YgbGVuZ3RoIGRpbTEgaXMgYnVpbHQgb2YgdGhlIGludGVybGVhdmVkIHNhbXBsZXMgaW4gcFNyYywKKyAgdGhlIG91dHB1dCBzYW1wbGVzIGFyZSBzdG9yZWQgY29uc2VjdXRpdmVseS4KICAgKi8KICAgcFNyYyA9IHBJbnB1dDsKICAgcERzdCA9IGFEc3Q7Ci0gIGZvcihpPTA7IGk8bGVuZ3RoL2RpbTE7IGkrKykKLSAgewotICAgIGZvcihqPTA7IGo8bGVuZ3RoL2RpbTI7IGorKykKLSAgICB7Ci0gICAgICBwRHN0WzIqal0gICA9IHBTcmNbMipqKmRpbTJdOwotICAgICAgcERzdFsyKmorMV0gPSBwU3JjWzIqaipkaW0yKzFdOworICBmb3IgKGkgPSAwOyBpIDwgZGltMjsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkaW0xOyBqKyspIHsKKyAgICAgIHBEc3RbMiAqIGpdID0gcFNyY1syICogaiAqIGRpbTJdOworICAgICAgcERzdFsyICogaiArIDFdID0gcFNyY1syICogaiAqIGRpbTIgKyAxXTsKICAgICB9CiAKLSAgICAvKiBmZnQgb2Ygc2l6ZSBkaW0xICovCisgICAgICAvKiBmZnQgb2Ygc2l6ZSBkaW0xICovCiAjaWZuZGVmIEZGVF9UV09fU1RBR0VfU1dJVENIX0NBU0UKICAgICBmZnQxKHBEc3QpOwogI2Vsc2UKICAgICBzd2l0Y2ggKGRpbTEpIHsKLSAgICAgIGNhc2UgMzogZmZ0MyhwRHN0KTsgYnJlYWs7Ci0gICAgICBjYXNlIDQ6IGZmdF80KHBEc3QpOyBicmVhazsKLSAgICAgIGNhc2UgNTogZmZ0NShwRHN0KTsgYnJlYWs7Ci0gICAgICBjYXNlIDg6IGZmdF84KHBEc3QpOyBicmVhazsKLSAgICAgIGNhc2UgMTU6IGZmdDE1KHBEc3QpOyBicmVhazsKLSAgICAgIGNhc2UgMTY6IGZmdF8xNihwRHN0KTsgYnJlYWs7Ci0gICAgICBjYXNlIDMyOiBmZnRfMzIocERzdCk7IGJyZWFrOwotICAgICAgLypjYXNlIDY0OiBmZnRfNjQocERzdCk7IGJyZWFrOyovCi0gICAgICBjYXNlIDEyODogZmZ0XzEyOChwRHN0KTsgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIGZmdDIocERzdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOgorICAgICAgICBmZnQzKHBEc3QpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgZmZ0XzQocERzdCk7CisgICAgICAgIGJyZWFrOworICAgICAgLyogY2FzZSA1OiBmZnQ1KHBEc3QpOyBicmVhazsgKi8KKyAgICAgIC8qIGNhc2UgODogZmZ0XzgocERzdCk7IGJyZWFrOyAqLworICAgICAgY2FzZSAxMjoKKyAgICAgICAgZmZ0MTIocERzdCk7CisgICAgICAgIGJyZWFrOworICAgICAgLyogY2FzZSAxNTogZmZ0MTUocERzdCk7IGJyZWFrOyAqLworICAgICAgY2FzZSAxNjoKKyAgICAgICAgZmZ0XzE2KHBEc3QpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzI6CisgICAgICAgIGZmdF8zMihwRHN0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIC8qY2FzZSA2NDogZmZ0XzY0KHBEc3QpOyBicmVhazsqLworICAgICAgICAvKiBjYXNlIDEyODogZmZ0XzEyOChwRHN0KTsgYnJlYWs7ICovCiAgICAgfQogI2VuZGlmCiAgICAgcFNyYyArPSAyOwotICAgIHBEc3QgPSBwRHN0ICsgMipsZW5ndGgvZGltMjsKKyAgICBwRHN0ID0gcERzdCArIDIgKiBkaW0xOwogICB9CiAKICAgLyogUGVyZm9ybSB0aGUgbW9kdWxhdGlvbiBvZiB0aGUgb3V0cHV0IG9mIHRoZSBmZnQgb2YgbGVuZ3RoIGRpbTEgKi8KLSAgcFNyYz1hRHN0OwotICBmZnRfYXBwbHlfcm90X3ZlY3RvcihwU3JjLCBsZW5ndGgvZGltMiwgbGVuZ3RoLCBSb3RWZWN0b3JSZWFsLCBSb3RWZWN0b3JJbWFnKTsKKyAgcFNyYyA9IGFEc3Q7CisgIGZmdF9hcHBseV9yb3RfdmVjdG9yKHBTcmMsIGRpbTEsIGxlbmd0aCwgUm90VmVjdG9yUmVhbCwgUm90VmVjdG9ySW1hZyk7CiAKLSAgLyogUGVyZm9ybSBkaW0xIHRpbWVzIHRoZSBmZnQgb2YgbGVuZ3RoIGRpbTIuIFRoZSBpbnB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzcyBvZiBhRHN0IGFuZCB0aGUKLSAgb3V0cHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzIG9mIHBJbnB1dC4gVGhlIGlucHV0IHZlY3RvciBmb3IgdGhlIGZmdCBvZiBsZW5ndGggZGltMiBpcyBidWlsdAotICBvZiB0aGUgaW50ZXJsZWF2ZWQgc2FtcGxlcyBpbiBhRHN0LCB0aGUgb3V0cHV0IHNhbXBsZXMgYXJlIHN0b3JlZCBjb25zZWN1dGl2ZWx5IGF0IHRoZSBhZGRyZXNzCi0gIG9mIHBJbnB1dC4KKyAgLyogUGVyZm9ybSBkaW0xIHRpbWVzIHRoZSBmZnQgb2YgbGVuZ3RoIGRpbTIuIFRoZSBpbnB1dCBzYW1wbGVzIGFyZSBhdCB0aGUKKyAgYWRkcmVzcyBvZiBhRHN0IGFuZCB0aGUgb3V0cHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzIG9mIHBJbnB1dC4gVGhlIGlucHV0CisgIHZlY3RvciBmb3IgdGhlIGZmdCBvZiBsZW5ndGggZGltMiBpcyBidWlsdCBvZiB0aGUgaW50ZXJsZWF2ZWQgc2FtcGxlcyBpbiBhRHN0LAorICB0aGUgb3V0cHV0IHNhbXBsZXMgYXJlIHN0b3JlZCBjb25zZWN1dGl2ZWx5IGF0IHRoZSBhZGRyZXNzIG9mIHBJbnB1dC4KICAgKi8KLSAgcFNyYyAgICA9IGFEc3Q7Ci0gIHBEc3QgICAgPSBhRHN0MjsKKyAgcFNyYyA9IGFEc3Q7CisgIHBEc3QgPSBhRHN0MjsKICAgcERzdE91dCA9IHBJbnB1dDsKLSAgZm9yKGk9MDsgaTxsZW5ndGgvZGltMjsgaSsrKQotICB7Ci0gICAgZm9yKGo9MDsgajxsZW5ndGgvZGltMTsgaisrKQotICAgIHsKLSAgICAgIHBEc3RbMipqXSAgID0gcFNyY1syKmoqZGltMV07Ci0gICAgICBwRHN0WzIqaisxXSA9IHBTcmNbMipqKmRpbTErMV07CisgIGZvciAoaSA9IDA7IGkgPCBkaW0xOyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGRpbTI7IGorKykgeworICAgICAgcERzdFsyICogal0gPSBwU3JjWzIgKiBqICogZGltMV07CisgICAgICBwRHN0WzIgKiBqICsgMV0gPSBwU3JjWzIgKiBqICogZGltMSArIDFdOwogICAgIH0KIAogI2lmbmRlZiBGRlRfVFdPX1NUQUdFX1NXSVRDSF9DQVNFCiAgICAgZmZ0MihwRHN0KTsKICNlbHNlCiAgICAgc3dpdGNoIChkaW0yKSB7Ci0gICAgICBjYXNlIDM6IGZmdDMocERzdCk7IGJyZWFrOwotICAgICAgY2FzZSA0OiBmZnRfNChwRHN0KTsgYnJlYWs7Ci0gICAgICBjYXNlIDU6IGZmdDUocERzdCk7IGJyZWFrOwotICAgICAgY2FzZSA4OiBmZnRfOChwRHN0KTsgYnJlYWs7Ci0gICAgICBjYXNlIDE1OiBmZnQxNShwRHN0KTsgYnJlYWs7Ci0gICAgICBjYXNlIDE2OiBmZnRfMTYocERzdCk7IGJyZWFrOwotICAgICAgY2FzZSAzMjogZmZ0XzMyKHBEc3QpOyBicmVhazsKLSAgICAgIC8qY2FzZSA2NDogZmZ0XzY0KHBEc3QpOyBicmVhazsqLwotICAgICAgY2FzZSAxMjg6IGZmdF8xMjgocERzdCk7IGJyZWFrOworICAgICAgY2FzZSA0OgorICAgICAgICBmZnRfNChwRHN0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDk6CisgICAgICAgIGZmdDkocERzdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMjoKKyAgICAgICAgZmZ0MTIocERzdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNToKKyAgICAgICAgZmZ0MTUocERzdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNjoKKyAgICAgICAgZmZ0XzE2KHBEc3QpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzI6CisgICAgICAgIGZmdF8zMihwRHN0KTsKKyAgICAgICAgYnJlYWs7CiAgICAgfQogI2VuZGlmCiAKLSAgICBmb3Ioaj0wOyBqPGxlbmd0aC9kaW0xOyBqKyspCi0gICAgewotICAgICAgcERzdE91dFsyKmoqZGltMV0gICA9IHBEc3RbMipqXTsKLSAgICAgIHBEc3RPdXRbMipqKmRpbTErMV0gPSBwRHN0WzIqaisxXTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGRpbTI7IGorKykgeworICAgICAgcERzdE91dFsyICogaiAqIGRpbTFdID0gcERzdFsyICogal07CisgICAgICBwRHN0T3V0WzIgKiBqICogZGltMSArIDFdID0gcERzdFsyICogaiArIDFdOwogICAgIH0KICAgICBwU3JjICs9IDI7CiAgICAgcERzdE91dCArPSAyOwogICB9Ci0KLSAgQ19BTExPQ19TQ1JBVENIX0VORChhRHN0MiwgRklYUF9EQkwsIGRpbTIqMik7Ci0gIENfQUxMT0NfU0NSQVRDSF9FTkQoYURzdCwgRklYUF9EQkwsIGxlbmd0aCoyKTsKIH0KKyNlbmRpZiAvKiBGVU5DVElPTl9mZnROMl9mdW5jdGlvbiAqLwogCi0jZW5kaWYgLyogRkZUX1RXT19TVEFHRV9NQUNST19FTkFCTEUgKi8KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLSNkZWZpbmUgU0NBTEVGQUNUT1I2MCAgICAgICAgIDUKLS8qKgotVGhlIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBmZnQgb2YgbGVuZ3RoIDYwLiBJdCBpcyBzcGxpdHRldCBpbnRvIGZmdCdzIG9mIGxlbmd0aCA0IGFuZCBmZnQncyBvZgotbGVuZ3RoIDE1LiBCZXR3ZWVuIHRoZSBmZnQncyBhIG1vZG9sYXRpb24gaXMgY2FsY3VsYXRlZC4KLSovCi1zdGF0aWMgaW5saW5lIHZvaWQgZmZ0NjAoRklYUF9EQkwgKnBJbnB1dCwgSU5UICpwU2NhbGVmYWN0b3IpCi17Ci0gIGZmdE4yKAotICAgICAgICAgIHBJbnB1dCwgNjAsIDQsIDE1LCAKLSAgICAgICAgICBmZnRfNCwgZmZ0MTUsCi0gICAgICAgICAgUm90VmVjdG9yUmVhbDYwLCBSb3RWZWN0b3JJbWFnNjAKLSAgICAgICAgICApOwotICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SNjA7Ci19Ci0KLQotCi0vKiBGYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBpbiBjYXNlIG9mIG5vIGJldHRlciBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUuICovCi0KLSNkZWZpbmUgU0NBTEVGQUNUT1IyNDAgICAgICAgIDcKLQotLyoqCi1UaGUgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIGZmdCBvZiBsZW5ndGggMjQwLiBJdCBpcyBzcGxpdHRldCBpbnRvIGZmdCdzIG9mIGxlbmd0aCAxNiBhbmQgZmZ0J3Mgb2YKLWxlbmd0aCAxNS4gQmV0d2VlbiB0aGUgZmZ0J3MgYSBtb2R1bGF0aW9uIGlzIGNhbGN1bGF0ZWQuCi0qLwotc3RhdGljIGlubGluZSB2b2lkIGZmdDI0MChGSVhQX0RCTCAqcElucHV0LCBJTlQgKnBTY2FsZWZhY3RvcikKLXsKLSAgZmZ0TjIoCi0gICAgICAgICAgcElucHV0LCAyNDAsIDE2LCAxNSwgCi0gICAgICAgICAgZmZ0XzE2LCBmZnQxNSwKLSAgICAgICAgICBSb3RWZWN0b3JSZWFsMjQwLCBSb3RWZWN0b3JJbWFnMjQwCi0gICAgICAgICAgKTsKLSAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjI0MDsKLX0KLQotCi0jZGVmaW5lIFNDQUxFRkFDVE9SNDgwICAgICAgICA4Ci0jZGVmaW5lIE4zMiAgICAgICAgICAgICAgICAgICAzMgotI2RlZmluZSBUQUJMRV9TSVpFXzE2ICAgICAgICAoMzIvMikKLQotLyoqCi1UaGUgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIGZmdCBvZiBsZW5ndGggNDgwLiBJdCBpcyBzcGxpdHRldCBpbnRvIGZmdCdzIG9mIGxlbmd0aCAzMiBhbmQgZmZ0J3Mgb2YKLWxlbmd0aCAxNS4gQmV0d2VlbiB0aGUgZmZ0J3MgYSBtb2R1bGF0aW9uIGlzIGNhbGN1bGF0ZWQuCi0qLwotc3RhdGljIGlubGluZSB2b2lkIGZmdDQ4MChGSVhQX0RCTCAqcElucHV0LCBJTlQgKnBTY2FsZWZhY3RvcikKLXsKLSAgZmZ0TjIoCi0gICAgICAgICAgcElucHV0LCA0ODAsIDMyLCAxNSwgCi0gICAgICAgICAgZmZ0XzMyLCBmZnQxNSwKLSAgICAgICAgICBSb3RWZWN0b3JSZWFsNDgwLCBSb3RWZWN0b3JJbWFnNDgwCi0gICAgICAgICAgKTsKLSAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjQ4MDsKLX0KLQotdm9pZCBmZnQoaW50IGxlbmd0aCwgRklYUF9EQkwgKnBJbnB1dCwgSU5UICpwU2NhbGVmYWN0b3IpCi17Ci0gIGlmIChsZW5ndGggPT0gMzIpCi0gIHsKLSAgICAgIGZmdF8zMihwSW5wdXQpOwotICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjMyOworI2RlZmluZSBmZnROMihEQVRBX1RZUEUsIHBJbnB1dCwgbGVuZ3RoLCBkaW0xLCBkaW0yLCBmZnRfZnVuYzEsIGZmdF9mdW5jMiwgXAorICAgICAgICAgICAgICBSb3RWZWN0b3JSZWFsLCBSb3RWZWN0b3JJbWFnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQoYURzdCwgREFUQV9UWVBFLCAyICogbGVuZ3RoKSAgICAgICAgICAgICAgICAgICAgXAorICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQoYURzdDIsIERBVEFfVFlQRSwgMiAqIGRpbTIpICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZmdE4yX2Z1bmMocElucHV0LCBsZW5ndGgsIGRpbTEsIGRpbTIsIGZmdF9mdW5jMSwgZmZ0X2Z1bmMyLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgUm90VmVjdG9yUmVhbCwgUm90VmVjdG9ySW1hZywgYURzdCwgYURzdDIpOyAgICAgICAgICAgICAgICAgXAorICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKGFEc3QyLCBEQVRBX1RZUEUsIDIgKiBkaW0yKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKGFEc3QsIERBVEFfVFlQRSwgMiAqIGxlbmd0aCkgICAgICAgICAgICAgICAgICAgICAgXAogICB9Ci0gIGVsc2UKLSAgewotICAKLSAgc3dpdGNoIChsZW5ndGgpIHsKLSAgICBjYXNlIDE2OgotICAgICAgZmZ0XzE2KHBJbnB1dCk7Ci0gICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICBmZnRfOChwSW5wdXQpOwotICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBmZnQzKHBJbnB1dCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBmZnRfNChwSW5wdXQpOwotICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDU6Ci0gICAgICBmZnQ1KHBJbnB1dCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE1OgotICAgICAgZmZ0MTUocElucHV0KTsKLSAgICAgICpwU2NhbGVmYWN0b3IgKz0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNjA6Ci0gICAgICBmZnQ2MChwSW5wdXQsIHBTY2FsZWZhY3Rvcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY0OgotICAgICAgZGl0X2ZmdChwSW5wdXQsIDYsIFNpbmVUYWJsZTUxMiwgNTEyKTsKLSAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1I2NDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQwOgotICAgICAgZmZ0MjQwKHBJbnB1dCwgcFNjYWxlZmFjdG9yKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjU2OgotICAgICAgZGl0X2ZmdChwSW5wdXQsIDgsIFNpbmVUYWJsZTUxMiwgNTEyKTsKLSAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1IyNTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ4MDoKLSAgICAgIGZmdDQ4MChwSW5wdXQsIHBTY2FsZWZhY3Rvcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDUxMjoKLSAgICAgIGRpdF9mZnQocElucHV0LCA5LCBTaW5lVGFibGU1MTIsIDUxMik7Ci0gICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SNTEyOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEZES19BU1NFUlQoMCk7IC8qIEZGVCBsZW5ndGggbm90IHN1cHBvcnRlZCEgKi8KLSAgICAgIGJyZWFrOwotICB9CisKKyAgLyohCisgICAqCisgICAqICBcYnJpZWYgIGNvbXBsZXggRkZUIG9mIGxlbmd0aCAxMiwxOCwyNCwzMCw0OCw2MCw5NiwgMTkyLCAyNDAsIDM4NCwgNDgwCisgICAqICBccGFyYW0gIHBJbnB1dCBjb250YWlucyB0aGUgaW5wdXQgc2lnbmFsIHByZXNjYWxlZCByaWdodCBieSAyCisgICAqICAgICAgICAgIHBJbnB1dCBjb250YWlucyB0aGUgb3V0cHV0IHNpZ25hbCBzY2FsZWQgYnkgU0NBTEVGQUNUT1I8I2xlbmd0aD4KKyAgICogICAgICAgICAgVGhlIG91dHB1dCBzaWduYWwgZG9lcyBub3QgaGF2ZSBhbnkgZml4ZWQgaGVhZHJvb20KKyAgICogIFxyZXR1cm4gdm9pZAorICAgKgorICAgKi8KKworI2lmbmRlZiBGVU5DVElPTl9mZnQ2CitzdGF0aWMgaW5saW5lIHZvaWQgZmZ0NihGSVhQX0RCTCAqcElucHV0KSB7CisgIGZmdE4yKEZJWFBfREJMLCBwSW5wdXQsIDYsIDIsIDMsIGZmdDIsIGZmdDMsIFJvdFZlY3RvclJlYWw2LCBSb3RWZWN0b3JJbWFnNik7Cit9CisjZW5kaWYgLyogI2lmbmRlZiBGVU5DVElPTl9mZnQ2ICovCisKKyNpZm5kZWYgRlVOQ1RJT05fZmZ0MTIKK3N0YXRpYyBpbmxpbmUgdm9pZCBmZnQxMihGSVhQX0RCTCAqcElucHV0KSB7CisgIGZmdE4yKEZJWFBfREJMLCBwSW5wdXQsIDEyLCAzLCA0LCBmZnQzLCBmZnRfNCwgUm90VmVjdG9yUmVhbDEyLAorICAgICAgICBSb3RWZWN0b3JJbWFnMTIpOyAvKiAxNiw1OCAqLworfQorI2VuZGlmIC8qICNpZm5kZWYgRlVOQ1RJT05fZmZ0MTIgKi8KKworI2lmbmRlZiBGVU5DVElPTl9mZnQyMAorc3RhdGljIGlubGluZSB2b2lkIGZmdDIwKEZJWFBfREJMICpwSW5wdXQpIHsKKyAgZmZ0TjIoRklYUF9EQkwsIHBJbnB1dCwgMjAsIDQsIDUsIGZmdF80LCBmZnQ1LCBSb3RWZWN0b3JSZWFsMjAsCisgICAgICAgIFJvdFZlY3RvckltYWcyMCk7Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fZmZ0MjAgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGZmdDI0KEZJWFBfREJMICpwSW5wdXQpIHsKKyAgZmZ0TjIoRklYUF9EQkwsIHBJbnB1dCwgMjQsIDIsIDEyLCBmZnQyLCBmZnQxMiwgUm90VmVjdG9yUmVhbDI0LAorICAgICAgICBSb3RWZWN0b3JJbWFnMjQpOyAvKiAxNiw3MyAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmZ0NDgoRklYUF9EQkwgKnBJbnB1dCkgeworICBmZnROMihGSVhQX0RCTCwgcElucHV0LCA0OCwgNCwgMTIsIGZmdF80LCBmZnQxMiwgUm90VmVjdG9yUmVhbDQ4LAorICAgICAgICBSb3RWZWN0b3JJbWFnNDgpOyAvKiAxNiwzMiAqLworfQorCisjaWZuZGVmIEZVTkNUSU9OX2ZmdDYwCitzdGF0aWMgaW5saW5lIHZvaWQgZmZ0NjAoRklYUF9EQkwgKnBJbnB1dCkgeworICBmZnROMihGSVhQX0RCTCwgcElucHV0LCA2MCwgNCwgMTUsIGZmdF80LCBmZnQxNSwgUm90VmVjdG9yUmVhbDYwLAorICAgICAgICBSb3RWZWN0b3JJbWFnNjApOyAvKiAxNSw1MSAqLworfQorI2VuZGlmIC8qIEZVTkNUSU9OX2ZmdDYwICovCisKKyNpZm5kZWYgRlVOQ1RJT05fZmZ0ODAKK3N0YXRpYyBpbmxpbmUgdm9pZCBmZnQ4MChGSVhQX0RCTCAqcElucHV0KSB7CisgIGZmdE4yKEZJWFBfREJMLCBwSW5wdXQsIDgwLCA1LCAxNiwgZmZ0NSwgZmZ0XzE2LCBSb3RWZWN0b3JSZWFsODAsCisgICAgICAgIFJvdFZlY3RvckltYWc4MCk7IC8qICAqLworfQorI2VuZGlmCisKKyNpZm5kZWYgRlVOQ1RJT05fZmZ0OTYKK3N0YXRpYyBpbmxpbmUgdm9pZCBmZnQ5NihGSVhQX0RCTCAqcElucHV0KSB7CisgIGZmdE4yKEZJWFBfREJMLCBwSW5wdXQsIDk2LCAzLCAzMiwgZmZ0MywgZmZ0XzMyLCBSb3RWZWN0b3JSZWFsOTYsCisgICAgICAgIFJvdFZlY3RvckltYWc5Nik7IC8qIDE1LDQ3ICovCit9CisjZW5kaWYgLyogRlVOQ1RJT05fZmZ0OTYqLworCisjaWZuZGVmIEZVTkNUSU9OX2ZmdDEyMAorc3RhdGljIGlubGluZSB2b2lkIGZmdDEyMChGSVhQX0RCTCAqcElucHV0KSB7CisgIGZmdE4yKEZJWFBfREJMLCBwSW5wdXQsIDEyMCwgOCwgMTUsIGZmdF84LCBmZnQxNSwgUm90VmVjdG9yUmVhbDEyMCwKKyAgICAgICAgUm90VmVjdG9ySW1hZzEyMCk7Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fZmZ0MTIwICovCisKKyNpZm5kZWYgRlVOQ1RJT05fZmZ0MTkyCitzdGF0aWMgaW5saW5lIHZvaWQgZmZ0MTkyKEZJWFBfREJMICpwSW5wdXQpIHsKKyAgZmZ0TjIoRklYUF9EQkwsIHBJbnB1dCwgMTkyLCAxNiwgMTIsIGZmdF8xNiwgZmZ0MTIsIFJvdFZlY3RvclJlYWwxOTIsCisgICAgICAgIFJvdFZlY3RvckltYWcxOTIpOyAvKiAxNSw1MCAqLworfQorI2VuZGlmCisKKyNpZm5kZWYgRlVOQ1RJT05fZmZ0MjQwCitzdGF0aWMgaW5saW5lIHZvaWQgZmZ0MjQwKEZJWFBfREJMICpwSW5wdXQpIHsKKyAgZmZ0TjIoRklYUF9EQkwsIHBJbnB1dCwgMjQwLCAxNiwgMTUsIGZmdF8xNiwgZmZ0MTUsIFJvdFZlY3RvclJlYWwyNDAsCisgICAgICAgIFJvdFZlY3RvckltYWcyNDApOyAvKiAxNS40NCAqLworfQorI2VuZGlmCisKKyNpZm5kZWYgRlVOQ1RJT05fZmZ0Mzg0CitzdGF0aWMgaW5saW5lIHZvaWQgZmZ0Mzg0KEZJWFBfREJMICpwSW5wdXQpIHsKKyAgZmZ0TjIoRklYUF9EQkwsIHBJbnB1dCwgMzg0LCAxMiwgMzIsIGZmdDEyLCBmZnRfMzIsIFJvdFZlY3RvclJlYWwzODQsCisgICAgICAgIFJvdFZlY3RvckltYWczODQpOyAvKiAxNi4wMiAqLworfQorI2VuZGlmIC8qIEZVTkNUSU9OX2ZmdDM4NCAqLworCisjaWZuZGVmIEZVTkNUSU9OX2ZmdDQ4MAorc3RhdGljIGlubGluZSB2b2lkIGZmdDQ4MChGSVhQX0RCTCAqcElucHV0KSB7CisgIGZmdE4yKEZJWFBfREJMLCBwSW5wdXQsIDQ4MCwgMzIsIDE1LCBmZnRfMzIsIGZmdDE1LCBSb3RWZWN0b3JSZWFsNDgwLAorICAgICAgICBSb3RWZWN0b3JJbWFnNDgwKTsgLyogMTUuODQgKi8KK30KKyNlbmRpZiAvKiBGVU5DVElPTl9mZnQ0ODAgKi8KKwordm9pZCBmZnQoaW50IGxlbmd0aCwgRklYUF9EQkwgKnBJbnB1dCwgSU5UICpwU2NhbGVmYWN0b3IpIHsKKyAgLyogRW5zdXJlLCB0aGF0IHRoZSBpby1wdHIgaXMgYWx3YXlzIChhdCBsZWFzdCA4LWJ5dGUpIGFsaWduZWQgKi8KKyAgQ19BTExPQ19BTElHTkVEX0NIRUNLKHBJbnB1dCk7CisKKyAgaWYgKGxlbmd0aCA9PSAzMikgeworICAgIGZmdF8zMihwSW5wdXQpOworICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1IzMjsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGxlbmd0aCkgeworICAgICAgY2FzZSAxNjoKKyAgICAgICAgZmZ0XzE2KHBJbnB1dCk7CisgICAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1IxNjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDg6CisgICAgICAgIGZmdF84KHBJbnB1dCk7CisgICAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1I4OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgZmZ0MihwSW5wdXQpOworICAgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6CisgICAgICAgIGZmdDMocElucHV0KTsKKyAgICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0OgorICAgICAgICBmZnRfNChwSW5wdXQpOworICAgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SNDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDU6CisgICAgICAgIGZmdDUocElucHV0KTsKKyAgICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2OgorICAgICAgICBmZnQ2KHBJbnB1dCk7CisgICAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1I2OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTA6CisgICAgICAgIGZmdDEwKHBJbnB1dCk7CisgICAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1IxMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEyOgorICAgICAgICBmZnQxMihwSW5wdXQpOworICAgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SMTI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNToKKyAgICAgICAgZmZ0MTUocElucHV0KTsKKyAgICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjE1OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjA6CisgICAgICAgIGZmdDIwKHBJbnB1dCk7CisgICAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1IyMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI0OgorICAgICAgICBmZnQyNChwSW5wdXQpOworICAgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SMjQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0ODoKKyAgICAgICAgZmZ0NDgocElucHV0KTsKKyAgICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjQ4OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNjA6CisgICAgICAgIGZmdDYwKHBJbnB1dCk7CisgICAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1I2MDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDY0OgorICAgICAgICBkaXRfZmZ0KHBJbnB1dCwgNiwgU2luZVRhYmxlNTEyLCA1MTIpOworICAgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SNjQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA4MDoKKyAgICAgICAgZmZ0ODAocElucHV0KTsKKyAgICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjgwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgOTY6CisgICAgICAgIGZmdDk2KHBJbnB1dCk7CisgICAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1I5NjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEyMDoKKyAgICAgICAgZmZ0MTIwKHBJbnB1dCk7CisgICAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1IxMjA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMjg6CisgICAgICAgIGRpdF9mZnQocElucHV0LCA3LCBTaW5lVGFibGU1MTIsIDUxMik7CisgICAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1IxMjg7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOTI6CisgICAgICAgIGZmdDE5MihwSW5wdXQpOworICAgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SMTkyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjQwOgorICAgICAgICBmZnQyNDAocElucHV0KTsKKyAgICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjI0MDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI1NjoKKyAgICAgICAgZGl0X2ZmdChwSW5wdXQsIDgsIFNpbmVUYWJsZTUxMiwgNTEyKTsKKyAgICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjI1NjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM4NDoKKyAgICAgICAgZmZ0Mzg0KHBJbnB1dCk7CisgICAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1IzODQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0ODA6CisgICAgICAgIGZmdDQ4MChwSW5wdXQpOworICAgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SNDgwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNTEyOgorICAgICAgICBkaXRfZmZ0KHBJbnB1dCwgOSwgU2luZVRhYmxlNTEyLCA1MTIpOworICAgICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SNTEyOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEZES19BU1NFUlQoMCk7IC8qIEZGVCBsZW5ndGggbm90IHN1cHBvcnRlZCEgKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQogICB9CiB9CiAKLQotdm9pZCBpZmZ0KGludCBsZW5ndGgsIEZJWFBfREJMICpwSW5wdXQsIElOVCAqc2NhbGVmYWN0b3IpCi17Cit2b2lkIGlmZnQoaW50IGxlbmd0aCwgRklYUF9EQkwgKnBJbnB1dCwgSU5UICpzY2FsZWZhY3RvcikgewogICBzd2l0Y2ggKGxlbmd0aCkgewogICAgIGRlZmF1bHQ6CiAgICAgICBGREtfQVNTRVJUKDApOyAvKiBJRkZUIGxlbmd0aCBub3Qgc3VwcG9ydGVkISAqLwogICAgICAgYnJlYWs7CiAgIH0KIH0KLQotCmRpZmYgLS1naXQgYS9saWJGREsvc3JjL2ZmdF9yYWQyLmNwcCBiL2xpYkZESy9zcmMvZmZ0X3JhZDIuY3BwCmluZGV4IDljZGFkYjUuLjI3ZjNhYTAgMTAwNjQ0Ci0tLSBhL2xpYkZESy9zcmMvZmZ0X3JhZDIuY3BwCisrKyBiL2xpYkZESy9zcmMvZmZ0X3JhZDIuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIE0uIExvaHdhc3NlciwgTS4gR2F5ZXIKKwogICAgRGVzY3JpcHRpb246CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJmZnRfcmFkMi5oIgogCkBAIC05NCwxNiArMTA2LDE0IEBACiAKICNkZWZpbmUgX19GRlRfUkFEMl9DUFBfXwogCi0jaWYgZGVmaW5lZChfX2FybV9fKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCisjaWYgZGVmaW5lZChfX2FybV9fKQogI2luY2x1ZGUgImFybS9mZnRfcmFkMl9hcm0uY3BwIgogCi0jZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fbWlwc19fKSAmJiBkZWZpbmVkKF9fbWlwc19kc3ApCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19taXBzX18pICYmIGRlZmluZWQoX19taXBzX2RzcCkKICNpbmNsdWRlICJtaXBzL2ZmdF9yYWQyX21pcHMuY3BwIgogCiAjZW5kaWYKIAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBkaXRfZmZ0IChhbmFseXNpcykKQEAgLTExOCwzOTUgKzEyOCwxOTcgQEAKIAogI2lmbmRlZiBGVU5DVElPTl9kaXRfZmZ0CiAKLXZvaWQgZGl0X2ZmdChGSVhQX0RCTCAqeCwgY29uc3QgSU5UIGxkbiwgY29uc3QgRklYUF9TVFAgKnRyaWdkYXRhLCBjb25zdCBJTlQgdHJpZ0RhdGFTaXplKQotewotICAgIGNvbnN0IElOVCBuPTE8PGxkbjsKLSAgICBJTlQgdHJpZ3N0ZXAsaSxsZG07Cit2b2lkIGRpdF9mZnQoRklYUF9EQkwgKngsIGNvbnN0IElOVCBsZG4sIGNvbnN0IEZJWFBfU1RQICp0cmlnZGF0YSwKKyAgICAgICAgICAgICBjb25zdCBJTlQgdHJpZ0RhdGFTaXplKSB7CisgIGNvbnN0IElOVCBuID0gMSA8PCBsZG47CisgIElOVCB0cmlnc3RlcCwgaSwgbGRtOwogCi0gICAgc2NyYW1ibGUoeCxuKTsKLSAgICAvKgotICAgICAqIDErMiBzdGFnZSByYWRpeCA0Ci0gICAgICovCisgIENfQUxMT0NfQUxJR05FRF9DSEVDSyh4KTsKIAotICAgIGZvciAoaT0wO2k8bioyO2krPTgpCi0gICAgewotICAgICAgRklYUF9EQkwgYTAwLCBhMTAsIGEyMCwgYTMwOwotICAgICAgYTAwID0gKHhbaSArIDBdICsgeFtpICsgMl0pPj4xOyAgLyogUmUgQSArIFJlIEIgKi8KLSAgICAgIGExMCA9ICh4W2kgKyA0XSArIHhbaSArIDZdKT4+MTsgIC8qIFJlIEMgKyBSZSBEICovCi0gICAgICBhMjAgPSAoeFtpICsgMV0gKyB4W2kgKyAzXSk+PjE7ICAvKiBJbSBBICsgSW0gQiAqLwotICAgICAgYTMwID0gKHhbaSArIDVdICsgeFtpICsgN10pPj4xOyAgLyogSW0gQyArIEltIEQgKi8KKyAgc2NyYW1ibGUoeCwgbik7CisgIC8qCisgICAqIDErMiBzdGFnZSByYWRpeCA0CisgICAqLwogCi0gICAgICB4W2kgKyAwXSA9IGEwMCArIGExMDsgICAgICAgLyogUmUgQScgPSBSZSBBICsgUmUgQiArIFJlIEMgKyBSZSBEICovCi0gICAgICB4W2kgKyA0XSA9IGEwMCAtIGExMDsgICAgICAgLyogUmUgQycgPSBSZSBBICsgUmUgQiAtIFJlIEMgLSBSZSBEICovCi0gICAgICB4W2kgKyAxXSA9IGEyMCArIGEzMDsgICAgICAgLyogSW0gQScgPSBJbSBBICsgSW0gQiArIEltIEMgKyBJbSBEICovCi0gICAgICB4W2kgKyA1XSA9IGEyMCAtIGEzMDsgICAgICAgLyogSW0gQycgPSBJbSBBICsgSW0gQiAtIEltIEMgLSBJbSBEICovCisgIGZvciAoaSA9IDA7IGkgPCBuICogMjsgaSArPSA4KSB7CisgICAgRklYUF9EQkwgYTAwLCBhMTAsIGEyMCwgYTMwOworICAgIGEwMCA9ICh4W2kgKyAwXSArIHhbaSArIDJdKSA+PiAxOyAvKiBSZSBBICsgUmUgQiAqLworICAgIGExMCA9ICh4W2kgKyA0XSArIHhbaSArIDZdKSA+PiAxOyAvKiBSZSBDICsgUmUgRCAqLworICAgIGEyMCA9ICh4W2kgKyAxXSArIHhbaSArIDNdKSA+PiAxOyAvKiBJbSBBICsgSW0gQiAqLworICAgIGEzMCA9ICh4W2kgKyA1XSArIHhbaSArIDddKSA+PiAxOyAvKiBJbSBDICsgSW0gRCAqLwogCi0gICAgICBhMDAgPSBhMDAgLSB4W2kgKyAyXTsgICAgICAgLyogUmUgQSAtIFJlIEIgKi8KLSAgICAgIGExMCA9IGExMCAtIHhbaSArIDZdOyAgICAgICAvKiBSZSBDIC0gUmUgRCAqLwotICAgICAgYTIwID0gYTIwIC0geFtpICsgM107ICAgICAgIC8qIEltIEEgLSBJbSBCICovCi0gICAgICBhMzAgPSBhMzAgLSB4W2kgKyA3XTsgICAgICAgLyogSW0gQyAtIEltIEQgKi8KKyAgICB4W2kgKyAwXSA9IGEwMCArIGExMDsgLyogUmUgQScgPSBSZSBBICsgUmUgQiArIFJlIEMgKyBSZSBEICovCisgICAgeFtpICsgNF0gPSBhMDAgLSBhMTA7IC8qIFJlIEMnID0gUmUgQSArIFJlIEIgLSBSZSBDIC0gUmUgRCAqLworICAgIHhbaSArIDFdID0gYTIwICsgYTMwOyAvKiBJbSBBJyA9IEltIEEgKyBJbSBCICsgSW0gQyArIEltIEQgKi8KKyAgICB4W2kgKyA1XSA9IGEyMCAtIGEzMDsgLyogSW0gQycgPSBJbSBBICsgSW0gQiAtIEltIEMgLSBJbSBEICovCiAKLSAgICAgIHhbaSArIDJdID0gYTAwICsgYTMwOyAgICAgICAvKiBSZSBCJyA9IFJlIEEgLSBSZSBCICsgSW0gQyAtIEltIEQgKi8KLSAgICAgIHhbaSArIDZdID0gYTAwIC0gYTMwOyAgICAgICAvKiBSZSBEJyA9IFJlIEEgLSBSZSBCIC0gSW0gQyArIEltIEQgKi8KLSAgICAgIHhbaSArIDNdID0gYTIwIC0gYTEwOyAgICAgICAvKiBJbSBCJyA9IEltIEEgLSBJbSBCIC0gUmUgQyArIFJlIEQgKi8KLSAgICAgIHhbaSArIDddID0gYTIwICsgYTEwOyAgICAgICAvKiBJbSBEJyA9IEltIEEgLSBJbSBCICsgUmUgQyAtIFJlIEQgKi8KKyAgICBhMDAgPSBhMDAgLSB4W2kgKyAyXTsgLyogUmUgQSAtIFJlIEIgKi8KKyAgICBhMTAgPSBhMTAgLSB4W2kgKyA2XTsgLyogUmUgQyAtIFJlIEQgKi8KKyAgICBhMjAgPSBhMjAgLSB4W2kgKyAzXTsgLyogSW0gQSAtIEltIEIgKi8KKyAgICBhMzAgPSBhMzAgLSB4W2kgKyA3XTsgLyogSW0gQyAtIEltIEQgKi8KKworICAgIHhbaSArIDJdID0gYTAwICsgYTMwOyAvKiBSZSBCJyA9IFJlIEEgLSBSZSBCICsgSW0gQyAtIEltIEQgKi8KKyAgICB4W2kgKyA2XSA9IGEwMCAtIGEzMDsgLyogUmUgRCcgPSBSZSBBIC0gUmUgQiAtIEltIEMgKyBJbSBEICovCisgICAgeFtpICsgM10gPSBhMjAgLSBhMTA7IC8qIEltIEInID0gSW0gQSAtIEltIEIgLSBSZSBDICsgUmUgRCAqLworICAgIHhbaSArIDddID0gYTIwICsgYTEwOyAvKiBJbSBEJyA9IEltIEEgLSBJbSBCICsgUmUgQyAtIFJlIEQgKi8KKyAgfQorCisgIGZvciAobGRtID0gMzsgbGRtIDw9IGxkbjsgKytsZG0pIHsKKyAgICBJTlQgbSA9ICgxIDw8IGxkbSk7CisgICAgSU5UIG1oID0gKG0gPj4gMSk7CisgICAgSU5UIGosIHI7CisKKyAgICB0cmlnc3RlcCA9ICgodHJpZ0RhdGFTaXplIDw8IDIpID4+IGxkbSk7CisKKyAgICBGREtfQVNTRVJUKHRyaWdzdGVwID4gMCk7CisKKyAgICAvKiBEbyBmaXJzdCBpdGVyYXRpb24gd2l0aCBjPTEuMCBhbmQgcz0wLjAgc2VwYXJhdGVseSB0byBhdm9pZCBsb29zaW5nIHRvCisgICAgICAgbXVjaCBwcmVjaXNpb24uIEJld2FyZTogVGhlIGltcGFjdCBvbiB0aGUgb3ZlcmFsIEZGVCBwcmVjaXNpb24gaXMgcmF0aGVyCisgICAgICAgbGFyZ2UuICovCisgICAgeyAvKiBibG9jayAxICovCisKKyAgICAgIGogPSAwOworCisgICAgICBmb3IgKHIgPSAwOyByIDwgbjsgciArPSBtKSB7CisgICAgICAgIElOVCB0MSA9IChyICsgaikgPDwgMTsKKyAgICAgICAgSU5UIHQyID0gdDEgKyAobWggPDwgMSk7CisgICAgICAgIEZJWFBfREJMIHZyLCB2aSwgdXIsIHVpOworCisgICAgICAgIC8vIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFt0MisxXSwgeFt0Ml0sIChGSVhQX1NHTCkxLjAsIChGSVhQX1NHTCkwLjApOworICAgICAgICB2aSA9IHhbdDIgKyAxXSA+PiAxOworICAgICAgICB2ciA9IHhbdDJdID4+IDE7CisKKyAgICAgICAgdXIgPSB4W3QxXSA+PiAxOworICAgICAgICB1aSA9IHhbdDEgKyAxXSA+PiAxOworCisgICAgICAgIHhbdDFdID0gdXIgKyB2cjsKKyAgICAgICAgeFt0MSArIDFdID0gdWkgKyB2aTsKKworICAgICAgICB4W3QyXSA9IHVyIC0gdnI7CisgICAgICAgIHhbdDIgKyAxXSA9IHVpIC0gdmk7CisKKyAgICAgICAgdDEgKz0gbWg7CisgICAgICAgIHQyID0gdDEgKyAobWggPDwgMSk7CisKKyAgICAgICAgLy8gY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4W3QyKzFdLCB4W3QyXSwgKEZJWFBfU0dMKTEuMCwgKEZJWFBfU0dMKTAuMCk7CisgICAgICAgIHZyID0geFt0MiArIDFdID4+IDE7CisgICAgICAgIHZpID0geFt0Ml0gPj4gMTsKKworICAgICAgICB1ciA9IHhbdDFdID4+IDE7CisgICAgICAgIHVpID0geFt0MSArIDFdID4+IDE7CisKKyAgICAgICAgeFt0MV0gPSB1ciArIHZyOworICAgICAgICB4W3QxICsgMV0gPSB1aSAtIHZpOworCisgICAgICAgIHhbdDJdID0gdXIgLSB2cjsKKyAgICAgICAgeFt0MiArIDFdID0gdWkgKyB2aTsKKyAgICAgIH0KKworICAgIH0gLyogZW5kIG9mICBibG9jayAxICovCisKKyAgICBmb3IgKGogPSAxOyBqIDwgbWggLyA0OyArK2opIHsKKyAgICAgIEZJWFBfU1RQIGNzOworCisgICAgICBjcyA9IHRyaWdkYXRhW2ogKiB0cmlnc3RlcF07CisKKyAgICAgIGZvciAociA9IDA7IHIgPCBuOyByICs9IG0pIHsKKyAgICAgICAgSU5UIHQxID0gKHIgKyBqKSA8PCAxOworICAgICAgICBJTlQgdDIgPSB0MSArIChtaCA8PCAxKTsKKyAgICAgICAgRklYUF9EQkwgdnIsIHZpLCB1ciwgdWk7CisKKyAgICAgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4W3QyICsgMV0sIHhbdDJdLCBjcyk7CisKKyAgICAgICAgdXIgPSB4W3QxXSA+PiAxOworICAgICAgICB1aSA9IHhbdDEgKyAxXSA+PiAxOworCisgICAgICAgIHhbdDFdID0gdXIgKyB2cjsKKyAgICAgICAgeFt0MSArIDFdID0gdWkgKyB2aTsKKworICAgICAgICB4W3QyXSA9IHVyIC0gdnI7CisgICAgICAgIHhbdDIgKyAxXSA9IHVpIC0gdmk7CisKKyAgICAgICAgdDEgKz0gbWg7CisgICAgICAgIHQyID0gdDEgKyAobWggPDwgMSk7CisKKyAgICAgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4W3QyICsgMV0sIHhbdDJdLCBjcyk7CisKKyAgICAgICAgdXIgPSB4W3QxXSA+PiAxOworICAgICAgICB1aSA9IHhbdDEgKyAxXSA+PiAxOworCisgICAgICAgIHhbdDFdID0gdXIgKyB2cjsKKyAgICAgICAgeFt0MSArIDFdID0gdWkgLSB2aTsKKworICAgICAgICB4W3QyXSA9IHVyIC0gdnI7CisgICAgICAgIHhbdDIgKyAxXSA9IHVpICsgdmk7CisKKyAgICAgICAgLyogU2FtZSBhcyBhYm92ZSBidXQgZm9yIHQxLHQyIHdpdGggaj5taC80IGFuZCB0aHVzIGNzIHN3YXBwZWQgKi8KKyAgICAgICAgdDEgPSAociArIG1oIC8gMiAtIGopIDw8IDE7CisgICAgICAgIHQyID0gdDEgKyAobWggPDwgMSk7CisKKyAgICAgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4W3QyXSwgeFt0MiArIDFdLCBjcyk7CisKKyAgICAgICAgdXIgPSB4W3QxXSA+PiAxOworICAgICAgICB1aSA9IHhbdDEgKyAxXSA+PiAxOworCisgICAgICAgIHhbdDFdID0gdXIgKyB2cjsKKyAgICAgICAgeFt0MSArIDFdID0gdWkgLSB2aTsKKworICAgICAgICB4W3QyXSA9IHVyIC0gdnI7CisgICAgICAgIHhbdDIgKyAxXSA9IHVpICsgdmk7CisKKyAgICAgICAgdDEgKz0gbWg7CisgICAgICAgIHQyID0gdDEgKyAobWggPDwgMSk7CisKKyAgICAgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4W3QyXSwgeFt0MiArIDFdLCBjcyk7CisKKyAgICAgICAgdXIgPSB4W3QxXSA+PiAxOworICAgICAgICB1aSA9IHhbdDEgKyAxXSA+PiAxOworCisgICAgICAgIHhbdDFdID0gdXIgLSB2cjsKKyAgICAgICAgeFt0MSArIDFdID0gdWkgLSB2aTsKKworICAgICAgICB4W3QyXSA9IHVyICsgdnI7CisgICAgICAgIHhbdDIgKyAxXSA9IHVpICsgdmk7CisgICAgICB9CiAgICAgfQogCi0gICAgZm9yKGxkbT0zOyBsZG08PWxkbjsgKytsZG0pCi0gICAgewotICAgICAgICBJTlQgbT0oMTw8bGRtKTsKLSAgICAgICAgSU5UIG1oPShtPj4xKTsKLSAgICAgICAgSU5UIGoscjsKKyAgICB7IC8qIGJsb2NrIDIgKi8KKyAgICAgIGogPSBtaCAvIDQ7CiAKLSAgICAgICAgdHJpZ3N0ZXA9KCh0cmlnRGF0YVNpemUgPDwgMik+PmxkbSk7CisgICAgICBmb3IgKHIgPSAwOyByIDwgbjsgciArPSBtKSB7CisgICAgICAgIElOVCB0MSA9IChyICsgaikgPDwgMTsKKyAgICAgICAgSU5UIHQyID0gdDEgKyAobWggPDwgMSk7CisgICAgICAgIEZJWFBfREJMIHZyLCB2aSwgdXIsIHVpOwogCi0gICAgICAgIEZES19BU1NFUlQodHJpZ3N0ZXAgPiAwKTsKKyAgICAgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4W3QyICsgMV0sIHhbdDJdLCBTVEMoMHg1YTgyNzk5YSksCisgICAgICAgICAgICAgICAgICAgICBTVEMoMHg1YTgyNzk5YSkpOwogCi0gICAgICAgIC8qIERvIGZpcnN0IGl0ZXJhdGlvbiB3aXRoIGM9MS4wIGFuZCBzPTAuMCBzZXBhcmF0ZWx5IHRvIGF2b2lkIGxvb3NpbmcgdG8gbXVjaCBwcmVjaXNpb24uCi0gICAgICAgICAgIEJld2FyZTogVGhlIGltcGFjdCBvbiB0aGUgb3ZlcmFsIEZGVCBwcmVjaXNpb24gaXMgcmF0aGVyIGxhcmdlLiAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBqID0gMDsKKyAgICAgICAgdXIgPSB4W3QxXSA+PiAxOworICAgICAgICB1aSA9IHhbdDEgKyAxXSA+PiAxOwogCi0gICAgICAgICAgICBmb3Iocj0wOyByPG47IHIrPW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSU5UIHQxID0gKHIraik8PDE7Ci0gICAgICAgICAgICAgICAgSU5UIHQyID0gdDEgKyAobWg8PDEpOwotICAgICAgICAgICAgICAgIEZJWFBfREJMIHZyLHZpLHVyLHVpOworICAgICAgICB4W3QxXSA9IHVyICsgdnI7CisgICAgICAgIHhbdDEgKyAxXSA9IHVpICsgdmk7CiAKLSAgICAgICAgICAgICAgICAvL2NwbHhNdWx0RGl2MigmdmksICZ2ciwgeFt0MisxXSwgeFt0Ml0sIChGSVhQX1NHTCkxLjAsIChGSVhQX1NHTCkwLjApOwotICAgICAgICAgICAgICAgIHZpID0geFt0MisxXT4+MTsKLSAgICAgICAgICAgICAgICB2ciA9IHhbdDJdPj4xOworICAgICAgICB4W3QyXSA9IHVyIC0gdnI7CisgICAgICAgIHhbdDIgKyAxXSA9IHVpIC0gdmk7CiAKLSAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOwotICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKKyAgICAgICAgdDEgKz0gbWg7CisgICAgICAgIHQyID0gdDEgKyAobWggPDwgMSk7CiAKLSAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXIrdnI7Ci0gICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpK3ZpOworICAgICAgICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbdDIgKyAxXSwgeFt0Ml0sIFNUQygweDVhODI3OTlhKSwKKyAgICAgICAgICAgICAgICAgICAgIFNUQygweDVhODI3OTlhKSk7CiAKLSAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpLXZpOworICAgICAgICB1ciA9IHhbdDFdID4+IDE7CisgICAgICAgIHVpID0geFt0MSArIDFdID4+IDE7CiAKLSAgICAgICAgICAgICAgICB0MSArPSBtaDsKLSAgICAgICAgICAgICAgICB0MiA9IHQxKyhtaDw8MSk7CisgICAgICAgIHhbdDFdID0gdXIgKyB2cjsKKyAgICAgICAgeFt0MSArIDFdID0gdWkgLSB2aTsKIAotICAgICAgICAgICAgICAgIC8vY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4W3QyKzFdLCB4W3QyXSwgKEZJWFBfU0dMKTEuMCwgKEZJWFBfU0dMKTAuMCk7Ci0gICAgICAgICAgICAgICAgdnIgPSB4W3QyKzFdPj4xOwotICAgICAgICAgICAgICAgIHZpID0geFt0Ml0+PjE7Ci0KLSAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOwotICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKLQotICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1cit2cjsKLSAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWktdmk7Ci0KLSAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpK3ZpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvcihqPTE7IGo8bWgvNDsgKytqKQotICAgICAgICB7Ci0gICAgICAgICAgICBGSVhQX1NUUCBjczsKLQotICAgICAgICAgICAgY3MgPSB0cmlnZGF0YVtqKnRyaWdzdGVwXTsKLQotICAgICAgICAgICAgZm9yKHI9MDsgcjxuOyByKz1tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElOVCB0MSA9IChyK2opPDwxOwotICAgICAgICAgICAgICAgIElOVCB0MiA9IHQxICsgKG1oPDwxKTsKLSAgICAgICAgICAgICAgICBGSVhQX0RCTCB2cix2aSx1cix1aTsKLQotICAgICAgICAgICAgICAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFt0MisxXSwgeFt0Ml0sIGNzKTsKLQotICAgICAgICAgICAgICAgIHVyID0geFt0MV0+PjE7Ci0gICAgICAgICAgICAgICAgdWkgPSB4W3QxKzFdPj4xOwotCi0gICAgICAgICAgICAgICAgeFt0MV0gICA9IHVyK3ZyOwotICAgICAgICAgICAgICAgIHhbdDErMV0gPSB1aSt2aTsKLQotICAgICAgICAgICAgICAgIHhbdDJdICAgPSB1ci12cjsKLSAgICAgICAgICAgICAgICB4W3QyKzFdID0gdWktdmk7Ci0KLSAgICAgICAgICAgICAgICB0MSArPSBtaDsKLSAgICAgICAgICAgICAgICB0MiA9IHQxKyhtaDw8MSk7Ci0KLSAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbdDIrMV0sIHhbdDJdLCBjcyk7Ci0KLSAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOwotICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKLQotICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1cit2cjsKLSAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWktdmk7Ci0KLSAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpK3ZpOwotCi0gICAgICAgICAgICAgICAgLyogU2FtZSBhcyBhYm92ZSBidXQgZm9yIHQxLHQyIHdpdGggaj5taC80IGFuZCB0aHVzIGNzIHN3YXBwZWQgKi8KLSAgICAgICAgICAgICAgICB0MSA9IChyK21oLzItaik8PDE7Ci0gICAgICAgICAgICAgICAgdDIgPSB0MSArIChtaDw8MSk7Ci0KLSAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbdDJdLCB4W3QyKzFdLCBjcyk7Ci0KLSAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOwotICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKLQotICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1cit2cjsKLSAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWktdmk7Ci0KLSAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpK3ZpOwotCi0gICAgICAgICAgICAgICAgdDEgKz0gbWg7Ci0gICAgICAgICAgICAgICAgdDIgPSB0MSsobWg8PDEpOwotCi0gICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4W3QyXSwgeFt0MisxXSwgY3MpOwotCi0gICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKLSAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7Ci0KLSAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpLXZpOwotCi0gICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyK3ZyOwotICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aSt2aTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB7Ci0gICAgICAgICAgICBqID0gbWgvNDsKLQotICAgICAgICAgICAgZm9yKHI9MDsgcjxuOyByKz1tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElOVCB0MSA9IChyK2opPDwxOwotICAgICAgICAgICAgICAgIElOVCB0MiA9IHQxICsgKG1oPDwxKTsKLSAgICAgICAgICAgICAgICBGSVhQX0RCTCB2cix2aSx1cix1aTsKLQotICAgICAgICAgICAgICAgIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFt0MisxXSwgeFt0Ml0sIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NWE4Mjc5OWEpKTsKLQotICAgICAgICAgICAgICAgIHVyID0geFt0MV0+PjE7Ci0gICAgICAgICAgICAgICAgdWkgPSB4W3QxKzFdPj4xOwotCi0gICAgICAgICAgICAgICAgeFt0MV0gICA9IHVyK3ZyOwotICAgICAgICAgICAgICAgIHhbdDErMV0gPSB1aSt2aTsKLQotICAgICAgICAgICAgICAgIHhbdDJdICAgPSB1ci12cjsKLSAgICAgICAgICAgICAgICB4W3QyKzFdID0gdWktdmk7Ci0KLSAgICAgICAgICAgICAgICB0MSArPSBtaDsKLSAgICAgICAgICAgICAgICB0MiA9IHQxKyhtaDw8MSk7Ci0KLSAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbdDIrMV0sIHhbdDJdLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDVhODI3OTlhKSk7Ci0KLSAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOwotICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKLQotICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1cit2cjsKLSAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWktdmk7Ci0KLSAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpK3ZpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorICAgICAgICB4W3QyXSA9IHVyIC0gdnI7CisgICAgICAgIHhbdDIgKyAxXSA9IHVpICsgdmk7CisgICAgICB9CisgICAgfSAvKiBlbmQgb2YgYmxvY2sgMiAqLworICB9CiB9CisKICNlbmRpZgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgZnVuY3Rpb25uYW1lOiBkaXRfaWZmdCAoc3ludGhlc2lzKQotICAgIGRlc2NyaXB0aW9uOiAgZGl0LXR1a2V5LWFsZ29yaXRobQotICAgICAgICAgICAgICAgICAgc2NyYW1ibGVzIGRhdGEgYXQgZW50cnkKLSAgICAgICAgICAgICAgICAgIGkuZS4gbG9vcCBpcyBtYWRlIHdpdGggc2NyYW1ibGVkIGRhdGEKLSAgICByZXR1cm5zOgotICAgIGlucHV0OgotICAgIG91dHB1dDoKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiAhZGVmaW5lZChGVU5DVElPTl9kaXRfaWZmdCkKLXZvaWQgZGl0X2lmZnQoRklYUF9EQkwgKngsIGNvbnN0IElOVCBsZG4sIGNvbnN0IEZJWFBfU1RQICp0cmlnZGF0YSwgY29uc3QgSU5UIHRyaWdEYXRhU2l6ZSkKLXsKLSAgICBjb25zdCBJTlQgbj0xPDxsZG47Ci0gICAgSU5UIHRyaWdzdGVwLGksbGRtOwotCi0gICAgc2NyYW1ibGUoeCxuKTsKLQotICAgIC8qCi0gICAgICAxKzIgc3RhZ2UgcmFkaXggNAotICAgICovCi0KLSAgICBmb3IgKGk9MDtpPG4qMjtpKz04KQotICAgIHsKLSAgICAgIEZJWFBfREJMIGEwLCBhMSwgYTIsIGEzLCBhMDAsIGExMCwgYTIwLCBhMzA7Ci0KLSAgICAgIGEwMCA9ICh4W2kgKyAwXSArIHhbaSArIDJdKT4+MTsgICAvKiBSZSBBICsgUmUgQiAqLwotICAgICAgYTEwID0gKHhbaSArIDRdICsgeFtpICsgNl0pPj4xOyAgIC8qIFJlIEMgKyBSZSBEICovCi0gICAgICBhMjAgPSAoeFtpICsgMV0gKyB4W2kgKyAzXSk+PjE7ICAgLyogSW0gQSArIEltIEIgKi8KLSAgICAgIGEzMCA9ICh4W2kgKyA1XSArIHhbaSArIDddKT4+MTsgICAvKiBJbSBDICsgSW0gRCAqLwotICAgICAgYTAgID0gKHhbaSArIDBdIC0geFtpICsgMl0pPj4xOyAgIC8qIFJlIEEgLSBSZSBCICovCi0gICAgICBhMiAgPSAoeFtpICsgNF0gLSB4W2kgKyA2XSk+PjE7ICAgLyogUmUgQyAtIFJlIEQgKi8KLSAgICAgIGEzICA9ICh4W2kgKyAxXSAtIHhbaSArIDNdKT4+MTsgICAvKiBJbSBBIC0gSW0gQiAqLwotICAgICAgYTEgID0gKHhbaSArIDVdIC0geFtpICsgN10pPj4xOyAgIC8qIEltIEMgLSBJbSBEICovCi0KLSAgICAgIHhbaSArIDBdID0gYTAwICsgYTEwOyAgICAvKiBSZSBBJyA9IFJlIEEgKyBSZSBCICsgUmUgQyArIFJlIEQgKi8KLSAgICAgIHhbaSArIDRdID0gYTAwIC0gYTEwOyAgICAvKiBSZSBDJyA9IFJlIEEgKyBSZSBCIC0gUmUgQyAtIFJlIEQgKi8KLSAgICAgIHhbaSArIDFdID0gYTIwICsgYTMwOyAgICAvKiBJbSBBJyA9IEltIEEgKyBJbSBCICsgSW0gQyArIEltIEQgKi8KLSAgICAgIHhbaSArIDVdID0gYTIwIC0gYTMwOyAgICAvKiBJbSBDJyA9IEltIEEgKyBJbSBCIC0gSW0gQyAtIEltIEQgKi8KLSAgICAgIHhbaSArIDJdID0gYTAgLSBhMTsgICAgICAvKiBSZSBCJyA9IFJlIEEgLSBSZSBCIC0gSW0gQyArIEltIEQgKi8KLSAgICAgIHhbaSArIDZdID0gYTAgKyBhMTsgICAgICAvKiBSZSBEJyA9IFJlIEEgLSBSZSBCICsgSW0gQyAtIEltIEQgKi8KLSAgICAgIHhbaSArIDNdID0gYTMgKyBhMjsgICAgICAvKiBJbSBCJyA9IEltIEEgLSBJbSBCICsgUmUgQyAtIFJlIEQgKi8KLSAgICAgIHhbaSArIDddID0gYTMgLSBhMjsgICAgICAvKiBJbSBEJyA9IEltIEEgLSBJbSBCIC0gUmUgQyArIFJlIEQgKi8KLSAgICB9Ci0KLSAgICBmb3IobGRtPTM7IGxkbTw9bGRuOyArK2xkbSkKLSAgICB7Ci0gICAgICAgIGNvbnN0IElOVCBtPSgxPDxsZG0pOwotICAgICAgICBjb25zdCBJTlQgbWg9KG0+PjEpOwotCi0gICAgICAgIElOVCBqLHI7Ci0KLSAgICAgICAgdHJpZ3N0ZXA9KCh0cmlnRGF0YVNpemUgPDwgMik+PmxkbSk7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgaiA9IDA7Ci0KLSAgICAgICAgICAgIGZvcihyPTA7IHI8bjsgcis9bSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJTlQgdDEgPSAocitqKTw8MTsKLSAgICAgICAgICAgICAgICBJTlQgdDIgPSB0MSArIChtaDw8MSk7Ci0gICAgICAgICAgICAgICAgRklYUF9EQkwgdnIsdmksdXIsdWk7Ci0KLSAgICAgICAgICAgICAgICAvL2NwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFt0Ml0sIHhbdDIrMV0sIEZMMkZYQ09OU1RfU0dMKDEuMCksIChGSVhQX1NHTCkwLjApOwotICAgICAgICAgICAgICAgIHZpID0geFt0MisxXT4+MTsKLSAgICAgICAgICAgICAgICB2ciA9IHhbdDJdPj4xOwotCi0gICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKLSAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7Ci0KLSAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXIrdnI7Ci0gICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpK3ZpOwotCi0gICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyLXZyOwotICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aS12aTsKLQotICAgICAgICAgICAgICAgIHQxICs9IG1oOwotICAgICAgICAgICAgICAgIHQyID0gdDErKG1oPDwxKTsKLQotICAgICAgICAgICAgICAgIC8vY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4W3QyXSwgeFt0MisxXSwgRkwyRlhDT05TVF9TR0woMS4wKSwgRkwyRlhDT05TVF9TR0woMC4wKSk7Ci0gICAgICAgICAgICAgICAgdnIgPSB4W3QyKzFdPj4xOwotICAgICAgICAgICAgICAgIHZpID0geFt0Ml0+PjE7Ci0KLSAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOwotICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKLQotICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1ci12cjsKLSAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWkrdmk7Ci0KLSAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXIrdnI7Ci0gICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpLXZpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvcihqPTE7IGo8bWgvNDsgKytqKQotICAgICAgICB7Ci0gICAgICAgICAgICBGSVhQX1NUUCBjczsKLQotICAgICAgICAgICAgY3MgPSB0cmlnZGF0YVtqKnRyaWdzdGVwXTsKLQotICAgICAgICAgICAgZm9yKHI9MDsgcjxuOyByKz1tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElOVCB0MSA9IChyK2opPDwxOwotICAgICAgICAgICAgICAgIElOVCB0MiA9IHQxICsgKG1oPDwxKTsKLSAgICAgICAgICAgICAgICBGSVhQX0RCTCB2cix2aSx1cix1aTsKLQotICAgICAgICAgICAgICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFt0Ml0sIHhbdDIrMV0sIGNzKTsKLQotICAgICAgICAgICAgICAgIHVyID0geFt0MV0+PjE7Ci0gICAgICAgICAgICAgICAgdWkgPSB4W3QxKzFdPj4xOwotCi0gICAgICAgICAgICAgICAgeFt0MV0gICA9IHVyK3ZyOwotICAgICAgICAgICAgICAgIHhbdDErMV0gPSB1aSt2aTsKLQotICAgICAgICAgICAgICAgIHhbdDJdICAgPSB1ci12cjsKLSAgICAgICAgICAgICAgICB4W3QyKzFdID0gdWktdmk7Ci0KLSAgICAgICAgICAgICAgICB0MSArPSBtaDsKLSAgICAgICAgICAgICAgICB0MiA9IHQxKyhtaDw8MSk7Ci0KLSAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbdDJdLCB4W3QyKzFdLCBjcyk7Ci0KLSAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOwotICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKLQotICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1ci12cjsKLSAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWkrdmk7Ci0KLSAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXIrdnI7Ci0gICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpLXZpOwotCi0gICAgICAgICAgICAgICAgLyogU2FtZSBhcyBhYm92ZSBidXQgZm9yIHQxLHQyIHdpdGggaj5taC80IGFuZCB0aHVzIGNzIHN3YXBwZWQgKi8KLSAgICAgICAgICAgICAgICB0MSA9IChyK21oLzItaik8PDE7Ci0gICAgICAgICAgICAgICAgdDIgPSB0MSArIChtaDw8MSk7Ci0KLSAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbdDIrMV0sIHhbdDJdLCBjcyk7Ci0KLSAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOwotICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKLQotICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1ci12cjsKLSAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWkrdmk7Ci0KLSAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXIrdnI7Ci0gICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpLXZpOwotCi0gICAgICAgICAgICAgICAgdDEgKz0gbWg7Ci0gICAgICAgICAgICAgICAgdDIgPSB0MSsobWg8PDEpOwotCi0gICAgICAgICAgICAgICAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4W3QyKzFdLCB4W3QyXSwgY3MpOwotCi0gICAgICAgICAgICAgICAgdXIgPSB4W3QxXT4+MTsKLSAgICAgICAgICAgICAgICB1aSA9IHhbdDErMV0+PjE7Ci0KLSAgICAgICAgICAgICAgICB4W3QxXSAgID0gdXItdnI7Ci0gICAgICAgICAgICAgICAgeFt0MSsxXSA9IHVpLXZpOwotCi0gICAgICAgICAgICAgICAgeFt0Ml0gICA9IHVyK3ZyOwotICAgICAgICAgICAgICAgIHhbdDIrMV0gPSB1aSt2aTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB7Ci0gICAgICAgICAgICBqID0gbWgvNDsKLSAgICAgICAgICAgIGZvcihyPTA7IHI8bjsgcis9bSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJTlQgdDEgPSAocittaC8yLWopPDwxOwotICAgICAgICAgICAgICAgIElOVCB0MiA9IHQxICsgKG1oPDwxKTsKLSAgICAgICAgICAgICAgICBGSVhQX0RCTCB2cix2aSx1cix1aTsKLQotICAgICAgICAgICAgICAgIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFt0Ml0sIHhbdDIrMV0sIFNUQygweDVhODI3OTlhKSwgU1RDKDB4NWE4Mjc5OWEpKTsKLQotICAgICAgICAgICAgICAgIHVyID0geFt0MV0+PjE7Ci0gICAgICAgICAgICAgICAgdWkgPSB4W3QxKzFdPj4xOwotCi0gICAgICAgICAgICAgICAgeFt0MV0gICA9IHVyK3ZyOwotICAgICAgICAgICAgICAgIHhbdDErMV0gPSB1aSt2aTsKLQotICAgICAgICAgICAgICAgIHhbdDJdICAgPSB1ci12cjsKLSAgICAgICAgICAgICAgICB4W3QyKzFdID0gdWktdmk7Ci0KLSAgICAgICAgICAgICAgICB0MSArPSBtaDsKLSAgICAgICAgICAgICAgICB0MiA9IHQxKyhtaDw8MSk7Ci0KLSAgICAgICAgICAgICAgICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbdDJdLCB4W3QyKzFdLCBTVEMoMHg1YTgyNzk5YSksIFNUQygweDVhODI3OTlhKSk7Ci0KLSAgICAgICAgICAgICAgICB1ciA9IHhbdDFdPj4xOwotICAgICAgICAgICAgICAgIHVpID0geFt0MSsxXT4+MTsKLQotICAgICAgICAgICAgICAgIHhbdDFdICAgPSB1ci12cjsKLSAgICAgICAgICAgICAgICB4W3QxKzFdID0gdWkrdmk7Ci0KLSAgICAgICAgICAgICAgICB4W3QyXSAgID0gdXIrdnI7Ci0gICAgICAgICAgICAgICAgeFt0MisxXSA9IHVpLXZpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2xpYkZESy9zcmMvZml4cG9pbnRfbWF0aC5jcHAgYi9saWJGREsvc3JjL2ZpeHBvaW50X21hdGguY3BwCmluZGV4IDFiZjkzNjYuLjZjNjU2ZmEgMTAwNjQ0Ci0tLSBhL2xpYkZESy9zcmMvZml4cG9pbnRfbWF0aC5jcHAKKysrIGIvbGliRkRLL3NyYy9maXhwb2ludF9tYXRoLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw5MyArOTAsNDIgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBNLiBHYXllcgorCiAgICBEZXNjcmlwdGlvbjogRml4ZWQgcG9pbnQgc3BlY2lmaWMgbWF0aGVtYXRpY2FsIGZ1bmN0aW9ucwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiZml4cG9pbnRfbWF0aC5oIgogCisvKgorICogSGFyZHdhcmUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zCisgKi8KIAotI2RlZmluZSBNQVhfTERfUFJFQ0lTSU9OIDEwCi0jZGVmaW5lIExEX1BSRUNJU0lPTiAgICAgMTAKLQotLyogVGF5bG9yIHNlcmllcyBjb2VmZmNpZW50cyBmb3IgbG4oMS14KSwgY2VudGVyZWQgYXQgMCAoTWFjTGF1cmluIHBvbGlub21pYWwpLiAqLwotI2lmbmRlZiBMRENPRUZGXzE2QklUCi1MTktfU0VDVElPTl9DT05TVERBVEFfTDEKLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBsZENvZWZmW01BWF9MRF9QUkVDSVNJT05dID0gewotICAgIEZMMkZYQ09OU1RfREJMKC0xLjApLAotICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvMi4wKSwKLSAgICBGTDJGWENPTlNUX0RCTCgtMS4wLzMuMCksCi0gICAgRkwyRlhDT05TVF9EQkwoLTEuMC80LjApLAotICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvNS4wKSwKLSAgICBGTDJGWENPTlNUX0RCTCgtMS4wLzYuMCksCi0gICAgRkwyRlhDT05TVF9EQkwoLTEuMC83LjApLAotICAgIEZMMkZYQ09OU1RfREJMKC0xLjAvOC4wKSwKLSAgICBGTDJGWENPTlNUX0RCTCgtMS4wLzkuMCksCi0gICAgRkwyRlhDT05TVF9EQkwoLTEuMC8xMC4wKQotfTsKLSNlbHNlCi1MTktfU0VDVElPTl9DT05TVERBVEFfTDEKLXN0YXRpYyBjb25zdCBGSVhQX1NHTCBsZENvZWZmW01BWF9MRF9QUkVDSVNJT05dID0gewotICAgIEZMMkZYQ09OU1RfU0dMKC0xLjApLAotICAgIEZMMkZYQ09OU1RfU0dMKC0xLjAvMi4wKSwKLSAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzMuMCksCi0gICAgRkwyRlhDT05TVF9TR0woLTEuMC80LjApLAotICAgIEZMMkZYQ09OU1RfU0dMKC0xLjAvNS4wKSwKLSAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzYuMCksCi0gICAgRkwyRlhDT05TVF9TR0woLTEuMC83LjApLAotICAgIEZMMkZYQ09OU1RfU0dMKC0xLjAvOC4wKSwKLSAgICBGTDJGWENPTlNUX1NHTCgtMS4wLzkuMCksCi0gICAgRkwyRlhDT05TVF9TR0woLTEuMC8xMC4wKQotfTsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICBmdW5jdGlvbm5hbWU6IENhbGNMZERhdGEKLSAgZGVzY3JpcHRpb246ICBEZWxpdmVycyB0aGUgTG9nYXJpdGhtIER1YWxpcyBsZChvcCkvTERfREFUQV9TQ0FMSU5HIHdpdGggcG9seW5vbWlhbCBhcHByb3hpbWF0aW9uLgotICBpbnB1dDogICAgICAgIElucHV0IG9wIGlzIGFzc3VtZWQgdG8gYmUgZG91YmxlIHByZWNpc2lvbiBmcmFjdGlvbmFsIDAgPCBvcCA8IDEuMAotICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXB0IG5lZ2F0aXZlIHZhbHVlcy4KLSAgb3V0cHV0OiAgICAgICBGb3Igb3AgPT0gMCwgdGhlIHJlc3VsdCBpcyBzYXR1cmF0ZWQgdG8gLTEuMAotICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIHBvc2l0aXZlIHZhbHVlcyBzaW5jZSBpbnB1dCB2YWx1ZXMgYXJlIHRyZWF0ZWQgYXMgZnJhY3Rpb25hbCB2YWx1ZXMuCi0gICAgICAgICAgICAgICAgSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBpbnB1dCBhbiBpbnRlZ2VyIHZhbHVlIGludG8gdGhpcyBmdW5jdGlvbiAoYW5kIGV4cGVjdCBhIHBvc2l0aXZlIG91dHB1dCB2YWx1ZSkKLSAgICAgICAgICAgICAgICBzaW5jZSBpbnB1dCB2YWx1ZXMgYXJlIHRyZWF0ZWQgYXMgZnJhY3Rpb25hbCB2YWx1ZXMuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MTktfU0VDVElPTl9DT0RFX0wxCi1GSVhQX0RCTCBDYWxjTGREYXRhKEZJWFBfREJMIG9wKQotewotICByZXR1cm4gZkxvZzIob3AsIDApOwotfQotCisvKgorICogRmFsbGJhY2sgaW1wbGVtZW50YXRpb25zCisgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgIGZ1bmN0aW9ubmFtZTogTGREYXRhVmVjdG9yCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIExOS19TRUNUSU9OX0NPREVfTDEKLXZvaWQgTGREYXRhVmVjdG9yKCAgRklYUF9EQkwgICAgKnNyY1ZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKmRlc3RWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgIG4pCi17Ci0gICAgSU5UIGk7Ci0gICAgZm9yICggaT0wOyBpPG47IGkrKykgewotICAgICAgICBkZXN0VmVjdG9yW2ldID0gQ2FsY0xkRGF0YShzcmNWZWN0b3JbaV0pOwotICAgIH0KK3ZvaWQgTGREYXRhVmVjdG9yKEZJWFBfREJMICpzcmNWZWN0b3IsIEZJWFBfREJMICpkZXN0VmVjdG9yLCBJTlQgbikgeworICBJTlQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIGRlc3RWZWN0b3JbaV0gPSBmTG9nMihzcmNWZWN0b3JbaV0sIDApOworICB9CiB9CiAKLQotCiAjZGVmaW5lIE1BWF9QT1cyX1BSRUNJU0lPTiA4CiAjaWZuZGVmIFNJTkVUQUJMRV8xNkJJVAotCSNkZWZpbmUgUE9XMl9QUkVDSVNJT04gTUFYX1BPVzJfUFJFQ0lTSU9OCisjZGVmaW5lIFBPVzJfUFJFQ0lTSU9OIE1BWF9QT1cyX1BSRUNJU0lPTgogI2Vsc2UKLQkjZGVmaW5lIFBPVzJfUFJFQ0lTSU9OIDUKKyNkZWZpbmUgUE9XMl9QUkVDSVNJT04gNQogI2VuZGlmCiAKIC8qCkBAIC0xNzMsNjIgKzEzMywzNyBAQAogICBvbW1pdGVkIChlcXVhbCB0byAxLjApLgogCiAgIHBvdzJDb2VmZltpLTFdID0gKDEvaSEpIGReaSgyXngpL2R4XmksIGk9MS4uTUFYX1BPVzJfUFJFQ0lTSU9OCi0gIFRvIGV2YWx1YXRlIHRoZSB0YXlsb3Igc2VyaWVzIGFyb3VuZCB4ID0gMCwgdGhlIGNvZWZmaWNpZW50cyBhcmU6IDEvIWkgKiBsbigyKV5pCisgIFRvIGV2YWx1YXRlIHRoZSB0YXlsb3Igc2VyaWVzIGFyb3VuZCB4ID0gMCwgdGhlIGNvZWZmaWNpZW50cyBhcmU6IDEvIWkgKgorICBsbigyKV5pCiAgKi8KICNpZm5kZWYgUE9XMkNPRUZGXzE2QklUCitSQU1fQUxJR04KIExOS19TRUNUSU9OX0NPTlNUREFUQV9MMQogc3RhdGljIGNvbnN0IEZJWFBfREJMIHBvdzJDb2VmZltNQVhfUE9XMl9QUkVDSVNJT05dID0gewotICAgIEZMMkZYQ09OU1RfREJMKDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc3KSwgICAgLyogbG4oMileMSAvMSEgKi8KLSAgICBGTDJGWENPTlNUX0RCTCgwLjI0MDIyNjUwNjk1OTEwMDcxMjMzMzU1MTI2MzE2MzMzMiksICAgIC8qIGxuKDIpXjIgLzIhICovCi0gICAgRkwyRlhDT05TVF9EQkwoMC4wNTU1MDQxMDg2NjQ4MjE1Nzk5NTMxNDIyNjM3Njg2MjE4KSwgICAvKiBsbigyKV4zIC8zISAqLwotICAgIEZMMkZYQ09OU1RfREJMKDAuMDA5NjE4MTI5MTA3NjI4NDc3MTYxOTc5MDcxNTczNjU4ODcpLCAgLyogbG4oMileNCAvNCEgKi8KLSAgICBGTDJGWENPTlNUX0RCTCgwLjAwMTMzMzM1NTgxNDY0Mjg0NDM0MjM0MTIyMjE5ODc5OTYyKSwgIC8qIGxuKDIpXjUgLzUhICovCi0gICAgRkwyRlhDT05TVF9EQkwoMS41NDAzNTMwMzkzMzgxNjA5OTU0NDM3MDk3MzMyNzQyM2UtNCksICAvKiBsbigyKV42IC82ISAqLwotICAgIEZMMkZYQ09OU1RfREJMKDEuNTI1MjczMzgwNDA1OTg0MDI4MDAyNTQzOTAxMjAwOTZlLTUpLCAgLyogbG4oMileNyAvNyEgKi8KLSAgICBGTDJGWENPTlNUX0RCTCgxLjMyMTU0ODY3OTAxNDQzMDk0ODg0MDM3NTgyMjgyODg0ZS02KSAgIC8qIGxuKDIpXjggLzghICovCisgICAgRkwyRlhDT05TVF9EQkwoMC42OTMxNDcxODA1NTk5NDUzMDk0MTcyMzIxMjE0NTgxNzcpLCAgIC8qIGxuKDIpXjEgLzEhICovCisgICAgRkwyRlhDT05TVF9EQkwoMC4yNDAyMjY1MDY5NTkxMDA3MTIzMzM1NTEyNjMxNjMzMzIpLCAgIC8qIGxuKDIpXjIgLzIhICovCisgICAgRkwyRlhDT05TVF9EQkwoMC4wNTU1MDQxMDg2NjQ4MjE1Nzk5NTMxNDIyNjM3Njg2MjE4KSwgIC8qIGxuKDIpXjMgLzMhICovCisgICAgRkwyRlhDT05TVF9EQkwoMC4wMDk2MTgxMjkxMDc2Mjg0NzcxNjE5NzkwNzE1NzM2NTg4NyksIC8qIGxuKDIpXjQgLzQhICovCisgICAgRkwyRlhDT05TVF9EQkwoMC4wMDEzMzMzNTU4MTQ2NDI4NDQzNDIzNDEyMjIxOTg3OTk2MiksIC8qIGxuKDIpXjUgLzUhICovCisgICAgRkwyRlhDT05TVF9EQkwoMS41NDAzNTMwMzkzMzgxNjA5OTU0NDM3MDk3MzMyNzQyM2UtNCksIC8qIGxuKDIpXjYgLzYhICovCisgICAgRkwyRlhDT05TVF9EQkwoMS41MjUyNzMzODA0MDU5ODQwMjgwMDI1NDM5MDEyMDA5NmUtNSksIC8qIGxuKDIpXjcgLzchICovCisgICAgRkwyRlhDT05TVF9EQkwoMS4zMjE1NDg2NzkwMTQ0MzA5NDg4NDAzNzU4MjI4Mjg4NGUtNikgIC8qIGxuKDIpXjggLzghICovCiB9OwogI2Vsc2UKK1JBTV9BTElHTgogTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCiBzdGF0aWMgY29uc3QgRklYUF9TR0wgcG93MkNvZWZmW01BWF9QT1cyX1BSRUNJU0lPTl0gPSB7Ci0gICAgRkwyRlhDT05TVF9TR0woMC42OTMxNDcxODA1NTk5NDUzMDk0MTcyMzIxMjE0NTgxNzcpLCAgICAvKiBsbigyKV4xIC8xISAqLwotICAgIEZMMkZYQ09OU1RfU0dMKDAuMjQwMjI2NTA2OTU5MTAwNzEyMzMzNTUxMjYzMTYzMzMyKSwgICAgLyogbG4oMileMiAvMiEgKi8KLSAgICBGTDJGWENPTlNUX1NHTCgwLjA1NTUwNDEwODY2NDgyMTU3OTk1MzE0MjI2Mzc2ODYyMTgpLCAgIC8qIGxuKDIpXjMgLzMhICovCi0gICAgRkwyRlhDT05TVF9TR0woMC4wMDk2MTgxMjkxMDc2Mjg0NzcxNjE5NzkwNzE1NzM2NTg4NyksICAvKiBsbigyKV40IC80ISAqLwotICAgIEZMMkZYQ09OU1RfU0dMKDAuMDAxMzMzMzU1ODE0NjQyODQ0MzQyMzQxMjIyMTk4Nzk5NjIpLCAgLyogbG4oMileNSAvNSEgKi8KLSAgICBGTDJGWENPTlNUX1NHTCgxLjU0MDM1MzAzOTMzODE2MDk5NTQ0MzcwOTczMzI3NDIzZS00KSwgIC8qIGxuKDIpXjYgLzYhICovCi0gICAgRkwyRlhDT05TVF9TR0woMS41MjUyNzMzODA0MDU5ODQwMjgwMDI1NDM5MDEyMDA5NmUtNSksICAvKiBsbigyKV43IC83ISAqLwotICAgIEZMMkZYQ09OU1RfU0dMKDEuMzIxNTQ4Njc5MDE0NDMwOTQ4ODQwMzc1ODIyODI4ODRlLTYpICAgLyogbG4oMileOCAvOCEgKi8KKyAgICBGTDJGWENPTlNUX1NHTCgwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNzIzMjEyMTQ1ODE3NyksICAgLyogbG4oMileMSAvMSEgKi8KKyAgICBGTDJGWENPTlNUX1NHTCgwLjI0MDIyNjUwNjk1OTEwMDcxMjMzMzU1MTI2MzE2MzMzMiksICAgLyogbG4oMileMiAvMiEgKi8KKyAgICBGTDJGWENPTlNUX1NHTCgwLjA1NTUwNDEwODY2NDgyMTU3OTk1MzE0MjI2Mzc2ODYyMTgpLCAgLyogbG4oMileMyAvMyEgKi8KKyAgICBGTDJGWENPTlNUX1NHTCgwLjAwOTYxODEyOTEwNzYyODQ3NzE2MTk3OTA3MTU3MzY1ODg3KSwgLyogbG4oMileNCAvNCEgKi8KKyAgICBGTDJGWENPTlNUX1NHTCgwLjAwMTMzMzM1NTgxNDY0Mjg0NDM0MjM0MTIyMjE5ODc5OTYyKSwgLyogbG4oMileNSAvNSEgKi8KKyAgICBGTDJGWENPTlNUX1NHTCgxLjU0MDM1MzAzOTMzODE2MDk5NTQ0MzcwOTczMzI3NDIzZS00KSwgLyogbG4oMileNiAvNiEgKi8KKyAgICBGTDJGWENPTlNUX1NHTCgxLjUyNTI3MzM4MDQwNTk4NDAyODAwMjU0MzkwMTIwMDk2ZS01KSwgLyogbG4oMileNyAvNyEgKi8KKyAgICBGTDJGWENPTlNUX1NHTCgxLjMyMTU0ODY3OTAxNDQzMDk0ODg0MDM3NTgyMjgyODg0ZS02KSAgLyogbG4oMileOCAvOCEgKi8KIH07CiAjZW5kaWYKIAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgZnVuY3Rpb25uYW1lOiBtdWxfZGJsX3NnbF9ybmQKLSAgICBkZXNjcmlwdGlvbjogIE11bHRpcGx5IHdpdGggcm91bmQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogZm9yIHJvdW5kaW5nIGEgZGZyYWN0IHRvIGZyYWN0ICovCi0jZGVmaW5lIEFDQ1VfUiAoTE9ORykgMHgwMDAwODAwMAotCi1MTktfU0VDVElPTl9DT0RFX0wxCi1GSVhQX0RCTCBtdWxfZGJsX3NnbF9ybmQgKGNvbnN0IEZJWFBfREJMIG9wMSwgY29uc3QgRklYUF9TR0wgb3AyKQotewotICBGSVhQX0RCTCBwcm9kOwotICBMT05HIHYgPSAoTE9ORykob3AxKTsKLSAgU0hPUlQgdSA9IChTSE9SVCkob3AyKTsKLQotICBMT05HIGxvdyA9IHUqKHYmU0dMX01BU0spOwotICBsb3cgPSAobG93KyhBQ0NVX1I+PjEpKSA+PiAoRlJBQ1RfQklUUy0xKTsgIC8qIHJvdW5kICovCi0gIExPTkcgaGlnaCA9IHUgKiAoKHY+PkZSQUNUX0JJVFMpPDwxKTsKLQotICBwcm9kID0gKExPTkcpKGhpZ2grbG93KTsKLQotICByZXR1cm4oKEZJWFBfREJMKXByb2QpOwotfQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgIGZ1bmN0aW9ubmFtZTogQ2FsY0ludkxkRGF0YQpAQCAtMjM2LDI0NiArMTcxLDIyNSBAQAogICAgICAgICAgICAgICAgIERlbGl2ZXJzIDJeKG9wKkxEX0RBVEFfU0NBTElORykKICAgaW5wdXQ6ICAgICAgICBJbnB1dCBvcCBpcyBhc3N1bWVkIHRvIGJlIGZyYWN0aW9uYWwgLTEuMCA8IG9wIDwgMS4wCiAgIG91dHB1dDogICAgICAgRm9yIG9wID09IDAsIHRoZSByZXN1bHQgaXMgTUFYVkFMX0RCTCAoYWxtb3N0IDEuMCkuCi0gICAgICAgICAgICAgICAgRm9yIG5lZ2F0aXZlIGlucHV0IHZhbHVlcyB0aGUgb3V0cHV0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgcG9zaXRpdmUgZnJhY3Rpb25hbCB2YWx1ZS4KLSAgICAgICAgICAgICAgICBGb3IgcG9zaXRpdmUgaW5wdXQgdmFsdWVzIHRoZSBvdXRwdXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHZhbHVlLgotICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgb3V0cHV0IG5lZ2F0aXZlIHZhbHVlcy4KKyAgICAgICAgICAgICAgICBGb3IgbmVnYXRpdmUgaW5wdXQgdmFsdWVzIHRoZSBvdXRwdXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYQorcG9zaXRpdmUgZnJhY3Rpb25hbCB2YWx1ZS4gRm9yIHBvc2l0aXZlIGlucHV0IHZhbHVlcyB0aGUgb3V0cHV0IHNob3VsZCBiZQordHJlYXRlZCBhcyBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWUuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgb3V0cHV0IG5lZ2F0aXZlCit2YWx1ZXMuCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTE5LX1NFQ1RJT05fQ09ERV9MMQorLyogRGF0ZTogMDYtSlVMWS0yMDEyIEFydGh1ciBUcml0dGhhcnQsIElJUyBGcmF1bmhvZmVyIEVybGFuZ2VuICovCisvKiBWZXJzaW9uIHdpdGggMyB0YWJsZSBsb29rdXAgYW5kIDEgbGluZWFyIGludGVycG9sYXRpb25zICAgICAgKi8KKy8qIEFsZ29yaXRobTogY29tcHV0ZSBwb3dlciBvZiAyLCBhcmd1bWVudCB4IGlzIGluIFE3LjI1IGZvcm1hdCAqLworLyogIHJlc3VsdCA9IDJeKHgvNjQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2Ugc3BsaXQgZXhwb25lbnQgKHgvNjQpIGludG8gNSBjb21wb25lbnRzOiAgICAgICAgICAgICAgICAgKi8KKy8qICBpbnRlZ2VyIHBhcnQ6ICAgICAgcmVwcmVzZW50ZWQgYnkgYjMxLi5iMjUgIChleHApICAgICAgICAgICAqLworLyogIGZyYWN0aW9uYWwgcGFydCAxOiByZXByZXNlbnRlZCBieSBiMjQuLmIyMCAgKGxvb2t1cDEpICAgICAgICovCisvKiAgZnJhY3Rpb25hbCBwYXJ0IDI6IHJlcHJlc2VudGVkIGJ5IGIxOS4uYjE1ICAobG9va3VwMikgICAgICAgKi8KKy8qICBmcmFjdGlvbmFsIHBhcnQgMzogcmVwcmVzZW50ZWQgYnkgYjE0Li5iMTAgIChsb29rdXAzKSAgICAgICAqLworLyogIGZyYWN0aW9uYWwgcGFydCA0OiByZXByZXNlbnRlZCBieSBiMDkuLmIwMCAgKGZyYWMpICAgICAgICAgICovCisvKiAgPT4gcmVzdWx0ID0gKGxvb2t1cDEqbG9va3VwMioobG9va3VwMytDMSpmcmFjKTw8Myk+PmV4cCAgICAgKi8KKy8qIER1ZSB0byB0aGUgZmFjdCwgdGhhdCBhbGwgbG9va3VwIHZhbHVlcyBjb250YWluIGEgZmFjdG9yIDAuNSAqLworLyogdGhlIHJlc3VsdCBoYXMgdG8gYmUgc2hpZnRlZCBieSAzIHRvIHRoZSByaWdodCBhbHNvLiAgICAgICAgICovCisvKiBUYWJsZSBleHAyX3RhYl9sb25nIGNvbnRhaW5zIHRoZSBsb2cyIGZvciAwIHRvIDEuMCBpbiBzdGVwcyAgKi8KKy8qIG9mIDEvMzIsIHRhYmxlIGV4cDJ3X3RhYl9sb25nIHRoZSBsb2cyIGZvciAwIHRvIDEvMzIgaW4gc3RlcHMqLworLyogb2YgMS8xMDI0LCB0YWJsZSBleHAyeF90YWJfbG9uZyB0aGUgbG9nMiBmb3IgMCB0byAxLzEwMjQgaW4gICovCisvKiBzdGVwcyBvZiAxLzMyNzY4LiBTaW5jZSB0aGUgMi1sb2dhcml0aG0gb2YgdmVyeSB2ZXJ5IHNtYWxsICAgKi8KKy8qIG5lZ2F0aXZlIHZhbHVlIGlzIHJhdGhlciBsaW5lYXIsIHdlIGNhbiB1c2UgaW50ZXJwb2xhdGlvbi4gICAqLworLyogTGltaXRhdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGb3IgeCA8PSAwLCB0aGUgcmVzdWx0IGlzIGZyYWN0aW9uYWwgcG9zaXRpdmUgICAgICAgICAgICAgICAgKi8KKy8qIEZvciB4ID4gMCwgdGhlIHJlc3VsdCBpcyBpbnRlZ2VyIGluIHJhbmdlIDEuLi43RkZGLkZGRkYgICAgICAqLworLyogRm9yIHggPCAtMzEvNjQsIHdlIGhhdmUgdG8gY2xlYXIgdGhlIHJlc3VsdCAgICAgICAgICAgICAgICAgICovCisvKiBGb3IgeCA9IDAsIHRoZSByZXN1bHQgaXMgfjEuMCAoMHg3RkZGLkZGRkYpICAgICAgICAgICAgICAgICAgKi8KKy8qIEZvciB4ID49IDMxLzY0LCB0aGUgcmVzdWx0IGlzIDB4N0ZGRi5GRkZGICAgICAgICAgICAgICAgICAgICAqLworCiAvKiBUaGlzIHRhYmxlIGlzIHVzZWQgZm9yIGxvb2t1cCAyXnggd2l0aCAgICovCiAvKiB4IGluIHJhbmdlIFswLi4uMS4wWyBpbiBzdGVwcyBvZiAxLzMyICovCi1MTktfU0VDVElPTl9EQVRBX0wxIHN0YXRpYyBjb25zdCBVSU5UIGV4cDJfdGFiX2xvbmdbMzJdPXsKLTB4NDAwMDAwMDAsMHg0MTY2QzM0QywweDQyRDU2MUI0LDB4NDQ0QzA3NDAsCi0weDQ1Q0FFMEYyLDB4NDc1MjFDQzYsMHg0OEUxRTlCQSwweDRBN0E3N0Q0LAotMHg0QzFCRjgyOSwweDREQzY5Q0RELDB4NEY3QTk5MzAsMHg1MTM4MjE4MiwKLTB4NTJGRjZCNTUsMHg1NEQwQUQ1QSwweDU2QUMxRjc1LDB4NTg5MUZBQzEsCi0weDVBODI3OTlBLDB4NUM3REQ3QTQsMHg1RTg0NTFEMCwweDYwOTYyNjY1LAotMHg2MkIzOTUwOSwweDY0RENERUMzLDB4NjcxMjQ2MEIsMHg2OTU0MEVDOSwKLTB4NkJBMjdFNjUsMHg2REZEREJDQywweDcwNjY2Rjc2LDB4NzJEQzgzNzQsCi0weDc1NjA2Mzc0LDB4NzdGMjVDQ0UsMHg3QTkyQkU4QiwweDdENDFEOTZFCi0vLyAweDgwMDAwMDAwCitMTktfU0VDVElPTl9EQVRBX0wxCitjb25zdCBVSU5UIGV4cDJfdGFiX2xvbmdbMzJdID0geworICAgIDB4NDAwMDAwMDAsIDB4NDE2NkMzNEMsIDB4NDJENTYxQjQsIDB4NDQ0QzA3NDAsIDB4NDVDQUUwRjIsIDB4NDc1MjFDQzYsCisgICAgMHg0OEUxRTlCQSwgMHg0QTdBNzdENCwgMHg0QzFCRjgyOSwgMHg0REM2OUNERCwgMHg0RjdBOTkzMCwgMHg1MTM4MjE4MiwKKyAgICAweDUyRkY2QjU1LCAweDU0RDBBRDVBLCAweDU2QUMxRjc1LCAweDU4OTFGQUMxLCAweDVBODI3OTlBLCAweDVDN0REN0E0LAorICAgIDB4NUU4NDUxRDAsIDB4NjA5NjI2NjUsIDB4NjJCMzk1MDksIDB4NjREQ0RFQzMsIDB4NjcxMjQ2MEIsIDB4Njk1NDBFQzksCisgICAgMHg2QkEyN0U2NSwgMHg2REZEREJDQywgMHg3MDY2NkY3NiwgMHg3MkRDODM3NCwgMHg3NTYwNjM3NCwgMHg3N0YyNUNDRSwKKyAgICAweDdBOTJCRThCLCAweDdENDFEOTZFCisgICAgLy8gMHg4MDAwMDAwMAogfTsKIAogLyogVGhpcyB0YWJsZSBpcyB1c2VkIGZvciBsb29rdXAgMl54IHdpdGggICAqLwogLyogeCBpbiByYW5nZSBbMC4uLjEvMzJbIGluIHN0ZXBzIG9mIDEvMTAyNCAqLwotTE5LX1NFQ1RJT05fREFUQV9MMSBzdGF0aWMgY29uc3QgVUlOVCBleHAyd190YWJfbG9uZ1szMl09ewotMHg0MDAwMDAwMCwweDQwMEIxODE4LDB4NDAxNjMyMUIsMHg0MDIxNEUwQywKLTB4NDAyQzZCRTksMHg0MDM3OEJCNCwweDQwNDJBRDZELDB4NDA0REQxMTMsCi0weDQwNThGNkE4LDB4NDA2NDFFMkIsMHg0MDZGNDc5RSwweDQwN0E3MzAwLAotMHg0MDg1QTA1MSwweDQwOTBDRjkyLDB4NDA5QzAwQzQsMHg0MEE3MzNFNiwKLTB4NDBCMjY4RkEsMHg0MEJEOUZGRiwweDQwQzhEOEY1LDB4NDBENDEzREQsCi0weDQwREY1MEI4LDB4NDBFQThGODYsMHg0MEY1RDA0NiwweDQxMDExMkZBLAotMHg0MTBDNTdBMiwweDQxMTc5RTNELDB4NDEyMkU2Q0QsMHg0MTJFMzE1MiwKLTB4NDEzOTdEQ0MsMHg0MTQ0Q0MzQiwweDQxNTAxQ0EwLDB4NDE1QjZFRkIsCi0vLyAweDQxNjZDMzRDLAorTE5LX1NFQ1RJT05fREFUQV9MMQorY29uc3QgVUlOVCBleHAyd190YWJfbG9uZ1szMl0gPSB7CisgICAgMHg0MDAwMDAwMCwgMHg0MDBCMTgxOCwgMHg0MDE2MzIxQiwgMHg0MDIxNEUwQywgMHg0MDJDNkJFOSwgMHg0MDM3OEJCNCwKKyAgICAweDQwNDJBRDZELCAweDQwNEREMTEzLCAweDQwNThGNkE4LCAweDQwNjQxRTJCLCAweDQwNkY0NzlFLCAweDQwN0E3MzAwLAorICAgIDB4NDA4NUEwNTEsIDB4NDA5MENGOTIsIDB4NDA5QzAwQzQsIDB4NDBBNzMzRTYsIDB4NDBCMjY4RkEsIDB4NDBCRDlGRkYsCisgICAgMHg0MEM4RDhGNSwgMHg0MEQ0MTNERCwgMHg0MERGNTBCOCwgMHg0MEVBOEY4NiwgMHg0MEY1RDA0NiwgMHg0MTAxMTJGQSwKKyAgICAweDQxMEM1N0EyLCAweDQxMTc5RTNELCAweDQxMjJFNkNELCAweDQxMkUzMTUyLCAweDQxMzk3RENDLCAweDQxNDRDQzNCLAorICAgIDB4NDE1MDFDQTAsIDB4NDE1QjZFRkIsCisgICAgLy8gMHg0MTY2QzM0QywKIH07CiAvKiBUaGlzIHRhYmxlIGlzIHVzZWQgZm9yIGxvb2t1cCAyXnggd2l0aCAgICovCiAvKiB4IGluIHJhbmdlIFswLi4uMS8xMDI0WyBpbiBzdGVwcyBvZiAxLzMyNzY4ICovCi1MTktfU0VDVElPTl9EQVRBX0wxIHN0YXRpYyBjb25zdCBVSU5UIGV4cDJ4X3RhYl9sb25nWzMyXT17Ci0weDQwMDAwMDAwLDB4NDAwMDU4QjksMHg0MDAwQjE3MywweDQwMDEwQTJELAotMHg0MDAxNjJFOCwweDQwMDFCQkEzLDB4NDAwMjE0NUYsMHg0MDAyNkQxQiwKLTB4NDAwMkM1RDgsMHg0MDAzMUU5NSwweDQwMDM3NzUyLDB4NDAwM0QwMTEsCi0weDQwMDQyOENGLDB4NDAwNDgxOEUsMHg0MDA0REE0RSwweDQwMDUzMzBFLAotMHg0MDA1OEJDRSwweDQwMDVFNDhGLDB4NDAwNjNENTEsMHg0MDA2OTYxMywKLTB4NDAwNkVFRDUsMHg0MDA3NDc5OCwweDQwMDdBMDVCLDB4NDAwN0Y5MUYsCi0weDQwMDg1MUU0LDB4NDAwOEFBQTgsMHg0MDA5MDM2RSwweDQwMDk1QzMzLAotMHg0MDA5QjRGQSwweDQwMEEwREMwLDB4NDAwQTY2ODgsMHg0MDBBQkY0RiwKLS8vMHg0MDBCMTgxOAorTE5LX1NFQ1RJT05fREFUQV9MMQorY29uc3QgVUlOVCBleHAyeF90YWJfbG9uZ1szMl0gPSB7CisgICAgMHg0MDAwMDAwMCwgMHg0MDAwNThCOSwgMHg0MDAwQjE3MywgMHg0MDAxMEEyRCwgMHg0MDAxNjJFOCwgMHg0MDAxQkJBMywKKyAgICAweDQwMDIxNDVGLCAweDQwMDI2RDFCLCAweDQwMDJDNUQ4LCAweDQwMDMxRTk1LCAweDQwMDM3NzUyLCAweDQwMDNEMDExLAorICAgIDB4NDAwNDI4Q0YsIDB4NDAwNDgxOEUsIDB4NDAwNERBNEUsIDB4NDAwNTMzMEUsIDB4NDAwNThCQ0UsIDB4NDAwNUU0OEYsCisgICAgMHg0MDA2M0Q1MSwgMHg0MDA2OTYxMywgMHg0MDA2RUVENSwgMHg0MDA3NDc5OCwgMHg0MDA3QTA1QiwgMHg0MDA3RjkxRiwKKyAgICAweDQwMDg1MUU0LCAweDQwMDhBQUE4LCAweDQwMDkwMzZFLCAweDQwMDk1QzMzLCAweDQwMDlCNEZBLCAweDQwMEEwREMwLAorICAgIDB4NDAwQTY2ODgsIDB4NDAwQUJGNEYsCisgICAgLy8gMHg0MDBCMTgxOAogfTsKIAotTE5LX1NFQ1RJT05fQ09ERV9MMSBGSVhQX0RCTCBDYWxjSW52TGREYXRhKEZJWFBfREJMIHgpCi17Ci0gIGludCBzZXRfemVybyA9ICh4IDwgIEZMMkZYQ09OU1RfREJMKC0zMS4wLzY0LjApKT8gMCA6IDE7Ci0gIGludCBzZXRfbWF4ICA9ICh4ID49IEZMMkZYQ09OU1RfREJMKCAzMS4wLzY0LjApKSB8ICh4ID09IEZMMkZYQ09OU1RfREJMKDAuMCkpOwotCi0gIEZJWFBfU0dMIGZyYWMgPSAoRklYUF9TR0wpKExPTkcpKHggJiAweDNGRik7Ci0gIFVJTlQgaW5kZXgzID0gKFVJTlQpKExPTkcpKHggPj4gMTApICYgMHgxRjsKLSAgVUlOVCBpbmRleDIgPSAoVUlOVCkoTE9ORykoeCA+PiAxNSkgJiAweDFGOyAKLSAgVUlOVCBpbmRleDEgPSAoVUlOVCkoTE9ORykoeCA+PiAyMCkgJiAweDFGOwotICBpbnQgZXhwICA9ICh4ID4gIEZMMkZYQ09OU1RfREJMKDAuMGYpKSA/ICgzMSAtIChpbnQpKHg+PjI1KSkgOiAoaW50KSgtKHg+PjI1KSk7Ci0KLSAgVUlOVCBsb29rdXAxID0gZXhwMl90YWJfbG9uZ1tpbmRleDFdKnNldF96ZXJvOwotICBVSU5UIGxvb2t1cDIgPSBleHAyd190YWJfbG9uZ1tpbmRleDJdOwotICBVSU5UIGxvb2t1cDMgPSBleHAyeF90YWJfbG9uZ1tpbmRleDNdOwotICBVSU5UIGxvb2t1cDNmID0gbG9va3VwMyArIChVSU5UKShMT05HKWZNdWx0RGl2MigoRklYUF9EQkwpKDB4MDAxNjMwMkYpLChGSVhQX1NHTClmcmFjKTsKLSAgCi0gIFVJTlQgbG9va3VwMTIgPSAoVUlOVCkoTE9ORylmTXVsdCgoRklYUF9EQkwpbG9va3VwMSwgIChGSVhQX0RCTCkgbG9va3VwMik7Ci0gIFVJTlQgbG9va3VwICAgPSAoVUlOVCkoTE9ORylmTXVsdCgoRklYUF9EQkwpbG9va3VwMTIsIChGSVhQX0RCTCkgbG9va3VwM2YpOwotCi0gIEZJWFBfREJMIHJldFZhbCA9IChsb29rdXA8PDMpID4+IGV4cDsKLQotICBpZiAoc2V0X21heCkKLSAgICByZXRWYWw9RkwyRlhDT05TVF9EQkwoMS4wZik7Ci0KLSAgcmV0dXJuIHJldFZhbDsKLX0KLQotCi0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBmdW5jdGlvbm5hbWU6IEluaXRMZEludCBhbmQgQ2FsY0xkSW50Ci0gICAgZGVzY3JpcHRpb246ICBDcmVhdGUgYW5kIGFjY2VzcyB0YWJsZSB3aXRoIGludGVnZXIgTGREYXRhICgwIHRvIDE5MykKKyAgICBkZXNjcmlwdGlvbjogIENyZWF0ZSBhbmQgYWNjZXNzIHRhYmxlIHdpdGggaW50ZWdlciBMZERhdGEgKDAgdG8KK0xEX0lOVF9UQUJfTEVOKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIExEX0lOVF9UQUJfTEVOCisjZGVmaW5lIExEX0lOVF9UQUJfTEVOIFwKKyAgMTkzIC8qIERlZmF1bHQgdGFiIGxlbmd0aC4gTG93ZXIgdmFsdWUgc2hvdWxkIGJlIHNldCBpbiBmaXguaCAqLworI2VuZGlmCiAKKyNpZiAoTERfSU5UX1RBQl9MRU4gPD0gMTIwKQorTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCitzdGF0aWMgY29uc3QgRklYUF9EQkwgbGRJbnRDb2VmZltdID0geworICAgIChGSVhQX0RCTCkweDgwMDAwMDAxLCAoRklYUF9EQkwpMHgwMDAwMDAwMCwgKEZJWFBfREJMKTB4MDIwMDAwMDAsCisgICAgKEZJWFBfREJMKTB4MDMyYjgwMzQsIChGSVhQX0RCTCkweDA0MDAwMDAwLCAoRklYUF9EQkwpMHgwNGE0ZDNjMiwKKyAgICAoRklYUF9EQkwpMHgwNTJiODAzNCwgKEZJWFBfREJMKTB4MDU5ZDVkYTAsIChGSVhQX0RCTCkweDA2MDAwMDAwLAorICAgIChGSVhQX0RCTCkweDA2NTcwMDY5LCAoRklYUF9EQkwpMHgwNmE0ZDNjMiwgKEZJWFBfREJMKTB4MDZlYjNhOWYsCisgICAgKEZJWFBfREJMKTB4MDcyYjgwMzQsIChGSVhQX0RCTCkweDA3NjZhMDA5LCAoRklYUF9EQkwpMHgwNzlkNWRhMCwKKyAgICAoRklYUF9EQkwpMHgwN2QwNTNmNywgKEZJWFBfREJMKTB4MDgwMDAwMDAsIChGSVhQX0RCTCkweDA4MmNjN2VlLAorICAgIChGSVhQX0RCTCkweDA4NTcwMDY5LCAoRklYUF9EQkwpMHgwODdlZjA1YiwgKEZJWFBfREJMKTB4MDhhNGQzYzIsCisgICAgKEZJWFBfREJMKTB4MDhjOGRkZDQsIChGSVhQX0RCTCkweDA4ZWIzYTlmLCAoRklYUF9EQkwpMHgwOTBjMTA1MCwKKyAgICAoRklYUF9EQkwpMHgwOTJiODAzNCwgKEZJWFBfREJMKTB4MDk0OWE3ODUsIChGSVhQX0RCTCkweDA5NjZhMDA5LAorICAgIChGSVhQX0RCTCkweDA5ODI4MDlkLCAoRklYUF9EQkwpMHgwOTlkNWRhMCwgKEZJWFBfREJMKTB4MDliNzQ5NDksCisgICAgKEZJWFBfREJMKTB4MDlkMDUzZjcsIChGSVhQX0RCTCkweDA5ZTg4YzZiLCAoRklYUF9EQkwpMHgwYTAwMDAwMCwKKyAgICAoRklYUF9EQkwpMHgwYTE2YmFkMywgKEZJWFBfREJMKTB4MGEyY2M3ZWUsIChGSVhQX0RCTCkweDBhNDIzMTYyLAorICAgIChGSVhQX0RCTCkweDBhNTcwMDY5LCAoRklYUF9EQkwpMHgwYTZiM2Q3OSwgKEZJWFBfREJMKTB4MGE3ZWYwNWIsCisgICAgKEZJWFBfREJMKTB4MGE5MjIwM2QsIChGSVhQX0RCTCkweDBhYTRkM2MyLCAoRklYUF9EQkwpMHgwYWI3MTEwZSwKKyAgICAoRklYUF9EQkwpMHgwYWM4ZGRkNCwgKEZJWFBfREJMKTB4MGFkYTNmNjAsIChGSVhQX0RCTCkweDBhZWIzYTlmLAorICAgIChGSVhQX0RCTCkweDBhZmJkNDJiLCAoRklYUF9EQkwpMHgwYjBjMTA1MCwgKEZJWFBfREJMKTB4MGIxYmYzMTIsCisgICAgKEZJWFBfREJMKTB4MGIyYjgwMzQsIChGSVhQX0RCTCkweDBiM2FiYjQwLCAoRklYUF9EQkwpMHgwYjQ5YTc4NSwKKyAgICAoRklYUF9EQkwpMHgwYjU4NDgyMiwgKEZJWFBfREJMKTB4MGI2NmEwMDksIChGSVhQX0RCTCkweDBiNzRiMWZkLAorICAgIChGSVhQX0RCTCkweDBiODI4MDlkLCAoRklYUF9EQkwpMHgwYjkwMGU2MSwgKEZJWFBfREJMKTB4MGI5ZDVkYTAsCisgICAgKEZJWFBfREJMKTB4MGJhYTcwOGYsIChGSVhQX0RCTCkweDBiYjc0OTQ5LCAoRklYUF9EQkwpMHgwYmMzZTljYSwKKyAgICAoRklYUF9EQkwpMHgwYmQwNTNmNywgKEZJWFBfREJMKTB4MGJkYzg5OWIsIChGSVhQX0RCTCkweDBiZTg4YzZiLAorICAgIChGSVhQX0RCTCkweDBiZjQ1ZTA5LCAoRklYUF9EQkwpMHgwYzAwMDAwMCwgKEZJWFBfREJMKTB4MGMwYjczY2IsCisgICAgKEZJWFBfREJMKTB4MGMxNmJhZDMsIChGSVhQX0RCTCkweDBjMjFkNjcxLCAoRklYUF9EQkwpMHgwYzJjYzdlZSwKKyAgICAoRklYUF9EQkwpMHgwYzM3OTA4NSwgKEZJWFBfREJMKTB4MGM0MjMxNjIsIChGSVhQX0RCTCkweDBjNGNhYmE4LAorICAgIChGSVhQX0RCTCkweDBjNTcwMDY5LCAoRklYUF9EQkwpMHgwYzYxMzBhZiwgKEZJWFBfREJMKTB4MGM2YjNkNzksCisgICAgKEZJWFBfREJMKTB4MGM3NTI3YjksIChGSVhQX0RCTCkweDBjN2VmMDViLCAoRklYUF9EQkwpMHgwYzg4OTgzZiwKKyAgICAoRklYUF9EQkwpMHgwYzkyMjAzZCwgKEZJWFBfREJMKTB4MGM5Yjg5MjYsIChGSVhQX0RCTCkweDBjYTRkM2MyLAorICAgIChGSVhQX0RCTCkweDBjYWUwMGQyLCAoRklYUF9EQkwpMHgwY2I3MTEwZSwgKEZJWFBfREJMKTB4MGNjMDA1MmIsCisgICAgKEZJWFBfREJMKTB4MGNjOGRkZDQsIChGSVhQX0RCTCkweDBjZDE5YmIwLCAoRklYUF9EQkwpMHgwY2RhM2Y2MCwKKyAgICAoRklYUF9EQkwpMHgwY2UyYzk3ZCwgKEZJWFBfREJMKTB4MGNlYjNhOWYsIChGSVhQX0RCTCkweDBjZjM5MzU1LAorICAgIChGSVhQX0RCTCkweDBjZmJkNDJiLCAoRklYUF9EQkwpMHgwZDAzZmRhOSwgKEZJWFBfREJMKTB4MGQwYzEwNTAsCisgICAgKEZJWFBfREJMKTB4MGQxNDBjYTAsIChGSVhQX0RCTCkweDBkMWJmMzEyLCAoRklYUF9EQkwpMHgwZDIzYzQxZCwKKyAgICAoRklYUF9EQkwpMHgwZDJiODAzNCwgKEZJWFBfREJMKTB4MGQzMzI3YzcsIChGSVhQX0RCTCkweDBkM2FiYjQwLAorICAgIChGSVhQX0RCTCkweDBkNDIzYjA4LCAoRklYUF9EQkwpMHgwZDQ5YTc4NSwgKEZJWFBfREJMKTB4MGQ1MTAxMTgsCisgICAgKEZJWFBfREJMKTB4MGQ1ODQ4MjIsIChGSVhQX0RCTCkweDBkNWY3Y2ZmLCAoRklYUF9EQkwpMHgwZDY2YTAwOSwKKyAgICAoRklYUF9EQkwpMHgwZDZkYjE5NywgKEZJWFBfREJMKTB4MGQ3NGIxZmQsIChGSVhQX0RCTCkweDBkN2JhMTkwLAorICAgIChGSVhQX0RCTCkweDBkODI4MDlkLCAoRklYUF9EQkwpMHgwZDg5NGY3NSwgKEZJWFBfREJMKTB4MGQ5MDBlNjEsCisgICAgKEZJWFBfREJMKTB4MGQ5NmJkYWQsIChGSVhQX0RCTCkweDBkOWQ1ZGEwLCAoRklYUF9EQkwpMHgwZGEzZWU3ZiwKKyAgICAoRklYUF9EQkwpMHgwZGFhNzA4ZiwgKEZJWFBfREJMKTB4MGRiMGU0MTIsIChGSVhQX0RCTCkweDBkYjc0OTQ5LAorICAgIChGSVhQX0RCTCkweDBkYmRhMDcyLCAoRklYUF9EQkwpMHgwZGMzZTljYSwgKEZJWFBfREJMKTB4MGRjYTI1OGV9OwogCi0gICAgTE5LX1NFQ1RJT05fQ09OU1REQVRBX0wxCi0gICAgc3RhdGljIGNvbnN0IEZJWFBfREJMIGxkSW50Q29lZmZbXSA9IHsKLSAgICAgIChGSVhQX0RCTCkweDgwMDAwMDAxLCAoRklYUF9EQkwpMHgwMDAwMDAwMCwgKEZJWFBfREJMKTB4MDIwMDAwMDAsIChGSVhQX0RCTCkweDAzMmI4MDM0LCAoRklYUF9EQkwpMHgwNDAwMDAwMCwgKEZJWFBfREJMKTB4MDRhNGQzYzIsIChGSVhQX0RCTCkweDA1MmI4MDM0LCAoRklYUF9EQkwpMHgwNTlkNWRhMCwKLSAgICAgIChGSVhQX0RCTCkweDA2MDAwMDAwLCAoRklYUF9EQkwpMHgwNjU3MDA2OSwgKEZJWFBfREJMKTB4MDZhNGQzYzIsIChGSVhQX0RCTCkweDA2ZWIzYTlmLCAoRklYUF9EQkwpMHgwNzJiODAzNCwgKEZJWFBfREJMKTB4MDc2NmEwMDksIChGSVhQX0RCTCkweDA3OWQ1ZGEwLCAoRklYUF9EQkwpMHgwN2QwNTNmNywKLSAgICAgIChGSVhQX0RCTCkweDA4MDAwMDAwLCAoRklYUF9EQkwpMHgwODJjYzdlZSwgKEZJWFBfREJMKTB4MDg1NzAwNjksIChGSVhQX0RCTCkweDA4N2VmMDViLCAoRklYUF9EQkwpMHgwOGE0ZDNjMiwgKEZJWFBfREJMKTB4MDhjOGRkZDQsIChGSVhQX0RCTCkweDA4ZWIzYTlmLCAoRklYUF9EQkwpMHgwOTBjMTA1MCwKLSAgICAgIChGSVhQX0RCTCkweDA5MmI4MDM0LCAoRklYUF9EQkwpMHgwOTQ5YTc4NSwgKEZJWFBfREJMKTB4MDk2NmEwMDksIChGSVhQX0RCTCkweDA5ODI4MDlkLCAoRklYUF9EQkwpMHgwOTlkNWRhMCwgKEZJWFBfREJMKTB4MDliNzQ5NDksIChGSVhQX0RCTCkweDA5ZDA1M2Y3LCAoRklYUF9EQkwpMHgwOWU4OGM2YiwKLSAgICAgIChGSVhQX0RCTCkweDBhMDAwMDAwLCAoRklYUF9EQkwpMHgwYTE2YmFkMywgKEZJWFBfREJMKTB4MGEyY2M3ZWUsIChGSVhQX0RCTCkweDBhNDIzMTYyLCAoRklYUF9EQkwpMHgwYTU3MDA2OSwgKEZJWFBfREJMKTB4MGE2YjNkNzksIChGSVhQX0RCTCkweDBhN2VmMDViLCAoRklYUF9EQkwpMHgwYTkyMjAzZCwKLSAgICAgIChGSVhQX0RCTCkweDBhYTRkM2MyLCAoRklYUF9EQkwpMHgwYWI3MTEwZSwgKEZJWFBfREJMKTB4MGFjOGRkZDQsIChGSVhQX0RCTCkweDBhZGEzZjYwLCAoRklYUF9EQkwpMHgwYWViM2E5ZiwgKEZJWFBfREJMKTB4MGFmYmQ0MmIsIChGSVhQX0RCTCkweDBiMGMxMDUwLCAoRklYUF9EQkwpMHgwYjFiZjMxMiwKLSAgICAgIChGSVhQX0RCTCkweDBiMmI4MDM0LCAoRklYUF9EQkwpMHgwYjNhYmI0MCwgKEZJWFBfREJMKTB4MGI0OWE3ODUsIChGSVhQX0RCTCkweDBiNTg0ODIyLCAoRklYUF9EQkwpMHgwYjY2YTAwOSwgKEZJWFBfREJMKTB4MGI3NGIxZmQsIChGSVhQX0RCTCkweDBiODI4MDlkLCAoRklYUF9EQkwpMHgwYjkwMGU2MSwKLSAgICAgIChGSVhQX0RCTCkweDBiOWQ1ZGEwLCAoRklYUF9EQkwpMHgwYmFhNzA4ZiwgKEZJWFBfREJMKTB4MGJiNzQ5NDksIChGSVhQX0RCTCkweDBiYzNlOWNhLCAoRklYUF9EQkwpMHgwYmQwNTNmNywgKEZJWFBfREJMKTB4MGJkYzg5OWIsIChGSVhQX0RCTCkweDBiZTg4YzZiLCAoRklYUF9EQkwpMHgwYmY0NWUwOSwKLSAgICAgIChGSVhQX0RCTCkweDBjMDAwMDAwLCAoRklYUF9EQkwpMHgwYzBiNzNjYiwgKEZJWFBfREJMKTB4MGMxNmJhZDMsIChGSVhQX0RCTCkweDBjMjFkNjcxLCAoRklYUF9EQkwpMHgwYzJjYzdlZSwgKEZJWFBfREJMKTB4MGMzNzkwODUsIChGSVhQX0RCTCkweDBjNDIzMTYyLCAoRklYUF9EQkwpMHgwYzRjYWJhOCwKLSAgICAgIChGSVhQX0RCTCkweDBjNTcwMDY5LCAoRklYUF9EQkwpMHgwYzYxMzBhZiwgKEZJWFBfREJMKTB4MGM2YjNkNzksIChGSVhQX0RCTCkweDBjNzUyN2I5LCAoRklYUF9EQkwpMHgwYzdlZjA1YiwgKEZJWFBfREJMKTB4MGM4ODk4M2YsIChGSVhQX0RCTCkweDBjOTIyMDNkLCAoRklYUF9EQkwpMHgwYzliODkyNiwKLSAgICAgIChGSVhQX0RCTCkweDBjYTRkM2MyLCAoRklYUF9EQkwpMHgwY2FlMDBkMiwgKEZJWFBfREJMKTB4MGNiNzExMGUsIChGSVhQX0RCTCkweDBjYzAwNTJiLCAoRklYUF9EQkwpMHgwY2M4ZGRkNCwgKEZJWFBfREJMKTB4MGNkMTliYjAsIChGSVhQX0RCTCkweDBjZGEzZjYwLCAoRklYUF9EQkwpMHgwY2UyYzk3ZCwKLSAgICAgIChGSVhQX0RCTCkweDBjZWIzYTlmLCAoRklYUF9EQkwpMHgwY2YzOTM1NSwgKEZJWFBfREJMKTB4MGNmYmQ0MmIsIChGSVhQX0RCTCkweDBkMDNmZGE5LCAoRklYUF9EQkwpMHgwZDBjMTA1MCwgKEZJWFBfREJMKTB4MGQxNDBjYTAsIChGSVhQX0RCTCkweDBkMWJmMzEyLCAoRklYUF9EQkwpMHgwZDIzYzQxZCwKLSAgICAgIChGSVhQX0RCTCkweDBkMmI4MDM0LCAoRklYUF9EQkwpMHgwZDMzMjdjNywgKEZJWFBfREJMKTB4MGQzYWJiNDAsIChGSVhQX0RCTCkweDBkNDIzYjA4LCAoRklYUF9EQkwpMHgwZDQ5YTc4NSwgKEZJWFBfREJMKTB4MGQ1MTAxMTgsIChGSVhQX0RCTCkweDBkNTg0ODIyLCAoRklYUF9EQkwpMHgwZDVmN2NmZiwKLSAgICAgIChGSVhQX0RCTCkweDBkNjZhMDA5LCAoRklYUF9EQkwpMHgwZDZkYjE5NywgKEZJWFBfREJMKTB4MGQ3NGIxZmQsIChGSVhQX0RCTCkweDBkN2JhMTkwLCAoRklYUF9EQkwpMHgwZDgyODA5ZCwgKEZJWFBfREJMKTB4MGQ4OTRmNzUsIChGSVhQX0RCTCkweDBkOTAwZTYxLCAoRklYUF9EQkwpMHgwZDk2YmRhZCwKLSAgICAgIChGSVhQX0RCTCkweDBkOWQ1ZGEwLCAoRklYUF9EQkwpMHgwZGEzZWU3ZiwgKEZJWFBfREJMKTB4MGRhYTcwOGYsIChGSVhQX0RCTCkweDBkYjBlNDEyLCAoRklYUF9EQkwpMHgwZGI3NDk0OSwgKEZJWFBfREJMKTB4MGRiZGEwNzIsIChGSVhQX0RCTCkweDBkYzNlOWNhLCAoRklYUF9EQkwpMHgwZGNhMjU4ZSwKLSAgICAgIChGSVhQX0RCTCkweDBkZDA1M2Y3LCAoRklYUF9EQkwpMHgwZGQ2NzUzZSwgKEZJWFBfREJMKTB4MGRkYzg5OWIsIChGSVhQX0RCTCkweDBkZTI5MTQzLCAoRklYUF9EQkwpMHgwZGU4OGM2YiwgKEZJWFBfREJMKTB4MGRlZTdiNDcsIChGSVhQX0RCTCkweDBkZjQ1ZTA5LCAoRklYUF9EQkwpMHgwZGZhMzRlMSwKLSAgICAgIChGSVhQX0RCTCkweDBlMDAwMDAwLCAoRklYUF9EQkwpMHgwZTA1YmY5NCwgKEZJWFBfREJMKTB4MGUwYjczY2IsIChGSVhQX0RCTCkweDBlMTExY2QyLCAoRklYUF9EQkwpMHgwZTE2YmFkMywgKEZJWFBfREJMKTB4MGUxYzRkZmIsIChGSVhQX0RCTCkweDBlMjFkNjcxLCAoRklYUF9EQkwpMHgwZTI3NTQ2MCwKLSAgICAgIChGSVhQX0RCTCkweDBlMmNjN2VlLCAoRklYUF9EQkwpMHgwZTMyMzE0MywgKEZJWFBfREJMKTB4MGUzNzkwODUsIChGSVhQX0RCTCkweDBlM2NlNWQ4LCAoRklYUF9EQkwpMHgwZTQyMzE2MiwgKEZJWFBfREJMKTB4MGU0NzczNDYsIChGSVhQX0RCTCkweDBlNGNhYmE4LCAoRklYUF9EQkwpMHgwZTUxZGFhOCwKLSAgICAgIChGSVhQX0RCTCkweDBlNTcwMDY5LCAoRklYUF9EQkwpMHgwZTVjMWQwYiwgKEZJWFBfREJMKTB4MGU2MTMwYWYsIChGSVhQX0RCTCkweDBlNjYzYjc0LCAoRklYUF9EQkwpMHgwZTZiM2Q3OSwgKEZJWFBfREJMKTB4MGU3MDM2ZGIsIChGSVhQX0RCTCkweDBlNzUyN2I5LCAoRklYUF9EQkwpMHgwZTdhMTAzMCwKLSAgICAgIChGSVhQX0RCTCkweDBlN2VmMDViLCAoRklYUF9EQkwpMHgwZTgzYzg1NywgKEZJWFBfREJMKTB4MGU4ODk4M2YsIChGSVhQX0RCTCkweDBlOGQ2MDJlLCAoRklYUF9EQkwpMHgwZTkyMjAzZCwgKEZJWFBfREJMKTB4MGU5NmQ4ODgsIChGSVhQX0RCTCkweDBlOWI4OTI2LCAoRklYUF9EQkwpMHgwZWEwMzIzMiwKLSAgICAgIChGSVhQX0RCTCkweDBlYTRkM2MyLCAoRklYUF9EQkwpMHgwZWE5NmRmMCwgKEZJWFBfREJMKTB4MGVhZTAwZDIsIChGSVhQX0RCTCkweDBlYjI4YzdmLCAoRklYUF9EQkwpMHgwZWI3MTEwZSwgKEZJWFBfREJMKTB4MGViYjhlOTYsIChGSVhQX0RCTCkweDBlYzAwNTJiLCAoRklYUF9EQkwpMHgwZWM0NzRlNCwKLSAgICAgIChGSVhQX0RCTCkweDBlYzhkZGQ0LCAoRklYUF9EQkwpMHgwZWNkNDAxMiwgKEZJWFBfREJMKTB4MGVkMTliYjAsIChGSVhQX0RCTCkweDBlZDVmMGM0LCAoRklYUF9EQkwpMHgwZWRhM2Y2MCwgKEZJWFBfREJMKTB4MGVkZTg3OTcsIChGSVhQX0RCTCkweDBlZTJjOTdkLCAoRklYUF9EQkwpMHgwZWU3MDUyNSwKLSAgICAgIChGSVhQX0RCTCkweDBlZWIzYTlmLCAoRklYUF9EQkwpMHgwZWVmNjlmZiwgKEZJWFBfREJMKTB4MGVmMzkzNTUsIChGSVhQX0RCTCkweDBlZjdiNmI0LCAoRklYUF9EQkwpMHgwZWZiZDQyYiwgKEZJWFBfREJMKTB4MGVmZmViY2QsIChGSVhQX0RCTCkweDBmMDNmZGE5LCAoRklYUF9EQkwpMHgwZjA4MDljZiwKLSAgICAgIChGSVhQX0RCTCkweDBmMGMxMDUwLCAoRklYUF9EQkwpMHgwZjEwMTEzYiwgKEZJWFBfREJMKTB4MGYxNDBjYTAsIChGSVhQX0RCTCkweDBmMTgwMjhkLCAoRklYUF9EQkwpMHgwZjFiZjMxMiwgKEZJWFBfREJMKTB4MGYxZmRlM2QsIChGSVhQX0RCTCkweDBmMjNjNDFkLCAoRklYUF9EQkwpMHgwZjI3YTRjMCwKLSAgICAgIChGSVhQX0RCTCkweDBmMmI4MDM0Ci0gICAgfTsKKyNlbGlmIChMRF9JTlRfVEFCX0xFTiA8PSAxOTMpCitMTktfU0VDVElPTl9DT05TVERBVEFfTDEKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBsZEludENvZWZmW10gPSB7CisgICAgKEZJWFBfREJMKTB4ODAwMDAwMDEsIChGSVhQX0RCTCkweDAwMDAwMDAwLCAoRklYUF9EQkwpMHgwMjAwMDAwMCwKKyAgICAoRklYUF9EQkwpMHgwMzJiODAzNCwgKEZJWFBfREJMKTB4MDQwMDAwMDAsIChGSVhQX0RCTCkweDA0YTRkM2MyLAorICAgIChGSVhQX0RCTCkweDA1MmI4MDM0LCAoRklYUF9EQkwpMHgwNTlkNWRhMCwgKEZJWFBfREJMKTB4MDYwMDAwMDAsCisgICAgKEZJWFBfREJMKTB4MDY1NzAwNjksIChGSVhQX0RCTCkweDA2YTRkM2MyLCAoRklYUF9EQkwpMHgwNmViM2E5ZiwKKyAgICAoRklYUF9EQkwpMHgwNzJiODAzNCwgKEZJWFBfREJMKTB4MDc2NmEwMDksIChGSVhQX0RCTCkweDA3OWQ1ZGEwLAorICAgIChGSVhQX0RCTCkweDA3ZDA1M2Y3LCAoRklYUF9EQkwpMHgwODAwMDAwMCwgKEZJWFBfREJMKTB4MDgyY2M3ZWUsCisgICAgKEZJWFBfREJMKTB4MDg1NzAwNjksIChGSVhQX0RCTCkweDA4N2VmMDViLCAoRklYUF9EQkwpMHgwOGE0ZDNjMiwKKyAgICAoRklYUF9EQkwpMHgwOGM4ZGRkNCwgKEZJWFBfREJMKTB4MDhlYjNhOWYsIChGSVhQX0RCTCkweDA5MGMxMDUwLAorICAgIChGSVhQX0RCTCkweDA5MmI4MDM0LCAoRklYUF9EQkwpMHgwOTQ5YTc4NSwgKEZJWFBfREJMKTB4MDk2NmEwMDksCisgICAgKEZJWFBfREJMKTB4MDk4MjgwOWQsIChGSVhQX0RCTCkweDA5OWQ1ZGEwLCAoRklYUF9EQkwpMHgwOWI3NDk0OSwKKyAgICAoRklYUF9EQkwpMHgwOWQwNTNmNywgKEZJWFBfREJMKTB4MDllODhjNmIsIChGSVhQX0RCTCkweDBhMDAwMDAwLAorICAgIChGSVhQX0RCTCkweDBhMTZiYWQzLCAoRklYUF9EQkwpMHgwYTJjYzdlZSwgKEZJWFBfREJMKTB4MGE0MjMxNjIsCisgICAgKEZJWFBfREJMKTB4MGE1NzAwNjksIChGSVhQX0RCTCkweDBhNmIzZDc5LCAoRklYUF9EQkwpMHgwYTdlZjA1YiwKKyAgICAoRklYUF9EQkwpMHgwYTkyMjAzZCwgKEZJWFBfREJMKTB4MGFhNGQzYzIsIChGSVhQX0RCTCkweDBhYjcxMTBlLAorICAgIChGSVhQX0RCTCkweDBhYzhkZGQ0LCAoRklYUF9EQkwpMHgwYWRhM2Y2MCwgKEZJWFBfREJMKTB4MGFlYjNhOWYsCisgICAgKEZJWFBfREJMKTB4MGFmYmQ0MmIsIChGSVhQX0RCTCkweDBiMGMxMDUwLCAoRklYUF9EQkwpMHgwYjFiZjMxMiwKKyAgICAoRklYUF9EQkwpMHgwYjJiODAzNCwgKEZJWFBfREJMKTB4MGIzYWJiNDAsIChGSVhQX0RCTCkweDBiNDlhNzg1LAorICAgIChGSVhQX0RCTCkweDBiNTg0ODIyLCAoRklYUF9EQkwpMHgwYjY2YTAwOSwgKEZJWFBfREJMKTB4MGI3NGIxZmQsCisgICAgKEZJWFBfREJMKTB4MGI4MjgwOWQsIChGSVhQX0RCTCkweDBiOTAwZTYxLCAoRklYUF9EQkwpMHgwYjlkNWRhMCwKKyAgICAoRklYUF9EQkwpMHgwYmFhNzA4ZiwgKEZJWFBfREJMKTB4MGJiNzQ5NDksIChGSVhQX0RCTCkweDBiYzNlOWNhLAorICAgIChGSVhQX0RCTCkweDBiZDA1M2Y3LCAoRklYUF9EQkwpMHgwYmRjODk5YiwgKEZJWFBfREJMKTB4MGJlODhjNmIsCisgICAgKEZJWFBfREJMKTB4MGJmNDVlMDksIChGSVhQX0RCTCkweDBjMDAwMDAwLCAoRklYUF9EQkwpMHgwYzBiNzNjYiwKKyAgICAoRklYUF9EQkwpMHgwYzE2YmFkMywgKEZJWFBfREJMKTB4MGMyMWQ2NzEsIChGSVhQX0RCTCkweDBjMmNjN2VlLAorICAgIChGSVhQX0RCTCkweDBjMzc5MDg1LCAoRklYUF9EQkwpMHgwYzQyMzE2MiwgKEZJWFBfREJMKTB4MGM0Y2FiYTgsCisgICAgKEZJWFBfREJMKTB4MGM1NzAwNjksIChGSVhQX0RCTCkweDBjNjEzMGFmLCAoRklYUF9EQkwpMHgwYzZiM2Q3OSwKKyAgICAoRklYUF9EQkwpMHgwYzc1MjdiOSwgKEZJWFBfREJMKTB4MGM3ZWYwNWIsIChGSVhQX0RCTCkweDBjODg5ODNmLAorICAgIChGSVhQX0RCTCkweDBjOTIyMDNkLCAoRklYUF9EQkwpMHgwYzliODkyNiwgKEZJWFBfREJMKTB4MGNhNGQzYzIsCisgICAgKEZJWFBfREJMKTB4MGNhZTAwZDIsIChGSVhQX0RCTCkweDBjYjcxMTBlLCAoRklYUF9EQkwpMHgwY2MwMDUyYiwKKyAgICAoRklYUF9EQkwpMHgwY2M4ZGRkNCwgKEZJWFBfREJMKTB4MGNkMTliYjAsIChGSVhQX0RCTCkweDBjZGEzZjYwLAorICAgIChGSVhQX0RCTCkweDBjZTJjOTdkLCAoRklYUF9EQkwpMHgwY2ViM2E5ZiwgKEZJWFBfREJMKTB4MGNmMzkzNTUsCisgICAgKEZJWFBfREJMKTB4MGNmYmQ0MmIsIChGSVhQX0RCTCkweDBkMDNmZGE5LCAoRklYUF9EQkwpMHgwZDBjMTA1MCwKKyAgICAoRklYUF9EQkwpMHgwZDE0MGNhMCwgKEZJWFBfREJMKTB4MGQxYmYzMTIsIChGSVhQX0RCTCkweDBkMjNjNDFkLAorICAgIChGSVhQX0RCTCkweDBkMmI4MDM0LCAoRklYUF9EQkwpMHgwZDMzMjdjNywgKEZJWFBfREJMKTB4MGQzYWJiNDAsCisgICAgKEZJWFBfREJMKTB4MGQ0MjNiMDgsIChGSVhQX0RCTCkweDBkNDlhNzg1LCAoRklYUF9EQkwpMHgwZDUxMDExOCwKKyAgICAoRklYUF9EQkwpMHgwZDU4NDgyMiwgKEZJWFBfREJMKTB4MGQ1ZjdjZmYsIChGSVhQX0RCTCkweDBkNjZhMDA5LAorICAgIChGSVhQX0RCTCkweDBkNmRiMTk3LCAoRklYUF9EQkwpMHgwZDc0YjFmZCwgKEZJWFBfREJMKTB4MGQ3YmExOTAsCisgICAgKEZJWFBfREJMKTB4MGQ4MjgwOWQsIChGSVhQX0RCTCkweDBkODk0Zjc1LCAoRklYUF9EQkwpMHgwZDkwMGU2MSwKKyAgICAoRklYUF9EQkwpMHgwZDk2YmRhZCwgKEZJWFBfREJMKTB4MGQ5ZDVkYTAsIChGSVhQX0RCTCkweDBkYTNlZTdmLAorICAgIChGSVhQX0RCTCkweDBkYWE3MDhmLCAoRklYUF9EQkwpMHgwZGIwZTQxMiwgKEZJWFBfREJMKTB4MGRiNzQ5NDksCisgICAgKEZJWFBfREJMKTB4MGRiZGEwNzIsIChGSVhQX0RCTCkweDBkYzNlOWNhLCAoRklYUF9EQkwpMHgwZGNhMjU4ZSwKKyAgICAoRklYUF9EQkwpMHgwZGQwNTNmNywgKEZJWFBfREJMKTB4MGRkNjc1M2UsIChGSVhQX0RCTCkweDBkZGM4OTliLAorICAgIChGSVhQX0RCTCkweDBkZTI5MTQzLCAoRklYUF9EQkwpMHgwZGU4OGM2YiwgKEZJWFBfREJMKTB4MGRlZTdiNDcsCisgICAgKEZJWFBfREJMKTB4MGRmNDVlMDksIChGSVhQX0RCTCkweDBkZmEzNGUxLCAoRklYUF9EQkwpMHgwZTAwMDAwMCwKKyAgICAoRklYUF9EQkwpMHgwZTA1YmY5NCwgKEZJWFBfREJMKTB4MGUwYjczY2IsIChGSVhQX0RCTCkweDBlMTExY2QyLAorICAgIChGSVhQX0RCTCkweDBlMTZiYWQzLCAoRklYUF9EQkwpMHgwZTFjNGRmYiwgKEZJWFBfREJMKTB4MGUyMWQ2NzEsCisgICAgKEZJWFBfREJMKTB4MGUyNzU0NjAsIChGSVhQX0RCTCkweDBlMmNjN2VlLCAoRklYUF9EQkwpMHgwZTMyMzE0MywKKyAgICAoRklYUF9EQkwpMHgwZTM3OTA4NSwgKEZJWFBfREJMKTB4MGUzY2U1ZDgsIChGSVhQX0RCTCkweDBlNDIzMTYyLAorICAgIChGSVhQX0RCTCkweDBlNDc3MzQ2LCAoRklYUF9EQkwpMHgwZTRjYWJhOCwgKEZJWFBfREJMKTB4MGU1MWRhYTgsCisgICAgKEZJWFBfREJMKTB4MGU1NzAwNjksIChGSVhQX0RCTCkweDBlNWMxZDBiLCAoRklYUF9EQkwpMHgwZTYxMzBhZiwKKyAgICAoRklYUF9EQkwpMHgwZTY2M2I3NCwgKEZJWFBfREJMKTB4MGU2YjNkNzksIChGSVhQX0RCTCkweDBlNzAzNmRiLAorICAgIChGSVhQX0RCTCkweDBlNzUyN2I5LCAoRklYUF9EQkwpMHgwZTdhMTAzMCwgKEZJWFBfREJMKTB4MGU3ZWYwNWIsCisgICAgKEZJWFBfREJMKTB4MGU4M2M4NTcsIChGSVhQX0RCTCkweDBlODg5ODNmLCAoRklYUF9EQkwpMHgwZThkNjAyZSwKKyAgICAoRklYUF9EQkwpMHgwZTkyMjAzZCwgKEZJWFBfREJMKTB4MGU5NmQ4ODgsIChGSVhQX0RCTCkweDBlOWI4OTI2LAorICAgIChGSVhQX0RCTCkweDBlYTAzMjMyLCAoRklYUF9EQkwpMHgwZWE0ZDNjMiwgKEZJWFBfREJMKTB4MGVhOTZkZjAsCisgICAgKEZJWFBfREJMKTB4MGVhZTAwZDIsIChGSVhQX0RCTCkweDBlYjI4YzdmLCAoRklYUF9EQkwpMHgwZWI3MTEwZSwKKyAgICAoRklYUF9EQkwpMHgwZWJiOGU5NiwgKEZJWFBfREJMKTB4MGVjMDA1MmIsIChGSVhQX0RCTCkweDBlYzQ3NGU0LAorICAgIChGSVhQX0RCTCkweDBlYzhkZGQ0LCAoRklYUF9EQkwpMHgwZWNkNDAxMiwgKEZJWFBfREJMKTB4MGVkMTliYjAsCisgICAgKEZJWFBfREJMKTB4MGVkNWYwYzQsIChGSVhQX0RCTCkweDBlZGEzZjYwLCAoRklYUF9EQkwpMHgwZWRlODc5NywKKyAgICAoRklYUF9EQkwpMHgwZWUyYzk3ZCwgKEZJWFBfREJMKTB4MGVlNzA1MjUsIChGSVhQX0RCTCkweDBlZWIzYTlmLAorICAgIChGSVhQX0RCTCkweDBlZWY2OWZmLCAoRklYUF9EQkwpMHgwZWYzOTM1NSwgKEZJWFBfREJMKTB4MGVmN2I2YjQsCisgICAgKEZJWFBfREJMKTB4MGVmYmQ0MmIsIChGSVhQX0RCTCkweDBlZmZlYmNkLCAoRklYUF9EQkwpMHgwZjAzZmRhOSwKKyAgICAoRklYUF9EQkwpMHgwZjA4MDljZiwgKEZJWFBfREJMKTB4MGYwYzEwNTAsIChGSVhQX0RCTCkweDBmMTAxMTNiLAorICAgIChGSVhQX0RCTCkweDBmMTQwY2EwLCAoRklYUF9EQkwpMHgwZjE4MDI4ZCwgKEZJWFBfREJMKTB4MGYxYmYzMTIsCisgICAgKEZJWFBfREJMKTB4MGYxZmRlM2QsIChGSVhQX0RCTCkweDBmMjNjNDFkLCAoRklYUF9EQkwpMHgwZjI3YTRjMCwKKyAgICAoRklYUF9EQkwpMHgwZjJiODAzNH07CiAKKyNlbHNlCisjZXJyb3IgImxkSW50IHRhYmxlIHNpemUgdG9vIHNtYWxsIgogCi0gIExOS19TRUNUSU9OX0lOSVRDT0RFCi0gIHZvaWQgSW5pdExkSW50KCkKLSAgewotICAgIC8qIG5vdGhpbmcgdG8gZG8hIFVzZSBwcmVpbml0aWFsaXplZCBsb2dhcml0aG0gdGFibGUgKi8KLSAgfQorI2VuZGlmCiAKK0xOS19TRUNUSU9OX0lOSVRDT0RFCit2b2lkIEluaXRMZEludCgpIHsgLyogbm90aGluZyB0byBkbyEgVXNlIHByZWluaXRpYWxpemVkIGxvZ2FyaXRobSB0YWJsZSAqLworfQogCisjaWYgKExEX0lOVF9UQUJfTEVOICE9IDApCiAKIExOS19TRUNUSU9OX0NPREVfTDEKLUZJWFBfREJMIENhbGNMZEludChJTlQgaSkKLXsKK0ZJWFBfREJMIENhbGNMZEludChJTlQgaSkgewogICAvKiBjYWxjdWxhdGVzIGxkKG9wKS9MRF9EQVRBX1NDQUxJTkcgKi8KLSAgLyogb3AgaXMgYXNzdW1lZCB0byBiZSBhbiBpbnRlZ2VyIHZhbHVlIGJldHdlZW4gMSBhbmQgMTkzICovCisgIC8qIG9wIGlzIGFzc3VtZWQgdG8gYmUgYW4gaW50ZWdlciB2YWx1ZSBiZXR3ZWVuIDEgYW5kIExEX0lOVF9UQUJfTEVOICovCiAKLSAgRkRLX0FTU0VSVCgoMTkzPjApICYmICgoRklYUF9EQkwpbGRJbnRDb2VmZlswXT09KEZJWFBfREJMKTB4ODAwMDAwMDEpKTsgLyogdGFiIGhhcyB0byBiZSBpbml0aWFsaXplZCAqLworICBGREtfQVNTRVJUKChMRF9JTlRfVEFCX0xFTiA+IDApICYmCisgICAgICAgICAgICAgKChGSVhQX0RCTClsZEludENvZWZmWzBdID09CisgICAgICAgICAgICAgIChGSVhQX0RCTCkweDgwMDAwMDAxKSk7IC8qIHRhYiBoYXMgdG8gYmUgaW5pdGlhbGl6ZWQgKi8KIAotICBpZiAoKGk+MCkmJihpPDE5MykpCisgIGlmICgoaSA+IDApICYmIChpIDwgTERfSU5UX1RBQl9MRU4pKQogICAgIHJldHVybiBsZEludENvZWZmW2ldOwotICBlbHNlCi0gIHsKKyAgZWxzZSB7CiAgICAgcmV0dXJuICgwKTsKICAgfQogfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgZnVuY3Rpb25uYW1lOiBpbnZTcXJ0Tm9ybTIKLSAgICBkZXNjcmlwdGlvbjogIGRlbGl2ZXJzIDEvc3FydChvcCkgbm9ybWFsaXplZCB0byAuNS4uLjEgYW5kIHRoZSBzaGlmdCB2YWx1ZSBvZiB0aGUgT1VUUFVUCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBTUVJUX0JJVFMgICAgICAgICAgIDcKLSNkZWZpbmUgU1FSVF9WQUxVRVMgICAgICAgMTI4Ci0jZGVmaW5lIFNRUlRfQklUU19NQVNLICAgMHg3ZgotCi1MTktfU0VDVElPTl9DT05TVERBVEFfTDEKLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBpbnZTcXJ0VGFiW1NRUlRfVkFMVUVTXSA9IHsKLSAgMHg1YTgyNzk5OSwgMHg1YTI4N2UwMywgMHg1OWNmOGNiYiwgMHg1OTc3YTBhYiwgMHg1OTIwYjRkZSwgMHg1OGNhYzQ4MCwgMHg1ODc1Y2FkZSwgMHg1ODIxYzM2NCwKLSAgMHg1N2NlYTk5YywgMHg1NzdjNzkyZiwgMHg1NzJiMmRkZiwgMHg1NmRhYzM4ZCwgMHg1NjhiMzYzMSwgMHg1NjNjODFkZiwgMHg1NWVlYTJjMywgMHg1NWExOTUyMSwKLSAgMHg1NTU1NTU1NSwgMHg1NTA5ZGZkMCwgMHg1NGJmMzExYSwgMHg1NDc1NDVkMCwgMHg1NDJjMWFhMywgMHg1M2UzYWM1YSwgMHg1MzliZjdjYywgMHg1MzU0ZjllNiwKLSAgMHg1MzBlYWZhNCwgMHg1MmM5MTYxNywgMHg1Mjg0MmE1ZSwgMHg1MjNmZTlhYiwgMHg1MWZjNTEzZiwgMHg1MWI5NWU2YiwgMHg1MTc3MGU4ZSwgMHg1MTM1NWYxOSwKLSAgMHg1MGY0NGQ4OCwgMHg1MGIzZDc2OCwgMHg1MDczZmE0ZiwgMHg1MDM0YjNlNiwgMHg0ZmY2MDFkZiwgMHg0ZmI3ZTFmOSwgMHg0ZjdhNTIwMSwgMHg0ZjNkNGZjZSwKLSAgMHg0ZjAwZDk0MywgMHg0ZWM0ZWM0ZSwgMHg0ZTg5ODZlOSwgMHg0ZTRlYTcxOCwgMHg0ZTE0NGFlOCwgMHg0ZGRhNzA3MiwgMHg0ZGExMTVkOSwgMHg0ZDY4Mzk0OCwKLSAgMHg0ZDJmZDhmNCwgMHg0Y2Y3ZjMxYiwgMHg0Y2MwODYwNCwgMHg0Yzg5OGZmZiwgMHg0YzUzMGY2NCwgMHg0YzFkMDI5MywgMHg0YmU3NjdmNSwgMHg0YmIyM2RmOSwKLSAgMHg0YjdkODMxNywgMHg0YjQ5MzVjZSwgMHg0YjE1NTRhNiwgMHg0YWUxZGUyYSwgMHg0YWFlZDBmMCwgMHg0YTdjMmI5MiwgMHg0YTQ5ZWNiMywgMHg0YTE4MTJmYSwKLSAgMHg0OWU2OWQxNiwgMHg0OWI1ODliYiwgMHg0OTg0ZDdhNCwgMHg0OTU0ODU5MSwgMHg0OTI0OTI0OSwgMHg0OGY0ZmM5NiwgMHg0OGM1YzM0YSwgMHg0ODk2ZTUzYywKLSAgMHg0ODY4NjE0NywgMHg0ODNhMzY0YywgMHg0ODBjNjMzMSwgMHg0N2RlZTZlMCwgMHg0N2IxYzA0OSwgMHg0Nzg0ZWU1ZiwgMHg0NzU4NzAxYywgMHg0NzJjNDQ3YywKLSAgMHg0NzAwNmE4MCwgMHg0NmQ0ZTEzMCwgMHg0NmE5YTc5MywgMHg0NjdlYmNiOSwgMHg0NjU0MWZiMywgMHg0NjI5Y2Y5OCwgMHg0NWZmY2I4MCwgMHg0NWQ2MTI4OSwKLSAgMHg0NWFjYTNkNSwgMHg0NTgzN2U4OCwgMHg0NTVhYTFjYSwgMHg0NTMyMGNjOCwgMHg0NTA5YmViMCwgMHg0NGUxYjZiNCwgMHg0NGI5ZjQwYiwgMHg0NDkyNzVlYywKLSAgMHg0NDZiM2I5NSwgMHg0NDQ0NDQ0NCwgMHg0NDFkOGYzYiwgMHg0M2Y3MWJiZSwgMHg0M2QwZTkxNywgMHg0M2FhZjY4ZSwgMHg0Mzg1NDM3MywgMHg0MzVmY2YxNCwKLSAgMHg0MzNhOThjNSwgMHg0MzE1OWZkYiwgMHg0MmYwZTNhZSwgMHg0MmNjNjM5NywgMHg0MmE4MWVmNSwgMHg0Mjg0MTUyNywgMHg0MjYwNDU4ZCwgMHg0MjNjYWY4YywKLSAgMHg0MjE5NTI4YiwgMHg0MWY2MmRmMSwgMHg0MWQzNDEyYSwgMHg0MWIwOGJhMSwgMHg0MThlMGNjNywgMHg0MTZiYzQwZCwgMHg0MTQ5YjBlNCwgMHg0MTI3ZDJjMywKLSAgMHg0MTA2MjkyMCwgMHg0MGU0YjM3NCwgMHg0MGMzNzEzYSwgMHg0MGEyNjFlZiwgMHg0MDgxODUxMSwgMHg0MDYwZGEyMSwgMHg0MDQwNjBhMSwgMHg0MDIwMTgxNAotfTsKLQotTE5LX1NFQ1RJT05fSU5JVENPREUKLXZvaWQgSW5pdEludlNxcnRUYWIoKQotewotICAvKiBub3RoaW5nIHRvIGRvICEKLSAgICAgdXNlIHByZWluaXRpYWxpemVkIHNxdWFyZSByb290IHRhYmxlCi0gICovCi19Ci0KLQotCi0jaWYgIWRlZmluZWQoRlVOQ1RJT05faW52U3FydE5vcm0yKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gIGRlbGl2ZXJzIDEvc3FydChvcCkgbm9ybWFsaXplZCB0byAuNS4uLjEgYW5kIHRoZSBzaGlmdCB2YWx1ZSBvZiB0aGUgT1VUUFVULAotICBpLmUuIHRoZSBkZW5vcm1hbGl6ZWQgcmVzdWx0IGlzIDEvc3FydChvcCkgPSBpbnZTcXJ0Tm9ybShvcCkgKiAyXihzaGlmdCkKLSAgdXNlcyBOZXd0b24taXRlcmF0aW9uIGZvciBhcHByb3hpbWF0aW9uCi0gICAgICBRKG4rMSkgPSBRKG4pICsgUShuKSAqICgwLjUgLSAyICogViAqIFEobileMikKLSAgICAgIHdpdGggUSA9IDAuNSogViBeLTAuNTsgMC41IDw9IFYgPCAxLjAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotRklYUF9EQkwgaW52U3FydE5vcm0yKEZJWFBfREJMIG9wLCBJTlQgKnNoaWZ0KQotewotCi0gIEZJWFBfREJMIHZhbCA9IG9wIDsKLSAgRklYUF9EQkwgcmVnMSwgcmVnMiwgcmVndG1wIDsKLQotICBpZiAodmFsID09IEZMMkZYQ09OU1RfREJMKDAuMCkpIHsKLSAgICAqc2hpZnQgPSAxIDsKLSAgICByZXR1cm4oKExPTkcpMSk7ICAvKiBtaW5pbXVtIHBvc2l0aXZlIHZhbHVlICovCi0gIH0KLQotCi0gIC8qIG5vcm1hbGl6ZSBpbnB1dCwgY2FsY3VsYXRlIHNoaWZ0IHZhbHVlICovCi0gIEZES19BU1NFUlQodmFsID4gRkwyRlhDT05TVF9EQkwoMC4wKSk7Ci0gICpzaGlmdCA9IGZOb3Jteih2YWwpIC0gMTsgIC8qIENvdW50TGVhZGluZ0JpdHMoKSBpcyBub3QgbmVjZXNzYXJ5IGhlcmUgc2luY2UgdGVzdCB2YWx1ZSBpcyBhbHdheXMgPiAwICovCi0gIHZhbCA8PD0qc2hpZnQgOyAgLyogbm9ybWFsaXplZCBpbnB1dCBWICovCi0gICpzaGlmdCs9MiA7ICAgICAgLyogYmlhcyBmb3IgZXhwb25lbnQgKi8KLQotICAvKiBOZXd0b24gaXRlcmF0aW9uIG9mIDEvc3FydChWKSAqLwotICByZWcxID0gaW52U3FydFRhYlsgKElOVCkodmFsPj4oREZSQUNUX0JJVFMtMS0oU1FSVF9CSVRTKzEpKSkgJiBTUVJUX0JJVFNfTUFTSyBdOwotICByZWcyID0gRkwyRlhDT05TVF9EQkwoMC4wNjI1Zik7ICAgLyogMC41ID4+IDMgKi8KLQotICByZWd0bXA9IGZQb3cyRGl2MihyZWcxKTsgICAgICAgICAgICAgIC8qIGEgPSBRXjIgKi8KLSAgcmVndG1wPSByZWcyIC0gZk11bHREaXYyKHJlZ3RtcCwgdmFsKTsgICAgICAvKiBiID0gMC41IC0gMiAqIFYgKiBRXjIgKi8KLSAgcmVnMSArPSAoZk11bHREaXYyKHJlZ3RtcCwgcmVnMSk8PDQpOyAgICAgICAvKiBRID0gUSArIFEqYiAqLwotCi0gIC8qIGNhbGN1bGF0ZSB0aGUgb3V0cHV0IGV4cG9uZW50ID0gaW5wdXQgZXhwLzIgKi8KLSAgaWYgKCpzaGlmdCAmIDB4MDAwMDAwMDEpIHsgLyogb2RkIHNoaWZ0IHZhbHVlcyA/ICovCi0gICAgcmVnMiA9IEZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTQ3NTI0NDAwODQ0MzYyMTA0ODQ5Zik7IC8qIDEvc3FydCgyKTsgKi8KLSAgICByZWcxID0gZk11bHREaXYyKHJlZzEsIHJlZzIpIDw8IDI7Ci0gIH0KLQotICAqc2hpZnQgPSAqc2hpZnQ+PjE7Ci0KLSAgcmV0dXJuKHJlZzEpOwotfQotI2VuZGlmIC8qICFkZWZpbmVkKEZVTkNUSU9OX2ludlNxcnROb3JtMikgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBmdW5jdGlvbm5hbWU6IHNxcnRGaXhwCi0gICAgZGVzY3JpcHRpb246ICBkZWxpdmVycyBzcXJ0KG9wKQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUZJWFBfREJMIHNxcnRGaXhwKEZJWFBfREJMIG9wKQotewotICBJTlQgdG1wX2V4cCA9IDA7Ci0gIEZJWFBfREJMIHRtcF9pbnYgPSBpbnZTcXJ0Tm9ybTIob3AsICZ0bXBfZXhwKTsKLQotICBGREtfQVNTRVJUKHRtcF9leHAgPiAwKSA7Ci0gIHJldHVybiggKEZJWFBfREJMKSAoIGZNdWx0RGl2MiggKG9wPDwodG1wX2V4cC0xKSksIHRtcF9pbnYgKSA8PCAyICkpOwotfQotCisjZW5kaWYgLyogKExEX0lOVF9UQUJfTEVOIT0wKSAgKi8KIAogI2lmICFkZWZpbmVkKEZVTkNUSU9OX3NjaHVyX2RpdikKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDg1LDI4MSArMzk5LDMwNCBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorRklYUF9EQkwgc2NodXJfZGl2KEZJWFBfREJMIG51bSwgRklYUF9EQkwgZGVudW0sIElOVCBjb3VudCkgeworICBJTlQgTF9udW0gPSAoTE9ORyludW0gPj4gMTsKKyAgSU5UIExfZGVudW0gPSAoTE9ORylkZW51bSA+PiAxOworICBJTlQgZGl2ID0gMDsKKyAgSU5UIGsgPSBjb3VudDsKIAotRklYUF9EQkwgc2NodXJfZGl2KEZJWFBfREJMIG51bSwgRklYUF9EQkwgZGVudW0sIElOVCBjb3VudCkKLXsKLSAgICBJTlQgTF9udW0gICA9IChMT05HKW51bT4+MTsKLSAgICBJTlQgTF9kZW51bSA9IChMT05HKWRlbnVtPj4xOwotICAgIElOVCBkaXYgICAgID0gMDsKLSAgICBJTlQgayAgICAgICA9IGNvdW50OworICBGREtfQVNTRVJUKG51bSA+PSAoRklYUF9EQkwpMCk7CisgIEZES19BU1NFUlQoZGVudW0gPiAoRklYUF9EQkwpMCk7CisgIEZES19BU1NFUlQobnVtIDw9IGRlbnVtKTsKIAotICAgIEZES19BU1NFUlQgKG51bT49KEZJWFBfREJMKTApOwotICAgIEZES19BU1NFUlQgKGRlbnVtPihGSVhQX0RCTCkwKTsKLSAgICBGREtfQVNTRVJUIChudW0gPD0gZGVudW0pOwotCi0gICAgaWYgKExfbnVtICE9IDApCi0gICAgICAgIHdoaWxlICgtLWspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRpdiAgIDw8PSAxOwotICAgICAgICAgICAgTF9udW0gPDw9IDE7Ci0gICAgICAgICAgICBpZiAoTF9udW0gPj0gTF9kZW51bSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMX251bSAtPSBMX2RlbnVtOwotICAgICAgICAgICAgICAgIGRpdisrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgcmV0dXJuIChGSVhQX0RCTCkoZGl2IDw8IChERlJBQ1RfQklUUyAtIGNvdW50KSk7CisgIGlmIChMX251bSAhPSAwKQorICAgIHdoaWxlICgtLWspIHsKKyAgICAgIGRpdiA8PD0gMTsKKyAgICAgIExfbnVtIDw8PSAxOworICAgICAgaWYgKExfbnVtID49IExfZGVudW0pIHsKKyAgICAgICAgTF9udW0gLT0gTF9kZW51bTsKKyAgICAgICAgZGl2Kys7CisgICAgICB9CisgICAgfQorICByZXR1cm4gKEZJWFBfREJMKShkaXYgPDwgKERGUkFDVF9CSVRTIC0gY291bnQpKTsKIH0KIAotCiAjZW5kaWYgLyogIWRlZmluZWQoRlVOQ1RJT05fc2NodXJfZGl2KSAqLwogCi0KICNpZm5kZWYgRlVOQ1RJT05fZk11bHROb3JtCi1GSVhQX0RCTCBmTXVsdE5vcm0oRklYUF9EQkwgZjEsIEZJWFBfREJMIGYyLCBJTlQgKnJlc3VsdF9lKQotewotICAgIElOVCAgICBwcm9kdWN0ID0gMDsKLSAgICBJTlQgICAgbm9ybV9mMSwgbm9ybV9mMjsKK0ZJWFBfREJMIGZNdWx0Tm9ybShGSVhQX0RCTCBmMSwgRklYUF9EQkwgZjIsIElOVCAqcmVzdWx0X2UpIHsKKyAgSU5UIHByb2R1Y3QgPSAwOworICBJTlQgbm9ybV9mMSwgbm9ybV9mMjsKIAotICAgIGlmICggIChmMSA9PSAoRklYUF9EQkwpMCkgfHwgKGYyID09IChGSVhQX0RCTCkwKSApIHsKLSAgICAgICAgKnJlc3VsdF9lID0gMDsKLSAgICAgICAgcmV0dXJuIChGSVhQX0RCTCkwOwotICAgIH0KLSAgICBub3JtX2YxID0gQ291bnRMZWFkaW5nQml0cyhmMSk7Ci0gICAgZjEgPSBmMSA8PCBub3JtX2YxOwotICAgIG5vcm1fZjIgPSBDb3VudExlYWRpbmdCaXRzKGYyKTsKLSAgICBmMiA9IGYyIDw8IG5vcm1fZjI7CisgIGlmICgoZjEgPT0gKEZJWFBfREJMKTApIHx8IChmMiA9PSAoRklYUF9EQkwpMCkpIHsKKyAgICAqcmVzdWx0X2UgPSAwOworICAgIHJldHVybiAoRklYUF9EQkwpMDsKKyAgfQorICBub3JtX2YxID0gQ291bnRMZWFkaW5nQml0cyhmMSk7CisgIGYxID0gZjEgPDwgbm9ybV9mMTsKKyAgbm9ybV9mMiA9IENvdW50TGVhZGluZ0JpdHMoZjIpOworICBmMiA9IGYyIDw8IG5vcm1fZjI7CiAKKyAgaWYgKChmMSA9PSAoRklYUF9EQkwpTUlOVkFMX0RCTCkgJiYgKGYyID09IChGSVhQX0RCTClNSU5WQUxfREJMKSkgeworICAgIHByb2R1Y3QgPSAtKChGSVhQX0RCTClNSU5WQUxfREJMID4+IDEpOworICAgICpyZXN1bHRfZSA9IC0obm9ybV9mMSArIG5vcm1fZjIgLSAxKTsKKyAgfSBlbHNlIHsKICAgICBwcm9kdWN0ID0gZk11bHQoZjEsIGYyKTsKLSAgICAqcmVzdWx0X2UgID0gLSAobm9ybV9mMSArIG5vcm1fZjIpOworICAgICpyZXN1bHRfZSA9IC0obm9ybV9mMSArIG5vcm1fZjIpOworICB9CiAKLSAgICByZXR1cm4gKEZJWFBfREJMKXByb2R1Y3Q7CisgIHJldHVybiAoRklYUF9EQkwpcHJvZHVjdDsKIH0KICNlbmRpZgogCiAjaWZuZGVmIEZVTkNUSU9OX2ZEaXZOb3JtCi1GSVhQX0RCTCBmRGl2Tm9ybShGSVhQX0RCTCBMX251bSwgRklYUF9EQkwgTF9kZW51bSwgSU5UICpyZXN1bHRfZSkKLXsKLSAgICBGSVhQX0RCTCBkaXY7Ci0gICAgSU5UIG5vcm1fbnVtLCBub3JtX2RlbjsKK0ZJWFBfREJMIGZEaXZOb3JtKEZJWFBfREJMIExfbnVtLCBGSVhQX0RCTCBMX2RlbnVtLCBJTlQgKnJlc3VsdF9lKSB7CisgIEZJWFBfREJMIGRpdjsKKyAgSU5UIG5vcm1fbnVtLCBub3JtX2RlbjsKIAotICAgIEZES19BU1NFUlQgKExfbnVtICAgPj0gKEZJWFBfREJMKTApOwotICAgIEZES19BU1NFUlQgKExfZGVudW0gPiAgKEZJWFBfREJMKTApOworICBGREtfQVNTRVJUKExfbnVtID49IChGSVhQX0RCTCkwKTsKKyAgRkRLX0FTU0VSVChMX2RlbnVtID4gKEZJWFBfREJMKTApOwogCi0gICAgaWYoTF9udW0gPT0gKEZJWFBfREJMKTApCi0gICAgewotICAgICAgICAqcmVzdWx0X2UgPSAwOwotICAgICAgICByZXR1cm4gKChGSVhQX0RCTCkwKTsKLSAgICB9CisgIGlmIChMX251bSA9PSAoRklYUF9EQkwpMCkgeworICAgICpyZXN1bHRfZSA9IDA7CisgICAgcmV0dXJuICgoRklYUF9EQkwpMCk7CisgIH0KIAotICAgIG5vcm1fbnVtID0gQ291bnRMZWFkaW5nQml0cyhMX251bSk7Ci0gICAgTF9udW0gPSBMX251bSA8PCBub3JtX251bTsKLSAgICBMX251bSA9IExfbnVtID4+IDE7Ci0gICAgKnJlc3VsdF9lID0gLSBub3JtX251bSArIDE7CisgIG5vcm1fbnVtID0gQ291bnRMZWFkaW5nQml0cyhMX251bSk7CisgIExfbnVtID0gTF9udW0gPDwgbm9ybV9udW07CisgIExfbnVtID0gTF9udW0gPj4gMTsKKyAgKnJlc3VsdF9lID0gLW5vcm1fbnVtICsgMTsKIAotICAgIG5vcm1fZGVuID0gQ291bnRMZWFkaW5nQml0cyhMX2RlbnVtKTsKLSAgICBMX2RlbnVtID0gTF9kZW51bSA8PCBub3JtX2RlbjsKLSAgICAqcmVzdWx0X2UgLT0gLSBub3JtX2RlbjsKKyAgbm9ybV9kZW4gPSBDb3VudExlYWRpbmdCaXRzKExfZGVudW0pOworICBMX2RlbnVtID0gTF9kZW51bSA8PCBub3JtX2RlbjsKKyAgKnJlc3VsdF9lIC09IC1ub3JtX2RlbjsKIAotICAgIGRpdiA9IHNjaHVyX2RpdihMX251bSwgTF9kZW51bSwgRlJBQ1RfQklUUyk7CisgIGRpdiA9IHNjaHVyX2RpdihMX251bSwgTF9kZW51bSwgRlJBQ1RfQklUUyk7CiAKLSAgICByZXR1cm4gZGl2OworICByZXR1cm4gZGl2OwogfQogI2VuZGlmIC8qICFGVU5DVElPTl9mRGl2Tm9ybSAqLwogCiAjaWZuZGVmIEZVTkNUSU9OX2ZEaXZOb3JtCi1GSVhQX0RCTCBmRGl2Tm9ybShGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbm9tKQotewotICAgIElOVCBlOwotICAgIEZJWFBfREJMIHJlczsKK0ZJWFBfREJMIGZEaXZOb3JtKEZJWFBfREJMIG51bSwgRklYUF9EQkwgZGVub20pIHsKKyAgSU5UIGU7CisgIEZJWFBfREJMIHJlczsKIAotICAgIEZES19BU1NFUlQgKGRlbm9tID49IG51bSk7CisgIEZES19BU1NFUlQoZGVub20gPj0gbnVtKTsKIAotICAgIHJlcyA9IGZEaXZOb3JtKG51bSwgZGVub20sICZlKTsKKyAgcmVzID0gZkRpdk5vcm0obnVtLCBkZW5vbSwgJmUpOwogCi0gICAgLyogQXZvaWQgb3ZlcmZsb3cgc2luY2Ugd2UgbXVzdCBvdXRwdXQgYSB2YWx1ZSB3aXRoIGV4cG9uZW50IDAKLSAgICAgICB0aGVyZSBpcyBubyBvdGhlciBjaG9pY2UgdGhhbiBzYXR1cmF0aW5nIHRvIGFsbW9zdCAxLjBmICovCi0gICAgaWYocmVzID09IChGSVhQX0RCTCkoMTw8KERGUkFDVF9CSVRTLTIpKSAmJiBlID09IDEpCi0gICAgewotICAgICAgICByZXMgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmVzID0gc2NhbGVWYWx1ZShyZXMsIGUpOwotICAgIH0KKyAgLyogQXZvaWQgb3ZlcmZsb3cgc2luY2Ugd2UgbXVzdCBvdXRwdXQgYSB2YWx1ZSB3aXRoIGV4cG9uZW50IDAKKyAgICAgdGhlcmUgaXMgbm8gb3RoZXIgY2hvaWNlIHRoYW4gc2F0dXJhdGluZyB0byBhbG1vc3QgMS4wZiAqLworICBpZiAocmVzID09IChGSVhQX0RCTCkoMSA8PCAoREZSQUNUX0JJVFMgLSAyKSkgJiYgZSA9PSAxKSB7CisgICAgcmVzID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CisgIH0gZWxzZSB7CisgICAgcmVzID0gc2NhbGVWYWx1ZShyZXMsIGUpOworICB9CiAKLSAgICByZXR1cm4gcmVzOworICByZXR1cm4gcmVzOwogfQogI2VuZGlmIC8qICFGVU5DVElPTl9mRGl2Tm9ybSAqLwogCi0jaWZuZGVmIEZVTkNUSU9OX2ZEaXZOb3JtSGlnaFByZWMKLUZJWFBfREJMIGZEaXZOb3JtSGlnaFByZWMoRklYUF9EQkwgbnVtLCBGSVhQX0RCTCBkZW5vbSwgSU5UICpyZXN1bHRfZSkKLXsKLSAgICBGSVhQX0RCTCBkaXY7Ci0gICAgSU5UIG5vcm1fbnVtLCBub3JtX2RlbjsKKyNpZm5kZWYgRlVOQ1RJT05fZkRpdk5vcm1TaWduZWQKK0ZJWFBfREJMIGZEaXZOb3JtU2lnbmVkKEZJWFBfREJMIG51bSwgRklYUF9EQkwgZGVub20pIHsKKyAgSU5UIGU7CisgIEZJWFBfREJMIHJlczsKKyAgaW50IHNpZ247CiAKLSAgICBGREtfQVNTRVJUIChudW0gICA+PSAoRklYUF9EQkwpMCk7Ci0gICAgRkRLX0FTU0VSVCAoZGVub20gPiAgKEZJWFBfREJMKTApOworICBpZiAoZGVub20gPT0gKEZJWFBfREJMKTApIHsKKyAgICByZXR1cm4gKEZJWFBfREJMKU1BWFZBTF9EQkw7CisgIH0KIAotICAgIGlmKG51bSA9PSAoRklYUF9EQkwpMCkKLSAgICB7Ci0gICAgICAgICpyZXN1bHRfZSA9IDA7Ci0gICAgICAgIHJldHVybiAoKEZJWFBfREJMKTApOworICBzaWduID0gKChudW0gPj0gKEZJWFBfREJMKTApICE9IChkZW5vbSA+PSAoRklYUF9EQkwpMCkpOworICByZXMgPSBmRGl2Tm9ybVNpZ25lZChudW0sIGRlbm9tLCAmZSk7CisKKyAgLyogU2F0dXJhdGUgc2luY2Ugd2UgbXVzdCBvdXRwdXQgYSB2YWx1ZSB3aXRoIGV4cG9uZW50IDAgKi8KKyAgaWYgKChlID4gMCkgJiYgKGZBYnMocmVzKSA+PSBGTDJGWENPTlNUX0RCTCgwLjUpKSkgeworICAgIGlmIChzaWduKSB7CisgICAgICByZXMgPSAoRklYUF9EQkwpTUlOVkFMX0RCTDsKKyAgICB9IGVsc2UgeworICAgICAgcmVzID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CiAgICAgfQorICB9IGVsc2UgeworICAgIHJlcyA9IHNjYWxlVmFsdWUocmVzLCBlKTsKKyAgfQogCi0gICAgbm9ybV9udW0gPSBDb3VudExlYWRpbmdCaXRzKG51bSk7Ci0gICAgbnVtID0gbnVtIDw8IG5vcm1fbnVtOwotICAgIG51bSA9IG51bSA+PiAxOwotICAgICpyZXN1bHRfZSA9IC0gbm9ybV9udW0gKyAxOworICByZXR1cm4gcmVzOworfQorRklYUF9EQkwgZkRpdk5vcm1TaWduZWQoRklYUF9EQkwgTF9udW0sIEZJWFBfREJMIExfZGVudW0sIElOVCAqcmVzdWx0X2UpIHsKKyAgRklYUF9EQkwgZGl2OworICBJTlQgbm9ybV9udW0sIG5vcm1fZGVuOworICBpbnQgc2lnbjsKIAotICAgIG5vcm1fZGVuID0gQ291bnRMZWFkaW5nQml0cyhkZW5vbSk7Ci0gICAgZGVub20gPSBkZW5vbSA8PCBub3JtX2RlbjsKLSAgICAqcmVzdWx0X2UgLT0gIC0gbm9ybV9kZW47CisgIHNpZ24gPSAoKExfbnVtID49IChGSVhQX0RCTCkwKSAhPSAoTF9kZW51bSA+PSAoRklYUF9EQkwpMCkpOwogCi0gICAgZGl2ID0gc2NodXJfZGl2KG51bSwgZGVub20sIDMxKTsKLSAgICByZXR1cm4gZGl2OworICBpZiAoTF9udW0gPT0gKEZJWFBfREJMKTApIHsKKyAgICAqcmVzdWx0X2UgPSAwOworICAgIHJldHVybiAoKEZJWFBfREJMKTApOworICB9CisgIGlmIChMX2RlbnVtID09IChGSVhQX0RCTCkwKSB7CisgICAgKnJlc3VsdF9lID0gMTQ7CisgICAgcmV0dXJuICgoRklYUF9EQkwpTUFYVkFMX0RCTCk7CisgIH0KKworICBub3JtX251bSA9IENvdW50TGVhZGluZ0JpdHMoTF9udW0pOworICBMX251bSA9IExfbnVtIDw8IG5vcm1fbnVtOworICBMX251bSA9IExfbnVtID4+IDI7CisgIExfbnVtID0gZkFicyhMX251bSk7CisgICpyZXN1bHRfZSA9IC1ub3JtX251bSArIDE7CisKKyAgbm9ybV9kZW4gPSBDb3VudExlYWRpbmdCaXRzKExfZGVudW0pOworICBMX2RlbnVtID0gTF9kZW51bSA8PCBub3JtX2RlbjsKKyAgTF9kZW51bSA9IExfZGVudW0gPj4gMTsKKyAgTF9kZW51bSA9IGZBYnMoTF9kZW51bSk7CisgICpyZXN1bHRfZSAtPSAtbm9ybV9kZW47CisKKyAgZGl2ID0gc2NodXJfZGl2KExfbnVtLCBMX2RlbnVtLCBGUkFDVF9CSVRTKTsKKworICBpZiAoc2lnbikgeworICAgIGRpdiA9IC1kaXY7CisgIH0KKworICByZXR1cm4gZGl2OworfQorI2VuZGlmIC8qIEZVTkNUSU9OX2ZEaXZOb3JtU2lnbmVkICovCisKKyNpZm5kZWYgRlVOQ1RJT05fZkRpdk5vcm1IaWdoUHJlYworRklYUF9EQkwgZkRpdk5vcm1IaWdoUHJlYyhGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbm9tLCBJTlQgKnJlc3VsdF9lKSB7CisgIEZJWFBfREJMIGRpdjsKKyAgSU5UIG5vcm1fbnVtLCBub3JtX2RlbjsKKworICBGREtfQVNTRVJUKG51bSA+PSAoRklYUF9EQkwpMCk7CisgIEZES19BU1NFUlQoZGVub20gPiAoRklYUF9EQkwpMCk7CisKKyAgaWYgKG51bSA9PSAoRklYUF9EQkwpMCkgeworICAgICpyZXN1bHRfZSA9IDA7CisgICAgcmV0dXJuICgoRklYUF9EQkwpMCk7CisgIH0KKworICBub3JtX251bSA9IENvdW50TGVhZGluZ0JpdHMobnVtKTsKKyAgbnVtID0gbnVtIDw8IG5vcm1fbnVtOworICBudW0gPSBudW0gPj4gMTsKKyAgKnJlc3VsdF9lID0gLW5vcm1fbnVtICsgMTsKKworICBub3JtX2RlbiA9IENvdW50TGVhZGluZ0JpdHMoZGVub20pOworICBkZW5vbSA9IGRlbm9tIDw8IG5vcm1fZGVuOworICAqcmVzdWx0X2UgLT0gLW5vcm1fZGVuOworCisgIGRpdiA9IHNjaHVyX2RpdihudW0sIGRlbm9tLCAzMSk7CisgIHJldHVybiBkaXY7CiB9CiAjZW5kaWYgLyogIUZVTkNUSU9OX2ZEaXZOb3JtSGlnaFByZWMgKi8KIAotCi0KLUZJWFBfREJMIENhbGNMb2cyKEZJWFBfREJMIGJhc2VfbSwgSU5UIGJhc2VfZSwgSU5UICpyZXN1bHRfZSkKLXsKLSAgcmV0dXJuIGZMb2cyKGJhc2VfbSwgYmFzZV9lLCByZXN1bHRfZSk7Ci19Ci0KLUZJWFBfREJMIGYyUG93KAotICAgICAgICBjb25zdCBGSVhQX0RCTCBleHBfbSwgY29uc3QgSU5UIGV4cF9lLAotICAgICAgICBJTlQgKnJlc3VsdF9lCi0gICAgICAgICkKLXsKKyNpZm5kZWYgRlVOQ1RJT05fZlBvdworRklYUF9EQkwgZjJQb3coY29uc3QgRklYUF9EQkwgZXhwX20sIGNvbnN0IElOVCBleHBfZSwgSU5UICpyZXN1bHRfZSkgewogICBGSVhQX0RCTCBmcmFjX3BhcnQsIHJlc3VsdF9tOwogICBJTlQgaW50X3BhcnQ7CiAKLSAgaWYgKGV4cF9lID4gMCkKLSAgewotICAgICAgSU5UIGV4cF9iaXRzID0gREZSQUNUX0JJVFMtMSAtIGV4cF9lOwotICAgICAgaW50X3BhcnQgPSBleHBfbSA+PiBleHBfYml0czsKLSAgICAgIGZyYWNfcGFydCA9IGV4cF9tIC0gKEZJWFBfREJMKShpbnRfcGFydCA8PCBleHBfYml0cyk7Ci0gICAgICBmcmFjX3BhcnQgPSBmcmFjX3BhcnQgPDwgZXhwX2U7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgICBpbnRfcGFydCA9IDA7Ci0gICAgICBmcmFjX3BhcnQgPSBleHBfbSA+PiAtZXhwX2U7CisgIGlmIChleHBfZSA+IDApIHsKKyAgICBJTlQgZXhwX2JpdHMgPSBERlJBQ1RfQklUUyAtIDEgLSBleHBfZTsKKyAgICBpbnRfcGFydCA9IGV4cF9tID4+IGV4cF9iaXRzOworICAgIGZyYWNfcGFydCA9IGV4cF9tIC0gKEZJWFBfREJMKShpbnRfcGFydCA8PCBleHBfYml0cyk7CisgICAgZnJhY19wYXJ0ID0gZnJhY19wYXJ0IDw8IGV4cF9lOworICB9IGVsc2UgeworICAgIGludF9wYXJ0ID0gMDsKKyAgICBmcmFjX3BhcnQgPSBleHBfbSA+PiAtZXhwX2U7CiAgIH0KIAogICAvKiBCZXN0IGFjY3VyYWN5IGlzIGFyb3VuZCAwLCBzbyB0cnkgdG8gZ2V0IHRoZXJlIHdpdGggdGhlIGZyYWN0aW9uYWwgcGFydC4gKi8KLSAgaWYoIGZyYWNfcGFydCA+IEZMMkZYQ09OU1RfREJMKDAuNWYpICkKLSAgewotICAgICAgaW50X3BhcnQgPSBpbnRfcGFydCArIDE7Ci0gICAgICBmcmFjX3BhcnQgPSBmcmFjX3BhcnQgKyBGTDJGWENPTlNUX0RCTCgtMS4wZik7CisgIGlmIChmcmFjX3BhcnQgPiBGTDJGWENPTlNUX0RCTCgwLjVmKSkgeworICAgIGludF9wYXJ0ID0gaW50X3BhcnQgKyAxOworICAgIGZyYWNfcGFydCA9IGZyYWNfcGFydCArIEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKICAgfQotICBpZiggZnJhY19wYXJ0IDwgRkwyRlhDT05TVF9EQkwoLTAuNWYpICkKLSAgewotICAgICAgaW50X3BhcnQgPSBpbnRfcGFydCAtIDE7Ci0gICAgICBmcmFjX3BhcnQgPSAtKEZMMkZYQ09OU1RfREJMKC0xLjBmKSAtIGZyYWNfcGFydCk7CisgIGlmIChmcmFjX3BhcnQgPCBGTDJGWENPTlNUX0RCTCgtMC41ZikpIHsKKyAgICBpbnRfcGFydCA9IGludF9wYXJ0IC0gMTsKKyAgICBmcmFjX3BhcnQgPSAtKEZMMkZYQ09OU1RfREJMKC0xLjBmKSAtIGZyYWNfcGFydCk7CiAgIH0KIAorICAvKiAiKyAxIiBjb21wZW5zYXRlcyBmTXVsdEFkZERpdjIoKSBvZiB0aGUgcG9seW5vbWlhbCBldmFsdWF0aW9uIGJlbG93LiAqLworICAqcmVzdWx0X2UgPSBpbnRfcGFydCArIDE7CisKICAgLyogRXZhbHVhdGUgdGF5bG9yIHBvbHlub21pYWwgd2hpY2ggYXBwcm94aW1hdGVzIDJeeCAqLwogICB7CiAgICAgRklYUF9EQkwgcDsKIAogICAgIC8qIHJlc3VsdF9tIH49IDJeZnJhY19wYXJ0ICovCiAgICAgcCA9IGZyYWNfcGFydDsKLSAgICAvKiBGaXJzdCB0YXlsb3Igc2VyaWVzIGNvZWZmaWNpZW50IGFfMCA9IDEuMCwgc2NhbGVkIGJ5IDAuNSBkdWUgdG8gZk11bHREaXYyKCkuICovCi0gICAgcmVzdWx0X20gPSBGTDJGWENPTlNUX0RCTCgxLjBmLzIuMGYpOworICAgIC8qIEZpcnN0IHRheWxvciBzZXJpZXMgY29lZmZpY2llbnQgYV8wID0gMS4wLCBzY2FsZWQgYnkgMC41IGR1ZSB0bworICAgICAqIGZNdWx0RGl2MigpLiAqLworICAgIHJlc3VsdF9tID0gRkwyRlhDT05TVF9EQkwoMS4wZiAvIDIuMGYpOwogICAgIGZvciAoSU5UIGkgPSAwOyBpIDwgUE9XMl9QUkVDSVNJT047IGkrKykgewogICAgICAgLyogbmV4dCB0YXlsb3Igc2VyaWVzIHRlcm06IGFfaSAqIHheaSwgeD0wICovCiAgICAgICByZXN1bHRfbSA9IGZNdWx0QWRkRGl2MihyZXN1bHRfbSwgcG93MkNvZWZmW2ldLCBwKTsKLSAgICAgIHAgID0gZk11bHQocCwgZnJhY19wYXJ0KTsKKyAgICAgIHAgPSBmTXVsdChwLCBmcmFjX3BhcnQpOwogICAgIH0KICAgfQotCi0gIC8qICIrIDEiIGNvbXBlbnNhdGVzIGZNdWx0QWRkRGl2MigpIG9mIHRoZSBwb2x5bm9taWFsIGV2YWx1YXRpb24gYWJvdmUuICovCi0gICpyZXN1bHRfZSA9IGludF9wYXJ0ICsgMTsKLQogICByZXR1cm4gcmVzdWx0X207CiB9CiAKLUZJWFBfREJMIGYyUG93KAotICAgICAgICBjb25zdCBGSVhQX0RCTCBleHBfbSwgY29uc3QgSU5UIGV4cF9lCi0gICAgICAgICkKLXsKK0ZJWFBfREJMIGYyUG93KGNvbnN0IEZJWFBfREJMIGV4cF9tLCBjb25zdCBJTlQgZXhwX2UpIHsKICAgRklYUF9EQkwgcmVzdWx0X207CiAgIElOVCByZXN1bHRfZTsKIAogICByZXN1bHRfbSA9IGYyUG93KGV4cF9tLCBleHBfZSwgJnJlc3VsdF9lKTsKLSAgcmVzdWx0X2UgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSxmaXhNYXgoLShERlJBQ1RfQklUUy0xKSxyZXN1bHRfZSkpOworICByZXN1bHRfZSA9IGZpeE1pbihERlJBQ1RfQklUUyAtIDEsIGZpeE1heCgtKERGUkFDVF9CSVRTIC0gMSksIHJlc3VsdF9lKSk7CiAKICAgcmV0dXJuIHNjYWxlVmFsdWUocmVzdWx0X20sIHJlc3VsdF9lKTsKIH0KIAotRklYUF9EQkwgZlBvdygKLSAgICAgICAgRklYUF9EQkwgYmFzZV9tLCBJTlQgYmFzZV9lLAotICAgICAgICBGSVhQX0RCTCBleHBfbSwgSU5UIGV4cF9lLAotICAgICAgICBJTlQgKnJlc3VsdF9lCi0gICAgICAgICkKLXsKLSAgICBJTlQgYW5zX2xnMl9lLCBiYXNlbGcyX2U7Ci0gICAgRklYUF9EQkwgYmFzZV9sZzIsIGFuc19sZzIsIHJlc3VsdDsKK0ZJWFBfREJMIGZQb3coRklYUF9EQkwgYmFzZV9tLCBJTlQgYmFzZV9lLCBGSVhQX0RCTCBleHBfbSwgSU5UIGV4cF9lLAorICAgICAgICAgICAgICBJTlQgKnJlc3VsdF9lKSB7CisgIElOVCBhbnNfbGcyX2UsIGJhc2VsZzJfZTsKKyAgRklYUF9EQkwgYmFzZV9sZzIsIGFuc19sZzIsIHJlc3VsdDsKIAotICAgIC8qIENhbGMgbG9nMiBvZiBiYXNlICovCi0gICAgYmFzZV9sZzIgPSBmTG9nMihiYXNlX20sIGJhc2VfZSwgJmJhc2VsZzJfZSk7CisgIC8qIENhbGMgbG9nMiBvZiBiYXNlICovCisgIGJhc2VfbGcyID0gZkxvZzIoYmFzZV9tLCBiYXNlX2UsICZiYXNlbGcyX2UpOwogCi0gICAgLyogUHJlcGFyZSBleHAgKi8KLSAgICB7Ci0gICAgICBJTlQgbGVhZGluZ0JpdHM7CisgIC8qIFByZXBhcmUgZXhwICovCisgIHsKKyAgICBJTlQgbGVhZGluZ0JpdHM7CiAKLSAgICAgIGxlYWRpbmdCaXRzID0gQ291bnRMZWFkaW5nQml0cyhmQWJzKGV4cF9tKSk7Ci0gICAgICBleHBfbSA9IGV4cF9tIDw8IGxlYWRpbmdCaXRzOwotICAgICAgZXhwX2UgLT0gbGVhZGluZ0JpdHM7Ci0gICAgfQorICAgIGxlYWRpbmdCaXRzID0gQ291bnRMZWFkaW5nQml0cyhmQWJzKGV4cF9tKSk7CisgICAgZXhwX20gPSBleHBfbSA8PCBsZWFkaW5nQml0czsKKyAgICBleHBfZSAtPSBsZWFkaW5nQml0czsKKyAgfQogCi0gICAgLyogQ2FsYyBiYXNlIHBvdyBleHAgKi8KLSAgICBhbnNfbGcyID0gZk11bHQoYmFzZV9sZzIsIGV4cF9tKTsKLSAgICBhbnNfbGcyX2UgPSBleHBfZSArIGJhc2VsZzJfZTsKKyAgLyogQ2FsYyBiYXNlIHBvdyBleHAgKi8KKyAgYW5zX2xnMiA9IGZNdWx0KGJhc2VfbGcyLCBleHBfbSk7CisgIGFuc19sZzJfZSA9IGV4cF9lICsgYmFzZWxnMl9lOwogCi0gICAgLyogQ2FsYyBhbnRpbG9nICovCi0gICAgcmVzdWx0ID0gZjJQb3coYW5zX2xnMiwgYW5zX2xnMl9lLCByZXN1bHRfZSk7CisgIC8qIENhbGMgYW50aWxvZyAqLworICByZXN1bHQgPSBmMlBvdyhhbnNfbGcyLCBhbnNfbGcyX2UsIHJlc3VsdF9lKTsKIAotICAgIHJldHVybiByZXN1bHQ7CisgIHJldHVybiByZXN1bHQ7CiB9CiAKLUZJWFBfREJMIGZMZFBvdygKLSAgICAgICAgRklYUF9EQkwgYmFzZUxkX20sCi0gICAgICAgIElOVCBiYXNlTGRfZSwKLSAgICAgICAgRklYUF9EQkwgZXhwX20sIElOVCBleHBfZSwKLSAgICAgICAgSU5UICpyZXN1bHRfZQotICAgICAgICApCi17Ci0gICAgSU5UIGFuc19sZzJfZTsKLSAgICBGSVhQX0RCTCBhbnNfbGcyLCByZXN1bHQ7CitGSVhQX0RCTCBmTGRQb3coRklYUF9EQkwgYmFzZUxkX20sIElOVCBiYXNlTGRfZSwgRklYUF9EQkwgZXhwX20sIElOVCBleHBfZSwKKyAgICAgICAgICAgICAgICBJTlQgKnJlc3VsdF9lKSB7CisgIElOVCBhbnNfbGcyX2U7CisgIEZJWFBfREJMIGFuc19sZzIsIHJlc3VsdDsKIAotICAgIC8qIFByZXBhcmUgZXhwICovCi0gICAgewotICAgICAgSU5UIGxlYWRpbmdCaXRzOworICAvKiBQcmVwYXJlIGV4cCAqLworICB7CisgICAgSU5UIGxlYWRpbmdCaXRzOwogCi0gICAgICBsZWFkaW5nQml0cyA9IENvdW50TGVhZGluZ0JpdHMoZkFicyhleHBfbSkpOwotICAgICAgZXhwX20gPSBleHBfbSA8PCBsZWFkaW5nQml0czsKLSAgICAgIGV4cF9lIC09IGxlYWRpbmdCaXRzOwotICAgIH0KKyAgICBsZWFkaW5nQml0cyA9IENvdW50TGVhZGluZ0JpdHMoZkFicyhleHBfbSkpOworICAgIGV4cF9tID0gZXhwX20gPDwgbGVhZGluZ0JpdHM7CisgICAgZXhwX2UgLT0gbGVhZGluZ0JpdHM7CisgIH0KIAotICAgIC8qIENhbGMgYmFzZSBwb3cgZXhwICovCi0gICAgYW5zX2xnMiA9IGZNdWx0KGJhc2VMZF9tLCBleHBfbSk7Ci0gICAgYW5zX2xnMl9lID0gZXhwX2UgKyBiYXNlTGRfZTsKKyAgLyogQ2FsYyBiYXNlIHBvdyBleHAgKi8KKyAgYW5zX2xnMiA9IGZNdWx0KGJhc2VMZF9tLCBleHBfbSk7CisgIGFuc19sZzJfZSA9IGV4cF9lICsgYmFzZUxkX2U7CiAKLSAgICAvKiBDYWxjIGFudGlsb2cgKi8KLSAgICByZXN1bHQgPSBmMlBvdyhhbnNfbGcyLCBhbnNfbGcyX2UsIHJlc3VsdF9lKTsKKyAgLyogQ2FsYyBhbnRpbG9nICovCisgIHJlc3VsdCA9IGYyUG93KGFuc19sZzIsIGFuc19sZzJfZSwgcmVzdWx0X2UpOwogCi0gICAgcmV0dXJuIHJlc3VsdDsKKyAgcmV0dXJuIHJlc3VsdDsKIH0KIAotRklYUF9EQkwgZkxkUG93KAotICAgICAgICBGSVhQX0RCTCBiYXNlTGRfbSwgSU5UIGJhc2VMZF9lLAotICAgICAgICBGSVhQX0RCTCBleHBfbSwgSU5UIGV4cF9lCi0gICAgICAgICkKLXsKK0ZJWFBfREJMIGZMZFBvdyhGSVhQX0RCTCBiYXNlTGRfbSwgSU5UIGJhc2VMZF9lLCBGSVhQX0RCTCBleHBfbSwgSU5UIGV4cF9lKSB7CiAgIEZJWFBfREJMIHJlc3VsdF9tOwogICBpbnQgcmVzdWx0X2U7CiAKQEAgLTc2OCwxMiArNzA1LDcgQEAKICAgcmV0dXJuIFNBVFVSQVRFX1NISUZUKHJlc3VsdF9tLCAtcmVzdWx0X2UsIERGUkFDVF9CSVRTKTsKIH0KIAotRklYUF9EQkwgZlBvd0ludCgKLSAgICAgICAgRklYUF9EQkwgYmFzZV9tLCBJTlQgYmFzZV9lLAotICAgICAgICBJTlQgZXhwLAotICAgICAgICBJTlQgKnBSZXN1bHRfZQotICAgICAgICApCi17CitGSVhQX0RCTCBmUG93SW50KEZJWFBfREJMIGJhc2VfbSwgSU5UIGJhc2VfZSwgSU5UIGV4cCwgSU5UICpwUmVzdWx0X2UpIHsKICAgRklYUF9EQkwgcmVzdWx0OwogCiAgIGlmIChleHAgIT0gMCkgewpAQCAtNzgyLDcgKzcxNCw3IEBACiAgICAgaWYgKGJhc2VfbSAhPSAoRklYUF9EQkwpMCkgewogICAgICAgewogICAgICAgICBJTlQgbGVhZGluZ0JpdHM7Ci0gICAgICAgIGxlYWRpbmdCaXRzID0gQ291bnRMZWFkaW5nQml0cyggYmFzZV9tICk7CisgICAgICAgIGxlYWRpbmdCaXRzID0gQ291bnRMZWFkaW5nQml0cyhiYXNlX20pOwogICAgICAgICBiYXNlX20gPDw9IGxlYWRpbmdCaXRzOwogICAgICAgICBiYXNlX2UgLT0gbGVhZGluZ0JpdHM7CiAgICAgICB9CkBAIC03OTgsMTAgKzczMCwxMCBAQAogCiAgICAgICBpZiAoZXhwIDwgMCkgewogICAgICAgICAvKiAxLjAgLyBhbnMgKi8KLSAgICAgICAgcmVzdWx0ID0gZkRpdk5vcm0oIEZMMkZYQ09OU1RfREJMKDAuNWYpLCByZXN1bHQsICZyZXN1bHRfZSApOworICAgICAgICByZXN1bHQgPSBmRGl2Tm9ybShGTDJGWENPTlNUX0RCTCgwLjVmKSwgcmVzdWx0LCAmcmVzdWx0X2UpOwogICAgICAgICByZXN1bHRfZSsrOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGFuc1NjYWxlID0gQ291bnRMZWFkaW5nQml0cyggcmVzdWx0ICk7CisgICAgICAgIGludCBhbnNTY2FsZSA9IENvdW50TGVhZGluZ0JpdHMocmVzdWx0KTsKICAgICAgICAgcmVzdWx0IDw8PSBhbnNTY2FsZTsKICAgICAgICAgcmVzdWx0X2UgLT0gYW5zU2NhbGU7CiAgICAgICB9CkBAIC04MTIsODQgKzc0NCwxNTcgQEAKICAgICAgIHJlc3VsdCA9IChGSVhQX0RCTCkwOwogICAgIH0KICAgICAqcFJlc3VsdF9lID0gcmVzdWx0X2U7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgcmVzdWx0ID0gIEZMMkZYQ09OU1RfREJMKDAuNWYpOworICB9IGVsc2UgeworICAgIHJlc3VsdCA9IEZMMkZYQ09OU1RfREJMKDAuNWYpOwogICAgICpwUmVzdWx0X2UgPSAxOwogICB9CiAKICAgcmV0dXJuIHJlc3VsdDsKIH0KKyNlbmRpZiAvKiBGVU5DVElPTl9mUG93ICovCiAKLUZJWFBfREJMIGZMb2cyKEZJWFBfREJMIHhfbSwgSU5UIHhfZSwgSU5UICpyZXN1bHRfZSkKLXsKLSAgRklYUF9EQkwgcmVzdWx0X207CisjaWZuZGVmIEZVTkNUSU9OX2ZMb2cyCitGSVhQX0RCTCBDYWxjTG9nMihGSVhQX0RCTCBiYXNlX20sIElOVCBiYXNlX2UsIElOVCAqcmVzdWx0X2UpIHsKKyAgcmV0dXJuIGZMb2cyKGJhc2VfbSwgYmFzZV9lLCByZXN1bHRfZSk7Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fZkxvZzIgKi8KIAotICAvKiBTaG9ydCBjdXQgZm9yIHplcm8gYW5kIG5lZ2F0aXZlIG51bWJlcnMuICovCi0gIGlmICggeF9tIDw9IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgewotICAgICpyZXN1bHRfZSA9IERGUkFDVF9CSVRTLTE7Ci0gICAgcmV0dXJuIEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKLSAgfQotCi0gIC8qIENhbGN1bGF0ZSBsb2cyKCkgKi8KLSAgewotICAgIEZJWFBfREJMIHB4Ml9tLCB4Ml9tOwotCi0gICAgLyogTW92ZSBpbnB1dCB2YWx1ZSB4X20gKiAyXnhfZSB0b3dhcmQgMS4wLCB3aGVyZSB0aGUgdGF5bG9yIGFwcHJveGltYXRpb24KLSAgICAgICBvZiB0aGUgZnVuY3Rpb24gbG9nKDEteCkgY2VudGVyZWQgYXQgMCBpcyBtb3N0IGFjY3VyYXRlLiAqLwotICAgIHsKLSAgICAgIElOVCBiX25vcm07Ci0KLSAgICAgIGJfbm9ybSA9IGZOb3Jteih4X20pLTE7Ci0gICAgICB4Ml9tID0geF9tIDw8IGJfbm9ybTsKLSAgICAgIHhfZSA9IHhfZSAtIGJfbm9ybTsKLSAgICB9Ci0KLSAgICAvKiBtYXAgeCBmcm9tIGxvZyh4KSBkb21haW4gdG8gbG9nKDEteCkgZG9tYWluLiAqLwotICAgIHgyX20gPSAtICh4Ml9tICsgRkwyRlhDT05TVF9EQkwoLTEuMCkgKTsKLQotICAgIC8qIFRheWxvciBwb2xpbm9taWFsIGFwcHJveGltYXRpb24gb2YgbG4oMS14KSAqLwotICAgIHJlc3VsdF9tICA9IEZMMkZYQ09OU1RfREJMKDAuMCk7Ci0gICAgcHgyX20gPSB4Ml9tOwotICAgIGZvciAoaW50IGk9MDsgaTxMRF9QUkVDSVNJT047IGkrKykgewotICAgICAgcmVzdWx0X20gPSBmTXVsdEFkZERpdjIocmVzdWx0X20sIGxkQ29lZmZbaV0sIHB4Ml9tKTsKLSAgICAgIHB4Ml9tID0gZk11bHQocHgyX20sIHgyX20pOwotICAgIH0KLSAgICAvKiBNdWx0aXBseSByZXN1bHQgd2l0aCAxL2xuKDIpID0gMS4wICsgMC40NDI2OTUwNDA4ODggKGdldCBsb2cyKHgpIGZyb20gbG4oeCkgcmVzdWx0KS4gKi8KLSAgICByZXN1bHRfbSA9IGZNdWx0QWRkRGl2MihyZXN1bHRfbSwgcmVzdWx0X20sIEZMMkZYQ09OU1RfREJMKDIuMCowLjQ0MjY5NTA0MDg4ODk2MzQwNzM1OTkyNDY4MTAwMTkpKTsKLQotICAgIC8qIEFkZCBleHBvbmVudCBwYXJ0LiBsb2cyKHhfbSAqIDJeeF9lKSA9IGxvZzIoeF9tKSArIHhfZSAqLwotICAgIGlmICh4X2UgIT0gMCkKLSAgICB7Ci0gICAgICBpbnQgZW5vcm07Ci0KLSAgICAgIGVub3JtID0gREZSQUNUX0JJVFMgLSBmTm9ybSgoRklYUF9EQkwpeF9lKTsKLSAgICAgIC8qIFRoZSAtMSBpbiB0aGUgcmlnaHQgc2hpZnQgb2YgcmVzdWx0X20gY29tcGVuc2F0ZXMgdGhlIGZNdWx0RGl2MigpIGFib3ZlIGluIHRoZSB0YXlsb3IgcG9saW5vbWlhbCBldmFsdWF0aW9uIGxvb3AuKi8KLSAgICAgIHJlc3VsdF9tID0gKHJlc3VsdF9tID4+IChlbm9ybS0xKSkgKyAoKEZJWFBfREJMKXhfZSA8PCAoREZSQUNUX0JJVFMtMS1lbm9ybSkpOwotCi0gICAgICAqcmVzdWx0X2UgPSBlbm9ybTsKLSAgICB9IGVsc2UgewotICAgICAgLyogMSBjb21wZW5zYXRlcyB0aGUgZk11bHREaXYyKCkgYWJvdmUgaW4gdGhlIHRheWxvciBwb2xpbm9taWFsIGV2YWx1YXRpb24gbG9vcC4qLwotICAgICAgKnJlc3VsdF9lID0gMTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0X207CitJTlQgZml4cF9mbG9vclRvSW50KEZJWFBfREJMIGZfaW5wLCBJTlQgc2YpIHsKKyAgRkRLX0FTU0VSVChzZiA+PSAwKTsKKyAgSU5UIGZsb29ySW50ID0gKElOVCkoZl9pbnAgPj4gKChERlJBQ1RfQklUUyAtIDEpIC0gc2YpKTsKKyAgcmV0dXJuIGZsb29ySW50OwogfQogCi1GSVhQX0RCTCBmTG9nMihGSVhQX0RCTCB4X20sIElOVCB4X2UpCi17Ci0gIGlmICggeF9tIDw9IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgewotICAgIHhfbSA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKLSAgfQotICBlbHNlIHsKLSAgICBJTlQgcmVzdWx0X2U7Ci0gICAgeF9tID0gZkxvZzIoeF9tLCB4X2UsICZyZXN1bHRfZSk7Ci0gICAgeF9tID0gc2NhbGVWYWx1ZSh4X20sIHJlc3VsdF9lLUxEX0RBVEFfU0hJRlQpOwotICB9Ci0gIHJldHVybiAgeF9tOworRklYUF9EQkwgZml4cF9mbG9vcihGSVhQX0RCTCBmX2lucCwgSU5UIHNmKSB7CisgIEZES19BU1NFUlQoc2YgPj0gMCk7CisgIElOVCBmbG9vckludCA9IGZpeHBfZmxvb3JUb0ludChmX2lucCwgc2YpOworICBGSVhQX0RCTCBmX2Zsb29yID0gKEZJWFBfREJMKShmbG9vckludCA8PCAoKERGUkFDVF9CSVRTIC0gMSkgLSBzZikpOworICByZXR1cm4gZl9mbG9vcjsKIH0KIAorSU5UIGZpeHBfY2VpbFRvSW50KEZJWFBfREJMIGZfaW5wLCBJTlQgc2YpICAvLyBzZiAgbWFudGlzc2FCaXRzIGxlZnQgb2YgZG90Cit7CisgIEZES19BU1NFUlQoc2YgPj0gMCk7CisgIElOVCBzeCA9IChERlJBQ1RfQklUUyAtIDEpIC0gc2Y7ICAvLyBzeCAgbWFudGlzc2FCaXRzIHJpZ2h0IG9mIGRvdAorICBJTlQgaW5wSU5UID0gKElOVClmX2lucDsKIAorICBJTlQgbWFzayA9ICgweDEgPDwgc3gpIC0gMTsKKyAgSU5UIGNlaWxJbnQgPSAoSU5UKShmX2lucCA+PiBzeCk7CiAKKyAgaWYgKGlucElOVCAmIG1hc2spIHsKKyAgICBjZWlsSW50Kys7ICAvLyBpbmNyZW1lbnQgb25seSwgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHNldCBtYW50aXNzYUJpdAorICAgICAgICAgICAgICAgIC8vIHJpZ2h0IG9mIGRvdCBbaW4gaW5wSU5UXQorICB9CiAKKyAgcmV0dXJuIGNlaWxJbnQ7Cit9CisKK0ZJWFBfREJMIGZpeHBfY2VpbChGSVhQX0RCTCBmX2lucCwgSU5UIHNmKSB7CisgIEZES19BU1NFUlQoc2YgPj0gMCk7CisgIElOVCBzeCA9IChERlJBQ1RfQklUUyAtIDEpIC0gc2Y7CisgIElOVCBjZWlsSW50ID0gZml4cF9jZWlsVG9JbnQoZl9pbnAsIHNmKTsKKyAgVUxPTkcgbWFzayA9IChVTE9ORykweDEgPDwgKERGUkFDVF9CSVRTIC0gMSk7ICAvLyAweDgwMDAwMDAwCisgIGNlaWxJbnQgPSBjZWlsSW50CisgICAgICAgICAgICA8PCBzeDsgIC8vIG5vIGZyYWN0IHdhcm4gYmVjLiBzaGlmdCBpbnRvIHNhdHVyYXRpb24gZG9uZSBvbiBpbnQgc2lkZQorCisgIGlmICgoZl9pbnAgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgJiYgKGNlaWxJbnQgJiBtYXNrKSkgeworICAgIC0tY2VpbEludDsKKyAgfQorICBGSVhQX0RCTCBmX2NlaWwgPSAoRklYUF9EQkwpY2VpbEludDsKKworICByZXR1cm4gZl9jZWlsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIGZpeHBfdHJ1bmNhdGVUb0ludCgpCisgICAgIEp1c3QgcmVtb3ZlIHRoZSBmcmFjdGlvbmFsIHBhcnQgd2hpY2ggaXMgbG9jYXRlZCByaWdodCBvZiBkZWNpbWFsIHBvaW50CisgICAgIFNhbWUgYXMgd2hpY2ggaXMgZG9uZSB3aGVuIGEgZmxvYXQgaXMgY2FzdGVkIHRvIChJTlQpIDoKKyAgICAgcmVzdWx0X0lOVHR5cGUgPSAoSU5UKWJfZmxvYXRUeXBlSW5wdXQ7CisKKyAgIHJldHVybnMgSU5UCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVCBmaXhwX3RydW5jYXRlVG9JbnQoRklYUF9EQkwgZl9pbnAsIElOVCBzZikgIC8vIHNmICBtYW50aXNzYUJpdHMgbGVmdCAgb2YgZG90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAod2l0aG91dCBzaWduKSAgZS5nLiBhdCB3aWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMzIgdGhpcyB3b3VsZCBiZSBbc2lnbl03LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9zZWQgc2YgZXF1YWxzIDguCit7CisgIEZES19BU1NFUlQoc2YgPj0gMCk7CisgIElOVCBzeCA9IChERlJBQ1RfQklUUyAtIDEpIC0gc2Y7ICAvLyBzeCAgbWFudGlzc2FCaXRzIHJpZ2h0IG9mIGRvdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgd2lkdGggMzIgdGhpcyB3b3VsZCBiZSAgICAgICAgLjI0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3NlZCBzZiBlcXVhbHMgOC4KKyAgSU5UIGZiYWNjdSA9IChJTlQpZl9pbnA7CisgIElOVCBtYXNrID0gKDB4MSA8PCBzeCk7CisKKyAgaWYgKChmYmFjY3UgPCAwKSAmJiAoZmJhY2N1ICYgKG1hc2sgLSAxKSkpIHsKKyAgICBmYmFjY3UgPSBmYmFjY3UgKyBtYXNrOworICB9CisKKyAgZmJhY2N1ID0gZmJhY2N1ID4+IHN4OworICByZXR1cm4gZmJhY2N1OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIGZpeHBfdHJ1bmNhdGUoKQorICAgICBKdXN0IHJlbW92ZSB0aGUgZnJhY3Rpb25hbCBwYXJ0IHdoaWNoIGlzIGxvY2F0ZWQgcmlnaHQgb2YgZGVjaW1hbCBwb2ludAorCisgICByZXR1cm5zIEZJWFBfREJMCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0ZJWFBfREJMIGZpeHBfdHJ1bmNhdGUoRklYUF9EQkwgZl9pbnAsIElOVCBzZikgeworICBGREtfQVNTRVJUKHNmID49IDApOworICBJTlQgdHJ1bmNhdGVJbnQgPSBmaXhwX3RydW5jYXRlVG9JbnQoZl9pbnAsIHNmKTsKKyAgRklYUF9EQkwgZl90cnVuY2F0ZSA9IChGSVhQX0RCTCkodHJ1bmNhdGVJbnQgPDwgKChERlJBQ1RfQklUUyAtIDEpIC0gc2YpKTsKKyAgcmV0dXJuIGZfdHJ1bmNhdGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBmaXhwX3JvdW5kVG9JbnQoKQorICAgIHJvdW5kIFt0eXBpY2FsIHJvdW5kaW5nXQorCisgICAgU2VlIGZjdCByb3VuZFJlZigpIFt3aGljaCBpcyB0aGUgcmVmZXJlbmNlXQorICByZXR1cm5zIElOVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQgZml4cF9yb3VuZFRvSW50KEZJWFBfREJMIGZfaW5wLCBJTlQgc2YpIHsKKyAgRkRLX0FTU0VSVChzZiA+PSAwKTsKKyAgSU5UIHN4ID0gREZSQUNUX0JJVFMgLSAxIC0gc2Y7CisgIElOVCBpbnAgPSAoSU5UKWZfaW5wOworICBJTlQgbWFzazEgPSAoMHgxIDw8IChzeCAtIDEpKTsKKyAgSU5UIG1hc2syID0gKDB4MSA8PCAoc3gpKSAtIDE7CisgIElOVCBtYXNrMyA9IDB4N0ZGRkZGRkY7CisgIElOVCBpYW0gPSBpbnAgJiBtYXNrMjsKKyAgSU5UIHJuZDsKKworICBpZiAoKGlucCA8IDApICYmICEoaWFtID09IG1hc2sxKSkKKyAgICBybmQgPSBpbnAgKyBtYXNrMTsKKyAgZWxzZSBpZiAoKGlucCA+IDApICYmICEoaW5wID09IG1hc2szKSkKKyAgICBybmQgPSBpbnAgKyBtYXNrMTsKKyAgZWxzZQorICAgIHJuZCA9IGlucDsKKworICBybmQgPSBybmQgPj4gc3g7CisKKyAgaWYgKGlucCA9PSBtYXNrMykgcm5kKys7CisKKyAgcmV0dXJuIHJuZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIGZpeHBfcm91bmQoKQorICAgIHJvdW5kIFt0eXBpY2FsIHJvdW5kaW5nXQorCisgICAgU2VlIGZjdCByb3VuZFJlZigpIFt3aGljaCBpcyB0aGUgcmVmZXJlbmNlXQorICByZXR1cm5zIEZJWFBfREJMCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0ZJWFBfREJMIGZpeHBfcm91bmQoRklYUF9EQkwgZl9pbnAsIElOVCBzZikgeworICBGREtfQVNTRVJUKHNmID49IDApOworICBJTlQgc3ggPSBERlJBQ1RfQklUUyAtIDEgLSBzZjsKKyAgSU5UIHIgPSBmaXhwX3JvdW5kVG9JbnQoZl9pbnAsIHNmKTsKKyAgVUxPTkcgbWFzayA9IChVTE9ORykweDEgPDwgKERGUkFDVF9CSVRTIC0gMSk7ICAvLyAweDgwMDAwMDAwCisgIHIgPSByIDw8IHN4OworCisgIGlmICgoZl9pbnAgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgJiYgKHIgJiBtYXNrKSkgeworICAgIC0tcjsKKyAgfQorCisgIEZJWFBfREJMIGZfcm91bmQgPSAoRklYUF9EQkwpcjsKKyAgcmV0dXJuIGZfcm91bmQ7Cit9CmRpZmYgLS1naXQgYS9saWJGREsvc3JjL2h1ZmZfbm9kZXMuY3BwIGIvbGliRkRLL3NyYy9odWZmX25vZGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmRjOTA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliRkRLL3NyYy9odWZmX25vZGVzLmNwcApAQCAtMCwwICsxLDEwODQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE9tZXIgT3NtYW4KKworICAgRGVzY3JpcHRpb246IE1QRUctRCBTQUMvVVNBQy9TQU9DIEh1ZmZtYW4gUGFydDAgVGFibGVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJodWZmX25vZGVzLmgiCisKK2NvbnN0IEhVRkZfUFQwX05PREVTIEZES19odWZmUGFydDBOb2RlcyA9IHsKKyAgICB7ezIsIDF9LCAgICAgezQsIDN9LCAgICAgezYsIDV9LCAgICAgezgsIDd9LCAgICB7MTAsIDl9LCAgICB7MTIsIDExfSwKKyAgICAgezE0LCAxM30sICAgey04LCAxNX0sICAgey05LCAxNn0sICAgey0xMCwgMTd9LCB7LTE4LCAxOH0sICB7LTE3LCAtMTl9LAorICAgICB7LTE2LCAxOX0sICB7LTExLCAtMjB9LCB7LTE1LCAtMjF9LCB7LTcsIDIwfSwgIHstMjIsIDIxfSwgIHstMTIsIC0xNH0sCisgICAgIHstMTMsIC0yM30sIHsyMywgMjJ9LCAgIHstMjQsIC0zMX0sIHstNiwgMjR9LCAgey0yNSwgLTI2fSwgezI2LCAyNX0sCisgICAgIHstNSwgLTI3fSwgIHstMjgsIDI3fSwgIHstNCwgMjh9LCAgIHstMjksIDI5fSwgey0xLCAtMzB9LCAgey0yLCAtM319LAorICAgIHt7MiwgMX0sIHstNSwgM30sIHstNCwgLTZ9LCB7LTMsIDR9LCB7LTIsIDV9LCB7LTEsIDZ9LCB7LTcsIC04fX0sCisgICAge3stMSwgMX0sIHstOCwgMn0sIHstMiwgM30sIHs1LCA0fSwgey03LCA2fSwgey0zLCAtNX0sIHstNCwgLTZ9fSwKKyAgICB7ey0xLCAxfSwKKyAgICAgezMsIDJ9LAorICAgICB7LTgsIDR9LAorICAgICB7NiwgNX0sCisgICAgIHstMTYsIDd9LAorICAgICB7OSwgOH0sCisgICAgIHsxMSwgMTB9LAorICAgICB7LTIsIC03fSwKKyAgICAgey02LCAxMn0sCisgICAgIHstNCwgLTV9LAorICAgICB7LTMsIDEzfSwKKyAgICAgey0xMCwgMTR9LAorICAgICB7LTExLCAtMTJ9LAorICAgICB7LTE0LCAtMTV9LAorICAgICB7LTksIC0xM319LAorICAgIHt7MiwgMX0sICAgICB7NCwgM30sICAgICB7NiwgNX0sICAgICB7OCwgN30sICAgIHsxMCwgOX0sICAgIHsxMiwgMTF9LAorICAgICB7MTQsIDEzfSwgICB7MTYsIDE1fSwgICB7MTgsIDE3fSwgICB7MjAsIDE5fSwgIHsyMiwgMjF9LCAgIHsyNCwgMjN9LAorICAgICB7MjYsIDI1fSwgICB7MjgsIDI3fSwgICB7MzAsIDI5fSwgICB7MzIsIDMxfSwgIHstNDcsIDMzfSwgIHstNTQsIDM0fSwKKyAgICAgey00NiwgMzV9LCAgey00OCwgMzZ9LCAgey0yMywgLTI3fSwgey00NSwgMzd9LCB7LTU1LCAzOH0sICB7LTIyLCAtNDl9LAorICAgICB7LTI0LCAtNTN9LCB7LTQ0LCAzOX0sICB7LTU3LCA0MH0sICB7LTI4LCA0MX0sIHstNTIsIC01Nn0sIHstNDMsIDQyfSwKKyAgICAgey01MCwgNDN9LCAgey0yNSwgLTI2fSwgey0yOSwgLTY0fSwgey02MiwgNDR9LCB7LTIxLCAtNTF9LCB7LTU4LCA0NX0sCisgICAgIHstMzIsIDQ2fSwgIHstMzEsIC00Mn0sIHstNjAsIDQ3fSwgIHstMzAsIDQ4fSwgey0yMCwgLTYxfSwgey00MSwgLTYzfSwKKyAgICAgey0xOSwgLTU5fSwgey00MCwgNDl9LCAgey0xOCwgLTM4fSwgey0zOSwgNTB9LCB7LTM2LCAtMzd9LCB7LTM1LCA1MX0sCisgICAgIHstMTcsIDUyfSwgIHstMTYsIC0zNH0sIHstMzMsIDUzfSwgIHstMTUsIDU0fSwgey0xNCwgNTV9LCAgey0xMywgNTZ9LAorICAgICB7LTEyLCA1N30sICB7LTExLCA1OH0sICB7LTEwLCA1OX0sICB7LTksIDYwfSwgIHstNywgNjF9LCAgIHstMSwgLTR9LAorICAgICB7LTYsIDYyfSwgICB7LTUsIC04fSwgICB7LTIsIC0zfX19OworCitjb25zdCBIVUZGX0xBVl9OT0RFUyBGREtfaHVmZkxhdklkeE5vZGVzID0ge3t7LTEsIDF9LCB7LTIsIDJ9LCB7LTMsIC00fX19OworCitzdGF0aWMgY29uc3QgSFVGRl9JQ0NfTk9EXzFEIEZES19odWZmSUNDTm9kZXNfaDFEXzAgPSB7CisgICAge3stMSwgMX0sIHstMiwgMn0sIHstMywgM30sIHstNCwgNH0sIHstNSwgNX0sIHstNiwgNn0sIHstNywgLTh9fX07CisKK3N0YXRpYyBjb25zdCBIVUZGX0lDQ19OT0RfMkQgRkRLX2h1ZmZJQ0NOb2Rlc19oMkRfMF8wID0geworICAgIHt7LTEsIDF9LCB7LTE4LCAyfSwgey0yLCAtMTd9fSwKKyAgICB7ezIsIDF9LAorICAgICB7LTEsIC01Mn0sCisgICAgIHstMiwgM30sCisgICAgIHs1LCA0fSwKKyAgICAgey01MSwgNn0sCisgICAgIHstMTgsIDd9LAorICAgICB7LTE3LCA4fSwKKyAgICAgey0zLCA5fSwKKyAgICAgey0zNiwgMTB9LAorICAgICB7LTE5LCAtNTB9LAorICAgICB7LTM1LCAxMX0sCisgICAgIHstNCwgMTJ9LAorICAgICB7LTM0LCAxM30sCisgICAgIHstMzMsIDE0fSwKKyAgICAgey0yMCwgLTQ5fX0sCisgICAge3syLCAxfSwgICAgIHstODYsIDN9LCAgey0xLCA0fSwgICB7NiwgNX0sICAgICB7LTIsIDd9LCAgICB7LTg1LCA4fSwKKyAgICAgey0xOCwgOX0sICAgezExLCAxMH0sICB7LTE3LCAxMn0sIHsxNCwgMTN9LCAgIHstNzAsIDE1fSwgIHstMywgLTE5fSwKKyAgICAgey02OSwgMTZ9LCAgey04NCwgMTd9LCB7LTY4LCAxOH0sIHstMjAsIC0zNX0sIHstMzQsIC04M30sIHsyMCwgMTl9LAorICAgICB7LTQsIDIxfSwgICB7LTMzLCAyMn0sIHstNSwgMjN9LCAgey01MywgMjR9LCAgey0zNiwgLTUyfSwgey02NywgMjV9LAorICAgICB7LTIxLCAtODJ9LCB7LTU0LCAyNn0sIHstNiwgMjd9LCAgey01MSwgMjh9LCAgey01MCwgMjl9LCAgey00OSwgMzB9LAorICAgICB7LTM3LCAzMX0sICB7LTM4LCAwfSwgIHswLCAwfSwgICAgezAsIDB9LCAgICAgezAsIDB9fSwKKyAgICB7ezIsIDF9LCAgICAgezQsIDN9LCAgICAgey0xLCAtMTIwfSwgezYsIDV9LCAgICAgIHs4LCA3fSwgICAgIHstMTgsIDl9LAorICAgICB7LTIsIDEwfSwgICB7MTIsIDExfSwgICB7MTQsIDEzfSwgICB7LTE3LCAtMTE5fSwgezE2LCAxNX0sICAgey0xMDMsIDE3fSwKKyAgICAgey0xMDQsIDE4fSwgey01MiwgMTl9LCAgezIxLCAyMH0sICAgey02OSwgMjJ9LCAgIHsyNCwgMjN9LCAgIHstMywgLTM1fSwKKyAgICAgey0xOSwgMjV9LCAgey0zNCwgLTg1fSwgezI3LCAyNn0sICAgey04NiwgMjh9LCAgIHstMTE4LCAyOX0sIHstMzcsIDMwfSwKKyAgICAgezMyLCAzMX0sICAgey0xMDIsIDMzfSwgey0yMCwgLTIyfSwgey00LCAtMTE3fSwgIHstODcsIDM0fSwgIHstMTAwLCAzNX0sCisgICAgIHstMzMsIC0zNn0sIHszNywgMzZ9LCAgIHstNzAsIC04OH0sIHstMTAxLCAzOH0sICB7LTUsIDM5fSwgICB7LTUxLCAtNTN9LAorICAgICB7LTUwLCA0MH0sICB7LTExNSwgNDF9LCB7LTIxLCA0Mn0sICB7LTExNiwgNDN9LCAgey0zOCwgNDR9LCAgey0yMywgLTg0fSwKKyAgICAgey00OSwgLTk5fSwgezQ2LCA0NX0sICAgey02LCAtMTE0fSwgey03LCAtNzJ9LCAgIHstNzEsIDQ3fSwgIHstOCwgMH0sCisgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgICB7MCwgMH0sICAgICB7MCwgMH0sCisgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgICB7MCwgMH0sICAgICB7MCwgMH0sCisgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfX19Oworc3RhdGljIGNvbnN0IEhVRkZfSUNDX05PRF8yRCBGREtfaHVmZklDQ05vZGVzX2gyRF8wXzEgPSB7CisgICAge3stMSwgMX0sIHstMTgsIDJ9LCB7LTIsIC0xN319LAorICAgIHt7MiwgMX0sCisgICAgIHstMSwgLTUyfSwKKyAgICAgey0xNywgM30sCisgICAgIHs1LCA0fSwKKyAgICAgey0zNiwgNn0sCisgICAgIHstMiwgN30sCisgICAgIHstMTgsIC0zM30sCisgICAgIHs5LCA4fSwKKyAgICAgey0yMCwgMTB9LAorICAgICB7LTM0LCAtNTF9LAorICAgICB7LTQ5LCAxMX0sCisgICAgIHstMzUsIDEyfSwKKyAgICAgey0xOSwgMTN9LAorICAgICB7LTMsIDE0fSwKKyAgICAgey00LCAtNTB9fSwKKyAgICB7ezIsIDF9LCAgICAgey04NiwgM30sICAgey0xLCA0fSwgICB7LTE3LCA1fSwgICB7NywgNn0sICAgIHstNzAsIDh9LAorICAgICB7LTMzLCA5fSwgICB7LTE4LCAxMH0sICB7LTIsIDExfSwgIHstNTQsIDEyfSwgIHstNDksIDEzfSwgey0zOCwgMTR9LAorICAgICB7LTM0LCAtNjV9LCB7LTg1LCAxNX0sICB7LTUwLCAxNn0sIHstNjksIDE3fSwgIHstMjIsIDE4fSwgey01MywgMTl9LAorICAgICB7MjEsIDIwfSwgICB7LTE5LCAtODF9LCB7LTY2LCAyMn0sIHstMywgLTM1fSwgIHsyNCwgMjN9LCAgey0zNywgMjV9LAorICAgICB7LTY4LCAtODR9LCB7LTUxLCAyNn0sICB7MjgsIDI3fSwgIHstMjAsIC01Mn0sIHszMCwgMjl9LCAgey00LCAtMzZ9LAorICAgICB7LTgzLCAzMX0sICB7LTY3LCAzMn0sICB7LTgyLCAzM30sIHstMjEsIDM0fSwgIHstNSwgLTZ9fSwKKyAgICB7ezIsIDF9LCAgICAgey0xLCAzfSwgICAgIHstMTIwLCA0fSwgIHstMTcsIDV9LCAgICB7NywgNn0sICAgICAgey0xMDQsIDh9LAorICAgICB7LTMzLCA5fSwgICB7MTEsIDEwfSwgICAgezEzLCAxMn0sICAgey00OSwgMTR9LCAgIHstODgsIDE1fSwgICB7LTE4LCAtOTd9LAorICAgICB7LTY1LCAxNn0sICB7LTQwLCAxN30sICAgey0yLCAtNzJ9LCAgezE5LCAxOH0sICAgIHstMTEzLCAyMH0sICB7LTM0LCAyMX0sCisgICAgIHstNTYsIC04MX0sIHsyMywgMjJ9LCAgICB7LTUwLCAyNH0sICB7LTgyLCAtMTE5fSwgey0yNCwgLTEwM30sIHsyNiwgMjV9LAorICAgICB7MjgsIDI3fSwgICB7MzAsIDI5fSwgICAgey01NSwgLTg3fSwgey02NiwgMzF9LCAgIHszMywgMzJ9LCAgICB7LTk4LCAzNH0sCisgICAgIHstMzUsIC02N30sIHstMTksIDM1fSwgICB7LTcwLCAzNn0sICB7LTcxLCAzN30sICAgey01MSwgLTUyfSwgIHstMywgMzh9LAorICAgICB7NDAsIDM5fSwgICB7LTg2LCAtMTE4fSwgezQyLCA0MX0sICAgey0zOSwgLTY5fSwgIHstNTQsIC04M30sICB7NDQsIDQzfSwKKyAgICAgey0xMDIsIDQ1fSwgey0xMDEsIDQ2fSwgIHstNjgsIC04NX0sIHstMzYsIC01M30sICB7LTUsIDB9LCAgICAgezAsIDB9LAorICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgIHswLCAwfSwgICAgICB7MCwgMH0sCisgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICAgezAsIDB9LCAgICAgIHswLCAwfSwKKyAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgIHswLCAwfX19Oworc3RhdGljIGNvbnN0IEhVRkZfSUNDX05PRF8yRCBGREtfaHVmZklDQ05vZGVzX2gyRF8xXzAgPSB7CisgICAge3stMSwgMX0sIHstMTgsIDJ9LCB7LTIsIC0xN319LAorICAgIHt7LTUyLCAxfSwKKyAgICAgey0xLCAyfSwKKyAgICAgezQsIDN9LAorICAgICB7LTIsIC0xN30sCisgICAgIHstMTgsIDV9LAorICAgICB7LTM2LCA2fSwKKyAgICAgey01MSwgN30sCisgICAgIHs5LCA4fSwKKyAgICAgey0zMywgMTB9LAorICAgICB7LTM0LCAxMX0sCisgICAgIHstMzUsIDEyfSwKKyAgICAgey0xOSwgLTIwfSwKKyAgICAgey0zLCAxM30sCisgICAgIHstNDksIDE0fSwKKyAgICAgey00LCAtNTB9fSwKKyAgICB7ey0xLCAxfSwgICAgey04NiwgMn0sICB7NCwgM30sICAgICB7LTE3LCA1fSwgIHstMiwgNn0sICAgIHstMTgsIDd9LAorICAgICB7LTcwLCA4fSwgICB7LTg1LCA5fSwgIHsxMSwgMTB9LCAgIHsxMywgMTJ9LCAgey0zMywgMTR9LCAgezE2LCAxNX0sCisgICAgIHstMzQsIC01NH0sIHstNjksIDE3fSwgey0zOCwgMTh9LCAgey01MCwgMTl9LCB7LTM1LCAtNTN9LCB7LTQ5LCAyMH0sCisgICAgIHstMTksIDIxfSwgIHstMywgMjJ9LCAgey02NSwgMjN9LCAgey02OCwgMjR9LCB7LTIyLCAyNX0sICB7LTgxLCAtODR9LAorICAgICB7LTY2LCAyNn0sICB7LTM3LCAyN30sIHstMjAsIC01MX0sIHsyOSwgMjh9LCAgey01MiwgMzB9LCAgey00LCAtODN9LAorICAgICB7LTM2LCAzMX0sICB7LTY3LCAzMn0sIHstNSwgMzN9LCAgIHstODIsIDM0fSwgey0yMSwgMH19LAorICAgIHt7LTEsIDF9LCAgICB7LTEyMCwgMn0sICB7NCwgM30sICAgICB7LTE3LCA1fSwgICB7LTIsIDZ9LCAgICAgezgsIDd9LAorICAgICB7LTE4LCA5fSwgICB7LTEwNCwgMTB9LCB7MTIsIDExfSwgICB7MTQsIDEzfSwgICB7MTYsIDE1fSwgICAgey0xMTksIDE3fSwKKyAgICAgey04MSwgMTh9LCAgezIwLCAxOX0sICAgey0zMywgMjF9LCAgey04OCwgMjJ9LCAgey0xMDMsIDIzfSwgIHstMzQsIDI0fSwKKyAgICAgey01NiwgMjV9LCAgey03MiwgMjZ9LCAgey00OSwgMjd9LCAgey04MiwgMjh9LCAgey01MCwgMjl9LCAgIHstNjUsIDMwfSwKKyAgICAgey01NSwgLTg3fSwgey0xOSwgMzF9LCAgey02NywgMzJ9LCAgey0zNSwgLTQwfSwgezM0LCAzM30sICAgIHstNTIsIC03MX0sCisgICAgIHstNjYsIDM1fSwgIHstNzAsIDM2fSwgIHszOCwgMzd9LCAgIHstNTEsIC05N30sIHstODYsIC0xMDJ9LCB7LTMsIDM5fSwKKyAgICAgey0xMTgsIDQwfSwgezQyLCA0MX0sICAgey0yNCwgLTg1fSwgey01NCwgNDN9LCAgey0zOSwgNDR9LCAgIHstOTgsIC0xMTN9LAorICAgICB7LTM2LCAtMzd9LCB7LTIwLCAtNjl9LCB7LTQsIDQ1fSwgICB7LTUsIDQ2fSwgICB7LTIxLCAwfSwgICAgezAsIDB9LAorICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICAgezAsIDB9LAorICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICAgezAsIDB9LAorICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH19fTsKK3N0YXRpYyBjb25zdCBIVUZGX0lDQ19OT0RfMkQgRkRLX2h1ZmZJQ0NOb2Rlc19oMkRfMV8xID0geworICAgIHt7LTEsIDF9LCB7LTE4LCAyfSwgey0yLCAtMTd9fSwKKyAgICB7ey01MiwgMX0sCisgICAgIHstMSwgMn0sCisgICAgIHs0LCAzfSwKKyAgICAgey0yLCA1fSwKKyAgICAgey0xNywgLTE4fSwKKyAgICAgey01MSwgNn0sCisgICAgIHstMzYsIDd9LAorICAgICB7OSwgOH0sCisgICAgIHstMzUsIDEwfSwKKyAgICAgey0zLCAxMX0sCisgICAgIHstMTksIC0zNH0sCisgICAgIHstMzMsIDEyfSwKKyAgICAgey01MCwgMTN9LAorICAgICB7LTIwLCAxNH0sCisgICAgIHstNCwgLTQ5fX0sCisgICAge3syLCAxfSwgICAgey04NiwgM30sICAgey0xLCA0fSwgICAgezYsIDV9LCAgICAgey0xOCwgN30sICB7LTIsIC0xN30sCisgICAgIHs5LCA4fSwgICAgey03MCwgMTB9LCAgey02OSwgLTg1fSwgey0zNSwgMTF9LCAgezEzLCAxMn0sICB7LTM0LCAxNH0sCisgICAgIHstMTksIDE1fSwgey01MywgMTZ9LCAgey02OCwgMTd9LCAgey0zMywgMTh9LCAgey0zLCAtNTJ9LCB7MjAsIDE5fSwKKyAgICAgey01NCwgMjF9LCB7LTg0LCAyMn0sICB7LTUwLCAyM30sICB7LTIwLCAtNTF9LCB7LTM2LCAyNH0sIHsyNiwgMjV9LAorICAgICB7LTgzLCAyN30sIHstNCwgLTM4fSwgIHstNDksIDI4fSwgIHstMzcsIDI5fSwgIHstNjcsIDMwfSwgey01LCAzMX0sCisgICAgIHstMjEsIDMyfSwgey02NSwgLTY2fSwgey04MiwgMzN9LCAgey0yMiwgMzR9LCAgey02LCAtODF9fSwKKyAgICB7ezIsIDF9LCAgICAgey0xLCAtMTIwfSwgezQsIDN9LCAgICAgezYsIDV9LCAgICAgey0xOCwgN30sICAgIHs5LCA4fSwKKyAgICAgey0xNywgMTB9LCAgey0yLCAxMX0sICAgey0xMDMsIDEyfSwgey01MiwgMTN9LCAgey0zNSwgLTEwNH0sIHstMTE5LCAxNH0sCisgICAgIHsxNiwgMTV9LCAgIHstNjksIC04Nn0sIHsxOCwgMTd9LCAgIHstMzQsIDE5fSwgIHstMTksIDIwfSwgICB7MjIsIDIxfSwKKyAgICAgey03MCwgMjN9LCAgey04NywgMjR9LCAgey0xMDIsIDI1fSwgey04NSwgMjZ9LCAgey0zMywgMjd9LCAgIHstMzYsIDI4fSwKKyAgICAgey0zLCAyOX0sICAgey04OCwgMzB9LCAgey01MSwgMzF9LCAgey0xMTgsIDMyfSwgezM0LCAzM30sICAgIHstNjgsIDM1fSwKKyAgICAgey01MywgMzZ9LCAgey02NywgMzd9LCAgey0yMCwgMzh9LCAgey0xMDEsIDM5fSwgey01MCwgNDB9LCAgIHs0MiwgNDF9LAorICAgICB7LTM3LCA0M30sICB7LTExNiwgNDR9LCB7LTExNywgNDV9LCB7LTQ5LCA0Nn0sICB7LTIxLCAtMTAwfSwgezQ4LCA0N30sCisgICAgIHstNTUsIC03MX0sIHstNCwgNDl9LCAgIHstMjIsIC04NH0sIHstMTE1LCA1MH0sIHstNjYsIC04Mn0sICB7LTcyLCA1MX0sCisgICAgIHstNSwgLTZ9LCAgIHstNTQsIDUyfSwgIHstMzgsIDUzfSwgIHstODMsIDU0fSwgIHstNDAsIDU1fSwgICB7LTM5LCA1Nn0sCisgICAgIHstOTksIDU3fSwgIHstMjMsIC01Nn0sIHstNywgNTh9LCAgIHstNjUsIC05N30sIHstOCwgMH0sICAgICB7MCwgMH0sCisgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfX19OworCitjb25zdCBIVUZGX0lDQ19OT0RFUyBGREtfaHVmZklDQ05vZGVzID0geworICAgIHsmRkRLX2h1ZmZJQ0NOb2Rlc19oMURfMCwgJkZES19odWZmSUNDTm9kZXNfaDFEXzAsICZGREtfaHVmZklDQ05vZGVzX2gxRF8wfSwKKyAgICB7eyZGREtfaHVmZklDQ05vZGVzX2gyRF8wXzAsICZGREtfaHVmZklDQ05vZGVzX2gyRF8wXzF9LAorICAgICB7JkZES19odWZmSUNDTm9kZXNfaDJEXzFfMCwgJkZES19odWZmSUNDTm9kZXNfaDJEXzFfMX0sCisgICAgIHsmRkRLX2h1ZmZJQ0NOb2Rlc19oMkRfMF8xLCAmRkRLX2h1ZmZJQ0NOb2Rlc19oMkRfMF8xfX19OworCitzdGF0aWMgY29uc3QgSFVGRl9DTERfTk9EXzFEIEZES19odWZmQ0xETm9kZXNfaDFEXzAgPSB7CisgICAge3stMSwgMX0sICAgey0yLCAyfSwgICB7LTMsIDN9LCAgICB7LTQsIDR9LCAgICB7LTUsIDV9LCAgICB7LTYsIDZ9LAorICAgICB7LTcsIDd9LCAgIHstOCwgOH0sICAgey05LCA5fSwgICAgey0xMCwgMTB9LCAgey0xMSwgMTF9LCAgey0xMiwgMTJ9LAorICAgICB7LTEzLCAxM30sIHsxNSwgMTR9LCAgey0xNCwgMTZ9LCAgey0xNSwgMTd9LCAgey0xNiwgMTh9LCAgey0xNywgMTl9LAorICAgICB7LTE4LCAyMH0sIHstMTksIDIxfSwgey0yMCwgLTIxfSwgey0yMywgMjJ9LCAgey0yMiwgMjN9LCAgey0yNCwgMjR9LAorICAgICB7LTI1LCAyNX0sIHsyNywgMjZ9LCAgezI5LCAyOH0sICAgey0zMCwgLTMxfSwgey0yOCwgLTI5fSwgey0yNiwgLTI3fX19Oworc3RhdGljIGNvbnN0IEhVRkZfQ0xEX05PRF8xRCBGREtfaHVmZkNMRE5vZGVzX2gxRF8xID0geworICAgIHt7LTEsIDF9LCAgIHstMiwgMn0sICAgIHstMywgM30sICAgey00LCA0fSwgICAgey01LCA1fSwgICAgey02LCA2fSwKKyAgICAgey03LCA3fSwgICB7OSwgOH0sICAgICB7LTgsIDEwfSwgIHstOSwgMTF9LCAgIHstMTAsIDEyfSwgIHstMTEsIDEzfSwKKyAgICAgey0xMiwgMTR9LCB7LTEzLCAxNX0sICB7LTE0LCAxNn0sIHstMTUsIDE3fSwgIHstMTYsIDE4fSwgIHstMTcsIDE5fSwKKyAgICAgey0xOCwgMjB9LCB7LTE5LCAtMjB9LCB7LTIxLCAyMX0sIHstMjIsIDIyfSwgIHstMjMsIDIzfSwgIHsyNSwgMjR9LAorICAgICB7LTI0LCAyNn0sIHstMjUsIDI3fSwgIHsyOSwgMjh9LCAgey0yNiwgLTMxfSwgey0yOSwgLTMwfSwgey0yNywgLTI4fX19OworCitzdGF0aWMgY29uc3QgSFVGRl9DTERfTk9EXzJEIEZES19odWZmQ0xETm9kZXNfaDJfMF8wID0geworICAgIHt7MiwgMX0sCisgICAgIHstMSwgLTUyfSwKKyAgICAgezQsIDN9LAorICAgICB7LTIsIDV9LAorICAgICB7LTUxLCA2fSwKKyAgICAgey0xNywgLTE4fSwKKyAgICAgezgsIDd9LAorICAgICB7MTAsIDl9LAorICAgICB7LTMsIC0zNn0sCisgICAgIHstMTksIDExfSwKKyAgICAgey0zNSwgLTUwfSwKKyAgICAgey0zNCwgMTJ9LAorICAgICB7LTQsIDEzfSwKKyAgICAgey0zMywgMTR9LAorICAgICB7LTIwLCAtNDl9fSwKKyAgICB7ezIsIDF9LCAgICAgezQsIDN9LCAgICAgey04NiwgNX0sICB7NywgNn0sICAgIHs5LCA4fSwgICAgIHstMSwgLTJ9LAorICAgICB7LTg1LCAxMH0sICB7LTE4LCAxMX0sICB7LTE3LCAxMn0sIHsxNCwgMTN9LCAgey03MCwgMTV9LCAgezE3LCAxNn0sCisgICAgIHstMTksIC02OX0sIHstODQsIDE4fSwgIHstMywgMTl9LCAgezIxLCAyMH0sICB7LTM0LCAtNjh9LCB7LTIwLCAyMn0sCisgICAgIHstMzUsIDIzfSwgIHstODMsIDI0fSwgIHstMzMsIDI1fSwgey00LCAyNn0sICB7LTUzLCAyN30sICB7LTU0LCAtNjd9LAorICAgICB7LTM2LCAyOH0sICB7LTIxLCAtNTJ9LCB7LTgyLCAyOX0sIHstNSwgLTUwfSwgey01MSwgMzB9LCAgey0zOCwgMzF9LAorICAgICB7LTM3LCAtNDl9LCB7LTYsIDMyfSwgICB7LTY2LCAzM30sIHstNjUsIDM0fSwgey0yMiwgLTgxfX0sCisgICAge3syLCAxfSwgICAgICB7NCwgM30sICAgICAgey0xMjAsIDV9LCAgezcsIDZ9LCAgICAgIHs5LCA4fSwgICAgIHsxMSwgMTB9LAorICAgICB7LTEsIDEyfSwgICAgey0xOCwgLTExOX0sIHstMiwgMTN9LCAgIHsxNSwgMTR9LCAgICB7LTE3LCAxNn0sICB7LTEwNCwgMTd9LAorICAgICB7MTksIDE4fSwgICAgey0xOSwgMjB9LCAgIHstMTAzLCAyMX0sIHstMTE4LCAyMn0sICB7MjQsIDIzfSwgICB7LTMsIDI1fSwKKyAgICAgezI3LCAyNn0sICAgIHstMzQsIDI4fSwgICB7LTEwMiwgMjl9LCB7LTIwLCAzMH0sICAgey0zNSwgMzF9LCAgezMzLCAzMn0sCisgICAgIHstMTE3LCAzNH0sICB7LTMzLCAzNX0sICAgey04OCwgMzZ9LCAgey00LCAzN30sICAgIHstODcsIDM4fSwgIHs0MCwgMzl9LAorICAgICB7LTM2LCAtMTAxfSwgey04NiwgNDF9LCAgIHstMjEsIC0zN30sIHstODUsIC0xMDB9LCB7LTUyLCA0Mn0sICB7LTIyLCA0M30sCisgICAgIHstMTE2LCA0NH0sICB7LTUwLCA0NX0sICAgezQ3LCA0Nn0sICAgey01LCAtNTF9LCAgIHstMTE1LCA0OH0sIHstNzAsIDQ5fSwKKyAgICAgey04NCwgNTB9LCAgIHstMzgsIC00OX0sICB7LTcyLCAtOTl9LCB7LTUzLCA1MX0sICAgey02OSwgLTcxfSwgey0yMywgNTJ9LAorICAgICB7LTYsIC02N30sICAgey0xMTQsIDUzfSwgIHstNywgNTR9LCAgIHstNjYsIC02OH0sICB7LTU1LCA1NX0sICB7NTcsIDU2fSwKKyAgICAgey01NCwgLTY1fSwgIHstOCwgLTU2fSwgICB7LTgyLCAtODN9LCB7NTksIDU4fSwgICAgey0zOSwgLTQwfSwgey04MSwgNjB9LAorICAgICB7LTk4LCA2MX0sICAgey05NywgNjJ9LCAgIHstMjQsIC0xMTN9fSwKKyAgICB7ezIsIDF9LCAgICAgIHs0LCAzfSwgICAgICB7NiwgNX0sICAgICAgey0xNTQsIDd9LCAgICB7OSwgOH0sCisgICAgIHsxMSwgMTB9LCAgICB7MTMsIDEyfSwgICAgezE1LCAxNH0sICAgIHstMTgsIDE2fSwgICAgey0xNTMsIDE3fSwKKyAgICAgey0xLCAtMn0sICAgIHsxOSwgMTh9LCAgICB7LTEzOCwgMjB9LCAgey0xNywgMjF9LCAgICB7MjMsIDIyfSwKKyAgICAgezI1LCAyNH0sICAgIHstMTksIC0xMzd9LCB7MjcsIDI2fSwgICAgey0xNTIsIDI4fSwgICB7MzAsIDI5fSwKKyAgICAgey0zLCAtMzR9LCAgIHszMiwgMzF9LCAgICB7MzQsIDMzfSwgICAgezM2LCAzNX0sICAgICB7LTEzNiwgMzd9LAorICAgICB7LTM1LCAzOH0sICAgey0yMCwgMzl9LCAgIHstMTIyLCA0MH0sICB7LTE1MSwgNDF9LCAgIHstMzMsIDQyfSwKKyAgICAgey0xMjEsIDQzfSwgIHs0NSwgNDR9LCAgICB7NDcsIDQ2fSwgICAgey00LCA0OH0sICAgICB7LTM2LCAtMTIwfSwKKyAgICAgey0xMzUsIDQ5fSwgIHs1MSwgNTB9LCAgICB7LTIxLCA1Mn0sICAgezU0LCA1M30sICAgICB7NTYsIDU1fSwKKyAgICAgey01MCwgLTE1MH0sIHs1OCwgNTd9LCAgICB7LTUxLCA1OX0sICAgezYxLCA2MH0sICAgICB7LTExOSwgNjJ9LAorICAgICB7LTUyLCA2M30sICAgey01LCA2NH0sICAgIHstMzcsIDY1fSwgICB7LTExNywgLTEzNH0sIHstMzksIC01NH0sCisgICAgIHstMjIsIDY2fSwgICB7LTEwNiwgNjd9LCAgey02OSwgLTEwMn0sIHstMTMyLCA2OH0sICAgey0xMDUsIDY5fSwKKyAgICAgey00OSwgNzB9LCAgIHstMTQ5LCA3MX0sICB7LTI0LCAtMTA0fSwgezczLCA3Mn0sICAgICB7LTUzLCA3NH0sCisgICAgIHstMzgsIC0xMTh9LCB7LTEwMywgNzV9LCAgey02LCA3Nn0sICAgIHstNjYsIC04N30sICAgey0xMzMsIC0xNDd9LAorICAgICB7LTIzLCA3N30sICAgey02NywgNzh9LCAgIHstNjgsIC04Nn0sICB7LTcwLCAtMTAxfSwgIHstNDAsIC0xNDh9LAorICAgICB7LTExNiwgNzl9LCAgey01NSwgODB9LCAgIHstODQsIC0xMzF9LCB7ODIsIDgxfSwgICAgIHstODksIC05MH0sCisgICAgIHstNywgLTI1fSwgICB7LTg1LCAtODh9LCAgey02NSwgODN9LCAgIHstNzIsIC0xNDZ9LCAgezg1LCA4NH0sCisgICAgIHstOSwgLTcxfSwgICB7LTgzLCA4Nn0sICAgey04MiwgODd9LCAgIHstOCwgODh9LCAgICAgey0xMDAsIDg5fSwKKyAgICAgey03NCwgLTk5fSwgIHstNzMsIDkwfSwgICB7LTEwLCAtODF9LCAgey01NiwgOTF9LCAgICB7LTU3LCAtOTh9LAorICAgICB7OTMsIDkyfSwgICAgey01OCwgLTExNH0sIHstOTcsIC0xMTV9LCB7OTUsIDk0fSwgICAgIHstNDEsIDk2fSwKKyAgICAgey00MiwgOTd9LCAgIHstMjYsIC0xMjl9LCB7LTExMywgOTh9LCAgey0xMzAsIC0xNDV9fX07CitzdGF0aWMgY29uc3QgSFVGRl9DTERfTk9EXzJEIEZES19odWZmQ0xETm9kZXNfaDJfMF8xID0geworICAgIHt7LTEsIDF9LAorICAgICB7LTUyLCAyfSwKKyAgICAgey0xNywgM30sCisgICAgIHs1LCA0fSwKKyAgICAgey0zNiwgNn0sCisgICAgIHstMzMsIDd9LAorICAgICB7LTIsIC0xOH0sCisgICAgIHstMjAsIDh9LAorICAgICB7MTAsIDl9LAorICAgICB7LTM0LCAtNDl9LAorICAgICB7LTUxLCAxMX0sCisgICAgIHstMzUsIDEyfSwKKyAgICAgey0xOSwgMTN9LAorICAgICB7LTMsIDE0fSwKKyAgICAgey00LCAtNTB9fSwKKyAgICB7ezIsIDF9LCAgICB7NCwgM30sICAgICB7LTg2LCA1fSwgIHstMSwgNn0sICAgey0xNywgN30sICAgey03MCwgOH0sCisgICAgIHsxMCwgOX0sICAgey0xOCwgMTF9LCAgey0zMywgMTJ9LCB7LTU0LCAxM30sIHstMiwgMTR9LCAgIHstMzQsIDE1fSwKKyAgICAgey0zOCwgMTZ9LCB7LTQ5LCAxN30sICB7LTg1LCAxOH0sIHstNTAsIDE5fSwgey02OSwgMjB9LCAgey01MywgLTY1fSwKKyAgICAgey0yMiwgMjF9LCB7LTY2LCAyMn0sICB7LTE5LCAyM30sIHstMzcsIDI0fSwgey0zNSwgLTgxfSwgey0zLCAyNX0sCisgICAgIHstNTEsIDI2fSwgey02OCwgLTg0fSwgey01MiwgMjd9LCB7MjksIDI4fSwgIHstMjAsIDMwfSwgIHstNCwgLTM2fSwKKyAgICAgey04MywgMzF9LCB7LTY3LCAzMn0sICB7LTIxLCAzM30sIHstNSwgMzR9LCAgey02LCAtODJ9fSwKKyAgICB7ezIsIDF9LCAgICAgezQsIDN9LCAgICAgezYsIDV9LCAgICAgey0xMjAsIDd9LCAgey0xNywgOH0sICAgey0xLCAtMTA0fSwKKyAgICAgezEwLCA5fSwgICAgezEyLCAxMX0sICAgey0xOCwgMTN9LCAgey0zMywgLTg4fSwgezE1LCAxNH0sICAgezE3LCAxNn0sCisgICAgIHstMiwgMTh9LCAgIHstMzQsIDE5fSwgIHstNzIsIDIwfSwgIHstNDksIDIxfSwgIHstMTE5LCAyMn0sIHstNTAsIDIzfSwKKyAgICAgey0xMDMsIDI0fSwgey01NiwgMjV9LCAgey02NSwgMjZ9LCAgezI4LCAyN30sICAgey00MCwgLTg3fSwgey02NiwgMjl9LAorICAgICB7LTgyLCAzMH0sICB7MzIsIDMxfSwgICB7LTE5LCAtODF9LCB7LTcxLCAzM30sICB7LTk3LCAzNH0sICB7LTM1LCAtNTV9LAorICAgICB7LTI0LCAzNX0sICB7MzcsIDM2fSwgICB7LTMsIC05OH0sICB7LTUxLCAzOH0sICB7LTY3LCAzOX0sICB7LTM5LCAtMTE4fSwKKyAgICAgey0xMTMsIDQwfSwgey0xMDIsIDQxfSwgey04NiwgNDJ9LCAgey03MCwgLTgzfSwgezQ0LCA0M30sICAgey0yMCwgLTU0fSwKKyAgICAgey01MiwgNDV9LCAgey0zNiwgNDZ9LCAgey00LCA0N30sICAgey02OCwgNDh9LCAgey04NSwgNDl9LCAgey0xMDEsIC0xMTd9LAorICAgICB7LTY5LCA1MH0sICB7NTIsIDUxfSwgICB7LTIxLCAtMzd9LCB7LTUzLCA1M30sICB7NTUsIDU0fSwgICB7LTUsIC0xMDB9LAorICAgICB7LTExNiwgNTZ9LCB7LTg0LCA1N30sICB7LTM4LCA1OH0sICB7LTIyLCAtOTl9LCB7LTExNSwgNTl9LCB7LTYsIDYwfSwKKyAgICAgey0yMywgNjF9LCAgey03LCA2Mn0sICAgey0xMTQsIDB9fSwKKyAgICB7ezIsIDF9LCAgICAgIHs0LCAzfSwgICAgICAgezYsIDV9LCAgICAgICB7LTE1NCwgN30sICAgIHs5LCA4fSwKKyAgICAgey0xNywgMTB9LCAgIHstMTM4LCAxMX0sICAgey0xLCAxMn0sICAgICB7MTQsIDEzfSwgICAgIHsxNiwgMTV9LAorICAgICB7LTMzLCAtMTIyfSwgey0xOCwgMTd9LCAgICB7MTksIDE4fSwgICAgIHstMzQsIDIwfSwgICAgey0yLCAyMX0sCisgICAgIHstMTA2LCAyMn0sICB7LTQ5LCAyM30sICAgIHsyNSwgMjR9LCAgICAgey01MCwgMjZ9LCAgICB7LTE1MywgMjd9LAorICAgICB7LTkwLCAyOH0sICAgey0xMzcsIDI5fSwgICB7LTY1LCAzMH0sICAgIHszMiwgMzF9LCAgICAgey02NiwgMzN9LAorICAgICB7LTEyMSwgMzR9LCAgey03NCwgMzV9LCAgICB7LTgxLCAzNn0sICAgIHszOCwgMzd9LCAgICAgey00MiwgMzl9LAorICAgICB7LTgyLCA0MH0sICAgey0xMDUsIDQxfSwgICB7LTE5LCAtMTE0fSwgIHstNTgsIDQyfSwgICAgey0zNSwgNDN9LAorICAgICB7LTk3LCA0NH0sICAgezQ2LCA0NX0sICAgICB7LTEyOSwgNDd9LCAgIHstMjYsIC04OX0sICAgey01NywgLTk4fSwKKyAgICAgey01MSwgNDh9LCAgIHstMywgNDl9LCAgICAgey0xMTMsIDUwfSwgICB7LTEzMCwgNTF9LCAgIHstMTUyLCA1Mn0sCisgICAgIHstNjcsIC03M30sICB7LTk5LCAtMTM2fSwgIHstMTQ1LCA1M30sICAgey0xMjAsIDU0fSwgICB7LTQxLCA1NX0sCisgICAgIHstODMsIDU2fSwgICB7LTcyLCA1N30sICAgIHstMTA0LCA1OH0sICAgey0xMTUsIDU5fSwgICB7LTIwLCA2MH0sCisgICAgIHs2MiwgNjF9LCAgICB7LTM2LCAtODh9LCAgIHstODQsIDYzfSwgICAgey01MiwgLTU2fSwgICB7NjUsIDY0fSwKKyAgICAgey00LCAtODd9LCAgIHstNjgsIDY2fSwgICAgey0xNTEsIDY3fSwgICB7LTEwMCwgLTEzNX0sIHs2OSwgNjh9LAorICAgICB7LTY5LCAtMTE5fSwgey0xMDMsIDcwfSwgICB7LTcxLCA3MX0sICAgIHs3MywgNzJ9LCAgICAgey0yMSwgNzR9LAorICAgICB7LTg1LCA3NX0sICAgey0zNywgLTUzfSwgICB7LTg2LCA3Nn0sICAgIHs3OCwgNzd9LCAgICAgey0xMDIsIC0xNTB9LAorICAgICB7LTUsIDc5fSwgICAgey0xMzQsIDgwfSwgICB7LTExOCwgODF9LCAgIHstNTQsIC0xMTd9LCAgezgzLCA4Mn0sCisgICAgIHstMzgsIC03MH0sICB7LTIyLCA4NH0sICAgIHstNiwgODV9LCAgICAgezg3LCA4Nn0sICAgICB7LTU1LCA4OH0sCisgICAgIHstMTAxLCA4OX0sICB7LTEzMywgLTE0OX0sIHstMjQsIC0zOX0sICAgezkxLCA5MH0sICAgICB7LTEzMiwgOTJ9LAorICAgICB7LTIzLCA5M30sICAgey03LCA5NH0sICAgICB7LTE0NywgLTE0OH0sIHstMTE2LCAtMTMxfSwgey0yNSwgOTV9LAorICAgICB7LTQwLCAwfSwgICAgezAsIDB9LCAgICAgICB7MCwgMH0sICAgICAgIHswLCAwfX19Oworc3RhdGljIGNvbnN0IEhVRkZfQ0xEX05PRF8yRCBGREtfaHVmZkNMRE5vZGVzX2gyXzFfMCA9IHsKKyAgICB7ey0xLCAxfSwKKyAgICAgey01MiwgMn0sCisgICAgIHstMTcsIDN9LAorICAgICB7NSwgNH0sCisgICAgIHstMiwgLTM2fSwKKyAgICAgey0xOCwgNn0sCisgICAgIHs4LCA3fSwKKyAgICAgey01MSwgOX0sCisgICAgIHstMzMsIDEwfSwKKyAgICAgey0zNCwgMTF9LAorICAgICB7LTIwLCAtMzV9LAorICAgICB7LTE5LCAxMn0sCisgICAgIHstMywgMTN9LAorICAgICB7LTQ5LCAxNH0sCisgICAgIHstNCwgLTUwfX0sCisgICAge3syLCAxfSwgICAgIHstODYsIDN9LCAgIHstMSwgNH0sICAgey0xNywgNX0sICAgezcsIDZ9LCAgICB7LTcwLCA4fSwKKyAgICAgey0yLCAtMTh9LCAgezEwLCA5fSwgICAgezEyLCAxMX0sICB7LTg1LCAxM30sICB7LTMzLCAxNH0sIHstMzQsIC01NH0sCisgICAgIHsxNiwgMTV9LCAgIHstNjksIDE3fSwgIHsxOSwgMTh9LCAgey01MCwgLTUzfSwgey0xOSwgMjB9LCB7LTM4LCAyMX0sCisgICAgIHstMzUsIC00OX0sIHstMywgMjJ9LCAgIHsyNCwgMjN9LCAgey02OCwgMjV9LCAgey04NCwgMjZ9LCB7LTY1LCAyN30sCisgICAgIHstNTEsIC02Nn0sIHstMjIsIC0zN30sIHstNTIsIDI4fSwgey0yMCwgMjl9LCAgey0zNiwgMzB9LCB7LTgxLCAzMX0sCisgICAgIHstNCwgLTgzfSwgIHstNjcsIDMyfSwgIHstMjEsIDMzfSwgey01LCAzNH0sICAgey02LCAtODJ9fSwKKyAgICB7ezIsIDF9LCAgICAgey0xMjAsIDN9LCAgIHstMSwgNH0sICAgICB7NiwgNX0sICAgICAgey0xNywgN30sICAgey0xMDQsIDh9LAorICAgICB7LTE4LCA5fSwgICB7LTIsIDEwfSwgICAgezEyLCAxMX0sICAgIHsxNCwgMTN9LCAgICB7LTExOSwgMTV9LCB7LTMzLCAxNn0sCisgICAgIHstMzQsIC04OH0sIHstMTAzLCAxN30sICB7MTksIDE4fSwgICAgezIxLCAyMH0sICAgIHsyMywgMjJ9LCAgIHsyNSwgMjR9LAorICAgICB7LTE5LCAtNzJ9LCB7LTUwLCAyNn0sICAgey00OSwgMjd9LCAgIHstODcsIDI4fSwgICB7MzAsIDI5fSwgICB7MzIsIDMxfSwKKyAgICAgey0zLCAtMzV9LCAgezM0LCAzM30sICAgIHstNTYsIDM1fSwgICB7LTY1LCAtNjZ9LCAgey00MCwgMzZ9LCAgey04MiwgLTExOH0sCisgICAgIHstNzEsIDM3fSwgIHstNTUsIDM4fSwgICB7LTY3LCAtMTAyfSwgey01MSwgMzl9LCAgIHstNzAsIDQwfSwgIHs0MiwgNDF9LAorICAgICB7LTgxLCA0M30sICB7LTg2LCA0NH0sICAgey01MiwgLTk3fSwgIHstOTgsIDQ1fSwgICB7LTI0LCAtMzl9LCB7LTIwLCA0Nn0sCisgICAgIHstNTQsIC04M30sIHstMzYsIDQ3fSwgICB7LTg1LCA0OH0sICAgey02OCwgNDl9LCAgIHstNCwgNTB9LCAgIHstNjksIC0xMTN9LAorICAgICB7LTExNywgNTF9LCB7LTM3LCAtMTAxfSwgey01MywgNTJ9LCAgIHstMjEsIDUzfSwgICB7NTUsIDU0fSwgICB7LTg0LCAtMTAwfSwKKyAgICAgey01LCA1Nn0sICAgey0xMTYsIDU3fSwgIHstMjIsIDU4fSwgICB7LTM4LCAtMTE1fSwgezYwLCA1OX0sICAgey02LCAtOTl9LAorICAgICB7LTIzLCA2MX0sICB7LTExNCwgNjJ9LCAgey03LCAtOH19LAorICAgIHt7MiwgMX0sICAgICB7LTE1NCwgM30sICAgIHs1LCA0fSwgICAgICB7LTEsIDZ9LCAgICAgIHs4LCA3fSwKKyAgICAgey0xNywgOX0sICAgey0xMzgsIDEwfSwgICB7LTE4LCAxMX0sICAgey0yLCAxMn0sICAgICB7MTQsIDEzfSwKKyAgICAgezE2LCAxNX0sICAgey0xNTMsIDE3fSwgICB7LTM0LCAxOH0sICAgey0zMywgLTEyMn0sICB7MjAsIDE5fSwKKyAgICAgezIyLCAyMX0sICAgey0xMzcsIDIzfSwgICB7MjUsIDI0fSwgICAgezI3LCAyNn0sICAgICB7LTEwNiwgMjh9LAorICAgICB7MzAsIDI5fSwgICB7LTUwLCAzMX0sICAgIHstMTksIDMyfSwgICB7LTQ5LCAtMTIxfSwgIHszNCwgMzN9LAorICAgICB7MzYsIDM1fSwgICB7LTM1LCAzN30sICAgIHstOTAsIDM4fSwgICB7LTY2LCAzOX0sICAgIHstMywgNDB9LAorICAgICB7NDIsIDQxfSwgICB7LTY1LCA0M30sICAgIHstMTA1LCA0NH0sICB7NDYsIDQ1fSwgICAgIHstNzQsIDQ3fSwKKyAgICAgey01MSwgNDh9LCAgey04MiwgLTE1Mn0sICB7LTEzNiwgNDl9LCAgey04MSwgNTB9LCAgICB7LTQyLCAtODl9LAorICAgICB7LTExNCwgNTF9LCB7NTMsIDUyfSwgICAgIHstNTcsIC01OH0sICB7LTEyMCwgNTR9LCAgIHstOTgsIDU1fSwKKyAgICAgey02NywgNTZ9LCAgey05NywgNTd9LCAgICB7NTksIDU4fSwgICAgey05OSwgNjB9LCAgICB7LTczLCAtMTA0fSwKKyAgICAgey03MiwgNjF9LCAgey0xMTMsIDYyfSwgICB7LTIwLCAtODN9LCAgey04NCwgLTEzMH0sICB7LTM2LCA2M30sCisgICAgIHstMjYsIDY0fSwgIHstNDEsIDY1fSwgICAgey01MiwgLTEyOX0sIHstODcsIC04OH0sICAgezY3LCA2Nn0sCisgICAgIHstMTE1LCA2OH0sIHstNjgsIDY5fSwgICAgey01NiwgLTY5fSwgIHstNCwgLTEwMH0sICAgey0xNTEsIDcwfSwKKyAgICAgey0xMzUsIDcxfSwgey0xMDMsIC0xMTl9LCB7NzMsIDcyfSwgICAgey03MSwgLTE0NX0sICB7LTEwMiwgNzR9LAorICAgICB7NzYsIDc1fSwgICB7LTUzLCAtODV9LCAgIHstMzcsIDc3fSwgICB7LTIxLCAtODZ9LCAgIHs3OSwgNzh9LAorICAgICB7LTUsIDgwfSwgICB7LTU0LCAtMTM0fSwgIHstMTUwLCA4MX0sICB7LTExOCwgODJ9LCAgIHstNzAsIDgzfSwKKyAgICAgey0xMTcsIDg0fSwgey0yMiwgLTM4fSwgICB7LTEwMSwgODV9LCAgey01NSwgODZ9LCAgICB7LTE0OSwgODd9LAorICAgICB7LTM5LCA4OH0sICB7LTEzMywgODl9LCAgIHstNiwgOTB9LCAgICB7LTExNiwgOTF9LCAgIHstMjQsIDkyfSwKKyAgICAgey03LCAtMTMyfSwgey0yMywgOTN9LCAgICB7LTQwLCA5NH0sICAgey0xMzEsIC0xNDh9LCB7LTI1LCA5NX0sCisgICAgIHstMTQ3LCA5Nn0sIHstMTQ2LCA5N30sICAgey04LCAwfSwgICAgIHswLCAwfX19Oworc3RhdGljIGNvbnN0IEhVRkZfQ0xEX05PRF8yRCBGREtfaHVmZkNMRE5vZGVzX2gyXzFfMSA9IHsKKyAgICB7ey0xLCAxfSwKKyAgICAgey01MiwgMn0sCisgICAgIHs0LCAzfSwKKyAgICAgey0yLCA1fSwKKyAgICAgey0xNywgNn0sCisgICAgIHstMTgsIDd9LAorICAgICB7LTM2LCAtNTF9LAorICAgICB7OSwgOH0sCisgICAgIHstMzUsIDEwfSwKKyAgICAgey0zNCwgMTF9LAorICAgICB7LTE5LCAtMzN9LAorICAgICB7LTMsIDEyfSwKKyAgICAgey0yMCwgMTN9LAorICAgICB7LTUwLCAxNH0sCisgICAgIHstNCwgLTQ5fX0sCisgICAge3syLCAxfSwgICAgey04NiwgM30sICAgezUsIDR9LCAgICAgey0xLCA2fSwgICB7OCwgN30sICAgIHstMTcsIC0xOH0sCisgICAgIHstMiwgOX0sICAgey03MCwgMTB9LCAgey04NSwgMTF9LCAgezEzLCAxMn0sICB7LTY5LCAxNH0sIHstMzQsIDE1fSwKKyAgICAgezE3LCAxNn0sICB7LTE5LCAxOH0sICB7LTMzLCAtMzV9LCB7LTU0LCAxOX0sIHstNTMsIDIwfSwgey0zLCAyMX0sCisgICAgIHstNjgsIDIyfSwgey04NCwgMjN9LCAgey01MCwgMjR9LCAgey01MiwgMjV9LCB7LTUxLCAyNn0sIHstMjAsIC0zNn0sCisgICAgIHstNDksIDI3fSwgey0zOCwgMjh9LCAgey0zNywgMjl9LCAgey00LCAtODN9LCB7LTY3LCAzMH0sIHstNjYsIDMxfSwKKyAgICAgey0yMSwgMzJ9LCB7LTIyLCAtNjV9LCB7LTUsIDMzfSwgICB7LTgyLCAzNH0sIHstNiwgLTgxfX0sCisgICAge3syLCAxfSwgICAgIHs0LCAzfSwgICAgICB7LTEyMCwgNX0sICAgezcsIDZ9LCAgICAgIHs5LCA4fSwgICAgIHstMSwgMTB9LAorICAgICB7LTE4LCAxMX0sICB7LTE3LCAxMn0sICAgey0yLCAtMTA0fSwgIHstMTE5LCAxM30sICB7MTUsIDE0fSwgICB7LTEwMywgMTZ9LAorICAgICB7MTgsIDE3fSwgICB7LTM0LCAxOX0sICAgey0xOSwgMjB9LCAgIHsyMiwgMjF9LCAgICB7LTM1LCAyM30sICB7LTMzLCAyNH0sCisgICAgIHstODgsIDI1fSwgIHstODcsIDI2fSwgICB7MjgsIDI3fSwgICAgey0zLCAtMTAyfSwgIHstODYsIDI5fSwgIHstNTIsIC0xMTh9LAorICAgICB7MzEsIDMwfSwgICB7LTUwLCAzMn0sICAgey01MSwgMzN9LCAgIHstNzAsIDM0fSwgICB7LTM2LCAzNX0sICB7LTg1LCAzNn0sCisgICAgIHstMjAsIDM3fSwgIHszOSwgMzh9LCAgICB7LTY5LCAtNzF9LCAgey03MiwgNDB9LCAgIHstNDksIC02N30sIHs0MiwgNDF9LAorICAgICB7LTY4LCA0M30sICB7LTQsIC0xMDF9LCAgey01MywgLTExN30sIHstMzcsIDQ0fSwgICB7LTY2LCA0NX0sICB7LTU1LCA0Nn0sCisgICAgIHs0OCwgNDd9LCAgIHstNTQsIDQ5fSwgICB7LTIxLCA1MH0sICAgey04NCwgLTEwMH0sIHstNTYsIC02NX0sIHs1MiwgNTF9LAorICAgICB7LTgyLCAtODN9LCB7NTQsIDUzfSwgICAgey01LCAtMTE2fSwgIHstMjIsIDU1fSwgICB7LTM4LCA1Nn0sICB7LTM5LCAtNDB9LAorICAgICB7NTgsIDU3fSwgICB7LTgxLCAtMTE1fSwgey05OCwgLTk5fSwgIHstNiwgNTl9LCAgICB7LTIzLCA2MH0sICB7LTI0LCA2MX0sCisgICAgIHstNywgLTk3fSwgIHstMTE0LCA2Mn0sICB7LTgsIC0xMTN9fSwKKyAgICB7ezIsIDF9LCAgICAgICB7NCwgM30sICAgICAgey0xNTQsIDV9LCAgICB7NywgNn0sICAgICAgezksIDh9LAorICAgICB7MTEsIDEwfSwgICAgIHstMSwgMTJ9LCAgICB7LTE4LCAxM30sICAgIHstMTcsIDE0fSwgICB7LTIsIC0xMzh9LAorICAgICB7MTYsIDE1fSwgICAgIHstMTUzLCAxN30sICB7LTEzNywgMTh9LCAgIHsyMCwgMTl9LCAgICB7MjIsIDIxfSwKKyAgICAgey0zNCwgMjN9LCAgICB7LTE5LCAyNH0sICAgey0zNSwgMjV9LCAgICB7MjcsIDI2fSwgICAgezI5LCAyOH0sCisgICAgIHstMTIxLCAzMH0sICAgey0xMjAsIDMxfSwgIHstMTM2LCAzMn0sICAgey0zMywgLTEyMn0sIHszNCwgMzN9LAorICAgICB7LTE1MiwgMzV9LCAgIHstMywgMzZ9LCAgICB7LTUxLCAzN30sICAgIHstNTIsIDM4fSwgICB7LTY5LCAzOX0sCisgICAgIHstMzYsIDQwfSwgICAgey01MCwgNDF9LCAgIHs0MywgNDJ9LCAgICAgey0yMCwgNDR9LCAgIHstMTA0LCA0NX0sCisgICAgIHstMTAzLCA0Nn0sICAgey04NywgNDd9LCAgIHstMTE5LCA0OH0sICAgey0xMDUsIDQ5fSwgIHstODYsIDUwfSwKKyAgICAgey0xMDIsIDUxfSwgICB7LTEwNiwgNTJ9LCAgey00OSwgLTEzNX0sICB7LTY4LCA1M30sICAgezU1LCA1NH0sCisgICAgIHstNTMsIDU2fSwgICAgey02NywgLTE1MX0sIHstNCwgNTd9LCAgICAgey04NCwgNTh9LCAgIHstODUsIDU5fSwKKyAgICAgey02NiwgNjB9LCAgICB7LTM3LCA2MX0sICAgey03MCwgNjJ9LCAgICB7LTU0LCAtODh9LCAgey0yMSwgNjN9LAorICAgICB7NjUsIDY0fSwgICAgIHstODksIDY2fSwgICB7LTExOCwgNjd9LCAgIHstNzIsIDY4fSwgICB7LTkwLCA2OX0sCisgICAgIHstNzEsIDcwfSwgICAgey02NSwgLTEzNH0sIHstMTUwLCA3MX0sICAgey04MywgNzJ9LCAgIHstNSwgNzN9LAorICAgICB7LTEwMSwgLTExN30sIHstODIsIDc0fSwgICB7NzYsIDc1fSwgICAgIHstOTksIDc3fSwgICB7LTM4LCA3OH0sCisgICAgIHstMTAwLCA3OX0sICAgey0yMiwgODB9LCAgIHstNzMsIDgxfSwgICAgey0zOSwgLTc0fSwgIHs4MywgODJ9LAorICAgICB7LTU1LCAtODF9LCAgIHstNTcsIDg0fSwgICB7LTEzMywgLTE0OX0sIHstNTYsIDg1fSwgICB7LTYsIDg2fSwKKyAgICAgey05OCwgODd9LCAgICB7LTEzMiwgODh9LCAgey0yMywgODl9LCAgICB7LTExNCwgOTB9LCAgey0xMTYsIDkxfSwKKyAgICAgey01OCwgLTExNX0sICB7LTI0LCA5Mn0sICAgey05NywgLTE0OH0sICB7LTQwLCAtNDF9LCAgey03LCAtNDJ9LAorICAgICB7LTE0NywgOTN9LCAgIHs5NSwgOTR9LCAgICB7LTEzMSwgOTZ9LCAgIHstOCwgLTEzMH0sICB7LTI1LCAtMTEzfSwKKyAgICAgey05LCA5N30sICAgICB7LTI2LCAtMTI5fSwgey0xNDYsIDk4fSwgICB7LTEwLCAtMTQ1fX19OworCitjb25zdCBIVUZGX0NMRF9OT0RFUyBGREtfaHVmZkNMRE5vZGVzID0geworICAgIHsmRkRLX2h1ZmZDTEROb2Rlc19oMURfMCwgJkZES19odWZmQ0xETm9kZXNfaDFEXzEsICZGREtfaHVmZkNMRE5vZGVzX2gxRF8xfSwKKyAgICB7eyZGREtfaHVmZkNMRE5vZGVzX2gyXzBfMCwgJkZES19odWZmQ0xETm9kZXNfaDJfMF8xfSwKKyAgICAgeyZGREtfaHVmZkNMRE5vZGVzX2gyXzFfMCwgJkZES19odWZmQ0xETm9kZXNfaDJfMV8xfSwKKyAgICAgeyZGREtfaHVmZkNMRE5vZGVzX2gyXzBfMSwgJkZES19odWZmQ0xETm9kZXNfaDJfMF8xfX19OworCitjb25zdCBIVUZGX1JFU19OT0RFUyBGREtfaHVmZlJlc2hhcGVOb2RlcyA9IHsKKyAgICB7ezIsIDF9LCAgICB7NCwgM30sICAgICB7NiwgNX0sICAgICB7LTMzLCA3fSwgIHstMTcsIDh9LCAgey00OSwgOX0sCisgICAgIHstMzQsIDEwfSwgezEyLCAxMX0sICAgey0xOCwgLTM1fSwgey01MCwgMTN9LCB7MTUsIDE0fSwgIHstNDAsIDE2fSwKKyAgICAgey0zNiwgMTd9LCB7LTE5LCAxOH0sICB7LTEsIC0zN30sICB7LTUxLCAxOX0sIHsyMSwgMjB9LCAgey0zOCwgLTY1fSwKKyAgICAgey0yLCAtMzl9LCB7LTIwLCAyMn0sICB7LTUyLCAyM30sICB7MjUsIDI0fSwgIHstMjEsIDI2fSwgey02NiwgMjd9LAorICAgICB7LTUzLCAyOH0sIHstMywgMjl9LCAgIHszMSwgMzB9LCAgIHstMjIsIDMyfSwgey01NCwgMzN9LCB7LTQsIDM0fSwKKyAgICAgey01NiwgMzV9LCB7LTI0LCAtNjd9LCB7LTIzLCAtNTV9LCB7LTgsIC03Mn0sIHstNSwgMzZ9LCAgey02OCwgMzd9LAorICAgICB7LTYsIDM4fSwgIHstNywgLTY5fSwgIHstNzAsIC03MX19fTsKKworY29uc3QgSFVGRl9JUERfTk9ERVMgRkRLX2h1ZmZJUEROb2RlcyA9IHsKKyAgICB7e3t7LTEsIDF9LCB7LTgsIDJ9LCB7LTIsIDN9LCB7NSwgNH0sIHstMywgLTd9LCB7LTYsIDZ9LCB7LTQsIC01fX19LAorICAgICB7e3stMSwgMX0sIHstMiwgMn0sIHstOCwgM30sIHstMywgNH0sIHstNywgNX0sIHstNCwgNn0sIHstNSwgLTZ9fX0sCisgICAgIHt7ey0xLCAxfSwgey04LCAyfSwgey0yLCAzfSwgezUsIDR9LCB7LTMsIC03fSwgey02LCA2fSwgey00LCAtNX19fX0sCisgICAge3t7e3stMSwgMX0sIHstMTgsIDJ9LCB7LTE3LCAwfX0sCisgICAgICAge3stMSwgMX0sCisgICAgICAgIHstMzYsIDJ9LAorICAgICAgICB7LTE4LCAzfSwKKyAgICAgICAgey0zNSwgNH0sCisgICAgICAgIHstNTIsIDV9LAorICAgICAgICB7NywgNn0sCisgICAgICAgIHstMzQsIDh9LAorICAgICAgICB7LTMzLCAtNDl9LAorICAgICAgICB7LTIwLCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfX0sCisgICAgICAge3stMSwgMX0sICAgIHszLCAyfSwgICAgezUsIDR9LCAgICAgey04NiwgNn0sICAgey02NiwgN30sICB7OSwgOH0sCisgICAgICAgIHsxMSwgMTB9LCAgIHstMTgsIDEyfSwgey01MSwgMTN9LCAgey0zNywgLTUyfSwgey02OSwgMTR9LCB7LTM4LCAxNX0sCisgICAgICAgIHstNTMsIDE2fSwgIHstMzUsIDE3fSwgey01MCwgLTcwfSwgey0yMiwgLTQ5fSwgey0zMywgMTh9LCB7LTE3LCAxOX0sCisgICAgICAgIHstMzQsIC02NX0sIHstODEsIDIwfSwgey01NCwgMH0sICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9fSwKKyAgICAgICB7ezIsIDF9LCAgICB7NCwgM30sICAgICAgIHstMSwgNX0sICAgIHstNjksIDZ9LCAgIHstMTIwLCA3fSwgey02OCwgOH0sCisgICAgICAgIHsxMCwgOX0sICAgezEyLCAxMX0sICAgICB7MTQsIDEzfSwgICB7LTUyLCAtNTR9LCB7LTE4LCAxNX0sIHstNzAsIDE2fSwKKyAgICAgICAgey02NywgMTd9LCB7MTksIDE4fSwgICAgIHstMTcsIDIwfSwgIHstMTEzLCAyMX0sIHsyMywgMjJ9LCAgey04MywgMjR9LAorICAgICAgICB7LTI0LCAyNX0sIHstMTAzLCAtMTA0fSwgey01MSwgLTU1fSwgezI3LCAyNn0sICAgey03MSwgMjh9LCB7LTg2LCAyOX0sCisgICAgICAgIHstMzUsIDMwfSwgey02NiwgMzF9LCAgICB7LTM5LCAtNTB9LCB7LTgyLCAtOTh9LCB7LTcyLCAzMn0sIHstNTYsIC04N30sCisgICAgICAgIHstMzQsIDMzfSwgey0zMywgLTg4fSwgICB7LTQwLCAtOTd9LCB7LTY1LCAzNH0sICB7LTQ5LCAzNX0sIHstODEsIDB9LAorICAgICAgICB7MCwgMH0sICAgIHswLCAwfSwgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICB7MCwgMH0sICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgIHswLCAwfSwgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgICB7MCwgMH19fSwKKyAgICAgIHt7ey0xLCAxfSwgey0xOCwgMn0sIHstMTcsIDB9fSwKKyAgICAgICB7ey0xLCAxfSwKKyAgICAgICAgey0zNiwgMn0sCisgICAgICAgIHstMTgsIDN9LAorICAgICAgICB7LTM1LCA0fSwKKyAgICAgICAgey01MiwgNX0sCisgICAgICAgIHs3LCA2fSwKKyAgICAgICAgey0zNCwgOH0sCisgICAgICAgIHstMzMsIC00OX0sCisgICAgICAgIHstMjAsIDB9LAorICAgICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9fSwKKyAgICAgICB7ey0xLCAxfSwgICAgezMsIDJ9LCAgICB7NSwgNH0sICAgICB7LTg2LCA2fSwgICB7LTY2LCA3fSwgIHs5LCA4fSwKKyAgICAgICAgezExLCAxMH0sICAgey0xOCwgMTJ9LCB7LTUxLCAxM30sICB7LTM3LCAtNTJ9LCB7LTY5LCAxNH0sIHstMzgsIDE1fSwKKyAgICAgICAgey01MywgMTZ9LCAgey0zNSwgMTd9LCB7LTUwLCAtNzB9LCB7LTIyLCAtNDl9LCB7LTMzLCAxOH0sIHstMTcsIDE5fSwKKyAgICAgICAgey0zNCwgLTY1fSwgey04MSwgMjB9LCB7LTU0LCAwfSwgICB7MCwgMH0sICAgICB7MCwgMH0sICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH19LAorICAgICAgIHt7MiwgMX0sICAgIHs0LCAzfSwgICAgICAgey0xLCA1fSwgICAgey02OSwgNn0sICAgey0xMjAsIDd9LCB7LTY4LCA4fSwKKyAgICAgICAgezEwLCA5fSwgICB7MTIsIDExfSwgICAgIHsxNCwgMTN9LCAgIHstNTIsIC01NH0sIHstMTgsIDE1fSwgey03MCwgMTZ9LAorICAgICAgICB7LTY3LCAxN30sIHsxOSwgMTh9LCAgICAgey0xNywgMjB9LCAgey0xMTMsIDIxfSwgezIzLCAyMn0sICB7LTgzLCAyNH0sCisgICAgICAgIHstMjQsIDI1fSwgey0xMDMsIC0xMDR9LCB7LTUxLCAtNTV9LCB7MjcsIDI2fSwgICB7LTcxLCAyOH0sIHstODYsIDI5fSwKKyAgICAgICAgey0zNSwgMzB9LCB7LTY2LCAzMX0sICAgIHstMzksIC01MH0sIHstODIsIC05OH0sIHstNzIsIDMyfSwgey01NiwgLTg3fSwKKyAgICAgICAgey0zNCwgMzN9LCB7LTMzLCAtODh9LCAgIHstNDAsIC05N30sIHstNjUsIDM0fSwgIHstNDksIDM1fSwgey04MSwgMH0sCisgICAgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICB7MCwgMH0sICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgIHswLCAwfSwgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICB7MCwgMH0sICAgICAgIHswLCAwfX19fSwKKyAgICAge3t7ey0xLCAxfSwgey0xOCwgMn0sIHstMTcsIDB9fSwKKyAgICAgICB7ey0xLCAxfSwKKyAgICAgICAgezMsIDJ9LAorICAgICAgICB7LTE4LCA0fSwKKyAgICAgICAgey01MiwgNX0sCisgICAgICAgIHstMzQsIC0zNn0sCisgICAgICAgIHstMzUsIDZ9LAorICAgICAgICB7LTE3LCA3fSwKKyAgICAgICAgey0zMywgOH0sCisgICAgICAgIHstMjAsIDl9LAorICAgICAgICB7LTQ5LCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH19LAorICAgICAgIHt7LTEsIDF9LCAgICB7MywgMn0sICAgey01MiwgNH0sICAgey04NiwgNX0sIHstMzUsIDZ9LCAgIHstNTMsIDd9LAorICAgICAgICB7LTcwLCA4fSwgICB7LTE3LCA5fSwgey0zNywgMTB9LCAgezEyLCAxMX0sIHstMzgsIC02Nn0sIHstMTgsIDEzfSwKKyAgICAgICAgey01MSwgMTR9LCAgezE2LCAxNX0sIHstMzQsIC02OX0sIHsxOCwgMTd9LCB7LTU0LCAtNjV9LCB7LTUwLCAxOX0sCisgICAgICAgIHstMzMsIC00OX0sIHstMjIsIDB9LCB7MCwgMH0sICAgICB7MCwgMH0sICAgezAsIDB9LCAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgezAsIDB9LCAgICAgezAsIDB9LCAgIHswLCAwfSwgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgIHswLCAwfSwgICAgIHswLCAwfSwgICB7MCwgMH19LAorICAgICAgIHt7LTEsIDF9LCAgICB7LTY5LCAyfSwgICB7NCwgM30sICAgICB7LTEyMCwgNX0sICB7NywgNn0sICAgICB7LTExMywgOH0sCisgICAgICAgIHstNjgsIDl9LCAgIHsxMSwgMTB9LCAgIHstMTcsIDEyfSwgIHstNTIsIDEzfSwgIHstMjQsIDE0fSwgIHstMTgsIDE1fSwKKyAgICAgICAgezE3LCAxNn0sICAgey0xMDQsIDE4fSwgezIwLCAxOX0sICAgey01NCwgLTcwfSwgezIyLCAyMX0sICAgezI0LCAyM30sCisgICAgICAgIHstODYsIC05N30sIHstMTAzLCAyNX0sIHstODMsIDI2fSwgIHstMzUsIDI3fSwgIHstMzQsIC05OH0sIHstNDAsIDI4fSwKKyAgICAgICAgey0zOSwgLTY3fSwgezMwLCAyOX0sICAgey0zMywgLTUxfSwgey04NywgMzF9LCAgey04OCwgMzJ9LCAgey04MiwgMzN9LAorICAgICAgICB7LTU1LCAtODF9LCB7LTU2LCAtNzF9LCB7LTcyLCAzNH0sICB7LTUwLCAtNjZ9LCB7LTY1LCAzNX0sICB7LTQ5LCAwfSwKKyAgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH19fSwKKyAgICAgIHt7ey0xLCAxfSwgey0xOCwgMn0sIHstMTcsIDB9fSwKKyAgICAgICB7ey0xLCAxfSwKKyAgICAgICAgezMsIDJ9LAorICAgICAgICB7LTE4LCA0fSwKKyAgICAgICAgey01MiwgNX0sCisgICAgICAgIHstMzQsIC0zNn0sCisgICAgICAgIHstMzUsIDZ9LAorICAgICAgICB7LTE3LCA3fSwKKyAgICAgICAgey0zMywgOH0sCisgICAgICAgIHstMjAsIDl9LAorICAgICAgICB7LTQ5LCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH19LAorICAgICAgIHt7LTEsIDF9LCAgICB7MywgMn0sICAgey01MiwgNH0sICAgey04NiwgNX0sIHstMzUsIDZ9LCAgIHstNTMsIDd9LAorICAgICAgICB7LTcwLCA4fSwgICB7LTE3LCA5fSwgey0zNywgMTB9LCAgezEyLCAxMX0sIHstMzgsIC02Nn0sIHstMTgsIDEzfSwKKyAgICAgICAgey01MSwgMTR9LCAgezE2LCAxNX0sIHstMzQsIC02OX0sIHsxOCwgMTd9LCB7LTU0LCAtNjV9LCB7LTUwLCAxOX0sCisgICAgICAgIHstMzMsIC00OX0sIHstMjIsIDB9LCB7MCwgMH0sICAgICB7MCwgMH0sICAgezAsIDB9LCAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgezAsIDB9LCAgICAgezAsIDB9LCAgIHswLCAwfSwgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgIHswLCAwfSwgICAgIHswLCAwfSwgICB7MCwgMH19LAorICAgICAgIHt7LTEsIDF9LCAgICB7LTY5LCAyfSwgICB7NCwgM30sICAgICB7LTEyMCwgNX0sICB7NywgNn0sICAgICB7LTExMywgOH0sCisgICAgICAgIHstNjgsIDl9LCAgIHsxMSwgMTB9LCAgIHstMTcsIDEyfSwgIHstNTIsIDEzfSwgIHstMjQsIDE0fSwgIHstMTgsIDE1fSwKKyAgICAgICAgezE3LCAxNn0sICAgey0xMDQsIDE4fSwgezIwLCAxOX0sICAgey01NCwgLTcwfSwgezIyLCAyMX0sICAgezI0LCAyM30sCisgICAgICAgIHstODYsIC05N30sIHstMTAzLCAyNX0sIHstODMsIDI2fSwgIHstMzUsIDI3fSwgIHstMzQsIC05OH0sIHstNDAsIDI4fSwKKyAgICAgICAgey0zOSwgLTY3fSwgezMwLCAyOX0sICAgey0zMywgLTUxfSwgey04NywgMzF9LCAgey04OCwgMzJ9LCAgey04MiwgMzN9LAorICAgICAgICB7LTU1LCAtODF9LCB7LTU2LCAtNzF9LCB7LTcyLCAzNH0sICB7LTUwLCAtNjZ9LCB7LTY1LCAzNX0sICB7LTQ5LCAwfSwKKyAgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH19fX0sCisgICAgIHt7e3stMSwgMX0sIHstMTgsIDJ9LCB7LTE3LCAwfX0sCisgICAgICAge3stMSwgMX0sCisgICAgICAgIHstMzYsIDJ9LAorICAgICAgICB7LTE4LCAzfSwKKyAgICAgICAgey0zNSwgNH0sCisgICAgICAgIHstNTIsIDV9LAorICAgICAgICB7NywgNn0sCisgICAgICAgIHstMzQsIDh9LAorICAgICAgICB7LTMzLCAtNDl9LAorICAgICAgICB7LTIwLCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfX0sCisgICAgICAge3stMSwgMX0sICAgIHszLCAyfSwgICAgezUsIDR9LCAgICAgey04NiwgNn0sICAgey02NiwgN30sICB7OSwgOH0sCisgICAgICAgIHsxMSwgMTB9LCAgIHstMTgsIDEyfSwgey01MSwgMTN9LCAgey0zNywgLTUyfSwgey02OSwgMTR9LCB7LTM4LCAxNX0sCisgICAgICAgIHstNTMsIDE2fSwgIHstMzUsIDE3fSwgey01MCwgLTcwfSwgey0yMiwgLTQ5fSwgey0zMywgMTh9LCB7LTE3LCAxOX0sCisgICAgICAgIHstMzQsIC02NX0sIHstODEsIDIwfSwgey01NCwgMH0sICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9fSwKKyAgICAgICB7ezIsIDF9LCAgICB7NCwgM30sICAgICAgIHstMSwgNX0sICAgIHstNjksIDZ9LCAgIHstMTIwLCA3fSwgey02OCwgOH0sCisgICAgICAgIHsxMCwgOX0sICAgezEyLCAxMX0sICAgICB7MTQsIDEzfSwgICB7LTUyLCAtNTR9LCB7LTE4LCAxNX0sIHstNzAsIDE2fSwKKyAgICAgICAgey02NywgMTd9LCB7MTksIDE4fSwgICAgIHstMTcsIDIwfSwgIHstMTEzLCAyMX0sIHsyMywgMjJ9LCAgey04MywgMjR9LAorICAgICAgICB7LTI0LCAyNX0sIHstMTAzLCAtMTA0fSwgey01MSwgLTU1fSwgezI3LCAyNn0sICAgey03MSwgMjh9LCB7LTg2LCAyOX0sCisgICAgICAgIHstMzUsIDMwfSwgey02NiwgMzF9LCAgICB7LTM5LCAtNTB9LCB7LTgyLCAtOTh9LCB7LTcyLCAzMn0sIHstNTYsIC04N30sCisgICAgICAgIHstMzQsIDMzfSwgey0zMywgLTg4fSwgICB7LTQwLCAtOTd9LCB7LTY1LCAzNH0sICB7LTQ5LCAzNX0sIHstODEsIDB9LAorICAgICAgICB7MCwgMH0sICAgIHswLCAwfSwgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICB7MCwgMH0sICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgIHswLCAwfSwgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgICB7MCwgMH19fSwKKyAgICAgIHt7ey0xLCAxfSwgey0xOCwgMn0sIHstMTcsIDB9fSwKKyAgICAgICB7ey0xLCAxfSwKKyAgICAgICAgey0zNiwgMn0sCisgICAgICAgIHstMTgsIDN9LAorICAgICAgICB7LTM1LCA0fSwKKyAgICAgICAgey01MiwgNX0sCisgICAgICAgIHs3LCA2fSwKKyAgICAgICAgey0zNCwgOH0sCisgICAgICAgIHstMzMsIC00OX0sCisgICAgICAgIHstMjAsIDB9LAorICAgICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9fSwKKyAgICAgICB7ey0xLCAxfSwgICAgezMsIDJ9LCAgICB7NSwgNH0sICAgICB7LTg2LCA2fSwgICB7LTY2LCA3fSwgIHs5LCA4fSwKKyAgICAgICAgezExLCAxMH0sICAgey0xOCwgMTJ9LCB7LTUxLCAxM30sICB7LTM3LCAtNTJ9LCB7LTY5LCAxNH0sIHstMzgsIDE1fSwKKyAgICAgICAgey01MywgMTZ9LCAgey0zNSwgMTd9LCB7LTUwLCAtNzB9LCB7LTIyLCAtNDl9LCB7LTMzLCAxOH0sIHstMTcsIDE5fSwKKyAgICAgICAgey0zNCwgLTY1fSwgey04MSwgMjB9LCB7LTU0LCAwfSwgICB7MCwgMH0sICAgICB7MCwgMH0sICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH19LAorICAgICAgIHt7MiwgMX0sICAgIHs0LCAzfSwgICAgICAgey0xLCA1fSwgICAgey02OSwgNn0sICAgey0xMjAsIDd9LCB7LTY4LCA4fSwKKyAgICAgICAgezEwLCA5fSwgICB7MTIsIDExfSwgICAgIHsxNCwgMTN9LCAgIHstNTIsIC01NH0sIHstMTgsIDE1fSwgey03MCwgMTZ9LAorICAgICAgICB7LTY3LCAxN30sIHsxOSwgMTh9LCAgICAgey0xNywgMjB9LCAgey0xMTMsIDIxfSwgezIzLCAyMn0sICB7LTgzLCAyNH0sCisgICAgICAgIHstMjQsIDI1fSwgey0xMDMsIC0xMDR9LCB7LTUxLCAtNTV9LCB7MjcsIDI2fSwgICB7LTcxLCAyOH0sIHstODYsIDI5fSwKKyAgICAgICAgey0zNSwgMzB9LCB7LTY2LCAzMX0sICAgIHstMzksIC01MH0sIHstODIsIC05OH0sIHstNzIsIDMyfSwgey01NiwgLTg3fSwKKyAgICAgICAgey0zNCwgMzN9LCB7LTMzLCAtODh9LCAgIHstNDAsIC05N30sIHstNjUsIDM0fSwgIHstNDksIDM1fSwgey04MSwgMH0sCisgICAgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICB7MCwgMH0sICAgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgIHswLCAwfSwgICAgezAsIDB9LAorICAgICAgICB7MCwgMH0sICAgIHswLCAwfSwgICAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICAgezAsIDB9LCAgICB7MCwgMH0sCisgICAgICAgIHswLCAwfSwgICAgezAsIDB9LCAgICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgICB7MCwgMH0sICAgIHswLCAwfSwKKyAgICAgICAgezAsIDB9LCAgICB7MCwgMH0sICAgICAgIHswLCAwfX19fX19OworCitzdGF0aWMgY29uc3QgSFVGRl9PTERfTk9EXzFEIGh1ZmZPTEROb2Rlc19oMURfMCA9IHt7ey0xLCAxfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MywgMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0yLCA0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTMsIDV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstNCwgNn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey01LCA3fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTYsIC04fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTcsIDh9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMCwgOX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEyLCAxMX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey05LCAtMTF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMTAsIDEzfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTEyLCAxNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0xMywgLTE2fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTE0LCAtMTV9fX07CisKK3N0YXRpYyBjb25zdCBIVUZGX09MRF9OT0RfMUQgaHVmZk9MRE5vZGVzX2gxRF8xID0ge3t7LTEsIDF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMiwgMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezQsIDN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMywgNX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey00LCA2fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTUsIDd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstNiwgLTh9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstNywgOH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEwLCA5fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTIsIDExfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTksIDEzfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTE2LCAxNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0xMCwgLTE1fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTExLCAtMTJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMTMsIC0xNH19fTsKKworc3RhdGljIGNvbnN0IEhVRkZfT0xEX05PRF8yRCBodWZmT0xETm9kZXNfaDJEXzBfMCA9IHsKKyAgICB7ezIsIDF9LAorICAgICB7LTEsIDN9LAorICAgICB7NSwgNH0sCisgICAgIHstMiwgNn0sCisgICAgIHstMywgLTR9LAorICAgICB7LTE3LCA3fSwKKyAgICAgey0xOCwgOH0sCisgICAgIHstMTksIDl9LAorICAgICB7LTIwLCAxMH0sCisgICAgIHstNTIsIDExfSwKKyAgICAgey0zMywgMTJ9LAorICAgICB7LTM0LCAtMzV9LAorICAgICB7LTM2LCAxM30sCisgICAgIHstNTEsIDE0fSwKKyAgICAgey00OSwgLTUwfX0sCisgICAge3stMSwgMX0sICAgIHszLCAyfSwgICAgIHs1LCA0fSwgICAgIHs3LCA2fSwgICAgICB7LTEwMywgOH0sIHsxMCwgOX0sCisgICAgIHsxMiwgMTF9LCAgIHstMTgsIDEzfSwgIHsxNSwgMTR9LCAgIHstMiwgMTZ9LCAgICB7LTg2LCAxN30sIHstMzUsIDE4fSwKKyAgICAgezIwLCAxOX0sICAgey0xMDIsIDIxfSwgezIzLCAyMn0sICAgey02OSwgMjR9LCAgIHstODcsIDI1fSwgey0zLCAyNn0sCisgICAgIHstMTcsIDI3fSwgIHstMTksIDI4fSwgIHstNTIsIDI5fSwgIHstMzQsIC0xMDF9LCB7MzEsIDMwfSwgIHstODUsIDMyfSwKKyAgICAgezM0LCAzM30sICAgey0yMCwgLTcwfSwgey00LCAzNX0sICAgey03MSwgLTEwMH0sIHstNSwgLTMzfSwgey01MCwgMzZ9LAorICAgICB7LTM2LCAtNTV9LCB7LTU0LCAtODR9LCB7MzgsIDM3fSwgICB7LTUxLCAtNTN9LCAgey0yMSwgMzl9LCB7LTYsIC05OX0sCisgICAgIHstMzcsIC02OH0sIHstODMsIDQwfSwgIHstNywgLTQ5fSwgIHstMjIsIC05OH0sICB7NDIsIDQxfSwgIHs0NCwgNDN9LAorICAgICB7LTY2LCA0NX0sICB7LTY3LCA0Nn0sICB7LTM4LCAtMzl9LCB7LTY1LCAtODJ9LCAgey0yMywgNDd9LCB7LTgxLCAtOTd9fSwKKyAgICB7ey0xLCAxfSwgICAgIHszLCAyfSwgICAgICAgezUsIDR9LCAgICAgIHs3LCA2fSwgICAgICB7OSwgOH0sCisgICAgIHsxMSwgMTB9LCAgICB7MTMsIDEyfSwgICAgIHsxNSwgMTR9LCAgICB7LTE1NCwgMTZ9LCAgey0xMDMsIDE3fSwKKyAgICAgezE5LCAxOH0sICAgIHsyMSwgMjB9LCAgICAgey0xOCwgMjJ9LCAgIHsyNCwgMjN9LCAgICB7MjYsIDI1fSwKKyAgICAgezI4LCAyN30sICAgIHstMTM3LCAyOX0sICAgezMxLCAzMH0sICAgIHstMiwgLTUxfSwgICB7MzMsIDMyfSwKKyAgICAgey0zNSwgMzR9LCAgIHstMjYsIDM1fSwgICAgezM3LCAzNn0sICAgIHstOCwgMzh9LCAgICB7LTcwLCAtMTUzfSwKKyAgICAgezQwLCAzOX0sICAgIHstMTIwLCA0MX0sICAgey01MiwgNDJ9LCAgIHs0NCwgNDN9LCAgICB7LTMsIC0xMzh9LAorICAgICB7NDYsIDQ1fSwgICAgezQ4LCA0N30sICAgICB7LTM0LCA0OX0sICAgey03LCA1MH0sICAgIHstMTksIDUxfSwKKyAgICAgey0xNywgNTJ9LCAgIHstMTUyLCA1M30sICAgey00LCAtMTUxfSwgIHstMzMsIDU0fSwgICB7LTEwNiwgNTV9LAorICAgICB7LTUzLCAtMTIyfSwgey0xMDUsIC0xMzZ9LCB7LTEyMSwgNTZ9LCAgey0xMDQsIDU3fSwgIHstNTAsIC0xMTh9LAorICAgICB7LTIwLCA1OH0sICAgey01LCA1OX0sICAgICB7LTM4LCA2MH0sICAgey0xMzMsIDYxfSwgIHstMTQ4LCA2Mn0sCisgICAgIHstMjMsIC0xMzV9LCB7LTM2LCA2M30sICAgIHstNiwgNjR9LCAgICB7NjYsIDY1fSwgICAgey0yMSwgLTE1MH0sCisgICAgIHs2OCwgNjd9LCAgICB7LTQ5LCA2OX0sICAgIHstMTM0LCA3MH0sICB7LTExOSwgNzF9LCAgey0zNywgNzJ9LAorICAgICB7LTE0OSwgNzN9LCAgey05LCA3NH0sICAgICB7LTY5LCA3NX0sICAgey04NiwgNzZ9LCAgIHstMjIsIDc3fSwKKyAgICAgey02OCwgNzh9LCAgIHs4MCwgNzl9LCAgICAgezgyLCA4MX0sICAgIHs4NCwgODN9LCAgICB7LTg4LCA4NX0sCisgICAgIHstMTMyLCA4Nn0sICB7LTkwLCA4N30sICAgIHstMTAsIC0xMTd9LCB7LTY3LCA4OH0sICAgey03MSwgODl9LAorICAgICB7LTg3LCA5MH0sICAgey01NCwgLTY2fSwgICB7LTI1LCA5MX0sICAgey04OSwgOTJ9LCAgIHstNzIsIDkzfSwKKyAgICAgey0xMzEsIDk0fSwgIHstMTEzLCAtMTE1fSwgey05OSwgOTV9LCAgIHstNzMsIC0xMTZ9LCB7LTI0LCAtODV9LAorICAgICB7LTg0LCAtMTAyfSwgey0zOSwgOTZ9LCAgICB7LTU1LCAtOTh9LCAgey04MSwgLTk3fSwgIHstODIsIC04M30sCisgICAgIHstMTE0LCA5N30sICB7LTE0NiwgLTE0N30sIHstNDIsIC0xMDF9LCB7LTU3LCAtMTAwfSwgey02NSwgLTEzMH0sCisgICAgIHstNzQsIDk4fSwgICB7LTU2LCAtNTh9LCAgIHstNDAsIC0xMjl9LCB7LTQxLCAtMTQ1fX0sCisgICAge3syLCAxfSwgICAgICAgezQsIDN9LCAgICAgICB7NiwgNX0sICAgICAgIHs4LCA3fSwgICAgICAgezEwLCA5fSwKKyAgICAgezEyLCAxMX0sICAgICB7LTQsIDEzfSwgICAgIHstMTEsIC0yOH0sICAgey0yMSwgMTR9LCAgICB7LTEsIDE1fSwKKyAgICAgezE3LCAxNn0sICAgICB7MTksIDE4fSwgICAgIHstMzgsIDIwfSwgICAgezIyLCAyMX0sICAgICB7MjQsIDIzfSwKKyAgICAgezI2LCAyNX0sICAgICB7MjgsIDI3fSwgICAgIHstNTQsIDI5fSwgICAgezMxLCAzMH0sICAgICB7LTQ0LCAzMn0sCisgICAgIHstNDUsIDMzfSwgICAgey0zNywgMzR9LCAgICB7LTUsIDM1fSwgICAgIHstMjcsIDM2fSwgICAgezM4LCAzN30sCisgICAgIHs0MCwgMzl9LCAgICAgey01MywgNDF9LCAgICB7LTEyLCA0Mn0sICAgIHstMjIsIDQzfSwgICAgey0yMCwgNDR9LAorICAgICB7LTM2LCA0NX0sICAgIHstNDMsIDQ2fSwgICAgey02LCA0N30sICAgICB7LTIwNSwgNDh9LCAgIHstNTEsIC01Mn0sCisgICAgIHstMzUsIDQ5fSwgICAgey0zNCwgNTB9LCAgICB7LTEzLCA1MX0sICAgIHstNDIsIDUyfSwgICAgey0yOSwgNTN9LAorICAgICB7LTE4LCAtNDF9LCAgIHs1NSwgNTR9LCAgICAgey0xNywgLTI2fSwgICB7LTE5LCA1Nn0sICAgIHstNywgNTd9LAorICAgICB7LTIzLCAtMTg4fSwgIHs1OSwgNTh9LCAgICAgey0xMCwgNjB9LCAgICB7NjIsIDYxfSwgICAgIHstMzksIDYzfSwKKyAgICAgey0zMywgNjR9LCAgICB7LTIsIDY1fSwgICAgIHstMjA0LCA2Nn0sICAgezY4LCA2N30sICAgICB7LTE4OSwgNjl9LAorICAgICB7LTE3MSwgNzB9LCAgIHs3MiwgNzF9LCAgICAgezc0LCA3M30sICAgICB7LTIwMywgNzV9LCAgIHstMywgLTI1fSwKKyAgICAgey0yNCwgNzZ9LCAgICB7NzgsIDc3fSwgICAgIHs4MCwgNzl9LCAgICAgezgyLCA4MX0sICAgICB7LTE3MywgODN9LAorICAgICB7LTE3MiwgLTE4N30sIHs4NSwgODR9LCAgICAgey04NiwgODZ9LCAgICB7LTUwLCA4N30sICAgIHstMjAyLCA4OH0sCisgICAgIHs5MCwgODl9LCAgICAgey0xNTQsIDkxfSwgICB7OTMsIDkyfSwgICAgIHstMTIwLCA5NH0sICAgezk2LCA5NX0sCisgICAgIHstMTg2LCA5N30sICAgezk5LCA5OH0sICAgICB7LTY5LCAxMDB9LCAgIHstMTU2LCAtMTU3fSwgezEwMiwgMTAxfSwKKyAgICAgezEwNCwgMTAzfSwgICB7LTE3MCwgLTIwMX0sIHstMTAzLCAxMDV9LCAgezEwNywgMTA2fSwgICB7LTE1NSwgMTA4fSwKKyAgICAgey0xMzcsIDEwOX0sICB7LTE4NSwgMTEwfSwgIHstNDksIDExMX0sICAgey04LCAxMTJ9LCAgICB7LTY2LCAxMTN9LAorICAgICB7LTY3LCAxMTR9LCAgIHsxMTYsIDExNX0sICAgey0xNjksIDExN30sICB7LTE0MSwgMTE4fSwgIHsxMjAsIDExOX0sCisgICAgIHsxMjIsIDEyMX0sICAgey0yMDAsIDEyM30sICB7LTY4LCAtMTIxfSwgIHsxMjUsIDEyNH0sICAgey0xMzYsIDEyNn0sCisgICAgIHstMTQwLCAxMjd9LCAgey03MSwgMTI4fSwgICB7LTEzOSwgMTI5fSwgIHstMTUxLCAtMTg0fSwgey04MiwgMTMwfSwKKyAgICAgey01NiwgLTEwMX0sICB7MTMyLCAxMzF9LCAgIHstOSwgLTE1M30sICAgey00MCwgMTMzfSwgICB7LTEzOCwgMTM0fSwKKyAgICAgey04MywgLTE5OX0sICB7LTg0LCAxMzV9LCAgIHstOTAsIC0xNjh9LCAgey02NSwgLTkxfSwgICB7LTEwMiwgMTM2fSwKKyAgICAgey0xMzUsIC0xNjZ9LCB7LTcyLCAtMTgzfSwgIHstODcsIC0xNTB9LCAgey0xODEsIDEzN30sICB7LTEyNSwgMTM4fSwKKyAgICAgey01NSwgLTcwfSwgICB7LTg1LCAtMTUyfSwgIHstMTA2LCAtMTI0fSwgey04OSwgLTEyM30sICB7LTE5OCwgMTM5fSwKKyAgICAgey01NywgMTQwfSwgICB7LTEwNSwgMTQxfSwgIHstMTY3LCAtMTk2fSwgey04MSwgLTEyMn0sICB7LTE4MiwgMTQyfSwKKyAgICAgey05OSwgLTE4MH0sICB7LTEwMCwgLTEwNH0sIHstMTE2LCAtMTY1fSwgey05OCwgMTQzfSwgICB7LTExNywgLTExOX0sCisgICAgIHstODgsIC0xMzR9LCAgey0xOTcsIDE0NH0sICB7LTczLCAtMTk1fSwgIHstOTIsIC0xNDl9LCAgey0xMTgsIC0xNjR9LAorICAgICB7LTU4LCAtMTA4fSwgIHstMTA3LCAtMTc5fSwgey0xMDksIDE0NX0sICB7LTkzLCAtOTd9LCAgIHstMTE1LCAtMTk0fSwKKyAgICAgey0xMTQsIDE0Nn0sICB7LTExMywgMTQ3fSwgIHsxNDksIDE0OH0sICAgezE1MSwgMTUwfSwgICB7MTUzLCAxNTJ9LAorICAgICB7MTU1LCAxNTR9LCAgIHsxNTcsIDE1Nn0sICAgezE1OSwgMTU4fSwgICB7MTYxLCAxNjB9LCAgIHsxNjMsIDE2Mn0sCisgICAgIHsxNjUsIDE2NH0sICAgezE2NywgMTY2fSwgICB7LTE3OCwgLTE5M30sIHstMTYzLCAtMTc3fSwgey0xNjEsIC0xNjJ9LAorICAgICB7LTE0NywgLTE0OH0sIHstMTQ1LCAtMTQ2fSwgey0xMzIsIC0xMzN9LCB7LTEzMCwgLTEzMX0sIHstNzcsIC0xMjl9LAorICAgICB7LTc1LCAtNzZ9LCAgIHstNjEsIC03NH0sICAgey01OSwgLTYwfX19OworCitzdGF0aWMgY29uc3QgSFVGRl9PTERfTk9EXzJEIGh1ZmZPTEROb2Rlc19oMkRfMF8xID0geworICAgIHt7LTEsIDF9LAorICAgICB7MywgMn0sCisgICAgIHs1LCA0fSwKKyAgICAgey01MiwgNn0sCisgICAgIHstNDksIDd9LAorICAgICB7OSwgOH0sCisgICAgIHstMTcsIDEwfSwKKyAgICAgey0zNiwgMTF9LAorICAgICB7LTE4LCAxMn0sCisgICAgIHstMiwgLTN9LAorICAgICB7LTM1LCAxM30sCisgICAgIHstMzQsIC01MH0sCisgICAgIHstNCwgLTMzfSwKKyAgICAgey0yMCwgMTR9LAorICAgICB7LTE5LCAtNTF9fSwKKyAgICB7ey0xLCAxfSwgICAgIHszLCAyfSwgICAgey0xMDMsIDR9LCAgIHs2LCA1fSwgICAgIHs4LCA3fSwgICAgey0xOCwgOX0sCisgICAgIHsxMSwgMTB9LCAgICB7LTg3LCAxMn0sIHstMTcsIDEzfSwgICB7MTUsIDE0fSwgICB7LTg2LCAxNn0sIHsxOCwgMTd9LAorICAgICB7LTcxLCAxOX0sICAgezIxLCAyMH0sICB7LTMzLCAtMzV9LCAgey0zNCwgMjJ9LCAgey01NSwgMjN9LCB7LTIsIDI0fSwKKyAgICAgey01MCwgLTEwMn0sIHsyNiwgMjV9LCAgey00OSwgMjd9LCAgIHstNjksIC03MH0sIHstMzksIDI4fSwgey02NSwgMjl9LAorICAgICB7LTY2LCAzMH0sICAgey01NCwgMzF9LCB7LTE5LCAzMn0sICAgey0yMywgLTUyfSwgey01MSwgMzN9LCB7LTgxLCAzNH0sCisgICAgIHstODIsIDM1fSwgICB7LTMsIC0zOH0sIHstODUsIC0xMDF9LCB7LTY3LCAtOTd9LCB7MzcsIDM2fSwgIHstMjAsIC01M30sCisgICAgIHstMzYsIDM4fSwgICB7NDAsIDM5fSwgIHstMTAwLCA0MX0sICB7LTQsIC04NH0sICB7LTY4LCA0Mn0sIHstMjEsIDQzfSwKKyAgICAgey0zNywgNDR9LCAgIHstOTksIDQ1fSwgey01LCAtODN9LCAgIHstMjIsIDQ2fSwgIHstOTgsIDQ3fSwgey02LCAtN319LAorICAgIHt7LTEsIDF9LCAgICB7MywgMn0sICAgICAgIHs1LCA0fSwgICAgICAgezcsIDZ9LCAgICAgICB7OSwgOH0sCisgICAgIHstMTU0LCAxMH0sIHsxMiwgMTF9LCAgICAgezE0LCAxM30sICAgICB7LTE4LCAxNX0sICAgIHsxNywgMTZ9LAorICAgICB7MTksIDE4fSwgICB7MjEsIDIwfSwgICAgIHstMTcsIDIyfSwgICAgey0xMzcsIDIzfSwgICB7LTM1LCAyNH0sCisgICAgIHstMTM4LCAyNX0sIHsyNywgMjZ9LCAgICAgey0xMTMsIDI4fSwgICB7LTM0LCAyOX0sICAgIHszMSwgMzB9LAorICAgICB7MzMsIDMyfSwgICB7LTEyMiwgMzR9LCAgIHstMzMsIDM1fSwgICAgey03MywgMzZ9LCAgICB7MzgsIDM3fSwKKyAgICAgezQwLCAzOX0sICAgey0xMDYsIDQxfSwgICB7LTUyLCA0Mn0sICAgIHstNTgsIC0xMjB9LCAgey01MCwgNDN9LAorICAgICB7NDUsIDQ0fSwgICB7LTQ5LCA0Nn0sICAgIHstMTAsIC0xMDN9LCAgey0zNiwgNDd9LCAgICB7LTU0LCAtOTB9LAorICAgICB7LTUzLCA0OH0sICB7LTIsIDQ5fSwgICAgIHstOTgsIC0xNTN9LCAgey0xMjEsIDUwfSwgICB7LTY2LCA1MX0sCisgICAgIHstNjUsIC03Mn0sIHstNTEsIDUyfSwgICAgey03NCwgNTN9LCAgICB7LTksIDU0fSwgICAgIHstMTA1LCA1NX0sCisgICAgIHstNzEsIC04Mn0sIHstMTksIC01NX0sICAgey04MSwgNTZ9LCAgICB7NTgsIDU3fSwgICAgIHstODMsIDU5fSwKKyAgICAgey02OCwgLTg4fSwgey04OSwgLTk3fSwgICB7LTcwLCA2MH0sICAgIHstMywgNjF9LCAgICAgey02NywgNjJ9LAorICAgICB7NjQsIDYzfSwgICB7LTY5LCA2NX0sICAgIHstMTA0LCA2Nn0sICAgey0xMzYsIC0xNTJ9LCB7NjgsIDY3fSwKKyAgICAgey04LCAtMjZ9LCAgey0zNywgNjl9LCAgICB7LTQsIDcwfSwgICAgIHs3MiwgNzF9LCAgICAgey0yMiwgNzN9LAorICAgICB7LTQyLCA3NH0sICB7LTcsIC0yMH0sICAgIHs3NiwgNzV9LCAgICAgezc4LCA3N30sICAgICB7LTYsIDc5fSwKKyAgICAgey0xMTQsIDgwfSwgey0yNSwgLTEzNX0sICB7LTExOSwgLTE1MX0sIHstMjQsIDgxfSwgICAgey01NywgODJ9LAorICAgICB7LTUsIDgzfSwgICB7LTk5LCA4NH0sICAgIHstMjMsIC0xMzB9LCAgey0xMjksIDg1fSwgICB7LTExOCwgODZ9LAorICAgICB7LTIxLCAtNDF9LCB7LTg2LCA4N30sICAgIHstMTE1LCAtMTQ1fSwgey04NCwgODh9LCAgICB7LTg3LCAtMTUwfSwKKyAgICAgey0zOCwgLTU2fSwgey0xMzQsIDg5fSwgICB7LTEwMCwgOTB9LCAgIHstODUsIC0xMzN9LCAgey0xNDksIDkxfSwKKyAgICAgey0xMDIsIDkyfSwgey0xMTcsIC0xNDh9LCB7OTQsIDkzfSwgICAgIHstMzksIDk1fSwgICAgey0xMDEsIDk2fSwKKyAgICAgey0xMTYsIDk3fSwgey0xMzEsIC0xMzJ9LCB7LTQwLCA5OH0sICAgIHstMTQ2LCAtMTQ3fX0sCisgICAge3syLCAxfSwgICAgICAgey0xLCAzfSwgICAgICB7NSwgNH0sICAgICAgIHs3LCA2fSwgICAgICB7OSwgOH0sCisgICAgIHstMjA1LCAxMH0sICAgezEyLCAxMX0sICAgICB7MTQsIDEzfSwgICAgIHsxNiwgMTV9LCAgICB7LTE4LCAxN30sCisgICAgIHsxOSwgMTh9LCAgICAgezIxLCAyMH0sICAgICB7MjMsIDIyfSwgICAgIHstMTg5LCAyNH0sICB7LTE4OCwgMjV9LAorICAgICB7MjcsIDI2fSwgICAgIHstMTcsIDI4fSwgICAgey0xNzMsIDI5fSwgICB7MzEsIDMwfSwgICAgezMzLCAzMn0sCisgICAgIHstMzQsIC0xNTd9LCAgey0zNSwgMzR9LCAgICB7LTMzLCAzNX0sICAgIHszNywgMzZ9LCAgICB7MzksIDM4fSwKKyAgICAgezQxLCA0MH0sICAgICB7LTUwLCA0Mn0sICAgIHstNDksIDQzfSwgICAgey0xNDEsIDQ0fSwgIHstMjA0LCA0NX0sCisgICAgIHstMiwgLTE3MX0sICAgey0xNzIsIDQ2fSwgICB7LTY2LCA0N30sICAgIHs0OSwgNDh9LCAgICB7NTEsIDUwfSwKKyAgICAgey02NSwgNTJ9LCAgICB7LTEyNSwgNTN9LCAgIHstMTU2LCA1NH0sICAgey04MiwgNTV9LCAgIHs1NywgNTZ9LAorICAgICB7NTksIDU4fSwgICAgIHstMTksIC01Mn0sICAgezYxLCA2MH0sICAgICB7LTgxLCA2Mn0sICAgezY0LCA2M30sCisgICAgIHstMTA5LCAtMTQwfSwgey01MSwgNjV9LCAgICB7NjcsIDY2fSwgICAgIHstOTgsIDY4fSwgICB7NzAsIDY5fSwKKyAgICAgezcyLCA3MX0sICAgICB7LTY3LCAtOTN9LCAgIHs3NCwgNzN9LCAgICAgey0yMDMsIDc1fSwgIHstMTU0LCA3Nn0sCisgICAgIHstMTI0LCA3N30sICAgey05NywgLTE4N30sICB7LTExNCwgNzh9LCAgIHstNjEsIDc5fSwgICB7LTE1NSwgODB9LAorICAgICB7ODIsIDgxfSwgICAgIHstMTEzLCA4M30sICAgey0zLCAtMTQ2fSwgICB7LTgzLCA4NH0sICAgey0xMDgsIDg1fSwKKyAgICAgey0yMCwgODZ9LCAgICB7LTc2LCA4N30sICAgIHstNDUsIC03N30sICAgey0xMzksIDg4fSwgIHs5MCwgODl9LAorICAgICB7LTY5LCAtMTMwfSwgIHstMTI5LCA5MX0sICAgey0zNiwgOTJ9LCAgICB7LTk5LCAtMTYxfSwgezk0LCA5M30sCisgICAgIHstOTIsIC0xNjJ9LCAgey02OCwgOTV9LCAgICB7LTI5LCA5Nn0sICAgIHstODYsIDk3fSwgICB7LTYwLCA5OH0sCisgICAgIHstMTIzLCAtMTc3fSwgey0xNDUsIDk5fSwgICB7LTkxLCAtMTMxfSwgIHsxMDEsIDEwMH0sICB7LTEzNywgLTE3OH0sCisgICAgIHstMTE1LCAxMDJ9LCAgey04NCwgLTExNn0sICB7LTE0NywgMTAzfSwgIHstNCwgMTA0fSwgICB7LTEwNiwgLTIwMn0sCisgICAgIHsxMDYsIDEwNX0sICAgey0xMzIsIC0xODZ9LCB7LTEwNywgMTA3fSwgIHstMTkzLCAxMDh9LCB7LTEwMCwgLTEyMH0sCisgICAgIHstNzUsIC0xNzB9LCAgey00NCwgMTA5fSwgICB7LTEyMiwgLTE2M30sIHstMTM4LCAxMTB9LCB7LTkwLCAxMTF9LAorICAgICB7LTM3LCAxMTJ9LCAgIHstMTAxLCAxMTN9LCAgey0xMjEsIDExNH0sICB7MTE2LCAxMTV9LCAgey0xMDMsIDExN30sCisgICAgIHstNzQsIC0yMDF9LCAgey0yMSwgLTg1fSwgICB7LTUzLCAtNTl9LCAgIHstMTE3LCAxMTh9LCB7LTE0OCwgMTE5fSwKKyAgICAgey01LCAxMjB9LCAgICB7LTE2OSwgMTIxfSwgIHstMTA1LCAtMTg1fSwgezEyMywgMTIyfSwgIHstMTAyLCAtMTMzfSwKKyAgICAgey0xMzYsIDEyNH0sICB7LTE1MywgMTI1fSwgIHsxMjcsIDEyNn0sICAgey01NCwgMTI4fSwgIHsxMzAsIDEyOX0sCisgICAgIHstMjIsIC0xMDR9LCAgey0zOCwgMTMxfSwgICB7LTg5LCAtMTE4fSwgIHstMTg0LCAxMzJ9LCB7LTcxLCAxMzN9LAorICAgICB7LTg3LCAxMzR9LCAgIHstNzAsIDEzNX0sICAgey0yMDAsIDEzNn0sICB7LTE2OCwgMTM3fSwgey0xNTIsIDEzOH0sCisgICAgIHstNiwgLTIzfSwgICAgey0zOSwgMTM5fSwgICB7LTExOSwgLTE5OX0sIHsxNDEsIDE0MH0sICB7LTU1LCAxNDJ9LAorICAgICB7LTcsIC0xNTF9LCAgIHstMTgzLCAxNDN9LCAgezE0NSwgMTQ0fSwgICB7LTEzNSwgMTQ2fSwgey01NiwgMTQ3fSwKKyAgICAgey0xNTAsIDE0OH0sICB7LTQwLCAxNDl9LCAgIHstNzIsIC0xOTh9LCAgey04OCwgMTUwfSwgIHstNTcsIC0xMzR9LAorICAgICB7LTQxLCAxNTF9LCAgIHstMTY2LCAtMTY3fSwgey0yNSwgLTE2NX0sICB7LTksIDE1Mn0sICAgey04LCAtMjR9LAorICAgICB7LTczLCAtMTgxfSwgIHstMTgyLCAxNTN9LCAgezE1NSwgMTU0fSwgICB7LTE5NywgMTU2fSwgey00MiwgLTE4MH0sCisgICAgIHsxNTgsIDE1N30sICAgey00MywgLTE0OX0sICB7LTE5NiwgMTU5fSwgIHstNTgsIC0xNjR9LCB7LTI2LCAxNjB9LAorICAgICB7MTYyLCAxNjF9LCAgIHsxNjQsIDE2M30sICAgezE2NiwgMTY1fSwgICB7LTE5NSwgMTY3fSwgey0xNzksIC0xOTR9LAorICAgICB7LTI3LCAtMjh9LCAgIHstMTIsIC0xM30sICAgey0xMCwgLTExfX19OworCitzdGF0aWMgY29uc3QgSFVGRl9PTERfTk9EXzJEIGh1ZmZPTEROb2Rlc19oMkRfMV8wID0geworICAgIHt7LTEsIDF9LAorICAgICB7LTUyLCAyfSwKKyAgICAgezQsIDN9LAorICAgICB7LTE4LCA1fSwKKyAgICAgezcsIDZ9LAorICAgICB7LTE3LCA4fSwKKyAgICAgey0zNiwgOX0sCisgICAgIHstMzUsIDEwfSwKKyAgICAgey0yLCAxMX0sCisgICAgIHstMTksIDEyfSwKKyAgICAgey0zMywgLTUxfSwKKyAgICAgey0yMCwgLTM0fSwKKyAgICAgezE0LCAxM30sCisgICAgIHstMywgLTQ5fSwKKyAgICAgey00LCAtNTB9fSwKKyAgICB7ey0xLCAxfSwgICAgezMsIDJ9LCAgICB7NSwgNH0sICAgICB7LTEwMywgNn0sICB7OCwgN30sICAgICAgey0xOCwgOX0sCisgICAgIHsxMSwgMTB9LCAgIHsxMywgMTJ9LCAgey04NiwgMTR9LCAgey04NywgMTV9LCAgezE3LCAxNn0sICAgIHstMzUsIDE4fSwKKyAgICAgey0xNywgMTl9LCAgezIxLCAyMH0sICB7LTM0LCAtNzF9LCB7MjMsIDIyfSwgICB7LTUwLCAtNTV9LCAgey0zMywgMjR9LAorICAgICB7LTY5LCAyNX0sICB7LTIsIC03MH0sIHsyNywgMjZ9LCAgIHstMTAyLCAyOH0sIHstNDksIDI5fSwgICB7LTY2LCAzMH0sCisgICAgIHstMzksIC01NH0sIHstNTIsIDMxfSwgey01MSwgMzJ9LCAgey02NSwgMzN9LCAgey0xOSwgMzR9LCAgIHstMzgsIC04Mn0sCisgICAgIHstMjMsIC04NX0sIHstNjcsIDM1fSwgey04MSwgMzZ9LCAgey0zLCAzN30sICAgey01MywgLTEwMX0sIHstMjAsIC05N30sCisgICAgIHszOSwgMzh9LCAgIHstMzYsIDQwfSwgey04NCwgNDF9LCAgey0xMDAsIDQyfSwgey00LCAtNjh9LCAgIHstMjEsIDQzfSwKKyAgICAgey0zNywgNDR9LCAgey04MywgNDV9LCB7LTUsIC05OX0sICB7LTIyLCA0Nn0sICB7LTk4LCA0N30sICAgey02LCAtN319LAorICAgIHt7LTEsIDF9LCAgICAgIHszLCAyfSwgICAgICB7NSwgNH0sICAgICAgezcsIDZ9LCAgICAgIHs5LCA4fSwKKyAgICAgey0xNTQsIDEwfSwgICB7MTIsIDExfSwgICAgezE0LCAxM30sICAgIHstMTgsIDE1fSwgICB7MTcsIDE2fSwKKyAgICAgey0xMTMsIDE4fSwgICB7MjAsIDE5fSwgICAgey0xMzcsIDIxfSwgIHsyMywgMjJ9LCAgICB7MjUsIDI0fSwKKyAgICAgezI3LCAyNn0sICAgICB7LTM1LCAyOH0sICAgey0xMzgsIDI5fSwgIHstNTgsIDMwfSwgICB7LTEwMywgMzF9LAorICAgICB7LTk4LCAzMn0sICAgIHszNCwgMzN9LCAgICB7LTEyMiwgMzV9LCAgey0xMjAsIDM2fSwgIHstMTcsIC03M30sCisgICAgIHstMzQsIDM3fSwgICAgey0xMDYsIDM4fSwgIHstNTAsIDM5fSwgICB7LTgzLCAtOTB9LCAgey03NCwgNDB9LAorICAgICB7LTUyLCA0MX0sICAgIHstNjYsIC0xMjF9LCB7LTMzLCAtODh9LCAgezQzLCA0Mn0sICAgIHstODIsIC0xMDV9LAorICAgICB7LTQ5LCA0NH0sICAgIHstNjgsIC0xNTN9LCB7LTIsIC04OX0sICAgey01MSwgLTY1fSwgIHstNjcsIDQ1fSwKKyAgICAgey04MSwgLTk3fSwgICB7NDcsIDQ2fSwgICAgey0xMDQsIDQ4fSwgIHstMTksIDQ5fSwgICB7NTEsIDUwfSwKKyAgICAgezUzLCA1Mn0sICAgICB7NTUsIDU0fSwgICAgey0xMzYsIDU2fSwgIHstMTUyLCA1N30sICB7LTMsIDU4fSwKKyAgICAgezYwLCA1OX0sICAgICB7NjIsIDYxfSwgICAgezY0LCA2M30sICAgIHstMzYsIDY1fSwgICB7LTIwLCA2Nn0sCisgICAgIHstNTMsIDY3fSwgICAgey0xMTQsIDY4fSwgIHstNTcsIC05OX0sICB7LTcyLCA2OX0sICAgey02OSwgNzB9LAorICAgICB7LTQyLCA3MX0sICAgIHstMTUxLCA3Mn0sICB7LTExOSwgNzN9LCAgey04NCwgLTExOH0sIHstMTM1LCA3NH0sCisgICAgIHstNCwgLTEzMH0sICAgey0xMTUsIDc1fSwgIHstMjYsIC00MX0sICB7LTg3LCA3Nn0sICAgey01NiwgLTg2fSwKKyAgICAgey0xMDAsIDc3fSwgICB7LTM3LCAtMTI5fSwgey0yMSwgNzh9LCAgIHstMzgsIDc5fSwgICB7LTcxLCAtMTQ1fSwKKyAgICAgey0xMzQsIDgwfSwgICB7LTg1LCA4MX0sICAgey0xNTAsIDgyfSwgIHstNSwgODN9LCAgICB7LTEzMywgODR9LAorICAgICB7LTEwMiwgODV9LCAgIHstMjIsIDg2fSwgICB7LTIzLCA4N30sICAgey01NCwgODh9LCAgIHstMTQ5LCA4OX0sCisgICAgIHstMTE3LCAtMTQ4fSwgey03MCwgOTB9LCAgIHstNiwgLTEwMX0sICB7OTIsIDkxfSwgICAgey04LCAtNTV9LAorICAgICB7LTcsIDkzfSwgICAgIHstMTMyLCA5NH0sICB7LTM5LCAtMTE2fSwgey0yNCwgOTV9LCAgIHstMTQ3LCA5Nn0sCisgICAgIHstNDAsIDk3fSwgICAgey0xMCwgLTEzMX0sIHstMTQ2LCA5OH0sICB7LTksIC0yNX19LAorICAgIHt7MiwgMX0sICAgICAgIHstMSwgM30sICAgICAgezUsIDR9LCAgICAgICB7NywgNn0sICAgICAgIHs5LCA4fSwKKyAgICAgezExLCAxMH0sICAgICB7MTMsIDEyfSwgICAgIHstMjA1LCAxNH0sICAgezE2LCAxNX0sICAgICB7MTgsIDE3fSwKKyAgICAgezIwLCAxOX0sICAgICB7LTE4LCAyMX0sICAgIHsyMywgMjJ9LCAgICAgezI1LCAyNH0sICAgICB7MjcsIDI2fSwKKyAgICAgezI5LCAyOH0sICAgICB7LTE4OCwgMzB9LCAgIHszMiwgMzF9LCAgICAgezM0LCAzM30sICAgICB7MzYsIDM1fSwKKyAgICAgey0xODksIDM3fSwgICB7MzksIDM4fSwgICAgIHstMzUsIDQwfSwgICAgezQyLCA0MX0sICAgICB7NDQsIDQzfSwKKyAgICAgezQ2LCA0NX0sICAgICB7LTE3MywgNDd9LCAgIHs0OSwgNDh9LCAgICAgey0zNCwgNTB9LCAgICB7LTE3LCA1MX0sCisgICAgIHs1MywgNTJ9LCAgICAgey0xNTcsIDU0fSwgICB7NTYsIDU1fSwgICAgIHs1OCwgNTd9LCAgICAgey0xNzEsIDU5fSwKKyAgICAgey01MCwgNjB9LCAgICB7NjIsIDYxfSwgICAgIHstNjYsIC0xNDF9LCAgey0xNzIsIDYzfSwgICB7LTEyNSwgNjR9LAorICAgICB7NjYsIDY1fSwgICAgIHstMzMsIDY3fSwgICAgey01MiwgNjh9LCAgICB7LTIwNCwgNjl9LCAgIHstODIsIDcwfSwKKyAgICAgey0xNTYsIDcxfSwgICB7LTIsIDcyfSwgICAgIHs3NCwgNzN9LCAgICAgey0xMDksIDc1fSwgICB7LTUxLCAtOTh9LAorICAgICB7NzcsIDc2fSwgICAgIHstNDksIC0xNDB9LCAgezc5LCA3OH0sICAgICB7LTE0NiwgODB9LCAgIHstMTI0LCA4MX0sCisgICAgIHstNjEsIC05M30sICAgey0xOSwgLTc2fSwgICB7LTgxLCAtMTU0fSwgIHstNjUsIC0xMTR9LCAgezgzLCA4Mn0sCisgICAgIHstODMsIC0xMDh9LCAgey02NywgODR9LCAgICB7LTc3LCA4NX0sICAgIHstMTMwLCA4Nn0sICAgey05OSwgLTE1NX0sCisgICAgIHs4OCwgODd9LCAgICAgey05NywgODl9LCAgICB7LTY5LCAtOTF9LCAgIHstOTIsIDkwfSwgICAgey0xMzEsIDkxfSwKKyAgICAgezkzLCA5Mn0sICAgICB7LTExNiwgLTE4N30sIHstMTIzLCA5NH0sICAgey02MCwgOTV9LCAgICB7LTg2LCAtMTM5fSwKKyAgICAgezk3LCA5Nn0sICAgICB7LTY4LCAtMTYyfSwgIHs5OSwgOTh9LCAgICAgey00NSwgLTExM30sICB7LTE0NywgLTIwM30sCisgICAgIHstMTE1LCAxMDB9LCAgey03NSwgMTAxfSwgICB7LTg0LCAtMTA2fSwgIHstMTI5LCAxMDJ9LCAgey0zLCAxMDN9LAorICAgICB7LTEzNywgMTA0fSwgIHstMTMyLCAxMDV9LCAgey00NCwgLTEyMH0sICB7LTEwNywgMTA2fSwgIHstMjAsIC0xMDB9LAorICAgICB7LTM2LCAxMDd9LCAgIHstOTAsIC0xNjN9LCAgey0xNjEsIDEwOH0sICB7LTU5LCAtMTQ1fSwgIHstMTAxLCAxMDl9LAorICAgICB7LTI5LCAtMTM4fSwgIHstMTIxLCAxMTB9LCAgey0xNzcsIC0xNzh9LCB7LTE4NiwgMTExfSwgIHstMTIyLCAtMTQ4fSwKKyAgICAgey0xMTcsIDExMn0sICB7LTg1LCAtMTcwfSwgIHstMjAyLCAxMTN9LCAgey00LCAxMTR9LCAgICB7LTM3LCAtMTA1fSwKKyAgICAgey03NCwgMTE1fSwgICB7LTEzMywgMTE2fSwgIHstMTAyLCAxMTd9LCAgezExOSwgMTE4fSwgICB7LTg5LCAtMTkzfSwKKyAgICAgey0xMDMsIDEyMH0sICB7LTIxLCAtNTN9LCAgIHstMTUzLCAxMjF9LCAgezEyMywgMTIyfSwgICB7MTI1LCAxMjR9LAorICAgICB7LTE4NSwgMTI2fSwgIHstMTA0LCAtMTY5fSwgey0yMDEsIDEyN30sICB7LTEzNiwgMTI4fSwgIHstMTE4LCAxMjl9LAorICAgICB7LTg3LCAxMzB9LCAgIHstNSwgMTMxfSwgICAgey0zOCwgMTMyfSwgICB7LTU0LCAxMzN9LCAgIHstNzAsIC0xODR9LAorICAgICB7LTcxLCAtMTY4fSwgIHstMjIsIDEzNH0sICAgezEzNiwgMTM1fSwgICB7LTE1MSwgLTE1Mn0sIHstNTUsIDEzN30sCisgICAgIHstNiwgMTM4fSwgICAgey0zOSwgLTcyfSwgICB7LTIwMCwgMTM5fSwgIHstMTY3LCAxNDB9LCAgezE0MiwgMTQxfSwKKyAgICAgey0xMTksIC0xNjZ9LCB7LTg4LCAxNDN9LCAgIHstMjMsIC0xMzV9LCAgey0xOTksIDE0NH0sICB7LTE2NSwgMTQ1fSwKKyAgICAgey01NiwgLTE1MH0sICB7LTU3LCAtMTgzfSwgIHstNywgMTQ2fSwgICAgey00MSwgMTQ3fSwgICB7LTE4MSwgMTQ4fSwKKyAgICAgey0xMzQsIDE0OX0sICB7LTI0LCAtMjV9LCAgIHstNDAsIDE1MH0sICAgey03MywgMTUxfSwgICB7LTksIDE1Mn0sCisgICAgIHstNDMsIDE1M30sICAgey0xODIsIC0xOTd9LCB7LTgsIC0xOTV9LCAgIHstMTk4LCAxNTR9LCAgey0xNDksIDE1NX0sCisgICAgIHsxNTcsIDE1Nn0sICAgezE1OSwgMTU4fSwgICB7MTYxLCAxNjB9LCAgIHsxNjMsIDE2Mn0sICAgezE2NSwgMTY0fSwKKyAgICAgezE2NywgMTY2fSwgICB7LTE5NCwgLTE5Nn0sIHstMTc5LCAtMTgwfSwgey01OCwgLTE2NH0sICB7LTI4LCAtNDJ9LAorICAgICB7LTI2LCAtMjd9LCAgIHstMTIsIC0xM30sICAgey0xMCwgLTExfX19OworCitzdGF0aWMgY29uc3QgSFVGRl9PTERfTk9EXzJEIGh1ZmZPTEROb2Rlc19oMkRfMV8xID0geworICAgIHt7LTEsIDF9LAorICAgICB7LTUyLCAyfSwKKyAgICAgezQsIDN9LAorICAgICB7NiwgNX0sCisgICAgIHstMTgsIDd9LAorICAgICB7LTIsIDh9LAorICAgICB7LTE3LCA5fSwKKyAgICAgey0zNSwgMTB9LAorICAgICB7LTM2LCAtNTF9LAorICAgICB7LTM0LCAxMX0sCisgICAgIHstMzMsIDEyfSwKKyAgICAgey0xOSwgMTN9LAorICAgICB7LTMsIC0yMH0sCisgICAgIHstNTAsIDE0fSwKKyAgICAgey00LCAtNDl9fSwKKyAgICB7ey0xLCAxfSwgICB7MywgMn0sICAgICAgezUsIDR9LCAgICAgey0xMDMsIDZ9LCAgezgsIDd9LCAgICAgey0xOCwgOX0sCisgICAgIHsxMSwgMTB9LCAgezEzLCAxMn0sICAgIHstODYsIDE0fSwgIHsxNiwgMTV9LCAgIHstMiwgLTM1fSwgIHstMTcsIDE3fSwKKyAgICAgey04NywgMTh9LCB7LTEwMiwgMTl9LCAgezIxLCAyMH0sICAgey02OSwgMjJ9LCAgey0zNCwgMjN9LCAgey0xOSwgMjR9LAorICAgICB7MjYsIDI1fSwgIHstMywgMjd9LCAgICB7LTUyLCAtNzB9LCB7LTMzLCAtNzF9LCB7LTg1LCAyOH0sICB7LTEwMSwgMjl9LAorICAgICB7MzEsIDMwfSwgIHstNTAsIDMyfSwgICB7LTUxLCAzM30sICB7LTIwLCAzNH0sICB7LTM2LCAzNX0sICB7LTQsIC01NX0sCisgICAgIHstNTQsIDM2fSwgey00OSwgLTEwMH0sIHstNTMsIDM3fSwgIHstODQsIDM4fSwgIHstNjgsIDM5fSwgIHs0MSwgNDB9LAorICAgICB7LTUsIDQyfSwgIHstMjEsIDQzfSwgICB7LTY1LCAtNjZ9LCB7LTY3LCA0NH0sICB7LTM3LCAtOTl9LCB7LTM5LCA0NX0sCisgICAgIHstNiwgNDZ9LCAgey0zOCwgLTgzfSwgIHstMjIsIDQ3fSwgIHstODEsIC04Mn0sIHstNywgLTk4fSwgIHstMjMsIC05N319LAorICAgIHt7LTEsIDF9LCAgICAgIHszLCAyfSwgICAgICB7NSwgNH0sICAgICAgezcsIDZ9LCAgICAgIHs5LCA4fSwKKyAgICAgey0xNTQsIDEwfSwgICB7LTEwMywgMTF9LCAgezEzLCAxMn0sICAgIHstMTgsIDE0fSwgICB7MTYsIDE1fSwKKyAgICAgey0xMzcsIDE3fSwgICB7MTksIDE4fSwgICAgey0zNSwgMjB9LCAgIHsyMiwgMjF9LCAgICB7LTEyMCwgMjN9LAorICAgICB7MjUsIDI0fSwgICAgIHstNTIsIDI2fSwgICB7LTIsIDI3fSwgICAgey0xMzgsIDI4fSwgIHstMTUzLCAyOX0sCisgICAgIHstMTcsIDMwfSwgICAgezMyLCAzMX0sICAgIHszNCwgMzN9LCAgICB7LTM0LCAzNX0sICAgey0xOSwgMzZ9LAorICAgICB7MzgsIDM3fSwgICAgIHs0MCwgMzl9LCAgICB7LTMsIDQxfSwgICAgey0xMjEsIDQyfSwgIHstMTIyLCA0M30sCisgICAgIHstMTM2LCAtMTUyfSwgey0zMywgNDR9LCAgIHstMTA0LCA0NX0sICB7LTEwNSwgNDZ9LCAgey01MSwgLTEwNn0sCisgICAgIHstNTAsIDQ3fSwgICAgey0zNiwgNDh9LCAgIHstMjAsIDQ5fSwgICB7LTUzLCAtMTE5fSwgey00LCA1MH0sCisgICAgIHstMTM1LCAtMTUxfSwgey02OCwgNTF9LCAgIHs1MywgNTJ9LCAgICB7LTQ5LCA1NH0sICAgezU2LCA1NX0sCisgICAgIHstMTE4LCA1N30sICAgey04OCwgNTh9LCAgIHs2MCwgNTl9LCAgICB7LTUsIC04fSwgICAgey0zOCwgNjF9LAorICAgICB7NjMsIDYyfSwgICAgIHstMjEsIDY0fSwgICB7LTM3LCAtODN9LCAgey02NywgNjV9LCAgIHstNjYsIC0xMzN9LAorICAgICB7LTYsIDY2fSwgICAgIHstMTUwLCA2N30sICB7LTEzNCwgNjh9LCAgey0yMywgLTY1fSwgIHstNzMsIC05MH0sCisgICAgIHstNjksIC04OX0sICAgey0xNDgsIDY5fSwgIHstNywgLTIyfSwgICB7LTk4LCAtMTEzfSwgezcxLCA3MH0sCisgICAgIHstODIsIDcyfSwgICAgey04NiwgLTE0OX0sIHstNTgsIC04MX0sICB7LTc0LCA3M30sICAgezc1LCA3NH0sCisgICAgIHs3NywgNzZ9LCAgICAgey04NywgLTk3fSwgIHstMTAyLCA3OH0sICB7ODAsIDc5fSwgICAgey04NCwgODF9LAorICAgICB7LTg1LCA4Mn0sICAgIHstNTQsIDgzfSwgICB7LTcwLCA4NH0sICAgey03MiwgODV9LCAgIHstMTE3LCA4Nn0sCisgICAgIHstNzEsIDg3fSwgICAgey05OSwgODh9LCAgIHstMTAxLCA4OX0sICB7LTM5LCAtMTAwfSwgey01NSwgOTB9LAorICAgICB7LTU3LCA5MX0sICAgIHstMTMyLCA5Mn0sICB7LTU2LCA5M30sICAgey0yNCwgLTExNH0sIHstMTE1LCA5NH0sCisgICAgIHstNDAsIC0xMTZ9LCAgey00MiwgLTE0N30sIHstOSwgLTQxfSwgICB7LTEzMSwgOTV9LCAgezk3LCA5Nn0sCisgICAgIHstMTI5LCA5OH0sICAgey0yNSwgLTEzMH0sIHstMjYsIC0xNDZ9LCB7LTEwLCAtMTQ1fX0sCisgICAge3syLCAxfSwgICAgICAgey0xLCAzfSwgICAgICB7NSwgNH0sICAgICAgIHs3LCA2fSwgICAgICAgezksIDh9LAorICAgICB7MTEsIDEwfSwgICAgIHsxMywgMTJ9LCAgICAgey0yMDUsIDE0fSwgICB7MTYsIDE1fSwgICAgIHsxOCwgMTd9LAorICAgICB7LTE4LCAxOX0sICAgIHsyMSwgMjB9LCAgICAgezIzLCAyMn0sICAgICB7LTE4OCwgMjR9LCAgIHsyNiwgMjV9LAorICAgICB7MjgsIDI3fSwgICAgIHszMCwgMjl9LCAgICAgey0zNSwgMzF9LCAgICB7MzMsIDMyfSwgICAgIHszNSwgMzR9LAorICAgICB7LTE3MSwgMzZ9LCAgIHstMTg5LCAzN30sICAgey0yMDQsIDM4fSwgICB7NDAsIDM5fSwgICAgIHstMiwgNDF9LAorICAgICB7NDMsIDQyfSwgICAgIHstMTcsIDQ0fSwgICAgey01MiwgNDV9LCAgICB7LTM0LCA0Nn0sICAgIHstMTksIDQ3fSwKKyAgICAgezQ5LCA0OH0sICAgICB7LTE1NCwgNTB9LCAgIHs1MiwgNTF9LCAgICAgezU0LCA1M30sICAgICB7LTE3MiwgNTV9LAorICAgICB7LTE3MywgNTZ9LCAgIHstNjksIC0xODd9LCAgey0yMDMsIDU3fSwgICB7NTksIDU4fSwgICAgIHstODYsIDYwfSwKKyAgICAgey0zLCA2MX0sICAgICB7NjMsIDYyfSwgICAgIHstMzMsIC01MH0sICAgey01MSwgNjR9LCAgICB7LTM2LCA2NX0sCisgICAgIHstMTM3LCA2Nn0sICAgey0yMCwgNjd9LCAgICB7NjksIDY4fSwgICAgIHstMTIwLCA3MH0sICAgezcyLCA3MX0sCisgICAgIHstMTU2LCAtMTU3fSwgey0xNTUsIDczfSwgICB7LTE3MCwgNzR9LCAgIHs3NiwgNzV9LCAgICAgey0xODYsIC0yMDJ9LAorICAgICB7NzgsIDc3fSwgICAgIHs4MCwgNzl9LCAgICAgezgyLCA4MX0sICAgICB7LTQsIC02N30sICAgIHstNDksIC0xMDN9LAorICAgICB7LTY2LCA4M30sICAgIHstNjgsIDg0fSwgICAgey01MywgODV9LCAgICB7LTIxLCA4Nn0sICAgIHstMzcsIDg3fSwKKyAgICAgezg5LCA4OH0sICAgICB7OTEsIDkwfSwgICAgIHs5MywgOTJ9LCAgICAgey0xMzgsIDk0fSwgICB7LTE0MCwgOTV9LAorICAgICB7LTE0MSwgLTE1M30sIHstMTM5LCA5Nn0sICAgey0yMDEsIDk3fSwgICB7LTE4NSwgOTh9LCAgIHstMTIxLCA5OX0sCisgICAgIHstMTY5LCAxMDB9LCAgey01LCAxMDF9LCAgICB7LTEzNiwgMTAyfSwgIHstNjUsIC04NH0sICAgey04MywgLTg1fSwKKyAgICAgey04MiwgMTAzfSwgICB7LTcwLCAxMDR9LCAgIHstNTQsIDEwNX0sICAgey0zOCwgMTA2fSwgICB7MTA4LCAxMDd9LAorICAgICB7LTEwMSwgMTA5fSwgIHstMjIsIC0xMDJ9LCAgey0xMjIsIC0xMjN9LCB7MTExLCAxMTB9LCAgIHsxMTMsIDExMn0sCisgICAgIHstMTI1LCAxMTR9LCAgey04NywgLTEyNH0sICB7LTcxLCAxMTV9LCAgIHstMTY4LCAxMTZ9LCAgey02LCAtMjAwfSwKKyAgICAgey0xODQsIDExN30sICB7LTE1MiwgMTE4fSwgIHstODEsIDExOX0sICAgezEyMSwgMTIwfSwgICB7LTEwNSwgMTIyfSwKKyAgICAgey0xMDYsIDEyM30sICB7LTk5LCAxMjR9LCAgIHstOTgsIC0xMDB9LCAgey0yMywgMTI1fSwgICB7LTEwNCwgMTI2fSwKKyAgICAgey0zOSwgMTI3fSwgICB7LTEzNSwgMTI4fSwgIHstNTUsIC0xNTF9LCAgezEzMCwgMTI5fSwgICB7LTkxLCAtMTE5fSwKKyAgICAgey03LCAtMTk5fSwgICB7LTE4MywgMTMxfSwgIHstMTA3LCAtMTA4fSwgey0xMTYsIDEzMn0sICB7LTEwOSwgLTExN30sCisgICAgIHstNTYsIC0xNjd9LCAgey05NywgMTMzfSwgICB7LTkwLCAxMzR9LCAgIHstNzIsIDEzNX0sICAgey0xMTUsIC0xMTh9LAorICAgICB7LTkyLCAxMzZ9LCAgIHstOTMsIC0xNjZ9LCAgey0yNCwgLTExNH0sICB7LTg5LCAxMzd9LCAgIHstODgsIC0xNTB9LAorICAgICB7MTM5LCAxMzh9LCAgIHstOCwgMTQwfSwgICAgey00MCwgMTQxfSwgICB7LTE5OCwgMTQyfSwgIHstMTM0LCAxNDN9LAorICAgICB7LTExMywgMTQ0fSwgIHstMTgyLCAxNDV9LCAgezE0NywgMTQ2fSwgICB7LTQxLCAxNDh9LCAgIHstNTcsIC0xODF9LAorICAgICB7LTEzMSwgMTQ5fSwgIHsxNTEsIDE1MH0sICAgey0yNSwgMTUyfSwgICB7LTEzMiwgMTUzfSwgIHsxNTUsIDE1NH0sCisgICAgIHstOSwgLTc2fSwgICAgey00MiwgLTE2NX0sICB7LTczLCAtMTMzfSwgIHstNzcsIDE1Nn0sICAgey0xMzAsIDE1N30sCisgICAgIHstNzUsIC0xNDl9LCAgey0xMCwgLTE0Nn0sICB7LTI2LCAxNTh9LCAgIHstMTk3LCAxNTl9LCAgey0xODAsIDE2MH0sCisgICAgIHstMTQ3LCAtMTk2fSwgey01OCwgLTc0fSwgICB7LTI3LCAxNjF9LCAgIHstMTI5LCAtMTQ4fSwgey0xMSwgLTYxfSwKKyAgICAgey02MCwgMTYyfSwgICB7LTU5LCAxNjN9LCAgIHstNDMsIC0xNDV9LCAgey0xMiwgLTE2NH0sICB7LTE2MSwgMTY0fSwKKyAgICAgey0xNjMsIDE2NX0sICB7LTE2MiwgLTE5NX0sIHstMTc5LCAxNjZ9LCAgey0xNzcsIDE2N30sICB7LTI4LCAtMTc4fSwKKyAgICAgey00NSwgLTE5NH0sICB7LTI5LCAtNDR9LCAgIHstMTMsIC0xOTN9fX07CisKK2NvbnN0IEhVRkZfT0xEX05PREVTIGh1ZmZPTEROb2RlcyA9IHsKKyAgICB7Jmh1ZmZPTEROb2Rlc19oMURfMCwgJmh1ZmZPTEROb2Rlc19oMURfMSwgJmh1ZmZPTEROb2Rlc19oMURfMX0sCisgICAge3smaHVmZk9MRE5vZGVzX2gyRF8wXzAsICZodWZmT0xETm9kZXNfaDJEXzBfMX0sCisgICAgIHsmaHVmZk9MRE5vZGVzX2gyRF8xXzAsICZodWZmT0xETm9kZXNfaDJEXzFfMX0sCisgICAgIHsmaHVmZk9MRE5vZGVzX2gyRF8wXzEsICZodWZmT0xETm9kZXNfaDJEXzBfMX19fTsKZGlmZiAtLWdpdCBhL2xpYkZESy9zcmMvbWRjdC5jcHAgYi9saWJGREsvc3JjL21kY3QuY3BwCmluZGV4IDlhMjlhYTEuLmQ2OTdjZmIgMTAwNjQ0Ci0tLSBhL2xpYkZESy9zcmMvbWRjdC5jcHAKKysrIGIvbGliRkRLL3NyYy9tZGN0LmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw1MCArOTAsMjA2IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgogCi0gICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsLCBNYW51ZWwgSmFuZGVyCi0gICBEZXNjcmlwdGlvbjogTURDVCByb3V0aW5lcworICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbCwgTWFudWVsIEphbmRlciwgWW91bGl5IE5pbm92LCBEYW5pZWwgSGFnZWwKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IE1EQ1QvTURTVCByb3V0aW5lcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAibWRjdC5oIgogCi0KICNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCiAjaW5jbHVkZSAiZGN0LmgiCiAjaW5jbHVkZSAiZml4cG9pbnRfbWF0aC5oIgogCi0KLXZvaWQgbWRjdF9pbml0KCBIX01EQ1QgaE1kY3QsCi0gICAgICAgICAgICAgICAgRklYUF9EQkwgKm92ZXJsYXAsCi0gICAgICAgICAgICAgICAgSU5UIG92ZXJsYXBCdWZmZXJTaXplICkKLXsKK3ZvaWQgbWRjdF9pbml0KEhfTURDVCBoTWRjdCwgRklYUF9EQkwgKm92ZXJsYXAsIElOVCBvdmVybGFwQnVmZmVyU2l6ZSkgewogICBoTWRjdC0+b3ZlcmxhcC5mcmVxID0gb3ZlcmxhcDsKLSAgLy9GREttZW1jbGVhcihvdmVybGFwLCBvdmVybGFwQnVmZmVyU2l6ZSpzaXplb2YoRklYUF9EQkwpKTsKKyAgLy8gRkRLbWVtY2xlYXIob3ZlcmxhcCwgb3ZlcmxhcEJ1ZmZlclNpemUqc2l6ZW9mKEZJWFBfREJMKSk7CiAgIGhNZGN0LT5wcmV2X2ZyID0gMDsKICAgaE1kY3QtPnByZXZfbnIgPSAwOwogICBoTWRjdC0+cHJldl90bCA9IDA7CiAgIGhNZGN0LT5vdl9zaXplID0gb3ZlcmxhcEJ1ZmZlclNpemU7CisgIGhNZGN0LT5wcmV2QWxpYXNTeW1tZXRyeSA9IDA7CisgIGhNZGN0LT5wcmV2UHJldkFsaWFzU3ltbWV0cnkgPSAwOworICBoTWRjdC0+cEZhY1ppciA9IE5VTEw7CisgIGhNZGN0LT5wQXN5bU92bHAgPSBOVUxMOwogfQogCisvKgorVGhpcyBwcm9ncmFtIGltcGxlbWVudHMgdGhlIGZvcndhcmQgTURDVCB0cmFuc2Zvcm0gb24gYW4gaW5wdXQgYmxvY2sgb2YgZGF0YS4KK1RoZSBpbnB1dCBibG9jayBpcyBpbiBhIGZvcm0gKEEsQixDLEQpIHdoZXJlIEEsQixDIGFuZCBEIGFyZSB0aGUgcmVzcGVjdGl2ZQorMS80dGggc2VnbWVudHMgb2YgdGhlIGJsb2NrLiBUaGUgcHJvZ3JhbSB0YWtlcyB0aGUgaW5wdXQgYmxvY2sgYW5kIGZvbGRzIGl0IGluCit0aGUgZm9ybToKKygtRC1DcixBLUJyKS4gVGhpcyBibG9jayBpcyB0d2ljZSBzaG9ydGVyIGFuZCBoZXJlIHRoZSAncicgc3VmZml4IGRlbm90ZXMKK2ZsaXBwaW5nIG9mIHRoZSBzZXF1ZW5jZSAocmV2ZXJzaW5nIHRoZSBvcmRlciBvZiB0aGUgc2FtcGxlcykuIFdoaWxlIGZvbGRpbmcgdGhlCitpbnB1dCBibG9jayBpbiB0aGUgYWJvdmUgbWVudGlvbmVkIHNob3J0ZXIgYmxvY2sgdGhlIHByb2dyYW0gd2luZG93cyB0aGUgZGF0YS4KK0JlY2F1c2UgdGhlIHR3byBvcGVyYXRpb25zICh3aW5kb3dpbmcgYW5kIGZvbGRpbmcpIGFyZSBub3QgaW1wbGVtZW50ZWQKK3NlcXVlbnRpYWxseSwgYnV0IHRvZ2V0aGVyIHRoZSBwcm9ncmFtJ3Mgc3RydWN0dXJlIGlzIG5vdCBlYXN5IHRvIHVuZGVyc3RhbmQuCitPbmNlIHRoZSBvdXRwdXQgKGFscmVhZHkgd2luZG93ZWQpIGJsb2NrICgtRC1DcixBLUJyKSBpcyByZWFkeSBpdCBpcyBwYXNzZWQgdG8KK3RoZSBEQ1QgSVYgZm9yIHByb2Nlc3NpbmcuCisqLworSU5UIG1kY3RfYmxvY2soSF9NRENUIGhNZGN0LCBjb25zdCBJTlRfUENNICpSRVNUUklDVCB0aW1lRGF0YSwKKyAgICAgICAgICAgICAgIGNvbnN0IElOVCBub0luU2FtcGxlcywgRklYUF9EQkwgKlJFU1RSSUNUIG1kY3REYXRhLAorICAgICAgICAgICAgICAgY29uc3QgSU5UIG5TcGVjLCBjb25zdCBJTlQgdGwsIGNvbnN0IEZJWFBfV1RQICpwUmlnaHRXaW5kb3dQYXJ0LAorICAgICAgICAgICAgICAgY29uc3QgSU5UIGZyLCBTSE9SVCAqcE1kY3REYXRhX2UpIHsKKyAgaW50IGksIG47CisgIC8qIHRsOiB0cmFuc2Zvcm0gbGVuZ3RoCisgICAgIGZsOiBsZWZ0IHdpbmRvdyBzbG9wZSBsZW5ndGgKKyAgICAgbmw6IGxlZnQgd2luZG93IHNsb3BlIG9mZnNldAorICAgICBmcjogcmlnaHQgd2luZG93IHNsb3BlIGxlbmd0aAorICAgICBucjogcmlnaHQgd2luZG93IHNsb3BlIG9mZnNldAorICAgICBTZWUgRkRLX3Rvb2xzL2RvYy9pbnRlcm4vbWRjdC50ZXggZm9yIG1vcmUgZGV0YWlsLiAqLworICBpbnQgZmwsIG5sLCBucjsKKyAgY29uc3QgRklYUF9XVFAgKndscywgKndyczsKIAotdm9pZCBpbWRjdF9nYWluKEZJWFBfREJMICpwR2Fpbl9tLCBpbnQgKnBHYWluX2UsIGludCB0bCkKLXsKKyAgd3JzID0gcFJpZ2h0V2luZG93UGFydDsKKworICAvKiBEZXRlY3QgRlJwcmV2aW91cyAvIEZMIG1pc21hdGNoZXMgYW5kIG92ZXJyaWRlIHBhcmFtZXRlcnMgYWNjb3JkaW5nbHkgKi8KKyAgaWYgKGhNZGN0LT5wcmV2X2ZyID09CisgICAgICAwKSB7IC8qIEF0IHN0YXJ0IGp1c3QgaW5pdGlhbGl6ZSBhbmQgcGFzcyBwYXJhbWV0ZXJzIGFzIHRoZXkgYXJlICovCisgICAgaE1kY3QtPnByZXZfZnIgPSBmcjsKKyAgICBoTWRjdC0+cHJldl93cnMgPSB3cnM7CisgICAgaE1kY3QtPnByZXZfdGwgPSB0bDsKKyAgfQorCisgIC8qIERlcml2ZSBOUiAqLworICBuciA9ICh0bCAtIGZyKSA+PiAxOworCisgIC8qIFNraXAgaW5wdXQgc2FtcGxlcyBpZiB0bCBpcyBzbWFsbGVyIHRoYW4gYmxvY2sgc2l6ZSAqLworICB0aW1lRGF0YSArPSAobm9JblNhbXBsZXMgLSB0bCkgPj4gMTsKKworICAvKiB3aW5kb3dpbmcgKi8KKyAgZm9yIChuID0gMDsgbiA8IG5TcGVjOyBuKyspIHsKKyAgICAvKgorICAgICAqIE1EQ1Qgc2NhbGU6CisgICAgICogKyAxOiBmTXVsdERpdjIoKSBpbiB3aW5kb3dpbmcuCisgICAgICogKyAxOiBCZWNhdXNlIG9mIGZhY3RvciAxLzIgaW4gUHJpbmNlbi1CcmFkbGV5IGNvbXBsaWFudCB3aW5kb3dlZCBUREFDLgorICAgICAqLworICAgIElOVCBtZGN0RGF0YV9lID0gMSArIDE7CisKKyAgICAvKiBEZXJpdmUgbGVmdCBwYXJhbWV0ZXJzICovCisgICAgd2xzID0gaE1kY3QtPnByZXZfd3JzOworICAgIGZsID0gaE1kY3QtPnByZXZfZnI7CisgICAgbmwgPSAodGwgLSBmbCkgPj4gMTsKKworICAgIC8qIEhlcmUgd2UgaW1wbGVtZW50IGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHdoYXQgaGFwcGVucyBhZnRlciB0aGUgdGhpcworICAgIHBpZWNlIG9mIGNvZGUgKHNlZSB0aGUgY29tbWVudHMgYmVsb3cpLiBXZSBpbXBsZW1lbnQgdGhlIGZvbGRpbmcgb2YgQSBhbmQgQgorICAgIHNlZ21lbnRzIHRvIChBLUJyKSBidXQgQSBpcyB6ZXJvLCBiZWNhdXNlIGluIHRoaXMgcGFydCBvZiB0aGUgTURDVCBzZXF1ZW5jZQorICAgIHRoZSB3aW5kb3cgY29lZmZpY2llbnRzIHdpdGggd2hpY2ggQSBtdXN0IGJlIG11bHRpcGxpZWQgYXJlIHplcm8uICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IG5sOyBpKyspIHsKKyNpZiBTQU1QTEVfQklUUyA9PSBERlJBQ1RfQklUUyAvKiBTUENfQklUUyBhbmQgREZSQUNUX0JJVFMgc2hvdWxkIGJlIGVxdWFsLiAqLworICAgICAgbWRjdERhdGFbKHRsIC8gMikgKyBpXSA9IC0oKEZJWFBfREJMKXRpbWVEYXRhW3RsIC0gaSAtIDFdID4+ICgxKSk7CisjZWxzZQorICAgICAgbWRjdERhdGFbKHRsIC8gMikgKyBpXSA9IC0oRklYUF9EQkwpdGltZURhdGFbdGwgLSBpIC0gMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoREZSQUNUX0JJVFMgLSBTQU1QTEVfQklUUyAtIDEpOyAvKiAwKEEpLUJyICovCisjZW5kaWYKKyAgICB9CisKKyAgICAvKiBJbXBsZW1lbnRzIHRoZSBmb2xkaW5nIGFuZCB3aW5kb3dpbmcgb2YgdGhlIGxlZnQgcGFydCBvZiB0aGUgc2VxdWVuY2UsCisgICAgdGhhdCBpcyBzZWdtZW50cyBBIGFuZCBCLiBUaGUgQSBzZWdtZW50IGlzIG11bHRpcGxpZWQgYnkgdGhlIHJlc3BlY3RpdmUgbGVmdAorICAgIHdpbmRvdyBjb2VmZmljaWVudCBhbmQgcGxhY2VkIGluIGEgdGVtcG9yYXJ5IHZhcmlhYmxlLgorCisgICAgdG1wMCA9IGZNdWx0RGl2MigoRklYUF9QQ00pdGltZURhdGFbaStubF0sIHBMZWZ0V2luZG93UGFydFtpXS52LmltKTsKKworICAgIEFmdGVyIHRoaXMgdGhlIEIgc2VnbWVudCB0YWtlbiBpbiByZXZlcnNlIG9yZGVyIGlzIG11bHRpcGxpZWQgYnkgdGhlIGxlZnQKKyAgICB3aW5kb3cgYW5kIHN1YnRyYWN0ZWQgZnJvbSB0aGUgcHJldmlvdXNseSBkZXJpdmVkIHRlbXBvcmFyeSB2YXJpYWJsZSwgc28KKyAgICB0aGF0IGZpbmFsbHkgd2UgaW1wbGVtZW50IHRoZSBBLUJyIG9wZXJhdGlvbi4gVGhpcyBvdXRwdXQgaXMgd3JpdHRlbiB0byB0aGUKKyAgICByaWdodCBwYXJ0IG9mIHRoZSBNRENUIG91dHB1dCA6ICgtRC1DcixBLUJyKS4KKworICAgIG1kY3REYXRhWyh0bC8yKStpK25sXSA9IGZNdWx0U3ViRGl2Mih0bXAwLCAoRklYUF9QQ00pdGltZURhdGFbdGwtbmwtaS0xXSwKKyAgICBwTGVmdFdpbmRvd1BhcnRbaV0udi5yZSk7Ly9BKndpbmRvdy1Ccip3aW5kb3cKKworICAgIFRoZSAoQS1CcikgZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgYnVmZmVyIChtZGN0RGF0YSkgd2l0aG91dCBiZWluZworICAgIGZsaXBwZWQuICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBmbCAvIDI7IGkrKykgeworICAgICAgRklYUF9EQkwgdG1wMDsKKyAgICAgIHRtcDAgPSBmTXVsdERpdjIoKEZJWFBfUENNKXRpbWVEYXRhW2kgKyBubF0sIHdsc1tpXS52LmltKTsgLyogYSp3aW5kb3cgKi8KKyAgICAgIG1kY3REYXRhWyh0bCAvIDIpICsgaSArIG5sXSA9CisgICAgICAgICAgZk11bHRTdWJEaXYyKHRtcDAsIChGSVhQX1BDTSl0aW1lRGF0YVt0bCAtIG5sIC0gaSAtIDFdLAorICAgICAgICAgICAgICAgICAgICAgICB3bHNbaV0udi5yZSk7IC8qIEEqd2luZG93LUJyKndpbmRvdyAqLworICAgIH0KKworICAgIC8qIFJpZ2h0IHdpbmRvdyBzbG9wZSBvZmZzZXQgKi8KKyAgICAvKiBIZXJlIHdlIGltcGxlbWVudCBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB3aGF0IGhhcHBlbnMgYWZ0ZXIgdGhlIHRoaXMKKyAgICBwaWVjZSBvZiBjb2RlIChzZWUgdGhlIGNvbW1lbnRzIGJlbG93KS4gV2UgaW1wbGVtZW50IHRoZSBmb2xkaW5nIG9mIEMgYW5kIEQKKyAgICBzZWdtZW50cyB0byAoLUQtQ3IpIGJ1dCBEIGlzIHplcm8sIGJlY2F1c2UgaW4gdGhpcyBwYXJ0IG9mIHRoZSBNRENUIHNlcXVlbmNlCisgICAgdGhlIHdpbmRvdyBjb2VmZmljaWVudHMgd2l0aCB3aGljaCBEIG11c3QgYmUgbXVsdGlwbGllZCBhcmUgemVyby4gICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworI2lmIFNBTVBMRV9CSVRTID09IFwKKyAgICBERlJBQ1RfQklUUyAvKiBUaGlzIHNob3VsZCBiZSBTUENfQklUUyBpbnN0ZWFkIG9mIERGUkFDVF9CSVRTLiAqLworICAgICAgbWRjdERhdGFbKHRsIC8gMikgLSAxIC0gaV0gPSAtKChGSVhQX0RCTCl0aW1lRGF0YVt0bCArIGldID4+ICgxKSk7CisjZWxzZQorICAgICAgbWRjdERhdGFbKHRsIC8gMikgLSAxIC0gaV0gPQorICAgICAgICAgIC0oRklYUF9EQkwpdGltZURhdGFbdGwgKyBpXQorICAgICAgICAgIDw8IChERlJBQ1RfQklUUyAtIFNBTVBMRV9CSVRTIC0gMSk7IC8qIC1DIGZsaXBwZWQgYXQgcGxhY2luZyAqLworI2VuZGlmCisgICAgfQorCisgICAgLyogSW1wbGVtZW50cyB0aGUgZm9sZGluZyBhbmQgd2luZG93aW5nIG9mIHRoZSByaWdodCBwYXJ0IG9mIHRoZSBzZXF1ZW5jZSwKKyAgICB0aGF0IGlzLCBzZWdtZW50cyBDIGFuZCBELiBUaGUgQyBzZWdtZW50IGlzIG11bHRpcGxpZWQgYnkgdGhlIHJlc3BlY3RpdmUKKyAgICByaWdodCB3aW5kb3cgY29lZmZpY2llbnQgYW5kIHBsYWNlZCBpbiBhIHRlbXBvcmFyeSB2YXJpYWJsZS4KKworICAgIHRtcDEgPSBmTXVsdERpdjIoKEZJWFBfUENNKXRpbWVEYXRhW3RsK25yK2ldLCBwUmlnaHRXaW5kb3dQYXJ0W2ldLnYucmUpOworCisgICAgQWZ0ZXIgdGhpcyB0aGUgRCBzZWdtZW50IHRha2VuIGluIHJldmVyc2Ugb3JkZXIgaXMgbXVsdGlwbGllZCBieSB0aGUgcmlnaHQKKyAgICB3aW5kb3cgYW5kIGFkZGVkIGZyb20gdGhlIHByZXZpb3VzbHkgZGVyaXZlZCB0ZW1wb3JhcnkgdmFyaWFibGUsIHNvIHRoYXQgd2UKKyAgICBnZXQgKEMrRHIpIG9wZXJhdGlvbi4gVGhpcyBvdXRwdXQgaXMgbmVnYXRlZCB0byBnZXQgKC1DLURyKSBhbmQgd3JpdHRlbiB0bworICAgIHRoZSBsZWZ0IHBhcnQgb2YgdGhlIE1EQ1Qgb3V0cHV0IHdoaWxlIGJlaW5nIHJldmVyc2VkIChmbGlwcGVkKSBhdCB0aGUgc2FtZQorICAgIHRpbWUsIHNvIHRoYXQgZnJvbSAoLUMtRHIpIHdlIGdldCAoLUQtQ3IpPT4gKC1ELUNyLEEtQnIpLgorCisgICAgbWRjdERhdGFbKHRsLzIpLW5yLWktMV0gPSAtZk11bHRBZGREaXYyKHRtcDEsCisgICAgKEZJWFBfUENNKXRpbWVEYXRhWyh0bCoyKS1uci1pLTFdLCBwUmlnaHRXaW5kb3dQYXJ0W2ldLnYuaW0pOyovCisgICAgZm9yIChpID0gMDsgaSA8IGZyIC8gMjsgaSsrKSB7CisgICAgICBGSVhQX0RCTCB0bXAxOworICAgICAgdG1wMSA9IGZNdWx0RGl2MigoRklYUF9QQ00pdGltZURhdGFbdGwgKyBuciArIGldLAorICAgICAgICAgICAgICAgICAgICAgICB3cnNbaV0udi5yZSk7IC8qIEMqd2luZG93ICovCisgICAgICBtZGN0RGF0YVsodGwgLyAyKSAtIG5yIC0gaSAtIDFdID0KKyAgICAgICAgICAtZk11bHRBZGREaXYyKHRtcDEsIChGSVhQX1BDTSl0aW1lRGF0YVsodGwgKiAyKSAtIG5yIC0gaSAtIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgd3JzW2ldLnYuaW0pOyAvKiAtKEMqd2luZG93K0RyKndpbmRvdykgYW5kIGZsaXAgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNpbmcgLT4gLUNyIC0gRCAqLworICAgIH0KKworICAgIC8qIFdlIHBhc3MgdGhlIHNob3J0ZW5lZCBmb2xkZWQgZGF0YSAoLUQtQ3IsQS1CcikgdG8gdGhlIE1EQ1QgZnVuY3Rpb24gKi8KKyAgICBkY3RfSVYobWRjdERhdGEsIHRsLCAmbWRjdERhdGFfZSk7CisKKyAgICBwTWRjdERhdGFfZVtuXSA9IChTSE9SVCltZGN0RGF0YV9lOworCisgICAgdGltZURhdGEgKz0gdGw7CisgICAgbWRjdERhdGEgKz0gdGw7CisKKyAgICBoTWRjdC0+cHJldl93cnMgPSB3cnM7CisgICAgaE1kY3QtPnByZXZfZnIgPSBmcjsKKyAgICBoTWRjdC0+cHJldl90bCA9IHRsOworICB9CisKKyAgcmV0dXJuIG5TcGVjICogdGw7Cit9CisKK3ZvaWQgaW1kY3RfZ2FpbihGSVhQX0RCTCAqcEdhaW5fbSwgaW50ICpwR2Fpbl9lLCBpbnQgdGwpIHsKICAgRklYUF9EQkwgZ2Fpbl9tID0gKnBHYWluX207CiAgIGludCBnYWluX2UgPSAqcEdhaW5fZTsKICAgaW50IGxvZzJfdGw7CiAKLSAgbG9nMl90bCA9IERGUkFDVF9CSVRTLTEtZk5vcm16KChGSVhQX0RCTCl0bCk7CisgIGdhaW5fZSArPSAtTURDVF9PVVRQVVRfR0FJTiAtIE1EQ1RfT1VUX0hFQURST09NICsgMTsKKyAgaWYgKHRsID09IDApIHsKKyAgICAvKiBEb250IHJlZ2FyZCB0aGUgMi9OIGZhY3RvciBmcm9tIHRoZSBJRENULiBJdCBpcyBjb21wZW5zYXRlZCBmb3Igc29tZXdoZXJlCisgICAgICogZWxzZS4gKi8KKyAgICAqcEdhaW5fZSA9IGdhaW5fZTsKKyAgICByZXR1cm47CisgIH0KIAotICBnYWluX2UgKz0gLU1EQ1RfT1VUUFVUX0dBSU4gLSBsb2cyX3RsIC0gTURDVF9PVVRfSEVBRFJPT00gKyAxOworICBsb2cyX3RsID0gREZSQUNUX0JJVFMgLSAxIC0gZk5vcm16KChGSVhQX0RCTCl0bCk7CisgIGdhaW5fZSArPSAtbG9nMl90bDsKIAogICAvKiBEZXRlY3Qgbm9uLXJhZGl4IDIgdHJhbnNmb3JtIGxlbmd0aCBhbmQgYWRkIGFtcGxpdHVkZSBjb21wZW5zYXRpb24gZmFjdG9yCiAgICAgIHdoaWNoIGNhbm5vdCBiZSBpbmNsdWRlZCBpbnRvIHRoZSBleHBvbmVudCBhYm92ZSAqLwotICBzd2l0Y2ggKCAodGwpID4+IChsb2cyX3RsIC0gMikgKSB7Ci0gICAgY2FzZSAweDc6IC8qIDEwIG1zLCAxL3RsID0gMS4wLyhGREtwb3coMi4wLCAtbG9nMl90bCkgKiAwLjUzMzMzMzMzMzMzMzMzMzMzMzMzKSAqLworICBzd2l0Y2ggKCh0bCkgPj4gKGxvZzJfdGwgLSAyKSkgeworICAgIGNhc2UgMHg3OiAvKiAxMCBtcywgMS90bCA9IDEuMC8oRkRLcG93KDIuMCwgLWxvZzJfdGwpICoKKyAgICAgICAgICAgICAgICAgMC41MzMzMzMzMzMzMzMzMzMzMzMzMykgKi8KICAgICAgIGlmIChnYWluX20gPT0gKEZJWFBfREJMKTApIHsKICAgICAgICAgZ2Fpbl9tID0gRkwyRlhDT05TVF9EQkwoMC41MzMzMzMzMzMzMzMzMzMzMzMzM2YpOwogICAgICAgfSBlbHNlIHsKQEAgLTEzMSw5ICsyOTgsMTcgQEAKICAgICAgIGJyZWFrOwogICAgIGNhc2UgMHg2OiAvKiAzLzQgb2YgcmFkaXggMiwgMS90bCA9IDEuMC8oRkRLcG93KDIuMCwgLWxvZzJfdGwpICogMi4wLzMuMCkgKi8KICAgICAgIGlmIChnYWluX20gPT0gKEZJWFBfREJMKTApIHsKLSAgICAgICAgZ2Fpbl9tID0gRkwyRlhDT05TVF9EQkwoMi4wLzMuMGYpOworICAgICAgICBnYWluX20gPSBGTDJGWENPTlNUX0RCTCgyLjAgLyAzLjBmKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGdhaW5fbSA9IGZNdWx0KGdhaW5fbSwgRkwyRlhDT05TVF9EQkwoMi4wLzMuMGYpKTsKKyAgICAgICAgZ2Fpbl9tID0gZk11bHQoZ2Fpbl9tLCBGTDJGWENPTlNUX0RCTCgyLjAgLyAzLjBmKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4NTogLyogMC44IG9mIHJhZGl4IDIgKGUuZy4gdGwgMTYwKSwgMS90bCA9IDEuMC8oRkRLcG93KDIuMCwgLWxvZzJfdGwpCisgICAgICAgICAgICAgICAqIDAuOC8xLjUpICovCisgICAgICBpZiAoZ2Fpbl9tID09IChGSVhQX0RCTCkwKSB7CisgICAgICAgIGdhaW5fbSA9IEZMMkZYQ09OU1RfREJMKDAuNTMzMzMzMzMzMzMzMzMzMzMzMzNmKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdhaW5fbSA9IGZNdWx0KGdhaW5fbSwgRkwyRlhDT05TVF9EQkwoMC41MzMzMzMzMzMzMzMzMzMzMzMzM2YpKTsKICAgICAgIH0KICAgICAgIGJyZWFrOwogICAgIGNhc2UgMHg0OgpAQCAtMTQ5LDEyICszMjQsNyBAQAogICAqcEdhaW5fZSA9IGdhaW5fZTsKIH0KIAotSU5UIGltZGN0X2RyYWluKAotICAgICAgICBIX01EQ1QgaE1kY3QsCi0gICAgICAgIEZJWFBfREJMICpvdXRwdXQsCi0gICAgICAgIElOVCBuclNhbXBsZXNSb29tCi0gICAgICAgICkKLXsKK0lOVCBpbWRjdF9kcmFpbihIX01EQ1QgaE1kY3QsIEZJWFBfREJMICpvdXRwdXQsIElOVCBuclNhbXBsZXNSb29tKSB7CiAgIGludCBidWZmZXJlZF9zYW1wbGVzID0gMDsKIAogICBpZiAobnJTYW1wbGVzUm9vbSA+IDApIHsKQEAgLTE2Miw2MSArMzMyLDY2IEBACiAKICAgICBGREtfQVNTRVJUKGJ1ZmZlcmVkX3NhbXBsZXMgPD0gbnJTYW1wbGVzUm9vbSk7CiAKLSAgICBpZiAoYnVmZmVyZWRfc2FtcGxlcyA+IDApICB7Ci0gICAgICBGREttZW1jcHkob3V0cHV0LCBoTWRjdC0+b3ZlcmxhcC50aW1lLCBidWZmZXJlZF9zYW1wbGVzKnNpemVvZihGSVhQX0RCTCkpOworICAgIGlmIChidWZmZXJlZF9zYW1wbGVzID4gMCkgeworICAgICAgRkRLbWVtY3B5KG91dHB1dCwgaE1kY3QtPm92ZXJsYXAudGltZSwKKyAgICAgICAgICAgICAgICBidWZmZXJlZF9zYW1wbGVzICogc2l6ZW9mKEZJWFBfREJMKSk7CiAgICAgICBoTWRjdC0+b3Zfb2Zmc2V0ID0gMDsKICAgICB9CiAgIH0KICAgcmV0dXJuIGJ1ZmZlcmVkX3NhbXBsZXM7CiB9CiAKLUlOVCBpbWRjdF9jb3B5X292X2FuZF9ucigKLSAgICAgICAgSF9NRENUIGhNZGN0LAotICAgICAgICBGSVhQX0RCTCAqIHBUaW1lRGF0YSwKLSAgICAgICAgSU5UIG5yU2FtcGxlcwotICAgICAgICApCi17CitJTlQgaW1kY3RfY29weV9vdl9hbmRfbnIoSF9NRENUIGhNZGN0LCBGSVhQX0RCTCAqcFRpbWVEYXRhLCBJTlQgbnJTYW1wbGVzKSB7CiAgIEZJWFBfREJMICpwT3ZsOwogICBpbnQgbnQsIG5mLCBpOwogCiAgIG50ID0gZk1pbihoTWRjdC0+b3Zfb2Zmc2V0LCBuclNhbXBsZXMpOwogICBuclNhbXBsZXMgLT0gbnQ7CiAgIG5mID0gZk1pbihoTWRjdC0+cHJldl9uciwgbnJTYW1wbGVzKTsKLSAgbnJTYW1wbGVzIC09IG5mOwotICBGREttZW1jcHkocFRpbWVEYXRhLCBoTWRjdC0+b3ZlcmxhcC50aW1lLCBudCpzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY3B5KHBUaW1lRGF0YSwgaE1kY3QtPm92ZXJsYXAudGltZSwgbnQgKiBzaXplb2YoRklYUF9EQkwpKTsKICAgcFRpbWVEYXRhICs9IG50OwogCiAgIHBPdmwgPSBoTWRjdC0+b3ZlcmxhcC5mcmVxICsgaE1kY3QtPm92X3NpemUgLSAxOwotICBmb3IgKGk9MDsgaTxuZjsgaSsrKSB7Ci0gICAgRklYUF9EQkwgeCA9IC0gKCpwT3ZsLS0pOwotICAgICpwVGltZURhdGEgPSBJTURDVF9TQ0FMRV9EQkwoeCk7Ci0gICAgcFRpbWVEYXRhICsrOworICBpZiAoaE1kY3QtPnByZXZQcmV2QWxpYXNTeW1tZXRyeSA9PSAwKSB7CisgICAgZm9yIChpID0gMDsgaSA8IG5mOyBpKyspIHsKKyAgICAgIEZJWFBfREJMIHggPSAtKCpwT3ZsLS0pOworICAgICAgKnBUaW1lRGF0YSA9IElNRENUX1NDQUxFX0RCTCh4KTsKKyAgICAgIHBUaW1lRGF0YSsrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmY7IGkrKykgeworICAgICAgRklYUF9EQkwgeCA9ICgqcE92bC0tKTsKKyAgICAgICpwVGltZURhdGEgPSBJTURDVF9TQ0FMRV9EQkwoeCk7CisgICAgICBwVGltZURhdGErKzsKKyAgICB9CiAgIH0KIAotICByZXR1cm4gKG50K25mKTsKKyAgcmV0dXJuIChudCArIG5mKTsKIH0KIAotdm9pZCBpbWRjdF9hZGFwdF9wYXJhbWV0ZXJzKEhfTURDVCBoTWRjdCwgaW50ICpwZmwsIGludCAqcG5sLCBpbnQgdGwsIGNvbnN0IEZJWFBfV1RQICp3bHMsIGludCBub091dFNhbXBsZXMpCi17Cit2b2lkIGltZGN0X2FkYXB0X3BhcmFtZXRlcnMoSF9NRENUIGhNZGN0LCBpbnQgKnBmbCwgaW50ICpwbmwsIGludCB0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1dUUCAqd2xzLCBpbnQgbm9PdXRTYW1wbGVzKSB7CiAgIGludCBmbCA9ICpwZmwsIG5sID0gKnBubDsKICAgaW50IHdpbmRvd19kaWZmLCB1c2VfY3VycmVudCA9IDAsIHVzZV9wcmV2aW91cyA9IDA7CiAgIGlmIChoTWRjdC0+cHJldl90bCA9PSAwKSB7Ci0gICAgaE1kY3QtPnByZXZfd3JzICAgID0gd2xzOwotICAgIGhNZGN0LT5wcmV2X2ZyICAgICA9IGZsOwotICAgIGhNZGN0LT5wcmV2X25yICAgICA9IChub091dFNhbXBsZXMtZmwpPj4xOwotICAgIGhNZGN0LT5wcmV2X3RsICAgICA9IG5vT3V0U2FtcGxlczsKLSAgICBoTWRjdC0+b3Zfb2Zmc2V0ICAgPSAwOworICAgIGhNZGN0LT5wcmV2X3dycyA9IHdsczsKKyAgICBoTWRjdC0+cHJldl9mciA9IGZsOworICAgIGhNZGN0LT5wcmV2X25yID0gKG5vT3V0U2FtcGxlcyAtIGZsKSA+PiAxOworICAgIGhNZGN0LT5wcmV2X3RsID0gbm9PdXRTYW1wbGVzOworICAgIGhNZGN0LT5vdl9vZmZzZXQgPSAwOwogICAgIHVzZV9jdXJyZW50ID0gMTsKICAgfQogCi0gIHdpbmRvd19kaWZmID0gKGhNZGN0LT5wcmV2X2ZyIC0gZmwpPj4xOworICB3aW5kb3dfZGlmZiA9IChoTWRjdC0+cHJldl9mciAtIGZsKSA+PiAxOwogCi0gIC8qIGNoZWNrIGlmIHRoZSBwcmV2aW91cyB3aW5kb3cgc2xvcGUgY2FuIGJlIGFkanVzdGVkIHRvIG1hdGNoIHRoZSBjdXJyZW50IHdpbmRvdyBzbG9wZSAqLworICAvKiBjaGVjayBpZiB0aGUgcHJldmlvdXMgd2luZG93IHNsb3BlIGNhbiBiZSBhZGp1c3RlZCB0byBtYXRjaCB0aGUgY3VycmVudAorICAgKiB3aW5kb3cgc2xvcGUgKi8KICAgaWYgKGhNZGN0LT5wcmV2X25yICsgd2luZG93X2RpZmYgPiAwKSB7CiAgICAgdXNlX2N1cnJlbnQgPSAxOwogICB9Ci0gIC8qIGNoZWNrIGlmIHRoZSBjdXJyZW50IHdpbmRvdyBzbG9wZSBjYW4gYmUgYWRqdXN0ZWQgdG8gbWF0Y2ggdGhlIHByZXZpb3VzIHdpbmRvdyBzbG9wZSAqLwotICBpZiAobmwgLSB3aW5kb3dfZGlmZiA+IDAgKSB7CisgIC8qIGNoZWNrIGlmIHRoZSBjdXJyZW50IHdpbmRvdyBzbG9wZSBjYW4gYmUgYWRqdXN0ZWQgdG8gbWF0Y2ggdGhlIHByZXZpb3VzCisgICAqIHdpbmRvdyBzbG9wZSAqLworICBpZiAobmwgLSB3aW5kb3dfZGlmZiA+IDApIHsKICAgICB1c2VfcHJldmlvdXMgPSAxOwogICB9CiAKQEAgLTIyNCwxMyArMzk5LDExIEBACiAgIGlmICh1c2VfY3VycmVudCAmJiB1c2VfcHJldmlvdXMpIHsKICAgICBpZiAoZmwgPCBoTWRjdC0+cHJldl9mcikgewogICAgICAgdXNlX2N1cnJlbnQgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICB1c2VfcHJldmlvdXMgPSAwOwogICAgIH0KICAgfQogICAvKgotICAgKiBJZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtIGJsb2NrIGlzIGJpZyBlbm91Z2gsIGVubGFyZ2UgcHJldmlvdXMgd2luZG93IG92ZXJsYXAsCi0gICAqIGlmIG5vdCwgdGhlbiBzaHJpbmsgY3VycmVudCB3aW5kb3cgb3ZlcmxhcC4KKyAgICogSWYgdGhlIHByZXZpb3VzIHRyYW5zZm9ybSBibG9jayBpcyBiaWcgZW5vdWdoLCBlbmxhcmdlIHByZXZpb3VzIHdpbmRvdworICAgKiBvdmVybGFwLCBpZiBub3QsIHRoZW4gc2hyaW5rIGN1cnJlbnQgd2luZG93IG92ZXJsYXAuCiAgICAqLwogICBpZiAodXNlX2N1cnJlbnQpIHsKICAgICBoTWRjdC0+cHJldl9uciArPSB3aW5kb3dfZGlmZjsKQEAgLTI0NSwyOSArNDE4LDY0IEBACiAgICpwbmwgPSBubDsKIH0KIAotSU5UICBpbWRjdF9ibG9jaygKLSAgICAgICAgSF9NRENUIGhNZGN0LAotICAgICAgICBGSVhQX0RCTCAqb3V0cHV0LAotICAgICAgICBGSVhQX0RCTCAqc3BlY3RydW0sCi0gICAgICAgIGNvbnN0IFNIT1JUIHNjYWxlZmFjdG9yW10sCi0gICAgICAgIGNvbnN0IElOVCBuU3BlYywKLSAgICAgICAgY29uc3QgSU5UIG5vT3V0U2FtcGxlcywKLSAgICAgICAgY29uc3QgSU5UIHRsLAotICAgICAgICBjb25zdCBGSVhQX1dUUCAqd2xzLAotICAgICAgICBJTlQgZmwsCi0gICAgICAgIGNvbnN0IEZJWFBfV1RQICp3cnMsCi0gICAgICAgIGNvbnN0IElOVCBmciwKLSAgICAgICAgRklYUF9EQkwgZ2FpbgotICAgICAgICApCi17CisvKgorVGhpcyBwcm9ncmFtIGltcGxlbWVudHMgdGhlIGludmVyc2UgbW9kdWxhdGVkIGxhcHBlZCB0cmFuc2Zvcm0sIGEgZ2VuZXJhbGl6ZWQKK3ZlcnNpb24gb2YgdGhlIGludmVyc2UgTURDVCB0cmFuc2Zvcm0uIFNldHRpbmcgbm9uZSBvZiB0aGUgTUxUXypfQUxJQVNfRkxBRworZmxhZ3MgY29tcHV0ZXMgdGhlIElNRENULCBzZXR0aW5nIGFsbCBvZiB0aGVtIGNvbXB1dGVzIHRoZSBJTURTVC4gT3RoZXIKK2NvbWJpbmF0aW9ucyBvZiB0aGVzZSBmbGFncyBjb21wdXRlIHR5cGUgSUlJIHRyYW5zZm9ybXMgdXNlZCBieSB0aGUgUlNWRDYwCittdWx0aWNoYW5uZWwgdG9vbCBmb3IgdHJhbnNpdGlvbnMgYmV0d2VlbiBNRENUL01EU1QuIFRoZSBmb2xsb3dpbmcgZGVzY3JpcHRpb24KK3JlbGF0ZXMgdG8gdGhlIElNRENUIG9ubHkuCisKK0lmIHdlIHBhc3MgdGhlIGRhdGEgYmxvY2sgKEEsQixDLEQsRSxGKSB0byB0aGUgRk9SV0FSRCBNRENUIGl0IHdpbGwgcHJvZHVjZSB0d28KK291dHB1dHMuIFRoZSBmaXJzdCBvbmUgd2lsbCBiZSBvdmVyIHRoZSAoQSxCLEMsRCkgcGFydCA9PigtRC1DcixBLUJyKSBhbmQgdGhlCitzZWNvbmQgb25lIHdpbGwgYmUgb3ZlciB0aGUgKEMsRCxFLEYpIHBhcnQgPT4gKC1GLUVyLEMtRHIpLCBzaW5jZSB0aGVyZSBpcyBhCitvdmVybGFwIGJldHdlZW4gY29uc2VxdXRpdmUgcGFzc2VzIG9mIHRoZSBhbGdvcml0aG0uIFRoaXMgb3ZlcmxhcCBpcyBvdmVyIHRoZQorKEMsRCkgc2VnbWVudHMuIFRoZSB0d28gb3V0cHV0cyB3aWxsIGJlIGdpdmVuIHNlcXVlbnRpYWxseSB0byB0aGUgRENUIElWCithbGdvcml0aG0uIEF0IHRoZSBJTlZFUlNFIE1EQ1Qgc2lkZSB3ZSBnZXQgdHdvIGNvbnNlY3V0aXZlIG91dHB1dHMgZnJvbSB0aGUgSURDVAorSVYgYWxnb3JpdGhtLCBuYW1lbHkgdGhlIHNhbWUgYmxvY2tzOiAoLUQtQ3IsQS1CcikgYW5kICgtRi1FcixDLURyKS4gVGhlIGZpcnN0CitvZiB0aGVtIGxhbmRzIGluIHRoZSBPdmVybGFwIGJ1ZmZlciBhbmQgdGhlIHNlY29uZCBpcyBpbiB0aGUgd29ya2luZyBvbmUsIHdoaWNoLAorb25lIGFsZ29yaXRobSBwYXNzIGxhdGVyIHdpbGwgc3Vic3RpdHV0ZSB0aGUgb25lIHJlc2lkaW5nIGluIHRoZSBvdmVybGFwCityZWdpc3Rlci4gVGhlIElNRENUIGFsZ29yaXRobSBoYXMgdG8gcHJvZHVjZSB0aGUgQyBhbmQgRCBzZWdtZW50cyBmcm9tIHRoZSB0d28KK2J1ZmZlcnMuIEluIG9yZGVyIHRvIGRvIHRoaXMgd2UgdGFrZSB0aGUgbGVmdCBwYXJ0IG9mIHRoZSBvdmVybGFwCitidWZmZXIoLUQtQ3IsQS1CciksIG5hbWVseSAoLUQtQ3IpIGFuZCBhZGQgaXQgYXBwcm9wcmlhdGVseSB0byB0aGUgcmlnaHQgcGFydCBvZgordGhlIHdvcmtpbmcgYnVmZmVyICgtRi1FcixDLURyKSwgbmFtZWx5IChDLURyKSwgc28gdGhhdCB3ZSBnZXQgZmlyc3QgdGhlIEMKK3NlZ21lbnQgYW5kIGxhdGVyIHRoZSBEIHNlZ21lbnQuIFdlIGRvIHRoaXMgaW4gdGhlIGZvbGxvd2luZyB3YXk6IEZyb20gdGhlIHJpZ2h0CitwYXJ0IG9mIHRoZSB3b3JraW5nIGJ1ZmZlcihDLURyKSB3ZSBzdWJ0cmFjdCB0aGUgZmxpcHBlZCBsZWZ0IHBhcnQgb2YgdGhlCitvdmVybGFwIGJ1ZmZlcigtRC1Dcik6CisKK1Jlc3VsdCA9IChDLURyKSAtIGZsaXBwZWQoLUQtQ3IpID0gQyAtRHIgKyBEciArIEMgPSAyQworV2UgZGl2aWRlIGJ5IHR3byBhbmQgZ2V0IHRoZSBDIHNlZ21lbnQuIFdoYXQgd2UgZGlkIGlzIGFkZGluZyB0aGUgcmlnaHQgcGFydCBvZgordGhlIGZpcnN0IGZyYW1lIHRvIHRoZSBsZWZ0IHBhcnQgb2YgdGhlIHNlY29uZCBvbmUuICAgV2hpbGUgYXBwbHlpbmcgdGhlc2UKK29wZXJhdGlvbiB3ZSBtdWx0aXBseSB0aGUgcmVzcGVjdGl2ZSBzZWdtZW50cyB3aXRoIHRoZSBhcHByb3ByaWF0ZSB3aW5kb3cKK2Z1bmN0aW9ucy4KKworSW4gb3JkZXIgdG8gZ2V0IHRoZSBEIHNlZ21lbnQgd2UgZG8gdGhlIGZvbGxvd2luZzoKK0Zyb20gdGhlIG5lZ2F0ZWQgc2Vjb25kIHBhcnQgb2YgdGhlIHdvcmtpbmcgYnVmZmVyKEMtRHIpIHdlIHN1YnRyYWN0IHRoZSBmbGlwcGVkCitmaXJzdCBwYXJ0IG9mIHRoZSBvdmVybGFwIGJ1ZmZlciAoLUQtQ3IpOgorCitSZXN1bHQ9IC0gKEMgLURyKSAtIGZsaXBwZWQoLUQtQ3IpPSAtQyArRHIgK0RyICtDID0gMkRyLgorQWZ0ZXIgZGl2aWRpbmcgYnkgdHdvIGFuZCBmbGlwcGluZyB3ZSBnZXQgdGhlIEQgc2VnbWVudC5XaGF0IHdlIGRpZCBpcyBhZGRpbmcKK3RoZSByaWdodCBwYXJ0IG9mIHRoZSBmaXJzdCBmcmFtZSB0byB0aGUgbGVmdCBwYXJ0IG9mIHRoZSBzZWNvbmQgb25lLiAgIFdoaWxlCithcHBseWluZyB0aGVzZSBvcGVyYXRpb24gd2UgbXVsdGlwbHkgdGhlIHJlc3BlY3RpdmUgc2VnbWVudHMgd2l0aCB0aGUKK2FwcHJvcHJpYXRlIHdpbmRvdyBmdW5jdGlvbnMuCisKK09uY2Ugd2UgaGF2ZSBvYnRhaW5lZCB0aGUgQyBhbmQgRCBzZWdtZW50cyB0aGUgb3ZlcmxhcCBidWZmZXIgaXMgZW1wdGllZCBhbmQgdGhlCitjdXJyZW50IGJ1ZmZlciBpcyBzZW50IGluIGl0LCBzbyB0aGF0IHRoZSBFIGFuZCBGIHNlZ21lbnRzIGFyZSBhdmFpbGFibGUgZm9yCitkZWNvZGluZyBpbiB0aGUgbmV4dCBhbGdvcml0aG0gcGFzcy4qLworSU5UIGltbHRfYmxvY2soSF9NRENUIGhNZGN0LCBGSVhQX0RCTCAqb3V0cHV0LCBGSVhQX0RCTCAqc3BlY3RydW0sCisgICAgICAgICAgICAgICBjb25zdCBTSE9SVCBzY2FsZWZhY3RvcltdLCBjb25zdCBJTlQgblNwZWMsCisgICAgICAgICAgICAgICBjb25zdCBJTlQgbm9PdXRTYW1wbGVzLCBjb25zdCBJTlQgdGwsIGNvbnN0IEZJWFBfV1RQICp3bHMsCisgICAgICAgICAgICAgICBJTlQgZmwsIGNvbnN0IEZJWFBfV1RQICp3cnMsIGNvbnN0IElOVCBmciwgRklYUF9EQkwgZ2FpbiwKKyAgICAgICAgICAgICAgIGludCBmbGFncykgewogICBGSVhQX0RCTCAqcE92bDsKICAgRklYUF9EQkwgKnBPdXQwID0gb3V0cHV0LCAqcE91dDE7CiAgIElOVCBubCwgbnI7CiAgIGludCB3LCBpLCBuclNhbXBsZXMgPSAwLCBzcGVjU2hpZnRTY2FsZSwgdHJhbnNmb3JtX2dhaW5fZSA9IDA7CisgIGludCBjdXJyQWxpYXNTeW1tZXRyeSA9IChmbGFncyAmIE1MVF9GTEFHX0NVUlJfQUxJQVNfU1lNTUVUUlkpOwogCiAgIC8qIERlcml2ZSBOUiBhbmQgTkwgKi8KLSAgbnIgPSAodGwgLSBmcik+PjE7Ci0gIG5sID0gKHRsIC0gZmwpPj4xOworICBuciA9ICh0bCAtIGZyKSA+PiAxOworICBubCA9ICh0bCAtIGZsKSA+PiAxOwogCiAgIC8qIEluY2x1ZGUgMi9OIElNRENUIGdhaW4gaW50byBnYWluIGZhY3RvciBhbmQgZXhwb25lbnQuICovCiAgIGltZGN0X2dhaW4oJmdhaW4sICZ0cmFuc2Zvcm1fZ2Fpbl9lLCB0bCk7CkBAIC0yNzksMTA3ICs0ODcsMjQxIEBACiAKICAgcE92bCA9IGhNZGN0LT5vdmVybGFwLmZyZXEgKyBoTWRjdC0+b3Zfc2l6ZSAtIDE7CiAKLSAgaWYgKCBub091dFNhbXBsZXMgPiBuclNhbXBsZXMgKSB7CisgIGlmIChub091dFNhbXBsZXMgPiBuclNhbXBsZXMpIHsKICAgICAvKiBQdXJnZSBidWZmZXJlZCBvdXRwdXQuICovCi0gICAgZm9yIChpPTA7IGk8aE1kY3QtPm92X29mZnNldDsgaSsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhNZGN0LT5vdl9vZmZzZXQ7IGkrKykgewogICAgICAgKnBPdXQwID0gaE1kY3QtPm92ZXJsYXAudGltZVtpXTsKLSAgICAgIHBPdXQwICsrOworICAgICAgcE91dDArKzsKICAgICB9CiAgICAgbnJTYW1wbGVzID0gaE1kY3QtPm92X29mZnNldDsKICAgICBoTWRjdC0+b3Zfb2Zmc2V0ID0gMDsKICAgfQogCi0gIGZvciAodz0wOyB3PG5TcGVjOyB3KyspCi0gIHsKKyAgZm9yICh3ID0gMDsgdyA8IG5TcGVjOyB3KyspIHsKICAgICBGSVhQX0RCTCAqcFNwZWMsICpwQ3VycjsKICAgICBjb25zdCBGSVhQX1dUUCAqcFdpbmRvdzsKIAorICAgIC8qIERldGVjdCBGUnByZXZpb3VzIC8gRkwgbWlzbWF0Y2hlcyBhbmQgb3ZlcnJpZGUgcGFyYW1ldGVycyBhY2NvcmRpbmdseSAqLworICAgIGlmIChoTWRjdC0+cHJldl9mciAhPSBmbCkgeworICAgICAgaW1kY3RfYWRhcHRfcGFyYW1ldGVycyhoTWRjdCwgJmZsLCAmbmwsIHRsLCB3bHMsIG5vT3V0U2FtcGxlcyk7CisgICAgfQorCiAgICAgc3BlY1NoaWZ0U2NhbGUgPSB0cmFuc2Zvcm1fZ2Fpbl9lOwogCiAgICAgLyogU2V0dXAgd2luZG93IHBvaW50ZXJzICovCiAgICAgcFdpbmRvdyA9IGhNZGN0LT5wcmV2X3dyczsKIAogICAgIC8qIEN1cnJlbnQgc3BlY3RydW0gKi8KLSAgICBwU3BlYyA9IHNwZWN0cnVtK3cqdGw7CisgICAgcFNwZWMgPSBzcGVjdHJ1bSArIHcgKiB0bDsKIAogICAgIC8qIERDVCBJViBvZiBjdXJyZW50IHNwZWN0cnVtLiAqLwotICAgIGRjdF9JVihwU3BlYywgdGwsICZzcGVjU2hpZnRTY2FsZSk7Ci0KLSAgICAvKiBPcHRpb25hbCBzY2FsaW5nIG9mIHRpbWUgZG9tYWluIC0gbm8geWV0IHdpbmRvd2VkIC0gb2YgY3VycmVudCBzcGVjdHJ1bSAqLwotICAgIC8qIGFuZCBkZS1zY2FsZSBjdXJyZW50IHNwZWN0cnVtIHNpZ25hbCAodGltZSBkb21haW4sIG5vIHlldCB3aW5kb3dlZCkgKi8JCi0gICAgaWYgKGdhaW4gIT0gKEZJWFBfREJMKTApIHsKLSAgICAgIHNjYWxlVmFsdWVzV2l0aEZhY3RvcihwU3BlYywgZ2FpbiwgdGwsIHNjYWxlZmFjdG9yW3ddICsgc3BlY1NoaWZ0U2NhbGUpOworICAgIGlmIChjdXJyQWxpYXNTeW1tZXRyeSA9PSAwKSB7CisgICAgICBpZiAoaE1kY3QtPnByZXZBbGlhc1N5bW1ldHJ5ID09IDApIHsKKyAgICAgICAgZGN0X0lWKHBTcGVjLCB0bCwgJnNwZWNTaGlmdFNjYWxlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZJWFBfREJMIF90bXBbMTAyNCArIEFMSUdOTUVOVF9ERUZBVUxUIC8gc2l6ZW9mKEZJWFBfREJMKV07CisgICAgICAgIEZJWFBfREJMICp0bXAgPSAoRklYUF9EQkwgKilBTElHTl9QVFIoX3RtcCk7CisgICAgICAgIENfQUxMT0NfQUxJR05FRF9SRUdJU1RFUih0bXAsIHNpemVvZihfdG1wKSk7CisgICAgICAgIGRjdF9JSUkocFNwZWMsIHRtcCwgdGwsICZzcGVjU2hpZnRTY2FsZSk7CisgICAgICAgIENfQUxMT0NfQUxJR05FRF9VTlJFR0lTVEVSKHRtcCk7CisgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgIHNjYWxlVmFsdWVzKHBTcGVjLCB0bCwgc2NhbGVmYWN0b3Jbd10gKyBzcGVjU2hpZnRTY2FsZSk7CisgICAgICBpZiAoaE1kY3QtPnByZXZBbGlhc1N5bW1ldHJ5ID09IDApIHsKKyAgICAgICAgRklYUF9EQkwgX3RtcFsxMDI0ICsgQUxJR05NRU5UX0RFRkFVTFQgLyBzaXplb2YoRklYUF9EQkwpXTsKKyAgICAgICAgRklYUF9EQkwgKnRtcCA9IChGSVhQX0RCTCAqKUFMSUdOX1BUUihfdG1wKTsKKyAgICAgICAgQ19BTExPQ19BTElHTkVEX1JFR0lTVEVSKHRtcCwgc2l6ZW9mKF90bXApKTsKKyAgICAgICAgZHN0X0lJSShwU3BlYywgdG1wLCB0bCwgJnNwZWNTaGlmdFNjYWxlKTsKKyAgICAgICAgQ19BTExPQ19BTElHTkVEX1VOUkVHSVNURVIodG1wKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRzdF9JVihwU3BlYywgdGwsICZzcGVjU2hpZnRTY2FsZSk7CisgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCBub091dFNhbXBsZXMgPD0gbnJTYW1wbGVzICkgewotICAgICAgLyogRGl2ZXJ0IG91dHB1dCBmaXJzdCBoYWxmIHRvIG92ZXJsYXAgYnVmZmVyIGlmIHdlIGFscmVhZHkgZ290IGVub3VnaCBvdXRwdXQgc2FtcGxlcy4gKi8KKyAgICAvKiBPcHRpb25hbCBzY2FsaW5nIG9mIHRpbWUgZG9tYWluIC0gbm8geWV0IHdpbmRvd2VkIC0gb2YgY3VycmVudCBzcGVjdHJ1bQorICAgICAqLworICAgIC8qIGFuZCBkZS1zY2FsZSBjdXJyZW50IHNwZWN0cnVtIHNpZ25hbCAodGltZSBkb21haW4sIG5vIHlldCB3aW5kb3dlZCkgKi8KKyAgICBpZiAoZ2FpbiAhPSAoRklYUF9EQkwpMCkgeworICAgICAgZm9yIChpID0gMDsgaSA8IHRsOyBpKyspIHsKKyAgICAgICAgcFNwZWNbaV0gPSBmTXVsdChwU3BlY1tpXSwgZ2Fpbik7CisgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgaW50IGxvY19zY2FsZSA9CisgICAgICAgICAgZml4bWluX0koc2NhbGVmYWN0b3Jbd10gKyBzcGVjU2hpZnRTY2FsZSwgKElOVClERlJBQ1RfQklUUyAtIDEpOworICAgICAgRFdPUkRfQUxJR05FRChwU3BlYyk7CisgICAgICBzY2FsZVZhbHVlc1NhdHVyYXRlKHBTcGVjLCB0bCwgbG9jX3NjYWxlKTsKKyAgICB9CisKKyAgICBpZiAobm9PdXRTYW1wbGVzIDw9IG5yU2FtcGxlcykgeworICAgICAgLyogRGl2ZXJ0IG91dHB1dCBmaXJzdCBoYWxmIHRvIG92ZXJsYXAgYnVmZmVyIGlmIHdlIGFscmVhZHkgZ290IGVub3VnaAorICAgICAgICogb3V0cHV0IHNhbXBsZXMuICovCiAgICAgICBwT3V0MCA9IGhNZGN0LT5vdmVybGFwLnRpbWUgKyBoTWRjdC0+b3Zfb2Zmc2V0OwotICAgICAgaE1kY3QtPm92X29mZnNldCArPSBoTWRjdC0+cHJldl9uciArIGZsLzI7CisgICAgICBoTWRjdC0+b3Zfb2Zmc2V0ICs9IGhNZGN0LT5wcmV2X25yICsgZmwgLyAyOwogICAgIH0gZWxzZSB7CiAgICAgICAvKiBBY2NvdW50IG91dHB1dCBzYW1wbGVzICovCi0gICAgICBuclNhbXBsZXMgKz0gaE1kY3QtPnByZXZfbnIgKyBmbC8yOworICAgICAgbnJTYW1wbGVzICs9IGhNZGN0LT5wcmV2X25yICsgZmwgLyAyOwogICAgIH0KIAogICAgIC8qIE5SIG91dHB1dCBzYW1wbGVzIDAgLi4gTlIuIC1vdmVybGFwW1RMLzIuLlRMLzItTlJdICovCi0gICAgZm9yIChpPTA7IGk8aE1kY3QtPnByZXZfbnI7IGkrKykgewotICAgICAgRklYUF9EQkwgeCA9IC0gKCpwT3ZsLS0pOwotICAgICAgKnBPdXQwID0gSU1EQ1RfU0NBTEVfREJMKHgpOwotICAgICAgcE91dDAgKys7CisgICAgaWYgKChoTWRjdC0+cEZhY1ppciAhPSAwKSAmJiAoaE1kY3QtPnByZXZfbnIgPT0gZmwgLyAyKSkgeworICAgICAgLyogSW4gdGhlIGNhc2Ugb2YgQUNFTFAgLT4gVENYMjAgLT4gRkQgc2hvcnQgYWRkIEZBQyBaSVIgb24gbnIgc2lnbmFsIHBhcnQKKyAgICAgICAqLworICAgICAgZm9yIChpID0gMDsgaSA8IGhNZGN0LT5wcmV2X25yOyBpKyspIHsKKyAgICAgICAgRklYUF9EQkwgeCA9IC0oKnBPdmwtLSk7CisgICAgICAgICpwT3V0MCA9IElNRENUX1NDQUxFX0RCTCh4ICsgaE1kY3QtPnBGYWNaaXJbaV0pOworICAgICAgICBwT3V0MCsrOworICAgICAgfQorICAgICAgaE1kY3QtPnBGYWNaaXIgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAvKiBIZXJlIHdlIGltcGxlbWVudCBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB3aGF0IGhhcHBlbnMgYWZ0ZXIgdGhlIHRoaXMKKyAgICAgIHBpZWNlIG9mIGNvZGUgKHNlZSB0aGUgY29tbWVudHMgYmVsb3cpLiBXZSBpbXBsZW1lbnQgdGhlIGZvbGRpbmcgb2YgQyBhbmQKKyAgICAgIEQgc2VnbWVudHMgZnJvbSAoLUQtQ3IpIGJ1dCBEIGlzIHplcm8sIGJlY2F1c2UgaW4gdGhpcyBwYXJ0IG9mIHRoZSBNRENUCisgICAgICBzZXF1ZW5jZSB0aGUgd2luZG93IGNvZWZmaWNpZW50cyB3aXRoIHdoaWNoIEQgbXVzdCBiZSBtdWx0aXBsaWVkIGFyZSB6ZXJvLgorICAgICAgInBPdXQwIiB3cml0ZXMgc2VxdWVudGlhbGx5IHRoZSBDIGJsb2NrIGZyb20gbGVmdCB0byByaWdodC4gICAqLworICAgICAgaWYgKGhNZGN0LT5wcmV2UHJldkFsaWFzU3ltbWV0cnkgPT0gMCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaE1kY3QtPnByZXZfbnI7IGkrKykgeworICAgICAgICAgIEZJWFBfREJMIHggPSAtKCpwT3ZsLS0pOworICAgICAgICAgICpwT3V0MCA9IElNRENUX1NDQUxFX0RCTCh4KTsKKyAgICAgICAgICBwT3V0MCsrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaE1kY3QtPnByZXZfbnI7IGkrKykgeworICAgICAgICAgIEZJWFBfREJMIHggPSAqcE92bC0tOworICAgICAgICAgICpwT3V0MCA9IElNRENUX1NDQUxFX0RCTCh4KTsKKyAgICAgICAgICBwT3V0MCsrOworICAgICAgICB9CisgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCBub091dFNhbXBsZXMgPD0gbnJTYW1wbGVzICkgewotICAgICAgLyogRGl2ZXJ0IG91dHB1dCBzZWNvbmQgaGFsZiB0byBvdmVybGFwIGJ1ZmZlciBpZiB3ZSBhbHJlYWR5IGdvdCBlbm91Z2ggb3V0cHV0IHNhbXBsZXMuICovCi0gICAgICBwT3V0MSA9IGhNZGN0LT5vdmVybGFwLnRpbWUgKyBoTWRjdC0+b3Zfb2Zmc2V0ICsgZmwvMiAtIDE7Ci0gICAgICBoTWRjdC0+b3Zfb2Zmc2V0ICs9IGZsLzIgKyBubDsKKyAgICBpZiAobm9PdXRTYW1wbGVzIDw9IG5yU2FtcGxlcykgeworICAgICAgLyogRGl2ZXJ0IG91dHB1dCBzZWNvbmQgaGFsZiB0byBvdmVybGFwIGJ1ZmZlciBpZiB3ZSBhbHJlYWR5IGdvdCBlbm91Z2gKKyAgICAgICAqIG91dHB1dCBzYW1wbGVzLiAqLworICAgICAgcE91dDEgPSBoTWRjdC0+b3ZlcmxhcC50aW1lICsgaE1kY3QtPm92X29mZnNldCArIGZsIC8gMiAtIDE7CisgICAgICBoTWRjdC0+b3Zfb2Zmc2V0ICs9IGZsIC8gMiArIG5sOwogICAgIH0gZWxzZSB7CiAgICAgICBwT3V0MSA9IHBPdXQwICsgKGZsIC0gMSk7Ci0gICAgICBuclNhbXBsZXMgKz0gZmwvMiArIG5sOworICAgICAgbnJTYW1wbGVzICs9IGZsIC8gMiArIG5sOwogICAgIH0KIAotICAgIC8qIG91dHB1dCBzYW1wbGVzIGJlZm9yZSB3aW5kb3cgY3Jvc3NpbmcgcG9pbnQgTlIgLi4gVEwvMi4gLW92ZXJsYXBbVEwvMi1OUi4uVEwvMi1OUi1GTC8yXSArIGN1cnJlbnRbTlIuLlRMLzJdICovCi0gICAgLyogb3V0cHV0IHNhbXBsZXMgYWZ0ZXIgd2luZG93IGNyb3NzaW5nIHBvaW50IFRMLzIgLi4gVEwvMitGTC8yLiAtb3ZlcmxhcFswLi5GTC8yXSAtIGN1cnJlbnRbVEwvMi4uRkwvMl0gKi8KLSAgICBwQ3VyciA9IHBTcGVjICsgdGwgLSBmbC8yOwotICAgIGZvciAoaT0wOyBpPGZsLzI7IGkrKykgewotICAgICAgRklYUF9EQkwgeDAsIHgxOworICAgIC8qIG91dHB1dCBzYW1wbGVzIGJlZm9yZSB3aW5kb3cgY3Jvc3NpbmcgcG9pbnQgTlIgLi4gVEwvMi4KKyAgICAgKiAtb3ZlcmxhcFtUTC8yLU5SLi5UTC8yLU5SLUZMLzJdICsgY3VycmVudFtOUi4uVEwvMl0gKi8KKyAgICAvKiBvdXRwdXQgc2FtcGxlcyBhZnRlciB3aW5kb3cgY3Jvc3NpbmcgcG9pbnQgVEwvMiAuLiBUTC8yK0ZMLzIuCisgICAgICogLW92ZXJsYXBbMC4uRkwvMl0gLSBjdXJyZW50W1RMLzIuLkZMLzJdICovCisgICAgcEN1cnIgPSBwU3BlYyArIHRsIC0gZmwgLyAyOworICAgIERXT1JEX0FMSUdORUQocEN1cnIpOworICAgIENfQUxMT0NfQUxJR05FRF9SRUdJU1RFUihwV2luZG93LCBmbCk7CisgICAgRFdPUkRfQUxJR05FRChwV2luZG93KTsKKyAgICBDX0FMTE9DX0FMSUdORURfVU5SRUdJU1RFUihwV2luZG93KTsKIAotICAgICAgY3BseE11bHQoJngxLCAmeDAsICpwQ3VycisrLCAtICpwT3ZsLS0sIHBXaW5kb3dbaV0pOwotICAgICAgKnBPdXQwID0gSU1EQ1RfU0NBTEVfREJMKHgwKTsKLSAgICAgICpwT3V0MSA9IElNRENUX1NDQUxFX0RCTCgteDEpOwotICAgICAgcE91dDAgKys7Ci0gICAgICBwT3V0MSAtLTsKKyAgICBpZiAoaE1kY3QtPnByZXZQcmV2QWxpYXNTeW1tZXRyeSA9PSAwKSB7CisgICAgICBpZiAoaE1kY3QtPnByZXZBbGlhc1N5bW1ldHJ5ID09IDApIHsKKyAgICAgICAgaWYgKCFoTWRjdC0+cEFzeW1PdmxwKSB7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZsIC8gMjsgaSsrKSB7CisgICAgICAgICAgICBGSVhQX0RCTCB4MCwgeDE7CisgICAgICAgICAgICBjcGx4TXVsdERpdjIoJngxLCAmeDAsICpwQ3VycisrLCAtKnBPdmwtLSwgcFdpbmRvd1tpXSk7CisgICAgICAgICAgICAqcE91dDAgPSBJTURDVF9TQ0FMRV9EQkxfTFNIMSh4MCk7CisgICAgICAgICAgICAqcE91dDEgPSBJTURDVF9TQ0FMRV9EQkxfTFNIMSgteDEpOworICAgICAgICAgICAgcE91dDArKzsKKyAgICAgICAgICAgIHBPdXQxLS07CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEZJWFBfREJMICpwQXN5bU92bCA9IGhNZGN0LT5wQXN5bU92bHAgKyBmbCAvIDIgLSAxOworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmbCAvIDI7IGkrKykgeworICAgICAgICAgICAgRklYUF9EQkwgeDAsIHgxOworICAgICAgICAgICAgeDEgPSAtZk11bHREaXYyKCpwQ3VyciwgcFdpbmRvd1tpXS52LnJlKSArCisgICAgICAgICAgICAgICAgIGZNdWx0RGl2MigqcEFzeW1PdmwsIHBXaW5kb3dbaV0udi5pbSk7CisgICAgICAgICAgICB4MCA9IGZNdWx0RGl2MigqcEN1cnIsIHBXaW5kb3dbaV0udi5pbSkgLQorICAgICAgICAgICAgICAgICBmTXVsdERpdjIoKnBPdmwsIHBXaW5kb3dbaV0udi5yZSk7CisgICAgICAgICAgICBwQ3VycisrOworICAgICAgICAgICAgcE92bC0tOworICAgICAgICAgICAgcEFzeW1PdmwtLTsKKyAgICAgICAgICAgICpwT3V0MCsrID0gSU1EQ1RfU0NBTEVfREJMX0xTSDEoeDApOworICAgICAgICAgICAgKnBPdXQxLS0gPSBJTURDVF9TQ0FMRV9EQkxfTFNIMSh4MSk7CisgICAgICAgICAgfQorICAgICAgICAgIGhNZGN0LT5wQXN5bU92bHAgPSBOVUxMOworICAgICAgICB9CisgICAgICB9IGVsc2UgeyAvKiBwcmV2QWxpYXNpbmdTeW1tZXRyeSA9PSAxICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmbCAvIDI7IGkrKykgeworICAgICAgICAgIEZJWFBfREJMIHgwLCB4MTsKKyAgICAgICAgICBjcGx4TXVsdERpdjIoJngxLCAmeDAsICpwQ3VycisrLCAtKnBPdmwtLSwgcFdpbmRvd1tpXSk7CisgICAgICAgICAgKnBPdXQwID0gSU1EQ1RfU0NBTEVfREJMX0xTSDEoeDApOworICAgICAgICAgICpwT3V0MSA9IElNRENUX1NDQUxFX0RCTF9MU0gxKHgxKTsKKyAgICAgICAgICBwT3V0MCsrOworICAgICAgICAgIHBPdXQxLS07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeyAvKiBwcmV2UHJldkFsaWFzaW5nU3ltbWV0cnkgPT0gMSAqLworICAgICAgaWYgKGhNZGN0LT5wcmV2QWxpYXNTeW1tZXRyeSA9PSAwKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmbCAvIDI7IGkrKykgeworICAgICAgICAgIEZJWFBfREJMIHgwLCB4MTsKKyAgICAgICAgICBjcGx4TXVsdERpdjIoJngxLCAmeDAsICpwQ3VycisrLCAqcE92bC0tLCBwV2luZG93W2ldKTsKKyAgICAgICAgICAqcE91dDAgPSBJTURDVF9TQ0FMRV9EQkxfTFNIMSh4MCk7CisgICAgICAgICAgKnBPdXQxID0gSU1EQ1RfU0NBTEVfREJMX0xTSDEoLXgxKTsKKyAgICAgICAgICBwT3V0MCsrOworICAgICAgICAgIHBPdXQxLS07CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7IC8qIHByZXZBbGlhc2luZ1N5bW1ldHJ5ID09IDEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZsIC8gMjsgaSsrKSB7CisgICAgICAgICAgRklYUF9EQkwgeDAsIHgxOworICAgICAgICAgIGNwbHhNdWx0RGl2MigmeDEsICZ4MCwgKnBDdXJyKyssICpwT3ZsLS0sIHBXaW5kb3dbaV0pOworICAgICAgICAgICpwT3V0MCA9IElNRENUX1NDQUxFX0RCTF9MU0gxKHgwKTsKKyAgICAgICAgICAqcE91dDEgPSBJTURDVF9TQ0FMRV9EQkxfTFNIMSh4MSk7CisgICAgICAgICAgcE91dDArKzsKKyAgICAgICAgICBwT3V0MS0tOworICAgICAgICB9CisgICAgICB9CiAgICAgfQotICAgIHBPdXQwICs9IChmbC8yKTsKKworICAgIGlmIChoTWRjdC0+cEZhY1ppciAhPSAwKSB7CisgICAgICAvKiBhZGQgRkFDIFpJUiBvZiBwcmV2aW91cyBBQ0VMUCAtPiBtZGN0IHRyYW5zaXRpb24gKi8KKyAgICAgIEZJWFBfREJMICpwT3V0ID0gcE91dDAgLSBmbCAvIDI7CisgICAgICBGREtfQVNTRVJUKGZsIC8gMiA8PSAxMjgpOworICAgICAgZm9yIChpID0gMDsgaSA8IGZsIC8gMjsgaSsrKSB7CisgICAgICAgIHBPdXRbaV0gKz0gSU1EQ1RfU0NBTEVfREJMKGhNZGN0LT5wRmFjWmlyW2ldKTsKKyAgICAgIH0KKyAgICAgIGhNZGN0LT5wRmFjWmlyID0gTlVMTDsKKyAgICB9CisgICAgcE91dDAgKz0gKGZsIC8gMikgKyBubDsKIAogICAgIC8qIE5MIG91dHB1dCBzYW1wbGVzIFRMLzIrRkwvMi4uVEwuIC0gY3VycmVudFtGTC8yLi4wXSAqLwotICAgIHBPdXQxICs9IChmbC8yKSArIDE7Ci0gICAgcEN1cnIgPSBwU3BlYyArIHRsIC0gZmwvMiAtIDE7Ci0gICAgZm9yIChpPTA7IGk8bmw7IGkrKykgewotICAgICAgRklYUF9EQkwgeCA9IC0gKCpwQ3Vyci0tKTsKLSAgICAgICpwT3V0MSA9IElNRENUX1NDQUxFX0RCTCh4KTsKLSAgICAgIHBPdXQxICsrOworICAgIHBPdXQxICs9IChmbCAvIDIpICsgMTsKKyAgICBwQ3VyciA9IHBTcGVjICsgdGwgLSBmbCAvIDIgLSAxOworICAgIC8qIEhlcmUgd2UgaW1wbGVtZW50IGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHdoYXQgaGFwcGVucyBhYm92ZSB0aGUgdGhpcworICAgIHBpZWNlIG9mIGNvZGUgKHNlZSB0aGUgY29tbWVudHMgYWJvdmUpLiBXZSBpbXBsZW1lbnQgdGhlIGZvbGRpbmcgb2YgQyBhbmQgRAorICAgIHNlZ21lbnRzIGZyb20gKEMtRHIpIGJ1dCBDIGlzIHplcm8sIGJlY2F1c2UgaW4gdGhpcyBwYXJ0IG9mIHRoZSBNRENUCisgICAgc2VxdWVuY2UgdGhlIHdpbmRvdyBjb2VmZmljaWVudHMgd2l0aCB3aGljaCBDIG11c3QgYmUgbXVsdGlwbGllZCBhcmUgemVyby4KKyAgICAicE91dDEiIHdyaXRlcyBzZXF1ZW50aWFsbHkgdGhlIEQgYmxvY2sgZnJvbSBsZWZ0IHRvIHJpZ2h0LiAgICovCisgICAgaWYgKGhNZGN0LT5wcmV2QWxpYXNTeW1tZXRyeSA9PSAwKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbmw7IGkrKykgeworICAgICAgICBGSVhQX0RCTCB4ID0gLSgqcEN1cnItLSk7CisgICAgICAgICpwT3V0MSsrID0gSU1EQ1RfU0NBTEVfREJMKHgpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbmw7IGkrKykgeworICAgICAgICBGSVhQX0RCTCB4ID0gKnBDdXJyLS07CisgICAgICAgICpwT3V0MSsrID0gSU1EQ1RfU0NBTEVfREJMKHgpOworICAgICAgfQogICAgIH0KIAogICAgIC8qIFNldCBvdmVybGFwIHNvdXJjZSBwb2ludGVyIGZvciBuZXh0IHdpbmRvdyBwT3ZsID0gcFNwZWMgKyB0bC8yIC0gMTsgKi8KLSAgICBwT3ZsID0gcFNwZWMgKyB0bC8yIC0gMTsKKyAgICBwT3ZsID0gcFNwZWMgKyB0bCAvIDIgLSAxOwogCiAgICAgLyogUHJldmlvdXMgd2luZG93IHZhbHVlcy4gKi8KICAgICBoTWRjdC0+cHJldl9uciA9IG5yOwogICAgIGhNZGN0LT5wcmV2X2ZyID0gZnI7CiAgICAgaE1kY3QtPnByZXZfdGwgPSB0bDsKICAgICBoTWRjdC0+cHJldl93cnMgPSB3cnM7CisKKyAgICAvKiBQcmV2aW91cyBhbGlhc2luZyBzeW1tZXRyeSAqLworICAgIGhNZGN0LT5wcmV2UHJldkFsaWFzU3ltbWV0cnkgPSBoTWRjdC0+cHJldkFsaWFzU3ltbWV0cnk7CisgICAgaE1kY3QtPnByZXZBbGlhc1N5bW1ldHJ5ID0gY3VyckFsaWFzU3ltbWV0cnk7CiAgIH0KIAogICAvKiBTYXZlIG92ZXJsYXAgKi8KLSAgCi0gIHBPdmwgPSBoTWRjdC0+b3ZlcmxhcC5mcmVxICsgaE1kY3QtPm92X3NpemUgLSB0bC8yOwotICBGREtfQVNTRVJUKHBPdmwgPj0gaE1kY3QtPm92ZXJsYXAudGltZSArIGhNZGN0LT5vdl9vZmZzZXQpOwotICBGREtfQVNTRVJUKHRsLzIgPD0gaE1kY3QtPm92X3NpemUpOwotICBmb3IgKGk9MDsgaTx0bC8yOyBpKyspIHsKLSAgICBwT3ZsW2ldID0gc3BlY3RydW1baSsoblNwZWMtMSkqdGxdOwotICB9CisKKyAgcE92bCA9IGhNZGN0LT5vdmVybGFwLmZyZXEgKyBoTWRjdC0+b3Zfc2l6ZSAtIHRsIC8gMjsKKyAgRkRLbWVtY3B5KHBPdmwsICZzcGVjdHJ1bVsoblNwZWMgLSAxKSAqIHRsXSwgKHRsIC8gMikgKiBzaXplb2YoRklYUF9EQkwpKTsKIAogICByZXR1cm4gbnJTYW1wbGVzOwogfQotCmRpZmYgLS1naXQgYS9saWJGREsvc3JjL21pcHMvZmZ0X3JhZDJfbWlwcy5jcHAgYi9saWJGREsvc3JjL21pcHMvZmZ0X3JhZDJfbWlwcy5jcHAKaW5kZXggZjkzZWU5OC4uN2RiOGI0ZSAxMDA2NDQKLS0tIGEvbGliRkRLL3NyYy9taXBzL2ZmdF9yYWQyX21pcHMuY3BwCisrKyBiL2xpYkZESy9zcmMvbWlwcy9mZnRfcmFkMl9taXBzLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMjAgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKKwogICAgRGVzY3JpcHRpb246IGRpdF9mZnQgTUlQUyBhc3NlbWJsZXIgcmVwbGFjZW1lbnRzLgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fRkZUX1JBRDJfQ1BQX18KKyNlcnJvciBcCisgICAgIkRvIG5vdCBjb21waWxlIHRoaXMgZmlsZSBzZXBhcmF0ZWx5LiBJdCBpcyBpbmNsdWRlZCBvbiBkZW1hbmQgZnJvbSBmZnRfcmFkMi5jcHAiCisjZW5kaWYKIAogI2lmIGRlZmluZWQoTUlQU19EU1BfTElCKQogCkBAIC05OSwzNiArMTE2LDUwIEBACiAKICNpbmNsdWRlICJtaXBzX2ZmdF90d2lkZGxlcy5jcHAiCiAKLXZvaWQgZGl0X2ZmdChGSVhQX0RCTCAqeCwgY29uc3QgSU5UIGxkbiwgY29uc3QgRklYUF9TVFAgKnRyaWdkYXRhLCBjb25zdCBJTlQgdHJpZ0RhdGFTaXplKQotewotICAgIGludCBpOwordm9pZCBkaXRfZmZ0KEZJWFBfREJMICp4LCBjb25zdCBJTlQgbGRuLCBjb25zdCBGSVhQX1NUUCAqdHJpZ2RhdGEsCisgICAgICAgICAgICAgY29uc3QgSU5UIHRyaWdEYXRhU2l6ZSkgeworICBpbnQgaTsKIAotICAgIGludDMyYyAqZGluID0gKGludDMyYyopeDsKLSAgICBpbnQzMmMgKmRvdXQgPSAoaW50MzJjKil4OworICBpbnQzMmMgKmRpbiA9IChpbnQzMmMgKil4OworICBpbnQzMmMgKmRvdXQgPSAoaW50MzJjICopeDsKIAotICAgIGludDMyYyBzY3JhdGNoWzEwMjRdOwotICAgIGludDMyYyAqdHdpZGRsZXM7CisgIGludDMyYyBzY3JhdGNoWzEwMjRdOworICBpbnQzMmMgKnR3aWRkbGVzOwogCi0gICAgc3dpdGNoIChsZG4pIHsKLSAgICAgICAgICAgIGNhc2UgNDogIHR3aWRkbGVzID0gKGludDMyYyopX190d2lkZGxlc19taXBzX2ZmdDMyXzE2OyAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA1OiAgdHdpZGRsZXMgPSAoaW50MzJjKilfX3R3aWRkbGVzX21pcHNfZmZ0MzJfMzI7ICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDY6ICB0d2lkZGxlcyA9IChpbnQzMmMqKV9fdHdpZGRsZXNfbWlwc19mZnQzMl82NDsgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNzogIHR3aWRkbGVzID0gKGludDMyYyopX190d2lkZGxlc19taXBzX2ZmdDMyXzEyODsgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA4OiAgdHdpZGRsZXMgPSAoaW50MzJjKilfX3R3aWRkbGVzX21pcHNfZmZ0MzJfMjU2OyAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDk6ICB0d2lkZGxlcyA9IChpbnQzMmMqKV9fdHdpZGRsZXNfbWlwc19mZnQzMl81MTI7ICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTA6IHR3aWRkbGVzID0gKGludDMyYyopX190d2lkZGxlc19taXBzX2ZmdDMyXzEwMjQ7IGJyZWFrOwotICAgICAgICAgICAgLy9jYXNlIDExOiB0d2lkZGxlcyA9IChpbnQzMmMqKV9fdHdpZGRsZXNfbWlwc19mZnQzMl8yMDQ4OyBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6IEZES19BU1NFUlQoMCk7IGJyZWFrOwotICAgIH0KKyAgc3dpdGNoIChsZG4pIHsKKyAgICBjYXNlIDQ6CisgICAgICB0d2lkZGxlcyA9IChpbnQzMmMgKilfX3R3aWRkbGVzX21pcHNfZmZ0MzJfMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICB0d2lkZGxlcyA9IChpbnQzMmMgKilfX3R3aWRkbGVzX21pcHNfZmZ0MzJfMzI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICB0d2lkZGxlcyA9IChpbnQzMmMgKilfX3R3aWRkbGVzX21pcHNfZmZ0MzJfNjQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICB0d2lkZGxlcyA9IChpbnQzMmMgKilfX3R3aWRkbGVzX21pcHNfZmZ0MzJfMTI4OworICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgdHdpZGRsZXMgPSAoaW50MzJjICopX190d2lkZGxlc19taXBzX2ZmdDMyXzI1NjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOToKKyAgICAgIHR3aWRkbGVzID0gKGludDMyYyAqKV9fdHdpZGRsZXNfbWlwc19mZnQzMl81MTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEwOgorICAgICAgdHdpZGRsZXMgPSAoaW50MzJjICopX190d2lkZGxlc19taXBzX2ZmdDMyXzEwMjQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgIGJyZWFrOworICB9CiAKLSAgICBtaXBzX2ZmdDMyKGRvdXQsIGRpbiwgdHdpZGRsZXMsIHNjcmF0Y2gsIGxkbik7CisgIG1pcHNfZmZ0MzIoZG91dCwgZGluLCB0d2lkZGxlcywgc2NyYXRjaCwgbGRuKTsKIAotICAgIGZvcihpPTA7aTwoMTw8bGRuKTtpKyspIHsKLSAgICAgICAgeFsyKmldICAgPSBkb3V0W2ldLnJlPDwxOwotICAgICAgICB4WzIqaSsxXSA9IGRvdXRbaV0uaW08PDE7Ci0gICAgfQorICBmb3IgKGkgPSAwOyBpIDwgKDEgPDwgbGRuKTsgaSsrKSB7CisgICAgeFsyICogaV0gPSBkb3V0W2ldLnJlIDw8IDE7CisgICAgeFsyICogaSArIDFdID0gZG91dFtpXS5pbSA8PCAxOworICB9CiB9CiAjZW5kaWYKIAotCiAjZW5kaWYgLyogZGVmaW5lZChNSVBTX0RTUF9MSUIpICovCmRpZmYgLS1naXQgYS9saWJGREsvc3JjL21pcHMvbWlwc19mZnRfdHdpZGRsZXMuY3BwIGIvbGliRkRLL3NyYy9taXBzL21pcHNfZmZ0X3R3aWRkbGVzLmNwcAppbmRleCBlMTVhMDliLi5mOTA1Zjg2IDEwMDY0NAotLS0gYS9saWJGREsvc3JjL21pcHMvbWlwc19mZnRfdHdpZGRsZXMuY3BwCisrKyBiL2xpYkZESy9zcmMvbWlwcy9taXBzX2ZmdF90d2lkZGxlcy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNTAxICs5MCw4NDIgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIEF1dGhvcihzKToKIAotc3RhdGljIGNvbnN0IElOVCBfX3R3aWRkbGVzX21pcHNfZmZ0MzJfMTZbXSA9Ci17Ci0oMHg3RkZGRkZGRiksICgweDAwMDAwMDAwKSwgKDB4NzY0MUFGMzIpLCAoMHhDRjA0M0E5RSksICgweDVBODI3OTc4KSwgKDB4QTU3RDg2NDYpLCAoMHgzMEZCQzU0NyksICgweDg5QkU1MEMyKSwgKDB4RkZGRkZGQTMpLCAoMHg4MDAwMDAwMiksICgweENGMDQzQUY4KSwgKDB4ODlCRTUwQTgpLCAoMHhBNTdEODY1RSksICgweEE1N0Q4NjcwKSwgKDB4ODlCRTUxMDApLCAoMHhDRjA0M0EyNCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCkKLX07CisgICBEZXNjcmlwdGlvbjoKIAotc3RhdGljIGNvbnN0IElOVCBfX3R3aWRkbGVzX21pcHNfZmZ0MzJfMzJbXSA9Ci17Ci0oMHg3RkZGRkZGRiksICgweDAwMDAwMDAwKSwgKDB4N0Q4QTVGM0MpLCAoMHhFNzA3NDdCOSksICgweDc2NDFBRjMyKSwgKDB4Q0YwNDNBOUUpLCAoMHg2QTZEOThBMSksICgweEI4RTMxMzE4KSwgKDB4NUE4Mjc5NzgpLCAoMHhBNTdEODY0NiksICgweDQ3MUNFRDA1KSwgKDB4OTU5MjY3NzIpLCAoMHgzMEZCQzU0NyksICgweDg5QkU1MEMyKSwgKDB4MThGOEI4ODgpLCAoMHg4Mjc1QTBEMSksICgweEZGRkZGRkEzKSwgKDB4ODAwMDAwMDIpLAotKDB4RTcwNzQ3QkIpLCAoMHg4Mjc1QTBDMyksICgweENGMDQzQUY4KSwgKDB4ODlCRTUwQTgpLCAoMHhCOEUzMTM5RSksICgweDk1OTI2NzA1KSwgKDB4QTU3RDg2NUUpLCAoMHhBNTdEODY3MCksICgweDk1OTI2NkY3KSwgKDB4QjhFMzEzQjQpLCAoMHg4OUJFNTEwMCksICgweENGMDQzQTI0KSwgKDB4ODI3NUEwQkUpLCAoMHhFNzA3NDdENCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKLSgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MzcwMDAwMDApLCAoMHgwMDAwODBBMyksCi0oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCkKLX07CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgY29uc3QgSU5UIF9fdHdpZGRsZXNfbWlwc19mZnQzMl82NFtdID0KLXsKLSgweDdGRkZGRkZGKSwgKDB4MDAwMDAwMDApLCAoMHg3RjYyMzY4RCksICgweEYzNzQyQzlEKSwgKDB4N0Q4QTVGM0MpLCAoMHhFNzA3NDdCOSksICgweDdBN0QwNTU5KSwgKDB4REFEN0YzQTIpLCAoMHg3NjQxQUYzMiksICgweENGMDQzQTlFKSwgKDB4NzBFMkNCQ0QpLCAoMHhDM0E5NDVBMSksICgweDZBNkQ5OEExKSwgKDB4QjhFMzEzMTgpLCAoMHg2MkYyMDFDNCksICgweEFFQ0MzMzhCKSwgKDB4NUE4Mjc5NzgpLCAoMHhBNTdEODY0NiksCi0oMHg1MTMzQ0M4RiksICgweDlEMERGRTUyKSwgKDB4NDcxQ0VEMDUpLCAoMHg5NTkyNjc3MiksICgweDNDNTZCQUI1KSwgKDB4OEYxRDM0NjEpLCAoMHgzMEZCQzU0NyksICgweDg5QkU1MEMyKSwgKDB4MjUyODBDMDUpLCAoMHg4NTgyRkE4QyksICgweDE4RjhCODg4KSwgKDB4ODI3NUEwRDEpLCAoMHgwQzhCRDM1NiksICgweDgwOURDOTcxKSwgKDB4RkZGRkZGQTMpLCAoMHg4MDAwMDAwMiksICgweEYzNzQyQ0VFKSwgKDB4ODA5REM5NkIpLAotKDB4RTcwNzQ3QkIpLCAoMHg4Mjc1QTBDMyksICgweERBRDdGMzQ4KSwgKDB4ODU4MkZBQzIpLCAoMHhDRjA0M0FGOCksICgweDg5QkU1MEE4KSwgKDB4QzNBOTQ2NjkpLCAoMHg4RjFEMzNDOCksICgweEI4RTMxMzlFKSwgKDB4OTU5MjY3MDUpLCAoMHhBRUNDMzNBNSksICgweDlEMERGRTI3KSwgKDB4QTU3RDg2NUUpLCAoMHhBNTdEODY3MCksICgweDlEMERGRTE2KSwgKDB4QUVDQzMzQjkpLCAoMHg5NTkyNjZGNyksICgweEI4RTMxM0I0KSwKLSgweDhGMUQzNEFEKSwgKDB4QzNBOTQ0QkMpLCAoMHg4OUJFNTEwMCksICgweENGMDQzQTI0KSwgKDB4ODU4MkZBQkIpLCAoMHhEQUQ3RjM2MCksICgweDgyNzVBMEJFKSwgKDB4RTcwNzQ3RDQpLCAoMHg4MDlEQzk2OCksICgweEYzNzQyRDA4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4RkY3QjAwMDApLCAoMHgyRTgwNTBGMSksICgweDEwMjE0NDgyKSwgKDB4MUJBMDAwMDUpLCAoMHgwMDAwQzBGRiksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLAotKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKLSgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKQotfTsKK3N0YXRpYyBjb25zdCBJTlQgX190d2lkZGxlc19taXBzX2ZmdDMyXzE2W10gPSB7CisgICAgKDB4N0ZGRkZGRkYpLCAoMHgwMDAwMDAwMCksICgweDc2NDFBRjMyKSwgKDB4Q0YwNDNBOUUpLCAoMHg1QTgyNzk3OCksCisgICAgKDB4QTU3RDg2NDYpLCAoMHgzMEZCQzU0NyksICgweDg5QkU1MEMyKSwgKDB4RkZGRkZGQTMpLCAoMHg4MDAwMDAwMiksCisgICAgKDB4Q0YwNDNBRjgpLCAoMHg4OUJFNTBBOCksICgweEE1N0Q4NjVFKSwgKDB4QTU3RDg2NzApLCAoMHg4OUJFNTEwMCksCisgICAgKDB4Q0YwNDNBMjQpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCl9OwogCi1zdGF0aWMgY29uc3QgSU5UIF9fdHdpZGRsZXNfbWlwc19mZnQzMl8xMjhbXSA9Ci17Ci0oMHg3RkZGRkZGRiksICgweDAwMDAwMDAwKSwgKDB4N0ZEODg3OEMpLCAoMHhGOUI4MjY4MSksICgweDdGNjIzNjhEKSwgKDB4RjM3NDJDOUQpLCAoMHg3RTlENTVGQiksICgweEVEMzdFRjkxKSwgKDB4N0Q4QTVGM0MpLCAoMHhFNzA3NDdCOSksICgweDdDMjlGQkVGKSwgKDB4RTBFNjA2OEYpLCAoMHg3QTdEMDU1OSksICgweERBRDdGM0EyKSwgKDB4Nzg4NDg0MTkpLCAoMHhENEUwQ0IyOCksICgweDc2NDFBRjMyKSwgKDB4Q0YwNDNBOUUpLAotKDB4NzNCNUVCQ0YpLCAoMHhDOTQ1REZFQiksICgweDcwRTJDQkNEKSwgKDB4QzNBOTQ1QTEpLCAoMHg2RENBMEQyNyksICgweEJFMzFFMUJGKSwgKDB4NkE2RDk4QTEpLCAoMHhCOEUzMTMxOCksICgweDY2Q0Y4MTAzKSwgKDB4QjNDMDFGRTkpLCAoMHg2MkYyMDFDNCksICgweEFFQ0MzMzhCKSwgKDB4NUVENzdDODYpLCAoMHhBQTBBNUIyQyksICgweDVBODI3OTc4KSwgKDB4QTU3RDg2NDYpLCAoMHg1NUY1QTRFRCksICgweEExMjg4MzkxKSwKLSgweDUxMzNDQzhGKSwgKDB4OUQwREZFNTIpLCAoMHg0QzNGREZDQyksICgweDk5MzA3RUM1KSwgKDB4NDcxQ0VEMDUpLCAoMHg5NTkyNjc3MiksICgweDQxQ0UxRUNEKSwgKDB4OTIzNUYzMkMpLCAoMHgzQzU2QkFCNSksICgweDhGMUQzNDYxKSwgKDB4MzZCQTIwMzQpLCAoMHg4QzRBMTQ0MCksICgweDMwRkJDNTQ3KSwgKDB4ODlCRTUwQzIpLCAoMHgyQjFGMzRCQyksICgweDg3N0I3QkREKSwgKDB4MjUyODBDMDUpLCAoMHg4NTgyRkE4QyksCi0oMHgxRjE5RjlGMCksICgweDgzRDYwNDMxKSwgKDB4MThGOEI4ODgpLCAoMHg4Mjc1QTBEMSksICgweDEyQzgxMDkwKSwgKDB4ODE2MkFBMEEpLCAoMHgwQzhCRDM1NiksICgweDgwOURDOTcxKSwgKDB4MDY0N0Q5NDkpLCAoMHg4MDI3Nzg3MSksICgweEZGRkZGRkEzKSwgKDB4ODAwMDAwMDIpLCAoMHhGOUI4MjZGQiksICgweDgwMjc3ODZFKSwgKDB4RjM3NDJDRUUpLCAoMHg4MDlEQzk2QiksICgweEVEMzdFRkIzKSwgKDB4ODE2MkFBMDApLAotKDB4RTcwNzQ3QkIpLCAoMHg4Mjc1QTBDMyksICgweEUwRTYwNjUzKSwgKDB4ODNENjA0MjApLCAoMHhEQUQ3RjM0OCksICgweDg1ODJGQUMyKSwgKDB4RDRFMENCODQpLCAoMHg4NzdCN0JDNiksICgweENGMDQzQUY4KSwgKDB4ODlCRTUwQTgpLCAoMHhDOTQ1RTAwQSksICgweDhDNEExNDIzKSwgKDB4QzNBOTQ2NjkpLCAoMHg4RjFEMzNDOCksICgweEJFMzFFMTZFKSwgKDB4OTIzNUYzMDkpLCAoMHhCOEUzMTM5RSksICgweDk1OTI2NzA1KSwKLSgweEIzQzAxRjlEKSwgKDB4OTkzMDdGMzUpLCAoMHhBRUNDMzNBNSksICgweDlEMERGRTI3KSwgKDB4QUEwQTVBODgpLCAoMHhBMTI4ODQwRiksICgweEE1N0Q4NjVFKSwgKDB4QTU3RDg2NzApLCAoMHhBMTI4ODNGRSksICgweEFBMEE1QTlCKSwgKDB4OUQwREZFMTYpLCAoMHhBRUNDMzNCOSksICgweDk5MzA3RjI2KSwgKDB4QjNDMDFGQjIpLCAoMHg5NTkyNjZGNyksICgweEI4RTMxM0I0KSwgKDB4OTIzNUYyRkMpLCAoMHhCRTMxRTE4NCksCi0oMHg4RjFEMzRBRCksICgweEMzQTk0NEJDKSwgKDB4OEM0QTE0MTgpLCAoMHhDOTQ1RTAyMSksICgweDg5QkU1MTAwKSwgKDB4Q0YwNDNBMjQpLCAoMHg4NzdCN0JCRCksICgweEQ0RTBDQjlDKSwgKDB4ODU4MkZBQkIpLCAoMHhEQUQ3RjM2MCksICgweDgzRDYwM0RDKSwgKDB4RTBFNjA3NjQpLCAoMHg4Mjc1QTBCRSksICgweEU3MDc0N0Q0KSwgKDB4ODE2MkFBMjIpLCAoMHhFRDM3RUVDRiksICgweDgwOURDOTY4KSwgKDB4RjM3NDJEMDgpLAotKDB4ODAyNzc4NzkpLCAoMHhGOUI4MjYxNSksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKLSgweDAwMDAwMDAwKSwgKDB4QTQzNzAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0oMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4RkY3NzAwMDApLCAoMHgyRTgwNTBGMSksICgweDFBMjE0NDYyKSwgKDB4MDRENkQ1ODMpLCAoMHg0MDAzMTI4MiksICgweDY0NjlBNzM1KSwgKDB4MEI0Qzk5QTMpLCAoMHgwQUY4ODU5NCksICgweEY5MDk2OUQ3KSwgKDB4OTYxMzFDOTIpLCAoMHgwMjVFRUExMCksICgweDNBMUZFNDIxKSwgKDB4NjE0RkYzOTApLAotKDB4MUNGREMzMjcpLCAoMHhDMTc3RTA0RiksICgweEY0RDg3RTgyKSwgKDB4NzgyNTNGMzkpLCAoMHhCQjgzOUY5NCksICgweDk5OEIzRUIxKSwgKDB4MENCQ0MwMjEpLCAoMHg0MUJFQzg0MyksICgweEFDMEVFMTIxKSwgKDB4NTI3MTk2NDMpLCAoMHg5MDlBMkIxRCksICgweEYzODkzMUUxKSwgKDB4RjQxMzI3RkYpLCAoMHhGNjA5OTg0NyksICgweEE3MEQyMTlDKSwgKDB4N0JENTIxMzUpLCAoMHg3ODA2MEY3MSksICgweEVBM0M4N0Q4KSwKLSgweDNGQUYzQTI0KSwgKDB4RTRCMkM0MjEpLCAoMHhCOTlEMTQ1MyksICgweDI3NDFFMjY0KSwgKDB4MjIzOTgxM0EpLCAoMHgyOTQ0REEyMCksICgweDQ0MUVGN0M0KSwgKDB4MEJEMEI3MjApLCAoMHhFRDg0RUEyNiksICgweDczRTBDMEQyKSwgKDB4Njc4RTMwMzkpLCAoMHgyMTQyMDEwOSksICgweDg2MDc0OTJFKSwgKDB4MjhDRUY0NDApLCAoMHgwMjI3NjhDOCksICgweEY2OEUzNjExKSwgKDB4ODRFODRENTUpLCAoMHg3MzAwNEMwNCksCi0oMHhGOUI2NjMwRSksICgweDY3N0ZGQThGKSwgKDB4NTMwQ0IxOEYpLCAoMHgyQzRFRTMxMCksICgweEFCQzc1MzdDKSwgKDB4ODJDRkRCQ0IpLCAoMHgxMDBDNjNBMiksICgweDg3NkQ3NUJBKSwgKDB4QzY4M0Y4ODgpLCAoMHgwQ0RDMUUxRSksICgweEE2MDBFODMzKSwgKDB4MzMwMzYwNjYpLCAoMHg0MzA1MDQ5QyksICgweDQwODkwNzEzKSwgKDB4OUQxMjUzMkUpLCAoMHg3QjZFMkZFMiksICgweEUyNDRDQzA5KSwgKDB4OUZGQjIwODIpLAotKDB4QUIzNzM1RDMpLCAoMHgwMDAwMDA4MCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKLSgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKQotfTsKK3N0YXRpYyBjb25zdCBJTlQgX190d2lkZGxlc19taXBzX2ZmdDMyXzMyW10gPSB7CisgICAgKDB4N0ZGRkZGRkYpLCAoMHgwMDAwMDAwMCksICgweDdEOEE1RjNDKSwgKDB4RTcwNzQ3QjkpLCAoMHg3NjQxQUYzMiksCisgICAgKDB4Q0YwNDNBOUUpLCAoMHg2QTZEOThBMSksICgweEI4RTMxMzE4KSwgKDB4NUE4Mjc5NzgpLCAoMHhBNTdEODY0NiksCisgICAgKDB4NDcxQ0VEMDUpLCAoMHg5NTkyNjc3MiksICgweDMwRkJDNTQ3KSwgKDB4ODlCRTUwQzIpLCAoMHgxOEY4Qjg4OCksCisgICAgKDB4ODI3NUEwRDEpLCAoMHhGRkZGRkZBMyksICgweDgwMDAwMDAyKSwgKDB4RTcwNzQ3QkIpLCAoMHg4Mjc1QTBDMyksCisgICAgKDB4Q0YwNDNBRjgpLCAoMHg4OUJFNTBBOCksICgweEI4RTMxMzlFKSwgKDB4OTU5MjY3MDUpLCAoMHhBNTdEODY1RSksCisgICAgKDB4QTU3RDg2NzApLCAoMHg5NTkyNjZGNyksICgweEI4RTMxM0I0KSwgKDB4ODlCRTUxMDApLCAoMHhDRjA0M0EyNCksCisgICAgKDB4ODI3NUEwQkUpLCAoMHhFNzA3NDdENCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDM3MDAwMDAwKSwgKDB4MDAwMDgwQTMpLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApfTsKIAorc3RhdGljIGNvbnN0IElOVCBfX3R3aWRkbGVzX21pcHNfZmZ0MzJfNjRbXSA9IHsKKyAgICAoMHg3RkZGRkZGRiksICgweDAwMDAwMDAwKSwgKDB4N0Y2MjM2OEQpLCAoMHhGMzc0MkM5RCksICgweDdEOEE1RjNDKSwKKyAgICAoMHhFNzA3NDdCOSksICgweDdBN0QwNTU5KSwgKDB4REFEN0YzQTIpLCAoMHg3NjQxQUYzMiksICgweENGMDQzQTlFKSwKKyAgICAoMHg3MEUyQ0JDRCksICgweEMzQTk0NUExKSwgKDB4NkE2RDk4QTEpLCAoMHhCOEUzMTMxOCksICgweDYyRjIwMUM0KSwKKyAgICAoMHhBRUNDMzM4QiksICgweDVBODI3OTc4KSwgKDB4QTU3RDg2NDYpLCAoMHg1MTMzQ0M4RiksICgweDlEMERGRTUyKSwKKyAgICAoMHg0NzFDRUQwNSksICgweDk1OTI2NzcyKSwgKDB4M0M1NkJBQjUpLCAoMHg4RjFEMzQ2MSksICgweDMwRkJDNTQ3KSwKKyAgICAoMHg4OUJFNTBDMiksICgweDI1MjgwQzA1KSwgKDB4ODU4MkZBOEMpLCAoMHgxOEY4Qjg4OCksICgweDgyNzVBMEQxKSwKKyAgICAoMHgwQzhCRDM1NiksICgweDgwOURDOTcxKSwgKDB4RkZGRkZGQTMpLCAoMHg4MDAwMDAwMiksICgweEYzNzQyQ0VFKSwKKyAgICAoMHg4MDlEQzk2QiksICgweEU3MDc0N0JCKSwgKDB4ODI3NUEwQzMpLCAoMHhEQUQ3RjM0OCksICgweDg1ODJGQUMyKSwKKyAgICAoMHhDRjA0M0FGOCksICgweDg5QkU1MEE4KSwgKDB4QzNBOTQ2NjkpLCAoMHg4RjFEMzNDOCksICgweEI4RTMxMzlFKSwKKyAgICAoMHg5NTkyNjcwNSksICgweEFFQ0MzM0E1KSwgKDB4OUQwREZFMjcpLCAoMHhBNTdEODY1RSksICgweEE1N0Q4NjcwKSwKKyAgICAoMHg5RDBERkUxNiksICgweEFFQ0MzM0I5KSwgKDB4OTU5MjY2RjcpLCAoMHhCOEUzMTNCNCksICgweDhGMUQzNEFEKSwKKyAgICAoMHhDM0E5NDRCQyksICgweDg5QkU1MTAwKSwgKDB4Q0YwNDNBMjQpLCAoMHg4NTgyRkFCQiksICgweERBRDdGMzYwKSwKKyAgICAoMHg4Mjc1QTBCRSksICgweEU3MDc0N0Q0KSwgKDB4ODA5REM5NjgpLCAoMHhGMzc0MkQwOCksICgweDAwMDAwMDAwKSwKKyAgICAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKKyAgICAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweEZGN0IwMDAwKSwKKyAgICAoMHgyRTgwNTBGMSksICgweDEwMjE0NDgyKSwgKDB4MUJBMDAwMDUpLCAoMHgwMDAwQzBGRiksICgweDAwMDAwMDAwKSwKKyAgICAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKKyAgICAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKKyAgICAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKKyAgICAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKKyAgICAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKKyAgICAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKKyAgICAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKKyAgICAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKKyAgICAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwKKyAgICAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApfTsKIAotc3RhdGljIGNvbnN0IElOVCBfX3R3aWRkbGVzX21pcHNfZmZ0MzJfMjU2W10gPQotewotKDB4N0ZGRkZGRkYpLCAoMHgwMDAwMDAwMCksICgweDdGRjYyMTgxKSwgKDB4RkNEQkQ1NDApLCAoMHg3RkQ4ODc4QyksICgweEY5QjgyNjgxKSwgKDB4N0ZBNzM2QjIpLCAoMHhGNjk1NkZCNyksICgweDdGNjIzNjhEKSwgKDB4RjM3NDJDOUQpLCAoMHg3RjA5OTFDMyksICgweEYwNTREOERBKSwgKDB4N0U5RDU1RkIpLCAoMHhFRDM3RUY5MSksICgweDdFMUQ5M0VBKSwgKDB4RUExREVCQzYpLCAoMHg3RDhBNUYzQyksICgweEU3MDc0N0I5KSwKLSgweDdDRTNDRUIwKSwgKDB4RTNGNDdEOTUpLCAoMHg3QzI5RkJFRiksICgweEUwRTYwNjhGKSwgKDB4N0I1RDAzQTEpLCAoMHhERERDNUI0RiksICgweDdBN0QwNTU5KSwgKDB4REFEN0YzQTIpLCAoMHg3OThBMjNBOCksICgweEQ3RDk0NkMzKSwgKDB4Nzg4NDg0MTkpLCAoMHhENEUwQ0IyOCksICgweDc3NkM0RUQ5KSwgKDB4RDFFRUY1OUQpLCAoMHg3NjQxQUYzMiksICgweENGMDQzQTlFKSwgKDB4NzUwNEQzNEMpLCAoMHhDQzIxMEQ4QiksCi0oMHg3M0I1RUJDRiksICgweEM5NDVERkVCKSwgKDB4NzI1NTJDNzkpLCAoMHhDNjczMjJCOSksICgweDcwRTJDQkNEKSwgKDB4QzNBOTQ1QTEpLCAoMHg2RjVGMDJDRiksICgweEMwRThCNjdFKSwgKDB4NkRDQTBEMjcpLCAoMHhCRTMxRTFCRiksICgweDZDMjQyOTY5KSwgKDB4QkI4NTMyQzApLCAoMHg2QTZEOThBMSksICgweEI4RTMxMzE4KSwgKDB4NjhBNjlFNzIpLCAoMHhCNjRCRUFCOSksICgweDY2Q0Y4MTAzKSwgKDB4QjNDMDFGRTkpLAotKDB4NjRFODg5NEEpLCAoMHhCMTQwMTc4QyksICgweDYyRjIwMUM0KSwgKDB4QUVDQzMzOEIpLCAoMHg2MEVDMzgzQSksICgweEFDNjRENTFGKSwgKDB4NUVENzdDODYpLCAoMHhBQTBBNUIyQyksICgweDVDQjQyMENEKSwgKDB4QTdCRDIyOUEpLCAoMHg1QTgyNzk3OCksICgweEE1N0Q4NjQ2KSwgKDB4NTg0MkREN0UpLCAoMHhBMzRCREY0QiksICgweDU1RjVBNEVEKSwgKDB4QTEyODgzOTEpLCAoMHg1MzlCMkFGQiksICgweDlGMTNDN0RDKSwKLSgweDUxMzNDQzhGKSwgKDB4OUQwREZFNTIpLCAoMHg0RUJGRTg4RiksICgweDlCMTc3NkNCKSwgKDB4NEMzRkRGQ0MpLCAoMHg5OTMwN0VDNSksICgweDQ5QjQxNTYyKSwgKDB4OTc1OTYxQTIpLCAoMHg0NzFDRUQwNSksICgweDk1OTI2NzcyKSwgKDB4NDQ3QUNENUQpLCAoMHg5M0RCRDZBQSksICgweDQxQ0UxRUNEKSwgKDB4OTIzNUYzMkMpLCAoMHgzRjE3NDk5RiksICgweDkwQTBGRDQyKSwgKDB4M0M1NkJBQjUpLCAoMHg4RjFEMzQ2MSksCi0oMHgzOThDRENGMyksICgweDhEQUFEMzVEKSwgKDB4MzZCQTIwMzQpLCAoMHg4QzRBMTQ0MCksICgweDMzREVGMjFGKSwgKDB4OEFGQjJDOEUpLCAoMHgzMEZCQzU0NyksICgweDg5QkU1MEMyKSwgKDB4MkUxMTBBQkYpLCAoMHg4ODkzQjE0QSksICgweDJCMUYzNEJDKSwgKDB4ODc3QjdCREQpLCAoMHgyODI2Qjk1RSksICgweDg2NzVEQzYyKSwgKDB4MjUyODBDMDUpLCAoMHg4NTgyRkE4QyksICgweDIyMjNBNEQyKSwgKDB4ODRBMkZDNjgpLAotKDB4MUYxOUY5RjApLCAoMHg4M0Q2MDQzMSksICgweDFDMEI4MjRFKSwgKDB4ODMxQzMxNEEpLCAoMHgxOEY4Qjg4OCksICgweDgyNzVBMEQxKSwgKDB4MTVFMjEzRkQpLCAoMHg4MUUyNkMwQiksICgweDEyQzgxMDkwKSwgKDB4ODE2MkFBMEEpLCAoMHgwRkFCMjZCOSksICgweDgwRjY2RTMwKSwgKDB4MEM4QkQzNTYpLCAoMHg4MDlEQzk3MSksICgweDA5NkE5MEFCKSwgKDB4ODA1OEM5NTUpLCAoMHgwNjQ3RDk0OSksICgweDgwMjc3ODcxKSwKLSgweDAzMjQyQUY2KSwgKDB4ODAwOURFODEpLCAoMHhGRkZGRkZBMyksICgweDgwMDAwMDAyKSwgKDB4RkNEQkQ1NEUpLCAoMHg4MDA5REU3RiksICgweEY5QjgyNkZCKSwgKDB4ODAyNzc4NkUpLCAoMHhGNjk1NkY5OSksICgweDgwNThDOTUwKSwgKDB4RjM3NDJDRUUpLCAoMHg4MDlEQzk2QiksICgweEYwNTREODhEKSwgKDB4ODBGNjZFNDcpLCAoMHhFRDM3RUZCMyksICgweDgxNjJBQTAwKSwgKDB4RUExREVCNEEpLCAoMHg4MUUyNkMyQyksCi0oMHhFNzA3NDdCQiksICgweDgyNzVBMEMzKSwgKDB4RTNGNDdERjUpLCAoMHg4MzFDMzEzQiksICgweEUwRTYwNjUzKSwgKDB4ODNENjA0MjApLCAoMHhERERDNUI2RiksICgweDg0QTJGQzU1KSwgKDB4REFEN0YzNDgpLCAoMHg4NTgyRkFDMiksICgweEQ3RDk0NkUzKSwgKDB4ODY3NURDNEQpLCAoMHhENEUwQ0I4NCksICgweDg3N0I3QkM2KSwgKDB4RDFFRUY1ODEpLCAoMHg4ODkzQjEzMiksICgweENGMDQzQUY4KSwgKDB4ODlCRTUwQTgpLAotKDB4Q0MyMTBEMzUpLCAoMHg4QUZCMkNEQiksICgweEM5NDVFMDBBKSwgKDB4OEM0QTE0MjMpLCAoMHhDNjczMjI2NSksICgweDhEQUFEM0IyKSwgKDB4QzNBOTQ2NjkpLCAoMHg4RjFEMzNDOCksICgweEMwRThCNjlDKSwgKDB4OTBBMEZEMjEpLCAoMHhCRTMxRTE2RSksICgweDkyMzVGMzA5KSwgKDB4QkI4NTMyMDUpLCAoMHg5M0RCRDcwRSksICgweEI4RTMxMzlFKSwgKDB4OTU5MjY3MDUpLCAoMHhCNjRCRUFENSksICgweDk3NTk2MTdCKSwKLSgweEIzQzAxRjlEKSwgKDB4OTkzMDdGMzUpLCAoMHhCMTQwMTgwQyksICgweDlCMTc3NjUyKSwgKDB4QUVDQzMzQTUpLCAoMHg5RDBERkUyNyksICgweEFDNjRENEQ4KSwgKDB4OUYxM0M4MDMpLCAoMHhBQTBBNUE4OCksICgweEExMjg4NDBGKSwgKDB4QTdCRDIzMTApLCAoMHhBMzRCREVDMyksICgweEE1N0Q4NjVFKSwgKDB4QTU3RDg2NzApLCAoMHhBMzRCREVCMiksICgweEE3QkQyMzIyKSwgKDB4QTEyODgzRkUpLCAoMHhBQTBBNUE5QiksCi0oMHg5RjEzQzdGMiksICgweEFDNjRENEVCKSwgKDB4OUQwREZFMTYpLCAoMHhBRUNDMzNCOSksICgweDlCMTc3NjQyKSwgKDB4QjE0MDE4MjApLCAoMHg5OTMwN0YyNiksICgweEIzQzAxRkIyKSwgKDB4OTc1OTYxNkMpLCAoMHhCNjRCRUFFQSksICgweDk1OTI2NkY3KSwgKDB4QjhFMzEzQjQpLCAoMHg5M0RCRDcwMCksICgweEJCODUzMjFBKSwgKDB4OTIzNUYyRkMpLCAoMHhCRTMxRTE4NCksICgweDkwQTBGRDE0KSwgKDB4QzBFOEI2QjIpLAotKDB4OEYxRDM0QUQpLCAoMHhDM0E5NDRCQyksICgweDhEQUFEM0E2KSwgKDB4QzY3MzIyN0MpLCAoMHg4QzRBMTQxOCksICgweEM5NDVFMDIxKSwgKDB4OEFGQjJDNjgpLCAoMHhDQzIxMEUzNyksICgweDg5QkU1MTAwKSwgKDB4Q0YwNDNBMjQpLCAoMHg4ODkzQjEyOCksICgweEQxRUVGNTk5KSwgKDB4ODc3QjdCQkQpLCAoMHhENEUwQ0I5QyksICgweDg2NzVEQzk1KSwgKDB4RDdEOTQ2MDgpLCAoMHg4NTgyRkFCQiksICgweERBRDdGMzYwKSwKLSgweDg0QTJGQzRGKSwgKDB4REREQzVCODgpLCAoMHg4M0Q2MDNEQyksICgweEUwRTYwNzY0KSwgKDB4ODMxQzMxNkQpLCAoMHhFM0Y0N0QxNCksICgweDgyNzVBMEJFKSwgKDB4RTcwNzQ3RDQpLCAoMHg4MUUyNkJGQiksICgweEVBMURFQzVGKSwgKDB4ODE2MkFBMjIpLCAoMHhFRDM3RUVDRiksICgweDgwRjY2RTQ0KSwgKDB4RjA1NEQ4QTYpLCAoMHg4MDlEQzk2OCksICgweEYzNzQyRDA4KSwgKDB4ODA1OEM5M0IpLCAoMHhGNjk1NzBCMiksCi0oMHg4MDI3Nzg3OSksICgweEY5QjgyNjE1KSwgKDB4ODAwOURFN0UpLCAoMHhGQ0RCRDU2OCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4RjFGRjdBMDApLCAoMHhFMjNBODA1MCksICgweDg0MUEyMTE0KSwgKDB4QzU4OERBNzUpLCAoMHgwMjQwMDE0MyksICgweEFFRDZBQUQ3KSwgKDB4OTRDMjU0NUIpLCAoMHgzRTQ2MTU2QyksICgweDA1QkZERjI3KSwgKDB4QjA4MjIwNzUpLAotKDB4RDI0QzdCQzQpLCAoMHg2MjEyMjA1NCksICgweDhDQzQxQzQ5KSwgKDB4MkM0MTQ5NzIpLCAoMHg3MThEN0M1RSksICgweERFRTJBM0Q4KSwgKDB4NDU0NEMxMzUpLCAoMHg2NDI5MjU3MyksICgweDc2QjUxRjhBKSwgKDB4NEI3RDY1NTcpLCAoMHg4NzE2NDkwNyksICgweEY1OURCRkVDKSwgKDB4MDRDRUU5REUpLCAoMHhCNEJDNEM5MCksICgweDlBRkNDRDMwKSwgKDB4OEM3QTMxNkYpLCAoMHg5MEZEQUNBNyksICgweDRFMEQ2MzgzKSwKLSgweEFFRjE2QzBCKSwgKDB4MDYyMjAyMEEpLCAoMHgzN0I2QTczOCksICgweEZGQkI3RDcxKSwgKDB4NUZFREQxMkYpLCAoMHhFRTQ3RkRDOCksICgweDNEQzc5MTNGKSwgKDB4RUFFRUY3RkQpLCAoMHgyMTlEQURFQyksICgweEY5RTUzRjVGKSwgKDB4QjNEODJEOUUpLCAoMHhCQkI3OUJDQiksICgweDQzQUQyQUFCKSwgKDB4MEU3QURCQzApLCAoMHhBQkJEMDk1MiksICgweDFBNkVGNDNBKSwgKDB4Q0Q5QjJBOUQpLCAoMHg3MjIyQjM2NiksCi0oMHg5NzlFODlFOSksICgweDAyQzkxMTNGKSwgKDB4MUQ1MTE0NjYpLCAoMHg1N0E5MjIwNiksICgweDRBNDEyMDc1KSwgKDB4RkQzMUQ3ODMpLCAoMHhBNzU0MkVGQyksICgweDI0Qjc2OTc1KSwgKDB4Qjk5OTYyQzcpLCAoMHgxOUYxRDM1NiksICgweDlEMTJDM0NCKSwgKDB4NkQzN0Q1NDIpLCAoMHgyOUU3MjE0RCksICgweDg5MDBGNjQ1KSwgKDB4QjE1NEFENEEpLCAoMHhGMDQ3RDk4OCksICgweDNGMkU1RTc3KSwgKDB4QUZCNjhDNDkpLAotKDB4QzlGMTlFNTEpLCAoMHg2MTkyRjUzQSksICgweDVBRTNEMDgwKSwgKDB4MURBNkM2NzcpLCAoMHhENDg1RDUwQyksICgweDlBQTdFOEIyKSwgKDB4RjU1RUUxRDUpLCAoMHhDMDBCNjkzMiksICgweDg1QUNFOTEyKSwgKDB4ODIwOEIxQjkpLCAoMHg4MEUxNDE3MCksICgweEExRDY3QzNGKSwgKDB4MDU4MDM1QjMpLCAoMHhBNEZFMzZDQSksICgweEJFRTU0N0U0KSwgKDB4RUYyNzYwNTIpLCAoMHg0MkFBNDM4OCksICgweDlDMTFBMkVEKSwKLSgweDEwMjAyNTQxKSwgKDB4MkQ0ODA5MTApLCAoMHhCMDlCMUFDNCksICgweDE5RTdEMTdEKSwgKDB4NTIwODI0NTApLCAoMHgzRUVEMTcwNSksICgweEYyMEZGOEExKSwgKDB4ODlGNkUxN0YpLCAoMHgxN0Q3REMwMCksICgweDA5QjlGMkMzKSwgKDB4NjM3ODk2OEMpLCAoMHhBRjA2MDdGNiksICgweEZERkRFMEM5KSwgKDB4M0NFM0RGRUUpLCAoMHg1MTY4MjI5RSksICgweDdDRjc5NzM0KSwgKDB4RjVGRkY1NkYpLCAoMHgzMDcwMDA5MyksCi0oMHgxMzVGNUM3NSksICgweEU2RDczRUVFKSwgKDB4NkU0MDBERjkpLCAoMHg1ODI1MkFDQiksICgweDU1NzMxMUNBKSwgKDB4NTUzOUIzMDMpLCAoMHg1NjU1NzM1NSksICgweEI2QkRBQ0VGKSwgKDB4NTlGOTQyOEQpLCAoMHg5QUU2MzAyMCksICgweDU1OEZGN0U3KSwgKDB4Nzk1NTgwNkQpLCAoMHgwOUQ1NDlGMyksICgweDYwM0JGNUI3KSwgKDB4MzEzNDQxM0IpLCAoMHhCQ0E3QzFBQSksICgweEE5OEQxMzM5KSwgKDB4NTdCMjlDOTcpLAotKDB4NTBGMUZGMDcpLCAoMHhFNEExMzk4MCksICgweEQwODgxQTIxKSwgKDB4QzFGRkUzMEEpLCAoMHhCMEE2NkMxOSksICgweDE4NDE2NDkwKSwgKDB4MTYwRTAyMTQpLCAoMHhBNTg0Q0JCNSksICgweDAyQUFBODJBKSwgKDB4NzM5ODEzNDApLCAoMHg5NjRBMjRERSksICgweDZFODI5RkM0KSwgKDB4REZENjIzNjApLCAoMHg0QzNCRjE1MiksICgweDM4NzIxNTc0KSwgKDB4RDQ2QkM5MTIpLCAoMHgxRUI3RkREOCksICgweDFDQTZDQkMwKSwKLSgweEJCQ0JDMTExKSwgKDB4QTZGRDE0MDMpLCAoMHg3NkM2ODhEOSksICgweEI0NzE4NkNCKSwgKDB4NUU5ODkzNkQpLCAoMHg5QkJGN0UyRSksICgweDhCN0ZCQ0VDKSwgKDB4OURBRjdFRjUpLCAoMHg3RTNBNzlGMSksICgweDlDODk2QUNEKSwgKDB4NjI4RjI0OUEpLCAoMHhERDZFNTFBRiksICgweEFGNzM5OTRCKSwgKDB4NTk2Njk5NUQpLCAoMHhCNzYyMDU5NyksICgweDM2OUIxRTU0KSwgKDB4N0NFREM3ODcpLCAoMHhFN0IxNUIxRiksCi0oMHhCMzZGNUY3RCksICgweEI1QjczRUY2KSwgKDB4RDc2RUVFRTIpLCAoMHgxNEU4NjE4NiksICgweENDMTU5MjkxKSwgKDB4NEVDODVDQTMpLCAoMHhFQzNDNzA0RSksICgweDBCNjYzM0IzKSwgKDB4NEQ5OTJENEIpLCAoMHhFQjFCNTc3NCksICgweERGQjlENTA4KSwgKDB4MTE3ODM3MTkpLCAoMHg3N0JCMTBCMCksICgweEZDREY4MzUwKSwgKDB4RDM0QTdDNjUpLCAoMHhFRjZFNTdCQiksICgweEVDRDU2QzY4KSwgKDB4OEVCN0NBMzYpLAotKDB4MkYyNkIxMzYpLCAoMHg1NTYzMTI2OSksICgweEVGMTIxM0UxKSwgKDB4QTU2QUI4NDQpLCAoMHhBQTRCMUQ2NCksICgweDY0MzQxRUE5KSwgKDB4MENFOURCNDgpLCAoMHg0NjBDMjE0NCksICgweEFEQzUwMjA1KSwgKDB4NTE1QzQ3MkYpLCAoMHgzMDRDMjlCRCksICgweDc2QUY4NzExKSwgKDB4NTU3Q0FEQjcpLCAoMHgyQTlCQkM4RSksICgweEU1MEUxNDVCKSwgKDB4OUMyMDMxRkQpLCAoMHhEOTEyMUE4QyksICgweEY1MUE5NkZEKSwKLSgweDQ1Q0NCRUJGKSwgKDB4NUY4ODQ4NzEpLCAoMHg2NkRBRTI5MSksICgweDk1QURDOUU1KSwgKDB4MzNDRjMwNEQpLCAoMHgyM0M4N0RDRSksICgweEE3MDE0RkIzKSwgKDB4RkIzNTFFNzEpLCAoMHg4RDYwRjY2RiksICgweEJGRDZEREQ1KSwgKDB4MTUxRkU2RjEpLCAoMHhEQ0M3OTM1QSksICgweDBDQUNGQkYwKSwgKDB4RUU1NUEzNzEpLCAoMHhCRTQ2Qjc1NSksICgweDBGNzlEQ0QyKSwgKDB4MjNERkY3NkQpLCAoMHg4M0RFNzZENyksCi0oMHg4QjBFM0FFRSksICgweEIwMUJGQjQ0KSwgKDB4NEUzNjE5RkEpLCAoMHhBMTlGOUU2NCksICgweEJENDkyQUQ5KSwgKDB4MDg5OUU0NUYpLCAoMHg4MTU2RTQxRCksICgweDVEQTUzOUJBKSwgKDB4MEFGMzVCMkMpLCAoMHhEQjg5QkFBRSksICgweEExMjhDOTY2KSwgKDB4QTAyQ0VBRUUpLCAoMHhDNUExQjI5MSksICgweDA4Q0JBOTNFKSwgKDB4OTBGRDg4N0EpLCAoMHg2MDMwNDM4NiksICgweDZBNTlGMUVBKSwgKDB4QTQ2MUU2N0IpLAotKDB4QzE2MjJCNzYpLCAoMHg2RkEyRjkwNiksICgweEFBM0E0MDFBKSwgKDB4QjY4RUE0N0IpLCAoMHhDNjE3QTg4OSksICgweDYwMjRBNTdCKSwgKDB4MkRENTM1NTUpLCAoMHhGMUZGRUEzMCksICgweDgxM0E4MDUwKSwgKDB4OEQxQTIxQjQpLCAoMHhGRkU3MkNGNyksICgweEEzNzQxNUUxKSwgKDB4MzBBMkM4MzApLCAoMHhBM0ExQ0EyOCksICgweDRDNUUzNTg2KSwgKDB4MzA5ODYxQjkpLCAoMHgxRjQ5ODUwRCksICgweDYxNjRDNzQ4KSwKLSgweDlENzA0OEU1KSwgKDB4QzEyNDU2OUUpLCAoMHhDQ0IwRTExMSksICgweDE1QjJCQjg2KSwgKDB4MTgzNzFEOUMpLCAoMHhCMkFCRDk0RCksICgweDhFQzY1NkIzKSwgKDB4QkYwMTA5OTUpCi19Oworc3RhdGljIGNvbnN0IElOVCBfX3R3aWRkbGVzX21pcHNfZmZ0MzJfMTI4W10gPSB7CisgICAgKDB4N0ZGRkZGRkYpLCAoMHgwMDAwMDAwMCksICgweDdGRDg4NzhDKSwgKDB4RjlCODI2ODEpLCAoMHg3RjYyMzY4RCksCisgICAgKDB4RjM3NDJDOUQpLCAoMHg3RTlENTVGQiksICgweEVEMzdFRjkxKSwgKDB4N0Q4QTVGM0MpLCAoMHhFNzA3NDdCOSksCisgICAgKDB4N0MyOUZCRUYpLCAoMHhFMEU2MDY4RiksICgweDdBN0QwNTU5KSwgKDB4REFEN0YzQTIpLCAoMHg3ODg0ODQxOSksCisgICAgKDB4RDRFMENCMjgpLCAoMHg3NjQxQUYzMiksICgweENGMDQzQTlFKSwgKDB4NzNCNUVCQ0YpLCAoMHhDOTQ1REZFQiksCisgICAgKDB4NzBFMkNCQ0QpLCAoMHhDM0E5NDVBMSksICgweDZEQ0EwRDI3KSwgKDB4QkUzMUUxQkYpLCAoMHg2QTZEOThBMSksCisgICAgKDB4QjhFMzEzMTgpLCAoMHg2NkNGODEwMyksICgweEIzQzAxRkU5KSwgKDB4NjJGMjAxQzQpLCAoMHhBRUNDMzM4QiksCisgICAgKDB4NUVENzdDODYpLCAoMHhBQTBBNUIyQyksICgweDVBODI3OTc4KSwgKDB4QTU3RDg2NDYpLCAoMHg1NUY1QTRFRCksCisgICAgKDB4QTEyODgzOTEpLCAoMHg1MTMzQ0M4RiksICgweDlEMERGRTUyKSwgKDB4NEMzRkRGQ0MpLCAoMHg5OTMwN0VDNSksCisgICAgKDB4NDcxQ0VEMDUpLCAoMHg5NTkyNjc3MiksICgweDQxQ0UxRUNEKSwgKDB4OTIzNUYzMkMpLCAoMHgzQzU2QkFCNSksCisgICAgKDB4OEYxRDM0NjEpLCAoMHgzNkJBMjAzNCksICgweDhDNEExNDQwKSwgKDB4MzBGQkM1NDcpLCAoMHg4OUJFNTBDMiksCisgICAgKDB4MkIxRjM0QkMpLCAoMHg4NzdCN0JERCksICgweDI1MjgwQzA1KSwgKDB4ODU4MkZBOEMpLCAoMHgxRjE5RjlGMCksCisgICAgKDB4ODNENjA0MzEpLCAoMHgxOEY4Qjg4OCksICgweDgyNzVBMEQxKSwgKDB4MTJDODEwOTApLCAoMHg4MTYyQUEwQSksCisgICAgKDB4MEM4QkQzNTYpLCAoMHg4MDlEQzk3MSksICgweDA2NDdEOTQ5KSwgKDB4ODAyNzc4NzEpLCAoMHhGRkZGRkZBMyksCisgICAgKDB4ODAwMDAwMDIpLCAoMHhGOUI4MjZGQiksICgweDgwMjc3ODZFKSwgKDB4RjM3NDJDRUUpLCAoMHg4MDlEQzk2QiksCisgICAgKDB4RUQzN0VGQjMpLCAoMHg4MTYyQUEwMCksICgweEU3MDc0N0JCKSwgKDB4ODI3NUEwQzMpLCAoMHhFMEU2MDY1MyksCisgICAgKDB4ODNENjA0MjApLCAoMHhEQUQ3RjM0OCksICgweDg1ODJGQUMyKSwgKDB4RDRFMENCODQpLCAoMHg4NzdCN0JDNiksCisgICAgKDB4Q0YwNDNBRjgpLCAoMHg4OUJFNTBBOCksICgweEM5NDVFMDBBKSwgKDB4OEM0QTE0MjMpLCAoMHhDM0E5NDY2OSksCisgICAgKDB4OEYxRDMzQzgpLCAoMHhCRTMxRTE2RSksICgweDkyMzVGMzA5KSwgKDB4QjhFMzEzOUUpLCAoMHg5NTkyNjcwNSksCisgICAgKDB4QjNDMDFGOUQpLCAoMHg5OTMwN0YzNSksICgweEFFQ0MzM0E1KSwgKDB4OUQwREZFMjcpLCAoMHhBQTBBNUE4OCksCisgICAgKDB4QTEyODg0MEYpLCAoMHhBNTdEODY1RSksICgweEE1N0Q4NjcwKSwgKDB4QTEyODgzRkUpLCAoMHhBQTBBNUE5QiksCisgICAgKDB4OUQwREZFMTYpLCAoMHhBRUNDMzNCOSksICgweDk5MzA3RjI2KSwgKDB4QjNDMDFGQjIpLCAoMHg5NTkyNjZGNyksCisgICAgKDB4QjhFMzEzQjQpLCAoMHg5MjM1RjJGQyksICgweEJFMzFFMTg0KSwgKDB4OEYxRDM0QUQpLCAoMHhDM0E5NDRCQyksCisgICAgKDB4OEM0QTE0MTgpLCAoMHhDOTQ1RTAyMSksICgweDg5QkU1MTAwKSwgKDB4Q0YwNDNBMjQpLCAoMHg4NzdCN0JCRCksCisgICAgKDB4RDRFMENCOUMpLCAoMHg4NTgyRkFCQiksICgweERBRDdGMzYwKSwgKDB4ODNENjAzREMpLCAoMHhFMEU2MDc2NCksCisgICAgKDB4ODI3NUEwQkUpLCAoMHhFNzA3NDdENCksICgweDgxNjJBQTIyKSwgKDB4RUQzN0VFQ0YpLCAoMHg4MDlEQzk2OCksCisgICAgKDB4RjM3NDJEMDgpLCAoMHg4MDI3Nzg3OSksICgweEY5QjgyNjE1KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4QTQzNzAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweEZGNzcwMDAwKSwgKDB4MkU4MDUwRjEpLCAoMHgxQTIxNDQ2MiksCisgICAgKDB4MDRENkQ1ODMpLCAoMHg0MDAzMTI4MiksICgweDY0NjlBNzM1KSwgKDB4MEI0Qzk5QTMpLCAoMHgwQUY4ODU5NCksCisgICAgKDB4RjkwOTY5RDcpLCAoMHg5NjEzMUM5MiksICgweDAyNUVFQTEwKSwgKDB4M0ExRkU0MjEpLCAoMHg2MTRGRjM5MCksCisgICAgKDB4MUNGREMzMjcpLCAoMHhDMTc3RTA0RiksICgweEY0RDg3RTgyKSwgKDB4NzgyNTNGMzkpLCAoMHhCQjgzOUY5NCksCisgICAgKDB4OTk4QjNFQjEpLCAoMHgwQ0JDQzAyMSksICgweDQxQkVDODQzKSwgKDB4QUMwRUUxMjEpLCAoMHg1MjcxOTY0MyksCisgICAgKDB4OTA5QTJCMUQpLCAoMHhGMzg5MzFFMSksICgweEY0MTMyN0ZGKSwgKDB4RjYwOTk4NDcpLCAoMHhBNzBEMjE5QyksCisgICAgKDB4N0JENTIxMzUpLCAoMHg3ODA2MEY3MSksICgweEVBM0M4N0Q4KSwgKDB4M0ZBRjNBMjQpLCAoMHhFNEIyQzQyMSksCisgICAgKDB4Qjk5RDE0NTMpLCAoMHgyNzQxRTI2NCksICgweDIyMzk4MTNBKSwgKDB4Mjk0NERBMjApLCAoMHg0NDFFRjdDNCksCisgICAgKDB4MEJEMEI3MjApLCAoMHhFRDg0RUEyNiksICgweDczRTBDMEQyKSwgKDB4Njc4RTMwMzkpLCAoMHgyMTQyMDEwOSksCisgICAgKDB4ODYwNzQ5MkUpLCAoMHgyOENFRjQ0MCksICgweDAyMjc2OEM4KSwgKDB4RjY4RTM2MTEpLCAoMHg4NEU4NEQ1NSksCisgICAgKDB4NzMwMDRDMDQpLCAoMHhGOUI2NjMwRSksICgweDY3N0ZGQThGKSwgKDB4NTMwQ0IxOEYpLCAoMHgyQzRFRTMxMCksCisgICAgKDB4QUJDNzUzN0MpLCAoMHg4MkNGREJDQiksICgweDEwMEM2M0EyKSwgKDB4ODc2RDc1QkEpLCAoMHhDNjgzRjg4OCksCisgICAgKDB4MENEQzFFMUUpLCAoMHhBNjAwRTgzMyksICgweDMzMDM2MDY2KSwgKDB4NDMwNTA0OUMpLCAoMHg0MDg5MDcxMyksCisgICAgKDB4OUQxMjUzMkUpLCAoMHg3QjZFMkZFMiksICgweEUyNDRDQzA5KSwgKDB4OUZGQjIwODIpLCAoMHhBQjM3MzVEMyksCisgICAgKDB4MDAwMDAwODApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4MDAwMDAwMDApfTsKIAorc3RhdGljIGNvbnN0IElOVCBfX3R3aWRkbGVzX21pcHNfZmZ0MzJfMjU2W10gPSB7CisgICAgKDB4N0ZGRkZGRkYpLCAoMHgwMDAwMDAwMCksICgweDdGRjYyMTgxKSwgKDB4RkNEQkQ1NDApLCAoMHg3RkQ4ODc4QyksCisgICAgKDB4RjlCODI2ODEpLCAoMHg3RkE3MzZCMiksICgweEY2OTU2RkI3KSwgKDB4N0Y2MjM2OEQpLCAoMHhGMzc0MkM5RCksCisgICAgKDB4N0YwOTkxQzMpLCAoMHhGMDU0RDhEQSksICgweDdFOUQ1NUZCKSwgKDB4RUQzN0VGOTEpLCAoMHg3RTFEOTNFQSksCisgICAgKDB4RUExREVCQzYpLCAoMHg3RDhBNUYzQyksICgweEU3MDc0N0I5KSwgKDB4N0NFM0NFQjApLCAoMHhFM0Y0N0Q5NSksCisgICAgKDB4N0MyOUZCRUYpLCAoMHhFMEU2MDY4RiksICgweDdCNUQwM0ExKSwgKDB4REREQzVCNEYpLCAoMHg3QTdEMDU1OSksCisgICAgKDB4REFEN0YzQTIpLCAoMHg3OThBMjNBOCksICgweEQ3RDk0NkMzKSwgKDB4Nzg4NDg0MTkpLCAoMHhENEUwQ0IyOCksCisgICAgKDB4Nzc2QzRFRDkpLCAoMHhEMUVFRjU5RCksICgweDc2NDFBRjMyKSwgKDB4Q0YwNDNBOUUpLCAoMHg3NTA0RDM0QyksCisgICAgKDB4Q0MyMTBEOEIpLCAoMHg3M0I1RUJDRiksICgweEM5NDVERkVCKSwgKDB4NzI1NTJDNzkpLCAoMHhDNjczMjJCOSksCisgICAgKDB4NzBFMkNCQ0QpLCAoMHhDM0E5NDVBMSksICgweDZGNUYwMkNGKSwgKDB4QzBFOEI2N0UpLCAoMHg2RENBMEQyNyksCisgICAgKDB4QkUzMUUxQkYpLCAoMHg2QzI0Mjk2OSksICgweEJCODUzMkMwKSwgKDB4NkE2RDk4QTEpLCAoMHhCOEUzMTMxOCksCisgICAgKDB4NjhBNjlFNzIpLCAoMHhCNjRCRUFCOSksICgweDY2Q0Y4MTAzKSwgKDB4QjNDMDFGRTkpLCAoMHg2NEU4ODk0QSksCisgICAgKDB4QjE0MDE3OEMpLCAoMHg2MkYyMDFDNCksICgweEFFQ0MzMzhCKSwgKDB4NjBFQzM4M0EpLCAoMHhBQzY0RDUxRiksCisgICAgKDB4NUVENzdDODYpLCAoMHhBQTBBNUIyQyksICgweDVDQjQyMENEKSwgKDB4QTdCRDIyOUEpLCAoMHg1QTgyNzk3OCksCisgICAgKDB4QTU3RDg2NDYpLCAoMHg1ODQyREQ3RSksICgweEEzNEJERjRCKSwgKDB4NTVGNUE0RUQpLCAoMHhBMTI4ODM5MSksCisgICAgKDB4NTM5QjJBRkIpLCAoMHg5RjEzQzdEQyksICgweDUxMzNDQzhGKSwgKDB4OUQwREZFNTIpLCAoMHg0RUJGRTg4RiksCisgICAgKDB4OUIxNzc2Q0IpLCAoMHg0QzNGREZDQyksICgweDk5MzA3RUM1KSwgKDB4NDlCNDE1NjIpLCAoMHg5NzU5NjFBMiksCisgICAgKDB4NDcxQ0VEMDUpLCAoMHg5NTkyNjc3MiksICgweDQ0N0FDRDVEKSwgKDB4OTNEQkQ2QUEpLCAoMHg0MUNFMUVDRCksCisgICAgKDB4OTIzNUYzMkMpLCAoMHgzRjE3NDk5RiksICgweDkwQTBGRDQyKSwgKDB4M0M1NkJBQjUpLCAoMHg4RjFEMzQ2MSksCisgICAgKDB4Mzk4Q0RDRjMpLCAoMHg4REFBRDM1RCksICgweDM2QkEyMDM0KSwgKDB4OEM0QTE0NDApLCAoMHgzM0RFRjIxRiksCisgICAgKDB4OEFGQjJDOEUpLCAoMHgzMEZCQzU0NyksICgweDg5QkU1MEMyKSwgKDB4MkUxMTBBQkYpLCAoMHg4ODkzQjE0QSksCisgICAgKDB4MkIxRjM0QkMpLCAoMHg4NzdCN0JERCksICgweDI4MjZCOTVFKSwgKDB4ODY3NURDNjIpLCAoMHgyNTI4MEMwNSksCisgICAgKDB4ODU4MkZBOEMpLCAoMHgyMjIzQTREMiksICgweDg0QTJGQzY4KSwgKDB4MUYxOUY5RjApLCAoMHg4M0Q2MDQzMSksCisgICAgKDB4MUMwQjgyNEUpLCAoMHg4MzFDMzE0QSksICgweDE4RjhCODg4KSwgKDB4ODI3NUEwRDEpLCAoMHgxNUUyMTNGRCksCisgICAgKDB4ODFFMjZDMEIpLCAoMHgxMkM4MTA5MCksICgweDgxNjJBQTBBKSwgKDB4MEZBQjI2QjkpLCAoMHg4MEY2NkUzMCksCisgICAgKDB4MEM4QkQzNTYpLCAoMHg4MDlEQzk3MSksICgweDA5NkE5MEFCKSwgKDB4ODA1OEM5NTUpLCAoMHgwNjQ3RDk0OSksCisgICAgKDB4ODAyNzc4NzEpLCAoMHgwMzI0MkFGNiksICgweDgwMDlERTgxKSwgKDB4RkZGRkZGQTMpLCAoMHg4MDAwMDAwMiksCisgICAgKDB4RkNEQkQ1NEUpLCAoMHg4MDA5REU3RiksICgweEY5QjgyNkZCKSwgKDB4ODAyNzc4NkUpLCAoMHhGNjk1NkY5OSksCisgICAgKDB4ODA1OEM5NTApLCAoMHhGMzc0MkNFRSksICgweDgwOURDOTZCKSwgKDB4RjA1NEQ4OEQpLCAoMHg4MEY2NkU0NyksCisgICAgKDB4RUQzN0VGQjMpLCAoMHg4MTYyQUEwMCksICgweEVBMURFQjRBKSwgKDB4ODFFMjZDMkMpLCAoMHhFNzA3NDdCQiksCisgICAgKDB4ODI3NUEwQzMpLCAoMHhFM0Y0N0RGNSksICgweDgzMUMzMTNCKSwgKDB4RTBFNjA2NTMpLCAoMHg4M0Q2MDQyMCksCisgICAgKDB4REREQzVCNkYpLCAoMHg4NEEyRkM1NSksICgweERBRDdGMzQ4KSwgKDB4ODU4MkZBQzIpLCAoMHhEN0Q5NDZFMyksCisgICAgKDB4ODY3NURDNEQpLCAoMHhENEUwQ0I4NCksICgweDg3N0I3QkM2KSwgKDB4RDFFRUY1ODEpLCAoMHg4ODkzQjEzMiksCisgICAgKDB4Q0YwNDNBRjgpLCAoMHg4OUJFNTBBOCksICgweENDMjEwRDM1KSwgKDB4OEFGQjJDREIpLCAoMHhDOTQ1RTAwQSksCisgICAgKDB4OEM0QTE0MjMpLCAoMHhDNjczMjI2NSksICgweDhEQUFEM0IyKSwgKDB4QzNBOTQ2NjkpLCAoMHg4RjFEMzNDOCksCisgICAgKDB4QzBFOEI2OUMpLCAoMHg5MEEwRkQyMSksICgweEJFMzFFMTZFKSwgKDB4OTIzNUYzMDkpLCAoMHhCQjg1MzIwNSksCisgICAgKDB4OTNEQkQ3MEUpLCAoMHhCOEUzMTM5RSksICgweDk1OTI2NzA1KSwgKDB4QjY0QkVBRDUpLCAoMHg5NzU5NjE3QiksCisgICAgKDB4QjNDMDFGOUQpLCAoMHg5OTMwN0YzNSksICgweEIxNDAxODBDKSwgKDB4OUIxNzc2NTIpLCAoMHhBRUNDMzNBNSksCisgICAgKDB4OUQwREZFMjcpLCAoMHhBQzY0RDREOCksICgweDlGMTNDODAzKSwgKDB4QUEwQTVBODgpLCAoMHhBMTI4ODQwRiksCisgICAgKDB4QTdCRDIzMTApLCAoMHhBMzRCREVDMyksICgweEE1N0Q4NjVFKSwgKDB4QTU3RDg2NzApLCAoMHhBMzRCREVCMiksCisgICAgKDB4QTdCRDIzMjIpLCAoMHhBMTI4ODNGRSksICgweEFBMEE1QTlCKSwgKDB4OUYxM0M3RjIpLCAoMHhBQzY0RDRFQiksCisgICAgKDB4OUQwREZFMTYpLCAoMHhBRUNDMzNCOSksICgweDlCMTc3NjQyKSwgKDB4QjE0MDE4MjApLCAoMHg5OTMwN0YyNiksCisgICAgKDB4QjNDMDFGQjIpLCAoMHg5NzU5NjE2QyksICgweEI2NEJFQUVBKSwgKDB4OTU5MjY2RjcpLCAoMHhCOEUzMTNCNCksCisgICAgKDB4OTNEQkQ3MDApLCAoMHhCQjg1MzIxQSksICgweDkyMzVGMkZDKSwgKDB4QkUzMUUxODQpLCAoMHg5MEEwRkQxNCksCisgICAgKDB4QzBFOEI2QjIpLCAoMHg4RjFEMzRBRCksICgweEMzQTk0NEJDKSwgKDB4OERBQUQzQTYpLCAoMHhDNjczMjI3QyksCisgICAgKDB4OEM0QTE0MTgpLCAoMHhDOTQ1RTAyMSksICgweDhBRkIyQzY4KSwgKDB4Q0MyMTBFMzcpLCAoMHg4OUJFNTEwMCksCisgICAgKDB4Q0YwNDNBMjQpLCAoMHg4ODkzQjEyOCksICgweEQxRUVGNTk5KSwgKDB4ODc3QjdCQkQpLCAoMHhENEUwQ0I5QyksCisgICAgKDB4ODY3NURDOTUpLCAoMHhEN0Q5NDYwOCksICgweDg1ODJGQUJCKSwgKDB4REFEN0YzNjApLCAoMHg4NEEyRkM0RiksCisgICAgKDB4REREQzVCODgpLCAoMHg4M0Q2MDNEQyksICgweEUwRTYwNzY0KSwgKDB4ODMxQzMxNkQpLCAoMHhFM0Y0N0QxNCksCisgICAgKDB4ODI3NUEwQkUpLCAoMHhFNzA3NDdENCksICgweDgxRTI2QkZCKSwgKDB4RUExREVDNUYpLCAoMHg4MTYyQUEyMiksCisgICAgKDB4RUQzN0VFQ0YpLCAoMHg4MEY2NkU0NCksICgweEYwNTREOEE2KSwgKDB4ODA5REM5NjgpLCAoMHhGMzc0MkQwOCksCisgICAgKDB4ODA1OEM5M0IpLCAoMHhGNjk1NzBCMiksICgweDgwMjc3ODc5KSwgKDB4RjlCODI2MTUpLCAoMHg4MDA5REU3RSksCisgICAgKDB4RkNEQkQ1NjgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCisgICAgKDB4RjFGRjdBMDApLCAoMHhFMjNBODA1MCksICgweDg0MUEyMTE0KSwgKDB4QzU4OERBNzUpLCAoMHgwMjQwMDE0MyksCisgICAgKDB4QUVENkFBRDcpLCAoMHg5NEMyNTQ1QiksICgweDNFNDYxNTZDKSwgKDB4MDVCRkRGMjcpLCAoMHhCMDgyMjA3NSksCisgICAgKDB4RDI0QzdCQzQpLCAoMHg2MjEyMjA1NCksICgweDhDQzQxQzQ5KSwgKDB4MkM0MTQ5NzIpLCAoMHg3MThEN0M1RSksCisgICAgKDB4REVFMkEzRDgpLCAoMHg0NTQ0QzEzNSksICgweDY0MjkyNTczKSwgKDB4NzZCNTFGOEEpLCAoMHg0QjdENjU1NyksCisgICAgKDB4ODcxNjQ5MDcpLCAoMHhGNTlEQkZFQyksICgweDA0Q0VFOURFKSwgKDB4QjRCQzRDOTApLCAoMHg5QUZDQ0QzMCksCisgICAgKDB4OEM3QTMxNkYpLCAoMHg5MEZEQUNBNyksICgweDRFMEQ2MzgzKSwgKDB4QUVGMTZDMEIpLCAoMHgwNjIyMDIwQSksCisgICAgKDB4MzdCNkE3MzgpLCAoMHhGRkJCN0Q3MSksICgweDVGRUREMTJGKSwgKDB4RUU0N0ZEQzgpLCAoMHgzREM3OTEzRiksCisgICAgKDB4RUFFRUY3RkQpLCAoMHgyMTlEQURFQyksICgweEY5RTUzRjVGKSwgKDB4QjNEODJEOUUpLCAoMHhCQkI3OUJDQiksCisgICAgKDB4NDNBRDJBQUIpLCAoMHgwRTdBREJDMCksICgweEFCQkQwOTUyKSwgKDB4MUE2RUY0M0EpLCAoMHhDRDlCMkE5RCksCisgICAgKDB4NzIyMkIzNjYpLCAoMHg5NzlFODlFOSksICgweDAyQzkxMTNGKSwgKDB4MUQ1MTE0NjYpLCAoMHg1N0E5MjIwNiksCisgICAgKDB4NEE0MTIwNzUpLCAoMHhGRDMxRDc4MyksICgweEE3NTQyRUZDKSwgKDB4MjRCNzY5NzUpLCAoMHhCOTk5NjJDNyksCisgICAgKDB4MTlGMUQzNTYpLCAoMHg5RDEyQzNDQiksICgweDZEMzdENTQyKSwgKDB4MjlFNzIxNEQpLCAoMHg4OTAwRjY0NSksCisgICAgKDB4QjE1NEFENEEpLCAoMHhGMDQ3RDk4OCksICgweDNGMkU1RTc3KSwgKDB4QUZCNjhDNDkpLCAoMHhDOUYxOUU1MSksCisgICAgKDB4NjE5MkY1M0EpLCAoMHg1QUUzRDA4MCksICgweDFEQTZDNjc3KSwgKDB4RDQ4NUQ1MEMpLCAoMHg5QUE3RThCMiksCisgICAgKDB4RjU1RUUxRDUpLCAoMHhDMDBCNjkzMiksICgweDg1QUNFOTEyKSwgKDB4ODIwOEIxQjkpLCAoMHg4MEUxNDE3MCksCisgICAgKDB4QTFENjdDM0YpLCAoMHgwNTgwMzVCMyksICgweEE0RkUzNkNBKSwgKDB4QkVFNTQ3RTQpLCAoMHhFRjI3NjA1MiksCisgICAgKDB4NDJBQTQzODgpLCAoMHg5QzExQTJFRCksICgweDEwMjAyNTQxKSwgKDB4MkQ0ODA5MTApLCAoMHhCMDlCMUFDNCksCisgICAgKDB4MTlFN0QxN0QpLCAoMHg1MjA4MjQ1MCksICgweDNFRUQxNzA1KSwgKDB4RjIwRkY4QTEpLCAoMHg4OUY2RTE3RiksCisgICAgKDB4MTdEN0RDMDApLCAoMHgwOUI5RjJDMyksICgweDYzNzg5NjhDKSwgKDB4QUYwNjA3RjYpLCAoMHhGREZERTBDOSksCisgICAgKDB4M0NFM0RGRUUpLCAoMHg1MTY4MjI5RSksICgweDdDRjc5NzM0KSwgKDB4RjVGRkY1NkYpLCAoMHgzMDcwMDA5MyksCisgICAgKDB4MTM1RjVDNzUpLCAoMHhFNkQ3M0VFRSksICgweDZFNDAwREY5KSwgKDB4NTgyNTJBQ0IpLCAoMHg1NTczMTFDQSksCisgICAgKDB4NTUzOUIzMDMpLCAoMHg1NjU1NzM1NSksICgweEI2QkRBQ0VGKSwgKDB4NTlGOTQyOEQpLCAoMHg5QUU2MzAyMCksCisgICAgKDB4NTU4RkY3RTcpLCAoMHg3OTU1ODA2RCksICgweDA5RDU0OUYzKSwgKDB4NjAzQkY1QjcpLCAoMHgzMTM0NDEzQiksCisgICAgKDB4QkNBN0MxQUEpLCAoMHhBOThEMTMzOSksICgweDU3QjI5Qzk3KSwgKDB4NTBGMUZGMDcpLCAoMHhFNEExMzk4MCksCisgICAgKDB4RDA4ODFBMjEpLCAoMHhDMUZGRTMwQSksICgweEIwQTY2QzE5KSwgKDB4MTg0MTY0OTApLCAoMHgxNjBFMDIxNCksCisgICAgKDB4QTU4NENCQjUpLCAoMHgwMkFBQTgyQSksICgweDczOTgxMzQwKSwgKDB4OTY0QTI0REUpLCAoMHg2RTgyOUZDNCksCisgICAgKDB4REZENjIzNjApLCAoMHg0QzNCRjE1MiksICgweDM4NzIxNTc0KSwgKDB4RDQ2QkM5MTIpLCAoMHgxRUI3RkREOCksCisgICAgKDB4MUNBNkNCQzApLCAoMHhCQkNCQzExMSksICgweEE2RkQxNDAzKSwgKDB4NzZDNjg4RDkpLCAoMHhCNDcxODZDQiksCisgICAgKDB4NUU5ODkzNkQpLCAoMHg5QkJGN0UyRSksICgweDhCN0ZCQ0VDKSwgKDB4OURBRjdFRjUpLCAoMHg3RTNBNzlGMSksCisgICAgKDB4OUM4OTZBQ0QpLCAoMHg2MjhGMjQ5QSksICgweERENkU1MUFGKSwgKDB4QUY3Mzk5NEIpLCAoMHg1OTY2OTk1RCksCisgICAgKDB4Qjc2MjA1OTcpLCAoMHgzNjlCMUU1NCksICgweDdDRURDNzg3KSwgKDB4RTdCMTVCMUYpLCAoMHhCMzZGNUY3RCksCisgICAgKDB4QjVCNzNFRjYpLCAoMHhENzZFRUVFMiksICgweDE0RTg2MTg2KSwgKDB4Q0MxNTkyOTEpLCAoMHg0RUM4NUNBMyksCisgICAgKDB4RUMzQzcwNEUpLCAoMHgwQjY2MzNCMyksICgweDREOTkyRDRCKSwgKDB4RUIxQjU3NzQpLCAoMHhERkI5RDUwOCksCisgICAgKDB4MTE3ODM3MTkpLCAoMHg3N0JCMTBCMCksICgweEZDREY4MzUwKSwgKDB4RDM0QTdDNjUpLCAoMHhFRjZFNTdCQiksCisgICAgKDB4RUNENTZDNjgpLCAoMHg4RUI3Q0EzNiksICgweDJGMjZCMTM2KSwgKDB4NTU2MzEyNjkpLCAoMHhFRjEyMTNFMSksCisgICAgKDB4QTU2QUI4NDQpLCAoMHhBQTRCMUQ2NCksICgweDY0MzQxRUE5KSwgKDB4MENFOURCNDgpLCAoMHg0NjBDMjE0NCksCisgICAgKDB4QURDNTAyMDUpLCAoMHg1MTVDNDcyRiksICgweDMwNEMyOUJEKSwgKDB4NzZBRjg3MTEpLCAoMHg1NTdDQURCNyksCisgICAgKDB4MkE5QkJDOEUpLCAoMHhFNTBFMTQ1QiksICgweDlDMjAzMUZEKSwgKDB4RDkxMjFBOEMpLCAoMHhGNTFBOTZGRCksCisgICAgKDB4NDVDQ0JFQkYpLCAoMHg1Rjg4NDg3MSksICgweDY2REFFMjkxKSwgKDB4OTVBREM5RTUpLCAoMHgzM0NGMzA0RCksCisgICAgKDB4MjNDODdEQ0UpLCAoMHhBNzAxNEZCMyksICgweEZCMzUxRTcxKSwgKDB4OEQ2MEY2NkYpLCAoMHhCRkQ2RERENSksCisgICAgKDB4MTUxRkU2RjEpLCAoMHhEQ0M3OTM1QSksICgweDBDQUNGQkYwKSwgKDB4RUU1NUEzNzEpLCAoMHhCRTQ2Qjc1NSksCisgICAgKDB4MEY3OURDRDIpLCAoMHgyM0RGRjc2RCksICgweDgzREU3NkQ3KSwgKDB4OEIwRTNBRUUpLCAoMHhCMDFCRkI0NCksCisgICAgKDB4NEUzNjE5RkEpLCAoMHhBMTlGOUU2NCksICgweEJENDkyQUQ5KSwgKDB4MDg5OUU0NUYpLCAoMHg4MTU2RTQxRCksCisgICAgKDB4NURBNTM5QkEpLCAoMHgwQUYzNUIyQyksICgweERCODlCQUFFKSwgKDB4QTEyOEM5NjYpLCAoMHhBMDJDRUFFRSksCisgICAgKDB4QzVBMUIyOTEpLCAoMHgwOENCQTkzRSksICgweDkwRkQ4ODdBKSwgKDB4NjAzMDQzODYpLCAoMHg2QTU5RjFFQSksCisgICAgKDB4QTQ2MUU2N0IpLCAoMHhDMTYyMkI3NiksICgweDZGQTJGOTA2KSwgKDB4QUEzQTQwMUEpLCAoMHhCNjhFQTQ3QiksCisgICAgKDB4QzYxN0E4ODkpLCAoMHg2MDI0QTU3QiksICgweDJERDUzNTU1KSwgKDB4RjFGRkVBMzApLCAoMHg4MTNBODA1MCksCisgICAgKDB4OEQxQTIxQjQpLCAoMHhGRkU3MkNGNyksICgweEEzNzQxNUUxKSwgKDB4MzBBMkM4MzApLCAoMHhBM0ExQ0EyOCksCisgICAgKDB4NEM1RTM1ODYpLCAoMHgzMDk4NjFCOSksICgweDFGNDk4NTBEKSwgKDB4NjE2NEM3NDgpLCAoMHg5RDcwNDhFNSksCisgICAgKDB4QzEyNDU2OUUpLCAoMHhDQ0IwRTExMSksICgweDE1QjJCQjg2KSwgKDB4MTgzNzFEOUMpLCAoMHhCMkFCRDk0RCksCisgICAgKDB4OEVDNjU2QjMpLCAoMHhCRjAxMDk5NSl9OwogCitzdGF0aWMgY29uc3QgSU5UIF9fdHdpZGRsZXNfbWlwc19mZnQzMl81MTJbXSA9IHsKKyAgICAoMHg3RkZGRkZGRiksICgweDAwMDAwMDAwKSwgKDB4N0ZGRDg4NTkpLCAoMHhGRTZERTJFMCksICgweDdGRjYyMTgxKSwKKyAgICAoMHhGQ0RCRDU0MCksICgweDdGRTlDQkJFKSwgKDB4RkI0OUU2QTMpLCAoMHg3RkQ4ODc4QyksICgweEY5QjgyNjgxKSwKKyAgICAoMHg3RkMyNTU5NSksICgweEY4MjZBNDY0KSwgKDB4N0ZBNzM2QjIpLCAoMHhGNjk1NkZCNyksICgweDdGODcyQkYyKSwKKyAgICAoMHhGNTA0OTgwMCksICgweDdGNjIzNjhEKSwgKDB4RjM3NDJDOUQpLCAoMHg3RjM4NTdGNCksICgweEYxRTQzRDFDKSwKKyAgICAoMHg3RjA5OTFDMyksICgweEYwNTREOERBKSwgKDB4N0VENUU1QzYpLCAoMHhFRUM2MEYzQyksICgweDdFOUQ1NUZCKSwKKyAgICAoMHhFRDM3RUY5MSksICgweDdFNUZFNDkwKSwgKDB4RUJBQTg5NDQpLCAoMHg3RTFEOTNFQSksICgweEVBMURFQkM2KSwKKyAgICAoMHg3REQ2NjY4RCksICgweEU4OTIyNjIxKSwgKDB4N0Q4QTVGM0MpLCAoMHhFNzA3NDdCOSksICgweDdEMzk4MEVEKSwKKyAgICAoMHhFNTdENUZFNCksICgweDdDRTNDRUIwKSwgKDB4RTNGNDdEOTUpLCAoMHg3Qzg5NEJEQSksICgweEUyNkNCMDEwKSwKKyAgICAoMHg3QzI5RkJFRiksICgweEUwRTYwNjhGKSwgKDB4N0JDNUUyOTYpLCAoMHhERjYwOTAwMiksICgweDdCNUQwM0ExKSwKKyAgICAoMHhERERDNUI0RiksICgweDdBRUY2MzI1KSwgKDB4REM1OTc3OEIpLCAoMHg3QTdEMDU1OSksICgweERBRDdGM0EyKSwKKyAgICAoMHg3QTA1RUVBOCksICgweEQ5NTdERTZGKSwgKDB4Nzk4QTIzQTgpLCAoMHhEN0Q5NDZDMyksICgweDc5MDlBOTM1KSwKKyAgICAoMHhENjVDM0I5OCksICgweDc4ODQ4NDE5KSwgKDB4RDRFMENCMjgpLCAoMHg3N0ZBQjk4QSksICgweEQzNjcwNDRGKSwKKyAgICAoMHg3NzZDNEVEOSksICgweEQxRUVGNTlEKSwgKDB4NzZEOTQ5ODMpLCAoMHhEMDc4QUQ5MyksICgweDc2NDFBRjMyKSwKKyAgICAoMHhDRjA0M0E5RSksICgweDc1QTU4NUQ5KSwgKDB4Q0Q5MUFCNTUpLCAoMHg3NTA0RDM0QyksICgweENDMjEwRDhCKSwKKyAgICAoMHg3NDVGOUREMyksICgweENBQjI2RkIyKSwgKDB4NzNCNUVCQ0YpLCAoMHhDOTQ1REZFQiksICgweDczMDdDM0M5KSwKKyAgICAoMHhDN0RCNkM0NSksICgweDcyNTUyQzc5KSwgKDB4QzY3MzIyQjkpLCAoMHg3MTlFMkNERSksICgweEM1MEQxMTY0KSwKKyAgICAoMHg3MEUyQ0JDRCksICgweEMzQTk0NUExKSwgKDB4NzAyMzEwOUMpLCAoMHhDMjQ3Q0Q2MiksICgweDZGNUYwMkNGKSwKKyAgICAoMHhDMEU4QjY3RSksICgweDZFOTZBOTk1KSwgKDB4QkY4QzBERDgpLCAoMHg2RENBMEQyNyksICgweEJFMzFFMUJGKSwKKyAgICAoMHg2Q0Y5MzRFOCksICgweEJDREEzRUFFKSwgKDB4NkMyNDI5NjkpLCAoMHhCQjg1MzJDMCksICgweDZCNEFGMjU4KSwKKyAgICAoMHhCQTMyQ0E0MiksICgweDZBNkQ5OEExKSwgKDB4QjhFMzEzMTgpLCAoMHg2OThDMjQ4NyksICgweEI3OTYxOUM2KSwKKyAgICAoMHg2OEE2OUU3MiksICgweEI2NEJFQUI5KSwgKDB4NjdCRDBGQ0MpLCAoMHhCNTA0OTM4MCksICgweDY2Q0Y4MTAzKSwKKyAgICAoMHhCM0MwMUZFOSksICgweDY1RERGQkQ2KSwgKDB4QjI3RTlENDMpLCAoMHg2NEU4ODk0QSksICgweEIxNDAxNzhDKSwKKyAgICAoMHg2M0VGMzI4NiksICgweEIwMDQ5QUE5KSwgKDB4NjJGMjAxQzQpLCAoMHhBRUNDMzM4QiksICgweDYxRjEwMDI3KSwKKyAgICAoMHhBRDk2RUQ3NyksICgweDYwRUMzODNBKSwgKDB4QUM2NEQ1MUYpLCAoMHg1RkUzQjM2NiksICgweEFCMzVGNThDKSwKKyAgICAoMHg1RUQ3N0M4NiksICgweEFBMEE1QjJDKSwgKDB4NURDNzlEOUMpLCAoMHhBOEUyMTEyQyksICgweDVDQjQyMENEKSwKKyAgICAoMHhBN0JEMjI5QSksICgweDVCOUQxMTY2KSwgKDB4QTY5QjlCN0QpLCAoMHg1QTgyNzk3OCksICgweEE1N0Q4NjQ2KSwKKyAgICAoMHg1OTY0NjQ5QiksICgweEE0NjJFRUIyKSwgKDB4NTg0MkREN0UpLCAoMHhBMzRCREY0QiksICgweDU3MURFRUVEKSwKKyAgICAoMHhBMjM4NjI3QiksICgweDU1RjVBNEVEKSwgKDB4QTEyODgzOTEpLCAoMHg1NENBMEEyRSksICgweEEwMUM0QzVDKSwKKyAgICAoMHg1MzlCMkFGQiksICgweDlGMTNDN0RDKSwgKDB4NTI2OTEyNDEpLCAoMHg5RTBFRkY5RCksICgweDUxMzNDQzhGKSwKKyAgICAoMHg5RDBERkU1MiksICgweDRGRkI2NTcyKSwgKDB4OUMxMENEOTApLCAoMHg0RUJGRTg4RiksICgweDlCMTc3NkNCKSwKKyAgICAoMHg0RDgxNjJEOCksICgweDlBMjIwNDNGKSwgKDB4NEMzRkRGQ0MpLCAoMHg5OTMwN0VDNSksICgweDRBRkI2QzlCKSwKKyAgICAoMHg5ODQyRjA0OCksICgweDQ5QjQxNTYyKSwgKDB4OTc1OTYxQTIpLCAoMHg0ODY5RTY1NyksICgweDk2NzNEQjhDKSwKKyAgICAoMHg0NzFDRUQwNSksICgweDk1OTI2NzcyKSwgKDB4NDVDRDM1NkYpLCAoMHg5NEI1MEQ3NCksICgweDQ0N0FDRDVEKSwKKyAgICAoMHg5M0RCRDZBQSksICgweDQzMjVDMTAyKSwgKDB4OTMwNkNBRTcpLCAoMHg0MUNFMUVDRCksICgweDkyMzVGMzJDKSwKKyAgICAoMHg0MDczRjI0NSksICgweDkxNjk1NjdEKSwgKDB4M0YxNzQ5OUYpLCAoMHg5MEEwRkQ0MiksICgweDNEQjgzMjRDKSwKKyAgICAoMHg4RkRDRUYzNyksICgweDNDNTZCQUI1KSwgKDB4OEYxRDM0NjEpLCAoMHgzQUYyRUVCQSksICgweDhFNjFEMzMxKSwKKyAgICAoMHgzOThDRENGMyksICgweDhEQUFEMzVEKSwgKDB4MzgyNDk0MTMpLCAoMHg4Q0Y4M0M2MiksICgweDM2QkEyMDM0KSwKKyAgICAoMHg4QzRBMTQ0MCksICgweDM1NEQ5MDMzKSwgKDB4OEJBMDYyMjEpLCAoMHgzM0RFRjIxRiksICgweDhBRkIyQzhFKSwKKyAgICAoMHgzMjZFNTUwNSksICgweDhBNUE3QTREKSwgKDB4MzBGQkM1NDcpLCAoMHg4OUJFNTBDMiksICgweDJGODc1MjE2KSwKKyAgICAoMHg4OTI2QjY1QSksICgweDJFMTEwQUJGKSwgKDB4ODg5M0IxNEEpLCAoMHgyQzk4RkJEMSksICgweDg4MDU0NjgyKSwKKyAgICAoMHgyQjFGMzRCQyksICgweDg3N0I3QkREKSwgKDB4MjlBM0M0MEYpLCAoMHg4NkY2NTZBQyksICgweDI4MjZCOTVFKSwKKyAgICAoMHg4Njc1REM2MiksICgweDI2QTgyMTc0KSwgKDB4ODVGQTExNEYpLCAoMHgyNTI4MEMwNSksICgweDg1ODJGQThDKSwKKyAgICAoMHgyM0E2ODhEMyksICgweDg1MTA5Q0Y3KSwgKDB4MjIyM0E0RDIpLCAoMHg4NEEyRkM2OCksICgweDIwOUY2RkUxKSwKKyAgICAoMHg4NDNBMUQ2MiksICgweDFGMTlGOUYwKSwgKDB4ODNENjA0MzEpLCAoMHgxRDkzNTAxMSksICgweDgzNzZCNDJFKSwKKyAgICAoMHgxQzBCODI0RSksICgweDgzMUMzMTRBKSwgKDB4MUE4MjlGQzApLCAoMHg4MkM2N0YwMCksICgweDE4RjhCODg4KSwKKyAgICAoMHg4Mjc1QTBEMSksICgweDE3NkREOUUxKSwgKDB4ODIyOTk5NzQpLCAoMHgxNUUyMTNGRCksICgweDgxRTI2QzBCKSwKKyAgICAoMHgxNDU1NzcxRCksICgweDgxQTAxQjgwKSwgKDB4MTJDODEwOTApLCAoMHg4MTYyQUEwQSksICgweDExMzlGMEE3KSwKKyAgICAoMHg4MTJBMUEzNiksICgweDBGQUIyNkI5KSwgKDB4ODBGNjZFMzApLCAoMHgwRTFCQzMyNiksICgweDgwQzdBODEzKSwKKyAgICAoMHgwQzhCRDM1NiksICgweDgwOURDOTcxKSwgKDB4MEFGQjY3QjIpLCAoMHg4MDc4RDQwNyksICgweDA5NkE5MEFCKSwKKyAgICAoMHg4MDU4Qzk1NSksICgweDA3RDk1QkI2KSwgKDB4ODAzREFBNkQpLCAoMHgwNjQ3RDk0OSksICgweDgwMjc3ODcxKSwKKyAgICAoMHgwNEI2MThERiksICgweDgwMTYzNDNEKSwgKDB4MDMyNDJBRjYpLCAoMHg4MDA5REU4MSksICgweDAxOTIxRDBDKSwKKyAgICAoMHg4MDAyNzdBNyksICgweEZGRkZGRkEzKSwgKDB4ODAwMDAwMDIpLCAoMHhGRTZERTMzOCksICgweDgwMDI3N0E2KSwKKyAgICAoMHhGQ0RCRDU0RSksICgweDgwMDlERTdGKSwgKDB4RkI0OUU2NjUpLCAoMHg4MDE2MzQ0NCksICgweEY5QjgyNkZCKSwKKyAgICAoMHg4MDI3Nzg2RSksICgweEY4MjZBNDhFKSwgKDB4ODAzREFBNjkpLCAoMHhGNjk1NkY5OSksICgweDgwNThDOTUwKSwKKyAgICAoMHhGNTA0OTc5MyksICgweDgwNzhENDE4KSwgKDB4RjM3NDJDRUUpLCAoMHg4MDlEQzk2QiksICgweEYxRTQzRDFFKSwKKyAgICAoMHg4MEM3QTgwQyksICgweEYwNTREODhEKSwgKDB4ODBGNjZFNDcpLCAoMHhFRUM2MEY5RCksICgweDgxMkExQTJEKSwKKyAgICAoMHhFRDM3RUZCMyksICgweDgxNjJBQTAwKSwgKDB4RUJBQTg5MjcpLCAoMHg4MUEwMUI3NSksICgweEVBMURFQjRBKSwKKyAgICAoMHg4MUUyNkMyQyksICgweEU4OTIyNjYyKSwgKDB4ODIyOTk5NjcpLCAoMHhFNzA3NDdCQiksICgweDgyNzVBMEMzKSwKKyAgICAoMHhFNTdENUY4OSksICgweDgyQzY3RjI3KSwgKDB4RTNGNDdERjUpLCAoMHg4MzFDMzEzQiksICgweEUyNkNCMDMxKSwKKyAgICAoMHg4Mzc2QjQxRSksICgweEUwRTYwNjUzKSwgKDB4ODNENjA0MjApLCAoMHhERjYwOEY2OSksICgweDg0M0ExRDkyKSwKKyAgICAoMHhERERDNUI2RiksICgweDg0QTJGQzU1KSwgKDB4REM1OTc3NkUpLCAoMHg4NTEwOUNFNCksICgweERBRDdGMzQ4KSwKKyAgICAoMHg4NTgyRkFDMiksICgweEQ5NTdERUNEKSwgKDB4ODVGQTExM0EpLCAoMHhEN0Q5NDZFMyksICgweDg2NzVEQzREKSwKKyAgICAoMHhENjVDM0I0MCksICgweDg2RjY1NkU5KSwgKDB4RDRFMENCODQpLCAoMHg4NzdCN0JDNiksICgweEQzNjcwNDZGKSwKKyAgICAoMHg4ODA1NDY2QSksICgweEQxRUVGNTgxKSwgKDB4ODg5M0IxMzIpLCAoMHhEMDc4QUQzQyksICgweDg5MjZCNkEwKSwKKyAgICAoMHhDRjA0M0FGOCksICgweDg5QkU1MEE4KSwgKDB4Q0Q5MUFCMzkpLCAoMHg4QTVBN0EzMiksICgweENDMjEwRDM1KSwKKyAgICAoMHg4QUZCMkNEQiksICgweENBQjI3MDBCKSwgKDB4OEJBMDYyMDQpLCAoMHhDOTQ1RTAwQSksICgweDhDNEExNDIzKSwKKyAgICAoMHhDN0RCNkMyQSksICgweDhDRjgzQzQ0KSwgKDB4QzY3MzIyNjUpLCAoMHg4REFBRDNCMiksICgweEM1MEQxMDlGKSwKKyAgICAoMHg4RTYxRDM4OCksICgweEMzQTk0NjY5KSwgKDB4OEYxRDMzQzgpLCAoMHhDMjQ3Q0RGMCksICgweDhGRENFRjE2KSwKKyAgICAoMHhDMEU4QjY5QyksICgweDkwQTBGRDIxKSwgKDB4QkY4QzBERjYpLCAoMHg5MTY5NTY1QSksICgweEJFMzFFMTZFKSwKKyAgICAoMHg5MjM1RjMwOSksICgweEJDREEzRTVFKSwgKDB4OTMwNkNCNDkpLCAoMHhCQjg1MzIwNSksICgweDkzREJENzBFKSwKKyAgICAoMHhCQTMyQ0IzNSksICgweDk0QjUwRDA5KSwgKDB4QjhFMzEzOUUpLCAoMHg5NTkyNjcwNSksICgweEI3OTYxOUUyKSwKKyAgICAoMHg5NjczREI2NiksICgweEI2NEJFQUQ1KSwgKDB4OTc1OTYxN0IpLCAoMHhCNTA0OTMzNCksICgweDk4NDJGMDZCKSwKKyAgICAoMHhCM0MwMUY5RCksICgweDk5MzA3RjM1KSwgKDB4QjI3RTlDOTIpLCAoMHg5QTIyMDRCMCksICgweEIxNDAxODBDKSwKKyAgICAoMHg5QjE3NzY1MiksICgweEIwMDQ5QjI3KSwgKDB4OUMxMENEMTUpLCAoMHhBRUNDMzNBNSksICgweDlEMERGRTI3KSwKKyAgICAoMHhBRDk2RUQ5MSksICgweDlFMEVGRkMzKSwgKDB4QUM2NEQ0RDgpLCAoMHg5RjEzQzgwMyksICgweEFCMzVGNTQ1KSwKKyAgICAoMHhBMDFDNENEOCksICgweEFBMEE1QTg4KSwgKDB4QTEyODg0MEYpLCAoMHhBOEUyMTFBMiksICgweEEyMzg2MUY1KSwKKyAgICAoMHhBN0JEMjMxMCksICgweEEzNEJERUMzKSwgKDB4QTY5QjlCOTYpLCAoMHhBNDYyRUU4MiksICgweEE1N0Q4NjVFKSwKKyAgICAoMHhBNTdEODY3MCksICgweEE0NjJFRTcwKSwgKDB4QTY5QjlCQTgpLCAoMHhBMzRCREVCMiksICgweEE3QkQyMzIyKSwKKyAgICAoMHhBMjM4NjFFNCksICgweEE4RTIxMUI1KSwgKDB4QTEyODgzRkUpLCAoMHhBQTBBNUE5QiksICgweEEwMUM0Q0M3KSwKKyAgICAoMHhBQjM1RjU1OSksICgweDlGMTNDN0YyKSwgKDB4QUM2NEQ0RUIpLCAoMHg5RTBFRkZCMyksICgweEFEOTZFREE1KSwKKyAgICAoMHg5RDBERkUxNiksICgweEFFQ0MzM0I5KSwgKDB4OUMxMENEMDUpLCAoMHhCMDA0OUIzQiksICgweDlCMTc3NjQyKSwKKyAgICAoMHhCMTQwMTgyMCksICgweDlBMjIwNEExKSwgKDB4QjI3RTlDQTYpLCAoMHg5OTMwN0YyNiksICgweEIzQzAxRkIyKSwKKyAgICAoMHg5ODQyRjA1QyksICgweEI1MDQ5MzQ5KSwgKDB4OTc1OTYxNkMpLCAoMHhCNjRCRUFFQSksICgweDk2NzNEQjU3KSwKKyAgICAoMHhCNzk2MTlGNyksICgweDk1OTI2NkY3KSwgKDB4QjhFMzEzQjQpLCAoMHg5NEI1MEUxMyksICgweEJBMzJDOTlFKSwKKyAgICAoMHg5M0RCRDcwMCksICgweEJCODUzMjFBKSwgKDB4OTMwNkNCM0MpLCAoMHhCQ0RBM0U3NCksICgweDkyMzVGMkZDKSwKKyAgICAoMHhCRTMxRTE4NCksICgweDkxNjk1NjREKSwgKDB4QkY4QzBFMEMpLCAoMHg5MEEwRkQxNCksICgweEMwRThCNkIyKSwKKyAgICAoMHg4RkRDRUYwOSksICgweEMyNDdDRTA3KSwgKDB4OEYxRDM0QUQpLCAoMHhDM0E5NDRCQyksICgweDhFNjFEMzdDKSwKKyAgICAoMHhDNTBEMTBCNiksICgweDhEQUFEM0E2KSwgKDB4QzY3MzIyN0MpLCAoMHg4Q0Y4M0MzOSksICgweEM3REI2QzQxKSwKKyAgICAoMHg4QzRBMTQxOCksICgweEM5NDVFMDIxKSwgKDB4OEJBMDYxRjkpLCAoMHhDQUIyNzAyMiksICgweDhBRkIyQzY4KSwKKyAgICAoMHhDQzIxMEUzNyksICgweDhBNUE3QThEKSwgKDB4Q0Q5MUFBNjYpLCAoMHg4OUJFNTEwMCksICgweENGMDQzQTI0KSwKKyAgICAoMHg4OTI2QjY5NyksICgweEQwNzhBRDUzKSwgKDB4ODg5M0IxMjgpLCAoMHhEMUVFRjU5OSksICgweDg4MDU0NjYxKSwKKyAgICAoMHhEMzY3MDQ4NyksICgweDg3N0I3QkJEKSwgKDB4RDRFMENCOUMpLCAoMHg4NkY2NTY4RSksICgweEQ2NUMzQzRBKSwKKyAgICAoMHg4Njc1REM5NSksICgweEQ3RDk0NjA4KSwgKDB4ODVGQTExODApLCAoMHhEOTU3RERGMSksICgweDg1ODJGQUJCKSwKKyAgICAoMHhEQUQ3RjM2MCksICgweDg1MTA5Q0REKSwgKDB4REM1OTc3ODcpLCAoMHg4NEEyRkM0RiksICgweEREREM1Qjg4KSwKKyAgICAoMHg4NDNBMUQ0QiksICgweERGNjA5MDdBKSwgKDB4ODNENjAzREMpLCAoMHhFMEU2MDc2NCksICgweDgzNzZCNDU0KSwKKyAgICAoMHhFMjZDQUY1MSksICgweDgzMUMzMTZEKSwgKDB4RTNGNDdEMTQpLCAoMHg4MkM2N0YyMSksICgweEU1N0Q1RkEyKSwKKyAgICAoMHg4Mjc1QTBCRSksICgweEU3MDc0N0Q0KSwgKDB4ODIyOTk5NjIpLCAoMHhFODkyMjY3QyksICgweDgxRTI2QkZCKSwKKyAgICAoMHhFQTFERUM1RiksICgweDgxQTAxQjQ4KSwgKDB4RUJBQThBM0QpLCAoMHg4MTYyQUEyMiksICgweEVEMzdFRUNGKSwKKyAgICAoMHg4MTJBMUE0QyksICgweEVFQzYwRUI5KSwgKDB4ODBGNjZFNDQpLCAoMHhGMDU0RDhBNiksICgweDgwQzdBODA5KSwKKyAgICAoMHhGMUU0M0QzOCksICgweDgwOURDOTY4KSwgKDB4RjM3NDJEMDgpLCAoMHg4MDc4RDNGRiksICgweEY1MDQ5OEFCKSwKKyAgICAoMHg4MDU4QzkzQiksICgweEY2OTU3MEIyKSwgKDB4ODAzREFBNzcpLCAoMHhGODI2QTNBOCksICgweDgwMjc3ODc5KSwKKyAgICAoMHhGOUI4MjYxNSksICgweDgwMTYzNDQzKSwgKDB4RkI0OUU2N0YpLCAoMHg4MDA5REU3RSksICgweEZDREJENTY4KSwKKyAgICAoMHg4MDAyNzdBNiksICgweEZFNkRFMzUyKSwgKDB4NDY1MjIwQkIpLCAoMHhDNjZFMUZGQyksICgweDJDNjFEMzU2KSwKKyAgICAoMHhBRkZCMTc2RCksICgweDg4MDY3RTIzKSwgKDB4Mzc5NkYwMDgpLCAoMHhDOEQxMjhGMyksICgweEI2NjFBNUZBKSwKKyAgICAoMHhGMTlDRTRGMCksICgweDNGN0QwMzQ1KSwgKDB4RTk3RTYwMzApLCAoMHg0QUJBOTFDRiksICgweERFRURBQjBDKSwKKyAgICAoMHgzNUZEMUQ3NyksICgweERENjM2NDM5KSwgKDB4MkY4Qjc5NEMpLCAoMHg3NjRFMUQzMiksICgweDdBOEQwQjFCKSwKKyAgICAoMHg4RUFDQjI3RiksICgweDU3N0FENjdCKSwgKDB4MkIzRkUyQzUpLCAoMHg4QUNEMDI0QSksICgweEVERjVDNDJDKSwKKyAgICAoMHhGMUNBOTUxQyksICgweEI5OEI2RDA0KSwgKDB4NkQxMkI4NjQpLCAoMHg1MEU3NEQwOCksICgweDczRDE1MDNCKSwKKyAgICAoMHhDN0QzRjZBOSksICgweDFGMzY1RTk3KSwgKDB4RTEzNDBFNTkpLCAoMHg4OUQyMUI5RCksICgweDlCNzU2NzMzKSwKKyAgICAoMHg5MDI0Q0Q1MCksICgweEUyQzdGRjUyKSwgKDB4RDlGMDYxRUYpLCAoMHg3NzE1MTM5MiksICgweEEwRTRBMDA0KSwKKyAgICAoMHg2MEJFODIwRiksICgweEM3NjAzQkFGKSwgKDB4QTYyRTNEQTkpLCAoMHhBNDAwRTExRiksICgweDE1NTExMUQ0KSwKKyAgICAoMHg5MDMwQTM3NCksICgweDE0MTg1MTI0KSwgKDB4OEQwNDNBMDApLCAoMHg1MDk0NTI1OCksICgweDIwQTY2NTNFKSwKKyAgICAoMHhBMTlCQThCOSksICgweDNDRkJFNjkyKSwgKDB4OTE0NzFEOTgpLCAoMHgwQjlEMDNGRiksICgweEE1QkE4RTI5KSwKKyAgICAoMHhGRkM4RUIyMiksICgweDE0MkNCMUIwKSwgKDB4NTUzMTczMTkpLCAoMHgzM0FEQzc3QyksICgweEY2OUJBRENFKSwKKyAgICAoMHg3ODQyM0QzQyksICgweEJFNjdCQkYwKSwgKDB4N0Q4OEJEMTUpLCAoMHgxRTlFRjY3MyksICgweDUxMjA5OEIzKSwKKyAgICAoMHgzMjZBM0QzRCksICgweDE2MUVGM0I2KSwgKDB4MEU0QzRFRDUpLCAoMHg0RTlGOTk4MiksICgweEQwQUI2QTM2KSwKKyAgICAoMHhGMTdERDM3NyksICgweDVFNTNGMzFDKSwgKDB4QkU5MTEyRUEpLCAoMHgzREUxQjBGRiksICgweEQ3RjM5QUU3KSwKKyAgICAoMHhBMzRCOTYzNSksICgweDQ5Q0ZFRTZDKSwgKDB4OEEwNjNBQzYpLCAoMHhCQTc5QkMwRCksICgweDZBNTg4NzgyKSwKKyAgICAoMHg0MzlCRTU5MyksICgweDBBNUY3RThEKSwgKDB4RDJGQzI1NjEpLCAoMHg0Njk4QUM4RiksICgweDI0N0MzQkMyKSwKKyAgICAoMHg1ODI2NTIzRCksICgweDREMkJENzUzKSwgKDB4NEI4QkNDMTcpLCAoMHg5Qjc0MzUwMyksICgweDlGODRFNDM0KSwKKyAgICAoMHg4Qjk3QjQxQSksICgweDNDRkNFNzVGKSwgKDB4MzJEMkQ0ODcpLCAoMHgzRTgwQjRBRiksICgweDQyRjhCMEVBKSwKKyAgICAoMHhFQzBDODFFRSksICgweDE3Mjc5MzA5KSwgKDB4NjgxRkEwRjMpLCAoMHg4QkFEMjA4RSksICgweEQxMTc5MkM2KSwKKyAgICAoMHhGMUZGMDdCMyksICgweDIxMzM4MDUwKSwgKDB4OEExQTIxQTQpLCAoMHhGRjAzNThEOCksICgweDQxNkMxM0MxKSwKKyAgICAoMHg0NjM0ODg1OCksICgweDgzODIwNTE5KSwgKDB4QUJDMDg4MjIpLCAoMHg2QTFBNTIwMCksICgweDBDODMxMjJBKSwKKyAgICAoMHhBNjdGREYwNiksICgweDA2MjlGOTcwKSwgKDB4RUZBQTI3NDMpLCAoMHgwQzAwQUQ5NSksICgweEZGMDlGNUNGKSwKKyAgICAoMHhDNzg0REI4QiksICgweENCMDBCQTdEKSwgKDB4NjIyMDkwOUYpLCAoMHg3MTQ5QjdERiksICgweDVCRDNFQkVDKSwKKyAgICAoMHgwNDg1RUY3MSksICgweDA3RkUyM0IxKSwgKDB4ODA3Mzc2NjgpLCAoMHg0MkEzMjY0NSksICgweEQ2RURCQjE4KSwKKyAgICAoMHg0MDdFNzJDNSksICgweDkwMTQwMkUwKSwgKDB4MEMxQjc5MDUpLCAoMHgwMUNFMTFGQyksICgweDAwQzY0OTE0KSwKKyAgICAoMHgzMDM3OTc4QSksICgweEZBQkM5MTkwKSwgKDB4NDNBMEFDODkpLCAoMHhCOTk5ODM3MCksICgweEQ2RDY5MjA5KSwKKyAgICAoMHhGMTMyNDU1RSksICgweDlEQUZGNDgyKSwgKDB4QTJENjM1QzIpLCAoMHhCRDk3NkI1RSksICgweDc5RUQ5M0VEKSwKKyAgICAoMHg3RDQyQ0EyMiksICgweDJFMjNGOUMxKSwgKDB4Q0YwRTc1MjEpLCAoMHg5NkQ4OEFDMSksICgweDQyMEMyODQ1KSwKKyAgICAoMHgxRTE5NTczRCksICgweEY4RkU5Mjc5KSwgKDB4QzE0OTUxMDApLCAoMHgyMDEyNDlDMiksICgweDhCMTgzNzIzKSwKKyAgICAoMHg0NTA2MTVBNSksICgweDAwNEMwMTEyKSwgKDB4ODVFQjUyMzUpLCAoMHgxQkQ4QkQ0OCksICgweEEyOTE0RjAzKSwKKyAgICAoMHg1MTQyMEVBQyksICgweENFNzg4NDcwKSwgKDB4MDUwODAzMEIpLCAoMHhBNENEMkE2QyksICgweDk2MjZDMDYyKSwKKyAgICAoMHhGODhEMkRFNSksICgweEE5RDZCMzk5KSwgKDB4QjNDNTdCRkQpLCAoMHhDQjFFOUM0QyksICgweDAwNEE1MDk0KSwKKyAgICAoMHhEMENCQzQyQSksICgweDNCRTFBNjk0KSwgKDB4M0MzNTNGQTcpLCAoMHhBNTY5N0M1NyksICgweEZFOTYxNjY1KSwKKyAgICAoMHhFRDZCN0M3RCksICgweDQzM0RDRjhEKSwgKDB4REE3RDZDMjQpLCAoMHg0MDcxMTJDMSksICgweDRCOUQyODVEKSwKKyAgICAoMHg2QzlBMkY1NyksICgweDFCRjlGQUVGKSwgKDB4NEVFM0UyRTkpLCAoMHhFNUFFN0U5MiksICgweDYwQTExRDNGKSwKKyAgICAoMHg0QjQ0MUI2MyksICgweEM4NDE5QkIxKSwgKDB4MkM0RjZEREQpLCAoMHhDRUMzQ0Y2RCksICgweDMyNUE2NUNBKSwKKyAgICAoMHg4MThGQzZBNCksICgweEM1NUU1RTVCKSwgKDB4Mjc3NDQ1QTMpLCAoMHg2QjMyODlGNyksICgweDA5MTQ3RDU1KSwKKyAgICAoMHg0RjM3OEQ1MyksICgweDU4OEIwREM4KSwgKDB4RjcwQkEzNDcpLCAoMHhDQkM0M0ZBRSksICgweEQ5OEU2NjM5KSwKKyAgICAoMHgwN0FGOUVEMCksICgweEUyRTYzMDVBKSwgKDB4NUUwMDM1NzEpLCAoMHgxODUyM0U3QSksICgweEY3MEQxRTI3KSwKKyAgICAoMHhENzI4ODk1MCksICgweDEyQzExMTMyKSwgKDB4RkYxQzlEMTcpLCAoMHgzMTgwNTBGMSksICgweDFBMjE5ODIxKSwKKyAgICAoMHhCRjIxOTk4QSksICgweDZDMTNDMUZGKSwgKDB4OEM2MDU4NjEpLCAoMHgwQTE4Mzk1NCksICgweDdCRTRDMUI2KSwKKyAgICAoMHhBMkNCQzQxMCksICgweDdDQzAwQTU1KSwgKDB4NUU1OEE5NzMpLCAoMHgxMTIyRUY4NiksICgweDgwNTY4RTM5KSwKKyAgICAoMHgyMzEwQzMwMCksICgweDBFMTUyRDBFKSwgKDB4OUUwMTdDMUMpLCAoMHg4NTFERkMyNiksICgweEQxQjFFNjYyKSwKKyAgICAoMHg4MUJBMTBCMCksICgweDk2QzJFOTc3KSwgKDB4ODY4OEU0MTkpLCAoMHg5N0M5NDk4OSksICgweDI1MEQ1MzVFKSwKKyAgICAoMHgzNUZERTczMiksICgweDE0N0FEMTgzKSwgKDB4Q0Y5RDc1QzApLCAoMHg2QjJDMTgzQyksICgweDFEMzI2NDg5KSwKKyAgICAoMHhDMDgwN0Q5OCksICgweEMwODE2MjJFKSwgKDB4MTVDODdCODcpLCAoMHg3NDA0NTk4QyksICgweEZDM0M3RkE2KSwKKyAgICAoMHgyOEJBOENGNSksICgweEUzMTFFQTlCKSwgKDB4RUFCRkQ0QTUpLCAoMHg4NzY4ODM0QSksICgweDBGN0Q3NDQwKSwKKyAgICAoMHg0MDU5MzE1MiksICgweENGMUU4QkY1KSwgKDB4RTMyMDE3QjYpLCAoMHgzOUU2NjA3MCksICgweDU2MEVDRTlEKSwKKyAgICAoMHhGNDEzMkM3NyksICgweDcyMjk0NUMxKSwgKDB4OTZFQ0I1RDUpLCAoMHgwQzEwMEMwNiksICgweDMwRTk2QzAyKSwKKyAgICAoMHhFMEIwMTU5QiksICgweDE2M0E0MENCKSwgKDB4MUIyOEI3NTApLCAoMHgxMTQyMEUxMSksICgweDM0REM1OTgxKSwKKyAgICAoMHhEMjc2OUMzQyksICgweDU2OTQwMkQwKSwgKDB4RTRGMTU3QzApLCAoMHgxMjBERjI0QyksICgweDQwRDg2MTUzKSwKKyAgICAoMHgxOTQyQ0QxMSksICgweDIyNDg0QzNCKSwgKDB4OEIyOTkxNDQpLCAoMHg1OEYxQUFGOCksICgweEIyQ0Q0Nzc3KSwKKyAgICAoMHg0QTUzQUIwMiksICgweDU1QTVEQUQ0KSwgKDB4QzhENThENzkpLCAoMHg2Q0FFQzAxMSksICgweDFDOTU1Qzg0KSwKKyAgICAoMHhERTA4QTZDNiksICgweEQ0MDJBRjdEKSwgKDB4Njk1RTZGQTQpLCAoMHg0REE4NjNCOSksICgweDUxMTgwNzBDKSwKKyAgICAoMHg1QTk3RUYxQyksICgweDg4ODBCMzg4KSwgKDB4NEQ1OTZCMkQpLCAoMHgzN0Q3NERDRiksICgweDU4MTM4QjM4KSwKKyAgICAoMHg1QjdCQ0Q0RSksICgweEFFNkM0NDIyKSwgKDB4NEU1RDFBRjEpLCAoMHhERTczOTZBNSksICgweEI0NDJGMjE3KSwKKyAgICAoMHgwREY3QTAwNiksICgweDk2RUVGOEEyKSwgKDB4RTI4NDdCMjYpLCAoMHg2OEI5RjY3QiksICgweDhGRTFGQTY1KSwKKyAgICAoMHhFMEE4N0U1NiksICgweDFCRThGQzRDKSwgKDB4QkJENjVGOUQpLCAoMHhFNkYwMkM5RCksICgweDg2N0M2RUVDKSwKKyAgICAoMHg0M0ZBQjcyNSksICgweEE0MTQ0NDE5KSwgKDB4NjlCQjZBQUYpLCAoMHhDRTI3Qjc0NCksICgweDAyMjI0MUE5KSwKKyAgICAoMHhDMDVERjE0RSksICgweDgwNTBGMUZGKSwgKDB4MjE4QzIxMzEpLCAoMHhCRTI1OTQxQSksICgweDkwNDFDRDA2KSwKKyAgICAoMHgxRUU4QTlDMCksICgweEQ1MzBGRUREKSwgKDB4NzQ5NUM4MDgpLCAoMHgwNTA5MThBNiksICgweDNDRTczMkU5KSwKKyAgICAoMHhGODcyNjJGQyksICgweDAxQjgxMkYxKSwgKDB4MUZCQTQ4NDIpLCAoMHgzRTg2QzdGMiksICgweDI3MERCMzU4KSwKKyAgICAoMHhGOUQyMjgzNCksICgweDc0RDRGNDY5KSwgKDB4OUE2RTg3RDIpLCAoMHg4Q0JCMEE1MCksICgweEMwNzg0QjkyKSwKKyAgICAoMHgyNzhEQTU4MSksICgweDkyMjFBN0Q1KSwgKDB4REU4MDFCNTQpLCAoMHg0QjUzMUZEQSksICgweEM4QjkxRjkxKSwKKyAgICAoMHg3QTkwREE0MCksICgweDI5NjdBNDI5KSwgKDB4NTBDQzFEOEQpLCAoMHg5QUU5MTEwRSksICgweDUwRjI1MEVFKSwKKyAgICAoMHhENjk1QjA3MiksICgweEZDN0E1NzE4KSwgKDB4MUYxQTI2RTYpLCAoMHg3RDVBREQ0RCksICgweEM4OTc4NTk3KSwKKyAgICAoMHhFQjMyNkRDMyksICgweDM4NEU5ODI0KSwgKDB4QzNCOUQ3OEMpLCAoMHhEOEQyRTIxNCksICgweEVGRkJCMDQ4KSwKKyAgICAoMHgwMEFCNzcxNCksICgweDlEODlDQTEzKSwgKDB4RjcwNjg4RDApLCAoMHhBRERBM0EzNyksICgweDVGQkU1OTQzKSwKKyAgICAoMHg0RUQ5RDYxMyksICgweDhBOURDQzkzKSwgKDB4MTk4MTQyMzYpLCAoMHgwOUE2OEJDQyksICgweENFQUMzM0FDKSwKKyAgICAoMHgwQkE3MEJCMyksICgweDMyNjI3MkUxKSwgKDB4MkE4QzZEMjApLCAoMHgyMzA4M0QwQiksICgweEZBODA5QzAyKSwKKyAgICAoMHg1ODI1QzZDMiksICgweDA2MUI0Njk1KSwgKDB4OERCOTc3NDgpLCAoMHg1MDcxRTU4NCksICgweDA4NzYwOTU5KSwKKyAgICAoMHg0NEVBOEQwNCksICgweDVDRTZFMkFBKSwgKDB4MDA5QUQxNzYpLCAoMHhBRUM2NEYxOSksICgweENBRERBNjMyKSwKKyAgICAoMHg4RDc5NTQ0NSksICgweDE2RTNFQTI0KSwgKDB4RjEyNjQ4Q0EpLCAoMHhENUNDMzUwQyksICgweDYxNUVCQUQ3KSwKKyAgICAoMHg0RTc2OUZCNiksICgweDZDNUVCMzgwKSwgKDB4NUJCNDY0MjUpLCAoMHhFQUI2Qzc3QyksICgweDEwOTQ1NDA4KSwKKyAgICAoMHhDMTI5MUI4NiksICgweDkxM0I3MUE1KSwgKDB4MDAzQkEzMjkpLCAoMHg5MTgxMjg1NCksICgweEUyMDBDQjEyKSwKKyAgICAoMHg3QTQ2OTZBOCksICgweDc2RTU1RDI1KSwgKDB4RDZEM0M1NzcpLCAoMHg4QjFCNzlCMSksICgweDI5NkIwNENEKSwKKyAgICAoMHhBMDI0Q0MzNSksICgweDMzNDFBNDc3KSwgKDB4OEVDMTIzNTgpLCAoMHhGNTk4MkIyRiksICgweDM2RjEyMEM5KSwKKyAgICAoMHg3OURCRTc5OSksICgweEVENzRGMDkyKSwgKDB4QTEwMzFBRTMpLCAoMHhCMkQ5OEM2QiksICgweDM1OENBQjczKSwKKyAgICAoMHg0MTE1M0MxOSksICgweDQ3NEQ0NTQ4KSwgKDB4QTdFODM0QTkpLCAoMHg5OTk3MzhBRSksICgweDUwRjFGRkU4KSwKKyAgICAoMHg4ODYxMkY4MCksICgweEZEOTMxQTIxKSwgKDB4MjM4MzlBQkQpLCAoMHhCRTYwNDcwMSksICgweDgxMjI3NEI5KSwKKyAgICAoMHg0Q0E5RUEzMiksICgweEU1RjJEMjA3KSwgKDB4QzFDRjQ2NTMpLCAoMHg0MzU2MUIyMyksICgweDUzQjJFMjc3KSwKKyAgICAoMHg0RjJCMDBFQyksICgweEYyQjNCQTgwKSwgKDB4RkM3MDhDQzUpLCAoMHhFN0Y2M0YwMCksICgweDI2MTIwMzQyKSwKKyAgICAoMHgxQTQ5QzdBOCksICgweEE5MzUwQTdDKSwgKDB4RTUzMEEwNkMpLCAoMHg1Q0I5RTU1MCksICgweEIxNjcyOTEzKSwKKyAgICAoMHg2NUZBNzZGOSksICgweEM5RjkyRENBKSwgKDB4N0Q0RTkxOTUpLCAoMHg0REJCODI2NSksICgweDIwMzZFMjZDKSwKKyAgICAoMHhFREMwMjZFNiksICgweEI5QTYxN0UwKSwgKDB4NjQ2OUYwRUUpLCAoMHhFOURBQUJCMiksICgweDI2MDYzMjEwKSwKKyAgICAoMHhBQzU0NURGNCksICgweDEzNEUwMzVBKSwgKDB4MjE2RURFMTApLCAoMHhFQzgxMTU4RCksICgweDEyMkEyQ0FFKSwKKyAgICAoMHhBMjYzRDBFMSksICgweDZDQTFGQjI4KSwgKDB4QkUyODdERjApLCAoMHg1NDgxMDRFOCksICgweDM1OTg3RDkzKSwKKyAgICAoMHhCQzNFNTQ5QyksICgweDNBQ0VGRDY0KSwgKDB4MzM0OENEOTIpLCAoMHg5MTQ0NzJGRCksICgweDgwRjI4MDk4KSwKKyAgICAoMHhERjNGQUJDRCksICgweDI0RDg0MEFDKSwgKDB4QkE5NTMyMUMpLCAoMHhEQzIxMUQyMCksICgweDE1MDQxOTQyKSwKKyAgICAoMHg2MTg1OEFCRCksICgweDU0NjA4NEExKSwgKDB4Q0VEQzA3RjQpLCAoMHhFQUIyREUwMCksICgweDA0NUJDMUU4KSwKKyAgICAoMHg4MkIyQUU4NiksICgweEU0QkYyODIzKSwgKDB4OUEwMUI0N0EpLCAoMHgxNzY5NDM4RSksICgweDAxNUM3OTg2KSwKKyAgICAoMHg1RkRGRjk3RCksICgweDVGMjhENjJDKSwgKDB4ODNDODRDOEMpLCAoMHhEQkFDNjAxQSksICgweDFBRTI4NDRGKSwKKyAgICAoMHg3OUY5REMxQyksICgweDAxQzNBQjVDKSwgKDB4Qzk3MUQ4MzkpLCAoMHg0NERFQTM5OCksICgweEMwQTY0RUExKSwKKyAgICAoMHgzODdFMjRBNSksICgweDA2MDBENTlGKSwgKDB4NTE2OUIzNzEpLCAoMHhFQzc4MkI2QiksICgweEY3RkY3NjlEKSwKKyAgICAoMHgzMTdCMEFFOCksICgweEUzMzg0NkM3KSwgKDB4MkZFMDU4NDkpLCAoMHgwMzI3Mzg1MyksICgweDJFRDI3QTg4KSwKKyAgICAoMHgyNERGNDM0MyksICgweEZCMDNDNzBGKSwgKDB4ODI3ODMyMzEpLCAoMHhEMzFDMEQyOSksICgweEFEQzVCRDhCKSwKKyAgICAoMHg3RDAyNEYxQiksICgweDkxQzE4RDE5KSwgKDB4QThFRTU4RTIpLCAoMHg0QzIzQTU5RiksICgweEM2MURDQTlGKSwKKyAgICAoMHgwM0JDOTFFQyksICgweDUxOTg2MTQ3KSwgKDB4MDVCOEJFMjQpLCAoMHg4NzJBQzkxOCksICgweDgwNTBGMUZGKSwKKyAgICAoMHgyMTg0ODEyRiksICgweEIyMEQ5NDFBKSwgKDB4OTE0MUNCMEMpLCAoMHhGNjAwQTM0MCksICgweDgwRTgyQUMyKSwKKyAgICAoMHg2NjAyODYzMSksICgweDEyMEZGQTQ1KSwgKDB4ODg5RjI0Q0IpLCAoMHg4MUYwQkIyNyksICgweDMxMDBENTFBKSwKKyAgICAoMHgyMzA5QTBCMyksICgweEFFMDA0NzE4KSwgKDB4QUE1ODRBOEQpLCAoMHg5NDMyREQyRSksICgweEREMEU5M0ZBKSwKKyAgICAoMHhDMTI5OTNBNiksICgweDZFMjgwMzVEKSwgKDB4OUJGNzc3MkIpLCAoMHgxRDYwOEMzMil9OwogCi1zdGF0aWMgY29uc3QgSU5UIF9fdHdpZGRsZXNfbWlwc19mZnQzMl81MTJbXSA9Ci17Ci0oMHg3RkZGRkZGRiksICgweDAwMDAwMDAwKSwgKDB4N0ZGRDg4NTkpLCAoMHhGRTZERTJFMCksICgweDdGRjYyMTgxKSwgKDB4RkNEQkQ1NDApLCAoMHg3RkU5Q0JCRSksICgweEZCNDlFNkEzKSwgKDB4N0ZEODg3OEMpLCAoMHhGOUI4MjY4MSksICgweDdGQzI1NTk1KSwgKDB4RjgyNkE0NjQpLCAoMHg3RkE3MzZCMiksICgweEY2OTU2RkI3KSwgKDB4N0Y4NzJCRjIpLCAoMHhGNTA0OTgwMCksICgweDdGNjIzNjhEKSwgKDB4RjM3NDJDOUQpLAotKDB4N0YzODU3RjQpLCAoMHhGMUU0M0QxQyksICgweDdGMDk5MUMzKSwgKDB4RjA1NEQ4REEpLCAoMHg3RUQ1RTVDNiksICgweEVFQzYwRjNDKSwgKDB4N0U5RDU1RkIpLCAoMHhFRDM3RUY5MSksICgweDdFNUZFNDkwKSwgKDB4RUJBQTg5NDQpLCAoMHg3RTFEOTNFQSksICgweEVBMURFQkM2KSwgKDB4N0RENjY2OEQpLCAoMHhFODkyMjYyMSksICgweDdEOEE1RjNDKSwgKDB4RTcwNzQ3QjkpLCAoMHg3RDM5ODBFRCksICgweEU1N0Q1RkU0KSwKLSgweDdDRTNDRUIwKSwgKDB4RTNGNDdEOTUpLCAoMHg3Qzg5NEJEQSksICgweEUyNkNCMDEwKSwgKDB4N0MyOUZCRUYpLCAoMHhFMEU2MDY4RiksICgweDdCQzVFMjk2KSwgKDB4REY2MDkwMDIpLCAoMHg3QjVEMDNBMSksICgweEREREM1QjRGKSwgKDB4N0FFRjYzMjUpLCAoMHhEQzU5Nzc4QiksICgweDdBN0QwNTU5KSwgKDB4REFEN0YzQTIpLCAoMHg3QTA1RUVBOCksICgweEQ5NTdERTZGKSwgKDB4Nzk4QTIzQTgpLCAoMHhEN0Q5NDZDMyksCi0oMHg3OTA5QTkzNSksICgweEQ2NUMzQjk4KSwgKDB4Nzg4NDg0MTkpLCAoMHhENEUwQ0IyOCksICgweDc3RkFCOThBKSwgKDB4RDM2NzA0NEYpLCAoMHg3NzZDNEVEOSksICgweEQxRUVGNTlEKSwgKDB4NzZEOTQ5ODMpLCAoMHhEMDc4QUQ5MyksICgweDc2NDFBRjMyKSwgKDB4Q0YwNDNBOUUpLCAoMHg3NUE1ODVEOSksICgweENEOTFBQjU1KSwgKDB4NzUwNEQzNEMpLCAoMHhDQzIxMEQ4QiksICgweDc0NUY5REQzKSwgKDB4Q0FCMjZGQjIpLAotKDB4NzNCNUVCQ0YpLCAoMHhDOTQ1REZFQiksICgweDczMDdDM0M5KSwgKDB4QzdEQjZDNDUpLCAoMHg3MjU1MkM3OSksICgweEM2NzMyMkI5KSwgKDB4NzE5RTJDREUpLCAoMHhDNTBEMTE2NCksICgweDcwRTJDQkNEKSwgKDB4QzNBOTQ1QTEpLCAoMHg3MDIzMTA5QyksICgweEMyNDdDRDYyKSwgKDB4NkY1RjAyQ0YpLCAoMHhDMEU4QjY3RSksICgweDZFOTZBOTk1KSwgKDB4QkY4QzBERDgpLCAoMHg2RENBMEQyNyksICgweEJFMzFFMUJGKSwKLSgweDZDRjkzNEU4KSwgKDB4QkNEQTNFQUUpLCAoMHg2QzI0Mjk2OSksICgweEJCODUzMkMwKSwgKDB4NkI0QUYyNTgpLCAoMHhCQTMyQ0E0MiksICgweDZBNkQ5OEExKSwgKDB4QjhFMzEzMTgpLCAoMHg2OThDMjQ4NyksICgweEI3OTYxOUM2KSwgKDB4NjhBNjlFNzIpLCAoMHhCNjRCRUFCOSksICgweDY3QkQwRkNDKSwgKDB4QjUwNDkzODApLCAoMHg2NkNGODEwMyksICgweEIzQzAxRkU5KSwgKDB4NjVEREZCRDYpLCAoMHhCMjdFOUQ0MyksCi0oMHg2NEU4ODk0QSksICgweEIxNDAxNzhDKSwgKDB4NjNFRjMyODYpLCAoMHhCMDA0OUFBOSksICgweDYyRjIwMUM0KSwgKDB4QUVDQzMzOEIpLCAoMHg2MUYxMDAyNyksICgweEFEOTZFRDc3KSwgKDB4NjBFQzM4M0EpLCAoMHhBQzY0RDUxRiksICgweDVGRTNCMzY2KSwgKDB4QUIzNUY1OEMpLCAoMHg1RUQ3N0M4NiksICgweEFBMEE1QjJDKSwgKDB4NURDNzlEOUMpLCAoMHhBOEUyMTEyQyksICgweDVDQjQyMENEKSwgKDB4QTdCRDIyOUEpLAotKDB4NUI5RDExNjYpLCAoMHhBNjlCOUI3RCksICgweDVBODI3OTc4KSwgKDB4QTU3RDg2NDYpLCAoMHg1OTY0NjQ5QiksICgweEE0NjJFRUIyKSwgKDB4NTg0MkREN0UpLCAoMHhBMzRCREY0QiksICgweDU3MURFRUVEKSwgKDB4QTIzODYyN0IpLCAoMHg1NUY1QTRFRCksICgweEExMjg4MzkxKSwgKDB4NTRDQTBBMkUpLCAoMHhBMDFDNEM1QyksICgweDUzOUIyQUZCKSwgKDB4OUYxM0M3REMpLCAoMHg1MjY5MTI0MSksICgweDlFMEVGRjlEKSwKLSgweDUxMzNDQzhGKSwgKDB4OUQwREZFNTIpLCAoMHg0RkZCNjU3MiksICgweDlDMTBDRDkwKSwgKDB4NEVCRkU4OEYpLCAoMHg5QjE3NzZDQiksICgweDREODE2MkQ4KSwgKDB4OUEyMjA0M0YpLCAoMHg0QzNGREZDQyksICgweDk5MzA3RUM1KSwgKDB4NEFGQjZDOUIpLCAoMHg5ODQyRjA0OCksICgweDQ5QjQxNTYyKSwgKDB4OTc1OTYxQTIpLCAoMHg0ODY5RTY1NyksICgweDk2NzNEQjhDKSwgKDB4NDcxQ0VEMDUpLCAoMHg5NTkyNjc3MiksCi0oMHg0NUNEMzU2RiksICgweDk0QjUwRDc0KSwgKDB4NDQ3QUNENUQpLCAoMHg5M0RCRDZBQSksICgweDQzMjVDMTAyKSwgKDB4OTMwNkNBRTcpLCAoMHg0MUNFMUVDRCksICgweDkyMzVGMzJDKSwgKDB4NDA3M0YyNDUpLCAoMHg5MTY5NTY3RCksICgweDNGMTc0OTlGKSwgKDB4OTBBMEZENDIpLCAoMHgzREI4MzI0QyksICgweDhGRENFRjM3KSwgKDB4M0M1NkJBQjUpLCAoMHg4RjFEMzQ2MSksICgweDNBRjJFRUJBKSwgKDB4OEU2MUQzMzEpLAotKDB4Mzk4Q0RDRjMpLCAoMHg4REFBRDM1RCksICgweDM4MjQ5NDEzKSwgKDB4OENGODNDNjIpLCAoMHgzNkJBMjAzNCksICgweDhDNEExNDQwKSwgKDB4MzU0RDkwMzMpLCAoMHg4QkEwNjIyMSksICgweDMzREVGMjFGKSwgKDB4OEFGQjJDOEUpLCAoMHgzMjZFNTUwNSksICgweDhBNUE3QTREKSwgKDB4MzBGQkM1NDcpLCAoMHg4OUJFNTBDMiksICgweDJGODc1MjE2KSwgKDB4ODkyNkI2NUEpLCAoMHgyRTExMEFCRiksICgweDg4OTNCMTRBKSwKLSgweDJDOThGQkQxKSwgKDB4ODgwNTQ2ODIpLCAoMHgyQjFGMzRCQyksICgweDg3N0I3QkREKSwgKDB4MjlBM0M0MEYpLCAoMHg4NkY2NTZBQyksICgweDI4MjZCOTVFKSwgKDB4ODY3NURDNjIpLCAoMHgyNkE4MjE3NCksICgweDg1RkExMTRGKSwgKDB4MjUyODBDMDUpLCAoMHg4NTgyRkE4QyksICgweDIzQTY4OEQzKSwgKDB4ODUxMDlDRjcpLCAoMHgyMjIzQTREMiksICgweDg0QTJGQzY4KSwgKDB4MjA5RjZGRTEpLCAoMHg4NDNBMUQ2MiksCi0oMHgxRjE5RjlGMCksICgweDgzRDYwNDMxKSwgKDB4MUQ5MzUwMTEpLCAoMHg4Mzc2QjQyRSksICgweDFDMEI4MjRFKSwgKDB4ODMxQzMxNEEpLCAoMHgxQTgyOUZDMCksICgweDgyQzY3RjAwKSwgKDB4MThGOEI4ODgpLCAoMHg4Mjc1QTBEMSksICgweDE3NkREOUUxKSwgKDB4ODIyOTk5NzQpLCAoMHgxNUUyMTNGRCksICgweDgxRTI2QzBCKSwgKDB4MTQ1NTc3MUQpLCAoMHg4MUEwMUI4MCksICgweDEyQzgxMDkwKSwgKDB4ODE2MkFBMEEpLAotKDB4MTEzOUYwQTcpLCAoMHg4MTJBMUEzNiksICgweDBGQUIyNkI5KSwgKDB4ODBGNjZFMzApLCAoMHgwRTFCQzMyNiksICgweDgwQzdBODEzKSwgKDB4MEM4QkQzNTYpLCAoMHg4MDlEQzk3MSksICgweDBBRkI2N0IyKSwgKDB4ODA3OEQ0MDcpLCAoMHgwOTZBOTBBQiksICgweDgwNThDOTU1KSwgKDB4MDdEOTVCQjYpLCAoMHg4MDNEQUE2RCksICgweDA2NDdEOTQ5KSwgKDB4ODAyNzc4NzEpLCAoMHgwNEI2MThERiksICgweDgwMTYzNDNEKSwKLSgweDAzMjQyQUY2KSwgKDB4ODAwOURFODEpLCAoMHgwMTkyMUQwQyksICgweDgwMDI3N0E3KSwgKDB4RkZGRkZGQTMpLCAoMHg4MDAwMDAwMiksICgweEZFNkRFMzM4KSwgKDB4ODAwMjc3QTYpLCAoMHhGQ0RCRDU0RSksICgweDgwMDlERTdGKSwgKDB4RkI0OUU2NjUpLCAoMHg4MDE2MzQ0NCksICgweEY5QjgyNkZCKSwgKDB4ODAyNzc4NkUpLCAoMHhGODI2QTQ4RSksICgweDgwM0RBQTY5KSwgKDB4RjY5NTZGOTkpLCAoMHg4MDU4Qzk1MCksCi0oMHhGNTA0OTc5MyksICgweDgwNzhENDE4KSwgKDB4RjM3NDJDRUUpLCAoMHg4MDlEQzk2QiksICgweEYxRTQzRDFFKSwgKDB4ODBDN0E4MEMpLCAoMHhGMDU0RDg4RCksICgweDgwRjY2RTQ3KSwgKDB4RUVDNjBGOUQpLCAoMHg4MTJBMUEyRCksICgweEVEMzdFRkIzKSwgKDB4ODE2MkFBMDApLCAoMHhFQkFBODkyNyksICgweDgxQTAxQjc1KSwgKDB4RUExREVCNEEpLCAoMHg4MUUyNkMyQyksICgweEU4OTIyNjYyKSwgKDB4ODIyOTk5NjcpLAotKDB4RTcwNzQ3QkIpLCAoMHg4Mjc1QTBDMyksICgweEU1N0Q1Rjg5KSwgKDB4ODJDNjdGMjcpLCAoMHhFM0Y0N0RGNSksICgweDgzMUMzMTNCKSwgKDB4RTI2Q0IwMzEpLCAoMHg4Mzc2QjQxRSksICgweEUwRTYwNjUzKSwgKDB4ODNENjA0MjApLCAoMHhERjYwOEY2OSksICgweDg0M0ExRDkyKSwgKDB4REREQzVCNkYpLCAoMHg4NEEyRkM1NSksICgweERDNTk3NzZFKSwgKDB4ODUxMDlDRTQpLCAoMHhEQUQ3RjM0OCksICgweDg1ODJGQUMyKSwKLSgweEQ5NTdERUNEKSwgKDB4ODVGQTExM0EpLCAoMHhEN0Q5NDZFMyksICgweDg2NzVEQzREKSwgKDB4RDY1QzNCNDApLCAoMHg4NkY2NTZFOSksICgweEQ0RTBDQjg0KSwgKDB4ODc3QjdCQzYpLCAoMHhEMzY3MDQ2RiksICgweDg4MDU0NjZBKSwgKDB4RDFFRUY1ODEpLCAoMHg4ODkzQjEzMiksICgweEQwNzhBRDNDKSwgKDB4ODkyNkI2QTApLCAoMHhDRjA0M0FGOCksICgweDg5QkU1MEE4KSwgKDB4Q0Q5MUFCMzkpLCAoMHg4QTVBN0EzMiksCi0oMHhDQzIxMEQzNSksICgweDhBRkIyQ0RCKSwgKDB4Q0FCMjcwMEIpLCAoMHg4QkEwNjIwNCksICgweEM5NDVFMDBBKSwgKDB4OEM0QTE0MjMpLCAoMHhDN0RCNkMyQSksICgweDhDRjgzQzQ0KSwgKDB4QzY3MzIyNjUpLCAoMHg4REFBRDNCMiksICgweEM1MEQxMDlGKSwgKDB4OEU2MUQzODgpLCAoMHhDM0E5NDY2OSksICgweDhGMUQzM0M4KSwgKDB4QzI0N0NERjApLCAoMHg4RkRDRUYxNiksICgweEMwRThCNjlDKSwgKDB4OTBBMEZEMjEpLAotKDB4QkY4QzBERjYpLCAoMHg5MTY5NTY1QSksICgweEJFMzFFMTZFKSwgKDB4OTIzNUYzMDkpLCAoMHhCQ0RBM0U1RSksICgweDkzMDZDQjQ5KSwgKDB4QkI4NTMyMDUpLCAoMHg5M0RCRDcwRSksICgweEJBMzJDQjM1KSwgKDB4OTRCNTBEMDkpLCAoMHhCOEUzMTM5RSksICgweDk1OTI2NzA1KSwgKDB4Qjc5NjE5RTIpLCAoMHg5NjczREI2NiksICgweEI2NEJFQUQ1KSwgKDB4OTc1OTYxN0IpLCAoMHhCNTA0OTMzNCksICgweDk4NDJGMDZCKSwKLSgweEIzQzAxRjlEKSwgKDB4OTkzMDdGMzUpLCAoMHhCMjdFOUM5MiksICgweDlBMjIwNEIwKSwgKDB4QjE0MDE4MEMpLCAoMHg5QjE3NzY1MiksICgweEIwMDQ5QjI3KSwgKDB4OUMxMENEMTUpLCAoMHhBRUNDMzNBNSksICgweDlEMERGRTI3KSwgKDB4QUQ5NkVEOTEpLCAoMHg5RTBFRkZDMyksICgweEFDNjRENEQ4KSwgKDB4OUYxM0M4MDMpLCAoMHhBQjM1RjU0NSksICgweEEwMUM0Q0Q4KSwgKDB4QUEwQTVBODgpLCAoMHhBMTI4ODQwRiksCi0oMHhBOEUyMTFBMiksICgweEEyMzg2MUY1KSwgKDB4QTdCRDIzMTApLCAoMHhBMzRCREVDMyksICgweEE2OUI5Qjk2KSwgKDB4QTQ2MkVFODIpLCAoMHhBNTdEODY1RSksICgweEE1N0Q4NjcwKSwgKDB4QTQ2MkVFNzApLCAoMHhBNjlCOUJBOCksICgweEEzNEJERUIyKSwgKDB4QTdCRDIzMjIpLCAoMHhBMjM4NjFFNCksICgweEE4RTIxMUI1KSwgKDB4QTEyODgzRkUpLCAoMHhBQTBBNUE5QiksICgweEEwMUM0Q0M3KSwgKDB4QUIzNUY1NTkpLAotKDB4OUYxM0M3RjIpLCAoMHhBQzY0RDRFQiksICgweDlFMEVGRkIzKSwgKDB4QUQ5NkVEQTUpLCAoMHg5RDBERkUxNiksICgweEFFQ0MzM0I5KSwgKDB4OUMxMENEMDUpLCAoMHhCMDA0OUIzQiksICgweDlCMTc3NjQyKSwgKDB4QjE0MDE4MjApLCAoMHg5QTIyMDRBMSksICgweEIyN0U5Q0E2KSwgKDB4OTkzMDdGMjYpLCAoMHhCM0MwMUZCMiksICgweDk4NDJGMDVDKSwgKDB4QjUwNDkzNDkpLCAoMHg5NzU5NjE2QyksICgweEI2NEJFQUVBKSwKLSgweDk2NzNEQjU3KSwgKDB4Qjc5NjE5RjcpLCAoMHg5NTkyNjZGNyksICgweEI4RTMxM0I0KSwgKDB4OTRCNTBFMTMpLCAoMHhCQTMyQzk5RSksICgweDkzREJENzAwKSwgKDB4QkI4NTMyMUEpLCAoMHg5MzA2Q0IzQyksICgweEJDREEzRTc0KSwgKDB4OTIzNUYyRkMpLCAoMHhCRTMxRTE4NCksICgweDkxNjk1NjREKSwgKDB4QkY4QzBFMEMpLCAoMHg5MEEwRkQxNCksICgweEMwRThCNkIyKSwgKDB4OEZEQ0VGMDkpLCAoMHhDMjQ3Q0UwNyksCi0oMHg4RjFEMzRBRCksICgweEMzQTk0NEJDKSwgKDB4OEU2MUQzN0MpLCAoMHhDNTBEMTBCNiksICgweDhEQUFEM0E2KSwgKDB4QzY3MzIyN0MpLCAoMHg4Q0Y4M0MzOSksICgweEM3REI2QzQxKSwgKDB4OEM0QTE0MTgpLCAoMHhDOTQ1RTAyMSksICgweDhCQTA2MUY5KSwgKDB4Q0FCMjcwMjIpLCAoMHg4QUZCMkM2OCksICgweENDMjEwRTM3KSwgKDB4OEE1QTdBOEQpLCAoMHhDRDkxQUE2NiksICgweDg5QkU1MTAwKSwgKDB4Q0YwNDNBMjQpLAotKDB4ODkyNkI2OTcpLCAoMHhEMDc4QUQ1MyksICgweDg4OTNCMTI4KSwgKDB4RDFFRUY1OTkpLCAoMHg4ODA1NDY2MSksICgweEQzNjcwNDg3KSwgKDB4ODc3QjdCQkQpLCAoMHhENEUwQ0I5QyksICgweDg2RjY1NjhFKSwgKDB4RDY1QzNDNEEpLCAoMHg4Njc1REM5NSksICgweEQ3RDk0NjA4KSwgKDB4ODVGQTExODApLCAoMHhEOTU3RERGMSksICgweDg1ODJGQUJCKSwgKDB4REFEN0YzNjApLCAoMHg4NTEwOUNERCksICgweERDNTk3Nzg3KSwKLSgweDg0QTJGQzRGKSwgKDB4REREQzVCODgpLCAoMHg4NDNBMUQ0QiksICgweERGNjA5MDdBKSwgKDB4ODNENjAzREMpLCAoMHhFMEU2MDc2NCksICgweDgzNzZCNDU0KSwgKDB4RTI2Q0FGNTEpLCAoMHg4MzFDMzE2RCksICgweEUzRjQ3RDE0KSwgKDB4ODJDNjdGMjEpLCAoMHhFNTdENUZBMiksICgweDgyNzVBMEJFKSwgKDB4RTcwNzQ3RDQpLCAoMHg4MjI5OTk2MiksICgweEU4OTIyNjdDKSwgKDB4ODFFMjZCRkIpLCAoMHhFQTFERUM1RiksCi0oMHg4MUEwMUI0OCksICgweEVCQUE4QTNEKSwgKDB4ODE2MkFBMjIpLCAoMHhFRDM3RUVDRiksICgweDgxMkExQTRDKSwgKDB4RUVDNjBFQjkpLCAoMHg4MEY2NkU0NCksICgweEYwNTREOEE2KSwgKDB4ODBDN0E4MDkpLCAoMHhGMUU0M0QzOCksICgweDgwOURDOTY4KSwgKDB4RjM3NDJEMDgpLCAoMHg4MDc4RDNGRiksICgweEY1MDQ5OEFCKSwgKDB4ODA1OEM5M0IpLCAoMHhGNjk1NzBCMiksICgweDgwM0RBQTc3KSwgKDB4RjgyNkEzQTgpLAotKDB4ODAyNzc4NzkpLCAoMHhGOUI4MjYxNSksICgweDgwMTYzNDQzKSwgKDB4RkI0OUU2N0YpLCAoMHg4MDA5REU3RSksICgweEZDREJENTY4KSwgKDB4ODAwMjc3QTYpLCAoMHhGRTZERTM1MiksICgweDQ2NTIyMEJCKSwgKDB4QzY2RTFGRkMpLCAoMHgyQzYxRDM1NiksICgweEFGRkIxNzZEKSwgKDB4ODgwNjdFMjMpLCAoMHgzNzk2RjAwOCksICgweEM4RDEyOEYzKSwgKDB4QjY2MUE1RkEpLCAoMHhGMTlDRTRGMCksICgweDNGN0QwMzQ1KSwKLSgweEU5N0U2MDMwKSwgKDB4NEFCQTkxQ0YpLCAoMHhERUVEQUIwQyksICgweDM1RkQxRDc3KSwgKDB4REQ2MzY0MzkpLCAoMHgyRjhCNzk0QyksICgweDc2NEUxRDMyKSwgKDB4N0E4RDBCMUIpLCAoMHg4RUFDQjI3RiksICgweDU3N0FENjdCKSwgKDB4MkIzRkUyQzUpLCAoMHg4QUNEMDI0QSksICgweEVERjVDNDJDKSwgKDB4RjFDQTk1MUMpLCAoMHhCOThCNkQwNCksICgweDZEMTJCODY0KSwgKDB4NTBFNzREMDgpLCAoMHg3M0QxNTAzQiksCi0oMHhDN0QzRjZBOSksICgweDFGMzY1RTk3KSwgKDB4RTEzNDBFNTkpLCAoMHg4OUQyMUI5RCksICgweDlCNzU2NzMzKSwgKDB4OTAyNENENTApLCAoMHhFMkM3RkY1MiksICgweEQ5RjA2MUVGKSwgKDB4NzcxNTEzOTIpLCAoMHhBMEU0QTAwNCksICgweDYwQkU4MjBGKSwgKDB4Qzc2MDNCQUYpLCAoMHhBNjJFM0RBOSksICgweEE0MDBFMTFGKSwgKDB4MTU1MTExRDQpLCAoMHg5MDMwQTM3NCksICgweDE0MTg1MTI0KSwgKDB4OEQwNDNBMDApLAotKDB4NTA5NDUyNTgpLCAoMHgyMEE2NjUzRSksICgweEExOUJBOEI5KSwgKDB4M0NGQkU2OTIpLCAoMHg5MTQ3MUQ5OCksICgweDBCOUQwM0ZGKSwgKDB4QTVCQThFMjkpLCAoMHhGRkM4RUIyMiksICgweDE0MkNCMUIwKSwgKDB4NTUzMTczMTkpLCAoMHgzM0FEQzc3QyksICgweEY2OUJBRENFKSwgKDB4Nzg0MjNEM0MpLCAoMHhCRTY3QkJGMCksICgweDdEODhCRDE1KSwgKDB4MUU5RUY2NzMpLCAoMHg1MTIwOThCMyksICgweDMyNkEzRDNEKSwKLSgweDE2MUVGM0I2KSwgKDB4MEU0QzRFRDUpLCAoMHg0RTlGOTk4MiksICgweEQwQUI2QTM2KSwgKDB4RjE3REQzNzcpLCAoMHg1RTUzRjMxQyksICgweEJFOTExMkVBKSwgKDB4M0RFMUIwRkYpLCAoMHhEN0YzOUFFNyksICgweEEzNEI5NjM1KSwgKDB4NDlDRkVFNkMpLCAoMHg4QTA2M0FDNiksICgweEJBNzlCQzBEKSwgKDB4NkE1ODg3ODIpLCAoMHg0MzlCRTU5MyksICgweDBBNUY3RThEKSwgKDB4RDJGQzI1NjEpLCAoMHg0Njk4QUM4RiksCi0oMHgyNDdDM0JDMiksICgweDU4MjY1MjNEKSwgKDB4NEQyQkQ3NTMpLCAoMHg0QjhCQ0MxNyksICgweDlCNzQzNTAzKSwgKDB4OUY4NEU0MzQpLCAoMHg4Qjk3QjQxQSksICgweDNDRkNFNzVGKSwgKDB4MzJEMkQ0ODcpLCAoMHgzRTgwQjRBRiksICgweDQyRjhCMEVBKSwgKDB4RUMwQzgxRUUpLCAoMHgxNzI3OTMwOSksICgweDY4MUZBMEYzKSwgKDB4OEJBRDIwOEUpLCAoMHhEMTE3OTJDNiksICgweEYxRkYwN0IzKSwgKDB4MjEzMzgwNTApLAotKDB4OEExQTIxQTQpLCAoMHhGRjAzNThEOCksICgweDQxNkMxM0MxKSwgKDB4NDYzNDg4NTgpLCAoMHg4MzgyMDUxOSksICgweEFCQzA4ODIyKSwgKDB4NkExQTUyMDApLCAoMHgwQzgzMTIyQSksICgweEE2N0ZERjA2KSwgKDB4MDYyOUY5NzApLCAoMHhFRkFBMjc0MyksICgweDBDMDBBRDk1KSwgKDB4RkYwOUY1Q0YpLCAoMHhDNzg0REI4QiksICgweENCMDBCQTdEKSwgKDB4NjIyMDkwOUYpLCAoMHg3MTQ5QjdERiksICgweDVCRDNFQkVDKSwKLSgweDA0ODVFRjcxKSwgKDB4MDdGRTIzQjEpLCAoMHg4MDczNzY2OCksICgweDQyQTMyNjQ1KSwgKDB4RDZFREJCMTgpLCAoMHg0MDdFNzJDNSksICgweDkwMTQwMkUwKSwgKDB4MEMxQjc5MDUpLCAoMHgwMUNFMTFGQyksICgweDAwQzY0OTE0KSwgKDB4MzAzNzk3OEEpLCAoMHhGQUJDOTE5MCksICgweDQzQTBBQzg5KSwgKDB4Qjk5OTgzNzApLCAoMHhENkQ2OTIwOSksICgweEYxMzI0NTVFKSwgKDB4OURBRkY0ODIpLCAoMHhBMkQ2MzVDMiksCi0oMHhCRDk3NkI1RSksICgweDc5RUQ5M0VEKSwgKDB4N0Q0MkNBMjIpLCAoMHgyRTIzRjlDMSksICgweENGMEU3NTIxKSwgKDB4OTZEODhBQzEpLCAoMHg0MjBDMjg0NSksICgweDFFMTk1NzNEKSwgKDB4RjhGRTkyNzkpLCAoMHhDMTQ5NTEwMCksICgweDIwMTI0OUMyKSwgKDB4OEIxODM3MjMpLCAoMHg0NTA2MTVBNSksICgweDAwNEMwMTEyKSwgKDB4ODVFQjUyMzUpLCAoMHgxQkQ4QkQ0OCksICgweEEyOTE0RjAzKSwgKDB4NTE0MjBFQUMpLAotKDB4Q0U3ODg0NzApLCAoMHgwNTA4MDMwQiksICgweEE0Q0QyQTZDKSwgKDB4OTYyNkMwNjIpLCAoMHhGODhEMkRFNSksICgweEE5RDZCMzk5KSwgKDB4QjNDNTdCRkQpLCAoMHhDQjFFOUM0QyksICgweDAwNEE1MDk0KSwgKDB4RDBDQkM0MkEpLCAoMHgzQkUxQTY5NCksICgweDNDMzUzRkE3KSwgKDB4QTU2OTdDNTcpLCAoMHhGRTk2MTY2NSksICgweEVENkI3QzdEKSwgKDB4NDMzRENGOEQpLCAoMHhEQTdENkMyNCksICgweDQwNzExMkMxKSwKLSgweDRCOUQyODVEKSwgKDB4NkM5QTJGNTcpLCAoMHgxQkY5RkFFRiksICgweDRFRTNFMkU5KSwgKDB4RTVBRTdFOTIpLCAoMHg2MEExMUQzRiksICgweDRCNDQxQjYzKSwgKDB4Qzg0MTlCQjEpLCAoMHgyQzRGNkRERCksICgweENFQzNDRjZEKSwgKDB4MzI1QTY1Q0EpLCAoMHg4MThGQzZBNCksICgweEM1NUU1RTVCKSwgKDB4Mjc3NDQ1QTMpLCAoMHg2QjMyODlGNyksICgweDA5MTQ3RDU1KSwgKDB4NEYzNzhENTMpLCAoMHg1ODhCMERDOCksCi0oMHhGNzBCQTM0NyksICgweENCQzQzRkFFKSwgKDB4RDk4RTY2MzkpLCAoMHgwN0FGOUVEMCksICgweEUyRTYzMDVBKSwgKDB4NUUwMDM1NzEpLCAoMHgxODUyM0U3QSksICgweEY3MEQxRTI3KSwgKDB4RDcyODg5NTApLCAoMHgxMkMxMTEzMiksICgweEZGMUM5RDE3KSwgKDB4MzE4MDUwRjEpLCAoMHgxQTIxOTgyMSksICgweEJGMjE5OThBKSwgKDB4NkMxM0MxRkYpLCAoMHg4QzYwNTg2MSksICgweDBBMTgzOTU0KSwgKDB4N0JFNEMxQjYpLAotKDB4QTJDQkM0MTApLCAoMHg3Q0MwMEE1NSksICgweDVFNThBOTczKSwgKDB4MTEyMkVGODYpLCAoMHg4MDU2OEUzOSksICgweDIzMTBDMzAwKSwgKDB4MEUxNTJEMEUpLCAoMHg5RTAxN0MxQyksICgweDg1MURGQzI2KSwgKDB4RDFCMUU2NjIpLCAoMHg4MUJBMTBCMCksICgweDk2QzJFOTc3KSwgKDB4ODY4OEU0MTkpLCAoMHg5N0M5NDk4OSksICgweDI1MEQ1MzVFKSwgKDB4MzVGREU3MzIpLCAoMHgxNDdBRDE4MyksICgweENGOUQ3NUMwKSwKLSgweDZCMkMxODNDKSwgKDB4MUQzMjY0ODkpLCAoMHhDMDgwN0Q5OCksICgweEMwODE2MjJFKSwgKDB4MTVDODdCODcpLCAoMHg3NDA0NTk4QyksICgweEZDM0M3RkE2KSwgKDB4MjhCQThDRjUpLCAoMHhFMzExRUE5QiksICgweEVBQkZENEE1KSwgKDB4ODc2ODgzNEEpLCAoMHgwRjdENzQ0MCksICgweDQwNTkzMTUyKSwgKDB4Q0YxRThCRjUpLCAoMHhFMzIwMTdCNiksICgweDM5RTY2MDcwKSwgKDB4NTYwRUNFOUQpLCAoMHhGNDEzMkM3NyksCi0oMHg3MjI5NDVDMSksICgweDk2RUNCNUQ1KSwgKDB4MEMxMDBDMDYpLCAoMHgzMEU5NkMwMiksICgweEUwQjAxNTlCKSwgKDB4MTYzQTQwQ0IpLCAoMHgxQjI4Qjc1MCksICgweDExNDIwRTExKSwgKDB4MzREQzU5ODEpLCAoMHhEMjc2OUMzQyksICgweDU2OTQwMkQwKSwgKDB4RTRGMTU3QzApLCAoMHgxMjBERjI0QyksICgweDQwRDg2MTUzKSwgKDB4MTk0MkNEMTEpLCAoMHgyMjQ4NEMzQiksICgweDhCMjk5MTQ0KSwgKDB4NThGMUFBRjgpLAotKDB4QjJDRDQ3NzcpLCAoMHg0QTUzQUIwMiksICgweDU1QTVEQUQ0KSwgKDB4QzhENThENzkpLCAoMHg2Q0FFQzAxMSksICgweDFDOTU1Qzg0KSwgKDB4REUwOEE2QzYpLCAoMHhENDAyQUY3RCksICgweDY5NUU2RkE0KSwgKDB4NERBODYzQjkpLCAoMHg1MTE4MDcwQyksICgweDVBOTdFRjFDKSwgKDB4ODg4MEIzODgpLCAoMHg0RDU5NkIyRCksICgweDM3RDc0RENGKSwgKDB4NTgxMzhCMzgpLCAoMHg1QjdCQ0Q0RSksICgweEFFNkM0NDIyKSwKLSgweDRFNUQxQUYxKSwgKDB4REU3Mzk2QTUpLCAoMHhCNDQyRjIxNyksICgweDBERjdBMDA2KSwgKDB4OTZFRUY4QTIpLCAoMHhFMjg0N0IyNiksICgweDY4QjlGNjdCKSwgKDB4OEZFMUZBNjUpLCAoMHhFMEE4N0U1NiksICgweDFCRThGQzRDKSwgKDB4QkJENjVGOUQpLCAoMHhFNkYwMkM5RCksICgweDg2N0M2RUVDKSwgKDB4NDNGQUI3MjUpLCAoMHhBNDE0NDQxOSksICgweDY5QkI2QUFGKSwgKDB4Q0UyN0I3NDQpLCAoMHgwMjIyNDFBOSksCi0oMHhDMDVERjE0RSksICgweDgwNTBGMUZGKSwgKDB4MjE4QzIxMzEpLCAoMHhCRTI1OTQxQSksICgweDkwNDFDRDA2KSwgKDB4MUVFOEE5QzApLCAoMHhENTMwRkVERCksICgweDc0OTVDODA4KSwgKDB4MDUwOTE4QTYpLCAoMHgzQ0U3MzJFOSksICgweEY4NzI2MkZDKSwgKDB4MDFCODEyRjEpLCAoMHgxRkJBNDg0MiksICgweDNFODZDN0YyKSwgKDB4MjcwREIzNTgpLCAoMHhGOUQyMjgzNCksICgweDc0RDRGNDY5KSwgKDB4OUE2RTg3RDIpLAotKDB4OENCQjBBNTApLCAoMHhDMDc4NEI5MiksICgweDI3OERBNTgxKSwgKDB4OTIyMUE3RDUpLCAoMHhERTgwMUI1NCksICgweDRCNTMxRkRBKSwgKDB4QzhCOTFGOTEpLCAoMHg3QTkwREE0MCksICgweDI5NjdBNDI5KSwgKDB4NTBDQzFEOEQpLCAoMHg5QUU5MTEwRSksICgweDUwRjI1MEVFKSwgKDB4RDY5NUIwNzIpLCAoMHhGQzdBNTcxOCksICgweDFGMUEyNkU2KSwgKDB4N0Q1QURENEQpLCAoMHhDODk3ODU5NyksICgweEVCMzI2REMzKSwKLSgweDM4NEU5ODI0KSwgKDB4QzNCOUQ3OEMpLCAoMHhEOEQyRTIxNCksICgweEVGRkJCMDQ4KSwgKDB4MDBBQjc3MTQpLCAoMHg5RDg5Q0ExMyksICgweEY3MDY4OEQwKSwgKDB4QUREQTNBMzcpLCAoMHg1RkJFNTk0MyksICgweDRFRDlENjEzKSwgKDB4OEE5RENDOTMpLCAoMHgxOTgxNDIzNiksICgweDA5QTY4QkNDKSwgKDB4Q0VBQzMzQUMpLCAoMHgwQkE3MEJCMyksICgweDMyNjI3MkUxKSwgKDB4MkE4QzZEMjApLCAoMHgyMzA4M0QwQiksCi0oMHhGQTgwOUMwMiksICgweDU4MjVDNkMyKSwgKDB4MDYxQjQ2OTUpLCAoMHg4REI5Nzc0OCksICgweDUwNzFFNTg0KSwgKDB4MDg3NjA5NTkpLCAoMHg0NEVBOEQwNCksICgweDVDRTZFMkFBKSwgKDB4MDA5QUQxNzYpLCAoMHhBRUM2NEYxOSksICgweENBRERBNjMyKSwgKDB4OEQ3OTU0NDUpLCAoMHgxNkUzRUEyNCksICgweEYxMjY0OENBKSwgKDB4RDVDQzM1MEMpLCAoMHg2MTVFQkFENyksICgweDRFNzY5RkI2KSwgKDB4NkM1RUIzODApLAotKDB4NUJCNDY0MjUpLCAoMHhFQUI2Qzc3QyksICgweDEwOTQ1NDA4KSwgKDB4QzEyOTFCODYpLCAoMHg5MTNCNzFBNSksICgweDAwM0JBMzI5KSwgKDB4OTE4MTI4NTQpLCAoMHhFMjAwQ0IxMiksICgweDdBNDY5NkE4KSwgKDB4NzZFNTVEMjUpLCAoMHhENkQzQzU3NyksICgweDhCMUI3OUIxKSwgKDB4Mjk2QjA0Q0QpLCAoMHhBMDI0Q0MzNSksICgweDMzNDFBNDc3KSwgKDB4OEVDMTIzNTgpLCAoMHhGNTk4MkIyRiksICgweDM2RjEyMEM5KSwKLSgweDc5REJFNzk5KSwgKDB4RUQ3NEYwOTIpLCAoMHhBMTAzMUFFMyksICgweEIyRDk4QzZCKSwgKDB4MzU4Q0FCNzMpLCAoMHg0MTE1M0MxOSksICgweDQ3NEQ0NTQ4KSwgKDB4QTdFODM0QTkpLCAoMHg5OTk3MzhBRSksICgweDUwRjFGRkU4KSwgKDB4ODg2MTJGODApLCAoMHhGRDkzMUEyMSksICgweDIzODM5QUJEKSwgKDB4QkU2MDQ3MDEpLCAoMHg4MTIyNzRCOSksICgweDRDQTlFQTMyKSwgKDB4RTVGMkQyMDcpLCAoMHhDMUNGNDY1MyksCi0oMHg0MzU2MUIyMyksICgweDUzQjJFMjc3KSwgKDB4NEYyQjAwRUMpLCAoMHhGMkIzQkE4MCksICgweEZDNzA4Q0M1KSwgKDB4RTdGNjNGMDApLCAoMHgyNjEyMDM0MiksICgweDFBNDlDN0E4KSwgKDB4QTkzNTBBN0MpLCAoMHhFNTMwQTA2QyksICgweDVDQjlFNTUwKSwgKDB4QjE2NzI5MTMpLCAoMHg2NUZBNzZGOSksICgweEM5RjkyRENBKSwgKDB4N0Q0RTkxOTUpLCAoMHg0REJCODI2NSksICgweDIwMzZFMjZDKSwgKDB4RURDMDI2RTYpLAotKDB4QjlBNjE3RTApLCAoMHg2NDY5RjBFRSksICgweEU5REFBQkIyKSwgKDB4MjYwNjMyMTApLCAoMHhBQzU0NURGNCksICgweDEzNEUwMzVBKSwgKDB4MjE2RURFMTApLCAoMHhFQzgxMTU4RCksICgweDEyMkEyQ0FFKSwgKDB4QTI2M0QwRTEpLCAoMHg2Q0ExRkIyOCksICgweEJFMjg3REYwKSwgKDB4NTQ4MTA0RTgpLCAoMHgzNTk4N0Q5MyksICgweEJDM0U1NDlDKSwgKDB4M0FDRUZENjQpLCAoMHgzMzQ4Q0Q5MiksICgweDkxNDQ3MkZEKSwKLSgweDgwRjI4MDk4KSwgKDB4REYzRkFCQ0QpLCAoMHgyNEQ4NDBBQyksICgweEJBOTUzMjFDKSwgKDB4REMyMTFEMjApLCAoMHgxNTA0MTk0MiksICgweDYxODU4QUJEKSwgKDB4NTQ2MDg0QTEpLCAoMHhDRURDMDdGNCksICgweEVBQjJERTAwKSwgKDB4MDQ1QkMxRTgpLCAoMHg4MkIyQUU4NiksICgweEU0QkYyODIzKSwgKDB4OUEwMUI0N0EpLCAoMHgxNzY5NDM4RSksICgweDAxNUM3OTg2KSwgKDB4NUZERkY5N0QpLCAoMHg1RjI4RDYyQyksCi0oMHg4M0M4NEM4QyksICgweERCQUM2MDFBKSwgKDB4MUFFMjg0NEYpLCAoMHg3OUY5REMxQyksICgweDAxQzNBQjVDKSwgKDB4Qzk3MUQ4MzkpLCAoMHg0NERFQTM5OCksICgweEMwQTY0RUExKSwgKDB4Mzg3RTI0QTUpLCAoMHgwNjAwRDU5RiksICgweDUxNjlCMzcxKSwgKDB4RUM3ODJCNkIpLCAoMHhGN0ZGNzY5RCksICgweDMxN0IwQUU4KSwgKDB4RTMzODQ2QzcpLCAoMHgyRkUwNTg0OSksICgweDAzMjczODUzKSwgKDB4MkVEMjdBODgpLAotKDB4MjRERjQzNDMpLCAoMHhGQjAzQzcwRiksICgweDgyNzgzMjMxKSwgKDB4RDMxQzBEMjkpLCAoMHhBREM1QkQ4QiksICgweDdEMDI0RjFCKSwgKDB4OTFDMThEMTkpLCAoMHhBOEVFNThFMiksICgweDRDMjNBNTlGKSwgKDB4QzYxRENBOUYpLCAoMHgwM0JDOTFFQyksICgweDUxOTg2MTQ3KSwgKDB4MDVCOEJFMjQpLCAoMHg4NzJBQzkxOCksICgweDgwNTBGMUZGKSwgKDB4MjE4NDgxMkYpLCAoMHhCMjBEOTQxQSksICgweDkxNDFDQjBDKSwKLSgweEY2MDBBMzQwKSwgKDB4ODBFODJBQzIpLCAoMHg2NjAyODYzMSksICgweDEyMEZGQTQ1KSwgKDB4ODg5RjI0Q0IpLCAoMHg4MUYwQkIyNyksICgweDMxMDBENTFBKSwgKDB4MjMwOUEwQjMpLCAoMHhBRTAwNDcxOCksICgweEFBNTg0QThEKSwgKDB4OTQzMkREMkUpLCAoMHhERDBFOTNGQSksICgweEMxMjk5M0E2KSwgKDB4NkUyODAzNUQpLCAoMHg5QkY3NzcyQiksICgweDFENjA4QzMyKQotfTsKLQotCi1zdGF0aWMgY29uc3QgSU5UIF9fdHdpZGRsZXNfbWlwc19mZnQzMl8xMDI0W10gPQotewotKDB4N0ZGRkZGRkYpLCAoMHgwMDAwMDAwMCksICgweDdGRkY2MjE1KSwgKDB4RkYzNkYwNzgpLCAoMHg3RkZEODg1OSksICgweEZFNkRFMkUwKSwgKDB4N0ZGQTcyRDApLCAoMHhGREE0RDkyOSksICgweDdGRjYyMTgxKSwgKDB4RkNEQkQ1NDApLCAoMHg3RkYwOTQ3NiksICgweEZDMTJEOTFCKSwgKDB4N0ZFOUNCQkUpLCAoMHhGQjQ5RTZBMyksICgweDdGRTFDNzZBKSwgKDB4RkE4MEZGQ0UpLCAoMHg3RkQ4ODc4QyksICgweEY5QjgyNjgxKSwKLSgweDdGQ0UwQzNEKSwgKDB4RjhFRjVDQkMpLCAoMHg3RkMyNTU5NSksICgweEY4MjZBNDY0KSwgKDB4N0ZCNTYzQjIpLCAoMHhGNzVERkY2QiksICgweDdGQTczNkIyKSwgKDB4RjY5NTZGQjcpLCAoMHg3Rjk3Q0VCQiksICgweEY1Q0NGNzNFKSwgKDB4N0Y4NzJCRjIpLCAoMHhGNTA0OTgwMCksICgweDdGNzU0RTdFKSwgKDB4RjQzQzUzQ0IpLCAoMHg3RjYyMzY4RCksICgweEYzNzQyQzlEKSwgKDB4N0Y0REU0NTApLCAoMHhGMkFDMjQ3MyksCi0oMHg3RjM4NTdGNCksICgweEYxRTQzRDFDKSwgKDB4N0YyMTkxQjIpLCAoMHhGMTFDNzg5NSksICgweDdGMDk5MUMzKSwgKDB4RjA1NEQ4REEpLCAoMHg3RUYwNTg2MCksICgweEVGOEQ1RkM4KSwgKDB4N0VENUU1QzYpLCAoMHhFRUM2MEYzQyksICgweDdFQkEzQTM4KSwgKDB4RURGRUU5MzApLCAoMHg3RTlENTVGQiksICgweEVEMzdFRjkxKSwgKDB4N0U3RjM5NTQpLCAoMHhFQzcxMjQ0QSksICgweDdFNUZFNDkwKSwgKDB4RUJBQTg5NDQpLAotKDB4N0UzRjU4MDApLCAoMHhFQUU0MjA4QSksICgweDdFMUQ5M0VBKSwgKDB4RUExREVCQzYpLCAoMHg3REZBOThBNyksICgweEU5NTdFRDAwKSwgKDB4N0RENjY2OEQpLCAoMHhFODkyMjYyMSksICgweDdEQjBGREY1KSwgKDB4RTdDQzk5MTIpLCAoMHg3RDhBNUYzQyksICgweEU3MDc0N0I5KSwgKDB4N0Q2MjhBQzcpLCAoMHhFNjQyMzQxQyksICgweDdEMzk4MEVEKSwgKDB4RTU3RDVGRTQpLCAoMHg3RDBGNDIxNyksICgweEU0QjhDRDE2KSwKLSgweDdDRTNDRUIwKSwgKDB4RTNGNDdEOTUpLCAoMHg3Q0I3MjcyMSksICgweEUzMzA3MzQ3KSwgKDB4N0M4OTRCREEpLCAoMHhFMjZDQjAxMCksICgweDdDNUEzRDUyKSwgKDB4RTFBOTM1RjEpLCAoMHg3QzI5RkJFRiksICgweEUwRTYwNjhGKSwgKDB4N0JGODg4MzApLCAoMHhFMDIzMjNFQSksICgweDdCQzVFMjk2KSwgKDB4REY2MDkwMDIpLCAoMHg3QjkyMEI4NiksICgweERFOUU0QzVCKSwgKDB4N0I1RDAzQTEpLCAoMHhERERDNUI0RiksCi0oMHg3QjI2Q0I0OSksICgweEREMUFCRTQxKSwgKDB4N0FFRjYzMjUpLCAoMHhEQzU5Nzc4QiksICgweDdBQjZDQjlBKSwgKDB4REI5ODg4OEUpLCAoMHg3QTdEMDU1OSksICgweERBRDdGM0EyKSwgKDB4N0E0MjEwREUpLCAoMHhEQTE3QkE2MyksICgweDdBMDVFRUE4KSwgKDB4RDk1N0RFNkYpLCAoMHg3OUM4OUY3MSksICgweEQ4OTg2MjFBKSwgKDB4Nzk4QTIzQTgpLCAoMHhEN0Q5NDZDMyksICgweDc5NEE3QzExKSwgKDB4RDcxQThFQkEpLAotKDB4NzkwOUE5MzUpLCAoMHhENjVDM0I5OCksICgweDc4QzdBQjlFKSwgKDB4RDU5RTRFRjkpLCAoMHg3ODg0ODQxOSksICgweEQ0RTBDQjI4KSwgKDB4Nzg0MDMzMjEpLCAoMHhENDIzQjE4MSksICgweDc3RkFCOThBKSwgKDB4RDM2NzA0NEYpLCAoMHg3N0I0MTdENCksICgweEQyQUFDNEVCKSwgKDB4Nzc2QzRFRDkpLCAoMHhEMUVFRjU5RCksICgweDc3MjM1RjM1KSwgKDB4RDEzMzk3RkEpLCAoMHg3NkQ5NDk4MyksICgweEQwNzhBRDkzKSwKLSgweDc2OEUwRUE5KSwgKDB4Q0ZCRTM4QUQpLCAoMHg3NjQxQUYzMiksICgweENGMDQzQTlFKSwgKDB4NzVGNDJDMEIpLCAoMHhDRTRBQjVBNiksICgweDc1QTU4NUQ5KSwgKDB4Q0Q5MUFCNTUpLCAoMHg3NTU1QkQ0NyksICgweENDRDkxRDM3KSwgKDB4NzUwNEQzNEMpLCAoMHhDQzIxMEQ4QiksICgweDc0QjJDODdCKSwgKDB4Q0I2OTdEQTApLCAoMHg3NDVGOUREMyksICgweENBQjI2RkIyKSwgKDB4NzQwQjUzRUQpLCAoMHhDOUZCRTUwRSksCi0oMHg3M0I1RUJDRiksICgweEM5NDVERkVCKSwgKDB4NzM1RjY2MkYpLCAoMHhDODkwNjFEMSksICgweDczMDdDM0M5KSwgKDB4QzdEQjZDNDUpLCAoMHg3MkFGMDVBQiksICgweEM3MjcwMTdBKSwgKDB4NzI1NTJDNzkpLCAoMHhDNjczMjJCOSksICgweDcxRkEzOTQ4KSwgKDB4QzVCRkQyMzIpLCAoMHg3MTlFMkNERSksICgweEM1MEQxMTY0KSwgKDB4NzE0MTA4MDApLCAoMHhDNDVBRTFEMSksICgweDcwRTJDQkNEKSwgKDB4QzNBOTQ1QTEpLAotKDB4NzA4Mzc4RjQpLCAoMHhDMkY4M0UxQiksICgweDcwMjMxMDlDKSwgKDB4QzI0N0NENjIpLCAoMHg2RkMxOTM3NiksICgweEMxOTdGNEJCKSwgKDB4NkY1RjAyQ0YpLCAoMHhDMEU4QjY3RSksICgweDZFRkI1RjFEKSwgKDB4QzAzQTEzN0UpLCAoMHg2RTk2QTk5NSksICgweEJGOEMwREQ4KSwgKDB4NkUzMEUzMkYpLCAoMHhCRURFQTczQSksICgweDZEQ0EwRDI3KSwgKDB4QkUzMUUxQkYpLCAoMHg2RDYyMjdGQSksICgweEJEODVCRTMzKSwKLSgweDZDRjkzNEU4KSwgKDB4QkNEQTNFQUUpLCAoMHg2QzhGMzUzOCksICgweEJDMkY2NTQ0KSwgKDB4NkMyNDI5NjkpLCAoMHhCQjg1MzJDMCksICgweDZCQjgxMkM1KSwgKDB4QkFEQkE5MzQpLCAoMHg2QjRBRjI1OCksICgweEJBMzJDQTQyKSwgKDB4NkFEQ0M5NzYpLCAoMHhCOThBOTdGNiksICgweDZBNkQ5OEExKSwgKDB4QjhFMzEzMTgpLCAoMHg2OUZENjEzMiksICgweEI4M0MzREIxKSwgKDB4Njk4QzI0ODcpLCAoMHhCNzk2MTlDNiksCi0oMHg2OTE5RTMyNiksICgweEI2RjBBODFEKSwgKDB4NjhBNjlFNzIpLCAoMHhCNjRCRUFCOSksICgweDY4MzI1Nzg2KSwgKDB4QjVBN0UzMzEpLCAoMHg2N0JEMEZDQyksICgweEI1MDQ5MzgwKSwgKDB4Njc0NkM3RDEpLCAoMHhCNDYxRkM2QSksICgweDY2Q0Y4MTAzKSwgKDB4QjNDMDFGRTkpLCAoMHg2NjU3M0NENSksICgweEIzMUVGRkYwKSwgKDB4NjVEREZCRDYpLCAoMHhCMjdFOUQ0MyksICgweDY1NjNCRjdFKSwgKDB4QjFERUY5RDIpLAotKDB4NjRFODg5NEEpLCAoMHhCMTQwMTc4QyksICgweDY0NkM1OUNDKSwgKDB4QjBBMUY3MzApLCAoMHg2M0VGMzI4NiksICgweEIwMDQ5QUE5KSwgKDB4NjM3MTE0QUIpLCAoMHhBRjY4MDM3QiksICgweDYyRjIwMUM0KSwgKDB4QUVDQzMzOEIpLCAoMHg2MjcxRkE2OSksICgweEFFMzEyQjk0KSwgKDB4NjFGMTAwMjcpLCAoMHhBRDk2RUQ3NyksICgweDYxNkYxNDhFKSwgKDB4QUNGRDdCMTMpLCAoMHg2MEVDMzgzQSksICgweEFDNjRENTFGKSwKLSgweDYwNjg2Q0MwKSwgKDB4QUJDQ0ZENzUpLCAoMHg1RkUzQjM2NiksICgweEFCMzVGNThDKSwgKDB4NUY1RTBEQzgpLCAoMHhBQTlGQkYzOCksICgweDVFRDc3Qzg2KSwgKDB4QUEwQTVCMkMpLCAoMHg1RTUwMDE0MCksICgweEE5NzVDQjM5KSwgKDB4NURDNzlEOUMpLCAoMHhBOEUyMTEyQyksICgweDVEM0U1MjNFKSwgKDB4QTg0RjJEQjQpLCAoMHg1Q0I0MjBDRCksICgweEE3QkQyMjlBKSwgKDB4NUMyOTBBQTApLCAoMHhBNzJCRjE0OCksCi0oMHg1QjlEMTE2NiksICgweEE2OUI5QjdEKSwgKDB4NUIxMDM1QzcpLCAoMHhBNjBDMjFFOCksICgweDVBODI3OTc4KSwgKDB4QTU3RDg2NDYpLCAoMHg1OUYzREUzMCksICgweEE0RUZDQTUxKSwgKDB4NTk2NDY0OUIpLCAoMHhBNDYyRUVCMiksICgweDU4RDQwRTc1KSwgKDB4QTNENkY1MUYpLCAoMHg1ODQyREQ3RSksICgweEEzNEJERjRCKSwgKDB4NTdCMEQyNjUpLCAoMHhBMkMxQUREQSksICgweDU3MURFRUVEKSwgKDB4QTIzODYyN0IpLAotKDB4NTY4QTM0ODIpLCAoMHhBMUFGRkU4MSksICgweDU1RjVBNEVEKSwgKDB4QTEyODgzOTEpLCAoMHg1NTYwNDBFMiksICgweEEwQTFGMjRGKSwgKDB4NTRDQTBBMkUpLCAoMHhBMDFDNEM1QyksICgweDU0MzMwMkE1KSwgKDB4OUY5NzkzNTYpLCAoMHg1MzlCMkFGQiksICgweDlGMTNDN0RDKSwgKDB4NTMwMjg1MDcpLCAoMHg5RTkwRUI4OCksICgweDUyNjkxMjQxKSwgKDB4OUUwRUZGOUQpLCAoMHg1MUNFRDQ4NiksICgweDlEOEUwNUFEKSwKLSgweDUxMzNDQzhGKSwgKDB4OUQwREZFNTIpLCAoMHg1MDk3RkMzQyksICgweDlDOEVFQjFBKSwgKDB4NEZGQjY1NzIpLCAoMHg5QzEwQ0Q5MCksICgweDRGNUUwOEVCKSwgKDB4OUI5M0E2NDkpLCAoMHg0RUJGRTg4RiksICgweDlCMTc3NkNCKSwgKDB4NEUyMTA1RTQpLCAoMHg5QTlDNDA0OCksICgweDREODE2MkQ4KSwgKDB4OUEyMjA0M0YpLCAoMHg0Q0UxMDAyQiksICgweDk5QThDMzQwKSwgKDB4NEMzRkRGQ0MpLCAoMHg5OTMwN0VDNSksCi0oMHg0QjlFMDNCMSksICgweDk4QjkzODQzKSwgKDB4NEFGQjZDOUIpLCAoMHg5ODQyRjA0OCksICgweDRBNTgxQzgzKSwgKDB4OTdDREE4NDQpLCAoMHg0OUI0MTU2MiksICgweDk3NTk2MUEyKSwgKDB4NDkwRjU3RkYpLCAoMHg5NkU2MUNFRCksICgweDQ4NjlFNjU3KSwgKDB4OTY3M0RCOEMpLCAoMHg0N0MzQzIwMiksICgweDk2MDI5RTk5KSwgKDB4NDcxQ0VEMDUpLCAoMHg5NTkyNjc3MiksICgweDQ2NzU2ODI3KSwgKDB4OTUyMzM2OUQpLAotKDB4NDVDRDM1NkYpLCAoMHg5NEI1MEQ3NCksICgweDQ1MjQ1NkU5KSwgKDB4OTQ0N0VENEQpLCAoMHg0NDdBQ0Q1RCksICgweDkzREJENkFBKSwgKDB4NDNEMDlBRDkpLCAoMHg5MzcwQ0FEQSksICgweDQzMjVDMTAyKSwgKDB4OTMwNkNBRTcpLCAoMHg0MjdBNDE3RCksICgweDkyOUREN0Q1KSwgKDB4NDFDRTFFQ0QpLCAoMHg5MjM1RjMyQyksICgweDQxMjE1OEUzKSwgKDB4OTFDRjFDRTMpLCAoMHg0MDczRjI0NSksICgweDkxNjk1NjdEKSwKLSgweDNGQzVFQ0EwKSwgKDB4OTEwNEEwRjQpLCAoMHgzRjE3NDk5RiksICgweDkwQTBGRDQyKSwgKDB4M0U2ODBBRjMpLCAoMHg5MDNFNkM1RCksICgweDNEQjgzMjRDKSwgKDB4OEZEQ0VGMzcpLCAoMHgzRDA3QzIzQyksICgweDhGN0M4NzNBKSwgKDB4M0M1NkJBQjUpLCAoMHg4RjFEMzQ2MSksICgweDNCQTUxRTREKSwgKDB4OEVCRUY4MTApLCAoMHgzQUYyRUVCQSksICgweDhFNjFEMzMxKSwgKDB4M0E0MDJEQjQpLCAoMHg4RTA1QzZBQSksCi0oMHgzOThDRENGMyksICgweDhEQUFEMzVEKSwgKDB4MzhEOEZFMzIpLCAoMHg4RDUwRkEyQiksICgweDM4MjQ5NDEzKSwgKDB4OENGODNDNjIpLCAoMHgzNzZGOUU4OCksICgweDhDQTA5OUZCKSwgKDB4MzZCQTIwMzQpLCAoMHg4QzRBMTQ0MCksICgweDM2MDQxQUQ3KSwgKDB4OEJGNEFDMDYpLCAoMHgzNTREOTAzMyksICgweDhCQTA2MjIxKSwgKDB4MzQ5NjgyMEEpLCAoMHg4QjREMzc1RiksICgweDMzREVGMjFGKSwgKDB4OEFGQjJDOEUpLAotKDB4MzMyNkUzMjMpLCAoMHg4QUFBNDJFMCksICgweDMyNkU1NTA1KSwgKDB4OEE1QTdBNEQpLCAoMHgzMUI1NEE3OSksICgweDhBMEJENDAzKSwgKDB4MzBGQkM1NDcpLCAoMHg4OUJFNTBDMiksICgweDMwNDFDNzM3KSwgKDB4ODk3MUYxNEIpLCAoMHgyRjg3NTIxNiksICgweDg5MjZCNjVBKSwgKDB4MkVDQzY3QUYpLCAoMHg4OERDQTBBOSksICgweDJFMTEwQUJGKSwgKDB4ODg5M0IxNEEpLCAoMHgyRDU1M0IzNSksICgweDg4NEJFODM4KSwKLSgweDJDOThGQkQxKSwgKDB4ODgwNTQ2ODIpLCAoMHgyQkRDNEU2MyksICgweDg3QkZDQ0Q1KSwgKDB4MkIxRjM0QkMpLCAoMHg4NzdCN0JERCksICgweDJBNjFCMEFGKSwgKDB4ODczODU0NDMpLCAoMHgyOUEzQzQwRiksICgweDg2RjY1NkFDKSwgKDB4MjhFNTcxQTMpLCAoMHg4NkI1ODQwRSksICgweDI4MjZCOTVFKSwgKDB4ODY3NURDNjIpLCAoMHgyNzY3OUUwNiksICgweDg2Mzc2MDlBKSwgKDB4MjZBODIxNzQpLCAoMHg4NUZBMTE0RiksCi0oMHgyNUU4NDU4MSksICgweDg1QkRFRjE5KSwgKDB4MjUyODBDMDUpLCAoMHg4NTgyRkE4QyksICgweDI0Njc3N0QwKSwgKDB4ODU0OTM0ODIpLCAoMHgyM0E2ODhEMyksICgweDg1MTA5Q0Y3KSwgKDB4MjJFNTQxRTApLCAoMHg4NEQ5MzRDMCksICgweDIyMjNBNEQyKSwgKDB4ODRBMkZDNjgpLCAoMHgyMTYxQjM4OSksICgweDg0NkRGNDcyKSwgKDB4MjA5RjZGRTEpLCAoMHg4NDNBMUQ2MiksICgweDFGRENEQkJCKSwgKDB4ODQwNzc3QjkpLAotKDB4MUYxOUY5RjApLCAoMHg4M0Q2MDQzMSksICgweDFFNTZDQTZFKSwgKDB4ODNBNUMyQzUpLCAoMHgxRDkzNTAxMSksICgweDgzNzZCNDJFKSwgKDB4MUNDRjhDQkIpLCAoMHg4MzQ4RDhERiksICgweDFDMEI4MjRFKSwgKDB4ODMxQzMxNEEpLCAoMHgxQjQ3MzJBRSksICgweDgyRjBCRERCKSwgKDB4MUE4MjlGQzApLCAoMHg4MkM2N0YwMCksICgweDE5QkRDQzYzKSwgKDB4ODI5RDc1NTMpLCAoMHgxOEY4Qjg4OCksICgweDgyNzVBMEQxKSwKLSgweDE4MzM2NzEwKSwgKDB4ODI0RjAyMTEpLCAoMHgxNzZERDlFMSksICgweDgyMjk5OTc0KSwgKDB4MTZBODEyRTMpLCAoMHg4MjA1Njc1NCksICgweDE1RTIxM0ZEKSwgKDB4ODFFMjZDMEIpLCAoMHgxNTFCREYxOSksICgweDgxQzBBN0YxKSwgKDB4MTQ1NTc3MUQpLCAoMHg4MUEwMUI4MCksICgweDEzOEVEQkY4KSwgKDB4ODE4MEM2QjYpLCAoMHgxMkM4MTA5MCksICgweDgxNjJBQTBBKSwgKDB4MTIwMTE2RDIpLCAoMHg4MTQ1QzVDOCksCi0oMHgxMTM5RjBBNyksICgweDgxMkExQTM2KSwgKDB4MTA3MjlGRkIpLCAoMHg4MTBGQTc5OCksICgweDBGQUIyNkI5KSwgKDB4ODBGNjZFMzApLCAoMHgwRUUzODdDRCksICgweDgwREU2RTVBKSwgKDB4MEUxQkMzMjYpLCAoMHg4MEM3QTgxMyksICgweDBENTNEQkFGKSwgKDB4ODBCMjFCQjQpLCAoMHgwQzhCRDM1NiksICgweDgwOURDOTcxKSwgKDB4MEJDM0FDMDcpLCAoMHg4MDhBQjE3RSksICgweDBBRkI2N0IyKSwgKDB4ODA3OEQ0MDcpLAotKDB4MEEzMzA4NDQpLCAoMHg4MDY4MzEzQiksICgweDA5NkE5MEFCKSwgKDB4ODA1OEM5NTUpLCAoMHgwOEEyMDBENyksICgweDgwNEE5QzUzKSwgKDB4MDdEOTVCQjYpLCAoMHg4MDNEQUE2RCksICgweDA3MTBBMzM3KSwgKDB4ODAzMUYzQzMpLCAoMHgwNjQ3RDk0OSksICgweDgwMjc3ODcxKSwgKDB4MDU3RUZGREMpLCAoMHg4MDFFMzg5MiksICgweDA0QjYxOERGKSwgKDB4ODAxNjM0M0QpLCAoMHgwM0VEMjc0MyksICgweDgwMEY2QjhEKSwKLSgweDAzMjQyQUY2KSwgKDB4ODAwOURFODEpLCAoMHgwMjVCMjZFOSksICgweDgwMDU4RDMxKSwgKDB4MDE5MjFEMEMpLCAoMHg4MDAyNzdBNyksICgweDAwQzkwRjRGKSwgKDB4ODAwMDlERUIpLCAoMHhGRkZGRkZBMyksICgweDgwMDAwMDAyKSwgKDB4RkYzNkYwRjUpLCAoMHg4MDAwOURFQiksICgweEZFNkRFMzM4KSwgKDB4ODAwMjc3QTYpLCAoMHhGREE0RDk1QiksICgweDgwMDU4RDJGKSwgKDB4RkNEQkQ1NEUpLCAoMHg4MDA5REU3RiksCi0oMHhGQzEyRDkwMiksICgweDgwMEY2QjhBKSwgKDB4RkI0OUU2NjUpLCAoMHg4MDE2MzQ0NCksICgweEZBODBGRjY5KSwgKDB4ODAxRTM4OUEpLCAoMHhGOUI4MjZGQiksICgweDgwMjc3ODZFKSwgKDB4RjhFRjVEMEUpLCAoMHg4MDMxRjNCRiksICgweEY4MjZBNDhFKSwgKDB4ODAzREFBNjkpLCAoMHhGNzVERkY2RCksICgweDgwNEE5QzRFKSwgKDB4RjY5NTZGOTkpLCAoMHg4MDU4Qzk1MCksICgweEY1Q0NGNzAxKSwgKDB4ODA2ODMxNEEpLAotKDB4RjUwNDk3OTMpLCAoMHg4MDc4RDQxOCksICgweEY0M0M1NDNEKSwgKDB4ODA4QUIxNzcpLCAoMHhGMzc0MkNFRSksICgweDgwOURDOTZCKSwgKDB4RjJBQzI0OTUpLCAoMHg4MEIyMUJBRCksICgweEYxRTQzRDFFKSwgKDB4ODBDN0E4MEMpLCAoMHhGMTFDNzg3NyksICgweDgwREU2RTUyKSwgKDB4RjA1NEQ4OEQpLCAoMHg4MEY2NkU0NyksICgweEVGOEQ1RjRCKSwgKDB4ODEwRkE3QjApLCAoMHhFRUM2MEY5RCksICgweDgxMkExQTJEKSwKLSgweEVERkVFOTcyKSwgKDB4ODE0NUM1QkUpLCAoMHhFRDM3RUZCMyksICgweDgxNjJBQTAwKSwgKDB4RUM3MTI0NEMpLCAoMHg4MTgwQzZBQiksICgweEVCQUE4OTI3KSwgKDB4ODFBMDFCNzUpLCAoMHhFQUU0MjAyRCksICgweDgxQzBBODEwKSwgKDB4RUExREVCNEEpLCAoMHg4MUUyNkMyQyksICgweEU5NTdFRDYxKSwgKDB4ODIwNTY3NDgpLCAoMHhFODkyMjY2MiksICgweDgyMjk5OTY3KSwgKDB4RTdDQzk5MzMpLCAoMHg4MjRGMDIwNCksCi0oMHhFNzA3NDdCQiksICgweDgyNzVBMEMzKSwgKDB4RTY0MjMzRTApLCAoMHg4MjlENzU0NSksICgweEU1N0Q1Rjg5KSwgKDB4ODJDNjdGMjcpLCAoMHhFNEI4Q0M5QiksICgweDgyRjBCRTAzKSwgKDB4RTNGNDdERjUpLCAoMHg4MzFDMzEzQiksICgweEUzMzA3Mzg4KSwgKDB4ODM0OEQ4RDApLCAoMHhFMjZDQjAzMSksICgweDgzNzZCNDFFKSwgKDB4RTFBOTM1RDQpLCAoMHg4M0E1QzJCNSksICgweEUwRTYwNjUzKSwgKDB4ODNENjA0MjApLAotKDB4RTAyMzIzOEYpLCAoMHg4NDA3NzdFOCksICgweERGNjA4RjY5KSwgKDB4ODQzQTFEOTIpLCAoMHhERTlFNENCOSksICgweDg0NkRGNDYwKSwgKDB4REREQzVCNkYpLCAoMHg4NEEyRkM1NSksICgweEREMUFCRTYyKSwgKDB4ODREOTM0QUUpLCAoMHhEQzU5Nzc2RSksICgweDg1MTA5Q0U0KSwgKDB4REI5ODg4NzIpLCAoMHg4NTQ5MzQ2RSksICgweERBRDdGMzQ4KSwgKDB4ODU4MkZBQzIpLCAoMHhEQTE3QkFDMSksICgweDg1QkRFRjA1KSwKLSgweEQ5NTdERUNEKSwgKDB4ODVGQTExM0EpLCAoMHhEODk4NjIzQiksICgweDg2Mzc2MDg1KSwgKDB4RDdEOTQ2RTMpLCAoMHg4Njc1REM0RCksICgweEQ3MUE4RTlEKSwgKDB4ODZCNTgzRjgpLCAoMHhENjVDM0I0MCksICgweDg2RjY1NkU5KSwgKDB4RDU5RTRFQTApLCAoMHg4NzM4NTQ4MSksICgweEQ0RTBDQjg0KSwgKDB4ODc3QjdCQzYpLCAoMHhENDIzQjFERCksICgweDg3QkZDQ0JEKSwgKDB4RDM2NzA0NkYpLCAoMHg4ODA1NDY2QSksCi0oMHhEMkFBQzUwQSksICgweDg4NEJFODIwKSwgKDB4RDFFRUY1ODEpLCAoMHg4ODkzQjEzMiksICgweEQxMzM5N0EyKSwgKDB4ODhEQ0EwRUUpLCAoMHhEMDc4QUQzQyksICgweDg5MjZCNkEwKSwgKDB4Q0ZCRTM5MDgpLCAoMHg4OTcxRjEzMiksICgweENGMDQzQUY4KSwgKDB4ODlCRTUwQTgpLCAoMHhDRTRBQjVDNiksICgweDhBMEJEM0U4KSwgKDB4Q0Q5MUFCMzkpLCAoMHg4QTVBN0EzMiksICgweENDRDkxRDFDKSwgKDB4OEFBQTQyQzUpLAotKDB4Q0MyMTBEMzUpLCAoMHg4QUZCMkNEQiksICgweENCNjk3RDRCKSwgKDB4OEI0RDM3QUMpLCAoMHhDQUIyNzAwQiksICgweDhCQTA2MjA0KSwgKDB4QzlGQkU1NjcpLCAoMHg4QkY0QUJFOSksICgweEM5NDVFMDBBKSwgKDB4OEM0QTE0MjMpLCAoMHhDODkwNjFCNiksICgweDhDQTA5OURFKSwgKDB4QzdEQjZDMkEpLCAoMHg4Q0Y4M0M0NCksICgweEM3MjcwMTI2KSwgKDB4OEQ1MEZBN0YpLCAoMHhDNjczMjI2NSksICgweDhEQUFEM0IyKSwKLSgweEM1QkZEMUE1KSwgKDB4OEUwNUM2RkYpLCAoMHhDNTBEMTA5RiksICgweDhFNjFEMzg4KSwgKDB4QzQ1QUUxMEQpLCAoMHg4RUJFRjg2OCksICgweEMzQTk0NjY5KSwgKDB4OEYxRDMzQzgpLCAoMHhDMkY4M0VFMSksICgweDhGN0M4NkEwKSwgKDB4QzI0N0NERjApLCAoMHg4RkRDRUYxNiksICgweEMxOTdGNTQ4KSwgKDB4OTAzRTZDM0IpLCAoMHhDMEU4QjY5QyksICgweDkwQTBGRDIxKSwgKDB4QzAzQTEzOUIpLCAoMHg5MTA0QTBEMiksCi0oMHhCRjhDMERGNiksICgweDkxNjk1NjVBKSwgKDB4QkVERUE3NTgpLCAoMHg5MUNGMUNDMCksICgweEJFMzFFMTZFKSwgKDB4OTIzNUYzMDkpLCAoMHhCRDg1QkRFMiksICgweDkyOUREODM3KSwgKDB4QkNEQTNFNUUpLCAoMHg5MzA2Q0I0OSksICgweEJDMkY2NDg3KSwgKDB4OTM3MENCM0QpLCAoMHhCQjg1MzIwNSksICgweDkzREJENzBFKSwgKDB4QkFEQkE4NzkpLCAoMHg5NDQ3RURCMyksICgweEJBMzJDQjM1KSwgKDB4OTRCNTBEMDkpLAotKDB4Qjk4QTk4N0QpLCAoMHg5NTIzMzYzMSksICgweEI4RTMxMzlFKSwgKDB4OTU5MjY3MDUpLCAoMHhCODNDM0UzNyksICgweDk2MDI5RTczKSwgKDB4Qjc5NjE5RTIpLCAoMHg5NjczREI2NiksICgweEI2RjBBODM5KSwgKDB4OTZFNjFDQzYpLCAoMHhCNjRCRUFENSksICgweDk3NTk2MTdCKSwgKDB4QjVBN0UzNEQpLCAoMHg5N0NEQTg2NyksICgweEI1MDQ5MzM0KSwgKDB4OTg0MkYwNkIpLCAoMHhCNDYxRkMxRiksICgweDk4QjkzODY2KSwKLSgweEIzQzAxRjlEKSwgKDB4OTkzMDdGMzUpLCAoMHhCMzFFRkYzRiksICgweDk5QThDM0IwKSwgKDB4QjI3RTlDOTIpLCAoMHg5QTIyMDRCMCksICgweEIxREVGOTIyKSwgKDB4OUE5QzQxMDkpLCAoMHhCMTQwMTgwQyksICgweDlCMTc3NjUyKSwgKDB4QjBBMUY3QUYpLCAoMHg5QjkzQTVDRiksICgweEIwMDQ5QjI3KSwgKDB4OUMxMENEMTUpLCAoMHhBRjY4MDNGOSksICgweDlDOEVFQUVGKSwgKDB4QUVDQzMzQTUpLCAoMHg5RDBERkUyNyksCi0oMHhBRTMxMkJBRSksICgweDlEOEUwNTgxKSwgKDB4QUQ5NkVEOTEpLCAoMHg5RTBFRkZDMyksICgweEFDRkQ3QUNDKSwgKDB4OUU5MEVCQUYpLCAoMHhBQzY0RDREOCksICgweDlGMTNDODAzKSwgKDB4QUJDQ0ZEMkUpLCAoMHg5Rjk3OTM3RCksICgweEFCMzVGNTQ1KSwgKDB4QTAxQzRDRDgpLCAoMHhBQTlGQkU5MiksICgweEEwQTFGMkNDKSwgKDB4QUEwQTVBODgpLCAoMHhBMTI4ODQwRiksICgweEE5NzVDQzBGKSwgKDB4QTFBRkZERkMpLAotKDB4QThFMjExQTIpLCAoMHhBMjM4NjFGNSksICgweEE4NEYyRTJBKSwgKDB4QTJDMUFENTMpLCAoMHhBN0JEMjMxMCksICgweEEzNEJERUMzKSwgKDB4QTcyQkYxQkMpLCAoMHhBM0Q2RjRGMCksICgweEE2OUI5Qjk2KSwgKDB4QTQ2MkVFODIpLCAoMHhBNjBDMjIwMCksICgweEE0RUZDQTIxKSwgKDB4QTU3RDg2NUUpLCAoMHhBNTdEODY3MCksICgweEE0RUZDQTBGKSwgKDB4QTYwQzIyMTMpLCAoMHhBNDYyRUU3MCksICgweEE2OUI5QkE4KSwKLSgweEEzRDZGNERFKSwgKDB4QTcyQkYxQ0YpLCAoMHhBMzRCREVCMiksICgweEE3QkQyMzIyKSwgKDB4QTJDMUFENDIpLCAoMHhBODRGMkUzRCksICgweEEyMzg2MUU0KSwgKDB4QThFMjExQjUpLCAoMHhBMUFGRkY0NSksICgweEE5NzVDQUE5KSwgKDB4QTEyODgzRkUpLCAoMHhBQTBBNUE5QiksICgweEEwQTFGMkJCKSwgKDB4QUE5RkJFQTUpLCAoMHhBMDFDNENDNyksICgweEFCMzVGNTU5KSwgKDB4OUY5NzkzNkMpLCAoMHhBQkNDRkQ0MSksCi0oMHg5RjEzQzdGMiksICgweEFDNjRENEVCKSwgKDB4OUU5MEVCOUUpLCAoMHhBQ0ZEN0FERiksICgweDlFMEVGRkIzKSwgKDB4QUQ5NkVEQTUpLCAoMHg5RDhFMDU3MSksICgweEFFMzEyQkMyKSwgKDB4OUQwREZFMTYpLCAoMHhBRUNDMzNCOSksICgweDlDOEVFQURGKSwgKDB4QUY2ODA0MEQpLCAoMHg5QzEwQ0QwNSksICgweEIwMDQ5QjNCKSwgKDB4OUI5M0E1QkYpLCAoMHhCMEExRjdDMyksICgweDlCMTc3NjQyKSwgKDB4QjE0MDE4MjApLAotKDB4OUE5QzQwRjkpLCAoMHhCMURFRjkzNiksICgweDlBMjIwNEExKSwgKDB4QjI3RTlDQTYpLCAoMHg5OUE4QzNBMSksICgweEIzMUVGRjU0KSwgKDB4OTkzMDdGMjYpLCAoMHhCM0MwMUZCMiksICgweDk4QjkzODU3KSwgKDB4QjQ2MUZDMzMpLCAoMHg5ODQyRjA1QyksICgweEI1MDQ5MzQ5KSwgKDB4OTdDREE4NTgpLCAoMHhCNUE3RTM2MiksICgweDk3NTk2MTZDKSwgKDB4QjY0QkVBRUEpLCAoMHg5NkU2MUNCOCksICgweEI2RjBBODRFKSwKLSgweDk2NzNEQjU3KSwgKDB4Qjc5NjE5RjcpLCAoMHg5NjAyOUU2NCksICgweEI4M0MzRTRDKSwgKDB4OTU5MjY2RjcpLCAoMHhCOEUzMTNCNCksICgweDk1MjMzNjIzKSwgKDB4Qjk4QTk4OTMpLCAoMHg5NEI1MEUxMyksICgweEJBMzJDOTlFKSwgKDB4OTQ0N0VEQTUpLCAoMHhCQURCQTg4RiksICgweDkzREJENzAwKSwgKDB4QkI4NTMyMUEpLCAoMHg5MzcwQ0IzMCksICgweEJDMkY2NDlEKSwgKDB4OTMwNkNCM0MpLCAoMHhCQ0RBM0U3NCksCi0oMHg5MjlERDgyOSksICgweEJEODVCREY4KSwgKDB4OTIzNUYyRkMpLCAoMHhCRTMxRTE4NCksICgweDkxQ0YxQ0IzKSwgKDB4QkVERUE3NkUpLCAoMHg5MTY5NTY0RCksICgweEJGOEMwRTBDKSwgKDB4OTEwNEEwQzUpLCAoMHhDMDNBMTNCMiksICgweDkwQTBGRDE0KSwgKDB4QzBFOEI2QjIpLCAoMHg5MDNFNkMyRiksICgweEMxOTdGNTVGKSwgKDB4OEZEQ0VGMDkpLCAoMHhDMjQ3Q0UwNyksICgweDhGN0M4Njk0KSwgKDB4QzJGODNFRjgpLAotKDB4OEYxRDM0QUQpLCAoMHhDM0E5NDRCQyksICgweDhFQkVGODVDKSwgKDB4QzQ1QUUxMjMpLCAoMHg4RTYxRDM3QyksICgweEM1MEQxMEI2KSwgKDB4OEUwNUM2RjQpLCAoMHhDNUJGRDFCQyksICgweDhEQUFEM0E2KSwgKDB4QzY3MzIyN0MpLCAoMHg4RDUwRkE3MyksICgweEM3MjcwMTNEKSwgKDB4OENGODNDMzkpLCAoMHhDN0RCNkM0MSksICgweDhDQTA5OUQzKSwgKDB4Qzg5MDYxQ0QpLCAoMHg4QzRBMTQxOCksICgweEM5NDVFMDIxKSwKLSgweDhCRjRBQkRGKSwgKDB4QzlGQkU1N0UpLCAoMHg4QkEwNjFGOSksICgweENBQjI3MDIyKSwgKDB4OEI0RDM3MzgpLCAoMHhDQjY5N0U0QyksICgweDhBRkIyQzY4KSwgKDB4Q0MyMTBFMzcpLCAoMHg4QUFBNDI1NCksICgweENDRDkxRTFFKSwgKDB4OEE1QTdBOEQpLCAoMHhDRDkxQUE2NiksICgweDhBMEJENDQyKSwgKDB4Q0U0QUI0RjEpLCAoMHg4OUJFNTEwMCksICgweENGMDQzQTI0KSwgKDB4ODk3MUYxODgpLCAoMHhDRkJFMzgzMyksCi0oMHg4OTI2QjY5NyksICgweEQwNzhBRDUzKSwgKDB4ODhEQ0EwRTQpLCAoMHhEMTMzOTdCQSksICgweDg4OTNCMTI4KSwgKDB4RDFFRUY1OTkpLCAoMHg4ODRCRTgxNyksICgweEQyQUFDNTIyKSwgKDB4ODgwNTQ2NjEpLCAoMHhEMzY3MDQ4NyksICgweDg3QkZDQ0I1KSwgKDB4RDQyM0IxRjUpLCAoMHg4NzdCN0JCRCksICgweEQ0RTBDQjlDKSwgKDB4ODczODU0MjQpLCAoMHhENTlFNEZBQSksICgweDg2RjY1NjhFKSwgKDB4RDY1QzNDNEEpLAotKDB4ODZCNTgzOUUpLCAoMHhENzFBOEZBOCksICgweDg2NzVEQzk1KSwgKDB4RDdEOTQ2MDgpLCAoMHg4NjM3NjBDQyksICgweEQ4OTg2MTYwKSwgKDB4ODVGQTExODApLCAoMHhEOTU3RERGMSksICgweDg1QkRFRjQ5KSwgKDB4REExN0I5RTUpLCAoMHg4NTgyRkFCQiksICgweERBRDdGMzYwKSwgKDB4ODU0OTM0NjcpLCAoMHhEQjk4ODg4QSksICgweDg1MTA5Q0REKSwgKDB4REM1OTc3ODcpLCAoMHg4NEQ5MzRBNyksICgweEREMUFCRTdBKSwKLSgweDg0QTJGQzRGKSwgKDB4REREQzVCODgpLCAoMHg4NDZERjQ1QSksICgweERFOUU0Q0QyKSwgKDB4ODQzQTFENEIpLCAoMHhERjYwOTA3QSksICgweDg0MDc3N0EyKSwgKDB4RTAyMzI0QTApLCAoMHg4M0Q2MDNEQyksICgweEUwRTYwNzY0KSwgKDB4ODNBNUMyRUMpLCAoMHhFMUE5MzRGNCksICgweDgzNzZCNDU0KSwgKDB4RTI2Q0FGNTEpLCAoMHg4MzQ4RDkwNCksICgweEUzMzA3MkE3KSwgKDB4ODMxQzMxNkQpLCAoMHhFM0Y0N0QxNCksCi0oMHg4MkYwQkRGRSksICgweEU0QjhDQ0I0KSwgKDB4ODJDNjdGMjEpLCAoMHhFNTdENUZBMiksICgweDgyOUQ3NTQwKSwgKDB4RTY0MjMzRjkpLCAoMHg4Mjc1QTBCRSksICgweEU3MDc0N0Q0KSwgKDB4ODI0RjAyMDApLCAoMHhFN0NDOTk0QyksICgweDgyMjk5OTYyKSwgKDB4RTg5MjI2N0MpLCAoMHg4MjA1Njc0MyksICgweEU5NTdFRDdBKSwgKDB4ODFFMjZCRkIpLCAoMHhFQTFERUM1RiksICgweDgxQzBBN0UxKSwgKDB4RUFFNDIxNDMpLAotKDB4ODFBMDFCNDgpLCAoMHhFQkFBOEEzRCksICgweDgxODBDNkNGKSwgKDB4RUM3MTIzNjgpLCAoMHg4MTYyQUEyMiksICgweEVEMzdFRUNGKSwgKDB4ODE0NUM1REYpLCAoMHhFREZFRTg4RSksICgweDgxMkExQTRDKSwgKDB4RUVDNjBFQjkpLCAoMHg4MTBGQTdBRCksICgweEVGOEQ1RjY1KSwgKDB4ODBGNjZFNDQpLCAoMHhGMDU0RDhBNiksICgweDgwREU2RTRGKSwgKDB4RjExQzc4OTEpLCAoMHg4MEM3QTgwOSksICgweEYxRTQzRDM4KSwKLSgweDgwQjIxQkFBKSwgKDB4RjJBQzI0QUYpLCAoMHg4MDlEQzk2OCksICgweEYzNzQyRDA4KSwgKDB4ODA4QUIxNzUpLCAoMHhGNDNDNTQ1NiksICgweDgwNzhEM0ZGKSwgKDB4RjUwNDk4QUIpLCAoMHg4MDY4MzEzNCksICgweEY1Q0NGODE5KSwgKDB4ODA1OEM5M0IpLCAoMHhGNjk1NzBCMiksICgweDgwNEE5QzVFKSwgKDB4Rjc1REZFODcpLCAoMHg4MDNEQUE3NyksICgweEY4MjZBM0E4KSwgKDB4ODAzMUYzQ0IpLCAoMHhGOEVGNUMyOCksCi0oMHg4MDI3Nzg3OSksICgweEY5QjgyNjE1KSwgKDB4ODAxRTM4OTkpLCAoMHhGQTgwRkY4MiksICgweDgwMTYzNDQzKSwgKDB4RkI0OUU2N0YpLCAoMHg4MDBGNkI4QSksICgweEZDMTJEOTFCKSwgKDB4ODAwOURFN0UpLCAoMHhGQ0RCRDU2OCksICgweDgwMDU4RDJGKSwgKDB4RkRBNEQ5NzUpLCAoMHg4MDAyNzdBNiksICgweEZFNkRFMzUyKSwgKDB4ODAwMDlERUEpLCAoMHhGRjM2RjEwRiksICgweDY1NkRCQ0M4KSwgKDB4N0E5MTA4Q0EpLAotKDB4QkEzNjcwRjApLCAoMHg2OTkxOTVBMiksICgweDE3MkQyRkQwKSwgKDB4QkUzODZENTEpLCAoMHhDNEFFQTUxQyksICgweDJBQTc3RDdEKSwgKDB4OEI1MUQzQjQpLCAoMHhDRjQ5MEZEOSksICgweDRBN0JFQkNBKSwgKDB4OTEwNzJFMDQpLCAoMHhBMTc1ODcyRCksICgweDU0NDY0QTlFKSwgKDB4NjdBNkNEMDIpLCAoMHg5RTgyMDRBOCksICgweDEwQzE0QkY2KSwgKDB4NzVBQ0RBMTYpLCAoMHhGNzhEN0IzRSksICgweDZBQjNDRjY5KSwKLSgweEE0RDhDNzU2KSwgKDB4Q0I4RkNEMjQpLCAoMHg3NUNDNTcxMyksICgweEMxM0U1QUUzKSwgKDB4QThDMzE3NkQpLCAoMHg1RUU2RDQxNiksICgweDgwQzVEQTBFKSwgKDB4RDg0QTAwN0MpLCAoMHg3MTlFNzNDMCksICgweDc2NTAxNEIwKSwgKDB4MEEzOTFCQzgpLCAoMHg2MEE3MDIyMyksICgweDU0Q0RBNDZCKSwgKDB4NDYwNkQ0NTUpLCAoMHhBNjA2RkIyQSksICgweEU0Q0UxNTU3KSwgKDB4NzMyNDA4MjApLCAoMHg4MDM3QThCNCksCi0oMHhBMUQ4ODAzMiksICgweDc1QTNGMUM3KSwgKDB4MzJCQjAzNzApLCAoMHg1Rjg1MDI0MiksICgweDg1RUM4RjVCKSwgKDB4OEFBMkIzM0MpLCAoMHg5MUIzNzBDMiksICgweDkzOEU5RERCKSwgKDB4RTZCNjk4M0UpLCAoMHg0OTYwMkFBOSksICgweDZDMkQ5OTY1KSwgKDB4NUIxNkFFNzIpLCAoMHg2OTU3OUI2QiksICgweENEM0FCNDE1KSwgKDB4NUI3Q0YwM0MpLCAoMHhEN0IyNzYzNyksICgweDJENjlCNzlBKSwgKDB4MzIzN0I0NjgpLAotKDB4NUY5NEQ2NTApLCAoMHhBQjM3MTA2RCksICgweDBCODMxNDU3KSwgKDB4QUZEODAzMzQpLCAoMHhCNUEwQjI3QiksICgweDE2Qjc2M0U5KSwgKDB4M0I0NTQ3NTYpLCAoMHgzMTY3Q0Q5OCksICgweDcwNzIzOUFGKSwgKDB4MEE0RjEzMkEpLCAoMHgyNzgyQzhDQSksICgweDFBQzFERDRFKSwgKDB4MTIxQ0FERkUpLCAoMHg5QTkxMUQ5MCksICgweDAxNTdBREQ2KSwgKDB4MTU1OUJCOTUpLCAoMHgyODU0Qzg0QSksICgweEQ5N0UzNjg1KSwKLSgweDc2MzA4QUEwKSwgKDB4ODA1MEYxRkYpLCAoMHgyMTgwNjEyRiksICgweEZGRkI4QTFBKSwgKDB4MEJDMUZGRkYpLCAoMHgxMDMyODQ2QyksICgweDAwMkEzMEMyKSwgKDB4NjU0QzU4RjIpLCAoMHhBNThBQkFDQyksICgweEMzRTk4MzFDKSwgKDB4Mjc1MzFCOEMpLCAoMHhBREJCODY5OCksICgweDA2ODAxQzEyKSwgKDB4QUZBRUVDOEUpLCAoMHhDMzI2OTI5MSksICgweDVDMkUwMUEwKSwgKDB4NEE2MTA4N0MpLCAoMHg2MEYyMUU3QiksCi0oMHg2QjkyQzY3MCksICgweEM5ODcyMzY0KSwgKDB4NDg0NjRDOTcpLCAoMHgzNDJFNjQ5OSksICgweEE2ODQ5QTQ4KSwgKDB4RjAzNDAwMkQpLCAoMHg0NDJCNDQ4OCksICgweDE2MEIwNDQyKSwgKDB4RUQ1MkNGNTApLCAoMHg0RDQzNkMwNSksICgweDY4NDFDNjAyKSwgKDB4QTE0RjhBODIpLCAoMHg5QUMyMERERSksICgweDVCOTI1MUVFKSwgKDB4OEVEOTk4RDUpLCAoMHg5MkI2RUEyMiksICgweDVCMTM2QzRCKSwgKDB4OTdDMEE0NUIpLAotKDB4NDU5Qzk0QTQpLCAoMHhDRDk1ODNDMCksICgweDZDNTg5REY4KSwgKDB4M0M5QTE3Q0QpLCAoMHg5MDY2MDFCRiksICgweDg0RDYxMkUxKSwgKDB4NjcxNzZGNUYpLCAoMHhFNDdENUE0NCksICgweDM3Mzg2RDVFKSwgKDB4OTJBNEQ2MUIpLCAoMHgyOEM1MTNGQiksICgweDZFOTE1OTlBKSwgKDB4NjUzREExNkQpLCAoMHhBMTlDMzlDMCksICgweDQyNzY5MEFEKSwgKDB4NzAwNTQ2MUMpLCAoMHhBQjZDMUVFNCksICgweDgwQkFDQzJEKSwKLSgweDc4MEExOEM1KSwgKDB4ODIyREM3NzQpLCAoMHhCNjA0MzAzNiksICgweDAwNzg5QzE4KSwgKDB4MTA2Qzk1MDcpLCAoMHg0MTAzQTg2NCksICgweEM1MTE1ODVCKSwgKDB4RjNFOUI3RjgpLCAoMHgyNEQ3OUM0RCksICgweDMxQjIwRUI1KSwgKDB4QjFDMDQ4M0UpLCAoMHhFMjVDNTZCOSksICgweDk2OTkxMDk2KSwgKDB4N0NENDEyMUYpLCAoMHg4QTNCODNGNCksICgweDcwNDI3MUMyKSwgKDB4QjVDMjZBQ0MpLCAoMHgyQjEzMUFGMCksCi0oMHg1NDlDQjE2QyksICgweDc0NjQ5RTY5KSwgKDB4RDhENDhBREUpLCAoMHgxMjUzQUVERCksICgweDgwNDEwRkQyKSwgKDB4NUIzNjg4OUQpLCAoMHg4ODBDRTFFNyksICgweDU2QzQ5OEU3KSwgKDB4RkEyQkFBQjIpLCAoMHhENDE1NEY1QyksICgweDc5NTE2RUVEKSwgKDB4QTQyRkRBN0QpLCAoMHgyNzhEMjg3MyksICgweDE5MTIxNTM1KSwgKDB4OUM2RUM2QzcpLCAoMHg0MDIzNDBDQiksICgweDVBNkEzMkIzKSwgKDB4RTQzNDVGMjcpLAotKDB4OERDMkQ5MDEpLCAoMHgwMkU3Rjg4RSksICgweDdCM0M2QkVCKSwgKDB4RTA5NDZBNEYpLCAoMHg5NDUyODg2QyksICgweEZGMkY2MTg3KSwgKDB4MkY4MDUwRjEpLCAoMHgyQTIxN0M2MSksICgweDBBQjIxNTk0KSwgKDB4ODAxMTQ1QzQpLCAoMHgxQ0YyMDBBNSksICgweDgyQzU0NEYxKSwgKDB4Q0YzQzUwQjApLCAoMHhENTc3RkVGNyksICgweDYwQUQzQzZFKSwgKDB4OTFBRkY3OUUpLCAoMHgwNzA3MjNCMyksICgweDU4NzBFQ0Y2KSwKLSgweDY0QzIyNEUyKSwgKDB4MjRGQjFFQzgpLCAoMHhDMzQ4MTA0OCksICgweDE1MUFCRjNDKSwgKDB4MTM2QUMyMTkpLCAoMHg0NzE2Q0VEMSksICgweEM4QjhDRTRFKSwgKDB4MUQxNjgyMTApLCAoMHg5MjMzNEE4MSksICgweDkwREM5MTBDKSwgKDB4NDlBMDAyMjApLCAoMHhFNUYyQzgzMSksICgweEI2N0RDNzg1KSwgKDB4M0M0OTUxNzQpLCAoMHgwRDFGNEMyQSksICgweDNBRDc4N0ZEKSwgKDB4RTlDOUZCMjcpLCAoMHg3REZDMjcxMyksCi0oMHhFQjM5QzRCMyksICgweDk2Rjc1RjE4KSwgKDB4ODgzQ0NDNDcpLCAoMHg5MTM5MEJEMSksICgweDBFRTI1RjZEKSwgKDB4NkI2ODhFRjApLCAoMHgyQzg1NTdEQyksICgweEU4MEM5MTcyKSwgKDB4REU2M0RFMDYpLCAoMHgzRTFCNzA3QiksICgweEIyQ0YyRTc2KSwgKDB4NDkwRDFERjMpLCAoMHhDRDFCNTFFMSksICgweEMyMjhGMEY5KSwgKDB4RUVFMkEwMEEpLCAoMHgwODFEODM0QSksICgweDFEMkMxNDAzKSwgKDB4MDgzRkU5NDApLAotKDB4NzYxNEVEQTApLCAoMHg4MjgyMDk1QSksICgweEE3QzA4ODIxKSwgKDB4NENENDdEMjApLCAoMHgzMjI5OTE5MSksICgweDUyQTAzMEU2KSwgKDB4REY3Q0I3NkUpLCAoMHgyMzJFRDQ0QiksICgweDhEQUExNTBBKSwgKDB4MUI1OTNDNTEpLCAoMHg0NDlDQkE4MiksICgweEFCRTZEM0M0KSwgKDB4Q0NGNkY1QzMpLCAoMHg5MDY0QzFDMiksICgweDAzMUZGNTlDKSwgKDB4NDE1OUZFNEUpLCAoMHg0MjE0ODJDMCksICgweDIwRjZGMDBBKSwKLSgweEI4NjZDQTQ5KSwgKDB4NzVBNjZGQUEpLCAoMHg1NDUzNTE1RiksICgweEI1NDVENDg2KSwgKDB4ODg1RDk0OTMpLCAoMHhFRUM0RUVCNCksICgweDg4RjlDODkzKSwgKDB4QkJBQTM4QjQpLCAoMHg1QTU3QkE4MyksICgweDEyRTg0OENDKSwgKDB4MkZCNjIxNjApLCAoMHg4NDBBMUE1NCksICgweDJBN0FFREQ2KSwgKDB4ODlBRjJEQkQpLCAoMHhDOEJBQUUyRSksICgweDU2RUVCRDc1KSwgKDB4RTU5NUI4NkQpLCAoMHhFRUIxMjNDNiksCi0oMHgzRjk0RUJDMSksICgweDc4Q0ZCRUUyKSwgKDB4Q0Y5MDFGMTEpLCAoMHg1QTM1QTM1MCksICgweERBMjJDQjU4KSwgKDB4QkU0QjgyODcpLCAoMHgyNUUwNzhDMCksICgweDJCRDRGMEQzKSwgKDB4NkE0NjRCOTkpLCAoMHg0ODg0QjE1NiksICgweEYxRkY3NjMwKSwgKDB4QzEzMjgwNTApLCAoMHhEODRDMjE2QyksICgweDg0QTREOTQyKSwgKDB4MjE1N0EwQTApLCAoMHhGMzBBMTQxMiksICgweDU0QUY2MDExKSwgKDB4MDBENzA1NDIpLAotKDB4QkRBQkU3REIpLCAoMHgxRkYzNTM0QyksICgweEQ4NjcyQjRFKSwgKDB4N0JFM0JCM0EpLCAoMHhDNTU5NTU0MCksICgweDE2MUUxQkZGKSwgKDB4RDQzNzIzMDkpLCAoMHg3QkMyRUQ1MiksICgweEMxQzYzNkVEKSwgKDB4NEREMzJBQTQpLCAoMHg4NjE2MzI0NiksICgweDYxNEVGNjg4KSwgKDB4NEVCNDQyNzApLCAoMHg4OEVEMDc3QyksICgweDJGMjI5NDY2KSwgKDB4MUE1ODUyMDEpLCAoMHg2NUJCMkVFMiksICgweERCQURBMEREKSwKLSgweEU1MDk5NUNCKSwgKDB4Q0ExRTI3NjApLCAoMHg1ODNGRDgxRiksICgweEU0OEQ0ODU5KSwgKDB4QzIwMDYxNTIpLCAoMHg4RjFGNzcwQyksICgweDI3Q0FBODZGKSwgKDB4OTYxMEI4NDUpLCAoMHhGQzI1QkNFMyksICgweDM3QjhCMzlGKSwgKDB4MTBEQ0NERDEpLCAoMHhENTdBNENBQiksICgweDdENTQzREU4KSwgKDB4NkY0NUI5NTgpLCAoMHgxMkYwQjk3OSksICgweDgxOEU3OUY5KSwgKDB4QjRCMkIwMUYpLCAoMHhGMzAzNTkwMSksCi0oMHgzNzJGN0JEOSksICgweDVENTkyRTY3KSwgKDB4REI1QTU1MkYpLCAoMHg2RTYxRTYyNSksICgweDRFOEE2QTQyKSwgKDB4MjQ1OEFEQjgpLCAoMHg1RjEyNTI4QyksICgweDI3MkIzQURFKSwgKDB4REU2NjZBODMpLCAoMHg3RjE4Q0ZENyksICgweDJGODc3REQ4KSwgKDB4RDczRkZGQjYpLCAoMHg3OTg2Nzk1NiksICgweDRFMDVGQ0FEKSwgKDB4MTlFNzhFRUUpLCAoMHhFMUJBNjUxMiksICgweDk5RjZGMDkxKSwgKDB4OTE2OTA1MTYpLAotKDB4MTZBRTQwNDEpLCAoMHgwNEI5NjgwNSksICgweDdDQTA1MkZDKSwgKDB4QTREMDVFRkQpLCAoMHg0MTNEMUYwNCksICgweDUzRTkxQ0MwKSwgKDB4NkY4N0EwODIpLCAoMHg2MDRGRDIwMiksICgweDBCMzY4RDlGKSwgKDB4RDVGMjJFNUMpLCAoMHgyQkU1QTc0RSksICgweDJGNjlFQURFKSwgKDB4OEJFNTM3RTEpLCAoMHg5Njk3NTc4OSksICgweDM2NzVBM0EwKSwgKDB4MEEyNzJCNzEpLCAoMHg3NTRCMUQ2MSksICgweDk4NjAwNTgxKSwKLSgweDY1OUEyQkUzKSwgKDB4QjIxQkVGNTQpLCAoMHhGMjYzNTFCMCksICgweDFDNTk5NTczKSwgKDB4NkI0MjNCNTkpLCAoMHhFQTM3MUM5NiksICgweEM5QkRBNDk5KSwgKDB4RERGMjVGMzcpLCAoMHhGQkNBQzRBRCksICgweDQwQ0E3ODhCKSwgKDB4MTNCQzM5ODEpLCAoMHg0MTc2REE1OCksICgweEQ4NDhEQTc0KSwgKDB4OTQ3NDA2NDIpLCAoMHg1NEZENTQ3OSksICgweDcxNTAyMzYyKSwgKDB4MjVFODFDRjkpLCAoMHg1MzI0OTU2MiksCi0oMHg1MjgxNDgyNyksICgweDU1REM1RjJDKSwgKDB4ODgyNUJDNTApLCAoMHg4RTREMDREOSksICgweDgwNTBGMUZGKSwgKDB4MjEyQ0MxM0UpLCAoMHgwMEMwRDg0QyksICgweDA3NzExMDAzKSwgKDB4NDA2QTVGNDUpLCAoMHhFRDBBOThERSksICgweDhBNjE5NzMxKSwgKDB4Nzk2QTNCMDQpLCAoMHg3RUFFQ0Y3MSksICgweDdERjNEQUJFKSwgKDB4MkIwRkZCNEEpLCAoMHhCQThBM0ZCOCksICgweDYyMDJGOEYyKSwgKDB4NjMyQzM3QjIpLAotKDB4MjA1MjcxQUEpLCAoMHhCQTFDNDM4QyksICgweEFBMUMxMTgyKSwgKDB4RTY0NDJBNjUpLCAoMHhENzM2RTA0MyksICgweDk1NzE1QzVDKSwgKDB4M0Q2MDRDMjgpLCAoMHhEMjFEMEQ3NCksICgweEExRkIwQzIxKSwgKDB4Q0U4RjA2NUQpLCAoMHhCOEIzNjQ2MyksICgweDdGNzg4QzMzKSwgKDB4ODRBQjUzQTUpLCAoMHg0QjMzQUY0NiksICgweDQwQzI3MzZBKSwgKDB4MEQ2NTcxQjcpLCAoMHhGQzhEODI5MiksICgweDlEMUM1MTgyKSwKLSgweEY3QjY3MEUyKSwgKDB4QkIyQjlFOTEpLCAoMHgxMzc4NTFENSksICgweEJDRjg3Q0E4KSwgKDB4RTA4MkE3QTYpLCAoMHg1MDI0MDRFNSksICgweDUwMjVBNkUwKSwgKDB4MjU0OTRFQTYpLCAoMHg1QTZBOEExNCksICgweEUzMDFBNjg5KSwgKDB4NzBDQkVFNkIpLCAoMHhDODA2NDRDMSksICgweEU5OTE0Q0U2KSwgKDB4OTQ4MUYxRTYpLCAoMHhCOUU0REEzNCksICgweDU4NEIxRUQ4KSwgKDB4QUNDMzk2NDgpLCAoMHgzMUVGQ0Q2MiksCi0oMHgwN0M4MkFFOSksICgweEVFOUQ5MEU1KSwgKDB4NTlCQUVDNzUpLCAoMHg0MDE3OEIwRSksICgweDlGREMxQzlDKSwgKDB4RjNBNjQ4OEYpLCAoMHg0QjZDMTM2NyksICgweDlGN0RGMTA5KSwgKDB4Q0JERjhFREYpLCAoMHhCQTc2RUQzMyksICgweEYxNURCQjlGKSwgKDB4RDQ4QTE5N0YpLCAoMHhGMTFFNzVFRSksICgweEE3NkI0NzlCKSwgKDB4NzA2REU3OEIpLCAoMHg2NTU5QUM2NSksICgweEMwMTNDMTgyKSwgKDB4NDYxRTkzQzcpLAotKDB4QTk4OUVBRjEpLCAoMHg1OTQ0OEMwMCksICgweDcyMUZBQzM4KSwgKDB4NTQ2REVBNzkpLCAoMHgyMjNGNjdDMCksICgweDU0MzQ2NDdDKSwgKDB4QjNFRjRGMEEpLCAoMHhENEZBRjFGMSksICgweDBCRDRFMzhBKSwgKDB4RkY2MTUyN0UpLCAoMHhENkVBNUREMiksICgweDY0NEM3MTA1KSwgKDB4MzFBRTIxODkpLCAoMHgxMUVDMEExQSksICgweDE4QjNBRDgwKSwgKDB4NDdEMEU4MEEpLCAoMHg3NzNEOEJCMiksICgweEVGQTY3NDdFKSwKLSgweEYyM0RFOEIwKSwgKDB4MDI2QkIxRTcpLCAoMHgwM0MxNDA2MCksICgweEMxOTk3REY3KSwgKDB4OTU5ODZCOUMpLCAoMHg4QTVENjE3MCksICgweDU0REIzQTU2KSwgKDB4MjI5NjFENDEpLCAoMHg0NjgxMzQ3MSksICgweEFCRUQxNkE0KSwgKDB4RDFGODNFOEMpLCAoMHgyNTk0QUNBQyksICgweDFENTU2MEVBKSwgKDB4MDQzMkVGRjQpLCAoMHhBMzg5RDdFOCksICgweEFGRTkyQzYyKSwgKDB4RkJCQUYxRTcpLCAoMHg0MkQwRDBBMSksCi0oMHhBMkMzRUNCMiksICgweDYwM0RENjM1KSwgKDB4RUJCQzU5MTUpLCAoMHg1QjBDN0NFMCksICgweDhEMDM2NDBDKSwgKDB4MjJFMjk4REIpLCAoMHgzOENFM0JEQyksICgweDIxRTZCNkI0KSwgKDB4Qzk3NDJDM0YpLCAoMHg0QkRGNzQ0OCksICgweEJBRDA5RDAwKSwgKDB4RUQ2QTgzOTcpLCAoMHhGNkY4MDAxQSksICgweDMxRTM1OTFFKSwgKDB4QUVDMzdFRkUpLCAoMHgyMkQ5QUQwNiksICgweDVFMjU0QUVDKSwgKDB4RDg1MkQzMkUpLAotKDB4RTFDOTY4QUUpLCAoMHhBM0MzQzI2NSksICgweEQ2N0JENzhBKSwgKDB4RjFGRjlEOEMpLCAoMHhDMDNBODA1MCksICgweDg0N0EyMUZDKSwgKDB4ODEwRURBNUQpLCAoMHg2MzgwODk1MSksICgweEM4RkU5RTlFKSwgKDB4RkI2REQzRTUpLCAoMHg3N0JEN0EwMyksICgweDZEQzE0Njc3KSwgKDB4RkY4MUQ4MzEpLCAoMHg0MzIwMTEwMCksICgweEE3OEUxNkZFKSwgKDB4MzkzQ0QwQTApLCAoMHg1MTRGNkRERCksICgweDQyN0JBNEJDKSwKLSgweEVCRTdBNjc2KSwgKDB4Qjc3MTYzOUIpLCAoMHg4REFCQjlFNyksICgweDgxMkZBNUFEKSwgKDB4M0YxMDIxMjApLCAoMHg2MEU0MjQ1NCksICgweEVGRkJGRkM1KSwgKDB4QkVCMUQ1REQpLCAoMHg3QTU5RERGRCksICgweEU4OTY4RDdBKSwgKDB4OEFBRDM0NjIpLCAoMHhBQjY1MzI3RCksICgweDBDRjJFQ0ZCKSwgKDB4RkEzMjQ5QTQpLCAoMHg5N0ZDM0E0MiksICgweDMxNEE3MDg5KSwgKDB4Mjk5MUU2REMpLCAoMHhBOTg2OTNDNCksCi0oMHg2NUVCMjAxMSksICgweENCNEQ4NTk0KSwgKDB4MUFBRkYxNEUpLCAoMHgxRDBEMDQ5MiksICgweDJFNUE3ODREKSwgKDB4QUU0RUM3MzgpLCAoMHhGMTZENjY3QSksICgweEIwQzI2MDMwKSwgKDB4QURBM0RGQzkpLCAoMHg0RUQ4NzRFNSksICgweEQ0NDFBNkFFKSwgKDB4MTlFM0FDMDUpLCAoMHhDNkI4NjVEQyksICgweEU4RTQyODVBKSwgKDB4OTkyNDhDMkIpLCAoMHhDMjk4MTEyMiksICgweDFCMDE0Mjg4KSwgKDB4NDQyQTA1ODApLAotKDB4ODRBMEExQzEpLCAoMHgyMTZGMDI0OCksICgweDIwMkU1NjAyKSwgKDB4RUFFQkFBQ0EpLCAoMHhERDVBQkVFNyksICgweDhCOUM0QjQzKSwgKDB4NUQ1RDQ2RDcpLCAoMHg4RkJFN0MxRCksICgweDZGOUNBQjg3KSwgKDB4QjBBQjBBQUUpLCAoMHg5OEJDNzkzNiksICgweEYyNTFCOTExKSwgKDB4NDQ2OUYyRDEpLCAoMHhBOTA5OTA4OCksICgweEQyMTlCRDY2KSwgKDB4NzQ5MEFFMjIpLCAoMHhCQzBBOTgyMCksICgweDExOUQwMTM2KSwKLSgweDg1OTI2NjFDKSwgKDB4MjYwQzBEMTgpLCAoMHhCOUExQzVCMSksICgweEE2ODU5MUU0KSwgKDB4RkNCRDRGMjkpLCAoMHg1OTY1QTNDNyksICgweDdEMUVENjY0KSwgKDB4OUJEREVFRTMpLCAoMHg5MjIzN0Q1QSksICgweEI3MzMyREE2KSwgKDB4RUE1NjMyRTUpLCAoMHg5QkZFMTYyNCksICgweDZBMkJCMThBKSwgKDB4OEMwREQ3MkMpLCAoMHg0RjMxOUY1NiksICgweEVFOEI1QjAzKSwgKDB4NjA5NjdCQzgpLCAoMHhCNDkxOEY3NSksCi0oMHhGMjk1RDVGNiksICgweDY1MkFEODBEKSwgKDB4MENDRTk1NTIpLCAoMHgwQkNBQTBBNiksICgweDNDRjJEMjhFKSwgKDB4MTg1Mzk1NkUpLCAoMHg3QjM4REVBQSksICgweEVBQUI5NzBCKSwgKDB4NjQwODZEMUYpLCAoMHgzRTc2NDVERCksICgweDk4NkYxMzQyKSwgKDB4QkJCMEUxODgpLCAoMHg3RDZENTY0MiksICgweDY4MjE4MjdEKSwgKDB4RkNCQzQ3MjkpLCAoMHgzRDExNEZCOSksICgweDJEMjU0MkU1KSwgKDB4NjU0Q0MxRjApLAotKDB4MDRGMUI3NUUpLCAoMHgyOTBCNTRBRiksICgweDdENzlBQjFBKSwgKDB4RjM0RTMxQTIpLCAoMHg3M0E5RjMwMCksICgweDdBQkNBODlFKSwgKDB4QjU2REE5NzQpLCAoMHhDQUNEQjA3QyksICgweDRFRTFBREQ0KSwgKDB4RUY4NTlCMzQpLCAoMHg4OUY0N0I0NyksICgweDUxNUMxNTVBKSwgKDB4MzhEMDY3NTcpLCAoMHg4MDUwRjFGRiksICgweDIxQzhFMDNBKSwgKDB4QjE1NTg0MUEpLCAoMHgzMDcxNjY4NSksICgweDBBMkI0OEFDKSwKLSgweDcwNDFDNDBBKSwgKDB4MTA0QzQ0RDApLCAoMHgxRjUxQjYxOCksICgweEYwRDRGMzlCKSwgKDB4RkNBRUJBNTIpLCAoMHgzMEVBNjJDRCksICgweEEyOTRCNzcyKSwgKDB4MjIxRTA0MTcpLCAoMHhBQThFRjE5MiksICgweDNFNTY4Qzc4KSwgKDB4RDM4NkVGOUEpLCAoMHgxM0I1NEZCMSksICgweDg0ODE4RUMzKSwgKDB4Qjg3NjY5RjgpLCAoMHhDRDkwNTY1QSksICgweDczRDdDODc2KSwgKDB4RDYxOTE1MTIpLCAoMHhBQzIyODcwNCksCi0oMHhBNzc4NUQ0OCksICgweDE3Q0YzNEREKSwgKDB4OEFGNUFCNDApLCAoMHgzNjVDNkFGQSksICgweDE3REZENTlFKSwgKDB4QjkyNEMyNkUpLCAoMHhFOURFNTg0NCksICgweDNEQ0REQ0Q5KSwgKDB4Q0RBMkRGQjQpLCAoMHg4QTVCNTM0RSksICgweEEyRDlEQUNBKSwgKDB4MTE2Nzk1NjkpLCAoMHhBRUY2RTdFOSksICgweEM5RDI0MTdDKSwgKDB4NTE1REM5QzMpLCAoMHgxNTdBNUIxMiksICgweDRDOTYwREQ2KSwgKDB4RDQxM0NDMDEpLAotKDB4NjUzMTk1NDUpLCAoMHg2Q0YxMzA5RCksICgweDAwMDMzOEM3KSwgKDB4NDYwQUE3RkMpLCAoMHhDMUZBNDQ0MCksICgweDBFM0FFMDQ4KSwgKDB4RjRCMjEyQjUpLCAoMHhDNzg5NUQyQiksICgweDY3NkFGQUYzKSwgKDB4RUY0MDRGNzUpLCAoMHhCRkNEQjE3QyksICgweEEzN0ZFNkM2KSwgKDB4MjAxMjNERDUpLCAoMHhFRTk2QkQzQiksICgweDNFQjhBNjJFKSwgKDB4MDY4ODQ1RTEpLCAoMHhDNDk2MDIxNiksICgweDdCQjExRDhEKSwKLSgweDJENjU3NDY3KSwgKDB4RkM2RkFDQzUpLCAoMHhDMjFBQUQzMSksICgweDY0Mjc0NUY0KSwgKDB4NDUwN0UxMzkpLCAoMHhGNzM2OURDOSksICgweDYxOThBREVCKSwgKDB4NjNCOThCMTApLCAoMHhERUU1ODVBQiksICgweEEzOEVGRkFDKSwgKDB4MzBBRTFFNDEpLCAoMHg4MjA2NjdBOSksICgweDZCNzdBMDA3KSwgKDB4MjQwMDQwQTcpLCAoMHhCNzdBN0Q5NSksICgweDIwODg5M0NBKSwgKDB4MDg1QjQ2MTApLCAoMHgxNDIzNDg1NCksCi0oMHhBQzAyMjc4NiksICgweDJENTczNDZGKSwgKDB4QjY0QTFBNjcpLCAoMHg2MDVENDVCMiksICgweEUwNTFDMDAxKSwgKDB4OTE3NkMxMUQpLCAoMHgyM0JCRTk0NSksICgweDJDMDNFMjZBKSwgKDB4QzI4MTFCQUQpLCAoMHgxREQ4MTRENCksICgweDNDNjc0QjY4KSwgKDB4MjhFQzMzQzcpLCAoMHhEOUVERTVFNCksICgweDVDNDZDMjQ4KSwgKDB4NDA5ODg5OEYpLCAoMHg1QkE5NjI4MCksICgweEVGRjc3QjkxKSwgKDB4MzMzMkNBNUIpLAotKDB4NjYxQ0FGNkIpLCAoMHg2RTBENTY0RSksICgweEI3MEQwODYzKSwgKDB4MjQwMjg1QzApLCAoMHhCQkJEM0VBNyksICgweENBMkU1NjhEKSwgKDB4RDFEM0Y2MTIpLCAoMHhDOTE2MTE1RSksICgweEI3RkMwQTZDKSwgKDB4MTk2MUFFOUEpLCAoMHhCNURGMzk2NSksICgweEMxQjk1MDY1KSwgKDB4ODlFMjk2NjUpLCAoMHgzRjI5RkJFRCksICgweDNGMUJFRDczKSwgKDB4QzE1NUJFMUQpLCAoMHg3MjU2QUU0QyksICgweDRBNTk3OTdCKSwKLSgweDYwMDlEMTNCKSwgKDB4OTE4NTAzODUpLCAoMHhFNDU0NTkyMCksICgweDE1RUNDREExKSwgKDB4RkZDN0JBMjApLCAoMHgyQjgwNTBGMSksICgweDFBMjFENEMwKSwgKDB4MzAwOEJFODkpLCAoMHg2QzBGRjMxNyksICgweDc0NDREODUyKSwgKDB4MDU4NDE0MTEpLCAoMHg4NEM4MDAyMiksICgweDA3QzYzMEUwKSwgKDB4N0U2RjhGQTMpLCAoMHhGM0JERjNDNyksICgweDRDNTVERkY3KSwgKDB4RTBCMUM4RDEpLCAoMHhDM0Y1Q0Y0RCksCi0oMHgxQzIyQTgzNiksICgweEIyOUQzMzE1KSwgKDB4RDQ5NjY1NDEpLCAoMHg0NUM4NTgwMCksICgweEFEOERCRDQ2KSwgKDB4MkMxOUNGQUEpLCAoMHg1NDBGQTY3NCksICgweEMzQzkxM0Q4KSwgKDB4RDIxODM3NTMpLCAoMHhDQjlGQ0YyNiksICgweDgzNDZGQzg5KSwgKDB4QTM0MDgwNzgpLCAoMHhDRkQ4NENDMSksICgweEY1ODBGMDM1KSwgKDB4N0ZEMDY3QTcpLCAoMHg4N0U3RkNCOCksICgweDA5QzA5NDA2KSwgKDB4RERCQjMxMzEpLAotKDB4RkY3OUZGRTEpLCAoMHhFQUZCRUVGMSksICgweEI2NjBCQ0U4KSwgKDB4OTk4OTlDMzEpLCAoMHg5RkVCMjJDMSksICgweEM3NUVGNjhGKSwgKDB4MTM4MDBCOTkpLCAoMHhDRDdGMzEwMCksICgweDA5NTAyQURDKSwgKDB4MTAxRTAwRTgpLCAoMHg0MDZDQjk0NSksICgweDgyMEExQjJCKSwgKDB4NjhBMEIwODIpLCAoMHgwQzFCMTg2NCksICgweEIzNjkwMzU0KSwgKDB4NjNDNUI1QTMpLCAoMHg1MzVFQjRDOCksICgweEY3RDg2OTE4KSwKLSgweEQxQkE1OEZDKSwgKDB4RjQyOTEwRkEpLCAoMHhGQkRCMTkyOSksICgweEM3QzBDMkE0KSwgKDB4RDIwNzQ3NTIpLCAoMHhCOTY4MDNCNCksICgweDg0MDY1RTM4KSwgKDB4ODE5QUY0OEUpLCAoMHhFOTg2NEZGMyksICgweEE2RTQxRDBFKSwgKDB4NTBFNzQ0MkIpLCAoMHhDNzU3NEQ3QiksICgweDE5NkI2QUIzKSwgKDB4MDQxRDU4NTQpLCAoMHg2MjkxNjJEMyksICgweDA0MjcxM0UwKSwgKDB4OUFFMzEyOTcpLCAoMHg0QjJGNEUzNiksCi0oMHhDQjhDRTBFMCksICgweEIyRjA2ODJBKSwgKDB4QUIzM0Q2RjUpLCAoMHgyRjUzRDgyRSksICgweDY2QTQzODE1KSwgKDB4NDQzM0FBQTgpLCAoMHg4MkVBMEVENSksICgweDQ1Nzg3NkYyKSwgKDB4RDMwQkQzNkMpLCAoMHg4RDQ5RDI4QyksICgweDBFNjgyNjBFKSwgKDB4RDA1NjUxMkMpLCAoMHg3Qjg2REIxMSksICgweDY0NjMzNjYxKSwgKDB4ODI2NUZGMjUpLCAoMHg2RDJCNzE0OCksICgweDUyOURBMEQ4KSwgKDB4QkMxODAwMTcpLAotKDB4MTlBQjgwM0IpLCAoMHg4M0YwMDAyMCksICgweDUwRjFGRjA3KSwgKDB4RDRDMDJEODApLCAoMHhGQzg4MUEyMSksICgweEMxQkYwMTAwKSwgKDB4NTg0MTY4MEIpLCAoMHgxMDNCMkNDMCksICgweEIwNDJDMjhBKSwgKDB4MjMyNEU4QTgpLCAoMHgzMTUzMTQzMCksICgweEVGNzFERDBFKSwgKDB4N0MxQjlEOEUpLCAoMHgwOTk4QzIyOCksICgweEQ5RUM2NTQ4KSwgKDB4OEVFRjg0NDgpLCAoMHgwQzU2MUNBRiksICgweDRCQTM5REZEKSwKLSgweDU4OTQ3RkUyKSwgKDB4OTU5QjEyQTIpLCAoMHg2RDUyRUFFQyksICgweDFEOTVEREQ1KSwgKDB4MzEwQzIyMkIpLCAoMHg2MzYzNEIxOCksICgweDRERTZDNUI4KSwgKDB4NTI2QzkxMDYpLCAoMHg0OUI1RThDQyksICgweEMzQzMzMDA0KSwgKDB4NjA1Q0QyODcpLCAoMHgwOUE2MzkwQyksICgweDM1MEMzM0JDKSwgKDB4OTUzMDUwQ0MpLCAoMHg5NjA1NTJBMyksICgweDU0RjAxMTg2KSwgKDB4MEU4RDdDRkUpLCAoMHg0NTlBMDAyMiksCi0oMHhDMzU3Njk2NiksICgweEIwRDZGNkU4KSwgKDB4QjhGMTNBQUMpLCAoMHhFNDQwMDM0QyksICgweDM2MTE4ODUxKSwgKDB4RjUxQkU3MjcpLCAoMHgyRTE2ODlBMCksICgweEU4MkNDRjU1KSwgKDB4NkRGNEUzQ0IpLCAoMHhFQTY2NTY2MyksICgweEMyRTUzRDZGKSwgKDB4OURDMUYwNkIpLCAoMHhGQ0MyRTg3OCksICgweDQyOTJEMTYyKSwgKDB4NDg0MEM0MzMpLCAoMHhCNjE4REI0MyksICgweDA2MDkyQzE1KSwgKDB4NTAwMTM0QzEpLAotKDB4QTZEQjg5NTUpLCAoMHhENUU4QTVCQiksICgweDE0MkI3ODI5KSwgKDB4NzVGNDI5MzkpLCAoMHgwRUJGNEQxMCksICgweDFBMkIwNzhDKSwgKDB4N0MyQTVBNDYpLCAoMHgzRUExQjlBNyksICgweDMxQUFDODk4KSwgKDB4MTMyN0I4NTIpLCAoMHgyNzdDNjVBMSksICgweDUyODBDRTI3KSwgKDB4RkY1MTIyMTMpLCAoMHgzOUI0N0VCRiksICgweDE1NENBMDAwKSwgKDB4MTA2RTdEQTIpLCAoMHhBRkE0QzkyNSksICgweEM0OENFMzc5KSwKLSgweEFCMkU0NTczKSwgKDB4NUU0NEI4RkQpLCAoMHhFQ0QyQTQyNCksICgweDhDNTMwMEFBKSwgKDB4RTQyNUExODApLCAoMHg2RDVEMEQzQiksICgweEE3MDU0MEE4KSwgKDB4RjhFQ0Y0MzIpLCAoMHg4ODQ2OTZCMCksICgweEI3OTc1NUJGKSwgKDB4NjJDQUQ0MTkpLCAoMHg0QkJCMzhCNiksICgweENENUM3OUQ3KSwgKDB4ODJENEUyOUIpLCAoMHg2REQ0OEU5MSksICgweEExMjhBM0E5KSwgKDB4RjJFRDY3MjYpLCAoMHgzMzlBNjNGNiksCi0oMHgzNUQ2RjRFQSksICgweDhEQzhCNDkxKSwgKDB4Q0EwNEQwOUMpLCAoMHhGRjA3NEZEMCksICgweDJEODA1MEYxKSwgKDB4MUEyMUQ4ODApLCAoMHgxOTAwRkU4OCksICgweDZDMDlEMUJGKSwgKDB4NTY0ODMwMDEpLCAoMHhDMjBBMUEyOSksICgweDQ0OTE4MEEzKSwgKDB4MDI4QzUxNjApLCAoMHg3NUZBRUNERCksICgweDYyNTA3MDVCKSwgKDB4ODlFQTAxMEEpLCAoMHg3QjlGOTg1MSksICgweDlENkM1OTk0KSwgKDB4ODYwMkMzRTQpLAotKDB4MDNEMEU4NjMpLCAoMHgwNDMyMjI1MSksICgweDExNjA5NUI3KSwgKDB4Nzg5Mjc2Q0EpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwOTc4KSwgKDB4ODAwMEM2ODgpLCAoMHg4MDAwQkNEOCksICgweDgwMDEwMDAwKSwgKDB4OUZDM0Y3QjgpLCAoMHhERTQ3QkMxQiksICgweEU2MEZCNEY4KSwgKDB4RUEyNzQ2OUQpLCAoMHhDQ0ExRTY2RCksICgweDhGRkY3MDEwKSwgKDB4ODAwMEJDRDgpLCAoMHgwMDAwMDBEMCksICgweDgwMDBCNEIwKSwKLSgweDhGRkZGQjI0KSwgKDB4OUZDM0Y3QjgpLCAoMHgwMDAwMDAwMCksICgweDgwMDBCNDE4KSwgKDB4OEZGRjcwMTApLCAoMHg4MDAwQzY4OCksICgweDAwMDAwMEQwKSwgKDB4OUZDM0ZEM0MpLCAoMHhENjI1RjhDMCksICgweDQ3OEQ4MzJBKSwgKDB4RjY5M0Q5MjIpLCAoMHgzNjE3RDgxNiksICgweDgwMDAwNjQ4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMyksICgweDAwMDAwMDEyKSwgKDB4OUZDNDk5NjQpLCAoMHg0NjE0MTkyNCksCi0oMHg0RDgzNDIwNSksICgweDE2Qjc5OUE2KSwgKDB4QTM5NDk0QTYpLCAoMHhDQ0YyM0M2MCksICgweDAwMDAwMDAxKSwgKDB4OUZDNDc0NjgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDcyKSwgKDB4MDAwMDgwMDEpLCAoMHg4RkZGRkI1OCksICgweDAwMDAwMDAzKSwgKDB4NDAyQzc0MTMpLCAoMHgwMDAwMDAxNiksICgweDQwMkM3NDEzKSwgKDB4OUZDNDg0OTgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAyKSwgKDB4MDAwMDAwMDEpLAotKDB4MDAwMDAwNzIpLCAoMHg5RkM0NzgzQyksICgweDgwMDBDNjkwKSwgKDB4MDM1OENERDUpLCAoMHgwMDAwMDAwMCksICgweDAwMDA4MDAxKSwgKDB4MDAwMDAwNzIpLCAoMHg4MDAwMDY0OCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDgwMDEpLCAoMHg4MDAwQkQ0MCksICgweDFBMTlGOEQ4KSwgKDB4MDAwMDgwMDEpLCAoMHg4MDAwMDNDMCksICgweDAwMDAwMDAzKSwgKDB4OUZDNDI4Q0MpLCAoMHhGNjE5MjAxNSksICgweEZCQjc3RjkyKSwKLSgweDhGMkM4QkZDKSwgKDB4M0MzOTE5MjMpLCAoMHg0MDE0NDI4QyksICgweDE0MDA0NUFFKSwgKDB4RkZGRDJCQjYpLCAoMHgyRDgwNTBGMSksICgweDgwMDBCRDQwKSwgKDB4MDAwMDAwMDMpLCAoMHgwMDAwMDAwMCksICgweDJDQzA1ODExKSwgKDB4MDAwMDgwMDEpLCAoMHg4MDAwMDNDMCksICgweDgwMDAwNjQ4KSwgKDB4ODAwMDA2NDgpLCAoMHg5RkM0MjA2QyksICgweDhGRkZGRDc4KSwgKDB4OEZGRkZFRUMpLCAoMHg4MDAwQzY2OCksCi0oMHg4MDAwMDY0OCksICgweDhGRkZGRDc4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMzA0MCksICgweDgwMDBGRkMwKSwgKDB4ODAwMEJDRDgpLCAoMHg4MDAxMDAwMCksICgweDlGQzNGN0I4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMkNDMCksICgweDgwMDEzMzQwKSwgKDB4ODAwMEJDRDgpLCAoMHg4MDAxMEZEMCksICgweDgwMDEyNTQ4KQotfTsKLQotLy9zdGF0aWMgY29uc3QgSU5UIF9fdHdpZGRsZXNfbWlwc19mZnQzMl8yMDQ4W10gPQotLy97Ci0vLygweDdGRkZGRkZGKSwgKDB4MDAwMDAwMDApLCAoMHg3RkZGRDg4NCksICgweEZGOUI3ODFEKSwgKDB4N0ZGRjYyMTUpLCAoMHhGRjM2RjA3OCksICgweDdGRkU5Q0IxKSwgKDB4RkVEMjY5NTApLCAoMHg3RkZEODg1OSksICgweEZFNkRFMkUwKSwgKDB4N0ZGQzI1MEUpLCAoMHhGRTA5NUQ2QSksICgweDdGRkE3MkQwKSwgKDB4RkRBNEQ5MjkpLCAoMHg3RkY4NzFBMCksICgweEZENDA1NjVEKSwgKDB4N0ZGNjIxODEpLCAoMHhGQ0RCRDU0MCksCi0vLygweDdGRjM4MjcyKSwgKDB4RkM3NzU2MTcpLCAoMHg3RkYwOTQ3NiksICgweEZDMTJEOTFCKSwgKDB4N0ZFRDU3OEYpLCAoMHhGQkFFNUU4QyksICgweDdGRTlDQkJFKSwgKDB4RkI0OUU2QTMpLCAoMHg3RkU1RjEwNyksICgweEZBRTU3MUEyKSwgKDB4N0ZFMUM3NkEpLCAoMHhGQTgwRkZDRSksICgweDdGREQ0RUVCKSwgKDB4RkExQzkxNTcpLCAoMHg3RkQ4ODc4QyksICgweEY5QjgyNjgxKSwgKDB4N0ZEMzcxNTEpLCAoMHhGOTUzQkY5NCksCi0vLygweDdGQ0UwQzNEKSwgKDB4RjhFRjVDQkMpLCAoMHg3RkM4NTg1MiksICgweEY4OEFGRTNGKSwgKDB4N0ZDMjU1OTUpLCAoMHhGODI2QTQ2NCksICgweDdGQkMwNDA5KSwgKDB4RjdDMjRGNjEpLCAoMHg3RkI1NjNCMiksICgweEY3NURGRjZCKSwgKDB4N0ZBRTc0OTMpLCAoMHhGNkY5QjRDOCksICgweDdGQTczNkIyKSwgKDB4RjY5NTZGQjcpLCAoMHg3RjlGQUExMyksICgweEY2MzEzMDc0KSwgKDB4N0Y5N0NFQkIpLCAoMHhGNUNDRjczRSksCi0vLygweDdGOEZBNEFGKSwgKDB4RjU2OEM0NjMpLCAoMHg3Rjg3MkJGMiksICgweEY1MDQ5ODAwKSwgKDB4N0Y3RTY0OEIpLCAoMHhGNEEwNzI2NCksICgweDdGNzU0RTdFKSwgKDB4RjQzQzUzQ0IpLCAoMHg3RjZCRTlEMyksICgweEYzRDgzQzc0KSwgKDB4N0Y2MjM2OEQpLCAoMHhGMzc0MkM5RCksICgweDdGNTgzNEI2KSwgKDB4RjMxMDI0OTIpLCAoMHg3RjRERTQ1MCksICgweEYyQUMyNDczKSwgKDB4N0Y0MzQ1NjIpLCAoMHhGMjQ4MkM4RCksCi0vLygweDdGMzg1N0Y0KSwgKDB4RjFFNDNEMUMpLCAoMHg3RjJEMUMwQyksICgweEYxODA1NjYwKSwgKDB4N0YyMTkxQjIpLCAoMHhGMTFDNzg5NSksICgweDdGMTVCOEVEKSwgKDB4RjBCOEE0MDkpLCAoMHg3RjA5OTFDMyksICgweEYwNTREOERBKSwgKDB4N0VGRDFDM0IpLCAoMHhFRkYxMTc1NSksICgweDdFRjA1ODYwKSwgKDB4RUY4RDVGQzgpLCAoMHg3RUUzNDYzNCksICgweEVGMjlCMjQxKSwgKDB4N0VENUU1QzYpLCAoMHhFRUM2MEYzQyksCi0vLygweDdFQzgzNzE3KSwgKDB4RUU2Mjc2QjcpLCAoMHg3RUJBM0EzOCksICgweEVERkVFOTMwKSwgKDB4N0VBQkVGMjkpLCAoMHhFRDlCNjZBNSksICgweDdFOUQ1NUZCKSwgKDB4RUQzN0VGOTEpLCAoMHg3RThFNkVCMiksICgweEVDRDQ4NDE0KSwgKDB4N0U3RjM5NTQpLCAoMHhFQzcxMjQ0QSksICgweDdFNkZCNUY0KSwgKDB4RUMwREQwQjApLCAoMHg3RTVGRTQ5MCksICgweEVCQUE4OTQ0KSwgKDB4N0U0RkM1M0QpLCAoMHhFQjQ3NEU4MyksCi0vLygweDdFM0Y1ODAwKSwgKDB4RUFFNDIwOEEpLCAoMHg3RTJFOUNERCksICgweEVBODBGRjc3KSwgKDB4N0UxRDkzRUEpLCAoMHhFQTFERUJDNiksICgweDdFMEMzRDI2KSwgKDB4RTlCQUU1NzUpLCAoMHg3REZBOThBNyksICgweEU5NTdFRDAwKSwgKDB4N0RFOEE2NkMpLCAoMHhFOEY1MDI2NiksICgweDdERDY2NjhEKSwgKDB4RTg5MjI2MjEpLCAoMHg3REMzRDkwRSksICgweEU4MkY1ODUxKSwgKDB4N0RCMEZERjUpLCAoMHhFN0NDOTkxMiksCi0vLygweDdEOURENTVBKSwgKDB4RTc2OUU4RTApLCAoMHg3RDhBNUYzQyksICgweEU3MDc0N0I5KSwgKDB4N0Q3NjlCQjQpLCAoMHhFNkE0QjYxOSksICgweDdENjI4QUM3KSwgKDB4RTY0MjM0MUMpLCAoMHg3RDRFMkM3QyksICgweEU1REZDMUUyKSwgKDB4N0QzOTgwRUQpLCAoMHhFNTdENUZFNCksICgweDdEMjQ4ODE4KSwgKDB4RTUxQjBFMjIpLCAoMHg3RDBGNDIxNyksICgweEU0QjhDRDE2KSwgKDB4N0NGOUFFRUMpLCAoMHhFNDU2OUNCRSksCi0vLygweDdDRTNDRUIwKSwgKDB4RTNGNDdEOTUpLCAoMHg3Q0NEQTE2QSksICgweEUzOTI2RkI5KSwgKDB4N0NCNzI3MjEpLCAoMHhFMzMwNzM0NyksICgweDdDQTA1RkYxKSwgKDB4RTJDRTg4QkEpLCAoMHg3Qzg5NEJEQSksICgweEUyNkNCMDEwKSwgKDB4N0M3MUVBRjcpLCAoMHhFMjBBRTlDMyksICgweDdDNUEzRDUyKSwgKDB4RTFBOTM1RjEpLCAoMHg3QzQyNDJGMCksICgweEUxNDc5NEI3KSwgKDB4N0MyOUZCRUYpLCAoMHhFMEU2MDY4RiksCi0vLygweDdDMTE2ODRGKSwgKDB4RTA4NDhCNzcpLCAoMHg3QkY4ODgzMCksICgweEUwMjMyM0VBKSwgKDB4N0JERjVCOEYpLCAoMHhERkMxQ0ZFNSksICgweDdCQzVFMjk2KSwgKDB4REY2MDkwMDIpLCAoMHg3QkFDMUQzMyksICgweERFRkY2NDAwKSwgKDB4N0I5MjBCODYpLCAoMHhERTlFNEM1QiksICgweDdCNzdBREEwKSwgKDB4REUzRDQ5NEMpLCAoMHg3QjVEMDNBMSksICgweEREREM1QjRGKSwgKDB4N0I0MjBENzkpLCAoMHhERDdCODIyMiksCi0vLygweDdCMjZDQjQ5KSwgKDB4REQxQUJFNDEpLCAoMHg3QjBCM0QzMyksICgweERDQkExMDI0KSwgKDB4N0FFRjYzMjUpLCAoMHhEQzU5Nzc4QiksICgweDdBRDMzRDQxKSwgKDB4REJGOEY0RjApLCAoMHg3QUI2Q0I5QSksICgweERCOTg4ODhFKSwgKDB4N0E5QTBFNTMpLCAoMHhEQjM4MzJERSksICgweDdBN0QwNTU5KSwgKDB4REFEN0YzQTIpLCAoMHg3QTVGQjBEMSksICgweERBNzdDQjUwKSwgKDB4N0E0MjEwREUpLCAoMHhEQTE3QkE2MyksCi0vLygweDdBMjQyNTZGKSwgKDB4RDlCN0MwOUEpLCAoMHg3QTA1RUVBOCksICgweEQ5NTdERTZGKSwgKDB4NzlFNzZDOUMpLCAoMHhEOEY4MTQxRCksICgweDc5Qzg5RjcxKSwgKDB4RDg5ODYyMUEpLCAoMHg3OUE5ODcxMyksICgweEQ4MzhDODJBKSwgKDB4Nzk4QTIzQTgpLCAoMHhEN0Q5NDZDMyksICgweDc5NkE3NTVBKSwgKDB4RDc3OURFNUQpLCAoMHg3OTRBN0MxMSksICgweEQ3MUE4RUJBKSwgKDB4NzkyQTM3RjgpLCAoMHhENkJCNTg1MCksCi0vLygweDc5MDlBOTM1KSwgKDB4RDY1QzNCOTgpLCAoMHg3OEU4Q0ZCNCksICgweEQ1RkQzODU0KSwgKDB4NzhDN0FCOUUpLCAoMHhENTlFNEVGOSksICgweDc4QTYzRDA3KSwgKDB4RDUzRjdGQzMpLCAoMHg3ODg0ODQxOSksICgweEQ0RTBDQjI4KSwgKDB4Nzg2MjgwQkUpLCAoMHhENDgyMzBFQSksICgweDc4NDAzMzIxKSwgKDB4RDQyM0IxODEpLCAoMHg3ODFEOUI2RCksICgweEQzQzU0RDYyKSwgKDB4NzdGQUI5OEEpLCAoMHhEMzY3MDQ0RiksCi0vLygweDc3RDc4REE2KSwgKDB4RDMwOEQ2QkUpLCAoMHg3N0I0MTdENCksICgweEQyQUFDNEVCKSwgKDB4Nzc5MDU4NDIpLCAoMHhEMjRDQ0Y0OSksICgweDc3NkM0RUQ5KSwgKDB4RDFFRUY1OUQpLCAoMHg3NzQ3RkJDNSksICgweEQxOTEzODVCKSwgKDB4NzcyMzVGMzUpLCAoMHhEMTMzOTdGQSksICgweDc2RkU3OTBGKSwgKDB4RDBENjE0M0EpLCAoMHg3NkQ5NDk4MyksICgweEQwNzhBRDkzKSwgKDB4NzZCM0QwQTYpLCAoMHhEMDFCNjQzRCksCi0vLygweDc2OEUwRUE5KSwgKDB4Q0ZCRTM4QUQpLCAoMHg3NjY4MDM3MyksICgweENGNjEyQUE3KSwgKDB4NzY0MUFGMzIpLCAoMHhDRjA0M0E5RSksICgweDc2MUIxMjE4KSwgKDB4Q0VBNzY5MDcpLCAoMHg3NUY0MkMwQiksICgweENFNEFCNUE2KSwgKDB4NzVDQ0ZEM0IpLCAoMHhDREVFMjBFRiksICgweDc1QTU4NUQ5KSwgKDB4Q0Q5MUFCNTUpLCAoMHg3NTdEQzVDRCksICgweENEMzU1NDlDKSwgKDB4NzU1NUJENDcpLCAoMHhDQ0Q5MUQzNyksCi0vLygweDc1MkQ2QzYwKSwgKDB4Q0M3RDA1NjEpLCAoMHg3NTA0RDM0QyksICgweENDMjEwRDhCKSwgKDB4NzREQkYxRUUpLCAoMHhDQkM1MzU3QSksICgweDc0QjJDODdCKSwgKDB4Q0I2OTdEQTApLCAoMHg3NDg5NTcyNSksICgweENCMERFNjcyKSwgKDB4NzQ1RjlERDMpLCAoMHhDQUIyNkZCMiksICgweDc0MzU5Q0I4KSwgKDB4Q0E1NzE5RDMpLCAoMHg3NDBCNTNFRCksICgweEM5RkJFNTBFKSwgKDB4NzNFMEMzQTkpLCAoMHhDOUEwRDFENCksCi0vLygweDczQjVFQkNGKSwgKDB4Qzk0NURGRUIpLCAoMHg3MzhBQ0M5NCksICgweEM4RUIwRkM0KSwgKDB4NzM1RjY2MkYpLCAoMHhDODkwNjFEMSksICgweDczMzNCODg0KSwgKDB4QzgzNUQ1RDYpLCAoMHg3MzA3QzNDOSksICgweEM3REI2QzQ1KSwgKDB4NzJEQjg4MTkpLCAoMHhDNzgxMjU1NiksICgweDcyQUYwNUFCKSwgKDB4QzcyNzAxN0EpLCAoMHg3MjgyM0M2MyksICgweEM2Q0QwMDc1KSwgKDB4NzI1NTJDNzkpLCAoMHhDNjczMjJCOSksCi0vLygweDcyMjdENjI0KSwgKDB4QzYxOTY4QjYpLCAoMHg3MUZBMzk0OCksICgweEM1QkZEMjMyKSwgKDB4NzFDQzU2MUUpLCAoMHhDNTY2NUY5QiksICgweDcxOUUyQ0RFKSwgKDB4QzUwRDExNjQpLCAoMHg3MTZGQkQ2QyksICgweEM0QjNFNzUxKSwgKDB4NzE0MTA4MDApLCAoMHhDNDVBRTFEMSksICgweDcxMTIwQ0I3KSwgKDB4QzQwMjAxMUMpLCAoMHg3MEUyQ0JDRCksICgweEMzQTk0NUExKSwgKDB4NzBCMzQ1MjMpLCAoMHhDMzUwQUYyNiksCi0vLygweDcwODM3OEY0KSwgKDB4QzJGODNFMUIpLCAoMHg3MDUzNjc3QyksICgweEMyOUZGMkVDKSwgKDB4NzAyMzEwOUMpLCAoMHhDMjQ3Q0Q2MiksICgweDZGRjI3NDkwKSwgKDB4QzFFRkNERUEpLCAoMHg2RkMxOTM3NiksICgweEMxOTdGNEJCKSwgKDB4NkY5MDZENkIpLCAoMHhDMTQwNDIwQSksICgweDZGNUYwMkNGKSwgKDB4QzBFOEI2N0UpLCAoMHg2RjJENTM0MCksICgweEMwOTE1MTZFKSwgKDB4NkVGQjVGMUQpLCAoMHhDMDNBMTM3RSksCi0vLygweDZFQzkyNjg0KSwgKDB4QkZFMkZDRTUpLCAoMHg2RTk2QTk5NSksICgweEJGOEMwREQ4KSwgKDB4NkU2M0U4NkUpLCAoMHhCRjM1NDY4RSksICgweDZFMzBFMzJGKSwgKDB4QkVERUE3M0EpLCAoMHg2REZEOUEzOCksICgweEJFODgzMDgyKSwgKDB4NkRDQTBEMjcpLCAoMHhCRTMxRTFCRiksICgweDZEOTYzQzVEKSwgKDB4QkREQkJCOTIpLCAoMHg2RDYyMjdGQSksICgweEJEODVCRTMzKSwgKDB4NkQyREQwMUUpLCAoMHhCRDJGRTlENSksCi0vLygweDZDRjkzNEU4KSwgKDB4QkNEQTNFQUUpLCAoMHg2Q0M0NTY3QSksICgweEJDODRCQ0YyKSwgKDB4NkM4RjM1MzgpLCAoMHhCQzJGNjU0NCksICgweDZDNTlEMEJDKSwgKDB4QkJEQTM2RkQpLCAoMHg2QzI0Mjk2OSksICgweEJCODUzMkMwKSwgKDB4NkJFRTNGNjEpLCAoMHhCQjMwNThDMSksICgweDZCQjgxMkM1KSwgKDB4QkFEQkE5MzQpLCAoMHg2QjgxQTNCNyksICgweEJBODcyNDRFKSwgKDB4NkI0QUYyNTgpLCAoMHhCQTMyQ0E0MiksCi0vLygweDZCMTNGRjExKSwgKDB4QjlERTlCQjApLCAoMHg2QURDQzk3NiksICgweEI5OEE5N0Y2KSwgKDB4NkFBNTUxRjApLCAoMHhCOTM2QkZCMiksICgweDZBNkQ5OEExKSwgKDB4QjhFMzEzMTgpLCAoMHg2QTM1OURBQyksICgweEI4OEY5MjVCKSwgKDB4NjlGRDYxMzIpLCAoMHhCODNDM0RCMSksICgweDY5QzRFMzU4KSwgKDB4QjdFOTE1NEEpLCAoMHg2OThDMjQ4NyksICgweEI3OTYxOUM2KSwgKDB4Njk1MzI0NTMpLCAoMHhCNzQzNEE4MiksCi0vLygweDY5MTlFMzI2KSwgKDB4QjZGMEE4MUQpLCAoMHg2OEUwNjEyNSksICgweEI2OUUzMkM5KSwgKDB4NjhBNjlFNzIpLCAoMHhCNjRCRUFCOSksICgweDY4NkM5QjMxKSwgKDB4QjVGOUQwMjEpLCAoMHg2ODMyNTc4NiksICgweEI1QTdFMzMxKSwgKDB4NjdGN0QzREYpLCAoMHhCNTU2MjQ4NiksICgweDY3QkQwRkNDKSwgKDB4QjUwNDkzODApLCAoMHg2NzgyMEJCQiksICgweEI0QjMzMEJDKSwgKDB4Njc0NkM3RDEpLCAoMHhCNDYxRkM2QSksCi0vLygweDY3MEI0NDMyKSwgKDB4QjQxMEY2QkUpLCAoMHg2NkNGODEwMyksICgweEIzQzAxRkU5KSwgKDB4NjY5MzdFQjUpLCAoMHhCMzZGNzg4MyksICgweDY2NTczQ0Q1KSwgKDB4QjMxRUZGRjApLCAoMHg2NjFBQkJEMyksICgweEIyQ0VCNkNCKSwgKDB4NjVEREZCRDYpLCAoMHhCMjdFOUQ0MyksICgweDY1QTBGRDAzKSwgKDB4QjIyRUIzOEEpLCAoMHg2NTYzQkY3RSksICgweEIxREVGOUQyKSwgKDB4NjUyNjQzNkYpLCAoMHhCMThGNzA0QiksCi0vLygweDY0RTg4OTRBKSwgKDB4QjE0MDE3OEMpLCAoMHg2NEFBOTA5OCksICgweEIwRjBFRUZDKSwgKDB4NjQ2QzU5Q0MpLCAoMHhCMEExRjczMCksICgweDY0MkRFNTBGKSwgKDB4QjA1MzMwNUEpLCAoMHg2M0VGMzI4NiksICgweEIwMDQ5QUE5KSwgKDB4NjNCMDQyNTcpLCAoMHhBRkI2MzY0RSksICgweDYzNzExNEFCKSwgKDB4QUY2ODAzN0IpLCAoMHg2MzMxQTlGOCksICgweEFGMUEwMkMxKSwgKDB4NjJGMjAxQzQpLCAoMHhBRUNDMzM4QiksCi0vLygweDYyQjIxQzg3KSwgKDB4QUU3RTk2NkMpLCAoMHg2MjcxRkE2OSksICgweEFFMzEyQjk0KSwgKDB4NjIzMTlCOTEpLCAoMHhBREUzRjMzMyksICgweDYxRjEwMDI3KSwgKDB4QUQ5NkVENzcpLCAoMHg2MUIwMjg1MiksICgweEFENEExQTkyKSwgKDB4NjE2RjE0OEUpLCAoMHhBQ0ZEN0IxMyksICgweDYxMkRDNDVEKSwgKDB4QUNCMTBFNjcpLCAoMHg2MEVDMzgzQSksICgweEFDNjRENTFGKSwgKDB4NjBBQTcwNEUpLCAoMHhBQzE4Q0Y2OSksCi0vLygweDYwNjg2Q0MwKSwgKDB4QUJDQ0ZENzUpLCAoMHg2MDI2MkRCQiksICgweEFCODE1RjcxKSwgKDB4NUZFM0IzNjYpLCAoMHhBQjM1RjU4QyksICgweDVGQTBGRTQwKSwgKDB4QUFFQUMwNTQpLCAoMHg1RjVFMERDOCksICgweEFBOUZCRjM4KSwgKDB4NUYxQUUyN0MpLCAoMHhBQTU0RjJDNiksICgweDVFRDc3Qzg2KSwgKDB4QUEwQTVCMkMpLCAoMHg1RTkzREMwRSksICgweEE5QkZGODk5KSwgKDB4NUU1MDAxNDApLCAoMHhBOTc1Q0IzOSksCi0vLygweDVFMEJFQzQ0KSwgKDB4QTkyQkQzM0MpLCAoMHg1REM3OUQ5QyksICgweEE4RTIxMTJDKSwgKDB4NUQ4MzE0QzQpLCAoMHhBODk4ODQ3QiksICgweDVEM0U1MjNFKSwgKDB4QTg0RjJEQjQpLCAoMHg1Q0Y5NTYzMiksICgweEE4MDYwRDA1KSwgKDB4NUNCNDIwQ0QpLCAoMHhBN0JEMjI5QSksICgweDVDNkVCMjM4KSwgKDB4QTc3NDZFQTIpLCAoMHg1QzI5MEFBMCksICgweEE3MkJGMTQ4KSwgKDB4NUJFMzJBODYpLCAoMHhBNkUzQUIxNSksCi0vLygweDVCOUQxMTY2KSwgKDB4QTY5QjlCN0QpLCAoMHg1QjU2QkZDMiksICgweEE2NTNDMzBBKSwgKDB4NUIxMDM1QzcpLCAoMHhBNjBDMjFFOCksICgweDVBQzk3M0EwKSwgKDB4QTVDNEI4NDMpLCAoMHg1QTgyNzk3OCksICgweEE1N0Q4NjQ2KSwgKDB4NUEzQjQ3RDYpLCAoMHhBNTM2OEM3OCksICgweDU5RjNERTMwKSwgKDB4QTRFRkNBNTEpLCAoMHg1OUFDM0QwRSksICgweEE0QTk0MDU2KSwgKDB4NTk2NDY0OUIpLCAoMHhBNDYyRUVCMiksCi0vLygweDU5MUM1NTA0KSwgKDB4QTQxQ0Q1OTEpLCAoMHg1OEQ0MEU3NSksICgweEEzRDZGNTFGKSwgKDB4NTg4QjkxMUIpLCAoMHhBMzkxNEQ4NyksICgweDU4NDJERDdFKSwgKDB4QTM0QkRGNEIpLCAoMHg1N0Y5RjMxNCksICgweEEzMDZBOUU1KSwgKDB4NTdCMEQyNjUpLCAoMHhBMkMxQUREQSksICgweDU3Njc3QjlFKSwgKDB4QTI3Q0VCNTMpLCAoMHg1NzFERUVFRCksICgweEEyMzg2MjdCKSwgKDB4NTZENDJDN0YpLCAoMHhBMUY0MTM3QyksCi0vLygweDU2OEEzNDgyKSwgKDB4QTFBRkZFODEpLCAoMHg1NjQwMDc4MSksICgweEExNkMyNDA5KSwgKDB4NTVGNUE0RUQpLCAoMHhBMTI4ODM5MSksICgweDU1QUIwRDU0KSwgKDB4QTBFNTFEOUIpLCAoMHg1NTYwNDBFMiksICgweEEwQTFGMjRGKSwgKDB4NTUxNTNGQzYpLCAoMHhBMDVGMDFENyksICgweDU0Q0EwQTJFKSwgKDB4QTAxQzRDNUMpLCAoMHg1NDdFQTA0OSksICgweDlGRDlEMjA3KSwgKDB4NTQzMzAyQTUpLCAoMHg5Rjk3OTM1NiksCi0vLygweDUzRTczMEIxKSwgKDB4OUY1NThGQzkpLCAoMHg1MzlCMkFGQiksICgweDlGMTNDN0RDKSwgKDB4NTM0RUYxQjMpLCAoMHg5RUQyM0JCOSksICgweDUzMDI4NTA3KSwgKDB4OUU5MEVCODgpLCAoMHg1MkI1RTUyNiksICgweDlFNEZENzcxKSwgKDB4NTI2OTEyNDEpLCAoMHg5RTBFRkY5RCksICgweDUyMUMwQ0U4KSwgKDB4OURDRTY0ODUpLCAoMHg1MUNFRDQ4NiksICgweDlEOEUwNUFEKSwgKDB4NTE4MTY5QUUpLCAoMHg5RDRERTM4RiksCi0vLygweDUxMzNDQzhGKSwgKDB4OUQwREZFNTIpLCAoMHg1MEU1RkQ1OSksICgweDlDQ0U1NjFFKSwgKDB4NTA5N0ZDM0MpLCAoMHg5QzhFRUIxQSksICgweDUwNDlDOTY4KSwgKDB4OUM0RkJENkUpLCAoMHg0RkZCNjU3MiksICgweDlDMTBDRDkwKSwgKDB4NEZBQ0NGQzEpLCAoMHg5QkQyMUIwNiksICgweDRGNUUwOEVCKSwgKDB4OUI5M0E2NDkpLCAoMHg0RjBGMTExRiksICgweDlCNTU2RjdFKSwgKDB4NEVCRkU4OEYpLCAoMHg5QjE3NzZDQiksCi0vLygweDRFNzA4RjZCKSwgKDB4OUFEOUJDNTcpLCAoMHg0RTIxMDVFNCksICgweDlBOUM0MDQ4KSwgKDB4NEREMTRDOTEpLCAoMHg5QTVGMDMxMiksICgweDREODE2MkQ4KSwgKDB4OUEyMjA0M0YpLCAoMHg0RDMxNDk1MSksICgweDk5RTU0NDQxKSwgKDB4NENFMTAwMkIpLCAoMHg5OUE4QzM0MCksICgweDRDOTA4Nzk5KSwgKDB4OTk2QzgxNUYpLCAoMHg0QzNGREZDQyksICgweDk5MzA3RUM1KSwgKDB4NEJFRjA5NUUpLCAoMHg5OEY0QkJFMiksCi0vLygweDRCOUUwM0IxKSwgKDB4OThCOTM4NDMpLCAoMHg0QjRDQ0Y2MCksICgweDk4N0RGNDU5KSwgKDB4NEFGQjZDOUIpLCAoMHg5ODQyRjA0OCksICgweDRBQTlEQjk2KSwgKDB4OTgwODJDMzUpLCAoMHg0QTU4MUM4MyksICgweDk3Q0RBODQ0KSwgKDB4NEEwNjJGOTMpLCAoMHg5NzkzNjQ5OSksICgweDQ5QjQxNTYyKSwgKDB4OTc1OTYxQTIpLCAoMHg0OTYxQ0Q1MyksICgweDk3MUY5RUVGKSwgKDB4NDkwRjU3RkYpLCAoMHg5NkU2MUNFRCksCi0vLygweDQ4QkNCNTlBKSwgKDB4OTZBQ0RCQzEpLCAoMHg0ODY5RTY1NyksICgweDk2NzNEQjhDKSwgKDB4NDgxNkVBNjgpLCAoMHg5NjNCMUM3MyksICgweDQ3QzNDMjAyKSwgKDB4OTYwMjlFOTkpLCAoMHg0NzcwNkRDMSksICgweDk1Q0E2MjY3KSwgKDB4NDcxQ0VEMDUpLCAoMHg5NTkyNjc3MiksICgweDQ2Qzk0MDZCKSwgKDB4OTU1QUFFMjMpLCAoMHg0Njc1NjgyNyksICgweDk1MjMzNjlEKSwgKDB4NDYyMTY0NkMpLCAoMHg5NEVDMDEwMiksCi0vLygweDQ1Q0QzNTZGKSwgKDB4OTRCNTBENzQpLCAoMHg0NTc4REI2MyksICgweDk0N0U1QzE2KSwgKDB4NDUyNDU2RTkpLCAoMHg5NDQ3RUQ0RCksICgweDQ0Q0ZBNzVDKSwgKDB4OTQxMUMwQjEpLCAoMHg0NDdBQ0Q1RCksICgweDkzREJENkFBKSwgKDB4NDQyNUM5MjApLCAoMHg5M0E2MkY1NyksICgweDQzRDA5QUQ5KSwgKDB4OTM3MENBREEpLCAoMHg0MzdCNDJCRSksICgweDkzM0JBOTU0KSwgKDB4NDMyNUMxMDIpLCAoMHg5MzA2Q0FFNyksCi0vLygweDQyRDAxNURCKSwgKDB4OTJEMjJGQjEpLCAoMHg0MjdBNDE3RCksICgweDkyOUREN0Q1KSwgKDB4NDIyNDQ0MUQpLCAoMHg5MjY5QzM3MiksICgweDQxQ0UxRUNEKSwgKDB4OTIzNUYzMkMpLCAoMHg0MTc3RDAwOSksICgweDkyMDI2NjFCKSwgKDB4NDEyMTU4RTMpLCAoMHg5MUNGMUNFMyksICgweDQwQ0FCOTkwKSwgKDB4OTE5QzE3QTQpLCAoMHg0MDczRjI0NSksICgweDkxNjk1NjdEKSwgKDB4NDAxRDAzMzkpLCAoMHg5MTM2RDk4RCksCi0vLygweDNGQzVFQ0EwKSwgKDB4OTEwNEEwRjQpLCAoMHgzRjZFQUVCMCksICgweDkwRDJBQ0QxKSwgKDB4M0YxNzQ5OUYpLCAoMHg5MEEwRkQ0MiksICgweDNFQkZCREE0KSwgKDB4OTA2RjkyNjcpLCAoMHgzRTY4MEFGMyksICgweDkwM0U2QzVEKSwgKDB4M0UxMDMxQzQpLCAoMHg5MDBEOEI0MyksICgweDNEQjgzMjRDKSwgKDB4OEZEQ0VGMzcpLCAoMHgzRDYwMENDMSksICgweDhGQUM5ODU3KSwgKDB4M0QwN0MyM0MpLCAoMHg4RjdDODczQSksCi0vLygweDNDQUY1MTMwKSwgKDB4OEY0Q0JCMEIpLCAoMHgzQzU2QkFCNSksICgweDhGMUQzNDYxKSwgKDB4M0JGREZGMDIpLCAoMHg4RUVERjM1OSksICgweDNCQTUxRTREKSwgKDB4OEVCRUY4MTApLCAoMHgzQjRDMThDRSksICgweDhFOTA0MkE0KSwgKDB4M0FGMkVFQkEpLCAoMHg4RTYxRDMzMSksICgweDNBOTlBMDRBKSwgKDB4OEUzM0E5RDUpLCAoMHgzQTQwMkRCNCksICgweDhFMDVDNkFBKSwgKDB4MzlFNjk3MkYpLCAoMHg4REQ4MjlDRSksCi0vLygweDM5OENEQ0YzKSwgKDB4OERBQUQzNUQpLCAoMHgzOTMyRkYzNyksICgweDhEN0RDMzczKSwgKDB4MzhEOEZFMzIpLCAoMHg4RDUwRkEyQiksICgweDM4N0VEQTFDKSwgKDB4OEQyNDc3QTIpLCAoMHgzODI0OTQxMyksICgweDhDRjgzQzYyKSwgKDB4MzdDQTJBODIpLCAoMHg4Q0NDNDdBNyksICgweDM3NkY5RTg4KSwgKDB4OENBMDk5RkIpLCAoMHgzNzE0RjA1QiksICgweDhDNzUzMzdCKSwgKDB4MzZCQTIwMzQpLCAoMHg4QzRBMTQ0MCksCi0vLygweDM2NUYyRTRCKSwgKDB4OEMxRjNDNjYpLCAoMHgzNjA0MUFENyksICgweDhCRjRBQzA2KSwgKDB4MzVBOEU2MTIpLCAoMHg4QkNBNjMzQyksICgweDM1NEQ5MDMzKSwgKDB4OEJBMDYyMjEpLCAoMHgzNEYyMTk3MyksICgweDhCNzZBOENFKSwgKDB4MzQ5NjgyMEEpLCAoMHg4QjREMzc1RiksICgweDM0M0FDQTMwKSwgKDB4OEIyNDBERUMpLCAoMHgzM0RFRjIxRiksICgweDhBRkIyQzhFKSwgKDB4MzM4MkZBRjkpLCAoMHg4QUQyOTNDNyksCi0vLygweDMzMjZFMzIzKSwgKDB4OEFBQTQyRTApLCAoMHgzMkNBQUJCRSksICgweDhBODIzQTVBKSwgKDB4MzI2RTU1MDUpLCAoMHg4QTVBN0E0RCksICgweDMyMTFERjMxKSwgKDB4OEEzMzAyRDMpLCAoMHgzMUI1NEE3OSksICgweDhBMEJENDAzKSwgKDB4MzE1ODk3MTgpLCAoMHg4OUU0RURGNSksICgweDMwRkJDNTQ3KSwgKDB4ODlCRTUwQzIpLCAoMHgzMDlFRDUzRSksICgweDg5OTdGQzgyKSwgKDB4MzA0MUM3MzcpLCAoMHg4OTcxRjE0QiksCi0vLygweDJGRTQ5QjZDKSwgKDB4ODk0QzJGMzYpLCAoMHgyRjg3NTIxNiksICgweDg5MjZCNjVBKSwgKDB4MkYyOUVCNkUpLCAoMHg4OTAxODZDRSksICgweDJFQ0M2N0FGKSwgKDB4ODhEQ0EwQTkpLCAoMHgyRTZFQzgwMCksICgweDg4QjgwNDVFKSwgKDB4MkUxMTBBQkYpLCAoMHg4ODkzQjE0QSksICgweDJEQjMzMTEyKSwgKDB4ODg2RkE3RTEpLCAoMHgyRDU1M0IzNSksICgweDg4NEJFODM4KSwgKDB4MkNGNzI5NjIpLCAoMHg4ODI4NzI2NiksCi0vLygweDJDOThGQkQxKSwgKDB4ODgwNTQ2ODIpLCAoMHgyQzNBQjJCRiksICgweDg3RTI2NDlGKSwgKDB4MkJEQzRFNjMpLCAoMHg4N0JGQ0NENSksICgweDJCN0RDRUZBKSwgKDB4ODc5RDdGMzgpLCAoMHgyQjFGMzRCQyksICgweDg3N0I3QkREKSwgKDB4MkFDMDdGRTUpLCAoMHg4NzU5QzJEQSksICgweDJBNjFCMEFGKSwgKDB4ODczODU0NDMpLCAoMHgyQTAyQzc1NCksICgweDg3MTczMDJEKSwgKDB4MjlBM0M0MEYpLCAoMHg4NkY2NTZBQyksCi0vLygweDI5NDRBODBEKSwgKDB4ODZENUM4MjgpLCAoMHgyOEU1NzFBMyksICgweDg2QjU4NDBFKSwgKDB4Mjg4NjIyMDApLCAoMHg4Njk1OEFDNSksICgweDI4MjZCOTVFKSwgKDB4ODY3NURDNjIpLCAoMHgyN0M3MzdGNyksICgweDg2NTY3OEY4KSwgKDB4Mjc2NzlFMDYpLCAoMHg4NjM3NjA5QSksICgweDI3MDdFQkM3KSwgKDB4ODYxODkzNUIpLCAoMHgyNkE4MjE3NCksICgweDg1RkExMTRGKSwgKDB4MjY0ODNGNDkpLCAoMHg4NURCREE4OCksCi0vLygweDI1RTg0NTgxKSwgKDB4ODVCREVGMTkpLCAoMHgyNTg4MzQ1NiksICgweDg1QTA0RjE0KSwgKDB4MjUyODBDMDUpLCAoMHg4NTgyRkE4QyksICgweDI0QzdDQ0M4KSwgKDB4ODU2NUYxOTIpLCAoMHgyNDY3NzdEMCksICgweDg1NDkzNDgyKSwgKDB4MjQwNzBCNkUpLCAoMHg4NTJDQzJEQSksICgweDIzQTY4OEQzKSwgKDB4ODUxMDlDRjcpLCAoMHgyMzQ1RjAzQiksICgweDg0RjRDMkU4KSwgKDB4MjJFNTQxRTApLCAoMHg4NEQ5MzRDMCksCi0vLygweDIyODQ3REZGKSwgKDB4ODRCREYyOTApLCAoMHgyMjIzQTREMiksICgweDg0QTJGQzY4KSwgKDB4MjFDMkI2OTcpLCAoMHg4NDg4NTI1OCksICgweDIxNjFCMzg5KSwgKDB4ODQ2REY0NzIpLCAoMHgyMTAwOUJFMyksICgweDg0NTNFMkM1KSwgKDB4MjA5RjZGRTEpLCAoMHg4NDNBMUQ2MiksICgweDIwM0UyRkMwKSwgKDB4ODQyMEE0NTkpLCAoMHgxRkRDREJCQiksICgweDg0MDc3N0I5KSwgKDB4MUY3Qjc0MEYpLCAoMHg4M0VFOTc5MiksCi0vLygweDFGMTlGOUYwKSwgKDB4ODNENjA0MzEpLCAoMHgxRUI4NkJBOSksICgweDgzQkRCRDI4KSwgKDB4MUU1NkNBNkUpLCAoMHg4M0E1QzJDNSksICgweDFERjUxNjdEKSwgKDB4ODM4RTE1MTgpLCAoMHgxRDkzNTAxMSksICgweDgzNzZCNDJFKSwgKDB4MUQzMTc3NjcpLCAoMHg4MzVGQTAxNyksICgweDFDQ0Y4Q0JCKSwgKDB4ODM0OEQ4REYpLCAoMHgxQzZEOTA0OSksICgweDgzMzI1RTk2KSwgKDB4MUMwQjgyNEUpLCAoMHg4MzFDMzE0QSksCi0vLygweDFCQTk2MzA2KSwgKDB4ODMwNjUxMDcpLCAoMHgxQjQ3MzJBRSksICgweDgyRjBCRERCKSwgKDB4MUFFNEYxODIpLCAoMHg4MkRCNzdENSksICgweDFBODI5RkMwKSwgKDB4ODJDNjdGMDApLCAoMHgxQTIwM0RBMyksICgweDgyQjFEMzZBKSwgKDB4MTlCRENDNjMpLCAoMHg4MjlENzU1MyksICgweDE5NUI0QTQ4KSwgKDB4ODI4OTY0NjApLCAoMHgxOEY4Qjg4OCksICgweDgyNzVBMEQxKSwgKDB4MTg5NjE3NjEpLCAoMHg4MjYyMkFCMyksCi0vLygweDE4MzM2NzEwKSwgKDB4ODI0RjAyMTEpLCAoMHgxN0QwQTdEMSksICgweDgyM0MyNkY4KSwgKDB4MTc2REQ5RTEpLCAoMHg4MjI5OTk3NCksICgweDE3MEFGRDdEKSwgKDB4ODIxNzU5OEUpLCAoMHgxNkE4MTJFMyksICgweDgyMDU2NzU0KSwgKDB4MTY0NTFBNEUpLCAoMHg4MUYzQzJDRiksICgweDE1RTIxM0ZEKSwgKDB4ODFFMjZDMEIpLCAoMHgxNTdGMDAyRCksICgweDgxRDE2MzEzKSwgKDB4MTUxQkRGMTkpLCAoMHg4MUMwQTdGMSksCi0vLygweDE0QjhCMTAxKSwgKDB4ODFCMDNBQUYpLCAoMHgxNDU1NzcxRCksICgweDgxQTAxQjgwKSwgKDB4MTNGMjJGQjEpLCAoMHg4MTkwNEExQyksICgweDEzOEVEQkY4KSwgKDB4ODE4MEM2QjYpLCAoMHgxMzJCN0MyRSksICgweDgxNzE5MTU4KSwgKDB4MTJDODEwOTApLCAoMHg4MTYyQUEwQSksICgweDEyNjQ5OTVEKSwgKDB4ODE1NDEwRDgpLCAoMHgxMjAxMTZEMiksICgweDgxNDVDNUM4KSwgKDB4MTE5RDg5MkIpLCAoMHg4MTM3QzhFNSksCi0vLygweDExMzlGMEE3KSwgKDB4ODEyQTFBMzYpLCAoMHgxMEQ2NEQ4MiksICgweDgxMUNCOUM0KSwgKDB4MTA3MjlGRkIpLCAoMHg4MTBGQTc5OCksICgweDEwMEVFODRFKSwgKDB4ODEwMkUzQjkpLCAoMHgwRkFCMjZCOSksICgweDgwRjY2RTMwKSwgKDB4MEY0NzVDNzgpLCAoMHg4MEVBNDcyMiksICgweDBFRTM4N0NEKSwgKDB4ODBERTZFNUEpLCAoMHgwRTdGQTlGMiksICgweDgwRDJFM0ZEKSwgKDB4MEUxQkMzMjYpLCAoMHg4MEM3QTgxMyksCi0vLygweDBEQjdEM0E1KSwgKDB4ODBCQ0JBQTMpLCAoMHgwRDUzREJBRiksICgweDgwQjIxQkI0KSwgKDB4MENFRkRCODApLCAoMHg4MEE3Q0I0QyksICgweDBDOEJEMzU2KSwgKDB4ODA5REM5NzEpLCAoMHgwQzI3QzM2RSksICgweDgwOTQxNjJCKSwgKDB4MEJDM0FDMDcpLCAoMHg4MDhBQjE3RSksICgweDBCNUY4RDVGKSwgKDB4ODA4MTlCNzApLCAoMHgwQUZCNjdCMiksICgweDgwNzhENDA3KSwgKDB4MEE5NzNCM0YpLCAoMHg4MDcwNUI0OSksCi0vLygweDBBMzMwODQ0KSwgKDB4ODA2ODMxM0IpLCAoMHgwOUNFQ0ZGRSksICgweDgwNjA1NUY1KSwgKDB4MDk2QTkwQUIpLCAoMHg4MDU4Qzk1NSksICgweDA5MDY0QjhBKSwgKDB4ODA1MThCNzIpLCAoMHgwOEEyMDBENyksICgweDgwNEE5QzUzKSwgKDB4MDgzREIwRDEpLCAoMHg4MDQzRkJGQSksICgweDA3RDk1QkI2KSwgKDB4ODAzREFBNkQpLCAoMHgwNzc1MDFDMyksICgweDgwMzdBN0FFKSwgKDB4MDcxMEEzMzcpLCAoMHg4MDMxRjNDMyksCi0vLygweDA2QUM0MDRGKSwgKDB4ODAyQzhFQUQpLCAoMHgwNjQ3RDk0OSksICgweDgwMjc3ODcxKSwgKDB4MDVFMzZFNjMpLCAoMHg4MDIyQjExMiksICgweDA1N0VGRkRDKSwgKDB4ODAxRTM4OTIpLCAoMHgwNTFBOERGMSksICgweDgwMUEwRUY1KSwgKDB4MDRCNjE4REYpLCAoMHg4MDE2MzQzRCksICgweDA0NTFBMUU2KSwgKDB4ODAxMkE4NzUpLCAoMHgwM0VEMjc0MyksICgweDgwMEY2QjhEKSwgKDB4MDM4OEFBMzMpLCAoMHg4MDBDN0Q5MCksCi0vLygweDAzMjQyQUY2KSwgKDB4ODAwOURFODEpLCAoMHgwMkJGQTlDOSksICgweDgwMDc4RTYxKSwgKDB4MDI1QjI2RTkpLCAoMHg4MDA1OEQzMSksICgweDAxRjZBMjk2KSwgKDB4ODAwM0RBRjIpLCAoMHgwMTkyMUQwQyksICgweDgwMDI3N0E3KSwgKDB4MDEyRDk2OEIpLCAoMHg4MDAxNjM0RiksICgweDAwQzkwRjRGKSwgKDB4ODAwMDlERUIpLCAoMHgwMDY0ODc5NyksICgweDgwMDAyNzdDKSwgKDB4RkZGRkZGQTMpLCAoMHg4MDAwMDAwMiksCi0vLygweEZGOUI3N0FEKSwgKDB4ODAwMDI3N0MpLCAoMHhGRjM2RjBGNSksICgweDgwMDA5REVCKSwgKDB4RkVEMjY5QkEpLCAoMHg4MDAxNjM0RSksICgweEZFNkRFMzM4KSwgKDB4ODAwMjc3QTYpLCAoMHhGRTA5NURBRiksICgweDgwMDNEQUYxKSwgKDB4RkRBNEQ5NUIpLCAoMHg4MDA1OEQyRiksICgweEZENDA1NjdDKSwgKDB4ODAwNzhFNUYpLCAoMHhGQ0RCRDU0RSksICgweDgwMDlERTdGKSwgKDB4RkM3NzU2MTEpLCAoMHg4MDBDN0Q4RSksCi0vLygweEZDMTJEOTAyKSwgKDB4ODAwRjZCOEEpLCAoMHhGQkFFNUU1RSksICgweDgwMTJBODcyKSwgKDB4RkI0OUU2NjUpLCAoMHg4MDE2MzQ0NCksICgweEZBRTU3MTU0KSwgKDB4ODAxQTBFRkQpLCAoMHhGQTgwRkY2OSksICgweDgwMUUzODlBKSwgKDB4RkExQzkwRTEpLCAoMHg4MDIyQjExQiksICgweEY5QjgyNkZCKSwgKDB4ODAyNzc4NkUpLCAoMHhGOTUzQkZGNiksICgweDgwMkM4RUE5KSwgKDB4RjhFRjVEMEUpLCAoMHg4MDMxRjNCRiksCi0vLygweEY4OEFGRTgxKSwgKDB4ODAzN0E3QUEpLCAoMHhGODI2QTQ4RSksICgweDgwM0RBQTY5KSwgKDB4RjdDMjRGNzMpLCAoMHg4MDQzRkJGNiksICgweEY3NURGRjZEKSwgKDB4ODA0QTlDNEUpLCAoMHhGNkY5QjRCQiksICgweDgwNTE4QjZFKSwgKDB4RjY5NTZGOTkpLCAoMHg4MDU4Qzk1MCksICgweEY2MzEzMDQ2KSwgKDB4ODA2MDU1RjApLCAoMHhGNUNDRjcwMSksICgweDgwNjgzMTRBKSwgKDB4RjU2OEM0MDUpLCAoMHg4MDcwNUI1OSksCi0vLygweEY1MDQ5NzkzKSwgKDB4ODA3OEQ0MTgpLCAoMHhGNEEwNzFFNiksICgweDgwODE5QjgxKSwgKDB4RjQzQzU0M0QpLCAoMHg4MDhBQjE3NyksICgweEYzRDgzQ0Q2KSwgKDB4ODA5NDE2MjQpLCAoMHhGMzc0MkNFRSksICgweDgwOURDOTZCKSwgKDB4RjMxMDI0QzQpLCAoMHg4MEE3Q0I0NSksICgweEYyQUMyNDk1KSwgKDB4ODBCMjFCQUQpLCAoMHhGMjQ4MkM5RiksICgweDgwQkNCQTlDKSwgKDB4RjFFNDNEMUUpLCAoMHg4MEM3QTgwQyksCi0vLygweEYxODA1NjUyKSwgKDB4ODBEMkUzRjUpLCAoMHhGMTFDNzg3NyksICgweDgwREU2RTUyKSwgKDB4RjBCOEEzQ0MpLCAoMHg4MEVBNDcxQSksICgweEYwNTREODhEKSwgKDB4ODBGNjZFNDcpLCAoMHhFRkYxMTZGOCksICgweDgxMDJFM0QxKSwgKDB4RUY4RDVGNEIpLCAoMHg4MTBGQTdCMCksICgweEVGMjlCMkMyKSwgKDB4ODExQ0I5QkIpLCAoMHhFRUM2MEY5RCksICgweDgxMkExQTJEKSwgKDB4RUU2Mjc3MTgpLCAoMHg4MTM3QzhEQiksCi0vLygweEVERkVFOTcyKSwgKDB4ODE0NUM1QkUpLCAoMHhFRDlCNjZFNiksICgweDgxNTQxMENFKSwgKDB4RUQzN0VGQjMpLCAoMHg4MTYyQUEwMCksICgweEVDRDQ4NDE2KSwgKDB4ODE3MTkxNEQpLCAoMHhFQzcxMjQ0QyksICgweDgxODBDNkFCKSwgKDB4RUMwREQwOTIpLCAoMHg4MTkwNEExMSksICgweEVCQUE4OTI3KSwgKDB4ODFBMDFCNzUpLCAoMHhFQjQ3NEU0NiksICgweDgxQjAzQUNEKSwgKDB4RUFFNDIwMkQpLCAoMHg4MUMwQTgxMCksCi0vLygweEVBODBGRjFBKSwgKDB4ODFEMTYzMzMpLCAoMHhFQTFERUI0QSksICgweDgxRTI2QzJDKSwgKDB4RTlCQUU1RjUpLCAoMHg4MUYzQzJDMyksICgweEU5NTdFRDYxKSwgKDB4ODIwNTY3NDgpLCAoMHhFOEY1MDJDNiksICgweDgyMTc1OTgyKSwgKDB4RTg5MjI2NjIpLCAoMHg4MjI5OTk2NyksICgweEU4MkY1ODcyKSwgKDB4ODIzQzI2RUMpLCAoMHhFN0NDOTkzMyksICgweDgyNEYwMjA0KSwgKDB4RTc2OUU4RTIpLCAoMHg4MjYyMkFBNiksCi0vLygweEU3MDc0N0JCKSwgKDB4ODI3NUEwQzMpLCAoMHhFNkE0QjVGQiksICgweDgyODk2NDUyKSwgKDB4RTY0MjMzRTApLCAoMHg4MjlENzU0NSksICgweEU1REZDMUE1KSwgKDB4ODJCMUQzOTApLCAoMHhFNTdENUY4OSksICgweDgyQzY3RjI3KSwgKDB4RTUxQjBEQzYpLCAoMHg4MkRCNzdGQyksICgweEU0QjhDQzlCKSwgKDB4ODJGMEJFMDMpLCAoMHhFNDU2OUQzRCksICgweDgzMDY1MEY4KSwgKDB4RTNGNDdERjUpLCAoMHg4MzFDMzEzQiksCi0vLygweEUzOTI2RkZBKSwgKDB4ODMzMjVFODcpLCAoMHhFMzMwNzM4OCksICgweDgzNDhEOEQwKSwgKDB4RTJDRTg4REIpLCAoMHg4MzVGQTAwNyksICgweEUyNkNCMDMxKSwgKDB4ODM3NkI0MUUpLCAoMHhFMjBBRTlDNSksICgweDgzOEUxNTA4KSwgKDB4RTFBOTM1RDQpLCAoMHg4M0E1QzJCNSksICgweEUxNDc5NDlBKSwgKDB4ODNCREJEMTcpLCAoMHhFMEU2MDY1MyksICgweDgzRDYwNDIwKSwgKDB4RTA4NDhCM0IpLCAoMHg4M0VFOTdDMCksCi0vLygweEUwMjMyMzhGKSwgKDB4ODQwNzc3RTgpLCAoMHhERkMxQ0Y4QSksICgweDg0MjBBNDg4KSwgKDB4REY2MDhGNjkpLCAoMHg4NDNBMUQ5MiksICgweERFRkY2NDVGKSwgKDB4ODQ1M0UyQjQpLCAoMHhERTlFNENCOSksICgweDg0NkRGNDYwKSwgKDB4REUzRDQ5QUIpLCAoMHg4NDg4NTI0NiksICgweEREREM1QjZGKSwgKDB4ODRBMkZDNTUpLCAoMHhERDdCODI0MyksICgweDg0QkRGMjdFKSwgKDB4REQxQUJFNjIpLCAoMHg4NEQ5MzRBRSksCi0vLygweERDQkExMDA3KSwgKDB4ODRGNEMyRDYpLCAoMHhEQzU5Nzc2RSksICgweDg1MTA5Q0U0KSwgKDB4REJGOEY0RDMpLCAoMHg4NTJDQzJDNyksICgweERCOTg4ODcyKSwgKDB4ODU0OTM0NkUpLCAoMHhEQjM4MzI4NSksICgweDg1NjVGMUM4KSwgKDB4REFEN0YzNDgpLCAoMHg4NTgyRkFDMiksICgweERBNzdDQUY2KSwgKDB4ODVBMDRGNEIpLCAoMHhEQTE3QkFDMSksICgweDg1QkRFRjA1KSwgKDB4RDlCN0MwRjgpLCAoMHg4NURCREE3MyksCi0vLygweEQ5NTdERUNEKSwgKDB4ODVGQTExM0EpLCAoMHhEOEY4MTQ3QSksICgweDg2MTg5MzQ2KSwgKDB4RDg5ODYyM0IpLCAoMHg4NjM3NjA4NSksICgweEQ4MzhDODRBKSwgKDB4ODY1Njc4RTMpLCAoMHhEN0Q5NDZFMyksICgweDg2NzVEQzREKSwgKDB4RDc3OURFNDEpLCAoMHg4Njk1OEFCMCksICgweEQ3MUE4RTlEKSwgKDB4ODZCNTgzRjgpLCAoMHhENkJCNTgzNCksICgweDg2RDVDODEyKSwgKDB4RDY1QzNCNDApLCAoMHg4NkY2NTZFOSksCi0vLygweEQ1RkQzN0ZCKSwgKDB4ODcxNzMwNkIpLCAoMHhENTlFNEVBMCksICgweDg3Mzg1NDgxKSwgKDB4RDUzRjdGNkEpLCAoMHg4NzU5QzMxOSksICgweEQ0RTBDQjg0KSwgKDB4ODc3QjdCQzYpLCAoMHhENDgyMzE0NyksICgweDg3OUQ3RjIwKSwgKDB4RDQyM0IxREQpLCAoMHg4N0JGQ0NCRCksICgweEQzQzU0RDgyKSwgKDB4ODdFMjY0ODgpLCAoMHhEMzY3MDQ2RiksICgweDg4MDU0NjZBKSwgKDB4RDMwOEQ2REUpLCAoMHg4ODI4NzI0RiksCi0vLygweEQyQUFDNTBBKSwgKDB4ODg0QkU4MjApLCAoMHhEMjRDQ0YyRCksICgweDg4NkZBN0M4KSwgKDB4RDFFRUY1ODEpLCAoMHg4ODkzQjEzMiksICgweEQxOTEzODNGKSwgKDB4ODhCODA0NDYpLCAoMHhEMTMzOTdBMiksICgweDg4RENBMEVFKSwgKDB4RDBENjEzRTMpLCAoMHg4OTAxODcxMyksICgweEQwNzhBRDNDKSwgKDB4ODkyNkI2QTApLCAoMHhEMDFCNjNFNiksICgweDg5NEMyRjdEKSwgKDB4Q0ZCRTM5MDgpLCAoMHg4OTcxRjEzMiksCi0vLygweENGNjEyQjAxKSwgKDB4ODk5N0ZDNjgpLCAoMHhDRjA0M0FGOCksICgweDg5QkU1MEE4KSwgKDB4Q0VBNzY5MjcpLCAoMHg4OUU0RUREQiksICgweENFNEFCNUM2KSwgKDB4OEEwQkQzRTgpLCAoMHhDREVFMjEwRSksICgweDhBMzMwMkI4KSwgKDB4Q0Q5MUFCMzkpLCAoMHg4QTVBN0EzMiksICgweENEMzU1NDgwKSwgKDB4OEE4MjNBM0YpLCAoMHhDQ0Q5MUQxQyksICgweDhBQUE0MkM1KSwgKDB4Q0M3RDA1NDUpLCAoMHg4QUQyOTNBQyksCi0vLygweENDMjEwRDM1KSwgKDB4OEFGQjJDREIpLCAoMHhDQkM1MzUyNCksICgweDhCMjQwRTM4KSwgKDB4Q0I2OTdENEIpLCAoMHg4QjREMzdBQyksICgweENCMERFNkNCKSwgKDB4OEI3NkE4QjIpLCAoMHhDQUIyNzAwQiksICgweDhCQTA2MjA0KSwgKDB4Q0E1NzFBMkMpLCAoMHg4QkNBNjMxRiksICgweEM5RkJFNTY3KSwgKDB4OEJGNEFCRTkpLCAoMHhDOUEwRDFGMyksICgweDhDMUYzQzQ5KSwgKDB4Qzk0NUUwMEEpLCAoMHg4QzRBMTQyMyksCi0vLygweEM4RUIwRkUzKSwgKDB4OEM3NTMzNUQpLCAoMHhDODkwNjFCNiksICgweDhDQTA5OURFKSwgKDB4QzgzNUQ1QkIpLCAoMHg4Q0NDNDc4OSksICgweEM3REI2QzJBKSwgKDB4OENGODNDNDQpLCAoMHhDNzgxMjUzQiksICgweDhEMjQ3N0Y1KSwgKDB4QzcyNzAxMjYpLCAoMHg4RDUwRkE3RiksICgweEM2Q0QwMDIxKSwgKDB4OEQ3REMzQzcpLCAoMHhDNjczMjI2NSksICgweDhEQUFEM0IyKSwgKDB4QzYxOTY4MkEpLCAoMHg4REQ4MkEyMyksCi0vLygweEM1QkZEMUE1KSwgKDB4OEUwNUM2RkYpLCAoMHhDNTY2NUYwRiksICgweDhFMzNBQTJBKSwgKDB4QzUwRDEwOUYpLCAoMHg4RTYxRDM4OCksICgweEM0QjNFNjhDKSwgKDB4OEU5MDQyRkIpLCAoMHhDNDVBRTEwRCksICgweDhFQkVGODY4KSwgKDB4QzQwMjAwNTgpLCAoMHg4RUVERjNCMSksICgweEMzQTk0NjY5KSwgKDB4OEYxRDMzQzgpLCAoMHhDMzUwQUZFRSksICgweDhGNENCQTcxKSwgKDB4QzJGODNFRTEpLCAoMHg4RjdDODZBMCksCi0vLygweEMyOUZGMzdCKSwgKDB4OEZBQzk4MzYpLCAoMHhDMjQ3Q0RGMCksICgweDhGRENFRjE2KSwgKDB4QzFFRkNFNzgpLCAoMHg5MDBEOEIyMSksICgweEMxOTdGNTQ4KSwgKDB4OTAzRTZDM0IpLCAoMHhDMTQwNDI5OCksICgweDkwNkY5MjQ1KSwgKDB4QzBFOEI2OUMpLCAoMHg5MEEwRkQyMSksICgweEMwOTE1MThCKSwgKDB4OTBEMkFDQUYpLCAoMHhDMDNBMTM5QiksICgweDkxMDRBMEQyKSwgKDB4QkZFMkZEMDIpLCAoMHg5MTM2RDk2QiksCi0vLygweEJGOEMwREY2KSwgKDB4OTE2OTU2NUEpLCAoMHhCRjM1NDZBQiksICgweDkxOUMxNzgxKSwgKDB4QkVERUE3NTgpLCAoMHg5MUNGMUNDMCksICgweEJFODgzMDMyKSwgKDB4OTIwMjY1RjgpLCAoMHhCRTMxRTE2RSksICgweDkyMzVGMzA5KSwgKDB4QkREQkJCNDIpLCAoMHg5MjY5QzNEMyksICgweEJEODVCREUyKSwgKDB4OTI5REQ4MzcpLCAoMHhCRDJGRTk4NSksICgweDkyRDIzMDEzKSwgKDB4QkNEQTNFNUUpLCAoMHg5MzA2Q0I0OSksCi0vLygweEJDODRCQ0EyKSwgKDB4OTMzQkE5QjcpLCAoMHhCQzJGNjQ4NyksICgweDkzNzBDQjNEKSwgKDB4QkJEQTM2NDEpLCAoMHg5M0E2MkZCQiksICgweEJCODUzMjA1KSwgKDB4OTNEQkQ3MEUpLCAoMHhCQjMwNTgwNiksICgweDk0MTFDMTE2KSwgKDB4QkFEQkE4NzkpLCAoMHg5NDQ3RURCMyksICgweEJBODcyNTQyKSwgKDB4OTQ3RTVCQUIpLCAoMHhCQTMyQ0IzNSksICgweDk0QjUwRDA5KSwgKDB4QjlERTlDMzgpLCAoMHg5NEVDMDA5NyksCi0vLygweEI5OEE5ODdEKSwgKDB4OTUyMzM2MzEpLCAoMHhCOTM2QzAzOSksICgweDk1NUFBREI2KSwgKDB4QjhFMzEzOUUpLCAoMHg5NTkyNjcwNSksICgweEI4OEY5MkUyKSwgKDB4OTVDQTYxRkEpLCAoMHhCODNDM0UzNyksICgweDk2MDI5RTczKSwgKDB4QjdFOTE1RDApLCAoMHg5NjNCMUM0RCksICgweEI3OTYxOUUyKSwgKDB4OTY3M0RCNjYpLCAoMHhCNzQzNEE5RSksICgweDk2QUNEQjlBKSwgKDB4QjZGMEE4MzkpLCAoMHg5NkU2MUNDNiksCi0vLygweEI2OUUzMkU1KSwgKDB4OTcxRjlFQzgpLCAoMHhCNjRCRUFENSksICgweDk3NTk2MTdCKSwgKDB4QjVGOUQwM0MpLCAoMHg5NzkzNjRCQyksICgweEI1QTdFMzREKSwgKDB4OTdDREE4NjcpLCAoMHhCNTU2MjQzOSksICgweDk4MDgyQzU4KSwgKDB4QjUwNDkzMzQpLCAoMHg5ODQyRjA2QiksICgweEI0QjMzMDcwKSwgKDB4OTg3REY0N0MpLCAoMHhCNDYxRkMxRiksICgweDk4QjkzODY2KSwgKDB4QjQxMEY2NzIpLCAoMHg5OEY0QkMwNiksCi0vLygweEIzQzAxRjlEKSwgKDB4OTkzMDdGMzUpLCAoMHhCMzZGNzdEMSksICgweDk5NkM4MUQwKSwgKDB4QjMxRUZGM0YpLCAoMHg5OUE4QzNCMCksICgweEIyQ0VCNjFBKSwgKDB4OTlFNTQ0QjIpLCAoMHhCMjdFOUM5MiksICgweDlBMjIwNEIwKSwgKDB4QjIyRUIyREEpLCAoMHg5QTVGMDM4NCksICgweEIxREVGOTIyKSwgKDB4OUE5QzQxMDkpLCAoMHhCMThGNzEzMCksICgweDlBRDlCQkRGKSwgKDB4QjE0MDE4MEMpLCAoMHg5QjE3NzY1MiksCi0vLygweEIwRjBFRjdCKSwgKDB4OUI1NTZGMDQpLCAoMHhCMEExRjdBRiksICgweDlCOTNBNUNGKSwgKDB4QjA1MzMwRDgpLCAoMHg5QkQyMUE4QyksICgweEIwMDQ5QjI3KSwgKDB4OUMxMENEMTUpLCAoMHhBRkI2MzZDRCksICgweDlDNEZCRDQzKSwgKDB4QUY2ODAzRjkpLCAoMHg5QzhFRUFFRiksICgweEFGMUEwMkRDKSwgKDB4OUNDRTU1RjMpLCAoMHhBRUNDMzNBNSksICgweDlEMERGRTI3KSwgKDB4QUU3RTk2ODYpLCAoMHg5RDRERTM2MyksCi0vLygweEFFMzEyQkFFKSwgKDB4OUQ4RTA1ODEpLCAoMHhBREUzRjM0RCksICgweDlEQ0U2NDU5KSwgKDB4QUQ5NkVEOTEpLCAoMHg5RTBFRkZDMyksICgweEFENEExQUFDKSwgKDB4OUU0RkQ3OTgpLCAoMHhBQ0ZEN0FDQyksICgweDlFOTBFQkFGKSwgKDB4QUNCMTBFMjApLCAoMHg5RUQyM0JFMCksICgweEFDNjRENEQ4KSwgKDB4OUYxM0M4MDMpLCAoMHhBQzE4Q0YyMiksICgweDlGNTU4RkYwKSwgKDB4QUJDQ0ZEMkUpLCAoMHg5Rjk3OTM3RCksCi0vLygweEFCODE1RjJBKSwgKDB4OUZEOUQyODMpLCAoMHhBQjM1RjU0NSksICgweEEwMUM0Q0Q4KSwgKDB4QUFFQUJGQUUpLCAoMHhBMDVGMDI1MyksICgweEFBOUZCRTkyKSwgKDB4QTBBMUYyQ0MpLCAoMHhBQTU0RjIyMSksICgweEEwRTUxRTE4KSwgKDB4QUEwQTVBODgpLCAoMHhBMTI4ODQwRiksICgweEE5QkZGN0Y1KSwgKDB4QTE2QzI0ODcpLCAoMHhBOTc1Q0MwRiksICgweEExQUZGREZDKSwgKDB4QTkyQkQ0MTEpLCAoMHhBMUY0MTJGNyksCi0vLygweEE4RTIxMUEyKSwgKDB4QTIzODYxRjUpLCAoMHhBODk4ODRGMSksICgweEEyN0NFQUNEKSwgKDB4QTg0RjJFMkEpLCAoMHhBMkMxQUQ1MyksICgweEE4MDYwRDdBKSwgKDB4QTMwNkE5NUUpLCAoMHhBN0JEMjMxMCksICgweEEzNEJERUMzKSwgKDB4QTc3NDZGMTcpLCAoMHhBMzkxNEQ1NyksICgweEE3MkJGMUJDKSwgKDB4QTNENkY0RjApLCAoMHhBNkUzQUIyRCksICgweEE0MUNENTYyKSwgKDB4QTY5QjlCOTYpLCAoMHhBNDYyRUU4MiksCi0vLygweEE2NTNDMzIzKSwgKDB4QTRBOTQwMjYpLCAoMHhBNjBDMjIwMCksICgweEE0RUZDQTIxKSwgKDB4QTVDNEI4NUIpLCAoMHhBNTM2OEM0OCksICgweEE1N0Q4NjVFKSwgKDB4QTU3RDg2NzApLCAoMHhBNTM2OEMzNiksICgweEE1QzRCODZEKSwgKDB4QTRFRkNBMEYpLCAoMHhBNjBDMjIxMyksICgweEE0QTk0MDE0KSwgKDB4QTY1M0MzMzUpLCAoMHhBNDYyRUU3MCksICgweEE2OUI5QkE4KSwgKDB4QTQxQ0Q1NTApLCAoMHhBNkUzQUIzRiksCi0vLygweEEzRDZGNERFKSwgKDB4QTcyQkYxQ0YpLCAoMHhBMzkxNEQ0NiksICgweEE3NzQ2RjI5KSwgKDB4QTM0QkRFQjIpLCAoMHhBN0JEMjMyMiksICgweEEzMDZBOTREKSwgKDB4QTgwNjBEOEQpLCAoMHhBMkMxQUQ0MiksICgweEE4NEYyRTNEKSwgKDB4QTI3Q0VBQkIpLCAoMHhBODk4ODUwNCksICgweEEyMzg2MUU0KSwgKDB4QThFMjExQjUpLCAoMHhBMUY0MTJFNiksICgweEE5MkJENDI0KSwgKDB4QTFBRkZGNDUpLCAoMHhBOTc1Q0FBOSksCi0vLygweEExNkMyNDc2KSwgKDB4QTlCRkY4MDgpLCAoMHhBMTI4ODNGRSksICgweEFBMEE1QTlCKSwgKDB4QTBFNTFFMDcpLCAoMHhBQTU0RjIzNCksICgweEEwQTFGMkJCKSwgKDB4QUE5RkJFQTUpLCAoMHhBMDVGMDI0MiksICgweEFBRUFCRkMxKSwgKDB4QTAxQzRDQzcpLCAoMHhBQjM1RjU1OSksICgweDlGRDlEMjcyKSwgKDB4QUI4MTVGM0UpLCAoMHg5Rjk3OTM2QyksICgweEFCQ0NGRDQxKSwgKDB4OUY1NThGREYpLCAoMHhBQzE4Q0YzNSksCi0vLygweDlGMTNDN0YyKSwgKDB4QUM2NEQ0RUIpLCAoMHg5RUQyM0JDRiksICgweEFDQjEwRTMzKSwgKDB4OUU5MEVCOUUpLCAoMHhBQ0ZEN0FERiksICgweDlFNEZENzg3KSwgKDB4QUQ0QTFBQzApLCAoMHg5RTBFRkZCMyksICgweEFEOTZFREE1KSwgKDB4OURDRTY0NDkpLCAoMHhBREUzRjM2MCksICgweDlEOEUwNTcxKSwgKDB4QUUzMTJCQzIpLCAoMHg5RDRERTM1MyksICgweEFFN0U5NjlBKSwgKDB4OUQwREZFMTYpLCAoMHhBRUNDMzNCOSksCi0vLygweDlDQ0U1NUUzKSwgKDB4QUYxQTAyRUYpLCAoMHg5QzhFRUFERiksICgweEFGNjgwNDBEKSwgKDB4OUM0RkJEMzMpLCAoMHhBRkI2MzZFMSksICgweDlDMTBDRDA1KSwgKDB4QjAwNDlCM0IpLCAoMHg5QkQyMUE3QyksICgweEIwNTMzMEVDKSwgKDB4OUI5M0E1QkYpLCAoMHhCMEExRjdDMyksICgweDlCNTU2RUY0KSwgKDB4QjBGMEVGOTApLCAoMHg5QjE3NzY0MiksICgweEIxNDAxODIwKSwgKDB4OUFEOUJEMDkpLCAoMHhCMThGNkZCMCksCi0vLygweDlBOUM0MEY5KSwgKDB4QjFERUY5MzYpLCAoMHg5QTVGMDM3NSksICgweEIyMkVCMkVFKSwgKDB4OUEyMjA0QTEpLCAoMHhCMjdFOUNBNiksICgweDk5RTU0NEEzKSwgKDB4QjJDRUI2MkUpLCAoMHg5OUE4QzNBMSksICgweEIzMUVGRjU0KSwgKDB4OTk2QzgxQzApLCAoMHhCMzZGNzdFNSksICgweDk5MzA3RjI2KSwgKDB4QjNDMDFGQjIpLCAoMHg5OEY0QkJGNiksICgweEI0MTBGNjg3KSwgKDB4OThCOTM4NTcpLCAoMHhCNDYxRkMzMyksCi0vLygweDk4N0RGNDZEKSwgKDB4QjRCMzMwODUpLCAoMHg5ODQyRjA1QyksICgweEI1MDQ5MzQ5KSwgKDB4OTgwODJDNDkpLCAoMHhCNTU2MjQ0RSksICgweDk3Q0RBODU4KSwgKDB4QjVBN0UzNjIpLCAoMHg5NzkzNjRBRCksICgweEI1RjlEMDUxKSwgKDB4OTc1OTYxNkMpLCAoMHhCNjRCRUFFQSksICgweDk3MUY5RUI5KSwgKDB4QjY5RTMyRkEpLCAoMHg5NkU2MUNCOCksICgweEI2RjBBODRFKSwgKDB4OTZBQ0RCOEIpLCAoMHhCNzQzNEFCMyksCi0vLygweDk2NzNEQjU3KSwgKDB4Qjc5NjE5RjcpLCAoMHg5NjNCMUMzRiksICgweEI3RTkxNUU1KSwgKDB4OTYwMjlFNjQpLCAoMHhCODNDM0U0QyksICgweDk1Q0E2MUVCKSwgKDB4Qjg4RjkyRjcpLCAoMHg5NTkyNjZGNyksICgweEI4RTMxM0I0KSwgKDB4OTU1QUFEQTgpLCAoMHhCOTM2QzA0RSksICgweDk1MjMzNjIzKSwgKDB4Qjk4QTk4OTMpLCAoMHg5NEVDMDA4OSksICgweEI5REU5QzREKSwgKDB4OTRCNTBFMTMpLCAoMHhCQTMyQzk5RSksCi0vLygweDk0N0U1Q0IzKSwgKDB4QkE4NzIzQTkpLCAoMHg5NDQ3RURBNSksICgweEJBREJBODhGKSwgKDB4OTQxMUMxMDkpLCAoMHhCQjMwNTgxQiksICgweDkzREJENzAwKSwgKDB4QkI4NTMyMUEpLCAoMHg5M0E2MkZBRCksICgweEJCREEzNjU3KSwgKDB4OTM3MENCMzApLCAoMHhCQzJGNjQ5RCksICgweDkzM0JBOUFBKSwgKDB4QkM4NEJDQjgpLCAoMHg5MzA2Q0IzQyksICgweEJDREEzRTc0KSwgKDB4OTJEMjMwMDYpLCAoMHhCRDJGRTk5QiksCi0vLygweDkyOUREODI5KSwgKDB4QkQ4NUJERjgpLCAoMHg5MjY5QzNDNiksICgweEJEREJCQjU4KSwgKDB4OTIzNUYyRkMpLCAoMHhCRTMxRTE4NCksICgweDkyMDI2NUVCKSwgKDB4QkU4ODMwNDgpLCAoMHg5MUNGMUNCMyksICgweEJFREVBNzZFKSwgKDB4OTE5QzE3NzQpLCAoMHhCRjM1NDZDMSksICgweDkxNjk1NjREKSwgKDB4QkY4QzBFMEMpLCAoMHg5MTM2RDk1RSksICgweEJGRTJGRDE4KSwgKDB4OTEwNEEwQzUpLCAoMHhDMDNBMTNCMiksCi0vLygweDkwRDJBQ0EyKSwgKDB4QzA5MTUxQTIpLCAoMHg5MEEwRkQxNCksICgweEMwRThCNkIyKSwgKDB4OTA2RjkyMzkpLCAoMHhDMTQwNDJBRSksICgweDkwM0U2QzJGKSwgKDB4QzE5N0Y1NUYpLCAoMHg5MDBEOEIxNSksICgweEMxRUZDRThFKSwgKDB4OEZEQ0VGMDkpLCAoMHhDMjQ3Q0UwNyksICgweDhGQUM5ODI5KSwgKDB4QzI5RkYzOTEpLCAoMHg4RjdDODY5NCksICgweEMyRjgzRUY4KSwgKDB4OEY0Q0JBNjUpLCAoMHhDMzUwQjAwNCksCi0vLygweDhGMUQzNEFEKSwgKDB4QzNBOTQ0QkMpLCAoMHg4RUVERjNBNSksICgweEM0MDIwMDZGKSwgKDB4OEVCRUY4NUMpLCAoMHhDNDVBRTEyMyksICgweDhFOTA0MkVGKSwgKDB4QzRCM0U2QTMpLCAoMHg4RTYxRDM3QyksICgweEM1MEQxMEI2KSwgKDB4OEUzM0FBMUYpLCAoMHhDNTY2NUYyNiksICgweDhFMDVDNkY0KSwgKDB4QzVCRkQxQkMpLCAoMHg4REQ4MkExNyksICgweEM2MTk2ODQwKSwgKDB4OERBQUQzQTYpLCAoMHhDNjczMjI3QyksCi0vLygweDhEN0RDM0JCKSwgKDB4QzZDRDAwMzgpLCAoMHg4RDUwRkE3MyksICgweEM3MjcwMTNEKSwgKDB4OEQyNDc3RTkpLCAoMHhDNzgxMjU1MiksICgweDhDRjgzQzM5KSwgKDB4QzdEQjZDNDEpLCAoMHg4Q0NDNDc3RSksICgweEM4MzVENUQyKSwgKDB4OENBMDk5RDMpLCAoMHhDODkwNjFDRCksICgweDhDNzUzMzUyKSwgKDB4QzhFQjBGRkEpLCAoMHg4QzRBMTQxOCksICgweEM5NDVFMDIxKSwgKDB4OEMxRjNDM0UpLCAoMHhDOUEwRDIwQSksCi0vLygweDhCRjRBQkRGKSwgKDB4QzlGQkU1N0UpLCAoMHg4QkNBNjMxNCksICgweENBNTcxQTQzKSwgKDB4OEJBMDYxRjkpLCAoMHhDQUIyNzAyMiksICgweDhCNzZBOEE3KSwgKDB4Q0IwREU2RTIpLCAoMHg4QjREMzczOCksICgweENCNjk3RTRDKSwgKDB4OEIyNDBEQzUpLCAoMHhDQkM1MzYyNSksICgweDhBRkIyQzY4KSwgKDB4Q0MyMTBFMzcpLCAoMHg4QUQyOTMzQSksICgweENDN0QwNjQ3KSwgKDB4OEFBQTQyNTQpLCAoMHhDQ0Q5MUUxRSksCi0vLygweDhBODIzQTlBKSwgKDB4Q0QzNTUzQUQpLCAoMHg4QTVBN0E4RCksICgweENEOTFBQTY2KSwgKDB4OEEzMzAzMTIpLCAoMHhDREVFMjAzQSksICgweDhBMEJENDQyKSwgKDB4Q0U0QUI0RjEpLCAoMHg4OUU0RUUzNCksICgweENFQTc2ODUyKSwgKDB4ODlCRTUxMDApLCAoMHhDRjA0M0EyNCksICgweDg5OTdGQ0JGKSwgKDB4Q0Y2MTJBMkMpLCAoMHg4OTcxRjE4OCksICgweENGQkUzODMzKSwgKDB4ODk0QzJGNzMpLCAoMHhEMDFCNjNGRSksCi0vLygweDg5MjZCNjk3KSwgKDB4RDA3OEFENTMpLCAoMHg4OTAxODcwQSksICgweEQwRDYxM0ZCKSwgKDB4ODhEQ0EwRTQpLCAoMHhEMTMzOTdCQSksICgweDg4QjgwNDNDKSwgKDB4RDE5MTM4NTcpLCAoMHg4ODkzQjEyOCksICgweEQxRUVGNTk5KSwgKDB4ODg2RkE3QkYpLCAoMHhEMjRDQ0Y0NSksICgweDg4NEJFODE3KSwgKDB4RDJBQUM1MjIpLCAoMHg4ODI4NzI0NiksICgweEQzMDhENkY2KSwgKDB4ODgwNTQ2NjEpLCAoMHhEMzY3MDQ4NyksCi0vLygweDg3RTI2NDdGKSwgKDB4RDNDNTREOUEpLCAoMHg4N0JGQ0NCNSksICgweEQ0MjNCMUY1KSwgKDB4ODc5RDdGMTgpLCAoMHhENDgyMzE1RiksICgweDg3N0I3QkJEKSwgKDB4RDRFMENCOUMpLCAoMHg4NzU5QzJCQSksICgweEQ1M0Y4MDc0KSwgKDB4ODczODU0MjQpLCAoMHhENTlFNEZBQSksICgweDg3MTczMDBFKSwgKDB4RDVGRDM5MDUpLCAoMHg4NkY2NTY4RSksICgweEQ2NUMzQzRBKSwgKDB4ODZENUM3QjcpLCAoMHhENkJCNTkzRiksCi0vLygweDg2QjU4MzlFKSwgKDB4RDcxQThGQTgpLCAoMHg4Njk1OEFGOSksICgweEQ3NzlERDY2KSwgKDB4ODY3NURDOTUpLCAoMHhEN0Q5NDYwOCksICgweDg2NTY3OTJBKSwgKDB4RDgzOEM3NkYpLCAoMHg4NjM3NjBDQyksICgweEQ4OTg2MTYwKSwgKDB4ODYxODkzOEQpLCAoMHhEOEY4MTM5RiksICgweDg1RkExMTgwKSwgKDB4RDk1N0RERjEpLCAoMHg4NURCREFCOCksICgweEQ5QjdDMDFDKSwgKDB4ODVCREVGNDkpLCAoMHhEQTE3QjlFNSksCi0vLygweDg1QTA0RjQzKSwgKDB4REE3N0NCMEYpLCAoMHg4NTgyRkFCQiksICgweERBRDdGMzYwKSwgKDB4ODU2NUYxQzEpLCAoMHhEQjM4MzI5RCksICgweDg1NDkzNDY3KSwgKDB4REI5ODg4OEEpLCAoMHg4NTJDQzJDMCksICgweERCRjhGNEVDKSwgKDB4ODUxMDlDREQpLCAoMHhEQzU5Nzc4NyksICgweDg0RjRDMkNGKSwgKDB4RENCQTEwMjApLCAoMHg4NEQ5MzRBNyksICgweEREMUFCRTdBKSwgKDB4ODRCREYyNzcpLCAoMHhERDdCODI1QyksCi0vLygweDg0QTJGQzRGKSwgKDB4REREQzVCODgpLCAoMHg4NDg4NTIzRiksICgweERFM0Q0OUMzKSwgKDB4ODQ2REY0NUEpLCAoMHhERTlFNENEMiksICgweDg0NTNFMkFEKSwgKDB4REVGRjY0NzgpLCAoMHg4NDNBMUQ0QiksICgweERGNjA5MDdBKSwgKDB4ODQyMEE0NDEpLCAoMHhERkMxRDA5QiksICgweDg0MDc3N0EyKSwgKDB4RTAyMzI0QTApLCAoMHg4M0VFOTc3QSksICgweEUwODQ4QzRDKSwgKDB4ODNENjAzREMpLCAoMHhFMEU2MDc2NCksCi0vLygweDgzQkRCQ0Q0KSwgKDB4RTE0Nzk1QUIpLCAoMHg4M0E1QzJFQyksICgweEUxQTkzNEY0KSwgKDB4ODM4RTE1M0UpLCAoMHhFMjBBRThFNSksICgweDgzNzZCNDU0KSwgKDB4RTI2Q0FGNTEpLCAoMHg4MzVGQTAzQyksICgweEUyQ0U4N0ZCKSwgKDB4ODM0OEQ5MDQpLCAoMHhFMzMwNzJBNyksICgweDgzMzI1RUJBKSwgKDB4RTM5MjZGMTkpLCAoMHg4MzFDMzE2RCksICgweEUzRjQ3RDE0KSwgKDB4ODMwNjUxMkEpLCAoMHhFNDU2OUM1QyksCi0vLygweDgyRjBCREZFKSwgKDB4RTRCOENDQjQpLCAoMHg4MkRCNzdGNyksICgweEU1MUIwRERGKSwgKDB4ODJDNjdGMjEpLCAoMHhFNTdENUZBMiksICgweDgyQjFEMzhCKSwgKDB4RTVERkMxQkUpLCAoMHg4MjlENzU0MCksICgweEU2NDIzM0Y5KSwgKDB4ODI4OTY0NEQpLCAoMHhFNkE0QjYxNCksICgweDgyNzVBMEJFKSwgKDB4RTcwNzQ3RDQpLCAoMHg4MjYyMkFBMSksICgweEU3NjlFOEZCKSwgKDB4ODI0RjAyMDApLCAoMHhFN0NDOTk0QyksCi0vLygweDgyM0MyNkU3KSwgKDB4RTgyRjU4OEMpLCAoMHg4MjI5OTk2MiksICgweEU4OTIyNjdDKSwgKDB4ODIxNzU5N0QpLCAoMHhFOEY1MDJERiksICgweDgyMDU2NzQzKSwgKDB4RTk1N0VEN0EpLCAoMHg4MUYzQzJCRiksICgweEU5QkFFNjBFKSwgKDB4ODFFMjZCRkIpLCAoMHhFQTFERUM1RiksICgweDgxRDE2MzAzKSwgKDB4RUE4MTAwMzApLCAoMHg4MUMwQTdFMSksICgweEVBRTQyMTQzKSwgKDB4ODFCMDNBQTApLCAoMHhFQjQ3NEY1QyksCi0vLygweDgxQTAxQjQ4KSwgKDB4RUJBQThBM0QpLCAoMHg4MTkwNEEzNSksICgweEVDMERDRkFGKSwgKDB4ODE4MEM2Q0YpLCAoMHhFQzcxMjM2OCksICgweDgxNzE5MTcwKSwgKDB4RUNENDgzMzIpLCAoMHg4MTYyQUEyMiksICgweEVEMzdFRUNGKSwgKDB4ODE1NDEwRUYpLCAoMHhFRDlCNjYwMiksICgweDgxNDVDNURGKSwgKDB4RURGRUU4OEUpLCAoMHg4MTM3QzhGQiksICgweEVFNjI3NjM0KSwgKDB4ODEyQTFBNEMpLCAoMHhFRUM2MEVCOSksCi0vLygweDgxMUNCOURBKSwgKDB4RUYyOUIxREQpLCAoMHg4MTBGQTdBRCksICgweEVGOEQ1RjY1KSwgKDB4ODEwMkUzQ0UpLCAoMHhFRkYxMTcxMSksICgweDgwRjY2RTQ0KSwgKDB4RjA1NEQ4QTYpLCAoMHg4MEVBNDcxNyksICgweEYwQjhBM0U1KSwgKDB4ODBERTZFNEYpLCAoMHhGMTFDNzg5MSksICgweDgwRDJFM0YyKSwgKDB4RjE4MDU2NkIpLCAoMHg4MEM3QTgwOSksICgweEYxRTQzRDM4KSwgKDB4ODBCQ0JBOTkpLCAoMHhGMjQ4MkNCOCksCi0vLygweDgwQjIxQkFBKSwgKDB4RjJBQzI0QUYpLCAoMHg4MEE3Q0I0MiksICgweEYzMTAyNERFKSwgKDB4ODA5REM5NjgpLCAoMHhGMzc0MkQwOCksICgweDgwOTQxNjIyKSwgKDB4RjNEODNDRUYpLCAoMHg4MDhBQjE3NSksICgweEY0M0M1NDU2KSwgKDB4ODA4MTlCNjgpLCAoMHhGNEEwNzJGRiksICgweDgwNzhEM0ZGKSwgKDB4RjUwNDk4QUIpLCAoMHg4MDcwNUI0MiksICgweEY1NjhDNTFFKSwgKDB4ODA2ODMxMzQpLCAoMHhGNUNDRjgxOSksCi0vLygweDgwNjA1NURCKSwgKDB4RjYzMTMxNUYpLCAoMHg4MDU4QzkzQiksICgweEY2OTU3MEIyKSwgKDB4ODA1MThCN0UpLCAoMHhGNkY5QjNENSksICgweDgwNEE5QzVFKSwgKDB4Rjc1REZFODcpLCAoMHg4MDQzRkMwNSksICgweEY3QzI0RThEKSwgKDB4ODAzREFBNzcpLCAoMHhGODI2QTNBOCksICgweDgwMzdBN0I4KSwgKDB4Rjg4QUZEOUIpLCAoMHg4MDMxRjNDQiksICgweEY4RUY1QzI4KSwgKDB4ODAyQzhFQjUpLCAoMHhGOTUzQkYxMCksCi0vLygweDgwMjc3ODc5KSwgKDB4RjlCODI2MTUpLCAoMHg4MDIyQjExOSksICgweEZBMUM5MEZCKSwgKDB4ODAxRTM4OTkpLCAoMHhGQTgwRkY4MiksICgweDgwMUEwRUZDKSwgKDB4RkFFNTcxNkQpLCAoMHg4MDE2MzQ0MyksICgweEZCNDlFNjdGKSwgKDB4ODAxMkE4NzIpLCAoMHhGQkFFNUU3OCksICgweDgwMEY2QjhBKSwgKDB4RkMxMkQ5MUIpLCAoMHg4MDBDN0Q4RCksICgweEZDNzc1NjJBKSwgKDB4ODAwOURFN0UpLCAoMHhGQ0RCRDU2OCksCi0vLygweDgwMDc4RTVGKSwgKDB4RkQ0MDU2OTUpLCAoMHg4MDA1OEQyRiksICgweEZEQTREOTc1KSwgKDB4ODAwM0RBRjEpLCAoMHhGRTA5NURDOCksICgweDgwMDI3N0E2KSwgKDB4RkU2REUzNTIpLCAoMHg4MDAxNjM0RSksICgweEZFRDI2OUQzKSwgKDB4ODAwMDlERUEpLCAoMHhGRjM2RjEwRiksICgweDgwMDAyNzdCKSwgKDB4RkY5Qjc4QzcpLCAoMHgwMDAwMDAwOSksICgweDlGQzVBQzI4KSwgKDB4MDAwMDAwMDEpLCAoMHgwMDAwMDIwMCksCi0vLygweDAwMDAwNDAwKSwgKDB4ODAwMEZGRDApLCAoMHgwMDAwMDAwQSksICgweDAwMDAwMDA5KSwgKDB4OUZDNUUxRDgpLCAoMHg5RkM1NkRDQyksICgweDgwMDAyMkQ4KSwgKDB4OUZDMkNDRUMpLCAoMHg4MDAwRkZEMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwQTApLCAoMHg4MDAwRkY2OCksICgweDAwMDAwMDAwKSwgKDB4RkZGRkZGRkYpLCAoMHg4RkZGRkM2MCksICgweDAwMDAwNDAwKSwgKDB4ODAwMTJCMDgpLCAoMHg4MDAwRkZEMCksCi0vLygweDgwMDBGM0EwKSwgKDB4ODAwMTI5OTApLCAoMHg5RkM1N0ZDQyksICgweDlGQzE4MUU4KSwgKDB4MDAwMDAwMDQpLCAoMHg4MDAwRjNDNCksICgweDgwMDEyN0Q5KSwgKDB4ODAwMTBGRDApLCAoMHgwMDAwMDAwOSksICgweEZGRkZGRkZGKSwgKDB4ODAwMTIwRTgpLCAoMHg5RkMwRTlFMCksICgweDgwMDBGM0M4KSwgKDB4MDAwMDAwMDIpLCAoMHg4MDAxMjM3OCksICgweDgwMDBGM0M0KSwgKDB4ODAwMEYzQTApLCAoMHhGRkZGRkZGRiksCi0vLygweDgwMDBDNzc0KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDlGQzEzNEE0KSwgKDB4MDAwMDAwMDIpLCAoMHg5RkM1QUMyOCksICgweDgwMDBGM0EwKSwgKDB4MDAwMDAwMDIpLCAoMHg4MDAwMjJEOCksICgweDAwMDAwMDAxKSwgKDB4ODAwMEYzQTApLCAoMHgwMDAwMDAwMCksICgweDgwMDEyQUY4KSwgKDB4MDAwMDAwMDIpLCAoMHgwMDAwMDAwMSksICgweDlGQzBEM0JDKSwgKDB4ODAwMEM3NzQpLCAoMHg5RkMwNzYwMCksCi0vLygweDAwMDAwMDAzKSwgKDB4OEZGRkZDQjApLCAoMHgwMDAwMDAwMiksICgweDgwMDBDOUEwKSwgKDB4OEZGRkZDMDApLCAoMHgwMDAwMDAwMCksICgweDAxMDEwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg4MDAwRjQyMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDEpLCAoMHgwMDAwMDAwMCksICgweDAwMDBGRkM4KSwgKDB4MDAwMDAwMDcpLCAoMHg4MDAwRjNFOCksICgweDgwMDA0MkQ4KSwgKDB4MDAwMDAwMDApLCAoMHg4MDAwQzc2QyksCi0vLygweDgwMDBGM0EwKSwgKDB4ODAwMEM3NzQpLCAoMHgwMDAwMDAwMCksICgweDAwMDEwMDAwKSwgKDB4MDAwMDAwMDEpLCAoMHg4MDAwMjJEOCksICgweDgwMDAwNTQ4KSwgKDB4OUZDMDZFMTgpLCAoMHg5RkMwNjM4MCksICgweDAwMDAwMDAwKSwgKDB4ODAwMDIyRDgpLCAoMHgwMDAwMDAwMSksICgweDgwMDBGM0EwKSwgKDB4OEZGRkZENjApLCAoMHg4MDAwRjNBMCksICgweDgwMDBDNzYwKSwgKDB4MDAwMDAwMDApLCAoMHg4MDAwMDY0OCksCi0vLygweDgwMDBGM0EwKSwgKDB4OEZGRkZGODgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAyMDAwKSwgKDB4ODAwMDQyRDgpLCAoMHg4MDAwMjJEOCksICgweDlGQzAzODZDKSwgKDB4OUZDMDM4NUMpLCAoMHgwMDAwMDAwNSksICgweDhGRkZGRjg4KSwgKDB4OUZDNjBCOTkpLCAoMHg4MDAwMDU0OCksICgweDgwMDAyMTA4KSwgKDB4ODAwMDIxMDApLCAoMHg4MDAwMjEwNCksICgweDhGRkZGRUU4KSwgKDB4ODAwMDA2NDgpLCAoMHg5RkMzRkQzQyksCi0vLygweDAwMDAwMDAwKSwgKDB4ODAwMDE2OTgpLCAoMHg5RkM0N0Q0MCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDQpLCAoMHg4MDAwMThDMCksICgweDhGRkZGRTAwKSwgKDB4ODAwMDE4QzQpLCAoMHg5RkM2MEE1MCksICgweDAxMDQwMjAwKSwgKDB4MkUzNDJFMzEpLCAoMHgwMDAwMDAzMiksICgweDAwMDAwMDExKSwgKDB4OEZGRkZFMDApLCAoMHg5RkM1Mjk4NCksICgweDlGQzYwQTVDKSwgKDB4MDAwMDAwMDApLCAoMHg4RkZGRkUwMCksCi0vLygweDlGQzUyOTc4KSwgKDB4MDEwNDA0MDApLCAoMHgyRTM0MkUzMSksICgweDlGQzYwMDM0KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDlGQzUyOTg0KSwgKDB4OUZDNTI5OTApLCAoMHgwMDAxRjMxRiksICgweDlGQzYzMEM0KSwgKDB4OUZDNDk1MjQpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4OUZDNjMxMEMpLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg5RkM0QTIxNCksICgweDgwMDAxOEMwKSwgKDB4MDAwMDAwMDEpLCAoMHg5RkM0NzQ2OCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMSksICgweDhGRkZGRUM4KSwgKDB4MDAwMDAwMDApLCAoMHg4MDAwMTk3OCksCi0vLygweDlGQzQ3RDQwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg5RkM0NzgzQyksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg4MDAwMTk3OCksICgweDAwMDAwMDAzKSwgKDB4OUZDNjMwMzApLCAoMHg5RkM2MDAwMCksICgweDAwMDAwMDAwKSwgKDB4MTAwMDAwMDApLCAoMHg4MDAwMTYxNCksICgweDgwMDAxNjk4KSwgKDB4OUZDNDhCMDgpLCAoMHg5RkM2MzAxMCksCi0vLygweDlGQzYzMDdDKSwgKDB4OUZDNjMwMDEpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg5RkM2MzcyQyksICgweDAwMDAwMDA3KSwgKDB4ODAwMEJENjgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDA1KSwgKDB4OEZGRkZGODgpLCAoMHgwMDAwMDAwMCksICgweDlGQzRENUVDKSwgKDB4MDAwMDAwMDApLCAoMHgxMDAwMDAwMCksCi0vLygweDlGQzQ5MjY0KSwgKDB4OUZDNDkyNTgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAyKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAxKSwgKDB4RkZGRkZGRkYpLCAoMHgwMDAwMDAwNSksICgweDhGRkZGRjg4KSwgKDB4MDAwMDAwMDApLCAoMHgxMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MjAwMDAwMDApLCAoMHg5RkMwMTRCQyksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDhGRkZGRkExKSwgKDB4OEZGRkZGREQpLCAoMHg4RkZGRkZFMSksICgweDhGRkZGRkY0KSwgKDB4OEZGRkZGRjgpLCAoMHgwMDAwMDAwMCksICgweDZGNjgyRjAwKSwgKDB4NkMyRjY1NkQpLCAoMHg2RDJGNjg2RiksICgweDUzMkY3NDZFKSwgKDB4NzMyRjRFNTYpLCAoMHg0MzJGNjU2NCksCi0vLygweDY4NUY0QjQ0KSwgKDB4NjM2MTYxNjUpLCAoMHgyRjYzNjU2NCksICgweDJGNkU2OTYyKSwgKDB4NDQ2MzYxNjEpLCAoMHg2NDZGNjM2NSksICgweDczNUY3MjY1KSwgKDB4NEM1RjY1NjQpLCAoMHg3ODc1NkU2OSksICgweDY2NjkyRDAwKSwgKDB4NjU2ODc0MDApLCAoMHg3NDczNjU3NCksICgweDVGMzEzNDM0KSwgKDB4NjEyRTYzNkMpLCAoMHgwMDczNzQ2NCksICgweDAwNjY2RjJEKSwgKDB4MkU3MDZENzQpLCAoMHgwMDc2NjE3NyksCi0vLygweDhGQjQwMDYwKSwgKDB4MTAwMDAwMDgpLCAoMHg4RkI1MDA2NCksICgweDAyNDAzMDIxKSwgKDB4MEZGMTNFNDIpLCAoMHgwMjYwMzgyMSksICgweDAwNDBBMDIxKSwgKDB4MDA2MEE4MjEpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MTUwMDAwMDcpLCAoMHgwMDAwMDAwMCksCi0vLygweDEwNkIwMDA3KSwgKDB4MDAwMDAwMDApLCAoMHgwQkYxNDM3OSksICgweDAwMDAwMDAwKSwgKDB4MTA4MEZGRjcpLCAoMHgwMDAwMDAwMCksICgweDAyRTAzODIxKSwgKDB4MDJDMDIwMjEpLCAoMHgxNDQwRkY5NiksICgweDAyRTAyODIxKSwgKDB4MDI4MDIwMjEpLCAoMHgxMDAwRkY5MyksICgweDAyQTAyODIxKSwgKDB4OEZBNjAwMjgpLCAoMHg4RkE2MDAyOCksICgweDhGQTcwMDJDKSwgKDB4MDA0MDIwMjEpLCAoMHgwMDYwMjgyMSksCi0vLygweDAwNDA5MDIxKSwgKDB4MDA2MDk4MjEpLCAoMHhBRkEyMDA2MCksICgweDBGRjE0MUVFKSwgKDB4OENDNDJENDgpLCAoMHg4Q0M1MkQ0QyksICgweDBGRjE0NEFFKSwgKDB4MjQwNjAwMzYpLCAoMHg4RkE0MDA2OCksICgweDhGQTUwMDZDKSwgKDB4MDA0MDMwMjEpLCAoMHgwMDYwMzgyMSksICgweDhGQjIwMDQwKSwgKDB4OEZCMTAwM0MpLCAoMHg4RkIwMDAzOCksICgweDAwODAxMDIxKSwgKDB4MDBBMDE4MjEpLCAoMHgwM0UwMDAwOCksCi0vLygweDI3QkQwMDYwKSwgKDB4MDAwMDI4MjEpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg4MDAwQzY2OCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4NTIwODI0NTApLCAoMHgzRUVEMTcwNSksICgweEYyMEZGOEExKSwgKDB4ODlGNkUxN0YpLCAoMHgxN0Q3REMwMCksICgweDA5QjlGMkMzKSwgKDB4NjM3ODk2OEMpLCAoMHhBRjA2MDdGNiksCi0vLygweEZERkRFMEM5KSwgKDB4M0NFM0RGRUUpLCAoMHg1MTY4MjI5RSksICgweDdDRjc5NzM0KSwgKDB4RjVGRkY1NkYpLCAoMHgzMDcwMDA5MyksICgweDEzNUY1Qzc1KSwgKDB4RTZENzNFRUUpLCAoMHg2RTQwMERGOSksICgweDU4MjUyQUNCKSwgKDB4NTU3MzExQ0EpLCAoMHg1NTM5QjMwMyksICgweDU2NTU3MzU1KSwgKDB4QjZCREFDRUYpLCAoMHg1OUY5NDI4RCksICgweDlBRTYzMDIwKSwgKDB4NTU4RkY3RTcpLCAoMHg3OTU1ODA2RCksCi0vLygweDA5RDU0OUYzKSwgKDB4NjAzQkY1QjcpLCAoMHgzMTM0NDEzQiksICgweEJDQTdDMUFBKSwgKDB4QTk4RDEzMzkpLCAoMHg1N0IyOUM5NyksICgweDUwRjFGRjA3KSwgKDB4RTRBMTM5ODApLCAoMHhEMDg4MUEyMSksICgweEMxRkZFMzBBKSwgKDB4QjBBNjZDMTkpLCAoMHgxODQxNjQ5MCksICgweDE2MEUwMjE0KSwgKDB4QTU4NENCQjUpLCAoMHgwMkFBQTgyQSksICgweDczOTgxMzQwKSwgKDB4OTY0QTI0REUpLCAoMHg2RTgyOUZDNCksCi0vLygweERGRDYyMzYwKSwgKDB4NEMzQkYxNTIpLCAoMHgzODcyMTU3NCksICgweEQ0NkJDOTEyKSwgKDB4QkJENjVGOUQpLCAoMHhFNkYwMkM5RCksICgweDg2N0M2RUVDKSwgKDB4NDNGQUI3MjUpLCAoMHhBNDE0NDQxOSksICgweDY5QkI2QUFGKSwgKDB4Q0UyN0I3NDQpLCAoMHgwMjIyNDFBOSksICgweDFFQjdGREQ4KSwgKDB4MUNBNkNCQzApLCAoMHhCQkNCQzExMSksICgweEE2RkQxNDAzKSwgKDB4NzZDNjg4RDkpLCAoMHhCNDcxODZDQiksCi0vLygweDVFOTg5MzZEKSwgKDB4OUJCRjdFMkUpLCAoMHg4QjdGQkNFQyksICgweDlEQUY3RUY1KSwgKDB4N0UzQTc5RjEpLCAoMHg5Qzg5NkFDRCksICgweDYyOEYyNDlBKSwgKDB4REQ2RTUxQUYpLCAoMHhBRjczOTk0QiksICgweDU5NjY5OTVEKSwgKDB4Qjc2MjA1OTcpLCAoMHgzNjlCMUU1NCksICgweDdDRURDNzg3KSwgKDB4RTdCMTVCMUYpLCAoMHhCMzZGNUY3RCksICgweEI1QjczRUY2KSwgKDB4RDc2RUVFRTIpLCAoMHgxNEU4NjE4NiksCi0vLygweEMwNURGMTRFKSwgKDB4ODA1MEYxRkYpLCAoMHgyMThDMjEzMSksICgweEJFMjU5NDFBKSwgKDB4OTA0MUNEMDYpLCAoMHgxRUU4QTlDMCksICgweEQ1MzBGRUREKSwgKDB4NzQ5NUM4MDgpLCAoMHhDQzE1OTI5MSksICgweDRFQzg1Q0EzKSwgKDB4RUMzQzcwNEUpLCAoMHgwQjY2MzNCMyksICgweDREOTkyRDRCKSwgKDB4RUIxQjU3NzQpLCAoMHhERkI5RDUwOCksICgweDExNzgzNzE5KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgzNzAwMDAwMCksICgweDAwMDA4MEEzKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg4Qzg3MkYyNCksICgweDBGRjExQjEzKSwgKDB4MDIwMDIwMjEpLCAoMHgzQzA2OUZDNiksCi0vLygweDAwNjAyODIxKSwgKDB4MDA2MEE4MjEpLCAoMHgyNEMzMkQ0OCksICgweDhDNjYwMDAwKSwgKDB4MDA4MDMwMjEpLCAoMHgwRkYxM0FBMCksICgweDAwQTAzODIxKSwgKDB4MTAwMEZGRUMpLCAoMHgwMDQwMjAyMSksICgweDhGQTYwMDY4KSwgKDB4MEZGMTNFNDIpLCAoMHg4RkE3MDA2QyksICgweDAyMDAyMDIxKSwgKDB4MDA2MDI4MjEpLCAoMHgwRkYxNDFFRSksICgweDAwNjA4ODIxKSwgKDB4MDQ0MDAwMTYpLCAoMHgwMjAwMjAyMSksCi0vLygweDNDMDU5RkM2KSwgKDB4OENBNjJFNzgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4NUM1RDRBN0YpLCAoMHg1QzgwMTZGRiksICgweDVDQTJDQTdGKSwgKDB4NUNDNTc1RkYpLCAoMHg1Q0U4MEZGRiksICgweDVEMEE5OTdGKSwgKDB4NUQyRDFBRkYpLCAoMHg1RDRGOEI3RiksCi0vLygweDhGODc4MTVDKSwgKDB4MDA0MDIwMjEpLCAoMHgwRkYxM0JEMCksICgweDAwNjAyODIxKSwgKDB4MDA0MDIwMjEpLCAoMHgwRkYxM0U0NSksICgweDAwNjAyODIxKSwgKDB4MDI3NjIwMkEpLCAoMHgwMDRCNTAwQiksICgweDI0MDMwMDAxKSwgKDB4MTU0M0ZGRTkpLCAoMHg3MTRCNTgyMCksICgweDAwMEYzRDAwKSwgKDB4MDAwMDMwMjEpLCAoMHgwMEMwMTAyMSksICgweDAzRTAwMDA4KSwgKDB4MDE0QjY4MjUpLCAoMHgwMDA4NjBDMCksCi0vLygweDAwMDA3MDIxKSwgKDB4MDAwMDc4MjEpLCAoMHgwMDAwNTAyMSksICgweDEwMDAwMDEzKSwgKDB4M0MwQjAwNDApLCAoMHgwMDhDMTgyQiksICgweDhGRkY3NTcwKSwgKDB4QUUyOTAwOTQpLCAoMHhBRTExMDBBOCksICgweDE1MDcwMDIzKSwgKDB4OEZGRjc1ODApLCAoMHg4RTBGMDA5OCksICgweDhERTUwMDIwKSwgKDB4NTBBMDAwMjApLCAoMHhBRkIyMDAyMCksICgweEFGQjEwMDFDKSwgKDB4QUZCRjAwMjgpLCAoMHhBRkIwMDAxOCksCi0vLygweDhDOTAwMDIwKSwgKDB4MDBBMDg4MjEpLCAoMHg4RTAyMDAwOCksICgweDhDQTUwMDA4KSwgKDB4MEZGMDAzQTQpLCAoMHgwMDAwMzAyMSksICgweDA0NDAwMDMxKSwgKDB4MjQwMzAwMUQpLCAoMHg4RTI2MDAwOCksICgweDhFMjUwMDBDKSwgKDB4QUUwNjAwMDgpLCAoMHhBRTA1MDAwQyksICgweDBGRjEyM0FCKSwgKDB4MDAwMDAwMDApLCAoMHgwMDQwOTAyMSksICgweDhFMkEwMDEwKSwgKDB4MkU0OTAwMDEpLCAoMHgwMDBBNDAyQiksCi0vLygweDEwMDBGRkVBKSwgKDB4MDEwOTEwMjQpLCAoMHg4RTI0MDAwOCksICgweDhFMjUwMDBDKSwgKDB4OEU2NjAwMTgpLCAoMHhBRTA1MDAwQyksICgweEFFMDQwMDA4KSwgKDB4OEUwNzAwMEMpLCAoMHg4Q0MzMDA5NCksICgweDAwNjc1ODJBKSwgKDB4OEZCRjAwMjgpLCAoMHhBQ0M0MDA5MCksICgweEFDQzUwMDk0KSwgKDB4MDI0MDE4MjEpLCAoMHg4RkJGMDAyOCksICgweDhGQjMwMDI0KSwgKDB4OEZCMjAwMjApLCAoMHg4RkIxMDAxQyksCi0vLygweDI3QTQwMDcwKSwgKDB4MTIwMDAwMDUpLCAoMHg4RkEyMDA5NCksICgweDBGRjExQ0RCKSwgKDB4MDAwMDAwMDApLCAoMHhBQzUwMDAwMCksICgweDI0MDJGRkZGKSwgKDB4OEZCRjAwQkMpLCAoMHgwMDAwMDAwMCksICgweDEwMDAwMDA5KSwgKDB4OEU0MzAwMDApLCAoMHgxMjIwMDAwNiksICgweDAwMDAwMDAwKSwgKDB4OTY0RTAwMTApLCAoMHgyNDAzRkZGRiksICgweDM1Q0QwMDQwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweEZGN0IwMDAwKSwgKDB4MkU4MDUwRjEpLCAoMHgxMDIxNDQ4MiksICgweDFCQTAwMDA1KSwgKDB4MDAwMEMwRkYpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgyNDYzRkZGOCksICgweDEwNjAwMDBFKSwgKDB4MjcwNzAzRkYpLCAoMHgwMDYwMTAyNyksICgweDAwNjkyODA0KSwgKDB4MDA0ODEwMDYpLCAoMHgwMDY4MjAwNCksICgweDAwMDIxMDQyKSwgKDB4QjU2REE5NzQpLCAoMHhDQUNEQjA3QyksICgweDRFRTFBREQ0KSwgKDB4RUY4NTlCMzQpLCAoMHg4OUY0N0I0NyksICgweDUxNUMxNTVBKSwgKDB4MzhEMDY3NTcpLCAoMHg4MDUwRjFGRiksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg4RkZGNkY1MCksICgweDU0NDE0QzIwKSwgKDB4NzU3MzIwNEQpLCAoMHg3MjZGNzA3MCksICgweDhGRkY2RjYwKSwgKDB4MDAwMDAwMEEpLCAoMHgyRDJEMjAyQSksICgweDU3NDE1MjIwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDA2MDI4MjEpLCAoMHgwMjQwMzAyMSksICgweDBGRjEzRDAxKSwgKDB4MDI2MDM4MjEpLCAoMHgxMDAwRkVFRiksICgweDAwNDAyMDIxKSwgKDB4MDIwMDIwMjEpLCAoMHgwMjIwMjgyMSksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweEE0MzcwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4RkY3NzAwMDApLCAoMHgyRTgwNTBGMSksICgweDFBMjE0NDYyKSwgKDB4MDRENkQ1ODMpLCAoMHg0MDAzMTI4MiksCi0vLygweDY0NjlBNzM1KSwgKDB4MEI0Qzk5QTMpLCAoMHgwQUY4ODU5NCksICgweEY5MDk2OUQ3KSwgKDB4OTYxMzFDOTIpLCAoMHgwMjVFRUExMCksICgweDNBMUZFNDIxKSwgKDB4NjE0RkYzOTApLCAoMHgxQ0ZEQzMyNyksICgweEMxNzdFMDRGKSwgKDB4RjREODdFODIpLCAoMHg3ODI1M0YzOSksICgweEJCODM5Rjk0KSwgKDB4OTk4QjNFQjEpLCAoMHg4MEYyODA5OCksICgweERGM0ZBQkNEKSwgKDB4MjREODQwQUMpLCAoMHhCQTk1MzIxQyksCi0vLygweERDMjExRDIwKSwgKDB4MTUwNDE5NDIpLCAoMHg2MTg1OEFCRCksICgweDU0NjA4NEExKSwgKDB4QTcwRDIxOUMpLCAoMHg3QkQ1MjEzNSksICgweDc4MDYwRjcxKSwgKDB4RUEzQzg3RDgpLCAoMHgzRkFGM0EyNCksICgweEU0QjJDNDIxKSwgKDB4Qjk5RDE0NTMpLCAoMHgyNzQxRTI2NCksICgweDIyMzk4MTNBKSwgKDB4Mjk0NERBMjApLCAoMHg0NDFFRjdDNCksICgweDBCRDBCNzIwKSwgKDB4RUQ4NEVBMjYpLCAoMHg3M0UwQzBEMiksCi0vLygweDY3OEUzMDM5KSwgKDB4MjE0MjAxMDkpLCAoMHg4NjA3NDkyRSksICgweDI4Q0VGNDQwKSwgKDB4MDIyNzY4QzgpLCAoMHhGNjhFMzYxMSksICgweDg0RTg0RDU1KSwgKDB4NzMwMDRDMDQpLCAoMHhGOUI2NjMwRSksICgweDY3N0ZGQThGKSwgKDB4NTMwQ0IxOEYpLCAoMHgyQzRFRTMxMCksICgweEFCQzc1MzdDKSwgKDB4ODJDRkRCQ0IpLCAoMHgxMDBDNjNBMiksICgweDg3NkQ3NUJBKSwgKDB4QzY4M0Y4ODgpLCAoMHgwQ0RDMUUxRSksCi0vLygweEE2MDBFODMzKSwgKDB4MzMwMzYwNjYpLCAoMHg0MzA1MDQ5QyksICgweDQwODkwNzEzKSwgKDB4OUQxMjUzMkUpLCAoMHg3QjZFMkZFMiksICgweEUyNDRDQzA5KSwgKDB4OUZGQjIwODIpLCAoMHhBQjM3MzVEMyksICgweDAwMDAwMDgwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg4RDA2MkY5MCksICgweDhEMDcyRjk0KSwgKDB4MDA0MDIwMjEpLCAoMHgwRkYxM0QwMSksCi0vLygweDAwNjAyODIxKSwgKDB4MDA0MDMwMjEpLCAoMHgwMjAwMjAyMSksICgweDAyMjAyODIxKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweEYxRkY3QTAwKSwgKDB4RTIzQTgwNTApLCAoMHg4NDFBMjExNCksICgweEM1ODhEQTc1KSwgKDB4MDI0MDAxNDMpLCAoMHhBRUQ2QUFENyksICgweDk0QzI1NDVCKSwgKDB4M0U0NjE1NkMpLCAoMHgwNUJGREYyNyksICgweEIwODIyMDc1KSwgKDB4RDI0QzdCQzQpLCAoMHg2MjEyMjA1NCksCi0vLygweDhDQzQxQzQ5KSwgKDB4MkM0MTQ5NzIpLCAoMHg4MEM1REEwRSksICgweEQ4NEEwMDdDKSwgKDB4NzE5RTczQzApLCAoMHg3NjUwMTRCMCksICgweDBBMzkxQkM4KSwgKDB4NjBBNzAyMjMpLCAoMHg1NENEQTQ2QiksICgweDQ2MDZENDU1KSwgKDB4MzdCNkE3MzgpLCAoMHhGRkJCN0Q3MSksICgweDVGRUREMTJGKSwgKDB4RUU0N0ZEQzgpLCAoMHgzREM3OTEzRiksICgweEVBRUVGN0ZEKSwgKDB4MjE5REFERUMpLCAoMHhGOUU1M0Y1RiksCi0vLygweEIzRDgyRDlFKSwgKDB4QkJCNzlCQ0IpLCAoMHg0M0FEMkFBQiksICgweDBFN0FEQkMwKSwgKDB4QUJCRDA5NTIpLCAoMHgxQTZFRjQzQSksICgweENEOUIyQTlEKSwgKDB4NzIyMkIzNjYpLCAoMHg5NzlFODlFOSksICgweDAyQzkxMTNGKSwgKDB4MUQ1MTE0NjYpLCAoMHg1N0E5MjIwNiksICgweDRBNDEyMDc1KSwgKDB4RkQzMUQ3ODMpLCAoMHhBNzU0MkVGQyksICgweDI0Qjc2OTc1KSwgKDB4Qjk5OTYyQzcpLCAoMHgxOUYxRDM1NiksCi0vLygweDlEMTJDM0NCKSwgKDB4NkQzN0Q1NDIpLCAoMHgyOUU3MjE0RCksICgweDg5MDBGNjQ1KSwgKDB4QjE1NEFENEEpLCAoMHhGMDQ3RDk4OCksICgweEY1NUVFMUQ1KSwgKDB4QzAwQjY5MzIpLCAoMHg4NUFDRTkxMiksICgweDgyMDhCMUI5KSwgKDB4ODBFMTQxNzApLCAoMHhBMUQ2N0MzRiksICgweDA1ODAzNUIzKSwgKDB4QTRGRTM2Q0EpLCAoMHhBNThBQkFDQyksICgweEMzRTk4MzFDKSwgKDB4Mjc1MzFCOEMpLCAoMHhBREJCODY5OCksCi0vLygweDA2ODAxQzEyKSwgKDB4QUZBRUVDOEUpLCAoMHhDMzI2OTI5MSksICgweDVDMkUwMUEwKSwgKDB4NEE2MTA4N0MpLCAoMHg2MEYyMUU3QiksICgweDZCOTJDNjcwKSwgKDB4Qzk4NzIzNjQpLCAoMHg0ODQ2NEM5NyksICgweDM0MkU2NDk5KSwgKDB4QTY4NDlBNDgpLCAoMHhGMDM0MDAyRCksICgweDQ0MkI0NDg4KSwgKDB4MTYwQjA0NDIpLCAoMHhFRDUyQ0Y1MCksICgweDRENDM2QzA1KSwgKDB4Njg0MUM2MDIpLCAoMHhBMTRGOEE4MiksCi0vLygweDlBQzIwRERFKSwgKDB4NUI5MjUxRUUpLCAoMHg4RUQ5OThENSksICgweDkyQjZFQTIyKSwgKDB4NUIxMzZDNEIpLCAoMHg5N0MwQTQ1QiksICgweDQ1OUM5NEE0KSwgKDB4Q0Q5NTgzQzApLCAoMHg2QzU4OURGOCksICgweDNDOUExN0NEKSwgKDB4OTA2NjAxQkYpLCAoMHg4NEQ2MTJFMSksICgweDY3MTc2RjVGKSwgKDB4RTQ3RDVBNDQpLCAoMHgzNzM4NkQ1RSksICgweDkyQTRENjFCKSwgKDB4MjhDNTEzRkIpLCAoMHg2RTkxNTk5QSksCi0vLygweDY1M0RBMTZEKSwgKDB4QTE5QzM5QzApLCAoMHg0Mjc2OTBBRCksICgweDcwMDU0NjFDKSwgKDB4QUI2QzFFRTQpLCAoMHg4MEJBQ0MyRCksICgweDc4MEExOEM1KSwgKDB4ODIyREM3NzQpLCAoMHhCNjA0MzAzNiksICgweDAwNzg5QzE4KSwgKDB4MTA2Qzk1MDcpLCAoMHg0MTAzQTg2NCksICgweEM1MTE1ODVCKSwgKDB4RjNFOUI3RjgpLCAoMHgyNEQ3OUM0RCksICgweDMxQjIwRUI1KSwgKDB4QjFDMDQ4M0UpLCAoMHhFMjVDNTZCOSksCi0vLygweDk2OTkxMDk2KSwgKDB4N0NENDEyMUYpLCAoMHg4QTNCODNGNCksICgweDcwNDI3MUMyKSwgKDB4QjVDMjZBQ0MpLCAoMHgyQjEzMUFGMCksICgweDhCN0ZCQ0VDKSwgKDB4OURBRjdFRjUpLCAoMHg3RTNBNzlGMSksICgweDlDODk2QUNEKSwgKDB4NjI4RjI0OUEpLCAoMHhERDZFNTFBRiksICgweEFGNzM5OTRCKSwgKDB4NTk2Njk5NUQpLCAoMHhCNzYyMDU5NyksICgweDM2OUIxRTU0KSwgKDB4N0NFREM3ODcpLCAoMHhFN0IxNUIxRiksCi0vLygweEIzNkY1RjdEKSwgKDB4QjVCNzNFRjYpLCAoMHhENzZFRUVFMiksICgweDE0RTg2MTg2KSwgKDB4Q0MxNTkyOTEpLCAoMHg0RUM4NUNBMyksICgweEVDM0M3MDRFKSwgKDB4MEI2NjMzQjMpLCAoMHg0RDk5MkQ0QiksICgweEVCMUI1Nzc0KSwgKDB4REZCOUQ1MDgpLCAoMHgxMTc4MzcxOSksICgweDc3QkIxMEIwKSwgKDB4RkNERjgzNTApLCAoMHhEMzRBN0M2NSksICgweEVGNkU1N0JCKSwgKDB4RUNENTZDNjgpLCAoMHg4RUI3Q0EzNiksCi0vLygweDJGMjZCMTM2KSwgKDB4NTU2MzEyNjkpLCAoMHhFRjEyMTNFMSksICgweEE1NkFCODQ0KSwgKDB4QUE0QjFENjQpLCAoMHg2NDM0MUVBOSksICgweDBDRTlEQjQ4KSwgKDB4NDYwQzIxNDQpLCAoMHhBREM1MDIwNSksICgweDUxNUM0NzJGKSwgKDB4MTM2QUMyMTkpLCAoMHg0NzE2Q0VEMSksICgweEM4QjhDRTRFKSwgKDB4MUQxNjgyMTApLCAoMHg5MjMzNEE4MSksICgweDkwREM5MTBDKSwgKDB4NDlBMDAyMjApLCAoMHhFNUYyQzgzMSksCi0vLygweEI2N0RDNzg1KSwgKDB4M0M0OTUxNzQpLCAoMHgwRDFGNEMyQSksICgweDNBRDc4N0ZEKSwgKDB4RTlDOUZCMjcpLCAoMHg3REZDMjcxMyksICgweEVCMzlDNEIzKSwgKDB4OTZGNzVGMTgpLCAoMHhBQ0MzQjQxMCksICgweDBGRjEyN0MzKSwgKDB4MDAwMDAwMDApLCAoMHg4RTJBQjNGQyksICgweDAwMEE0ODI3KSwgKDB4MDA0QTQwMjEpLCAoMHgwMTA5MjgyNCksICgweDAwQTI4ODIzKSwgKDB4QUZCRjAwMzQpLCAoMHhBRkI3MDAyQyksCi0vLygweEFGQjYwMDI4KSwgKDB4QUZCNTAwMjQpLCAoMHhBRkI0MDAyMCksICgweEFGQjMwMDFDKSwgKDB4QUZCMjAwMTgpLCAoMHgzQzFFOUZDNiksICgweDAwNkI1MDJCKSwgKDB4NTE0MDAwMDIpLCAoMHhBRTIzQkRBMCksICgweDI0MTIwMDE2KSwgKDB4MEZGMDA3RTgpLCAoMHgwMjgwMjAyMSksICgweDEyNDAwMDA1KSwgKDB4MDIwMDEwMjEpLCAoMHgwMjExODAyMSksICgweDBGRjEyN0MzKSwgKDB4MDIwMDIwMjEpLCAoMHgyNDA3RkZGRiksCi0vLygweDAwNTAyMDIxKSwgKDB4MTA0NzAwMDQpLCAoMHgwMDAwMjgyMSksICgweDNDMEI4MDAxKSwgKDB4OEM2MzAwMDQpLCAoMHhBQzg2MDAwMCksICgweDAwQzAyMDIxKSwgKDB4MTAwMEZGRUIpLCAoMHg4Q0M2MDAwMCksICgweEFDODAwMDAwKSwgKDB4MEZGMEZEMjUpLCAoMHgyNDA0MDAwMiksICgweDFDMEI4MjYwKSwgKDB4MDAwMDAwMDApLCAoMHgzM0M3Rjc4MCksICgweDMzRjVFODQwKSwgKDB4MzQyM0Q5NDApLCAoMHgzNDUxQjk0MCksCi0vLygweDM0N0Y5OTQwKSwgKDB4MzRBRDY4ODApLCAoMHg4RTA4MDAwOCksICgweEFFMDgwMDA0KSwgKDB4OTYwQzAwMTApLCAoMHhBRTA0MDAwMCksICgweDM1OEEwMDAyKSwgKDB4MzE0QkZGRkYpLCAoMHgzMTY5MTAwMCksICgweDMxNjQwMDA4KSwgKDB4OTYwRDAwMTApLCAoMHgzMUE0RkZGNyksICgweEE2MDQwMDEwKSwgKDB4OTYwRjAwMTApLCAoMHgzMUVFRUZGRiksICgweEE2MEUwMDEwKSwgKDB4OEZCRjAwMTQpLCAoMHg4RkIwMDAxMCksCi0vLygweDk2NEUwMDEwKSwgKDB4OEU0QTAwMDApLCAoMHgxNTQwMDAxRiksICgweDAwQzA4ODIxKSwgKDB4OEU1MzAwMDgpLCAoMHhBRTUzMDAwNCksICgweEFFNDYwMDAwKSwgKDB4ODY0NDAwMTIpLCAoMHgxMDAwMDAxMyksICgweEE2NEQwMDEwKSwgKDB4OEU0MzAwMDApLCAoMHg4RTUxMDAwNCksICgweDI0NjJGRkZGKSwgKDB4QUU0MjAwMDApLCAoMHhBMjM0MDAwMCksICgweDk2NUYwMDEwKSwgKDB4NTI5REEwRDgpLCAoMHhCQzE4MDAxNyksCi0vLygweDE5QUI4MDNCKSwgKDB4ODNGMDAwMjApLCAoMHg1MEYxRkYwNyksICgweEQ0QzAyRDgwKSwgKDB4RkM4ODFBMjEpLCAoMHhDMUJGMDEwMCksICgweDU4NDE2ODBCKSwgKDB4MTAzQjJDQzApLCAoMHhCMDQyQzI4QSksICgweDIzMjRFOEE4KSwgKDB4MzE1MzE0MzApLCAoMHhFRjcxREQwRSksICgweDdDMUI5RDhFKSwgKDB4MDk5OEMyMjgpLCAoMHg4RkZGNzZGMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDhGRkY3NzAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDNFMDAwMDgpLCAoMHgyNDAyRkZGRiksICgweDE1ODBGRkZEKSwgKDB4MDAwMDAwMDApLCAoMHgwQkYxNDM3OSksICgweDAwMDAwMDAwKSwgKDB4M0MwRjdGRkYpLCAoMHgzNUVGRkZGRiksICgweDEyMDAwMDI0KSwgKDB4OEZBQTA0OUMpLCAoMHgyN0E0MDAyMCksICgweDhGQjUwNDk4KSwgKDB4MDI0NDk4MjMpLCAoMHgwMkIzMjgyMSksCi0vLygweDMxMTEwMDA4KSwgKDB4MTIyMDAwMEMpLCAoMHhCNTZEQTk3NCksICgweENBQ0RCMDdDKSwgKDB4NEVFMUFERDQpLCAoMHhFRjg1OUIzNCksICgweDg5RjQ3QjQ3KSwgKDB4NTE1QzE1NUEpLCAoMHgzOEQwNjc1NyksICgweDgwNTBGMUZGKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDhGRkY3NkIwKSwgKDB4MDA2MDEwMjEpLCAoMHgwM0UwMDAwOCksICgweDI3QkQwMDI4KSwgKDB4OEZGRjc2QzApLCAoMHgwMEEwNDAyMSksICgweDAwQzAzODIxKSwgKDB4MTQ2MDAwM0EpLCAoMHg4RkI0MDAyMCksICgweDhGQjMwMDFDKSwgKDB4OEZCMjAwMTgpLCAoMHg4RkIxMDAxNCksICgweDhGQjAwMDEwKSwgKDB4MDNFMDAwMDgpLCAoMHgyN0JEMDAyOCksICgweDI3QkRGRkUwKSwgKDB4MDI0MDIwMjEpLCAoMHgwMjYwMjgyMSksCi0vLygweDBGRjAxMTc4KSwgKDB4MjYzMUZGRkYpLCAoMHgxNjIwRkZGOSksICgweDI2MTAwMDA4KSwgKDB4MjY5NDAwMDEpLCAoMHgyQTgzMDAwQyksICgweDgwMDAwOTQ4KSwgKDB4M0ZGRkZGRkYpLCAoMHg3RkZGRkZGRCksICgweDgwMDAwNzQ4KSwgKDB4OUZDNURGQzgpLCAoMHg3NjQyMzBGQyksICgweDMwRkM3NjQyKSwgKDB4MDAwMDAwMDApLCAoMHg4RkIzMDRFQyksICgweDI2QjIwMDAzKSwgKDB4MjY3MTAwMDEpLCAoMHgyNDE0RkZGQyksCi0vLygweDAyNTQ4MDI0KSwgKDB4QUZCMTA0RUMpLCAoMHg5MjMyMDAwMCksICgweDhFMDYwMDAwKSwgKDB4NzBDM0Y4MDIpLCAoMHgyNDU5MDAwMSksICgweEFGQjkwNEVDKSwgKDB4MDNGMkMwMjEpLCAoMHg5MzMyMDAwMCksICgweDI2NUVGRkQwKSwgKDB4MkZENzAwMEEpLCAoMHgxNkUwRkZGNyksICgweDlGQzQwOURDKSwgKDB4OUZDNDFBRTQpLCAoMHg5RkM0MUFFNCksICgweDlGQzQxQUU0KSwgKDB4OUZDNDFBRTQpLCAoMHg5RkM0MUFFNCksCi0vLygweDlGQzQxQUU0KSwgKDB4OUZDNDFBRTQpLCAoMHhBNjAwRTgzMyksICgweDMzMDM2MDY2KSwgKDB4NDMwNTA0OUMpLCAoMHg0MDg5MDcxMyksICgweDlEMTI1MzJFKSwgKDB4N0I2RTJGRTIpLCAoMHhFMjQ0Q0MwOSksICgweDlGRkIyMDgyKSwgKDB4MTQ2MEZGRTkpLCAoMHgwMkEwMjAyMSksICgweDBGRjAxMjFFKSwgKDB4MDI0MDIwMjEpLCAoMHgwRkYwMTE4QyksICgweDAwMDAyMDIxKSwgKDB4OEZBNTQwMTgpLCAoMHgwRkYxNDQ1RSksCi0vLygweDAwMDA0ODEyKSwgKDB4MDAwMDg4MTApLCAoMHgwMDBENkFDMCksICgweDAwODMwMDE5KSwgKDB4MDFBODgwMjUpLCAoMHgwMDEwNjAwMiksICgweDAwMDAzODEwKSwgKDB4MDAwMDEwMTIpLCAoMHg3MTgzMDAwMSksICgweDAxNjI1MDIxKSwgKDB4MDE0RTI4MjEpLCAoMHgwMDAwODgxMiksICgweDAxNEI0MDJCKSwgKDB4MDBBQTMwMkIpLCAoMHgwMDBGNzAwMiksICgweDAwMDA1MDEwKSwgKDB4QkEzNjcwRjApLCAoMHg2OTkxOTVBMiksCi0vLygweDE3MkQyRkQwKSwgKDB4QkUzODZENTEpLCAoMHhDNEFFQTUxQyksICgweDJBQTc3RDdEKSwgKDB4OEI1MUQzQjQpLCAoMHhDRjQ5MEZEOSksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg4ODgwQjM4OCksICgweDRENTk2QjJEKSwgKDB4MzdENzREQ0YpLCAoMHg1ODEzOEIzOCksCi0vLygweDVCN0JDRDRFKSwgKDB4QUU2QzQ0MjIpLCAoMHg0RTVEMUFGMSksICgweERFNzM5NkE1KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAxMDBGRUY3KSwgKDB4MDAwMDAwQzgpLCAoMHg4MDAwQzBDMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMSksICgweDAwMDAyMUIyKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4OUZDNjMwN0MpLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDYwMDAxKSwgKDB4MDAwMDAwMDEpLCAoMHgwMDAwMDAwMCksICgweDgwMDBDMEQwKSwgKDB4ODAwMEMwMDgpLCAoMHgwMDAwMDAwMCksICgweDczNkU2RjYzKSwgKDB4MDA2NTZDNkYpLCAoMHgwMTAwRkVGNyksICgweDAwMDAwMEM4KSwgKDB4ODAwMEMxODgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDQwMjAyMSksICgweDAwNjAyODIxKSwgKDB4MDJDMDMwMjEpLCAoMHgwRkYxMUFCRiksCi0vLygweDAyRTAzODIxKSwgKDB4MDA0MDgwMjEpLCAoMHgzQzAyOUZDNiksICgweDhDNDYyRTcwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4ODAwMEM2NjgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDUyMDgyNDUwKSwgKDB4M0VFRDE3MDUpLCAoMHhGMjBGRjhBMSksICgweDg5RjZFMTdGKSwgKDB4MTdEN0RDMDApLCAoMHgwOUI5RjJDMyksCi0vLygweDYzNzg5NjhDKSwgKDB4QUYwNjA3RjYpLCAoMHhGREZERTBDOSksICgweDNDRTNERkVFKSwgKDB4NTE2ODIyOUUpLCAoMHg3Q0Y3OTczNCksICgweEY1RkZGNTZGKSwgKDB4MzA3MDAwOTMpLCAoMHgxMzVGNUM3NSksICgweEU2RDczRUVFKSwgKDB4NkU0MDBERjkpLCAoMHg1ODI1MkFDQiksICgweDU1NzMxMUNBKSwgKDB4NTUzOUIzMDMpLCAoMHg1NjU1NzM1NSksICgweEI2QkRBQ0VGKSwgKDB4NTlGOTQyOEQpLCAoMHg5QUU2MzAyMCksCi0vLygweDgwMDBDMEQwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDc5NzQ3NCksICgweDI0MDMwMDAxKSwgKDB4MDEwMEZFRjcpLCAoMHgwMDAwMDBDOCksICgweDgwMDBDMjUwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDIxQjIpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg5RkM2MzA3QyksICgweDAwMDAwMDAwKSwgKDB4MDAwODAwMDEpLCAoMHgwMDAwMDAwMSksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHg4MDAwQzE5OCksICgweDAwMDAwMDAwKSwgKDB4MzA3OTc0NzQpLCAoMHgxMDQ3MDAwMCksCi0vLygweDAxMDBGRUY3KSwgKDB4MDAwMDA0MDgpLCAoMHgyQTJBMkEyQSksICgweDJBMkEyQTJBKSwgKDB4MkEyQTJBMkEpLCAoMHgyQTJBMkEyQSksICgweDJBMkEyQTJBKSwgKDB4MkEyQTJBMkEpLCAoMHgyQTJBMkEyQSksICgweDJBMkEyQTJBKSwgKDB4NzdCQjEwQjApLCAoMHhGQ0RGODM1MCksICgweEQzNEE3QzY1KSwgKDB4RUY2RTU3QkIpLCAoMHhFQ0Q1NkM2OCksICgweDhFQjdDQTM2KSwgKDB4MkYyNkIxMzYpLCAoMHg1NTYzMTI2OSksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MzcwMDAwMDApLCAoMHgwMDAwODBBMyksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4OEM4NzJGMjQpLCAoMHgwRkYxMUIxMyksCi0vLygweDAyMDAyMDIxKSwgKDB4M0MwNjlGQzYpLCAoMHgwMDYwMjgyMSksICgweDAwNjBBODIxKSwgKDB4MjRDMzJENDgpLCAoMHg4QzY2MDAwMCksICgweDAwODAzMDIxKSwgKDB4MEZGMTNBQTApLCAoMHgwMEEwMzgyMSksICgweDEwMDBGRkVDKSwgKDB4MDA0MDIwMjEpLCAoMHg4RkE2MDA2OCksICgweDBGRjEzRTQyKSwgKDB4OEZBNzAwNkMpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAxKSwgKDB4MDAwMDAwMDEpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAxKSwgKDB4MTA4MDAwMDQpLCAoMHgwMTAwRkVGNyksICgweDAwMDAwMTY4KSwgKDB4ODAwMTI1MzgpLCAoMHg4MDAxMjU0OCksICgweDgwMDEyNjQ4KSwgKDB4ODAwMTI3NDgpLCAoMHg4MDAxMEZEMCksICgweDgwMDEwRkQwKSwgKDB4ODAwMTExRDApLCAoMHg4MDAxMTNEMCksICgweDgwMDExNUQwKSwgKDB4ODAwMTE3RDApLCAoMHg4MDAxMTlEMCksICgweDgwMDExQkQwKSwgKDB4ODAwMTFERDApLCAoMHg4MDAxMjdDOCksCi0vLygweDgwMDEyN0Q5KSwgKDB4ODAwMTI5N0EpLCAoMHg4MDAxMjk4NSksICgweDgwMDBGRjc4KSwgKDB4ODAwMEZGMDgpLCAoMHg4MDAxMUZFMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDM3MDAwMDAwKSwgKDB4MDAwMDgwQTMpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDhFMDQwMDAwKSwgKDB4OENFNTAwMDApLCAoMHg4Q0U2MDAwNCksICgweDBGRjAwM0EyKSwgKDB4MjQxMjAwMDUpLCAoMHgwMDQwMjAyMSksICgweDEwNDAwMDA0KSwgKDB4MDIyMDI4MjEpLCAoMHgwRkYxMjNBQiksICgweDAwMDAwMDAwKSwgKDB4MDA0MDkwMjEpLCAoMHg4RTJBMDAxMCksCi0vLygweDJFNDkwMDAxKSwgKDB4MDAwQTQwMkIpLCAoMHgxMDAwRkZFQSksICgweDAxMDkxMDI0KSwgKDB4OEUyNDAwMDgpLCAoMHg4RTI1MDAwQyksICgweDhFNjYwMDE4KSwgKDB4QUUwNTAwMEMpLCAoMHhBRTA0MDAwOCksICgweDhFMDcwMDBDKSwgKDB4OENDMzAwOTQpLCAoMHgwMDY3NTgyQSksICgweDhGQkYwMDI4KSwgKDB4QUNDNDAwOTApLCAoMHhBQ0M1MDA5NCksICgweDAyNDAxODIxKSwgKDB4OEZCRjAwMjgpLCAoMHg4RkIzMDAyNCksCi0vLygweDhGQjIwMDIwKSwgKDB4OEZCMTAwMUMpLCAoMHgyN0E0MDA3MCksICgweDEyMDAwMDA1KSwgKDB4OEZBMjAwOTQpLCAoMHgwRkYxMUNEQiksICgweDAwMDAwMDAwKSwgKDB4QUM1MDAwMDApLCAoMHgyNDAyRkZGRiksICgweDhGQkYwMEJDKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweEE0MzcwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4RkY3NzAwMDApLCAoMHgwMjIwMzgyMSksICgweDBGRjEzQkQwKSwgKDB4MDA2MDI4MjEpLCAoMHgzQzA0OUZDNiksICgweDhDODYyRjQwKSwgKDB4OEM4NzJGNDQpLCAoMHgwMDYwMjgyMSksICgweDBGRjEzRDAxKSwgKDB4OEZGRjZGNTApLCAoMHg1NDQxNEMyMCksICgweDc1NzMyMDREKSwgKDB4NzI2RjcwNzApLCAoMHg4RkZGNkY2MCksICgweDAwMDAwMDBBKSwgKDB4MkQyRDIwMkEpLCAoMHg1NzQxNTIyMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDY3OEUzMDM5KSwgKDB4MjE0MjAxMDkpLCAoMHg4NjA3NDkyRSksICgweDI4Q0VGNDQwKSwgKDB4MDIyNzY4QzgpLCAoMHhGNjhFMzYxMSksICgweDg0RTg0RDU1KSwgKDB4NzMwMDRDMDQpLCAoMHhGOUI2NjMwRSksICgweDY3N0ZGQThGKSwgKDB4NTMwQ0IxOEYpLCAoMHgyQzRFRTMxMCksCi0vLygweEFCQzc1MzdDKSwgKDB4ODJDRkRCQ0IpLCAoMHgxMDBDNjNBMiksICgweDg3NkQ3NUJBKSwgKDB4QzY4M0Y4ODgpLCAoMHgwQ0RDMUUxRSksICgweEE2MDBFODMzKSwgKDB4MzMwMzYwNjYpLCAoMHg0MzA1MDQ5QyksICgweDQwODkwNzEzKSwgKDB4OUQxMjUzMkUpLCAoMHg3QjZFMkZFMiksICgweEUyNDRDQzA5KSwgKDB4OUZGQjIwODIpLCAoMHhBQjM3MzVEMyksICgweDAwMDAwMDgwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4RjFGRjdBMDApLCAoMHhFMjNBODA1MCksICgweDg0MUEyMTE0KSwgKDB4QzU4OERBNzUpLCAoMHgwMjQwMDE0MyksICgweEFFRDZBQUQ3KSwgKDB4OTRDMjU0NUIpLCAoMHgzRTQ2MTU2QyksICgweDA1QkZERjI3KSwgKDB4QjA4MjIwNzUpLCAoMHhEMjRDN0JDNCksICgweDYyMTIyMDU0KSwgKDB4Q0VEQzA3RjQpLCAoMHhFQUIyREUwMCksCi0vLygweDA0NUJDMUU4KSwgKDB4ODJCMkFFODYpLCAoMHhFNEJGMjgyMyksICgweDlBMDFCNDdBKSwgKDB4MTc2OTQzOEUpLCAoMHgwMTVDNzk4NiksICgweEE3MEQyMTlDKSwgKDB4N0JENTIxMzUpLCAoMHg3ODA2MEY3MSksICgweEVBM0M4N0Q4KSwgKDB4M0ZBRjNBMjQpLCAoMHhFNEIyQzQyMSksICgweEI5OUQxNDUzKSwgKDB4Mjc0MUUyNjQpLCAoMHgyMjM5ODEzQSksICgweDI5NDREQTIwKSwgKDB4NDQxRUY3QzQpLCAoMHgwQkQwQjcyMCksCi0vLygweEVEODRFQTI2KSwgKDB4NzNFMEMwRDIpLCAoMHg2NzhFMzAzOSksICgweDIxNDIwMTA5KSwgKDB4ODYwNzQ5MkUpLCAoMHgyOENFRjQ0MCksICgweDAyMjc2OEM4KSwgKDB4RjY4RTM2MTEpLCAoMHg4NEU4NEQ1NSksICgweDczMDA0QzA0KSwgKDB4RjlCNjYzMEUpLCAoMHg2NzdGRkE4RiksICgweDUzMENCMThGKSwgKDB4MkM0RUUzMTApLCAoMHhBQkM3NTM3QyksICgweDgyQ0ZEQkNCKSwgKDB4MTAwQzYzQTIpLCAoMHg4NzZENzVCQSksCi0vLygweEM2ODNGODg4KSwgKDB4MENEQzFFMUUpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4QTYwNkZCMkEpLCAoMHhFNENFMTU1NyksICgweDczMjQwODIwKSwgKDB4ODAzN0E4QjQpLCAoMHhBMUQ4ODAzMiksICgweDc1QTNGMUM3KSwgKDB4MzJCQjAzNzApLCAoMHg1Rjg1MDI0MiksICgweDM3QjZBNzM4KSwgKDB4RkZCQjdENzEpLCAoMHg1RkVERDEyRiksICgweEVFNDdGREM4KSwgKDB4M0RDNzkxM0YpLCAoMHhFQUVFRjdGRCksCi0vLygweDIxOURBREVDKSwgKDB4RjlFNTNGNUYpLCAoMHhCM0Q4MkQ5RSksICgweEJCQjc5QkNCKSwgKDB4NDNBRDJBQUIpLCAoMHgwRTdBREJDMCksICgweEFCQkQwOTUyKSwgKDB4MUE2RUY0M0EpLCAoMHhDRDlCMkE5RCksICgweDcyMjJCMzY2KSwgKDB4OTc5RTg5RTkpLCAoMHgwMkM5MTEzRiksICgweDFENTExNDY2KSwgKDB4NTdBOTIyMDYpLCAoMHg0QTQxMjA3NSksICgweEZEMzFENzgzKSwgKDB4QTc1NDJFRkMpLCAoMHgyNEI3Njk3NSksCi0vLygweEI5OTk2MkM3KSwgKDB4MTlGMUQzNTYpLCAoMHg5RDEyQzNDQiksICgweDZEMzdENTQyKSwgKDB4MjlFNzIxNEQpLCAoMHg4OTAwRjY0NSksICgweEIxNTRBRDRBKSwgKDB4RjA0N0Q5ODgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDEwMTAwKSwgKDB4MDAwMDAwMDApLCAoMHg4MDAwQzlFOCksICgweDgwMDBDQkYwKSwgKDB4ODAwMENDRDApLCAoMHg4MDAwQ0RCMCksICgweDgwMDBDRTkwKSwgKDB4MDAwMDAwMDApLCAoMHgyRjI2QjEzNiksICgweDU1NjMxMjY5KSwgKDB4RUYxMjEzRTEpLCAoMHhBNTZBQjg0NCksCi0vLygweEFBNEIxRDY0KSwgKDB4NjQzNDFFQTkpLCAoMHgwQ0U5REI0OCksICgweDQ2MEMyMTQ0KSwgKDB4QURDNTAyMDUpLCAoMHg1MTVDNDcyRiksICgweDMwNEMyOUJEKSwgKDB4NzZBRjg3MTEpLCAoMHg1NTdDQURCNyksICgweDJBOUJCQzhFKSwgKDB4RTUwRTE0NUIpLCAoMHg5QzIwMzFGRCksICgweEQ5MTIxQThDKSwgKDB4RjUxQTk2RkQpLCAoMHg0NUNDQkVCRiksICgweDVGODg0ODcxKSwgKDB4NjZEQUUyOTEpLCAoMHg5NUFEQzlFNSksCi0vLygweDMzQ0YzMDREKSwgKDB4MjNDODdEQ0UpLCAoMHhBNzAxNEZCMyksICgweEZCMzUxRTcxKSwgKDB4OEQ2MEY2NkYpLCAoMHhCRkQ2RERENSksICgweDE1MUZFNkYxKSwgKDB4RENDNzkzNUEpLCAoMHgwQ0FDRkJGMCksICgweEVFNTVBMzcxKSwgKDB4QkU0NkI3NTUpLCAoMHgwRjc5RENEMiksICgweDIzREZGNzZEKSwgKDB4ODNERTc2RDcpLCAoMHg4QjBFM0FFRSksICgweEIwMUJGQjQ0KSwgKDB4NEUzNjE5RkEpLCAoMHhBMTlGOUU2NCksCi0vLygweDU0OUNCMTZDKSwgKDB4NzQ2NDlFNjkpLCAoMHhEOEQ0OEFERSksICgweDEyNTNBRUREKSwgKDB4ODA0MTBGRDIpLCAoMHg1QjM2ODg5RCksICgweDg4MENFMUU3KSwgKDB4NTZDNDk4RTcpLCAoMHhCRDQ5MkFEOSksICgweDA4OTlFNDVGKSwgKDB4ODE1NkU0MUQpLCAoMHg1REE1MzlCQSksICgweDBBRjM1QjJDKSwgKDB4REI4OUJBQUUpLCAoMHhBMTI4Qzk2NiksICgweEEwMkNFQUVFKSwgKDB4OEI3RkJDRUMpLCAoMHg5REFGN0VGNSksCi0vLygweDdFM0E3OUYxKSwgKDB4OUM4OTZBQ0QpLCAoMHg2MjhGMjQ5QSksICgweERENkU1MUFGKSwgKDB4QUY3Mzk5NEIpLCAoMHg1OTY2OTk1RCksICgweEI3NjIwNTk3KSwgKDB4MzY5QjFFNTQpLCAoMHg3Q0VEQzc4NyksICgweEU3QjE1QjFGKSwgKDB4QjM2RjVGN0QpLCAoMHhCNUI3M0VGNiksICgweEQ3NkVFRUUyKSwgKDB4MTRFODYxODYpLCAoMHhDQzE1OTI5MSksICgweDRFQzg1Q0EzKSwgKDB4RUMzQzcwNEUpLCAoMHgwQjY2MzNCMyksCi0vLygweDREOTkyRDRCKSwgKDB4RUIxQjU3NzQpLCAoMHhERkI5RDUwOCksICgweDExNzgzNzE5KSwgKDB4OUQ3MDQ4RTUpLCAoMHhDMTI0NTY5RSksICgweENDQjBFMTExKSwgKDB4MTVCMkJCODYpLCAoMHgxODM3MUQ5QyksICgweEIyQUJEOTREKSwgKDB4OEVDNjU2QjMpLCAoMHhCRjAxMDk5NSksICgweDQ2NTIyMEJCKSwgKDB4QzY2RTFGRkMpLCAoMHgyQzYxRDM1NiksICgweEFGRkIxNzZEKSwgKDB4ODgwNjdFMjMpLCAoMHgzNzk2RjAwOCksCi0vLygweEM4RDEyOEYzKSwgKDB4QjY2MUE1RkEpLCAoMHhGMTlDRTRGMCksICgweDNGN0QwMzQ1KSwgKDB4RTk3RTYwMzApLCAoMHg0QUJBOTFDRiksICgweERFRURBQjBDKSwgKDB4MzVGRDFENzcpLCAoMHhERDYzNjQzOSksICgweDJGOEI3OTRDKSwgKDB4NzY0RTFEMzIpLCAoMHg3QThEMEIxQiksICgweDhFQUNCMjdGKSwgKDB4NTc3QUQ2N0IpLCAoMHgyQjNGRTJDNSksICgweDhBQ0QwMjRBKSwgKDB4RURGNUM0MkMpLCAoMHhGMUNBOTUxQyksCi0vLygweEI5OEI2RDA0KSwgKDB4NkQxMkI4NjQpLCAoMHg1MEU3NEQwOCksICgweDczRDE1MDNCKSwgKDB4QzdEM0Y2QTkpLCAoMHgxRjM2NUU5NyksICgweEUxMzQwRTU5KSwgKDB4ODlEMjFCOUQpLCAoMHg5Qjc1NjczMyksICgweDkwMjRDRDUwKSwgKDB4RTJDN0ZGNTIpLCAoMHhEOUYwNjFFRiksICgweDc3MTUxMzkyKSwgKDB4QTBFNEEwMDQpLCAoMHg2MEJFODIwRiksICgweEM3NjAzQkFGKSwgKDB4QTYyRTNEQTkpLCAoMHhBNDAwRTExRiksCi0vLygweDE1NTExMUQ0KSwgKDB4OTAzMEEzNzQpLCAoMHgxNDE4NTEyNCksICgweDhEMDQzQTAwKSwgKDB4NTA5NDUyNTgpLCAoMHgyMEE2NjUzRSksICgweDgyMEQwMjA4KSwgKDB4MDIwMjgyMDcpLCAoMHgwMTAwRkVGNyksICgweDAwMDAwMEUwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwNyksICgweDAwMDAwMDM4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAzOCksICgweDAwMDEwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksCi0vLygweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDAwMCksICgweDAwMDAwMDAwKSwgKDB4NTQ0NDJEMTgpLCAoMHg0MDE5MjFGQiksICgweDg2QjJBNTJFKSwgKDB4QkRBOEJENTkpLCAoMHg2MEREREM4QyksICgweDNFMjFFRTNCKQotLy99Oworc3RhdGljIGNvbnN0IElOVCBfX3R3aWRkbGVzX21pcHNfZmZ0MzJfMTAyNFtdID0geworICAgICgweDdGRkZGRkZGKSwgKDB4MDAwMDAwMDApLCAoMHg3RkZGNjIxNSksICgweEZGMzZGMDc4KSwgKDB4N0ZGRDg4NTkpLAorICAgICgweEZFNkRFMkUwKSwgKDB4N0ZGQTcyRDApLCAoMHhGREE0RDkyOSksICgweDdGRjYyMTgxKSwgKDB4RkNEQkQ1NDApLAorICAgICgweDdGRjA5NDc2KSwgKDB4RkMxMkQ5MUIpLCAoMHg3RkU5Q0JCRSksICgweEZCNDlFNkEzKSwgKDB4N0ZFMUM3NkEpLAorICAgICgweEZBODBGRkNFKSwgKDB4N0ZEODg3OEMpLCAoMHhGOUI4MjY4MSksICgweDdGQ0UwQzNEKSwgKDB4RjhFRjVDQkMpLAorICAgICgweDdGQzI1NTk1KSwgKDB4RjgyNkE0NjQpLCAoMHg3RkI1NjNCMiksICgweEY3NURGRjZCKSwgKDB4N0ZBNzM2QjIpLAorICAgICgweEY2OTU2RkI3KSwgKDB4N0Y5N0NFQkIpLCAoMHhGNUNDRjczRSksICgweDdGODcyQkYyKSwgKDB4RjUwNDk4MDApLAorICAgICgweDdGNzU0RTdFKSwgKDB4RjQzQzUzQ0IpLCAoMHg3RjYyMzY4RCksICgweEYzNzQyQzlEKSwgKDB4N0Y0REU0NTApLAorICAgICgweEYyQUMyNDczKSwgKDB4N0YzODU3RjQpLCAoMHhGMUU0M0QxQyksICgweDdGMjE5MUIyKSwgKDB4RjExQzc4OTUpLAorICAgICgweDdGMDk5MUMzKSwgKDB4RjA1NEQ4REEpLCAoMHg3RUYwNTg2MCksICgweEVGOEQ1RkM4KSwgKDB4N0VENUU1QzYpLAorICAgICgweEVFQzYwRjNDKSwgKDB4N0VCQTNBMzgpLCAoMHhFREZFRTkzMCksICgweDdFOUQ1NUZCKSwgKDB4RUQzN0VGOTEpLAorICAgICgweDdFN0YzOTU0KSwgKDB4RUM3MTI0NEEpLCAoMHg3RTVGRTQ5MCksICgweEVCQUE4OTQ0KSwgKDB4N0UzRjU4MDApLAorICAgICgweEVBRTQyMDhBKSwgKDB4N0UxRDkzRUEpLCAoMHhFQTFERUJDNiksICgweDdERkE5OEE3KSwgKDB4RTk1N0VEMDApLAorICAgICgweDdERDY2NjhEKSwgKDB4RTg5MjI2MjEpLCAoMHg3REIwRkRGNSksICgweEU3Q0M5OTEyKSwgKDB4N0Q4QTVGM0MpLAorICAgICgweEU3MDc0N0I5KSwgKDB4N0Q2MjhBQzcpLCAoMHhFNjQyMzQxQyksICgweDdEMzk4MEVEKSwgKDB4RTU3RDVGRTQpLAorICAgICgweDdEMEY0MjE3KSwgKDB4RTRCOENEMTYpLCAoMHg3Q0UzQ0VCMCksICgweEUzRjQ3RDk1KSwgKDB4N0NCNzI3MjEpLAorICAgICgweEUzMzA3MzQ3KSwgKDB4N0M4OTRCREEpLCAoMHhFMjZDQjAxMCksICgweDdDNUEzRDUyKSwgKDB4RTFBOTM1RjEpLAorICAgICgweDdDMjlGQkVGKSwgKDB4RTBFNjA2OEYpLCAoMHg3QkY4ODgzMCksICgweEUwMjMyM0VBKSwgKDB4N0JDNUUyOTYpLAorICAgICgweERGNjA5MDAyKSwgKDB4N0I5MjBCODYpLCAoMHhERTlFNEM1QiksICgweDdCNUQwM0ExKSwgKDB4REREQzVCNEYpLAorICAgICgweDdCMjZDQjQ5KSwgKDB4REQxQUJFNDEpLCAoMHg3QUVGNjMyNSksICgweERDNTk3NzhCKSwgKDB4N0FCNkNCOUEpLAorICAgICgweERCOTg4ODhFKSwgKDB4N0E3RDA1NTkpLCAoMHhEQUQ3RjNBMiksICgweDdBNDIxMERFKSwgKDB4REExN0JBNjMpLAorICAgICgweDdBMDVFRUE4KSwgKDB4RDk1N0RFNkYpLCAoMHg3OUM4OUY3MSksICgweEQ4OTg2MjFBKSwgKDB4Nzk4QTIzQTgpLAorICAgICgweEQ3RDk0NkMzKSwgKDB4Nzk0QTdDMTEpLCAoMHhENzFBOEVCQSksICgweDc5MDlBOTM1KSwgKDB4RDY1QzNCOTgpLAorICAgICgweDc4QzdBQjlFKSwgKDB4RDU5RTRFRjkpLCAoMHg3ODg0ODQxOSksICgweEQ0RTBDQjI4KSwgKDB4Nzg0MDMzMjEpLAorICAgICgweEQ0MjNCMTgxKSwgKDB4NzdGQUI5OEEpLCAoMHhEMzY3MDQ0RiksICgweDc3QjQxN0Q0KSwgKDB4RDJBQUM0RUIpLAorICAgICgweDc3NkM0RUQ5KSwgKDB4RDFFRUY1OUQpLCAoMHg3NzIzNUYzNSksICgweEQxMzM5N0ZBKSwgKDB4NzZEOTQ5ODMpLAorICAgICgweEQwNzhBRDkzKSwgKDB4NzY4RTBFQTkpLCAoMHhDRkJFMzhBRCksICgweDc2NDFBRjMyKSwgKDB4Q0YwNDNBOUUpLAorICAgICgweDc1RjQyQzBCKSwgKDB4Q0U0QUI1QTYpLCAoMHg3NUE1ODVEOSksICgweENEOTFBQjU1KSwgKDB4NzU1NUJENDcpLAorICAgICgweENDRDkxRDM3KSwgKDB4NzUwNEQzNEMpLCAoMHhDQzIxMEQ4QiksICgweDc0QjJDODdCKSwgKDB4Q0I2OTdEQTApLAorICAgICgweDc0NUY5REQzKSwgKDB4Q0FCMjZGQjIpLCAoMHg3NDBCNTNFRCksICgweEM5RkJFNTBFKSwgKDB4NzNCNUVCQ0YpLAorICAgICgweEM5NDVERkVCKSwgKDB4NzM1RjY2MkYpLCAoMHhDODkwNjFEMSksICgweDczMDdDM0M5KSwgKDB4QzdEQjZDNDUpLAorICAgICgweDcyQUYwNUFCKSwgKDB4QzcyNzAxN0EpLCAoMHg3MjU1MkM3OSksICgweEM2NzMyMkI5KSwgKDB4NzFGQTM5NDgpLAorICAgICgweEM1QkZEMjMyKSwgKDB4NzE5RTJDREUpLCAoMHhDNTBEMTE2NCksICgweDcxNDEwODAwKSwgKDB4QzQ1QUUxRDEpLAorICAgICgweDcwRTJDQkNEKSwgKDB4QzNBOTQ1QTEpLCAoMHg3MDgzNzhGNCksICgweEMyRjgzRTFCKSwgKDB4NzAyMzEwOUMpLAorICAgICgweEMyNDdDRDYyKSwgKDB4NkZDMTkzNzYpLCAoMHhDMTk3RjRCQiksICgweDZGNUYwMkNGKSwgKDB4QzBFOEI2N0UpLAorICAgICgweDZFRkI1RjFEKSwgKDB4QzAzQTEzN0UpLCAoMHg2RTk2QTk5NSksICgweEJGOEMwREQ4KSwgKDB4NkUzMEUzMkYpLAorICAgICgweEJFREVBNzNBKSwgKDB4NkRDQTBEMjcpLCAoMHhCRTMxRTFCRiksICgweDZENjIyN0ZBKSwgKDB4QkQ4NUJFMzMpLAorICAgICgweDZDRjkzNEU4KSwgKDB4QkNEQTNFQUUpLCAoMHg2QzhGMzUzOCksICgweEJDMkY2NTQ0KSwgKDB4NkMyNDI5NjkpLAorICAgICgweEJCODUzMkMwKSwgKDB4NkJCODEyQzUpLCAoMHhCQURCQTkzNCksICgweDZCNEFGMjU4KSwgKDB4QkEzMkNBNDIpLAorICAgICgweDZBRENDOTc2KSwgKDB4Qjk4QTk3RjYpLCAoMHg2QTZEOThBMSksICgweEI4RTMxMzE4KSwgKDB4NjlGRDYxMzIpLAorICAgICgweEI4M0MzREIxKSwgKDB4Njk4QzI0ODcpLCAoMHhCNzk2MTlDNiksICgweDY5MTlFMzI2KSwgKDB4QjZGMEE4MUQpLAorICAgICgweDY4QTY5RTcyKSwgKDB4QjY0QkVBQjkpLCAoMHg2ODMyNTc4NiksICgweEI1QTdFMzMxKSwgKDB4NjdCRDBGQ0MpLAorICAgICgweEI1MDQ5MzgwKSwgKDB4Njc0NkM3RDEpLCAoMHhCNDYxRkM2QSksICgweDY2Q0Y4MTAzKSwgKDB4QjNDMDFGRTkpLAorICAgICgweDY2NTczQ0Q1KSwgKDB4QjMxRUZGRjApLCAoMHg2NURERkJENiksICgweEIyN0U5RDQzKSwgKDB4NjU2M0JGN0UpLAorICAgICgweEIxREVGOUQyKSwgKDB4NjRFODg5NEEpLCAoMHhCMTQwMTc4QyksICgweDY0NkM1OUNDKSwgKDB4QjBBMUY3MzApLAorICAgICgweDYzRUYzMjg2KSwgKDB4QjAwNDlBQTkpLCAoMHg2MzcxMTRBQiksICgweEFGNjgwMzdCKSwgKDB4NjJGMjAxQzQpLAorICAgICgweEFFQ0MzMzhCKSwgKDB4NjI3MUZBNjkpLCAoMHhBRTMxMkI5NCksICgweDYxRjEwMDI3KSwgKDB4QUQ5NkVENzcpLAorICAgICgweDYxNkYxNDhFKSwgKDB4QUNGRDdCMTMpLCAoMHg2MEVDMzgzQSksICgweEFDNjRENTFGKSwgKDB4NjA2ODZDQzApLAorICAgICgweEFCQ0NGRDc1KSwgKDB4NUZFM0IzNjYpLCAoMHhBQjM1RjU4QyksICgweDVGNUUwREM4KSwgKDB4QUE5RkJGMzgpLAorICAgICgweDVFRDc3Qzg2KSwgKDB4QUEwQTVCMkMpLCAoMHg1RTUwMDE0MCksICgweEE5NzVDQjM5KSwgKDB4NURDNzlEOUMpLAorICAgICgweEE4RTIxMTJDKSwgKDB4NUQzRTUyM0UpLCAoMHhBODRGMkRCNCksICgweDVDQjQyMENEKSwgKDB4QTdCRDIyOUEpLAorICAgICgweDVDMjkwQUEwKSwgKDB4QTcyQkYxNDgpLCAoMHg1QjlEMTE2NiksICgweEE2OUI5QjdEKSwgKDB4NUIxMDM1QzcpLAorICAgICgweEE2MEMyMUU4KSwgKDB4NUE4Mjc5NzgpLCAoMHhBNTdEODY0NiksICgweDU5RjNERTMwKSwgKDB4QTRFRkNBNTEpLAorICAgICgweDU5NjQ2NDlCKSwgKDB4QTQ2MkVFQjIpLCAoMHg1OEQ0MEU3NSksICgweEEzRDZGNTFGKSwgKDB4NTg0MkREN0UpLAorICAgICgweEEzNEJERjRCKSwgKDB4NTdCMEQyNjUpLCAoMHhBMkMxQUREQSksICgweDU3MURFRUVEKSwgKDB4QTIzODYyN0IpLAorICAgICgweDU2OEEzNDgyKSwgKDB4QTFBRkZFODEpLCAoMHg1NUY1QTRFRCksICgweEExMjg4MzkxKSwgKDB4NTU2MDQwRTIpLAorICAgICgweEEwQTFGMjRGKSwgKDB4NTRDQTBBMkUpLCAoMHhBMDFDNEM1QyksICgweDU0MzMwMkE1KSwgKDB4OUY5NzkzNTYpLAorICAgICgweDUzOUIyQUZCKSwgKDB4OUYxM0M3REMpLCAoMHg1MzAyODUwNyksICgweDlFOTBFQjg4KSwgKDB4NTI2OTEyNDEpLAorICAgICgweDlFMEVGRjlEKSwgKDB4NTFDRUQ0ODYpLCAoMHg5RDhFMDVBRCksICgweDUxMzNDQzhGKSwgKDB4OUQwREZFNTIpLAorICAgICgweDUwOTdGQzNDKSwgKDB4OUM4RUVCMUEpLCAoMHg0RkZCNjU3MiksICgweDlDMTBDRDkwKSwgKDB4NEY1RTA4RUIpLAorICAgICgweDlCOTNBNjQ5KSwgKDB4NEVCRkU4OEYpLCAoMHg5QjE3NzZDQiksICgweDRFMjEwNUU0KSwgKDB4OUE5QzQwNDgpLAorICAgICgweDREODE2MkQ4KSwgKDB4OUEyMjA0M0YpLCAoMHg0Q0UxMDAyQiksICgweDk5QThDMzQwKSwgKDB4NEMzRkRGQ0MpLAorICAgICgweDk5MzA3RUM1KSwgKDB4NEI5RTAzQjEpLCAoMHg5OEI5Mzg0MyksICgweDRBRkI2QzlCKSwgKDB4OTg0MkYwNDgpLAorICAgICgweDRBNTgxQzgzKSwgKDB4OTdDREE4NDQpLCAoMHg0OUI0MTU2MiksICgweDk3NTk2MUEyKSwgKDB4NDkwRjU3RkYpLAorICAgICgweDk2RTYxQ0VEKSwgKDB4NDg2OUU2NTcpLCAoMHg5NjczREI4QyksICgweDQ3QzNDMjAyKSwgKDB4OTYwMjlFOTkpLAorICAgICgweDQ3MUNFRDA1KSwgKDB4OTU5MjY3NzIpLCAoMHg0Njc1NjgyNyksICgweDk1MjMzNjlEKSwgKDB4NDVDRDM1NkYpLAorICAgICgweDk0QjUwRDc0KSwgKDB4NDUyNDU2RTkpLCAoMHg5NDQ3RUQ0RCksICgweDQ0N0FDRDVEKSwgKDB4OTNEQkQ2QUEpLAorICAgICgweDQzRDA5QUQ5KSwgKDB4OTM3MENBREEpLCAoMHg0MzI1QzEwMiksICgweDkzMDZDQUU3KSwgKDB4NDI3QTQxN0QpLAorICAgICgweDkyOUREN0Q1KSwgKDB4NDFDRTFFQ0QpLCAoMHg5MjM1RjMyQyksICgweDQxMjE1OEUzKSwgKDB4OTFDRjFDRTMpLAorICAgICgweDQwNzNGMjQ1KSwgKDB4OTE2OTU2N0QpLCAoMHgzRkM1RUNBMCksICgweDkxMDRBMEY0KSwgKDB4M0YxNzQ5OUYpLAorICAgICgweDkwQTBGRDQyKSwgKDB4M0U2ODBBRjMpLCAoMHg5MDNFNkM1RCksICgweDNEQjgzMjRDKSwgKDB4OEZEQ0VGMzcpLAorICAgICgweDNEMDdDMjNDKSwgKDB4OEY3Qzg3M0EpLCAoMHgzQzU2QkFCNSksICgweDhGMUQzNDYxKSwgKDB4M0JBNTFFNEQpLAorICAgICgweDhFQkVGODEwKSwgKDB4M0FGMkVFQkEpLCAoMHg4RTYxRDMzMSksICgweDNBNDAyREI0KSwgKDB4OEUwNUM2QUEpLAorICAgICgweDM5OENEQ0YzKSwgKDB4OERBQUQzNUQpLCAoMHgzOEQ4RkUzMiksICgweDhENTBGQTJCKSwgKDB4MzgyNDk0MTMpLAorICAgICgweDhDRjgzQzYyKSwgKDB4Mzc2RjlFODgpLCAoMHg4Q0EwOTlGQiksICgweDM2QkEyMDM0KSwgKDB4OEM0QTE0NDApLAorICAgICgweDM2MDQxQUQ3KSwgKDB4OEJGNEFDMDYpLCAoMHgzNTREOTAzMyksICgweDhCQTA2MjIxKSwgKDB4MzQ5NjgyMEEpLAorICAgICgweDhCNEQzNzVGKSwgKDB4MzNERUYyMUYpLCAoMHg4QUZCMkM4RSksICgweDMzMjZFMzIzKSwgKDB4OEFBQTQyRTApLAorICAgICgweDMyNkU1NTA1KSwgKDB4OEE1QTdBNEQpLCAoMHgzMUI1NEE3OSksICgweDhBMEJENDAzKSwgKDB4MzBGQkM1NDcpLAorICAgICgweDg5QkU1MEMyKSwgKDB4MzA0MUM3MzcpLCAoMHg4OTcxRjE0QiksICgweDJGODc1MjE2KSwgKDB4ODkyNkI2NUEpLAorICAgICgweDJFQ0M2N0FGKSwgKDB4ODhEQ0EwQTkpLCAoMHgyRTExMEFCRiksICgweDg4OTNCMTRBKSwgKDB4MkQ1NTNCMzUpLAorICAgICgweDg4NEJFODM4KSwgKDB4MkM5OEZCRDEpLCAoMHg4ODA1NDY4MiksICgweDJCREM0RTYzKSwgKDB4ODdCRkNDRDUpLAorICAgICgweDJCMUYzNEJDKSwgKDB4ODc3QjdCREQpLCAoMHgyQTYxQjBBRiksICgweDg3Mzg1NDQzKSwgKDB4MjlBM0M0MEYpLAorICAgICgweDg2RjY1NkFDKSwgKDB4MjhFNTcxQTMpLCAoMHg4NkI1ODQwRSksICgweDI4MjZCOTVFKSwgKDB4ODY3NURDNjIpLAorICAgICgweDI3Njc5RTA2KSwgKDB4ODYzNzYwOUEpLCAoMHgyNkE4MjE3NCksICgweDg1RkExMTRGKSwgKDB4MjVFODQ1ODEpLAorICAgICgweDg1QkRFRjE5KSwgKDB4MjUyODBDMDUpLCAoMHg4NTgyRkE4QyksICgweDI0Njc3N0QwKSwgKDB4ODU0OTM0ODIpLAorICAgICgweDIzQTY4OEQzKSwgKDB4ODUxMDlDRjcpLCAoMHgyMkU1NDFFMCksICgweDg0RDkzNEMwKSwgKDB4MjIyM0E0RDIpLAorICAgICgweDg0QTJGQzY4KSwgKDB4MjE2MUIzODkpLCAoMHg4NDZERjQ3MiksICgweDIwOUY2RkUxKSwgKDB4ODQzQTFENjIpLAorICAgICgweDFGRENEQkJCKSwgKDB4ODQwNzc3QjkpLCAoMHgxRjE5RjlGMCksICgweDgzRDYwNDMxKSwgKDB4MUU1NkNBNkUpLAorICAgICgweDgzQTVDMkM1KSwgKDB4MUQ5MzUwMTEpLCAoMHg4Mzc2QjQyRSksICgweDFDQ0Y4Q0JCKSwgKDB4ODM0OEQ4REYpLAorICAgICgweDFDMEI4MjRFKSwgKDB4ODMxQzMxNEEpLCAoMHgxQjQ3MzJBRSksICgweDgyRjBCRERCKSwgKDB4MUE4MjlGQzApLAorICAgICgweDgyQzY3RjAwKSwgKDB4MTlCRENDNjMpLCAoMHg4MjlENzU1MyksICgweDE4RjhCODg4KSwgKDB4ODI3NUEwRDEpLAorICAgICgweDE4MzM2NzEwKSwgKDB4ODI0RjAyMTEpLCAoMHgxNzZERDlFMSksICgweDgyMjk5OTc0KSwgKDB4MTZBODEyRTMpLAorICAgICgweDgyMDU2NzU0KSwgKDB4MTVFMjEzRkQpLCAoMHg4MUUyNkMwQiksICgweDE1MUJERjE5KSwgKDB4ODFDMEE3RjEpLAorICAgICgweDE0NTU3NzFEKSwgKDB4ODFBMDFCODApLCAoMHgxMzhFREJGOCksICgweDgxODBDNkI2KSwgKDB4MTJDODEwOTApLAorICAgICgweDgxNjJBQTBBKSwgKDB4MTIwMTE2RDIpLCAoMHg4MTQ1QzVDOCksICgweDExMzlGMEE3KSwgKDB4ODEyQTFBMzYpLAorICAgICgweDEwNzI5RkZCKSwgKDB4ODEwRkE3OTgpLCAoMHgwRkFCMjZCOSksICgweDgwRjY2RTMwKSwgKDB4MEVFMzg3Q0QpLAorICAgICgweDgwREU2RTVBKSwgKDB4MEUxQkMzMjYpLCAoMHg4MEM3QTgxMyksICgweDBENTNEQkFGKSwgKDB4ODBCMjFCQjQpLAorICAgICgweDBDOEJEMzU2KSwgKDB4ODA5REM5NzEpLCAoMHgwQkMzQUMwNyksICgweDgwOEFCMTdFKSwgKDB4MEFGQjY3QjIpLAorICAgICgweDgwNzhENDA3KSwgKDB4MEEzMzA4NDQpLCAoMHg4MDY4MzEzQiksICgweDA5NkE5MEFCKSwgKDB4ODA1OEM5NTUpLAorICAgICgweDA4QTIwMEQ3KSwgKDB4ODA0QTlDNTMpLCAoMHgwN0Q5NUJCNiksICgweDgwM0RBQTZEKSwgKDB4MDcxMEEzMzcpLAorICAgICgweDgwMzFGM0MzKSwgKDB4MDY0N0Q5NDkpLCAoMHg4MDI3Nzg3MSksICgweDA1N0VGRkRDKSwgKDB4ODAxRTM4OTIpLAorICAgICgweDA0QjYxOERGKSwgKDB4ODAxNjM0M0QpLCAoMHgwM0VEMjc0MyksICgweDgwMEY2QjhEKSwgKDB4MDMyNDJBRjYpLAorICAgICgweDgwMDlERTgxKSwgKDB4MDI1QjI2RTkpLCAoMHg4MDA1OEQzMSksICgweDAxOTIxRDBDKSwgKDB4ODAwMjc3QTcpLAorICAgICgweDAwQzkwRjRGKSwgKDB4ODAwMDlERUIpLCAoMHhGRkZGRkZBMyksICgweDgwMDAwMDAyKSwgKDB4RkYzNkYwRjUpLAorICAgICgweDgwMDA5REVCKSwgKDB4RkU2REUzMzgpLCAoMHg4MDAyNzdBNiksICgweEZEQTREOTVCKSwgKDB4ODAwNThEMkYpLAorICAgICgweEZDREJENTRFKSwgKDB4ODAwOURFN0YpLCAoMHhGQzEyRDkwMiksICgweDgwMEY2QjhBKSwgKDB4RkI0OUU2NjUpLAorICAgICgweDgwMTYzNDQ0KSwgKDB4RkE4MEZGNjkpLCAoMHg4MDFFMzg5QSksICgweEY5QjgyNkZCKSwgKDB4ODAyNzc4NkUpLAorICAgICgweEY4RUY1RDBFKSwgKDB4ODAzMUYzQkYpLCAoMHhGODI2QTQ4RSksICgweDgwM0RBQTY5KSwgKDB4Rjc1REZGNkQpLAorICAgICgweDgwNEE5QzRFKSwgKDB4RjY5NTZGOTkpLCAoMHg4MDU4Qzk1MCksICgweEY1Q0NGNzAxKSwgKDB4ODA2ODMxNEEpLAorICAgICgweEY1MDQ5NzkzKSwgKDB4ODA3OEQ0MTgpLCAoMHhGNDNDNTQzRCksICgweDgwOEFCMTc3KSwgKDB4RjM3NDJDRUUpLAorICAgICgweDgwOURDOTZCKSwgKDB4RjJBQzI0OTUpLCAoMHg4MEIyMUJBRCksICgweEYxRTQzRDFFKSwgKDB4ODBDN0E4MEMpLAorICAgICgweEYxMUM3ODc3KSwgKDB4ODBERTZFNTIpLCAoMHhGMDU0RDg4RCksICgweDgwRjY2RTQ3KSwgKDB4RUY4RDVGNEIpLAorICAgICgweDgxMEZBN0IwKSwgKDB4RUVDNjBGOUQpLCAoMHg4MTJBMUEyRCksICgweEVERkVFOTcyKSwgKDB4ODE0NUM1QkUpLAorICAgICgweEVEMzdFRkIzKSwgKDB4ODE2MkFBMDApLCAoMHhFQzcxMjQ0QyksICgweDgxODBDNkFCKSwgKDB4RUJBQTg5MjcpLAorICAgICgweDgxQTAxQjc1KSwgKDB4RUFFNDIwMkQpLCAoMHg4MUMwQTgxMCksICgweEVBMURFQjRBKSwgKDB4ODFFMjZDMkMpLAorICAgICgweEU5NTdFRDYxKSwgKDB4ODIwNTY3NDgpLCAoMHhFODkyMjY2MiksICgweDgyMjk5OTY3KSwgKDB4RTdDQzk5MzMpLAorICAgICgweDgyNEYwMjA0KSwgKDB4RTcwNzQ3QkIpLCAoMHg4Mjc1QTBDMyksICgweEU2NDIzM0UwKSwgKDB4ODI5RDc1NDUpLAorICAgICgweEU1N0Q1Rjg5KSwgKDB4ODJDNjdGMjcpLCAoMHhFNEI4Q0M5QiksICgweDgyRjBCRTAzKSwgKDB4RTNGNDdERjUpLAorICAgICgweDgzMUMzMTNCKSwgKDB4RTMzMDczODgpLCAoMHg4MzQ4RDhEMCksICgweEUyNkNCMDMxKSwgKDB4ODM3NkI0MUUpLAorICAgICgweEUxQTkzNUQ0KSwgKDB4ODNBNUMyQjUpLCAoMHhFMEU2MDY1MyksICgweDgzRDYwNDIwKSwgKDB4RTAyMzIzOEYpLAorICAgICgweDg0MDc3N0U4KSwgKDB4REY2MDhGNjkpLCAoMHg4NDNBMUQ5MiksICgweERFOUU0Q0I5KSwgKDB4ODQ2REY0NjApLAorICAgICgweEREREM1QjZGKSwgKDB4ODRBMkZDNTUpLCAoMHhERDFBQkU2MiksICgweDg0RDkzNEFFKSwgKDB4REM1OTc3NkUpLAorICAgICgweDg1MTA5Q0U0KSwgKDB4REI5ODg4NzIpLCAoMHg4NTQ5MzQ2RSksICgweERBRDdGMzQ4KSwgKDB4ODU4MkZBQzIpLAorICAgICgweERBMTdCQUMxKSwgKDB4ODVCREVGMDUpLCAoMHhEOTU3REVDRCksICgweDg1RkExMTNBKSwgKDB4RDg5ODYyM0IpLAorICAgICgweDg2Mzc2MDg1KSwgKDB4RDdEOTQ2RTMpLCAoMHg4Njc1REM0RCksICgweEQ3MUE4RTlEKSwgKDB4ODZCNTgzRjgpLAorICAgICgweEQ2NUMzQjQwKSwgKDB4ODZGNjU2RTkpLCAoMHhENTlFNEVBMCksICgweDg3Mzg1NDgxKSwgKDB4RDRFMENCODQpLAorICAgICgweDg3N0I3QkM2KSwgKDB4RDQyM0IxREQpLCAoMHg4N0JGQ0NCRCksICgweEQzNjcwNDZGKSwgKDB4ODgwNTQ2NkEpLAorICAgICgweEQyQUFDNTBBKSwgKDB4ODg0QkU4MjApLCAoMHhEMUVFRjU4MSksICgweDg4OTNCMTMyKSwgKDB4RDEzMzk3QTIpLAorICAgICgweDg4RENBMEVFKSwgKDB4RDA3OEFEM0MpLCAoMHg4OTI2QjZBMCksICgweENGQkUzOTA4KSwgKDB4ODk3MUYxMzIpLAorICAgICgweENGMDQzQUY4KSwgKDB4ODlCRTUwQTgpLCAoMHhDRTRBQjVDNiksICgweDhBMEJEM0U4KSwgKDB4Q0Q5MUFCMzkpLAorICAgICgweDhBNUE3QTMyKSwgKDB4Q0NEOTFEMUMpLCAoMHg4QUFBNDJDNSksICgweENDMjEwRDM1KSwgKDB4OEFGQjJDREIpLAorICAgICgweENCNjk3RDRCKSwgKDB4OEI0RDM3QUMpLCAoMHhDQUIyNzAwQiksICgweDhCQTA2MjA0KSwgKDB4QzlGQkU1NjcpLAorICAgICgweDhCRjRBQkU5KSwgKDB4Qzk0NUUwMEEpLCAoMHg4QzRBMTQyMyksICgweEM4OTA2MUI2KSwgKDB4OENBMDk5REUpLAorICAgICgweEM3REI2QzJBKSwgKDB4OENGODNDNDQpLCAoMHhDNzI3MDEyNiksICgweDhENTBGQTdGKSwgKDB4QzY3MzIyNjUpLAorICAgICgweDhEQUFEM0IyKSwgKDB4QzVCRkQxQTUpLCAoMHg4RTA1QzZGRiksICgweEM1MEQxMDlGKSwgKDB4OEU2MUQzODgpLAorICAgICgweEM0NUFFMTBEKSwgKDB4OEVCRUY4NjgpLCAoMHhDM0E5NDY2OSksICgweDhGMUQzM0M4KSwgKDB4QzJGODNFRTEpLAorICAgICgweDhGN0M4NkEwKSwgKDB4QzI0N0NERjApLCAoMHg4RkRDRUYxNiksICgweEMxOTdGNTQ4KSwgKDB4OTAzRTZDM0IpLAorICAgICgweEMwRThCNjlDKSwgKDB4OTBBMEZEMjEpLCAoMHhDMDNBMTM5QiksICgweDkxMDRBMEQyKSwgKDB4QkY4QzBERjYpLAorICAgICgweDkxNjk1NjVBKSwgKDB4QkVERUE3NTgpLCAoMHg5MUNGMUNDMCksICgweEJFMzFFMTZFKSwgKDB4OTIzNUYzMDkpLAorICAgICgweEJEODVCREUyKSwgKDB4OTI5REQ4MzcpLCAoMHhCQ0RBM0U1RSksICgweDkzMDZDQjQ5KSwgKDB4QkMyRjY0ODcpLAorICAgICgweDkzNzBDQjNEKSwgKDB4QkI4NTMyMDUpLCAoMHg5M0RCRDcwRSksICgweEJBREJBODc5KSwgKDB4OTQ0N0VEQjMpLAorICAgICgweEJBMzJDQjM1KSwgKDB4OTRCNTBEMDkpLCAoMHhCOThBOTg3RCksICgweDk1MjMzNjMxKSwgKDB4QjhFMzEzOUUpLAorICAgICgweDk1OTI2NzA1KSwgKDB4QjgzQzNFMzcpLCAoMHg5NjAyOUU3MyksICgweEI3OTYxOUUyKSwgKDB4OTY3M0RCNjYpLAorICAgICgweEI2RjBBODM5KSwgKDB4OTZFNjFDQzYpLCAoMHhCNjRCRUFENSksICgweDk3NTk2MTdCKSwgKDB4QjVBN0UzNEQpLAorICAgICgweDk3Q0RBODY3KSwgKDB4QjUwNDkzMzQpLCAoMHg5ODQyRjA2QiksICgweEI0NjFGQzFGKSwgKDB4OThCOTM4NjYpLAorICAgICgweEIzQzAxRjlEKSwgKDB4OTkzMDdGMzUpLCAoMHhCMzFFRkYzRiksICgweDk5QThDM0IwKSwgKDB4QjI3RTlDOTIpLAorICAgICgweDlBMjIwNEIwKSwgKDB4QjFERUY5MjIpLCAoMHg5QTlDNDEwOSksICgweEIxNDAxODBDKSwgKDB4OUIxNzc2NTIpLAorICAgICgweEIwQTFGN0FGKSwgKDB4OUI5M0E1Q0YpLCAoMHhCMDA0OUIyNyksICgweDlDMTBDRDE1KSwgKDB4QUY2ODAzRjkpLAorICAgICgweDlDOEVFQUVGKSwgKDB4QUVDQzMzQTUpLCAoMHg5RDBERkUyNyksICgweEFFMzEyQkFFKSwgKDB4OUQ4RTA1ODEpLAorICAgICgweEFEOTZFRDkxKSwgKDB4OUUwRUZGQzMpLCAoMHhBQ0ZEN0FDQyksICgweDlFOTBFQkFGKSwgKDB4QUM2NEQ0RDgpLAorICAgICgweDlGMTNDODAzKSwgKDB4QUJDQ0ZEMkUpLCAoMHg5Rjk3OTM3RCksICgweEFCMzVGNTQ1KSwgKDB4QTAxQzRDRDgpLAorICAgICgweEFBOUZCRTkyKSwgKDB4QTBBMUYyQ0MpLCAoMHhBQTBBNUE4OCksICgweEExMjg4NDBGKSwgKDB4QTk3NUNDMEYpLAorICAgICgweEExQUZGREZDKSwgKDB4QThFMjExQTIpLCAoMHhBMjM4NjFGNSksICgweEE4NEYyRTJBKSwgKDB4QTJDMUFENTMpLAorICAgICgweEE3QkQyMzEwKSwgKDB4QTM0QkRFQzMpLCAoMHhBNzJCRjFCQyksICgweEEzRDZGNEYwKSwgKDB4QTY5QjlCOTYpLAorICAgICgweEE0NjJFRTgyKSwgKDB4QTYwQzIyMDApLCAoMHhBNEVGQ0EyMSksICgweEE1N0Q4NjVFKSwgKDB4QTU3RDg2NzApLAorICAgICgweEE0RUZDQTBGKSwgKDB4QTYwQzIyMTMpLCAoMHhBNDYyRUU3MCksICgweEE2OUI5QkE4KSwgKDB4QTNENkY0REUpLAorICAgICgweEE3MkJGMUNGKSwgKDB4QTM0QkRFQjIpLCAoMHhBN0JEMjMyMiksICgweEEyQzFBRDQyKSwgKDB4QTg0RjJFM0QpLAorICAgICgweEEyMzg2MUU0KSwgKDB4QThFMjExQjUpLCAoMHhBMUFGRkY0NSksICgweEE5NzVDQUE5KSwgKDB4QTEyODgzRkUpLAorICAgICgweEFBMEE1QTlCKSwgKDB4QTBBMUYyQkIpLCAoMHhBQTlGQkVBNSksICgweEEwMUM0Q0M3KSwgKDB4QUIzNUY1NTkpLAorICAgICgweDlGOTc5MzZDKSwgKDB4QUJDQ0ZENDEpLCAoMHg5RjEzQzdGMiksICgweEFDNjRENEVCKSwgKDB4OUU5MEVCOUUpLAorICAgICgweEFDRkQ3QURGKSwgKDB4OUUwRUZGQjMpLCAoMHhBRDk2RURBNSksICgweDlEOEUwNTcxKSwgKDB4QUUzMTJCQzIpLAorICAgICgweDlEMERGRTE2KSwgKDB4QUVDQzMzQjkpLCAoMHg5QzhFRUFERiksICgweEFGNjgwNDBEKSwgKDB4OUMxMENEMDUpLAorICAgICgweEIwMDQ5QjNCKSwgKDB4OUI5M0E1QkYpLCAoMHhCMEExRjdDMyksICgweDlCMTc3NjQyKSwgKDB4QjE0MDE4MjApLAorICAgICgweDlBOUM0MEY5KSwgKDB4QjFERUY5MzYpLCAoMHg5QTIyMDRBMSksICgweEIyN0U5Q0E2KSwgKDB4OTlBOEMzQTEpLAorICAgICgweEIzMUVGRjU0KSwgKDB4OTkzMDdGMjYpLCAoMHhCM0MwMUZCMiksICgweDk4QjkzODU3KSwgKDB4QjQ2MUZDMzMpLAorICAgICgweDk4NDJGMDVDKSwgKDB4QjUwNDkzNDkpLCAoMHg5N0NEQTg1OCksICgweEI1QTdFMzYyKSwgKDB4OTc1OTYxNkMpLAorICAgICgweEI2NEJFQUVBKSwgKDB4OTZFNjFDQjgpLCAoMHhCNkYwQTg0RSksICgweDk2NzNEQjU3KSwgKDB4Qjc5NjE5RjcpLAorICAgICgweDk2MDI5RTY0KSwgKDB4QjgzQzNFNEMpLCAoMHg5NTkyNjZGNyksICgweEI4RTMxM0I0KSwgKDB4OTUyMzM2MjMpLAorICAgICgweEI5OEE5ODkzKSwgKDB4OTRCNTBFMTMpLCAoMHhCQTMyQzk5RSksICgweDk0NDdFREE1KSwgKDB4QkFEQkE4OEYpLAorICAgICgweDkzREJENzAwKSwgKDB4QkI4NTMyMUEpLCAoMHg5MzcwQ0IzMCksICgweEJDMkY2NDlEKSwgKDB4OTMwNkNCM0MpLAorICAgICgweEJDREEzRTc0KSwgKDB4OTI5REQ4MjkpLCAoMHhCRDg1QkRGOCksICgweDkyMzVGMkZDKSwgKDB4QkUzMUUxODQpLAorICAgICgweDkxQ0YxQ0IzKSwgKDB4QkVERUE3NkUpLCAoMHg5MTY5NTY0RCksICgweEJGOEMwRTBDKSwgKDB4OTEwNEEwQzUpLAorICAgICgweEMwM0ExM0IyKSwgKDB4OTBBMEZEMTQpLCAoMHhDMEU4QjZCMiksICgweDkwM0U2QzJGKSwgKDB4QzE5N0Y1NUYpLAorICAgICgweDhGRENFRjA5KSwgKDB4QzI0N0NFMDcpLCAoMHg4RjdDODY5NCksICgweEMyRjgzRUY4KSwgKDB4OEYxRDM0QUQpLAorICAgICgweEMzQTk0NEJDKSwgKDB4OEVCRUY4NUMpLCAoMHhDNDVBRTEyMyksICgweDhFNjFEMzdDKSwgKDB4QzUwRDEwQjYpLAorICAgICgweDhFMDVDNkY0KSwgKDB4QzVCRkQxQkMpLCAoMHg4REFBRDNBNiksICgweEM2NzMyMjdDKSwgKDB4OEQ1MEZBNzMpLAorICAgICgweEM3MjcwMTNEKSwgKDB4OENGODNDMzkpLCAoMHhDN0RCNkM0MSksICgweDhDQTA5OUQzKSwgKDB4Qzg5MDYxQ0QpLAorICAgICgweDhDNEExNDE4KSwgKDB4Qzk0NUUwMjEpLCAoMHg4QkY0QUJERiksICgweEM5RkJFNTdFKSwgKDB4OEJBMDYxRjkpLAorICAgICgweENBQjI3MDIyKSwgKDB4OEI0RDM3MzgpLCAoMHhDQjY5N0U0QyksICgweDhBRkIyQzY4KSwgKDB4Q0MyMTBFMzcpLAorICAgICgweDhBQUE0MjU0KSwgKDB4Q0NEOTFFMUUpLCAoMHg4QTVBN0E4RCksICgweENEOTFBQTY2KSwgKDB4OEEwQkQ0NDIpLAorICAgICgweENFNEFCNEYxKSwgKDB4ODlCRTUxMDApLCAoMHhDRjA0M0EyNCksICgweDg5NzFGMTg4KSwgKDB4Q0ZCRTM4MzMpLAorICAgICgweDg5MjZCNjk3KSwgKDB4RDA3OEFENTMpLCAoMHg4OERDQTBFNCksICgweEQxMzM5N0JBKSwgKDB4ODg5M0IxMjgpLAorICAgICgweEQxRUVGNTk5KSwgKDB4ODg0QkU4MTcpLCAoMHhEMkFBQzUyMiksICgweDg4MDU0NjYxKSwgKDB4RDM2NzA0ODcpLAorICAgICgweDg3QkZDQ0I1KSwgKDB4RDQyM0IxRjUpLCAoMHg4NzdCN0JCRCksICgweEQ0RTBDQjlDKSwgKDB4ODczODU0MjQpLAorICAgICgweEQ1OUU0RkFBKSwgKDB4ODZGNjU2OEUpLCAoMHhENjVDM0M0QSksICgweDg2QjU4MzlFKSwgKDB4RDcxQThGQTgpLAorICAgICgweDg2NzVEQzk1KSwgKDB4RDdEOTQ2MDgpLCAoMHg4NjM3NjBDQyksICgweEQ4OTg2MTYwKSwgKDB4ODVGQTExODApLAorICAgICgweEQ5NTdEREYxKSwgKDB4ODVCREVGNDkpLCAoMHhEQTE3QjlFNSksICgweDg1ODJGQUJCKSwgKDB4REFEN0YzNjApLAorICAgICgweDg1NDkzNDY3KSwgKDB4REI5ODg4OEEpLCAoMHg4NTEwOUNERCksICgweERDNTk3Nzg3KSwgKDB4ODREOTM0QTcpLAorICAgICgweEREMUFCRTdBKSwgKDB4ODRBMkZDNEYpLCAoMHhERERDNUI4OCksICgweDg0NkRGNDVBKSwgKDB4REU5RTRDRDIpLAorICAgICgweDg0M0ExRDRCKSwgKDB4REY2MDkwN0EpLCAoMHg4NDA3NzdBMiksICgweEUwMjMyNEEwKSwgKDB4ODNENjAzREMpLAorICAgICgweEUwRTYwNzY0KSwgKDB4ODNBNUMyRUMpLCAoMHhFMUE5MzRGNCksICgweDgzNzZCNDU0KSwgKDB4RTI2Q0FGNTEpLAorICAgICgweDgzNDhEOTA0KSwgKDB4RTMzMDcyQTcpLCAoMHg4MzFDMzE2RCksICgweEUzRjQ3RDE0KSwgKDB4ODJGMEJERkUpLAorICAgICgweEU0QjhDQ0I0KSwgKDB4ODJDNjdGMjEpLCAoMHhFNTdENUZBMiksICgweDgyOUQ3NTQwKSwgKDB4RTY0MjMzRjkpLAorICAgICgweDgyNzVBMEJFKSwgKDB4RTcwNzQ3RDQpLCAoMHg4MjRGMDIwMCksICgweEU3Q0M5OTRDKSwgKDB4ODIyOTk5NjIpLAorICAgICgweEU4OTIyNjdDKSwgKDB4ODIwNTY3NDMpLCAoMHhFOTU3RUQ3QSksICgweDgxRTI2QkZCKSwgKDB4RUExREVDNUYpLAorICAgICgweDgxQzBBN0UxKSwgKDB4RUFFNDIxNDMpLCAoMHg4MUEwMUI0OCksICgweEVCQUE4QTNEKSwgKDB4ODE4MEM2Q0YpLAorICAgICgweEVDNzEyMzY4KSwgKDB4ODE2MkFBMjIpLCAoMHhFRDM3RUVDRiksICgweDgxNDVDNURGKSwgKDB4RURGRUU4OEUpLAorICAgICgweDgxMkExQTRDKSwgKDB4RUVDNjBFQjkpLCAoMHg4MTBGQTdBRCksICgweEVGOEQ1RjY1KSwgKDB4ODBGNjZFNDQpLAorICAgICgweEYwNTREOEE2KSwgKDB4ODBERTZFNEYpLCAoMHhGMTFDNzg5MSksICgweDgwQzdBODA5KSwgKDB4RjFFNDNEMzgpLAorICAgICgweDgwQjIxQkFBKSwgKDB4RjJBQzI0QUYpLCAoMHg4MDlEQzk2OCksICgweEYzNzQyRDA4KSwgKDB4ODA4QUIxNzUpLAorICAgICgweEY0M0M1NDU2KSwgKDB4ODA3OEQzRkYpLCAoMHhGNTA0OThBQiksICgweDgwNjgzMTM0KSwgKDB4RjVDQ0Y4MTkpLAorICAgICgweDgwNThDOTNCKSwgKDB4RjY5NTcwQjIpLCAoMHg4MDRBOUM1RSksICgweEY3NURGRTg3KSwgKDB4ODAzREFBNzcpLAorICAgICgweEY4MjZBM0E4KSwgKDB4ODAzMUYzQ0IpLCAoMHhGOEVGNUMyOCksICgweDgwMjc3ODc5KSwgKDB4RjlCODI2MTUpLAorICAgICgweDgwMUUzODk5KSwgKDB4RkE4MEZGODIpLCAoMHg4MDE2MzQ0MyksICgweEZCNDlFNjdGKSwgKDB4ODAwRjZCOEEpLAorICAgICgweEZDMTJEOTFCKSwgKDB4ODAwOURFN0UpLCAoMHhGQ0RCRDU2OCksICgweDgwMDU4RDJGKSwgKDB4RkRBNEQ5NzUpLAorICAgICgweDgwMDI3N0E2KSwgKDB4RkU2REUzNTIpLCAoMHg4MDAwOURFQSksICgweEZGMzZGMTBGKSwgKDB4NjU2REJDQzgpLAorICAgICgweDdBOTEwOENBKSwgKDB4QkEzNjcwRjApLCAoMHg2OTkxOTVBMiksICgweDE3MkQyRkQwKSwgKDB4QkUzODZENTEpLAorICAgICgweEM0QUVBNTFDKSwgKDB4MkFBNzdEN0QpLCAoMHg4QjUxRDNCNCksICgweENGNDkwRkQ5KSwgKDB4NEE3QkVCQ0EpLAorICAgICgweDkxMDcyRTA0KSwgKDB4QTE3NTg3MkQpLCAoMHg1NDQ2NEE5RSksICgweDY3QTZDRDAyKSwgKDB4OUU4MjA0QTgpLAorICAgICgweDEwQzE0QkY2KSwgKDB4NzVBQ0RBMTYpLCAoMHhGNzhEN0IzRSksICgweDZBQjNDRjY5KSwgKDB4QTREOEM3NTYpLAorICAgICgweENCOEZDRDI0KSwgKDB4NzVDQzU3MTMpLCAoMHhDMTNFNUFFMyksICgweEE4QzMxNzZEKSwgKDB4NUVFNkQ0MTYpLAorICAgICgweDgwQzVEQTBFKSwgKDB4RDg0QTAwN0MpLCAoMHg3MTlFNzNDMCksICgweDc2NTAxNEIwKSwgKDB4MEEzOTFCQzgpLAorICAgICgweDYwQTcwMjIzKSwgKDB4NTRDREE0NkIpLCAoMHg0NjA2RDQ1NSksICgweEE2MDZGQjJBKSwgKDB4RTRDRTE1NTcpLAorICAgICgweDczMjQwODIwKSwgKDB4ODAzN0E4QjQpLCAoMHhBMUQ4ODAzMiksICgweDc1QTNGMUM3KSwgKDB4MzJCQjAzNzApLAorICAgICgweDVGODUwMjQyKSwgKDB4ODVFQzhGNUIpLCAoMHg4QUEyQjMzQyksICgweDkxQjM3MEMyKSwgKDB4OTM4RTlEREIpLAorICAgICgweEU2QjY5ODNFKSwgKDB4NDk2MDJBQTkpLCAoMHg2QzJEOTk2NSksICgweDVCMTZBRTcyKSwgKDB4Njk1NzlCNkIpLAorICAgICgweENEM0FCNDE1KSwgKDB4NUI3Q0YwM0MpLCAoMHhEN0IyNzYzNyksICgweDJENjlCNzlBKSwgKDB4MzIzN0I0NjgpLAorICAgICgweDVGOTRENjUwKSwgKDB4QUIzNzEwNkQpLCAoMHgwQjgzMTQ1NyksICgweEFGRDgwMzM0KSwgKDB4QjVBMEIyN0IpLAorICAgICgweDE2Qjc2M0U5KSwgKDB4M0I0NTQ3NTYpLCAoMHgzMTY3Q0Q5OCksICgweDcwNzIzOUFGKSwgKDB4MEE0RjEzMkEpLAorICAgICgweDI3ODJDOENBKSwgKDB4MUFDMURENEUpLCAoMHgxMjFDQURGRSksICgweDlBOTExRDkwKSwgKDB4MDE1N0FERDYpLAorICAgICgweDE1NTlCQjk1KSwgKDB4Mjg1NEM4NEEpLCAoMHhEOTdFMzY4NSksICgweDc2MzA4QUEwKSwgKDB4ODA1MEYxRkYpLAorICAgICgweDIxODA2MTJGKSwgKDB4RkZGQjhBMUEpLCAoMHgwQkMxRkZGRiksICgweDEwMzI4NDZDKSwgKDB4MDAyQTMwQzIpLAorICAgICgweDY1NEM1OEYyKSwgKDB4QTU4QUJBQ0MpLCAoMHhDM0U5ODMxQyksICgweDI3NTMxQjhDKSwgKDB4QURCQjg2OTgpLAorICAgICgweDA2ODAxQzEyKSwgKDB4QUZBRUVDOEUpLCAoMHhDMzI2OTI5MSksICgweDVDMkUwMUEwKSwgKDB4NEE2MTA4N0MpLAorICAgICgweDYwRjIxRTdCKSwgKDB4NkI5MkM2NzApLCAoMHhDOTg3MjM2NCksICgweDQ4NDY0Qzk3KSwgKDB4MzQyRTY0OTkpLAorICAgICgweEE2ODQ5QTQ4KSwgKDB4RjAzNDAwMkQpLCAoMHg0NDJCNDQ4OCksICgweDE2MEIwNDQyKSwgKDB4RUQ1MkNGNTApLAorICAgICgweDRENDM2QzA1KSwgKDB4Njg0MUM2MDIpLCAoMHhBMTRGOEE4MiksICgweDlBQzIwRERFKSwgKDB4NUI5MjUxRUUpLAorICAgICgweDhFRDk5OEQ1KSwgKDB4OTJCNkVBMjIpLCAoMHg1QjEzNkM0QiksICgweDk3QzBBNDVCKSwgKDB4NDU5Qzk0QTQpLAorICAgICgweENEOTU4M0MwKSwgKDB4NkM1ODlERjgpLCAoMHgzQzlBMTdDRCksICgweDkwNjYwMUJGKSwgKDB4ODRENjEyRTEpLAorICAgICgweDY3MTc2RjVGKSwgKDB4RTQ3RDVBNDQpLCAoMHgzNzM4NkQ1RSksICgweDkyQTRENjFCKSwgKDB4MjhDNTEzRkIpLAorICAgICgweDZFOTE1OTlBKSwgKDB4NjUzREExNkQpLCAoMHhBMTlDMzlDMCksICgweDQyNzY5MEFEKSwgKDB4NzAwNTQ2MUMpLAorICAgICgweEFCNkMxRUU0KSwgKDB4ODBCQUNDMkQpLCAoMHg3ODBBMThDNSksICgweDgyMkRDNzc0KSwgKDB4QjYwNDMwMzYpLAorICAgICgweDAwNzg5QzE4KSwgKDB4MTA2Qzk1MDcpLCAoMHg0MTAzQTg2NCksICgweEM1MTE1ODVCKSwgKDB4RjNFOUI3RjgpLAorICAgICgweDI0RDc5QzREKSwgKDB4MzFCMjBFQjUpLCAoMHhCMUMwNDgzRSksICgweEUyNUM1NkI5KSwgKDB4OTY5OTEwOTYpLAorICAgICgweDdDRDQxMjFGKSwgKDB4OEEzQjgzRjQpLCAoMHg3MDQyNzFDMiksICgweEI1QzI2QUNDKSwgKDB4MkIxMzFBRjApLAorICAgICgweDU0OUNCMTZDKSwgKDB4NzQ2NDlFNjkpLCAoMHhEOEQ0OEFERSksICgweDEyNTNBRUREKSwgKDB4ODA0MTBGRDIpLAorICAgICgweDVCMzY4ODlEKSwgKDB4ODgwQ0UxRTcpLCAoMHg1NkM0OThFNyksICgweEZBMkJBQUIyKSwgKDB4RDQxNTRGNUMpLAorICAgICgweDc5NTE2RUVEKSwgKDB4QTQyRkRBN0QpLCAoMHgyNzhEMjg3MyksICgweDE5MTIxNTM1KSwgKDB4OUM2RUM2QzcpLAorICAgICgweDQwMjM0MENCKSwgKDB4NUE2QTMyQjMpLCAoMHhFNDM0NUYyNyksICgweDhEQzJEOTAxKSwgKDB4MDJFN0Y4OEUpLAorICAgICgweDdCM0M2QkVCKSwgKDB4RTA5NDZBNEYpLCAoMHg5NDUyODg2QyksICgweEZGMkY2MTg3KSwgKDB4MkY4MDUwRjEpLAorICAgICgweDJBMjE3QzYxKSwgKDB4MEFCMjE1OTQpLCAoMHg4MDExNDVDNCksICgweDFDRjIwMEE1KSwgKDB4ODJDNTQ0RjEpLAorICAgICgweENGM0M1MEIwKSwgKDB4RDU3N0ZFRjcpLCAoMHg2MEFEM0M2RSksICgweDkxQUZGNzlFKSwgKDB4MDcwNzIzQjMpLAorICAgICgweDU4NzBFQ0Y2KSwgKDB4NjRDMjI0RTIpLCAoMHgyNEZCMUVDOCksICgweEMzNDgxMDQ4KSwgKDB4MTUxQUJGM0MpLAorICAgICgweDEzNkFDMjE5KSwgKDB4NDcxNkNFRDEpLCAoMHhDOEI4Q0U0RSksICgweDFEMTY4MjEwKSwgKDB4OTIzMzRBODEpLAorICAgICgweDkwREM5MTBDKSwgKDB4NDlBMDAyMjApLCAoMHhFNUYyQzgzMSksICgweEI2N0RDNzg1KSwgKDB4M0M0OTUxNzQpLAorICAgICgweDBEMUY0QzJBKSwgKDB4M0FENzg3RkQpLCAoMHhFOUM5RkIyNyksICgweDdERkMyNzEzKSwgKDB4RUIzOUM0QjMpLAorICAgICgweDk2Rjc1RjE4KSwgKDB4ODgzQ0NDNDcpLCAoMHg5MTM5MEJEMSksICgweDBFRTI1RjZEKSwgKDB4NkI2ODhFRjApLAorICAgICgweDJDODU1N0RDKSwgKDB4RTgwQzkxNzIpLCAoMHhERTYzREUwNiksICgweDNFMUI3MDdCKSwgKDB4QjJDRjJFNzYpLAorICAgICgweDQ5MEQxREYzKSwgKDB4Q0QxQjUxRTEpLCAoMHhDMjI4RjBGOSksICgweEVFRTJBMDBBKSwgKDB4MDgxRDgzNEEpLAorICAgICgweDFEMkMxNDAzKSwgKDB4MDgzRkU5NDApLCAoMHg3NjE0RURBMCksICgweDgyODIwOTVBKSwgKDB4QTdDMDg4MjEpLAorICAgICgweDRDRDQ3RDIwKSwgKDB4MzIyOTkxOTEpLCAoMHg1MkEwMzBFNiksICgweERGN0NCNzZFKSwgKDB4MjMyRUQ0NEIpLAorICAgICgweDhEQUExNTBBKSwgKDB4MUI1OTNDNTEpLCAoMHg0NDlDQkE4MiksICgweEFCRTZEM0M0KSwgKDB4Q0NGNkY1QzMpLAorICAgICgweDkwNjRDMUMyKSwgKDB4MDMxRkY1OUMpLCAoMHg0MTU5RkU0RSksICgweDQyMTQ4MkMwKSwgKDB4MjBGNkYwMEEpLAorICAgICgweEI4NjZDQTQ5KSwgKDB4NzVBNjZGQUEpLCAoMHg1NDUzNTE1RiksICgweEI1NDVENDg2KSwgKDB4ODg1RDk0OTMpLAorICAgICgweEVFQzRFRUI0KSwgKDB4ODhGOUM4OTMpLCAoMHhCQkFBMzhCNCksICgweDVBNTdCQTgzKSwgKDB4MTJFODQ4Q0MpLAorICAgICgweDJGQjYyMTYwKSwgKDB4ODQwQTFBNTQpLCAoMHgyQTdBRURENiksICgweDg5QUYyREJEKSwgKDB4QzhCQUFFMkUpLAorICAgICgweDU2RUVCRDc1KSwgKDB4RTU5NUI4NkQpLCAoMHhFRUIxMjNDNiksICgweDNGOTRFQkMxKSwgKDB4NzhDRkJFRTIpLAorICAgICgweENGOTAxRjExKSwgKDB4NUEzNUEzNTApLCAoMHhEQTIyQ0I1OCksICgweEJFNEI4Mjg3KSwgKDB4MjVFMDc4QzApLAorICAgICgweDJCRDRGMEQzKSwgKDB4NkE0NjRCOTkpLCAoMHg0ODg0QjE1NiksICgweEYxRkY3NjMwKSwgKDB4QzEzMjgwNTApLAorICAgICgweEQ4NEMyMTZDKSwgKDB4ODRBNEQ5NDIpLCAoMHgyMTU3QTBBMCksICgweEYzMEExNDEyKSwgKDB4NTRBRjYwMTEpLAorICAgICgweDAwRDcwNTQyKSwgKDB4QkRBQkU3REIpLCAoMHgxRkYzNTM0QyksICgweEQ4NjcyQjRFKSwgKDB4N0JFM0JCM0EpLAorICAgICgweEM1NTk1NTQwKSwgKDB4MTYxRTFCRkYpLCAoMHhENDM3MjMwOSksICgweDdCQzJFRDUyKSwgKDB4QzFDNjM2RUQpLAorICAgICgweDRERDMyQUE0KSwgKDB4ODYxNjMyNDYpLCAoMHg2MTRFRjY4OCksICgweDRFQjQ0MjcwKSwgKDB4ODhFRDA3N0MpLAorICAgICgweDJGMjI5NDY2KSwgKDB4MUE1ODUyMDEpLCAoMHg2NUJCMkVFMiksICgweERCQURBMEREKSwgKDB4RTUwOTk1Q0IpLAorICAgICgweENBMUUyNzYwKSwgKDB4NTgzRkQ4MUYpLCAoMHhFNDhENDg1OSksICgweEMyMDA2MTUyKSwgKDB4OEYxRjc3MEMpLAorICAgICgweDI3Q0FBODZGKSwgKDB4OTYxMEI4NDUpLCAoMHhGQzI1QkNFMyksICgweDM3QjhCMzlGKSwgKDB4MTBEQ0NERDEpLAorICAgICgweEQ1N0E0Q0FCKSwgKDB4N0Q1NDNERTgpLCAoMHg2RjQ1Qjk1OCksICgweDEyRjBCOTc5KSwgKDB4ODE4RTc5RjkpLAorICAgICgweEI0QjJCMDFGKSwgKDB4RjMwMzU5MDEpLCAoMHgzNzJGN0JEOSksICgweDVENTkyRTY3KSwgKDB4REI1QTU1MkYpLAorICAgICgweDZFNjFFNjI1KSwgKDB4NEU4QTZBNDIpLCAoMHgyNDU4QURCOCksICgweDVGMTI1MjhDKSwgKDB4MjcyQjNBREUpLAorICAgICgweERFNjY2QTgzKSwgKDB4N0YxOENGRDcpLCAoMHgyRjg3N0REOCksICgweEQ3M0ZGRkI2KSwgKDB4Nzk4Njc5NTYpLAorICAgICgweDRFMDVGQ0FEKSwgKDB4MTlFNzhFRUUpLCAoMHhFMUJBNjUxMiksICgweDk5RjZGMDkxKSwgKDB4OTE2OTA1MTYpLAorICAgICgweDE2QUU0MDQxKSwgKDB4MDRCOTY4MDUpLCAoMHg3Q0EwNTJGQyksICgweEE0RDA1RUZEKSwgKDB4NDEzRDFGMDQpLAorICAgICgweDUzRTkxQ0MwKSwgKDB4NkY4N0EwODIpLCAoMHg2MDRGRDIwMiksICgweDBCMzY4RDlGKSwgKDB4RDVGMjJFNUMpLAorICAgICgweDJCRTVBNzRFKSwgKDB4MkY2OUVBREUpLCAoMHg4QkU1MzdFMSksICgweDk2OTc1Nzg5KSwgKDB4MzY3NUEzQTApLAorICAgICgweDBBMjcyQjcxKSwgKDB4NzU0QjFENjEpLCAoMHg5ODYwMDU4MSksICgweDY1OUEyQkUzKSwgKDB4QjIxQkVGNTQpLAorICAgICgweEYyNjM1MUIwKSwgKDB4MUM1OTk1NzMpLCAoMHg2QjQyM0I1OSksICgweEVBMzcxQzk2KSwgKDB4QzlCREE0OTkpLAorICAgICgweERERjI1RjM3KSwgKDB4RkJDQUM0QUQpLCAoMHg0MENBNzg4QiksICgweDEzQkMzOTgxKSwgKDB4NDE3NkRBNTgpLAorICAgICgweEQ4NDhEQTc0KSwgKDB4OTQ3NDA2NDIpLCAoMHg1NEZENTQ3OSksICgweDcxNTAyMzYyKSwgKDB4MjVFODFDRjkpLAorICAgICgweDUzMjQ5NTYyKSwgKDB4NTI4MTQ4MjcpLCAoMHg1NURDNUYyQyksICgweDg4MjVCQzUwKSwgKDB4OEU0RDA0RDkpLAorICAgICgweDgwNTBGMUZGKSwgKDB4MjEyQ0MxM0UpLCAoMHgwMEMwRDg0QyksICgweDA3NzExMDAzKSwgKDB4NDA2QTVGNDUpLAorICAgICgweEVEMEE5OERFKSwgKDB4OEE2MTk3MzEpLCAoMHg3OTZBM0IwNCksICgweDdFQUVDRjcxKSwgKDB4N0RGM0RBQkUpLAorICAgICgweDJCMEZGQjRBKSwgKDB4QkE4QTNGQjgpLCAoMHg2MjAyRjhGMiksICgweDYzMkMzN0IyKSwgKDB4MjA1MjcxQUEpLAorICAgICgweEJBMUM0MzhDKSwgKDB4QUExQzExODIpLCAoMHhFNjQ0MkE2NSksICgweEQ3MzZFMDQzKSwgKDB4OTU3MTVDNUMpLAorICAgICgweDNENjA0QzI4KSwgKDB4RDIxRDBENzQpLCAoMHhBMUZCMEMyMSksICgweENFOEYwNjVEKSwgKDB4QjhCMzY0NjMpLAorICAgICgweDdGNzg4QzMzKSwgKDB4ODRBQjUzQTUpLCAoMHg0QjMzQUY0NiksICgweDQwQzI3MzZBKSwgKDB4MEQ2NTcxQjcpLAorICAgICgweEZDOEQ4MjkyKSwgKDB4OUQxQzUxODIpLCAoMHhGN0I2NzBFMiksICgweEJCMkI5RTkxKSwgKDB4MTM3ODUxRDUpLAorICAgICgweEJDRjg3Q0E4KSwgKDB4RTA4MkE3QTYpLCAoMHg1MDI0MDRFNSksICgweDUwMjVBNkUwKSwgKDB4MjU0OTRFQTYpLAorICAgICgweDVBNkE4QTE0KSwgKDB4RTMwMUE2ODkpLCAoMHg3MENCRUU2QiksICgweEM4MDY0NEMxKSwgKDB4RTk5MTRDRTYpLAorICAgICgweDk0ODFGMUU2KSwgKDB4QjlFNERBMzQpLCAoMHg1ODRCMUVEOCksICgweEFDQzM5NjQ4KSwgKDB4MzFFRkNENjIpLAorICAgICgweDA3QzgyQUU5KSwgKDB4RUU5RDkwRTUpLCAoMHg1OUJBRUM3NSksICgweDQwMTc4QjBFKSwgKDB4OUZEQzFDOUMpLAorICAgICgweEYzQTY0ODhGKSwgKDB4NEI2QzEzNjcpLCAoMHg5RjdERjEwOSksICgweENCREY4RURGKSwgKDB4QkE3NkVEMzMpLAorICAgICgweEYxNURCQjlGKSwgKDB4RDQ4QTE5N0YpLCAoMHhGMTFFNzVFRSksICgweEE3NkI0NzlCKSwgKDB4NzA2REU3OEIpLAorICAgICgweDY1NTlBQzY1KSwgKDB4QzAxM0MxODIpLCAoMHg0NjFFOTNDNyksICgweEE5ODlFQUYxKSwgKDB4NTk0NDhDMDApLAorICAgICgweDcyMUZBQzM4KSwgKDB4NTQ2REVBNzkpLCAoMHgyMjNGNjdDMCksICgweDU0MzQ2NDdDKSwgKDB4QjNFRjRGMEEpLAorICAgICgweEQ0RkFGMUYxKSwgKDB4MEJENEUzOEEpLCAoMHhGRjYxNTI3RSksICgweEQ2RUE1REQyKSwgKDB4NjQ0QzcxMDUpLAorICAgICgweDMxQUUyMTg5KSwgKDB4MTFFQzBBMUEpLCAoMHgxOEIzQUQ4MCksICgweDQ3RDBFODBBKSwgKDB4NzczRDhCQjIpLAorICAgICgweEVGQTY3NDdFKSwgKDB4RjIzREU4QjApLCAoMHgwMjZCQjFFNyksICgweDAzQzE0MDYwKSwgKDB4QzE5OTdERjcpLAorICAgICgweDk1OTg2QjlDKSwgKDB4OEE1RDYxNzApLCAoMHg1NERCM0E1NiksICgweDIyOTYxRDQxKSwgKDB4NDY4MTM0NzEpLAorICAgICgweEFCRUQxNkE0KSwgKDB4RDFGODNFOEMpLCAoMHgyNTk0QUNBQyksICgweDFENTU2MEVBKSwgKDB4MDQzMkVGRjQpLAorICAgICgweEEzODlEN0U4KSwgKDB4QUZFOTJDNjIpLCAoMHhGQkJBRjFFNyksICgweDQyRDBEMEExKSwgKDB4QTJDM0VDQjIpLAorICAgICgweDYwM0RENjM1KSwgKDB4RUJCQzU5MTUpLCAoMHg1QjBDN0NFMCksICgweDhEMDM2NDBDKSwgKDB4MjJFMjk4REIpLAorICAgICgweDM4Q0UzQkRDKSwgKDB4MjFFNkI2QjQpLCAoMHhDOTc0MkMzRiksICgweDRCREY3NDQ4KSwgKDB4QkFEMDlEMDApLAorICAgICgweEVENkE4Mzk3KSwgKDB4RjZGODAwMUEpLCAoMHgzMUUzNTkxRSksICgweEFFQzM3RUZFKSwgKDB4MjJEOUFEMDYpLAorICAgICgweDVFMjU0QUVDKSwgKDB4RDg1MkQzMkUpLCAoMHhFMUM5NjhBRSksICgweEEzQzNDMjY1KSwgKDB4RDY3QkQ3OEEpLAorICAgICgweEYxRkY5RDhDKSwgKDB4QzAzQTgwNTApLCAoMHg4NDdBMjFGQyksICgweDgxMEVEQTVEKSwgKDB4NjM4MDg5NTEpLAorICAgICgweEM4RkU5RTlFKSwgKDB4RkI2REQzRTUpLCAoMHg3N0JEN0EwMyksICgweDZEQzE0Njc3KSwgKDB4RkY4MUQ4MzEpLAorICAgICgweDQzMjAxMTAwKSwgKDB4QTc4RTE2RkUpLCAoMHgzOTNDRDBBMCksICgweDUxNEY2REREKSwgKDB4NDI3QkE0QkMpLAorICAgICgweEVCRTdBNjc2KSwgKDB4Qjc3MTYzOUIpLCAoMHg4REFCQjlFNyksICgweDgxMkZBNUFEKSwgKDB4M0YxMDIxMjApLAorICAgICgweDYwRTQyNDU0KSwgKDB4RUZGQkZGQzUpLCAoMHhCRUIxRDVERCksICgweDdBNTlEREZEKSwgKDB4RTg5NjhEN0EpLAorICAgICgweDhBQUQzNDYyKSwgKDB4QUI2NTMyN0QpLCAoMHgwQ0YyRUNGQiksICgweEZBMzI0OUE0KSwgKDB4OTdGQzNBNDIpLAorICAgICgweDMxNEE3MDg5KSwgKDB4Mjk5MUU2REMpLCAoMHhBOTg2OTNDNCksICgweDY1RUIyMDExKSwgKDB4Q0I0RDg1OTQpLAorICAgICgweDFBQUZGMTRFKSwgKDB4MUQwRDA0OTIpLCAoMHgyRTVBNzg0RCksICgweEFFNEVDNzM4KSwgKDB4RjE2RDY2N0EpLAorICAgICgweEIwQzI2MDMwKSwgKDB4QURBM0RGQzkpLCAoMHg0RUQ4NzRFNSksICgweEQ0NDFBNkFFKSwgKDB4MTlFM0FDMDUpLAorICAgICgweEM2Qjg2NURDKSwgKDB4RThFNDI4NUEpLCAoMHg5OTI0OEMyQiksICgweEMyOTgxMTIyKSwgKDB4MUIwMTQyODgpLAorICAgICgweDQ0MkEwNTgwKSwgKDB4ODRBMEExQzEpLCAoMHgyMTZGMDI0OCksICgweDIwMkU1NjAyKSwgKDB4RUFFQkFBQ0EpLAorICAgICgweERENUFCRUU3KSwgKDB4OEI5QzRCNDMpLCAoMHg1RDVENDZENyksICgweDhGQkU3QzFEKSwgKDB4NkY5Q0FCODcpLAorICAgICgweEIwQUIwQUFFKSwgKDB4OThCQzc5MzYpLCAoMHhGMjUxQjkxMSksICgweDQ0NjlGMkQxKSwgKDB4QTkwOTkwODgpLAorICAgICgweEQyMTlCRDY2KSwgKDB4NzQ5MEFFMjIpLCAoMHhCQzBBOTgyMCksICgweDExOUQwMTM2KSwgKDB4ODU5MjY2MUMpLAorICAgICgweDI2MEMwRDE4KSwgKDB4QjlBMUM1QjEpLCAoMHhBNjg1OTFFNCksICgweEZDQkQ0RjI5KSwgKDB4NTk2NUEzQzcpLAorICAgICgweDdEMUVENjY0KSwgKDB4OUJEREVFRTMpLCAoMHg5MjIzN0Q1QSksICgweEI3MzMyREE2KSwgKDB4RUE1NjMyRTUpLAorICAgICgweDlCRkUxNjI0KSwgKDB4NkEyQkIxOEEpLCAoMHg4QzBERDcyQyksICgweDRGMzE5RjU2KSwgKDB4RUU4QjVCMDMpLAorICAgICgweDYwOTY3QkM4KSwgKDB4QjQ5MThGNzUpLCAoMHhGMjk1RDVGNiksICgweDY1MkFEODBEKSwgKDB4MENDRTk1NTIpLAorICAgICgweDBCQ0FBMEE2KSwgKDB4M0NGMkQyOEUpLCAoMHgxODUzOTU2RSksICgweDdCMzhERUFBKSwgKDB4RUFBQjk3MEIpLAorICAgICgweDY0MDg2RDFGKSwgKDB4M0U3NjQ1REQpLCAoMHg5ODZGMTM0MiksICgweEJCQjBFMTg4KSwgKDB4N0Q2RDU2NDIpLAorICAgICgweDY4MjE4MjdEKSwgKDB4RkNCQzQ3MjkpLCAoMHgzRDExNEZCOSksICgweDJEMjU0MkU1KSwgKDB4NjU0Q0MxRjApLAorICAgICgweDA0RjFCNzVFKSwgKDB4MjkwQjU0QUYpLCAoMHg3RDc5QUIxQSksICgweEYzNEUzMUEyKSwgKDB4NzNBOUYzMDApLAorICAgICgweDdBQkNBODlFKSwgKDB4QjU2REE5NzQpLCAoMHhDQUNEQjA3QyksICgweDRFRTFBREQ0KSwgKDB4RUY4NTlCMzQpLAorICAgICgweDg5RjQ3QjQ3KSwgKDB4NTE1QzE1NUEpLCAoMHgzOEQwNjc1NyksICgweDgwNTBGMUZGKSwgKDB4MjFDOEUwM0EpLAorICAgICgweEIxNTU4NDFBKSwgKDB4MzA3MTY2ODUpLCAoMHgwQTJCNDhBQyksICgweDcwNDFDNDBBKSwgKDB4MTA0QzQ0RDApLAorICAgICgweDFGNTFCNjE4KSwgKDB4RjBENEYzOUIpLCAoMHhGQ0FFQkE1MiksICgweDMwRUE2MkNEKSwgKDB4QTI5NEI3NzIpLAorICAgICgweDIyMUUwNDE3KSwgKDB4QUE4RUYxOTIpLCAoMHgzRTU2OEM3OCksICgweEQzODZFRjlBKSwgKDB4MTNCNTRGQjEpLAorICAgICgweDg0ODE4RUMzKSwgKDB4Qjg3NjY5RjgpLCAoMHhDRDkwNTY1QSksICgweDczRDdDODc2KSwgKDB4RDYxOTE1MTIpLAorICAgICgweEFDMjI4NzA0KSwgKDB4QTc3ODVENDgpLCAoMHgxN0NGMzRERCksICgweDhBRjVBQjQwKSwgKDB4MzY1QzZBRkEpLAorICAgICgweDE3REZENTlFKSwgKDB4QjkyNEMyNkUpLCAoMHhFOURFNTg0NCksICgweDNEQ0REQ0Q5KSwgKDB4Q0RBMkRGQjQpLAorICAgICgweDhBNUI1MzRFKSwgKDB4QTJEOURBQ0EpLCAoMHgxMTY3OTU2OSksICgweEFFRjZFN0U5KSwgKDB4QzlEMjQxN0MpLAorICAgICgweDUxNURDOUMzKSwgKDB4MTU3QTVCMTIpLCAoMHg0Qzk2MERENiksICgweEQ0MTNDQzAxKSwgKDB4NjUzMTk1NDUpLAorICAgICgweDZDRjEzMDlEKSwgKDB4MDAwMzM4QzcpLCAoMHg0NjBBQTdGQyksICgweEMxRkE0NDQwKSwgKDB4MEUzQUUwNDgpLAorICAgICgweEY0QjIxMkI1KSwgKDB4Qzc4OTVEMkIpLCAoMHg2NzZBRkFGMyksICgweEVGNDA0Rjc1KSwgKDB4QkZDREIxN0MpLAorICAgICgweEEzN0ZFNkM2KSwgKDB4MjAxMjNERDUpLCAoMHhFRTk2QkQzQiksICgweDNFQjhBNjJFKSwgKDB4MDY4ODQ1RTEpLAorICAgICgweEM0OTYwMjE2KSwgKDB4N0JCMTFEOEQpLCAoMHgyRDY1NzQ2NyksICgweEZDNkZBQ0M1KSwgKDB4QzIxQUFEMzEpLAorICAgICgweDY0Mjc0NUY0KSwgKDB4NDUwN0UxMzkpLCAoMHhGNzM2OURDOSksICgweDYxOThBREVCKSwgKDB4NjNCOThCMTApLAorICAgICgweERFRTU4NUFCKSwgKDB4QTM4RUZGQUMpLCAoMHgzMEFFMUU0MSksICgweDgyMDY2N0E5KSwgKDB4NkI3N0EwMDcpLAorICAgICgweDI0MDA0MEE3KSwgKDB4Qjc3QTdEOTUpLCAoMHgyMDg4OTNDQSksICgweDA4NUI0NjEwKSwgKDB4MTQyMzQ4NTQpLAorICAgICgweEFDMDIyNzg2KSwgKDB4MkQ1NzM0NkYpLCAoMHhCNjRBMUE2NyksICgweDYwNUQ0NUIyKSwgKDB4RTA1MUMwMDEpLAorICAgICgweDkxNzZDMTFEKSwgKDB4MjNCQkU5NDUpLCAoMHgyQzAzRTI2QSksICgweEMyODExQkFEKSwgKDB4MUREODE0RDQpLAorICAgICgweDNDNjc0QjY4KSwgKDB4MjhFQzMzQzcpLCAoMHhEOUVERTVFNCksICgweDVDNDZDMjQ4KSwgKDB4NDA5ODg5OEYpLAorICAgICgweDVCQTk2MjgwKSwgKDB4RUZGNzdCOTEpLCAoMHgzMzMyQ0E1QiksICgweDY2MUNBRjZCKSwgKDB4NkUwRDU2NEUpLAorICAgICgweEI3MEQwODYzKSwgKDB4MjQwMjg1QzApLCAoMHhCQkJEM0VBNyksICgweENBMkU1NjhEKSwgKDB4RDFEM0Y2MTIpLAorICAgICgweEM5MTYxMTVFKSwgKDB4QjdGQzBBNkMpLCAoMHgxOTYxQUU5QSksICgweEI1REYzOTY1KSwgKDB4QzFCOTUwNjUpLAorICAgICgweDg5RTI5NjY1KSwgKDB4M0YyOUZCRUQpLCAoMHgzRjFCRUQ3MyksICgweEMxNTVCRTFEKSwgKDB4NzI1NkFFNEMpLAorICAgICgweDRBNTk3OTdCKSwgKDB4NjAwOUQxM0IpLCAoMHg5MTg1MDM4NSksICgweEU0NTQ1OTIwKSwgKDB4MTVFQ0NEQTEpLAorICAgICgweEZGQzdCQTIwKSwgKDB4MkI4MDUwRjEpLCAoMHgxQTIxRDRDMCksICgweDMwMDhCRTg5KSwgKDB4NkMwRkYzMTcpLAorICAgICgweDc0NDREODUyKSwgKDB4MDU4NDE0MTEpLCAoMHg4NEM4MDAyMiksICgweDA3QzYzMEUwKSwgKDB4N0U2RjhGQTMpLAorICAgICgweEYzQkRGM0M3KSwgKDB4NEM1NURGRjcpLCAoMHhFMEIxQzhEMSksICgweEMzRjVDRjREKSwgKDB4MUMyMkE4MzYpLAorICAgICgweEIyOUQzMzE1KSwgKDB4RDQ5NjY1NDEpLCAoMHg0NUM4NTgwMCksICgweEFEOERCRDQ2KSwgKDB4MkMxOUNGQUEpLAorICAgICgweDU0MEZBNjc0KSwgKDB4QzNDOTEzRDgpLCAoMHhEMjE4Mzc1MyksICgweENCOUZDRjI2KSwgKDB4ODM0NkZDODkpLAorICAgICgweEEzNDA4MDc4KSwgKDB4Q0ZEODRDQzEpLCAoMHhGNTgwRjAzNSksICgweDdGRDA2N0E3KSwgKDB4ODdFN0ZDQjgpLAorICAgICgweDA5QzA5NDA2KSwgKDB4RERCQjMxMzEpLCAoMHhGRjc5RkZFMSksICgweEVBRkJFRUYxKSwgKDB4QjY2MEJDRTgpLAorICAgICgweDk5ODk5QzMxKSwgKDB4OUZFQjIyQzEpLCAoMHhDNzVFRjY4RiksICgweDEzODAwQjk5KSwgKDB4Q0Q3RjMxMDApLAorICAgICgweDA5NTAyQURDKSwgKDB4MTAxRTAwRTgpLCAoMHg0MDZDQjk0NSksICgweDgyMEExQjJCKSwgKDB4NjhBMEIwODIpLAorICAgICgweDBDMUIxODY0KSwgKDB4QjM2OTAzNTQpLCAoMHg2M0M1QjVBMyksICgweDUzNUVCNEM4KSwgKDB4RjdEODY5MTgpLAorICAgICgweEQxQkE1OEZDKSwgKDB4RjQyOTEwRkEpLCAoMHhGQkRCMTkyOSksICgweEM3QzBDMkE0KSwgKDB4RDIwNzQ3NTIpLAorICAgICgweEI5NjgwM0I0KSwgKDB4ODQwNjVFMzgpLCAoMHg4MTlBRjQ4RSksICgweEU5ODY0RkYzKSwgKDB4QTZFNDFEMEUpLAorICAgICgweDUwRTc0NDJCKSwgKDB4Qzc1NzREN0IpLCAoMHgxOTZCNkFCMyksICgweDA0MUQ1ODU0KSwgKDB4NjI5MTYyRDMpLAorICAgICgweDA0MjcxM0UwKSwgKDB4OUFFMzEyOTcpLCAoMHg0QjJGNEUzNiksICgweENCOENFMEUwKSwgKDB4QjJGMDY4MkEpLAorICAgICgweEFCMzNENkY1KSwgKDB4MkY1M0Q4MkUpLCAoMHg2NkE0MzgxNSksICgweDQ0MzNBQUE4KSwgKDB4ODJFQTBFRDUpLAorICAgICgweDQ1Nzg3NkYyKSwgKDB4RDMwQkQzNkMpLCAoMHg4RDQ5RDI4QyksICgweDBFNjgyNjBFKSwgKDB4RDA1NjUxMkMpLAorICAgICgweDdCODZEQjExKSwgKDB4NjQ2MzM2NjEpLCAoMHg4MjY1RkYyNSksICgweDZEMkI3MTQ4KSwgKDB4NTI5REEwRDgpLAorICAgICgweEJDMTgwMDE3KSwgKDB4MTlBQjgwM0IpLCAoMHg4M0YwMDAyMCksICgweDUwRjFGRjA3KSwgKDB4RDRDMDJEODApLAorICAgICgweEZDODgxQTIxKSwgKDB4QzFCRjAxMDApLCAoMHg1ODQxNjgwQiksICgweDEwM0IyQ0MwKSwgKDB4QjA0MkMyOEEpLAorICAgICgweDIzMjRFOEE4KSwgKDB4MzE1MzE0MzApLCAoMHhFRjcxREQwRSksICgweDdDMUI5RDhFKSwgKDB4MDk5OEMyMjgpLAorICAgICgweEQ5RUM2NTQ4KSwgKDB4OEVFRjg0NDgpLCAoMHgwQzU2MUNBRiksICgweDRCQTM5REZEKSwgKDB4NTg5NDdGRTIpLAorICAgICgweDk1OUIxMkEyKSwgKDB4NkQ1MkVBRUMpLCAoMHgxRDk1RERENSksICgweDMxMEMyMjJCKSwgKDB4NjM2MzRCMTgpLAorICAgICgweDRERTZDNUI4KSwgKDB4NTI2QzkxMDYpLCAoMHg0OUI1RThDQyksICgweEMzQzMzMDA0KSwgKDB4NjA1Q0QyODcpLAorICAgICgweDA5QTYzOTBDKSwgKDB4MzUwQzMzQkMpLCAoMHg5NTMwNTBDQyksICgweDk2MDU1MkEzKSwgKDB4NTRGMDExODYpLAorICAgICgweDBFOEQ3Q0ZFKSwgKDB4NDU5QTAwMjIpLCAoMHhDMzU3Njk2NiksICgweEIwRDZGNkU4KSwgKDB4QjhGMTNBQUMpLAorICAgICgweEU0NDAwMzRDKSwgKDB4MzYxMTg4NTEpLCAoMHhGNTFCRTcyNyksICgweDJFMTY4OUEwKSwgKDB4RTgyQ0NGNTUpLAorICAgICgweDZERjRFM0NCKSwgKDB4RUE2NjU2NjMpLCAoMHhDMkU1M0Q2RiksICgweDlEQzFGMDZCKSwgKDB4RkNDMkU4NzgpLAorICAgICgweDQyOTJEMTYyKSwgKDB4NDg0MEM0MzMpLCAoMHhCNjE4REI0MyksICgweDA2MDkyQzE1KSwgKDB4NTAwMTM0QzEpLAorICAgICgweEE2REI4OTU1KSwgKDB4RDVFOEE1QkIpLCAoMHgxNDJCNzgyOSksICgweDc1RjQyOTM5KSwgKDB4MEVCRjREMTApLAorICAgICgweDFBMkIwNzhDKSwgKDB4N0MyQTVBNDYpLCAoMHgzRUExQjlBNyksICgweDMxQUFDODk4KSwgKDB4MTMyN0I4NTIpLAorICAgICgweDI3N0M2NUExKSwgKDB4NTI4MENFMjcpLCAoMHhGRjUxMjIxMyksICgweDM5QjQ3RUJGKSwgKDB4MTU0Q0EwMDApLAorICAgICgweDEwNkU3REEyKSwgKDB4QUZBNEM5MjUpLCAoMHhDNDhDRTM3OSksICgweEFCMkU0NTczKSwgKDB4NUU0NEI4RkQpLAorICAgICgweEVDRDJBNDI0KSwgKDB4OEM1MzAwQUEpLCAoMHhFNDI1QTE4MCksICgweDZENUQwRDNCKSwgKDB4QTcwNTQwQTgpLAorICAgICgweEY4RUNGNDMyKSwgKDB4ODg0Njk2QjApLCAoMHhCNzk3NTVCRiksICgweDYyQ0FENDE5KSwgKDB4NEJCQjM4QjYpLAorICAgICgweENENUM3OUQ3KSwgKDB4ODJENEUyOUIpLCAoMHg2REQ0OEU5MSksICgweEExMjhBM0E5KSwgKDB4RjJFRDY3MjYpLAorICAgICgweDMzOUE2M0Y2KSwgKDB4MzVENkY0RUEpLCAoMHg4REM4QjQ5MSksICgweENBMDREMDlDKSwgKDB4RkYwNzRGRDApLAorICAgICgweDJEODA1MEYxKSwgKDB4MUEyMUQ4ODApLCAoMHgxOTAwRkU4OCksICgweDZDMDlEMUJGKSwgKDB4NTY0ODMwMDEpLAorICAgICgweEMyMEExQTI5KSwgKDB4NDQ5MTgwQTMpLCAoMHgwMjhDNTE2MCksICgweDc1RkFFQ0REKSwgKDB4NjI1MDcwNUIpLAorICAgICgweDg5RUEwMTBBKSwgKDB4N0I5Rjk4NTEpLCAoMHg5RDZDNTk5NCksICgweDg2MDJDM0U0KSwgKDB4MDNEMEU4NjMpLAorICAgICgweDA0MzIyMjUxKSwgKDB4MTE2MDk1QjcpLCAoMHg3ODkyNzZDQSksICgweDAwMDAwMDAwKSwgKDB4MDAwMDA5NzgpLAorICAgICgweDgwMDBDNjg4KSwgKDB4ODAwMEJDRDgpLCAoMHg4MDAxMDAwMCksICgweDlGQzNGN0I4KSwgKDB4REU0N0JDMUIpLAorICAgICgweEU2MEZCNEY4KSwgKDB4RUEyNzQ2OUQpLCAoMHhDQ0ExRTY2RCksICgweDhGRkY3MDEwKSwgKDB4ODAwMEJDRDgpLAorICAgICgweDAwMDAwMEQwKSwgKDB4ODAwMEI0QjApLCAoMHg4RkZGRkIyNCksICgweDlGQzNGN0I4KSwgKDB4MDAwMDAwMDApLAorICAgICgweDgwMDBCNDE4KSwgKDB4OEZGRjcwMTApLCAoMHg4MDAwQzY4OCksICgweDAwMDAwMEQwKSwgKDB4OUZDM0ZEM0MpLAorICAgICgweEQ2MjVGOEMwKSwgKDB4NDc4RDgzMkEpLCAoMHhGNjkzRDkyMiksICgweDM2MTdEODE2KSwgKDB4ODAwMDA2NDgpLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDMpLCAoMHgwMDAwMDAxMiksICgweDlGQzQ5OTY0KSwgKDB4NDYxNDE5MjQpLAorICAgICgweDREODM0MjA1KSwgKDB4MTZCNzk5QTYpLCAoMHhBMzk0OTRBNiksICgweENDRjIzQzYwKSwgKDB4MDAwMDAwMDEpLAorICAgICgweDlGQzQ3NDY4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMDA3MiksICgweDAwMDA4MDAxKSwgKDB4OEZGRkZCNTgpLAorICAgICgweDAwMDAwMDAzKSwgKDB4NDAyQzc0MTMpLCAoMHgwMDAwMDAxNiksICgweDQwMkM3NDEzKSwgKDB4OUZDNDg0OTgpLAorICAgICgweDAwMDAwMDAwKSwgKDB4MDAwMDAwMDIpLCAoMHgwMDAwMDAwMSksICgweDAwMDAwMDcyKSwgKDB4OUZDNDc4M0MpLAorICAgICgweDgwMDBDNjkwKSwgKDB4MDM1OENERDUpLCAoMHgwMDAwMDAwMCksICgweDAwMDA4MDAxKSwgKDB4MDAwMDAwNzIpLAorICAgICgweDgwMDAwNjQ4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwODAwMSksICgweDgwMDBCRDQwKSwgKDB4MUExOUY4RDgpLAorICAgICgweDAwMDA4MDAxKSwgKDB4ODAwMDAzQzApLCAoMHgwMDAwMDAwMyksICgweDlGQzQyOENDKSwgKDB4RjYxOTIwMTUpLAorICAgICgweEZCQjc3RjkyKSwgKDB4OEYyQzhCRkMpLCAoMHgzQzM5MTkyMyksICgweDQwMTQ0MjhDKSwgKDB4MTQwMDQ1QUUpLAorICAgICgweEZGRkQyQkI2KSwgKDB4MkQ4MDUwRjEpLCAoMHg4MDAwQkQ0MCksICgweDAwMDAwMDAzKSwgKDB4MDAwMDAwMDApLAorICAgICgweDJDQzA1ODExKSwgKDB4MDAwMDgwMDEpLCAoMHg4MDAwMDNDMCksICgweDgwMDAwNjQ4KSwgKDB4ODAwMDA2NDgpLAorICAgICgweDlGQzQyMDZDKSwgKDB4OEZGRkZENzgpLCAoMHg4RkZGRkVFQyksICgweDgwMDBDNjY4KSwgKDB4ODAwMDA2NDgpLAorICAgICgweDhGRkZGRDc4KSwgKDB4MDAwMDAwMDApLCAoMHgwMDAwMzA0MCksICgweDgwMDBGRkMwKSwgKDB4ODAwMEJDRDgpLAorICAgICgweDgwMDEwMDAwKSwgKDB4OUZDM0Y3QjgpLCAoMHgwMDAwMDAwMCksICgweDAwMDAyQ0MwKSwgKDB4ODAwMTMzNDApLAorICAgICgweDgwMDBCQ0Q4KSwgKDB4ODAwMTBGRDApLCAoMHg4MDAxMjU0OCl9OwpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9taXBzL3NjYWxlLmNwcCBiL2xpYkZESy9zcmMvbWlwcy9zY2FsZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YTNhMDAuLjAwMDAwMDAKLS0tIGEvbGliRkRLL3NyYy9taXBzL3NjYWxlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIEF1dGhvcihzKToKLSAgIERlc2NyaXB0aW9uOgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiBkZWZpbmVkKF9fbWlwc19kc3ApCi0KLSNpZm5kZWYgRlVOQ1RJT05fZ2V0U2NhbGVmYWN0b3JfREJMCi0jZGVmaW5lIEZVTkNUSU9OX2dldFNjYWxlZmFjdG9yX0RCTAotLyohCi0gKgotICogIFxicmllZiBDYWxjdWxhdGUgbWF4IHBvc3NpYmxlIHNjYWxlIGZhY3RvciBmb3IgaW5wdXQgdmVjdG9yCi0gKgotICogIFxyZXR1cm4gTWF4aW11bSBzY2FsZSBmYWN0b3IKLSAqCi0gKiAgVGhpcyBmdW5jdGlvbiBjYW4gY29uc3RpdHV0ZSBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBjb21wdXRhdGlvbmFsIGNvbXBsZXhpdHkgLSB2ZXJ5IG11Y2ggZGVwZW5kaW5nIG9uIHRoZQotICogIGJpdHJhdGUuIFNpbmNlIGl0IGlzIGEgcmF0aGVyIHNtYWxsIGZ1bmN0aW9uLCBlZmZlY3RpdmUgYXNzZW1ibGVyIG9wdGltaXphdGlvbiBtaWdodCBiZSBwb3NzaWJsZS4KLSAqCi0gKi8KLWlubGluZSBJTlQgZ2V0U2NhbGVmYWN0b3IoY29uc3QgRklYUF9EQkwgKnZlY3RvciwgLyohPCBQb2ludGVyIHRvIGlucHV0IHZlY3RvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbGVuKSAgICAgICAgICAgICAgICAvKiE8IExlbmd0aCBvZiBpbnB1dCB2ZWN0b3IgKi8KLXsKLSAgSU5UIGk7Ci0gIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYX0RCTCgwLjBmKTsKLQotICBmb3IoaT1sZW47aSE9MDtpLS0pewotICAgIG1heFZhbCB8PSBfX2J1aWx0aW5fbWlwc19hYnNxX3NfdygqdmVjdG9yKyspOwotICB9Ci0KLSAgcmV0dXJuIGZpeE1heCgoSU5UKTAsKENudExlYWRpbmdaZXJvcyhtYXhWYWwpIC0gMSkpOwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKl9fbWlwc19kc3AgKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9zcmMvbWlwcy9zY2FsZV9taXBzLmNwcCBiL2xpYkZESy9zcmMvbWlwcy9zY2FsZV9taXBzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTNkMzNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliRkRLL3NyYy9taXBzL3NjYWxlX21pcHMuY3BwCkBAIC0wLDAgKzEsMTMzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKF9fbWlwc19kc3ApCisKKyNpZm5kZWYgRlVOQ1RJT05fZ2V0U2NhbGVmYWN0b3JfREJMCisjZGVmaW5lIEZVTkNUSU9OX2dldFNjYWxlZmFjdG9yX0RCTAorLyohCisgKgorICogIFxicmllZiBDYWxjdWxhdGUgbWF4IHBvc3NpYmxlIHNjYWxlIGZhY3RvciBmb3IgaW5wdXQgdmVjdG9yCisgKgorICogIFxyZXR1cm4gTWF4aW11bSBzY2FsZSBmYWN0b3IKKyAqCisgKiAgVGhpcyBmdW5jdGlvbiBjYW4gY29uc3RpdHV0ZSBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBjb21wdXRhdGlvbmFsCisgKiBjb21wbGV4aXR5IC0gdmVyeSBtdWNoIGRlcGVuZGluZyBvbiB0aGUgYml0cmF0ZS4gU2luY2UgaXQgaXMgYSByYXRoZXIgc21hbGwKKyAqIGZ1bmN0aW9uLCBlZmZlY3RpdmUgYXNzZW1ibGVyIG9wdGltaXphdGlvbiBtaWdodCBiZSBwb3NzaWJsZS4KKyAqCisgKi8KK1NDQUxFX0lOTElORQorSU5UIGdldFNjYWxlZmFjdG9yKGNvbnN0IEZJWFBfREJMICp2ZWN0b3IsIC8qITwgUG9pbnRlciB0byBpbnB1dCB2ZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgICBJTlQgbGVuKSAgICAgICAgICAgICAgICAvKiE8IExlbmd0aCBvZiBpbnB1dCB2ZWN0b3IgKi8KK3sKKyAgSU5UIGk7CisgIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYX0RCTCgwLjBmKTsKKworICBmb3IgKGkgPSBsZW47IGkgIT0gMDsgaS0tKSB7CisgICAgbWF4VmFsIHw9IF9fYnVpbHRpbl9taXBzX2Fic3Ffc193KCp2ZWN0b3IrKyk7CisgIH0KKworICByZXR1cm4gZml4TWF4KChJTlQpMCwgKENudExlYWRpbmdaZXJvcyhtYXhWYWwpIC0gMSkpOworfQorI2VuZGlmCisKKyNlbmRpZiAvKl9fbWlwc19kc3AgKi8KZGlmZiAtLWdpdCBhL2xpYkZESy9zcmMvbmxjX2RlYy5jcHAgYi9saWJGREsvc3JjL25sY19kZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOGNjZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJGREsvc3JjL25sY19kZWMuY3BwCkBAIC0wLDAgKzEsMTA2MyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKiBMaWJyYXJ5IGZvciBiYXNpYyBjYWxjdWxhdGlvbiByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgT21lciBPc21hbgorCisgICBEZXNjcmlwdGlvbjogU0FDL1NBT0MgRGVjIE5vaXNlbGVzcyBDb2RpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm5sY19kZWMuaCIKKyNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCisKKy8qIE1BWF9QQVJBTUVURVJfQkFORFMgZGVmaW5lcyBhcnJheSBsZW5ndGggaW4gaHVmZmRlYyAqLworCisjaWZuZGVmIG1pbgorI2RlZmluZSBtaW4oYSwgYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2VuZGlmCisKK0VSUk9SX3Qgc3ltX3Jlc3RvcmVJUEQoSEFORExFX0ZES19CSVRTVFJFQU0gc3RybSwgaW50IGxhdiwgU0NIQVIgZGF0YVsyXSkgeworICBpbnQgc3VtX3ZhbCA9IGRhdGFbMF0gKyBkYXRhWzFdOworICBpbnQgZGlmZl92YWwgPSBkYXRhWzBdIC0gZGF0YVsxXTsKKworICBpZiAoc3VtX3ZhbCA+IGxhdikgeworICAgIGRhdGFbMF0gPSAtc3VtX3ZhbCArICgyICogbGF2ICsgMSk7CisgICAgZGF0YVsxXSA9IC1kaWZmX3ZhbDsKKyAgfSBlbHNlIHsKKyAgICBkYXRhWzBdID0gc3VtX3ZhbDsKKyAgICBkYXRhWzFdID0gZGlmZl92YWw7CisgIH0KKworICBpZiAoZGF0YVswXSAtIGRhdGFbMV0gIT0gMCkgeworICAgIFVMT05HIHN5bV9iaXQ7CisgICAgc3ltX2JpdCA9IEZES3JlYWRCaXRzKHN0cm0sIDEpOworICAgIGlmIChzeW1fYml0KSB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gZGF0YVswXTsKKyAgICAgIGRhdGFbMF0gPSBkYXRhWzFdOworICAgICAgZGF0YVsxXSA9IHRtcDsKKyAgICB9CisgIH0KKworICByZXR1cm4gSFVGRkRFQ19PSzsKK30KKworc3RhdGljIGludCBpbG9nMih1bnNpZ25lZCBpbnQgaSkgeworICBpbnQgbCA9IDA7CisKKyAgaWYgKGkpIGktLTsKKyAgd2hpbGUgKGkgPiAwKSB7CisgICAgaSA+Pj0gMTsKKyAgICBsKys7CisgIH0KKworICByZXR1cm4gbDsKK30KKworc3RhdGljIEVSUk9SX3QgcGNtX2RlY29kZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBzdHJtLCBTQ0hBUiogb3V0X2RhdGFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIqIG91dF9kYXRhXzIsIGludCBvZmZzZXQsIGludCBudW1fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2xldmVscykgeworICBpbnQgaSA9IDAsIGogPSAwLCBpZHggPSAwOworICBpbnQgbWF4X2dycF9sZW4gPSAwLCBuZXh0X3ZhbCA9IDA7CisgIFVMT05HIHRtcDsKKworICBpbnQgcGNtX2NodW5rX3NpemVbN10gPSB7MH07CisKKyAgc3dpdGNoIChudW1fbGV2ZWxzKSB7CisgICAgY2FzZSAzOgorICAgICAgbWF4X2dycF9sZW4gPSA1OworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgbWF4X2dycF9sZW4gPSA2OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMToKKyAgICAgIG1heF9ncnBfbGVuID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6CisgICAgICBtYXhfZ3JwX2xlbiA9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE5OgorICAgICAgbWF4X2dycF9sZW4gPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNToKKyAgICAgIG1heF9ncnBfbGVuID0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNTE6CisgICAgICBtYXhfZ3JwX2xlbiA9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgY2FzZSA4OgorICAgIGNhc2UgMTU6CisgICAgY2FzZSAxNjoKKyAgICBjYXNlIDI2OgorICAgIGNhc2UgMzE6CisgICAgICBtYXhfZ3JwX2xlbiA9IDE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEhVRkZERUNfTk9UT0s7CisgIH0KKworICB0bXAgPSAxOworICBmb3IgKGkgPSAxOyBpIDw9IG1heF9ncnBfbGVuOyBpKyspIHsKKyAgICB0bXAgKj0gbnVtX2xldmVsczsKKyAgICBwY21fY2h1bmtfc2l6ZVtpXSA9IGlsb2cyKHRtcCk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3ZhbDsgaSArPSBtYXhfZ3JwX2xlbikgeworICAgIGludCBncnBfbGVuLCBncnBfdmFsLCBkYXRhOworICAgIGdycF9sZW4gPSBtaW4obWF4X2dycF9sZW4sIG51bV92YWwgLSBpKTsKKyAgICBkYXRhID0gRkRLcmVhZEJpdHMoc3RybSwgcGNtX2NodW5rX3NpemVbZ3JwX2xlbl0pOworCisgICAgZ3JwX3ZhbCA9IGRhdGE7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgZ3JwX2xlbjsgaisrKSB7CisgICAgICBpZHggPSBpICsgKGdycF9sZW4gLSBqIC0gMSk7CisgICAgICBuZXh0X3ZhbCA9IGdycF92YWwgJSBudW1fbGV2ZWxzOworCisgICAgICBpZiAob3V0X2RhdGFfMiA9PSBOVUxMKSB7CisgICAgICAgIG91dF9kYXRhXzFbaWR4XSA9IG5leHRfdmFsIC0gb2Zmc2V0OworICAgICAgfSBlbHNlIGlmIChvdXRfZGF0YV8xID09IE5VTEwpIHsKKyAgICAgICAgb3V0X2RhdGFfMltpZHhdID0gbmV4dF92YWwgLSBvZmZzZXQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoaWR4ICUgMikgeworICAgICAgICAgIG91dF9kYXRhXzJbaWR4IC8gMl0gPSBuZXh0X3ZhbCAtIG9mZnNldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXRfZGF0YV8xW2lkeCAvIDJdID0gbmV4dF92YWwgLSBvZmZzZXQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZ3JwX3ZhbCA9IChncnBfdmFsIC0gbmV4dF92YWwpIC8gbnVtX2xldmVsczsKKyAgICB9CisgIH0KKworICByZXR1cm4gSFVGRkRFQ19PSzsKK30KKworc3RhdGljIEVSUk9SX3QgaHVmZl9yZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgKCpub2RlVGFiKVtNQVhfRU5UUklFU11bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBvdXRfZGF0YSkgeworICBpbnQgbm9kZSA9IDA7CisgIGludCBsZW4gPSAwOworCisgIGRvIHsKKyAgICBVTE9ORyBuZXh0X2JpdDsKKyAgICBuZXh0X2JpdCA9IEZES3JlYWRCaXRzKHN0cm0sIDEpOworICAgIGxlbisrOworICAgIG5vZGUgPSAoKm5vZGVUYWIpW25vZGVdW25leHRfYml0XTsKKyAgfSB3aGlsZSAobm9kZSA+IDApOworCisgICpvdXRfZGF0YSA9IG5vZGU7CisKKyAgcmV0dXJuIEhVRkZERUNfT0s7Cit9CisKK3N0YXRpYyBFUlJPUl90IGh1ZmZfcmVhZF8yRChIQU5ETEVfRkRLX0JJVFNUUkVBTSBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUICgqbm9kZVRhYilbTUFYX0VOVFJJRVNdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSIG91dF9kYXRhWzJdLCBpbnQqIGVzY2FwZSkgeworICBFUlJPUl90IGVyciA9IEhVRkZERUNfT0s7CisKKyAgaW50IGh1ZmZfMkRfOGJpdCA9IDA7CisgIGludCBub2RlID0gMDsKKworICBpZiAoKGVyciA9IGh1ZmZfcmVhZChzdHJtLCBub2RlVGFiLCAmbm9kZSkpICE9IEhVRkZERUNfT0spIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAgKmVzY2FwZSA9IChub2RlID09IDApOworCisgIGlmICgqZXNjYXBlKSB7CisgICAgb3V0X2RhdGFbMF0gPSAwOworICAgIG91dF9kYXRhWzFdID0gMTsKKyAgfSBlbHNlIHsKKyAgICBodWZmXzJEXzhiaXQgPSAtKG5vZGUgKyAxKTsKKyAgICBvdXRfZGF0YVswXSA9IGh1ZmZfMkRfOGJpdCA+PiA0OworICAgIG91dF9kYXRhWzFdID0gaHVmZl8yRF84Yml0ICYgMHhmOworICB9CisKK2JhaWw6CisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBFUlJPUl90IHN5bV9yZXN0b3JlKEhBTkRMRV9GREtfQklUU1RSRUFNIHN0cm0sIGludCBsYXYsIFNDSEFSIGRhdGFbMl0pIHsKKyAgVUxPTkcgc3ltX2JpdCA9IDA7CisKKyAgaW50IHN1bV92YWwgPSBkYXRhWzBdICsgZGF0YVsxXTsKKyAgaW50IGRpZmZfdmFsID0gZGF0YVswXSAtIGRhdGFbMV07CisKKyAgaWYgKHN1bV92YWwgPiBsYXYpIHsKKyAgICBkYXRhWzBdID0gLXN1bV92YWwgKyAoMiAqIGxhdiArIDEpOworICAgIGRhdGFbMV0gPSAtZGlmZl92YWw7CisgIH0gZWxzZSB7CisgICAgZGF0YVswXSA9IHN1bV92YWw7CisgICAgZGF0YVsxXSA9IGRpZmZfdmFsOworICB9CisKKyAgaWYgKGRhdGFbMF0gKyBkYXRhWzFdICE9IDApIHsKKyAgICBzeW1fYml0ID0gRkRLcmVhZEJpdHMoc3RybSwgMSk7CisgICAgaWYgKHN5bV9iaXQpIHsKKyAgICAgIGRhdGFbMF0gPSAtZGF0YVswXTsKKyAgICAgIGRhdGFbMV0gPSAtZGF0YVsxXTsKKyAgICB9CisgIH0KKworICBpZiAoZGF0YVswXSAtIGRhdGFbMV0gIT0gMCkgeworICAgIHN5bV9iaXQgPSBGREtyZWFkQml0cyhzdHJtLCAxKTsKKyAgICBpZiAoc3ltX2JpdCkgeworICAgICAgaW50IHRtcDsKKyAgICAgIHRtcCA9IGRhdGFbMF07CisgICAgICBkYXRhWzBdID0gZGF0YVsxXTsKKyAgICAgIGRhdGFbMV0gPSB0bXA7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEhVRkZERUNfT0s7Cit9CisKK3N0YXRpYyBFUlJPUl90IGh1ZmZfZGVjXzFEKEhBTkRMRV9GREtfQklUU1RSRUFNIHN0cm0sIGNvbnN0IERBVEFfVFlQRSBkYXRhX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZGltMSwgU0NIQVIqIG91dF9kYXRhLCBjb25zdCBJTlQgbnVtX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBwMF9mbGFnKQorCit7CisgIEVSUk9SX3QgZXJyID0gSFVGRkRFQ19PSzsKKyAgaW50IGkgPSAwLCBub2RlID0gMCwgb2Zmc2V0ID0gMDsKKyAgaW50IG9kID0gMCwgb2Rfc2lnbiA9IDA7CisgIFVMT05HIGRhdGEgPSAwOworICBpbnQgYml0c0F2YWlsID0gMDsKKworICBjb25zdCBTSE9SVCgqcGFydFRhYilbTUFYX0VOVFJJRVNdWzJdID0gTlVMTDsKKyAgY29uc3QgU0hPUlQoKm5vZGVUYWIpW01BWF9FTlRSSUVTXVsyXSA9IE5VTEw7CisKKyAgc3dpdGNoIChkYXRhX3R5cGUpIHsKKyAgICBjYXNlIHRfQ0xEOgorICAgICAgcGFydFRhYiA9IChIQU5ETEVfSFVGRl9OT0RFKSZGREtfaHVmZlBhcnQwTm9kZXMuY2xkWzBdWzBdOworICAgICAgbm9kZVRhYiA9IChIQU5ETEVfSFVGRl9OT0RFKSZGREtfaHVmZkNMRE5vZGVzLmgxRFtkaW0xXS0+bm9kZVRhYlswXVswXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9JQ0M6CisgICAgICBwYXJ0VGFiID0gKEhBTkRMRV9IVUZGX05PREUpJkZES19odWZmUGFydDBOb2Rlcy5pY2NbMF1bMF07CisgICAgICBub2RlVGFiID0gKEhBTkRMRV9IVUZGX05PREUpJkZES19odWZmSUNDTm9kZXMuaDFEW2RpbTFdLT5ub2RlVGFiWzBdWzBdOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X09MRDoKKyAgICAgIHBhcnRUYWIgPSAoSEFORExFX0hVRkZfTk9ERSkmRkRLX2h1ZmZQYXJ0ME5vZGVzLm9sZFswXVswXTsKKyAgICAgIG5vZGVUYWIgPSAoSEFORExFX0hVRkZfTk9ERSkmaHVmZk9MRE5vZGVzLmgxRFtkaW0xXS0+bm9kZVRhYlswXVswXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9JUEQ6CisgICAgICBwYXJ0VGFiID0gKEhBTkRMRV9IVUZGX05PREUpJkZES19odWZmUGFydDBOb2Rlcy5pcGRbMF1bMF07CisgICAgICBub2RlVGFiID0gKEhBTkRMRV9IVUZGX05PREUpJkZES19odWZmSVBETm9kZXMuaDFEW2RpbTFdLm5vZGVUYWJbMF1bMF07CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgIGVyciA9IEhVRkZERUNfTk9UT0s7CisgICAgICBnb3RvIGJhaWw7CisgIH0KKworICBpZiAocDBfZmxhZykgeworICAgIGlmICgoZXJyID0gaHVmZl9yZWFkKHN0cm0sIHBhcnRUYWIsICZub2RlKSkgIT0gSFVGRkRFQ19PSykgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIG91dF9kYXRhWzBdID0gLShub2RlICsgMSk7CisgICAgb2Zmc2V0ID0gMTsKKyAgfQorCisgIGZvciAoaSA9IG9mZnNldDsgaSA8IG51bV92YWw7IGkrKykgeworICAgIGJpdHNBdmFpbCA9IEZES2dldFZhbGlkQml0cyhzdHJtKTsKKyAgICBpZiAoYml0c0F2YWlsIDwgMSkgeworICAgICAgZXJyID0gSFVGRkRFQ19OT1RPSzsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IGh1ZmZfcmVhZChzdHJtLCBub2RlVGFiLCAmbm9kZSkpICE9IEhVRkZERUNfT0spIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgICAgb2QgPSAtKG5vZGUgKyAxKTsKKworICAgIGlmIChkYXRhX3R5cGUgIT0gdF9JUEQpIHsKKyAgICAgIGlmIChvZCAhPSAwKSB7CisgICAgICAgIGJpdHNBdmFpbCA9IEZES2dldFZhbGlkQml0cyhzdHJtKTsKKyAgICAgICAgaWYgKGJpdHNBdmFpbCA8IDEpIHsKKyAgICAgICAgICBlcnIgPSBIVUZGREVDX05PVE9LOworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGRhdGEgPSBGREtyZWFkQml0cyhzdHJtLCAxKTsKKyAgICAgICAgb2Rfc2lnbiA9IGRhdGE7CisKKyAgICAgICAgaWYgKG9kX3NpZ24pIG9kID0gLW9kOworICAgICAgfQorICAgIH0KKworICAgIG91dF9kYXRhW2ldID0gb2Q7CisgIH0KKworYmFpbDoKKyAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIEVSUk9SX3QgaHVmZl9kZWNfMkQoSEFORExFX0ZES19CSVRTVFJFQU0gc3RybSwgY29uc3QgREFUQV9UWVBFIGRhdGFfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBkaW0xLCBjb25zdCBJTlQgZGltMiwgU0NIQVIgb3V0X2RhdGFbXVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBudW1fdmFsLCBjb25zdCBJTlQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIqIHAwX2RhdGFbMl0pIHsKKyAgRVJST1JfdCBlcnIgPSBIVUZGREVDX09LOworICBpbnQgaSA9IDAsIGxhdiA9IDAsIGVzY2FwZSA9IDAsIGVzY0NudHIgPSAwOworICBpbnQgbm9kZSA9IDA7CisgIHVuc2lnbmVkIGxvbmcgZGF0YSA9IDA7CisKKyAgU0NIQVIgZXNjX2RhdGFbMl1bMjhdID0ge3swfX07CisgIGludCBlc2NJZHhbMjhdID0gezB9OworICBjb25zdCBTSE9SVCgqbm9kZVRhYilbTUFYX0VOVFJJRVNdWzJdID0gTlVMTDsKKworICAvKiBMQVYgKi8KKyAgaWYgKChlcnIgPQorICAgICAgICAgICBodWZmX3JlYWQoc3RybSwgKEhBTkRMRV9IVUZGX05PREUpJkZES19odWZmTGF2SWR4Tm9kZXMubm9kZVRhYlswXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICZub2RlKSkgIT0gSFVGRkRFQ19PSykgeworICAgIGdvdG8gYmFpbDsKKyAgfQorICBkYXRhID0gLShub2RlICsgMSk7CisKKyAgc3dpdGNoIChkYXRhX3R5cGUpIHsKKyAgICBjYXNlIHRfQ0xEOgorICAgICAgbGF2ID0gMiAqIGRhdGEgKyAzOyAvKiAzLCA1LCA3LCA5ICovCisgICAgICBub2RlVGFiID0gKEhBTkRMRV9IVUZGX05PREUpJkZES19odWZmUGFydDBOb2Rlcy5jbGRbMF1bMF07CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfSUNDOgorICAgICAgbGF2ID0gMiAqIGRhdGEgKyAxOyAvKiAxLCAzLCA1LCA3ICovCisgICAgICBub2RlVGFiID0gKEhBTkRMRV9IVUZGX05PREUpJkZES19odWZmUGFydDBOb2Rlcy5pY2NbMF1bMF07CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfT0xEOgorICAgICAgbGF2ID0gMyAqIGRhdGEgKyAzOworICAgICAgbm9kZVRhYiA9IChIQU5ETEVfSFVGRl9OT0RFKSZGREtfaHVmZlBhcnQwTm9kZXMub2xkWzBdWzBdOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X0lQRDoKKyAgICAgIGlmIChkYXRhID09IDApCisgICAgICAgIGRhdGEgPSAzOworICAgICAgZWxzZQorICAgICAgICBkYXRhLS07CisgICAgICBsYXYgPSAyICogZGF0YSArIDE7IC8qIDEsIDMsIDUsIDcgKi8KKyAgICAgIG5vZGVUYWIgPSAoSEFORExFX0hVRkZfTk9ERSkmRkRLX2h1ZmZQYXJ0ME5vZGVzLmlwZFswXVswXTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBGREtfQVNTRVJUKDApOworICAgICAgZXJyID0gSFVGRkRFQ19OT1RPSzsKKyAgICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIFBhcnRpdGlvbiAwICovCisgIGlmIChwMF9kYXRhWzBdICE9IE5VTEwpIHsKKyAgICBpZiAoKGVyciA9IGh1ZmZfcmVhZChzdHJtLCBub2RlVGFiLCAmbm9kZSkpICE9IEhVRkZERUNfT0spIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgICAgKnAwX2RhdGFbMF0gPSAtKG5vZGUgKyAxKTsKKyAgfQorICBpZiAocDBfZGF0YVsxXSAhPSBOVUxMKSB7CisgICAgaWYgKChlcnIgPSBodWZmX3JlYWQoc3RybSwgbm9kZVRhYiwgJm5vZGUpKSAhPSBIVUZGREVDX09LKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgICpwMF9kYXRhWzFdID0gLShub2RlICsgMSk7CisgIH0KKworICBzd2l0Y2ggKGRhdGFfdHlwZSkgeworICAgIGNhc2UgdF9DTEQ6CisgICAgICBzd2l0Y2ggKGxhdikgeworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgbm9kZVRhYiA9CisgICAgICAgICAgICAgIChIQU5ETEVfSFVGRl9OT0RFKSZGREtfaHVmZkNMRE5vZGVzLmgyRFtkaW0xXVtkaW0yXS0+bGF2M1swXVswXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgIG5vZGVUYWIgPQorICAgICAgICAgICAgICAoSEFORExFX0hVRkZfTk9ERSkmRkRLX2h1ZmZDTEROb2Rlcy5oMkRbZGltMV1bZGltMl0tPmxhdjVbMF1bMF07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICBub2RlVGFiID0KKyAgICAgICAgICAgICAgKEhBTkRMRV9IVUZGX05PREUpJkZES19odWZmQ0xETm9kZXMuaDJEW2RpbTFdW2RpbTJdLT5sYXY3WzBdWzBdOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDk6CisgICAgICAgICAgbm9kZVRhYiA9CisgICAgICAgICAgICAgIChIQU5ETEVfSFVGRl9OT0RFKSZGREtfaHVmZkNMRE5vZGVzLmgyRFtkaW0xXVtkaW0yXS0+bGF2OVswXVswXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9JQ0M6CisgICAgICBzd2l0Y2ggKGxhdikgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgbm9kZVRhYiA9CisgICAgICAgICAgICAgIChIQU5ETEVfSFVGRl9OT0RFKSZGREtfaHVmZklDQ05vZGVzLmgyRFtkaW0xXVtkaW0yXS0+bGF2MVswXVswXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgIG5vZGVUYWIgPQorICAgICAgICAgICAgICAoSEFORExFX0hVRkZfTk9ERSkmRkRLX2h1ZmZJQ0NOb2Rlcy5oMkRbZGltMV1bZGltMl0tPmxhdjNbMF1bMF07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICBub2RlVGFiID0KKyAgICAgICAgICAgICAgKEhBTkRMRV9IVUZGX05PREUpJkZES19odWZmSUNDTm9kZXMuaDJEW2RpbTFdW2RpbTJdLT5sYXY1WzBdWzBdOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgbm9kZVRhYiA9CisgICAgICAgICAgICAgIChIQU5ETEVfSFVGRl9OT0RFKSZGREtfaHVmZklDQ05vZGVzLmgyRFtkaW0xXVtkaW0yXS0+bGF2N1swXVswXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9PTEQ6CisgICAgICBzd2l0Y2ggKGxhdikgeworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgbm9kZVRhYiA9IChIQU5ETEVfSFVGRl9OT0RFKSZodWZmT0xETm9kZXMuaDJEW2RpbTFdW2RpbTJdLT5sYXYzWzBdWzBdOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgbm9kZVRhYiA9IChIQU5ETEVfSFVGRl9OT0RFKSZodWZmT0xETm9kZXMuaDJEW2RpbTFdW2RpbTJdLT5sYXY2WzBdWzBdOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDk6CisgICAgICAgICAgbm9kZVRhYiA9IChIQU5ETEVfSFVGRl9OT0RFKSZodWZmT0xETm9kZXMuaDJEW2RpbTFdW2RpbTJdLT5sYXY5WzBdWzBdOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEyOgorICAgICAgICAgIG5vZGVUYWIgPQorICAgICAgICAgICAgICAoSEFORExFX0hVRkZfTk9ERSkmaHVmZk9MRE5vZGVzLmgyRFtkaW0xXVtkaW0yXS0+bGF2MTJbMF1bMF07CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfSVBEOgorICAgICAgc3dpdGNoIChsYXYpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIG5vZGVUYWIgPQorICAgICAgICAgICAgICAoSEFORExFX0hVRkZfTk9ERSkmRkRLX2h1ZmZJUEROb2Rlcy5oMkRbZGltMV1bZGltMl0ubGF2MVswXVswXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgIG5vZGVUYWIgPQorICAgICAgICAgICAgICAoSEFORExFX0hVRkZfTk9ERSkmRkRLX2h1ZmZJUEROb2Rlcy5oMkRbZGltMV1bZGltMl0ubGF2M1swXVswXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgIG5vZGVUYWIgPQorICAgICAgICAgICAgICAoSEFORExFX0hVRkZfTk9ERSkmRkRLX2h1ZmZJUEROb2Rlcy5oMkRbZGltMV1bZGltMl0ubGF2NVswXVswXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgIG5vZGVUYWIgPQorICAgICAgICAgICAgICAoSEFORExFX0hVRkZfTk9ERSkmRkRLX2h1ZmZJUEROb2Rlcy5oMkRbZGltMV1bZGltMl0ubGF2N1swXVswXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBudW1fdmFsOyBpICs9IHN0cmlkZSkgeworICAgIGlmICgoZXJyID0gaHVmZl9yZWFkXzJEKHN0cm0sIG5vZGVUYWIsIG91dF9kYXRhW2ldLCAmZXNjYXBlKSkgIT0KKyAgICAgICAgSFVGRkRFQ19PSykgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChlc2NhcGUpIHsKKyAgICAgIGVzY0lkeFtlc2NDbnRyKytdID0gaTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGRhdGFfdHlwZSA9PSB0X0lQRCkgeworICAgICAgICBpZiAoKGVyciA9IHN5bV9yZXN0b3JlSVBEKHN0cm0sIGxhdiwgb3V0X2RhdGFbaV0pKSAhPSBIVUZGREVDX09LKSB7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoKGVyciA9IHN5bV9yZXN0b3JlKHN0cm0sIGxhdiwgb3V0X2RhdGFbaV0pKSAhPSBIVUZGREVDX09LKSB7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IC8qIGkgKi8KKworICBpZiAoZXNjQ250ciA+IDApIHsKKyAgICBpZiAoKGVyciA9IHBjbV9kZWNvZGUoc3RybSwgZXNjX2RhdGFbMF0sIGVzY19kYXRhWzFdLCAwLCAyICogZXNjQ250ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDIgKiBsYXYgKyAxKSkpICE9IEhVRkZERUNfT0spIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZXNjQ250cjsgaSsrKSB7CisgICAgICBvdXRfZGF0YVtlc2NJZHhbaV1dWzBdID0gZXNjX2RhdGFbMF1baV0gLSBsYXY7CisgICAgICBvdXRfZGF0YVtlc2NJZHhbaV1dWzFdID0gZXNjX2RhdGFbMV1baV0gLSBsYXY7CisgICAgfQorICB9CitiYWlsOgorICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgRVJST1JfdCBodWZmX2RlY29kZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBzdHJtLCBTQ0hBUiogb3V0X2RhdGFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSKiBvdXRfZGF0YV8yLCBEQVRBX1RZUEUgZGF0YV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGRl9UWVBFIGRpZmZfdHlwZV8xLCBESUZGX1RZUEUgZGlmZl90eXBlXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3ZhbCwgQ09ESU5HX1NDSEVNRSogY2RnX3NjaGVtZSwgaW50IGxkTW9kZSkgeworICBFUlJPUl90IGVyciA9IEhVRkZERUNfT0s7CisgIERJRkZfVFlQRSBkaWZmX3R5cGU7CisKKyAgaW50IGkgPSAwOworICBVTE9ORyBkYXRhID0gMDsKKworICBTQ0hBUiBwYWlyX3ZlY1syOF1bMl07CisKKyAgU0NIQVIqIHAwX2RhdGFfMVsyXSA9IHtOVUxMLCBOVUxMfTsKKyAgU0NIQVIqIHAwX2RhdGFfMlsyXSA9IHtOVUxMLCBOVUxMfTsKKworICBpbnQgcDBfZmxhZ1syXTsKKworICBpbnQgbnVtX3ZhbF8xX2ludCA9IG51bV92YWw7CisgIGludCBudW1fdmFsXzJfaW50ID0gbnVtX3ZhbDsKKworICBTQ0hBUiogb3V0X2RhdGFfMV9pbnQgPSBvdXRfZGF0YV8xOworICBTQ0hBUiogb3V0X2RhdGFfMl9pbnQgPSBvdXRfZGF0YV8yOworCisgIGludCBkZl9yZXN0X2ZsYWdfMSA9IDA7CisgIGludCBkZl9yZXN0X2ZsYWdfMiA9IDA7CisKKyAgaW50IGh1ZllZMTsKKyAgaW50IGh1ZllZMjsKKyAgaW50IGh1ZllZOworCisgIC8qIENvZGluZyBzY2hlbWUgKi8KKyAgZGF0YSA9IEZES3JlYWRCaXRzKHN0cm0sIDEpOworICAqY2RnX3NjaGVtZSA9IChDT0RJTkdfU0NIRU1FKShkYXRhIDw8IFBBSVJfU0hJRlQpOworCisgIGlmICgqY2RnX3NjaGVtZSA+PiBQQUlSX1NISUZUID09IEhVRkZfMkQpIHsKKyAgICBpZiAoKG91dF9kYXRhXzEgIT0gTlVMTCkgJiYgKG91dF9kYXRhXzIgIT0gTlVMTCkgJiYgKGxkTW9kZSA9PSAwKSkgeworICAgICAgZGF0YSA9IEZES3JlYWRCaXRzKHN0cm0sIDEpOworICAgICAgKmNkZ19zY2hlbWUgPSAoQ09ESU5HX1NDSEVNRSkoKmNkZ19zY2hlbWUgfCBkYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgKmNkZ19zY2hlbWUgPSAoQ09ESU5HX1NDSEVNRSkoKmNkZ19zY2hlbWUgfCBGUkVRX1BBSVIpOworICAgIH0KKyAgfQorCisgIHsKKyAgICBodWZZWTEgPSBkaWZmX3R5cGVfMTsKKyAgICBodWZZWTIgPSBkaWZmX3R5cGVfMjsKKyAgfQorCisgIHN3aXRjaCAoKmNkZ19zY2hlbWUgPj4gUEFJUl9TSElGVCkgeworICAgIGNhc2UgSFVGRl8xRDoKKyAgICAgIHAwX2ZsYWdbMF0gPSAoZGlmZl90eXBlXzEgPT0gRElGRl9GUkVRKTsKKyAgICAgIHAwX2ZsYWdbMV0gPSAoZGlmZl90eXBlXzIgPT0gRElGRl9GUkVRKTsKKyAgICAgIGlmIChvdXRfZGF0YV8xICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKChlcnIgPSBodWZmX2RlY18xRChzdHJtLCBkYXRhX3R5cGUsIGh1ZllZMSwgb3V0X2RhdGFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdmFsXzFfaW50LCBwMF9mbGFnWzBdKSkgIT0gSFVGRkRFQ19PSykgeworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKG91dF9kYXRhXzIgIT0gTlVMTCkgeworICAgICAgICBpZiAoKGVyciA9IGh1ZmZfZGVjXzFEKHN0cm0sIGRhdGFfdHlwZSwgaHVmWVkyLCBvdXRfZGF0YV8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV92YWxfMl9pbnQsIHAwX2ZsYWdbMV0pKSAhPSBIVUZGREVDX09LKSB7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGJyZWFrOyAvKiBIVUZGXzFEICovCisKKyAgICBjYXNlIEhVRkZfMkQ6CisKKyAgICAgIHN3aXRjaCAoKmNkZ19zY2hlbWUgJiBQQUlSX01BU0spIHsKKyAgICAgICAgY2FzZSBGUkVRX1BBSVI6CisKKyAgICAgICAgICBpZiAob3V0X2RhdGFfMSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoZGlmZl90eXBlXzEgPT0gRElGRl9GUkVRKSB7CisgICAgICAgICAgICAgIHAwX2RhdGFfMVswXSA9ICZvdXRfZGF0YV8xWzBdOworICAgICAgICAgICAgICBwMF9kYXRhXzFbMV0gPSBOVUxMOworCisgICAgICAgICAgICAgIG51bV92YWxfMV9pbnQgLT0gMTsKKyAgICAgICAgICAgICAgb3V0X2RhdGFfMV9pbnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRmX3Jlc3RfZmxhZ18xID0gbnVtX3ZhbF8xX2ludCAlIDI7CisgICAgICAgICAgICBpZiAoZGZfcmVzdF9mbGFnXzEpIG51bV92YWxfMV9pbnQgLT0gMTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG91dF9kYXRhXzIgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGRpZmZfdHlwZV8yID09IERJRkZfRlJFUSkgeworICAgICAgICAgICAgICBwMF9kYXRhXzJbMF0gPSBOVUxMOworICAgICAgICAgICAgICBwMF9kYXRhXzJbMV0gPSAmb3V0X2RhdGFfMlswXTsKKworICAgICAgICAgICAgICBudW1fdmFsXzJfaW50IC09IDE7CisgICAgICAgICAgICAgIG91dF9kYXRhXzJfaW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZl9yZXN0X2ZsYWdfMiA9IG51bV92YWxfMl9pbnQgJSAyOworICAgICAgICAgICAgaWYgKGRmX3Jlc3RfZmxhZ18yKSBudW1fdmFsXzJfaW50IC09IDE7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKG91dF9kYXRhXzEgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKChlcnIgPSBodWZmX2RlY18yRChzdHJtLCBkYXRhX3R5cGUsIGh1ZllZMSwgRlJFUV9QQUlSLCBwYWlyX3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3ZhbF8xX2ludCwgMiwgcDBfZGF0YV8xKSkgIT0KKyAgICAgICAgICAgICAgICBIVUZGREVDX09LKSB7CisgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkZl9yZXN0X2ZsYWdfMSkgeworICAgICAgICAgICAgICBpZiAoKGVyciA9IGh1ZmZfZGVjXzFEKHN0cm0sIGRhdGFfdHlwZSwgaHVmWVkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9kYXRhXzFfaW50ICsgbnVtX3ZhbF8xX2ludCwgMSwgMCkpICE9CisgICAgICAgICAgICAgICAgICBIVUZGREVDX09LKSB7CisgICAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChvdXRfZGF0YV8yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICgoZXJyID0gaHVmZl9kZWNfMkQoc3RybSwgZGF0YV90eXBlLCBodWZZWTIsIEZSRVFfUEFJUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpcl92ZWMgKyAxLCBudW1fdmFsXzJfaW50LCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMF9kYXRhXzIpKSAhPSBIVUZGREVDX09LKSB7CisgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkZl9yZXN0X2ZsYWdfMikgeworICAgICAgICAgICAgICBpZiAoKGVyciA9IGh1ZmZfZGVjXzFEKHN0cm0sIGRhdGFfdHlwZSwgaHVmWVkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9kYXRhXzJfaW50ICsgbnVtX3ZhbF8yX2ludCwgMSwgMCkpICE9CisgICAgICAgICAgICAgICAgICBIVUZGREVDX09LKSB7CisgICAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKG91dF9kYXRhXzEgIT0gTlVMTCkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV92YWxfMV9pbnQgLSAxOyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgb3V0X2RhdGFfMV9pbnRbaV0gPSBwYWlyX3ZlY1tpXVswXTsKKyAgICAgICAgICAgICAgb3V0X2RhdGFfMV9pbnRbaSArIDFdID0gcGFpcl92ZWNbaV1bMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChvdXRfZGF0YV8yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdmFsXzJfaW50IC0gMTsgaSArPSAyKSB7CisgICAgICAgICAgICAgIG91dF9kYXRhXzJfaW50W2ldID0gcGFpcl92ZWNbaSArIDFdWzBdOworICAgICAgICAgICAgICBvdXRfZGF0YV8yX2ludFtpICsgMV0gPSBwYWlyX3ZlY1tpICsgMV1bMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOyAvKiBGUkVRX1BBSVIgKi8KKworICAgICAgICBjYXNlIFRJTUVfUEFJUjoKKyAgICAgICAgICBpZiAoKChkaWZmX3R5cGVfMSA9PSBESUZGX0ZSRVEpIHx8IChkaWZmX3R5cGVfMiA9PSBESUZGX0ZSRVEpKSkgeworICAgICAgICAgICAgcDBfZGF0YV8xWzBdID0gJm91dF9kYXRhXzFbMF07CisgICAgICAgICAgICBwMF9kYXRhXzFbMV0gPSAmb3V0X2RhdGFfMlswXTsKKworICAgICAgICAgICAgb3V0X2RhdGFfMV9pbnQgKz0gMTsKKyAgICAgICAgICAgIG91dF9kYXRhXzJfaW50ICs9IDE7CisKKyAgICAgICAgICAgIG51bV92YWxfMV9pbnQgLT0gMTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoKGRpZmZfdHlwZV8xID09IERJRkZfVElNRSkgfHwgKGRpZmZfdHlwZV8yID09IERJRkZfVElNRSkpIHsKKyAgICAgICAgICAgIGRpZmZfdHlwZSA9IERJRkZfVElNRTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGlmZl90eXBlID0gRElGRl9GUkVROworICAgICAgICAgIH0KKyAgICAgICAgICB7IGh1ZllZID0gZGlmZl90eXBlOyB9CisKKyAgICAgICAgICBpZiAoKGVyciA9IGh1ZmZfZGVjXzJEKHN0cm0sIGRhdGFfdHlwZSwgaHVmWVksIFRJTUVfUEFJUiwgcGFpcl92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdmFsXzFfaW50LCAxLCBwMF9kYXRhXzEpKSAhPSBIVUZGREVDX09LKSB7CisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgfQorCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV92YWxfMV9pbnQ7IGkrKykgeworICAgICAgICAgICAgb3V0X2RhdGFfMV9pbnRbaV0gPSBwYWlyX3ZlY1tpXVswXTsKKyAgICAgICAgICAgIG91dF9kYXRhXzJfaW50W2ldID0gcGFpcl92ZWNbaV1bMV07CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7IC8qIFRJTUVfUEFJUiAqLworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGJyZWFrOyAvKiBIVUZGXzJEICovCisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK2JhaWw6CisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGRpZmZfZnJlcV9kZWNvZGUoY29uc3QgU0NIQVIqIGNvbnN0IGRpZmZfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIqIGNvbnN0IG91dF9kYXRhLCBjb25zdCBpbnQgbnVtX3ZhbCkgeworICBpbnQgaSA9IDA7CisgIG91dF9kYXRhWzBdID0gZGlmZl9kYXRhWzBdOworCisgIGZvciAoaSA9IDE7IGkgPCBudW1fdmFsOyBpKyspIHsKKyAgICBvdXRfZGF0YVtpXSA9IG91dF9kYXRhW2kgLSAxXSArIGRpZmZfZGF0YVtpXTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBkaWZmX3RpbWVfZGVjb2RlX2JhY2t3YXJkcyhjb25zdCBTQ0hBUiogY29uc3QgcHJldl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NIQVIqIGNvbnN0IGRpZmZfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSKiBjb25zdCBvdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBtaXhlZF9kaWZmX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtX3ZhbCkgeworICBpbnQgaSA9IDA7IC8qIGRlZmF1bHQgc3RhcnQgdmFsdWUqLworCisgIGlmIChtaXhlZF9kaWZmX3R5cGUpIHsKKyAgICBvdXRfZGF0YVswXSA9IGRpZmZfZGF0YVswXTsKKyAgICBpID0gMTsgLyogbmV3IHN0YXJ0IHZhbHVlICovCisgIH0KKyAgZm9yICg7IGkgPCBudW1fdmFsOyBpKyspIHsKKyAgICBvdXRfZGF0YVtpXSA9IHByZXZfZGF0YVtpXSArIGRpZmZfZGF0YVtpXTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBkaWZmX3RpbWVfZGVjb2RlX2ZvcndhcmRzKGNvbnN0IFNDSEFSKiBjb25zdCBwcmV2X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDSEFSKiBjb25zdCBkaWZmX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSKiBjb25zdCBvdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG1peGVkX2RpZmZfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bV92YWwpIHsKKyAgaW50IGkgPSAwOyAvKiBkZWZhdWx0IHN0YXJ0IHZhbHVlKi8KKworICBpZiAobWl4ZWRfZGlmZl90eXBlKSB7CisgICAgb3V0X2RhdGFbMF0gPSBkaWZmX2RhdGFbMF07CisgICAgaSA9IDE7IC8qIG5ldyBzdGFydCB2YWx1ZSAqLworICB9CisgIGZvciAoOyBpIDwgbnVtX3ZhbDsgaSsrKSB7CisgICAgb3V0X2RhdGFbaV0gPSBwcmV2X2RhdGFbaV0gLSBkaWZmX2RhdGFbaV07CisgIH0KK30KKworc3RhdGljIEVSUk9SX3QgYXR0YWNoX2xzYihIQU5ETEVfRkRLX0JJVFNUUkVBTSBzdHJtLCBTQ0hBUiogaW5fZGF0YV9tc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBudW1fbHNiLCBpbnQgbnVtX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIqIG91dF9kYXRhKSB7CisgIGludCBpID0gMCwgbHNiID0gMDsKKyAgVUxPTkcgZGF0YSA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV92YWw7IGkrKykgeworICAgIGludCBtc2I7CisgICAgbXNiID0gaW5fZGF0YV9tc2JbaV07CisKKyAgICBpZiAobnVtX2xzYiA+IDApIHsKKyAgICAgIGRhdGEgPSBGREtyZWFkQml0cyhzdHJtLCBudW1fbHNiKTsKKyAgICAgIGxzYiA9IGRhdGE7CisKKyAgICAgIG91dF9kYXRhW2ldID0gKChtc2IgPDwgbnVtX2xzYikgfCBsc2IpIC0gb2Zmc2V0OworICAgIH0gZWxzZQorICAgICAgb3V0X2RhdGFbaV0gPSBtc2IgLSBvZmZzZXQ7CisgIH0KKworICByZXR1cm4gSFVGRkRFQ19PSzsgLyogZHVtbXkgKi8KK30KKworRVJST1JfdCBFY0RhdGFQYWlyRGVjKERFQ09ERVJfVFlQRSBERUNPREVSLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgIFNDSEFSKiBhYU91dERhdGExLCBTQ0hBUiogYWFPdXREYXRhMiwgU0NIQVIqIGFIaXN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgIERBVEFfVFlQRSBkYXRhX3R5cGUsIGludCBzdGFydEJhbmQsIGludCBkYXRhQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHBhaXJfZmxhZywgaW50IGNvYXJzZV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd0RpZmZUaW1lQmFja19mbGFnKQorCit7CisgIEVSUk9SX3QgZXJyID0gSFVGRkRFQ19PSzsKKworICAvLyBpbnQgYWxsb3dEaWZmVGltZUJhY2tfZmxhZyA9ICFpbmRlcGVuZGVuY3lfZmxhZyB8fCAoc2V0SWR4ID4gMCk7CisgIGludCBhdHRhY2hMc2JfZmxhZyA9IDA7CisgIGludCBwY21Db2RpbmdfZmxhZyA9IDA7CisKKyAgaW50IG1peGVkX3RpbWVfcGFpciA9IDAsIG51bVZhbFBjbSA9IDA7CisgIGludCBxdWFudF9sZXZlbHMgPSAwLCBxdWFudF9vZmZzZXQgPSAwOworICBVTE9ORyBkYXRhID0gMDsKKworICBTQ0hBUiBhYURhdGFQYWlyWzJdWzI4XSA9IHt7MH19OworICBTQ0hBUiBhYURhdGFEaWZmWzJdWzI4XSA9IHt7MH19OworCisgIFNDSEFSIGFIaXN0b3J5TXNiWzI4XSA9IHswfTsKKworICBTQ0hBUiogcERhdGFWZWNbMl0gPSB7TlVMTCwgTlVMTH07CisKKyAgRElGRl9UWVBFIGRpZmZfdHlwZVsyXSA9IHtESUZGX0ZSRVEsIERJRkZfRlJFUX07CisgIENPRElOR19TQ0hFTUUgY2RnX3NjaGVtZSA9IEhVRkZfMUQ7CisgIERJUkVDVElPTiBkaXJlY3Rpb24gPSBCQUNLV0FSRFM7CisKKyAgc3dpdGNoIChkYXRhX3R5cGUpIHsKKyAgICBjYXNlIHRfQ0xEOgorICAgICAgaWYgKGNvYXJzZV9mbGFnKSB7CisgICAgICAgIGF0dGFjaExzYl9mbGFnID0gMDsKKyAgICAgICAgcXVhbnRfbGV2ZWxzID0gMTU7CisgICAgICAgIHF1YW50X29mZnNldCA9IDc7CisgICAgICB9IGVsc2UgeworICAgICAgICBhdHRhY2hMc2JfZmxhZyA9IDA7CisgICAgICAgIHF1YW50X2xldmVscyA9IDMxOworICAgICAgICBxdWFudF9vZmZzZXQgPSAxNTsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHRfSUNDOgorICAgICAgaWYgKGNvYXJzZV9mbGFnKSB7CisgICAgICAgIGF0dGFjaExzYl9mbGFnID0gMDsKKyAgICAgICAgcXVhbnRfbGV2ZWxzID0gNDsKKyAgICAgICAgcXVhbnRfb2Zmc2V0ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGF0dGFjaExzYl9mbGFnID0gMDsKKyAgICAgICAgcXVhbnRfbGV2ZWxzID0gODsKKyAgICAgICAgcXVhbnRfb2Zmc2V0ID0gMDsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHRfT0xEOgorICAgICAgaWYgKGNvYXJzZV9mbGFnKSB7CisgICAgICAgIGF0dGFjaExzYl9mbGFnID0gMDsKKyAgICAgICAgcXVhbnRfbGV2ZWxzID0gODsKKyAgICAgICAgcXVhbnRfb2Zmc2V0ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGF0dGFjaExzYl9mbGFnID0gMDsKKyAgICAgICAgcXVhbnRfbGV2ZWxzID0gMTY7CisgICAgICAgIHF1YW50X29mZnNldCA9IDA7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgdF9OUkc6CisgICAgICBpZiAoY29hcnNlX2ZsYWcpIHsKKyAgICAgICAgYXR0YWNoTHNiX2ZsYWcgPSAwOworICAgICAgICBxdWFudF9sZXZlbHMgPSAzMjsKKyAgICAgICAgcXVhbnRfb2Zmc2V0ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGF0dGFjaExzYl9mbGFnID0gMDsKKyAgICAgICAgcXVhbnRfbGV2ZWxzID0gNjQ7CisgICAgICAgIHF1YW50X29mZnNldCA9IDA7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgdF9JUEQ6CisgICAgICBpZiAoIWNvYXJzZV9mbGFnKSB7CisgICAgICAgIGF0dGFjaExzYl9mbGFnID0gMTsKKyAgICAgICAgcXVhbnRfbGV2ZWxzID0gMTY7CisgICAgICAgIHF1YW50X29mZnNldCA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBhdHRhY2hMc2JfZmxhZyA9IDA7CisgICAgICAgIHF1YW50X2xldmVscyA9IDg7CisgICAgICAgIHF1YW50X29mZnNldCA9IDA7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gSFVGRkRFQ19OT1RPSzsKKyAgfQorCisgIGRhdGEgPSBGREtyZWFkQml0cyhzdHJtLCAxKTsKKyAgcGNtQ29kaW5nX2ZsYWcgPSBkYXRhOworCisgIGlmIChwY21Db2RpbmdfZmxhZykgeworICAgIGlmIChwYWlyX2ZsYWcpIHsKKyAgICAgIHBEYXRhVmVjWzBdID0gYWFEYXRhUGFpclswXTsKKyAgICAgIHBEYXRhVmVjWzFdID0gYWFEYXRhUGFpclsxXTsKKyAgICAgIG51bVZhbFBjbSA9IDIgKiBkYXRhQmFuZHM7CisgICAgfSBlbHNlIHsKKyAgICAgIHBEYXRhVmVjWzBdID0gYWFEYXRhUGFpclswXTsKKyAgICAgIHBEYXRhVmVjWzFdID0gTlVMTDsKKyAgICAgIG51bVZhbFBjbSA9IGRhdGFCYW5kczsKKyAgICB9CisKKyAgICBlcnIgPSBwY21fZGVjb2RlKHN0cm0sIHBEYXRhVmVjWzBdLCBwRGF0YVZlY1sxXSwgcXVhbnRfb2Zmc2V0LCBudW1WYWxQY20sCisgICAgICAgICAgICAgICAgICAgICBxdWFudF9sZXZlbHMpOworICAgIGlmIChlcnIgIT0gSFVGRkRFQ19PSykgcmV0dXJuIEhVRkZERUNfTk9UT0s7CisKKyAgfSBlbHNlIHsgLyogRGlmZmVyZW50aWFsL0h1ZmZtYW4vTFNCIENvZGluZyAqLworCisgICAgaWYgKHBhaXJfZmxhZykgeworICAgICAgcERhdGFWZWNbMF0gPSBhYURhdGFEaWZmWzBdOworICAgICAgcERhdGFWZWNbMV0gPSBhYURhdGFEaWZmWzFdOworICAgIH0gZWxzZSB7CisgICAgICBwRGF0YVZlY1swXSA9IGFhRGF0YURpZmZbMF07CisgICAgICBwRGF0YVZlY1sxXSA9IE5VTEw7CisgICAgfQorCisgICAgZGlmZl90eXBlWzBdID0gRElGRl9GUkVROworICAgIGRpZmZfdHlwZVsxXSA9IERJRkZfRlJFUTsKKworICAgIGRpcmVjdGlvbiA9IEJBQ0tXQVJEUzsKKyAgICB7CisgICAgICBpZiAocGFpcl9mbGFnIHx8IGFsbG93RGlmZlRpbWVCYWNrX2ZsYWcpIHsKKyAgICAgICAgZGF0YSA9IEZES3JlYWRCaXRzKHN0cm0sIDEpOworICAgICAgICBkaWZmX3R5cGVbMF0gPSAoRElGRl9UWVBFKWRhdGE7CisgICAgICB9CisKKyAgICAgIGlmIChwYWlyX2ZsYWcgJiYKKyAgICAgICAgICAoKGRpZmZfdHlwZVswXSA9PSBESUZGX0ZSRVEpIHx8IGFsbG93RGlmZlRpbWVCYWNrX2ZsYWcpKSB7CisgICAgICAgIGRhdGEgPSBGREtyZWFkQml0cyhzdHJtLCAxKTsKKyAgICAgICAgZGlmZl90eXBlWzFdID0gKERJRkZfVFlQRSlkYXRhOworICAgICAgfQorICAgIH0KKyAgICAvKiBIdWZmbWFuIGRlY29kaW5nICovCisgICAgZXJyID0gaHVmZl9kZWNvZGUoc3RybSwgcERhdGFWZWNbMF0sIHBEYXRhVmVjWzFdLCBkYXRhX3R5cGUsIGRpZmZfdHlwZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICBkaWZmX3R5cGVbMV0sIGRhdGFCYW5kcywgJmNkZ19zY2hlbWUsCisgICAgICAgICAgICAgICAgICAgICAgKERFQ09ERVIgPT0gU0FPQ19ERUNPREVSKSk7CisgICAgaWYgKGVyciAhPSBIVUZGREVDX09LKSB7CisgICAgICByZXR1cm4gSFVGRkRFQ19OT1RPSzsKKyAgICB9CisKKyAgICB7CisgICAgICAvKiBEaWZmZXJlbnRpYWwgZGVjb2RpbmcgKi8KKyAgICAgIGlmICgoZGlmZl90eXBlWzBdID09IERJRkZfVElNRSkgfHwgKGRpZmZfdHlwZVsxXSA9PSBESUZGX1RJTUUpKSB7CisgICAgICAgIGlmIChERUNPREVSID09IFNBT0NfREVDT0RFUikgeworICAgICAgICAgIGRpcmVjdGlvbiA9IEJBQ0tXQVJEUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAocGFpcl9mbGFnKSB7CisgICAgICAgICAgICBpZiAoKGRpZmZfdHlwZVswXSA9PSBESUZGX1RJTUUpICYmICFhbGxvd0RpZmZUaW1lQmFja19mbGFnKSB7CisgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IEZPUldBUkRTOworICAgICAgICAgICAgfSBlbHNlIGlmIChkaWZmX3R5cGVbMV0gPT0gRElGRl9USU1FKSB7CisgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IEJBQ0tXQVJEUzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGRhdGEgPSBGREtyZWFkQml0cyhzdHJtLCAxKTsKKyAgICAgICAgICAgICAgZGlyZWN0aW9uID0gKERJUkVDVElPTilkYXRhOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaXJlY3Rpb24gPSBCQUNLV0FSRFM7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIG1peGVkX3RpbWVfcGFpciA9IChkaWZmX3R5cGVbMF0gIT0gZGlmZl90eXBlWzFdKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChjZGdfc2NoZW1lICYgUEFJUl9NQVNLKSA9PSBUSU1FX1BBSVIpOworCisgICAgICBpZiAoZGlyZWN0aW9uID09IEJBQ0tXQVJEUykgeworICAgICAgICBpZiAoZGlmZl90eXBlWzBdID09IERJRkZfRlJFUSkgeworICAgICAgICAgIGRpZmZfZnJlcV9kZWNvZGUoYWFEYXRhRGlmZlswXSwgYWFEYXRhUGFpclswXSwgZGF0YUJhbmRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgIGFIaXN0b3J5TXNiW2ldID0gYUhpc3RvcnlbaSArIHN0YXJ0QmFuZF0gKyBxdWFudF9vZmZzZXQ7CisgICAgICAgICAgICBpZiAoYXR0YWNoTHNiX2ZsYWcpIHsKKyAgICAgICAgICAgICAgYUhpc3RvcnlNc2JbaV0gPj49IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGRpZmZfdGltZV9kZWNvZGVfYmFja3dhcmRzKGFIaXN0b3J5TXNiLCBhYURhdGFEaWZmWzBdLCBhYURhdGFQYWlyWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGVkX3RpbWVfcGFpciwgZGF0YUJhbmRzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGlmZl90eXBlWzFdID09IERJRkZfRlJFUSkgeworICAgICAgICAgIGRpZmZfZnJlcV9kZWNvZGUoYWFEYXRhRGlmZlsxXSwgYWFEYXRhUGFpclsxXSwgZGF0YUJhbmRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkaWZmX3RpbWVfZGVjb2RlX2JhY2t3YXJkcyhhYURhdGFQYWlyWzBdLCBhYURhdGFEaWZmWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhRGF0YVBhaXJbMV0sIG1peGVkX3RpbWVfcGFpciwgZGF0YUJhbmRzKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogZGlmZl90eXBlWzFdIE1VU1QgQkUgRElGRl9GUkVRICovCisgICAgICAgIGRpZmZfZnJlcV9kZWNvZGUoYWFEYXRhRGlmZlsxXSwgYWFEYXRhUGFpclsxXSwgZGF0YUJhbmRzKTsKKworICAgICAgICBpZiAoZGlmZl90eXBlWzBdID09IERJRkZfRlJFUSkgeworICAgICAgICAgIGRpZmZfZnJlcV9kZWNvZGUoYWFEYXRhRGlmZlswXSwgYWFEYXRhUGFpclswXSwgZGF0YUJhbmRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkaWZmX3RpbWVfZGVjb2RlX2ZvcndhcmRzKGFhRGF0YVBhaXJbMV0sIGFhRGF0YURpZmZbMF0sIGFhRGF0YVBhaXJbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlZF90aW1lX3BhaXIsIGRhdGFCYW5kcyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBMU0IgZGVjb2RpbmcgKi8KKyAgICBlcnIgPSBhdHRhY2hfbHNiKHN0cm0sIGFhRGF0YVBhaXJbMF0sIHF1YW50X29mZnNldCwgYXR0YWNoTHNiX2ZsYWcgPyAxIDogMCwKKyAgICAgICAgICAgICAgICAgICAgIGRhdGFCYW5kcywgYWFEYXRhUGFpclswXSk7CisgICAgaWYgKGVyciAhPSBIVUZGREVDX09LKSBnb3RvIGJhaWw7CisKKyAgICBpZiAocGFpcl9mbGFnKSB7CisgICAgICBlcnIgPSBhdHRhY2hfbHNiKHN0cm0sIGFhRGF0YVBhaXJbMV0sIHF1YW50X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoTHNiX2ZsYWcgPyAxIDogMCwgZGF0YUJhbmRzLCBhYURhdGFQYWlyWzFdKTsKKyAgICAgIGlmIChlcnIgIT0gSFVGRkRFQ19PSykgZ290byBiYWlsOworICAgIH0KKyAgfSAvKiBFbmQ6IERpZmZlcmVudGlhbC9IdWZmbWFuL0xTQiBDb2RpbmcgKi8KKworICAvKiBDb3B5IGRhdGEgdG8gb3V0cHV0IGFycmF5cyAqLworICBGREttZW1jcHkoYWFPdXREYXRhMSArIHN0YXJ0QmFuZCwgYWFEYXRhUGFpclswXSwgc2l6ZW9mKFNDSEFSKSAqIGRhdGFCYW5kcyk7CisgIGlmIChwYWlyX2ZsYWcpIHsKKyAgICBGREttZW1jcHkoYWFPdXREYXRhMiArIHN0YXJ0QmFuZCwgYWFEYXRhUGFpclsxXSwgc2l6ZW9mKFNDSEFSKSAqIGRhdGFCYW5kcyk7CisgIH0KKworYmFpbDoKKyAgcmV0dXJuIGVycjsKK30KKworRVJST1JfdCBodWZmX2RlY19yZXNoYXBlKEhBTkRMRV9GREtfQklUU1RSRUFNIHN0cm0sIGludCogb3V0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV92YWwpIHsKKyAgRVJST1JfdCBlcnIgPSBIVUZGREVDX09LOworICBpbnQgdmFsX3JjdmQgPSAwLCBkdW1teSA9IDAsIGkgPSAwLCB2YWwgPSAwLCBsZW4gPSAwOworICBTQ0hBUiBybF9kYXRhWzJdID0gezB9OworCisgIHdoaWxlICh2YWxfcmN2ZCA8IG51bV92YWwpIHsKKyAgICBlcnIgPSBodWZmX3JlYWRfMkQoc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgKEhBTkRMRV9IVUZGX05PREUpJkZES19odWZmUmVzaGFwZU5vZGVzLm5vZGVUYWJbMF1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgIHJsX2RhdGEsICZkdW1teSk7CisgICAgaWYgKGVyciAhPSBIVUZGREVDX09LKSBnb3RvIGJhaWw7CisgICAgdmFsID0gcmxfZGF0YVswXTsKKyAgICBsZW4gPSBybF9kYXRhWzFdICsgMTsKKyAgICBpZiAodmFsX3JjdmQgKyBsZW4gPiBudW1fdmFsKSB7CisgICAgICBlcnIgPSBIVUZGREVDX05PVE9LOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgICBmb3IgKGkgPSB2YWxfcmN2ZDsgaSA8IHZhbF9yY3ZkICsgbGVuOyBpKyspIHsKKyAgICAgIG91dF9kYXRhW2ldID0gdmFsOworICAgIH0KKyAgICB2YWxfcmN2ZCArPSBsZW47CisgIH0KK2JhaWw6CisgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9saWJGREsvc3JjL3FtZi5jcHAgYi9saWJGREsvc3JjL3FtZi5jcHAKaW5kZXggNTQ1MjZkZC4uNmZjYTA0MyAxMDA2NDQKLS0tIGEvbGliRkRLL3NyYy9xbWYuY3BwCisrKyBiL2xpYkZESy9zcmMvcW1mLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzMTcgKzkwLDEyOSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTGlicmFyeSBmb3IgYmFzaWMgY2FsY3VsYXRpb24gcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIE1hcmt1cyBMb2h3YXNzZXIsIEpvc2VmIEhvZXBmbCwgTWFudWVsIEphbmRlcgorCiAgICBEZXNjcmlwdGlvbjogUU1GIGZpbHRlcmJhbmsKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgQ29tcGxleCBxbWYgYW5hbHlzaXMvc3ludGhlc2lzLCAgCi0gIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBxbWYgZmlsdGVyYmFuayBmb3IgYW5hbHlzaXMgWyBjcGx4QW5hbHlzaXNRbWZGaWx0ZXJpbmcoKSBdIGFuZAotICBzeW50aGVzaXMgWyBjcGx4U3ludGhlc2lzUW1mRmlsdGVyaW5nKCkgXS4gSXQgaXMgYSBwb2x5cGhhc2UgaW1wbGVtZW50YXRpb24gb2YgYSBjb21wbGV4Ci0gIGV4cG9uZW50aWFsIG1vZHVsYXRlZCBmaWx0ZXIgYmFuay4gVGhlIGFuYWx5c2lzIHBhcnQgdXN1YWxseSBydW5zIGF0IGhhbGYgdGhlIHNhbXBsZSByYXRlCi0gIHRoYW4gdGhlIHN5bnRoZXNpcyBwYXJ0LiAoU28gY2FsbGVkICJkdWFsLXJhdGUiIG1vZGUuKQorICBcYnJpZWYgIENvbXBsZXggcW1mIGFuYWx5c2lzL3N5bnRoZXNpcworICBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgcW1mIGZpbHRlcmJhbmsgZm9yIGFuYWx5c2lzIFsKKyAgY3BseEFuYWx5c2lzUW1mRmlsdGVyaW5nKCkgXSBhbmQgc3ludGhlc2lzIFsgY3BseFN5bnRoZXNpc1FtZkZpbHRlcmluZygpIF0uIEl0CisgIGlzIGEgcG9seXBoYXNlIGltcGxlbWVudGF0aW9uIG9mIGEgY29tcGxleCBleHBvbmVudGlhbCBtb2R1bGF0ZWQgZmlsdGVyIGJhbmsuCisgIFRoZSBhbmFseXNpcyBwYXJ0IHVzdWFsbHkgcnVucyBhdCBoYWxmIHRoZSBzYW1wbGUgcmF0ZSB0aGFuIHRoZSBzeW50aGVzaXMKKyAgcGFydC4gKFNvIGNhbGxlZCAiZHVhbC1yYXRlIiBtb2RlLikKIAotICBUaGUgY29lZmZpY2llbnRzIG9mIHRoZSBwcm90b3R5cGUgZmlsdGVyIGFyZSBzcGVjaWZpZWQgaW4gI3Nicl9xbWZfNjRfNjQwIChpbiBzYnJfcm9tLmNwcCkuCi0gIFRodXMgb25seSBhIDY0IGNoYW5uZWwgdmVyc2lvbiAoMzIgb24gdGhlIGFuYWx5c2lzIHNpZGUpIHdpdGggYSA2NDAgdGFwIHByb3RvdHlwZSBmaWx0ZXIKLSAgYXJlIHVzZWQuCisgIFRoZSBjb2VmZmljaWVudHMgb2YgdGhlIHByb3RvdHlwZSBmaWx0ZXIgYXJlIHNwZWNpZmllZCBpbiAjcW1mX3BmaWx0NjQwIChpbgorICBzYnJfcm9tLmNwcCkuIFRodXMgb25seSBhIDY0IGNoYW5uZWwgdmVyc2lvbiAoMzIgb24gdGhlIGFuYWx5c2lzIHNpZGUpIHdpdGggYQorICA2NDAgdGFwIHByb3RvdHlwZSBmaWx0ZXIgYXJlIHVzZWQuCiAKICAgXGFuY2hvciBQb2x5cGhhc2VGaWx0ZXJpbmcgPGgyPkFib3V0IHBvbHlwaGFzZSBmaWx0ZXJpbmc8L2gyPgotICBUaGUgcG9seXBoYXNlIGltcGxlbWVudGF0aW9uIG9mIGEgZmlsdGVyYmFuayByZXF1aXJlcyBmaWx0ZXJpbmcgYXQgdGhlIGlucHV0IGFuZCBvdXRwdXQuCi0gIFRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgcGFydCBvZiBjcGx4QW5hbHlzaXNRbWZGaWx0ZXJpbmcoKSBhbmQgY3BseFN5bnRoZXNpc1FtZkZpbHRlcmluZygpLgotICBUaGUgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgaW4gYSBzcGVjaWZpYyBzdHJ1Y3R1cmUgYXMgZGVzY3JpYmVkIGluCi0gICNzYnJfcW1mXzY0XzY0MF9xbWYgKGluIHNicl9yb20uY3BwKS4KKyAgVGhlIHBvbHlwaGFzZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGZpbHRlcmJhbmsgcmVxdWlyZXMgZmlsdGVyaW5nIGF0IHRoZSBpbnB1dAorICBhbmQgb3V0cHV0LiBUaGlzIGlzIGltcGxlbWVudGVkIGFzIHBhcnQgb2YgY3BseEFuYWx5c2lzUW1mRmlsdGVyaW5nKCkgYW5kCisgIGNwbHhTeW50aGVzaXNRbWZGaWx0ZXJpbmcoKS4gVGhlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRoZSBmaWx0ZXIKKyAgY29lZmZpY2llbnRzIGluIGEgc3BlY2lmaWMgc3RydWN0dXJlIGFzIGRlc2NyaWJlZCBpbiAjc2JyX3FtZl82NF82NDBfcW1mIChpbgorICBzYnJfcm9tLmNwcCkuCiAKLSAgVGhpcyBtb2R1bGUgY29tcHJpc2VzIHRoZSBjb21wdXRhdGlvbmFsbHkgbW9zdCBleHBlbnNpdmUgZnVuY3Rpb25zIG9mIHRoZSBTQlIgZGVjb2Rlci4gVGhlIGFjY3VyYWN5IG9mCi0gIGNvbXB1dGF0aW9ucyBpcyBhbHNvIGltcG9ydGFudCBhbmQgaGFzIGEgZGlyZWN0IGltcGFjdCBvbiB0aGUgb3ZlcmFsbCBzb3VuZCBxdWFsaXR5LiBUaGVyZWZvcmUgYSBzcGVjaWFsCi0gIHRlc3QgcHJvZ3JhbSBpcyBhdmFpbGFibGUgd2hpY2ggY2FuIGJlIHVzZWQgdG8gb25seSB0ZXN0IHRoZSBmaWx0ZXJiYW5rOiBtYWluX2F1ZGlvLmNwcAorICBUaGlzIG1vZHVsZSBjb21wcmlzZXMgdGhlIGNvbXB1dGF0aW9uYWxseSBtb3N0IGV4cGVuc2l2ZSBmdW5jdGlvbnMgb2YgdGhlIFNCUgorICBkZWNvZGVyLiBUaGUgYWNjdXJhY3kgb2YgY29tcHV0YXRpb25zIGlzIGFsc28gaW1wb3J0YW50IGFuZCBoYXMgYSBkaXJlY3QKKyAgaW1wYWN0IG9uIHRoZSBvdmVyYWxsIHNvdW5kIHF1YWxpdHkuIFRoZXJlZm9yZSBhIHNwZWNpYWwgdGVzdCBwcm9ncmFtIGlzCisgIGF2YWlsYWJsZSB3aGljaCBjYW4gYmUgdXNlZCB0byBvbmx5IHRlc3QgdGhlIGZpbHRlcmJhbms6IG1haW5fYXVkaW8uY3BwCiAKLSAgVGhpcyBtb2R1bGVzIGFsc28gdXNlcyBzY2FsaW5nIG9mIGRhdGEgdG8gcHJvdmlkZSBiZXR0ZXIgU05SIG9uIGZpeGVkLXBvaW50IHByb2Nlc3NvcnMuIFNlZSAjUU1GX1NDQUxFX0ZBQ1RPUiAoaW4gc2JyX3NjYWxlLmgpIGZvciBkZXRhaWxzLgotICBBbiBpbnRlcmVzdGluZyBub3RlOiBUaGUgZnVuY3Rpb24gZ2V0U2NhbGVmYWN0b3IoKSBjYW4gY29uc3RpdHV0ZSBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBjb21wdXRhdGlvbmFsIGNvbXBsZXhpdHkgLSB2ZXJ5IG11Y2ggZGVwZW5kaW5nIG9uIHRoZQotICBiaXRyYXRlLiBTaW5jZSBpdCBpcyBhIHJhdGhlciBzbWFsbCBmdW5jdGlvbiwgZWZmZWN0aXZlIGFzc2VtYmxlciBvcHRpbWl6YXRpb24gbWlnaHQgYmUgcG9zc2libGUuCisgIFRoaXMgbW9kdWxlcyBhbHNvIHVzZXMgc2NhbGluZyBvZiBkYXRhIHRvIHByb3ZpZGUgYmV0dGVyIFNOUiBvbiBmaXhlZC1wb2ludAorICBwcm9jZXNzb3JzLiBTZWUgI1FNRl9TQ0FMRV9GQUNUT1IgKGluIHNicl9zY2FsZS5oKSBmb3IgZGV0YWlscy4gQW4gaW50ZXJlc3RpbmcKKyAgbm90ZTogVGhlIGZ1bmN0aW9uIGdldFNjYWxlZmFjdG9yKCkgY2FuIGNvbnN0aXR1dGUgYSBzaWduaWZpY2FudCBhbW91bnQgb2YKKyAgY29tcHV0YXRpb25hbCBjb21wbGV4aXR5IC0gdmVyeSBtdWNoIGRlcGVuZGluZyBvbiB0aGUgYml0cmF0ZS4gU2luY2UgaXQgaXMgYQorICByYXRoZXIgc21hbGwgZnVuY3Rpb24sIGVmZmVjdGl2ZSBhc3NlbWJsZXIgb3B0aW1pemF0aW9uIG1pZ2h0IGJlIHBvc3NpYmxlLgogCiAqLwogCiAjaW5jbHVkZSAicW1mLmgiCiAKLQorI2luY2x1ZGUgIkZES190cmlnRmN0cy5oIgogI2luY2x1ZGUgImZpeHBvaW50X21hdGguaCIKICNpbmNsdWRlICJkY3QuaCIKIAotI2lmZGVmIFFNRlNZTl9TVEFURVNfMTZCSVQKLSNkZWZpbmUgUVNTQ0FMRSAoNykKLSNkZWZpbmUgRlhfREJMMkZYX1FTUyh4KSAoKEZJWFBfUVNTKSAoKHgpPj4oREZSQUNUX0JJVFMtUVNTX0JJVFMtUVNTQ0FMRSkgKSkKLSNkZWZpbmUgRlhfUVNTMkZYX0RCTCh4KSAoKEZJWFBfREJMKSgoTE9ORyl4KTw8KERGUkFDVF9CSVRTLVFTU19CSVRTLVFTU0NBTEUpKQotI2Vsc2UKICNkZWZpbmUgUVNTQ0FMRSAoMCkKICNkZWZpbmUgRlhfREJMMkZYX1FTUyh4KSAoeCkKICNkZWZpbmUgRlhfUVNTMkZYX0RCTCh4KSAoeCkKLSNlbmRpZgogCi0KLSNpZiBkZWZpbmVkKF9fYXJtX18pCi0jaW5jbHVkZSAiYXJtL3FtZl9hcm0uY3BwIgotCi0jZW5kaWYKLQotLyohCi0gKiBcYnJpZWYgQWxnb3JpdGhtaWMgc2NhbGluZyBpbiBzYnJGb3J3YXJkTW9kdWxhdGlvbigpCi0gKgotICogVGhlIHNjYWxpbmcgaW4gc2JyRm9yd2FyZE1vZHVsYXRpb24oKSBpcyBjYXVzZWQgYnk6Ci0gKgotICogICBcbGkgMSBSX1NISUZUIGluIHNickZvcndhcmRNb2R1bGF0aW9uKCkKLSAqICAgXGxpIDUvNiBSX1NISUZUIGluIGRjdDMoKSBpZiB1c2luZyAzMi82NCBCYW5kcwotICogICBcbGkgMSBvbW1pdGVkIGdhaW4gb2YgMi4wIGluIHFtZkZvcndhcmRNb2R1bGF0aW9uKCkKLSAqLwotI2RlZmluZSBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX0FOQUxZU0lTX0ZJTFRFUkJBTksgNwotCi0vKiEKLSAqIFxicmllZiBBbGdvcml0aG1pYyBzY2FsaW5nIGluIGNwbHhTeW50aGVzaXNRbWZGaWx0ZXJpbmcoKQotICoKLSAqIFRoZSBzY2FsaW5nIGluIGNwbHhTeW50aGVzaXNRbWZGaWx0ZXJpbmcoKSBpcyBjYXVzZWQgYnk6Ci0gKgotICogICBcbGkgIDUvNiBSX1NISUZUIGluIGRjdDIoKSBpZiB1c2luZyAzMi82NCBCYW5kcwotICogICBcbGkgIDEgb21taXRlZCBnYWluIG9mIDIuMCBpbiBxbWZJbnZlcnNlTW9kdWxhdGlvbigpCi0gKiAgIFxsaSAtNiBkaXZpc2lvbiBieSA2NCBpbiBzeW50aGVzaXMgZmlsdGVyYmFuawotICogICBcbGkgeCBiaXRzIGV4dGVybmFsIGluZmx1ZW5jZQotICovCi0jZGVmaW5lIEFMR09SSVRITUlDX1NDQUxJTkdfSU5fU1lOVEhFU0lTX0ZJTFRFUkJBTksgMQotCi0KLS8qIQotICBcYnJpZWYgUGVyZm9ybSBTeW50aGVzaXMgUHJvdG90eXBlIEZpbHRlcmluZyBvbiBhIHNpbmdsZSBzbG90IG9mIGlucHV0IGRhdGEuCi0KLSAgVGhlIGZpbHRlciB0YWtlcyAyICogcW1mLT5ub19jaGFubmVscyBvZiBpbnB1dCBkYXRhIGFuZAotICBnZW5lcmF0ZXMgcW1mLT5ub19jaGFubmVscyB0aW1lIGRvbWFpbiBvdXRwdXQgc2FtcGxlcy4KLSovCi1zdGF0aWMKLSNpZm5kZWYgRlVOQ1RJT05fcW1mU3luUHJvdG90eXBlRmlyU2xvdAotdm9pZCBxbWZTeW5Qcm90b3R5cGVGaXJTbG90KAotI2Vsc2UKLXZvaWQgcW1mU3luUHJvdG90eXBlRmlyU2xvdF9mYWxsYmFjaygKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHFtZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKlJFU1RSSUNUIHJlYWxTbG90LCAgICAgICAgICAgIC8qITwgSW5wdXQ6IFBvaW50ZXIgdG8gcmVhbCBTbG90ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICpSRVNUUklDVCBpbWFnU2xvdCwgICAgICAgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIGltYWcgU2xvdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAqUkVTVFJJQ1QgdGltZU91dCwgICAgICAgICAgICAgLyohPCBUaW1lIGRvbWFpbiBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gIEZJWFBfUVNTKiBGaWx0ZXJTdGF0ZXMgPSAoRklYUF9RU1MqKXFtZi0+RmlsdGVyU3RhdGVzOwotICBpbnQgICAgICAgbm9fY2hhbm5lbHMgPSBxbWYtPm5vX2NoYW5uZWxzOwotICBjb25zdCBGSVhQX1BGVCAqcF9GaWx0ZXIgPSBxbWYtPnBfZmlsdGVyOwotICBpbnQgcF9zdHJpZGUgPSBxbWYtPnBfc3RyaWRlOwotICBpbnQgajsKLSAgRklYUF9RU1MgKlJFU1RSSUNUIHN0YSA9IEZpbHRlclN0YXRlczsKLSAgY29uc3QgRklYUF9QRlQgKlJFU1RSSUNUIHBfZmx0LCAqUkVTVFJJQ1QgcF9mbHRtOwotICBpbnQgc2NhbGUgPSAoKERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTKS0xLXFtZi0+b3V0U2NhbGVmYWN0b3IpOwotCi0gIHBfZmx0ICA9IHBfRmlsdGVyK3Bfc3RyaWRlKlFNRl9OT19QT0xZOyAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgIDUtdGVyIHZvbiAzMzAgKi8KLSAgcF9mbHRtID0gcF9GaWx0ZXIrKHFtZi0+RmlsdGVyU2l6ZS8yKS1wX3N0cmlkZSpRTUZfTk9fUE9MWTsgIC8qIDUgKyAoMzIwIC0gMio1KSA9IDMxNS10ZXIgdm9uIDMzMCAqLwotCi0gIEZES19BU1NFUlQoU0FNUExFX0JJVFMtMS1xbWYtPm91dFNjYWxlZmFjdG9yID49IDApOyAvLyAgIChERlJBQ1RfQklUUy1TQU1QTEVfQklUUyktMS1xbWYtPm91dFNjYWxlZmFjdG9yID49IDApOwotCi0gIGZvciAoaiA9IG5vX2NoYW5uZWxzLTE7IGogPj0gMDsgai0tKSB7ICAvKiAtLS0tIGzkdWZ0IHVlYmVyIGFsbGUgTGluaWVuIGVpbmVzIFNsb3RzIC0tLS0gKi8KLSAgICBGSVhQX1FNRiBpbWFnICA9ICBpbWFnU2xvdFtqXTsgIC8vIG5vX2NoYW5uZWxzLTEgLi4gMAotICAgIEZJWFBfUU1GIHJlYWwgID0gIHJlYWxTbG90W2pdOyAgLy8gfn4ifn4KLSAgICB7Ci0gICAgICBJTlRfUENNIHRtcDsKLSAgICAgIEZJWFBfREJMIEFyZSA9IEZYX1FTUzJGWF9EQkwoc3RhWzBdKSArIGZNdWx0RGl2MiggcF9mbHRtWzBdICwgcmVhbCk7Ci0KLSAgICAgIGlmIChxbWYtPm91dEdhaW4hPShGSVhQX0RCTCkweDgwMDAwMDAwKSB7Ci0gICAgICAgIEFyZSA9IGZNdWx0KEFyZSxxbWYtPm91dEdhaW4pOwotICAgICAgfQotCi0gICNpZiBTQU1QTEVfQklUUyA+IDE2Ci0gICAgICB0bXAgPSAoSU5UX1BDTSkoU0FUVVJBVEVfU0hJRlQoZkFicyhBcmUpLCBzY2FsZSwgU0FNUExFX0JJVFMpKTsKLSAgI2Vsc2UKLSAgICAgIHRtcCA9IChJTlRfUENNKShTQVRVUkFURV9SSUdIVF9TSElGVChmQWJzKEFyZSksIHNjYWxlLCBTQU1QTEVfQklUUykpOwotICAjZW5kaWYKLSAgICAgIGlmIChBcmUgPCAoRklYUF9RTUYpMCkgewotICAgICAgICB0bXAgPSAtdG1wOwotICAgICAgfQotICAgICAgdGltZU91dFsgKGopKnN0cmlkZSBdID0gdG1wOwotICAgIH0KLQotICAgIHN0YVswXSA9IHN0YVsxXSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKCBwX2ZsdCBbNF0gLCBpbWFnICkpOwotICAgIHN0YVsxXSA9IHN0YVsyXSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKCBwX2ZsdG1bMV0gLCByZWFsICkpOwotICAgIHN0YVsyXSA9IHN0YVszXSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKCBwX2ZsdCBbM10gLCBpbWFnICkpOwotICAgIHN0YVszXSA9IHN0YVs0XSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKCBwX2ZsdG1bMl0gLCByZWFsICkpOwotICAgIHN0YVs0XSA9IHN0YVs1XSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKCBwX2ZsdCBbMl0gLCBpbWFnICkpOwotICAgIHN0YVs1XSA9IHN0YVs2XSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKCBwX2ZsdG1bM10gLCByZWFsICkpOwotICAgIHN0YVs2XSA9IHN0YVs3XSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKCBwX2ZsdCBbMV0gLCBpbWFnICkpOwotICAgIHN0YVs3XSA9IHN0YVs4XSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKCBwX2ZsdG1bNF0gLCByZWFsICkpOwotICAgIHN0YVs4XSA9ICAgICAgICAgIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKCBwX2ZsdCBbMF0gLCBpbWFnICkpOwotCi0gICAgcF9mbHQgICs9IChwX3N0cmlkZSpRTUZfTk9fUE9MWSk7Ci0gICAgcF9mbHRtIC09IChwX3N0cmlkZSpRTUZfTk9fUE9MWSk7Ci0gICAgc3RhICAgICs9IDk7IC8vID0gKDIqUU1GX05PX1BPTFktMSk7Ci0gIH0KLX0KLQotI2lmbmRlZiBGVU5DVElPTl9xbWZTeW5Qcm90b3R5cGVGaXJTbG90X05vblN5bW1ldHJpYwotLyohCi0gIFxicmllZiBQZXJmb3JtIFN5bnRoZXNpcyBQcm90b3R5cGUgRmlsdGVyaW5nIG9uIGEgc2luZ2xlIHNsb3Qgb2YgaW5wdXQgZGF0YS4KLQotICBUaGUgZmlsdGVyIHRha2VzIDIgKiBxbWYtPm5vX2NoYW5uZWxzIG9mIGlucHV0IGRhdGEgYW5kCi0gIGdlbmVyYXRlcyBxbWYtPm5vX2NoYW5uZWxzIHRpbWUgZG9tYWluIG91dHB1dCBzYW1wbGVzLgotKi8KLXN0YXRpYwotdm9pZCBxbWZTeW5Qcm90b3R5cGVGaXJTbG90X05vblN5bW1ldHJpYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBxbWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICpSRVNUUklDVCByZWFsU2xvdCwgICAgICAgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIHJlYWwgU2xvdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqUkVTVFJJQ1QgaW1hZ1Nsb3QsICAgICAgICAgICAgLyohPCBJbnB1dDogUG9pbnRlciB0byBpbWFnIFNsb3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgKlJFU1RSSUNUIHRpbWVPdXQsICAgICAgICAgICAgIC8qITwgVGltZSBkb21haW4gZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgc3RyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICBGSVhQX1FTUyogRmlsdGVyU3RhdGVzID0gKEZJWFBfUVNTKilxbWYtPkZpbHRlclN0YXRlczsKLSAgaW50ICAgICAgIG5vX2NoYW5uZWxzID0gcW1mLT5ub19jaGFubmVsczsKLSAgY29uc3QgRklYUF9QRlQgKnBfRmlsdGVyID0gcW1mLT5wX2ZpbHRlcjsKLSAgaW50IHBfc3RyaWRlID0gcW1mLT5wX3N0cmlkZTsKLSAgaW50IGo7Ci0gIEZJWFBfUVNTICpSRVNUUklDVCBzdGEgPSBGaWx0ZXJTdGF0ZXM7Ci0gIGNvbnN0IEZJWFBfUEZUICpSRVNUUklDVCBwX2ZsdCwgKlJFU1RSSUNUIHBfZmx0bTsKLSAgaW50IHNjYWxlID0gKChERlJBQ1RfQklUUy1TQU1QTEVfQklUUyktMS1xbWYtPm91dFNjYWxlZmFjdG9yKTsKLQotICBwX2ZsdCAgPSBwX0ZpbHRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gZmlyc3QgaGFsZiBvZiBmaWx0ZXIgY29lZmZpY2llbnRzICovCi0gIHBfZmx0bSA9ICZwX2ZsdFtxbWYtPkZpbHRlclNpemUvMl07ICAvKiBhdCBpbmRleCAzMjAsIG92ZXJhbGwgNjQwIGNvZWZmaWNpZW50cyAqLwotCi0gIEZES19BU1NFUlQoU0FNUExFX0JJVFMtMS1xbWYtPm91dFNjYWxlZmFjdG9yID49IDApOyAvLyAgIChERlJBQ1RfQklUUy1TQU1QTEVfQklUUyktMS1xbWYtPm91dFNjYWxlZmFjdG9yID49IDApOwotCi0gIGZvciAoaiA9IG5vX2NoYW5uZWxzLTE7IGogPj0gMDsgai0tKSB7ICAvKiAtLS0tIGzkdWZ0IHVlYmVyIGFsbGUgTGluaWVuIGVpbmVzIFNsb3RzIC0tLS0gKi8KLQotICAgIEZJWFBfUU1GIGltYWcgID0gIGltYWdTbG90W2pdOyAgLy8gbm9fY2hhbm5lbHMtMSAuLiAwCi0gICAgRklYUF9RTUYgcmVhbCAgPSAgcmVhbFNsb3Rbal07ICAvLyB+fiJ+fgotICAgIHsKLSAgICAgIElOVF9QQ00gdG1wOwotICAgICAgRklYUF9RTUYgQXJlID0gc3RhWzBdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIoIHBfZmx0bVs0XSAsIHJlYWwgKSk7Ci0KLSAgI2lmIFNBTVBMRV9CSVRTID4gMTYKLSAgICAgIHRtcCA9IChJTlRfUENNKShTQVRVUkFURV9TSElGVChmQWJzKEFyZSksIHNjYWxlLCBTQU1QTEVfQklUUykpOwotICAjZWxzZQotICAgICAgdG1wID0gKElOVF9QQ00pKFNBVFVSQVRFX1JJR0hUX1NISUZUKGZBYnMoQXJlKSwgc2NhbGUsIFNBTVBMRV9CSVRTKSk7Ci0gICNlbmRpZgotICAgICAgaWYgKEFyZSA8IChGSVhQX1FNRikwKSB7Ci0gICAgICAgIHRtcCA9IC10bXA7Ci0gICAgICB9Ci0gICAgICB0aW1lT3V0W2oqc3RyaWRlXSA9IHRtcDsKLSAgICB9Ci0KLSAgICBzdGFbMF0gPSBzdGFbMV0gKyBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MiggcF9mbHQgWzRdICwgaW1hZyApKTsKLSAgICBzdGFbMV0gPSBzdGFbMl0gKyBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MiggcF9mbHRtWzNdICwgcmVhbCApKTsKLSAgICBzdGFbMl0gPSBzdGFbM10gKyBGWF9EQkwyRlhfUVNTKGZNdWx0RGl2MiggcF9mbHQgWzNdICwgaW1hZyApKTsKLQotICAgIHN0YVszXSA9IHN0YVs0XSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKCBwX2ZsdG1bMl0gLCByZWFsICkpOwotICAgIHN0YVs0XSA9IHN0YVs1XSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKCBwX2ZsdCBbMl0gLCBpbWFnICkpOwotICAgIHN0YVs1XSA9IHN0YVs2XSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKCBwX2ZsdG1bMV0gLCByZWFsICkpOwotICAgIHN0YVs2XSA9IHN0YVs3XSArIEZYX0RCTDJGWF9RU1MoZk11bHREaXYyKCBwX2ZsdCBbMV0gLCBpbWFnICkpOwotCi0gICAgc3RhWzddID0gc3RhWzhdICsgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIoIHBfZmx0bVswXSAsIHJlYWwgKSk7Ci0gICAgc3RhWzhdID0gICAgICAgICAgRlhfREJMMkZYX1FTUyhmTXVsdERpdjIoIHBfZmx0IFswXSAsIGltYWcgKSk7Ci0KLSAgICBwX2ZsdCAgKz0gKHBfc3RyaWRlKlFNRl9OT19QT0xZKTsKLSAgICBwX2ZsdG0gKz0gKHBfc3RyaWRlKlFNRl9OT19QT0xZKTsKLSAgICBzdGEgICAgKz0gOTsgLy8gPSAoMipRTUZfTk9fUE9MWS0xKTsKLSAgfQotCi19Ci0jZW5kaWYgLyogRlVOQ1RJT05fcW1mU3luUHJvdG90eXBlRmlyU2xvdF9Ob25TeW1tZXRyaWMgKi8KKy8qIG1vdmVkIHRvIHFtZl9wY20uaDogLT4gcW1mU3luUHJvdG90eXBlRmlyU2xvdCAqLworLyogbW92ZWQgdG8gcW1mX3BjbS5oOiAtPiBxbWZTeW5Qcm90b3R5cGVGaXJTbG90X05vblN5bW1ldHJpYyAqLworLyogbW92ZWQgdG8gcW1mX3BjbS5oOiAtPiBxbWZTeW50aGVzaXNGaWx0ZXJpbmdTbG90ICovCiAKICNpZm5kZWYgRlVOQ1RJT05fcW1mQW5hUHJvdG90eXBlRmlyU2xvdAogLyohCiAgIFxicmllZiBQZXJmb3JtIEFuYWx5c2lzIFByb3RvdHlwZSBGaWx0ZXJpbmcgb24gYSBzaW5nbGUgc2xvdCBvZiBpbnB1dCBkYXRhLgogKi8KLXN0YXRpYwotdm9pZCBxbWZBbmFQcm90b3R5cGVGaXJTbG90KCBGSVhQX1FNRiAqYW5hbHlzaXNCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBub19jaGFubmVscywgICAgICAgICAgICAgLyohPCBOdW1iZXIgY2hhbm5lbHMgb2YgYW5hbHlzaXMgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfUEZUICpwX2ZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIHBfc3RyaWRlLCAgICAgICAgICAgICAgICAvKiE8IFN0aWRlIG9mIGFuYWx5c2lzIGZpbHRlciAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FBUyAqUkVTVFJJQ1QgcEZpbHRlclN0YXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICBpbnQgazsKK3N0YXRpYyB2b2lkIHFtZkFuYVByb3RvdHlwZUZpclNsb3QoCisgICAgRklYUF9EQkwgKmFuYWx5c2lzQnVmZmVyLAorICAgIElOVCBub19jaGFubmVscywgLyohPCBOdW1iZXIgY2hhbm5lbHMgb2YgYW5hbHlzaXMgZmlsdGVyICovCisgICAgY29uc3QgRklYUF9QRlQgKnBfZmlsdGVyLCBJTlQgcF9zdHJpZGUsIC8qITwgU3RyaWRlIG9mIGFuYWx5c2lzIGZpbHRlciAgICAqLworICAgIEZJWFBfUUFTICpSRVNUUklDVCBwRmlsdGVyU3RhdGVzKSB7CisgIElOVCBrOwogCi0gICAgRklYUF9EQkwgYWNjdTsKLSAgICBjb25zdCBGSVhQX1BGVCAqUkVTVFJJQ1QgcF9mbHQgPSBwX2ZpbHRlcjsKLSAgICBGSVhQX1FNRiAqUkVTVFJJQ1QgcERhdGFfMCA9IGFuYWx5c2lzQnVmZmVyICsgMipub19jaGFubmVscyAtIDE7Ci0gICAgRklYUF9RTUYgKlJFU1RSSUNUIHBEYXRhXzEgPSBhbmFseXNpc0J1ZmZlcjsKKyAgRklYUF9EQkwgYWNjdTsKKyAgY29uc3QgRklYUF9QRlQgKlJFU1RSSUNUIHBfZmx0ID0gcF9maWx0ZXI7CisgIEZJWFBfREJMICpSRVNUUklDVCBwRGF0YV8wID0gYW5hbHlzaXNCdWZmZXIgKyAyICogbm9fY2hhbm5lbHMgLSAxOworICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERhdGFfMSA9IGFuYWx5c2lzQnVmZmVyOwogCi0gICAgRklYUF9RQVMgKlJFU1RSSUNUIHN0YV8wID0gKEZJWFBfUUFTICopcEZpbHRlclN0YXRlczsKLSAgICBGSVhQX1FBUyAqUkVTVFJJQ1Qgc3RhXzEgPSAoRklYUF9RQVMgKilwRmlsdGVyU3RhdGVzICsgKDIqUU1GX05PX1BPTFkqbm9fY2hhbm5lbHMpIC0gMTsKLSAgICBpbnQgcGZsdFN0ZXAgPSBRTUZfTk9fUE9MWSAqIChwX3N0cmlkZSk7Ci0gICAgaW50IHN0YVN0ZXAxID0gbm9fY2hhbm5lbHM8PDE7Ci0gICAgaW50IHN0YVN0ZXAyID0gKG5vX2NoYW5uZWxzPDwzKSAtIDE7IC8qIFJld2luZCBvbmUgbGVzcyAqLworICBGSVhQX1FBUyAqUkVTVFJJQ1Qgc3RhXzAgPSAoRklYUF9RQVMgKilwRmlsdGVyU3RhdGVzOworICBGSVhQX1FBUyAqUkVTVFJJQ1Qgc3RhXzEgPQorICAgICAgKEZJWFBfUUFTICopcEZpbHRlclN0YXRlcyArICgyICogUU1GX05PX1BPTFkgKiBub19jaGFubmVscykgLSAxOworICBJTlQgcGZsdFN0ZXAgPSBRTUZfTk9fUE9MWSAqIChwX3N0cmlkZSk7CisgIElOVCBzdGFTdGVwMSA9IG5vX2NoYW5uZWxzIDw8IDE7CisgIElOVCBzdGFTdGVwMiA9IChub19jaGFubmVscyA8PCAzKSAtIDE7IC8qIFJld2luZCBvbmUgbGVzcyAqLwogCi0gICAgLyogRklSIGZpbHRlciAwICovCi0gICAgYWNjdSA9ICAgZk11bHREaXYyKCBwX2ZsdFswXSwgKnN0YV8xKTsgIHN0YV8xIC09IHN0YVN0ZXAxOwotICAgIGFjY3UgKz0gIGZNdWx0RGl2MiggcF9mbHRbMV0sICpzdGFfMSk7ICBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICBhY2N1ICs9ICBmTXVsdERpdjIoIHBfZmx0WzJdLCAqc3RhXzEpOyAgc3RhXzEgLT0gc3RhU3RlcDE7Ci0gICAgYWNjdSArPSAgZk11bHREaXYyKCBwX2ZsdFszXSwgKnN0YV8xKTsgIHN0YV8xIC09IHN0YVN0ZXAxOwotICAgIGFjY3UgKz0gIGZNdWx0RGl2MiggcF9mbHRbNF0sICpzdGFfMSk7Ci0gICAgKnBEYXRhXzErKyA9IEZYX0RCTDJGWF9RTUYoYWNjdTw8MSk7CisgIC8qIEZJUiBmaWx0ZXJzIDEyNy4uNjQgMC4uNjMgKi8KKyAgZm9yIChrID0gMDsgayA8IG5vX2NoYW5uZWxzOyBrKyspIHsKKyAgICBhY2N1ID0gZk11bHREaXYyKHBfZmx0WzBdLCAqc3RhXzEpOworICAgIHN0YV8xIC09IHN0YVN0ZXAxOworICAgIGFjY3UgKz0gZk11bHREaXYyKHBfZmx0WzFdLCAqc3RhXzEpOworICAgIHN0YV8xIC09IHN0YVN0ZXAxOworICAgIGFjY3UgKz0gZk11bHREaXYyKHBfZmx0WzJdLCAqc3RhXzEpOworICAgIHN0YV8xIC09IHN0YVN0ZXAxOworICAgIGFjY3UgKz0gZk11bHREaXYyKHBfZmx0WzNdLCAqc3RhXzEpOworICAgIHN0YV8xIC09IHN0YVN0ZXAxOworICAgIGFjY3UgKz0gZk11bHREaXYyKHBfZmx0WzRdLCAqc3RhXzEpOworICAgICpwRGF0YV8xKysgPSAoYWNjdSA8PCAxKTsKICAgICBzdGFfMSArPSBzdGFTdGVwMjsKIAogICAgIHBfZmx0ICs9IHBmbHRTdGVwOwotCi0gICAgLyogRklSIGZpbHRlcnMgMS4uNjMgMTI3Li42NSAqLwotICAgIGZvciAoaz0wOyBrPG5vX2NoYW5uZWxzLTE7IGsrKykKLSAgICB7Ci0gICAgICBhY2N1ID0gIGZNdWx0RGl2MiggcF9mbHRbMF0sICpzdGFfMCk7ICBzdGFfMCArPSBzdGFTdGVwMTsKLSAgICAgIGFjY3UgKz0gZk11bHREaXYyKCBwX2ZsdFsxXSwgKnN0YV8wKTsgIHN0YV8wICs9IHN0YVN0ZXAxOwotICAgICAgYWNjdSArPSBmTXVsdERpdjIoIHBfZmx0WzJdLCAqc3RhXzApOyAgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgICBhY2N1ICs9IGZNdWx0RGl2MiggcF9mbHRbM10sICpzdGFfMCk7ICBzdGFfMCArPSBzdGFTdGVwMTsKLSAgICAgIGFjY3UgKz0gZk11bHREaXYyKCBwX2ZsdFs0XSwgKnN0YV8wKTsKLSAgICAgICpwRGF0YV8wLS0gPSBGWF9EQkwyRlhfUU1GKGFjY3U8PDEpOwotICAgICAgc3RhXzAgLT0gc3RhU3RlcDI7Ci0KLSAgICAgIGFjY3UgPSAgIGZNdWx0RGl2MiggcF9mbHRbMF0sICpzdGFfMSk7ICBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICAgIGFjY3UgKz0gIGZNdWx0RGl2MiggcF9mbHRbMV0sICpzdGFfMSk7ICBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICAgIGFjY3UgKz0gIGZNdWx0RGl2MiggcF9mbHRbMl0sICpzdGFfMSk7ICBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICAgIGFjY3UgKz0gIGZNdWx0RGl2MiggcF9mbHRbM10sICpzdGFfMSk7ICBzdGFfMSAtPSBzdGFTdGVwMTsKLSAgICAgIGFjY3UgKz0gIGZNdWx0RGl2MiggcF9mbHRbNF0sICpzdGFfMSk7Ci0gICAgICAqcERhdGFfMSsrID0gRlhfREJMMkZYX1FNRihhY2N1PDwxKTsKLSAgICAgIHN0YV8xICs9IHN0YVN0ZXAyOwotCi0gICAgICBwX2ZsdCArPSBwZmx0U3RlcDsKLSAgICB9Ci0KLSAgICAvKiBGSVIgZmlsdGVyIDY0ICovCi0gICAgYWNjdSA9ICBmTXVsdERpdjIoIHBfZmx0WzBdLCAqc3RhXzApOyAgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgYWNjdSArPSBmTXVsdERpdjIoIHBfZmx0WzFdLCAqc3RhXzApOyAgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgYWNjdSArPSBmTXVsdERpdjIoIHBfZmx0WzJdLCAqc3RhXzApOyAgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgYWNjdSArPSBmTXVsdERpdjIoIHBfZmx0WzNdLCAqc3RhXzApOyAgc3RhXzAgKz0gc3RhU3RlcDE7Ci0gICAgYWNjdSArPSBmTXVsdERpdjIoIHBfZmx0WzRdLCAqc3RhXzApOwotICAgICpwRGF0YV8wLS0gPSBGWF9EQkwyRlhfUU1GKGFjY3U8PDEpOworICAgIGFjY3UgPSBmTXVsdERpdjIocF9mbHRbMF0sICpzdGFfMCk7CisgICAgc3RhXzAgKz0gc3RhU3RlcDE7CisgICAgYWNjdSArPSBmTXVsdERpdjIocF9mbHRbMV0sICpzdGFfMCk7CisgICAgc3RhXzAgKz0gc3RhU3RlcDE7CisgICAgYWNjdSArPSBmTXVsdERpdjIocF9mbHRbMl0sICpzdGFfMCk7CisgICAgc3RhXzAgKz0gc3RhU3RlcDE7CisgICAgYWNjdSArPSBmTXVsdERpdjIocF9mbHRbM10sICpzdGFfMCk7CisgICAgc3RhXzAgKz0gc3RhU3RlcDE7CisgICAgYWNjdSArPSBmTXVsdERpdjIocF9mbHRbNF0sICpzdGFfMCk7CisgICAgKnBEYXRhXzAtLSA9IChhY2N1IDw8IDEpOwogICAgIHN0YV8wIC09IHN0YVN0ZXAyOworICB9CiB9CiAjZW5kaWYgLyogIWRlZmluZWQoRlVOQ1RJT05fcW1mQW5hUHJvdG90eXBlRmlyU2xvdCkgKi8KIAotCiAjaWZuZGVmIEZVTkNUSU9OX3FtZkFuYVByb3RvdHlwZUZpclNsb3RfTm9uU3ltbWV0cmljCiAvKiEKICAgXGJyaWVmIFBlcmZvcm0gQW5hbHlzaXMgUHJvdG90eXBlIEZpbHRlcmluZyBvbiBhIHNpbmdsZSBzbG90IG9mIGlucHV0IGRhdGEuCiAqLwotc3RhdGljCi12b2lkIHFtZkFuYVByb3RvdHlwZUZpclNsb3RfTm9uU3ltbWV0cmljKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICphbmFseXNpc0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9fY2hhbm5lbHMsICAgICAgICAgICAgIC8qITwgTnVtYmVyIGNoYW5uZWxzIG9mIGFuYWx5c2lzIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfUEZUICpwX2ZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgcF9zdHJpZGUsICAgICAgICAgICAgICAgIC8qITwgU3RpZGUgb2YgYW5hbHlzaXMgZmlsdGVyICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RQVMgKlJFU1RSSUNUIHBGaWx0ZXJTdGF0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKK3N0YXRpYyB2b2lkIHFtZkFuYVByb3RvdHlwZUZpclNsb3RfTm9uU3ltbWV0cmljKAorICAgIEZJWFBfREJMICphbmFseXNpc0J1ZmZlciwKKyAgICBpbnQgbm9fY2hhbm5lbHMsIC8qITwgTnVtYmVyIGNoYW5uZWxzIG9mIGFuYWx5c2lzIGZpbHRlciAqLworICAgIGNvbnN0IEZJWFBfUEZUICpwX2ZpbHRlciwgaW50IHBfc3RyaWRlLCAvKiE8IFN0cmlkZSBvZiBhbmFseXNpcyBmaWx0ZXIgICAgKi8KKyAgICBGSVhQX1FBUyAqUkVTVFJJQ1QgcEZpbHRlclN0YXRlcykgewogICBjb25zdCBGSVhQX1BGVCAqUkVTVFJJQ1QgcF9mbHQgPSBwX2ZpbHRlcjsKLSAgaW50ICBwLCBrOworICBpbnQgcCwgazsKIAotICBmb3IgKGsgPSAwOyBrIDwgMipub19jaGFubmVsczsgaysrKQotICB7CisgIGZvciAoayA9IDA7IGsgPCAyICogbm9fY2hhbm5lbHM7IGsrKykgewogICAgIEZJWFBfREJMIGFjY3UgPSAoRklYUF9EQkwpMDsKIAogICAgIHBfZmx0ICs9IFFNRl9OT19QT0xZICogKHBfc3RyaWRlIC0gMSk7CkBAIC0zOTgsOSArMjIxLDkgQEAKICAgICAgIFBlcmZvcm0gRklSLUZpbHRlcgogICAgICovCiAgICAgZm9yIChwID0gMDsgcCA8IFFNRl9OT19QT0xZOyBwKyspIHsKLSAgICAgIGFjY3UgKz0gIGZNdWx0RGl2MigqcF9mbHQrKywgcEZpbHRlclN0YXRlc1syKm5vX2NoYW5uZWxzICogcF0pOworICAgICAgYWNjdSArPSBmTXVsdERpdjIoKnBfZmx0KyssIHBGaWx0ZXJTdGF0ZXNbMiAqIG5vX2NoYW5uZWxzICogcF0pOwogICAgIH0KLSAgICBhbmFseXNpc0J1ZmZlclsyKm5vX2NoYW5uZWxzIC0gMSAtIGtdID0gRlhfREJMMkZYX1FNRihhY2N1PDwxKTsKKyAgICBhbmFseXNpc0J1ZmZlclsyICogbm9fY2hhbm5lbHMgLSAxIC0ga10gPSAoYWNjdSA8PCAxKTsKICAgICBwRmlsdGVyU3RhdGVzKys7CiAgIH0KIH0KQEAgLTQxMywyNCArMjM2LDI0IEBACiAgKiAgICAgICAgc2FtcGxlcyBpbiByU3ViYmFuZAogICoKICAqLwotc3RhdGljIHZvaWQKLXFtZkZvcndhcmRNb2R1bGF0aW9uTFBfZXZlbiggSEFORExFX1FNRl9GSUxURVJfQkFOSyBhbmFRbWYsIC8qITwgSGFuZGxlIG9mIFFtZiBBbmFseXNpcyBCYW5rICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqdGltZUluLCAgICAgICAgICAgICAgLyohPCBUaW1lIFNpZ25hbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqclN1YmJhbmQgKSAgICAgICAgICAgLyohPCBSZWFsIE91dHB1dCAqLworc3RhdGljIHZvaWQgcW1mRm9yd2FyZE1vZHVsYXRpb25MUF9ldmVuKAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgYW5hUW1mLCAvKiE8IEhhbmRsZSBvZiBRbWYgQW5hbHlzaXMgQmFuayAgKi8KKyAgICBGSVhQX0RCTCAqdGltZUluLCAgICAgICAgICAgICAgLyohPCBUaW1lIFNpZ25hbCAqLworICAgIEZJWFBfREJMICpyU3ViYmFuZCkgICAgICAgICAgICAvKiE8IFJlYWwgT3V0cHV0ICovCiB7CiAgIGludCBpOwogICBpbnQgTCA9IGFuYVFtZi0+bm9fY2hhbm5lbHM7Ci0gIGludCBNID0gTD4+MTsKKyAgaW50IE0gPSBMID4+IDE7CiAgIGludCBzY2FsZTsKLSAgRklYUF9RTUYgYWNjdTsKKyAgRklYUF9EQkwgYWNjdTsKIAotICBjb25zdCBGSVhQX1FNRiAqdGltZUluVG1wMSA9IChGSVhQX1FNRiAqKSAmdGltZUluWzMgKiBNXTsKLSAgY29uc3QgRklYUF9RTUYgKnRpbWVJblRtcDIgPSB0aW1lSW5UbXAxOwotICBGSVhQX1FNRiAqclN1YmJhbmRUbXAgPSByU3ViYmFuZDsKKyAgY29uc3QgRklYUF9EQkwgKnRpbWVJblRtcDEgPSAoRklYUF9EQkwgKikmdGltZUluWzMgKiBNXTsKKyAgY29uc3QgRklYUF9EQkwgKnRpbWVJblRtcDIgPSB0aW1lSW5UbXAxOworICBGSVhQX0RCTCAqclN1YmJhbmRUbXAgPSByU3ViYmFuZDsKIAogICByU3ViYmFuZFswXSA9IHRpbWVJblszICogTV0gPj4gMTsKIAotICBmb3IgKGkgPSBNLTE7IGkgIT0gMDsgaS0tKSB7CisgIGZvciAoaSA9IE0gLSAxOyBpICE9IDA7IGktLSkgewogICAgIGFjY3UgPSAoKCotLXRpbWVJblRtcDEpID4+IDEpICsgKCgqKyt0aW1lSW5UbXAyKSA+PiAxKTsKICAgICAqKytyU3ViYmFuZFRtcCA9IGFjY3U7CiAgIH0KQEAgLTQzOSw3ICsyNjIsNyBAQAogICB0aW1lSW5UbXAyID0gJnRpbWVJblswXTsKICAgclN1YmJhbmRUbXAgPSAmclN1YmJhbmRbTV07CiAKLSAgZm9yIChpID0gTC1NOyBpICE9IDA7IGktLSkgeworICBmb3IgKGkgPSBMIC0gTTsgaSAhPSAwOyBpLS0pIHsKICAgICBhY2N1ID0gKCgqdGltZUluVG1wMS0tKSA+PiAxKSAtICgoKnRpbWVJblRtcDIrKykgPj4gMSk7CiAgICAgKnJTdWJiYW5kVG1wKysgPSBhY2N1OwogICB9CkBAIC00NDgsMTY1ICsyNzEsMjQ2IEBACiB9CiAKICNpZiAhZGVmaW5lZChGVU5DVElPTl9xbWZGb3J3YXJkTW9kdWxhdGlvbkxQX29kZCkKLXN0YXRpYyB2b2lkCi1xbWZGb3J3YXJkTW9kdWxhdGlvbkxQX29kZCggSEFORExFX1FNRl9GSUxURVJfQkFOSyBhbmFRbWYsIC8qITwgSGFuZGxlIG9mIFFtZiBBbmFseXNpcyBCYW5rICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfUU1GICp0aW1lSW4sICAgICAgICAvKiE8IFRpbWUgU2lnbmFsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKnJTdWJiYW5kICkgICAgICAgICAgIC8qITwgUmVhbCBPdXRwdXQgKi8KK3N0YXRpYyB2b2lkIHFtZkZvcndhcmRNb2R1bGF0aW9uTFBfb2RkKAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgYW5hUW1mLCAvKiE8IEhhbmRsZSBvZiBRbWYgQW5hbHlzaXMgQmFuayAgKi8KKyAgICBjb25zdCBGSVhQX0RCTCAqdGltZUluLCAgICAgICAgLyohPCBUaW1lIFNpZ25hbCAqLworICAgIEZJWFBfREJMICpyU3ViYmFuZCkgICAgICAgICAgICAvKiE8IFJlYWwgT3V0cHV0ICovCiB7CiAgIGludCBpOwogICBpbnQgTCA9IGFuYVFtZi0+bm9fY2hhbm5lbHM7Ci0gIGludCBNID0gTD4+MTsKLSAgaW50IHNoaWZ0ID0gKGFuYVFtZi0+bm9fY2hhbm5lbHM+PjYpICsgMTsKKyAgaW50IE0gPSBMID4+IDE7CisgIGludCBzaGlmdCA9IChhbmFRbWYtPm5vX2NoYW5uZWxzID4+IDYpICsgMTsKIAogICBmb3IgKGkgPSAwOyBpIDwgTTsgaSsrKSB7Ci0gICAgclN1YmJhbmRbTSArIGldICAgICA9ICh0aW1lSW5bTCAtIDEgLSBpXT4+MSkgLSAodGltZUluW2ldPj5zaGlmdCk7Ci0gICAgclN1YmJhbmRbTSAtIDEgLSBpXSA9ICh0aW1lSW5bTCArIGldPj4xKSAgICAgKyAodGltZUluWzIgKiBMIC0gMSAtIGldPj5zaGlmdCk7CisgICAgclN1YmJhbmRbTSArIGldID0gKHRpbWVJbltMIC0gMSAtIGldID4+IDEpIC0gKHRpbWVJbltpXSA+PiBzaGlmdCk7CisgICAgclN1YmJhbmRbTSAtIDEgLSBpXSA9CisgICAgICAgICh0aW1lSW5bTCArIGldID4+IDEpICsgKHRpbWVJblsyICogTCAtIDEgLSBpXSA+PiBzaGlmdCk7CiAgIH0KIAogICBkY3RfSVYoclN1YmJhbmQsIEwsICZzaGlmdCk7CiB9CiAjZW5kaWYgLyogIWRlZmluZWQoRlVOQ1RJT05fcW1mRm9yd2FyZE1vZHVsYXRpb25MUF9vZGQpICovCiAKLQotCiAvKiEKICAqCiAgKiBcYnJpZWYgUGVyZm9ybSBjb21wbGV4LXZhbHVlZCBmb3J3YXJkIG1vZHVsYXRpb24gb2YgdGhlIHRpbWUgZG9tYWluCiAgKiAgICAgICAgZGF0YSBvZiB0aW1lSW4gYW5kIHN0b3JlcyB0aGUgcmVhbCBwYXJ0IG9mIHRoZSBzdWJiYW5kCiAgKiAgICAgICAgc2FtcGxlcyBpbiByU3ViYmFuZCwgYW5kIHRoZSBpbWFnaW5hcnkgcGFydCBpbiBpU3ViYmFuZAogICoKLSAqICAgICAgICBPbmx5IHRoZSBsb3dlciBiYW5kcyBhcmUgb2J0YWluZWQgKHVwdG8gYW5hUW1mLT5sc2IpLiBGb3IKLSAqICAgICAgICBhIGZ1bGwgYmFuZHdpZHRoIGFuYWx5c2lzIGl0IGlzIHJlcXVpcmVkIHRvIHNldCBib3RoIGFuYVFtZi0+bHNiCi0gKiAgICAgICAgYW5kIGFuYVFtZi0+dXNiIHRvIHRoZSBhbW91bnQgb2YgUU1GIGJhbmRzLgogICoKICAqLwotc3RhdGljIHZvaWQKLXFtZkZvcndhcmRNb2R1bGF0aW9uSFEoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgYW5hUW1mLCAgICAgLyohPCBIYW5kbGUgb2YgUW1mIEFuYWx5c2lzIEJhbmsgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1FNRiAqUkVTVFJJQ1QgdGltZUluLCAgIC8qITwgVGltZSBTaWduYWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICpSRVNUUklDVCByU3ViYmFuZCwgICAgICAgLyohPCBSZWFsIE91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKlJFU1RSSUNUIGlTdWJiYW5kICAgICAgICAvKiE8IEltYWdpbmFyeSBPdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKQoteworI2lmICFkZWZpbmVkKEZVTkNUSU9OX3FtZkZvcndhcmRNb2R1bGF0aW9uSFEpCitzdGF0aWMgdm9pZCBxbWZGb3J3YXJkTW9kdWxhdGlvbkhRKAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgYW5hUW1mLCAgIC8qITwgSGFuZGxlIG9mIFFtZiBBbmFseXNpcyBCYW5rICAqLworICAgIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCB0aW1lSW4sIC8qITwgVGltZSBTaWduYWwgKi8KKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgclN1YmJhbmQsICAgICAvKiE8IFJlYWwgT3V0cHV0ICovCisgICAgRklYUF9EQkwgKlJFU1RSSUNUIGlTdWJiYW5kICAgICAgLyohPCBJbWFnaW5hcnkgT3V0cHV0ICovCispIHsKICAgaW50IGk7CiAgIGludCBMID0gYW5hUW1mLT5ub19jaGFubmVsczsKLSAgaW50IEwyID0gTDw8MTsKKyAgaW50IEwyID0gTCA8PCAxOwogICBpbnQgc2hpZnQgPSAwOwogCi0gIGZvciAoaSA9IDA7IGkgPCBMOyBpKz0yKSB7Ci0gICAgRklYUF9RTUYgeDAsIHgxLCB5MCwgeTE7CisgIC8qIFRpbWUgYWR2YW5jZSBieSBvbmUgc2FtcGxlLCB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHRoZSBjb21wbGV4CisgICAgIHJvdGF0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGFuYWx5c2lzLiBXb3JrcyBvbmx5IGZvciBTVEQgbW9kZS4gKi8KKyAgaWYgKChMID09IDY0KSAmJiAhKGFuYVFtZi0+ZmxhZ3MgJiAoUU1GX0ZMQUdfQ0xERkIgfCBRTUZfRkxBR19NUFNMREZCKSkpIHsKKyAgICBGSVhQX0RCTCB4LCB5OwogCi0gICAgeDAgPSB0aW1lSW5baV0gPj4gMTsKLSAgICB4MSA9IHRpbWVJbltpKzFdID4+IDE7Ci0gICAgeTAgPSB0aW1lSW5bTDIgLSAxIC0gaV0gPj4gMTsKLSAgICB5MSA9IHRpbWVJbltMMiAtIDIgLSBpXSA+PiAxOworICAgIC8qclN1YmJhbmRbMF0gPSB1WzFdICsgdVswXSovCisgICAgLyppU3ViYmFuZFswXSA9IHVbMV0gLSB1WzBdKi8KKyAgICB4ID0gdGltZUluWzFdID4+IDE7CisgICAgeSA9IHRpbWVJblswXTsKKyAgICByU3ViYmFuZFswXSA9IHggKyAoeSA+PiAxKTsKKyAgICBpU3ViYmFuZFswXSA9IHggLSAoeSA+PiAxKTsKIAotICAgIHJTdWJiYW5kW2ldID0geDAgLSB5MDsKLSAgICByU3ViYmFuZFtpKzFdID0geDEgLSB5MTsKLSAgICBpU3ViYmFuZFtpXSA9IHgwICsgeTA7Ci0gICAgaVN1YmJhbmRbaSsxXSA9IHgxICsgeTE7CisgICAgLypyU3ViYmFuZFtuXSA9IHVbbisxXSAtIHVbMk0tbl0sIG49MSwuLi4sTS0xKi8KKyAgICAvKmlTdWJiYW5kW25dID0gdVtuKzFdICsgdVsyTS1uXSwgbj0xLC4uLixNLTEqLworICAgIGZvciAoaSA9IDE7IGkgPCBMOyBpKyspIHsKKyAgICAgIHggPSB0aW1lSW5baSArIDFdID4+IDE7IC8qdVtuKzFdICAqLworICAgICAgeSA9IHRpbWVJbltMMiAtIGldOyAgICAgLyp1WzJNLW5dICovCisgICAgICByU3ViYmFuZFtpXSA9IHggLSAoeSA+PiAxKTsKKyAgICAgIGlTdWJiYW5kW2ldID0geCArICh5ID4+IDEpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTDsgaSArPSAyKSB7CisgICAgICBGSVhQX0RCTCB4MCwgeDEsIHkwLCB5MTsKKworICAgICAgeDAgPSB0aW1lSW5baSArIDBdID4+IDE7CisgICAgICB4MSA9IHRpbWVJbltpICsgMV0gPj4gMTsKKyAgICAgIHkwID0gdGltZUluW0wyIC0gMSAtIGldOworICAgICAgeTEgPSB0aW1lSW5bTDIgLSAyIC0gaV07CisKKyAgICAgIHJTdWJiYW5kW2kgKyAwXSA9IHgwIC0gKHkwID4+IDEpOworICAgICAgclN1YmJhbmRbaSArIDFdID0geDEgLSAoeTEgPj4gMSk7CisgICAgICBpU3ViYmFuZFtpICsgMF0gPSB4MCArICh5MCA+PiAxKTsKKyAgICAgIGlTdWJiYW5kW2kgKyAxXSA9IHgxICsgKHkxID4+IDEpOworICAgIH0KICAgfQogCiAgIGRjdF9JVihyU3ViYmFuZCwgTCwgJnNoaWZ0KTsKICAgZHN0X0lWKGlTdWJiYW5kLCBMLCAmc2hpZnQpOwogCi0gIHsKLSAgICB7Ci0gICAgICBjb25zdCBGSVhQX1FUVyAqUkVTVFJJQ1Qgc2JyX3RfY29zOwotICAgICAgY29uc3QgRklYUF9RVFcgKlJFU1RSSUNUIHNicl90X3NpbjsKKyAgLyogRG8gdGhlIGNvbXBsZXggcm90YXRpb24gZXhjZXB0IGZvciB0aGUgY2FzZSBvZiA2NCBiYW5kcyAoaW4gU1REIG1vZGUpLiAqLworICBpZiAoKEwgIT0gNjQpIHx8IChhbmFRbWYtPmZsYWdzICYgKFFNRl9GTEFHX0NMREZCIHwgUU1GX0ZMQUdfTVBTTERGQikpKSB7CisgICAgaWYgKGFuYVFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19NUFNMREZCX09QVElNSVpFX01PRFVMQVRJT04pIHsKKyAgICAgIEZJWFBfREJMIGlCYW5kOworICAgICAgZm9yIChpID0gMDsgaSA8IGZNaW4oYW5hUW1mLT5sc2IsIEwpOyBpICs9IDIpIHsKKyAgICAgICAgaUJhbmQgPSByU3ViYmFuZFtpXTsKKyAgICAgICAgclN1YmJhbmRbaV0gPSAtaVN1YmJhbmRbaV07CisgICAgICAgIGlTdWJiYW5kW2ldID0gaUJhbmQ7CisKKyAgICAgICAgaUJhbmQgPSAtclN1YmJhbmRbaSArIDFdOworICAgICAgICByU3ViYmFuZFtpICsgMV0gPSBpU3ViYmFuZFtpICsgMV07CisgICAgICAgIGlTdWJiYW5kW2kgKyAxXSA9IGlCYW5kOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBGSVhQX1FUVyAqc2JyX3RfY29zOworICAgICAgY29uc3QgRklYUF9RVFcgKnNicl90X3NpbjsKKyAgICAgIGNvbnN0IGludCBsZW4gPSBMOyAvKiB3YXMgbGVuID0gZk1pbihhbmFRbWYtPmxzYiwgTCkgYnV0IGluIGNhc2Ugb2YgVVNBQworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzaWduYWwgYWJvdmUgbHNiIGlzIGFjdHVhbGx5IG5lZWRlZCBpbiBzb21lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZXMgKEhCRT8pICovCiAgICAgICBzYnJfdF9jb3MgPSBhbmFRbWYtPnRfY29zOwogICAgICAgc2JyX3Rfc2luID0gYW5hUW1mLT50X3NpbjsKIAotICAgICAgZm9yIChpID0gMDsgaSA8IGFuYVFtZi0+bHNiOyBpKyspIHsKLSAgICAgICAgY3BseE11bHQoJmlTdWJiYW5kW2ldLCAmclN1YmJhbmRbaV0sIGlTdWJiYW5kW2ldLCByU3ViYmFuZFtpXSwgc2JyX3RfY29zW2ldLCBzYnJfdF9zaW5baV0pOworICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIGNwbHhNdWx0KCZpU3ViYmFuZFtpXSwgJnJTdWJiYW5kW2ldLCBpU3ViYmFuZFtpXSwgclN1YmJhbmRbaV0sCisgICAgICAgICAgICAgICAgIHNicl90X2Nvc1tpXSwgc2JyX3Rfc2luW2ldKTsKICAgICAgIH0KICAgICB9CiAgIH0KIH0KKyNlbmRpZiAvKiBGVU5DVElPTl9xbWZGb3J3YXJkTW9kdWxhdGlvbkhRICovCiAKIC8qCiAgKiBcYnJpZWYgUGVyZm9ybSBvbmUgUU1GIHNsb3QgYW5hbHlzaXMgb2YgdGhlIHRpbWUgZG9tYWluIGRhdGEgb2YgdGltZUluCiAgKiAgICAgICAgd2l0aCBzcGVjaWZpZWQgc3RyaWRlIGFuZCBzdG9yZXMgdGhlIHJlYWwgcGFydCBvZiB0aGUgc3ViYmFuZAogICogICAgICAgIHNhbXBsZXMgaW4gclN1YmJhbmQsIGFuZCB0aGUgaW1hZ2luYXJ5IHBhcnQgaW4gaVN1YmJhbmQKICAqCi0gKiAgICAgICAgT25seSB0aGUgbG93ZXIgYmFuZHMgYXJlIG9idGFpbmVkICh1cHRvIGFuYVFtZi0+bHNiKS4gRm9yCi0gKiAgICAgICAgYSBmdWxsIGJhbmR3aWR0aCBhbmFseXNpcyBpdCBpcyByZXF1aXJlZCB0byBzZXQgYm90aCBhbmFRbWYtPmxzYgotICogICAgICAgIGFuZCBhbmFRbWYtPnVzYiB0byB0aGUgYW1vdW50IG9mIFFNRiBiYW5kcy4KKyAqICAgICAgICBOb3RlOiBhbmFRbWYtPmxzYiBjYW4gYmUgZ3JlYXRlciB0aGFuIGFuYVFtZi0+bm9fY2hhbm5lbHMgaW4gY2FzZQorICogICAgICAgIG9mIGltcGxpY2l0IHJlc2FtcGxpbmcgKFVTQUMgd2l0aCByZWR1Y2VkIDMvNCBjb3JlIGZyYW1lIGxlbmd0aCkuCiAgKi8KLXZvaWQKLXFtZkFuYWx5c2lzRmlsdGVyaW5nU2xvdCggSEFORExFX1FNRl9GSUxURVJfQkFOSyBhbmFRbWYsICAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAgICAgKnFtZlJlYWwsICAgICAgICAgLyohPCBMb3cgYW5kIEhpZ2ggYmFuZCwgcmVhbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAgICAgICpxbWZJbWFnLCAgICAgICAgIC8qITwgTG93IGFuZCBIaWdoIGJhbmQsIGltYWcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UX1BDTSAqUkVTVFJJQ1QgdGltZUluLCAvKiE8IFBvaW50ZXIgdG8gaW5wdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgc3RyaWRlLCAgICAgICAgICAvKiE8IHN0cmlkZSBmYWN0b3Igb2YgaW5wdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgICAgICAqcFdvcmtCdWZmZXIgICAgICAvKiE8IHBvaW50ZXIgdG8gdGVtcG9yYWwgd29ya2luZyBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IG9mZnNldCA9IGFuYVFtZi0+bm9fY2hhbm5lbHMqKFFNRl9OT19QT0xZKjItMSk7Ci0gICAgLyoKLSAgICAgIEZlZWQgdGltZSBzaWduYWwgaW50byBvbGRlc3QgYW5hUW1mLT5ub19jaGFubmVscyBzdGF0ZXMKLSAgICAqLwotICAgIHsKLSAgICAgIEZJWFBfUUFTICpSRVNUUklDVCBGaWx0ZXJTdGF0ZXNBbmFUbXAgPSAoKEZJWFBfUUFTKilhbmFRbWYtPkZpbHRlclN0YXRlcykrb2Zmc2V0OworI2lmIChTQU1QTEVfQklUUyAhPSBERlJBQ1RfQklUUykgJiYgKFFBU19CSVRTID09IERGUkFDVF9CSVRTKQordm9pZCBxbWZBbmFseXNpc0ZpbHRlcmluZ1Nsb3QoCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBhbmFRbWYsIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAgKi8KKyAgICBGSVhQX0RCTCAqcW1mUmVhbCwgICAgICAgICAgICAgLyohPCBMb3cgYW5kIEhpZ2ggYmFuZCwgcmVhbCAqLworICAgIEZJWFBfREJMICpxbWZJbWFnLCAgICAgICAgICAgICAvKiE8IExvdyBhbmQgSGlnaCBiYW5kLCBpbWFnICovCisgICAgY29uc3QgTE9ORyAqUkVTVFJJQ1QgdGltZUluLCAgIC8qITwgUG9pbnRlciB0byBpbnB1dCAqLworICAgIGNvbnN0IGludCBzdHJpZGUsICAgICAgICAgICAgICAvKiE8IHN0cmlkZSBmYWN0b3Igb2YgaW5wdXQgKi8KKyAgICBGSVhQX0RCTCAqcFdvcmtCdWZmZXIgICAgICAgICAgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFsIHdvcmtpbmcgYnVmZmVyICovCispIHsKKyAgaW50IG9mZnNldCA9IGFuYVFtZi0+bm9fY2hhbm5lbHMgKiAoUU1GX05PX1BPTFkgKiAyIC0gMSk7CisgIC8qCisgICAgRmVlZCB0aW1lIHNpZ25hbCBpbnRvIG9sZGVzdCBhbmFRbWYtPm5vX2NoYW5uZWxzIHN0YXRlcworICAqLworICB7CisgICAgRklYUF9EQkwgKkZpbHRlclN0YXRlc0FuYVRtcCA9ICgoRklYUF9EQkwgKilhbmFRbWYtPkZpbHRlclN0YXRlcykgKyBvZmZzZXQ7CiAKLSAgICAgIC8qIEZlZWQgYW5kIHNjYWxlIGFjdHVhbCB0aW1lIGluIHNsb3QgKi8KLSAgICAgIGZvcihpPWFuYVFtZi0+bm9fY2hhbm5lbHM+PjE7IGkhPTA7IGktLSkgewotICAgICAgICAvKiBQbGFjZSBJTlRfUENNIHZhbHVlIGxlZnQgYWxpZ25lZCBpbiBzY2FsZWRUaW1lSW4gKi8KLSNpZiAoUUFTX0JJVFM9PVNBTVBMRV9CSVRTKQotICAgICAgICAqRmlsdGVyU3RhdGVzQW5hVG1wKysgPSAoRklYUF9RQVMpKnRpbWVJbjsgdGltZUluICs9IHN0cmlkZTsKLSAgICAgICAgKkZpbHRlclN0YXRlc0FuYVRtcCsrID0gKEZJWFBfUUFTKSp0aW1lSW47IHRpbWVJbiArPSBzdHJpZGU7Ci0jZWxpZiAoUUFTX0JJVFM+U0FNUExFX0JJVFMpCi0gICAgICAgICpGaWx0ZXJTdGF0ZXNBbmFUbXArKyA9IChGSVhQX1FBUykoKCp0aW1lSW4pPDwoUUFTX0JJVFMtU0FNUExFX0JJVFMpKTsgdGltZUluICs9IHN0cmlkZTsKLSAgICAgICAgKkZpbHRlclN0YXRlc0FuYVRtcCsrID0gKEZJWFBfUUFTKSgoKnRpbWVJbik8PChRQVNfQklUUy1TQU1QTEVfQklUUykpOyB0aW1lSW4gKz0gc3RyaWRlOwotI2Vsc2UKLSAgICAgICAgKkZpbHRlclN0YXRlc0FuYVRtcCsrID0gKEZJWFBfUUFTKSgoKnRpbWVJbik+PihTQU1QTEVfQklUUy1RQVNfQklUUykpOyB0aW1lSW4gKz0gc3RyaWRlOwotICAgICAgICAqRmlsdGVyU3RhdGVzQW5hVG1wKysgPSAoRklYUF9RQVMpKCgqdGltZUluKT4+KFNBTVBMRV9CSVRTLVFBU19CSVRTKSk7IHRpbWVJbiArPSBzdHJpZGU7Ci0jZW5kaWYKLSAgICAgIH0KKyAgICAvKiBGZWVkIGFuZCBzY2FsZSBhY3R1YWwgdGltZSBpbiBzbG90ICovCisgICAgZm9yIChpbnQgaSA9IGFuYVFtZi0+bm9fY2hhbm5lbHMgPj4gMTsgaSAhPSAwOyBpLS0pIHsKKyAgICAgIC8qIFBsYWNlIElOVF9QQ00gdmFsdWUgbGVmdCBhbGlnbmVkIGluIHNjYWxlZFRpbWVJbiAqLworCisgICAgICAqRmlsdGVyU3RhdGVzQW5hVG1wKysgPSAoRklYUF9RQVMpKnRpbWVJbjsKKyAgICAgIHRpbWVJbiArPSBzdHJpZGU7CisgICAgICAqRmlsdGVyU3RhdGVzQW5hVG1wKysgPSAoRklYUF9RQVMpKnRpbWVJbjsKKyAgICAgIHRpbWVJbiArPSBzdHJpZGU7CiAgICAgfQorICB9CiAKLSAgICBpZiAoYW5hUW1mLT5mbGFncyAmIFFNRl9GTEFHX05PTlNZTU1FVFJJQykgewotICAgICAgcW1mQW5hUHJvdG90eXBlRmlyU2xvdF9Ob25TeW1tZXRyaWMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29ya0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYVFtZi0+bm9fY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmFRbWYtPnBfZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hUW1mLT5wX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1FBUyopYW5hUW1mLT5GaWx0ZXJTdGF0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIH0gZWxzZSB7Ci0gICAgICBxbWZBbmFQcm90b3R5cGVGaXJTbG90KCBwV29ya0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYVFtZi0+bm9fY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmFRbWYtPnBfZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hUW1mLT5wX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1FBUyopYW5hUW1mLT5GaWx0ZXJTdGF0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIH0KKyAgaWYgKGFuYVFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19OT05TWU1NRVRSSUMpIHsKKyAgICBxbWZBbmFQcm90b3R5cGVGaXJTbG90X05vblN5bW1ldHJpYyhwV29ya0J1ZmZlciwgYW5hUW1mLT5ub19jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmFRbWYtPnBfZmlsdGVyLCBhbmFRbWYtPnBfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1FBUyAqKWFuYVFtZi0+RmlsdGVyU3RhdGVzKTsKKyAgfSBlbHNlIHsKKyAgICBxbWZBbmFQcm90b3R5cGVGaXJTbG90KHBXb3JrQnVmZmVyLCBhbmFRbWYtPm5vX2NoYW5uZWxzLCBhbmFRbWYtPnBfZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hUW1mLT5wX3N0cmlkZSwgKEZJWFBfUUFTICopYW5hUW1mLT5GaWx0ZXJTdGF0ZXMpOworICB9CiAKLSAgICBpZiAoYW5hUW1mLT5mbGFncyAmIFFNRl9GTEFHX0xQKSB7Ci0gICAgICBpZiAoYW5hUW1mLT5mbGFncyAmIFFNRl9GTEFHX0NMREZCKQotICAgICAgICBxbWZGb3J3YXJkTW9kdWxhdGlvbkxQX29kZCggYW5hUW1mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbWZSZWFsICk7Ci0gICAgICBlbHNlCi0gICAgICAgIHFtZkZvcndhcmRNb2R1bGF0aW9uTFBfZXZlbiggYW5hUW1mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFtZlJlYWwgKTsKKyAgaWYgKGFuYVFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19MUCkgeworICAgIGlmIChhbmFRbWYtPmZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpCisgICAgICBxbWZGb3J3YXJkTW9kdWxhdGlvbkxQX29kZChhbmFRbWYsIHBXb3JrQnVmZmVyLCBxbWZSZWFsKTsKKyAgICBlbHNlCisgICAgICBxbWZGb3J3YXJkTW9kdWxhdGlvbkxQX2V2ZW4oYW5hUW1mLCBwV29ya0J1ZmZlciwgcW1mUmVhbCk7CiAKLSAgICB9IGVsc2UgewotICAgICAgcW1mRm9yd2FyZE1vZHVsYXRpb25IUSggYW5hUW1mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbWZSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW1mSW1hZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIH0KLSAgICAvKgotICAgICAgU2hpZnQgZmlsdGVyIHN0YXRlcworICB9IGVsc2UgeworICAgIHFtZkZvcndhcmRNb2R1bGF0aW9uSFEoYW5hUW1mLCBwV29ya0J1ZmZlciwgcW1mUmVhbCwgcW1mSW1hZyk7CisgIH0KKyAgLyoKKyAgICBTaGlmdCBmaWx0ZXIgc3RhdGVzCiAKLSAgICAgIFNob3VsZCBiZSByZWFsaXplZCB3aXRoIG1vZHVsbyBhZHJlc3Npbmcgb24gYSBEU1AgaW5zdGVhZCBvZiBhIHRydWUgYnVmZmVyIHNoaWZ0Ci0gICAgKi8KLSAgICBGREttZW1tb3ZlICgoRklYUF9RQVMqKWFuYVFtZi0+RmlsdGVyU3RhdGVzLCAoRklYUF9RQVMqKWFuYVFtZi0+RmlsdGVyU3RhdGVzK2FuYVFtZi0+bm9fY2hhbm5lbHMsIG9mZnNldCpzaXplb2YoRklYUF9RQVMpKTsKKyAgICBTaG91bGQgYmUgcmVhbGl6ZWQgd2l0aCBtb2R1bG8gYWRyZXNzaW5nIG9uIGEgRFNQIGluc3RlYWQgb2YgYSB0cnVlIGJ1ZmZlcgorICAgIHNoaWZ0CisgICovCisgIEZES21lbW1vdmUoYW5hUW1mLT5GaWx0ZXJTdGF0ZXMsCisgICAgICAgICAgICAgKEZJWFBfUUFTICopYW5hUW1mLT5GaWx0ZXJTdGF0ZXMgKyBhbmFRbWYtPm5vX2NoYW5uZWxzLAorICAgICAgICAgICAgIG9mZnNldCAqIHNpemVvZihGSVhQX1FBUykpOwogfQorI2VuZGlmCiAKK3ZvaWQgcW1mQW5hbHlzaXNGaWx0ZXJpbmdTbG90KAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgYW5hUW1mLCAgLyohPCBIYW5kbGUgb2YgUW1mIFN5bnRoZXNpcyBCYW5rICAqLworICAgIEZJWFBfREJMICpxbWZSZWFsLCAgICAgICAgICAgICAgLyohPCBMb3cgYW5kIEhpZ2ggYmFuZCwgcmVhbCAqLworICAgIEZJWFBfREJMICpxbWZJbWFnLCAgICAgICAgICAgICAgLyohPCBMb3cgYW5kIEhpZ2ggYmFuZCwgaW1hZyAqLworICAgIGNvbnN0IElOVF9QQ00gKlJFU1RSSUNUIHRpbWVJbiwgLyohPCBQb2ludGVyIHRvIGlucHV0ICovCisgICAgY29uc3QgaW50IHN0cmlkZSwgICAgICAgICAgICAgICAvKiE8IHN0cmlkZSBmYWN0b3Igb2YgaW5wdXQgKi8KKyAgICBGSVhQX0RCTCAqcFdvcmtCdWZmZXIgICAgICAgICAgIC8qITwgcG9pbnRlciB0byB0ZW1wb3JhbCB3b3JraW5nIGJ1ZmZlciAqLworKSB7CisgIGludCBvZmZzZXQgPSBhbmFRbWYtPm5vX2NoYW5uZWxzICogKFFNRl9OT19QT0xZICogMiAtIDEpOworICAvKgorICAgIEZlZWQgdGltZSBzaWduYWwgaW50byBvbGRlc3QgYW5hUW1mLT5ub19jaGFubmVscyBzdGF0ZXMKKyAgKi8KKyAgeworICAgIEZJWFBfUUFTICpGaWx0ZXJTdGF0ZXNBbmFUbXAgPSAoKEZJWFBfUUFTICopYW5hUW1mLT5GaWx0ZXJTdGF0ZXMpICsgb2Zmc2V0OworCisgICAgLyogRmVlZCBhbmQgc2NhbGUgYWN0dWFsIHRpbWUgaW4gc2xvdCAqLworICAgIGZvciAoaW50IGkgPSBhbmFRbWYtPm5vX2NoYW5uZWxzID4+IDE7IGkgIT0gMDsgaS0tKSB7CisgICAgLyogUGxhY2UgSU5UX1BDTSB2YWx1ZSBsZWZ0IGFsaWduZWQgaW4gc2NhbGVkVGltZUluICovCisjaWYgKFFBU19CSVRTID09IFNBTVBMRV9CSVRTKQorICAgICAgKkZpbHRlclN0YXRlc0FuYVRtcCsrID0gKEZJWFBfUUFTKSp0aW1lSW47CisgICAgICB0aW1lSW4gKz0gc3RyaWRlOworICAgICAgKkZpbHRlclN0YXRlc0FuYVRtcCsrID0gKEZJWFBfUUFTKSp0aW1lSW47CisgICAgICB0aW1lSW4gKz0gc3RyaWRlOworI2VsaWYgKFFBU19CSVRTID4gU0FNUExFX0JJVFMpCisgICAgICAqRmlsdGVyU3RhdGVzQW5hVG1wKysgPSAoKEZJWFBfUUFTKSp0aW1lSW4pIDw8IChRQVNfQklUUyAtIFNBTVBMRV9CSVRTKTsKKyAgICAgIHRpbWVJbiArPSBzdHJpZGU7CisgICAgICAqRmlsdGVyU3RhdGVzQW5hVG1wKysgPSAoKEZJWFBfUUFTKSp0aW1lSW4pIDw8IChRQVNfQklUUyAtIFNBTVBMRV9CSVRTKTsKKyAgICAgIHRpbWVJbiArPSBzdHJpZGU7CisjZWxzZQorICAgICAgKkZpbHRlclN0YXRlc0FuYVRtcCsrID0gKEZJWFBfUUFTKSgoKnRpbWVJbikgPj4gKFNBTVBMRV9CSVRTIC0gUUFTX0JJVFMpKTsKKyAgICAgIHRpbWVJbiArPSBzdHJpZGU7CisgICAgICAqRmlsdGVyU3RhdGVzQW5hVG1wKysgPSAoRklYUF9RQVMpKCgqdGltZUluKSA+PiAoU0FNUExFX0JJVFMgLSBRQVNfQklUUykpOworICAgICAgdGltZUluICs9IHN0cmlkZTsKKyNlbmRpZgorICAgIH0KKyAgfQorCisgIGlmIChhbmFRbWYtPmZsYWdzICYgUU1GX0ZMQUdfTk9OU1lNTUVUUklDKSB7CisgICAgcW1mQW5hUHJvdG90eXBlRmlyU2xvdF9Ob25TeW1tZXRyaWMocFdvcmtCdWZmZXIsIGFuYVFtZi0+bm9fY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hUW1mLT5wX2ZpbHRlciwgYW5hUW1mLT5wX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9RQVMgKilhbmFRbWYtPkZpbHRlclN0YXRlcyk7CisgIH0gZWxzZSB7CisgICAgcW1mQW5hUHJvdG90eXBlRmlyU2xvdChwV29ya0J1ZmZlciwgYW5hUW1mLT5ub19jaGFubmVscywgYW5hUW1mLT5wX2ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYVFtZi0+cF9zdHJpZGUsIChGSVhQX1FBUyAqKWFuYVFtZi0+RmlsdGVyU3RhdGVzKTsKKyAgfQorCisgIGlmIChhbmFRbWYtPmZsYWdzICYgUU1GX0ZMQUdfTFApIHsKKyAgICBpZiAoYW5hUW1mLT5mbGFncyAmIFFNRl9GTEFHX0NMREZCKQorICAgICAgcW1mRm9yd2FyZE1vZHVsYXRpb25MUF9vZGQoYW5hUW1mLCBwV29ya0J1ZmZlciwgcW1mUmVhbCk7CisgICAgZWxzZQorICAgICAgcW1mRm9yd2FyZE1vZHVsYXRpb25MUF9ldmVuKGFuYVFtZiwgcFdvcmtCdWZmZXIsIHFtZlJlYWwpOworCisgIH0gZWxzZSB7CisgICAgcW1mRm9yd2FyZE1vZHVsYXRpb25IUShhbmFRbWYsIHBXb3JrQnVmZmVyLCBxbWZSZWFsLCBxbWZJbWFnKTsKKyAgfQorICAvKgorICAgIFNoaWZ0IGZpbHRlciBzdGF0ZXMKKworICAgIFNob3VsZCBiZSByZWFsaXplZCB3aXRoIG1vZHVsbyBhZHJlc3Npbmcgb24gYSBEU1AgaW5zdGVhZCBvZiBhIHRydWUgYnVmZmVyCisgICAgc2hpZnQKKyAgKi8KKyAgRkRLbWVtbW92ZShhbmFRbWYtPkZpbHRlclN0YXRlcywKKyAgICAgICAgICAgICAoRklYUF9RQVMgKilhbmFRbWYtPkZpbHRlclN0YXRlcyArIGFuYVFtZi0+bm9fY2hhbm5lbHMsCisgICAgICAgICAgICAgb2Zmc2V0ICogc2l6ZW9mKEZJWFBfUUFTKSk7Cit9CiAKIC8qIQogICoKQEAgLTYxNyw0MCArNTIxLDY3IEBACiAgKiBzaHJpbmtpbmcgdGhlIGNvZWZmaWNpZW50IHRhYmxlIHRvIGhhbGYgdGhlIHNpemUuIFRoZSBhZGRyZXNzaW5nIG1vZGUKICAqIHRha2VzIGNhcmUgb2YgdGhlIHN5bW1ldHJpZXMuCiAgKgotICogT25seSB0aGUgbG93ZXIgYmFuZHMgYXJlIG9idGFpbmVkICh1cHRvIGFuYVFtZi0+bHNiKS4gRm9yCi0gKiBhIGZ1bGwgYmFuZHdpZHRoIGFuYWx5c2lzIGl0IGlzIHJlcXVpcmVkIHRvIHNldCBib3RoIGFuYVFtZi0+bHNiCi0gKiBhbmQgYW5hUW1mLT51c2IgdG8gdGhlIGFtb3VudCBvZiBRTUYgYmFuZHMuCiAgKgogICogXHNhIFBvbHlwaGFzZUZpbHRlcmluZwogICovCi0KLXZvaWQKLXFtZkFuYWx5c2lzRmlsdGVyaW5nKCBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGFuYVFtZiwgICAgLyohPCBIYW5kbGUgb2YgUW1mIEFuYWx5c2lzIEJhbmsgKi8KLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqKnFtZlJlYWwsICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHJlYWwgc3ViYmFuZCBzbG90cyAqLwotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICoqcW1mSW1hZywgICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gaW1hZyBzdWJiYW5kIHNsb3RzICovCi0gICAgICAgICAgICAgICAgICAgICAgUU1GX1NDQUxFX0ZBQ1RPUiAqc2NhbGVGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UX1BDTSAqdGltZUluLCAgICAgICAgICAgIC8qITwgVGltZSBzaWduYWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAgKnBXb3JrQnVmZmVyICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFsIHdvcmtpbmcgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgKQoteworI2lmIChTQU1QTEVfQklUUyAhPSBERlJBQ1RfQklUUykgJiYgKFFBU19CSVRTID09IERGUkFDVF9CSVRTKQordm9pZCBxbWZBbmFseXNpc0ZpbHRlcmluZygKKyAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGFuYVFtZiwgLyohPCBIYW5kbGUgb2YgUW1mIEFuYWx5c2lzIEJhbmsgKi8KKyAgICBGSVhQX0RCTCAqKnFtZlJlYWwsICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHJlYWwgc3ViYmFuZCBzbG90cyAqLworICAgIEZJWFBfREJMICoqcW1mSW1hZywgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gaW1hZyBzdWJiYW5kIHNsb3RzICovCisgICAgUU1GX1NDQUxFX0ZBQ1RPUiAqc2NhbGVGYWN0b3IsIGNvbnN0IExPTkcgKnRpbWVJbiwgLyohPCBUaW1lIHNpZ25hbCAqLworICAgIGNvbnN0IGludCB0aW1lSW5fZSwgY29uc3QgaW50IHN0cmlkZSwKKyAgICBGSVhQX0RCTCAqcFdvcmtCdWZmZXIgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFsIHdvcmtpbmcgYnVmZmVyICovCispIHsKICAgaW50IGk7CiAgIGludCBub19jaGFubmVscyA9IGFuYVFtZi0+bm9fY2hhbm5lbHM7CiAKLSAgc2NhbGVGYWN0b3ItPmxiX3NjYWxlID0gLUFMR09SSVRITUlDX1NDQUxJTkdfSU5fQU5BTFlTSVNfRklMVEVSQkFOSzsKKyAgc2NhbGVGYWN0b3ItPmxiX3NjYWxlID0KKyAgICAgIC1BTEdPUklUSE1JQ19TQ0FMSU5HX0lOX0FOQUxZU0lTX0ZJTFRFUkJBTksgLSB0aW1lSW5fZTsKICAgc2NhbGVGYWN0b3ItPmxiX3NjYWxlIC09IGFuYVFtZi0+ZmlsdGVyU2NhbGU7CiAKLSAgZm9yIChpID0gMDsgaSA8IGFuYVFtZi0+bm9fY29sOyBpKyspCi0gIHsKLSAgICAgIEZJWFBfUU1GICpxbWZJbWFnU2xvdCA9IE5VTEw7CisgIGZvciAoaSA9IDA7IGkgPCBhbmFRbWYtPm5vX2NvbDsgaSsrKSB7CisgICAgRklYUF9EQkwgKnFtZkltYWdTbG90ID0gTlVMTDsKIAotICAgICAgaWYgKCEoYW5hUW1mLT5mbGFncyAmIFFNRl9GTEFHX0xQKSkgewotICAgICAgICBxbWZJbWFnU2xvdCA9IHFtZkltYWdbaV07Ci0gICAgICB9CisgICAgaWYgKCEoYW5hUW1mLT5mbGFncyAmIFFNRl9GTEFHX0xQKSkgeworICAgICAgcW1mSW1hZ1Nsb3QgPSBxbWZJbWFnW2ldOworICAgIH0KIAotICAgICAgcW1mQW5hbHlzaXNGaWx0ZXJpbmdTbG90KCBhbmFRbWYsIHFtZlJlYWxbaV0sIHFtZkltYWdTbG90LCB0aW1lSW4gLCBzdHJpZGUsIHBXb3JrQnVmZmVyICk7CisgICAgcW1mQW5hbHlzaXNGaWx0ZXJpbmdTbG90KGFuYVFtZiwgcW1mUmVhbFtpXSwgcW1mSW1hZ1Nsb3QsIHRpbWVJbiwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29ya0J1ZmZlcik7CiAKLSAgICAgIHRpbWVJbiArPSBub19jaGFubmVscypzdHJpZGU7CisgICAgdGltZUluICs9IG5vX2NoYW5uZWxzICogc3RyaWRlOworCisgIH0gLyogbm9fY29sIGxvb3AgIGkgICovCit9CisjZW5kaWYKKwordm9pZCBxbWZBbmFseXNpc0ZpbHRlcmluZygKKyAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGFuYVFtZiwgLyohPCBIYW5kbGUgb2YgUW1mIEFuYWx5c2lzIEJhbmsgKi8KKyAgICBGSVhQX0RCTCAqKnFtZlJlYWwsICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHJlYWwgc3ViYmFuZCBzbG90cyAqLworICAgIEZJWFBfREJMICoqcW1mSW1hZywgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gaW1hZyBzdWJiYW5kIHNsb3RzICovCisgICAgUU1GX1NDQUxFX0ZBQ1RPUiAqc2NhbGVGYWN0b3IsIGNvbnN0IElOVF9QQ00gKnRpbWVJbiwgLyohPCBUaW1lIHNpZ25hbCAqLworICAgIGNvbnN0IGludCB0aW1lSW5fZSwgY29uc3QgaW50IHN0cmlkZSwKKyAgICBGSVhQX0RCTCAqcFdvcmtCdWZmZXIgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFsIHdvcmtpbmcgYnVmZmVyICovCispIHsKKyAgaW50IGk7CisgIGludCBub19jaGFubmVscyA9IGFuYVFtZi0+bm9fY2hhbm5lbHM7CisKKyAgc2NhbGVGYWN0b3ItPmxiX3NjYWxlID0KKyAgICAgIC1BTEdPUklUSE1JQ19TQ0FMSU5HX0lOX0FOQUxZU0lTX0ZJTFRFUkJBTksgLSB0aW1lSW5fZTsKKyAgc2NhbGVGYWN0b3ItPmxiX3NjYWxlIC09IGFuYVFtZi0+ZmlsdGVyU2NhbGU7CisKKyAgZm9yIChpID0gMDsgaSA8IGFuYVFtZi0+bm9fY29sOyBpKyspIHsKKyAgICBGSVhQX0RCTCAqcW1mSW1hZ1Nsb3QgPSBOVUxMOworCisgICAgaWYgKCEoYW5hUW1mLT5mbGFncyAmIFFNRl9GTEFHX0xQKSkgeworICAgICAgcW1mSW1hZ1Nsb3QgPSBxbWZJbWFnW2ldOworICAgIH0KKworICAgIHFtZkFuYWx5c2lzRmlsdGVyaW5nU2xvdChhbmFRbWYsIHFtZlJlYWxbaV0sIHFtZkltYWdTbG90LCB0aW1lSW4sIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIpOworCisgICAgdGltZUluICs9IG5vX2NoYW5uZWxzICogc3RyaWRlOwogCiAgIH0gLyogbm9fY29sIGxvb3AgIGkgICovCiB9CkBAIC02NjIsOTEgKzU5Myw4OCBAQAogICogICAgICAgIHBhcnQpIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiBwV29ya0J1ZmZlci4KICAqCiAgKi8KLWlubGluZQotc3RhdGljIHZvaWQKLXFtZkludmVyc2VNb2R1bGF0aW9uTFBfZXZlbiggSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsICAgLyohPCBIYW5kbGUgb2YgUW1mIFN5bnRoZXNpcyBCYW5rICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1FNRiAqcW1mUmVhbCwgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcW1mIHJlYWwgc3ViYmFuZCBzbG90IChpbnB1dCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgc2NhbGVGYWN0b3JMb3dCYW5kLCAgLyohPCBTY2FsZWZhY3RvciBmb3IgTG93IGJhbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgc2NhbGVGYWN0b3JIaWdoQmFuZCwgLyohPCBTY2FsZWZhY3RvciBmb3IgSGlnaCBiYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICpwVGltZU91dCAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBxbWYgc3ViYmFuZCBzbG90IChvdXRwdXQpKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKK2lubGluZSBzdGF0aWMgdm9pZCBxbWZJbnZlcnNlTW9kdWxhdGlvbkxQX2V2ZW4oCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAgKi8KKyAgICBjb25zdCBGSVhQX0RCTCAqcW1mUmVhbCwgLyohPCBQb2ludGVyIHRvIHFtZiByZWFsIHN1YmJhbmQgc2xvdCAoaW5wdXQpICovCisgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yTG93QmFuZCwgIC8qITwgU2NhbGVmYWN0b3IgZm9yIExvdyBiYW5kICovCisgICAgY29uc3QgaW50IHNjYWxlRmFjdG9ySGlnaEJhbmQsIC8qITwgU2NhbGVmYWN0b3IgZm9yIEhpZ2ggYmFuZCAqLworICAgIEZJWFBfREJMICpwVGltZU91dCAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcW1mIHN1YmJhbmQgc2xvdCAob3V0cHV0KSovCispIHsKICAgaW50IGk7CiAgIGludCBMID0gc3luUW1mLT5ub19jaGFubmVsczsKLSAgaW50IE0gPSBMPj4xOworICBpbnQgTSA9IEwgPj4gMTsKICAgaW50IHNjYWxlOwotICBGSVhQX1FNRiB0bXA7Ci0gIEZJWFBfUU1GICpSRVNUUklDVCB0UmVhbCA9IHBUaW1lT3V0OwotICBGSVhQX1FNRiAqUkVTVFJJQ1QgdEltYWcgPSBwVGltZU91dCArIEw7CisgIEZJWFBfREJMIHRtcDsKKyAgRklYUF9EQkwgKlJFU1RSSUNUIHRSZWFsID0gcFRpbWVPdXQ7CisgIEZJWFBfREJMICpSRVNUUklDVCB0SW1hZyA9IHBUaW1lT3V0ICsgTDsKIAogICAvKiBNb3ZlIGlucHV0IHRvIG91dHB1dCB2ZWN0b3Igd2l0aCBvZmZzZXQgKi8KLSAgc2NhbGVWYWx1ZXMoJnRSZWFsWzBdLCAgICAgICAgICAgICAmcW1mUmVhbFswXSwgICAgICAgICAgICAgc3luUW1mLT5sc2IsICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZCk7Ci0gIHNjYWxlVmFsdWVzKCZ0UmVhbFswK3N5blFtZi0+bHNiXSwgJnFtZlJlYWxbMCtzeW5RbWYtPmxzYl0sIHN5blFtZi0+dXNiLXN5blFtZi0+bHNiLCBzY2FsZUZhY3RvckhpZ2hCYW5kKTsKLSAgRkRLbWVtY2xlYXIoJnRSZWFsWzArc3luUW1mLT51c2JdLCAoTC1zeW5RbWYtPnVzYikqc2l6ZW9mKEZJWFBfUU1GKSk7CisgIHNjYWxlVmFsdWVzKCZ0UmVhbFswXSwgJnFtZlJlYWxbMF0sIHN5blFtZi0+bHNiLCAoaW50KXNjYWxlRmFjdG9yTG93QmFuZCk7CisgIHNjYWxlVmFsdWVzKCZ0UmVhbFswICsgc3luUW1mLT5sc2JdLCAmcW1mUmVhbFswICsgc3luUW1mLT5sc2JdLAorICAgICAgICAgICAgICBzeW5RbWYtPnVzYiAtIHN5blFtZi0+bHNiLCAoaW50KXNjYWxlRmFjdG9ySGlnaEJhbmQpOworICBGREttZW1jbGVhcigmdFJlYWxbMCArIHN5blFtZi0+dXNiXSwgKEwgLSBzeW5RbWYtPnVzYikgKiBzaXplb2YoRklYUF9EQkwpKTsKIAogICAvKiBEY3QgdHlwZS0yIHRyYW5zZm9ybSAqLwogICBkY3RfSUkodFJlYWwsIHRJbWFnLCBMLCAmc2NhbGUpOwogCiAgIC8qIEV4cGFuZCBvdXRwdXQgYW5kIHJlcGxhY2UgaW5wbGFjZSB0aGUgb3V0cHV0IGJ1ZmZlcnMgKi8KICAgdEltYWdbMF0gPSB0UmVhbFtNXTsKLSAgdEltYWdbTV0gPSAoRklYUF9RTUYpMDsKLSAgdG1wID0gdFJlYWwgWzBdOwotICB0UmVhbCBbMF0gPSB0UmVhbFtNXTsKLSAgdFJlYWwgW01dID0gdG1wOworICB0SW1hZ1tNXSA9IChGSVhQX0RCTCkwOworICB0bXAgPSB0UmVhbFswXTsKKyAgdFJlYWxbMF0gPSB0UmVhbFtNXTsKKyAgdFJlYWxbTV0gPSB0bXA7CiAKLSAgZm9yIChpID0gMTsgaSA8IE0vMjsgaSsrKSB7CisgIGZvciAoaSA9IDE7IGkgPCBNIC8gMjsgaSsrKSB7CiAgICAgLyogSW1hZyAqLwogICAgIHRtcCA9IHRSZWFsW0wgLSBpXTsKLSAgICB0SW1hZ1tNIC0gaV0gPSAgdG1wOworICAgIHRJbWFnW00gLSBpXSA9IHRtcDsKICAgICB0SW1hZ1tpICsgTV0gPSAtdG1wOwogCiAgICAgdG1wID0gdFJlYWxbTSArIGldOwotICAgIHRJbWFnW2ldID0gIHRtcDsKKyAgICB0SW1hZ1tpXSA9IHRtcDsKICAgICB0SW1hZ1tMIC0gaV0gPSAtdG1wOwogCiAgICAgLyogUmVhbCAqLwotICAgIHRSZWFsIFtNICsgaV0gPSB0UmVhbFtpXTsKLSAgICB0UmVhbCBbTCAtIGldID0gdFJlYWxbTSAtIGldOworICAgIHRSZWFsW00gKyBpXSA9IHRSZWFsW2ldOworICAgIHRSZWFsW0wgLSBpXSA9IHRSZWFsW00gLSBpXTsKICAgICB0bXAgPSB0UmVhbFtpXTsKLSAgICB0UmVhbFtpXSA9IHRSZWFsIFtNIC0gaV07Ci0gICAgdFJlYWwgW00gLSBpXSA9IHRtcDsKLQorICAgIHRSZWFsW2ldID0gdFJlYWxbTSAtIGldOworICAgIHRSZWFsW00gLSBpXSA9IHRtcDsKICAgfQogICAvKiBSZW1haW5pbmcgb2RkIHRlcm1zICovCi0gIHRtcCA9IHRSZWFsW00gKyBNLzJdOwotICB0SW1hZ1tNLzJdICAgICA9ICB0bXA7Ci0gIHRJbWFnW00vMiArIE1dID0gLXRtcDsKKyAgdG1wID0gdFJlYWxbTSArIE0gLyAyXTsKKyAgdEltYWdbTSAvIDJdID0gdG1wOworICB0SW1hZ1tNIC8gMiArIE1dID0gLXRtcDsKIAotICB0UmVhbCBbTSArIE0vMl0gPSB0UmVhbFtNLzJdOworICB0UmVhbFtNICsgTSAvIDJdID0gdFJlYWxbTSAvIDJdOwogfQogCi1pbmxpbmUKLXN0YXRpYyB2b2lkCi1xbWZJbnZlcnNlTW9kdWxhdGlvbkxQX29kZCggSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsICAgLyohPCBIYW5kbGUgb2YgUW1mIFN5bnRoZXNpcyBCYW5rICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfUU1GICpxbWZSZWFsLCAgICAgICAgIC8qITwgUG9pbnRlciB0byBxbWYgcmVhbCBzdWJiYW5kIHNsb3QgKGlucHV0KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZUZhY3Rvckxvd0JhbmQsICAgIC8qITwgU2NhbGVmYWN0b3IgZm9yIExvdyBiYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNjYWxlRmFjdG9ySGlnaEJhbmQsICAgLyohPCBTY2FsZWZhY3RvciBmb3IgSGlnaCBiYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKnBUaW1lT3V0ICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHFtZiBzdWJiYW5kIHNsb3QgKG91dHB1dCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CitpbmxpbmUgc3RhdGljIHZvaWQgcW1mSW52ZXJzZU1vZHVsYXRpb25MUF9vZGQoCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAgKi8KKyAgICBjb25zdCBGSVhQX0RCTCAqcW1mUmVhbCwgLyohPCBQb2ludGVyIHRvIHFtZiByZWFsIHN1YmJhbmQgc2xvdCAoaW5wdXQpICovCisgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yTG93QmFuZCwgIC8qITwgU2NhbGVmYWN0b3IgZm9yIExvdyBiYW5kICovCisgICAgY29uc3QgaW50IHNjYWxlRmFjdG9ySGlnaEJhbmQsIC8qITwgU2NhbGVmYWN0b3IgZm9yIEhpZ2ggYmFuZCAqLworICAgIEZJWFBfREJMICpwVGltZU91dCAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcW1mIHN1YmJhbmQgc2xvdCAob3V0cHV0KSovCispIHsKICAgaW50IGk7CiAgIGludCBMID0gc3luUW1mLT5ub19jaGFubmVsczsKLSAgaW50IE0gPSBMPj4xOworICBpbnQgTSA9IEwgPj4gMTsKICAgaW50IHNoaWZ0ID0gMDsKIAogICAvKiBNb3ZlIGlucHV0IHRvIG91dHB1dCB2ZWN0b3Igd2l0aCBvZmZzZXQgKi8KLSAgc2NhbGVWYWx1ZXMocFRpbWVPdXQrTSwgICAgICAgICAgICAgIHFtZlJlYWwsICAgICAgICAgICAgIHN5blFtZi0+bHNiLCAgICAgICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmQpOwotICBzY2FsZVZhbHVlcyhwVGltZU91dCtNK3N5blFtZi0+bHNiLCAgcW1mUmVhbCtzeW5RbWYtPmxzYiwgc3luUW1mLT51c2Itc3luUW1mLT5sc2IsIHNjYWxlRmFjdG9ySGlnaEJhbmQpOwotICBGREttZW1jbGVhcihwVGltZU91dCtNK3N5blFtZi0+dXNiLCAoTC1zeW5RbWYtPnVzYikqc2l6ZW9mKEZJWFBfUU1GKSk7CisgIHNjYWxlVmFsdWVzKHBUaW1lT3V0ICsgTSwgcW1mUmVhbCwgc3luUW1mLT5sc2IsIHNjYWxlRmFjdG9yTG93QmFuZCk7CisgIHNjYWxlVmFsdWVzKHBUaW1lT3V0ICsgTSArIHN5blFtZi0+bHNiLCBxbWZSZWFsICsgc3luUW1mLT5sc2IsCisgICAgICAgICAgICAgIHN5blFtZi0+dXNiIC0gc3luUW1mLT5sc2IsIHNjYWxlRmFjdG9ySGlnaEJhbmQpOworICBGREttZW1jbGVhcihwVGltZU91dCArIE0gKyBzeW5RbWYtPnVzYiwgKEwgLSBzeW5RbWYtPnVzYikgKiBzaXplb2YoRklYUF9EQkwpKTsKIAotICBkY3RfSVYocFRpbWVPdXQrTSwgTCwgJnNoaWZ0KTsKKyAgZGN0X0lWKHBUaW1lT3V0ICsgTSwgTCwgJnNoaWZ0KTsKICAgZm9yIChpID0gMDsgaSA8IE07IGkrKykgewotICAgIHBUaW1lT3V0W2ldICAgICAgICAgICAgID0gIHBUaW1lT3V0W0wgLSAxIC0gaV07CisgICAgcFRpbWVPdXRbaV0gPSBwVGltZU91dFtMIC0gMSAtIGldOwogICAgIHBUaW1lT3V0WzIgKiBMIC0gMSAtIGldID0gLXBUaW1lT3V0W0wgKyBpXTsKICAgfQogfQogCi0KKyNpZm5kZWYgRlVOQ1RJT05fcW1mSW52ZXJzZU1vZHVsYXRpb25IUQogLyohCiAgKgogICogXGJyaWVmIFBlcmZvcm0gY29tcGxleC12YWx1ZWQgaW52ZXJzZSBtb2R1bGF0aW9uIG9mIHRoZSBzdWJiYW5kCkBAIC03NTQsMjA4ICs2ODIsODQgQEAKICAqICAgICAgICBwYXJ0KSBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gcFdvcmtCdWZmZXIuCiAgKgogICovCi1pbmxpbmUKLXN0YXRpYyB2b2lkCi1xbWZJbnZlcnNlTW9kdWxhdGlvbkhRKCBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHN5blFtZiwgIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfUU1GICpxbWZSZWFsLCAgICAgICAgLyohPCBQb2ludGVyIHRvIHFtZiByZWFsIHN1YmJhbmQgc2xvdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9RTUYgKnFtZkltYWcsICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcW1mIGltYWcgc3ViYmFuZCBzbG90ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICBzY2FsZUZhY3Rvckxvd0JhbmQsIC8qITwgU2NhbGVmYWN0b3IgZm9yIExvdyBiYW5kICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgIHNjYWxlRmFjdG9ySGlnaEJhbmQsLyohPCBTY2FsZWZhY3RvciBmb3IgSGlnaCBiYW5kICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgICpwV29ya0J1ZmZlciAgICAgICAgICAvKiE8IFdvcmtCdWZmZXIgKG91dHB1dCkgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgKQoteworaW5saW5lIHN0YXRpYyB2b2lkIHFtZkludmVyc2VNb2R1bGF0aW9uSFEoCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAgICAgKi8KKyAgICBjb25zdCBGSVhQX0RCTCAqcW1mUmVhbCwgICAgICAgLyohPCBQb2ludGVyIHRvIHFtZiByZWFsIHN1YmJhbmQgc2xvdCAqLworICAgIGNvbnN0IEZJWFBfREJMICpxbWZJbWFnLCAgICAgICAvKiE8IFBvaW50ZXIgdG8gcW1mIGltYWcgc3ViYmFuZCBzbG90ICovCisgICAgY29uc3QgaW50IHNjYWxlRmFjdG9yTG93QmFuZCwgIC8qITwgU2NhbGVmYWN0b3IgZm9yIExvdyBiYW5kICAgICAgICAgKi8KKyAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JIaWdoQmFuZCwgLyohPCBTY2FsZWZhY3RvciBmb3IgSGlnaCBiYW5kICAgICAgICAqLworICAgIEZJWFBfREJMICpwV29ya0J1ZmZlciAgICAgICAgICAvKiE8IFdvcmtCdWZmZXIgKG91dHB1dCkgICAgICAgICAgICAgICovCispIHsKICAgaW50IGk7CiAgIGludCBMID0gc3luUW1mLT5ub19jaGFubmVsczsKLSAgaW50IE0gPSBMPj4xOworICBpbnQgTSA9IEwgPj4gMTsKICAgaW50IHNoaWZ0ID0gMDsKLSAgRklYUF9RTUYgKlJFU1RSSUNUIHRSZWFsID0gcFdvcmtCdWZmZXI7Ci0gIEZJWFBfUU1GICpSRVNUUklDVCB0SW1hZyA9IHBXb3JrQnVmZmVyK0w7CisgIEZJWFBfREJMICpSRVNUUklDVCB0UmVhbCA9IHBXb3JrQnVmZmVyOworICBGSVhQX0RCTCAqUkVTVFJJQ1QgdEltYWcgPSBwV29ya0J1ZmZlciArIEw7CiAKLSAgaWYgKHN5blFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19DTERGQil7CisgIGlmIChzeW5RbWYtPmZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpIHsKICAgICBmb3IgKGkgPSAwOyBpIDwgc3luUW1mLT5sc2I7IGkrKykgewotICAgICAgY3BseE11bHQoJnRJbWFnW2ldLCAmdFJlYWxbaV0sCi0gICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShxbWZJbWFnW2ldLHNjYWxlRmFjdG9yTG93QmFuZCksIHNjYWxlVmFsdWUocW1mUmVhbFtpXSxzY2FsZUZhY3Rvckxvd0JhbmQpLAotICAgICAgICAgICAgICAgIHN5blFtZi0+dF9jb3NbaV0sIHN5blFtZi0+dF9zaW5baV0pOworICAgICAgY3BseE11bHQoJnRJbWFnW2ldLCAmdFJlYWxbaV0sIHNjYWxlVmFsdWUocW1mSW1hZ1tpXSwgc2NhbGVGYWN0b3JMb3dCYW5kKSwKKyAgICAgICAgICAgICAgIHNjYWxlVmFsdWUocW1mUmVhbFtpXSwgc2NhbGVGYWN0b3JMb3dCYW5kKSwgc3luUW1mLT50X2Nvc1tpXSwKKyAgICAgICAgICAgICAgIHN5blFtZi0+dF9zaW5baV0pOwogICAgIH0KICAgICBmb3IgKDsgaSA8IHN5blFtZi0+dXNiOyBpKyspIHsKICAgICAgIGNwbHhNdWx0KCZ0SW1hZ1tpXSwgJnRSZWFsW2ldLAotICAgICAgICAgICAgICAgIHNjYWxlVmFsdWUocW1mSW1hZ1tpXSxzY2FsZUZhY3RvckhpZ2hCYW5kKSwgc2NhbGVWYWx1ZShxbWZSZWFsW2ldLHNjYWxlRmFjdG9ySGlnaEJhbmQpLAotICAgICAgICAgICAgICAgIHN5blFtZi0+dF9jb3NbaV0sIHN5blFtZi0+dF9zaW5baV0pOworICAgICAgICAgICAgICAgc2NhbGVWYWx1ZShxbWZJbWFnW2ldLCBzY2FsZUZhY3RvckhpZ2hCYW5kKSwKKyAgICAgICAgICAgICAgIHNjYWxlVmFsdWUocW1mUmVhbFtpXSwgc2NhbGVGYWN0b3JIaWdoQmFuZCksIHN5blFtZi0+dF9jb3NbaV0sCisgICAgICAgICAgICAgICBzeW5RbWYtPnRfc2luW2ldKTsKICAgICB9CiAgIH0KIAotICBpZiAoIChzeW5RbWYtPmZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpID09IDApIHsKLSAgICBzY2FsZVZhbHVlcygmdFJlYWxbMF0sICAgICAgICAgICAgICZxbWZSZWFsWzBdLCAgICAgICAgICAgICBzeW5RbWYtPmxzYiwgICAgICAgICAgICAgc2NhbGVGYWN0b3JMb3dCYW5kKTsKLSAgICBzY2FsZVZhbHVlcygmdFJlYWxbMCtzeW5RbWYtPmxzYl0sICZxbWZSZWFsWzArc3luUW1mLT5sc2JdLCBzeW5RbWYtPnVzYi1zeW5RbWYtPmxzYiwgc2NhbGVGYWN0b3JIaWdoQmFuZCk7Ci0gICAgc2NhbGVWYWx1ZXMoJnRJbWFnWzBdLCAgICAgICAgICAgICAmcW1mSW1hZ1swXSwgICAgICAgICAgICAgc3luUW1mLT5sc2IsICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZCk7Ci0gICAgc2NhbGVWYWx1ZXMoJnRJbWFnWzArc3luUW1mLT5sc2JdLCAmcW1mSW1hZ1swK3N5blFtZi0+bHNiXSwgc3luUW1mLT51c2Itc3luUW1mLT5sc2IsIHNjYWxlRmFjdG9ySGlnaEJhbmQpOworICBpZiAoKHN5blFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19DTERGQikgPT0gMCkgeworICAgIHNjYWxlVmFsdWVzKCZ0UmVhbFswXSwgJnFtZlJlYWxbMF0sIHN5blFtZi0+bHNiLCAoaW50KXNjYWxlRmFjdG9yTG93QmFuZCk7CisgICAgc2NhbGVWYWx1ZXMoJnRSZWFsWzAgKyBzeW5RbWYtPmxzYl0sICZxbWZSZWFsWzAgKyBzeW5RbWYtPmxzYl0sCisgICAgICAgICAgICAgICAgc3luUW1mLT51c2IgLSBzeW5RbWYtPmxzYiwgKGludClzY2FsZUZhY3RvckhpZ2hCYW5kKTsKKyAgICBzY2FsZVZhbHVlcygmdEltYWdbMF0sICZxbWZJbWFnWzBdLCBzeW5RbWYtPmxzYiwgKGludClzY2FsZUZhY3Rvckxvd0JhbmQpOworICAgIHNjYWxlVmFsdWVzKCZ0SW1hZ1swICsgc3luUW1mLT5sc2JdLCAmcW1mSW1hZ1swICsgc3luUW1mLT5sc2JdLAorICAgICAgICAgICAgICAgIHN5blFtZi0+dXNiIC0gc3luUW1mLT5sc2IsIChpbnQpc2NhbGVGYWN0b3JIaWdoQmFuZCk7CiAgIH0KIAotICBGREttZW1jbGVhcigmdFJlYWxbc3luUW1mLT51c2JdLCAoc3luUW1mLT5ub19jaGFubmVscy1zeW5RbWYtPnVzYikqc2l6ZW9mKEZJWFBfUU1GKSk7Ci0gIEZES21lbWNsZWFyKCZ0SW1hZ1tzeW5RbWYtPnVzYl0sIChzeW5RbWYtPm5vX2NoYW5uZWxzLXN5blFtZi0+dXNiKSpzaXplb2YoRklYUF9RTUYpKTsKKyAgRkRLbWVtY2xlYXIoJnRSZWFsW3N5blFtZi0+dXNiXSwKKyAgICAgICAgICAgICAgKHN5blFtZi0+bm9fY2hhbm5lbHMgLSBzeW5RbWYtPnVzYikgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY2xlYXIoJnRJbWFnW3N5blFtZi0+dXNiXSwKKyAgICAgICAgICAgICAgKHN5blFtZi0+bm9fY2hhbm5lbHMgLSBzeW5RbWYtPnVzYikgKiBzaXplb2YoRklYUF9EQkwpKTsKIAogICBkY3RfSVYodFJlYWwsIEwsICZzaGlmdCk7CiAgIGRzdF9JVih0SW1hZywgTCwgJnNoaWZ0KTsKIAotICBpZiAoc3luUW1mLT5mbGFncyAmIFFNRl9GTEFHX0NMREZCKXsKKyAgaWYgKHN5blFtZi0+ZmxhZ3MgJiBRTUZfRkxBR19DTERGQikgewogICAgIGZvciAoaSA9IDA7IGkgPCBNOyBpKyspIHsKLSAgICAgIEZJWFBfUU1GIHIxLCBpMSwgcjIsIGkyOworICAgICAgRklYUF9EQkwgcjEsIGkxLCByMiwgaTI7CiAgICAgICByMSA9IHRSZWFsW2ldOwogICAgICAgaTIgPSB0SW1hZ1tMIC0gMSAtIGldOwogICAgICAgcjIgPSB0UmVhbFtMIC0gaSAtIDFdOwogICAgICAgaTEgPSB0SW1hZ1tpXTsKIAotICAgICAgdFJlYWxbaV0gPSAocjEgLSBpMSk+PjE7Ci0gICAgICB0SW1hZ1tMIC0gMSAtIGldID0gLShyMSArIGkxKT4+MTsKLSAgICAgIHRSZWFsW0wgLSBpIC0gMV0gPSAgKHIyIC0gaTIpPj4xOwotICAgICAgdEltYWdbaV0gPSAtKHIyICsgaTIpPj4xOworICAgICAgdFJlYWxbaV0gPSAocjEgLSBpMSkgPj4gMTsKKyAgICAgIHRJbWFnW0wgLSAxIC0gaV0gPSAtKHIxICsgaTEpID4+IDE7CisgICAgICB0UmVhbFtMIC0gaSAtIDFdID0gKHIyIC0gaTIpID4+IDE7CisgICAgICB0SW1hZ1tpXSA9IC0ocjIgKyBpMikgPj4gMTsKICAgICB9Ci0gIH0gZWxzZQotICB7Ci0gICAgLyogVGhlIGFycmF5IGFjY2Vzc2VzIGFyZSBuZWdhdGl2ZSB0byBjb21wZW5zYXRlIHRoZSBtaXNzaW5nIG1pbnVzIHNpZ24gaW4gdGhlIGxvdyBhbmQgaGkgYmFuZCBnYWluLiAqLworICB9IGVsc2UgeworICAgIC8qIFRoZSBhcnJheSBhY2Nlc3NlcyBhcmUgbmVnYXRpdmUgdG8gY29tcGVuc2F0ZSB0aGUgbWlzc2luZyBtaW51cyBzaWduIGluCisgICAgICogdGhlIGxvdyBhbmQgaGkgYmFuZCBnYWluLiAqLwogICAgIC8qIDI2IGN5Y2xlcyBvbiBBUk05MjYgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgTTsgaSsrKSB7Ci0gICAgICBGSVhQX1FNRiByMSwgaTEsIHIyLCBpMjsKKyAgICAgIEZJWFBfREJMIHIxLCBpMSwgcjIsIGkyOwogICAgICAgcjEgPSAtdFJlYWxbaV07CiAgICAgICBpMiA9IC10SW1hZ1tMIC0gMSAtIGldOwogICAgICAgcjIgPSAtdFJlYWxbTCAtIGkgLSAxXTsKICAgICAgIGkxID0gLXRJbWFnW2ldOwogCi0gICAgICB0UmVhbFtpXSA9IChyMSAtIGkxKT4+MTsKLSAgICAgIHRJbWFnW0wgLSAxIC0gaV0gPSAtKHIxICsgaTEpPj4xOwotICAgICAgdFJlYWxbTCAtIGkgLSAxXSA9ICAocjIgLSBpMik+PjE7Ci0gICAgICB0SW1hZ1tpXSA9IC0ocjIgKyBpMik+PjE7CisgICAgICB0UmVhbFtpXSA9IChyMSAtIGkxKSA+PiAxOworICAgICAgdEltYWdbTCAtIDEgLSBpXSA9IC0ocjEgKyBpMSkgPj4gMTsKKyAgICAgIHRSZWFsW0wgLSBpIC0gMV0gPSAocjIgLSBpMikgPj4gMTsKKyAgICAgIHRJbWFnW2ldID0gLShyMiArIGkyKSA+PiAxOwogICAgIH0KICAgfQogfQotCi12b2lkIHFtZlN5bnRoZXNpc0ZpbHRlcmluZ1Nsb3QoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgIHN5blFtZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9RTUYgICpyZWFsU2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9RTUYgICppbWFnU2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgc2NhbGVGYWN0b3JIaWdoQmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgICAgICAgICp0aW1lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgICAgICAgICpwV29ya0J1ZmZlcikKLXsKLSAgICBpZiAoIShzeW5RbWYtPmZsYWdzICYgUU1GX0ZMQUdfTFApKQotICAgICAgcW1mSW52ZXJzZU1vZHVsYXRpb25IUSAoIHN5blFtZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsU2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnU2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JIaWdoQmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29ya0J1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc3luUW1mLT5mbGFncyAmIFFNRl9GTEFHX0NMREZCKSB7Ci0gICAgICAgIHFtZkludmVyc2VNb2R1bGF0aW9uTFBfb2RkICggc3luUW1mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3RvckhpZ2hCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcW1mSW52ZXJzZU1vZHVsYXRpb25MUF9ldmVuICggc3luUW1mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3RvckhpZ2hCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChzeW5RbWYtPmZsYWdzICYgUU1GX0ZMQUdfTk9OU1lNTUVUUklDKSB7Ci0gICAgICAgIHFtZlN5blByb3RvdHlwZUZpclNsb3RfTm9uU3ltbWV0cmljICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5blFtZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIrc3luUW1mLT5ub19jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHFtZlN5blByb3RvdHlwZUZpclNsb3QgKCBzeW5RbWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29ya0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrQnVmZmVyK3N5blFtZi0+bm9fY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICB9Ci19Ci0KLQotLyohCi0gKgotICoKLSAqIFxicmllZiBQZXJmb3JtIGNvbXBsZXgtdmFsdWVkIHN1YmJhbmQgc3ludGhlc2lzIG9mIHRoZQotICogICAgICAgIGxvdyBiYW5kIGFuZCB0aGUgaGlnaCBiYW5kIGFuZCBzdG9yZSB0aGUKLSAqICAgICAgICB0aW1lIGRvbWFpbiBkYXRhIGluIHRpbWVPdXQKLSAqCi0gKiBGaXJzdCBzdGVwOiBDYWxjdWxhdGUgdGhlIHByb3BlciBzY2FsaW5nIGZhY3RvciBvZiBjdXJyZW50Ci0gKiBzcGVjdHJhbCBkYXRhIGluIHFtZlJlYWwvcW1mSW1hZywgb2xkIHNwZWN0cmFsIGRhdGEgaW4gdGhlIG92ZXJsYXAKLSAqIHJhbmdlIGFuZCBmaWx0ZXIgc3RhdGVzLgotICoKLSAqIFNlY29uZCBzdGVwOiBQZXJmb3JtIEZyZXF1ZW5jeS10by1UaW1lIG1hcHBpbmcgd2l0aCBpbnZlcnNlCi0gKiBNb2R1bGF0aW9uIHNsb3Qtd2lzZS4KLSAqCi0gKiBUaGlyZCBzdGVwOiBQZXJmb3JtIEZJUi1maWx0ZXIgc2xvdC13aXNlLiBUbyBzYXZlIHNwYWNlIGZvciBmaWx0ZXIKLSAqIHN0YXRlcywgdGhlIE1BQyBvcGVyYXRpb25zIGFyZSBleGVjdXRlZCBkaXJlY3RseSBvbiB0aGUgZmlsdGVyIHN0YXRlcwotICogaW5zdGVhZCBvZiBhY2N1bXVsYXRpbmcgc2V2ZXJhbCBwcm9kdWN0cyBpbiB0aGUgYWNjdW11bGF0b3IuIFRoZQotICogYnVmZmVyIHNoaWZ0IGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSByZXBsYWNlZCBieSBhCi0gKiBtb2R1bG8gb3BlcmF0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgb24gc29tZSBEU1BzLgotICoKLSAqIExhc3Qgc3RlcDogQ29weSB0aGUgdXBwZXIgcGFydCBvZiB0aGUgc3BlY3RyYWwgZGF0YSB0byB0aGUgb3ZlcmxhcCBidWZmZXIuCi0gKgotICogVGhlIHFtZiBjb2VmZmljaWVudCB0YWJsZSBpcyBzeW1tZXRyaWMuIFRoZSBzeW1tZXRyeSBpcyBleHBsb2l0ZWQgYnkKLSAqIHNocmlua2luZyB0aGUgY29lZmZpY2llbnQgdGFibGUgdG8gaGFsZiB0aGUgc2l6ZS4gVGhlIGFkZHJlc3NpbmcgbW9kZQotICogdGFrZXMgY2FyZSBvZiB0aGUgc3ltbWV0cmllcy4gIElmIHRoZSAjZGVmaW5lICNRTUZUQUJMRV9GVUxMIGlzIHNldCwKLSAqIGNvZWZmaWNpZW50IGFkZHJlc3Npbmcgd29ya3Mgb24gdGhlIGZ1bGwgdGFibGUgc2l6ZS4gVGhlIGNvZGUgd2lsbCBiZQotICogc2xpZ2h0bHkgZmFzdGVyIGFuZCBzbGlnaHRseSBtb3JlIGNvbXBhY3QuCi0gKgotICogV29ya2J1ZmZlciByZXF1aXJlbWVudDogMiB4IHNpemVvZigqKlFtZkJ1ZmZlclJlYWwpICogc3luUW1mLT5ub19jaGFubmVscwotICovCi12b2lkCi1xbWZTeW50aGVzaXNGaWx0ZXJpbmcoIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mLCAgICAgICAvKiE8IEhhbmRsZSBvZiBRbWYgU3ludGhlc2lzIEJhbmsgICovCi0gICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAqKlFtZkJ1ZmZlclJlYWwsICAgICAgICAgICAvKiE8IExvdyBhbmQgSGlnaCBiYW5kLCByZWFsICovCi0gICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICAqKlFtZkJ1ZmZlckltYWcsICAgICAgICAgICAvKiE8IExvdyBhbmQgSGlnaCBiYW5kLCBpbWFnICovCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFNRl9TQ0FMRV9GQUNUT1IgKnNjYWxlRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBvdl9sZW4sICAgICAgICAgICAgICAgICAgLyohPCBzcGxpdCBTbG90IG9mIG92ZXJsYXAgYW5kIGFjdHVhbCBzbG90cyAqLwotICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAgICp0aW1lT3V0LCAgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIG91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICBzdHJpZGUsICAgICAgICAgICAgICAgICAgLyohPCBzdHJpZGUgZmFjdG9yIG9mIG91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAgICpwV29ya0J1ZmZlciAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIHRlbXBvcmFsIHdvcmtpbmcgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgKQotewotICBpbnQgaTsKLSAgaW50IEwgPSBzeW5RbWYtPm5vX2NoYW5uZWxzOwotICBTQ0hBUiBzY2FsZUZhY3RvckhpZ2hCYW5kOwotICBTQ0hBUiBzY2FsZUZhY3Rvckxvd0JhbmRfb3YsIHNjYWxlRmFjdG9yTG93QmFuZF9ub19vdjsKLQotICAvKiBhZGFwdCBzY2FsaW5nICovCi0gIHNjYWxlRmFjdG9ySGlnaEJhbmQgPSAtQUxHT1JJVEhNSUNfU0NBTElOR19JTl9BTkFMWVNJU19GSUxURVJCQU5LIC0gc2NhbGVGYWN0b3ItPmhiX3NjYWxlOwotICBzY2FsZUZhY3Rvckxvd0JhbmRfb3YgPSAtIEFMR09SSVRITUlDX1NDQUxJTkdfSU5fQU5BTFlTSVNfRklMVEVSQkFOSyAtIHNjYWxlRmFjdG9yLT5vdl9sYl9zY2FsZTsKLSAgc2NhbGVGYWN0b3JMb3dCYW5kX25vX292ID0gLSBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX0FOQUxZU0lTX0ZJTFRFUkJBTksgLSBzY2FsZUZhY3Rvci0+bGJfc2NhbGU7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHN5blFtZi0+bm9fY29sOyBpKyspICAvKiAtLS0tLSBub19jb2wgbG9vcCAtLS0tLSAqLwotICB7Ci0gICAgY29uc3QgRklYUF9EQkwgKlFtZkJ1ZmZlckltYWdTbG90ID0gTlVMTDsKLQotICAgIFNDSEFSIHNjYWxlRmFjdG9yTG93QmFuZCA9IChpPG92X2xlbikgPyBzY2FsZUZhY3Rvckxvd0JhbmRfb3YgOiBzY2FsZUZhY3Rvckxvd0JhbmRfbm9fb3Y7Ci0KLSAgICBpZiAoIShzeW5RbWYtPmZsYWdzICYgUU1GX0ZMQUdfTFApKQotICAgICAgICBRbWZCdWZmZXJJbWFnU2xvdCA9IFFtZkJ1ZmZlckltYWdbaV07Ci0KLSAgICBxbWZTeW50aGVzaXNGaWx0ZXJpbmdTbG90KCAgc3luUW1mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJSZWFsW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJJbWFnU2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JMb3dCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3RvckhpZ2hCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lT3V0KyhpKkwqc3RyaWRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29ya0J1ZmZlcik7Ci0gIH0gLyogbm9fY29sIGxvb3AgIGkgICovCi0KLX0KLQorI2VuZGlmIC8qICNpZm5kZWYgRlVOQ1RJT05fcW1mSW52ZXJzZU1vZHVsYXRpb25IUSAqLwogCiAvKiEKICAqCkBAIC05NjQsMjQgKzc2OCw0MiBAQAogICogXHJldHVybiAwIGlmIHN1Y2Nlc3NmdWwKICAqCiAgKi8KLXN0YXRpYyBpbnQKLXFtZkluaXRGaWx0ZXJCYW5rIChIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGhfUW1mLCAgICAgLyohPCBIYW5kbGUgdG8gcmV0dXJuICovCi0gICAgICAgICAgICAgICAgICAgdm9pZCAqcEZpbHRlclN0YXRlcywgICAgICAgICAgICAgIC8qITwgSGFuZGxlIHRvIGZpbHRlciBzdGF0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICBpbnQgbm9Db2xzLCAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZXNsb3RzIHBlciBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgIGludCBsc2IsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IExvd2VyIGVuZCBvZiBRTUYgZnJlcXVlbmN5IHJhbmdlICovCi0gICAgICAgICAgICAgICAgICAgaW50IHVzYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVXBwZXIgZW5kIG9mIFFNRiBmcmVxdWVuY3kgcmFuZ2UgKi8KLSAgICAgICAgICAgICAgICAgICBpbnQgbm9fY2hhbm5lbHMsICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgY2hhbm5lbHMgKGJhbmRzKSAqLwotICAgICAgICAgICAgICAgICAgIFVJTlQgZmxhZ3MpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZsYWdzICovCitzdGF0aWMgaW50IHFtZkluaXRGaWx0ZXJCYW5rKAorICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgaF9RbWYsIC8qITwgSGFuZGxlIHRvIHJldHVybiAqLworICAgIHZvaWQgKnBGaWx0ZXJTdGF0ZXMsICAgICAgICAgIC8qITwgSGFuZGxlIHRvIGZpbHRlciBzdGF0ZXMgKi8KKyAgICBpbnQgbm9Db2xzLCAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB0aW1lc2xvdHMgcGVyIGZyYW1lICovCisgICAgaW50IGxzYiwgICAgICAgICAgICAgICAgICAgICAgLyohPCBMb3dlciBlbmQgb2YgUU1GIGZyZXF1ZW5jeSByYW5nZSAqLworICAgIGludCB1c2IsICAgICAgICAgICAgICAgICAgICAgIC8qITwgVXBwZXIgZW5kIG9mIFFNRiBmcmVxdWVuY3kgcmFuZ2UgKi8KKyAgICBpbnQgbm9fY2hhbm5lbHMsICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBjaGFubmVscyAoYmFuZHMpICovCisgICAgVUlOVCBmbGFncywgICAgICAgICAgICAgICAgICAgLyohPCBmbGFncyAqLworICAgIGludCBzeW5mbGFnKSAgICAgICAgICAgICAgICAgIC8qITwgMTogc3ludGhlc2lzOyAwOiBhbmFseXNpcyAqLwogewotICBGREttZW1jbGVhcihoX1FtZixzaXplb2YoUU1GX0ZJTFRFUl9CQU5LKSk7CisgIEZES21lbWNsZWFyKGhfUW1mLCBzaXplb2YoUU1GX0ZJTFRFUl9CQU5LKSk7CiAKLSAgaWYgKGZsYWdzICYgUU1GX0ZMQUdfTVBTTERGQikKLSAgewotICAgIHJldHVybiAtMTsKKyAgaWYgKGZsYWdzICYgUU1GX0ZMQUdfTVBTTERGQikgeworICAgIGZsYWdzIHw9IFFNRl9GTEFHX05PTlNZTU1FVFJJQzsKKyAgICBmbGFncyB8PSBRTUZfRkxBR19NUFNMREZCX09QVElNSVpFX01PRFVMQVRJT047CisKKyAgICBoX1FtZi0+dF9jb3MgPSBOVUxMOworICAgIGhfUW1mLT50X3NpbiA9IE5VTEw7CisgICAgaF9RbWYtPmZpbHRlclNjYWxlID0gUU1GX01QU0xERkJfUEZUX1NDQUxFOworICAgIGhfUW1mLT5wX3N0cmlkZSA9IDE7CisKKyAgICBzd2l0Y2ggKG5vX2NoYW5uZWxzKSB7CisgICAgICBjYXNlIDY0OgorICAgICAgICBoX1FtZi0+cF9maWx0ZXIgPSBxbWZfbXBzbGRmYl82NDA7CisgICAgICAgIGhfUW1mLT5GaWx0ZXJTaXplID0gNjQwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzI6CisgICAgICAgIGhfUW1mLT5wX2ZpbHRlciA9IHFtZl9tcHNsZGZiXzMyMDsKKyAgICAgICAgaF9RbWYtPkZpbHRlclNpemUgPSAzMjA7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KICAgfQogCi0gIGlmICggIShmbGFncyAmIFFNRl9GTEFHX01QU0xERkIpICYmIChmbGFncyAmIFFNRl9GTEFHX0NMREZCKSApCi0gIHsKKyAgaWYgKCEoZmxhZ3MgJiBRTUZfRkxBR19NUFNMREZCKSAmJiAoZmxhZ3MgJiBRTUZfRkxBR19DTERGQikpIHsKICAgICBmbGFncyB8PSBRTUZfRkxBR19OT05TWU1NRVRSSUM7CiAgICAgaF9RbWYtPmZpbHRlclNjYWxlID0gUU1GX0NMREZCX1BGVF9TQ0FMRTsKIApAQCAtOTk0LDYzICs4MTYsMTU4IEBACiAgICAgICAgIGhfUW1mLT5GaWx0ZXJTaXplID0gNjQwOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgMzI6Ci0gICAgICAgIGhfUW1mLT50X2NvcyA9IHFtZl9waGFzZXNoaWZ0X2NvczMyX2NsZGZiOworICAgICAgICBoX1FtZi0+dF9jb3MgPSAoc3luZmxhZykgPyBxbWZfcGhhc2VzaGlmdF9jb3MzMl9jbGRmYl9zeW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcW1mX3BoYXNlc2hpZnRfY29zMzJfY2xkZmJfYW5hOwogICAgICAgICBoX1FtZi0+dF9zaW4gPSBxbWZfcGhhc2VzaGlmdF9zaW4zMl9jbGRmYjsKICAgICAgICAgaF9RbWYtPnBfZmlsdGVyID0gcW1mX2NsZGZiXzMyMDsKICAgICAgICAgaF9RbWYtPkZpbHRlclNpemUgPSAzMjA7CiAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNjoKKyAgICAgICAgaF9RbWYtPnRfY29zID0gKHN5bmZsYWcpID8gcW1mX3BoYXNlc2hpZnRfY29zMTZfY2xkZmJfc3luCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHFtZl9waGFzZXNoaWZ0X2NvczE2X2NsZGZiX2FuYTsKKyAgICAgICAgaF9RbWYtPnRfc2luID0gcW1mX3BoYXNlc2hpZnRfc2luMTZfY2xkZmI7CisgICAgICAgIGhfUW1mLT5wX2ZpbHRlciA9IHFtZl9jbGRmYl8xNjA7CisgICAgICAgIGhfUW1mLT5GaWx0ZXJTaXplID0gMTYwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgODoKKyAgICAgICAgaF9RbWYtPnRfY29zID0gKHN5bmZsYWcpID8gcW1mX3BoYXNlc2hpZnRfY29zOF9jbGRmYl9zeW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcW1mX3BoYXNlc2hpZnRfY29zOF9jbGRmYl9hbmE7CisgICAgICAgIGhfUW1mLT50X3NpbiA9IHFtZl9waGFzZXNoaWZ0X3NpbjhfY2xkZmI7CisgICAgICAgIGhfUW1mLT5wX2ZpbHRlciA9IHFtZl9jbGRmYl84MDsKKyAgICAgICAgaF9RbWYtPkZpbHRlclNpemUgPSA4MDsKKyAgICAgICAgYnJlYWs7CiAgICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICB9CiAKLSAgaWYgKCAhKGZsYWdzICYgUU1GX0ZMQUdfTVBTTERGQikgJiYgKChmbGFncyAmIFFNRl9GTEFHX0NMREZCKSA9PSAwKSApCi0gIHsKKyAgaWYgKCEoZmxhZ3MgJiBRTUZfRkxBR19NUFNMREZCKSAmJiAoKGZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpID09IDApKSB7CiAgICAgc3dpdGNoIChub19jaGFubmVscykgewogICAgICAgY2FzZSA2NDoKLSAgICAgICAgaF9RbWYtPnBfZmlsdGVyID0gcW1mXzY0OworICAgICAgICBoX1FtZi0+cF9maWx0ZXIgPSBxbWZfcGZpbHQ2NDA7CiAgICAgICAgIGhfUW1mLT50X2NvcyA9IHFtZl9waGFzZXNoaWZ0X2NvczY0OwogICAgICAgICBoX1FtZi0+dF9zaW4gPSBxbWZfcGhhc2VzaGlmdF9zaW42NDsKICAgICAgICAgaF9RbWYtPnBfc3RyaWRlID0gMTsKICAgICAgICAgaF9RbWYtPkZpbHRlclNpemUgPSA2NDA7CiAgICAgICAgIGhfUW1mLT5maWx0ZXJTY2FsZSA9IDA7CiAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0MDoKKyAgICAgICAgaWYgKHN5bmZsYWcpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBoX1FtZi0+cF9maWx0ZXIgPSBxbWZfcGZpbHQ0MDA7IC8qIFNjYWxpbmcgZmFjdG9yIDAuOCAqLworICAgICAgICAgIGhfUW1mLT50X2NvcyA9IHFtZl9waGFzZXNoaWZ0X2NvczQwOworICAgICAgICAgIGhfUW1mLT50X3NpbiA9IHFtZl9waGFzZXNoaWZ0X3NpbjQwOworICAgICAgICAgIGhfUW1mLT5maWx0ZXJTY2FsZSA9IDE7CisgICAgICAgICAgaF9RbWYtPnBfc3RyaWRlID0gMTsKKyAgICAgICAgICBoX1FtZi0+RmlsdGVyU2l6ZSA9IG5vX2NoYW5uZWxzICogMTA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIDMyOgotICAgICAgICBoX1FtZi0+cF9maWx0ZXIgPSBxbWZfNjQ7CisgICAgICAgIGhfUW1mLT5wX2ZpbHRlciA9IHFtZl9wZmlsdDY0MDsKICAgICAgICAgaWYgKGZsYWdzICYgUU1GX0ZMQUdfRE9XTlNBTVBMRUQpIHsKICAgICAgICAgICBoX1FtZi0+dF9jb3MgPSBxbWZfcGhhc2VzaGlmdF9jb3NfZG93bnNhbXAzMjsKICAgICAgICAgICBoX1FtZi0+dF9zaW4gPSBxbWZfcGhhc2VzaGlmdF9zaW5fZG93bnNhbXAzMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgaF9RbWYtPnRfY29zID0gcW1mX3BoYXNlc2hpZnRfY29zMzI7Ci0gICAgICAgIGhfUW1mLT50X3NpbiA9IHFtZl9waGFzZXNoaWZ0X3NpbjMyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGhfUW1mLT50X2NvcyA9IHFtZl9waGFzZXNoaWZ0X2NvczMyOworICAgICAgICAgIGhfUW1mLT50X3NpbiA9IHFtZl9waGFzZXNoaWZ0X3NpbjMyOwogICAgICAgICB9CiAgICAgICAgIGhfUW1mLT5wX3N0cmlkZSA9IDI7CiAgICAgICAgIGhfUW1mLT5GaWx0ZXJTaXplID0gNjQwOwogICAgICAgICBoX1FtZi0+ZmlsdGVyU2NhbGUgPSAwOwogICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjA6CisgICAgICAgIGhfUW1mLT5wX2ZpbHRlciA9IHFtZl9wZmlsdDIwMDsKKyAgICAgICAgaF9RbWYtPnBfc3RyaWRlID0gMTsKKyAgICAgICAgaF9RbWYtPkZpbHRlclNpemUgPSAyMDA7CisgICAgICAgIGhfUW1mLT5maWx0ZXJTY2FsZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMjoKKyAgICAgICAgaF9RbWYtPnBfZmlsdGVyID0gcW1mX3BmaWx0MTIwOworICAgICAgICBoX1FtZi0+cF9zdHJpZGUgPSAxOworICAgICAgICBoX1FtZi0+RmlsdGVyU2l6ZSA9IDEyMDsKKyAgICAgICAgaF9RbWYtPmZpbHRlclNjYWxlID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDg6CisgICAgICAgIGhfUW1mLT5wX2ZpbHRlciA9IHFtZl9wZmlsdDY0MDsKKyAgICAgICAgaF9RbWYtPnBfc3RyaWRlID0gODsKKyAgICAgICAgaF9RbWYtPkZpbHRlclNpemUgPSA2NDA7CisgICAgICAgIGhfUW1mLT5maWx0ZXJTY2FsZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNjoKKyAgICAgICAgaF9RbWYtPnBfZmlsdGVyID0gcW1mX3BmaWx0NjQwOworICAgICAgICBoX1FtZi0+dF9jb3MgPSBxbWZfcGhhc2VzaGlmdF9jb3MxNjsKKyAgICAgICAgaF9RbWYtPnRfc2luID0gcW1mX3BoYXNlc2hpZnRfc2luMTY7CisgICAgICAgIGhfUW1mLT5wX3N0cmlkZSA9IDQ7CisgICAgICAgIGhfUW1mLT5GaWx0ZXJTaXplID0gNjQwOworICAgICAgICBoX1FtZi0+ZmlsdGVyU2NhbGUgPSAwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjQ6CisgICAgICAgIGhfUW1mLT5wX2ZpbHRlciA9IHFtZl9wZmlsdDI0MDsKKyAgICAgICAgaF9RbWYtPnRfY29zID0gcW1mX3BoYXNlc2hpZnRfY29zMjQ7CisgICAgICAgIGhfUW1mLT50X3NpbiA9IHFtZl9waGFzZXNoaWZ0X3NpbjI0OworICAgICAgICBoX1FtZi0+cF9zdHJpZGUgPSAxOworICAgICAgICBoX1FtZi0+RmlsdGVyU2l6ZSA9IDI0MDsKKyAgICAgICAgaF9RbWYtPmZpbHRlclNjYWxlID0gMTsKKyAgICAgICAgYnJlYWs7CiAgICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICB9CiAKKyAgaF9RbWYtPnN5blNjYWxlZmFjdG9yID0gaF9RbWYtPmZpbHRlclNjYWxlOworICAvLyBEQ1R8RFNUIGRlcGVuZGVuY3kKKyAgc3dpdGNoIChub19jaGFubmVscykgeworICAgIGNhc2UgMTI4OgorICAgICAgaF9RbWYtPnN5blNjYWxlZmFjdG9yICs9IEFMR09SSVRITUlDX1NDQUxJTkdfSU5fU1lOVEhFU0lTX0ZJTFRFUkJBTksgKyAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0MDogeworICAgICAgaF9RbWYtPnN5blNjYWxlZmFjdG9yICs9IEFMR09SSVRITUlDX1NDQUxJTkdfSU5fU1lOVEhFU0lTX0ZJTFRFUkJBTksgLSAxOworICAgIH0gYnJlYWs7CisgICAgY2FzZSA2NDoKKyAgICAgIGhfUW1mLT5zeW5TY2FsZWZhY3RvciArPSBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX1NZTlRIRVNJU19GSUxURVJCQU5LOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgaF9RbWYtPnN5blNjYWxlZmFjdG9yICs9IEFMR09SSVRITUlDX1NDQUxJTkdfSU5fU1lOVEhFU0lTX0ZJTFRFUkJBTksgLSAzOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjoKKyAgICAgIGhfUW1mLT5zeW5TY2FsZWZhY3RvciArPSBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX1NZTlRIRVNJU19GSUxURVJCQU5LOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMDoKKyAgICAgIGhfUW1mLT5zeW5TY2FsZWZhY3RvciArPSBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX1NZTlRIRVNJU19GSUxURVJCQU5LICsgMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzI6CisgICAgICBoX1FtZi0+c3luU2NhbGVmYWN0b3IgKz0gQUxHT1JJVEhNSUNfU0NBTElOR19JTl9TWU5USEVTSVNfRklMVEVSQkFOSyAtIDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgorICAgICAgaF9RbWYtPnN5blNjYWxlZmFjdG9yICs9IEFMR09SSVRITUlDX1NDQUxJTkdfSU5fU1lOVEhFU0lTX0ZJTFRFUkJBTksgLSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDoKKyAgICAgIGhfUW1mLT5zeW5TY2FsZWZhY3RvciArPSBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX1NZTlRIRVNJU19GSUxURVJCQU5LIC0gMTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gLTE7CisgIH0KKwogICBoX1FtZi0+ZmxhZ3MgPSBmbGFnczsKIAogICBoX1FtZi0+bm9fY2hhbm5lbHMgPSBub19jaGFubmVsczsKICAgaF9RbWYtPm5vX2NvbCA9IG5vQ29sczsKIAotICBoX1FtZi0+bHNiID0gbHNiOwotICBoX1FtZi0+dXNiID0gZk1pbih1c2IsIGhfUW1mLT5ub19jaGFubmVscyk7CisgIGhfUW1mLT5sc2IgPSBmTWluKGxzYiwgaF9RbWYtPm5vX2NoYW5uZWxzKTsKKyAgaF9RbWYtPnVzYiA9IHN5bmZsYWcKKyAgICAgICAgICAgICAgICAgICA/IGZNaW4odXNiLCBoX1FtZi0+bm9fY2hhbm5lbHMpCisgICAgICAgICAgICAgICAgICAgOiB1c2I7IC8qIHdhczogaF9RbWYtPnVzYiA9IGZNaW4odXNiLCBoX1FtZi0+bm9fY2hhbm5lbHMpOyAqLwogCi0gIGhfUW1mLT5GaWx0ZXJTdGF0ZXMgPSAodm9pZCopcEZpbHRlclN0YXRlczsKKyAgaF9RbWYtPkZpbHRlclN0YXRlcyA9ICh2b2lkICopcEZpbHRlclN0YXRlczsKIAotICBoX1FtZi0+b3V0U2NhbGVmYWN0b3IgPSBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX0FOQUxZU0lTX0ZJTFRFUkJBTksgKyBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX1NZTlRIRVNJU19GSUxURVJCQU5LICsgaF9RbWYtPmZpbHRlclNjYWxlOworICBoX1FtZi0+b3V0U2NhbGVmYWN0b3IgPQorICAgICAgKEFMR09SSVRITUlDX1NDQUxJTkdfSU5fQU5BTFlTSVNfRklMVEVSQkFOSyArIGhfUW1mLT5maWx0ZXJTY2FsZSkgKworICAgICAgaF9RbWYtPnN5blNjYWxlZmFjdG9yOwogCi0gIGlmICggKGhfUW1mLT5wX3N0cmlkZSA9PSAyKQotICAgIHx8ICgoZmxhZ3MgJiBRTUZfRkxBR19DTERGQikgJiYgKG5vX2NoYW5uZWxzID09IDMyKSkgKSB7Ci0gICAgaF9RbWYtPm91dFNjYWxlZmFjdG9yIC09IDE7Ci0gIH0KLSAgaF9RbWYtPm91dEdhaW4gPSAoRklYUF9EQkwpMHg4MDAwMDAwMDsgLyogZGVmYXVsdCBpbml0IHZhbHVlIHdpbGwgYmUgbm90IGFwcGxpZWQgKi8KKyAgaF9RbWYtPm91dEdhaW5fbSA9CisgICAgICAoRklYUF9EQkwpMHg4MDAwMDAwMDsgLyogZGVmYXVsdCBpbml0IHZhbHVlIHdpbGwgYmUgbm90IGFwcGxpZWQgKi8KKyAgaF9RbWYtPm91dEdhaW5fZSA9IDA7CiAKICAgcmV0dXJuICgwKTsKIH0KQEAgLTEwNjIsNDEgKzk3OSw0OSBAQAogICogXHJldHVybiB2b2lkCiAgKgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLXFtZkFkYXB0RmlsdGVyU3RhdGVzIChIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHN5blFtZiwgICAgIC8qITwgSGFuZGxlIG9mIFFtZiBGaWx0ZXIgQmFuayAqLwotICAgICAgICAgICAgICAgICAgICAgIGludCBzY2FsZUZhY3RvckRpZmYpICAgICAgICAgICAgICAgLyohPCBTY2FsZSBmYWN0b3IgZGlmZmVyZW5jZSB0byBiZSBhcHBsaWVkICovCitzdGF0aWMgaW5saW5lIHZvaWQgcW1mQWRhcHRGaWx0ZXJTdGF0ZXMoCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsIC8qITwgSGFuZGxlIG9mIFFtZiBGaWx0ZXIgQmFuayAqLworICAgIGludCBzY2FsZUZhY3RvckRpZmYpICAgICAgICAgICAvKiE8IFNjYWxlIGZhY3RvciBkaWZmZXJlbmNlIHRvIGJlIGFwcGxpZWQgKi8KIHsKICAgaWYgKHN5blFtZiA9PSBOVUxMIHx8IHN5blFtZi0+RmlsdGVyU3RhdGVzID09IE5VTEwpIHsKICAgICByZXR1cm47CiAgIH0KLSAgc2NhbGVWYWx1ZXMoKEZJWFBfUVNTKilzeW5RbWYtPkZpbHRlclN0YXRlcywgc3luUW1mLT5ub19jaGFubmVscyooUU1GX05PX1BPTFkqMiAtIDEpLCBzY2FsZUZhY3RvckRpZmYpOworICBpZiAoc2NhbGVGYWN0b3JEaWZmID4gMCkgeworICAgIHNjYWxlVmFsdWVzU2F0dXJhdGUoKEZJWFBfUVNTICopc3luUW1mLT5GaWx0ZXJTdGF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBzeW5RbWYtPm5vX2NoYW5uZWxzICogKFFNRl9OT19QT0xZICogMiAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JEaWZmKTsKKyAgfSBlbHNlIHsKKyAgICBzY2FsZVZhbHVlcygoRklYUF9RU1MgKilzeW5RbWYtPkZpbHRlclN0YXRlcywKKyAgICAgICAgICAgICAgICBzeW5RbWYtPm5vX2NoYW5uZWxzICogKFFNRl9OT19QT0xZICogMiAtIDEpLCBzY2FsZUZhY3RvckRpZmYpOworICB9CiB9CiAKIC8qIQogICoKICAqIFxicmllZiBDcmVhdGUgUU1GIGZpbHRlciBiYW5rIGluc3RhbmNlCiAgKgotICogT25seSB0aGUgbG93ZXIgYmFuZHMgYXJlIG9idGFpbmVkICh1cHRvIGFuYVFtZi0+bHNiKS4gRm9yCi0gKiBhIGZ1bGwgYmFuZHdpZHRoIGFuYWx5c2lzIGl0IGlzIHJlcXVpcmVkIHRvIHNldCBib3RoIGFuYVFtZi0+bHNiCi0gKiBhbmQgYW5hUW1mLT51c2IgdG8gdGhlIGFtb3VudCBvZiBRTUYgYmFuZHMuCiAgKgogICogXHJldHVybiAwIGlmIHN1Y2Nlc2Z1bAogICoKICAqLwotaW50Ci1xbWZJbml0QW5hbHlzaXNGaWx0ZXJCYW5rIChIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGhfUW1mLCAgIC8qITwgUmV0dXJucyBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUUFTICpwRmlsdGVyU3RhdGVzLCAgICAgICAgLyohPCBIYW5kbGUgdG8gZmlsdGVyIHN0YXRlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vQ29scywgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB0aW1lc2xvdHMgcGVyIGZyYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbHNiLCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgbG93ZXIgZW5kIG9mIFFNRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzYiwgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHVwcGVyIGVuZCBvZiBRTUYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19jaGFubmVscywgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgY2hhbm5lbHMgKGJhbmRzKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IExvdyBQb3dlciBmbGFnICovCitpbnQgcW1mSW5pdEFuYWx5c2lzRmlsdGVyQmFuaygKKyAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGhfUW1mLCAvKiE8IFJldHVybnMgaGFuZGxlICovCisgICAgRklYUF9RQVMgKnBGaWx0ZXJTdGF0ZXMsICAgICAgLyohPCBIYW5kbGUgdG8gZmlsdGVyIHN0YXRlcyAqLworICAgIGludCBub0NvbHMsICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWVzbG90cyBwZXIgZnJhbWUgKi8KKyAgICBpbnQgbHNiLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IGxvd2VyIGVuZCBvZiBRTUYgKi8KKyAgICBpbnQgdXNiLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IHVwcGVyIGVuZCBvZiBRTUYgKi8KKyAgICBpbnQgbm9fY2hhbm5lbHMsICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBjaGFubmVscyAoYmFuZHMpICovCisgICAgaW50IGZsYWdzKSAgICAgICAgICAgICAgICAgICAgLyohPCBMb3cgUG93ZXIgZmxhZyAqLwogewotICBpbnQgZXJyID0gcW1mSW5pdEZpbHRlckJhbmsoaF9RbWYsIHBGaWx0ZXJTdGF0ZXMsIG5vQ29scywgbHNiLCB1c2IsIG5vX2NoYW5uZWxzLCBmbGFncyk7Ci0gIGlmICggIShmbGFncyAmIFFNRl9GTEFHX0tFRVBfU1RBVEVTKSAmJiAoaF9RbWYtPkZpbHRlclN0YXRlcyAhPSBOVUxMKSApIHsKLSAgICBGREttZW1jbGVhcihoX1FtZi0+RmlsdGVyU3RhdGVzLCAoMipRTUZfTk9fUE9MWS0xKSpoX1FtZi0+bm9fY2hhbm5lbHMqc2l6ZW9mKEZJWFBfUUFTKSk7CisgIGludCBlcnIgPSBxbWZJbml0RmlsdGVyQmFuayhoX1FtZiwgcEZpbHRlclN0YXRlcywgbm9Db2xzLCBsc2IsIHVzYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vX2NoYW5uZWxzLCBmbGFncywgMCk7CisgIGlmICghKGZsYWdzICYgUU1GX0ZMQUdfS0VFUF9TVEFURVMpICYmIChoX1FtZi0+RmlsdGVyU3RhdGVzICE9IE5VTEwpKSB7CisgICAgRkRLbWVtY2xlYXIoaF9RbWYtPkZpbHRlclN0YXRlcywKKyAgICAgICAgICAgICAgICAoMiAqIFFNRl9OT19QT0xZIC0gMSkgKiBoX1FtZi0+bm9fY2hhbm5lbHMgKiBzaXplb2YoRklYUF9RQVMpKTsKICAgfQogCisgIEZES19BU1NFUlQoaF9RbWYtPm5vX2NoYW5uZWxzID49IGhfUW1mLT5sc2IpOworCiAgIHJldHVybiBlcnI7CiB9CiAKQEAgLTExMDQsMzcgKzEwMjksMzggQEAKICAqCiAgKiBcYnJpZWYgQ3JlYXRlIFFNRiBmaWx0ZXIgYmFuayBpbnN0YW5jZQogICoKLSAqIE9ubHkgdGhlIGxvd2VyIGJhbmRzIGFyZSBvYnRhaW5lZCAodXB0byBhbmFRbWYtPmxzYikuIEZvcgotICogYSBmdWxsIGJhbmR3aWR0aCBhbmFseXNpcyBpdCBpcyByZXF1aXJlZCB0byBzZXQgYm90aCBhbmFRbWYtPmxzYgotICogYW5kIGFuYVFtZi0+dXNiIHRvIHRoZSBhbW91bnQgb2YgUU1GIGJhbmRzLgogICoKICAqIFxyZXR1cm4gMCBpZiBzdWNjZXNmdWwKICAqCiAgKi8KLWludAotcW1mSW5pdFN5bnRoZXNpc0ZpbHRlckJhbmsgKEhBTkRMRV9RTUZfRklMVEVSX0JBTksgaF9RbWYsICAgLyohPCBSZXR1cm5zIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUVNTICpwRmlsdGVyU3RhdGVzLCAgICAgICAgLyohPCBIYW5kbGUgdG8gZmlsdGVyIHN0YXRlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub0NvbHMsICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZXNsb3RzIHBlciBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsc2IsICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBsb3dlciBlbmQgb2YgUU1GICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzYiwgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHVwcGVyIGVuZCBvZiBRTUYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9fY2hhbm5lbHMsICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGNoYW5uZWxzIChiYW5kcykgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpICAgICAgICAgICAgICAgICAgICAgIC8qITwgTG93IFBvd2VyIGZsYWcgKi8KK2ludCBxbWZJbml0U3ludGhlc2lzRmlsdGVyQmFuaygKKyAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGhfUW1mLCAvKiE8IFJldHVybnMgaGFuZGxlICovCisgICAgRklYUF9RU1MgKnBGaWx0ZXJTdGF0ZXMsICAgICAgLyohPCBIYW5kbGUgdG8gZmlsdGVyIHN0YXRlcyAqLworICAgIGludCBub0NvbHMsICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWVzbG90cyBwZXIgZnJhbWUgKi8KKyAgICBpbnQgbHNiLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IGxvd2VyIGVuZCBvZiBRTUYgKi8KKyAgICBpbnQgdXNiLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IHVwcGVyIGVuZCBvZiBRTUYgKi8KKyAgICBpbnQgbm9fY2hhbm5lbHMsICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBjaGFubmVscyAoYmFuZHMpICovCisgICAgaW50IGZsYWdzKSAgICAgICAgICAgICAgICAgICAgLyohPCBMb3cgUG93ZXIgZmxhZyAqLwogewogICBpbnQgb2xkT3V0U2NhbGUgPSBoX1FtZi0+b3V0U2NhbGVmYWN0b3I7Ci0gIGludCBlcnIgPSBxbWZJbml0RmlsdGVyQmFuayhoX1FtZiwgcEZpbHRlclN0YXRlcywgbm9Db2xzLCBsc2IsIHVzYiwgbm9fY2hhbm5lbHMsIGZsYWdzKTsKLSAgaWYgKCBoX1FtZi0+RmlsdGVyU3RhdGVzICE9IE5VTEwgKSB7Ci0gICAgaWYgKCAhKGZsYWdzICYgUU1GX0ZMQUdfS0VFUF9TVEFURVMpICkgewotICAgICAgRkRLbWVtY2xlYXIoaF9RbWYtPkZpbHRlclN0YXRlcywgKDIqUU1GX05PX1BPTFktMSkqaF9RbWYtPm5vX2NoYW5uZWxzKnNpemVvZihGSVhQX1FTUykpOworICBpbnQgZXJyID0gcW1mSW5pdEZpbHRlckJhbmsoaF9RbWYsIHBGaWx0ZXJTdGF0ZXMsIG5vQ29scywgbHNiLCB1c2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub19jaGFubmVscywgZmxhZ3MsIDEpOworICBpZiAoaF9RbWYtPkZpbHRlclN0YXRlcyAhPSBOVUxMKSB7CisgICAgaWYgKCEoZmxhZ3MgJiBRTUZfRkxBR19LRUVQX1NUQVRFUykpIHsKKyAgICAgIEZES21lbWNsZWFyKAorICAgICAgICAgIGhfUW1mLT5GaWx0ZXJTdGF0ZXMsCisgICAgICAgICAgKDIgKiBRTUZfTk9fUE9MWSAtIDEpICogaF9RbWYtPm5vX2NoYW5uZWxzICogc2l6ZW9mKEZJWFBfUVNTKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHFtZkFkYXB0RmlsdGVyU3RhdGVzKGhfUW1mLCBvbGRPdXRTY2FsZS1oX1FtZi0+b3V0U2NhbGVmYWN0b3IpOworICAgICAgcW1mQWRhcHRGaWx0ZXJTdGF0ZXMoaF9RbWYsIG9sZE91dFNjYWxlIC0gaF9RbWYtPm91dFNjYWxlZmFjdG9yKTsKICAgICB9CiAgIH0KKworICBGREtfQVNTRVJUKGhfUW1mLT5ub19jaGFubmVscyA+PSBoX1FtZi0+bHNiKTsKKyAgRkRLX0FTU0VSVChoX1FtZi0+bm9fY2hhbm5lbHMgPj0gaF9RbWYtPnVzYik7CisKICAgcmV0dXJuIGVycjsKIH0KIAotCi0KLQogLyohCiAgKgogICogXGJyaWVmIENoYW5nZSBzY2FsZSBmYWN0b3IgZm9yIG91dHB1dCBkYXRhIGFuZCBhZGp1c3QgcW1mIGZpbHRlciBzdGF0ZXMKQEAgLTExNDIsMzQgKzEwNjgsMjMgQEAKICAqIFxyZXR1cm4gdm9pZAogICoKICAqLwotdm9pZAotcW1mQ2hhbmdlT3V0U2NhbGVmYWN0b3IgKEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mLCAgICAgLyohPCBIYW5kbGUgb2YgUW1mIFN5bnRoZXNpcyBCYW5rICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dFNjYWxlZmFjdG9yICAgICAgICAgICAgICAgICAvKiE8IE5ldyBzY2FsaW5nIGZhY3RvciBmb3Igb3V0cHV0IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgaWYgKHN5blFtZiA9PSBOVUxMIHx8IHN5blFtZi0+RmlsdGVyU3RhdGVzID09IE5VTEwpIHsKK3ZvaWQgcW1mQ2hhbmdlT3V0U2NhbGVmYWN0b3IoCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAqLworICAgIGludCBvdXRTY2FsZWZhY3RvciAgICAgICAgICAgICAvKiE8IE5ldyBzY2FsaW5nIGZhY3RvciBmb3Igb3V0cHV0IGRhdGEgKi8KKykgeworICBpZiAoc3luUW1mID09IE5VTEwpIHsKICAgICByZXR1cm47CiAgIH0KIAogICAvKiBBZGQgaW50ZXJuYWwgZmlsdGVyYmFuayBzY2FsZSAqLwotICBvdXRTY2FsZWZhY3RvciArPSBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX0FOQUxZU0lTX0ZJTFRFUkJBTksgKyBBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX1NZTlRIRVNJU19GSUxURVJCQU5LICsgc3luUW1mLT5maWx0ZXJTY2FsZTsKLQotICBpZiAoIChzeW5RbWYtPnBfc3RyaWRlID09IDIpCi0gICAgfHwgKChzeW5RbWYtPmZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpICYmIChzeW5RbWYtPm5vX2NoYW5uZWxzID09IDMyKSkgKSB7Ci0gICAgb3V0U2NhbGVmYWN0b3IgLT0gMTsKLSAgfQorICBvdXRTY2FsZWZhY3RvciArPQorICAgICAgKEFMR09SSVRITUlDX1NDQUxJTkdfSU5fQU5BTFlTSVNfRklMVEVSQkFOSyArIHN5blFtZi0+ZmlsdGVyU2NhbGUpICsKKyAgICAgIHN5blFtZi0+c3luU2NhbGVmYWN0b3I7CiAKICAgLyogYWRqdXN0IGZpbHRlciBzdGF0ZXMgd2hlbiBzY2FsZSBmYWN0b3IgaGFzIGJlZW4gY2hhbmdlZCAqLwotICBpZiAoc3luUW1mLT5vdXRTY2FsZWZhY3RvciAhPSBvdXRTY2FsZWZhY3RvcikKLSAgeworICBpZiAoc3luUW1mLT5vdXRTY2FsZWZhY3RvciAhPSBvdXRTY2FsZWZhY3RvcikgewogICAgIGludCBkaWZmOwogCi0gICAgaWYgKG91dFNjYWxlZmFjdG9yID4gKFNBTVBMRV9CSVRTIC0gMSkpIHsKLSAgICAgIG91dFNjYWxlZmFjdG9yID0gU0FNUExFX0JJVFMgLSAxOwotICAgIH0gZWxzZSBpZiAob3V0U2NhbGVmYWN0b3IgPCAoMSAtIFNBTVBMRV9CSVRTKSkgewotICAgICAgb3V0U2NhbGVmYWN0b3IgPSAxIC0gU0FNUExFX0JJVFM7Ci0gICAgfQotCiAgICAgZGlmZiA9IHN5blFtZi0+b3V0U2NhbGVmYWN0b3IgLSBvdXRTY2FsZWZhY3RvcjsKIAogICAgIHFtZkFkYXB0RmlsdGVyU3RhdGVzKHN5blFtZiwgZGlmZik7CkBAIC0xMTgxLDE2ICsxMDk2LDQwIEBACiAKIC8qIQogICoKKyAqIFxicmllZiBHZXQgc2NhbGUgZmFjdG9yIGNoYW5nZSB3aGljaCB3YXMgc2V0IGJ5IHFtZkNoYW5nZU91dFNjYWxlZmFjdG9yKCkKKyAqCisgKiBccmV0dXJuIHNjYWxlRmFjdG9yCisgKgorICovCitpbnQgcW1mR2V0T3V0U2NhbGVmYWN0b3IoCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYpIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAqLworeworICBpbnQgc2NhbGVGYWN0b3IgPSBzeW5RbWYtPm91dFNjYWxlZmFjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICA/IChzeW5RbWYtPm91dFNjYWxlZmFjdG9yIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChBTEdPUklUSE1JQ19TQ0FMSU5HX0lOX0FOQUxZU0lTX0ZJTFRFUkJBTksgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5blFtZi0+ZmlsdGVyU2NhbGUgKyBzeW5RbWYtPnN5blNjYWxlZmFjdG9yKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgcmV0dXJuIHNjYWxlRmFjdG9yOworfQorCisvKiEKKyAqCiAgKiBcYnJpZWYgQ2hhbmdlIGdhaW4gZm9yIG91dHB1dCBkYXRhCiAgKgogICogXHJldHVybiB2b2lkCiAgKgogICovCi12b2lkCi1xbWZDaGFuZ2VPdXRHYWluIChIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHN5blFtZiwgICAgIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAqLwotICAgICAgICAgICAgICAgICAgRklYUF9EQkwgb3V0cHV0R2FpbiAgICAgICAgICAgICAgICAvKiE8IE5ldyBnYWluIGZvciBvdXRwdXQgZGF0YSAqLwotICAgICAgICAgICAgICAgICApCi17Ci0gIHN5blFtZi0+b3V0R2FpbiA9IG91dHB1dEdhaW47Cit2b2lkIHFtZkNoYW5nZU91dEdhaW4oCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYsIC8qITwgSGFuZGxlIG9mIFFtZiBTeW50aGVzaXMgQmFuayAqLworICAgIEZJWFBfREJMIG91dHB1dEdhaW4sICAgICAgICAgICAvKiE8IE5ldyBnYWluIGZvciBvdXRwdXQgZGF0YSAobWFudGlzc2EpICovCisgICAgaW50IG91dHB1dEdhaW5TY2FsZSAgICAgICAgICAgIC8qITwgTmV3IGdhaW4gZm9yIG91dHB1dCBkYXRhIChleHBvbmVudCkgKi8KKykgeworICBzeW5RbWYtPm91dEdhaW5fbSA9IG91dHB1dEdhaW47CisgIHN5blFtZi0+b3V0R2Fpbl9lID0gb3V0cHV0R2FpblNjYWxlOwogfQogCisvKiBXaGVuIFFNRl8xNklOXzMyT1VUIGlzIHNldCwgc3ludGhlc2lzIGZ1bmN0aW9ucyBmb3IgMTYgYW5kIDMyIGJpdCBwYXJhbGxlbAorICogb3V0cHV0IGlzIGNvbXBpbGVkICovCisjZGVmaW5lIElOVF9QQ01fUU1GT1VUIElOVF9QQ00KKyNkZWZpbmUgU0FNUExFX0JJVFNfUU1GT1VUIFNBTVBMRV9CSVRTCisjaW5jbHVkZSAicW1mX3BjbS5oIgpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9zY2FsZS5jcHAgYi9saWJGREsvc3JjL3NjYWxlLmNwcAppbmRleCA1ODI5NDQzLi4yNGE4YTViIDEwMDY0NAotLS0gYS9saWJGREsvc3JjL3NjYWxlLmNwcAorKysgYi9saWJGREsvc3JjL3NjYWxlLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIExpYnJhcnkgZm9yIGJhc2ljIGNhbGN1bGF0aW9uIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKKwogICAgRGVzY3JpcHRpb246IFNjYWxpbmcgb3BlcmF0aW9ucwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCkBAIC05NiwxMSArMTA4LDEwIEBACiAgKiBJbmxpbmUgZGVmaW5pdGlvbnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBTQ0FMRV9JTkxJTkUgaW5saW5lCisjaW5jbHVkZSAic2NhbGUuaCIKIAotCi0jaWYgZGVmaW5lZChfX21pcHNfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwotI2luY2x1ZGUgIm1pcHMvc2NhbGUuY3BwIgorI2lmIGRlZmluZWQoX19taXBzX18pCisjaW5jbHVkZSAibWlwcy9zY2FsZV9taXBzLmNwcCIKIAogI2VsaWYgZGVmaW5lZChfX2FybV9fKQogI2luY2x1ZGUgImFybS9zY2FsZV9hcm0uY3BwIgpAQCAtMTE2LDM4ICsxMjcsMzIgQEAKICAqCiAgKi8KICNkZWZpbmUgRlVOQ1RJT05fc2NhbGVWYWx1ZXNfU0dMCi1TQ0FMRV9JTkxJTkUKLXZvaWQgc2NhbGVWYWx1ZXMoRklYUF9TR0wgKnZlY3RvciwgIC8qITwgVmVjdG9yICovCi0gICAgICAgICAgICAgICAgIElOVCBsZW4sICAgICAgICAgICAgLyohPCBMZW5ndGggKi8KLSAgICAgICAgICAgICAgICAgSU5UIHNjYWxlZmFjdG9yICAgICAvKiE8IFNjYWxlZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICkKLXsKK3ZvaWQgc2NhbGVWYWx1ZXMoRklYUF9TR0wgKnZlY3RvciwgLyohPCBWZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgSU5UIGxlbiwgICAgICAgICAgLyohPCBMZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgSU5UIHNjYWxlZmFjdG9yICAgLyohPCBTY2FsZWZhY3RvciAqLworKSB7CiAgIElOVCBpOwogCiAgIC8qIFJldHVybiBpZiBzY2FsZWZhY3RvciBpcyBaZXJvICovCi0gIGlmIChzY2FsZWZhY3Rvcj09MCkgcmV0dXJuOworICBpZiAoc2NhbGVmYWN0b3IgPT0gMCkgcmV0dXJuOwogCi0gIGlmKHNjYWxlZmFjdG9yID4gMCl7Ci0gICAgc2NhbGVmYWN0b3IgPSBmaXhtaW5fSShzY2FsZWZhY3RvciwoSU5UKShERlJBQ1RfQklUUy0xKSk7Ci0gICAgZm9yIChpID0gbGVuJjM7IGktLTsgKQotICAgIHsKKyAgaWYgKHNjYWxlZmFjdG9yID4gMCkgeworICAgIHNjYWxlZmFjdG9yID0gZml4bWluX0koc2NhbGVmYWN0b3IsIChJTlQpKEZSQUNUX0JJVFMgLSAxKSk7CisgICAgZm9yIChpID0gbGVuICYgMzsgaS0tOykgewogICAgICAgKih2ZWN0b3IrKykgPDw9IHNjYWxlZmFjdG9yOwogICAgIH0KLSAgICBmb3IgKGkgPSBsZW4+PjI7IGktLTsgKQotICAgIHsKKyAgICBmb3IgKGkgPSBsZW4gPj4gMjsgaS0tOykgewogICAgICAgKih2ZWN0b3IrKykgPDw9IHNjYWxlZmFjdG9yOwogICAgICAgKih2ZWN0b3IrKykgPDw9IHNjYWxlZmFjdG9yOwogICAgICAgKih2ZWN0b3IrKykgPDw9IHNjYWxlZmFjdG9yOwogICAgICAgKih2ZWN0b3IrKykgPDw9IHNjYWxlZmFjdG9yOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBJTlQgbmVnU2NhbGVmYWN0b3IgPSBmaXhtaW5fSSgtc2NhbGVmYWN0b3IsKElOVClERlJBQ1RfQklUUy0xKTsKLSAgICBmb3IgKGkgPSBsZW4mMzsgaS0tOyApCi0gICAgeworICAgIElOVCBuZWdTY2FsZWZhY3RvciA9IGZpeG1pbl9JKC1zY2FsZWZhY3RvciwgKElOVClGUkFDVF9CSVRTIC0gMSk7CisgICAgZm9yIChpID0gbGVuICYgMzsgaS0tOykgewogICAgICAgKih2ZWN0b3IrKykgPj49IG5lZ1NjYWxlZmFjdG9yOwogICAgIH0KLSAgICBmb3IgKGkgPSBsZW4+PjI7IGktLTsgKQotICAgIHsKKyAgICBmb3IgKGkgPSBsZW4gPj4gMjsgaS0tOykgewogICAgICAgKih2ZWN0b3IrKykgPj49IG5lZ1NjYWxlZmFjdG9yOwogICAgICAgKih2ZWN0b3IrKykgPj49IG5lZ1NjYWxlZmFjdG9yOwogICAgICAgKih2ZWN0b3IrKykgPj49IG5lZ1NjYWxlZmFjdG9yOwpAQCAtMTY3LDM3ICsxNzIsMzIgQEAKICAqLwogI2RlZmluZSBGVU5DVElPTl9zY2FsZVZhbHVlc19EQkwKIFNDQUxFX0lOTElORQotdm9pZCBzY2FsZVZhbHVlcyhGSVhQX0RCTCAqdmVjdG9yLCAgICAvKiE8IFZlY3RvciAqLwotICAgICAgICAgICAgICAgICBJTlQgbGVuLCAgICAgICAgICAgICAvKiE8IExlbmd0aCAqLwotICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgICAgICAvKiE8IFNjYWxlZmFjdG9yICovCi0gICAgICAgICAgICAgICAgKQotewordm9pZCBzY2FsZVZhbHVlcyhGSVhQX0RCTCAqdmVjdG9yLCAvKiE8IFZlY3RvciAqLworICAgICAgICAgICAgICAgICBJTlQgbGVuLCAgICAgICAgICAvKiE8IExlbmd0aCAqLworICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgICAvKiE8IFNjYWxlZmFjdG9yICovCispIHsKICAgSU5UIGk7CiAKICAgLyogUmV0dXJuIGlmIHNjYWxlZmFjdG9yIGlzIFplcm8gKi8KLSAgaWYgKHNjYWxlZmFjdG9yPT0wKSByZXR1cm47CisgIGlmIChzY2FsZWZhY3RvciA9PSAwKSByZXR1cm47CiAKLSAgaWYoc2NhbGVmYWN0b3IgPiAwKXsKLSAgICBzY2FsZWZhY3RvciA9IGZpeG1pbl9JKHNjYWxlZmFjdG9yLChJTlQpREZSQUNUX0JJVFMtMSk7Ci0gICAgZm9yIChpID0gbGVuJjM7IGktLTsgKQotICAgIHsKKyAgaWYgKHNjYWxlZmFjdG9yID4gMCkgeworICAgIHNjYWxlZmFjdG9yID0gZml4bWluX0koc2NhbGVmYWN0b3IsIChJTlQpREZSQUNUX0JJVFMgLSAxKTsKKyAgICBmb3IgKGkgPSBsZW4gJiAzOyBpLS07KSB7CiAgICAgICAqKHZlY3RvcisrKSA8PD0gc2NhbGVmYWN0b3I7CiAgICAgfQotICAgIGZvciAoaSA9IGxlbj4+MjsgaS0tOyApCi0gICAgeworICAgIGZvciAoaSA9IGxlbiA+PiAyOyBpLS07KSB7CiAgICAgICAqKHZlY3RvcisrKSA8PD0gc2NhbGVmYWN0b3I7CiAgICAgICAqKHZlY3RvcisrKSA8PD0gc2NhbGVmYWN0b3I7CiAgICAgICAqKHZlY3RvcisrKSA8PD0gc2NhbGVmYWN0b3I7CiAgICAgICAqKHZlY3RvcisrKSA8PD0gc2NhbGVmYWN0b3I7CiAgICAgfQogICB9IGVsc2UgewotICAgIElOVCBuZWdTY2FsZWZhY3RvciA9IGZpeG1pbl9JKC1zY2FsZWZhY3RvciwoSU5UKURGUkFDVF9CSVRTLTEpOwotICAgIGZvciAoaSA9IGxlbiYzOyBpLS07ICkKLSAgICB7CisgICAgSU5UIG5lZ1NjYWxlZmFjdG9yID0gZml4bWluX0koLXNjYWxlZmFjdG9yLCAoSU5UKURGUkFDVF9CSVRTIC0gMSk7CisgICAgZm9yIChpID0gbGVuICYgMzsgaS0tOykgewogICAgICAgKih2ZWN0b3IrKykgPj49IG5lZ1NjYWxlZmFjdG9yOwogICAgIH0KLSAgICBmb3IgKGkgPSBsZW4+PjI7IGktLTsgKQotICAgIHsKKyAgICBmb3IgKGkgPSBsZW4gPj4gMjsgaS0tOykgewogICAgICAgKih2ZWN0b3IrKykgPj49IG5lZ1NjYWxlZmFjdG9yOwogICAgICAgKih2ZWN0b3IrKykgPj49IG5lZ1NjYWxlZmFjdG9yOwogICAgICAgKih2ZWN0b3IrKykgPj49IG5lZ1NjYWxlZmFjdG9yOwpAQCAtMjA3LDYgKzIwNywxNjcgQEAKIH0KICNlbmRpZgogCisjaWZuZGVmIEZVTkNUSU9OX3NjYWxlVmFsdWVzU2F0dXJhdGVfREJMCisvKiEKKyAqCisgKiAgXGJyaWVmICBNdWx0aXBseSBpbnB1dCB2ZWN0b3IgYnkgXGYkIDJee3NjYWxlZmFjdG9yfSBcZiQKKyAqICBccGFyYW0gdmVjdG9yICAgICAgc291cmNlL2Rlc3RpbmF0aW9uIGJ1ZmZlcgorICogIFxwYXJhbSBsZW4gICAgICAgICBsZW5ndGggb2YgdmVjdG9yCisgKiAgXHBhcmFtIHNjYWxlZmFjdG9yIGFtb3VudCBvZiBzaGlmdHMgdG8gYmUgYXBwbGllZAorICogIFxyZXR1cm4gdm9pZAorICoKKyAqLworI2RlZmluZSBGVU5DVElPTl9zY2FsZVZhbHVlc1NhdHVyYXRlX0RCTAorU0NBTEVfSU5MSU5FCit2b2lkIHNjYWxlVmFsdWVzU2F0dXJhdGUoRklYUF9EQkwgKnZlY3RvciwgLyohPCBWZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbGVuLCAgICAgICAgICAvKiE8IExlbmd0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzY2FsZWZhY3RvciAgIC8qITwgU2NhbGVmYWN0b3IgKi8KKykgeworICBJTlQgaTsKKworICAvKiBSZXR1cm4gaWYgc2NhbGVmYWN0b3IgaXMgWmVybyAqLworICBpZiAoc2NhbGVmYWN0b3IgPT0gMCkgcmV0dXJuOworCisgIHNjYWxlZmFjdG9yID0gZml4bWF4X0koZml4bWluX0koc2NhbGVmYWN0b3IsIChJTlQpREZSQUNUX0JJVFMgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UKSAtIChERlJBQ1RfQklUUyAtIDEpKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICB2ZWN0b3JbaV0gPSBzY2FsZVZhbHVlU2F0dXJhdGUodmVjdG9yW2ldLCBzY2FsZWZhY3Rvcik7CisgIH0KK30KKyNlbmRpZiAvKiBGVU5DVElPTl9zY2FsZVZhbHVlc1NhdHVyYXRlX0RCTCAqLworCisjaWZuZGVmIEZVTkNUSU9OX3NjYWxlVmFsdWVzU2F0dXJhdGVfREJMX0RCTAorLyohCisgKgorICogIFxicmllZiAgTXVsdGlwbHkgaW5wdXQgdmVjdG9yIGJ5IFxmJCAyXntzY2FsZWZhY3Rvcn0gXGYkCisgKiAgXHBhcmFtIGRzdCAgICAgICAgIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogIFxwYXJhbSBzcmMgICAgICAgICBzb3VyY2UgYnVmZmVyCisgKiAgXHBhcmFtIGxlbiAgICAgICAgIGxlbmd0aCBvZiB2ZWN0b3IKKyAqICBccGFyYW0gc2NhbGVmYWN0b3IgYW1vdW50IG9mIHNoaWZ0cyB0byBiZSBhcHBsaWVkCisgKiAgXHJldHVybiB2b2lkCisgKgorICovCisjZGVmaW5lIEZVTkNUSU9OX3NjYWxlVmFsdWVzU2F0dXJhdGVfREJMX0RCTAorU0NBTEVfSU5MSU5FCit2b2lkIHNjYWxlVmFsdWVzU2F0dXJhdGUoRklYUF9EQkwgKmRzdCwgIC8qITwgT3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnNyYywgIC8qITwgSW5wdXQgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBsZW4sICAgICAgICAvKiE8IExlbmd0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzY2FsZWZhY3RvciAvKiE8IFNjYWxlZmFjdG9yICovCispIHsKKyAgSU5UIGk7CisKKyAgLyogUmV0dXJuIGlmIHNjYWxlZmFjdG9yIGlzIFplcm8gKi8KKyAgaWYgKHNjYWxlZmFjdG9yID09IDApIHsKKyAgICBGREttZW1tb3ZlKGRzdCwgc3JjLCBsZW4gKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICByZXR1cm47CisgIH0KKworICBzY2FsZWZhY3RvciA9IGZpeG1heF9JKGZpeG1pbl9JKHNjYWxlZmFjdG9yLCAoSU5UKURGUkFDVF9CSVRTIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKElOVCkgLSAoREZSQUNUX0JJVFMgLSAxKSk7CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgZHN0W2ldID0gc2NhbGVWYWx1ZVNhdHVyYXRlKHNyY1tpXSwgc2NhbGVmYWN0b3IpOworICB9Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fc2NhbGVWYWx1ZXNTYXR1cmF0ZV9EQkxfREJMICovCisKKyNpZm5kZWYgRlVOQ1RJT05fc2NhbGVWYWx1ZXNTYXR1cmF0ZV9TR0xfREJMCisvKiEKKyAqCisgKiAgXGJyaWVmICBNdWx0aXBseSBpbnB1dCB2ZWN0b3IgYnkgXGYkIDJee3NjYWxlZmFjdG9yfSBcZiQKKyAqICBccGFyYW0gZHN0ICAgICAgICAgZGVzdGluYXRpb24gYnVmZmVyIChGSVhQX1NHTCkKKyAqICBccGFyYW0gc3JjICAgICAgICAgc291cmNlIGJ1ZmZlciAoRklYUF9EQkwpCisgKiAgXHBhcmFtIGxlbiAgICAgICAgIGxlbmd0aCBvZiB2ZWN0b3IKKyAqICBccGFyYW0gc2NhbGVmYWN0b3IgYW1vdW50IG9mIHNoaWZ0cyB0byBiZSBhcHBsaWVkCisgKiAgXHJldHVybiB2b2lkCisgKgorICovCisjZGVmaW5lIEZVTkNUSU9OX3NjYWxlVmFsdWVzU2F0dXJhdGVfU0dMX0RCTAorU0NBTEVfSU5MSU5FCit2b2lkIHNjYWxlVmFsdWVzU2F0dXJhdGUoRklYUF9TR0wgKmRzdCwgICAvKiE8IE91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzcmMsICAgLyohPCBJbnB1dCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGxlbiwgICAgICAgICAvKiE8IExlbmd0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzY2FsZWZhY3RvcikgLyohPCBTY2FsZWZhY3RvciAqLworeworICBJTlQgaTsKKyAgc2NhbGVmYWN0b3IgPSBmaXhtYXhfSShmaXhtaW5fSShzY2FsZWZhY3RvciwgKElOVClERlJBQ1RfQklUUyAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQpIC0gKERGUkFDVF9CSVRTIC0gMSkpOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGRzdFtpXSA9IEZYX0RCTDJGWF9TR0woZkFkZFNhdHVyYXRlKHNjYWxlVmFsdWVTYXR1cmF0ZShzcmNbaV0sIHNjYWxlZmFjdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpMHg4MDAwKSk7CisgIH0KK30KKyNlbmRpZiAvKiBGVU5DVElPTl9zY2FsZVZhbHVlc1NhdHVyYXRlX1NHTF9EQkwgKi8KKworI2lmbmRlZiBGVU5DVElPTl9zY2FsZVZhbHVlc1NhdHVyYXRlX1NHTAorLyohCisgKgorICogIFxicmllZiAgTXVsdGlwbHkgaW5wdXQgdmVjdG9yIGJ5IFxmJCAyXntzY2FsZWZhY3Rvcn0gXGYkCisgKiAgXHBhcmFtIHZlY3RvciAgICAgIHNvdXJjZS9kZXN0aW5hdGlvbiBidWZmZXIKKyAqICBccGFyYW0gbGVuICAgICAgICAgbGVuZ3RoIG9mIHZlY3RvcgorICogIFxwYXJhbSBzY2FsZWZhY3RvciBhbW91bnQgb2Ygc2hpZnRzIHRvIGJlIGFwcGxpZWQKKyAqICBccmV0dXJuIHZvaWQKKyAqCisgKi8KKyNkZWZpbmUgRlVOQ1RJT05fc2NhbGVWYWx1ZXNTYXR1cmF0ZV9TR0wKK1NDQUxFX0lOTElORQordm9pZCBzY2FsZVZhbHVlc1NhdHVyYXRlKEZJWFBfU0dMICp2ZWN0b3IsIC8qITwgVmVjdG9yICovCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGxlbiwgICAgICAgICAgLyohPCBMZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2NhbGVmYWN0b3IgICAvKiE8IFNjYWxlZmFjdG9yICovCispIHsKKyAgSU5UIGk7CisKKyAgLyogUmV0dXJuIGlmIHNjYWxlZmFjdG9yIGlzIFplcm8gKi8KKyAgaWYgKHNjYWxlZmFjdG9yID09IDApIHJldHVybjsKKworICBzY2FsZWZhY3RvciA9IGZpeG1heF9JKGZpeG1pbl9JKHNjYWxlZmFjdG9yLCAoSU5UKURGUkFDVF9CSVRTIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKElOVCkgLSAoREZSQUNUX0JJVFMgLSAxKSk7CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgdmVjdG9yW2ldID0gRlhfREJMMkZYX1NHTCgKKyAgICAgICAgc2NhbGVWYWx1ZVNhdHVyYXRlKEZYX1NHTDJGWF9EQkwodmVjdG9yW2ldKSwgc2NhbGVmYWN0b3IpKTsKKyAgfQorfQorI2VuZGlmIC8qIEZVTkNUSU9OX3NjYWxlVmFsdWVzU2F0dXJhdGVfU0dMICovCisKKyNpZm5kZWYgRlVOQ1RJT05fc2NhbGVWYWx1ZXNTYXR1cmF0ZV9TR0xfU0dMCisvKiEKKyAqCisgKiAgXGJyaWVmICBNdWx0aXBseSBpbnB1dCB2ZWN0b3IgYnkgXGYkIDJee3NjYWxlZmFjdG9yfSBcZiQKKyAqICBccGFyYW0gZHN0ICAgICAgICAgZGVzdGluYXRpb24gYnVmZmVyCisgKiAgXHBhcmFtIHNyYyAgICAgICAgIHNvdXJjZSBidWZmZXIKKyAqICBccGFyYW0gbGVuICAgICAgICAgbGVuZ3RoIG9mIHZlY3RvcgorICogIFxwYXJhbSBzY2FsZWZhY3RvciBhbW91bnQgb2Ygc2hpZnRzIHRvIGJlIGFwcGxpZWQKKyAqICBccmV0dXJuIHZvaWQKKyAqCisgKi8KKyNkZWZpbmUgRlVOQ1RJT05fc2NhbGVWYWx1ZXNTYXR1cmF0ZV9TR0xfU0dMCitTQ0FMRV9JTkxJTkUKK3ZvaWQgc2NhbGVWYWx1ZXNTYXR1cmF0ZShGSVhQX1NHTCAqZHN0LCAgLyohPCBPdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAqc3JjLCAgLyohPCBJbnB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBsZW4sICAgICAgICAvKiE8IExlbmd0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzY2FsZWZhY3RvciAvKiE8IFNjYWxlZmFjdG9yICovCispIHsKKyAgSU5UIGk7CisKKyAgLyogUmV0dXJuIGlmIHNjYWxlZmFjdG9yIGlzIFplcm8gKi8KKyAgaWYgKHNjYWxlZmFjdG9yID09IDApIHsKKyAgICBGREttZW1tb3ZlKGRzdCwgc3JjLCBsZW4gKiBzaXplb2YoRklYUF9TR0wpKTsKKyAgICByZXR1cm47CisgIH0KKworICBzY2FsZWZhY3RvciA9IGZpeG1heF9JKGZpeG1pbl9JKHNjYWxlZmFjdG9yLCAoSU5UKURGUkFDVF9CSVRTIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKElOVCkgLSAoREZSQUNUX0JJVFMgLSAxKSk7CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgZHN0W2ldID0KKyAgICAgICAgRlhfREJMMkZYX1NHTChzY2FsZVZhbHVlU2F0dXJhdGUoRlhfU0dMMkZYX0RCTChzcmNbaV0pLCBzY2FsZWZhY3RvcikpOworICB9Cit9CisjZW5kaWYgLyogRlVOQ1RJT05fc2NhbGVWYWx1ZXNTYXR1cmF0ZV9TR0xfU0dMICovCisKICNpZm5kZWYgRlVOQ1RJT05fc2NhbGVWYWx1ZXNfREJMREJMCiAvKiEKICAqCkBAIC0yMjUsMzggKzM4NiwxMzYgQEAKICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnNyYywgLyohPCBzcmMgVmVjdG9yICovCiAgICAgICAgICAgICAgICAgIElOVCBsZW4sICAgICAgICAgICAgIC8qITwgTGVuZ3RoICovCiAgICAgICAgICAgICAgICAgIElOVCBzY2FsZWZhY3RvciAgICAgIC8qITwgU2NhbGVmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICApCi17CispIHsKICAgSU5UIGk7CiAKICAgLyogUmV0dXJuIGlmIHNjYWxlZmFjdG9yIGlzIFplcm8gKi8KLSAgaWYgKHNjYWxlZmFjdG9yPT0wKSB7Ci0JaWYgKGRzdCAhPSBzcmMpCi0gICAgICBGREttZW1tb3ZlKGRzdCwgc3JjLCBsZW4qc2l6ZW9mKEZJWFBfREJMKSk7Ci0gIH0KLSAgZWxzZSB7Ci0KLSAgICBpZihzY2FsZWZhY3RvciA+IDApewotICAgICAgc2NhbGVmYWN0b3IgPSBmaXhtaW5fSShzY2FsZWZhY3RvciwoSU5UKURGUkFDVF9CSVRTLTEpOwotICAgICAgZm9yIChpID0gbGVuJjM7IGktLTsgKQotICAgICAgeworICBpZiAoc2NhbGVmYWN0b3IgPT0gMCkgeworICAgIGlmIChkc3QgIT0gc3JjKSBGREttZW1tb3ZlKGRzdCwgc3JjLCBsZW4gKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoc2NhbGVmYWN0b3IgPiAwKSB7CisgICAgICBzY2FsZWZhY3RvciA9IGZpeG1pbl9JKHNjYWxlZmFjdG9yLCAoSU5UKURGUkFDVF9CSVRTIC0gMSk7CisgICAgICBmb3IgKGkgPSBsZW4gJiAzOyBpLS07KSB7CiAgICAgICAgICooZHN0KyspID0gKihzcmMrKykgPDwgc2NhbGVmYWN0b3I7CiAgICAgICB9Ci0gICAgICBmb3IgKGkgPSBsZW4+PjI7IGktLTsgKQotICAgICAgeworICAgICAgZm9yIChpID0gbGVuID4+IDI7IGktLTspIHsKICAgICAgICAgKihkc3QrKykgPSAqKHNyYysrKSA8PCBzY2FsZWZhY3RvcjsKICAgICAgICAgKihkc3QrKykgPSAqKHNyYysrKSA8PCBzY2FsZWZhY3RvcjsKICAgICAgICAgKihkc3QrKykgPSAqKHNyYysrKSA8PCBzY2FsZWZhY3RvcjsKICAgICAgICAgKihkc3QrKykgPSAqKHNyYysrKSA8PCBzY2FsZWZhY3RvcjsKICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgSU5UIG5lZ1NjYWxlZmFjdG9yID0gZml4bWluX0koLXNjYWxlZmFjdG9yLChJTlQpREZSQUNUX0JJVFMtMSk7Ci0gICAgICBmb3IgKGkgPSBsZW4mMzsgaS0tOyApCi0gICAgICB7CisgICAgICBJTlQgbmVnU2NhbGVmYWN0b3IgPSBmaXhtaW5fSSgtc2NhbGVmYWN0b3IsIChJTlQpREZSQUNUX0JJVFMgLSAxKTsKKyAgICAgIGZvciAoaSA9IGxlbiAmIDM7IGktLTspIHsKICAgICAgICAgKihkc3QrKykgPSAqKHNyYysrKSA+PiBuZWdTY2FsZWZhY3RvcjsKICAgICAgIH0KLSAgICAgIGZvciAoaSA9IGxlbj4+MjsgaS0tOyApCi0gICAgICB7CisgICAgICBmb3IgKGkgPSBsZW4gPj4gMjsgaS0tOykgeworICAgICAgICAqKGRzdCsrKSA9ICooc3JjKyspID4+IG5lZ1NjYWxlZmFjdG9yOworICAgICAgICAqKGRzdCsrKSA9ICooc3JjKyspID4+IG5lZ1NjYWxlZmFjdG9yOworICAgICAgICAqKGRzdCsrKSA9ICooc3JjKyspID4+IG5lZ1NjYWxlZmFjdG9yOworICAgICAgICAqKGRzdCsrKSA9ICooc3JjKyspID4+IG5lZ1NjYWxlZmFjdG9yOworICAgICAgfQorICAgIH0KKyAgfQorfQorI2VuZGlmCisKKyNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCisjaWZuZGVmIEZVTkNUSU9OX3NjYWxlVmFsdWVzX1BDTURCTAorLyohCisgKgorICogIFxicmllZiAgTXVsdGlwbHkgaW5wdXQgdmVjdG9yIHNyYyBieSBcZiQgMl57c2NhbGVmYWN0b3J9IFxmJAorICogICAgICAgICAgYW5kIHBsYWNlIHJlc3VsdCBpbnRvIGRzdAorICogIFxwYXJhbSBkc3QgZGV0aW5hdGlvbiBidWZmZXIKKyAqICBccGFyYW0gc3JjIHNvdXJjZSBidWZmZXIKKyAqICBccGFyYW0gbGVuIG11c3QgYmUgbGFyZ2VyIHRoYW4gNAorICogIFxwYXJhbSBzY2FsZWZhY3RvciBhbW91bnQgb2YgbGVmdCBzaGlmdHMgdG8gYmUgYXBwbGllZAorICogIFxyZXR1cm4gdm9pZAorICoKKyAqLworI2RlZmluZSBGVU5DVElPTl9zY2FsZVZhbHVlc19QQ01EQkwKK1NDQUxFX0lOTElORQordm9pZCBzY2FsZVZhbHVlcyhGSVhQX1BDTSAqZHN0LCAgICAgICAvKiE8IGRzdCBWZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnNyYywgLyohPCBzcmMgVmVjdG9yICovCisgICAgICAgICAgICAgICAgIElOVCBsZW4sICAgICAgICAgICAgIC8qITwgTGVuZ3RoICovCisgICAgICAgICAgICAgICAgIElOVCBzY2FsZWZhY3RvciAgICAgIC8qITwgU2NhbGVmYWN0b3IgKi8KKykgeworICBJTlQgaTsKKworICBzY2FsZWZhY3RvciAtPSBERlJBQ1RfQklUUyAtIFNBTVBMRV9CSVRTOworCisgIC8qIFJldHVybiBpZiBzY2FsZWZhY3RvciBpcyBaZXJvICovCisgIHsKKyAgICBpZiAoc2NhbGVmYWN0b3IgPiAwKSB7CisgICAgICBzY2FsZWZhY3RvciA9IGZpeG1pbl9JKHNjYWxlZmFjdG9yLCAoSU5UKURGUkFDVF9CSVRTIC0gMSk7CisgICAgICBmb3IgKGkgPSBsZW4gJiAzOyBpLS07KSB7CisgICAgICAgICooZHN0KyspID0gKEZJWFBfUENNKSgqKHNyYysrKSA8PCBzY2FsZWZhY3Rvcik7CisgICAgICB9CisgICAgICBmb3IgKGkgPSBsZW4gPj4gMjsgaS0tOykgeworICAgICAgICAqKGRzdCsrKSA9IChGSVhQX1BDTSkoKihzcmMrKykgPDwgc2NhbGVmYWN0b3IpOworICAgICAgICAqKGRzdCsrKSA9IChGSVhQX1BDTSkoKihzcmMrKykgPDwgc2NhbGVmYWN0b3IpOworICAgICAgICAqKGRzdCsrKSA9IChGSVhQX1BDTSkoKihzcmMrKykgPDwgc2NhbGVmYWN0b3IpOworICAgICAgICAqKGRzdCsrKSA9IChGSVhQX1BDTSkoKihzcmMrKykgPDwgc2NhbGVmYWN0b3IpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBJTlQgbmVnU2NhbGVmYWN0b3IgPSBmaXhtaW5fSSgtc2NhbGVmYWN0b3IsIChJTlQpREZSQUNUX0JJVFMgLSAxKTsKKyAgICAgIGZvciAoaSA9IGxlbiAmIDM7IGktLTspIHsKKyAgICAgICAgKihkc3QrKykgPSAoRklYUF9QQ00pKCooc3JjKyspID4+IG5lZ1NjYWxlZmFjdG9yKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IGxlbiA+PiAyOyBpLS07KSB7CisgICAgICAgICooZHN0KyspID0gKEZJWFBfUENNKSgqKHNyYysrKSA+PiBuZWdTY2FsZWZhY3Rvcik7CisgICAgICAgICooZHN0KyspID0gKEZJWFBfUENNKSgqKHNyYysrKSA+PiBuZWdTY2FsZWZhY3Rvcik7CisgICAgICAgICooZHN0KyspID0gKEZJWFBfUENNKSgqKHNyYysrKSA+PiBuZWdTY2FsZWZhY3Rvcik7CisgICAgICAgICooZHN0KyspID0gKEZJWFBfUENNKSgqKHNyYysrKSA+PiBuZWdTY2FsZWZhY3Rvcik7CisgICAgICB9CisgICAgfQorICB9Cit9CisjZW5kaWYKKyNlbmRpZiAvKiAoU0FNUExFX0JJVFMgPT0gMTYpICovCisKKyNpZm5kZWYgRlVOQ1RJT05fc2NhbGVWYWx1ZXNfU0dMU0dMCisvKiEKKyAqCisgKiAgXGJyaWVmICBNdWx0aXBseSBpbnB1dCB2ZWN0b3Igc3JjIGJ5IFxmJCAyXntzY2FsZWZhY3Rvcn0gXGYkCisgKiAgICAgICAgICBhbmQgcGxhY2UgcmVzdWx0IGludG8gZHN0CisgKiAgXHBhcmFtIGRzdCBkZXRpbmF0aW9uIGJ1ZmZlcgorICogIFxwYXJhbSBzcmMgc291cmNlIGJ1ZmZlcgorICogIFxwYXJhbSBsZW4gbXVzdCBiZSBsYXJnZXIgdGhhbiA0CisgKiAgXHBhcmFtIHNjYWxlZmFjdG9yIGFtb3VudCBvZiBsZWZ0IHNoaWZ0cyB0byBiZSBhcHBsaWVkCisgKiAgXHJldHVybiB2b2lkCisgKgorICovCisjZGVmaW5lIEZVTkNUSU9OX3NjYWxlVmFsdWVzX1NHTFNHTAorU0NBTEVfSU5MSU5FCit2b2lkIHNjYWxlVmFsdWVzKEZJWFBfU0dMICpkc3QsICAgICAgIC8qITwgZHN0IFZlY3RvciAqLworICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1NHTCAqc3JjLCAvKiE8IHNyYyBWZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgSU5UIGxlbiwgICAgICAgICAgICAgLyohPCBMZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgSU5UIHNjYWxlZmFjdG9yICAgICAgLyohPCBTY2FsZWZhY3RvciAqLworKSB7CisgIElOVCBpOworCisgIC8qIFJldHVybiBpZiBzY2FsZWZhY3RvciBpcyBaZXJvICovCisgIGlmIChzY2FsZWZhY3RvciA9PSAwKSB7CisgICAgaWYgKGRzdCAhPSBzcmMpIEZES21lbW1vdmUoZHN0LCBzcmMsIGxlbiAqIHNpemVvZihGSVhQX0RCTCkpOworICB9IGVsc2UgeworICAgIGlmIChzY2FsZWZhY3RvciA+IDApIHsKKyAgICAgIHNjYWxlZmFjdG9yID0gZml4bWluX0koc2NhbGVmYWN0b3IsIChJTlQpREZSQUNUX0JJVFMgLSAxKTsKKyAgICAgIGZvciAoaSA9IGxlbiAmIDM7IGktLTspIHsKKyAgICAgICAgKihkc3QrKykgPSAqKHNyYysrKSA8PCBzY2FsZWZhY3RvcjsKKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IGxlbiA+PiAyOyBpLS07KSB7CisgICAgICAgICooZHN0KyspID0gKihzcmMrKykgPDwgc2NhbGVmYWN0b3I7CisgICAgICAgICooZHN0KyspID0gKihzcmMrKykgPDwgc2NhbGVmYWN0b3I7CisgICAgICAgICooZHN0KyspID0gKihzcmMrKykgPDwgc2NhbGVmYWN0b3I7CisgICAgICAgICooZHN0KyspID0gKihzcmMrKykgPDwgc2NhbGVmYWN0b3I7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIElOVCBuZWdTY2FsZWZhY3RvciA9IGZpeG1pbl9JKC1zY2FsZWZhY3RvciwgKElOVClERlJBQ1RfQklUUyAtIDEpOworICAgICAgZm9yIChpID0gbGVuICYgMzsgaS0tOykgeworICAgICAgICAqKGRzdCsrKSA9ICooc3JjKyspID4+IG5lZ1NjYWxlZmFjdG9yOworICAgICAgfQorICAgICAgZm9yIChpID0gbGVuID4+IDI7IGktLTspIHsKICAgICAgICAgKihkc3QrKykgPSAqKHNyYysrKSA+PiBuZWdTY2FsZWZhY3RvcjsKICAgICAgICAgKihkc3QrKykgPSAqKHNyYysrKSA+PiBuZWdTY2FsZWZhY3RvcjsKICAgICAgICAgKihkc3QrKykgPSAqKHNyYysrKSA+PiBuZWdTY2FsZWZhY3RvcjsKQEAgLTI3Nyw2MiArNTM2LDU5IEBACiAgKi8KICNkZWZpbmUgRlVOQ1RJT05fc2NhbGVWYWx1ZXNXaXRoRmFjdG9yX0RCTAogU0NBTEVfSU5MSU5FCi12b2lkIHNjYWxlVmFsdWVzV2l0aEZhY3RvcigKLSAgICAgICAgRklYUF9EQkwgKnZlY3RvciwKLSAgICAgICAgRklYUF9EQkwgZmFjdG9yLAotICAgICAgICBJTlQgbGVuLAotICAgICAgICBJTlQgc2NhbGVmYWN0b3IKLSAgICAgICAgKQotewordm9pZCBzY2FsZVZhbHVlc1dpdGhGYWN0b3IoRklYUF9EQkwgKnZlY3RvciwgRklYUF9EQkwgZmFjdG9yLCBJTlQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNjYWxlZmFjdG9yKSB7CiAgIElOVCBpOwogCiAgIC8qIENvbXBlbnNhdGUgZk11bHREaXYyICovCiAgIHNjYWxlZmFjdG9yKys7CiAKLSAgaWYoc2NhbGVmYWN0b3IgPiAwKXsKLSAgICBzY2FsZWZhY3RvciA9IGZpeG1pbl9JKHNjYWxlZmFjdG9yLChJTlQpREZSQUNUX0JJVFMtMSk7Ci0gICAgZm9yIChpID0gbGVuJjM7IGktLTsgKQotICAgIHsKKyAgaWYgKHNjYWxlZmFjdG9yID4gMCkgeworICAgIHNjYWxlZmFjdG9yID0gZml4bWluX0koc2NhbGVmYWN0b3IsIChJTlQpREZSQUNUX0JJVFMgLSAxKTsKKyAgICBmb3IgKGkgPSBsZW4gJiAzOyBpLS07KSB7CiAgICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPDwgc2NhbGVmYWN0b3I7CiAgICAgICB2ZWN0b3IrKzsKICAgICB9Ci0gICAgZm9yIChpID0gbGVuPj4yOyBpLS07ICkKLSAgICB7Ci0gICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPDwgc2NhbGVmYWN0b3I7IHZlY3RvcisrOwotICAgICAgKnZlY3RvciA9IGZNdWx0RGl2MigqdmVjdG9yLCBmYWN0b3IpIDw8IHNjYWxlZmFjdG9yOyB2ZWN0b3IrKzsKLSAgICAgICp2ZWN0b3IgPSBmTXVsdERpdjIoKnZlY3RvciwgZmFjdG9yKSA8PCBzY2FsZWZhY3RvcjsgdmVjdG9yKys7Ci0gICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPDwgc2NhbGVmYWN0b3I7IHZlY3RvcisrOworICAgIGZvciAoaSA9IGxlbiA+PiAyOyBpLS07KSB7CisgICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPDwgc2NhbGVmYWN0b3I7CisgICAgICB2ZWN0b3IrKzsKKyAgICAgICp2ZWN0b3IgPSBmTXVsdERpdjIoKnZlY3RvciwgZmFjdG9yKSA8PCBzY2FsZWZhY3RvcjsKKyAgICAgIHZlY3RvcisrOworICAgICAgKnZlY3RvciA9IGZNdWx0RGl2MigqdmVjdG9yLCBmYWN0b3IpIDw8IHNjYWxlZmFjdG9yOworICAgICAgdmVjdG9yKys7CisgICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPDwgc2NhbGVmYWN0b3I7CisgICAgICB2ZWN0b3IrKzsKICAgICB9CiAgIH0gZWxzZSB7Ci0gICAgSU5UIG5lZ1NjYWxlZmFjdG9yID0gZml4bWluX0koLXNjYWxlZmFjdG9yLChJTlQpREZSQUNUX0JJVFMtMSk7Ci0gICAgZm9yIChpID0gbGVuJjM7IGktLTsgKQotICAgIHsKKyAgICBJTlQgbmVnU2NhbGVmYWN0b3IgPSBmaXhtaW5fSSgtc2NhbGVmYWN0b3IsIChJTlQpREZSQUNUX0JJVFMgLSAxKTsKKyAgICBmb3IgKGkgPSBsZW4gJiAzOyBpLS07KSB7CiAgICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPj4gbmVnU2NhbGVmYWN0b3I7CiAgICAgICB2ZWN0b3IrKzsKICAgICB9Ci0gICAgZm9yIChpID0gbGVuPj4yOyBpLS07ICkKLSAgICB7Ci0gICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPj4gbmVnU2NhbGVmYWN0b3I7IHZlY3RvcisrOwotICAgICAgKnZlY3RvciA9IGZNdWx0RGl2MigqdmVjdG9yLCBmYWN0b3IpID4+IG5lZ1NjYWxlZmFjdG9yOyB2ZWN0b3IrKzsKLSAgICAgICp2ZWN0b3IgPSBmTXVsdERpdjIoKnZlY3RvciwgZmFjdG9yKSA+PiBuZWdTY2FsZWZhY3RvcjsgdmVjdG9yKys7Ci0gICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPj4gbmVnU2NhbGVmYWN0b3I7IHZlY3RvcisrOworICAgIGZvciAoaSA9IGxlbiA+PiAyOyBpLS07KSB7CisgICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPj4gbmVnU2NhbGVmYWN0b3I7CisgICAgICB2ZWN0b3IrKzsKKyAgICAgICp2ZWN0b3IgPSBmTXVsdERpdjIoKnZlY3RvciwgZmFjdG9yKSA+PiBuZWdTY2FsZWZhY3RvcjsKKyAgICAgIHZlY3RvcisrOworICAgICAgKnZlY3RvciA9IGZNdWx0RGl2MigqdmVjdG9yLCBmYWN0b3IpID4+IG5lZ1NjYWxlZmFjdG9yOworICAgICAgdmVjdG9yKys7CisgICAgICAqdmVjdG9yID0gZk11bHREaXYyKCp2ZWN0b3IsIGZhY3RvcikgPj4gbmVnU2NhbGVmYWN0b3I7CisgICAgICB2ZWN0b3IrKzsKICAgICB9CiAgIH0KIH0KICNlbmRpZiAvKiBGVU5DVElPTl9zY2FsZVZhbHVlc1dpdGhGYWN0b3JfREJMICovCiAKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgSU1QT1JUQU5UIE5PVEUgZm9yIHVzYWdlIG9mIGdldFNjYWxlZmFjdG9yKCkKIAotSU1QT1JUQU5UIE5PVEUgZm9yIHVzYWdlIG9mIGdldFNjYWxlZmFjdG9yKCkKKyAgSWYgdGhlIGlucHV0IGFycmF5IGNvbnRhaW5zIG5lZ2F0aXZlIHZhbHVlcyB0b28sIHRoZW4gdGhlc2UgZnVuY3Rpb25zIG1heQorICBzb21ldGltZXMgcmV0dXJuIHRoZSBhY3R1YWwgbWF4aW11bSB2YWx1ZSBtaW51cyAxLCBkdWUgdG8gdGhlIG5hdHVyZSBvZiB0aGUKKyAgYXBwbGllZCBhbGdvcml0aG0uIFNvIGJlIGNhcmVmdWwgd2l0aCBwb3NzaWJsZSBmcmFjdGlvbmFsIC0xIHZhbHVlcyB0aGF0IG1heQorICBsZWFkIHRvIG92ZXJmbG93cyB3aGVuIGJlaW5nIGZQb3cyKCknZWQuCiAKLUlmIHRoZSBpbnB1dCBhcnJheSBjb250YWlucyBuZWdhdGl2ZSB2YWx1ZXMgdG9vLCB0aGVuIHRoZXNlIGZ1bmN0aW9ucyBtYXkgc29tZXRpbWVzIHJldHVybgotdGhlIGFjdHVhbCBtYXhpbXVtIHZhbHVlIG1pbnVzIDEsIGR1ZSB0byB0aGUgbmF0dXJlIG9mIHRoZSBhcHBsaWVkIGFsZ29yaXRobS4KLVNvIGJlIGNhcmVmdWwgd2l0aCBwb3NzaWJsZSBmcmFjdGlvbmFsIC0xIHZhbHVlcyB0aGF0IG1heSBsZWFkIHRvIG92ZXJmbG93cyB3aGVuIGJlaW5nIGZQb3cyKCknZWQuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgRlVOQ1RJT05fZ2V0U2NhbGVmYWN0b3JTaG9ydAogLyohCkBAIC0zNDYsMTcgKzYwMiwxNyBAQAogU0NBTEVfSU5MSU5FCiBJTlQgZ2V0U2NhbGVmYWN0b3JTaG9ydChjb25zdCBTSE9SVCAqdmVjdG9yLCAvKiE8IFBvaW50ZXIgdG8gaW5wdXQgdmVjdG9yICovCiAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbGVuICAgICAgICAgICAgICAvKiE8IExlbmd0aCBvZiBpbnB1dCB2ZWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKQoteworKSB7CiAgIElOVCBpOwogICBTSE9SVCB0ZW1wLCBtYXhWYWwgPSAwOwogCi0gIGZvcihpPWxlbjtpIT0wO2ktLSl7CisgIGZvciAoaSA9IGxlbjsgaSAhPSAwOyBpLS0pIHsKICAgICB0ZW1wID0gKFNIT1JUKSgqdmVjdG9yKyspOwotICAgIG1heFZhbCB8PSAodGVtcF4odGVtcD4+KFNIT1JUX0JJVFMtMSkpKTsKKyAgICBtYXhWYWwgfD0gKHRlbXAgXiAodGVtcCA+PiAoU0hPUlRfQklUUyAtIDEpKSk7CiAgIH0KIAotICByZXR1cm4gZml4bWF4X0koKElOVCkwLChJTlQpKGZpeG5vcm16X0QoKElOVCltYXhWYWwpIC0gKElOVCkxIC0gKElOVCkoREZSQUNUX0JJVFMgLSBTSE9SVF9CSVRTKSkpOworICByZXR1cm4gZml4bWF4X0koKElOVCkwLCAoSU5UKShmaXhub3Jtel9EKChJTlQpbWF4VmFsKSAtIChJTlQpMSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQpKERGUkFDVF9CSVRTIC0gU0hPUlRfQklUUykpKTsKIH0KICNlbmRpZgogCkBAIC0zNzIsMTcgKzYyOCwxNyBAQAogU0NBTEVfSU5MSU5FCiBJTlQgZ2V0U2NhbGVmYWN0b3JQQ00oY29uc3QgSU5UX1BDTSAqdmVjdG9yLCAvKiE8IFBvaW50ZXIgdG8gaW5wdXQgdmVjdG9yICovCiAgICAgICAgICAgICAgICAgICAgICAgSU5UIGxlbiwgICAgICAgICAgICAgICAvKiE8IExlbmd0aCBvZiBpbnB1dCB2ZWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgKQoteworICAgICAgICAgICAgICAgICAgICAgIElOVCBzdHJpZGUpIHsKICAgSU5UIGk7CiAgIElOVF9QQ00gdGVtcCwgbWF4VmFsID0gMDsKIAotICBmb3IoaT1sZW47aSE9MDtpLS0pewotICAgIHRlbXAgPSAoSU5UX1BDTSkoKnZlY3Rvcik7IHZlY3Rvcis9c3RyaWRlOwotICAgIG1heFZhbCB8PSAodGVtcF4odGVtcD4+KChzaXplb2YoSU5UX1BDTSkqOCktMSkpKTsKKyAgZm9yIChpID0gbGVuOyBpICE9IDA7IGktLSkgeworICAgIHRlbXAgPSAoSU5UX1BDTSkoKnZlY3Rvcik7CisgICAgdmVjdG9yICs9IHN0cmlkZTsKKyAgICBtYXhWYWwgfD0gKHRlbXAgXiAodGVtcCA+PiAoKHNpemVvZihJTlRfUENNKSAqIDgpIC0gMSkpKTsKICAgfQotICByZXR1cm4gZml4bWF4X0koKElOVCkwLChJTlQpKGZpeG5vcm16X0QoKElOVCltYXhWYWwpIC0gKElOVCkxIC0gKElOVCkoREZSQUNUX0JJVFMgLSBTQU1QTEVfQklUUykpKTsKKyAgcmV0dXJuIGZpeG1heF9JKChJTlQpMCwgKElOVCkoZml4bm9ybXpfRCgoSU5UKW1heFZhbCkgLSAoSU5UKTEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UKShERlJBQ1RfQklUUyAtIFNBTVBMRV9CSVRTKSkpOwogfQogI2VuZGlmCiAKQEAgLTM5OCwxOCArNjU0LDE4IEBACiBTQ0FMRV9JTkxJTkUKIElOVCBnZXRTY2FsZWZhY3RvclNob3J0KGNvbnN0IFNIT1JUICp2ZWN0b3IsIC8qITwgUG9pbnRlciB0byBpbnB1dCB2ZWN0b3IgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBsZW4sICAgICAgICAgICAgIC8qITwgTGVuZ3RoIG9mIGlucHV0IHZlY3RvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0cmlkZQotICAgICAgICAgICAgICAgICAgICAgICApCi17CisgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RyaWRlKSB7CiAgIElOVCBpOwogICBTSE9SVCB0ZW1wLCBtYXhWYWwgPSAwOwogCi0gIGZvcihpPWxlbjtpIT0wO2ktLSl7Ci0gICAgdGVtcCA9IChTSE9SVCkoKnZlY3Rvcik7IHZlY3Rvcis9c3RyaWRlOwotICAgIG1heFZhbCB8PSAodGVtcF4odGVtcD4+KFNIT1JUX0JJVFMtMSkpKTsKKyAgZm9yIChpID0gbGVuOyBpICE9IDA7IGktLSkgeworICAgIHRlbXAgPSAoU0hPUlQpKCp2ZWN0b3IpOworICAgIHZlY3RvciArPSBzdHJpZGU7CisgICAgbWF4VmFsIHw9ICh0ZW1wIF4gKHRlbXAgPj4gKFNIT1JUX0JJVFMgLSAxKSkpOwogICB9CiAKLSAgcmV0dXJuIGZpeG1heF9JKChJTlQpMCwoSU5UKShmaXhub3Jtel9EKChJTlQpbWF4VmFsKSAtIChJTlQpMSAtIChJTlQpKERGUkFDVF9CSVRTIC0gU0hPUlRfQklUUykpKTsKKyAgcmV0dXJuIGZpeG1heF9JKChJTlQpMCwgKElOVCkoZml4bm9ybXpfRCgoSU5UKW1heFZhbCkgLSAoSU5UKTEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UKShERlJBQ1RfQklUUyAtIFNIT1JUX0JJVFMpKSk7CiB9CiAjZW5kaWYKIApAQCAtNDIwLDggKzY3NiwxMiBAQAogICoKICAqICBccmV0dXJuIE1heGltdW0gc2NhbGUgZmFjdG9yCiAgKgotICogIFRoaXMgZnVuY3Rpb24gY2FuIGNvbnN0aXR1dGUgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgY29tcHV0YXRpb25hbCBjb21wbGV4aXR5IC0gdmVyeSBtdWNoIGRlcGVuZGluZyBvbiB0aGUKLSAqICBiaXRyYXRlLiBTaW5jZSBpdCBpcyBhIHJhdGhlciBzbWFsbCBmdW5jdGlvbiwgZWZmZWN0aXZlIGFzc2VtYmxlciBvcHRpbWl6YXRpb24gbWlnaHQgYmUgcG9zc2libGUuCisgKiAgVGhpcyBmdW5jdGlvbiBjYW4gY29uc3RpdHV0ZSBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBjb21wdXRhdGlvbmFsCisgKiBjb21wbGV4aXR5IC0gdmVyeSBtdWNoIGRlcGVuZGluZyBvbiB0aGUgYml0cmF0ZS4gU2luY2UgaXQgaXMgYSByYXRoZXIgc21hbGwKKyAqIGZ1bmN0aW9uLCBlZmZlY3RpdmUgYXNzZW1ibGVyIG9wdGltaXphdGlvbiBtaWdodCBiZSBwb3NzaWJsZS4KKyAqCisgKiAgSWYgYWxsIGRhdGEgaXMgMHhGRkZGLkZGRkYgb3IgMHgwMDAwLjAwMDAgZnVuY3Rpb24gcmV0dXJucyAzMQorICogIE5vdGU6IFlvdSBjYW4gc2tpcCBkYXRhIG5vcm1hbGl6YXRpb24gb25seSBpZiByZXR1cm4gdmFsdWUgaXMgMAogICoKICAqLwogI2RlZmluZSBGVU5DVElPTl9nZXRTY2FsZWZhY3Rvcl9EQkwKQEAgLTQzMiwxMiArNjkyLDEyIEBACiAgIElOVCBpOwogICBGSVhQX0RCTCB0ZW1wLCBtYXhWYWwgPSAoRklYUF9EQkwpMDsKIAotICBmb3IoaT1sZW47aSE9MDtpLS0peworICBmb3IgKGkgPSBsZW47IGkgIT0gMDsgaS0tKSB7CiAgICAgdGVtcCA9IChMT05HKSgqdmVjdG9yKyspOwotICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKXRlbXBeKExPTkcpKHRlbXA+PihERlJBQ1RfQklUUy0xKSkpOworICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKXRlbXAgXiAoTE9ORykodGVtcCA+PiAoREZSQUNUX0JJVFMgLSAxKSkpOwogICB9CiAKLSAgcmV0dXJuIGZpeG1heF9JKChJTlQpMCwoSU5UKShmaXhub3Jtel9EKG1heFZhbCkgLSAxKSk7CisgIHJldHVybiBmaXhtYXhfSSgoSU5UKTAsIChJTlQpKGZpeG5vcm16X0QobWF4VmFsKSAtIDEpKTsKIH0KICNlbmRpZgogCkBAIC00NTAsMTIgKzcxMCwxMSBAQAogICBJTlQgaTsKICAgU0hPUlQgdGVtcCwgbWF4VmFsID0gKEZJWFBfU0dMKTA7CiAKLSAgZm9yKGk9bGVuO2khPTA7aS0tKXsKKyAgZm9yIChpID0gbGVuOyBpICE9IDA7IGktLSkgewogICAgIHRlbXAgPSAoU0hPUlQpKCp2ZWN0b3IrKyk7Ci0gICAgbWF4VmFsIHw9ICh0ZW1wXih0ZW1wPj4oRlJBQ1RfQklUUy0xKSkpOworICAgIG1heFZhbCB8PSAodGVtcCBeICh0ZW1wID4+IChGUkFDVF9CSVRTIC0gMSkpKTsKICAgfQogCi0gIHJldHVybiBmaXhtYXhfSSgoSU5UKTAsKElOVCkoZml4bm9ybXpfRChGWF9TR0wyRlhfREJMKChGSVhQX1NHTCltYXhWYWwpKSAtIDEpKTsKKyAgcmV0dXJuIGZpeG1heF9JKChJTlQpMCwgKElOVCkoZml4bm9ybXpfUygoRklYUF9TR0wpbWF4VmFsKSkgLSAxKTsKIH0KICNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJNcGVnVFBEZWMvaW5jbHVkZS9tcGVnRmlsZVJlYWQuaCBiL2xpYk1wZWdUUERlYy9pbmNsdWRlL21wZWdGaWxlUmVhZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmJmYjU4Li4wMDAwMDAwCi0tLSBhL2xpYk1wZWdUUERlYy9pbmNsdWRlL21wZWdGaWxlUmVhZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKLSAgIERlc2NyaXB0aW9uOiBCaXRzdHJlYW0gZGF0YSBwcm92aWRlciBmb3IgTVA0IGRlY29kZXJzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgotI2luY2x1ZGUgIkZES19hdWRpby5oIgotCi0jZGVmaW5lIE1QRlJFQURfTVA0RkZfRElTQUJMRQotCi0jaWZuZGVmIE1QRlJFQURfTVA0RkZfRElTQUJMRQotICAvKiE8IElmIE1QRlJFQURfTVA0RkZfRU5BQkxFIGlzIHNldCwgaW5jbHVkZSBzdXBwb3J0IGZvciBNUEVHIElTTyBmaWxlZm9ybWF0LgotICAgICAgIElmIG5vdCBzZXQsIG5vIC5tcDQsIC5tNGEgYW5kIC4zZ3AgZmlsZXMgY2FuIGJlIHVzZWQgZm9yIGlucHV0LiAqLwotICAjZGVmaW5lIE1QRlJFQURfTVA0RkZfRU5BQkxFCi0jZW5kaWYKLQotLyogbWF4aW11bSBudW1iZXIgb2YgbGF5ZXJzIHdoaWNoIGNhbiBiZSByZWFkICAgICAgICAqLwotLyogc2hhbGwgZXF1YWwgbWF4IG51bWJlciBvZiBsYXllcnMgcmVhZCBieSBpaXNpc29mZiAqLwotI2RlZmluZSBGSUxFUkVBRF9NQVhfTEFZRVJTICgyKQotCi10eXBlZGVmIHN0cnVjdCBTVFJVQ1RfRklMRVJFQUQgKkhBTkRMRV9GSUxFUkVBRDsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKioKLSAqIFxicmllZiAgICAgICAgICAgT3BlbiBhbiBNUEVHIGF1ZGlvIGZpbGUgYW5kIHRyeSB0byBkZXRlY3QgaXRzIGZvcm1hdC4KLSAqIFxwYXJhbSBmaWxlbmFtZSAgU3RyaW5nIG9mIHRoZSBmaWxlbmFtZSB0byBiZSBvcGVuZWQuCi0gKiBccGFyYW0gZmlsZUZvcm1hdCBTa2lwIGZpbGUgZm9ybWF0IGRldGVjdGlvbiBhbmQgdXNlIGdpdmVuIGZvcm1hdCBpZiBmaWxlRm9ybWF0ICE9IEZGX1VOS05PV04uCi0gICAgICAgICAgICAgICAgICAgIEVsc2Ugc3RvcmUgZGV0ZWN0ZWQgZm9ybWF0IGludG8gKmZpbGVGbXQuCi0gKiBccGFyYW0gdHJhbnNwb3J0VHlwZSBTa2lwIHRyYW5zcG9ydCB0eXBlIGRldGVjdGlvbiBhbmQgdXNlIGdpdmVuIGZvcm1hdCBpZiB0cmFuc3BvcnRUeXBlICE9IFRUX1VOS05PV04uCi0gICAgICAgICAgICAgICAgICAgIEVsc2Ugc3RvcmUgZGV0ZWN0ZWQgZm9ybWF0IGludG8gKmZpbGVGbXQuCi0gKiBccGFyYW0gY29uZiAgICAgIFBvaW50ZXIgdG8gdW5zaWduZWQgY2hhciB0byBob2xkIHRoZSBBdWRpb1NwZWNpZmljQ29uZmlnIG9mIHRoZSBpbnB1dCBmaWxlLCBpZgotICAgICAgICAgICAgICAgICAgICBhbnkgKE1QRUcgNCBmaWxlIGZvcm1hdCkuIEluIGNhc2Ugb2YgUkFXIExBVE0gaXQgaG9sZHMgdGhlIFN0cmVhbU11eENvbmZpZy4KLSAqIFxwYXJhbSBjb25mU2l6ZSAgUG9pbnRlciB0byBhbiBpbnRlZ2VyLCB3aGVyZSB0aGUgbGVuZ3RoIG9mIHRoZSBBU0Mgb3IgU01DIChpbiBjYXNlIG9mIFJBVyBMQVRNKQotICAgICAgICAgICAgICAgICAgICBpcyBzdG9yZWQgdG8uCi0gKiBccmV0dXJuICAgICAgICAgIE1QRUcgZmlsZSByZWFkIGhhbmRsZS4KLSAqLwotSEFORExFX0ZJTEVSRUFEIG1wZWdGaWxlUmVhZF9PcGVuKCBjb25zdCBjaGFyICAgICAqZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfRk9STUFUICAgICBmaWxlRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPUlRfVFlQRSAgdHJhbnNwb3J0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgKmNvbmZbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgIGNvbmZTaXplW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICpub09mTGF5ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIFxicmllZiAgICAgICAgICAgR2V0IHRoZSBmaWxlIGZvcm1hdCBvZiB0aGUgaW5wdXQgZmlsZS4KLSAqIFxwYXJhbSBoRGF0YVNyYyAgTVBFRyBmaWxlIHJlYWQgaGFuZGxlLgotICogXHJldHVybiAgICAgICAgICBGaWxlIGZvcm1hdCBvZiB0aGUgaW5wdXQgZmlsZS4KLSAqLwotRklMRV9GT1JNQVQgbXBlZ0ZpbGVSZWFkX0dldEZpbGVGb3JtYXQoSEFORExFX0ZJTEVSRUFEIGhEYXRhU3JjKTsKLQotLyoqCi0gKiBcYnJpZWYgICAgICAgICAgIEdldCB0aGUgdHJhbnNwb3J0IHR5cGUgb2YgdGhlIGlucHV0IGZpbGUuCi0gKiBccGFyYW0gaERhdGFTcmMgIE1QRUcgZmlsZSByZWFkIGhhbmRsZS4KLSAqIFxyZXR1cm4gICAgICAgICAgVHJhbnNwb3J0IHR5cGUgb2YgdGhlIGlucHV0IGZpbGUuCi0gKi8KLVRSQU5TUE9SVF9UWVBFIG1wZWdGaWxlUmVhZF9HZXRUcmFuc3BvcnRUeXBlKEhBTkRMRV9GSUxFUkVBRCBoRGF0YVNyYyk7Ci0KLS8qKgotICogXGJyaWVmIFJlYWQgZGF0YSBmcm9tIE1QRUcgZmlsZS4gSW4gY2FzZSBvZiBwYWNrZXQgZmlsZSwgcmVhZCBvbmUgcGFja2V0LCBpbiBjYXNlCi0gKiAgICAgICAgb2Ygc3RyZWFtaW5nIGZpbGUgd2l0aCBlbWJlZGRlZCBzeW5jaHJvbmlzYXRpb24gbGF5ZXIgKExPQVMvQURUUy4uLiksIGp1c3QKLSAqICAgICAgICBmaWxsIHRoZSBidWZmZXIuCi0gKgotICogXHBhcmFtIGhNcGVnRmlsZSAgIE1QRUcgZmlsZSByZWFkIGhhbmRsZS4KLSAqIFxwYXJhbSBpbkJ1ZmZlciAgICBQb2ludGVyIHRvIGlucHV0IGJ1ZmZlci4KLSAqIFxwYXJhbSBidWZmZXJTaXplICBTaXplIG9mIGlucHV0IGJ1ZmZlci4KLSAqIFxwYXJhbSBieXRlc1ZhbGlkICBOdW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlIHJlYWQuCi0gKiBccmV0dXJuICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCAtMSBpZiB1bnN1cHBvcnRlZCBmaWxlIGZvcm1hdCBvciBmaWxlIHJlYWQgZXJyb3IuCi0gKi8KLWludCBtcGVnRmlsZVJlYWRfUmVhZCggSEFORExFX0ZJTEVSRUFEICAgaE1wZWdGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICppbkJ1ZmZlcltdLAotICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICBidWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICpieXRlc1ZhbGlkCi0gICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIFxicmllZiAgICAgICAgICAgIFNlZWsgaW4gZmlsZSBmcm9tIG9yaWdpbiBieSBnaXZlbiBvZmZzZXQgaW4gZnJhbWVzLgotICogXHBhcmFtIGhNcGVnRmlsZSAgTVBFRyBmaWxlIHJlYWQgaGFuZGxlLgotICogXHBhcmFtIG9yaWdpbiAgICAgSWYgMCwgdGhlIG9yaWdpbiBpcyB0aGUgZmlsZSBiZWdpbm5pbmcgKGFic29sdXRlIHNlZWspLgotICogICAgICAgICAgICAgICAgICAgSWYgMSwgdGhlIG9yaWdpbiBpcyB0aGUgY3VycmVudCBwb3NpdGlvbiAocmVsYXRpdmUgc2VlaykuCi0gKiBccGFyYW0gb2Zmc2V0ICAgICBUaGUgYW1vdW50IG9mIGZyYW1lcyB0byBzZWVrIGZyb20gdGhlIGdpdmVuIG9yaWdpbi4KLSAqIFxyZXR1cm4gICAgICAgICAgIDAgb24gc3VjZXNzLCAtMSBpZiBvZmZzZXQgPCAwIG9yIGZpbGUgcmVhZCBlcnJvci4KLSAqLwotaW50IG1wZWdGaWxlUmVhZF9zZWVrKCBIQU5ETEVfRklMRVJFQUQgICBoTXBlZ0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgIG9yaWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBcYnJpZWYgICAgICAgICAgICBHZXQgZmlsZSBwb3NpdGlvbiBpbiBwZXJjZW50LgotICogXHBhcmFtIGhNcGVnRmlsZSAgTVBFRyBmaWxlIHJlYWQgaGFuZGxlLgotICogXHJldHVybiAgICAgICAgICAgRmlsZSBwb3NpdGlvbiBpbiBwZXJjZW50LgotICovCi1pbnQgbXBlZ0ZpbGVSZWFkX2dldFBlcmNlbnQoSEFORExFX0ZJTEVSRUFEIGhNcGVnRmlsZSk7Ci0KLQotLyoqCi0gKiBcYnJpZWYgICAgICAgICAgIENsb3NlIE1QRUcgYXVkaW8gZmlsZS4KLSAqIFxwYXJhbSBoTXBlZ0ZpbGUgTXBlZyBmaWxlIHJlYWQgaGFuZGxlLgotICogXHJldHVybiAgICAgICAgICAwIG9uIHN1Y2Vzcy4KLSAqLwotaW50IG1wZWdGaWxlUmVhZF9DbG9zZShIQU5ETEVfRklMRVJFQUQgKmhNcGVnRmlsZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJNcGVnVFBEZWMvaW5jbHVkZS90cF9kYXRhLmggYi9saWJNcGVnVFBEZWMvaW5jbHVkZS90cF9kYXRhLmgKaW5kZXggYzZlODliNS4uYjRhYjgwMiAxMDA2NDQKLS0tIGEvbGliTXBlZ1RQRGVjL2luY2x1ZGUvdHBfZGF0YS5oCisrKyBiL2xpYk1wZWdUUERlYy9pbmNsdWRlL3RwX2RhdGEuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNyArOTAsMTggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEF1dGhvcihzKTogTWFudWVsIEphbmRlcgorICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKKwogICAgRGVzY3JpcHRpb246IE1QRUcgVHJhbnNwb3J0IGRhdGEgdGFibGVzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgX19UUF9EQVRBX0hfXwotI2RlZmluZSBfX1RQX0RBVEFfSF9fCisjaWZuZGVmIFRQX0RBVEFfSAorI2RlZmluZSBUUF9EQVRBX0gKIAogI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgogI2luY2x1ZGUgIkZES19hdWRpby5oIgpAQCAtOTgsMTcgKzExMCwzNSBAQAogLyoKICAqIENvbmZpZ3VyYXRpb24KICAqLwotI2RlZmluZSBUUF9HQV9FTkFCTEUKLS8qICNkZWZpbmUgVFBfQ0VMUF9FTkFCTEUgKi8KLS8qICNkZWZpbmUgVFBfSFZYQ19FTkFCTEUgKi8KLS8qICNkZWZpbmUgVFBfU0xTX0VOQUJMRSAqLwotI2RlZmluZSBUUF9FTERfRU5BQkxFCi0vKiAjZGVmaW5lIFRQX1VTQUNfRU5BQkxFICovCi0vKiAjZGVmaW5lIFRQX1JTVkQ1MF9FTkFCTEUgKi8KIAotI2lmIGRlZmluZWQoVFBfR0FfRU5BQkxFKSB8fCBkZWZpbmVkKFRQX1NMU19FTkFCTEUpCi0jZGVmaW5lIFRQX1BDRV9FTkFCTEUgICAgICAgLyoqPCBFbmFibGUgZnVsbCBQQ0Ugc3VwcG9ydCAqLwotI2VuZGlmCisjZGVmaW5lIFRQX1VTQUNfTUFYX1NQRUFLRVJTICgyNCkKKworI2RlZmluZSBUUF9VU0FDX01BWF9FWFRfRUxFTUVOVFMgKCgyNCkpCisKKyNkZWZpbmUgVFBfVVNBQ19NQVhfRUxFTUVOVFMgKCgyNCkgKyBUUF9VU0FDX01BWF9FWFRfRUxFTUVOVFMpCisKKyNkZWZpbmUgVFBfVVNBQ19NQVhfQ09ORklHX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA1MTIgLyogbmV4dCBwb3dlciBvZiB0d28gb2YgbWF4aW11bSBvZiBlc2NhcGVkVmFsdWUoaEJzLCA0LCA0LCA4KSBpbiBcCisgICAgICAgICBBdWRpb1ByZVJvbGwoKSAoMjg1KSAqLworCisjZGVmaW5lIFRQREVDX1VTQUNfTlVNX0NPTkZJR19DSEFOR0VfRlJBTUVTIFwKKyAgKDEpIC8qIE51bWJlciBvZiBmcmFtZXMgZm9yIGNvbmZpZyBjaGFuZ2UgaW4gVVNBQyAqLworCitlbnVtIHsKKyAgVFBERUNfRkxVU0hfT0ZGID0gMCwKKyAgVFBERUNfUlNWNjBfQ0ZHX0NIQU5HRV9BVFNDX0ZMVVNIX09OID0gMSwKKyAgVFBERUNfUlNWNjBfREFTSF9JUEZfQVRTQ19GTFVTSF9PTiA9IDIsCisgIFRQREVDX1VTQUNfREFTSF9JUEZfRkxVU0hfT04gPSAzCit9OworCitlbnVtIHsKKyAgVFBERUNfQlVJTERfVVBfT0ZGID0gMCwKKyAgVFBERUNfUlNWNjBfQlVJTERfVVBfT04gPSAxLAorICBUUERFQ19SU1Y2MF9CVUlMRF9VUF9PTl9JTl9CQU5EID0gMiwKKyAgVFBERUNfVVNBQ19CVUlMRF9VUF9PTiA9IDMsCisgIFRQREVDX1JTVjYwX0JVSUxEX1VQX0lETEUgPSA0LAorICBUUERFQ19SU1Y2MF9CVUlMRF9VUF9JRExFX0lOX0JBTkQgPSA1Cit9OwogCiAvKioKICAqIFByb2dyYW1Db25maWcgc3RydWN0LgpAQCAtMTE2LDEzICsxNDYsMTIgQEAKIC8qIElTTy9JRUMgMTQ0OTYtMyA0LjQuMS4xIFRhYmxlIDQuMiBQcm9ncmFtIGNvbmZpZyBlbGVtZW50ICovCiAjZGVmaW5lIFBDX0ZTQl9DSEFOTkVMU19NQVggMTYgLyogRnJvbnQvU2lkZS9CYWNrIGNoYW5uZWxzICovCiAjZGVmaW5lIFBDX0xGRV9DSEFOTkVMU19NQVggNAotI2RlZmluZSBQQ19BU1NPQ0RBVEFfTUFYICAgIDgKLSNkZWZpbmUgUENfQ0NFTF9NQVggICAgICAgICAxNiAvKiBDQyBlbGVtZW50cyAqLwotI2RlZmluZSBQQ19DT01NRU5UTEVOR1RIICAgIDI1NgorI2RlZmluZSBQQ19BU1NPQ0RBVEFfTUFYIDgKKyNkZWZpbmUgUENfQ0NFTF9NQVggMTYgLyogQ0MgZWxlbWVudHMgKi8KKyNkZWZpbmUgUENfQ09NTUVOVExFTkdUSCAyNTYKKyNkZWZpbmUgUENfTlVNX0hFSUdIVF9MQVlFUiAzCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0jaWZkZWYgVFBfUENFX0VOQUJMRQordHlwZWRlZiBzdHJ1Y3QgewogICAvKiBQQ0UgYml0c3RyZWFtIGVsZW1lbnRzOiAqLwogICBVQ0hBUiBFbGVtZW50SW5zdGFuY2VUYWc7CiAgIFVDSEFSIFByb2ZpbGU7CkBAIC0xNjUsNTQgKzE5NCw1MCBAQAogCiAgIFVDSEFSIENvbW1lbnRGaWVsZEJ5dGVzOwogICBVQ0hBUiBDb21tZW50W1BDX0NPTU1FTlRMRU5HVEhdOwotI2VuZGlmIC8qIFRQX1BDRV9FTkFCTEUgKi8KIAogICAvKiBIZWxwZXIgdmFyaWFibGVzIGZvciBhZG1pbmlzdHJhdGlvbjogKi8KLSAgVUNIQVIgaXNWYWxpZDsgICAgICAgICAgICAgICAvKiE8IEZsYWcgc2hvd2luZyBpZiBQQ0UgaGFzIGJlZW4gcmVhZCBzdWNjZXNzZnVsbHkuICovCi0gIFVDSEFSIE51bUNoYW5uZWxzOyAgICAgICAgICAgLyohPCBBbW91bnQgb2YgYXVkaW8gY2hhbm5lbHMgc3VtbWluZyBhbGwgY2hhbm5lbCBlbGVtZW50cyBpbmNsdWRpbmcgTEZFcyAqLwotICBVQ0hBUiBOdW1FZmZlY3RpdmVDaGFubmVsczsgIC8qITwgQW1vdW50IG9mIGF1ZGlvIGNoYW5uZWxzIHN1bW1pbmcgb25seSBTQ0VzIGFuZCBDUEVzICovCisgIFVDSEFSIGlzVmFsaWQ7IC8qITwgRmxhZyBzaG93aW5nIGlmIFBDRSBoYXMgYmVlbiByZWFkIHN1Y2Nlc3NmdWxseS4gKi8KKyAgVUNIQVIKKyAgTnVtQ2hhbm5lbHM7IC8qITwgQW1vdW50IG9mIGF1ZGlvIGNoYW5uZWxzIHN1bW1pbmcgYWxsIGNoYW5uZWwgZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgIGluY2x1ZGluZyBMRkVzICovCisgIFVDSEFSIE51bUVmZmVjdGl2ZUNoYW5uZWxzOyAvKiE8IEFtb3VudCBvZiBhdWRpbyBjaGFubmVscyBzdW1taW5nIG9ubHkgU0NFcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIENQRXMgKi8KICAgVUNIQVIgZWxDb3VudGVyOwogCiB9IENQcm9ncmFtQ29uZmlnOwogCiB0eXBlZGVmIGVudW0gewogICBBU0NFWFRfVU5LT1dOID0gLTEsCi0gIEFTQ0VYVF9TQlIgICAgPSAweDJiNywKLSAgQVNDRVhUX1BTICAgICA9IDB4NTQ4LAotICBBU0NFWFRfTVBTICAgID0gMHg3NmEsCi0gIEFTQ0VYVF9TQU9DICAgPSAweDdjYiwKLSAgQVNDRVhUX0xETVBTICA9IDB4N2NjCisgIEFTQ0VYVF9TQlIgPSAweDJiNywKKyAgQVNDRVhUX1BTID0gMHg1NDgsCisgIEFTQ0VYVF9NUFMgPSAweDc2YSwKKyAgQVNDRVhUX1NBT0MgPSAweDdjYiwKKyAgQVNDRVhUX0xETVBTID0gMHg3Y2MKIAogfSBUUF9BU0NfRVhURU5TSU9OX0lEOwogCi0jaWZkZWYgVFBfR0FfRU5BQkxFCiAvKioKICAqIEdhU3BlY2lmaWNDb25maWcgc3RydWN0CiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKLSAgVUlOVCBtX2ZyYW1lTGVuZ3RoRmxhZyA7Ci0gIFVJTlQgbV9kZXBlbmRzT25Db3JlQ29kZXIgOwotICBVSU5UIG1fY29yZUNvZGVyRGVsYXkgOworICBVSU5UIG1fZnJhbWVMZW5ndGhGbGFnOworICBVSU5UIG1fZGVwZW5kc09uQ29yZUNvZGVyOworICBVSU5UIG1fY29yZUNvZGVyRGVsYXk7CiAKLSAgVUlOVCBtX2V4dGVuc2lvbkZsYWcgOwotICBVSU5UIG1fZXh0ZW5zaW9uRmxhZzMgOworICBVSU5UIG1fZXh0ZW5zaW9uRmxhZzsKKyAgVUlOVCBtX2V4dGVuc2lvbkZsYWczOwogCiAgIFVJTlQgbV9sYXllcjsKICAgVUlOVCBtX251bU9mU3ViRnJhbWU7CiAgIFVJTlQgbV9sYXllckxlbmd0aDsKIAogfSBDU0dhU3BlY2lmaWNDb25maWc7Ci0jZW5kaWYgLyogVFBfR0FfRU5BQkxFICovCi0KLQotCi0KLSNpZmRlZiBUUF9FTERfRU5BQkxFCiAKIHR5cGVkZWYgZW51bSB7Ci0gIEVMREVYVF9URVJNICA9IDB4MCwgICAvKiBUZXJtaW5hdGlvbiB0YWcgKi8KLSAgRUxERVhUX1NBT0MgID0gMHgxLCAgIC8qIFNBT0MgY29uZmlnICovCi0gIEVMREVYVF9MRFNBQyA9IDB4MiAgICAvKiBMRCBNUEVHIFN1cnJvdW5kIGNvbmZpZyAqLworICBFTERFWFRfVEVSTSA9IDB4MCwgICAgICAgICAvKiBUZXJtaW5hdGlvbiB0YWcgKi8KKyAgRUxERVhUX1NBT0MgPSAweDEsICAgICAgICAgLyogU0FPQyBjb25maWcgKi8KKyAgRUxERVhUX0xEU0FDID0gMHgyLCAgICAgICAgLyogTEQgTVBFRyBTdXJyb3VuZCBjb25maWcgKi8KKyAgRUxERVhUX0RPV05TQ0FMRUlORk8gPSAweDMgLyogRUxEIHNhbXBsZSByYXRlIGFkYXB0YXRpb24gKi8KICAgLyogcmVzZXJ2ZWQgKi8KIH0gQVNDX0VMRF9FWFRfVFlQRTsKIApAQCAtMjIwLDEwMyArMjQ1LDE4NiBAQAogICBVQ0hBUiBtX2ZyYW1lTGVuZ3RoRmxhZzsKIAogICBVQ0hBUiBtX3NiclByZXNlbnRGbGFnOwotICBVQ0hBUiBtX3VzZUxkUW1mVGltZUFsaWduOyAgLyogVXNlIExELU1QUyBRTUYgaW4gU0JSIHRvIGFjaGl2ZSB0aW1lIGFsaWdubWVudCAqLworICBVQ0hBUgorICBtX3VzZUxkUW1mVGltZUFsaWduOyAvKiBVc2UgTEQtTVBTIFFNRiBpbiBTQlIgdG8gYWNoaXZlIHRpbWUgYWxpZ25tZW50ICovCiAgIFVDSEFSIG1fc2JyU2FtcGxpbmdSYXRlOwogICBVQ0hBUiBtX3NickNyY0ZsYWc7CisgIFVJTlQgbV9kb3duc2NhbGVkU2FtcGxpbmdGcmVxdWVuY3k7CiAKIH0gQ1NFbGRTcGVjaWZpY0NvbmZpZzsKLSNlbmRpZiAvKiBUUF9FTERfRU5BQkxFICovCiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgVVNBQ19FWFRfRUxFTUVOVF9UWVBFIHVzYWNFeHRFbGVtZW50VHlwZTsKKyAgVVNIT1JUIHVzYWNFeHRFbGVtZW50Q29uZmlnTGVuZ3RoOworICBVU0hPUlQgdXNhY0V4dEVsZW1lbnREZWZhdWx0TGVuZ3RoOworICBVQ0hBUiB1c2FjRXh0RWxlbWVudFBheWxvYWRGcmFnOworICBVQ0hBUiB1c2FjRXh0RWxlbWVudEhhc0F1ZGlvUHJlUm9sbDsKK30gQ1NVc2FjRXh0RWxlbWVudENvbmZpZzsKIAordHlwZWRlZiBzdHJ1Y3QgeworICBNUDRfRUxFTUVOVF9JRCB1c2FjRWxlbWVudFR5cGU7CisgIFVDSEFSIG1fbm9pc2VGaWxsaW5nOworICBVQ0hBUiBtX2hhcm1vbmljU0JSOworICBVQ0hBUiBtX2ludGVyVGVzOworICBVQ0hBUiBtX3B2YzsKKyAgVUNIQVIgbV9zdGVyZW9Db25maWdJbmRleDsKKyAgQ1NVc2FjRXh0RWxlbWVudENvbmZpZyBleHRFbGVtZW50OworfSBDU1VzYWNFbGVtZW50Q29uZmlnOwogCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIG1fZnJhbWVMZW5ndGhGbGFnOworICBVQ0hBUiBtX2NvcmVTYnJGcmFtZUxlbmd0aEluZGV4OworICBVQ0hBUiBtX3NiclJhdGlvSW5kZXg7CisgIFVDSEFSIG1fblVzYWNDaGFubmVsczsgLyogbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHNpZ25hbGVkIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNhY0RlY29kZXJDb25maWcoKSAvIHJzdjYwM2RhRGVjb2RlckNvbmZpZygpIHZpYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUVsZW1lbnRzIGFuZCB1c2FjRWxlbWVudFR5cGUgKi8KKyAgVUNIQVIgbV9jaGFubmVsQ29uZmlndXJhdGlvbkluZGV4OworICBVSU5UIG1fdXNhY051bUVsZW1lbnRzOworICBDU1VzYWNFbGVtZW50Q29uZmlnIGVsZW1lbnRbVFBfVVNBQ19NQVhfRUxFTUVOVFNdOworCisgIFVDSEFSIG51bUF1ZGlvQ2hhbm5lbHM7CisgIFVDSEFSIG1fdXNhY0NvbmZpZ0V4dGVuc2lvblByZXNlbnQ7CisgIFVDSEFSIGVsZW1lbnRMZW5ndGhQcmVzZW50OworICBVQ0hBUiBVc2FjQ29uZmlnW1RQX1VTQUNfTUFYX0NPTkZJR19MRU5dOworICBVU0hPUlQgVXNhY0NvbmZpZ0JpdHM7Cit9IENTVXNhY0NvbmZpZzsKIAogLyoqCiAgKiBBdWRpbyBjb25maWd1cmF0aW9uIHN0cnVjdCwgc3VpdGFibGUgZm9yIGVuY29kZXIgYW5kIGRlY29kZXIgY29uZmlndXJhdGlvbi4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgewotCiAgIC8qIFhZWiBTcGVjaWZpYyBEYXRhICovCiAgIHVuaW9uIHsKLSNpZmRlZiBUUF9HQV9FTkFCTEUKLSAgICBDU0dhU3BlY2lmaWNDb25maWcgICAgbV9nYVNwZWNpZmljQ29uZmlnOyAgICAgICAvKio8IEdlbmVyYWwgYXVkaW8gc3BlY2lmaWMgY29uZmlndXJhdGlvbi4gICAgICAgICAqLwotI2VuZGlmIC8qIFRQX0dBX0VOQUJMRSAqLwotI2lmZGVmIFRQX0VMRF9FTkFCTEUKLSAgICBDU0VsZFNwZWNpZmljQ29uZmlnICAgbV9lbGRTcGVjaWZpY0NvbmZpZzsgICAgICAvKio8IEVMRCBzcGVjaWZpYyBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAqLwotI2VuZGlmIC8qIFRQX0VMRF9FTkFCTEUgKi8KKyAgICBDU0dhU3BlY2lmaWNDb25maWcKKyAgICAgICAgbV9nYVNwZWNpZmljQ29uZmlnOyAvKio8IEdlbmVyYWwgYXVkaW8gc3BlY2lmaWMgY29uZmlndXJhdGlvbi4gKi8KKyAgICBDU0VsZFNwZWNpZmljQ29uZmlnIG1fZWxkU3BlY2lmaWNDb25maWc7IC8qKjwgRUxEIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uICovCisgICAgQ1NVc2FjQ29uZmlnIG1fdXNhY0NvbmZpZzsgLyoqPCBVU0FDIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAqLwogICB9IG1fc2M7Ci0gIAorCiAgIC8qIENvbW1vbiBBU0MgcGFyYW1ldGVycyAqLwotI2lmZGVmIFRQX1BDRV9FTkFCTEUKLSAgQ1Byb2dyYW1Db25maWcgICAgICAgIG1fcHJvZ3JDb25maWdFbGVtZW50OyAgICAgLyoqPCBQcm9ncmFtIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2VuZGlmIC8qIFRQX1BDRV9FTkFCTEUgKi8KKyAgQ1Byb2dyYW1Db25maWcgbV9wcm9nckNvbmZpZ0VsZW1lbnQ7IC8qKjwgUHJvZ3JhbSBjb25maWd1cmF0aW9uLiAqLwogCi0gIEFVRElPX09CSkVDVF9UWVBFICAgICBtX2FvdDsgICAgICAgICAgICAgICAgICAgIC8qKjwgQXVkaW8gT2JqZWN0IFR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgVUlOVCAgICAgICAgICAgICAgICAgIG1fc2FtcGxpbmdGcmVxdWVuY3k7ICAgICAgLyoqPCBTYW1wbGVyYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBVSU5UICAgICAgICAgICAgICAgICAgbV9zYW1wbGVzUGVyRnJhbWU7ICAgICAgICAvKio8IEFtb3VudCBvZiBzYW1wbGVzIHBlciBmcmFtZS4gICAgICAgICAgICAgICAgICAgICovCi0gIFVJTlQgICAgICAgICAgICAgICAgICBtX2RpcmVjdE1hcHBpbmc7ICAgICAgICAgIC8qKjwgRG9jdW1lbnQgdGhpcyBwbGVhc2UgISEgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQVVESU9fT0JKRUNUX1RZUEUgbV9hb3Q7ICAvKio8IEF1ZGlvIE9iamVjdCBUeXBlLiAgKi8KKyAgVUlOVCBtX3NhbXBsaW5nRnJlcXVlbmN5OyAvKio8IFNhbXBsZXJhdGUuICovCisgIFVJTlQgbV9zYW1wbGVzUGVyRnJhbWU7ICAgLyoqPCBBbW91bnQgb2Ygc2FtcGxlcyBwZXIgZnJhbWUuICAgKi8KKyAgVUlOVCBtX2RpcmVjdE1hcHBpbmc7IC8qKjwgRG9jdW1lbnQgdGhpcyBwbGVhc2UgISEgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotICBBVURJT19PQkpFQ1RfVFlQRSAgICAgbV9leHRlbnNpb25BdWRpb09iamVjdFR5cGU7ICAgICAgICAvKio8IEF1ZGlvIG9iamVjdCB0eXBlICAgICAgICAgICAgICAgICAgICAgICovCi0gIFVJTlQgICAgICAgICAgICAgICAgICBtX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5OyAgICAgIC8qKjwgU2FtcGxlcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIAorICBBVURJT19PQkpFQ1RfVFlQRSBtX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZTsgLyoqPCBBdWRpbyBvYmplY3QgdHlwZSAqLworICBVSU5UIG1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3k7ICAgICAgICAgICAgLyoqPCBTYW1wbGVyYXRlICAgICAgICAgICAgKi8KIAotICBTQ0hBUiAgICAgICAgICAgICAgICAgbV9jaGFubmVsQ29uZmlndXJhdGlvbjsgICAvKio8IENoYW5uZWwgY29uZmlndXJhdGlvbiBpbmRleCAgICAgICAgICAgICAgICAgICAgICovCisgIFNDSEFSIG1fY2hhbm5lbENvbmZpZ3VyYXRpb247IC8qKjwgQ2hhbm5lbCBjb25maWd1cmF0aW9uIGluZGV4ICovCiAKLSAgU0NIQVIgICAgICAgICAgICAgICAgIG1fZXBDb25maWc7ICAgICAgICAgICAgICAgLyoqPCBFcnJvciBwcm90ZWN0aW9uIGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgU0NIQVIgICAgICAgICAgICAgICAgIG1fdmNiMTFGbGFnOyAgICAgICAgICAgICAgLyoqPCBhYWNTZWN0aW9uRGF0YVJlc2lsaWVuY2VGbGFnICAgICAgICAgICAgICAgICAgICAgKi8KLSAgU0NIQVIgICAgICAgICAgICAgICAgIG1fcnZsY0ZsYWc7ICAgICAgICAgICAgICAgLyoqPCBhYWNTY2FsZWZhY3RvckRhdGFSZXNpbGllbmNlRmxhZyAgICAgICAgICAgICAgICAgKi8KLSAgU0NIQVIgICAgICAgICAgICAgICAgIG1faGNyRmxhZzsgICAgICAgICAgICAgICAgLyoqPCBhYWNTcGVjdHJhbERhdGFSZXNpbGllbmNlRmxhZyAgICAgICAgICAgICAgICAgICAgKi8KKyAgU0NIQVIgbV9lcENvbmZpZzsgIC8qKjwgRXJyb3IgcHJvdGVjdGlvbiBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNDSEFSIG1fdmNiMTFGbGFnOyAvKio8IGFhY1NlY3Rpb25EYXRhUmVzaWxpZW5jZUZsYWcgICAgICAgICAgICAgICAgICAgICAqLworICBTQ0hBUiBtX3J2bGNGbGFnOyAgLyoqPCBhYWNTY2FsZWZhY3RvckRhdGFSZXNpbGllbmNlRmxhZyAgICAgICAgICAgICAgICAgKi8KKyAgU0NIQVIgbV9oY3JGbGFnOyAgIC8qKjwgYWFjU3BlY3RyYWxEYXRhUmVzaWxpZW5jZUZsYWcgICAgICAgICAgICAgICAgICAgICovCiAKLSAgU0NIQVIgICAgICAgICAgICAgICAgIG1fc2JyUHJlc2VudEZsYWc7ICAgICAgICAgLyoqPCBGbGFnIGluZGljYXRpbmcgdGhlIHByZXNlbmNlIG9mIFNCUiBkYXRhIGluIHRoZSBiaXRzdHJlYW0gICAgICAgICAgICAgICAqLwotICBTQ0hBUiAgICAgICAgICAgICAgICAgbV9wc1ByZXNlbnRGbGFnOyAgICAgICAgICAvKio8IEZsYWcgaW5kaWNhdGluZyB0aGUgcHJlc2VuY2Ugb2YgcGFyYW1ldHJpYyBzdGVyZW8gZGF0YSBpbiB0aGUgYml0c3RyZWFtICovCi0gIFVDSEFSICAgICAgICAgICAgICAgICBtX3NhbXBsaW5nRnJlcXVlbmN5SW5kZXg7IC8qKjwgU2FtcGxlcmF0ZSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFVDSEFSICAgICAgICAgICAgICAgICBtX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5SW5kZXg7IC8qKjwgU2FtcGxlcmF0ZSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFNDSEFSICAgICAgICAgICAgICAgICBtX2V4dGVuc2lvbkNoYW5uZWxDb25maWd1cmF0aW9uOyAgIC8qKjwgQ2hhbm5lbCBjb25maWd1cmF0aW9uIGluZGV4ICAgICAgICAgICAgICovCisgIFNDSEFSIG1fc2JyUHJlc2VudEZsYWc7IC8qKjwgRmxhZyBpbmRpY2F0aW5nIHRoZSBwcmVzZW5jZSBvZiBTQlIgZGF0YSBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtICAgICAgICAgICAgICAgKi8KKyAgU0NIQVIKKyAgbV9wc1ByZXNlbnRGbGFnOyAvKio8IEZsYWcgaW5kaWNhdGluZyB0aGUgcHJlc2VuY2Ugb2YgcGFyYW1ldHJpYyBzdGVyZW8KKyAgICAgICAgICAgICAgICAgICAgICBkYXRhIGluIHRoZSBiaXRzdHJlYW0gKi8KKyAgVUNIQVIgbV9zYW1wbGluZ0ZyZXF1ZW5jeUluZGV4OyAgICAgICAgICAvKio8IFNhbXBsZXJhdGUgaW5kZXggICAgICAgICAgKi8KKyAgVUNIQVIgbV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeUluZGV4OyAvKio8IFNhbXBsZXJhdGUgaW5kZXggKi8KKyAgU0NIQVIgbV9leHRlbnNpb25DaGFubmVsQ29uZmlndXJhdGlvbjsgICAvKio8IENoYW5uZWwgY29uZmlndXJhdGlvbiBpbmRleCAgICovCisKKyAgVUNIQVIKKyAgY29uZmlnTW9kZTsgLyoqPCBUaGUgZmxhZyBpbmRpY2F0ZXMgaWYgdGhlIGNhbGxiYWNrIHNoYWxsIHdvcmsgaW4gbWVtb3J5CisgICAgICAgICAgICAgICAgIGFsbG9jYXRpb24gbW9kZSBvciBpbiBjb25maWcgY2hhbmdlIGRldGVjdGlvbiBtb2RlICovCisgIFVDSEFSIEFhY0NvbmZpZ0NoYW5nZWQ7IC8qKjwgVGhlIGZsYWcgd2lsbCBiZSBzZXQgaWYgYXQgbGVhc3Qgb25lIGFhYyBjb25maWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGhhcyBjaGFuZ2VkIHRoYXQgcmVxdWlyZXMgYSBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25maWd1cmF0aW9uLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBjbGVhcmVkICovCisgIFVDSEFSIFNickNvbmZpZ0NoYW5nZWQ7IC8qKjwgVGhlIGZsYWcgd2lsbCBiZSBzZXQgaWYgYXQgbGVhc3Qgb25lIHNiciBjb25maWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGhhcyBjaGFuZ2VkIHRoYXQgcmVxdWlyZXMgYSBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25maWd1cmF0aW9uLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBjbGVhcmVkICovCisgIFVDSEFSIFNhY0NvbmZpZ0NoYW5nZWQ7IC8qKjwgVGhlIGZsYWcgd2lsbCBiZSBzZXQgaWYgYXQgbGVhc3Qgb25lIHNhYyBjb25maWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGhhcyBjaGFuZ2VkIHRoYXQgcmVxdWlyZXMgYSBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25maWd1cmF0aW9uLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBjbGVhcmVkICovCisKKyAgVUNIQVIKKyAgY29uZmlnW1RQX1VTQUNfTUFYX0NPTkZJR19MRU5dOyAvKio8IENvbmZpZ3VyYXRpb24gc3RvcmVkIGFzIGJpdHN0cmVhbSAqLworICBVSU5UIGNvbmZpZ0JpdHM7ICAgICAgICAgICAgICAgIC8qKjwgQ29uZmlndXJhdGlvbiBsZW5ndGggaW4gYml0cyAqLwogCiB9IENTQXVkaW9TcGVjaWZpY0NvbmZpZzsKIAotdHlwZWRlZiBJTlQgKCpjYlVwZGF0ZUNvbmZpZ190KSh2b2lkKiwgY29uc3QgQ1NBdWRpb1NwZWNpZmljQ29uZmlnKik7Ci10eXBlZGVmIElOVCAoKmNiU3NjX3QpKAotICAgICAgICB2b2lkKiwgSEFORExFX0ZES19CSVRTVFJFQU0sCi0gICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKLSAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nRnJlcXVlbmN5LAotICAgICAgICBjb25zdCBJTlQgbXV4TW9kZSwKLSAgICAgICAgY29uc3QgSU5UIGNvbmZpZ0J5dGVzCi0gICAgICAgICk7Ci10eXBlZGVmIElOVCAoKmNiU2JyX3QpKAotICAgICAgICB2b2lkICogICAgICAgICAgICAgICAgICBzZWxmLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICBoQnMsCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGVSYXRlSW4sCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGVSYXRlT3V0LAotICAgICAgICBjb25zdCBJTlQgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsCi0gICAgICAgIGNvbnN0IE1QNF9FTEVNRU5UX0lEICAgIGVsZW1lbnRJRCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgZWxlbWVudEluZGV4Ci0gICAgICAgICk7Cit0eXBlZGVmIHN0cnVjdCB7CisgIFNDSEFSIGZsdXNoQ250OyAgICAgIC8qKjwgRmx1c2ggZnJhbWUgY291bnRlciAqLworICBVQ0hBUiBmbHVzaFN0YXR1czsgICAvKio8IEZsYWcgaW5kaWNhdGVzIGZsdXNoIG1vZGU6IG9ufG9mZiAqLworICBTQ0hBUiBidWlsZFVwQ250OyAgICAvKio8IEJ1aWxkIHVwIGZyYW1lIGNvdW50ZXIgKi8KKyAgVUNIQVIgYnVpbGRVcFN0YXR1czsgLyoqPCBGbGFnIGluZGljYXRlcyBidWlsZCB1cCBtb2RlOiBvbnxvZmYgKi8KKyAgVUNIQVIgY2ZnQ2hhbmdlZDsgLyoqPCBGbGFnIGluZGljYXRlcyB0aGF0IHRoZSBjb25maWcgY2hhbmdlZCBhbmQgdGhlIGRlY29kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgYWdhaW4gdmlhIGNhbGxiYWNrLiBNYWtlIHN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZW1vcnkgaXMgZnJlZWQgYmVmb3JlIGluaXRpYWxpemF0aW9uLiAqLworICBVQ0hBUiBjb250ZW50Q2hhbmdlZDsgLyoqPCBGbGFnIGluZGljYXRlcyB0aGF0IHRoZSBjb250ZW50IGNoYW5nZWQgaS5lLiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCB0cnVuY2F0aW9uIG9jY3VyZWQgYmVmb3JlICovCisgIFVDSEFSIGZvcmNlQ2ZnQ2hhbmdlOyAvKio8IEZsYWcgaW5kaWNhdGVzIGlmIGNvbmZpZyBjaGFuZ2UgaGFzIHRvIGJlIGZvcmNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbiBpZiBuZXcgY29uZmlnIGlzIHRoZSBzYW1lICovCit9IENDdHJsQ0ZHQ2hhbmdlOwogCi10eXBlZGVmIHN0cnVjdCAgewotICBjYlVwZGF0ZUNvbmZpZ190IGNiVXBkYXRlQ29uZmlnOyAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgZm9yIENvbmZpZyBjaGFuZ2Ugbm90aWZ5IGNhbGxiYWNrLiAgKi8KLSAgdm9pZCAqY2JVcGRhdGVDb25maWdEYXRhOyAgICAgICAgLyohPCBVc2VyIGRhdGEgcG9pbnRlciBmb3IgQ29uZmlnIGNoYW5nZSBub3RpZnkgY2FsbGJhY2suICovCi0gIGNiU3NjX3QgY2JTc2M7ICAgICAgICAgICAgICAgICAgIC8qITwgRnVuY3Rpb24gcG9pbnRlciBmb3IgU1NDIHBhcnNlciBjYWxsYmFjay4gKi8KLSAgdm9pZCAqY2JTc2NEYXRhOyAgICAgICAgICAgICAgICAgLyohPCBVc2VyIGRhdGEgcG9pbnRlciBmb3IgU1NDIHBhcnNlciBjYWxsYmFjay4gKi8KLSAgY2JTYnJfdCBjYlNicjsgICAgICAgICAgICAgICAgICAgLyohPCBGdW5jdGlvbiBwb2ludGVyIGZvciBTQlIgaGVhZGVyIHBhcnNlciBjYWxsYmFjay4gKi8KLSAgdm9pZCAqY2JTYnJEYXRhOyAgICAgICAgICAgICAgICAgLyohPCBVc2VyIGRhdGEgcG9pbnRlciBmb3IgU0JSIGhlYWRlciBwYXJzZXIgY2FsbGJhY2suICovCit0eXBlZGVmIElOVCAoKmNiVXBkYXRlQ29uZmlnX3QpKHZvaWQgKiwgY29uc3QgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIGNvbmZpZ01vZGUsIFVDSEFSICpjb25maWdDaGFuZ2VkKTsKK3R5cGVkZWYgSU5UICgqY2JGcmVlTWVtX3QpKHZvaWQgKiwgY29uc3QgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICopOwordHlwZWRlZiBJTlQgKCpjYkN0cmxDRkdDaGFuZ2VfdCkodm9pZCAqLCBjb25zdCBDQ3RybENGR0NoYW5nZSAqKTsKK3R5cGVkZWYgSU5UICgqY2JTc2NfdCkodm9pZCAqLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2FtcGxpbmdSYXRlLCBjb25zdCBJTlQgc3RlcmVvQ29uZmlnSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBjb3JlU2JyRnJhbWVMZW5ndGhJbmRleCwgY29uc3QgSU5UIGNvbmZpZ0J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBjb25maWdNb2RlLCBVQ0hBUiAqY29uZmlnQ2hhbmdlZCk7CisKK3R5cGVkZWYgSU5UICgqY2JTYnJfdCkodm9pZCAqc2VsZiwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZUluLCBjb25zdCBJTlQgc2FtcGxlUmF0ZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbGVtZW50SUQsIGNvbnN0IElOVCBlbGVtZW50SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIGhhcm1vbmljU2JyLCBjb25zdCBVQ0hBUiBzdGVyZW9Db25maWdJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgY29uZmlnTW9kZSwgVUNIQVIgKmNvbmZpZ0NoYW5nZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBkb3duc2NhbGVGYWN0b3IpOworCit0eXBlZGVmIElOVCAoKmNiVXNhY190KSh2b2lkICpzZWxmLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMpOworCit0eXBlZGVmIElOVCAoKmNiVW5pRHJjX3QpKHZvaWQgKnNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGZ1bGxQYXlsb2FkTGVuZ3RoLCBjb25zdCBJTlQgcGF5bG9hZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzdWJTdHJlYW1JbmRleCwgY29uc3QgSU5UIHBheWxvYWRTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUpOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNiVXBkYXRlQ29uZmlnX3QgY2JVcGRhdGVDb25maWc7IC8qITwgRnVuY3Rpb24gcG9pbnRlciBmb3IgQ29uZmlnIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkgY2FsbGJhY2suICAqLworICB2b2lkICpjYlVwZGF0ZUNvbmZpZ0RhdGE7IC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIENvbmZpZyBjaGFuZ2Ugbm90aWZ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suICovCisgIGNiRnJlZU1lbV90IGNiRnJlZU1lbTsgICAgLyohPCBGdW5jdGlvbiBwb2ludGVyIGZvciBmcmVlIG1lbW9yeSBjYWxsYmFjay4gICovCisgIHZvaWQgKmNiRnJlZU1lbURhdGE7ICAgICAgLyohPCBVc2VyIGRhdGEgcG9pbnRlciBmb3IgZnJlZSBtZW1vcnkgY2FsbGJhY2suICovCisgIGNiQ3RybENGR0NoYW5nZV90IGNiQ3RybENGR0NoYW5nZTsgLyohPCBGdW5jdGlvbiBwb2ludGVyIGZvciBjb25maWcgY2hhbmdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCBjYWxsYmFjay4gKi8KKyAgdm9pZCAqY2JDdHJsQ0ZHQ2hhbmdlRGF0YTsgLyohPCBVc2VyIGRhdGEgcG9pbnRlciBmb3IgY29uZmlnIGNoYW5nZSBjb250cm9sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLiAqLworICBjYlNzY190IGNiU3NjOyAgICAgICAgICAgICAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgZm9yIFNTQyBwYXJzZXIgY2FsbGJhY2suICovCisgIHZvaWQgKmNiU3NjRGF0YTsgICAgICAgICAgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIFNTQyBwYXJzZXIgY2FsbGJhY2suICovCisgIGNiU2JyX3QgY2JTYnI7ICAgLyohPCBGdW5jdGlvbiBwb2ludGVyIGZvciBTQlIgaGVhZGVyIHBhcnNlciBjYWxsYmFjay4gKi8KKyAgdm9pZCAqY2JTYnJEYXRhOyAvKiE8IFVzZXIgZGF0YSBwb2ludGVyIGZvciBTQlIgaGVhZGVyIHBhcnNlciBjYWxsYmFjay4gKi8KKyAgY2JVc2FjX3QgY2JVc2FjOworICB2b2lkICpjYlVzYWNEYXRhOworICBjYlVuaURyY190IGNiVW5pRHJjOyAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgZm9yIHVuaURyY0NvbmZpZyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG91ZG5lc3NJbmZvU2V0IHBhcnNlciBjYWxsYmFjay4gKi8KKyAgdm9pZCAqY2JVbmlEcmNEYXRhOyAgLyohPCBVc2VyIGRhdGEgcG9pbnRlciBmb3IgdW5pRHJjQ29uZmlnIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb3VkbmVzc0luZm9TZXQgcGFyc2VyIGNhbGxiYWNrLiAqLwogfSBDU1RwQ2FsbEJhY2tzOwogCi1zdGF0aWMgY29uc3QgVUlOVCBTYW1wbGluZ1JhdGVUYWJsZVtdID0gCi17IDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMCwgNzM1MCwgMCwgMCwKLSAgMAotfTsKK3N0YXRpYyBjb25zdCBVSU5UIFNhbXBsaW5nUmF0ZVRhYmxlW10gPSB7CisgICAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwgMjQwMDAsIDIyMDUwLCAxNjAwMCwgMTIwMDAsIDExMDI1LAorICAgIDgwMDAsICA3MzUwLCAgMCwgICAgIDAsICAgICA1NzYwMCwgNTEyMDAsIDQwMDAwLCAzODQwMCwgMzQxNTAsIDI4ODAwLCAyNTYwMCwKKyAgICAyMDAwMCwgMTkyMDAsIDE3MDc1LCAxNDQwMCwgMTI4MDAsIDk2MDAsICAwLCAgICAgMCwgICAgIDAsICAgICAwfTsKIAotc3RhdGljIGlubGluZQotaW50IGdldFNhbXBsaW5nUmF0ZUluZGV4KCBVSU5UIHNhbXBsaW5nUmF0ZSApCi17Ci0gIFVJTlQgc2ZfaW5kZXgsIHRhYmxlU2l6ZT1zaXplb2YoU2FtcGxpbmdSYXRlVGFibGUpL3NpemVvZihVSU5UKTsKK3N0YXRpYyBpbmxpbmUgaW50IGdldFNhbXBsaW5nUmF0ZUluZGV4KFVJTlQgc2FtcGxpbmdSYXRlLCBVSU5UIG5CaXRzKSB7CisgIFVJTlQgc2ZfaW5kZXg7CisgIFVJTlQgdGFibGVTaXplID0gKDEgPDwgbkJpdHMpIC0gMTsKIAotICBmb3IgKHNmX2luZGV4PTA7IHNmX2luZGV4PHRhYmxlU2l6ZTsgc2ZfaW5kZXgrKykgewotICAgIGlmKCBTYW1wbGluZ1JhdGVUYWJsZVtzZl9pbmRleF0gPT0gc2FtcGxpbmdSYXRlICkgYnJlYWs7CisgIGZvciAoc2ZfaW5kZXggPSAwOyBzZl9pbmRleCA8IHRhYmxlU2l6ZTsgc2ZfaW5kZXgrKykgeworICAgIGlmIChTYW1wbGluZ1JhdGVUYWJsZVtzZl9pbmRleF0gPT0gc2FtcGxpbmdSYXRlKSBicmVhazsKICAgfQogCi0gIGlmIChzZl9pbmRleD50YWJsZVNpemUtMSkgewotICAgIHJldHVybiB0YWJsZVNpemUtMTsKKyAgaWYgKHNmX2luZGV4ID4gdGFibGVTaXplKSB7CisgICAgcmV0dXJuIHRhYmxlU2l6ZSAtIDE7CiAgIH0KIAogICByZXR1cm4gc2ZfaW5kZXg7CkBAIC0zMjUsMjYgKzQzMywzMyBAQAogLyoKICAqIEdldCBDaGFubmVsIGNvdW50IGZyb20gY2hhbm5lbCBjb25maWd1cmF0aW9uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGdldE51bWJlck9mVG90YWxDaGFubmVscyhpbnQgY2hhbm5lbENvbmZpZykKLXsKK3N0YXRpYyBpbmxpbmUgaW50IGdldE51bWJlck9mVG90YWxDaGFubmVscyhpbnQgY2hhbm5lbENvbmZpZykgewogICBzd2l0Y2ggKGNoYW5uZWxDb25maWcpIHsKLSAgY2FzZSAxOiBjYXNlIDI6IGNhc2UgMzoKLSAgY2FzZSA0OiBjYXNlIDU6IGNhc2UgNjoKLSAgICByZXR1cm4gY2hhbm5lbENvbmZpZzsKLSAgY2FzZSA3OiBjYXNlIDEyOiBjYXNlIDE0OgotICAgIHJldHVybiA4OwotICBjYXNlIDExOgotICAgIHJldHVybiA3OwotICBkZWZhdWx0OgotICAgIHJldHVybiAwOworICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgY2FzZSAzOgorICAgIGNhc2UgNDoKKyAgICBjYXNlIDU6CisgICAgY2FzZSA2OgorICAgICAgcmV0dXJuIGNoYW5uZWxDb25maWc7CisgICAgY2FzZSA3OgorICAgIGNhc2UgMTI6CisgICAgY2FzZSAxNDoKKyAgICAgIHJldHVybiA4OworICAgIGNhc2UgMTE6CisgICAgICByZXR1cm4gNzsKKyAgICBjYXNlIDEzOgorICAgICAgcmV0dXJuIDI0OworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKICAgfQogfQogCi1zdGF0aWMgaW5saW5lCi1pbnQgZ2V0TnVtYmVyT2ZFZmZlY3RpdmVDaGFubmVscyhjb25zdCBpbnQgY2hhbm5lbENvbmZpZykKLXsgICAgICAgIC8qIGluZGV4OiAwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1ICovCi0gIGNvbnN0IGludCBuW10gPSB7MCwxLDIsMyw0LDUsNSw3LDAsMCwgMCwgNiwgNywgMCwgNywgMH07CitzdGF0aWMgaW5saW5lIGludCBnZXROdW1iZXJPZkVmZmVjdGl2ZUNoYW5uZWxzKAorICAgIGNvbnN0IGludAorICAgICAgICBjaGFubmVsQ29uZmlnKSB7IC8qIGluZGV4OiAwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1ICovCisgIGNvbnN0IGludCBuW10gPSB7MCwgMSwgMiwgMywgNCwgNSwgNSwgNywgMCwgMCwgMCwgNiwgNywgMjIsIDcsIDB9OwogICByZXR1cm4gbltjaGFubmVsQ29uZmlnXTsKIH0KIAotI2VuZGlmIC8qIF9fVFBfREFUQV9IX18gKi8KKyNlbmRpZiAvKiBUUF9EQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUERlYy9pbmNsdWRlL3RwZGVjX2xpYi5oIGIvbGliTXBlZ1RQRGVjL2luY2x1ZGUvdHBkZWNfbGliLmgKaW5kZXggMmFkMzk3ZC4uMzBlNTNjMSAxMDA2NDQKLS0tIGEvbGliTXBlZ1RQRGVjL2luY2x1ZGUvdHBkZWNfbGliLmgKKysrIGIvbGliTXBlZ1RQRGVjL2luY2x1ZGUvdHBkZWNfbGliLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTE0ICs5MCwxMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBUcmFuc3BvcnQgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEF1dGhvcihzKTogTWFudWVsIEphbmRlcgorICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKKwogICAgRGVzY3JpcHRpb246IE1QRUcgVHJhbnNwb3J0IGRlY29kZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfX1RQREVDX0xJQl9IX18KLSNkZWZpbmUgX19UUERFQ19MSUJfSF9fCisjaWZuZGVmIFRQREVDX0xJQl9ICisjZGVmaW5lIFRQREVDX0xJQl9ICiAKICNpbmNsdWRlICJ0cF9kYXRhLmgiCiAKICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAKLSNkZWZpbmUgVFJBTlNQT1JUREVDX0lOQlVGX1NJWkUgICggODE5MiApICAgLyohPCBTaXplIGlzIGluIGJ5dGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGUgdHJhbnNwb3J0IGlucHV0IGJ1ZmZlciBzaXplIGNhcmVmdWxseSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3N1cmUgdGhhdCBpdCBmdWxmaWxscyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCB0cmFuc3BvcnQgZm9ybWF0KHMpLiAgICAgICAgICAgICAgICAgICAgKi8KLQogdHlwZWRlZiBlbnVtIHsKLSAgVFJBTlNQT1JUREVDX09LID0gMCwgICAgICAgICAgICAgLyohPCBBbGwgZmluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFRSQU5TUE9SVERFQ19PSyA9IDAsIC8qITwgQWxsIGZpbmUuICovCiAKICAgLyogU3luY2hyb25pemF0aW9uIGVycm9ycy4gV2FpdCBmb3IgbmV3IGlucHV0IGRhdGEgYW5kIHRyeSBhZ2Fpbi4gKi8KLSAgdHBkZWNfc3luY19lcnJvcl9zdGFydCAgID0gMHgxMDAsCi0gIFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFMsICAgIC8qITwgT3V0IG9mIGJpdHMuIFByb3ZpZGUgbW9yZSBiaXRzIGFuZCB0cnkgYWdhaW4uICAgICAgICAgICAgICAqLwotICBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUiwgICAgICAgICAvKiE8IE5vIHN5bmMgd2FzIGZvdW5kIG9yIHN5bmMgZ290IGxvc3QuIEtlZXAgdHJ5aW5nLiAgICAgICAgICAgKi8KKyAgdHBkZWNfc3luY19lcnJvcl9zdGFydCA9IDB4MTAwLAorICBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTLCAvKiE8IE91dCBvZiBiaXRzLiBQcm92aWRlIG1vcmUgYml0cyBhbmQgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnYWluLiAgICAgICAgICAgICAgKi8KKyAgVFJBTlNQT1JUREVDX1NZTkNfRVJST1IsIC8qITwgTm8gc3luYyB3YXMgZm91bmQgb3Igc3luYyBnb3QgbG9zdC4gS2VlcCB0cnlpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgdHBkZWNfc3luY19lcnJvcl9lbmQsCiAKICAgLyogRGVjb2RlIGVycm9ycy4gTW9zdGx5IGNhdXNlZCBkdWUgdG8gYml0IGVycm9ycy4gKi8KICAgdHBkZWNfZGVjb2RlX2Vycm9yX3N0YXJ0ID0gMHg0MDAsCi0gIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUiwgICAgICAgIC8qITwgQml0c3RyZWFtIGRhdGEgc2hvd2VkIGluY29uc2lzdGVuY2llcyAod3Jvbmcgc3ludGF4KS4gICAgICAqLwotICBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFULCAvKiE8IFVuc3VwcG9ydGVkIGZvcm1hdCBvciBmZWF0dXJlIGZvdW5kIGluIHRoZSBiaXRzdHJlYW0gZGF0YS4gKi8KLSAgVFJBTlNQT1JUREVDX0NSQ19FUlJPUiwgICAgICAgICAgLyohPCBDUkMgZXJyb3IgZW5jb3VudGVyZWQgaW4gYml0c3RyZWFtIGRhdGEuICAgICAgICAgICAgICAgICAgICovCisgIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUiwgLyohPCBCaXRzdHJlYW0gZGF0YSBzaG93ZWQgaW5jb25zaXN0ZW5jaWVzICh3cm9uZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheCkuICAgICAgKi8KKyAgVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVCwgLyohPCBVbnN1cHBvcnRlZCBmb3JtYXQgb3IgZmVhdHVyZSBmb3VuZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGRhdGEuICovCisgIFRSQU5TUE9SVERFQ19DUkNfRVJST1IsIC8qITwgQ1JDIGVycm9yIGVuY291bnRlcmVkIGluIGJpdHN0cmVhbSBkYXRhLiAqLwogICB0cGRlY19kZWNvZGVfZXJyb3JfZW5kLAogCiAgIC8qIEZhdGFsIGVycm9ycy4gU3RvcCBpbW1lZGlhdGVseSBvbiBvbmUgb2YgdGhlc2UgZXJyb3JzISAqLwotICB0cGRlY19mYXRhbF9lcnJvcl9zdGFydCAgPSAweDIwMCwKLSAgVFJBTlNQT1JUREVDX1VOS09XTl9FUlJPUiwgICAgICAgLyohPCBBbiB1bmtub3duIGVycm9yIG9jY3VyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFRSQU5TUE9SVERFQ19JTlZBTElEX1BBUkFNRVRFUiwgIC8qITwgQW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZCB0byBhIGZ1bmN0aW9uLiAgICAgICAgICAgICAqLwotICBUUkFOU1BPUlRERUNfTkVFRF9UT19SRVNUQVJULCAgICAvKiE8IFRoZSBkZWNvZGVyIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCwgc2luY2UgdGhlIHJlcXVpZXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGNhbm5vdCBiZSBwZXJmb3JtZWQuICAgICAgICAgICAgICAgICAgKi8KKyAgdHBkZWNfZmF0YWxfZXJyb3Jfc3RhcnQgPSAweDIwMCwKKyAgVFJBTlNQT1JUREVDX1VOS09XTl9FUlJPUiwgICAgICAvKiE8IEFuIHVua25vd24gZXJyb3Igb2NjdXJlZC4gICAgICAqLworICBUUkFOU1BPUlRERUNfSU5WQUxJRF9QQVJBTUVURVIsIC8qITwgQW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZCB0byBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uICAgICAgICAgICAgICovCisgIFRSQU5TUE9SVERFQ19ORUVEX1RPX1JFU1RBUlQsICAgLyohPCBUaGUgZGVjb2RlciBuZWVkcyB0byBiZSByZXN0YXJ0ZWQsIHNpbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlcXVpZXJlZCAgIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGNhbm5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlICAgcGVyZm9ybWVkLiAgICAgICAgICAgICAgICAgICovCisgIFRSQU5TUE9SVERFQ19UT09fTUFOWV9CSVRTLCAgICAgLyohPCBJbiBjYXNlIG9mIHBhY2tldCBiYXNlZCBmb3JtYXRzOiBTdXBwbGllZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBiaXRzICAgICBleGNlZWQgdGhlIHNpemUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgICAgIGJpdCBidWZmZXIuICAgICAgICAgICAgICAgICovCiAgIHRwZGVjX2ZhdGFsX2Vycm9yX2VuZAogCiB9IFRSQU5TUE9SVERFQ19FUlJPUjsKIAotCiAvKiogTWFjcm8gdG8gaWRlbnRpZnkgZGVjb2RlIGVycm9ycy4gKi8KLSNkZWZpbmUgVFBERUNfSVNfREVDT0RFX0VSUk9SKGVycikgKCAoKGVycj49dHBkZWNfZGVjb2RlX2Vycm9yX3N0YXJ0KSAmJiAoZXJyPD10cGRlY19kZWNvZGVfZXJyb3JfZW5kKSkgPyAxIDogMCkKKyNkZWZpbmUgVFBERUNfSVNfREVDT0RFX0VSUk9SKGVycikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoZXJyID49IHRwZGVjX2RlY29kZV9lcnJvcl9zdGFydCkgJiYgKGVyciA8PSB0cGRlY19kZWNvZGVfZXJyb3JfZW5kKSkgPyAxIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwKQogLyoqIE1hY3JvIHRvIGlkZW50aWZ5IGZhdGFsIGVycm9ycy4gKi8KLSNkZWZpbmUgVFBERUNfSVNfRkFUQUxfRVJST1IoZXJyKSAgKCAoKGVycj49dHBkZWNfZmF0YWxfZXJyb3Jfc3RhcnQpICAmJiAoZXJyPD10cGRlY19mYXRhbF9lcnJvcl9lbmQpKSAgPyAxIDogMCkKLQorI2RlZmluZSBUUERFQ19JU19GQVRBTF9FUlJPUihlcnIpIFwKKyAgKCgoZXJyID49IHRwZGVjX2ZhdGFsX2Vycm9yX3N0YXJ0KSAmJiAoZXJyIDw9IHRwZGVjX2ZhdGFsX2Vycm9yX2VuZCkpID8gMSA6IDApCiAKIC8qKgogICogXGJyaWVmIFBhcmFtZXRlciBpZGVudGlmaWVycyBmb3IgdHJhbnNwb3J0RGVjX1NldFBhcmFtKCkKICAqLwogdHlwZWRlZiBlbnVtIHsKLSAgVFBERUNfUEFSQU1fTUlOSU1JWkVfREVMQVkgPSAxLCAgICAgICAgLyoqIERlbGF5IG1pbmltaXphdGlvbiBzdHJhdGVneS4gMDogbm9uZSwgMTogZGlzY2FyZCBhcyBtYW55IGZyYW1lcyBhcyBwb3NzaWJsZS4gKi8KLSAgVFBERUNfUEFSQU1fRUFSTFlfQ09ORklHLCAgICAgICAgICAgICAgLyoqIEVuYWJsZSBlYXJseSBjb25maWcgZGlzY292ZXJ5LiAqLwotICBUUERFQ19QQVJBTV9JR05PUkVfQlVGRkVSRlVMTE5FU1MsICAgICAvKiogSWdub3JlIGJ1ZmZlciBmdWxsbmVzcy4gKi8KLSAgVFBERUNfUEFSQU1fU0VUX0JJVFJBVEUsICAgICAgICAgICAgICAgLyoqIFNldCBhdmVyYWdlIGJpdCByYXRlIGZvciBiaXQgc3RyZWFtIGludGVycnVwdGlvbiBmcmFtZSBtaXNzZXMgZXN0aW1hdGlvbi4gKi8KLSAgVFBERUNfUEFSQU1fUkVTRVQsICAgICAgICAgICAgICAgICAgICAgLyoqIFJlc2V0IHRyYW5zcG9ydCBkZWNvZGVyIGluc3RhbmNlIHN0YXR1cy4gKi8KLSAgVFBERUNfUEFSQU1fQlVSU1RfUEVSSU9EICAgICAgICAgICAgICAgLyoqIFNldCBkYXRhIHJlY2VwdGlvbiBidXJzdCBwZXJpb2QgaW4gbWlsaSBzZWNvbmRzLiAqLworICBUUERFQ19QQVJBTV9NSU5JTUlaRV9ERUxBWSA9IDEsIC8qKiBEZWxheSBtaW5pbWl6YXRpb24gc3RyYXRlZ3kuIDA6IG5vbmUsIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZCBhcyBtYW55IGZyYW1lcyBhcyBwb3NzaWJsZS4gKi8KKyAgVFBERUNfUEFSQU1fRUFSTFlfQ09ORklHLCAgICAgICAvKiogRW5hYmxlIGVhcmx5IGNvbmZpZyBkaXNjb3ZlcnkuICovCisgIFRQREVDX1BBUkFNX0lHTk9SRV9CVUZGRVJGVUxMTkVTUywgLyoqIElnbm9yZSBidWZmZXIgZnVsbG5lc3MuICovCisgIFRQREVDX1BBUkFNX1NFVF9CSVRSQVRFLCAgLyoqIFNldCBhdmVyYWdlIGJpdCByYXRlIGZvciBiaXQgc3RyZWFtIGludGVycnVwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIG1pc3NlcyBlc3RpbWF0aW9uLiAqLworICBUUERFQ19QQVJBTV9SRVNFVCwgICAgICAgIC8qKiBSZXNldCB0cmFuc3BvcnQgZGVjb2RlciBpbnN0YW5jZSBzdGF0dXMuICovCisgIFRQREVDX1BBUkFNX0JVUlNUX1BFUklPRCwgLyoqIFNldCBkYXRhIHJlY2VwdGlvbiBidXJzdCBwZXJpb2QgaW4gbWlsaSBzZWNvbmRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBUUERFQ19QQVJBTV9UQVJHRVRMQVlPVVQsIC8qKiBTZXQgQ0lDUCB0YXJnZXQgbGF5b3V0ICovCisgIFRQREVDX1BBUkFNX0ZPUkNFX0NPTkZJR19DSEFOR0UsIC8qKiBGb3JjZSBjb25maWcgY2hhbmdlIGZvciBuZXh0IHJlY2VpdmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyAqLworICBUUERFQ19QQVJBTV9VU0VfRUxFTV9TS0lQUElORwogfSBUUERFQ19QQVJBTTsKIAotLyogSVNPL0lFQyAxNDQ5Ni0zIDQuNC4xLjEgVGFibGUgNC4yIFByb2dyYW0gY29uZmlnIGVsZW1lbnQgKi8KLSNkZWZpbmUgUENfRlNCX0NIQU5ORUxTX01BWCAxNiAvKiBGcm9udC9TaWRlL0JhY2sgY2hhbm5lbHMgKi8KLSNkZWZpbmUgUENfTEZFX0NIQU5ORUxTX01BWCA0Ci0jZGVmaW5lIFBDX0FTU09DREFUQV9NQVggICAgOAotI2RlZmluZSBQQ19DQ0VMX01BWCAgICAgICAgIDE2IC8qIENDIGVsZW1lbnRzICovCi0jZGVmaW5lIFBDX0NPTU1FTlRMRU5HVEggICAgMjU2Ci0jZGVmaW5lIFBDX05VTV9IRUlHSFRfTEFZRVIgMwotCi0KIC8qIQogICBcYnJpZWYgICAgICAgICAgICAgICBSZXNldCBQcm9ncmFtIENvbmZpZyBFbGVtZW50LgogICBccGFyYW0gcFBjZSAgICAgICAgICBQcm9ncmFtIENvbmZpZyBFbGVtZW50IHN0cnVjdHVyZS4KICAgXHJldHVybiAgICAgICAgICAgICAgdm9pZAogKi8KLXZvaWQgIENQcm9ncmFtQ29uZmlnX1Jlc2V0ICggQ1Byb2dyYW1Db25maWcgKnBQY2UgKTsKK3ZvaWQgQ1Byb2dyYW1Db25maWdfUmVzZXQoQ1Byb2dyYW1Db25maWcgKnBQY2UpOwogCiAvKiEKICAgXGJyaWVmICAgICAgICAgICAgICAgSW5pdGlhbGl6ZSBQcm9ncmFtIENvbmZpZyBFbGVtZW50LgogICBccGFyYW0gcFBjZSAgICAgICAgICBQcm9ncmFtIENvbmZpZyBFbGVtZW50IHN0cnVjdHVyZS4KICAgXHJldHVybiAgICAgICAgICAgICAgdm9pZAogKi8KLXZvaWQgIENQcm9ncmFtQ29uZmlnX0luaXQgKCBDUHJvZ3JhbUNvbmZpZyAqcFBjZSApOwordm9pZCBDUHJvZ3JhbUNvbmZpZ19Jbml0KENQcm9ncmFtQ29uZmlnICpwUGNlKTsKIAogLyohCi0gIFxicmllZiAgICAgICAgICAgICAgIElucXVpcmUgc3RhdGUgb2YgcHJlc2VudCBQcm9ncmFtIENvbmZpZyBFbGVtZW50IHN0cnVjdHVyZS4KLSAgXHBhcmFtIHBQY2UgICAgICAgICAgUHJvZ3JhbSBDb25maWcgRWxlbWVudCBzdHJ1Y3R1cmUuCi0gIFxyZXR1cm4gICAgICAgICAgICAgIDEgaWYgdGhlIFBDRSBzdHJ1Y3R1cmUgaXMgZmlsbGVkIGNvcnJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgIDAgaWYgbm8gdmFsaWQgUENFIHByZXNlbnQuCisgIFxicmllZiAgICAgICAgICAgICAgIElucXVpcmUgc3RhdGUgb2YgcHJlc2VudCBQcm9ncmFtIENvbmZpZyBFbGVtZW50CisgIHN0cnVjdHVyZS4gXHBhcmFtIHBQY2UgICAgICAgICAgUHJvZ3JhbSBDb25maWcgRWxlbWVudCBzdHJ1Y3R1cmUuIFxyZXR1cm4KKyAgMSBpZiB0aGUgUENFIHN0cnVjdHVyZSBpcyBmaWxsZWQgY29ycmVjdCwgMCBpZiBubyB2YWxpZCBQQ0UgcHJlc2VudC4KICovCi1pbnQgIENQcm9ncmFtQ29uZmlnX0lzVmFsaWQgKCBjb25zdCBDUHJvZ3JhbUNvbmZpZyAqcFBjZSApOworaW50IENQcm9ncmFtQ29uZmlnX0lzVmFsaWQoY29uc3QgQ1Byb2dyYW1Db25maWcgKnBQY2UpOwogCi0jaWZkZWYgVFBfUENFX0VOQUJMRQogLyohCiAgIFxicmllZiAgICAgICAgICAgICAgIFJlYWQgUHJvZ3JhbSBDb25maWcgRWxlbWVudC4KICAgXHBhcmFtIHBQY2UgICAgICAgICAgUHJvZ3JhbSBDb25maWcgRWxlbWVudCBzdHJ1Y3R1cmUuCiAgIFxwYXJhbSBicyAgICAgICAgICAgIEJpdHN0cmVhbSBidWZmZXIgdG8gcmVhZCBmcm9tLgotICBccGFyYW0gYWxpZ25BbmNob3IgICBBbGlnbiBiaXRzdHJlYW0gdG8gYWxpZ25BbmNob3IgYml0cyBhZnRlciBhbGwgcmVhZCBvcGVyYXRpb25zLgotICBccmV0dXJuICAgICAgICAgICAgICB2b2lkCisgIFxwYXJhbSBhbGlnbkFuY2hvciAgIEFsaWduIGJpdHN0cmVhbSB0byBhbGlnbkFuY2hvciBiaXRzIGFmdGVyIGFsbCByZWFkCisgIG9wZXJhdGlvbnMuIFxyZXR1cm4gICAgICAgICAgICAgIHZvaWQKICovCi12b2lkICBDUHJvZ3JhbUNvbmZpZ19SZWFkICggQ1Byb2dyYW1Db25maWcgICAgICAgKnBQY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICBhbGlnbkFuY2hvciApOwordm9pZCBDUHJvZ3JhbUNvbmZpZ19SZWFkKENQcm9ncmFtQ29uZmlnICpwUGNlLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGFsaWduQW5jaG9yKTsKIAogLyohCiAgIFxicmllZiAgICAgICAgICAgICAgIENvbXBhcmUgdHdvIFByb2dyYW0gQ29uZmlnIEVsZW1lbnRzLgpAQCAtMTk0LDUwICsyMDYsNTcgQEAKICAgXHBhcmFtIHBQY2UyICAgICAgICAgUG9pbnRlciB0byBzZWNvbmQgUHJvZ3JhbSBDb25maWcgRWxlbWVudCBzdHJ1Y3R1cmUuCiAgIFxyZXR1cm4gICAgICAgICAgICAgIC0xIGlmIFBDRXMgYXJlIGNvbXBsZXRlbHkgZGlmZmVyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgMCBpZiBQQ0VzIGFyZSBjb21wbGV0ZWx5IGVxdWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgMSBpZiBQQ0VzIGFyZSBkaWZmZXJlbnQgYnV0IGhhdmUgdGhlIHNhbWUgY2hhbm5lbCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAyIGlmIFBDRXMgaGF2ZSBkaWZmZXJlbnQgY2hhbm5lbCBjb25maWcgYnV0IHNhbWUgbnVtYmVyIG9mIGNoYW5uZWxzLgorICAgICAgICAgICAgICAgICAgICAgICAgMSBpZiBQQ0VzIGFyZSBkaWZmZXJlbnQgYnV0IGhhdmUgdGhlIHNhbWUgY2hhbm5lbAorICBjb25maWcsIDIgaWYgUENFcyBoYXZlIGRpZmZlcmVudCBjaGFubmVsIGNvbmZpZyBidXQgc2FtZSBudW1iZXIgb2YgY2hhbm5lbHMuCiAqLwotaW50IENQcm9ncmFtQ29uZmlnX0NvbXBhcmUgKCBjb25zdCBDUHJvZ3JhbUNvbmZpZyAqIGNvbnN0IHBQY2UxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUHJvZ3JhbUNvbmZpZyAqIGNvbnN0IHBQY2UyICk7CitpbnQgQ1Byb2dyYW1Db25maWdfQ29tcGFyZShjb25zdCBDUHJvZ3JhbUNvbmZpZyAqY29uc3QgcFBjZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUHJvZ3JhbUNvbmZpZyAqY29uc3QgcFBjZTIpOwogCiAvKiEKLSAgXGJyaWVmICAgICAgICAgICAgICAgR2V0IGEgUHJvZ3JhbSBDb25maWcgRWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHByZWRlZmluZWQgTVBFRy00IGNoYW5uZWwgY29uZmlndXJhdGlvbnMgMS0xNC4KLSAgXHBhcmFtIHBQY2UgICAgICAgICAgUHJvZ3JhbSBDb25maWcgRWxlbWVudCBzdHJ1Y3R1cmUuCi0gIFxwYXJhbSBjaGFubmVsQ29uZmlnIE1QRUctNCBjaGFubmVsIGNvbmZpZ3VyYXRpb24uCi0gIFxyZXR1cm4gICAgICAgICAgICAgIHZvaWQKKyAgXGJyaWVmICAgICAgICAgICAgICAgR2V0IGEgUHJvZ3JhbSBDb25maWcgRWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHByZWRlZmluZWQKKyAgTVBFRy00IGNoYW5uZWwgY29uZmlndXJhdGlvbnMgMS0xNC4gXHBhcmFtIHBQY2UgICAgICAgICAgUHJvZ3JhbSBDb25maWcKKyAgRWxlbWVudCBzdHJ1Y3R1cmUuIFxwYXJhbSBjaGFubmVsQ29uZmlnIE1QRUctNCBjaGFubmVsIGNvbmZpZ3VyYXRpb24uIFxyZXR1cm4KKyAgdm9pZAogKi8KLXZvaWQgQ1Byb2dyYW1Db25maWdfR2V0RGVmYXVsdCAoIENQcm9ncmFtQ29uZmlnICpwUGNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBjaGFubmVsQ29uZmlnICk7Ci0jZW5kaWYgLyogVFBfUENFX0VOQUJMRSAqLwordm9pZCBDUHJvZ3JhbUNvbmZpZ19HZXREZWZhdWx0KENQcm9ncmFtQ29uZmlnICpwUGNlLCBjb25zdCBVSU5UIGNoYW5uZWxDb25maWcpOwogCiAvKioKICAqIFxicmllZiBMb29rdXAgYW5kIHZlcmlmeSBhIGdpdmVuIGVsZW1lbnQuIFRoZSBkZWNvZGVyIGNhbGxzIHRoaXMKICAqICAgICAgICBtZXRob2Qgd2l0aCBldmVyeSBuZXcgZWxlbWVudCBJRCBmb3VuZCBpbiB0aGUgYml0c3RyZWFtLgogICoKICAqIFxwYXJhbSBwUGNlICAgICAgICBBIHZhbGlkIFByb2dyYW0gY29uZmlnIHN0cnVjdHVyZS4KKyAqIFxwYXJhbSBjaENvbmZpZyAgICBNUEVHLTQgY2hhbm5lbCBjb25maWd1cmF0aW9uLgogICogXHBhcmFtIHRhZyAgICAgICAgIFRhZyBvZiB0aGUgY3VycmVudCBlbGVtZW50IHRvIGJlIGxvb2tlZCB1cC4KICAqIFxwYXJhbSBjaGFubmVsSWR4ICBUaGUgY3VycmVudCBjaGFubmVsIGNvdW50IG9mIHRoZSBkZWNvZGVyIHBhcnNlci4KICAqIFxwYXJhbSBjaE1hcHBpbmcgICBBcnJheSB0byBzdG9yZSB0aGUgY2Fub25pY2FsIGNoYW5uZWwgbWFwcGluZyBpbmRleGVzLgogICogXHBhcmFtIGNoVHlwZSAgICAgIEFycmF5IHRvIHN0b3JlIHRoZSBhdWRpbyBjaGFubmVsIHR5cGUuCiAgKiBccGFyYW0gY2hJbmRleCAgICAgQXJyYXkgdG8gc3RvcmUgdGhlIGluZGl2aWR1YWwgYXVkaW8gY2hhbm5lbCB0eXBlIGluZGV4LgorICogXHBhcmFtIGNoRGVzY3JMZW4gIExlbmd0aCBvZiB0aGUgb3V0cHV0IGNoYW5uZWwgZGVzY3JpcHRpb24gYXJyYXkuCiAgKiBccGFyYW0gZWxNYXBwaW5nICAgUG9pbnRlciB3aGVyZSB0aGUgY2Fub25pY2FsIGVsZW1lbnQgaW5kZXggaXMgc3RvcmVkLgogICogXHBhcmFtIGVsVHlwZSAgICAgIFRoZSBlbGVtZW50IGlkIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgdG8gYmUgbG9va2VkIHVwLgogICoKLSAqIFxyZXR1cm4gICAgICAgICAgICBOb24temVybyBpZiB0aGUgZWxlbWVudCBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IHByb2dyYW0sIHplcm8KLSAqICAgICAgICAgICAgICAgICAgICBpZiBpdCBkb2VzIG5vdC4KKyAqIFxyZXR1cm4gICAgICAgICAgICBOb24temVybyBpZiB0aGUgZWxlbWVudCBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IHByb2dyYW0sCisgKiB6ZXJvIGlmIGl0IGRvZXMgbm90LgogICovCi1pbnQgQ1Byb2dyYW1Db25maWdfTG9va3VwRWxlbWVudCgKLSAgICAgICAgQ1Byb2dyYW1Db25maWcgKnBQY2UsCi0gICAgICAgIFVJTlQgICAgICAgICAgICBjaGFubmVsQ29uZmlnLAotICAgICAgICBjb25zdCBVSU5UICAgICAgdGFnLAotICAgICAgICBjb25zdCBVSU5UICAgICAgY2hhbm5lbElkeCwKLSAgICAgICAgVUNIQVIgICAgICAgICAgIGNoTWFwcGluZ1tdLAotICAgICAgICBBVURJT19DSEFOTkVMX1RZUEUgY2hUeXBlW10sCi0gICAgICAgIFVDSEFSICAgICAgICAgICBjaEluZGV4W10sCi0gICAgICAgIFVDSEFSICAgICAgICAgICplbE1hcHBpbmcsCi0gICAgICAgIE1QNF9FTEVNRU5UX0lEICBlbExpc3RbXSwKLSAgICAgICAgTVA0X0VMRU1FTlRfSUQgIGVsVHlwZQotICAgICAgICApOworaW50IENQcm9ncmFtQ29uZmlnX0xvb2t1cEVsZW1lbnQoQ1Byb2dyYW1Db25maWcgKnBQY2UsIFVJTlQgY2hDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIHRhZywgY29uc3QgVUlOVCBjaGFubmVsSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgY2hNYXBwaW5nW10sIEFVRElPX0NIQU5ORUxfVFlQRSBjaFR5cGVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGNoSW5kZXhbXSwgY29uc3QgVUlOVCBjaERlc2NyTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmVsTWFwcGluZywgTVA0X0VMRU1FTlRfSUQgZWxMaXN0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUDRfRUxFTUVOVF9JRCBlbFR5cGUpOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAgICBHZXQgdGFibGUgb2YgY2hhbm5lbCBpbmRpY2VzIGluIHRoZSBvcmRlciBvZiB0aGVpcgorICogYXBwZWFyYW5jZSBpbiBieSB0aGUgcHJvZ3JhbSBjb25maWcgZmllbGQuCisgKiBccGFyYW0gcFBjZSAgICAgICAgQSB2YWxpZCBwcm9ncmFtIGNvbmZpZyBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gcGNlQ2hNYXAgICAgQXJyYXkgdG8gc3RvcmUgdGhlIGNoYW5uZWwgbWFwcGluZyBpbmRpY2VzIGxpa2UgdGhleQorICogYXBwZWFyIGluIHRoZSBQQ0UuCisgKiBccGFyYW0gcGNlQ2hNYXBMZW4gTGVuZ2h0IG9mIHRoZSBjaGFubmVsIG1hcHBpbmcgaW5kZXggYXJyYXkgKHBjZUNoTWFwKS4KKyAqCisgKiBccmV0dXJuICAgICAgICAgICAgTm9uLXplcm8gaWYgYW55IGVycm9yIG9jY3VyZWQgb3RoZXJ3aXNlIHplcm8uCisgKi8KK2ludCBDUHJvZ3JhbUNvbmZpZ19HZXRQY2VDaE1hcChjb25zdCBDUHJvZ3JhbUNvbmZpZyAqcFBjZSwgVUNIQVIgcGNlQ2hNYXBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIHBjZUNoTWFwTGVuKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICAgICAgICAgR2V0IHRhYmxlIG9mIGVsZW1lbnRzIGluIGNhbm9uaWNhbCBvcmRlciBmcm9tIGEKQEAgLTI1MCwxMCArMjY5LDIyIEBACiAgKiAgICAgICAgICAgICAgICAgICAgUENFLiBJZiBub25lIGNhbiBiZSBmb3VuZCBpdCByZWNlaXZlcyB0aGUgdmFsdWUgMC4KICAqIFxyZXR1cm4gICAgICAgICAgICBUb3RhbCBlbGVtZW50IGNvdW50IGluY2x1ZGluZyBhbGwgU0NFLCBDUEUgYW5kIExGRS4KICAqLwotaW50IENQcm9ncmFtQ29uZmlnX0dldEVsZW1lbnRUYWJsZSggY29uc3QgQ1Byb2dyYW1Db25maWcgKnBQY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUDRfRUxFTUVOVF9JRCAgdGFibGVbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBlbExpc3RTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnBDaE1hcElkeCApOworaW50IENQcm9ncmFtQ29uZmlnX0dldEVsZW1lbnRUYWJsZShjb25zdCBDUHJvZ3JhbUNvbmZpZyAqcFBjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVA0X0VMRU1FTlRfSUQgdGFibGVbXSwgY29uc3QgSU5UIGVsTGlzdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwQ2hNYXBJZHgpOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBHZXQgY2hhbm5lbCBkZXNjcmlwdGlvbiAodHlwZSBhbmQgaW5kZXgpIGZvciBpbXBsaWNpdAorICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25zIChjaENvbmZpZyA+IDApIGluIE1QRUcgY2Fub25pY2FsIG9yZGVyLgorICogXHBhcmFtIGNoQ29uZmlnIE1QRUctNCBjaGFubmVsIGNvbmZpZ3VyYXRpb24uCisgKiBccGFyYW0gY2hUeXBlICAgQXJyYXkgdG8gc3RvcmUgdGhlIGF1ZGlvIGNoYW5uZWwgdHlwZS4KKyAqIFxwYXJhbSBjaEluZGV4ICBBcnJheSB0byBzdG9yZSB0aGUgaW5kaXZpZHVhbCBhdWRpbyBjaGFubmVsIHR5cGUgaW5kZXguCisgKiBccmV0dXJuICAgICAgICAgdm9pZAorICovCit2b2lkIENQcm9ncmFtQ29uZmlnX0dldENoYW5uZWxEZXNjcmlwdGlvbihjb25zdCBVSU5UIGNoQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1Byb2dyYW1Db25maWcgKnBQY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX1RZUEUgY2hUeXBlW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBjaEluZGV4W10pOwogCiAvKioKICAqIFxicmllZiAgICAgICBJbml0aWFsaXplIGEgZ2l2ZW4gQXVkaW9TcGVjaWZpY0NvbmZpZyBzdHJ1Y3R1cmUuCkBAIC0yNjUsNDUgKzI5Niw1MCBAQAogLyoqCiAgKiBcYnJpZWYgICBQYXJzZSBhIEF1ZGlvU3BlY2lmaWNDb25maWcgZnJvbSBhIGdpdmVuIGJpdHN0cmVhbSBoYW5kbGUuCiAgKgotICogXHBhcmFtIHBBc2MgICAgICAgICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBDU0F1ZGlvU3BlY2lmaWNDb25maWcgc3RydWN0LgorICogXHBhcmFtIHBBc2MgICAgICAgICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIGFuIGFsbG9jYXRlZAorICogQ1NBdWRpb1NwZWNpZmljQ29uZmlnIHN0cnVjdC4KICAqIFxwYXJhbSBoQnMgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbSBoYW5kbGUuCi0gKiBccGFyYW0gZkV4cGxpY2l0QmFja3dhcmRDb21wYXRpYmxlICBEbyBleHBsaWNpdCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHBhcnNpbmcgaWYgc2V0IChmbGFnKS4KKyAqIFxwYXJhbSBmRXhwbGljaXRCYWNrd2FyZENvbXBhdGlibGUgIERvIGV4cGxpY2l0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAqIHBhcnNpbmcgaWYgc2V0IChmbGFnKS4KICAqIFxwYXJhbSBjYiBwb2ludGVyIHRvIHN0cnVjdHVyZSBob2xkaW5nIGNhbGxiYWNrIGluZm9ybWF0aW9uCisgKiBccGFyYW0gY29uZmlnTW9kZSBDb25maWcgbW9kZXM6IG1lbW9yeSBhbGxvY2F0aW9uIG1vZGUgb3IgY29uZmlnIGNoYW5nZQorICogZGV0ZWN0aW9uIG1vZGUuCisgKiBccGFyYW0gY29uZmlnQ2hhbmdlZCBJbmRpY2F0ZXMgYSBjb25maWcgY2hhbmdlLgorICogXHBhcmFtIG1fYW90IGluIGNhc2Ugb2YgdW5lcXVhbCBBT1RfTlVMTF9PQkpFQ1Qgb25seSB0aGUgc3BlY2lmaWMgY29uZmlnIGlzCisgKiBwYXJzZWQuCiAgKgogICogXHJldHVybiAgVG90YWwgZWxlbWVudCBjb3VudCBpbmNsdWRpbmcgYWxsIFNDRSwgQ1BFIGFuZCBMRkUuCiAgKi8KIFRSQU5TUE9SVERFQ19FUlJPUiBBdWRpb1NwZWNpZmljQ29uZmlnX1BhcnNlKAotICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2MsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgaW50IGZFeHBsaWNpdEJhY2t3YXJkQ29tcGF0aWJsZSwKLSAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IKLSAgICAgICAgKTsKKyAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2MsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICBpbnQgZkV4cGxpY2l0QmFja3dhcmRDb21wYXRpYmxlLCBDU1RwQ2FsbEJhY2tzICpjYiwgVUNIQVIgY29uZmlnTW9kZSwKKyAgICBVQ0hBUiBjb25maWdDaGFuZ2VkLCBBVURJT19PQkpFQ1RfVFlQRSBtX2FvdCk7CiAKIC8qIENFTFAgc3R1ZmYgKi8KLWVudW0gewotICBNUEUgICAgID0gMCwKLSAgUlBFICAgICA9IDEsCi0gIGZzOEtIeiAgPSAwLAotICBmczE2S0h6ID0gMQotfTsKK2VudW0geyBNUEUgPSAwLCBSUEUgPSAxLCBmczhLSHogPSAwLCBmczE2S0h6ID0gMSB9OwogCiAvKiBEZWZpbnRpb24gb2YgZmxhZ3MgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRyYW5zcG9ydERlY09wZW4oKSAqLwogI2RlZmluZSBUUF9GTEFHX01QRUc0IDEKIAogLyogQ2FwYWJpbGl0eSBmbGFncyAqLwotI2RlZmluZSBDQVBGX1RQREVDX0FESUYgICAgICAgIDB4MDAwMDEwMDAgIC8qKjwgRmxhZyBpbmRpY2F0aW5nIHN1cHBvcnQgZm9yIEFESUYgdHJhbnNwb3J0IGZvcm1hdC4gICAgICAgICovCi0jZGVmaW5lIENBUEZfVFBERUNfQURUUyAgICAgICAgMHgwMDAwMjAwMCAgLyoqPCBGbGFnIGluZGljYXRpbmcgc3VwcG9ydCBmb3IgQURUUyB0cmFuc3BvcnQgZm9ybWF0LiAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9UUERFQ19MT0FTICAgICAgICAweDAwMDA0MDAwICAvKio8IEZsYWcgaW5kaWNhdGluZyBzdXBwb3J0IGZvciBMT0FTIHRyYW5zcG9ydCBmb3JtYXQuICAgICAgICAqLwotI2RlZmluZSBDQVBGX1RQREVDX0xBVE0gICAgICAgIDB4MDAwMDgwMDAgIC8qKjwgRmxhZyBpbmRpY2F0aW5nIHN1cHBvcnQgZm9yIExBVE0gdHJhbnNwb3J0IGZvcm1hdC4gICAgICAgICovCi0jZGVmaW5lIENBUEZfVFBERUNfUkFXUEFDS0VUUyAgMHgwMDAxMDAwMCAgLyoqPCBGbGFnIGluZGljYXRpbmcgc3VwcG9ydCBmb3IgcmF3IHBhY2tldHMgdHJhbnNwb3J0IGZvcm1hdC4gKi8KKyNkZWZpbmUgQ0FQRl9UUERFQ19BRElGIFwKKyAgMHgwMDAwMTAwMCAvKio8IEZsYWcgaW5kaWNhdGluZyBzdXBwb3J0IGZvciBBRElGIHRyYW5zcG9ydCBmb3JtYXQuICAgICAgICAqLworI2RlZmluZSBDQVBGX1RQREVDX0FEVFMgXAorICAweDAwMDAyMDAwIC8qKjwgRmxhZyBpbmRpY2F0aW5nIHN1cHBvcnQgZm9yIEFEVFMgdHJhbnNwb3J0IGZvcm1hdC4gICAgICAgICovCisjZGVmaW5lIENBUEZfVFBERUNfTE9BUyBcCisgIDB4MDAwMDQwMDAgLyoqPCBGbGFnIGluZGljYXRpbmcgc3VwcG9ydCBmb3IgTE9BUyB0cmFuc3BvcnQgZm9ybWF0LiAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9UUERFQ19MQVRNIFwKKyAgMHgwMDAwODAwMCAvKio8IEZsYWcgaW5kaWNhdGluZyBzdXBwb3J0IGZvciBMQVRNIHRyYW5zcG9ydCBmb3JtYXQuICAgICAgICAqLworI2RlZmluZSBDQVBGX1RQREVDX1JBV1BBQ0tFVFMgXAorICAweDAwMDEwMDAwIC8qKjwgRmxhZyBpbmRpY2F0aW5nIHN1cHBvcnQgZm9yIHJhdyBwYWNrZXRzIHRyYW5zcG9ydCBmb3JtYXQuICovCiAKIHR5cGVkZWYgc3RydWN0IFRSQU5TUE9SVERFQyAqSEFORExFX1RSQU5TUE9SVERFQzsKIAotCiAvKioKLSAqIFxicmllZiBDb25maWd1cmUgVHJhbnNwb3J0IERlY29kZXIgdmlhIGEgYmluYXJ5IGNvZGVkIEF1ZGlvU3BlY2lmaWNDb25maWcgb3IgU3RyZWFtTXV4Q29uZmlnLgotICogICAgICAgIFRoZSBwcmV2aW91c2x5IHJlcXVlc3RlZCBjb25maWd1cmF0aW9uIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGFzIHdlbGwuIFRoZSBidWZmZXIgY29uZgotICogICAgICAgIG11c3QgY29udGFpbnQgYSBTTUMgaW4gY2FzZSBvZiBMT0FTL0xBVE0gdHJhbnNwb3J0IGZvcm1hdCwgYW5kIGFuIEFTQyBlbHNld2F5cy4KKyAqIFxicmllZiBDb25maWd1cmUgVHJhbnNwb3J0IERlY29kZXIgdmlhIGEgYmluYXJ5IGNvZGVkIEF1ZGlvU3BlY2lmaWNDb25maWcgb3IKKyAqIFN0cmVhbU11eENvbmZpZy4gVGhlIHByZXZpb3VzbHkgcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24gY2FsbGJhY2sgd2lsbCBiZQorICogY2FsbGVkIGFzIHdlbGwuIFRoZSBidWZmZXIgY29uZiBtdXN0IGNvbnRhaW50IGEgU01DIGluIGNhc2Ugb2YKKyAqIExPQVMvTEFUTSB0cmFuc3BvcnQgZm9ybWF0LCBhbmQgYW4gQVNDIGVsc2V3YXlzLgogICoKICAqIFxwYXJhbSBoVHAgICAgIEhhbmRsZSBvZiBhIHRyYW5zcG9ydCBkZWNvZGVyLgogICogXHBhcmFtIGNvbmYgICAgVUNIQVIgYnVmZmVyIG9mIHRoZSBiaW5hcnkgY29kZWQgY29uZmlnIChBU0Mgb3IgU01DKS4KQEAgLTMxMSw5NiArMzQ3LDE3NCBAQAogICoKICAqIFxyZXR1cm4gICAgICAgIEVycm9yIGNvZGUuCiAgKi8KLVRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfT3V0T2ZCYW5kQ29uZmlnKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgKmNvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICBsYXllciApOworVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19PdXRPZkJhbmRDb25maWcoY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqY29uZiwgY29uc3QgVUlOVCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxheWVyKTsKKworLyoqCisgKiBcYnJpZWYgQ29uZmlndXJlIFRyYW5zcG9ydCBEZWNvZGVyIHZpYSBhIGJpbmFyeSBjb2RlZCBVU0FDL1JTVjYwM0RBIENvbmZpZy4KKyAqICAgICAgICBUaGUgYnVmZmVyIG5ld0NvbmZpZyBjb250YWlucyBhIGJpbmFyeSBjb2RlZCBVU0FDL1JTVjYwM0RBIGNvbmZpZyBvZgorICogbGVuZ3RoIG5ld0NvbmZpZ0xlbmd0aCBieXRlcy4gSWYgdGhlIG5ldyBjb25maWcgYW5kIHRoZSBwcmV2aW91cyBjb25maWcgYXJlCisgKiBkaWZmZXJlbnQgY29uZmlnQ2hhbmdlZCBpcyBzZXQgdG8gMSBvdGhlcndpc2UgaXQgaXMgc2V0IHRvIDAuCisgKgorICogXHBhcmFtIGhUcCAgICAgICAgICAgICAgSGFuZGxlIG9mIGEgdHJhbnNwb3J0IGRlY29kZXIuCisgKiBccGFyYW0gbmV3Q29uZmlnICAgICAgICBidWZmZXIgb2YgdGhlIGJpbmFyeSBjb2RlZCBjb25maWcuCisgKiBccGFyYW0gbmV3Q29uZmlnTGVuZ3RoICBMZW5ndGggb2YgbmV3IGNvbmZpZyBpbiBieXRlcy4KKyAqIFxwYXJhbSBidWlsZFVwU3RhdHVzICAgIEluZGljYXRlcyBidWlsZCB1cCBzdGF0dXM6IG9mZnxvbnxpZGxlLgorICogXHBhcmFtIGNvbmZpZ0NoYW5nZWQgICAgSW5kaWNhdGVzIGlmIGNvbmZpZyBjaGFuZ2VkLgorICogXHBhcmFtIGxheWVyICAgICAgICAgICAgSW5zdGFuY2UgbGF5ZXIuCisgKgorICogXHJldHVybiAgICAgICAgRXJyb3IgY29kZS4KKyAqLworVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19JbkJhbmRDb25maWcoCisgICAgY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsIFVDSEFSICpuZXdDb25maWcsIGNvbnN0IFVJTlQgbmV3Q29uZmlnTGVuZ3RoLAorICAgIGNvbnN0IFVDSEFSIGJ1aWxkVXBTdGF0dXMsIFVDSEFSICpjb25maWdDaGFuZ2VkLCBjb25zdCBVSU5UIGxheWVyLAorICAgIFVDSEFSICppbXBsaWNpdEV4cGxpY2l0Q2ZnRGlmZik7CiAKIC8qKgogICogXGJyaWVmIE9wZW4gVHJhbnNwb3J0IG1lZGl1bSBmb3IgcmVhZGluZy4KICAqCiAgKiBccGFyYW0gdHJhbnNwb3J0RGVjRm10IEZvcm1hdCBvZiB0aGUgdHJhbnNwb3J0IGRlY29kZXIgbWVkaXVtIHRvIGJlIGFjY2Vzc2VkLgotICogXHBhcmFtIGZsYWdzICAgICAgICAgICBUcmFuc3BvcnQgZGVjb2RlciBmbGFncy4gQ3VycmVudGx5IG9ubHkgVFBfRkxBR19NUEVHNCwgd2hpY2ggc2lnbmFscyBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIE1QRUc0IGNhcGFibGUgZGVjb2RlciAocmVsZXZhbnQgZm9yIEFEVFMgb25seSkuCisgKiBccGFyYW0gZmxhZ3MgICAgICAgICAgIFRyYW5zcG9ydCBkZWNvZGVyIGZsYWdzLiBDdXJyZW50bHkgb25seSBUUF9GTEFHX01QRUc0LAorICogd2hpY2ggc2lnbmFscyBhIE1QRUc0IGNhcGFibGUgZGVjb2RlciAocmVsZXZhbnQgZm9yIEFEVFMgb25seSkuCiAgKgotICogXHJldHVybiAgIEEgcG9pbnRlciB0byBhIHZhbGlkIGFuZCBhbGxvY2F0ZWQgSEFORExFX1RSQU5TUE9SVERFQyBvciBhIG51bGwgcG9pbnRlciBvbiBmYWlsdXJlLgorICogXHJldHVybiAgIEEgcG9pbnRlciB0byBhIHZhbGlkIGFuZCBhbGxvY2F0ZWQgSEFORExFX1RSQU5TUE9SVERFQyBvciBhIG51bGwKKyAqIHBvaW50ZXIgb24gZmFpbHVyZS4KICAqLwotSEFORExFX1RSQU5TUE9SVERFQyB0cmFuc3BvcnREZWNfT3BlbiggVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0RGVjRm10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncyApOworSEFORExFX1RSQU5TUE9SVERFQyB0cmFuc3BvcnREZWNfT3BlbihUUkFOU1BPUlRfVFlQRSB0cmFuc3BvcnREZWNGbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MsIGNvbnN0IFVJTlQgbnJPZkxheWVyKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICAgICAgICAgICAgUmVnaXN0ZXIgY29uZmlndXJhdGlvbiBjaGFuZ2UgY2FsbGJhY2suCiAgKiBccGFyYW0gaFRwICAgICAgICAgICAgSGFuZGxlIG9mIHRyYW5zcG9ydCBkZWNvZGVyLgotICogXHBhcmFtIGNiVXBkYXRlQ29uZmlnIFBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgYXVkaW8gY29uZmlnIGNoYW5nZXMuCi0gKiBccGFyYW0gdXNlcl9kYXRhICAgICAgdm9pZCBwb2ludGVyIGZvciB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBhcyBmaXJzdCBwYXJhbWV0ZXIuCisgKiBccGFyYW0gY2JVcGRhdGVDb25maWcgUG9pbnRlciB0byBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBhdWRpbyBjb25maWcKKyAqIGNoYW5nZXMuCisgKiBccGFyYW0gdXNlcl9kYXRhICAgICAgdm9pZCBwb2ludGVyIGZvciB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBhcworICogZmlyc3QgcGFyYW1ldGVyLgogICogXHJldHVybiAgICAgICAgICAgICAgIDAgb24gc3VjY2Vzcy4KICAqLwotaW50IHRyYW5zcG9ydERlY19SZWdpc3RlckFzY0NhbGxiYWNrICgKLSAgICAgICAgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCi0gICAgICAgIGNvbnN0IGNiVXBkYXRlQ29uZmlnX3QgY2JVcGRhdGVDb25maWcsCi0gICAgICAgIHZvaWQqIHVzZXJfZGF0YSApOworaW50IHRyYW5zcG9ydERlY19SZWdpc3RlckFzY0NhbGxiYWNrKEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNiVXBkYXRlQ29uZmlnX3QgY2JVcGRhdGVDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgICAgUmVnaXN0ZXIgZnJlZSBtZW1vcnkgY2FsbGJhY2suCisgKiBccGFyYW0gaFRwICAgICAgICAgICAgSGFuZGxlIG9mIHRyYW5zcG9ydCBkZWNvZGVyLgorICogXHBhcmFtIGNiRnJlZU1lbSAgICAgIFBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB0byBmcmVlIGNvbmZpZyBkZXBlbmRlbnQKKyAqIG1lbW9yeS4KKyAqIFxwYXJhbSB1c2VyX2RhdGEgICAgICB2b2lkIHBvaW50ZXIgZm9yIHVzZXIgZGF0YSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGFzCisgKiBmaXJzdCBwYXJhbWV0ZXIuCisgKiBccmV0dXJuICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLgorICovCitpbnQgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyRnJlZU1lbUNhbGxiYWNrKEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYkZyZWVNZW1fdCBjYkZyZWVNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgICAgICAgICBSZWdpc3RlciBjb25maWcgY2hhbmdlIGNvbnRyb2wgY2FsbGJhY2suCisgKiBccGFyYW0gaFRwICAgICAgICAgICAgIEhhbmRsZSBvZiB0cmFuc3BvcnQgZGVjb2Rlci4KKyAqIFxwYXJhbSBjYkN0cmxDRkdDaGFuZ2UgUG9pbnRlciB0byBhIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBjb25maWcgY2hhbmdlCisgKiBjb250cm9sLgorICogXHBhcmFtIHVzZXJfZGF0YSAgICAgICB2b2lkIHBvaW50ZXIgZm9yIHVzZXIgZGF0YSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGFzCisgKiBmaXJzdCBwYXJhbWV0ZXIuCisgKiBccmV0dXJuICAgICAgICAgICAgICAgIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IHRyYW5zcG9ydERlY19SZWdpc3RlckN0cmxDRkdDaGFuZ2VDYWxsYmFjaygKKyAgICBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwgY29uc3QgY2JDdHJsQ0ZHQ2hhbmdlX3QgY2JDdHJsQ0ZHQ2hhbmdlLAorICAgIHZvaWQgKnVzZXJfZGF0YSk7CiAKIC8qKgogICogXGJyaWVmICAgICAgICAgICAgICAgIFJlZ2lzdGVyIFNTQyBwYXJzZXIgY2FsbGJhY2suCiAgKiBccGFyYW0gaFRwICAgICAgICAgICAgSGFuZGxlIG9mIHRyYW5zcG9ydCBkZWNvZGVyLgogICogXHBhcmFtIGNiVXBkYXRlQ29uZmlnIFBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgU1NDIHBhcnNpbmcuCi0gKiBccGFyYW0gdXNlcl9kYXRhICAgICAgdm9pZCBwb2ludGVyIGZvciB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBhcyBmaXJzdCBwYXJhbWV0ZXIuCisgKiBccGFyYW0gdXNlcl9kYXRhICAgICAgdm9pZCBwb2ludGVyIGZvciB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBhcworICogZmlyc3QgcGFyYW1ldGVyLgogICogXHJldHVybiAgICAgICAgICAgICAgIDAgb24gc3VjY2Vzcy4KICAqLwotaW50IHRyYW5zcG9ydERlY19SZWdpc3RlclNzY0NhbGxiYWNrICgKLSAgICAgICAgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCi0gICAgICAgIGNvbnN0IGNiU3NjX3QgY2JTc2NQYXJzZSwKLSAgICAgICAgdm9pZCogdXNlcl9kYXRhICk7CitpbnQgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyU3NjQ2FsbGJhY2soSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2JTc2NfdCBjYlNzY1BhcnNlLCB2b2lkICp1c2VyX2RhdGEpOwogCiAvKioKICAqIFxicmllZiAgICAgICAgICAgICAgICBSZWdpc3RlciBTQlIgaGVhZGVyIHBhcnNlciBjYWxsYmFjay4KICAqIFxwYXJhbSBoVHAgICAgICAgICAgICBIYW5kbGUgb2YgdHJhbnNwb3J0IGRlY29kZXIuCi0gKiBccGFyYW0gY2JVcGRhdGVDb25maWcgUG9pbnRlciB0byBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBTQlIgaGVhZGVyIHBhcnNpbmcuCi0gKiBccGFyYW0gdXNlcl9kYXRhICAgICAgdm9pZCBwb2ludGVyIGZvciB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBhcyBmaXJzdCBwYXJhbWV0ZXIuCi0gKiBccmV0dXJuICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLiAKKyAqIFxwYXJhbSBjYlVwZGF0ZUNvbmZpZyBQb2ludGVyIHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIFNCUiBoZWFkZXIKKyAqIHBhcnNpbmcuCisgKiBccGFyYW0gdXNlcl9kYXRhICAgICAgdm9pZCBwb2ludGVyIGZvciB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBhcworICogZmlyc3QgcGFyYW1ldGVyLgorICogXHJldHVybiAgICAgICAgICAgICAgIDAgb24gc3VjY2Vzcy4KICAqLwotaW50IHRyYW5zcG9ydERlY19SZWdpc3RlclNickNhbGxiYWNrKCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcERlYywgY29uc3QgY2JTYnJfdCBjYlNiciwgdm9pZCogdXNlcl9kYXRhKTsKK2ludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJTYnJDYWxsYmFjayhIQU5ETEVfVFJBTlNQT1JUREVDIGhUcERlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYlNicl90IGNiU2JyLCB2b2lkICp1c2VyX2RhdGEpOwogCiAvKioKLSAqIFxicmllZiBGaWxsIGludGVybmFsIGlucHV0IGJ1ZmZlciB3aXRoIGJpdHN0cmVhbSBkYXRhIGZyb20gdGhlIGV4dGVybmFsIGlucHV0IGJ1ZmZlci4KLSAqICBUaGUgZnVuY3Rpb24gb25seSBjb3BpZXMgc3VjaCBkYXRhIGFzIGxvbmcgYXMgdGhlIGRlY29kZXItaW50ZXJuYWwgaW5wdXQgYnVmZmVyIGlzIG5vdCBmdWxsLgotICogIFNvIGl0IGdyYWJzIHdoYXRldmVyIGl0IGNhbiBmcm9tIHBCdWZmZXIgYW5kIHJldHVybnMgaW5mb3JtYXRpb24gKGJ5dGVzVmFsaWQpIHNvIHRoYXQgYXQgYQotICogIHN1YnNlcXVlbnQgY2FsbCBvZiAldHJhbnNwb3J0RGVjX0ZpbGxEYXRhKCksIHRoZSByaWdodCBwb3NpdGlvbiBpbiBwQnVmZmVyIGNhbiBiZSBkZXRlcm1pbmVkIHRvCisgKiBcYnJpZWYgICAgICAgICAgICAgICAgUmVnaXN0ZXIgVVNBQyBTQyBwYXJzZXIgY2FsbGJhY2suCisgKiBccGFyYW0gaFRwICAgICAgICAgICAgSGFuZGxlIG9mIHRyYW5zcG9ydCBkZWNvZGVyLgorICogXHBhcmFtIGNiVXBkYXRlQ29uZmlnIFBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgVVNBQyBTQworICogcGFyc2luZy4KKyAqIFxwYXJhbSB1c2VyX2RhdGEgICAgICB2b2lkIHBvaW50ZXIgZm9yIHVzZXIgZGF0YSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGFzCisgKiBmaXJzdCBwYXJhbWV0ZXIuCisgKiBccmV0dXJuICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLgorICovCitpbnQgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyVXNhY0NhbGxiYWNrKEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYlVzYWNfdCBjYlVzYWMsIHZvaWQgKnVzZXJfZGF0YSk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgICAgICAgIFJlZ2lzdGVyIHVuaURyY0NvbmZpZyBhbmQgbG91ZG5lc3NJbmZvU2V0IHBhcnNlcgorICogY2FsbGJhY2suCisgKiBccGFyYW0gaFRwICAgICAgICAgICAgSGFuZGxlIG9mIHRyYW5zcG9ydCBkZWNvZGVyLgorICogXHBhcmFtIGNiVXBkYXRlQ29uZmlnIFBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgdW5pRHJjQ29uZmlnCisgKiBhbmQgbG91ZG5lc3NJbmZvU2V0IHBhcnNpbmcuCisgKiBccGFyYW0gdXNlcl9kYXRhICAgICAgdm9pZCBwb2ludGVyIGZvciB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBhcworICogZmlyc3QgcGFyYW1ldGVyLgorICogXHJldHVybiAgICAgICAgICAgICAgIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IHRyYW5zcG9ydERlY19SZWdpc3RlclVuaURyY0NvbmZpZ0NhbGxiYWNrKEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNiVW5pRHJjX3QgY2JVbmlEcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKnBMb3VkbmVzc0luZm9TZXRQb3NpdGlvbik7CisKKy8qKgorICogXGJyaWVmIEZpbGwgaW50ZXJuYWwgaW5wdXQgYnVmZmVyIHdpdGggYml0c3RyZWFtIGRhdGEgZnJvbSB0aGUgZXh0ZXJuYWwgaW5wdXQKKyAqIGJ1ZmZlci4gVGhlIGZ1bmN0aW9uIG9ubHkgY29waWVzIHN1Y2ggZGF0YSBhcyBsb25nIGFzIHRoZSBkZWNvZGVyLWludGVybmFsCisgKiBpbnB1dCBidWZmZXIgaXMgbm90IGZ1bGwuIFNvIGl0IGdyYWJzIHdoYXRldmVyIGl0IGNhbiBmcm9tIHBCdWZmZXIgYW5kCisgKiByZXR1cm5zIGluZm9ybWF0aW9uIChieXRlc1ZhbGlkKSBzbyB0aGF0IGF0IGEgc3Vic2VxdWVudCBjYWxsIG9mCisgKiAldHJhbnNwb3J0RGVjX0ZpbGxEYXRhKCksIHRoZSByaWdodCBwb3NpdGlvbiBpbiBwQnVmZmVyIGNhbiBiZSBkZXRlcm1pbmVkIHRvCiAgKiAgZ3JhYiB0aGUgbmV4dCBkYXRhLgogICoKICAqIFxwYXJhbSBoVHAgICAgICAgICBIYW5kbGUgb2YgdHJhbnNwb3J0RGVjLgogICogXHBhcmFtIHBCdWZmZXIgICAgIFBvaW50ZXIgdG8gZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLgotICogXHBhcmFtIGJ1ZmZlclNpemUgIFNpemUgb2YgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLiBUaGlzIGFyZ3VtZW50IGlzIHJlcXVpcmVkIGJlY2F1c2UgZGVjb2Rlci1pbnRlcm5hbGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgd2UgbmVlZCB0aGUgaW5mb3JtYXRpb24gdG8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgdG8gcEJ1ZmZlciwgd2hlcmUgdGhlIG5leHQKLSAqICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgZGF0YSBpcywgd2hpY2ggaXMgdGhlbiBmZWQgaW50byB0aGUgZGVjb2Rlci1pbnRlcm5hbCBidWZmZXIgKGFzIG11Y2gKLSAqICAgICAgICAgICAgICAgICAgICBhcyBwb3NzaWJsZSkuIE91ciBleGFtcGxlIGZyYW1ld29yayBpbXBsZW1lbnRhdGlvbiBmaWxscyB0aGUgYnVmZmVyIGF0IHBCdWZmZXIKLSAqICAgICAgICAgICAgICAgICAgICBhZ2Fpbiwgb25jZSBpdCBjb250YWlucyBubyBhdmFpbGFibGUgdmFsaWQgYnl0ZXMgYW55bW9yZSAobWVhbmluZyBieXRlc1ZhbGlkIGVxdWFsIDApLgotICogXHBhcmFtIGJ5dGVzVmFsaWQgIE51bWJlciBvZiBiaXRzdHJlYW0gYnl0ZXMgaW4gdGhlIGV4dGVybmFsIGJpdHN0cmVhbSBidWZmZXIgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbgotICogICAgICAgICAgICAgICAgICAgIGNvcGllZCBpbnRvIHRoZSBkZWNvZGVyJ3MgaW50ZXJuYWwgYml0c3RyZWFtIGJ1ZmZlciBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIGlzIHVwZGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBhbW91bnQgb2YgbmV3bHkgY29waWVkIGJ5dGVzLgorICogXHBhcmFtIGJ1ZmZlclNpemUgIFNpemUgb2YgZXh0ZXJuYWwgaW5wdXQgYnVmZmVyLiBUaGlzIGFyZ3VtZW50IGlzIHJlcXVpcmVkCisgKiBiZWNhdXNlIGRlY29kZXItaW50ZXJuYWxseSB3ZSBuZWVkIHRoZSBpbmZvcm1hdGlvbiB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCB0bworICogcEJ1ZmZlciwgd2hlcmUgdGhlIG5leHQgYXZhaWxhYmxlIGRhdGEgaXMsIHdoaWNoIGlzIHRoZW4KKyAqIGZlZCBpbnRvIHRoZSBkZWNvZGVyLWludGVybmFsIGJ1ZmZlciAoYXMgbXVjaCBhcworICogcG9zc2libGUpLiBPdXIgZXhhbXBsZSBmcmFtZXdvcmsgaW1wbGVtZW50YXRpb24gZmlsbHMgdGhlCisgKiBidWZmZXIgYXQgcEJ1ZmZlciBhZ2Fpbiwgb25jZSBpdCBjb250YWlucyBubyBhdmFpbGFibGUgdmFsaWQgYnl0ZXMgYW55bW9yZQorICogKG1lYW5pbmcgYnl0ZXNWYWxpZCBlcXVhbCAwKS4KKyAqIFxwYXJhbSBieXRlc1ZhbGlkICBOdW1iZXIgb2YgYml0c3RyZWFtIGJ5dGVzIGluIHRoZSBleHRlcm5hbCBiaXRzdHJlYW0gYnVmZmVyCisgKiB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGNvcGllZCBpbnRvIHRoZSBkZWNvZGVyJ3MgaW50ZXJuYWwgYml0c3RyZWFtIGJ1ZmZlciBieQorICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBUaGUgdmFsdWUgaXMgdXBkYXRlZCBhY2NvcmRpbmcgdG8KKyAqIHRoZSBhbW91bnQgb2YgbmV3bHkgY29waWVkIGJ5dGVzLgogICogXHBhcmFtIGxheWVyICAgICAgIFRoZSBsYXllciB0aGUgYml0c3RyZWFtIGJlbG9uZ3MgdG8uCiAgKiBccmV0dXJuICAgICAgICAgICAgRXJyb3IgY29kZS4KICAqLwotVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19GaWxsRGF0YSgKLSAgICAgICAgY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyAgaFRwLAotICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICpwQnVmZmVyLAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICBidWZmZXJTaXplLAotICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICpwQnl0ZXNWYWxpZCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgbGF5ZXIgKTsKK1RSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfRmlsbERhdGEoY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwQnVmZmVyLCBjb25zdCBVSU5UIGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKnBCeXRlc1ZhbGlkLCBjb25zdCBJTlQgbGF5ZXIpOwogCiAvKioKICAqIFxicmllZiAgICAgIEdldCB0cmFuc3BvcnREZWMgYml0c3RyZWFtIGhhbmRsZS4KICAqIFxwYXJhbSBoVHAgIFBvaW50ZXIgdG8gYSB0cmFuc3BvcnQgZGVjb2RlciBoYW5kbGUuCiAgKiBccmV0dXJuICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBiaXRzdHJlYW0gaGFuZGxlLgogICovCi1IQU5ETEVfRkRLX0JJVFNUUkVBTSB0cmFuc3BvcnREZWNfR2V0Qml0c3RyZWFtICggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsIGNvbnN0IFVJTlQgbGF5ZXIgKTsKK0hBTkRMRV9GREtfQklUU1RSRUFNIHRyYW5zcG9ydERlY19HZXRCaXRzdHJlYW0oY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGF5ZXIpOwogCiAvKioKICAqIFxicmllZiAgICAgIEdldCB0cmFuc3BvcnQgZm9ybWF0LgogICogXHBhcmFtIGhUcCAgUG9pbnRlciB0byBhIHRyYW5zcG9ydCBkZWNvZGVyIGhhbmRsZS4KICAqIFxyZXR1cm4gICAgIFRoZSB0cmFuc3BvcnQgZm9ybWF0LgogICovCi1UUkFOU1BPUlRfVFlQRSB0cmFuc3BvcnREZWNfR2V0Rm9ybWF0ICggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAgKTsKK1RSQU5TUE9SVF9UWVBFIHRyYW5zcG9ydERlY19HZXRGb3JtYXQoY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHApOwogCiAvKioKICAqIFxicmllZiBHZXQgdGhlIGN1cnJlbnQgYnVmZmVyIGZ1bGxuZXNzIHZhbHVlLgpAQCAtNDA5LDYwICs1MjMsNzYgQEAKICAqCiAgKiBccmV0dXJuICAgICAgICBCdWZmZXIgZnVsbG5lc3MKICAqLwotSU5UIHRyYW5zcG9ydERlY19HZXRCdWZmZXJGdWxsbmVzcyggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAgKTsKK0lOVCB0cmFuc3BvcnREZWNfR2V0QnVmZmVyRnVsbG5lc3MoY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHApOwogCiAvKioKICAqIFxicmllZiAgICAgICBDbG9zZSBhbmQgZGVhbGxvY2F0ZSB0cmFuc3BvcnREZWMuCiAgKiBccGFyYW0gcGhUcCAgUG9pbnRlciB0byBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIHRyYW5zcG9ydCBkZWNvZGVyIGhhbmRsZS4KICAqIFxyZXR1cm4gICAgICB2b2lkCiAgKi8KLXZvaWQgdHJhbnNwb3J0RGVjX0Nsb3NlICggSEFORExFX1RSQU5TUE9SVERFQyAqcGhUcCApOwordm9pZCB0cmFuc3BvcnREZWNfQ2xvc2UoSEFORExFX1RSQU5TUE9SVERFQyAqcGhUcCk7CiAKIC8qKgogICogXGJyaWVmICAgICAgICAgUmVhZCBvbmUgYWNjZXNzIHVuaXQgZnJvbSB0aGUgdHJhbnNwb3J0RGVjIG1lZGl1bS4KICAqIFxwYXJhbSBoVHAgICAgIEhhbmRsZSBvZiB0cmFuc3BvcnREZWMuCi0gKiBccGFyYW0gbGVuZ3RoICBPbiByZXR1cm4sIHRoaXMgdmFsdWUgaXMgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgYWN0dWFsIGFjY2VzcyB1bml0IGxlbmd0aCBpbiBiaXRzLgotICogICAgICAgICAgICAgICAgU2V0IHRvIC0xIGlmIGxlbmd0aCBpcyB1bmtub3duLgorICogXHBhcmFtIGxlbmd0aCAgT24gcmV0dXJuLCB0aGlzIHZhbHVlIGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlIGFjdHVhbCBhY2Nlc3MKKyAqIHVuaXQgbGVuZ3RoIGluIGJpdHMuIFNldCB0byAtMSBpZiBsZW5ndGggaXMgdW5rbm93bi4KICAqIFxyZXR1cm4gICAgICAgIEVycm9yIGNvZGUuCiAgKi8KLVRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfUmVhZEFjY2Vzc1VuaXQgKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwgY29uc3QgVUlOVCBsYXllciApOworVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19SZWFkQWNjZXNzVW5pdChjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBsYXllcik7CiAKIC8qKgotICogXGJyaWVmIEdldCB0aGUgcmVtYWluaW5nIGFtb3VudCBvZiBiaXRzIG9mIHRoZSBjdXJyZW50IGFjY2VzcyB1bml0LiBUaGUgcmVzdWx0Ci0gKiAgICAgICAgY2FuIGJlIGJlbG93IHplcm8sIG1lYW5pbmcgdGhhdCB0b28gbWFueSBiaXRzIGhhdmUgYmVlbiByZWFkLgorICogXGJyaWVmICAgICAgICAgIEdldCBBdWRpb1NwZWNpZmljQ29uZmlnLgorICogXHBhcmFtIGhUcCAgICAgIEhhbmRsZSBvZiB0cmFuc3BvcnREZWMuCisgKiBccGFyYW0gbGF5ZXIgICAgVHJhbnNwb3J0IGxheWVyLgorICogXHBhcmFtIGFzYyAgICAgIFBvaW50ZXIgdG8gQXVkaW9TcGVjaWZpY0NvbmZpZy4KKyAqIFxyZXR1cm4gICAgICAgICBFcnJvciBjb2RlLgorICovCitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0dldEFzYyhjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKmFzYyk7CisKKy8qKgorICogXGJyaWVmIEdldCB0aGUgcmVtYWluaW5nIGFtb3VudCBvZiBiaXRzIG9mIHRoZSBjdXJyZW50IGFjY2VzcyB1bml0LiBUaGUKKyAqIHJlc3VsdCBjYW4gYmUgYmVsb3cgemVybywgbWVhbmluZyB0aGF0IHRvbyBtYW55IGJpdHMgaGF2ZSBiZWVuIHJlYWQuCiAgKiBccGFyYW0gaFRwICAgICBIYW5kbGUgb2YgdHJhbnNwb3J0RGVjLgogICogXHJldHVybiBhbW91bnQgb2YgcmVtYWluaW5nIGJpdHMuCiAgKi8KLUlOVCB0cmFuc3BvcnREZWNfR2V0QXVCaXRzUmVtYWluaW5nKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwgY29uc3QgVUlOVCBsYXllciApOworSU5UIHRyYW5zcG9ydERlY19HZXRBdUJpdHNSZW1haW5pbmcoY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxheWVyKTsKIAogLyoqCiAgKiBcYnJpZWYgR2V0IHRoZSB0b3RhbCBhbW91bnQgb2YgYml0cyBvZiB0aGUgY3VycmVudCBhY2Nlc3MgdW5pdC4KICAqIFxwYXJhbSBoVHAgICAgIEhhbmRsZSBvZiB0cmFuc3BvcnREZWMuCiAgKiBccmV0dXJuIGFtb3VudCBvZiB0b3RhbCBiaXRzLgogICovCi1JTlQgdHJhbnNwb3J0RGVjX0dldEF1Qml0c1RvdGFsKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwgY29uc3QgVUlOVCBsYXllciApOworSU5UIHRyYW5zcG9ydERlY19HZXRBdUJpdHNUb3RhbChjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBsYXllcik7CiAKIC8qKgotICogXGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZGVjb2RlciBoYXMgZmluaXNoZWQgcGFyc2luZwotICogICAgICAgICAgICAgb25lIEFjY2VzcyBVbml0IGZvciBiaXRzdHJlYW0gaG91c2VrZWVwaW5nLgorICogXGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZGVjb2RlciBoYXMKKyAqIGZpbmlzaGVkIHBhcnNpbmcgb25lIEFjY2VzcyBVbml0IGZvciBiaXRzdHJlYW0gaG91c2VrZWVwaW5nLgogICogXHBhcmFtIGhUcCAgVHJhbnNwb3J0IEhhbmRsZS4KICAqIFxyZXR1cm4gICAgIEVycm9yIGNvZGUuCiAgKi8KLVRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfRW5kQWNjZXNzVW5pdCAoIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwICk7CitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0VuZEFjY2Vzc1VuaXQoY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHApOwogCiAvKioKLSAqIFxicmllZiAgICAgIE9idGFpbiB0aGUgYW1vdW50IG9mIG1pc3NpbmcgYWNjZXNzIHVuaXRzIGlmIGFwcGxpY2FibGUgaW4gY2FzZSBvZiAKLSAqICAgICAgICAgICAgIGEgYml0IHN0cmVhbSBzeW5jaHJvbml6YXRpb24gZXJyb3IuIEVhY2ggdGltZSB0cmFuc3BvcnREZWNfUmVhZEFjY2Vzc1VuaXQoKQotICogICAgICAgICAgICAgcmV0dXJucyBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgdG8gcmV0cmlldmUgYW4gZXN0aW1hdGUKLSAqICAgICAgICAgICAgIG9mIHRoZSBhbW91bnQgb2YgbWlzc2luZyBhY2Nlc3MgdW5pdHMuIFRoaXMgd29ya3Mgb25seSBpbiBjYXNlIG9mIGNvbnN0YW50IGF2ZXJhZ2UKLSAqICAgICAgICAgICAgIGJpdCByYXRlIChoYXMgdG8gYmUga25vd24pIGFuZCBpZiB0aGUgcGFyYW1ldGVyIFRQREVDX1BBUkFNX1NFVF9CSVRSQVRFIGhhcyBiZWVuIHNldAotICogICAgICAgICAgICAgYWNjb3JkaW5nbHkuCisgKiBcYnJpZWYgICAgICBPYnRhaW4gdGhlIGFtb3VudCBvZiBtaXNzaW5nIGFjY2VzcyB1bml0cyBpZiBhcHBsaWNhYmxlIGluIGNhc2UKKyAqIG9mIGEgYml0IHN0cmVhbSBzeW5jaHJvbml6YXRpb24gZXJyb3IuIEVhY2ggdGltZQorICogdHJhbnNwb3J0RGVjX1JlYWRBY2Nlc3NVbml0KCkgcmV0dXJucyBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUgorICogdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHRvIHJldHJpZXZlIGFuIGVzdGltYXRlIG9mIHRoZSBhbW91bnQKKyAqIG9mIG1pc3NpbmcgYWNjZXNzIHVuaXRzLiBUaGlzIHdvcmtzIG9ubHkgaW4gY2FzZSBvZiBjb25zdGFudAorICogYXZlcmFnZSBiaXQgcmF0ZSAoaGFzIHRvIGJlIGtub3duKSBhbmQgaWYgdGhlIHBhcmFtZXRlcgorICogVFBERUNfUEFSQU1fU0VUX0JJVFJBVEUgaGFzIGJlZW4gc2V0IGFjY29yZGluZ2x5LgogICogXHBhcmFtIGhUcCAgVHJhbnNwb3J0IEhhbmRsZS4KLSAqIFxwYXJhbSBwTkFjY2Vzc1VuaXRzIHBvaW50ZXIgdG8gYSBtZW1vcnkgbG9jYXRpb24gd2hlcmUgdGhlIGVzdGltYXRlZCBsb3N0IGZyYW1lIGNvdW50IHdpbGwgYmUgc3RvcmVkIGludG8uICAgICAgCisgKiBccGFyYW0gcE5BY2Nlc3NVbml0cyBwb2ludGVyIHRvIGEgbWVtb3J5IGxvY2F0aW9uIHdoZXJlIHRoZSBlc3RpbWF0ZWQgbG9zdAorICogZnJhbWUgY291bnQgd2lsbCBiZSBzdG9yZWQgaW50by4KICAqIFxyZXR1cm4gICAgIEVycm9yIGNvZGUuCiAgKi8KLVRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfR2V0TWlzc2luZ0FjY2Vzc1VuaXRDb3VudCAoIElOVCAqcE5BY2Nlc3NVbml0cywgSEFORExFX1RSQU5TUE9SVERFQyBoVHAgKTsKLQorVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19HZXRNaXNzaW5nQWNjZXNzVW5pdENvdW50KAorICAgIElOVCAqcE5BY2Nlc3NVbml0cywgSEFORExFX1RSQU5TUE9SVERFQyBoVHApOwogCiAvKioKICAqIFxicmllZiAgICAgICAgU2V0IGEgZ2l2ZW4gc2V0dGluZy4KQEAgLTQ3MSwzNSArNjAxLDM2IEBACiAgKiBccGFyYW0gdmFsdWUgIFZhbHVlIGZvciB0aGUgcGFyYW1ldGVyIHRvIGJlIGNoYW5nZWQuCiAgKiBccmV0dXJuICAgICAgIEVycm9yIGNvZGUuCiAgKi8KLVRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfU2V0UGFyYW0gKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUUERFQ19QQVJBTSAgICAgICAgIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgdmFsdWUgKTsKK1RSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfU2V0UGFyYW0oY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRQREVDX1BBUkFNIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgdmFsdWUpOwogCiAvKioKICAqIFxicmllZiAgICAgICAgR2V0IG51bWJlciBvZiBzdWJmcmFtZXMgKGZvciBMQVRNIG9yIEFEVFMpCiAgKiBccGFyYW0gaFRwICAgIFRyYW5zcG9ydCBIYW5kbGUuCi0gKiBccmV0dXJuICAgICAgIE51bWJlciBvZiBBRFRTL0xBVE0gc3ViZnJhbWVzIChyZXR1cm4gMSBmb3IgYWxsIG90aGVyIHRyYW5zcG9ydCB0eXBlcykuCisgKiBccmV0dXJuICAgICAgIE51bWJlciBvZiBBRFRTL0xBVE0gc3ViZnJhbWVzIChyZXR1cm4gMSBmb3IgYWxsIG90aGVyIHRyYW5zcG9ydAorICogdHlwZXMpLgogICovCiBVSU5UIHRyYW5zcG9ydERlY19HZXROck9mU3ViRnJhbWVzKEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwKTsKIAotCiAvKioKICAqIFxicmllZiAgICAgICBHZXQgaW5mbyBzdHJ1Y3R1cmUgb2YgdHJhbnNwb3J0IGRlY29kZXIgbGlicmFyeS4KICAqIFxwYXJhbSBpbmZvICBBIHBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIExJQl9JTkZPIHN0cnVjdC4KICAqIFxyZXR1cm4gICAgICBFcnJvciBjb2RlLgogICovCi1UUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0dldExpYkluZm8oIExJQl9JTkZPICppbmZvICk7CitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0dldExpYkluZm8oTElCX0lORk8gKmluZm8pOwogCiAvKiBBRFRTIENSQyBzdXBwb3J0ICovCiAKIC8qKgogICogXGJyaWVmICAgICAgICBTZXQgY3VycmVudCBiaXRzdHJlYW0gcG9zaXRpb24gYXMgc3RhcnQgb2YgYSBuZXcgZGF0YSByZWdpb24uCiAgKiBccGFyYW0gaFRwICAgIFRyYW5zcG9ydCBoYW5kbGUuCi0gKiBccGFyYW0gbUJpdHMgIFNpemUgaW4gYml0cyBvZiB0aGUgZGF0YSByZWdpb24uIFNldCB0byAwIGlmIGl0IHNob3VsZCBub3QgYmUgb2YgYSBmaXhlZCBzaXplLgotICogXHJldHVybiAgICAgICBEYXRhIHJlZ2lvbiBJRCwgd2hpY2ggc2hvdWxkIGJlIHVzZWQgd2hlbiBjYWxsaW5nIHRyYW5zcG9ydERlY19DcmNFbmRSZWcoKS4KKyAqIFxwYXJhbSBtQml0cyAgU2l6ZSBpbiBiaXRzIG9mIHRoZSBkYXRhIHJlZ2lvbi4gU2V0IHRvIDAgaWYgaXQgc2hvdWxkIG5vdCBiZQorICogb2YgYSBmaXhlZCBzaXplLgorICogXHJldHVybiAgICAgICBEYXRhIHJlZ2lvbiBJRCwgd2hpY2ggc2hvdWxkIGJlIHVzZWQgd2hlbiBjYWxsaW5nCisgKiB0cmFuc3BvcnREZWNfQ3JjRW5kUmVnKCkuCiAgKi8KLWludCB0cmFuc3BvcnREZWNfQ3JjU3RhcnRSZWcgKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbUJpdHMgKTsKK2ludCB0cmFuc3BvcnREZWNfQ3JjU3RhcnRSZWcoY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsIGNvbnN0IElOVCBtQml0cyk7CiAKIC8qKgogICogXGJyaWVmICAgICAgICBTZXQgZW5kIG9mIGRhdGEgcmVnaW9uLgpAQCAtNTA3LDE1ICs2MzgsMjcgQEAKICAqIFxwYXJhbSByZWcgICAgRGF0YSByZWdpb24gSUQsIG9wYnRhaW5lZCBmcm9tIHRyYW5zcG9ydERlY19DcmNTdGFydFJlZygpLgogICogXHJldHVybiAgICAgICB2b2lkCiAgKi8KLXZvaWQgdHJhbnNwb3J0RGVjX0NyY0VuZFJlZyAoIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHJlZyApOwordm9pZCB0cmFuc3BvcnREZWNfQ3JjRW5kUmVnKGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLCBjb25zdCBJTlQgcmVnKTsKIAogLyoqCi0gKiBcYnJpZWYgICAgICBDYWxjdWxhdGUgQURUUyBjcmMgYW5kIGNoZWNrIGlmIGl0IGlzIGNvcnJlY3QuIFRoZSBBRFRTIGNoZWNrc3VtIGlzIGhlbGQgaW50ZXJuYWxseS4KKyAqIFxicmllZiAgICAgIENhbGN1bGF0ZSBBRFRTIGNyYyBhbmQgY2hlY2sgaWYgaXQgaXMgY29ycmVjdC4gVGhlIEFEVFMgY2hlY2tzdW0KKyAqIGlzIGhlbGQgaW50ZXJuYWxseS4KICAqIFxwYXJhbSBoVHAgIFRyYW5zcG9ydCBoYW5kbGUuCi0gKiBccmV0dXJuICAgICBSZXR1cm4gVFJBTlNQT1JUREVDX09LIGlmIHRoZSBDUkMgaXMgb2ssIG9yIGVycm9yIGlmIENSQyBpcyBub3QgY29ycmVjdC4KKyAqIFxyZXR1cm4gICAgIFJldHVybiBUUkFOU1BPUlRERUNfT0sgaWYgdGhlIENSQyBpcyBvaywgb3IgZXJyb3IgaWYgQ1JDIGlzIG5vdAorICogY29ycmVjdC4KICAqLwotVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19DcmNDaGVjayAoIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwICk7CitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0NyY0NoZWNrKGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwKTsKIAorLyoqCisgKiBcYnJpZWYgT25seSBjaGVjayB3aGV0aGVyIGEgZ2l2ZW4gY29uZmlnIHNlZW1zIHRvIGJlIHZhbGlkIHdpdGhvdXQgbW9kaWZ5aW5nCisgKiBpbnRlcm5hbCBzdGF0ZXMuCisgKgorICogXHBhcmFtIGNvbmYgICAgVUNIQVIgYnVmZmVyIG9mIHRoZSBiaW5hcnkgY29kZWQgY29uZmlnIChTREMgdHlwZSA5KS4KKyAqIFxwYXJhbSBsZW5ndGggIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGNvbmYgYnVmZmVyLgorICoKKyAqIFxyZXR1cm4gICAgICAgIEVycm9yIGNvZGUuCisgKi8KK1RSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfRHJtUmF3U2RjQXVkaW9Db25maWdfQ2hlY2soVUNIQVIgKmNvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGVuZ3RoKTsKIAotI2VuZGlmIC8qICNpZm5kZWYgX19UUERFQ19MSUJfSF9fICovCisjZW5kaWYgLyogI2lmbmRlZiBUUERFQ19MSUJfSCAqLwpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL3NyYy9tcGVnRmlsZUZvcm1hdC5oIGIvbGliTXBlZ1RQRGVjL3NyYy9tcGVnRmlsZUZvcm1hdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGNmZTllLi4wMDAwMDAwCi0tLSBhL2xpYk1wZWdUUERlYy9zcmMvbXBlZ0ZpbGVGb3JtYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFRvb2xzICAqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6ICAgT2xpdmVyIE1vc2VyCi0gICBEZXNjcmlwdGlvbjogYml0c3RyZWFtIGZvcm1hdCBkZXRlY3Rpb24gcm91dGluZXMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgIWRlZmluZWQoX19CSVRTVFJFQU1fRk9STUFUX0hfXykKLSNkZWZpbmUgX19CSVRTVFJFQU1fRk9STUFUX0hfXwotCi0jaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCi0jaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCi0KLS8qKgotICogXGJyaWVmIFRyeSB0byBmaW5kIG91dCB0aGUgZm9ybWF0IG9mIGEgZmlsZSwgZ2l2ZW4gdGhlIGZldyBmaXJzdCBieXRlcy4KLSAqIFxwYXJhbSBmaWxlRGF0YSBwb2ludGVyIHRvIGEgYnVmZmVyIGhvbGRpbmcgdGhlIGZpcnN0IGJ5dGVzIG9mIGEgZmlsZS4KLSAqIFxwYXJhbSBwQXUgcG9pbnRlciB0byBVQ0hBUiosIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IEFVIGZvdW5kIG9yIE5VTEwuCi0gKiBccGFyYW0gbGVuZ3RoIHBvaW50ZXIgdG8gdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGZpbGVEYXRhLiBSZXR1cm4gbGVuZ3RoIG9mIGZpcnN0IEFVLgotICogXHJldHVybiB0aGUgZGV0ZWN0ZWQgZmlsZSBmb3JtYXQsIG9yIEZGX1VOS05PV04gaW4gY2FzZSBvZiBmYWlsdXJlLgotICovCi1GSUxFX0ZPUk1BVCBHZXRGaWxlRm9ybWF0KFVDSEFSICpmaWxlRGF0YSwgVUNIQVIgKipwQXUsIFVJTlQgKmxlbmd0aCk7Ci0KLS8qKgotICogXGJyaWVmIFRyeSB0byBmaW5kIG91dCB0aGUgdHJhbnNwb3J0IHR5cGUgY29udGFpbmVkIGluIGEgZ2l2ZW4gZmlsZS4KLSAqIFxwYXJhbSBmaWxlbmFtZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIGFuYWx5c2VkLgotICogXHBhcmFtIGZpbGVGb3JtYXQgcG9pbnRlciB0byBhIHZhcmlhYmxlIHdoZXJlIHRoZSBkZXRlY3RlZCBmaWxlIGZvcm1hdCBpcyBzdG9yZWQgaW50by4KLSAqIFxyZXR1cm4gdGhlIGRldGVjdGVkIHRyYW5zcG9ydCB0eXBlIG9yIFRUX1VOS05PV04gaW4gY2FzZSBvZiBmYWlsdXJlLgotICovCi1UUkFOU1BPUlRfVFlQRSBHZXRUcmFuc3BvcnRUeXBlKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBGSUxFX0ZPUk1BVCAqZmlsZUZvcm1hdCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL3NyYy90cF92ZXJzaW9uLmggYi9saWJNcGVnVFBEZWMvc3JjL3RwX3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmFlZDhjCi0tLSAvZGV2L251bGwKKysrIGIvbGliTXBlZ1RQRGVjL3NyYy90cF92ZXJzaW9uLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTVBFRyB0cmFuc3BvcnQgZm9ybWF0IGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKFRQX1ZFUlNJT05fSCkKKyNkZWZpbmUgVFBfVkVSU0lPTl9ICisKKy8qIGxpYnJhcnkgaW5mbyAqLworI2RlZmluZSBUUF9MSUJfVkwwIDMKKyNkZWZpbmUgVFBfTElCX1ZMMSAwCisjZGVmaW5lIFRQX0xJQl9WTDIgMAorI2RlZmluZSBUUF9MSUJfVElUTEUgIk1QRUcgVHJhbnNwb3J0IgorI2lmZGVmIF9fQU5EUk9JRF9fCisjZGVmaW5lIFRQX0xJQl9CVUlMRF9EQVRFICIiCisjZGVmaW5lIFRQX0xJQl9CVUlMRF9USU1FICIiCisjZWxzZQorI2RlZmluZSBUUF9MSUJfQlVJTERfREFURSBfX0RBVEVfXworI2RlZmluZSBUUF9MSUJfQlVJTERfVElNRSBfX1RJTUVfXworI2VuZGlmCisjZW5kaWYgLyogIWRlZmluZWQoVFBfVkVSU0lPTl9IKSAqLwpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hZGlmLmNwcCBiL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfYWRpZi5jcHAKaW5kZXggMjM3ZTg4MS4uZWMyMGI5YiAxMDA2NDQKLS0tIGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hZGlmLmNwcAorKysgYi9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FkaWYuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDI3ICs5MCwyNCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTVBFRyB0cmFuc3BvcnQgZm9ybWF0IGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorCiAgICBEZXNjcmlwdGlvbjogQURJRiByZWFkZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInRwZGVjX2FkaWYuaCIKIAotCiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAKLVRSQU5TUE9SVERFQ19FUlJPUiBhZGlmUmVhZF9EZWNvZGVIZWFkZXIoCi0gICAgICAgIENBZGlmSGVhZGVyICAgICAgICAgICpwQWRpZkhlYWRlciwKLSAgICAgICAgQ1Byb2dyYW1Db25maWcgICAgICAgKnBQY2UsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBicwotICAgICAgICApCi17CitUUkFOU1BPUlRERUNfRVJST1IgYWRpZlJlYWRfRGVjb2RlSGVhZGVyKENBZGlmSGVhZGVyICpwQWRpZkhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1Byb2dyYW1Db25maWcgKnBQY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzKSB7CiAgIGludCBpOwogICBUUkFOU1BPUlRERUNfRVJST1IgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfT0s7CiAgIFVJTlQgc3RhcnRBbmNob3IgPSBGREtnZXRWYWxpZEJpdHMoYnMpOwpAQCAtMTA4LDQxICsxMTYsMzkgQEAKICAgICByZXR1cm4gKFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFMpOwogICB9CiAKLSAgaWYgKEZES3JlYWRCaXRzKGJzLDgpICE9ICdBJykgeworICBpZiAoRkRLcmVhZEJpdHMoYnMsIDgpICE9ICdBJykgewogICAgIHJldHVybiAoVFJBTlNQT1JUREVDX1NZTkNfRVJST1IpOwogICB9Ci0gIGlmIChGREtyZWFkQml0cyhicyw4KSAhPSAnRCcpIHsKKyAgaWYgKEZES3JlYWRCaXRzKGJzLCA4KSAhPSAnRCcpIHsKICAgICByZXR1cm4gKFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SKTsKICAgfQotICBpZiAoRkRLcmVhZEJpdHMoYnMsOCkgIT0gJ0knKSB7CisgIGlmIChGREtyZWFkQml0cyhicywgOCkgIT0gJ0knKSB7CiAgICAgcmV0dXJuIChUUkFOU1BPUlRERUNfU1lOQ19FUlJPUik7CiAgIH0KLSAgaWYgKEZES3JlYWRCaXRzKGJzLDgpICE9ICdGJykgeworICBpZiAoRkRLcmVhZEJpdHMoYnMsIDgpICE9ICdGJykgewogICAgIHJldHVybiAoVFJBTlNQT1JUREVDX1NZTkNfRVJST1IpOwogICB9CiAKLSAgaWYgKCAocEFkaWZIZWFkZXItPkNvcHlyaWdodElkUHJlc2VudCA9IEZES3JlYWRCaXRzKGJzLDEpKSAhPSAwICkKLSAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChicyw3Mik7ICAvKiBDb3B5cmlnaHRJZCAqLworICBpZiAoKHBBZGlmSGVhZGVyLT5Db3B5cmlnaHRJZFByZXNlbnQgPSBGREtyZWFkQml0cyhicywgMSkpICE9IDApCisgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoYnMsIDcyKTsgLyogQ29weXJpZ2h0SWQgKi8KIAotCi0gIHBBZGlmSGVhZGVyLT5PcmlnaW5hbENvcHkgPSBGREtyZWFkQml0cyhicywxKTsKLSAgcEFkaWZIZWFkZXItPkhvbWUgPSBGREtyZWFkQml0cyhicywxKTsKLSAgcEFkaWZIZWFkZXItPkJpdHN0cmVhbVR5cGUgPSBGREtyZWFkQml0cyhicywxKTsKKyAgcEFkaWZIZWFkZXItPk9yaWdpbmFsQ29weSA9IEZES3JlYWRCaXRzKGJzLCAxKTsKKyAgcEFkaWZIZWFkZXItPkhvbWUgPSBGREtyZWFkQml0cyhicywgMSk7CisgIHBBZGlmSGVhZGVyLT5CaXRzdHJlYW1UeXBlID0gRkRLcmVhZEJpdHMoYnMsIDEpOwogCiAgIC8qIHBBZGlmSGVhZGVyLT5CaXRSYXRlID0gRkRLcmVhZEJpdHMoYnMsIDIzKTsgKi8KLSAgcEFkaWZIZWFkZXItPkJpdFJhdGUgPSBGREtyZWFkQml0cyhicywxNik7CisgIHBBZGlmSGVhZGVyLT5CaXRSYXRlID0gRkRLcmVhZEJpdHMoYnMsIDE2KTsKICAgcEFkaWZIZWFkZXItPkJpdFJhdGUgPDw9IDc7Ci0gIHBBZGlmSGVhZGVyLT5CaXRSYXRlIHw9IEZES3JlYWRCaXRzKGJzLDcpOworICBwQWRpZkhlYWRlci0+Qml0UmF0ZSB8PSBGREtyZWFkQml0cyhicywgNyk7CiAKLSAgcEFkaWZIZWFkZXItPk51bVByb2dyYW1Db25maWdFbGVtZW50cyA9IEZES3JlYWRCaXRzKGJzLDQpICsgMTsKKyAgcEFkaWZIZWFkZXItPk51bVByb2dyYW1Db25maWdFbGVtZW50cyA9IEZES3JlYWRCaXRzKGJzLCA0KSArIDE7CiAKICAgaWYgKHBBZGlmSGVhZGVyLT5CaXRzdHJlYW1UeXBlID09IDApIHsKLSAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChicywyMCk7ICAvKiBhZGlmX2J1ZmZlcl9mdWxsbmVzcyAqLworICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGJzLCAyMCk7IC8qIGFkaWZfYnVmZmVyX2Z1bGxuZXNzICovCiAgIH0KIAogICAvKiBQYXJzZSBhbGwgUENFcyBidXQga2VlcCBvbmx5IG9uZSAqLwotICBmb3IgKGk9MDsgaSA8IHBBZGlmSGVhZGVyLT5OdW1Qcm9ncmFtQ29uZmlnRWxlbWVudHM7IGkrKykKLSAgeworICBmb3IgKGkgPSAwOyBpIDwgcEFkaWZIZWFkZXItPk51bVByb2dyYW1Db25maWdFbGVtZW50czsgaSsrKSB7CiAgICAgQ1Byb2dyYW1Db25maWdfUmVhZChwUGNlLCBicywgc3RhcnRBbmNob3IpOwogICB9CiAKQEAgLTE1MCw2ICsxNTYsMyBAQAogCiAgIHJldHVybiAoRXJyb3JTdGF0dXMpOwogfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hZGlmLmggYi9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FkaWYuaAppbmRleCBkNjc4MGE3Li43MmNjYzZhIDEwMDY0NAotLS0gYS9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FkaWYuaAorKysgYi9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FkaWYuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyNCArOTAsMjQgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKwogICAgRGVzY3JpcHRpb246IEFESUYgcmVhZGVyCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgVFBERUNfQURJRl9ICiAjZGVmaW5lIFRQREVDX0FESUZfSAogCiAjaW5jbHVkZSAidHBkZWNfbGliLmgiCiAKLSNkZWZpbmUgTUlOX0FESUZfSEVBREVSTEVOR1RIICA2MyAgLyogaW4gYml0cyAqLworI2RlZmluZSBNSU5fQURJRl9IRUFERVJMRU5HVEggNjMgLyogaW4gYml0cyAqLwogCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICBJTlQgTnVtUHJvZ3JhbUNvbmZpZ0VsZW1lbnRzOwogICBVSU5UIEJpdFJhdGU7CiAgIFVDSEFSIENvcHlyaWdodElkUHJlc2VudDsKQEAgLTEwNiwxOCArMTE3LDE4IEBACiB9IENBZGlmSGVhZGVyOwogCiAvKioKLSAqIFxicmllZiBQYXJzZSBhIEFESUYgaGVhZGVyIGF0IHRoZSBnaXZlbiBiaXRzdHJlYW0gYW5kIHN0b3JlIHRoZSBwYXJzZWQgZGF0YSBpbnRvIGEgZ2l2ZW4gQ0FkaWZIZWFkZXIKLSAqICAgICAgICBhbmQgQ1Byb2dyYW1Db25maWcgc3RydWN0CisgKiBcYnJpZWYgUGFyc2UgYSBBRElGIGhlYWRlciBhdCB0aGUgZ2l2ZW4gYml0c3RyZWFtIGFuZCBzdG9yZSB0aGUgcGFyc2VkIGRhdGEKKyAqIGludG8gYSBnaXZlbiBDQWRpZkhlYWRlciBhbmQgQ1Byb2dyYW1Db25maWcgc3RydWN0CiAgKgotICogXHBhcmFtIHBBZGlmSGVhZGVyIHBvaW50ZXIgdG8gYSBDQWRpZkhlYWRlciBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgcGFyc2VkIEFESUYgaGVhZGVyIGRhdGEuCi0gKiBccGFyYW0gcFBjZSBwb2ludGVyIHRvIGEgQ1Byb2dyYW1Db25maWcgc3RydWN0dXJlIHdoZXJlIHRoZSBsYXN0IFBDRSB3aWxsIHJlbWFpbi4KKyAqIFxwYXJhbSBwQWRpZkhlYWRlciBwb2ludGVyIHRvIGEgQ0FkaWZIZWFkZXIgc3RydWN0dXJlIHRvIGhvbGQgdGhlIHBhcnNlZCBBRElGCisgKiBoZWFkZXIgZGF0YS4KKyAqIFxwYXJhbSBwUGNlIHBvaW50ZXIgdG8gYSBDUHJvZ3JhbUNvbmZpZyBzdHJ1Y3R1cmUgd2hlcmUgdGhlIGxhc3QgUENFIHdpbGwKKyAqIHJlbWFpbi4KICAqCiAgKiBccmV0dXJuIFRSQU5TUE9SVERFQ19FUlJPUiBlcnJvciBjb2RlCiAgKi8KLVRSQU5TUE9SVERFQ19FUlJPUiBhZGlmUmVhZF9EZWNvZGVIZWFkZXIoCi0gICAgICAgIENBZGlmSGVhZGVyICAgICAgICAgKnBBZGlmSGVhZGVyLAotICAgICAgICBDUHJvZ3JhbUNvbmZpZyAgICAgICpwUGNlLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicwotICAgICAgICApOworVFJBTlNQT1JUREVDX0VSUk9SIGFkaWZSZWFkX0RlY29kZUhlYWRlcihDQWRpZkhlYWRlciAqcEFkaWZIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQcm9ncmFtQ29uZmlnICpwUGNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicyk7CiAKICNlbmRpZiAvKiBUUERFQ19BRElGX0ggKi8KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfYWR0cy5jcHAgYi9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FkdHMuY3BwCmluZGV4IGM0NTU2ODEuLjZkYzAyNzUgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfYWR0cy5jcHAKKysrIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hZHRzLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw5NiArOTAsODMgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKwogICAgRGVzY3JpcHRpb246IEFEVFMgaW50ZXJmYWNlCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJ0cGRlY19hZHRzLmgiCiAKLQogI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKIAotCi0KLXZvaWQgYWR0c1JlYWRfQ3JjSW5pdChIQU5ETEVfQURUUyBwQWR0cykgLyohPCBwb2ludGVyIHRvIGFkdHMgY3JjIGluZm8gc3R1Y3R1cmUgKi8KK3ZvaWQgYWR0c1JlYWRfQ3JjSW5pdCgKKyAgICBIQU5ETEVfQURUUyBwQWR0cykgLyohPCBwb2ludGVyIHRvIGFkdHMgY3JjIGluZm8gc3R1Y3R1cmUgKi8KIHsKICAgRkRLY3JjSW5pdCgmcEFkdHMtPmNyY0luZm8sIDB4ODAwNSwgMHhGRkZGLCAxNik7CiB9CiAKIGludCBhZHRzUmVhZF9DcmNTdGFydFJlZygKLSAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9BRFRTIHBBZHRzLCAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gYWR0cyBzdHVjdHVyZSAqLwotICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCAgIC8qITwgaGFuZGxlIHRvIGN1cnJlbnQgYml0IGJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgIGludCBtQml0cyAgICAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBiaXRzIGluIGNyYyByZWdpb24gKi8KLSAgICAgICAgICAgICAgICAgICApCi17CisgICAgSEFORExFX0FEVFMgcEFkdHMsICAgICAgICAvKiE8IHBvaW50ZXIgdG8gYWR0cyBzdHVjdHVyZSAqLworICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgLyohPCBoYW5kbGUgdG8gY3VycmVudCBiaXQgYnVmZmVyIHN0cnVjdHVyZSAqLworICAgIGludCBtQml0cyAgICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgYml0cyBpbiBjcmMgcmVnaW9uICovCispIHsKICAgaWYgKHBBZHRzLT5icy5wcm90ZWN0aW9uX2Fic2VudCkgewogICAgIHJldHVybiAwOwogICB9CiAKLSAgcmV0dXJuICggRkRLY3JjU3RhcnRSZWcoJnBBZHRzLT5jcmNJbmZvLCBoQnMsIG1CaXRzKSApOwotCisgIHJldHVybiAoRkRLY3JjU3RhcnRSZWcoJnBBZHRzLT5jcmNJbmZvLCBoQnMsIG1CaXRzKSk7CiB9CiAKIHZvaWQgYWR0c1JlYWRfQ3JjRW5kUmVnKAotICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQURUUyBwQWR0cywgLyohPCBwb2ludGVyIHRvIGFkdHMgY3JjIGluZm8gc3R1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCAgIC8qITwgaGFuZGxlIHRvIGN1cnJlbnQgYml0IGJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgaW50IHJlZyAgICAgICAgICAgICAgICAgICAgLyohPCBjcmMgcmVnaW9uICovCi0gICAgICAgICAgICAgICAgICApCi17Ci0gIGlmIChwQWR0cy0+YnMucHJvdGVjdGlvbl9hYnNlbnQgPT0gMCkKLSAgeworICAgIEhBTkRMRV9BRFRTIHBBZHRzLCAgICAgICAgLyohPCBwb2ludGVyIHRvIGFkdHMgY3JjIGluZm8gc3R1Y3R1cmUgKi8KKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIC8qITwgaGFuZGxlIHRvIGN1cnJlbnQgYml0IGJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKyAgICBpbnQgcmVnICAgICAgICAgICAgICAgICAgIC8qITwgY3JjIHJlZ2lvbiAqLworKSB7CisgIGlmIChwQWR0cy0+YnMucHJvdGVjdGlvbl9hYnNlbnQgPT0gMCkgewogICAgIEZES2NyY0VuZFJlZygmcEFkdHMtPmNyY0luZm8sIGhCcywgcmVnKTsKICAgfQogfQogCi1UUkFOU1BPUlRERUNfRVJST1IgYWR0c1JlYWRfQ3JjQ2hlY2soIEhBTkRMRV9BRFRTIHBBZHRzICkKLXsKK1RSQU5TUE9SVERFQ19FUlJPUiBhZHRzUmVhZF9DcmNDaGVjayhIQU5ETEVfQURUUyBwQWR0cykgewogICBUUkFOU1BPUlRERUNfRVJST1IgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfT0s7CiAgIFVTSE9SVCBjcmM7CiAKLSAgaWYgKHBBZHRzLT5icy5wcm90ZWN0aW9uX2Fic2VudCkKLSAgICByZXR1cm4gVFJBTlNQT1JUREVDX09LOworICBpZiAocEFkdHMtPmJzLnByb3RlY3Rpb25fYWJzZW50KSByZXR1cm4gVFJBTlNQT1JUREVDX09LOwogCiAgIGNyYyA9IEZES2NyY0dldENSQygmcEFkdHMtPmNyY0luZm8pOwotICBpZiAoY3JjICE9IHBBZHRzLT5jcmNSZWFkVmFsdWUpCi0gIHsKKyAgaWYgKGNyYyAhPSBwQWR0cy0+Y3JjUmVhZFZhbHVlKSB7CiAgICAgcmV0dXJuIChUUkFOU1BPUlRERUNfQ1JDX0VSUk9SKTsKICAgfQogCiAgIHJldHVybiAoRXJyb3JTdGF0dXMpOwogfQogCisjZGVmaW5lIEFkdHNfTGVuZ3RoX1N5bmNXb3JkIDEyCisjZGVmaW5lIEFkdHNfTGVuZ3RoX0lkIDEKKyNkZWZpbmUgQWR0c19MZW5ndGhfTGF5ZXIgMgorI2RlZmluZSBBZHRzX0xlbmd0aF9Qcm90ZWN0aW9uQWJzZW50IDEKKyNkZWZpbmUgQWR0c19MZW5ndGhfUHJvZmlsZSAyCisjZGVmaW5lIEFkdHNfTGVuZ3RoX1NhbXBsaW5nRnJlcXVlbmN5SW5kZXggNAorI2RlZmluZSBBZHRzX0xlbmd0aF9Qcml2YXRlQml0IDEKKyNkZWZpbmUgQWR0c19MZW5ndGhfQ2hhbm5lbENvbmZpZ3VyYXRpb24gMworI2RlZmluZSBBZHRzX0xlbmd0aF9PcmlnaW5hbENvcHkgMQorI2RlZmluZSBBZHRzX0xlbmd0aF9Ib21lIDEKKyNkZWZpbmUgQWR0c19MZW5ndGhfQ29weXJpZ2h0SWRlbnRpZmljYXRpb25CaXQgMQorI2RlZmluZSBBZHRzX0xlbmd0aF9Db3B5cmlnaHRJZGVudGlmaWNhdGlvblN0YXJ0IDEKKyNkZWZpbmUgQWR0c19MZW5ndGhfRnJhbWVMZW5ndGggMTMKKyNkZWZpbmUgQWR0c19MZW5ndGhfQnVmZmVyRnVsbG5lc3MgMTEKKyNkZWZpbmUgQWR0c19MZW5ndGhfTnVtYmVyT2ZSYXdEYXRhQmxvY2tzSW5GcmFtZSAyCisjZGVmaW5lIEFkdHNfTGVuZ3RoX0NyY0NoZWNrIDE2CiAKLQotI2RlZmluZSBBZHRzX0xlbmd0aF9TeW5jV29yZCAgICAgICAgICAgICAgICAgICAgIDEyCi0jZGVmaW5lIEFkdHNfTGVuZ3RoX0lkICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQWR0c19MZW5ndGhfTGF5ZXIgICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBBZHRzX0xlbmd0aF9Qcm90ZWN0aW9uQWJzZW50ICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFkdHNfTGVuZ3RoX1Byb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgQWR0c19MZW5ndGhfU2FtcGxpbmdGcmVxdWVuY3lJbmRleCAgICAgICAgNAotI2RlZmluZSBBZHRzX0xlbmd0aF9Qcml2YXRlQml0ICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFkdHNfTGVuZ3RoX0NoYW5uZWxDb25maWd1cmF0aW9uICAgICAgICAgIDMKLSNkZWZpbmUgQWR0c19MZW5ndGhfT3JpZ2luYWxDb3B5ICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBBZHRzX0xlbmd0aF9Ib21lICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFkdHNfTGVuZ3RoX0NvcHlyaWdodElkZW50aWZpY2F0aW9uQml0ICAgIDEKLSNkZWZpbmUgQWR0c19MZW5ndGhfQ29weXJpZ2h0SWRlbnRpZmljYXRpb25TdGFydCAgMQotI2RlZmluZSBBZHRzX0xlbmd0aF9GcmFtZUxlbmd0aCAgICAgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIEFkdHNfTGVuZ3RoX0J1ZmZlckZ1bGxuZXNzICAgICAgICAgICAgICAgMTEKLSNkZWZpbmUgQWR0c19MZW5ndGhfTnVtYmVyT2ZSYXdEYXRhQmxvY2tzSW5GcmFtZSAgMgotI2RlZmluZSBBZHRzX0xlbmd0aF9DcmNDaGVjayAgICAgICAgICAgICAgICAgICAgIDE2Ci0KLVRSQU5TUE9SVERFQ19FUlJPUiBhZHRzUmVhZF9EZWNvZGVIZWFkZXIoCi0gICAgICAgIEhBTkRMRV9BRFRTICAgICAgICAgICBwQWR0cywKLSAgICAgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJzLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgaWdub3JlQnVmZmVyRnVsbG5lc3MKLSAgICAgICAgKQoteworVFJBTlNQT1JUREVDX0VSUk9SIGFkdHNSZWFkX0RlY29kZUhlYWRlcihIQU5ETEVfQURUUyBwQWR0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpZ25vcmVCdWZmZXJGdWxsbmVzcykgewogICBJTlQgY3JjUmVnOwogCiAgIElOVCB2YWxCaXRzOwpAQCAtMTc3LDU4ICsxNzUsNTggQEAKIAogICBTVFJVQ1RfQURUU19CUyBiczsKIAotI2lmZGVmIFRQX1BDRV9FTkFCTEUKICAgQ1Byb2dyYW1Db25maWcgb2xkUGNlOwogICAvKiBTdG9yZSB0aGUgb2xkIFBDRSB0ZW1wb3JhcmlseS4gTWF5YmUgd2UnbGwgbmVlZCBpdCBsYXRlciBpZiB3ZQogICAgICBoYXZlIGNoYW5uZWxDb25maWc9MCBhbmQgbm8gUENFIGluIHRoaXMgZnJhbWUuICovCiAgIEZES21lbWNweSgmb2xkUGNlLCAmcEFzYy0+bV9wcm9nckNvbmZpZ0VsZW1lbnQsIHNpemVvZihDUHJvZ3JhbUNvbmZpZykpOwotI2VuZGlmCiAKICAgdmFsQml0cyA9IEZES2dldFZhbGlkQml0cyhoQnMpOwogCiAgIC8qIGFkdHNfZml4ZWRfaGVhZGVyICovCi0gIGJzLm1wZWdfaWQgICAgICAgICAgID0gRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9JZCk7Ci0gIGJzLmxheWVyICAgICAgICAgICAgID0gRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9MYXllcik7CisgIGJzLm1wZWdfaWQgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX0lkKTsKKyAgYnMubGF5ZXIgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX0xheWVyKTsKICAgYnMucHJvdGVjdGlvbl9hYnNlbnQgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX1Byb3RlY3Rpb25BYnNlbnQpOwotICBicy5wcm9maWxlICAgICAgICAgICA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfUHJvZmlsZSk7CisgIGJzLnByb2ZpbGUgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX1Byb2ZpbGUpOwogICBicy5zYW1wbGVfZnJlcV9pbmRleCA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfU2FtcGxpbmdGcmVxdWVuY3lJbmRleCk7Ci0gIGJzLnByaXZhdGVfYml0ICAgICAgID0gRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9Qcml2YXRlQml0KTsKLSAgYnMuY2hhbm5lbF9jb25maWcgICAgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX0NoYW5uZWxDb25maWd1cmF0aW9uKTsKLSAgYnMub3JpZ2luYWwgICAgICAgICAgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX09yaWdpbmFsQ29weSk7Ci0gIGJzLmhvbWUgICAgICAgICAgICAgID0gRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9Ib21lKTsKKyAgYnMucHJpdmF0ZV9iaXQgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX1ByaXZhdGVCaXQpOworICBicy5jaGFubmVsX2NvbmZpZyA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfQ2hhbm5lbENvbmZpZ3VyYXRpb24pOworICBicy5vcmlnaW5hbCA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfT3JpZ2luYWxDb3B5KTsKKyAgYnMuaG9tZSA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfSG9tZSk7CiAKICAgLyogYWR0c192YXJpYWJsZV9oZWFkZXIgKi8KLSAgYnMuY29weXJpZ2h0X2lkICAgID0gRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9Db3B5cmlnaHRJZGVudGlmaWNhdGlvbkJpdCk7Ci0gIGJzLmNvcHlyaWdodF9zdGFydCA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfQ29weXJpZ2h0SWRlbnRpZmljYXRpb25TdGFydCk7Ci0gIGJzLmZyYW1lX2xlbmd0aCAgICA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfRnJhbWVMZW5ndGgpOwotICBicy5hZHRzX2Z1bGxuZXNzICAgPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX0J1ZmZlckZ1bGxuZXNzKTsKLSAgYnMubnVtX3Jhd19ibG9ja3MgID0gRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9OdW1iZXJPZlJhd0RhdGFCbG9ja3NJbkZyYW1lKTsKLSAgYnMubnVtX3BjZV9iaXRzICAgID0gMDsKKyAgYnMuY29weXJpZ2h0X2lkID0gRkRLcmVhZEJpdHMoaEJzLCBBZHRzX0xlbmd0aF9Db3B5cmlnaHRJZGVudGlmaWNhdGlvbkJpdCk7CisgIGJzLmNvcHlyaWdodF9zdGFydCA9CisgICAgICBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX0NvcHlyaWdodElkZW50aWZpY2F0aW9uU3RhcnQpOworICBicy5mcmFtZV9sZW5ndGggPSBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX0ZyYW1lTGVuZ3RoKTsKKyAgYnMuYWR0c19mdWxsbmVzcyA9IEZES3JlYWRCaXRzKGhCcywgQWR0c19MZW5ndGhfQnVmZmVyRnVsbG5lc3MpOworICBicy5udW1fcmF3X2Jsb2NrcyA9CisgICAgICBGREtyZWFkQml0cyhoQnMsIEFkdHNfTGVuZ3RoX051bWJlck9mUmF3RGF0YUJsb2Nrc0luRnJhbWUpOworICBicy5udW1fcGNlX2JpdHMgPSAwOwogCiAgIGFkdHNIZWFkZXJMZW5ndGggPSBBRFRTX0hFQURFUkxFTkdUSDsKIAogICBpZiAoIWJzLnByb3RlY3Rpb25fYWJzZW50KSB7CiAgICAgRkRLY3JjUmVzZXQoJnBBZHRzLT5jcmNJbmZvKTsKLSAgICBGREtwdXNoQmFjayhoQnMsIDU2KTsgICAvKiBjb21wbGV0ZSBmaXhlZCBhbmQgdmFyaWFibGUgaGVhZGVyISAqLworICAgIEZES3B1c2hCYWNrKGhCcywgNTYpOyAvKiBjb21wbGV0ZSBmaXhlZCBhbmQgdmFyaWFibGUgaGVhZGVyISAqLwogICAgIGNyY1JlZyA9IEZES2NyY1N0YXJ0UmVnKCZwQWR0cy0+Y3JjSW5mbywgaEJzLCAwKTsKICAgICBGREtwdXNoRm9yKGhCcywgNTYpOwogICB9CiAKLSAgaWYgKCEgYnMucHJvdGVjdGlvbl9hYnNlbnQgJiYgYnMubnVtX3Jhd19ibG9ja3M+MCkgewotICAgIGZvciAoaT0wOyBpPGJzLm51bV9yYXdfYmxvY2tzOyBpKyspIHsKKyAgaWYgKCFicy5wcm90ZWN0aW9uX2Fic2VudCAmJiBicy5udW1fcmF3X2Jsb2NrcyA+IDApIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnMubnVtX3Jhd19ibG9ja3M7IGkrKykgewogICAgICAgcEFkdHMtPnJhd0RhdGFCbG9ja0Rpc3RbaV0gPSAoVVNIT1JUKUZES3JlYWRCaXRzKGhCcywgMTYpOwogICAgICAgYWR0c0hlYWRlckxlbmd0aCArPSAxNjsKICAgICB9CiAgICAgLyogQ2hhbmdlIHJhdyBkYXRhIGJsb2NrcyB0byBkZWx0YSB2YWx1ZXMgKi8KLSAgICBwQWR0cy0+cmF3RGF0YUJsb2NrRGlzdFticy5udW1fcmF3X2Jsb2Nrc10gPSBicy5mcmFtZV9sZW5ndGggLSA3IC0gYnMubnVtX3Jhd19ibG9ja3MqMiAtIDIgOwotICAgIGZvciAoaT1icy5udW1fcmF3X2Jsb2NrczsgaT4wOyBpLS0pIHsKLSAgICAgIHBBZHRzLT5yYXdEYXRhQmxvY2tEaXN0W2ldIC09IHBBZHRzLT5yYXdEYXRhQmxvY2tEaXN0W2ktMV07CisgICAgcEFkdHMtPnJhd0RhdGFCbG9ja0Rpc3RbYnMubnVtX3Jhd19ibG9ja3NdID0KKyAgICAgICAgYnMuZnJhbWVfbGVuZ3RoIC0gNyAtIGJzLm51bV9yYXdfYmxvY2tzICogMiAtIDI7CisgICAgZm9yIChpID0gYnMubnVtX3Jhd19ibG9ja3M7IGkgPiAwOyBpLS0pIHsKKyAgICAgIHBBZHRzLT5yYXdEYXRhQmxvY2tEaXN0W2ldIC09IHBBZHRzLT5yYXdEYXRhQmxvY2tEaXN0W2kgLSAxXTsKICAgICB9CiAgIH0KIAogICAvKiBhZHRzX2Vycm9yX2NoZWNrICovCi0gIGlmICghYnMucHJvdGVjdGlvbl9hYnNlbnQpCi0gIHsKKyAgaWYgKCFicy5wcm90ZWN0aW9uX2Fic2VudCkgewogICAgIFVTSE9SVCBjcmNfY2hlY2s7CiAKICAgICBGREtjcmNFbmRSZWcoJnBBZHRzLT5jcmNJbmZvLCBoQnMsIGNyY1JlZyk7CkBAIC0yNDYsNzUgKzI0NCw2MyBAQAogICAgIH0KICAgfQogCi0KICAgLyogY2hlY2sgaWYgdmFsaWQgaGVhZGVyICovCi0gIGlmICgKLSAgICAgIChicy5sYXllciAhPSAwKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBzdXBwb3J0IE1QRUcgQURUUwotICAgICAgKGJzLnNhbXBsZV9mcmVxX2luZGV4ID49IDEzKSAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IHN1cHBvcnQgOTZrSHogLSA3MzUwa0h6Ci0gICAgICApIHsKLSAgICBGREtwdXNoRm9yKGhCcywgYnMuZnJhbWVfbGVuZ3RoICogOCk7ICAgLy8gdHJ5IGFnYWluIG9uZSBmcmFtZSBsYXRlcgorICBpZiAoKGJzLmxheWVyICE9IDApIHx8ICAgICAgICAgICAgLy8gd2Ugb25seSBzdXBwb3J0IE1QRUcgQURUUworICAgICAgKGJzLnNhbXBsZV9mcmVxX2luZGV4ID49IDEzKSAgLy8gd2Ugb25seSBzdXBwb3J0IDk2a0h6IC0gNzM1MGtIegorICApIHsKKyAgICBGREtwdXNoRm9yKGhCcywgYnMuZnJhbWVfbGVuZ3RoICogOCk7ICAvLyB0cnkgYWdhaW4gb25lIGZyYW1lIGxhdGVyCiAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CiAgIH0KIAogICAvKiBzcGVjaWFsIHRyZWF0bWVudCBvZiBpZC1iaXQgKi8KLSAgaWYgKCAoYnMubXBlZ19pZCA9PSAwKSAmJiAocEFkdHMtPmRlY29kZXJDYW5Eb01wZWc0ID09IDApICkKLSAgeworICBpZiAoKGJzLm1wZWdfaWQgPT0gMCkgJiYgKHBBZHRzLT5kZWNvZGVyQ2FuRG9NcGVnNCA9PSAwKSkgewogICAgIC8qIE1QRUctMiBkZWNvZGVyIGNhbm5vdCBwbGF5IE1QRUctNCBiaXRzdHJlYW1zICovCiAKLQogICAgIEZES3B1c2hGb3IoaEJzLCBicy5mcmFtZV9sZW5ndGggKiA4KTsgIC8vIHRyeSBhZ2FpbiBvbmUgZnJhbWUgbGF0ZXIKICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKICAgfQogCi0gIGlmICghaWdub3JlQnVmZmVyRnVsbG5lc3MpCi0gIHsKLSAgICBjbXBfYnVmZmVyX2Z1bGxuZXNzID0gYnMuZnJhbWVfbGVuZ3RoKjggKyBicy5hZHRzX2Z1bGxuZXNzKjMyKmdldE51bWJlck9mRWZmZWN0aXZlQ2hhbm5lbHMoYnMuY2hhbm5lbF9jb25maWcpOwotCisgIGlmICghaWdub3JlQnVmZmVyRnVsbG5lc3MpIHsKKyAgICBjbXBfYnVmZmVyX2Z1bGxuZXNzID0KKyAgICAgICAgYnMuZnJhbWVfbGVuZ3RoICogOCArCisgICAgICAgIGJzLmFkdHNfZnVsbG5lc3MgKiAzMiAqIGdldE51bWJlck9mRWZmZWN0aXZlQ2hhbm5lbHMoYnMuY2hhbm5lbF9jb25maWcpOwogCiAgICAgLyogRXZhbHVhdGUgYnVmZmVyIGZ1bGxuZXNzICovCi0gICAgaWYgKGJzLmFkdHNfZnVsbG5lc3MgIT0gMHg3RkYpCi0gICAgewotICAgICAgaWYgKHBBZHRzLT5CdWZmZXJGdWxsbmVzU3RhcnRGbGFnKQotICAgICAgewotICAgICAgICBpZiAoIHZhbEJpdHMgPCBjbXBfYnVmZmVyX2Z1bGxuZXNzICkKLSAgICAgICAgeworICAgIGlmIChicy5hZHRzX2Z1bGxuZXNzICE9IDB4N0ZGKSB7CisgICAgICBpZiAocEFkdHMtPkJ1ZmZlckZ1bGxuZXNTdGFydEZsYWcpIHsKKyAgICAgICAgaWYgKHZhbEJpdHMgPCBjbXBfYnVmZmVyX2Z1bGxuZXNzKSB7CiAgICAgICAgICAgLyogQ29uZGl0aW9uIGZvciBzdGFydCBvZiBkZWNvZGluZyBpcyBub3QgZnVsZmlsbGVkICovCiAKICAgICAgICAgICAvKiBUaGUgY3VycmVudCBmcmFtZSB3aWxsIG5vdCBiZSBkZWNvZGVkICovCiAgICAgICAgICAgRkRLcHVzaEJhY2soaEJzLCBhZHRzSGVhZGVyTGVuZ3RoKTsKIAotICAgICAgICAgIGlmICggKGNtcF9idWZmZXJfZnVsbG5lc3MrYWR0c0hlYWRlckxlbmd0aCkgPiAoKFRSQU5TUE9SVERFQ19JTkJVRl9TSVpFPDwzKS03KSApIHsKKyAgICAgICAgICBpZiAoKGNtcF9idWZmZXJfZnVsbG5lc3MgKyBhZHRzSGVhZGVyTGVuZ3RoKSA+CisgICAgICAgICAgICAgICgoKDgxOTIgKiA0KSA8PCAzKSAtIDcpKSB7CiAgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1NZTkNfRVJST1I7CiAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTOwogICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBwQWR0cy0+QnVmZmVyRnVsbG5lc1N0YXJ0RmxhZyA9IDA7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KIAotCiAgIC8qIEdldCBpbmZvIGZyb20gQURUUyBoZWFkZXIgKi8KICAgQXVkaW9TcGVjaWZpY0NvbmZpZ19Jbml0KHBBc2MpOwotICBwQXNjLT5tX2FvdCAgICAgICAgICAgICAgICAgICAgPSAoQVVESU9fT0JKRUNUX1RZUEUpKGJzLnByb2ZpbGUgKyAxKTsKKyAgcEFzYy0+bV9hb3QgPSAoQVVESU9fT0JKRUNUX1RZUEUpKGJzLnByb2ZpbGUgKyAxKTsKICAgcEFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ID0gYnMuc2FtcGxlX2ZyZXFfaW5kZXg7Ci0gIHBBc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3kgICAgICA9IFNhbXBsaW5nUmF0ZVRhYmxlW2JzLnNhbXBsZV9mcmVxX2luZGV4XTsKLSAgcEFzYy0+bV9jaGFubmVsQ29uZmlndXJhdGlvbiAgID0gYnMuY2hhbm5lbF9jb25maWc7Ci0gIHBBc2MtPm1fc2FtcGxlc1BlckZyYW1lICAgICAgICA9IDEwMjQ7CisgIHBBc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSBTYW1wbGluZ1JhdGVUYWJsZVticy5zYW1wbGVfZnJlcV9pbmRleF07CisgIHBBc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gPSBicy5jaGFubmVsX2NvbmZpZzsKKyAgcEFzYy0+bV9zYW1wbGVzUGVyRnJhbWUgPSAxMDI0OwogCi0jaWZkZWYgVFBfUENFX0VOQUJMRQotICBpZiAoYnMuY2hhbm5lbF9jb25maWcgPT0gMCkKLSAgeworICBpZiAoYnMuY2hhbm5lbF9jb25maWcgPT0gMCkgewogICAgIGludCBwY2VCaXRzID0gMDsKICAgICBVSU5UIGFsaWduQW5jaG9yID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7Ci0gICAgCi0gICAgaWYgKEZES3JlYWRCaXRzKGhCcywzKSA9PSBJRF9QQ0UpIHsKKworICAgIGlmIChGREtyZWFkQml0cyhoQnMsIDMpID09IElEX1BDRSkgewogICAgICAgLyogR290IGx1Y2shIFBhcnNlIHRoZSBQQ0UgKi8KLSAgICAgIGludCBjcmNSZWc7CiAgICAgICBjcmNSZWcgPSBhZHRzUmVhZF9DcmNTdGFydFJlZyhwQWR0cywgaEJzLCAwKTsKIAogICAgICAgQ1Byb2dyYW1Db25maWdfUmVhZCgmcEFzYy0+bV9wcm9nckNvbmZpZ0VsZW1lbnQsIGhCcywgYWxpZ25BbmNob3IpOwpAQCAtMzIzLDI1ICszMDksMjYgQEAKICAgICAgIHBjZUJpdHMgPSBhbGlnbkFuY2hvciAtIEZES2dldFZhbGlkQml0cyhoQnMpOwogICAgICAgLyogc3RvcmUgdGhlIG51bWJlciBvZiBQQ0UgYml0cyAqLwogICAgICAgYnMubnVtX3BjZV9iaXRzID0gcGNlQml0czsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIC8qIE5vIFBDRSBpbiB0aGlzIGZyYW1lISBQdXNoIGJhY2sgdGhlIElEIHRhZyBiaXRzLiAqLwotICAgICAgRkRLcHVzaEJhY2soaEJzLDMpOworICAgICAgRkRLcHVzaEJhY2soaEJzLCAzKTsKIAogICAgICAgLyogRW5jb2RlcnMgZG8gbm90IGhhdmUgdG8gd3JpdGUgYSBQQ0UgaW4gZWFjaCBmcmFtZS4KICAgICAgICAgIFNvIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHZhbGlkIFBDRSB3ZSBoYXZlIHRvIHVzZSBpdC4gKi8KLSAgICAgIGlmICggIG9sZFBjZS5pc1ZhbGlkCi0gICAgICAgICYmIChicy5zYW1wbGVfZnJlcV9pbmRleCA9PSBwQWR0cy0+YnMuc2FtcGxlX2ZyZXFfaW5kZXgpICAvKiB3ZSBjb3VsZCBjb21wYXJlIHRoZSBjb21wbGV0ZSBmaXhlZCBoZWFkZXIgKGJ5dGVzKSBoZXJlISAqLwotICAgICAgICAmJiAoYnMuY2hhbm5lbF9jb25maWcgICAgPT0gcEFkdHMtPmJzLmNoYW5uZWxfY29uZmlnKSAvKiA9PSAwICovCi0gICAgICAgICYmIChicy5tcGVnX2lkICAgICAgICAgICA9PSBwQWR0cy0+YnMubXBlZ19pZCkgKQotICAgICAgeyAvKiBSZXN0b3JlIHByZXZpb3VzIFBDRSB3aGljaCBpcyBzdGlsbCB2YWxpZCAqLworICAgICAgaWYgKG9sZFBjZS5pc1ZhbGlkICYmCisgICAgICAgICAgKGJzLnNhbXBsZV9mcmVxX2luZGV4ID09CisgICAgICAgICAgIHBBZHRzLT5icy5zYW1wbGVfZnJlcV9pbmRleCkgLyogd2UgY291bGQgY29tcGFyZSB0aGUgY29tcGxldGUgZml4ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgKGJ5dGVzKSBoZXJlISAqLworICAgICAgICAgICYmIChicy5jaGFubmVsX2NvbmZpZyA9PSBwQWR0cy0+YnMuY2hhbm5lbF9jb25maWcpIC8qID09IDAgKi8KKyAgICAgICAgICAmJgorICAgICAgICAgIChicy5tcGVnX2lkID09CisgICAgICAgICAgIHBBZHRzLT5icy5tcGVnX2lkKSkgeyAvKiBSZXN0b3JlIHByZXZpb3VzIFBDRSB3aGljaCBpcyBzdGlsbCB2YWxpZCAqLwogICAgICAgICBGREttZW1jcHkoJnBBc2MtPm1fcHJvZ3JDb25maWdFbGVtZW50LCAmb2xkUGNlLCBzaXplb2YoQ1Byb2dyYW1Db25maWcpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGJzLm1wZWdfaWQgPT0gMCkgeworICAgICAgfSBlbHNlIGlmIChicy5tcGVnX2lkID09IDApIHsKICAgICAgICAgLyogSWYgbm90IGl0IHNlZW1zIHRoYXQgd2UgaGF2ZSBhIGltcGxpY2l0IGNoYW5uZWwgY29uZmlndXJhdGlvbi4KICAgICAgICAgICAgVGhpcyBtb2RlIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBjb250ZXh0IG9mIElTTy9JRUMgMTQ0OTYtMy4KICAgICAgICAgICAgU2tpcCB0aGlzIGZyYW1lIGFuZCB0cnkgdGhlIG5leHQgb25lLiAqLwotICAgICAgICBGREtwdXNoRm9yKGhCcywgKGJzLmZyYW1lX2xlbmd0aDw8MykgLSBhZHRzSGVhZGVyTGVuZ3RoIC0gMyk7CisgICAgICAgIEZES3B1c2hGb3IoaEJzLCAoYnMuZnJhbWVfbGVuZ3RoIDw8IDMpIC0gYWR0c0hlYWRlckxlbmd0aCAtIDMpOwogICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKICAgICAgIH0KICAgICAgIC8qIGVsc2UgewpAQCAtMzUwLDMzICszMzcsMzIgQEAKICAgICAgIH0gKi8KICAgICB9CiAgIH0KLSNlbmRpZiAvKiBUUF9QQ0VfRU5BQkxFICovCiAKLSAgLyogQ29weSBiaXQgc3RyZWFtIGRhdGEgc3RydWN0IHRvIHBlcnNpc3RlbnQgbWVtb3J5IG5vdywgb25jZSB3ZSBwYXNzZWQgYWxsIHNhbml0eSBjaGVja3MgYWJvdmUuICovCisgIC8qIENvcHkgYml0IHN0cmVhbSBkYXRhIHN0cnVjdCB0byBwZXJzaXN0ZW50IG1lbW9yeSBub3csIG9uY2Ugd2UgcGFzc2VkIGFsbAorICAgKiBzYW5pdHkgY2hlY2tzIGFib3ZlLiAqLwogICBGREttZW1jcHkoJnBBZHRzLT5icywgJmJzLCBzaXplb2YoU1RSVUNUX0FEVFNfQlMpKTsKIAogICByZXR1cm4gVFJBTlNQT1JUREVDX09LOwogfQogCi1pbnQgYWR0c1JlYWRfR2V0UmF3RGF0YUJsb2NrTGVuZ3RoKAotICAgICAgICBIQU5ETEVfQURUUyBwQWR0cywKLSAgICAgICAgSU5UICAgICAgICAgYmxvY2tOdW0KLSAgICAgICAgKQoteworaW50IGFkdHNSZWFkX0dldFJhd0RhdGFCbG9ja0xlbmd0aChIQU5ETEVfQURUUyBwQWR0cywgSU5UIGJsb2NrTnVtKSB7CiAgIGludCBsZW5ndGg7CiAKICAgaWYgKHBBZHRzLT5icy5udW1fcmF3X2Jsb2NrcyA9PSAwKSB7Ci0gICAgbGVuZ3RoID0gKHBBZHRzLT5icy5mcmFtZV9sZW5ndGggLSA3KSA8PCAzOyAgICAvKiBhYWNfZnJhbWVfbGVuZ3RoIHN1YnRyYWN0ZWQgYnkgdGhlIGhlYWRlciBzaXplICg3IGJ5dGVzKS4gKi8KKyAgICBsZW5ndGggPQorICAgICAgICAocEFkdHMtPmJzLmZyYW1lX2xlbmd0aCAtIDcpCisgICAgICAgIDw8IDM7IC8qIGFhY19mcmFtZV9sZW5ndGggc3VidHJhY3RlZCBieSB0aGUgaGVhZGVyIHNpemUgKDcgYnl0ZXMpLiAqLwogICAgIGlmIChwQWR0cy0+YnMucHJvdGVjdGlvbl9hYnNlbnQgPT0gMCkKLSAgICAgIGxlbmd0aCAtPSAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3Vic3RyYWN0IDE2IGJpdCBDUkMgKi8KKyAgICAgIGxlbmd0aCAtPSAxNjsgLyogc3Vic3RyYWN0IDE2IGJpdCBDUkMgKi8KICAgfSBlbHNlIHsKICAgICBpZiAocEFkdHMtPmJzLnByb3RlY3Rpb25fYWJzZW50KSB7CiAgICAgICBsZW5ndGggPSAtMTsgLyogcmF3IGRhdGEgYmxvY2sgbGVuZ3RoIGlzIHVua25vd24gKi8KICAgICB9IGVsc2UgewogICAgICAgaWYgKGJsb2NrTnVtIDwgMCB8fCBibG9ja051bSA+IDMpIHsKICAgICAgICAgbGVuZ3RoID0gLTE7CisgICAgICB9IGVsc2UgeworICAgICAgICBsZW5ndGggPSAocEFkdHMtPnJhd0RhdGFCbG9ja0Rpc3RbYmxvY2tOdW1dIDw8IDMpIC0gMTY7CiAgICAgICB9Ci0gICAgICBsZW5ndGggPSAocEFkdHMtPnJhd0RhdGFCbG9ja0Rpc3RbYmxvY2tOdW1dIDw8IDMpIC0gMTY7CiAgICAgfQogICB9CiAgIGlmIChibG9ja051bSA9PSAwICYmIGxlbmd0aCA+IDApIHsKQEAgLTM4NCw1ICszNzAsMyBAQAogICB9CiAgIHJldHVybiBsZW5ndGg7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hZHRzLmggYi9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FkdHMuaAppbmRleCBhM2I4M2E1Li42OGYzZjYzIDEwMDY0NAotLS0gYS9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FkdHMuaAorKysgYi9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FkdHMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzMSArOTAsMzEgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKwogICAgRGVzY3JpcHRpb246IEFEVFMgaW50ZXJmYWNlCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgVFBERUNfQURUU19ICiAjZGVmaW5lIFRQREVDX0FEVFNfSAogCiAjaW5jbHVkZSAidHBkZWNfbGliLmgiCiAKLQotI2RlZmluZSBBRFRTX1NZTkNXT1JEICAgICAgICAgICAgICAgKCAweGZmZiApCi0jZGVmaW5lIEFEVFNfU1lOQ0xFTkdUSCAgICAgICAgICAgICAoIDEyICkgICAgIC8qIGluIGJpdHMgKi8KLSNkZWZpbmUgQURUU19IRUFERVJMRU5HVEggICAgICAgICAgICggNTYgKSAgICAgLyogbWluaW11bSBoZWFkZXIgc2l6ZSBpbiBiaXRzICovCi0jZGVmaW5lIEFEVFNfRklYRURfSEVBREVSTEVOR1RIICAgICAoIDI4ICkgICAgIC8qIGluIGJpdHMgKi8KLSNkZWZpbmUgQURUU19WQVJJQUJMRV9IRUFERVJMRU5HVEggICggQURUU19IRUFERVJMRU5HVEggLSBBRFRTX0ZJWEVEX0hFQURFUkxFTkdUSCApCisjZGVmaW5lIEFEVFNfU1lOQ1dPUkQgKDB4ZmZmKQorI2RlZmluZSBBRFRTX1NZTkNMRU5HVEggKDEyKSAgICAgICAgIC8qIGluIGJpdHMgKi8KKyNkZWZpbmUgQURUU19IRUFERVJMRU5HVEggKDU2KSAgICAgICAvKiBtaW5pbXVtIGhlYWRlciBzaXplIGluIGJpdHMgKi8KKyNkZWZpbmUgQURUU19GSVhFRF9IRUFERVJMRU5HVEggKDI4KSAvKiBpbiBiaXRzICovCisjZGVmaW5lIEFEVFNfVkFSSUFCTEVfSEVBREVSTEVOR1RIIChBRFRTX0hFQURFUkxFTkdUSCAtIEFEVFNfRklYRURfSEVBREVSTEVOR1RIKQogCiAjaWZkZWYgQ0hFQ0tfVFdPX1NZTkNTCi0gI2RlZmluZSBBRFRTX01JTl9UUF9CVUZfU0laRSAgICAgICAoIDgxOTEgKyAyICkKKyNkZWZpbmUgQURUU19NSU5fVFBfQlVGX1NJWkUgKDgxOTEgKyAyKQogI2Vsc2UKLSAjZGVmaW5lIEFEVFNfTUlOX1RQX0JVRl9TSVpFICAgICAgICggODE5MSApCisjZGVmaW5lIEFEVFNfTUlOX1RQX0JVRl9TSVpFICg4MTkxKQogI2VuZGlmCiAKICNpbmNsdWRlICJGREtfY3JjLmgiCkBAIC0xMjgsMTYgKzEzOSwxNiBAQAogfSBTVFJVQ1RfQURUU19CUzsKIAogc3RydWN0IFNUUlVDVF9BRFRTIHsKLQogICBTVFJVQ1RfQURUU19CUyBiczsKIAogICBVQ0hBUiBkZWNvZGVyQ2FuRG9NcGVnNDsKICAgVUNIQVIgQnVmZmVyRnVsbG5lc1N0YXJ0RmxhZzsKIAotICBGREtfQ1JDSU5GTyBjcmNJbmZvOyAgICAgICAgICAgICAvKiBDUkMgc3RhdGUgaW5mbyAqLwotICBVU0hPUlQgICAgICBjcmNSZWFkVmFsdWU7ICAgICAgICAvKiBDUkMgdmFsdWUgcmVhZCBmcm9tIGJpdHN0cmVhbSBkYXRhICovCi0gIFVTSE9SVCAgICAgIHJhd0RhdGFCbG9ja0Rpc3RbNF07IC8qIGRpc3RhbmNlIGJldHdlZW4gZWFjaCByYXcgZGF0YSBibG9jay4gTm90IHRoZSBzYW1lIGFzIGZvdW5kIGluIHRoZSBiaXRzdHJlYW0gKi8KLX0gOworICBGREtfQ1JDSU5GTyBjcmNJbmZvOyAgICAgICAgLyogQ1JDIHN0YXRlIGluZm8gKi8KKyAgVVNIT1JUIGNyY1JlYWRWYWx1ZTsgICAgICAgIC8qIENSQyB2YWx1ZSByZWFkIGZyb20gYml0c3RyZWFtIGRhdGEgKi8KKyAgVVNIT1JUIHJhd0RhdGFCbG9ja0Rpc3RbNF07IC8qIGRpc3RhbmNlIGJldHdlZW4gZWFjaCByYXcgZGF0YSBibG9jay4gTm90IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtZSBhcyBmb3VuZCBpbiB0aGUgYml0c3RyZWFtICovCit9OwogCiB0eXBlZGVmIHN0cnVjdCBTVFJVQ1RfQURUUyAqSEFORExFX0FEVFM7CiAKQEAgLTE0OCwxNSArMTU5LDE0IEBACiAKICAgXHJldHVybiAgbm9uZQogKi8KLXZvaWQgYWR0c1JlYWRfQ3JjSW5pdCggSEFORExFX0FEVFMgcEFkdHMgKTsKK3ZvaWQgYWR0c1JlYWRfQ3JjSW5pdChIQU5ETEVfQURUUyBwQWR0cyk7CiAKIC8qKgogICogXGJyaWVmIFN0YXJ0cyBDUkMgcmVnaW9uIHdpdGggYSBtYXhpbXVtIG51bWJlciBvZiBiaXRzCi0gKiAgICAgICAgSWYgbUJpdHMgaXMgcG9zaXRpdmUgemVybyBwYWRkaW5nIHdpbGwgYmUgdXNlZCBmb3IgQ1JDIGNhbGN1bGF0aW9uLCBpZiB0aGVyZQotICogICAgICAgIGFyZSBsZXNzIHRoYW4gbUJpdHMgYml0cyBhdmFpbGFibGUuCi0gKiAgICAgICAgSWYgbUJpdHMgaXMgbmVnYXRpdmUgbm8gemVybyBwYWRkaW5nIGlzIGRvbmUuCi0gKiAgICAgICAgSWYgbUJpdHMgaXMgemVybyB0aGUgbWVtb3J5IGZvciB0aGUgYnVmZmVyIGlzIGFsbG9jYXRlZCBkeW5hbWljYWxseSwgdGhlCi0gKiAgICAgICAgbnVtYmVyIG9mIGJpdHMgaXMgbm90IGxpbWl0ZWQuCisgKiAgICAgICAgSWYgbUJpdHMgaXMgcG9zaXRpdmUgemVybyBwYWRkaW5nIHdpbGwgYmUgdXNlZCBmb3IgQ1JDIGNhbGN1bGF0aW9uLCBpZgorICogdGhlcmUgYXJlIGxlc3MgdGhhbiBtQml0cyBiaXRzIGF2YWlsYWJsZS4gSWYgbUJpdHMgaXMgbmVnYXRpdmUgbm8gemVybworICogcGFkZGluZyBpcyBkb25lLiBJZiBtQml0cyBpcyB6ZXJvIHRoZSBtZW1vcnkgZm9yIHRoZSBidWZmZXIgaXMKKyAqIGFsbG9jYXRlZCBkeW5hbWljYWxseSwgdGhlIG51bWJlciBvZiBiaXRzIGlzIG5vdCBsaW1pdGVkLgogICoKICAqIFxwYXJhbSBwQWR0cyBBRFRTIGRhdGEgaGFuZGxlCiAgKiBccGFyYW0gaEJzIGJpdHN0cmVhbSBoYW5kbGUsIG9uIHdoaWNoIHRoZSBDUkMgcmVnaW9uIHJlZmVyZXMgdG8KQEAgLTE2NCwxMSArMTc0LDggQEAKICAqCiAgKiBccmV0dXJuICBJRCBmb3IgdGhlIGNyZWF0ZWQgcmVnaW9uLCAtMSBpbiBjYXNlIG9mIGFuIGVycm9yCiAgKi8KLWludCBhZHRzUmVhZF9DcmNTdGFydFJlZygKLSAgICAgICAgSEFORExFX0FEVFMgcEFkdHMsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgaW50IG1CaXRzCi0gICAgICAgICk7CitpbnQgYWR0c1JlYWRfQ3JjU3RhcnRSZWcoSEFORExFX0FEVFMgcEFkdHMsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbUJpdHMpOwogCiAvKioKICAqIFxicmllZiBFbmRzIENSQyByZWdpb24gaWRlbnRpZmllZCBieSByZWcKQEAgLTE3OSw1OCArMTg2LDQ5IEBACiAgKgogICogXHJldHVybiAgbm9uZQogICovCi12b2lkIGFkdHNSZWFkX0NyY0VuZFJlZygKLSAgICAgICAgSEFORExFX0FEVFMgcEFkdHMsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgaW50IHJlZwotICAgICAgICApOwordm9pZCBhZHRzUmVhZF9DcmNFbmRSZWcoSEFORExFX0FEVFMgcEFkdHMsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgaW50IHJlZyk7CiAKIC8qKgogICogXGJyaWVmIENoZWNrIENSQwogICoKLSAqIENoZWNrcyBpZiB0aGUgY3VycmVudGx5IGNhbGN1bGF0ZWQgQ1JDIG1hdGNoZXMgdGhlIENSQyBmaWVsZCByZWFkIGZyb20gdGhlIGJpdHN0cmVhbQotICogRGVsZXRlcyBhbGwgQ1JDIHJlZ2lvbnMuCisgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnRseSBjYWxjdWxhdGVkIENSQyBtYXRjaGVzIHRoZSBDUkMgZmllbGQgcmVhZCBmcm9tIHRoZQorICogYml0c3RyZWFtIERlbGV0ZXMgYWxsIENSQyByZWdpb25zLgogICoKICAqIFxwYXJhbSBwQWR0cyBBRFRTIGRhdGEgaGFuZGxlCiAgKgogICogXHJldHVybiBSZXR1cm5zIDAgaWYgdGhleSBhcmUgaWRlbnRpY2FsIG90aGVyd2lzZSAxCiAgKi8KLVRSQU5TUE9SVERFQ19FUlJPUiBhZHRzUmVhZF9DcmNDaGVjayggSEFORExFX0FEVFMgcEFkdHMgKTsKLQorVFJBTlNQT1JUREVDX0VSUk9SIGFkdHNSZWFkX0NyY0NoZWNrKEhBTkRMRV9BRFRTIHBBZHRzKTsKIAogLyoqCiAgKiBcYnJpZWYgQ2hlY2sgaWYgd2UgaGF2ZSBhIHZhbGlkIEFEVFMgZnJhbWUgYXQgdGhlIGN1cnJlbnQgYml0YnVmZmVyIHBvc2l0aW9uCiAgKgogICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIGVub3VnaCBiaXRzIGluIGJ1ZmZlciBmb3IgdGhlIGN1cnJlbnQgZnJhbWUuCiAgKiBJdCByZWFkcyBvdXQgdGhlIGhlYWRlciBiaXRzIHRvIHByZXBhcmUgdGhlIGJpdGJ1ZmZlciBmb3IgdGhlIGRlY29kZSBsb29wLgotICogSW4gY2FzZSB0aGUgaGVhZGVyIGJpdHMgc2hvdyBhbiBpbnZhbGlkIGJpdHN0cmVhbS9mcmFtZSwgdGhlIHdob2xlIGZyYW1lIGlzIHNraXBwZWQuCisgKiBJbiBjYXNlIHRoZSBoZWFkZXIgYml0cyBzaG93IGFuIGludmFsaWQgYml0c3RyZWFtL2ZyYW1lLCB0aGUgd2hvbGUgZnJhbWUgaXMKKyAqIHNraXBwZWQuCiAgKgogICogXHBhcmFtIHBBZHRzIEFEVFMgZGF0YSBoYW5kbGUgd2hpY2ggaXMgZmlsbGVkIHdpdGggcGFyc2VkIEFEVFMgaGVhZGVyIGRhdGEKICAqIFxwYXJhbSBicyBoYW5kbGUgb2YgYml0c3RyZWFtIGZyb20gd2hvbSB0aGUgQURUUyBoZWFkZXIgaXMgcmVhZAogICoKICAqIFxyZXR1cm4gIGVycm9yIHN0YXR1cwogICovCi1UUkFOU1BPUlRERUNfRVJST1IgYWR0c1JlYWRfRGVjb2RlSGVhZGVyKAotICAgICAgICBIQU5ETEVfQURUUyAgICAgICAgICAgcEFkdHMsCi0gICAgICAgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzYywKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGJzLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgaWdub3JlQnVmZmVyRnVsbG5lc3MKLSAgICAgICAgKTsKK1RSQU5TUE9SVERFQ19FUlJPUiBhZHRzUmVhZF9EZWNvZGVIZWFkZXIoSEFORExFX0FEVFMgcEFkdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpZ25vcmVCdWZmZXJGdWxsbmVzcyk7CiAKIC8qKgogICogXGJyaWVmIEdldCB0aGUgcmF3IGRhdGEgYmxvY2sgbGVuZ3RoIG9mIHRoZSBnaXZlbiBibG9jayBudW1iZXIuCiAgKgogICogXHBhcmFtIHBBZHRzIEFEVFMgZGF0YSBoYW5kbGUKICAqIFxwYXJhbSBibG9ja051bSBjdXJyZW50IHJhdyBkYXRhIGJsb2NrIGluZGV4Ci0gKiBccGFyYW0gcExlbmd0aCBwb2ludGVyIHRvIGFuIElOVCB3aGVyZSB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiByYXcgZGF0YSBibG9jayBpcyBzdG9yZWQgaW50bwotICogICAgICAgICAgICAgICAgdGhlIHJldHVybmVkIHZhbHVlIG1pZ2h0IGJlIC0xLCBpbiB3aGljaCBjYXNlIHRoZSByYXcgZGF0YSBibG9jayBsZW5ndGggaXMgdW5rbm93bi4KKyAqIFxwYXJhbSBwTGVuZ3RoIHBvaW50ZXIgdG8gYW4gSU5UIHdoZXJlIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuIHJhdyBkYXRhIGJsb2NrCisgKiBpcyBzdG9yZWQgaW50byB0aGUgcmV0dXJuZWQgdmFsdWUgbWlnaHQgYmUgLTEsIGluIHdoaWNoIGNhc2UgdGhlIHJhdyBkYXRhCisgKiBibG9jayBsZW5ndGggaXMgdW5rbm93bi4KICAqCiAgKiBccmV0dXJuICBlcnJvciBzdGF0dXMKICAqLwotaW50IGFkdHNSZWFkX0dldFJhd0RhdGFCbG9ja0xlbmd0aCgKLSAgICAgICAgSEFORExFX0FEVFMgcEFkdHMsCi0gICAgICAgIElOVCAgICAgICAgIGJsb2NrTnVtCi0gICAgICAgICk7Ci0KK2ludCBhZHRzUmVhZF9HZXRSYXdEYXRhQmxvY2tMZW5ndGgoSEFORExFX0FEVFMgcEFkdHMsIElOVCBibG9ja051bSk7CiAKICNlbmRpZiAvKiBUUERFQ19BRFRTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfYXNjLmNwcCBiL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfYXNjLmNwcAppbmRleCA5NmExYjM1Li5iMGYxYzZhIDEwMDY0NAotLS0gYS9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FzYy5jcHAKKysrIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hc2MuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDU3ICs5MCwxMjIgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBEYW5pZWwgSG9tbQorCiAgICBEZXNjcmlwdGlvbjoKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInRwZGVjX2xpYi5oIgogI2luY2x1ZGUgInRwX2RhdGEuaCIKLSNpZmRlZiBUUF9QQ0VfRU5BQkxFCisKICNpbmNsdWRlICJGREtfY3JjLmgiCi0jZW5kaWYKIAorI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAotdm9pZCBDUHJvZ3JhbUNvbmZpZ19SZXNldChDUHJvZ3JhbUNvbmZpZyAqcFBjZSkKLXsKLSAgcFBjZS0+ZWxDb3VudGVyID0gMDsKLX0KKy8qKgorICogVGhlIGZvbGxvd2luZyBhcnJheXMgcHJvdmlkZSB0aGUgSURzIG9mIHRoZSBjb25zZWN1dGl2ZSBlbGVtZW50cyBmb3IgZWFjaAorICogY2hhbm5lbCBjb25maWd1cmF0aW9uLiBFdmVyeSBjaGFubmVsX2NvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGZpbmFsaXplZCB3aXRoCisgKiBJRF9OT05FLgorICovCitzdGF0aWMgY29uc3QgTVA0X0VMRU1FTlRfSUQgY2hhbm5lbF9jb25maWd1cmF0aW9uXzBbXSA9IHtJRF9OT05FfTsKK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBjaGFubmVsX2NvbmZpZ3VyYXRpb25fMVtdID0ge0lEX1NDRSwgSURfTk9ORX07CitzdGF0aWMgY29uc3QgTVA0X0VMRU1FTlRfSUQgY2hhbm5lbF9jb25maWd1cmF0aW9uXzJbXSA9IHtJRF9DUEUsIElEX05PTkV9Oworc3RhdGljIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGNoYW5uZWxfY29uZmlndXJhdGlvbl8zW10gPSB7SURfU0NFLCBJRF9DUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9OT05FfTsKK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBjaGFubmVsX2NvbmZpZ3VyYXRpb25fNFtdID0ge0lEX1NDRSwgSURfQ1BFLCBJRF9TQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9OT05FfTsKK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBjaGFubmVsX2NvbmZpZ3VyYXRpb25fNVtdID0ge0lEX1NDRSwgSURfQ1BFLCBJRF9DUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9OT05FfTsKK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBjaGFubmVsX2NvbmZpZ3VyYXRpb25fNltdID0ge0lEX1NDRSwgSURfQ1BFLCBJRF9DUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9MRkUsIElEX05PTkV9Oworc3RhdGljIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGNoYW5uZWxfY29uZmlndXJhdGlvbl83W10gPSB7CisgICAgSURfU0NFLCBJRF9DUEUsIElEX0NQRSwgSURfQ1BFLCBJRF9MRkUsIElEX05PTkV9Oworc3RhdGljIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGNoYW5uZWxfY29uZmlndXJhdGlvbl84W10gPSB7CisgICAgSURfTk9ORX07IC8qIHJlc2VydmVkICovCitzdGF0aWMgY29uc3QgTVA0X0VMRU1FTlRfSUQgY2hhbm5lbF9jb25maWd1cmF0aW9uXzlbXSA9IHsKKyAgICBJRF9OT05FfTsgLyogcmVzZXJ2ZWQgKi8KK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBjaGFubmVsX2NvbmZpZ3VyYXRpb25fMTBbXSA9IHsKKyAgICBJRF9OT05FfTsgLyogcmVzZXJ2ZWQgKi8KK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBjaGFubmVsX2NvbmZpZ3VyYXRpb25fMTFbXSA9IHsKKyAgICBJRF9TQ0UsIElEX0NQRSwgSURfQ1BFLCBJRF9TQ0UsIElEX0xGRSwgSURfTk9ORX07CitzdGF0aWMgY29uc3QgTVA0X0VMRU1FTlRfSUQgY2hhbm5lbF9jb25maWd1cmF0aW9uXzEyW10gPSB7CisgICAgSURfU0NFLCBJRF9DUEUsIElEX0NQRSwgSURfQ1BFLCBJRF9MRkUsIElEX05PTkV9Oworc3RhdGljIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGNoYW5uZWxfY29uZmlndXJhdGlvbl8xM1tdID0geworICAgIElEX1NDRSwgSURfQ1BFLCBJRF9DUEUsIElEX0NQRSwgSURfQ1BFLCBJRF9TQ0UsIElEX0xGRSwgSURfTEZFLCBJRF9TQ0UsCisgICAgSURfQ1BFLCBJRF9DUEUsIElEX1NDRSwgSURfQ1BFLCBJRF9TQ0UsIElEX1NDRSwgSURfQ1BFLCBJRF9OT05FfTsKK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBjaGFubmVsX2NvbmZpZ3VyYXRpb25fMTRbXSA9IHsKKyAgICBJRF9TQ0UsIElEX0NQRSwgSURfQ1BFLCBJRF9MQVNULCBJRF9DUEUsIElEX05PTkV9OwogCi12b2lkIENQcm9ncmFtQ29uZmlnX0luaXQoQ1Byb2dyYW1Db25maWcgKnBQY2UpCi17CitzdGF0aWMgY29uc3QgTVA0X0VMRU1FTlRfSUQgKmNoYW5uZWxfY29uZmlndXJhdGlvbl9hcnJheVtdID0geworICAgIGNoYW5uZWxfY29uZmlndXJhdGlvbl8wLCAgY2hhbm5lbF9jb25maWd1cmF0aW9uXzEsCisgICAgY2hhbm5lbF9jb25maWd1cmF0aW9uXzIsICBjaGFubmVsX2NvbmZpZ3VyYXRpb25fMywKKyAgICBjaGFubmVsX2NvbmZpZ3VyYXRpb25fNCwgIGNoYW5uZWxfY29uZmlndXJhdGlvbl81LAorICAgIGNoYW5uZWxfY29uZmlndXJhdGlvbl82LCAgY2hhbm5lbF9jb25maWd1cmF0aW9uXzcsCisgICAgY2hhbm5lbF9jb25maWd1cmF0aW9uXzgsICBjaGFubmVsX2NvbmZpZ3VyYXRpb25fOSwKKyAgICBjaGFubmVsX2NvbmZpZ3VyYXRpb25fMTAsIGNoYW5uZWxfY29uZmlndXJhdGlvbl8xMSwKKyAgICBjaGFubmVsX2NvbmZpZ3VyYXRpb25fMTIsIGNoYW5uZWxfY29uZmlndXJhdGlvbl8xMywKKyAgICBjaGFubmVsX2NvbmZpZ3VyYXRpb25fMTR9OworCisjZGVmaW5lIFRQX1VTQUNfTUFYX0NIQU5ORUxfQ09ORklHVVJBVElPTl9JTkRFWCAoMTMpCisjZGVmaW5lIFNDX0NIQU5ORUxfQ09ORklHX1RBQl9TSVpFIChUUF9VU0FDX01BWF9DSEFOTkVMX0NPTkZJR1VSQVRJT05fSU5ERVggKyAxKQorCisvKiBjaGFubmVsIGNvbmZpZyBzdHJ1Y3R1cmUgdXNlZCBmb3Igc2FuaXR5IGNoZWNrICovCit0eXBlZGVmIHN0cnVjdCB7CisgIFNDSEFSIG5DaDsgIC8qIG51bWJlciBvZiBjaGFubmVscyAqLworICBTQ0hBUiBuU0NFOyAvKiBudW1iZXIgb2YgU0NFJ3MgKi8KKyAgU0NIQVIgbkNQRTsgLyogbnVtYmVyIG9mIENQRSdzICovCisgIFNDSEFSIG5MRkU7IC8qIG51bWJlciBvZiBMRkUncyAqLworfSBTQ19DSEFOTkVMX0NPTkZJRzsKKworc3RhdGljIGNvbnN0IFNDX0NIQU5ORUxfQ09ORklHIHNjX2NoYW5fY29uZmlnX3RhYltTQ19DSEFOTkVMX0NPTkZJR19UQUJfU0laRV0gPQorICAgIHsKKyAgICAgICAgLyogbkNoLCBuU0NFLCBuQ1BFLCBuTEZFLCAgICAgY2NpICovCisgICAgICAgIHswLCAwLCAwLCAwfSwgLyogIDAgKi8KKyAgICAgICAgezEsIDEsIDAsIDB9LCAvKiAgMSAqLworICAgICAgICB7MiwgMCwgMSwgMH0sIC8qICAyICovCisgICAgICAgIHszLCAxLCAxLCAwfSwgLyogIDMgKi8KKyAgICAgICAgezQsIDIsIDEsIDB9LCAvKiAgNCAqLworICAgICAgICB7NSwgMSwgMiwgMH0sIC8qICA1ICovCisgICAgICAgIHs2LCAxLCAyLCAxfSwgLyogIDYgKi8KKyAgICAgICAgezgsIDEsIDMsIDF9LCAvKiAgNyAqLworICAgICAgICB7MiwgMiwgMCwgMH0sIC8qICA4ICovCisgICAgICAgIHszLCAxLCAxLCAwfSwgLyogIDkgKi8KKyAgICAgICAgezQsIDAsIDIsIDB9LCAvKiAxMCAqLworICAgICAgICB7NywgMiwgMiwgMX0sIC8qIDExICovCisgICAgICAgIHs4LCAxLCAzLCAxfSwgLyogMTIgKi8KKyAgICAgICAgezI0LCA2LCA4LCAyfSAvKiAxMyAqLworfTsKKwordm9pZCBDUHJvZ3JhbUNvbmZpZ19SZXNldChDUHJvZ3JhbUNvbmZpZyAqcFBjZSkgeyBwUGNlLT5lbENvdW50ZXIgPSAwOyB9CisKK3ZvaWQgQ1Byb2dyYW1Db25maWdfSW5pdChDUHJvZ3JhbUNvbmZpZyAqcFBjZSkgewogICBGREttZW1jbGVhcihwUGNlLCBzaXplb2YoQ1Byb2dyYW1Db25maWcpKTsKLSNpZmRlZiBUUF9QQ0VfRU5BQkxFCiAgIHBQY2UtPlNhbXBsaW5nRnJlcXVlbmN5SW5kZXggPSAweGY7Ci0jZW5kaWYKIH0KIAotaW50ICBDUHJvZ3JhbUNvbmZpZ19Jc1ZhbGlkICggY29uc3QgQ1Byb2dyYW1Db25maWcgKnBQY2UgKQotewotICByZXR1cm4gKCAocFBjZS0+aXNWYWxpZCkgPyAxIDogMCk7CitpbnQgQ1Byb2dyYW1Db25maWdfSXNWYWxpZChjb25zdCBDUHJvZ3JhbUNvbmZpZyAqcFBjZSkgeworICByZXR1cm4gKChwUGNlLT5pc1ZhbGlkKSA/IDEgOiAwKTsKIH0KIAotI2lmZGVmIFRQX1BDRV9FTkFCTEUKLSNkZWZpbmUgUENFX0hFSUdIVF9FWFRfU1lOQyAgKCAweEFDICkKKyNkZWZpbmUgUENFX0hFSUdIVF9FWFRfU1lOQyAoMHhBQykKIAogLyoKICAqIFJlYWQgdGhlIGV4dGVuc2lvbiBmb3IgaGVpZ2h0IGluZm8uCi0gKiByZXR1cm4gMCBpZiBzdWNjZXNzZnVsbCBvciAtMSBpZiB0aGUgQ1JDIGZhaWxlZC4KKyAqIHJldHVybiAwIGlmIHN1Y2Nlc3NmdWxsLAorICogICAgICAgLTEgaWYgdGhlIENSQyBmYWlsZWQsCisgKiAgICAgICAtMiBpZiBpbnZhbGlkIEhlaWdodEluZm8uCiAgKi8KLXN0YXRpYwotaW50IENQcm9ncmFtQ29uZmlnX1JlYWRIZWlnaHRFeHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1Byb2dyYW1Db25maWcgKnBQY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICogY29uc3QgYnl0ZXNBdmFpbGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBhbGlnbm1lbnRBbmNob3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoteworc3RhdGljIGludCBDUHJvZ3JhbUNvbmZpZ19SZWFkSGVpZ2h0RXh0KENQcm9ncmFtQ29uZmlnICpwUGNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqY29uc3QgYnl0ZXNBdmFpbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBhbGlnbm1lbnRBbmNob3IpIHsKICAgaW50IGVyciA9IDA7Ci0gIEZES19DUkNJTkZPIGNyY0luZm87ICAgIC8qIENSQyBzdGF0ZSBpbmZvICovCisgIEZES19DUkNJTkZPIGNyY0luZm87IC8qIENSQyBzdGF0ZSBpbmZvICovCiAgIElOVCBjcmNSZWc7CiAgIEZES2NyY0luaXQoJmNyY0luZm8sIDB4MDcsIDB4RkYsIDgpOwogICBjcmNSZWcgPSBGREtjcmNTdGFydFJlZygmY3JjSW5mbywgYnMsIDApOwpAQCAtMTM5LDEzNSArMjE1LDEzNSBAQAogICBGREtfQVNTRVJUKGJzICE9IE5VTEwpOwogICBGREtfQVNTRVJUKGJ5dGVzQXZhaWxhYmxlICE9IE5VTEwpOwogCi0gIGlmICggKHN0YXJ0QW5jaG9yID49IDI0KSAmJiAoKmJ5dGVzQXZhaWxhYmxlID49IDMpCi0gICAgJiYgKEZES3JlYWRCaXRzKGJzLDgpID09IFBDRV9IRUlHSFRfRVhUX1NZTkMpICkKLSAgeworICBpZiAoKHN0YXJ0QW5jaG9yID49IDI0KSAmJiAoKmJ5dGVzQXZhaWxhYmxlID49IDMpICYmCisgICAgICAoRkRLcmVhZEJpdHMoYnMsIDgpID09IFBDRV9IRUlHSFRfRVhUX1NZTkMpKSB7CiAgICAgaW50IGk7CiAKLSAgICBmb3IgKGk9MDsgaSA8IHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBpKyspCi0gICAgewotICAgICAgcFBjZS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mb1tpXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMik7CisgICAgZm9yIChpID0gMDsgaSA8IHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgIGlmICgocFBjZS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mb1tpXSA9IChVQ0hBUilGREtyZWFkQml0cyhicywgMikpID49CisgICAgICAgICAgUENfTlVNX0hFSUdIVF9MQVlFUikgeworICAgICAgICBlcnIgPSAtMjsgLyogaGVpZ2h0IGluZm9ybWF0aW9uIGlzIG91dCBvZiB0aGUgdmFsaWQgcmFuZ2UgKi8KKyAgICAgIH0KICAgICB9Ci0gICAgZm9yIChpPTA7IGkgPCBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBpKyspCi0gICAgewotICAgICAgcFBjZS0+U2lkZUVsZW1lbnRIZWlnaHRJbmZvW2ldID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICBpZiAoKHBQY2UtPlNpZGVFbGVtZW50SGVpZ2h0SW5mb1tpXSA9IChVQ0hBUilGREtyZWFkQml0cyhicywgMikpID49CisgICAgICAgICAgUENfTlVNX0hFSUdIVF9MQVlFUikgeworICAgICAgICBlcnIgPSAtMjsgLyogaGVpZ2h0IGluZm9ybWF0aW9uIGlzIG91dCBvZiB0aGUgdmFsaWQgcmFuZ2UgKi8KKyAgICAgIH0KICAgICB9Ci0gICAgZm9yIChpPTA7IGkgPCBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBpKyspCi0gICAgewotICAgICAgcFBjZS0+QmFja0VsZW1lbnRIZWlnaHRJbmZvW2ldID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICBpZiAoKHBQY2UtPkJhY2tFbGVtZW50SGVpZ2h0SW5mb1tpXSA9IChVQ0hBUilGREtyZWFkQml0cyhicywgMikpID49CisgICAgICAgICAgUENfTlVNX0hFSUdIVF9MQVlFUikgeworICAgICAgICBlcnIgPSAtMjsgLyogaGVpZ2h0IGluZm9ybWF0aW9uIGlzIG91dCBvZiB0aGUgdmFsaWQgcmFuZ2UgKi8KKyAgICAgIH0KICAgICB9CiAgICAgRkRLYnl0ZUFsaWduKGJzLCBhbGlnbm1lbnRBbmNob3IpOwogCiAgICAgRkRLY3JjRW5kUmVnKCZjcmNJbmZvLCBicywgY3JjUmVnKTsKLSAgICBpZiAoKFVTSE9SVClGREtyZWFkQml0cyhicyw4KSAhPSBGREtjcmNHZXRDUkMoJmNyY0luZm8pKSB7CisgICAgaWYgKChVU0hPUlQpRkRLcmVhZEJpdHMoYnMsIDgpICE9IEZES2NyY0dldENSQygmY3JjSW5mbykpIHsKICAgICAgIC8qIENSQyBmYWlsZWQgKi8KICAgICAgIGVyciA9IC0xOwogICAgIH0KLSAgfQotICBlbHNlIHsKKyAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgIC8qIFJlc2V0IHdob2xlIGhlaWdodCBpbmZvcm1hdGlvbiBpbiBjYXNlIGFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIHBhcnNpbmcuCisgICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGVuc3VyZXMgdGhhdCBwUGNlLT5pc1ZhbGlkIGlzIHNldCB0byAwIGFuZCBpbXBsaWNpdAorICAgICAgICAgY2hhbm5lbCBtYXBwaW5nIGlzIHVzZWQuICovCisgICAgICBGREttZW1jbGVhcihwUGNlLT5Gcm9udEVsZW1lbnRIZWlnaHRJbmZvLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBQY2UtPkZyb250RWxlbWVudEhlaWdodEluZm8pKTsKKyAgICAgIEZES21lbWNsZWFyKHBQY2UtPlNpZGVFbGVtZW50SGVpZ2h0SW5mbywKKyAgICAgICAgICAgICAgICAgIHNpemVvZihwUGNlLT5TaWRlRWxlbWVudEhlaWdodEluZm8pKTsKKyAgICAgIEZES21lbWNsZWFyKHBQY2UtPkJhY2tFbGVtZW50SGVpZ2h0SW5mbywKKyAgICAgICAgICAgICAgICAgIHNpemVvZihwUGNlLT5CYWNrRWxlbWVudEhlaWdodEluZm8pKTsKKyAgICB9CisgIH0gZWxzZSB7CiAgICAgLyogTm8gdmFsaWQgZXh0ZW5zaW9uIGRhdGEgZm91bmQgLT4gcmVzdG9yZSB0aGUgaW5pdGlhbCBiaXRidWZmZXIgc3RhdGUgKi8KLSAgICBGREtwdXNoQmFjayhicywgc3RhcnRBbmNob3IgLSBGREtnZXRWYWxpZEJpdHMoYnMpKTsKKyAgICBGREtwdXNoQmFjayhicywgKElOVClzdGFydEFuY2hvciAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKSk7CiAgIH0KIAogICAvKiBBbHdheXMgcmVwb3J0IHRoZSBieXRlcyByZWFkLiAqLwotICAqYnl0ZXNBdmFpbGFibGUgLT0gKHN0YXJ0QW5jaG9yIC0gRkRLZ2V0VmFsaWRCaXRzKGJzKSkgPj4gMzsKKyAgKmJ5dGVzQXZhaWxhYmxlIC09ICgoSU5UKXN0YXJ0QW5jaG9yIC0gKElOVClGREtnZXRWYWxpZEJpdHMoYnMpKSA+PiAzOwogCiAgIHJldHVybiAoZXJyKTsKIH0KIAotdm9pZCBDUHJvZ3JhbUNvbmZpZ19SZWFkKAotICAgICAgICAgICAgICAgICAgICAgICAgICBDUHJvZ3JhbUNvbmZpZyAqcFBjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYWxpZ25tZW50QW5jaG9yCi0gICAgICAgICAgICAgICAgICAgICAgICApCi17Cit2b2lkIENQcm9ncmFtQ29uZmlnX1JlYWQoQ1Byb2dyYW1Db25maWcgKnBQY2UsIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYWxpZ25tZW50QW5jaG9yKSB7CiAgIGludCBpLCBlcnIgPSAwOwogICBpbnQgY29tbWVudEJ5dGVzOwogCiAgIHBQY2UtPk51bUVmZmVjdGl2ZUNoYW5uZWxzID0gMDsKICAgcFBjZS0+TnVtQ2hhbm5lbHMgPSAwOwotICBwUGNlLT5FbGVtZW50SW5zdGFuY2VUYWcgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOwotICBwUGNlLT5Qcm9maWxlID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywyKTsKLSAgcFBjZS0+U2FtcGxpbmdGcmVxdWVuY3lJbmRleCA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNCk7Ci0gIHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzID0gKFVDSEFSKSBGREtyZWFkQml0cyhicyw0KTsKLSAgcFBjZS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50cyA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNCk7Ci0gIHBQY2UtPk51bUJhY2tDaGFubmVsRWxlbWVudHMgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOwotICBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHMgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDIpOwotICBwUGNlLT5OdW1Bc3NvY0RhdGFFbGVtZW50cyA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMyk7Ci0gIHBQY2UtPk51bVZhbGlkQ2NFbGVtZW50cyA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNCk7CisgIHBQY2UtPkVsZW1lbnRJbnN0YW5jZVRhZyA9IChVQ0hBUilGREtyZWFkQml0cyhicywgNCk7CisgIHBQY2UtPlByb2ZpbGUgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDIpOworICBwUGNlLT5TYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA0KTsKKyAgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHMgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDQpOworICBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA0KTsKKyAgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50cyA9IChVQ0hBUilGREtyZWFkQml0cyhicywgNCk7CisgIHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50cyA9IChVQ0hBUilGREtyZWFkQml0cyhicywgMik7CisgIHBQY2UtPk51bUFzc29jRGF0YUVsZW1lbnRzID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCAzKTsKKyAgcFBjZS0+TnVtVmFsaWRDY0VsZW1lbnRzID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA0KTsKIAotICBpZiAoKHBQY2UtPk1vbm9NaXhkb3duUHJlc2VudCA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMSkpICE9IDApCi0gIHsKLSAgICBwUGNlLT5Nb25vTWl4ZG93bkVsZW1lbnROdW1iZXIgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDQpOworICBpZiAoKHBQY2UtPk1vbm9NaXhkb3duUHJlc2VudCA9IChVQ0hBUilGREtyZWFkQml0cyhicywgMSkpICE9IDApIHsKKyAgICBwUGNlLT5Nb25vTWl4ZG93bkVsZW1lbnROdW1iZXIgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDQpOwogICB9CiAKLSAgaWYgKChwUGNlLT5TdGVyZW9NaXhkb3duUHJlc2VudCA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMSkpICE9IDApCi0gIHsKLSAgICBwUGNlLT5TdGVyZW9NaXhkb3duRWxlbWVudE51bWJlciA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNCk7CisgIGlmICgocFBjZS0+U3RlcmVvTWl4ZG93blByZXNlbnQgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDEpKSAhPSAwKSB7CisgICAgcFBjZS0+U3RlcmVvTWl4ZG93bkVsZW1lbnROdW1iZXIgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDQpOwogICB9CiAKLSAgaWYgKChwUGNlLT5NYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50ID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywxKSkgIT0gMCkKLSAgewotICAgIHBQY2UtPk1hdHJpeE1peGRvd25JbmRleCA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMik7Ci0gICAgcFBjZS0+UHNldWRvU3Vycm91bmRFbmFibGUgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGJzLDEpOworICBpZiAoKHBQY2UtPk1hdHJpeE1peGRvd25JbmRleFByZXNlbnQgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDEpKSAhPSAwKSB7CisgICAgcFBjZS0+TWF0cml4TWl4ZG93bkluZGV4ID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCAyKTsKKyAgICBwUGNlLT5Qc2V1ZG9TdXJyb3VuZEVuYWJsZSA9IChVQ0hBUilGREtyZWFkQml0cyhicywgMSk7CiAgIH0KIAotICBmb3IgKGk9MDsgaSA8IHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBpKyspCi0gIHsKLSAgICBwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtpXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMSk7Ci0gICAgcFBjZS0+RnJvbnRFbGVtZW50VGFnU2VsZWN0W2ldID0gKFVDSEFSKSBGREtyZWFkQml0cyhicyw0KTsKKyAgZm9yIChpID0gMDsgaSA8IHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICBwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtpXSA9IChVQ0hBUilGREtyZWFkQml0cyhicywgMSk7CisgICAgcFBjZS0+RnJvbnRFbGVtZW50VGFnU2VsZWN0W2ldID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA0KTsKICAgICBwUGNlLT5OdW1DaGFubmVscyArPSBwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtpXSA/IDIgOiAxOwogICB9CiAKLSAgZm9yIChpPTA7IGkgPCBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBpKyspCi0gIHsKLSAgICBwUGNlLT5TaWRlRWxlbWVudElzQ3BlW2ldID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywxKTsKLSAgICBwUGNlLT5TaWRlRWxlbWVudFRhZ1NlbGVjdFtpXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNCk7CisgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICBwUGNlLT5TaWRlRWxlbWVudElzQ3BlW2ldID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCAxKTsKKyAgICBwUGNlLT5TaWRlRWxlbWVudFRhZ1NlbGVjdFtpXSA9IChVQ0hBUilGREtyZWFkQml0cyhicywgNCk7CiAgICAgcFBjZS0+TnVtQ2hhbm5lbHMgKz0gcFBjZS0+U2lkZUVsZW1lbnRJc0NwZVtpXSA/IDIgOiAxOwogICB9CiAKLSAgZm9yIChpPTA7IGkgPCBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBpKyspCi0gIHsKLSAgICBwUGNlLT5CYWNrRWxlbWVudElzQ3BlW2ldID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywxKTsKLSAgICBwUGNlLT5CYWNrRWxlbWVudFRhZ1NlbGVjdFtpXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNCk7CisgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICBwUGNlLT5CYWNrRWxlbWVudElzQ3BlW2ldID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCAxKTsKKyAgICBwUGNlLT5CYWNrRWxlbWVudFRhZ1NlbGVjdFtpXSA9IChVQ0hBUilGREtyZWFkQml0cyhicywgNCk7CiAgICAgcFBjZS0+TnVtQ2hhbm5lbHMgKz0gcFBjZS0+QmFja0VsZW1lbnRJc0NwZVtpXSA/IDIgOiAxOwogICB9CiAKICAgcFBjZS0+TnVtRWZmZWN0aXZlQ2hhbm5lbHMgPSBwUGNlLT5OdW1DaGFubmVsczsKIAotICBmb3IgKGk9MDsgaSA8IHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50czsgaSsrKQotICB7Ci0gICAgcFBjZS0+TGZlRWxlbWVudFRhZ1NlbGVjdFtpXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNCk7CisgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgIHBQY2UtPkxmZUVsZW1lbnRUYWdTZWxlY3RbaV0gPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDQpOwogICAgIHBQY2UtPk51bUNoYW5uZWxzICs9IDE7CiAgIH0KIAotICBmb3IgKGk9MDsgaSA8IHBQY2UtPk51bUFzc29jRGF0YUVsZW1lbnRzOyBpKyspCi0gIHsKLSAgICBwUGNlLT5Bc3NvY0RhdGFFbGVtZW50VGFnU2VsZWN0W2ldID0gKFVDSEFSKSBGREtyZWFkQml0cyhicyw0KTsKKyAgZm9yIChpID0gMDsgaSA8IHBQY2UtPk51bUFzc29jRGF0YUVsZW1lbnRzOyBpKyspIHsKKyAgICBwUGNlLT5Bc3NvY0RhdGFFbGVtZW50VGFnU2VsZWN0W2ldID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA0KTsKICAgfQogCi0gIGZvciAoaT0wOyBpIDwgcFBjZS0+TnVtVmFsaWRDY0VsZW1lbnRzOyBpKyspCi0gIHsKLSAgICBwUGNlLT5DY0VsZW1lbnRJc0luZFN3W2ldID0gKFVDSEFSKSBGREtyZWFkQml0cyhicywxKTsKLSAgICBwUGNlLT5WYWxpZENjRWxlbWVudFRhZ1NlbGVjdFtpXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsNCk7CisgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1WYWxpZENjRWxlbWVudHM7IGkrKykgeworICAgIHBQY2UtPkNjRWxlbWVudElzSW5kU3dbaV0gPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDEpOworICAgIHBQY2UtPlZhbGlkQ2NFbGVtZW50VGFnU2VsZWN0W2ldID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA0KTsKICAgfQogCiAgIEZES2J5dGVBbGlnbihicywgYWxpZ25tZW50QW5jaG9yKTsKIAotICBwUGNlLT5Db21tZW50RmllbGRCeXRlcyA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsOCk7CisgIHBQY2UtPkNvbW1lbnRGaWVsZEJ5dGVzID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA4KTsKICAgY29tbWVudEJ5dGVzID0gcFBjZS0+Q29tbWVudEZpZWxkQnl0ZXM7CiAKICAgLyogU2VhcmNoIGZvciBoZWlnaHQgaW5mbyBleHRlbnNpb24gYW5kIHJlYWQgaXQgaWYgYXZhaWxhYmxlICovCi0gIGVyciA9IENQcm9ncmFtQ29uZmlnX1JlYWRIZWlnaHRFeHQoIHBQY2UsIGJzLCAmY29tbWVudEJ5dGVzLCBhbGlnbm1lbnRBbmNob3IgKTsKKyAgZXJyID0gQ1Byb2dyYW1Db25maWdfUmVhZEhlaWdodEV4dChwUGNlLCBicywgJmNvbW1lbnRCeXRlcywgYWxpZ25tZW50QW5jaG9yKTsKIAotICBmb3IgKGk9MDsgaSA8IGNvbW1lbnRCeXRlczsgaSsrKQotICB7CisgIGZvciAoaSA9IDA7IGkgPCBjb21tZW50Qnl0ZXM7IGkrKykgewogICAgIFVDSEFSIHRleHQ7CiAKLSAgICB0ZXh0ID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLDgpOworICAgIHRleHQgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDgpOwogCi0gICAgaWYgKGkgPCBQQ19DT01NRU5UTEVOR1RIKQotICAgIHsKKyAgICBpZiAoaSA8IFBDX0NPTU1FTlRMRU5HVEgpIHsKICAgICAgIHBQY2UtPkNvbW1lbnRbaV0gPSB0ZXh0OwogICAgIH0KICAgfQpAQCAtMjgzLDI4ICszNTksMjkgQEAKICAqICAgMSAtIGRpZmZlcmVudCBidXQgc2FtZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24KICAqICAgMiAtIGRpZmZlcmVudCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gYnV0IHNhbWUgbnVtYmVyIG9mIGNoYW5uZWxzCiAgKi8KLWludCBDUHJvZ3JhbUNvbmZpZ19Db21wYXJlICggY29uc3QgQ1Byb2dyYW1Db25maWcgKiBjb25zdCBwUGNlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1Byb2dyYW1Db25maWcgKiBjb25zdCBwUGNlMiApCi17Ci0gIGludCByZXN1bHQgPSAwOyAgLyogSW5ub2NlbnQgdW50aWwgcHJvdmVuIGZhbHNlLiAqLworaW50IENQcm9ncmFtQ29uZmlnX0NvbXBhcmUoY29uc3QgQ1Byb2dyYW1Db25maWcgKmNvbnN0IHBQY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1Byb2dyYW1Db25maWcgKmNvbnN0IHBQY2UyKSB7CisgIGludCByZXN1bHQgPSAwOyAvKiBJbm5vY2VudCB1bnRpbCBwcm92ZW4gZmFsc2UuICovCiAKLSAgaWYgKEZES21lbWNtcChwUGNlMSwgcFBjZTIsIHNpemVvZihDUHJvZ3JhbUNvbmZpZykpICE9IDApCi0gIHsgLyogQ29uZmlndXJhdGlvbnMgYXJlIG5vdCBjb21wbGV0ZWx5IGRpZmZlcmVudC4KLSAgICAgICBTbyBsb29rIGludG8gZGV0YWlscyBhbmQgYW5hbHlzZSB0aGUgY2hhbm5lbCBjb25maWd1cmF0aW9uczogKi8KKyAgaWYgKEZES21lbWNtcChwUGNlMSwgcFBjZTIsIHNpemVvZihDUHJvZ3JhbUNvbmZpZykpICE9CisgICAgICAwKSB7IC8qIENvbmZpZ3VyYXRpb25zIGFyZSBub3QgY29tcGxldGVseSBlcXVhbC4KKyAgICAgICAgICAgICAgU28gbG9vayBpbnRvIGRldGFpbHMgYW5kIGFuYWx5c2UgdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbnM6ICovCiAgICAgcmVzdWx0ID0gLTE7CiAKLSAgICBpZiAocFBjZTEtPk51bUNoYW5uZWxzID09IHBQY2UyLT5OdW1DaGFubmVscykKLSAgICB7IC8qIE5vdyB0aGUgbG9naWMgY2hhbmdlcy4gV2UgZmlyc3QgYXNzdW1lIHRvIGhhdmUgdGhlIHNhbWUgY2hhbm5lbCBjb25maWd1cmF0aW9uCi0gICAgICAgICBhbmQgdGhlbiBwcm92ZSBpZiB0aGlzIGFzc3VtcHRpb24gaXMgdHJ1ZS4gKi8KKyAgICBpZiAocFBjZTEtPk51bUNoYW5uZWxzID09CisgICAgICAgIHBQY2UyLT5OdW1DaGFubmVscykgeyAvKiBOb3cgdGhlIGxvZ2ljIGNoYW5nZXMuIFdlIGZpcnN0IGFzc3VtZSB0byBoYXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gYW5kIHRoZW4gcHJvdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoaXMgYXNzdW1wdGlvbiBpcyB0cnVlLiAqLwogICAgICAgcmVzdWx0ID0gMTsKIAogICAgICAgLyogRnJvbnQgY2hhbm5lbHMgKi8KICAgICAgIGlmIChwUGNlMS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHMgIT0gcFBjZTItPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzKSB7Ci0gICAgICAgIHJlc3VsdCA9IDI7ICAvKiBkaWZmZXJlbnQgbnVtYmVyIG9mIGZyb250IGNoYW5uZWwgZWxlbWVudHMgKi8KKyAgICAgICAgcmVzdWx0ID0gMjsgLyogZGlmZmVyZW50IG51bWJlciBvZiBmcm9udCBjaGFubmVsIGVsZW1lbnRzICovCiAgICAgICB9IGVsc2UgewogICAgICAgICBpbnQgZWwsIG51bUNoMSA9IDAsIG51bUNoMiA9IDA7CiAgICAgICAgIGZvciAoZWwgPSAwOyBlbCA8IHBQY2UxLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50czsgZWwgKz0gMSkgewotICAgICAgICAgIGlmIChwUGNlMS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mb1tlbF0gIT0gcFBjZTItPkZyb250RWxlbWVudEhlaWdodEluZm9bZWxdKSB7CisgICAgICAgICAgaWYgKHBQY2UxLT5Gcm9udEVsZW1lbnRIZWlnaHRJbmZvW2VsXSAhPQorICAgICAgICAgICAgICBwUGNlMi0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mb1tlbF0pIHsKICAgICAgICAgICAgIHJlc3VsdCA9IDI7IC8qIGRpZmZlcmVudCBoZWlnaHQgaW5mbyAqLwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQpAQCAtMzEyLDE2ICszODksMTcgQEAKICAgICAgICAgICBudW1DaDIgKz0gcFBjZTItPkZyb250RWxlbWVudElzQ3BlW2VsXSA/IDIgOiAxOwogICAgICAgICB9CiAgICAgICAgIGlmIChudW1DaDEgIT0gbnVtQ2gyKSB7Ci0gICAgICAgICAgcmVzdWx0ID0gMjsgIC8qIGRpZmZlcmVudCBudW1iZXIgb2YgZnJvbnQgY2hhbm5lbHMgKi8KKyAgICAgICAgICByZXN1bHQgPSAyOyAvKiBkaWZmZXJlbnQgbnVtYmVyIG9mIGZyb250IGNoYW5uZWxzICovCiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIC8qIFNpZGUgY2hhbm5lbHMgKi8KICAgICAgIGlmIChwUGNlMS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50cyAhPSBwUGNlMi0+TnVtU2lkZUNoYW5uZWxFbGVtZW50cykgewotICAgICAgICByZXN1bHQgPSAyOyAgLyogZGlmZmVyZW50IG51bWJlciBvZiBzaWRlIGNoYW5uZWwgZWxlbWVudHMgKi8KKyAgICAgICAgcmVzdWx0ID0gMjsgLyogZGlmZmVyZW50IG51bWJlciBvZiBzaWRlIGNoYW5uZWwgZWxlbWVudHMgKi8KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGludCBlbCwgbnVtQ2gxID0gMCwgbnVtQ2gyID0gMDsKICAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZTEtPk51bVNpZGVDaGFubmVsRWxlbWVudHM7IGVsICs9IDEpIHsKLSAgICAgICAgICBpZiAocFBjZTEtPlNpZGVFbGVtZW50SGVpZ2h0SW5mb1tlbF0gIT0gcFBjZTItPlNpZGVFbGVtZW50SGVpZ2h0SW5mb1tlbF0pIHsKKyAgICAgICAgICBpZiAocFBjZTEtPlNpZGVFbGVtZW50SGVpZ2h0SW5mb1tlbF0gIT0KKyAgICAgICAgICAgICAgcFBjZTItPlNpZGVFbGVtZW50SGVpZ2h0SW5mb1tlbF0pIHsKICAgICAgICAgICAgIHJlc3VsdCA9IDI7IC8qIGRpZmZlcmVudCBoZWlnaHQgaW5mbyAqLwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQpAQCAtMzI5LDE2ICs0MDcsMTcgQEAKICAgICAgICAgICBudW1DaDIgKz0gcFBjZTItPlNpZGVFbGVtZW50SXNDcGVbZWxdID8gMiA6IDE7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG51bUNoMSAhPSBudW1DaDIpIHsKLSAgICAgICAgICByZXN1bHQgPSAyOyAgLyogZGlmZmVyZW50IG51bWJlciBvZiBzaWRlIGNoYW5uZWxzICovCisgICAgICAgICAgcmVzdWx0ID0gMjsgLyogZGlmZmVyZW50IG51bWJlciBvZiBzaWRlIGNoYW5uZWxzICovCiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIC8qIEJhY2sgY2hhbm5lbHMgKi8KICAgICAgIGlmIChwUGNlMS0+TnVtQmFja0NoYW5uZWxFbGVtZW50cyAhPSBwUGNlMi0+TnVtQmFja0NoYW5uZWxFbGVtZW50cykgewotICAgICAgICByZXN1bHQgPSAyOyAgLyogZGlmZmVyZW50IG51bWJlciBvZiBiYWNrIGNoYW5uZWwgZWxlbWVudHMgKi8KKyAgICAgICAgcmVzdWx0ID0gMjsgLyogZGlmZmVyZW50IG51bWJlciBvZiBiYWNrIGNoYW5uZWwgZWxlbWVudHMgKi8KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGludCBlbCwgbnVtQ2gxID0gMCwgbnVtQ2gyID0gMDsKICAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZTEtPk51bUJhY2tDaGFubmVsRWxlbWVudHM7IGVsICs9IDEpIHsKLSAgICAgICAgICBpZiAocFBjZTEtPkJhY2tFbGVtZW50SGVpZ2h0SW5mb1tlbF0gIT0gcFBjZTItPkJhY2tFbGVtZW50SGVpZ2h0SW5mb1tlbF0pIHsKKyAgICAgICAgICBpZiAocFBjZTEtPkJhY2tFbGVtZW50SGVpZ2h0SW5mb1tlbF0gIT0KKyAgICAgICAgICAgICAgcFBjZTItPkJhY2tFbGVtZW50SGVpZ2h0SW5mb1tlbF0pIHsKICAgICAgICAgICAgIHJlc3VsdCA9IDI7IC8qIGRpZmZlcmVudCBoZWlnaHQgaW5mbyAqLwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQpAQCAtMzQ2LDEyICs0MjUsMTIgQEAKICAgICAgICAgICBudW1DaDIgKz0gcFBjZTItPkJhY2tFbGVtZW50SXNDcGVbZWxdID8gMiA6IDE7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG51bUNoMSAhPSBudW1DaDIpIHsKLSAgICAgICAgICByZXN1bHQgPSAyOyAgLyogZGlmZmVyZW50IG51bWJlciBvZiBiYWNrIGNoYW5uZWxzICovCisgICAgICAgICAgcmVzdWx0ID0gMjsgLyogZGlmZmVyZW50IG51bWJlciBvZiBiYWNrIGNoYW5uZWxzICovCiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIC8qIExGRSBjaGFubmVscyAqLwogICAgICAgaWYgKHBQY2UxLT5OdW1MZmVDaGFubmVsRWxlbWVudHMgIT0gcFBjZTItPk51bUxmZUNoYW5uZWxFbGVtZW50cykgewotICAgICAgICByZXN1bHQgPSAyOyAgLyogZGlmZmVyZW50IG51bWJlciBvZiBsZmUgY2hhbm5lbHMgKi8KKyAgICAgICAgcmVzdWx0ID0gMjsgLyogZGlmZmVyZW50IG51bWJlciBvZiBsZmUgY2hhbm5lbHMgKi8KICAgICAgIH0KICAgICAgIC8qIExGRXMgYXJlIGFsd2F5cyBTQ0VzIHNvIHdlIGRvbid0IG5lZWQgdG8gY291bnQgdGhlIGNoYW5uZWxzLiAqLwogICAgIH0KQEAgLTM2MCw4OCArNDM5LDg3IEBACiAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXZvaWQgQ1Byb2dyYW1Db25maWdfR2V0RGVmYXVsdCggQ1Byb2dyYW1Db25maWcgKnBQY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgY2hhbm5lbENvbmZpZyApCi17Cit2b2lkIENQcm9ncmFtQ29uZmlnX0dldERlZmF1bHQoQ1Byb2dyYW1Db25maWcgKnBQY2UsIGNvbnN0IFVJTlQgY2hhbm5lbENvbmZpZykgewogICBGREtfQVNTRVJUKHBQY2UgIT0gTlVMTCk7CiAKICAgLyogSW5pdCBQQ0UgKi8KICAgQ1Byb2dyYW1Db25maWdfSW5pdChwUGNlKTsKLSAgcFBjZS0+UHJvZmlsZSA9IDE7ICAvKiBTZXQgQUFDIExDIGJlY2F1c2UgaXQgaXMgdGhlIG9ubHkgc3VwcG9ydGVkIG9iamVjdCB0eXBlLiAqLworICBwUGNlLT5Qcm9maWxlID0KKyAgICAgIDE7IC8qIFNldCBBQUMgTEMgYmVjYXVzZSBpdCBpcyB0aGUgb25seSBzdXBwb3J0ZWQgb2JqZWN0IHR5cGUuICovCiAKICAgc3dpdGNoIChjaGFubmVsQ29uZmlnKSB7Ci0gIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KLSAgY2FzZSAzMjogLyogNy4xIHNpZGUgY2hhbm5lbCBjb25maWd1cmF0aW9uIGFzIGRlZmluZWQgaW4gRkRLX2F1ZGlvLmggKi8KLSAgICBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50cyAgPSAyOwotICAgIHBQY2UtPkZyb250RWxlbWVudElzQ3BlWzBdICAgICA9IDA7Ci0gICAgcFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbMV0gICAgID0gMTsKLSAgICBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzICAgPSAxOwotICAgIHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbMF0gICAgICA9IDE7Ci0gICAgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50cyAgID0gMTsKLSAgICBwUGNlLT5CYWNrRWxlbWVudElzQ3BlWzBdICAgICAgPSAxOwotICAgIHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50cyAgICA9IDE7Ci0gICAgcFBjZS0+TnVtQ2hhbm5lbHMgICAgICAgICAgICAgID0gODsKLSAgICBwUGNlLT5OdW1FZmZlY3RpdmVDaGFubmVscyAgICAgPSA3OwotICAgIHBQY2UtPmlzVmFsaWQgICAgICAgICAgICAgICAgICA9IDE7Ci0gICAgYnJlYWs7Ci0gIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KLSAgY2FzZSAxMjogIC8qIDMvMC80LjFjaCBzdXJyb3VuZCBiYWNrICovCi0gICAgcFBjZS0+QmFja0VsZW1lbnRJc0NwZVsxXSAgICAgID0gMTsKLSAgICBwUGNlLT5OdW1DaGFubmVscyAgICAgICAgICAgICArPSAxOwotICAgIHBQY2UtPk51bUVmZmVjdGl2ZUNoYW5uZWxzICAgICs9IDE7Ci0gIGNhc2UgMTE6ICAvKiAzLzAvMy4xY2ggKi8KLSAgICBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50cyArPSAyOwotICAgIHBQY2UtPkZyb250RWxlbWVudElzQ3BlWzBdICAgICA9IDA7Ci0gICAgcFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbMV0gICAgID0gMTsKLSAgICBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzICArPSAyOwotICAgIHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbMF0gICAgICA9IDE7Ci0gICAgcFBjZS0+QmFja0VsZW1lbnRJc0NwZVsxXSAgICAgKz0gMDsKLSAgICBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHMgICArPSAxOwotICAgIHBQY2UtPk51bUNoYW5uZWxzICAgICAgICAgICAgICs9IDc7Ci0gICAgcFBjZS0+TnVtRWZmZWN0aXZlQ2hhbm5lbHMgICAgKz0gNjsKLSAgICBwUGNlLT5pc1ZhbGlkICAgICAgICAgICAgICAgICAgPSAxOwotICAgIGJyZWFrOwotICAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCi0gIGNhc2UgMTQ6ICAvKiAyLzAvMC0zLzAvMi0wLjFjaCBmcm9udCBoZWlnaHQgKi8KLSAgICBwUGNlLT5Gcm9udEVsZW1lbnRIZWlnaHRJbmZvWzJdID0gMTsgICAgICAvKiBUb3Agc3BlYWtlciAqLwotICBjYXNlIDc6ICAgLyogNS8wLzIuMWNoIGZyb250ICovCi0gICAgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHMgKz0gMTsKLSAgICBwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVsyXSAgICAgPSAxOwotICAgIHBQY2UtPk51bUNoYW5uZWxzICAgICAgICAgICAgICs9IDI7Ci0gICAgcFBjZS0+TnVtRWZmZWN0aXZlQ2hhbm5lbHMgICAgKz0gMjsKLSAgY2FzZSA2OiAgIC8qIDMvMC8yLjFjaCAqLwotICAgIHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50cyAgICs9IDE7Ci0gICAgcFBjZS0+TnVtQ2hhbm5lbHMgICAgICAgICAgICAgKz0gMTsKLSAgY2FzZSA1OiAgIC8qIDMvMC8yLjBjaCAqLwotICBjYXNlIDQ6ICAgLyogMy8wLzEuMGNoICovCi0gICAgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50cyAgKz0gMTsKLSAgICBwUGNlLT5CYWNrRWxlbWVudElzQ3BlWzBdICAgICAgPSAoY2hhbm5lbENvbmZpZz40KSA/IDEgOiAwOwotICAgIHBQY2UtPk51bUNoYW5uZWxzICAgICAgICAgICAgICs9IChjaGFubmVsQ29uZmlnPjQpID8gMiA6IDE7Ci0gICAgcFBjZS0+TnVtRWZmZWN0aXZlQ2hhbm5lbHMgICAgKz0gKGNoYW5uZWxDb25maWc+NCkgPyAyIDogMTsKLSAgY2FzZSAzOiAgIC8qIDMvMC8wLjBjaCAqLwotICAgIHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzICs9IDE7Ci0gICAgcFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbMV0gICAgID0gMTsKLSAgICBwUGNlLT5OdW1DaGFubmVscyAgICAgICAgICAgICArPSAyOwotICAgIHBQY2UtPk51bUVmZmVjdGl2ZUNoYW5uZWxzICAgICs9IDI7Ci0gIGNhc2UgMTogICAvKiAxLzAvMC4wY2ggKi8KLSAgICBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50cyArPSAxOwotICAgIHBQY2UtPkZyb250RWxlbWVudElzQ3BlWzBdICAgICA9IDA7Ci0gICAgcFBjZS0+TnVtQ2hhbm5lbHMgICAgICAgICAgICAgKz0gMTsKLSAgICBwUGNlLT5OdW1FZmZlY3RpdmVDaGFubmVscyAgICArPSAxOwotICAgIHBQY2UtPmlzVmFsaWQgICAgICAgICAgICAgICAgICA9IDE7Ci0gICAgYnJlYWs7Ci0gIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KLSAgY2FzZSAyOiAgIC8qIDIvMC8wLmNoICovCi0gICAgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHMgID0gMTsKLSAgICBwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVswXSAgICAgPSAxOwotICAgIHBQY2UtPk51bUNoYW5uZWxzICAgICAgICAgICAgICs9IDI7Ci0gICAgcFBjZS0+TnVtRWZmZWN0aXZlQ2hhbm5lbHMgICAgKz0gMjsKLSAgICBwUGNlLT5pc1ZhbGlkICAgICAgICAgICAgICAgICAgPSAxOwotICAgIGJyZWFrOwotICAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCi0gIGRlZmF1bHQ6Ci0gICAgcFBjZS0+aXNWYWxpZCAgICAgICAgICAgICAgICAgID0gMDsgICAvKiBUbyBiZSBleHBsaWNpdCEgKi8KLSAgICBicmVhazsKKyAgICAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisgICAgY2FzZSAzMjogLyogNy4xIHNpZGUgY2hhbm5lbCBjb25maWd1cmF0aW9uIGFzIGRlZmluZWQgaW4gRkRLX2F1ZGlvLmggKi8KKyAgICAgIHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzID0gMjsKKyAgICAgIHBQY2UtPkZyb250RWxlbWVudElzQ3BlWzBdID0gMDsKKyAgICAgIHBQY2UtPkZyb250RWxlbWVudElzQ3BlWzFdID0gMTsKKyAgICAgIHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHMgPSAxOworICAgICAgcFBjZS0+U2lkZUVsZW1lbnRJc0NwZVswXSA9IDE7CisgICAgICBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzID0gMTsKKyAgICAgIHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbMF0gPSAxOworICAgICAgcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzID0gMTsKKyAgICAgIHBQY2UtPk51bUNoYW5uZWxzID0gODsKKyAgICAgIHBQY2UtPk51bUVmZmVjdGl2ZUNoYW5uZWxzID0gNzsKKyAgICAgIHBQY2UtPmlzVmFsaWQgPSAxOworICAgICAgYnJlYWs7CisgICAgLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworICAgIGNhc2UgMTI6IC8qIDMvMC80LjFjaCBzdXJyb3VuZCBiYWNrICovCisgICAgICBwUGNlLT5CYWNrRWxlbWVudElzQ3BlWzFdID0gMTsKKyAgICAgIHBQY2UtPk51bUNoYW5uZWxzICs9IDE7CisgICAgICBwUGNlLT5OdW1FZmZlY3RpdmVDaGFubmVscyArPSAxOworICAgIGNhc2UgMTE6IC8qIDMvMC8zLjFjaCAqLworICAgICAgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHMgKz0gMjsKKyAgICAgIHBQY2UtPkZyb250RWxlbWVudElzQ3BlWzBdID0gMDsKKyAgICAgIHBQY2UtPkZyb250RWxlbWVudElzQ3BlWzFdID0gMTsKKyAgICAgIHBQY2UtPk51bUJhY2tDaGFubmVsRWxlbWVudHMgKz0gMjsKKyAgICAgIHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbMF0gPSAxOworICAgICAgcFBjZS0+QmFja0VsZW1lbnRJc0NwZVsxXSArPSAwOworICAgICAgcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzICs9IDE7CisgICAgICBwUGNlLT5OdW1DaGFubmVscyArPSA3OworICAgICAgcFBjZS0+TnVtRWZmZWN0aXZlQ2hhbm5lbHMgKz0gNjsKKyAgICAgIHBQY2UtPmlzVmFsaWQgPSAxOworICAgICAgYnJlYWs7CisgICAgLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworICAgIGNhc2UgMTQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIvMC8wLTMvMC8yLTAuMWNoIGZyb250IGhlaWdodCAqLworICAgICAgcFBjZS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mb1syXSA9IDE7IC8qIFRvcCBzcGVha2VyICovCisgICAgY2FzZSA3OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNS8wLzIuMWNoIGZyb250ICovCisgICAgICBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50cyArPSAxOworICAgICAgcFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbMl0gPSAxOworICAgICAgcFBjZS0+TnVtQ2hhbm5lbHMgKz0gMjsKKyAgICAgIHBQY2UtPk51bUVmZmVjdGl2ZUNoYW5uZWxzICs9IDI7CisgICAgY2FzZSA2OiAvKiAzLzAvMi4xY2ggKi8KKyAgICAgIHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50cyArPSAxOworICAgICAgcFBjZS0+TnVtQ2hhbm5lbHMgKz0gMTsKKyAgICBjYXNlIDU6IC8qIDMvMC8yLjBjaCAqLworICAgIGNhc2UgNDogLyogMy8wLzEuMGNoICovCisgICAgICBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzICs9IDE7CisgICAgICBwUGNlLT5CYWNrRWxlbWVudElzQ3BlWzBdID0gKGNoYW5uZWxDb25maWcgPiA0KSA/IDEgOiAwOworICAgICAgcFBjZS0+TnVtQ2hhbm5lbHMgKz0gKGNoYW5uZWxDb25maWcgPiA0KSA/IDIgOiAxOworICAgICAgcFBjZS0+TnVtRWZmZWN0aXZlQ2hhbm5lbHMgKz0gKGNoYW5uZWxDb25maWcgPiA0KSA/IDIgOiAxOworICAgIGNhc2UgMzogLyogMy8wLzAuMGNoICovCisgICAgICBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50cyArPSAxOworICAgICAgcFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbMV0gPSAxOworICAgICAgcFBjZS0+TnVtQ2hhbm5lbHMgKz0gMjsKKyAgICAgIHBQY2UtPk51bUVmZmVjdGl2ZUNoYW5uZWxzICs9IDI7CisgICAgY2FzZSAxOiAvKiAxLzAvMC4wY2ggKi8KKyAgICAgIHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzICs9IDE7CisgICAgICBwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVswXSA9IDA7CisgICAgICBwUGNlLT5OdW1DaGFubmVscyArPSAxOworICAgICAgcFBjZS0+TnVtRWZmZWN0aXZlQ2hhbm5lbHMgKz0gMTsKKyAgICAgIHBQY2UtPmlzVmFsaWQgPSAxOworICAgICAgYnJlYWs7CisgICAgLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworICAgIGNhc2UgMjogLyogMi8wLzAuY2ggKi8KKyAgICAgIHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzID0gMTsKKyAgICAgIHBQY2UtPkZyb250RWxlbWVudElzQ3BlWzBdID0gMTsKKyAgICAgIHBQY2UtPk51bUNoYW5uZWxzICs9IDI7CisgICAgICBwUGNlLT5OdW1FZmZlY3RpdmVDaGFubmVscyArPSAyOworICAgICAgcFBjZS0+aXNWYWxpZCA9IDE7CisgICAgICBicmVhazsKKyAgICAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisgICAgZGVmYXVsdDoKKyAgICAgIHBQY2UtPmlzVmFsaWQgPSAwOyAvKiBUbyBiZSBleHBsaWNpdCEgKi8KKyAgICAgIGJyZWFrOwogICB9CiAKICAgaWYgKHBQY2UtPmlzVmFsaWQpIHsKQEAgLTQ0OSwxMyArNTI3LDE2IEBACiAgICAgaW50IGVsLCBlbFRhZ1NjZSA9IDAsIGVsVGFnQ3BlID0gMDsKIAogICAgIGZvciAoZWwgPSAwOyBlbCA8IHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBlbCArPSAxKSB7Ci0gICAgICBwUGNlLT5Gcm9udEVsZW1lbnRUYWdTZWxlY3RbZWxdID0gKHBQY2UtPkZyb250RWxlbWVudElzQ3BlW2VsXSkgPyBlbFRhZ0NwZSsrIDogZWxUYWdTY2UrKzsKKyAgICAgIHBQY2UtPkZyb250RWxlbWVudFRhZ1NlbGVjdFtlbF0gPQorICAgICAgICAgIChwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtlbF0pID8gZWxUYWdDcGUrKyA6IGVsVGFnU2NlKys7CiAgICAgfQogICAgIGZvciAoZWwgPSAwOyBlbCA8IHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHM7IGVsICs9IDEpIHsKLSAgICAgIHBQY2UtPlNpZGVFbGVtZW50VGFnU2VsZWN0W2VsXSA9IChwUGNlLT5TaWRlRWxlbWVudElzQ3BlW2VsXSkgPyBlbFRhZ0NwZSsrIDogZWxUYWdTY2UrKzsKKyAgICAgIHBQY2UtPlNpZGVFbGVtZW50VGFnU2VsZWN0W2VsXSA9CisgICAgICAgICAgKHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbZWxdKSA/IGVsVGFnQ3BlKysgOiBlbFRhZ1NjZSsrOwogICAgIH0KICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBlbCArPSAxKSB7Ci0gICAgICBwUGNlLT5CYWNrRWxlbWVudFRhZ1NlbGVjdFtlbF0gPSAocFBjZS0+QmFja0VsZW1lbnRJc0NwZVtlbF0pID8gZWxUYWdDcGUrKyA6IGVsVGFnU2NlKys7CisgICAgICBwUGNlLT5CYWNrRWxlbWVudFRhZ1NlbGVjdFtlbF0gPQorICAgICAgICAgIChwUGNlLT5CYWNrRWxlbWVudElzQ3BlW2VsXSkgPyBlbFRhZ0NwZSsrIDogZWxUYWdTY2UrKzsKICAgICB9CiAgICAgZWxUYWdTY2UgPSAwOwogICAgIGZvciAoZWwgPSAwOyBlbCA8IHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50czsgZWwgKz0gMSkgewpAQCAtNDYzLDMwICs1NDQsMjYgQEAKICAgICB9CiAgIH0KIH0KLSNlbmRpZiAvKiBUUF9QQ0VfRU5BQkxFICovCiAKIC8qKgotICogXGJyaWVmIGdldCBpbXBsaWNpdCBhdWRpbyBjaGFubmVsIHR5cGUgZm9yIGdpdmVuIGNoYW5uZWxDb25maWcgYW5kIE1QRUcgb3JkZXJlZCBjaGFubmVsIGluZGV4CisgKiBcYnJpZWYgZ2V0IGltcGxpY2l0IGF1ZGlvIGNoYW5uZWwgdHlwZSBmb3IgZ2l2ZW4gY2hhbm5lbENvbmZpZyBhbmQgTVBFRworICogb3JkZXJlZCBjaGFubmVsIGluZGV4CiAgKiBccGFyYW0gY2hhbm5lbENvbmZpZyBNUEVHIGNoYW5uZWxDb25maWd1cmF0aW9uIGZyb20gMSB1cHRvIDE0CiAgKiBccGFyYW0gaW5kZXggTVBFRyBjaGFubmVsIG9yZGVyIGluZGV4CiAgKiBccmV0dXJuIGF1ZGlvIGNoYW5uZWwgdHlwZS4KICAqLwotc3RhdGljCi12b2lkIGdldEltcGxpY2l0QXVkaW9DaGFubmVsVHlwZUFuZEluZGV4KAotICAgICAgICBBVURJT19DSEFOTkVMX1RZUEUgKmNoVHlwZSwKLSAgICAgICAgVUNIQVIgKmNoSW5kZXgsCi0gICAgICAgIFVJTlQgY2hhbm5lbENvbmZpZywKLSAgICAgICAgVUlOVCBpbmRleAotICAgICAgICApCi17CitzdGF0aWMgdm9pZCBnZXRJbXBsaWNpdEF1ZGlvQ2hhbm5lbFR5cGVBbmRJbmRleChBVURJT19DSEFOTkVMX1RZUEUgKmNoVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpjaEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBjaGFubmVsQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBpbmRleCkgewogICBpZiAoaW5kZXggPCAzKSB7CiAgICAgKmNoVHlwZSA9IEFDVF9GUk9OVDsKICAgICAqY2hJbmRleCA9IGluZGV4OwogICB9IGVsc2UgewogICAgIHN3aXRjaCAoY2hhbm5lbENvbmZpZykgewotICAgICAgY2FzZSA0OiAgLyogU0NFLCBDUEUsIFNDRSAqLwotICAgICAgY2FzZSA1OiAgLyogU0NFLCBDUEUsIENQRSAqLwotICAgICAgY2FzZSA2OiAgLyogU0NFLCBDUEUsIENQRSwgTEZFICovCisgICAgICBjYXNlIDQ6IC8qIFNDRSwgQ1BFLCBTQ0UgKi8KKyAgICAgIGNhc2UgNTogLyogU0NFLCBDUEUsIENQRSAqLworICAgICAgY2FzZSA2OiAvKiBTQ0UsIENQRSwgQ1BFLCBMRkUgKi8KICAgICAgICAgc3dpdGNoIChpbmRleCkgewogICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICBjYXNlIDQ6CkBAIC00OTksNyArNTc2LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA3OiAgLyogU0NFLENQRSxDUEUsQ1BFLExGRSAqLworICAgICAgY2FzZSA3OiAvKiBTQ0UsQ1BFLENQRSxDUEUsTEZFICovCiAgICAgICAgIHN3aXRjaCAoaW5kZXgpIHsKICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgY2FzZSA0OgpAQCAtNTE3LDcgKzU5NCw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTE6ICAvKiBTQ0UsQ1BFLENQRSxTQ0UsTEZFICovCisgICAgICBjYXNlIDExOiAvKiBTQ0UsQ1BFLENQRSxTQ0UsTEZFICovCiAgICAgICAgIGlmIChpbmRleCA8IDYpIHsKICAgICAgICAgICAqY2hUeXBlID0gQUNUX0JBQ0s7CiAgICAgICAgICAgKmNoSW5kZXggPSBpbmRleCAtIDM7CkBAIC01MjYsNyArNjAzLDcgQEAKICAgICAgICAgICAqY2hJbmRleCA9IDA7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEyOiAgLyogU0NFLENQRSxDUEUsQ1BFLExGRSAqLworICAgICAgY2FzZSAxMjogLyogU0NFLENQRSxDUEUsQ1BFLExGRSAqLwogICAgICAgICBpZiAoaW5kZXggPCA3KSB7CiAgICAgICAgICAgKmNoVHlwZSA9IEFDVF9CQUNLOwogICAgICAgICAgICpjaEluZGV4ID0gaW5kZXggLSAzOwpAQCAtNTM1LDcgKzYxMiw3IEBACiAgICAgICAgICAgKmNoSW5kZXggPSAwOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxNDogIC8qIFNDRSxDUEUsQ1BFLExGRSxDUEUgKi8KKyAgICAgIGNhc2UgMTQ6IC8qIFNDRSxDUEUsQ1BFLExGRSxDUEUgKi8KICAgICAgICAgc3dpdGNoIChpbmRleCkgewogICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICBjYXNlIDQ6CkBAIC01NDksNyArNjI2LDcgQEAKICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgKmNoVHlwZSA9IEFDVF9GUk9OVF9UT1A7Ci0gICAgICAgICAgICAqY2hJbmRleCA9IGluZGV4IC0gNjsgIC8qIGhhbmRsZSB0aGUgdG9wIGxheWVyIGluZGVwZW5kZW50bHkgKi8KKyAgICAgICAgICAgICpjaEluZGV4ID0gaW5kZXggLSA2OyAvKiBoYW5kbGUgdGhlIHRvcCBsYXllciBpbmRlcGVuZGVudGx5ICovCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBicmVhazsKQEAgLTU2MCw0MzYgKzYzNyw1NzQgQEAKICAgfQogfQogCi1pbnQgQ1Byb2dyYW1Db25maWdfTG9va3VwRWxlbWVudCgKLSAgICAgICAgQ1Byb2dyYW1Db25maWcgKnBQY2UsCi0gICAgICAgIFVJTlQgICAgICAgICAgICBjaGFubmVsQ29uZmlnLAotICAgICAgICBjb25zdCBVSU5UICAgICAgdGFnLAotICAgICAgICBjb25zdCBVSU5UICAgICAgY2hhbm5lbElkeCwKLSAgICAgICAgVUNIQVIgICAgICAgICAgIGNoTWFwcGluZ1tdLAotICAgICAgICBBVURJT19DSEFOTkVMX1RZUEUgY2hUeXBlW10sCi0gICAgICAgIFVDSEFSICAgICAgICAgICBjaEluZGV4W10sCi0gICAgICAgIFVDSEFSICAgICAgICAgICplbE1hcHBpbmcsCi0gICAgICAgIE1QNF9FTEVNRU5UX0lEICBlbExpc3RbXSwKLSAgICAgICAgTVA0X0VMRU1FTlRfSUQgIGVsVHlwZQotICAgICAgICkKLXsKLSAgaWYgKGNoYW5uZWxDb25maWcgPiAwKQotICB7CitpbnQgQ1Byb2dyYW1Db25maWdfTG9va3VwRWxlbWVudChDUHJvZ3JhbUNvbmZpZyAqcFBjZSwgVUlOVCBjaGFubmVsQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCB0YWcsIGNvbnN0IFVJTlQgY2hhbm5lbElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGNoTWFwcGluZ1tdLCBBVURJT19DSEFOTkVMX1RZUEUgY2hUeXBlW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBjaEluZGV4W10sIGNvbnN0IFVJTlQgY2hEZXNjckxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICplbE1hcHBpbmcsIE1QNF9FTEVNRU5UX0lEIGVsTGlzdFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVA0X0VMRU1FTlRfSUQgZWxUeXBlKSB7CisgIGlmIChjaGFubmVsQ29uZmlnID4gMCkgewogICAgIC8qIENvbnN0YW50IGNoYW5uZWwgbWFwcGluZyBtdXN0IGhhdmUKICAgICAgICBiZWVuIHNldCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uICovCi0gICAgaWYgKCBlbFR5cGUgPT0gSURfU0NFCi0gICAgICB8fCBlbFR5cGUgPT0gSURfQ1BFCi0gICAgICB8fCBlbFR5cGUgPT0gSURfTEZFICkKLSAgICB7CisgICAgaWYgKElTX0NIQU5ORUxfRUxFTUVOVChlbFR5cGUpKSB7CiAgICAgICAqZWxNYXBwaW5nID0gcFBjZS0+ZWxDb3VudGVyOwotICAgICAgaWYgKGVsTGlzdFtwUGNlLT5lbENvdW50ZXJdICE9IGVsVHlwZSkgeworICAgICAgaWYgKGVsTGlzdFtwUGNlLT5lbENvdW50ZXJdICE9IGVsVHlwZSAmJgorICAgICAgICAgICFJU19VU0FDX0NIQU5ORUxfRUxFTUVOVChlbFR5cGUpKSB7CiAgICAgICAgIC8qIE5vdCBpbiB0aGUgbGlzdCAqLwotICAgICAgICBpZiAoIChjaGFubmVsQ29uZmlnID09IDIpICYmIChlbFR5cGUgPT0gSURfU0NFKSApCi0gICAgICAgIHsgLyogVGhpcyBzY2VuYXJpbyBvY2N1cnMgd2l0aCBIRS1BQUMgdjIgc3RyZWFtcyBvZiBidWdneSBlbmNvZGVycy4KLSAgICAgICAgICAgICBEdWUgdG8gb3RoZXIgZGVjb2RlciBpbXBsZW1lbnRhdGlvbnMgZGVjb2Rpbmcgb2YgdGhlc2Uga2luZCBvZiBzdHJlYW1zIGlzIGRlc2lyZWQuICovCisgICAgICAgIGlmICgoY2hhbm5lbENvbmZpZyA9PSAyKSAmJgorICAgICAgICAgICAgKGVsVHlwZSA9PSBJRF9TQ0UpKSB7IC8qIFRoaXMgc2NlbmFyaW8gb2NjdXJzIHdpdGggSEUtQUFDIHYyIHN0cmVhbXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBidWdneSBlbmNvZGVycy4gSW4gb3RoZXIgZGVjb2RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucyBkZWNvZGluZyBvZiB0aGlzIGtpbmQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1zIGlzIGRlc2lyZWQuICovCiAgICAgICAgICAgY2hhbm5lbENvbmZpZyA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoKGVsTGlzdFtwUGNlLT5lbENvdW50ZXJdID09IElEX0xGRSkgJiYKKyAgICAgICAgICAgICAgICAgICAoZWxUeXBlID09CisgICAgICAgICAgICAgICAgICAgIElEX1NDRSkpIHsgLyogRGVjb2RlIGJpdHN0cmVhbXMgd2hpY2ggd3JvbmdseSB1c2UgSURfU0NFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBJRF9MRkUgZWxlbWVudCB0eXBlLiAqLworICAgICAgICAgIDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgICAgfQogICAgICAgLyogQXNzdW1lIGFsbCBmcm9udCBjaGFubmVscyAqLwotICAgICAgZ2V0SW1wbGljaXRBdWRpb0NoYW5uZWxUeXBlQW5kSW5kZXgoJmNoVHlwZVtjaGFubmVsSWR4XSwgJmNoSW5kZXhbY2hhbm5lbElkeF0sIGNoYW5uZWxDb25maWcsIGNoYW5uZWxJZHgpOwotICAgICAgaWYgKGVsVHlwZSA9PSBJRF9DUEUpIHsKLSAgICAgICAgY2hUeXBlW2NoYW5uZWxJZHgrMV0gPSBjaFR5cGVbY2hhbm5lbElkeF07Ci0gICAgICAgIGNoSW5kZXhbY2hhbm5lbElkeCsxXSA9IGNoSW5kZXhbY2hhbm5lbElkeF0rMTsKKyAgICAgIGdldEltcGxpY2l0QXVkaW9DaGFubmVsVHlwZUFuZEluZGV4KAorICAgICAgICAgICZjaFR5cGVbY2hhbm5lbElkeF0sICZjaEluZGV4W2NoYW5uZWxJZHhdLCBjaGFubmVsQ29uZmlnLCBjaGFubmVsSWR4KTsKKyAgICAgIGlmIChlbFR5cGUgPT0gSURfQ1BFIHx8IGVsVHlwZSA9PSBJRF9VU0FDX0NQRSkgeworICAgICAgICBjaFR5cGVbY2hhbm5lbElkeCArIDFdID0gY2hUeXBlW2NoYW5uZWxJZHhdOworICAgICAgICBjaEluZGV4W2NoYW5uZWxJZHggKyAxXSA9IGNoSW5kZXhbY2hhbm5lbElkeF0gKyAxOwogICAgICAgfQogICAgICAgcFBjZS0+ZWxDb3VudGVyKys7CiAgICAgfQogICAgIC8qIEFjY2VwdCBhbGwgbm9uLWNoYW5uZWwgZWxlbWVudHMsIHRvby4gKi8KICAgICByZXR1cm4gMTsKLSAgfQotICBlbHNlCi0gIHsKLSNpZmRlZiBUUF9QQ0VfRU5BQkxFCi0gICAgaWYgKCFwUGNlLT5pc1ZhbGlkKQotI2VuZGlmIC8qIFRQX1BDRV9FTkFCTEUgKi8KLSAgICB7CisgIH0gZWxzZSB7CisgICAgaWYgKCghcFBjZS0+aXNWYWxpZCkgfHwgKHBQY2UtPk51bUNoYW5uZWxzID4gY2hEZXNjckxlbikpIHsKICAgICAgIC8qIEltcGxpY2l0IGNoYW5uZWwgbWFwcGluZy4gKi8KLSAgICAgIGlmICggZWxUeXBlID09IElEX1NDRQotICAgICAgICB8fCBlbFR5cGUgPT0gSURfQ1BFCi0gICAgICAgIHx8IGVsVHlwZSA9PSBJRF9MRkUgKQotICAgICAgeworICAgICAgaWYgKElTX1VTQUNfQ0hBTk5FTF9FTEVNRU5UKGVsVHlwZSkpIHsKKyAgICAgICAgKmVsTWFwcGluZyA9IHBQY2UtPmVsQ291bnRlcisrOworICAgICAgfSBlbHNlIGlmIChJU19NUDRfQ0hBTk5FTF9FTEVNRU5UKGVsVHlwZSkpIHsKICAgICAgICAgLyogU3RvcmUgYWxsIGNoYW5uZWwgZWxlbWVudCBJRHMgKi8KICAgICAgICAgZWxMaXN0W3BQY2UtPmVsQ291bnRlcl0gPSBlbFR5cGU7CiAgICAgICAgICplbE1hcHBpbmcgPSBwUGNlLT5lbENvdW50ZXIrKzsKICAgICAgIH0KLSAgICB9Ci0jaWZkZWYgIFRQX1BDRV9FTkFCTEUKLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgLyogQWNjZXB0IHRoZSBhZGRpdGlvbmFsIGNoYW5uZWwocyksIG9ubHkgaWYgdGhlIHRhZyBpcyBpbiB0aGUgbGlzdHMgKi8KICAgICAgIGludCBpc0NwZSA9IDAsIGk7CiAgICAgICAvKiBFbGVtZW50IGNvdW50ZXIgKi8KICAgICAgIGludCBlY1tQQ19OVU1fSEVJR0hUX0xBWUVSXSA9IHswfTsKICAgICAgIC8qIENoYW5uZWwgY291bnRlcnMgKi8KICAgICAgIGludCBjY1tQQ19OVU1fSEVJR0hUX0xBWUVSXSA9IHswfTsKLSAgICAgIGludCBmY1tQQ19OVU1fSEVJR0hUX0xBWUVSXSA9IHswfTsKLSAgICAgIGludCBzY1tQQ19OVU1fSEVJR0hUX0xBWUVSXSA9IHswfTsKLSAgICAgIGludCBiY1tQQ19OVU1fSEVJR0hUX0xBWUVSXSA9IHswfTsKLSAgICAgIGludCBsYyA9IDA7OworICAgICAgaW50IGZjW1BDX05VTV9IRUlHSFRfTEFZRVJdID0gezB9OyAvKiBmcm9udCBjaGFubmVsIGNvdW50ZXIgKi8KKyAgICAgIGludCBzY1tQQ19OVU1fSEVJR0hUX0xBWUVSXSA9IHswfTsgLyogc2lkZSBjaGFubmVsIGNvdW50ZXIgKi8KKyAgICAgIGludCBiY1tQQ19OVU1fSEVJR0hUX0xBWUVSXSA9IHswfTsgLyogYmFjayBjaGFubmVsIGNvdW50ZXIgKi8KKyAgICAgIGludCBsYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbGZlIGNoYW5uZWwgY291bnRlciAqLwogCiAgICAgICAvKiBHZW5lcmFsIE1QRUcgKFBDRSkgY29tcG9zaXRpb24gcnVsZXM6CiAgICAgICAgICAtIE92ZXIgYWxsOgotICAgICAgICAgICAgIDxub3JtYWwgaGVpZ2h0IGNoYW5uZWxzPjx0b3AgaGVpZ2h0IGNoYW5uZWxzPjxib3R0b20gaGVpZ2h0IGNoYW5uZWxzPgorICAgICAgICAgICAgIDxub3JtYWwgaGVpZ2h0IGNoYW5uZWxzPjx0b3AgaGVpZ2h0IGNoYW5uZWxzPjxib3R0b20gaGVpZ2h0CisgICAgICAgICBjaGFubmVscz4KICAgICAgICAgIC0gV2l0aGluIGVhY2ggaGVpZ2h0IGxheWVyOgogICAgICAgICAgICAgIDxmcm9udCBjaGFubmVscz48c2lkZSBjaGFubmVscz48YmFjayBjaGFubmVscz4KICAgICAgICAgIC0gRXhjZXB0aW9uOgotICAgICAgICAgICAgIFRoZSBMRkUgY2hhbm5lbHMgaGF2ZSBubyBoZWlnaHQgaW5mbyBhbmQgdGh1cyB0aGV5IGFyZSBhcnJhbmdlZCBhdCB0aGUgdmVyeQotICAgICAgICAgICAgIGVuZCBvZiB0aGUgbm9ybWFsIGhlaWdodCBsYXllciBjaGFubmVscy4KKyAgICAgICAgICAgICBUaGUgTEZFIGNoYW5uZWxzIGhhdmUgbm8gaGVpZ2h0IGluZm8gYW5kIHRodXMgdGhleSBhcmUgYXJyYW5nZWQgYXQKKyAgICAgICAgIHRoZSB2ZXJ5IGVuZCBvZiB0aGUgbm9ybWFsIGhlaWdodCBsYXllciBjaGFubmVscy4KICAgICAgICAqLwogCi0gICAgICBzd2l0Y2ggKGVsVHlwZSkKLSAgICAgIHsKLSAgICAgIGNhc2UgSURfQ1BFOgotICAgICAgICBpc0NwZSA9IDE7Ci0gICAgICBjYXNlIElEX1NDRToKLSAgICAgICAgLyogc2VhcmNoIGluIGZyb250IGNoYW5uZWxzICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50czsgaSsrKSB7Ci0gICAgICAgICAgaW50IGhlaWdodExheWVyID0gcFBjZS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mb1tpXTsKLSAgICAgICAgICBpZiAoaXNDcGUgPT0gcFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbaV0gJiYgcFBjZS0+RnJvbnRFbGVtZW50VGFnU2VsZWN0W2ldID09IHRhZykgewotICAgICAgICAgICAgaW50IGgsIGVsSWR4ID0gZWNbaGVpZ2h0TGF5ZXJdLCBjaElkeCA9IGNjW2hlaWdodExheWVyXTsKLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSBhQ2hUeXBlID0gKEFVRElPX0NIQU5ORUxfVFlQRSkoKGhlaWdodExheWVyPDw0KSB8IEFDVF9GUk9OVCk7Ci0gICAgICAgICAgICBmb3IgKGggPSBoZWlnaHRMYXllci0xOyBoID49IDA7IGgtPTEpIHsKLSAgICAgICAgICAgICAgaW50IGVsOwotICAgICAgICAgICAgICAvKiBDb3VudCBmcm9udCBjaGFubmVscy9lbGVtZW50cyAqLwotICAgICAgICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50czsgZWwrPTEpIHsKLSAgICAgICAgICAgICAgICBpZiAocFBjZS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mb1tlbF0gPT0gaCkgewotICAgICAgICAgICAgICAgICAgZWxJZHggKz0gMTsKLSAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IChwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtlbF0pID8gMiA6IDE7CisgICAgICBzd2l0Y2ggKGVsVHlwZSkgeworICAgICAgICBjYXNlIElEX0NQRToKKyAgICAgICAgICBpc0NwZSA9IDE7CisgICAgICAgIGNhc2UgSURfU0NFOgorICAgICAgICAgIC8qIHNlYXJjaCBpbiBmcm9udCBjaGFubmVscyAqLworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaGVpZ2h0TGF5ZXIgPSBwUGNlLT5Gcm9udEVsZW1lbnRIZWlnaHRJbmZvW2ldOworICAgICAgICAgICAgaWYgKGlzQ3BlID09IHBQY2UtPkZyb250RWxlbWVudElzQ3BlW2ldICYmCisgICAgICAgICAgICAgICAgcFBjZS0+RnJvbnRFbGVtZW50VGFnU2VsZWN0W2ldID09IHRhZykgeworICAgICAgICAgICAgICBpbnQgaCwgZWxJZHggPSBlY1toZWlnaHRMYXllcl0sIGNoSWR4ID0gY2NbaGVpZ2h0TGF5ZXJdOworICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX1RZUEUgYUNoVHlwZSA9CisgICAgICAgICAgICAgICAgICAoQVVESU9fQ0hBTk5FTF9UWVBFKSgoaGVpZ2h0TGF5ZXIgPDwgNCkgfCBBQ1RfRlJPTlQpOworICAgICAgICAgICAgICBmb3IgKGggPSBoZWlnaHRMYXllciAtIDE7IGggPj0gMDsgaCAtPSAxKSB7CisgICAgICAgICAgICAgICAgaW50IGVsOworICAgICAgICAgICAgICAgIC8qIENvdW50IGZyb250IGNoYW5uZWxzL2VsZW1lbnRzICovCisgICAgICAgICAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGVsICs9IDEpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChwUGNlLT5Gcm9udEVsZW1lbnRIZWlnaHRJbmZvW2VsXSA9PSBoKSB7CisgICAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IChwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtlbF0pID8gMiA6IDE7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIENvdW50IHNpZGUgY2hhbm5lbHMvZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBlbCArPSAxKSB7CisgICAgICAgICAgICAgICAgICBpZiAocFBjZS0+U2lkZUVsZW1lbnRIZWlnaHRJbmZvW2VsXSA9PSBoKSB7CisgICAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IChwUGNlLT5TaWRlRWxlbWVudElzQ3BlW2VsXSkgPyAyIDogMTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogQ291bnQgYmFjayBjaGFubmVscy9lbGVtZW50cyAqLworICAgICAgICAgICAgICAgIGZvciAoZWwgPSAwOyBlbCA8IHBQY2UtPk51bUJhY2tDaGFubmVsRWxlbWVudHM7IGVsICs9IDEpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChwUGNlLT5CYWNrRWxlbWVudEhlaWdodEluZm9bZWxdID09IGgpIHsKKyAgICAgICAgICAgICAgICAgICAgZWxJZHggKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgY2hJZHggKz0gKHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbZWxdKSA/IDIgOiAxOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaCA9PSAwKSB7IC8qIG5vcm1hbCBoZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50czsKKyAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50czsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgLyogQ291bnQgc2lkZSBjaGFubmVscy9lbGVtZW50cyAqLwotICAgICAgICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBlbCs9MSkgewotICAgICAgICAgICAgICAgIGlmIChwUGNlLT5TaWRlRWxlbWVudEhlaWdodEluZm9bZWxdID09IGgpIHsKLSAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IDE7Ci0gICAgICAgICAgICAgICAgICBjaElkeCArPSAocFBjZS0+U2lkZUVsZW1lbnRJc0NwZVtlbF0pID8gMiA6IDE7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjaE1hcHBpbmdbY2hJZHhdID0gY2hhbm5lbElkeDsKKyAgICAgICAgICAgICAgY2hUeXBlW2NoSWR4XSA9IGFDaFR5cGU7CisgICAgICAgICAgICAgIGNoSW5kZXhbY2hJZHhdID0gZmNbaGVpZ2h0TGF5ZXJdOworICAgICAgICAgICAgICBpZiAoaXNDcGUpIHsKKyAgICAgICAgICAgICAgICBjaE1hcHBpbmdbY2hJZHggKyAxXSA9IGNoYW5uZWxJZHggKyAxOworICAgICAgICAgICAgICAgIGNoVHlwZVtjaElkeCArIDFdID0gYUNoVHlwZTsKKyAgICAgICAgICAgICAgICBjaEluZGV4W2NoSWR4ICsgMV0gPSBmY1toZWlnaHRMYXllcl0gKyAxOwogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIC8qIENvdW50IGJhY2sgY2hhbm5lbHMvZWxlbWVudHMgKi8KLSAgICAgICAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50czsgZWwrPTEpIHsKLSAgICAgICAgICAgICAgICBpZiAocFBjZS0+QmFja0VsZW1lbnRIZWlnaHRJbmZvW2VsXSA9PSBoKSB7Ci0gICAgICAgICAgICAgICAgICBlbElkeCArPSAxOwotICAgICAgICAgICAgICAgICAgY2hJZHggKz0gKHBQY2UtPkJhY2tFbGVtZW50SXNDcGVbZWxdKSA/IDIgOiAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoaCA9PSAwKSB7ICAvKiBub3JtYWwgaGVpZ2h0ICovCi0gICAgICAgICAgICAgICAgZWxJZHggKz0gcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzOwotICAgICAgICAgICAgICAgIGNoSWR4ICs9IHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50czsKLSAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAqZWxNYXBwaW5nID0gZWxJZHg7CisgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hNYXBwaW5nW2NoSWR4XSA9IGNoYW5uZWxJZHg7Ci0gICAgICAgICAgICBjaFR5cGVbY2hJZHhdID0gYUNoVHlwZTsKLSAgICAgICAgICAgIGNoSW5kZXhbY2hJZHhdID0gZmNbaGVpZ2h0TGF5ZXJdOwotICAgICAgICAgICAgaWYgKGlzQ3BlKSB7Ci0gICAgICAgICAgICAgIGNoTWFwcGluZ1tjaElkeCsxXSA9IGNoYW5uZWxJZHgrMTsKLSAgICAgICAgICAgICAgY2hUeXBlW2NoSWR4KzFdID0gYUNoVHlwZTsKLSAgICAgICAgICAgICAgY2hJbmRleFtjaElkeCsxXSA9IGZjW2hlaWdodExheWVyXSsxOworICAgICAgICAgICAgZWNbaGVpZ2h0TGF5ZXJdICs9IDE7CisgICAgICAgICAgICBpZiAocFBjZS0+RnJvbnRFbGVtZW50SXNDcGVbaV0pIHsKKyAgICAgICAgICAgICAgY2NbaGVpZ2h0TGF5ZXJdICs9IDI7CisgICAgICAgICAgICAgIGZjW2hlaWdodExheWVyXSArPSAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgY2NbaGVpZ2h0TGF5ZXJdICs9IDE7CisgICAgICAgICAgICAgIGZjW2hlaWdodExheWVyXSArPSAxOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgKmVsTWFwcGluZyA9IGVsSWR4OwotICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgfQotICAgICAgICAgIGVjW2hlaWdodExheWVyXSArPSAxOwotICAgICAgICAgIGlmIChwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtpXSkgewotICAgICAgICAgICAgY2NbaGVpZ2h0TGF5ZXJdICs9IDI7Ci0gICAgICAgICAgICBmY1toZWlnaHRMYXllcl0gKz0gMjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2NbaGVpZ2h0TGF5ZXJdICs9IDE7Ci0gICAgICAgICAgICBmY1toZWlnaHRMYXllcl0gKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogc2VhcmNoIGluIHNpZGUgY2hhbm5lbHMgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHM7IGkrKykgewotICAgICAgICAgIGludCBoZWlnaHRMYXllciA9IHBQY2UtPlNpZGVFbGVtZW50SGVpZ2h0SW5mb1tpXTsKLSAgICAgICAgICBpZiAoaXNDcGUgPT0gcFBjZS0+U2lkZUVsZW1lbnRJc0NwZVtpXSAmJiBwUGNlLT5TaWRlRWxlbWVudFRhZ1NlbGVjdFtpXSA9PSB0YWcpIHsKLSAgICAgICAgICAgIGludCBoLCBlbElkeCA9IGVjW2hlaWdodExheWVyXSwgY2hJZHggPSBjY1toZWlnaHRMYXllcl07Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX1RZUEUgYUNoVHlwZSA9IChBVURJT19DSEFOTkVMX1RZUEUpKChoZWlnaHRMYXllcjw8NCkgfCBBQ1RfU0lERSk7Ci0gICAgICAgICAgICBmb3IgKGggPSBoZWlnaHRMYXllci0xOyBoID49IDA7IGgtPTEpIHsKLSAgICAgICAgICAgICAgaW50IGVsOwotICAgICAgICAgICAgICAvKiBDb3VudCBmcm9udCBjaGFubmVscy9lbGVtZW50cyAqLwotICAgICAgICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50czsgZWwrPTEpIHsKLSAgICAgICAgICAgICAgICBpZiAocFBjZS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mb1tlbF0gPT0gaCkgewotICAgICAgICAgICAgICAgICAgZWxJZHggKz0gMTsKLSAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IChwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtlbF0pID8gMiA6IDE7CisgICAgICAgICAgLyogc2VhcmNoIGluIHNpZGUgY2hhbm5lbHMgKi8KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaGVpZ2h0TGF5ZXIgPSBwUGNlLT5TaWRlRWxlbWVudEhlaWdodEluZm9baV07CisgICAgICAgICAgICBpZiAoaXNDcGUgPT0gcFBjZS0+U2lkZUVsZW1lbnRJc0NwZVtpXSAmJgorICAgICAgICAgICAgICAgIHBQY2UtPlNpZGVFbGVtZW50VGFnU2VsZWN0W2ldID09IHRhZykgeworICAgICAgICAgICAgICBpbnQgaCwgZWxJZHggPSBlY1toZWlnaHRMYXllcl0sIGNoSWR4ID0gY2NbaGVpZ2h0TGF5ZXJdOworICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX1RZUEUgYUNoVHlwZSA9CisgICAgICAgICAgICAgICAgICAoQVVESU9fQ0hBTk5FTF9UWVBFKSgoaGVpZ2h0TGF5ZXIgPDwgNCkgfCBBQ1RfU0lERSk7CisgICAgICAgICAgICAgIGZvciAoaCA9IGhlaWdodExheWVyIC0gMTsgaCA+PSAwOyBoIC09IDEpIHsKKyAgICAgICAgICAgICAgICBpbnQgZWw7CisgICAgICAgICAgICAgICAgLyogQ291bnQgZnJvbnQgY2hhbm5lbHMvZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50czsgZWwgKz0gMSkgeworICAgICAgICAgICAgICAgICAgaWYgKHBQY2UtPkZyb250RWxlbWVudEhlaWdodEluZm9bZWxdID09IGgpIHsKKyAgICAgICAgICAgICAgICAgICAgZWxJZHggKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgY2hJZHggKz0gKHBQY2UtPkZyb250RWxlbWVudElzQ3BlW2VsXSkgPyAyIDogMTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogQ291bnQgc2lkZSBjaGFubmVscy9lbGVtZW50cyAqLworICAgICAgICAgICAgICAgIGZvciAoZWwgPSAwOyBlbCA8IHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHM7IGVsICs9IDEpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChwUGNlLT5TaWRlRWxlbWVudEhlaWdodEluZm9bZWxdID09IGgpIHsKKyAgICAgICAgICAgICAgICAgICAgZWxJZHggKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgY2hJZHggKz0gKHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbZWxdKSA/IDIgOiAxOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBDb3VudCBiYWNrIGNoYW5uZWxzL2VsZW1lbnRzICovCisgICAgICAgICAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50czsgZWwgKz0gMSkgeworICAgICAgICAgICAgICAgICAgaWYgKHBQY2UtPkJhY2tFbGVtZW50SGVpZ2h0SW5mb1tlbF0gPT0gaCkgeworICAgICAgICAgICAgICAgICAgICBlbElkeCArPSAxOworICAgICAgICAgICAgICAgICAgICBjaElkeCArPSAocFBjZS0+QmFja0VsZW1lbnRJc0NwZVtlbF0pID8gMiA6IDE7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoID09CisgICAgICAgICAgICAgICAgICAgIDApIHsgLyogTEZFIGNoYW5uZWxzIGJlbG9uZyB0byB0aGUgbm9ybWFsIGhlaWdodCBsYXllciAqLworICAgICAgICAgICAgICAgICAgZWxJZHggKz0gcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzOworICAgICAgICAgICAgICAgICAgY2hJZHggKz0gcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAvKiBDb3VudCBzaWRlIGNoYW5uZWxzL2VsZW1lbnRzICovCi0gICAgICAgICAgICAgIGZvciAoZWwgPSAwOyBlbCA8IHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHM7IGVsKz0xKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBQY2UtPlNpZGVFbGVtZW50SGVpZ2h0SW5mb1tlbF0gPT0gaCkgewotICAgICAgICAgICAgICAgICAgZWxJZHggKz0gMTsKLSAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IChwUGNlLT5TaWRlRWxlbWVudElzQ3BlW2VsXSkgPyAyIDogMTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNoTWFwcGluZ1tjaElkeF0gPSBjaGFubmVsSWR4OworICAgICAgICAgICAgICBjaFR5cGVbY2hJZHhdID0gYUNoVHlwZTsKKyAgICAgICAgICAgICAgY2hJbmRleFtjaElkeF0gPSBzY1toZWlnaHRMYXllcl07CisgICAgICAgICAgICAgIGlmIChpc0NwZSkgeworICAgICAgICAgICAgICAgIGNoTWFwcGluZ1tjaElkeCArIDFdID0gY2hhbm5lbElkeCArIDE7CisgICAgICAgICAgICAgICAgY2hUeXBlW2NoSWR4ICsgMV0gPSBhQ2hUeXBlOworICAgICAgICAgICAgICAgIGNoSW5kZXhbY2hJZHggKyAxXSA9IHNjW2hlaWdodExheWVyXSArIDE7CiAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgLyogQ291bnQgYmFjayBjaGFubmVscy9lbGVtZW50cyAqLwotICAgICAgICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBlbCs9MSkgewotICAgICAgICAgICAgICAgIGlmIChwUGNlLT5CYWNrRWxlbWVudEhlaWdodEluZm9bZWxdID09IGgpIHsKLSAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IDE7Ci0gICAgICAgICAgICAgICAgICBjaElkeCArPSAocFBjZS0+QmFja0VsZW1lbnRJc0NwZVtlbF0pID8gMiA6IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChoID09IDApIHsgIC8qIExGRSBjaGFubmVscyBiZWxvbmcgdG8gdGhlIG5vcm1hbCBoZWlnaHQgbGF5ZXIgKi8KLSAgICAgICAgICAgICAgICBlbElkeCArPSBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHM7Ci0gICAgICAgICAgICAgICAgY2hJZHggKz0gcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzOwotICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICplbE1hcHBpbmcgPSBlbElkeDsKKyAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaE1hcHBpbmdbY2hJZHhdID0gY2hhbm5lbElkeDsKLSAgICAgICAgICAgIGNoVHlwZVtjaElkeF0gPSBhQ2hUeXBlOwotICAgICAgICAgICAgY2hJbmRleFtjaElkeF0gPSBzY1toZWlnaHRMYXllcl07Ci0gICAgICAgICAgICBpZiAoaXNDcGUpIHsKLSAgICAgICAgICAgICAgY2hNYXBwaW5nW2NoSWR4KzFdID0gY2hhbm5lbElkeCsxOwotICAgICAgICAgICAgICBjaFR5cGVbY2hJZHgrMV0gPSBhQ2hUeXBlOwotICAgICAgICAgICAgICBjaEluZGV4W2NoSWR4KzFdID0gc2NbaGVpZ2h0TGF5ZXJdKzE7CisgICAgICAgICAgICBlY1toZWlnaHRMYXllcl0gKz0gMTsKKyAgICAgICAgICAgIGlmIChwUGNlLT5TaWRlRWxlbWVudElzQ3BlW2ldKSB7CisgICAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAyOworICAgICAgICAgICAgICBzY1toZWlnaHRMYXllcl0gKz0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAxOworICAgICAgICAgICAgICBzY1toZWlnaHRMYXllcl0gKz0gMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICplbE1hcHBpbmcgPSBlbElkeDsKLSAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgIH0KLSAgICAgICAgICBlY1toZWlnaHRMYXllcl0gKz0gMTsKLSAgICAgICAgICBpZiAocFBjZS0+U2lkZUVsZW1lbnRJc0NwZVtpXSkgewotICAgICAgICAgICAgY2NbaGVpZ2h0TGF5ZXJdICs9IDI7Ci0gICAgICAgICAgICBzY1toZWlnaHRMYXllcl0gKz0gMjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2NbaGVpZ2h0TGF5ZXJdICs9IDE7Ci0gICAgICAgICAgICBzY1toZWlnaHRMYXllcl0gKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogc2VhcmNoIGluIGJhY2sgY2hhbm5lbHMgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQY2UtPk51bUJhY2tDaGFubmVsRWxlbWVudHM7IGkrKykgewotICAgICAgICAgIGludCBoZWlnaHRMYXllciA9IHBQY2UtPkJhY2tFbGVtZW50SGVpZ2h0SW5mb1tpXTsKLSAgICAgICAgICBpZiAoaXNDcGUgPT0gcFBjZS0+QmFja0VsZW1lbnRJc0NwZVtpXSAmJiBwUGNlLT5CYWNrRWxlbWVudFRhZ1NlbGVjdFtpXSA9PSB0YWcpIHsKLSAgICAgICAgICAgIGludCBoLCBlbElkeCA9IGVjW2hlaWdodExheWVyXSwgY2hJZHggPSBjY1toZWlnaHRMYXllcl07Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX1RZUEUgYUNoVHlwZSA9IChBVURJT19DSEFOTkVMX1RZUEUpKChoZWlnaHRMYXllcjw8NCkgfCBBQ1RfQkFDSyk7Ci0gICAgICAgICAgICBmb3IgKGggPSBoZWlnaHRMYXllci0xOyBoID49IDA7IGgtPTEpIHsKLSAgICAgICAgICAgICAgaW50IGVsOwotICAgICAgICAgICAgICAvKiBDb3VudCBmcm9udCBjaGFubmVscy9lbGVtZW50cyAqLwotICAgICAgICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50czsgZWwrPTEpIHsKLSAgICAgICAgICAgICAgICBpZiAocFBjZS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mb1tlbF0gPT0gaCkgewotICAgICAgICAgICAgICAgICAgZWxJZHggKz0gMTsKLSAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IChwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtlbF0pID8gMiA6IDE7CisgICAgICAgICAgLyogc2VhcmNoIGluIGJhY2sgY2hhbm5lbHMgKi8KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaGVpZ2h0TGF5ZXIgPSBwUGNlLT5CYWNrRWxlbWVudEhlaWdodEluZm9baV07CisgICAgICAgICAgICBpZiAoaXNDcGUgPT0gcFBjZS0+QmFja0VsZW1lbnRJc0NwZVtpXSAmJgorICAgICAgICAgICAgICAgIHBQY2UtPkJhY2tFbGVtZW50VGFnU2VsZWN0W2ldID09IHRhZykgeworICAgICAgICAgICAgICBpbnQgaCwgZWxJZHggPSBlY1toZWlnaHRMYXllcl0sIGNoSWR4ID0gY2NbaGVpZ2h0TGF5ZXJdOworICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX1RZUEUgYUNoVHlwZSA9CisgICAgICAgICAgICAgICAgICAoQVVESU9fQ0hBTk5FTF9UWVBFKSgoaGVpZ2h0TGF5ZXIgPDwgNCkgfCBBQ1RfQkFDSyk7CisgICAgICAgICAgICAgIGZvciAoaCA9IGhlaWdodExheWVyIC0gMTsgaCA+PSAwOyBoIC09IDEpIHsKKyAgICAgICAgICAgICAgICBpbnQgZWw7CisgICAgICAgICAgICAgICAgLyogQ291bnQgZnJvbnQgY2hhbm5lbHMvZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1Gcm9udENoYW5uZWxFbGVtZW50czsgZWwgKz0gMSkgeworICAgICAgICAgICAgICAgICAgaWYgKHBQY2UtPkZyb250RWxlbWVudEhlaWdodEluZm9bZWxdID09IGgpIHsKKyAgICAgICAgICAgICAgICAgICAgZWxJZHggKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgY2hJZHggKz0gKHBQY2UtPkZyb250RWxlbWVudElzQ3BlW2VsXSkgPyAyIDogMTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogQ291bnQgc2lkZSBjaGFubmVscy9lbGVtZW50cyAqLworICAgICAgICAgICAgICAgIGZvciAoZWwgPSAwOyBlbCA8IHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHM7IGVsICs9IDEpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChwUGNlLT5TaWRlRWxlbWVudEhlaWdodEluZm9bZWxdID09IGgpIHsKKyAgICAgICAgICAgICAgICAgICAgZWxJZHggKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgY2hJZHggKz0gKHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbZWxdKSA/IDIgOiAxOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBDb3VudCBiYWNrIGNoYW5uZWxzL2VsZW1lbnRzICovCisgICAgICAgICAgICAgICAgZm9yIChlbCA9IDA7IGVsIDwgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50czsgZWwgKz0gMSkgeworICAgICAgICAgICAgICAgICAgaWYgKHBQY2UtPkJhY2tFbGVtZW50SGVpZ2h0SW5mb1tlbF0gPT0gaCkgeworICAgICAgICAgICAgICAgICAgICBlbElkeCArPSAxOworICAgICAgICAgICAgICAgICAgICBjaElkeCArPSAocFBjZS0+QmFja0VsZW1lbnRJc0NwZVtlbF0pID8gMiA6IDE7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoID09IDApIHsgLyogbm9ybWFsIGhlaWdodCAqLworICAgICAgICAgICAgICAgICAgZWxJZHggKz0gcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzOworICAgICAgICAgICAgICAgICAgY2hJZHggKz0gcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAvKiBDb3VudCBzaWRlIGNoYW5uZWxzL2VsZW1lbnRzICovCi0gICAgICAgICAgICAgIGZvciAoZWwgPSAwOyBlbCA8IHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHM7IGVsKz0xKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBQY2UtPlNpZGVFbGVtZW50SGVpZ2h0SW5mb1tlbF0gPT0gaCkgewotICAgICAgICAgICAgICAgICAgZWxJZHggKz0gMTsKLSAgICAgICAgICAgICAgICAgIGNoSWR4ICs9IChwUGNlLT5TaWRlRWxlbWVudElzQ3BlW2VsXSkgPyAyIDogMTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNoTWFwcGluZ1tjaElkeF0gPSBjaGFubmVsSWR4OworICAgICAgICAgICAgICBjaFR5cGVbY2hJZHhdID0gYUNoVHlwZTsKKyAgICAgICAgICAgICAgY2hJbmRleFtjaElkeF0gPSBiY1toZWlnaHRMYXllcl07CisgICAgICAgICAgICAgIGlmIChpc0NwZSkgeworICAgICAgICAgICAgICAgIGNoTWFwcGluZ1tjaElkeCArIDFdID0gY2hhbm5lbElkeCArIDE7CisgICAgICAgICAgICAgICAgY2hUeXBlW2NoSWR4ICsgMV0gPSBhQ2hUeXBlOworICAgICAgICAgICAgICAgIGNoSW5kZXhbY2hJZHggKyAxXSA9IGJjW2hlaWdodExheWVyXSArIDE7CiAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgLyogQ291bnQgYmFjayBjaGFubmVscy9lbGVtZW50cyAqLwotICAgICAgICAgICAgICBmb3IgKGVsID0gMDsgZWwgPCBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBlbCs9MSkgewotICAgICAgICAgICAgICAgIGlmIChwUGNlLT5CYWNrRWxlbWVudEhlaWdodEluZm9bZWxdID09IGgpIHsKLSAgICAgICAgICAgICAgICAgIGVsSWR4ICs9IDE7Ci0gICAgICAgICAgICAgICAgICBjaElkeCArPSAocFBjZS0+QmFja0VsZW1lbnRJc0NwZVtlbF0pID8gMiA6IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChoID09IDApIHsgIC8qIG5vcm1hbCBoZWlnaHQgKi8KLSAgICAgICAgICAgICAgICBlbElkeCArPSBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHM7Ci0gICAgICAgICAgICAgICAgY2hJZHggKz0gcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzOwotICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICplbE1hcHBpbmcgPSBlbElkeDsKKyAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaE1hcHBpbmdbY2hJZHhdID0gY2hhbm5lbElkeDsKLSAgICAgICAgICAgIGNoVHlwZVtjaElkeF0gPSBhQ2hUeXBlOwotICAgICAgICAgICAgY2hJbmRleFtjaElkeF0gPSBiY1toZWlnaHRMYXllcl07Ci0gICAgICAgICAgICBpZiAoaXNDcGUpIHsKLSAgICAgICAgICAgICAgY2hNYXBwaW5nW2NoSWR4KzFdID0gY2hhbm5lbElkeCsxOwotICAgICAgICAgICAgICBjaFR5cGVbY2hJZHgrMV0gPSBhQ2hUeXBlOwotICAgICAgICAgICAgICBjaEluZGV4W2NoSWR4KzFdID0gYmNbaGVpZ2h0TGF5ZXJdKzE7CisgICAgICAgICAgICBlY1toZWlnaHRMYXllcl0gKz0gMTsKKyAgICAgICAgICAgIGlmIChwUGNlLT5CYWNrRWxlbWVudElzQ3BlW2ldKSB7CisgICAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAyOworICAgICAgICAgICAgICBiY1toZWlnaHRMYXllcl0gKz0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAxOworICAgICAgICAgICAgICBiY1toZWlnaHRMYXllcl0gKz0gMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICplbE1hcHBpbmcgPSBlbElkeDsKLSAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgIH0KLSAgICAgICAgICBlY1toZWlnaHRMYXllcl0gKz0gMTsKLSAgICAgICAgICBpZiAocFBjZS0+QmFja0VsZW1lbnRJc0NwZVtpXSkgewotICAgICAgICAgICAgY2NbaGVpZ2h0TGF5ZXJdICs9IDI7Ci0gICAgICAgICAgICBiY1toZWlnaHRMYXllcl0gKz0gMjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2NbaGVpZ2h0TGF5ZXJdICs9IDE7Ci0gICAgICAgICAgICBiY1toZWlnaHRMYXllcl0gKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgSURfTEZFOgotICAgICAgeyAvKiBVbmZvcnR1bmF0ZWx5IHdlIGhhdmUgdG8gZ28gdGhyb3VnaCBhbGwgbm9ybWFsIGhlaWdodAotICAgICAgICAgICBsYXllciBlbGVtZW50cyB0byBnZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBMRkUgY2hhbm5lbHMuCi0gICAgICAgICAgIFN0YXJ0IHdpdGggY291bnRpbmcgdGhlIGZyb250IGNoYW5uZWxzL2VsZW1lbnRzIGF0IG5vcm1hbCBoZWlnaHQgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBpKz0xKSB7Ci0gICAgICAgICAgaW50IGhlaWdodExheWVyID0gcFBjZS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mb1tpXTsKLSAgICAgICAgICBlY1toZWlnaHRMYXllcl0gKz0gMTsKLSAgICAgICAgICBjY1toZWlnaHRMYXllcl0gKz0gKHBQY2UtPkZyb250RWxlbWVudElzQ3BlW2ldKSA/IDIgOiAxOwotICAgICAgICB9Ci0gICAgICAgIC8qIENvdW50IHNpZGUgY2hhbm5lbHMvZWxlbWVudHMgYXQgbm9ybWFsIGhlaWdodCAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50czsgaSs9MSkgewotICAgICAgICAgIGludCBoZWlnaHRMYXllciA9IHBQY2UtPlNpZGVFbGVtZW50SGVpZ2h0SW5mb1tpXTsKLSAgICAgICAgICBlY1toZWlnaHRMYXllcl0gKz0gMTsKLSAgICAgICAgICBjY1toZWlnaHRMYXllcl0gKz0gKHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbaV0pID8gMiA6IDE7Ci0gICAgICAgIH0KLSAgICAgICAgLyogQ291bnQgYmFjayBjaGFubmVscy9lbGVtZW50cyBhdCBub3JtYWwgaGVpZ2h0ICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBpKz0xKSB7Ci0gICAgICAgICAgaW50IGhlaWdodExheWVyID0gcFBjZS0+QmFja0VsZW1lbnRIZWlnaHRJbmZvW2ldOwotICAgICAgICAgIGVjW2hlaWdodExheWVyXSArPSAxOwotICAgICAgICAgIGNjW2hlaWdodExheWVyXSArPSAocFBjZS0+QmFja0VsZW1lbnRJc0NwZVtpXSkgPyAyIDogMTsKLSAgICAgICAgfQorICAgICAgICBjYXNlIElEX0xGRTogeyAvKiBVbmZvcnR1bmF0ZWx5IHdlIGhhdmUgdG8gZ28gdGhyb3VnaCBhbGwgbm9ybWFsIGhlaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciBlbGVtZW50cyB0byBnZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBMRkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMuIFN0YXJ0IHdpdGggY291bnRpbmcgdGhlIGZyb250CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzL2VsZW1lbnRzIGF0IG5vcm1hbCBoZWlnaHQgKi8KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGkgKz0gMSkgeworICAgICAgICAgICAgaW50IGhlaWdodExheWVyID0gcFBjZS0+RnJvbnRFbGVtZW50SGVpZ2h0SW5mb1tpXTsKKyAgICAgICAgICAgIGVjW2hlaWdodExheWVyXSArPSAxOworICAgICAgICAgICAgY2NbaGVpZ2h0TGF5ZXJdICs9IChwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtpXSkgPyAyIDogMTsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogQ291bnQgc2lkZSBjaGFubmVscy9lbGVtZW50cyBhdCBub3JtYWwgaGVpZ2h0ICovCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHM7IGkgKz0gMSkgeworICAgICAgICAgICAgaW50IGhlaWdodExheWVyID0gcFBjZS0+U2lkZUVsZW1lbnRIZWlnaHRJbmZvW2ldOworICAgICAgICAgICAgZWNbaGVpZ2h0TGF5ZXJdICs9IDE7CisgICAgICAgICAgICBjY1toZWlnaHRMYXllcl0gKz0gKHBQY2UtPlNpZGVFbGVtZW50SXNDcGVbaV0pID8gMiA6IDE7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIENvdW50IGJhY2sgY2hhbm5lbHMvZWxlbWVudHMgYXQgbm9ybWFsIGhlaWdodCAqLworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBpICs9IDEpIHsKKyAgICAgICAgICAgIGludCBoZWlnaHRMYXllciA9IHBQY2UtPkJhY2tFbGVtZW50SGVpZ2h0SW5mb1tpXTsKKyAgICAgICAgICAgIGVjW2hlaWdodExheWVyXSArPSAxOworICAgICAgICAgICAgY2NbaGVpZ2h0TGF5ZXJdICs9IChwUGNlLT5CYWNrRWxlbWVudElzQ3BlW2ldKSA/IDIgOiAxOworICAgICAgICAgIH0KIAotICAgICAgICAvKiBzZWFyY2ggaW4gbGZlIGNoYW5uZWxzICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHM7IGkrKykgewotICAgICAgICAgIGludCBlbElkeCA9IGVjWzBdOyAgLyogTEZFIGNoYW5uZWxzIGJlbG9uZyB0byB0aGUgbm9ybWFsIGhlaWdodCBsYXllciAqLwotICAgICAgICAgIGludCBjaElkeCA9IGNjWzBdOwotICAgICAgICAgIGlmICggcFBjZS0+TGZlRWxlbWVudFRhZ1NlbGVjdFtpXSA9PSB0YWcgKSB7Ci0gICAgICAgICAgICBjaE1hcHBpbmdbY2hJZHhdID0gY2hhbm5lbElkeDsKLSAgICAgICAgICAgICplbE1hcHBpbmcgPSBlbElkeDsKLSAgICAgICAgICAgIGNoVHlwZVtjaElkeF0gPSBBQ1RfTEZFOwotICAgICAgICAgICAgY2hJbmRleFtjaElkeF0gPSBsYzsKLSAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgIC8qIHNlYXJjaCBpbiBsZmUgY2hhbm5lbHMgKi8KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgIGludCBlbElkeCA9CisgICAgICAgICAgICAgICAgZWNbMF07IC8qIExGRSBjaGFubmVscyBiZWxvbmcgdG8gdGhlIG5vcm1hbCBoZWlnaHQgbGF5ZXIgKi8KKyAgICAgICAgICAgIGludCBjaElkeCA9IGNjWzBdOworICAgICAgICAgICAgaWYgKHBQY2UtPkxmZUVsZW1lbnRUYWdTZWxlY3RbaV0gPT0gdGFnKSB7CisgICAgICAgICAgICAgIGNoTWFwcGluZ1tjaElkeF0gPSBjaGFubmVsSWR4OworICAgICAgICAgICAgICAqZWxNYXBwaW5nID0gZWxJZHg7CisgICAgICAgICAgICAgIGNoVHlwZVtjaElkeF0gPSBBQ1RfTEZFOworICAgICAgICAgICAgICBjaEluZGV4W2NoSWR4XSA9IGxjOworICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVjWzBdICs9IDE7CisgICAgICAgICAgICBjY1swXSArPSAxOworICAgICAgICAgICAgbGMgKz0gMTsKICAgICAgICAgICB9Ci0gICAgICAgICAgZWNbMF0gKz0gMTsKLSAgICAgICAgICBjY1swXSArPSAxOwotICAgICAgICAgIGxjICs9IDE7Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7CisgICAgICAgIH0gYnJlYWs7CiAKLSAgICAgIC8qIE5vbiBhdWRpbyBlbGVtZW50cyAqLwotICAgICAgY2FzZSBJRF9DQ0U6Ci0gICAgICAgIC8qIHNlYXJjaCBpbiBjY2UgY2hhbm5lbHMgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQY2UtPk51bVZhbGlkQ2NFbGVtZW50czsgaSsrKSB7Ci0gICAgICAgICAgaWYgKHBQY2UtPlZhbGlkQ2NFbGVtZW50VGFnU2VsZWN0W2ldID09IHRhZykgewotICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIC8qIE5vbiBhdWRpbyBlbGVtZW50cyAqLworICAgICAgICBjYXNlIElEX0NDRToKKyAgICAgICAgICAvKiBzZWFyY2ggaW4gY2NlIGNoYW5uZWxzICovCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQY2UtPk51bVZhbGlkQ2NFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICBpZiAocFBjZS0+VmFsaWRDY0VsZW1lbnRUYWdTZWxlY3RbaV0gPT0gdGFnKSB7CisgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSURfRFNFOgotICAgICAgICAvKiBzZWFyY2ggYXNzb2NpYXRlZCBkYXRhIGVsZW1lbnRzICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1Bc3NvY0RhdGFFbGVtZW50czsgaSsrKSB7Ci0gICAgICAgICAgaWYgKHBQY2UtPkFzc29jRGF0YUVsZW1lbnRUYWdTZWxlY3RbaV0gPT0gdGFnKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJRF9EU0U6CisgICAgICAgICAgLyogc2VhcmNoIGFzc29jaWF0ZWQgZGF0YSBlbGVtZW50cyAqLworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1Bc3NvY0RhdGFFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICBpZiAocFBjZS0+QXNzb2NEYXRhRWxlbWVudFRhZ1NlbGVjdFtpXSA9PSB0YWcpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9Ci0gICAgICByZXR1cm4gMDsgIC8qIG5vdCBmb3VuZCBpbiBhbnkgbGlzdCAqLworICAgICAgcmV0dXJuIDA7IC8qIG5vdCBmb3VuZCBpbiBhbnkgbGlzdCAqLwogICAgIH0KLSNlbmRpZiAvKiBUUF9QQ0VfRU5BQkxFICovCiAgIH0KIAogICByZXR1cm4gMTsKIH0KIAotI2lmZGVmICBUUF9QQ0VfRU5BQkxFCi1pbnQgQ1Byb2dyYW1Db25maWdfR2V0RWxlbWVudFRhYmxlKAotICAgICAgICBjb25zdCBDUHJvZ3JhbUNvbmZpZyAqcFBjZSwKLSAgICAgICAgTVA0X0VMRU1FTlRfSUQgIGVsTGlzdFtdLAotICAgICAgICBjb25zdCBJTlQgZWxMaXN0U2l6ZSwKLSAgICAgICAgVUNIQVIgKnBDaE1hcElkeAotICAgICAgICkKLXsKKyNkZWZpbmUgU1BFQUtFUl9QTEFORV9OT1JNQUwgMAorI2RlZmluZSBTUEVBS0VSX1BMQU5FX1RPUCAxCisjZGVmaW5lIFNQRUFLRVJfUExBTkVfQk9UVE9NIDIKKwordm9pZCBDUHJvZ3JhbUNvbmZpZ19HZXRDaGFubmVsRGVzY3JpcHRpb24oY29uc3QgVUlOVCBjaENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQcm9ncmFtQ29uZmlnICpwUGNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGNoVHlwZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgY2hJbmRleFtdKSB7CisgIEZES19BU1NFUlQoY2hUeXBlICE9IE5VTEwpOworICBGREtfQVNTRVJUKGNoSW5kZXggIT0gTlVMTCk7CisKKyAgaWYgKChjaENvbmZpZyA9PSAwKSAmJiAocFBjZSAhPSBOVUxMKSkgeworICAgIGlmIChwUGNlLT5pc1ZhbGlkKSB7CisgICAgICBpbnQgc3BrUGxhbmUsIGNoSWR4ID0gMDsKKyAgICAgIGZvciAoc3BrUGxhbmUgPSBTUEVBS0VSX1BMQU5FX05PUk1BTDsgc3BrUGxhbmUgPD0gU1BFQUtFUl9QTEFORV9CT1RUT007CisgICAgICAgICAgIHNwa1BsYW5lICs9IDEpIHsKKyAgICAgICAgaW50IGVsSWR4LCBncnBDaElkeCA9IDA7CisgICAgICAgIGZvciAoZWxJZHggPSAwOyBlbElkeCA8IHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBlbElkeCArPSAxKSB7CisgICAgICAgICAgaWYgKHBQY2UtPkZyb250RWxlbWVudEhlaWdodEluZm9bZWxJZHhdID09IHNwa1BsYW5lKSB7CisgICAgICAgICAgICBjaFR5cGVbY2hJZHhdID0gKEFVRElPX0NIQU5ORUxfVFlQRSkoKHNwa1BsYW5lIDw8IDQpIHwgQUNUX0ZST05UKTsKKyAgICAgICAgICAgIGNoSW5kZXhbY2hJZHgrK10gPSBncnBDaElkeCsrOworICAgICAgICAgICAgaWYgKHBQY2UtPkZyb250RWxlbWVudElzQ3BlW2VsSWR4XSkgeworICAgICAgICAgICAgICBjaFR5cGVbY2hJZHhdID0gKEFVRElPX0NIQU5ORUxfVFlQRSkoKHNwa1BsYW5lIDw8IDQpIHwgQUNUX0ZST05UKTsKKyAgICAgICAgICAgICAgY2hJbmRleFtjaElkeCsrXSA9IGdycENoSWR4Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdycENoSWR4ID0gMDsKKyAgICAgICAgZm9yIChlbElkeCA9IDA7IGVsSWR4IDwgcFBjZS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50czsgZWxJZHggKz0gMSkgeworICAgICAgICAgIGlmIChwUGNlLT5TaWRlRWxlbWVudEhlaWdodEluZm9bZWxJZHhdID09IHNwa1BsYW5lKSB7CisgICAgICAgICAgICBjaFR5cGVbY2hJZHhdID0gKEFVRElPX0NIQU5ORUxfVFlQRSkoKHNwa1BsYW5lIDw8IDQpIHwgQUNUX1NJREUpOworICAgICAgICAgICAgY2hJbmRleFtjaElkeCsrXSA9IGdycENoSWR4Kys7CisgICAgICAgICAgICBpZiAocFBjZS0+U2lkZUVsZW1lbnRJc0NwZVtlbElkeF0pIHsKKyAgICAgICAgICAgICAgY2hUeXBlW2NoSWR4XSA9IChBVURJT19DSEFOTkVMX1RZUEUpKChzcGtQbGFuZSA8PCA0KSB8IEFDVF9TSURFKTsKKyAgICAgICAgICAgICAgY2hJbmRleFtjaElkeCsrXSA9IGdycENoSWR4Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdycENoSWR4ID0gMDsKKyAgICAgICAgZm9yIChlbElkeCA9IDA7IGVsSWR4IDwgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50czsgZWxJZHggKz0gMSkgeworICAgICAgICAgIGlmIChwUGNlLT5CYWNrRWxlbWVudEhlaWdodEluZm9bZWxJZHhdID09IHNwa1BsYW5lKSB7CisgICAgICAgICAgICBjaFR5cGVbY2hJZHhdID0gKEFVRElPX0NIQU5ORUxfVFlQRSkoKHNwa1BsYW5lIDw8IDQpIHwgQUNUX0JBQ0spOworICAgICAgICAgICAgY2hJbmRleFtjaElkeCsrXSA9IGdycENoSWR4Kys7CisgICAgICAgICAgICBpZiAocFBjZS0+QmFja0VsZW1lbnRJc0NwZVtlbElkeF0pIHsKKyAgICAgICAgICAgICAgY2hUeXBlW2NoSWR4XSA9IChBVURJT19DSEFOTkVMX1RZUEUpKChzcGtQbGFuZSA8PCA0KSB8IEFDVF9CQUNLKTsKKyAgICAgICAgICAgICAgY2hJbmRleFtjaElkeCsrXSA9IGdycENoSWR4Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdycENoSWR4ID0gMDsKKyAgICAgICAgaWYgKHNwa1BsYW5lID09IFNQRUFLRVJfUExBTkVfTk9STUFMKSB7CisgICAgICAgICAgZm9yIChlbElkeCA9IDA7IGVsSWR4IDwgcFBjZS0+TnVtTGZlQ2hhbm5lbEVsZW1lbnRzOyBlbElkeCArPSAxKSB7CisgICAgICAgICAgICBjaFR5cGVbY2hJZHhdID0gQUNUX0xGRTsKKyAgICAgICAgICAgIGNoSW5kZXhbY2hJZHgrK10gPSBncnBDaElkeCsrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQgY2hJZHg7CisgICAgZm9yIChjaElkeCA9IDA7IGNoSWR4IDwgZ2V0TnVtYmVyT2ZUb3RhbENoYW5uZWxzKGNoQ29uZmlnKTsgY2hJZHggKz0gMSkgeworICAgICAgZ2V0SW1wbGljaXRBdWRpb0NoYW5uZWxUeXBlQW5kSW5kZXgoJmNoVHlwZVtjaElkeF0sICZjaEluZGV4W2NoSWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ29uZmlnLCBjaElkeCk7CisgICAgfQorICB9Cit9CisKK2ludCBDUHJvZ3JhbUNvbmZpZ19HZXRQY2VDaE1hcChjb25zdCBDUHJvZ3JhbUNvbmZpZyAqcFBjZSwgVUNIQVIgcGNlQ2hNYXBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIHBjZUNoTWFwTGVuKSB7CisgIGNvbnN0IFVDSEFSICpuRWxlbWVudHMgPSAmcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHM7CisgIGNvbnN0IFVDSEFSICplbEhlaWdodFszXSwgKmVsSXNDcGVbM107CisgIHVuc2lnbmVkIGNoSWR4LCBwbGFuZSwgZ3JwLCBvZmZzZXQsIHRvdENoWzNdLCBudW1DaFszXVs0XTsKKworICBGREtfQVNTRVJUKHBQY2UgIT0gTlVMTCk7CisgIEZES19BU1NFUlQocGNlQ2hNYXAgIT0gTlVMTCk7CisKKyAgLyogSW5pdCBjb3VudGVyOiAqLworICBGREttZW1jbGVhcih0b3RDaCwgMyAqIHNpemVvZih1bnNpZ25lZCkpOworICBGREttZW1jbGVhcihudW1DaCwgMyAqIDQgKiBzaXplb2YodW5zaWduZWQpKTsKKworICAvKiBBbmFseXNlIFBDRTogKi8KKyAgZWxIZWlnaHRbMF0gPSBwUGNlLT5Gcm9udEVsZW1lbnRIZWlnaHRJbmZvOworICBlbElzQ3BlWzBdID0gcFBjZS0+RnJvbnRFbGVtZW50SXNDcGU7CisgIGVsSGVpZ2h0WzFdID0gcFBjZS0+U2lkZUVsZW1lbnRIZWlnaHRJbmZvOworICBlbElzQ3BlWzFdID0gcFBjZS0+U2lkZUVsZW1lbnRJc0NwZTsKKyAgZWxIZWlnaHRbMl0gPSBwUGNlLT5CYWNrRWxlbWVudEhlaWdodEluZm87CisgIGVsSXNDcGVbMl0gPSBwUGNlLT5CYWNrRWxlbWVudElzQ3BlOworCisgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8PSBTUEVBS0VSX1BMQU5FX0JPVFRPTTsgcGxhbmUgKz0gMSkgeworICAgIGZvciAoZ3JwID0gMDsgZ3JwIDwgMzsgZ3JwICs9IDEpIHsgLyogZnJvbnQsIHNpZGUsIGJhY2sgKi8KKyAgICAgIHVuc2lnbmVkIGVsOworICAgICAgZm9yIChlbCA9IDA7IGVsIDwgbkVsZW1lbnRzW2dycF07IGVsICs9IDEpIHsKKyAgICAgICAgaWYgKGVsSGVpZ2h0W2dycF1bZWxdID09IHBsYW5lKSB7CisgICAgICAgICAgdW5zaWduZWQgZWxDaCA9IGVsSXNDcGVbZ3JwXVtlbF0gPyAyIDogMTsKKyAgICAgICAgICBudW1DaFtwbGFuZV1bZ3JwXSArPSBlbENoOworICAgICAgICAgIHRvdENoW3BsYW5lXSArPSBlbENoOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChwbGFuZSA9PSBTUEVBS0VSX1BMQU5FX05PUk1BTCkgeworICAgICAgdW5zaWduZWQgZWxDaCA9IHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50czsKKyAgICAgIG51bUNoW3BsYW5lXVtncnBdICs9IGVsQ2g7CisgICAgICB0b3RDaFtwbGFuZV0gKz0gZWxDaDsKKyAgICB9CisgIH0KKyAgLyogU2FuaXR5IGNoZWNrczogKi8KKyAgY2hJZHggPSB0b3RDaFtTUEVBS0VSX1BMQU5FX05PUk1BTF0gKyB0b3RDaFtTUEVBS0VSX1BMQU5FX1RPUF0gKworICAgICAgICAgIHRvdENoW1NQRUFLRVJfUExBTkVfQk9UVE9NXTsKKyAgaWYgKGNoSWR4ID4gcGNlQ2hNYXBMZW4pIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBDcmVhdGUgbWFwOiAqLworICBvZmZzZXQgPSBncnAgPSAwOworICB1bnNpZ25lZCBncnBUaHJlc2ggPSBudW1DaFtTUEVBS0VSX1BMQU5FX05PUk1BTF1bZ3JwXTsKKyAgZm9yIChjaElkeCA9IDA7IGNoSWR4IDwgdG90Q2hbU1BFQUtFUl9QTEFORV9OT1JNQUxdOyBjaElkeCArPSAxKSB7CisgICAgd2hpbGUgKChjaElkeCA+PSBncnBUaHJlc2gpICYmIChncnAgPCAzKSkgeworICAgICAgb2Zmc2V0ICs9IG51bUNoWzFdW2dycF0gKyBudW1DaFsyXVtncnBdOworICAgICAgZ3JwICs9IDE7CisgICAgICBncnBUaHJlc2ggKz0gbnVtQ2hbU1BFQUtFUl9QTEFORV9OT1JNQUxdW2dycF07CisgICAgfQorICAgIHBjZUNoTWFwW2NoSWR4XSA9IGNoSWR4ICsgb2Zmc2V0OworICB9CisgIG9mZnNldCA9IDA7CisgIGZvciAoZ3JwID0gMDsgZ3JwIDwgNDsgZ3JwICs9IDEpIHsgLyogZnJvbnQsIHNpZGUsIGJhY2sgYW5kIGxmZSAqLworICAgIG9mZnNldCArPSBudW1DaFtTUEVBS0VSX1BMQU5FX05PUk1BTF1bZ3JwXTsKKyAgICBmb3IgKHBsYW5lID0gU1BFQUtFUl9QTEFORV9UT1A7IHBsYW5lIDw9IFNQRUFLRVJfUExBTkVfQk9UVE9NOyBwbGFuZSArPSAxKSB7CisgICAgICB1bnNpZ25lZCBtYXBDaDsKKyAgICAgIGZvciAobWFwQ2ggPSAwOyBtYXBDaCA8IG51bUNoW3BsYW5lXVtncnBdOyBtYXBDaCArPSAxKSB7CisgICAgICAgIHBjZUNoTWFwW2NoSWR4KytdID0gb2Zmc2V0OworICAgICAgICBvZmZzZXQgKz0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBDUHJvZ3JhbUNvbmZpZ19HZXRFbGVtZW50VGFibGUoY29uc3QgQ1Byb2dyYW1Db25maWcgKnBQY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QNF9FTEVNRU5UX0lEIGVsTGlzdFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZWxMaXN0U2l6ZSwgVUNIQVIgKnBDaE1hcElkeCkgewogICBpbnQgaSwgZWwgPSAwOwogCiAgIEZES19BU1NFUlQoZWxMaXN0ICE9IE5VTEwpOwogICBGREtfQVNTRVJUKHBDaE1hcElkeCAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChwUGNlICE9IE5VTEwpOwogCiAgICpwQ2hNYXBJZHggPSAwOwogCi0gIGlmICggZWxMaXN0U2l6ZQotICAgIDwgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHMgKyBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzICsgcFBjZS0+TnVtQmFja0NoYW5uZWxFbGVtZW50cyArIHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50cwotICAgICkKLSAgeworICBpZiAoKGVsTGlzdFNpemUgPAorICAgICAgIHBQY2UtPk51bUZyb250Q2hhbm5lbEVsZW1lbnRzICsgcFBjZS0+TnVtU2lkZUNoYW5uZWxFbGVtZW50cyArCisgICAgICAgICAgIHBQY2UtPk51bUJhY2tDaGFubmVsRWxlbWVudHMgKyBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHMpIHx8CisgICAgICAocFBjZS0+TnVtQ2hhbm5lbHMgPT0gMCkpIHsKICAgICByZXR1cm4gMDsKICAgfQogCi0gIGZvciAoaT0wOyBpIDwgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGkrKykKLSAgewotICAgIGVsTGlzdFtlbCsrXSA9IChwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtpXSkgPyAgSURfQ1BFIDogSURfU0NFOworICBmb3IgKGkgPSAwOyBpIDwgcFBjZS0+TnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGkgKz0gMSkgeworICAgIGVsTGlzdFtlbCsrXSA9IChwUGNlLT5Gcm9udEVsZW1lbnRJc0NwZVtpXSkgPyBJRF9DUEUgOiBJRF9TQ0U7CiAgIH0KIAotICBmb3IgKGk9MDsgaSA8IHBQY2UtPk51bVNpZGVDaGFubmVsRWxlbWVudHM7IGkrKykKLSAgewotICAgIGVsTGlzdFtlbCsrXSA9IChwUGNlLT5TaWRlRWxlbWVudElzQ3BlW2ldKSA/ICBJRF9DUEUgOiBJRF9TQ0U7CisgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBpICs9IDEpIHsKKyAgICBlbExpc3RbZWwrK10gPSAocFBjZS0+U2lkZUVsZW1lbnRJc0NwZVtpXSkgPyBJRF9DUEUgOiBJRF9TQ0U7CiAgIH0KIAotICBmb3IgKGk9MDsgaSA8IHBQY2UtPk51bUJhY2tDaGFubmVsRWxlbWVudHM7IGkrKykKLSAgewotICAgIGVsTGlzdFtlbCsrXSA9IChwUGNlLT5CYWNrRWxlbWVudElzQ3BlW2ldKSA/ICBJRF9DUEUgOiBJRF9TQ0U7CisgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBpICs9IDEpIHsKKyAgICBlbExpc3RbZWwrK10gPSAocFBjZS0+QmFja0VsZW1lbnRJc0NwZVtpXSkgPyBJRF9DUEUgOiBJRF9TQ0U7CiAgIH0KIAotICBmb3IgKGk9MDsgaSA8IHBQY2UtPk51bUxmZUNoYW5uZWxFbGVtZW50czsgaSsrKQotICB7CisgIGZvciAoaSA9IDA7IGkgPCBwUGNlLT5OdW1MZmVDaGFubmVsRWxlbWVudHM7IGkgKz0gMSkgewogICAgIGVsTGlzdFtlbCsrXSA9IElEX0xGRTsKICAgfQogCi0KICAgLyogRmluZCBhbiBjb3JyZXNwb25kaW5nIGNoYW5uZWwgY29uZmlndXJhdGlvbiBpZiBwb3NzaWJsZSAqLwogICBzd2l0Y2ggKHBQY2UtPk51bUNoYW5uZWxzKSB7Ci0gIGNhc2UgMTogY2FzZSAyOiBjYXNlIDM6IGNhc2UgNDogY2FzZSA1OiBjYXNlIDY6Ci0gICAgLyogT25lIGFuZCB0d28gY2hhbm5lbHMgaGF2ZSBubyBhbHRlcm5hdGl2ZXMuIFRoZSBvdGhlciBvbmVzIGFyZSBtYXBwZWQgZGlyZWN0bHkgdG8gdGhlCi0gICAgICAgY29ycmVzcG9uZGluZyBjaGFubmVsIGNvbmZpZy4gQmVjYXVzZSBvZiBsZWdhY3kgcmVhc29ucyBvciBmb3IgbGFjayBvZiBhbHRlcm5hdGl2ZSBtYXBwaW5ncy4gKi8KLSAgICAqcENoTWFwSWR4ID0gcFBjZS0+TnVtQ2hhbm5lbHM7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgNzoKLSAgICB7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICAgIC8qIE9uZSBhbmQgdHdvIGNoYW5uZWxzIGhhdmUgbm8gYWx0ZXJuYXRpdmVzLiAqLworICAgICAgKnBDaE1hcElkeCA9IHBQY2UtPk51bUNoYW5uZWxzOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgIGNhc2UgNDoKKyAgICBjYXNlIDU6CisgICAgY2FzZSA2OiB7IC8qIFRlc3QgaWYgdGhlIG51bWJlciBvZiBjaGFubmVscyBjYW4gYmUgdXNlZCBhcyBjaGFubmVsIGNvbmZpZzoKKyAgICAgICAgICAgICAgICovCisgICAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQodG1wUGNlLCBDUHJvZ3JhbUNvbmZpZywgMSk7CisgICAgICAvKiBDcmVhdGUgYSBQQ0UgZm9yIHRoZSBjb25maWcgdG8gdGVzdCAuLi4gKi8KKyAgICAgIENQcm9ncmFtQ29uZmlnX0dldERlZmF1bHQodG1wUGNlLCBwUGNlLT5OdW1DaGFubmVscyk7CisgICAgICAvKiAuLi4gYW5kIGNvbXBhcmUgaXQgd2l0aCB0aGUgZ2l2ZW4gb25lLiAqLworICAgICAgKnBDaE1hcElkeCA9ICghKENQcm9ncmFtQ29uZmlnX0NvbXBhcmUocFBjZSwgdG1wUGNlKSAmIDB4RSkpCisgICAgICAgICAgICAgICAgICAgICAgID8gcFBjZS0+TnVtQ2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgOiAwOworICAgICAgLyogSWYgY29tcGFyZSByZXN1bHQgaXMgMCBvciAxIHdlIGNhbiBiZSBzdXJlIHRoYXQgaXQgaXMgY2hhbm5lbAorICAgICAgICogY29uZmlnIDExLiAqLworICAgICAgQ19BTExPQ19TQ1JBVENIX0VORCh0bXBQY2UsIENQcm9ncmFtQ29uZmlnLCAxKTsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgNzogewogICAgICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHRtcFBjZSwgQ1Byb2dyYW1Db25maWcsIDEpOwogICAgICAgLyogQ3JlYXRlIGEgUENFIGZvciB0aGUgY29uZmlnIHRvIHRlc3QgLi4uICovCiAgICAgICBDUHJvZ3JhbUNvbmZpZ19HZXREZWZhdWx0KHRtcFBjZSwgMTEpOwogICAgICAgLyogLi4uIGFuZCBjb21wYXJlIGl0IHdpdGggdGhlIGdpdmVuIG9uZS4gKi8KLSAgICAgICpwQ2hNYXBJZHggPSAoIShDUHJvZ3JhbUNvbmZpZ19Db21wYXJlKHBQY2UsIHRtcFBjZSkmMHhFKSkgPyAxMSA6IDA7Ci0gICAgICAvKiBJZiBjb21wYXJlIHJlc3VsdCBpcyAwIG9yIDEgd2UgY2FuIGJlIHN1cmUgdGhhdCBpdCBpcyBjaGFubmVsIGNvbmZpZyAxMS4gKi8KKyAgICAgICpwQ2hNYXBJZHggPSAoIShDUHJvZ3JhbUNvbmZpZ19Db21wYXJlKHBQY2UsIHRtcFBjZSkgJiAweEUpKSA/IDExIDogMDsKKyAgICAgIC8qIElmIGNvbXBhcmUgcmVzdWx0IGlzIDAgb3IgMSB3ZSBjYW4gYmUgc3VyZSB0aGF0IGl0IGlzIGNoYW5uZWwKKyAgICAgICAqIGNvbmZpZyAxMS4gKi8KICAgICAgIENfQUxMT0NfU0NSQVRDSF9FTkQodG1wUGNlLCBDUHJvZ3JhbUNvbmZpZywgMSk7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIDg6Ci0gICAgeyAvKiBUcnkgdGhlIGZvdXIgcG9zc2libGUgNy4xY2ggY29uZmlndXJhdGlvbnMuIE9uZSBhZnRlciB0aGUgb3RoZXIuICovCi0gICAgICBVQ0hBUiB0ZXN0Q2ZnWzRdID0geyAzMiwgMTQsIDEyLCA3fTsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgODogeyAvKiBUcnkgdGhlIGZvdXIgcG9zc2libGUgNy4xY2ggY29uZmlndXJhdGlvbnMuIE9uZSBhZnRlciB0aGUKKyAgICAgICAgICAgICAgICAgb3RoZXIuICovCisgICAgICBVQ0hBUiB0ZXN0Q2ZnWzRdID0gezMyLCAxNCwgMTIsIDd9OwogICAgICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHRtcFBjZSwgQ1Byb2dyYW1Db25maWcsIDEpOwotICAgICAgZm9yIChpPTA7IGk8NDsgaSs9MSkgeworICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkgKz0gMSkgewogICAgICAgICAvKiBDcmVhdGUgYSBQQ0UgZm9yIHRoZSBjb25maWcgdG8gdGVzdCAuLi4gKi8KICAgICAgICAgQ1Byb2dyYW1Db25maWdfR2V0RGVmYXVsdCh0bXBQY2UsIHRlc3RDZmdbaV0pOwogICAgICAgICAvKiAuLi4gYW5kIGNvbXBhcmUgaXQgd2l0aCB0aGUgZ2l2ZW4gb25lLiAqLwotICAgICAgICBpZiAoIShDUHJvZ3JhbUNvbmZpZ19Db21wYXJlKHBQY2UsIHRtcFBjZSkmMHhFKSkgewotICAgICAgICAgIC8qIElmIHRoZSBjb21wYXJlIHJlc3VsdCBpcyAwIG9yIDEgdGhhbiB0aGUgdHdvIGNoYW5uZWwgY29uZmlndXJhdGlvbnMgbWF0Y2guICovCi0gICAgICAgICAgLyogRXhwbGljaXQgbWFwcGluZyBvZiA3LjEgc2lkZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gdG8gNy4xIHJlYXIgY2hhbm5lbCBtYXBwaW5nLiAqLwotICAgICAgICAgICpwQ2hNYXBJZHggPSAodGVzdENmZ1tpXT09MzIpID8gMTIgOiB0ZXN0Q2ZnW2ldOworICAgICAgICBpZiAoIShDUHJvZ3JhbUNvbmZpZ19Db21wYXJlKHBQY2UsIHRtcFBjZSkgJiAweEUpKSB7CisgICAgICAgICAgLyogSWYgdGhlIGNvbXBhcmUgcmVzdWx0IGlzIDAgb3IgMSB0aGFuIHRoZSB0d28gY2hhbm5lbCBjb25maWd1cmF0aW9ucworICAgICAgICAgICAqIG1hdGNoLiAqLworICAgICAgICAgIC8qIEV4cGxpY2l0IG1hcHBpbmcgb2YgNy4xIHNpZGUgY2hhbm5lbCBjb25maWd1cmF0aW9uIHRvIDcuMSByZWFyCisgICAgICAgICAgICogY2hhbm5lbCBtYXBwaW5nLiAqLworICAgICAgICAgICpwQ2hNYXBJZHggPSAodGVzdENmZ1tpXSA9PSAzMikgPyAxMiA6IHRlc3RDZmdbaV07CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIENfQUxMT0NfU0NSQVRDSF9FTkQodG1wUGNlLCBDUHJvZ3JhbUNvbmZpZywgMSk7Ci0gICAgfQotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIC8qIFRoZSBQQ0UgZG9lcyBub3QgbWF0Y2ggYW55IHByZWRlZmluZWQgY2hhbm5lbCBjb25maWd1cmF0aW9uLiAqLwotICAgICpwQ2hNYXBJZHggPSAwOwotICAgIGJyZWFrOworICAgIH0gYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIFRoZSBQQ0UgZG9lcyBub3QgbWF0Y2ggYW55IHByZWRlZmluZWQgY2hhbm5lbCBjb25maWd1cmF0aW9uLiAqLworICAgICAgKnBDaE1hcElkeCA9IDA7CisgICAgICBicmVhazsKICAgfQogCiAgIHJldHVybiBlbDsKIH0KLSNlbmRpZgogCi1zdGF0aWMgQVVESU9fT0JKRUNUX1RZUEUgZ2V0QU9UKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzKQoteworc3RhdGljIEFVRElPX09CSkVDVF9UWVBFIGdldEFPVChIQU5ETEVfRkRLX0JJVFNUUkVBTSBicykgewogICBpbnQgdG1wID0gMDsKIAotICB0bXAgPSBGREtyZWFkQml0cyhicyw1KTsKKyAgdG1wID0gRkRLcmVhZEJpdHMoYnMsIDUpOwogICBpZiAodG1wID09IEFPVF9FU0NBUEUpIHsKLSAgICBpbnQgdG1wMiA9IEZES3JlYWRCaXRzKGJzLDYpOworICAgIGludCB0bXAyID0gRkRLcmVhZEJpdHMoYnMsIDYpOwogICAgIHRtcCA9IDMyICsgdG1wMjsKICAgfQogCiAgIHJldHVybiAoQVVESU9fT0JKRUNUX1RZUEUpdG1wOwogfQogCi1zdGF0aWMgSU5UIGdldFNhbXBsZVJhdGUoSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIFVDSEFSICppbmRleCwgaW50IG5CaXRzKQoteworc3RhdGljIElOVCBnZXRTYW1wbGVSYXRlKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBVQ0hBUiAqaW5kZXgsIGludCBuQml0cykgewogICBJTlQgc2FtcGxlUmF0ZTsKICAgaW50IGlkeDsKIAogICBpZHggPSBGREtyZWFkQml0cyhicywgbkJpdHMpOwotICBpZiggaWR4ID09ICgxPDxuQml0cyktMSApIHsKLSAgICBpZihGREtnZXRWYWxpZEJpdHMoYnMpIDwgMjQpIHsKKyAgaWYgKGlkeCA9PSAoMSA8PCBuQml0cykgLSAxKSB7CisgICAgaWYgKEZES2dldFZhbGlkQml0cyhicykgPCAyNCkgewogICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHNhbXBsZVJhdGUgPSBGREtyZWFkQml0cyhicywyNCk7CisgICAgc2FtcGxlUmF0ZSA9IEZES3JlYWRCaXRzKGJzLCAyNCk7CiAgIH0gZWxzZSB7CiAgICAgc2FtcGxlUmF0ZSA9IFNhbXBsaW5nUmF0ZVRhYmxlW2lkeF07CiAgIH0KQEAgLTk5OSwxMzIgKzEyMTQsMTY0IEBACiAgIHJldHVybiBzYW1wbGVSYXRlOwogfQogCi0jaWZkZWYgVFBfR0FfRU5BQkxFCi1zdGF0aWMKLVRSQU5TUE9SVERFQ19FUlJPUiBHYVNwZWNpZmljQ29uZmlnX1BhcnNlKCBDU0dhU3BlY2lmaWNDb25maWcgICAgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICphc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICBicywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgIGFzY1N0YXJ0QW5jaG9yICkKLXsKK3N0YXRpYyBUUkFOU1BPUlRERUNfRVJST1IgR2FTcGVjaWZpY0NvbmZpZ19QYXJzZShDU0dhU3BlY2lmaWNDb25maWcgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICphc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBhc2NTdGFydEFuY2hvcikgewogICBUUkFOU1BPUlRERUNfRVJST1IgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfT0s7CiAKLSAgc2VsZi0+bV9mcmFtZUxlbmd0aEZsYWcgPSBGREtyZWFkQml0cyhicywxKTsKKyAgc2VsZi0+bV9mcmFtZUxlbmd0aEZsYWcgPSBGREtyZWFkQml0cyhicywgMSk7CiAKLSAgc2VsZi0+bV9kZXBlbmRzT25Db3JlQ29kZXIgPSBGREtyZWFkQml0cyhicywxKTsKKyAgc2VsZi0+bV9kZXBlbmRzT25Db3JlQ29kZXIgPSBGREtyZWFkQml0cyhicywgMSk7CiAKLSAgaWYoIHNlbGYtPm1fZGVwZW5kc09uQ29yZUNvZGVyICkKLSAgICBzZWxmLT5tX2NvcmVDb2RlckRlbGF5ID0gRkRLcmVhZEJpdHMoYnMsMTQpOworICBpZiAoc2VsZi0+bV9kZXBlbmRzT25Db3JlQ29kZXIpIHNlbGYtPm1fY29yZUNvZGVyRGVsYXkgPSBGREtyZWFkQml0cyhicywgMTQpOwogCi0gIHNlbGYtPm1fZXh0ZW5zaW9uRmxhZyA9IEZES3JlYWRCaXRzKGJzLDEpOworICBzZWxmLT5tX2V4dGVuc2lvbkZsYWcgPSBGREtyZWFkQml0cyhicywgMSk7CiAKLSAgaWYoIGFzYy0+bV9jaGFubmVsQ29uZmlndXJhdGlvbiA9PSAwICkgeworICBpZiAoYXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uID09IDApIHsKICAgICBDUHJvZ3JhbUNvbmZpZ19SZWFkKCZhc2MtPm1fcHJvZ3JDb25maWdFbGVtZW50LCBicywgYXNjU3RhcnRBbmNob3IpOwogICB9CiAKICAgaWYgKChhc2MtPm1fYW90ID09IEFPVF9BQUNfU0NBTCkgfHwgKGFzYy0+bV9hb3QgPT0gQU9UX0VSX0FBQ19TQ0FMKSkgewotICAgIHNlbGYtPm1fbGF5ZXIgPSBGREtyZWFkQml0cyhicywzKTsKKyAgICBzZWxmLT5tX2xheWVyID0gRkRLcmVhZEJpdHMoYnMsIDMpOwogICB9CiAKICAgaWYgKHNlbGYtPm1fZXh0ZW5zaW9uRmxhZykgewogICAgIGlmIChhc2MtPm1fYW90ID09IEFPVF9FUl9CU0FDKSB7Ci0gICAgICBzZWxmLT5tX251bU9mU3ViRnJhbWUgPSBGREtyZWFkQml0cyhicyw1KTsKLSAgICAgIHNlbGYtPm1fbGF5ZXJMZW5ndGggICA9IEZES3JlYWRCaXRzKGJzLDExKTsKKyAgICAgIHNlbGYtPm1fbnVtT2ZTdWJGcmFtZSA9IEZES3JlYWRCaXRzKGJzLCA1KTsKKyAgICAgIHNlbGYtPm1fbGF5ZXJMZW5ndGggPSBGREtyZWFkQml0cyhicywgMTEpOwogICAgIH0KIAotICAgIGlmICgoYXNjLT5tX2FvdCA9PSBBT1RfRVJfQUFDX0xDKSAgIHx8IChhc2MtPm1fYW90ID09IEFPVF9FUl9BQUNfTFRQKSAgfHwKLSAgICAgICAgKGFzYy0+bV9hb3QgPT0gQU9UX0VSX0FBQ19TQ0FMKSB8fCAoYXNjLT5tX2FvdCA9PSBBT1RfRVJfQUFDX0xEKSkKLSAgICB7Ci0gICAgICBhc2MtPm1fdmNiMTFGbGFnID0gRkRLcmVhZEJpdHMoYnMsMSk7IC8qIGFhY1NlY3Rpb25EYXRhUmVzaWxpZW5jZUZsYWcgKi8KLSAgICAgIGFzYy0+bV9ydmxjRmxhZyAgPSBGREtyZWFkQml0cyhicywxKTsgLyogYWFjU2NhbGVmYWN0b3JEYXRhUmVzaWxpZW5jZUZsYWcgKi8KLSAgICAgIGFzYy0+bV9oY3JGbGFnICAgPSBGREtyZWFkQml0cyhicywxKTsgLyogYWFjU3BlY3RyYWxEYXRhUmVzaWxpZW5jZUZsYWcgKi8KKyAgICBpZiAoKGFzYy0+bV9hb3QgPT0gQU9UX0VSX0FBQ19MQykgfHwgKGFzYy0+bV9hb3QgPT0gQU9UX0VSX0FBQ19MVFApIHx8CisgICAgICAgIChhc2MtPm1fYW90ID09IEFPVF9FUl9BQUNfU0NBTCkgfHwgKGFzYy0+bV9hb3QgPT0gQU9UX0VSX0FBQ19MRCkpIHsKKyAgICAgIGFzYy0+bV92Y2IxMUZsYWcgPSBGREtyZWFkQml0cyhicywgMSk7IC8qIGFhY1NlY3Rpb25EYXRhUmVzaWxpZW5jZUZsYWcgKi8KKyAgICAgIGFzYy0+bV9ydmxjRmxhZyA9CisgICAgICAgICAgRkRLcmVhZEJpdHMoYnMsIDEpOyAvKiBhYWNTY2FsZWZhY3RvckRhdGFSZXNpbGllbmNlRmxhZyAqLworICAgICAgYXNjLT5tX2hjckZsYWcgPSBGREtyZWFkQml0cyhicywgMSk7IC8qIGFhY1NwZWN0cmFsRGF0YVJlc2lsaWVuY2VGbGFnICovCiAgICAgfQogCi0gICAgc2VsZi0+bV9leHRlbnNpb25GbGFnMyA9IEZES3JlYWRCaXRzKGJzLDEpOwotCisgICAgc2VsZi0+bV9leHRlbnNpb25GbGFnMyA9IEZES3JlYWRCaXRzKGJzLCAxKTsKICAgfQogICByZXR1cm4gKEVycm9yU3RhdHVzKTsKIH0KLSNlbmRpZiAvKiBUUF9HQV9FTkFCTEUgKi8KIAorc3RhdGljIElOVCBza2lwU2JySGVhZGVyKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgaW50IGlzVXNhYykgeworICAvKiBEdW1teSBwYXJzZSBTYnJEZmx0SGVhZGVyKCkgKi8KKyAgSU5UIGRmbHRfaGVhZGVyX2V4dHJhMSwgZGZsdF9oZWFkZXJfZXh0cmEyLCBiaXRzVG9Ta2lwID0gMDsKIAorICBpZiAoIWlzVXNhYykgeworICAgIGJpdHNUb1NraXAgPSA2OworICAgIEZES3B1c2hGb3IoaEJzLCA2KTsgLyogYW1wIHJlcyAxLCB4b3ZlciBmcmVxIDMsIHJlc2VydmVkIDIgKi8KKyAgfQorICBiaXRzVG9Ta2lwICs9IDg7CisgIEZES3B1c2hGb3IoaEJzLCA4KTsgLyogc3RhcnQgLyBzdG9wIGZyZXEgKi8KKyAgYml0c1RvU2tpcCArPSAyOworICBkZmx0X2hlYWRlcl9leHRyYTEgPSBGREtyZWFkQml0KGhCcyk7CisgIGRmbHRfaGVhZGVyX2V4dHJhMiA9IEZES3JlYWRCaXQoaEJzKTsKKyAgYml0c1RvU2tpcCArPSA1ICogZGZsdF9oZWFkZXJfZXh0cmExICsgNiAqIGRmbHRfaGVhZGVyX2V4dHJhMjsKKyAgRkRLcHVzaEZvcihoQnMsIDUgKiBkZmx0X2hlYWRlcl9leHRyYTEgKyA2ICogZGZsdF9oZWFkZXJfZXh0cmEyKTsKIAorICByZXR1cm4gYml0c1RvU2tpcDsKK30KIAotCi0jaWZkZWYgVFBfRUxEX0VOQUJMRQotCi1zdGF0aWMgSU5UIGxkX3Nicl9oZWFkZXIoIGNvbnN0IENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqYXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IgKQoteworc3RhdGljIElOVCBsZF9zYnJfaGVhZGVyKENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqYXNjLCBjb25zdCBJTlQgZHNGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBDU1RwQ2FsbEJhY2tzICpjYikgewogICBjb25zdCBpbnQgY2hhbm5lbENvbmZpZ3VyYXRpb24gPSBhc2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb247Ci0gIGludCBpID0gMDsKKyAgaW50IGkgPSAwLCBqID0gMDsKICAgSU5UIGVycm9yID0gMDsKKyAgTVA0X0VMRU1FTlRfSUQgZWxlbWVudCA9IElEX05PTkU7CiAKLSAgaWYgKGNoYW5uZWxDb25maWd1cmF0aW9uID09IDIpIHsKLSAgICBlcnJvciA9IGNiLT5jYlNicihjYi0+Y2JTYnJEYXRhLCBoQnMsIGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSwgYXNjLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5LCBhc2MtPm1fc2FtcGxlc1BlckZyYW1lLCBBT1RfRVJfQUFDX0VMRCwgSURfQ1BFLCBpKyspOwotICB9IGVsc2UgewotICAgIGVycm9yID0gY2ItPmNiU2JyKGNiLT5jYlNickRhdGEsIGhCcywgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5LCBhc2MtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3ksIGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUsIEFPVF9FUl9BQUNfRUxELCBJRF9TQ0UsIGkrKyk7CisgIC8qIGNoZWNrIHdoZXRoZXIgdGhlIGNoYW5uZWxDb25maWd1cmF0aW9uIGlzIGRlZmluZWQgaW4KKyAgICogY2hhbm5lbF9jb25maWd1cmF0aW9uX2FycmF5ICovCisgIGlmIChjaGFubmVsQ29uZmlndXJhdGlvbiA8IDAgfHwKKyAgICAgIGNoYW5uZWxDb25maWd1cmF0aW9uID4gKElOVCkoc2l6ZW9mKGNoYW5uZWxfY29uZmlndXJhdGlvbl9hcnJheSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE1QNF9FTEVNRU5UX0lEICoqKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpKSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKICAgfQogCi0gIHN3aXRjaCAoIGNoYW5uZWxDb25maWd1cmF0aW9uICkgewotICAgIGNhc2UgMTQ6Ci0gICAgY2FzZSAxMjoKLSAgICBjYXNlIDc6Ci0gICAgICBlcnJvciB8PSBjYi0+Y2JTYnIoY2ItPmNiU2JyRGF0YSwgaEJzLCBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3ksIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSwgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSwgQU9UX0VSX0FBQ19FTEQsIElEX0NQRSwgaSsrKTsKLSAgICBjYXNlIDY6Ci0gICAgY2FzZSA1OgotICAgICAgZXJyb3IgfD0gY2ItPmNiU2JyKGNiLT5jYlNickRhdGEsIGhCcywgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5LCBhc2MtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3ksIGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUsIEFPVF9FUl9BQUNfRUxELCBJRF9DUEUsIGkrKyk7Ci0gICAgY2FzZSAzOgotICAgICAgZXJyb3IgfD0gY2ItPmNiU2JyKGNiLT5jYlNickRhdGEsIGhCcywgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5LCBhc2MtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3ksIGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUsIEFPVF9FUl9BQUNfRUxELCBJRF9DUEUsIGkrKyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMTE6Ci0gICAgICBlcnJvciB8PSBjYi0+Y2JTYnIoY2ItPmNiU2JyRGF0YSwgaEJzLCBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3ksIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSwgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSwgQU9UX0VSX0FBQ19FTEQsIElEX0NQRSwgaSsrKTsKLSAgICBjYXNlIDQ6Ci0gICAgICBlcnJvciB8PSBjYi0+Y2JTYnIoY2ItPmNiU2JyRGF0YSwgaEJzLCBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3ksIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSwgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSwgQU9UX0VSX0FBQ19FTEQsIElEX0NQRSwgaSsrKTsKLSAgICAgIGVycm9yIHw9IGNiLT5jYlNicihjYi0+Y2JTYnJEYXRhLCBoQnMsIGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSwgYXNjLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5LCBhc2MtPm1fc2FtcGxlc1BlckZyYW1lLCBBT1RfRVJfQUFDX0VMRCwgSURfU0NFLCBpKyspOwotICAgICAgYnJlYWs7CisgIC8qIHJlYWQgZWxlbWVudHMgb2YgdGhlIHBhc3NlZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24gdW50aWwgdGhlcmUgaXMgSURfTk9ORSAqLworICB3aGlsZSAoKGVsZW1lbnQgPSBjaGFubmVsX2NvbmZpZ3VyYXRpb25fYXJyYXlbY2hhbm5lbENvbmZpZ3VyYXRpb25dW2pdKSAhPQorICAgICAgICAgSURfTk9ORSkgeworICAgIGlmIChlbGVtZW50ID09IElEX1NDRSB8fCBlbGVtZW50ID09IElEX0NQRSkgeworICAgICAgZXJyb3IgfD0gY2ItPmNiU2JyKAorICAgICAgICAgIGNiLT5jYlNickRhdGEsIGhCcywgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5IC8gZHNGYWN0b3IsCisgICAgICAgICAgYXNjLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5IC8gZHNGYWN0b3IsCisgICAgICAgICAgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSAvIGRzRmFjdG9yLCBBT1RfRVJfQUFDX0VMRCwgZWxlbWVudCwgaSsrLCAwLCAwLAorICAgICAgICAgIGFzYy0+Y29uZmlnTW9kZSwgJmFzYy0+U2JyQ29uZmlnQ2hhbmdlZCwgZHNGYWN0b3IpOworICAgICAgaWYgKGVycm9yICE9IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfQorICAgIGorKzsKICAgfQotCitiYWlsOgogICByZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYwotVFJBTlNQT1JUREVDX0VSUk9SIEVsZFNwZWNpZmljQ29uZmlnX1BhcnNlKAotICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKmFzYywKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAotICAgICAgICBDU1RwQ2FsbEJhY2tzICpjYgotICAgICAgICApCi17CitzdGF0aWMgVFJBTlNQT1JUREVDX0VSUk9SIEVsZFNwZWNpZmljQ29uZmlnX1BhcnNlKENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqYXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTVHBDYWxsQmFja3MgKmNiKSB7CiAgIFRSQU5TUE9SVERFQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19PSzsKICAgQ1NFbGRTcGVjaWZpY0NvbmZpZyAqZXNjID0gJmFzYy0+bV9zYy5tX2VsZFNwZWNpZmljQ29uZmlnOwogICBBU0NfRUxEX0VYVF9UWVBFIGVsZEV4dFR5cGU7Ci0gIGludCBlbGRFeHRMZW4sIGxlbiwgY250OworICBpbnQgZWxkRXh0TGVuLCBsZW4sIGNudCwgbGRTYnJMZW4gPSAwLCBlbGRFeHRMZW5TdW0sIG51bVNickhlYWRlciA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJJbmRleDsKKworICB1bnNpZ25lZCBjaGFyIGRvd25zY2FsZV9maWxsX25pYmJsZTsKIAogICBGREttZW1jbGVhcihlc2MsIHNpemVvZihDU0VsZFNwZWNpZmljQ29uZmlnKSk7CiAKLSAgZXNjLT5tX2ZyYW1lTGVuZ3RoRmxhZyA9IEZES3JlYWRCaXRzKGhCcywgMSApOworICBlc2MtPm1fZnJhbWVMZW5ndGhGbGFnID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKICAgaWYgKGVzYy0+bV9mcmFtZUxlbmd0aEZsYWcpIHsKICAgICBhc2MtPm1fc2FtcGxlc1BlckZyYW1lID0gNDgwOwogICB9IGVsc2UgewogICAgIGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUgPSA1MTI7CiAgIH0KIAotICBhc2MtPm1fdmNiMTFGbGFnID0gRkRLcmVhZEJpdHMoaEJzLCAxICk7Ci0gIGFzYy0+bV9ydmxjRmxhZyAgPSBGREtyZWFkQml0cyhoQnMsIDEgKTsKLSAgYXNjLT5tX2hjckZsYWcgICA9IEZES3JlYWRCaXRzKGhCcywgMSApOworICBhc2MtPm1fdmNiMTFGbGFnID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgYXNjLT5tX3J2bGNGbGFnID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgYXNjLT5tX2hjckZsYWcgPSBGREtyZWFkQml0cyhoQnMsIDEpOwogCi0gIGVzYy0+bV9zYnJQcmVzZW50RmxhZyAgICAgPSBGREtyZWFkQml0cyhoQnMsIDEgKTsKKyAgZXNjLT5tX3NiclByZXNlbnRGbGFnID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKIAogICBpZiAoZXNjLT5tX3NiclByZXNlbnRGbGFnID09IDEpIHsKLSAgICBlc2MtPm1fc2JyU2FtcGxpbmdSYXRlICAgID0gRkRLcmVhZEJpdHMoaEJzLCAxICk7IC8qIDA6IHNpbmdsZSByYXRlLCAxOiBkdWFsIHJhdGUgKi8KLSAgICBlc2MtPm1fc2JyQ3JjRmxhZyAgICAgICAgID0gRkRLcmVhZEJpdHMoaEJzLCAxICk7CisgICAgZXNjLT5tX3NiclNhbXBsaW5nUmF0ZSA9CisgICAgICAgIEZES3JlYWRCaXRzKGhCcywgMSk7IC8qIDA6IHNpbmdsZSByYXRlLCAxOiBkdWFsIHJhdGUgKi8KKyAgICBlc2MtPm1fc2JyQ3JjRmxhZyA9IEZES3JlYWRCaXRzKGhCcywgMSk7CiAKLSAgICBhc2MtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3kgPSBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3kgPDwgZXNjLT5tX3NiclNhbXBsaW5nUmF0ZTsKKyAgICBhc2MtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3kgPSBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlc2MtPm1fc2JyU2FtcGxpbmdSYXRlOwogCi0gICAgaWYgKGNiLT5jYlNiciAhPSBOVUxMKXsKLSAgICAgIGlmICggMCAhPSBsZF9zYnJfaGVhZGVyKGFzYywgaEJzLCBjYikgKSB7Ci0gICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgaWYgKGNiLT5jYlNiciAhPSBOVUxMKSB7CisgICAgICAvKiBFTEQgcmVkdWNlZCBkZWxheSBtb2RlOiBMRC1TQlIgaW5pdGlhbGl6YXRpb24gaGFzIHRvIGtub3cgdGhlIGRvd25zY2FsZQorICAgICAgICAgaW5mb3JtYXRpb24uIFBvc3Rwb25lIExELVNCUiBpbml0aWFsaXphdGlvbiBhbmQgcmVhZCBFTEQgZXh0ZW5zaW9uCisgICAgICAgICBpbmZvcm1hdGlvbiBmaXJzdC4gKi8KKyAgICAgIHN3aXRjaCAoYXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIG51bVNickhlYWRlciA9IDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICBudW1TYnJIZWFkZXIgPSAyOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgIG51bVNickhlYWRlciA9IDM7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgY2FzZSAxMToKKyAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICBudW1TYnJIZWFkZXIgPSA0OworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIG51bVNickhlYWRlciA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBmb3IgKHNickluZGV4ID0gMDsgc2JySW5kZXggPCBudW1TYnJIZWFkZXI7IHNickluZGV4KyspIHsKKyAgICAgICAgbGRTYnJMZW4gKz0gc2tpcFNickhlYWRlcihoQnMsIDApOwogICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKQEAgLTExMzMsODUgKzEzODAsNjg2IEBACiAgIGVzYy0+bV91c2VMZFFtZlRpbWVBbGlnbiA9IDA7CiAKICAgLyogbmV3IEVMRCBzeW50YXggKi8KKyAgZWxkRXh0TGVuU3VtID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisgIGVzYy0+bV9kb3duc2NhbGVkU2FtcGxpbmdGcmVxdWVuY3kgPSBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3k7CiAgIC8qIHBhcnNlIEV4dFR5cGVDb25maWdEYXRhICovCi0gIHdoaWxlICgoZWxkRXh0VHlwZSA9IChBU0NfRUxEX0VYVF9UWVBFKUZES3JlYWRCaXRzKGhCcywgNCApKSAhPSBFTERFWFRfVEVSTSkgewotICAgIGVsZEV4dExlbiA9IGxlbiA9IEZES3JlYWRCaXRzKGhCcywgNCApOwotICAgIGlmICggbGVuID09IDB4ZiApIHsKLSAgICAgIGxlbiA9IEZES3JlYWRCaXRzKGhCcywgOCApOworICB3aGlsZSAoCisgICAgICAoKGVsZEV4dFR5cGUgPSAoQVNDX0VMRF9FWFRfVFlQRSlGREtyZWFkQml0cyhoQnMsIDQpKSAhPSBFTERFWFRfVEVSTSkgJiYKKyAgICAgICgoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpID49IDApKSB7CisgICAgZWxkRXh0TGVuID0gbGVuID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICBpZiAobGVuID09IDB4ZikgeworICAgICAgbGVuID0gRkRLcmVhZEJpdHMoaEJzLCA4KTsKICAgICAgIGVsZEV4dExlbiArPSBsZW47CiAKLSAgICAgIGlmICggbGVuID09IDB4ZmYgKSB7Ci0gICAgICAgIGxlbiA9IEZES3JlYWRCaXRzKGhCcywgMTYgKTsKKyAgICAgIGlmIChsZW4gPT0gMHhmZikgeworICAgICAgICBsZW4gPSBGREtyZWFkQml0cyhoQnMsIDE2KTsKICAgICAgICAgZWxkRXh0TGVuICs9IGxlbjsKICAgICAgIH0KICAgICB9CiAKICAgICBzd2l0Y2ggKGVsZEV4dFR5cGUpIHsKKyAgICAgIGNhc2UgRUxERVhUX0xEU0FDOgorICAgICAgICBlc2MtPm1fdXNlTGRRbWZUaW1lQWxpZ24gPSAxOworICAgICAgICBpZiAoY2ItPmNiU3NjICE9IE5VTEwpIHsKKyAgICAgICAgICBFcnJvclN0YXR1cyA9IChUUkFOU1BPUlRERUNfRVJST1IpY2ItPmNiU3NjKAorICAgICAgICAgICAgICBjYi0+Y2JTc2NEYXRhLCBoQnMsIGFzYy0+bV9hb3QsIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgMSwgIC8qIHN0ZXJlb0NvbmZpZ0luZGV4ICovCisgICAgICAgICAgICAgIC0xLCAvKiBuVGltZVNsb3RzOiByZWFkIGZyb20gYml0c3RyZWFtICovCisgICAgICAgICAgICAgIGVsZEV4dExlbiwgYXNjLT5jb25maWdNb2RlLCAmYXNjLT5TYWNDb25maWdDaGFuZ2VkKTsKKyAgICAgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGZvcihjbnQ9MDsgY250PGVsZEV4dExlbjsgY250KyspIHsKLSAgICAgICAgICBGREtyZWFkQml0cyhoQnMsIDggKTsKKyAgICAgICAgZm9yIChjbnQgPSAwOyBjbnQgPCBlbGRFeHRMZW47IGNudCsrKSB7CisgICAgICAgICAgRkRLcmVhZEJpdHMoaEJzLCA4KTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKLSAgICAgIC8qIGFkZCBmdXR1cmUgZWxkIGV4dGVuc2lvbiBjb25maWdzIGhlcmUgKi8KKworICAgICAgY2FzZSBFTERFWFRfRE9XTlNDQUxFSU5GTzoKKyAgICAgICAgVUNIQVIgdG1wRG93bnNjYWxlRnJlcUlkeDsKKyAgICAgICAgZXNjLT5tX2Rvd25zY2FsZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9CisgICAgICAgICAgICBnZXRTYW1wbGVSYXRlKGhCcywgJnRtcERvd25zY2FsZUZyZXFJZHgsIDQpOworICAgICAgICBpZiAoZXNjLT5tX2Rvd25zY2FsZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9PSAwKSB7CisgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBkb3duc2NhbGVfZmlsbF9uaWJibGUgPSBGREtyZWFkQml0cyhoQnMsIDQpOworICAgICAgICBpZiAoZG93bnNjYWxlX2ZpbGxfbmliYmxlICE9IDB4MCkgeworICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgfQogICB9Ci1iYWlsOgorCisgIGlmICgoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpIDwgMCkgeworICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgIH0KKworICBpZiAoZXNjLT5tX3NiclByZXNlbnRGbGFnID09IDEgJiYgbnVtU2JySGVhZGVyICE9IDApIHsKKyAgICBJTlQgZHNGYWN0b3IgPSAxOyAvKiBEb3duc2NhbGUgZmFjdG9yIG11c3QgYmUgMSBvciBldmVuIGZvciBTQlIgKi8KKyAgICBpZiAoZXNjLT5tX2Rvd25zY2FsZWRTYW1wbGluZ0ZyZXF1ZW5jeSAhPSAwKSB7CisgICAgICBpZiAoYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5ICUgZXNjLT5tX2Rvd25zY2FsZWRTYW1wbGluZ0ZyZXF1ZW5jeSAhPSAwKSB7CisgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOworICAgICAgfQorICAgICAgZHNGYWN0b3IgPSBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3kgLyBlc2MtPm1fZG93bnNjYWxlZFNhbXBsaW5nRnJlcXVlbmN5OworICAgICAgaWYgKGRzRmFjdG9yICE9IDEgJiYgKGRzRmFjdG9yKSYxKSB7CisgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOyAvKiBTQlIgbmVlZHMgYW4gZXZlbiBkb3duc2NhbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvciAqLworICAgICAgfQorICAgICAgaWYgKGRzRmFjdG9yICE9IDEgJiYgZHNGYWN0b3IgIT0gMiAmJiBkc0ZhY3RvciAhPSA0KSB7CisgICAgICAgIGRzRmFjdG9yID0gMTsgLyogZG9uJ3QgYXBwbHkgZHNmIGZvciBub3QgeWV0IHN1cHBvcnRlZCBldmVuIGRzZnMgKi8KKyAgICAgIH0KKyAgICAgIGlmICgoSU5UKWFzYy0+bV9zYW1wbGVzUGVyRnJhbWUgJSBkc0ZhY3RvciAhPSAwKSB7CisgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOyAvKiBmcmFtZVNpemUvZHNmIG11c3QgYmUgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVnZXIgbnVtYmVyICovCisgICAgICB9CisgICAgfQorICAgIGVsZEV4dExlblN1bSA9IGVsZEV4dExlblN1bSAtIEZES2dldFZhbGlkQml0cyhoQnMpOworICAgIEZES3B1c2hCYWNrKGhCcywgZWxkRXh0TGVuU3VtICsgbGRTYnJMZW4pOworICAgIGlmICgwICE9IGxkX3Nicl9oZWFkZXIoYXNjLCBkc0ZhY3RvciwgaEJzLCBjYikpIHsKKyAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgfQorICAgIEZES3B1c2hGb3IoaEJzLCBlbGRFeHRMZW5TdW0pOworICB9CiAgIHJldHVybiAoRXJyb3JTdGF0dXMpOwogfQotI2VuZGlmIC8qIFRQX0VMRF9FTkFCTEUgKi8KIAorLyoKK1N1YnJvdXRpbmUgdG8gc3RvcmUgY29uZmlnIGluIFVDSEFSIGJ1ZmZlci4gQml0IHN0cmVhbSBwb3NpdGlvbiBkb2VzIG5vdCBjaGFuZ2UuCisqLworc3RhdGljIFVJTlQgU3RvcmVDb25maWdBc0JpdHN0cmVhbSgKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIGNvbnN0IElOVCBjb25maWdTaXplX2JpdHMsIC8qIElmIDwgMCAoPiAwKSBjb25maWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlYWQgaXMgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWZ0ZXIpIGN1cnJlbnQgYml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gcG9zaXRpb24uICovCisgICAgVUNIQVIgKmNvbmZpZ1RhcmdldEJ1ZmZlciwgY29uc3QgVVNIT1JUIGNvbmZpZ1RhcmdldEJ1ZmZlclNpemVfYnl0ZXMpIHsKKyAgRkRLX0JJVFNUUkVBTSB1c2FjQ29uZjsKKyAgVUlOVCBjb25zdCBuQml0cyA9IGZBYnMoY29uZmlnU2l6ZV9iaXRzKTsKKyAgVUlOVCBqLCB0bXA7CiAKLXN0YXRpYwotVFJBTlNQT1JUREVDX0VSUk9SIEF1ZGlvU3BlY2lmaWNDb25maWdfRXh0ZW5zaW9uUGFyc2UoQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpzZWxmLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgQ1NUcENhbGxCYWNrcyAqY2IpCi17Ci0gIFRQX0FTQ19FWFRFTlNJT05fSUQgIGxhc3RBc2NFeHQsIGFzY0V4dElkID0gQVNDRVhUX1VOS09XTjsKLSAgSU5UICBiaXRzQXZhaWxhYmxlID0gKElOVClGREtnZXRWYWxpZEJpdHMoYnMpOworICBpZiAobkJpdHMgPiA4ICogKFVJTlQpY29uZmlnVGFyZ2V0QnVmZmVyU2l6ZV9ieXRlcykgeworICAgIHJldHVybiAxOworICB9CisgIEZES21lbWNsZWFyKGNvbmZpZ1RhcmdldEJ1ZmZlciwgY29uZmlnVGFyZ2V0QnVmZmVyU2l6ZV9ieXRlcyk7CiAKLSAgd2hpbGUgKGJpdHNBdmFpbGFibGUgPj0gMTEpCisgIEZES2luaXRCaXRTdHJlYW0oJnVzYWNDb25mLCBjb25maWdUYXJnZXRCdWZmZXIsIGNvbmZpZ1RhcmdldEJ1ZmZlclNpemVfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgbkJpdHMsIEJTX1dSSVRFUik7CisgIGlmIChjb25maWdTaXplX2JpdHMgPCAwKSB7CisgICAgRkRLcHVzaEJhY2soaEJzLCBuQml0cyk7CisgIH0KKyAgZm9yIChqID0gbkJpdHM7IGogPiAzMTsgaiAtPSAzMikgeworICAgIHRtcCA9IEZES3JlYWRCaXRzKGhCcywgMzIpOworICAgIEZES3dyaXRlQml0cygmdXNhY0NvbmYsIHRtcCwgMzIpOworICB9CisgIGlmIChqID4gMCkgeworICAgIHRtcCA9IEZES3JlYWRCaXRzKGhCcywgaik7CisgICAgRkRLd3JpdGVCaXRzKCZ1c2FjQ29uZiwgdG1wLCBqKTsKKyAgfQorICBGREtzeW5jQ2FjaGUoJnVzYWNDb25mKTsKKyAgaWYgKGNvbmZpZ1NpemVfYml0cyA+IDApIHsKKyAgICBGREtwdXNoQmFjayhoQnMsIG5CaXRzKTsKKyAgfQorCisgIHJldHVybiAwOworfQorCisvKiBtYXBzIGNvcmVTYnJGcmFtZUxlbmd0aEluZGV4IHRvIGNvcmVDb2RlckZyYW1lTGVuZ3RoICovCitzdGF0aWMgY29uc3QgVVNIT1JUIHVzYWNGcmFtZUxlbmd0aFs4XSA9IHs3NjgsIDEwMjQsIDIwNDgsIDIwNDgsIDQwOTYsIDAsIDAsIDB9OworLyogbWFwcyBjb3JlU2JyRnJhbWVMZW5ndGhJbmRleCB0byBzYnJSYXRpb0luZGV4ICovCitzdGF0aWMgY29uc3QgVUNIQVIgc2JyUmF0aW9JbmRleFs4XSA9IHswLCAwLCAyLCAzLCAxLCAwLCAwLCAwfTsKKworLyoKKyAgc3Vicm91dGluZSBmb3IgcGFyc2luZyBleHRlbnNpb24gZWxlbWVudCBjb25maWd1cmF0aW9uOgorICBVc2FjRXh0RWxlbWVudENvbmZpZygpIHEudi4gSVNPL0lFQyBGRElTIDIzMDAzLTM6MjAxMShFKSBUYWJsZSAxNAorICByc3Y2MDNkYUV4dEVsZW1lbnRDb25maWcoKSBxLnYuIElTTy9JRUMgRElTIDIzMDA4LTMgVGFibGUgMTMKKyovCitzdGF0aWMgVFJBTlNQT1JUREVDX0VSUk9SIGV4dEVsZW1lbnRDb25maWcoQ1NVc2FjRXh0RWxlbWVudENvbmZpZyAqZXh0RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1NUcENhbGxCYWNrcyAqY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgbnVtU2lnbmFsc0luR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBjb3JlRnJhbWVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN1YlN0cmVhbUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGFvdCkgeworICBUUkFOU1BPUlRERUNfRVJST1IgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfT0s7CisKKyAgVVNBQ19FWFRfRUxFTUVOVF9UWVBFIHVzYWNFeHRFbGVtZW50VHlwZSA9CisgICAgICAoVVNBQ19FWFRfRUxFTUVOVF9UWVBFKWVzY2FwZWRWYWx1ZShoQnMsIDQsIDgsIDE2KTsKKworICAvKiByZWN1cnZlIGV4dGVuc2lvbiBlbGVtZW50cyB3aGljaCBhcmUgaW52YWxpZCBmb3IgVVNBQyAqLworICBpZiAoYW90ID09IEFPVF9VU0FDKSB7CisgICAgc3dpdGNoICh1c2FjRXh0RWxlbWVudFR5cGUpIHsKKyAgICAgIGNhc2UgSURfRVhUX0VMRV9GSUxMOgorICAgICAgY2FzZSBJRF9FWFRfRUxFX01QRUdTOgorICAgICAgY2FzZSBJRF9FWFRfRUxFX1NBT0M6CisgICAgICBjYXNlIElEX0VYVF9FTEVfQVVESU9QUkVST0xMOgorICAgICAgY2FzZSBJRF9FWFRfRUxFX1VOSV9EUkM6CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdXNhY0V4dEVsZW1lbnRUeXBlID0gSURfRVhUX0VMRV9VTktOT1dOOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBleHRFbGVtZW50LT51c2FjRXh0RWxlbWVudFR5cGUgPSB1c2FjRXh0RWxlbWVudFR5cGU7CisgIGludCB1c2FjRXh0RWxlbWVudENvbmZpZ0xlbmd0aCA9IGVzY2FwZWRWYWx1ZShoQnMsIDQsIDgsIDE2KTsKKyAgZXh0RWxlbWVudC0+dXNhY0V4dEVsZW1lbnRDb25maWdMZW5ndGggPSAoVVNIT1JUKXVzYWNFeHRFbGVtZW50Q29uZmlnTGVuZ3RoOworICBJTlQgYnNBbmNob3I7CisKKyAgaWYgKEZES3JlYWRCaXQoaEJzKSkgLyogdXNhY0V4dEVsZW1lbnREZWZhdWx0TGVuZ3RoUHJlc2VudCAqLworICAgIGV4dEVsZW1lbnQtPnVzYWNFeHRFbGVtZW50RGVmYXVsdExlbmd0aCA9IGVzY2FwZWRWYWx1ZShoQnMsIDgsIDE2LCAwKSArIDE7CisgIGVsc2UKKyAgICBleHRFbGVtZW50LT51c2FjRXh0RWxlbWVudERlZmF1bHRMZW5ndGggPSAwOworCisgIGV4dEVsZW1lbnQtPnVzYWNFeHRFbGVtZW50UGF5bG9hZEZyYWcgPSBGREtyZWFkQml0KGhCcyk7CisKKyAgYnNBbmNob3IgPSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpOworCisgIHN3aXRjaCAodXNhY0V4dEVsZW1lbnRUeXBlKSB7CisgICAgY2FzZSBJRF9FWFRfRUxFX1VOS05PV046CisgICAgY2FzZSBJRF9FWFRfRUxFX0ZJTEw6CisgICAgICBicmVhazsKKyAgICBjYXNlIElEX0VYVF9FTEVfQVVESU9QUkVST0xMOgorICAgICAgLyogTm8gY29uZmlndXJhdGlvbiBlbGVtZW50ICovCisgICAgICBleHRFbGVtZW50LT51c2FjRXh0RWxlbWVudEhhc0F1ZGlvUHJlUm9sbCA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIElEX0VYVF9FTEVfVU5JX0RSQzogeworICAgICAgaWYgKGNiLT5jYlVuaURyYyAhPSBOVUxMKSB7CisgICAgICAgIEVycm9yU3RhdHVzID0gKFRSQU5TUE9SVERFQ19FUlJPUiljYi0+Y2JVbmlEcmMoCisgICAgICAgICAgICBjYi0+Y2JVbmlEcmNEYXRhLCBoQnMsIHVzYWNFeHRFbGVtZW50Q29uZmlnTGVuZ3RoLAorICAgICAgICAgICAgMCwgLyogdW5pRHJjQ29uZmlnICovCisgICAgICAgICAgICBzdWJTdHJlYW1JbmRleCwgMCwgYW90KTsKKyAgICAgICAgaWYgKEVycm9yU3RhdHVzICE9IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogQWRqdXN0IGJpdCBzdHJlYW0gcG9zaXRpb24uIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBvZiBieXRlIGFsaWdubWVudCBhbmQKKyAgICogdW5oYW5kbGVkIGV4dGVuc2lvbnMuICovCiAgIHsKLSAgICBsYXN0QXNjRXh0ID0gYXNjRXh0SWQ7Ci0gICAgYXNjRXh0SWQgICA9IChUUF9BU0NfRVhURU5TSU9OX0lEKUZES3JlYWRCaXRzKGJzLCAxMSk7Ci0gICAgYml0c0F2YWlsYWJsZSAtPSAxMTsKKyAgICBJTlQgbGVmdF9iaXRzID0gKHVzYWNFeHRFbGVtZW50Q29uZmlnTGVuZ3RoIDw8IDMpIC0KKyAgICAgICAgICAgICAgICAgICAgKGJzQW5jaG9yIC0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSk7CisgICAgaWYgKGxlZnRfYml0cyA+PSAwKSB7CisgICAgICBGREtwdXNoRm9yKGhCcywgbGVmdF9iaXRzKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogcGFyc2VkIHRvbyBtYW55IGJpdHMgKi8KKyAgICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgIH0KKyAgfQogCi0gICAgc3dpdGNoIChhc2NFeHRJZCkgewotICAgIGNhc2UgQVNDRVhUX1NCUjogICAgLyogMHgyYjcgKi8KLSAgICAgIGlmICggKHNlbGYtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlICE9IEFPVF9TQlIpICYmIChiaXRzQXZhaWxhYmxlID49IDUpICkgewotICAgICAgICBzZWxmLT5tX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZSA9IGdldEFPVChicyk7CisgIHJldHVybiBFcnJvclN0YXR1czsKK30KIAotICAgICAgICBpZiAoIChzZWxmLT5tX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfU0JSKQotICAgICAgICAgIHx8IChzZWxmLT5tX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfRVJfQlNBQykgKQotICAgICAgICB7IC8qIEdldCBTQlIgZXh0ZW5zaW9uIGNvbmZpZ3VyYXRpb24gKi8KLSAgICAgICAgICBzZWxmLT5tX3NiclByZXNlbnRGbGFnID0gRkRLcmVhZEJpdHMoYnMsIDEpOwotICAgICAgICAgIGJpdHNBdmFpbGFibGUgLT0gMTsKKy8qCisgIHN1YnJvdXRpbmUgZm9yIHBhcnNpbmcgdGhlIFVTQUMgLyBSU1ZENjAgY29uZmlndXJhdGlvbiBleHRlbnNpb246CisgIFVzYWNDb25maWdFeHRlbnNpb24oKSBxLnYuIElTTy9JRUMgRkRJUyAyMzAwMy0zOjIwMTEoRSkgVGFibGUgMTUKKyAgcnN2NjAzZGFDb25maWdFeHRlbnNpb24oKSBxLnYuIElTTy9JRUMgRElTIDIzMDA4LTMgVGFibGUgMTQKKyovCitzdGF0aWMgVFJBTlNQT1JUREVDX0VSUk9SIGNvbmZpZ0V4dGVuc2lvbihDU1VzYWNDb25maWcgKnVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENTVHBDYWxsQmFja3MgKmNiKSB7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19PSzsKIAotICAgICAgICAgIGlmICggc2VsZi0+bV9zYnJQcmVzZW50RmxhZyA9PSAxICkgewotICAgICAgICAgICAgc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSA9IGdldFNhbXBsZVJhdGUoYnMsICZzZWxmLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5SW5kZXgsIDQpOworICBpbnQgbnVtQ29uZmlnRXh0ZW5zaW9uczsKKyAgQ09ORklHX0VYVF9JRCB1c2FjQ29uZmlnRXh0VHlwZTsKKyAgaW50IHVzYWNDb25maWdFeHRMZW5ndGg7CiAKLSAgICAgICAgICAgIGlmICgoSU5UKXNlbGYtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3kgPD0gMCkgeworICBudW1Db25maWdFeHRlbnNpb25zID0gKGludCllc2NhcGVkVmFsdWUoaEJzLCAyLCA0LCA4KSArIDE7CisgIGZvciAoaW50IGNvbmZFeHRJZHggPSAwOyBjb25mRXh0SWR4IDwgbnVtQ29uZmlnRXh0ZW5zaW9uczsgY29uZkV4dElkeCsrKSB7CisgICAgSU5UIG5iaXRzOworICAgIGludCBsb3VkbmVzc0luZm9TZXRDb25maWdFeHRlbnNpb25Qb3NpdGlvbiA9IEZES2dldFZhbGlkQml0cyhoQnMpOworICAgIHVzYWNDb25maWdFeHRUeXBlID0gKENPTkZJR19FWFRfSUQpZXNjYXBlZFZhbHVlKGhCcywgNCwgOCwgMTYpOworICAgIHVzYWNDb25maWdFeHRMZW5ndGggPSAoaW50KWVzY2FwZWRWYWx1ZShoQnMsIDQsIDgsIDE2KTsKKworICAgIC8qIFN0YXJ0IGJpdCBwb3NpdGlvbiBvZiBjb25maWcgZXh0ZW5zaW9uICovCisgICAgbmJpdHMgPSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpOworCisgICAgLyogUmV0dXJuIGFuIGVycm9yIGluIGNhc2UgdGhlIGJpdGJ1ZmZlciBmaWxsIGxldmVsIGlzIHRvbyBsb3cuICovCisgICAgaWYgKG5iaXRzIDwgdXNhY0NvbmZpZ0V4dExlbmd0aCAqIDgpIHsKKyAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgfQorCisgICAgc3dpdGNoICh1c2FjQ29uZmlnRXh0VHlwZSkgeworICAgICAgY2FzZSBJRF9DT05GSUdfRVhUX0ZJTEw6CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXNhY0NvbmZpZ0V4dExlbmd0aDsgaSsrKSB7CisgICAgICAgICAgaWYgKEZES3JlYWRCaXRzKGhCcywgOCkgIT0gMHhhNSkgeworICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIElEX0NPTkZJR19FWFRfTE9VRE5FU1NfSU5GTzogeworICAgICAgICBpZiAoY2ItPmNiVW5pRHJjICE9IE5VTEwpIHsKKyAgICAgICAgICBFcnJvclN0YXR1cyA9IChUUkFOU1BPUlRERUNfRVJST1IpY2ItPmNiVW5pRHJjKAorICAgICAgICAgICAgICBjYi0+Y2JVbmlEcmNEYXRhLCBoQnMsIHVzYWNDb25maWdFeHRMZW5ndGgsCisgICAgICAgICAgICAgIDEsIC8qIGxvdWRuZXNzSW5mb1NldCAqLworICAgICAgICAgICAgICAwLCBsb3VkbmVzc0luZm9TZXRDb25maWdFeHRlbnNpb25Qb3NpdGlvbiwgQU9UX1VTQUMpOworICAgICAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBTa2lwIHJlbWFpbmluZyBiaXRzLiBJZiB0b28gbWFueSBiaXRzIHdlcmUgcGFyc2VkLCBhc3N1bWUgZXJyb3IuICovCisgICAgdXNhY0NvbmZpZ0V4dExlbmd0aCA9CisgICAgICAgIDggKiB1c2FjQ29uZmlnRXh0TGVuZ3RoIC0gKG5iaXRzIC0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSk7CisgICAgaWYgKHVzYWNDb25maWdFeHRMZW5ndGggPCAwKSB7CisgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICBGREtwdXNoRm9yKGhCcywgdXNhY0NvbmZpZ0V4dExlbmd0aCk7CisgIH0KKworICByZXR1cm4gRXJyb3JTdGF0dXM7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gdW5pZmllcyBkZWNvZGVyIGNvbmZpZyBwYXJzaW5nIG9mIFVTQUMgYW5kIFJTVjYwOgorICAgcnN2NjAzZGFEZWNvZGVyQ29uZmlnKCkgSVNPL0lFQyBESVMgMjMwMDgtMyAgIFRhYmxlIDgKKyAgIFVzYWNEZWNvZGVyQ29uZmlnKCkgICAgIElTTy9JRUMgRkRJUyAyMzAwMy0zICBUYWJsZSA2CisgICovCitzdGF0aWMgVFJBTlNQT1JUREVDX0VSUk9SIFVzYWNSc3Y2MERlY29kZXJDb25maWdfUGFyc2UoCisgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICphc2MsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICBjb25zdCBDU1RwQ2FsbEJhY2tzICpjYikgeworICBUUkFOU1BPUlRERUNfRVJST1IgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfT0s7CisgIENTVXNhY0NvbmZpZyAqdXNjID0gJmFzYy0+bV9zYy5tX3VzYWNDb25maWc7CisgIGludCBpLCBudW1iZXJPZkVsZW1lbnRzOworICBpbnQgY2hhbm5lbEVsZW1lbnRJZHggPQorICAgICAgMDsgLyogaW5kZXggZm9yIGVsZW1lbnRzIHdoaWNoIGNvbnRhaW4gYXVkaW8gY2hhbm5lbHMgKHNjZSwgY3BlLCBsZmUpICovCisgIFNDX0NIQU5ORUxfQ09ORklHIHNjX2NoYW5fY29uZmlnID0gezAsIDAsIDAsIDB9OworCisgIG51bWJlck9mRWxlbWVudHMgPSAoaW50KWVzY2FwZWRWYWx1ZShoQnMsIDQsIDgsIDE2KSArIDE7CisgIHVzYy0+bV91c2FjTnVtRWxlbWVudHMgPSBudW1iZXJPZkVsZW1lbnRzOworICBpZiAobnVtYmVyT2ZFbGVtZW50cyA+IFRQX1VTQUNfTUFYX0VMRU1FTlRTKSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgIH0KKyAgdXNjLT5tX25Vc2FjQ2hhbm5lbHMgPSAwOworICB1c2MtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb25JbmRleCA9IGFzYy0+bV9jaGFubmVsQ29uZmlndXJhdGlvbjsKKworICBpZiAoYXNjLT5tX2FvdCA9PSBBT1RfVVNBQykgeworICAgIHNjX2NoYW5fY29uZmlnID0gc2NfY2hhbl9jb25maWdfdGFiW3VzYy0+bV9jaGFubmVsQ29uZmlndXJhdGlvbkluZGV4XTsKKworICAgIGlmIChzY19jaGFuX2NvbmZpZy5uQ2ggPiAoU0NIQVIpVFBfVVNBQ19NQVhfU1BFQUtFUlMpIHsKKyAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlck9mRWxlbWVudHM7IGkrKykgeworICAgIE1QNF9FTEVNRU5UX0lEIHVzYWNFbGVtZW50VHlwZSA9IChNUDRfRUxFTUVOVF9JRCkoCisgICAgICAgIEZES3JlYWRCaXRzKGhCcywgMikgfCBVU0FDX0lEX0JJVCk7IC8qIHNldCBVU0FDX0lEX0JJVCB0byBtYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhY0VsZW1lbnRUeXBlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QNF9FTEVNRU5UX0lEIGVudW0gKi8KKyAgICB1c2MtPmVsZW1lbnRbaV0udXNhY0VsZW1lbnRUeXBlID0gdXNhY0VsZW1lbnRUeXBlOworCisgICAgLyogc2FuaXR5IGNoZWNrOiB1cGRhdGUgZWxlbWVudCBjb3VudGVyICovCisgICAgaWYgKGFzYy0+bV9hb3QgPT0gQU9UX1VTQUMpIHsKKyAgICAgIHN3aXRjaCAodXNhY0VsZW1lbnRUeXBlKSB7CisgICAgICAgIGNhc2UgSURfVVNBQ19TQ0U6CisgICAgICAgICAgc2NfY2hhbl9jb25maWcublNDRS0tOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElEX1VTQUNfQ1BFOgorICAgICAgICAgIHNjX2NoYW5fY29uZmlnLm5DUEUtLTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJRF9VU0FDX0xGRToKKyAgICAgICAgICBzY19jaGFuX2NvbmZpZy5uTEZFLS07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAodXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uSW5kZXgpIHsKKyAgICAgICAgLyogc2FuaXR5IGNoZWNrOiBubyBlbGVtZW50IGNvdW50ZXIgbWF5IGJlIHNtYWxsZXIgemVybyAqLworICAgICAgICBpZiAoc2NfY2hhbl9jb25maWcubkNQRSA8IDAgfHwgc2NfY2hhbl9jb25maWcublNDRSA8IDAgfHwKKyAgICAgICAgICAgIHNjX2NoYW5fY29uZmlnLm5MRkUgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAodXNhY0VsZW1lbnRUeXBlKSB7CisgICAgICBjYXNlIElEX1VTQUNfU0NFOgorICAgICAgICAvKiBVc2FjQ29yZUNvbmZpZygpIElTTy9JRUMgRkRJUyAyMzAwMy0zICBUYWJsZSAxMCAqLworICAgICAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSB7IC8qIHR3X21kY3QgKi8KKyAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgICAgICAgfQorICAgICAgICB1c2MtPmVsZW1lbnRbaV0ubV9ub2lzZUZpbGxpbmcgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgICAvKiBlbmQgb2YgVXNhY0NvcmVDb25maWcoKSAqLworICAgICAgICBpZiAodXNjLT5tX3NiclJhdGlvSW5kZXggPiAwKSB7CisgICAgICAgICAgaWYgKGNiLT5jYlNiciA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOS09XTl9FUlJPUjsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogU2JyQ29uZmlnKCkgSVNPL0lFQyBGRElTIDIzMDAzLTMgIFRhYmxlIDExICovCisgICAgICAgICAgdXNjLT5lbGVtZW50W2ldLm1faGFybW9uaWNTQlIgPSBGREtyZWFkQml0KGhCcyk7CisgICAgICAgICAgdXNjLT5lbGVtZW50W2ldLm1faW50ZXJUZXMgPSBGREtyZWFkQml0KGhCcyk7CisgICAgICAgICAgdXNjLT5lbGVtZW50W2ldLm1fcHZjID0gRkRLcmVhZEJpdChoQnMpOworICAgICAgICAgIGlmIChjYi0+Y2JTYnIoY2ItPmNiU2JyRGF0YSwgaEJzLCBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICBhc2MtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICBhc2MtPm1fc2FtcGxlc1BlckZyYW1lLCBhc2MtPm1fYW90LCBJRF9TQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRWxlbWVudElkeCwgdXNjLT5lbGVtZW50W2ldLm1faGFybW9uaWNTQlIsCisgICAgICAgICAgICAgICAgICAgICAgICB1c2MtPmVsZW1lbnRbaV0ubV9zdGVyZW9Db25maWdJbmRleCwgYXNjLT5jb25maWdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgJmFzYy0+U2JyQ29uZmlnQ2hhbmdlZCwgMSkpIHsKKyAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIGVuZCBvZiBTYnJDb25maWcoKSAqLworICAgICAgICB9CisgICAgICAgIHVzYy0+bV9uVXNhY0NoYW5uZWxzICs9IDE7CisgICAgICAgIGNoYW5uZWxFbGVtZW50SWR4Kys7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIElEX1VTQUNfQ1BFOgorICAgICAgICAvKiBVc2FjQ29yZUNvbmZpZygpIElTTy9JRUMgRkRJUyAyMzAwMy0zICBUYWJsZSAxMCAqLworICAgICAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSB7IC8qIHR3X21kY3QgKi8KKyAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgICAgICAgfQorICAgICAgICB1c2MtPmVsZW1lbnRbaV0ubV9ub2lzZUZpbGxpbmcgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgICAvKiBlbmQgb2YgVXNhY0NvcmVDb25maWcoKSAqLworICAgICAgICBpZiAodXNjLT5tX3NiclJhdGlvSW5kZXggPiAwKSB7CisgICAgICAgICAgaWYgKGNiLT5jYlNiciA9PSBOVUxMKSByZXR1cm4gVFJBTlNQT1JUREVDX1VOS09XTl9FUlJPUjsKKyAgICAgICAgICAvKiBTYnJDb25maWcoKSBJU08vSUVDIEZESVMgMjMwMDMtMyAqLworICAgICAgICAgIHVzYy0+ZWxlbWVudFtpXS5tX2hhcm1vbmljU0JSID0gRkRLcmVhZEJpdChoQnMpOworICAgICAgICAgIHVzYy0+ZWxlbWVudFtpXS5tX2ludGVyVGVzID0gRkRLcmVhZEJpdChoQnMpOworICAgICAgICAgIHVzYy0+ZWxlbWVudFtpXS5tX3B2YyA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICAgICAgICB7CisgICAgICAgICAgICBJTlQgYml0c1RvU2tpcCA9IHNraXBTYnJIZWFkZXIoaEJzLCAxKTsKKyAgICAgICAgICAgIC8qIHJlYWQgc3RlcmVvQ29uZmlnSW5kZXggKi8KKyAgICAgICAgICAgIHVzYy0+ZWxlbWVudFtpXS5tX3N0ZXJlb0NvbmZpZ0luZGV4ID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsKKyAgICAgICAgICAgIC8qIHJld2luZCAqLworICAgICAgICAgICAgRkRLcHVzaEJhY2soaEJzLCBiaXRzVG9Ta2lwICsgMik7CisgICAgICAgICAgfQorICAgICAgICAgIHsKKyAgICAgICAgICAgIE1QNF9FTEVNRU5UX0lEIGVsX3R5cGUgPQorICAgICAgICAgICAgICAgICh1c2MtPmVsZW1lbnRbaV0ubV9zdGVyZW9Db25maWdJbmRleCA9PSAxIHx8CisgICAgICAgICAgICAgICAgIHVzYy0+ZWxlbWVudFtpXS5tX3N0ZXJlb0NvbmZpZ0luZGV4ID09IDIpCisgICAgICAgICAgICAgICAgICAgID8gSURfU0NFCisgICAgICAgICAgICAgICAgICAgIDogSURfQ1BFOworICAgICAgICAgICAgaWYgKGNiLT5jYlNicihjYi0+Y2JTYnJEYXRhLCBoQnMsIGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhc2MtPm1fc2FtcGxlc1BlckZyYW1lLCBhc2MtPm1fYW90LCBlbF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRWxlbWVudElkeCwgdXNjLT5lbGVtZW50W2ldLm1faGFybW9uaWNTQlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYy0+ZWxlbWVudFtpXS5tX3N0ZXJlb0NvbmZpZ0luZGV4LCBhc2MtPmNvbmZpZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhc2MtPlNickNvbmZpZ0NoYW5nZWQsIDEpKSB7CiAgICAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICAgIGlmICggc2VsZi0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0JTQUMgKSB7Ci0gICAgICAgICAgICBzZWxmLT5tX2V4dGVuc2lvbkNoYW5uZWxDb25maWd1cmF0aW9uID0gRkRLcmVhZEJpdHMoYnMsIDQpOwotICAgICAgICAgICAgYml0c0F2YWlsYWJsZSAtPSA0OworICAgICAgICAgIC8qIGVuZCBvZiBTYnJDb25maWcoKSAqLworCisgICAgICAgICAgdXNjLT5lbGVtZW50W2ldLm1fc3RlcmVvQ29uZmlnSW5kZXggPQorICAgICAgICAgICAgICBGREtyZWFkQml0cyhoQnMsIDIpOyAvKiBOZWVkZWQgaW4gUk01IHN5bnRheCAqLworCisgICAgICAgICAgaWYgKHVzYy0+ZWxlbWVudFtpXS5tX3N0ZXJlb0NvbmZpZ0luZGV4ID4gMCkgeworICAgICAgICAgICAgaWYgKGNiLT5jYlNzYyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgIC8qIE1wczIxMkNvbmZpZygpIElTTy9JRUMgRkRJUyAyMzAwMy0zICovCisgICAgICAgICAgICAgIGlmIChjYi0+Y2JTc2MoY2ItPmNiU3NjRGF0YSwgaEJzLCBhc2MtPm1fYW90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2MtPmVsZW1lbnRbaV0ubV9zdGVyZW9Db25maWdJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2MtPm1fY29yZVNickZyYW1lTGVuZ3RoSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogZG9uJ3Qga25vdyB0aGUgbGVuZ3RoICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjLT5jb25maWdNb2RlLCAmYXNjLT5TYWNDb25maWdDaGFuZ2VkKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgLyogZW5kIG9mIE1wczIxMkNvbmZpZygpICovCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOS09XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdXNjLT5lbGVtZW50W2ldLm1fc3RlcmVvQ29uZmlnSW5kZXggPSAwOworICAgICAgICB9CisgICAgICAgIHVzYy0+bV9uVXNhY0NoYW5uZWxzICs9IDI7CisKKyAgICAgICAgY2hhbm5lbEVsZW1lbnRJZHgrKzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSURfVVNBQ19MRkU6CisgICAgICAgIHVzYy0+ZWxlbWVudFtpXS5tX25vaXNlRmlsbGluZyA9IDA7CisgICAgICAgIHVzYy0+bV9uVXNhY0NoYW5uZWxzICs9IDE7CisgICAgICAgIGlmICh1c2MtPm1fc2JyUmF0aW9JbmRleCA+IDApIHsKKyAgICAgICAgICAvKiBVc2UgU0JSIGZvciB1cHNhbXBsaW5nICovCisgICAgICAgICAgaWYgKGNiLT5jYlNiciA9PSBOVUxMKSByZXR1cm4gRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfVU5LT1dOX0VSUk9SOworICAgICAgICAgIHVzYy0+ZWxlbWVudFtpXS5tX2hhcm1vbmljU0JSID0gKFVDSEFSKTA7CisgICAgICAgICAgdXNjLT5lbGVtZW50W2ldLm1faW50ZXJUZXMgPSAoVUNIQVIpMDsKKyAgICAgICAgICB1c2MtPmVsZW1lbnRbaV0ubV9wdmMgPSAoVUNIQVIpMDsKKyAgICAgICAgICBpZiAoY2ItPmNiU2JyKGNiLT5jYlNickRhdGEsIGhCcywgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgYXNjLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSwgYXNjLT5tX2FvdCwgSURfTEZFLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEVsZW1lbnRJZHgsIHVzYy0+ZWxlbWVudFtpXS5tX2hhcm1vbmljU0JSLAorICAgICAgICAgICAgICAgICAgICAgICAgdXNjLT5lbGVtZW50W2ldLm1fc3RlcmVvQ29uZmlnSW5kZXgsIGFzYy0+Y29uZmlnTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZhc2MtPlNickNvbmZpZ0NoYW5nZWQsIDEpKSB7CisgICAgICAgICAgICByZXR1cm4gRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CiAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIC8qIFVwZGF0ZSBjb3VudGVyIGJlY2F1c2Ugb2YgdmFyaWFibGUgbGVuZ3RoIGZpZWxkcyAoQU9UIGFuZCBzYW1wbGluZyByYXRlKSAqLwotICAgICAgICBiaXRzQXZhaWxhYmxlID0gKElOVClGREtnZXRWYWxpZEJpdHMoYnMpOworICAgICAgICBjaGFubmVsRWxlbWVudElkeCsrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBJRF9VU0FDX0VYVDoKKyAgICAgICAgRXJyb3JTdGF0dXMgPSBleHRFbGVtZW50Q29uZmlnKCZ1c2MtPmVsZW1lbnRbaV0uZXh0RWxlbWVudCwgaEJzLCBjYiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUsIDAsIGFzYy0+bV9hb3QpOworCisgICAgICAgIGlmIChFcnJvclN0YXR1cykgeworICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgLyogbm9uIFVTQUMtZWxlbWVudCBlbmNvdW50ZXJlZCAqLworICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgIH0KKyAgfQorCisgIGlmIChhc2MtPm1fYW90ID09IEFPVF9VU0FDKSB7CisgICAgaWYgKHVzYy0+bV9jaGFubmVsQ29uZmlndXJhdGlvbkluZGV4KSB7CisgICAgICAvKiBzYW5pdHkgY2hlY2s6IGFsbCBlbGVtZW50IGNvdW50ZXIgbXVzdCBiZSB6ZXJvICovCisgICAgICBpZiAoc2NfY2hhbl9jb25maWcubkNQRSB8IHNjX2NoYW5fY29uZmlnLm5TQ0UgfCBzY19jaGFuX2NvbmZpZy5uTEZFKSB7CisgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CiAgICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFTQ0VYVF9QUzogICAgIC8qIDB4NTQ4ICovCi0gICAgICBpZiAoIChsYXN0QXNjRXh0ID09IEFTQ0VYVF9TQlIpCi0gICAgICAgICYmIChzZWxmLT5tX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfU0JSKQotICAgICAgICAmJiAoYml0c0F2YWlsYWJsZSA+IDApICkKLSAgICAgIHsgLyogR2V0IFBTIGV4dGVuc2lvbiBjb25maWd1cmF0aW9uICovCi0gICAgICAgIHNlbGYtPm1fcHNQcmVzZW50RmxhZyA9IEZES3JlYWRCaXRzKGJzLCAxKTsKLSAgICAgICAgYml0c0F2YWlsYWJsZSAtPSAxOworICAgIH0gZWxzZSB7CisgICAgICAvKiBzYW5pdHkgY2hlY2s6IG51bWJlciBvZiBhdWRpbyBjaGFubmVscyBzaGFsbCBiZSBlcXVhbCB0byBvciBzbWFsbGVyCisgICAgICAgKiB0aGFuIHRoZSBhY2N1bXVsYXRlZCBzdW0gb2YgYWxsIGNoYW5uZWxzICovCisgICAgICBpZiAoKElOVCkoLTIgKiBzY19jaGFuX2NvbmZpZy5uQ1BFIC0gc2NfY2hhbl9jb25maWcublNDRSAtCisgICAgICAgICAgICAgICAgc2NfY2hhbl9jb25maWcubkxGRSkgPCAoSU5UKXVzYy0+bnVtQXVkaW9DaGFubmVscykgeworICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOwogICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIEp1c3QgaWdub3JlIGFueXRoaW5nLiAqLwotICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19PSzsKKyAgICB9CisgIH0KKworICByZXR1cm4gRXJyb3JTdGF0dXM7Cit9CisKKy8qIE1hcHBpbmcgb2YgY29yZVNickZyYW1lTGVuZ3RoSW5kZXggZGVmaW5lZCBieSBUYWJsZSA3MCBpbiBJU08vSUVDIDIzMDAzLTMgKi8KK3N0YXRpYyBUUkFOU1BPUlRERUNfRVJST1IgVXNhY0NvbmZpZ19TZXRDb3JlU2JyRnJhbWVMZW5ndGhJbmRleCgKKyAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKmFzYywgaW50IGNvcmVTYnJGcmFtZUxlbmd0aEluZGV4KSB7CisgIGludCBzYnJSYXRpb0luZGV4X3ZhbDsKKworICBpZiAoY29yZVNickZyYW1lTGVuZ3RoSW5kZXggPiA0KSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsgLyogcmVzZXJ2ZWQgdmFsdWVzICovCisgIH0KKyAgYXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5tX2NvcmVTYnJGcmFtZUxlbmd0aEluZGV4ID0gY29yZVNickZyYW1lTGVuZ3RoSW5kZXg7CisgIGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUgPSB1c2FjRnJhbWVMZW5ndGhbY29yZVNickZyYW1lTGVuZ3RoSW5kZXhdOworICBzYnJSYXRpb0luZGV4X3ZhbCA9IHNiclJhdGlvSW5kZXhbY29yZVNickZyYW1lTGVuZ3RoSW5kZXhdOworICBhc2MtPm1fc2MubV91c2FjQ29uZmlnLm1fc2JyUmF0aW9JbmRleCA9IHNiclJhdGlvSW5kZXhfdmFsOworCisgIGlmIChzYnJSYXRpb0luZGV4X3ZhbCA+IDApIHsKKyAgICBhc2MtPm1fc2JyUHJlc2VudEZsYWcgPSAxOworICAgIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSA9IGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKKyAgICBhc2MtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3lJbmRleCA9IGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeUluZGV4OworICAgIHN3aXRjaCAoc2JyUmF0aW9JbmRleF92YWwpIHsKKyAgICAgIGNhc2UgMTogLyogc2JyUmF0aW8gPSA0OjEgKi8KKyAgICAgICAgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID4+PSAyOworICAgICAgICBhc2MtPm1fc2FtcGxlc1BlckZyYW1lID4+PSAyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjogLyogc2JyUmF0aW8gPSA4OjMgKi8KKyAgICAgICAgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID0gKGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSAqIDMpIC8gODsKKyAgICAgICAgYXNjLT5tX3NhbXBsZXNQZXJGcmFtZSA9IChhc2MtPm1fc2FtcGxlc1BlckZyYW1lICogMykgLyA4OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzogLyogc2JyUmF0aW8gPSAyOjEgKi8KKyAgICAgICAgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID4+PSAxOworICAgICAgICBhc2MtPm1fc2FtcGxlc1BlckZyYW1lID4+PSAxOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgfQorICAgIGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ID0KKyAgICAgICAgZ2V0U2FtcGxpbmdSYXRlSW5kZXgoYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5LCA0KTsKKyAgfQorCisgIHJldHVybiBUUkFOU1BPUlRERUNfT0s7Cit9CisKK3N0YXRpYyBUUkFOU1BPUlRERUNfRVJST1IgVXNhY0NvbmZpZ19QYXJzZShDU0F1ZGlvU3BlY2lmaWNDb25maWcgKmFzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IpIHsKKyAgaW50IHVzYWNTYW1wbGluZ0ZyZXF1ZW5jeSwgY2hhbm5lbENvbmZpZ3VyYXRpb25JbmRleCwgY29yZVNickZyYW1lTGVuZ3RoSW5kZXg7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBlcnIgPSBUUkFOU1BPUlRERUNfT0s7CisKKyAgLyogU3RhcnQgYml0IHBvc2l0aW9uIG9mIHVzYWNDb25maWcgKi8KKyAgSU5UIG5iaXRzID0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKTsKKworICB1c2FjU2FtcGxpbmdGcmVxdWVuY3kgPSBnZXRTYW1wbGVSYXRlKGhCcywgJmFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeUluZGV4LCA1KTsKKyAgYXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID0gKFVJTlQpdXNhY1NhbXBsaW5nRnJlcXVlbmN5OworCisgIGNvcmVTYnJGcmFtZUxlbmd0aEluZGV4ID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKKyAgaWYgKFVzYWNDb25maWdfU2V0Q29yZVNickZyYW1lTGVuZ3RoSW5kZXgoYXNjLCBjb3JlU2JyRnJhbWVMZW5ndGhJbmRleCkgIT0KKyAgICAgIFRSQU5TUE9SVERFQ19PSykgeworICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgIH0KKworICBjaGFubmVsQ29uZmlndXJhdGlvbkluZGV4ID0gRkRLcmVhZEJpdHMoaEJzLCA1KTsKKyAgaWYgKGNoYW5uZWxDb25maWd1cmF0aW9uSW5kZXggPiAyKSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsgLyogb25seSBjaGFubmVsQ29uZmlndXJhdGlvbkluZGV4ID0gWzEsMl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgc3VwcG9ydGVkICovCisgIH0KKworICBpZiAoY2hhbm5lbENvbmZpZ3VyYXRpb25JbmRleCA9PSAwKSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsgLyogb25seSBjaGFubmVsQ29uZmlndXJhdGlvbkluZGV4ID0gWzEsMl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgc3VwcG9ydGVkICovCisgIH0KKyAgYXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uID0gY2hhbm5lbENvbmZpZ3VyYXRpb25JbmRleDsKKworICBlcnIgPSBVc2FjUnN2NjBEZWNvZGVyQ29uZmlnX1BhcnNlKGFzYywgaEJzLCBjYik7CisgIGlmIChlcnIgIT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgcmV0dXJuIGVycjsKKyAgfQorCisgIGlmIChGREtyZWFkQml0cyhoQnMsIDEpKSB7IC8qIHVzYWNDb25maWdFeHRlbnNpb25QcmVzZW50ICovCisgICAgZXJyID0gY29uZmlnRXh0ZW5zaW9uKCZhc2MtPm1fc2MubV91c2FjQ29uZmlnLCBoQnMsIGNiKTsKKyAgICBpZiAoZXJyICE9IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgIH0KKworICAvKiBzYW5pdHkgY2hlY2sgd2hldGhlciBudW1iZXIgb2YgY2hhbm5lbHMgc2lnbmFsZWQgaW4gVXNhY0RlY29kZXJDb25maWcoKQorICAgICBtYXRjaGVzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgcmVxdWlyZWQgYnkgY2hhbm5lbENvbmZpZ3VyYXRpb25JbmRleCAqLworICBpZiAoKGNoYW5uZWxDb25maWd1cmF0aW9uSW5kZXggPiAwKSAmJgorICAgICAgKHNjX2NoYW5fY29uZmlnX3RhYltjaGFubmVsQ29uZmlndXJhdGlvbkluZGV4XS5uQ2ggIT0KKyAgICAgICBhc2MtPm1fc2MubV91c2FjQ29uZmlnLm1fblVzYWNDaGFubmVscykpIHsKKyAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICB9CisKKyAgLyogQ29weSBVc2FjQ29uZmlnKCkgdG8gYXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5Vc2FjQ29uZmlnW10gYnVmZmVyLiAqLworICBJTlQgY29uZmlnU2l6ZV9iaXRzID0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSAtIG5iaXRzOworICBTdG9yZUNvbmZpZ0FzQml0c3RyZWFtKGhCcywgY29uZmlnU2l6ZV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFzYy0+bV9zYy5tX3VzYWNDb25maWcuVXNhY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBUUF9VU0FDX01BWF9DT05GSUdfTEVOKTsKKyAgYXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5Vc2FjQ29uZmlnQml0cyA9IGZBYnMoY29uZmlnU2l6ZV9iaXRzKTsKKworICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgVFJBTlNQT1JUREVDX0VSUk9SIEF1ZGlvU3BlY2lmaWNDb25maWdfRXh0ZW5zaW9uUGFyc2UoCisgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpzZWxmLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgQ1NUcENhbGxCYWNrcyAqY2IpIHsKKyAgVFBfQVNDX0VYVEVOU0lPTl9JRCBsYXN0QXNjRXh0LCBhc2NFeHRJZCA9IEFTQ0VYVF9VTktPV047CisgIElOVCBiaXRzQXZhaWxhYmxlID0gKElOVClGREtnZXRWYWxpZEJpdHMoYnMpOworCisgIHdoaWxlIChiaXRzQXZhaWxhYmxlID49IDExKSB7CisgICAgbGFzdEFzY0V4dCA9IGFzY0V4dElkOworICAgIGFzY0V4dElkID0gKFRQX0FTQ19FWFRFTlNJT05fSUQpRkRLcmVhZEJpdHMoYnMsIDExKTsKKyAgICBiaXRzQXZhaWxhYmxlIC09IDExOworCisgICAgc3dpdGNoIChhc2NFeHRJZCkgeworICAgICAgY2FzZSBBU0NFWFRfU0JSOiAvKiAweDJiNyAqLworICAgICAgICBpZiAoKHNlbGYtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlICE9IEFPVF9TQlIpICYmCisgICAgICAgICAgICAoYml0c0F2YWlsYWJsZSA+PSA1KSkgeworICAgICAgICAgIHNlbGYtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlID0gZ2V0QU9UKGJzKTsKKworICAgICAgICAgIGlmICgoc2VsZi0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgPT0gQU9UX1NCUikgfHwKKyAgICAgICAgICAgICAgKHNlbGYtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlID09CisgICAgICAgICAgICAgICBBT1RfRVJfQlNBQykpIHsgLyogR2V0IFNCUiBleHRlbnNpb24gY29uZmlndXJhdGlvbiAqLworICAgICAgICAgICAgc2VsZi0+bV9zYnJQcmVzZW50RmxhZyA9IEZES3JlYWRCaXRzKGJzLCAxKTsKKyAgICAgICAgICAgIGlmIChzZWxmLT5tX2FvdCA9PSBBT1RfVVNBQyAmJiBzZWxmLT5tX3NiclByZXNlbnRGbGFnID4gMCAmJgorICAgICAgICAgICAgICAgIHNlbGYtPm1fc2MubV91c2FjQ29uZmlnLm1fc2JyUmF0aW9JbmRleCA9PSAwKSB7CisgICAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzZWxmLT5tX3NiclByZXNlbnRGbGFnID09IDEpIHsKKyAgICAgICAgICAgICAgc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSA9IGdldFNhbXBsZVJhdGUoCisgICAgICAgICAgICAgICAgICBicywgJnNlbGYtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3lJbmRleCwgNCk7CisKKyAgICAgICAgICAgICAgaWYgKChJTlQpc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSA8PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlbGYtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlID09IEFPVF9FUl9CU0FDKSB7CisgICAgICAgICAgICAgIHNlbGYtPm1fZXh0ZW5zaW9uQ2hhbm5lbENvbmZpZ3VyYXRpb24gPSBGREtyZWFkQml0cyhicywgNCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIC8qIFVwZGF0ZSBjb3VudGVyIGJlY2F1c2Ugb2YgdmFyaWFibGUgbGVuZ3RoIGZpZWxkcyAoQU9UIGFuZCBzYW1wbGluZworICAgICAgICAgICAqIHJhdGUpICovCisgICAgICAgICAgYml0c0F2YWlsYWJsZSA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQVNDRVhUX1BTOiAvKiAweDU0OCAqLworICAgICAgICBpZiAoKGxhc3RBc2NFeHQgPT0gQVNDRVhUX1NCUikgJiYKKyAgICAgICAgICAgIChzZWxmLT5tX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfU0JSKSAmJgorICAgICAgICAgICAgKGJpdHNBdmFpbGFibGUgPiAwKSkgeyAvKiBHZXQgUFMgZXh0ZW5zaW9uIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgICBzZWxmLT5tX3BzUHJlc2VudEZsYWcgPSBGREtyZWFkQml0cyhicywgMSk7CisgICAgICAgICAgYml0c0F2YWlsYWJsZSAtPSAxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBU0NFWFRfTVBTOiAvKiAweDc2YSAqLworICAgICAgICBpZiAoc2VsZi0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgPT0gQU9UX01QRUdTKSBicmVhazsKKyAgICAgIGNhc2UgQVNDRVhUX0xETVBTOiAvKiAweDdjYyAqLworICAgICAgICBpZiAoKGFzY0V4dElkID09IEFTQ0VYVF9MRE1QUykgJiYKKyAgICAgICAgICAgIChzZWxmLT5tX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfTERfTVBFR1MpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoYml0c0F2YWlsYWJsZSA+PSAxKSB7CisgICAgICAgICAgYml0c0F2YWlsYWJsZSAtPSAxOworICAgICAgICAgIGlmIChGREtyZWFkQml0cyhicywgMSkpIHsgLyogc2VsZi0+bV9tcHNQcmVzZW50RmxhZyAqLworICAgICAgICAgICAgaW50IHNzY0xlbiA9IEZES3JlYWRCaXRzKGJzLCA4KTsKKyAgICAgICAgICAgIGJpdHNBdmFpbGFibGUgLT0gODsKKyAgICAgICAgICAgIGlmIChzc2NMZW4gPT0gMHhGRikgeworICAgICAgICAgICAgICBzc2NMZW4gKz0gRkRLcmVhZEJpdHMoYnMsIDE2KTsKKyAgICAgICAgICAgICAgYml0c0F2YWlsYWJsZSAtPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZES3B1c2hGb3IoYnMsIHNzY0xlbik7IC8qIFNraXAgU1NDIHRvIGJlIGFibGUgdG8gcmVhZCB0aGUgbmV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uIGlmIHRoZXJlIGlzIG9uZS4gKi8KKworICAgICAgICAgICAgYml0c0F2YWlsYWJsZSAtPSBzc2NMZW4gKiA4OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQVNDRVhUX1NBT0M6CisgICAgICAgIGlmICgoYXNjRXh0SWQgPT0gQVNDRVhUX1NBT0MpICYmCisgICAgICAgICAgICAoc2VsZi0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgPT0gQU9UX1NBT0MpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoRkRLcmVhZEJpdHMoYnMsIDEpKSB7IC8qIHNhb2NQcmVzZW50ICovCisgICAgICAgICAgaW50IHNhb2NzY0xlbiA9IEZES3JlYWRCaXRzKGJzLCA4KTsKKyAgICAgICAgICBiaXRzQXZhaWxhYmxlIC09IDg7CisgICAgICAgICAgaWYgKHNhb2NzY0xlbiA9PSAweEZGKSB7CisgICAgICAgICAgICBzYW9jc2NMZW4gKz0gRkRLcmVhZEJpdHMoYnMsIDE2KTsKKyAgICAgICAgICAgIGJpdHNBdmFpbGFibGUgLT0gMTY7CisgICAgICAgICAgfQorICAgICAgICAgIEZES3B1c2hGb3IoYnMsIHNhb2NzY0xlbik7CisgICAgICAgICAgYml0c0F2YWlsYWJsZSAtPSBzYW9jc2NMZW4gKiA4OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgLyogSnVzdCBpZ25vcmUgYW55dGhpbmcuICovCisgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfT0s7CiAgICAgfQogICB9CiAKQEAgLTEyMjIsMTM0ICsyMDcwLDE0OSBAQAogICogQVBJIEZ1bmN0aW9ucwogICovCiAKLXZvaWQgQXVkaW9TcGVjaWZpY0NvbmZpZ19Jbml0KENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqYXNjKQotewordm9pZCBBdWRpb1NwZWNpZmljQ29uZmlnX0luaXQoQ1NBdWRpb1NwZWNpZmljQ29uZmlnICphc2MpIHsKICAgRkRLbWVtY2xlYXIoYXNjLCBzaXplb2YoQ1NBdWRpb1NwZWNpZmljQ29uZmlnKSk7CiAKICAgLyogSW5pdCBhbGwgdmFsdWVzIHRoYXQgc2hvdWxkIG5vdCBiZSB6ZXJvLiAqLwotICBhc2MtPm1fYW90ICAgICAgICAgICAgICAgICAgICA9IEFPVF9OT05FOworICBhc2MtPm1fYW90ID0gQU9UX05PTkU7CiAgIGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ID0gMHhmOwotICBhc2MtPm1fZXBDb25maWcgICAgICAgICAgICAgICA9IC0xOwotICBhc2MtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlICAgICAgICA9IEFPVF9OVUxMX09CSkVDVDsKLSNpZmRlZiBUUF9QQ0VfRU5BQkxFCisgIGFzYy0+bV9lcENvbmZpZyA9IC0xOworICBhc2MtPm1fZXh0ZW5zaW9uQXVkaW9PYmplY3RUeXBlID0gQU9UX05VTExfT0JKRUNUOwogICBDUHJvZ3JhbUNvbmZpZ19Jbml0KCZhc2MtPm1fcHJvZ3JDb25maWdFbGVtZW50KTsKLSNlbmRpZgogfQogCiBUUkFOU1BPUlRERUNfRVJST1IgQXVkaW9TcGVjaWZpY0NvbmZpZ19QYXJzZSgKLSAgICAgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpzZWxmLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGJzLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGZFeHBsaWNpdEJhY2t3YXJkQ29tcGF0aWJsZSwKLSAgICAgICAgQ1NUcENhbGxCYWNrcyAgICAgICpjYgotICAgICAgICApCi17CisgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpzZWxmLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICBpbnQgZkV4cGxpY2l0QmFja3dhcmRDb21wYXRpYmxlLCBDU1RwQ2FsbEJhY2tzICpjYiwgVUNIQVIgY29uZmlnTW9kZSwKKyAgICBVQ0hBUiBjb25maWdDaGFuZ2VkLCBBVURJT19PQkpFQ1RfVFlQRSBtX2FvdCkgewogICBUUkFOU1BPUlRERUNfRVJST1IgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfT0s7CiAgIFVJTlQgYXNjU3RhcnRBbmNob3IgPSBGREtnZXRWYWxpZEJpdHMoYnMpOwogICBpbnQgZnJhbWVMZW5ndGhGbGFnID0gLTE7CiAKICAgQXVkaW9TcGVjaWZpY0NvbmZpZ19Jbml0KHNlbGYpOwogCi0gIHNlbGYtPm1fYW90ID0gZ2V0QU9UKGJzKTsKLSAgc2VsZi0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IGdldFNhbXBsZVJhdGUoYnMsICZzZWxmLT5tX3NhbXBsaW5nRnJlcXVlbmN5SW5kZXgsIDQpOwotICBpZiAoc2VsZi0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA8PSAwKSB7Ci0gICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKLSAgfQorICBzZWxmLT5jb25maWdNb2RlID0gY29uZmlnTW9kZTsKKyAgc2VsZi0+QWFjQ29uZmlnQ2hhbmdlZCA9IGNvbmZpZ0NoYW5nZWQ7CisgIHNlbGYtPlNickNvbmZpZ0NoYW5nZWQgPSBjb25maWdDaGFuZ2VkOworICBzZWxmLT5TYWNDb25maWdDaGFuZ2VkID0gY29uZmlnQ2hhbmdlZDsKIAotICBzZWxmLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uID0gRkRLcmVhZEJpdHMoYnMsNCk7Ci0KLSAgLyogU0JSIGV4dGVuc2lvbiAoIGV4cGxpY2l0IG5vbi1iYWNrd2FyZHMgY29tcGF0aWJsZSBtb2RlICkgKi8KLSAgc2VsZi0+bV9zYnJQcmVzZW50RmxhZyA9IDA7Ci0gIHNlbGYtPm1fcHNQcmVzZW50RmxhZyAgPSAwOwotCi0gIGlmICggc2VsZi0+bV9hb3QgPT0gQU9UX1NCUiB8fCBzZWxmLT5tX2FvdCA9PSBBT1RfUFMgKSB7Ci0gICAgc2VsZi0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgPSBBT1RfU0JSOwotCi0gICAgc2VsZi0+bV9zYnJQcmVzZW50RmxhZyA9IDE7Ci0gICAgaWYgKCBzZWxmLT5tX2FvdCA9PSBBT1RfUFMgKSB7Ci0gICAgICBzZWxmLT5tX3BzUHJlc2VudEZsYWcgPSAxOworICBpZiAobV9hb3QgIT0gQU9UX05VTExfT0JKRUNUKSB7CisgICAgc2VsZi0+bV9hb3QgPSBtX2FvdDsKKyAgfSBlbHNlIHsKKyAgICBzZWxmLT5tX2FvdCA9IGdldEFPVChicyk7CisgICAgc2VsZi0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9CisgICAgICAgIGdldFNhbXBsZVJhdGUoYnMsICZzZWxmLT5tX3NhbXBsaW5nRnJlcXVlbmN5SW5kZXgsIDQpOworICAgIGlmIChzZWxmLT5tX3NhbXBsaW5nRnJlcXVlbmN5IDw9IDApIHsKKyAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CiAgICAgfQogCi0gICAgc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSA9IGdldFNhbXBsZVJhdGUoYnMsICZzZWxmLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5SW5kZXgsIDQpOwotICAgIHNlbGYtPm1fYW90ID0gZ2V0QU9UKGJzKTsKKyAgICBzZWxmLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uID0gRkRLcmVhZEJpdHMoYnMsIDQpOwogCi0gIH0gZWxzZSB7Ci0gICAgc2VsZi0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgPSBBT1RfTlVMTF9PQkpFQ1Q7CisgICAgLyogU0JSIGV4dGVuc2lvbiAoIGV4cGxpY2l0IG5vbi1iYWNrd2FyZHMgY29tcGF0aWJsZSBtb2RlICkgKi8KKyAgICBzZWxmLT5tX3NiclByZXNlbnRGbGFnID0gMDsKKyAgICBzZWxmLT5tX3BzUHJlc2VudEZsYWcgPSAwOworCisgICAgaWYgKHNlbGYtPm1fYW90ID09IEFPVF9TQlIgfHwgc2VsZi0+bV9hb3QgPT0gQU9UX1BTKSB7CisgICAgICBzZWxmLT5tX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZSA9IEFPVF9TQlI7CisKKyAgICAgIHNlbGYtPm1fc2JyUHJlc2VudEZsYWcgPSAxOworICAgICAgaWYgKHNlbGYtPm1fYW90ID09IEFPVF9QUykgeworICAgICAgICBzZWxmLT5tX3BzUHJlc2VudEZsYWcgPSAxOworICAgICAgfQorCisgICAgICBzZWxmLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5ID0KKyAgICAgICAgICBnZXRTYW1wbGVSYXRlKGJzLCAmc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeUluZGV4LCA0KTsKKyAgICAgIHNlbGYtPm1fYW90ID0gZ2V0QU9UKGJzKTsKKworICAgICAgc3dpdGNoIChzZWxmLT5tX2FvdCkgeworICAgICAgICBjYXNlIEFPVF9BQUNfTEM6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQU9UX0VSX0JTQUM6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgICAgICB9CisKKyAgICAgIGlmIChzZWxmLT5tX2FvdCA9PSBBT1RfRVJfQlNBQykgeworICAgICAgICBzZWxmLT5tX2V4dGVuc2lvbkNoYW5uZWxDb25maWd1cmF0aW9uID0gRkRLcmVhZEJpdHMoYnMsIDQpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzZWxmLT5tX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZSA9IEFPVF9OVUxMX09CSkVDVDsKKyAgICB9CiAgIH0KIAogICAvKiBQYXJzZSB3aGF0ZXZlciBzcGVjaWZpYyBjb25maWdzICovCi0gIHN3aXRjaCAoc2VsZi0+bV9hb3QpCi0gIHsKLSNpZmRlZiBUUF9HQV9FTkFCTEUKKyAgc3dpdGNoIChzZWxmLT5tX2FvdCkgewogICAgIGNhc2UgQU9UX0FBQ19MQzoKKyAgICBjYXNlIEFPVF9BQUNfU0NBTDoKICAgICBjYXNlIEFPVF9FUl9BQUNfTEM6CiAgICAgY2FzZSBBT1RfRVJfQUFDX0xEOgogICAgIGNhc2UgQU9UX0VSX0FBQ19TQ0FMOgogICAgIGNhc2UgQU9UX0VSX0JTQUM6Ci0gICAgICBpZiAoKEVycm9yU3RhdHVzID0gR2FTcGVjaWZpY0NvbmZpZ19QYXJzZSgmc2VsZi0+bV9zYy5tX2dhU3BlY2lmaWNDb25maWcsIHNlbGYsIGJzLCBhc2NTdGFydEFuY2hvcikpICE9IFRSQU5TUE9SVERFQ19PSyApIHsKKyAgICAgIGlmICgoRXJyb3JTdGF0dXMgPSBHYVNwZWNpZmljQ29uZmlnX1BhcnNlKCZzZWxmLT5tX3NjLm1fZ2FTcGVjaWZpY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIGJzLCBhc2NTdGFydEFuY2hvcikpICE9CisgICAgICAgICAgVFJBTlNQT1JUREVDX09LKSB7CiAgICAgICAgIHJldHVybiAoRXJyb3JTdGF0dXMpOwogICAgICAgfQogICAgICAgZnJhbWVMZW5ndGhGbGFnID0gc2VsZi0+bV9zYy5tX2dhU3BlY2lmaWNDb25maWcubV9mcmFtZUxlbmd0aEZsYWc7CiAgICAgICBicmVhazsKLSNlbmRpZiAvKiBUUF9HQV9FTkFCTEUgKi8KICAgICBjYXNlIEFPVF9NUEVHUzoKICAgICAgIGlmIChjYi0+Y2JTc2MgIT0gTlVMTCkgewotICAgICAgICBjYi0+Y2JTc2MoCi0gICAgICAgICAgICAgICAgY2ItPmNiU3NjRGF0YSwKLSAgICAgICAgICAgICAgICBicywKLSAgICAgICAgICAgICAgICBzZWxmLT5tX2FvdCwKLSAgICAgICAgICAgICAgICBzZWxmLT5tX3NhbXBsaW5nRnJlcXVlbmN5LAotICAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICAgMCAgLyogZG9uJ3Qga25vdyB0aGUgbGVuZ3RoICovCi0gICAgICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKGNiLT5jYlNzYyhjYi0+Y2JTc2NEYXRhLCBicywgc2VsZi0+bV9hb3QsIHNlbGYtPm1fc2FtcGxpbmdGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgMSwgLTEsIC8qIG5UaW1lU2xvdHM6IHJlYWQgZnJvbSBiaXRzdHJlYW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgLyogZG9uJ3Qga25vdyB0aGUgbGVuZ3RoICovCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+Y29uZmlnTW9kZSwgJnNlbGYtPlNhY0NvbmZpZ0NoYW5nZWQpKSB7CisgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgICAgICAgIH0KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOwogICAgICAgfQogICAgICAgYnJlYWs7Ci0jaWZkZWYgVFBfRUxEX0VOQUJMRQogICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6Ci0gICAgICBpZiAoKEVycm9yU3RhdHVzID0gRWxkU3BlY2lmaWNDb25maWdfUGFyc2Uoc2VsZiwgYnMsIGNiKSkgIT0gVFJBTlNQT1JUREVDX09LICkgeworICAgICAgaWYgKChFcnJvclN0YXR1cyA9IEVsZFNwZWNpZmljQ29uZmlnX1BhcnNlKHNlbGYsIGJzLCBjYikpICE9CisgICAgICAgICAgVFJBTlNQT1JUREVDX09LKSB7CiAgICAgICAgIHJldHVybiAoRXJyb3JTdGF0dXMpOwogICAgICAgfQogICAgICAgZnJhbWVMZW5ndGhGbGFnID0gc2VsZi0+bV9zYy5tX2VsZFNwZWNpZmljQ29uZmlnLm1fZnJhbWVMZW5ndGhGbGFnOwogICAgICAgc2VsZi0+bV9zYnJQcmVzZW50RmxhZyA9IHNlbGYtPm1fc2MubV9lbGRTcGVjaWZpY0NvbmZpZy5tX3NiclByZXNlbnRGbGFnOwotICAgICAgc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSA9IChzZWxmLT5tX3NjLm1fZWxkU3BlY2lmaWNDb25maWcubV9zYnJTYW1wbGluZ1JhdGUrMSkgKiBzZWxmLT5tX3NhbXBsaW5nRnJlcXVlbmN5OworICAgICAgc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSA9CisgICAgICAgICAgKHNlbGYtPm1fc2MubV9lbGRTcGVjaWZpY0NvbmZpZy5tX3NiclNhbXBsaW5nUmF0ZSArIDEpICoKKyAgICAgICAgICBzZWxmLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwogICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogVFBfRUxEX0VOQUJMRSAqLworICAgIGNhc2UgQU9UX1VTQUM6CisgICAgICBpZiAoKEVycm9yU3RhdHVzID0gVXNhY0NvbmZpZ19QYXJzZShzZWxmLCBicywgY2IpKSAhPSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICAgICAgcmV0dXJuIChFcnJvclN0YXR1cyk7CisgICAgICB9CisgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6CiAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKLSAgICAgIGJyZWFrOwogICB9CiAKICAgLyogRnJhbWUgbGVuZ3RoICovCi0gIHN3aXRjaCAoc2VsZi0+bV9hb3QpCi0gIHsKLSNpZiBkZWZpbmVkKFRQX0dBX0VOQUJMRSkgfHwgZGVmaW5lZChUUF9VU0FDX0VOQUJMRSkKKyAgc3dpdGNoIChzZWxmLT5tX2FvdCkgewogICAgIGNhc2UgQU9UX0FBQ19MQzoKKyAgICBjYXNlIEFPVF9BQUNfU0NBTDoKICAgICBjYXNlIEFPVF9FUl9BQUNfTEM6CiAgICAgY2FzZSBBT1RfRVJfQUFDX1NDQUw6CiAgICAgY2FzZSBBT1RfRVJfQlNBQzoKLSAgICAvKmNhc2UgQU9UX1VTQUM6Ki8KKyAgICAgIC8qY2FzZSBBT1RfVVNBQzoqLwogICAgICAgaWYgKCFmcmFtZUxlbmd0aEZsYWcpCiAgICAgICAgIHNlbGYtPm1fc2FtcGxlc1BlckZyYW1lID0gMTAyNDsKICAgICAgIGVsc2UKICAgICAgICAgc2VsZi0+bV9zYW1wbGVzUGVyRnJhbWUgPSA5NjA7CiAgICAgICBicmVhazsKLSNlbmRpZiAvKiBUUF9HQV9FTkFCTEUgKi8KLSNpZiBkZWZpbmVkKFRQX0dBX0VOQUJMRSkKICAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CiAgICAgICBpZiAoIWZyYW1lTGVuZ3RoRmxhZykKICAgICAgICAgc2VsZi0+bV9zYW1wbGVzUGVyRnJhbWUgPSA1MTI7CiAgICAgICBlbHNlCiAgICAgICAgIHNlbGYtPm1fc2FtcGxlc1BlckZyYW1lID0gNDgwOwogICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogZGVmaW5lZChUUF9HQV9FTkFCTEUpICovCiAgICAgZGVmYXVsdDoKICAgICAgIGJyZWFrOwogICB9CiAKLSAgc3dpdGNoIChzZWxmLT5tX2FvdCkKLSAgeworICBzd2l0Y2ggKHNlbGYtPm1fYW90KSB7CiAgICAgY2FzZSBBT1RfRVJfQUFDX0xDOgogICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgpAQCAtMTM1Nyw0MCArMjIyMCwxOTYgQEAKICAgICBjYXNlIEFPVF9FUl9DRUxQOgogICAgIGNhc2UgQU9UX0VSX0hWWEM6CiAgICAgY2FzZSBBT1RfRVJfQlNBQzoKLSAgICAgIHNlbGYtPm1fZXBDb25maWcgPSBGREtyZWFkQml0cyhicywyKTsKKyAgICAgIHNlbGYtPm1fZXBDb25maWcgPSBGREtyZWFkQml0cyhicywgMik7CiAKICAgICAgIGlmIChzZWxmLT5tX2VwQ29uZmlnID4gMSkgewotICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsgLy8gRVBDT05GSUc7CisgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOyAgLy8gRVBDT05GSUc7CiAgICAgICB9CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgYnJlYWs7CiAgIH0KIAotICBpZiAoZkV4cGxpY2l0QmFja3dhcmRDb21wYXRpYmxlKSB7CisgIGlmIChmRXhwbGljaXRCYWNrd2FyZENvbXBhdGlibGUgJiYKKyAgICAgIChzZWxmLT5tX2FvdCA9PSBBT1RfQUFDX0xDIHx8IHNlbGYtPm1fYW90ID09IEFPVF9FUl9BQUNfTEQgfHwKKyAgICAgICBzZWxmLT5tX2FvdCA9PSBBT1RfRVJfQlNBQykpIHsKICAgICBFcnJvclN0YXR1cyA9IEF1ZGlvU3BlY2lmaWNDb25maWdfRXh0ZW5zaW9uUGFyc2Uoc2VsZiwgYnMsIGNiKTsKICAgfQogCisgIC8qIENvcHkgY29uZmlnKCkgdG8gYXNjLT5jb25maWdbXSBidWZmZXIuICovCisgIGlmICgoRXJyb3JTdGF0dXMgPT0gVFJBTlNQT1JUREVDX09LKSAmJiAoc2VsZi0+bV9hb3QgPT0gQU9UX1VTQUMpKSB7CisgICAgSU5UIGNvbmZpZ1NpemVfYml0cyA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKSAtIChJTlQpYXNjU3RhcnRBbmNob3I7CisgICAgU3RvcmVDb25maWdBc0JpdHN0cmVhbShicywgY29uZmlnU2l6ZV9iaXRzLCBzZWxmLT5jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUUF9VU0FDX01BWF9DT05GSUdfTEVOKTsKKyAgICBzZWxmLT5jb25maWdCaXRzID0gZkFicyhjb25maWdTaXplX2JpdHMpOworICB9CisKICAgcmV0dXJuIChFcnJvclN0YXR1cyk7CiB9CiAKK3N0YXRpYyBUUkFOU1BPUlRERUNfRVJST1IgRHJtX3hIRUFBQ0RlY29kZXJDb25maWcoCisgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICphc2MsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgaW50IGF1ZGlvTW9kZSwKKyAgICBDU1RwQ2FsbEJhY2tzICpjYiAvKiB1c2UgY2IgPT0gTlVMTCB0byBzaWduYWwgY29uZmlnIGNoZWNrIG9ubHkgbW9kZSAqLworKSB7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19PSzsKKyAgQ1NVc2FjQ29uZmlnICp1c2MgPSAmYXNjLT5tX3NjLm1fdXNhY0NvbmZpZzsKKyAgaW50IGVsZW1JZHggPSAwOworCisgIHVzYy0+ZWxlbWVudFtlbGVtSWR4XS5tX3N0ZXJlb0NvbmZpZ0luZGV4ID0gMDsKKworICB1c2MtPm1fdXNhY051bUVsZW1lbnRzID0gMTsgLyogQ3VycmVudGx5IGFsbCBleHRlbnNpb24gZWxlbWVudHMgYXJlIHNraXBwZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IG9ubHkgb25lIFNDRSBvciBDUEUuICovCisKKyAgc3dpdGNoIChhdWRpb01vZGUpIHsKKyAgICBjYXNlIDA6IC8qIG1vbm86IElEX1VTQUNfU0NFICovCisgICAgICB1c2MtPmVsZW1lbnRbZWxlbUlkeF0udXNhY0VsZW1lbnRUeXBlID0gSURfVVNBQ19TQ0U7CisgICAgICB1c2MtPm1fblVzYWNDaGFubmVscyA9IDE7CisgICAgICB1c2MtPmVsZW1lbnRbZWxlbUlkeF0ubV9ub2lzZUZpbGxpbmcgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICAgICAgaWYgKHVzYy0+bV9zYnJSYXRpb0luZGV4ID4gMCkgeworICAgICAgICBpZiAoY2IgPT0gTlVMTCkgeworICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2ItPmNiU2JyICE9IE5VTEwpIHsKKyAgICAgICAgICB1c2MtPmVsZW1lbnRbZWxlbUlkeF0ubV9oYXJtb25pY1NCUiA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICAgICAgICB1c2MtPmVsZW1lbnRbZWxlbUlkeF0ubV9pbnRlclRlcyA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICAgICAgICB1c2MtPmVsZW1lbnRbZWxlbUlkeF0ubV9wdmMgPSBGREtyZWFkQml0KGhCcyk7CisgICAgICAgICAgaWYgKGNiLT5jYlNicihjYi0+Y2JTYnJEYXRhLCBoQnMsIGFzYy0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzYy0+bV9zYW1wbGVzUGVyRnJhbWUsIGFzYy0+bV9hb3QsIElEX1NDRSwgZWxlbUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYy0+ZWxlbWVudFtlbGVtSWR4XS5tX2hhcm1vbmljU0JSLAorICAgICAgICAgICAgICAgICAgICAgICAgdXNjLT5lbGVtZW50W2VsZW1JZHhdLm1fc3RlcmVvQ29uZmlnSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBhc2MtPmNvbmZpZ01vZGUsICZhc2MtPlNickNvbmZpZ0NoYW5nZWQsIDEpKSB7CisgICAgICAgICAgICByZXR1cm4gRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6IC8qIHN0ZXJlbzogSURfVVNBQ19DUEUgKi8KKyAgICAgIHVzYy0+ZWxlbWVudFtlbGVtSWR4XS51c2FjRWxlbWVudFR5cGUgPSBJRF9VU0FDX0NQRTsKKyAgICAgIHVzYy0+bV9uVXNhY0NoYW5uZWxzID0gMjsKKyAgICAgIHVzYy0+ZWxlbWVudFtlbGVtSWR4XS5tX25vaXNlRmlsbGluZyA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgICBpZiAodXNjLT5tX3NiclJhdGlvSW5kZXggPiAwKSB7CisgICAgICAgIHVzYy0+ZWxlbWVudFtlbGVtSWR4XS5tX2hhcm1vbmljU0JSID0gRkRLcmVhZEJpdChoQnMpOworICAgICAgICB1c2MtPmVsZW1lbnRbZWxlbUlkeF0ubV9pbnRlclRlcyA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICAgICAgdXNjLT5lbGVtZW50W2VsZW1JZHhdLm1fcHZjID0gRkRLcmVhZEJpdChoQnMpOworICAgICAgICB7CisgICAgICAgICAgSU5UIGJpdHNUb1NraXAgPSBza2lwU2JySGVhZGVyKGhCcywgMSk7CisgICAgICAgICAgLyogcmVhZCBzdGVyZW9Db25maWdJbmRleCAqLworICAgICAgICAgIHVzYy0+ZWxlbWVudFtlbGVtSWR4XS5tX3N0ZXJlb0NvbmZpZ0luZGV4ID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsKKyAgICAgICAgICAvKiByZXdpbmQgKi8KKyAgICAgICAgICBGREtwdXNoQmFjayhoQnMsIGJpdHNUb1NraXAgKyAyKTsKKyAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICBUaGUgYXBwbGljYXRpb24gb2YgdGhlIGZvbGxvd2luZyB0b29scyBpcyBtdXR1YWxseSBleGNsdXNpdmUgcGVyIGF1ZGlvCisgICAgICAgIHN0cmVhbSBjb25maWd1cmF0aW9uIChzZWUgY2xhdXNlIDUuMy4yLCB4SEUtQUFDIGNvZGVjIGNvbmZpZ3VyYXRpb24pOgorICAgICAgICAtIE1QUzIxMiBwYXJhbWV0cmljIHN0ZXJlbyB0b29sIHdpdGggcmVzaWR1YWwgY29kaW5nCisgICAgICAgIChzdGVyZW9Db25maWdJbmRleD4xKTsgYW5kCisgICAgICAgIC0gUU1GIGJhc2VkIEhhcm1vbmljIFRyYW5zcG9zZXIgKGhhcm1vbmljU0JSPT0xKS4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKCh1c2MtPmVsZW1lbnRbZWxlbUlkeF0ubV9zdGVyZW9Db25maWdJbmRleCA+IDEpICYmCisgICAgICAgICAgICB1c2MtPmVsZW1lbnRbZWxlbUlkeF0ubV9oYXJtb25pY1NCUikgeworICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICBUaGUgNDoxIHNiclJhdGlvIChzYnJSYXRpb0luZGV4PT0xIGluIFsxMV0pIG1heSBvbmx5IGJlIGVtcGxveWVkOgorICAgICAgICAtIGluIG1vbm8gb3BlcmF0aW9uOyBvcgorICAgICAgICAtIGluIHN0ZXJlbyBvcGVyYXRpb24gaWYgcGFyYW1ldHJpYyBzdGVyZW8gKE1QUzIxMikgd2l0aG91dCByZXNpZHVhbAorICAgICAgICBjb2RpbmcgaXMgYXBwbGllZCwgaS5lLiBpZiBzdGVyZW9Db25maWdJbmRleD09MSAoc2VlIGNsYXVzZSA1LjMuMiwKKyAgICAgICAgeEhFLUFBQyBjb2RlYyBjb25maWd1cmF0aW9uKS4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKCh1c2MtPm1fc2JyUmF0aW9JbmRleCA9PSAxKSAmJgorICAgICAgICAgICAgKHVzYy0+ZWxlbWVudFtlbGVtSWR4XS5tX3N0ZXJlb0NvbmZpZ0luZGV4ICE9IDEpKSB7CisgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmIChjYiA9PSBOVUxMKSB7CisgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICBNUDRfRUxFTUVOVF9JRCBlbF90eXBlID0KKyAgICAgICAgICAgICAgKHVzYy0+ZWxlbWVudFtlbGVtSWR4XS5tX3N0ZXJlb0NvbmZpZ0luZGV4ID09IDEgfHwKKyAgICAgICAgICAgICAgIHVzYy0+ZWxlbWVudFtlbGVtSWR4XS5tX3N0ZXJlb0NvbmZpZ0luZGV4ID09IDIpCisgICAgICAgICAgICAgICAgICA/IElEX1NDRQorICAgICAgICAgICAgICAgICAgOiBJRF9DUEU7CisgICAgICAgICAgaWYgKGNiLT5jYlNiciA9PSBOVUxMKSByZXR1cm4gRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfVU5LT1dOX0VSUk9SOworICAgICAgICAgIGlmIChjYi0+Y2JTYnIoY2ItPmNiU2JyRGF0YSwgaEJzLCBhc2MtPm1fc2FtcGxpbmdGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICBhc2MtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICBhc2MtPm1fc2FtcGxlc1BlckZyYW1lLCBhc2MtPm1fYW90LCBlbF90eXBlLCBlbGVtSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgdXNjLT5lbGVtZW50W2VsZW1JZHhdLm1faGFybW9uaWNTQlIsCisgICAgICAgICAgICAgICAgICAgICAgICB1c2MtPmVsZW1lbnRbZWxlbUlkeF0ubV9zdGVyZW9Db25maWdJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzYy0+Y29uZmlnTW9kZSwgJmFzYy0+U2JyQ29uZmlnQ2hhbmdlZCwgMSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyp1c2MtPmVsZW1lbnRbZWxlbUlkeF0ubV9zdGVyZW9Db25maWdJbmRleCA9Ki9GREtyZWFkQml0cyhoQnMsIDIpOworICAgICAgICBpZiAodXNjLT5lbGVtZW50W2VsZW1JZHhdLm1fc3RlcmVvQ29uZmlnSW5kZXggPiAwKSB7CisgICAgICAgICAgaWYgKGNiLT5jYlNzYyAhPSBOVUxMKSB7CisgICAgICAgICAgICBFcnJvclN0YXR1cyA9IChUUkFOU1BPUlRERUNfRVJST1IpY2ItPmNiU3NjKAorICAgICAgICAgICAgICAgIGNiLT5jYlNzY0RhdGEsIGhCcywKKyAgICAgICAgICAgICAgICBBT1RfRFJNX1VTQUMsIC8qIHN5bnRheCBkaWZmZXJzIGZyb20gTVBFRyBNcHMyMTJDb25maWcoKSAqLworICAgICAgICAgICAgICAgIGFzYy0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICB1c2MtPmVsZW1lbnRbZWxlbUlkeF0ubV9zdGVyZW9Db25maWdJbmRleCwKKyAgICAgICAgICAgICAgICB1c2MtPm1fY29yZVNickZyYW1lTGVuZ3RoSW5kZXgsIDAsIC8qIGRvbid0IGtub3cgdGhlIGxlbmd0aCAqLworICAgICAgICAgICAgICAgIGFzYy0+Y29uZmlnTW9kZSwgJmFzYy0+U2FjQ29uZmlnQ2hhbmdlZCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsgKi8KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICB9CisKKyAgcmV0dXJuIEVycm9yU3RhdHVzOworfQorCitUUkFOU1BPUlRERUNfRVJST1IgRHJtX3hIRUFBQ1N0YXRpY0NvbmZpZygKKyAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKmFzYywgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIGludCBhdWRpb01vZGUsCisgICAgQ1NUcENhbGxCYWNrcyAqY2IgLyogdXNlIGNiID09IE5VTEwgdG8gc2lnbmFsIGNvbmZpZyBjaGVjayBvbmx5IG1vZGUgKi8KKykgeworICBpbnQgY29yZVNickZyYW1lTGVuZ3RoSW5kZXhEcm0gPSBGREtyZWFkQml0cyhicywgMik7CisgIGlmIChVc2FjQ29uZmlnX1NldENvcmVTYnJGcmFtZUxlbmd0aEluZGV4KAorICAgICAgICAgIGFzYywgY29yZVNickZyYW1lTGVuZ3RoSW5kZXhEcm0gKyAxKSAhPSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICB9CisKKyAgYXNjLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uID0gKGF1ZGlvTW9kZSkgPyAyIDogMTsKKworICBpZiAoRHJtX3hIRUFBQ0RlY29kZXJDb25maWcoYXNjLCBicywgYXVkaW9Nb2RlLCBjYikgIT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgfQorCisgIHJldHVybiBUUkFOU1BPUlRERUNfT0s7Cit9CisKKy8qIE1hcHBpbmcgb2YgRFJNIGF1ZGlvIHNhbXBsaW5nIHJhdGUgZmllbGQgdG8gTVBFRyB1c2FjU2FtcGxpbmdGcmVxdWVuY3lJbmRleAorICovCitjb25zdCBVQ0hBUiBtYXBTcjJNUEVHSWR4WzhdID0geworICAgIDB4MWIsIC8qICA5LjYga0h6ICovCisgICAgMHgwOSwgLyogMTIuMCBrSHogKi8KKyAgICAweDA4LCAvKiAxNi4wIGtIeiAqLworICAgIDB4MTcsIC8qIDE5LjIga0h6ICovCisgICAgMHgwNiwgLyogMjQuMCBrSHogKi8KKyAgICAweDA1LCAvKiAzMi4wIGtIeiAqLworICAgIDB4MTIsIC8qIDM4LjQga0h6ICovCisgICAgMHgwMyAgLyogNDguMCBrSHogKi8KK307CisKIFRSQU5TUE9SVERFQ19FUlJPUiBEcm1SYXdTZGNBdWRpb0NvbmZpZ19QYXJzZSgKLSAgICAgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpzZWxmLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGJzCi0gICAgICAgICkKLXsKKyAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgIENTVHBDYWxsQmFja3MgKmNiLCAvKiB1c2UgY2IgPT0gTlVMTCB0byBzaWduYWwgY29uZmlnIGNoZWNrIG9ubHkgbW9kZSAqLworICAgIFVDSEFSIGNvbmZpZ01vZGUsIFVDSEFSIGNvbmZpZ0NoYW5nZWQpIHsKICAgVFJBTlNQT1JUREVDX0VSUk9SIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX09LOwogCiAgIEF1ZGlvU3BlY2lmaWNDb25maWdfSW5pdChzZWxmKTsKIAotICBpZiAoKElOVClGREtnZXRWYWxpZEJpdHMoYnMpIDwgMjApIHsKKyAgaWYgKChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJzKSA8IDE2KSB7CiAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CiAgICAgZ290byBiYWlsOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIC8qIERSTSAtIEF1ZGlvIGluZm9ybWF0aW9uIGRhdGEgZW50aXR5IC0gdHlwZSA5Ci0gICAgICAgLSBTaG9ydCBJZCAgICAgICAgICAgIDIgYml0cwotICAgICAgIC0gU3RyZWFtIElkICAgICAgICAgICAyIGJpdHMKKyAgICAgICAtIFNob3J0IElkICAgICAgICAgICAgMiBiaXRzIChub3QgcGFydCBvZiB0aGUgY29uZmlnIGJ1ZmZlcikKKyAgICAgICAtIFN0cmVhbSBJZCAgICAgICAgICAgMiBiaXRzIChub3QgcGFydCBvZiB0aGUgY29uZmlnIGJ1ZmZlcikKICAgICAgICAtIGF1ZGlvIGNvZGluZyAgICAgICAgMiBiaXRzCiAgICAgICAgLSBTQlIgZmxhZyAgICAgICAgICAgIDEgYml0CiAgICAgICAgLSBhdWRpbyBtb2RlICAgICAgICAgIDIgYml0cwpAQCAtMTQwMiw1NCArMjQyMSw2NCBAQAogCiAgICAgaW50IGF1ZGlvQ29kaW5nLCBhdWRpb01vZGUsIGNTYW1wbGluZ0ZyZXEsIGNvZGVyRmllbGQsIHNmSWR4LCBzYnJGbGFnOwogCisgICAgc2VsZi0+Y29uZmlnTW9kZSA9IGNvbmZpZ01vZGU7CisgICAgc2VsZi0+QWFjQ29uZmlnQ2hhbmdlZCA9IGNvbmZpZ0NoYW5nZWQ7CisgICAgc2VsZi0+U2JyQ29uZmlnQ2hhbmdlZCA9IGNvbmZpZ0NoYW5nZWQ7CisgICAgc2VsZi0+U2FjQ29uZmlnQ2hhbmdlZCA9IGNvbmZpZ0NoYW5nZWQ7CisKICAgICAvKiBSZWFkIHRoZSBTREMgZmllbGQgKi8KLSAgICBGREtyZWFkQml0cyhicyw0KTsgICAvKiBTaG9ydCBhbmQgU3RyZWFtIElkICovCisgICAgYXVkaW9Db2RpbmcgPSBGREtyZWFkQml0cyhicywgMik7CisgICAgc2JyRmxhZyA9IEZES3JlYWRCaXRzKGJzLCAxKTsKKyAgICBhdWRpb01vZGUgPSBGREtyZWFkQml0cyhicywgMik7CisgICAgY1NhbXBsaW5nRnJlcSA9IEZES3JlYWRCaXRzKGJzLCAzKTsgLyogYXVkaW8gc2FtcGxpbmcgcmF0ZSAqLwogCi0gICAgYXVkaW9Db2RpbmcgICA9IEZES3JlYWRCaXRzKGJzLCAyKTsKLSAgICBzYnJGbGFnICAgICAgID0gRkRLcmVhZEJpdHMoYnMsIDEpOwotICAgIGF1ZGlvTW9kZSAgICAgPSBGREtyZWFkQml0cyhicywgMik7Ci0gICAgY1NhbXBsaW5nRnJlcSA9IEZES3JlYWRCaXRzKGJzLCAzKTsgICAgLyogYXVkaW8gc2FtcGxpbmcgcmF0ZSAqLwotCi0gICAgRkRLcmVhZEJpdHMoYnMsIDIpOyAgLyogVGV4dCBhbmQgZW5oYW5jZW1lbnQgZmxhZyAqLwotICAgIGNvZGVyRmllbGQgICA9IEZES3JlYWRCaXRzKGJzLCA1KTsKLSAgICBGREtyZWFkQml0cyhicywgMSk7ICAvKiByZmEgKi8KKyAgICBGREtyZWFkQml0cyhicywgMik7IC8qIFRleHQgYW5kIGVuaGFuY2VtZW50IGZsYWcgKi8KKyAgICBjb2RlckZpZWxkID0gRkRLcmVhZEJpdHMoYnMsIDUpOworICAgIEZES3JlYWRCaXRzKGJzLCAxKTsgLyogcmZhICovCiAKICAgICAvKiBFdmFsdWF0ZSBjb25maWd1cmF0aW9uIGFuZCBmaWxsIHRoZSBBU0MgKi8KLSAgICBzd2l0Y2ggKGNTYW1wbGluZ0ZyZXEpIHsKLSAgICBjYXNlIDA6IC8qICA4IGtIeiAqLwotICAgICAgc2ZJZHggPSAxMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTogLyogMTIga0h6ICovCi0gICAgICBzZklkeCA9IDk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6IC8qIDE2IGtIeiAqLwotICAgICAgc2ZJZHggPSA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOiAvKiAyNCBrSHogKi8KLSAgICAgIHNmSWR4ID0gNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNTogLyogNDgga0h6ICovCi0gICAgICBzZklkeCA9IDM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6IC8qIHJlc2VydmVkICovCi0gICAgY2FzZSA2OiAvKiByZXNlcnZlZCAqLwotICAgIGNhc2UgNzogLyogcmVzZXJ2ZWQgKi8KLSAgICBkZWZhdWx0OgotICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7Ci0gICAgICBnb3RvIGJhaWw7CisgICAgaWYgKGF1ZGlvQ29kaW5nID09IDMpIHsKKyAgICAgIHNmSWR4ID0gKGludCltYXBTcjJNUEVHSWR4W2NTYW1wbGluZ0ZyZXFdOworICAgICAgc2JyRmxhZyA9IDA7IC8qIHJmYSAqLworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKGNTYW1wbGluZ0ZyZXEpIHsKKyAgICAgICAgY2FzZSAwOiAvKiAgOCBrSHogKi8KKyAgICAgICAgICBzZklkeCA9IDExOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6IC8qIDEyIGtIeiAqLworICAgICAgICAgIHNmSWR4ID0gOTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOiAvKiAxNiBrSHogKi8KKyAgICAgICAgICBzZklkeCA9IDg7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzogLyogMjQga0h6ICovCisgICAgICAgICAgc2ZJZHggPSA2OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6IC8qIDQ4IGtIeiAqLworICAgICAgICAgIHNmSWR4ID0gMzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OiAvKiByZXNlcnZlZCAqLworICAgICAgICBjYXNlIDY6IC8qIHJlc2VydmVkICovCisgICAgICAgIGNhc2UgNzogLyogcmVzZXJ2ZWQgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CiAgICAgfQogCiAgICAgc2VsZi0+bV9zYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ID0gc2ZJZHg7CiAgICAgc2VsZi0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IFNhbXBsaW5nUmF0ZVRhYmxlW3NmSWR4XTsKIAotICAgIGlmICggc2JyRmxhZyApIHsKKyAgICBpZiAoc2JyRmxhZykgewogICAgICAgVUlOVCBpOwogICAgICAgaW50IHRtcCA9IC0xOwogICAgICAgc2VsZi0+bV9zYnJQcmVzZW50RmxhZyA9IDE7CiAgICAgICBzZWxmLT5tX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZSA9IEFPVF9TQlI7CiAgICAgICBzZWxmLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5ID0gc2VsZi0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA8PCAxOwotICAgICAgZm9yIChpPTA7IGk8KHNpemVvZihTYW1wbGluZ1JhdGVUYWJsZSkvc2l6ZW9mKFNhbXBsaW5nUmF0ZVRhYmxlWzBdKSk7IGkrKyl7Ci0gICAgICAgIGlmIChTYW1wbGluZ1JhdGVUYWJsZVtpXSA9PSBzZWxmLT5tX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5KXsKKyAgICAgIGZvciAoaSA9IDA7CisgICAgICAgICAgIGkgPCAoc2l6ZW9mKFNhbXBsaW5nUmF0ZVRhYmxlKSAvIHNpemVvZihTYW1wbGluZ1JhdGVUYWJsZVswXSkpOworICAgICAgICAgICBpKyspIHsKKyAgICAgICAgaWYgKFNhbXBsaW5nUmF0ZVRhYmxlW2ldID09IHNlbGYtPm1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3kpIHsKICAgICAgICAgICB0bXAgPSBpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNDU5LDIwICsyNDg4LDIzIEBACiAKICAgICBzd2l0Y2ggKGF1ZGlvQ29kaW5nKSB7CiAgICAgICBjYXNlIDA6IC8qIEFBQyAqLwotICAgICAgICAgIHNlbGYtPm1fYW90ID0gQU9UX0RSTV9BQUMgICAgIDsgIC8qIFNldCBwc2V1ZG8gQU9UIGZvciBEcm0gQUFDICovCi0KKyAgICAgICAgaWYgKChjb2RlckZpZWxkID4+IDIpICYmIChhdWRpb01vZGUgIT0gMSkpIHsKKyAgICAgICAgICBzZWxmLT5tX2FvdCA9IEFPVF9EUk1fU1VSUk9VTkQ7IC8qIFNldCBwc2V1ZG8gQU9UIGZvciBEcm0gU3Vycm91bmQgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZWxmLT5tX2FvdCA9IEFPVF9EUk1fQUFDOyAvKiBTZXQgcHNldWRvIEFPVCBmb3IgRHJtIEFBQyAqLworICAgICAgICB9CiAgICAgICAgIHN3aXRjaCAoYXVkaW9Nb2RlKSB7Ci0gICAgICAgIGNhc2UgMTogLyogcGFyYW1ldHJpYyBzdGVyZW8gKi8KLSAgICAgICAgICBzZWxmLT5tX3BzUHJlc2VudEZsYWcgPSAxOwotICAgICAgICBjYXNlIDA6IC8qIG1vbm8gKi8KLSAgICAgICAgICBzZWxmLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uID0gMTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOiAvKiBzdGVyZW8gKi8KLSAgICAgICAgICBzZWxmLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uID0gMjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKLSAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgY2FzZSAxOiAvKiBwYXJhbWV0cmljIHN0ZXJlbyAqLworICAgICAgICAgICAgc2VsZi0+bV9wc1ByZXNlbnRGbGFnID0gMTsKKyAgICAgICAgICBjYXNlIDA6IC8qIG1vbm8gKi8KKyAgICAgICAgICAgIHNlbGYtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOiAvKiBzdGVyZW8gKi8KKyAgICAgICAgICAgIHNlbGYtPm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgZ290byBiYWlsOwogICAgICAgICB9CiAgICAgICAgIHNlbGYtPm1fdmNiMTFGbGFnID0gMTsKICAgICAgICAgc2VsZi0+bV9oY3JGbGFnID0gMTsKQEAgLTE0ODcsNyArMjUxOSwyMiBAQAogICAgICAgICBzZWxmLT5tX2FvdCA9IEFPVF9FUl9IVlhDOwogICAgICAgICBzZWxmLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uID0gMTsKICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDM6IC8qIHJlc2VydmVkICovCisgICAgICBjYXNlIDM6IC8qIHhIRS1BQUMgKi8KKyAgICAgIHsKKyAgICAgICAgLyogcGF5bG9hZCBpcyBNUEVHIGNvbmZvcm0gLT4gbm8gcHNldWRvIERSTSBBT1QgbmVlZGVkICovCisgICAgICAgIHNlbGYtPm1fYW90ID0gQU9UX1VTQUM7CisgICAgICB9CisgICAgICAgIHN3aXRjaCAoYXVkaW9Nb2RlKSB7CisgICAgICAgICAgY2FzZSAwOiAvKiBtb25vICovCisgICAgICAgICAgY2FzZSAyOiAvKiBzdGVyZW8gKi8KKyAgICAgICAgICAgIC8qIGNvZGVjIHNwZWNpZmljIGNvbmZpZyA4biBiaXRzICovCisgICAgICAgICAgICBFcnJvclN0YXR1cyA9IERybV94SEVBQUNTdGF0aWNDb25maWcoc2VsZiwgYnMsIGF1ZGlvTW9kZSwgY2IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogICAgICAgZGVmYXVsdDoKICAgICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CiAgICAgICAgIHNlbGYtPm1fYW90ID0gQU9UX05PTkU7CkBAIC0xNTAzLDQgKzI1NTAsMyBAQAogYmFpbDoKICAgcmV0dXJuIChFcnJvclN0YXR1cyk7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfZHJtLmNwcCBiL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfZHJtLmNwcAppbmRleCBkZjMxOWU1Li4yN2MxYzFkIDEwMDY0NAotLS0gYS9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2RybS5jcHAKKysrIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19kcm0uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIzICs5MCwyMSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTVBFRyB0cmFuc3BvcnQgZm9ybWF0IGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIENocmlzdGlhbiBHcmllYmVsCisKICAgIERlc2NyaXB0aW9uOiBEUk0gdHJhbnNwb3J0IHN0dWZmCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJ0cGRlY19kcm0uaCIKIAotCiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgogCi0KLQotdm9pZCBkcm1SZWFkX0NyY0luaXQoSEFORExFX0RSTSBwRHJtKSAgICAgIC8qITwgcG9pbnRlciB0byBkcm0gY3JjIGluZm8gc3R1Y3R1cmUgKi8KK3ZvaWQgZHJtUmVhZF9DcmNJbml0KEhBTkRMRV9EUk0gcERybSkgLyohPCBwb2ludGVyIHRvIGRybSBjcmMgaW5mbyBzdHVjdHVyZSAqLwogewogICBGREtfQVNTRVJUKHBEcm0gIT0gTlVMTCk7CiAKQEAgLTEwMyw0NCArMTEyLDM3IEBACiB9CiAKIGludCBkcm1SZWFkX0NyY1N0YXJ0UmVnKAotICAgICAgICAgICAgICAgICAgICAgSEFORExFX0RSTSBwRHJtLCAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBkcm0gc3R1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgICAvKiE8IGhhbmRsZSB0byBjdXJyZW50IGJpdCBidWZmZXIgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgICAgICBpbnQgbUJpdHMgICAgICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgYml0cyBpbiBjcmMgcmVnaW9uICovCi0gICAgICAgICAgICAgICAgICAgKQoteworICAgIEhBTkRMRV9EUk0gcERybSwgICAgICAgICAgLyohPCBwb2ludGVyIHRvIGRybSBzdHVjdHVyZSAqLworICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgLyohPCBoYW5kbGUgdG8gY3VycmVudCBiaXQgYnVmZmVyIHN0cnVjdHVyZSAqLworICAgIGludCBtQml0cyAgICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgYml0cyBpbiBjcmMgcmVnaW9uICovCispIHsKICAgRkRLX0FTU0VSVChwRHJtICE9IE5VTEwpOwogCiAgIEZES2NyY1Jlc2V0KCZwRHJtLT5jcmNJbmZvKTsKIAogICBwRHJtLT5jcmNSZWFkVmFsdWUgPSBGREtyZWFkQml0cyhoQnMsIDgpOwogCi0gIHJldHVybiAoIEZES2NyY1N0YXJ0UmVnKCZwRHJtLT5jcmNJbmZvLCBoQnMsIG1CaXRzKSApOwotCisgIHJldHVybiAoRkRLY3JjU3RhcnRSZWcoJnBEcm0tPmNyY0luZm8sIGhCcywgbUJpdHMpKTsKIH0KIAogdm9pZCBkcm1SZWFkX0NyY0VuZFJlZygKLSAgICAgICAgICAgICAgICAgICAgSEFORExFX0RSTSBwRHJtLCAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gZHJtIGNyYyBpbmZvIHN0dWN0dXJlICovCi0gICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgICAgLyohPCBoYW5kbGUgdG8gY3VycmVudCBiaXQgYnVmZmVyIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgICAgICBpbnQgcmVnICAgICAgICAgICAgICAgICAgICAgIC8qITwgY3JjIHJlZ2lvbiAqLwotICAgICAgICAgICAgICAgICAgKQoteworICAgIEhBTkRMRV9EUk0gcERybSwgICAgICAgICAgLyohPCBwb2ludGVyIHRvIGRybSBjcmMgaW5mbyBzdHVjdHVyZSAqLworICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgLyohPCBoYW5kbGUgdG8gY3VycmVudCBiaXQgYnVmZmVyIHN0cnVjdHVyZSAqLworICAgIGludCByZWcgICAgICAgICAgICAgICAgICAgLyohPCBjcmMgcmVnaW9uICovCispIHsKICAgRkRLX0FTU0VSVChwRHJtICE9IE5VTEwpOwogCiAgIEZES2NyY0VuZFJlZygmcERybS0+Y3JjSW5mbywgaEJzLCByZWcpOwogfQogCi1UUkFOU1BPUlRERUNfRVJST1IgZHJtUmVhZF9DcmNDaGVjayggSEFORExFX0RSTSBwRHJtICkKLXsKK1RSQU5TUE9SVERFQ19FUlJPUiBkcm1SZWFkX0NyY0NoZWNrKEhBTkRMRV9EUk0gcERybSkgewogICBUUkFOU1BPUlRERUNfRVJST1IgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfT0s7CiAgIFVTSE9SVCBjcmM7CiAKICAgY3JjID0gRkRLY3JjR2V0Q1JDKCZwRHJtLT5jcmNJbmZvKSBeIDB4RkY7Ci0gIGlmIChjcmMgIT0gcERybS0+Y3JjUmVhZFZhbHVlKQotICB7CisgIGlmIChjcmMgIT0gcERybS0+Y3JjUmVhZFZhbHVlKSB7CiAgICAgcmV0dXJuIChUUkFOU1BPUlRERUNfQ1JDX0VSUk9SKTsKICAgfQogCiAgIHJldHVybiAoRXJyb3JTdGF0dXMpOwogfQotCi0KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfZHJtLmggYi9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2RybS5oCmluZGV4IDIxNjFiNGMuLjA5ODIyZGMgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfZHJtLmgKKysrIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19kcm0uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyNyArOTAsMjYgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKKwogICAgRGVzY3JpcHRpb246IERSTSBpbnRlcmZhY2UKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmbmRlZiBUUERFQ19EUk1fSAogI2RlZmluZSBUUERFQ19EUk1fSAogCiAjaW5jbHVkZSAidHBkZWNfbGliLmgiCiAKLQogI2luY2x1ZGUgIkZES19jcmMuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgewotCi0gIEZES19DUkNJTkZPIGNyY0luZm87ICAgICAgICAgICAgIC8qIENSQyBzdGF0ZSBpbmZvICovCi0gIFVTSE9SVCAgICAgIGNyY1JlYWRWYWx1ZTsgICAgICAgIC8qIENSQyB2YWx1ZSByZWFkIGZyb20gYml0c3RyZWFtIGRhdGEgKi8KKyAgRkRLX0NSQ0lORk8gY3JjSW5mbzsgLyogQ1JDIHN0YXRlIGluZm8gKi8KKyAgVVNIT1JUIGNyY1JlYWRWYWx1ZTsgLyogQ1JDIHZhbHVlIHJlYWQgZnJvbSBiaXRzdHJlYW0gZGF0YSAqLwogCiB9IFNUUlVDVF9EUk07CiAKQEAgLTExMiwxNSArMTIyLDE0IEBACiAKICAgXHJldHVybiAgbm9uZQogKi8KLXZvaWQgZHJtUmVhZF9DcmNJbml0KCBIQU5ETEVfRFJNIHBEcm0gKTsKK3ZvaWQgZHJtUmVhZF9DcmNJbml0KEhBTkRMRV9EUk0gcERybSk7CiAKIC8qKgogICogXGJyaWVmIFN0YXJ0cyBDUkMgcmVnaW9uIHdpdGggYSBtYXhpbXVtIG51bWJlciBvZiBiaXRzCi0gKiAgICAgICAgSWYgbUJpdHMgaXMgcG9zaXRpdmUgemVybyBwYWRkaW5nIHdpbGwgYmUgdXNlZCBmb3IgQ1JDIGNhbGN1bGF0aW9uLCBpZiB0aGVyZQotICogICAgICAgIGFyZSBsZXNzIHRoYW4gbUJpdHMgYml0cyBhdmFpbGFibGUuCi0gKiAgICAgICAgSWYgbUJpdHMgaXMgbmVnYXRpdmUgbm8gemVybyBwYWRkaW5nIGlzIGRvbmUuCi0gKiAgICAgICAgSWYgbUJpdHMgaXMgemVybyB0aGUgbWVtb3J5IGZvciB0aGUgYnVmZmVyIGlzIGFsbG9jYXRlZCBkeW5hbWljYWxseSwgdGhlCi0gKiAgICAgICAgbnVtYmVyIG9mIGJpdHMgaXMgbm90IGxpbWl0ZWQuCisgKiAgICAgICAgSWYgbUJpdHMgaXMgcG9zaXRpdmUgemVybyBwYWRkaW5nIHdpbGwgYmUgdXNlZCBmb3IgQ1JDIGNhbGN1bGF0aW9uLCBpZgorICogdGhlcmUgYXJlIGxlc3MgdGhhbiBtQml0cyBiaXRzIGF2YWlsYWJsZS4gSWYgbUJpdHMgaXMgbmVnYXRpdmUgbm8gemVybworICogcGFkZGluZyBpcyBkb25lLiBJZiBtQml0cyBpcyB6ZXJvIHRoZSBtZW1vcnkgZm9yIHRoZSBidWZmZXIgaXMKKyAqIGFsbG9jYXRlZCBkeW5hbWljYWxseSwgdGhlIG51bWJlciBvZiBiaXRzIGlzIG5vdCBsaW1pdGVkLgogICoKICAqIFxwYXJhbSBwRHJtIERSTSBkYXRhIGhhbmRsZQogICogXHBhcmFtIGhCcyBiaXRzdHJlYW0gaGFuZGxlLCBvbiB3aGljaCB0aGUgQ1JDIHJlZ2lvbiByZWZlcmVzIHRvCkBAIC0xMjgsMTEgKzEzNyw3IEBACiAgKgogICogXHJldHVybiAgSUQgZm9yIHRoZSBjcmVhdGVkIHJlZ2lvbiwgLTEgaW4gY2FzZSBvZiBhbiBlcnJvcgogICovCi1pbnQgZHJtUmVhZF9DcmNTdGFydFJlZygKLSAgICAgICAgSEFORExFX0RSTSBwRHJtLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIGludCBtQml0cwotICAgICAgICApOworaW50IGRybVJlYWRfQ3JjU3RhcnRSZWcoSEFORExFX0RSTSBwRHJtLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIGludCBtQml0cyk7CiAKIC8qKgogICogXGJyaWVmIEVuZHMgQ1JDIHJlZ2lvbiBpZGVudGlmaWVkIGJ5IHJlZwpAQCAtMTQzLDUyICsxNDgsNTUgQEAKICAqCiAgKiBccmV0dXJuICBub25lCiAgKi8KLXZvaWQgZHJtUmVhZF9DcmNFbmRSZWcoCi0gICAgICAgIEhBTkRMRV9EUk0gcERybSwKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAotICAgICAgICBpbnQgcmVnCi0gICAgICAgICk7Cit2b2lkIGRybVJlYWRfQ3JjRW5kUmVnKEhBTkRMRV9EUk0gcERybSwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBpbnQgcmVnKTsKIAogLyoqCiAgKiBcYnJpZWYgQ2hlY2sgQ1JDCiAgKgotICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50bHkgY2FsY3VsYXRlZCBDUkMgbWF0Y2hlcyB0aGUgQ1JDIGZpZWxkIHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtCi0gKiBEZWxldGVzIGFsbCBDUkMgcmVnaW9ucy4KKyAqIENoZWNrcyBpZiB0aGUgY3VycmVudGx5IGNhbGN1bGF0ZWQgQ1JDIG1hdGNoZXMgdGhlIENSQyBmaWVsZCByZWFkIGZyb20gdGhlCisgKiBiaXRzdHJlYW0gRGVsZXRlcyBhbGwgQ1JDIHJlZ2lvbnMuCiAgKgogICogXHBhcmFtIHBEcm0gRFJNIGRhdGEgaGFuZGxlCiAgKgogICogXHJldHVybiBSZXR1cm5zIDAgaWYgdGhleSBhcmUgaWRlbnRpY2FsIG90aGVyd2lzZSAxCiAgKi8KLVRSQU5TUE9SVERFQ19FUlJPUiBkcm1SZWFkX0NyY0NoZWNrKCBIQU5ETEVfRFJNIHBEcm0gKTsKK1RSQU5TUE9SVERFQ19FUlJPUiBkcm1SZWFkX0NyY0NoZWNrKEhBTkRMRV9EUk0gcERybSk7CiAKIC8qKgogICogXGJyaWVmIENoZWNrIGlmIHdlIGhhdmUgYSB2YWxpZCBEUk0gZnJhbWUgYXQgdGhlIGN1cnJlbnQgYml0YnVmZmVyIHBvc2l0aW9uCiAgKgogICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIGVub3VnaCBiaXRzIGluIGJ1ZmZlciBmb3IgdGhlIGN1cnJlbnQgZnJhbWUuCiAgKiBJdCByZWFkcyBvdXQgdGhlIGhlYWRlciBiaXRzIHRvIHByZXBhcmUgdGhlIGJpdGJ1ZmZlciBmb3IgdGhlIGRlY29kZSBsb29wLgotICogSW4gY2FzZSB0aGUgaGVhZGVyIGJpdHMgc2hvdyBhbiBpbnZhbGlkIGJpdHN0cmVhbS9mcmFtZSwgdGhlIHdob2xlIGZyYW1lIGlzIHNraXBwZWQuCisgKiBJbiBjYXNlIHRoZSBoZWFkZXIgYml0cyBzaG93IGFuIGludmFsaWQgYml0c3RyZWFtL2ZyYW1lLCB0aGUgd2hvbGUgZnJhbWUgaXMKKyAqIHNraXBwZWQuCiAgKgogICogXHBhcmFtIHBEcm0gRFJNIGRhdGEgaGFuZGxlIHdoaWNoIGlzIGZpbGxlZCB3aXRoIHBhcnNlZCBEUk0gaGVhZGVyIGRhdGEKICAqIFxwYXJhbSBicyBoYW5kbGUgb2YgYml0c3RyZWFtIGZyb20gd2hvbSB0aGUgRFJNIGhlYWRlciBpcyByZWFkCiAgKgogICogXHJldHVybiAgZXJyb3Igc3RhdHVzCiAgKi8KLVRSQU5TUE9SVERFQ19FUlJPUiBkcm1SZWFkX0RlY29kZUhlYWRlcigKLSAgICAgICAgSEFORExFX0RSTSAgICAgICAgICAgIHBEcm0sCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBicwotICAgICAgICApOworVFJBTlNQT1JUREVDX0VSUk9SIGRybVJlYWRfRGVjb2RlSGVhZGVyKEhBTkRMRV9EUk0gcERybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicyk7CiAKIC8qKgogICogXGJyaWVmICAgUGFyc2UgYSBEcm0gc3BlY2lmaWMgU0RDIGF1ZGlvIGNvbmZpZyBmcm9tIGEgZ2l2ZW4gYml0c3RyZWFtIGhhbmRsZS4KICAqCi0gKiBccGFyYW0gcEFzYyAgICAgICAgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIENTQXVkaW9TcGVjaWZpY0NvbmZpZyBzdHJ1Y3QuCisgKiBccGFyYW0gcEFzYyAgICAgICAgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkCisgKiBDU0F1ZGlvU3BlY2lmaWNDb25maWcgc3RydWN0LgogICogXHBhcmFtIGhCcyAgICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtIGhhbmRsZS4KKyAqIFxwYXJhbSBjYiAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byBzdHJ1Y3R1cmUgaG9sZGluZyBjYWxsYmFjaworICogaW5mb3JtYXRpb24gTm90ZTogQSBOVUxMIHBvaW50ZXIgZm9yIGNiIGNhbiBiZSB1c2VkIHRvIHNpZ25hbCBhICJDaGVjayBDb25maWcKKyAqIG9ubHkgZnVuY3Rpb25hbGl0eSIKKyAqIFxwYXJhbSBjb25maWdNb2RlICAgICAgICAgICAgICAgICAgIENvbmZpZyBtb2RlczogbWVtb3J5IGFsbG9jYXRpb24gbW9kZSBvcgorICogY29uZmlnIGNoYW5nZSBkZXRlY3Rpb24gbW9kZQorICogXHBhcmFtIGNvbmZpZ0NoYW5nZWQgICAgICAgICAgICAgICAgSW5kaWNhdGVzIGEgY29uZmlnIGNoYW5nZQogICoKICAqIFxyZXR1cm4gIFRvdGFsIGVsZW1lbnQgY291bnQgaW5jbHVkaW5nIGFsbCBTQ0UsIENQRSBhbmQgTEZFLgogICovCi1UUkFOU1BPUlRERUNfRVJST1IgRHJtUmF3U2RjQXVkaW9Db25maWdfUGFyc2UoIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzICk7Ci0KLQorVFJBTlNQT1JUREVDX0VSUk9SIERybVJhd1NkY0F1ZGlvQ29uZmlnX1BhcnNlKENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgY29uZmlnTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBjb25maWdDaGFuZ2VkKTsKIAogI2VuZGlmIC8qIFRQREVDX0RSTV9IICovCmRpZmYgLS1naXQgYS9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2xhdG0uY3BwIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19sYXRtLmNwcAppbmRleCA1NzEwZDc3Li4yZWRmMDU1IDEwMDY0NAotLS0gYS9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2xhdG0uY3BwCisrKyBiL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfbGF0bS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksOTEgKzkwLDE1NSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTVBFRyB0cmFuc3BvcnQgZm9ybWF0IGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIERhbmllbCBIb21tCisKICAgIERlc2NyaXB0aW9uOgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAidHBkZWNfbGF0bS5oIgogCi0KICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAKKyNkZWZpbmUgVFBERUNfVFJBQ0tJTkRFWChwLCBsKSAoMSAqIChwKSArIChsKSkKIAotI2RlZmluZSBUUERFQ19UUkFDS0lOREVYKHAsbCkgKDIqKHApICsgKGwpKQotCi1zdGF0aWMKLVVJTlQgQ0xhdG1EZW11eF9HZXRWYWx1ZShIQU5ETEVfRkRLX0JJVFNUUkVBTSBicykKLXsKK3N0YXRpYyBVSU5UIENMYXRtRGVtdXhfR2V0VmFsdWUoSEFORExFX0ZES19CSVRTVFJFQU0gYnMpIHsKICAgVUNIQVIgYnl0ZXNGb3JWYWx1ZSA9IDAsIHRtcCA9IDA7CiAgIGludCB2YWx1ZSA9IDA7CiAKLSAgYnl0ZXNGb3JWYWx1ZSA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsMik7CisgIGJ5dGVzRm9yVmFsdWUgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDIpOwogCi0gIGZvciAoVUlOVCBpPTA7IGk8PWJ5dGVzRm9yVmFsdWU7IGkrKykgeworICBmb3IgKFVJTlQgaSA9IDA7IGkgPD0gYnl0ZXNGb3JWYWx1ZTsgaSsrKSB7CiAgICAgdmFsdWUgPDw9IDg7Ci0gICAgdG1wID0gKFVDSEFSKSBGREtyZWFkQml0cyhicyw4KTsKKyAgICB0bXAgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYnMsIDgpOwogICAgIHZhbHVlICs9IHRtcDsKICAgfQogCiAgIHJldHVybiB2YWx1ZTsKIH0KIAotCi1zdGF0aWMKLVRSQU5TUE9SVERFQ19FUlJPUiBDTGF0bURlbXV4X1JlYWRBdWRpb011eEVsZW1lbnQoCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgICAgICBDTGF0bURlbXV4ICpwTGF0bURlbXV4LAotICAgICAgICBpbnQgbV9tdXhDb25maWdQcmVzZW50LAotICAgICAgICBDU1RwQ2FsbEJhY2tzICpwVHBEZWNDYWxsYmFja3MsCi0gICAgICAgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzYywKLSAgICAgICAgaW50ICpwZkNvbmZpZ0ZvdW5kCi0gICAgICAgICkKLXsKK3N0YXRpYyBUUkFOU1BPUlRERUNfRVJST1IgQ0xhdG1EZW11eF9SZWFkQXVkaW9NdXhFbGVtZW50KAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBDTGF0bURlbXV4ICpwTGF0bURlbXV4LCBpbnQgbV9tdXhDb25maWdQcmVzZW50LAorICAgIENTVHBDYWxsQmFja3MgKnBUcERlY0NhbGxiYWNrcywgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjLAorICAgIGludCAqcGZDb25maWdGb3VuZCkgewogICBUUkFOU1BPUlRERUNfRVJST1IgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfT0s7CiAKICAgaWYgKG1fbXV4Q29uZmlnUHJlc2VudCkgewotICAgIHBMYXRtRGVtdXgtPm1fdXNlU2FtZVN0cmVhbU11eCA9IEZES3JlYWRCaXRzKGJzLDEpOworICAgIHBMYXRtRGVtdXgtPm1fdXNlU2FtZVN0cmVhbU11eCA9IEZES3JlYWRCaXRzKGJzLCAxKTsKIAogICAgIGlmICghcExhdG1EZW11eC0+bV91c2VTYW1lU3RyZWFtTXV4KSB7Ci0gICAgICBpZiAoKEVycm9yU3RhdHVzID0gQ0xhdG1EZW11eF9SZWFkU3RyZWFtTXV4Q29uZmlnKGJzLCBwTGF0bURlbXV4LCBwVHBEZWNDYWxsYmFja3MsIHBBc2MsIHBmQ29uZmlnRm91bmQpKSkgewotICAgICAgICByZXR1cm4gKEVycm9yU3RhdHVzKTsKKyAgICAgIGludCBpOworICAgICAgVUNIQVIgY29uZmlnQ2hhbmdlZCA9IDA7CisgICAgICBVQ0hBUiBjb25maWdNb2RlID0gMDsKKworICAgICAgRkRLX0JJVFNUUkVBTSBic0FuY2hvcjsKKworICAgICAgRkRLX0JJVFNUUkVBTSBic0FuY2hvckR1bW15UGFyc2U7CisKKyAgICAgIGlmICghcExhdG1EZW11eC0+YXBwbHlBc2MpIHsKKyAgICAgICAgYnNBbmNob3JEdW1teVBhcnNlID0gKmJzOworICAgICAgICBwTGF0bURlbXV4LT5uZXdDZmdIYXNBdWRpb1ByZVJvbGwgPSAwOworICAgICAgICAvKiBkbyBkdW1teS1wYXJzaW5nIG9mIEFTQyB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYW4gYXVkaW9QcmVSb2xsICovCisgICAgICAgIGNvbmZpZ01vZGUgfD0gQUNfQ01fREVUX0NGR19DSEFOR0U7CisgICAgICAgIGlmIChUUkFOU1BPUlRERUNfT0sgIT0KKyAgICAgICAgICAgIChFcnJvclN0YXR1cyA9IENMYXRtRGVtdXhfUmVhZFN0cmVhbU11eENvbmZpZygKKyAgICAgICAgICAgICAgICAgYnMsIHBMYXRtRGVtdXgsIHBUcERlY0NhbGxiYWNrcywgcEFzYywgcGZDb25maWdGb3VuZCwKKyAgICAgICAgICAgICAgICAgY29uZmlnTW9kZSwgY29uZmlnQ2hhbmdlZCkpKSB7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisKKyAgICAgICAgLyogQWxsb3cgZmx1c2hpbmcgb25seSB3aGVuIGF1ZGlvUHJlcm9sbCBmdW5jdGlvbmFsaXR5IGlzIGVuYWJsZWQgaW4KKyAgICAgICAgICogY3VycmVudCBhbmQgbmV3IGNvbmZpZyBvdGhlcndpc2UgdGhlIG5ldyBjb25maWcgY2FuIGJlIGFwcGxpZWQKKyAgICAgICAgICogaW1tZWRpYXRlbHkuICovCisgICAgICAgIGlmIChwQXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5lbGVtZW50WzBdCisgICAgICAgICAgICAgICAgLmV4dEVsZW1lbnQudXNhY0V4dEVsZW1lbnRIYXNBdWRpb1ByZVJvbGwgJiYKKyAgICAgICAgICAgIHBMYXRtRGVtdXgtPm5ld0NmZ0hhc0F1ZGlvUHJlUm9sbCkgeworICAgICAgICAgIHBMYXRtRGVtdXgtPm5ld0NmZ0hhc0F1ZGlvUHJlUm9sbCA9IDA7CisgICAgICAgICAgLyogd2l0aCBhdWRpb1ByZVJvbGwgd2UgbXVzdCBmbHVzaCBiZWZvcmUgYXBwbHlpbmcgbmV3IGNmZyAqLworICAgICAgICAgIHBMYXRtRGVtdXgtPmFwcGx5QXNjID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqYnMgPSBic0FuY2hvckR1bW15UGFyc2U7CisgICAgICAgICAgcExhdG1EZW11eC0+YXBwbHlBc2MgPSAxOyAvKiBhcHBseSBuZXcgY29uZmlnIGltbWVkaWF0ZSAqLworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChwTGF0bURlbXV4LT5hcHBseUFzYykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgY29uZmlnTW9kZSA9IDA7CisKKyAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICBjb25maWdNb2RlIHw9IEFDX0NNX0RFVF9DRkdfQ0hBTkdFOworICAgICAgICAgICAgYnNBbmNob3IgPSAqYnM7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbmZpZ01vZGUgfD0gQUNfQ01fQUxMT0NfTUVNOworICAgICAgICAgICAgKmJzID0gYnNBbmNob3I7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKFRSQU5TUE9SVERFQ19PSyAhPQorICAgICAgICAgICAgICAoRXJyb3JTdGF0dXMgPSBDTGF0bURlbXV4X1JlYWRTdHJlYW1NdXhDb25maWcoCisgICAgICAgICAgICAgICAgICAgYnMsIHBMYXRtRGVtdXgsIHBUcERlY0NhbGxiYWNrcywgcEFzYywgcGZDb25maWdGb3VuZCwKKyAgICAgICAgICAgICAgICAgICBjb25maWdNb2RlLCBjb25maWdDaGFuZ2VkKSkpIHsKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoRXJyb3JTdGF0dXMgPT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgICAgICBpZiAoKGkgPT0gMCkgJiYgKHBBc2MtPkFhY0NvbmZpZ0NoYW5nZWQgfHwgcEFzYy0+U2JyQ29uZmlnQ2hhbmdlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXNjLT5TYWNDb25maWdDaGFuZ2VkKSkgeworICAgICAgICAgICAgICBpbnQgZXJyQzsKKworICAgICAgICAgICAgICBjb25maWdDaGFuZ2VkID0gMTsKKyAgICAgICAgICAgICAgZXJyQyA9IHBUcERlY0NhbGxiYWNrcy0+Y2JGcmVlTWVtKHBUcERlY0NhbGxiYWNrcy0+Y2JGcmVlTWVtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBc2MpOworICAgICAgICAgICAgICBpZiAoZXJyQyAhPSAwKSB7CisgICAgICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgLyogSWYgdGhlcmUgd2FzIG5vIGNvbmZpZ3VyYXRpb24gcmVhZCwgaXRzIG5vdCBwb3NzaWJsZSB0byBwYXJzZSBQYXlsb2FkTGVuZ3RoSW5mbyBiZWxvdy4gKi8KLSAgaWYgKCEgKnBmQ29uZmlnRm91bmQpIHsKLSAgICByZXR1cm4gVFJBTlNQT1JUREVDX1NZTkNfRVJST1I7CisgIC8qIElmIHRoZXJlIHdhcyBubyBjb25maWd1cmF0aW9uIHJlYWQsIGl0cyBub3QgcG9zc2libGUgdG8gcGFyc2UKKyAgICogUGF5bG9hZExlbmd0aEluZm8gYmVsb3cuICovCisgIGlmICghKnBmQ29uZmlnRm91bmQpIHsKKyAgICBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SOworICAgIGdvdG8gYmFpbDsKICAgfQogCiAgIGlmIChwTGF0bURlbXV4LT5tX0F1ZGlvTXV4VmVyc2lvbkEgPT0gMCkgewogICAgIC8qIERvIG9ubHkgb25jZSBwZXIgY2FsbCwgYmVjYXVzZSBwYXJzaW5nIGFuZCBkZWNvZGluZyBpcyBkb25lIGluLWxpbmUuICovCi0gICAgaWYgKChFcnJvclN0YXR1cyA9IENMYXRtRGVtdXhfUmVhZFBheWxvYWRMZW5ndGhJbmZvKGJzLHBMYXRtRGVtdXgpKSkgewotICAgICAgcmV0dXJuIChFcnJvclN0YXR1cyk7CisgICAgaWYgKFRSQU5TUE9SVERFQ19PSyAhPQorICAgICAgICAoRXJyb3JTdGF0dXMgPSBDTGF0bURlbXV4X1JlYWRQYXlsb2FkTGVuZ3RoSW5mbyhicywgcExhdG1EZW11eCkpKSB7CisgICAgICAqcGZDb25maWdGb3VuZCA9IDA7CisgICAgICBnb3RvIGJhaWw7CiAgICAgfQogICB9IGVsc2UgewogICAgIC8qIGF1ZGlvTXV4VmVyc2lvbkEgPiAwIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyAqLwogICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgICAqcGZDb25maWdGb3VuZCA9IDA7CisgICAgZ290byBiYWlsOworICB9CisKK2JhaWw6CisgIGlmIChFcnJvclN0YXR1cyAhPSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICBwTGF0bURlbXV4LT5hcHBseUFzYyA9IDE7CiAgIH0KIAogICByZXR1cm4gKEVycm9yU3RhdHVzKTsKIH0KIAotVFJBTlNQT1JUREVDX0VSUk9SIENMYXRtRGVtdXhfUmVhZCgKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYnMsCi0gICAgICAgIENMYXRtRGVtdXggKnBMYXRtRGVtdXgsCi0gICAgICAgIFRSQU5TUE9SVF9UWVBFIHR0LAotICAgICAgICBDU1RwQ2FsbEJhY2tzICpwVHBEZWNDYWxsYmFja3MsCi0gICAgICAgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzYywKLSAgICAgICAgaW50ICpwZkNvbmZpZ0ZvdW5kLAotICAgICAgICBjb25zdCBJTlQgaWdub3JlQnVmZmVyRnVsbG5lc3MKLSAgICAgICAgKQoteworVFJBTlNQT1JUREVDX0VSUk9SIENMYXRtRGVtdXhfUmVhZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xhdG1EZW11eCAqcExhdG1EZW11eCwgVFJBTlNQT1JUX1RZUEUgdHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTVHBDYWxsQmFja3MgKnBUcERlY0NhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBmQ29uZmlnRm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpZ25vcmVCdWZmZXJGdWxsbmVzcykgewogICBVSU5UIGNudEJpdHM7CiAgIFVJTlQgY21wQnVmZmVyRnVsbG5lc3M7CiAgIFVJTlQgYXVkaW9NdXhMZW5ndGhCeXRlc0xhc3QgPSAwOwpAQCAtMTc1LDI5ICsyNTAsMjcgQEAKICAgICByZXR1cm4gVFJBTlNQT1JUREVDX05PVF9FTk9VR0hfQklUUzsKICAgfQogCi0gIGlmICgoRXJyb3JTdGF0dXMgPSBDTGF0bURlbXV4X1JlYWRBdWRpb011eEVsZW1lbnQoYnMsIHBMYXRtRGVtdXgsICh0dCAhPSBUVF9NUDRfTEFUTV9NQ1AwKSwgcFRwRGVjQ2FsbGJhY2tzLCBwQXNjLCBwZkNvbmZpZ0ZvdW5kKSkpCisgIGlmIChUUkFOU1BPUlRERUNfT0sgIT0gKEVycm9yU3RhdHVzID0gQ0xhdG1EZW11eF9SZWFkQXVkaW9NdXhFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnMsIHBMYXRtRGVtdXgsICh0dCAhPSBUVF9NUDRfTEFUTV9NQ1AwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcERlY0NhbGxiYWNrcywgcEFzYywgcGZDb25maWdGb3VuZCkpKQogICAgIHJldHVybiAoRXJyb3JTdGF0dXMpOwogCi0gIGlmICghaWdub3JlQnVmZmVyRnVsbG5lc3MpCi0gIHsKLSAgICBjbXBCdWZmZXJGdWxsbmVzcyA9ICAgMjQrYXVkaW9NdXhMZW5ndGhCeXRlc0xhc3QqOAotICAgICAgICAgICAgICAgICAgICAgICAgKyBwTGF0bURlbXV4LT5tX2xpbmZvWzBdWzBdLm1fYnVmZmVyRnVsbG5lc3MqIHBBc2NbVFBERUNfVFJBQ0tJTkRFWCgwLDApXS5tX2NoYW5uZWxDb25maWd1cmF0aW9uKjMyOworICBpZiAoIWlnbm9yZUJ1ZmZlckZ1bGxuZXNzKSB7CisgICAgY21wQnVmZmVyRnVsbG5lc3MgPQorICAgICAgICAyNCArIGF1ZGlvTXV4TGVuZ3RoQnl0ZXNMYXN0ICogOCArCisgICAgICAgIHBMYXRtRGVtdXgtPm1fbGluZm9bMF1bMF0ubV9idWZmZXJGdWxsbmVzcyAqCisgICAgICAgICAgICBwQXNjW1RQREVDX1RSQUNLSU5ERVgoMCwgMCldLm1fY2hhbm5lbENvbmZpZ3VyYXRpb24gKiAzMjsKIAogICAgIC8qIGV2YWx1YXRlIGJ1ZmZlciBmdWxsbmVzcyAqLwogCi0gICAgaWYgKHBMYXRtRGVtdXgtPm1fbGluZm9bMF1bMF0ubV9idWZmZXJGdWxsbmVzcyAhPSAweEZGKQotICAgIHsKLSAgICAgIGlmICghcExhdG1EZW11eC0+QnVmZmVyRnVsbG5lc3NBY2hpZXZlZCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNudEJpdHMgPCBjbXBCdWZmZXJGdWxsbmVzcykKLSAgICAgICAgeworICAgIGlmIChwTGF0bURlbXV4LT5tX2xpbmZvWzBdWzBdLm1fYnVmZmVyRnVsbG5lc3MgIT0gMHhGRikgeworICAgICAgaWYgKCFwTGF0bURlbXV4LT5CdWZmZXJGdWxsbmVzc0FjaGlldmVkKSB7CisgICAgICAgIGlmIChjbnRCaXRzIDwgY21wQnVmZmVyRnVsbG5lc3MpIHsKICAgICAgICAgICAvKiBjb25kaXRpb24gZm9yIHN0YXJ0IG9mIGRlY29kaW5nIGlzIG5vdCBmdWxmaWxsZWQgKi8KIAogICAgICAgICAgIC8qIHRoZSBjdXJyZW50IGZyYW1lIHdpbGwgbm90IGJlIGRlY29kZWQgKi8KICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX05PVF9FTk9VR0hfQklUUzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBwTGF0bURlbXV4LT5CdWZmZXJGdWxsbmVzc0FjaGlldmVkID0gMTsKICAgICAgICAgfQogICAgICAgfQpAQCAtMjA3LDIyNyArMjgwLDM5NyBAQAogICByZXR1cm4gKEVycm9yU3RhdHVzKTsKIH0KIAotCiBUUkFOU1BPUlRERUNfRVJST1IgQ0xhdG1EZW11eF9SZWFkU3RyZWFtTXV4Q29uZmlnKAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICAgICAgQ0xhdG1EZW11eCAqcExhdG1EZW11eCwKLSAgICAgICAgQ1NUcENhbGxCYWNrcyAqcFRwRGVjQ2FsbGJhY2tzLAotICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2MsCi0gICAgICAgIGludCAqIHBmQ29uZmlnRm91bmQKLSAgICAgICAgKQoteworICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLCBDTGF0bURlbXV4ICpwTGF0bURlbXV4LAorICAgIENTVHBDYWxsQmFja3MgKnBUcERlY0NhbGxiYWNrcywgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjLAorICAgIGludCAqcGZDb25maWdGb3VuZCwgVUNIQVIgY29uZmlnTW9kZSwgVUNIQVIgY29uZmlnQ2hhbmdlZCkgeworICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgYXNjRHVtbXk7IC8qIHRoZSBhY3R1YWwgY29uZmlnIGlzIG5lZWRlZCBmb3IgZmx1c2hpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgdGhhdCBuZXcgY29uZmlnIGNhbiBiZSBwYXJzZWQgKi8KKyAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjRHVtbXk7CisgIHBBc2NEdW1teSA9ICZhc2NEdW1teTsKKyAgcExhdG1EZW11eC0+dXNhY0V4cGxpY2l0Q2ZnQ2hhbmdlZCA9IDA7CiAgIExBVE1fTEFZRVJfSU5GTyAqcF9saW5mbyA9IE5VTEw7CiAgIFRSQU5TUE9SVERFQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19PSzsKKyAgVUNIQVIgdXBkYXRlQ29uZmlnWzEgKiAxXSA9IHswfTsKIAotICBwTGF0bURlbXV4LT5tX0F1ZGlvTXV4VmVyc2lvbiA9IEZES3JlYWRCaXRzKGJzLDEpOworICBwTGF0bURlbXV4LT5tX0F1ZGlvTXV4VmVyc2lvbiA9IEZES3JlYWRCaXRzKGJzLCAxKTsKIAogICBpZiAocExhdG1EZW11eC0+bV9BdWRpb011eFZlcnNpb24gPT0gMCkgewogICAgIHBMYXRtRGVtdXgtPm1fQXVkaW9NdXhWZXJzaW9uQSA9IDA7CiAgIH0gZWxzZSB7Ci0gICAgcExhdG1EZW11eC0+bV9BdWRpb011eFZlcnNpb25BID0gRkRLcmVhZEJpdHMoYnMsMSk7CisgICAgcExhdG1EZW11eC0+bV9BdWRpb011eFZlcnNpb25BID0gRkRLcmVhZEJpdHMoYnMsIDEpOwogICB9CiAKICAgaWYgKHBMYXRtRGVtdXgtPm1fQXVkaW9NdXhWZXJzaW9uQSA9PSAwKSB7CiAgICAgaWYgKHBMYXRtRGVtdXgtPm1fQXVkaW9NdXhWZXJzaW9uID09IDEpIHsKICAgICAgIHBMYXRtRGVtdXgtPm1fdGFyYUJ1ZmZlckZ1bGxuZXNzID0gQ0xhdG1EZW11eF9HZXRWYWx1ZShicyk7CiAgICAgfQotICAgIHBMYXRtRGVtdXgtPm1fYWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZyA9IEZES3JlYWRCaXRzKGJzLDEpOwotICAgIHBMYXRtRGVtdXgtPm1fbm9TdWJGcmFtZXMgPSBGREtyZWFkQml0cyhicyw2KSArIDE7Ci0gICAgcExhdG1EZW11eC0+bV9udW1Qcm9ncmFtICA9IEZES3JlYWRCaXRzKGJzLDQpICsgMTsKKyAgICBwTGF0bURlbXV4LT5tX2FsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcgPSBGREtyZWFkQml0cyhicywgMSk7CisgICAgcExhdG1EZW11eC0+bV9ub1N1YkZyYW1lcyA9IEZES3JlYWRCaXRzKGJzLCA2KSArIDE7CisgICAgcExhdG1EZW11eC0+bV9udW1Qcm9ncmFtID0gRkRLcmVhZEJpdHMoYnMsIDQpICsgMTsKIAotICAgIGlmIChwTGF0bURlbXV4LT5tX251bVByb2dyYW0gPiAxKSB7Ci0gICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgICBpZiAocExhdG1EZW11eC0+bV9udW1Qcm9ncmFtID4gTEFUTV9NQVhfUFJPRykgeworICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOworICAgICAgZ290byBiYWlsOwogICAgIH0KIAogICAgIGludCBpZENudCA9IDA7CiAgICAgZm9yIChVSU5UIHByb2cgPSAwOyBwcm9nIDwgcExhdG1EZW11eC0+bV9udW1Qcm9ncmFtOyBwcm9nKyspIHsKLSAgICAgIHBMYXRtRGVtdXgtPm1fbnVtTGF5ZXIgPSBGREtyZWFkQml0cyhicywzKSArIDE7Ci0gICAgICBpZiAocExhdG1EZW11eC0+bV9udW1MYXllciA+IDIpIHsKLSAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgICAgICBwTGF0bURlbXV4LT5tX251bUxheWVyW3Byb2ddID0gRkRLcmVhZEJpdHMoYnMsIDMpICsgMTsKKyAgICAgIGlmIChwTGF0bURlbXV4LT5tX251bUxheWVyW3Byb2ddID4gTEFUTV9NQVhfTEFZRVIpIHsKKyAgICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOworICAgICAgICBnb3RvIGJhaWw7CiAgICAgICB9CiAKLSAgICAgIGZvciAoVUlOVCBsYXkgPSAwOyBsYXkgPCBwTGF0bURlbXV4LT5tX251bUxheWVyOyBsYXkrKykgeworICAgICAgZm9yIChVSU5UIGxheSA9IDA7IGxheSA8IHBMYXRtRGVtdXgtPm1fbnVtTGF5ZXJbcHJvZ107IGxheSsrKSB7CisgICAgICAgIGludCB1c2VTYW1lQ29uZmlnOwogICAgICAgICBwX2xpbmZvID0gJnBMYXRtRGVtdXgtPm1fbGluZm9bcHJvZ11bbGF5XTsKIAogICAgICAgICBwX2xpbmZvLT5tX3N0cmVhbUlEID0gaWRDbnQrKzsKICAgICAgICAgcF9saW5mby0+bV9mcmFtZUxlbmd0aEluQml0cyA9IDA7CiAKLSAgICAgICAgaWYoIChwcm9nID09IDApICYmIChsYXkgPT0gMCkgKSB7Ci0gICAgICAgICAgcExhdG1EZW11eC0+bV91c2VTYW1lQ29uZmlnID0gMDsKKyAgICAgICAgaWYgKChwcm9nID09IDApICYmIChsYXkgPT0gMCkpIHsKKyAgICAgICAgICB1c2VTYW1lQ29uZmlnID0gMDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwTGF0bURlbXV4LT5tX3VzZVNhbWVDb25maWcgPSBGREtyZWFkQml0cyhicywxKTsKKyAgICAgICAgICB1c2VTYW1lQ29uZmlnID0gRkRLcmVhZEJpdHMoYnMsIDEpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHBMYXRtRGVtdXgtPm1fdXNlU2FtZUNvbmZpZykgewotICAgICAgICAgIGlmIChsYXkgPiAxKSB7Ci0gICAgICAgICAgICBGREttZW1jcHkoJnBBc2NbVFBERUNfVFJBQ0tJTkRFWChwcm9nLGxheSldLCAmcEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csbGF5LTEpXSwgc2l6ZW9mKENTQXVkaW9TcGVjaWZpY0NvbmZpZykpOworICAgICAgICBpZiAodXNlU2FtZUNvbmZpZykgeworICAgICAgICAgIGlmIChsYXkgPiAwKSB7CisgICAgICAgICAgICBGREttZW1jcHkoJnBBc2NbVFBERUNfVFJBQ0tJTkRFWChwcm9nLCBsYXkpXSwKKyAgICAgICAgICAgICAgICAgICAgICAmcEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSAtIDEpXSwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ1NBdWRpb1NwZWNpZmljQ29uZmlnKSk7CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHBMYXRtRGVtdXgtPm1fQXVkaW9NdXhWZXJzaW9uID09IDEpCi0gICAgICAgICAgewotICAgICAgICAgICAgRkRLX0JJVFNUUkVBTSB0bXBCczsKLSAgICAgICAgICAgIFVJTlQgYXNjU3RhcnRQb3MsIGFzY0xlbj0wOworICAgICAgICAgIFVJTlQgdXNhY0NvbmZpZ0xlbmd0aFByZXYgPSAwOworICAgICAgICAgIFVDSEFSIHVzYWNDb25maWdQcmV2W1RQX1VTQUNfTUFYX0NPTkZJR19MRU5dOwogCi0gICAgICAgICAgICBhc2NMZW4gPSBDTGF0bURlbXV4X0dldFZhbHVlKGJzKTsKLSAgICAgICAgICAgIGFzY1N0YXJ0UG9zID0gRkRLZ2V0VmFsaWRCaXRzKGJzKTsKLSAgICAgICAgICAgIHRtcEJzID0gKmJzOwotICAgICAgICAgICAgRkRLc3luY0NhY2hlKCZ0bXBCcyk7Ci0gICAgICAgICAgICB0bXBCcy5oQml0QnVmLlZhbGlkQml0cyA9IGFzY0xlbjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogUmVhZCBBU0MgKi8KLSAgICAgICAgICAgIGlmICgoRXJyb3JTdGF0dXMgPSBBdWRpb1NwZWNpZmljQ29uZmlnX1BhcnNlKCZwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZyxsYXkpXSwgJnRtcEJzLCAxLCBwVHBEZWNDYWxsYmFja3MpKSkgewotICAgICAgICAgICAgICByZXR1cm4gKEVycm9yU3RhdHVzKTsKKyAgICAgICAgICBpZiAoIShwTGF0bURlbXV4LT5hcHBseUFzYykgJiYKKyAgICAgICAgICAgICAgKHBBc2NbVFBERUNfVFJBQ0tJTkRFWChwcm9nLCBsYXkpXS5tX2FvdCA9PSBBT1RfVVNBQykpIHsKKyAgICAgICAgICAgIHVzYWNDb25maWdMZW5ndGhQcmV2ID0KKyAgICAgICAgICAgICAgICAoVUlOVCkocEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubV9zYy5tX3VzYWNDb25maWcuVXNhY0NvbmZpZ0JpdHMgKworICAgICAgICAgICAgICAgICAgICAgICA3KSA+PgorICAgICAgICAgICAgICAgIDM7IC8qIHN0b3JlIHByZXZpb3VzIFVTQUMgY29uZmlnIGxlbmd0aCAqLworICAgICAgICAgICAgaWYgKHVzYWNDb25maWdMZW5ndGhQcmV2ID4gVFBfVVNBQ19NQVhfQ09ORklHX0xFTikgeworICAgICAgICAgICAgICBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgICAgZ290byBiYWlsOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgKnBmQ29uZmlnRm91bmQgPSAxOworICAgICAgICAgICAgRkRLbWVtY2xlYXIodXNhY0NvbmZpZ1ByZXYsIFRQX1VTQUNfTUFYX0NPTkZJR19MRU4pOworICAgICAgICAgICAgRkRLbWVtY3B5KAorICAgICAgICAgICAgICAgIHVzYWNDb25maWdQcmV2LAorICAgICAgICAgICAgICAgICZwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZywgbGF5KV0ubV9zYy5tX3VzYWNDb25maWcuVXNhY0NvbmZpZywKKyAgICAgICAgICAgICAgICB1c2FjQ29uZmlnTGVuZ3RoUHJldik7IC8qIHN0b3JlIHByZXZpb3VzIFVTQUMgY29uZmlnICovCisgICAgICAgICAgfQorICAgICAgICAgIGlmIChwTGF0bURlbXV4LT5tX0F1ZGlvTXV4VmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICBGREtfQklUU1RSRUFNIHRtcEJzOworICAgICAgICAgICAgVUlOVCBhc2NMZW4gPSAwOworICAgICAgICAgICAgYXNjTGVuID0gQ0xhdG1EZW11eF9HZXRWYWx1ZShicyk7CisgICAgICAgICAgICAvKiBUaGUgYXNjTGVuIGNvdWxkIGJlIHdyb25nLCBzbyBjaGVjayBpZiB2YWxpZEJpdHM8PWJ1ZkJpdHMqLworICAgICAgICAgICAgaWYgKGFzY0xlbiA+IEZES2dldFZhbGlkQml0cyhicykpIHsKKyAgICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZES3N5bmNDYWNoZShicyk7CisgICAgICAgICAgICB0bXBCcyA9ICpiczsKKyAgICAgICAgICAgIHRtcEJzLmhCaXRCdWYuVmFsaWRCaXRzID0gYXNjTGVuOworCisgICAgICAgICAgICAvKiBSZWFkIEFTQyAqLworICAgICAgICAgICAgaWYgKHBMYXRtRGVtdXgtPmFwcGx5QXNjKSB7CisgICAgICAgICAgICAgIGlmIChUUkFOU1BPUlRERUNfT0sgIT0KKyAgICAgICAgICAgICAgICAgIChFcnJvclN0YXR1cyA9IEF1ZGlvU3BlY2lmaWNDb25maWdfUGFyc2UoCisgICAgICAgICAgICAgICAgICAgICAgICZwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZywgbGF5KV0sICZ0bXBCcywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgcFRwRGVjQ2FsbGJhY2tzLCBjb25maWdNb2RlLCBjb25maWdDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICBBT1RfTlVMTF9PQkpFQ1QpKSkKKyAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAoVFJBTlNQT1JUREVDX09LICE9CisgICAgICAgICAgICAgICAgICAoRXJyb3JTdGF0dXMgPSBBdWRpb1NwZWNpZmljQ29uZmlnX1BhcnNlKAorICAgICAgICAgICAgICAgICAgICAgICBwQXNjRHVtbXksICZ0bXBCcywgMSwgcFRwRGVjQ2FsbGJhY2tzLCBjb25maWdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDaGFuZ2VkLCBBT1RfTlVMTF9PQkpFQ1QpKSkKKyAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qIFRoZSBmaWVsZCBwX2xpbmZvLT5tX2FzY0xlbiBjb3VsZCBiZSB3cm9uZywgc28gY2hlY2sgaWYgKi8KLSAgICAgICAgICAgIGlmICggMCA+IChJTlQpRkRLZ2V0VmFsaWRCaXRzKCZ0bXBCcykpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIGlmICgwID4gKElOVClGREtnZXRWYWxpZEJpdHMoJnRtcEJzKSkgeworICAgICAgICAgICAgICBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgICAgZ290byBiYWlsOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgRkRLcHVzaEZvcihicywgYXNjTGVuKTsgLyogcG9zaXRpb24gYml0c3RyZWFtIGFmdGVyIEFTQyAqLwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogUmVhZCBBU0MgKi8KLSAgICAgICAgICAgIGlmICgoRXJyb3JTdGF0dXMgPSBBdWRpb1NwZWNpZmljQ29uZmlnX1BhcnNlKCZwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZyxsYXkpXSwgYnMsIDAsIHBUcERlY0NhbGxiYWNrcykpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiAoRXJyb3JTdGF0dXMpOworICAgICAgICAgICAgaWYgKHBMYXRtRGVtdXgtPmFwcGx5QXNjKSB7CisgICAgICAgICAgICAgIGlmIChUUkFOU1BPUlRERUNfT0sgIT0gKEVycm9yU3RhdHVzID0gQXVkaW9TcGVjaWZpY0NvbmZpZ19QYXJzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZywgbGF5KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicywgMCwgcFRwRGVjQ2FsbGJhY2tzLCBjb25maWdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ2hhbmdlZCwgQU9UX05VTExfT0JKRUNUKSkpCisgICAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKFRSQU5TUE9SVERFQ19PSyAhPQorICAgICAgICAgICAgICAgICAgKEVycm9yU3RhdHVzID0gQXVkaW9TcGVjaWZpY0NvbmZpZ19QYXJzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgcEFzY0R1bW15LCBicywgMCwgcFRwRGVjQ2FsbGJhY2tzLCBjb25maWdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDaGFuZ2VkLCBBT1RfTlVMTF9PQkpFQ1QpKSkKKyAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBjYkVycm9yOworICAgICAgICAgIGlmICghcExhdG1EZW11eC0+YXBwbHlBc2MpIHsKKyAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ1tUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSldID0gMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXBkYXRlQ29uZmlnW1RQREVDX1RSQUNLSU5ERVgocHJvZywgbGF5KV0gPSAxOworICAgICAgICAgIH0KIAotICAgICAgICAgICAgY2JFcnJvciA9IHBUcERlY0NhbGxiYWNrcy0+Y2JVcGRhdGVDb25maWcocFRwRGVjQ2FsbGJhY2tzLT5jYlVwZGF0ZUNvbmZpZ0RhdGEsICZwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZyxsYXkpXSk7Ci0gICAgICAgICAgICBpZiAoY2JFcnJvciAhPSAwKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfVU5LT1dOX0VSUk9SOworICAgICAgICAgIGlmICghcExhdG1EZW11eC0+YXBwbHlBc2MpIHsKKyAgICAgICAgICAgIGlmIChwQXNjRHVtbXlbVFBERUNfVFJBQ0tJTkRFWChwcm9nLCBsYXkpXS5tX2FvdCA9PQorICAgICAgICAgICAgICAgIEFPVF9VU0FDKSB7IC8qIGZsdXNoIGluIGNhc2UgU01DIGhhcyBjaGFuZ2VkICovCisgICAgICAgICAgICAgIGNvbnN0IFVJTlQgdXNhY0NvbmZpZ0xlbmd0aCA9CisgICAgICAgICAgICAgICAgICAoVUlOVCkocEFzY0R1bW15LT5tX3NjLm1fdXNhY0NvbmZpZy5Vc2FjQ29uZmlnQml0cyArIDcpID4+IDM7CisgICAgICAgICAgICAgIGlmICh1c2FjQ29uZmlnTGVuZ3RoID4gVFBfVVNBQ19NQVhfQ09ORklHX0xFTikgeworICAgICAgICAgICAgICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAodXNhY0NvbmZpZ0xlbmd0aCAhPSB1c2FjQ29uZmlnTGVuZ3RoUHJldikgeworICAgICAgICAgICAgICAgIEZES21lbWNsZWFyKCZwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZywgbGF5KV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tX3NjLm1fdXNhY0NvbmZpZy5Vc2FjQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQX1VTQUNfTUFYX0NPTkZJR19MRU4pOworICAgICAgICAgICAgICAgIEZES21lbWNweSgmcEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1fc2MubV91c2FjQ29uZmlnLlVzYWNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwQXNjRHVtbXktPm1fc2MubV91c2FjQ29uZmlnLlVzYWNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWNDb25maWdMZW5ndGgpOyAvKiBzdG9yZSBuZXcgVVNBQyBjb25maWcgKi8KKyAgICAgICAgICAgICAgICBwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZywgbGF5KV0KKyAgICAgICAgICAgICAgICAgICAgLm1fc2MubV91c2FjQ29uZmlnLlVzYWNDb25maWdCaXRzID0KKyAgICAgICAgICAgICAgICAgICAgcEFzY0R1bW15LT5tX3NjLm1fdXNhY0NvbmZpZy5Vc2FjQ29uZmlnQml0czsKKyAgICAgICAgICAgICAgICBwTGF0bURlbXV4LT51c2FjRXhwbGljaXRDZmdDaGFuZ2VkID0gMTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoRkRLbWVtY21wKHVzYWNDb25maWdQcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFzY0R1bW15LT5tX3NjLm1fdXNhY0NvbmZpZy5Vc2FjQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhY0NvbmZpZ0xlbmd0aFByZXYpKSB7CisgICAgICAgICAgICAgICAgICBGREttZW1jbGVhcigmcEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tX3NjLm1fdXNhY0NvbmZpZy5Vc2FjQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFBfVVNBQ19NQVhfQ09ORklHX0xFTik7CisgICAgICAgICAgICAgICAgICBGREttZW1jcHkoJnBBc2NbVFBERUNfVFJBQ0tJTkRFWChwcm9nLCBsYXkpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1fc2MubV91c2FjQ29uZmlnLlVzYWNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBc2NEdW1teS0+bV9zYy5tX3VzYWNDb25maWcuVXNhY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FjQ29uZmlnTGVuZ3RoKTsgLyogc3RvcmUgbmV3IFVTQUMgY29uZmlnICovCisgICAgICAgICAgICAgICAgICBwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZywgbGF5KV0KKyAgICAgICAgICAgICAgICAgICAgICAubV9zYy5tX3VzYWNDb25maWcuVXNhY0NvbmZpZ0JpdHMgPQorICAgICAgICAgICAgICAgICAgICAgIHBBc2NEdW1teS0+bV9zYy5tX3VzYWNDb25maWcuVXNhY0NvbmZpZ0JpdHM7CisgICAgICAgICAgICAgICAgICBwTGF0bURlbXV4LT51c2FjRXhwbGljaXRDZmdDaGFuZ2VkID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAocEFzY0R1bW15W1RQREVDX1RSQUNLSU5ERVgocHJvZywgbGF5KV0KKyAgICAgICAgICAgICAgICAgICAgICAubV9zYy5tX3VzYWNDb25maWcubV91c2FjTnVtRWxlbWVudHMpIHsKKyAgICAgICAgICAgICAgICBpZiAocEFzY0R1bW15W1RQREVDX1RSQUNLSU5ERVgocHJvZywgbGF5KV0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5tX3NjLm1fdXNhY0NvbmZpZy5lbGVtZW50WzBdCisgICAgICAgICAgICAgICAgICAgICAgICAuZXh0RWxlbWVudC51c2FjRXh0RWxlbWVudEhhc0F1ZGlvUHJlUm9sbCkgeworICAgICAgICAgICAgICAgICAgcExhdG1EZW11eC0+bmV3Q2ZnSGFzQXVkaW9QcmVSb2xsID0KKyAgICAgICAgICAgICAgICAgICAgICAxOyAvKiBpZiBkdW1teSBwYXJzZWQgY2ZnIGhhcyBhdWRpb1ByZVJvbGwgd2UgZmlyc3QgZmx1c2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgYXBwbHlpbmcgbmV3IGNmZyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgKnBmQ29uZmlnRm91bmQgPSAxOwogICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHBfbGluZm8tPm1fZnJhbWVMZW5ndGhUeXBlID0gRkRLcmVhZEJpdHMoYnMsMyk7Ci0gICAgICAgIHN3aXRjaCggcF9saW5mby0+bV9mcmFtZUxlbmd0aFR5cGUgKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICBwX2xpbmZvLT5tX2J1ZmZlckZ1bGxuZXNzID0gRkRLcmVhZEJpdHMoYnMsOCk7CisgICAgICAgIHBfbGluZm8tPm1fZnJhbWVMZW5ndGhUeXBlID0gRkRLcmVhZEJpdHMoYnMsIDMpOworICAgICAgICBzd2l0Y2ggKHBfbGluZm8tPm1fZnJhbWVMZW5ndGhUeXBlKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgcF9saW5mby0+bV9idWZmZXJGdWxsbmVzcyA9IEZES3JlYWRCaXRzKGJzLCA4KTsKIAotICAgICAgICAgIGlmICghcExhdG1EZW11eC0+bV9hbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nKSB7Ci0gICAgICAgICAgICBpZiAoKGxheSA+IDApICYmIChwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZyxsYXkpXS5tX2FvdCA9PSBBT1RfQUFDX1NDQUwgfHwgcEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csbGF5KV0ubV9hb3QgPT0gQU9UX0VSX0FBQ19TQ0FMKSkgewotICAgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgICAgICAgICAgIGlmICghcExhdG1EZW11eC0+bV9hbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nKSB7CisgICAgICAgICAgICAgIGlmICgobGF5ID4gMCkgJiYKKyAgICAgICAgICAgICAgICAgIChwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZywgbGF5KV0ubV9hb3QgPT0gQU9UX0FBQ19TQ0FMIHx8CisgICAgICAgICAgICAgICAgICAgcEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSldLm1fYW90ID09CisgICAgICAgICAgICAgICAgICAgICAgIEFPVF9FUl9BQUNfU0NBTCkgJiYKKyAgICAgICAgICAgICAgICAgIChwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZywgbGF5IC0gMSldLm1fYW90ID09IEFPVF9DRUxQIHx8CisgICAgICAgICAgICAgICAgICAgcEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSAtIDEpXS5tX2FvdCA9PQorICAgICAgICAgICAgICAgICAgICAgICBBT1RfRVJfQ0VMUCkpIHsgLyogVGhlIGxheWVyIG1heWJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVkIGxhdGVyIHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkIGl0IGFueXdheTogKi8KKyAgICAgICAgICAgICAgICAvKiBjb3JlRnJhbWVPZmZzZXQgPSAqLyBGREtyZWFkQml0cyhicywgNik7CisgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAvKiBmcmFtZUxlbmd0aCA9IEZES3JlYWRCaXRzKGJzLDkpOyAqLwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgIC8qIENFTFAgKi8KLSAgICAgICAgY2FzZSA2OgotICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgLyogSFZYQyAqLwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7IC8vX0xBVE1fSU5WQUxJREZSQU1FTEVOR1RIVFlQRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHBfbGluZm8tPm1fZnJhbWVMZW5ndGhJbkJpdHMgPSBGREtyZWFkQml0cyhicywgOSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIC8qIENFTFAgKi8KKyAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgLyogSFZYQyAqLworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfSAvKiBzd2l0Y2ggZnJhbWVsZW5ndGh0eXBlKi8KIAotICAgICAgICB9ICAvKiBzd2l0Y2ggZnJhbWVsZW5ndGh0eXBlKi8KKyAgICAgIH0gLyogbGF5ZXIgbG9vcCAqLworICAgIH0gICAvKiBwcm9nIGxvb3AgKi8KIAotICAgICAgfSAgLyogbGF5ZXIgbG9vcCAqLwotICAgIH0gIC8qIHByb2cgbG9vcCAqLwotCi0gICAgcExhdG1EZW11eC0+bV9vdGhlckRhdGFQcmVzZW50ID0gRkRLcmVhZEJpdHMoYnMsMSk7Ci0gICAgcExhdG1EZW11eC0+bV9vdGhlckRhdGFMZW5ndGggID0gMDsKKyAgICBwTGF0bURlbXV4LT5tX290aGVyRGF0YVByZXNlbnQgPSBGREtyZWFkQml0cyhicywgMSk7CisgICAgcExhdG1EZW11eC0+bV9vdGhlckRhdGFMZW5ndGggPSAwOwogCiAgICAgaWYgKHBMYXRtRGVtdXgtPm1fb3RoZXJEYXRhUHJlc2VudCkgewotICAgICAgaW50IG90aGVyRGF0YUxlbkVzYyAgPSAwOwotICAgICAgZG8gewotICAgICAgICBwTGF0bURlbXV4LT5tX290aGVyRGF0YUxlbmd0aCA8PD0gODsgICAvLyAqPSAyNTYKLSAgICAgICAgb3RoZXJEYXRhTGVuRXNjID0gRkRLcmVhZEJpdHMoYnMsMSk7Ci0gICAgICAgIHBMYXRtRGVtdXgtPm1fb3RoZXJEYXRhTGVuZ3RoICs9IEZES3JlYWRCaXRzKGJzLDgpOwotICAgICAgfSB3aGlsZSAob3RoZXJEYXRhTGVuRXNjKTsKKyAgICAgIGlmIChwTGF0bURlbXV4LT5tX0F1ZGlvTXV4VmVyc2lvbiA9PSAxKSB7CisgICAgICAgIHBMYXRtRGVtdXgtPm1fb3RoZXJEYXRhTGVuZ3RoID0gQ0xhdG1EZW11eF9HZXRWYWx1ZShicyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgb3RoZXJEYXRhTGVuRXNjID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgIHBMYXRtRGVtdXgtPm1fb3RoZXJEYXRhTGVuZ3RoIDw8PSA4OyAgLy8gKj0gMjU2CisgICAgICAgICAgb3RoZXJEYXRhTGVuRXNjID0gRkRLcmVhZEJpdHMoYnMsIDEpOworICAgICAgICAgIHBMYXRtRGVtdXgtPm1fb3RoZXJEYXRhTGVuZ3RoICs9IEZES3JlYWRCaXRzKGJzLCA4KTsKKyAgICAgICAgfSB3aGlsZSAob3RoZXJEYXRhTGVuRXNjKTsKKyAgICAgIH0KKyAgICAgIGlmIChwTGF0bURlbXV4LT5tX2F1ZGlvTXV4TGVuZ3RoQnl0ZXMgPAorICAgICAgICAgIChwTGF0bURlbXV4LT5tX290aGVyRGF0YUxlbmd0aCA+PiAzKSkgeworICAgICAgICBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQogICAgIH0KIAotICAgIHBMYXRtRGVtdXgtPm1fY3JjQ2hlY2tQcmVzZW50ID0gRkRLcmVhZEJpdHMoYnMsMSk7Ci0gICAgcExhdG1EZW11eC0+bV9jcmNDaGVja1N1bSAgICAgPSAwOworICAgIHBMYXRtRGVtdXgtPm1fY3JjQ2hlY2tQcmVzZW50ID0gRkRLcmVhZEJpdHMoYnMsIDEpOwogCiAgICAgaWYgKHBMYXRtRGVtdXgtPm1fY3JjQ2hlY2tQcmVzZW50KSB7Ci0gICAgICBwTGF0bURlbXV4LT5tX2NyY0NoZWNrU3VtID0gRkRLcmVhZEJpdHMoYnMsOCk7CisgICAgICBGREtyZWFkQml0cyhicywgOCk7CiAgICAgfQogCi0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgLyogYXVkaW9NdXhWZXJzaW9uQSA+IDAgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHRlbnNpb25zICovCiAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfVU5TVVBQT1JURURfRk9STUFUOwogICB9Ci0gIHJldHVybiAoRXJyb3JTdGF0dXMpOwotfQogCi1UUkFOU1BPUlRERUNfRVJST1IgQ0xhdG1EZW11eF9SZWFkUGF5bG9hZExlbmd0aEluZm8oSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIENMYXRtRGVtdXggKnBMYXRtRGVtdXgpCi17Ci0gIFRSQU5TUE9SVERFQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19PSzsKLSAgaW50IHRvdGFsUGF5bG9hZEJpdHMgPSAwOwotCi0gIGlmKCBwTGF0bURlbXV4LT5tX2FsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcgPT0gMSApIHsKLSAgICBmb3IgKFVJTlQgcHJvZz0wOyBwcm9nPHBMYXRtRGVtdXgtPm1fbnVtUHJvZ3JhbTsgcHJvZysrICkgewotICAgICAgZm9yIChVSU5UIGxheT0wOyBsYXk8cExhdG1EZW11eC0+bV9udW1MYXllcjsgbGF5KysgKSB7Ci0gICAgICAgIExBVE1fTEFZRVJfSU5GTyAqcF9saW5mbyA9ICZwTGF0bURlbXV4LT5tX2xpbmZvW3Byb2ddW2xheV07Ci0KLSAgICAgICAgc3dpdGNoIChwX2xpbmZvLT5tX2ZyYW1lTGVuZ3RoVHlwZSApIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgIHBfbGluZm8tPm1fZnJhbWVMZW5ndGhJbkJpdHMgPSBDTGF0bURlbXV4X1JlYWRBdUNodW5rTGVuZ3RoSW5mbyhicyk7Ci0gICAgICAgICAgdG90YWxQYXlsb2FkQml0cyArPSBwX2xpbmZvLT5tX2ZyYW1lTGVuZ3RoSW5CaXRzOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgY2FzZSA3OgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7IC8vQUFDX0RFQ19MQVRNX0lOVkFMSURGUkFNRUxFTkdUSFRZUEU7CisgIC8qIENvbmZpZ3VyZSBzb3VyY2UgZGVjb2RlcjogKi8KKyAgaWYgKEVycm9yU3RhdHVzID09IFRSQU5TUE9SVERFQ19PSykgeworICAgIFVJTlQgcHJvZzsKKyAgICBmb3IgKHByb2cgPSAwOyBwcm9nIDwgcExhdG1EZW11eC0+bV9udW1Qcm9ncmFtOyBwcm9nKyspIHsKKyAgICAgIFVJTlQgbGF5OworICAgICAgZm9yIChsYXkgPSAwOyBsYXkgPCBwTGF0bURlbXV4LT5tX251bUxheWVyW3Byb2ddOyBsYXkrKykgeworICAgICAgICBpZiAodXBkYXRlQ29uZmlnW1RQREVDX1RSQUNLSU5ERVgocHJvZywgbGF5KV0gIT0gMCkgeworICAgICAgICAgIGludCBjYkVycm9yOworICAgICAgICAgIGNiRXJyb3IgPSBwVHBEZWNDYWxsYmFja3MtPmNiVXBkYXRlQ29uZmlnKAorICAgICAgICAgICAgICBwVHBEZWNDYWxsYmFja3MtPmNiVXBkYXRlQ29uZmlnRGF0YSwKKyAgICAgICAgICAgICAgJnBBc2NbVFBERUNfVFJBQ0tJTkRFWChwcm9nLCBsYXkpXSwKKyAgICAgICAgICAgICAgcEFzY1tUUERFQ19UUkFDS0lOREVYKHByb2csIGxheSldLmNvbmZpZ01vZGUsCisgICAgICAgICAgICAgICZwQXNjW1RQREVDX1RSQUNLSU5ERVgocHJvZywgbGF5KV0uQWFjQ29uZmlnQ2hhbmdlZCk7CisgICAgICAgICAgaWYgKGNiRXJyb3IgPT0gVFJBTlNQT1JUREVDX05FRURfVE9fUkVTVEFSVCkgeworICAgICAgICAgICAgKnBmQ29uZmlnRm91bmQgPSAwOworICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfTkVFRF9UT19SRVNUQVJUOworICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoY2JFcnJvciAhPSAwKSB7CisgICAgICAgICAgICAqcGZDb25maWdGb3VuZCA9IDA7CisgICAgICAgICAgICBpZiAobGF5ID09IDApIHsKKyAgICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUjsKKyAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcGZDb25maWdGb3VuZCA9IDE7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpwZkNvbmZpZ0ZvdW5kID0gMTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQotICBlbHNlIHsKLSAgICBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsgLy9BQUNfREVDX0xBVE1fVElNRUZSQU1JTkc7CisKK2JhaWw6CisgIGlmIChFcnJvclN0YXR1cyAhPSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICBVQ0hBUiBhcHBseUFzYyA9IHBMYXRtRGVtdXgtPmFwcGx5QXNjOworICAgIEZES21lbWNsZWFyKHBMYXRtRGVtdXgsIHNpemVvZihDTGF0bURlbXV4KSk7IC8qIHJlc2V0IHN0cnVjdHVyZSAqLworICAgIHBMYXRtRGVtdXgtPmFwcGx5QXNjID0gYXBwbHlBc2M7CisgIH0gZWxzZSB7CisgICAgLyogbm8gZXJyb3IgYW5kIGNvbmZpZyBwYXJzaW5nIGlzIGZpbmlzaGVkICovCisgICAgaWYgKGNvbmZpZ01vZGUgPT0gQUNfQ01fQUxMT0NfTUVNKSBwTGF0bURlbXV4LT5hcHBseUFzYyA9IDA7CiAgIH0KLSAgaWYgKHBMYXRtRGVtdXgtPm1fYXVkaW9NdXhMZW5ndGhCeXRlcyA+IChVSU5UKTAgJiYgdG90YWxQYXlsb2FkQml0cyA+IChpbnQpcExhdG1EZW11eC0+bV9hdWRpb011eExlbmd0aEJ5dGVzKjgpIHsKLSAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOwotICB9CisKICAgcmV0dXJuIChFcnJvclN0YXR1cyk7CiB9CiAKLWludCBDTGF0bURlbXV4X1JlYWRBdUNodW5rTGVuZ3RoSW5mbyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBicykKLXsKK1RSQU5TUE9SVERFQ19FUlJPUiBDTGF0bURlbXV4X1JlYWRQYXlsb2FkTGVuZ3RoSW5mbyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTGF0bURlbXV4ICpwTGF0bURlbXV4KSB7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19PSzsKKyAgaW50IHRvdGFsUGF5bG9hZEJpdHMgPSAwOworCisgIGlmIChwTGF0bURlbXV4LT5tX2FsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcgPT0gMSkgeworICAgIEZES19BU1NFUlQocExhdG1EZW11eC0+bV9udW1Qcm9ncmFtIDw9IExBVE1fTUFYX1BST0cpOworICAgIGZvciAoVUlOVCBwcm9nID0gMDsgcHJvZyA8IHBMYXRtRGVtdXgtPm1fbnVtUHJvZ3JhbTsgcHJvZysrKSB7CisgICAgICBGREtfQVNTRVJUKHBMYXRtRGVtdXgtPm1fbnVtTGF5ZXJbcHJvZ10gPD0gTEFUTV9NQVhfTEFZRVIpOworICAgICAgZm9yIChVSU5UIGxheSA9IDA7IGxheSA8IHBMYXRtRGVtdXgtPm1fbnVtTGF5ZXJbcHJvZ107IGxheSsrKSB7CisgICAgICAgIExBVE1fTEFZRVJfSU5GTyAqcF9saW5mbyA9ICZwTGF0bURlbXV4LT5tX2xpbmZvW3Byb2ddW2xheV07CisKKyAgICAgICAgc3dpdGNoIChwX2xpbmZvLT5tX2ZyYW1lTGVuZ3RoVHlwZSkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHBfbGluZm8tPm1fZnJhbWVMZW5ndGhJbkJpdHMgPSBDTGF0bURlbXV4X1JlYWRBdUNodW5rTGVuZ3RoSW5mbyhicyk7CisgICAgICAgICAgICB0b3RhbFBheWxvYWRCaXRzICs9IHBfbGluZm8tPm1fZnJhbWVMZW5ndGhJbkJpdHM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsgIC8vIEFBQ19ERUNfTEFUTV9JTlZBTElERlJBTUVMRU5HVEhUWVBFOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOyAgLy8gQUFDX0RFQ19MQVRNX1RJTUVGUkFNSU5HOworICB9CisgIGlmIChwTGF0bURlbXV4LT5tX2F1ZGlvTXV4TGVuZ3RoQnl0ZXMgPiAoVUlOVCkwICYmCisgICAgICB0b3RhbFBheWxvYWRCaXRzID4gKGludClwTGF0bURlbXV4LT5tX2F1ZGlvTXV4TGVuZ3RoQnl0ZXMgKiA4KSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgfQorCisgIHJldHVybiAoRXJyb3JTdGF0dXMpOworfQorCitpbnQgQ0xhdG1EZW11eF9SZWFkQXVDaHVua0xlbmd0aEluZm8oSEFORExFX0ZES19CSVRTVFJFQU0gYnMpIHsKICAgVUNIQVIgZW5kRmxhZzsKICAgaW50IGxlbiA9IDA7CiAKICAgZG8gewotICAgIFVDSEFSIHRtcCA9IChVQ0hBUikgRkRLcmVhZEJpdHMoYnMsOCk7CisgICAgVUNIQVIgdG1wID0gKFVDSEFSKUZES3JlYWRCaXRzKGJzLCA4KTsKICAgICBlbmRGbGFnID0gKHRtcCA8IDI1NSk7CiAKICAgICBsZW4gKz0gdG1wOwogCi0gIH0gd2hpbGUoIGVuZEZsYWcgPT0gMCApOworICB9IHdoaWxlIChlbmRGbGFnID09IDApOwogCi0gIGxlbiA8PD0gMzsgIC8qIGNvbnZlcnQgZnJvbSBieXRlcyB0byBiaXRzICovCisgIGxlbiA8PD0gMzsgLyogY29udmVydCBmcm9tIGJ5dGVzIHRvIGJpdHMgKi8KIAogICByZXR1cm4gbGVuOwogfQogCi1pbnQgQ0xhdG1EZW11eF9HZXRGcmFtZUxlbmd0aEluQml0cyhDTGF0bURlbXV4ICpwTGF0bURlbXV4KQotewotICByZXR1cm4gcExhdG1EZW11eC0+bV9saW5mb1swXVswXS5tX2ZyYW1lTGVuZ3RoSW5CaXRzOworVUlOVCBDTGF0bURlbXV4X0dldEZyYW1lTGVuZ3RoSW5CaXRzKENMYXRtRGVtdXggKnBMYXRtRGVtdXgsIGNvbnN0IFVJTlQgcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxheWVyKSB7CisgIFVJTlQgbkZyYW1lTGVuQml0cyA9IDA7CisgIGlmIChwcm9nIDwgcExhdG1EZW11eC0+bV9udW1Qcm9ncmFtKSB7CisgICAgaWYgKGxheWVyIDwgcExhdG1EZW11eC0+bV9udW1MYXllcltwcm9nXSkgeworICAgICAgbkZyYW1lTGVuQml0cyA9IHBMYXRtRGVtdXgtPm1fbGluZm9bcHJvZ11bbGF5ZXJdLm1fZnJhbWVMZW5ndGhJbkJpdHM7CisgICAgfQorICB9CisgIHJldHVybiBuRnJhbWVMZW5CaXRzOwogfQogCi1pbnQgQ0xhdG1EZW11eF9HZXRPdGhlckRhdGFQcmVzZW50RmxhZyhDTGF0bURlbXV4ICpwTGF0bURlbXV4KQoteworVUlOVCBDTGF0bURlbXV4X0dldE90aGVyRGF0YVByZXNlbnRGbGFnKENMYXRtRGVtdXggKnBMYXRtRGVtdXgpIHsKICAgcmV0dXJuIHBMYXRtRGVtdXgtPm1fb3RoZXJEYXRhUHJlc2VudCA/IDEgOiAwOwogfQogCi1pbnQgQ0xhdG1EZW11eF9HZXRPdGhlckRhdGFMZW5ndGgoQ0xhdG1EZW11eCAqcExhdG1EZW11eCkKLXsKK1VJTlQgQ0xhdG1EZW11eF9HZXRPdGhlckRhdGFMZW5ndGgoQ0xhdG1EZW11eCAqcExhdG1EZW11eCkgewogICByZXR1cm4gcExhdG1EZW11eC0+bV9vdGhlckRhdGFMZW5ndGg7CiB9CiAKLVVJTlQgQ0xhdG1EZW11eF9HZXROck9mU3ViRnJhbWVzKENMYXRtRGVtdXggKnBMYXRtRGVtdXgpCi17CitVSU5UIENMYXRtRGVtdXhfR2V0TnJPZlN1YkZyYW1lcyhDTGF0bURlbXV4ICpwTGF0bURlbXV4KSB7CiAgIHJldHVybiBwTGF0bURlbXV4LT5tX25vU3ViRnJhbWVzOwogfQogCitVSU5UIENMYXRtRGVtdXhfR2V0TnJPZkxheWVycyhDTGF0bURlbXV4ICpwTGF0bURlbXV4LCBjb25zdCBVSU5UIHByb2cpIHsKKyAgVUlOVCBudW1MYXllciA9IDA7CisgIGlmIChwcm9nIDwgcExhdG1EZW11eC0+bV9udW1Qcm9ncmFtKSB7CisgICAgbnVtTGF5ZXIgPSBwTGF0bURlbXV4LT5tX251bUxheWVyW3Byb2ddOworICB9CisgIHJldHVybiBudW1MYXllcjsKK30KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfbGF0bS5oIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19sYXRtLmgKaW5kZXggNmRjMTNlOC4uNmFmNTUzZCAxMDA2NDQKLS0tIGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19sYXRtLmgKKysrIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19sYXRtLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMzIgKzkwLDMyIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBNUEVHIHRyYW5zcG9ydCBmb3JtYXQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgRGFuaWVsIEhvbW0KKwogICAgRGVzY3JpcHRpb246CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgTEFUTV9ERU1VWF9ICi0jZGVmaW5lIExBVE1fREVNVVhfSAorI2lmbmRlZiBUUERFQ19MQVRNX0gKKyNkZWZpbmUgVFBERUNfTEFUTV9ICiAKICNpbmNsdWRlICJ0cGRlY19saWIuaCIKIAotCiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgogCi0jZGVmaW5lIE1JTl9MQVRNX0hFQURFUkxFTkdUSCAgOQotI2RlZmluZSBNSU5fTE9BU19IRUFERVJMRU5HVEggIE1JTl9MQVRNX0hFQURFUkxFTkdUSCArIDI0ICAgLyogYm90aCBpbiBiaXRzICovCi0gI2RlZmluZSBNSU5fVFBfQlVGX1NJWkVfTE9BUyAgICggODE5NCApCisjZGVmaW5lIE1JTl9MQVRNX0hFQURFUkxFTkdUSCA5CisjZGVmaW5lIE1JTl9MT0FTX0hFQURFUkxFTkdUSCBNSU5fTEFUTV9IRUFERVJMRU5HVEggKyAyNCAvKiBib3RoIGluIGJpdHMgKi8KKyNkZWZpbmUgTUlOX1RQX0JVRl9TSVpFX0xPQVMgKDgxOTQpCiAKIGVudW0gewogICBMQVRNX01BWF9QUk9HID0gMSwKLSAgTEFUTV9NQVhfTEFZRVIgPSAyLAotICBMQVRNX01BWF9WQVJfQ0hVTktTPTE2LAotICBMQVRNX01BWF9JRD0xNgorICBMQVRNX01BWF9MQVlFUiA9IDEsCisgIExBVE1fTUFYX1ZBUl9DSFVOS1MgPSAxNiwKKyAgTEFUTV9NQVhfSUQgPSAxNgogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtMTE4LDcgKzEyOSw3IEBACiAgIExBVE1fTEFZRVJfSU5GTyBtX2xpbmZvW0xBVE1fTUFYX1BST0ddW0xBVE1fTUFYX0xBWUVSXTsKICAgVUlOVCBtX3RhcmFCdWZmZXJGdWxsbmVzczsKICAgVUlOVCBtX290aGVyRGF0YUxlbmd0aDsKLSAgVUlOVCBtX2F1ZGlvTXV4TGVuZ3RoQnl0ZXM7ICAgICAgICAgIC8qIExlbmd0aCBvZiBMT0FTIHBheWxvYWQgKi8KKyAgVUlOVCBtX2F1ZGlvTXV4TGVuZ3RoQnl0ZXM7IC8qIExlbmd0aCBvZiBMT0FTIHBheWxvYWQgKi8KIAogICBVQ0hBUiBtX3VzZVNhbWVTdHJlYW1NdXg7CiAgIFVDSEFSIG1fQXVkaW9NdXhWZXJzaW9uOwpAQCAtMTI2LDI3ICsxMzcsMjggQEAKICAgVUNIQVIgbV9hbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nOwogICBVQ0hBUiBtX25vU3ViRnJhbWVzOwogICBVQ0hBUiBtX251bVByb2dyYW07Ci0gIFVDSEFSIG1fbnVtTGF5ZXI7Ci0gIFVDSEFSIG1fdXNlU2FtZUNvbmZpZzsKKyAgVUNIQVIgbV9udW1MYXllcltMQVRNX01BWF9QUk9HXTsKIAogICBVQ0hBUiBtX290aGVyRGF0YVByZXNlbnQ7CiAgIFVDSEFSIG1fY3JjQ2hlY2tQcmVzZW50OwotICBVQ0hBUiBtX2NyY0NoZWNrU3VtOwogCiAgIFNDSEFSIEJ1ZmZlckZ1bGxuZXNzQWNoaWV2ZWQ7CisgIFVDSEFSCisgIHVzYWNFeHBsaWNpdENmZ0NoYW5nZWQ7ICAgICAgLyogZXhwbGljaXQgY29uZmlnIGluIGNhc2Ugb2YgVVNBQyBhbmQgTE9BUy9MQVRNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBjb21wYXJlZCB0byBJUEYgY2ZnICovCisgIFVDSEFSIGFwcGx5QXNjOyAgICAgICAgICAgICAgLyogYXBwbHkgQVNDIGltbWVkaWF0ZSB3aXRob3V0IGZsdXNoaW5nICovCisgIFVDSEFSIG5ld0NmZ0hhc0F1ZGlvUHJlUm9sbDsgLyogdGhlIG5ldyAoZHVtbXkgcGFyc2VkKSBjb25maWcgaGFzIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QcmVSb2xsICovCiB9IENMYXRtRGVtdXg7CiAKIGludCBDTGF0bURlbXV4X1JlYWRBdUNodW5rTGVuZ3RoSW5mbyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBicyk7CiAKLVRSQU5TUE9SVERFQ19FUlJPUiBDTGF0bURlbXV4X1JlYWQoCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAotICAgICAgICBDTGF0bURlbXV4ICpwTGF0bURlbXV4LAotICAgICAgICBUUkFOU1BPUlRfVFlQRSB0dCwKLSAgICAgICAgQ1NUcENhbGxCYWNrcyAqcFRwRGVjQ2FsbGJhY2tzLAotICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2MsCi0gICAgICAgIGludCAqcGZDb25maWdGb3VuZCwKLSAgICAgICAgY29uc3QgSU5UIGlnbm9yZUJ1ZmZlckZ1bGxuZXNzCi0gICAgICAgICk7CitUUkFOU1BPUlRERUNfRVJST1IgQ0xhdG1EZW11eF9SZWFkKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTGF0bURlbXV4ICpwTGF0bURlbXV4LCBUUkFOU1BPUlRfVFlQRSB0dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NUcENhbGxCYWNrcyAqcFRwRGVjQ2FsbGJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcGZDb25maWdGb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGlnbm9yZUJ1ZmZlckZ1bGxuZXNzKTsKIAogLyoqCiAgKiBcYnJpZWYgUmVhZCBTdHJlYW1NdXhDb25maWcKQEAgLTE1NCwyMyArMTY2LDI2IEBACiAgKiBccGFyYW0gcExhdG1EZW11eCBwb2ludGVyIHRvIENMYXRtRGVtdXggc3RydWN0IG9mIGN1cnJlbnQgTEFUTSBjb250ZXh0CiAgKiBccGFyYW0gcFRwRGVjQ2FsbGJhY2tzIENhbGwgYmFjayBzdHJ1Y3R1cmUgZm9yIGNvbmZpZ3VyYXRpb24gY2FsbGJhY2tzCiAgKiBccGFyYW0gcEFzYyBwb2ludGVyIHRvIGEgQVNDIGZvciBjb25maWd1cmF0aW9uIHN0b3JhZ2UKLSAqIFxwYXJhbSBwZkNvbmZpZ0ZvdW5kIHBvaW50ZXIgdG8gYSBmbGFnIHdoaWNoIGlzIHNldCB0byAxIGlmIGEgY29uZmlndXJhdGlvbiB3YXMgZm91bmQgYW5kIHByb2Nlc3NlZCBzdWNjZXNzZnVsbHkKKyAqIFxwYXJhbSBwZkNvbmZpZ0ZvdW5kIHBvaW50ZXIgdG8gYSBmbGFnIHdoaWNoIGlzIHNldCB0byAxIGlmIGEgY29uZmlndXJhdGlvbgorICogd2FzIGZvdW5kIGFuZCBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5CisgKiBccGFyYW0gY29uZmlnTW9kZSBDb25maWcgbW9kZXM6IG1lbW9yeSBhbGxvY2F0aW9uIG1vZGUgb3IgY29uZmlnIGNoYW5nZQorICogZGV0ZWN0aW9uIG1vZGUKKyAqIFxwYXJhbSBjb25maWdDaGFuZ2VkIEluZGljYXRlcyBhIGNvbmZpZyBjaGFuZ2UKICAqIFxyZXR1cm4gZXJyb3IgY29kZQogICovCiBUUkFOU1BPUlRERUNfRVJST1IgQ0xhdG1EZW11eF9SZWFkU3RyZWFtTXV4Q29uZmlnKAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywKLSAgICAgICAgQ0xhdG1EZW11eCAqcExhdG1EZW11eCwKLSAgICAgICAgQ1NUcENhbGxCYWNrcyAqcFRwRGVjQ2FsbGJhY2tzLAotICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnBBc2MsCi0gICAgICAgIGludCAqIHBmQ29uZmlnRm91bmQKLSAgICAgICAgKTsKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBicywgQ0xhdG1EZW11eCAqcExhdG1EZW11eCwKKyAgICBDU1RwQ2FsbEJhY2tzICpwVHBEZWNDYWxsYmFja3MsIENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzYywKKyAgICBpbnQgKnBmQ29uZmlnRm91bmQsIFVDSEFSIGNvbmZpZ01vZGUsIFVDSEFSIGNvbmZpZ0NoYW5nZWQpOwogCi1UUkFOU1BPUlRERUNfRVJST1IgQ0xhdG1EZW11eF9SZWFkUGF5bG9hZExlbmd0aEluZm8oSEFORExFX0ZES19CSVRTVFJFQU0gYnMsIENMYXRtRGVtdXggKnBMYXRtRGVtdXgpOworVFJBTlNQT1JUREVDX0VSUk9SIENMYXRtRGVtdXhfUmVhZFBheWxvYWRMZW5ndGhJbmZvKEhBTkRMRV9GREtfQklUU1RSRUFNIGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMYXRtRGVtdXggKnBMYXRtRGVtdXgpOwogCi1pbnQgIENMYXRtRGVtdXhfR2V0RnJhbWVMZW5ndGhJbkJpdHMoQ0xhdG1EZW11eCAqcExhdG1EZW11eCk7Ci1pbnQgIENMYXRtRGVtdXhfR2V0T3RoZXJEYXRhUHJlc2VudEZsYWcoQ0xhdG1EZW11eCAqcExhdG1EZW11eCk7Ci1pbnQgIENMYXRtRGVtdXhfR2V0T3RoZXJEYXRhTGVuZ3RoKENMYXRtRGVtdXggKnBMYXRtRGVtdXgpOworVUlOVCBDTGF0bURlbXV4X0dldEZyYW1lTGVuZ3RoSW5CaXRzKENMYXRtRGVtdXggKnBMYXRtRGVtdXgsIGNvbnN0IFVJTlQgcHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxheWVyKTsKK1VJTlQgQ0xhdG1EZW11eF9HZXRPdGhlckRhdGFQcmVzZW50RmxhZyhDTGF0bURlbXV4ICpwTGF0bURlbXV4KTsKK1VJTlQgQ0xhdG1EZW11eF9HZXRPdGhlckRhdGFMZW5ndGgoQ0xhdG1EZW11eCAqcExhdG1EZW11eCk7CiBVSU5UIENMYXRtRGVtdXhfR2V0TnJPZlN1YkZyYW1lcyhDTGF0bURlbXV4ICpwTGF0bURlbXV4KTsKK1VJTlQgQ0xhdG1EZW11eF9HZXROck9mTGF5ZXJzKENMYXRtRGVtdXggKnBMYXRtRGVtdXgsIGNvbnN0IFVJTlQgcHJvZ3JhbSk7CiAKLQotI2VuZGlmIC8qIExBVE1fREVNVVhfSCAqLworI2VuZGlmIC8qIFRQREVDX0xBVE1fSCAqLwpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19saWIuY3BwIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19saWIuY3BwCmluZGV4IDI0Zjc1NWIuLjFkOGI3YjMgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfbGliLmNwcAorKysgYi9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2xpYi5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjAgKzkwLDIwIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgVHJhbnNwb3J0IERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTVBFRyB0cmFuc3BvcnQgZm9ybWF0IGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioKIAotICAgQXV0aG9yKHMpOiBNYW51ZWwgSmFuZGVyCisgICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgorCiAgICBEZXNjcmlwdGlvbjogTVBFRyBUcmFuc3BvcnQgZGVjb2RlcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAidHBkZWNfbGliLmgiCiAKIC8qIGxpYnJhcnkgdmVyc2lvbiAqLwotI2luY2x1ZGUgInZlcnNpb24iCi0KKyNpbmNsdWRlICJ0cF92ZXJzaW9uLmgiCiAKICNpbmNsdWRlICJ0cF9kYXRhLmgiCiAKQEAgLTEwNCw2ICsxMTUsNyBAQAogCiAjaW5jbHVkZSAidHBkZWNfZHJtLmgiCiAKKyNpbmNsdWRlICJGREtfY3JjLmgiCiAKICNkZWZpbmUgTU9EVUxFX05BTUUgInRyYW5zcG9ydERlYyIKIApAQCAtMTE4LDUxICsxMzAsNzAgQEAKIAogfSB0cmFuc3BvcnRkZWNfcGFyc2VyX3Q7CiAKLXN0cnVjdCBUUkFOU1BPUlRERUMKLXsKLSAgVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0Rm10OyAgICAgLyohPCBNUEVHNCB0cmFuc3BvcnREZWMgdHlwZS4gKi8KKyNkZWZpbmUgTUhBU19DT05GSUdfUFJFU0VOVCAweDAwMQorI2RlZmluZSBNSEFTX1VJX1BSRVNFTlQgMHgwMDIKIAotICBDU1RwQ2FsbEJhY2tzIGNhbGxiYWNrczsgICAgICAgICAvKiE8IFN0cnVjdCBob2xkaW5nIGNhbGxiYWNrIGFuZCBpdHMgZGF0YSAqLworc3RydWN0IFRSQU5TUE9SVERFQyB7CisgIFRSQU5TUE9SVF9UWVBFIHRyYW5zcG9ydEZtdDsgLyohPCBNUEVHNCB0cmFuc3BvcnREZWMgdHlwZS4gKi8KIAotICBGREtfQklUU1RSRUFNIGJpdFN0cmVhbVsyXTsgLyogQml0c3RyZWFtIHJlYWRlciAqLwotICBVQ0hBUiAqYnNCdWZmZXI7ICAgICAgICAgICAgICAgICAvKiBJbnRlcm5hbCBiaXRzdHJlYW1kIGRhdGEgYnVmZmVyICh1bmFsbG9jYXRlZCBpbiBjYXNlIG9mIFRUX01QNF9SQVdQQUNLRVRTKSAqLworICBDU1RwQ2FsbEJhY2tzIGNhbGxiYWNrczsgLyohPCBTdHJ1Y3QgaG9sZGluZyBjYWxsYmFjayBhbmQgaXRzIGRhdGEgKi8KIAotICB0cmFuc3BvcnRkZWNfcGFyc2VyX3QgcGFyc2VyOyAgICAvKiBGb3JtYXQgc3BlY2lmaWMgcGFyc2VyIHN0cnVjdHMuICovCisgIEZES19CSVRTVFJFQU0gYml0U3RyZWFtWzFdOyAvKiBCaXRzdHJlYW0gcmVhZGVyICovCisgIFVDSEFSICpic0J1ZmZlcjsgICAgICAgICAgICAvKiBJbnRlcm5hbCBiaXRzdHJlYW1kIGRhdGEgYnVmZmVyICovCiAKLSAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnIGFzY1soMSoyKV07IC8qIEF1ZGlvIHNwZWNpZmljIGNvbmZpZyBmcm9tIHRoZSBsYXN0IGNvbmZpZyBmb3VuZC4gKi8KLSAgVUlOVCAgZ2xvYmFsRnJhbWVQb3M7ICAgICAgICAgICAgLyogR2xvYmFsIHRyYW5zcG9ydCBmcmFtZSByZWZlcmVuY2UgYml0IHBvc2l0aW9uLiAqLwotICBVSU5UICBhY2Nlc3NVbml0QW5jaG9yWzJdOyAgICAvKiBDdXJyZW50IGFjY2VzcyB1bml0IHN0YXJ0IGJpdCBwb3NpdGlvbi4gKi8KLSAgSU5UICAgYXVMZW5ndGhbMl07ICAgICAgICAgICAgLyogTGVuZ3RoIG9mIGN1cnJlbnQgYWNjZXNzIHVuaXQuICovCi0gIElOVCAgIG51bWJlck9mUmF3RGF0YUJsb2NrczsgICAgIC8qIEN1cnJlbnQgbnVtYmVyIG9mIHJhdyBkYXRhIGJsb2NrcyBjb250YWluZWQgcmVtYWluaW5nIGZyb20gdGhlIGN1cnJlbnQgdHJhbnNwb3J0IGZyYW1lLiAqLwotICBVSU5UICBhdmdCaXRSYXRlOyAgICAgICAgICAgICAgICAvKiBBdmVyYWdlIGJpdCByYXRlIHVzZWQgZm9yIGZyYW1lIGxvc3MgZXN0aW1hdGlvbi4gKi8KLSAgVUlOVCAgbGFzdFZhbGlkQnVmZmVyRnVsbG5lc3M7ICAgLyogTGFzdCB2YWxpZCBidWZmZXIgZnVsbG5lc3MgdmFsdWUgZm9yIGZyYW1lIGxvc3MgZXN0aW1hdGlvbiAqLwotICBJTlQgICByZW1haW5kZXI7ICAgICAgICAgICAgICAgICAvKiBSZW1pbmRlciBpbiBkaXZpc2lvbiBkdXJpbmcgbG9zdCBhY2Nlc3MgdW5pdCBlc3RpbWF0aW9uLiAqLwotICBJTlQgICBtaXNzaW5nQWNjZXNzVW5pdHM7ICAgICAgICAvKiBFc3RpbWF0ZWQgbWlzc2luZyBhY2Nlc3MgdW5pdHMuICovCi0gIFVJTlQgIGJ1cnN0UGVyaW9kOyAgICAgICAgICAgICAgIC8qIERhdGEgYnVyc3QgcGVyaW9kIGluIG1pbGkgc2Vjb25kcy4gKi8KLSAgVUlOVCAgaG9sZE9mZkZyYW1lczsgICAgICAgICAgICAgLyogQW1vdW50IG9mIGZyYW1lcyB0aGF0IHdlcmUgYWxyZWFkeSBob2xkIG9mZiBkdWUgdG8gYnVmZmVyIGZ1bGxuZXNzIGNvbmRpdGlvbiBub3QgYmVpbmcgbWV0LiAqLwotICBVSU5UICBmbGFnczsgICAgICAgICAgICAgICAgICAgICAvKiBGbGFncy4gKi8KKyAgdHJhbnNwb3J0ZGVjX3BhcnNlcl90IHBhcnNlcjsgLyogRm9ybWF0IHNwZWNpZmljIHBhcnNlciBzdHJ1Y3RzLiAqLworCisgIENTQXVkaW9TcGVjaWZpY0NvbmZpZyBhc2NbKDEgKiAxKSArIDFdOyAvKiBBdWRpbyBzcGVjaWZpYyBjb25maWcgZnJvbSB0aGUgbGFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnIGZvdW5kLiBPbmUgYWRkaXRpb25hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NBdWRpb1NwZWNpZmljQ29uZmlnIGlzIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFyaWx5IGZvciBwYXJzaW5nLiAqLworICBDQ3RybENGR0NoYW5nZSBjdHJsQ0ZHQ2hhbmdlWygxICogMSldOyAgLyogQ29udHJvbHMgY29uZmlnIGNoYW5nZSAqLworCisgIFVJTlQgZ2xvYmFsRnJhbWVQb3M7ICAgICAgLyogR2xvYmFsIHRyYW5zcG9ydCBmcmFtZSByZWZlcmVuY2UgYml0IHBvc2l0aW9uLiAqLworICBVSU5UIGFjY2Vzc1VuaXRBbmNob3JbMV07IC8qIEN1cnJlbnQgYWNjZXNzIHVuaXQgc3RhcnQgYml0IHBvc2l0aW9uLiAqLworICBJTlQgYXVMZW5ndGhbMV07ICAgICAgICAgIC8qIExlbmd0aCBvZiBjdXJyZW50IGFjY2VzcyB1bml0LiAqLworICBJTlQgbnVtYmVyT2ZSYXdEYXRhQmxvY2tzOyAvKiBDdXJyZW50IG51bWJlciBvZiByYXcgZGF0YSBibG9ja3MgY29udGFpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyBmcm9tIHRoZSBjdXJyZW50IHRyYW5zcG9ydCBmcmFtZS4gKi8KKyAgVUlOVCBhdmdCaXRSYXRlOyAvKiBBdmVyYWdlIGJpdCByYXRlIHVzZWQgZm9yIGZyYW1lIGxvc3MgZXN0aW1hdGlvbi4gKi8KKyAgVUlOVCBsYXN0VmFsaWRCdWZmZXJGdWxsbmVzczsgLyogTGFzdCB2YWxpZCBidWZmZXIgZnVsbG5lc3MgdmFsdWUgZm9yIGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvc3MgZXN0aW1hdGlvbiAqLworICBJTlQgcmVtYWluZGVyOyAvKiBSZW1pbmRlciBpbiBkaXZpc2lvbiBkdXJpbmcgbG9zdCBhY2Nlc3MgdW5pdCBlc3RpbWF0aW9uLiAqLworICBJTlQgbWlzc2luZ0FjY2Vzc1VuaXRzOyAvKiBFc3RpbWF0ZWQgbWlzc2luZyBhY2Nlc3MgdW5pdHMuICovCisgIFVJTlQgYnVyc3RQZXJpb2Q7ICAgICAgIC8qIERhdGEgYnVyc3QgcGVyaW9kIGluIG1pbGkgc2Vjb25kcy4gKi8KKyAgVUlOVCBob2xkT2ZmRnJhbWVzOyAgICAgLyogQW1vdW50IG9mIGZyYW1lcyB0aGF0IHdlcmUgYWxyZWFkeSBob2xkIG9mZiBkdWUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGZ1bGxuZXNzIGNvbmRpdGlvbiBub3QgYmVpbmcgbWV0LiAqLworICBVSU5UIGZsYWdzOyAgICAgICAgICAgICAvKiBGbGFncy4gKi8KKyAgSU5UIHRhcmdldExheW91dDsgICAgICAgLyogQ0lDUCB0YXJnZXQgbGF5b3V0LiAqLworICBVSU5UICpwTG91ZG5lc3NJbmZvU2V0UG9zaXRpb247IC8qIFJlZmVyZW5jZSBhbmQgc3RhcnQgcG9zaXRpb24gKGJpdHMpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCAoYnl0ZXMpIG9mIGxvdWRuZXNzSW5mb1NldCB3aXRoaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc3Y2MDNkYUNvbmZpZy4gICovCiB9OwogCiAvKiBGbGFnIGJpdG1hc2tzIGZvciAiZmxhZ3MiIG1lbWJlciBvZiBzdHJ1Y3QgVFJBTlNQT1JUREVDICovCi0jZGVmaW5lIFRQREVDX1NZTkNPSyAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFRQREVDX01JTklNSVpFX0RFTEFZICAgICAgICAyCisjZGVmaW5lIFRQREVDX1NZTkNPSyAxCisjZGVmaW5lIFRQREVDX01JTklNSVpFX0RFTEFZIDIKICNkZWZpbmUgVFBERUNfSUdOT1JFX0JVRkZFUkZVTExORVNTIDQKLSNkZWZpbmUgVFBERUNfRUFSTFlfQ09ORklHICAgICAgICAgIDgKLSNkZWZpbmUgVFBERUNfTE9TVF9GUkFNRVNfUEVORElORyAgMTYKLSNkZWZpbmUgVFBERUNfQ09ORklHX0ZPVU5EICAgICAgICAgMzIKKyNkZWZpbmUgVFBERUNfRUFSTFlfQ09ORklHIDgKKyNkZWZpbmUgVFBERUNfTE9TVF9GUkFNRVNfUEVORElORyAxNgorI2RlZmluZSBUUERFQ19DT05GSUdfRk9VTkQgMzIKKyNkZWZpbmUgVFBERUNfVVNFX0VMRU1fU0tJUFBJTkcgNjQKIAotQ19BTExPQ19NRU0oUmFtX1RyYW5zcG9ydERlY29kZXIsIFRSQU5TUE9SVERFQywgMSkKLUNfQUxMT0NfTUVNKFJhbV9UcmFuc3BvcnREZWNvZGVyQnVmZmVyLCBVQ0hBUiwgVFJBTlNQT1JUREVDX0lOQlVGX1NJWkUpCisvKiBmb3JjZSBjb25maWcvY29udGVudCBjaGFuZ2UgKi8KKyNkZWZpbmUgVFBERUNfRk9SQ0VfQ09ORklHX0NIQU5HRSAxCisjZGVmaW5lIFRQREVDX0ZPUkNFX0NPTlRFTlRfQ0hBTkdFIDIKIAorLyogc2tpcCBwYWNrZXQgKi8KKyNkZWZpbmUgVFBERUNfU0tJUF9QQUNLRVQgMQogCitDX0FMTE9DX01FTShSYW1fVHJhbnNwb3J0RGVjb2Rlciwgc3RydWN0IFRSQU5TUE9SVERFQywgMSkKK0NfQUxMT0NfTUVNKFJhbV9UcmFuc3BvcnREZWNvZGVyQnVmZmVyLCBVQ0hBUiwgKDgxOTIgKiA0KSkKIAotCi1IQU5ETEVfVFJBTlNQT1JUREVDIHRyYW5zcG9ydERlY19PcGVuKCBjb25zdCBUUkFOU1BPUlRfVFlQRSB0cmFuc3BvcnRGbXQsIGNvbnN0IFVJTlQgZmxhZ3MpCi17CitIQU5ETEVfVFJBTlNQT1JUREVDIHRyYW5zcG9ydERlY19PcGVuKGNvbnN0IFRSQU5TUE9SVF9UWVBFIHRyYW5zcG9ydEZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncywgY29uc3QgVUlOVCBuck9mTGF5ZXJzKSB7CiAgIEhBTkRMRV9UUkFOU1BPUlRERUMgaElucHV0OwogCiAgIGhJbnB1dCA9IEdldFJhbV9UcmFuc3BvcnREZWNvZGVyKDApOwotICBpZiAoIGhJbnB1dCA9PSBOVUxMICkgeworICBpZiAoaElucHV0ID09IE5VTEwpIHsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCkBAIC0xNzAsMTA2ICsyMDEsMTU2IEBACiAgIGhJbnB1dC0+dHJhbnNwb3J0Rm10ID0gdHJhbnNwb3J0Rm10OwogCiAgIHN3aXRjaCAodHJhbnNwb3J0Rm10KSB7CisgICAgY2FzZSBUVF9NUDRfQURJRjoKKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgVFRfTVA0X0FESUY6Ci0gICAgYnJlYWs7CisgICAgY2FzZSBUVF9NUDRfQURUUzoKKyAgICAgIGlmIChmbGFncyAmIFRQX0ZMQUdfTVBFRzQpCisgICAgICAgIGhJbnB1dC0+cGFyc2VyLmFkdHMuZGVjb2RlckNhbkRvTXBlZzQgPSAxOworICAgICAgZWxzZQorICAgICAgICBoSW5wdXQtPnBhcnNlci5hZHRzLmRlY29kZXJDYW5Eb01wZWc0ID0gMDsKKyAgICAgIGFkdHNSZWFkX0NyY0luaXQoJmhJbnB1dC0+cGFyc2VyLmFkdHMpOworICAgICAgaElucHV0LT5wYXJzZXIuYWR0cy5CdWZmZXJGdWxsbmVzU3RhcnRGbGFnID0gMTsKKyAgICAgIGhJbnB1dC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzID0gMDsKKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgVFRfTVA0X0FEVFM6Ci0gICAgaWYgKGZsYWdzICYgVFBfRkxBR19NUEVHNCkKLSAgICAgIGhJbnB1dC0+cGFyc2VyLmFkdHMuZGVjb2RlckNhbkRvTXBlZzQgPSAxOwotICAgIGVsc2UKLSAgICAgIGhJbnB1dC0+cGFyc2VyLmFkdHMuZGVjb2RlckNhbkRvTXBlZzQgPSAwOwotICAgIGFkdHNSZWFkX0NyY0luaXQoJmhJbnB1dC0+cGFyc2VyLmFkdHMpOwotICAgIGhJbnB1dC0+cGFyc2VyLmFkdHMuQnVmZmVyRnVsbG5lc1N0YXJ0RmxhZyA9IDE7Ci0gICAgaElucHV0LT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPSAwOwotICAgIGJyZWFrOworICAgIGNhc2UgVFRfRFJNOgorICAgICAgZHJtUmVhZF9DcmNJbml0KCZoSW5wdXQtPnBhcnNlci5kcm0pOworICAgICAgYnJlYWs7CiAKLSAgY2FzZSBUVF9EUk06Ci0gICAgZHJtUmVhZF9DcmNJbml0KCZoSW5wdXQtPnBhcnNlci5kcm0pOwotICAgIGJyZWFrOworICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMDoKKyAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6CisgICAgICBoSW5wdXQtPnBhcnNlci5sYXRtLnVzYWNFeHBsaWNpdENmZ0NoYW5nZWQgPSAwOworICAgICAgaElucHV0LT5wYXJzZXIubGF0bS5hcHBseUFzYyA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRUX01QNF9MT0FTOgorICAgICAgaElucHV0LT5wYXJzZXIubGF0bS51c2FjRXhwbGljaXRDZmdDaGFuZ2VkID0gMDsKKyAgICAgIGhJbnB1dC0+cGFyc2VyLmxhdG0uYXBwbHlBc2MgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUVF9NUDRfUkFXOgorICAgICAgYnJlYWs7CiAKLSAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgotICBjYXNlIFRUX01QNF9MQVRNX01DUDE6Ci0gIGNhc2UgVFRfTVA0X0xPQVM6Ci0gIGNhc2UgVFRfTVA0X1JBVzoKLSAgICBicmVhazsKLQotICBkZWZhdWx0OgotICAgIEZyZWVSYW1fVHJhbnNwb3J0RGVjb2RlcigmaElucHV0KTsKLSAgICBoSW5wdXQgPSBOVUxMOwotICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBGcmVlUmFtX1RyYW5zcG9ydERlY29kZXIoJmhJbnB1dCk7CisgICAgICBoSW5wdXQgPSBOVUxMOworICAgICAgYnJlYWs7CiAgIH0KIAogICBpZiAoaElucHV0ICE9IE5VTEwpIHsKICAgICAvKiBDcmVhdGUgYml0c3RyZWFtICovCi0gICAgaWYgKCBUVF9JU19QQUNLRVQodHJhbnNwb3J0Rm10KSApIHsKLSAgICAgIGhJbnB1dC0+YnNCdWZmZXIgPSBOVUxMOwotICAgIH0gZWxzZSB7CisgICAgewogICAgICAgaElucHV0LT5ic0J1ZmZlciA9IEdldFJhbV9UcmFuc3BvcnREZWNvZGVyQnVmZmVyKDApOwogICAgICAgaWYgKGhJbnB1dC0+YnNCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgIHRyYW5zcG9ydERlY19DbG9zZSggJmhJbnB1dCApOwotICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB0cmFuc3BvcnREZWNfQ2xvc2UoJmhJbnB1dCk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgfQotICAgICAgRkRLaW5pdEJpdFN0cmVhbSgmaElucHV0LT5iaXRTdHJlYW1bMF0sIGhJbnB1dC0+YnNCdWZmZXIsIFRSQU5TUE9SVERFQ19JTkJVRl9TSVpFLCAwLCBCU19SRUFERVIpOworICAgICAgaWYgKG5yT2ZMYXllcnMgPiAxKSB7CisgICAgICAgIHRyYW5zcG9ydERlY19DbG9zZSgmaElucHV0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBmb3IgKFVJTlQgaSA9IDA7IGkgPCBuck9mTGF5ZXJzOyBpKyspIHsKKyAgICAgICAgRkRLaW5pdEJpdFN0cmVhbSgmaElucHV0LT5iaXRTdHJlYW1baV0sIGhJbnB1dC0+YnNCdWZmZXIsICg4MTkyICogNCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQlNfUkVBREVSKTsKKyAgICAgIH0KICAgICB9Ci0KICAgICBoSW5wdXQtPmJ1cnN0UGVyaW9kID0gMDsKICAgfQogCiAgIHJldHVybiBoSW5wdXQ7CiB9CiAKLVRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfT3V0T2ZCYW5kQ29uZmlnKEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLCBVQ0hBUiAqY29uZiwgY29uc3QgVUlOVCBsZW5ndGgsIFVJTlQgbGF5ZXIgKQotewotICBUUkFOU1BPUlRERUNfRVJST1IgICAgIGVyciAgICAgICAgPSBUUkFOU1BPUlRERUNfT0s7CitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX091dE9mQmFuZENvbmZpZyhIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpjb25mLCBjb25zdCBVSU5UIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgbGF5ZXIpIHsKKyAgaW50IGk7CisKKyAgVFJBTlNQT1JUREVDX0VSUk9SIGVyciA9IFRSQU5TUE9SVERFQ19PSzsKIAogICBGREtfQklUU1RSRUFNIGJzOwotICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJzICAgICAgICA9ICZiczsKLQotICBGREtpbml0Qml0U3RyZWFtKGhCcywgY29uZiwgMHgxMDAwMDAwMCwgbGVuZ3RoPDwzLCBCU19SRUFERVIpOworICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSAmYnM7CiAKICAgaW50IGZDb25maWdGb3VuZCA9IDA7CiAKLSAgLyogY29uZmlnIHRyYW5zcG9ydCBkZWNvZGVyICovCi0gIHN3aXRjaCAoaFRwLT50cmFuc3BvcnRGbXQpIHsKLSAgICBjYXNlIFRUX01QNF9MQVRNX01DUDA6Ci0gICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AxOgotICAgIGNhc2UgVFRfTVA0X0xPQVM6Ci0gICAgICB7CisgIFVDSEFSIGNvbmZpZ0NoYW5nZWQgPSAwOworICBVQ0hBUiBjb25maWdNb2RlID0gQUNfQ01fREVUX0NGR19DSEFOR0U7CisKKyAgVUNIQVIgdG1wQ29uZlsxMDI0XTsKKyAgaWYgKGxlbmd0aCA+IDEwMjQpIHsKKyAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgfQorICBGREttZW1jcHkodG1wQ29uZiwgY29uZiwgbGVuZ3RoKTsKKyAgRkRLaW5pdEJpdFN0cmVhbShoQnMsIHRtcENvbmYsIDEwMjQsIGxlbmd0aCA8PCAzLCBCU19SRUFERVIpOworCisgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICBpZiAoaSA+IDApIHsKKyAgICAgIEZES3B1c2hCYWNrKGhCcywgKElOVClsZW5ndGggKiA4IC0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSk7CisgICAgICBjb25maWdNb2RlID0gQUNfQ01fQUxMT0NfTUVNOworICAgIH0KKworICAgIC8qIGNvbmZpZyB0cmFuc3BvcnQgZGVjb2RlciAqLworICAgIHN3aXRjaCAoaFRwLT50cmFuc3BvcnRGbXQpIHsKKyAgICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMDoKKyAgICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKKyAgICAgIGNhc2UgVFRfTVA0X0xPQVM6IHsKICAgICAgICAgaWYgKGxheWVyICE9IDApIHsKICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgICB9CiAgICAgICAgIENMYXRtRGVtdXggKnBMYXRtRGVtdXggPSAmaFRwLT5wYXJzZXIubGF0bTsKLSAgICAgICAgZXJyID0gQ0xhdG1EZW11eF9SZWFkU3RyZWFtTXV4Q29uZmlnKGhCcywgcExhdG1EZW11eCwgJmhUcC0+Y2FsbGJhY2tzLCBoVHAtPmFzYywgJmZDb25maWdGb3VuZCk7CisgICAgICAgIGVyciA9IENMYXRtRGVtdXhfUmVhZFN0cmVhbU11eENvbmZpZyhoQnMsIHBMYXRtRGVtdXgsICZoVHAtPmNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUcC0+YXNjLCAmZkNvbmZpZ0ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnTW9kZSwgY29uZmlnQ2hhbmdlZCk7CiAgICAgICAgIGlmIChlcnIgIT0gVFJBTlNQT1JUREVDX09LKSB7CiAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZDb25maWdGb3VuZCA9IDE7Ci0gICAgICBlcnIgPSBBdWRpb1NwZWNpZmljQ29uZmlnX1BhcnNlKCZoVHAtPmFzY1tsYXllcl0sIGhCcywgMSwgJmhUcC0+Y2FsbGJhY2tzKTsKLSAgICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICB9IGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZkNvbmZpZ0ZvdW5kID0gMTsKKyAgICAgICAgZXJyID0gQXVkaW9TcGVjaWZpY0NvbmZpZ19QYXJzZSgmaFRwLT5hc2NbKDEgKiAxKV0sIGhCcywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFRwLT5jYWxsYmFja3MsIGNvbmZpZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ2hhbmdlZCwgQU9UX05VTExfT0JKRUNUKTsKKyAgICAgICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICAgICAgICBpbnQgZXJyQzsKKworICAgICAgICAgIGhUcC0+YXNjW2xheWVyXSA9IGhUcC0+YXNjWygxICogMSldOworICAgICAgICAgIGVyckMgPSBoVHAtPmNhbGxiYWNrcy5jYlVwZGF0ZUNvbmZpZygKKyAgICAgICAgICAgICAgaFRwLT5jYWxsYmFja3MuY2JVcGRhdGVDb25maWdEYXRhLCAmaFRwLT5hc2NbbGF5ZXJdLAorICAgICAgICAgICAgICBoVHAtPmFzY1tsYXllcl0uY29uZmlnTW9kZSwgJmhUcC0+YXNjW2xheWVyXS5BYWNDb25maWdDaGFuZ2VkKTsKKyAgICAgICAgICBpZiAoZXJyQyAhPSAwKSB7CisgICAgICAgICAgICBlcnIgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUVF9EUk06CisgICAgICAgIGZDb25maWdGb3VuZCA9IDE7CisgICAgICAgIGVyciA9IERybVJhd1NkY0F1ZGlvQ29uZmlnX1BhcnNlKCZoVHAtPmFzY1tsYXllcl0sIGhCcywgJmhUcC0+Y2FsbGJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdNb2RlLCBjb25maWdDaGFuZ2VkKTsKKyAgICAgICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICAgICAgICBpbnQgZXJyQzsKKworICAgICAgICAgIGVyckMgPSBoVHAtPmNhbGxiYWNrcy5jYlVwZGF0ZUNvbmZpZygKKyAgICAgICAgICAgICAgaFRwLT5jYWxsYmFja3MuY2JVcGRhdGVDb25maWdEYXRhLCAmaFRwLT5hc2NbbGF5ZXJdLAorICAgICAgICAgICAgICBoVHAtPmFzY1tsYXllcl0uY29uZmlnTW9kZSwgJmhUcC0+YXNjW2xheWVyXS5BYWNDb25maWdDaGFuZ2VkKTsKKyAgICAgICAgICBpZiAoZXJyQyAhPSAwKSB7CisgICAgICAgICAgICBlcnIgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICBpZiAoKGkgPT0gMCkgJiYgKGhUcC0+YXNjW2xheWVyXS5BYWNDb25maWdDaGFuZ2VkIHx8CisgICAgICAgICAgICAgICAgICAgICAgIGhUcC0+YXNjW2xheWVyXS5TYnJDb25maWdDaGFuZ2VkIHx8CisgICAgICAgICAgICAgICAgICAgICAgIGhUcC0+YXNjW2xheWVyXS5TYWNDb25maWdDaGFuZ2VkKSkgewogICAgICAgICBpbnQgZXJyQzsKIAotICAgICAgICBlcnJDID0gaFRwLT5jYWxsYmFja3MuY2JVcGRhdGVDb25maWcoaFRwLT5jYWxsYmFja3MuY2JVcGRhdGVDb25maWdEYXRhLCAmaFRwLT5hc2NbbGF5ZXJdKTsKKyAgICAgICAgY29uZmlnQ2hhbmdlZCA9IDE7CisgICAgICAgIGVyckMgPSBoVHAtPmNhbGxiYWNrcy5jYkZyZWVNZW0oaFRwLT5jYWxsYmFja3MuY2JGcmVlTWVtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFRwLT5hc2NbbGF5ZXJdKTsKICAgICAgICAgaWYgKGVyckMgIT0gMCkgewogICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKICAgICAgICAgfQogICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUVF9EUk06Ci0gICAgICBmQ29uZmlnRm91bmQgPSAxOwotICAgICAgZXJyID0gRHJtUmF3U2RjQXVkaW9Db25maWdfUGFyc2UoJmhUcC0+YXNjW2xheWVyXSwgaEJzKTsKLSAgICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LKSB7Ci0gICAgICAgIGludCBlcnJDOwotCi0gICAgICAgIGVyckMgPSBoVHAtPmNhbGxiYWNrcy5jYlVwZGF0ZUNvbmZpZyhoVHAtPmNhbGxiYWNrcy5jYlVwZGF0ZUNvbmZpZ0RhdGEsICZoVHAtPmFzY1tsYXllcl0pOwotICAgICAgICBpZiAoZXJyQyAhPSAwKSB7Ci0gICAgICAgICAgZXJyID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKKyAgICB9CiAgIH0KIAogICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19PSyAmJiBmQ29uZmlnRm91bmQpIHsKQEAgLTI3OSw4ICszNjAsMjA4IEBACiAgIHJldHVybiBlcnI7CiB9CiAKLWludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJBc2NDYWxsYmFjayggSEFORExFX1RSQU5TUE9SVERFQyBoVHBEZWMsIGNvbnN0IGNiVXBkYXRlQ29uZmlnX3QgY2JVcGRhdGVDb25maWcsIHZvaWQqIHVzZXJfZGF0YSkKLXsKK1RSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfSW5CYW5kQ29uZmlnKEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKm5ld0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbmV3Q29uZmlnTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgYnVpbGRVcFN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpjb25maWdDaGFuZ2VkLCBVSU5UIGxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmltcGxpY2l0RXhwbGljaXRDZmdEaWZmKSB7CisgIGludCBlcnJDOworICBGREtfQklUU1RSRUFNIGJzOworICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSAmYnM7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBlcnIgPSBUUkFOU1BPUlRERUNfT0s7CisgIGludCBmQ29uZmlnRm91bmQgPSAwOworICBVQ0hBUiBjb25maWdNb2RlID0gQUNfQ01fQUxMT0NfTUVNOworICAqaW1wbGljaXRFeHBsaWNpdENmZ0RpZmYgPSAwOworCisgIEZES19BU1NFUlQoaFRwLT5hc2MtPm1fYW90ID09IEFPVF9VU0FDKTsKKworICBGREtpbml0Qml0U3RyZWFtKGhCcywgbmV3Q29uZmlnLCBUUF9VU0FDX01BWF9DT05GSUdfTEVOLCBuZXdDb25maWdMZW5ndGggPDwgMywKKyAgICAgICAgICAgICAgICAgICBCU19SRUFERVIpOworCisgIGlmICgoaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5mbHVzaFN0YXR1cyA9PSBUUERFQ19GTFVTSF9PRkYpICYmCisgICAgICAoaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5idWlsZFVwU3RhdHVzICE9CisgICAgICAgVFBERUNfUlNWNjBfQlVJTERfVVBfSURMRV9JTl9CQU5EKSkgeworICAgIGlmIChoVHAtPmFzYy0+bV9hb3QgPT0gQU9UX1VTQUMpIHsKKyAgICAgIGlmICgoVUlOVCkoaFRwLT5hc2MtPm1fc2MubV91c2FjQ29uZmlnLlVzYWNDb25maWdCaXRzICsgNykgPj4gMyA9PQorICAgICAgICAgIG5ld0NvbmZpZ0xlbmd0aCkgeworICAgICAgICBpZiAoMCA9PSBGREttZW1jbXAobmV3Q29uZmlnLCBoVHAtPmFzYy0+bV9zYy5tX3VzYWNDb25maWcuVXNhY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbmZpZ0xlbmd0aCkpIHsKKyAgICAgICAgICBpZiAoaFRwLT5wYXJzZXIubGF0bS51c2FjRXhwbGljaXRDZmdDaGFuZ2VkKSB7IC8qIGNvbmZpZ0NoYW5nZSBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0FTL0xBVE0gcGFyc2VyICovCisgICAgICAgICAgICBoVHAtPnBhcnNlci5sYXRtLnVzYWNFeHBsaWNpdENmZ0NoYW5nZWQgPSAwOworICAgICAgICAgICAgaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5mbHVzaENudCA9IDA7CisgICAgICAgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmZsdXNoU3RhdHVzID0KKyAgICAgICAgICAgICAgICBUUERFQ19VU0FDX0RBU0hfSVBGX0ZMVVNIX09OOworICAgICAgICAgICAgaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5idWlsZFVwQ250ID0gMDsKKyAgICAgICAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uYnVpbGRVcFN0YXR1cyA9IFRQREVDX0JVSUxEX1VQX09GRjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmNvbmZpZ0NoYW5nZWQgPSAwOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKmltcGxpY2l0RXhwbGljaXRDZmdEaWZmID0gMTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgKmltcGxpY2l0RXhwbGljaXRDZmdEaWZmID0gMTsKKyAgICAgIH0KKyAgICAgIC8qIElTTy9JRUMgMjMwMDMtMzoyMDEyL0ZEQU0gMzoyMDE2KEUpIEFubmV4IEYuMjogZXhwbGljaXQgYW5kIGltcGxpY2l0CisgICAgICAgKiBjb25maWcgc2hhbGwgYmUgaWRlbnRpY2FsLiAqLworICAgICAgaWYgKCppbXBsaWNpdEV4cGxpY2l0Q2ZnRGlmZikgeworICAgICAgICBzd2l0Y2ggKGhUcC0+dHJhbnNwb3J0Rm10KSB7CisgICAgICAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgorICAgICAgICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKKyAgICAgICAgICBjYXNlIFRUX01QNF9MT0FTOgorICAgICAgICAgICAgLyogcmVzZXQgZGVjb2RlciB0byBpbml0aWFsIHN0YXRlIHRvIGFjaGlldmUgZGVmaW5pdGUgYmVoYXZpb3IgYWZ0ZXIKKyAgICAgICAgICAgICAqIGVycm9yIGluIGNvbmZpZyAqLworICAgICAgICAgICAgaFRwLT5jYWxsYmFja3MuY2JGcmVlTWVtKGhUcC0+Y2FsbGJhY2tzLmNiRnJlZU1lbURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhUcC0+YXNjW2xheWVyXSk7CisgICAgICAgICAgICBoVHAtPnBhcnNlci5sYXRtLnVzYWNFeHBsaWNpdENmZ0NoYW5nZWQgPSAwOworICAgICAgICAgICAgaFRwLT5wYXJzZXIubGF0bS5hcHBseUFzYyA9IDE7CisgICAgICAgICAgICBlcnIgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgeworICAgIGlmICgoaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5mbHVzaFN0YXR1cyA9PSBUUERFQ19GTFVTSF9PRkYpICYmCisgICAgICAgIChoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmJ1aWxkVXBTdGF0dXMgIT0KKyAgICAgICAgIFRQREVDX1JTVjYwX0JVSUxEX1VQX0lETEVfSU5fQkFORCkpIHsKKyAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uZmx1c2hDbnQgPSAwOworICAgICAgaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5idWlsZFVwQ250ID0gMDsKKyAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uYnVpbGRVcFN0YXR1cyA9IFRQREVDX0JVSUxEX1VQX09GRjsKKyAgICAgIGlmIChoVHAtPmFzYy0+bV9hb3QgPT0gQU9UX1VTQUMpIHsKKyAgICAgICAgaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5mbHVzaFN0YXR1cyA9IFRQREVDX1VTQUNfREFTSF9JUEZfRkxVU0hfT047CisgICAgICB9CisgICAgfQorCisgICAgaWYgKChoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmZsdXNoU3RhdHVzID09CisgICAgICAgICBUUERFQ19SU1Y2MF9EQVNIX0lQRl9BVFNDX0ZMVVNIX09OKSB8fAorICAgICAgICAoaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5mbHVzaFN0YXR1cyA9PQorICAgICAgICAgVFBERUNfVVNBQ19EQVNIX0lQRl9GTFVTSF9PTikpIHsKKyAgICAgIFNDSEFSIGNvdW50ZXIgPSAwOworICAgICAgaWYgKGhUcC0+YXNjLT5tX2FvdCA9PSBBT1RfVVNBQykgeworICAgICAgICBjb3VudGVyID0gVFBERUNfVVNBQ19OVU1fQ09ORklHX0NIQU5HRV9GUkFNRVM7CisgICAgICB9CisgICAgICBpZiAoaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5mbHVzaENudCA+PSBjb3VudGVyKSB7CisgICAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uZmx1c2hDbnQgPSAwOworICAgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmZsdXNoU3RhdHVzID0gVFBERUNfRkxVU0hfT0ZGOworICAgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmZvcmNlQ2ZnQ2hhbmdlID0gMDsKKyAgICAgICAgaWYgKGhUcC0+YXNjLT5tX2FvdCA9PSBBT1RfVVNBQykgeworICAgICAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uYnVpbGRVcENudCA9CisgICAgICAgICAgICAgIFRQREVDX1VTQUNfTlVNX0NPTkZJR19DSEFOR0VfRlJBTUVTIC0gMTsKKyAgICAgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmJ1aWxkVXBTdGF0dXMgPSBUUERFQ19VU0FDX0JVSUxEX1VQX09OOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIEFjdGl2YXRlIGZsdXNoIG1vZGUuIEFmdGVyIHRoYXQgY29udGludWUgd2l0aCBidWlsZCB1cCBtb2RlIGluIGNvcmUgKi8KKyAgICAgIGlmIChoVHAtPmNhbGxiYWNrcy5jYkN0cmxDRkdDaGFuZ2UoaFRwLT5jYWxsYmFja3MuY2JDdHJsQ0ZHQ2hhbmdlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0pICE9IDApIHsKKyAgICAgICAgZXJyID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgfQorCisgICAgICBpZiAoKGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uZmx1c2hTdGF0dXMgPT0KKyAgICAgICAgICAgVFBERUNfUlNWNjBfREFTSF9JUEZfQVRTQ19GTFVTSF9PTikgfHwKKyAgICAgICAgICAoaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5mbHVzaFN0YXR1cyA9PQorICAgICAgICAgICBUUERFQ19VU0FDX0RBU0hfSVBGX0ZMVVNIX09OKSkgeworICAgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmZsdXNoQ250Kys7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGhUcC0+YXNjLT5tX2FvdCA9PSBBT1RfVVNBQykgeworICAgICAgZkNvbmZpZ0ZvdW5kID0gMTsKKworICAgICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICAgICAgKmNvbmZpZ0NoYW5nZWQgPSAwOworICAgICAgICBjb25maWdNb2RlID0gQUNfQ01fREVUX0NGR19DSEFOR0U7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIEZES3B1c2hCYWNrKGhCcywgbmV3Q29uZmlnTGVuZ3RoICogOCAtIEZES2dldFZhbGlkQml0cyhoQnMpKTsKKyAgICAgICAgICAgIGNvbmZpZ01vZGUgPSBBQ19DTV9BTExPQ19NRU07CisgICAgICAgICAgfQorICAgICAgICAgIC8qIGNvbmZpZyB0cmFuc3BvcnQgZGVjb2RlciAqLworICAgICAgICAgIGVyciA9IEF1ZGlvU3BlY2lmaWNDb25maWdfUGFyc2UoCisgICAgICAgICAgICAgICZoVHAtPmFzY1soMSAqIDEpXSwgaEJzLCAwLCAmaFRwLT5jYWxsYmFja3MsIGNvbmZpZ01vZGUsCisgICAgICAgICAgICAgICpjb25maWdDaGFuZ2VkLCBoVHAtPmFzY1tsYXllcl0ubV9hb3QpOworICAgICAgICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgICAgICBoVHAtPmFzY1tsYXllcl0gPSBoVHAtPmFzY1soMSAqIDEpXTsKKyAgICAgICAgICAgIGVyckMgPSBoVHAtPmNhbGxiYWNrcy5jYlVwZGF0ZUNvbmZpZygKKyAgICAgICAgICAgICAgICBoVHAtPmNhbGxiYWNrcy5jYlVwZGF0ZUNvbmZpZ0RhdGEsICZoVHAtPmFzY1tsYXllcl0sCisgICAgICAgICAgICAgICAgaFRwLT5hc2NbbGF5ZXJdLmNvbmZpZ01vZGUsICZoVHAtPmFzY1tsYXllcl0uQWFjQ29uZmlnQ2hhbmdlZCk7CisgICAgICAgICAgICBpZiAoZXJyQyAhPSAwKSB7CisgICAgICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgICAgICAgaWYgKChpID09IDApICYmIChoVHAtPmFzY1tsYXllcl0uQWFjQ29uZmlnQ2hhbmdlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVHAtPmFzY1tsYXllcl0uU2JyQ29uZmlnQ2hhbmdlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVHAtPmFzY1tsYXllcl0uU2FjQ29uZmlnQ2hhbmdlZCkpIHsKKyAgICAgICAgICAgICAgKmNvbmZpZ0NoYW5nZWQgPSAxOworICAgICAgICAgICAgICBlcnJDID0gaFRwLT5jYWxsYmFja3MuY2JGcmVlTWVtKGhUcC0+Y2FsbGJhY2tzLmNiRnJlZU1lbURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhUcC0+YXNjW2xheWVyXSk7CisgICAgICAgICAgICAgIGlmIChlcnJDICE9IDApIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBpZiBhbiBlcnJvciBpcyBkZXRlY3RlZCB0ZXJtaW5hdGUgY29uZmlnIHBhcnNpbmcgdG8gYXZvaWQgdGhhdCBhbgorICAgICAgICAgICAqIGludmFsaWQgY29uZmlnIGlzIGFjY2VwdGVkIGluIHRoZSBzZWNvbmQgcGFzcyAqLworICAgICAgICAgIGlmIChlcnIgIT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgYmFpbDoKKyAgICAvKiBzYXZlIG5ldyBjb25maWcgKi8KKyAgICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgaWYgKGhUcC0+YXNjLT5tX2FvdCA9PSBBT1RfVVNBQykgeworICAgICAgICBoVHAtPmFzYy0+bV9zYy5tX3VzYWNDb25maWcuVXNhY0NvbmZpZ0JpdHMgPSBuZXdDb25maWdMZW5ndGggPDwgMzsKKyAgICAgICAgRkRLbWVtY3B5KGhUcC0+YXNjLT5tX3NjLm1fdXNhY0NvbmZpZy5Vc2FjQ29uZmlnLCBuZXdDb25maWcsCisgICAgICAgICAgICAgICAgICBuZXdDb25maWdMZW5ndGgpOworICAgICAgICAvKiBpbiBjYXNlIG9mIFVTQUMgcmVzZXQgdHJhbnNwb3J0RGVjb2RlciB2YXJpYWJsZXMgaGVyZSBiZWNhdXNlCisgICAgICAgICAqIG90aGVyd2lzZSB3aXRob3V0IElQRiB0aGV5IGFyZSBub3QgcmVzZXQgKi8KKyAgICAgICAgaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5mbHVzaENudCA9IDA7CisgICAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uZmx1c2hTdGF0dXMgPSBUUERFQ19GTFVTSF9PRkY7CisgICAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uYnVpbGRVcENudCA9IDA7CisgICAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uYnVpbGRVcFN0YXR1cyA9IFRQREVDX0JVSUxEX1VQX09GRjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPSAwOworCisgICAgICAvKiBJZiBwYXJzaW5nIGVycm9yIHdoaWxlIGNvbmZpZyBmb3VuZCwgY2xlYXIgY3RybENGR0NoYW5nZS1zdHJ1Y3QgKi8KKyAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uZmx1c2hDbnQgPSAwOworICAgICAgaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5mbHVzaFN0YXR1cyA9IFRQREVDX0ZMVVNIX09GRjsKKyAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0uYnVpbGRVcENudCA9IDA7CisgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmJ1aWxkVXBTdGF0dXMgPSBUUERFQ19CVUlMRF9VUF9PRkY7CisgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmNmZ0NoYW5nZWQgPSAwOworICAgICAgaFRwLT5jdHJsQ0ZHQ2hhbmdlW2xheWVyXS5jb250ZW50Q2hhbmdlZCA9IDA7CisgICAgICBoVHAtPmN0cmxDRkdDaGFuZ2VbbGF5ZXJdLmZvcmNlQ2ZnQ2hhbmdlID0gMDsKKworICAgICAgaFRwLT5jYWxsYmFja3MuY2JDdHJsQ0ZHQ2hhbmdlKGhUcC0+Y2FsbGJhY2tzLmNiQ3RybENGR0NoYW5nZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhUcC0+Y3RybENGR0NoYW5nZVtsYXllcl0pOworICAgIH0KKyAgfQorCisgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LICYmIGZDb25maWdGb3VuZCkgeworICAgIGhUcC0+ZmxhZ3MgfD0gVFBERUNfQ09ORklHX0ZPVU5EOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworaW50IHRyYW5zcG9ydERlY19SZWdpc3RlckFzY0NhbGxiYWNrKEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNiVXBkYXRlQ29uZmlnX3QgY2JVcGRhdGVDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKSB7CiAgIGlmIChoVHBEZWMgPT0gTlVMTCkgewogICAgIHJldHVybiAtMTsKICAgfQpAQCAtMjg5LDggKzU3MCwzMCBAQAogICByZXR1cm4gMDsKIH0KIAotaW50IHRyYW5zcG9ydERlY19SZWdpc3RlclNzY0NhbGxiYWNrKCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcERlYywgY29uc3QgY2JTc2NfdCBjYlNzYywgdm9pZCogdXNlcl9kYXRhKQoteworaW50IHRyYW5zcG9ydERlY19SZWdpc3RlckZyZWVNZW1DYWxsYmFjayhIQU5ETEVfVFJBTlNQT1JUREVDIGhUcERlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2JGcmVlTWVtX3QgY2JGcmVlTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpIHsKKyAgaWYgKGhUcERlYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGhUcERlYy0+Y2FsbGJhY2tzLmNiRnJlZU1lbSA9IGNiRnJlZU1lbTsKKyAgaFRwRGVjLT5jYWxsYmFja3MuY2JGcmVlTWVtRGF0YSA9IHVzZXJfZGF0YTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJDdHJsQ0ZHQ2hhbmdlQ2FsbGJhY2soCisgICAgSEFORExFX1RSQU5TUE9SVERFQyBoVHBEZWMsIGNvbnN0IGNiQ3RybENGR0NoYW5nZV90IGNiQ3RybENGR0NoYW5nZSwKKyAgICB2b2lkICp1c2VyX2RhdGEpIHsKKyAgaWYgKGhUcERlYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGhUcERlYy0+Y2FsbGJhY2tzLmNiQ3RybENGR0NoYW5nZSA9IGNiQ3RybENGR0NoYW5nZTsKKyAgaFRwRGVjLT5jYWxsYmFja3MuY2JDdHJsQ0ZHQ2hhbmdlRGF0YSA9IHVzZXJfZGF0YTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJTc2NDYWxsYmFjayhIQU5ETEVfVFJBTlNQT1JUREVDIGhUcERlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYlNzY190IGNiU3NjLCB2b2lkICp1c2VyX2RhdGEpIHsKICAgaWYgKGhUcERlYyA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIC0xOwogICB9CkBAIC0yOTksOCArNjAyLDggQEAKICAgcmV0dXJuIDA7CiB9CiAKLWludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJTYnJDYWxsYmFjayggSEFORExFX1RSQU5TUE9SVERFQyBoVHBEZWMsIGNvbnN0IGNiU2JyX3QgY2JTYnIsIHZvaWQqIHVzZXJfZGF0YSkKLXsKK2ludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJTYnJDYWxsYmFjayhIQU5ETEVfVFJBTlNQT1JUREVDIGhUcERlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYlNicl90IGNiU2JyLCB2b2lkICp1c2VyX2RhdGEpIHsKICAgaWYgKGhUcERlYyA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIC0xOwogICB9CkBAIC0zMDksNjUgKzYxMiw4NiBAQAogICByZXR1cm4gMDsKIH0KIAotVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19GaWxsRGF0YSgKLSAgICAgICAgY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyAgaFRwLAotICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICpwQnVmZmVyLAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICBidWZmZXJTaXplLAotICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICpwQnl0ZXNWYWxpZCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgbGF5ZXIgKQotewotICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnM7CitpbnQgdHJhbnNwb3J0RGVjX1JlZ2lzdGVyVXNhY0NhbGxiYWNrKEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYlVzYWNfdCBjYlVzYWMsIHZvaWQgKnVzZXJfZGF0YSkgeworICBpZiAoaFRwRGVjID09IE5VTEwpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaFRwRGVjLT5jYWxsYmFja3MuY2JVc2FjID0gY2JVc2FjOworICBoVHBEZWMtPmNhbGxiYWNrcy5jYlVzYWNEYXRhID0gdXNlcl9kYXRhOworICByZXR1cm4gMDsKK30KIAotICBpZiAoIChoVHAgPT0gTlVMTCkKLSAgICB8fCAobGF5ZXIgPj0gMikgKSB7Ci0gICAgcmV0dXJuIFRSQU5TUE9SVERFQ19JTlZBTElEX1BBUkFNRVRFUjsKK2ludCB0cmFuc3BvcnREZWNfUmVnaXN0ZXJVbmlEcmNDb25maWdDYWxsYmFjayhIQU5ETEVfVFJBTlNQT1JUREVDIGhUcERlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYlVuaURyY190IGNiVW5pRHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpwTG91ZG5lc3NJbmZvU2V0UG9zaXRpb24pIHsKKyAgaWYgKGhUcERlYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOwogICB9CiAKLSAgaWYgKCpwQnl0ZXNWYWxpZCA9PSAwKSB7Ci0gICAgLyogbm90aGluZyB0byBkbyAqLwotICAgIHJldHVybiBUUkFOU1BPUlRERUNfT0s7CisgIGhUcERlYy0+Y2FsbGJhY2tzLmNiVW5pRHJjID0gY2JVbmlEcmM7CisgIGhUcERlYy0+Y2FsbGJhY2tzLmNiVW5pRHJjRGF0YSA9IHVzZXJfZGF0YTsKKworICBoVHBEZWMtPnBMb3VkbmVzc0luZm9TZXRQb3NpdGlvbiA9IHBMb3VkbmVzc0luZm9TZXRQb3NpdGlvbjsKKyAgcmV0dXJuIDA7Cit9CisKK1RSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfRmlsbERhdGEoY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwQnVmZmVyLCBjb25zdCBVSU5UIGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKnBCeXRlc1ZhbGlkLCBjb25zdCBJTlQgbGF5ZXIpIHsKKyAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzOworCisgIGlmICgoaFRwID09IE5VTEwpIHx8IChsYXllciA+PSAxKSkgeworICAgIHJldHVybiBUUkFOU1BPUlRERUNfSU5WQUxJRF9QQVJBTUVURVI7CiAgIH0KIAogICAvKiBzZXQgYml0YnVmZmVyIHNob3J0Y3V0ICovCiAgIGhCcyA9ICZoVHAtPmJpdFN0cmVhbVtsYXllcl07CiAKLSAgaWYgKCBUVF9JU19QQUNLRVQoaFRwLT50cmFuc3BvcnRGbXQpICkgeworICBpZiAoVFRfSVNfUEFDS0VUKGhUcC0+dHJhbnNwb3J0Rm10KSkgewogICAgIGlmIChoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA9PSAwKSB7Ci0gICAgLyogRm9yIHBhY2tldCBiYXNlZCB0cmFuc3BvcnQsIHBhc3MgaW5wdXQgYnVmZmVyIHRvIGJpdGJ1ZmZlciB3aXRob3V0IGNvcHlpbmcgdGhlIGRhdGEuCi0gICAgICAgVW5mb3J0dW5hdGVseSB3ZSBkbyBub3Qga25vdyB0aGUgYWN0dWFsIGJ1ZmZlciBzaXplLiBBbmQgdGhlIEZESyBiaXQgYnVmZmVyIGltcGxlbWVudGF0aW9uCi0gICAgICAgbmVlZHMgYSBudW1iZXIgMl54LiBTbyB3ZSBhc3N1bWUgdGhlIG1heGltdW0gb2YgNDggY2hhbm5lbHMgd2l0aCA2MTQ0IGJpdHMgcGVyIGNoYW5uZWwKLSAgICAgICBhbmQgcm91bmQgaXQgdXAgdG8gdGhlIG5leHQgcG93ZXIgb2YgMiA9PiA2NTUzNiBieXRlcyAqLwotICAgIEZES2luaXRCaXRTdHJlYW0oaEJzLCBwQnVmZmVyLCAweDEwMDAwLCAoKnBCeXRlc1ZhbGlkKTw8MywgQlNfUkVBREVSKTsKLSAgICAqcEJ5dGVzVmFsaWQgPSAwOworICAgICAgRkRLcmVzZXRCaXRidWZmZXIoaEJzKTsKKyAgICAgIEZES2ZlZWRCdWZmZXIoaEJzLCBwQnVmZmVyLCBidWZmZXJTaXplLCBwQnl0ZXNWYWxpZCk7CisgICAgICBpZiAoKnBCeXRlc1ZhbGlkICE9IDApIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19UT09fTUFOWV9CSVRTOworICAgICAgfQogICAgIH0KICAgfSBlbHNlIHsKICAgICAvKiAuLi4gZWxzZSBmZWVkIGJpdGJ1ZmZlciB3aXRoIG5ldyBzdHJlYW0gZGF0YSAoYXBwZW5kKS4gKi8KKworICAgIGlmICgqcEJ5dGVzVmFsaWQgPT0gMCkgeworICAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19PSzsKKyAgICB9CisKICAgICBpZiAoaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPD0gMCkgewotICAgICAgRkRLZmVlZEJ1ZmZlciAoaEJzLCBwQnVmZmVyLCBidWZmZXJTaXplLCBwQnl0ZXNWYWxpZCkgOworICAgICAgRkRLZmVlZEJ1ZmZlcihoQnMsIHBCdWZmZXIsIGJ1ZmZlclNpemUsIHBCeXRlc1ZhbGlkKTsKICAgICB9CiAgIH0KIAogICByZXR1cm4gVFJBTlNQT1JUREVDX09LOwogfQogCi1IQU5ETEVfRkRLX0JJVFNUUkVBTSB0cmFuc3BvcnREZWNfR2V0Qml0c3RyZWFtKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwgY29uc3QgVUlOVCBsYXllciApCi17CitIQU5ETEVfRkRLX0JJVFNUUkVBTSB0cmFuc3BvcnREZWNfR2V0Qml0c3RyZWFtKGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxheWVyKSB7CiAgIHJldHVybiAmaFRwLT5iaXRTdHJlYW1bbGF5ZXJdOwogfQogCi1UUkFOU1BPUlRfVFlQRSB0cmFuc3BvcnREZWNfR2V0Rm9ybWF0KCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCApCi17CitUUkFOU1BPUlRfVFlQRSB0cmFuc3BvcnREZWNfR2V0Rm9ybWF0KGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwKSB7CiAgIHJldHVybiBoVHAtPnRyYW5zcG9ydEZtdDsKIH0KIAotSU5UIHRyYW5zcG9ydERlY19HZXRCdWZmZXJGdWxsbmVzcyggY29uc3QgSEFORExFX1RSQU5TUE9SVERFQyBoVHAgKQoteworSU5UIHRyYW5zcG9ydERlY19HZXRCdWZmZXJGdWxsbmVzcyhjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCkgewogICBJTlQgYnVmZmVyRnVsbG5lc3MgPSAtMTsKIAogICBzd2l0Y2ggKGhUcC0+dHJhbnNwb3J0Rm10KSB7CiAgICAgY2FzZSBUVF9NUDRfQURUUzoKICAgICAgIGlmIChoVHAtPnBhcnNlci5hZHRzLmJzLmFkdHNfZnVsbG5lc3MgIT0gMHg3ZmYpIHsKLSAgICAgICAgYnVmZmVyRnVsbG5lc3MgPSBoVHAtPnBhcnNlci5hZHRzLmJzLmZyYW1lX2xlbmd0aCo4ICsgaFRwLT5wYXJzZXIuYWR0cy5icy5hZHRzX2Z1bGxuZXNzICogMzIgKiBnZXROdW1iZXJPZkVmZmVjdGl2ZUNoYW5uZWxzKGhUcC0+cGFyc2VyLmFkdHMuYnMuY2hhbm5lbF9jb25maWcpOworICAgICAgICBidWZmZXJGdWxsbmVzcyA9IGhUcC0+cGFyc2VyLmFkdHMuYnMuZnJhbWVfbGVuZ3RoICogOCArCisgICAgICAgICAgICAgICAgICAgICAgICAgaFRwLT5wYXJzZXIuYWR0cy5icy5hZHRzX2Z1bGxuZXNzICogMzIgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROdW1iZXJPZkVmZmVjdGl2ZUNoYW5uZWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRwLT5wYXJzZXIuYWR0cy5icy5jaGFubmVsX2NvbmZpZyk7CiAgICAgICB9CiAgICAgICBicmVhazsKICAgICBjYXNlIFRUX01QNF9MT0FTOgpAQCAtMzg5LDMxICs3MTMsMzcgQEAKICAqIFxwYXJhbSBoVHAgdHJhbnNwb3J0IGRlY29kZXIgaGFuZGxlLgogICogXHJldHVybiBlcnJvciBjb2RlLgogICovCi1zdGF0aWMKLVRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfQWRqdXN0RW5kT2ZBY2Nlc3NVbml0KEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwKQoteworc3RhdGljIFRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfQWRqdXN0RW5kT2ZBY2Nlc3NVbml0KAorICAgIEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwKSB7CiAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcyA9ICZoVHAtPmJpdFN0cmVhbVswXTsKICAgVFJBTlNQT1JUREVDX0VSUk9SIGVyciA9IFRSQU5TUE9SVERFQ19PSzsKIAogICBzd2l0Y2ggKGhUcC0+dHJhbnNwb3J0Rm10KSB7CisgICAgY2FzZSBUVF9NUDRfQURJRjoKKyAgICAgIC8qIERvIGJ5dGUgYWxpZ24gYXQgdGhlIGVuZCBvZiByYXdfZGF0YV9ibG9jaygpIGJlY2F1c2UgVXNhY0ZyYW1lKCkgaXMgbm90CisgICAgICAgKiBieXRlIGFsaWduZWQuICovCisgICAgICBGREtieXRlQWxpZ24oaEJzLCBoVHAtPmFjY2Vzc1VuaXRBbmNob3JbMF0pOworICAgICAgYnJlYWs7CiAgICAgY2FzZSBUVF9NUDRfTE9BUzoKICAgICBjYXNlIFRUX01QNF9MQVRNX01DUDA6CiAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AxOgotICAgICAgaWYgKCBoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA9PSAwICkKLSAgICAgIHsKKyAgICAgIGlmIChoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA9PSAwKSB7CiAgICAgICAgIC8qIERvIGJ5dGUgYWxpZ24gYXQgdGhlIGVuZCBvZiBBdWRpb011eEVsZW1lbnQuICovCiAgICAgICAgIEZES2J5dGVBbGlnbihoQnMsIGhUcC0+Z2xvYmFsRnJhbWVQb3MpOwogCiAgICAgICAgIC8qIENoZWNrIGdsb2JhbCBmcmFtZSBsZW5ndGggKi8KLSAgICAgICAgaWYgKGhUcC0+dHJhbnNwb3J0Rm10ID09IFRUX01QNF9MT0FTICYmIGhUcC0+cGFyc2VyLmxhdG0ubV9hdWRpb011eExlbmd0aEJ5dGVzID4gMCkKLSAgICAgICAgeworICAgICAgICBpZiAoaFRwLT50cmFuc3BvcnRGbXQgPT0gVFRfTVA0X0xPQVMgJiYKKyAgICAgICAgICAgIGhUcC0+cGFyc2VyLmxhdG0ubV9hdWRpb011eExlbmd0aEJ5dGVzID4gMCkgewogICAgICAgICAgIGludCBsb2FzT2Zmc2V0OwogCi0gICAgICAgICAgbG9hc09mZnNldCA9IChoVHAtPnBhcnNlci5sYXRtLm1fYXVkaW9NdXhMZW5ndGhCeXRlcyo4ICsgRkRLZ2V0VmFsaWRCaXRzKGhCcykpIC0gaFRwLT5nbG9iYWxGcmFtZVBvczsKKyAgICAgICAgICBsb2FzT2Zmc2V0ID0gKGhUcC0+cGFyc2VyLmxhdG0ubV9hdWRpb011eExlbmd0aEJ5dGVzICogOCArCisgICAgICAgICAgICAgICAgICAgICAgICBGREtnZXRWYWxpZEJpdHMoaEJzKSkgLQorICAgICAgICAgICAgICAgICAgICAgICBoVHAtPmdsb2JhbEZyYW1lUG9zOwogICAgICAgICAgIGlmIChsb2FzT2Zmc2V0ICE9IDApIHsKICAgICAgICAgICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGhCcywgbG9hc09mZnNldCk7Ci0gICAgICAgICAgICAvKiBGb3IgRUxEIGFuZCBvdGhlciBwYXlsb2FkcyB0aGVyZSBpcyBhbiB1bmtub3duIGFtb3VudCBvZiBwYWRkaW5nLCBzbyBpZ25vcmUgdW5yZWFkIGJpdHMsIGJ1dAotICAgICAgICAgICAgICAgdGhyb3cgYW4gZXJyb3Igb25seSBpZiB0b28gbWFueSBiaXRzIHdoZXJlIHJlYWQuICovCisgICAgICAgICAgICAvKiBGb3IgRUxEIGFuZCBvdGhlciBwYXlsb2FkcyB0aGVyZSBpcyBhbiB1bmtub3duIGFtb3VudCBvZiBwYWRkaW5nLAorICAgICAgICAgICAgICAgc28gaWdub3JlIHVucmVhZCBiaXRzLCBidXQgdGhyb3cgYW4gZXJyb3Igb25seSBpZiB0b28gbWFueSBiaXRzCisgICAgICAgICAgICAgICB3aGVyZSByZWFkLiAqLwogICAgICAgICAgICAgaWYgKGxvYXNPZmZzZXQgPCAwKSB7CiAgICAgICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKICAgICAgICAgICAgIH0KQEAgLTQyMywyOCArNzUzLDM0IEBACiAgICAgICBicmVhazsKIAogICAgIGNhc2UgVFRfTVA0X0FEVFM6Ci0gICAgICBpZiAoaFRwLT5wYXJzZXIuYWR0cy5icy5wcm90ZWN0aW9uX2Fic2VudCA9PSAwKQotICAgICAgeworICAgICAgaWYgKGhUcC0+cGFyc2VyLmFkdHMuYnMucHJvdGVjdGlvbl9hYnNlbnQgPT0gMCkgewogICAgICAgICBpbnQgb2Zmc2V0OwogCiAgICAgICAgIC8qIENhbGN1bGF0ZSBvZmZzZXQgdG8gZW5kIG9mIEFVICovCi0gICAgICAgIG9mZnNldCAgPSBoVHAtPnBhcnNlci5hZHRzLnJhd0RhdGFCbG9ja0Rpc3RbaFRwLT5wYXJzZXIuYWR0cy5icy5udW1fcmF3X2Jsb2Nrcy1oVHAtPm51bWJlck9mUmF3RGF0YUJsb2Nrc108PDM7Ci0gICAgICAgIC8qIENBVVRJT046IFRoZSBQQ0UgKGlmIGF2YWlsYWJsZSkgaXMgZGVjbGFyZWQgdG8gYmUgYSBwYXJ0IG9mIHRoZSBoZWFkZXIhICovCi0gICAgICAgIG9mZnNldCAtPSBoVHAtPmFjY2Vzc1VuaXRBbmNob3JbMF0gLSBGREtnZXRWYWxpZEJpdHMoaEJzKSArIDE2ICsgaFRwLT5wYXJzZXIuYWR0cy5icy5udW1fcGNlX2JpdHM7CisgICAgICAgIG9mZnNldCA9IGhUcC0+cGFyc2VyLmFkdHMKKyAgICAgICAgICAgICAgICAgICAgIC5yYXdEYXRhQmxvY2tEaXN0W2hUcC0+cGFyc2VyLmFkdHMuYnMubnVtX3Jhd19ibG9ja3MgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3NdCisgICAgICAgICAgICAgICAgIDw8IDM7CisgICAgICAgIC8qIENBVVRJT046IFRoZSBQQ0UgKGlmIGF2YWlsYWJsZSkgaXMgZGVjbGFyZWQgdG8gYmUgYSBwYXJ0IG9mIHRoZQorICAgICAgICAgKiBoZWFkZXIhICovCisgICAgICAgIG9mZnNldCAtPSAoSU5UKWhUcC0+YWNjZXNzVW5pdEFuY2hvclswXSAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcykgKworICAgICAgICAgICAgICAgICAgMTYgKyBoVHAtPnBhcnNlci5hZHRzLmJzLm51bV9wY2VfYml0czsKICAgICAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoaEJzLCBvZmZzZXQpOwogICAgICAgfQotICAgICAgaWYgKGhUcC0+cGFyc2VyLmFkdHMuYnMubnVtX3Jhd19ibG9ja3MgPiAwICYmIGhUcC0+cGFyc2VyLmFkdHMuYnMucHJvdGVjdGlvbl9hYnNlbnQgPT0gMCkgewotICAgICAgICAvKiBOb3RlIHRoaXMgQ1JDIHJlYWQgY3VycmVudGx5IGhhcHBlbnMgdHdpY2UgYmVjYXVzZSBvZiB0cmFuc3BvcnREZWNfQ3JjQ2hlY2soKSAqLworICAgICAgaWYgKGhUcC0+cGFyc2VyLmFkdHMuYnMubnVtX3Jhd19ibG9ja3MgPiAwICYmCisgICAgICAgICAgaFRwLT5wYXJzZXIuYWR0cy5icy5wcm90ZWN0aW9uX2Fic2VudCA9PSAwKSB7CisgICAgICAgIC8qIE5vdGUgdGhpcyBDUkMgcmVhZCBjdXJyZW50bHkgaGFwcGVucyB0d2ljZSBiZWNhdXNlIG9mCisgICAgICAgICAqIHRyYW5zcG9ydERlY19DcmNDaGVjaygpICovCiAgICAgICAgIGhUcC0+cGFyc2VyLmFkdHMuY3JjUmVhZFZhbHVlID0gRkRLcmVhZEJpdHMoaEJzLCAxNik7CiAgICAgICB9Ci0gICAgICBpZiAoIGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzID09IDAgKQotICAgICAgeworICAgICAgaWYgKGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzID09IDApIHsKICAgICAgICAgLyogQ2hlY2sgZ2xvYmFsIGZyYW1lIGxlbmd0aCAqLwotICAgICAgICBpZiAoaFRwLT5wYXJzZXIuYWR0cy5icy5wcm90ZWN0aW9uX2Fic2VudCA9PSAwKQotICAgICAgICB7CisgICAgICAgIGlmIChoVHAtPnBhcnNlci5hZHRzLmJzLnByb3RlY3Rpb25fYWJzZW50ID09IDApIHsKICAgICAgICAgICBpbnQgb2Zmc2V0OwogCi0gICAgICAgICAgb2Zmc2V0ID0gKGhUcC0+cGFyc2VyLmFkdHMuYnMuZnJhbWVfbGVuZ3RoKjggLSBBRFRTX1NZTkNMRU5HVEggKyBGREtnZXRWYWxpZEJpdHMoaEJzKSkgLSBoVHAtPmdsb2JhbEZyYW1lUG9zOworICAgICAgICAgIG9mZnNldCA9IChoVHAtPnBhcnNlci5hZHRzLmJzLmZyYW1lX2xlbmd0aCAqIDggLSBBRFRTX1NZTkNMRU5HVEggKworICAgICAgICAgICAgICAgICAgICAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpKSAtCisgICAgICAgICAgICAgICAgICAgKElOVCloVHAtPmdsb2JhbEZyYW1lUG9zOwogICAgICAgICAgIGlmIChvZmZzZXQgIT0gMCkgewogICAgICAgICAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoaEJzLCBvZmZzZXQpOwogICAgICAgICAgIH0KQEAgLTQ1OSw0MSArNzk1LDM5IEBACiAgIHJldHVybiBlcnI7CiB9CiAKLQogLyoqCi0gKiBcYnJpZWYgRGV0ZXJtaW5lIGFkZGl0aW9uYWwgYnVmZmVyIGZ1bGxuZXNzIGNvbnRyYWludCBkdWUgdG8gYnVyc3QgZGF0YSByZWNlcHRpb24uCi0gKiAgICAgICAgVGhlIHBhcmFtZXRlciBUUERFQ19QQVJBTV9CVVJTVFBFUklPRCBtdXN0IGhhdmUgYmVlbiBzZXQgYXMgYSBwcmVjb25kaXRpb24uCisgKiBcYnJpZWYgRGV0ZXJtaW5lIGFkZGl0aW9uYWwgYnVmZmVyIGZ1bGxuZXNzIGNvbnRyYWludCBkdWUgdG8gYnVyc3QgZGF0YQorICogcmVjZXB0aW9uLiBUaGUgcGFyYW1ldGVyIFRQREVDX1BBUkFNX0JVUlNUUEVSSU9EIG11c3QgaGF2ZSBiZWVuIHNldCBhcyBhCisgKiBwcmVjb25kaXRpb24uCiAgKiBccGFyYW0gaFRwIHRyYW5zcG9ydCBkZWNvZGVyIGhhbmRsZS4KLSAqIFxwYXJhbSBidWZmZXJGdWxsbmVzcyB0aGUgYnVmZmVyIGZ1bGxuZXNzIHZhbHVlIG9mIHRoZSBmaXJzdCBmcmFtZSB0byBiZSBkZWNvZGVkLgotICogXHBhcmFtIGJpdHNBdmFpbCB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBiaXRzIGF0IHRoZSBlbmQgb2YgdGhlIGZpcnN0IGZyYW1lIHRvIGJlIGRlY29kZWQuCisgKiBccGFyYW0gYnVmZmVyRnVsbG5lc3MgdGhlIGJ1ZmZlciBmdWxsbmVzcyB2YWx1ZSBvZiB0aGUgZmlyc3QgZnJhbWUgdG8gYmUKKyAqIGRlY29kZWQuCisgKiBccGFyYW0gYml0c0F2YWlsIHRoZSBhbW91bnQgb2YgYXZhaWxhYmxlIGJpdHMgYXQgdGhlIGVuZCBvZiB0aGUgZmlyc3QgZnJhbWUKKyAqIHRvIGJlIGRlY29kZWQuCiAgKiBccmV0dXJuIGVycm9yIGNvZGUKICAqLwotc3RhdGljIAotVFJBTlNQT1JUREVDX0VSUk9SIGFkZGl0aW9uYWxIb2xkT2ZmTmVlZGVkKAotICAgICAgICBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICBidWZmZXJGdWxsbmVzcywKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICBiaXRzQXZhaWwKLSAgICAgICAgKQoteworc3RhdGljIFRSQU5TUE9SVERFQ19FUlJPUiBhZGRpdGlvbmFsSG9sZE9mZk5lZWRlZChIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJ1ZmZlckZ1bGxuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYml0c0F2YWlsKSB7CiAgIElOVCBjaGVja0xlbmd0aEJpdHMsIGF2Z0JpdHNQZXJGcmFtZTsKICAgSU5UIG1heEFVOyAvKiBtYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgcGVyIE1hc3RlciBGcmFtZSAqLwogICBJTlQgc2FtcGxlc1BlckZyYW1lID0gaFRwLT5hc2MtPm1fc2FtcGxlc1BlckZyYW1lOwogICBJTlQgc2FtcGxpbmdGcmVxdWVuY3kgPSAoSU5UKWhUcC0+YXNjLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwogCi0gIGlmICggKGhUcC0+YXZnQml0UmF0ZSA9PSAwKSB8fCAoaFRwLT5idXJzdFBlcmlvZCA9PSAwKSApIHsKKyAgaWYgKChoVHAtPmF2Z0JpdFJhdGUgPT0gMCkgfHwgKGhUcC0+YnVyc3RQZXJpb2QgPT0gMCkpIHsKICAgICByZXR1cm4gVFJBTlNQT1JUREVDX09LOwogICB9Ci0gIGlmICggKHNhbXBsZXNQZXJGcmFtZSA9PSAwICkgfHwgKHNhbXBsaW5nRnJlcXVlbmN5ID09IDApICkgeworICBpZiAoKHNhbXBsZXNQZXJGcmFtZSA9PSAwKSB8fCAoc2FtcGxpbmdGcmVxdWVuY3kgPT0gMCkpIHsKICAgICByZXR1cm4gVFJBTlNQT1JUREVDX05PVF9FTk9VR0hfQklUUzsKICAgfQogCiAgIC8qIE9uZSBNYXN0ZXIgRnJhbWUgaXMgc2VudCBldmVyeSBoVHAtPmJ1cnN0UGVyaW9kIG1zICovCi0gIG1heEFVID0gaFRwLT5idXJzdFBlcmlvZCAqIHNhbXBsaW5nRnJlcXVlbmN5ICsgKHNhbXBsZXNQZXJGcmFtZSoxMDAwIC0gMSk7Ci0gIG1heEFVID0gbWF4QVUgLyAoc2FtcGxlc1BlckZyYW1lKjEwMDApOworICBtYXhBVSA9IGhUcC0+YnVyc3RQZXJpb2QgKiBzYW1wbGluZ0ZyZXF1ZW5jeSArIChzYW1wbGVzUGVyRnJhbWUgKiAxMDAwIC0gMSk7CisgIG1heEFVID0gbWF4QVUgLyAoc2FtcGxlc1BlckZyYW1lICogMTAwMCk7CiAgIC8qIFN1YnRyYWN0IG51bWJlciBvZiBmcmFtZXMgd2hpY2ggd2VyZSBhbHJlYWR5IGhlbGQgb2ZmLiAqLwogICBtYXhBVSAtPSBoVHAtPmhvbGRPZmZGcmFtZXM7CiAKLSAgYXZnQml0c1BlckZyYW1lID0gaFRwLT5hdmdCaXRSYXRlICogc2FtcGxlc1BlckZyYW1lICsgKHNhbXBsaW5nRnJlcXVlbmN5LTEpOworICBhdmdCaXRzUGVyRnJhbWUgPSBoVHAtPmF2Z0JpdFJhdGUgKiBzYW1wbGVzUGVyRnJhbWUgKyAoc2FtcGxpbmdGcmVxdWVuY3kgLSAxKTsKICAgYXZnQml0c1BlckZyYW1lID0gYXZnQml0c1BlckZyYW1lIC8gc2FtcGxpbmdGcmVxdWVuY3k7CiAKICAgLyogQ29uc2lkZXIgd29yc3QgY2FzZSBvZiBidWZmZXJGdWxsbmVzcyBxdWFudGl6YXRpb24uICovCkBAIC01MDUsNDEgKzgzOSwzNSBAQAogICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKICAgICAgIGJ1ZmZlckZ1bGxuZXNzICs9IDMxOwogICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IC8qIGFkZGVkIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyAgICAgIGJyZWFrOyAvKiBhZGRlZCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nICovCiAgIH0KIAotICBjaGVja0xlbmd0aEJpdHMgPSBidWZmZXJGdWxsbmVzcyArIChtYXhBVS0xKSphdmdCaXRzUGVyRnJhbWU7CisgIGNoZWNrTGVuZ3RoQml0cyA9IGJ1ZmZlckZ1bGxuZXNzICsgKG1heEFVIC0gMSkgKiBhdmdCaXRzUGVyRnJhbWU7CiAKICAgLyogQ2hlY2sgaWYgYnVmZmVyIGlzIGJpZyBlbm91Z2ggdG8gZnVsbGZpbGwgYnVmZmVyIGZ1bGxuZXNzIGNvbmRpdGlvbiAqLwotICBpZiAoIChjaGVja0xlbmd0aEJpdHMgLyoraGVhZGVyQml0cyovKSA+ICgoVFJBTlNQT1JUREVDX0lOQlVGX1NJWkU8PDMpLTcpICkgeworICBpZiAoKGNoZWNrTGVuZ3RoQml0cyAvKitoZWFkZXJCaXRzKi8pID4gKCgoODE5MiAqIDQpIDw8IDMpIC0gNykpIHsKICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1NZTkNfRVJST1I7CiAgIH0KIAotICBpZiAoIGJpdHNBdmFpbCA8IGNoZWNrTGVuZ3RoQml0cyApIHsKKyAgaWYgKGJpdHNBdmFpbCA8IGNoZWNrTGVuZ3RoQml0cykgewogICAgIHJldHVybiBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIHJldHVybiBUUkFOU1BPUlRERUNfT0s7CiAgIH0KIH0KIAogc3RhdGljIFRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfcmVhZEhlYWRlcigKLSAgICAgICAgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgaW50IHN5bmNMZW5ndGgsCi0gICAgICAgIGludCBpZ25vcmVCdWZmZXJGdWxsbmVzcywKLSAgICAgICAgaW50ICpwUmF3RGF0YUJsb2NrTGVuZ3RoLAotICAgICAgICBpbnQgKnBmVHJhdmVyc2VNb3JlRnJhbWVzLAotICAgICAgICBpbnQgKnBTeW5jTGF5ZXJGcmFtZUJpdHMsCi0gICAgICAgIGludCAqcGZDb25maWdGb3VuZCwKLSAgICAgICAgaW50ICpwSGVhZGVyQml0cwotICAgICAgICApCi17CisgICAgSEFORExFX1RSQU5TUE9SVERFQyBoVHAsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgaW50IHN5bmNMZW5ndGgsCisgICAgaW50IGlnbm9yZUJ1ZmZlckZ1bGxuZXNzLCBpbnQgKnBSYXdEYXRhQmxvY2tMZW5ndGgsCisgICAgaW50ICpwZlRyYXZlcnNlTW9yZUZyYW1lcywgaW50ICpwU3luY0xheWVyRnJhbWVCaXRzLCBpbnQgKnBmQ29uZmlnRm91bmQsCisgICAgaW50ICpwSGVhZGVyQml0cykgewogICBUUkFOU1BPUlRERUNfRVJST1IgZXJyID0gVFJBTlNQT1JUREVDX09LOwogICBpbnQgcmF3RGF0YUJsb2NrTGVuZ3RoID0gKnBSYXdEYXRhQmxvY2tMZW5ndGg7Ci0gIGludCBmVHJhdmVyc2VNb3JlRnJhbWVzID0gKHBmVHJhdmVyc2VNb3JlRnJhbWVzICE9IE5VTEwpID8gKnBmVHJhdmVyc2VNb3JlRnJhbWVzIDogMDsKLSAgaW50IHN5bmNMYXllckZyYW1lQml0cyA9IChwU3luY0xheWVyRnJhbWVCaXRzICE9IE5VTEwpID8gKnBTeW5jTGF5ZXJGcmFtZUJpdHMgOiAwOworICBpbnQgZlRyYXZlcnNlTW9yZUZyYW1lcyA9CisgICAgICAocGZUcmF2ZXJzZU1vcmVGcmFtZXMgIT0gTlVMTCkgPyAqcGZUcmF2ZXJzZU1vcmVGcmFtZXMgOiAwOworICBpbnQgc3luY0xheWVyRnJhbWVCaXRzID0KKyAgICAgIChwU3luY0xheWVyRnJhbWVCaXRzICE9IE5VTEwpID8gKnBTeW5jTGF5ZXJGcmFtZUJpdHMgOiAwOwogICBpbnQgZkNvbmZpZ0ZvdW5kID0gKHBmQ29uZmlnRm91bmQgIT0gTlVMTCkgPyAqcGZDb25maWdGb3VuZCA6IDA7CiAgIGludCBzdGFydFBvczsKIApAQCAtNTQ3LDQ2ICs4NzUsNzQgQEAKIAogICBzd2l0Y2ggKGhUcC0+dHJhbnNwb3J0Rm10KSB7CiAgICAgY2FzZSBUVF9NUDRfQURUUzoKLSAgICAgIGlmIChoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA8PSAwKQotICAgICAgewotICAgICAgICBpbnQgZXJyQzsKKyAgICAgIGlmIChoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA8PSAwKSB7CisgICAgICAgIGludCBpLCBlcnJDOwogCiAgICAgICAgIGhUcC0+Z2xvYmFsRnJhbWVQb3MgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKIAotICAgICAgICAvKiBQYXJzZSBBRFRTIGhlYWRlciAqLwotICAgICAgICBlcnIgPSBhZHRzUmVhZF9EZWNvZGVIZWFkZXIoICZoVHAtPnBhcnNlci5hZHRzLCAmaFRwLT5hc2NbMF0sIGhCcywgaWdub3JlQnVmZmVyRnVsbG5lc3MgKTsKLSAgICAgICAgaWYgKGVyciAhPSBUUkFOU1BPUlRERUNfT0spIHsKLSAgICAgICAgICBpZiAoZXJyICE9IFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFMpIHsKLSAgICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SOworICAgICAgICBVQ0hBUiBjb25maWdDaGFuZ2VkID0gMDsKKyAgICAgICAgVUNIQVIgY29uZmlnTW9kZSA9IEFDX0NNX0RFVF9DRkdfQ0hBTkdFOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIEZES3B1c2hCYWNrKGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgIChJTlQpaFRwLT5nbG9iYWxGcmFtZVBvcyAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcykpOworICAgICAgICAgICAgY29uZmlnTW9kZSA9IEFDX0NNX0FMTE9DX01FTTsKICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZXJyQyA9IGhUcC0+Y2FsbGJhY2tzLmNiVXBkYXRlQ29uZmlnKGhUcC0+Y2FsbGJhY2tzLmNiVXBkYXRlQ29uZmlnRGF0YSwgJmhUcC0+YXNjWzBdKTsKLSAgICAgICAgICBpZiAoZXJyQyAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoZXJyQyA9PSBUUkFOU1BPUlRERUNfTkVFRF9UT19SRVNUQVJUKSB7Ci0gICAgICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19ORUVEX1RPX1JFU1RBUlQ7Ci0gICAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAvKiBQYXJzZSBBRFRTIGhlYWRlciAqLworICAgICAgICAgIGVyciA9IGFkdHNSZWFkX0RlY29kZUhlYWRlcigmaFRwLT5wYXJzZXIuYWR0cywgJmhUcC0+YXNjWzBdLCBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZUJ1ZmZlckZ1bGxuZXNzKTsKKyAgICAgICAgICBpZiAoZXJyICE9IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgICAgICAgaWYgKGVyciAhPSBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTKSB7CiAgICAgICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmQ29uZmlnRm91bmQgPSAxOwotICAgICAgICAgICAgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPSBoVHAtPnBhcnNlci5hZHRzLmJzLm51bV9yYXdfYmxvY2tzKzE7CisgICAgICAgICAgICBlcnJDID0gaFRwLT5jYWxsYmFja3MuY2JVcGRhdGVDb25maWcoCisgICAgICAgICAgICAgICAgaFRwLT5jYWxsYmFja3MuY2JVcGRhdGVDb25maWdEYXRhLCAmaFRwLT5hc2NbMF0sIGNvbmZpZ01vZGUsCisgICAgICAgICAgICAgICAgJmNvbmZpZ0NoYW5nZWQpOworICAgICAgICAgICAgaWYgKGVyckMgIT0gMCkgeworICAgICAgICAgICAgICBpZiAoZXJyQyA9PSBUUkFOU1BPUlRERUNfTkVFRF9UT19SRVNUQVJUKSB7CisgICAgICAgICAgICAgICAgZXJyID0gVFJBTlNQT1JUREVDX05FRURfVE9fUkVTVEFSVDsKKyAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyID0gVFJBTlNQT1JUREVDX1NZTkNfRVJST1I7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGZDb25maWdGb3VuZCA9IDE7CisgICAgICAgICAgICAgIGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzID0KKyAgICAgICAgICAgICAgICAgIGhUcC0+cGFyc2VyLmFkdHMuYnMubnVtX3Jhd19ibG9ja3MgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgICAgICBpZiAoKGkgPT0gMCkgJiYgY29uZmlnQ2hhbmdlZCkgeworICAgICAgICAgICAgICBlcnJDID0gaFRwLT5jYWxsYmFja3MuY2JGcmVlTWVtKGhUcC0+Y2FsbGJhY2tzLmNiRnJlZU1lbURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhUcC0+YXNjWzBdKTsKKyAgICAgICAgICAgICAgaWYgKGVyckMgIT0gMCkgeworICAgICAgICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIC8qIFJlc2V0IENSQyBiZWNhdXNlIHRoZSBuZXh0IGJpdHMgYXJlIHRoZSBiZWdpbm5pbmcgb2YgYSByYXdfZGF0YV9ibG9jaygpICovCisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBSZXNldCBDUkMgYmVjYXVzZSB0aGUgbmV4dCBiaXRzIGFyZSB0aGUgYmVnaW5uaW5nIG9mIGEKKyAgICAgICAgICogcmF3X2RhdGFfYmxvY2soKSAqLwogICAgICAgICBGREtjcmNSZXNldCgmaFRwLT5wYXJzZXIuYWR0cy5jcmNJbmZvKTsKICAgICAgICAgaFRwLT5wYXJzZXIuYWR0cy5icy5udW1fcGNlX2JpdHMgPSAwOwogICAgICAgfQogICAgICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfT0spIHsKICAgICAgICAgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MtLTsKLSAgICAgICAgcmF3RGF0YUJsb2NrTGVuZ3RoID0gYWR0c1JlYWRfR2V0UmF3RGF0YUJsb2NrTGVuZ3RoKCZoVHAtPnBhcnNlci5hZHRzLCAoaFRwLT5wYXJzZXIuYWR0cy5icy5udW1fcmF3X2Jsb2Nrcy1oVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcykpOworICAgICAgICByYXdEYXRhQmxvY2tMZW5ndGggPSBhZHRzUmVhZF9HZXRSYXdEYXRhQmxvY2tMZW5ndGgoCisgICAgICAgICAgICAmaFRwLT5wYXJzZXIuYWR0cywKKyAgICAgICAgICAgIChoVHAtPnBhcnNlci5hZHRzLmJzLm51bV9yYXdfYmxvY2tzIC0gaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MpKTsKICAgICAgICAgaWYgKHJhd0RhdGFCbG9ja0xlbmd0aCA8PSAwKSB7CiAgICAgICAgICAgLyogTm8gZnVydGhlciBmcmFtZSB0cmF2ZXJzYWwgcG9zc2libGUuICovCiAgICAgICAgICAgZlRyYXZlcnNlTW9yZUZyYW1lcyA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgc3luY0xheWVyRnJhbWVCaXRzID0gKGhUcC0+cGFyc2VyLmFkdHMuYnMuZnJhbWVfbGVuZ3RoPDwzKSAtIChzdGFydFBvcyAtIEZES2dldFZhbGlkQml0cyhoQnMpKSAtIHN5bmNMZW5ndGg7CisgICAgICAgIHN5bmNMYXllckZyYW1lQml0cyA9IChoVHAtPnBhcnNlci5hZHRzLmJzLmZyYW1lX2xlbmd0aCA8PCAzKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSU5UKXN0YXJ0UG9zIC0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jTGVuZ3RoOwogICAgICAgICBpZiAoc3luY0xheWVyRnJhbWVCaXRzIDw9IDApIHsKICAgICAgICAgICBlcnIgPSBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUjsKICAgICAgICAgfQpAQCAtNTk1LDM1ICs5NTEsMzAgQEAKICAgICAgIH0KICAgICAgIGJyZWFrOwogICAgIGNhc2UgVFRfTVA0X0xPQVM6Ci0gICAgICBpZiAoaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPD0gMCkKLSAgICAgIHsKKyAgICAgIGlmIChoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA8PSAwKSB7CiAgICAgICAgIHN5bmNMYXllckZyYW1lQml0cyA9IEZES3JlYWRCaXRzKGhCcywgMTMpOwogICAgICAgICBoVHAtPnBhcnNlci5sYXRtLm1fYXVkaW9NdXhMZW5ndGhCeXRlcyA9IHN5bmNMYXllckZyYW1lQml0czsKICAgICAgICAgc3luY0xheWVyRnJhbWVCaXRzIDw8PSAzOwogICAgICAgfQogICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKICAgICBjYXNlIFRUX01QNF9MQVRNX01DUDA6Ci0gICAgICBpZiAoaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPD0gMCkKLSAgICAgIHsKKyAgICAgIGlmIChoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA8PSAwKSB7CiAgICAgICAgIGhUcC0+Z2xvYmFsRnJhbWVQb3MgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKIAotICAgICAgICBlcnIgPSBDTGF0bURlbXV4X1JlYWQoCi0gICAgICAgICAgICAgICAgaEJzLAotICAgICAgICAgICAgICAgJmhUcC0+cGFyc2VyLmxhdG0sCi0gICAgICAgICAgICAgICAgaFRwLT50cmFuc3BvcnRGbXQsCi0gICAgICAgICAgICAgICAmaFRwLT5jYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgaFRwLT5hc2MsCi0gICAgICAgICAgICAgICAmZkNvbmZpZ0ZvdW5kLAotICAgICAgICAgICAgICAgIGlnbm9yZUJ1ZmZlckZ1bGxuZXNzKTsKKyAgICAgICAgZXJyID0gQ0xhdG1EZW11eF9SZWFkKGhCcywgJmhUcC0+cGFyc2VyLmxhdG0sIGhUcC0+dHJhbnNwb3J0Rm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhUcC0+Y2FsbGJhY2tzLCBoVHAtPmFzYywgJmZDb25maWdGb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZUJ1ZmZlckZ1bGxuZXNzKTsKIAogICAgICAgICBpZiAoZXJyICE9IFRSQU5TUE9SVERFQ19PSykgewotICAgICAgICAgIGlmIChlcnIgIT0gVFJBTlNQT1JUREVDX05PVF9FTk9VR0hfQklUUykgeworICAgICAgICAgIGlmICgoZXJyICE9IFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFMpICYmCisgICAgICAgICAgICAgICFUUERFQ19JU19GQVRBTF9FUlJPUihlcnIpKSB7CiAgICAgICAgICAgICBlcnIgPSBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUjsKICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPSBDTGF0bURlbXV4X0dldE5yT2ZTdWJGcmFtZXMoJmhUcC0+cGFyc2VyLmxhdG0pOworICAgICAgICAgIGhUcC0+bnVtYmVyT2ZSYXdEYXRhQmxvY2tzID0KKyAgICAgICAgICAgICAgQ0xhdG1EZW11eF9HZXROck9mU3ViRnJhbWVzKCZoVHAtPnBhcnNlci5sYXRtKTsKICAgICAgICAgICBpZiAoaFRwLT50cmFuc3BvcnRGbXQgPT0gVFRfTVA0X0xPQVMpIHsKLSAgICAgICAgICAgIHN5bmNMYXllckZyYW1lQml0cyAtPSBzdGFydFBvcyAtIEZES2dldFZhbGlkQml0cyhoQnMpIC0gKDEzKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIHN5bmNMYXllckZyYW1lQml0cyAtPSBzdGFydFBvcyAtIEZES2dldFZhbGlkQml0cyhoQnMpIC0gKDEzKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7CkBAIC02MzMsMTcgKzk4NCwyMCBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19PSykgewotICAgICAgICByYXdEYXRhQmxvY2tMZW5ndGggPSBDTGF0bURlbXV4X0dldEZyYW1lTGVuZ3RoSW5CaXRzKCZoVHAtPnBhcnNlci5sYXRtKTsKKyAgICAgICAgaW50IGxheWVyOworICAgICAgICByYXdEYXRhQmxvY2tMZW5ndGggPSAwOworICAgICAgICBmb3IgKGxheWVyID0gMDsKKyAgICAgICAgICAgICBsYXllciA8IChpbnQpQ0xhdG1EZW11eF9HZXROck9mTGF5ZXJzKCZoVHAtPnBhcnNlci5sYXRtLCAwKTsKKyAgICAgICAgICAgICBsYXllciArPSAxKSB7CisgICAgICAgICAgcmF3RGF0YUJsb2NrTGVuZ3RoICs9CisgICAgICAgICAgICAgIENMYXRtRGVtdXhfR2V0RnJhbWVMZW5ndGhJbkJpdHMoJmhUcC0+cGFyc2VyLmxhdG0sIDAsIGxheWVyKTsKKyAgICAgICAgfQogICAgICAgICBoVHAtPm51bWJlck9mUmF3RGF0YUJsb2Nrcy0tOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPSAwOwogICAgICAgfQogICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHsKLSAgICAgICAgc3luY0xheWVyRnJhbWVCaXRzID0gMDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IHsgc3luY0xheWVyRnJhbWVCaXRzID0gMDsgfSBicmVhazsKICAgfQogCiBiYWlsOgpAQCAtNjUzLDYgKzEwMDcsMjQgQEAKICAgaWYgKHBIZWFkZXJCaXRzICE9IE5VTEwpIHsKICAgICAqcEhlYWRlckJpdHMgKz0gc3RhcnRQb3MgLSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpOwogICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAoMSAqIDEpOyBpKyspIHsKKyAgICAvKiBJZiBwYXJzaW5nIGVycm9yIHdoaWxlIGNvbmZpZyBmb3VuZCwgY2xlYXIgY3RybENGR0NoYW5nZS1zdHJ1Y3QgKi8KKyAgICBpZiAoaFRwLT5jdHJsQ0ZHQ2hhbmdlW2ldLmNmZ0NoYW5nZWQgJiYgZXJyICE9IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPSAwOworICAgICAgaFRwLT5jdHJsQ0ZHQ2hhbmdlW2ldLmZsdXNoQ250ID0gMDsKKyAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtpXS5mbHVzaFN0YXR1cyA9IFRQREVDX0ZMVVNIX09GRjsKKyAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtpXS5idWlsZFVwQ250ID0gMDsKKyAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtpXS5idWlsZFVwU3RhdHVzID0gVFBERUNfQlVJTERfVVBfT0ZGOworICAgICAgaFRwLT5jdHJsQ0ZHQ2hhbmdlW2ldLmNmZ0NoYW5nZWQgPSAwOworICAgICAgaFRwLT5jdHJsQ0ZHQ2hhbmdlW2ldLmNvbnRlbnRDaGFuZ2VkID0gMDsKKyAgICAgIGhUcC0+Y3RybENGR0NoYW5nZVtpXS5mb3JjZUNmZ0NoYW5nZSA9IDA7CisKKyAgICAgIGhUcC0+Y2FsbGJhY2tzLmNiQ3RybENGR0NoYW5nZShoVHAtPmNhbGxiYWNrcy5jYkN0cmxDRkdDaGFuZ2VEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoVHAtPmN0cmxDRkdDaGFuZ2VbaV0pOworICAgIH0KKyAgfQorCiAgIGlmIChwZkNvbmZpZ0ZvdW5kICE9IE5VTEwpIHsKICAgICAqcGZDb25maWdGb3VuZCA9IGZDb25maWdGb3VuZDsKICAgfQpAQCAtNjYwLDEyICsxMDMyLDkgQEAKICAgaWYgKHBmVHJhdmVyc2VNb3JlRnJhbWVzICE9IE5VTEwpIHsKICAgICAqcGZUcmF2ZXJzZU1vcmVGcmFtZXMgPSBmVHJhdmVyc2VNb3JlRnJhbWVzOwogICB9Ci0gIGlmICAocFN5bmNMYXllckZyYW1lQml0cyAhPSBOVUxMKSB7CisgIGlmIChwU3luY0xheWVyRnJhbWVCaXRzICE9IE5VTEwpIHsKICAgICAqcFN5bmNMYXllckZyYW1lQml0cyA9IHN5bmNMYXllckZyYW1lQml0czsKICAgfQotICBpZiAocGZDb25maWdGb3VuZCAhPSBOVUxMKSB7Ci0gICAgKnBmQ29uZmlnRm91bmQgPSBmQ29uZmlnRm91bmQ7Ci0gIH0KIAogICByZXR1cm4gZXJyOwogfQpAQCAtNjczLDEyICsxMDQyLDggQEAKIC8qIEhvdyBtYW55IGJpdHMgdG8gYWR2YW5jZSBmb3Igc3luY2hyb25pemF0aW9uIHNlYXJjaC4gKi8KICNkZWZpbmUgVFBERUNfU1lOQ1NLSVAgOAogCi1zdGF0aWMKLVRSQU5TUE9SVERFQ19FUlJPUiBzeW5jaHJvbml6YXRpb24oCi0gICAgICAgIEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgKnBIZWFkZXJCaXRzCi0gICAgICAgICkKLXsKK3N0YXRpYyBUUkFOU1BPUlRERUNfRVJST1Igc3luY2hyb25pemF0aW9uKEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwSGVhZGVyQml0cykgewogICBUUkFOU1BPUlRERUNfRVJST1IgZXJyID0gVFJBTlNQT1JUREVDX09LLCBlcnJGaXJzdEZyYW1lID0gVFJBTlNQT1JUREVDX09LOwogICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSAmaFRwLT5iaXRTdHJlYW1bMF07CiAKQEAgLTY4NiwxNCArMTA1MSwyMCBAQAogICBJTlQgcmF3RGF0YUJsb2NrTGVuZ3RoID0gMCwgcmF3RGF0YUJsb2NrTGVuZ3RoUHJldmlvdXM7CiAgIElOVCB0b3RhbEJpdHM7CiAgIElOVCBoZWFkZXJCaXRzID0gMCwgaGVhZGVyQml0c0ZpcnN0RnJhbWUgPSAwLCBoZWFkZXJCaXRzUHJldmlvdXM7Ci0gIElOVCBudW1GcmFtZXNUcmF2ZXJzZWQgPSAwLCBmVHJhdmVyc2VNb3JlRnJhbWVzLCBmQ29uZmlnRm91bmQgPSAoaFRwLT5mbGFncyAmIFRQREVDX0NPTkZJR19GT1VORCksIHN0YXJ0UG9zRmlyc3RGcmFtZSA9IC0xOwotICBJTlQgbnVtUmF3RGF0YUJsb2Nrc0ZpcnN0RnJhbWUgPSAwLCBudW1SYXdEYXRhQmxvY2tzUHJldmlvdXMsIGdsb2JhbEZyYW1lUG9zRmlyc3RGcmFtZSA9IDAsIHJhd0RhdGFCbG9ja0xlbmd0aEZpcnN0RnJhbWUgPSAwOwotICBJTlQgaWdub3JlQnVmZmVyRnVsbG5lc3MgPSBoVHAtPmZsYWdzICYgKFRQREVDX0xPU1RfRlJBTUVTX1BFTkRJTkd8VFBERUNfSUdOT1JFX0JVRkZFUkZVTExORVNTfFRQREVDX1NZTkNPSyk7CisgIElOVCBudW1GcmFtZXNUcmF2ZXJzZWQgPSAwLCBmVHJhdmVyc2VNb3JlRnJhbWVzLAorICAgICAgZkNvbmZpZ0ZvdW5kID0gKGhUcC0+ZmxhZ3MgJiBUUERFQ19DT05GSUdfRk9VTkQpLCBzdGFydFBvc0ZpcnN0RnJhbWUgPSAtMTsKKyAgSU5UIG51bVJhd0RhdGFCbG9ja3NGaXJzdEZyYW1lID0gMCwgbnVtUmF3RGF0YUJsb2Nrc1ByZXZpb3VzLAorICAgICAgZ2xvYmFsRnJhbWVQb3NGaXJzdEZyYW1lID0gMCwgcmF3RGF0YUJsb2NrTGVuZ3RoRmlyc3RGcmFtZSA9IDA7CisgIElOVCBpZ25vcmVCdWZmZXJGdWxsbmVzcyA9CisgICAgICBoVHAtPmZsYWdzICYKKyAgICAgIChUUERFQ19MT1NUX0ZSQU1FU19QRU5ESU5HIHwgVFBERUNfSUdOT1JFX0JVRkZFUkZVTExORVNTIHwgVFBERUNfU1lOQ09LKTsKKyAgVUlOVCBlbmRUcEZyYW1lQml0c1ByZXZpb3VzID0gMDsKIAogICAvKiBTeW5jaCBwYXJhbWV0ZXJzICovCi0gIElOVCBzeW5jTGVuZ3RoOyAgICAgIC8qIExlbmd0aCBvZiBzeW5jIHdvcmQgaW4gYml0cyAqLwotICBVSU5UIHN5bmNXb3JkOyAgICAgICAvKiBTeW5jIHdvcmQgdG8gYmUgZm91bmQgKi8KLSAgVUlOVCBzeW5jTWFzazsgICAgICAgLyogTWFzayBmb3Igc3luYyB3b3JkIChmb3IgYWRkaW5nIG9uZSBiaXQsIHNvIGNvbXByaXNpbmcgb25lIGJpdCBsZXNzKSAqLworICBJTlQgc3luY0xlbmd0aDsgLyogTGVuZ3RoIG9mIHN5bmMgd29yZCBpbiBiaXRzICovCisgIFVJTlQgc3luY1dvcmQ7ICAvKiBTeW5jIHdvcmQgdG8gYmUgZm91bmQgKi8KKyAgVUlOVCBzeW5jTWFzazsgIC8qIE1hc2sgZm9yIHN5bmMgd29yZCAoZm9yIGFkZGluZyBvbmUgYml0LCBzbyBjb21wcmlzaW5nIG9uZQorICAgICAgICAgICAgICAgICAgICAgYml0IGxlc3MpICovCiAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChjb250ZXh0Rmlyc3RGcmFtZSwgdHJhbnNwb3J0ZGVjX3BhcnNlcl90LCAxKTsKIAogICB0b3RhbEJpdHMgPSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpOwpAQCAtNzAzLDcgKzEwNzQsOSBAQAogICAgIGdvdG8gYmFpbDsKICAgfQogCi0gIGZUcmF2ZXJzZU1vcmVGcmFtZXMgPSAoaFRwLT5mbGFncyAmIChUUERFQ19NSU5JTUlaRV9ERUxBWXxUUERFQ19FQVJMWV9DT05GSUcpKSAmJiAhIChoVHAtPmZsYWdzICYgVFBERUNfU1lOQ09LKTsKKyAgZlRyYXZlcnNlTW9yZUZyYW1lcyA9CisgICAgICAoaFRwLT5mbGFncyAmIChUUERFQ19NSU5JTUlaRV9ERUxBWSB8IFRQREVDX0VBUkxZX0NPTkZJRykpICYmCisgICAgICAhKGhUcC0+ZmxhZ3MgJiBUUERFQ19TWU5DT0spOwogCiAgIC8qIFNldCB0cmFuc3BvcnQgc3BlY2lmaWMgc3luYyBwYXJhbWV0ZXJzICovCiAgIHN3aXRjaCAoaFRwLT50cmFuc3BvcnRGbXQpIHsKQEAgLTcyMSwxMiArMTA5NCwxMyBAQAogICAgICAgYnJlYWs7CiAgIH0KIAotICBzeW5jTWFzayA9ICgxPDxzeW5jTGVuZ3RoKS0xOworICBzeW5jTWFzayA9ICgxIDw8IHN5bmNMZW5ndGgpIC0gMTsKIAogICBkbyB7Ci0gICAgSU5UIGJpdHNBdmFpbCA9IDA7ICAgICAvKiBCaXRzIGF2YWlsYWJsZSBpbiBiaXRzdHJlYW0gYnVmZmVyICAgICovCi0gICAgSU5UIGNoZWNrTGVuZ3RoQml0czsgICAvKiBIZWxwZXIgdG8gY2hlY2sgcmVtYWluaW5nIGJpdHMgYW5kIGJ1ZmZlciBib3VuZGFyaWVzICovCi0gICAgVUlOVCBzeW5jaDsgICAgICAgICAgICAvKiBDdXJyZW50IHN5bmMgd29yZCByZWFkIGZyb20gYml0c3RyZWFtICovCisgICAgSU5UIGJpdHNBdmFpbCA9IDA7ICAgLyogQml0cyBhdmFpbGFibGUgaW4gYml0c3RyZWFtIGJ1ZmZlciAgICAqLworICAgIElOVCBjaGVja0xlbmd0aEJpdHM7IC8qIEhlbHBlciB0byBjaGVjayByZW1haW5pbmcgYml0cyBhbmQgYnVmZmVyIGJvdW5kYXJpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVSU5UIHN5bmNoOyAgICAgICAgICAvKiBDdXJyZW50IHN5bmMgd29yZCByZWFkIGZyb20gYml0c3RyZWFtICovCiAKICAgICBoZWFkZXJCaXRzUHJldmlvdXMgPSBoZWFkZXJCaXRzOwogCkBAIC03MzUsMjEgKzExMDksMjIgQEAKICAgICBpZiAoaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPT0gMCkgewogICAgICAgLyogc2VhcmNoIHN5bmNod29yZCAqLwogCi0gICAgICBGREtfQVNTRVJUKCAoYml0c0F2YWlsICUgVFBERUNfU1lOQ1NLSVApID09IDApOworICAgICAgRkRLX0FTU0VSVCgoYml0c0F2YWlsICUgVFBERUNfU1lOQ1NLSVApID09IDApOwogCi0gICAgICBpZiAoKGJpdHNBdmFpbC1zeW5jTGVuZ3RoKSA8IFRQREVDX1NZTkNTS0lQKSB7CisgICAgICBpZiAoKGJpdHNBdmFpbCAtIHN5bmNMZW5ndGgpIDwgVFBERUNfU1lOQ1NLSVApIHsKICAgICAgICAgZXJyID0gVFJBTlNQT1JUREVDX05PVF9FTk9VR0hfQklUUzsKICAgICAgICAgaGVhZGVyQml0cyA9IDA7CiAgICAgICB9IGVsc2UgewotCiAgICAgICAgIHN5bmNoID0gRkRLcmVhZEJpdHMoaEJzLCBzeW5jTGVuZ3RoKTsKIAotICAgICAgICBpZiAoICEoaFRwLT5mbGFncyAmIFRQREVDX1NZTkNPSykgKSB7Ci0gICAgICAgICAgZm9yICg7IChiaXRzQXZhaWwtc3luY0xlbmd0aCkgPj0gVFBERUNfU1lOQ1NLSVA7IGJpdHNBdmFpbC09VFBERUNfU1lOQ1NLSVApIHsKKyAgICAgICAgaWYgKCEoaFRwLT5mbGFncyAmIFRQREVDX1NZTkNPSykpIHsKKyAgICAgICAgICBmb3IgKDsgKGJpdHNBdmFpbCAtIHN5bmNMZW5ndGgpID49IFRQREVDX1NZTkNTS0lQOworICAgICAgICAgICAgICAgYml0c0F2YWlsIC09IFRQREVDX1NZTkNTS0lQKSB7CiAgICAgICAgICAgICBpZiAoc3luY2ggPT0gc3luY1dvcmQpIHsKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaCA9ICgoc3luY2ggPDwgVFBERUNfU1lOQ1NLSVApICYgc3luY01hc2spIHwgRkRLcmVhZEJpdHMoaEJzLCBUUERFQ19TWU5DU0tJUCk7CisgICAgICAgICAgICBzeW5jaCA9ICgoc3luY2ggPDwgVFBERUNfU1lOQ1NLSVApICYgc3luY01hc2spIHwKKyAgICAgICAgICAgICAgICAgICAgRkRLcmVhZEJpdHMoaEJzLCBUUERFQ19TWU5DU0tJUCk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChzeW5jaCAhPSBzeW5jV29yZCkgewpAQCAtNzcwLDQ0ICsxMTQ1LDQ2IEBACiAKICAgICAvKiBQYXJzZSB0cmFuc3BvcnQgaGVhZGVyIChyYXcgZGF0YSBibG9jayBncmFudWxhcml0eSkgKi8KIAotICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LICkKLSAgICB7Ci0gICAgICBlcnIgPSB0cmFuc3BvcnREZWNfcmVhZEhlYWRlcigKLSAgICAgICAgICAgICAgaFRwLAotICAgICAgICAgICAgICBoQnMsCi0gICAgICAgICAgICAgIHN5bmNMZW5ndGgsCi0gICAgICAgICAgICAgIGlnbm9yZUJ1ZmZlckZ1bGxuZXNzLAotICAgICAgICAgICAgICZyYXdEYXRhQmxvY2tMZW5ndGgsCi0gICAgICAgICAgICAgJmZUcmF2ZXJzZU1vcmVGcmFtZXMsCi0gICAgICAgICAgICAgJnN5bmNMYXllckZyYW1lQml0cywKLSAgICAgICAgICAgICAmZkNvbmZpZ0ZvdW5kLAotICAgICAgICAgICAgICZoZWFkZXJCaXRzCi0gICAgICAgICAgICAgICk7CisgICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICAgIGVyciA9IHRyYW5zcG9ydERlY19yZWFkSGVhZGVyKGhUcCwgaEJzLCBzeW5jTGVuZ3RoLCBpZ25vcmVCdWZmZXJGdWxsbmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyYXdEYXRhQmxvY2tMZW5ndGgsICZmVHJhdmVyc2VNb3JlRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN5bmNMYXllckZyYW1lQml0cywgJmZDb25maWdGb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXJCaXRzKTsKKyAgICAgIGlmIChUUERFQ19JU19GQVRBTF9FUlJPUihlcnIpKSB7CisgICAgICAgIC8qIFJld2luZCAtIFRQREVDX1NZTkNTS0lQLCBpbiBvcmRlciB0byBsb29rIGZvciBhIHN5bmNoIG9uZSBiaXQgYWhlYWQKKyAgICAgICAgICogbmV4dCB0aW1lLiBFbnN1cmUgdGhhdCB0aGUgYml0IGFtb3VudCBsYW5kcyBhdCBhIG11bHRpcGxlIG9mCisgICAgICAgICAqIFRQREVDX1NZTkNTS0lQLiAqLworICAgICAgICBGREtwdXNoQmlEaXJlY3Rpb25hbCgKKyAgICAgICAgICAgIGhCcywgLWhlYWRlckJpdHMgKyBUUERFQ19TWU5DU0tJUCArIChiaXRzQXZhaWwgJSBUUERFQ19TWU5DU0tJUCkpOworCisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KICAgICB9CiAKICAgICBiaXRzQXZhaWwgLT0gaGVhZGVyQml0czsKIAotICAgIGNoZWNrTGVuZ3RoQml0cyAgPSBzeW5jTGF5ZXJGcmFtZUJpdHM7CisgICAgY2hlY2tMZW5ndGhCaXRzID0gc3luY0xheWVyRnJhbWVCaXRzOwogCiAgICAgLyogQ2hlY2sgaWYgdGhlIHdob2xlIGZyYW1lIHdvdWxkIGZpdCB0aGUgYml0c3RyZWFtIGJ1ZmZlciAqLwogICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LKSB7Ci0gICAgICBpZiAoIChjaGVja0xlbmd0aEJpdHMraGVhZGVyQml0cykgPiAoKFRSQU5TUE9SVERFQ19JTkJVRl9TSVpFPDwzKS03KSApIHsKKyAgICAgIGlmICgoY2hlY2tMZW5ndGhCaXRzICsgaGVhZGVyQml0cykgPiAoKCg4MTkyICogNCkgPDwgMykgLSA3KSkgewogICAgICAgICAvKiBXZSBhc3N1bWUgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgdHJhbnNwb3J0IGJpdCBidWZmZXIgaGFzIGJlZW4KICAgICAgICAgICAgY2hvc2VuIHRvIG1lZXQgYWxsIHN5c3RlbSByZXF1aXJlbWVudHMsIHRodXMgdGhpcyBjb25kaXRpb24KICAgICAgICAgICAgaXMgY29uc2lkZXJlZCBhIHN5bmNocm9uaXNhdGlvbiBlcnJvci4gKi8KICAgICAgICAgZXJyID0gVFJBTlNQT1JUREVDX1NZTkNfRVJST1I7CiAgICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIGJpdHNBdmFpbCA8IGNoZWNrTGVuZ3RoQml0cyApIHsKKyAgICAgICAgaWYgKGJpdHNBdmFpbCA8IGNoZWNrTGVuZ3RoQml0cykgewogICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFM7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFMpIHsKKyAgICAgIC8qIEVuZm9yY2UgcmVhZGluZyBvZiBuZXcgZGF0YSAqLworICAgICAgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPSAwOwogICAgICAgYnJlYWs7CiAgICAgfQogCi0KICAgICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SKSB7CiAgICAgICBpbnQgYml0czsKIApAQCAtODE2LDM4ICsxMTkzLDM5IEBACiAKICAgICAgIC8qIEVuc3VyZSB0aGF0IHRoZSBiaXQgYW1vdW50IGxhbmRzIGF0IGEgbXVsdGlwbGUgb2YgVFBERUNfU1lOQ1NLSVAgKi8KICAgICAgIGJpdHMgPSAoYml0c0F2YWlsICsgaGVhZGVyQml0cykgJSBUUERFQ19TWU5DU0tJUDsKLSAgICAgIC8qIFJld2luZCAtIFRQREVDX1NZTkNTS0lQLCBpbiBvcmRlciB0byBsb29rIGZvciBhIHN5bmNoIG9uZSBiaXQgYWhlYWQgbmV4dCB0aW1lLiAqLworICAgICAgLyogUmV3aW5kIC0gVFBERUNfU1lOQ1NLSVAsIGluIG9yZGVyIHRvIGxvb2sgZm9yIGEgc3luY2ggb25lIGJpdCBhaGVhZAorICAgICAgICogbmV4dCB0aW1lLiAqLwogICAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoaEJzLCAtKGhlYWRlckJpdHMgLSBUUERFQ19TWU5DU0tJUCkgKyBiaXRzKTsKLSAgICAgIGJpdHNBdmFpbCArPSBoZWFkZXJCaXRzIC0gVFBERUNfU1lOQ1NLSVAgLSBiaXRzOwogICAgICAgaGVhZGVyQml0cyA9IDA7CiAgICAgfQogCiAgICAgLyogRnJhbWUgdHJhdmVyc2FsICovCi0gICAgaWYgKCBmVHJhdmVyc2VNb3JlRnJhbWVzICkKLSAgICB7CisgICAgaWYgKGZUcmF2ZXJzZU1vcmVGcmFtZXMpIHsKICAgICAgIC8qIFNhdmUgcGFyc2VyIGNvbnRleHQgZm9yIGVhcmx5IGNvbmZpZyBkaXNjb3ZlcnkgInJld2luZCBhbGwgZnJhbWVzIiAqLwotICAgICAgaWYgKCAoaFRwLT5mbGFncyAmIFRQREVDX0VBUkxZX0NPTkZJRykgJiYgIShoVHAtPmZsYWdzICYgVFBERUNfTUlOSU1JWkVfREVMQVkpKQotICAgICAgewotICAgICAgICAvKiBpZ25vcmUgYnVmZmVyIGZ1bGxuZXNzIGlmIGp1c3QgdHJhdmVyc2luZyBhZGRpdGlvbmFsIGZyYW1lcyBmb3IgRUNEICovCisgICAgICBpZiAoKGhUcC0+ZmxhZ3MgJiBUUERFQ19FQVJMWV9DT05GSUcpICYmCisgICAgICAgICAgIShoVHAtPmZsYWdzICYgVFBERUNfTUlOSU1JWkVfREVMQVkpKSB7CisgICAgICAgIC8qIGlnbm9yZSBidWZmZXIgZnVsbG5lc3MgaWYganVzdCB0cmF2ZXJzaW5nIGFkZGl0aW9uYWwgZnJhbWVzIGZvciBFQ0QKKyAgICAgICAgICovCiAgICAgICAgIGlnbm9yZUJ1ZmZlckZ1bGxuZXNzID0gMTsKIAogICAgICAgICAvKiBTYXZlIGNvbnRleHQgaW4gb3JkZXIgdG8gcmV0dXJuIGxhdGVyICovCi0gICAgICAgIGlmICggZXJyID09IFRSQU5TUE9SVERFQ19PSyAmJiBzdGFydFBvc0ZpcnN0RnJhbWUgPT0gLTEgKSB7CisgICAgICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LICYmIHN0YXJ0UG9zRmlyc3RGcmFtZSA9PSAtMSkgewogICAgICAgICAgIHN0YXJ0UG9zRmlyc3RGcmFtZSA9IEZES2dldFZhbGlkQml0cyhoQnMpOwogICAgICAgICAgIG51bVJhd0RhdGFCbG9ja3NGaXJzdEZyYW1lID0gaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3M7CiAgICAgICAgICAgZ2xvYmFsRnJhbWVQb3NGaXJzdEZyYW1lID0gaFRwLT5nbG9iYWxGcmFtZVBvczsKICAgICAgICAgICByYXdEYXRhQmxvY2tMZW5ndGhGaXJzdEZyYW1lID0gcmF3RGF0YUJsb2NrTGVuZ3RoOwogICAgICAgICAgIGhlYWRlckJpdHNGaXJzdEZyYW1lID0gaGVhZGVyQml0czsKICAgICAgICAgICBlcnJGaXJzdEZyYW1lID0gZXJyOwotICAgICAgICAgIEZES21lbWNweShjb250ZXh0Rmlyc3RGcmFtZSwgJmhUcC0+cGFyc2VyLCBzaXplb2YodHJhbnNwb3J0ZGVjX3BhcnNlcl90KSk7CisgICAgICAgICAgRkRLbWVtY3B5KGNvbnRleHRGaXJzdEZyYW1lLCAmaFRwLT5wYXJzZXIsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZih0cmFuc3BvcnRkZWNfcGFyc2VyX3QpKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qIEJyZWFrIHdoZW4gY29uZmlnIHdhcyBmb3VuZCBvciBpdCBpcyBub3QgcG9zc2libGUgYW55bW9yZSB0byBmaW5kIGEgY29uZmlnICovCi0gICAgICAgIGlmIChzdGFydFBvc0ZpcnN0RnJhbWUgIT0gLTEgJiYgKGZDb25maWdGb3VuZCB8fCBlcnIgIT0gVFJBTlNQT1JUREVDX09LKSkKLSAgICAgICAgeworICAgICAgICAvKiBCcmVhayB3aGVuIGNvbmZpZyB3YXMgZm91bmQgb3IgaXQgaXMgbm90IHBvc3NpYmxlIGFueW1vcmUgdG8gZmluZCBhCisgICAgICAgICAqIGNvbmZpZyAqLworICAgICAgICBpZiAoc3RhcnRQb3NGaXJzdEZyYW1lICE9IC0xICYmCisgICAgICAgICAgICAoZkNvbmZpZ0ZvdW5kIHx8IGVyciAhPSBUUkFOU1BPUlRERUNfT0spKSB7CiAgICAgICAgICAgLyogSW4gY2FzZSBvZiBFQ0QgYW5kIHN5bmMgZXJyb3IsIGRvIG5vdCByZXdpbmQgYW55d2hlcmUuICovCi0gICAgICAgICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUikKLSAgICAgICAgICB7CisgICAgICAgICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUikgewogICAgICAgICAgICAgc3RhcnRQb3NGaXJzdEZyYW1lID0gLTE7CiAgICAgICAgICAgICBmQ29uZmlnRm91bmQgPSAwOwogICAgICAgICAgICAgbnVtRnJhbWVzVHJhdmVyc2VkID0gMDsKQEAgLTg1OCwxNiArMTIzNiwxOCBAQAogCiAgICAgICBpZiAoZXJyID09IFRSQU5TUE9SVERFQ19PSykgewogICAgICAgICBGREtwdXNoRm9yKGhCcywgcmF3RGF0YUJsb2NrTGVuZ3RoKTsKLSAgICAgICAgYml0c0F2YWlsIC09IHJhd0RhdGFCbG9ja0xlbmd0aDsKICAgICAgICAgbnVtRnJhbWVzVHJhdmVyc2VkKys7CisgICAgICAgIGVuZFRwRnJhbWVCaXRzUHJldmlvdXMgPSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpOwogICAgICAgICAvKiBJZ25vcmUgZXJyb3IgaGVyZSBpdGVudGlvbmFsbHkuICovCiAgICAgICAgIHRyYW5zcG9ydERlY19BZGp1c3RFbmRPZkFjY2Vzc1VuaXQoaFRwKTsKKyAgICAgICAgZW5kVHBGcmFtZUJpdHNQcmV2aW91cyAtPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKICAgICAgIH0KICAgICB9Ci0gIH0gd2hpbGUgKCBmVHJhdmVyc2VNb3JlRnJhbWVzIHx8IChlcnIgPT0gVFJBTlNQT1JUREVDX1NZTkNfRVJST1IgJiYgIShoVHAtPmZsYWdzICYgVFBERUNfU1lOQ09LKSkpOworICB9IHdoaWxlIChmVHJhdmVyc2VNb3JlRnJhbWVzIHx8CisgICAgICAgICAgIChlcnIgPT0gVFJBTlNQT1JUREVDX1NZTkNfRVJST1IgJiYgIShoVHAtPmZsYWdzICYgVFBERUNfU1lOQ09LKSkpOwogCiAgIC8qIFJlc3RvcmUgY29udGV4dCBpbiBjYXNlIG9mIEVDRCBmcmFtZSB0cmF2ZXJzYWwgKi8KLSAgaWYgKCBzdGFydFBvc0ZpcnN0RnJhbWUgIT0gLTEgJiYgKGZDb25maWdGb3VuZCB8fCBlcnIgIT0gVFJBTlNQT1JUREVDX09LKSApIHsKKyAgaWYgKHN0YXJ0UG9zRmlyc3RGcmFtZSAhPSAtMSAmJiAoZkNvbmZpZ0ZvdW5kIHx8IGVyciAhPSBUUkFOU1BPUlRERUNfT0spKSB7CiAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoaEJzLCBGREtnZXRWYWxpZEJpdHMoaEJzKSAtIHN0YXJ0UG9zRmlyc3RGcmFtZSk7CiAgICAgRkRLbWVtY3B5KCZoVHAtPnBhcnNlciwgY29udGV4dEZpcnN0RnJhbWUsIHNpemVvZih0cmFuc3BvcnRkZWNfcGFyc2VyX3QpKTsKICAgICBoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA9IG51bVJhd0RhdGFCbG9ja3NGaXJzdEZyYW1lOwpAQCAtODc2LDMyICsxMjU2LDM1IEBACiAgICAgaGVhZGVyQml0cyA9IGhlYWRlckJpdHNGaXJzdEZyYW1lOwogICAgIGVyciA9IGVyckZpcnN0RnJhbWU7CiAgICAgbnVtRnJhbWVzVHJhdmVyc2VkID0gMDsKLSAgfSAKKyAgfQogCiAgIC8qIEFkZGl0aW9uYWwgYnVyc3QgZGF0YSBtb2RlIGJ1ZmZlciBmdWxsbmVzcyBjaGVjay4gKi8KLSAgaWYgKCAhKGhUcC0+ZmxhZ3MgJiAoVFBERUNfTE9TVF9GUkFNRVNfUEVORElOR3xUUERFQ19JR05PUkVfQlVGRkVSRlVMTE5FU1N8VFBERUNfU1lOQ09LKSkgJiYgZXJyID09IFRSQU5TUE9SVERFQ19PSykgewotICAgIGVyciA9IGFkZGl0aW9uYWxIb2xkT2ZmTmVlZGVkKGhUcCwgdHJhbnNwb3J0RGVjX0dldEJ1ZmZlckZ1bGxuZXNzKGhUcCksIEZES2dldFZhbGlkQml0cyhoQnMpIC0gc3luY0xheWVyRnJhbWVCaXRzKTsKKyAgaWYgKCEoaFRwLT5mbGFncyAmIChUUERFQ19MT1NUX0ZSQU1FU19QRU5ESU5HIHwgVFBERUNfSUdOT1JFX0JVRkZFUkZVTExORVNTIHwKKyAgICAgICAgICAgICAgICAgICAgICBUUERFQ19TWU5DT0spKSAmJgorICAgICAgZXJyID09IFRSQU5TUE9SVERFQ19PSykgeworICAgIGVyciA9IGFkZGl0aW9uYWxIb2xkT2ZmTmVlZGVkKGhUcCwgdHJhbnNwb3J0RGVjX0dldEJ1ZmZlckZ1bGxuZXNzKGhUcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLZ2V0VmFsaWRCaXRzKGhCcykgLSBzeW5jTGF5ZXJGcmFtZUJpdHMpOwogICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX05PVF9FTk9VR0hfQklUUykgewogICAgICAgaFRwLT5ob2xkT2ZmRnJhbWVzKys7CiAgICAgfQogICB9Ci0gIAorCiAgIC8qIFJld2luZCBmb3IgcmV0cnkgYmVjYXVzZSBvZiBub3QgZW5vdWdoIGJpdHMgKi8KICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTKSB7CiAgICAgRkRLcHVzaEJhY2soaEJzLCBoZWFkZXJCaXRzKTsKICAgICBoZWFkZXJCaXRzID0gMDsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICAvKiByZXNldCBob2xkIG9mZiBmcmFtZSBjb3VudGVyICovCiAgICAgaFRwLT5ob2xkT2ZmRnJhbWVzID0gMDsKICAgfQogCiAgIC8qIFJldHVybiB0byBsYXN0IGdvb2QgZnJhbWUgaW4gY2FzZSBvZiBmcmFtZSB0cmF2ZXJzYWwgYnV0IG5vdCBFQ0QuICovCiAgIGlmIChudW1GcmFtZXNUcmF2ZXJzZWQgPiAwKSB7Ci0gICAgRkRLcHVzaEJhY2soaEJzLCByYXdEYXRhQmxvY2tMZW5ndGhQcmV2aW91cyk7CisgICAgRkRLcHVzaEJhY2soaEJzLCByYXdEYXRhQmxvY2tMZW5ndGhQcmV2aW91cyArIGVuZFRwRnJhbWVCaXRzUHJldmlvdXMpOwogICAgIGlmIChlcnIgIT0gVFJBTlNQT1JUREVDX09LKSB7CiAgICAgICBoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA9IG51bVJhd0RhdGFCbG9ja3NQcmV2aW91czsKICAgICAgIGhlYWRlckJpdHMgPSBoZWFkZXJCaXRzUHJldmlvdXM7CisgICAgICByYXdEYXRhQmxvY2tMZW5ndGggPSByYXdEYXRhQmxvY2tMZW5ndGhQcmV2aW91czsKICAgICB9CiAgICAgZXJyID0gVFJBTlNQT1JUREVDX09LOwogICB9CkBAIC05MDksMTAgKzEyOTIsMTMgQEAKIGJhaWw6CiAgIGhUcC0+YXVMZW5ndGhbMF0gPSByYXdEYXRhQmxvY2tMZW5ndGg7CiAKLSAgLyogRGV0ZWN0IHBvaW50bGVzcyBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTIGVycm9yIGNhc2UsIHdlcmUgdGhlIGJpdCBidWZmZXIgaXMgYWxyZWFkeSBmdWxsLAotICAgICBvciBubyBuZXcgYnVyc3QgcGFja2V0IGZpdHMuIFJlY292ZXIgYnkgYWR2YW5jaW5nIHRoZSBiaXQgYnVmZmVyLiAqLwotICBpZiAoIChUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTID09IGVycikgJiYgIChGREtnZXRWYWxpZEJpdHMoaEJzKSA+PSAoKFRSQU5TUE9SVERFQ19JTkJVRl9TSVpFKjggLSAoKGhUcC0+YXZnQml0UmF0ZSpoVHAtPmJ1cnN0UGVyaW9kKS8xMDAwKSkgLSA3KSkgKQotICB7CisgIC8qIERldGVjdCBwb2ludGxlc3MgVFJBTlNQT1JUREVDX05PVF9FTk9VR0hfQklUUyBlcnJvciBjYXNlLCB3aGVyZSB0aGUgYml0CisgICAgIGJ1ZmZlciBpcyBhbHJlYWR5IGZ1bGwsIG9yIG5vIG5ldyBidXJzdCBwYWNrZXQgZml0cy4gUmVjb3ZlciBieSBhZHZhbmNpbmcKKyAgICAgdGhlIGJpdCBidWZmZXIuICovCisgIGlmICgodG90YWxCaXRzID4gMCkgJiYgKFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFMgPT0gZXJyKSAmJgorICAgICAgKEZES2dldFZhbGlkQml0cyhoQnMpID49CisgICAgICAgKCgoODE5MiAqIDQpICogOCAtICgoaFRwLT5hdmdCaXRSYXRlICogaFRwLT5idXJzdFBlcmlvZCkgLyAxMDAwKSkgLQorICAgICAgICA3KSkpIHsKICAgICBGREtwdXNoRm9yKGhCcywgVFBERUNfU1lOQ1NLSVApOwogICAgIGVyciA9IFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SOwogICB9CkBAIC05MzksMzQgKzEzMjUsMzIgQEAKIH0KIAogLyoqCi0gKiBcYnJpZWYgU3luY2hyb25pemUgdG8gc3RyZWFtIGFuZCBlc3RpbWF0ZSB0aGUgYW1vdW50IG9mIG1pc3NpbmcgYWNjZXNzIHVuaXRzIGR1ZQotICogICAgICAgIHRvIGEgY3VycmVudCBzeW5jaHJvbml6YXRpb24gZXJyb3IgaW4gY2FzZSBvZiBjb25zdGFudCBhdmVyYWdlIGJpdCByYXRlLgorICogXGJyaWVmIFN5bmNocm9uaXplIHRvIHN0cmVhbSBhbmQgZXN0aW1hdGUgdGhlIGFtb3VudCBvZiBtaXNzaW5nIGFjY2VzcyB1bml0cworICogZHVlIHRvIGEgY3VycmVudCBzeW5jaHJvbml6YXRpb24gZXJyb3IgaW4gY2FzZSBvZiBjb25zdGFudCBhdmVyYWdlIGJpdCByYXRlLgogICovCi1zdGF0aWMKLVRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfcmVhZFN0cmVhbSAoIEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLCBjb25zdCBVSU5UIGxheWVyICkKLXsKLQorc3RhdGljIFRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfcmVhZFN0cmVhbShIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBsYXllcikgewogICBUUkFOU1BPUlRERUNfRVJST1IgZXJyb3IgPSBUUkFOU1BPUlRERUNfT0s7CiAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcyA9ICZoVHAtPmJpdFN0cmVhbVtsYXllcl07Ci0gIElOVCBuQVUgPSAtMTsKKwogICBJTlQgaGVhZGVyQml0czsKICAgSU5UIGJpdERpc3RhbmNlLCBiZkRlbHRhOwogCiAgIC8qIE9idGFpbiBkaXN0YW5jZSB0byBuZXh0IHN5bmNoIHdvcmQgKi8KLSAgYml0RGlzdGFuY2UgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKKyAgYml0RGlzdGFuY2UgPSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpOwogICBlcnJvciA9IHN5bmNocm9uaXphdGlvbihoVHAsICZoZWFkZXJCaXRzKTsKLSAgYml0RGlzdGFuY2UgLT0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7Ci0KKyAgYml0RGlzdGFuY2UgLT0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKTsKIAogICBGREtfQVNTRVJUKGJpdERpc3RhbmNlID49IDApOwogCi0gIGlmIChlcnJvciA9PSBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUiB8fCAoaFRwLT5mbGFncyAmIFRQREVDX0xPU1RfRlJBTUVTX1BFTkRJTkcpKQotICB7CisgIElOVCBuQVUgPSAtMTsKKworICBpZiAoZXJyb3IgPT0gVFJBTlNQT1JUREVDX1NZTkNfRVJST1IgfHwKKyAgICAgIChoVHAtPmZsYWdzICYgVFBERUNfTE9TVF9GUkFNRVNfUEVORElORykpIHsKICAgICAvKiBDaGVjayBpZiBlc3RpbWF0aW5nIGxvc3QgYWNjZXNzIHVuaXRzIGlzIGZlYXNpYmxlLiAqLwotICAgIGlmIChoVHAtPmF2Z0JpdFJhdGUgPiAwICYmIGhUcC0+YXNjWzBdLm1fc2FtcGxlc1BlckZyYW1lID4gMCAmJiBoVHAtPmFzY1swXS5tX3NhbXBsaW5nRnJlcXVlbmN5ID4gMCkKLSAgICB7Ci0gICAgICBpZiAoZXJyb3IgPT0gVFJBTlNQT1JUREVDX09LKQotICAgICAgeworICAgIGlmIChoVHAtPmF2Z0JpdFJhdGUgPiAwICYmIGhUcC0+YXNjWzBdLm1fc2FtcGxlc1BlckZyYW1lID4gMCAmJgorICAgICAgICBoVHAtPmFzY1swXS5tX3NhbXBsaW5nRnJlcXVlbmN5ID4gMCkgeworICAgICAgaWYgKGVycm9yID09IFRSQU5TUE9SVERFQ19PSykgewogICAgICAgICBpbnQgYWo7CiAKICAgICAgICAgYWogPSB0cmFuc3BvcnREZWNfR2V0QnVmZmVyRnVsbG5lc3MoaFRwKTsKQEAgLTk3OCwxNSArMTM2MiwxNSBAQAogICAgICAgICAvKiBzeW5jIHdhcyBvazogbGFzdCBvZiBhIHNlcmllcyBvZiBiYWQgYWNjZXNzIHVuaXRzLiAqLwogICAgICAgICBoVHAtPmZsYWdzICY9IH5UUERFQ19MT1NUX0ZSQU1FU19QRU5ESU5HOwogICAgICAgICAvKiBBZGQgdXAgYml0RGlzdGFuY2UgdW50aWwgZW5kIG9mIHRoZSBjdXJyZW50IGZyYW1lLiBMYXRlciB3ZSBzdWJzdHJhY3QKLSAgICAgICAgICAgdGhpcyBmcmFtZSBmcm9tIHRoZSBncmFuZCB0b3RhbCwgc2luY2UgdGhpcyBjdXJyZW50IHN1Y2Nlc3NmdWxseSBzeW5jaHJvbml6ZWQKLSAgICAgICAgICAgZnJhbWUgc2hvdWxkIG5vdCBiZSBza2lwcGVkIG9mIGNvdXJzZTsgYnV0IGl0IG11c3QgYmUgYWNjb3VudGVkIGludG8gdGhlCi0gICAgICAgICAgIGJ1ZmZlcmZ1bG5lc3MgbWF0aC4gKi8KKyAgICAgICAgICAgdGhpcyBmcmFtZSBmcm9tIHRoZSBncmFuZCB0b3RhbCwgc2luY2UgdGhpcyBjdXJyZW50IHN1Y2Nlc3NmdWxseQorICAgICAgICAgICBzeW5jaHJvbml6ZWQgZnJhbWUgc2hvdWxkIG5vdCBiZSBza2lwcGVkIG9mIGNvdXJzZTsgYnV0IGl0IG11c3QgYmUKKyAgICAgICAgICAgYWNjb3VudGVkIGludG8gdGhlIGJ1ZmZlcmZ1bG5lc3MgbWF0aC4gKi8KICAgICAgICAgYml0RGlzdGFuY2UgKz0gaFRwLT5hdUxlbmd0aFswXTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICggIShoVHAtPmZsYWdzICYgVFBERUNfTE9TVF9GUkFNRVNfUEVORElORykgKSB7CisgICAgICAgIGlmICghKGhUcC0+ZmxhZ3MgJiBUUERFQ19MT1NUX0ZSQU1FU19QRU5ESU5HKSkgewogICAgICAgICAgIC8qIHN5bmMgbm90IG9rOiBvbmUgb2YgbWFueSBiYWQgYWNjZXNzIHVuaXRzLiAqLwogICAgICAgICAgIGhUcC0+ZmxhZ3MgfD0gVFBERUNfTE9TVF9GUkFNRVNfUEVORElORzsKLSAgICAgICAgICBiZkRlbHRhID0gLSAoSU5UKWhUcC0+bGFzdFZhbGlkQnVmZmVyRnVsbG5lc3M7CisgICAgICAgICAgYmZEZWx0YSA9IC0oSU5UKWhUcC0+bGFzdFZhbGlkQnVmZmVyRnVsbG5lc3M7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgYmZEZWx0YSA9IDA7CiAgICAgICAgIH0KQEAgLTk5Niw3ICsxMzgwLDggQEAKICAgICAgICAgaW50IG51bSwgZGVub207CiAKICAgICAgICAgLyogT2J0YWluIGVzdGltYXRlIG9mIG51bWJlciBvZiBsb3N0IGZyYW1lcyAqLwotICAgICAgICBudW0gPSBoVHAtPmFzY1swXS5tX3NhbXBsaW5nRnJlcXVlbmN5ICogKGJmRGVsdGEgKyBiaXREaXN0YW5jZSkgKyBoVHAtPnJlbWFpbmRlcjsKKyAgICAgICAgbnVtID0gKElOVCloVHAtPmFzY1swXS5tX3NhbXBsaW5nRnJlcXVlbmN5ICogKGJmRGVsdGEgKyBiaXREaXN0YW5jZSkgKworICAgICAgICAgICAgICBoVHAtPnJlbWFpbmRlcjsKICAgICAgICAgZGVub20gPSBoVHAtPmF2Z0JpdFJhdGUgKiBoVHAtPmFzY1swXS5tX3NhbXBsZXNQZXJGcmFtZTsKICAgICAgICAgaWYgKG51bSA+IDApIHsKICAgICAgICAgICBuQVUgPSBudW0gLyBkZW5vbTsKQEAgLTEwMDUsMjMgKzEzOTAsMjAgQEAKICAgICAgICAgICBoVHAtPnJlbWFpbmRlciA9IG51bTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChlcnJvciA9PSBUUkFOU1BPUlRERUNfT0spCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBGaW5hbCBhZGp1c3RtZW50IG9mIHJlbWFpbmRlciwgdGFrZW4gLTEgaW50byBhY2NvdW50IGJlY2F1c2UgY3VycmVudAotICAgICAgICAgICAgIGZyYW1lIHNob3VsZCBub3QgYmUgc2tpcHBlZCwgdGh1cyBzdWJzdHJhY3QgLTEgb3IgZG8gbm90aGluZyBpbnN0ZWFkCi0gICAgICAgICAgICAgb2YgKzEtMSBhY2NvcmRpbmdseS4gKi8KLSAgICAgICAgICBpZiAoIChkZW5vbSAtIGhUcC0+cmVtYWluZGVyKSA+PSBoVHAtPnJlbWFpbmRlciApIHsKKyAgICAgICAgaWYgKGVycm9yID09IFRSQU5TUE9SVERFQ19PSykgeworICAgICAgICAgIC8qIEZpbmFsIGFkanVzdG1lbnQgb2YgcmVtYWluZGVyLCB0YWtlbiAtMSBpbnRvIGFjY291bnQgYmVjYXVzZQorICAgICAgICAgICAgIGN1cnJlbnQgZnJhbWUgc2hvdWxkIG5vdCBiZSBza2lwcGVkLCB0aHVzIHN1YnN0cmFjdCAtMSBvciBkbworICAgICAgICAgICAgIG5vdGhpbmcgaW5zdGVhZCBvZiArMS0xIGFjY29yZGluZ2x5LiAqLworICAgICAgICAgIGlmICgoZGVub20gLSBoVHAtPnJlbWFpbmRlcikgPj0gaFRwLT5yZW1haW5kZXIpIHsKICAgICAgICAgICAgIG5BVS0tOwogICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgaWYgKG5BVSA8IDApIHsKLSAgICAgICAgICAgIC8qIFRoZXJlIHdhcyBvbmUgZnJhbWUgdG9vIG11Y2ggY29uY2VhbGVkLCBzbyB1bmZvcnR1bmF0ZWx5IHdlIHdpbGwgaGF2ZSB0byBza2lwIG9uZSBnb29kIGZyYW1lLiAqLworICAgICAgICAgICAgLyogVGhlcmUgd2FzIG9uZSBmcmFtZSB0b28gbXVjaCBjb25jZWFsZWQsIHNvIHVuZm9ydHVuYXRlbHkgd2Ugd2lsbAorICAgICAgICAgICAgICogaGF2ZSB0byBza2lwIG9uZSBnb29kIGZyYW1lLiAqLwogICAgICAgICAgICAgdHJhbnNwb3J0RGVjX0VuZEFjY2Vzc1VuaXQoaFRwKTsKLSAgICAgICAgICAgIGVycm9yID0gc3luY2hyb25pemF0aW9uKGhUcCwgJmhlYWRlckJpdHMpOyAgICAgICAgICAgICAKKyAgICAgICAgICAgIGVycm9yID0gc3luY2hyb25pemF0aW9uKGhUcCwgJmhlYWRlckJpdHMpOwogICAgICAgICAgICAgbkFVID0gLTE7Ci0jaWZkZWYgREVCVUcKLSAgICAgICAgICAgIEZES3ByaW50ZigiRVJST1I6IEJ1ZmZlcmZ1bGxuZXNzIGFjY291bnRpbmcgZmFpbGVkLiByZW1haW5kZXI9JWQsIG5BVT0lZFxuIiwgaFRwLT5yZW1haW5kZXIsIG5BVSk7Ci0jZW5kaWYKICAgICAgICAgICB9CiAgICAgICAgICAgaFRwLT5yZW1haW5kZXIgPSAwOwogICAgICAgICAgIC8qIEVuZm9yY2UgbGFzdCBtaXNzZWQgZnJhbWVzIHRvIGJlIGNvbmNlYWxlZC4gKi8KQEAgLTEwMzMsOSArMTQxNSwxMCBAQAogICAgIH0KICAgfQogCi0gIC8qIEJlIHN1cmUgdGhhdCBsb3N0IGZyYW1lcyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuIFRoaXMgaXMgbmVjZXNzYXJ5IGR1ZSB0byBzb21lCi0gICAgIHN5bmMgZXJyb3Igc2VxdWVuY2VzIHdoZXJlIGxhdGVyIGl0IHR1cm5zIG91dCB0aGF0IHRoZXJlIGlzIG5vdCBlbm91Z2ggZGF0YSwgYnV0Ci0gICAgIHRoZSBiaXRzIHVwdG8gdGhlIHN5bmMgd29yZCBhcmUgZGlzY2FyZGVkLCB0aHVzIGNhdXNpbmcgYSB2YWx1ZSBvZiBuQVUgPiAwICovCisgIC8qIEJlIHN1cmUgdGhhdCBsb3N0IGZyYW1lcyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuIFRoaXMgaXMgbmVjZXNzYXJ5IGR1ZSB0bworICAgICBzb21lIHN5bmMgZXJyb3Igc2VxdWVuY2VzIHdoZXJlIGxhdGVyIGl0IHR1cm5zIG91dCB0aGF0IHRoZXJlIGlzIG5vdCBlbm91Z2gKKyAgICAgZGF0YSwgYnV0IHRoZSBiaXRzIHVwdG8gdGhlIHN5bmMgd29yZCBhcmUgZGlzY2FyZGVkLCB0aHVzIGNhdXNpbmcgYSB2YWx1ZQorICAgICBvZiBuQVUgPiAwICovCiAgIGlmIChuQVUgPiAwKSB7CiAgICAgZXJyb3IgPSBUUkFOU1BPUlRERUNfU1lOQ19FUlJPUjsKICAgfQpAQCAtMTA0Niw4ICsxNDI5LDggQEAKIH0KIAogLyogcmV0dXJucyBlcnJvciBjb2RlICovCi1UUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX1JlYWRBY2Nlc3NVbml0KCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwgY29uc3QgVUlOVCBsYXllciApCi17CitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX1JlYWRBY2Nlc3NVbml0KGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxheWVyKSB7CiAgIFRSQU5TUE9SVERFQ19FUlJPUiBlcnIgPSBUUkFOU1BPUlRERUNfT0s7CiAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCczsKIApAQCAtMTA1OCw0MSArMTQ0MSw2NiBAQAogICBoQnMgPSAmaFRwLT5iaXRTdHJlYW1bbGF5ZXJdOwogCiAgIGlmICgoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpIDw9IDApIHsKKyAgICAvKiBUaGlzIGlzIG9ubHkgcmVsZXZhbnQgZm9yIFJBVyBhbmQgQURJRiBjYXNlcy4KKyAgICAgKiBGb3Igc3RyZWFtaW5nIGZvcm1hdHMgZXJyIHdpbGwgZ2V0IG92ZXJ3cml0dGVuLiAqLwogICAgIGVyciA9IFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFM7CisgICAgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPSAwOwogICB9CiAKICAgc3dpdGNoIChoVHAtPnRyYW5zcG9ydEZtdCkgewotCiAgICAgY2FzZSBUVF9NUDRfQURJRjoKICAgICAgIC8qIFJlYWQgaGVhZGVyIGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KLSAgICAgIGlmICghKGhUcC0+ZmxhZ3MgJiBUUERFQ19DT05GSUdfRk9VTkQpKQotICAgICAgeworICAgICAgaWYgKCEoaFRwLT5mbGFncyAmIFRQREVDX0NPTkZJR19GT1VORCkpIHsKKyAgICAgICAgaW50IGk7CiAgICAgICAgIENQcm9ncmFtQ29uZmlnICpwY2U7CisgICAgICAgIElOVCBic1N0YXJ0ID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisgICAgICAgIFVDSEFSIGNvbmZpZ0NoYW5nZWQgPSAwOworICAgICAgICBVQ0hBUiBjb25maWdNb2RlID0gQUNfQ01fREVUX0NGR19DSEFOR0U7CiAKLSAgICAgICAgQXVkaW9TcGVjaWZpY0NvbmZpZ19Jbml0KCZoVHAtPmFzY1swXSk7Ci0gICAgICAgIHBjZSA9ICZoVHAtPmFzY1swXS5tX3Byb2dyQ29uZmlnRWxlbWVudDsKLSAgICAgICAgZXJyID0gYWRpZlJlYWRfRGVjb2RlSGVhZGVyKCZoVHAtPnBhcnNlci5hZGlmLCBwY2UsIGhCcyk7Ci0gICAgICAgIGlmIChlcnIpCi0gICAgICAgICAgZ290byBiYWlsOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICBGREtwdXNoQmFjayhoQnMsIGJzU3RhcnQgLSBGREtnZXRWYWxpZEJpdHMoaEJzKSk7CisgICAgICAgICAgICBjb25maWdNb2RlID0gQUNfQ01fQUxMT0NfTUVNOworICAgICAgICAgIH0KIAotICAgICAgICAvKiBNYXAgYWRpZiBoZWFkZXIgdG8gQVNDICovCi0gICAgICAgIGhUcC0+YXNjWzBdLm1fYW90ICAgICAgICAgICAgICAgICAgICA9IChBVURJT19PQkpFQ1RfVFlQRSkocGNlLT5Qcm9maWxlICsgMSk7Ci0gICAgICAgIGhUcC0+YXNjWzBdLm1fc2FtcGxpbmdGcmVxdWVuY3lJbmRleCA9IHBjZS0+U2FtcGxpbmdGcmVxdWVuY3lJbmRleDsKLSAgICAgICAgaFRwLT5hc2NbMF0ubV9zYW1wbGluZ0ZyZXF1ZW5jeSAgICAgID0gU2FtcGxpbmdSYXRlVGFibGVbcGNlLT5TYW1wbGluZ0ZyZXF1ZW5jeUluZGV4XTsKLSAgICAgICAgaFRwLT5hc2NbMF0ubV9jaGFubmVsQ29uZmlndXJhdGlvbiAgID0gMDsKLSAgICAgICAgaFRwLT5hc2NbMF0ubV9zYW1wbGVzUGVyRnJhbWUgICAgICAgID0gMTAyNDsKLSAgICAgICAgaFRwLT5hdmdCaXRSYXRlICAgICAgICAgICAgICAgICAgICAgID0gaFRwLT5wYXJzZXIuYWRpZi5CaXRSYXRlOworICAgICAgICAgIEF1ZGlvU3BlY2lmaWNDb25maWdfSW5pdCgmaFRwLT5hc2NbMF0pOworICAgICAgICAgIHBjZSA9ICZoVHAtPmFzY1swXS5tX3Byb2dyQ29uZmlnRWxlbWVudDsKKyAgICAgICAgICBlcnIgPSBhZGlmUmVhZF9EZWNvZGVIZWFkZXIoJmhUcC0+cGFyc2VyLmFkaWYsIHBjZSwgaEJzKTsKKyAgICAgICAgICBpZiAoZXJyKSBnb3RvIGJhaWw7CiAKLSAgICAgICAgLyogQ2FsbCBjYWxsYmFjayB0byBkZWNvZGVyLiAqLwotICAgICAgICB7Ci0gICAgICAgICAgaW50IGVyckM7CisgICAgICAgICAgLyogTWFwIGFkaWYgaGVhZGVyIHRvIEFTQyAqLworICAgICAgICAgIGhUcC0+YXNjWzBdLm1fYW90ID0gKEFVRElPX09CSkVDVF9UWVBFKShwY2UtPlByb2ZpbGUgKyAxKTsKKyAgICAgICAgICBoVHAtPmFzY1swXS5tX3NhbXBsaW5nRnJlcXVlbmN5SW5kZXggPSBwY2UtPlNhbXBsaW5nRnJlcXVlbmN5SW5kZXg7CisgICAgICAgICAgaFRwLT5hc2NbMF0ubV9zYW1wbGluZ0ZyZXF1ZW5jeSA9CisgICAgICAgICAgICAgIFNhbXBsaW5nUmF0ZVRhYmxlW3BjZS0+U2FtcGxpbmdGcmVxdWVuY3lJbmRleF07CisgICAgICAgICAgaFRwLT5hc2NbMF0ubV9jaGFubmVsQ29uZmlndXJhdGlvbiA9IDA7CisgICAgICAgICAgaFRwLT5hc2NbMF0ubV9zYW1wbGVzUGVyRnJhbWUgPSAxMDI0OworICAgICAgICAgIGhUcC0+YXZnQml0UmF0ZSA9IGhUcC0+cGFyc2VyLmFkaWYuQml0UmF0ZTsKIAotICAgICAgICAgIGVyckMgPSBoVHAtPmNhbGxiYWNrcy5jYlVwZGF0ZUNvbmZpZyhoVHAtPmNhbGxiYWNrcy5jYlVwZGF0ZUNvbmZpZ0RhdGEsICZoVHAtPmFzY1swXSk7Ci0gICAgICAgICAgaWYgKGVyckMgPT0gMCkgewotICAgICAgICAgICAgaFRwLT5mbGFncyB8PSBUUERFQ19DT05GSUdfRk9VTkQ7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKLSAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAvKiBDYWxsIGNhbGxiYWNrIHRvIGRlY29kZXIuICovCisgICAgICAgICAgeworICAgICAgICAgICAgaW50IGVyckM7CisKKyAgICAgICAgICAgIGVyckMgPSBoVHAtPmNhbGxiYWNrcy5jYlVwZGF0ZUNvbmZpZygKKyAgICAgICAgICAgICAgICBoVHAtPmNhbGxiYWNrcy5jYlVwZGF0ZUNvbmZpZ0RhdGEsICZoVHAtPmFzY1swXSwgY29uZmlnTW9kZSwKKyAgICAgICAgICAgICAgICAmY29uZmlnQ2hhbmdlZCk7CisgICAgICAgICAgICBpZiAoZXJyQyA9PSAwKSB7CisgICAgICAgICAgICAgIGhUcC0+ZmxhZ3MgfD0gVFBERUNfQ09ORklHX0ZPVU5EOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZXJyID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfT0spIHsKKyAgICAgICAgICAgIGlmICgoaSA9PSAwKSAmJiBjb25maWdDaGFuZ2VkKSB7CisgICAgICAgICAgICAgIGludCBlcnJDOworICAgICAgICAgICAgICBlcnJDID0gaFRwLT5jYWxsYmFja3MuY2JGcmVlTWVtKGhUcC0+Y2FsbGJhY2tzLmNiRnJlZU1lbURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhUcC0+YXNjWzBdKTsKKyAgICAgICAgICAgICAgaWYgKGVyckMgIT0gMCkgeworICAgICAgICAgICAgICAgIGVyciA9IFRSQU5TUE9SVERFQ19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQpAQCAtMTEwOSw5ICsxNTE3LDEwIEBACiAKICAgICBjYXNlIFRUX01QNF9MQVRNX01DUDA6CiAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AxOgotICAgICAgeworICAgICAgaWYgKGVyciA9PSBUUkFOU1BPUlRERUNfT0spIHsKICAgICAgICAgaW50IGZDb25maWdGb3VuZCA9IGhUcC0+ZmxhZ3MgJiBUUERFQ19DT05GSUdfRk9VTkQ7Ci0gICAgICAgIGVyciA9IHRyYW5zcG9ydERlY19yZWFkSGVhZGVyKGhUcCwgaEJzLCAwLCAxLCAmaFRwLT5hdUxlbmd0aFtsYXllcl0sIE5VTEwsIE5VTEwsICZmQ29uZmlnRm91bmQsIE5VTEwpOworICAgICAgICBlcnIgPSB0cmFuc3BvcnREZWNfcmVhZEhlYWRlcihoVHAsIGhCcywgMCwgMSwgJmhUcC0+YXVMZW5ndGhbbGF5ZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCAmZkNvbmZpZ0ZvdW5kLCBOVUxMKTsKICAgICAgICAgaWYgKGZDb25maWdGb3VuZCkgewogICAgICAgICAgIGhUcC0+ZmxhZ3MgfD0gVFBERUNfQ09ORklHX0ZPVU5EOwogICAgICAgICB9CkBAIC0xMTM4LDEyICsxNTQ3LDI5IEBACiAgIHJldHVybiBlcnI7CiB9CiAKLUlOVCB0cmFuc3BvcnREZWNfR2V0QXVCaXRzUmVtYWluaW5nKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwgY29uc3QgVUlOVCBsYXllciApCi17CitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0dldEFzYyhjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKmFzYykgeworICBUUkFOU1BPUlRERUNfRVJST1IgZXJyID0gVFJBTlNQT1JUREVDX09LOworCisgIGlmIChoVHAgIT0gTlVMTCkgeworICAgICphc2MgPSBoVHAtPmFzY1tsYXllcl07CisgICAgZXJyID0gVFJBTlNQT1JUREVDX09LOworICB9IGVsc2UgeworICAgIGVyciA9IFRSQU5TUE9SVERFQ19JTlZBTElEX1BBUkFNRVRFUjsKKyAgfQorICByZXR1cm4gZXJyOworfQorCitJTlQgdHJhbnNwb3J0RGVjX0dldEF1Qml0c1JlbWFpbmluZyhjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGF5ZXIpIHsKICAgSU5UIGJpdHM7CiAKICAgaWYgKGhUcC0+YWNjZXNzVW5pdEFuY2hvcltsYXllcl0gPiAwICYmIGhUcC0+YXVMZW5ndGhbbGF5ZXJdID4gMCkgewotICAgIGJpdHMgPSBoVHAtPmF1TGVuZ3RoW2xheWVyXSAtIChoVHAtPmFjY2Vzc1VuaXRBbmNob3JbbGF5ZXJdIC0gRkRLZ2V0VmFsaWRCaXRzKCZoVHAtPmJpdFN0cmVhbVtsYXllcl0pKTsKKyAgICBiaXRzID0gKElOVClGREtnZXRWYWxpZEJpdHMoJmhUcC0+Yml0U3RyZWFtW2xheWVyXSk7CisgICAgaWYgKGJpdHMgPj0gMCkgeworICAgICAgYml0cyA9IGhUcC0+YXVMZW5ndGhbbGF5ZXJdIC0gKChJTlQpaFRwLT5hY2Nlc3NVbml0QW5jaG9yW2xheWVyXSAtIGJpdHMpOworICAgIH0KICAgfSBlbHNlIHsKICAgICBiaXRzID0gRkRLZ2V0VmFsaWRCaXRzKCZoVHAtPmJpdFN0cmVhbVtsYXllcl0pOwogICB9CkBAIC0xMTUxLDIzICsxNTc3LDU1IEBACiAgIHJldHVybiBiaXRzOwogfQogCi1JTlQgdHJhbnNwb3J0RGVjX0dldEF1Qml0c1RvdGFsKCBjb25zdCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCwgY29uc3QgVUlOVCBsYXllciApCi17CitJTlQgdHJhbnNwb3J0RGVjX0dldEF1Qml0c1RvdGFsKGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxheWVyKSB7CiAgIHJldHVybiBoVHAtPmF1TGVuZ3RoW2xheWVyXTsKIH0KIAotVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19HZXRNaXNzaW5nQWNjZXNzVW5pdENvdW50ICggSU5UICpwTkFjY2Vzc1VuaXRzLCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCApCi17CitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0dldE1pc3NpbmdBY2Nlc3NVbml0Q291bnQoCisgICAgSU5UICpwTkFjY2Vzc1VuaXRzLCBIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCkgewogICAqcE5BY2Nlc3NVbml0cyA9IGhUcC0+bWlzc2luZ0FjY2Vzc1VuaXRzOwogCiAgIHJldHVybiBUUkFOU1BPUlRERUNfT0s7CiB9CiAKIC8qIEluZm9ybSB0aGUgdHJhbnNwb3J0RGVjIGxheWVyIHRoYXQgcmVhZGluZyBvZiBhY2Nlc3MgdW5pdCBoYXMgZmluaXNoZWQuICovCi1UUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0VuZEFjY2Vzc1VuaXQoSEFORExFX1RSQU5TUE9SVERFQyBoVHApCi17CitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0VuZEFjY2Vzc1VuaXQoSEFORExFX1RSQU5TUE9SVERFQyBoVHApIHsKICAgVFJBTlNQT1JUREVDX0VSUk9SIGVyciA9IFRSQU5TUE9SVERFQ19PSzsKIAorICBzd2l0Y2ggKGhUcC0+dHJhbnNwb3J0Rm10KSB7CisgICAgY2FzZSBUVF9NUDRfTE9BUzoKKyAgICBjYXNlIFRUX01QNF9MQVRNX01DUDA6CisgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AxOiB7CisgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSAmaFRwLT5iaXRTdHJlYW1bMF07CisgICAgICBpZiAoaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPT0gMCkgeworICAgICAgICAvKiBSZWFkIG90aGVyIGRhdGEgaWYgYXZhaWxhYmxlLiAqLworICAgICAgICBpZiAoQ0xhdG1EZW11eF9HZXRPdGhlckRhdGFQcmVzZW50RmxhZygmaFRwLT5wYXJzZXIubGF0bSkpIHsKKyAgICAgICAgICBpbnQgb3RoZXJEYXRhTGVuID0gQ0xhdG1EZW11eF9HZXRPdGhlckRhdGFMZW5ndGgoJmhUcC0+cGFyc2VyLmxhdG0pOworCisgICAgICAgICAgaWYgKChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcykgPj0gb3RoZXJEYXRhTGVuKSB7CisgICAgICAgICAgICBGREtwdXNoRm9yKGhCcywgb3RoZXJEYXRhTGVuKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogRG8gYnl0ZSBhbGlnbiBhdCB0aGUgZW5kIG9mIEF1ZGlvTXV4RWxlbWVudC4gKi8KKyAgICAgICAgICAgIGlmIChoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA9PSAwKSB7CisgICAgICAgICAgICAgIEZES2J5dGVBbGlnbihoQnMsIGhUcC0+Z2xvYmFsRnJhbWVQb3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19OT1RfRU5PVUdIX0JJVFM7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBJZiBiaXQgYnVmZmVyIGhhcyBub3QgbW9yZSBiaXRzIGJ1dCBoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA+IDAKKyAgICAgICAgICAgdGhlbiB0b28gbWFueSBiaXRzIHdlcmUgcmVhZCBhbmQgb2J2aW91c2x5IG5vIG1vcmUgUmF3RGF0YUJsb2NrcyBjYW4KKyAgICAgICAgICAgYmUgcmVhZC4gU2V0IG51bWJlck9mUmF3RGF0YUJsb2NrcyB0byB6ZXJvIHRvIGF0dGVtcHQgYSBuZXcgc3luYworICAgICAgICAgICBhdHRlbXB0LiAqLworICAgICAgICBpZiAoKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSA8PSAwKSB7CisgICAgICAgICAgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KIAogICBlcnIgPSB0cmFuc3BvcnREZWNfQWRqdXN0RW5kT2ZBY2Nlc3NVbml0KGhUcCk7CiAKQEAgLTExNzksMTIgKzE2MzcsMTUgQEAKICAgcmV0dXJuIGVycjsKIH0KIAotVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19TZXRQYXJhbSAoIGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRQREVDX1BBUkFNICAgICAgICBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgdmFsdWUpCi17CitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX1NldFBhcmFtKGNvbnN0IEhBTkRMRV9UUkFOU1BPUlRERUMgaFRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUUERFQ19QQVJBTSBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHZhbHVlKSB7CiAgIFRSQU5TUE9SVERFQ19FUlJPUiBlcnJvciA9IFRSQU5TUE9SVERFQ19PSzsKIAorICBpZiAoaFRwID09IE5VTEwpIHsKKyAgICByZXR1cm4gVFJBTlNQT1JUREVDX0lOVkFMSURfUEFSQU1FVEVSOworICB9CisKICAgc3dpdGNoIChwYXJhbSkgewogICAgIGNhc2UgVFBERUNfUEFSQU1fTUlOSU1JWkVfREVMQVk6CiAgICAgICBpZiAodmFsdWUpIHsKQEAgLTEyMTMsMjUgKzE2NzQsMzYgQEAKICAgICBjYXNlIFRQREVDX1BBUkFNX0JVUlNUX1BFUklPRDoKICAgICAgIGhUcC0+YnVyc3RQZXJpb2QgPSB2YWx1ZTsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgVFBERUNfUEFSQU1fUkVTRVQ6Ci0gICAgICB7Ci0gICAgICAgIGludCBpOworICAgIGNhc2UgVFBERUNfUEFSQU1fUkVTRVQ6IHsKKyAgICAgIGludCBpOwogCi0gICAgICAgIGZvciAoaT0wOyBpPCgxKjIpOyBpKyspIHsKLSAgICAgICAgICBGREtyZXNldEJpdGJ1ZmZlcigmaFRwLT5iaXRTdHJlYW1baV0pOwotICAgICAgICAgIGhUcC0+YXVMZW5ndGhbaV0gPSAwOwotICAgICAgICAgIGhUcC0+YWNjZXNzVW5pdEFuY2hvcltpXSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaFRwLT5mbGFncyAmPSB+KFRQREVDX1NZTkNPS3xUUERFQ19MT1NUX0ZSQU1FU19QRU5ESU5HKTsKLSAgICAgICAgaWYgKGhUcC0+dHJhbnNwb3J0Rm10ICE9IFRUX01QNF9BRElGKSB7Ci0gICAgICAgICAgaFRwLT5mbGFncyAmPSB+VFBERUNfQ09ORklHX0ZPVU5EOwotICAgICAgICB9Ci0gICAgICAgIGhUcC0+cmVtYWluZGVyID0gMDsKLSAgICAgICAgaFRwLT5hdmdCaXRSYXRlID0gMDsKLSAgICAgICAgaFRwLT5taXNzaW5nQWNjZXNzVW5pdHMgPSAwOwotICAgICAgICBoVHAtPm51bWJlck9mUmF3RGF0YUJsb2NrcyA9IDA7Ci0gICAgICAgIGhUcC0+Z2xvYmFsRnJhbWVQb3MgPSAwOwotICAgICAgICBoVHAtPmhvbGRPZmZGcmFtZXMgPSAwOworICAgICAgZm9yIChpID0gMDsgaSA8ICgxICogMSk7IGkrKykgeworICAgICAgICBGREtyZXNldEJpdGJ1ZmZlcigmaFRwLT5iaXRTdHJlYW1baV0pOworICAgICAgICBoVHAtPmF1TGVuZ3RoW2ldID0gMDsKKyAgICAgICAgaFRwLT5hY2Nlc3NVbml0QW5jaG9yW2ldID0gMDsKKyAgICAgIH0KKyAgICAgIGhUcC0+ZmxhZ3MgJj0gfihUUERFQ19TWU5DT0sgfCBUUERFQ19MT1NUX0ZSQU1FU19QRU5ESU5HKTsKKyAgICAgIGlmIChoVHAtPnRyYW5zcG9ydEZtdCAhPSBUVF9NUDRfQURJRikgeworICAgICAgICBoVHAtPmZsYWdzICY9IH5UUERFQ19DT05GSUdfRk9VTkQ7CisgICAgICB9CisgICAgICBoVHAtPnJlbWFpbmRlciA9IDA7CisgICAgICBoVHAtPmF2Z0JpdFJhdGUgPSAwOworICAgICAgaFRwLT5taXNzaW5nQWNjZXNzVW5pdHMgPSAwOworICAgICAgaFRwLT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPSAwOworICAgICAgaFRwLT5nbG9iYWxGcmFtZVBvcyA9IDA7CisgICAgICBoVHAtPmhvbGRPZmZGcmFtZXMgPSAwOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBUUERFQ19QQVJBTV9UQVJHRVRMQVlPVVQ6CisgICAgICBoVHAtPnRhcmdldExheW91dCA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUUERFQ19QQVJBTV9GT1JDRV9DT05GSUdfQ0hBTkdFOgorICAgICAgaFRwLT5jdHJsQ0ZHQ2hhbmdlW3ZhbHVlXS5mb3JjZUNmZ0NoYW5nZSA9IFRQREVDX0ZPUkNFX0NPTkZJR19DSEFOR0U7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRQREVDX1BBUkFNX1VTRV9FTEVNX1NLSVBQSU5HOgorICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgIGhUcC0+ZmxhZ3MgfD0gVFBERUNfVVNFX0VMRU1fU0tJUFBJTkc7CisgICAgICB9IGVsc2UgeworICAgICAgICBoVHAtPmZsYWdzICY9IH5UUERFQ19VU0VfRUxFTV9TS0lQUElORzsKICAgICAgIH0KICAgICAgIGJyZWFrOwogICB9CkBAIC0xMjM5LDM4ICsxNzExLDMwIEBACiAgIHJldHVybiBlcnJvcjsKIH0KIAotVUlOVCB0cmFuc3BvcnREZWNfR2V0TnJPZlN1YkZyYW1lcyhIQU5ETEVfVFJBTlNQT1JUREVDIGhUcCkKLXsKK1VJTlQgdHJhbnNwb3J0RGVjX0dldE5yT2ZTdWJGcmFtZXMoSEFORExFX1RSQU5TUE9SVERFQyBoVHApIHsKICAgVUlOVCBuU3ViRnJhbWVzID0gMDsKIAotICBpZiAoaFRwID09IE5VTEwpCi0gICAgcmV0dXJuIDA7CisgIGlmIChoVHAgPT0gTlVMTCkgcmV0dXJuIDA7CiAKLSAgaWYgKGhUcC0+dHJhbnNwb3J0Rm10PT1UVF9NUDRfTEFUTV9NQ1AxIHx8IGhUcC0+dHJhbnNwb3J0Rm10PT1UVF9NUDRfTEFUTV9NQ1AwIHx8IGhUcC0+dHJhbnNwb3J0Rm10PT1UVF9NUDRfTE9BUykKKyAgaWYgKGhUcC0+dHJhbnNwb3J0Rm10ID09IFRUX01QNF9MQVRNX01DUDEgfHwKKyAgICAgIGhUcC0+dHJhbnNwb3J0Rm10ID09IFRUX01QNF9MQVRNX01DUDAgfHwgaFRwLT50cmFuc3BvcnRGbXQgPT0gVFRfTVA0X0xPQVMpCiAgICAgblN1YkZyYW1lcyA9IENMYXRtRGVtdXhfR2V0TnJPZlN1YkZyYW1lcygmaFRwLT5wYXJzZXIubGF0bSk7Ci0gIGVsc2UgaWYgKGhUcC0+dHJhbnNwb3J0Rm10PT1UVF9NUDRfQURUUykKKyAgZWxzZSBpZiAoaFRwLT50cmFuc3BvcnRGbXQgPT0gVFRfTVA0X0FEVFMpCiAgICAgblN1YkZyYW1lcyA9IGhUcC0+cGFyc2VyLmFkdHMuYnMubnVtX3Jhd19ibG9ja3M7CiAKICAgcmV0dXJuIG5TdWJGcmFtZXM7CiB9CiAKLXZvaWQgdHJhbnNwb3J0RGVjX0Nsb3NlKEhBTkRMRV9UUkFOU1BPUlRERUMgKnBoVHApCi17Ci0gIGlmIChwaFRwICE9IE5VTEwpCi0gIHsKK3ZvaWQgdHJhbnNwb3J0RGVjX0Nsb3NlKEhBTkRMRV9UUkFOU1BPUlRERUMgKnBoVHApIHsKKyAgaWYgKHBoVHAgIT0gTlVMTCkgewogICAgIGlmICgqcGhUcCAhPSBOVUxMKSB7Ci0gICAgICBpZiAoICEgVFRfSVNfUEFDS0VUKCgqcGhUcCktPnRyYW5zcG9ydEZtdCkgKSB7Ci0gICAgICAgIEZyZWVSYW1fVHJhbnNwb3J0RGVjb2RlckJ1ZmZlcigmKCpwaFRwKS0+YnNCdWZmZXIpOwotICAgICAgfQotICAgICAgaWYgKCpwaFRwICE9IE5VTEwpIHsKLSAgICAgICAgRnJlZVJhbV9UcmFuc3BvcnREZWNvZGVyKHBoVHApOwotICAgICAgfQorICAgICAgRnJlZVJhbV9UcmFuc3BvcnREZWNvZGVyQnVmZmVyKCYoKnBoVHApLT5ic0J1ZmZlcik7CisgICAgICBGcmVlUmFtX1RyYW5zcG9ydERlY29kZXIocGhUcCk7CiAgICAgfQogICB9CiB9CiAKLVRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfR2V0TGliSW5mbyggTElCX0lORk8gKmluZm8gKQoteworVFJBTlNQT1JUREVDX0VSUk9SIHRyYW5zcG9ydERlY19HZXRMaWJJbmZvKExJQl9JTkZPICppbmZvKSB7CiAgIGludCBpOwogCiAgIGlmIChpbmZvID09IE5VTEwpIHsKQEAgLTEyODQsNyArMTc0OCw3IEBACiAgIGlmIChpID09IEZES19NT0RVTEVfTEFTVCkgcmV0dXJuIFRSQU5TUE9SVERFQ19VTktPV05fRVJST1I7CiAgIGluZm8gKz0gaTsKIAotICBpbmZvLT5tb2R1bGVfaWQgID0gRkRLX1RQREVDOworICBpbmZvLT5tb2R1bGVfaWQgPSBGREtfVFBERUM7CiAjaWZkZWYgX19BTkRST0lEX18KICAgaW5mby0+YnVpbGRfZGF0ZSA9ICIiOwogICBpbmZvLT5idWlsZF90aW1lID0gIiI7CkBAIC0xMjkyLDYzICsxNzU2LDY0IEBACiAgIGluZm8tPmJ1aWxkX2RhdGUgPSBfX0RBVEVfXzsKICAgaW5mby0+YnVpbGRfdGltZSA9IF9fVElNRV9fOwogI2VuZGlmCi0gIGluZm8tPnRpdGxlICAgICAgPSBUUF9MSUJfVElUTEU7Ci0gIGluZm8tPnZlcnNpb24gICAgPSBMSUJfVkVSU0lPTihUUF9MSUJfVkwwLCBUUF9MSUJfVkwxLCBUUF9MSUJfVkwyKTsKKyAgaW5mby0+dGl0bGUgPSBUUF9MSUJfVElUTEU7CisgIGluZm8tPnZlcnNpb24gPSBMSUJfVkVSU0lPTihUUF9MSUJfVkwwLCBUUF9MSUJfVkwxLCBUUF9MSUJfVkwyKTsKICAgTElCX1ZFUlNJT05fU1RSSU5HKGluZm8pOwotICBpbmZvLT5mbGFncyA9IDAKLSAgICB8IENBUEZfQURJRgotICAgIHwgQ0FQRl9BRFRTCi0gICAgfCBDQVBGX0xBVE0KLSAgICB8IENBUEZfTE9BUwotICAgIHwgQ0FQRl9SQVdQQUNLRVRTCi0gICAgfCBDQVBGX0RSTQotICAgIDsKKyAgaW5mby0+ZmxhZ3MgPSAwIHwgQ0FQRl9BRElGIHwgQ0FQRl9BRFRTIHwgQ0FQRl9MQVRNIHwgQ0FQRl9MT0FTIHwKKyAgICAgICAgICAgICAgICBDQVBGX1JBV1BBQ0tFVFMgfCBDQVBGX0RSTTsKIAogICByZXR1cm4gVFJBTlNQT1JUREVDX09LOyAvKiBGREtFUlJfTk9FUlJPUjsgKi8KIH0KIAotCi1pbnQgIHRyYW5zcG9ydERlY19DcmNTdGFydFJlZyhIQU5ETEVfVFJBTlNQT1JUREVDIHBUcCwgSU5UIG1CaXRzKQoteworaW50IHRyYW5zcG9ydERlY19DcmNTdGFydFJlZyhIQU5ETEVfVFJBTlNQT1JUREVDIHBUcCwgSU5UIG1CaXRzKSB7CiAgIHN3aXRjaCAocFRwLT50cmFuc3BvcnRGbXQpIHsKLSAgY2FzZSBUVF9NUDRfQURUUzoKLSAgICByZXR1cm4gYWR0c1JlYWRfQ3JjU3RhcnRSZWcoJnBUcC0+cGFyc2VyLmFkdHMsICZwVHAtPmJpdFN0cmVhbVswXSwgbUJpdHMpOwotICBjYXNlIFRUX0RSTToKLSAgICByZXR1cm4gZHJtUmVhZF9DcmNTdGFydFJlZygmcFRwLT5wYXJzZXIuZHJtLCAmcFRwLT5iaXRTdHJlYW1bMF0sIG1CaXRzKTsKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gMDsKKyAgICBjYXNlIFRUX01QNF9BRFRTOgorICAgICAgcmV0dXJuIGFkdHNSZWFkX0NyY1N0YXJ0UmVnKCZwVHAtPnBhcnNlci5hZHRzLCAmcFRwLT5iaXRTdHJlYW1bMF0sIG1CaXRzKTsKKyAgICBjYXNlIFRUX0RSTToKKyAgICAgIHJldHVybiBkcm1SZWFkX0NyY1N0YXJ0UmVnKCZwVHAtPnBhcnNlci5kcm0sICZwVHAtPmJpdFN0cmVhbVswXSwgbUJpdHMpOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gLTE7CiAgIH0KIH0KIAotdm9pZCB0cmFuc3BvcnREZWNfQ3JjRW5kUmVnKEhBTkRMRV9UUkFOU1BPUlRERUMgcFRwLCBJTlQgcmVnKQotewordm9pZCB0cmFuc3BvcnREZWNfQ3JjRW5kUmVnKEhBTkRMRV9UUkFOU1BPUlRERUMgcFRwLCBJTlQgcmVnKSB7CiAgIHN3aXRjaCAocFRwLT50cmFuc3BvcnRGbXQpIHsKLSAgY2FzZSBUVF9NUDRfQURUUzoKLSAgICBhZHRzUmVhZF9DcmNFbmRSZWcoJnBUcC0+cGFyc2VyLmFkdHMsICZwVHAtPmJpdFN0cmVhbVswXSwgcmVnKTsKLSAgICBicmVhazsKLSAgY2FzZSBUVF9EUk06Ci0gICAgZHJtUmVhZF9DcmNFbmRSZWcoJnBUcC0+cGFyc2VyLmRybSwgJnBUcC0+Yml0U3RyZWFtWzBdLCByZWcpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIGJyZWFrOworICAgIGNhc2UgVFRfTVA0X0FEVFM6CisgICAgICBhZHRzUmVhZF9DcmNFbmRSZWcoJnBUcC0+cGFyc2VyLmFkdHMsICZwVHAtPmJpdFN0cmVhbVswXSwgcmVnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFRfRFJNOgorICAgICAgZHJtUmVhZF9DcmNFbmRSZWcoJnBUcC0+cGFyc2VyLmRybSwgJnBUcC0+Yml0U3RyZWFtWzBdLCByZWcpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOwogICB9CiB9CiAKLVRSQU5TUE9SVERFQ19FUlJPUiB0cmFuc3BvcnREZWNfQ3JjQ2hlY2soSEFORExFX1RSQU5TUE9SVERFQyBwVHApCi17CitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0NyY0NoZWNrKEhBTkRMRV9UUkFOU1BPUlRERUMgcFRwKSB7CiAgIHN3aXRjaCAocFRwLT50cmFuc3BvcnRGbXQpIHsKLSAgY2FzZSBUVF9NUDRfQURUUzoKLSAgICBpZiAoIChwVHAtPnBhcnNlci5hZHRzLmJzLm51bV9yYXdfYmxvY2tzID4gMCkgJiYgKHBUcC0+cGFyc2VyLmFkdHMuYnMucHJvdGVjdGlvbl9hYnNlbnQgPT0gMCkgKQotICAgIHsKLSAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcyA9ICZwVHAtPmJpdFN0cmVhbVswXTsKLSAgICAgIAotICAgICAgdHJhbnNwb3J0RGVjX0FkanVzdEVuZE9mQWNjZXNzVW5pdChwVHApOwotICAgIH0KLSAgICByZXR1cm4gYWR0c1JlYWRfQ3JjQ2hlY2soJnBUcC0+cGFyc2VyLmFkdHMpOwotICBjYXNlIFRUX0RSTToKLSAgICByZXR1cm4gZHJtUmVhZF9DcmNDaGVjaygmcFRwLT5wYXJzZXIuZHJtKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gVFJBTlNQT1JUREVDX09LOworICAgIGNhc2UgVFRfTVA0X0FEVFM6CisgICAgICBpZiAoKHBUcC0+cGFyc2VyLmFkdHMuYnMubnVtX3Jhd19ibG9ja3MgPiAwKSAmJgorICAgICAgICAgIChwVHAtPnBhcnNlci5hZHRzLmJzLnByb3RlY3Rpb25fYWJzZW50ID09IDApKSB7CisgICAgICAgIHRyYW5zcG9ydERlY19BZGp1c3RFbmRPZkFjY2Vzc1VuaXQocFRwKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBhZHRzUmVhZF9DcmNDaGVjaygmcFRwLT5wYXJzZXIuYWR0cyk7CisgICAgY2FzZSBUVF9EUk06CisgICAgICByZXR1cm4gZHJtUmVhZF9DcmNDaGVjaygmcFRwLT5wYXJzZXIuZHJtKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19PSzsKICAgfQogfQorCitUUkFOU1BPUlRERUNfRVJST1IgdHJhbnNwb3J0RGVjX0RybVJhd1NkY0F1ZGlvQ29uZmlnX0NoZWNrKFVDSEFSICpjb25mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxlbmd0aCkgeworICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgYXNjOworICBGREtfQklUU1RSRUFNIGJzOworICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSAmYnM7CisKKyAgRkRLaW5pdEJpdFN0cmVhbShoQnMsIGNvbmYsIEJVRlNJWkVfRFVNTVlfVkFMVUUsIGxlbmd0aCA8PCAzLCBCU19SRUFERVIpOworCisgIFRSQU5TUE9SVERFQ19FUlJPUiBlcnIgPQorICAgICAgRHJtUmF3U2RjQXVkaW9Db25maWdfUGFyc2UoJmFzYywgaEJzLCBOVUxMLCAoVUNIQVIpQUNfQ01fQUxMT0NfTUVNLCAwKTsKKworICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL3NyYy92ZXJzaW9uIGIvbGliTXBlZ1RQRGVjL3NyYy92ZXJzaW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWUyMmM5Li4wMDAwMDAwCi0tLSBhL2xpYk1wZWdUUERlYy9zcmMvdmVyc2lvbgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotLyogbGlicmFyeSBpbmZvICovCi0jZGVmaW5lIFRQX0xJQl9WTDAgMgotI2RlZmluZSBUUF9MSUJfVkwxIDMKLSNkZWZpbmUgVFBfTElCX1ZMMiA3Ci0jZGVmaW5lIFRQX0xJQl9USVRMRSAiTVBFRyBUcmFuc3BvcnQiCi0jaWZkZWYgX19BTkRST0lEX18KLSNkZWZpbmUgVFBfTElCX0JVSUxEX0RBVEUgIiIKLSNkZWZpbmUgVFBfTElCX0JVSUxEX1RJTUUgIiIKLSNlbHNlCi0jZGVmaW5lIFRQX0xJQl9CVUlMRF9EQVRFIF9fREFURV9fCi0jZGVmaW5lIFRQX0xJQl9CVUlMRF9USU1FIF9fVElNRV9fCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYk1wZWdUUEVuYy9pbmNsdWRlL21wZWdGaWxlV3JpdGUuaCBiL2xpYk1wZWdUUEVuYy9pbmNsdWRlL21wZWdGaWxlV3JpdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg4NmEwYi4uMDAwMDAwMAotLS0gYS9saWJNcGVnVFBFbmMvaW5jbHVkZS9tcGVnRmlsZVdyaXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRy00IEFBQyBEZWNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgotICAgRGVzY3JpcHRpb246IEJpdHN0cmVhbSBkYXRhIHByb3ZpZGVyIGZvciBNUDQgZGVjb2RlcnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCi0jaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCi0KLS8qITwgSWYgTVBGV1JJVEVfTVA0RkZfRU5BQkxFIGlzIHNldCwgaW5jbHVkZSBzdXBwb3J0IGZvciBNUEVHIElTTyBmaWxlZm9ybWF0LgotICAgICBJZiBub3Qgc2V0LCBubyAubXA0LCAubTRhIGFuZCAuM2dwIGZpbGVzIGNhbiBiZSB1c2VkIGZvciBpbnB1dC4gICovCi0vKiAjZGVmaW5lIE1QRldSSVRFX01QNEZGX0VOQUJMRSAqLwotCi10eXBlZGVmIHN0cnVjdCBTVFJVQ1RfRklMRVdSSVRFICpIQU5ETEVfRklMRVdSSVRFOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICogXGJyaWVmICAgICAgICAgICAgICAgICAgICAgICAgIE9wZW4gYW4gTVBFRyBhdWRpbyBmaWxlLgotICogXHBhcmFtIG1wZWdGaWxlV3JpdGVfRmlsZW5hbWUgIFN0cmluZyBvZiB0aGUgZmlsZW5hbWUgdG8gYmUgb3BlbmVkLgotICogXHBhcmFtIGZpbGVGbXQgICAgICAgICAgICAgICAgIFRyYW5zcG9ydCBmb3JtYXQgdG8gdXNlLgotICogXHBhcmFtIGNvbmYKLSAqIFxwYXJhbSBjb25mU2l6ZQotICogXHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgIE1QRUcgZmlsZSB3cml0ZSBoYW5kbGUuCi0gKi8KLUhBTkRMRV9GSUxFV1JJVEUgbXBlZ0ZpbGVXcml0ZV9PcGVuKCBjaGFyICAgICAgICAgICAqbXBlZ0ZpbGVXcml0ZV9GaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX0ZPUk1BVCAgICAgZmlsZUZtdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPUlRfVFlQRSAgdHJhbnNwb3J0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAqY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgY29uZlNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBcYnJpZWYgICAgICAgICAgICAgV3JpdGUgdG8gYW4gTVBFRyBhdWRpbyBmaWxlLgotICogXHBhcmFtIGluQnVmZmVyICAgIEJ1ZmZlciB0byB3cml0ZS4KLSAqIFxwYXJhbSBidWZmZXJTaXplICBTaXplIG9mIGJ1ZmZlciB0byB3cml0ZSBpbiBieXRlcy4KLSAqIFxyZXR1cm4gICAgICAgICAgICAwIG9uIHN1Y2VzcywgLTEgb24gdW5zdXBwb3J0ZWQgZmlsZSBmb3JtYXQgb3Igd3JpdGUgZXJyb3IuCi0gKi8KLWludCBtcGVnRmlsZVdyaXRlX1dyaXRlKCBIQU5ETEVfRklMRVdSSVRFICBoRmlsZVdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgKmluQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgYnVmZmVyU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIFxicmllZiAgICAgICAgICAgICBEZWFsbG9jYXRlIG1lbW9yeSBhbmQgY2xvc2UgZmlsZS4KLSAqIFxwYXJhbSBoRmlsZVdyaXRlICBNUEVHIGZpbGUgd3JpdGUgaGFuZGxlLgotICogXHJldHVybiAgICAgICAgICAgIDAgb24gc3VjZXNzLgotICovCi1pbnQgbXBlZ0ZpbGVXcml0ZV9DbG9zZSggSEFORExFX0ZJTEVXUklURSAqaEZpbGVXcml0ZSApOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJNcGVnVFBFbmMvaW5jbHVkZS90cF9kYXRhLmggYi9saWJNcGVnVFBFbmMvaW5jbHVkZS90cF9kYXRhLmgKaW5kZXggYzZlODliNS4uNmYwMzJkMSAxMDA2NDQKLS0tIGEvbGliTXBlZ1RQRW5jL2luY2x1ZGUvdHBfZGF0YS5oCisrKyBiL2xpYk1wZWdUUEVuYy9pbmNsdWRlL3RwX2RhdGEuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNyArOTAsMTggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEF1dGhvcihzKTogTWFudWVsIEphbmRlcgorICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKKwogICAgRGVzY3JpcHRpb246IE1QRUcgVHJhbnNwb3J0IGRhdGEgdGFibGVzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgX19UUF9EQVRBX0hfXwotI2RlZmluZSBfX1RQX0RBVEFfSF9fCisjaWZuZGVmIFRQX0RBVEFfSAorI2RlZmluZSBUUF9EQVRBX0gKIAogI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgogI2luY2x1ZGUgIkZES19hdWRpby5oIgpAQCAtOTgsMTcgKzExMCwzNSBAQAogLyoKICAqIENvbmZpZ3VyYXRpb24KICAqLwotI2RlZmluZSBUUF9HQV9FTkFCTEUKLS8qICNkZWZpbmUgVFBfQ0VMUF9FTkFCTEUgKi8KLS8qICNkZWZpbmUgVFBfSFZYQ19FTkFCTEUgKi8KLS8qICNkZWZpbmUgVFBfU0xTX0VOQUJMRSAqLwotI2RlZmluZSBUUF9FTERfRU5BQkxFCi0vKiAjZGVmaW5lIFRQX1VTQUNfRU5BQkxFICovCi0vKiAjZGVmaW5lIFRQX1JTVkQ1MF9FTkFCTEUgKi8KIAotI2lmIGRlZmluZWQoVFBfR0FfRU5BQkxFKSB8fCBkZWZpbmVkKFRQX1NMU19FTkFCTEUpCi0jZGVmaW5lIFRQX1BDRV9FTkFCTEUgICAgICAgLyoqPCBFbmFibGUgZnVsbCBQQ0Ugc3VwcG9ydCAqLwotI2VuZGlmCisjZGVmaW5lIFRQX1VTQUNfTUFYX1NQRUFLRVJTICgyNCkKKworI2RlZmluZSBUUF9VU0FDX01BWF9FWFRfRUxFTUVOVFMgKCgyNCkpCisKKyNkZWZpbmUgVFBfVVNBQ19NQVhfRUxFTUVOVFMgKCgyNCkgKyBUUF9VU0FDX01BWF9FWFRfRUxFTUVOVFMpCisKKyNkZWZpbmUgVFBfVVNBQ19NQVhfQ09ORklHX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA1MTIgLyogbmV4dCBwb3dlciBvZiB0d28gb2YgbWF4aW11bSBvZiBlc2NhcGVkVmFsdWUoaEJzLCA0LCA0LCA4KSBpbiBcCisgICAgICAgICBBdWRpb1ByZVJvbGwoKSAoMjg1KSAqLworCisjZGVmaW5lIFRQREVDX1VTQUNfTlVNX0NPTkZJR19DSEFOR0VfRlJBTUVTIFwKKyAgKDEpIC8qIE51bWJlciBvZiBmcmFtZXMgZm9yIGNvbmZpZyBjaGFuZ2UgaW4gVVNBQyAqLworCitlbnVtIHsKKyAgVFBERUNfRkxVU0hfT0ZGID0gMCwKKyAgVFBERUNfUlNWNjBfQ0ZHX0NIQU5HRV9BVFNDX0ZMVVNIX09OID0gMSwKKyAgVFBERUNfUlNWNjBfREFTSF9JUEZfQVRTQ19GTFVTSF9PTiA9IDIsCisgIFRQREVDX1VTQUNfREFTSF9JUEZfRkxVU0hfT04gPSAzCit9OworCitlbnVtIHsKKyAgVFBERUNfQlVJTERfVVBfT0ZGID0gMCwKKyAgVFBERUNfUlNWNjBfQlVJTERfVVBfT04gPSAxLAorICBUUERFQ19SU1Y2MF9CVUlMRF9VUF9PTl9JTl9CQU5EID0gMiwKKyAgVFBERUNfVVNBQ19CVUlMRF9VUF9PTiA9IDMsCisgIFRQREVDX1JTVjYwX0JVSUxEX1VQX0lETEUgPSA0LAorICBUUERFQ19SU1Y2MF9CVUlMRF9VUF9JRExFX0lOX0JBTkQgPSA1Cit9OwogCiAvKioKICAqIFByb2dyYW1Db25maWcgc3RydWN0LgpAQCAtMTE2LDEzICsxNDYsMTIgQEAKIC8qIElTTy9JRUMgMTQ0OTYtMyA0LjQuMS4xIFRhYmxlIDQuMiBQcm9ncmFtIGNvbmZpZyBlbGVtZW50ICovCiAjZGVmaW5lIFBDX0ZTQl9DSEFOTkVMU19NQVggMTYgLyogRnJvbnQvU2lkZS9CYWNrIGNoYW5uZWxzICovCiAjZGVmaW5lIFBDX0xGRV9DSEFOTkVMU19NQVggNAotI2RlZmluZSBQQ19BU1NPQ0RBVEFfTUFYICAgIDgKLSNkZWZpbmUgUENfQ0NFTF9NQVggICAgICAgICAxNiAvKiBDQyBlbGVtZW50cyAqLwotI2RlZmluZSBQQ19DT01NRU5UTEVOR1RIICAgIDI1NgorI2RlZmluZSBQQ19BU1NPQ0RBVEFfTUFYIDgKKyNkZWZpbmUgUENfQ0NFTF9NQVggMTYgLyogQ0MgZWxlbWVudHMgKi8KKyNkZWZpbmUgUENfQ09NTUVOVExFTkdUSCAyNTYKKyNkZWZpbmUgUENfTlVNX0hFSUdIVF9MQVlFUiAzCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0jaWZkZWYgVFBfUENFX0VOQUJMRQordHlwZWRlZiBzdHJ1Y3QgewogICAvKiBQQ0UgYml0c3RyZWFtIGVsZW1lbnRzOiAqLwogICBVQ0hBUiBFbGVtZW50SW5zdGFuY2VUYWc7CiAgIFVDSEFSIFByb2ZpbGU7CkBAIC0xNjUsNTQgKzE5NCw1MCBAQAogCiAgIFVDSEFSIENvbW1lbnRGaWVsZEJ5dGVzOwogICBVQ0hBUiBDb21tZW50W1BDX0NPTU1FTlRMRU5HVEhdOwotI2VuZGlmIC8qIFRQX1BDRV9FTkFCTEUgKi8KIAogICAvKiBIZWxwZXIgdmFyaWFibGVzIGZvciBhZG1pbmlzdHJhdGlvbjogKi8KLSAgVUNIQVIgaXNWYWxpZDsgICAgICAgICAgICAgICAvKiE8IEZsYWcgc2hvd2luZyBpZiBQQ0UgaGFzIGJlZW4gcmVhZCBzdWNjZXNzZnVsbHkuICovCi0gIFVDSEFSIE51bUNoYW5uZWxzOyAgICAgICAgICAgLyohPCBBbW91bnQgb2YgYXVkaW8gY2hhbm5lbHMgc3VtbWluZyBhbGwgY2hhbm5lbCBlbGVtZW50cyBpbmNsdWRpbmcgTEZFcyAqLwotICBVQ0hBUiBOdW1FZmZlY3RpdmVDaGFubmVsczsgIC8qITwgQW1vdW50IG9mIGF1ZGlvIGNoYW5uZWxzIHN1bW1pbmcgb25seSBTQ0VzIGFuZCBDUEVzICovCisgIFVDSEFSIGlzVmFsaWQ7IC8qITwgRmxhZyBzaG93aW5nIGlmIFBDRSBoYXMgYmVlbiByZWFkIHN1Y2Nlc3NmdWxseS4gKi8KKyAgVUNIQVIKKyAgTnVtQ2hhbm5lbHM7IC8qITwgQW1vdW50IG9mIGF1ZGlvIGNoYW5uZWxzIHN1bW1pbmcgYWxsIGNoYW5uZWwgZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgIGluY2x1ZGluZyBMRkVzICovCisgIFVDSEFSIE51bUVmZmVjdGl2ZUNoYW5uZWxzOyAvKiE8IEFtb3VudCBvZiBhdWRpbyBjaGFubmVscyBzdW1taW5nIG9ubHkgU0NFcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIENQRXMgKi8KICAgVUNIQVIgZWxDb3VudGVyOwogCiB9IENQcm9ncmFtQ29uZmlnOwogCiB0eXBlZGVmIGVudW0gewogICBBU0NFWFRfVU5LT1dOID0gLTEsCi0gIEFTQ0VYVF9TQlIgICAgPSAweDJiNywKLSAgQVNDRVhUX1BTICAgICA9IDB4NTQ4LAotICBBU0NFWFRfTVBTICAgID0gMHg3NmEsCi0gIEFTQ0VYVF9TQU9DICAgPSAweDdjYiwKLSAgQVNDRVhUX0xETVBTICA9IDB4N2NjCisgIEFTQ0VYVF9TQlIgPSAweDJiNywKKyAgQVNDRVhUX1BTID0gMHg1NDgsCisgIEFTQ0VYVF9NUFMgPSAweDc2YSwKKyAgQVNDRVhUX1NBT0MgPSAweDdjYiwKKyAgQVNDRVhUX0xETVBTID0gMHg3Y2MKIAogfSBUUF9BU0NfRVhURU5TSU9OX0lEOwogCi0jaWZkZWYgVFBfR0FfRU5BQkxFCiAvKioKICAqIEdhU3BlY2lmaWNDb25maWcgc3RydWN0CiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKLSAgVUlOVCBtX2ZyYW1lTGVuZ3RoRmxhZyA7Ci0gIFVJTlQgbV9kZXBlbmRzT25Db3JlQ29kZXIgOwotICBVSU5UIG1fY29yZUNvZGVyRGVsYXkgOworICBVSU5UIG1fZnJhbWVMZW5ndGhGbGFnOworICBVSU5UIG1fZGVwZW5kc09uQ29yZUNvZGVyOworICBVSU5UIG1fY29yZUNvZGVyRGVsYXk7CiAKLSAgVUlOVCBtX2V4dGVuc2lvbkZsYWcgOwotICBVSU5UIG1fZXh0ZW5zaW9uRmxhZzMgOworICBVSU5UIG1fZXh0ZW5zaW9uRmxhZzsKKyAgVUlOVCBtX2V4dGVuc2lvbkZsYWczOwogCiAgIFVJTlQgbV9sYXllcjsKICAgVUlOVCBtX251bU9mU3ViRnJhbWU7CiAgIFVJTlQgbV9sYXllckxlbmd0aDsKIAogfSBDU0dhU3BlY2lmaWNDb25maWc7Ci0jZW5kaWYgLyogVFBfR0FfRU5BQkxFICovCi0KLQotCi0KLSNpZmRlZiBUUF9FTERfRU5BQkxFCiAKIHR5cGVkZWYgZW51bSB7Ci0gIEVMREVYVF9URVJNICA9IDB4MCwgICAvKiBUZXJtaW5hdGlvbiB0YWcgKi8KLSAgRUxERVhUX1NBT0MgID0gMHgxLCAgIC8qIFNBT0MgY29uZmlnICovCi0gIEVMREVYVF9MRFNBQyA9IDB4MiAgICAvKiBMRCBNUEVHIFN1cnJvdW5kIGNvbmZpZyAqLworICBFTERFWFRfVEVSTSA9IDB4MCwgICAgICAgICAvKiBUZXJtaW5hdGlvbiB0YWcgKi8KKyAgRUxERVhUX1NBT0MgPSAweDEsICAgICAgICAgLyogU0FPQyBjb25maWcgKi8KKyAgRUxERVhUX0xEU0FDID0gMHgyLCAgICAgICAgLyogTEQgTVBFRyBTdXJyb3VuZCBjb25maWcgKi8KKyAgRUxERVhUX0RPV05TQ0FMRUlORk8gPSAweDMgLyogRUxEIHNhbXBsZSByYXRlIGFkYXB0YXRpb24gKi8KICAgLyogcmVzZXJ2ZWQgKi8KIH0gQVNDX0VMRF9FWFRfVFlQRTsKIApAQCAtMjIwLDEwMyArMjQ1LDE4NiBAQAogICBVQ0hBUiBtX2ZyYW1lTGVuZ3RoRmxhZzsKIAogICBVQ0hBUiBtX3NiclByZXNlbnRGbGFnOwotICBVQ0hBUiBtX3VzZUxkUW1mVGltZUFsaWduOyAgLyogVXNlIExELU1QUyBRTUYgaW4gU0JSIHRvIGFjaGl2ZSB0aW1lIGFsaWdubWVudCAqLworICBVQ0hBUgorICBtX3VzZUxkUW1mVGltZUFsaWduOyAvKiBVc2UgTEQtTVBTIFFNRiBpbiBTQlIgdG8gYWNoaXZlIHRpbWUgYWxpZ25tZW50ICovCiAgIFVDSEFSIG1fc2JyU2FtcGxpbmdSYXRlOwogICBVQ0hBUiBtX3NickNyY0ZsYWc7CisgIFVJTlQgbV9kb3duc2NhbGVkU2FtcGxpbmdGcmVxdWVuY3k7CiAKIH0gQ1NFbGRTcGVjaWZpY0NvbmZpZzsKLSNlbmRpZiAvKiBUUF9FTERfRU5BQkxFICovCiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgVVNBQ19FWFRfRUxFTUVOVF9UWVBFIHVzYWNFeHRFbGVtZW50VHlwZTsKKyAgVVNIT1JUIHVzYWNFeHRFbGVtZW50Q29uZmlnTGVuZ3RoOworICBVU0hPUlQgdXNhY0V4dEVsZW1lbnREZWZhdWx0TGVuZ3RoOworICBVQ0hBUiB1c2FjRXh0RWxlbWVudFBheWxvYWRGcmFnOworICBVQ0hBUiB1c2FjRXh0RWxlbWVudEhhc0F1ZGlvUHJlUm9sbDsKK30gQ1NVc2FjRXh0RWxlbWVudENvbmZpZzsKIAordHlwZWRlZiBzdHJ1Y3QgeworICBNUDRfRUxFTUVOVF9JRCB1c2FjRWxlbWVudFR5cGU7CisgIFVDSEFSIG1fbm9pc2VGaWxsaW5nOworICBVQ0hBUiBtX2hhcm1vbmljU0JSOworICBVQ0hBUiBtX2ludGVyVGVzOworICBVQ0hBUiBtX3B2YzsKKyAgVUNIQVIgbV9zdGVyZW9Db25maWdJbmRleDsKKyAgQ1NVc2FjRXh0RWxlbWVudENvbmZpZyBleHRFbGVtZW50OworfSBDU1VzYWNFbGVtZW50Q29uZmlnOwogCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIG1fZnJhbWVMZW5ndGhGbGFnOworICBVQ0hBUiBtX2NvcmVTYnJGcmFtZUxlbmd0aEluZGV4OworICBVQ0hBUiBtX3NiclJhdGlvSW5kZXg7CisgIFVDSEFSIG1fblVzYWNDaGFubmVsczsgLyogbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHNpZ25hbGVkIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNhY0RlY29kZXJDb25maWcoKSAvIHJzdjYwM2RhRGVjb2RlckNvbmZpZygpIHZpYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUVsZW1lbnRzIGFuZCB1c2FjRWxlbWVudFR5cGUgKi8KKyAgVUNIQVIgbV9jaGFubmVsQ29uZmlndXJhdGlvbkluZGV4OworICBVSU5UIG1fdXNhY051bUVsZW1lbnRzOworICBDU1VzYWNFbGVtZW50Q29uZmlnIGVsZW1lbnRbVFBfVVNBQ19NQVhfRUxFTUVOVFNdOworCisgIFVDSEFSIG51bUF1ZGlvQ2hhbm5lbHM7CisgIFVDSEFSIG1fdXNhY0NvbmZpZ0V4dGVuc2lvblByZXNlbnQ7CisgIFVDSEFSIGVsZW1lbnRMZW5ndGhQcmVzZW50OworICBVQ0hBUiBVc2FjQ29uZmlnW1RQX1VTQUNfTUFYX0NPTkZJR19MRU5dOworICBVU0hPUlQgVXNhY0NvbmZpZ0JpdHM7Cit9IENTVXNhY0NvbmZpZzsKIAogLyoqCiAgKiBBdWRpbyBjb25maWd1cmF0aW9uIHN0cnVjdCwgc3VpdGFibGUgZm9yIGVuY29kZXIgYW5kIGRlY29kZXIgY29uZmlndXJhdGlvbi4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgewotCiAgIC8qIFhZWiBTcGVjaWZpYyBEYXRhICovCiAgIHVuaW9uIHsKLSNpZmRlZiBUUF9HQV9FTkFCTEUKLSAgICBDU0dhU3BlY2lmaWNDb25maWcgICAgbV9nYVNwZWNpZmljQ29uZmlnOyAgICAgICAvKio8IEdlbmVyYWwgYXVkaW8gc3BlY2lmaWMgY29uZmlndXJhdGlvbi4gICAgICAgICAqLwotI2VuZGlmIC8qIFRQX0dBX0VOQUJMRSAqLwotI2lmZGVmIFRQX0VMRF9FTkFCTEUKLSAgICBDU0VsZFNwZWNpZmljQ29uZmlnICAgbV9lbGRTcGVjaWZpY0NvbmZpZzsgICAgICAvKio8IEVMRCBzcGVjaWZpYyBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAqLwotI2VuZGlmIC8qIFRQX0VMRF9FTkFCTEUgKi8KKyAgICBDU0dhU3BlY2lmaWNDb25maWcKKyAgICAgICAgbV9nYVNwZWNpZmljQ29uZmlnOyAvKio8IEdlbmVyYWwgYXVkaW8gc3BlY2lmaWMgY29uZmlndXJhdGlvbi4gKi8KKyAgICBDU0VsZFNwZWNpZmljQ29uZmlnIG1fZWxkU3BlY2lmaWNDb25maWc7IC8qKjwgRUxEIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uICovCisgICAgQ1NVc2FjQ29uZmlnIG1fdXNhY0NvbmZpZzsgLyoqPCBVU0FDIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAqLwogICB9IG1fc2M7Ci0gIAorCiAgIC8qIENvbW1vbiBBU0MgcGFyYW1ldGVycyAqLwotI2lmZGVmIFRQX1BDRV9FTkFCTEUKLSAgQ1Byb2dyYW1Db25maWcgICAgICAgIG1fcHJvZ3JDb25maWdFbGVtZW50OyAgICAgLyoqPCBQcm9ncmFtIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2VuZGlmIC8qIFRQX1BDRV9FTkFCTEUgKi8KKyAgQ1Byb2dyYW1Db25maWcgbV9wcm9nckNvbmZpZ0VsZW1lbnQ7IC8qKjwgUHJvZ3JhbSBjb25maWd1cmF0aW9uLiAqLwogCi0gIEFVRElPX09CSkVDVF9UWVBFICAgICBtX2FvdDsgICAgICAgICAgICAgICAgICAgIC8qKjwgQXVkaW8gT2JqZWN0IFR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgVUlOVCAgICAgICAgICAgICAgICAgIG1fc2FtcGxpbmdGcmVxdWVuY3k7ICAgICAgLyoqPCBTYW1wbGVyYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBVSU5UICAgICAgICAgICAgICAgICAgbV9zYW1wbGVzUGVyRnJhbWU7ICAgICAgICAvKio8IEFtb3VudCBvZiBzYW1wbGVzIHBlciBmcmFtZS4gICAgICAgICAgICAgICAgICAgICovCi0gIFVJTlQgICAgICAgICAgICAgICAgICBtX2RpcmVjdE1hcHBpbmc7ICAgICAgICAgIC8qKjwgRG9jdW1lbnQgdGhpcyBwbGVhc2UgISEgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQVVESU9fT0JKRUNUX1RZUEUgbV9hb3Q7ICAvKio8IEF1ZGlvIE9iamVjdCBUeXBlLiAgKi8KKyAgVUlOVCBtX3NhbXBsaW5nRnJlcXVlbmN5OyAvKio8IFNhbXBsZXJhdGUuICovCisgIFVJTlQgbV9zYW1wbGVzUGVyRnJhbWU7ICAgLyoqPCBBbW91bnQgb2Ygc2FtcGxlcyBwZXIgZnJhbWUuICAgKi8KKyAgVUlOVCBtX2RpcmVjdE1hcHBpbmc7IC8qKjwgRG9jdW1lbnQgdGhpcyBwbGVhc2UgISEgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotICBBVURJT19PQkpFQ1RfVFlQRSAgICAgbV9leHRlbnNpb25BdWRpb09iamVjdFR5cGU7ICAgICAgICAvKio8IEF1ZGlvIG9iamVjdCB0eXBlICAgICAgICAgICAgICAgICAgICAgICovCi0gIFVJTlQgICAgICAgICAgICAgICAgICBtX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5OyAgICAgIC8qKjwgU2FtcGxlcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIAorICBBVURJT19PQkpFQ1RfVFlQRSBtX2V4dGVuc2lvbkF1ZGlvT2JqZWN0VHlwZTsgLyoqPCBBdWRpbyBvYmplY3QgdHlwZSAqLworICBVSU5UIG1fZXh0ZW5zaW9uU2FtcGxpbmdGcmVxdWVuY3k7ICAgICAgICAgICAgLyoqPCBTYW1wbGVyYXRlICAgICAgICAgICAgKi8KIAotICBTQ0hBUiAgICAgICAgICAgICAgICAgbV9jaGFubmVsQ29uZmlndXJhdGlvbjsgICAvKio8IENoYW5uZWwgY29uZmlndXJhdGlvbiBpbmRleCAgICAgICAgICAgICAgICAgICAgICovCisgIFNDSEFSIG1fY2hhbm5lbENvbmZpZ3VyYXRpb247IC8qKjwgQ2hhbm5lbCBjb25maWd1cmF0aW9uIGluZGV4ICovCiAKLSAgU0NIQVIgICAgICAgICAgICAgICAgIG1fZXBDb25maWc7ICAgICAgICAgICAgICAgLyoqPCBFcnJvciBwcm90ZWN0aW9uIGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgU0NIQVIgICAgICAgICAgICAgICAgIG1fdmNiMTFGbGFnOyAgICAgICAgICAgICAgLyoqPCBhYWNTZWN0aW9uRGF0YVJlc2lsaWVuY2VGbGFnICAgICAgICAgICAgICAgICAgICAgKi8KLSAgU0NIQVIgICAgICAgICAgICAgICAgIG1fcnZsY0ZsYWc7ICAgICAgICAgICAgICAgLyoqPCBhYWNTY2FsZWZhY3RvckRhdGFSZXNpbGllbmNlRmxhZyAgICAgICAgICAgICAgICAgKi8KLSAgU0NIQVIgICAgICAgICAgICAgICAgIG1faGNyRmxhZzsgICAgICAgICAgICAgICAgLyoqPCBhYWNTcGVjdHJhbERhdGFSZXNpbGllbmNlRmxhZyAgICAgICAgICAgICAgICAgICAgKi8KKyAgU0NIQVIgbV9lcENvbmZpZzsgIC8qKjwgRXJyb3IgcHJvdGVjdGlvbiBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNDSEFSIG1fdmNiMTFGbGFnOyAvKio8IGFhY1NlY3Rpb25EYXRhUmVzaWxpZW5jZUZsYWcgICAgICAgICAgICAgICAgICAgICAqLworICBTQ0hBUiBtX3J2bGNGbGFnOyAgLyoqPCBhYWNTY2FsZWZhY3RvckRhdGFSZXNpbGllbmNlRmxhZyAgICAgICAgICAgICAgICAgKi8KKyAgU0NIQVIgbV9oY3JGbGFnOyAgIC8qKjwgYWFjU3BlY3RyYWxEYXRhUmVzaWxpZW5jZUZsYWcgICAgICAgICAgICAgICAgICAgICovCiAKLSAgU0NIQVIgICAgICAgICAgICAgICAgIG1fc2JyUHJlc2VudEZsYWc7ICAgICAgICAgLyoqPCBGbGFnIGluZGljYXRpbmcgdGhlIHByZXNlbmNlIG9mIFNCUiBkYXRhIGluIHRoZSBiaXRzdHJlYW0gICAgICAgICAgICAgICAqLwotICBTQ0hBUiAgICAgICAgICAgICAgICAgbV9wc1ByZXNlbnRGbGFnOyAgICAgICAgICAvKio8IEZsYWcgaW5kaWNhdGluZyB0aGUgcHJlc2VuY2Ugb2YgcGFyYW1ldHJpYyBzdGVyZW8gZGF0YSBpbiB0aGUgYml0c3RyZWFtICovCi0gIFVDSEFSICAgICAgICAgICAgICAgICBtX3NhbXBsaW5nRnJlcXVlbmN5SW5kZXg7IC8qKjwgU2FtcGxlcmF0ZSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFVDSEFSICAgICAgICAgICAgICAgICBtX2V4dGVuc2lvblNhbXBsaW5nRnJlcXVlbmN5SW5kZXg7IC8qKjwgU2FtcGxlcmF0ZSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFNDSEFSICAgICAgICAgICAgICAgICBtX2V4dGVuc2lvbkNoYW5uZWxDb25maWd1cmF0aW9uOyAgIC8qKjwgQ2hhbm5lbCBjb25maWd1cmF0aW9uIGluZGV4ICAgICAgICAgICAgICovCisgIFNDSEFSIG1fc2JyUHJlc2VudEZsYWc7IC8qKjwgRmxhZyBpbmRpY2F0aW5nIHRoZSBwcmVzZW5jZSBvZiBTQlIgZGF0YSBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtICAgICAgICAgICAgICAgKi8KKyAgU0NIQVIKKyAgbV9wc1ByZXNlbnRGbGFnOyAvKio8IEZsYWcgaW5kaWNhdGluZyB0aGUgcHJlc2VuY2Ugb2YgcGFyYW1ldHJpYyBzdGVyZW8KKyAgICAgICAgICAgICAgICAgICAgICBkYXRhIGluIHRoZSBiaXRzdHJlYW0gKi8KKyAgVUNIQVIgbV9zYW1wbGluZ0ZyZXF1ZW5jeUluZGV4OyAgICAgICAgICAvKio8IFNhbXBsZXJhdGUgaW5kZXggICAgICAgICAgKi8KKyAgVUNIQVIgbV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeUluZGV4OyAvKio8IFNhbXBsZXJhdGUgaW5kZXggKi8KKyAgU0NIQVIgbV9leHRlbnNpb25DaGFubmVsQ29uZmlndXJhdGlvbjsgICAvKio8IENoYW5uZWwgY29uZmlndXJhdGlvbiBpbmRleCAgICovCisKKyAgVUNIQVIKKyAgY29uZmlnTW9kZTsgLyoqPCBUaGUgZmxhZyBpbmRpY2F0ZXMgaWYgdGhlIGNhbGxiYWNrIHNoYWxsIHdvcmsgaW4gbWVtb3J5CisgICAgICAgICAgICAgICAgIGFsbG9jYXRpb24gbW9kZSBvciBpbiBjb25maWcgY2hhbmdlIGRldGVjdGlvbiBtb2RlICovCisgIFVDSEFSIEFhY0NvbmZpZ0NoYW5nZWQ7IC8qKjwgVGhlIGZsYWcgd2lsbCBiZSBzZXQgaWYgYXQgbGVhc3Qgb25lIGFhYyBjb25maWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGhhcyBjaGFuZ2VkIHRoYXQgcmVxdWlyZXMgYSBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25maWd1cmF0aW9uLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBjbGVhcmVkICovCisgIFVDSEFSIFNickNvbmZpZ0NoYW5nZWQ7IC8qKjwgVGhlIGZsYWcgd2lsbCBiZSBzZXQgaWYgYXQgbGVhc3Qgb25lIHNiciBjb25maWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGhhcyBjaGFuZ2VkIHRoYXQgcmVxdWlyZXMgYSBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25maWd1cmF0aW9uLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBjbGVhcmVkICovCisgIFVDSEFSIFNhY0NvbmZpZ0NoYW5nZWQ7IC8qKjwgVGhlIGZsYWcgd2lsbCBiZSBzZXQgaWYgYXQgbGVhc3Qgb25lIHNhYyBjb25maWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGhhcyBjaGFuZ2VkIHRoYXQgcmVxdWlyZXMgYSBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25maWd1cmF0aW9uLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBjbGVhcmVkICovCisKKyAgVUNIQVIKKyAgY29uZmlnW1RQX1VTQUNfTUFYX0NPTkZJR19MRU5dOyAvKio8IENvbmZpZ3VyYXRpb24gc3RvcmVkIGFzIGJpdHN0cmVhbSAqLworICBVSU5UIGNvbmZpZ0JpdHM7ICAgICAgICAgICAgICAgIC8qKjwgQ29uZmlndXJhdGlvbiBsZW5ndGggaW4gYml0cyAqLwogCiB9IENTQXVkaW9TcGVjaWZpY0NvbmZpZzsKIAotdHlwZWRlZiBJTlQgKCpjYlVwZGF0ZUNvbmZpZ190KSh2b2lkKiwgY29uc3QgQ1NBdWRpb1NwZWNpZmljQ29uZmlnKik7Ci10eXBlZGVmIElOVCAoKmNiU3NjX3QpKAotICAgICAgICB2b2lkKiwgSEFORExFX0ZES19CSVRTVFJFQU0sCi0gICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKLSAgICAgICAgY29uc3QgSU5UIHNhbXBsaW5nRnJlcXVlbmN5LAotICAgICAgICBjb25zdCBJTlQgbXV4TW9kZSwKLSAgICAgICAgY29uc3QgSU5UIGNvbmZpZ0J5dGVzCi0gICAgICAgICk7Ci10eXBlZGVmIElOVCAoKmNiU2JyX3QpKAotICAgICAgICB2b2lkICogICAgICAgICAgICAgICAgICBzZWxmLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICBoQnMsCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGVSYXRlSW4sCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGVSYXRlT3V0LAotICAgICAgICBjb25zdCBJTlQgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsCi0gICAgICAgIGNvbnN0IE1QNF9FTEVNRU5UX0lEICAgIGVsZW1lbnRJRCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgZWxlbWVudEluZGV4Ci0gICAgICAgICk7Cit0eXBlZGVmIHN0cnVjdCB7CisgIFNDSEFSIGZsdXNoQ250OyAgICAgIC8qKjwgRmx1c2ggZnJhbWUgY291bnRlciAqLworICBVQ0hBUiBmbHVzaFN0YXR1czsgICAvKio8IEZsYWcgaW5kaWNhdGVzIGZsdXNoIG1vZGU6IG9ufG9mZiAqLworICBTQ0hBUiBidWlsZFVwQ250OyAgICAvKio8IEJ1aWxkIHVwIGZyYW1lIGNvdW50ZXIgKi8KKyAgVUNIQVIgYnVpbGRVcFN0YXR1czsgLyoqPCBGbGFnIGluZGljYXRlcyBidWlsZCB1cCBtb2RlOiBvbnxvZmYgKi8KKyAgVUNIQVIgY2ZnQ2hhbmdlZDsgLyoqPCBGbGFnIGluZGljYXRlcyB0aGF0IHRoZSBjb25maWcgY2hhbmdlZCBhbmQgdGhlIGRlY29kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgYWdhaW4gdmlhIGNhbGxiYWNrLiBNYWtlIHN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZW1vcnkgaXMgZnJlZWQgYmVmb3JlIGluaXRpYWxpemF0aW9uLiAqLworICBVQ0hBUiBjb250ZW50Q2hhbmdlZDsgLyoqPCBGbGFnIGluZGljYXRlcyB0aGF0IHRoZSBjb250ZW50IGNoYW5nZWQgaS5lLiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCB0cnVuY2F0aW9uIG9jY3VyZWQgYmVmb3JlICovCisgIFVDSEFSIGZvcmNlQ2ZnQ2hhbmdlOyAvKio8IEZsYWcgaW5kaWNhdGVzIGlmIGNvbmZpZyBjaGFuZ2UgaGFzIHRvIGJlIGZvcmNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbiBpZiBuZXcgY29uZmlnIGlzIHRoZSBzYW1lICovCit9IENDdHJsQ0ZHQ2hhbmdlOwogCi10eXBlZGVmIHN0cnVjdCAgewotICBjYlVwZGF0ZUNvbmZpZ190IGNiVXBkYXRlQ29uZmlnOyAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgZm9yIENvbmZpZyBjaGFuZ2Ugbm90aWZ5IGNhbGxiYWNrLiAgKi8KLSAgdm9pZCAqY2JVcGRhdGVDb25maWdEYXRhOyAgICAgICAgLyohPCBVc2VyIGRhdGEgcG9pbnRlciBmb3IgQ29uZmlnIGNoYW5nZSBub3RpZnkgY2FsbGJhY2suICovCi0gIGNiU3NjX3QgY2JTc2M7ICAgICAgICAgICAgICAgICAgIC8qITwgRnVuY3Rpb24gcG9pbnRlciBmb3IgU1NDIHBhcnNlciBjYWxsYmFjay4gKi8KLSAgdm9pZCAqY2JTc2NEYXRhOyAgICAgICAgICAgICAgICAgLyohPCBVc2VyIGRhdGEgcG9pbnRlciBmb3IgU1NDIHBhcnNlciBjYWxsYmFjay4gKi8KLSAgY2JTYnJfdCBjYlNicjsgICAgICAgICAgICAgICAgICAgLyohPCBGdW5jdGlvbiBwb2ludGVyIGZvciBTQlIgaGVhZGVyIHBhcnNlciBjYWxsYmFjay4gKi8KLSAgdm9pZCAqY2JTYnJEYXRhOyAgICAgICAgICAgICAgICAgLyohPCBVc2VyIGRhdGEgcG9pbnRlciBmb3IgU0JSIGhlYWRlciBwYXJzZXIgY2FsbGJhY2suICovCit0eXBlZGVmIElOVCAoKmNiVXBkYXRlQ29uZmlnX3QpKHZvaWQgKiwgY29uc3QgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIGNvbmZpZ01vZGUsIFVDSEFSICpjb25maWdDaGFuZ2VkKTsKK3R5cGVkZWYgSU5UICgqY2JGcmVlTWVtX3QpKHZvaWQgKiwgY29uc3QgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICopOwordHlwZWRlZiBJTlQgKCpjYkN0cmxDRkdDaGFuZ2VfdCkodm9pZCAqLCBjb25zdCBDQ3RybENGR0NoYW5nZSAqKTsKK3R5cGVkZWYgSU5UICgqY2JTc2NfdCkodm9pZCAqLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2FtcGxpbmdSYXRlLCBjb25zdCBJTlQgc3RlcmVvQ29uZmlnSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBjb3JlU2JyRnJhbWVMZW5ndGhJbmRleCwgY29uc3QgSU5UIGNvbmZpZ0J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBjb25maWdNb2RlLCBVQ0hBUiAqY29uZmlnQ2hhbmdlZCk7CisKK3R5cGVkZWYgSU5UICgqY2JTYnJfdCkodm9pZCAqc2VsZiwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZUluLCBjb25zdCBJTlQgc2FtcGxlUmF0ZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbGVtZW50SUQsIGNvbnN0IElOVCBlbGVtZW50SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIGhhcm1vbmljU2JyLCBjb25zdCBVQ0hBUiBzdGVyZW9Db25maWdJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgY29uZmlnTW9kZSwgVUNIQVIgKmNvbmZpZ0NoYW5nZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBkb3duc2NhbGVGYWN0b3IpOworCit0eXBlZGVmIElOVCAoKmNiVXNhY190KSh2b2lkICpzZWxmLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMpOworCit0eXBlZGVmIElOVCAoKmNiVW5pRHJjX3QpKHZvaWQgKnNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGZ1bGxQYXlsb2FkTGVuZ3RoLCBjb25zdCBJTlQgcGF5bG9hZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzdWJTdHJlYW1JbmRleCwgY29uc3QgSU5UIHBheWxvYWRTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUpOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNiVXBkYXRlQ29uZmlnX3QgY2JVcGRhdGVDb25maWc7IC8qITwgRnVuY3Rpb24gcG9pbnRlciBmb3IgQ29uZmlnIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkgY2FsbGJhY2suICAqLworICB2b2lkICpjYlVwZGF0ZUNvbmZpZ0RhdGE7IC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIENvbmZpZyBjaGFuZ2Ugbm90aWZ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suICovCisgIGNiRnJlZU1lbV90IGNiRnJlZU1lbTsgICAgLyohPCBGdW5jdGlvbiBwb2ludGVyIGZvciBmcmVlIG1lbW9yeSBjYWxsYmFjay4gICovCisgIHZvaWQgKmNiRnJlZU1lbURhdGE7ICAgICAgLyohPCBVc2VyIGRhdGEgcG9pbnRlciBmb3IgZnJlZSBtZW1vcnkgY2FsbGJhY2suICovCisgIGNiQ3RybENGR0NoYW5nZV90IGNiQ3RybENGR0NoYW5nZTsgLyohPCBGdW5jdGlvbiBwb2ludGVyIGZvciBjb25maWcgY2hhbmdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCBjYWxsYmFjay4gKi8KKyAgdm9pZCAqY2JDdHJsQ0ZHQ2hhbmdlRGF0YTsgLyohPCBVc2VyIGRhdGEgcG9pbnRlciBmb3IgY29uZmlnIGNoYW5nZSBjb250cm9sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLiAqLworICBjYlNzY190IGNiU3NjOyAgICAgICAgICAgICAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgZm9yIFNTQyBwYXJzZXIgY2FsbGJhY2suICovCisgIHZvaWQgKmNiU3NjRGF0YTsgICAgICAgICAgIC8qITwgVXNlciBkYXRhIHBvaW50ZXIgZm9yIFNTQyBwYXJzZXIgY2FsbGJhY2suICovCisgIGNiU2JyX3QgY2JTYnI7ICAgLyohPCBGdW5jdGlvbiBwb2ludGVyIGZvciBTQlIgaGVhZGVyIHBhcnNlciBjYWxsYmFjay4gKi8KKyAgdm9pZCAqY2JTYnJEYXRhOyAvKiE8IFVzZXIgZGF0YSBwb2ludGVyIGZvciBTQlIgaGVhZGVyIHBhcnNlciBjYWxsYmFjay4gKi8KKyAgY2JVc2FjX3QgY2JVc2FjOworICB2b2lkICpjYlVzYWNEYXRhOworICBjYlVuaURyY190IGNiVW5pRHJjOyAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgZm9yIHVuaURyY0NvbmZpZyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG91ZG5lc3NJbmZvU2V0IHBhcnNlciBjYWxsYmFjay4gKi8KKyAgdm9pZCAqY2JVbmlEcmNEYXRhOyAgLyohPCBVc2VyIGRhdGEgcG9pbnRlciBmb3IgdW5pRHJjQ29uZmlnIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb3VkbmVzc0luZm9TZXQgcGFyc2VyIGNhbGxiYWNrLiAqLwogfSBDU1RwQ2FsbEJhY2tzOwogCi1zdGF0aWMgY29uc3QgVUlOVCBTYW1wbGluZ1JhdGVUYWJsZVtdID0gCi17IDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMCwgNzM1MCwgMCwgMCwKLSAgMAotfTsKK3N0YXRpYyBjb25zdCBVSU5UIFNhbXBsaW5nUmF0ZVRhYmxlW10gPSB7CisgICAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwgMjQwMDAsIDIyMDUwLCAxNjAwMCwgMTIwMDAsIDExMDI1LAorICAgIDgwMDAsICA3MzUwLCAgMCwgICAgIDAsICAgICA1NzYwMCwgNTEyMDAsIDQwMDAwLCAzODQwMCwgMzQxNTAsIDI4ODAwLCAyNTYwMCwKKyAgICAyMDAwMCwgMTkyMDAsIDE3MDc1LCAxNDQwMCwgMTI4MDAsIDk2MDAsICAwLCAgICAgMCwgICAgIDAsICAgICAwfTsKIAotc3RhdGljIGlubGluZQotaW50IGdldFNhbXBsaW5nUmF0ZUluZGV4KCBVSU5UIHNhbXBsaW5nUmF0ZSApCi17Ci0gIFVJTlQgc2ZfaW5kZXgsIHRhYmxlU2l6ZT1zaXplb2YoU2FtcGxpbmdSYXRlVGFibGUpL3NpemVvZihVSU5UKTsKK3N0YXRpYyBpbmxpbmUgaW50IGdldFNhbXBsaW5nUmF0ZUluZGV4KFVJTlQgc2FtcGxpbmdSYXRlLCBVSU5UIG5CaXRzKSB7CisgIFVJTlQgc2ZfaW5kZXg7CisgIFVJTlQgdGFibGVTaXplID0gKDEgPDwgbkJpdHMpIC0gMTsKIAotICBmb3IgKHNmX2luZGV4PTA7IHNmX2luZGV4PHRhYmxlU2l6ZTsgc2ZfaW5kZXgrKykgewotICAgIGlmKCBTYW1wbGluZ1JhdGVUYWJsZVtzZl9pbmRleF0gPT0gc2FtcGxpbmdSYXRlICkgYnJlYWs7CisgIGZvciAoc2ZfaW5kZXggPSAwOyBzZl9pbmRleCA8IHRhYmxlU2l6ZTsgc2ZfaW5kZXgrKykgeworICAgIGlmIChTYW1wbGluZ1JhdGVUYWJsZVtzZl9pbmRleF0gPT0gc2FtcGxpbmdSYXRlKSBicmVhazsKICAgfQogCi0gIGlmIChzZl9pbmRleD50YWJsZVNpemUtMSkgewotICAgIHJldHVybiB0YWJsZVNpemUtMTsKKyAgaWYgKHNmX2luZGV4ID4gdGFibGVTaXplKSB7CisgICAgcmV0dXJuIHRhYmxlU2l6ZSAtIDE7CiAgIH0KIAogICByZXR1cm4gc2ZfaW5kZXg7CkBAIC0zMjUsMjYgKzQzMywzMyBAQAogLyoKICAqIEdldCBDaGFubmVsIGNvdW50IGZyb20gY2hhbm5lbCBjb25maWd1cmF0aW9uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGdldE51bWJlck9mVG90YWxDaGFubmVscyhpbnQgY2hhbm5lbENvbmZpZykKLXsKK3N0YXRpYyBpbmxpbmUgaW50IGdldE51bWJlck9mVG90YWxDaGFubmVscyhpbnQgY2hhbm5lbENvbmZpZykgewogICBzd2l0Y2ggKGNoYW5uZWxDb25maWcpIHsKLSAgY2FzZSAxOiBjYXNlIDI6IGNhc2UgMzoKLSAgY2FzZSA0OiBjYXNlIDU6IGNhc2UgNjoKLSAgICByZXR1cm4gY2hhbm5lbENvbmZpZzsKLSAgY2FzZSA3OiBjYXNlIDEyOiBjYXNlIDE0OgotICAgIHJldHVybiA4OwotICBjYXNlIDExOgotICAgIHJldHVybiA3OwotICBkZWZhdWx0OgotICAgIHJldHVybiAwOworICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgY2FzZSAzOgorICAgIGNhc2UgNDoKKyAgICBjYXNlIDU6CisgICAgY2FzZSA2OgorICAgICAgcmV0dXJuIGNoYW5uZWxDb25maWc7CisgICAgY2FzZSA3OgorICAgIGNhc2UgMTI6CisgICAgY2FzZSAxNDoKKyAgICAgIHJldHVybiA4OworICAgIGNhc2UgMTE6CisgICAgICByZXR1cm4gNzsKKyAgICBjYXNlIDEzOgorICAgICAgcmV0dXJuIDI0OworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKICAgfQogfQogCi1zdGF0aWMgaW5saW5lCi1pbnQgZ2V0TnVtYmVyT2ZFZmZlY3RpdmVDaGFubmVscyhjb25zdCBpbnQgY2hhbm5lbENvbmZpZykKLXsgICAgICAgIC8qIGluZGV4OiAwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1ICovCi0gIGNvbnN0IGludCBuW10gPSB7MCwxLDIsMyw0LDUsNSw3LDAsMCwgMCwgNiwgNywgMCwgNywgMH07CitzdGF0aWMgaW5saW5lIGludCBnZXROdW1iZXJPZkVmZmVjdGl2ZUNoYW5uZWxzKAorICAgIGNvbnN0IGludAorICAgICAgICBjaGFubmVsQ29uZmlnKSB7IC8qIGluZGV4OiAwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1ICovCisgIGNvbnN0IGludCBuW10gPSB7MCwgMSwgMiwgMywgNCwgNSwgNSwgNywgMCwgMCwgMCwgNiwgNywgMjIsIDcsIDB9OwogICByZXR1cm4gbltjaGFubmVsQ29uZmlnXTsKIH0KIAotI2VuZGlmIC8qIF9fVFBfREFUQV9IX18gKi8KKyNlbmRpZiAvKiBUUF9EQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUEVuYy9pbmNsdWRlL3RwZW5jX2xpYi5oIGIvbGliTXBlZ1RQRW5jL2luY2x1ZGUvdHBlbmNfbGliLmgKaW5kZXggMjgzM2U4Mi4uNGViODlhNyAxMDA2NDQKLS0tIGEvbGliTXBlZ1RQRW5jL2luY2x1ZGUvdHBlbmNfbGliLmgKKysrIGIvbGliTXBlZ1RQRW5jL2luY2x1ZGUvdHBlbmNfbGliLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTcgKzkwLDE4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgVHJhbnNwb3J0IEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTVBFRyB0cmFuc3BvcnQgZm9ybWF0IGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioKIAotICAgQXV0aG9yKHMpOiBNYW51ZWwgSmFuZGVyCisgICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgorCiAgICBEZXNjcmlwdGlvbjogTVBFRyBUcmFuc3BvcnQgZW5jb2RlCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgX19UUEVOQ19MSUJfSF9fCi0jZGVmaW5lIF9fVFBFTkNfTElCX0hfXworI2lmbmRlZiBUUEVOQ19MSUJfSAorI2RlZmluZSBUUEVOQ19MSUJfSAogCiAjaW5jbHVkZSAidHBfZGF0YS5oIgogI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKQEAgLTk3LDYxICsxMDksNzggQEAKICNkZWZpbmUgVFJBTlNQT1JURU5DX0lOQlVGX1NJWkUgODE5MgogCiB0eXBlZGVmIGVudW0gewotICBUUkFOU1BPUlRFTkNfT0sgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFsbCBmaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFRSQU5TUE9SVEVOQ19OT19NRU0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT3V0IG9mIG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgVFJBTlNQT1JURU5DX1VOS09XTl9FUlJPUiA9IDEsICAgICAgICAgICAgICAgICAgLyohPCBVbmtub3duIGVycm9yIChlbWJhcnJhc2luZykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBUUkFOU1BPUlRFTkNfSU5WQUxJRF9QQVJBTUVURVIsICAgICAgICAgICAgICAgICAvKiE8IEFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQgdG8gYSBmdW5jdGlvbiAuICAgICAgICAgICovCi0gIFRSQU5TUE9SVEVOQ19QQVJTRV9FUlJPUiwgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQml0c3RyZWFtIGRhdGEgY29udGFpbmVkIGluY29uc2lzdGVuY2llcyAod3Jvbmcgc3ludGF4KS4gKi8KLSAgVFJBTlNQT1JURU5DX1VOU1VQUE9SVEVEX0ZPUk1BVCwgICAgICAgICAgICAgICAgLyohPCBVbnN1cHBvcnRlZCB0cmFuc3BvcnQgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBUUkFOU1BPUlRFTkNfTk9UX0VOT1VHSF9CSVRTLCAgICAgICAgICAgICAgICAgICAvKiE8IE91dCBvZiBiaXRzLiBQcm92aWRlIG1vcmUgYml0cyBhbmQgdHJ5IGFnYWluLiAgICAgICAgICAgICovCisgIFRSQU5TUE9SVEVOQ19PSyA9IDAsICAgICAgICAgICAgIC8qITwgQWxsIGZpbmUuICAgICAgICAgICAgICovCisgIFRSQU5TUE9SVEVOQ19OT19NRU0sICAgICAgICAgICAgIC8qITwgT3V0IG9mIG1lbW9yeS4gICAgICAgICAgICAgKi8KKyAgVFJBTlNQT1JURU5DX1VOS09XTl9FUlJPUiA9IDEsICAgLyohPCBVbmtub3duIGVycm9yIChlbWJhcnJhc2luZykuICAgKi8KKyAgVFJBTlNQT1JURU5DX0lOVkFMSURfUEFSQU1FVEVSLCAgLyohPCBBbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkIHRvIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gLiAgICAgICAgICAqLworICBUUkFOU1BPUlRFTkNfVU5TVVBQT1JURURfRk9STUFULCAvKiE8IFVuc3VwcG9ydGVkIHRyYW5zcG9ydCBmb3JtYXQuICovCisgIFRSQU5TUE9SVEVOQ19OT1RfRU5PVUdIX0JJVFMsICAgIC8qITwgT3V0IG9mIGJpdHMuIFByb3ZpZGUgbW9yZSBiaXRzIGFuZCB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdhaW4uICAgICAgICAgICAgKi8KIAotICBUUkFOU1BPUlRFTkNfSU5WQUxJRF9DT05GSUcsICAgICAgICAgICAgICAgICAgICAvKiE8IEVycm9yIGluIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFRSQU5TUE9SVEVOQ19MQVRNX0lOVkFMSURfTlJfT0ZfU1VCRlJBTUVTLCAgICAgIC8qITwgTEFUTTogbnVtYmVyIG9mIHN1YmZyYW1lcyBvdXQgb2YgcmFuZ2UuICAgICAgICAgICAgICAgICAgKi8KLSAgVFJBTlNQT1JURU5DX0xPQVNfTk9UX0FWQUlMQUJMRSwgICAgICAgICAgICAgICAgLyohPCBMT0FTIGZvcm1hdCBub3Qgc3VwcG9ydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBUUkFOU1BPUlRFTkNfSU5WQUxJRF9MQVRNX0FMSUdOTUVOVCwgICAgICAgICAgICAvKiE8IEF1ZGlvTXV4RWxlbWVudCBsZW5ndGggbm90IGFsaWduZWQgdG8gMSBieXRlLiAgICAgICAgICAgICovCisgIFRSQU5TUE9SVEVOQ19JTlZBTElEX0NPTkZJRywgLyohPCBFcnJvciBpbiBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICovCisgIFRSQU5TUE9SVEVOQ19MQVRNX0lOVkFMSURfTlJfT0ZfU1VCRlJBTUVTLCAvKiE8IExBVE06IG51bWJlciBvZiBzdWJmcmFtZXMgb3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiByYW5nZS4gICAgICAgICAgICAgICAgICAqLworICBUUkFOU1BPUlRFTkNfTE9BU19OT1RfQVZBSUxBQkxFLCAvKiE8IExPQVMgZm9ybWF0IG5vdCBzdXBwb3J0ZWQuICAgICAgICAgICAqLworICBUUkFOU1BPUlRFTkNfSU5WQUxJRF9MQVRNX0FMSUdOTUVOVCwgLyohPCBBdWRpb011eEVsZW1lbnQgbGVuZ3RoIG5vdCBhbGlnbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byAxIGJ5dGUuICAgICAgICAgICAgKi8KIAotICBUUkFOU1BPUlRFTkNfSU5WQUxJRF9UUkFOU01JU1NJT05fRlJBTUVfTEVOR1RILCAvKiE8IEludmFsaWQgdHJhbnNtaXNzaW9uIGZyYW1lIGxlbmd0aCAoPCAwKS4gICAgICAgICAgICAgICAgICovCi0gIFRSQU5TUE9SVEVOQ19JTlZBTElEX0NFTFBfRlJBTUVfTEVOR1RILCAgICAgICAgIC8qITwgSW52YWxpZCBDRUxQIGZyYW1lIGxlbmd0aCBmb3VuZCAoPj0gNjIpLiAgICAgICAgICAgICAgICAgKi8KLSAgVFJBTlNQT1JURU5DX0lOVkFMSURfRlJBTUVfQklUUywgICAgICAgICAgICAgICAgLyohPCBGcmFtZSBiaXRzIGlzIG5vdCA0MCBhbmQgbm90IDgwLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBUUkFOU1BPUlRFTkNfSU5WQUxJRF9BT1QsICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVua25vd24gQU9UIGZvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFRSQU5TUE9SVEVOQ19JTlZBTElEX0FVX0xFTkdUSCAgICAgICAgICAgICAgICAgIC8qITwgSW52YWxpZCBBY2Nlc3MgVW5pdCBsZW5ndGggKG5vdCBieXRlLWFsaWduZWQpLiAgICAgICAgICAgKi8KKyAgVFJBTlNQT1JURU5DX0lOVkFMSURfVFJBTlNNSVNTSU9OX0ZSQU1FX0xFTkdUSCwgLyohPCBJbnZhbGlkIHRyYW5zbWlzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBsZW5ndGggKDwgMCkuICovCisgIFRSQU5TUE9SVEVOQ19JTlZBTElEX0NFTFBfRlJBTUVfTEVOR1RILCAvKiE8IEludmFsaWQgQ0VMUCBmcmFtZSBsZW5ndGggZm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg+PSA2MikuICAgICAgICAgICAgICAgICAqLworICBUUkFOU1BPUlRFTkNfSU5WQUxJRF9GUkFNRV9CSVRTLCAvKiE8IEZyYW1lIGJpdHMgaXMgbm90IDQwIGFuZCBub3QgODAuICovCisgIFRSQU5TUE9SVEVOQ19JTlZBTElEX0FPVCwgICAgICAgIC8qITwgVW5rbm93biBBT1QgZm91bmQuICAgICAgICAqLworICBUUkFOU1BPUlRFTkNfSU5WQUxJRF9BVV9MRU5HVEggICAvKiE8IEludmFsaWQgQWNjZXNzIFVuaXQgbGVuZ3RoIChub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZS1hbGlnbmVkKS4gICAgICAgICAgICovCiAKIH0gVFJBTlNQT1JURU5DX0VSUk9SOwogCiB0eXBlZGVmIHN0cnVjdCBUUkFOU1BPUlRFTkMgKkhBTkRMRV9UUkFOU1BPUlRFTkM7CiAKIC8qKgotICogXGJyaWVmICAgICAgICAgICAgIERldGVybWluZSBhIHJlYXNvbmFibGUgY2hhbm5lbCBjb25maWd1cmF0aW9uIG9uIHRoZSBiYXNpcyBvZiBjaGFubmVsX21vZGUuCisgKiBcYnJpZWYgICAgICAgICAgICAgRGV0ZXJtaW5lIGEgcmVhc29uYWJsZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gb24gdGhlIGJhc2lzCisgKiBvZiBjaGFubmVsX21vZGUuCiAgKiBccGFyYW0gbm9DaGFubmVscyAgTnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzLgotICogXHJldHVybiAgICAgICAgICAgIENIQU5ORUxfTU9ERSB2YWx1ZSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGFtb3VudCBvZiBhdWRpbyBjaGFubmVscy4KKyAqIFxyZXR1cm4gICAgICAgICAgICBDSEFOTkVMX01PREUgdmFsdWUgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBhbW91bnQgb2YgYXVkaW8KKyAqIGNoYW5uZWxzLgogICovCi1DSEFOTkVMX01PREUgdHJhbnNwb3J0RW5jX0dldENoYW5uZWxNb2RlKCBpbnQgbm9DaGFubmVscyApOworQ0hBTk5FTF9NT0RFIHRyYW5zcG9ydEVuY19HZXRDaGFubmVsTW9kZShpbnQgbm9DaGFubmVscyk7CiAKIC8qKgogICogXGJyaWVmICAgICAgICAgICAgICAgIFJlZ2lzdGVyIFNCUiBoZWFxZGVyIHdyaXRlciBjYWxsYmFjay4KICAqIFxwYXJhbSBoVHAgICAgICAgICAgICBIYW5kbGUgb2YgdHJhbnNwb3J0IGRlY29kZXIuCi0gKiBccGFyYW0gY2JVcGRhdGVDb25maWcgUG9pbnRlciB0byBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBTQlIgaGVhZGVyIHdyaXRpbmcuCi0gKiBccGFyYW0gdXNlcl9kYXRhICAgICAgdm9pZCBwb2ludGVyIGZvciB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBhcyBmaXJzdCBwYXJhbWV0ZXIuCisgKiBccGFyYW0gY2JVcGRhdGVDb25maWcgUG9pbnRlciB0byBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBTQlIgaGVhZGVyCisgKiB3cml0aW5nLgorICogXHBhcmFtIHVzZXJfZGF0YSAgICAgIHZvaWQgcG9pbnRlciBmb3IgdXNlciBkYXRhIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgYXMKKyAqIGZpcnN0IHBhcmFtZXRlci4KICAqIFxyZXR1cm4gICAgICAgICAgICAgICAwIG9uIHN1Y2Nlc3MuCiAgKi8KLWludCB0cmFuc3BvcnRFbmNfUmVnaXN0ZXJTYnJDYWxsYmFjayAoCi0gICAgICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAotICAgICAgICBjb25zdCBjYlNicl90IGNiU2JyLAotICAgICAgICB2b2lkKiB1c2VyX2RhdGEKLSAgICAgICAgKTsKK2ludCB0cmFuc3BvcnRFbmNfUmVnaXN0ZXJTYnJDYWxsYmFjayhIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYlNicl90IGNiU2JyLCB2b2lkICp1c2VyX2RhdGEpOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAgICAgICBSZWdpc3RlciBVU0FDIFNDIHdyaXRlciBjYWxsYmFjay4KKyAqIFxwYXJhbSBoVHAgICAgICAgICAgICBIYW5kbGUgb2YgdHJhbnNwb3J0IGRlY29kZXIuCisgKiBccGFyYW0gY2JVcGRhdGVDb25maWcgUG9pbnRlciB0byBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBVU0FDCisgKiBTQ3dyaXRpbmcuCisgKiBccGFyYW0gdXNlcl9kYXRhICAgICAgdm9pZCBwb2ludGVyIGZvciB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBhcworICogZmlyc3QgcGFyYW1ldGVyLgorICogXHJldHVybiAgICAgICAgICAgICAgIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IHRyYW5zcG9ydEVuY19SZWdpc3RlclVzYWNDYWxsYmFjayhIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2JVc2FjX3QgY2JVc2FjLCB2b2lkICp1c2VyX2RhdGEpOwogCiAvKioKICAqIFxicmllZiAgICAgICAgICAgICAgICBSZWdpc3RlciBTU0Mgd3JpdGVyIGNhbGxiYWNrLgogICogXHBhcmFtIGhUcCAgICAgICAgICAgIEhhbmRsZSBvZiB0cmFuc3BvcnQgZGVjb2Rlci4KICAqIFxwYXJhbSBjYlVwZGF0ZUNvbmZpZyBQb2ludGVyIHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIFNTQyB3cml0aW5nLgotICogXHBhcmFtIHVzZXJfZGF0YSAgICAgIHZvaWQgcG9pbnRlciBmb3IgdXNlciBkYXRhIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgYXMgZmlyc3QgcGFyYW1ldGVyLgorICogXHBhcmFtIHVzZXJfZGF0YSAgICAgIHZvaWQgcG9pbnRlciBmb3IgdXNlciBkYXRhIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgYXMKKyAqIGZpcnN0IHBhcmFtZXRlci4KICAqIFxyZXR1cm4gICAgICAgICAgICAgICAwIG9uIHN1Y2Nlc3MuCiAgKi8KLWludCB0cmFuc3BvcnRFbmNfUmVnaXN0ZXJTc2NDYWxsYmFjayAoCi0gICAgICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAotICAgICAgICBjb25zdCBjYlNzY190IGNiU3NjLAotICAgICAgICB2b2lkKiB1c2VyX2RhdGEKLSAgICAgICAgKTsKK2ludCB0cmFuc3BvcnRFbmNfUmVnaXN0ZXJTc2NDYWxsYmFjayhIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYlNzY190IGNiU3NjLCB2b2lkICp1c2VyX2RhdGEpOwogCiAvKioKICAqIFxicmllZiAgICAgICAgIFdyaXRlIEFTQyBmcm9tIGdpdmVuIHBhcmFtZXRlcnMuCkBAIC0xNjAsMjQgKzE4OSwyMCBAQAogICogXHBhcmFtIGNiIGNhbGxiYWNrIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KICAqIFxyZXR1cm4gICAgICAgIDAgb24gc3VjY2Vzcy4KICAqLwotaW50IHRyYW5zcG9ydEVuY193cml0ZUFTQyAoCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGFzYywKLSAgICAgICAgQ09ERVJfQ09ORklHICpjb25maWcsCi0gICAgICAgIENTVHBDYWxsQmFja3MgKmNiCi0gICAgICAgICk7Ci0KK2ludCB0cmFuc3BvcnRFbmNfd3JpdGVBU0MoSEFORExFX0ZES19CSVRTVFJFQU0gYXNjLCBDT0RFUl9DT05GSUcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IpOwogCiAvKiBEZWZpbnRpb24gb2YgZmxhZ3MgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRyYW5zcG9ydEVuY19PcGVuKCkgKi8KLSNkZWZpbmUgVFBfRkxBR19NUEVHNCAgICAgIDEgIC8qKiBNUEVHNCAoaW5zdGVhZCBvZiBNUEVHMikgKi8KLSNkZWZpbmUgVFBfRkxBR19MQVRNX0FNViAgIDIgIC8qKiBMQVRNIEF1ZGlvTXV4VmVyc2lvbiAgKi8KLSNkZWZpbmUgVFBfRkxBR19MQVRNX0FNVkEgIDQgIC8qKiBMQVRNIEF1ZGlvTXV4VmVyc2lvbkEgKi8KKyNkZWZpbmUgVFBfRkxBR19NUEVHNCAxICAgICAvKiogTVBFRzQgKGluc3RlYWQgb2YgTVBFRzIpICovCisjZGVmaW5lIFRQX0ZMQUdfTEFUTV9BTVYgMiAgLyoqIExBVE0gQXVkaW9NdXhWZXJzaW9uICAqLworI2RlZmluZSBUUF9GTEFHX0xBVE1fQU1WQSA0IC8qKiBMQVRNIEF1ZGlvTXV4VmVyc2lvbkEgKi8KIAogLyoqCiAgKiBcYnJpZWYgICAgICAgICAgICAgICBBbGxvY2F0ZSB0cmFuc3BvcnQgZW5jb2Rlci4KICAqIFxwYXJhbSBwaFRwRW5jICAgICAgIFBvaW50ZXIgdG8gdHJhbnNwb3J0IGVuY29kZXIgaGFuZGxlLgogICogXHJldHVybiAgICAgICAgICAgICAgRXJyb3IgY29kZS4KICAqLwotVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19PcGVuKCBIQU5ETEVfVFJBTlNQT1JURU5DICpwaFRwRW5jICk7CitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX09wZW4oSEFORExFX1RSQU5TUE9SVEVOQyAqcGhUcEVuYyk7CiAKIC8qKgogICogXGJyaWVmICAgICAgICAgICAgICAgSW5pdCB0cmFuc3BvcnQgZW5jb2Rlci4KQEAgLTE4OSwyMSArMjE0LDI2IEBACiAgKiBccGFyYW0gZmxhZ3MgICAgICAgICBUcmFuc3BvcnQgZW5jb2RlciBmbGFncy4KICAqIFxyZXR1cm4gICAgICAgICAgICAgIEVycm9yIGNvZGUuCiAgKi8KLVRSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfSW5pdCgKLSAgICAgICAgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCi0gICAgICAgIFVDSEFSICAgICAgICAgICAgICAqYnNCdWZmZXIsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgYnNCdWZmZXJTaXplLAotICAgICAgICBUUkFOU1BPUlRfVFlQRSAgICAgdHJhbnNwb3J0Rm10LAotICAgICAgICBDT0RFUl9DT05GSUcgICAgICAqY29uZmlnLAotICAgICAgICBVSU5UICAgICAgICAgICAgICAgZmxhZ3MKLSAgICAgICAgKTsKK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfSW5pdChIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqYnNCdWZmZXIsIElOVCBic0J1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0Rm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVSX0NPTkZJRyAqY29uZmlnLCBVSU5UIGZsYWdzKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgICBXcml0ZSBhZGRpdGlvbmFsIGJpdHMgaW4gdHJhbnNwb3J0IGVuY29kZXIuCisgKiBccGFyYW0gY29uZmlnICAgICAgICBQb2ludGVyIHRvIGEgdmFsaWQgQ09ERVJfQ09ORklHIHN0cnVjdC4KKyAqIFxwYXJhbSBuQml0cyAgICAgICAgIE51bWJlciBvZiBhZGRpdGlvbmFsIGJpdHMuCisgKiBccmV0dXJuICAgICAgICAgICAgICBFcnJvciBjb2RlLgorICovCitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0FkZE90aGVyRGF0YUJpdHMoSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG5CaXRzKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICBHZXQgdHJhbnNwb3J0IGVuY29kZXIgYml0c3RyZWFtLgogICogXHBhcmFtIGhUcCAgUG9pbnRlciB0byBhIHRyYW5zcG9ydCBlbmNvZGVyIGhhbmRsZS4KICAqIFxyZXR1cm4gICAgIFRoZSBoYW5kbGUgdG8gdGhlIHJlcXVlc3RlZCBGREsgYml0c3RyZWFtLgogICovCi1IQU5ETEVfRkRLX0JJVFNUUkVBTSB0cmFuc3BvcnRFbmNfR2V0Qml0c3RyZWFtKCBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcCApOworSEFORExFX0ZES19CSVRTVFJFQU0gdHJhbnNwb3J0RW5jX0dldEJpdHN0cmVhbShIQU5ETEVfVFJBTlNQT1JURU5DIGhUcCk7CiAKIC8qKgogICogXGJyaWVmICAgICAgICAgR2V0IGFtb3VudCBvZiBiaXRzIHJlcXVpcmVkIGJ5IHRoZSB0cmFuc3BvcnQgaGVhZGVycy4KQEAgLTIxMSw1NyArMjQxLDY2IEBACiAgKiBccGFyYW0gYXVCaXRzICBBbW91bnQgb2YgcGF5bG9hZCBiaXRzIHJlcXVpcmVkIGZvciB0aGUgY3VycmVudCBzdWJmcmFtZS4KICAqIFxyZXR1cm4gICAgICAgIEVycm9yIGNvZGUuCiAgKi8KLUlOVCB0cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cyggSEFORExFX1RSQU5TUE9SVEVOQyBoVHAsIGludCBhdUJpdHMgKTsKK0lOVCB0cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cyhIQU5ETEVfVFJBTlNQT1JURU5DIGhUcCwgaW50IGF1Qml0cyk7CiAKIC8qKgotICogXGJyaWVmICAgICAgIENsb3NlIHRyYW5zcG9ydCBlbmNvZGVyLiBUaGlzIGZ1bmN0aW9uIGFzc3VyZXMgdGhhdCBhbGwgYWxsb2NhdGVkIG1lbW9yeSBpcyBmcmVlZC4KKyAqIFxicmllZiAgICAgICBDbG9zZSB0cmFuc3BvcnQgZW5jb2Rlci4gVGhpcyBmdW5jdGlvbiBhc3N1cmVzIHRoYXQgYWxsCisgKiBhbGxvY2F0ZWQgbWVtb3J5IGlzIGZyZWVkLgogICogXHBhcmFtIHBoVHAgIFBvaW50ZXIgdG8gYSBwcmV2aW91c2x5IGFsbG9jYXRlZCB0cmFuc3BvcnQgZW5jb2RlciBoYW5kbGUuCiAgKi8KLXZvaWQgdHJhbnNwb3J0RW5jX0Nsb3NlKCBIQU5ETEVfVFJBTlNQT1JURU5DICpwaFRwICk7Cit2b2lkIHRyYW5zcG9ydEVuY19DbG9zZShIQU5ETEVfVFJBTlNQT1JURU5DICpwaFRwKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIG9uZSBhY2Nlc3MgdW5pdC4KICAqIFxwYXJhbSBoVHAgICAgICAgICAgICAgICAgICAgSGFuZGxlIG9mIHRyYW5zcG9ydCBlbmNvZGVyLgogICogXHBhcmFtIHRvdGFsX2JpdHMgICAgICAgICAgICBBbW91bnQgb2YgdG90YWwgYWNjZXNzIHVuaXQgYml0cy4KICAqIFxwYXJhbSBidWZmZXJGdWxsbmVzcyAgICAgICAgVmFsdWUgb2YgY3VycmVudCBidWZmZXIgZnVsbG5lc3MgaW4gYml0cy4KLSAqIFxwYXJhbSBub0NvbnNpZGVyZWRDaGFubmVscyAgTnVtYmVyIG9mIGJpdHJhdGUgd2lzZSBjb25zaWRlcmVkIGNoYW5uZWxzIChhbGwgbWludXMgTEZFIGNoYW5uZWxzKS4KKyAqIFxwYXJhbSBub0NvbnNpZGVyZWRDaGFubmVscyAgTnVtYmVyIG9mIGJpdHJhdGUgd2lzZSBjb25zaWRlcmVkIGNoYW5uZWxzIChhbGwKKyAqIG1pbnVzIExGRSBjaGFubmVscykuCiAgKiBccmV0dXJuICAgICAgICAgICAgICAgICAgICAgIEVycm9yIGNvZGUuCiAgKi8KLVRSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfV3JpdGVBY2Nlc3NVbml0KCBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdG90YWxfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyRnVsbG5lc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vQ29uc2lkZXJlZENoYW5uZWxzICk7CitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX1dyaXRlQWNjZXNzVW5pdChIQU5ETEVfVFJBTlNQT1JURU5DIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0b3RhbF9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlckZ1bGxuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vQ29uc2lkZXJlZENoYW5uZWxzKTsKIAogLyoqCi0gKiBcYnJpZWYgICAgICAgIEluZm9ybSB0aGUgdHJhbnNwb3J0RW5jIGxheWVyIHRoYXQgd3JpdGluZyBvZiBhY2Nlc3MgdW5pdCBoYXMgZmluaXNoZWQuIFRoaXMgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgaXMgcmVxdWlyZWQgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGVuY29kZXIgaGFzIGZpbmlzaGVkIHdyaXRpbmcgb25lIEFjY2VzcwotICogICAgICAgICAgICAgICBvbmUgQWNjZXNzIFVuaXQgZm9yIGJpdHN0cmVhbSBob3VzZWtlZXBpbmcuCisgKiBcYnJpZWYgICAgICAgIEluZm9ybSB0aGUgdHJhbnNwb3J0RW5jIGxheWVyIHRoYXQgd3JpdGluZyBvZiBhY2Nlc3MgdW5pdCBoYXMKKyAqIGZpbmlzaGVkLiBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBlbmNvZGVyIGhhcworICogZmluaXNoZWQgd3JpdGluZyBvbmUgQWNjZXNzIG9uZSBBY2Nlc3MgVW5pdCBmb3IgYml0c3RyZWFtCisgKiBob3VzZWtlZXBpbmcuCiAgKiBccGFyYW0gaFRwICAgIFRyYW5zcG9ydCBoYW5kbGUuCi0gKiBccGFyYW0gcEJpdHMgIFBvaW50ZXIgdG8gYW4gaW50LCB3aGVyZSB0aGUgY3VycmVudCBhbW91bnQgb2YgZnJhbWUgYml0cyBpcyBwYXNzZWQKLSAqICAgICAgICAgICAgICAgYW5kIHdoZXJlIHRoZSBjdXJyZW50IGFtb3VudCBvZiBzdWJmcmFtZSBiaXRzIGlzIHJldHVybmVkLgorICogXHBhcmFtIHBCaXRzICBQb2ludGVyIHRvIGFuIGludCwgd2hlcmUgdGhlIGN1cnJlbnQgYW1vdW50IG9mIGZyYW1lIGJpdHMgaXMKKyAqIHBhc3NlZCBhbmQgd2hlcmUgdGhlIGN1cnJlbnQgYW1vdW50IG9mIHN1YmZyYW1lIGJpdHMgaXMgcmV0dXJuZWQuCiAgKgotICogT1I6ICBUaGlzIGludGVnZXIgaXMgbW9kaWZpZWQgYnkgdGhlIGFtb3VudCBvZiBleHRyYSBiaXQgYWxpZ25tZW50IHRoYXQgbWF5IG9jY3Vyci4KKyAqIE9SOiAgVGhpcyBpbnRlZ2VyIGlzIG1vZGlmaWVkIGJ5IHRoZSBhbW91bnQgb2YgZXh0cmEgYml0IGFsaWdubWVudCB0aGF0IG1heQorICogb2NjdXJyLgogICoKICAqIFxyZXR1cm4gICAgICAgRXJyb3IgY29kZS4KICAqLwotVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19FbmRBY2Nlc3NVbml0KCBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcCwgaW50ICpwQml0cyk7CitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0VuZEFjY2Vzc1VuaXQoSEFORExFX1RSQU5TUE9SVEVOQyBoVHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwQml0cyk7CiAKIC8qCiAgKiBcYnJpZWYgICAgICAgICBHZXQgYSBwYXlsb2FkIGZyYW1lLgogICogXHBhcmFtIGhUcEVuYyAgVHJhbnNwb3J0IGVuY29kZXIgaGFuZGxlLgotICogXHBhcmFtIG5CeXRlcyAgUG9pbnRlciB0byBhbiBpbnQgdG8gaG9sZCB0aGUgZnJhbWUgc2l6ZSBpbiBieXRlcy4gUmV0dXJucyB6ZXJvCi0gKiAgICAgICAgICAgICAgICBpZiBjdXJyZW50bHkgdGhlcmUgaXMgbm8gY29tcGxldGUgZnJhbWUgZm9yIG91dHB1dCAobnVtYmVyIG9mIHN1YiBmcmFtZXMgPiAxKS4KKyAqIFxwYXJhbSBuQnl0ZXMgIFBvaW50ZXIgdG8gYW4gaW50IHRvIGhvbGQgdGhlIGZyYW1lIHNpemUgaW4gYnl0ZXMuIFJldHVybnMKKyAqIHplcm8gaWYgY3VycmVudGx5IHRoZXJlIGlzIG5vIGNvbXBsZXRlIGZyYW1lIGZvciBvdXRwdXQgKG51bWJlciBvZiBzdWIgZnJhbWVzCisgKiA+IDEpLgogICogXHJldHVybiAgICAgICAgRXJyb3IgY29kZS4KICAqLwotVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19HZXRGcmFtZShIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywgaW50ICpuYnl0ZXMpOworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19HZXRGcmFtZShIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpuYnl0ZXMpOwogCiAvKiBBRFRTIENSQyBzdXBwb3J0ICovCiAKIC8qKgogICogXGJyaWVmICAgICAgICAgU2V0IGN1cnJlbnQgYml0c3RyZWFtIHBvc2l0aW9uIGFzIHN0YXJ0IG9mIGEgbmV3IGRhdGEgcmVnaW9uLgogICogXHBhcmFtIGhUcEVuYyAgVHJhbnNwb3J0IGVuY29kZXIgaGFuZGxlLgotICogXHBhcmFtIG1CaXRzICAgU2l6ZSBpbiBiaXRzIG9mIHRoZSBkYXRhIHJlZ2lvbi4gU2V0IHRvIDAgaWYgaXQgc2hvdWxkIG5vdCBiZSBvZiBhIGZpeGVkIHNpemUuCi0gKiBccmV0dXJuICAgICAgICBEYXRhIHJlZ2lvbiBJRCwgd2hpY2ggc2hvdWxkIGJlIHVzZWQgd2hlbiBjYWxsaW5nIHRyYW5zcG9ydEVuY19DcmNFbmRSZWcoKS4KKyAqIFxwYXJhbSBtQml0cyAgIFNpemUgaW4gYml0cyBvZiB0aGUgZGF0YSByZWdpb24uIFNldCB0byAwIGlmIGl0IHNob3VsZCBub3QgYmUKKyAqIG9mIGEgZml4ZWQgc2l6ZS4KKyAqIFxyZXR1cm4gICAgICAgIERhdGEgcmVnaW9uIElELCB3aGljaCBzaG91bGQgYmUgdXNlZCB3aGVuIGNhbGxpbmcKKyAqIHRyYW5zcG9ydEVuY19DcmNFbmRSZWcoKS4KICAqLwogaW50IHRyYW5zcG9ydEVuY19DcmNTdGFydFJlZyhIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywgaW50IG1CaXRzKTsKIApAQCAtMjc0LDIzICszMTMsMjcgQEAKIHZvaWQgdHJhbnNwb3J0RW5jX0NyY0VuZFJlZyhIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywgaW50IHJlZyk7CiAKIC8qKgotICogXGJyaWVmICAgICAgICAgICAgIEdldCBBdWRpb1NwZWNpZmljQ29uZmlnIG9yIFN0cmVhbU11eENvbmZpZyBmcm9tIHRyYW5zcG9ydCBlbmNvZGVyIGhhbmRsZSBhbmQgd3JpdGUgaXQgdG8gZGF0YUJ1ZmZlci4KKyAqIFxicmllZiAgICAgICAgICAgICBHZXQgQXVkaW9TcGVjaWZpY0NvbmZpZyBvciBTdHJlYW1NdXhDb25maWcgZnJvbSB0cmFuc3BvcnQKKyAqIGVuY29kZXIgaGFuZGxlIGFuZCB3cml0ZSBpdCB0byBkYXRhQnVmZmVyLgogICogXHBhcmFtIGhUcEVuYyAgICAgIFRyYW5zcG9ydCBlbmNvZGVyIGhhbmRsZS4KLSAqIFxwYXJhbSBjYyAgICAgICAgICBQb2ludGVyIHRvIHRoZSBjdXJyZW50IGFuZCB2YWxpZCBjb25maWd1cmF0aW9uIGNvbnRhaW5lZCBpbiBhIENPREVSX0NPTkZJRyBzdHJ1Y3QuCisgKiBccGFyYW0gY2MgICAgICAgICAgUG9pbnRlciB0byB0aGUgY3VycmVudCBhbmQgdmFsaWQgY29uZmlndXJhdGlvbiBjb250YWluZWQKKyAqIGluIGEgQ09ERVJfQ09ORklHIHN0cnVjdC4KICAqIFxwYXJhbSBkYXRhQnVmZmVyICBCaXRidWZmZXIgaG9sZGluZyBiaW5hcnkgY29uZmlndXJhdGlvbi4KLSAqIFxwYXJhbSBjb25mVHlwZSAgICBQb2ludGVyIHRvIGFuIFVJTlQgd2hlcmUgdGhlIGNvbmZpZ3VyYXRpb24gdHlwZSBpcyByZXR1cm5lZCAoMDpBU0MsIDE6U01DKS4KKyAqIFxwYXJhbSBjb25mVHlwZSAgICBQb2ludGVyIHRvIGFuIFVJTlQgd2hlcmUgdGhlIGNvbmZpZ3VyYXRpb24gdHlwZSBpcworICogcmV0dXJuZWQgKDA6QVNDLCAxOlNNQykuCiAgKiBccmV0dXJuICAgICAgICAgICAgRXJyb3IgY29kZS4KICAqLwotVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19HZXRDb25mKCBIQU5ETEVfVFJBTlNQT1JURU5DICBoVHBFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVSX0NPTkZJRyAgICAgICAgKmNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREtfQklUU1RSRUFNICAgICAgICpkYXRhQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICpjb25mVHlwZSApOworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19HZXRDb25mKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVSX0NPTkZJRyAqY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLX0JJVFNUUkVBTSAqZGF0YUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpjb25mVHlwZSk7CiAKIC8qKgotICogXGJyaWVmICAgICAgIEdldCBpbmZvcm1hdGlvbiAodmVyc2lvbiBhbW9uZyBvdGhlciB0aGluZ3MpIG9mIHRoZSB0cmFuc3BvcnQgZW5jb2RlciBsaWJyYXJ5LgorICogXGJyaWVmICAgICAgIEdldCBpbmZvcm1hdGlvbiAodmVyc2lvbiBhbW9uZyBvdGhlciB0aGluZ3MpIG9mIHRoZSB0cmFuc3BvcnQKKyAqIGVuY29kZXIgbGlicmFyeS4KICAqIFxwYXJhbSBpbmZvICBQb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBMSUJfSU5GTyBzdHJ1Y3QuCiAgKiBccmV0dXJuICAgICAgRXJyb3IgY29kZS4KICAqLwotVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19HZXRMaWJJbmZvKCBMSUJfSU5GTyAqaW5mbyApOworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19HZXRMaWJJbmZvKExJQl9JTkZPICppbmZvKTsKIAotI2VuZGlmIC8qICNpZm5kZWYgX19UUEVOQ19MSUJfSF9fICovCisjZW5kaWYgLyogI2lmbmRlZiBUUEVOQ19MSUJfSCAqLwpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRW5jL3NyYy90cF92ZXJzaW9uLmggYi9saWJNcGVnVFBFbmMvc3JjL3RwX3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjFhYTIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliTXBlZ1RQRW5jL3NyYy90cF92ZXJzaW9uLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTVBFRyB0cmFuc3BvcnQgZm9ybWF0IGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKFRQX1ZFUlNJT05fSCkKKyNkZWZpbmUgVFBfVkVSU0lPTl9ICisKKy8qIGxpYnJhcnkgaW5mbyAqLworI2RlZmluZSBUUF9MSUJfVkwwIDMKKyNkZWZpbmUgVFBfTElCX1ZMMSAwCisjZGVmaW5lIFRQX0xJQl9WTDIgMAorI2RlZmluZSBUUF9MSUJfVElUTEUgIk1QRUcgVHJhbnNwb3J0IgorI2lmZGVmIF9fQU5EUk9JRF9fCisjZGVmaW5lIFRQX0xJQl9CVUlMRF9EQVRFICIiCisjZGVmaW5lIFRQX0xJQl9CVUlMRF9USU1FICIiCisjZWxzZQorI2RlZmluZSBUUF9MSUJfQlVJTERfREFURSBfX0RBVEVfXworI2RlZmluZSBUUF9MSUJfQlVJTERfVElNRSBfX1RJTUVfXworI2VuZGlmCisjZW5kaWYgLyogIWRlZmluZWQoVFBfVkVSU0lPTl9IKSAqLwpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hZGlmLmNwcCBiL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYWRpZi5jcHAKaW5kZXggYjQ4YTMyZS4uYjI4MWVmZiAxMDA2NDQKLS0tIGEvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hZGlmLmNwcAorKysgYi9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FkaWYuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDEwNCArOTAsOTcgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBNUEVHIHRyYW5zcG9ydCBmb3JtYXQgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKgogCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogQURJRiBUcmFuc3BvcnQgSGVhZGVycyB3cml0aW5nCisgICBBdXRob3Iocyk6CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBBRElGIFRyYW5zcG9ydCBIZWFkZXJzIHdyaXRpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInRwZW5jX2FkaWYuaCIKIAogI2luY2x1ZGUgInRwZW5jX2xpYi5oIgogI2luY2x1ZGUgInRwZW5jX2FzYy5oIgogCi0KLQotaW50IGFkaWZXcml0ZV9FbmNvZGVIZWFkZXIoQURJRl9JTkZPICphZGlmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGFkaWZfYnVmZmVyX2Z1bGxuZXNzKQoteworaW50IGFkaWZXcml0ZV9FbmNvZGVIZWFkZXIoQURJRl9JTkZPICphZGlmLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYWRpZl9idWZmZXJfZnVsbG5lc3MpIHsKICAgLyogQURJRi9QQ0UvQURUUyBkZWZpbml0aW9ucyAqLwotICBjb25zdCBjaGFyIGFkaWZJZFs1XT0iQURJRiI7Ci0gIGNvbnN0IGludCAgY29weVJpZ2h0SWRQcmVzZW50PTA7Ci0gIGNvbnN0IGludCAgb3JpZ2luYWxDb3B5PTA7Ci0gIGNvbnN0IGludCAgaG9tZT0wOworICBjb25zdCBjaGFyIGFkaWZJZFs1XSA9ICJBRElGIjsKKyAgY29uc3QgaW50IGNvcHlSaWdodElkUHJlc2VudCA9IDA7CisgIGNvbnN0IGludCBvcmlnaW5hbENvcHkgPSAwOworICBjb25zdCBpbnQgaG9tZSA9IDA7CisgIGludCBlcnIgPSAwOwogCiAgIGludCBpOwogCi0gIElOVCBzYW1wbGVSYXRlID0gYWRpZi0+c2FtcGxpbmdSYXRlOwogICBJTlQgdG90YWxCaXRSYXRlID0gYWRpZi0+Yml0UmF0ZTsKIAotICBpZiAoYWRpZi0+aGVhZGVyV3JpdHRlbikKLSAgICByZXR1cm4gMDsKKyAgaWYgKGFkaWYtPmhlYWRlcldyaXR0ZW4pIHJldHVybiAwOwogCiAgIC8qIEFsaWduIGluc2lkZSBQQ0Ugd2l0aCByZXNwZWN0IHRvIHRoZSBmaXJzdCBiaXQgb2YgdGhlIGhlYWRlciAqLwogICBVSU5UIGFsaWduQW5jaG9yID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CiAKICAgLyogU2lnbmFsIHZhcmlhYmxlIGJpdHJhdGUgaWYgYnVmZmVyIGZ1bGxuZXMgZXhjZWVkcyAyMCBiaXQgKi8KLSAgYWRpZi0+YlZhcmlhYmxlUmF0ZSA9ICggYWRpZl9idWZmZXJfZnVsbG5lc3MgPj0gKElOVCkoMHgxPDwyMCkgKSA/IDEgOiAwOworICBhZGlmLT5iVmFyaWFibGVSYXRlID0gKGFkaWZfYnVmZmVyX2Z1bGxuZXNzID49IChJTlQpKDB4MSA8PCAyMCkpID8gMSA6IDA7CiAKLSAgRkRLd3JpdGVCaXRzKGhCcywgYWRpZklkWzBdLDgpOwotICBGREt3cml0ZUJpdHMoaEJzLCBhZGlmSWRbMV0sOCk7Ci0gIEZES3dyaXRlQml0cyhoQnMsIGFkaWZJZFsyXSw4KTsKLSAgRkRLd3JpdGVCaXRzKGhCcywgYWRpZklkWzNdLDgpOworICBGREt3cml0ZUJpdHMoaEJzLCBhZGlmSWRbMF0sIDgpOworICBGREt3cml0ZUJpdHMoaEJzLCBhZGlmSWRbMV0sIDgpOworICBGREt3cml0ZUJpdHMoaEJzLCBhZGlmSWRbMl0sIDgpOworICBGREt3cml0ZUJpdHMoaEJzLCBhZGlmSWRbM10sIDgpOwogCisgIEZES3dyaXRlQml0cyhoQnMsIGNvcHlSaWdodElkUHJlc2VudCA/IDEgOiAwLCAxKTsKIAotICBGREt3cml0ZUJpdHMoaEJzLCBjb3B5UmlnaHRJZFByZXNlbnQgPyAxOjAsMSk7Ci0KLSAgaWYoY29weVJpZ2h0SWRQcmVzZW50KSB7Ci0gICAgZm9yKGk9MDtpPDcyO2krKykgewotICAgICAgRkRLd3JpdGVCaXRzKGhCcywwLDEpOworICBpZiAoY29weVJpZ2h0SWRQcmVzZW50KSB7CisgICAgZm9yIChpID0gMDsgaSA8IDcyOyBpKyspIHsKKyAgICAgIEZES3dyaXRlQml0cyhoQnMsIDAsIDEpOwogICAgIH0KICAgfQotICBGREt3cml0ZUJpdHMoaEJzLCBvcmlnaW5hbENvcHkgPyAxOjAsMSk7Ci0gIEZES3dyaXRlQml0cyhoQnMsIGhvbWUgPyAxOjAsMSk7Ci0gIEZES3dyaXRlQml0cyhoQnMsIGFkaWYtPmJWYXJpYWJsZVJhdGU/MTowLCAxKTsKLSAgRkRLd3JpdGVCaXRzKGhCcywgdG90YWxCaXRSYXRlLDIzKTsKKyAgRkRLd3JpdGVCaXRzKGhCcywgb3JpZ2luYWxDb3B5ID8gMSA6IDAsIDEpOworICBGREt3cml0ZUJpdHMoaEJzLCBob21lID8gMSA6IDAsIDEpOworICBGREt3cml0ZUJpdHMoaEJzLCBhZGlmLT5iVmFyaWFibGVSYXRlID8gMSA6IDAsIDEpOworICBGREt3cml0ZUJpdHMoaEJzLCB0b3RhbEJpdFJhdGUsIDIzKTsKIAogICAvKiB3ZSB3cml0ZSBvbmx5IG9uZSBQQ0UgYXQgdGhlIG1vbWVudCAqLwogICBGREt3cml0ZUJpdHMoaEJzLCAwLCA0KTsKIAotICBpZighYWRpZi0+YlZhcmlhYmxlUmF0ZSkgeworICBpZiAoIWFkaWYtPmJWYXJpYWJsZVJhdGUpIHsKICAgICBGREt3cml0ZUJpdHMoaEJzLCBhZGlmX2J1ZmZlcl9mdWxsbmVzcywgMjApOwogICB9Ci0KICAgLyogV3JpdGUgUENFICovCi0gIHRyYW5zcG9ydEVuY193cml0ZVBDRShoQnMsIGFkaWYtPmNtLCBzYW1wbGVSYXRlLCBhZGlmLT5pbnN0YW5jZVRhZywgYWRpZi0+cHJvZmlsZSwgMCwgMCwgYWxpZ25BbmNob3IpOworICB0cmFuc3BvcnRFbmNfd3JpdGVQQ0UoaEJzLCBhZGlmLT5jbSwgYWRpZi0+c2FtcGxpbmdSYXRlLCBhZGlmLT5pbnN0YW5jZVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkaWYtPnByb2ZpbGUsIGFkaWYtPm1hdHJpeE1peGRvd25BLAorICAgICAgICAgICAgICAgICAgICAgICAgKGFkaWYtPnBzZXVkb1N1cnJvdW5kRW5hYmxlKSA/IDEgOiAwLCBhbGlnbkFuY2hvcik7CiAKLSAgcmV0dXJuIDA7CisgIHJldHVybiBlcnI7CiB9CiAKLWludCBhZGlmV3JpdGVfR2V0SGVhZGVyQml0cyhBRElGX0lORk8gKmFkaWYpCi17CitpbnQgYWRpZldyaXRlX0dldEhlYWRlckJpdHMoQURJRl9JTkZPICphZGlmKSB7CiAgIC8qIEFESUYgZGVmaW5pdGlvbnMgKi8KLSAgY29uc3QgaW50ICBjb3B5UmlnaHRJZFByZXNlbnQ9MDsKKyAgY29uc3QgaW50IGNvcHlSaWdodElkUHJlc2VudCA9IDA7CiAKLSAgaWYgKGFkaWYtPmhlYWRlcldyaXR0ZW4pCi0gICAgcmV0dXJuIDA7CisgIGlmIChhZGlmLT5oZWFkZXJXcml0dGVuKSByZXR1cm4gMDsKIAogICBpbnQgYml0cyA9IDA7CiAKLSAgYml0cyArPSA4KjQ7IC8qIEFESUYgSUQgKi8KKyAgYml0cyArPSA4ICogNDsgLyogQURJRiBJRCAqLwogCiAgIGJpdHMgKz0gMTsgLyogQ29weXJpZ2h0IHByZXNlbnQgKi8KIAotICBpZiAoY29weVJpZ2h0SWRQcmVzZW50KQotICAgIGJpdHMgKz0gNzI7ICAgICAgICAgIC8qIENvcHlyaWdodCBJRCAqLworICBpZiAoY29weVJpZ2h0SWRQcmVzZW50KSBiaXRzICs9IDcyOyAvKiBDb3B5cmlnaHQgSUQgKi8KIAogICBiaXRzICs9IDI2OwogCiAgIGJpdHMgKz0gNDsgLyogTnVtYmVyIG9mIFBDRSdzICovCiAKLSAgaWYoIWFkaWYtPmJWYXJpYWJsZVJhdGUpIHsKKyAgaWYgKCFhZGlmLT5iVmFyaWFibGVSYXRlKSB7CiAgICAgYml0cyArPSAyMDsKICAgfQogCiAgIC8qIHdyaXRlIFBDRSAqLwotICBiaXRzID0gdHJhbnNwb3J0RW5jX0dldFBDRUJpdHMoYWRpZi0+Y20sIDAsIGJpdHMpOworICBiaXRzID0gdHJhbnNwb3J0RW5jX0dldFBDRUJpdHMoYWRpZi0+Y20sIGFkaWYtPm1hdHJpeE1peGRvd25BLCBiaXRzKTsKIAogICByZXR1cm4gYml0czsKIH0KLQpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hZGlmLmggYi9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FkaWYuaAppbmRleCBkNTkwMzU0Li5lMDAxYWZjIDEwMDY0NAotLS0gYS9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FkaWYuaAorKysgYi9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FkaWYuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBNUEVHIHRyYW5zcG9ydCBmb3JtYXQgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgQWxleCBHb2VzY2hlbAotICAgY29udGVudHMvZGVzY3JpcHRpb246IFRyYW5zcG9ydCBIZWFkZXJzIHN1cHBvcnQKKyAgIEF1dGhvcihzKTogICBBbGV4IEdvZXNjaGVsCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBUcmFuc3BvcnQgSGVhZGVycyBzdXBwb3J0CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgVFBFTkNfQURJRl9ICiAjZGVmaW5lIFRQRU5DX0FESUZfSApAQCAtMTA0LDYgKzExNiw5IEBACiAgIGludCBiVmFyaWFibGVSYXRlOwogICBpbnQgaW5zdGFuY2VUYWc7CiAgIGludCBoZWFkZXJXcml0dGVuOworICBpbnQgbWF0cml4TWl4ZG93bkE7CisgIGludCBwc2V1ZG9TdXJyb3VuZEVuYWJsZTsKKwogfSBBRElGX0lORk87CiAKIC8qKgpAQCAtMTE1LDIxICsxMzAsMTcgQEAKICAqCiAgKiBccmV0dXJuIDAgb24gc3VjY2VzcwogICovCi1pbnQgYWRpZldyaXRlX0VuY29kZUhlYWRlcigKLSAgICAgICAgQURJRl9JTkZPICAgICAgICAgICAqYWRpZiwKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgYWRpZl9idWZmZXJfZnVsbG5lc3MKLSAgICAgICAgKTsKK2ludCBhZGlmV3JpdGVfRW5jb2RlSGVhZGVyKEFESUZfSU5GTyAqYWRpZiwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBhZGlmX2J1ZmZlcl9mdWxsbmVzcyk7CiAKIC8qKgogICogXGJyaWVmIEdldCBiaXQgZGVtYW5kIG9mIGEgQURJRiBoZWFkZXIKICAqCiAgKiBccGFyYW0gYWRpZiBwb2ludGVyIHRvIEFESUZfSU5GTyBzdHJ1Y3R1cmUKICAqCi0gKiBccmV0dXJuIGFtb3VudCBvZiBiaXRzIHJlcXVpcmVkIHRvIHdyaXRlIHRoZSBBRElGIGhlYWRlciBhY2NvcmRpbmcgdG8gdGhlIGRhdGEKLSAqICAgICAgICAgY29udGFpbmVkIGluIHRoZSBhZGlmIHBhcmFtZXRlcgorICogXHJldHVybiBhbW91bnQgb2YgYml0cyByZXF1aXJlZCB0byB3cml0ZSB0aGUgQURJRiBoZWFkZXIgYWNjb3JkaW5nIHRvIHRoZQorICogZGF0YSBjb250YWluZWQgaW4gdGhlIGFkaWYgcGFyYW1ldGVyCiAgKi8KLWludCBhZGlmV3JpdGVfR2V0SGVhZGVyQml0cyggQURJRl9JTkZPICphZGlmICk7CitpbnQgYWRpZldyaXRlX0dldEhlYWRlckJpdHMoQURJRl9JTkZPICphZGlmKTsKIAogI2VuZGlmIC8qIFRQRU5DX0FESUZfSCAqLwotCmRpZmYgLS1naXQgYS9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FkdHMuY3BwIGIvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hZHRzLmNwcAppbmRleCBmNGYzMTc4Li4zZjdlNjJjIDEwMDY0NAotLS0gYS9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FkdHMuY3BwCisrKyBiL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYWR0cy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNDggKzkwLDQzIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTVBFRyB0cmFuc3BvcnQgZm9ybWF0IGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIEFsZXggR3JvZXNjaGVsCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogQURUUyBUcmFuc3BvcnQgSGVhZGVycyBzdXBwb3J0CisgICBBdXRob3Iocyk6ICAgQWxleCBHcm9lc2NoZWwKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IEFEVFMgVHJhbnNwb3J0IEhlYWRlcnMgc3VwcG9ydAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAidHBlbmNfYWR0cy5oIgogCi0KICNpbmNsdWRlICJ0cGVuY19saWIuaCIKICNpbmNsdWRlICJ0cGVuY19hc2MuaCIKIAotCiBpbnQgYWR0c1dyaXRlX0NyY1N0YXJ0UmVnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0FEVFMgcEFkdHMsICAgICAgICAgIC8qITwgcG9pbnRlciB0byBhZHRzIHN0dWN0dXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsICAgLyohPCBoYW5kbGUgdG8gY3VycmVudCBiaXQgYnVmZmVyIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1CaXRzICAgICAgICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIGJpdHMgaW4gY3JjIHJlZ2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CisgICAgSEFORExFX0FEVFMgcEFkdHMsICAgICAgICAvKiE8IHBvaW50ZXIgdG8gYWR0cyBzdHVjdHVyZSAqLworICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgLyohPCBoYW5kbGUgdG8gY3VycmVudCBiaXQgYnVmZmVyIHN0cnVjdHVyZSAqLworICAgIGludCBtQml0cyAgICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgYml0cyBpbiBjcmMgcmVnaW9uICovCispIHsKICAgaWYgKHBBZHRzLT5wcm90ZWN0aW9uX2Fic2VudCkgewogICAgIHJldHVybiAwOwogICB9Ci0gIHJldHVybiAoIEZES2NyY1N0YXJ0UmVnKCZwQWR0cy0+Y3JjSW5mbywgaEJzLCBtQml0cykgKTsKKyAgcmV0dXJuIChGREtjcmNTdGFydFJlZygmcEFkdHMtPmNyY0luZm8sIGhCcywgbUJpdHMpKTsKIH0KIAogdm9pZCBhZHRzV3JpdGVfQ3JjRW5kUmVnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQURUUyBwQWR0cywgLyohPCBwb2ludGVyIHRvIGFkdHMgY3JjIGluZm8gc3R1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCAgIC8qITwgaGFuZGxlIHRvIGN1cnJlbnQgYml0IGJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlZyAgICAgICAgICAgICAgICAgICAgLyohPCBjcmMgcmVnaW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICBpZiAocEFkdHMtPnByb3RlY3Rpb25fYWJzZW50ID09IDApCi0gIHsKKyAgICBIQU5ETEVfQURUUyBwQWR0cywgICAgICAgIC8qITwgcG9pbnRlciB0byBhZHRzIGNyYyBpbmZvIHN0dWN0dXJlICovCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCAvKiE8IGhhbmRsZSB0byBjdXJyZW50IGJpdCBidWZmZXIgc3RydWN0dXJlICovCisgICAgaW50IHJlZyAgICAgICAgICAgICAgICAgICAvKiE8IGNyYyByZWdpb24gKi8KKykgeworICBpZiAocEFkdHMtPnByb3RlY3Rpb25fYWJzZW50ID09IDApIHsKICAgICBGREtjcmNFbmRSZWcoJnBBZHRzLT5jcmNJbmZvLCBoQnMsIHJlZyk7CiAgIH0KIH0KIAotaW50IGFkdHNXcml0ZV9HZXRIZWFkZXJCaXRzKCBIQU5ETEVfQURUUyBoQWR0cyApCi17CitpbnQgYWR0c1dyaXRlX0dldEhlYWRlckJpdHMoSEFORExFX0FEVFMgaEFkdHMpIHsKICAgaW50IGJpdHMgPSAwOwogCiAgIGlmIChoQWR0cy0+Y3VycmVudEJsb2NrID09IDApIHsKQEAgLTEyOSwxNCArMTM1LDE1IEBACiAgICAgaWYgKCFoQWR0cy0+cHJvdGVjdGlvbl9hYnNlbnQpIHsKICAgICAgIC8qIEFkZCBoZWFkZXIvIHNpbmdsZSByYXcgZGF0YSBibG9jayBDUkMgYml0cyAqLwogICAgICAgYml0cyArPSAxNjsKLSAgICAgIGlmIChoQWR0cy0+bnVtX3Jhd19ibG9ja3M+MCkgeworICAgICAgaWYgKGhBZHRzLT5udW1fcmF3X2Jsb2NrcyA+IDApIHsKICAgICAgICAgLyogQWRkIGJpdHMgb2YgcmF3IGRhdGEgYmxvY2sgcG9zaXRpb24gbWFya2VycyAqLwotICAgICAgICBiaXRzICs9IChoQWR0cy0+bnVtX3Jhd19ibG9ja3MpKjE2OworICAgICAgICBiaXRzICs9IChoQWR0cy0+bnVtX3Jhd19ibG9ja3MpICogMTY7CiAgICAgICB9CiAgICAgfQogICB9Ci0gIGlmICghaEFkdHMtPnByb3RlY3Rpb25fYWJzZW50ICYmIGhBZHRzLT5udW1fcmF3X2Jsb2Nrcz4wKSB7Ci0gICAgLyogQWRkIHJhdyBkYXRhIGJsb2NrIENSQyBiaXRzLiBOb3QgcmVhbGx5IHBhcnQgb2YgdGhlIGhlYWRlciwgcHV0IHRoZXkgY2F1c2UgYml0IG92ZXJoZWFkIHRvIGJlIGFjY291bnRlZC4gKi8KKyAgaWYgKCFoQWR0cy0+cHJvdGVjdGlvbl9hYnNlbnQgJiYgaEFkdHMtPm51bV9yYXdfYmxvY2tzID4gMCkgeworICAgIC8qIEFkZCByYXcgZGF0YSBibG9jayBDUkMgYml0cy4gTm90IHJlYWxseSBwYXJ0IG9mIHRoZSBoZWFkZXIsIHB1dCB0aGV5CisgICAgICogY2F1c2UgYml0IG92ZXJoZWFkIHRvIGJlIGFjY291bnRlZC4gKi8KICAgICBiaXRzICs9IDE2OwogICB9CiAKQEAgLTE0NSwxMyArMTUyLDEwIEBACiAgIHJldHVybiBiaXRzOwogfQogCi1JTlQgYWR0c1dyaXRlX0luaXQoSEFORExFX0FEVFMgaEFkdHMsIENPREVSX0NPTkZJRyAqY29uZmlnKQoteworSU5UIGFkdHNXcml0ZV9Jbml0KEhBTkRMRV9BRFRTIGhBZHRzLCBDT0RFUl9DT05GSUcgKmNvbmZpZykgewogICAvKiBTYW5pdHkgY2hlY2tzICovCi0gIGlmICggY29uZmlnLT5uU3ViRnJhbWVzIDwgMQotICAgIHx8IGNvbmZpZy0+blN1YkZyYW1lcyA+IDQKLSAgICB8fCAoaW50KWNvbmZpZy0+YW90ID4gNAotICAgIHx8IChpbnQpY29uZmlnLT5hb3QgPCAxICkgeworICBpZiAoY29uZmlnLT5uU3ViRnJhbWVzIDwgMSB8fCBjb25maWctPm5TdWJGcmFtZXMgPiA0IHx8CisgICAgICAoaW50KWNvbmZpZy0+YW90ID4gNCB8fCAoaW50KWNvbmZpZy0+YW90IDwgMSkgewogICAgIHJldHVybiAtMTsKICAgfQogCkBAIC0xNjEsNDEgKzE2NSwzOCBAQAogICB9IGVsc2UgewogICAgIGhBZHRzLT5tcGVnX2lkID0gMTsgLyogTVBFRyAyICovCiAgIH0KLSAgaEFkdHMtPmxheWVyPTA7Ci0gIGhBZHRzLT5wcm90ZWN0aW9uX2Fic2VudCA9ICEgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19QUk9URUNUSU9OKTsKKyAgaEFkdHMtPmxheWVyID0gMDsKKyAgaEFkdHMtPnByb3RlY3Rpb25fYWJzZW50ID0gIShjb25maWctPmZsYWdzICYgQ0NfUFJPVEVDVElPTik7CiAgIGhBZHRzLT5wcm9maWxlID0gKChpbnQpY29uZmlnLT5hb3QpIC0gMTsKLSAgaEFkdHMtPnNhbXBsZV9mcmVxX2luZGV4ID0gZ2V0U2FtcGxpbmdSYXRlSW5kZXgoY29uZmlnLT5zYW1wbGluZ1JhdGUpOworICBoQWR0cy0+c2FtcGxlX2ZyZXFfaW5kZXggPSBnZXRTYW1wbGluZ1JhdGVJbmRleChjb25maWctPnNhbXBsaW5nUmF0ZSwgNCk7CiAgIGhBZHRzLT5zYW1wbGVfZnJlcSA9IGNvbmZpZy0+c2FtcGxpbmdSYXRlOwotICBoQWR0cy0+cHJpdmF0ZV9iaXQ9MDsKKyAgaEFkdHMtPnByaXZhdGVfYml0ID0gMDsKICAgaEFkdHMtPmNoYW5uZWxfbW9kZSA9IGNvbmZpZy0+Y2hhbm5lbE1vZGU7Ci0gIGhBZHRzLT5vcmlnaW5hbD0wOwotICBoQWR0cy0+aG9tZT0wOworICBoQWR0cy0+b3JpZ2luYWwgPSAwOworICBoQWR0cy0+aG9tZSA9IDA7CiAgIC8qIHZhcmlhYmxlIGhlYWRlciAqLwotICBoQWR0cy0+Y29weXJpZ2h0X2lkPTA7Ci0gIGhBZHRzLT5jb3B5cmlnaHRfc3RhcnQ9MDsKKyAgaEFkdHMtPmNvcHlyaWdodF9pZCA9IDA7CisgIGhBZHRzLT5jb3B5cmlnaHRfc3RhcnQgPSAwOwogCi0gIGhBZHRzLT5udW1fcmF3X2Jsb2Nrcz1jb25maWctPm5TdWJGcmFtZXMtMTsgLyogMCBtZWFucyAxIHJhdyBkYXRhIGJsb2NrICovCisgIGhBZHRzLT5udW1fcmF3X2Jsb2NrcyA9IGNvbmZpZy0+blN1YkZyYW1lcyAtIDE7IC8qIDAgbWVhbnMgMSByYXcgZGF0YSBibG9jayAqLworCisgIGhBZHRzLT5jaGFubmVsX2NvbmZpZ196ZXJvID0gY29uZmlnLT5jaGFubmVsQ29uZmlnWmVybzsKIAogICBGREtjcmNJbml0KCZoQWR0cy0+Y3JjSW5mbywgMHg4MDA1LCAweEZGRkYsIDE2KTsKIAogICBoQWR0cy0+Y3VycmVudEJsb2NrID0gMDsKIAotCiAgIHJldHVybiAwOwogfQogCi1pbnQgYWR0c1dyaXRlX0VuY29kZUhlYWRlcihIQU5ETEVfQURUUyBoQWR0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyX2Z1bGxuZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX2xlbmd0aCkKLXsKK2ludCBhZHRzV3JpdGVfRW5jb2RlSGVhZGVyKEhBTkRMRV9BRFRTIGhBZHRzLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlcl9mdWxsbmVzcywgaW50IGZyYW1lX2xlbmd0aCkgewogICBJTlQgY3JjSW5kZXggPSAwOwogCi0KICAgaEFkdHMtPmhlYWRlckJpdHMgPSBhZHRzV3JpdGVfR2V0SGVhZGVyQml0cyhoQWR0cyk7CiAKLSAgRkRLX0FTU0VSVCgoKGZyYW1lX2xlbmd0aCtoQWR0cy0+aGVhZGVyQml0cykvOCk8MHgyMDAwKTsgICAgICAvKjEzIGJpdCovCi0gIEZES19BU1NFUlQoYnVmZmVyX2Z1bGxuZXNzPDB4ODAwKTsgICAgLyogMTEgYml0ICAgKi8KKyAgRkRLX0FTU0VSVCgoKGZyYW1lX2xlbmd0aCArIGhBZHRzLT5oZWFkZXJCaXRzKSAvIDgpIDwgMHgyMDAwKTsgLyoxMyBiaXQqLworICBGREtfQVNTRVJUKGJ1ZmZlcl9mdWxsbmVzcyA8IDB4ODAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMSBiaXQgICAqLwogCiAgIGlmICghaEFkdHMtPnByb3RlY3Rpb25fYWJzZW50KSB7CiAgICAgRkRLY3JjUmVzZXQoJmhBZHRzLT5jcmNJbmZvKTsKQEAgLTIwOCw4ICsyMDksNyBAQAogICBoQWR0cy0+c3ViRnJhbWVTdGFydEJpdCA9IEZES2dldFZhbGlkQml0cyhoQml0U3RyZWFtKTsKIAogICAvKiBTa2lwIG5ldyBoZWFkZXIgaWYgdGhpcyBpcyByYXcgZGF0YSBibG9jayAxLi5uICovCi0gIGlmIChoQWR0cy0+Y3VycmVudEJsb2NrID09IDApCi0gIHsKKyAgaWYgKGhBZHRzLT5jdXJyZW50QmxvY2sgPT0gMCkgewogICAgIEZES3Jlc2V0Qml0YnVmZmVyKGhCaXRTdHJlYW0sIEJTX1dSSVRFUik7CiAKICAgICBpZiAoaEFkdHMtPm51bV9yYXdfYmxvY2tzID09IDApIHsKQEAgLTIyNCwyNCArMjI0LDI3IEBACiAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGhBZHRzLT5wcm9maWxlLCAyKTsKICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgaEFkdHMtPnNhbXBsZV9mcmVxX2luZGV4LCA0KTsKICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgaEFkdHMtPnByaXZhdGVfYml0LCAxKTsKLSAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgZ2V0Q2hhbm5lbENvbmZpZyhoQWR0cy0+Y2hhbm5lbF9tb2RlKSwgMyk7CisgICAgRkRLd3JpdGVCaXRzKAorICAgICAgICBoQml0U3RyZWFtLAorICAgICAgICBnZXRDaGFubmVsQ29uZmlnKGhBZHRzLT5jaGFubmVsX21vZGUsIGhBZHRzLT5jaGFubmVsX2NvbmZpZ196ZXJvKSwgMyk7CiAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGhBZHRzLT5vcmlnaW5hbCwgMSk7CiAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGhBZHRzLT5ob21lLCAxKTsKICAgICAvKiB2YXJpYWJsZSBoZWFkZXIgKi8KICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgaEFkdHMtPmNvcHlyaWdodF9pZCwgMSk7CiAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGhBZHRzLT5jb3B5cmlnaHRfc3RhcnQsIDEpOwotICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAoZnJhbWVfbGVuZ3RoICsgaEFkdHMtPmhlYWRlckJpdHMpPj4zLCAxMyk7CisgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIChmcmFtZV9sZW5ndGggKyBoQWR0cy0+aGVhZGVyQml0cykgPj4gMywgMTMpOwogICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBidWZmZXJfZnVsbG5lc3MsIDExKTsKICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgaEFkdHMtPm51bV9yYXdfYmxvY2tzLCAyKTsKIAogICAgIGlmICghaEFkdHMtPnByb3RlY3Rpb25fYWJzZW50KSB7CiAgICAgICBpbnQgaTsKIAotICAgICAgLyogRW5kIGhlYWRlciBDUkMgcG9ydGlvbiBmb3Igc2luZ2xlIHJhdyBkYXRhIGJsb2NrIGFuZCB3cml0ZSBkdW1teSB6ZXJvIHZhbHVlcyBmb3IgdW5rbm93biBmaWVsZHMuICovCisgICAgICAvKiBFbmQgaGVhZGVyIENSQyBwb3J0aW9uIGZvciBzaW5nbGUgcmF3IGRhdGEgYmxvY2sgYW5kIHdyaXRlIGR1bW15IHplcm8KKyAgICAgICAqIHZhbHVlcyBmb3IgdW5rbm93biBmaWVsZHMuICovCiAgICAgICBpZiAoaEFkdHMtPm51bV9yYXdfYmxvY2tzID09IDApIHsKICAgICAgICAgYWR0c1dyaXRlX0NyY0VuZFJlZyhoQWR0cywgaEJpdFN0cmVhbSwgY3JjSW5kZXgpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpPTA7IGk8aEFkdHMtPm51bV9yYXdfYmxvY2tzOyBpKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhBZHRzLT5udW1fcmF3X2Jsb2NrczsgaSsrKSB7CiAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDE2KTsKICAgICAgICAgfQogICAgICAgfQpAQCAtMjUyLDE0ICsyNTUsMTMgQEAKICAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgYWR0c1dyaXRlX0VuZFJhd0RhdGFCbG9jayhIQU5ETEVfQURUUyBoQWR0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBCaXRzKQotewordm9pZCBhZHRzV3JpdGVfRW5kUmF3RGF0YUJsb2NrKEhBTkRMRV9BRFRTIGhBZHRzLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwQml0cykgewogICBpZiAoIWhBZHRzLT5wcm90ZWN0aW9uX2Fic2VudCkgewogICAgIEZES19CSVRTVFJFQU0gYnNXcml0ZXI7CiAKLSAgICBGREtpbml0Qml0U3RyZWFtKCZic1dyaXRlciwgaEJzLT5oQml0QnVmLkJ1ZmZlciwgaEJzLT5oQml0QnVmLmJ1ZlNpemUsIDAsIEJTX1dSSVRFUik7CisgICAgRkRLaW5pdEJpdFN0cmVhbSgmYnNXcml0ZXIsIGhCcy0+aEJpdEJ1Zi5CdWZmZXIsIGhCcy0+aEJpdEJ1Zi5idWZTaXplLCAwLAorICAgICAgICAgICAgICAgICAgICAgQlNfV1JJVEVSKTsKICAgICBGREtwdXNoRm9yKCZic1dyaXRlciwgNTYpOwogCiAgICAgaWYgKGhBZHRzLT5udW1fcmF3X2Jsb2NrcyA9PSAwKSB7CkBAIC0yNzIsMzIgKzI3NCwzNSBAQAogCiAgICAgICAvKiBXcml0ZSBkaXN0YW5jZSB0byBjdXJyZW50IGRhdGEgYmxvY2sgKi8KICAgICAgIGlmIChoQWR0cy0+Y3VycmVudEJsb2NrIDwgaEFkdHMtPm51bV9yYXdfYmxvY2tzKSB7Ci0gICAgICAgIEZES3B1c2hGb3IoJmJzV3JpdGVyLCBoQWR0cy0+Y3VycmVudEJsb2NrKjE2KTsKLSAgICAgICAgZGlzdGFuY2UgPSBGREtnZXRWYWxpZEJpdHMoaEJzKSAtICg1NiArIChoQWR0cy0+bnVtX3Jhd19ibG9ja3MpKjE2ICsgMTYpOwotICAgICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBkaXN0YW5jZT4+MywgMTYpOworICAgICAgICBGREtwdXNoRm9yKCZic1dyaXRlciwgaEFkdHMtPmN1cnJlbnRCbG9jayAqIDE2KTsKKyAgICAgICAgZGlzdGFuY2UgPQorICAgICAgICAgICAgRkRLZ2V0VmFsaWRCaXRzKGhCcykgLSAoNTYgKyAoaEFkdHMtPm51bV9yYXdfYmxvY2tzKSAqIDE2ICsgMTYpOworICAgICAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBkaXN0YW5jZSA+PiAzLCAxNik7CiAgICAgICB9CiAgICAgfQogICAgIEZES3N5bmNDYWNoZSgmYnNXcml0ZXIpOwogICB9CiAKICAgLyogV3JpdGUgdG90YWwgZnJhbWUgbGVudGggZm9yIG11bHRpcGxlIHJhdyBkYXRhIGJsb2NrcyBhbmQgaGVhZGVyIENSQyAqLwotICBpZiAoaEFkdHMtPm51bV9yYXdfYmxvY2tzID4gMCAmJiBoQWR0cy0+Y3VycmVudEJsb2NrID09IGhBZHRzLT5udW1fcmF3X2Jsb2NrcykgeworICBpZiAoaEFkdHMtPm51bV9yYXdfYmxvY2tzID4gMCAmJgorICAgICAgaEFkdHMtPmN1cnJlbnRCbG9jayA9PSBoQWR0cy0+bnVtX3Jhd19ibG9ja3MpIHsKICAgICBGREtfQklUU1RSRUFNIGJzV3JpdGVyOwogICAgIGludCBjcmNJbmRleCA9IDA7CiAKLSAgICBGREtpbml0Qml0U3RyZWFtKCZic1dyaXRlciwgaEJzLT5oQml0QnVmLkJ1ZmZlciwgaEJzLT5oQml0QnVmLmJ1ZlNpemUsIDAsIEJTX1dSSVRFUik7CisgICAgRkRLaW5pdEJpdFN0cmVhbSgmYnNXcml0ZXIsIGhCcy0+aEJpdEJ1Zi5CdWZmZXIsIGhCcy0+aEJpdEJ1Zi5idWZTaXplLCAwLAorICAgICAgICAgICAgICAgICAgICAgQlNfV1JJVEVSKTsKIAogICAgIGlmICghaEFkdHMtPnByb3RlY3Rpb25fYWJzZW50KSB7CiAgICAgICBGREtjcmNSZXNldCgmaEFkdHMtPmNyY0luZm8pOwogICAgICAgY3JjSW5kZXggPSBGREtjcmNTdGFydFJlZygmaEFkdHMtPmNyY0luZm8sICZic1dyaXRlciwgMCk7CiAgICAgfQogICAgIC8qIFdyaXRlIHRvdGFsIGZyYW1lIGxlbmd0aCAqLwotICAgIEZES3B1c2hGb3IoJmJzV3JpdGVyLCA1Ni0yOCsyKTsKLSAgICBGREt3cml0ZUJpdHMoJmJzV3JpdGVyLCBGREtnZXRWYWxpZEJpdHMoaEJzKT4+MywgMTMpOworICAgIEZES3B1c2hGb3IoJmJzV3JpdGVyLCA1NiAtIDI4ICsgMik7CisgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgRkRLZ2V0VmFsaWRCaXRzKGhCcykgPj4gMywgMTMpOwogCiAgICAgLyogV3JpdGUgaGVhZGVyIENSQyAqLwogICAgIGlmICghaEFkdHMtPnByb3RlY3Rpb25fYWJzZW50KSB7Ci0gICAgICBGREtwdXNoRm9yKCZic1dyaXRlciwgMTErMiArIChoQWR0cy0+bnVtX3Jhd19ibG9ja3MpKjE2KTsKKyAgICAgIEZES3B1c2hGb3IoJmJzV3JpdGVyLCAxMSArIDIgKyAoaEFkdHMtPm51bV9yYXdfYmxvY2tzKSAqIDE2KTsKICAgICAgIEZES2NyY0VuZFJlZygmaEFkdHMtPmNyY0luZm8sICZic1dyaXRlciwgY3JjSW5kZXgpOwogICAgICAgRkRLd3JpdGVCaXRzKCZic1dyaXRlciwgRkRLY3JjR2V0Q1JDKCZoQWR0cy0+Y3JjSW5mbyksIDE2KTsKICAgICB9CkBAIC0zMTIsNCArMzE3LDMgQEAKICAgfQogICBoQWR0cy0+Y3VycmVudEJsb2NrKys7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYWR0cy5oIGIvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hZHRzLmgKaW5kZXggYzEyYzdjNy4uZmU4NjMwNiAxMDA2NDQKLS0tIGEvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hZHRzLmgKKysrIGIvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hZHRzLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjAgKzkwLDE5IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgQXVkaW8gRW5jb2RlciAqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTVBFRyB0cmFuc3BvcnQgZm9ybWF0IGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIEFsZXggR3JvZXNjaGVsCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogQURUUyBUcmFuc3BvcnQgd3JpdGVyCisgICBBdXRob3Iocyk6ICAgQWxleCBHcm9lc2NoZWwKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IEFEVFMgVHJhbnNwb3J0IHdyaXRlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIFRQRU5DX0FEVFNfSAogI2RlZmluZSBUUEVOQ19BRFRTX0gKIAotCi0KICNpbmNsdWRlICJ0cF9kYXRhLmgiCiAKICNpbmNsdWRlICJGREtfY3JjLmgiCkBAIC0xMTQsOSArMTI0LDExIEBACiAgIFVTSE9SVCBmcmFtZV9sZW5ndGg7CiAgIFVDSEFSIG51bV9yYXdfYmxvY2tzOwogICBVQ0hBUiBCdWZmZXJGdWxsbmVzU3RhcnRGbGFnOwotICBpbnQgaGVhZGVyQml0czsgICAgICAgICAgICAgICAgLyohPCBIZWFkZXIgYml0IGRlbWFuZCBmb3IgdGhlIGN1cnJlbnQgcmF3IGRhdGEgYmxvY2sgKi8KLSAgaW50IGN1cnJlbnRCbG9jazsgICAgICAgICAgICAgIC8qITwgSW5kZXggb2YgY3VycmVudCByYXcgZGF0YSBibG9jayAqLwotICBpbnQgc3ViRnJhbWVTdGFydEJpdDsgICAgICAgICAgLyohPCBCaXQgcG9zaXRpb24gd2hlcmUgdGhlIGN1cnJlbnQgcmF3IGRhdGEgYmxvY2sgYmVnaW5zICovCisgIFVDSEFSIGNoYW5uZWxfY29uZmlnX3plcm87CisgIGludCBoZWFkZXJCaXRzOyAgICAgICAvKiE8IEhlYWRlciBiaXQgZGVtYW5kIGZvciB0aGUgY3VycmVudCByYXcgZGF0YSBibG9jayAqLworICBpbnQgY3VycmVudEJsb2NrOyAgICAgLyohPCBJbmRleCBvZiBjdXJyZW50IHJhdyBkYXRhIGJsb2NrICovCisgIGludCBzdWJGcmFtZVN0YXJ0Qml0OyAvKiE8IEJpdCBwb3NpdGlvbiB3aGVyZSB0aGUgY3VycmVudCByYXcgZGF0YSBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW5zICovCiAgIEZES19DUkNJTkZPIGNyY0luZm87CiB9IFNUUlVDVF9BRFRTOwogCkBAIC0xMzEsMTAgKzE0Myw3IEBACiAgKgogICogXHJldHVybiAwIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KICAqLwotSU5UIGFkdHNXcml0ZV9Jbml0KAotICAgICAgICBIQU5ETEVfQURUUyAgIGhBZHRzLAotICAgICAgICBDT0RFUl9DT05GSUcgKmNvbmZpZwotICAgICAgICApOworSU5UIGFkdHNXcml0ZV9Jbml0KEhBTkRMRV9BRFRTIGhBZHRzLCBDT0RFUl9DT05GSUcgKmNvbmZpZyk7CiAKIC8qKgogICogXGJyaWVmIEdldCB0aGUgdG90YWwgYml0IG92ZXJoZWFkIGNhdXNlZCBieSBBRFRTCkBAIC0xNDMsNyArMTUyLDcgQEAKICAqCiAgKiBccmV0dXJuIEFtb3VudCBvZiBhZGRpdGlvbmFsIGJpdHMgcmVxdWlyZWQgZm9yIHRoZSBjdXJyZW50IHJhdyBkYXRhIGJsb2NrCiAgKi8KLWludCBhZHRzV3JpdGVfR2V0SGVhZGVyQml0cyggSEFORExFX0FEVFMgaEFkdHMgKTsKK2ludCBhZHRzV3JpdGVfR2V0SGVhZGVyQml0cyhIQU5ETEVfQURUUyBoQWR0cyk7CiAKIC8qKgogICogXGJyaWVmIFdyaXRlIGFuIEFEVFMgaGVhZGVyIGludG8gdGhlIGdpdmVuIGJpdHN0cmVhbS4gTWF5IG5vdCB3cml0ZSBhIGhlYWRlcgpAQCAtMTU2LDQ3ICsxNjUsMzYgQEAKICAqCiAgKiBccmV0dXJuIDAgaW4gY2FzZSBvZiBzdWNjZXNzLgogICovCi1JTlQgYWR0c1dyaXRlX0VuY29kZUhlYWRlcigKLSAgICAgICAgSEFORExFX0FEVFMgICAgICAgICAgaEFkdHMsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgIGJ1ZmZlckZ1bGxuZXNzLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBmcmFtZV9sZW5ndGgKLSAgICAgICAgKTsKK0lOVCBhZHRzV3JpdGVfRW5jb2RlSGVhZGVyKEhBTkRMRV9BRFRTIGhBZHRzLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlckZ1bGxuZXNzLCBpbnQgZnJhbWVfbGVuZ3RoKTsKIC8qKgogICogXGJyaWVmIEZpbmlzaCBhIEFEVFMgcmF3IGRhdGEgYmxvY2sKICAqCiAgKiBccGFyYW0gaEFkdHMgQURUUyBkYXRhIGhhbmRsZQogICogXHBhcmFtIGhCcyBiaXRzdHJlYW0gaGFuZGxlIGludG8gd2hpY2ggdGhlIEFEVFMgbWF5IGJlIHdyaXR0ZW4gaW50bwotICogXHBhcmFtIHBCaXRzIGEgcG9pbnRlciB0byBhIGludGVnZXIgaG9sZGluZyB0aGUgY3VycmVudCBiaXRzdHJlYW0gYnVmZmVyIGJpdCBjb3VudCwKLSAqICAgICAgICAgICAgICB3aGljaCBpcyBjb3JyZWN0ZWQgdG8gdGhlIGN1cnJlbnQgcmF3IGRhdGEgYmxvY2sgYm91bmRhcnkuCisgKiBccGFyYW0gcEJpdHMgYSBwb2ludGVyIHRvIGEgaW50ZWdlciBob2xkaW5nIHRoZSBjdXJyZW50IGJpdHN0cmVhbSBidWZmZXIgYml0CisgKiBjb3VudCwgd2hpY2ggaXMgY29ycmVjdGVkIHRvIHRoZSBjdXJyZW50IHJhdyBkYXRhIGJsb2NrIGJvdW5kYXJ5LgogICoKICAqLwotdm9pZCBhZHRzV3JpdGVfRW5kUmF3RGF0YUJsb2NrKAotICAgICAgICBIQU5ETEVfQURUUyAgICAgICAgICBoQWR0cywKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICpiaXRzCi0gICAgICAgICk7Ci0KK3ZvaWQgYWR0c1dyaXRlX0VuZFJhd0RhdGFCbG9jayhIQU5ETEVfQURUUyBoQWR0cywgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYml0cyk7CiAKIC8qKgogICogXGJyaWVmIFN0YXJ0IENSQyByZWdpb24gd2l0aCBhIG1heGltdW0gbnVtYmVyIG9mIGJpdHMKLSAqICAgICAgICBJZiBtQml0cyBpcyBwb3NpdGl2ZSB6ZXJvIHBhZGRpbmcgd2lsbCBiZSB1c2VkIGZvciBDUkMgY2FsY3VsYXRpb24sIGlmIHRoZXJlCi0gKiAgICAgICAgYXJlIGxlc3MgdGhhbiBtQml0cyBiaXRzIGF2YWlsYWJsZS4KLSAqICAgICAgICBJZiBtQml0cyBpcyBuZWdhdGl2ZSBubyB6ZXJvIHBhZGRpbmcgaXMgZG9uZS4KLSAqICAgICAgICBJZiBtQml0cyBpcyB6ZXJvIHRoZSBtZW1vcnkgZm9yIHRoZSBidWZmZXIgaXMgYWxsb2NhdGVkIGR5bmFtaWNhbGx5LCB0aGUKLSAqICAgICAgICBudW1iZXIgb2YgYml0cyBpcyBub3QgbGltaXRlZC4KKyAqICAgICAgICBJZiBtQml0cyBpcyBwb3NpdGl2ZSB6ZXJvIHBhZGRpbmcgd2lsbCBiZSB1c2VkIGZvciBDUkMgY2FsY3VsYXRpb24sIGlmCisgKiB0aGVyZSBhcmUgbGVzcyB0aGFuIG1CaXRzIGJpdHMgYXZhaWxhYmxlLiBJZiBtQml0cyBpcyBuZWdhdGl2ZSBubyB6ZXJvCisgKiBwYWRkaW5nIGlzIGRvbmUuIElmIG1CaXRzIGlzIHplcm8gdGhlIG1lbW9yeSBmb3IgdGhlIGJ1ZmZlciBpcworICogYWxsb2NhdGVkIGR5bmFtaWNhbGx5LCB0aGUgbnVtYmVyIG9mIGJpdHMgaXMgbm90IGxpbWl0ZWQuCiAgKgogICogXHBhcmFtIHBBZHRzIEFEVFMgZGF0YSBoYW5kbGUKICAqIFxwYXJhbSBoQnMgYml0c3RyZWFtIGhhbmRsZSBvZiB3aGljaCB0aGUgQ1JDIHJlZ2lvbiBlbmRzCi0gKiBccGFyYW0gbUJpdHMgbGltaXQgb2YgbnVtYmVyIG9mIGJpdHMgdG8gYmUgY29uc2lkZXJlZCBmb3IgdGhlIHJlcXVlc3RlZCBDUkMgcmVnaW9uCisgKiBccGFyYW0gbUJpdHMgbGltaXQgb2YgbnVtYmVyIG9mIGJpdHMgdG8gYmUgY29uc2lkZXJlZCBmb3IgdGhlIHJlcXVlc3RlZCBDUkMKKyAqIHJlZ2lvbgogICoKICAqIFxyZXR1cm4gSUQgZm9yIHRoZSBjcmVhdGVkIHJlZ2lvbiwgLTEgaW4gY2FzZSBvZiBhbiBlcnJvcgogICovCi1pbnQgYWR0c1dyaXRlX0NyY1N0YXJ0UmVnKAotICAgICAgICBIQU5ETEVfQURUUyAgICAgICAgICBwQWR0cywKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBtQml0cwotICAgICAgICApOworaW50IGFkdHNXcml0ZV9DcmNTdGFydFJlZyhIQU5ETEVfQURUUyBwQWR0cywgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbUJpdHMpOwogCiAvKioKICAqIFxicmllZiBFbmRzIENSQyByZWdpb24gaWRlbnRpZmllZCBieSByZWcKQEAgLTIwNSwxNCArMjAzLDYgQEAKICAqIFxwYXJhbSBoQnMgYml0c3RyZWFtIGhhbmRsZSBvZiB3aGljaCB0aGUgQ1JDIHJlZ2lvbiBlbmRzCiAgKiBccGFyYW0gcmVnIGEgQ1JDIHJlZ2lvbiBJRCByZXR1cm5lZCBwcmV2aW91c2x5IGJ5IGFkdHNXcml0ZV9DcmNTdGFydFJlZygpCiAgKi8KLXZvaWQgYWR0c1dyaXRlX0NyY0VuZFJlZygKLSAgICAgICAgSEFORExFX0FEVFMgICAgICAgICAgcEFkdHMsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgcmVnCi0gICAgICAgICk7Ci0KLQotCit2b2lkIGFkdHNXcml0ZV9DcmNFbmRSZWcoSEFORExFX0FEVFMgcEFkdHMsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgaW50IHJlZyk7CiAKICNlbmRpZiAvKiBUUEVOQ19BRFRTX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hc2MuY3BwIGIvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hc2MuY3BwCmluZGV4IGJjNDMwMmUuLmNlNGUzNjQgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYXNjLmNwcAorKysgYi9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FzYy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKiBNUEVHIHRyYW5zcG9ydCBmb3JtYXQgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CisKICAgIERlc2NyaXB0aW9uOgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAidHBfZGF0YS5oIgogCkBAIC05NSw3MCArMTA3LDE2MiBAQAogI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKICNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgogCi0jZGVmaW5lIFBDRV9NQVhfRUxFTUVOVFMgOAorI2luY2x1ZGUgIkZES19jcmMuaCIKKworI2RlZmluZSBQQ0VfSEVJR0hUX0VYVF9TWU5DICgweEFDKQorI2RlZmluZSBIRUlHSFRfTk9STUFMIDAKKyNkZWZpbmUgSEVJR0hUX1RPUCAxCisjZGVmaW5lIEhFSUdIVF9CT1RUT00gMgorI2RlZmluZSBNQVhfRlJPTlRfRUxFTUVOVFMgOAorI2RlZmluZSBNQVhfU0lERV9FTEVNRU5UUyAzCisjZGVmaW5lIE1BWF9CQUNLX0VMRU1FTlRTIDQKKworLyoqCisgKiAgRGVzY3JpYmUgYWRkaXRpb25hbCBQQ0UgaGVpZ2h0IGluZm9ybWF0aW9uIGZvciBmcm9udCwgc2lkZSBhbmQgYmFjayBjaGFubmVsCisgKiBlbGVtZW50cy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUgorICBudW1fZnJvbnRfaGVpZ2h0X2NoYW5uZWxfZWxlbWVudHNbMl07ICAgICAgLyohPCBOdW1iZXIgb2YgZnJvbnQgY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgaW4gdG9wIFswXSBhbmQgYm90dG9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMV0gcGxhbmUuICovCisgIFVDSEFSIG51bV9zaWRlX2hlaWdodF9jaGFubmVsX2VsZW1lbnRzWzJdOyAvKiE8IE51bWJlciBvZiBzaWRlIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGluIHRvcCBbMF0gYW5kIGJvdHRvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzFdIHBsYW5lLiAqLworICBVQ0hBUiBudW1fYmFja19oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1syXTsgLyohPCBOdW1iZXIgb2YgYmFjayBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyBpbiB0b3AgWzBdIGFuZCBib3R0b20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxXSBwbGFuZS4gKi8KK30gUENFX0hFSUdIVF9OVU07CiAKIC8qKgogICogIERlc2NyaWJlIGEgUENFIGJhc2VkIG9uIHBsYWNlZCBjaGFubmVsIGVsZW1lbnRzIGFuZCBlbGVtZW50IHR5cGUgc2VxdWVuY2UuCiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKLQotICAgIFVDSEFSICAgIG51bV9mcm9udF9jaGFubmVsX2VsZW1lbnRzOyAgICAgLyohPCBOdW1iZXIgb2YgZnJvbnQgY2hhbm5lbCBlbGVtZW50cy4gKi8KLSAgICBVQ0hBUiAgICBudW1fc2lkZV9jaGFubmVsX2VsZW1lbnRzOyAgICAgIC8qITwgTnVtYmVyIG9mIHNpZGUgY2hhbm5lbCBlbGVtZW50cy4gKi8KLSAgICBVQ0hBUiAgICBudW1fYmFja19jaGFubmVsX2VsZW1lbnRzOyAgICAgIC8qITwgTnVtYmVyIG9mIGJhY2sgY2hhbm5lbCBlbGVtZW50cy4gKi8KLSAgICBVQ0hBUiAgICBudW1fbGZlX2NoYW5uZWxfZWxlbWVudHM7ICAgICAgIC8qITwgTnVtYmVyIG9mIGxmZSBjaGFubmVsIGVsZW1lbnRzLiAqLwotICAgIE1QNF9FTEVNRU5UX0lEIGVsX2xpc3RbUENFX01BWF9FTEVNRU5UU107LyohPCBMaXN0IGNvbnRhaW5zIHNlcXVlbmNlIGRlc2NyaWJpbmcgdGhlIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHByZXNlbnQgY2hhbm5lbCBtb2RlLiAoTVBFRyBvcmRlcikgKi8KKyAgVUNIQVIgbnVtX2Zyb250X2NoYW5uZWxfZWxlbWVudHM7IC8qITwgTnVtYmVyIG9mIGZyb250IGNoYW5uZWwgZWxlbWVudHMuICovCisgIFVDSEFSIG51bV9zaWRlX2NoYW5uZWxfZWxlbWVudHM7ICAvKiE8IE51bWJlciBvZiBzaWRlIGNoYW5uZWwgZWxlbWVudHMuICovCisgIFVDSEFSIG51bV9iYWNrX2NoYW5uZWxfZWxlbWVudHM7ICAvKiE8IE51bWJlciBvZiBiYWNrIGNoYW5uZWwgZWxlbWVudHMuICovCisgIFVDSEFSIG51bV9sZmVfY2hhbm5lbF9lbGVtZW50czsgICAvKiE8IE51bWJlciBvZiBsZmUgY2hhbm5lbCBlbGVtZW50cy4gKi8KKyAgY29uc3QgTVA0X0VMRU1FTlRfSUQKKyAgICAgICpwRWxfdHlwZTsgLyohPCBMaXN0IGNvbnRhaW5zIHNlcXVlbmNlIGRlc2NyaWJpbmcgdGhlIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgaW4gcHJlc2VudCBjaGFubmVsIG1vZGUuIChNUEVHIG9yZGVyKSAqLworICBjb25zdCBQQ0VfSEVJR0hUX05VTSAqcEhlaWdodF9udW07CiB9IFBDRV9DT05GSUdVUkFUSU9OOwogCi0KIC8qKgogICogIE1hcCBhbiBpbmNvbWluZyBjaGFubmVsIG1vZGUgdG8gYSBleGlzdGluZyBQQ0UgY29uZmlndXJhdGlvbiBlbnRyeS4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgewotCi0gICAgQ0hBTk5FTF9NT0RFICAgICAgICBjaGFubmVsX21vZGU7ICAgICAgICAvKiE8IFByZXNlbnQgY2hhbm5lbCBtb2RlLiAqLwotICAgIFBDRV9DT05GSUdVUkFUSU9OICAgcGNlX2NvbmZpZ3VyYXRpb247ICAgLyohPCBQcm9ncmFtIGNvbmZpZyBlbGVtZW50IGRlc2NyaXB0aW9uLiAqLworICBDSEFOTkVMX01PREUgY2hhbm5lbF9tb2RlOyAvKiE8IFByZXNlbnQgY2hhbm5lbCBtb2RlLiAqLworICBQQ0VfQ09ORklHVVJBVElPTgorICBwY2VfY29uZmlndXJhdGlvbjsgLyohPCBQcm9ncmFtIGNvbmZpZyBlbGVtZW50IGRlc2NyaXB0aW9uLiAqLwogCiB9IENIQU5ORUxfQ09ORklHVVJBVElPTjsKIAorLyoqCisgKiBUaGUgZm9sbG93aW5nIGFycmF5cyBwcm92aWRlIHRoZSBJRHMgb2YgdGhlIGNvbnNlY3V0aXZlIGVsZW1lbnRzIGZvciBlYWNoCisgKiBtb2RlLgorICovCitzdGF0aWMgY29uc3QgTVA0X0VMRU1FTlRfSUQgZWxUeXBlXzFbXSA9IHtJRF9TQ0V9Oworc3RhdGljIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGVsVHlwZV8yW10gPSB7SURfQ1BFfTsKK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbFR5cGVfMV8yW10gPSB7SURfU0NFLCBJRF9DUEV9Oworc3RhdGljIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGVsVHlwZV8xXzJfMVtdID0ge0lEX1NDRSwgSURfQ1BFLCBJRF9TQ0V9Oworc3RhdGljIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGVsVHlwZV8xXzJfMltdID0ge0lEX1NDRSwgSURfQ1BFLCBJRF9DUEV9Oworc3RhdGljIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGVsVHlwZV8xXzJfMl8xW10gPSB7SURfU0NFLCBJRF9DUEUsIElEX0NQRSwgSURfTEZFfTsKK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbFR5cGVfMV8yXzJfMl8xW10gPSB7SURfU0NFLCBJRF9DUEUsIElEX0NQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURfQ1BFLCBJRF9MRkV9Oworc3RhdGljIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGVsVHlwZV82XzFbXSA9IHtJRF9TQ0UsIElEX0NQRSwgSURfQ1BFLCBJRF9TQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX0xGRX07CitzdGF0aWMgY29uc3QgTVA0X0VMRU1FTlRfSUQgZWxUeXBlXzdfMV9iYWNrW10gPSB7SURfU0NFLCBJRF9DUEUsIElEX0NQRSwgSURfQ1BFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX0xGRX07CitzdGF0aWMgY29uc3QgTVA0X0VMRU1FTlRfSUQgZWxUeXBlXzdfMV90b3BfZnJvbnRbXSA9IHtJRF9TQ0UsIElEX0NQRSwgSURfQ1BFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURfTEZFLCBJRF9DUEV9Oworc3RhdGljIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGVsVHlwZV83XzFfcmVhcl9zdXJyb3VuZFtdID0geworICAgIElEX1NDRSwgSURfQ1BFLCBJRF9DUEUsIElEX0NQRSwgSURfTEZFfTsKK3N0YXRpYyBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbFR5cGVfN18xX2Zyb250X2NlbnRlcltdID0ge0lEX1NDRSwgSURfQ1BFLCBJRF9DUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9DUEUsIElEX0xGRX07CiAKIC8qKgotICogXGJyaWVmIFRhYmxlIGNvbnRhaW5zIGFsbCBzdXBwb3J0ZWQgY2hhbm5lbCBtb2RlcyBhbmQgYWNjb3JkaW5nIFBDRSBjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uLgotICoKLSAqIFRoZSBudW1iZXIgb2YgY2hhbm5lbCBlbGVtZW50IHBhcmFtZXRlciBkZXNjcmliZXMgdGhlIGtpbmQgb2YgY29uc2VjdXRpdmVseSBlbGVtZW50cy4KLSAqIEUuZy4gTU9ERV8xXzJfMl8yXzEgbWVhbnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBGaXJzdCAzIGVsZW1lbnRzIChTQ0UsQ1BFLENQRSkgYXJlIGZyb250IGNoYW5uZWwgZWxlbWVudHMuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgLSBOZXh0IGVsZW1lbnQgKENQRSkgaXMgYSBiYWNrIGNoYW5uZWwgZWxlbWVudC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAtIExhc3QgZWxlbWVudCAoTEZFKSBpcyBhIGxmZSBjaGFubmVsIGVsZW1lbnQuCisgKiBUaGUgZm9sbG93aW5nIGFycmF5cyBwcm92aWRlIGluZm9ybWF0aW9uIG9uIGhvdyBtYW55IGZyb250LCBzaWRlIGFuZCBiYWNrCisgKiBlbGVtZW50cyBhcmUgYXNzaWduZWQgdG8gdGhlIHRvcCBvciBib3R0b20gcGxhbmUgZm9yIGVhY2ggbW9kZSB0aGF0IGNvbXByaXNlcworICogaGVpZ2h0IGluZm9ybWF0aW9uLgogICovCi1zdGF0aWMgY29uc3QgQ0hBTk5FTF9DT05GSUdVUkFUSU9OIHBjZUNvbmZpZ1RhYltdID0KLXsKLSAgeyBNT0RFXzEsICAgICAgICAgICAgICAgICAgICAgICAgeyAgMSwgMCwgMCwgMCwgeyBJRF9TQ0UsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gfSB9LAotICB7IE1PREVfMiwgICAgICAgICAgICAgICAgICAgICAgICB7ICAxLCAwLCAwLCAwLCB7IElEX0NQRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCi0gIHsgTU9ERV8xXzIsICAgICAgICAgICAgICAgICAgICAgIHsgIDIsIDAsIDAsIDAsIHsgSURfU0NFLCAgSURfQ1BFLCAgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9IH0gfSwKLSAgeyBNT0RFXzFfMl8xLCAgICAgICAgICAgICAgICAgICAgeyAgMiwgMCwgMSwgMCwgeyBJRF9TQ0UsICBJRF9DUEUsICBJRF9TQ0UsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gfSB9LAotICB7IE1PREVfMV8yXzIsICAgICAgICAgICAgICAgICAgICB7ICAyLCAwLCAxLCAwLCB7IElEX1NDRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCi0gIHsgTU9ERV8xXzJfMl8xLCAgICAgICAgICAgICAgICAgIHsgIDIsIDAsIDEsIDEsIHsgSURfU0NFLCAgSURfQ1BFLCAgSURfQ1BFLCAgSURfTEZFLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gfSB9LAotICB7IE1PREVfMV8yXzJfMl8xLCAgICAgICAgICAgICAgICB7ICAzLCAwLCAxLCAxLCB7IElEX1NDRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX0xGRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCitzdGF0aWMgY29uc3QgUENFX0hFSUdIVF9OVU0gaGVpZ2h0TnVtXzdfMV90b3BfZnJvbnQgPSB7ezEsIDB9LCB7MCwgMH0sIHswLCAwfX07CiAKKy8qKgorICogXGJyaWVmIFRhYmxlIGNvbnRhaW5zIGFsbCBzdXBwb3J0ZWQgY2hhbm5lbCBtb2RlcyBhbmQgYWNjb3JkaW5nIFBDRQorIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb24uCisgKgorICogVGhlIG1vZGUgaWRlbnRpZmllciBpcyBmb2xsb3dlZCBieSB0aGUgbnVtYmVyIG9mIGZyb250LCBzaWRlLCBiYWNrLCBhbmQgTEZFCisgZWxlbWVudHMuCisgKiBUaGVzZSBhcmUgZm9sbG93ZWQgYnkgYSBwb2ludGVyIHRvIHRoZSBJRHMgb2YgdGhlIGNvbnNlY3V0aXZlIGVsZW1lbnRzCisgKElEX1NDRSwgSURfQ1BFLCBJRF9MRkUpLgorICoKKyAqIEZvciBzb21lIG1vZGVzIChNT0RFXzdfMV9UT1BfRlJPTlQgYW5kIE1PREVfMjJfMikgYWRkaXRpb25hbCBoZWlnaHQKKyBpbmZvcm1hdGlvbiBpcyB0cmFuc21pdHRlZC4KKyAqIEluIHRoaXMgY2FzZSB0aGUgYWRkaXRpb25hbCBwb2ludGVyIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIGhvdyBtYW55IGZyb250LAorIHNpZGUgYW5kIGJhY2sgZWxlbWVudHMKKyAqIGFyZSBhc3NpZ25lZCB0byB0aGUgdG9wIG9yIGJvdHRvbSBwbGFuZS5UaGUgZWxlbWVudHMgYXJlIGFycmFuZ2VkIGluIHRoZQorIGZvbGxvd2luZyBvcmRlcjogbm9ybWFsIGhlaWdodCAoZnJvbnQsIHNpZGUsIGJhY2ssIExGRSksIHRvcCBoZWlnaHQgKGZyb250LAorIHNpZGUsIGJhY2spLCBib3R0b20gaGVpZ2h0IChmcm9udCwgc2lkZSwgYmFjaykuCisgKgorICoKKyAqIEUuZy4gTU9ERV83XzFfVE9QX0ZST05UIG1lYW5zOgorICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gMyBlbGVtZW50cyBhcmUgZnJvbnQgY2hhbm5lbCBlbGVtZW50cy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAtIDAgZWxlbWVudHMgYXJlIHNpZGUgY2hhbm5lbCBlbGVtZW50cy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEgZWxlbWVudCBpcyBiYWNrIGNoYW5uZWwgZWxlbWVudC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEgZWxlbWVudCBpcyBhbiBMRkUgY2hhbm5lbCBlbGVtZW50LgorICogICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGhlIGVsZW1lbnQgb3JkZXIgaXMgSURfU0NFLCBJRF9DUEUsIElEX0NQRSwKKyBJRF9MRkUsIElEX0NQRS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEgb2YgdGhlIGZyb250IGVsZW1lbnRzIGlzIGluIHRoZSB0b3AgcGxhbmUuCisgKgorICogVGhpcyBsZWFkcyB0byB0aGUgZm9sbG93aW5nIG1hcHBpbmcgZm9yIHRoZSBjY29uc2VjdXRpdmUgZWxlbWVudHMgaW4gdGhlCisgTU9ERV83XzFfVE9QX0ZST05UIGJpdHN0cmVhbToKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAtIElEX1NDRSAtPiBub3JtYWwgaGVpZ2h0IGZyb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gSURfQ1BFIC0+IG5vcm1hbCBoZWlnaHQgZnJvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBJRF9DUEUgLT4gbm9ybWFsIGhlaWdodCBiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gSURfTEZFIC0+IG5vcm1hbCBoZWlnaHQgTEZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gSURfQ1BFIC0+IHRvcCBoZWlnaHQgZnJvbnQuCisgKi8KK3N0YXRpYyBjb25zdCBDSEFOTkVMX0NPTkZJR1VSQVRJT04gcGNlQ29uZmlnVGFiW10gPSB7CisgICAge01PREVfMSwKKyAgICAgezEsIDAsIDAsIDAsIGVsVHlwZV8xLAorICAgICAgTlVMTH19LCAvKiBkb24ndCB0cmFuc21pdCBoZWlnaHQgaW5mb3JtYXRpb24gaW4gdGhpcyBtb2RlICovCisgICAge01PREVfMiwKKyAgICAgezEsIDAsIDAsIDAsIGVsVHlwZV8yLAorICAgICAgTlVMTH19LCAvKiBkb24ndCB0cmFuc21pdCBoZWlnaHQgaW5mb3JtYXRpb24gaW4gdGhpcyBtb2RlICovCisgICAge01PREVfMV8yLAorICAgICB7MiwgMCwgMCwgMCwgZWxUeXBlXzFfMiwKKyAgICAgIE5VTEx9fSwgLyogZG9uJ3QgdHJhbnNtaXQgaGVpZ2h0IGluZm9ybWF0aW9uIGluIHRoaXMgbW9kZSAqLworICAgIHtNT0RFXzFfMl8xLAorICAgICB7MiwgMCwgMSwgMCwgZWxUeXBlXzFfMl8xLAorICAgICAgTlVMTH19LCAvKiBkb24ndCB0cmFuc21pdCBoZWlnaHQgaW5mb3JtYXRpb24gaW4gdGhpcyBtb2RlICovCisgICAge01PREVfMV8yXzIsCisgICAgIHsyLCAwLCAxLCAwLCBlbFR5cGVfMV8yXzIsCisgICAgICBOVUxMfX0sIC8qIGRvbid0IHRyYW5zbWl0IGhlaWdodCBpbmZvcm1hdGlvbiBpbiB0aGlzIG1vZGUgKi8KKyAgICB7TU9ERV8xXzJfMl8xLAorICAgICB7MiwgMCwgMSwgMSwgZWxUeXBlXzFfMl8yXzEsCisgICAgICBOVUxMfX0sIC8qIGRvbid0IHRyYW5zbWl0IGhlaWdodCBpbmZvcm1hdGlvbiBpbiB0aGlzIG1vZGUgKi8KKyAgICB7TU9ERV8xXzJfMl8yXzEsCisgICAgIHszLCAwLCAxLCAxLCBlbFR5cGVfMV8yXzJfMl8xLAorICAgICAgTlVMTH19LCAvKiBkb24ndCB0cmFuc21pdCBoZWlnaHQgaW5mb3JtYXRpb24gaW4gdGhpcyBtb2RlICovCiAKLSAgeyBNT0RFXzFfMSwgICAgICAgICAgICAgICAgICAgICAgeyAgMiwgMCwgMCwgMCwgeyBJRF9TQ0UsICBJRF9TQ0UsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gfSB9LAotICB7IE1PREVfMV8xXzFfMSwgICAgICAgICAgICAgICAgICB7ICAyLCAyLCAwLCAwLCB7IElEX1NDRSwgIElEX1NDRSwgIElEX1NDRSwgIElEX1NDRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCi0gIHsgTU9ERV8xXzFfMV8xXzFfMSwgICAgICAgICAgICAgIHsgIDIsIDIsIDIsIDAsIHsgSURfU0NFLCAgSURfU0NFLCAgSURfU0NFLCAgSURfU0NFLCAgSURfU0NFLCAgSURfU0NFLCAgSURfTk9ORSwgSURfTk9ORSB9IH0gfSwKLSAgeyBNT0RFXzFfMV8xXzFfMV8xXzFfMSwgICAgICAgICAgeyAgMywgMiwgMywgMCwgeyBJRF9TQ0UsICBJRF9TQ0UsICBJRF9TQ0UsICBJRF9TQ0UsICBJRF9TQ0UsICBJRF9TQ0UsICBJRF9TQ0UsICBJRF9TQ0UgfSB9IH0sCisgICAge01PREVfNl8xLAorICAgICB7MiwgMCwgMiwgMSwgZWxUeXBlXzZfMSwKKyAgICAgIE5VTEx9fSwgLyogZG9uJ3QgdHJhbnNtaXQgaGVpZ2h0IGluZm9ybWF0aW9uIGluIHRoaXMgbW9kZSAqLworICAgIHtNT0RFXzdfMV9CQUNLLAorICAgICB7MiwgMCwgMiwgMSwgZWxUeXBlXzdfMV9iYWNrLAorICAgICAgTlVMTH19LCAvKiBkb24ndCB0cmFuc21pdCBoZWlnaHQgaW5mb3JtYXRpb24gaW4gdGhpcyBtb2RlICovCisgICAge01PREVfN18xX1RPUF9GUk9OVCwKKyAgICAgezMsIDAsIDEsIDEsIGVsVHlwZV83XzFfdG9wX2Zyb250LCAmaGVpZ2h0TnVtXzdfMV90b3BfZnJvbnR9fSwKIAotICB7IE1PREVfMl8yLCAgICAgICAgICAgICAgICAgICAgICB7ICAxLCAwLCAxLCAwLCB7IElEX0NQRSwgIElEX0NQRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCi0gIHsgTU9ERV8yXzJfMiwgICAgICAgICAgICAgICAgICAgIHsgIDEsIDEsIDEsIDAsIHsgSURfQ1BFLCAgSURfQ1BFLCAgSURfQ1BFLCAgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9IH0gfSwKLSAgeyBNT0RFXzJfMl8yXzIsICAgICAgICAgICAgICAgICAgeyAgNCwgMCwgMCwgMCwgeyBJRF9DUEUsICBJRF9DUEUsICBJRF9DUEUsICBJRF9DUEUsICBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FLCBJRF9OT05FIH0gfSB9LAotCi0gIHsgTU9ERV8yXzEsICAgICAgICAgICAgICAgICAgICAgIHsgIDEsIDAsIDEsIDAsIHsgSURfQ1BFLCAgSURfU0NFLCAgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9IH0gfSwKLQotICB7IE1PREVfN18xX1JFQVJfU1VSUk9VTkQsICAgICAgICB7ICAyLCAwLCAyLCAxLCB7IElEX1NDRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX0NQRSwgIElEX0xGRSwgIElEX05PTkUsIElEX05PTkUsIElEX05PTkUgfSB9IH0sCi0gIHsgTU9ERV83XzFfRlJPTlRfQ0VOVEVSLCAgICAgICAgIHsgIDMsIDAsIDEsIDEsIHsgSURfU0NFLCAgSURfQ1BFLCAgSURfQ1BFLCAgSURfQ1BFLCAgSURfTEZFLCAgSURfTk9ORSwgSURfTk9ORSwgSURfTk9ORSB9IH0gfSwKLQorICAgIHtNT0RFXzdfMV9SRUFSX1NVUlJPVU5ELAorICAgICB7MiwgMCwgMiwgMSwgZWxUeXBlXzdfMV9yZWFyX3N1cnJvdW5kLAorICAgICAgTlVMTH19LCAvKiBkb24ndCB0cmFuc21pdCBoZWlnaHQgaW5mb3JtYXRpb24gaW4gdGhpcyBtb2RlICovCisgICAge01PREVfN18xX0ZST05UX0NFTlRFUiwKKyAgICAgezMsIDAsIDEsIDEsIGVsVHlwZV83XzFfZnJvbnRfY2VudGVyLAorICAgICAgTlVMTH19IC8qIGRvbid0IHRyYW5zbWl0IGhlaWdodCBpbmZvcm1hdGlvbiBpbiB0aGlzIG1vZGUgKi8KIH07CiAKLQogLyoqCiAgKiBcYnJpZWYgIEdldCBwcm9ncmFtIGNvbmZpZyBlbGVtZW50IGRlc2NyaXB0aW9uIGZvciBleGlzdGluZyBjaGFubmVsIG1vZGUuCiAgKgpAQCAtMTY4LDEyMyArMjcyLDI2MCBAQAogICogICAgICAgICAgLSBQb2ludGVyIHRvIFBDRV9DT05GSUdVUkFUSU9OIGVudHJ5LCBvbiBzdWNjZXNzLgogICogICAgICAgICAgLSBOVUxMLCBvbiBmYWlsdXJlLgogICovCi1zdGF0aWMgY29uc3QgUENFX0NPTkZJR1VSQVRJT04qIGdldFBjZUVudHJ5KAotICAgICAgICBjb25zdCBDSEFOTkVMX01PREUgY2hhbm5lbF9tb2RlCi0gICAgICAgICkKLXsKK3N0YXRpYyBjb25zdCBQQ0VfQ09ORklHVVJBVElPTiAqZ2V0UGNlRW50cnkoY29uc3QgQ0hBTk5FTF9NT0RFIGNoYW5uZWxfbW9kZSkgewogICBVSU5UIGk7CiAgIGNvbnN0IFBDRV9DT05GSUdVUkFUSU9OICpwY2VfY29uZmlnID0gTlVMTDsKIAotICBmb3IgKGk9MDsgaSA8IChzaXplb2YocGNlQ29uZmlnVGFiKS9zaXplb2YoQ0hBTk5FTF9DT05GSUdVUkFUSU9OKSk7IGkrKykgeworICBmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihwY2VDb25maWdUYWIpIC8gc2l6ZW9mKENIQU5ORUxfQ09ORklHVVJBVElPTikpOyBpKyspIHsKICAgICBpZiAocGNlQ29uZmlnVGFiW2ldLmNoYW5uZWxfbW9kZSA9PSBjaGFubmVsX21vZGUpIHsKICAgICAgIHBjZV9jb25maWcgPSAmcGNlQ29uZmlnVGFiW2ldLnBjZV9jb25maWd1cmF0aW9uOworICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAKICAgcmV0dXJuIHBjZV9jb25maWc7CiB9CiAKLWludCBnZXRDaGFubmVsQ29uZmlnKCBDSEFOTkVMX01PREUgY2hhbm5lbF9tb2RlICkKLXsKK2ludCBnZXRDaGFubmVsQ29uZmlnKGNvbnN0IENIQU5ORUxfTU9ERSBjaGFubmVsX21vZGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBjaGFubmVsX2NvbmZpZ196ZXJvKSB7CiAgIElOVCBjaGFuX2NvbmZpZyA9IDA7CiAKLSAgc3dpdGNoKGNoYW5uZWxfbW9kZSkgewotICAgIGNhc2UgTU9ERV8xOiAgICAgICAgIGNoYW5fY29uZmlnID0gMTsgYnJlYWs7Ci0gICAgY2FzZSBNT0RFXzI6ICAgICAgICAgY2hhbl9jb25maWcgPSAyOyBicmVhazsKLSAgICBjYXNlIE1PREVfMV8yOiAgICAgICBjaGFuX2NvbmZpZyA9IDM7IGJyZWFrOwotICAgIGNhc2UgTU9ERV8xXzJfMTogICAgIGNoYW5fY29uZmlnID0gNDsgYnJlYWs7Ci0gICAgY2FzZSBNT0RFXzFfMl8yOiAgICAgY2hhbl9jb25maWcgPSA1OyBicmVhazsKLSAgICBjYXNlIE1PREVfMV8yXzJfMTogICBjaGFuX2NvbmZpZyA9IDY7IGJyZWFrOwotICAgIGNhc2UgTU9ERV8xXzJfMl8yXzE6IGNoYW5fY29uZmlnID0gNzsgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OiAgICAgICAgICAgICBjaGFuX2NvbmZpZyA9IDA7CisgIGlmIChjaGFubmVsX2NvbmZpZ196ZXJvICE9IDApIHsKKyAgICBjaGFuX2NvbmZpZyA9IDA7CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChjaGFubmVsX21vZGUpIHsKKyAgICAgIGNhc2UgTU9ERV8xOgorICAgICAgICBjaGFuX2NvbmZpZyA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNT0RFXzI6CisgICAgICAgIGNoYW5fY29uZmlnID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1PREVfMV8yOgorICAgICAgICBjaGFuX2NvbmZpZyA9IDM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNT0RFXzFfMl8xOgorICAgICAgICBjaGFuX2NvbmZpZyA9IDQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNT0RFXzFfMl8yOgorICAgICAgICBjaGFuX2NvbmZpZyA9IDU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNT0RFXzFfMl8yXzE6CisgICAgICAgIGNoYW5fY29uZmlnID0gNjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1PREVfMV8yXzJfMl8xOgorICAgICAgICBjaGFuX2NvbmZpZyA9IDc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNT0RFXzZfMToKKyAgICAgICAgY2hhbl9jb25maWcgPSAxMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1PREVfN18xX0JBQ0s6CisgICAgICAgIGNoYW5fY29uZmlnID0gMTI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNT0RFXzdfMV9UT1BfRlJPTlQ6CisgICAgICAgIGNoYW5fY29uZmlnID0gMTQ7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2hhbl9jb25maWcgPSAwOworICAgIH0KICAgfQogCiAgIHJldHVybiBjaGFuX2NvbmZpZzsKIH0KIAotQ0hBTk5FTF9NT0RFIHRyYW5zcG9ydEVuY19HZXRDaGFubmVsTW9kZSggaW50IG5vQ2hhbm5lbHMgKQoteworQ0hBTk5FTF9NT0RFIHRyYW5zcG9ydEVuY19HZXRDaGFubmVsTW9kZShpbnQgbm9DaGFubmVscykgewogICBDSEFOTkVMX01PREUgY2hNb2RlOwogCiAgIGlmIChub0NoYW5uZWxzIDw9IDggJiYgbm9DaGFubmVscyA+IDApCi0gICAgY2hNb2RlID0gKENIQU5ORUxfTU9ERSkoKG5vQ2hhbm5lbHMgPT0gOCkgPyA3IDogbm9DaGFubmVscyk7IC8qIHNlZSA6IGlzby9tcGVnNCB2MSBhdWRpbyBzdWJwYXJ0MSovCisgICAgY2hNb2RlID0gKENIQU5ORUxfTU9ERSkoCisgICAgICAgIChub0NoYW5uZWxzID09IDgpID8gNworICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5vQ2hhbm5lbHMpOyAvKiBzZWUgOiBpc28vbXBlZzQgdjEgYXVkaW8gc3VicGFydDEqLwogICBlbHNlCiAgICAgY2hNb2RlID0gTU9ERV9VTktOT1dOOwogCiAgIHJldHVybiBjaE1vZGU7CiB9CiAKLSNpZmRlZiBUUF9QQ0VfRU5BQkxFCi1pbnQgdHJhbnNwb3J0RW5jX3dyaXRlUENFKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluc3RhbmNlVGFnUENFLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hdHJpeE1peGRvd25BLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHNldWRvU3Vycm91bmRFbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYWxpZ25BbmNob3IpCi17CitpbnQgdHJhbnNwb3J0RW5jX3dyaXRlUENFKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSwgaW50IGluc3RhbmNlVGFnUENFLCBpbnQgcHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hdHJpeE1peGRvd25BLCBpbnQgcHNldWRvU3Vycm91bmRFbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYWxpZ25BbmNob3IpIHsKICAgaW50IHNhbXBsZVJhdGVJbmRleCwgaTsKLSAgY29uc3QgUENFX0NPTkZJR1VSQVRJT04qIGNvbmZpZyA9IE5VTEw7Ci0gIGNvbnN0IE1QNF9FTEVNRU5UX0lEKiBwRWxfbGlzdCA9IE5VTEw7Ci0gIFVDSEFSIGNwZUNudD0wLCBzY2VDbnQ9MCwgbGZlQ250PTA7CisgIGNvbnN0IFBDRV9DT05GSUdVUkFUSU9OICpjb25maWcgPSBOVUxMOworICBjb25zdCBNUDRfRUxFTUVOVF9JRCAqcEVsX2xpc3QgPSBOVUxMOworICBVQ0hBUiBjcGVDbnQgPSAwLCBzY2VDbnQgPSAwLCBsZmVDbnQgPSAwLCBmcm50Q250ID0gMCwgc2RDbnQgPSAwLCBiY2tDbnQgPSAwLAorICAgICAgICBpc0NwZSA9IDAsIHRhZyA9IDAsIG5vcm1hbEZyb250RW5kID0gMCwgbm9ybWFsU2lkZUVuZCA9IDAsCisgICAgICAgIG5vcm1hbEJhY2tFbmQgPSAwLCB0b3BGcm9udEVuZCA9IDAsIHRvcFNpZGVFbmQgPSAwLCB0b3BCYWNrRW5kID0gMCwKKyAgICAgICAgYm90dG9tRnJvbnRFbmQgPSAwLCBib3R0b21TaWRlRW5kID0gMDsKKyNpZmRlZiBGREtfQVNTRVJUX0VOQUJMRQorICBVQ0hBUiBib3R0b21CYWNrRW5kID0gMDsKKyNlbmRpZgorICBlbnVtIGVsZW1lbnREZXB0aCB7IEZST05ULCBTSURFLCBCQUNLIH0gZWxEZXB0aDsKIAotICBzYW1wbGVSYXRlSW5kZXggPSBnZXRTYW1wbGluZ1JhdGVJbmRleChzYW1wbGVSYXRlKTsKKyAgc2FtcGxlUmF0ZUluZGV4ID0gZ2V0U2FtcGxpbmdSYXRlSW5kZXgoc2FtcGxlUmF0ZSwgNCk7CiAgIGlmIChzYW1wbGVSYXRlSW5kZXggPT0gMTUpIHsKICAgICByZXR1cm4gLTE7CiAgIH0KIAotICBpZiAoKGNvbmZpZz1nZXRQY2VFbnRyeShjaGFubmVsTW9kZSkpPT1OVUxMKSB7CisgIGlmICgoY29uZmlnID0gZ2V0UGNlRW50cnkoY2hhbm5lbE1vZGUpKSA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIC0xOwogICB9CiAKLSAgLyogUG9pbnRlciB0byBmaXJzdCBlbGVtZW50IGluIGVsZW1lbnQgbGlzdC4gKi8KLSAgcEVsX2xpc3QgPSAmY29uZmlnLT5lbF9saXN0WzBdOworICBGREtfQVNTRVJUKGNvbmZpZy0+bnVtX2Zyb250X2NoYW5uZWxfZWxlbWVudHMgPD0gTUFYX0ZST05UX0VMRU1FTlRTKTsKKyAgRkRLX0FTU0VSVChjb25maWctPm51bV9zaWRlX2NoYW5uZWxfZWxlbWVudHMgPD0gTUFYX1NJREVfRUxFTUVOVFMpOworICBGREtfQVNTRVJUKGNvbmZpZy0+bnVtX2JhY2tfY2hhbm5lbF9lbGVtZW50cyA8PSBNQVhfQkFDS19FTEVNRU5UUyk7CiAKLSAgRkRLd3JpdGVCaXRzKGhCcywgaW5zdGFuY2VUYWdQQ0UsICA0KTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGluc3RhbmNlIHRhZyAqLwotICBGREt3cml0ZUJpdHMoaEJzLCBwcm9maWxlLCAgICAgICAgIDIpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9iamVjdCB0eXBlICovCi0gIEZES3dyaXRlQml0cyhoQnMsIHNhbXBsZVJhdGVJbmRleCwgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgaW5kZXgqLworICBVQ0hBUiBmcm9udElzQ3BlW01BWF9GUk9OVF9FTEVNRU5UU10gPSB7MH0sCisgICAgICAgIGZyb250VGFnW01BWF9GUk9OVF9FTEVNRU5UU10gPSB7MH0sIHNpZGVJc0NwZVtNQVhfU0lERV9FTEVNRU5UU10gPSB7MH0sCisgICAgICAgIHNpZGVUYWdbTUFYX1NJREVfRUxFTUVOVFNdID0gezB9LCBiYWNrSXNDcGVbTUFYX0JBQ0tfRUxFTUVOVFNdID0gezB9LAorICAgICAgICBiYWNrVGFnW01BWF9CQUNLX0VMRU1FTlRTXSA9IHswfTsKIAotICBGREt3cml0ZUJpdHMoaEJzLCBjb25maWctPm51bV9mcm9udF9jaGFubmVsX2VsZW1lbnRzLCA0KTsgICAgIC8qIEZyb250IGNoYW5uZWwgRWxlbWVudHMgKi8KLSAgRkRLd3JpdGVCaXRzKGhCcywgY29uZmlnLT5udW1fc2lkZV9jaGFubmVsX2VsZW1lbnRzICwgNCk7ICAgICAvKiBObyBTaWRlIENoYW5uZWwgRWxlbWVudHMgKi8KLSAgRkRLd3JpdGVCaXRzKGhCcywgY29uZmlnLT5udW1fYmFja19jaGFubmVsX2VsZW1lbnRzICwgNCk7ICAgICAvKiBObyBCYWNrIGNoYW5uZWwgRWxlbWVudHMgKi8KLSAgRkRLd3JpdGVCaXRzKGhCcywgY29uZmlnLT5udW1fbGZlX2NoYW5uZWxfZWxlbWVudHMgICwgMik7ICAgICAvKiBObyBMZmUgY2hhbm5lbCBlbGVtZW50cyAqLworICAvKiBXcml0ZSBnZW5lcmFsIGluZm9ybWF0aW9uICovCiAKLSAgRkRLd3JpdGVCaXRzKGhCcywgMCwgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBhc3NvYyBkYXRhIGVsZW1lbnRzICovCi0gIEZES3dyaXRlQml0cyhoQnMsIDAsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gdmFsaWQgY2MgZWxlbWVudHMgKi8KLSAgRkRLd3JpdGVCaXRzKGhCcywgMCwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb25vIG1peGRvd24gcHJlc2VudCAqLwotICBGREt3cml0ZUJpdHMoaEJzLCAwLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0ZXJlbyBtaXhkb3duIHByZXNlbnQgKi8KKyAgRkRLd3JpdGVCaXRzKGhCcywgaW5zdGFuY2VUYWdQQ0UsIDQpOyAgLyogRWxlbWVudCBpbnN0YW5jZSB0YWcgKi8KKyAgRkRLd3JpdGVCaXRzKGhCcywgcHJvZmlsZSwgMik7ICAgICAgICAgLyogT2JqZWN0IHR5cGUgKi8KKyAgRkRLd3JpdGVCaXRzKGhCcywgc2FtcGxlUmF0ZUluZGV4LCA0KTsgLyogU2FtcGxlIHJhdGUgaW5kZXgqLwogCi0gIGlmICggbWF0cml4TWl4ZG93bkEhPTAgJiYgKChjaGFubmVsTW9kZT09TU9ERV8xXzJfMil8fChjaGFubmVsTW9kZT09TU9ERV8xXzJfMl8xKSkgKSB7Ci0gICAgICBGREt3cml0ZUJpdHMoaEJzLCAxLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF0cml4IG1peGRvd24gcHJlc2VudCAqLwotICAgICAgRkRLd3JpdGVCaXRzKGhCcywgKG1hdHJpeE1peGRvd25BLTEpJjB4MywgMik7ICAgICAgICAgICAgIC8qIG1hdHJpeF9taXhkb3duX2lkeCAqLwotICAgICAgRkRLd3JpdGVCaXRzKGhCcywgKHBzZXVkb1N1cnJvdW5kRW5hYmxlKT8xOjAsIDEpOyAgICAgICAgIC8qIHBzZXVkb19zdXJyb3VuZF9lbmFibGUgKi8KLSAgfQotICBlbHNlIHsKLSAgICAgIEZES3dyaXRlQml0cyhoQnMsIDAsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXRyaXggbWl4ZG93biBub3QgcHJlc2VudCAqLworICBGREt3cml0ZUJpdHMoaEJzLCBjb25maWctPm51bV9mcm9udF9jaGFubmVsX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgNCk7IC8qIEZyb250IGNoYW5uZWwgRWxlbWVudHMgKi8KKyAgRkRLd3JpdGVCaXRzKGhCcywgY29uZmlnLT5udW1fc2lkZV9jaGFubmVsX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgNCk7IC8qIE5vIFNpZGUgQ2hhbm5lbCBFbGVtZW50cyAqLworICBGREt3cml0ZUJpdHMoaEJzLCBjb25maWctPm51bV9iYWNrX2NoYW5uZWxfZWxlbWVudHMsCisgICAgICAgICAgICAgICA0KTsgLyogTm8gQmFjayBjaGFubmVsIEVsZW1lbnRzICovCisgIEZES3dyaXRlQml0cyhoQnMsIGNvbmZpZy0+bnVtX2xmZV9jaGFubmVsX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgMik7IC8qIE5vIExmZSBjaGFubmVsIGVsZW1lbnRzICovCisKKyAgRkRLd3JpdGVCaXRzKGhCcywgMCwgMyk7IC8qIE5vIGFzc29jIGRhdGEgZWxlbWVudHMgKi8KKyAgRkRLd3JpdGVCaXRzKGhCcywgMCwgNCk7IC8qIE5vIHZhbGlkIGNjIGVsZW1lbnRzICovCisgIEZES3dyaXRlQml0cyhoQnMsIDAsIDEpOyAvKiBNb25vIG1peGRvd24gcHJlc2VudCAqLworICBGREt3cml0ZUJpdHMoaEJzLCAwLCAxKTsgLyogU3RlcmVvIG1peGRvd24gcHJlc2VudCAqLworCisgIGlmIChtYXRyaXhNaXhkb3duQSAhPSAwICYmCisgICAgICAoKGNoYW5uZWxNb2RlID09IE1PREVfMV8yXzIpIHx8IChjaGFubmVsTW9kZSA9PSBNT0RFXzFfMl8yXzEpKSkgeworICAgIEZES3dyaXRlQml0cyhoQnMsIDEsIDEpOyAvKiBNYXRyaXggbWl4ZG93biBwcmVzZW50ICovCisgICAgRkRLd3JpdGVCaXRzKGhCcywgKG1hdHJpeE1peGRvd25BIC0gMSkgJiAweDMsIDIpOyAvKiBtYXRyaXhfbWl4ZG93bl9pZHggKi8KKyAgICBGREt3cml0ZUJpdHMoaEJzLCAocHNldWRvU3Vycm91bmRFbmFibGUpID8gMSA6IDAsCisgICAgICAgICAgICAgICAgIDEpOyAvKiBwc2V1ZG9fc3Vycm91bmRfZW5hYmxlICovCisgIH0gZWxzZSB7CisgICAgRkRLd3JpdGVCaXRzKGhCcywgMCwgMSk7IC8qIE1hdHJpeCBtaXhkb3duIG5vdCBwcmVzZW50ICovCiAgIH0KIAotICBmb3IoaT0wOyBpPGNvbmZpZy0+bnVtX2Zyb250X2NoYW5uZWxfZWxlbWVudHM7IGkrKykgewotICAgICAgVUNIQVIgaXNDcGUgPSAoKnBFbF9saXN0Kys9PUlEX0NQRSkgPyAxIDogMDsKLSAgICAgIFVDSEFSIHRhZyAgID0gKGlzQ3BlKSA/IGNwZUNudCsrIDogc2NlQ250Kys7Ci0gICAgICBGREt3cml0ZUJpdHMoaEJzLCBpc0NwZSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbnQgY2hhbm5lbCBFbGVtZW50cyBpcyBDUEU/ICovCi0gICAgICBGREt3cml0ZUJpdHMoaEJzLCB0YWcsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbnQgY2hhbm5lbCBJbnN0YW5jZSBUYWcuKi8KKyAgaWYgKGNvbmZpZy0+cEhlaWdodF9udW0gIT0gTlVMTCkgeworICAgIC8qIHdlIGhhdmUgdXAgdG8gdGhyZWUgZGlmZmVyZW50IGhlaWdodCBsZXZlbHMsIGFuZCBpbiBlYWNoIGhlaWdodCBsZXZlbCB3ZQorICAgICAqIG1heSBoYXZlIGZyb250LCBzaWRlIGFuZCBiYWNrIGNoYW5uZWxzLiBXZSBuZWVkIHRvIGtub3cgd2hlcmUgZWFjaAorICAgICAqIHNlY3Rpb24gZW5kcyB0byBjb3JyZWN0bHkgY291bnQgdGhlIHRhZ3MgKi8KKyAgICBub3JtYWxGcm9udEVuZCA9IGNvbmZpZy0+bnVtX2Zyb250X2NoYW5uZWxfZWxlbWVudHMgLQorICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5wSGVpZ2h0X251bS0+bnVtX2Zyb250X2hlaWdodF9jaGFubmVsX2VsZW1lbnRzWzBdIC0KKyAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+cEhlaWdodF9udW0tPm51bV9mcm9udF9oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1sxXTsKKyAgICBub3JtYWxTaWRlRW5kID0gbm9ybWFsRnJvbnRFbmQgKyBjb25maWctPm51bV9zaWRlX2NoYW5uZWxfZWxlbWVudHMgLQorICAgICAgICAgICAgICAgICAgICBjb25maWctPnBIZWlnaHRfbnVtLT5udW1fc2lkZV9oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1swXSAtCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+cEhlaWdodF9udW0tPm51bV9zaWRlX2hlaWdodF9jaGFubmVsX2VsZW1lbnRzWzFdOworICAgIG5vcm1hbEJhY2tFbmQgPSBub3JtYWxTaWRlRW5kICsgY29uZmlnLT5udW1fYmFja19jaGFubmVsX2VsZW1lbnRzIC0KKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5wSGVpZ2h0X251bS0+bnVtX2JhY2tfaGVpZ2h0X2NoYW5uZWxfZWxlbWVudHNbMF0gLQorICAgICAgICAgICAgICAgICAgICBjb25maWctPnBIZWlnaHRfbnVtLT5udW1fYmFja19oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1sxXTsKKworICAgIHRvcEZyb250RW5kID0KKyAgICAgICAgbm9ybWFsQmFja0VuZCArIGNvbmZpZy0+bnVtX2xmZV9jaGFubmVsX2VsZW1lbnRzICsKKyAgICAgICAgY29uZmlnLT5wSGVpZ2h0X251bS0+bnVtX2Zyb250X2hlaWdodF9jaGFubmVsX2VsZW1lbnRzWzBdOyAvKiBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEZFcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc3VtZWQgKi8KKyAgICB0b3BTaWRlRW5kID0KKyAgICAgICAgdG9wRnJvbnRFbmQgKyBjb25maWctPnBIZWlnaHRfbnVtLT5udW1fc2lkZV9oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1swXTsKKyAgICB0b3BCYWNrRW5kID0KKyAgICAgICAgdG9wU2lkZUVuZCArIGNvbmZpZy0+cEhlaWdodF9udW0tPm51bV9iYWNrX2hlaWdodF9jaGFubmVsX2VsZW1lbnRzWzBdOworCisgICAgYm90dG9tRnJvbnRFbmQgPQorICAgICAgICB0b3BCYWNrRW5kICsgY29uZmlnLT5wSGVpZ2h0X251bS0+bnVtX2Zyb250X2hlaWdodF9jaGFubmVsX2VsZW1lbnRzWzFdOworICAgIGJvdHRvbVNpZGVFbmQgPSBib3R0b21Gcm9udEVuZCArCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+cEhlaWdodF9udW0tPm51bV9zaWRlX2hlaWdodF9jaGFubmVsX2VsZW1lbnRzWzFdOworI2lmZGVmIEZES19BU1NFUlRfRU5BQkxFCisgICAgYm90dG9tQmFja0VuZCA9IGJvdHRvbVNpZGVFbmQgKworICAgICAgICAgICAgICAgICAgICBjb25maWctPnBIZWlnaHRfbnVtLT5udW1fYmFja19oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1sxXTsKKyNlbmRpZgorCisgIH0gZWxzZSB7CisgICAgLyogd2UgaGF2ZSBvbmx5IG9uZSBoZWlnaHQgbGV2ZWwsIHNvIHdlIGRvbid0IGNhcmUgYWJvdXQgdG9wIG9yIGJvdHRvbSAqLworICAgIG5vcm1hbEZyb250RW5kID0gY29uZmlnLT5udW1fZnJvbnRfY2hhbm5lbF9lbGVtZW50czsKKyAgICBub3JtYWxTaWRlRW5kID0gbm9ybWFsRnJvbnRFbmQgKyBjb25maWctPm51bV9zaWRlX2NoYW5uZWxfZWxlbWVudHM7CisgICAgbm9ybWFsQmFja0VuZCA9IG5vcm1hbFNpZGVFbmQgKyBjb25maWctPm51bV9iYWNrX2NoYW5uZWxfZWxlbWVudHM7CiAgIH0KLSAgZm9yKGk9MDsgaTxjb25maWctPm51bV9zaWRlX2NoYW5uZWxfZWxlbWVudHM7IGkrKykgewotICAgICAgVUNIQVIgaXNDcGUgPSAoKnBFbF9saXN0Kys9PUlEX0NQRSkgPyAxIDogMDsKLSAgICAgIFVDSEFSIHRhZyAgID0gKGlzQ3BlKSA/IGNwZUNudCsrIDogc2NlQ250Kys7Ci0gICAgICBGREt3cml0ZUJpdHMoaEJzLCBpc0NwZSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbnQgY2hhbm5lbCBFbGVtZW50cyBpcyBDUEU/ICovCi0gICAgICBGREt3cml0ZUJpdHMoaEJzLCB0YWcsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbnQgY2hhbm5lbCBJbnN0YW5jZSBUYWcuKi8KKworICAvKiBhc3NpZ24gY3BlIGFuZCB0YWcgaW5mb3JtYXRpb24gdG8gZWl0aGVyIGZyb250LCBzaWRlIG9yIGJhY2sgY2hhbm5lbHMgKi8KKworICBwRWxfbGlzdCA9IGNvbmZpZy0+cEVsX3R5cGU7CisKKyAgZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+bnVtX2Zyb250X2NoYW5uZWxfZWxlbWVudHMgKworICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bnVtX3NpZGVfY2hhbm5lbF9lbGVtZW50cyArCisgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5udW1fYmFja19jaGFubmVsX2VsZW1lbnRzICsKKyAgICAgICAgICAgICAgICAgICAgICBjb25maWctPm51bV9sZmVfY2hhbm5lbF9lbGVtZW50czsKKyAgICAgICBpKyspIHsKKyAgICBpZiAoKnBFbF9saXN0ID09IElEX0xGRSkgeworICAgICAgcEVsX2xpc3QrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpc0NwZSA9ICgqcEVsX2xpc3QrKyA9PSBJRF9DUEUpID8gMSA6IDA7CisgICAgdGFnID0gKGlzQ3BlKSA/IGNwZUNudCsrIDogc2NlQ250Kys7CisKKyAgICBpZiAoaSA8IG5vcm1hbEZyb250RW5kKQorICAgICAgZWxEZXB0aCA9IEZST05UOworICAgIGVsc2UgaWYgKGkgPCBub3JtYWxTaWRlRW5kKQorICAgICAgZWxEZXB0aCA9IFNJREU7CisgICAgZWxzZSBpZiAoaSA8IG5vcm1hbEJhY2tFbmQpCisgICAgICBlbERlcHRoID0gQkFDSzsKKyAgICBlbHNlIGlmIChpIDwgdG9wRnJvbnRFbmQpCisgICAgICBlbERlcHRoID0gRlJPTlQ7CisgICAgZWxzZSBpZiAoaSA8IHRvcFNpZGVFbmQpCisgICAgICBlbERlcHRoID0gU0lERTsKKyAgICBlbHNlIGlmIChpIDwgdG9wQmFja0VuZCkKKyAgICAgIGVsRGVwdGggPSBCQUNLOworICAgIGVsc2UgaWYgKGkgPCBib3R0b21Gcm9udEVuZCkKKyAgICAgIGVsRGVwdGggPSBGUk9OVDsKKyAgICBlbHNlIGlmIChpIDwgYm90dG9tU2lkZUVuZCkKKyAgICAgIGVsRGVwdGggPSBTSURFOworICAgIGVsc2UgeworICAgICAgZWxEZXB0aCA9IEJBQ0s7CisgICAgICBGREtfQVNTRVJUKGkgPCBib3R0b21CYWNrRW5kKTsgLyogd29uJ3QgZmFpbCBpZiBpbXBsZW1lbnRhdGlvbiBvZiBwY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHRhYmxlIGlzIGNvcnJlY3QgKi8KKyAgICB9CisKKyAgICBzd2l0Y2ggKGVsRGVwdGgpIHsKKyAgICAgIGNhc2UgRlJPTlQ6CisgICAgICAgIEZES19BU1NFUlQoZnJudENudCA8IGNvbmZpZy0+bnVtX2Zyb250X2NoYW5uZWxfZWxlbWVudHMpOworICAgICAgICBmcm9udElzQ3BlW2ZybnRDbnRdID0gaXNDcGU7CisgICAgICAgIGZyb250VGFnW2ZybnRDbnQrK10gPSB0YWc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTSURFOgorICAgICAgICBGREtfQVNTRVJUKHNkQ250IDwgY29uZmlnLT5udW1fc2lkZV9jaGFubmVsX2VsZW1lbnRzKTsKKyAgICAgICAgc2lkZUlzQ3BlW3NkQ250XSA9IGlzQ3BlOworICAgICAgICBzaWRlVGFnW3NkQ250KytdID0gdGFnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQkFDSzoKKyAgICAgICAgRkRLX0FTU0VSVChiY2tDbnQgPCBjb25maWctPm51bV9iYWNrX2NoYW5uZWxfZWxlbWVudHMpOworICAgICAgICBiYWNrSXNDcGVbYmNrQ250XSA9IGlzQ3BlOworICAgICAgICBiYWNrVGFnW2Jja0NudCsrXSA9IHRhZzsKKyAgICAgICAgYnJlYWs7CisgICAgfQogICB9Ci0gIGZvcihpPTA7IGk8Y29uZmlnLT5udW1fYmFja19jaGFubmVsX2VsZW1lbnRzOyBpKyspIHsKLSAgICAgIFVDSEFSIGlzQ3BlID0gKCpwRWxfbGlzdCsrPT1JRF9DUEUpID8gMSA6IDA7Ci0gICAgICBVQ0hBUiB0YWcgICA9IChpc0NwZSkgPyBjcGVDbnQrKyA6IHNjZUNudCsrOwotICAgICAgRkRLd3JpdGVCaXRzKGhCcywgaXNDcGUsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb250IGNoYW5uZWwgRWxlbWVudHMgaXMgQ1BFPyAqLwotICAgICAgRkRLd3JpdGVCaXRzKGhCcywgdGFnLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb250IGNoYW5uZWwgSW5zdGFuY2UgVGFnLiovCisKKyAgLyogV3JpdGUgZnJvbnQgY2hhbm5lbCBpc0NwZSBhbmQgdGFncyAqLworICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5udW1fZnJvbnRfY2hhbm5lbF9lbGVtZW50czsgaSsrKSB7CisgICAgRkRLd3JpdGVCaXRzKGhCcywgZnJvbnRJc0NwZVtpXSwgMSk7CisgICAgRkRLd3JpdGVCaXRzKGhCcywgZnJvbnRUYWdbaV0sIDQpOwogICB9Ci0gIGZvcihpPTA7IGk8Y29uZmlnLT5udW1fbGZlX2NoYW5uZWxfZWxlbWVudHM7IGkrKykgewotICAgICAgRkRLd3JpdGVCaXRzKGhCcywgbGZlQ250KyssIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExGRSBjaGFubmVsIEluc3RhbmNlIFRhZy4gKi8KKyAgLyogV3JpdGUgc2lkZSBjaGFubmVsIGlzQ3BlIGFuZCB0YWdzICovCisgIGZvciAoaSA9IDA7IGkgPCBjb25maWctPm51bV9zaWRlX2NoYW5uZWxfZWxlbWVudHM7IGkrKykgeworICAgIEZES3dyaXRlQml0cyhoQnMsIHNpZGVJc0NwZVtpXSwgMSk7CisgICAgRkRLd3JpdGVCaXRzKGhCcywgc2lkZVRhZ1tpXSwgNCk7CisgIH0KKyAgLyogV3JpdGUgYmFjayBjaGFubmVsIGlzQ3BlIGFuZCB0YWdzICovCisgIGZvciAoaSA9IDA7IGkgPCBjb25maWctPm51bV9iYWNrX2NoYW5uZWxfZWxlbWVudHM7IGkrKykgeworICAgIEZES3dyaXRlQml0cyhoQnMsIGJhY2tJc0NwZVtpXSwgMSk7CisgICAgRkRLd3JpdGVCaXRzKGhCcywgYmFja1RhZ1tpXSwgNCk7CisgIH0KKyAgLyogV3JpdGUgTEZFIGluZm9ybWF0aW9uICovCisgIGZvciAoaSA9IDA7IGkgPCBjb25maWctPm51bV9sZmVfY2hhbm5lbF9lbGVtZW50czsgaSsrKSB7CisgICAgRkRLd3JpdGVCaXRzKGhCcywgbGZlQ250KyssIDQpOyAvKiBMRkUgY2hhbm5lbCBJbnN0YW5jZSBUYWcuICovCiAgIH0KIAogICAvKiAtIG51bV92YWxpZF9jY19lbGVtZW50cyBhbHdheXMgMC4KQEAgLTI5NCwxNjcgKzUzNSwzNDggQEAKICAgICAgICBBRFRTOiBhbGlnbiB3aXRoIHJlc3BlY3QgdG8gdGhlIGZpcnN0IGJpdCBvZiB0aGUgcmF3X2RhdGFfYmxvY2soKQogICAgICAgIEFESUY6IGFsaWduIHdpdGggcmVzcGVjdCB0byB0aGUgZmlyc3QgYml0IG9mIHRoZSBoZWFkZXIKICAgICAgICBMQVRNOiBhbGlnbiB3aXRoIHJlc3BlY3QgdG8gdGhlIGZpcnN0IGJpdCBvZiB0aGUgQVNDICovCi0gIEZES2J5dGVBbGlnbihoQnMsIGFsaWduQW5jaG9yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxpZ25tZW50ICovCisgIEZES2J5dGVBbGlnbihoQnMsIGFsaWduQW5jaG9yKTsgLyogQWxpZ25tZW50ICovCiAKLSAgRkRLd3JpdGVCaXRzKGhCcywgMCAsOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEbyBubyB3cml0ZSBhbnkgY29tbWVudC4gKi8KKyAgLyogV3JpdGUgY29tbWVudCBpbmZvcm1hdGlvbiAqLwogCi0gIC8qIC0gY29tbWVudF9maWVsZF9ieXRlcyBhbHdheXMgMC4gKi8KKyAgaWYgKGNvbmZpZy0+cEhlaWdodF9udW0gIT0gTlVMTCkgeworICAgIC8qIGVtYmVkIGhlaWdodCBpbmZvcm1hdGlvbiBpbiBjb21tZW50IGZpZWxkICovCisKKyAgICBJTlQgY29tbWVudEJ5dGVzID0KKyAgICAgICAgMSAvKiBQQ0VfSEVJR0hUX0VYVF9TWU5DICovCisgICAgICAgICsgKCgoKGNvbmZpZy0+bnVtX2Zyb250X2NoYW5uZWxfZWxlbWVudHMgKworICAgICAgICAgICAgICBjb25maWctPm51bV9zaWRlX2NoYW5uZWxfZWxlbWVudHMgKworICAgICAgICAgICAgICBjb25maWctPm51bV9iYWNrX2NoYW5uZWxfZWxlbWVudHMpCisgICAgICAgICAgICAgPDwgMSkgKworICAgICAgICAgICAgNykgPj4KKyAgICAgICAgICAgMykgLyogMiBiaXQgaGVpZ2h0IGluZm8gcGVyIGVsZW1lbnQsIHJvdW5kIHVwIHRvIGZ1bGwgYnl0ZXMgKi8KKyAgICAgICAgKyAxOyAgLyogQ1JDICovCisKKyAgICBGREt3cml0ZUJpdHMoaEJzLCBjb21tZW50Qnl0ZXMsIDgpOyAvKiBjb21tZW50IHNpemUuICovCisKKyAgICBGREtfQ1JDSU5GTyBjcmNJbmZvOyAvKiBDUkMgc3RhdGUgaW5mbyAqLworICAgIElOVCBjcmNSZWc7CisKKyAgICBGREtjcmNJbml0KCZjcmNJbmZvLCAweDA3LCAweEZGLCA4KTsKKyAgICBjcmNSZWcgPSBGREtjcmNTdGFydFJlZygmY3JjSW5mbywgaEJzLCAwKTsKKworICAgIEZES3dyaXRlQml0cyhoQnMsIFBDRV9IRUlHSFRfRVhUX1NZTkMsIDgpOyAvKiBpbmRpY2F0ZSBoZWlnaHQgZXh0ZW5zaW9uICovCisKKyAgICAvKiBmcm9udCBjaGFubmVsIGhlaWdodCBpbmZvcm1hdGlvbiAqLworICAgIGZvciAoaSA9IDA7CisgICAgICAgICBpIDwgY29uZmlnLT5udW1fZnJvbnRfY2hhbm5lbF9lbGVtZW50cyAtCisgICAgICAgICAgICAgICAgIGNvbmZpZy0+cEhlaWdodF9udW0tPm51bV9mcm9udF9oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1swXSAtCisgICAgICAgICAgICAgICAgIGNvbmZpZy0+cEhlaWdodF9udW0tPm51bV9mcm9udF9oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1sxXTsKKyAgICAgICAgIGkrKykKKyAgICAgIEZES3dyaXRlQml0cyhoQnMsIEhFSUdIVF9OT1JNQUwsIDIpOworICAgIGZvciAoaSA9IDA7IGkgPCBjb25maWctPnBIZWlnaHRfbnVtLT5udW1fZnJvbnRfaGVpZ2h0X2NoYW5uZWxfZWxlbWVudHNbMF07CisgICAgICAgICBpKyspCisgICAgICBGREt3cml0ZUJpdHMoaEJzLCBIRUlHSFRfVE9QLCAyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5wSGVpZ2h0X251bS0+bnVtX2Zyb250X2hlaWdodF9jaGFubmVsX2VsZW1lbnRzWzFdOworICAgICAgICAgaSsrKQorICAgICAgRkRLd3JpdGVCaXRzKGhCcywgSEVJR0hUX0JPVFRPTSwgMik7CisKKyAgICAvKiBzaWRlIGNoYW5uZWwgaGVpZ2h0IGluZm9ybWF0aW9uICovCisgICAgZm9yIChpID0gMDsKKyAgICAgICAgIGkgPCBjb25maWctPm51bV9zaWRlX2NoYW5uZWxfZWxlbWVudHMgLQorICAgICAgICAgICAgICAgICBjb25maWctPnBIZWlnaHRfbnVtLT5udW1fc2lkZV9oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1swXSAtCisgICAgICAgICAgICAgICAgIGNvbmZpZy0+cEhlaWdodF9udW0tPm51bV9zaWRlX2hlaWdodF9jaGFubmVsX2VsZW1lbnRzWzFdOworICAgICAgICAgaSsrKQorICAgICAgRkRLd3JpdGVCaXRzKGhCcywgSEVJR0hUX05PUk1BTCwgMik7CisgICAgZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cEhlaWdodF9udW0tPm51bV9zaWRlX2hlaWdodF9jaGFubmVsX2VsZW1lbnRzWzBdOworICAgICAgICAgaSsrKQorICAgICAgRkRLd3JpdGVCaXRzKGhCcywgSEVJR0hUX1RPUCwgMik7CisgICAgZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cEhlaWdodF9udW0tPm51bV9zaWRlX2hlaWdodF9jaGFubmVsX2VsZW1lbnRzWzFdOworICAgICAgICAgaSsrKQorICAgICAgRkRLd3JpdGVCaXRzKGhCcywgSEVJR0hUX0JPVFRPTSwgMik7CisKKyAgICAvKiBiYWNrIGNoYW5uZWwgaGVpZ2h0IGluZm9ybWF0aW9uICovCisgICAgZm9yIChpID0gMDsKKyAgICAgICAgIGkgPCBjb25maWctPm51bV9iYWNrX2NoYW5uZWxfZWxlbWVudHMgLQorICAgICAgICAgICAgICAgICBjb25maWctPnBIZWlnaHRfbnVtLT5udW1fYmFja19oZWlnaHRfY2hhbm5lbF9lbGVtZW50c1swXSAtCisgICAgICAgICAgICAgICAgIGNvbmZpZy0+cEhlaWdodF9udW0tPm51bV9iYWNrX2hlaWdodF9jaGFubmVsX2VsZW1lbnRzWzFdOworICAgICAgICAgaSsrKQorICAgICAgRkRLd3JpdGVCaXRzKGhCcywgSEVJR0hUX05PUk1BTCwgMik7CisgICAgZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cEhlaWdodF9udW0tPm51bV9iYWNrX2hlaWdodF9jaGFubmVsX2VsZW1lbnRzWzBdOworICAgICAgICAgaSsrKQorICAgICAgRkRLd3JpdGVCaXRzKGhCcywgSEVJR0hUX1RPUCwgMik7CisgICAgZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cEhlaWdodF9udW0tPm51bV9iYWNrX2hlaWdodF9jaGFubmVsX2VsZW1lbnRzWzFdOworICAgICAgICAgaSsrKQorICAgICAgRkRLd3JpdGVCaXRzKGhCcywgSEVJR0hUX0JPVFRPTSwgMik7CisKKyAgICBGREtieXRlQWxpZ24oaEJzLCBhbGlnbkFuY2hvcik7IC8qIEFsaWdubWVudCAqLworCisgICAgRkRLY3JjRW5kUmVnKCZjcmNJbmZvLCBoQnMsIGNyY1JlZyk7CisgICAgRkRLd3JpdGVCaXRzKGhCcywgRkRLY3JjR2V0Q1JDKCZjcmNJbmZvKSwgOCk7CisKKyAgfSBlbHNlIHsKKyAgICBGREt3cml0ZUJpdHMoaEJzLCAwLAorICAgICAgICAgICAgICAgICA4KTsgLyogRG8gbm8gd3JpdGUgYW55IGNvbW1lbnQgb3IgaGVpZ2h0IGluZm9ybWF0aW9uLiAqLworICB9CiAKICAgcmV0dXJuIDA7CiB9CiAKLWludCB0cmFuc3BvcnRFbmNfR2V0UENFQml0cyhDSEFOTkVMX01PREUgY2hhbm5lbE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hdHJpeE1peGRvd25BLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzKQotewotICBjb25zdCBQQ0VfQ09ORklHVVJBVElPTiogY29uZmlnID0gTlVMTDsKK2ludCB0cmFuc3BvcnRFbmNfR2V0UENFQml0cyhDSEFOTkVMX01PREUgY2hhbm5lbE1vZGUsIGludCBtYXRyaXhNaXhkb3duQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0cykgeworICBjb25zdCBQQ0VfQ09ORklHVVJBVElPTiAqY29uZmlnID0gTlVMTDsKIAotICBpZiAoKGNvbmZpZz1nZXRQY2VFbnRyeShjaGFubmVsTW9kZSkpPT1OVUxMKSB7Ci0gICAgcmV0dXJuIC0xOyAgLyogdW5zdXBwb3J0ZWQgY2hhbm5lbG1hcHBpbmcgKi8KKyAgaWYgKChjb25maWcgPSBnZXRQY2VFbnRyeShjaGFubmVsTW9kZSkpID09IE5VTEwpIHsKKyAgICByZXR1cm4gLTE7IC8qIHVuc3VwcG9ydGVkIGNoYW5uZWxtYXBwaW5nICovCiAgIH0KIAotICBiaXRzICs9IDQgKyAyICsgNDsgICAgICAgIC8qIEVsZW1lbnQgaW5zdGFuY2UgdGFnICArIE9iamVjdCB0eXBlICsgU2FtcGxlIHJhdGUgaW5kZXggKi8KLSAgYml0cyArPSA0ICsgNCArIDQgKyAyOyAgICAvKiBObyAoZnJvbnQgKyBzaWRlICsgYmFjayArIGxmZSBjaGFubmVsKSBlbGVtZW50cyAqLwotICBiaXRzICs9IDMgKyA0OyAgICAgICAgICAgIC8qIE5vIChhc3NvYyBkYXRhICsgdmFsaWQgY2MpIGVsZW1lbnRzICovCi0gIGJpdHMgKz0gMSArIDEgKyAxIDsgICAgICAgLyogTW9ubyArIFN0ZXJlbyArIE1hdHJpeCBtaXhkb3duIHByZXNlbnQgKi8KKyAgYml0cyArPQorICAgICAgNCArIDIgKyA0OyAvKiBFbGVtZW50IGluc3RhbmNlIHRhZyAgKyBPYmplY3QgdHlwZSArIFNhbXBsZSByYXRlIGluZGV4ICovCisgIGJpdHMgKz0gNCArIDQgKyA0ICsgMjsgLyogTm8gKGZyb250ICsgc2lkZSArIGJhY2sgKyBsZmUgY2hhbm5lbCkgZWxlbWVudHMgKi8KKyAgYml0cyArPSAzICsgNDsgICAgICAgICAvKiBObyAoYXNzb2MgZGF0YSArIHZhbGlkIGNjKSBlbGVtZW50cyAqLworICBiaXRzICs9IDEgKyAxICsgMTsgICAgIC8qIE1vbm8gKyBTdGVyZW8gKyBNYXRyaXggbWl4ZG93biBwcmVzZW50ICovCiAKLSAgaWYgKCBtYXRyaXhNaXhkb3duQSE9MCAmJiAoKGNoYW5uZWxNb2RlPT1NT0RFXzFfMl8yKXx8KGNoYW5uZWxNb2RlPT1NT0RFXzFfMl8yXzEpKSApIHsKLSAgICBiaXRzICs9MzsgICAgICAgICAgICAgICAvKiBtYXRyaXhfbWl4ZG93bl9pZHggKyBwc2V1ZG9fc3Vycm91bmRfZW5hYmxlICovCisgIGlmIChtYXRyaXhNaXhkb3duQSAhPSAwICYmCisgICAgICAoKGNoYW5uZWxNb2RlID09IE1PREVfMV8yXzIpIHx8IChjaGFubmVsTW9kZSA9PSBNT0RFXzFfMl8yXzEpKSkgeworICAgIGJpdHMgKz0gMzsgLyogbWF0cml4X21peGRvd25faWR4ICsgcHNldWRvX3N1cnJvdW5kX2VuYWJsZSAqLwogICB9CiAKLSAgYml0cyArPSAoMSs0KSAqIChJTlQpY29uZmlnLT5udW1fZnJvbnRfY2hhbm5lbF9lbGVtZW50czsKLSAgYml0cyArPSAoMSs0KSAqIChJTlQpY29uZmlnLT5udW1fc2lkZV9jaGFubmVsX2VsZW1lbnRzOwotICBiaXRzICs9ICgxKzQpICogKElOVCljb25maWctPm51bV9iYWNrX2NoYW5uZWxfZWxlbWVudHM7Ci0gIGJpdHMgKz0gICAoNCkgKiAoSU5UKWNvbmZpZy0+bnVtX2xmZV9jaGFubmVsX2VsZW1lbnRzOworICBiaXRzICs9ICgxICsgNCkgKiAoSU5UKWNvbmZpZy0+bnVtX2Zyb250X2NoYW5uZWxfZWxlbWVudHM7CisgIGJpdHMgKz0gKDEgKyA0KSAqIChJTlQpY29uZmlnLT5udW1fc2lkZV9jaGFubmVsX2VsZW1lbnRzOworICBiaXRzICs9ICgxICsgNCkgKiAoSU5UKWNvbmZpZy0+bnVtX2JhY2tfY2hhbm5lbF9lbGVtZW50czsKKyAgYml0cyArPSAoNCkgKiAoSU5UKWNvbmZpZy0+bnVtX2xmZV9jaGFubmVsX2VsZW1lbnRzOwogCiAgIC8qIC0gbnVtX3ZhbGlkX2NjX2VsZW1lbnRzIGFsd2F5cyAwLgogICAgICAtIG51bV9hc3NvY19kYXRhX2VsZW1lbnRzIGFsd2F5cyAwLiAqLwogCi0gIGlmICgoYml0cyU4KSAhPSAwKSB7Ci0gICAgYml0cyArPSAoOCAtIChiaXRzJTgpKTsgLyogQWxpZ25tZW50ICovCisgIGlmICgoYml0cyAlIDgpICE9IDApIHsKKyAgICBiaXRzICs9ICg4IC0gKGJpdHMgJSA4KSk7IC8qIEFsaWdubWVudCAqLwogICB9CiAKLSAgYml0cyArPSA4OyAgICAgICAgICAgICAgICAvKiBDb21tZW50IGZpZWxkICBieXRlcyAqLworICBiaXRzICs9IDg7IC8qIENvbW1lbnQgZmllbGQgIGJ5dGVzICovCiAKLSAgLyogLSBjb21tZW50X2ZpZWxkX2J5dGVzIGFsd3lzIDAuICovCisgIGlmIChjb25maWctPnBIZWlnaHRfbnVtICE9IE5VTEwpIHsKKyAgICAvKiBDb21tZW50IGZpZWxkIChoZWlnaHQgZXh0ZW5zaW9uKSAqLworCisgICAgYml0cyArPQorICAgICAgICA4IC8qIFBDRV9IRUlHSFRfRVhUX1NZTkMgKi8KKyAgICAgICAgKworICAgICAgICAoKGNvbmZpZy0+bnVtX2Zyb250X2NoYW5uZWxfZWxlbWVudHMgKworICAgICAgICAgIGNvbmZpZy0+bnVtX3NpZGVfY2hhbm5lbF9lbGVtZW50cyArIGNvbmZpZy0+bnVtX2JhY2tfY2hhbm5lbF9lbGVtZW50cykKKyAgICAgICAgIDw8IDEpIC8qIDIgYml0IGhlaWdodCBpbmZvIHBlciBlbGVtZW50ICovCisgICAgICAgICsgODsgICAvKiBDUkMgKi8KKworICAgIGlmICgoYml0cyAlIDgpICE9IDApIHsKKyAgICAgIGJpdHMgKz0gKDggLSAoYml0cyAlIDgpKTsgLyogQWxpZ25tZW50ICovCisgICAgfQorICB9CiAKICAgcmV0dXJuIGJpdHM7CiB9Ci0jZW5kaWYgLyogVFBfUENFX0VOQUJMRSAqLwogCi1zdGF0aWMgdm9pZCB3cml0ZUFvdChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtQnVmZmVyLCBBVURJT19PQkpFQ1RfVFlQRSBhb3QpCi17Ci0gICAgaW50IHRtcCA9IChpbnQpIGFvdDsKK3N0YXRpYyB2b2lkIHdyaXRlQW90KEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW1CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBhb3QpIHsKKyAgaW50IHRtcCA9IChpbnQpYW90OwogCi0gICAgaWYgKHRtcCA+IDMxKSB7Ci0gICAgICAgIEZES3dyaXRlQml0cyggaEJpdHN0cmVhbUJ1ZmZlciwgQU9UX0VTQ0FQRSwgNSApOwotICAgICAgICBGREt3cml0ZUJpdHMoIGhCaXRzdHJlYW1CdWZmZXIsIHRtcC0zMiwgNiApOyAgIC8qIEF1ZGlvT2JqZWN0VHlwZSAqLwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZES3dyaXRlQml0cyggaEJpdHN0cmVhbUJ1ZmZlciwgdG1wLCA1ICk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCB3cml0ZVNhbXBsZVJhdGUoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbUJ1ZmZlciwgaW50IHNhbXBsZVJhdGUpCi17Ci0gIGludCBzYW1wbGVSYXRlSW5kZXggPSBnZXRTYW1wbGluZ1JhdGVJbmRleChzYW1wbGVSYXRlKTsKLQotICBGREt3cml0ZUJpdHMoIGhCaXRzdHJlYW1CdWZmZXIsIHNhbXBsZVJhdGVJbmRleCwgNCApOwotICBpZiggc2FtcGxlUmF0ZUluZGV4ID09IDE1ICkgewotICAgIEZES3dyaXRlQml0cyggaEJpdHN0cmVhbUJ1ZmZlciwgc2FtcGxlUmF0ZSwgMjQgKTsKKyAgaWYgKHRtcCA+IDMxKSB7CisgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW1CdWZmZXIsIEFPVF9FU0NBUEUsIDUpOworICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtQnVmZmVyLCB0bXAgLSAzMiwgNik7IC8qIEF1ZGlvT2JqZWN0VHlwZSAqLworICB9IGVsc2UgeworICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtQnVmZmVyLCB0bXAsIDUpOwogICB9CiB9CiAKLSNpZmRlZiBUUF9HQV9FTkFCTEUKLXN0YXRpYwotaW50IHRyYW5zcG9ydEVuY193cml0ZUdBU3BlY2lmaWNDb25maWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVSX0NPTkZJRyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBleHRGbGcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgIGFsaWduQW5jaG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CitzdGF0aWMgdm9pZCB3cml0ZVNhbXBsZVJhdGUoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBpbnQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkJpdHMpIHsKKyAgaW50IHNySWR4ID0gZ2V0U2FtcGxpbmdSYXRlSW5kZXgoc2FtcGxlUmF0ZSwgbkJpdHMpOworCisgIEZES3dyaXRlQml0cyhoQnMsIHNySWR4LCBuQml0cyk7CisgIGlmIChzcklkeCA9PSAoMSA8PCBuQml0cykgLSAxKSB7CisgICAgRkRLd3JpdGVCaXRzKGhCcywgc2FtcGxlUmF0ZSwgMjQpOworICB9Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNwb3J0RW5jX3dyaXRlR0FTcGVjaWZpY0NvbmZpZyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBhc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERVJfQ09ORklHICpjb25maWcsIGludCBleHRGbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBhbGlnbkFuY2hvcikgewogICBpbnQgYW90ID0gY29uZmlnLT5hb3Q7CiAgIGludCBzYW1wbGVzUGVyRnJhbWUgPSBjb25maWctPnNhbXBsZXNQZXJGcmFtZTsKIAogICAvKiBzdGFydCBvZiBHQVNwZWNpZmljQ29uZmlnIGFjY29yZGluZyB0byBJU08vSUVDIDE0NDk2LTMgU3VicGFydCA0LCA0LjQuMSAqLwotICBGREt3cml0ZUJpdHMoIGFzYywgKChzYW1wbGVzUGVyRnJhbWU9PTk2MCB8fCBzYW1wbGVzUGVyRnJhbWU9PTQ4MCk/MTowKSwgMSk7ICAvKiBmcmFtZUxlbmd0aEZsYWc6IDEgZm9yIGEgOTYwLzQ4MCAoSSlNRENULCAwIGZvciBhIDEwMjQvNTEyIChJKU1EQ1QqLwotICBGREt3cml0ZUJpdHMoIGFzYywgMCwgMSk7ICAvKiBkZXBlbmRzT25Db3JlQ29kZXI6IFNhbXBsaW5nIFJhdGUgQ29kZXIgU3BlY2lmaWMsIHNlZSBpbiBJU08vSUVDIDE0NDk2LTMgU3VicGFydCA0LCA0LjQuMSAqLwotICBGREt3cml0ZUJpdHMoIGFzYywgZXh0RmxnLCAxICk7IC8qIEV4dGVuc2lvbiBGbGFnOiBTaGFsbCBiZSAxIGZvciBhb3QgPSAxNywxOSwyMCwyMSwyMiwyMyAqLworICBGREt3cml0ZUJpdHMoYXNjLAorICAgICAgICAgICAgICAgKChzYW1wbGVzUGVyRnJhbWUgPT0gOTYwIHx8IHNhbXBsZXNQZXJGcmFtZSA9PSA0ODApID8gMSA6IDApLAorICAgICAgICAgICAgICAgMSk7IC8qIGZyYW1lTGVuZ3RoRmxhZzogMSBmb3IgYSA5NjAvNDgwIChJKU1EQ1QsIDAgZm9yIGEgMTAyNC81MTIKKyAgICAgICAgICAgICAgICAgICAgICAoSSlNRENUKi8KKyAgRkRLd3JpdGVCaXRzKGFzYywgMCwKKyAgICAgICAgICAgICAgIDEpOyAvKiBkZXBlbmRzT25Db3JlQ29kZXI6IFNhbXBsaW5nIFJhdGUgQ29kZXIgU3BlY2lmaWMsIHNlZSBpbgorICAgICAgICAgICAgICAgICAgICAgIElTTy9JRUMgMTQ0OTYtMyBTdWJwYXJ0IDQsIDQuNC4xICovCisgIEZES3dyaXRlQml0cyhhc2MsIGV4dEZsZywKKyAgICAgICAgICAgICAgIDEpOyAvKiBFeHRlbnNpb24gRmxhZzogU2hhbGwgYmUgMSBmb3IgYW90ID0gMTcsMTksMjAsMjEsMjIsMjMgKi8KIAogICAvKiBXcml0ZSBQQ0UgaWYgY2hhbm5lbCBjb25maWcgaXMgbm90IDEtNyAqLwotICBpZiAoZ2V0Q2hhbm5lbENvbmZpZyhjb25maWctPmNoYW5uZWxNb2RlKSA9PSAwKSB7Ci0gICAgICB0cmFuc3BvcnRFbmNfd3JpdGVQQ0UoYXNjLCBjb25maWctPmNoYW5uZWxNb2RlLCBjb25maWctPnNhbXBsaW5nUmF0ZSwgMCwgMSwgY29uZmlnLT5tYXRyaXhNaXhkb3duQSwgKGNvbmZpZy0+ZmxhZ3MmQ0NfUFNFVURPX1NVUlJPVU5EKT8xOjAsIGFsaWduQW5jaG9yKTsKKyAgaWYgKGdldENoYW5uZWxDb25maWcoY29uZmlnLT5jaGFubmVsTW9kZSwgY29uZmlnLT5jaGFubmVsQ29uZmlnWmVybykgPT0gMCkgeworICAgIHRyYW5zcG9ydEVuY193cml0ZVBDRShhc2MsIGNvbmZpZy0+Y2hhbm5lbE1vZGUsIGNvbmZpZy0+c2FtcGxpbmdSYXRlLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPm1hdHJpeE1peGRvd25BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT5mbGFncyAmIENDX1BTRVVET19TVVJST1VORCkgPyAxIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25BbmNob3IpOworICB9CisgIGlmICgoYW90ID09IEFPVF9BQUNfU0NBTCkgfHwgKGFvdCA9PSBBT1RfRVJfQUFDX1NDQUwpKSB7CisgICAgRkRLd3JpdGVCaXRzKGFzYywgMCwgMyk7IC8qIGxheWVyTnIgKi8KICAgfQogICBpZiAoZXh0RmxnKSB7CiAgICAgaWYgKGFvdCA9PSBBT1RfRVJfQlNBQykgewotICAgICAgRkRLd3JpdGVCaXRzKCBhc2MsIGNvbmZpZy0+QlNBQ251bU9mU3ViRnJhbWUsIDUgKTsgLyogbnVtT2ZTdWJGcmFtZSAqLwotICAgICAgRkRLd3JpdGVCaXRzKCBhc2MsIGNvbmZpZy0+QlNBQ2xheWVyTGVuZ3RoLCAxMSApOyAgLyogbGF5ZXJfbGVuZ3RoICovCisgICAgICBGREt3cml0ZUJpdHMoYXNjLCBjb25maWctPkJTQUNudW1PZlN1YkZyYW1lLCA1KTsgLyogbnVtT2ZTdWJGcmFtZSAqLworICAgICAgRkRLd3JpdGVCaXRzKGFzYywgY29uZmlnLT5CU0FDbGF5ZXJMZW5ndGgsIDExKTsgIC8qIGxheWVyX2xlbmd0aCAqLwogICAgIH0KLSAgICBpZiAoKGFvdCA9PSBBT1RfRVJfQUFDX0xDKSAgIHx8IChhb3QgPT0gQU9UX0VSX0FBQ19MVFApICB8fAotICAgICAgICAoYW90ID09IEFPVF9FUl9BQUNfU0NBTCkgfHwgKGFvdCA9PSBBT1RfRVJfQUFDX0xEKSkKLSAgICB7Ci0gICAgICBGREt3cml0ZUJpdHMoIGFzYywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19WQ0IxMSkgPyAxIDogMCwgMSApOyAvKiBhYWNTZWN0aW9uRGF0YVJlc2lsbGllbmNlRmxhZyAqLwotICAgICAgRkRLd3JpdGVCaXRzKCBhc2MsIChjb25maWctPmZsYWdzICYgQ0NfUlZMQykgPyAxIDogMCwgIDEgKTsgLyogYWFjU2NhbGVGYWN0b3JEYXRhUmVzaWxsaWVuY2VGbGFnICovCi0gICAgICBGREt3cml0ZUJpdHMoIGFzYywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19IQ1IpID8gMSA6IDAsICAgMSApOyAvKiBhYWNTcGVjdHJhbERhdGFSZXNpbGxpZW5jZUZsYWcgKi8KKyAgICBpZiAoKGFvdCA9PSBBT1RfRVJfQUFDX0xDKSB8fCAoYW90ID09IEFPVF9FUl9BQUNfTFRQKSB8fAorICAgICAgICAoYW90ID09IEFPVF9FUl9BQUNfU0NBTCkgfHwgKGFvdCA9PSBBT1RfRVJfQUFDX0xEKSkgeworICAgICAgRkRLd3JpdGVCaXRzKGFzYywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19WQ0IxMSkgPyAxIDogMCwKKyAgICAgICAgICAgICAgICAgICAxKTsgLyogYWFjU2VjdGlvbkRhdGFSZXNpbGxpZW5jZUZsYWcgKi8KKyAgICAgIEZES3dyaXRlQml0cyhhc2MsIChjb25maWctPmZsYWdzICYgQ0NfUlZMQykgPyAxIDogMCwKKyAgICAgICAgICAgICAgICAgICAxKTsgLyogYWFjU2NhbGVGYWN0b3JEYXRhUmVzaWxsaWVuY2VGbGFnICovCisgICAgICBGREt3cml0ZUJpdHMoYXNjLCAoY29uZmlnLT5mbGFncyAmIENDX0hDUikgPyAxIDogMCwKKyAgICAgICAgICAgICAgICAgICAxKTsgLyogYWFjU3BlY3RyYWxEYXRhUmVzaWxsaWVuY2VGbGFnICovCiAgICAgfQotICAgIEZES3dyaXRlQml0cyggYXNjLCAwLCAxICk7IC8qIGV4dGVuc2lvbkZsYWczOiByZXNlcnZlZC4gU2hhbGwgYmUgJzAnICovCisgICAgRkRLd3JpdGVCaXRzKGFzYywgMCwgMSk7IC8qIGV4dGVuc2lvbkZsYWczOiByZXNlcnZlZC4gU2hhbGwgYmUgJzAnICovCiAgIH0KICAgcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogVFBfR0FfRU5BQkxFICovCiAKLSNpZmRlZiBUUF9FTERfRU5BQkxFCi0KLXN0YXRpYwotaW50IHRyYW5zcG9ydEVuY193cml0ZUVMRFNwZWNpZmljQ29uZmlnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVSX0NPTkZJRyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIGVwQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1RwQ2FsbEJhY2tzICpjYgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgLyogRUxEIHNwZWNpZmljIGNvbmZpZyAqLwotICBpZiAoY29uZmlnLT5jaGFubmVsTW9kZSA9PSBNT0RFXzFfMSkgewotICAgIHJldHVybiAtMTsKK3N0YXRpYyBpbnQgdHJhbnNwb3J0RW5jX3dyaXRlRUxEU3BlY2lmaWNDb25maWcoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFUl9DT05GSUcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVwQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1RwQ2FsbEJhY2tzICpjYikgeworICBVSU5UIGZyYW1lTGVuZ3RoRmxhZyA9IDA7CisgIHN3aXRjaCAoY29uZmlnLT5zYW1wbGVzUGVyRnJhbWUpIHsKKyAgICBjYXNlIDUxMjoKKyAgICBjYXNlIDI1NjoKKyAgICBjYXNlIDEyODoKKyAgICBjYXNlIDY0OgorICAgICAgZnJhbWVMZW5ndGhGbGFnID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDgwOgorICAgIGNhc2UgMjQwOgorICAgIGNhc2UgMTYwOgorICAgIGNhc2UgMTIwOgorICAgIGNhc2UgNjA6CisgICAgICBmcmFtZUxlbmd0aEZsYWcgPSAxOworICAgICAgYnJlYWs7CiAgIH0KLSAgRkRLd3JpdGVCaXRzKGhCcywgKGNvbmZpZy0+c2FtcGxlc1BlckZyYW1lID09IDQ4MCkgPyAxIDogMCwgMSk7CiAKLSAgRkRLd3JpdGVCaXRzKGhCcywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19WQ0IxMSApID8gMTowLCAxKTsKLSAgRkRLd3JpdGVCaXRzKGhCcywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19SVkxDICkgPyAxOjAsIDEpOwotICBGREt3cml0ZUJpdHMoaEJzLCAoY29uZmlnLT5mbGFncyAmIENDX0hDUiAgKSA/IDE6MCwgMSk7CisgIEZES3dyaXRlQml0cyhoQnMsIGZyYW1lTGVuZ3RoRmxhZywgMSk7CiAKLSAgRkRLd3JpdGVCaXRzKGhCcywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19TQlIpID8gMTowLCAxKTsgLyogU0JSIGhlYWRlciBmbGFnICovCi0gIGlmICggKGNvbmZpZy0+ZmxhZ3MgJiBDQ19TQlIpICkgewotICAgIEZES3dyaXRlQml0cyhoQnMsIChjb25maWctPnNhbXBsaW5nUmF0ZSA9PSBjb25maWctPmV4dFNhbXBsaW5nUmF0ZSkgPyAwOjEsIDEpOyAvKiBTYW1wbGVyYXRlIEZsYWcgKi8KLSAgICBGREt3cml0ZUJpdHMoaEJzLCAoY29uZmlnLT5mbGFncyAmIENDX1NCUkNSQykgPyAxOjAsIDEpOyAvKiBTQlIgQ1JDIGZsYWcqLworICBGREt3cml0ZUJpdHMoaEJzLCAoY29uZmlnLT5mbGFncyAmIENDX1ZDQjExKSA/IDEgOiAwLCAxKTsKKyAgRkRLd3JpdGVCaXRzKGhCcywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19SVkxDKSA/IDEgOiAwLCAxKTsKKyAgRkRLd3JpdGVCaXRzKGhCcywgKGNvbmZpZy0+ZmxhZ3MgJiBDQ19IQ1IpID8gMSA6IDAsIDEpOworCisgIEZES3dyaXRlQml0cyhoQnMsIChjb25maWctPmZsYWdzICYgQ0NfU0JSKSA/IDEgOiAwLCAxKTsgLyogU0JSIGhlYWRlciBmbGFnICovCisgIGlmICgoY29uZmlnLT5mbGFncyAmIENDX1NCUikpIHsKKyAgICBGREt3cml0ZUJpdHMoaEJzLCAoY29uZmlnLT5zYW1wbGluZ1JhdGUgPT0gY29uZmlnLT5leHRTYW1wbGluZ1JhdGUpID8gMCA6IDEsCisgICAgICAgICAgICAgICAgIDEpOyAvKiBTYW1wbGVyYXRlIEZsYWcgKi8KKyAgICBGREt3cml0ZUJpdHMoaEJzLCAoY29uZmlnLT5mbGFncyAmIENDX1NCUkNSQykgPyAxIDogMCwgMSk7IC8qIFNCUiBDUkMgZmxhZyovCiAKICAgICBpZiAoY2ItPmNiU2JyICE9IE5VTEwpIHsKICAgICAgIGNvbnN0IFBDRV9DT05GSUdVUkFUSU9OICpwUGNlOwotICAgICAgaW50IGU7CisgICAgICBpbnQgZSwgc2JyRWxlbWVudEluZGV4ID0gMDsKIAogICAgICAgcFBjZSA9IGdldFBjZUVudHJ5KGNvbmZpZy0+Y2hhbm5lbE1vZGUpOwogCi0gICAgICBmb3IgKGU9MDsgZTxQQ0VfTUFYX0VMRU1FTlRTICYmIHBQY2UtPmVsX2xpc3RbZV0gIT0gSURfTk9ORTsgZSsrICApIHsKLSAgICAgICAgaWYgKCAocFBjZS0+ZWxfbGlzdFtlXSA9PSBJRF9TQ0UpIHx8IChwUGNlLT5lbF9saXN0W2VdID09IElEX0NQRSkgKSB7Ci0gICAgICAgICAgY2ItPmNiU2JyKGNiLT5jYlNickRhdGEsIGhCcywgMCwgMCwgMCwgY29uZmlnLT5hb3QsIHBQY2UtPmVsX2xpc3RbZV0sIGUpOworICAgICAgZm9yIChlID0gMDsgZSA8IHBQY2UtPm51bV9mcm9udF9jaGFubmVsX2VsZW1lbnRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFBjZS0+bnVtX3NpZGVfY2hhbm5lbF9lbGVtZW50cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBQY2UtPm51bV9iYWNrX2NoYW5uZWxfZWxlbWVudHMgKworICAgICAgICAgICAgICAgICAgICAgICAgICBwUGNlLT5udW1fbGZlX2NoYW5uZWxfZWxlbWVudHM7CisgICAgICAgICAgIGUrKykgeworICAgICAgICBpZiAoKHBQY2UtPnBFbF90eXBlW2VdID09IElEX1NDRSkgfHwgKHBQY2UtPnBFbF90eXBlW2VdID09IElEX0NQRSkpIHsKKyAgICAgICAgICBjYi0+Y2JTYnIoY2ItPmNiU2JyRGF0YSwgaEJzLCAwLCAwLCAwLCBjb25maWctPmFvdCwgcFBjZS0+cEVsX3R5cGVbZV0sCisgICAgICAgICAgICAgICAgICAgIHNickVsZW1lbnRJbmRleCwgMCwgMCwgMCwgTlVMTCwgMSk7CisgICAgICAgICAgc2JyRWxlbWVudEluZGV4Kys7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KIAotICBGREt3cml0ZUJpdHMoaEJzLCAwLCA0KTsgLyogRUxERVhUX1RFUk0gKi8KKyAgaWYgKChjb25maWctPmZsYWdzICYgQ0NfU0FDKSAmJiAoY2ItPmNiU3NjICE9IE5VTEwpKSB7CisgICAgRkRLd3JpdGVCaXRzKGhCcywgRUxERVhUX0xEU0FDLCA0KTsKKworICAgIGNvbnN0IElOVCBlbGRFeHRMZW4gPQorICAgICAgICAoY2ItPmNiU3NjKGNiLT5jYlNzY0RhdGEsIE5VTEwsIGNvbmZpZy0+YW90LCBjb25maWctPmV4dFNhbXBsaW5nUmF0ZSwgMCwKKyAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCBOVUxMKSArCisgICAgICAgICA3KSA+PgorICAgICAgICAzOworICAgIElOVCBjbnQgPSBlbGRFeHRMZW47CisKKyAgICBpZiAoY250IDwgMHhGKSB7CisgICAgICBGREt3cml0ZUJpdHMoaEJzLCBjbnQsIDQpOworICAgIH0gZWxzZSB7CisgICAgICBGREt3cml0ZUJpdHMoaEJzLCAweEYsIDQpOworICAgICAgY250IC09IDB4RjsKKworICAgICAgaWYgKGNudCA8IDB4RkYpIHsKKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCcywgY250LCA4KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZES3dyaXRlQml0cyhoQnMsIDB4RkYsIDgpOworICAgICAgICBjbnQgLT0gMHhGRjsKKworICAgICAgICBGREtfQVNTRVJUKGNudCA8PSAweEZGRkYpOworICAgICAgICBGREt3cml0ZUJpdHMoaEJzLCBjbnQsIDE2KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjYi0+Y2JTc2MoY2ItPmNiU3NjRGF0YSwgaEJzLCBjb25maWctPmFvdCwgY29uZmlnLT5leHRTYW1wbGluZ1JhdGUsIDAsIDAsIDAsCisgICAgICAgICAgICAgIDAsIE5VTEwpOworICB9CisKKyAgaWYgKGNvbmZpZy0+ZG93bnNjYWxlU2FtcGxpbmdSYXRlICE9IDAgJiYKKyAgICAgIGNvbmZpZy0+ZG93bnNjYWxlU2FtcGxpbmdSYXRlICE9IGNvbmZpZy0+ZXh0U2FtcGxpbmdSYXRlKSB7CisgICAgLyogZG93bnNjYWxlIGFjdGl2ZSAqLworCisgICAgLyogZWxkRXh0TGVuRHNjOiBOdW1iZXIgb2YgYnl0ZXMgZm9yIHRoZSBFTEQgZG93bnNjYWxlIGV4dGVuc2lvbiAoc3JJZHgKKyAgICAgICBuZWVkcyAxIGJ5dGUKKyAgICAgICArIGRvd25zY2FsZVNhbXBsaW5nUmF0ZSBuZWVkcyBhZGRpdGlvbmFsIDMgYnl0ZXMpICovCisgICAgaW50IGVsZEV4dExlbkRzYyA9IDE7CisgICAgaW50IGRvd25zY2FsZVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy0+ZG93bnNjYWxlU2FtcGxpbmdSYXRlOworICAgIEZES3dyaXRlQml0cyhoQnMsIEVMREVYVF9ET1dOU0NBTEVJTkZPLCA0KTsgLyogRUxERVhUX0RPV05TQ0FMRUlORk8gKi8KKworICAgIGlmICgoZG93bnNjYWxlU2FtcGxpbmdSYXRlICE9IDk2MDAwKSAmJiAoZG93bnNjYWxlU2FtcGxpbmdSYXRlICE9IDg4MjAwKSAmJgorICAgICAgICAoZG93bnNjYWxlU2FtcGxpbmdSYXRlICE9IDY0MDAwKSAmJiAoZG93bnNjYWxlU2FtcGxpbmdSYXRlICE9IDQ4MDAwKSAmJgorICAgICAgICAoZG93bnNjYWxlU2FtcGxpbmdSYXRlICE9IDQ0MTAwKSAmJiAoZG93bnNjYWxlU2FtcGxpbmdSYXRlICE9IDMyMDAwKSAmJgorICAgICAgICAoZG93bnNjYWxlU2FtcGxpbmdSYXRlICE9IDI0MDAwKSAmJiAoZG93bnNjYWxlU2FtcGxpbmdSYXRlICE9IDIyMDUwKSAmJgorICAgICAgICAoZG93bnNjYWxlU2FtcGxpbmdSYXRlICE9IDE2MDAwKSAmJiAoZG93bnNjYWxlU2FtcGxpbmdSYXRlICE9IDEyMDAwKSAmJgorICAgICAgICAoZG93bnNjYWxlU2FtcGxpbmdSYXRlICE9IDExMDI1KSAmJiAoZG93bnNjYWxlU2FtcGxpbmdSYXRlICE9IDgwMDApICYmCisgICAgICAgIChkb3duc2NhbGVTYW1wbGluZ1JhdGUgIT0gNzM1MCkpIHsKKyAgICAgIGVsZEV4dExlbkRzYyA9IDQ7IC8qIGxlbmd0aCBleHRlbmRzIHRvIDQgaWYgZG93bnNjYWxlU2FtcGxpbmdSYXRlJ3MgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBvbmUgb2YgdGhlIGxpc3RlZCB2YWx1ZXMgKi8KKyAgICB9CisKKyAgICBGREt3cml0ZUJpdHMoaEJzLCBlbGRFeHRMZW5Ec2MsIDQpOworICAgIHdyaXRlU2FtcGxlUmF0ZShoQnMsIGRvd25zY2FsZVNhbXBsaW5nUmF0ZSwgNCk7CisgICAgRkRLd3JpdGVCaXRzKGhCcywgMHgwLCA0KTsgLyogZmlsbF9uaWJibGUgKi8KKyAgfQorCisgIEZES3dyaXRlQml0cyhoQnMsIEVMREVYVF9URVJNLCA0KTsgLyogRUxERVhUX1RFUk0gKi8KIAogICByZXR1cm4gMDsKIH0KLSNlbmRpZiAvKiBUUF9FTERfRU5BQkxFICovCiAKK3N0YXRpYyBpbnQgdHJhbnNwb3J0RW5jX3dyaXRlVXNhY1NwZWNpZmljQ29uZmlnKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHRGbGFnLCBDT0RFUl9DT05GSUcgKmNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IpIHsKKyAgRkRLX0JJVFNUUkVBTSB1c2FjQ29uZjsKKyAgaW50IHVzYWNDb25maWdCaXRzID0gY2MtPnJhd0NvbmZpZ0JpdHM7CiAKLWludCB0cmFuc3BvcnRFbmNfd3JpdGVBU0MgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGFzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFUl9DT05GSUcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1RwQ2FsbEJhY2tzICpjYgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoteworICBpZiAoKHVzYWNDb25maWdCaXRzIDw9IDApIHx8CisgICAgICAoKHVzYWNDb25maWdCaXRzICsgNykgLyA4ID4gKGludClzaXplb2YoY2MtPnJhd0NvbmZpZykpKSB7CisgICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19VTlNVUFBPUlRFRF9GT1JNQVQ7CisgIH0KKyAgRkRLaW5pdEJpdFN0cmVhbSgmdXNhY0NvbmYsIGNjLT5yYXdDb25maWcsIEJVRlNJWkVfRFVNTVlfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgdXNhY0NvbmZpZ0JpdHMsIEJTX1JFQURFUik7CisKKyAgZm9yICg7IHVzYWNDb25maWdCaXRzID4gMDsgdXNhY0NvbmZpZ0JpdHMtLSkgeworICAgIFVJTlQgdG1wID0gRkRLcmVhZEJpdCgmdXNhY0NvbmYpOworICAgIEZES3dyaXRlQml0cyhoQnMsIHRtcCwgMSk7CisgIH0KKyAgRkRLc3luY0NhY2hlKGhCcyk7CisKKyAgcmV0dXJuIFRSQU5TUE9SVEVOQ19PSzsKK30KKworaW50IHRyYW5zcG9ydEVuY193cml0ZUFTQyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBhc2MsIENPREVSX0NPTkZJRyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDU1RwQ2FsbEJhY2tzICpjYikgewogICBVSU5UIGV4dEZsYWcgPSAwOwogICBpbnQgZXJyOwogICBpbnQgZXBDb25maWcgPSAwOwpAQCAtNDcyLDM3ICs4OTQsMzUgQEAKICAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CiAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKICAgICBjYXNlIEFPVF9VU0FDOgotICAgICAgICBleHRGbGFnID0gMTsKLSAgICAgICAgYnJlYWs7CisgICAgICBleHRGbGFnID0gMTsKKyAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOworICAgICAgYnJlYWs7CiAgIH0KIAotICBpZiAoY29uZmlnLT5zYnJTaWduYWxpbmc9PVNJR19FWFBMSUNJVF9ISUVSQVJDSElDQUwgJiYgY29uZmlnLT5zYnJQcmVzZW50KQorICBpZiAoY29uZmlnLT5zYnJTaWduYWxpbmcgPT0gU0lHX0VYUExJQ0lUX0hJRVJBUkNISUNBTCAmJiBjb25maWctPnNiclByZXNlbnQpCiAgICAgd3JpdGVBb3QoYXNjLCBjb25maWctPmV4dEFPVCk7CiAgIGVsc2UKICAgICB3cml0ZUFvdChhc2MsIGNvbmZpZy0+YW90KTsKIAotICB7Ci0gICAgd3JpdGVTYW1wbGVSYXRlKGFzYywgY29uZmlnLT5zYW1wbGluZ1JhdGUpOwotICB9CisgIC8qIEluIGNhc2Ugb2YgVVNBQyBpdCBpcyB0aGUgb3V0cHV0IG5vdCB0aGUgY29yZSBzYW1wbGluZyByYXRlICovCisgIHdyaXRlU2FtcGxlUmF0ZShhc2MsIGNvbmZpZy0+c2FtcGxpbmdSYXRlLCA0KTsKIAogICAvKiBUcnkgdG8gZ3Vlc3MgYSByZWFzb25hYmxlIGNoYW5uZWwgbW9kZSBpZiBub3QgZ2l2ZW4gKi8KICAgaWYgKGNvbmZpZy0+Y2hhbm5lbE1vZGUgPT0gTU9ERV9JTlZBTElEKSB7CiAgICAgY29uZmlnLT5jaGFubmVsTW9kZSA9IHRyYW5zcG9ydEVuY19HZXRDaGFubmVsTW9kZShjb25maWctPm5vQ2hhbm5lbHMpOwotICAgIGlmIChjb25maWctPmNoYW5uZWxNb2RlID09IE1PREVfSU5WQUxJRCkKLSAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoY29uZmlnLT5jaGFubmVsTW9kZSA9PSBNT0RFX0lOVkFMSUQpIHJldHVybiAtMTsKICAgfQogCi0gIEZES3dyaXRlQml0cyggYXNjLCBnZXRDaGFubmVsQ29uZmlnKGNvbmZpZy0+Y2hhbm5lbE1vZGUpLCA0ICk7CisgIEZES3dyaXRlQml0cygKKyAgICAgIGFzYywgZ2V0Q2hhbm5lbENvbmZpZyhjb25maWctPmNoYW5uZWxNb2RlLCBjb25maWctPmNoYW5uZWxDb25maWdaZXJvKSwgNCk7CiAKLSAgaWYgKGNvbmZpZy0+c2JyU2lnbmFsaW5nPT1TSUdfRVhQTElDSVRfSElFUkFSQ0hJQ0FMICYmIGNvbmZpZy0+c2JyUHJlc2VudCkgewotICAgIHdyaXRlU2FtcGxlUmF0ZShhc2MsIGNvbmZpZy0+ZXh0U2FtcGxpbmdSYXRlKTsKKyAgaWYgKGNvbmZpZy0+c2JyU2lnbmFsaW5nID09IFNJR19FWFBMSUNJVF9ISUVSQVJDSElDQUwgJiYgY29uZmlnLT5zYnJQcmVzZW50KSB7CisgICAgd3JpdGVTYW1wbGVSYXRlKGFzYywgY29uZmlnLT5leHRTYW1wbGluZ1JhdGUsIDQpOwogICAgIHdyaXRlQW90KGFzYywgY29uZmlnLT5hb3QpOwogICB9CiAKICAgc3dpdGNoIChjb25maWctPmFvdCkgewotI2lmZGVmIFRQX0dBX0VOQUJMRQogICAgIGNhc2UgQU9UX0FBQ19NQUlOOgogICAgIGNhc2UgQU9UX0FBQ19MQzoKICAgICBjYXNlIEFPVF9BQUNfU1NSOgpAQCAtNTE1LDE4ICs5MzUsMjAgQEAKICAgICBjYXNlIEFPVF9FUl9UV0lOX1ZROgogICAgIGNhc2UgQU9UX0VSX0JTQUM6CiAgICAgY2FzZSBBT1RfRVJfQUFDX0xEOgotICAgICAgZXJyID0gdHJhbnNwb3J0RW5jX3dyaXRlR0FTcGVjaWZpY0NvbmZpZyhhc2MsIGNvbmZpZywgZXh0RmxhZywgYWxpZ25BbmNob3IpOwotICAgICAgaWYgKGVycikKLSAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgIGVyciA9CisgICAgICAgICAgdHJhbnNwb3J0RW5jX3dyaXRlR0FTcGVjaWZpY0NvbmZpZyhhc2MsIGNvbmZpZywgZXh0RmxhZywgYWxpZ25BbmNob3IpOworICAgICAgaWYgKGVycikgcmV0dXJuIGVycjsKICAgICAgIGJyZWFrOwotI2VuZGlmIC8qIFRQX0dBX0VOQUJMRSAqLwotI2lmZGVmIFRQX0VMRF9FTkFCTEUKICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgogICAgICAgZXJyID0gdHJhbnNwb3J0RW5jX3dyaXRlRUxEU3BlY2lmaWNDb25maWcoYXNjLCBjb25maWcsIGVwQ29uZmlnLCBjYik7Ci0gICAgICBpZiAoZXJyKQotICAgICAgICByZXR1cm4gZXJyOworICAgICAgaWYgKGVycikgcmV0dXJuIGVycjsKICAgICAgIGJyZWFrOwotI2VuZGlmIC8qIFRQX0VMRF9FTkFCTEUgKi8KKyAgICBjYXNlIEFPVF9VU0FDOgorICAgICAgZXJyID0gdHJhbnNwb3J0RW5jX3dyaXRlVXNhY1NwZWNpZmljQ29uZmlnKGFzYywgZXh0RmxhZywgY29uZmlnLCBjYik7CisgICAgICBpZiAoZXJyKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgICB9CisgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgcmV0dXJuIC0xOwogICB9CkBAIC01NDMsMzQgKzk2NSwzMiBAQAogICAgIGNhc2UgQU9UX0VSX0hJTE46CiAgICAgY2FzZSBBT1RfRVJfUEFSQToKICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgotICAgICAgRkRLd3JpdGVCaXRzKCBhc2MsIDAsIDIgKTsgLyogZXBjb25maWcgMCAqLworICAgICAgRkRLd3JpdGVCaXRzKGFzYywgMCwgMik7IC8qIGVwY29uZmlnIDAgKi8KICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICBicmVhazsKICAgfQogCiAgIC8qIGJhY2t3YXJkIGNvbXBhdGlibGUgZXhwbGljaXQgc2lnbmFsaW5nIG9mIGV4dGVuc2lvbiBBT1QgKi8KLSAgaWYgKGNvbmZpZy0+c2JyU2lnbmFsaW5nPT1TSUdfRVhQTElDSVRfQldfQ09NUEFUSUJMRSkKLSAgeworICBpZiAoY29uZmlnLT5zYnJTaWduYWxpbmcgPT0gU0lHX0VYUExJQ0lUX0JXX0NPTVBBVElCTEUpIHsKICAgICBUUF9BU0NfRVhURU5TSU9OX0lEIGFzY0V4dElkID0gQVNDRVhUX1VOS09XTjsKIAogICAgIGlmIChjb25maWctPnNiclByZXNlbnQpIHsKLSAgICAgIGFzY0V4dElkPUFTQ0VYVF9TQlI7Ci0gICAgICBGREt3cml0ZUJpdHMoIGFzYywgYXNjRXh0SWQsIDExICk7CisgICAgICBhc2NFeHRJZCA9IEFTQ0VYVF9TQlI7CisgICAgICBGREt3cml0ZUJpdHMoYXNjLCBhc2NFeHRJZCwgMTEpOwogICAgICAgd3JpdGVBb3QoYXNjLCBjb25maWctPmV4dEFPVCk7Ci0gICAgICBGREt3cml0ZUJpdHMoIGFzYywgMSwgMSApOyAvKiBzYnJQcmVzZW50RmxhZz0xICovCi0gICAgICB3cml0ZVNhbXBsZVJhdGUoYXNjLCBjb25maWctPmV4dFNhbXBsaW5nUmF0ZSk7CisgICAgICBGREt3cml0ZUJpdHMoYXNjLCAxLCAxKTsgLyogc2JyUHJlc2VudEZsYWc9MSAqLworICAgICAgd3JpdGVTYW1wbGVSYXRlKGFzYywgY29uZmlnLT5leHRTYW1wbGluZ1JhdGUsIDQpOwogICAgICAgaWYgKGNvbmZpZy0+cHNQcmVzZW50KSB7Ci0gICAgICAgIGFzY0V4dElkPUFTQ0VYVF9QUzsKLSAgICAgICAgRkRLd3JpdGVCaXRzKCBhc2MsIGFzY0V4dElkLCAxMSApOwotICAgICAgICBGREt3cml0ZUJpdHMoIGFzYywgMSwgMSApOyAvKiBwc1ByZXNlbnRGbGFnPTEgKi8KKyAgICAgICAgYXNjRXh0SWQgPSBBU0NFWFRfUFM7CisgICAgICAgIEZES3dyaXRlQml0cyhhc2MsIGFzY0V4dElkLCAxMSk7CisgICAgICAgIEZES3dyaXRlQml0cyhhc2MsIDEsIDEpOyAvKiBwc1ByZXNlbnRGbGFnPTEgKi8KICAgICAgIH0KICAgICB9Ci0KICAgfQogCiAgIC8qIE1ha2Ugc3VyZSBhbGwgYml0cyBhcmUgc3luYydlZCAqLwotICBGREtzeW5jQ2FjaGUoIGFzYyApOworICBGREtzeW5jQ2FjaGUoYXNjKTsKIAogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYXNjLmggYi9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2FzYy5oCmluZGV4IDQ3ZmU3YTEuLjVmNTYyMWUgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfYXNjLmgKKysrIGIvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19hc2MuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEF1dGhvcihzKTogTWFudWVsIEphbmRlcgorICAgQXV0aG9yKHMpOiAgIE1hbnVlbCBKYW5kZXIKKwogICAgRGVzY3JpcHRpb246IEF1ZGlvIFNwZWNpZmljIENvbmZpZyB3cml0ZXIKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmbmRlZiBUUEVOQ19BU0NfSAogI2RlZmluZSBUUEVOQ19BU0NfSApAQCAtOTUsMTAgKzEwNywxMiBAQAogICogXGJyaWVmIEdldCBjaGFubmVsIGNvbmZpZyBmcm9tIGNoYW5uZWwgbW9kZS4KICAqCiAgKiBccGFyYW0gY2hhbm5lbF9tb2RlIGNoYW5uZWwgbW9kZQorICogXHBhcmFtIGNoYW5uZWxfY29uZmlnX3plcm8gbm8gc3RhbmRhcmQgY2hhbm5lbCBjb25maWd1cmF0aW9uCiAgKgogICogXHJldHVybiBjaGFuZWwgY29uZmlnCiAgKi8KLWludCBnZXRDaGFubmVsQ29uZmlnKCBDSEFOTkVMX01PREUgY2hhbm5lbF9tb2RlICk7CitpbnQgZ2V0Q2hhbm5lbENvbmZpZyhjb25zdCBDSEFOTkVMX01PREUgY2hhbm5lbF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgY2hhbm5lbF9jb25maWdfemVybyk7CiAKIC8qKgogICogXGJyaWVmIFdyaXRlIGEgUHJvZ3JhbSBDb25maWcgRWxlbWVudC4KQEAgLTExMywxNiArMTI3LDEwIEBACiAgKiBccGFyYW0gcmVmZXJlbmNlIGJpdHN0cmVhbSBwb3NpdGlvbiBmb3IgYWxpZ25tZW50CiAgKiBccmV0dXJuIHplcm8gb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZmFpbHVyZS4KICAqLwotaW50IHRyYW5zcG9ydEVuY193cml0ZVBDRSgKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAotICAgICAgICBDSEFOTkVMX01PREUgICAgICAgICBjaGFubmVsTW9kZSwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgaW5zdGFuY2VUYWdQQ0UsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgIHByb2ZpbGUsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgIG1hdHJpeE1peGRvd25BLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBwc2V1ZG9TdXJyb3VuZEVuYWJsZSwKLSAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgYWxpZ25BbmNob3IKLSAgICAgICAgKTsKK2ludCB0cmFuc3BvcnRFbmNfd3JpdGVQQ0UoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBDSEFOTkVMX01PREUgY2hhbm5lbE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlLCBpbnQgaW5zdGFuY2VUYWdQQ0UsIGludCBwcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF0cml4TWl4ZG93bkEsIGludCBwc2V1ZG9TdXJyb3VuZEVuYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBhbGlnbkFuY2hvcik7CiAKIC8qKgogICogXGJyaWVmIEdldCB0aGUgYml0IGNvdW50IHJlcXVpcmVkIGJ5IGEgUHJvZ3JhbSBDb25maWcgRWxlbWVudApAQCAtMTMwLDEzICsxMzgsMTAgQEAKICAqIFxwYXJhbSBjaGFubmVsTW9kZSB0aGUgY2hhbm5lbCBtb2RlIHRvIGJlIHVzZWQKICAqIFxwYXJhbSBtYXRyaXggbWl4ZG93biBnYWluCiAgKiBccGFyYW0gYml0IG9mZnNldCBhdCB3aGljaCB0aGUgUENFIHdvdWxkIHN0YXJ0Ci0gKiBccmV0dXJuIHRoZSBhbW91bnQgb2YgYml0cyByZXF1aXJlZCBmb3IgdGhlIFBDRSBpbmNsdWRpbmcgdGhlIGdpdmVuIGJpdCBvZmZzZXQuCisgKiBccmV0dXJuIHRoZSBhbW91bnQgb2YgYml0cyByZXF1aXJlZCBmb3IgdGhlIFBDRSBpbmNsdWRpbmcgdGhlIGdpdmVuIGJpdAorICogb2Zmc2V0LgogICovCi1pbnQgdHJhbnNwb3J0RW5jX0dldFBDRUJpdHMoCi0gICAgICAgIENIQU5ORUxfTU9ERSBjaGFubmVsTW9kZSwKLSAgICAgICAgaW50ICAgICAgICAgIG1hdHJpeE1peGRvd25BLAotICAgICAgICBpbnQgICAgICAgICAgYml0cwotICAgICAgICApOworaW50IHRyYW5zcG9ydEVuY19HZXRQQ0VCaXRzKENIQU5ORUxfTU9ERSBjaGFubmVsTW9kZSwgaW50IG1hdHJpeE1peGRvd25BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzKTsKIAogI2VuZGlmIC8qIFRQRU5DX0FTQ19IICovCi0KZGlmZiAtLWdpdCBhL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfbGF0bS5jcHAgYi9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2xhdG0uY3BwCmluZGV4IGYyOTIwMTkuLjJkMzVkNDggMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfbGF0bS5jcHAKKysrIGIvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19sYXRtLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3OCArOTAsNjkgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKKwogICAgRGVzY3JpcHRpb246CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJ0cGVuY19sYXRtLmgiCiAKLQogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAKIHN0YXRpYyBjb25zdCBzaG9ydCBjZWxwRnJhbWVMZW5ndGhUYWJsZVs2NF0gPSB7Ci0gMTU0LCAxNzAsIDE4NiwgMTQ3LCAxNTYsIDE2NSwgMTE0LCAxMjAsCi0gMTg2LCAxMjYsIDEzMiwgMTM4LCAxNDIsIDE0NiwgMTU0LCAxNjYsCi0gMTc0LCAxODIsIDE5MCwgMTk4LCAyMDYsIDIxMCwgMjE0LCAxMTAsCi0gMTE0LCAxMTgsIDEyMCwgMTIyLCAyMTgsIDIzMCwgMjQyLCAyNTQsCi0gMjY2LCAyNzgsIDI4NiwgMjk0LCAzMTgsIDM0MiwgMzU4LCAzNzQsCi0gMzkwLCA0MDYsIDQyMiwgMTM2LCAxNDIsIDE0OCwgMTU0LCAxNjAsCi0gMTY2LCAxNzAsIDE3NCwgMTg2LCAxOTgsIDIwNiwgMjE0LCAyMjIsCi0gMjMwLCAyMzgsIDIxNiwgMTYwLCAyODAsIDMzOCwgMCwgICAwCi19OworICAgIDE1NCwgMTcwLCAxODYsIDE0NywgMTU2LCAxNjUsIDExNCwgMTIwLCAxODYsIDEyNiwgMTMyLCAxMzgsIDE0MiwKKyAgICAxNDYsIDE1NCwgMTY2LCAxNzQsIDE4MiwgMTkwLCAxOTgsIDIwNiwgMjEwLCAyMTQsIDExMCwgMTE0LCAxMTgsCisgICAgMTIwLCAxMjIsIDIxOCwgMjMwLCAyNDIsIDI1NCwgMjY2LCAyNzgsIDI4NiwgMjk0LCAzMTgsIDM0MiwgMzU4LAorICAgIDM3NCwgMzkwLCA0MDYsIDQyMiwgMTM2LCAxNDIsIDE0OCwgMTU0LCAxNjAsIDE2NiwgMTcwLCAxNzQsIDE4NiwKKyAgICAxOTgsIDIwNiwgMjE0LCAyMjIsIDIzMCwgMjM4LCAyMTYsIDE2MCwgMjgwLCAzMzgsIDAsICAgMH07CiAKIC8qKioqKioqCiAgd3JpdGUgdmFsdWUgdG8gdHJhbnNwb3J0IHN0cmVhbQogIGZpcnN0IHR3byBiaXRzIGRlZmluZSB0aGUgc2l6ZSBvZiB0aGUgdmFsdWUgaXRzZWxmCiAgdGhlbiB0aGUgdmFsdWUgaXRzZWxmLCB3aXRoIGEgc2l6ZSBvZiAwLTMgYnl0ZXMKICoqKioqKiovCi1zdGF0aWMKLVVJTlQgdHJhbnNwb3J0RW5jX0xhdG1Xcml0ZVZhbHVlKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgaW50IHZhbHVlKQoteworc3RhdGljIFVJTlQgdHJhbnNwb3J0RW5jX0xhdG1Xcml0ZVZhbHVlKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgaW50IHZhbHVlKSB7CiAgIFVDSEFSIHZhbHVlQnl0ZXMgPSA0OwogICB1bnNpZ25lZCBpbnQgYml0c1dyaXR0ZW4gPSAwOwogICBpbnQgaTsKIAotICBpZiAoIHZhbHVlIDwgKDE8PDgpICkgeworICBpZiAodmFsdWUgPCAoMSA8PCA4KSkgewogICAgIHZhbHVlQnl0ZXMgPSAxOwotICB9IGVsc2UgaWYgKCB2YWx1ZSA8ICgxPDwxNikgKSB7CisgIH0gZWxzZSBpZiAodmFsdWUgPCAoMSA8PCAxNikpIHsKICAgICB2YWx1ZUJ5dGVzID0gMjsKLSAgfSBlbHNlIGlmICggdmFsdWUgPCAoMTw8MjQpICkgeworICB9IGVsc2UgaWYgKHZhbHVlIDwgKDEgPDwgMjQpKSB7CiAgICAgdmFsdWVCeXRlcyA9IDM7CiAgIH0gZWxzZSB7CiAgICAgdmFsdWVCeXRlcyA9IDQ7CiAgIH0KIAotICBGREt3cml0ZUJpdHMoaEJzLCB2YWx1ZUJ5dGVzLTEsIDIgKTsgLyogc2l6ZSBvZiB2YWx1ZSBpbiBCeXRlcyAqLwotICBmb3IgKGk9MDsgaTx2YWx1ZUJ5dGVzOyBpKyspIHsKKyAgRkRLd3JpdGVCaXRzKGhCcywgdmFsdWVCeXRlcyAtIDEsIDIpOyAvKiBzaXplIG9mIHZhbHVlIGluIEJ5dGVzICovCisgIGZvciAoaSA9IDA7IGkgPCB2YWx1ZUJ5dGVzOyBpKyspIHsKICAgICAvKiB3cml0ZSBtb3N0IHNpZ25pZmljYW50IEJ5dGUgZmlyc3QgKi8KLSAgICBGREt3cml0ZUJpdHMoaEJzLCAoVUNIQVIpKHZhbHVlPj4oKHZhbHVlQnl0ZXMtMS1pKTw8MykpLCA4KTsKKyAgICBGREt3cml0ZUJpdHMoaEJzLCAoVUNIQVIpKHZhbHVlID4+ICgodmFsdWVCeXRlcyAtIDEgLSBpKSA8PCAzKSksIDgpOwogICB9CiAKLSAgYml0c1dyaXR0ZW4gPSAodmFsdWVCeXRlczw8MykrMjsKKyAgYml0c1dyaXR0ZW4gPSAodmFsdWVCeXRlcyA8PCAzKSArIDI7CiAKICAgcmV0dXJuIGJpdHNXcml0dGVuOwogfQogCi1zdGF0aWMKLVVJTlQgdHJhbnNwb3J0RW5jX0xhdG1Db3VudEZpeEJpdERlbWFuZEhlYWRlciAoIEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzICkKLXsKK3N0YXRpYyBVSU5UIHRyYW5zcG9ydEVuY19MYXRtQ291bnRGaXhCaXREZW1hbmRIZWFkZXIoSEFORExFX0xBVE1fU1RSRUFNIGhBc3MpIHsKICAgaW50IGJpdERlbWFuZCA9IDA7Ci0gIGludCBpbnNlcnRTZXR1cERhdGEgPSAwIDsKKyAgaW50IGluc2VydFNldHVwRGF0YSA9IDA7CiAKICAgLyogb25seSBpZiBzdGFydCBvZiBuZXcgbGF0bSBmcmFtZSAqLwotICBpZiAoaEFzcy0+c3ViRnJhbWVDbnQ9PTApCi0gIHsKKyAgaWYgKGhBc3MtPnN1YkZyYW1lQ250ID09IDApIHsKICAgICAvKiBBdWRpb1N5bmNTdHJlYW0gKi8KIAogICAgIGlmIChoQXNzLT50dCA9PSBUVF9NUDRfTE9BUykgewotICAgICAgYml0RGVtYW5kICs9IDExIDsgICAgICAgICAgICAgLyogc3luY3dvcmQgKi8KLSAgICAgIGJpdERlbWFuZCArPSAxMyA7ICAgICAgICAgICAgIC8qIGF1ZGlvTXV4TGVuZ3RoQnl0ZXMgKi8KKyAgICAgIGJpdERlbWFuZCArPSAxMTsgLyogc3luY3dvcmQgKi8KKyAgICAgIGJpdERlbWFuZCArPSAxMzsgLyogYXVkaW9NdXhMZW5ndGhCeXRlcyAqLwogICAgIH0KIAogICAgIC8qIEF1ZGlvTXV4RWxlbWVudCovCkBAIC0xNjQsMTkxICsxNjYsMTg0IEBACiAKICAgICBpZiAoaEFzcy0+dHQgIT0gVFRfTVA0X0xBVE1fTUNQMCkgewogICAgICAgLyogQXVkaW9NdXhFbGVtZW50Ojp1c2VTYW1lU3RyZWFtTXV4IEZsYWcgKi8KLSAgICAgIGJpdERlbWFuZCs9MTsKKyAgICAgIGJpdERlbWFuZCArPSAxOwogCi0gICAgICBpZiggaW5zZXJ0U2V0dXBEYXRhICkgeworICAgICAgaWYgKGluc2VydFNldHVwRGF0YSkgewogICAgICAgICBiaXREZW1hbmQgKz0gaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0czsKICAgICAgIH0KICAgICB9CiAKICAgICAvKiBBdWRpb011eEVsZW1lbnQ6Om90aGVyRGF0YUJpdHMgKi8KLSAgICBiaXREZW1hbmQgKz0gOCpoQXNzLT5vdGhlckRhdGFMZW5CeXRlczsKKyAgICBiaXREZW1hbmQgKz0gaEFzcy0+b3RoZXJEYXRhTGVuQml0czsKIAogICAgIC8qIEF1ZGlvTXV4RWxlbWVudDo6Qnl0ZUFsaWduICovCi0gICAgaWYgKCBiaXREZW1hbmQgJSA4ICkgewotICAgICAgIGhBc3MtPmZpbGxCaXRzID0gOCAtIChiaXREZW1hbmQgJSA4KTsKLSAgICAgICBiaXREZW1hbmQgKz0gaEFzcy0+ZmlsbEJpdHMgOworICAgIGlmIChiaXREZW1hbmQgJSA4KSB7CisgICAgICBoQXNzLT5maWxsQml0cyA9IDggLSAoYml0RGVtYW5kICUgOCk7CisgICAgICBiaXREZW1hbmQgKz0gaEFzcy0+ZmlsbEJpdHM7CiAgICAgfSBlbHNlIHsKICAgICAgIGhBc3MtPmZpbGxCaXRzID0gMDsKICAgICB9CiAgIH0KIAotICByZXR1cm4gYml0RGVtYW5kIDsKKyAgcmV0dXJuIGJpdERlbWFuZDsKIH0KIAotc3RhdGljCi1VSU5UIHRyYW5zcG9ydEVuY19MYXRtQ291bnRWYXJCaXREZW1hbmRIZWFkZXIgKCBIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcyAsIHVuc2lnbmVkIGludCBzdHJlYW1EYXRhTGVuZ3RoICkKLXsKK3N0YXRpYyBVSU5UIHRyYW5zcG9ydEVuY19MYXRtQ291bnRWYXJCaXREZW1hbmRIZWFkZXIoCisgICAgSEFORExFX0xBVE1fU1RSRUFNIGhBc3MsIHVuc2lnbmVkIGludCBzdHJlYW1EYXRhTGVuZ3RoKSB7CiAgIGludCBiaXREZW1hbmQgPSAwOwotICBpbnQgIHByb2csIGxheWVyOworICBpbnQgcHJvZywgbGF5ZXI7CiAKICAgLyogUGF5bG9hZCBMZW5ndGggSW5mbyovCi0gIGlmKCBoQXNzLT5hbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nICkgewotICAgIGZvciggcHJvZz0wOyBwcm9nPGhBc3MtPm5vUHJvZ3JhbTsgcHJvZysrICkgewotICAgICAgZm9yKCBsYXllcj0wOyBsYXllcjxMQVRNX01BWF9MQVlFUlM7IGxheWVyKysgKSB7CisgIGlmIChoQXNzLT5hbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nKSB7CisgICAgZm9yIChwcm9nID0gMDsgcHJvZyA8IGhBc3MtPm5vUHJvZ3JhbTsgcHJvZysrKSB7CisgICAgICBmb3IgKGxheWVyID0gMDsgbGF5ZXIgPCBMQVRNX01BWF9MQVlFUlM7IGxheWVyKyspIHsKICAgICAgICAgTEFUTV9MQVlFUl9JTkZPICpwX2xpbmZvID0gJihoQXNzLT5tX2xpbmZvW3Byb2ddW2xheWVyXSk7CiAKLSAgICAgICAgaWYoIHBfbGluZm8tPnN0cmVhbUlEID49IDAgKSB7Ci0gICAgICAgICAgc3dpdGNoKCBwX2xpbmZvLT5mcmFtZUxlbmd0aFR5cGUgKSB7Ci0gICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgaWYgKCBzdHJlYW1EYXRhTGVuZ3RoID4gMCApIHsKLSAgICAgICAgICAgICAgc3RyZWFtRGF0YUxlbmd0aCAtPSBiaXREZW1hbmQgOwotICAgICAgICAgICAgICB3aGlsZSggc3RyZWFtRGF0YUxlbmd0aCA+PSAoMjU1PDwzKSApIHsKLSAgICAgICAgICAgICAgICBiaXREZW1hbmQrPTg7Ci0gICAgICAgICAgICAgICAgc3RyZWFtRGF0YUxlbmd0aCAtPSAoMjU1PDwzKTsKKyAgICAgICAgaWYgKHBfbGluZm8tPnN0cmVhbUlEID49IDApIHsKKyAgICAgICAgICBzd2l0Y2ggKHBfbGluZm8tPmZyYW1lTGVuZ3RoVHlwZSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICBpZiAoc3RyZWFtRGF0YUxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1EYXRhTGVuZ3RoIC09IGJpdERlbWFuZDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoc3RyZWFtRGF0YUxlbmd0aCA+PSAoMjU1IDw8IDMpKSB7CisgICAgICAgICAgICAgICAgICBiaXREZW1hbmQgKz0gODsKKyAgICAgICAgICAgICAgICAgIHN0cmVhbURhdGFMZW5ndGggLT0gKDI1NSA8PCAzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYml0RGVtYW5kICs9IDg7CiAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYml0RGVtYW5kICs9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgY2FzZSA0OgotICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIGJpdERlbWFuZCArPSAyOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgIGJpdERlbWFuZCArPSAyOworICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfSBlbHNlIHsKICAgICAvKiB0aGVyZSBhcmUgbWFueSBwb3NzaWJpbGl0aWVzIHRvIHVzZSB0aGlzIG1lY2hhbmlzbS4gICovCi0gICAgc3dpdGNoKCBoQXNzLT52YXJNb2RlICkgewotICAgIGNhc2UgTEFUTVZBUl9TSU1QTEVfU0VRVUVOQ0U6IHsKLSAgICAgIC8qIFVzZSB0aGUgc2VxdWVuY2UgZ2VuZXJhdGVkIGJ5IHRoZSBlbmNvZGVyICovCi0gICAgICAvL2ludCBzdHJlYW1DbnRQb3NpdGlvbiA9IHRyYW5zcG9ydEVuY19TZXRXcml0ZVBvaW50ZXIoIGhBc3MtPmhBc3NlbWJsZSwgMCApOwotICAgICAgLy9pbnQgc3RyZWFtQ250UG9zaXRpb24gPSBGREtnZXRWYWxpZEJpdHMoIGhBc3MtPmhBc3NlbWJsZSApOwotICAgICAgYml0RGVtYW5kKz00OworICAgIHN3aXRjaCAoaEFzcy0+dmFyTW9kZSkgeworICAgICAgY2FzZSBMQVRNVkFSX1NJTVBMRV9TRVFVRU5DRTogeworICAgICAgICAvKiBVc2UgdGhlIHNlcXVlbmNlIGdlbmVyYXRlZCBieSB0aGUgZW5jb2RlciAqLworICAgICAgICAvLyBpbnQgc3RyZWFtQ250UG9zaXRpb24gPSB0cmFuc3BvcnRFbmNfU2V0V3JpdGVQb2ludGVyKAorICAgICAgICAvLyBoQXNzLT5oQXNzZW1ibGUsIDAgKTsgIGludCBzdHJlYW1DbnRQb3NpdGlvbiA9IEZES2dldFZhbGlkQml0cygKKyAgICAgICAgLy8gaEFzcy0+aEFzc2VtYmxlICk7CisgICAgICAgIGJpdERlbWFuZCArPSA0OwogCi0gICAgICBoQXNzLT52YXJTdHJlYW1DbnQgPSAwOwotICAgICAgZm9yKCBwcm9nPTA7IHByb2c8aEFzcy0+bm9Qcm9ncmFtOyBwcm9nKysgKSB7Ci0gICAgICAgIGZvciggbGF5ZXI9MDsgbGF5ZXI8TEFUTV9NQVhfTEFZRVJTOyBsYXllcisrICkgewotICAgICAgICAgIExBVE1fTEFZRVJfSU5GTyAqcF9saW5mbyA9ICYoaEFzcy0+bV9saW5mb1twcm9nXVtsYXllcl0pOworICAgICAgICBoQXNzLT52YXJTdHJlYW1DbnQgPSAwOworICAgICAgICBmb3IgKHByb2cgPSAwOyBwcm9nIDwgaEFzcy0+bm9Qcm9ncmFtOyBwcm9nKyspIHsKKyAgICAgICAgICBmb3IgKGxheWVyID0gMDsgbGF5ZXIgPCBMQVRNX01BWF9MQVlFUlM7IGxheWVyKyspIHsKKyAgICAgICAgICAgIExBVE1fTEFZRVJfSU5GTyAqcF9saW5mbyA9ICYoaEFzcy0+bV9saW5mb1twcm9nXVtsYXllcl0pOwogCi0gICAgICAgICAgaWYoIHBfbGluZm8tPnN0cmVhbUlEID49IDAgKSB7CisgICAgICAgICAgICBpZiAocF9saW5mby0+c3RyZWFtSUQgPj0gMCkgeworICAgICAgICAgICAgICBiaXREZW1hbmQgKz0gNDsgLyogc3RyZWFtSUQgKi8KKyAgICAgICAgICAgICAgc3dpdGNoIChwX2xpbmZvLT5mcmFtZUxlbmd0aFR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICBzdHJlYW1EYXRhTGVuZ3RoIC09IGJpdERlbWFuZDsKKyAgICAgICAgICAgICAgICAgIHdoaWxlIChzdHJlYW1EYXRhTGVuZ3RoID49ICgyNTUgPDwgMykpIHsKKyAgICAgICAgICAgICAgICAgICAgYml0RGVtYW5kICs9IDg7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbURhdGFMZW5ndGggLT0gKDI1NSA8PCAzKTsKKyAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYml0RGVtYW5kKz00OyAvKiBzdHJlYW1JRCAqLwotICAgICAgICAgICAgc3dpdGNoKCBwX2xpbmZvLT5mcmFtZUxlbmd0aFR5cGUgKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgIHN0cmVhbURhdGFMZW5ndGggLT0gYml0RGVtYW5kIDsKLSAgICAgICAgICAgICAgd2hpbGUoIHN0cmVhbURhdGFMZW5ndGggPj0gKDI1NTw8MykgKSB7Ci0gICAgICAgICAgICAgICAgYml0RGVtYW5kKz04OwotICAgICAgICAgICAgICAgIHN0cmVhbURhdGFMZW5ndGggLT0gKDI1NTw8Myk7CisgICAgICAgICAgICAgICAgICBiaXREZW1hbmQgKz0gODsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgLypiaXREZW1hbmQgKz0gMTsgZW5kRmxhZworICAgICAgICAgICAgICAgICAgYnJlYWs7Ki8KKworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgY2FzZSA2OgorCisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIGJpdERlbWFuZCArPSA4OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgLypiaXREZW1hbmQgKz0gMTsgZW5kRmxhZwotICAgICAgICAgICAgICBicmVhazsqLwotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBjYXNlIDY6Ci0KLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIHJldHVybiAgMDsKKyAgICAgICAgICAgICAgaEFzcy0+dmFyU3RyZWFtQ250Kys7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBoQXNzLT52YXJTdHJlYW1DbnQrKzsKICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJpdERlbWFuZCs9NDsKLSAgICAgIC8vdHJhbnNwb3J0RW5jX1VwZGF0ZUJpdHN0cmVhbUZpZWxkKCBoQXNzLT5oQXNzZW1ibGUsIHN0cmVhbUNudFBvc2l0aW9uLCBoQXNzLT52YXJTdHJlYW1DbnQtMSwgNCApOwotICAgICAgLy9VSU5UIHBvcyA9IHN0cmVhbUNudFBvc2l0aW9uLUZES2dldFZhbGlkQml0cyhoQXNzLT5oQXNzZW1ibGUpOwotICAgICAgLy9GREtwdXNoQmFjayggaEFzcy0+aEFzc2VtYmxlLCAgcG9zKTsKLSAgICAgIC8vRkRLd3JpdGVCaXRzKCBoQXNzLT5oQXNzZW1ibGUsIGhBc3MtPnZhclN0cmVhbUNudC0xLCA0KTsKLSAgICAgIC8vRkRLcHVzaEZvciggaEFzcy0+aEFzc2VtYmxlLCBwb3MtNCk7Ci0gICAgfQotICAgIGJyZWFrOworICAgICAgICBiaXREZW1hbmQgKz0gNDsKKyAgICAgICAgLy8gdHJhbnNwb3J0RW5jX1VwZGF0ZUJpdHN0cmVhbUZpZWxkKCBoQXNzLT5oQXNzZW1ibGUsCisgICAgICAgIC8vIHN0cmVhbUNudFBvc2l0aW9uLCBoQXNzLT52YXJTdHJlYW1DbnQtMSwgNCApOyAgVUlOVCBwb3MgPQorICAgICAgICAvLyBzdHJlYW1DbnRQb3NpdGlvbi1GREtnZXRWYWxpZEJpdHMoaEFzcy0+aEFzc2VtYmxlKTsgIEZES3B1c2hCYWNrKAorICAgICAgICAvLyBoQXNzLT5oQXNzZW1ibGUsICBwb3MpOyAgRkRLd3JpdGVCaXRzKCBoQXNzLT5oQXNzZW1ibGUsCisgICAgICAgIC8vIGhBc3MtPnZhclN0cmVhbUNudC0xLCA0KTsgIEZES3B1c2hGb3IoIGhBc3MtPmhBc3NlbWJsZSwgcG9zLTQpOworICAgICAgfSBicmVhazsKIAotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIDA7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgIH0KIAotICByZXR1cm4gYml0RGVtYW5kIDsKKyAgcmV0dXJuIGJpdERlbWFuZDsKIH0KIAogVFJBTlNQT1JURU5DX0VSUk9SCi1DcmVhdGVTdHJlYW1NdXhDb25maWcoCi0gICAgICAgICAgICAgICAgICAgICAgSEFORExFX0xBVE1fU1RSRUFNIGhBc3MsCi0gICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAotICAgICAgICAgICAgICAgICAgICAgIGludCBidWZmZXJGdWxsbmVzcywKLSAgICAgICAgICAgICAgICAgICAgICBDU1RwQ2FsbEJhY2tzICpjYgotICAgICAgICAgICAgICAgICAgICAgKQoteworQ3JlYXRlU3RyZWFtTXV4Q29uZmlnKEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlckZ1bGxuZXNzLCBDU1RwQ2FsbEJhY2tzICpjYikgewogICBJTlQgc3RyZWFtSURjbnQsIHRtcDsKICAgaW50IGxheWVyLCBwcm9nOwogCi0gIFVTSE9SVCBjb3JlRnJhbWVPZmZzZXQ9MDsKKyAgVVNIT1JUIGNvcmVGcmFtZU9mZnNldCA9IDA7CiAKLSAgaEFzcy0+dGFyYUJ1ZmZlckZ1bGxuZXNzICA9IDB4RkY7Ci0gIGhBc3MtPmF1ZGlvTXV4VmVyc2lvbkEgICAgPSAwOyAvKiBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgKi8KKyAgaEFzcy0+dGFyYUJ1ZmZlckZ1bGxuZXNzID0gMHhGRjsKKyAgaEFzcy0+YXVkaW9NdXhWZXJzaW9uQSA9IDA7IC8qIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyAqLwogICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzID0gMDsKIAotICBGREt3cml0ZUJpdHMoIGhCcywgaEFzcy0+YXVkaW9NdXhWZXJzaW9uLCAxICk7ICAgICAgICAgICAgICAgICAgIC8qIGF1ZGlvTXV4VmVyc2lvbiAqLworICBGREt3cml0ZUJpdHMoaEJzLCBoQXNzLT5hdWRpb011eFZlcnNpb24sIDEpOyAvKiBhdWRpb011eFZlcnNpb24gKi8KICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cyArPSAxOwogCi0gIGlmICggaEFzcy0+YXVkaW9NdXhWZXJzaW9uID09IDEgKSB7Ci0gICAgRkRLd3JpdGVCaXRzKCBoQnMsIGhBc3MtPmF1ZGlvTXV4VmVyc2lvbkEsIDEgKTsgICAgICAgICAgICAgICAgLyogYXVkaW9NdXhWZXJzaW9uQSAqLwotICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMrPTE7CisgIGlmIChoQXNzLT5hdWRpb011eFZlcnNpb24gPT0gMSkgeworICAgIEZES3dyaXRlQml0cyhoQnMsIGhBc3MtPmF1ZGlvTXV4VmVyc2lvbkEsIDEpOyAvKiBhdWRpb011eFZlcnNpb25BICovCisgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cyArPSAxOwogICB9CiAKLSAgaWYgKCBoQXNzLT5hdWRpb011eFZlcnNpb25BID09IDAgKQotICB7Ci0gICAgaWYgKCBoQXNzLT5hdWRpb011eFZlcnNpb24gPT0gMSApIHsKLSAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMrPSB0cmFuc3BvcnRFbmNfTGF0bVdyaXRlVmFsdWUoIGhCcywgaEFzcy0+dGFyYUJ1ZmZlckZ1bGxuZXNzICk7LyogdGFyYUJ1ZmZlckZ1bGxuZXNzICovCisgIGlmIChoQXNzLT5hdWRpb011eFZlcnNpb25BID09IDApIHsKKyAgICBpZiAoaEFzcy0+YXVkaW9NdXhWZXJzaW9uID09IDEpIHsKKyAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMgKz0gdHJhbnNwb3J0RW5jX0xhdG1Xcml0ZVZhbHVlKAorICAgICAgICAgIGhCcywgaEFzcy0+dGFyYUJ1ZmZlckZ1bGxuZXNzKTsgLyogdGFyYUJ1ZmZlckZ1bGxuZXNzICovCiAgICAgfQotICAgIEZES3dyaXRlQml0cyggaEJzLCBoQXNzLT5hbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nID8gMTowLCAxICk7IC8qIGFsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcgKi8KLSAgICBGREt3cml0ZUJpdHMoIGhCcywgaEFzcy0+bm9TdWJmcmFtZXMtMSwgNiApOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgU3ViZnJhbWVzICovCi0gICAgRkRLd3JpdGVCaXRzKCBoQnMsIGhBc3MtPm5vUHJvZ3JhbS0xLCA0ICk7ICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIFByb2dyYW1zICovCisgICAgRkRLd3JpdGVCaXRzKGhCcywgaEFzcy0+YWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZyA/IDEgOiAwLAorICAgICAgICAgICAgICAgICAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcgKi8KKyAgICBGREt3cml0ZUJpdHMoaEJzLCBoQXNzLT5ub1N1YmZyYW1lcyAtIDEsIDYpOyAvKiBOdW1iZXIgb2YgU3ViZnJhbWVzICovCisgICAgRkRLd3JpdGVCaXRzKGhCcywgaEFzcy0+bm9Qcm9ncmFtIC0gMSwgNCk7ICAgLyogTnVtYmVyIG9mIFByb2dyYW1zICovCiAKLSAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzKz0xMTsKKyAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzICs9IDExOwogCiAgICAgc3RyZWFtSURjbnQgPSAwOwotICAgIGZvciggcHJvZz0wOyBwcm9nPGhBc3MtPm5vUHJvZ3JhbTsgcHJvZysrICkgeworICAgIGZvciAocHJvZyA9IDA7IHByb2cgPCBoQXNzLT5ub1Byb2dyYW07IHByb2crKykgewogICAgICAgaW50IHRyYW5zTGF5ZXIgPSAwOwogCi0gICAgICBGREt3cml0ZUJpdHMoIGhCcywgaEFzcy0+bm9MYXllcltwcm9nXS0xLCAzICk7Ci0gICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzKz0zOworICAgICAgRkRLd3JpdGVCaXRzKGhCcywgaEFzcy0+bm9MYXllcltwcm9nXSAtIDEsIDMpOworICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cyArPSAzOwogCi0gICAgICBmb3IoIGxheWVyPTA7IGxheWVyPExBVE1fTUFYX0xBWUVSUzsgbGF5ZXIrKyApIHsKLSAgICAgICAgTEFUTV9MQVlFUl9JTkZPICAgKnBfbGluZm8gPSAmKGhBc3MtPm1fbGluZm9bcHJvZ11bbGF5ZXJdKTsKLSAgICAgICAgQ09ERVJfQ09ORklHICpwX2xjaSAgID0gaEFzcy0+Y29uZmlnW3Byb2ddW2xheWVyXTsKKyAgICAgIGZvciAobGF5ZXIgPSAwOyBsYXllciA8IExBVE1fTUFYX0xBWUVSUzsgbGF5ZXIrKykgeworICAgICAgICBMQVRNX0xBWUVSX0lORk8gKnBfbGluZm8gPSAmKGhBc3MtPm1fbGluZm9bcHJvZ11bbGF5ZXJdKTsKKyAgICAgICAgQ09ERVJfQ09ORklHICpwX2xjaSA9IGhBc3MtPmNvbmZpZ1twcm9nXVtsYXllcl07CiAKICAgICAgICAgcF9saW5mby0+c3RyZWFtSUQgPSAtMTsKIAotICAgICAgICBpZiggaEFzcy0+Y29uZmlnW3Byb2ddW2xheWVyXSAhPSBOVUxMICkgeworICAgICAgICBpZiAoaEFzcy0+Y29uZmlnW3Byb2ddW2xheWVyXSAhPSBOVUxMKSB7CiAgICAgICAgICAgaW50IHVzZVNhbWVDb25maWcgPSAwOwogCi0gICAgICAgICAgaWYoIHRyYW5zTGF5ZXIgPiAwICkgewotICAgICAgICAgICAgRkRLd3JpdGVCaXRzKCBoQnMsIHVzZVNhbWVDb25maWcgPyAxIDogMCwgMSApOwotICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cys9MTsKKyAgICAgICAgICBpZiAodHJhbnNMYXllciA+IDApIHsKKyAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQnMsIHVzZVNhbWVDb25maWcgPyAxIDogMCwgMSk7CisgICAgICAgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzICs9IDE7CiAgICAgICAgICAgfQotICAgICAgICAgIGlmKCAodXNlU2FtZUNvbmZpZyA9PSAwKSB8fCAodHJhbnNMYXllcj09MCkgKSB7CisgICAgICAgICAgaWYgKCh1c2VTYW1lQ29uZmlnID09IDApIHx8ICh0cmFuc0xheWVyID09IDApKSB7CiAgICAgICAgICAgICBjb25zdCBVSU5UIGFsaWduQW5jaG9yID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CiAKLSAgICAgICAgICAgIHRyYW5zcG9ydEVuY193cml0ZUFTQygKLSAgICAgICAgICAgICAgICAgICAgaEJzLAotICAgICAgICAgICAgICAgICAgICBoQXNzLT5jb25maWdbcHJvZ11bbGF5ZXJdLAotICAgICAgICAgICAgICAgICAgICBjYgotICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgaWYgKDAgIT0KKyAgICAgICAgICAgICAgICAodHJhbnNwb3J0RW5jX3dyaXRlQVNDKGhCcywgaEFzcy0+Y29uZmlnW3Byb2ddW2xheWVyXSwgY2IpKSkgeworICAgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JURU5DX1VOS09XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKCBoQXNzLT5hdWRpb011eFZlcnNpb24gPT0gMSApIHsKKyAgICAgICAgICAgIGlmIChoQXNzLT5hdWRpb011eFZlcnNpb24gPT0gMSkgewogICAgICAgICAgICAgICBVSU5UIGFzY0xlbiA9IHRyYW5zcG9ydEVuY19MYXRtV3JpdGVWYWx1ZShoQnMsIDApOwogICAgICAgICAgICAgICBGREtieXRlQWxpZ24oaEJzLCBhbGlnbkFuY2hvcik7CiAgICAgICAgICAgICAgIGFzY0xlbiA9IEZES2dldFZhbGlkQml0cyhoQnMpIC0gYWxpZ25BbmNob3IgLSBhc2NMZW47CkBAIC0zNTYsMTgwICszNTEsMTYwIEBACiAKICAgICAgICAgICAgICAgdHJhbnNwb3J0RW5jX0xhdG1Xcml0ZVZhbHVlKGhCcywgYXNjTGVuKTsKIAotICAgICAgICAgICAgICB0cmFuc3BvcnRFbmNfd3JpdGVBU0MoCi0gICAgICAgICAgICAgICAgICAgICAgaEJzLAotICAgICAgICAgICAgICAgICAgICAgIGhBc3MtPmNvbmZpZ1twcm9nXVtsYXllcl0sCi0gICAgICAgICAgICAgICAgICAgICAgY2IKLSAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICBpZiAoMCAhPQorICAgICAgICAgICAgICAgICAgKHRyYW5zcG9ydEVuY193cml0ZUFTQyhoQnMsIGhBc3MtPmNvbmZpZ1twcm9nXVtsYXllcl0sIGNiKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JURU5DX1VOS09XTl9FUlJPUjsKKyAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgIEZES2J5dGVBbGlnbihoQnMsIGFsaWduQW5jaG9yKTsgLyogYXNjIGxlbmd0aCBmaWxsYml0cyAqLwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzICs9IEZES2dldFZhbGlkQml0cyhoQnMpIC0gYWxpZ25BbmNob3I7IC8qIGFkZCBhc2MgbGVuZ3RoIHRvIHNtYyBzdW1tYXJ5ICovCisgICAgICAgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzICs9CisgICAgICAgICAgICAgICAgRkRLZ2V0VmFsaWRCaXRzKGhCcykgLQorICAgICAgICAgICAgICAgIGFsaWduQW5jaG9yOyAvKiBhZGQgYXNjIGxlbmd0aCB0byBzbWMgc3VtbWFyeSAqLwogICAgICAgICAgIH0KICAgICAgICAgICB0cmFuc0xheWVyKys7CiAKLSAgICAgICAgICBpZiggIWhBc3MtPmFsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcgKSB7Ci0gICAgICAgICAgICBpZiggc3RyZWFtSURjbnQgPj0gTEFUTV9NQVhfU1RSRUFNX0lEICkKKyAgICAgICAgICBpZiAoIWhBc3MtPmFsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcpIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW1JRGNudCA+PSBMQVRNX01BWF9TVFJFQU1fSUQpCiAgICAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9DT05GSUc7CiAgICAgICAgICAgfQogICAgICAgICAgIHBfbGluZm8tPnN0cmVhbUlEID0gc3RyZWFtSURjbnQrKzsKIAotICAgICAgICAgIHN3aXRjaCggcF9sY2ktPmFvdCApIHsKLSAgICAgICAgICBjYXNlIEFPVF9BQUNfTUFJTiAgICAgIDoKLSAgICAgICAgICBjYXNlIEFPVF9BQUNfTEMgICAgICAgIDoKLSAgICAgICAgICBjYXNlIEFPVF9BQUNfU1NSICAgICAgIDoKLSAgICAgICAgICBjYXNlIEFPVF9BQUNfTFRQICAgICAgIDoKLSAgICAgICAgICBjYXNlIEFPVF9BQUNfU0NBTCAgICAgIDoKLSAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfTEQgICAgIDoKLSAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEICAgIDoKLSAgICAgICAgICBjYXNlIEFPVF9VU0FDOgotICAgICAgICAgICAgcF9saW5mby0+ZnJhbWVMZW5ndGhUeXBlID0gMDsKKyAgICAgICAgICBzd2l0Y2ggKHBfbGNpLT5hb3QpIHsKKyAgICAgICAgICAgIGNhc2UgQU9UX0FBQ19NQUlOOgorICAgICAgICAgICAgY2FzZSBBT1RfQUFDX0xDOgorICAgICAgICAgICAgY2FzZSBBT1RfQUFDX1NTUjoKKyAgICAgICAgICAgIGNhc2UgQU9UX0FBQ19MVFA6CisgICAgICAgICAgICBjYXNlIEFPVF9BQUNfU0NBTDoKKyAgICAgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKKyAgICAgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6CisgICAgICAgICAgICBjYXNlIEFPVF9VU0FDOgorICAgICAgICAgICAgICBwX2xpbmZvLT5mcmFtZUxlbmd0aFR5cGUgPSAwOwogCi0gICAgICAgICAgICBGREt3cml0ZUJpdHMoIGhCcywgcF9saW5mby0+ZnJhbWVMZW5ndGhUeXBlLCAzICk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZnJhbWVMZW5ndGhUeXBlICovCi0gICAgICAgICAgICBGREt3cml0ZUJpdHMoIGhCcywgYnVmZmVyRnVsbG5lc3MsIDggKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWZmZXJGdWxsbmVzcyAqLwotICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cys9MTE7CisgICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQnMsIHBfbGluZm8tPmZyYW1lTGVuZ3RoVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpOyAgICAgICAgICAgICAgICAgICAgICAvKiBmcmFtZUxlbmd0aFR5cGUgKi8KKyAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCcywgYnVmZmVyRnVsbG5lc3MsIDgpOyAvKiBidWZmZXJGdWxsbmVzcyAqLworICAgICAgICAgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzICs9IDExOwogCi0gICAgICAgICAgICBpZiAoICFoQXNzLT5hbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nICkgewotICAgICAgICAgICAgICBDT0RFUl9DT05GSUcgKnBfbGNpX3ByZXYgPSBoQXNzLT5jb25maWdbcHJvZ11bbGF5ZXItMV07Ci0gICAgICAgICAgICAgIGlmICggKChwX2xjaS0+YW90ID09IEFPVF9BQUNfU0NBTCkgfHwgKHBfbGNpLT5hb3QgPT0gQU9UX0VSX0FBQ19TQ0FMKSkgJiYKLSAgICAgICAgICAgICAgICAgICAoKHBfbGNpX3ByZXYtPmFvdCA9PSBBT1RfQ0VMUCkgfHwgKHBfbGNpX3ByZXYtPmFvdCA9PSBBT1RfRVJfQ0VMUCkpICkgewotICAgICAgICAgICAgICAgIEZES3dyaXRlQml0cyggaEJzLCBjb3JlRnJhbWVPZmZzZXQsIDYgKTsgICAgICAgICAgICAgICAgICAgICAgLyogY29yZUZyYW1lT2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cys9NjsKKyAgICAgICAgICAgICAgaWYgKCFoQXNzLT5hbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nKSB7CisgICAgICAgICAgICAgICAgQ09ERVJfQ09ORklHICpwX2xjaV9wcmV2ID0gaEFzcy0+Y29uZmlnW3Byb2ddW2xheWVyIC0gMV07CisgICAgICAgICAgICAgICAgaWYgKCgocF9sY2ktPmFvdCA9PSBBT1RfQUFDX1NDQUwpIHx8CisgICAgICAgICAgICAgICAgICAgICAocF9sY2ktPmFvdCA9PSBBT1RfRVJfQUFDX1NDQUwpKSAmJgorICAgICAgICAgICAgICAgICAgICAoKHBfbGNpX3ByZXYtPmFvdCA9PSBBT1RfQ0VMUCkgfHwKKyAgICAgICAgICAgICAgICAgICAgIChwX2xjaV9wcmV2LT5hb3QgPT0gQU9UX0VSX0NFTFApKSkgeworICAgICAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCcywgY29yZUZyYW1lT2Zmc2V0LCA2KTsgLyogY29yZUZyYW1lT2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzICs9IDY7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICBjYXNlIEFPVF9UV0lOX1ZROgotICAgICAgICAgICAgcF9saW5mby0+ZnJhbWVMZW5ndGhUeXBlID0gMTsKLSAgICAgICAgICAgIHRtcCA9ICggKHBfbGNpLT5iaXRzRnJhbWUrNykgPj4gMyApIC0gMjA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRyYW5zbWlzc2lvbiBmcmFtZSBsZW5ndGggaW4gYnl0ZXMgKi8KLSAgICAgICAgICAgIGlmKCAodG1wIDwgMCkgKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9UUkFOU01JU1NJT05fRlJBTUVfTEVOR1RIOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRkRLd3JpdGVCaXRzKCBoQnMsIHBfbGluZm8tPmZyYW1lTGVuZ3RoVHlwZSwgMyApOyAgICAgICAgICAvKiBmcmFtZUxlbmd0aFR5cGUgKi8KLSAgICAgICAgICAgIEZES3dyaXRlQml0cyggaEJzLCB0bXAsIDkgKTsKLSAgICAgICAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMrPTEyOwotCi0gICAgICAgICAgICBwX2xpbmZvLT5mcmFtZUxlbmd0aEJpdHMgPSAodG1wKzIwKSA8PCAzOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIEFPVF9DRUxQOgotICAgICAgICAgICAgcF9saW5mby0+ZnJhbWVMZW5ndGhUeXBlID0gNDsKLSAgICAgICAgICAgIEZES3dyaXRlQml0cyggaEJzLCBwX2xpbmZvLT5mcmFtZUxlbmd0aFR5cGUsIDMgKTsgICAgICAgICAgLyogZnJhbWVMZW5ndGhUeXBlICovCi0gICAgICAgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzKz0zOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgICAgZm9yKCBpPTA7IGk8NjI7IGkrKyApIHsKLSAgICAgICAgICAgICAgICBpZiggY2VscEZyYW1lTGVuZ3RoVGFibGVbaV0gPT0gcF9sY2ktPmJpdHNGcmFtZSApCi0gICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU9UX1RXSU5fVlE6CisgICAgICAgICAgICAgIHBfbGluZm8tPmZyYW1lTGVuZ3RoVHlwZSA9IDE7CisgICAgICAgICAgICAgIHRtcCA9ICgocF9sY2ktPmJpdHNGcmFtZSArIDcpID4+IDMpIC0KKyAgICAgICAgICAgICAgICAgICAgMjA7IC8qIHRyYW5zbWlzc2lvbiBmcmFtZSBsZW5ndGggaW4gYnl0ZXMgKi8KKyAgICAgICAgICAgICAgaWYgKCh0bXAgPCAwKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9UUkFOU01JU1NJT05fRlJBTUVfTEVOR1RIOwogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmKCBpPj02MiApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfQ0VMUF9GUkFNRV9MRU5HVEg7CisgICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQnMsIHBfbGluZm8tPmZyYW1lTGVuZ3RoVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpOyAvKiBmcmFtZUxlbmd0aFR5cGUgKi8KKyAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCcywgdG1wLCA5KTsKKyAgICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cyArPSAxMjsKKworICAgICAgICAgICAgICBwX2xpbmZvLT5mcmFtZUxlbmd0aEJpdHMgPSAodG1wICsgMjApIDw8IDM7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFPVF9DRUxQOgorICAgICAgICAgICAgICBwX2xpbmZvLT5mcmFtZUxlbmd0aFR5cGUgPSA0OworICAgICAgICAgICAgICBGREt3cml0ZUJpdHMoaEJzLCBwX2xpbmZvLT5mcmFtZUxlbmd0aFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAzKTsgLyogZnJhbWVMZW5ndGhUeXBlICovCisgICAgICAgICAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMgKz0gMzsKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2MjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICBpZiAoY2VscEZyYW1lTGVuZ3RoVGFibGVbaV0gPT0gcF9sY2ktPmJpdHNGcmFtZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpID49IDYyKSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfQ0VMUF9GUkFNRV9MRU5HVEg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCcywgaSwgNik7IC8qIENFTFBmcmFtZUxlbmd0aFRhYmVsSW5kZXggKi8KKyAgICAgICAgICAgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzICs9IDY7CiAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgcF9saW5mby0+ZnJhbWVMZW5ndGhCaXRzID0gcF9sY2ktPmJpdHNGcmFtZTsKKyAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzKCBoQnMsIGksIDYgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENFTFBmcmFtZUxlbmd0aFRhYmVsSW5kZXggKi8KLSAgICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cys9NjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfbGluZm8tPmZyYW1lTGVuZ3RoQml0cyA9IHBfbGNpLT5iaXRzRnJhbWU7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU9UX0hWWEM6CisgICAgICAgICAgICAgIHBfbGluZm8tPmZyYW1lTGVuZ3RoVHlwZSA9IDY7CisgICAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQnMsIHBfbGluZm8tPmZyYW1lTGVuZ3RoVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpOyAvKiBmcmFtZUxlbmd0aFR5cGUgKi8KKyAgICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cyArPSAzOworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGk7CiAKLSAgICAgICAgICBjYXNlIEFPVF9IVlhDOgotICAgICAgICAgICAgcF9saW5mby0+ZnJhbWVMZW5ndGhUeXBlID0gNjsKLSAgICAgICAgICAgIEZES3dyaXRlQml0cyggaEJzLCBwX2xpbmZvLT5mcmFtZUxlbmd0aFR5cGUsIDMgKTsgICAgICAgICAgLyogZnJhbWVMZW5ndGhUeXBlICovCi0gICAgICAgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzKz0zOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpbnQgaTsKLQotICAgICAgICAgICAgICBpZiggcF9sY2ktPmJpdHNGcmFtZSA9PSA0MCApIHsKLSAgICAgICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgICAgfSBlbHNlIGlmKCBwX2xjaS0+Yml0c0ZyYW1lID09IDgwICkgewotICAgICAgICAgICAgICAgIGkgPSAxOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9GUkFNRV9CSVRTOworICAgICAgICAgICAgICAgIGlmIChwX2xjaS0+Yml0c0ZyYW1lID09IDQwKSB7CisgICAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBfbGNpLT5iaXRzRnJhbWUgPT0gODApIHsKKyAgICAgICAgICAgICAgICAgIGkgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfRlJBTUVfQklUUzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCcywgaSwgMSk7IC8qIEhWWENmcmFtZUxlbmd0aFRhYmxlSW5kZXggKi8KKyAgICAgICAgICAgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzICs9IDE7CiAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgRkRLd3JpdGVCaXRzKCBoQnMsIGksIDEgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhWWENmcmFtZUxlbmd0aFRhYmxlSW5kZXggKi8KLSAgICAgICAgICAgICAgaEFzcy0+c3RyZWFtTXV4Q29uZmlnQml0cys9MTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfbGluZm8tPmZyYW1lTGVuZ3RoQml0cyA9IHBfbGNpLT5iaXRzRnJhbWU7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgcF9saW5mby0+ZnJhbWVMZW5ndGhCaXRzID0gcF9sY2ktPmJpdHNGcmFtZTsKKyAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICBjYXNlIEFPVF9OVUxMX09CSkVDVDoKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19JTlZBTElEX0FPVDsKKyAgICAgICAgICAgIGNhc2UgQU9UX05VTExfT0JKRUNUOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19JTlZBTElEX0FPVDsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKLSAgICBGREt3cml0ZUJpdHMoIGhCcywgKGhBc3MtPm90aGVyRGF0YUxlbkJ5dGVzPjApID8gMTowLCAxICk7ICAgICAgLyogb3RoZXJEYXRhUHJlc2VudCAqLwotICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMrPTE7CisgICAgRkRLd3JpdGVCaXRzKGhCcywgKGhBc3MtPm90aGVyRGF0YUxlbkJpdHMgPiAwKSA/IDEgOiAwLAorICAgICAgICAgICAgICAgICAxKTsgLyogb3RoZXJEYXRhUHJlc2VudCAqLworICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMgKz0gMTsKIAotICAgIGlmKCBoQXNzLT5vdGhlckRhdGFMZW5CeXRlcyA+IDAgKSB7Ci0KLSAgICAgIElOVCBvdGhlckRhdGFMZW5UbXAgPSBoQXNzLT5vdGhlckRhdGFMZW5CeXRlczsKLSAgICAgIElOVCBlc2NDbnQgPSAwOwotICAgICAgSU5UIG90aGVyRGF0YUxlbkVzYyA9IDE7Ci0KLSAgICAgIHdoaWxlKG90aGVyRGF0YUxlblRtcCkgewotICAgICAgICBvdGhlckRhdGFMZW5UbXAgPj49IDg7Ci0gICAgICAgIGVzY0NudCArKzsKLSAgICAgIH0KLQotICAgICAgZG8gewotICAgICAgICBvdGhlckRhdGFMZW5UbXAgPSAoaEFzcy0+b3RoZXJEYXRhTGVuQnl0ZXM+Pihlc2NDbnQqOCkpICYgMHhGRjsKLSAgICAgICAgZXNjQ250LS07Ci0gICAgICAgIG90aGVyRGF0YUxlbkVzYyA9IGVzY0NudD4wOwotCi0gICAgICAgIEZES3dyaXRlQml0cyggaEJzLCBvdGhlckRhdGFMZW5Fc2MsIDEgKTsKLSAgICAgICAgRkRLd3JpdGVCaXRzKCBoQnMsIG90aGVyRGF0YUxlblRtcCwgOCApOwotICAgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzKz05OwotICAgICAgfSB3aGlsZShvdGhlckRhdGFMZW5Fc2MpOworICAgIGlmIChoQXNzLT5vdGhlckRhdGFMZW5CaXRzID4gMCkgeworICAgICAgRkRLd3JpdGVCaXRzKGhCcywgMCwgMSk7CisgICAgICBGREt3cml0ZUJpdHMoaEJzLCBoQXNzLT5vdGhlckRhdGFMZW5CaXRzLCA4KTsKKyAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMgKz0gOTsKICAgICB9CiAKLSAgICB7Ci0gICAgICBVU0hPUlQgY3JjQ2hlY2tQcmVzZW50PTA7Ci0gICAgICBVU0hPUlQgY3JjQ2hlY2tTdW09MDsKKyAgICBGREt3cml0ZUJpdHMoaEJzLCAwLCAxKTsgLyogY3JjQ2hlY2tQcmVzZW50PTAgKi8KKyAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzICs9IDE7CiAKLSAgICAgIEZES3dyaXRlQml0cyggaEJzLCBjcmNDaGVja1ByZXNlbnQsIDEgKTsgICAgICAgICAgICAgICAvKiBjcmNDaGVja1ByZXNlbnQgKi8KLSAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMrPTE7Ci0gICAgICBpZiAoIGNyY0NoZWNrUHJlc2VudCApewotICAgICAgICBGREt3cml0ZUJpdHMoIGhCcywgY3JjQ2hlY2tTdW0sIDggKTsgICAgICAgICAgICAgICAgIC8qIGNyY0NoZWNrU3VtICovCi0gICAgICAgIGhBc3MtPnN0cmVhbU11eENvbmZpZ0JpdHMrPTg7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0gZWxzZSB7ICAvKiBpZiAoIGF1ZGlvTXV4VmVyc2lvbkEgPT0gMCApICovCisgIH0gZWxzZSB7IC8qIGlmICggYXVkaW9NdXhWZXJzaW9uQSA9PSAwICkgKi8KIAogICAgIC8qIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyAqLwotCiAgIH0KIAogICByZXR1cm4gVFJBTlNQT1JURU5DX09LOwogfQogCi0KLXN0YXRpYyBUUkFOU1BPUlRFTkNfRVJST1IKLVdyaXRlQXVQYXlsb2FkTGVuZ3RoSW5mbyggSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgaW50IEF1TGVuZ3RoQml0cyApCi17CitzdGF0aWMgVFJBTlNQT1JURU5DX0VSUk9SIFdyaXRlQXVQYXlsb2FkTGVuZ3RoSW5mbygKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBpbnQgQXVMZW5ndGhCaXRzKSB7CiAgIGludCByZXN0Qnl0ZXM7CiAKLSAgaWYoIEF1TGVuZ3RoQml0cyAlIDggKQotICAgIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9BVV9MRU5HVEg7CisgIGlmIChBdUxlbmd0aEJpdHMgJSA4KSByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfQVVfTEVOR1RIOwogCi0gIHdoaWxlKCBBdUxlbmd0aEJpdHMgPj0gMjU1KjggKSB7Ci0gICAgRkRLd3JpdGVCaXRzKCBoQml0U3RyZWFtLCAyNTUsIDggKTsgIC8qIDI1NSBzaG93cyBpbmNvbXBsZXRlIEFVICovCi0gICAgQXVMZW5ndGhCaXRzIC09ICgyNTUqOCk7CisgIHdoaWxlIChBdUxlbmd0aEJpdHMgPj0gMjU1ICogOCkgeworICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAyNTUsIDgpOyAvKiAyNTUgc2hvd3MgaW5jb21wbGV0ZSBBVSAqLworICAgIEF1TGVuZ3RoQml0cyAtPSAoMjU1ICogOCk7CiAgIH0KIAogICByZXN0Qnl0ZXMgPSAoQXVMZW5ndGhCaXRzKSA+PiAzOwotICBGREt3cml0ZUJpdHMoIGhCaXRTdHJlYW0sIHJlc3RCeXRlcywgOCApOworICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgcmVzdEJ5dGVzLCA4KTsKIAogICByZXR1cm4gVFJBTlNQT1JURU5DX09LOwogfQogCi1zdGF0aWMKLVRSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfTGF0bVNldE5yT2ZTdWJmcmFtZXMoIEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5vU3ViZnJhbWVzX25leHQpICAgIC8qIG5yIG9mIGFjY2VzcyB1bml0cyAvIHBheWxvYWRzIHdpdGhpbiBhIGxhdG0gZnJhbWUgKi8KK3N0YXRpYyBUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0xhdG1TZXROck9mU3ViZnJhbWVzKAorICAgIEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzLCBJTlQgbm9TdWJmcmFtZXNfbmV4dCkgLyogbnIgb2YgYWNjZXNzIHVuaXRzIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRzIHdpdGhpbiBhIGxhdG0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lICovCiB7CiAgIC8qIHNhbml0eSBjaGsgKi8KICAgaWYgKG5vU3ViZnJhbWVzX25leHQgPCAxIHx8IG5vU3ViZnJhbWVzX25leHQgPiBNQVhfTlJfT0ZfU1VCRlJBTUVTKSB7CkBAIC01MzgsNDggKzUxMyw1MCBAQAogCiAgIGhBc3MtPm5vU3ViZnJhbWVzX25leHQgPSBub1N1YmZyYW1lc19uZXh0OwogCi0gIC8qIGlmIGF0IHN0YXJ0IHRoZW4gd2UgY2FuIHRha2Ugb3ZlciB0aGUgdmFsdWUgaW1tZWRpYXRlbHksIG90aGVyd2lzZSB3ZSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBuZXh0IFNNQyAqLwotICBpZiAoIChoQXNzLT5zdWJGcmFtZUNudCA9PSAwKSAmJiAoaEFzcy0+bGF0bUZyYW1lQ291bnRlciA9PSAwKSApIHsKKyAgLyogaWYgYXQgc3RhcnQgdGhlbiB3ZSBjYW4gdGFrZSBvdmVyIHRoZSB2YWx1ZSBpbW1lZGlhdGVseSwgb3RoZXJ3aXNlIHdlIGhhdmUKKyAgICogdG8gd2FpdCBmb3IgdGhlIG5leHQgU01DICovCisgIGlmICgoaEFzcy0+c3ViRnJhbWVDbnQgPT0gMCkgJiYgKGhBc3MtPmxhdG1GcmFtZUNvdW50ZXIgPT0gMCkpIHsKICAgICBoQXNzLT5ub1N1YmZyYW1lcyA9IG5vU3ViZnJhbWVzX25leHQ7CiAgIH0KIAogICByZXR1cm4gVFJBTlNQT1JURU5DX09LOwogfQogCi1zdGF0aWMKLWludCBhbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nKCBIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcywgVUNIQVIgbm9Qcm9ncmFtLCBVQ0hBUiBub0xheWVyW10gLyogcmV0dXJuICovICkKLXsKK3N0YXRpYyBpbnQgYWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZyhIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcywgVUNIQVIgbm9Qcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIG5vTGF5ZXJbXSAvKiByZXR1cm4gKi8pIHsKICAgaW50IHByb2csIGxheWVyOwogCi0gIHNpZ25lZCBpbnQgbGFzdE5vU2FtcGxlcyAgID0gLTE7CisgIHNpZ25lZCBpbnQgbGFzdE5vU2FtcGxlcyA9IC0xOwogICBzaWduZWQgaW50IG1pbkZyYW1lU2FtcGxlcyA9IEZES19JTlRfTUFYOwogICBzaWduZWQgaW50IG1heEZyYW1lU2FtcGxlcyA9IDA7CiAKICAgc2lnbmVkIGludCBoaWdoZXN0U2FtcGxpbmdSYXRlID0gLTE7CiAKLSAgZm9yKCBwcm9nPTA7IHByb2c8bm9Qcm9ncmFtOyBwcm9nKysgKSB7CisgIGZvciAocHJvZyA9IDA7IHByb2cgPCBub1Byb2dyYW07IHByb2crKykgewogICAgIG5vTGF5ZXJbcHJvZ10gPSAwOwogCi0gICAgZm9yKCBsYXllcj0wOyBsYXllcjxMQVRNX01BWF9MQVlFUlM7IGxheWVyKysgKQotICAgIHsKLSAgICAgIGlmKCBoQXNzLT5jb25maWdbcHJvZ11bbGF5ZXJdICE9IE5VTEwgKQotICAgICAgeworICAgIGZvciAobGF5ZXIgPSAwOyBsYXllciA8IExBVE1fTUFYX0xBWUVSUzsgbGF5ZXIrKykgeworICAgICAgaWYgKGhBc3MtPmNvbmZpZ1twcm9nXVtsYXllcl0gIT0gTlVMTCkgewogICAgICAgICBJTlQgaHNmU2FtcGxlc0ZyYW1lOwogCiAgICAgICAgIG5vTGF5ZXJbcHJvZ10rKzsKIAotICAgICAgICBpZiggaGlnaGVzdFNhbXBsaW5nUmF0ZSA8IDAgKQorICAgICAgICBpZiAoaGlnaGVzdFNhbXBsaW5nUmF0ZSA8IDApCiAgICAgICAgICAgaGlnaGVzdFNhbXBsaW5nUmF0ZSA9IGhBc3MtPmNvbmZpZ1twcm9nXVtsYXllcl0tPnNhbXBsaW5nUmF0ZTsKIAotICAgICAgICBoc2ZTYW1wbGVzRnJhbWUgPSBoQXNzLT5jb25maWdbcHJvZ11bbGF5ZXJdLT5zYW1wbGVzUGVyRnJhbWUgICogaGlnaGVzdFNhbXBsaW5nUmF0ZSAvIGhBc3MtPmNvbmZpZ1twcm9nXVtsYXllcl0tPnNhbXBsaW5nUmF0ZTsKKyAgICAgICAgaHNmU2FtcGxlc0ZyYW1lID0gaEFzcy0+Y29uZmlnW3Byb2ddW2xheWVyXS0+c2FtcGxlc1BlckZyYW1lICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGVzdFNhbXBsaW5nUmF0ZSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhBc3MtPmNvbmZpZ1twcm9nXVtsYXllcl0tPnNhbXBsaW5nUmF0ZTsKIAotICAgICAgICBpZiggaHNmU2FtcGxlc0ZyYW1lIDw9IG1pbkZyYW1lU2FtcGxlcyApIG1pbkZyYW1lU2FtcGxlcyA9IGhzZlNhbXBsZXNGcmFtZTsKLSAgICAgICAgaWYoIGhzZlNhbXBsZXNGcmFtZSA+PSBtYXhGcmFtZVNhbXBsZXMgKSBtYXhGcmFtZVNhbXBsZXMgPSBoc2ZTYW1wbGVzRnJhbWU7CisgICAgICAgIGlmIChoc2ZTYW1wbGVzRnJhbWUgPD0gbWluRnJhbWVTYW1wbGVzKQorICAgICAgICAgIG1pbkZyYW1lU2FtcGxlcyA9IGhzZlNhbXBsZXNGcmFtZTsKKyAgICAgICAgaWYgKGhzZlNhbXBsZXNGcmFtZSA+PSBtYXhGcmFtZVNhbXBsZXMpCisgICAgICAgICAgbWF4RnJhbWVTYW1wbGVzID0gaHNmU2FtcGxlc0ZyYW1lOwogCi0gICAgICAgIGlmKCBsYXN0Tm9TYW1wbGVzID09IC0xICkgewotICAgICAgICAgIGxhc3ROb1NhbXBsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaHNmU2FtcGxlc0ZyYW1lOworICAgICAgICBpZiAobGFzdE5vU2FtcGxlcyA9PSAtMSkgeworICAgICAgICAgIGxhc3ROb1NhbXBsZXMgPSBoc2ZTYW1wbGVzRnJhbWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYoIGhzZlNhbXBsZXNGcmFtZSAhPSBsYXN0Tm9TYW1wbGVzICkgeworICAgICAgICAgIGlmIChoc2ZTYW1wbGVzRnJhbWUgIT0gbGFzdE5vU2FtcGxlcykgewogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01OTMsMTggKzU3MCwxNCBAQAogLyoqCiAgKiBJbml0aWFsaXplIExBVE0vTE9BUyBTdHJlYW0gYW5kIGFkZCBsYXllciAwIGF0IHByb2dyYW0gMC4KICAqLwotc3RhdGljCi1UUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0luaXRMYXRtU3RyZWFtKCBIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBmcmFjdERlbGF5UHJlc2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBpbnQgICAgICAgICBtdXhDb25maWdQZXJpb2QsIC8qIGluc2VydCBzZXR1cCBkYXRhIGV2ZXJ5IG11eENvbmZpZ1BlcmlvZCBmcmFtZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICBhdWRpb011eFZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPUlRfVFlQRSAgICAgdHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CitzdGF0aWMgVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19Jbml0TGF0bVN0cmVhbSgKKyAgICBIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcywgaW50IGZyYWN0RGVsYXlQcmVzZW50LAorICAgIHNpZ25lZCBpbnQKKyAgICAgICAgbXV4Q29uZmlnUGVyaW9kLCAvKiBpbnNlcnQgc2V0dXAgZGF0YSBldmVyeSBtdXhDb25maWdQZXJpb2QgZnJhbWVzICovCisgICAgVUlOVCBhdWRpb011eFZlcnNpb24sIFRSQU5TUE9SVF9UWVBFIHR0KSB7CiAgIFRSQU5TUE9SVEVOQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVEVOQ19PSzsKIAotICBpZiAoaEFzcyA9PSBOVUxMKQotICAgIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9QQVJBTUVURVI7CisgIGlmIChoQXNzID09IE5VTEwpIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9QQVJBTUVURVI7CiAKICAgaEFzcy0+dHQgPSB0dDsKIApAQCAtNjEzLDgyICs1ODYsNzggQEAKICAgaEFzcy0+YXVkaW9NdXhWZXJzaW9uID0gYXVkaW9NdXhWZXJzaW9uOwogCiAgIC8qIEZpbGwgbm9MYXllciBhcnJheSB1c2luZyBoQXNzLT5jb25maWcgKi8KLSAgaEFzcy0+YWxsU3RyZWFtc1NhbWVUaW1lRnJhbWluZyA9IGFsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcoIGhBc3MsIGhBc3MtPm5vUHJvZ3JhbSwgaEFzcy0+bm9MYXllciApOworICBoQXNzLT5hbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nID0KKyAgICAgIGFsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcoaEFzcywgaEFzcy0+bm9Qcm9ncmFtLCBoQXNzLT5ub0xheWVyKTsKICAgLyogT25seSBhbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nPT0xIGlzIHN1cHBvcnRlZCAqLwogICBGREtfQVNTRVJUKGhBc3MtPmFsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcpOwogCiAgIGhBc3MtPmZyYWN0RGVsYXlQcmVzZW50ID0gZnJhY3REZWxheVByZXNlbnQ7Ci0gIGhBc3MtPm90aGVyRGF0YUxlbkJ5dGVzID0gMDsKKyAgaEFzcy0+b3RoZXJEYXRhTGVuQml0cyA9IDA7CiAKICAgaEFzcy0+dmFyTW9kZSA9IExBVE1WQVJfU0lNUExFX1NFUVVFTkNFOwogCiAgIC8qIGluaXRpYWxpemUgY291bnRlcnMgKi8KLSAgaEFzcy0+c3ViRnJhbWVDbnQgICAgICAgICAgICAgICAgICA9IDA7Ci0gIGhBc3MtPm5vU3ViZnJhbWVzICAgICAgICAgICAgICAgICAgPSBERUZBVUxUX0xBVE1fTlJfT0ZfU1VCRlJBTUVTOwotICBoQXNzLT5ub1N1YmZyYW1lc19uZXh0ICAgICAgICAgICAgID0gREVGQVVMVF9MQVRNX05SX09GX1NVQkZSQU1FUzsKKyAgaEFzcy0+c3ViRnJhbWVDbnQgPSAwOworICBoQXNzLT5ub1N1YmZyYW1lcyA9IERFRkFVTFRfTEFUTV9OUl9PRl9TVUJGUkFNRVM7CisgIGhBc3MtPm5vU3ViZnJhbWVzX25leHQgPSBERUZBVUxUX0xBVE1fTlJfT0ZfU1VCRlJBTUVTOwogCiAgIC8qIHN5bmMgbGF5ZXIgcmVsYXRlZCAqLwotICBoQXNzLT5hdWRpb011eExlbmd0aEJ5dGVzICAgICA9IDA7CisgIGhBc3MtPmF1ZGlvTXV4TGVuZ3RoQnl0ZXMgPSAwOwogCi0gIGhBc3MtPmxhdG1GcmFtZUNvdW50ZXIgICAgICAgID0gMDsKKyAgaEFzcy0+bGF0bUZyYW1lQ291bnRlciA9IDA7CiAgIGhBc3MtPm11eENvbmZpZ1BlcmlvZCA9IG11eENvbmZpZ1BlcmlvZDsKIAogICByZXR1cm4gRXJyb3JTdGF0dXM7CiB9CiAKLQogLyoqCiAgKgogICovCi1VSU5UIHRyYW5zcG9ydEVuY19MYXRtQ291bnRUb3RhbEJpdERlbWFuZEhlYWRlciAoIEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzICwgdW5zaWduZWQgaW50IHN0cmVhbURhdGFMZW5ndGggKQoteworVUlOVCB0cmFuc3BvcnRFbmNfTGF0bUNvdW50VG90YWxCaXREZW1hbmRIZWFkZXIoSEFORExFX0xBVE1fU1RSRUFNIGhBc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3RyZWFtRGF0YUxlbmd0aCkgewogICBVSU5UIGJpdERlbWFuZCA9IDA7CiAKICAgc3dpdGNoIChoQXNzLT50dCkgewotICBjYXNlIFRUX01QNF9MT0FTOgotICBjYXNlIFRUX01QNF9MQVRNX01DUDA6Ci0gIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKLSAgICBpZiAoaEFzcy0+c3ViRnJhbWVDbnQgPT0gMCkgewotICAgICAgYml0RGVtYW5kICA9IHRyYW5zcG9ydEVuY19MYXRtQ291bnRGaXhCaXREZW1hbmRIZWFkZXIgKCBoQXNzICk7Ci0gICAgfQotICAgIGJpdERlbWFuZCArPSB0cmFuc3BvcnRFbmNfTGF0bUNvdW50VmFyQml0RGVtYW5kSGVhZGVyICggaEFzcyAsIHN0cmVhbURhdGFMZW5ndGggLyotIGJpdERlbWFuZCovKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBicmVhazsKKyAgICBjYXNlIFRUX01QNF9MT0FTOgorICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMDoKKyAgICBjYXNlIFRUX01QNF9MQVRNX01DUDE6CisgICAgICBpZiAoaEFzcy0+c3ViRnJhbWVDbnQgPT0gMCkgeworICAgICAgICBiaXREZW1hbmQgPSB0cmFuc3BvcnRFbmNfTGF0bUNvdW50Rml4Qml0RGVtYW5kSGVhZGVyKGhBc3MpOworICAgICAgfQorICAgICAgYml0RGVtYW5kICs9IHRyYW5zcG9ydEVuY19MYXRtQ291bnRWYXJCaXREZW1hbmRIZWFkZXIoCisgICAgICAgICAgaEFzcywgc3RyZWFtRGF0YUxlbmd0aCAvKi0gYml0RGVtYW5kKi8pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOwogICB9CiAKICAgcmV0dXJuIGJpdERlbWFuZDsKIH0KIAotc3RhdGljIFRSQU5TUE9SVEVOQ19FUlJPUgotQWR2YW5jZUF1ZGlvTXV4RWxlbWVudCAoCi0gICAgICAgIEhBTkRMRV9MQVRNX1NUUkVBTSAgIGhBc3MsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgYXVCaXRzLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBidWZmZXJGdWxsbmVzcywKLSAgICAgICAgQ1NUcENhbGxCYWNrcyAgICAqY2IKLSAgICAgICAgKQoteworc3RhdGljIFRSQU5TUE9SVEVOQ19FUlJPUiBBZHZhbmNlQXVkaW9NdXhFbGVtZW50KEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVCaXRzLCBpbnQgYnVmZmVyRnVsbG5lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NUcENhbGxCYWNrcyAqY2IpIHsKICAgVFJBTlNQT1JURU5DX0VSUk9SIEVycm9yU3RhdHVzID0gVFJBTlNQT1JURU5DX09LOwogICBpbnQgaW5zZXJ0TXV4U2V0dXA7CiAKICAgLyogSW5zZXJ0IHNldHVwIGRhdGEgdG8gYXNzZW1ibGUgQnVmZmVyICovCi0gIGlmIChoQXNzLT5zdWJGcmFtZUNudCA9PSAwKQotICB7CisgIGlmIChoQXNzLT5zdWJGcmFtZUNudCA9PSAwKSB7CiAgICAgaWYgKGhBc3MtPm11eENvbmZpZ1BlcmlvZCA+IDApIHsKICAgICAgIGluc2VydE11eFNldHVwID0gKGhBc3MtPmxhdG1GcmFtZUNvdW50ZXIgPT0gMCk7Ci0gICAgfSBlbHNlICB7CisgICAgfSBlbHNlIHsKICAgICAgIGluc2VydE11eFNldHVwID0gMDsKICAgICB9CiAKICAgICBpZiAoaEFzcy0+dHQgIT0gVFRfTVA0X0xBVE1fTUNQMCkgewotICAgICAgaWYoIGluc2VydE11eFNldHVwICkgewotICAgICAgICBGREt3cml0ZUJpdHMoIGhCcywgMCwgMSApOyAgLyogdXNlU2FtZVN0cmVhbU11eCB1c2VOZXdTdHJlYW1NdXggKi8KLSAgICAgICAgQ3JlYXRlU3RyZWFtTXV4Q29uZmlnKGhBc3MsIGhCcywgYnVmZmVyRnVsbG5lc3MsIGNiKTsKLSAgICAgICAgaWYgKEVycm9yU3RhdHVzICE9IFRSQU5TUE9SVEVOQ19PSykKKyAgICAgIGlmIChpbnNlcnRNdXhTZXR1cCkgeworICAgICAgICBGREt3cml0ZUJpdHMoaEJzLCAwLCAxKTsgLyogdXNlU2FtZVN0cmVhbU11eCB1c2VOZXdTdHJlYW1NdXggKi8KKyAgICAgICAgaWYgKFRSQU5TUE9SVEVOQ19PSyAhPSAoRXJyb3JTdGF0dXMgPSBDcmVhdGVTdHJlYW1NdXhDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQXNzLCBoQnMsIGJ1ZmZlckZ1bGxuZXNzLCBjYikpKSB7CiAgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOworICAgICAgICB9CiAgICAgICB9IGVsc2UgewotICAgICAgICBGREt3cml0ZUJpdHMoIGhCcywgMSwgMSApOyAgIC8qIHVzZVNhbWVTdHJlYW1NdXggKi8KKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCcywgMSwgMSk7IC8qIHVzZVNhbWVTdHJlYW1NdXggKi8KICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTY5OSw5ICs2NjgsOCBAQAogCiAgICAgZm9yIChwcm9nID0gMDsgcHJvZyA8IGhBc3MtPm5vUHJvZ3JhbTsgcHJvZysrKSB7CiAgICAgICBmb3IgKGxheWVyID0gMDsgbGF5ZXIgPCBoQXNzLT5ub0xheWVyW3Byb2ddOyBsYXllcisrKSB7Ci0gICAgICAgIEVycm9yU3RhdHVzID0gV3JpdGVBdVBheWxvYWRMZW5ndGhJbmZvKCBoQnMsIGF1Qml0cyApOwotICAgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gVFJBTlNQT1JURU5DX09LKQotICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKKyAgICAgICAgRXJyb3JTdGF0dXMgPSBXcml0ZUF1UGF5bG9hZExlbmd0aEluZm8oaEJzLCBhdUJpdHMpOworICAgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gVFJBTlNQT1JURU5DX09LKSByZXR1cm4gRXJyb3JTdGF0dXM7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC03MTEsMTQgKzY3OSw4IEBACiB9CiAKIFRSQU5TUE9SVEVOQ19FUlJPUgotdHJhbnNwb3J0RW5jX0xhdG1Xcml0ZSAoCi0gICAgICAgIEhBTkRMRV9MQVRNX1NUUkVBTSAgICBoQXNzLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJzLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgYXVCaXRzLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgYnVmZmVyRnVsbG5lc3MsCi0gICAgICAgIENTVHBDYWxsQmFja3MgICAgICpjYgotICAgICAgICApCi17Cit0cmFuc3BvcnRFbmNfTGF0bVdyaXRlKEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBhdUJpdHMsIGludCBidWZmZXJGdWxsbmVzcywgQ1NUcENhbGxCYWNrcyAqY2IpIHsKICAgVFJBTlNQT1JURU5DX0VSUk9SIEVycm9yU3RhdHVzOwogCiAgIGlmIChoQXNzLT5zdWJGcmFtZUNudCA9PSAwKSB7CkBAIC03MzIsODEgKzY5NCw3NiBAQAogICAgICAtIG9ubHkgaWYgbG9hcwogICAgICAtIHdlIG11c3QgdXBkYXRlIHRoZSBzeW5jd29yZCBkaXN0YW5jZSAoPWF1ZGlvbXV4bGVuZ3RoYnl0ZXMpIGxhdGVyCiAgICAqLwotICBpZiggaEFzcy0+dHQgPT0gVFRfTVA0X0xPQVMgJiYgaEFzcy0+c3ViRnJhbWVDbnQgPT0gMCkKLSAgeworICBpZiAoaEFzcy0+dHQgPT0gVFRfTVA0X0xPQVMgJiYgaEFzcy0+c3ViRnJhbWVDbnQgPT0gMCkgewogICAgIC8qIFN0YXJ0IG5ldyBMT0FTIGZyYW1lICovCi0gICAgRkRLd3JpdGVCaXRzKCBoQnMsIDB4MkI3LCAxMSApOworICAgIEZES3dyaXRlQml0cyhoQnMsIDB4MkI3LCAxMSk7CiAgICAgaEFzcy0+YXVkaW9NdXhMZW5ndGhCeXRlcyA9IDA7Ci0gICAgaEFzcy0+YXVkaW9NdXhMZW5ndGhCeXRlc1BvcyA9IEZES2dldFZhbGlkQml0cyggaEJzICk7ICAvKiBzdG9yZSByZWFkIHBvaW50ZXIgcG9zaXRpb24gKi8KLSAgICBGREt3cml0ZUJpdHMoIGhCcywgaEFzcy0+YXVkaW9NdXhMZW5ndGhCeXRlcywgMTMgKTsKKyAgICBoQXNzLT5hdWRpb011eExlbmd0aEJ5dGVzUG9zID0KKyAgICAgICAgRkRLZ2V0VmFsaWRCaXRzKGhCcyk7IC8qIHN0b3JlIHJlYWQgcG9pbnRlciBwb3NpdGlvbiAqLworICAgIEZES3dyaXRlQml0cyhoQnMsIGhBc3MtPmF1ZGlvTXV4TGVuZ3RoQnl0ZXMsIDEzKTsKICAgfQogCi0gIEVycm9yU3RhdHVzID0gQWR2YW5jZUF1ZGlvTXV4RWxlbWVudCgKLSAgICAgICAgICBoQXNzLAotICAgICAgICAgIGhCcywKLSAgICAgICAgICBhdUJpdHMsCi0gICAgICAgICAgYnVmZmVyRnVsbG5lc3MsCi0gICAgICAgICAgY2IKLSAgICAgICAgICApOworICBFcnJvclN0YXR1cyA9IEFkdmFuY2VBdWRpb011eEVsZW1lbnQoaEFzcywgaEJzLCBhdUJpdHMsIGJ1ZmZlckZ1bGxuZXNzLCBjYik7CiAKLSAgaWYgKEVycm9yU3RhdHVzICE9IFRSQU5TUE9SVEVOQ19PSykKLSAgICByZXR1cm4gRXJyb3JTdGF0dXM7CisgIGlmIChFcnJvclN0YXR1cyAhPSBUUkFOU1BPUlRFTkNfT0spIHJldHVybiBFcnJvclN0YXR1czsKIAogICByZXR1cm4gRXJyb3JTdGF0dXM7CiB9CiAKLXZvaWQgdHJhbnNwb3J0RW5jX0xhdG1BZGp1c3RTdWJmcmFtZUJpdHMoSEFORExFX0xBVE1fU1RSRUFNICAgIGhBc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICpiaXRzKQotewordm9pZCB0cmFuc3BvcnRFbmNfTGF0bUFkanVzdFN1YmZyYW1lQml0cyhIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcywgaW50ICpiaXRzKSB7CiAgIC8qIFN1YnN0cmFjdCBiaXRzIGZyb20gcG9zc2libGUgcHJldmlvdXMgc3ViZnJhbWUgKi8KICAgKmJpdHMgLT0gaEFzcy0+bGF0bVN1YmZyYW1lU3RhcnQ7CiAgIC8qIEFkZCBmaWxsIGJpdHMgKi8KLSAgaWYgKGhBc3MtPnN1YkZyYW1lQ250ID09IDApCisgIGlmIChoQXNzLT5zdWJGcmFtZUNudCA9PSAwKSB7CisgICAgKmJpdHMgKz0gaEFzcy0+b3RoZXJEYXRhTGVuQml0czsKICAgICAqYml0cyArPSBoQXNzLT5maWxsQml0czsKKyAgfQogfQogCi0KLXZvaWQgdHJhbnNwb3J0RW5jX0xhdG1HZXRGcmFtZShIQU5ETEVfTEFUTV9TVFJFQU0gICAgaEFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICpieXRlcykKLXsKK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfTGF0bUdldEZyYW1lKEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwQnl0ZXMpIHsKKyAgVFJBTlNQT1JURU5DX0VSUk9SIEVycm9yU3RhdHVzID0gVFJBTlNQT1JURU5DX09LOwogCiAgIGhBc3MtPnN1YkZyYW1lQ250Kys7Ci0gIGlmIChoQXNzLT5zdWJGcmFtZUNudCA+PSBoQXNzLT5ub1N1YmZyYW1lcykKLSAgewotCisgIGlmIChoQXNzLT5zdWJGcmFtZUNudCA+PSBoQXNzLT5ub1N1YmZyYW1lcykgewogICAgIC8qIEFkZCBMT0FTIGZyYW1lIGxlbmd0aCBpZiByZXF1aXJlZC4gKi8KLSAgICBpZiAoaEFzcy0+dHQgPT0gVFRfTVA0X0xPQVMpCi0gICAgewotICAgICAgaW50IGxhdG1CeXRlczsKKyAgICBpZiAoaEFzcy0+dHQgPT0gVFRfTVA0X0xPQVMpIHsKKyAgICAgIEZES19CSVRTVFJFQU0gdG1wQnVmOwogCi0gICAgICBsYXRtQnl0ZXMgPSAoRkRLZ2V0VmFsaWRCaXRzKGhCcykrNykgPj4gMzsKKyAgICAgIC8qIERldGVybWluZSBmcmFtZSBsZW5ndGggaW5mbyAqLworICAgICAgaEFzcy0+YXVkaW9NdXhMZW5ndGhCeXRlcyA9CisgICAgICAgICAgKChGREtnZXRWYWxpZEJpdHMoaEJzKSArIGhBc3MtPm90aGVyRGF0YUxlbkJpdHMgKyA3KSA+PiAzKSAtCisgICAgICAgICAgMzsgLyogMz1TeW5jd29yZCArIGxlbmd0aCAqLwogCi0gICAgICAvKiB3cml0ZSBsZW5ndGggaW5mbyBpbnRvIGFzc2VtYmxlciBidWZmZXIgKi8KLSAgICAgIGhBc3MtPmF1ZGlvTXV4TGVuZ3RoQnl0ZXMgPSBsYXRtQnl0ZXMgLSAzOyAvKiAzPVN5bmN3b3JkICsgbGVuZ3RoICovCi0gICAgICB7Ci0gICAgICAgIEZES19CSVRTVFJFQU0gdG1wQnVmOwotCi0gICAgICAgIEZES2luaXRCaXRTdHJlYW0oICZ0bXBCdWYsIGhCcy0+aEJpdEJ1Zi5CdWZmZXIsIGhCcy0+aEJpdEJ1Zi5idWZTaXplLCAwLCBCU19XUklURVIgKSA7Ci0gICAgICAgIEZES3B1c2hGb3IoICZ0bXBCdWYsIGhBc3MtPmF1ZGlvTXV4TGVuZ3RoQnl0ZXNQb3MgKTsKLSAgICAgICAgRkRLd3JpdGVCaXRzKCAmdG1wQnVmLCBoQXNzLT5hdWRpb011eExlbmd0aEJ5dGVzLCAxMyApOwotICAgICAgICBGREtzeW5jQ2FjaGUoICZ0bXBCdWYgKTsKKyAgICAgIC8qIENoZWNrIGZyYW1lIGxlbmd0aCBpbmZvICovCisgICAgICBpZiAoaEFzcy0+YXVkaW9NdXhMZW5ndGhCeXRlcyA+PSAoMSA8PCAxMykpIHsKKyAgICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRFTkNfSU5WQUxJRF9BVV9MRU5HVEg7CisgICAgICAgIGdvdG8gYmFpbDsKICAgICAgIH0KKworICAgICAgLyogV3JpdGUgbGVuZ3RoIGluZm8gaW50byBhc3NlbWJsZXIgYnVmZmVyICovCisgICAgICBGREtpbml0Qml0U3RyZWFtKCZ0bXBCdWYsIGhCcy0+aEJpdEJ1Zi5CdWZmZXIsIGhCcy0+aEJpdEJ1Zi5idWZTaXplLCAwLAorICAgICAgICAgICAgICAgICAgICAgICBCU19XUklURVIpOworICAgICAgRkRLcHVzaEZvcigmdG1wQnVmLCBoQXNzLT5hdWRpb011eExlbmd0aEJ5dGVzUG9zKTsKKyAgICAgIEZES3dyaXRlQml0cygmdG1wQnVmLCBoQXNzLT5hdWRpb011eExlbmd0aEJ5dGVzLCAxMyk7CisgICAgICBGREtzeW5jQ2FjaGUoJnRtcEJ1Zik7CiAgICAgfQogCisgICAgLyogV3JpdGUgQXVkaW9NdXhFbGVtZW50IG90aGVyIGRhdGEgYml0cyAqLworICAgIEZES3dyaXRlQml0cyhoQnMsIDAsIGhBc3MtPm90aGVyRGF0YUxlbkJpdHMpOworCiAgICAgLyogV3JpdGUgQXVkaW9NdXhFbGVtZW50IGJ5dGUgYWxpZ25tZW50IGZpbGwgYml0cyAqLwogICAgIEZES3dyaXRlQml0cyhoQnMsIDAsIGhBc3MtPmZpbGxCaXRzKTsKIAotICAgIEZES19BU1NFUlQoIChGREtnZXRWYWxpZEJpdHMoaEJzKSAlIDgpID09IDApOworICAgIEZES19BU1NFUlQoKEZES2dldFZhbGlkQml0cyhoQnMpICUgOCkgPT0gMCk7CiAKICAgICBoQXNzLT5zdWJGcmFtZUNudCA9IDA7CiAKICAgICBGREtzeW5jQ2FjaGUoaEJzKTsKLSAgICAqYnl0ZXMgPSAoRkRLZ2V0VmFsaWRCaXRzKGhCcykgKyA3KT4+MzsKLSAgICAvL0ZES2ZldGNoQnVmZmVyKGhCcywgYnVmZmVyLCAoVUlOVCopYnl0ZXMpOworICAgICpwQnl0ZXMgPSAoRkRLZ2V0VmFsaWRCaXRzKGhCcykgKyA3KSA+PiAzOwogCi0gICAgaWYgKGhBc3MtPm11eENvbmZpZ1BlcmlvZCA+IDApCi0gICAgeworICAgIGlmIChoQXNzLT5tdXhDb25maWdQZXJpb2QgPiAwKSB7CiAgICAgICBoQXNzLT5sYXRtRnJhbWVDb3VudGVyKys7CiAKICAgICAgIGlmIChoQXNzLT5sYXRtRnJhbWVDb3VudGVyID49IGhBc3MtPm11eENvbmZpZ1BlcmlvZCkgewpAQCAtODE2LDMyICs3NzMsMzIgQEAKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgLyogTm8gZGF0YSB0aGlzIHRpbWUgKi8KLSAgICAqYnl0ZXMgPSAwOworICAgICpwQnl0ZXMgPSAwOwogICB9CisKK2JhaWw6CisgIHJldHVybiBFcnJvclN0YXR1czsKIH0KIAogLyoqCiAgKiBJbml0IExBVE0vTE9BUwogICovCi1UUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0xhdG1fSW5pdCgKLSAgICAgICAgSEFORExFX0xBVE1fU1RSRUFNICBoQXNzLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIENPREVSX0NPTkZJRyAgKmxheWVyQ29uZmlnLAotICAgICAgICBVSU5UIGF1ZGlvTXV4VmVyc2lvbiwKLSAgICAgICAgVFJBTlNQT1JUX1RZUEUgdHQsCi0gICAgICAgIENTVHBDYWxsQmFja3MgKmNiCi0gICAgICAgICkKLXsKK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfTGF0bV9Jbml0KEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERVJfQ09ORklHICpsYXllckNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYXVkaW9NdXhWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1JUX1RZUEUgdHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1RwQ2FsbEJhY2tzICpjYikgewogICBUUkFOU1BPUlRFTkNfRVJST1IgRXJyb3JTdGF0dXM7CiAgIGludCBmcmFjdERlbGF5UHJlc2VudCA9IDA7CiAgIGludCBwcm9nLCBsYXllcjsKIAogICBpbnQgc2V0dXBEYXRhRGlzdGFuY2VGcmFtZXMgPSBsYXllckNvbmZpZy0+aGVhZGVyUGVyaW9kOwogCi0gIEZES19BU1NFUlQoc2V0dXBEYXRhRGlzdGFuY2VGcmFtZXM+PTApOworICBGREtfQVNTRVJUKHNldHVwRGF0YURpc3RhbmNlRnJhbWVzID49IDApOwogCi0gIGZvciAocHJvZz0wOyBwcm9nPExBVE1fTUFYX1BST0dSQU1TOyBwcm9nKyspIHsKLSAgICBmb3IgKGxheWVyPTA7IGxheWVyPExBVE1fTUFYX0xBWUVSUzsgbGF5ZXIrKykgeworICBmb3IgKHByb2cgPSAwOyBwcm9nIDwgTEFUTV9NQVhfUFJPR1JBTVM7IHByb2crKykgeworICAgIGZvciAobGF5ZXIgPSAwOyBsYXllciA8IExBVE1fTUFYX0xBWUVSUzsgbGF5ZXIrKykgewogICAgICAgaEFzcy0+Y29uZmlnW3Byb2ddW2xheWVyXSA9IE5VTEw7CiAgICAgICBoQXNzLT5tX2xpbmZvW3Byb2ddW2xheWVyXS5zdHJlYW1JRCA9IC0xOwogICAgIH0KQEAgLTg1MCwzMiArODA3LDQ0IEBACiAgIGhBc3MtPmNvbmZpZ1swXVswXSA9IGxheWVyQ29uZmlnOwogICBoQXNzLT5tX2xpbmZvWzBdWzBdLnN0cmVhbUlEID0gMDsKIAotICBFcnJvclN0YXR1cyA9IHRyYW5zcG9ydEVuY19Jbml0TGF0bVN0cmVhbSggaEFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWN0RGVsYXlQcmVzZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXBEYXRhRGlzdGFuY2VGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9NdXhWZXJzaW9uKT8xOjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgaWYgKEVycm9yU3RhdHVzICE9IFRSQU5TUE9SVEVOQ19PSykKLSAgICBnb3RvIGJhaWw7CisgIEVycm9yU3RhdHVzID0gdHJhbnNwb3J0RW5jX0luaXRMYXRtU3RyZWFtKGhBc3MsIGZyYWN0RGVsYXlQcmVzZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cERhdGFEaXN0YW5jZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvTXV4VmVyc2lvbikgPyAxIDogMCwgdHQpOworICBpZiAoRXJyb3JTdGF0dXMgIT0gVFJBTlNQT1JURU5DX09LKSBnb3RvIGJhaWw7CiAKLSAgRXJyb3JTdGF0dXMgPSB0cmFuc3BvcnRFbmNfTGF0bVNldE5yT2ZTdWJmcmFtZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJDb25maWctPm5TdWJGcmFtZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgaWYgKEVycm9yU3RhdHVzICE9IFRSQU5TUE9SVEVOQ19PSykKLSAgICBnb3RvIGJhaWw7CisgIEVycm9yU3RhdHVzID0KKyAgICAgIHRyYW5zcG9ydEVuY19MYXRtU2V0TnJPZlN1YmZyYW1lcyhoQXNzLCBsYXllckNvbmZpZy0+blN1YkZyYW1lcyk7CisgIGlmIChFcnJvclN0YXR1cyAhPSBUUkFOU1BPUlRFTkNfT0spIGdvdG8gYmFpbDsKIAogICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIFN0cmVhbU11eENvbmZpZyBzb21laG93ICovCi0gIEFkdmFuY2VBdWRpb011eEVsZW1lbnQoaEFzcywgaEJzLCAwLCAwLCBjYik7Ci0gIC8vQ3JlYXRlU3RyZWFtTXV4Q29uZmlnKGhBc3MsIGhCcywgMCk7CisgIGlmIChUUkFOU1BPUlRFTkNfT0sgIT0KKyAgICAgIChFcnJvclN0YXR1cyA9IEFkdmFuY2VBdWRpb011eEVsZW1lbnQoaEFzcywgaEJzLCAwLCAwLCBjYikpKSB7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLy8gQ3JlYXRlU3RyZWFtTXV4Q29uZmlnKGhBc3MsIGhCcywgMCk7CiAKIGJhaWw6CiAgIHJldHVybiBFcnJvclN0YXR1czsKIH0KIAorVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19MYXRtQWRkT3RoZXJEYXRhQml0cyhIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG90aGVyRGF0YUJpdHMpIHsKKyAgVFJBTlNQT1JURU5DX0VSUk9SIEVycm9yU3RhdHVzID0gVFJBTlNQT1JURU5DX09LOwogCisgIGlmICgoaEFzcy0+b3RoZXJEYXRhTGVuQml0cyAhPSAwKSB8fCAob3RoZXJEYXRhQml0cyAlIDggIT0gMCkpIHsKKyAgICAvKiBUaGlzIGltcGxlbWVudGF0aW9uIGFsbG93cyB0byBhZGQgb3RoZXIgZGF0YSBiaXRzIG9ubHkgb25jZS4KKyAgICAgICBUbyBrZWVwIGV4aXN0aW5nIGFsaWdubWVudCBvbmx5IHdob2xlIGJ5dGVzIGFyZSBhbGxvd2VkLiAqLworICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JURU5DX1VOS09XTl9FUlJPUjsKKyAgfSBlbHNlIHsKKyAgICAvKiBFbnN1cmUgY29ycmVjdCBhZGRpb25hbCBiaXRzIGluIHBheWxvYWQuICovCisgICAgaWYgKGhBc3MtPnR0ID09IFRUX01QNF9MQVRNX01DUDApIHsKKyAgICAgIGhBc3MtPm90aGVyRGF0YUxlbkJpdHMgPSBvdGhlckRhdGFCaXRzOworICAgIH0gZWxzZSB7CisgICAgICBoQXNzLT5vdGhlckRhdGFMZW5CaXRzID0gb3RoZXJEYXRhQml0cyAtIDk7CisgICAgICBoQXNzLT5zdHJlYW1NdXhDb25maWdCaXRzICs9IDk7CisgICAgfQorICB9CiAKLQotCi0KKyAgcmV0dXJuIEVycm9yU3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19sYXRtLmggYi9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2xhdG0uaAppbmRleCAzNGVlYTU4Li5kNjUwMzU3IDEwMDY0NAotLS0gYS9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2xhdG0uaAorKysgYi9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2xhdG0uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzNSArOTAsMzUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqIE1QRUcgdHJhbnNwb3J0IGZvcm1hdCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKKwogICAgRGVzY3JpcHRpb246CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgVFBFTkNfTEFUTV9ICiAjZGVmaW5lIFRQRU5DX0xBVE1fSAogCi0KLQogI2luY2x1ZGUgInRwZW5jX2xpYi5oIgogI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKIAotCiAjZGVmaW5lIERFRkFVTFRfTEFUTV9OUl9PRl9TVUJGUkFNRVMgMQotI2RlZmluZSBERUZBVUxUX0xBVE1fU01DX1JFUEVBVCAgICAgIDgKKyNkZWZpbmUgREVGQVVMVF9MQVRNX1NNQ19SRVBFQVQgOAogCi0jZGVmaW5lIE1BWF9BQUNfTEFZRVJTICAgICAgICA5CisjZGVmaW5lIE1BWF9BQUNfTEFZRVJTIDkKIAotI2RlZmluZSBMQVRNX01BWF9QUk9HUkFNUyAgICAgMQotI2RlZmluZSBMQVRNX01BWF9TVFJFQU1fSUQgICAxNgorI2RlZmluZSBMQVRNX01BWF9QUk9HUkFNUyAxCisjZGVmaW5lIExBVE1fTUFYX1NUUkVBTV9JRCAxNgogCi0jZGVmaW5lIExBVE1fTUFYX0xBWUVSUyAgICAgICAxIC8qTUFYX0FBQ19MQVlFUlMqLworI2RlZmluZSBMQVRNX01BWF9MQVlFUlMgMSAvKk1BWF9BQUNfTEFZRVJTKi8KIAotI2RlZmluZSBNQVhfTlJfT0ZfU1VCRlJBTUVTICAgMiAgICAgICAgICAgLyogc2V0IHRoaXMgY2FyZWZ1bGx5IHRvIGF2b2lkIGJ1ZmZlciBvdmVyZmxvd3MgKi8KKyNkZWZpbmUgTUFYX05SX09GX1NVQkZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDIgLyogc2V0IHRoaXMgY2FyZWZ1bGx5IHRvIGF2b2lkIGJ1ZmZlciBvdmVyZmxvd3MgXAorICAgICAqLwogCiB0eXBlZGVmIGVudW0geyBMQVRNVkFSX1NJTVBMRV9TRVFVRU5DRSB9IExBVE1fVkFSX01PREU7CiAKQEAgLTExOCw2NyArMTI5LDgwIEBACiAgIHNpZ25lZCBpbnQgc3RyZWFtSUQ7CiB9IExBVE1fTEFZRVJfSU5GTzsKIAotCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIExBVE1fTEFZRVJfSU5GTyAgICAgIG1fbGluZm9bTEFUTV9NQVhfUFJPR1JBTVNdW0xBVE1fTUFYX0xBWUVSU107Ci0gIENPREVSX0NPTkZJRyAgICAgICAgKmNvbmZpZ1tMQVRNX01BWF9QUk9HUkFNU11bTEFUTV9NQVhfTEFZRVJTXTsKKyAgTEFUTV9MQVlFUl9JTkZPIG1fbGluZm9bTEFUTV9NQVhfUFJPR1JBTVNdW0xBVE1fTUFYX0xBWUVSU107CisgIENPREVSX0NPTkZJRyAqY29uZmlnW0xBVE1fTUFYX1BST0dSQU1TXVtMQVRNX01BWF9MQVlFUlNdOwogCi0gIExBVE1fVkFSX01PREUgICAgICAgIHZhck1vZGU7Ci0gIFRSQU5TUE9SVF9UWVBFICAgICAgIHR0OworICBMQVRNX1ZBUl9NT0RFIHZhck1vZGU7CisgIFRSQU5TUE9SVF9UWVBFIHR0OwogCi0gIGludCAgICAgICAgICAgICAgICAgIGF1ZGlvTXV4TGVuZ3RoQnl0ZXM7CisgIGludCBhdWRpb011eExlbmd0aEJ5dGVzOwogCi0gIGludCAgICAgICAgICAgICAgICAgIGF1ZGlvTXV4TGVuZ3RoQnl0ZXNQb3M7Ci0gIGludCAgICAgICAgICAgICAgICAgIHRhcmFCdWZmZXJGdWxsbmVzczsgLyogc3RhdGUgb2YgdGhlIGJpdCByZXNlcnZvaXIgKi8KLSAgaW50ICAgICAgICAgICAgICAgICAgdmFyU3RyZWFtQ250OwotICB1bnNpZ25lZCBpbnQgICAgICAgICBvdGhlckRhdGFMZW5CeXRlczsKKyAgaW50IGF1ZGlvTXV4TGVuZ3RoQnl0ZXNQb3M7CisgIGludCB0YXJhQnVmZmVyRnVsbG5lc3M7IC8qIHN0YXRlIG9mIHRoZSBiaXQgcmVzZXJ2b2lyICovCisgIGludCB2YXJTdHJlYW1DbnQ7CiAKLSAgVUNIQVIgICAgICAgICAgICAgICAgbGF0bUZyYW1lQ291bnRlcjsgICAvKiBDdXJyZW50IGZyYW1lIG51bWJlci4gQ291bnRzIG1vZHVsbyBtdXhDb25maWdQZXJpb2QgKi8KLSAgVUNIQVIgICAgICAgICAgICAgICAgbXV4Q29uZmlnUGVyaW9kOyAgICAvKiBEaXN0YW5jZSBpbiBmcmFtZXMgYmV0d2VlbiBNdXhDb25maWcgKi8KKyAgVUNIQVIKKyAgbGF0bUZyYW1lQ291bnRlcjsgICAgICAvKiBDdXJyZW50IGZyYW1lIG51bWJlci4gQ291bnRzIG1vZHVsbyBtdXhDb25maWdQZXJpb2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgVUNIQVIgbXV4Q29uZmlnUGVyaW9kOyAvKiBEaXN0YW5jZSBpbiBmcmFtZXMgYmV0d2VlbiBNdXhDb25maWcgKi8KIAotICBVQ0hBUiAgICAgICAgICAgICAgICBhdWRpb011eFZlcnNpb247ICAgIC8qIEFNVjEgc3VwcG9ydHMgdHJhbnNtaXNzaW9uIG9mIHRhcmFCdWZmZXJGdWxsbmVzcyBhbmQgQVNDIGxlbmd0aHMgKi8KLSAgVUNIQVIgICAgICAgICAgICAgICAgYXVkaW9NdXhWZXJzaW9uQTsgICAvKiBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgKi8KKyAgVUNIQVIKKyAgYXVkaW9NdXhWZXJzaW9uOyAvKiBBTVYxIHN1cHBvcnRzIHRyYW5zbWlzc2lvbiBvZiB0YXJhQnVmZmVyRnVsbG5lc3MgYW5kCisgICAgICAgICAgICAgICAgICAgICAgQVNDIGxlbmd0aHMgKi8KKyAgVUNIQVIgYXVkaW9NdXhWZXJzaW9uQTsgLyogZm9yIGZ1dHVyZSBleHRlbnNpb25zICovCiAKLSAgVUNIQVIgICAgICAgICAgICAgICAgbm9Qcm9ncmFtOwotICBVQ0hBUiAgICAgICAgICAgICAgICBub0xheWVyW0xBVE1fTUFYX1BST0dSQU1TXTsKLSAgVUNIQVIgICAgICAgICAgICAgICAgZnJhY3REZWxheVByZXNlbnQ7CisgIFVDSEFSIG5vUHJvZ3JhbTsKKyAgVUNIQVIgbm9MYXllcltMQVRNX01BWF9QUk9HUkFNU107CisgIFVDSEFSIGZyYWN0RGVsYXlQcmVzZW50OwogCi0gIFVDSEFSICAgICAgICAgICAgICAgIGFsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmc7Ci0gIFVDSEFSICAgICAgICAgICAgICAgIHN1YkZyYW1lQ250OyAgICAgICAgLyogQ3VycmVudCBTdWJmcmFtZSBmcmFtZSAqLwotICBVQ0hBUiAgICAgICAgICAgICAgICBub1N1YmZyYW1lczsgICAgICAgIC8qIE51bWJlciBvZiBzdWJmcmFtZXMgICAgKi8KLSAgVUlOVCAgICAgICAgICAgICAgICAgbGF0bVN1YmZyYW1lU3RhcnQ7ICAvKiBQb3NpdGlvbiBvZiBjdXJyZW50IHN1YmZyYW1lIHN0YXJ0ICovCi0gIFVDSEFSICAgICAgICAgICAgICAgIG5vU3ViZnJhbWVzX25leHQ7CisgIFVDSEFSIGFsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmc7CisgIFVDSEFSIHN1YkZyYW1lQ250OyAgICAgIC8qIEN1cnJlbnQgU3ViZnJhbWUgZnJhbWUgKi8KKyAgVUNIQVIgbm9TdWJmcmFtZXM7ICAgICAgLyogTnVtYmVyIG9mIHN1YmZyYW1lcyAgICAqLworICBVSU5UIGxhdG1TdWJmcmFtZVN0YXJ0OyAvKiBQb3NpdGlvbiBvZiBjdXJyZW50IHN1YmZyYW1lIHN0YXJ0ICovCisgIFVDSEFSIG5vU3ViZnJhbWVzX25leHQ7CiAKLSAgVUNIQVIgICAgICAgICAgICAgICAgZmlsbEJpdHM7ICAgICAgICAgICAvKiBBdWRpb011eEVsZW1lbnQgZmlsbCBiaXRzICovCi0gIFVDSEFSICAgICAgICAgICAgICAgIHN0cmVhbU11eENvbmZpZ0JpdHM7CisgIFVDSEFSIG90aGVyRGF0YUxlbkJpdHM7IC8qIEF1ZGlvTXV4RWxlbWVudCBvdGhlciBkYXRhIGJpdHMgKi8KKyAgVUNIQVIgZmlsbEJpdHM7ICAgICAgICAgLyogQXVkaW9NdXhFbGVtZW50IGZpbGwgYml0cyAqLworICBVSU5UIHN0cmVhbU11eENvbmZpZ0JpdHM7CiAKIH0gTEFUTV9TVFJFQU07CiAKIHR5cGVkZWYgTEFUTV9TVFJFQU0gKkhBTkRMRV9MQVRNX1NUUkVBTTsKIAogLyoqCi0gKiBcYnJpZWYgSW5pdGlhbGl6ZSBMQVRNX1NUUkVBTSBIYW5kbGUuIENyZWF0ZXMgYXV0b21hdGljYWxseSBvbmUgcHJvZ3JhbSB3aXRoIG9uZSBsYXllciB3aXRoCi0gKiAgICAgICAgdGhlIGdpdmVuIGxheWVyQ29uZmlnLiBUaGUgbGF5ZXJDb25maWcgbXVzdCBiZSBwZXJzaXN0ZW4gYmVjYXVzZSByZWZlcmVuY2VzIHRvIHRoaXMgcG9pbnRlcgotICogICAgICAgIGFyZSBtYWRlIGF0IGFueSB0aW1lIGFnYWluLgotICogICAgICAgIFVzZSB0cmFuc3BvcnRFbmNfTGF0bV9BZGRMYXllcigpIHRvIGFkZCBtb3JlIHByb2dyYW1zL2xheWVycy4KKyAqIFxicmllZiBJbml0aWFsaXplIExBVE1fU1RSRUFNIEhhbmRsZS4gQ3JlYXRlcyBhdXRvbWF0aWNhbGx5IG9uZSBwcm9ncmFtIHdpdGgKKyAqIG9uZSBsYXllciB3aXRoIHRoZSBnaXZlbiBsYXllckNvbmZpZy4gVGhlIGxheWVyQ29uZmlnIG11c3QgYmUgcGVyc2lzdGVuCisgKiBiZWNhdXNlIHJlZmVyZW5jZXMgdG8gdGhpcyBwb2ludGVyIGFyZSBtYWRlIGF0IGFueSB0aW1lIGFnYWluLiBVc2UKKyAqIHRyYW5zcG9ydEVuY19MYXRtX0FkZExheWVyKCkgdG8gYWRkIG1vcmUgcHJvZ3JhbXMvbGF5ZXJzLgogICoKICAqIFxwYXJhbSBoTGF0bVN0cmVhbUluZm8gSEFORExFX0xBVE1fU1RSRUFNIGhhbmRsZQogICogXHBhcmFtIGhCcyBCaXRzdHJlYW0gaGFuZGxlCi0gKiBccGFyYW0gbGF5ZXJDb25maWcgYSB2YWxpZCBDT0RFUl9DT05GSUcgc3RydWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgYXVkaW8gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKiBccGFyYW0gbGF5ZXJDb25maWcgYSB2YWxpZCBDT0RFUl9DT05GSUcgc3RydWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgYXVkaW8KKyAqIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwogICogXHBhcmFtIGF1ZGlvTXV4VmVyc2lvbiB0aGUgTEFUTSBhdWRpb011eFZlcnNpb24gdG8gYmUgdXNlZAotICogXHBhcmFtIHR0IHRoZSBzcGVjaWZpYyBUUkFOU1BPUlRfVFlQRSB0byBiZSB1c2VkLCBlaXRoZXIgVFRfTVA0X0xPQVMsIFRUX01QNF9MQVRNX01DUDEgb3IgVFRfTVA0X0xBVE1fTUNQMCBMT0FTCisgKiBccGFyYW0gdHQgdGhlIHNwZWNpZmljIFRSQU5TUE9SVF9UWVBFIHRvIGJlIHVzZWQsIGVpdGhlciBUVF9NUDRfTE9BUywKKyAqIFRUX01QNF9MQVRNX01DUDEgb3IgVFRfTVA0X0xBVE1fTUNQMCBMT0FTCiAgKiBccGFyYW0gY2IgY2FsbGJhY2sgaW5mb3JtYXRpb24gc3RydWN0dXJlLgogICoKICAqIFxyZXR1cm4gYW4gVFJBTlNQT1JURU5DX0VSUk9SIGVycm9yIGNvZGUKICAqLwotVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19MYXRtX0luaXQoCi0gICAgICAgIEhBTkRMRV9MQVRNX1NUUkVBTSBoTGF0bVN0cmVhbUluZm8sCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgQ09ERVJfQ09ORklHICpsYXllckNvbmZpZywKLSAgICAgICAgVUlOVCBhdWRpb011eFZlcnNpb24sCi0gICAgICAgIFRSQU5TUE9SVF9UWVBFIHR0LAotICAgICAgICBDU1RwQ2FsbEJhY2tzICpjYgotICAgICAgICApOworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19MYXRtX0luaXQoSEFORExFX0xBVE1fU1RSRUFNIGhMYXRtU3RyZWFtSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVSX0NPTkZJRyAqbGF5ZXJDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGF1ZGlvTXV4VmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9SVF9UWVBFIHR0LCBDU1RwQ2FsbEJhY2tzICpjYik7CisKKy8qKgorICogXGJyaWVmIFdyaXRlIGFkZGlvbmFsIG90aGVyIGRhdGEgYml0cyBpbiBBdWRpb011eEVsZW1lbnQKKyAqCisgKiBccGFyYW0gaEFzcyBIQU5ETEVfTEFUTV9TVFJFQU0gaGFuZGxlCisgKiBccGFyYW0gb3RoZXJEYXRhQml0cyBudW1iZXIgb2Ygb3RoZXIgZGF0YSBiaXRzIHRvIGJlIHdyaXR0ZW4KKyAqCisgKiBccmV0dXJuIGFuIFRSQU5TUE9SVEVOQ19FUlJPUiBlcnJvciBjb2RlCisgKi8KK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfTGF0bUFkZE90aGVyRGF0YUJpdHMoSEFORExFX0xBVE1fU1RSRUFNIGhBc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvdGhlckRhdGFCaXRzKTsKIAogLyoqCiAgKiBcYnJpZWYgR2V0IGJpdCBkZW1hbmQgb2YgbmV4dCBMQVRNL0xPQVMgaGVhZGVyCkBAIC0xODgsMTAgKzIxMiw4IEBACiAgKgogICogXHJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgYnkgdGhlIExBVE0vTE9BUyBoZWFkZXJzCiAgKi8KLXVuc2lnbmVkIGludCB0cmFuc3BvcnRFbmNfTGF0bUNvdW50VG90YWxCaXREZW1hbmRIZWFkZXIgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9MQVRNX1NUUkVBTSBoQXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzdHJlYW1EYXRhTGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwordW5zaWduZWQgaW50IHRyYW5zcG9ydEVuY19MYXRtQ291bnRUb3RhbEJpdERlbWFuZEhlYWRlcigKKyAgICBIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcywgdW5zaWduZWQgaW50IHN0cmVhbURhdGFMZW5ndGgpOwogCiAvKioKICAqIFxicmllZiBXcml0ZSBMQVRNL0xPQVMgaGVhZGVyIGludG8gZ2l2ZW4gYml0c3RyZWFtIGhhbmRsZQpAQCAtMjA1LDQyICsyMjcsMzUgQEAKICAqIFxyZXR1cm4gYW4gVFJBTlNQT1JURU5DX0VSUk9SIGVycm9yIGNvZGUKICAqLwogVFJBTlNQT1JURU5DX0VSUk9SCi10cmFuc3BvcnRFbmNfTGF0bVdyaXRlICgKLSAgICAgICAgSEFORExFX0xBVE1fU1RSRUFNICAgIGhBc3MsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0c3RyZWFtLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgYXVCaXRzLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgYnVmZmVyRnVsbG5lc3MsCi0gICAgICAgIENTVHBDYWxsQmFja3MgICAgICpjYgotICAgICAgICApOwordHJhbnNwb3J0RW5jX0xhdG1Xcml0ZShIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcywgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1Qml0cywgaW50IGJ1ZmZlckZ1bGxuZXNzLCBDU1RwQ2FsbEJhY2tzICpjYik7CiAKIC8qKgogICogXGJyaWVmIEFkanVzdCBiaXQgY291bnQgcmVsYXRpdmUgdG8gY3VycmVudCBzdWJmcmFtZQogICoKICAqIFxwYXJhbSBoQXNzIEhBTkRMRV9MQVRNX1NUUkVBTSBoYW5kbGUKLSAqIFxwYXJhbSBwQml0cyBwb2ludGVyIHRvIGFuIGludCwgd2hlcmUgdGhlIGN1cnJlbnQgZnJhbWUgYml0IGNvdW50IGlzIGNvbnRhaW5lZCwKLSAqICAgICAgICBhbmQgd2hlcmUgdGhlIHN1YmZyYW1lIHJlbGF0aXZlIGJpdCBjb3VudCB3aWxsIGJlIHJldHVybmVkIGludG8KKyAqIFxwYXJhbSBwQml0cyBwb2ludGVyIHRvIGFuIGludCwgd2hlcmUgdGhlIGN1cnJlbnQgZnJhbWUgYml0IGNvdW50IGlzCisgKiBjb250YWluZWQsIGFuZCB3aGVyZSB0aGUgc3ViZnJhbWUgcmVsYXRpdmUgYml0IGNvdW50IHdpbGwgYmUgcmV0dXJuZWQgaW50bwogICoKICAqIFxyZXR1cm4gdm9pZAogICovCi12b2lkIHRyYW5zcG9ydEVuY19MYXRtQWRqdXN0U3ViZnJhbWVCaXRzKEhBTkRMRV9MQVRNX1NUUkVBTSAgICBoQXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqcEJpdHMpOwordm9pZCB0cmFuc3BvcnRFbmNfTGF0bUFkanVzdFN1YmZyYW1lQml0cyhIQU5ETEVfTEFUTV9TVFJFQU0gaEFzcywgaW50ICpwQml0cyk7CiAKIC8qKgogICogXGJyaWVmIFJlcXVlc3QgYW4gTEFUTSBmcmFtZSwgd2hpY2ggbWF5LCBvciBtYXkgbm90IGJlIGF2YWlsYWJsZQogICoKICAqIFxwYXJhbSBoQXNzIEhBTkRMRV9MQVRNX1NUUkVBTSBoYW5kbGUKICAqIFxwYXJhbSBoQnMgQml0c3RyZWFtIGhhbmRsZQotICogXHBhcmFtIHBCeXRlcyBwb2ludGVyIHRvIGFuIGludCwgd2hlcmUgdGhlIGN1cnJlbnQgZnJhbWUgYnl0ZSBjb3VudCBzdG9yZWQgaW50by4KLSAqICAgICAgICBBIHJldHVybiB2YWx1ZSBvZiB6ZXJvIG1lYW5zIHRoYXQgY3VycmVudGx5IG5vIExBVE0vTE9BUyBmcmFtZSBjYW4gYmUgcmV0dXJuZWQuCi0gKiAgICAgICAgVGhlIGxhdHRlciBpcyBleHBlY3RlZCBpbiBjYXNlIG9mIG11bHRpcGxlIHN1YmZyYW1lcyBiZWluZyB1c2VkLgorICogXHBhcmFtIHBCeXRlcyBwb2ludGVyIHRvIGFuIGludCwgd2hlcmUgdGhlIGN1cnJlbnQgZnJhbWUgYnl0ZSBjb3VudCBzdG9yZWQKKyAqIGludG8uIEEgcmV0dXJuIHZhbHVlIG9mIHplcm8gbWVhbnMgdGhhdCBjdXJyZW50bHkgbm8gTEFUTS9MT0FTIGZyYW1lIGNhbiBiZQorICogcmV0dXJuZWQuIFRoZSBsYXR0ZXIgaXMgZXhwZWN0ZWQgaW4gY2FzZSBvZiBtdWx0aXBsZSBzdWJmcmFtZXMgYmVpbmcKKyAqIHVzZWQuCiAgKgotICogXHJldHVybiB2b2lkCisgKiBccmV0dXJuIGFuIFRSQU5TUE9SVEVOQ19FUlJPUiBlcnJvciBjb2RlCiAgKi8KLXZvaWQgdHJhbnNwb3J0RW5jX0xhdG1HZXRGcmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfTEFUTV9TVFJFQU0gICAgaEFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICpwQnl0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19MYXRtR2V0RnJhbWUoSEFORExFX0xBVE1fU1RSRUFNIGhBc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBCeXRlcyk7CiAKIC8qKgogICogXGJyaWVmIFdyaXRlIGEgU3RyZWFtTXV4Q29uZmlnIGludG8gdGhlIGdpdmVuIGJpdHN0cmVhbSBoYW5kbGUKQEAgLTI1MywxMiArMjY4LDcgQEAKICAqIFxyZXR1cm4gdm9pZAogICovCiBUUkFOU1BPUlRFTkNfRVJST1IKLUNyZWF0ZVN0cmVhbU11eENvbmZpZygKLSAgICAgICAgSEFORExFX0xBVE1fU1RSRUFNIGhBc3MsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgaW50IGJ1ZmZlckZ1bGxuZXNzLAotICAgICAgICBDU1RwQ2FsbEJhY2tzICpjYgotICAgICAgICApOwotCitDcmVhdGVTdHJlYW1NdXhDb25maWcoSEFORExFX0xBVE1fU1RSRUFNIGhBc3MsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyRnVsbG5lc3MsIENTVHBDYWxsQmFja3MgKmNiKTsKIAogI2VuZGlmIC8qIFRQRU5DX0xBVE1fSCAqLwpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19saWIuY3BwIGIvbGliTXBlZ1RQRW5jL3NyYy90cGVuY19saWIuY3BwCmluZGV4IDI0ZmIzMmYuLmE4NTY3YjkgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUEVuYy9zcmMvdHBlbmNfbGliLmNwcAorKysgYi9saWJNcGVnVFBFbmMvc3JjL3RwZW5jX2xpYi5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjQgKzkwLDI0IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgVHJhbnNwb3J0IEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKiogTVBFRyB0cmFuc3BvcnQgZm9ybWF0IGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioKIAotICAgQXV0aG9yKHMpOiBNYW51ZWwgSmFuZGVyCisgICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgorCiAgICBEZXNjcmlwdGlvbjogTVBFRyBUcmFuc3BvcnQgZW5jb2RlCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJ0cGVuY19saWIuaCIKIAogLyogbGlicmFyeSBpbmZvICovCi0jaW5jbHVkZSAidmVyc2lvbiIKKyNpbmNsdWRlICJ0cF92ZXJzaW9uLmgiCiAKICNkZWZpbmUgTU9EVUxFX05BTUUgInRyYW5zcG9ydEVuYyIKIAogI2luY2x1ZGUgInRwZW5jX2FzYy5oIgotI2luY2x1ZGUgImNvbnZfc3RyaW5nLmgiCiAKICNpbmNsdWRlICJ0cGVuY19hZHRzLmgiCiAKQEAgLTEwNCwyNSArMTE1LDIzIEBACiAKICNpbmNsdWRlICJ0cGVuY19sYXRtLmgiCiAKLQotCiB0eXBlZGVmIHN0cnVjdCB7CiAgIGludCBjdXJTdWJGcmFtZTsKICAgaW50IG5TdWJGcmFtZXM7CiAgIGludCBwcmV2Qml0czsKIH0gUkFXUEFDS0VUU19JTkZPOwogCi1zdHJ1Y3QgVFJBTlNQT1JURU5DCi17CitzdHJ1Y3QgVFJBTlNQT1JURU5DIHsKICAgQ09ERVJfQ09ORklHIGNvbmZpZzsKLSAgVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0Rm10OyAgICAgICAgICAvKiE8IE1QRUc0IHRyYW5zcG9ydCB0eXBlLiAqLworICBUUkFOU1BPUlRfVFlQRSB0cmFuc3BvcnRGbXQ7IC8qITwgTVBFRzQgdHJhbnNwb3J0IHR5cGUuICovCiAKICAgRkRLX0JJVFNUUkVBTSBiaXRTdHJlYW07CiAgIFVDSEFSICpic0J1ZmZlcjsKICAgSU5UIGJzQnVmZmVyU2l6ZTsKIAotICBJTlQgcGNlRnJhbWVDb3VudGVyOyAgICAgICAgICAgICAgICAgIC8qITwgSW5kaWNhdGVzIGZyYW1lIHBlcmlvZCB3aGVuIFBDRSBtdXN0IGJlIHdyaXR0ZW4gaW4gcmF3X2RhdGFfYmxvY2suCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSBtZWFucyBub3QgdG8gd3JpdGUgYSBQQ0UgaW4gcmF3X2RhdF9ibG9jay4gKi8KKyAgSU5UIHBjZUZyYW1lQ291bnRlcjsgLyohPCBJbmRpY2F0ZXMgZnJhbWUgcGVyaW9kIHdoZW4gUENFIG11c3QgYmUgd3JpdHRlbiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfZGF0YV9ibG9jay4gLTEgbWVhbnMgbm90IHRvIHdyaXRlIGEgUENFIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19kYXRfYmxvY2suICovCiAgIHVuaW9uIHsKICAgICBTVFJVQ1RfQURUUyBhZHRzOwogCkBAIC0xMzIsOCArMTQxLDYgQEAKIAogICAgIFJBV1BBQ0tFVFNfSU5GTyByYXc7CiAKLQotCiAgIH0gd3JpdGVyOwogCiAgIENTVHBDYWxsQmFja3MgY2FsbGJhY2tzOwpAQCAtMTQxLDI0ICsxNDgsMjIgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgX1RSQU5TUE9SVEVOQ19TVFJVQ1QgVFJBTlNQT1JURU5DX1NUUlVDVDsKIAotCiAvKgogICogTUVNT1JZIERlY2xhcmF0aW9uCiAgKi8KIAotQ19BTExPQ19NRU0oUmFtX1RyYW5zcG9ydEVuY29kZXIsIFRSQU5TUE9SVEVOQywgMSkKK0NfQUxMT0NfTUVNKFJhbV9UcmFuc3BvcnRFbmNvZGVyLCBzdHJ1Y3QgVFJBTlNQT1JURU5DLCAxKQogCi1UUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX09wZW4oIEhBTkRMRV9UUkFOU1BPUlRFTkMgKnBoVHBFbmMgKQoteworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19PcGVuKEhBTkRMRV9UUkFOU1BPUlRFTkMgKnBoVHBFbmMpIHsKICAgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmM7CiAKLSAgaWYgKCBwaFRwRW5jID09IE5VTEwgKXsKKyAgaWYgKHBoVHBFbmMgPT0gTlVMTCkgewogICAgIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9QQVJBTUVURVI7CiAgIH0KIAogICBoVHBFbmMgPSBHZXRSYW1fVHJhbnNwb3J0RW5jb2RlcigwKTsKIAotICBpZiAoIGhUcEVuYyA9PSBOVUxMICkgeworICBpZiAoaFRwRW5jID09IE5VTEwpIHsKICAgICByZXR1cm4gVFJBTlNQT1JURU5DX05PX01FTTsKICAgfQogCkBAIC0xNjksMjkgKzE3NCwzMSBAQAogLyoqCiAgKiBcYnJpZWYgIEdldCBmcmFtZSBwZXJpb2Qgb2YgUENFIGluIHJhd19kYXRhX2Jsb2NrLgogICoKLSAqICAtIFdyaXRlIFBDRSBvbmx5IGlmIG5lY2Vzc2FyeS4gUENFIGNhbiBiZSBwYXJ0IG9mIHRoZSBBU0MgaWYgY2hDb25maWc9PTAgd2hlcmVyZm9yZQotICogICAgbm8gYWRkaXRvbmFsIFBDRSB3aWxsIGJlIHdyaXR0ZW4gaW4gcmF3X2RhdGFfYmxvY2suCisgKiAtIFdyaXRlIFBDRSBvbmx5IGlmIG5lY2Vzc2FyeS4gUENFIGNhbiBiZSBwYXJ0IG9mIHRoZSBBU0MgaWYgY2hDb25maWc9PTAKKyAqIHdoZXJlcmZvcmUgbm8gYWRkaXRvbmFsIFBDRSB3aWxsIGJlIHdyaXR0ZW4gaW4gcmF3X2RhdGFfYmxvY2suCiAgKiAtIEEgbWF0cml4TWl4ZG93biBjb2VmZmljaWVudCBjYW4gb25seSBiZSB3cml0dGVuIGlmIGNoQ29uZmlnIGlzIDUuMCBvciA1LjEuCi0gKiAtIFRoZSBQQ0UgcmVwZXRpdGlvbiByYXRlIGluIHJhd19kYXRhX2Jsb2NrIGNhbiBiZSBjb250cm9sbGVkIHZpYSBoZWFkZXJQZXJpb2QgcGFyYW1ldGVyLgorICogLSBUaGUgUENFIHJlcGV0aXRpb24gcmF0ZSBpbiByYXdfZGF0YV9ibG9jayBjYW4gYmUgY29udHJvbGxlZCB2aWEKKyAqIGhlYWRlclBlcmlvZCBwYXJhbWV0ZXIuCiAgKgotICogXHBhcmFtIGNoYW5uZWxDb25maWcgICAgICAgICBDaGFubmVsIENvbmZpZ3VyYXRpb24gZGVyaXZlZCBmcm9tIENoYW5uZWwgTW9kZQorICogXHBhcmFtIGNoYW5uZWxNb2RlICAgICAgICAgICBFbmNvZGVyIENoYW5uZWwgTW9kZS4KKyAqIFxwYXJhbSBjaGFubmVsQ29uZmlnWmVybyAgICAgTm8gc3RhbmRhcmQgY2hhbm5lbCBjb25maWd1cmF0aW9uLgogICogXHBhcmFtIHRyYW5zcG9ydEZtdCAgICAgICAgICBGb3JtYXQgb2YgdGhlIHRyYW5zcG9ydCB0byBiZSB3cml0dGVuLgogICogXHBhcmFtIGhlYWRlclBlcmlvZCAgICAgICAgICBDaG9zZW4gUENFIGZyYW1lIHJlcGV0aXRpb24gcmF0ZS4KLSAqIFxwYXJhbSBtYXRyaXhNaXhkb3duQSAgICAgICAgSW5kaWNhdGVzIGlmIGEgdmFsaWQgTWF0cml4IE1peGRvd24gY29lZmZpY2llbnQgaXMgYXZhaWxhYmxlLgorICogXHBhcmFtIG1hdHJpeE1peGRvd25BICAgICAgICBJbmRpY2F0ZXMgaWYgYSB2YWxpZCBNYXRyaXggTWl4ZG93biBjb2VmZmljaWVudAorICogaXMgYXZhaWxhYmxlLgogICoKLSAqIFxyZXR1cm4gIFBDRSBmcmFtZSByZXBldGl0aW9uIHJhdGUuIC0xIG1lYW5zIG5vIFBDRSBwcmVzZW50IGluIHJhd19kYXRhX2Jsb2NrLgorICogXHJldHVybiAgUENFIGZyYW1lIHJlcGV0aXRpb24gcmF0ZS4gLTEgbWVhbnMgbm8gUENFIHByZXNlbnQgaW4KKyAqIHJhd19kYXRhX2Jsb2NrLgogICovCi1zdGF0aWMgSU5UIGdldFBjZVJlcGV0aXRpb25SYXRlKAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICBjaGFubmVsQ29uZmlnLAotICAgICAgICBjb25zdCBUUkFOU1BPUlRfVFlQRSB0cmFuc3BvcnRGbXQsCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIGhlYWRlclBlcmlvZCwKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgbWF0cml4TWl4ZG93bkEKLSAgICAgICAgKQoteworc3RhdGljIElOVCBnZXRQY2VSZXBldGl0aW9uUmF0ZShjb25zdCBDSEFOTkVMX01PREUgY2hhbm5lbE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaGFubmVsQ29uZmlnWmVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFJBTlNQT1JUX1RZUEUgdHJhbnNwb3J0Rm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaGVhZGVyUGVyaW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbWF0cml4TWl4ZG93bkEpIHsKICAgSU5UIHBjZUZyYW1lQ291bnRlciA9IC0xOyAvKiB2YXJpYWJsZSB0byBiZSByZXR1cm5lZCAqLwogCi0gIGlmIChoZWFkZXJQZXJpb2Q+MCkgewotICAgIHN3aXRjaCAoIGNoYW5uZWxDb25maWcgKSB7CisgIGlmIChoZWFkZXJQZXJpb2QgPiAwKSB7CisgICAgc3dpdGNoIChnZXRDaGFubmVsQ29uZmlnKGNoYW5uZWxNb2RlLCBjaGFubmVsQ29uZmlnWmVybykpIHsKICAgICAgIGNhc2UgMDoKICAgICAgICAgc3dpdGNoICh0cmFuc3BvcnRGbXQpIHsKICAgICAgICAgICBjYXNlIFRUX01QNF9BRFRTOgpAQCAtMTk5LDUzICsyMDYsNTIgQEAKICAgICAgICAgICBjYXNlIFRUX01QNF9SQVc6CiAgICAgICAgICAgICBwY2VGcmFtZUNvdW50ZXIgPSBoZWFkZXJQZXJpb2Q7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFRUX01QNF9BRElGOiAgICAgICAgICAgICAgICAgIC8qIEFESUYgaGVhZGVyIGNvbXByaXNlcyBQQ0UgKi8KLSAgICAgICAgICBjYXNlIFRUX01QNF9MT0FTOiAgICAgICAgICAgICAgICAgIC8qIFBDRSBpbiBBU0MgaWYgY2hDaG9uZmlnPT0wICovCi0gICAgICAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AxOiAgICAgICAgICAgICAvKiBQQ0UgaW4gQVNDIGlmIGNoQ2hvbmZpZz09MCAqLwotICAgICAgICAgIGNhc2UgVFRfRFJNOiAgICAgICAgICAgICAgICAgICAgICAgLyogUENFIG5vdCBhbGxvd2VkIGluIERSTSAqLworICAgICAgICAgIGNhc2UgVFRfTVA0X0FESUY6IC8qIEFESUYgaGVhZGVyIGNvbXByaXNlcyBQQ0UgKi8KKyAgICAgICAgICAgIGlmICgoY2hhbm5lbE1vZGUgPT0gTU9ERV8xXzJfMikgfHwgKGNoYW5uZWxNb2RlID09IE1PREVfMV8yXzJfMSkpIHsKKyAgICAgICAgICAgICAgcGNlRnJhbWVDb3VudGVyID0gaGVhZGVyUGVyaW9kOyAvKiByZXBlYXRpbmcgcGNlIG9ubHkgbWVhbmluZ2Z1bAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwb3RlbnRpYWwgbWF0cml4IG1peGRvd24gKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBUVF9NUDRfTE9BUzogICAgICAvKiBQQ0UgaW4gQVNDIGlmIGNoQ2hvbmZpZz09MCAqLworICAgICAgICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMTogLyogUENFIGluIEFTQyBpZiBjaENob25maWc9PTAgKi8KICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcGNlRnJhbWVDb3VudGVyID0gLTE7ICAgICAgICAgICAgLyogbm8gUENFIGluIHJhd19kYXRhX2Jsb2NrICovCisgICAgICAgICAgICBwY2VGcmFtZUNvdW50ZXIgPSAtMTsgLyogbm8gUENFIGluIHJhd19kYXRhX2Jsb2NrICovCiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIDU6IC8qIE1PREVfMV8yXzIgKi8KICAgICAgIGNhc2UgNjogLyogTU9ERV8xXzJfMl8xICovCi0gICAgICAgIC8qIG1hdHJpeE1peGRvd25Db2VmZmljaWVudCBjYW4gb25seSBiZSB3cml0dGVuIGlmIDUuMCBhbmQgNS4xIGNvbmZpZyBwcmVzZW50LiAqLwotICAgICAgICBpZiAobWF0cml4TWl4ZG93bkEhPTApIHsKKyAgICAgICAgLyogbWF0cml4TWl4ZG93bkNvZWZmaWNpZW50IGNhbiBvbmx5IGJlIHdyaXR0ZW4gaWYgNS4wIGFuZCA1LjEgY29uZmlnCisgICAgICAgICAqIHByZXNlbnQuICovCisgICAgICAgIGlmIChtYXRyaXhNaXhkb3duQSAhPSAwKSB7CiAgICAgICAgICAgc3dpdGNoICh0cmFuc3BvcnRGbXQpIHsKLSAgICAgICAgICAgIGNhc2UgVFRfTVA0X0FESUY6ICAgICAgICAgICAgICAgIC8qIEFESUYgaGVhZGVyIGNvbXByaXNlcyBQQ0UgKi8KKyAgICAgICAgICAgIGNhc2UgVFRfTVA0X0FESUY6IC8qIEFESUYgaGVhZGVyIGNvbXByaXNlcyBQQ0UgKi8KICAgICAgICAgICAgIGNhc2UgVFRfTVA0X0FEVFM6Ci0gICAgICAgICAgICBjYXNlIFRUX01QNF9MT0FTOiAgICAgICAgICAgICAgICAvKiBubyBQQ0UgaW4gQVNDIGJlY2F1c2UgY2hDb25maWchPTAgKi8KLSAgICAgICAgICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMTogICAgICAgICAgIC8qIG5vIFBDRSBpbiBBU0MgYmVjYXVzZSBjaENvbmZpZyE9MCAqLworICAgICAgICAgICAgY2FzZSBUVF9NUDRfTE9BUzogICAgICAvKiBubyBQQ0UgaW4gQVNDIGJlY2F1c2UgY2hDb25maWchPTAgKi8KKyAgICAgICAgICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMTogLyogbm8gUENFIGluIEFTQyBiZWNhdXNlIGNoQ29uZmlnIT0wICovCiAgICAgICAgICAgICBjYXNlIFRUX01QNF9MQVRNX01DUDA6CiAgICAgICAgICAgICBjYXNlIFRUX01QNF9SQVc6CiAgICAgICAgICAgICAgIHBjZUZyYW1lQ291bnRlciA9IGhlYWRlclBlcmlvZDsKICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRUX0RSTTogICAgICAgICAgICAgICAgICAgICAvKiBQQ0Ugbm90IGFsbG93ZWQgaW4gRFJNICovCiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBwY2VGcmFtZUNvdW50ZXIgPSAtMTsgICAgICAgICAgLyogbm8gUENFIGluIHJhd19kYXRhX2Jsb2NrICovCi0gICAgICAgICAgfSAvKiBzd2l0Y2ggdHJhbnNwb3J0Rm10ICovCi0gICAgICAgIH0gLyogaWYgbWF0cml4TWl4ZG93bkEhPTAgKi8KKyAgICAgICAgICAgICAgcGNlRnJhbWVDb3VudGVyID0gLTE7IC8qIG5vIFBDRSBpbiByYXdfZGF0YV9ibG9jayAqLworICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyogc3dpdGNoIHRyYW5zcG9ydEZtdCAqLworICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgbWF0cml4TWl4ZG93bkEhPTAgKi8KICAgICAgICAgYnJlYWs7CiAgICAgICBkZWZhdWx0OgotICAgICAgICBwY2VGcmFtZUNvdW50ZXIgPSAtMTsgICAgICAgICAgICAgICAgLyogbm8gUENFIGluIHJhd19kYXRhX2Jsb2NrICovCi0gICAgfSAvKiBzd2l0Y2ggZ2V0Q2hhbm5lbENvbmZpZygpICovCi0gIH0gLyogaWYgaGVhZGVyUGVyaW9kPjAgICovCisgICAgICAgIHBjZUZyYW1lQ291bnRlciA9IC0xOyAvKiBubyBQQ0UgaW4gcmF3X2RhdGFfYmxvY2sgKi8KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN3aXRjaCBnZXRDaGFubmVsQ29uZmlnKCkgKi8KKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIGhlYWRlclBlcmlvZD4wICAqLwogICBlbHNlIHsKLSAgICBwY2VGcmFtZUNvdW50ZXIgPSAtMTsgICAgICAgICAgICAgICAgICAgIC8qIG5vIFBDRSBpbiByYXdfZGF0YV9ibG9jayAqLworICAgIHBjZUZyYW1lQ291bnRlciA9IC0xOyAvKiBubyBQQ0UgaW4gcmF3X2RhdGFfYmxvY2sgKi8KICAgfQogCiAgIHJldHVybiBwY2VGcmFtZUNvdW50ZXI7CiB9CiAKLVRSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfSW5pdCgKLSAgICAgICAgSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCi0gICAgICAgIFVDSEFSICAgICAgICAgICAgICpic0J1ZmZlciwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgIGJzQnVmZmVyU2l6ZSwKLSAgICAgICAgVFJBTlNQT1JUX1RZUEUgICAgIHRyYW5zcG9ydEZtdCwKLSAgICAgICAgQ09ERVJfQ09ORklHICAgICAgKmNjb25maWcsCi0gICAgICAgIFVJTlQgICAgICAgICAgICAgICBmbGFncwotICAgICAgICApCi17CitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0luaXQoSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmJzQnVmZmVyLCBJTlQgYnNCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9SVF9UWVBFIHRyYW5zcG9ydEZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFUl9DT05GSUcgKmNjb25maWcsIFVJTlQgZmxhZ3MpIHsKICAgLyogQ29weSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAqLwogICBGREttZW1jcHkoJmhUcEVuYy0+Y29uZmlnLCBjY29uZmlnLCBzaXplb2YoQ09ERVJfQ09ORklHKSk7CiAKQEAgLTI1NSw4NiArMjYxLDk1IEBACiAgIGhUcEVuYy0+YnNCdWZmZXIgPSBic0J1ZmZlcjsKICAgaFRwRW5jLT5ic0J1ZmZlclNpemUgPSBic0J1ZmZlclNpemU7CiAKLSAgRkRLaW5pdEJpdFN0cmVhbSgmaFRwRW5jLT5iaXRTdHJlYW0sIGhUcEVuYy0+YnNCdWZmZXIsIGhUcEVuYy0+YnNCdWZmZXJTaXplLCAwLCBCU19XUklURVIpOworICBGREtpbml0Qml0U3RyZWFtKCZoVHBFbmMtPmJpdFN0cmVhbSwgaFRwRW5jLT5ic0J1ZmZlciwgaFRwRW5jLT5ic0J1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgMCwgQlNfV1JJVEVSKTsKIAogICBzd2l0Y2ggKHRyYW5zcG9ydEZtdCkgeworICAgIGNhc2UgVFRfTVA0X0FESUY6CisgICAgICAvKiBTYW5pdHkgY2hlY2tzICovCisgICAgICBpZiAoKGhUcEVuYy0+Y29uZmlnLmFvdCAhPSBBT1RfQUFDX0xDKSB8fAorICAgICAgICAgIChoVHBFbmMtPmNvbmZpZy5zYW1wbGVzUGVyRnJhbWUgIT0gMTAyNCkpIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgIH0KKyAgICAgIGhUcEVuYy0+d3JpdGVyLmFkaWYuaGVhZGVyV3JpdHRlbiA9IDA7CisgICAgICBoVHBFbmMtPndyaXRlci5hZGlmLnNhbXBsaW5nUmF0ZSA9IGhUcEVuYy0+Y29uZmlnLnNhbXBsaW5nUmF0ZTsKKyAgICAgIGhUcEVuYy0+d3JpdGVyLmFkaWYuYml0UmF0ZSA9IGhUcEVuYy0+Y29uZmlnLmJpdFJhdGU7CisgICAgICBoVHBFbmMtPndyaXRlci5hZGlmLnByb2ZpbGUgPSAoKGludCloVHBFbmMtPmNvbmZpZy5hb3QpIC0gMTsKKyAgICAgIGhUcEVuYy0+d3JpdGVyLmFkaWYuY20gPSBoVHBFbmMtPmNvbmZpZy5jaGFubmVsTW9kZTsKKyAgICAgIGhUcEVuYy0+d3JpdGVyLmFkaWYuYlZhcmlhYmxlUmF0ZSA9IDA7CisgICAgICBoVHBFbmMtPndyaXRlci5hZGlmLmluc3RhbmNlVGFnID0gMDsKKyAgICAgIGhUcEVuYy0+d3JpdGVyLmFkaWYubWF0cml4TWl4ZG93bkEgPSBoVHBFbmMtPmNvbmZpZy5tYXRyaXhNaXhkb3duQTsKKyAgICAgIGhUcEVuYy0+d3JpdGVyLmFkaWYucHNldWRvU3Vycm91bmRFbmFibGUgPQorICAgICAgICAgIChoVHBFbmMtPmNvbmZpZy5mbGFncyAmIENDX1BTRVVET19TVVJST1VORCkgPyAxIDogMDsKKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgVFRfTVA0X0FESUY6Ci0gICAgLyogU2FuaXR5IGNoZWNrcyAqLwotICAgIGlmICggKGhUcEVuYy0+Y29uZmlnLmFvdCAhPSBBT1RfQUFDX0xDKQotICAgICAgIHx8KGhUcEVuYy0+Y29uZmlnLnNhbXBsZXNQZXJGcmFtZSAhPSAxMDI0KSkKLSAgICB7Ci0gICAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfUEFSQU1FVEVSOwotICAgIH0KLSAgICBoVHBFbmMtPndyaXRlci5hZGlmLmhlYWRlcldyaXR0ZW4gPSAwOwotICAgIGhUcEVuYy0+d3JpdGVyLmFkaWYuc2FtcGxpbmdSYXRlID0gaFRwRW5jLT5jb25maWcuc2FtcGxpbmdSYXRlOwotICAgIGhUcEVuYy0+d3JpdGVyLmFkaWYuYml0UmF0ZSA9IGhUcEVuYy0+Y29uZmlnLmJpdFJhdGU7Ci0gICAgaFRwRW5jLT53cml0ZXIuYWRpZi5wcm9maWxlID0gKChpbnQpaFRwRW5jLT5jb25maWcuYW90KSAtIDE7Ci0gICAgaFRwRW5jLT53cml0ZXIuYWRpZi5jbSA9IGhUcEVuYy0+Y29uZmlnLmNoYW5uZWxNb2RlOwotICAgIGhUcEVuYy0+d3JpdGVyLmFkaWYuYlZhcmlhYmxlUmF0ZSA9IDA7Ci0gICAgaFRwRW5jLT53cml0ZXIuYWRpZi5pbnN0YW5jZVRhZyA9IDA7Ci0gICAgYnJlYWs7CisgICAgY2FzZSBUVF9NUDRfQURUUzoKKyAgICAgIC8qIFNhbml0eSBjaGVja3MgKi8KKyAgICAgIGlmICgoaFRwRW5jLT5jb25maWcuYW90ICE9IEFPVF9BQUNfTEMpIHx8CisgICAgICAgICAgKGhUcEVuYy0+Y29uZmlnLnNhbXBsZXNQZXJGcmFtZSAhPSAxMDI0KSkgeworICAgICAgICByZXR1cm4gVFJBTlNQT1JURU5DX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgfQorICAgICAgaWYgKGFkdHNXcml0ZV9Jbml0KCZoVHBFbmMtPndyaXRlci5hZHRzLCAmaFRwRW5jLT5jb25maWcpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgVFRfTVA0X0FEVFM6Ci0gICAgLyogU2FuaXR5IGNoZWNrcyAqLwotICAgIGlmICggKCBoVHBFbmMtPmNvbmZpZy5hb3QgIT0gQU9UX0FBQ19MQykKLSAgICAgICB8fChoVHBFbmMtPmNvbmZpZy5zYW1wbGVzUGVyRnJhbWUgIT0gMTAyNCkgKQotICAgIHsKLSAgICAgIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9QQVJBTUVURVI7Ci0gICAgfQotICAgIGlmICggYWR0c1dyaXRlX0luaXQoJmhUcEVuYy0+d3JpdGVyLmFkdHMsICZoVHBFbmMtPmNvbmZpZykgIT0gMCkgewotICAgICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19JTlZBTElEX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBUVF9NUDRfTE9BUzoKLSAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgotICBjYXNlIFRUX01QNF9MQVRNX01DUDE6Ci0gICAgeworICAgIGNhc2UgVFRfTVA0X0xPQVM6CisgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgorICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMTogewogICAgICAgVFJBTlNQT1JURU5DX0VSUk9SIGVycm9yOwogCi0gICAgICBlcnJvciA9IHRyYW5zcG9ydEVuY19MYXRtX0luaXQoCi0gICAgICAgICAgICAgICAgJmhUcEVuYy0+d3JpdGVyLmxhdG0sCi0gICAgICAgICAgICAgICAgJmhUcEVuYy0+Yml0U3RyZWFtLAotICAgICAgICAgICAgICAgICZoVHBFbmMtPmNvbmZpZywKLSAgICAgICAgICAgICAgICAgZmxhZ3MgJiBUUF9GTEFHX0xBVE1fQU1WLAotICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGbXQsCi0gICAgICAgICAgICAgICAgJmhUcEVuYy0+Y2FsbGJhY2tzCi0gICAgICAgICAgICAgICAgICk7CisgICAgICBlcnJvciA9IHRyYW5zcG9ydEVuY19MYXRtX0luaXQoJmhUcEVuYy0+d3JpdGVyLmxhdG0sICZoVHBFbmMtPmJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFRwRW5jLT5jb25maWcsIGZsYWdzICYgVFBfRkxBR19MQVRNX0FNViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGbXQsICZoVHBFbmMtPmNhbGxiYWNrcyk7CiAgICAgICBpZiAoZXJyb3IgIT0gVFJBTlNQT1JURU5DX09LKSB7CiAgICAgICAgIHJldHVybiBlcnJvcjsKICAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7CisgICAgfSBicmVhazsKIAotICBjYXNlIFRUX01QNF9SQVc6Ci0gICAgaFRwRW5jLT53cml0ZXIucmF3LmN1clN1YkZyYW1lID0gMDsKLSAgICBoVHBFbmMtPndyaXRlci5yYXcublN1YkZyYW1lcyA9IGhUcEVuYy0+Y29uZmlnLm5TdWJGcmFtZXM7Ci0gICAgYnJlYWs7CisgICAgY2FzZSBUVF9NUDRfUkFXOgorICAgICAgaFRwRW5jLT53cml0ZXIucmF3LmN1clN1YkZyYW1lID0gMDsKKyAgICAgIGhUcEVuYy0+d3JpdGVyLnJhdy5uU3ViRnJhbWVzID0gaFRwRW5jLT5jb25maWcublN1YkZyYW1lczsKKyAgICAgIGJyZWFrOwogCi0KLQotICBkZWZhdWx0OgotICAgIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBUUkFOU1BPUlRFTkNfSU5WQUxJRF9QQVJBTUVURVI7CiAgIH0KIAogICAvKiBwY2VGcmFtZUNvdW50ZXIgaW5kaWNhdGVzIGlmIFBDRSBtdXN0IGJlIHdyaXR0ZW4gaW4gcmF3X2RhdGFfYmxvY2suICovCiAgIGhUcEVuYy0+cGNlRnJhbWVDb3VudGVyID0gZ2V0UGNlUmVwZXRpdGlvblJhdGUoCi0gICAgICAgICAgICAgICAgICAgIGdldENoYW5uZWxDb25maWcoaFRwRW5jLT5jb25maWcuY2hhbm5lbE1vZGUpLAotICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGbXQsCi0gICAgICAgICAgICAgICAgICAgIGhUcEVuYy0+Y29uZmlnLmhlYWRlclBlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgaFRwRW5jLT5jb25maWcubWF0cml4TWl4ZG93bkEpOworICAgICAgaFRwRW5jLT5jb25maWcuY2hhbm5lbE1vZGUsIGhUcEVuYy0+Y29uZmlnLmNoYW5uZWxDb25maWdaZXJvLAorICAgICAgdHJhbnNwb3J0Rm10LCBoVHBFbmMtPmNvbmZpZy5oZWFkZXJQZXJpb2QsIGhUcEVuYy0+Y29uZmlnLm1hdHJpeE1peGRvd25BKTsKIAogICByZXR1cm4gVFJBTlNQT1JURU5DX09LOwogfQogCi1IQU5ETEVfRkRLX0JJVFNUUkVBTSB0cmFuc3BvcnRFbmNfR2V0Qml0c3RyZWFtKCBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcCApCi17CitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0FkZE90aGVyRGF0YUJpdHMoSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG5CaXRzKSB7CisgIFRSQU5TUE9SVEVOQ19FUlJPUiB0cEVyciA9IFRSQU5TUE9SVEVOQ19PSzsKKworICBzd2l0Y2ggKGhUcEVuYy0+dHJhbnNwb3J0Rm10KSB7CisgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgorICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKKyAgICBjYXNlIFRUX01QNF9MT0FTOgorICAgICAgdHBFcnIgPSB0cmFuc3BvcnRFbmNfTGF0bUFkZE90aGVyRGF0YUJpdHMoJmhUcEVuYy0+d3JpdGVyLmxhdG0sIG5CaXRzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFRfTVA0X0FEVFM6CisgICAgY2FzZSBUVF9NUDRfQURJRjoKKyAgICBjYXNlIFRUX01QNF9SQVc6CisgICAgZGVmYXVsdDoKKyAgICAgIHRwRXJyID0gVFJBTlNQT1JURU5DX1VOS09XTl9FUlJPUjsKKyAgfQorCisgIHJldHVybiB0cEVycjsKK30KKworSEFORExFX0ZES19CSVRTVFJFQU0gdHJhbnNwb3J0RW5jX0dldEJpdHN0cmVhbShIQU5ETEVfVFJBTlNQT1JURU5DIGhUcCkgewogICByZXR1cm4gJmhUcC0+Yml0U3RyZWFtOwogfQogCi1pbnQgdHJhbnNwb3J0RW5jX1JlZ2lzdGVyU2JyQ2FsbGJhY2soIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLCBjb25zdCBjYlNicl90IGNiU2JyLCB2b2lkKiB1c2VyX2RhdGEpCi17CitpbnQgdHJhbnNwb3J0RW5jX1JlZ2lzdGVyU2JyQ2FsbGJhY2soSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2JTYnJfdCBjYlNiciwgdm9pZCAqdXNlcl9kYXRhKSB7CiAgIGlmIChoVHBFbmMgPT0gTlVMTCkgewogICAgIHJldHVybiAtMTsKICAgfQpAQCAtMzQyLDE1ICszNTcsMjkgQEAKICAgaFRwRW5jLT5jYWxsYmFja3MuY2JTYnJEYXRhID0gdXNlcl9kYXRhOwogICByZXR1cm4gMDsKIH0KK2ludCB0cmFuc3BvcnRFbmNfUmVnaXN0ZXJVc2FjQ2FsbGJhY2soSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNiVXNhY190IGNiVXNhYywgdm9pZCAqdXNlcl9kYXRhKSB7CisgIGlmIChoVHBFbmMgPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBoVHBFbmMtPmNhbGxiYWNrcy5jYlVzYWMgPSBjYlVzYWM7CisgIGhUcEVuYy0+Y2FsbGJhY2tzLmNiVXNhY0RhdGEgPSB1c2VyX2RhdGE7CisgIHJldHVybiAwOworfQogCitpbnQgdHJhbnNwb3J0RW5jX1JlZ2lzdGVyU3NjQ2FsbGJhY2soSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2JTc2NfdCBjYlNzYywgdm9pZCAqdXNlcl9kYXRhKSB7CisgIGlmIChoVHBFbmMgPT0gTlVMTCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBoVHBFbmMtPmNhbGxiYWNrcy5jYlNzYyA9IGNiU3NjOworICBoVHBFbmMtPmNhbGxiYWNrcy5jYlNzY0RhdGEgPSB1c2VyX2RhdGE7CisgIHJldHVybiAwOworfQogCi1UUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX1dyaXRlQWNjZXNzVW5pdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1RSQU5TUE9SVEVOQyBoVHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBmcmFtZVVzZWRCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyRnVsbG5lc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuY2MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CitUUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX1dyaXRlQWNjZXNzVW5pdChIQU5ETEVfVFJBTlNQT1JURU5DIGhUcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBmcmFtZVVzZWRCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlckZ1bGxuZXNzLCBpbnQgbmNjKSB7CiAgIFRSQU5TUE9SVEVOQ19FUlJPUiBlcnIgPSBUUkFOU1BPUlRFTkNfT0s7CiAKICAgaWYgKCFoVHApIHsKQEAgLTM1OSw0OCArMzg4LDQxIEBACiAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcyA9ICZoVHAtPmJpdFN0cmVhbTsKIAogICAvKiBJbiBjYXNlIG9mIHdyaXRpbmcgUENFIGluIHJhd19kYXRhX2Jsb2NrIGZyYW1lVXNlZEJpdHMgbXVzdCBiZSBhZGFwdGVkLiAqLwotICBpZiAoaFRwLT5wY2VGcmFtZUNvdW50ZXI+PWhUcC0+Y29uZmlnLmhlYWRlclBlcmlvZCkgewotICAgIGZyYW1lVXNlZEJpdHMgKz0gdHJhbnNwb3J0RW5jX0dldFBDRUJpdHMoaFRwLT5jb25maWcuY2hhbm5lbE1vZGUsIGhUcC0+Y29uZmlnLm1hdHJpeE1peGRvd25BLCAzKTsgLyogQ29uc2lkZXIgMyBiaXRzIElEIHNpZ25hbGxpbmcgaW4gYWxpZ25tZW50ICovCisgIGlmIChoVHAtPnBjZUZyYW1lQ291bnRlciA+PSBoVHAtPmNvbmZpZy5oZWFkZXJQZXJpb2QpIHsKKyAgICBmcmFtZVVzZWRCaXRzICs9IHRyYW5zcG9ydEVuY19HZXRQQ0VCaXRzKAorICAgICAgICBoVHAtPmNvbmZpZy5jaGFubmVsTW9kZSwgaFRwLT5jb25maWcubWF0cml4TWl4ZG93bkEsCisgICAgICAgIDMpOyAvKiBDb25zaWRlciAzIGJpdHMgSUQgc2lnbmFsbGluZyBpbiBhbGlnbm1lbnQgKi8KICAgfQogCiAgIHN3aXRjaCAoaFRwLT50cmFuc3BvcnRGbXQpIHsKICAgICBjYXNlIFRUX01QNF9BRElGOgotICAgICAgRkRLaW5pdEJpdFN0cmVhbSgmaFRwLT5iaXRTdHJlYW0sIGhUcC0+YnNCdWZmZXIsIGhUcC0+YnNCdWZmZXJTaXplLCAwLCBCU19XUklURVIpOwotICAgICAgYWRpZldyaXRlX0VuY29kZUhlYWRlcigKLSAgICAgICAgICAgICAmaFRwLT53cml0ZXIuYWRpZiwKLSAgICAgICAgICAgICAgaEJzLAotICAgICAgICAgICAgICBidWZmZXJGdWxsbmVzcwotICAgICAgICAgICAgICApOworICAgICAgRkRLaW5pdEJpdFN0cmVhbSgmaFRwLT5iaXRTdHJlYW0sIGhUcC0+YnNCdWZmZXIsIGhUcC0+YnNCdWZmZXJTaXplLCAwLAorICAgICAgICAgICAgICAgICAgICAgICBCU19XUklURVIpOworICAgICAgaWYgKDAgIT0gYWRpZldyaXRlX0VuY29kZUhlYWRlcigmaFRwLT53cml0ZXIuYWRpZiwgaEJzLCBidWZmZXJGdWxsbmVzcykpIHsKKyAgICAgICAgZXJyID0gVFJBTlNQT1JURU5DX0lOVkFMSURfQ09ORklHOworICAgICAgfQogICAgICAgYnJlYWs7CiAgICAgY2FzZSBUVF9NUDRfQURUUzoKLSAgICAgIGJ1ZmZlckZ1bGxuZXNzIC89IG5jYzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBDb25zaWRlcmVkIENoYW5uZWxzICovCisgICAgICBidWZmZXJGdWxsbmVzcyAvPSBuY2M7IC8qIE51bWJlciBvZiBDb25zaWRlcmVkIENoYW5uZWxzICovCiAgICAgICBidWZmZXJGdWxsbmVzcyAvPSAzMjsKICAgICAgIGJ1ZmZlckZ1bGxuZXNzID0gRkRLbWluKDB4N0ZGLCBidWZmZXJGdWxsbmVzcyk7IC8qIFNpZ25hbCB2YXJpYWJsZSByYXRlICovCi0gICAgICBhZHRzV3JpdGVfRW5jb2RlSGVhZGVyKAotICAgICAgICAgICAgICZoVHAtPndyaXRlci5hZHRzLAotICAgICAgICAgICAgICZoVHAtPmJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgYnVmZmVyRnVsbG5lc3MsCi0gICAgICAgICAgICAgIGZyYW1lVXNlZEJpdHMKLSAgICAgICAgICAgICAgKTsKKyAgICAgIGFkdHNXcml0ZV9FbmNvZGVIZWFkZXIoJmhUcC0+d3JpdGVyLmFkdHMsICZoVHAtPmJpdFN0cmVhbSwgYnVmZmVyRnVsbG5lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lVXNlZEJpdHMpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBUVF9NUDRfTE9BUzoKICAgICBjYXNlIFRUX01QNF9MQVRNX01DUDA6CiAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AxOgotICAgICAgYnVmZmVyRnVsbG5lc3MgLz0gbmNjOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgQ29uc2lkZXJlZCBDaGFubmVscyAqLworICAgICAgYnVmZmVyRnVsbG5lc3MgLz0gbmNjOyAvKiBOdW1iZXIgb2YgQ29uc2lkZXJlZCBDaGFubmVscyAqLwogICAgICAgYnVmZmVyRnVsbG5lc3MgLz0gMzI7CiAgICAgICBidWZmZXJGdWxsbmVzcyA9IEZES21pbigweEZGLCBidWZmZXJGdWxsbmVzcyk7IC8qIFNpZ25hbCB2YXJpYWJsZSByYXRlICovCi0gICAgICB0cmFuc3BvcnRFbmNfTGF0bVdyaXRlKAotICAgICAgICAgICAgICZoVHAtPndyaXRlci5sYXRtLAotICAgICAgICAgICAgICBoQnMsCi0gICAgICAgICAgICAgIGZyYW1lVXNlZEJpdHMsCi0gICAgICAgICAgICAgIGJ1ZmZlckZ1bGxuZXNzLAotICAgICAgICAgICAgICZoVHAtPmNhbGxiYWNrcwotICAgICAgICAgICAgICApOwotICAgIGJyZWFrOworICAgICAgdHJhbnNwb3J0RW5jX0xhdG1Xcml0ZSgmaFRwLT53cml0ZXIubGF0bSwgaEJzLCBmcmFtZVVzZWRCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJGdWxsbmVzcywgJmhUcC0+Y2FsbGJhY2tzKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgVFRfTVA0X1JBVzoKICAgICAgIGlmIChoVHAtPndyaXRlci5yYXcuY3VyU3ViRnJhbWUgPj0gaFRwLT53cml0ZXIucmF3Lm5TdWJGcmFtZXMpIHsKICAgICAgICAgaFRwLT53cml0ZXIucmF3LmN1clN1YkZyYW1lID0gMDsKLSAgICAgICAgRkRLaW5pdEJpdFN0cmVhbSgmaFRwLT5iaXRTdHJlYW0sIGhUcC0+YnNCdWZmZXIsIGhUcC0+YnNCdWZmZXJTaXplLCAwLCBCU19XUklURVIpOworICAgICAgICBGREtpbml0Qml0U3RyZWFtKCZoVHAtPmJpdFN0cmVhbSwgaFRwLT5ic0J1ZmZlciwgaFRwLT5ic0J1ZmZlclNpemUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQlNfV1JJVEVSKTsKICAgICAgIH0KICAgICAgIGhUcC0+d3JpdGVyLnJhdy5wcmV2Qml0cyA9IEZES2dldFZhbGlkQml0cyhoQnMpOwogICAgICAgYnJlYWs7CkBAIC00MTAsNyArNDMyLDcgQEAKICAgfQogCiAgIC8qIFdyaXRlIFBDRSBpbiByYXdfZGF0YV9ibG9jayBpZiByZXF1aXJlZCAqLwotICBpZiAoaFRwLT5wY2VGcmFtZUNvdW50ZXI+PWhUcC0+Y29uZmlnLmhlYWRlclBlcmlvZCkgeworICBpZiAoaFRwLT5wY2VGcmFtZUNvdW50ZXIgPj0gaFRwLT5jb25maWcuaGVhZGVyUGVyaW9kKSB7CiAgICAgSU5UIGNyY0luZGV4ID0gMDsKICAgICAvKiBBbGlnbiBpbnNpZGUgUENFIHdpdGggcmVwc2VjdCB0byB0aGUgZmlyc3QgYml0IG9mIHRoZSByYXdfZGF0YV9ibG9jaygpICovCiAgICAgVUlOVCBhbGlnbkFuY2hvciA9IEZES2dldFZhbGlkQml0cygmaFRwLT5iaXRTdHJlYW0pOwpAQCAtNDE4LDI5ICs0NDAsMzQgQEAKICAgICAvKiBXcml0ZSBQQ0UgZWxlbWVudCBJRCBiaXRzICovCiAgICAgRkRLd3JpdGVCaXRzKCZoVHAtPmJpdFN0cmVhbSwgSURfUENFLCAzKTsKIAotICAgIGlmICggKGhUcC0+dHJhbnNwb3J0Rm10PT1UVF9NUDRfQURUUykgJiYgIWhUcC0+d3JpdGVyLmFkdHMucHJvdGVjdGlvbl9hYnNlbnQpIHsKKyAgICBpZiAoKGhUcC0+dHJhbnNwb3J0Rm10ID09IFRUX01QNF9BRFRTKSAmJgorICAgICAgICAhaFRwLT53cml0ZXIuYWR0cy5wcm90ZWN0aW9uX2Fic2VudCkgewogICAgICAgY3JjSW5kZXggPSBhZHRzV3JpdGVfQ3JjU3RhcnRSZWcoJmhUcC0+d3JpdGVyLmFkdHMsICZoVHAtPmJpdFN0cmVhbSwgMCk7CiAgICAgfQogCiAgICAgLyogV3JpdGUgUENFIGFzIGZpcnN0IHJhd19kYXRhX2Jsb2NrIGVsZW1lbnQgKi8KLSAgICB0cmFuc3BvcnRFbmNfd3JpdGVQQ0UoJmhUcC0+Yml0U3RyZWFtLCBoVHAtPmNvbmZpZy5jaGFubmVsTW9kZSwgaFRwLT5jb25maWcuc2FtcGxpbmdSYXRlLCAwLCAxLCBoVHAtPmNvbmZpZy5tYXRyaXhNaXhkb3duQSwgKGhUcC0+Y29uZmlnLmZsYWdzJkNDX1BTRVVET19TVVJST1VORCk/MTowLCBhbGlnbkFuY2hvcik7CisgICAgdHJhbnNwb3J0RW5jX3dyaXRlUENFKAorICAgICAgICAmaFRwLT5iaXRTdHJlYW0sIGhUcC0+Y29uZmlnLmNoYW5uZWxNb2RlLCBoVHAtPmNvbmZpZy5zYW1wbGluZ1JhdGUsIDAsCisgICAgICAgIDEsIGhUcC0+Y29uZmlnLm1hdHJpeE1peGRvd25BLAorICAgICAgICAoaFRwLT5jb25maWcuZmxhZ3MgJiBDQ19QU0VVRE9fU1VSUk9VTkQpID8gMSA6IDAsIGFsaWduQW5jaG9yKTsKIAotICAgIGlmICggKGhUcC0+dHJhbnNwb3J0Rm10PT1UVF9NUDRfQURUUykgJiYgIWhUcC0+d3JpdGVyLmFkdHMucHJvdGVjdGlvbl9hYnNlbnQpIHsKKyAgICBpZiAoKGhUcC0+dHJhbnNwb3J0Rm10ID09IFRUX01QNF9BRFRTKSAmJgorICAgICAgICAhaFRwLT53cml0ZXIuYWR0cy5wcm90ZWN0aW9uX2Fic2VudCkgewogICAgICAgYWR0c1dyaXRlX0NyY0VuZFJlZygmaFRwLT53cml0ZXIuYWR0cywgJmhUcC0+Yml0U3RyZWFtLCBjcmNJbmRleCk7CiAgICAgfQogICAgIGhUcC0+cGNlRnJhbWVDb3VudGVyID0gMDsgLyogcmVzZXQgcGNlIGZyYW1lIGNvdW50ZXIgKi8KICAgfQogCi0gIGlmIChoVHAtPnBjZUZyYW1lQ291bnRlciE9LTEpIHsKLSAgICBoVHAtPnBjZUZyYW1lQ291bnRlcisrOyAvKiBVcGRhdGUgcGNlRnJhbWVDb3VudGVyIG9ubHkgaWYgUENFIHdyaXRpbmcgaXMgYWN0aXZlLiAqLworICBpZiAoaFRwLT5wY2VGcmFtZUNvdW50ZXIgIT0gLTEpIHsKKyAgICBoVHAtPnBjZUZyYW1lQ291bnRlcisrOyAvKiBVcGRhdGUgcGNlRnJhbWVDb3VudGVyIG9ubHkgaWYgUENFIHdyaXRpbmcgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUuICovCiAgIH0KIAogICByZXR1cm4gZXJyOwogfQogCi0KLVRSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfRW5kQWNjZXNzVW5pdChIQU5ETEVfVFJBTlNQT1JURU5DIGhUcCwgaW50ICpiaXRzKQoteworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19FbmRBY2Nlc3NVbml0KEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYml0cykgewogICBzd2l0Y2ggKGhUcC0+dHJhbnNwb3J0Rm10KSB7CiAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AwOgogICAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKQEAgLTQ2NSw4ICs0OTIsOSBAQAogICByZXR1cm4gVFJBTlNQT1JURU5DX09LOwogfQogCi1UUkFOU1BPUlRFTkNfRVJST1IgdHJhbnNwb3J0RW5jX0dldEZyYW1lKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLCBpbnQgKm5ieXRlcykKLXsKK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfR2V0RnJhbWUoSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbmJ5dGVzKSB7CisgIFRSQU5TUE9SVEVOQ19FUlJPUiB0cEVyciA9IFRSQU5TUE9SVEVOQ19PSzsKICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzID0gJmhUcEVuYy0+Yml0U3RyZWFtOwogCiAgIHN3aXRjaCAoaFRwRW5jLT50cmFuc3BvcnRGbXQpIHsKQEAgLTQ3NCwxMSArNTAyLDEyIEBACiAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AxOgogICAgIGNhc2UgVFRfTVA0X0xPQVM6CiAgICAgICAqbmJ5dGVzID0gaFRwRW5jLT5ic0J1ZmZlclNpemU7Ci0gICAgICB0cmFuc3BvcnRFbmNfTGF0bUdldEZyYW1lKCZoVHBFbmMtPndyaXRlci5sYXRtLCBoQnMsIG5ieXRlcyk7CisgICAgICB0cEVyciA9IHRyYW5zcG9ydEVuY19MYXRtR2V0RnJhbWUoJmhUcEVuYy0+d3JpdGVyLmxhdG0sIGhCcywgbmJ5dGVzKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgVFRfTVA0X0FEVFM6Ci0gICAgICBpZiAoaFRwRW5jLT53cml0ZXIuYWR0cy5jdXJyZW50QmxvY2sgPj0gaFRwRW5jLT53cml0ZXIuYWR0cy5udW1fcmF3X2Jsb2NrcysxKSB7Ci0gICAgICAgICpuYnl0ZXMgPSAoRkRLZ2V0VmFsaWRCaXRzKGhCcykgKyA3KT4+MzsKKyAgICAgIGlmIChoVHBFbmMtPndyaXRlci5hZHRzLmN1cnJlbnRCbG9jayA+PQorICAgICAgICAgIGhUcEVuYy0+d3JpdGVyLmFkdHMubnVtX3Jhd19ibG9ja3MgKyAxKSB7CisgICAgICAgICpuYnl0ZXMgPSAoRkRLZ2V0VmFsaWRCaXRzKGhCcykgKyA3KSA+PiAzOwogICAgICAgICBoVHBFbmMtPndyaXRlci5hZHRzLmN1cnJlbnRCbG9jayA9IDA7CiAgICAgICB9IGVsc2UgewogICAgICAgICAqbmJ5dGVzID0gMDsKQEAgLTQ4NiwyOCArNTE1LDMxIEBACiAgICAgICBicmVhazsKICAgICBjYXNlIFRUX01QNF9BRElGOgogICAgICAgRkRLX0FTU0VSVCgoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpID49IDApOwotICAgICAgKm5ieXRlcyA9IChGREtnZXRWYWxpZEJpdHMoaEJzKSArIDcpPj4zOworICAgICAgKm5ieXRlcyA9IChGREtnZXRWYWxpZEJpdHMoaEJzKSArIDcpID4+IDM7CiAgICAgICBicmVhazsKICAgICBjYXNlIFRUX01QNF9SQVc6CiAgICAgICBGREtzeW5jQ2FjaGUoaEJzKTsKICAgICAgIGhUcEVuYy0+d3JpdGVyLnJhdy5jdXJTdWJGcmFtZSsrOwotICAgICAgKm5ieXRlcyA9ICgoRkRLZ2V0VmFsaWRCaXRzKGhCcyktaFRwRW5jLT53cml0ZXIucmF3LnByZXZCaXRzKSArIDcpPj4zOworICAgICAgKm5ieXRlcyA9ICgoRkRLZ2V0VmFsaWRCaXRzKGhCcykgLSBoVHBFbmMtPndyaXRlci5yYXcucHJldkJpdHMpICsgNykgPj4gMzsKICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICBicmVhazsKICAgfQogCi0gIHJldHVybiBUUkFOU1BPUlRFTkNfT0s7CisgIHJldHVybiB0cEVycjsKIH0KIAotSU5UIHRyYW5zcG9ydEVuY19HZXRTdGF0aWNCaXRzKCBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcCwgaW50IGF1Qml0cyApCi17CitJTlQgdHJhbnNwb3J0RW5jX0dldFN0YXRpY0JpdHMoSEFORExFX1RSQU5TUE9SVEVOQyBoVHAsIGludCBhdUJpdHMpIHsKICAgSU5UIG5iaXRzID0gMCwgblBjZUJpdHMgPSAwOwogCiAgIC8qIFdyaXRlIFBDRSB3aXRoaW4gcmF3X2RhdGFfYmxvY2sgaW4gdHJhbnNwb3J0IGxpYi4gKi8KLSAgaWYgKGhUcC0+cGNlRnJhbWVDb3VudGVyPj1oVHAtPmNvbmZpZy5oZWFkZXJQZXJpb2QpIHsKLSAgICBuUGNlQml0cyA9IHRyYW5zcG9ydEVuY19HZXRQQ0VCaXRzKGhUcC0+Y29uZmlnLmNoYW5uZWxNb2RlLCBoVHAtPmNvbmZpZy5tYXRyaXhNaXhkb3duQSwgMyk7IC8qIENvbnNpZGVyIDMgYml0cyBJRCBzaWduYWxsaW5nIGluIGFsaWdubWVudCAqLwotICAgIGF1Qml0cyArPSBuUGNlQml0czsgLyogQWRhcHQgcmVxdWlyZWQgcmF3X2RhdGFfYmxvY2sgYml0IGNvbnN1bXRwaW9uIGZvciBBVSBsZW5ndGggaW5mb3JtYXRpb24gZS5nLiBpbiBMQVRNL0xPQVMgY29uZmlndXJhdGlvbi4gKi8KKyAgaWYgKGhUcC0+cGNlRnJhbWVDb3VudGVyID49IGhUcC0+Y29uZmlnLmhlYWRlclBlcmlvZCkgeworICAgIG5QY2VCaXRzID0gdHJhbnNwb3J0RW5jX0dldFBDRUJpdHMoCisgICAgICAgIGhUcC0+Y29uZmlnLmNoYW5uZWxNb2RlLCBoVHAtPmNvbmZpZy5tYXRyaXhNaXhkb3duQSwKKyAgICAgICAgMyk7ICAgICAgICAgICAgIC8qIENvbnNpZGVyIDMgYml0cyBJRCBzaWduYWxsaW5nIGluIGFsaWdubWVudCAqLworICAgIGF1Qml0cyArPSBuUGNlQml0czsgLyogQWRhcHQgcmVxdWlyZWQgcmF3X2RhdGFfYmxvY2sgYml0IGNvbnN1bXRwaW9uIGZvciBBVQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIGluZm9ybWF0aW9uIGUuZy4gaW4gTEFUTS9MT0FTIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgfQogCiAgIHN3aXRjaCAoaFRwLT50cmFuc3BvcnRGbXQpIHsKQEAgLTUyMSw3MyArNTUzLDcwIEBACiAgICAgY2FzZSBUVF9NUDRfTE9BUzoKICAgICBjYXNlIFRUX01QNF9MQVRNX01DUDA6CiAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AxOgotICAgICAgbmJpdHMgPSB0cmFuc3BvcnRFbmNfTGF0bUNvdW50VG90YWxCaXREZW1hbmRIZWFkZXIoICZoVHAtPndyaXRlci5sYXRtLCBhdUJpdHMgKTsKKyAgICAgIG5iaXRzID0KKyAgICAgICAgICB0cmFuc3BvcnRFbmNfTGF0bUNvdW50VG90YWxCaXREZW1hbmRIZWFkZXIoJmhUcC0+d3JpdGVyLmxhdG0sIGF1Qml0cyk7CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgbmJpdHMgPSAwOwogICAgICAgYnJlYWs7CiAgIH0KIAotICAvKiBQQ0UgaXMgd3JpdHRlbiBpbiB0aGUgdHJhbnNwb3J0IGxpYnJhcnkgdGhlcmVmb3JlIHRoZSBiaXQgY29uc3VtcHRpb24gaXMgcGFydCBvZiB0aGUgdHJhbnNwb3J0IHN0YXRpYyBiaXRzLiAqLworICAvKiBQQ0UgaXMgd3JpdHRlbiBpbiB0aGUgdHJhbnNwb3J0IGxpYnJhcnkgdGhlcmVmb3JlIHRoZSBiaXQgY29uc3VtcHRpb24gaXMKKyAgICogcGFydCBvZiB0aGUgdHJhbnNwb3J0IHN0YXRpYyBiaXRzLiAqLwogICBuYml0cyArPSBuUGNlQml0czsKIAogICByZXR1cm4gbmJpdHM7CiB9CiAKLXZvaWQgdHJhbnNwb3J0RW5jX0Nsb3NlKEhBTkRMRV9UUkFOU1BPUlRFTkMgKnBoVHApCi17Ci0gIGlmIChwaFRwICE9IE5VTEwpCi0gIHsKK3ZvaWQgdHJhbnNwb3J0RW5jX0Nsb3NlKEhBTkRMRV9UUkFOU1BPUlRFTkMgKnBoVHApIHsKKyAgaWYgKHBoVHAgIT0gTlVMTCkgewogICAgIGlmICgqcGhUcCAhPSBOVUxMKSB7CiAgICAgICBGcmVlUmFtX1RyYW5zcG9ydEVuY29kZXIocGhUcCk7CiAgICAgfQogICB9CiB9CiAKLWludCB0cmFuc3BvcnRFbmNfQ3JjU3RhcnRSZWcoSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsIGludCBtQml0cykKLXsKK2ludCB0cmFuc3BvcnRFbmNfQ3JjU3RhcnRSZWcoSEFORExFX1RSQU5TUE9SVEVOQyBoVHBFbmMsIGludCBtQml0cykgewogICBpbnQgY3JjUmVnID0gMDsKIAogICBzd2l0Y2ggKGhUcEVuYy0+dHJhbnNwb3J0Rm10KSB7Ci0gIGNhc2UgVFRfTVA0X0FEVFM6Ci0gICAgY3JjUmVnID0gYWR0c1dyaXRlX0NyY1N0YXJ0UmVnKCZoVHBFbmMtPndyaXRlci5hZHRzLCAmaFRwRW5jLT5iaXRTdHJlYW0sIG1CaXRzKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBicmVhazsKKyAgICBjYXNlIFRUX01QNF9BRFRTOgorICAgICAgY3JjUmVnID0gYWR0c1dyaXRlX0NyY1N0YXJ0UmVnKCZoVHBFbmMtPndyaXRlci5hZHRzLCAmaFRwRW5jLT5iaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJpdHMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOwogICB9CiAKICAgcmV0dXJuIGNyY1JlZzsKIH0KIAotdm9pZCB0cmFuc3BvcnRFbmNfQ3JjRW5kUmVnKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLCBpbnQgcmVnKQotewordm9pZCB0cmFuc3BvcnRFbmNfQ3JjRW5kUmVnKEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLCBpbnQgcmVnKSB7CiAgIHN3aXRjaCAoaFRwRW5jLT50cmFuc3BvcnRGbXQpIHsKLSAgY2FzZSBUVF9NUDRfQURUUzoKLSAgICBhZHRzV3JpdGVfQ3JjRW5kUmVnKCZoVHBFbmMtPndyaXRlci5hZHRzLCAmaFRwRW5jLT5iaXRTdHJlYW0sIHJlZyk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgYnJlYWs7CisgICAgY2FzZSBUVF9NUDRfQURUUzoKKyAgICAgIGFkdHNXcml0ZV9DcmNFbmRSZWcoJmhUcEVuYy0+d3JpdGVyLmFkdHMsICZoVHBFbmMtPmJpdFN0cmVhbSwgcmVnKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKICAgfQogfQogCi0KLVRSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfR2V0Q29uZihIQU5ETEVfVFJBTlNQT1JURU5DICBoVHBFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERVJfQ09ORklHICAgICAgICAqY2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLX0JJVFNUUkVBTSAgICAgICAqZGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICpjb25mVHlwZSkKLXsKK1RSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfR2V0Q29uZihIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFUl9DT05GSUcgKmNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES19CSVRTVFJFQU0gKmRhdGFCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqY29uZlR5cGUpIHsKICAgVFJBTlNQT1JURU5DX0VSUk9SIHRwRXJyID0gVFJBTlNQT1JURU5DX09LOwogICBIQU5ETEVfTEFUTV9TVFJFQU0gaExhdG1Db25maWcgPSAmaFRwRW5jLT53cml0ZXIubGF0bTsKIAogICAqY29uZlR5cGUgPSAwOyAvKiBzZXQgY29uZlR5cGUgdmFyaWFibGUgdG8gZGVmYXVsdCAqLwogCiAgIC8qIHdyaXRlIFN0cmVhbU11eENvbmZpZyBvciBBdWRpb1NwZWNpZmljQ29uZmlnIGRlcGVuZGluZyBvbiBmb3JtYXQgdXNlZCAqLwotICBzd2l0Y2ggKGhUcEVuYy0+dHJhbnNwb3J0Rm10KQotICB7CisgIHN3aXRjaCAoaFRwRW5jLT50cmFuc3BvcnRGbXQpIHsKICAgICBjYXNlIFRUX01QNF9MQVRNX01DUDA6CiAgICAgY2FzZSBUVF9NUDRfTEFUTV9NQ1AxOgogICAgIGNhc2UgVFRfTVA0X0xPQVM6Ci0gICAgICB0cEVyciA9IENyZWF0ZVN0cmVhbU11eENvbmZpZyhoTGF0bUNvbmZpZywgZGF0YUJ1ZmZlciwgMCwgJmhUcEVuYy0+Y2FsbGJhY2tzKTsKKyAgICAgIHRwRXJyID0KKyAgICAgICAgICBDcmVhdGVTdHJlYW1NdXhDb25maWcoaExhdG1Db25maWcsIGRhdGFCdWZmZXIsIDAsICZoVHBFbmMtPmNhbGxiYWNrcyk7CiAgICAgICAqY29uZlR5cGUgPSAxOyAvKiBjb25maWcgaXMgU01DICovCiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgpAQCAtNTk3LDExICs2MjYsOSBAQAogICB9CiAKICAgcmV0dXJuIHRwRXJyOwotCiB9CiAKLVRSQU5TUE9SVEVOQ19FUlJPUiB0cmFuc3BvcnRFbmNfR2V0TGliSW5mbyggTElCX0lORk8gKmluZm8gKQoteworVFJBTlNQT1JURU5DX0VSUk9SIHRyYW5zcG9ydEVuY19HZXRMaWJJbmZvKExJQl9JTkZPICppbmZvKSB7CiAgIGludCBpOwogCiAgIGlmIChpbmZvID09IE5VTEwpIHsKQEAgLTYyOSwxNCArNjU2LDggQEAKICAgaW5mby0+dGl0bGUgPSBUUF9MSUJfVElUTEU7CiAKICAgLyogU2V0IGZsYWdzICovCi0gIGluZm8tPmZsYWdzID0gMAotICAgIHwgQ0FQRl9BRElGCi0gICAgfCBDQVBGX0FEVFMKLSAgICB8IENBUEZfTEFUTQotICAgIHwgQ0FQRl9MT0FTCi0gICAgfCBDQVBGX1JBV1BBQ0tFVFMKLSAgICA7CisgIGluZm8tPmZsYWdzID0KKyAgICAgIDAgfCBDQVBGX0FESUYgfCBDQVBGX0FEVFMgfCBDQVBGX0xBVE0gfCBDQVBGX0xPQVMgfCBDQVBGX1JBV1BBQ0tFVFM7CiAKICAgcmV0dXJuIFRSQU5TUE9SVEVOQ19PSzsKIH0KLQpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRW5jL3NyYy92ZXJzaW9uIGIvbGliTXBlZ1RQRW5jL3NyYy92ZXJzaW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzQyNTY4Li4wMDAwMDAwCi0tLSBhL2xpYk1wZWdUUEVuYy9zcmMvdmVyc2lvbgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotLyogbGlicmFyeSBpbmZvICovCi0jZGVmaW5lIFRQX0xJQl9WTDAgMgotI2RlZmluZSBUUF9MSUJfVkwxIDMKLSNkZWZpbmUgVFBfTElCX1ZMMiA2Ci0jZGVmaW5lIFRQX0xJQl9USVRMRSAiTVBFRyBUcmFuc3BvcnQiCi0jaWZkZWYgX19BTkRST0lEX18KLSNkZWZpbmUgVFBfTElCX0JVSUxEX0RBVEUgIiIKLSNkZWZpbmUgVFBfTElCX0JVSUxEX1RJTUUgIiIKLSNlbHNlCi0jZGVmaW5lIFRQX0xJQl9CVUlMRF9EQVRFIF9fREFURV9fCi0jZGVmaW5lIFRQX0xJQl9CVUlMRF9USU1FIF9fVElNRV9fCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYlBDTXV0aWxzL2luY2x1ZGUvbGltaXRlci5oIGIvbGliUENNdXRpbHMvaW5jbHVkZS9saW1pdGVyLmgKaW5kZXggMGQzZDcwMS4uZmFiNzIyNiAxMDA2NDQKLS0tIGEvbGliUENNdXRpbHMvaW5jbHVkZS9saW1pdGVyLmgKKysrIGIvbGliUENNdXRpbHMvaW5jbHVkZS9saW1pdGVyLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMzQgKzkwLDUzIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKiAgRkRLIFBDTSBwb3N0cHJvY2Vzc29yIG1vZHVsZSAgKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQQ00gdXRpbGl0eSBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgTWF0dGhpYXMgTmV1c2luZ2VyCisKICAgIERlc2NyaXB0aW9uOiBIYXJkIGxpbWl0ZXIgZm9yIGNsaXBwaW5nIHByZXZlbnRpb24KIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfTElNSVRFUl9IXwotI2RlZmluZSBfTElNSVRFUl9IXwotCisjaWZuZGVmIExJTUlURVJfSAorI2RlZmluZSBMSU1JVEVSX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKyNpbmNsdWRlICJGREtfYXVkaW8uaCIKIAotI2RlZmluZSBURExfQVRUQUNLX0RFRkFVTFRfTVMgICAgICAoMTUpICAgICAgICAgICAgICAvKiBkZWZhdWx0IGF0dGFjayAgdGltZSBpbiBtcyAqLwotI2RlZmluZSBURExfUkVMRUFTRV9ERUZBVUxUX01TICAgICAoNTApICAgICAgICAgICAgICAvKiBkZWZhdWx0IHJlbGVhc2UgdGltZSBpbiBtcyAqLworI2RlZmluZSBURExfQVRUQUNLX0RFRkFVTFRfTVMgKDE1KSAgLyogZGVmYXVsdCBhdHRhY2sgIHRpbWUgaW4gbXMgKi8KKyNkZWZpbmUgVERMX1JFTEVBU0VfREVGQVVMVF9NUyAoNTApIC8qIGRlZmF1bHQgcmVsZWFzZSB0aW1lIGluIG1zICovCiAKLSNkZWZpbmUgVERMX0dBSU5fU0NBTElORyAgICAgICAgICAgKDE1KSAgICAgICAgICAgICAgLyogc2NhbGluZyBvZiBnYWluIHZhbHVlLiAqLwotCisjZGVmaW5lIFRETF9HQUlOX1NDQUxJTkcgKDE1KSAvKiBzY2FsaW5nIG9mIGdhaW4gdmFsdWUuICovCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAorc3RydWN0IFRETGltaXRlciB7CisgIHVuc2lnbmVkIGludCBhdHRhY2s7CisgIEZJWFBfREJMIGF0dGFja0NvbnN0LCByZWxlYXNlQ29uc3Q7CisgIHVuc2lnbmVkIGludCBhdHRhY2tNcywgcmVsZWFzZU1zLCBtYXhBdHRhY2tNczsKKyAgRklYUF9EQkwgdGhyZXNob2xkOworICB1bnNpZ25lZCBpbnQgY2hhbm5lbHMsIG1heENoYW5uZWxzOworICBVSU5UIHNhbXBsZVJhdGUsIG1heFNhbXBsZVJhdGU7CisgIEZJWFBfREJMIGNvciwgbWF4OworICBGSVhQX0RCTCogbWF4QnVmOworICBGSVhQX0RCTCogZGVsYXlCdWY7CisgIHVuc2lnbmVkIGludCBtYXhCdWZJZHgsIGRlbGF5QnVmSWR4OworICBGSVhQX0RCTCBzbW9vdGhTdGF0ZTA7CisgIEZJWFBfREJMIG1pbkdhaW47CisKKyAgRklYUF9EQkwgYWRkaXRpb25hbEdhaW5QcmV2OworICBGSVhQX0RCTCBhZGRpdGlvbmFsR2FpbkZpbHRlclN0YXRlOworICBGSVhQX0RCTCBhZGRpdGlvbmFsR2FpbkZpbHRlclN0YXRlMTsKK307CiAKIHR5cGVkZWYgZW51bSB7CiAgIFRETElNSVRfT0sgPSAwLAorICBURExJTUlUX1VOS05PV04gPSAtMSwKIAogICBfX2Vycm9yX2NvZGVzX3N0YXJ0ID0gLTEwMCwKIApAQCAtMTE5LDExNSArMTQ5LDEzMyBAQAogc3RydWN0IFRETGltaXRlcjsKIHR5cGVkZWYgc3RydWN0IFRETGltaXRlciogVERMaW1pdGVyUHRyOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIGNyZWF0ZUxpbWl0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIG1heEF0dGFja01zOiAgIG1heGltdW0gYW5kIGluaXRpYWwgYXR0YWNrL2xvb2thaGVhZCB0aW1lIGluIG1pbGxpc2Vjb25kcyAgICAqCi0qIHJlbGVhc2VNczogICAgIHJlbGVhc2UgdGltZSBpbiBtaWxsaXNlY29uZHMgKDkwJSB0aW1lIGNvbnN0YW50KSAgICAgICAgICAgICAqCi0qIHRocmVzaG9sZDogICAgIGxpbWl0aW5nIHRocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIG1heENoYW5uZWxzOiAgIG1heGltdW0gYW5kIGluaXRpYWwgbnVtYmVyIG9mIGNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgICAqCi0qIG1heFNhbXBsZVJhdGU6IG1heGltdW0gYW5kIGluaXRpYWwgc2FtcGxpbmcgcmF0ZSBpbiBIeiAgICAgICAgICAgICAgICAgICAgICAqCi0qIHJldHVybnM6ICAgICAgIGxpbWl0ZXIgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1URExpbWl0ZXJQdHIgY3JlYXRlTGltaXRlcih1bnNpZ25lZCBpbnQgIG1heEF0dGFja01zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICByZWxlYXNlTXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAgICAgIHRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgbWF4Q2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIG1heFNhbXBsZVJhdGUpOworI2RlZmluZSBQQ01fTElNIExPTkcKKyNkZWZpbmUgRklYUF9EQkwyUENNX0xJTSh4KSAoeCkKKyNkZWZpbmUgUENNX0xJTTJGSVhQX0RCTCh4KSAoeCkKKyNkZWZpbmUgUENNX0xJTV9CSVRTIDMyCisjZGVmaW5lIEZJWFBfUENNX0xJTSBGSVhQX0RCTAogCisjZGVmaW5lIFNBTVBMRV9CSVRTX0xJTSBERlJBQ1RfQklUUwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIHJlc2V0TGltaXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIGxpbWl0ZXI6IGxpbWl0ZXIgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIHJldHVybnM6IGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1URExJTUlURVJfRVJST1IgcmVzZXRMaW1pdGVyKFRETGltaXRlclB0ciBsaW1pdGVyKTsKLQorICogcGNtTGltaXRlcl9SZXNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIGxpbWl0ZXI6IGxpbWl0ZXIgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiByZXR1cm5zOiBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1RETElNSVRFUl9FUlJPUiBwY21MaW1pdGVyX1Jlc2V0KFRETGltaXRlclB0ciBsaW1pdGVyKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBkZXN0cm95TGltaXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBsaW1pdGVyOiBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiByZXR1cm5zOiBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVERMSU1JVEVSX0VSUk9SIGRlc3Ryb3lMaW1pdGVyKFRETGltaXRlclB0ciBsaW1pdGVyKTsKKyAqIHBjbUxpbWl0ZXJfRGVzdHJveSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBsaW1pdGVyOiBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcmV0dXJuczogZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitURExJTUlURVJfRVJST1IgcGNtTGltaXRlcl9EZXN0cm95KFRETGltaXRlclB0ciBsaW1pdGVyKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBhcHBseUxpbWl0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBsaW1pdGVyOiAgICBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBwR2FpbiA6ICAgICBwb2ludGVyIHRvIGdhaW5zIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHNpZ25hbCBiZWZvcmUgbGltaXRpbmcsICAgKgotKiAgICAgICAgICAgICB3aGljaCBhcmUgZG93bnNjYWxlZCBieSBURExfR0FJTl9TQ0FMSU5HIGJpdC4gICAgICAgICAgICAgICAgICAgKgotKiAgICAgICAgICAgICBUaGVzZSBnYWlucyBhcmUgZGVsYXllZCBieSBnYWluX2RlbGF5LCBhbmQgc21vb3RoZWQuICAgICAgICAgICAgKgotKiAgICAgICAgICAgICBTbW9vdGhpbmcgaXMgZG9uZSBieSBhIGJ1dHRlcndvcnRoIGxvd3Bhc3MgZmlsdGVyIHdpdGggYSBjdXRvZmYgKgotKiAgICAgICAgICAgICBmcmVxdWVuY3kgd2hpY2ggaXMgZml4ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBzYW1wbGluZyByYXRlLiAgICAgKgotKiAgICAgICAgICAgICBJdCBpcyBhIHN1YnN0aXR1dGUgZm9yIHRoZSBzbW9vdGhpbmcgZHVlIHRvIHdpbmRvd2luZyBhbmQgICAgICAgKgotKiAgICAgICAgICAgICBvdmVybGFwL2FkZCwgaWYgYSBnYWluIGlzIGFwcGxpZWQgaW4gZnJlcXVlbmN5IGRvbWFpbi4gICAgICAgICAgKgotKiBnYWluX3NjYWxlOiBwb2ludGVyIHRvIHNjYWxpbmcgZXhwb25lbnRzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHNpZ25hbCBiZWZvcmUgKgotKiAgICAgICAgICAgICBsaW1pdGluZywgd2l0aG91dCBkZWxheSBhbmQgd2l0aG91dCBzbW9vdGhpbmcgICAgICAgICAgICAgICAgICAgKgotKiBnYWluX3NpemU6ICBudW1iZXIgb2YgZWxlbWVudHMgaW4gcEdhaW4sIGN1cnJlbnRseSByZXN0cmljdGVkIHRvIDEgICAgICAgICAgKgotKiBnYWluX2RlbGF5OiBkZWxheSBbc2FtcGxlc10gd2l0aCB3aGljaCB0aGUgZ2FpbnMgaW4gcEdhaW4gc2hhbGwgYmUgYXBwbGllZCAgKgotKiAgICAgICAgICAgICBnYWluX2RlbGF5IDw9IG5TYW1wbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBzYW1wbGVzOiAgICBpbnB1dC9vdXRwdXQgYnVmZmVyIGNvbnRhaW5pbmcgaW50ZXJsZWF2ZWQgc2FtcGxlcyAgICAgICAgICAgICAgKgotKiAgICAgICAgICAgICBwcmVjaXNpb24gb2Ygb3V0cHV0IHdpbGwgYmUgREZSQUNUX0JJVFMtVERMX0dBSU5fU0NBTElORyBiaXRzICAgKgotKiBuU2FtcGxlczogICBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiByZXR1cm5zOiAgICBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVERMSU1JVEVSX0VSUk9SIGFwcGx5TGltaXRlcihURExpbWl0ZXJQdHIgbGltaXRlciwKLSAgICAgICAgICAgICAgICAgSU5UX1BDTSogICAgc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgRklYUF9EQkwqICAgIHBHYWluLAotICAgICAgICAgICAgICAgICBjb25zdCBJTlQqICAgZ2Fpbl9zY2FsZSwKLSAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgIGdhaW5fc2l6ZSwKLSAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgIGdhaW5fZGVsYXksCi0gICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICBuU2FtcGxlcyk7CisgKiBwY21MaW1pdGVyX0dldERlbGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogbGltaXRlcjogbGltaXRlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJldHVybnM6IGV4YWN0IGRlbGF5IGNhdXNlZCBieSB0aGUgbGltaXRlciBpbiBzYW1wbGVzIHBlciBjaGFubmVsICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgaW50IHBjbUxpbWl0ZXJfR2V0RGVsYXkoVERMaW1pdGVyUHRyIGxpbWl0ZXIpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIGdldExpbWl0ZXJEZWxheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIGxpbWl0ZXI6IGxpbWl0ZXIgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIHJldHVybnM6IGV4YWN0IGRlbGF5IGNhdXNlZCBieSB0aGUgbGltaXRlciBpbiBzYW1wbGVzICAgICAgICAgICAgICAgICAgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bnNpZ25lZCBpbnQgZ2V0TGltaXRlckRlbGF5KFRETGltaXRlclB0ciBsaW1pdGVyKTsKKyAqIHBjbUxpbWl0ZXJfR2V0TWF4R2FpblJlZHVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBsaW1pdGVyOiBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcmV0dXJuczogbWF4aW11bSBnYWluIHJlZHVjdGlvbiBpbiBsYXN0IHByb2Nlc3NlZCBibG9jayBpbiBkQiAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQgcGNtTGltaXRlcl9HZXRNYXhHYWluUmVkdWN0aW9uKFRETGltaXRlclB0ciBsaW1pdGVyKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBzZXRMaW1pdGVyTkNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBsaW1pdGVyOiAgIGxpbWl0ZXIgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBuQ2hhbm5lbHM6IG51bWJlciBvZiBjaGFubmVscyAoIDw9IG1heENoYW5uZWxzIHNwZWNpZmllZCBvbiBjcmVhdGUpICAgICAgICAgKgotKiByZXR1cm5zOiAgIGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVERMSU1JVEVSX0VSUk9SIHNldExpbWl0ZXJOQ2hhbm5lbHMoVERMaW1pdGVyUHRyIGxpbWl0ZXIsIHVuc2lnbmVkIGludCBuQ2hhbm5lbHMpOworICogcGNtTGltaXRlcl9TZXROQ2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIGxpbWl0ZXI6ICAgbGltaXRlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBuQ2hhbm5lbHM6IG51bWJlciBvZiBjaGFubmVscyAoIDw9IG1heENoYW5uZWxzIHNwZWNpZmllZCBvbiBjcmVhdGUpICAgICAgICAgKgorICogcmV0dXJuczogICBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitURExJTUlURVJfRVJST1IgcGNtTGltaXRlcl9TZXROQ2hhbm5lbHMoVERMaW1pdGVyUHRyIGxpbWl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5DaGFubmVscyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogc2V0TGltaXRlclNhbXBsZVJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogbGltaXRlcjogICAgbGltaXRlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogc2FtcGxlUmF0ZTogc2FtcGxpbmcgcmF0ZSBpbiBIeiAoIDw9IG1heFNhbXBsZVJhdGUgc3BlY2lmaWVkIG9uIGNyZWF0ZSkgICAgICoKLSogcmV0dXJuczogICAgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVRETElNSVRFUl9FUlJPUiBzZXRMaW1pdGVyU2FtcGxlUmF0ZShURExpbWl0ZXJQdHIgbGltaXRlciwgdW5zaWduZWQgaW50IHNhbXBsZVJhdGUpOworICogcGNtTGltaXRlcl9TZXRTYW1wbGVSYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIGxpbWl0ZXI6ICAgIGxpbWl0ZXIgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBzYW1wbGVSYXRlOiBzYW1wbGluZyByYXRlIGluIEh6ICggPD0gbWF4U2FtcGxlUmF0ZSBzcGVjaWZpZWQgb24gY3JlYXRlKSAgICAgKgorICogcmV0dXJuczogICAgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitURExJTUlURVJfRVJST1IgcGNtTGltaXRlcl9TZXRTYW1wbGVSYXRlKFRETGltaXRlclB0ciBsaW1pdGVyLCBVSU5UIHNhbXBsZVJhdGUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIHNldExpbWl0ZXJBdHRhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIGxpbWl0ZXI6ICAgIGxpbWl0ZXIgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIGF0dGFja01zOiAgIGF0dGFjayB0aW1lIGluIG1zICggPD0gbWF4QXR0YWNrTXMgc3BlY2lmaWVkIG9uIGNyZWF0ZSkgICAgICAgICAqCi0qIHJldHVybnM6ICAgIGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1URExJTUlURVJfRVJST1Igc2V0TGltaXRlckF0dGFjayhURExpbWl0ZXJQdHIgbGltaXRlciwgdW5zaWduZWQgaW50IGF0dGFja01zKTsKKyAqIHBjbUxpbWl0ZXJfU2V0QXR0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBsaW1pdGVyOiAgICBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogYXR0YWNrTXM6ICAgYXR0YWNrIHRpbWUgaW4gbXMgKCA8PSBtYXhBdHRhY2tNcyBzcGVjaWZpZWQgb24gY3JlYXRlKSAgICAgICAgICoKKyAqIHJldHVybnM6ICAgIGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVERMSU1JVEVSX0VSUk9SIHBjbUxpbWl0ZXJfU2V0QXR0YWNrKFRETGltaXRlclB0ciBsaW1pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBhdHRhY2tNcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogc2V0TGltaXRlclJlbGVhc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogbGltaXRlcjogICAgbGltaXRlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogcmVsZWFzZU1zOiAgcmVsZWFzZSB0aW1lIGluIG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogcmV0dXJuczogICAgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVRETElNSVRFUl9FUlJPUiBzZXRMaW1pdGVyUmVsZWFzZShURExpbWl0ZXJQdHIgbGltaXRlciwgdW5zaWduZWQgaW50IHJlbGVhc2VNcyk7CisgKiBwY21MaW1pdGVyX1NldFJlbGVhc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogbGltaXRlcjogICAgbGltaXRlciBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJlbGVhc2VNczogIHJlbGVhc2UgdGltZSBpbiBtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiByZXR1cm5zOiAgICBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1RETElNSVRFUl9FUlJPUiBwY21MaW1pdGVyX1NldFJlbGVhc2UoVERMaW1pdGVyUHRyIGxpbWl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByZWxlYXNlTXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIHNldExpbWl0ZXJUaHJlc2hvbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIGxpbWl0ZXI6ICAgIGxpbWl0ZXIgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIHRocmVzaG9sZDogIGxpbWl0ZXIgdGhyZXNob2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIHJldHVybnM6ICAgIGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1URExJTUlURVJfRVJST1Igc2V0TGltaXRlclRocmVzaG9sZChURExpbWl0ZXJQdHIgbGltaXRlciwgSU5UX1BDTSB0aHJlc2hvbGQpOworICogcGNtTGltaXRlcl9HZXRMaWJJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIGluZm86ICAgICAgIHBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBMSUJfSU5GTyBzdHJ1Y3R1cmUgICAgICAqCisgKiByZXR1cm5zOiAgICBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1RETElNSVRFUl9FUlJPUiBwY21MaW1pdGVyX0dldExpYkluZm8oTElCX0lORk8qIGluZm8pOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwY21MaW1pdGVyX0NyZWF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogbWF4QXR0YWNrTXM6ICAgbWF4aW11bSBhbmQgaW5pdGlhbCBhdHRhY2svbG9va2FoZWFkIHRpbWUgaW4gbWlsbGlzZWNvbmRzICAgICoKKyAqIHJlbGVhc2VNczogICAgIHJlbGVhc2UgdGltZSBpbiBtaWxsaXNlY29uZHMgKDkwJSB0aW1lIGNvbnN0YW50KSAgICAgICAgICAgICAqCisgKiB0aHJlc2hvbGQ6ICAgICBsaW1pdGluZyB0aHJlc2hvbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogbWF4Q2hhbm5lbHM6ICAgbWF4aW11bSBhbmQgaW5pdGlhbCBudW1iZXIgb2YgY2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIG1heFNhbXBsZVJhdGU6IG1heGltdW0gYW5kIGluaXRpYWwgc2FtcGxpbmcgcmF0ZSBpbiBIeiAgICAgICAgICAgICAgICAgICAgICAqCisgKiByZXR1cm5zOiAgICAgICBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1RETGltaXRlclB0ciBwY21MaW1pdGVyX0NyZWF0ZSh1bnNpZ25lZCBpbnQgbWF4QXR0YWNrTXMsIHVuc2lnbmVkIGludCByZWxlYXNlTXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgdGhyZXNob2xkLCB1bnNpZ25lZCBpbnQgbWF4Q2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBtYXhTYW1wbGVSYXRlKTsKIAotI2VuZGlmICAvLyNpZm5kZWYgX0xJTUlURVJfSF8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHBjbUxpbWl0ZXJfU2V0VGhyZXNob2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBsaW1pdGVyOiAgICBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogdGhyZXNob2xkOiAgbGltaXRlciB0aHJlc2hvbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJldHVybnM6ICAgIGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVERMSU1JVEVSX0VSUk9SIHBjbUxpbWl0ZXJfU2V0VGhyZXNob2xkKFRETGltaXRlclB0ciBsaW1pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHRocmVzaG9sZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHBjbUxpbWl0ZXJfQXBwbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBsaW1pdGVyOiAgICBsaW1pdGVyIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcEdhaW4gOiAgICAgcG9pbnRlciB0byBnYWlucyB0byBiZSBhcHBsaWVkIHRvIHRoZSBzaWduYWwgYmVmb3JlIGxpbWl0aW5nLCAgICoKKyAqICAgICAgICAgICAgIHdoaWNoIGFyZSBkb3duc2NhbGVkIGJ5IFRETF9HQUlOX1NDQUxJTkcgYml0LiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICBUaGVzZSBnYWlucyBhcmUgZGVsYXllZCBieSBnYWluX2RlbGF5LCBhbmQgc21vb3RoZWQuICAgICAgICAgICAgKgorICogICAgICAgICAgICAgU21vb3RoaW5nIGlzIGRvbmUgYnkgYSBidXR0ZXJ3b3J0aCBsb3dwYXNzIGZpbHRlciB3aXRoIGEgY3V0b2ZmICoKKyAqICAgICAgICAgICAgIGZyZXF1ZW5jeSB3aGljaCBpcyBmaXhlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIHNhbXBsaW5nIHJhdGUuICAgICAqCisgKiAgICAgICAgICAgICBJdCBpcyBhIHN1YnN0aXR1dGUgZm9yIHRoZSBzbW9vdGhpbmcgZHVlIHRvIHdpbmRvd2luZyBhbmQgICAgICAgKgorICogICAgICAgICAgICAgb3ZlcmxhcC9hZGQsIGlmIGEgZ2FpbiBpcyBhcHBsaWVkIGluIGZyZXF1ZW5jeSBkb21haW4uICAgICAgICAgICoKKyAqIGdhaW5fc2NhbGU6IHBvaW50ZXIgdG8gc2NhbGluZyBleHBvbmVudHMgdG8gYmUgYXBwbGllZCB0byB0aGUgc2lnbmFsIGJlZm9yZSAqCisgKiAgICAgICAgICAgICBsaW1pdGluZywgd2l0aG91dCBkZWxheSBhbmQgd2l0aG91dCBzbW9vdGhpbmcgICAgICAgICAgICAgICAgICAgKgorICogZ2Fpbl9zaXplOiAgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHBHYWluLCBjdXJyZW50bHkgcmVzdHJpY3RlZCB0byAxICAgICAgICAgICoKKyAqIGdhaW5fZGVsYXk6IGRlbGF5IFtzYW1wbGVzXSB3aXRoIHdoaWNoIHRoZSBnYWlucyBpbiBwR2FpbiBzaGFsbCBiZSBhcHBsaWVkICAqCisgKiAgICAgICAgICAgICBnYWluX2RlbGF5IDw9IG5TYW1wbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogc2FtcGxlczogICAgaW5wdXQvb3V0cHV0IGJ1ZmZlciBjb250YWluaW5nIGludGVybGVhdmVkIHNhbXBsZXMgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgIHByZWNpc2lvbiBvZiBvdXRwdXQgd2lsbCBiZSBERlJBQ1RfQklUUy1URExfR0FJTl9TQ0FMSU5HIGJpdHMgICAqCisgKiBuU2FtcGxlczogICBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcmV0dXJuczogICAgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitURExJTUlURVJfRVJST1IgcGNtTGltaXRlcl9BcHBseShURExpbWl0ZXJQdHIgbGltaXRlciwgUENNX0xJTSogc2FtcGxlc0luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSogc2FtcGxlc091dCwgRklYUF9EQkwqIHBHYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UKiBnYWluX3NjYWxlLCBjb25zdCBVSU5UIGdhaW5fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZ2Fpbl9kZWxheSwgY29uc3QgVUlOVCBuU2FtcGxlcyk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIExJTUlURVJfSCAqLwpkaWZmIC0tZ2l0IGEvbGliUENNdXRpbHMvaW5jbHVkZS9wY21fdXRpbHMuaCBiL2xpYlBDTXV0aWxzL2luY2x1ZGUvcGNtX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDczYmNmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYlBDTXV0aWxzL2luY2x1ZGUvcGNtX3V0aWxzLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogUENNIHV0aWxpdHkgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEFsZm9uc28gUGlubyBHYXJjaWEKKworICAgRGVzY3JpcHRpb246IEZ1bmN0aW9ucyB0aGF0IHBlcmZvcm0gKGRlKWludGVybGVhdmluZyBjb21iaW5lZCB3aXRoIGZvcm1hdAorY2hhbmdlCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChQQ01fVVRJTFNfSCkKKyNkZWZpbmUgUENNX1VUSUxTX0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKwordm9pZCBGREtfaW50ZXJsZWF2ZShjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgcEluLCBMT05HICpSRVNUUklDVCBwT3V0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGNoYW5uZWxzLCBjb25zdCBVSU5UIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBsZW5ndGgpOwordm9pZCBGREtfaW50ZXJsZWF2ZShjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgcEluLCBTSE9SVCAqUkVTVFJJQ1QgcE91dCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBjaGFubmVscywgY29uc3QgVUlOVCBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGVuZ3RoKTsKK3ZvaWQgRkRLX2ludGVybGVhdmUoY29uc3QgRklYUF9TR0wgKlJFU1RSSUNUIHBJbiwgU0hPUlQgKlJFU1RSSUNUIHBPdXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgY2hhbm5lbHMsIGNvbnN0IFVJTlQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxlbmd0aCk7CisKK3ZvaWQgRkRLX2RlaW50ZXJsZWF2ZShjb25zdCBMT05HICpSRVNUUklDVCBwSW4sIFNIT1JUICpSRVNUUklDVCBwT3V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgY2hhbm5lbHMsIGNvbnN0IFVJTlQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGVuZ3RoKTsKK3ZvaWQgRkRLX2RlaW50ZXJsZWF2ZShjb25zdCBMT05HICpSRVNUUklDVCBwSW4sIExPTkcgKlJFU1RSSUNUIHBPdXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBjaGFubmVscywgY29uc3QgVUlOVCBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBsZW5ndGgpOwordm9pZCBGREtfZGVpbnRlcmxlYXZlKGNvbnN0IFNIT1JUICpSRVNUUklDVCBwSW4sIFNIT1JUICpSRVNUUklDVCBwT3V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgY2hhbm5lbHMsIGNvbnN0IFVJTlQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGVuZ3RoKTsKK3ZvaWQgRkRLX2RlaW50ZXJsZWF2ZShjb25zdCBTSE9SVCAqUkVTVFJJQ1QgcEluLCBMT05HICpSRVNUUklDVCBwT3V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgY2hhbm5lbHMsIGNvbnN0IFVJTlQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGVuZ3RoKTsKKyNlbmRpZiAvKiAhZGVmaW5lZChQQ01fVVRJTFNfSCkgKi8KZGlmZiAtLWdpdCBhL2xpYlBDTXV0aWxzL2luY2x1ZGUvcGNtZG14X2xpYi5oIGIvbGliUENNdXRpbHMvaW5jbHVkZS9wY21kbXhfbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM3YTg1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYlBDTXV0aWxzL2luY2x1ZGUvcGNtZG14X2xpYi5oCkBAIC0wLDAgKzEsNDYwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDTSB1dGlsaXR5IGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBDaHJpc3RpYW4gR3JpZWJlbAorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBcZmlsZSAgIHBjbWRteF9saWIuaAorICogXGJyaWVmICBGREsgUENNIGF1ZGlvIG1peGRvd24gbGlicmFyeSBpbnRlcmZhY2UgaGVhZGVyIGZpbGUuCisKKyBccGFnZSBJTlRSTyBJbnRyb2R1Y3Rpb24KKworCisgXHNlY3Rpb24gU0NPUEUgU2NvcGUKKworIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBoaWdoLWxldmVsIGFwcGxpY2F0aW9uIGludGVyZmFjZSBhbmQgdXNhZ2Ugb2YgdGhlCisgRkRLIFBDTSBhdWRpbyBtaXhkb3duIG1vZHVsZSBsaWJyYXJ5IGRldmVsb3BlZCBieSB0aGUgRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yCisgSW50ZWdyYXRlZCBDaXJjdWl0cyAoSUlTKS4gRGVwZW5kaW5nIG9uIHRoZSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24sIHRoZSBtb2R1bGUKKyBjYW4gbWFuaXB1bGF0ZSB0aGUgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIG9mIGEgZ2l2ZW4gUENNIHNpZ25hbC4gSXQgY2FuCisgY3JlYXRlIGZvciBleGFtcGxlIGEgdHdvIGNoYW5uZWwgc3RlcmVvIGF1ZGlvIHNpZ25hbCBmcm9tIGEgZ2l2ZW4gbXVsdGktY2hhbm5lbAorIGNvbmZpZ3VyYXRpb24gKGUuZy4gNS4xIGNoYW5uZWxzKS4KKworCisgXHBhZ2UgQUJCUkVWIExpc3Qgb2YgYWJicmV2aWF0aW9ucworCisgIFxsaSBcYiBBQUMgLSBBZHZhbmNlZCBBdWRpbyBDb2RpbmdcbgorICAgIElzIGFuIGF1ZGlvIGNvZGluZyBzdGFuZGFyZCBmb3IgbG9zc3kgZGlnaXRhbCBhdWRpbyBjb21wcmVzc2lvbiBzdGFuZGFyZGl6ZWQKKyBieSBJU08gYW5kIElFQywgYXMgcGFydCBvZiB0aGUgTVBFRy0yIChJU08vSUVDIDEzODE4LTc6MjAwNikgYW5kIE1QRUctNAorIChJU08vSUVDIDE0NDk2LTM6MjAwOSkgc3BlY2lmaWNhdGlvbnMuCisKKyAgXGxpIFxiIERTRSAtIERhdGEgU3RyZWFtIEVsZW1lbnRcbgorICAgIEEgc3ludGFjdGljYWwgZWxlbWVudCBvZiB0aGUgTVBFRy0yLzQgQWR2YW5jZWQgQXVkaW8gQ29kaW5nIGJpdHN0cmVhbQorIHN0YW5kYXJkaXplZCBpbiBJU08vSUVDIDE0NDk2LTM6MjAwOS4gSXQgY2FuIGNvbnZleSBhbnkga2luZCBvZiBkYXRhIGFzc29jaWF0ZWQKKyB0byBvbmUgcHJvZ3JhbS4KKworICBcbGkgXGIgUENFIC0gUHJvZ3JhbSBDb25maWcgRWxlbWVudFxuCisgICAgQSBzeW50YWN0aWNhbCBlbGVtZW50IG9mIHRoZSBNUEVHLTIvNCBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgYml0c3RyZWFtCisgc3RhbmRhcmRpemVkIGluIElTTy9JRUMgMTQ0OTYtMzoyMDA5IHRoYXQgY2FuIGRlZmluZSB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24KKyBmb3IgYSBzaW5nbGUgcHJvZ3JhbS4gSW4gYWRkaXRpb24gaXQgY2FuIGNvbXByaXNlIHNpbXBsZSBkb3dubWl4IG1ldGEgZGF0YS4KKworICovCisKKyNpZm5kZWYgUENNRE1YX0xJQl9ICisjZGVmaW5lIFBDTURNWF9MSUJfSAorCisjaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorI2luY2x1ZGUgIkZES19hdWRpby5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKworLyoqCisgKiAgXGVudW0gIFBDTURNWF9FUlJPUgorICoKKyAqICBFcnJvciBjb2RlcyB0aGF0IGNhbiBiZSByZXR1cm5lZCBieSBtb2R1bGUgaW50ZXJmYWNlIGZ1bmN0aW9ucy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgUENNRE1YX09LID0gMHgwLCAvKiE8IE5vIGVycm9yIGhhcHBlbmVkLiAqLworICBQQ01ETVhfVU5TVVBQT1JURUQgPQorICAgICAgMHgxLCAvKiE8IFRoZSByZXF1ZXN0ZWQgZmVhdHVyZS9zZXJ2aWNlIGlzIHVuYXZhaWxhYmxlLiBUaGlzIGNhbgorICAgICAgICAgICAgICAgIG9jY3VyIGlmIHRoZSBtb2R1bGUgd2FzIGJ1aWx0IGZvciBhIHdyb25nIGNvbmZpZ3VyYXRpb24uICAqLworICBwY21fZG14X2ZhdGFsX2Vycm9yX3N0YXJ0LAorICBQQ01ETVhfT1VUX09GX01FTU9SWSwgLyohPCBOb3QgZW5vdWdoIG1lbW9yeSB0byBzZXQgdXAgYW4gaW5zdGFuY2Ugb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuICAgICovCisgIHBjbV9kbXhfZmF0YWxfZXJyb3JfZW5kLAorCisgIFBDTURNWF9JTlZBTElEX0hBTkRMRSwgICAvKiE8IFRoZSBnaXZlbiBpbnN0YW5jZSBoYW5kbGUgaXMgbm90IHZhbGlkLiAgICovCisgIFBDTURNWF9JTlZBTElEX0FSR1VNRU5ULCAvKiE8IE9uZSBvZiB0aGUgcGFyYW1ldGVycyBoYW5kZWQgb3ZlciBpcyBpbnZhbGlkLiAqLworICBQQ01ETVhfSU5WQUxJRF9DSF9DT05GSUcsIC8qITwgVGhlIGdpdmVuIGNoYW5uZWwgY29uZmlndXJhdGlvbiBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYW5kIHRodXMgbm8gcHJvY2Vzc2luZyB3YXMgcGVyZm9ybWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBQQ01ETVhfSU5WQUxJRF9NT0RFLCAgLyohPCBUaGUgc2V0IGNvbmZpZ3VyYXRpb24vbW9kZSBpcyBub3QgYXBwbGljYWJsZS4gICovCisgIFBDTURNWF9VTktOT1dOX1BBUkFNLCAvKiE8IFRoZSBoYW5kZWQgcGFyYW1ldGVyIGlzIG5vdCBrbm93bi9zdXBwb3J0ZWQuICovCisgIFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNLCAvKiE8IFVuYWJsZSB0byBzZXQgdGhlIHNwZWNpZmljIHBhcmFtZXRlci4gTW9zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmFibHkgdGhlICAgIHZhbHVlIGlzdCBvdXQgb2YgcmFuZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUENNRE1YX0NPUlJVUFRfQU5DX0RBVEEsICAgIC8qITwgVGhlIHJlYWQgYW5jaWxsYXJ5IGRhdGEgd2FzIGNvcnJ1cHQuICAgICAgICovCisgIFBDTURNWF9PVVRQVVRfQlVGRkVSX1RPT19TTUFMTCAvKiE8IFRoZSBzaXplIG9mIHBjbSBvdXRwdXQgYnVmZmVyIGlzIHRvbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21hbGwuICAgICAgICAgICAgICAgKi8KKworfSBQQ01ETVhfRVJST1I7CisKKy8qKiBNYWNybyB0byBpZGVudGlmeSBmYXRhbCBlcnJvcnMuICovCisjZGVmaW5lIFBDTURNWF9JU19GQVRBTF9FUlJPUihlcnIpICAgICAgICAgIFwKKyAgKCgoKGVycikgPj0gcGNtX2RteF9mYXRhbF9lcnJvcl9zdGFydCkgJiYgXAorICAgICgoZXJyKSA8PSBwY21fZG14X2ZhdGFsX2Vycm9yX2VuZCkpICAgICBcCisgICAgICAgPyAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA6IDApCisKKy8qKgorICogIFxlbnVtICBQQ01ETVhfUEFSQU0KKyAqCisgKiAgTW9kdWxlcyBkeW5hbWljIHJ1bnRpbWUgcGFyYW1ldGVycyB0aGF0IGNhbiBiZSBoYW5kZWQgdG8gZnVuY3Rpb24KKyAqIHBjbURteF9TZXRQYXJhbSgpIGFuZCBwY21EbXhfR2V0UGFyYW0oKS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgRE1YX1BST0ZJTEVfU0VUVElORyA9CisgICAgICAweDAxLCAvKiE8IERlZmluZXMgd2hpY2ggZXF1YXRpb25zLCBjb2VmZmljaWVudHMgYW5kIGRlZmF1bHQvCisgICAgICAgICAgICAgICAgIGZhbGxiYWNrIHZhbHVlcyB1c2VkIGZvciBkb3dubWl4aW5nLiBTZWUKKyAgICAgICAgICAgICAgICAgOjpETVhfUFJPRklMRV9UWVBFIHR5cGUgZm9yIGRldGFpbHMuICAgICAgICAgICAgICovCisgIERNWF9CU19EQVRBX0VYUElSWV9GUkFNRSA9CisgICAgICAweDEwLCAvKiE8IFRoZSBudW1iZXIgb2YgZnJhbWVzIHdpdGhvdXQgbmV3IG1ldGFkYXRhIHRoYXQKKyAgICAgICAgICAgICAgICAgaGF2ZSB0byBnbyBieSBiZWZvcmUgdGhlIGJpdHN0cmVhbSBkYXRhIGV4cGlyZXMuCisgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSAwIGRpc2FibGVzIGV4cGlyeS4gICAgICAgICAgICAgICAgICAgICAqLworICBETVhfQlNfREFUQV9ERUxBWSA9CisgICAgICAweDExLCAvKiE8IFRoZSBudW1iZXIgb2YgZGVsYXkgZnJhbWVzIG9mIHRoZSBvdXRwdXQgc2FtcGxlcworICAgICAgICAgICAgICAgICBjb21wYXJlZCB0byB0aGUgYml0c3RyZWFtIGRhdGEuICAgICAgICAgICAgICAgICAgKi8KKyAgTUlOX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMgPQorICAgICAgMHgyMCwgLyohPCBUaGUgbWluaW11bSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiBGb3IgYWxsCisgICAgICAgICAgICAgICAgIGlucHV0IGNvbmZpZ3VyYXRpb25zIHRoYXQgaGF2ZSBsZXNzIHRoYW4gdGhlIGdpdmVuCisgICAgICAgICAgICAgICAgIGNoYW5uZWxzIHRoZSBtb2R1bGUgd2lsbCBtb2RpZnkgdGhlIG91dHB1dAorICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHRvIG9idGFpbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG91dHB1dAorICAgICAgICAgICAgICAgICBjaGFubmVscy4gTW9ubyBzaWduYWxzIHdpbGwgYmUgZHVwbGljYXRlZC4gSWYgbW9yZQorICAgICAgICAgICAgICAgICB0aGFuIHR3byBvdXRwdXQgY2hhbm5lbHMgYXJlIGRlc2lyZWQgdGhlIG1vZHVsZQorICAgICAgICAgICAgICAgICBqdXN0IGFkZHMgZW1wdHkgY2hhbm5lbHMuIFRoZSBwYXJhbWV0ZXIgdmFsdWUgbXVzdAorICAgICAgICAgICAgICAgICBiZSBlaXRoZXIgLTEsIDAsIDEsIDIsIDYgb3IgOC4gSWYgdGhlIHZhbHVlIGlzCisgICAgICAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCBleGNlZWRzIHRoZSB2YWx1ZSBvZgorICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgOjpNQVhfTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUyB0aGUKKyAgICAgICAgICAgICAgICAgbGF0dGVyIHdpbGwgYmUgc2V0IHRvIHRoZSBzYW1lIHZhbHVlLiBCb3RoIHZhbHVlcworICAgICAgICAgICAgICAgICAtMSBhbmQgMCBkaXNhYmxlIHRoZSBmZWF0dXJlLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgTUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMgPQorICAgICAgMHgyMSwgLyohPCBUaGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiBGb3IgYWxsCisgICAgICAgICAgICAgICAgIGlucHV0IGNvbmZpZ3VyYXRpb25zIHRoYXQgaGF2ZSBtb3JlIHRoYW4gdGhlIGdpdmVuCisgICAgICAgICAgICAgICAgIGNoYW5uZWxzIHRoZSBtb2R1bGUgd2lsbCBhcHBseSBhIG1peGRvd24KKyAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSB0byBvYnRhaW4gdGhlIGdpdmVuIG51bWJlciBvZiBvdXRwdXQKKyAgICAgICAgICAgICAgICAgY2hhbm5lbHMuIFRoZSB2YWx1ZSBtdXN0IGJlIGVpdGhlciAtMSwgMCwgMSwgMiwgNgorICAgICAgICAgICAgICAgICBvciA4LiBJZiBpdCdzIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCBsb3dlciBvciBlcXVhbAorICAgICAgICAgICAgICAgICB0aGFuIHRoZSB2YWx1ZSBvZiA6Ok1JTl9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTCisgICAgICAgICAgICAgICAgIHBhcmFtZXRlciB0aGUgbGF0dGVyIHdpbGwgYmUgc2V0IHRvIHRoZSBzYW1lIHZhbHVlLgorICAgICAgICAgICAgICAgICBUaGUgdmFsdWVzIC0xIGFuZCAwIGRpc2FibGUgdGhlIGZlYXR1cmUuICAgICAgICAgKi8KKyAgRE1YX0RVQUxfQ0hBTk5FTF9NT0RFID0KKyAgICAgIDB4MzAsIC8qITwgRG93bm1peCBtb2RlIGZvciB0d28gY2hhbm5lbCBhdWRpbyBkYXRhLiBTZWUgdHlwZQorICAgICAgICAgICAgICAgICA6OkRVQUxfQ0hBTk5FTF9NT0RFIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgKi8KKyAgRE1YX1BTRVVET19TVVJST1VORF9NT0RFID0KKyAgICAgIDB4MzEgLyohPCBEZWZpbmVzIGhvdyBtb2R1bGUgaGFuZGxlcyBwc2V1ZG8gc3Vycm91bmQKKyAgICAgICAgICAgICAgICBjb21wYXRpYmxlIHNpZ25hbHMuIFNlZSA6OlBTRVVET19TVVJST1VORF9NT0RFCisgICAgICAgICAgICAgICAgdHlwZSBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IFBDTURNWF9QQVJBTTsKKworLyoqCisgKiAgXGVudW0gIERNWF9QUk9GSUxFX1RZUEUKKyAqCisgKiAgVmFsaWQgdmFsdWUgbGlzdCBmb3IgcGFyYW1ldGVyIDo6RE1YX1BST0ZJTEVfU0VUVElORy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgRE1YX1BSRkxfU1RBTkRBUkQgPQorICAgICAgMHgwLCAvKiE8IFRoZSBzdGFuZGFyZCBwcm9maWxlIGNyZWF0ZXMgbWl4ZG93biBzaWduYWxzIGJhc2VkIG9uCisgICAgICAgICAgICAgICAgdGhlIGFkdmFuY2VkIGRvd25taXggbWV0YWRhdGEgKGZyb20gYSBEU0UpLCBlcXVhdGlvbnMKKyAgICAgICAgICAgICAgICBhbmQgZGVmYXVsdCB2YWx1ZXMgZGVmaW5lZCBpbiBJU08vSUVDIDE0NDk2OjMKKyAgICAgICAgICAgICAgICBBbW1lbmRtZW50IDQuIEFueSBvdGhlciAobGVnYWN5KSBkb3dubWl4IG1ldGFkYXRhIHdpbGwKKyAgICAgICAgICAgICAgICBiZSBpZ25vcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRE1YX1BSRkxfTUFUUklYX01JWCA9CisgICAgICAweDEsIC8qITwgVGhpcyBwcm9maWxlIGJlaGF2ZXMganVzdCBhcyB0aGUgc3RhbmRhcmQgcHJvZmlsZSBpZgorICAgICAgICAgICAgICAgIGFkdmFuY2VkIGRvd25taXggbWV0YWRhdGEgKGZyb20gYSBEU0UpIGlzIGF2YWlsYWJsZS4gSWYKKyAgICAgICAgICAgICAgICBub3QsIHRoZSBtYXRyaXhfbWl4ZG93biBpbmZvcm1hdGlvbiBlbWJlZGRlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICBwcm9ncmFtIGNvbmZpZ3VyYXRpb24gZWxlbWVudCAoUENFKSB3aWxsIGJlIGFwcGxpZWQuIElmCisgICAgICAgICAgICAgICAgbmVpdGhlciBpcyB0aGUgY2FzZSB0aGUgbW9kdWxlIGNyZWF0ZXMgYSBtaXhkb3duIHVzaW5nCisgICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgY29lZmZpY2llbnRzIGRlZmluZWQgaW4gTVBFRy00IEFtbWVuZG1lbnQgNC4KKyAgICAgICAgICAgICAgICBUaGUgcHJvZmlsZSBjYW4gYmUgdXNlZCBlLmcuIHRvIHN1cHBvcnQgbGVnYWN5IGRpZ2l0YWwKKyAgICAgICAgICAgICAgICBUViAoZS5nLiBEVkIpIHN0cmVhbXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRE1YX1BSRkxfRk9SQ0VfTUFUUklYX01JWCA9CisgICAgICAweDIsIC8qITwgU2ltaWxhciB0byB0aGUgOjpETVhfUFJGTF9NQVRSSVhfTUlYIHByb2ZpbGUgYnV0IGlmIGJvdGgKKyAgICAgICAgICAgICAgICB0aGUgYWR2YW5jZWQgKERTRSkgYW5kIHRoZSBsZWdhY3kgKFBDRSkgTVBFRyBkb3dubWl4CisgICAgICAgICAgICAgICAgbWV0YWRhdGEgYXJlIGF2YWlsYWJsZSB0aGUgbGF0dGVyIHdpbGwgYmUgYXBwbGllZC4gICAgICovCisgIERNWF9QUkZMX0FSSUJfSkFQQU4gPQorICAgICAgMHgzIC8qITwgRG93bm1peCBjcmVhdGlvbiBhcyBkZXNjcmliZWQgaW4gQUJOVCBOQlIgMTU2MDItMi4gQnV0CisgICAgICAgICAgICAgICBpZiBhZHZhbmNlZCBkb3dubWl4IG1ldGFkYXRhIGlzIGF2YWlsYWJsZSBpdCB3aWxsIGJlCisgICAgICAgICAgICAgICBwcmVmZXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gRE1YX1BST0ZJTEVfVFlQRTsKKworLyoqCisgKiAgXGVudW0gUFNFVURPX1NVUlJPVU5EX01PREUKKyAqCisgKiAgVmFsaWQgdmFsdWUgbGlzdCBmb3IgcGFyYW1ldGVyIDo6RE1YX1BTRVVET19TVVJST1VORF9NT0RFLgorICovCit0eXBlZGVmIGVudW0geworICBORVZFUl9ET19QU19ETVggPQorICAgICAgLTEsIC8qITwgSWdub3JlIGFueSBtZXRhZGF0YSBhbmQgZG8gbmV2ZXIgY3JlYXRlIGEgcHNldWRvIHN1cnJvdW5kCisgICAgICAgICAgICAgICBjb21wYXRpYmxlIGRvd25taXguIChEZWZhdWx0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQVVUT19QU19ETVggPSAwLCAvKiE8IENyZWF0ZSBhIHBzZXVkbyBzdXJyb3VuZCBjb21wYXRpYmxlIGRvd25taXggb25seSBpZgorICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsbGVkIGluIGJpdHN0cmVhbXMgbWV0YSBkYXRhLiAqLworICBGT1JDRV9QU19ETVggPQorICAgICAgMSAvKiE8IEFsd2F5cyBjcmVhdGUgYSBwc2V1ZG8gc3Vycm91bmQgY29tcGF0aWJsZSBkb3dubWl4LgorICAgICAgICAgICAgIENBVVRJT046IFRoaXMgY2FuIGxlYWQgdG8gZXhjZXNzaXZlIHNpZ25hbCBjYW5jZWxsYXRpb25zCisgICAgICAgICAgICAgYW5kIHNpZ25hbCBsZXZlbCBkaWZmZXJlbmNlcyBmb3Igbm9uLWNvbXBhdGlibGUgc2lnbmFscy4gICovCit9IFBTRVVET19TVVJST1VORF9NT0RFOworCisvKioKKyAqICBcZW51bSBEVUFMX0NIQU5ORUxfTU9ERQorICoKKyAqICBWYWxpZCB2YWx1ZSBsaXN0IGZvciBwYXJhbWV0ZXIgOjpETVhfRFVBTF9DSEFOTkVMX01PREUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIFNURVJFT19NT0RFID0gMHgwLCAvKiE8IExlYXZlIHN0ZXJlbyBzaWduYWxzIGFzIHRoZXkgYXJlLiAqLworICBDSDFfTU9ERSA9IDB4MSwgICAgLyohPCBDcmVhdGUgYSBkdWFsIG1vbm8gb3V0cHV0IHNpZ25hbCBmcm9tIGNoYW5uZWwgMS4gICAgKi8KKyAgQ0gyX01PREUgPSAweDIsICAgIC8qITwgQ3JlYXRlIGEgZHVhbCBtb25vIG91dHB1dCBzaWduYWwgZnJvbSBjaGFubmVsIDIuICAgICovCisgIE1JWEVEX01PREUgPSAweDMgICAvKiE8IENyZWF0ZSBhIGR1YWwgbW9ubyBvdXRwdXQgc2lnbmFsIGJ5IG1peGluZyB0aGUgdHdvCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzLiAgICovCit9IERVQUxfQ0hBTk5FTF9NT0RFOworCisjZGVmaW5lIERNWF9QQ00gRklYUF9EQkwKKyNkZWZpbmUgRE1YX1BDTUYgRklYUF9EQkwKKyNkZWZpbmUgRE1YX1BDTV9CSVRTIERGUkFDVF9CSVRTCisjZGVmaW5lIEZYX0RNWDJGWF9QQ00oeCkgRlhfREJMMkZYX1BDTSgoRklYUF9EQkwpKHgpKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICogICAgIE1PRFVMRVMgSU5URVJGQUNFOiAgICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordHlwZWRlZiBzdHJ1Y3QgUENNX0RNWF9JTlNUQU5DRSAqSEFORExFX1BDTV9ET1dOTUlYOworCisvKiEgXGFkZHRvZ3JvdXAgcGNtRG14UmVzZXRGbGFncyBNb2R1bGVzIHJlc2V0IGZsYWdzCisgKiAgTWFjcm9zIHRoYXQgY2FuIGJlIHVzZWQgYXMgcGFyYW1ldGVyIGZvciBmdW5jdGlvbiBwY21EbXhfUmVzZXQoKSB0byBzcGVjaWZ5CisgKiB3aGljaCBwYXJ0cyBvZiB0aGUgbW9kdWxlIHNoYWxsIGJlIHJlc2V0LgorICogIEB7CisgKgorICogIFxkZWYgIFBDTURNWF9SRVNFVF9QQVJBTVMKKyAqICBPbmx5IHJlc2V0IHRoZSB1c2VyIHNwZWNpZmljIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQgd2l0aAorICogcGNtRG14X1NldFBhcmFtKCkuCisgKgorICogIFxkZWYgIFBDTURNWF9SRVNFVF9CU19EQVRBCisgKiAgRGVsZXRlIHRoZSBtZXRhIGRhdGEgdGhhdCBoYXMgYmVlbiBmZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgaW50ZXJmYWNlCisgKiBmdW5jdGlvbnMuCisgKgorICogIFxkZWYgIFBDTURNWF9SRVNFVF9GVUxMCisgKiAgUmVzZXQgdGhlIGNvbXBsZXRlIG1vZHVsZSBpbnN0YW5jZSB0byB0aGUgc3RhdGUgYWZ0ZXIgcGNtRG14X09wZW4oKSBoYWQgYmVlbgorICogY2FsbGVkLgorICovCisjZGVmaW5lIFBDTURNWF9SRVNFVF9QQVJBTVMgKDEpCisjZGVmaW5lIFBDTURNWF9SRVNFVF9CU19EQVRBICgyKQorI2RlZmluZSBQQ01ETVhfUkVTRVRfRlVMTCAoUENNRE1YX1JFU0VUX1BBUkFNUyB8IFBDTURNWF9SRVNFVF9CU19EQVRBKQorLyohIEB9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIE9wZW4gYW5kIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgdGhlIFBDTSBkb3dubWl4IG1vZHVsZQorICogQHBhcmFtW291dF0gcFNlbGYgIFBvaW50ZXIgdG8gYSBidWZmZXIgcmVjZWl2aW5nIHRoZSBoYW5kbGUgb2YgdGhlIG5ldworICppbnN0YW5jZS4KKyAqIEByZXR1cm5zICAgICAgICAgICBSZXR1cm5zIGFuIGVycm9yIGNvZGUgb2YgdHlwZSA6OlBDTURNWF9FUlJPUi4KKyAqKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfT3BlbihIQU5ETEVfUENNX0RPV05NSVggKnBTZWxmKTsKKworLyoqIFNldCBvbmUgcGFyYW1ldGVyIGZvciBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgUENNIGRvd25taXggbW9kdWxlLgorICogQHBhcmFtW2luXSBzZWxmICAgSGFuZGxlIG9mIFBDTSBkb3dubWl4IGluc3RhbmNlLgorICogQHBhcmFtW2luXSBwYXJhbSAgUGFyYW1ldGVyIHRvIGJlIHNldC4gQ2FuIGJlIG9uZSBmcm9tIHRoZSA6OlBDTURNWF9QQVJBTQorICpsaXN0LgorICogQHBhcmFtW2luXSB2YWx1ZSAgUGFyYW1ldGVyIHZhbHVlLgorICogQHJldHVybnMgICAgICAgICAgUmV0dXJucyBhbiBlcnJvciBjb2RlIG9mIHR5cGUgOjpQQ01ETVhfRVJST1IuCisgKiovCitQQ01ETVhfRVJST1IgcGNtRG14X1NldFBhcmFtKEhBTkRMRV9QQ01fRE9XTk1JWCBzZWxmLCBjb25zdCBQQ01ETVhfUEFSQU0gcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB2YWx1ZSk7CisKKy8qKiBHZXQgb25lIHBhcmFtZXRlciB2YWx1ZSBvZiBhIHNpbmdsZSBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dICBzZWxmICAgIEhhbmRsZSBvZiBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dICBwYXJhbSAgIFBhcmFtZXRlciB0byBxdWVyeS4gQ2FuIGJlIG9uZSBmcm9tIHRoZSA6OlBDTURNWF9QQVJBTQorICpsaXN0LgorICogQHBhcmFtW291dF0gcFZhbHVlICBQb2ludGVyIHRvIGJ1ZmZlciByZWNlaXZpbmcgdGhlIHBhcmFtZXRlciB2YWx1ZS4KKyAqIEByZXR1cm5zICAgICAgICAgICAgUmV0dXJucyBhbiBlcnJvciBjb2RlIG9mIHR5cGUgOjpQQ01ETVhfRVJST1IuCisgKiovCitQQ01ETVhfRVJST1IgcGNtRG14X0dldFBhcmFtKEhBTkRMRV9QQ01fRE9XTk1JWCBzZWxmLCBjb25zdCBQQ01ETVhfUEFSQU0gcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqY29uc3QgcFZhbHVlKTsKKworLyoqIFxjb25kCisgKiAgRXh0cmFjdCByZWxldmFudCBkb3dubWl4IG1ldGEtZGF0YSBkaXJlY3RseSBmcm9tIGEgZ2l2ZW4gYml0c3RyZWFtLiBUaGUKKyAqZnVuY3Rpb24gY2FuIGhhbmRsZSBib3RoIGRhdGEgc3BlY2lmaWVkIGluIEVUU0kgVFMgMTAxIDE1NCBvciBJU08vSUVDCisgKjE0NDk2LTM6MjAwOS9BbWQuNDoyMDEzLgorICogQHBhcmFtW2luXSBzZWxmICAgICAgICAgSGFuZGxlIG9mIFBDTSBkb3dubWl4IGluc3RhbmNlLgorICogQHBhcmFtW2luXSBoQml0U3RyZWFtICAgSGFuZGxlIG9mIEZESyBiaXRzdHJlYW0gYnVmZmVyLgorICogQHBhcmFtW2luXSBhbmNEYXRhQml0cyAgTGVuZ3RoIG9mIGFuY2lsbGFyeSBkYXRhIGluIGJpdHMuCisgKiBAcGFyYW1baW5dIGlzTXBlZzIgICAgICBGbGFnIGluZGljYXRpbmcgd2hldGVyIHRoZSBhbmNpbGxhcnkgZGF0YSBpcyBmcm9tIGEKKyAqTVBFRy0xLzIgb3IgYSBNUEVHLTQgc3RyZWFtLgorICogQHJldHVybnMgICAgICAgICAgICAgICAgUmV0dXJucyBhbiBlcnJvciBjb2RlIG9mIHR5cGUgOjpQQ01ETVhfRVJST1IuCisgKiovCitQQ01ETVhfRVJST1IgcGNtRG14X1BhcnNlKEhBTkRMRV9QQ01fRE9XTk1JWCBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBVSU5UIGFuY0RhdGFCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNNcGVnMik7CisvKiogXGVuZGNvbmQgKi8KKworLyoqIFJlYWQgZnJvbSBhIGdpdmVuIGFuY2lsbGFyeSBkYXRhIGJ1ZmZlciBhbmQgZXh0cmFjdCB0aGUgcmVsZXZhbnQgZG93bm1peAorICptZXRhLWRhdGEuIFRoZSBmdW5jdGlvbiBjYW4gaGFuZGxlIGJvdGggZGF0YSBzcGVjaWZpZWQgaW4gRVRTSSBUUyAxMDEgMTU0IG9yCisgKklTTy9JRUMgMTQ0OTYtMzoyMDA5L0FtZC40OjIwMTMuCisgKiBAcGFyYW1baW5dIHNlbGYgICAgICAgICAgSGFuZGxlIG9mIFBDTSBkb3dubWl4IGluc3RhbmNlLgorICogQHBhcmFtW2luXSBwQW5jRGF0YUJ1ZiAgIFBvaW50ZXIgdG8gYW5jaWxsYXJ5IGJ1ZmZlciBob2xkaW5nIHRoZSBkYXRhLgorICogQHBhcmFtW2luXSBhbmNEYXRhQnl0ZXMgIFNpemUgb2YgYW5jaWxsYXJ5IGRhdGEgaW4gYnl0ZXMuCisgKiBAcGFyYW1baW5dIGlzTXBlZzIgICAgICAgRmxhZyBpbmRpY2F0aW5nIHdoZXRlciB0aGUgYW5jaWxsYXJ5IGRhdGEgaXMgZnJvbSBhCisgKk1QRUctMS8yIG9yIGEgTVBFRy00IHN0cmVhbS4KKyAqIEByZXR1cm5zICAgICAgICAgICAgICAgICBSZXR1cm5zIGFuIGVycm9yIGNvZGUgb2YgdHlwZSA6OlBDTURNWF9FUlJPUi4KKyAqKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfUmVhZER2YkFuY0RhdGEoSEFORExFX1BDTV9ET1dOTUlYIHNlbGYsIFVDSEFSICpwQW5jRGF0YUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBhbmNEYXRhQnl0ZXMsIGludCBpc01wZWcyKTsKKworLyoqIFNldCB0aGUgbWF0cml4IG1peGRvd24gaW5mb3JtYXRpb24gZXh0cmFjdGVkIGZyb20gdGhlIFBDRSBvZiBhbiBBQUMKKyAqYml0c3RyZWFtLgorICogQHBhcmFtW2luXSBzZWxmICAgICAgICAgICAgICAgICAgSGFuZGxlIG9mIFBDTSBkb3dubWl4IGluc3RhbmNlLgorICogQHBhcmFtW2luXSBtYXRyaXhNaXhkb3duUHJlc2VudCAgTWF0cml4IG1peGRvd24gaW5kZXggcHJlc2VudCBmbGFnIGV4dHJhY3RlZAorICpmcm9tIFBDRS4KKyAqIEBwYXJhbVtpbl0gbWF0cml4TWl4ZG93bklkeCAgICAgIFRoZSAyIGJpdCBtYXRyaXggbWl4ZG93biBpbmRleCBleHRyYWN0ZWQKKyAqZnJvbSBQQ0UuCisgKiBAcGFyYW1baW5dIHBzZXVkb1N1cnJvdW5kRW5hYmxlICBUaGUgcHNldWRvIHN1cnJvdW5kIGVuYWJsZSBmbGFnIGV4dHJhY3RlZAorICpmcm9tIFBDRS4KKyAqIEByZXR1cm5zICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybnMgYW4gZXJyb3IgY29kZSBvZiB0eXBlCisgKjo6UENNRE1YX0VSUk9SLgorICoqLworUENNRE1YX0VSUk9SIHBjbURteF9TZXRNYXRyaXhNaXhkb3duRnJvbVBjZShIQU5ETEVfUENNX0RPV05NSVggc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hdHJpeE1peGRvd25QcmVzZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF0cml4TWl4ZG93bklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBzZXVkb1N1cnJvdW5kRW5hYmxlKTsKKworLyoqIFJlc2V0IHRoZSBtb2R1bGUuCisgKiBAcGFyYW1baW5dIHNlbGYgICBIYW5kbGUgb2YgUENNIGRvd25taXggaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGZsYWdzICBGbGFncyB0ZWxsaW5nIHdoaWNoIHBhcnRzIG9mIHRoZSBtb2R1bGUgc2hhbGwgYmUgcmVzZXQuCisgKiAgICAgICAgICAgICAgICAgICBTZWUgXHJlZiBwY21EbXhSZXNldEZsYWdzIGZvciBkZXRhaWxzLgorICogQHJldHVybnMgICAgICAgICAgUmV0dXJucyBhbiBlcnJvciBjb2RlIG9mIHR5cGUgOjpQQ01ETVhfRVJST1IuCisgKiovCitQQ01ETVhfRVJST1IgcGNtRG14X1Jlc2V0KEhBTkRMRV9QQ01fRE9XTk1JWCBzZWxmLCBVSU5UIGZsYWdzKTsKKworLyoqIENyZWF0ZSBhIG1peGRvd24sIGJ5cGFzcyBvciBleHRlbmQgdGhlIG91dHB1dCBzaWduYWwgZGVwZW5kaW5nIG9uIHRoZQorICptb2R1bGVzIHNldHRpbmdzIGFuZCB0aGUgcmVzcGVjdGl2ZSBnaXZlbiBpbnB1dCBjb25maWd1cmF0aW9uLgorICoKKyAqIFxwYXJhbVtpbl0gICAgIHNlbGYgICAgICAgICAgICBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgorICogXHBhcmFtW2luLG91dF0gcFBjbUJ1ZiAgICAgICAgIFBvaW50ZXIgdG8gdGltZSBidWZmZXIgd2l0aCBQQ00gc2FtcGxlcy4KKyAqIFxwYXJhbVtpbl0gICAgIHBjbUJ1ZlNpemUgICAgICBTaXplIG9mIHBQY21CdWYgYnVmZmVyLgorICogXHBhcmFtW2luXSAgICAgZnJhbWVTaXplICAgICAgIFRoZSBJL08gYmxvY2sgc2l6ZSB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIGNoYW5uZWwuCisgKiBccGFyYW1baW4sb3V0XSBuQ2hhbm5lbHMgICAgICAgUG9pbnRlciB0byBidWZmZXIgdGhhdCBob2xkcyB0aGUgbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHRoZSBhbW91bnQgb2Ygb3V0cHV0IGNoYW5uZWxzIGlzIHdyaXR0ZW4KKyAqdG8uCisgKiBccGFyYW1baW5dICAgICBmSW50ZXJsZWF2ZWQgICAgSW5wdXQgYW5kIG91dHB1dCBzYW1wbGVzIGFyZSBwcm9jZXNzZWQgaW50ZXJsZWF2ZWQuCisgKiBccGFyYW1baW4sb3V0XSBjaGFubmVsVHlwZSAgICAgQXJyYXkgd2VyZSB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgZm9yIGVhY2ggb3V0cHV0IGF1ZGlvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBpcyBzdG9yZWQgaW50by4KKyAqIFxwYXJhbVtpbixvdXRdIGNoYW5uZWxJbmRpY2VzICBBcnJheSB3ZXJlIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZSBpbmRleCBmb3IgZWFjaCBvdXRwdXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBjaGFubmVsIGlzIHN0b3JlZCBpbnRvLgorICogXHBhcmFtW2luXSAgICAgbWFwRGVzY3IgICAgICAgIFBvaW50ZXIgdG8gYSBGREsgY2hhbm5lbCBtYXBwaW5nIGRlc2NyaXB0b3IgdGhhdCBjb250YWlucyB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIG1hcHBpbmcgdG8gYmUgdXNlZC4KKyAqIFxwYXJhbVtvdXRdICAgIHBEbXhPdXRTY2FsZSAgICBQb2ludGVyIG9uIGEgZmllbGQgcmVjZWl2aW5nIHRoZSBzY2FsZSBmYWN0b3IgdGhhdCBoYXMgdG8gYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWVkIG9uIGFsbCBzYW1wbGVzIGFmdGVyd2FyZHMuIElmIHRoZQorICpoYW5kZWQgcG9pbnRlciBpcyBOVUxMIHRoZSBmaW5hbCBzY2FsaW5nIGlzIGRvbmUgaW50ZXJuYWxseS4KKyAqIEByZXR1cm5zICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5zIGFuIGVycm9yIGNvZGUgb2YgdHlwZSA6OlBDTURNWF9FUlJPUi4KKyAqKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfQXBwbHlGcmFtZShIQU5ETEVfUENNX0RPV05NSVggc2VsZiwgRE1YX1BDTSAqcFBjbUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcGNtQnVmU2l6ZSwgVUlOVCBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpuQ2hhbm5lbHMsIElOVCBmSW50ZXJsZWF2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGNoYW5uZWxUeXBlW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgY2hhbm5lbEluZGljZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGREtfY2hhbm5lbE1hcERlc2NyICpjb25zdCBtYXBEZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnBEbXhPdXRTY2FsZSk7CisKKy8qKiBDbG9zZSBhbiBpbnN0YW5jZSBvZiB0aGUgUENNIGRvd25taXggbW9kdWxlLgorICogQHBhcmFtW2luLG91dF0gcFNlbGYgIFBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgaGFuZGxlIG9mIHRoZQorICppbnN0YW5jZS4KKyAqIEByZXR1cm5zICAgICAgICAgICAgICBSZXR1cm5zIGFuIGVycm9yIGNvZGUgb2YgdHlwZSA6OlBDTURNWF9FUlJPUi4KKyAqKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfQ2xvc2UoSEFORExFX1BDTV9ET1dOTUlYICpwU2VsZik7CisKKy8qKiBHZXQgbGlicmFyeSBpbmZvIGZvciB0aGlzIG1vZHVsZS4KKyAqIEBwYXJhbVtvdXRdIGluZm8gIFBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIExJQl9JTkZPIHN0cnVjdHVyZS4KKyAqIEByZXR1cm5zICAgICAgICAgIFJldHVybnMgYW4gZXJyb3IgY29kZSBvZiB0eXBlIDo6UENNRE1YX0VSUk9SLgorICovCitQQ01ETVhfRVJST1IgcGNtRG14X0dldExpYkluZm8oTElCX0lORk8gKmluZm8pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogUENNRE1YX0xJQl9IICovCmRpZmYgLS1naXQgYS9saWJQQ011dGlscy9pbmNsdWRlL3BjbXV0aWxzX2xpYi5oIGIvbGliUENNdXRpbHMvaW5jbHVkZS9wY211dGlsc19saWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdlNmE0MS4uMDAwMDAwMAotLS0gYS9saWJQQ011dGlscy9pbmNsdWRlL3BjbXV0aWxzX2xpYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqICBGREsgUENNIHVwL2Rvd25taXhpbmcgbW9kdWxlICAqKioqKioqKioqKioqKioqKioqKioKLQotICAgQXV0aG9yKHMpOiAgIENocmlzdGlhbiBHcmllYmVsCi0gICBEZXNjcmlwdGlvbjogRGVjbGFyZXMgZnVuY3Rpb25zIHRvIGludGVyZmFjZSB3aXRoIHRoZSBQQ00gZG93bm1peCBwcm9jZXNzaW5nCi0gICAgICAgICAgICAgICAgbW9kdWxlLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9QQ01VVElMU19MSUJfSF8KLSNkZWZpbmUgX1BDTVVUSUxTX0xJQl9IXwotCi0jaW5jbHVkZSAibWFjaGluZV90eXBlLmgiCi0jaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgotI2luY2x1ZGUgIkZES19hdWRpby5oIgotI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgotICogICAgIEVSUk9SIENPREVTOiAgICAgICAgICoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gIFBDTURNWF9PSyAgICAgICAgICAgICAgPSAweDAsICAgLyohPCBObyBlcnJvciBoYXBwZW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBwY21fZG14X2ZhdGFsX2Vycm9yX3N0YXJ0LAotICBQQ01ETVhfT1VUX09GX01FTU9SWSAgID0gMHgyLCAgIC8qITwgTm90IGVub3VnaCBtZW1vcnkgdG8gc2V0IHVwIGFuIGluc3RhbmNlIG9mIHRoZSBtb2R1bGUuICAgICovCi0gIFBDTURNWF9VTktOT1dOICAgICAgICAgPSAweDUsICAgLyohPCBFcnJvciBjb25kaXRpb24gaXMgb2YgdW5rbm93biByZWFzb24sIG9yIGZyb20gYSB0aGlyZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHkgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHBjbV9kbXhfZmF0YWxfZXJyb3JfZW5kLAotCi0gIFBDTURNWF9JTlZBTElEX0hBTkRMRSwgICAgICAgICAgLyohPCBUaGUgZ2l2ZW4gaW5zdGFuY2UgaGFuZGxlIGlzIG5vdCB2YWxpZC4gICAgICAgICAgICAgICAgICAgKi8KLSAgUENNRE1YX0lOVkFMSURfQVJHVU1FTlQsICAgICAgICAvKiE8IE9uZSBvZiB0aGUgcGFyYW1ldGVycyBoYW5kZWQgb3ZlciBpcyBpbnZhbGlkLiAgICAgICAgICAgICAqLwotICBQQ01ETVhfSU5WQUxJRF9DSF9DT05GSUcsICAgICAgIC8qITwgVGhlIGdpdmVuIGNoYW5uZWwgY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB0aHVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBwcm9jZXNzaW5nIHdhcyBwZXJmb3JtZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgUENNRE1YX0lOVkFMSURfTU9ERSwgICAgICAgICAgICAvKiE8IFRoZSBzZXQgY29uZmlndXJhdGlvbi9tb2RlIGlzIG5vdCBhcHBsaWNhYmxlLiAgICAgICAgICAgICAqLwotICBQQ01ETVhfVU5LTk9XTl9QQVJBTSwgICAgICAgICAgIC8qITwgVGhlIGhhbmRlZCBwYXJhbWV0ZXIgaXMgbm90IGtub3duL3N1cHBvcnRlZC4gICAgICAgICAgICAgICovCi0gIFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNLCAgICAgLyohPCBVbmFibGUgdG8gc2V0IHRoZSBzcGVjaWZpYyBwYXJhbWV0ZXIuIE1vc3QgcHJvYmFibHkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpc3Qgb3V0IG9mIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgUENNRE1YX0NPUlJVUFRfQU5DX0RBVEEgICAgICAgICAvKiE8IFRoZSByZWFkIGFuY2lsbGFyeSBkYXRhIHdhcyBjb3JydXB0LiAgICAgICAgICAgICAgICAgICAgICAqLwotCi19IFBDTURNWF9FUlJPUjsKLQotLyoqIE1hY3JvIHRvIGlkZW50aWZ5IGZhdGFsIGVycm9ycy4gKi8KLSNkZWZpbmUgUENNRE1YX0lTX0ZBVEFMX0VSUk9SKGVycikgICAoICgoKGVycik+PXBjbV9kbXhfZmF0YWxfZXJyb3Jfc3RhcnQpICAgJiYgKChlcnIpPD1wY21fZG14X2ZhdGFsX2Vycm9yX2VuZCkpICAgPyAxIDogMCkKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKLSAqICAgICBSVU5USU1FIFBBUkFNUzogICAgICAqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXR5cGVkZWYgZW51bQotewotICBETVhfQlNfREFUQV9FWFBJUllfRlJBTUUsICAgICAgIC8qITwgVGhlIG51bWJlciBvZiBmcmFtZXMgd2l0aG91dCBuZXcgbWV0YWRhdGEgdGhhdCBoYXZlIHRvIGdvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBiZWZvcmUgdGhlIGJpdHN0cmVhbSBkYXRhIGV4cGlyZXMuIFRoZSB2YWx1ZSAwIGRpc2FibGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRE1YX0JTX0RBVEFfREVMQVksICAgICAgICAgICAgICAvKiE8IFRoZSBudW1iZXIgb2YgZGVsYXkgZnJhbWVzIG9mIHRoZSBvdXRwdXQgc2FtcGxlcyBjb21wYXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGJpdHN0cmVhbSBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIE1JTl9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTLCAgLyohPCBUaGUgbWluaW11bSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiBGb3IgYWxsIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9ucyB0aGF0IGhhdmUgbGVzcyB0aGFuIHRoZSBnaXZlbiBjaGFubmVscyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSB3aWxsIG1vZGlmeSB0aGUgb3V0cHV0IGF1dG9tYXRpY2FsbHkgdG8gb2J0YWluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4gTW9ubyBzaWduYWxzIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZWQuIElmIG1vcmUgdGhhbiB0d28gb3V0cHV0IGNoYW5uZWxzIGFyZSBkZXNpcmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbW9kdWxlIGp1c3QgYWRkcyBlbXB0eSBjaGFubmVscy4gVGhlIHBhcmFtZXRlciB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBlaXRoZXIgLTEsIDAsIDEsIDIsIDYgb3IgOC4gSWYgdGhlIHZhbHVlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gemVybyBhbmQgZXhjZWVkcyB0aGUgdmFsdWUgb2YgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUyB0aGUgbGF0dGVyIHdpbGwgYmUgc2V0IHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSB2YWx1ZS4gQm90aCB2YWx1ZXMgLTEgYW5kIDAgZGlzYWJsZSB0aGUgZmVhdHVyZS4gKi8KLSAgTUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMsICAvKiE8IFRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMuIEZvciBhbGwgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25zIHRoYXQgaGF2ZSBtb3JlIHRoYW4gdGhlIGdpdmVuIGNoYW5uZWxzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIHdpbGwgYXBwbHkgYSBtaXhkb3duIGF1dG9tYXRpY2FsbHkgdG8gb2J0YWluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4gVGhlIHZhbHVlIG11c3QgYmUgZWl0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgMCwgMSwgMiwgNiBvciA4LiBJZiBpdCBpcyBncmVhdGVyIHRoYW4gemVybyBhbmQgbG93ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGVxdWFsIHRoYW4gdGhlIHZhbHVlIG9mIE1JTl9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgdGhlIGxhdHRlciB3aWxsIGJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZXMgLTEgYW5kIDAgZGlzYWJsZSB0aGUgZmVhdHVyZS4gICAgICAgICAgICAgICAgICAqLwotICBETVhfRFVBTF9DSEFOTkVMX01PREUsICAgICAgICAgIC8qITwgRG93bm1peCBtb2RlIGZvciB0d28gY2hhbm5lbCBhdWRpbyBkYXRhLiAgICAgICAgICAgICAgICAgICovCi0gIERNWF9QU0VVRE9fU1VSUk9VTkRfTU9ERSAgICAgICAgLyohPCBEZWZpbmVzIGhvdyBtb2R1bGUgaGFuZGxlcyBwc2V1ZG8gc3Vycm91bmQgY29tcGF0aWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFscy4gU2VlIFBTRVVET19TVVJST1VORF9NT0RFIHR5cGUgZm9yIGRldGFpbHMuICAgICAgICovCi19IFBDTURNWF9QQVJBTTsKLQotLyogUGFyYW1ldGVyIHZhbHVlIHR5cGVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgTkVWRVJfRE9fUFNfRE1YID0gLTEsICAgICAgICAgICAvKiE8IE5ldmVyIGNyZWF0ZSBhIHBzZXVkbyBzdXJyb3VuZCBjb21wYXRpYmxlIGRvd25taXguICAgICAgICAqLwotICBBVVRPX1BTX0RNWCAgICAgPSAgMCwgICAgICAgICAgIC8qITwgQ3JlYXRlIGEgcHNldWRvIHN1cnJvdW5kIGNvbXBhdGlibGUgZG93bm1peCBvbmx5IGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxsZWQgaW4gYml0c3RyZWFtcyBtZXRhIGRhdGEuIChEZWZhdWx0KSAgICAgICAgICAgICAgKi8KLSAgRk9SQ0VfUFNfRE1YICAgID0gIDEgICAgICAgICAgICAvKiE8IEFsd2F5cyBjcmVhdGUgYSBwc2V1ZG8gc3Vycm91bmQgY29tcGF0aWJsZSBkb3dubWl4LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FVVElPTjogVGhpcyBjYW4gbGVhZCB0byBleGNlc3NpdmUgc2lnbmFsIGNhbmNlbGxhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBzaWduYWwgbGV2ZWwgZGlmZmVyZW5jZXMgZm9yIG5vbi1jb21wYXRpYmxlIHNpZ25hbHMuICAqLwotfSBQU0VVRE9fU1VSUk9VTkRfTU9ERTsKLQotdHlwZWRlZiBlbnVtCi17Ci0gIFNURVJFT19NT0RFID0gMHgwLCAgICAgICAgICAgICAgLyohPCBMZWF2ZSBzdGVyZW8gc2lnbmFscyBhcyB0aGV5IGFyZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQ0gxX01PREUgICAgPSAweDEsICAgICAgICAgICAgICAvKiE8IENyZWF0ZSBhIGR1YWwgbW9ubyBvdXRwdXQgc2lnbmFsIGZyb20gY2hhbm5lbCAxLiAgICAgICAgICAqLwotICBDSDJfTU9ERSAgICA9IDB4MiwgICAgICAgICAgICAgIC8qITwgQ3JlYXRlIGEgZHVhbCBtb25vIG91dHB1dCBzaWduYWwgZnJvbSBjaGFubmVsIDIuICAgICAgICAgICovCi0gIE1JWEVEX01PREUgID0gMHgzICAgICAgICAgICAgICAgLyohPCBDcmVhdGUgYSBkdWFsIG1vbm8gb3V0cHV0IHNpZ25hbCBieSBtaXhpbmcgdGhlIHR3bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi19IERVQUxfQ0hBTk5FTF9NT0RFOwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCi0gKiAgICAgTU9EVUxFUyBJTlRFUkZBQ0U6ICAgKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi10eXBlZGVmIHN0cnVjdCBQQ01fRE1YX0lOU1RBTkNFICpIQU5ETEVfUENNX0RPV05NSVg7Ci0KLS8qIE1vZHVsZXMgcmVzZXQgZmxhZ3MgKi8KLSNkZWZpbmUgUENNRE1YX1JFU0VUX1BBUkFNUyAgICggMSApCi0jZGVmaW5lIFBDTURNWF9SRVNFVF9CU19EQVRBICAoIDIgKQotI2RlZmluZSBQQ01ETVhfUkVTRVRfRlVMTCAgICAgKCBQQ01ETVhfUkVTRVRfUEFSQU1TIHwgUENNRE1YX1JFU0VUX0JTX0RBVEEgKQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi0vKiogT3BlbiBhbmQgaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGUgUENNIGRvd25taXggbW9kdWxlCi0gKiBAcGFyYW0gW291dF0gUG9pbnRlciB0byBhIGJ1ZmZlciByZWNlaXZpbmcgdGhlIGhhbmRsZSBvZiB0aGUgbmV3IGluc3RhbmNlLgotICogQHJldHVybnMgICAgIFJldHVybnMgYW4gZXJyb3IgY29kZS4KLSAqKi8KLVBDTURNWF9FUlJPUiBwY21EbXhfT3BlbiAoCi0gICAgSEFORExFX1BDTV9ET1dOTUlYICpwU2VsZgotICApOwotCi0vKiogU2V0IG9uZSBwYXJhbWV0ZXIgZm9yIG9uZSBpbnN0YW5jZSBvZiB0aGUgUENNIGRvd25taXggbW9kdWxlLgotICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IGluc3RhbmNlLgotICogQHBhcmFtIFtpbl0gUGFyYW1ldGVyIHRvIGJlIHNldC4KLSAqIEBwYXJhbSBbaW5dIFBhcmFtZXRlciB2YWx1ZS4KLSAqIEByZXR1cm5zICAgIFJldHVybnMgYW4gZXJyb3IgY29kZS4KLSAqKi8KLVBDTURNWF9FUlJPUiBwY21EbXhfU2V0UGFyYW0gKAotICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKLSAgICBjb25zdCBQQ01ETVhfUEFSQU0gIHBhcmFtLAotICAgIGNvbnN0IElOVCAgICAgICAgICAgdmFsdWUKLSAgKTsKLQotLyoqIEdldCBvbmUgcGFyYW1ldGVyIHZhbHVlIG9mIG9uZSBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCi0gKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgotICogQHBhcmFtIFtpbl0gUGFyYW1ldGVyIHRvIGJlIHNldC4KLSAqIEBwYXJhbSBbb3V0XSBQb2ludGVyIHRvIGJ1ZmZlciByZWNlaXZpbmcgdGhlIHBhcmFtZXRlciB2YWx1ZS4KLSAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KLSAqKi8KLVBDTURNWF9FUlJPUiBwY21EbXhfR2V0UGFyYW0gKAotICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKLSAgICBjb25zdCBQQ01ETVhfUEFSQU0gIHBhcmFtLAotICAgIElOVCAqIGNvbnN0ICAgICAgICAgcFZhbHVlCi0gICk7Ci0KLS8qKiBSZWFkIGRvd25taXggbWV0YS1kYXRhIGRpcmVjdGx5IGZyb20gYSBnaXZlbiBiaXRzdHJlYW0uCi0gKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggaW5zdGFuY2UuCi0gKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgRkRLIGJpdHN0cmVhbSBidWZmZXIuCi0gKiBAcGFyYW0gW2luXSBMZW5ndGggb2YgYW5jaWxsYXJ5IGRhdGEgaW4gYml0cy4KLSAqIEBwYXJhbSBbaW5dIEZsYWcgaW5kaWNhdGluZyB3aGV0ZXIgdGhlIGFuY2lsbGFyeSBkYXRhIGlzIGZyb20gYSBNUEVHLTEvMiBvciBhbiBNUEVHLTQgc3RyZWFtLgotICogQHJldHVybnMgICAgUmV0dXJucyBhbiBlcnJvciBjb2RlLgotICoqLwotUENNRE1YX0VSUk9SIHBjbURteF9QYXJzZSAoCi0gICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAotICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0U3RyZWFtLAotICAgIFVJTlQgICBhbmNEYXRhQml0cywKLSAgICBpbnQgICAgaXNNcGVnMgotICApOwotCi0vKiogUmVhZCBkb3dubWl4IG1ldGEtZGF0YSBmcm9tIGEgZ2l2ZW4gZGF0YSBidWZmZXIuCi0gKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggaW5zdGFuY2UuCi0gKiBAcGFyYW0gW2luXSBQb2ludGVyIHRvIGFuY2lsbGFyeSBkYXRhIGJ1ZmZlci4KLSAqIEBwYXJhbSBbaW5dIFNpemUgb2YgYW5jaWxsYXJ5IGRhdGEgaW4gYnl0ZXMuCi0gKiBAcGFyYW0gW2luXSBGbGFnIGluZGljYXRpbmcgd2hldGVyIHRoZSBhbmNpbGxhcnkgZGF0YSBpcyBmcm9tIGEgTVBFRy0xLzIgb3IgYW4gTVBFRy00IHN0cmVhbS4KLSAqIEByZXR1cm5zICAgIFJldHVybnMgYW4gZXJyb3IgY29kZS4KLSAqKi8KLVBDTURNWF9FUlJPUiBwY21EbXhfUmVhZER2YkFuY0RhdGEgKAotICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKLSAgICBVQ0hBUiAqcEFuY0RhdGFCdWYsCi0gICAgVUlOVCAgIGFuY0RhdGFCeXRlcywKLSAgICBpbnQgICAgaXNNcGVnMgotICApOwotCi0vKiogU2V0IHRoZSBtYXRyaXggbWl4ZG93biBpbmZvcm1hdGlvbiBleHRyYWN0ZWQgZnJvbSB0aGUgUENFIG9mIGFuIEFBQyBiaXRzdHJlYW0uCi0gKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggaW5zdGFuY2UuCi0gKiBAcGFyYW0gW2luXSBNYXRyaXggbWl4ZG93biBpbmRleCBwcmVzZW50IGZsYWcgZXh0cmFjdGVkIGZyb20gUENFLgotICogQHBhcmFtIFtpbl0gVGhlIDIgYml0IG1hdHJpeCBtaXhkb3duIGluZGV4IGV4dHJhY3RlZCBmcm9tIFBDRS4KLSAqIEBwYXJhbSBbaW5dIFRoZSBwc2V1ZG8gc3Vycm91bmQgZW5hYmxlIGZsYWcgZXh0cmFjdGVkIGZyb20gUENFLgotICogQHJldHVybnMgICAgUmV0dXJucyBhbiBlcnJvciBjb2RlLgotICoqLwotUENNRE1YX0VSUk9SIHBjbURteF9TZXRNYXRyaXhNaXhkb3duRnJvbVBjZSAoCi0gICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAotICAgIGludCAgICAgICAgICAgICAgICAgbWF0cml4TWl4ZG93blByZXNlbnQsCi0gICAgaW50ICAgICAgICAgICAgICAgICBtYXRyaXhNaXhkb3duSWR4LAotICAgIGludCAgICAgICAgICAgICAgICAgcHNldWRvU3Vycm91bmRFbmFibGUKLSAgKTsKLQotLyoqIFJlc2V0IHRoZSBtb2R1bGUuCi0gKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggaW5zdGFuY2UuCi0gKiBAcGFyYW0gW2luXSBGbGFncyB0ZWxsaW5nIHdoaWNoIHBhcnRzIG9mIHRoZSBtb2R1bGUgc2hhbGwgYmUgcmVzZXQuCi0gKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCi0gKiovCi1QQ01ETVhfRVJST1IgcGNtRG14X1Jlc2V0ICgKLSAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCi0gICAgVUlOVCAgICAgICAgICAgICAgICBmbGFncwotICApOwotCi0vKiogQ3JlYXRlIGEgbWl4ZG93biwgYnlwYXNzIG9yIGV4dGVuZCB0aGUgb3V0cHV0IHNpZ25hbCBkZXBlbmRpbmcgb24gdGhlIG1vZHVsZXMgc2V0dGluZ3MgYW5kIHRoZQotICogIHJlc3BlY3RpdmUgZ2l2ZW4gaW5wdXQgY29uZmlndXJhdGlvbi4KLSAqCi0gKiBccGFyYW0gW2luXSAgICBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgotICogXHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byB0aW1lIGJ1ZmZlciB3aXRoIGRlY29kZWQgUENNIHNhbXBsZXMuCi0gKiBccGFyYW0gW2luXSAgICBUaGUgSS9PIGJsb2NrIHNpemUgd2hpY2ggaXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciBjaGFubmVsLgotICogXHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBidWZmZXIgdGhhdCBob2xkcyB0aGUgbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzIGFuZCB3aGVyZSB0aGUKLSAqICAgICAgICAgICAgICAgIGFtb3VudCBvZiBvdXRwdXQgY2hhbm5lbHMgaXMgd3JpdHRlbiB0by4KLSAqIFxwYXJhbSBbaW5dICAgIEZsYWcgd2hpY2ggaW5kaWNhdGVzIGlmIG91dHB1dCB0aW1lIGRhdGEgaXMgd3JpdHRlcm4gaW50ZXJsZWF2ZWQgb3IgYXMKLSAqICAgICAgICAgICAgICAgIHN1YnNlcXVlbnQgYmxvY2tzLgotICogXHBhcmFtIFtpbm91dF0gQXJyYXkgd2VyZSB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgZm9yIGVhY2ggb3V0cHV0IGF1ZGlvIGNoYW5uZWwgaXMKLSAqICAgICAgICAgICAgICAgIHN0b3JlZCBpbnRvLgotICogXHBhcmFtIFtpbm91dF0gQXJyYXkgd2VyZSB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgaW5kZXggZm9yIGVhY2ggb3V0cHV0IGF1ZGlvIGNoYW5uZWwKLSAqICAgICAgICAgICAgICAgIGlzIHN0b3JlZCBpbnRvLgotICogXHBhcmFtIFtpbl0gICAgQXJyYXkgY29udGFpbmluZyB0aGUgb3V0cHV0IGNoYW5uZWwgbWFwcGluZyB0byBiZSB1c2VkIChmcm9tIE1QRUcgUENFIG9yZGVyaW5nCi0gKiAgICAgICAgICAgICAgICB0byB3aGF0ZXZlciBpcyByZXF1aXJlZCkuCi0gKiBccGFyYW0gW291dF0gICBQb2ludGVyIG9uIGEgZmllbGQgcmVjZWl2aW5nIHRoZSBzY2FsZSBmYWN0b3IgdGhhdCBoYXMgdG8gYmUgYXBwbGllZCBvbiBhbGwKLSAqICAgICAgICAgICAgICAgIHNhbXBsZXMgYWZ0ZXJ3YXJkcy4gSWYgdGhlIGhhbmRlZCBwb2ludGVyIGlzIE5VTEwgdGhlIGZpbmFsIHNjYWxpbmcgaXMgZG9uZQotICogICAgICAgICAgICAgICAgaW50ZXJuYWxseS4KLSAqIEByZXR1cm5zICAgICAgIFJldHVybnMgYW4gZXJyb3IgY29kZS4KLSAqKi8KLVBDTURNWF9FUlJPUiBwY21EbXhfQXBwbHlGcmFtZSAoCi0gICAgSEFORExFX1BDTV9ET1dOTUlYICAgICAgc2VsZiwKLSAgICBJTlRfUENNICAgICAgICAgICAgICAgICpwUGNtQnVmLAotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSwKLSAgICBJTlQgICAgICAgICAgICAgICAgICAgICpuQ2hhbm5lbHMsCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgZkludGVybGVhdmVkLAotICAgIEFVRElPX0NIQU5ORUxfVFlQRSAgICAgIGNoYW5uZWxUeXBlW10sCi0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgY2hhbm5lbEluZGljZXNbXSwKLSAgICBjb25zdCBVQ0hBUiAgICAgICAgICAgICBjaGFubmVsTWFwcGluZ1tdWzhdLAotICAgIElOVCAgICAgICAgICAgICAgICAgICAgKnBEbXhPdXRTY2FsZQotICApOwotCi0vKiogQ2xvc2UgYW4gaW5zdGFuY2Ugb2YgdGhlIFBDTSBkb3dubWl4IG1vZHVsZS4KLSAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgaGFuZGxlIG9mIHRoZSBpbnN0YW5jZS4KLSAqIEByZXR1cm5zICAgICAgIFJldHVybnMgYW4gZXJyb3IgY29kZS4KLSAqKi8KLVBDTURNWF9FUlJPUiBwY21EbXhfQ2xvc2UgKAotICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAqcFNlbGYKLSAgKTsKLQotLyoqIEdldCBsaWJyYXJ5IGluZm8gZm9yIHRoaXMgbW9kdWxlLgotICogQHBhcmFtIFtvdXRdIFBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIExJQl9JTkZPIHN0cnVjdHVyZS4KLSAqIEByZXR1cm5zICAgICBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCi0gKi8KLVBDTURNWF9FUlJPUiBwY21EbXhfR2V0TGliSW5mbyggTElCX0lORk8gKmluZm8gKTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgIC8qIF9QQ01VVElMU19MSUJfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYlBDTXV0aWxzL3NyYy9saW1pdGVyLmNwcCBiL2xpYlBDTXV0aWxzL3NyYy9saW1pdGVyLmNwcAppbmRleCBhZjcyNGYwLi5hNzk5YTUxIDEwMDY0NAotLS0gYS9saWJQQ011dGlscy9zcmMvbGltaXRlci5jcHAKKysrIGIvbGliUENNdXRpbHMvc3JjL2xpbWl0ZXIuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQ2ICs5MCwyOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKiogIEZESyBQQ00gcG9zdHByb2Nlc3NvciBtb2R1bGUgICoqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogUENNIHV0aWxpdHkgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOiAgIE1hdHRoaWFzIE5ldXNpbmdlcgorCiAgICBEZXNjcmlwdGlvbjogSGFyZCBsaW1pdGVyIGZvciBjbGlwcGluZyBwcmV2ZW50aW9uCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJsaW1pdGVyLmgiCisjaW5jbHVkZSAiRkRLX2NvcmUuaCIKIAotCi1zdHJ1Y3QgVERMaW1pdGVyIHsKLSAgdW5zaWduZWQgaW50ICBhdHRhY2s7Ci0gIEZJWFBfREJMICAgICAgYXR0YWNrQ29uc3QsIHJlbGVhc2VDb25zdDsKLSAgdW5zaWduZWQgaW50ICBhdHRhY2tNcywgcmVsZWFzZU1zLCBtYXhBdHRhY2tNczsKLSAgRklYUF9QQ00gICAgICB0aHJlc2hvbGQ7Ci0gIHVuc2lnbmVkIGludCAgY2hhbm5lbHMsIG1heENoYW5uZWxzOwotICB1bnNpZ25lZCBpbnQgIHNhbXBsZVJhdGUsIG1heFNhbXBsZVJhdGU7Ci0gIEZJWFBfREJMICAgICAgY29yLCBtYXg7Ci0gIEZJWFBfREJMKiAgICAgbWF4QnVmOwotICBGSVhQX0RCTCogICAgIGRlbGF5QnVmOwotICB1bnNpZ25lZCBpbnQgIG1heEJ1ZklkeCwgZGVsYXlCdWZJZHg7Ci0gIEZJWFBfREJMICAgICAgc21vb3RoU3RhdGUwOwotICBGSVhQX0RCTCAgICAgIG1pbkdhaW47Ci0KLSAgRklYUF9EQkwgICAgICBhZGRpdGlvbmFsR2FpblByZXY7Ci0gIEZJWFBfREJMICAgICAgYWRkaXRpb25hbEdhaW5GaWx0ZXJTdGF0ZTsKLSAgRklYUF9EQkwgICAgICBhZGRpdGlvbmFsR2FpbkZpbHRlclN0YXRlMTsKLX07CisvKiBsaWJyYXJ5IHZlcnNpb24gKi8KKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisvKiBsaWJyYXJ5IHRpdGxlICovCisjZGVmaW5lIFRETElNSVRfTElCX1RJVExFICJURCBMaW1pdGVyIExpYiIKIAogLyogY3JlYXRlIGxpbWl0ZXIgKi8KLVRETGltaXRlclB0ciBjcmVhdGVMaW1pdGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBtYXhBdHRhY2tNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgcmVsZWFzZU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgICAgICB0aHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIG1heENoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBtYXhTYW1wbGVSYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CitURExpbWl0ZXJQdHIgcGNtTGltaXRlcl9DcmVhdGUodW5zaWduZWQgaW50IG1heEF0dGFja01zLCB1bnNpZ25lZCBpbnQgcmVsZWFzZU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHRocmVzaG9sZCwgdW5zaWduZWQgaW50IG1heENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgbWF4U2FtcGxlUmF0ZSkgewogICBURExpbWl0ZXJQdHIgbGltaXRlciA9IE5VTEw7CiAgIHVuc2lnbmVkIGludCBhdHRhY2ssIHJlbGVhc2U7CiAgIEZJWFBfREJMIGF0dGFja0NvbnN0LCByZWxlYXNlQ29uc3QsIGV4cG9uZW50OwpAQCAtMTMzLDE2ICsxMjYsMTcgQEAKICAgaWYgKCFsaW1pdGVyKSByZXR1cm4gTlVMTDsKIAogICAvKiBhbGxvYyBtYXggYW5kIGRlbGF5IGJ1ZmZlcnMgKi8KLSAgbGltaXRlci0+bWF4QnVmICAgPSAoRklYUF9EQkwqKUZES2NhbGxvYyhhdHRhY2sgKyAxLCBzaXplb2YoRklYUF9EQkwpKTsKLSAgbGltaXRlci0+ZGVsYXlCdWYgPSAoRklYUF9EQkwqKUZES2NhbGxvYyhhdHRhY2sgKiBtYXhDaGFubmVscywgc2l6ZW9mKEZJWFBfREJMKSk7CisgIGxpbWl0ZXItPm1heEJ1ZiA9IChGSVhQX0RCTCopRkRLY2FsbG9jKGF0dGFjayArIDEsIHNpemVvZihGSVhQX0RCTCkpOworICBsaW1pdGVyLT5kZWxheUJ1ZiA9CisgICAgICAoRklYUF9EQkwqKUZES2NhbGxvYyhhdHRhY2sgKiBtYXhDaGFubmVscywgc2l6ZW9mKEZJWFBfREJMKSk7CiAKICAgaWYgKCFsaW1pdGVyLT5tYXhCdWYgfHwgIWxpbWl0ZXItPmRlbGF5QnVmKSB7Ci0gICAgZGVzdHJveUxpbWl0ZXIobGltaXRlcik7CisgICAgcGNtTGltaXRlcl9EZXN0cm95KGxpbWl0ZXIpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKICAgLyogYXR0YWNrQ29uc3QgPSBwb3coMC4xLCAxLjAgLyAoYXR0YWNrICsgMSkpICovCi0gIGV4cG9uZW50ID0gaW52Rml4cChhdHRhY2srMSk7CisgIGV4cG9uZW50ID0gaW52Rml4cChhdHRhY2sgKyAxKTsKICAgYXR0YWNrQ29uc3QgPSBmUG93KEZMMkZYQ09OU1RfREJMKDAuMWYpLCAwLCBleHBvbmVudCwgMCwgJmVfYW5zKTsKICAgYXR0YWNrQ29uc3QgPSBzY2FsZVZhbHVlKGF0dGFja0NvbnN0LCBlX2Fucyk7CiAKQEAgLTE1MiwxNDAgKzE0NiwxMDcgQEAKICAgcmVsZWFzZUNvbnN0ID0gc2NhbGVWYWx1ZShyZWxlYXNlQ29uc3QsIGVfYW5zKTsKIAogICAvKiBpbml0IHBhcmFtZXRlcnMgKi8KLSAgbGltaXRlci0+YXR0YWNrTXMgICAgICA9IG1heEF0dGFja01zOwotICBsaW1pdGVyLT5tYXhBdHRhY2tNcyAgID0gbWF4QXR0YWNrTXM7Ci0gIGxpbWl0ZXItPnJlbGVhc2VNcyAgICAgPSByZWxlYXNlTXM7Ci0gIGxpbWl0ZXItPmF0dGFjayAgICAgICAgPSBhdHRhY2s7Ci0gIGxpbWl0ZXItPmF0dGFja0NvbnN0ICAgPSBhdHRhY2tDb25zdDsKLSAgbGltaXRlci0+cmVsZWFzZUNvbnN0ICA9IHJlbGVhc2VDb25zdDsKLSAgbGltaXRlci0+dGhyZXNob2xkICAgICA9IChGSVhQX1BDTSl0aHJlc2hvbGQ7Ci0gIGxpbWl0ZXItPmNoYW5uZWxzICAgICAgPSBtYXhDaGFubmVsczsKLSAgbGltaXRlci0+bWF4Q2hhbm5lbHMgICA9IG1heENoYW5uZWxzOwotICBsaW1pdGVyLT5zYW1wbGVSYXRlICAgID0gbWF4U2FtcGxlUmF0ZTsKKyAgbGltaXRlci0+YXR0YWNrTXMgPSBtYXhBdHRhY2tNczsKKyAgbGltaXRlci0+bWF4QXR0YWNrTXMgPSBtYXhBdHRhY2tNczsKKyAgbGltaXRlci0+cmVsZWFzZU1zID0gcmVsZWFzZU1zOworICBsaW1pdGVyLT5hdHRhY2sgPSBhdHRhY2s7CisgIGxpbWl0ZXItPmF0dGFja0NvbnN0ID0gYXR0YWNrQ29uc3Q7CisgIGxpbWl0ZXItPnJlbGVhc2VDb25zdCA9IHJlbGVhc2VDb25zdDsKKyAgbGltaXRlci0+dGhyZXNob2xkID0gdGhyZXNob2xkID4+IFRETF9HQUlOX1NDQUxJTkc7CisgIGxpbWl0ZXItPmNoYW5uZWxzID0gbWF4Q2hhbm5lbHM7CisgIGxpbWl0ZXItPm1heENoYW5uZWxzID0gbWF4Q2hhbm5lbHM7CisgIGxpbWl0ZXItPnNhbXBsZVJhdGUgPSBtYXhTYW1wbGVSYXRlOwogICBsaW1pdGVyLT5tYXhTYW1wbGVSYXRlID0gbWF4U2FtcGxlUmF0ZTsKIAotICByZXNldExpbWl0ZXIobGltaXRlcik7CisgIHBjbUxpbWl0ZXJfUmVzZXQobGltaXRlcik7CiAKICAgcmV0dXJuIGxpbWl0ZXI7CiB9CiAKLQotLyogcmVzZXQgbGltaXRlciAqLwotVERMSU1JVEVSX0VSUk9SIHJlc2V0TGltaXRlcihURExpbWl0ZXJQdHIgbGltaXRlcikKLXsKLSAgaWYgKGxpbWl0ZXIgIT0gTlVMTCkgewotCi0gICAgbGltaXRlci0+bWF4QnVmSWR4ID0gMDsKLSAgICBsaW1pdGVyLT5kZWxheUJ1ZklkeCA9IDA7Ci0gICAgbGltaXRlci0+bWF4ID0gKEZJWFBfREJMKTA7Ci0gICAgbGltaXRlci0+Y29yID0gRkwyRlhDT05TVF9EQkwoMS4wZi8oMTw8MSkpOwotICAgIGxpbWl0ZXItPnNtb290aFN0YXRlMCA9IEZMMkZYQ09OU1RfREJMKDEuMGYvKDE8PDEpKTsKLSAgICBsaW1pdGVyLT5taW5HYWluID0gRkwyRlhDT05TVF9EQkwoMS4wZi8oMTw8MSkpOwotCi0gICAgbGltaXRlci0+YWRkaXRpb25hbEdhaW5QcmV2ID0gRkwyRlhDT05TVF9EQkwoMS4wZi8oMTw8VERMX0dBSU5fU0NBTElORykpOwotICAgIGxpbWl0ZXItPmFkZGl0aW9uYWxHYWluRmlsdGVyU3RhdGUgPSBGTDJGWENPTlNUX0RCTCgxLjBmLygxPDxURExfR0FJTl9TQ0FMSU5HKSk7Ci0gICAgbGltaXRlci0+YWRkaXRpb25hbEdhaW5GaWx0ZXJTdGF0ZTEgPSBGTDJGWENPTlNUX0RCTCgxLjBmLygxPDxURExfR0FJTl9TQ0FMSU5HKSk7Ci0KLSAgICBGREttZW1zZXQobGltaXRlci0+bWF4QnVmLCAgIDAsIChsaW1pdGVyLT5hdHRhY2sgKyAxKSAqIHNpemVvZihGSVhQX0RCTCkgKTsKLSAgICBGREttZW1zZXQobGltaXRlci0+ZGVsYXlCdWYsIDAsIGxpbWl0ZXItPmF0dGFjayAqIGxpbWl0ZXItPmNoYW5uZWxzICogc2l6ZW9mKEZJWFBfREJMKSApOwotICB9Ci0gIGVsc2UgewotICAgIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOwotICB9Ci0KLSAgcmV0dXJuIFRETElNSVRfT0s7Ci19Ci0KLQotLyogZGVzdHJveSBsaW1pdGVyICovCi1URExJTUlURVJfRVJST1IgZGVzdHJveUxpbWl0ZXIoVERMaW1pdGVyUHRyIGxpbWl0ZXIpCi17Ci0gIGlmIChsaW1pdGVyICE9IE5VTEwpIHsKLSAgICBGREtmcmVlKGxpbWl0ZXItPm1heEJ1Zik7Ci0gICAgRkRLZnJlZShsaW1pdGVyLT5kZWxheUJ1Zik7Ci0KLSAgICBGREtmcmVlKGxpbWl0ZXIpOwotICB9Ci0gIGVsc2UgewotICAgIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOwotICB9Ci0gIHJldHVybiBURExJTUlUX09LOwotfQotCiAvKiBhcHBseSBsaW1pdGVyICovCi1URExJTUlURVJfRVJST1IgYXBwbHlMaW1pdGVyKFRETGltaXRlclB0ciBsaW1pdGVyLAotICAgICAgICAgICAgICAgICBJTlRfUENNKiAgICBzYW1wbGVzLAotICAgICAgICAgICAgICAgICBGSVhQX0RCTCogICAgcEdhaW4sCi0gICAgICAgICAgICAgICAgIGNvbnN0IElOVCogICBnYWluX3NjYWxlLAotICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgZ2Fpbl9zaXplLAotICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgZ2Fpbl9kZWxheSwKLSAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgIG5TYW1wbGVzKQoteworVERMSU1JVEVSX0VSUk9SIHBjbUxpbWl0ZXJfQXBwbHkoVERMaW1pdGVyUHRyIGxpbWl0ZXIsIFBDTV9MSU0qIHNhbXBsZXNJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00qIHNhbXBsZXNPdXQsIEZJWFBfREJMKiBSRVNUUklDVCBwR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCogUkVTVFJJQ1QgZ2Fpbl9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgZ2Fpbl9zaXplLCBjb25zdCBVSU5UIGdhaW5fZGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG5TYW1wbGVzKSB7CiAgIHVuc2lnbmVkIGludCBpLCBqOwotICBGSVhQX1BDTSB0bXAxLCB0bXAyOwotICBGSVhQX0RCTCB0bXAsIG9sZCwgZ2FpbiwgYWRkaXRpb25hbEdhaW4sIGFkZGl0aW9uYWxHYWluVW5maWx0ZXJlZDsKLSAgRklYUF9EQkwgbWluR2FpbiA9IEZMMkZYQ09OU1RfREJMKDEuMGYvKDE8PDEpKTsKKyAgRklYUF9EQkwgdG1wMTsKKyAgRklYUF9EQkwgdG1wMjsKKyAgRklYUF9EQkwgdG1wLCBvbGQsIGdhaW4sIGFkZGl0aW9uYWxHYWluID0gMCwgYWRkaXRpb25hbEdhaW5VbmZpbHRlcmVkOworICBGSVhQX0RCTCBtaW5HYWluID0gRkwyRlhDT05TVF9EQkwoMS4wZiAvICgxIDw8IDEpKTsKIAogICBGREtfQVNTRVJUKGdhaW5fc2l6ZSA9PSAxKTsKICAgRkRLX0FTU0VSVChnYWluX2RlbGF5IDw9IG5TYW1wbGVzKTsKIAotICBpZiAoIGxpbWl0ZXIgPT0gTlVMTCApIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOworICBpZiAobGltaXRlciA9PSBOVUxMKSByZXR1cm4gVERMSU1JVF9JTlZBTElEX0hBTkRMRTsKIAogICB7Ci0gICAgdW5zaWduZWQgaW50IGNoYW5uZWxzICAgICAgID0gbGltaXRlci0+Y2hhbm5lbHM7Ci0gICAgdW5zaWduZWQgaW50IGF0dGFjayAgICAgICAgID0gbGltaXRlci0+YXR0YWNrOwotICAgIEZJWFBfREJMICAgICBhdHRhY2tDb25zdCAgICA9IGxpbWl0ZXItPmF0dGFja0NvbnN0OwotICAgIEZJWFBfREJMICAgICByZWxlYXNlQ29uc3QgICA9IGxpbWl0ZXItPnJlbGVhc2VDb25zdDsKLSAgICBGSVhQX0RCTCAgICAgdGhyZXNob2xkICAgICAgPSBGWF9QQ00yRlhfREJMKGxpbWl0ZXItPnRocmVzaG9sZCk+PlRETF9HQUlOX1NDQUxJTkc7CisgICAgdW5zaWduZWQgaW50IGNoYW5uZWxzID0gbGltaXRlci0+Y2hhbm5lbHM7CisgICAgdW5zaWduZWQgaW50IGF0dGFjayA9IGxpbWl0ZXItPmF0dGFjazsKKyAgICBGSVhQX0RCTCBhdHRhY2tDb25zdCA9IGxpbWl0ZXItPmF0dGFja0NvbnN0OworICAgIEZJWFBfREJMIHJlbGVhc2VDb25zdCA9IGxpbWl0ZXItPnJlbGVhc2VDb25zdDsKKyAgICBGSVhQX0RCTCB0aHJlc2hvbGQgPSBsaW1pdGVyLT50aHJlc2hvbGQ7CiAKLSAgICBGSVhQX0RCTCAgICAgbWF4ICAgICAgICAgICAgPSBsaW1pdGVyLT5tYXg7Ci0gICAgRklYUF9EQkwqICAgIG1heEJ1ZiAgICAgICAgID0gbGltaXRlci0+bWF4QnVmOwotICAgIHVuc2lnbmVkIGludCBtYXhCdWZJZHggICAgICA9IGxpbWl0ZXItPm1heEJ1ZklkeDsKLSAgICBGSVhQX0RCTCAgICAgY29yICAgICAgICAgICAgPSBsaW1pdGVyLT5jb3I7Ci0gICAgRklYUF9EQkwqICAgIGRlbGF5QnVmICAgICAgID0gbGltaXRlci0+ZGVsYXlCdWY7Ci0gICAgdW5zaWduZWQgaW50IGRlbGF5QnVmSWR4ICAgID0gbGltaXRlci0+ZGVsYXlCdWZJZHg7CisgICAgRklYUF9EQkwgbWF4ID0gbGltaXRlci0+bWF4OworICAgIEZJWFBfREJMKiBtYXhCdWYgPSBsaW1pdGVyLT5tYXhCdWY7CisgICAgdW5zaWduZWQgaW50IG1heEJ1ZklkeCA9IGxpbWl0ZXItPm1heEJ1ZklkeDsKKyAgICBGSVhQX0RCTCBjb3IgPSBsaW1pdGVyLT5jb3I7CisgICAgRklYUF9EQkwqIGRlbGF5QnVmID0gbGltaXRlci0+ZGVsYXlCdWY7CisgICAgdW5zaWduZWQgaW50IGRlbGF5QnVmSWR4ID0gbGltaXRlci0+ZGVsYXlCdWZJZHg7CiAKLSAgICBGSVhQX0RCTCAgICAgc21vb3RoU3RhdGUwICAgPSBsaW1pdGVyLT5zbW9vdGhTdGF0ZTA7Ci0gICAgRklYUF9EQkwgICAgIGFkZGl0aW9uYWxHYWluU21vb3RoU3RhdGUgPSBsaW1pdGVyLT5hZGRpdGlvbmFsR2FpbkZpbHRlclN0YXRlOwotICAgIEZJWFBfREJMICAgICBhZGRpdGlvbmFsR2FpblNtb290aFN0YXRlMSA9IGxpbWl0ZXItPmFkZGl0aW9uYWxHYWluRmlsdGVyU3RhdGUxOworICAgIEZJWFBfREJMIHNtb290aFN0YXRlMCA9IGxpbWl0ZXItPnNtb290aFN0YXRlMDsKKyAgICBGSVhQX0RCTCBhZGRpdGlvbmFsR2FpblNtb290aFN0YXRlID0gbGltaXRlci0+YWRkaXRpb25hbEdhaW5GaWx0ZXJTdGF0ZTsKKyAgICBGSVhQX0RCTCBhZGRpdGlvbmFsR2FpblNtb290aFN0YXRlMSA9IGxpbWl0ZXItPmFkZGl0aW9uYWxHYWluRmlsdGVyU3RhdGUxOwogCi0gICAgZm9yIChpID0gMDsgaSA8IG5TYW1wbGVzOyBpKyspIHsKLQotICAgICAgaWYgKGkgPCBnYWluX2RlbGF5KSB7Ci0gICAgICAgIGFkZGl0aW9uYWxHYWluVW5maWx0ZXJlZCA9IGxpbWl0ZXItPmFkZGl0aW9uYWxHYWluUHJldjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGFkZGl0aW9uYWxHYWluVW5maWx0ZXJlZCA9IHBHYWluWzBdOwotICAgICAgfQotCi0gICAgICAvKiBTbW9vdGggYWRkaXRpb25hbEdhaW4gKi8KLSAgICAgIC8qIFtiLGFdID0gYnV0dGVyKDEsIDAuMDEpICovCi0gICAgICBzdGF0aWMgY29uc3QgRklYUF9TR0wgYltdID0geyBGTDJGWENPTlNUX1NHTCgwLjAxNTQ2NioyLjApLCBGTDJGWENPTlNUX1NHTCggMC4wMTU0NjYqMi4wKSB9OwotICAgICAgc3RhdGljIGNvbnN0IEZJWFBfU0dMIGFbXSA9IHsgRkwyRlhDT05TVF9TR0woMS4wMDAwMDApLCBGTDJGWENPTlNUX1NHTCgtMC45NjkwNykgfTsKLSAgICAgIC8qIFtiLGFdID0gYnV0dGVyKDEsIDAuMDAxKSAqLwotICAgICAgLy9zdGF0aWMgY29uc3QgRklYUF9TR0wgYltdID0geyBGTDJGWENPTlNUX1NHTCgwLjAwMTU2ODMqMi4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDAxNTY4MyoyLjApIH07Ci0gICAgICAvL3N0YXRpYyBjb25zdCBGSVhQX1NHTCBhW10gPSB7IEZMMkZYQ09OU1RfU0dMKDEuMDAwMDAwMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk5Njg2KSB9OwotICAgICAgYWRkaXRpb25hbEdhaW4gPSAtIGZNdWx0KGFkZGl0aW9uYWxHYWluU21vb3RoU3RhdGUsIGFbMV0pICsgZk11bHREaXYyKCBhZGRpdGlvbmFsR2FpblVuZmlsdGVyZWQsIGJbMF0pICsgZk11bHREaXYyKGFkZGl0aW9uYWxHYWluU21vb3RoU3RhdGUxLCBiWzFdKTsKLSAgICAgIGFkZGl0aW9uYWxHYWluU21vb3RoU3RhdGUxID0gYWRkaXRpb25hbEdhaW5VbmZpbHRlcmVkOwotICAgICAgYWRkaXRpb25hbEdhaW5TbW9vdGhTdGF0ZSA9IGFkZGl0aW9uYWxHYWluOwotCi0gICAgICAvKiBBcHBseSB0aGUgYWRkaXRpb25hbCBzY2FsaW5nIHRoYXQgaGFzIG5vIGRlbGF5IGFuZCBubyBzbW9vdGhpbmcgKi8KKyAgICBpZiAoIWdhaW5fZGVsYXkpIHsKKyAgICAgIGFkZGl0aW9uYWxHYWluID0gcEdhaW5bMF07CiAgICAgICBpZiAoZ2Fpbl9zY2FsZVswXSA+IDApIHsKICAgICAgICAgYWRkaXRpb25hbEdhaW4gPDw9IGdhaW5fc2NhbGVbMF07CiAgICAgICB9IGVsc2UgewotICAgICAgICBhZGRpdGlvbmFsR2FpbiA+Pj0gZ2Fpbl9zY2FsZVswXTsKKyAgICAgICAgYWRkaXRpb25hbEdhaW4gPj49IC1nYWluX3NjYWxlWzBdOwogICAgICAgfQorICAgIH0KIAotICAgICAgLyogZ2V0IG1heGltdW0gYWJzb2x1dGUgc2FtcGxlIHZhbHVlIG9mIGFsbCBjaGFubmVscywgaW5jbHVkaW5nIHRoZSBhZGRpdGlvbmFsIGdhaW4uICovCi0gICAgICB0bXAxID0gKEZJWFBfUENNKTA7CisgICAgZm9yIChpID0gMDsgaSA8IG5TYW1wbGVzOyBpKyspIHsKKyAgICAgIGlmIChnYWluX2RlbGF5KSB7CisgICAgICAgIGlmIChpIDwgZ2Fpbl9kZWxheSkgeworICAgICAgICAgIGFkZGl0aW9uYWxHYWluVW5maWx0ZXJlZCA9IGxpbWl0ZXItPmFkZGl0aW9uYWxHYWluUHJldjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhZGRpdGlvbmFsR2FpblVuZmlsdGVyZWQgPSBwR2FpblswXTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNtb290aCBhZGRpdGlvbmFsR2FpbiAqLworICAgICAgICAvKiBbYixhXSA9IGJ1dHRlcigxLCAwLjAxKSAqLworICAgICAgICBzdGF0aWMgY29uc3QgRklYUF9TR0wgYltdID0ge0ZMMkZYQ09OU1RfU0dMKDAuMDE1NDY2ICogMi4wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX1NHTCgwLjAxNTQ2NiAqIDIuMCl9OworICAgICAgICBzdGF0aWMgY29uc3QgRklYUF9TR0wgYVtdID0geyhGSVhQX1NHTClNQVhWQUxfU0dMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk2OTA3KX07CisgICAgICAgIGFkZGl0aW9uYWxHYWluID0gLWZNdWx0KGFkZGl0aW9uYWxHYWluU21vb3RoU3RhdGUsIGFbMV0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoYWRkaXRpb25hbEdhaW5VbmZpbHRlcmVkLCBiWzBdKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHREaXYyKGFkZGl0aW9uYWxHYWluU21vb3RoU3RhdGUxLCBiWzFdKTsKKyAgICAgICAgYWRkaXRpb25hbEdhaW5TbW9vdGhTdGF0ZTEgPSBhZGRpdGlvbmFsR2FpblVuZmlsdGVyZWQ7CisgICAgICAgIGFkZGl0aW9uYWxHYWluU21vb3RoU3RhdGUgPSBhZGRpdGlvbmFsR2FpbjsKKworICAgICAgICAvKiBBcHBseSB0aGUgYWRkaXRpb25hbCBzY2FsaW5nIHRoYXQgaGFzIG5vIGRlbGF5IGFuZCBubyBzbW9vdGhpbmcgKi8KKyAgICAgICAgaWYgKGdhaW5fc2NhbGVbMF0gPiAwKSB7CisgICAgICAgICAgYWRkaXRpb25hbEdhaW4gPDw9IGdhaW5fc2NhbGVbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYWRkaXRpb25hbEdhaW4gPj49IC1nYWluX3NjYWxlWzBdOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBnZXQgbWF4aW11bSBhYnNvbHV0ZSBzYW1wbGUgdmFsdWUgb2YgYWxsIGNoYW5uZWxzLCBpbmNsdWRpbmcgdGhlCisgICAgICAgKiBhZGRpdGlvbmFsIGdhaW4uICovCisgICAgICB0bXAxID0gKEZJWFBfREJMKTA7CiAgICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgewotICAgICAgICAgIHRtcDIgPSAoRklYUF9QQ00pc2FtcGxlc1tpICogY2hhbm5lbHMgKyBqXTsKLSAgICAgICAgICBpZiAodG1wMiA9PSAoRklYUF9QQ00pU0FNUExFX01JTikgLyogcHJvdGVjdCBmQWJzIGZyb20gLTEuMCB2YWx1ZSAqLwotICAgICAgICAgICAgICB0bXAyID0gKEZJWFBfUENNKShTQU1QTEVfTUlOKzEpOwotICAgICAgICB0bXAxID0gZk1heCh0bXAxLCBmQWJzKHRtcDIpKTsKKyAgICAgICAgdG1wMiA9IFBDTV9MSU0yRklYUF9EQkwoc2FtcGxlc0luW2pdKTsKKyAgICAgICAgdG1wMiA9IGZBYnModG1wMik7CisgICAgICAgIHRtcDIgPSBGSVhQX0RCTChJTlQodG1wMikgXiBJTlQoKHRtcDIgPj4gKFNBTVBMRV9CSVRTX0xJTSAtIDEpKSkpOworICAgICAgICB0bXAxID0gZk1heCh0bXAxLCB0bXAyKTsKICAgICAgIH0KLSAgICAgIHRtcCA9IFNBVFVSQVRFX0xFRlRfU0hJRlQoZk11bHREaXYyKHRtcDEsIGFkZGl0aW9uYWxHYWluKSwgMSwgREZSQUNUX0JJVFMpOworICAgICAgdG1wID0gZk11bHQodG1wMSwgYWRkaXRpb25hbEdhaW4pOwogCi0gICAgICAvKiBzZXQgdGhyZXNob2xkIGFzIGxvd2VyIGJvcmRlciB0byBzYXZlIGNhbGN1bGF0aW9ucyBpbiBydW5uaW5nIG1heGltdW0gYWxnb3JpdGhtICovCisgICAgICAvKiBzZXQgdGhyZXNob2xkIGFzIGxvd2VyIGJvcmRlciB0byBzYXZlIGNhbGN1bGF0aW9ucyBpbiBydW5uaW5nIG1heGltdW0KKyAgICAgICAqIGFsZ29yaXRobSAqLwogICAgICAgdG1wID0gZk1heCh0bXAsIHRocmVzaG9sZCk7CiAKICAgICAgIC8qIHJ1bm5pbmcgbWF4aW11bSAqLwpAQCAtMjk1LDc1ICsyNTYsOTcgQEAKICAgICAgIGlmICh0bXAgPj0gbWF4KSB7CiAgICAgICAgIC8qIG5ldyBzYW1wbGUgaXMgZ3JlYXRlciB0aGFuIG9sZCBtYXhpbXVtLCBzbyBpdCBpcyB0aGUgbmV3IG1heGltdW0gKi8KICAgICAgICAgbWF4ID0gdG1wOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2xkIDwgbWF4KSB7CisgICAgICB9IGVsc2UgaWYgKG9sZCA8IG1heCkgewogICAgICAgICAvKiBtYXhpbXVtIGRvZXMgbm90IGNoYW5nZSwgYXMgdGhlIHNhbXBsZSwgd2hpY2ggaGFzIGxlZnQgdGhlIHdpbmRvdyB3YXMKICAgICAgICAgICAgbm90IHRoZSBtYXhpbXVtICovCi0gICAgICB9Ci0gICAgICBlbHNlIHsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIHRoZSBvbGQgbWF4aW11bSBoYXMgbGVmdCB0aGUgd2luZG93LCB3ZSBoYXZlIHRvIHNlYXJjaCB0aGUgY29tcGxldGUKICAgICAgICAgICAgYnVmZmVyIGZvciB0aGUgbmV3IG1heCAqLwogICAgICAgICBtYXggPSBtYXhCdWZbMF07CiAgICAgICAgIGZvciAoaiA9IDE7IGogPD0gYXR0YWNrOyBqKyspIHsKLSAgICAgICAgICBpZiAobWF4QnVmW2pdID4gbWF4KSBtYXggPSBtYXhCdWZbal07CisgICAgICAgICAgbWF4ID0gZk1heChtYXgsIG1heEJ1ZltqXSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIG1heEJ1ZklkeCsrOwotICAgICAgaWYgKG1heEJ1ZklkeCA+PSBhdHRhY2srMSkgbWF4QnVmSWR4ID0gMDsKKyAgICAgIGlmIChtYXhCdWZJZHggPj0gYXR0YWNrICsgMSkgbWF4QnVmSWR4ID0gMDsKIAogICAgICAgLyogY2FsYyBnYWluICovCiAgICAgICAvKiBnYWluIGlzIGRvd25zY2FsZWQgYnkgb25lLCBzbyB0aGF0IGdhaW4gPSAxLjAgY2FuIGJlIHJlcHJlc2VudGVkICovCiAgICAgICBpZiAobWF4ID4gdGhyZXNob2xkKSB7Ci0gICAgICAgIGdhaW4gPSBmRGl2Tm9ybSh0aHJlc2hvbGQsIG1heCk+PjE7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgZ2FpbiA9IEZMMkZYQ09OU1RfREJMKDEuMGYvKDE8PDEpKTsKKyAgICAgICAgZ2FpbiA9IGZEaXZOb3JtKHRocmVzaG9sZCwgbWF4KSA+PiAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2FpbiA9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoMSA8PCAxKSk7CiAgICAgICB9CiAKICAgICAgIC8qIGdhaW4gc21vb3RoaW5nLCBtZXRob2Q6IFRETF9FWFBPTkVOVElBTCAqLwogICAgICAgLyogZmlyc3Qgb3JkZXIgSUlSIGZpbHRlciB3aXRoIGF0dGFjayBjb3JyZWN0aW9uIHRvIGF2b2lkIG92ZXJzaG9vdHMgKi8KIAotICAgICAgLyogY29ycmVjdCB0aGUgJ2FpbWluZycgdmFsdWUgb2YgdGhlIGV4cG9uZW50aWFsIGF0dGFjayB0byBhdm9pZCB0aGUgcmVtYWluaW5nIG92ZXJzaG9vdCAqLworICAgICAgLyogY29ycmVjdCB0aGUgJ2FpbWluZycgdmFsdWUgb2YgdGhlIGV4cG9uZW50aWFsIGF0dGFjayB0byBhdm9pZCB0aGUKKyAgICAgICAqIHJlbWFpbmluZyBvdmVyc2hvb3QgKi8KICAgICAgIGlmIChnYWluIDwgc21vb3RoU3RhdGUwKSB7Ci0gICAgICAgIGNvciA9IGZNaW4oY29yLCBmTXVsdERpdjIoKGdhaW4gLSBmTXVsdERpdjIoRkwyRlhDT05TVF9TR0woMC4xZiooMTw8MSkpLHNtb290aFN0YXRlMCkpLCBGTDJGWENPTlNUX1NHTCgxLjExMTExMTExZi8oMTw8MSkpKTw8Mik7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKKyAgICAgICAgY29yID0gZk1pbihjb3IsCisgICAgICAgICAgICAgICAgICAgZk11bHREaXYyKChnYWluIC0gZk11bHREaXYyKEZMMkZYQ09OU1RfU0dMKDAuMWYgKiAoMSA8PCAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtb290aFN0YXRlMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX1NHTCgxLjExMTExMTExZiAvICgxIDw8IDEpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgMik7CisgICAgICB9IGVsc2UgewogICAgICAgICBjb3IgPSBnYWluOwogICAgICAgfQogCiAgICAgICAvKiBzbW9vdGhpbmcgZmlsdGVyICovCiAgICAgICBpZiAoY29yIDwgc21vb3RoU3RhdGUwKSB7Ci0gICAgICAgIHNtb290aFN0YXRlMCA9IGZNdWx0KGF0dGFja0NvbnN0LChzbW9vdGhTdGF0ZTAgLSBjb3IpKSArIGNvcjsgIC8qIGF0dGFjayAqLworICAgICAgICBzbW9vdGhTdGF0ZTAgPQorICAgICAgICAgICAgZk11bHQoYXR0YWNrQ29uc3QsIChzbW9vdGhTdGF0ZTAgLSBjb3IpKSArIGNvcjsgLyogYXR0YWNrICovCiAgICAgICAgIHNtb290aFN0YXRlMCA9IGZNYXgoc21vb3RoU3RhdGUwLCBnYWluKTsgLyogYXZvaWQgb3ZlcnNob290aW5nIHRhcmdldCAqLwotICAgICAgfQotICAgICAgZWxzZSB7CisgICAgICB9IGVsc2UgewogICAgICAgICAvKiBzaWduIGludmVyc2lvbiB0d2ljZSB0byByb3VuZCB0b3dhcmRzICtpbmZpbml0eSwKICAgICAgICAgICAgc28gdGhhdCBnYWluIGNhbiBjb252ZXJnZSB0byAxLjAgYWdhaW4sCiAgICAgICAgICAgIGZvciBiaXQtaWRlbnRpY2FsIG91dHB1dCB3aGVuIGxpbWl0ZXIgaXMgbm90IGFjdGl2ZSAqLwotICAgICAgICBzbW9vdGhTdGF0ZTAgPSAtZk11bHQocmVsZWFzZUNvbnN0LC0oc21vb3RoU3RhdGUwIC0gY29yKSkgKyBjb3I7IC8qIHJlbGVhc2UgKi8KKyAgICAgICAgc21vb3RoU3RhdGUwID0KKyAgICAgICAgICAgIC1mTXVsdChyZWxlYXNlQ29uc3QsIC0oc21vb3RoU3RhdGUwIC0gY29yKSkgKyBjb3I7IC8qIHJlbGVhc2UgKi8KICAgICAgIH0KIAogICAgICAgZ2FpbiA9IHNtb290aFN0YXRlMDsKIAotICAgICAgLyogbG9va2FoZWFkIGRlbGF5LCBhcHBseSBnYWluICovCi0gICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgeworICAgICAgRklYUF9EQkwqIHBfZGVsYXlCdWYgPSAmZGVsYXlCdWZbZGVsYXlCdWZJZHggKiBjaGFubmVscyArIDBdOworICAgICAgaWYgKGdhaW4gPCBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKDEgPDwgMSkpKSB7CisgICAgICAgIGdhaW4gPDw9IDE7CisgICAgICAgIC8qIGxvb2thaGVhZCBkZWxheSwgYXBwbHkgZ2FpbiAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgeworICAgICAgICAgIHRtcCA9IHBfZGVsYXlCdWZbal07CisgICAgICAgICAgcF9kZWxheUJ1ZltqXSA9IGZNdWx0KChGSVhQX1BDTV9MSU0pc2FtcGxlc0luW2pdLCBhZGRpdGlvbmFsR2Fpbik7CiAKLSAgICAgICAgdG1wID0gZGVsYXlCdWZbZGVsYXlCdWZJZHggKiBjaGFubmVscyArIGpdOwotICAgICAgICBkZWxheUJ1ZltkZWxheUJ1ZklkeCAqIGNoYW5uZWxzICsgal0gPSBmTXVsdCgoRklYUF9QQ00pc2FtcGxlc1tpICogY2hhbm5lbHMgKyBqXSwgYWRkaXRpb25hbEdhaW4pOworICAgICAgICAgIC8qIEFwcGx5IGdhaW4gdG8gZGVsYXllZCBzaWduYWwgKi8KKyAgICAgICAgICB0bXAgPSBmTXVsdERpdjIodG1wLCBnYWluKTsKIAotICAgICAgICAvKiBBcHBseSBnYWluIHRvIGRlbGF5ZWQgc2lnbmFsICovCi0gICAgICAgIGlmIChnYWluIDwgRkwyRlhDT05TVF9EQkwoMS4wZi8oMTw8MSkpKQotICAgICAgICAgIHRtcCA9IGZNdWx0KHRtcCxnYWluPDwxKTsKLQotICAgICAgICBzYW1wbGVzW2kgKiBjaGFubmVscyArIGpdID0gRlhfREJMMkZYX1BDTSgoRklYUF9EQkwpU0FUVVJBVEVfTEVGVF9TSElGVCh0bXAsVERMX0dBSU5fU0NBTElORyxERlJBQ1RfQklUUykpOworICAgICAgICAgIHNhbXBsZXNPdXRbal0gPSAoSU5UX1BDTSlGWF9EQkwyRlhfUENNKChGSVhQX0RCTClTQVRVUkFURV9MRUZUX1NISUZUKAorICAgICAgICAgICAgICB0bXAsIFRETF9HQUlOX1NDQUxJTkcgKyAxLCBERlJBQ1RfQklUUykpOworICAgICAgICB9CisgICAgICAgIGdhaW4gPj49IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBsb29rYWhlYWQgZGVsYXksIGFwcGx5IGdhaW49MS4wZiAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgeworICAgICAgICAgIHRtcCA9IHBfZGVsYXlCdWZbal07CisgICAgICAgICAgcF9kZWxheUJ1ZltqXSA9IGZNdWx0KChGSVhQX1BDTV9MSU0pc2FtcGxlc0luW2pdLCBhZGRpdGlvbmFsR2Fpbik7CisgICAgICAgICAgc2FtcGxlc091dFtqXSA9IChJTlRfUENNKUZYX0RCTDJGWF9QQ00oKEZJWFBfREJMKVNBVFVSQVRFX0xFRlRfU0hJRlQoCisgICAgICAgICAgICAgIHRtcCwgVERMX0dBSU5fU0NBTElORywgREZSQUNUX0JJVFMpKTsKKyAgICAgICAgfQogICAgICAgfQorCiAgICAgICBkZWxheUJ1ZklkeCsrOwotICAgICAgaWYgKGRlbGF5QnVmSWR4ID49IGF0dGFjaykgZGVsYXlCdWZJZHggPSAwOworICAgICAgaWYgKGRlbGF5QnVmSWR4ID49IGF0dGFjaykgeworICAgICAgICBkZWxheUJ1ZklkeCA9IDA7CisgICAgICB9CiAKICAgICAgIC8qIHNhdmUgbWluaW11bSBnYWluIGZhY3RvciAqLwotICAgICAgaWYgKGdhaW4gPCBtaW5HYWluKSBtaW5HYWluID0gZ2FpbjsKLSAgICB9CisgICAgICBpZiAoZ2FpbiA8IG1pbkdhaW4pIHsKKyAgICAgICAgbWluR2FpbiA9IGdhaW47CisgICAgICB9CiAKKyAgICAgIC8qIGFkdmFuY2Ugc2FtcGxlIHBvaW50ZXIgYnkgPGNoYW5uZWw+IHNhbXBsZXMgKi8KKyAgICAgIHNhbXBsZXNJbiArPSBjaGFubmVsczsKKyAgICAgIHNhbXBsZXNPdXQgKz0gY2hhbm5lbHM7CisgICAgfQogCiAgICAgbGltaXRlci0+bWF4ID0gbWF4OwogICAgIGxpbWl0ZXItPm1heEJ1ZklkeCA9IG1heEJ1ZklkeDsKQEAgLTM4MiwzNCArMzY1LDk5IEBACiAgIH0KIH0KIAorLyogc2V0IGxpbWl0ZXIgdGhyZXNob2xkICovCitURExJTUlURVJfRVJST1IgcGNtTGltaXRlcl9TZXRUaHJlc2hvbGQoVERMaW1pdGVyUHRyIGxpbWl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgdGhyZXNob2xkKSB7CisgIGlmIChsaW1pdGVyID09IE5VTEwpIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOworCisgIGxpbWl0ZXItPnRocmVzaG9sZCA9IHRocmVzaG9sZCA+PiBURExfR0FJTl9TQ0FMSU5HOworCisgIHJldHVybiBURExJTUlUX09LOworfQorCisvKiByZXNldCBsaW1pdGVyICovCitURExJTUlURVJfRVJST1IgcGNtTGltaXRlcl9SZXNldChURExpbWl0ZXJQdHIgbGltaXRlcikgeworICBpZiAobGltaXRlciAhPSBOVUxMKSB7CisgICAgbGltaXRlci0+bWF4QnVmSWR4ID0gMDsKKyAgICBsaW1pdGVyLT5kZWxheUJ1ZklkeCA9IDA7CisgICAgbGltaXRlci0+bWF4ID0gKEZJWFBfREJMKTA7CisgICAgbGltaXRlci0+Y29yID0gRkwyRlhDT05TVF9EQkwoMS4wZiAvICgxIDw8IDEpKTsKKyAgICBsaW1pdGVyLT5zbW9vdGhTdGF0ZTAgPSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKDEgPDwgMSkpOworICAgIGxpbWl0ZXItPm1pbkdhaW4gPSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gKDEgPDwgMSkpOworCisgICAgbGltaXRlci0+YWRkaXRpb25hbEdhaW5QcmV2ID0KKyAgICAgICAgRkwyRlhDT05TVF9EQkwoMS4wZiAvICgxIDw8IFRETF9HQUlOX1NDQUxJTkcpKTsKKyAgICBsaW1pdGVyLT5hZGRpdGlvbmFsR2FpbkZpbHRlclN0YXRlID0KKyAgICAgICAgRkwyRlhDT05TVF9EQkwoMS4wZiAvICgxIDw8IFRETF9HQUlOX1NDQUxJTkcpKTsKKyAgICBsaW1pdGVyLT5hZGRpdGlvbmFsR2FpbkZpbHRlclN0YXRlMSA9CisgICAgICAgIEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoMSA8PCBURExfR0FJTl9TQ0FMSU5HKSk7CisKKyAgICBGREttZW1zZXQobGltaXRlci0+bWF4QnVmLCAwLCAobGltaXRlci0+YXR0YWNrICsgMSkgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICBGREttZW1zZXQobGltaXRlci0+ZGVsYXlCdWYsIDAsCisgICAgICAgICAgICAgIGxpbWl0ZXItPmF0dGFjayAqIGxpbWl0ZXItPmNoYW5uZWxzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFRETElNSVRfSU5WQUxJRF9IQU5ETEU7CisgIH0KKworICByZXR1cm4gVERMSU1JVF9PSzsKK30KKworLyogZGVzdHJveSBsaW1pdGVyICovCitURExJTUlURVJfRVJST1IgcGNtTGltaXRlcl9EZXN0cm95KFRETGltaXRlclB0ciBsaW1pdGVyKSB7CisgIGlmIChsaW1pdGVyICE9IE5VTEwpIHsKKyAgICBGREtmcmVlKGxpbWl0ZXItPm1heEJ1Zik7CisgICAgRkRLZnJlZShsaW1pdGVyLT5kZWxheUJ1Zik7CisKKyAgICBGREtmcmVlKGxpbWl0ZXIpOworICB9IGVsc2UgeworICAgIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOworICB9CisgIHJldHVybiBURExJTUlUX09LOworfQorCiAvKiBnZXQgZGVsYXkgaW4gc2FtcGxlcyAqLwotdW5zaWduZWQgaW50IGdldExpbWl0ZXJEZWxheShURExpbWl0ZXJQdHIgbGltaXRlcikKLXsKK3Vuc2lnbmVkIGludCBwY21MaW1pdGVyX0dldERlbGF5KFRETGltaXRlclB0ciBsaW1pdGVyKSB7CiAgIEZES19BU1NFUlQobGltaXRlciAhPSBOVUxMKTsKICAgcmV0dXJuIGxpbWl0ZXItPmF0dGFjazsKIH0KIAorLyogZ2V0IG1heGltdW0gZ2FpbiByZWR1Y3Rpb24gb2YgbGFzdCBwcm9jZXNzZWQgYmxvY2sgKi8KK0lOVCBwY21MaW1pdGVyX0dldE1heEdhaW5SZWR1Y3Rpb24oVERMaW1pdGVyUHRyIGxpbWl0ZXIpIHsKKyAgLyogbWF4aW11bSBnYWluIHJlZHVjdGlvbiBpbiBkQiA9IC0yMCAqIGxvZzEwKGxpbWl0ZXItPm1pbkdhaW4pCisgICAgID0gLTIwICogbG9nMihsaW1pdGVyLT5taW5HYWluKS9sb2cyKDEwKSA9IC02LjAyMDYqbG9nMihsaW1pdGVyLT5taW5HYWluKSAqLworICBpbnQgZV9hbnM7CisgIEZJWFBfREJMIGxvZ2dhaW4sIG1heEdhaW5SZWR1Y3Rpb247CisKKyAgRkRLX0FTU0VSVChsaW1pdGVyICE9IE5VTEwpOworCisgIGxvZ2dhaW4gPSBmTG9nMihsaW1pdGVyLT5taW5HYWluLCAxLCAmZV9hbnMpOworCisgIG1heEdhaW5SZWR1Y3Rpb24gPSBmTXVsdChsb2dnYWluLCBGTDJGWENPTlNUX0RCTCgtNi4wMjA2ZiAvICgxIDw8IDMpKSk7CisKKyAgcmV0dXJuIGZpeHBfcm91bmRUb0ludChtYXhHYWluUmVkdWN0aW9uLCAoZV9hbnMgKyAzKSk7Cit9CisKIC8qIHNldCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KLVRETElNSVRFUl9FUlJPUiBzZXRMaW1pdGVyTkNoYW5uZWxzKFRETGltaXRlclB0ciBsaW1pdGVyLCB1bnNpZ25lZCBpbnQgbkNoYW5uZWxzKQotewotICBpZiAoIGxpbWl0ZXIgPT0gTlVMTCApIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOworVERMSU1JVEVSX0VSUk9SIHBjbUxpbWl0ZXJfU2V0TkNoYW5uZWxzKFRETGltaXRlclB0ciBsaW1pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuQ2hhbm5lbHMpIHsKKyAgaWYgKGxpbWl0ZXIgPT0gTlVMTCkgcmV0dXJuIFRETElNSVRfSU5WQUxJRF9IQU5ETEU7CiAKICAgaWYgKG5DaGFubmVscyA+IGxpbWl0ZXItPm1heENoYW5uZWxzKSByZXR1cm4gVERMSU1JVF9JTlZBTElEX1BBUkFNRVRFUjsKIAogICBsaW1pdGVyLT5jaGFubmVscyA9IG5DaGFubmVsczsKLSAgLy9yZXNldExpbWl0ZXIobGltaXRlcik7CisgIC8vIHBjbUxpbWl0ZXJfUmVzZXQobGltaXRlcik7CiAKICAgcmV0dXJuIFRETElNSVRfT0s7CiB9CiAKIC8qIHNldCBzYW1wbGluZyByYXRlICovCi1URExJTUlURVJfRVJST1Igc2V0TGltaXRlclNhbXBsZVJhdGUoVERMaW1pdGVyUHRyIGxpbWl0ZXIsIHVuc2lnbmVkIGludCBzYW1wbGVSYXRlKQoteworVERMSU1JVEVSX0VSUk9SIHBjbUxpbWl0ZXJfU2V0U2FtcGxlUmF0ZShURExpbWl0ZXJQdHIgbGltaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzYW1wbGVSYXRlKSB7CiAgIHVuc2lnbmVkIGludCBhdHRhY2ssIHJlbGVhc2U7CiAgIEZJWFBfREJMIGF0dGFja0NvbnN0LCByZWxlYXNlQ29uc3QsIGV4cG9uZW50OwogICBJTlQgZV9hbnM7CiAKLSAgaWYgKCBsaW1pdGVyID09IE5VTEwgKSByZXR1cm4gVERMSU1JVF9JTlZBTElEX0hBTkRMRTsKKyAgaWYgKGxpbWl0ZXIgPT0gTlVMTCkgcmV0dXJuIFRETElNSVRfSU5WQUxJRF9IQU5ETEU7CiAKICAgaWYgKHNhbXBsZVJhdGUgPiBsaW1pdGVyLT5tYXhTYW1wbGVSYXRlKSByZXR1cm4gVERMSU1JVF9JTlZBTElEX1BBUkFNRVRFUjsKIApAQCAtNDE4LDcgKzQ2Niw3IEBACiAgIHJlbGVhc2UgPSAodW5zaWduZWQgaW50KShsaW1pdGVyLT5yZWxlYXNlTXMgKiBzYW1wbGVSYXRlIC8gMTAwMCk7CiAKICAgLyogYXR0YWNrQ29uc3QgPSBwb3coMC4xLCAxLjAgLyAoYXR0YWNrICsgMSkpICovCi0gIGV4cG9uZW50ID0gaW52Rml4cChhdHRhY2srMSk7CisgIGV4cG9uZW50ID0gaW52Rml4cChhdHRhY2sgKyAxKTsKICAgYXR0YWNrQ29uc3QgPSBmUG93KEZMMkZYQ09OU1RfREJMKDAuMWYpLCAwLCBleHBvbmVudCwgMCwgJmVfYW5zKTsKICAgYXR0YWNrQ29uc3QgPSBzY2FsZVZhbHVlKGF0dGFja0NvbnN0LCBlX2Fucyk7CiAKQEAgLTQyNywyNSArNDc1LDI1IEBACiAgIHJlbGVhc2VDb25zdCA9IGZQb3coRkwyRlhDT05TVF9EQkwoMC4xZiksIDAsIGV4cG9uZW50LCAwLCAmZV9hbnMpOwogICByZWxlYXNlQ29uc3QgPSBzY2FsZVZhbHVlKHJlbGVhc2VDb25zdCwgZV9hbnMpOwogCi0gIGxpbWl0ZXItPmF0dGFjayAgICAgICAgPSBhdHRhY2s7Ci0gIGxpbWl0ZXItPmF0dGFja0NvbnN0ICAgPSBhdHRhY2tDb25zdDsKLSAgbGltaXRlci0+cmVsZWFzZUNvbnN0ICA9IHJlbGVhc2VDb25zdDsKLSAgbGltaXRlci0+c2FtcGxlUmF0ZSAgICA9IHNhbXBsZVJhdGU7CisgIGxpbWl0ZXItPmF0dGFjayA9IGF0dGFjazsKKyAgbGltaXRlci0+YXR0YWNrQ29uc3QgPSBhdHRhY2tDb25zdDsKKyAgbGltaXRlci0+cmVsZWFzZUNvbnN0ID0gcmVsZWFzZUNvbnN0OworICBsaW1pdGVyLT5zYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKIAogICAvKiByZXNldCAqLwotICAvL3Jlc2V0TGltaXRlcihsaW1pdGVyKTsKKyAgLy8gcGNtTGltaXRlcl9SZXNldChsaW1pdGVyKTsKIAogICByZXR1cm4gVERMSU1JVF9PSzsKIH0KIAogLyogc2V0IGF0dGFjayB0aW1lICovCi1URExJTUlURVJfRVJST1Igc2V0TGltaXRlckF0dGFjayhURExpbWl0ZXJQdHIgbGltaXRlciwgdW5zaWduZWQgaW50IGF0dGFja01zKQoteworVERMSU1JVEVSX0VSUk9SIHBjbUxpbWl0ZXJfU2V0QXR0YWNrKFRETGltaXRlclB0ciBsaW1pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBhdHRhY2tNcykgewogICB1bnNpZ25lZCBpbnQgYXR0YWNrOwogICBGSVhQX0RCTCBhdHRhY2tDb25zdCwgZXhwb25lbnQ7CiAgIElOVCBlX2FuczsKIAotICBpZiAoIGxpbWl0ZXIgPT0gTlVMTCApIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOworICBpZiAobGltaXRlciA9PSBOVUxMKSByZXR1cm4gVERMSU1JVF9JTlZBTElEX0hBTkRMRTsKIAogICBpZiAoYXR0YWNrTXMgPiBsaW1pdGVyLT5tYXhBdHRhY2tNcykgcmV0dXJuIFRETElNSVRfSU5WQUxJRF9QQVJBTUVURVI7CiAKQEAgLTQ1MywyNSArNTAxLDI1IEBACiAgIGF0dGFjayA9ICh1bnNpZ25lZCBpbnQpKGF0dGFja01zICogbGltaXRlci0+c2FtcGxlUmF0ZSAvIDEwMDApOwogCiAgIC8qIGF0dGFja0NvbnN0ID0gcG93KDAuMSwgMS4wIC8gKGF0dGFjayArIDEpKSAqLwotICBleHBvbmVudCA9IGludkZpeHAoYXR0YWNrKzEpOworICBleHBvbmVudCA9IGludkZpeHAoYXR0YWNrICsgMSk7CiAgIGF0dGFja0NvbnN0ID0gZlBvdyhGTDJGWENPTlNUX0RCTCgwLjFmKSwgMCwgZXhwb25lbnQsIDAsICZlX2Fucyk7CiAgIGF0dGFja0NvbnN0ID0gc2NhbGVWYWx1ZShhdHRhY2tDb25zdCwgZV9hbnMpOwogCi0gIGxpbWl0ZXItPmF0dGFjayAgICAgICAgPSBhdHRhY2s7Ci0gIGxpbWl0ZXItPmF0dGFja0NvbnN0ICAgPSBhdHRhY2tDb25zdDsKLSAgbGltaXRlci0+YXR0YWNrTXMgICAgICA9IGF0dGFja01zOworICBsaW1pdGVyLT5hdHRhY2sgPSBhdHRhY2s7CisgIGxpbWl0ZXItPmF0dGFja0NvbnN0ID0gYXR0YWNrQ29uc3Q7CisgIGxpbWl0ZXItPmF0dGFja01zID0gYXR0YWNrTXM7CiAKICAgcmV0dXJuIFRETElNSVRfT0s7CiB9CiAKIC8qIHNldCByZWxlYXNlIHRpbWUgKi8KLVRETElNSVRFUl9FUlJPUiBzZXRMaW1pdGVyUmVsZWFzZShURExpbWl0ZXJQdHIgbGltaXRlciwgdW5zaWduZWQgaW50IHJlbGVhc2VNcykKLXsKK1RETElNSVRFUl9FUlJPUiBwY21MaW1pdGVyX1NldFJlbGVhc2UoVERMaW1pdGVyUHRyIGxpbWl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByZWxlYXNlTXMpIHsKICAgdW5zaWduZWQgaW50IHJlbGVhc2U7CiAgIEZJWFBfREJMIHJlbGVhc2VDb25zdCwgZXhwb25lbnQ7CiAgIElOVCBlX2FuczsKIAotICBpZiAoIGxpbWl0ZXIgPT0gTlVMTCApIHJldHVybiBURExJTUlUX0lOVkFMSURfSEFORExFOworICBpZiAobGltaXRlciA9PSBOVUxMKSByZXR1cm4gVERMSU1JVF9JTlZBTElEX0hBTkRMRTsKIAogICAvKiBjYWxjdWxhdGUgIHJlbGVhc2UgdGltZSBpbiBzYW1wbGVzICovCiAgIHJlbGVhc2UgPSAodW5zaWduZWQgaW50KShyZWxlYXNlTXMgKiBsaW1pdGVyLT5zYW1wbGVSYXRlIC8gMTAwMCk7CkBAIC00ODEsMTggKzUyOSw0MiBAQAogICByZWxlYXNlQ29uc3QgPSBmUG93KEZMMkZYQ09OU1RfREJMKDAuMWYpLCAwLCBleHBvbmVudCwgMCwgJmVfYW5zKTsKICAgcmVsZWFzZUNvbnN0ID0gc2NhbGVWYWx1ZShyZWxlYXNlQ29uc3QsIGVfYW5zKTsKIAotICBsaW1pdGVyLT5yZWxlYXNlQ29uc3QgID0gcmVsZWFzZUNvbnN0OwotICBsaW1pdGVyLT5yZWxlYXNlTXMgICAgID0gcmVsZWFzZU1zOworICBsaW1pdGVyLT5yZWxlYXNlQ29uc3QgPSByZWxlYXNlQ29uc3Q7CisgIGxpbWl0ZXItPnJlbGVhc2VNcyA9IHJlbGVhc2VNczsKIAogICByZXR1cm4gVERMSU1JVF9PSzsKIH0KIAotLyogc2V0IGxpbWl0ZXIgdGhyZXNob2xkICovCi1URExJTUlURVJfRVJST1Igc2V0TGltaXRlclRocmVzaG9sZChURExpbWl0ZXJQdHIgbGltaXRlciwgSU5UX1BDTSB0aHJlc2hvbGQpCi17Ci0gIGlmICggbGltaXRlciA9PSBOVUxMICkgcmV0dXJuIFRETElNSVRfSU5WQUxJRF9IQU5ETEU7CisvKiBHZXQgbGlicmFyeSBpbmZvIGZvciB0aGlzIG1vZHVsZS4gKi8KK1RETElNSVRFUl9FUlJPUiBwY21MaW1pdGVyX0dldExpYkluZm8oTElCX0lORk8qIGluZm8pIHsKKyAgaW50IGk7CiAKLSAgbGltaXRlci0+dGhyZXNob2xkID0gKEZJWFBfUENNKXRocmVzaG9sZDsKKyAgaWYgKGluZm8gPT0gTlVMTCkgeworICAgIHJldHVybiBURExJTUlUX0lOVkFMSURfUEFSQU1FVEVSOworICB9CisKKyAgLyogU2VhcmNoIGZvciBuZXh0IGZyZWUgdGFiICovCisgIGZvciAoaSA9IDA7IGkgPCBGREtfTU9EVUxFX0xBU1Q7IGkrKykgeworICAgIGlmIChpbmZvW2ldLm1vZHVsZV9pZCA9PSBGREtfTk9ORSkgYnJlYWs7CisgIH0KKyAgaWYgKGkgPT0gRkRLX01PRFVMRV9MQVNUKSB7CisgICAgcmV0dXJuIFRETElNSVRfVU5LTk9XTjsKKyAgfQorCisgIC8qIEFkZCB0aGUgbGlicmFyeSBpbmZvICovCisgIGluZm9baV0ubW9kdWxlX2lkID0gRkRLX1RETElNSVQ7CisgIGluZm9baV0udmVyc2lvbiA9CisgICAgICBMSUJfVkVSU0lPTihQQ01VVElMX0xJQl9WTDAsIFBDTVVUSUxfTElCX1ZMMSwgUENNVVRJTF9MSUJfVkwyKTsKKyAgTElCX1ZFUlNJT05fU1RSSU5HKGluZm8gKyBpKTsKKyAgaW5mb1tpXS5idWlsZF9kYXRlID0gUENNVVRJTF9MSUJfQlVJTERfREFURTsKKyAgaW5mb1tpXS5idWlsZF90aW1lID0gUENNVVRJTF9MSUJfQlVJTERfVElNRTsKKyAgaW5mb1tpXS50aXRsZSA9IFRETElNSVRfTElCX1RJVExFOworCisgIC8qIFNldCBmbGFncyAqLworICBpbmZvW2ldLmZsYWdzID0gQ0FQRl9MSU1JVEVSOworCisgIC8qIEFkZCBsaWIgaW5mbyBmb3IgRkRLIHRvb2xzIChpZiBub3QgeWV0IGRvbmUpLiAqLworICBGREtfdG9vbHNHZXRMaWJJbmZvKGluZm8pOwogCiAgIHJldHVybiBURExJTUlUX09LOwogfQpkaWZmIC0tZ2l0IGEvbGliUENNdXRpbHMvc3JjL3BjbV91dGlscy5jcHAgYi9saWJQQ011dGlscy9zcmMvcGNtX3V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGQxOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliUENNdXRpbHMvc3JjL3BjbV91dGlscy5jcHAKQEAgLTAsMCArMSwxOTUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogUENNIHV0aWxpdHkgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEFydGh1ciBUcml0dGhhcnQsIEFsZm9uc28gUGlubyBHYXJjaWEKKworICAgRGVzY3JpcHRpb246IEZ1bmN0aW9ucyB0aGF0IHBlcmZvcm0gKGRlKWludGVybGVhdmluZyBjb21iaW5lZCB3aXRoIGZvcm1hdAorY2hhbmdlCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwY21fdXRpbHMuaCIKKworLyogbGlicmFyeSB2ZXJzaW9uICovCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCit2b2lkIEZES19pbnRlcmxlYXZlKGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBwSW4sIExPTkcgKlJFU1RSSUNUIHBPdXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgY2hhbm5lbHMsIGNvbnN0IFVJTlQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxlbmd0aCkgeworICBmb3IgKFVJTlQgc2FtcGxlID0gMDsgc2FtcGxlIDwgbGVuZ3RoOyBzYW1wbGUrKykgeworICAgIGNvbnN0IEZJWFBfREJMICpJbiA9ICZwSW5bc2FtcGxlXTsKKyAgICBmb3IgKFVJTlQgY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAqcE91dCsrID0gKExPTkcpSW5bMF07CisgICAgICBJbiArPSBmcmFtZVNpemU7CisgICAgfQorICB9Cit9CisKK3ZvaWQgRkRLX2ludGVybGVhdmUoY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIHBJbiwgU0hPUlQgKlJFU1RSSUNUIHBPdXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgY2hhbm5lbHMsIGNvbnN0IFVJTlQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxlbmd0aCkgeworICBmb3IgKFVJTlQgc2FtcGxlID0gMDsgc2FtcGxlIDwgbGVuZ3RoOyBzYW1wbGUrKykgeworICAgIGNvbnN0IEZJWFBfREJMICpJbiA9ICZwSW5bc2FtcGxlXTsKKyAgICBmb3IgKFVJTlQgY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAqcE91dCsrID0gKFNIT1JUKUZYX0RCTDJGWF9TR0woSW5bMF0pOworICAgICAgSW4gKz0gZnJhbWVTaXplOworICAgIH0KKyAgfQorfQorCit2b2lkIEZES19pbnRlcmxlYXZlKGNvbnN0IEZJWFBfU0dMICpSRVNUUklDVCBwSW4sIFNIT1JUICpSRVNUUklDVCBwT3V0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGNoYW5uZWxzLCBjb25zdCBVSU5UIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBsZW5ndGgpIHsKKyAgZm9yIChVSU5UIHNhbXBsZSA9IDA7IHNhbXBsZSA8IGxlbmd0aDsgc2FtcGxlKyspIHsKKyAgICBjb25zdCBGSVhQX1NHTCAqSW4gPSAmcEluW3NhbXBsZV07CisgICAgZm9yIChVSU5UIGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgKnBPdXQrKyA9IChTSE9SVClJblswXTsKKyAgICAgIEluICs9IGZyYW1lU2l6ZTsKKyAgICB9CisgIH0KK30KKwordm9pZCBGREtfZGVpbnRlcmxlYXZlKGNvbnN0IExPTkcgKlJFU1RSSUNUIHBJbiwgU0hPUlQgKlJFU1RSSUNUIF9wT3V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgY2hhbm5lbHMsIGNvbnN0IFVJTlQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGVuZ3RoKSB7CisgIGZvciAoVUlOVCBjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICBTSE9SVCAqcE91dCA9IF9wT3V0ICsgbGVuZ3RoICogY2g7CisgICAgY29uc3QgTE9ORyAqSW4gPSAmcEluW2NoXTsKKyAgICBmb3IgKFVJTlQgc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrKykgeworICAgICAgKnBPdXQrKyA9IChTSE9SVCkoSW5bMF0gPj4gMTYpOworICAgICAgSW4gKz0gY2hhbm5lbHM7CisgICAgfQorICB9Cit9CisKK3ZvaWQgRkRLX2RlaW50ZXJsZWF2ZShjb25zdCBMT05HICpSRVNUUklDVCBwSW4sIExPTkcgKlJFU1RSSUNUIF9wT3V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgY2hhbm5lbHMsIGNvbnN0IFVJTlQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGVuZ3RoKSB7CisgIGZvciAoVUlOVCBjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICBMT05HICpwT3V0ID0gX3BPdXQgKyBsZW5ndGggKiBjaDsKKyAgICBjb25zdCBMT05HICpJbiA9ICZwSW5bY2hdOworICAgIGZvciAoVUlOVCBzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKSB7CisgICAgICAqcE91dCsrID0gSW5bMF07CisgICAgICBJbiArPSBjaGFubmVsczsKKyAgICB9CisgIH0KK30KKwordm9pZCBGREtfZGVpbnRlcmxlYXZlKGNvbnN0IFNIT1JUICpSRVNUUklDVCBwSW4sIFNIT1JUICpSRVNUUklDVCBfcE91dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGNoYW5uZWxzLCBjb25zdCBVSU5UIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGxlbmd0aCkgeworICBmb3IgKFVJTlQgY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgU0hPUlQgKnBPdXQgPSBfcE91dCArIGxlbmd0aCAqIGNoOworICAgIGNvbnN0IFNIT1JUICpJbiA9ICZwSW5bY2hdOworICAgIGZvciAoVUlOVCBzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKSB7CisgICAgICAqcE91dCsrID0gSW5bMF07CisgICAgICBJbiArPSBjaGFubmVsczsKKyAgICB9CisgIH0KK30KKwordm9pZCBGREtfZGVpbnRlcmxlYXZlKGNvbnN0IFNIT1JUICpSRVNUUklDVCBwSW4sIExPTkcgKlJFU1RSSUNUIF9wT3V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgY2hhbm5lbHMsIGNvbnN0IFVJTlQgZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbGVuZ3RoKSB7CisgIGZvciAoVUlOVCBjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICBMT05HICpwT3V0ID0gX3BPdXQgKyBsZW5ndGggKiBjaDsKKyAgICBjb25zdCBTSE9SVCAqSW4gPSAmcEluW2NoXTsKKyAgICBmb3IgKFVJTlQgc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrKykgeworICAgICAgKnBPdXQrKyA9IChMT05HKUluWzBdIDw8IDE2OworICAgICAgSW4gKz0gY2hhbm5lbHM7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWJQQ011dGlscy9zcmMvcGNtZG14X2xpYi5jcHAgYi9saWJQQ011dGlscy9zcmMvcGNtZG14X2xpYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA5YTg0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYlBDTXV0aWxzL3NyYy9wY21kbXhfbGliLmNwcApAQCAtMCwwICsxLDI2NTkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogUENNIHV0aWxpdHkgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIENocmlzdGlhbiBHcmllYmVsCisKKyAgIERlc2NyaXB0aW9uOiBEZWZpbmVzIGZ1bmN0aW9ucyB0aGF0IHBlcmZvcm0gZG93bm1peGluZyBvciBhIHNpbXBsZSBjaGFubmVsCisgICAgICAgICAgICAgICAgZXhwYW5zaW9uIGluIHRoZSBQQ00gdGltZSBkb21haW4uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJwY21kbXhfbGliLmgiCisKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorI2luY2x1ZGUgImZpeHBvaW50X21hdGguaCIKKyNpbmNsdWRlICJGREtfY29yZS5oIgorCisvKiBsaWJyYXJ5IHZlcnNpb24gKi8KKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisvKiBsaWJyYXJ5IHRpdGxlICovCisjZGVmaW5lIFBDTURNWF9MSUJfVElUTEUgIlBDTSBEb3dubWl4IExpYiIKKworI2RlZmluZSBGQUxTRSAwCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBJTiAwCisjZGVmaW5lIE9VVCAxCisKKy8qIFR5cGUgZGVmaW5pdGlvbnM6ICovCisjZGVmaW5lIEZJWFBfRE1YIEZJWFBfU0dMCisjZGVmaW5lIEZYX0RNWDJGWF9EQkwoeCkgRlhfU0dMMkZYX0RCTCgoRklYUF9TR0wpKHgpKQorI2RlZmluZSBGWF9EQkwyRlhfRE1YKHgpIEZYX0RCTDJGWF9TR0woeCkKKyNkZWZpbmUgRkwyRlhDT05TVF9ETVgoeCkgRkwyRlhDT05TVF9TR0woeCkKKyNkZWZpbmUgTUFYVkFMX0RNWCBNQVhWQUxfU0dMCisjZGVmaW5lIEZYX0RNWDJTSFJUKHgpICgoU0hPUlQpKHgpKQorI2RlZmluZSBGWF9ETVgyRkwoeCkgRlhfREJMMkZMKEZYX0RNWDJGWF9EQkwoeCkpCisKKy8qIEZpeGVkIGFuZCB1bmlxdWUgY2hhbm5lbCBncm91cCBpbmRpY2VzLgorICogVGhlIGxhc3QgZ3JvdXAgaW5kZXggaGFzIHRvIGJlIHNtYWxsZXIgdGhhbiAoIDQgKS4gKi8KKyNkZWZpbmUgQ0hfR1JPVVBfRlJPTlQgKDApCisjZGVmaW5lIENIX0dST1VQX1NJREUgKDEpCisjZGVmaW5lIENIX0dST1VQX1JFQVIgKDIpCisjZGVmaW5lIENIX0dST1VQX0xGRSAoMykKKworLyogRml4ZWQgYW5kIHVuaXF1ZSBjaGFubmVsIHBsYWluIGluZGljZXMuICovCisjZGVmaW5lIENIX1BMQUlOX05PUk1BTCAoMCkKKyNkZWZpbmUgQ0hfUExBSU5fVE9QICgxKQorI2RlZmluZSBDSF9QTEFJTl9CT1RUT00gKDIpCisKKy8qIFRoZSBvcmRlcmluZyBvZiB0aGUgZm9sbG93aW5nIGZpeGVkIGNoYW5uZWwgbGFiZWxzIGhhcyB0byBiZSBpbiBNUEVHLTQgc3R5bGUuCisgKiBGcm9tIHRoZSBjZW50ZXIgdG8gdGhlIGJhY2sgd2l0aCBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGludGVybGVhdmVkIChzdGFydGluZworICogd2l0aCBsZWZ0KS4gVGhlIGxhc3QgY2hhbm5lbCBsYWJlbCBpbmRleCBoYXMgdG8gYmUgc21hbGxlciB0aGFuICggOCApLiAqLworI2RlZmluZSBDRU5URVJfRlJPTlRfQ0hBTk5FTCAoMCkgLyogQyAgKi8KKyNkZWZpbmUgTEVGVF9GUk9OVF9DSEFOTkVMICgxKSAgIC8qIEwgICovCisjZGVmaW5lIFJJR0hUX0ZST05UX0NIQU5ORUwgKDIpICAvKiBSICAqLworI2RlZmluZSBMRUZUX1JFQVJfQ0hBTk5FTCBcCisgICgzKSAvKiBMciAoYWthIGxlZnQgYmFjayBjaGFubmVsKSBvciBjZW50ZXIgYmFjayBjaGFubmVsICovCisjZGVmaW5lIFJJR0hUX1JFQVJfQ0hBTk5FTCAoNCkgICAgICAvKiBSciAoYWthIHJpZ2h0IGJhY2sgY2hhbm5lbCkgKi8KKyNkZWZpbmUgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMICg1KSAgIC8qIExmICovCisjZGVmaW5lIExFRlRfTVVMVElQUlBTX0NIQU5ORUwgKDYpICAvKiBMZWZ0IG11bHRpcHVycG9zZSBjaGFubmVsICovCisjZGVmaW5lIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMICg3KSAvKiBSaWdodCBtdWx0aXB1cnBvc2UgY2hhbm5lbCAqLworCisvKiAyMi4yIGNoYW5uZWwgc3BlY2lmaWMgZml4ZWQgY2hhbm5lbCBsYWJsZXM6ICovCisjZGVmaW5lIExFRlRfU0lERV9DSEFOTkVMICg4KSAgICAgICAgICAgIC8qIExzcyAgKi8KKyNkZWZpbmUgUklHSFRfU0lERV9DSEFOTkVMICg5KSAgICAgICAgICAgLyogUnNzICAqLworI2RlZmluZSBDRU5URVJfUkVBUl9DSEFOTkVMICgxMCkgICAgICAgICAvKiBDcyAgICovCisjZGVmaW5lIENFTlRFUl9GUk9OVF9DSEFOTkVMX1RPUCAoMTEpICAgIC8qIEN2ICAgKi8KKyNkZWZpbmUgTEVGVF9GUk9OVF9DSEFOTkVMX1RPUCAoMTIpICAgICAgLyogTHYgICAqLworI2RlZmluZSBSSUdIVF9GUk9OVF9DSEFOTkVMX1RPUCAoMTMpICAgICAvKiBSdiAgICovCisjZGVmaW5lIExFRlRfU0lERV9DSEFOTkVMX1RPUCAoMTQpICAgICAgIC8qIEx2c3MgKi8KKyNkZWZpbmUgUklHSFRfU0lERV9DSEFOTkVMX1RPUCAoMTUpICAgICAgLyogUnZzcyAqLworI2RlZmluZSBDRU5URVJfU0lERV9DSEFOTkVMX1RPUCAoMTYpICAgICAvKiBUcyAgICovCisjZGVmaW5lIExFRlRfUkVBUl9DSEFOTkVMX1RPUCAoMTcpICAgICAgIC8qIEx2ciAgKi8KKyNkZWZpbmUgUklHSFRfUkVBUl9DSEFOTkVMX1RPUCAoMTgpICAgICAgLyogUnZyICAqLworI2RlZmluZSBDRU5URVJfUkVBUl9DSEFOTkVMX1RPUCAoMTkpICAgICAvKiBDdnIgICovCisjZGVmaW5lIENFTlRFUl9GUk9OVF9DSEFOTkVMX0JPVFRPTSAoMjApIC8qIENiICAgKi8KKyNkZWZpbmUgTEVGVF9GUk9OVF9DSEFOTkVMX0JPVFRPTSAoMjEpICAgLyogTGIgICAqLworI2RlZmluZSBSSUdIVF9GUk9OVF9DSEFOTkVMX0JPVFRPTSAoMjIpICAvKiBSYiAgICovCisjZGVmaW5lIExPV19GUkVRVUVOQ1lfQ0hBTk5FTF8yICgyMykgICAgIC8qIExGRTIgKi8KKworLyogTW9yZSBjb25zdGFudHMgKi8KKyNkZWZpbmUgT05FX0NIQU5ORUwgKDEpCisjZGVmaW5lIFRXT19DSEFOTkVMICgyKQorI2RlZmluZSBTSVhfQ0hBTk5FTCAoNikKKyNkZWZpbmUgRUlHSFRfQ0hBTk5FTCAoOCkKKyNkZWZpbmUgVFdFTlRZX0ZPVVJfQ0hBTk5FTCAoMjQpCisKKyNkZWZpbmUgUENNRE1YX1RIUkVTSE9MRF9NQVBfSEVBVF8xICgwKSAvKiBTdG9yZSBvbmx5IGV4YWN0IG1hdGNoZXMgKi8KKyNkZWZpbmUgUENNRE1YX1RIUkVTSE9MRF9NQVBfSEVBVF8yICgyMCkKKyNkZWZpbmUgUENNRE1YX1RIUkVTSE9MRF9NQVBfSEVBVF8zIFwKKyAgKDI1NikgLyogRG8gbm90IGFzc2lnbiBub3JtYWwgY2hhbm5lbHMgdG8gTEZFICovCisKKyNkZWZpbmUgU1BfWl9OUk0gKDApCisjZGVmaW5lIFNQX1pfVE9QICgyKQorI2RlZmluZSBTUF9aX0JPVCAoLTIpCisjZGVmaW5lIFNQX1pfTEZFICgtMTgpCisjZGVmaW5lIFNQX1pfTVVMICg4KSAvKiBTaG91bGQgYmUgc21hbGxlciB0aGFuIFNQX1pfTEZFICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU0NIQVIgeDsgLyogaG9yaXpvbnRhbCBwb3NpdGlvbjogIGNlbnRlciAoMCksIGxlZnQgKC0pLCByaWdodCAoKykgKi8KKyAgU0NIQVIgeTsgLyogZGVlcHRoIHBvc2l0aW9uOiAgICAgIGZyb250LCBzaWRlLCBiYWNrLCBwb3NpdGlvbiAqLworICBTQ0hBUiB6OyAvKiBoZWlndGggcG9zaXRpb25zOiAgICAgbm9ybWFsLCB0b3AsIGJvdHRvbSwgbGZlICovCit9IFBDTV9ETVhfU1BFQUtFUl9QT1NJVElPTjsKKworLyogQ0FVVElPTjogVGhlIG1heGltdW0geC12YWx1ZSBzaG91bGQgYmUgbGVzcyBvciBlcXVhbCB0bworICogUENNRE1YX1NQS1JfUE9TX1hfTUFYX1dJRFRILiAqLworc3RhdGljIGNvbnN0IFBDTV9ETVhfU1BFQUtFUl9QT1NJVElPTiBzcGtyU2xvdFBvc1tdID0geworICAgIC8qICB4LCAgeSwgIHogICovCisgICAgezAsIDAsIFNQX1pfTlJNfSwgIC8qIDAgIENFTlRFUl9GUk9OVF9DSEFOTkVMICAgICAgICAqLworICAgIHstMiwgMCwgU1BfWl9OUk19LCAvKiAxICBMRUZUX0ZST05UX0NIQU5ORUwgICAgICAgICAgKi8KKyAgICB7MiwgMCwgU1BfWl9OUk19LCAgLyogMiAgUklHSFRfRlJPTlRfQ0hBTk5FTCAgICAgICAgICovCisgICAgey0zLCA0LCBTUF9aX05STX0sIC8qIDMgIExFRlRfUkVBUl9DSEFOTkVMICAgICAgICAgICAqLworICAgIHszLCA0LCBTUF9aX05STX0sICAvKiA0ICBSSUdIVF9SRUFSX0NIQU5ORUwgICAgICAgICAgKi8KKyAgICB7MCwgMCwgU1BfWl9MRkV9LCAgLyogNSAgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMICAgICAgICovCisgICAgey0yLCAyLCBTUF9aX01VTH0sIC8qIDYgIExFRlRfTVVMVElQUlBTX0NIQU5ORUwgICAgICAqLworICAgIHsyLCAyLCBTUF9aX01VTH0gICAvKiA3ICBSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTCAgICAgKi8KK307CisKKy8qIExpc3Qgb2YgcGFja2VkIGNoYW5uZWwgbW9kZXMgKi8KK3R5cGVkZWYgZW51bSB7IC8qIENIX01PREVfPG51bUZyb250Q2g+XzxudW1TaWRlQ2g+XzxudW1CYWNrQ2g+XzxudW1MZkNoPiAqLworICAgICAgICAgICAgICAgQ0hfTU9ERV9VTkRFRklORUQgPSAweDAwMDAsCisgICAgICAgICAgICAgICAvKiAxIGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgIENIX01PREVfMV8wXzBfMCA9IDB4MDAwMSwgLyogY2hDZmcgMSAqLworICAgICAgICAgICAgICAgLyogMiBjaGFubmVscyAqLworICAgICAgICAgICAgICAgQ0hfTU9ERV8yXzBfMF8wID0gMHgwMDAyIC8qIGNoQ2ZnIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzIGNoYW5uZWxzICovCisgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICBDSF9NT0RFXzNfMF8wXzAgPSAweDAwMDMsIC8qIGNoQ2ZnIDMgKi8KKyAgICAgICAgICAgICAgIENIX01PREVfMl8wXzFfMCA9IDB4MDEwMiwKKyAgICAgICAgICAgICAgIENIX01PREVfMl8wXzBfMSA9IDB4MTAwMiwKKyAgICAgICAgICAgICAgIC8qIDQgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgICAgIENIX01PREVfM18wXzFfMCA9IDB4MDEwMywgLyogY2hDZmcgNCAqLworICAgICAgICAgICAgICAgQ0hfTU9ERV8yXzBfMl8wID0gMHgwMjAyLAorICAgICAgICAgICAgICAgQ0hfTU9ERV8yXzBfMV8xID0gMHgxMTAyLAorICAgICAgICAgICAgICAgQ0hfTU9ERV80XzBfMF8wID0gMHgwMDA0LAorICAgICAgICAgICAgICAgLyogNSBjaGFubmVscyAqLworICAgICAgICAgICAgICAgQ0hfTU9ERV8zXzBfMl8wID0gMHgwMjAzLCAvKiBjaENmZyA1ICovCisgICAgICAgICAgICAgICBDSF9NT0RFXzJfMF8yXzEgPSAweDEyMDIsCisgICAgICAgICAgICAgICBDSF9NT0RFXzNfMF8xXzEgPSAweDExMDMsCisgICAgICAgICAgICAgICBDSF9NT0RFXzNfMl8wXzAgPSAweDAwMjMsCisgICAgICAgICAgICAgICBDSF9NT0RFXzVfMF8wXzAgPSAweDAwMDUsCisgICAgICAgICAgICAgICAvKiA2IGNoYW5uZWxzICovCisgICAgICAgICAgICAgICBDSF9NT0RFXzNfMF8yXzEgPSAweDEyMDMsIC8qIGNoQ2ZnIDYgKi8KKyAgICAgICAgICAgICAgIENIX01PREVfM18yXzBfMSA9IDB4MTAyMywKKyAgICAgICAgICAgICAgIENIX01PREVfM18yXzFfMCA9IDB4MDEyMywKKyAgICAgICAgICAgICAgIENIX01PREVfNV8wXzFfMCA9IDB4MDEwNSwKKyAgICAgICAgICAgICAgIENIX01PREVfNl8wXzBfMCA9IDB4MDAwNiwKKyAgICAgICAgICAgICAgIC8qIDcgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgICAgIENIX01PREVfMl8yXzJfMSA9IDB4MTIyMiwKKyAgICAgICAgICAgICAgIENIX01PREVfM18wXzNfMSA9IDB4MTMwMywgLyogY2hDZmcgMTEgKi8KKyAgICAgICAgICAgICAgIENIX01PREVfM18yXzFfMSA9IDB4MTEyMywKKyAgICAgICAgICAgICAgIENIX01PREVfM18yXzJfMCA9IDB4MDIyMywKKyAgICAgICAgICAgICAgIENIX01PREVfM18wXzJfMiA9IDB4MjIwMywKKyAgICAgICAgICAgICAgIENIX01PREVfNV8wXzJfMCA9IDB4MDIwNSwKKyAgICAgICAgICAgICAgIENIX01PREVfNV8wXzFfMSA9IDB4MTEwNSwKKyAgICAgICAgICAgICAgIENIX01PREVfN18wXzBfMCA9IDB4MDAwNywKKyAgICAgICAgICAgICAgIC8qIDggY2hhbm5lbHMgKi8KKyAgICAgICAgICAgICAgIENIX01PREVfM18yXzJfMSA9IDB4MTIyMywKKyAgICAgICAgICAgICAgIENIX01PREVfM18wXzRfMSA9IDB4MTQwMywgLyogY2hDZmcgMTIgKi8KKyAgICAgICAgICAgICAgIENIX01PREVfNV8wXzJfMSA9IDB4MTIwNSwgLyogY2hDZmcgNyArIDE0ICovCisgICAgICAgICAgICAgICBDSF9NT0RFXzVfMl8xXzAgPSAweDAxMjUsCisgICAgICAgICAgICAgICBDSF9NT0RFXzNfMl8xXzIgPSAweDIxMjMsCisgICAgICAgICAgICAgICBDSF9NT0RFXzJfMl8yXzIgPSAweDIyMjIsCisgICAgICAgICAgICAgICBDSF9NT0RFXzNfMF8zXzIgPSAweDIzMDMsCisgICAgICAgICAgICAgICBDSF9NT0RFXzhfMF8wXzAgPSAweDAwMDgKKworfSBQQ01fRE1YX0NIQU5ORUxfTU9ERTsKKworLyogVGhlc2UgYXJlIHRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb25zIGxpbmtlZCB0bworICAgdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgZ2l2ZSBieSB0aGUgdXNlcjogKi8KK3N0YXRpYyBjb25zdCBQQ01fRE1YX0NIQU5ORUxfTU9ERSBvdXRDaE1vZGVUYWJsZVsoOCkgKyAxXSA9IHsKKyAgICBDSF9NT0RFX1VOREVGSU5FRCwKKyAgICBDSF9NT0RFXzFfMF8wXzAsIC8qIDEgY2hhbm5lbCAgKi8KKyAgICBDSF9NT0RFXzJfMF8wXzAgIC8qIDIgY2hhbm5lbHMgKi8KKyAgICAsCisgICAgQ0hfTU9ERV8zXzBfMF8wLCAvKiAzIGNoYW5uZWxzICovCisgICAgQ0hfTU9ERV8zXzBfMV8wLCAvKiA0IGNoYW5uZWxzICovCisgICAgQ0hfTU9ERV8zXzBfMl8wLCAvKiA1IGNoYW5uZWxzICovCisgICAgQ0hfTU9ERV8zXzBfMl8xICAvKiA2IGNoYW5uZWxzICovCisgICAgLAorICAgIENIX01PREVfM18wXzNfMSwgLyogNyBjaGFubmVscyAqLworICAgIENIX01PREVfM18wXzRfMSAgLyogOCBjaGFubmVscyAqLworfTsKKworc3RhdGljIGNvbnN0IEZJWFBfRE1YIGFiTWl4THZsVmFsdWVUYWJbOF0gPSB7CisgICAgRkwyRlhDT05TVF9ETVgoMC41MDBmKSwgLyogc2NhbGVkIGJ5IDEgKi8KKyAgICBGTDJGWENPTlNUX0RNWCgwLjg0MWYpLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCBGTDJGWENPTlNUX0RNWCgwLjU5NmYpLAorICAgIEZMMkZYQ09OU1RfRE1YKDAuNTAwZiksIEZMMkZYQ09OU1RfRE1YKDAuNDIyZiksIEZMMkZYQ09OU1RfRE1YKDAuMzU1ZiksCisgICAgRkwyRlhDT05TVF9ETVgoMC4wZil9OworCitzdGF0aWMgY29uc3QgRklYUF9ETVggbGZlTWl4THZsVmFsdWVUYWJbMTZdID0geworICAgIC8qICAgICAgICAgICAgIHZhbHVlLCAgICAgICAgc2NhbGUgKi8KKyAgICBGTDJGWENPTlNUX0RNWCgwLjc5MDVmKSwgLyogICAgIDIgKi8KKyAgICBGTDJGWENPTlNUX0RNWCgwLjUwMDBmKSwgLyogICAgIDIgKi8KKyAgICBGTDJGWENPTlNUX0RNWCgwLjgzOTVmKSwgLyogICAgIDEgKi8KKyAgICBGTDJGWENPTlNUX0RNWCgwLjcwNjVmKSwgLyogICAgIDEgKi8KKyAgICBGTDJGWENPTlNUX0RNWCgwLjU5NDVmKSwgLyogICAgIDEgKi8KKyAgICBGTDJGWENPTlNUX0RNWCgwLjUwMGYpLCAgLyogICAgIDEgKi8KKyAgICBGTDJGWENPTlNUX0RNWCgwLjg0MWYpLCAgLyogICAgIDAgKi8KKyAgICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAgLyogICAgIDAgKi8KKyAgICBGTDJGWENPTlNUX0RNWCgwLjU5NmYpLCAgLyogICAgIDAgKi8KKyAgICBGTDJGWENPTlNUX0RNWCgwLjUwMGYpLCAgLyogICAgIDAgKi8KKyAgICBGTDJGWENPTlNUX0RNWCgwLjMxNmYpLCAgLyogICAgIDAgKi8KKyAgICBGTDJGWENPTlNUX0RNWCgwLjE3OGYpLCAgLyogICAgIDAgKi8KKyAgICBGTDJGWENPTlNUX0RNWCgwLjEwMGYpLCAgLyogICAgIDAgKi8KKyAgICBGTDJGWENPTlNUX0RNWCgwLjAzMmYpLCAgLyogICAgIDAgKi8KKyAgICBGTDJGWENPTlNUX0RNWCgwLjAxMGYpLCAgLyogICAgIDAgKi8KKyAgICBGTDJGWENPTlNUX0RNWCgwLjAwMGYpICAgLyogICAgIDAgKi8KK307CisKKy8qIE1QRUcgbWF0cml4IG1peGRvd246CisgICAgU2V0IDE6ICBMJyA9ICgxICsgMl4tMC41ICsgQSApXi0xICogW0wgKyBDICogMl4tMC41ICsgQSAqIExzXTsKKyAgICAgICAgICAgIFInID0gKDEgKyAyXi0wLjUgKyBBICleLTEgKiBbUiArIEMgKiAyXi0wLjUgKyBBICogUnNdOworCisgICAgU2V0IDI6ICBMJyA9ICgxICsgMl4tMC41ICsgMkEgKV4tMSAqIFtMICsgQyAqIDJeLTAuNSAtIEEgKiAoTHMgKyBScyldOworICAgICAgICAgICAgUicgPSAoMSArIDJeLTAuNSArIDJBICleLTEgKiBbUiArIEMgKiAyXi0wLjUgKyBBICogKExzICsgUnMpXTsKKworICAgIE0gPSAoMyArIDJBKV4tMSAqIFtMICsgQyArIFIgKyBBKihMcyArIFJzKV07CisqLworc3RhdGljIGNvbnN0IEZJWFBfRE1YIG1wZWdNaXhEb3duSWR4MkNvZWZbNF0gPSB7CisgICAgRkwyRlhDT05TVF9ETVgoMC43MDcxMDY3OGYpLCBGTDJGWENPTlNUX0RNWCgwLjVmKSwKKyAgICBGTDJGWENPTlNUX0RNWCgwLjM1MzU1MzM5ZiksIEZMMkZYQ09OU1RfRE1YKDAuMGYpfTsKKworc3RhdGljIGNvbnN0IEZJWFBfRE1YIG1wZWdNaXhEb3duSWR4MlByZUZhY3RbM11bNF0gPSB7CisgICAgey8qIFNldCAxOiAqLworICAgICBGTDJGWENPTlNUX0RNWCgwLjQxNDIxMzU2MjM3MzA5NTBmKSwgRkwyRlhDT05TVF9ETVgoMC40NTMwODE4MzkzMjE5NzI4ZiksCisgICAgIEZMMkZYQ09OU1RfRE1YKDAuNDg1MjgxMzc0MjM4NTcwM2YpLCBGTDJGWENPTlNUX0RNWCgwLjU4NTc4NjQzNzYyNjkwNTBmKX0sCisgICAgey8qIFNldCAyOiAqLworICAgICBGTDJGWENPTlNUX0RNWCgwLjMyMDM3NzI0MTAxNzA0MDdmKSwgRkwyRlhDT05TVF9ETVgoMC4zNjkzOTgwNjI1MTgxMjkzZiksCisgICAgIEZMMkZYQ09OU1RfRE1YKDAuNDE0MjEzNTYyMzczMDk1MGYpLCBGTDJGWENPTlNUX0RNWCgwLjU4NTc4NjQzNzYyNjkwNTBmKX0sCisgICAgey8qIE1vbm8gRE1YIHNldDogKi8KKyAgICAgRkwyRlhDT05TVF9ETVgoMC4yMjY1NDA5MTk2NjA5ODY0ZiksIEZMMkZYQ09OU1RfRE1YKDAuMjVmKSwKKyAgICAgRkwyRlhDT05TVF9ETVgoMC4yNjk3NTIxNDMzODk4MTc5ZiksIEZMMkZYQ09OU1RfRE1YKDAuMzMzMzMzMzMzMzMzMzMzM2YpfX07CisKKyNkZWZpbmUgVFlQRV9OT05FICgweDAwKQorI2RlZmluZSBUWVBFX1BDRV9EQVRBICgweDAxKQorI2RlZmluZSBUWVBFX0RTRV9DTEVWX0RBVEEgKDB4MDIpCisjZGVmaW5lIFRZUEVfRFNFX1NMRVZfREFUQSAoMHgwNCkKKyNkZWZpbmUgVFlQRV9EU0VfRE1JWF9BQl9EQVRBICgweDA4KQorI2RlZmluZSBUWVBFX0RTRV9ETUlYX0xGRV9EQVRBICgweDEwKQorI2RlZmluZSBUWVBFX0RTRV9ETVhfR0FJTl9EQVRBICgweDIwKQorI2RlZmluZSBUWVBFX0RTRV9ETVhfQ0dMX0RBVEEgKDB4NDApCisjZGVmaW5lIFRZUEVfRFNFX0RBVEEgKDB4N0UpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVCB0eXBlRmxhZ3M7CisgIC8qIEZyb20gRFNFICovCisgIFVDSEFSIGNMZXZJZHg7CisgIFVDSEFSIHNMZXZJZHg7CisgIFVDSEFSIGRtaXhJZHhBOworICBVQ0hBUiBkbWl4SWR4QjsKKyAgVUNIQVIgZG1peElkeExmZTsKKyAgVUNIQVIgZG14R2FpbklkeDI7CisgIFVDSEFSIGRteEdhaW5JZHg1OworICAvKiBGcm9tIFBDRSAqLworICBVQ0hBUiBtYXRyaXhNaXhkb3duSWR4OworICAvKiBBdHRyaWJ1dGVzOiAqLworICBTQ0hBUiBwc2V1ZG9TdXJyb3VuZDsgLyohPCBJZiBzZXQgdG8gMSB0aGUgc2lnbmFsIGlzIHBzZXVkbyBzdXJyb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJsZS4gVGhlIHZhbHVlIDAgdGVsbHMgdGhhdCBpdCBpcyBub3QuIElmIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgLTEgdGhlIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuICAqLworICBVSU5UIGV4cGlyeUNvdW50OyAvKiE8IENvdW50ZXIgdG8gbW9uaXRvciB0aGUgbGlmZSB0aW1lIG9mIGEgbWV0YSBkYXRhIHNldC4gKi8KKworfSBETVhfQlNfTUVUQV9EQVRBOworCisvKiBEZWZhdWx0IG1ldGFkYXRhICovCitzdGF0aWMgY29uc3QgRE1YX0JTX01FVEFfREFUQSBkZmx0TWV0YURhdGEgPSB7MCwgMiwgMiwgMiwgIDIsIDE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIC0xLCAwfTsKKworLyogRHluYW1pYyAodXNlcikgcGFyYW1zOgorICAgICBTZWUgdGhlIGRlZmluaXRpb24gb2YgUENNRE1YX1BBUkFNIGZvciBkZXRhaWxzIG9uIHRoZSBzcGVjaWZpYyBmaWVsZHMuICovCit0eXBlZGVmIHN0cnVjdCB7CisgIERNWF9QUk9GSUxFX1RZUEUgZG14UHJvZmlsZTsgLyohPCBMaW5rZWQgdG8gRE1YX1BSRkxfU1RBTkRBUkQgICAgICAgICAgICAgICovCisgIFVJTlQgZXhwaXJ5RnJhbWU7ICAgICAgICAgICAgLyohPCBMaW5rZWQgdG8gRE1YX0JTX0RBVEFfRVhQSVJZX0ZSQU1FICAgICAgICovCisgIERVQUxfQ0hBTk5FTF9NT0RFIGR1YWxDaGFubmVsTW9kZTsgLyohPCBMaW5rZWQgdG8gRE1YX0RVQUxfQ0hBTk5FTF9NT0RFICovCisgIFBTRVVET19TVVJST1VORF9NT0RFCisgIHBzZXVkb1N1cnJNb2RlOyAgICAgICAgICAvKiE8IExpbmtlZCB0byBETVhfUFNFVURPX1NVUlJPVU5EX01PREUgICAgICAgKi8KKyAgU0hPUlQgbnVtT3V0Q2hhbm5lbHNNaW47IC8qITwgTGlua2VkIHRvIE1JTl9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTICAqLworICBTSE9SVCBudW1PdXRDaGFubmVsc01heDsgLyohPCBMaW5rZWQgdG8gTUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMgICovCisgIFVDSEFSIGZyYW1lRGVsYXk7ICAgICAgICAvKiE8IExpbmtlZCB0byBETVhfQlNfREFUQV9ERUxBWSAgICAgICAgICAgICAgKi8KKworfSBQQ01fRE1YX1VTRVJfUEFSQU1TOworCisvKiBNb2R1bGVzIG1haW4gZGF0YSBzdHJ1Y3R1cmU6ICovCitzdHJ1Y3QgUENNX0RNWF9JTlNUQU5DRSB7CisgIC8qIE1ldGFkYXRhICovCisgIERNWF9CU19NRVRBX0RBVEEgYnNNZXRhRGF0YVsoMSkgKyAxXTsKKyAgUENNX0RNWF9VU0VSX1BBUkFNUyB1c2VyUGFyYW1zOworCisgIFVDSEFSIGFwcGx5UHJvY2Vzc2luZzsgLyohPCBGbGFnIHRvIGVuLS9kaXNhYmxlIG1vZHVsZXMgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXggY2hhbm5lbCBsaW1pdGluZyBpcyBkb25lIGluZGVwZW5kZW50bHkuICovCit9OworCisvKiBNZW1vcnkgYWxsb2NhdGlvbiBtYWNybyAqLworQ19BTExPQ19NRU0oUGNtRG14SW5zdGFuY2UsIHN0cnVjdCBQQ01fRE1YX0lOU1RBTkNFLCAxKQorCitzdGF0aWMgVUlOVCBnZXRTcGVha2VyRGlzdGFuY2UoUENNX0RNWF9TUEVBS0VSX1BPU0lUSU9OIHBvc0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENNX0RNWF9TUEVBS0VSX1BPU0lUSU9OIHBvc0IpIHsKKyAgUENNX0RNWF9TUEVBS0VSX1BPU0lUSU9OIGRpZmY7CisKKyAgZGlmZi54ID0gcG9zQS54IC0gcG9zQi54OworICBkaWZmLnkgPSBwb3NBLnkgLSBwb3NCLnk7CisgIGRpZmYueiA9IHBvc0EueiAtIHBvc0IuejsKKworICByZXR1cm4gKChkaWZmLnggKiBkaWZmLngpICsgKGRpZmYueSAqIGRpZmYueSkgKyAoZGlmZi56ICogZGlmZi56KSk7Cit9CisKK3N0YXRpYyBQQ01fRE1YX1NQRUFLRVJfUE9TSVRJT04gZ2V0U3BlYWtlclBvcyhBVURJT19DSEFOTkVMX1RZUEUgY2hUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGNoSW5kZXgsIFVDSEFSIG51bUNoSW5HcnApIHsKKyNkZWZpbmUgUENNRE1YX1NQS1JfUE9TX1hfTUFYX1dJRFRIICgzKQorI2RlZmluZSBQQ01ETVhfU1BLUl9QT1NfWV9TUFJFQUQgKDIpCisjZGVmaW5lIFBDTURNWF9TUEtSX1BPU19aX1NQUkVBRCAoMikKKworICBQQ01fRE1YX1NQRUFLRVJfUE9TSVRJT04gc3BrclBvcyA9IHswLCAwLCAwfTsKKyAgQVVESU9fQ0hBTk5FTF9UWVBFIGNoR3JwID0gKEFVRElPX0NIQU5ORUxfVFlQRSkoY2hUeXBlICYgMHgwRik7CisgIHVuc2lnbmVkIGZIYXNDZW50ZXIgPSBudW1DaEluR3JwICYgMHgxOworICB1bnNpZ25lZCBjaEdycFdpZHRoID0gbnVtQ2hJbkdycCA+PiAxOworICB1bnNpZ25lZCBmSXNDZW50ZXIgPSAwOworICB1bnNpZ25lZCBmSXNMZmUgPSAoY2hUeXBlID09IEFDVF9MRkUpID8gMSA6IDA7CisgIGludCBvZmZzZXQgPSAwOworCisgIEZES19BU1NFUlQoY2hJbmRleCA8IG51bUNoSW5HcnApOworCisgIGlmICgoY2hHcnAgPT0gQUNUX0ZST05UKSAmJiBmSGFzQ2VudGVyKSB7CisgICAgaWYgKGNoSW5kZXggPT0gMCkgZklzQ2VudGVyID0gMTsKKyAgICBjaEluZGV4ID0gKFVDSEFSKWZNYXgoMCwgY2hJbmRleCAtIDEpOworICB9IGVsc2UgaWYgKGZIYXNDZW50ZXIgJiYgKGNoSW5kZXggPT0gbnVtQ2hJbkdycCAtIDEpKSB7CisgICAgZklzQ2VudGVyID0gMTsKKyAgfQorICAvKiBub3cgYWxsIGV2ZW4gaW5kaWNlcyBhcmUgbGVmdCAoLSkgKi8KKyAgaWYgKCFmSXNDZW50ZXIpIHsKKyAgICBvZmZzZXQgPSBjaEluZGV4ID4+IDE7CisgICAgaWYgKChjaEdycCA+IEFDVF9GUk9OVCkgJiYgKGNoVHlwZSAhPSBBQ1RfU0lERSkgJiYgIWZJc0xmZSkgeworICAgICAgLyogdGhlIGhpZ2hlciB0aGUgaW5kZXggdGhlIGxvd2VyIHRoZSBkaXN0YW5jZSB0byB0aGUgY2VudGVyIHBvc2l0aW9uICovCisgICAgICBvZmZzZXQgPSBjaEdycFdpZHRoIC0gZkhhc0NlbnRlciAtIG9mZnNldDsKKyAgICB9CisgICAgaWYgKChjaEluZGV4ICYgMHgxKSA9PSAwKSB7IC8qIGV2ZW4gKi8KKyAgICAgIG9mZnNldCA9IC0ob2Zmc2V0ICsgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG9mZnNldCArPSAxOworICAgIH0KKyAgfQorICAvKiBhcHBseSB0aGUgb2Zmc2V0ICovCisgIGlmIChjaFR5cGUgPT0gQUNUX1NJREUpIHsKKyAgICBzcGtyUG9zLnggPSAob2Zmc2V0IDwgMCkgPyAtUENNRE1YX1NQS1JfUE9TX1hfTUFYX1dJRFRICisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUENNRE1YX1NQS1JfUE9TX1hfTUFYX1dJRFRIOworICAgIHNwa3JQb3MueSA9IC8qIDF4ICovIFBDTURNWF9TUEtSX1BPU19ZX1NQUkVBRCArIChTQ0hBUilmQWJzKG9mZnNldCkgLSAxOworICAgIHNwa3JQb3MueiA9IDA7CisgIH0gZWxzZSB7CisgICAgdW5zaWduZWQgc3ByZWFkID0KKyAgICAgICAgKChjaEdycFdpZHRoID09IDEpICYmICghZklzTGZlKSkgPyBQQ01ETVhfU1BLUl9QT1NfWF9NQVhfV0lEVEggLSAxIDogMTsKKyAgICBzcGtyUG9zLnggPSAoU0NIQVIpb2Zmc2V0ICogKFNDSEFSKXNwcmVhZDsKKyAgICBpZiAoZklzTGZlKSB7CisgICAgICBzcGtyUG9zLnkgPSAwOworICAgICAgc3BrclBvcy56ID0gU1BfWl9MRkU7CisgICAgfSBlbHNlIHsKKyAgICAgIHNwa3JQb3MueSA9IChTQ0hBUilmTWF4KChTQ0hBUiljaEdycCAtIDEsIDApICogUENNRE1YX1NQS1JfUE9TX1lfU1BSRUFEOworICAgICAgc3BrclBvcy56ID0gKFNDSEFSKWNoVHlwZSA+PiA0OworICAgICAgaWYgKHNwa3JQb3MueiA9PSAyKSB7IC8qIEFDVF9CT1RUT00gKi8KKyAgICAgICAgc3BrclBvcy56ID0gLTE7CisgICAgICB9CisgICAgICBzcGtyUG9zLnogKj0gUENNRE1YX1NQS1JfUE9TX1pfU1BSRUFEOworICAgIH0KKyAgfQorICByZXR1cm4gc3BrclBvczsKK30KKworLyoqIFJldHVybiB0aGUgY2hhbm5lbCBtb2RlIG9mIGEgZ2l2ZW4gaG9yaXpvbnRhbCBjaGFubmVsIHBsYWluIChub3JtYWwsIHRvcCwKKyAqYm90dG9tKSBmb3IgYSBnaXZlbiBjaGFubmVsIGNvbmZpZ3VyYXRpb24uIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hhbGwgZ2V0CisgKm9ic29sZXRlIG9uY2UgdGhlIGNoYW5uZWwgbW9kZSBoYXMgYmVlbiBjaGFuZ2VkIHRvIGJlIG5vbmFtYmlndW91cy4KKyAqIEBwYXJhbSBbaW5dIEluZGV4IG9mIHRoZSByZXF1ZXN0ZWQgY2hhbm5lbCBwbGFpbi4KKyAqIEBwYXJhbSBbaW5dIFRoZSBwYWNrZWQgY2hhbm5lbCBtb2RlIGZvciB0aGUgY29tcGxldGUgY2hhbm5lbCBjb25maWd1cmF0aW9uCisgKihhbGwgcGxhaW5zKS4KKyAqIEBwYXJhbSBbaW5dIFRoZSBNUEVHLTQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGluZGV4IHdoaWNoIGlzIG5lY2Vzc2FyeSBpbgorICpjYXNlcyB3aGVyZSB0aGUgKHBhY2tlZCkgY2hhbm5lbCBtb2RlIGlzIGFtYmlndW91cy4KKyAqIEByZXR1cm5zIFJldHVybnMgdGhlIHBhY2tlZCBjaGFubmVsIG1vZGUgb2YgdGhlIHJlcXVlc3RlZCBjaGFubmVsIHBsYWluLgorICoqLworc3RhdGljIFBDTV9ETVhfQ0hBTk5FTF9NT0RFIGdldENoTW9kZTRQbGFpbigKKyAgICBjb25zdCBpbnQgcGxhaW5JbmRleCwgY29uc3QgUENNX0RNWF9DSEFOTkVMX01PREUgdG90Q2hNb2RlLAorICAgIGNvbnN0IGludCBjaENmZykgeworICBQQ01fRE1YX0NIQU5ORUxfTU9ERSBwbGFpbkNoTW9kZSA9IHRvdENoTW9kZTsKKworICBzd2l0Y2ggKHRvdENoTW9kZSkgeworICAgIGNhc2UgQ0hfTU9ERV81XzBfMl8xOgorICAgICAgaWYgKGNoQ2ZnID09IDE0KSB7CisgICAgICAgIHN3aXRjaCAocGxhaW5JbmRleCkgeworICAgICAgICAgIGNhc2UgQ0hfUExBSU5fQk9UVE9NOgorICAgICAgICAgICAgcGxhaW5DaE1vZGUgPSAoUENNX0RNWF9DSEFOTkVMX01PREUpMHgwMDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBDSF9QTEFJTl9UT1A6CisgICAgICAgICAgICBwbGFpbkNoTW9kZSA9IENIX01PREVfMl8wXzBfMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQ0hfUExBSU5fTk9STUFMOgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwbGFpbkNoTW9kZSA9IENIX01PREVfM18wXzJfMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcGxhaW5DaE1vZGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgVUlOVCBnZXRJZHhTdW0oVUNIQVIgbnVtQ2gpIHsKKyAgVUlOVCByZXN1bHQgPSAwOworICBpbnQgaTsKKyAgZm9yIChpID0gMTsgaSA8IG51bUNoOyBpICs9IDEpIHsKKyAgICByZXN1bHQgKz0gaTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKiogRXZhbHVhdGUgYSBnaXZlbiBjaGFubmVsIGNvbmZpZ3VyYXRpb24gYW5kIGV4dHJhY3QgYSBwYWNrZWQgY2hhbm5lbCBtb2RlLiBJbgorICphZGRpdGlvbiB0aGUgZnVuY3Rpb24gZ2VuZXJhdGVzIGEgY2hhbm5lbCBvZmZzZXQgdGFibGUgZm9yIHRoZSBtYXBwaW5nIHRvIHRoZQorICppbnRlcm5hbCByZXByZXNlbnRhdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW52ZXJzZSB0byB0aGUKKyAqZ2V0Q2hhbm5lbERlc2NyaXB0aW9uKCkgcm91dGluZS4KKyAqIEBwYXJhbSBbaW5dIFRoZSB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgb2YgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uCisgKiBAcGFyYW0gW2luXSBBcnJheSBob2xkaW5nIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZXMgZm9yIGVhY2ggY2hhbm5lbC4KKyAqIEBwYXJhbSBbaW5dIEFycmF5IGhvbGRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGluZGljZXMgZm9yIGVhY2gKKyAqY2hhbm5lbC4KKyAqIEBwYXJhbSBbb3V0XSBBcnJheSB3aGVyZSB0aGUgYnVmZmVyIG9mZnNldHMgZm9yIGVhY2ggY2hhbm5lbCBhcmUgc3RvcmVkIGludG8uCisgKiBAcGFyYW0gW291dF0gVGhlIGdlbmVyYXRlZCBwYWNrZWQgY2hhbm5lbCBtb2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4KKyAqaW5wdXQgY29uZmlndXJhdGlvbi4KKyAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KKyAqKi8KK3N0YXRpYyBQQ01ETVhfRVJST1IgZ2V0Q2hhbm5lbE1vZGUoCisgICAgY29uc3QgVUlOVCBudW1DaGFubmVscywgICAgICAgICAgICAgICAgIC8qIGluICovCisgICAgY29uc3QgQVVESU9fQ0hBTk5FTF9UWVBFIGNoYW5uZWxUeXBlW10sIC8qIGluICovCisgICAgVUNIQVIgY2hhbm5lbEluZGljZXNbXSwgICAgICAgICAgICAgICAgIC8qIGluICovCisgICAgVUNIQVIgb2Zmc2V0VGFibGVbKDgpXSwgICAgICAgICAgICAgICAgIC8qIG91dCAqLworICAgIFBDTV9ETVhfQ0hBTk5FTF9NT0RFICpjaE1vZGUgICAgICAgICAgICAvKiBvdXQgKi8KKykgeworICBVSU5UIGlkeFN1bVsoMyldWyg0KV07CisgIFVDSEFSIG51bUNoWygzKV1bKDQpXTsKKyAgVUNIQVIgbWFwcGVkWyg4KV07CisgIFBDTV9ETVhfU1BFQUtFUl9QT1NJVElPTiBzcGtyUG9zWyg4KV07CisgIFBDTURNWF9FUlJPUiBlcnIgPSBQQ01ETVhfT0s7CisgIHVuc2lnbmVkIGNoLCBudW1NYXBwZWRJbkNocyA9IDA7CisgIHVuc2lnbmVkIHN0YXJ0U2xvdDsKKyAgdW5zaWduZWQgc3RvcFNsb3QgPSBMT1dfRlJFUVVFTkNZX0NIQU5ORUw7CisKKyAgRkRLX0FTU0VSVChjaGFubmVsVHlwZSAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChjaGFubmVsSW5kaWNlcyAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChvZmZzZXRUYWJsZSAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChjaE1vZGUgIT0gTlVMTCk7CisKKyAgLyogRm9yIGRldGFpbHMgc2VlIElTTy9JRUMgMTM4MTgtNzoyMDA1KEUpLCA4LjUuMyBDaGFubmVsIGNvbmZpZ3VyYXRpb24gKi8KKyAgRkRLbWVtY2xlYXIoaWR4U3VtLCAoMykgKiAoNCkgKiBzaXplb2YoVUlOVCkpOworICBGREttZW1jbGVhcihudW1DaCwgKDMpICogKDQpICogc2l6ZW9mKFVDSEFSKSk7CisgIEZES21lbWNsZWFyKG1hcHBlZCwgKDgpICogc2l6ZW9mKFVDSEFSKSk7CisgIEZES21lbWNsZWFyKHNwa3JQb3MsICg4KSAqIHNpemVvZihQQ01fRE1YX1NQRUFLRVJfUE9TSVRJT04pKTsKKyAgLyogSW5pdCBvdXRwdXQgKi8KKyAgRkRLbWVtc2V0KG9mZnNldFRhYmxlLCAyNTUsICg4KSAqIHNpemVvZihVQ0hBUikpOworICAqY2hNb2RlID0gQ0hfTU9ERV9VTkRFRklORUQ7CisKKyAgLyogRGV0ZXJtaW5lIGhvdyBtYW55IGNoYW5uZWxzIGFyZSBhc3NpZ25lZCB0byBlYWNoIGNoYW5uZWxzIGVhY2ggZ3JvdXA6ICovCisgIGZvciAoY2ggPSAwOyBjaCA8IG51bUNoYW5uZWxzOyBjaCArPSAxKSB7CisgICAgdW5zaWduZWQgY2hHcnAgPSBmTWF4KAorICAgICAgICAoY2hhbm5lbFR5cGVbY2hdICYgMHgwRikgLSAxLAorICAgICAgICAwKTsgLyogQXNzaWduIGFsbCB1bmRlZmluZWQgY2hhbm5lbHMgKEFDVF9OT05FKSB0byBmcm9udCBjaGFubmVscy4gKi8KKyAgICBudW1DaFtjaGFubmVsVHlwZVtjaF0gPj4gNF1bY2hHcnBdICs9IDE7CisgICAgaWR4U3VtW2NoYW5uZWxUeXBlW2NoXSA+PiA0XVtjaEdycF0gKz0gY2hhbm5lbEluZGljZXNbY2hdOworICB9CisgIGlmIChudW1DaGFubmVscyA+IFRXT19DSEFOTkVMKSB7CisgICAgaW50IGNoR3JwOworICAgIC8qIFNhbml0eSBjaGVjayBvbiB0aGUgaW5kaWNlcyAqLworICAgIGZvciAoY2hHcnAgPSAwOyBjaEdycCA8ICg0KTsgY2hHcnAgKz0gMSkgeworICAgICAgaW50IHBsYW5lOworICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgKDMpOyBwbGFuZSArPSAxKSB7CisgICAgICAgIGlmIChpZHhTdW1bcGxhbmVdW2NoR3JwXSAhPSBnZXRJZHhTdW0obnVtQ2hbcGxhbmVdW2NoR3JwXSkpIHsKKyAgICAgICAgICB1bnNpZ25lZCBpZHhDbnQgPSAwOworICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG51bUNoYW5uZWxzOyBjaCArPSAxKSB7CisgICAgICAgICAgICBpZiAoY2hhbm5lbFR5cGVbY2hdID09CisgICAgICAgICAgICAgICAgKEFVRElPX0NIQU5ORUxfVFlQRSkoKHBsYW5lIDw8IDQpIHwgKChjaEdycCArIDEpICYgMHhGKSkpIHsKKyAgICAgICAgICAgICAgY2hhbm5lbEluZGljZXNbY2hdID0gaWR4Q250Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVyciA9IFBDTURNWF9JTlZBTElEX0NIX0NPTkZJRzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAvKiBNYXBwaW5nIEhFQVQgMToKKyAgICogICBEZXRlcm1pbmUgdGhlIHNwZWFrZXIgcG9zaXRpb24gb2YgZWFjaCBpbnB1dCBjaGFubmVsIGFuZCBtYXAgaXQgdG8gYQorICAgKiBpbnRlcm5hbCBzbG90IGlmIGl0IG1hdGNoZXMgZXhhY3RseSAod2l0aCB6ZXJvIGRpc3RhbmNlKS4gKi8KKyAgZm9yIChjaCA9IDA7IGNoIDwgbnVtQ2hhbm5lbHM7IGNoICs9IDEpIHsKKyAgICBVSU5UIG1hcERpc3QgPSAodW5zaWduZWQpLTE7CisgICAgdW5zaWduZWQgbWFwQ2gsIG1hcFBvcyA9ICh1bnNpZ25lZCktMTsKKyAgICB1bnNpZ25lZCBjaEdycCA9IGZNYXgoCisgICAgICAgIChjaGFubmVsVHlwZVtjaF0gJiAweDBGKSAtIDEsCisgICAgICAgIDApOyAvKiBBc3NpZ24gYWxsIHVuZGVmaW5lZCBjaGFubmVscyAoQUNUX05PTkUpIHRvIGZyb250IGNoYW5uZWxzLiAqLworCisgICAgc3BrclBvc1tjaF0gPSBnZXRTcGVha2VyUG9zKGNoYW5uZWxUeXBlW2NoXSwgY2hhbm5lbEluZGljZXNbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1DaFtjaGFubmVsVHlwZVtjaF0gPj4gNF1bY2hHcnBdKTsKKworICAgIGZvciAobWFwQ2ggPSAwOyBtYXBDaCA8PSBzdG9wU2xvdDsgbWFwQ2ggKz0gMSkgeworICAgICAgaWYgKG9mZnNldFRhYmxlW21hcENoXSA9PSAyNTUpIHsKKyAgICAgICAgVUlOVCBkaXN0ID0gZ2V0U3BlYWtlckRpc3RhbmNlKHNwa3JQb3NbY2hdLCBzcGtyU2xvdFBvc1ttYXBDaF0pOworICAgICAgICBpZiAoZGlzdCA8IG1hcERpc3QpIHsKKyAgICAgICAgICBtYXBQb3MgPSBtYXBDaDsKKyAgICAgICAgICBtYXBEaXN0ID0gZGlzdDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAobWFwRGlzdCA8PSBQQ01ETVhfVEhSRVNIT0xEX01BUF9IRUFUXzEpIHsKKyAgICAgIG9mZnNldFRhYmxlW21hcFBvc10gPSAoVUNIQVIpY2g7CisgICAgICBtYXBwZWRbY2hdID0gMTsKKyAgICAgIG51bU1hcHBlZEluQ2hzICs9IDE7CisgICAgfQorICB9CisKKyAgLyogTWFwcGluZyBIRUFUIDI6CisgICAqICAgR28gdGhyb3VnaCB0aGUgdW5tYXBwZWQgaW5wdXQgY2hhbm5lbHMgYW5kIGFzc2lnbiB0aGVtIHRvIHRoZSBpbnRlcm5hbAorICAgKiBzbG90cyB0aGF0IG1hdGNoZXMgYmVzdCAobGVhc3QgZGlzdGFuY2UpLiBCdXQgYXNzaWduIGNlbnRlciBjaGFubmVscyB0bworICAgKiBjZW50ZXIgc2xvdHMgb25seS4gKi8KKyAgc3RhcnRTbG90ID0KKyAgICAgICgobnVtQ2hbQ0hfUExBSU5fTk9STUFMXVtDSF9HUk9VUF9GUk9OVF0gJiAweDEpIHx8IChudW1DaGFubmVscyA+PSAoOCkpKQorICAgICAgICAgID8gMAorICAgICAgICAgIDogMTsKKyAgZm9yIChjaCA9IDA7IGNoIDwgKHVuc2lnbmVkKW51bUNoYW5uZWxzOyBjaCArPSAxKSB7CisgICAgaWYgKCFtYXBwZWRbY2hdKSB7CisgICAgICBVSU5UIG1hcERpc3QgPSAodW5zaWduZWQpLTE7CisgICAgICB1bnNpZ25lZCBtYXBDaCwgbWFwUG9zID0gKHVuc2lnbmVkKS0xOworCisgICAgICBmb3IgKG1hcENoID0gc3RhcnRTbG90OyBtYXBDaCA8PSBzdG9wU2xvdDsgbWFwQ2ggKz0gMSkgeworICAgICAgICBpZiAob2Zmc2V0VGFibGVbbWFwQ2hdID09IDI1NSkgeworICAgICAgICAgIFVJTlQgZGlzdCA9IGdldFNwZWFrZXJEaXN0YW5jZShzcGtyUG9zW2NoXSwgc3BrclNsb3RQb3NbbWFwQ2hdKTsKKyAgICAgICAgICBpZiAoZGlzdCA8IG1hcERpc3QpIHsKKyAgICAgICAgICAgIG1hcFBvcyA9IG1hcENoOworICAgICAgICAgICAgbWFwRGlzdCA9IGRpc3Q7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoKG1hcFBvcyA8PSBzdG9wU2xvdCkgJiYgKG1hcERpc3QgPCBQQ01ETVhfVEhSRVNIT0xEX01BUF9IRUFUXzIpICYmCisgICAgICAgICAgKCgoc3BrclBvc1tjaF0ueCAhPSAwKSAmJiAoc3BrclNsb3RQb3NbbWFwUG9zXS54ICE9IDApKSAvKiBYT1IgKi8KKyAgICAgICAgICAgfHwgKChzcGtyUG9zW2NoXS54ID09IDApICYmCisgICAgICAgICAgICAgICAoc3BrclNsb3RQb3NbbWFwUG9zXS54ID09CisgICAgICAgICAgICAgICAgMCkpKSkgeyAvKiBBc3NpZ24gY2VudGVyIGNoYW5uZWxzIHRvIGNlbnRlciBzbG90cyBvbmx5LiAqLworICAgICAgICBvZmZzZXRUYWJsZVttYXBQb3NdID0gKFVDSEFSKWNoOworICAgICAgICBtYXBwZWRbY2hdID0gMTsKKyAgICAgICAgbnVtTWFwcGVkSW5DaHMgKz0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBNYXBwaW5nIEhFQVQgMzoKKyAgICogICBBc3NpZ24gdGhlIHJlc3QgYnkgc2VhcmNoaW5nIGZvciB0aGUgbmVhcmVzdCBpbnB1dCBjaGFubmVsIGZvciBlYWNoCisgICAqIGludGVybmFsIHNsb3QuICovCisgIGZvciAoY2ggPSBzdGFydFNsb3Q7IChjaCA8ICg4KSkgJiYgKG51bU1hcHBlZEluQ2hzIDwgbnVtQ2hhbm5lbHMpOyBjaCArPSAxKSB7CisgICAgaWYgKG9mZnNldFRhYmxlW2NoXSA9PSAyNTUpIHsKKyAgICAgIFVJTlQgbWFwRGlzdCA9ICh1bnNpZ25lZCktMTsKKyAgICAgIHVuc2lnbmVkIG1hcENoLCBtYXBQb3MgPSAodW5zaWduZWQpLTE7CisKKyAgICAgIGZvciAobWFwQ2ggPSAwOyBtYXBDaCA8ICh1bnNpZ25lZCludW1DaGFubmVsczsgbWFwQ2ggKz0gMSkgeworICAgICAgICBpZiAoIW1hcHBlZFttYXBDaF0pIHsKKyAgICAgICAgICBVSU5UIGRpc3QgPSBnZXRTcGVha2VyRGlzdGFuY2Uoc3BrclBvc1ttYXBDaF0sIHNwa3JTbG90UG9zW2NoXSk7CisgICAgICAgICAgaWYgKGRpc3QgPCBtYXBEaXN0KSB7CisgICAgICAgICAgICBtYXBQb3MgPSBtYXBDaDsKKyAgICAgICAgICAgIG1hcERpc3QgPSBkaXN0OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKG1hcERpc3QgPCBQQ01ETVhfVEhSRVNIT0xEX01BUF9IRUFUXzMpIHsKKyAgICAgICAgb2Zmc2V0VGFibGVbY2hdID0gKFVDSEFSKW1hcFBvczsKKyAgICAgICAgbWFwcGVkW21hcFBvc10gPSAxOworICAgICAgICBudW1NYXBwZWRJbkNocyArPSAxOworICAgICAgICBpZiAoKHNwa3JQb3NbbWFwUG9zXS54ID09IDApICYmIChzcGtyU2xvdFBvc1tjaF0ueCAhPSAwKSAmJgorICAgICAgICAgICAgKG51bUNoYW5uZWxzIDwKKyAgICAgICAgICAgICAoOCkpKSB7IC8qIFNraXAgdGhlIHBhaXJlZCBzbG90IGlmIHdlIGFzc2lnbmVkIGEgY2VudGVyIGNoYW5uZWwuICovCisgICAgICAgICAgY2ggKz0gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIEZpbmFseSBjb21wb3NlIHRoZSBjaGFubmVsIG1vZGUgKi8KKyAgZm9yIChjaCA9IDA7IGNoIDwgKDQpOyBjaCArPSAxKSB7CisgICAgaW50IHBsYW5lLCBudW1DaEluR3JwID0gMDsKKyAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCAoMyk7IHBsYW5lICs9IDEpIHsKKyAgICAgIG51bUNoSW5HcnAgKz0gbnVtQ2hbcGxhbmVdW2NoXTsKKyAgICB9CisgICAgKmNoTW9kZSA9IChQQ01fRE1YX0NIQU5ORUxfTU9ERSkoKmNoTW9kZSB8IChudW1DaEluR3JwIDw8IChjaCAqIDQpKSk7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCisvKiogR2VuZXJhdGUgYSBjaGFubmVsIG9mZnNldCB0YWJsZSBhbmQgY29tcGxldGUgY2hhbm5lbCBkZXNjcmlwdGlvbiBmb3IgYSBnaXZlbgorICoocGFja2VkKSBjaGFubmVsIG1vZGUuIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGludmVyc2UgdG8gdGhlIGdldENoYW5uZWxNb2RlKCkKKyAqcm91dGluZSBidXQgZG9lcyBub3Qgc3VwcG9ydCB3ZWlyZCBjaGFubmVsIGNvbmZpZ3VyYXRpb25zLgorICogQHBhcmFtIFtpbl0gVGhlIHBhY2tlZCBjaGFubmVsIG1vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gdG8gYmUgcHJvY2Vzc2VkLgorICogQHBhcmFtIFtpbl0gQXJyYXkgY29udGFpbmluZyB0aGUgY2hhbm5lbCBtYXBwaW5nIHRvIGJlIHVzZWQgKEZyb20gTVBFRyBQQ0UKKyAqb3JkZXJpbmcgdG8gd2hhdGV2ZXIgaXMgcmVxdWlyZWQpLgorICogQHBhcmFtIFtvdXRdIEFycmF5IHdoZXJlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlcyBmb3IgZWFjaCBjaGFubmVscyBhcmUKKyAqc3RvcmVkIGludG8uCisgKiBAcGFyYW0gW291dF0gQXJyYXkgd2hlcmUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgaW5kaWNlcyBmb3IgZWFjaCBvdXRwdXQKKyAqY2hhbm5lbCBhcmUgc3RvcmVkIGludG8uCisgKiBAcGFyYW0gW291dF0gQXJyYXkgd2hlcmUgdGhlIGJ1ZmZlciBvZmZzZXRzIGZvciBlYWNoIGNoYW5uZWwgYXJlIHN0b3JlZCBpbnRvLgorICogQHJldHVybnMgTm9uZS4KKyAqKi8KK3N0YXRpYyB2b2lkIGdldENoYW5uZWxEZXNjcmlwdGlvbigKKyAgICBjb25zdCBQQ01fRE1YX0NIQU5ORUxfTU9ERSBjaE1vZGUsICAgICAgICAgLyogaW4gKi8KKyAgICBjb25zdCBGREtfY2hhbm5lbE1hcERlc2NyICpjb25zdCBtYXBEZXNjciwgLyogaW4gKi8KKyAgICBBVURJT19DSEFOTkVMX1RZUEUgY2hhbm5lbFR5cGVbXSwgICAgICAgICAgLyogb3V0ICovCisgICAgVUNIQVIgY2hhbm5lbEluZGljZXNbXSwgICAgICAgICAgICAgICAgICAgIC8qIG91dCAqLworICAgIFVDSEFSIG9mZnNldFRhYmxlWyg4KV0gICAgICAgICAgICAgICAgICAgICAvKiBvdXQgKi8KKykgeworICBpbnQgZ3JwSWR4LCBwbGFpbklkeCwgbnVtUGxhaW5zID0gMSwgbnVtVG90YWxDaGFubmVscyA9IDA7CisgIGludCBjaENmZywgY2ggPSAwOworCisgIEZES19BU1NFUlQoY2hhbm5lbFR5cGUgIT0gTlVMTCk7CisgIEZES19BU1NFUlQoY2hhbm5lbEluZGljZXMgIT0gTlVMTCk7CisgIEZES19BU1NFUlQobWFwRGVzY3IgIT0gTlVMTCk7CisgIEZES19BU1NFUlQob2Zmc2V0VGFibGUgIT0gTlVMTCk7CisKKyAgLyogSW5pdCBvdXRwdXQgYXJyYXlzICovCisgIEZES21lbWNsZWFyKGNoYW5uZWxUeXBlLCAoOCkgKiBzaXplb2YoQVVESU9fQ0hBTk5FTF9UWVBFKSk7CisgIEZES21lbWNsZWFyKGNoYW5uZWxJbmRpY2VzLCAoOCkgKiBzaXplb2YoVUNIQVIpKTsKKyAgRkRLbWVtc2V0KG9mZnNldFRhYmxlLCAyNTUsICg4KSAqIHNpemVvZihVQ0hBUikpOworCisgIC8qIFN1bW1lcml6ZSB0byBnZXQgdGhlIHRvdGFsIG51bWJlciBvZiBjaGFubmVscyAqLworICBmb3IgKGdycElkeCA9IDA7IGdycElkeCA8ICg0KTsgZ3JwSWR4ICs9IDEpIHsKKyAgICBudW1Ub3RhbENoYW5uZWxzICs9IChjaE1vZGUgPj4gKGdycElkeCAqIDQpKSAmIDB4RjsKKyAgfQorCisgIC8qIEdldCB0aGUgYXBwcm9wcmlhdGUgY2hhbm5lbCBtYXAgKi8KKyAgc3dpdGNoIChjaE1vZGUpIHsKKyAgICBjYXNlIENIX01PREVfMV8wXzBfMDoKKyAgICBjYXNlIENIX01PREVfMl8wXzBfMDoKKyAgICBjYXNlIENIX01PREVfM18wXzBfMDoKKyAgICBjYXNlIENIX01PREVfM18wXzFfMDoKKyAgICBjYXNlIENIX01PREVfM18wXzJfMDoKKyAgICBjYXNlIENIX01PREVfM18wXzJfMToKKyAgICAgIGNoQ2ZnID0gbnVtVG90YWxDaGFubmVsczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hfTU9ERV8zXzBfM18xOgorICAgICAgY2hDZmcgPSAxMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hfTU9ERV8zXzBfNF8xOgorICAgICAgY2hDZmcgPSAxMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hfTU9ERV81XzBfMl8xOgorICAgICAgY2hDZmcgPSA3OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIGZhbGxiYWNrICovCisgICAgICBjaENmZyA9IDA7CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIENvbXBvc2UgY2hhbm5lbCBvZmZzZXQgdGFibGUgKi8KKworICBmb3IgKHBsYWluSWR4ID0gMDsgcGxhaW5JZHggPCBudW1QbGFpbnM7IHBsYWluSWR4ICs9IDEpIHsKKyAgICBQQ01fRE1YX0NIQU5ORUxfTU9ERSBwbGFpbkNoTW9kZTsKKyAgICBVQ0hBUiBudW1DaEluR3JwWyg0KV07CisKKyAgICBwbGFpbkNoTW9kZSA9IGdldENoTW9kZTRQbGFpbihwbGFpbklkeCwgY2hNb2RlLCBjaENmZyk7CisKKyAgICAvKiBFeHRyYWN0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgcGVyIGdyb3VwICovCisgICAgbnVtQ2hJbkdycFtDSF9HUk9VUF9GUk9OVF0gPSBwbGFpbkNoTW9kZSAmIDB4RjsKKyAgICBudW1DaEluR3JwW0NIX0dST1VQX1NJREVdID0gKHBsYWluQ2hNb2RlID4+IDQpICYgMHhGOworICAgIG51bUNoSW5HcnBbQ0hfR1JPVVBfUkVBUl0gPSAocGxhaW5DaE1vZGUgPj4gOCkgJiAweEY7CisgICAgbnVtQ2hJbkdycFtDSF9HUk9VUF9MRkVdID0gKHBsYWluQ2hNb2RlID4+IDEyKSAmIDB4RjsKKworICAgIC8qIE5vbi1zeW1tZXRyaWMgY2hhbm5lbHMgKi8KKyAgICBpZiAoKG51bUNoSW5HcnBbQ0hfR1JPVVBfRlJPTlRdICYgMHgxKSAmJiAocGxhaW5JZHggPT0gQ0hfUExBSU5fTk9STUFMKSkgeworICAgICAgLyogT2RkIG51bWJlciBvZiBmcm9udCBjaGFubmVscyAtPiB3ZSBoYXZlIGEgY2VudGVyIGNoYW5uZWwuCisgICAgICAgICBJbiBNUEVHLTQgdGhlIGNlbnRlciBoYXMgdGhlIGluZGV4IDAuICovCisgICAgICBpbnQgbWFwcGVkSWR4ID0gRkRLX2NoTWFwRGVzY3JfZ2V0TWFwVmFsdWUobWFwRGVzY3IsIChVQ0hBUiljaCwgY2hDZmcpOworICAgICAgb2Zmc2V0VGFibGVbQ0VOVEVSX0ZST05UX0NIQU5ORUxdID0gKFVDSEFSKW1hcHBlZElkeDsKKyAgICAgIGNoYW5uZWxUeXBlW21hcHBlZElkeF0gPSBBQ1RfRlJPTlQ7CisgICAgICBjaGFubmVsSW5kaWNlc1ttYXBwZWRJZHhdID0gMDsKKyAgICAgIGNoICs9IDE7CisgICAgfQorCisgICAgZm9yIChncnBJZHggPSAwOyBncnBJZHggPCAoNCk7IGdycElkeCArPSAxKSB7CisgICAgICBBVURJT19DSEFOTkVMX1RZUEUgdHlwZSA9IEFDVF9OT05FOworICAgICAgaW50IGNoTWFwUG9zID0gMCwgbWF4Q2hhbm5lbHMgPSAwOworICAgICAgaW50IGNoSWR4ID0gMDsgLyogSW5kZXggb2YgY2hhbm5lbCB3aXRoaW4gdGhlIHNwZWNpZmljIGdyb3VwICovCisKKyAgICAgIHN3aXRjaCAoZ3JwSWR4KSB7CisgICAgICAgIGNhc2UgQ0hfR1JPVVBfRlJPTlQ6CisgICAgICAgICAgdHlwZSA9IChBVURJT19DSEFOTkVMX1RZUEUpKChwbGFpbklkeCA8PCA0KSB8IEFDVF9GUk9OVCk7CisgICAgICAgICAgc3dpdGNoIChwbGFpbklkeCkgeworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgY2hNYXBQb3MgPSBMRUZUX0ZST05UX0NIQU5ORUw7CisgICAgICAgICAgICAgIGNoSWR4ID0gbnVtQ2hJbkdycFtncnBJZHhdICYgMHgxOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgbWF4Q2hhbm5lbHMgPSAzOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENIX0dST1VQX1NJREU6CisgICAgICAgICAgLyogQWx3YXlzIG1hcCBzaWRlIGNoYW5uZWxzIHRvIHRoZSBtdWx0aXB1cnBvc2UgZ3JvdXAuICovCisgICAgICAgICAgdHlwZSA9IChBVURJT19DSEFOTkVMX1RZUEUpKChwbGFpbklkeCA8PCA0KSB8IEFDVF9TSURFKTsKKyAgICAgICAgICBpZiAocGxhaW5JZHggPT0gQ0hfUExBSU5fVE9QKSB7CisgICAgICAgICAgICBjaE1hcFBvcyA9IExFRlRfU0lERV9DSEFOTkVMX1RPUDsKKyAgICAgICAgICAgIG1heENoYW5uZWxzID0gMzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hNYXBQb3MgPSBMRUZUX01VTFRJUFJQU19DSEFOTkVMOworICAgICAgICAgICAgbWF4Q2hhbm5lbHMgPSAyOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDSF9HUk9VUF9SRUFSOgorICAgICAgICAgIHR5cGUgPSAoQVVESU9fQ0hBTk5FTF9UWVBFKSgocGxhaW5JZHggPDwgNCkgfCBBQ1RfQkFDSyk7CisgICAgICAgICAgaWYgKHBsYWluSWR4ID09IENIX1BMQUlOX1RPUCkgeworICAgICAgICAgICAgY2hNYXBQb3MgPSBMRUZUX1JFQVJfQ0hBTk5FTF9UT1A7CisgICAgICAgICAgICBtYXhDaGFubmVscyA9IDM7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoTWFwUG9zID0gTEVGVF9SRUFSX0NIQU5ORUw7CisgICAgICAgICAgICBtYXhDaGFubmVscyA9IDI7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENIX0dST1VQX0xGRToKKyAgICAgICAgICBpZiAocGxhaW5JZHggPT0gQ0hfUExBSU5fTk9STUFMKSB7CisgICAgICAgICAgICB0eXBlID0gQUNUX0xGRTsKKyAgICAgICAgICAgIGNoTWFwUG9zID0gTE9XX0ZSRVFVRU5DWV9DSEFOTkVMOworICAgICAgICAgICAgbWF4Q2hhbm5lbHMgPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLyogTWFwIGFsbCBjaGFubmVscyBpbiB0aGlzIGdyb3VwICovCisgICAgICBmb3IgKDsgY2hJZHggPCBudW1DaEluR3JwW2dycElkeF07IGNoSWR4ICs9IDEpIHsKKyAgICAgICAgaW50IG1hcHBlZElkeCA9IEZES19jaE1hcERlc2NyX2dldE1hcFZhbHVlKG1hcERlc2NyLCAoVUNIQVIpY2gsIGNoQ2ZnKTsKKyAgICAgICAgaWYgKChjaElkeCA9PSBtYXhDaGFubmVscykgfHwgKG9mZnNldFRhYmxlW2NoTWFwUG9zXSA8IDI1NSkpIHsKKyAgICAgICAgICAvKiBObyBzcGFjZSBsZWZ0IGluIHRoaXMgY2hhbm5lbCBncm91cCEgKi8KKyAgICAgICAgICBpZiAob2Zmc2V0VGFibGVbTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTF0gPT0KKyAgICAgICAgICAgICAgMjU1KSB7IC8qIFVzZSB0aGUgbXVsdGlwdXJwb3NlIGdyb3VwOiAqLworICAgICAgICAgICAgY2hNYXBQb3MgPSBMRUZUX01VTFRJUFJQU19DSEFOTkVMOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGREtfQVNTRVJUKDApOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvZmZzZXRUYWJsZVtjaE1hcFBvc10gPSAoVUNIQVIpbWFwcGVkSWR4OworICAgICAgICBjaGFubmVsVHlwZVttYXBwZWRJZHhdID0gdHlwZTsKKyAgICAgICAgY2hhbm5lbEluZGljZXNbbWFwcGVkSWR4XSA9IChVQ0hBUiljaElkeDsKKyAgICAgICAgY2hNYXBQb3MgKz0gMTsKKyAgICAgICAgY2ggKz0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoqIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIGZvciBkb3dubWl4IG1hdHJpeCBtYW5pcHVsYXRpb24gdGhhdCBpbml0aWFsaXplcworICogIG9uZSByb3cgaW4gYSBnaXZlbiBkb3dubWl4IG1hdHJpeCAoY29ycmVzcG9uZGluZyB0byBvbmUgb3V0cHV0IGNoYW5uZWwpLgorICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBmaXhlZC1wb2ludCBwYXJ0cyBvZiB0aGUgZG93bm1peCBtYXRyaXguCisgKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIHNjYWxlIGZhY3RvciBtYXRyaXggYXNzb2NpYXRlZCB0byB0aGUgZG93bm1peAorICpmYWN0b3JzLgorICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2YgY2hhbm5lbCAocm93KSB0byBiZSBpbml0aWFsaXplZC4KKyAqIEByZXR1cm5zICAgICAgIE5vdGhpbmcgdG8gcmV0dXJuLgorICoqLworc3RhdGljIHZvaWQgZG14SW5pdENoYW5uZWwoRklYUF9ETVggbWl4RmFjdG9yc1soOCldWyg4KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWl4U2NhbGVzWyg4KV1bKDgpXSwgY29uc3QgdW5zaWduZWQgaW50IG91dENoKSB7CisgIHVuc2lnbmVkIGludCBpbkNoOworICBmb3IgKGluQ2ggPSAwOyBpbkNoIDwgKDgpOyBpbkNoICs9IDEpIHsKKyAgICBpZiAoaW5DaCA9PSBvdXRDaCkgeworICAgICAgbWl4RmFjdG9yc1tvdXRDaF1baW5DaF0gPSBGTDJGWENPTlNUX0RNWCgwLjVmKTsKKyAgICAgIG1peFNjYWxlc1tvdXRDaF1baW5DaF0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICBtaXhGYWN0b3JzW291dENoXVtpbkNoXSA9IEZMMkZYQ09OU1RfRE1YKDAuMGYpOworICAgICAgbWl4U2NhbGVzW291dENoXVtpbkNoXSA9IDA7CisgICAgfQorICB9Cit9CisKKy8qKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiBmb3IgZG93bm1peCBtYXRyaXggbWFuaXB1bGF0aW9uIHRoYXQgZG9lcyBhIHJlc2V0CisgKiAgb2Ygb25lIHJvdyBpbiBhIGdpdmVuIGRvd25taXggbWF0cml4IChjb3JyZXNwb25kaW5nIHRvIG9uZSBvdXRwdXQgY2hhbm5lbCkuCisgKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIGZpeGVkLXBvaW50IHBhcnRzIG9mIHRoZSBkb3dubWl4IG1hdHJpeC4KKyAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gc2NhbGUgZmFjdG9yIG1hdHJpeCBhc3NvY2lhdGVkIHRvIHRoZSBkb3dubWl4CisgKmZhY3RvcnMuCisgKiBAcGFyYW0gW2luXSAgICBJbmRleCBvZiBjaGFubmVsIChyb3cpIHRvIGJlIGNsZWFyZWQvcmVzZXQuCisgKiBAcmV0dXJucyAgICAgICBOb3RoaW5nIHRvIHJldHVybi4KKyAqKi8KK3N0YXRpYyB2b2lkIGRteENsZWFyQ2hhbm5lbChGSVhQX0RNWCBtaXhGYWN0b3JzWyg4KV1bKDgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWl4U2NhbGVzWyg4KV1bKDgpXSwgY29uc3QgdW5zaWduZWQgaW50IG91dENoKSB7CisgIEZES19BU1NFUlQoKG91dENoID49IDApICYmIChvdXRDaCA8ICg4KSkpOworICBGREttZW1jbGVhcigmbWl4RmFjdG9yc1tvdXRDaF0sICg4KSAqIHNpemVvZihGSVhQX0RNWCkpOworICBGREttZW1jbGVhcigmbWl4U2NhbGVzW291dENoXSwgKDgpICogc2l6ZW9mKElOVCkpOworfQorCisvKiogUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gZm9yIGRvd25taXggbWF0cml4IG1hbmlwdWxhdGlvbiB0aGF0IGFwcGxpZXMgYQorICpzb3VyY2UgY2hhbm5lbCAocm93KSBzY2FsZWQgYnkgYSBnaXZlbiBtaXggZmFjdG9yIHRvIGEgZGVzdGluYXRpb24gY2hhbm5lbAorICoocm93KSBpbiBhIGdpdmVuIGRvd25taXggbWF0cml4LiBFeGlzdGluZyBtaXggZmFjdG9ycyBvZiB0aGUgZGVzdGluYXRpb24KKyAqY2hhbm5lbCAocm93KSB3aWxsIGdldCBvdmVyd3JpdHRlbi4KKyAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gZml4ZWQtcG9pbnQgcGFydHMgb2YgdGhlIGRvd25taXggbWF0cml4LgorICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBzY2FsZSBmYWN0b3IgbWF0cml4IGFzc29jaWF0ZWQgdG8gdGhlIGRvd25taXgKKyAqZmFjdG9ycy4KKyAqIEBwYXJhbSBbaW5dICAgIEluZGV4IG9mIHNvdXJjZSBjaGFubmVsIChyb3cpLgorICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2YgZGVzdGluYXRpb24gY2hhbm5lbCAocm93KS4KKyAqIEBwYXJhbSBbaW5dICAgIEZpeGVkLXBvaW50IHBhcnQgb2YgbWl4IGZhY3RvciB0byBiZSBhcHBsaWVkLgorICogQHBhcmFtIFtpbl0gICAgU2NhbGUgZmFjdG9yIG9mIG1peCBmYWN0b3IgdG8gYmUgYXBwbGllZC4KKyAqIEByZXR1cm5zICAgICAgIE5vdGhpbmcgdG8gcmV0dXJuLgorICoqLworc3RhdGljIHZvaWQgZG14U2V0Q2hhbm5lbChGSVhQX0RNWCBtaXhGYWN0b3JzWyg4KV1bKDgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG1peFNjYWxlc1soOCldWyg4KV0sIGNvbnN0IHVuc2lnbmVkIGludCBkc3RDaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IHNyY0NoLCBjb25zdCBGSVhQX0RNWCBmYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzY2FsZSkgeworICBpbnQgY2g7CisgIGZvciAoY2ggPSAwOyBjaCA8ICg4KTsgY2ggKz0gMSkgeworICAgIGlmIChtaXhGYWN0b3JzW3NyY0NoXVtjaF0gIT0gKEZJWFBfRE1YKTApIHsKKyAgICAgIG1peEZhY3RvcnNbZHN0Q2hdW2NoXSA9CisgICAgICAgICAgRlhfREJMMkZYX0RNWChmTXVsdChtaXhGYWN0b3JzW3NyY0NoXVtjaF0sIGZhY3RvcikpOworICAgICAgbWl4U2NhbGVzW2RzdENoXVtjaF0gPSBtaXhTY2FsZXNbc3JjQ2hdW2NoXSArIHNjYWxlOworICAgIH0KKyAgfQorfQorCisvKiogUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gZm9yIGRvd25taXggbWF0cml4IG1hbmlwdWxhdGlvbiB0aGF0IGFkZHMgYSBzb3VyY2UKKyAqY2hhbm5lbCAocm93KSBzY2FsZWQgYnkgYSBnaXZlbiBtaXggZmFjdG9yIHRvIGEgZGVzdGluYXRpb24gY2hhbm5lbCAocm93KSBpbiBhCisgKmdpdmVuIGRvd25taXggbWF0cml4LgorICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBmaXhlZC1wb2ludCBwYXJ0cyBvZiB0aGUgZG93bm1peCBtYXRyaXguCisgKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIHNjYWxlIGZhY3RvciBtYXRyaXggYXNzb2NpYXRlZCB0byB0aGUgZG93bm1peAorICpmYWN0b3JzLgorICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2Ygc291cmNlIGNoYW5uZWwgKHJvdykuCisgKiBAcGFyYW0gW2luXSAgICBJbmRleCBvZiBkZXN0aW5hdGlvbiBjaGFubmVsIChyb3cpLgorICogQHBhcmFtIFtpbl0gICAgRml4ZWQtcG9pbnQgcGFydCBvZiBtaXggZmFjdG9yIHRvIGJlIGFwcGxpZWQuCisgKiBAcGFyYW0gW2luXSAgICBTY2FsZSBmYWN0b3Igb2YgbWl4IGZhY3RvciB0byBiZSBhcHBsaWVkLgorICogQHJldHVybnMgICAgICAgTm90aGluZyB0byByZXR1cm4uCisgKiovCitzdGF0aWMgdm9pZCBkbXhBZGRDaGFubmVsKEZJWFBfRE1YIG1peEZhY3RvcnNbKDgpXVsoOCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWl4U2NhbGVzWyg4KV1bKDgpXSwgY29uc3QgdW5zaWduZWQgaW50IGRzdENoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgc3JjQ2gsIGNvbnN0IEZJWFBfRE1YIGZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNjYWxlKSB7CisgIGludCBjaDsKKyAgZm9yIChjaCA9IDA7IGNoIDwgKDgpOyBjaCArPSAxKSB7CisgICAgRklYUF9EQkwgYWRkRmFjdCA9IGZNdWx0KG1peEZhY3RvcnNbc3JjQ2hdW2NoXSwgZmFjdG9yKTsKKyAgICBpZiAoYWRkRmFjdCAhPSAoRklYUF9ETVgpMCkgeworICAgICAgSU5UIG5ld1NjYWxlID0gbWl4U2NhbGVzW3NyY0NoXVtjaF0gKyBzY2FsZTsKKyAgICAgIGlmIChtaXhGYWN0b3JzW2RzdENoXVtjaF0gIT0gKEZJWFBfRE1YKTApIHsKKyAgICAgICAgaWYgKG5ld1NjYWxlID4gbWl4U2NhbGVzW2RzdENoXVtjaF0pIHsKKyAgICAgICAgICBtaXhGYWN0b3JzW2RzdENoXVtjaF0gPj49IG5ld1NjYWxlIC0gbWl4U2NhbGVzW2RzdENoXVtjaF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYWRkRmFjdCA+Pj0gbWl4U2NhbGVzW2RzdENoXVtjaF0gLSBuZXdTY2FsZTsKKyAgICAgICAgICBuZXdTY2FsZSA9IG1peFNjYWxlc1tkc3RDaF1bY2hdOworICAgICAgICB9CisgICAgICB9CisgICAgICBtaXhGYWN0b3JzW2RzdENoXVtjaF0gKz0gRlhfREJMMkZYX0RNWChhZGRGYWN0KTsKKyAgICAgIG1peFNjYWxlc1tkc3RDaF1bY2hdID0gbmV3U2NhbGU7CisgICAgfQorICB9Cit9CisKKy8qKiBQcml2YXRlIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIGRvd25taXggZmFjdG9yIG1hdHJpeCBkZXBlbmRpbmcgb24gdGhlIGlucHV0CisgYW5kIG91dHB1dAorICogIGNvbmZpZ3VyYXRpb24sIHRoZSB1c2VyIHBhcmFtZXRlcnMgYXMgd2VsbCBhcyB0aGUgZ2l2ZW4gbWV0YWRhdGEuIFRoaXMKKyBmdW5jdGlvbiBpcyB0aGUgbW9kdWxlcworICogIGJyYWluIGFuZCBob2xkIGFsbCBkb3dubWl4IGFsZ29yaXRobXMuCisgKiBAcGFyYW0gW2luXSAgRmxhZyB0aGF0IGluZGljYXRlcyBpZiBpbkNoTW9kZSBob2xkcyBhIHJlYWwgKHBhY2tlZCkgY2hhbm5lbAorIG1vZGUgb3IgaGFzIGJlZW4gY29udmVydGVkIHRvIGEgTVBFRy00IGNoYW5uZWwgY29uZmlndXJhdGlvbiBpbmRleC4KKyAqIEBwYXJhbSBbaW5dICBEZXBlbmRlbnQgb24gdGhlIGluTW9kZUlzQ2ZnIGZsYWcgdGhpcyBmaWVsZCBoYW5kcyBpbiBhIChwYWNrZWQpCisgY2hhbm5lbCBtb2RlIG9yIHRoZSBjb3JyZXNwb25kaW5nIE1QRUctNCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gaW5kZXgub2YgdGhlCisgaW5wdXQgY29uZmlndXJhdGlvbi4KKyAqIEBwYXJhbSBbaW5dICBUaGUgKHBhY2tlZCkgY2hhbm5lbCBtb2RlIG9mIHRoZSBvdXRwdXQgY29uZmlndXJhdGlvbi4KKyAqIEBwYXJhbSBbaW5dICBQb2ludGVyIHRvIHN0cnVjdHVyZSBob2xkaW5nIGFsbCBjdXJyZW50IHVzZXIgcGFyYW1ldGVyLgorICogQHBhcmFtIFtpbl0gIFBvaW50ZXIgdG8gZmllbGQgaG9sZGluZyBhbGwgY3VycmVudCBtZXRhIGRhdGEuCisgKiBAcGFyYW0gW291dF0gUG9pbnRlciB0byBmaXhlZC1wb2ludCBwYXJ0cyBvZiB0aGUgZG93bm1peCBtYXRyaXguIE5vcm1hbGl6ZWQKKyB0byBvbmUgc2NhbGUgZmFjdG9yLgorICogQHBhcmFtIFtvdXRdIFRoZSBjb21tb24gc2NhbGUgZmFjdG9yIG9mIHRoZSBkb3dubWl4IG1hdHJpeC4KKyAqIEByZXR1cm5zICAgICBBbiBlcnJvciBjb2RlLgorICoqLworc3RhdGljIFBDTURNWF9FUlJPUiBnZXRNaXhGYWN0b3JzKGNvbnN0IFVDSEFSIGluTW9kZUlzQ2ZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTV9ETVhfQ0hBTk5FTF9NT0RFIGluQ2hNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBDTV9ETVhfQ0hBTk5FTF9NT0RFIG91dENoTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQQ01fRE1YX1VTRVJfUEFSQU1TICpwUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERNWF9CU19NRVRBX0RBVEEgKnBNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RNWCBtaXhGYWN0b3JzWyg4KV1bKDgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnBPdXRTY2FsZSkgeworICBQQ01ETVhfRVJST1IgZXJyID0gUENNRE1YX09LOworICBJTlQgbWl4U2NhbGVzWyg4KV1bKDgpXTsKKyAgSU5UIG1heFNjYWxlID0gMDsKKyAgaW50IG51bUluQ2hhbm5lbDsKKyAgaW50IG51bU91dENoYW5uZWw7CisgIGludCBkbXhNZXRob2Q7CisgIHVuc2lnbmVkIGludCBvdXRDaCwgaW5DaENmZyA9IDA7CisgIHVuc2lnbmVkIGludCB2YWxpZFsoOCldID0gezB9OworCisgIEZES19BU1NFUlQocE1ldGFEYXRhICE9IE5VTEwpOworICBGREtfQVNTRVJUKG1peEZhY3RvcnMgIT0gTlVMTCk7CisgIC8qIENoZWNrIG9uIGEgc3VwcG9ydGVkIG91dHB1dCBjb25maWd1cmF0aW9uLgorICAgICBBZGQgbmV3IG9uZSBvbmx5IGFmdGVyIGV4dGVuc2l2ZSB0ZXN0aW5nISAqLworICBpZiAoISgob3V0Q2hNb2RlID09IENIX01PREVfMV8wXzBfMCkgfHwgKG91dENoTW9kZSA9PSBDSF9NT0RFXzJfMF8wXzApIHx8CisgICAgICAgIChvdXRDaE1vZGUgPT0gQ0hfTU9ERV8zXzBfMl8xKSB8fCAob3V0Q2hNb2RlID09IENIX01PREVfM18wXzRfMSkgfHwKKyAgICAgICAgKG91dENoTW9kZSA9PSBDSF9NT0RFXzVfMF8yXzEpKSkgeworICAgIEZES19BU1NFUlQoMCk7CisgIH0KKworICBpZiAoaW5Nb2RlSXNDZmcpIHsKKyAgICAvKiBDb252ZXJ0IGNoYW5uZWwgY29uZmlnIHRvIGNoYW5uZWwgbW9kZTogKi8KKyAgICBpbkNoQ2ZnID0gKHVuc2lnbmVkIGludClpbkNoTW9kZTsKKyAgICBzd2l0Y2ggKGluQ2hDZmcpIHsKKyAgICAgIGNhc2UgMToKKyAgICAgIGNhc2UgMjoKKyAgICAgIGNhc2UgMzoKKyAgICAgIGNhc2UgNDoKKyAgICAgIGNhc2UgNToKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgaW5DaE1vZGUgPSBvdXRDaE1vZGVUYWJsZVtpbkNoQ2ZnXTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDExOgorICAgICAgICBpbkNoTW9kZSA9IENIX01PREVfM18wXzNfMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEyOgorICAgICAgICBpbkNoTW9kZSA9IENIX01PREVfM18wXzRfMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDc6CisgICAgICBjYXNlIDE0OgorICAgICAgICBpbkNoTW9kZSA9IENIX01PREVfNV8wXzJfMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBGREtfQVNTRVJUKDApOworICAgIH0KKyAgfQorCisgIC8qIEV4dHJhY3QgdGhlIHRvdGFsIG51bWJlciBvZiBpbnB1dCBjaGFubmVscyAqLworICBudW1JbkNoYW5uZWwgPSAoaW5DaE1vZGUgJiAweEYpICsgKChpbkNoTW9kZSA+PiA0KSAmIDB4RikgKworICAgICAgICAgICAgICAgICAoKGluQ2hNb2RlID4+IDgpICYgMHhGKSArICgoaW5DaE1vZGUgPj4gMTIpICYgMHhGKTsKKyAgLyogRXh0cmFjdCB0aGUgdG90YWwgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAqLworICBudW1PdXRDaGFubmVsID0gKG91dENoTW9kZSAmIDB4RikgKyAoKG91dENoTW9kZSA+PiA0KSAmIDB4RikgKworICAgICAgICAgICAgICAgICAgKChvdXRDaE1vZGUgPj4gOCkgJiAweEYpICsgKChvdXRDaE1vZGUgPj4gMTIpICYgMHhGKTsKKworICAvKiBNUEVHIGFtbWVuZG1lbnQgNCBha2EgRVRTSSBtZXRhZGF0YSBhbmQgZmFsbGJhY2sgbW9kZTogKi8KKworICAvKiBDcmVhdGUgaWRlbnRpdHkgRE1YIG1hdHJpeDogKi8KKyAgZm9yIChvdXRDaCA9IDA7IG91dENoIDwgKDgpOyBvdXRDaCArPSAxKSB7CisgICAgZG14SW5pdENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBvdXRDaCk7CisgIH0KKyAgaWYgKCgoaW5DaE1vZGUgPj4gMTIpICYgMHhGKSA9PSAwKSB7CisgICAgLyogQ2xlYXIgZW1wdHkgb3Igd3JvbmdseSBtYXBwZWQgaW5wdXQgY2hhbm5lbCAqLworICAgIGRteENsZWFyQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCk7CisgIH0KKworICAvKiBGSVJTVCBTVEFHRTogKi8KKyAgaWYgKG51bUluQ2hhbm5lbCA+IFNJWF9DSEFOTkVMKSB7IC8qIEFsd2F5cyB1c2UgTVBFRyBlcXVhdGlvbnMgZWl0aGVyIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEgZGF0YSBvciB3aXRoIGRlZmF1bHQgdmFsdWVzLiAqLworICAgIEZJWFBfRE1YIGRNaXhGYWN0QSwgZE1peEZhY3RCOworICAgIElOVCBkTWl4U2NhbGVBLCBkTWl4U2NhbGVCOworICAgIGludCBpc1ZhbGlkQ2ZnID0gVFJVRTsKKworICAgIC8qIEdldCBmYWN0b3JzIGZyb20gbWV0YSBkYXRhICovCisgICAgZE1peEZhY3RBID0gYWJNaXhMdmxWYWx1ZVRhYltwTWV0YURhdGEtPmRtaXhJZHhBXTsKKyAgICBkTWl4U2NhbGVBID0gKHBNZXRhRGF0YS0+ZG1peElkeEEgPT0gMCkgPyAxIDogMDsKKyAgICBkTWl4RmFjdEIgPSBhYk1peEx2bFZhbHVlVGFiW3BNZXRhRGF0YS0+ZG1peElkeEJdOworICAgIGRNaXhTY2FsZUIgPSAocE1ldGFEYXRhLT5kbWl4SWR4QiA9PSAwKSA/IDEgOiAwOworCisgICAgLyogQ2hlY2sgaWYgaW5wdXQgaXMgaW4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb25zICovCisgICAgc3dpdGNoIChpbkNoTW9kZSkgeworICAgICAgY2FzZSBDSF9NT0RFXzNfMl8xXzE6IC8qIGNoQ2ZnIDExIGJ1dCB3aXRoIHNpZGUgY2hhbm5lbHMgKi8KKyAgICAgIGNhc2UgQ0hfTU9ERV8zXzJfMV8wOgorICAgICAgICBpc1ZhbGlkQ2ZnID0gRkFMU0U7CisgICAgICAgIGVyciA9IFBDTURNWF9JTlZBTElEX01PREU7CisgICAgICBjYXNlIENIX01PREVfM18wXzNfMTogLyogY2hDZmcgMTEgKi8KKyAgICAgICAgLyogNi4xY2g6ICBDJyA9IEM7ICBMJyA9IEw7ICBSJyA9IFI7ICBMRkUnID0gTEZFOworICAgICAgICAgICAgICAgICAgIExzJyA9IExzKmRtaXhfYV9pZHggKyBDcypkbWl4X2JfaWR4OworICAgICAgICAgICAgICAgICAgIFJzJyA9IFJzKmRtaXhfYV9pZHggKyBDcypkbWl4X2JfaWR4OyAqLworICAgICAgICBkbXhDbGVhckNoYW5uZWwoCisgICAgICAgICAgICBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsCisgICAgICAgICAgICBSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTCk7IC8qIGNsZWFyIGVtcHR5IGlucHV0IGNoYW5uZWwgKi8KKyAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgIExFRlRfUkVBUl9DSEFOTkVMLCBkTWl4RmFjdEEsIGRNaXhTY2FsZUEpOworICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9SRUFSX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCwgZE1peEZhY3RCLCBkTWl4U2NhbGVCKTsKKyAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICBSSUdIVF9SRUFSX0NIQU5ORUwsIGRNaXhGYWN0QSwgZE1peFNjYWxlQSk7CisgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCwgZE1peEZhY3RCLCBkTWl4U2NhbGVCKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENIX01PREVfM18wXzRfMTogLyogY2hDZmcgMTIgKi8KKyAgICAgICAgLyogNy4xY2ggU3Vycm91bmQgQmFjazogIEMnID0gQzsgIEwnID0gTDsgIFInID0gUjsgIExGRScgPSBMRkU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMcycgPSBMcypkbWl4X2FfaWR4ICsgTHNyKmRtaXhfYl9pZHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBScycgPSBScypkbWl4X2FfaWR4ICsgUnNyKmRtaXhfYl9pZHg7ICovCisgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICBMRUZUX1JFQVJfQ0hBTk5FTCwgZE1peEZhY3RBLCBkTWl4U2NhbGVBKTsKKyAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QiwgZE1peFNjYWxlQik7CisgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgUklHSFRfUkVBUl9DSEFOTkVMLCBkTWl4RmFjdEEsIGRNaXhTY2FsZUEpOworICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMLCBkTWl4RmFjdEIsIGRNaXhTY2FsZUIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0hfTU9ERV81XzBfMV8wOgorICAgICAgY2FzZSBDSF9NT0RFXzVfMF8xXzE6CisgICAgICAgIGRteENsZWFyQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBSSUdIVF9SRUFSX0NIQU5ORUwpOyAvKiBjbGVhciBlbXB0eSBpbnB1dCBjaGFubmVsICovCisgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgTEVGVF9SRUFSX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAxKTsKKyAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgIExFRlRfUkVBUl9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjVmKSwgMSk7CisgICAgICBjYXNlIENIX01PREVfNV8yXzFfMDoKKyAgICAgICAgaXNWYWxpZENmZyA9IEZBTFNFOworICAgICAgICBlcnIgPSBQQ01ETVhfSU5WQUxJRF9NT0RFOworICAgICAgY2FzZSBDSF9NT0RFXzVfMF8yXzE6IC8qIGNoQ2ZnIDcgfHwgMTQgKi8KKyAgICAgICAgaWYgKGluQ2hDZmcgPT0gMTQpIHsKKyAgICAgICAgICAvKiA3LjFjaCBGcm9udCBIZWlnaHQ6ICBDJyA9IEM7ICBMcycgPSBMczsgIFJzJyA9IFJzOyAgTEZFJyA9IExGRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMJyA9IEwqZG1peF9hX2lkeCArIEx2KmRtaXhfYl9pZHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUicgPSBSKmRtaXhfYV9pZHggKyBSdipkbWl4X2JfaWR4OyAqLworICAgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICBMRUZUX0ZST05UX0NIQU5ORUwsIGRNaXhGYWN0QSwgZE1peFNjYWxlQSk7CisgICAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QiwgZE1peFNjYWxlQik7CisgICAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICBSSUdIVF9GUk9OVF9DSEFOTkVMLCBkTWl4RmFjdEEsIGRNaXhTY2FsZUEpOworICAgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QiwgZE1peFNjYWxlQik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogNy4xY2ggRnJvbnQ6ICBMcycgPSBMczsgIFJzJyA9IFJzOyAgTEZFJyA9IExGRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEMnID0gQyArIChMYytSYykqZG1peF9hX2lkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEwnID0gTCArIExjKmRtaXhfYl9pZHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBSJyA9IFIgKyBSYypkbWl4X2JfaWR4OyAqLworICAgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QSwgZE1peFNjYWxlQSk7CisgICAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIENFTlRFUl9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QSwgZE1peFNjYWxlQSk7CisgICAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QiwgZE1peFNjYWxlQik7CisgICAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFRlRfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC41ZiksIDEpOworICAgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QiwgZE1peFNjYWxlQik7CisgICAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICBSSUdIVF9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjVmKSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBOb3RoaW5nIHRvIGRvLiBKdXN0IHVzZSB0aGUgaWRlbnRpdHkgbWF0cml4LiAqLworICAgICAgICBpc1ZhbGlkQ2ZnID0gRkFMU0U7CisgICAgICAgIGVyciA9IFBDTURNWF9JTlZBTElEX01PREU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIEFkZCBhZGRpdGlvbmFsIERNWCBnYWluICovCisgICAgaWYgKChpc1ZhbGlkQ2ZnID09IFRSVUUpICYmCisgICAgICAgIChwTWV0YURhdGEtPmRteEdhaW5JZHg1ICE9IDApKSB7IC8qIEFwcGx5IERNWCBnYWluIDUgKi8KKyAgICAgIEZJWFBfRE1YIGRteEdhaW47CisgICAgICBJTlQgZG14U2NhbGU7CisgICAgICBJTlQgc2lnbiA9IChwTWV0YURhdGEtPmRteEdhaW5JZHg1ICYgMHg0MCkgPyAtMSA6IDE7CisgICAgICBJTlQgdmFsID0gcE1ldGFEYXRhLT5kbXhHYWluSWR4NSAmIDB4M0Y7CisKKyAgICAgIC8qIDEwXihkbXhfZ2Fpbl81LzgwKSAqLworICAgICAgZG14R2FpbiA9IEZYX0RCTDJGWF9ETVgoCisgICAgICAgICAgZkxkUG93KEZMMkZYQ09OU1RfREJMKDAuODMwNDgyMDIzNzIxODQxZiksIDIsIC8qIGxvZzIoMTApICovCisgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoc2lnbiAqIHZhbCAqIChMT05HKUZMMkZYQ09OU1RfREJMKDAuMDEyNWYpKSwgMCwKKyAgICAgICAgICAgICAgICAgJmRteFNjYWxlKSk7CisgICAgICAvKiBDdXJyZW50bHkgb25seSBwb3NpdGl2ZSBzY2FsZSBmYWN0b3JzIHN1cHBvcnRlZCEgKi8KKyAgICAgIGlmIChkbXhTY2FsZSA8IDApIHsKKyAgICAgICAgZG14R2FpbiA+Pj0gLWRteFNjYWxlOworICAgICAgICBkbXhTY2FsZSA9IDA7CisgICAgICB9CisKKyAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIGRteEdhaW4sIGRteFNjYWxlKTsKKyAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgIExFRlRfRlJPTlRfQ0hBTk5FTCwgZG14R2FpbiwgZG14U2NhbGUpOworICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgIFJJR0hUX0ZST05UX0NIQU5ORUwsIGRteEdhaW4sIGRteFNjYWxlKTsKKyAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgTEVGVF9SRUFSX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgIGRteEdhaW4sIGRteFNjYWxlKTsKKyAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgIFJJR0hUX1JFQVJfQ0hBTk5FTCwgZG14R2FpbiwgZG14U2NhbGUpOworICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMLCBkbXhHYWluLCBkbXhTY2FsZSk7CisgICAgfQorCisgICAgLyogTWFyayB0aGUgb3V0cHV0IGNoYW5uZWxzICovCisgICAgdmFsaWRbQ0VOVEVSX0ZST05UX0NIQU5ORUxdID0gMTsKKyAgICB2YWxpZFtMRUZUX0ZST05UX0NIQU5ORUxdID0gMTsKKyAgICB2YWxpZFtSSUdIVF9GUk9OVF9DSEFOTkVMXSA9IDE7CisgICAgdmFsaWRbTEVGVF9SRUFSX0NIQU5ORUxdID0gMTsKKyAgICB2YWxpZFtSSUdIVF9SRUFSX0NIQU5ORUxdID0gMTsKKyAgICB2YWxpZFtMT1dfRlJFUVVFTkNZX0NIQU5ORUxdID0gMTsKKworICAgIC8qIFVwZGF0ZSBjaGFubmVsIG1vZGUgZm9yIHRoZSBuZXh0IHN0YWdlICovCisgICAgaW5DaE1vZGUgPSBDSF9NT0RFXzNfMF8yXzE7CisgIH0KKworICAgIC8qIEZvciB0aGUgWCAoPiA2KSB0byA2IGNoYW5uZWwgZG93bm1peCB3ZSBoYWQgbm8gY2hvaWNlLgorICAgICAgIFRvIG1peCBmcm9tIDYgdG8gMiAob3IgMSkgY2hhbm5lbChzKSB3ZSBoYXZlIHNldmVyYWwgcG9zc2liaWxpdGllcyAoTVBFRworICAgICAgIERTRSB8IE1QRUcgUENFIHwgSVRVIHwgQVJJQiB8IERMQikuIFVzZSBwcm9maWxlIGFuZCB0aGUgbWV0YWRhdGEKKyAgICAgICBhdmFpbGFibGUgZmxhZ3MgdG8gZGV0ZXJtaW5lIHdoaWNoIGVxdWF0aW9uIHRvIHVzZTogKi8KKworI2RlZmluZSBETVhfTUVUSE9EX01QRUdfQU1ENCAxCisjZGVmaW5lIERNWF9NRVRIT0RfTVBFR19MRUdBQ1kgMgorI2RlZmluZSBETVhfTUVUSE9EX0FSSUJfSkFQQU4gNAorI2RlZmluZSBETVhfTUVUSE9EX0lUVV9SRUNPTSA4CisjZGVmaW5lIERNWF9NRVRIT0RfQ1VTVE9NIDE2CisKKyAgZG14TWV0aG9kID0gRE1YX01FVEhPRF9NUEVHX0FNRDQ7IC8qIGRlZmF1bHQgKi8KKworICBpZiAoKHBQYXJhbXMtPmRteFByb2ZpbGUgPT0gRE1YX1BSRkxfRk9SQ0VfTUFUUklYX01JWCkgJiYKKyAgICAgIChwTWV0YURhdGEtPnR5cGVGbGFncyAmIFRZUEVfUENFX0RBVEEpKSB7CisgICAgZG14TWV0aG9kID0gRE1YX01FVEhPRF9NUEVHX0xFR0FDWTsKKyAgfSBlbHNlIGlmICghKHBNZXRhRGF0YS0+dHlwZUZsYWdzICYKKyAgICAgICAgICAgICAgIChUWVBFX0RTRV9DTEVWX0RBVEEgfCBUWVBFX0RTRV9TTEVWX0RBVEEpKSkgeworICAgIHN3aXRjaCAocFBhcmFtcy0+ZG14UHJvZmlsZSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgIGNhc2UgRE1YX1BSRkxfU1RBTkRBUkQ6CisgICAgICAgIC8qIGRteE1ldGhvZCA9IERNWF9NRVRIT0RfTVBFR19BTUQ0OyAqLworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRE1YX1BSRkxfTUFUUklYX01JWDoKKyAgICAgIGNhc2UgRE1YX1BSRkxfRk9SQ0VfTUFUUklYX01JWDoKKyAgICAgICAgaWYgKHBNZXRhRGF0YS0+dHlwZUZsYWdzICYgVFlQRV9QQ0VfREFUQSkgeworICAgICAgICAgIGRteE1ldGhvZCA9IERNWF9NRVRIT0RfTVBFR19MRUdBQ1k7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERNWF9QUkZMX0FSSUJfSkFQQU46CisgICAgICAgIGRteE1ldGhvZCA9IERNWF9NRVRIT0RfQVJJQl9KQVBBTjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyogU0VDT05EIFNUQUdFOiAqLworICBpZiAobnVtT3V0Q2hhbm5lbCA8PSBUV09fQ0hBTk5FTCkgeworICAgIC8qIENyZWF0ZSBETVggbWF0cml4IGFjY29yZGluZyB0byBpbnB1dCBjb25maWd1cmF0aW9uICovCisgICAgc3dpdGNoIChpbkNoTW9kZSkgeworICAgICAgY2FzZSBDSF9NT0RFXzJfMF8wXzA6IC8qIGNoQ2ZnIDIgKi8KKyAgICAgICAgLyogQXBwbHkgdGhlIGR1YWwgY2hhbm5lbCBtb2RlLiAqLworICAgICAgICBzd2l0Y2ggKHBQYXJhbXMtPmR1YWxDaGFubmVsTW9kZSkgeworICAgICAgICAgIGNhc2UgQ0gxX01PREU6IC8qIEwnID0gMC43MDcgKiBDaDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUicgPSAwLjcwNyAqIENoMTsgKi8KKyAgICAgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExFRlRfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCk7CisgICAgICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTEVGVF9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQ0gyX01PREU6IC8qIEwnID0gMC43MDcgKiBDaDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUicgPSAwLjcwNyAqIENoMjsgKi8KKyAgICAgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJJR0hUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDApOworICAgICAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJJR0hUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBNSVhFRF9NT0RFOiAvKiBMJyA9IDAuNSpDaDEgKyAwLjUqQ2gyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUicgPSAwLjUqQ2gxICsgMC41KkNoMjsgKi8KKyAgICAgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExFRlRfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC41ZiksIDApOworICAgICAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUklHSFRfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC41ZiksIDApOworICAgICAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExFRlRfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC41ZiksIDApOworICAgICAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJJR0hUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgY2FzZSBTVEVSRU9fTU9ERToKKyAgICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKyAgICAgICAqIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKyAgICAgIGNhc2UgQ0hfTU9ERV8yXzBfMV8wOiB7CisgICAgICAgIEZJWFBfRE1YIHNNaXhMdmw7CisgICAgICAgIGlmIChkbXhNZXRob2QgPT0gRE1YX01FVEhPRF9BUklCX0pBUEFOKSB7CisgICAgICAgICAgLyogTCcgPSAwLjcwNypMICsgMC41KlM7ICBSJyA9IDAuNzA3KlIgKyAwLjUqUzsgKi8KKyAgICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVGVF9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwKTsKKyAgICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJJR0hUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDApOworICAgICAgICAgIHNNaXhMdmwgPSBGTDJGWENPTlNUX0RNWCgwLjVmKTsKKyAgICAgICAgfSBlbHNlIHsgLyogTCcgPSBMICsgMC43MDcqUzsgIFInID0gUiArIDAuNzA3KlM7ICovCisgICAgICAgICAgc01peEx2bCA9IEZMMkZYQ09OU1RfRE1YKDAuNzA3Zik7CisgICAgICAgIH0KKyAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICBMRUZUX1JFQVJfQ0hBTk5FTCwgc01peEx2bCwgMCk7CisgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgIExFRlRfUkVBUl9DSEFOTkVMLCBzTWl4THZsLCAwKTsKKyAgICAgIH0gYnJlYWs7CisgICAgICAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorICAgICAgICogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworICAgICAgY2FzZSBDSF9NT0RFXzNfMF8wXzA6IC8qIGNoQ2ZnIDMgKi8KKyAgICAgIHsKKyAgICAgICAgRklYUF9ETVggY01peEx2bDsKKyAgICAgICAgaWYgKGRteE1ldGhvZCA9PSBETVhfTUVUSE9EX0FSSUJfSkFQQU4pIHsKKyAgICAgICAgICAvKiBMJyA9IDAuNzA3KkwgKyAwLjUqQzsgIFInID0gMC43MDcqUiArIDAuNSpDOyAqLworICAgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICBMRUZUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDApOworICAgICAgICAgIGRteFNldENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgUklHSFRfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCk7CisgICAgICAgICAgY01peEx2bCA9IEZMMkZYQ09OU1RfRE1YKDAuNWYpOworICAgICAgICB9IGVsc2UgeyAvKiBMJyA9IEwgKyAwLjcwNypDOyAgUicgPSBSICsgMC43MDcqQzsgKi8KKyAgICAgICAgICBjTWl4THZsID0gRkwyRlhDT05TVF9ETVgoMC43MDdmKTsKKyAgICAgICAgfQorICAgICAgICBkbXhBZGRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBjTWl4THZsLCAwKTsKKyAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIGNNaXhMdmwsIDApOworICAgICAgfSBicmVhazsKKyAgICAgIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisgICAgICAgKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisgICAgICBjYXNlIENIX01PREVfM18wXzFfMDogLyogY2hDZmcgNCAqLworICAgICAgeworICAgICAgICBGSVhQX0RNWCBjc01peEx2bDsKKyAgICAgICAgaWYgKGRteE1ldGhvZCA9PSBETVhfTUVUSE9EX0FSSUJfSkFQQU4pIHsKKyAgICAgICAgICAvKiBMJyA9IDAuNzA3KkwgKyAwLjUqQyArIDAuNSpTOyAgUicgPSAwLjcwNypSICsgMC41KkMgKyAwLjUqUzsgKi8KKyAgICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVGVF9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwKTsKKyAgICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJJR0hUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDApOworICAgICAgICAgIGNzTWl4THZsID0gRkwyRlhDT05TVF9ETVgoMC41Zik7CisgICAgICAgIH0gZWxzZSB7IC8qIEwnID0gTCArIDAuNzA3KkMgKyAwLjcwNypTOworICAgICAgICAgICAgICAgICAgICBSJyA9IFIgKyAwLjcwNypDICsgMC43MDcqUzsgKi8KKyAgICAgICAgICBjc01peEx2bCA9IEZMMkZYQ09OU1RfRE1YKDAuNzA3Zik7CisgICAgICAgIH0KKyAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgY3NNaXhMdmwsIDApOworICAgICAgICBkbXhBZGRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgIExFRlRfUkVBUl9DSEFOTkVMLCBjc01peEx2bCwgMCk7CisgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBjc01peEx2bCwgMCk7CisgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgIExFRlRfUkVBUl9DSEFOTkVMLCBjc01peEx2bCwgMCk7CisgICAgICB9IGJyZWFrOworICAgICAgLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKyAgICAgICAqIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKyAgICAgIGNhc2UgQ0hfTU9ERV8zXzBfMl8wOiAvKiBjaENmZyA1ICovCisgICAgICBjYXNlIENIX01PREVfM18wXzJfMTogLyogY2hDZmcgNiAqLworICAgICAgeworICAgICAgICBzd2l0Y2ggKGRteE1ldGhvZCkgeworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgY2FzZSBETVhfTUVUSE9EX01QRUdfQU1ENDogeworICAgICAgICAgICAgRklYUF9ETVggY01peEx2bCwgc01peEx2bCwgbE1peEx2bDsKKyAgICAgICAgICAgIElOVCBjTWl4U2NhbGUsIHNNaXhTY2FsZSwgbE1peFNjYWxlOworCisgICAgICAgICAgICAvKiBHZXQgZmFjdG9ycyBmcm9tIG1ldGEgZGF0YSAqLworICAgICAgICAgICAgY01peEx2bCA9IGFiTWl4THZsVmFsdWVUYWJbcE1ldGFEYXRhLT5jTGV2SWR4XTsKKyAgICAgICAgICAgIGNNaXhTY2FsZSA9IChwTWV0YURhdGEtPmNMZXZJZHggPT0gMCkgPyAxIDogMDsKKyAgICAgICAgICAgIHNNaXhMdmwgPSBhYk1peEx2bFZhbHVlVGFiW3BNZXRhRGF0YS0+c0xldklkeF07CisgICAgICAgICAgICBzTWl4U2NhbGUgPSAocE1ldGFEYXRhLT5zTGV2SWR4ID09IDApID8gMSA6IDA7CisgICAgICAgICAgICBsTWl4THZsID0gbGZlTWl4THZsVmFsdWVUYWJbcE1ldGFEYXRhLT5kbWl4SWR4TGZlXTsKKyAgICAgICAgICAgIGlmIChwTWV0YURhdGEtPmRtaXhJZHhMZmUgPD0gMSkgeworICAgICAgICAgICAgICBsTWl4U2NhbGUgPSAyOworICAgICAgICAgICAgfSBlbHNlIGlmIChwTWV0YURhdGEtPmRtaXhJZHhMZmUgPD0gNSkgeworICAgICAgICAgICAgICBsTWl4U2NhbGUgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgbE1peFNjYWxlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFNldHVwIHRoZSBETVggbWF0cml4ICovCisgICAgICAgICAgICBpZiAoKHBQYXJhbXMtPnBzZXVkb1N1cnJNb2RlID09IEZPUkNFX1BTX0RNWCkgfHwKKyAgICAgICAgICAgICAgICAoKHBQYXJhbXMtPnBzZXVkb1N1cnJNb2RlID09IEFVVE9fUFNfRE1YKSAmJgorICAgICAgICAgICAgICAgICAocE1ldGFEYXRhLT5wc2V1ZG9TdXJyb3VuZCA9PQorICAgICAgICAgICAgICAgICAgMSkpKSB7IC8qIEwnID0gTCArIEMqY2xldiAtIChMcytScykqc2xldiArIExGRSpsZmxldjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSJyA9IFIgKyBDKmNsZXYgKyAoTHMrUnMpKnNsZXYgKyBMRkUqbGZsZXY7ICovCisgICAgICAgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIGNNaXhMdmwsIGNNaXhTY2FsZSk7CisgICAgICAgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEVGVF9SRUFSX0NIQU5ORUwsIC1zTWl4THZsLCBzTWl4U2NhbGUpOworICAgICAgICAgICAgICBkbXhBZGRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJJR0hUX1JFQVJfQ0hBTk5FTCwgLXNNaXhMdmwsIHNNaXhTY2FsZSk7CisgICAgICAgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMLCBsTWl4THZsLCBsTWl4U2NhbGUpOworICAgICAgICAgICAgICBkbXhBZGRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgY01peEx2bCwgY01peFNjYWxlKTsKKyAgICAgICAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEVGVF9SRUFSX0NIQU5ORUwsIHNNaXhMdmwsIHNNaXhTY2FsZSk7CisgICAgICAgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJJR0hUX1JFQVJfQ0hBTk5FTCwgc01peEx2bCwgc01peFNjYWxlKTsKKyAgICAgICAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMLCBsTWl4THZsLCBsTWl4U2NhbGUpOworICAgICAgICAgICAgfSBlbHNlIHsgLyogTCcgPSBMICsgQypjbGV2ICsgTHMqc2xldiArIExGRSpsbGV2OworICAgICAgICAgICAgICAgICAgICAgICAgUicgPSBSICsgQypjbGV2ICsgUnMqc2xldiArIExGRSpsbGV2OyAqLworICAgICAgICAgICAgICBkbXhBZGRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBjTWl4THZsLCBjTWl4U2NhbGUpOworICAgICAgICAgICAgICBkbXhBZGRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFRlRfUkVBUl9DSEFOTkVMLCBzTWl4THZsLCBzTWl4U2NhbGUpOworICAgICAgICAgICAgICBkbXhBZGRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCwgbE1peEx2bCwgbE1peFNjYWxlKTsKKyAgICAgICAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIGNNaXhMdmwsIGNNaXhTY2FsZSk7CisgICAgICAgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJJR0hUX1JFQVJfQ0hBTk5FTCwgc01peEx2bCwgc01peFNjYWxlKTsKKyAgICAgICAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMLCBsTWl4THZsLCBsTWl4U2NhbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBBZGQgYWRkaXRpb25hbCBETVggZ2FpbiAqLworICAgICAgICAgICAgaWYgKHBNZXRhRGF0YS0+ZG14R2FpbklkeDIgIT0gMCkgeyAvKiBBcHBseSBETVggZ2FpbiAyICovCisgICAgICAgICAgICAgIEZJWFBfRE1YIGRteEdhaW47CisgICAgICAgICAgICAgIElOVCBkbXhTY2FsZTsKKyAgICAgICAgICAgICAgSU5UIHNpZ24gPSAocE1ldGFEYXRhLT5kbXhHYWluSWR4MiAmIDB4NDApID8gLTEgOiAxOworICAgICAgICAgICAgICBJTlQgdmFsID0gcE1ldGFEYXRhLT5kbXhHYWluSWR4MiAmIDB4M0Y7CisKKyAgICAgICAgICAgICAgLyogMTBeKGRteF9nYWluXzIvODApICovCisgICAgICAgICAgICAgIGRteEdhaW4gPSBGWF9EQkwyRlhfRE1YKAorICAgICAgICAgICAgICAgICAgZkxkUG93KEZMMkZYQ09OU1RfREJMKDAuODMwNDgyMDIzNzIxODQxZiksIDIsIC8qIGxvZzIoMTApICovCisgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKShzaWduICogdmFsICogKExPTkcpRkwyRlhDT05TVF9EQkwoMC4wMTI1ZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsICZkbXhTY2FsZSkpOworICAgICAgICAgICAgICAvKiBDdXJyZW50bHkgb25seSBwb3NpdGl2ZSBzY2FsZSBmYWN0b3JzIHN1cHBvcnRlZCEgKi8KKyAgICAgICAgICAgICAgaWYgKGRteFNjYWxlIDwgMCkgeworICAgICAgICAgICAgICAgIGRteEdhaW4gPj49IC1kbXhTY2FsZTsKKyAgICAgICAgICAgICAgICBkbXhTY2FsZSA9IDA7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFRlRfRlJPTlRfQ0hBTk5FTCwgZG14R2FpbiwgZG14U2NhbGUpOworICAgICAgICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSUdIVF9GUk9OVF9DSEFOTkVMLCBkbXhHYWluLCBkbXhTY2FsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICBjYXNlIERNWF9NRVRIT0RfQVJJQl9KQVBBTjoKKyAgICAgICAgICBjYXNlIERNWF9NRVRIT0RfTVBFR19MRUdBQ1k6IHsKKyAgICAgICAgICAgIEZJWFBfRE1YIGZsZXYsIGNsZXYsIHNsZXZMTCwgc2xldkxSLCBzbGV2UkwsIHNsZXZSUjsKKyAgICAgICAgICAgIEZJWFBfRE1YIG10cnhNaXhEd25Db2VmID0KKyAgICAgICAgICAgICAgICBtcGVnTWl4RG93bklkeDJDb2VmW3BNZXRhRGF0YS0+bWF0cml4TWl4ZG93bklkeF07CisKKyAgICAgICAgICAgIGlmICgocFBhcmFtcy0+cHNldWRvU3Vyck1vZGUgPT0gRk9SQ0VfUFNfRE1YKSB8fAorICAgICAgICAgICAgICAgICgocFBhcmFtcy0+cHNldWRvU3Vyck1vZGUgPT0gQVVUT19QU19ETVgpICYmCisgICAgICAgICAgICAgICAgIChwTWV0YURhdGEtPnBzZXVkb1N1cnJvdW5kID09IDEpKSkgeworICAgICAgICAgICAgICBpZiAoZG14TWV0aG9kID09IERNWF9NRVRIT0RfQVJJQl9KQVBBTikgeworICAgICAgICAgICAgICAgIC8qIDMvMiBpbnB1dDogTCcgPSAwLjcwNyAqIFtMKzAuNzA3KkMtaypMcy1rKlJzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFInID0gMC43MDcgKiBbUiswLjcwNypDK2sqTHMraypSc107ICovCisgICAgICAgICAgICAgICAgZmxldiA9IG1wZWdNaXhEb3duSWR4MkNvZWZbMF07IC8qIGEgPSAwLjcwNyAqLworICAgICAgICAgICAgICB9IGVsc2UgeyAvKiAzLzIgaW5wdXQ6IEwnID0gKDEuNzA3KzIqQSleLTEgKgorICAgICAgICAgICAgICAgICAgICAgICAgICBbTCswLjcwNypDLUEqTHMtQSpSc107IFInID0gKDEuNzA3KzIqQSleLTEgKgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUiswLjcwNypDK0EqTHMrQSpSc107ICovCisgICAgICAgICAgICAgICAgZmxldiA9IG1wZWdNaXhEb3duSWR4MlByZUZhY3RbMV1bcE1ldGFEYXRhLT5tYXRyaXhNaXhkb3duSWR4XTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzbGV2UlIgPSBzbGV2UkwgPSBGWF9EQkwyRlhfRE1YKGZNdWx0KGZsZXYsIG10cnhNaXhEd25Db2VmKSk7CisgICAgICAgICAgICAgIHNsZXZMTCA9IHNsZXZMUiA9IC1zbGV2Ukw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAoZG14TWV0aG9kID09IERNWF9NRVRIT0RfQVJJQl9KQVBBTikgeworICAgICAgICAgICAgICAgIC8qIDMvMiBpbnB1dDogTCcgPSAwLjcwNyAqIFtMKzAuNzA3KkMraypMc107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSJyA9IDAuNzA3ICogW1IrMC43MDcqQytrKlJzXTsgKi8KKyAgICAgICAgICAgICAgICBmbGV2ID0gbXBlZ01peERvd25JZHgyQ29lZlswXTsgLyogYSA9IDAuNzA3ICovCisgICAgICAgICAgICAgIH0gZWxzZSB7IC8qIDMvMiBpbnB1dDogTCcgPSAoMS43MDcrQSleLTEgKiBbTCswLjcwNypDK0EqTHNdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFInID0gKDEuNzA3K0EpXi0xICogW1IrMC43MDcqQytBKlJzXTsgKi8KKyAgICAgICAgICAgICAgICBmbGV2ID0gbXBlZ01peERvd25JZHgyUHJlRmFjdFswXVtwTWV0YURhdGEtPm1hdHJpeE1peGRvd25JZHhdOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHNsZXZSUiA9IHNsZXZMTCA9IEZYX0RCTDJGWF9ETVgoZk11bHQoZmxldiwgbXRyeE1peER3bkNvZWYpKTsKKyAgICAgICAgICAgICAgc2xldkxSID0gc2xldlJMID0gKEZJWFBfRE1YKTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBjb21tb24gZmFjdG9yICovCisgICAgICAgICAgICBjbGV2ID0KKyAgICAgICAgICAgICAgICBGWF9EQkwyRlhfRE1YKGZNdWx0KGZsZXYsIG1wZWdNaXhEb3duSWR4MkNvZWZbMF0gLyogMC43MDcgKi8pKTsKKworICAgICAgICAgICAgZG14U2V0Q2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTEVGVF9GUk9OVF9DSEFOTkVMLCBmbGV2LCAwKTsKKyAgICAgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBjbGV2LCAwKTsKKyAgICAgICAgICAgIGRteEFkZENoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExFRlRfUkVBUl9DSEFOTkVMLCBzbGV2TEwsIDApOworICAgICAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUklHSFRfUkVBUl9DSEFOTkVMLCBzbGV2TFIsIDApOworCisgICAgICAgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUklHSFRfRlJPTlRfQ0hBTk5FTCwgZmxldiwgMCk7CisgICAgICAgICAgICBkbXhBZGRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIGNsZXYsIDApOworICAgICAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExFRlRfUkVBUl9DSEFOTkVMLCBzbGV2UkwsIDApOworICAgICAgICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJJR0hUX1JFQVJfQ0hBTk5FTCwgc2xldlJSLCAwKTsKKyAgICAgICAgICB9IGJyZWFrOworICAgICAgICB9IC8qIHN3aXRjaCAoZG14TWV0aG9kKSAqLworICAgICAgfSBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIFRoaXMgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBmaXQgdG8gYW55IGtub3duIGRvd25taXggZXF1YXRpb24hICovCisgICAgICAgIGVyciA9IFBDTURNWF9JTlZBTElEX01PREU7CisgICAgICAgIGJyZWFrOworICAgIH0gLyogc3dpdGNoIChpbkNoTW9kZSkgKi8KKworICAgIC8qIE1hcmsgdGhlIG91dHB1dCBjaGFubmVscyAqLworICAgIEZES21lbWNsZWFyKHZhbGlkLCAoOCkgKiBzaXplb2YodW5zaWduZWQgaW50KSk7CisgICAgdmFsaWRbTEVGVF9GUk9OVF9DSEFOTkVMXSA9IDE7CisgICAgdmFsaWRbUklHSFRfRlJPTlRfQ0hBTk5FTF0gPSAxOworICB9CisKKyAgaWYgKG51bU91dENoYW5uZWwgPT0gT05FX0NIQU5ORUwpIHsKKyAgICBGSVhQX0RNWCBtb25vTWl4TGV2ZWw7CisgICAgSU5UIG1vbm9NaXhTY2FsZSA9IDA7CisKKyAgICBkbXhDbGVhckNoYW5uZWwobWl4RmFjdG9ycywgbWl4U2NhbGVzLAorICAgICAgICAgICAgICAgICAgICBDRU5URVJfRlJPTlRfQ0hBTk5FTCk7IC8qIEMgaXMgbm90IGluIHRoZSBtaXggKi8KKworICAgIGlmIChkbXhNZXRob2QgPT0KKyAgICAgICAgRE1YX01FVEhPRF9NUEVHX0xFR0FDWSkgeyAvKiBDJyA9ICgzKzIqQSleLTEgKiBbQytMK1IrQSpMcytBK1JzXTsgKi8KKyAgICAgIG1vbm9NaXhMZXZlbCA9IG1wZWdNaXhEb3duSWR4MlByZUZhY3RbMl1bcE1ldGFEYXRhLT5tYXRyaXhNaXhkb3duSWR4XTsKKworICAgICAgbWl4RmFjdG9yc1tDRU5URVJfRlJPTlRfQ0hBTk5FTF1bQ0VOVEVSX0ZST05UX0NIQU5ORUxdID0gbW9ub01peExldmVsOworICAgICAgbWl4RmFjdG9yc1tDRU5URVJfRlJPTlRfQ0hBTk5FTF1bTEVGVF9GUk9OVF9DSEFOTkVMXSA9IG1vbm9NaXhMZXZlbDsKKyAgICAgIG1peEZhY3RvcnNbQ0VOVEVSX0ZST05UX0NIQU5ORUxdW1JJR0hUX0ZST05UX0NIQU5ORUxdID0gbW9ub01peExldmVsOworICAgICAgbW9ub01peExldmVsID0gRlhfREJMMkZYX0RNWChmTXVsdCgKKyAgICAgICAgICBtb25vTWl4TGV2ZWwsIG1wZWdNaXhEb3duSWR4MkNvZWZbcE1ldGFEYXRhLT5tYXRyaXhNaXhkb3duSWR4XSkpOworICAgICAgbWl4RmFjdG9yc1tDRU5URVJfRlJPTlRfQ0hBTk5FTF1bTEVGVF9SRUFSX0NIQU5ORUxdID0gbW9ub01peExldmVsOworICAgICAgbWl4RmFjdG9yc1tDRU5URVJfRlJPTlRfQ0hBTk5FTF1bUklHSFRfUkVBUl9DSEFOTkVMXSA9IG1vbm9NaXhMZXZlbDsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoIChkbXhNZXRob2QpIHsKKyAgICAgICAgY2FzZSBETVhfTUVUSE9EX01QRUdfQU1ENDoKKyAgICAgICAgICAvKiBDJyA9IEwgKyBSOyAqLworICAgICAgICAgIG1vbm9NaXhMZXZlbCA9IEZMMkZYQ09OU1RfRE1YKDAuNWYpOworICAgICAgICAgIG1vbm9NaXhTY2FsZSA9IDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgLyogQycgPSAwLjUqTCArIDAuNSpSOyAqLworICAgICAgICAgIG1vbm9NaXhMZXZlbCA9IEZMMkZYQ09OU1RfRE1YKDAuNWYpOworICAgICAgICAgIG1vbm9NaXhTY2FsZSA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkbXhTZXRDaGFubmVsKG1peEZhY3RvcnMsIG1peFNjYWxlcywgQ0VOVEVSX0ZST05UX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgIExFRlRfRlJPTlRfQ0hBTk5FTCwgbW9ub01peExldmVsLCBtb25vTWl4U2NhbGUpOworICAgICAgZG14QWRkQ2hhbm5lbChtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIENFTlRFUl9GUk9OVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICBSSUdIVF9GUk9OVF9DSEFOTkVMLCBtb25vTWl4TGV2ZWwsIG1vbm9NaXhTY2FsZSk7CisgICAgfQorCisgICAgLyogTWFyayB0aGUgb3V0cHV0IGNoYW5uZWwgKi8KKyAgICBGREttZW1jbGVhcih2YWxpZCwgKDgpICogc2l6ZW9mKHVuc2lnbmVkIGludCkpOworICAgIHZhbGlkW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSA9IDE7CisgIH0KKworI2RlZmluZSBNQVhfU0VBUkNIX1NUQVJUX1ZBTCAoLTcpCisKKyAgeworICAgIExPTkcgY2hTdW1bKDgpXTsKKyAgICBJTlQgY2hTdW1NYXggPSBNQVhfU0VBUkNIX1NUQVJUX1ZBTDsKKworICAgIC8qIERldGVybWluZSB0aGUgY3VycmVudCBtYXhpbXVtIHNjYWxlIGZhY3RvciAqLworICAgIGZvciAob3V0Q2ggPSAwOyBvdXRDaCA8ICg4KTsgb3V0Q2ggKz0gMSkgeworICAgICAgaWYgKHZhbGlkW291dENoXSAhPSAwKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBpbkNoOworICAgICAgICBmb3IgKGluQ2ggPSAwOyBpbkNoIDwgKDgpOyBpbkNoICs9IDEpIHsKKyAgICAgICAgICBpZiAobWl4U2NhbGVzW291dENoXVtpbkNoXSA+IG1heFNjYWxlKSB7IC8qIFN0b3JlIHRoZSBuZXcgbWF4aW11bSAqLworICAgICAgICAgICAgbWF4U2NhbGUgPSBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIEluZGl2aWR1YWx5IGFuYWx5c2Ugb3V0cHV0IGNoYW5hbCBsZXZlbHMgKi8KKyAgICBmb3IgKG91dENoID0gMDsgb3V0Q2ggPCAoOCk7IG91dENoICs9IDEpIHsKKyAgICAgIGNoU3VtW291dENoXSA9IE1BWF9TRUFSQ0hfU1RBUlRfVkFMOworICAgICAgaWYgKHZhbGlkW291dENoXSAhPSAwKSB7CisgICAgICAgIGludCBvdnJmbHdQcm90U2NhbGUgPSAwOworICAgICAgICB1bnNpZ25lZCBpbnQgaW5DaDsKKworICAgICAgICAvKiBBY2N1bXVsYXRlIGFsbCBmYWN0b3JzIGZvciBlYWNoIG91dHB1dCBjaGFubmVsICovCisgICAgICAgIGNoU3VtW291dENoXSA9IDA7CisgICAgICAgIGZvciAoaW5DaCA9IDA7IGluQ2ggPCAoOCk7IGluQ2ggKz0gMSkgeworICAgICAgICAgIFNIT1JUIGFkZEZhY3QgPSBGWF9ETVgyU0hSVChtaXhGYWN0b3JzW291dENoXVtpbkNoXSk7CisgICAgICAgICAgaWYgKG1peFNjYWxlc1tvdXRDaF1baW5DaF0gPD0gbWF4U2NhbGUpIHsKKyAgICAgICAgICAgIGFkZEZhY3QgPj49IG1heFNjYWxlIC0gbWl4U2NhbGVzW291dENoXVtpbkNoXTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkRmFjdCA8PD0gbWl4U2NhbGVzW291dENoXVtpbkNoXSAtIG1heFNjYWxlOworICAgICAgICAgIH0KKyAgICAgICAgICBjaFN1bVtvdXRDaF0gKz0gYWRkRmFjdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hTdW1bb3V0Q2hdID4gKExPTkcpTUFYVkFMX1NHTCkgeworICAgICAgICAgIHdoaWxlIChjaFN1bVtvdXRDaF0gPiAoTE9ORylNQVhWQUxfU0dMKSB7CisgICAgICAgICAgICBvdnJmbHdQcm90U2NhbGUgKz0gMTsKKyAgICAgICAgICAgIGNoU3VtW291dENoXSA+Pj0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2hTdW1bb3V0Q2hdID4gMCkgeworICAgICAgICAgIHdoaWxlICgoY2hTdW1bb3V0Q2hdIDw8IDEpIDw9IChMT05HKU1BWFZBTF9TR0wpIHsKKyAgICAgICAgICAgIG92cmZsd1Byb3RTY2FsZSAtPSAxOworICAgICAgICAgICAgY2hTdW1bb3V0Q2hdIDw8PSAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBTdG9yZSB0aGUgZGlmZmVyZW50aWFsIHNjYWxpbmcgaW4gdGhlIHNhbWUgYXJyYXkgKi8KKyAgICAgICAgY2hTdW1bb3V0Q2hdID0gb3ZyZmx3UHJvdFNjYWxlOworICAgICAgfQorICAgIH0KKworICAgIGZvciAob3V0Q2ggPSAwOyBvdXRDaCA8ICg4KTsgb3V0Q2ggKz0gMSkgeworICAgICAgaWYgKCh2YWxpZFtvdXRDaF0gIT0gMCkgJiYKKyAgICAgICAgICAoY2hTdW1bb3V0Q2hdID4gY2hTdW1NYXgpKSB7IC8qIFN0b3JlIHRoZSBuZXcgbWF4aW11bSAqLworICAgICAgICBjaFN1bU1heCA9IGNoU3VtW291dENoXTsKKyAgICAgIH0KKyAgICB9CisgICAgbWF4U2NhbGUgPSBmTWF4KG1heFNjYWxlICsgY2hTdW1NYXgsIDApOworCisgICAgLyogTm9ybWFsaXplIGFsbCBmYWN0b3JzICovCisgICAgZm9yIChvdXRDaCA9IDA7IG91dENoIDwgKDgpOyBvdXRDaCArPSAxKSB7CisgICAgICBpZiAodmFsaWRbb3V0Q2hdICE9IDApIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGluQ2g7CisgICAgICAgIGZvciAoaW5DaCA9IDA7IGluQ2ggPCAoOCk7IGluQ2ggKz0gMSkgeworICAgICAgICAgIGlmIChtaXhGYWN0b3JzW291dENoXVtpbkNoXSAhPSAoRklYUF9ETVgpMCkgeworICAgICAgICAgICAgaWYgKG1peFNjYWxlc1tvdXRDaF1baW5DaF0gPD0gbWF4U2NhbGUpIHsKKyAgICAgICAgICAgICAgbWl4RmFjdG9yc1tvdXRDaF1baW5DaF0gPj49IG1heFNjYWxlIC0gbWl4U2NhbGVzW291dENoXVtpbkNoXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdIDw8PSBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdIC0gbWF4U2NhbGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdID0gbWF4U2NhbGU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogcmV0dXJuIHRoZSBzY2FsZSBmYWN0b3IgKi8KKyAgKnBPdXRTY2FsZSA9IG1heFNjYWxlOworCisgIHJldHVybiAoZXJyKTsKK30KKworLyoqIE9wZW4gYW5kIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgdGhlIFBDTSBkb3dubWl4IG1vZHVsZQorICogQHBhcmFtIFtvdXRdIFBvaW50ZXIgdG8gYSBidWZmZXIgcmVjZWl2aW5nIHRoZSBoYW5kbGUgb2YgdGhlIG5ldyBpbnN0YW5jZS4KKyAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KKyAqKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfT3BlbihIQU5ETEVfUENNX0RPV05NSVggKnBTZWxmKSB7CisgIEhBTkRMRV9QQ01fRE9XTk1JWCBzZWxmOworCisgIGlmIChwU2VsZiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOworICB9CisKKyAgKnBTZWxmID0gTlVMTDsKKworICBzZWxmID0gKEhBTkRMRV9QQ01fRE9XTk1JWClHZXRQY21EbXhJbnN0YW5jZSgwKTsKKyAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgIHJldHVybiAoUENNRE1YX09VVF9PRl9NRU1PUlkpOworICB9CisKKyAgLyogUmVzZXQgdGhlIGZ1bGwgaW5zdGFuY2UgKi8KKyAgcGNtRG14X1Jlc2V0KHNlbGYsIFBDTURNWF9SRVNFVF9GVUxMKTsKKworICAqcFNlbGYgPSBzZWxmOworCisgIHJldHVybiAoUENNRE1YX09LKTsKK30KKworLyoqIFJlc2V0IGFsbCBzdGF0aWMgdmFsdWVzIGxpa2UgZS5nLiBtaXhkb3duIGNvZWZmaWNpZW50cy4KKyAqIEBwYXJhbSBbaW5dIEhhbmRsZSBvZiBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCisgKiBAcGFyYW0gW2luXSBGbGFncyB0ZWxsaW5nIHdoaWNoIHBhcnRzIG9mIHRoZSBtb2R1bGUgc2hhbGwgYmUgcmVzZXQuCisgKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCisgKiovCitQQ01ETVhfRVJST1IgcGNtRG14X1Jlc2V0KEhBTkRMRV9QQ01fRE9XTk1JWCBzZWxmLCBVSU5UIGZsYWdzKSB7CisgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CisgIH0KKworICBpZiAoZmxhZ3MgJiBQQ01ETVhfUkVTRVRfUEFSQU1TKSB7CisgICAgUENNX0RNWF9VU0VSX1BBUkFNUyAqcFBhcmFtcyA9ICZzZWxmLT51c2VyUGFyYW1zOworCisgICAgcFBhcmFtcy0+ZHVhbENoYW5uZWxNb2RlID0gU1RFUkVPX01PREU7CisgICAgcFBhcmFtcy0+cHNldWRvU3Vyck1vZGUgPSBORVZFUl9ET19QU19ETVg7CisgICAgcFBhcmFtcy0+bnVtT3V0Q2hhbm5lbHNNYXggPSAoNik7CisgICAgcFBhcmFtcy0+bnVtT3V0Q2hhbm5lbHNNaW4gPSAoMCk7CisgICAgcFBhcmFtcy0+ZnJhbWVEZWxheSA9IDA7CisgICAgcFBhcmFtcy0+ZXhwaXJ5RnJhbWUgPSAoMCk7CisKKyAgICBzZWxmLT5hcHBseVByb2Nlc3NpbmcgPSAwOworICB9CisKKyAgaWYgKGZsYWdzICYgUENNRE1YX1JFU0VUX0JTX0RBVEEpIHsKKyAgICBpbnQgc2xvdDsKKyAgICAvKiBJbml0IGFsbCBzbG90cyB3aXRoIGEgZGVmYXVsdCBzZXQgKi8KKyAgICBmb3IgKHNsb3QgPSAwOyBzbG90IDw9ICgxKTsgc2xvdCArPSAxKSB7CisgICAgICBGREttZW1jcHkoJnNlbGYtPmJzTWV0YURhdGFbc2xvdF0sICZkZmx0TWV0YURhdGEsCisgICAgICAgICAgICAgICAgc2l6ZW9mKERNWF9CU19NRVRBX0RBVEEpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gKFBDTURNWF9PSyk7Cit9CisKKy8qKiBTZXQgb25lIHBhcmFtZXRlciBmb3Igb25lIGluc3RhbmNlIG9mIHRoZSBQQ00gZG93bm1peCBtb2R1bGUuCisgKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgorICogQHBhcmFtIFtpbl0gUGFyYW1ldGVyIHRvIGJlIHNldC4KKyAqIEBwYXJhbSBbaW5dIFBhcmFtZXRlciB2YWx1ZS4KKyAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KKyAqKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfU2V0UGFyYW0oSEFORExFX1BDTV9ET1dOTUlYIHNlbGYsIGNvbnN0IFBDTURNWF9QQVJBTSBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHZhbHVlKSB7CisgIHN3aXRjaCAocGFyYW0pIHsKKyAgICBjYXNlIERNWF9QUk9GSUxFX1NFVFRJTkc6CisgICAgICBzd2l0Y2ggKChETVhfUFJPRklMRV9UWVBFKXZhbHVlKSB7CisgICAgICAgIGNhc2UgRE1YX1BSRkxfU1RBTkRBUkQ6CisgICAgICAgIGNhc2UgRE1YX1BSRkxfTUFUUklYX01JWDoKKyAgICAgICAgY2FzZSBETVhfUFJGTF9GT1JDRV9NQVRSSVhfTUlYOgorICAgICAgICBjYXNlIERNWF9QUkZMX0FSSUJfSkFQQU46CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIChQQ01ETVhfVU5BQkxFX1RPX1NFVF9QQVJBTSk7CisgICAgICB9CisgICAgICBpZiAoc2VsZiA9PSBOVUxMKSByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CisgICAgICBzZWxmLT51c2VyUGFyYW1zLmRteFByb2ZpbGUgPSAoRE1YX1BST0ZJTEVfVFlQRSl2YWx1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBETVhfQlNfREFUQV9FWFBJUllfRlJBTUU6CisgICAgICBpZiAoc2VsZiA9PSBOVUxMKSByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CisgICAgICBzZWxmLT51c2VyUGFyYW1zLmV4cGlyeUZyYW1lID0gKHZhbHVlID4gMCkgPyAoVUlOVCl2YWx1ZSA6IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRE1YX0JTX0RBVEFfREVMQVk6CisgICAgICBpZiAoKHZhbHVlID4gKDEpKSB8fCAodmFsdWUgPCAwKSkgeworICAgICAgICByZXR1cm4gKFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNKTsKKyAgICAgIH0KKyAgICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOworICAgICAgfQorICAgICAgc2VsZi0+dXNlclBhcmFtcy5mcmFtZURlbGF5ID0gKFVDSEFSKXZhbHVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1JTl9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTOgorICAgICAgc3dpdGNoICh2YWx1ZSkgeyAvKiBzdXBwb3J0ZWQgb3V0cHV0IGNoYW5uZWxzICovCisgICAgICAgIGNhc2UgLTE6CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgY2FzZSBPTkVfQ0hBTk5FTDoKKyAgICAgICAgY2FzZSBUV09fQ0hBTk5FTDoKKyAgICAgICAgY2FzZSBTSVhfQ0hBTk5FTDoKKyAgICAgICAgY2FzZSBFSUdIVF9DSEFOTkVMOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiAoUENNRE1YX1VOQUJMRV9UT19TRVRfUEFSQU0pOworICAgICAgfQorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOworICAgICAgLyogU3RvcmUgdGhlIG5ldyB2YWx1ZSAqLworICAgICAgc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01pbiA9ICh2YWx1ZSA+IDApID8gKFNIT1JUKXZhbHVlIDogLTE7CisgICAgICBpZiAoKHZhbHVlID4gMCkgJiYgKHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNYXggPiAwKSAmJgorICAgICAgICAgICh2YWx1ZSA+IHNlbGYtPnVzZXJQYXJhbXMKKyAgICAgICAgICAgICAgICAgICAgICAgLm51bU91dENoYW5uZWxzTWF4KSkgeyAvKiBNSU4gPiBNQVggd291bGQgYmUgYW4gaW52YWxpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLiBUaHVzIHNldCBNQVggPSBNSU4gaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGNhc2UuICovCisgICAgICAgIHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNYXggPSBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWluOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1BWF9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTOgorICAgICAgc3dpdGNoICh2YWx1ZSkgeyAvKiBzdXBwb3J0ZWQgb3V0cHV0IGNoYW5uZWxzICovCisgICAgICAgIGNhc2UgLTE6CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgY2FzZSBPTkVfQ0hBTk5FTDoKKyAgICAgICAgY2FzZSBUV09fQ0hBTk5FTDoKKyAgICAgICAgY2FzZSBTSVhfQ0hBTk5FTDoKKyAgICAgICAgY2FzZSBFSUdIVF9DSEFOTkVMOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiAoUENNRE1YX1VOQUJMRV9UT19TRVRfUEFSQU0pOworICAgICAgfQorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOworICAgICAgLyogU3RvcmUgdGhlIG5ldyB2YWx1ZSAqLworICAgICAgc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01heCA9ICh2YWx1ZSA+IDApID8gKFNIT1JUKXZhbHVlIDogLTE7CisgICAgICBpZiAoKHZhbHVlID4gMCkgJiYKKyAgICAgICAgICAodmFsdWUgPCBzZWxmLT51c2VyUGFyYW1zCisgICAgICAgICAgICAgICAgICAgICAgIC5udW1PdXRDaGFubmVsc01pbikpIHsgLyogTUFYIDwgTUlOIHdvdWxkIGJlIGFuIGludmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS4gVGh1cyBzZXQgTUlOID0gTUFYIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBjYXNlLiAqLworICAgICAgICBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWluID0gc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01heDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBETVhfRFVBTF9DSEFOTkVMX01PREU6CisgICAgICBzd2l0Y2ggKChEVUFMX0NIQU5ORUxfTU9ERSl2YWx1ZSkgeworICAgICAgICBjYXNlIFNURVJFT19NT0RFOgorICAgICAgICBjYXNlIENIMV9NT0RFOgorICAgICAgICBjYXNlIENIMl9NT0RFOgorICAgICAgICBjYXNlIE1JWEVEX01PREU6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIChQQ01ETVhfVU5BQkxFX1RPX1NFVF9QQVJBTSk7CisgICAgICB9CisgICAgICBpZiAoc2VsZiA9PSBOVUxMKSByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CisgICAgICBzZWxmLT51c2VyUGFyYW1zLmR1YWxDaGFubmVsTW9kZSA9IChEVUFMX0NIQU5ORUxfTU9ERSl2YWx1ZTsKKyAgICAgIHNlbGYtPmFwcGx5UHJvY2Vzc2luZyA9ICgoRFVBTF9DSEFOTkVMX01PREUpdmFsdWUgIT0gU1RFUkVPX01PREUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwOyAvKiBGb3JjZSBwcm9jZXNzaW5nIGlmIG5lY2Vzc2FyeS4gKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBETVhfUFNFVURPX1NVUlJPVU5EX01PREU6CisgICAgICBzd2l0Y2ggKChQU0VVRE9fU1VSUk9VTkRfTU9ERSl2YWx1ZSkgeworICAgICAgICBjYXNlIE5FVkVSX0RPX1BTX0RNWDoKKyAgICAgICAgY2FzZSBBVVRPX1BTX0RNWDoKKyAgICAgICAgY2FzZSBGT1JDRV9QU19ETVg6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIChQQ01ETVhfVU5BQkxFX1RPX1NFVF9QQVJBTSk7CisgICAgICB9CisgICAgICBpZiAoc2VsZiA9PSBOVUxMKSByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CisgICAgICBzZWxmLT51c2VyUGFyYW1zLnBzZXVkb1N1cnJNb2RlID0gKFBTRVVET19TVVJST1VORF9NT0RFKXZhbHVlOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIChQQ01ETVhfVU5LTk9XTl9QQVJBTSk7CisgIH0KKworICByZXR1cm4gKFBDTURNWF9PSyk7Cit9CisKKy8qKiBHZXQgb25lIHBhcmFtZXRlciB2YWx1ZSBvZiBvbmUgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgorICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KKyAqIEBwYXJhbSBbaW5dIFBhcmFtZXRlciB0byBiZSBzZXQuCisgKiBAcGFyYW0gW291dF0gUG9pbnRlciB0byBidWZmZXIgcmVjZWl2aW5nIHRoZSBwYXJhbWV0ZXIgdmFsdWUuCisgKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCisgKiovCitQQ01ETVhfRVJST1IgcGNtRG14X0dldFBhcmFtKEhBTkRMRV9QQ01fRE9XTk1JWCBzZWxmLCBjb25zdCBQQ01ETVhfUEFSQU0gcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqY29uc3QgcFZhbHVlKSB7CisgIFBDTV9ETVhfVVNFUl9QQVJBTVMgKnBVc3JQYXJhbXM7CisKKyAgaWYgKChzZWxmID09IE5VTEwpIHx8IChwVmFsdWUgPT0gTlVMTCkpIHsKKyAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CisgIH0KKyAgcFVzclBhcmFtcyA9ICZzZWxmLT51c2VyUGFyYW1zOworCisgIHN3aXRjaCAocGFyYW0pIHsKKyAgICBjYXNlIERNWF9QUk9GSUxFX1NFVFRJTkc6CisgICAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5kbXhQcm9maWxlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBETVhfQlNfREFUQV9FWFBJUllfRlJBTUU6CisgICAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5leHBpcnlGcmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRE1YX0JTX0RBVEFfREVMQVk6CisgICAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5mcmFtZURlbGF5OworICAgICAgYnJlYWs7CisgICAgY2FzZSBNSU5fTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUzoKKyAgICAgICpwVmFsdWUgPSAoSU5UKXBVc3JQYXJhbXMtPm51bU91dENoYW5uZWxzTWluOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNQVhfTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUzoKKyAgICAgICpwVmFsdWUgPSAoSU5UKXBVc3JQYXJhbXMtPm51bU91dENoYW5uZWxzTWF4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBETVhfRFVBTF9DSEFOTkVMX01PREU6CisgICAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5kdWFsQ2hhbm5lbE1vZGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIERNWF9QU0VVRE9fU1VSUk9VTkRfTU9ERToKKyAgICAgICpwVmFsdWUgPSAoSU5UKXBVc3JQYXJhbXMtPnBzZXVkb1N1cnJNb2RlOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAoUENNRE1YX1VOS05PV05fUEFSQU0pOworICB9CisKKyAgcmV0dXJuIChQQ01ETVhfT0spOworfQorCisvKgorICogUmVhZCBETVggbWV0YS1kYXRhIGZyb20gYSBkYXRhIHN0cmVhbSBlbGVtZW50LgorICovCitQQ01ETVhfRVJST1IgcGNtRG14X1BhcnNlKEhBTkRMRV9QQ01fRE9XTk1JWCBzZWxmLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgYW5jRGF0YUJpdHMsIGludCBpc01wZWcyKSB7CisgIFBDTURNWF9FUlJPUiBlcnJvclN0YXR1cyA9IFBDTURNWF9PSzsKKworI2RlZmluZSBNQVhfRFNFX0FOQ19CWVRFUyAoMTYpICAgIC8qIDE1IGJ5dGVzICovCisjZGVmaW5lIEFOQ19EQVRBX1NZTkNfQllURSAoMHhCQykgLyogYW5jaWxsYXJ5IGRhdGEgc3luYyBieXRlLiAqLworCisgIERNWF9CU19NRVRBX0RBVEEgKnBCc01ldGFEYXRhOworCisgIGludCBza2lwNERteCA9IDAsIHNraXA0RXh0ID0gMDsKKyAgaW50IGRteEx2bEF2YWlsID0gMCwgZXh0RGF0YUF2YWlsID0gMDsKKyAgVUlOVCBmb3VuZE5ld0RhdGEgPSAwOworICBVSU5UIG1pbkFuY0JpdHMgPSAoKGlzTXBlZzIpID8gNSA6IDMpICogODsKKworICBpZiAoKHNlbGYgPT0gTlVMTCkgfHwgKGhCcyA9PSBOVUxMKSkgeworICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKKyAgfQorCisgIC8qIHNhbml0eSBjaGVja3MgKi8KKyAgaWYgKChhbmNEYXRhQml0cyA8IG1pbkFuY0JpdHMpIHx8IChhbmNEYXRhQml0cyA+IEZES2dldFZhbGlkQml0cyhoQnMpKSkgeworICAgIHJldHVybiAoUENNRE1YX0NPUlJVUFRfQU5DX0RBVEEpOworICB9CisKKyAgcEJzTWV0YURhdGEgPSAmc2VsZi0+YnNNZXRhRGF0YVswXTsKKworICBpZiAoaXNNcGVnMikgeworICAgIC8qIHNraXAgRFZEIGFuY2lsbGFyeSBkYXRhICovCisgICAgRkRLcHVzaEZvcihoQnMsIDE2KTsKKyAgfQorCisgIC8qIGNoZWNrIHN5bmMgd29yZCAqLworICBpZiAoRkRLcmVhZEJpdHMoaEJzLCA4KSAhPSBBTkNfREFUQV9TWU5DX0JZVEUpIHsKKyAgICByZXR1cm4gKFBDTURNWF9DT1JSVVBUX0FOQ19EQVRBKTsKKyAgfQorCisgIC8qIHNraXAgTVBFRyBhdWRpbyB0eXBlIGFuZCBEb2xieSBzdXJyb3VuZCBtb2RlICovCisgIEZES3B1c2hGb3IoaEJzLCA0KTsKKworICBpZiAoaXNNcGVnMikgeworICAgIC8qIGludCBudW1BbmNCeXRlcyA9ICovIEZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgLyogYWR2YW5jZWQgZHluYW1pYyByYW5nZSBjb250cm9sICovCisgICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgc2tpcDREbXggKz0gMjQ7CisgICAgLyogZGlhbG9nIG5vcm1hbGl6YXRpb24gKi8KKyAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNERteCArPSA4OworICAgIC8qIHJlcHJvZHVjdGlvbl9sZXZlbCAqLworICAgIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RG14ICs9IDg7CisgIH0gZWxzZSB7CisgICAgRkRLcHVzaEZvcihoQnMsIDIpOyAvKiBkcmMgcHJlc2VudGF0aW9uIG1vZGUgKi8KKyAgICBwQnNNZXRhRGF0YS0+cHNldWRvU3Vycm91bmQgPSAoU0NIQVIpRkRLcmVhZEJpdChoQnMpOworICAgIEZES3B1c2hGb3IoaEJzLCA0KTsgLyogcmVzZXJ2ZWQgYml0cyAqLworICB9CisKKyAgLyogZG93bm1peGluZyBsZXZlbHMgTVBFR3ggc3RhdHVzICovCisgIGRteEx2bEF2YWlsID0gRkRLcmVhZEJpdChoQnMpOworCisgIGlmIChpc01wZWcyKSB7CisgICAgLyogc2NhbGUgZmFjdG9yIENSQyBzdGF0dXMgKi8KKyAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNEV4dCArPSAxNjsKKyAgfSBlbHNlIHsKKyAgICAvKiBhbmNpbGxhcnkgZGF0YSBleHRlbnNpb24gc3RhdHVzICovCisgICAgZXh0RGF0YUF2YWlsID0gRkRLcmVhZEJpdChoQnMpOworICB9CisKKyAgLyogYXVkaW8gY29kaW5nIGFuZCBjb21wcmVzc2lvbiBzdGF0dXMgKi8KKyAgaWYgKEZES3JlYWRCaXQoaEJzKSkgc2tpcDRFeHQgKz0gMTY7CisgIC8qIGNvYXJzZSBncmFpbiB0aW1lY29kZSBzdGF0dXMgKi8KKyAgaWYgKEZES3JlYWRCaXQoaEJzKSkgc2tpcDRFeHQgKz0gMTY7CisgIC8qIGZpbmUgZ3JhaW4gdGltZWNvZGUgc3RhdHVzICovCisgIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RXh0ICs9IDE2OworCisgIC8qIHNraXAgdGhlIHVzZWxlc3MgZGF0YSB0byBnZXQgdG8gdGhlIERNWCBsZXZlbHMgKi8KKyAgRkRLcHVzaEZvcihoQnMsIHNraXA0RG14KTsKKworICAvKiBkb3dubWl4X2xldmVsc19NUEVHWCAqLworICBpZiAoZG14THZsQXZhaWwpIHsKKyAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSB7IC8qIGNlbnRlcl9taXhfbGV2ZWxfb24gKi8KKyAgICAgIHBCc01ldGFEYXRhLT5jTGV2SWR4ID0gKFVDSEFSKUZES3JlYWRCaXRzKGhCcywgMyk7CisgICAgICBmb3VuZE5ld0RhdGEgfD0gVFlQRV9EU0VfQ0xFVl9EQVRBOworICAgIH0gZWxzZSB7CisgICAgICBGREtyZWFkQml0cyhoQnMsIDMpOworICAgIH0KKyAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSB7IC8qIHN1cnJvdW5kX21peF9sZXZlbF9vbiAqLworICAgICAgcEJzTWV0YURhdGEtPnNMZXZJZHggPSAoVUNIQVIpRkRLcmVhZEJpdHMoaEJzLCAzKTsKKyAgICAgIGZvdW5kTmV3RGF0YSB8PSBUWVBFX0RTRV9TTEVWX0RBVEE7CisgICAgfSBlbHNlIHsKKyAgICAgIEZES3JlYWRCaXRzKGhCcywgMyk7CisgICAgfQorICB9CisKKyAgLyogc2tpcCB0aGUgdXNlbGVzcyBkYXRhIHRvIGdldCB0byB0aGUgYW5jaWxsYXJ5IGRhdGEgZXh0ZW5zaW9uICovCisgIEZES3B1c2hGb3IoaEJzLCBza2lwNEV4dCk7CisKKyAgLyogYW5jIGRhdGEgZXh0ZW5zaW9uIChNUEVHLTQgb25seSkgKi8KKyAgaWYgKGV4dERhdGFBdmFpbCkgeworICAgIGludCBleHREbXhMdmxTdCwgZXh0RG14R2FpblN0LCBleHREbXhMZmVTdDsKKworICAgIEZES3JlYWRCaXQoaEJzKTsgLyogcmVzZXJ2ZWQgYml0ICovCisgICAgZXh0RG14THZsU3QgPSBGREtyZWFkQml0KGhCcyk7CisgICAgZXh0RG14R2FpblN0ID0gRkRLcmVhZEJpdChoQnMpOworICAgIGV4dERteExmZVN0ID0gRkRLcmVhZEJpdChoQnMpOworICAgIEZES3JlYWRCaXRzKGhCcywgNCk7IC8qIHJlc2VydmVkIGJpdHMgKi8KKworICAgIGlmIChleHREbXhMdmxTdCkgeworICAgICAgcEJzTWV0YURhdGEtPmRtaXhJZHhBID0gKFVDSEFSKUZES3JlYWRCaXRzKGhCcywgMyk7CisgICAgICBwQnNNZXRhRGF0YS0+ZG1peElkeEIgPSAoVUNIQVIpRkRLcmVhZEJpdHMoaEJzLCAzKTsKKyAgICAgIEZES3JlYWRCaXRzKGhCcywgMik7IC8qIHJlc2VydmVkIGJpdHMgKi8KKyAgICAgIGZvdW5kTmV3RGF0YSB8PSBUWVBFX0RTRV9ETUlYX0FCX0RBVEE7CisgICAgfQorICAgIGlmIChleHREbXhHYWluU3QpIHsKKyAgICAgIHBCc01ldGFEYXRhLT5kbXhHYWluSWR4NSA9IChVQ0hBUilGREtyZWFkQml0cyhoQnMsIDcpOworICAgICAgRkRLcmVhZEJpdChoQnMpOyAvKiByZXNlcnZlZCBiaXQgKi8KKyAgICAgIHBCc01ldGFEYXRhLT5kbXhHYWluSWR4MiA9IChVQ0hBUilGREtyZWFkQml0cyhoQnMsIDcpOworICAgICAgRkRLcmVhZEJpdChoQnMpOyAvKiByZXNlcnZlZCBiaXQgKi8KKyAgICAgIGZvdW5kTmV3RGF0YSB8PSBUWVBFX0RTRV9ETVhfR0FJTl9EQVRBOworICAgIH0KKyAgICBpZiAoZXh0RG14TGZlU3QpIHsKKyAgICAgIHBCc01ldGFEYXRhLT5kbWl4SWR4TGZlID0gKFVDSEFSKUZES3JlYWRCaXRzKGhCcywgNCk7CisgICAgICBGREtyZWFkQml0cyhoQnMsIDQpOyAvKiByZXNlcnZlZCBiaXRzICovCisgICAgICBmb3VuZE5ld0RhdGEgfD0gVFlQRV9EU0VfRE1JWF9MRkVfREFUQTsKKyAgICB9CisgIH0KKworICAvKiBmaW5hbCBzYW5pdHkgY2hlY2sgb24gdGhlIGFtb3VudCBvZiByZWFkIGRhdGEgKi8KKyAgaWYgKChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcykgPCAwKSB7CisgICAgZXJyb3JTdGF0dXMgPSBQQ01ETVhfQ09SUlVQVF9BTkNfREFUQTsKKyAgfQorCisgIGlmICgoZXJyb3JTdGF0dXMgPT0gUENNRE1YX09LKSAmJiAoZm91bmROZXdEYXRhICE9IDApKSB7CisgICAgLyogYW5ub3VuY2UgbmV3IGRhdGEgKi8KKyAgICBwQnNNZXRhRGF0YS0+dHlwZUZsYWdzIHw9IGZvdW5kTmV3RGF0YTsKKyAgICAvKiByZXNldCBleHBpcnkgY291bnRlciAqLworICAgIHBCc01ldGFEYXRhLT5leHBpcnlDb3VudCA9IDA7CisgIH0KKworICByZXR1cm4gKGVycm9yU3RhdHVzKTsKK30KKworLyoKKyAqIFJlYWQgRE1YIG1ldGEtZGF0YSBmcm9tIGEgZGF0YSBzdHJlYW0gZWxlbWVudC4KKyAqLworUENNRE1YX0VSUk9SIHBjbURteF9SZWFkRHZiQW5jRGF0YShIQU5ETEVfUENNX0RPV05NSVggc2VsZiwgVUNIQVIgKnBBbmNEYXRhQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGFuY0RhdGFCeXRlcywgaW50IGlzTXBlZzIpIHsKKyAgUENNRE1YX0VSUk9SIGVycm9yU3RhdHVzID0gUENNRE1YX09LOworICBGREtfQklUU1RSRUFNIGJzOworICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSAmYnM7CisKKyAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKKyAgfQorCisgIC8qIHNhbml0eSBjaGVja3MgKi8KKyAgaWYgKChwQW5jRGF0YUJ1ZiA9PSBOVUxMKSB8fCAoYW5jRGF0YUJ5dGVzID09IDApKSB7CisgICAgcmV0dXJuIChQQ01ETVhfQ09SUlVQVF9BTkNfREFUQSk7CisgIH0KKworICBGREtpbml0Qml0U3RyZWFtKGhCcywgcEFuY0RhdGFCdWYsIE1BWF9EU0VfQU5DX0JZVEVTLCBhbmNEYXRhQnl0ZXMgKiA4LAorICAgICAgICAgICAgICAgICAgIEJTX1JFQURFUik7CisKKyAgZXJyb3JTdGF0dXMgPSBwY21EbXhfUGFyc2Uoc2VsZiwgaEJzLCBhbmNEYXRhQnl0ZXMgKiA4LCBpc01wZWcyKTsKKworICByZXR1cm4gKGVycm9yU3RhdHVzKTsKK30KKworLyoqIFNldCB0aGUgbWF0cml4IG1peGRvd24gaW5mb3JtYXRpb24gZXh0cmFjdGVkIGZyb20gdGhlIFBDRSBvZiBhbiBBQUMKKyAqYml0c3RyZWFtLiBOb3RlOiBDYWxsIG9ubHkgaWYgbWF0cml4X21peGRvd25faWR4X3ByZXNlbnQgaXMgdHJ1ZS4KKyAqIEBwYXJhbSBbaW5dIEhhbmRsZSBvZiBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCisgKiBAcGFyYW0gW2luXSBUaGUgMiBiaXQgbWF0cml4IG1peGRvd24gaW5kZXggZXh0cmFjdGVkIGZyb20gUENFLgorICogQHBhcmFtIFtpbl0gVGhlIHBzZXVkbyBzdXJyb3VuZCBlbmFibGUgZmxhZyBleHRyYWN0ZWQgZnJvbSBQQ0UuCisgKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCisgKiovCitQQ01ETVhfRVJST1IgcGNtRG14X1NldE1hdHJpeE1peGRvd25Gcm9tUGNlKEhBTkRMRV9QQ01fRE9XTk1JWCBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF0cml4TWl4ZG93blByZXNlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXRyaXhNaXhkb3duSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHNldWRvU3Vycm91bmRFbmFibGUpIHsKKyAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKKyAgfQorCisgIHsKKyAgICBETVhfQlNfTUVUQV9EQVRBICpwQnNNZXRhRGF0YSA9ICZzZWxmLT5ic01ldGFEYXRhWzBdOworCisgICAgaWYgKG1hdHJpeE1peGRvd25QcmVzZW50KSB7CisgICAgICBwQnNNZXRhRGF0YS0+cHNldWRvU3Vycm91bmQgPSAocHNldWRvU3Vycm91bmRFbmFibGUpID8gMSA6IDA7CisgICAgICBwQnNNZXRhRGF0YS0+bWF0cml4TWl4ZG93bklkeCA9IG1hdHJpeE1peGRvd25JZHggJiAweDAzOworICAgICAgcEJzTWV0YURhdGEtPnR5cGVGbGFncyB8PSBUWVBFX1BDRV9EQVRBOworICAgICAgLyogUmVzZXQgZXhwaXJ5IGNvdW50ZXIgKi8KKyAgICAgIHBCc01ldGFEYXRhLT5leHBpcnlDb3VudCA9IDA7CisgICAgfQorICB9CisKKyAgcmV0dXJuIChQQ01ETVhfT0spOworfQorCisvKiogQXBwbHkgZG93biBvciB1cCBtaXhpbmcuCisgKiBAcGFyYW0gW2luXSAgICBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgorICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBidWZmZXIgdGhhdCBob2xkIHRoZSB0aW1lIGRvbWFpbiBzaWduYWwuCisgKiBAcGFyYW0gW2luXSAgICBQb2ludGVyIHdoZXJlIHRoZSBhbW91bnQgb2Ygb3V0cHV0IHNhbXBsZXMgaXMgcmV0dXJuZWQgaW50by4KKyAqIEBwYXJhbSBbaW5dICAgIFNpemUgb2YgcFBjbUJ1Zi4KKyAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgd2hlcmUgdGhlIGFtb3VudCBvZiBvdXRwdXQgY2hhbm5lbHMgaXMgcmV0dXJuZWQgaW50by4KKyAqIEBwYXJhbSBbaW5dICAgIElucHV0IGFuZCBvdXRwdXQgc2FtcGxlcyBhcmUgcHJvY2Vzc2VkIGludGVybGVhdmVkLgorICogQHBhcmFtIFtpbm91dF0gQXJyYXkgd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGZvciBlYWNoIG91dHB1dAorICphdWRpbyBjaGFubmVsIGlzIHN0b3JlZCBpbnRvLgorICogQHBhcmFtIFtpbm91dF0gQXJyYXkgd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGluZGV4IGZvciBlYWNoCisgKm91dHB1dCBhdWRpbyBjaGFubmVsIGlzIHN0b3JlZCBpbnRvLgorICogQHBhcmFtIFtpbl0gICAgQXJyYXkgY29udGFpbmluZyB0aGUgb3V0IGNoYW5uZWwgbWFwcGluZyB0byBiZSB1c2VkIChGcm9tIE1QRUcKKyAqUENFIG9yZGVyaW5nIHRvIHdoYXRldmVyIGlzIHJlcXVpcmVkKS4KKyAqIEBwYXJhbSBbb3V0XSAgIFBvaW50ZXIgb24gYSBmaWVsZCByZWNlaXZpbmcgdGhlIHNjYWxlIGZhY3RvciB0aGF0IGhhcyB0byBiZQorICphcHBsaWVkIG9uIGFsbCBzYW1wbGVzIGFmdGVyd2FyZHMuIElmIHRoZSBoYW5kZWQgcG9pbnRlciBpcyBOVUxMIHNjYWxpbmcgaXMKKyAqZG9uZSBpbnRlcm5hbGx5LgorICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgorICoqLworUENNRE1YX0VSUk9SIHBjbURteF9BcHBseUZyYW1lKEhBTkRMRV9QQ01fRE9XTk1JWCBzZWxmLCBETVhfUENNICpwUGNtQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBwY21CdWZTaXplLCBVSU5UIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm5DaGFubmVscywgSU5UIGZJbnRlcmxlYXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX1RZUEUgY2hhbm5lbFR5cGVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBjaGFubmVsSW5kaWNlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZES19jaGFubmVsTWFwRGVzY3IgKmNvbnN0IG1hcERlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcERteE91dFNjYWxlKSB7CisgIFBDTV9ETVhfVVNFUl9QQVJBTVMgKnBQYXJhbSA9IE5VTEw7CisgIFBDTURNWF9FUlJPUiBlcnJvclN0YXR1cyA9IFBDTURNWF9PSzsKKyAgRFVBTF9DSEFOTkVMX01PREUgZHVhbENoYW5uZWxNb2RlOworICBQQ01fRE1YX0NIQU5ORUxfTU9ERSBpbkNoTW9kZTsKKyAgUENNX0RNWF9DSEFOTkVMX01PREUgb3V0Q2hNb2RlOworICBJTlQgZGV2TnVsbDsgLyogSnVzdCBhIGR1bW15IHRvIGF2b2lkIGEgbG90IG9mIGJyYW5jaGVzIGluIHRoZSBjb2RlICovCisgIGludCBudW1PdXRDaGFubmVscywgbnVtSW5DaGFubmVsczsKKyAgaW50IGluU3RyaWRlLCBvdXRTdHJpZGUsIG9mZnNldDsKKyAgaW50IGRteE1heFNjYWxlLCBkbXhTY2FsZTsKKyAgaW50IHNsb3Q7CisgIFVDSEFSIGluT2Zmc2V0VGFibGVbKDgpXTsKKworICBETVhfQlNfTUVUQV9EQVRBIGJzTWV0YURhdGE7CisKKyAgaWYgKChzZWxmID09IE5VTEwpIHx8IChuQ2hhbm5lbHMgPT0gTlVMTCkgfHwgKGNoYW5uZWxUeXBlID09IE5VTEwpIHx8CisgICAgICAoY2hhbm5lbEluZGljZXMgPT0gTlVMTCkgfHwgKCFGREtfY2hNYXBEZXNjcl9pc1ZhbGlkKG1hcERlc2NyKSkpIHsKKyAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CisgIH0KKworICAvKiBJbml0IHRoZSBvdXRwdXQgc2NhbGluZyAqLworICBkbXhTY2FsZSA9IDA7CisgIGlmIChwRG14T3V0U2NhbGUgIT0gTlVMTCkgeworICAgIC8qIEF2b2lkIGZpbmFsIHNjYWxpbmcgaW50ZXJuYWxseSBhbmQgaGFuZCBpdCB0byB0aGUgb3V0c2lkZSB3b3JsZC4gKi8KKyAgICAqcERteE91dFNjYWxlID0gMDsKKyAgICBkbXhNYXhTY2FsZSA9ICgzKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBBcHBseSB0aGUgc2NhbGluZyBpbnRlcm5hbGx5LiAqLworICAgIHBEbXhPdXRTY2FsZSA9ICZkZXZOdWxsOyAvKiByZWRpcmVjdCB0byB0ZW1wb3JhbCBzdGFjayBtZW1vcnkgKi8KKyAgICBkbXhNYXhTY2FsZSA9IDA7CisgIH0KKworICBwUGFyYW0gPSAmc2VsZi0+dXNlclBhcmFtczsKKyAgbnVtSW5DaGFubmVscyA9ICpuQ2hhbm5lbHM7CisKKyAgLyogUGVyZm9ybSBzb21lIGlucHV0IHNhbml0eSBjaGVja3MgKi8KKyAgaWYgKHBQY21CdWYgPT0gTlVMTCkgeworICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfQVJHVU1FTlQpOworICB9CisgIGlmIChmcmFtZVNpemUgPT0gMCkgeworICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfQVJHVU1FTlQpOworICB9CisgIGlmIChudW1JbkNoYW5uZWxzID09IDApIHsKKyAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0FSR1VNRU5UKTsKKyAgfQorICBpZiAobnVtSW5DaGFubmVscyA+ICg4KSkgeworICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfQ0hfQ09ORklHKTsKKyAgfQorCisgIC8qIENoZWNrIG9uIG1pc2NvbmZpZ3VyYXRpb24gKi8KKyAgRkRLX0FTU0VSVCgocFBhcmFtLT5udW1PdXRDaGFubmVsc01heCA8PSAwKSB8fAorICAgICAgICAgICAgIChwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4ID49IHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNaW4pKTsKKworICAvKiBEZXRlcm1pbmUgaWYgdGhlIG1vZHVsZSBoYXMgdG8gZG8gcHJvY2Vzc2luZyAqLworICBpZiAoKHNlbGYtPmFwcGx5UHJvY2Vzc2luZyA9PSAwKSAmJgorICAgICAgKChwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4IDw9IDApIHx8CisgICAgICAgKHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXggPj0gbnVtSW5DaGFubmVscykpICYmCisgICAgICAocFBhcmFtLT5udW1PdXRDaGFubmVsc01pbiA8PSBudW1JbkNoYW5uZWxzKSkgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICByZXR1cm4gKGVycm9yU3RhdHVzKTsKKyAgfQorCisgIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAqLworICBpZiAoKHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXggPiAwKSAmJgorICAgICAgKG51bUluQ2hhbm5lbHMgPiBwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4KSkgeworICAgIG51bU91dENoYW5uZWxzID0gcFBhcmFtLT5udW1PdXRDaGFubmVsc01heDsKKyAgfSBlbHNlIGlmIChudW1JbkNoYW5uZWxzIDwgcFBhcmFtLT5udW1PdXRDaGFubmVsc01pbikgeworICAgIG51bU91dENoYW5uZWxzID0gcFBhcmFtLT5udW1PdXRDaGFubmVsc01pbjsKKyAgfSBlbHNlIHsKKyAgICBudW1PdXRDaGFubmVscyA9IG51bUluQ2hhbm5lbHM7CisgIH0KKworICAvKiBDaGVjayBJL08gYnVmZmVyIHNpemUgKi8KKyAgaWYgKChVSU5UKXBjbUJ1ZlNpemUgPCAoVUlOVCludW1PdXRDaGFubmVscyAqIGZyYW1lU2l6ZSkgeworICAgIHJldHVybiAoUENNRE1YX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgfQorCisgIGR1YWxDaGFubmVsTW9kZSA9IHBQYXJhbS0+ZHVhbENoYW5uZWxNb2RlOworCisgIC8qIEFuYWx5c2UgaW5wdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGFuZCBnZXQgY2hhbm5lbCBvZmZzZXQKKyAgICogdGFibGUgdGhhdCBjYW4gYmUgYWNjZXNzZWQgd2l0aCB0aGUgZml4ZWQgY2hhbm5lbCBsYWJlbHMuICovCisgIGVycm9yU3RhdHVzID0gZ2V0Q2hhbm5lbE1vZGUobnVtSW5DaGFubmVscywgY2hhbm5lbFR5cGUsIGNoYW5uZWxJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT2Zmc2V0VGFibGUsICZpbkNoTW9kZSk7CisgIGlmIChQQ01ETVhfSVNfRkFUQUxfRVJST1IoZXJyb3JTdGF0dXMpIHx8IChpbkNoTW9kZSA9PSBDSF9NT0RFX1VOREVGSU5FRCkpIHsKKyAgICAvKiBXZSBkb24ndCBuZWVkIHRvIHJlc3RvcmUgYmVjYXVzZSB0aGUgY2hhbm5lbAorICAgICAgIGNvbmZpZ3VyYXRpb24gaGFzIG5vdCBiZWVuIGNoYW5nZWQuIEp1c3QgZXhpdC4gKi8KKyAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0NIX0NPTkZJRyk7CisgIH0KKworICAvKiBTZXQgaW5wdXQgc3RyaWRlIGFuZCBvZmZzZXQgKi8KKyAgaWYgKGZJbnRlcmxlYXZlZCkgeworICAgIGluU3RyaWRlID0gbnVtSW5DaGFubmVsczsKKyAgICBvZmZzZXQgPSAxOyAvKiBDaGFubmVsIHNwZWNpZmljIG9mZnNldCBmYWN0b3IgKi8KKyAgfSBlbHNlIHsKKyAgICBpblN0cmlkZSA9IDE7CisgICAgb2Zmc2V0ID0gZnJhbWVTaXplOyAvKiBDaGFubmVsIHNwZWNpZmljIG9mZnNldCBmYWN0b3IgKi8KKyAgfQorCisgIC8qIFJlc2V0IGRvd25taXggbWV0YSBkYXRhIGlmIG5lY2Vzc2FyeSAqLworICBpZiAoKHBQYXJhbS0+ZXhwaXJ5RnJhbWUgPiAwKSAmJgorICAgICAgKCsrc2VsZi0+YnNNZXRhRGF0YVswXS5leHBpcnlDb3VudCA+CisgICAgICAgcFBhcmFtCisgICAgICAgICAgIC0+ZXhwaXJ5RnJhbWUpKSB7IC8qIFRoZSBtZXRhZGF0YSByZWFkIGZyb20gYml0c3RyZWFtIGlzIHRvbyBvbGQuICovCisjaWZkZWYgRkRLX0FTU0VSVF9FTkFCTEUKKyAgICBQQ01ETVhfRVJST1IgZXJyID0gcGNtRG14X1Jlc2V0KHNlbGYsIFBDTURNWF9SRVNFVF9CU19EQVRBKTsKKyAgICBGREtfQVNTRVJUKGVyciA9PSBQQ01ETVhfT0spOworI2Vsc2UKKyAgICBwY21EbXhfUmVzZXQoc2VsZiwgUENNRE1YX1JFU0VUX0JTX0RBVEEpOworI2VuZGlmCisgIH0KKyAgRkRLbWVtY3B5KCZic01ldGFEYXRhLCAmc2VsZi0+YnNNZXRhRGF0YVtwUGFyYW0tPmZyYW1lRGVsYXldLAorICAgICAgICAgICAgc2l6ZW9mKERNWF9CU19NRVRBX0RBVEEpKTsKKyAgLyogTWFpbnRhaW4gZGVsYXkgbGluZSAqLworICBmb3IgKHNsb3QgPSBwUGFyYW0tPmZyYW1lRGVsYXk7IHNsb3QgPiAwOyBzbG90IC09IDEpIHsKKyAgICBGREttZW1jcHkoJnNlbGYtPmJzTWV0YURhdGFbc2xvdF0sICZzZWxmLT5ic01ldGFEYXRhW3Nsb3QgLSAxXSwKKyAgICAgICAgICAgICAgc2l6ZW9mKERNWF9CU19NRVRBX0RBVEEpKTsKKyAgfQorCisgIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorICAgKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworICBpZiAobnVtSW5DaGFubmVscyA+IG51bU91dENoYW5uZWxzKSB7IC8qIEFwcGx5IGRvd25taXggKi8KKyAgICBETVhfUENNICpwSW5QY21bKDgpXSA9IHtOVUxMfTsKKyAgICBETVhfUENNICpwT3V0UGNtWyg4KV0gPSB7TlVMTH07CisgICAgRklYUF9ETVggbWl4RmFjdG9yc1soOCldWyg4KV07CisgICAgVUNIQVIgb3V0T2Zmc2V0VGFibGVbKDgpXTsKKyAgICBVSU5UIHNhbXBsZTsKKyAgICBpbnQgY2hDZmcgPSAwOworICAgIGludCBieXBTY2FsZSA9IDA7CisKKyAgICBpZiAobnVtSW5DaGFubmVscyA+IFNJWF9DSEFOTkVMKSB7CisgICAgICBBVURJT19DSEFOTkVMX1RZUEUgbXVsdGlQdXJwb3NlQ2hUeXBlWzJdOworCisgICAgICAvKiBHZXQgdGhlIHR5cGUgb2YgdGhlIG11bHRpcHVycG9zZSBjaGFubmVscyAqLworICAgICAgbXVsdGlQdXJwb3NlQ2hUeXBlWzBdID0KKyAgICAgICAgICBjaGFubmVsVHlwZVtpbk9mZnNldFRhYmxlW0xFRlRfTVVMVElQUlBTX0NIQU5ORUxdXTsKKyAgICAgIG11bHRpUHVycG9zZUNoVHlwZVsxXSA9CisgICAgICAgICAgY2hhbm5lbFR5cGVbaW5PZmZzZXRUYWJsZVtSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTF1dOworCisgICAgICAvKiBDaGVjayBpZiB0aGUgaW5wdXQgY29uZmlndXJhdGlvbiBpcyBvbmUgZGVmaW5lZCBpbiB0aGUgc3RhbmRhcmQuICovCisgICAgICBzd2l0Y2ggKGluQ2hNb2RlKSB7CisgICAgICAgIGNhc2UgQ0hfTU9ERV81XzBfMl8xOiAvKiBjaENmZyA3IHx8IDE0ICovCisgICAgICAgICAgLyogRnVydGhlciBhbmFseXNlIHRoZSBpbnB1dCBjb25maWcgdG8gZGlzdGluZ3Vpc2ggdGhlIHR3bworICAgICAgICAgICAqIENIX01PREVfNV8wXzJfMSBjb25maWdzLiAqLworICAgICAgICAgIGlmICgobXVsdGlQdXJwb3NlQ2hUeXBlWzBdID09IEFDVF9GUk9OVF9UT1ApICYmCisgICAgICAgICAgICAgIChtdWx0aVB1cnBvc2VDaFR5cGVbMV0gPT0gQUNUX0ZST05UX1RPUCkpIHsKKyAgICAgICAgICAgIGNoQ2ZnID0gMTQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoQ2ZnID0gNzsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0hfTU9ERV8zXzBfM18xOiAvKiBjaENmZyAxMSAqLworICAgICAgICAgIGNoQ2ZnID0gMTE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0hfTU9ERV8zXzBfNF8xOiAvKiBjaENmZyAxMiAqLworICAgICAgICAgIGNoQ2ZnID0gMTI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgY2hDZmcgPSAwOyAvKiBOb3QgYSBrbm93biBjb25maWcgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTZXQgdGhpcyBzdGFnZXMgb3V0cHV0IHN0cmlkZSBhbmQgY2hhbm5lbCBtb2RlOiAqLworICAgIG91dFN0cmlkZSA9IChmSW50ZXJsZWF2ZWQpID8gbnVtT3V0Q2hhbm5lbHMgOiAxOworICAgIG91dENoTW9kZSA9IG91dENoTW9kZVRhYmxlW251bU91dENoYW5uZWxzXTsKKyAgICBGREtfQVNTRVJUKG91dENoTW9kZSAhPSBDSF9NT0RFX1VOREVGSU5FRCk7CisKKyAgICAvKiBHZXQgY2hhbm5lbCBkZXNjcmlwdGlvbiBhbmQgY2hhbm5lbCBtYXBwaW5nIGZvciB0aGUgZGVzaXJlZCBvdXRwdXQKKyAgICAgKiBjb25maWd1cmF0aW9uLiAqLworICAgIGdldENoYW5uZWxEZXNjcmlwdGlvbihvdXRDaE1vZGUsIG1hcERlc2NyLCBjaGFubmVsVHlwZSwgY2hhbm5lbEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dE9mZnNldFRhYmxlKTsKKyAgICAvKiBOb3cgdGhlcmUgaXMgbm8gd2F5IGJhY2sgYmVjYXVzZSB3ZSBtb2RpZmllZCB0aGUgY2hhbm5lbCBjb25maWd1cmF0aW9uIQorICAgICAqLworCisgICAgLyogQ3JlYXRlIHRoZSBETVggbWF0cml4ICovCisgICAgZXJyb3JTdGF0dXMgPQorICAgICAgICBnZXRNaXhGYWN0b3JzKChjaENmZyA+IDApID8gMSA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgKGNoQ2ZnID4gMCkgPyAoUENNX0RNWF9DSEFOTkVMX01PREUpY2hDZmcgOiBpbkNoTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRDaE1vZGUsIHBQYXJhbSwgJmJzTWV0YURhdGEsIG1peEZhY3RvcnMsICZkbXhTY2FsZSk7CisgICAgLyogTm8gZmF0YWwgZXJyb3JzIGNhbiBvY2N1ciBoZXJlLiBUaGUgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYWx3YXlzIHJldHVybgorICAgICAgIGEgdmFsaWQgbWF0cml4LiBUaGUgZXJyb3IgY29kZSBpcyB1c2VkIHRvIHNpZ25hbCBjb25maWd1cmF0aW9ucyBhbmQKKyAgICAgICBtYXRyaWNlcyB0aGF0IGFyZSBub3QgY29uZm9ybSB0byBhbnkgc3RhbmRhcmQuICovCisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIGZpbmFsIHNjYWxpbmcgKi8KKyAgICBieXBTY2FsZSA9IGZNaW4oZG14TWF4U2NhbGUsIGRteFNjYWxlKTsKKyAgICAqcERteE91dFNjYWxlICs9IGJ5cFNjYWxlOworICAgIGRteFNjYWxlIC09IGJ5cFNjYWxlOworCisgICAgeyAvKiBTZXQgY2hhbm5lbCBwb2ludGVyIGZvciBpbnB1dC4gUmVtb3ZlIGVtcHR5IGNvbHMuICovCisgICAgICBpbnQgaW5DaCwgb3V0Q2gsIG1hcFsoOCldOworICAgICAgaW50IGNoID0gMDsKKyAgICAgIGZvciAoaW5DaCA9IDA7IGluQ2ggPCAoOCk7IGluQ2ggKz0gMSkgeworICAgICAgICBpZiAoaW5PZmZzZXRUYWJsZVtpbkNoXSA8IChVQ0hBUiludW1JbkNoYW5uZWxzKSB7CisgICAgICAgICAgcEluUGNtW2NoXSA9ICZwUGNtQnVmW2luT2Zmc2V0VGFibGVbaW5DaF0gKiBvZmZzZXRdOworICAgICAgICAgIG1hcFtjaCsrXSA9IGluQ2g7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvciAoOyBjaCA8ICg4KTsgY2ggKz0gMSkgeworICAgICAgICBtYXBbY2hdID0gY2g7CisgICAgICB9CisKKyAgICAgIC8qIFJlbW92ZSB1bnVzZWQgY29scyBmcm9tIGZhY3RvciBtYXRyaXggKi8KKyAgICAgIGZvciAoaW5DaCA9IDA7IGluQ2ggPCBudW1JbkNoYW5uZWxzOyBpbkNoICs9IDEpIHsKKyAgICAgICAgaWYgKGluQ2ggIT0gbWFwW2luQ2hdKSB7CisgICAgICAgICAgZm9yIChvdXRDaCA9IDA7IG91dENoIDwgKDgpOyBvdXRDaCArPSAxKSB7CisgICAgICAgICAgICBtaXhGYWN0b3JzW291dENoXVtpbkNoXSA9IG1peEZhY3RvcnNbb3V0Q2hdW21hcFtpbkNoXV07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIFNldCBjaGFubmVsIHBvaW50ZXIgZm9yIG91dHB1dC4gUmVtb3ZlIGVtcHR5IGNvbHMuICovCisgICAgICBjaCA9IDA7CisgICAgICBmb3IgKG91dENoID0gMDsgb3V0Q2ggPCAoOCk7IG91dENoICs9IDEpIHsKKyAgICAgICAgaWYgKG91dE9mZnNldFRhYmxlW291dENoXSA8IChVQ0hBUiludW1PdXRDaGFubmVscykgeworICAgICAgICAgIHBPdXRQY21bY2hdID0gJnBQY21CdWZbb3V0T2Zmc2V0VGFibGVbb3V0Q2hdICogb2Zmc2V0XTsKKyAgICAgICAgICBtYXBbY2grK10gPSBvdXRDaDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yICg7IGNoIDwgKDgpOyBjaCArPSAxKSB7CisgICAgICAgIG1hcFtjaF0gPSBjaDsKKyAgICAgIH0KKworICAgICAgLyogUmVtb3ZlIHVudXNlZCByb3dzIGZyb20gZmFjdG9yIG1hdHJpeCAqLworICAgICAgZm9yIChvdXRDaCA9IDA7IG91dENoIDwgbnVtT3V0Q2hhbm5lbHM7IG91dENoICs9IDEpIHsKKyAgICAgICAgaWYgKG91dENoICE9IG1hcFtvdXRDaF0pIHsKKyAgICAgICAgICBGREttZW1jcHkoJm1peEZhY3RvcnNbb3V0Q2hdLCAmbWl4RmFjdG9yc1ttYXBbb3V0Q2hdXSwKKyAgICAgICAgICAgICAgICAgICAgKDgpICogc2l6ZW9mKEZJWFBfRE1YKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTYW1wbGUgcHJvY2Vzc2luZyBsb29wICovCisgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKSB7CisgICAgICBETVhfUENNIHRJblsoOCldID0gezB9OworICAgICAgRklYUF9EQkwgdE91dFsoOCldID0geyhGSVhQX0RCTCkwfTsKKyAgICAgIGludCBpbkNoLCBvdXRDaDsKKworICAgICAgLyogUHJlbG9hZCBhbGwgaW5wdXQgc2FtcGxlcyAqLworICAgICAgZm9yIChpbkNoID0gMDsgaW5DaCA8IG51bUluQ2hhbm5lbHM7IGluQ2ggKz0gMSkgeworICAgICAgICBpZiAocEluUGNtW2luQ2hdICE9IE5VTEwpIHsKKyAgICAgICAgICB0SW5baW5DaF0gPSAqcEluUGNtW2luQ2hdOworICAgICAgICAgIHBJblBjbVtpbkNoXSArPSBpblN0cmlkZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0SW5baW5DaF0gPSAoRE1YX1BDTSkwOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBBcHBseSBkb3dubWl4IGNvZWZmaWNpZW50cyB0byBpbnB1dCBzYW1wbGVzIGFuZCBhY2N1bXVsYXRlIGZvciBvdXRwdXQKKyAgICAgICAqLworICAgICAgZm9yIChvdXRDaCA9IDA7IG91dENoIDwgbnVtT3V0Q2hhbm5lbHM7IG91dENoICs9IDEpIHsKKyAgICAgICAgZm9yIChpbkNoID0gMDsgaW5DaCA8IG51bUluQ2hhbm5lbHM7IGluQ2ggKz0gMSkgeworICAgICAgICAgIHRPdXRbb3V0Q2hdICs9IGZNdWx0KChETVhfUENNRil0SW5baW5DaF0sIG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdKTsKKyAgICAgICAgfQorICAgICAgICBGREtfQVNTRVJUKHBPdXRQY21bb3V0Q2hdID49IHBQY21CdWYpOworICAgICAgICBGREtfQVNTRVJUKHBPdXRQY21bb3V0Q2hdIDwgJnBQY21CdWZbcGNtQnVmU2l6ZV0pOworICAgICAgICAvKiBXcml0ZSBzYW1wbGUgKi8KKyAgICAgICAgKnBPdXRQY21bb3V0Q2hdID0gKERNWF9QQ00pU0FUVVJBVEVfU0hJRlQoCisgICAgICAgICAgICB0T3V0W291dENoXSwgREZSQUNUX0JJVFMgLSBETVhfUENNX0JJVFMgLSBkbXhTY2FsZSwgRE1YX1BDTV9CSVRTKTsKKyAgICAgICAgcE91dFBjbVtvdXRDaF0gKz0gb3V0U3RyaWRlOworICAgICAgfQorICAgIH0KKworICAgIC8qIFVwZGF0ZSB0aGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAqLworICAgICpuQ2hhbm5lbHMgPSBudW1PdXRDaGFubmVsczsKKworICB9IC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKyAgICAgICAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworICBlbHNlIGlmIChudW1JbkNoYW5uZWxzIDwgbnVtT3V0Q2hhbm5lbHMpIHsgLyogQXBwbHkgcnVkaW1lbnRhcnkgdXBtaXggKi8KKyAgICAvKiBTZXQgdXAgY2hhbm5lbCBwb2ludGVyICovCisgICAgVUNIQVIgb3V0T2Zmc2V0VGFibGVbKDgpXTsKKworICAgIC8qIEZJUlNUIFNUQUdFCisgICAgICAgICBDcmVhdGUgYSBzdGVyZW8vZHVhbCBjaGFubmVsIHNpZ25hbCAqLworICAgIGlmIChudW1JbkNoYW5uZWxzID09IE9ORV9DSEFOTkVMKSB7CisgICAgICBETVhfUENNICpwSW5QY21bKDgpXTsKKyAgICAgIERNWF9QQ00gKnBPdXRMRiwgKnBPdXRSRjsKKyAgICAgIFVJTlQgc2FtcGxlOworCisgICAgICAvKiBTZXQgdGhpcyBzdGFnZXMgb3V0cHV0IHN0cmlkZSBhbmQgY2hhbm5lbCBtb2RlOiAqLworICAgICAgb3V0U3RyaWRlID0gKGZJbnRlcmxlYXZlZCkgPyBUV09fQ0hBTk5FTCA6IDE7CisgICAgICBvdXRDaE1vZGUgPSBvdXRDaE1vZGVUYWJsZVtUV09fQ0hBTk5FTF07CisKKyAgICAgIC8qIEdldCBjaGFubmVsIGRlc2NyaXB0aW9uIGFuZCBjaGFubmVsIG1hcHBpbmcgZm9yIHRoaXMKKyAgICAgICAqIHN0YWdlcyBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzIChhbHdheXMgU1RFUkVPKS4gKi8KKyAgICAgIGdldENoYW5uZWxEZXNjcmlwdGlvbihvdXRDaE1vZGUsIG1hcERlc2NyLCBjaGFubmVsVHlwZSwgY2hhbm5lbEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2Zmc2V0VGFibGUpOworICAgICAgLyogTm93IHRoZXJlIGlzIG5vIHdheSBiYWNrIGJlY2F1c2Ugd2UgbW9kaWZpZWQgdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbiEKKyAgICAgICAqLworCisgICAgICAvKiBTZXQgaW5wdXQgY2hhbm5lbCBwb2ludGVyLiBUaGUgZmlyc3QgY2hhbm5lbCBpcyBhbHdheXMgYXQgaW5kZXggMC4gKi8KKyAgICAgIHBJblBjbVtDRU5URVJfRlJPTlRfQ0hBTk5FTF0gPQorICAgICAgICAgICZwUGNtQnVmWyhmcmFtZVNpemUgLSAxKSAqCisgICAgICAgICAgICAgICAgICAgaW5TdHJpZGVdOyAvKiBDb25zaWRlcmluZyBpbnB1dCBtYXBwaW5nIGNvdWxkIGxlYWQgdG8gYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZCBwb2ludGVyIGhlcmUgaWYgdGhlIGNoYW5uZWwgaXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZCB0byBiZSBhIGZyb250IGNoYW5uZWwuICovCisKKyAgICAgIC8qIFNldCBvdXRwdXQgY2hhbm5lbCBwb2ludGVyIChmb3IgdGhpcyBzdGFnZSkuICovCisgICAgICBwT3V0TEYgPSAmcFBjbUJ1ZltvdXRPZmZzZXRUYWJsZVtMRUZUX0ZST05UX0NIQU5ORUxdICogb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZVNpemUgLSAxKSAqIG91dFN0cmlkZV07CisgICAgICBwT3V0UkYgPSAmcFBjbUJ1ZltvdXRPZmZzZXRUYWJsZVtSSUdIVF9GUk9OVF9DSEFOTkVMXSAqIG9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVTaXplIC0gMSkgKiBvdXRTdHJpZGVdOworCisgICAgICAvKiAxLzAgaW5wdXQ6ICovCisgICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKKyAgICAgICAgLyogTCcgPSBDOyAgUicgPSBDOyAqLworICAgICAgICAqcE91dExGID0gKnBPdXRSRiA9ICpwSW5QY21bQ0VOVEVSX0ZST05UX0NIQU5ORUxdOworCisgICAgICAgIHBJblBjbVtDRU5URVJfRlJPTlRfQ0hBTk5FTF0gLT0gaW5TdHJpZGU7CisgICAgICAgIHBPdXRMRiAtPSBvdXRTdHJpZGU7CisgICAgICAgIHBPdXRSRiAtPSBvdXRTdHJpZGU7CisgICAgICB9CisKKyAgICAgIC8qIFByZXBhcmUgZm9yIG5leHQgc3RhZ2U6ICovCisgICAgICBpblN0cmlkZSA9IG91dFN0cmlkZTsKKyAgICAgIGluQ2hNb2RlID0gb3V0Q2hNb2RlOworICAgICAgRkRLbWVtY3B5KGluT2Zmc2V0VGFibGUsIG91dE9mZnNldFRhYmxlLCAoOCkgKiBzaXplb2YoVUNIQVIpKTsKKyAgICB9CisKKyAgICAvKiBTRUNPTkQgU1RBR0UKKyAgICAgICAgIEV4dGVuZCB3aXRoIHplcm8gY2hhbm5lbHMgdG8gYWNoaWV2ZWQgdGhlIGRlc2lyZWQgbnVtYmVyIG9mIG91dHB1dAorICAgICAgIGNoYW5uZWxzLiAqLworICAgIGlmIChudW1PdXRDaGFubmVscyA+IFRXT19DSEFOTkVMKSB7CisgICAgICBETVhfUENNICpwSW5bKDgpXSA9IHtOVUxMfTsKKyAgICAgIERNWF9QQ00gKnBPdXRbKDgpXSA9IHtOVUxMfTsKKyAgICAgIFVJTlQgc2FtcGxlOworICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGluQ2hUeXBlc1soOCldOworICAgICAgVUNIQVIgaW5DaEluZGljZXNbKDgpXTsKKyAgICAgIFVDSEFSIG51bUNoUGVyR3JwWzJdWyg0KV07CisgICAgICBpbnQgbkNvbnRlbnRDaCA9IDA7IC8qIE51bWJlciBvZiBjaGFubmVscyB3aXRoIGNvbnRlbnQgKi8KKyAgICAgIGludCBuRW1wdHlDaCA9IDA7ICAgLyogTnVtYmVyIG9mIGNoYW5uZWxzIHdpdGggY29udGVudCAqLworICAgICAgaW50IGNoLCBjaEdycCwgaXNDb21wYXRpYmxlID0gMTsKKworICAgICAgLyogRG8gbm90IGNoYW5nZSB0aGUgc2lnbmFsbGluZyB3aGljaCBpcyB0aGUgY2hhbm5lbCB0eXBlcyBhbmQgaW5kaWNlcy4KKyAgICAgICAgIEp1c3QgcmVvcmRlciBhbmQgYWRkIGNoYW5uZWxzLiBTbyBmaXJzdCBzYXZlIHRoZSBpbnB1dCBzaWduYWxsaW5nLiAqLworICAgICAgRkRLbWVtY3B5KGluQ2hUeXBlcywgY2hhbm5lbFR5cGUsCisgICAgICAgICAgICAgICAgbnVtSW5DaGFubmVscyAqIHNpemVvZihBVURJT19DSEFOTkVMX1RZUEUpKTsKKyAgICAgIEZES21lbWNsZWFyKGluQ2hUeXBlcyArIG51bUluQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAoKDgpIC0gbnVtSW5DaGFubmVscykgKiBzaXplb2YoQVVESU9fQ0hBTk5FTF9UWVBFKSk7CisgICAgICBGREttZW1jcHkoaW5DaEluZGljZXMsIGNoYW5uZWxJbmRpY2VzLCBudW1JbkNoYW5uZWxzICogc2l6ZW9mKFVDSEFSKSk7CisgICAgICBGREttZW1jbGVhcihpbkNoSW5kaWNlcyArIG51bUluQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAoKDgpIC0gbnVtSW5DaGFubmVscykgKiBzaXplb2YoVUNIQVIpKTsKKworICAgICAgLyogU2V0IHRoaXMgc3RhZ2VzIG91dHB1dCBzdHJpZGUgYW5kIGNoYW5uZWwgbW9kZTogKi8KKyAgICAgIG91dFN0cmlkZSA9IChmSW50ZXJsZWF2ZWQpID8gbnVtT3V0Q2hhbm5lbHMgOiAxOworICAgICAgb3V0Q2hNb2RlID0gb3V0Q2hNb2RlVGFibGVbbnVtT3V0Q2hhbm5lbHNdOworICAgICAgRkRLX0FTU0VSVChvdXRDaE1vZGUgIT0gQ0hfTU9ERV9VTkRFRklORUQpOworCisgICAgICAvKiBDaGVjayBpZiBpbnB1dCBjaGFubmVsIGNvbmZpZyBjYW4gYmUgZWFzaWx5IG1hcHBlZCB0byB0aGUgZGVzaXJlZAorICAgICAgICogb3V0cHV0IGNvbmZpZy4gKi8KKyAgICAgIGZvciAoY2hHcnAgPSAwOyBjaEdycCA8ICg0KTsgY2hHcnAgKz0gMSkgeworICAgICAgICBudW1DaFBlckdycFtJTl1bY2hHcnBdID0gKGluQ2hNb2RlID4+IChjaEdycCAqIDQpKSAmIDB4RjsKKyAgICAgICAgbnVtQ2hQZXJHcnBbT1VUXVtjaEdycF0gPSAob3V0Q2hNb2RlID4+IChjaEdycCAqIDQpKSAmIDB4RjsKKworICAgICAgICBpZiAobnVtQ2hQZXJHcnBbSU5dW2NoR3JwXSA+IG51bUNoUGVyR3JwW09VVF1bY2hHcnBdKSB7CisgICAgICAgICAgaXNDb21wYXRpYmxlID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoaXNDb21wYXRpYmxlKSB7CisgICAgICAgIC8qIEdldCBuZXcgY2hhbm5lbCBkZXNjcmlwdGlvbiBhbmQgY2hhbm5lbAorICAgICAgICAgKiBtYXBwaW5nIGZvciB0aGUgZGVzaXJlZCBvdXRwdXQgY2hhbm5lbCBtb2RlLiAqLworICAgICAgICBnZXRDaGFubmVsRGVzY3JpcHRpb24ob3V0Q2hNb2RlLCBtYXBEZXNjciwgY2hhbm5lbFR5cGUsIGNoYW5uZWxJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2Zmc2V0VGFibGUpOworICAgICAgICAvKiBJZiB0aGUgaW5wdXQgY29uZmlnIGhhcyBhIGJhY2sgY2VudGVyIGNoYW5uZWwgYnV0IHRoZSBvdXRwdXQKKyAgICAgICAgICAgY29uZmlnIGhhcyBub3QsIGNvcHkgaXQgdG8gbGVmdCBhbmQgcmlnaHQgKGlmIGF2YWlsYWJsZSkuICovCisgICAgICAgIGlmICgobnVtQ2hQZXJHcnBbSU5dW0NIX0dST1VQX1JFQVJdICUgMikgJiYKKyAgICAgICAgICAgICEobnVtQ2hQZXJHcnBbT1VUXVtDSF9HUk9VUF9SRUFSXSAlIDIpKSB7CisgICAgICAgICAgaWYgKG51bUNoUGVyR3JwW0lOXVtDSF9HUk9VUF9SRUFSXSA9PSAxKSB7CisgICAgICAgICAgICBpbk9mZnNldFRhYmxlW1JJR0hUX1JFQVJfQ0hBTk5FTF0gPQorICAgICAgICAgICAgICAgIGluT2Zmc2V0VGFibGVbTEVGVF9SRUFSX0NIQU5ORUxdOworICAgICAgICAgIH0gZWxzZSBpZiAobnVtQ2hQZXJHcnBbSU5dW0NIX0dST1VQX1JFQVJdID09IDMpIHsKKyAgICAgICAgICAgIGluT2Zmc2V0VGFibGVbUklHSFRfTVVMVElQUlBTX0NIQU5ORUxdID0KKyAgICAgICAgICAgICAgICBpbk9mZnNldFRhYmxlW0xFRlRfTVVMVElQUlBTX0NIQU5ORUxdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogSnVzdCBjb3B5IGFuZCBleHRlbmQgdGhlIG9yaWdpbmFsIGNvbmZpZyAqLworICAgICAgICBGREttZW1jcHkob3V0T2Zmc2V0VGFibGUsIGluT2Zmc2V0VGFibGUsICg4KSAqIHNpemVvZihVQ0hBUikpOworICAgICAgfQorCisgICAgICAvKiBTZXQgSS9PIGNoYW5uZWwgcG9pbnRlci4KKyAgICAgICAgIE5vdGU6IFRoZSBmb2xsb3dpbmcgYXNzaWdubWVudCBhbGdvcml0aG0gY2xlYXJzIHRoZSBjaGFubmVsIG9mZnNldAorICAgICAgICAgdGFibGVzLiBUaHVzIHRoZXkgY2FuIG5vdCBiZSB1c2VkIGFmdGVyd2FyZHMuICovCisgICAgICBmb3IgKGNoID0gMDsgY2ggPCAoOCk7IGNoICs9IDEpIHsKKyAgICAgICAgaWYgKChvdXRPZmZzZXRUYWJsZVtjaF0gPCAyNTUpICYmCisgICAgICAgICAgICAoaW5PZmZzZXRUYWJsZVtjaF0gPCAyNTUpKSB7IC8qIFNldCBJL08gcG9pbnRlcjogKi8KKyAgICAgICAgICBwSW5bbkNvbnRlbnRDaF0gPQorICAgICAgICAgICAgICAmcFBjbUJ1Zltpbk9mZnNldFRhYmxlW2NoXSAqIG9mZnNldCArIChmcmFtZVNpemUgLSAxKSAqIGluU3RyaWRlXTsKKyAgICAgICAgICBwT3V0W25Db250ZW50Q2hdID0gJnBQY21CdWZbb3V0T2Zmc2V0VGFibGVbY2hdICogb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lU2l6ZSAtIDEpICogb3V0U3RyaWRlXTsKKyAgICAgICAgICAvKiBVcGRhdGUgc2lnbmFsbGluZyAqLworICAgICAgICAgIGNoYW5uZWxUeXBlW291dE9mZnNldFRhYmxlW2NoXV0gPSBpbkNoVHlwZXNbaW5PZmZzZXRUYWJsZVtjaF1dOworICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW291dE9mZnNldFRhYmxlW2NoXV0gPSBpbkNoSW5kaWNlc1tpbk9mZnNldFRhYmxlW2NoXV07CisgICAgICAgICAgaW5PZmZzZXRUYWJsZVtjaF0gPSAyNTU7CisgICAgICAgICAgb3V0T2Zmc2V0VGFibGVbY2hdID0gMjU1OworICAgICAgICAgIG5Db250ZW50Q2ggKz0gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGlzQ29tcGF0aWJsZSkgeworICAgICAgICAvKiBBc3NpZ24gdGhlIHJlbWFpbmluZyBpbnB1dCBjaGFubmVscy4KKyAgICAgICAgICAgVGhpcyBpcyBqdXN0IGEgc2FmZXR5IGFwcGxpYW5jZS4gV2Ugc2hvdWxkIG5ldmVyIG5lZWQgaXQuICovCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8ICg4KTsgY2ggKz0gMSkgeworICAgICAgICAgIGlmIChpbk9mZnNldFRhYmxlW2NoXSA8IDI1NSkgeworICAgICAgICAgICAgaW50IG91dENoOworICAgICAgICAgICAgZm9yIChvdXRDaCA9IDA7IG91dENoIDwgKDgpOyBvdXRDaCArPSAxKSB7CisgICAgICAgICAgICAgIGlmIChvdXRPZmZzZXRUYWJsZVtvdXRDaF0gPCAyNTUpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG91dENoID49ICg4KSkgeworICAgICAgICAgICAgICBGREtfQVNTRVJUKDApOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFNldCBJL08gcG9pbnRlcjogKi8KKyAgICAgICAgICAgIHBJbltuQ29udGVudENoXSA9ICZwUGNtQnVmW2luT2Zmc2V0VGFibGVbY2hdICogb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZVNpemUgLSAxKSAqIGluU3RyaWRlXTsKKyAgICAgICAgICAgIHBPdXRbbkNvbnRlbnRDaF0gPSAmcFBjbUJ1ZltvdXRPZmZzZXRUYWJsZVtvdXRDaF0gKiBvZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZVNpemUgLSAxKSAqIG91dFN0cmlkZV07CisgICAgICAgICAgICAvKiBVcGRhdGUgc2lnbmFsbGluZyAqLworICAgICAgICAgICAgRkRLX0FTU0VSVChpbk9mZnNldFRhYmxlW291dENoXSA8IG51bUluQ2hhbm5lbHMpOworICAgICAgICAgICAgRkRLX0FTU0VSVChvdXRPZmZzZXRUYWJsZVtvdXRDaF0gPCBudW1PdXRDaGFubmVscyk7CisgICAgICAgICAgICBjaGFubmVsVHlwZVtvdXRPZmZzZXRUYWJsZVtvdXRDaF1dID0gaW5DaFR5cGVzW2luT2Zmc2V0VGFibGVbY2hdXTsKKyAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW291dE9mZnNldFRhYmxlW291dENoXV0gPQorICAgICAgICAgICAgICAgIGluQ2hJbmRpY2VzW2luT2Zmc2V0VGFibGVbY2hdXTsKKyAgICAgICAgICAgIGluT2Zmc2V0VGFibGVbY2hdID0gMjU1OworICAgICAgICAgICAgb3V0T2Zmc2V0VGFibGVbb3V0Q2hdID0gMjU1OworICAgICAgICAgICAgbkNvbnRlbnRDaCArPSAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBTZXQgdGhlIHJlbWFpbmluZyBvdXRwdXQgY2hhbm5lbCBwb2ludGVyICovCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8ICg4KTsgY2ggKz0gMSkgeworICAgICAgICAgIGlmIChvdXRPZmZzZXRUYWJsZVtjaF0gPCAyNTUpIHsKKyAgICAgICAgICAgIHBPdXRbbkNvbnRlbnRDaCArIG5FbXB0eUNoXSA9ICZwUGNtQnVmW291dE9mZnNldFRhYmxlW2NoXSAqIG9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVTaXplIC0gMSkgKiBvdXRTdHJpZGVdOworICAgICAgICAgICAgLyogRXhwYW5kIG91dHB1dCBzaWduYWxsaW5nICovCisgICAgICAgICAgICBjaGFubmVsVHlwZVtvdXRPZmZzZXRUYWJsZVtjaF1dID0gQUNUX05PTkU7CisgICAgICAgICAgICBjaGFubmVsSW5kaWNlc1tvdXRPZmZzZXRUYWJsZVtjaF1dID0gKFVDSEFSKW5FbXB0eUNoOworICAgICAgICAgICAgb3V0T2Zmc2V0VGFibGVbY2hdID0gMjU1OworICAgICAgICAgICAgbkVtcHR5Q2ggKz0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFNldCB0aGUgcmVtYWluaW5nIG91dHB1dCBjaGFubmVsIHBvaW50ZXIgKi8KKyAgICAgICAgZm9yIChjaCA9IG5Db250ZW50Q2g7IGNoIDwgbnVtT3V0Q2hhbm5lbHM7IGNoICs9IDEpIHsKKyAgICAgICAgICBwT3V0W2NoXSA9ICZwUGNtQnVmW2NoICogb2Zmc2V0ICsgKGZyYW1lU2l6ZSAtIDEpICogb3V0U3RyaWRlXTsKKyAgICAgICAgICAvKiBFeHBhbmQgb3V0cHV0IHNpZ25hbGxpbmcgKi8KKyAgICAgICAgICBjaGFubmVsVHlwZVtjaF0gPSBBQ1RfTk9ORTsKKyAgICAgICAgICBjaGFubmVsSW5kaWNlc1tjaF0gPSAoVUNIQVIpbkVtcHR5Q2g7CisgICAgICAgICAgbkVtcHR5Q2ggKz0gMTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBGaXJzdCBjb3B5IHRoZSBjaGFubmVscyB0aGF0IGhhdmUgc2lnbmFsICovCisgICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlICs9IDEpIHsKKyAgICAgICAgRE1YX1BDTSB0SW5bKDgpXTsKKyAgICAgICAgLyogUmVhZCBhbGwgY2hhbm5lbCBzYW1wbGVzICovCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5Db250ZW50Q2g7IGNoICs9IDEpIHsKKyAgICAgICAgICB0SW5bY2hdID0gKnBJbltjaF07CisgICAgICAgICAgcEluW2NoXSAtPSBpblN0cmlkZTsKKyAgICAgICAgfQorICAgICAgICAvKiBXcml0ZSBhbGwgY2hhbm5lbCBzYW1wbGVzICovCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5Db250ZW50Q2g7IGNoICs9IDEpIHsKKyAgICAgICAgICAqcE91dFtjaF0gPSB0SW5bY2hdOworICAgICAgICAgIHBPdXRbY2hdIC09IG91dFN0cmlkZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBDbGVhciBhbGwgdGhlIG90aGVyIGNoYW5uZWxzICovCisgICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKKyAgICAgICAgZm9yIChjaCA9IG5Db250ZW50Q2g7IGNoIDwgbnVtT3V0Q2hhbm5lbHM7IGNoICs9IDEpIHsKKyAgICAgICAgICAqcE91dFtjaF0gPSAoRE1YX1BDTSkwOworICAgICAgICAgIHBPdXRbY2hdIC09IG91dFN0cmlkZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIHVwZGF0ZSB0aGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAqLworICAgICpuQ2hhbm5lbHMgPSBudW1PdXRDaGFubmVsczsKKyAgfSAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisgICAgICAgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKyAgZWxzZSBpZiAobnVtSW5DaGFubmVscyA9PSBudW1PdXRDaGFubmVscykgeworICAgIC8qIERvbid0IG5lZWQgdG8gY2hhbmdlIHRoZSBjaGFubmVsIGRlc2NyaXB0aW9uIGhlcmUgKi8KKworICAgIHN3aXRjaCAobnVtSW5DaGFubmVscykgeworICAgICAgY2FzZSAyOiB7IC8qIFNldCB1cCBjaGFubmVsIHBvaW50ZXIgKi8KKyAgICAgICAgRE1YX1BDTSAqcEluUGNtWyg4KV07CisgICAgICAgIERNWF9QQ00gKnBPdXRMLCAqcE91dFI7CisgICAgICAgIEZJWFBfRE1YIGZsZXY7CisKKyAgICAgICAgVUlOVCBzYW1wbGU7CisKKyAgICAgICAgaWYgKGZJbnRlcmxlYXZlZCkgeworICAgICAgICAgIGluU3RyaWRlID0gbnVtSW5DaGFubmVsczsKKyAgICAgICAgICBvdXRTdHJpZGUgPQorICAgICAgICAgICAgICAyOyAvKiBmaXhlZCAhISEgKGJlbG93IHN0ZXJlbyBpcyBkb253bWl4ZWQgdG8gbW9ubyBpZiByZXF1aXJlZCAqLworICAgICAgICAgIG9mZnNldCA9IDE7IC8qIENoYW5uZWwgc3BlY2lmaWMgb2Zmc2V0IGZhY3RvciAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluU3RyaWRlID0gMTsKKyAgICAgICAgICBvdXRTdHJpZGUgPSAxOworICAgICAgICAgIG9mZnNldCA9IGZyYW1lU2l6ZTsgLyogQ2hhbm5lbCBzcGVjaWZpYyBvZmZzZXQgZmFjdG9yICovCisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgaW5wdXQgY2hhbm5lbCBwb2ludGVyICovCisgICAgICAgIHBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdID0KKyAgICAgICAgICAgICZwUGNtQnVmW2luT2Zmc2V0VGFibGVbTEVGVF9GUk9OVF9DSEFOTkVMXSAqIG9mZnNldF07CisgICAgICAgIHBJblBjbVtSSUdIVF9GUk9OVF9DSEFOTkVMXSA9CisgICAgICAgICAgICAmcFBjbUJ1Zltpbk9mZnNldFRhYmxlW1JJR0hUX0ZST05UX0NIQU5ORUxdICogb2Zmc2V0XTsKKworICAgICAgICAvKiBTZXQgb3V0cHV0IGNoYW5uZWwgcG9pbnRlciAoc2FtZSBhcyBpbnB1dCkgKi8KKyAgICAgICAgcE91dEwgPSBwSW5QY21bTEVGVF9GUk9OVF9DSEFOTkVMXTsKKyAgICAgICAgcE91dFIgPSBwSW5QY21bUklHSFRfRlJPTlRfQ0hBTk5FTF07CisKKyAgICAgICAgLyogU2V0IGRvd25taXggbGV2ZWxzOiAqLworICAgICAgICBmbGV2ID0gRkwyRlhDT05TVF9ETVgoMC43MDcxMDY3OGYpOworICAgICAgICAvKiAyLzAgaW5wdXQ6ICovCisgICAgICAgIHN3aXRjaCAoZHVhbENoYW5uZWxNb2RlKSB7CisgICAgICAgICAgY2FzZSBDSDFfTU9ERTogLyogTCcgPSAwLjcwNyAqIENoMTsgIFInID0gMC43MDcgKiBDaDEgKi8KKyAgICAgICAgICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrKykgeworICAgICAgICAgICAgICAqcE91dEwgPSAqcE91dFIgPSAoRE1YX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVCgKKyAgICAgICAgICAgICAgICAgIGZNdWx0KChETVhfUENNRikqcEluUGNtW0xFRlRfRlJPTlRfQ0hBTk5FTF0sIGZsZXYpLAorICAgICAgICAgICAgICAgICAgREZSQUNUX0JJVFMgLSBETVhfUENNX0JJVFMsIERNWF9QQ01fQklUUyk7CisKKyAgICAgICAgICAgICAgcEluUGNtW0xFRlRfRlJPTlRfQ0hBTk5FTF0gKz0gaW5TdHJpZGU7CisgICAgICAgICAgICAgIHBPdXRMICs9IG91dFN0cmlkZTsKKyAgICAgICAgICAgICAgcE91dFIgKz0gb3V0U3RyaWRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBDSDJfTU9ERTogLyogTCcgPSAwLjcwNyAqIENoMjsgIFInID0gMC43MDcgKiBDaDIgKi8KKyAgICAgICAgICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrKykgeworICAgICAgICAgICAgICAqcE91dEwgPSAqcE91dFIgPSAoRE1YX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVCgKKyAgICAgICAgICAgICAgICAgIGZNdWx0KChETVhfUENNRikqcEluUGNtW1JJR0hUX0ZST05UX0NIQU5ORUxdLCBmbGV2KSwKKyAgICAgICAgICAgICAgICAgIERGUkFDVF9CSVRTIC0gRE1YX1BDTV9CSVRTLCBETVhfUENNX0JJVFMpOworCisgICAgICAgICAgICAgIHBJblBjbVtSSUdIVF9GUk9OVF9DSEFOTkVMXSArPSBpblN0cmlkZTsKKyAgICAgICAgICAgICAgcE91dEwgKz0gb3V0U3RyaWRlOworICAgICAgICAgICAgICBwT3V0UiArPSBvdXRTdHJpZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIE1JWEVEX01PREU6IC8qIEwnID0gMC41KkNoMSArIDAuNSpDaDI7ICBSJyA9IDAuNSpDaDEgKyAwLjUqQ2gyICovCisgICAgICAgICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKKyAgICAgICAgICAgICAgKnBPdXRMID0gKnBPdXRSID0gKCpwSW5QY21bTEVGVF9GUk9OVF9DSEFOTkVMXSA+PiAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcEluUGNtW1JJR0hUX0ZST05UX0NIQU5ORUxdID4+IDEpOworCisgICAgICAgICAgICAgIHBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdICs9IGluU3RyaWRlOworICAgICAgICAgICAgICBwSW5QY21bUklHSFRfRlJPTlRfQ0hBTk5FTF0gKz0gaW5TdHJpZGU7CisgICAgICAgICAgICAgIHBPdXRMICs9IG91dFN0cmlkZTsKKyAgICAgICAgICAgICAgcE91dFIgKz0gb3V0U3RyaWRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBjYXNlIFNURVJFT19NT0RFOgorICAgICAgICAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIChlcnJvclN0YXR1cyk7Cit9CisKKy8qKiBDbG9zZSBhbiBpbnN0YW5jZSBvZiB0aGUgUENNIGRvd25taXggbW9kdWxlLgorICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSBoYW5kbGUgb2YgdGhlIGluc3RhbmNlLgorICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgorICoqLworUENNRE1YX0VSUk9SIHBjbURteF9DbG9zZShIQU5ETEVfUENNX0RPV05NSVggKnBTZWxmKSB7CisgIGlmIChwU2VsZiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOworICB9CisKKyAgRnJlZVBjbURteEluc3RhbmNlKHBTZWxmKTsKKyAgKnBTZWxmID0gTlVMTDsKKworICByZXR1cm4gKFBDTURNWF9PSyk7Cit9CisKKy8qKiBHZXQgbGlicmFyeSBpbmZvIGZvciB0aGlzIG1vZHVsZS4KKyAqIEBwYXJhbSBbb3V0XSBQb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBMSUJfSU5GTyBzdHJ1Y3R1cmUuCisgKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCisgKi8KK1BDTURNWF9FUlJPUiBwY21EbXhfR2V0TGliSW5mbyhMSUJfSU5GTyAqaW5mbykgeworICBpbnQgaTsKKworICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFBDTURNWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisKKyAgLyogU2VhcmNoIGZvciBuZXh0IGZyZWUgdGFiICovCisgIGZvciAoaSA9IDA7IGkgPCBGREtfTU9EVUxFX0xBU1Q7IGkrKykgeworICAgIGlmIChpbmZvW2ldLm1vZHVsZV9pZCA9PSBGREtfTk9ORSkgYnJlYWs7CisgIH0KKyAgaWYgKGkgPT0gRkRLX01PRFVMRV9MQVNUKSB7CisgICAgcmV0dXJuIFBDTURNWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisKKyAgLyogQWRkIHRoZSBsaWJyYXJ5IGluZm8gKi8KKyAgaW5mb1tpXS5tb2R1bGVfaWQgPSBGREtfUENNRE1YOworICBpbmZvW2ldLnZlcnNpb24gPQorICAgICAgTElCX1ZFUlNJT04oUENNVVRJTF9MSUJfVkwwLCBQQ01VVElMX0xJQl9WTDEsIFBDTVVUSUxfTElCX1ZMMik7CisgIExJQl9WRVJTSU9OX1NUUklORyhpbmZvICsgaSk7CisgIGluZm9baV0uYnVpbGRfZGF0ZSA9IFBDTVVUSUxfTElCX0JVSUxEX0RBVEU7CisgIGluZm9baV0uYnVpbGRfdGltZSA9IFBDTVVUSUxfTElCX0JVSUxEX1RJTUU7CisgIGluZm9baV0udGl0bGUgPSBQQ01ETVhfTElCX1RJVExFOworCisgIC8qIFNldCBmbGFncyAqLworICBpbmZvW2ldLmZsYWdzID0gMCB8IENBUEZfRE1YX0JMSU5EIC8qIEF0IGxlYXN0IGJsaW5kIGRvd25taXhpbmcgaXMgcG9zc2libGUgKi8KKyAgICAgICAgICAgICAgICAgIHwgQ0FQRl9ETVhfUENFICAgICAvKiBHdWlkZWQgZG93bm1peCB3aXRoIGRhdGEgZnJvbSBNUEVHLTIvNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW0gQ29uZmlnIEVsZW1lbnRzIChQQ0UpLiAqLworICAgICAgICAgICAgICAgICAgfCBDQVBGX0RNWF9BUklCIC8qIFBDRSBndWlkZWQgZG93bm1peCB3aXRoIHNsaWdodGx5IGRpZmZlcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWF0aW9ucyBhbmQgbGV2ZWxzLiAqLworICAgICAgICAgICAgICAgICAgfCBDQVBGX0RNWF9EVkIgIC8qIEd1aWRlZCBkb3dubWl4IHdpdGggZGF0YSBmcm9tIERWQiBhbmNpbGxhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGZpZWxkcy4gKi8KKyAgICAgICAgICAgICAgICAgIHwgQ0FQRl9ETVhfQ0hfRVhQIC8qIFNpbXBsZSB1cG1peGluZyBieSBkdWJsaWNhdGluZyBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYWRkaW5nIHplcm8gY2hhbm5lbHMuICovCisgICAgICAgICAgICAgICAgICB8IENBUEZfRE1YXzZfQ0ggfCBDQVBGX0RNWF84X0NIOworCisgIC8qIEFkZCBsaWIgaW5mbyBmb3IgRkRLIHRvb2xzIChpZiBub3QgeWV0IGRvbmUpLiAqLworICBGREtfdG9vbHNHZXRMaWJJbmZvKGluZm8pOworCisgIHJldHVybiBQQ01ETVhfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJQQ011dGlscy9zcmMvcGNtdXRpbHNfbGliLmNwcCBiL2xpYlBDTXV0aWxzL3NyYy9wY211dGlsc19saWIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzAzZDE2Li4wMDAwMDAwCi0tLSBhL2xpYlBDTXV0aWxzL3NyYy9wY211dGlsc19saWIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjUxMCArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZESyBQQ00gdXRpbHMgbW9kdWxlICAqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEdyaWViZWwKLSAgIERlc2NyaXB0aW9uOiBEZWZpbmVzIGZ1bmN0aW9ucyB0aGF0IHBlcmZvcm0gZG93bm1peGluZyBvciBhIHNpbXBsZSBjaGFubmVsCi0gICAgICAgICAgICAgICAgZXhwYW5zaW9uIGluIHRoZSBQQ00gdGltZSBkb21haW4uCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fbGludXhfXwotI2luY2x1ZGUgPGxvZy9sb2cuaD4KLSNlbmRpZgotI2luY2x1ZGUgInBjbXV0aWxzX2xpYi5oIgotCi0jaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKLSNpbmNsdWRlICJmaXhwb2ludF9tYXRoLmgiCi0jaW5jbHVkZSAiRkRLX2NvcmUuaCIKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgotICogIEdMT0JBTCBTRVRUSU5HUyAoR0ZSKTogICoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBEU0VfTUVUQURBVEFfRU5BQkxFICAgICAgICAgIC8qITwgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCBNUEVHL0VUU0kgRFZCIGFuY2lsbGFyeSBkYXRhIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlciBhc3Npc3RlZCBkb3dubWl4aW5nIG9mIE1QRUctNCBBQUMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHLTEvMiBsYXllciAyIHN0cmVhbXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBQQ0VfTUVUQURBVEFfRU5BQkxFICAgICAgICAgIC8qITwgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCBNUEVHIG1hdHJpeCBtaXhkb3duIHdpdGggYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZpY2llbnQgY2FycmllZCBpbiB0aGUgUENFLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBQQ01fRE1YX01BWF9JTl9DSEFOTkVMUyAgICAgICAgICAoIDggKSAgIC8qIE5laXRoZXIgdGhlIG1heGltdW0gbnVtYmVyIG9mIGlucHV0IG5vciB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzIC4uLiAqLwotI2RlZmluZSBQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMgICAgICAgICAoIDggKSAgIC8qIC4uLiBtdXN0IGV4Y2VlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgdGhhdCB0aGUgZnJhbWV3b3JrIGNhbiBoYW5kbGUuICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCi0gKiAgICBTUEVDSUZJQyBTRVRUSU5HUzogICAgKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0jZGVmaW5lIFBDTV9DSEFOTkVMX0VYVEVOU0lPTl9FTkFCTEUgICAgICAgICAgICAgLyohPCBBbGxvdyBtb2R1bGUgdG8gZHVwbGljYXRlIG1vbm8gc2lnbmFscyBvciBhZGQgemVybyBjaGFubmVscyB0byBhY2hpZXZlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZCBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiAqLwotCi0jZGVmaW5lIFBDTV9ETVhfREZMVF9NQVhfT1VUX0NIQU5ORUxTICAgICggNiApICAgLyohPCBUaGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiBJZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDAgdGhlIG1vZHVsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIG1peGRvd24gZm9yIGFsbCBpbnB1dCBzaWduYWxzIHdpdGggbW9yZSBjaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhbiBzcGVjaWZpZWQuICovCi0jZGVmaW5lIFBDTV9ETVhfREZMVF9NSU5fT1VUX0NIQU5ORUxTICAgICggMCApICAgLyohPCBUaGUgbWluaW11bSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiBJZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDAgdGhlIG1vZHVsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBkbyBjaGFubmVsIGV4dGVuc2lvbiBhdXRvbWF0aWNhbGx5IGZvciBhbGwgaW5wdXQgc2lnbmFscyB3aXRoIGxlc3MgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gc3BlY2lmaWVkLiAqLwotI2RlZmluZSBQQ01fRE1YX01BWF9ERUxBWV9GUkFNRVMgICAgICAgICAoIDEgKSAgIC8qITwgVGhlIG1heGltdW0gZGVsYXkgZnJhbWVzIHRvIGFsaWduIHRoZSBiaXRzdHJlYW1zIHBheWxvYWQgd2l0aCB0aGUgUENNIG91dHB1dC4gKi8KLSNkZWZpbmUgUENNX0RNWF9ERkxUX0VYUElSWV9GUkFNRSAgICAgICAgKCA1MCApICAvKiE8IElmIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiAwIHRoZSBtaXhkb3duIGNvZWZmaWNpZW50cyB3aWxsIGV4cGlyZSBieSBkZWZhdWx0IGFmdGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gbnVtYmVyIG9mIGZyYW1lcy4gVGhlIHZhbHVlIDUwIGNvcnJlc3BvbmRzIHRvIGF0IGxlYXN0IDUwMG1zIChGTCA5NjAgQCA5NmtIeikgKi8KLS8qICNkZWZpbmUgUENNRE1YX0RFQlVHICovCi0KLS8qIERlcml2ZWQgc2V0dGluZzoKLSAqICAgTm8gbmVlZCB0byBlZGl0IGJleW9uZCB0aGlzIGxpbmUuICovCi0jaWYgZGVmaW5lZChEU0VfTUVUQURBVEFfRU5BQkxFKSB8fCBkZWZpbmVkKFBDRV9NRVRBREFUQV9FTkFCTEUpIHx8IGRlZmluZWQoQVJJQl9NSVhET1dOX0VOQUJMRSkKLSAjZGVmaW5lIFBDTV9ET1dOTUlYX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEdlbmVyYWxseSBlbmFibGUgZG93biBtaXhpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZW5kaWYKLSNpZiAoUENNX0RNWF9NQVhfSU5fQ0hBTk5FTFMgPiAyKSB8fCAoUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTID4gMikKLSAjZGVmaW5lIFBDTV9ETVhfTUFYX0NIQU5ORUxTICAgICAgICAgICAgKCA4ICkKLSAjZGVmaW5lIFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTICAgICAgKCA0ICkKLSAjZGVmaW5lIFBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUCAgUENNX0RNWF9NQVhfQ0hBTk5FTFMgICAvKiBBbGwgY2hhbm5lbHMgY2FuIGJlIGluIG9uZSBncm91cCAqLwotI2Vsc2UKLSAjZGVmaW5lIFBDTV9ETVhfTUFYX0NIQU5ORUxTICAgICAgICAgICAgKCAzICkgICAvKiBOZWVkIHRvIGFkZCAxIGJlY2F1c2UgdGhlcmUgYXJlIHRocmVlIGNoYW5uZWwgcG9zaXRpb25zIGluIGZpcnN0IGNoYW5uZWwgZ3JvdXAuICovCi0gI2RlZmluZSBQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUyAgICAgICggMSApICAgLyogT25seSBmcm9udCBjaGFubmVscyBzdXBwb3J0ZWQuICovCi0gI2RlZmluZSBQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAgICggMiApICAgLyogVGhlIG1heGltdW0gb3ZlciBhbGwgY2hhbm5lbCBncm91cHMgKi8KLSNlbmRpZgotI2lmIChQQ01fRE1YX01BWF9JTl9DSEFOTkVMUyA+IFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUykKLSAjZGVmaW5lIFBDTV9ETVhfTUFYX0lPX0NIQU5ORUxTICBQQ01fRE1YX01BWF9JTl9DSEFOTkVMUwotI2Vsc2UKLSAjZGVmaW5lIFBDTV9ETVhfTUFYX0lPX0NIQU5ORUxTICBQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMKLSNlbmRpZgotCi0vKiBEZWNvZGVyIGxpYnJhcnkgaW5mbyAqLwotI2RlZmluZSBQQ01ETVhfTElCX1ZMMCAyCi0jZGVmaW5lIFBDTURNWF9MSUJfVkwxIDQKLSNkZWZpbmUgUENNRE1YX0xJQl9WTDIgMgotI2RlZmluZSBQQ01ETVhfTElCX1RJVExFICJQQ00gRG93bm1peCBMaWIiCi0jaWZkZWYgX19BTkRST0lEX18KLSNkZWZpbmUgUENNRE1YX0xJQl9CVUlMRF9EQVRFICIiCi0jZGVmaW5lIFBDTURNWF9MSUJfQlVJTERfVElNRSAiIgotI2Vsc2UKLSNkZWZpbmUgUENNRE1YX0xJQl9CVUlMRF9EQVRFIF9fREFURV9fCi0jZGVmaW5lIFBDTURNWF9MSUJfQlVJTERfVElNRSBfX1RJTUVfXwotI2VuZGlmCi0KLQotLyogRml4ZWQgYW5kIHVuaXF1ZSBjaGFubmVsIGdyb3VwIGluZGljZXMuCi0gKiBUaGUgbGFzdCBncm91cCBpbmRleCBoYXMgdG8gYmUgc21hbGxlciB0aGFuIFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTLiAqLwotI2RlZmluZSBDSF9HUk9VUF9GUk9OVCAoIDAgKQotI2RlZmluZSBDSF9HUk9VUF9TSURFICAoIDEgKQotI2RlZmluZSBDSF9HUk9VUF9SRUFSICAoIDIgKQotI2RlZmluZSBDSF9HUk9VUF9MRkUgICAoIDMgKQotCi0vKiBUaGUgb3JkZXJpbmcgb2YgdGhlIGZvbGxvd2luZyBmaXhlZCBjaGFubmVsIGxhYmVscyBoYXMgdG8gYmUgaW4gTVBFRy00IHN0eWxlLgotICogRnJvbSB0aGUgY2VudGVyIHRvIHRoZSBiYWNrIHdpdGggbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBpbnRlcmxlYXZlZCAoc3RhcnRpbmcgd2l0aCBsZWZ0KS4KLSAqIFRoZSBsYXN0IGNoYW5uZWwgbGFiZWwgaW5kZXggaGFzIHRvIGJlIHNtYWxsZXIgdGhhbiBQQ01fRE1YX01BWF9DSEFOTkVMUy4gKi8KLSNkZWZpbmUgQ0VOVEVSX0ZST05UX0NIQU5ORUwgICAgKCAwICkgICAgIC8qIEMgICovCi0jZGVmaW5lIExFRlRfRlJPTlRfQ0hBTk5FTCAgICAgICggMSApICAgICAvKiBMICAqLwotI2RlZmluZSBSSUdIVF9GUk9OVF9DSEFOTkVMICAgICAoIDIgKSAgICAgLyogUiAgKi8KLSNkZWZpbmUgTEVGVF9SRUFSX0NIQU5ORUwgICAgICAgKCAzICkgICAgIC8qIExyIChha2EgbGVmdCBiYWNrIGNoYW5uZWwpIG9yIGNlbnRlciBiYWNrIGNoYW5uZWwgKi8KLSNkZWZpbmUgUklHSFRfUkVBUl9DSEFOTkVMICAgICAgKCA0ICkgICAgIC8qIFJyIChha2EgcmlnaHQgYmFjayBjaGFubmVsKSAqLwotI2RlZmluZSBMT1dfRlJFUVVFTkNZX0NIQU5ORUwgICAoIDUgKSAgICAgLyogTGYgKi8KLSNkZWZpbmUgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCAgKCA2ICkgICAgIC8qIExlZnQgbXVsdGlwdXJwb3NlIGNoYW5uZWwgKi8KLSNkZWZpbmUgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwgKCA3ICkgICAgIC8qIFJpZ2h0IG11bHRpcHVycG9zZSBjaGFubmVsICovCi0KLS8qIE1vcmUgY29uc3RhbnRzICovCi0jZGVmaW5lIE9ORV9DSEFOTkVMICAgICAgICAgICAgICggMSApCi0jZGVmaW5lIFRXT19DSEFOTkVMICAgICAgICAgICAgICggMiApCi0jZGVmaW5lIFNJWF9DSEFOTkVMICAgICAgICAgICAgICggNiApCi0jZGVmaW5lIEVJR0hUX0NIQU5ORUwgICAgICAgICAgICggOCApCi0KLSNkZWZpbmUgUENNRE1YX0FfSURYX0RFRkFVTFQgICAgKCAyICkKLSNkZWZpbmUgUENNRE1YX0JfSURYX0RFRkFVTFQgICAgKCAyICkKLSNkZWZpbmUgUENNRE1YX0xGRV9JRFhfREVGQVVMVCAgKCAxNSApCi0jZGVmaW5lIFBDTURNWF9HQUlOXzVfREVGQVVMVCAgICggMCApCi0jZGVmaW5lIFBDTURNWF9HQUlOXzJfREVGQVVMVCAgICggMCApCi0KLSNkZWZpbmUgUENNRE1YX01BWF9IRUFEUk9PTSAgICAgKCAzICkgICAgIC8qIERlZmluZXMgdGhlIG1heGltdW0gUENNIHNjYWxpbmcgaGVhZHJvb20gdGhhdCBjYW4gYmUgZG9uZSBieSBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0cHJvY2Vzc2luZyBzdGVwLiBUaGlzIHZhbHVlIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAwLiAqLwotCi0jZGVmaW5lIEZBTFNFICAwCi0jZGVmaW5lIFRSVUUgICAxCi0jZGVmaW5lIElOICAgICAwCi0jZGVmaW5lIE9VVCAgICAxCi0KLS8qIFR5cGUgZGVmaW5pdGlvbnM6ICovCi0jaWZuZGVmIERNWF9ISUdIX1BSRUNJU0lPTl9FTkFCTEUKLSAjZGVmaW5lIEZJWFBfRE1YICAgICAgICAgIEZJWFBfU0dMCi0gI2RlZmluZSBGWF9ETVgyRlhfREJMKHgpICBGWF9TR0wyRlhfREJMKChGSVhQX1NHTCkoeCkpCi0gI2RlZmluZSBGWF9EQkwyRlhfRE1YKHgpICBGWF9EQkwyRlhfU0dMKHgpCi0gI2RlZmluZSBGTDJGWENPTlNUX0RNWCh4KSBGTDJGWENPTlNUX1NHTCh4KQotICNkZWZpbmUgTUFYVkFMX0RNWCAgICAgICAgTUFYVkFMX1NHTAotICNkZWZpbmUgRlhfRE1YMlNIUlQoeCkgICAgKChTSE9SVCkoeCkpCi0gI2RlZmluZSBGWF9ETVgyRkwoeCkgICAgICBGWF9EQkwyRkwoRlhfRE1YMkZYX0RCTCh4KSkKLSNlbHNlCi0gI2RlZmluZSBGSVhQX0RNWCAgICAgICAgICBGSVhQX0RCTAotICNkZWZpbmUgRlhfRE1YMkZYX0RCTCh4KSAgKChGSVhQX0RCTCkoeCkpCi0gI2RlZmluZSBGWF9EQkwyRlhfRE1YKHgpICAoKEZJWFBfREJMKSh4KQotICNkZWZpbmUgRkwyRlhDT05TVF9ETVgoeCkgRkwyRlhDT05TVF9EQkwoeCkKLSAjZGVmaW5lIE1BWFZBTF9ETVggICAgICAgIE1BWFZBTF9EQkwKLSAjZGVmaW5lIEZYX0RNWDJTSFJUKHgpICAgICgoU0hPUlQpKCh4KT4+RlJBQ1RfQklUUykpCi0gI2RlZmluZSBGWF9ETVgyRkwoeCkgICAgICBGWF9EQkwyRkwoeCkKLSNlbmRpZgotCi0vKiBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIHBvc2l0aW9ucyBmb3IgZWFjaCBncm91cCBpbiB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uCi0gKiBTZWUgdGhlIGNoYW5uZWwgbGFiZWxzIGFib3ZlLiAqLwotc3RhdGljIGNvbnN0IFVDSEFSIG1heENoSW5HcnBbUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFNdID0gewotI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMUyA+IDMpCi0gIDMsIDAsIDIsIDEKLSNlbHNlCi0gIFBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUAotI2VuZGlmCi19OwotCi0vKiBMaXN0IG9mIHBhY2tlZCBjaGFubmVsIG1vZGVzICovCi10eXBlZGVmIGVudW0KLXsgLyogQ0hfTU9ERV88bnVtRnJvbnRDaD5fPG51bVNpZGVDaD5fPG51bUJhY2tDaD5fPG51bUxmQ2g+ICovCi0gIENIX01PREVfVU5ERUZJTkVEID0gMHgwMDAwLAotICAvKiAxIGNoYW5uZWwgKi8KLSAgQ0hfTU9ERV8xXzBfMF8wICAgPSAweDAwMDEsICAgLyogY2hDZmcgMSAqLwotICAvKiAyIGNoYW5uZWxzICovCi0gIENIX01PREVfMl8wXzBfMCAgID0gMHgwMDAyLCAgIC8qIGNoQ2ZnIDIgKi8KLSAgLyogMyBjaGFubmVscyAqLwotICBDSF9NT0RFXzNfMF8wXzAgICA9IDB4MDAwMywgICAvKiBjaENmZyAzICovCi0gIENIX01PREVfMl8wXzFfMCAgID0gMHgwMTAyLAotICBDSF9NT0RFXzJfMF8wXzEgICA9IDB4MTAwMiwKLSAgLyogNCBjaGFubmVscyAqLwotICBDSF9NT0RFXzNfMF8xXzAgICA9IDB4MDEwMywgICAvKiBjaENmZyA0ICovCi0gIENIX01PREVfMl8wXzJfMCAgID0gMHgwMjAyLAotICBDSF9NT0RFXzJfMF8xXzEgICA9IDB4MTEwMiwKLSAgQ0hfTU9ERV80XzBfMF8wICAgPSAweDAwMDQsCi0gIC8qIDUgY2hhbm5lbHMgKi8KLSAgQ0hfTU9ERV8zXzBfMl8wICAgPSAweDAyMDMsICAgLyogY2hDZmcgNSAqLwotICBDSF9NT0RFXzJfMF8yXzEgICA9IDB4MTIwMiwKLSAgQ0hfTU9ERV8zXzBfMV8xICAgPSAweDExMDMsCi0gIENIX01PREVfM18yXzBfMCAgID0gMHgwMDIzLAotICBDSF9NT0RFXzVfMF8wXzAgICA9IDB4MDAwNSwKLSAgLyogNiBjaGFubmVscyAqLwotICBDSF9NT0RFXzNfMF8yXzEgICA9IDB4MTIwMywgICAvKiBjaENmZyA2ICovCi0gIENIX01PREVfM18yXzBfMSAgID0gMHgxMDIzLAotICBDSF9NT0RFXzNfMl8xXzAgICA9IDB4MDEyMywKLSAgQ0hfTU9ERV81XzBfMV8wICAgPSAweDAxMDUsCi0gIENIX01PREVfNl8wXzBfMCAgID0gMHgwMDA2LAotICAvKiA3IGNoYW5uZWxzICovCi0gIENIX01PREVfMl8yXzJfMSAgID0gMHgxMjIyLAotICBDSF9NT0RFXzNfMF8zXzEgICA9IDB4MTMwMywgICAvKiBjaENmZyAxMSAqLwotICBDSF9NT0RFXzNfMl8xXzEgICA9IDB4MTEyMywKLSAgQ0hfTU9ERV8zXzJfMl8wICAgPSAweDAyMjMsCi0gIENIX01PREVfM18wXzJfMiAgID0gMHgyMjAzLAotICBDSF9NT0RFXzVfMF8yXzAgICA9IDB4MDIwNSwKLSAgQ0hfTU9ERV81XzBfMV8xICAgPSAweDExMDUsCi0gIENIX01PREVfN18wXzBfMCAgID0gMHgwMDA3LAotICAvKiA4IGNoYW5uZWxzICovCi0gIENIX01PREVfM18yXzJfMSAgID0gMHgxMjIzLAotICBDSF9NT0RFXzNfMF80XzEgICA9IDB4MTQwMywgICAvKiBjaENmZyAxMiAqLwotICBDSF9NT0RFXzVfMF8yXzEgICA9IDB4MTIwNSwgICAvKiBjaENmZyA3ICsgMTQgKi8KLSAgQ0hfTU9ERV81XzJfMV8wICAgPSAweDAxMjUsCi0gIENIX01PREVfM18yXzFfMiAgID0gMHgyMTIzLAotICBDSF9NT0RFXzJfMl8yXzIgICA9IDB4MjIyMiwKLSAgQ0hfTU9ERV8zXzBfM18yICAgPSAweDIzMDMsCi0gIENIX01PREVfOF8wXzBfMCAgID0gMHgwMDA4Ci0KLX0gUENNX0RNWF9DSEFOTkVMX01PREU7Ci0KLQotLyogVGhlc2UgYXJlIHRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb25zIGxpbmtlZCB0bwotICAgdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgZ2l2ZSBieSB0aGUgdXNlcjogKi8KLXN0YXRpYyBjb25zdCBQQ01fRE1YX0NIQU5ORUxfTU9ERSBvdXRDaE1vZGVUYWJsZVtQQ01fRE1YX01BWF9DSEFOTkVMUysxXSA9Ci17Ci0gIENIX01PREVfVU5ERUZJTkVELAotICBDSF9NT0RFXzFfMF8wXzAsICAvKiAxIGNoYW5uZWwgICovCi0gIENIX01PREVfMl8wXzBfMCwgIC8qIDIgY2hhbm5lbHMgKi8KLSAgQ0hfTU9ERV8zXzBfMF8wICAgLyogMyBjaGFubmVscyAqLwotI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMUyA+IDMpCi0gLENIX01PREVfM18wXzFfMCwgIC8qIDQgY2hhbm5lbHMgKi8KLSAgQ0hfTU9ERV8zXzBfMl8wLCAgLyogNSBjaGFubmVscyAqLwotICBDSF9NT0RFXzNfMF8yXzEsICAvKiA2IGNoYW5uZWxzICovCi0gIENIX01PREVfM18wXzNfMSwgIC8qIDcgY2hhbm5lbHMgKi8KLSAgQ0hfTU9ERV8zXzBfNF8xICAgLyogOCBjaGFubmVscyAqLwotI2VuZGlmCi19OwotCi1zdGF0aWMgY29uc3QgRklYUF9ETVggYWJNaXhMdmxWYWx1ZVRhYls4XSA9Ci17Ci0gIEZMMkZYQ09OU1RfRE1YKDAuNTAwZiksICAgLyogc2NhbGVkIGJ5IDEgKi8KLSAgRkwyRlhDT05TVF9ETVgoMC44NDFmKSwKLSAgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwKLSAgRkwyRlhDT05TVF9ETVgoMC41OTZmKSwKLSAgRkwyRlhDT05TVF9ETVgoMC41MDBmKSwKLSAgRkwyRlhDT05TVF9ETVgoMC40MjJmKSwKLSAgRkwyRlhDT05TVF9ETVgoMC4zNTVmKSwKLSAgRkwyRlhDT05TVF9ETVgoMC4wZikKLX07Ci0KLXN0YXRpYyBjb25zdCBGSVhQX0RNWCBsZmVNaXhMdmxWYWx1ZVRhYlsxNl0gPQoteyAvKiAgICAgICAgICAgICB2YWx1ZSwgICAgICAgIHNjYWxlICovCi0gIEZMMkZYQ09OU1RfRE1YKDAuNzkwNWYpLCAgLyogICAgIDIgKi8KLSAgRkwyRlhDT05TVF9ETVgoMC41MDAwZiksICAvKiAgICAgMiAqLwotICBGTDJGWENPTlNUX0RNWCgwLjgzOTVmKSwgIC8qICAgICAxICovCi0gIEZMMkZYQ09OU1RfRE1YKDAuNzA2NWYpLCAgLyogICAgIDEgKi8KLSAgRkwyRlhDT05TVF9ETVgoMC41OTQ1ZiksICAvKiAgICAgMSAqLwotICBGTDJGWENPTlNUX0RNWCgwLjUwMGYpLCAgIC8qICAgICAxICovCi0gIEZMMkZYQ09OU1RfRE1YKDAuODQxZiksICAgLyogICAgIDAgKi8KLSAgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgICAvKiAgICAgMCAqLwotICBGTDJGWENPTlNUX0RNWCgwLjU5NmYpLCAgIC8qICAgICAwICovCi0gIEZMMkZYQ09OU1RfRE1YKDAuNTAwZiksICAgLyogICAgIDAgKi8KLSAgRkwyRlhDT05TVF9ETVgoMC4zMTZmKSwgICAvKiAgICAgMCAqLwotICBGTDJGWENPTlNUX0RNWCgwLjE3OGYpLCAgIC8qICAgICAwICovCi0gIEZMMkZYQ09OU1RfRE1YKDAuMTAwZiksICAgLyogICAgIDAgKi8KLSAgRkwyRlhDT05TVF9ETVgoMC4wMzJmKSwgICAvKiAgICAgMCAqLwotICBGTDJGWENPTlNUX0RNWCgwLjAxMGYpLCAgIC8qICAgICAwICovCi0gIEZMMkZYQ09OU1RfRE1YKDAuMDAwZikgICAgLyogICAgIDAgKi8KLX07Ci0KLQotCi0jaWZkZWYgUENFX01FVEFEQVRBX0VOQUJMRQotICAvKiBNUEVHIG1hdHJpeCBtaXhkb3duOgotICAgICAgU2V0IDE6ICBMJyA9ICgxICsgMl4tMC41ICsgQSApXi0xICogW0wgKyBDICogMl4tMC41ICsgQSAqIExzXTsKLSAgICAgICAgICAgICAgUicgPSAoMSArIDJeLTAuNSArIEEgKV4tMSAqIFtSICsgQyAqIDJeLTAuNSArIEEgKiBSc107Ci0KLSAgICAgIFNldCAyOiAgTCcgPSAoMSArIDJeLTAuNSArIDJBICleLTEgKiBbTCArIEMgKiAyXi0wLjUgLSBBICogKExzICsgUnMpXTsKLSAgICAgICAgICAgICAgUicgPSAoMSArIDJeLTAuNSArIDJBICleLTEgKiBbUiArIEMgKiAyXi0wLjUgKyBBICogKExzICsgUnMpXTsKLQotICAgICAgTSA9ICgzICsgMkEpXi0xICogW0wgKyBDICsgUiArIEEqKExzICsgUnMpXTsKLSAgKi8KLSAgc3RhdGljIGNvbnN0IEZJWFBfRE1YIG1wZWdNaXhEb3duSWR4MkNvZWZbNF0gPQotICB7Ci0gICAgRkwyRlhDT05TVF9ETVgoMC43MDcxMDY3OGYpLAotICAgIEZMMkZYQ09OU1RfRE1YKDAuNWYpLAotICAgIEZMMkZYQ09OU1RfRE1YKDAuMzUzNTUzMzlmKSwKLSAgICBGTDJGWENPTlNUX0RNWCgwLjBmKQotICB9OwotCi0gIHN0YXRpYyBjb25zdCBGSVhQX1NHTCBtcGVnTWl4RG93bklkeDJQcmVGYWN0WzNdWzRdID0KLSAgeyB7ICAvKiBTZXQgMTogKi8KLSAgICBGTDJGWENPTlNUX0RNWCgwLjQxNDIxMzU2MjM3MzA5NTBmKSwKLSAgICBGTDJGWENPTlNUX0RNWCgwLjQ1MzA4MTgzOTMyMTk3MjhmKSwKLSAgICBGTDJGWENPTlNUX0RNWCgwLjQ4NTI4MTM3NDIzODU3MDNmKSwKLSAgICBGTDJGWENPTlNUX0RNWCgwLjU4NTc4NjQzNzYyNjkwNTBmKQotICB9LHsgIC8qIFNldCAyOiAqLwotICAgIEZMMkZYQ09OU1RfRE1YKDAuMzIwMzc3MjQxMDE3MDQwN2YpLAotICAgIEZMMkZYQ09OU1RfRE1YKDAuMzY5Mzk4MDYyNTE4MTI5M2YpLAotICAgIEZMMkZYQ09OU1RfRE1YKDAuNDE0MjEzNTYyMzczMDk1MGYpLAotICAgIEZMMkZYQ09OU1RfRE1YKDAuNTg1Nzg2NDM3NjI2OTA1MGYpCi0gIH0seyAgLyogTW9ubyBETVggc2V0OiAqLwotICAgIEZMMkZYQ09OU1RfRE1YKDAuMjI2NTQwOTE5NjYwOTg2NGYpLAotICAgIEZMMkZYQ09OU1RfRE1YKDAuMjVmKSwKLSAgICBGTDJGWENPTlNUX0RNWCgwLjI2OTc1MjE0MzM4OTgxNzlmKSwKLSAgICBGTDJGWENPTlNUX0RNWCgwLjMzMzMzMzMzMzMzMzMzMzNmKSB9Ci0gIH07Ci0jZW5kaWYgIC8qIFBDRV9NRVRBREFUQV9FTkFCTEUgKi8KLQotCi0jZGVmaW5lIFRZUEVfTk9ORSAgICAgICggMHgwICkKLSNkZWZpbmUgVFlQRV9EU0VfREFUQSAgKCAweDEgKQotI2RlZmluZSBUWVBFX1BDRV9EQVRBICAoIDB4MiApCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIFVJTlQgICB0eXBlRmxhZ3M7Ci0gIC8qIEZyb20gRFNFICovCi0gIFVDSEFSICBjTGV2SWR4OwotICBVQ0hBUiAgc0xldklkeDsKLSAgVUNIQVIgIGRtaXhJZHhBOwotICBVQ0hBUiAgZG1peElkeEI7Ci0gIFVDSEFSICBkbWl4SWR4TGZlOwotICBVQ0hBUiAgZG14R2FpbklkeDI7Ci0gIFVDSEFSICBkbXhHYWluSWR4NTsKLSNpZmRlZiBQQ0VfTUVUQURBVEFfRU5BQkxFCi0gIC8qIEZyb20gUENFICovCi0gIFVDSEFSICBtYXRyaXhNaXhkb3duSWR4OwotI2VuZGlmCi0gIC8qIEF0dHJpYnV0ZXM6ICovCi0gIFNDSEFSICBwc2V1ZG9TdXJyb3VuZDsgICAgICAgICAgICAgICAvKiE8IElmIHNldCB0byAxIHRoZSBzaWduYWwgaXMgcHNldWRvIHN1cnJvdW5kIGNvbXBhdGlibGUuIFRoZSB2YWx1ZSAwIHRlbGxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgaXQgaXMgbm90LiBJZiB0aGUgdmFsdWUgaXMgLTEgdGhlIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuICAqLwotICBVSU5UICAgZXhwaXJ5Q291bnQ7ICAgICAgICAgICAgICAgICAgLyohPCBDb3VudGVyIHRvIG1vbml0b3IgdGhlIGxpZmUgdGltZSBvZiBhIG1ldGEgZGF0YSBzZXQuICovCi0KLX0gRE1YX0JTX01FVEFfREFUQTsKLQotLyogRGVmYXVsdCBtZXRhZGF0YSAqLwotc3RhdGljIGNvbnN0IERNWF9CU19NRVRBX0RBVEEgIGRmbHRNZXRhRGF0YSA9IHsKLSAgMCwgMiwgMiwgMiwgMiwgMTUsIDAsIDAsCi0jaWZkZWYgUENFX01FVEFEQVRBX0VOQUJMRQotICAwLAotI2VuZGlmCi0gIC0xLCAwCi19OwotCi0vKiBEeW5hbWljICh1c2VyKSBwYXJhbXM6Ci0gICAgIFNlZSB0aGUgZGVmaW5pdGlvbiBvZiBQQ01ETVhfUEFSQU0gZm9yIGRldGFpbHMgb24gdGhlIHNwZWNpZmljIGZpZWxkcy4gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIFVJTlQgICBleHBpcnlGcmFtZTsgICAgICAgICAgICAgICAgICAgLyohPCBMaW5rZWQgdG8gRE1YX0JTX0RBVEFfRVhQSVJZX0ZSQU1FICAgICAgICovCi0gIERVQUxfQ0hBTk5FTF9NT0RFIGR1YWxDaGFubmVsTW9kZTsgICAgLyohPCBMaW5rZWQgdG8gRE1YX0RVQUxfQ0hBTk5FTF9NT0RFICAgICAgICAgICovCi0gIFBTRVVET19TVVJST1VORF9NT0RFIHBzZXVkb1N1cnJNb2RlOyAgLyohPCBMaW5rZWQgdG8gRE1YX1BTRVVET19TVVJST1VORF9NT0RFICAgICAgICovCi0gIFNIT1JUICBudW1PdXRDaGFubmVsc01pbjsgICAgICAgICAgICAgLyohPCBMaW5rZWQgdG8gTUlOX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMgICovCi0gIFNIT1JUICBudW1PdXRDaGFubmVsc01heDsgICAgICAgICAgICAgLyohPCBMaW5rZWQgdG8gTUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMgICovCi0gIFVDSEFSICBmcmFtZURlbGF5OyAgICAgICAgICAgICAgICAgICAgLyohPCBMaW5rZWQgdG8gRE1YX0JTX0RBVEFfREVMQVkgICAgICAgICAgICAgICovCi0KLX0gUENNX0RNWF9VU0VSX1BBUkFNUzsKLQotLyogTW9kdWxlcyBtYWluIGRhdGEgc3RydWN0dXJlOiAqLwotc3RydWN0IFBDTV9ETVhfSU5TVEFOQ0UKLXsKLSAgLyogTWV0YWRhdGEgKi8KLSAgRE1YX0JTX01FVEFfREFUQSAgICAgYnNNZXRhRGF0YVtQQ01fRE1YX01BWF9ERUxBWV9GUkFNRVMrMV07Ci0gIFBDTV9ETVhfVVNFUl9QQVJBTVMgIHVzZXJQYXJhbXM7Ci0KLSAgVUNIQVIgIGFwcGx5UHJvY2Vzc2luZzsgICAgICAgICAgICAgIC8qITwgRmxhZyB0byBlbi0vZGlzYWJsZSBtb2R1bGVzIHByb2Nlc3NpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXggY2hhbm5lbCBsaW1pdGluZyBpcyBkb25lIGluZGVwZW5kZW50bHkuICovCi19OwotCi0vKiBNZW1vcnkgYWxsb2NhdGlvbiBtYWNybyAqLwotQ19BTExPQ19NRU1fU1RBVElDKFBjbURteEluc3RhbmNlLCBzdHJ1Y3QgUENNX0RNWF9JTlNUQU5DRSwgMSkKLQotCi0vKiogRXZhbHVhdGUgYSBnaXZlbiBjaGFubmVsIGNvbmZpZ3VyYXRpb24gYW5kIGV4dHJhY3QgYSBwYWNrZWQgY2hhbm5lbCBtb2RlLiBJbiBhZGRpdGlvbiB0aGUKLSAqICBmdW5jdGlvbiBnZW5lcmF0ZXMgYSBjaGFubmVsIG9mZnNldCB0YWJsZSBmb3IgdGhlIG1hcHBpbmcgdG8gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLgotICogIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGludmVyc2UgdG8gdGhlIGdldENoYW5uZWxEZXNjcmlwdGlvbigpIHJvdXRpbmUuCi0gKiBAcGFyYW0gW2luXSBUaGUgdG90YWwgbnVtYmVyIG9mIGNoYW5uZWxzIG9mIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLgotICogQHBhcmFtIFtpbl0gQXJyYXkgaG9sZGluZyB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGVzIGZvciBlYWNoIGNoYW5uZWwuCi0gKiBAcGFyYW0gW2luXSBBcnJheSBob2xkaW5nIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZSBpbmRpY2VzIGZvciBlYWNoIGNoYW5uZWwuCi0gKiBAcGFyYW0gW291dF0gQXJyYXkgd2hlcmUgdGhlIGJ1ZmZlciBvZmZzZXRzIGZvciBlYWNoIGNoYW5uZWwgYXJlIHN0b3JlZCBpbnRvLgotICogQHBhcmFtIFtvdXRdIFRoZSBnZW5lcmF0ZWQgcGFja2VkIGNoYW5uZWwgbW9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuIGlucHV0IGNvbmZpZ3VyYXRpb24uCi0gKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCi0gKiovCi1zdGF0aWMKLVBDTURNWF9FUlJPUiBnZXRDaGFubmVsTW9kZSAoCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICBudW1DaGFubmVscywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiAqLwotICAgICAgICBjb25zdCBBVURJT19DSEFOTkVMX1RZUEUgY2hhbm5lbFR5cGVbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gKi8KLSAgICAgICAgY29uc3QgVUNIQVIgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW10sICAgICAgICAgICAgICAgICAgICAgIC8qIGluICovCi0gICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICBvZmZzZXRUYWJsZVtQQ01fRE1YX01BWF9DSEFOTkVMU10sICAgICAvKiBvdXQgKi8KLSAgICAgICAgUENNX0RNWF9DSEFOTkVMX01PREUgICAgKmNoTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dCAqLwotICAgICAgKQotewotICBVQ0hBUiBjaElkeFtQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQXTsKLSAgVUNIQVIgbnVtQ2hJbkdycFtQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQU107IC8qIFRvdGFsIG51bSBvZiBjaGFubmVscyBwZXIgZ3JvdXAgb2YgdGhlIGlucHV0IGNvbmZpZyAqLwotICBVQ0hBUiBudW1DaEZyZWVbUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFNdOyAgLyogTnVtYmVyIG9mIGZyZWUgc2xvdHMgcGVyIGdyb3VwIGluIHRoZSBpbnRlcm5hbCByZXByLiAqLwotICBVQ0hBUiBoYXJkVG9QbGFjZVtQQ01fRE1YX01BWF9DSEFOTkVMU107ICAgICAgLyogTGlzdCBvZiBjaGFubmVscyBub3QgbWF0Y2hpbmcgdGhlIGludGVybmFsIHJlcHIuICovCi0gIFVDSEFSIGgycFNvcnRJZHhbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwotICBQQ01ETVhfRVJST1IgZXJyID0gUENNRE1YX09LOwotICBpbnQgICBjaCwgZ3JwSWR4OwotICBpbnQgICBudW1DaFRvUGxhY2UgPSAwOwotCi0gIEZES19BU1NFUlQoY2hhbm5lbFR5cGUgIT0gTlVMTCk7Ci0gIEZES19BU1NFUlQoY2hhbm5lbEluZGljZXMgIT0gTlVMTCk7Ci0gIEZES19BU1NFUlQob2Zmc2V0VGFibGUgIT0gTlVMTCk7Ci0gIEZES19BU1NFUlQoY2hNb2RlICE9IE5VTEwpOwotCi0gIC8qIEZvciBkZXRhaWxzIHNlZSBJU08vSUVDIDEzODE4LTc6MjAwNShFKSwgOC41LjMgQ2hhbm5lbCBjb25maWd1cmF0aW9uICovCi0gIEZES21lbWNsZWFyKG51bUNoSW5HcnAsIFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTKnNpemVvZihVQ0hBUikpOwotICBGREttZW1zZXQob2Zmc2V0VGFibGUsIDI1NSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7Ci0gIEZES21lbXNldChjaElkeCwgMjU1LCBQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUypQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAqc2l6ZW9mKFVDSEFSKSk7Ci0gIEZES21lbXNldChoYXJkVG9QbGFjZSwgMjU1LCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoVUNIQVIpKTsKLSAgRkRLbWVtc2V0KGgycFNvcnRJZHgsIDI1NSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7Ci0gIC8qIEdldCB0aGUgcmVzdHJpY3Rpb25zIG9mIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAqLwotICBGREttZW1jcHkobnVtQ2hGcmVlLCBtYXhDaEluR3JwLCBQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUypzaXplb2YoVUNIQVIpKTsKLQotICAqY2hNb2RlID0gQ0hfTU9ERV9VTkRFRklORUQ7Ci0KLSAgLyogQ2F0ZWdvcml6ZSBjaGFubmVscyAqLwotICBmb3IgKGNoID0gMDsgY2ggPCBudW1DaGFubmVsczsgY2ggKz0gMSkgewotICAgIFVDSEFSIGNoR3JwSWR4ID0gY2hhbm5lbEluZGljZXNbY2hdOwotICAgIGludCBpID0gMCwgajsKLQotICAgIHN3aXRjaCAoY2hhbm5lbFR5cGVbY2hdKSB7Ci0gICAgY2FzZSBBQ1RfRlJPTlRfVE9QOgotICAgICAgY2hHcnBJZHggKz0gbnVtQ2hJbkdycFtDSF9HUk9VUF9GUk9OVF07ICAvKiBBcHBlbmQgYWZ0ZXIgbm9ybWFsIHBsYWluICovCi0gICAgY2FzZSBBQ1RfRlJPTlQ6Ci0gICAgICBncnBJZHggPSBDSF9HUk9VUF9GUk9OVDsKLSAgICAgIGJyZWFrOwotI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUyA+IDEpCi0gICAgY2FzZSBBQ1RfU0lERV9UT1A6Ci0gICAgICBjaEdycElkeCArPSBudW1DaEluR3JwW0NIX0dST1VQX1NJREVdOyAgIC8qIEFwcGVuZCBhZnRlciBub3JtYWwgcGxhaW4gKi8KLSAgICBjYXNlIEFDVF9TSURFOgotICAgICAgZ3JwSWR4ID0gQ0hfR1JPVVBfU0lERTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQUNUX0JBQ0tfVE9QOgotICAgICAgY2hHcnBJZHggKz0gbnVtQ2hJbkdycFtDSF9HUk9VUF9SRUFSXTsgICAvKiBBcHBlbmQgYWZ0ZXIgbm9ybWFsIHBsYWluICovCi0gICAgY2FzZSBBQ1RfQkFDSzoKLSAgICAgIGdycElkeCA9IENIX0dST1VQX1JFQVI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFDVF9MRkU6Ci0gICAgICBncnBJZHggPSBDSF9HUk9VUF9MRkU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBGb3VuZCBhIGNoYW5uZWwgdGhhdCBjYW4gbm90IGJlIGNhdGVnb3JpemVkISBNb3N0IGxpa2VseSBkdWUgdG8gY29ycnVwdCBpbnB1dCBzaWduYWxsaW5nLgotICAgICAgICAgVGhlIHJlc2N1ZSBzdHJhdGVneSBpcyB0byBhcHBlbmQgaXQgdG8gdGhlIGZyb250IGNoYW5uZWxzICg9PiBpZ25vcmUgaW5kZXgpLgotICAgICAgICAgVGhpcyBjb3VsZCBjYXVzZSBzdHJhbmdlIGJlaGF2aW91ciBzbyByZXR1cm4gYW4gZXJyb3IgdG8gc2lnbmFsIGl0LiAqLwotICAgICAgZXJyID0gUENNRE1YX0lOVkFMSURfTU9ERTsKLSAgICAgIGdycElkeCA9IENIX0dST1VQX0ZST05UOwotICAgICAgY2hHcnBJZHggPSBudW1DaGFubmVscyArIG51bUNoVG9QbGFjZTsKLSAgICAgIG51bUNoVG9QbGFjZSArPSAxOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKG51bUNoSW5HcnBbZ3JwSWR4XSA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUCkgewotICAgICAgLyogU29ydCBjaGFubmVscyBieSBpbmRleCAqLwotICAgICAgd2hpbGUgKCAoaSA8IG51bUNoSW5HcnBbZ3JwSWR4XSkgJiYgKGNoR3JwSWR4ID4gY2hhbm5lbEluZGljZXNbY2hJZHhbZ3JwSWR4XVtpXV0pICkgewotICAgICAgICBpICs9IDE7Ci0gICAgICB9Ci0gICAgICBmb3IgKGogPSBudW1DaEluR3JwW2dycElkeF07IGogPiBpOyBqIC09IDEpIHsKLSAgICAgICAgY2hJZHhbZ3JwSWR4XVtqXSA9IGNoSWR4W2dycElkeF1bai0xXTsKLSAgICAgIH0KLSAgICAgIGNoSWR4W2dycElkeF1baV0gPSBjaDsKLSAgICAgIG51bUNoSW5HcnBbZ3JwSWR4XSArPSAxOwotICAgIH0KLSAgfQotCi0jaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTID4gMSkKLSAgRkRLX0FTU0VSVCggKG51bUNoSW5HcnBbQ0hfR1JPVVBfRlJPTlRdK251bUNoSW5HcnBbQ0hfR1JPVVBfU0lERV0KLSAgICAgICAgICAgICAgK251bUNoSW5HcnBbQ0hfR1JPVVBfUkVBUl0rbnVtQ2hJbkdycFtDSF9HUk9VUF9MRkVdKSA9PSBudW1DaGFubmVscyk7Ci0jZWxzZQotICBGREtfQVNTRVJUKCBudW1DaEluR3JwW0NIX0dST1VQX0ZST05UXSA9PSBudW1DaGFubmVscyApOwotI2VuZGlmCi0KLSAgLyogQ29tcG9zZSBjaGFubmVsIG9mZnNldCB0YWJsZToKLSAgICogTWFwIGFsbCBjaGFubmVscyB0byB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uICovCi0gIG51bUNoVG9QbGFjZSA9IDA7Ci0KLSAgLyogTm9uLXN5bW1ldHJpYyBjaGFubmVscyAqLwotICBpZiAobnVtQ2hJbkdycFtDSF9HUk9VUF9GUk9OVF0gJiAweDEpIHsKLSAgICAvKiBPZGQgbnVtYmVyIG9mIGZyb250IGNoYW5uZWxzIC0+IHdlIGhhdmUgYSBjZW50ZXIgY2hhbm5lbC4KLSAgICAgICBJbiBNUEVHLTQgdGhlIGNlbnRlciBoYXMgdGhlIGluZGV4IDAuICovCi0gICAgb2Zmc2V0VGFibGVbQ0VOVEVSX0ZST05UX0NIQU5ORUxdID0gY2hJZHhbQ0hfR1JPVVBfRlJPTlRdWzBdOwotICAgIG51bUNoRnJlZVtDSF9HUk9VUF9GUk9OVF0gLT0gMTsKLSAgfQotCi0gIGZvciAoZ3JwSWR4ID0gMDsgZ3JwSWR4IDwgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFM7IGdycElkeCArPSAxKSB7Ci0gICAgaW50IGNoTWFwUG9zID0gMDsKLSAgICBjaCA9IDA7ICAvKiBJbmRleCBvZiBjaGFubmVsIHdpdGhpbiB0aGUgc3BlY2lmaWMgZ3JvdXAgKi8KLQotICAgIHN3aXRjaCAoZ3JwSWR4KSB7Ci0gICAgY2FzZSBDSF9HUk9VUF9GUk9OVDoKLSAgICAgIGNoTWFwUG9zID0gTEVGVF9GUk9OVF9DSEFOTkVMOwotICAgICAgY2ggPSBudW1DaEluR3JwW2dycElkeF0gJiAweDE7Ci0gICAgICBicmVhazsKLSNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgPiAxKQotICAgIGNhc2UgQ0hfR1JPVVBfU0lERToKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hfR1JPVVBfUkVBUjoKLSAgICAgIGNoTWFwUG9zID0gTEVGVF9SRUFSX0NIQU5ORUw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENIX0dST1VQX0xGRToKLSAgICAgIGNoTWFwUG9zID0gTE9XX0ZSRVFVRU5DWV9DSEFOTkVMOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgRkRLX0FTU0VSVCgwKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8qIE1hcCBhbGwgY2hhbm5lbHMgb2YgdGhlIGdyb3VwICovCi0gICAgZm9yICggOyBjaCA8IG51bUNoSW5HcnBbZ3JwSWR4XTsgY2ggKz0gMSkgewotICAgICAgaWYgKG51bUNoRnJlZVtncnBJZHhdID4gMCkgewotICAgICAgICBvZmZzZXRUYWJsZVtjaE1hcFBvc10gPSBjaElkeFtncnBJZHhdW2NoXTsKLSAgICAgICAgY2hNYXBQb3MgKz0gMTsKLSAgICAgICAgbnVtQ2hGcmVlW2dycElkeF0gLT0gMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIEFkZCB0byB0aGUgbGlzdCBvZiBoYXJkc2hpcCBjYXNlcyBjb25zaWRlcmluZyBhIE1QRUctbGlrZSBzb3J0aW5nIG9yZGVyOiAqLwotICAgICAgICBpbnQgcG9zLCBzb3J0SWR4ID0gZ3JwSWR4KlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUCArIGNoYW5uZWxJbmRpY2VzW2NoSWR4W2dycElkeF1bY2hdXTsKLSAgICAgICAgZm9yIChwb3MgPSBudW1DaFRvUGxhY2U7IHBvcyA+IDA7IHBvcyAtPSAxKSB7Ci0gICAgICAgICAgaWYgKGgycFNvcnRJZHhbcG9zLTFdID4gc29ydElkeCkgewotICAgICAgICAgICAgaGFyZFRvUGxhY2VbcG9zXSA9IGhhcmRUb1BsYWNlW3Bvcy0xXTsKLSAgICAgICAgICAgIGgycFNvcnRJZHhbcG9zXSA9IGgycFNvcnRJZHhbcG9zLTFdOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBJbnNlcnQgY2hhbm5lbCBhdCB0aGUgY3VycmVudCBpbmRleC9wb3NpdGlvbiAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGhhcmRUb1BsYWNlW3Bvc10gPSBjaElkeFtncnBJZHhdW2NoXTsKLSAgICAgICAgaDJwU29ydElkeFtwb3NdID0gc29ydElkeDsKLSAgICAgICAgbnVtQ2hUb1BsYWNlICs9IDE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgeyAvKiBBc3NpZ24gdGhlIGhhcmRzaGlwIGNhc2VzICovCi0gICAgaW50IGNoTWFwUG9zID0gMDsKLSAgICBpbnQgbWFwcGluZ0hlYXQgPSAwOwotICAgIGZvciAoY2ggPSAwOyBjaCA8IG51bUNoVG9QbGFjZTsgY2grPTEpIHsKLSAgICAgIGludCBjaEFzc2lnbmVkID0gMDsKLQotICAgICAgLyogSnVzdCBhc3NpZ25pbmcgdGhlIGNoYW5uZWxzIHRvIHRoZSBuZXh0IGJlc3Qgc2xvdCBjYW4gbGVhZCB0byB1bmRlc2lyZWQgcmVzdWx0cyAoZXNwZWNpYWxseSBmb3IgeC94LzEueAotICAgICAgICAgY29uZmlndXJhdGlvbnMpLiBUaHVzIHVzZSB0aGUgTVBFRy1saWtlIHNvcnRpbmcgaW5kZXggdG8gZmluZCB0aGUgYmVzdCBmaXR0aW5nIHNsb3QgZm9yIGVhY2ggY2hhbm5lbC4KLSAgICAgICAgIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlIHRoZSBzb3J0aW5nIGluZGV4IHdpbGwgYmUgaWdub3JlZCAobWFwcGluZ0hlYXQgPj0gMikuICovCi0gICAgICBmb3IgKCA7IGNoTWFwUG9zIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGNoTWFwUG9zKz0xKSB7Ci0gICAgICAgIGlmIChvZmZzZXRUYWJsZVtjaE1hcFBvc10gPT0gMjU1KSB7Ci0gICAgICAgICAgaW50IHBydlNvcnRJZHggPSAwOwotICAgICAgICAgIGludCBueHRTb3J0SWR4ID0gKENIX0dST1VQX0xGRSsxKSpQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVA7Ci0KLSAgICAgICAgICBpZiAobWFwcGluZ0hlYXQgPCAyKSB7Ci0gICAgICAgICAgICBpZiAoY2hNYXBQb3MgPCBMRUZUX1JFQVJfQ0hBTk5FTCkgewotICAgICAgICAgICAgICAvKiBHb3QgZnJvbnQgY2hhbm5lbCBzbG90ICovCi0gICAgICAgICAgICAgIHBydlNvcnRJZHggPSBDSF9HUk9VUF9GUk9OVCpQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAgKyBjaE1hcFBvcyAtIENFTlRFUl9GUk9OVF9DSEFOTkVMOwotICAgICAgICAgICAgICBueHRTb3J0SWR4ID0gQ0hfR1JPVVBfU0lERSAqUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2hNYXBQb3MgPCBMT1dfRlJFUVVFTkNZX0NIQU5ORUwpIHsKLSAgICAgICAgICAgICAgLyogR290IGJhY2sgY2hhbm5lbCBzbG90ICovCi0gICAgICAgICAgICAgIHBydlNvcnRJZHggPSBDSF9HUk9VUF9SRUFSKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUCArIGNoTWFwUG9zIC0gTEVGVF9SRUFSX0NIQU5ORUw7Ci0gICAgICAgICAgICAgIG54dFNvcnRJZHggPSBDSF9HUk9VUF9MRkUgKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNoTWFwUG9zIDwgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCkgewotICAgICAgICAgICAgICAvKiBHb3QgbGZlIGNoYW5uZWwgc2xvdCAqLwotICAgICAgICAgICAgICBwcnZTb3J0SWR4ID0gIENIX0dST1VQX0xGRSAgICpQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAgKyBjaE1hcFBvcyAtIExPV19GUkVRVUVOQ1lfQ0hBTk5FTDsKLSAgICAgICAgICAgICAgbnh0U29ydElkeCA9IChDSF9HUk9VUF9MRkUrMSkqUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIEFzc2lnbiB0aGUgY2hhbm5lbCBvbmx5IGlmIGl0cyBzb3J0IGluZGV4IGlzIHdpdGhpbiB0aGUgcmFuZ2UgKi8KLSAgICAgICAgICBpZiAoIChoMnBTb3J0SWR4W2NoXSA+PSBwcnZTb3J0SWR4KQotICAgICAgICAgICAgJiYgKGgycFNvcnRJZHhbY2hdIDwgIG54dFNvcnRJZHgpICkgewotICAgICAgICAgICAgb2Zmc2V0VGFibGVbY2hNYXBQb3MrK10gPSBoYXJkVG9QbGFjZVtjaF07Ci0gICAgICAgICAgICBjaEFzc2lnbmVkID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGNoQXNzaWduZWQgPT0gMCkgewotICAgICAgICBjaE1hcFBvcyA9IDA7Ci0gICAgICAgIGNoIC09IDE7Ci0gICAgICAgIG1hcHBpbmdIZWF0ICs9IDE7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIENvbXBvc2UgdGhlIGNoYW5uZWwgbW9kZSAqLwotICAqY2hNb2RlID0gKFBDTV9ETVhfQ0hBTk5FTF9NT0RFKSggKG51bUNoSW5HcnBbQ0hfR1JPVVBfRlJPTlRdICYgMHhGKQotI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUyA+IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAobnVtQ2hJbkdycFtDSF9HUk9VUF9TSURFXSAgJiAweEYpIDw8ICA0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAobnVtQ2hJbkdycFtDSF9HUk9VUF9SRUFSXSAgJiAweEYpIDw8ICA4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAobnVtQ2hJbkdycFtDSF9HUk9VUF9MRkVdICAgJiAweEYpIDw8IDEyCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotCi0gIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqIEdlbmVyYXRlIGEgY2hhbm5lbCBvZmZzZXQgdGFibGUgYW5kIGNvbXBsZXRlIGNoYW5uZWwgZGVzY3JpcHRpb24gZm9yIGEgZ2l2ZW4gKHBhY2tlZCkgY2hhbm5lbCBtb2RlLgotICogIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGludmVyc2UgdG8gdGhlIGdldENoYW5uZWxNb2RlKCkgcm91dGluZSBidXQgZG9lcyBub3Qgc3VwcG9ydCB3ZWlyZCBjaGFubmVsCi0gKiAgY29uZmlndXJhdGlvbnMuIEFsbCBjaGFubmVscyBoYXZlIHRvIGJlIGluIHRoZSBub3JtYWwgaGVpZ2h0IGxheWVyIGFuZCB0aGVyZSBtdXN0IG5vdCBiZSBtb3JlCi0gKiAgY2hhbm5lbHMgaW4gZWFjaCBncm91cCB0aGFuIGdpdmVuIGJ5IG1heENoSW5HcnAuCi0gKiBAcGFyYW0gW2luXSBUaGUgcGFja2VkIGNoYW5uZWwgbW9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiB0byBiZSBwcm9jZXNzZWQuCi0gKiBAcGFyYW0gW2luXSBBcnJheSBjb250YWluaW5nIHRoZSBjaGFubmVsIG1hcHBpbmcgdG8gYmUgdXNlZCAoRnJvbSBNUEVHIFBDRSBvcmRlcmluZyB0byB3aGF0ZXZlciBpcyByZXF1aXJlZCkuCi0gKiBAcGFyYW0gW291dF0gQXJyYXkgd2hlcmUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGVzIGZvciBlYWNoIGNoYW5uZWxzIGFyZSBzdG9yZWQgaW50by4KLSAqIEBwYXJhbSBbb3V0XSBBcnJheSB3aGVyZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZSBpbmRpY2VzIGZvciBlYWNoIG91dHB1dCBjaGFubmVsIGFyZSBzdG9yZWQgaW50by4KLSAqIEBwYXJhbSBbb3V0XSBBcnJheSB3aGVyZSB0aGUgYnVmZmVyIG9mZnNldHMgZm9yIGVhY2ggY2hhbm5lbCBhcmUgc3RvcmVkIGludG8uCi0gKiBAcmV0dXJucyBOb25lLgotICoqLwotc3RhdGljCi12b2lkIGdldENoYW5uZWxEZXNjcmlwdGlvbiAoCi0gICAgICAgIGNvbnN0IFBDTV9ETVhfQ0hBTk5FTF9NT0RFICBjaE1vZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gKi8KLSAgICAgICAgY29uc3QgVUNIQVIgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXBwaW5nW11bOF0sICAgICAgICAgICAgICAgICAgICAvKiBpbiAqLwotICAgICAgICBBVURJT19DSEFOTkVMX1RZUEUgICAgICAgICAgY2hhbm5lbFR5cGVbXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dCAqLwotICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEluZGljZXNbXSwgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dCAqLwotICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0VGFibGVbUENNX0RNWF9NQVhfQ0hBTk5FTFNdICAgICAgIC8qIG91dCAqLwotICAgICAgKQotewotICBjb25zdCBVQ0hBUiAqcENoYW5uZWxNYXA7Ci0gIGludCAgIGdycElkeCwgY2ggPSAwLCBudW1DaGFubmVscyA9IDA7Ci0gIFVDSEFSIG51bUNoSW5HcnBbUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFNdOwotCi0gIEZES19BU1NFUlQoY2hhbm5lbFR5cGUgIT0gTlVMTCk7Ci0gIEZES19BU1NFUlQoY2hhbm5lbEluZGljZXMgIT0gTlVMTCk7Ci0gIEZES19BU1NFUlQoY2hhbm5lbE1hcHBpbmcgIT0gTlVMTCk7Ci0gIEZES19BU1NFUlQob2Zmc2V0VGFibGUgIT0gTlVMTCk7Ci0KLSAgLyogSW5pdCBvdXRwdXQgYXJyYXlzICovCi0gIEZES21lbWNsZWFyKGNoYW5uZWxUeXBlLCAgICBQQ01fRE1YX01BWF9JT19DSEFOTkVMUypzaXplb2YoQVVESU9fQ0hBTk5FTF9UWVBFKSk7Ci0gIEZES21lbWNsZWFyKGNoYW5uZWxJbmRpY2VzLCBQQ01fRE1YX01BWF9JT19DSEFOTkVMUypzaXplb2YoVUNIQVIpKTsKLSAgRkRLbWVtc2V0KG9mZnNldFRhYmxlLCAyNTUsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihVQ0hBUikpOwotCi0gIC8qIEV4dHJhY3QgdGhlIG51bWJlciBvZiBjaGFubmVscyBwZXIgZ3JvdXAgKi8KLSAgbnVtQ2hJbkdycFtDSF9HUk9VUF9GUk9OVF0gPSAgY2hNb2RlICAgICAgICAmIDB4RjsKLSNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgPiAxKQotICBudW1DaEluR3JwW0NIX0dST1VQX1NJREVdICA9IChjaE1vZGUgPj4gIDQpICYgMHhGOwotICBudW1DaEluR3JwW0NIX0dST1VQX1JFQVJdICA9IChjaE1vZGUgPj4gIDgpICYgMHhGOwotICBudW1DaEluR3JwW0NIX0dST1VQX0xGRV0gICA9IChjaE1vZGUgPj4gMTIpICYgMHhGOwotI2VuZGlmCi0KLSAgLyogU3VtbWVyaXplIHRvIGdldCB0aGUgdG90YWwgbnVtYmVyIG9mIGNoYW5uZWxzICovCi0gIGZvciAoZ3JwSWR4ID0gMDsgZ3JwSWR4IDwgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFM7IGdycElkeCArPSAxKSB7Ci0gICAgbnVtQ2hhbm5lbHMgKz0gbnVtQ2hJbkdycFtncnBJZHhdOwotICB9Ci0KLSAgLyogR2V0IHRoZSBhcHByb3ByaWF0ZSBjaGFubmVsIG1hcCAqLwotICBzd2l0Y2ggKGNoTW9kZSkgewotICBjYXNlIENIX01PREVfMV8wXzBfMDoKLSAgY2FzZSBDSF9NT0RFXzJfMF8wXzA6Ci0gIGNhc2UgQ0hfTU9ERV8zXzBfMF8wOgotICBjYXNlIENIX01PREVfM18wXzFfMDoKLSAgY2FzZSBDSF9NT0RFXzNfMF8yXzA6Ci0gIGNhc2UgQ0hfTU9ERV8zXzBfMl8xOgotICAgIHBDaGFubmVsTWFwID0gY2hhbm5lbE1hcHBpbmdbbnVtQ2hhbm5lbHNdOwotICAgIGJyZWFrOwotICBjYXNlIENIX01PREVfM18wXzNfMToKLSAgICBwQ2hhbm5lbE1hcCA9IGNoYW5uZWxNYXBwaW5nWzExXTsKLSAgICBicmVhazsKLSAgY2FzZSBDSF9NT0RFXzNfMF80XzE6Ci0gICAgcENoYW5uZWxNYXAgPSBjaGFubmVsTWFwcGluZ1sxMl07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgQ0hfTU9ERV81XzBfMl8xOgotICAgIHBDaGFubmVsTWFwID0gY2hhbm5lbE1hcHBpbmdbN107Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgLyogZmFsbGJhY2sgKi8KLSAgICBwQ2hhbm5lbE1hcCA9IGNoYW5uZWxNYXBwaW5nWzBdOwotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogQ29tcG9zZSBjaGFubmVsIG9mZnNldCB0YWJsZSAqLwotCi0gIC8qIE5vbi1zeW1tZXRyaWMgY2hhbm5lbHMgKi8KLSAgaWYgKG51bUNoSW5HcnBbQ0hfR1JPVVBfRlJPTlRdICYgMHgxKSB7Ci0gICAgLyogT2RkIG51bWJlciBvZiBmcm9udCBjaGFubmVscyAtPiB3ZSBoYXZlIGEgY2VudGVyIGNoYW5uZWwuCi0gICAgICAgSW4gTVBFRy00IHRoZSBjZW50ZXIgaGFzIHRoZSBpbmRleCAwLiAqLwotICAgIGludCBtYXBwZWRJZHggPSBwQ2hhbm5lbE1hcFtjaF07Ci0gICAgb2Zmc2V0VGFibGVbQ0VOVEVSX0ZST05UX0NIQU5ORUxdID0gbWFwcGVkSWR4OwotICAgIGNoYW5uZWxUeXBlW21hcHBlZElkeF0gICAgPSBBQ1RfRlJPTlQ7Ci0gICAgY2hhbm5lbEluZGljZXNbbWFwcGVkSWR4XSA9IDA7Ci0gICAgY2ggKz0gMTsKLSAgfQotCi0gIGZvciAoZ3JwSWR4ID0gMDsgZ3JwSWR4IDwgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFM7IGdycElkeCArPSAxKSB7Ci0gICAgQVVESU9fQ0hBTk5FTF9UWVBFIHR5cGUgPSBBQ1RfTk9ORTsKLSAgICBpbnQgY2hNYXBQb3MgPSAwLCBtYXhDaGFubmVscyA9IDA7Ci0gICAgaW50IGNoSWR4ID0gMDsgIC8qIEluZGV4IG9mIGNoYW5uZWwgd2l0aGluIHRoZSBzcGVjaWZpYyBncm91cCAqLwotCi0gICAgc3dpdGNoIChncnBJZHgpIHsKLSAgICBjYXNlIENIX0dST1VQX0ZST05UOgotICAgICAgdHlwZSA9IEFDVF9GUk9OVDsKLSAgICAgIGNoTWFwUG9zID0gTEVGVF9GUk9OVF9DSEFOTkVMOwotICAgICAgbWF4Q2hhbm5lbHMgPSAzOwotICAgICAgY2hJZHggPSBudW1DaEluR3JwW2dycElkeF0gJiAweDE7Ci0gICAgICBicmVhazsKLSNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgPiAxKQotICAgIGNhc2UgQ0hfR1JPVVBfU0lERToKLSAgICAgIC8qIEFsd2F5cyBtYXAgc2lkZSBjaGFubmVscyB0byB0aGUgbXVsdGlwdXJwb3NlIGdyb3VwLiAqLwotICAgICAgdHlwZSA9IEFDVF9TSURFOwotICAgICAgY2hNYXBQb3MgPSBMRUZUX01VTFRJUFJQU19DSEFOTkVMOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSF9HUk9VUF9SRUFSOgotICAgICAgdHlwZSA9IEFDVF9CQUNLOwotICAgICAgY2hNYXBQb3MgPSBMRUZUX1JFQVJfQ0hBTk5FTDsKLSAgICAgIG1heENoYW5uZWxzID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hfR1JPVVBfTEZFOgotICAgICAgdHlwZSA9IEFDVF9MRkU7Ci0gICAgICBjaE1hcFBvcyA9IExPV19GUkVRVUVOQ1lfQ0hBTk5FTDsKLSAgICAgIG1heENoYW5uZWxzID0gMTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIE1hcCBhbGwgY2hhbm5lbHMgaW4gdGhpcyBncm91cCAqLwotICAgIGZvciAoIDsgY2hJZHggPCBudW1DaEluR3JwW2dycElkeF07IGNoSWR4ICs9IDEpIHsKLSAgICAgIGludCBtYXBwZWRJZHggPSBwQ2hhbm5lbE1hcFtjaF07Ci0gICAgICBpZiAoY2hJZHggPT0gbWF4Q2hhbm5lbHMpIHsKLSAgICAgICAgLyogTm8gc3BhY2UgbGVmdCBpbiB0aGlzIGNoYW5uZWwgZ3JvdXAhCi0gICAgICAgICAgIFVzZSB0aGUgbXVsdGlwdXJwb3NlIGdyb3VwIGluc3RlYWQ6ICovCi0gICAgICAgIGNoTWFwUG9zID0gTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTDsKLSAgICAgIH0KLSAgICAgIG9mZnNldFRhYmxlW2NoTWFwUG9zXSAgICAgPSBtYXBwZWRJZHg7Ci0gICAgICBjaGFubmVsVHlwZVttYXBwZWRJZHhdICAgID0gdHlwZTsKLSAgICAgIGNoYW5uZWxJbmRpY2VzW21hcHBlZElkeF0gPSBjaElkeDsKLSAgICAgIGNoTWFwUG9zICs9IDE7Ci0gICAgICBjaCArPSAxOwotICAgIH0KLSAgfQotfQotCi0vKiogUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gZm9yIGRvd25taXggbWF0cml4IG1hbmlwdWxhdGlvbiB0aGF0IGluaXRpYWxpemVzCi0gKiAgb25lIHJvdyBpbiBhIGdpdmVuIGRvd25taXggbWF0cml4IChjb3JyZXNwb25kaW5nIHRvIG9uZSBvdXRwdXQgY2hhbm5lbCkuCi0gKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIGZpeGVkLXBvaW50IHBhcnRzIG9mIHRoZSBkb3dubWl4IG1hdHJpeC4KLSAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gc2NhbGUgZmFjdG9yIG1hdHJpeCBhc3NvY2lhdGVkIHRvIHRoZSBkb3dubWl4IGZhY3RvcnMuCi0gKiBAcGFyYW0gW2luXSAgICBJbmRleCBvZiBjaGFubmVsIChyb3cpIHRvIGJlIGluaXRpYWxpemVkLgotICogQHJldHVybnMgICAgICAgTm90aGluZyB0byByZXR1cm4uCi0gKiovCi1zdGF0aWMKLXZvaWQgZG14SW5pdENoYW5uZWwoCi0gICAgICAgIEZJWFBfRE1YICAgICAgICAgICAgbWl4RmFjdG9yc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgIG1peFNjYWxlc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdLAotICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgIG91dENoCi0gICAgICAgKQotewotICB1bnNpZ25lZCBpbnQgaW5DaDsKLSAgZm9yIChpbkNoPTA7IGluQ2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgaW5DaCs9MSkgewotICAgIGlmIChpbkNoID09IG91dENoKSB7Ci0gICAgICBtaXhGYWN0b3JzW291dENoXVtpbkNoXSA9IEZMMkZYQ09OU1RfRE1YKDAuNWYpOwotICAgICAgbWl4U2NhbGVzW291dENoXVtpbkNoXSAgPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICBtaXhGYWN0b3JzW291dENoXVtpbkNoXSA9IEZMMkZYQ09OU1RfRE1YKDAuMGYpOwotICAgICAgbWl4U2NhbGVzW291dENoXVtpbkNoXSAgPSAwOwotICAgIH0KLSAgfQotfQotCi0vKiogUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gZm9yIGRvd25taXggbWF0cml4IG1hbmlwdWxhdGlvbiB0aGF0IGRvZXMgYSByZXNldAotICogIG9mIG9uZSByb3cgaW4gYSBnaXZlbiBkb3dubWl4IG1hdHJpeCAoY29ycmVzcG9uZGluZyB0byBvbmUgb3V0cHV0IGNoYW5uZWwpLgotICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBmaXhlZC1wb2ludCBwYXJ0cyBvZiB0aGUgZG93bm1peCBtYXRyaXguCi0gKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIHNjYWxlIGZhY3RvciBtYXRyaXggYXNzb2NpYXRlZCB0byB0aGUgZG93bm1peCBmYWN0b3JzLgotICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2YgY2hhbm5lbCAocm93KSB0byBiZSBjbGVhcmVkL3Jlc2V0LgotICogQHJldHVybnMgICAgICAgTm90aGluZyB0byByZXR1cm4uCi0gKiovCi1zdGF0aWMKLXZvaWQgZG14Q2xlYXJDaGFubmVsKAotICAgICAgICBGSVhQX0RNWCAgICAgICAgICAgIG1peEZhY3RvcnNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICBtaXhTY2FsZXNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICBvdXRDaAotICAgICAgICkKLXsKLSAgRkRLbWVtY2xlYXIoJm1peEZhY3RvcnNbb3V0Q2hdLCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoRklYUF9ETVgpKTsKLSAgRkRLbWVtY2xlYXIoJm1peFNjYWxlc1tvdXRDaF0sICBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoSU5UKSk7Ci19Ci0KLS8qKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiBmb3IgZG93bm1peCBtYXRyaXggbWFuaXB1bGF0aW9uIHRoYXQgYXBwbGllcyBhIHNvdXJjZSBjaGFubmVsIChyb3cpCi0gKiAgc2NhbGVkIGJ5IGEgZ2l2ZW4gbWl4IGZhY3RvciB0byBhIGRlc3RpbmF0aW9uIGNoYW5uZWwgKHJvdykgaW4gYSBnaXZlbiBkb3dubWl4IG1hdHJpeC4KLSAqICBFeGlzdGluZyBtaXggZmFjdG9ycyBvZiB0aGUgZGVzdGluYXRpb24gY2hhbm5lbCAocm93KSB3aWxsIGdldCBvdmVyd3JpdHRlbi4KLSAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gZml4ZWQtcG9pbnQgcGFydHMgb2YgdGhlIGRvd25taXggbWF0cml4LgotICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBzY2FsZSBmYWN0b3IgbWF0cml4IGFzc29jaWF0ZWQgdG8gdGhlIGRvd25taXggZmFjdG9ycy4KLSAqIEBwYXJhbSBbaW5dICAgIEluZGV4IG9mIHNvdXJjZSBjaGFubmVsIChyb3cpLgotICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2YgZGVzdGluYXRpb24gY2hhbm5lbCAocm93KS4KLSAqIEBwYXJhbSBbaW5dICAgIEZpeGVkLXBvaW50IHBhcnQgb2YgbWl4IGZhY3RvciB0byBiZSBhcHBsaWVkLgotICogQHBhcmFtIFtpbl0gICAgU2NhbGUgZmFjdG9yIG9mIG1peCBmYWN0b3IgdG8gYmUgYXBwbGllZC4KLSAqIEByZXR1cm5zICAgICAgIE5vdGhpbmcgdG8gcmV0dXJuLgotICoqLwotc3RhdGljCi12b2lkIGRteFNldENoYW5uZWwoCi0gICAgICAgIEZJWFBfRE1YICAgICAgICAgICAgbWl4RmFjdG9yc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgIG1peFNjYWxlc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdLAotICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgIGRzdENoLAotICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgIHNyY0NoLAotICAgICAgICBjb25zdCBGSVhQX0RNWCAgICAgIGZhY3RvciwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICBzY2FsZQotICAgICAgICkKLXsKLSAgaW50IGNoOwotICBmb3IgKGNoPTA7IGNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGNoKz0xKSB7Ci0gICAgaWYgKG1peEZhY3RvcnNbc3JjQ2hdW2NoXSAhPSAoRklYUF9ETVgpMCkgewotICAgICAgbWl4RmFjdG9yc1tkc3RDaF1bY2hdID0gRlhfREJMMkZYX0RNWChmTXVsdChtaXhGYWN0b3JzW3NyY0NoXVtjaF0sIGZhY3RvcikpOwotICAgICAgbWl4U2NhbGVzW2RzdENoXVtjaF0gID0gbWl4U2NhbGVzW3NyY0NoXVtjaF0gKyBzY2FsZTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIGZvciBkb3dubWl4IG1hdHJpeCBtYW5pcHVsYXRpb24gdGhhdCBhZGRzIGEgc291cmNlIGNoYW5uZWwgKHJvdykKLSAqICBzY2FsZWQgYnkgYSBnaXZlbiBtaXggZmFjdG9yIHRvIGEgZGVzdGluYXRpb24gY2hhbm5lbCAocm93KSBpbiBhIGdpdmVuIGRvd25taXggbWF0cml4LgotICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBmaXhlZC1wb2ludCBwYXJ0cyBvZiB0aGUgZG93bm1peCBtYXRyaXguCi0gKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIHNjYWxlIGZhY3RvciBtYXRyaXggYXNzb2NpYXRlZCB0byB0aGUgZG93bm1peCBmYWN0b3JzLgotICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2Ygc291cmNlIGNoYW5uZWwgKHJvdykuCi0gKiBAcGFyYW0gW2luXSAgICBJbmRleCBvZiBkZXN0aW5hdGlvbiBjaGFubmVsIChyb3cpLgotICogQHBhcmFtIFtpbl0gICAgRml4ZWQtcG9pbnQgcGFydCBvZiBtaXggZmFjdG9yIHRvIGJlIGFwcGxpZWQuCi0gKiBAcGFyYW0gW2luXSAgICBTY2FsZSBmYWN0b3Igb2YgbWl4IGZhY3RvciB0byBiZSBhcHBsaWVkLgotICogQHJldHVybnMgICAgICAgTm90aGluZyB0byByZXR1cm4uCi0gKiovCi1zdGF0aWMKLXZvaWQgZG14QWRkQ2hhbm5lbCgKLSAgICAgICAgRklYUF9ETVggICAgICAgICAgICBtaXhGYWN0b3JzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgbWl4U2NhbGVzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCi0gICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAgZHN0Q2gsCi0gICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAgc3JjQ2gsCi0gICAgICAgIGNvbnN0IEZJWFBfRE1YICAgICAgZmFjdG9yLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIHNjYWxlCi0gICAgICAgKQotewotICBpbnQgY2g7Ci0gIGZvciAoY2g9MDsgY2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgY2grPTEpIHsKLSAgICBGSVhQX0RCTCBhZGRGYWN0ID0gZk11bHQobWl4RmFjdG9yc1tzcmNDaF1bY2hdLCBmYWN0b3IpOwotICAgIGlmIChhZGRGYWN0ICE9IChGSVhQX0RNWCkwKSB7Ci0gICAgICBJTlQgbmV3U2NhbGUgPSBtaXhTY2FsZXNbc3JjQ2hdW2NoXSArIHNjYWxlOwotICAgICAgaWYgKG1peEZhY3RvcnNbZHN0Q2hdW2NoXSAhPSAoRklYUF9ETVgpMCkgewotICAgICAgICBpZiAobmV3U2NhbGUgPiBtaXhTY2FsZXNbZHN0Q2hdW2NoXSkgewotICAgICAgICAgIG1peEZhY3RvcnNbZHN0Q2hdW2NoXSA+Pj0gbmV3U2NhbGUgLSBtaXhTY2FsZXNbZHN0Q2hdW2NoXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBhZGRGYWN0ID4+PSBtaXhTY2FsZXNbZHN0Q2hdW2NoXSAtIG5ld1NjYWxlOwotICAgICAgICAgIG5ld1NjYWxlICA9IG1peFNjYWxlc1tkc3RDaF1bY2hdOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBtaXhGYWN0b3JzW2RzdENoXVtjaF0gKz0gRlhfREJMMkZYX0RNWChhZGRGYWN0KTsKLSAgICAgIG1peFNjYWxlc1tkc3RDaF1bY2hdICAgPSBuZXdTY2FsZTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKiogUHJpdmF0ZSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBkb3dubWl4IGZhY3RvciBtYXRyaXggZGVwZW5kaW5nIG9uIHRoZSBpbnB1dCBhbmQgb3V0cHV0Ci0gKiAgY29uZmlndXJhdGlvbiwgdGhlIHVzZXIgcGFyYW1ldGVycyBhcyB3ZWxsIGFzIHRoZSBnaXZlbiBtZXRhZGF0YS4gVGhpcyBmdW5jdGlvbiBpcyB0aGUgbW9kdWxlcwotICogIGJyYWluIGFuZCBob2xkIGFsbCBkb3dubWl4IGFsZ29yaXRobXMuCi0gKiBAcGFyYW0gW2luXSAgRmxhZyB0aGF0IGluZGljYXRlcyBpZiBpbkNoTW9kZSBob2xkcyBhIHJlYWwgKHBhY2tlZCkgY2hhbm5lbCBtb2RlIG9yIGhhcyBiZWVuCi0gICAgICAgICAgICAgICAgY29udmVydGVkIHRvIGEgTVBFRy00IGNoYW5uZWwgY29uZmlndXJhdGlvbiBpbmRleC4KLSAqIEBwYXJhbSBbaW5dICBEZXBlbmRlbnQgb24gdGhlIGluTW9kZUlzQ2ZnIGZsYWcgdGhpcyBmaWVsZCBoYW5kcyBpbiBhIChwYWNrZWQpIGNoYW5uZWwgbW9kZSBvcgotICAgICAgICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIE1QRUctNCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gaW5kZXgub2YgdGhlIGlucHV0IGNvbmZpZ3VyYXRpb24uCi0gKiBAcGFyYW0gW2luXSAgVGhlIChwYWNrZWQpIGNoYW5uZWwgbW9kZSBvZiB0aGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24uCi0gKiBAcGFyYW0gW2luXSAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgaG9sZGluZyBhbGwgY3VycmVudCB1c2VyIHBhcmFtZXRlci4KLSAqIEBwYXJhbSBbaW5dICBQb2ludGVyIHRvIGZpZWxkIGhvbGRpbmcgYWxsIGN1cnJlbnQgbWV0YSBkYXRhLgotICogQHBhcmFtIFtvdXRdIFBvaW50ZXIgdG8gZml4ZWQtcG9pbnQgcGFydHMgb2YgdGhlIGRvd25taXggbWF0cml4LiBOb3JtYWxpemVkIHRvIG9uZSBzY2FsZSBmYWN0b3IuCi0gKiBAcGFyYW0gW291dF0gVGhlIGNvbW1vbiBzY2FsZSBmYWN0b3Igb2YgdGhlIGRvd25taXggbWF0cml4LgotICogQHJldHVybnMgICAgIEFuIGVycm9yIGNvZGUuCi0gKiovCi1zdGF0aWMKLVBDTURNWF9FUlJPUiBnZXRNaXhGYWN0b3JzICgKLSAgICAgICAgY29uc3QgVUNIQVIgICAgICAgICAgICAgICAgIGluTW9kZUlzQ2ZnLAotICAgICAgICBQQ01fRE1YX0NIQU5ORUxfTU9ERSAgICAgICAgaW5DaE1vZGUsCi0gICAgICAgIGNvbnN0IFBDTV9ETVhfQ0hBTk5FTF9NT0RFICBvdXRDaE1vZGUsCi0gICAgICAgIGNvbnN0IFBDTV9ETVhfVVNFUl9QQVJBTVMgICpwUGFyYW1zLAotICAgICAgICBjb25zdCBETVhfQlNfTUVUQV9EQVRBICAgICAqcE1ldGFEYXRhLAotICAgICAgICBGSVhQX0RNWCAgICAgICAgICAgICAgICAgICAgbWl4RmFjdG9yc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAqcE91dFNjYWxlCi0gICAgICApCi17Ci0gIFBDTURNWF9FUlJPUiBlcnIgPSBQQ01ETVhfT0s7Ci0gIElOVCAgbWl4U2NhbGVzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU107Ci0gIElOVCAgbWF4U2NhbGUgPSAwOwotICBpbnQgIG51bUluQ2hhbm5lbCwgbnVtT3V0Q2hhbm5lbDsKLSAgdW5zaWduZWQgaW50ICBvdXRDaCwgaW5DaCwgaW5DaENmZyA9IDA7Ci0gIHVuc2lnbmVkIGludCAgdmFsaWRbUENNX0RNWF9NQVhfQ0hBTk5FTFNdID0geyAwIH07Ci0KLSAgRkRLX0FTU0VSVChwTWV0YURhdGEgICE9IE5VTEwpOwotICBGREtfQVNTRVJUKG1peEZhY3RvcnMgIT0gTlVMTCk7Ci0gIC8qIENoZWNrIG9uIGEgc3VwcG9ydGVkIG91dHB1dCBjb25maWd1cmF0aW9uICovCi0gIEZES19BU1NFUlQoIChvdXRDaE1vZGUgPT0gQ0hfTU9ERV8xXzBfMF8wKQotICAgICAgICAgICB8fCAob3V0Q2hNb2RlID09IENIX01PREVfMl8wXzBfMCkKLSAgICAgICAgICAgfHwgKG91dENoTW9kZSA9PSBDSF9NT0RFXzNfMF8yXzEpICk7Ci0KLSAgaWYgKGluTW9kZUlzQ2ZnKSB7Ci0gICAgLyogV29ya2Fyb3VuZCBmb3IgdGhlIGFtYmlndWl0eSBvZiB0aGUgaW50ZXJuYWwgY2hhbm5lbCBtb2Rlcy4KLSAgICAgICBDb252ZXJ0IGNoYW5uZWwgY29uZmlnIHRvIGNoYW5uZWwgbW9kZTogKi8KLSAgICBpbkNoQ2ZnICA9ICh1bnNpZ25lZCBpbnQpaW5DaE1vZGU7Ci0gICAgc3dpdGNoIChpbkNoQ2ZnKSB7Ci0gICAgY2FzZSAxOiBjYXNlIDI6IGNhc2UgMzoKLSNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTFMgPiAzKQotICAgIGNhc2UgNDogY2FzZSA1OiBjYXNlIDY6Ci0jZW5kaWYKLSAgICAgIGluQ2hNb2RlID0gb3V0Q2hNb2RlVGFibGVbaW5DaENmZ107Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDExOgotICAgICAgaW5DaE1vZGUgPSBDSF9NT0RFXzNfMF8zXzE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEyOgotICAgICAgaW5DaE1vZGUgPSBDSF9NT0RFXzNfMF80XzE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDc6IGNhc2UgMTQ6Ci0gICAgICBpbkNoTW9kZSA9IENIX01PREVfNV8wXzJfMTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBGREtfQVNTRVJUKDApOwotICAgIH0KLSAgfQotCi0gIC8qIEV4dHJhY3QgdGhlIHRvdGFsIG51bWJlciBvZiBpbnB1dCBjaGFubmVscyAqLwotICBudW1JbkNoYW5uZWwgID0gIChpbkNoTW9kZSYweEYpCi0gICAgICAgICAgICAgICAgKyAoKGluQ2hNb2RlPj4gNCkmMHhGKQotICAgICAgICAgICAgICAgICsgKChpbkNoTW9kZT4+IDgpJjB4RikKLSAgICAgICAgICAgICAgICArICgoaW5DaE1vZGU+PjEyKSYweEYpOwotICAvKiBFeHRyYWN0IHRoZSB0b3RhbCBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzICovCi0gIG51bU91dENoYW5uZWwgPSAgKG91dENoTW9kZSYweEYpCi0gICAgICAgICAgICAgICAgKyAoKG91dENoTW9kZT4+IDQpJjB4RikKLSAgICAgICAgICAgICAgICArICgob3V0Q2hNb2RlPj4gOCkmMHhGKQotICAgICAgICAgICAgICAgICsgKChvdXRDaE1vZGU+PjEyKSYweEYpOwotCi0gIC8qIE1QRUcgYW1tZW5kbWVudCA0IGFrYSBFVFNJIG1ldGFkYXRhIGFuZCBmYWxsYmFjayBtb2RlOiAqLwotCi0KLSAgLyogQ3JlYXRlIGlkZW50aXR5IERNWCBtYXRyaXg6ICovCi0gIGZvciAob3V0Q2g9MDsgb3V0Q2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgb3V0Q2grPTEpIHsKLSAgICBkbXhJbml0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBvdXRDaCApOwotICB9Ci0gIGlmICgoKGluQ2hNb2RlPj4xMikmMHhGKSA9PSAwKSB7Ci0gICAgLyogQ2xlYXIgZW1wdHkgb3Igd3JvbmdseSBtYXBwZWQgaW5wdXQgY2hhbm5lbCAqLwotICAgIGRteENsZWFyQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMT1dfRlJFUVVFTkNZX0NIQU5ORUwgKTsKLSAgfQotCi0gIC8qIEZJUlNUIFNUQUdFOiAqLwotICBpZiAobnVtSW5DaGFubmVsID4gU0lYX0NIQU5ORUwpCi0gIHsgLyogQWx3YXlzIHVzZSBNUEVHIGVxdWF0aW9ucyBlaXRoZXIgd2l0aCBtZXRhIGRhdGEgb3Igd2l0aCBkZWZhdWx0IHZhbHVlcy4gKi8KLSAgICBGSVhQX0RNWCAgZE1peEZhY3RBLCBkTWl4RmFjdEI7Ci0gICAgSU5UICAgICAgIGRNaXhTY2FsZUEsIGRNaXhTY2FsZUI7Ci0gICAgaW50ICAgICAgIGlzVmFsaWRDZmcgPSBUUlVFOwotCi0gICAgLyogR2V0IGZhY3RvcnMgZnJvbSBtZXRhIGRhdGEgKi8KLSAgICBkTWl4RmFjdEEgID0gYWJNaXhMdmxWYWx1ZVRhYltwTWV0YURhdGEtPmRtaXhJZHhBXTsKLSAgICBkTWl4U2NhbGVBID0gKHBNZXRhRGF0YS0+ZG1peElkeEE9PTApID8gMSA6IDA7Ci0gICAgZE1peEZhY3RCICA9IGFiTWl4THZsVmFsdWVUYWJbcE1ldGFEYXRhLT5kbWl4SWR4Ql07Ci0gICAgZE1peFNjYWxlQiA9IChwTWV0YURhdGEtPmRtaXhJZHhCPT0wKSA/IDEgOiAwOwotCi0gICAgLyogQ2hlY2sgaWYgaW5wdXQgaXMgaW4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb25zICovCi0gICAgc3dpdGNoIChpbkNoTW9kZSkgewotICAgIGNhc2UgQ0hfTU9ERV8zXzBfM18xOiAgIC8qIGNoQ2ZnIDExICovCi0gICAgICAvKiA2LjFjaDogIEMnID0gQzsgIEwnID0gTDsgIFInID0gUjsgIExGRScgPSBMRkU7Ci0gICAgICAgICAgICAgICAgIExzJyA9IExzKmRtaXhfYV9pZHggKyBDcypkbWl4X2JfaWR4OwotICAgICAgICAgICAgICAgICBScycgPSBScypkbWl4X2FfaWR4ICsgQ3MqZG1peF9iX2lkeDsgKi8KLSAgICAgIGRteENsZWFyQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTCApOyAgLyogY2xlYXIgZW1wdHkgaW5wdXQgY2hhbm5lbCAqLwotICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwotICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwotICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwotICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSF9NT0RFXzNfMl8xXzA6Ci0gICAgY2FzZSBDSF9NT0RFXzNfMl8xXzE6ICAgLyogY2hDZmcgMTEgYnV0IHdpdGggc2lkZSBjaGFubmVscyAqLwotICAgICAgLyogNi4xY2g6ICBDJyA9IEM7ICBMJyA9IEw7ICBSJyA9IFI7ICBMRkUnID0gTEZFOwotICAgICAgICAgICAgICAgICBMcycgPSBMcypkbWl4X2FfaWR4ICsgQ3MqZG1peF9iX2lkeDsKLSAgICAgICAgICAgICAgICAgUnMnID0gUnMqZG1peF9hX2lkeCArIENzKmRtaXhfYl9pZHg7ICovCi0gICAgICBkbXhDbGVhckNoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMICk7ICAvKiBjbGVhciBlbXB0eSBpbnB1dCBjaGFubmVsICovCi0gICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgTEVGVF9SRUFSX0NIQU5ORUwsICAgICAgIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwotICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMLCBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKLSAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9SRUFSX0NIQU5ORUwsICBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgICAgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7Ci0gICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCwgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwotICAgICAgaXNWYWxpZENmZyA9IEZBTFNFOwotICAgICAgZXJyID0gUENNRE1YX0lOVkFMSURfTU9ERTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hfTU9ERV81XzJfMV8wOgotICAgIGNhc2UgQ0hfTU9ERV81XzBfMV8wOgotICAgIGNhc2UgQ0hfTU9ERV81XzBfMV8xOgotICAgICAgLyogICAgICAgICBMcycgPSBDcypkbWl4X2FfaWR4OwotICAgICAgICAgICAgICAgICBScycgPSBDcypkbWl4X2FfaWR4OyAqLwotICAgICAgZG14Q2xlYXJDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCApOyAgLyogY2xlYXIgZW1wdHkgaW5wdXQgY2hhbm5lbCAqLwotICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsIExFRlRfUkVBUl9DSEFOTkVMLCBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKLSAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9SRUFSX0NIQU5ORUwsICBMRUZUX1JFQVJfQ0hBTk5FTCwgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7Ci0gICAgICBpc1ZhbGlkQ2ZnID0gRkFMU0U7Ci0gICAgICBlcnIgPSBQQ01ETVhfSU5WQUxJRF9NT0RFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSF9NT0RFXzNfMF80XzE6ICAgLyogY2hDZmcgMTIgKi8KLSAgICAgIC8qIDcuMWNoIFN1cnJvdW5kIEJhY2s6ICBDJyA9IEM7ICBMJyA9IEw7ICBSJyA9IFI7ICBMRkUnID0gTEZFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExzJyA9IExzKmRtaXhfYV9pZHggKyBMc3IqZG1peF9iX2lkeDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBScycgPSBScypkbWl4X2FfaWR4ICsgUnNyKmRtaXhfYl9pZHg7ICovCi0gICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwotICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsICBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKLSAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLCBSSUdIVF9SRUFSX0NIQU5ORUwsICAgICAgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7Ci0gICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSF9NT0RFXzVfMF8yXzE6ICAgLyogY2hDZmcgNyB8fCAxNCAqLwotICAgICAgaWYgKGluQ2hDZmcgPT0gMTQpIHsKLSAgICAgICAgLyogNy4xY2ggRnJvbnQgSGVpZ2h0OiAgQycgPSBDOyAgTHMnID0gTHM7ICBScycgPSBSczsgIExGRScgPSBMRkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwnID0gTCpkbWl4X2FfaWR4ICsgTHYqZG1peF9iX2lkeDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUicgPSBSKmRtaXhfYV9pZHggKyBSdipkbWl4X2JfaWR4OyAqLwotICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfRlJPTlRfQ0hBTk5FTCwgICAgICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKLSAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX01VTFRJUFJQU19DSEFOTkVMLCAgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7Ci0gICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfRlJPTlRfQ0hBTk5FTCwgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwotICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMLCBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIDcuMWNoIEZyb250OiAgTHMnID0gTHM7ICBScycgPSBSczsgIExGRScgPSBMRkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgQycgPSBDICsgKExjK1JjKSpkbWl4X2FfaWR4OwotICAgICAgICAgICAgICAgICAgICAgICAgIEwnID0gTCArIExjKmRtaXhfYl9pZHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgUicgPSBSICsgUmMqZG1peF9iX2lkeDsKLSAgICAgICAgICAgICAgICAgICAgICAgICBDQVVUSU9OOiBMK1IgYXJlIG5vdCBhdCAoTVBFRykgaW5kZXggMSsyLiAqLwotICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBMRUZUX0ZST05UX0NIQU5ORUwsICAgICAgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7Ci0gICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIFJJR0hUX0ZST05UX0NIQU5ORUwsICAgICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKLSAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICAgTEVGVF9GUk9OVF9DSEFOTkVMLCAgICAgIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwotICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgICBMRUZUX01VTFRJUFJQU19DSEFOTkVMLCAgRkwyRlhDT05TVF9ETVgoMC41ZiksIDEgKTsKLSAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCAgUklHSFRfRlJPTlRfQ0hBTk5FTCwgICAgIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwotICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsICBSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC41ZiksIDEgKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBOb3RoaW5nIHRvIGRvLiBKdXN0IHVzZSB0aGUgaWRlbnRpdHkgbWF0cml4LiAqLwotICAgICAgaXNWYWxpZENmZyA9IEZBTFNFOwotICAgICAgZXJyID0gUENNRE1YX0lOVkFMSURfTU9ERTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIEFkZCBhZGRpdGlvbmFsIERNWCBnYWluICovCi0gICAgaWYgKCAoaXNWYWxpZENmZyA9PSBUUlVFKQotICAgICAgJiYgKHBNZXRhRGF0YS0+ZG14R2FpbklkeDUgIT0gMCkpCi0gICAgeyAvKiBBcHBseSBETVggZ2FpbiA1ICovCi0gICAgICBGSVhQX0RNWCBkbXhHYWluOwotICAgICAgSU5UICAgICAgZG14U2NhbGU7Ci0gICAgICBJTlQgICAgICBzaWduID0gKHBNZXRhRGF0YS0+ZG14R2FpbklkeDUgJiAweDQwKSA/IC0xIDogMTsKLSAgICAgIElOVCAgICAgIHZhbCAgPSBwTWV0YURhdGEtPmRteEdhaW5JZHg1ICYgMHgzRjsKLQotICAgICAgLyogMTBeKGRteF9nYWluXzUvODApICovCi0gICAgICBkbXhHYWluID0gRlhfREJMMkZYX0RNWCggZkxkUG93KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC44MzA0ODIwMjM3MjE4NDFmKSwgMiwgIC8qIGxvZzIoMTApICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKHNpZ24qdmFsKihMT05HKUZMMkZYQ09OU1RfREJMKDAuMDEyNWYpKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRteFNjYWxlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgLyogQ3VycmVudGx5IG9ubHkgcG9zaXRpdmUgc2NhbGUgZmFjdG9ycyBzdXBwb3J0ZWQhICovCi0gICAgICBpZiAoZG14U2NhbGUgPCAwKSB7Ci0gICAgICAgIGRteEdhaW4gPj49IC1kbXhTY2FsZTsKLSAgICAgICAgZG14U2NhbGUgID0gIDA7Ci0gICAgICB9Ci0KLSAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgQ0VOVEVSX0ZST05UX0NIQU5ORUwsICBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgIGRteEdhaW4sIGRteFNjYWxlICk7Ci0gICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgICAgTEVGVF9GUk9OVF9DSEFOTkVMLCAgICBkbXhHYWluLCBkbXhTY2FsZSApOwotICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCAgIFJJR0hUX0ZST05UX0NIQU5ORUwsICAgZG14R2FpbiwgZG14U2NhbGUgKTsKLSAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9SRUFSX0NIQU5ORUwsICAgICBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgIGRteEdhaW4sIGRteFNjYWxlICk7Ci0gICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICAgUklHSFRfUkVBUl9DSEFOTkVMLCAgICBkbXhHYWluLCBkbXhTY2FsZSApOwotICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMT1dfRlJFUVVFTkNZX0NIQU5ORUwsIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCwgZG14R2FpbiwgZG14U2NhbGUgKTsKLSAgICB9Ci0KLSAgICAvKiBNYXJrIHRoZSBvdXRwdXQgY2hhbm5lbHMgKi8KLSAgICB2YWxpZFtDRU5URVJfRlJPTlRfQ0hBTk5FTF0gID0gMTsKLSAgICB2YWxpZFtMRUZUX0ZST05UX0NIQU5ORUxdICAgID0gMTsKLSAgICB2YWxpZFtSSUdIVF9GUk9OVF9DSEFOTkVMXSAgID0gMTsKLSAgICB2YWxpZFtMRUZUX1JFQVJfQ0hBTk5FTF0gICAgID0gMTsKLSAgICB2YWxpZFtSSUdIVF9SRUFSX0NIQU5ORUxdICAgID0gMTsKLSAgICB2YWxpZFtMT1dfRlJFUVVFTkNZX0NIQU5ORUxdID0gMTsKLQotICAgIC8qIFVwZGF0ZSBjaGFubmVsIG1vZGUgZm9yIHRoZSBuZXh0IHN0YWdlICovCi0gICAgaW5DaE1vZGUgPSBDSF9NT0RFXzNfMF8yXzE7Ci0gIH0KLQotICAvKiBTRUNPTkQgU1RBR0U6ICovCi0gIGlmIChudW1PdXRDaGFubmVsIDw9IFRXT19DSEFOTkVMKSB7Ci0gICAgLyogQ3JlYXRlIERNWCBtYXRyaXggYWNjb3JkaW5nIHRvIGlucHV0IGNvbmZpZ3VyYXRpb24gKi8KLSAgICBzd2l0Y2ggKGluQ2hNb2RlKSB7Ci0gICAgY2FzZSBDSF9NT0RFXzJfMF8wXzA6ICAgLyogY2hDZmcgMiAqLwotICAgICAgLyogQXBwbHkgdGhlIGR1YWwgY2hhbm5lbCBtb2RlLiAqLwotICAgICAgc3dpdGNoIChwUGFyYW1zLT5kdWFsQ2hhbm5lbE1vZGUpIHsKLSAgICAgIGNhc2UgQ0gxX01PREU6ICAvKiBMJyA9IDAuNzA3ICogQ2gxOwotICAgICAgICAgICAgICAgICAgICAgICAgIFInID0gMC43MDcgKiBDaDE7ICovCi0gICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9GUk9OVF9DSEFOTkVMLCAgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwotICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIENIMl9NT0RFOiAgLyogTCcgPSAwLjcwNyAqIENoMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICBSJyA9IDAuNzA3ICogQ2gyOyAqLwotICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIFJJR0hUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKLSAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBNSVhFRF9NT0RFOiAgLyogTCcgPSAwLjUqQ2gxICsgMC41KkNoMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFInID0gMC41KkNoMSArIDAuNSpDaDI7ICovCi0gICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9GUk9OVF9DSEFOTkVMLCAgRkwyRlhDT05TVF9ETVgoMC41ZiksIDAgKTsKLSAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBSSUdIVF9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjVmKSwgMCApOwotICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAwICk7Ci0gICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC41ZiksIDAgKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgY2FzZSBTVEVSRU9fTU9ERToKLSAgICAgICAgLyogTm90aGluZyB0byBkbyAqLwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hfTU9ERV8yXzBfMV8wOgotICAgICAgLyogTCcgPSBMICsgMC43MDcqUzsKLSAgICAgICAgIFInID0gUiArIDAuNzA3KlM7ICovCi0gICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCAgIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKLSAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgTEVGVF9SRUFSX0NIQU5ORUwsICAgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSF9NT0RFXzNfMF8wXzA6ICAgLyogY2hDZmcgMyAqLwotICAgICAgLyogTCcgPSBMICsgMC43MDcqQzsKLSAgICAgICAgIFInID0gUiArIDAuNzA3KkM7ICovCi0gICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7Ci0gICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENIX01PREVfM18wXzFfMDogICAvKiBjaENmZyA0ICovCi0gICAgICAvKiBMJyA9IEwgKyAwLjcwNypDICsgMC43MDcqUzsKLSAgICAgICAgIFInID0gUiArIDAuNzA3KkMgKyAwLjcwNypTOyAqLwotICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwotICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwotICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwotICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSF9NT0RFXzNfMF8yXzA6ICAgLyogY2hDZmcgNSAqLwotICAgIGNhc2UgQ0hfTU9ERV8zXzBfMl8xOiAgIC8qIGNoQ2ZnIDYgKi8KLSAgICAgIC8qIE1QRUcgKyBJVFUgKyBETEIKLSAgICAgICAgIEJ1dCBiZWNhdXNlIHRoZSBkZWZhdWx0IGRvd25taXggZXF1YXRpb25zIGFuZCBjb2VmZmljaWVudHMgYXJlIGVxdWFsIHdlIHN0aWNrIHRvIE1QRUcuICovCi0gICAgICBpZiAoICAocE1ldGFEYXRhLT50eXBlRmxhZ3MgJiBUWVBFX0RTRV9EQVRBKQotICAgICAgICB8fCAhKHBNZXRhRGF0YS0+dHlwZUZsYWdzICYgVFlQRV9QQ0VfREFUQSkgKQotICAgICAgewotICAgICAgICBGSVhQX0RNWCAgY01peEx2bCwgc01peEx2bCwgbE1peEx2bDsKLSAgICAgICAgSU5UICAgICAgIGNNaXhTY2FsZSwgc01peFNjYWxlLCBsTWl4U2NhbGU7Ci0KLSAgICAgICAgLyogR2V0IGZhY3RvcnMgZnJvbSBtZXRhIGRhdGEgKi8KLSAgICAgICAgY01peEx2bCAgID0gYWJNaXhMdmxWYWx1ZVRhYltwTWV0YURhdGEtPmNMZXZJZHhdOwotICAgICAgICBjTWl4U2NhbGUgPSAocE1ldGFEYXRhLT5jTGV2SWR4PT0wKSA/IDEgOiAwOwotICAgICAgICBzTWl4THZsICAgPSBhYk1peEx2bFZhbHVlVGFiW3BNZXRhRGF0YS0+c0xldklkeF07Ci0gICAgICAgIHNNaXhTY2FsZSA9IChwTWV0YURhdGEtPnNMZXZJZHg9PTApID8gMSA6IDA7Ci0gICAgICAgIGxNaXhMdmwgICA9IGxmZU1peEx2bFZhbHVlVGFiW3BNZXRhRGF0YS0+ZG1peElkeExmZV07Ci0gICAgICAgIGlmIChwTWV0YURhdGEtPmRtaXhJZHhMZmUgPD0gMSkgewotICAgICAgICAgIGxNaXhTY2FsZSA9IDI7Ci0gICAgICAgIH0gZWxzZSBpZiAocE1ldGFEYXRhLT5kbWl4SWR4TGZlIDw9IDUpIHsKLSAgICAgICAgICBsTWl4U2NhbGUgPSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGxNaXhTY2FsZSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgLyogU2V0dXAgdGhlIERNWCBtYXRyaXggKi8KLSAgICAgICAgaWYgKCAocFBhcmFtcy0+cHNldWRvU3Vyck1vZGUgPT0gRk9SQ0VfUFNfRE1YKQotICAgICAgICAgIHx8ICgocFBhcmFtcy0+cHNldWRvU3Vyck1vZGUgPT0gQVVUT19QU19ETVgpICYmIChwTWV0YURhdGEtPnBzZXVkb1N1cnJvdW5kPT0xKSkpCi0gICAgICAgIHsgLyogTCcgPSBMICsgQypjbGV2IC0gKExzK1JzKSpzbGV2ICsgTEZFKmxmbGV2OwotICAgICAgICAgICAgIFInID0gUiArIEMqY2xldiArIChMcytScykqc2xldiArIExGRSpsZmxldjsgKi8KLSAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCAgY01peEx2bCwgY01peFNjYWxlICk7Ci0gICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgLXNNaXhMdmwsIHNNaXhTY2FsZSApOwotICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgUklHSFRfUkVBUl9DSEFOTkVMLCAgIC1zTWl4THZsLCBzTWl4U2NhbGUgKTsKLSAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCwgbE1peEx2bCwgbE1peFNjYWxlICk7Ci0gICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgIGNNaXhMdmwsIGNNaXhTY2FsZSApOwotICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgTEVGVF9SRUFSX0NIQU5ORUwsICAgICBzTWl4THZsLCBzTWl4U2NhbGUgKTsKLSAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICAgc01peEx2bCwgc01peFNjYWxlICk7Ci0gICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBMT1dfRlJFUVVFTkNZX0NIQU5ORUwsIGxNaXhMdmwsIGxNaXhTY2FsZSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeyAvKiBMJyA9IEwgKyBDKmNsZXYgKyBMcypzbGV2ICsgTEZFKmxsZXY7Ci0gICAgICAgICAgICAgUicgPSBSICsgQypjbGV2ICsgUnMqc2xldiArIExGRSpsbGV2OyAqLwotICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsICBjTWl4THZsLCBjTWl4U2NhbGUgKTsKLSAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgc01peEx2bCwgc01peFNjYWxlICk7Ci0gICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMT1dfRlJFUVVFTkNZX0NIQU5ORUwsIGxNaXhMdmwsIGxNaXhTY2FsZSApOwotICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgQ0VOVEVSX0ZST05UX0NIQU5ORUwsICBjTWl4THZsLCBjTWl4U2NhbGUgKTsKLSAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICAgc01peEx2bCwgc01peFNjYWxlICk7Ci0gICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBMT1dfRlJFUVVFTkNZX0NIQU5ORUwsIGxNaXhMdmwsIGxNaXhTY2FsZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQWRkIGFkZGl0aW9uYWwgRE1YIGdhaW4gKi8KLSAgICAgICAgaWYgKCBwTWV0YURhdGEtPmRteEdhaW5JZHgyICE9IDAgKQotICAgICAgICB7IC8qIEFwcGx5IERNWCBnYWluIDIgKi8KLSAgICAgICAgICBGSVhQX0RNWCBkbXhHYWluOwotICAgICAgICAgIElOVCAgICAgIGRteFNjYWxlOwotICAgICAgICAgIElOVCAgICAgIHNpZ24gPSAocE1ldGFEYXRhLT5kbXhHYWluSWR4MiAmIDB4NDApID8gLTEgOiAxOwotICAgICAgICAgIElOVCAgICAgIHZhbCAgPSBwTWV0YURhdGEtPmRteEdhaW5JZHgyICYgMHgzRjsKLQotICAgICAgICAgIC8qIDEwXihkbXhfZ2Fpbl8yLzgwKSAqLwotICAgICAgICAgIGRteEdhaW4gPSBGWF9EQkwyRlhfRE1YKCBmTGRQb3coCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC44MzA0ODIwMjM3MjE4NDFmKSwgMiwgIC8qIGxvZzIoMTApICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKShzaWduKnZhbCooTE9ORylGTDJGWENPTlNUX0RCTCgwLjAxMjVmKSksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG14U2NhbGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgIC8qIEN1cnJlbnRseSBvbmx5IHBvc2l0aXZlIHNjYWxlIGZhY3RvcnMgc3VwcG9ydGVkISAqLwotICAgICAgICAgIGlmIChkbXhTY2FsZSA8IDApIHsKLSAgICAgICAgICAgIGRteEdhaW4gPj49IC1kbXhTY2FsZTsKLSAgICAgICAgICAgIGRteFNjYWxlICA9ICAwOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9GUk9OVF9DSEFOTkVMLCAgZG14R2FpbiwgZG14U2NhbGUgKTsKLSAgICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX0ZST05UX0NIQU5ORUwsIGRteEdhaW4sIGRteFNjYWxlICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSNpZmRlZiBQQ0VfTUVUQURBVEFfRU5BQkxFCi0gICAgICBlbHNlIHsKLSAgICAgICAgRklYUF9ETVggIGZsZXYsIGNsZXYsIHNsZXZMTCwgc2xldkxSLCBzbGV2UkwsIHNsZXZSUjsKLSAgICAgICAgRklYUF9ETVggIG10cnhNaXhEd25Db2VmID0gbXBlZ01peERvd25JZHgyQ29lZltwTWV0YURhdGEtPm1hdHJpeE1peGRvd25JZHhdOwotCi0gICAgICAgIGlmICggKHBQYXJhbXMtPnBzZXVkb1N1cnJNb2RlID09IEZPUkNFX1BTX0RNWCkKLSAgICAgICAgICB8fCAoKHBQYXJhbXMtPnBzZXVkb1N1cnJNb2RlID09IEFVVE9fUFNfRE1YKSAmJiAocE1ldGFEYXRhLT5wc2V1ZG9TdXJyb3VuZD09MSkpKQotICAgICAgICB7IC8qIDMvMiBpbnB1dDogTCcgPSAoMS43MDcrMipBKV4tMSAqIFtMKzAuNzA3KkMtQSpMcy1BKlJzXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFInID0gKDEuNzA3KzIqQSleLTEgKiBbUiswLjcwNypDK0EqTHMrQSpSc107ICovCi0gICAgICAgICAgZmxldiA9IG1wZWdNaXhEb3duSWR4MlByZUZhY3RbMV1bcE1ldGFEYXRhLT5tYXRyaXhNaXhkb3duSWR4XTsKLSAgICAgICAgICBzbGV2UlIgPSBzbGV2UkwgPSBGWF9EQkwyRlhfRE1YKGZNdWx0KGZsZXYsIG10cnhNaXhEd25Db2VmKSk7Ci0gICAgICAgICAgc2xldkxMID0gc2xldkxSID0gLXNsZXZSTDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAvKiAzLzIgaW5wdXQ6IEwnID0gKDEuNzA3K0EpXi0xICogW0wrMC43MDcqQytBKkxzXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFInID0gKDEuNzA3K0EpXi0xICogW1IrMC43MDcqQytBKlJzXTsgKi8KLSAgICAgICAgICBmbGV2ID0gbXBlZ01peERvd25JZHgyUHJlRmFjdFswXVtwTWV0YURhdGEtPm1hdHJpeE1peGRvd25JZHhdOwotICAgICAgICAgIHNsZXZSUiA9IHNsZXZMTCA9IEZYX0RCTDJGWF9ETVgoZk11bHQoZmxldiwgbXRyeE1peER3bkNvZWYpKTsKLSAgICAgICAgICBzbGV2TFIgPSBzbGV2UkwgPSAoRklYUF9TR0wpMDsKLSAgICAgICAgfQotICAgICAgICAvKiBjb21tb24gZmFjdG9yICovCi0gICAgICAgIGNsZXYgID0gRlhfREJMMkZYX0RNWChmTXVsdChmbGV2LCBtcGVnTWl4RG93bklkeDJDb2VmWzBdIC8qIDAuNzA3ICovKSk7Ci0KLSAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX0ZST05UX0NIQU5ORUwsICAgZmxldiwgICAwICk7Ci0gICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIGNsZXYsICAgMCApOwotICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCAgICBzbGV2TEwsIDAgKTsKLSAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBSSUdIVF9SRUFSX0NIQU5ORUwsICAgc2xldkxSLCAwICk7Ci0KLSAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCAgZmxldiwgICAwICk7Ci0gICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIGNsZXYsICAgMCApOwotICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIExFRlRfUkVBUl9DSEFOTkVMLCAgICBzbGV2UkwsIDAgKTsKLSAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBSSUdIVF9SRUFSX0NIQU5ORUwsICAgc2xldlJSLCAwICk7Ci0gICAgICB9Ci0jZW5kaWYgIC8qIFBDRV9NRVRBREFUQV9FTkFCTEUgKi8KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBUaGlzIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgZml0IHRvIGFueSBrbm93biBkb3dubWl4IGVxdWF0aW9uISAqLwotICAgICAgZXJyID0gUENNRE1YX0lOVkFMSURfTU9ERTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICAvKiBNYXJrIHRoZSBvdXRwdXQgY2hhbm5lbHMgKi8KLSAgICBGREttZW1jbGVhcih2YWxpZCwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKHVuc2lnbmVkIGludCkpOwotICAgIHZhbGlkW0xFRlRfRlJPTlRfQ0hBTk5FTF0gID0gMTsKLSAgICB2YWxpZFtSSUdIVF9GUk9OVF9DSEFOTkVMXSA9IDE7Ci0gICAgLyogVXBkYXRlIGNoYW5uZWwgbW9kZSBmb3IgdGhlIG5leHQgc3RhZ2UgKi8KLSAgICBpbkNoTW9kZSA9IENIX01PREVfMl8wXzBfMDsKLSAgfQotCi0gIGlmIChudW1PdXRDaGFubmVsID09IE9ORV9DSEFOTkVMKSB7Ci0gICAgRklYUF9ETVggbW9ub01peExldmVsOwotICAgIElOVCAgICAgIG1vbm9NaXhTY2FsZTsKLQotI2lmZGVmIFBDRV9NRVRBREFUQV9FTkFCTEUKLSAgICBpZiAoICAocE1ldGFEYXRhLT50eXBlRmxhZ3MgJiBUWVBFX1BDRV9EQVRBKQotICAgICAgJiYgIShwTWV0YURhdGEtPnR5cGVGbGFncyAmIFRZUEVfRFNFX0RBVEEpICkKLSAgICB7IC8qIEMnID0gKDMrMipBKV4tMSAqIFtDK0wrUitBKkxzK0ErUnNdOyAqLwotICAgICAgbW9ub01peExldmVsID0gbXBlZ01peERvd25JZHgyUHJlRmFjdFsyXVtwTWV0YURhdGEtPm1hdHJpeE1peGRvd25JZHhdOwotICAgICAgbW9ub01peFNjYWxlID0gMDsKLQotICAgICAgZG14Q2xlYXJDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIENFTlRFUl9GUk9OVF9DSEFOTkVMICk7Ci0gICAgICBtaXhGYWN0b3JzW0NFTlRFUl9GUk9OVF9DSEFOTkVMXVtDRU5URVJfRlJPTlRfQ0hBTk5FTF0gPSBtb25vTWl4TGV2ZWw7Ci0gICAgICBtaXhGYWN0b3JzW0NFTlRFUl9GUk9OVF9DSEFOTkVMXVtMRUZUX0ZST05UX0NIQU5ORUxdICAgPSBtb25vTWl4TGV2ZWw7Ci0gICAgICBtaXhGYWN0b3JzW0NFTlRFUl9GUk9OVF9DSEFOTkVMXVtSSUdIVF9GUk9OVF9DSEFOTkVMXSAgPSBtb25vTWl4TGV2ZWw7Ci0gICAgICBtb25vTWl4TGV2ZWwgPSBGWF9EQkwyRlhfRE1YKGZNdWx0KG1vbm9NaXhMZXZlbCwgbXBlZ01peERvd25JZHgyQ29lZltwTWV0YURhdGEtPm1hdHJpeE1peGRvd25JZHhdKSk7Ci0gICAgICBtaXhGYWN0b3JzW0NFTlRFUl9GUk9OVF9DSEFOTkVMXVtMRUZUX1JFQVJfQ0hBTk5FTF0gICAgPSBtb25vTWl4TGV2ZWw7Ci0gICAgICBtaXhGYWN0b3JzW0NFTlRFUl9GUk9OVF9DSEFOTkVMXVtSSUdIVF9SRUFSX0NIQU5ORUxdICAgPSBtb25vTWl4TGV2ZWw7Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZgotICAgIHsgLyogQycgPSBMICsgUjsgW2RlZmF1bHRdICovCi0gICAgICBtb25vTWl4TGV2ZWwgPSBGTDJGWENPTlNUX0RNWCgwLjVmKTsKLSAgICAgIG1vbm9NaXhTY2FsZSA9IDE7Ci0gICAgICBkbXhDbGVhckNoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgQ0VOVEVSX0ZST05UX0NIQU5ORUwgKTsgIC8qIEMgaXMgbm90IGluIHRoZSBtaXggKi8KLSAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIG1vbm9NaXhMZXZlbCwgbW9ub01peFNjYWxlICk7Ci0gICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBtb25vTWl4TGV2ZWwsIG1vbm9NaXhTY2FsZSApOwotICAgIH0KLQotICAgIC8qIE1hcmsgdGhlIG91dHB1dCBjaGFubmVsICovCi0gICAgRkRLbWVtY2xlYXIodmFsaWQsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZih1bnNpZ25lZCBpbnQpKTsKLSAgICB2YWxpZFtDRU5URVJfRlJPTlRfQ0hBTk5FTF0gPSAxOwotICB9Ci0KLSNkZWZpbmUgTUFYX1NFQVJDSF9TVEFSVF9WQUwgICggLTcgKQotCi0gIHsKLSAgICBMT05HIGNoU3VtW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKLSAgICBJTlQgIGNoU3VtTWF4ID0gTUFYX1NFQVJDSF9TVEFSVF9WQUw7Ci0KLSAgICAvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgbWF4aW11bSBzY2FsZSBmYWN0b3IgKi8KLSAgICBmb3IgKG91dENoPTA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoKz0xKSB7Ci0gICAgICBpZiAodmFsaWRbb3V0Q2hdIT0wKSB7Ci0gICAgICAgIGZvciAoaW5DaD0wOyBpbkNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGluQ2grPTEpIHsKLSAgICAgICAgICBpZiAobWl4U2NhbGVzW291dENoXVtpbkNoXSA+IG1heFNjYWxlKQotICAgICAgICAgIHsgLyogU3RvcmUgdGhlIG5ldyBtYXhpbXVtICovCi0gICAgICAgICAgICBtYXhTY2FsZSA9IG1peFNjYWxlc1tvdXRDaF1baW5DaF07Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogSW5kaXZpZHVhbHkgYW5hbHlzZSBvdXRwdXQgY2hhbmFsIGxldmVscyAqLwotICAgIGZvciAob3V0Q2g9MDsgb3V0Q2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgb3V0Q2grPTEpIHsKLSAgICAgIGNoU3VtW291dENoXSA9IE1BWF9TRUFSQ0hfU1RBUlRfVkFMOwotICAgICAgaWYgKHZhbGlkW291dENoXSE9MCkgewotICAgICAgICBpbnQgIG92cmZsd1Byb3RTY2FsZSA9IDA7Ci0KLSAgICAgICAgLyogQWNjdW11bGF0ZSBhbGwgZmFjdG9ycyBmb3IgZWFjaCBvdXRwdXQgY2hhbm5lbCAqLwotICAgICAgICBjaFN1bVtvdXRDaF0gPSAwOwotICAgICAgICBmb3IgKGluQ2g9MDsgaW5DaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBpbkNoKz0xKSB7Ci0gICAgICAgICAgU0hPUlQgYWRkRmFjdCA9IEZYX0RNWDJTSFJUKG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdKTsKLSAgICAgICAgICBpZiAoIG1peFNjYWxlc1tvdXRDaF1baW5DaF0gPD0gbWF4U2NhbGUgKSB7Ci0gICAgICAgICAgICBhZGRGYWN0ID4+PSBtYXhTY2FsZSAtIG1peFNjYWxlc1tvdXRDaF1baW5DaF07Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZEZhY3QgPDw9IG1peFNjYWxlc1tvdXRDaF1baW5DaF0gLSBtYXhTY2FsZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2hTdW1bb3V0Q2hdICs9IGFkZEZhY3Q7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoU3VtW291dENoXSA+IChMT05HKU1BWFZBTF9TR0wpIHsKLSAgICAgICAgICB3aGlsZSAoY2hTdW1bb3V0Q2hdID4gKExPTkcpTUFYVkFMX1NHTCkgewotICAgICAgICAgICAgb3ZyZmx3UHJvdFNjYWxlICs9IDE7Ci0gICAgICAgICAgICBjaFN1bVtvdXRDaF0gPj49IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGNoU3VtW291dENoXSA+IDApIHsKLSAgICAgICAgICB3aGlsZSAoKGNoU3VtW291dENoXTw8MSkgPD0gKExPTkcpTUFYVkFMX1NHTCkgewotICAgICAgICAgICAgb3ZyZmx3UHJvdFNjYWxlIC09IDE7Ci0gICAgICAgICAgICBjaFN1bVtvdXRDaF0gPDw9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIFN0b3JlIHRoZSBkaWZmZXJlbnRpYWwgc2NhbGluZyBpbiB0aGUgc2FtZSBhcnJheSAqLwotICAgICAgICBjaFN1bVtvdXRDaF0gPSBvdnJmbHdQcm90U2NhbGU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBvdXRDaCs9MSkgewotICAgICAgaWYgKCAodmFsaWRbb3V0Q2hdICE9IDApCi0gICAgICAgICYmIChjaFN1bVtvdXRDaF0gPiBjaFN1bU1heCkgKQotICAgICAgeyAvKiBTdG9yZSB0aGUgbmV3IG1heGltdW0gKi8KLSAgICAgICAgY2hTdW1NYXggPSBjaFN1bVtvdXRDaF07Ci0gICAgICB9Ci0gICAgfQotICAgIG1heFNjYWxlID0gRkRLbWF4KG1heFNjYWxlK2NoU3VtTWF4LCAwKTsKLQotICAgIC8qIE5vcm1hbGl6ZSBhbGwgZmFjdG9ycyAqLwotICAgIGZvciAob3V0Q2g9MDsgb3V0Q2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgb3V0Q2grPTEpIHsKLSAgICAgIGlmICh2YWxpZFtvdXRDaF0hPTApIHsKLSAgICAgICAgZm9yIChpbkNoPTA7IGluQ2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgaW5DaCs9MSkgewotICAgICAgICAgIGlmIChtaXhGYWN0b3JzW291dENoXVtpbkNoXSAhPSAoRklYUF9ETVgpMCkgewotICAgICAgICAgICAgaWYgKCBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdIDw9IG1heFNjYWxlICkgewotICAgICAgICAgICAgICBtaXhGYWN0b3JzW291dENoXVtpbkNoXSA+Pj0gbWF4U2NhbGUgLSBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgbWl4RmFjdG9yc1tvdXRDaF1baW5DaF0gPDw9IG1peFNjYWxlc1tvdXRDaF1baW5DaF0gLSBtYXhTY2FsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1peFNjYWxlc1tvdXRDaF1baW5DaF0gPSBtYXhTY2FsZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qIHJldHVybiB0aGUgc2NhbGUgZmFjdG9yICovCi0gICpwT3V0U2NhbGUgPSBtYXhTY2FsZTsKLQotICByZXR1cm4gKGVycik7Ci19Ci0KLQotLyoqIE9wZW4gYW5kIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgdGhlIFBDTSBkb3dubWl4IG1vZHVsZQotICogQHBhcmFtIFtvdXRdIFBvaW50ZXIgdG8gYSBidWZmZXIgcmVjZWl2aW5nIHRoZSBoYW5kbGUgb2YgdGhlIG5ldyBpbnN0YW5jZS4KLSAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KLSAqKi8KLVBDTURNWF9FUlJPUiBwY21EbXhfT3BlbiAoCi0gICAgSEFORExFX1BDTV9ET1dOTUlYICpwU2VsZgotICApCi17Ci0gIEhBTkRMRV9QQ01fRE9XTk1JWCBzZWxmOwotICAKLSAgaWYgKHBTZWxmID09IE5VTEwpIHsKLSAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7Ci0gIH0KLQotICAqcFNlbGYgPSBOVUxMOwotCi0gIHNlbGYgPSAoSEFORExFX1BDTV9ET1dOTUlYKSBHZXRQY21EbXhJbnN0YW5jZSggMCApOwotICBpZiAoc2VsZiA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIChQQ01ETVhfT1VUX09GX01FTU9SWSk7Ci0gIH0KLQotICAvKiBSZXNldCB0aGUgZnVsbCBpbnN0YW5jZSAqLwotICBwY21EbXhfUmVzZXQoIHNlbGYsIFBDTURNWF9SRVNFVF9GVUxMICk7Ci0KLSAgKnBTZWxmID0gc2VsZjsKLQotICByZXR1cm4gKFBDTURNWF9PSyk7Ci19Ci0KLQotLyoqIFJlc2V0IGFsbCBzdGF0aWMgdmFsdWVzIGxpa2UgZS5nLiBtaXhkb3duIGNvZWZmaWNpZW50cy4KLSAqIEBwYXJhbSBbaW5dIEhhbmRsZSBvZiBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCi0gKiBAcGFyYW0gW2luXSBGbGFncyB0ZWxsaW5nIHdoaWNoIHBhcnRzIG9mIHRoZSBtb2R1bGUgc2hhbGwgYmUgcmVzZXQuCi0gKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCi0gKiovCi1QQ01ETVhfRVJST1IgcGNtRG14X1Jlc2V0ICgKLSAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCi0gICAgVUlOVCAgICAgICAgICAgICAgICBmbGFncwotICApCi17Ci0gIGlmIChzZWxmID09IE5VTEwpIHsgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOyB9Ci0KLSAgaWYgKGZsYWdzICYgUENNRE1YX1JFU0VUX1BBUkFNUykgewotICAgIFBDTV9ETVhfVVNFUl9QQVJBTVMgKnBQYXJhbXMgPSAmc2VsZi0+dXNlclBhcmFtczsKLQotICAgIHBQYXJhbXMtPmR1YWxDaGFubmVsTW9kZSAgID0gU1RFUkVPX01PREU7Ci0gICAgcFBhcmFtcy0+cHNldWRvU3Vyck1vZGUgICAgPSBORVZFUl9ET19QU19ETVg7Ci0gICAgcFBhcmFtcy0+bnVtT3V0Q2hhbm5lbHNNYXggPSBQQ01fRE1YX0RGTFRfTUFYX09VVF9DSEFOTkVMUzsKLSAgICBwUGFyYW1zLT5udW1PdXRDaGFubmVsc01pbiA9IFBDTV9ETVhfREZMVF9NSU5fT1VUX0NIQU5ORUxTOwotICAgIHBQYXJhbXMtPmZyYW1lRGVsYXkgICAgICAgID0gMDsKLSAgICBwUGFyYW1zLT5leHBpcnlGcmFtZSAgICAgICA9IFBDTV9ETVhfREZMVF9FWFBJUllfRlJBTUU7Ci0KLSAgICBzZWxmLT5hcHBseVByb2Nlc3NpbmcgICAgICA9IDA7Ci0gIH0KLQotICBpZiAoZmxhZ3MgJiBQQ01ETVhfUkVTRVRfQlNfREFUQSkgewotICAgIGludCBzbG90OwotICAgIC8qIEluaXQgYWxsIHNsb3RzIHdpdGggYSBkZWZhdWx0IHNldCAqLwotICAgIGZvciAoc2xvdCA9IDA7IHNsb3QgPD0gUENNX0RNWF9NQVhfREVMQVlfRlJBTUVTOyBzbG90ICs9IDEpIHsKLSAgICAgIEZES21lbWNweSgmc2VsZi0+YnNNZXRhRGF0YVtzbG90XSwgJmRmbHRNZXRhRGF0YSwgc2l6ZW9mKERNWF9CU19NRVRBX0RBVEEpKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gKFBDTURNWF9PSyk7Ci19Ci0KLQotLyoqIFNldCBvbmUgcGFyYW1ldGVyIGZvciBvbmUgaW5zdGFuY2Ugb2YgdGhlIFBDTSBkb3dubWl4IG1vZHVsZS4KLSAqIEBwYXJhbSBbaW5dIEhhbmRsZSBvZiBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCi0gKiBAcGFyYW0gW2luXSBQYXJhbWV0ZXIgdG8gYmUgc2V0LgotICogQHBhcmFtIFtpbl0gUGFyYW1ldGVyIHZhbHVlLgotICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgotICoqLwotUENNRE1YX0VSUk9SIHBjbURteF9TZXRQYXJhbSAoCi0gICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAotICAgIGNvbnN0IFBDTURNWF9QQVJBTSAgcGFyYW0sCi0gICAgY29uc3QgSU5UICAgICAgICAgICB2YWx1ZQotICApCi17Ci0gIHN3aXRjaCAocGFyYW0pCi0gIHsKLSAgY2FzZSBETVhfQlNfREFUQV9FWFBJUllfRlJBTUU6Ci0gICAgaWYgKHNlbGYgPT0gTlVMTCkKLSAgICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKLSAgICBzZWxmLT51c2VyUGFyYW1zLmV4cGlyeUZyYW1lID0gKHZhbHVlID4gMCkgPyAoVUlOVCl2YWx1ZSA6IDA7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBETVhfQlNfREFUQV9ERUxBWToKLSAgICBpZiAoICh2YWx1ZSA+IFBDTV9ETVhfTUFYX0RFTEFZX0ZSQU1FUykKLSAgICAgIHx8ICh2YWx1ZSA8IDApICkgewotICAgICAgcmV0dXJuIChQQ01ETVhfVU5BQkxFX1RPX1NFVF9QQVJBTSk7Ci0gICAgfQotICAgIGlmIChzZWxmID09IE5VTEwpIHsKLSAgICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKLSAgICB9Ci0gICAgc2VsZi0+dXNlclBhcmFtcy5mcmFtZURlbGF5ID0gKFVDSEFSKXZhbHVlOwotICAgIGJyZWFrOwotCi0gIGNhc2UgTUlOX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFM6Ci0gICAgc3dpdGNoICh2YWx1ZSkgeyAgLyogc3VwcG9ydGVkIG91dHB1dCBjaGFubmVscyAqLwotICAgIGNhc2UgLTE6IGNhc2UgMDogY2FzZSBPTkVfQ0hBTk5FTDogY2FzZSBUV09fQ0hBTk5FTDoKLSNpZiAoUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTID49IDYpCi0gICAgY2FzZSBTSVhfQ0hBTk5FTDoKLSNlbmRpZgotI2lmIChQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMgPj0gOCkKLSAgICBjYXNlIEVJR0hUX0NIQU5ORUw6Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gKFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNKTsKLSAgICB9Ci0gICAgaWYgKHNlbGYgPT0gTlVMTCkKLSAgICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKLSAgICAvKiBTdG9yZSB0aGUgbmV3IHZhbHVlICovCi0gICAgc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01pbiA9ICh2YWx1ZSA+IDApID8gdmFsdWUgOiAtMTsKLSAgICBpZiAoICh2YWx1ZSA+IDApCi0gICAgICAmJiAoc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01heCA+IDApCi0gICAgICAmJiAodmFsdWUgPiBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWF4KSApCi0gICAgeyAvKiBNSU4gPiBNQVggd291bGQgYmUgYW4gaW52YWxpZCBzdGF0ZS4gVGh1cyBzZXQgTUFYID0gTUlOIGluIHRoaXMgY2FzZS4gKi8KLSAgICAgIHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNYXggPSBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWluOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIE1BWF9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTOgotICAgIHN3aXRjaCAodmFsdWUpIHsgIC8qIHN1cHBvcnRlZCBvdXRwdXQgY2hhbm5lbHMgKi8KLSAgICBjYXNlIC0xOiBjYXNlIDA6IGNhc2UgT05FX0NIQU5ORUw6IGNhc2UgVFdPX0NIQU5ORUw6Ci0jaWYgKFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyA+PSA2KQotICAgIGNhc2UgU0lYX0NIQU5ORUw6Ci0jZW5kaWYKLSNpZiAoUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTID49IDgpCi0gICAgY2FzZSBFSUdIVF9DSEFOTkVMOgotI2VuZGlmCi0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChQQ01ETVhfVU5BQkxFX1RPX1NFVF9QQVJBTSk7Ci0gICAgfQotICAgIGlmIChzZWxmID09IE5VTEwpCi0gICAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7Ci0gICAgLyogU3RvcmUgdGhlIG5ldyB2YWx1ZSAqLwotICAgIHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNYXggPSAodmFsdWUgPiAwKSA/IHZhbHVlIDogLTE7Ci0gICAgaWYgKCAodmFsdWUgPiAwKQotICAgICAgJiYgKHZhbHVlIDwgc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01pbikgKQotICAgIHsgLyogTUFYIDwgTUlOIHdvdWxkIGJlIGFuIGludmFsaWQgc3RhdGUuIFRodXMgc2V0IE1JTiA9IE1BWCBpbiB0aGlzIGNhc2UuICovCi0gICAgICBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWluID0gc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01heDsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBETVhfRFVBTF9DSEFOTkVMX01PREU6Ci0gICAgc3dpdGNoICgoRFVBTF9DSEFOTkVMX01PREUpdmFsdWUpIHsKLSAgICBjYXNlIFNURVJFT19NT0RFOgotICAgIGNhc2UgQ0gxX01PREU6Ci0gICAgY2FzZSBDSDJfTU9ERToKLSAgICBjYXNlIE1JWEVEX01PREU6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChQQ01ETVhfVU5BQkxFX1RPX1NFVF9QQVJBTSk7Ci0gICAgfQotICAgIGlmIChzZWxmID09IE5VTEwpCi0gICAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7Ci0gICAgc2VsZi0+dXNlclBhcmFtcy5kdWFsQ2hhbm5lbE1vZGUgPSAoRFVBTF9DSEFOTkVMX01PREUpdmFsdWU7Ci0gICAgc2VsZi0+YXBwbHlQcm9jZXNzaW5nID0gMTsgIC8qIEZvcmNlIHByb2Nlc3NpbmcgKi8KLSAgICBicmVhazsKLQotICBjYXNlIERNWF9QU0VVRE9fU1VSUk9VTkRfTU9ERToKLSAgICBzd2l0Y2ggKChQU0VVRE9fU1VSUk9VTkRfTU9ERSl2YWx1ZSkgewotICAgIGNhc2UgTkVWRVJfRE9fUFNfRE1YOgotICAgIGNhc2UgQVVUT19QU19ETVg6Ci0gICAgY2FzZSBGT1JDRV9QU19ETVg6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChQQ01ETVhfVU5BQkxFX1RPX1NFVF9QQVJBTSk7Ci0gICAgfQotICAgIGlmIChzZWxmID09IE5VTEwpCi0gICAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7Ci0gICAgc2VsZi0+dXNlclBhcmFtcy5wc2V1ZG9TdXJyTW9kZSA9IChQU0VVRE9fU1VSUk9VTkRfTU9ERSl2YWx1ZTsKLSAgICBicmVhazsKLQotICBkZWZhdWx0OgotICAgIHJldHVybiAoUENNRE1YX1VOS05PV05fUEFSQU0pOwotICB9Ci0KLSAgcmV0dXJuIChQQ01ETVhfT0spOwotfQotCi0vKiogR2V0IG9uZSBwYXJhbWV0ZXIgdmFsdWUgb2Ygb25lIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KLSAqIEBwYXJhbSBbaW5dIEhhbmRsZSBvZiBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCi0gKiBAcGFyYW0gW2luXSBQYXJhbWV0ZXIgdG8gYmUgc2V0LgotICogQHBhcmFtIFtvdXRdIFBvaW50ZXIgdG8gYnVmZmVyIHJlY2VpdmluZyB0aGUgcGFyYW1ldGVyIHZhbHVlLgotICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgotICoqLwotUENNRE1YX0VSUk9SIHBjbURteF9HZXRQYXJhbSAoCi0gICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAotICAgIGNvbnN0IFBDTURNWF9QQVJBTSAgcGFyYW0sCi0gICAgSU5UICogY29uc3QgICAgICAgICBwVmFsdWUKLSAgKQotewotICBQQ01fRE1YX1VTRVJfUEFSQU1TICpwVXNyUGFyYW1zOwotCi0gIGlmICggKHNlbGYgPT0gTlVMTCkKLSAgICB8fCAocFZhbHVlID09IE5VTEwpICkgewotICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKLSAgfQotICBwVXNyUGFyYW1zID0gJnNlbGYtPnVzZXJQYXJhbXM7Ci0KLSAgc3dpdGNoIChwYXJhbSkKLSAgewotICBjYXNlIERNWF9CU19EQVRBX0VYUElSWV9GUkFNRToKLSAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5leHBpcnlGcmFtZTsKLSAgICBicmVhazsKLSAgY2FzZSBETVhfQlNfREFUQV9ERUxBWToKLSAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5mcmFtZURlbGF5OwotICAgIGJyZWFrOwotICBjYXNlIE1JTl9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTOgotICAgICpwVmFsdWUgPSAoSU5UKXBVc3JQYXJhbXMtPm51bU91dENoYW5uZWxzTWluOwotICAgIGJyZWFrOwotICBjYXNlIE1BWF9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTOgotICAgICpwVmFsdWUgPSAoSU5UKXBVc3JQYXJhbXMtPm51bU91dENoYW5uZWxzTWF4OwotICAgIGJyZWFrOwotICBjYXNlIERNWF9EVUFMX0NIQU5ORUxfTU9ERToKLSAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5kdWFsQ2hhbm5lbE1vZGU7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRE1YX1BTRVVET19TVVJST1VORF9NT0RFOgotICAgICpwVmFsdWUgPSAoSU5UKXBVc3JQYXJhbXMtPnBzZXVkb1N1cnJNb2RlOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIHJldHVybiAoUENNRE1YX1VOS05PV05fUEFSQU0pOwotICB9Ci0KLSAgcmV0dXJuIChQQ01ETVhfT0spOwotfQotCi0KLSNpZmRlZiBEU0VfTUVUQURBVEFfRU5BQkxFCi0KLSNkZWZpbmUgTUFYX0RTRV9BTkNfQllURVMgICAgICAgKCAxNiApICAgIC8qIDE1IGJ5dGVzICovCi0jZGVmaW5lIEFOQ19EQVRBX1NZTkNfQllURSAgICAgICggMHhCQyApICAvKiBhbmNpbGxhcnkgZGF0YSBzeW5jIGJ5dGUuICovCi0KLS8qCi0gKiBSZWFkIERNWCBtZXRhLWRhdGEgZnJvbSBhIGRhdGEgc3RyZWFtIGVsZW1lbnQuCi0gKi8KLVBDTURNWF9FUlJPUiBwY21EbXhfUGFyc2UgKAotICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKLSAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJzLAotICAgIFVJTlQgIGFuY0RhdGFCaXRzLAotICAgIGludCAgICBpc01wZWcyCi0gICkKLXsKLSAgUENNRE1YX0VSUk9SIGVycm9yU3RhdHVzID0gUENNRE1YX09LOwotICBETVhfQlNfTUVUQV9EQVRBICpwQnNNZXRhRGF0YSA9ICZzZWxmLT5ic01ldGFEYXRhWzBdOwotCi0gIGludCAgIHNraXA0RG14ID0gMCwgc2tpcDRFeHQgPSAwOwotICBpbnQgICBkbXhMdmxBdmFpbCA9IDAsIGV4dERhdGFBdmFpbCA9IDA7Ci0gIGludCAgIGZvdW5kTmV3RGF0YSA9IDA7Ci0gIFVJTlQgIG1pbkFuY0JpdHMgPSAoKGlzTXBlZzIpID8gNSA6IDMpKjg7Ci0KLSAgaWYgKCAoc2VsZiA9PSBOVUxMKQotICAgIHx8IChoQnMgID09IE5VTEwpICkgeyByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7IH0KLQotICBhbmNEYXRhQml0cyA9IEZES2dldFZhbGlkQml0cyhoQnMpOwotCi0gIC8qIHNhbml0eSBjaGVja3MgKi8KLSAgaWYgKCAoYW5jRGF0YUJpdHMgPCBtaW5BbmNCaXRzKQotICAgIHx8IChhbmNEYXRhQml0cyA+IEZES2dldFZhbGlkQml0cyhoQnMpKSApIHsKLSAgICByZXR1cm4gKFBDTURNWF9DT1JSVVBUX0FOQ19EQVRBKTsKLSAgfQotCi0gIHBCc01ldGFEYXRhID0gJnNlbGYtPmJzTWV0YURhdGFbMF07Ci0KLSAgaWYgKGlzTXBlZzIpIHsKLSAgICAvKiBza2lwIERWRCBhbmNpbGxhcnkgZGF0YSAqLwotICAgIEZES3B1c2hGb3IoaEJzLCAxNik7Ci0gIH0KLQotICAvKiBjaGVjayBzeW5jIHdvcmQgKi8KLSAgaWYgKEZES3JlYWRCaXRzKGhCcyw4KSAhPSBBTkNfREFUQV9TWU5DX0JZVEUpIHsKLSAgICByZXR1cm4gKFBDTURNWF9DT1JSVVBUX0FOQ19EQVRBKTsKLSAgfQotCi0gIC8qIHNraXAgTVBFRyBhdWRpbyB0eXBlIGFuZCBEb2xieSBzdXJyb3VuZCBtb2RlICovCi0gIEZES3B1c2hGb3IoaEJzLCA0KTsKLQotICBpZiAoaXNNcGVnMikgewotICAgIC8qIGludCBudW1BbmNCeXRlcyA9ICovIEZES3JlYWRCaXRzKGhCcywgNCk7Ci0gICAgLyogYWR2YW5jZWQgZHluYW1pYyByYW5nZSBjb250cm9sICovCi0gICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgc2tpcDREbXggKz0gMjQ7Ci0gICAgLyogZGlhbG9nIG5vcm1hbGl6YXRpb24gKi8KLSAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNERteCArPSA4OwotICAgIC8qIHJlcHJvZHVjdGlvbl9sZXZlbCAqLwotICAgIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RG14ICs9IDg7Ci0gIH0gZWxzZSB7Ci0gICAgRkRLcHVzaEZvcihoQnMsIDIpOyAgIC8qIGRyYyBwcmVzZW50YXRpb24gbW9kZSAqLwotICAgIHBCc01ldGFEYXRhLT5wc2V1ZG9TdXJyb3VuZCA9IEZES3JlYWRCaXQoaEJzKTsKLSAgICBGREtwdXNoRm9yKGhCcywgNCk7ICAgLyogcmVzZXJ2ZWQgYml0cyAqLwotICB9Ci0KLSAgLyogZG93bm1peGluZyBsZXZlbHMgTVBFR3ggc3RhdHVzICovCi0gIGRteEx2bEF2YWlsICA9IEZES3JlYWRCaXQoaEJzKTsKLQotICBpZiAoaXNNcGVnMikgewotICAgIC8qIHNjYWxlIGZhY3RvciBDUkMgc3RhdHVzICovCi0gICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgc2tpcDRFeHQgKz0gMTY7Ci0gIH0gZWxzZSB7Ci0gICAgLyogYW5jaWxsYXJ5IGRhdGEgZXh0ZW5zaW9uIHN0YXR1cyAqLwotICAgIGV4dERhdGFBdmFpbCA9IEZES3JlYWRCaXQoaEJzKTsKLSAgfQotCi0gIC8qIGF1ZGlvIGNvZGluZyBhbmQgY29tcHJlc3Npb24gc3RhdHVzICovCi0gIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RXh0ICs9IDE2OwotICAvKiBjb2Fyc2UgZ3JhaW4gdGltZWNvZGUgc3RhdHVzICovCi0gIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RXh0ICs9IDE2OwotICAvKiBmaW5lIGdyYWluIHRpbWVjb2RlIHN0YXR1cyAqLwotICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNEV4dCArPSAxNjsKLQotICAvKiBza2lwIHRoZSB1c2VsZXNzIGRhdGEgdG8gZ2V0IHRvIHRoZSBETVggbGV2ZWxzICovCi0gIEZES3B1c2hGb3IoaEJzLCBza2lwNERteCk7Ci0KLSAgLyogZG93bm1peF9sZXZlbHNfTVBFR1ggKi8KLSAgaWYgKGRteEx2bEF2YWlsKQotICB7Ci0gICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgeyAgLyogY2VudGVyX21peF9sZXZlbF9vbiAqLwotICAgICAgcEJzTWV0YURhdGEtPmNMZXZJZHggPSBGREtyZWFkQml0cyhoQnMsIDMpOwotICAgICAgZm91bmROZXdEYXRhID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgRkRLcmVhZEJpdHMoaEJzLCAzKTsKLSAgICB9Ci0gICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgeyAgLyogc3Vycm91bmRfbWl4X2xldmVsX29uICovCi0gICAgICBwQnNNZXRhRGF0YS0+c0xldklkeCA9IEZES3JlYWRCaXRzKGhCcywgMyk7Ci0gICAgICBmb3VuZE5ld0RhdGEgPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICBGREtyZWFkQml0cyhoQnMsIDMpOwotICAgIH0KLSAgfQotCi0gIC8qIHNraXAgdGhlIHVzZWxlc3MgZGF0YSB0byBnZXQgdG8gdGhlIGFuY2lsbGFyeSBkYXRhIGV4dGVuc2lvbiAqLwotICBGREtwdXNoRm9yKGhCcywgc2tpcDRFeHQpOwotCi0gIC8qIGFuYyBkYXRhIGV4dGVuc2lvbiAoTVBFRy00IG9ubHkpICovCi0gIGlmIChleHREYXRhQXZhaWwpIHsKLSAgICBpbnQgZXh0RG14THZsU3QsIGV4dERteEdhaW5TdCwgZXh0RG14TGZlU3Q7Ci0KLSAgICBGREtyZWFkQml0KGhCcyk7ICAgICAgICAvKiByZXNlcnZlZCBiaXQgKi8KLSAgICBleHREbXhMdmxTdCAgPSBGREtyZWFkQml0KGhCcyk7Ci0gICAgZXh0RG14R2FpblN0ID0gRkRLcmVhZEJpdChoQnMpOwotICAgIGV4dERteExmZVN0ICA9IEZES3JlYWRCaXQoaEJzKTsKLSAgICBGREtyZWFkQml0cyhoQnMsIDQpOyAgICAvKiByZXNlcnZlZCBiaXRzICovCi0KLSAgICBpZiAoZXh0RG14THZsU3QpIHsKLSAgICAgIHBCc01ldGFEYXRhLT5kbWl4SWR4QSA9IEZES3JlYWRCaXRzKGhCcywgMyk7Ci0gICAgICBwQnNNZXRhRGF0YS0+ZG1peElkeEIgPSBGREtyZWFkQml0cyhoQnMsIDMpOwotICAgICAgRkRLcmVhZEJpdHMoaEJzLCAyKTsgIC8qIHJlc2VydmVkIGJpdHMgKi8KLSAgICAgIGZvdW5kTmV3RGF0YSA9IDE7Ci0gICAgfQotICAgIGlmIChleHREbXhHYWluU3QpIHsKLSAgICAgIHBCc01ldGFEYXRhLT5kbXhHYWluSWR4NSA9IEZES3JlYWRCaXRzKGhCcywgNyk7Ci0gICAgICBGREtyZWFkQml0KGhCcyk7ICAgICAgLyogcmVzZXJ2ZWQgYml0ICovCi0gICAgICBwQnNNZXRhRGF0YS0+ZG14R2FpbklkeDIgPSBGREtyZWFkQml0cyhoQnMsIDcpOwotICAgICAgRkRLcmVhZEJpdChoQnMpOyAgICAgIC8qIHJlc2VydmVkIGJpdCAqLwotICAgICAgZm91bmROZXdEYXRhID0gMTsKLSAgICB9Ci0gICAgaWYgKGV4dERteExmZVN0KSB7Ci0gICAgICBwQnNNZXRhRGF0YS0+ZG1peElkeExmZSA9IEZES3JlYWRCaXRzKGhCcywgNCk7Ci0gICAgICBGREtyZWFkQml0cyhoQnMsIDQpOyAgLyogcmVzZXJ2ZWQgYml0cyAqLwotICAgICAgZm91bmROZXdEYXRhID0gMTsKLSAgICB9Ci0gIH0KLQotICAvKiBmaW5hbCBzYW5pdHkgY2hlY2sgb24gdGhlIGFtb3VudCBvZiByZWFkIGRhdGEgKi8KLSAgaWYgKChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcykgPCAwKSB7Ci0gICAgZXJyb3JTdGF0dXMgPSBQQ01ETVhfQ09SUlVQVF9BTkNfREFUQTsKLSAgfQotCi0gIGlmICggKGVycm9yU3RhdHVzICA9PSBQQ01ETVhfT0spCi0gICAgJiYgKGZvdW5kTmV3RGF0YSA9PSAxKSApIHsKLSAgICAvKiBhbm5vdW5jZSBuZXcgZGF0YSAqLwotICAgIHBCc01ldGFEYXRhLT50eXBlRmxhZ3MgfD0gVFlQRV9EU0VfREFUQTsKLSAgICAvKiByZXNldCBleHBpcnkgY291bnRlciAqLwotICAgIHBCc01ldGFEYXRhLT5leHBpcnlDb3VudCA9IDA7Ci0gIH0KLQotICByZXR1cm4gKGVycm9yU3RhdHVzKTsKLX0KLQotLyoKLSAqIFJlYWQgRE1YIG1ldGEtZGF0YSBmcm9tIGEgZGF0YSBzdHJlYW0gZWxlbWVudC4KLSAqLwotUENNRE1YX0VSUk9SIHBjbURteF9SZWFkRHZiQW5jRGF0YSAoCi0gICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAotICAgIFVDSEFSICpwQW5jRGF0YUJ1ZiwKLSAgICBVSU5UICAgYW5jRGF0YUJ5dGVzLAotICAgIGludCAgICBpc01wZWcyCi0gICkKLXsKLSAgRkRLX0JJVFNUUkVBTSBiczsKLSAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzID0gJmJzOwotICBQQ01ETVhfRVJST1IgZXJyb3JTdGF0dXMgPSBQQ01ETVhfT0s7Ci0KLSAgaWYgKHNlbGYgPT0gTlVMTCkgeyByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7IH0KLQotICAvKiBzYW5pdHkgY2hlY2tzICovCi0gIGlmICggKHBBbmNEYXRhQnVmID09IE5VTEwpCi0gICAgfHwgKGFuY0RhdGFCeXRlcyA9PSAwKSApIHsKLSAgICByZXR1cm4gKFBDTURNWF9DT1JSVVBUX0FOQ19EQVRBKTsKLSAgfQotCi0gIEZES2luaXRCaXRTdHJlYW0gKGhCcywgcEFuY0RhdGFCdWYsIE1BWF9EU0VfQU5DX0JZVEVTLCBhbmNEYXRhQnl0ZXMqOCwgQlNfUkVBREVSKTsKLQotICBlcnJvclN0YXR1cyA9IHBjbURteF9QYXJzZSAoCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgaEJzLAotICAgICAgICAgICAgICAgICAgICAgICAgYW5jRGF0YUJ5dGVzKjgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpc01wZWcyICk7Ci0KLSAgcmV0dXJuIChlcnJvclN0YXR1cyk7Ci19Ci0jZW5kaWYgIC8qIERTRV9NRVRBREFUQV9FTkFCTEUgKi8KLQotI2lmZGVmIFBDRV9NRVRBREFUQV9FTkFCTEUKLS8qKiBTZXQgdGhlIG1hdHJpeCBtaXhkb3duIGluZm9ybWF0aW9uIGV4dHJhY3RlZCBmcm9tIHRoZSBQQ0Ugb2YgYW4gQUFDIGJpdHN0cmVhbS4KLSAqICBOb3RlOiBDYWxsIG9ubHkgaWYgbWF0cml4X21peGRvd25faWR4X3ByZXNlbnQgaXMgdHJ1ZS4KLSAqIEBwYXJhbSBbaW5dIEhhbmRsZSBvZiBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCi0gKiBAcGFyYW0gW2luXSBUaGUgMiBiaXQgbWF0cml4IG1peGRvd24gaW5kZXggZXh0cmFjdGVkIGZyb20gUENFLgotICogQHBhcmFtIFtpbl0gVGhlIHBzZXVkbyBzdXJyb3VuZCBlbmFibGUgZmxhZyBleHRyYWN0ZWQgZnJvbSBQQ0UuCi0gKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCi0gKiovCi1QQ01ETVhfRVJST1IgcGNtRG14X1NldE1hdHJpeE1peGRvd25Gcm9tUGNlICgKLSAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCi0gICAgaW50ICAgICAgICAgICAgICAgICBtYXRyaXhNaXhkb3duUHJlc2VudCwKLSAgICBpbnQgICAgICAgICAgICAgICAgIG1hdHJpeE1peGRvd25JZHgsCi0gICAgaW50ICAgICAgICAgICAgICAgICBwc2V1ZG9TdXJyb3VuZEVuYWJsZQotICApCi17Ci0gIERNWF9CU19NRVRBX0RBVEEgKnBCc01ldGFEYXRhID0gJnNlbGYtPmJzTWV0YURhdGFbMF07Ci0KLSAgaWYgKHNlbGYgPT0gTlVMTCkgewotICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKLSAgfQotCi0gIGlmIChtYXRyaXhNaXhkb3duUHJlc2VudCkgewotICAgIHBCc01ldGFEYXRhLT5wc2V1ZG9TdXJyb3VuZCA9IHBzZXVkb1N1cnJvdW5kRW5hYmxlOwotICAgIHBCc01ldGFEYXRhLT5tYXRyaXhNaXhkb3duSWR4ID0gbWF0cml4TWl4ZG93bklkeCAmIDB4MDM7Ci0gICAgcEJzTWV0YURhdGEtPnR5cGVGbGFncyB8PSBUWVBFX1BDRV9EQVRBOwotICAgIC8qIFJlc2V0IGV4cGlyeSBjb3VudGVyICovCi0gICAgcEJzTWV0YURhdGEtPmV4cGlyeUNvdW50ID0gMDsKLSAgfQotCi0gIHJldHVybiAoUENNRE1YX09LKTsKLX0KLSNlbmRpZiAgLyogUENFX01FVEFEQVRBX0VOQUJMRSAqLwotCi0KLS8qKiBBcHBseSBkb3duIG9yIHVwIG1peGluZy4KLSAqIEBwYXJhbSBbaW5dICAgIEhhbmRsZSBvZiBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCi0gKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIGJ1ZmZlciB0aGF0IGhvbGQgdGhlIHRpbWUgZG9tYWluIHNpZ25hbC4KLSAqIEBwYXJhbSBbaW5dICAgIFBvaW50ZXIgd2hlcmUgdGhlIGFtb3VudCBvZiBvdXRwdXQgc2FtcGxlcyBpcyByZXR1cm5lZCBpbnRvLgotICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB3aGVyZSB0aGUgYW1vdW50IG9mIG91dHB1dCBjaGFubmVscyBpcyByZXR1cm5lZCBpbnRvLgotICogQHBhcmFtIFtpbl0gICAgRmxhZyB3aGljaCBpbmRpY2F0ZXMgaWYgb3V0cHV0IHRpbWUgZGF0YSBhcmUgd3JpdHRlcm4gaW50ZXJsZWF2ZWQgb3IgYXMgc3Vic2VxdWVudCBibG9ja3MuCi0gKiBAcGFyYW0gW2lub3V0XSBBcnJheSB3aGVyZSB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgZm9yIGVhY2ggb3V0cHV0IGF1ZGlvIGNoYW5uZWwgaXMgc3RvcmVkIGludG8uCi0gKiBAcGFyYW0gW2lub3V0XSBBcnJheSB3aGVyZSB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgaW5kZXggZm9yIGVhY2ggb3V0cHV0IGF1ZGlvIGNoYW5uZWwgaXMgc3RvcmVkIGludG8uCi0gKiBAcGFyYW0gW2luXSAgICBBcnJheSBjb250YWluaW5nIHRoZSBvdXQgY2hhbm5lbCBtYXBwaW5nIHRvIGJlIHVzZWQgKEZyb20gTVBFRyBQQ0Ugb3JkZXJpbmcgdG8gd2hhdGV2ZXIgaXMgcmVxdWlyZWQpLgotICogQHBhcmFtIFtvdXRdICAgUG9pbnRlciBvbiBhIGZpZWxkIHJlY2VpdmluZyB0aGUgc2NhbGUgZmFjdG9yIHRoYXQgaGFzIHRvIGJlIGFwcGxpZWQgb24gYWxsIHNhbXBsZXMgYWZ0ZXJ3YXJkcy4KLSAqICAgICAgICAgICAgICAgIElmIHRoZSBoYW5kZWQgcG9pbnRlciBpcyBOVUxMIHNjYWxpbmcgaXMgZG9uZSBpbnRlcm5hbGx5LgotICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgotICoqLwotUENNRE1YX0VSUk9SIHBjbURteF9BcHBseUZyYW1lICgKLSAgICAgICAgSEFORExFX1BDTV9ET1dOTUlYICAgICAgc2VsZiwKLSAgICAgICAgSU5UX1BDTSAgICAgICAgICAgICAgICAqcFBjbUJ1ZiwKLSAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICpuQ2hhbm5lbHMsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIGZJbnRlcmxlYXZlZCwKLSAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFICAgICAgY2hhbm5lbFR5cGVbXSwKLSAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgY2hhbm5lbEluZGljZXNbXSwKLSAgICAgICAgY29uc3QgVUNIQVIgICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmdbXVs4XSwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAqcERteE91dFNjYWxlCi0gICkKLXsKLSAgUENNX0RNWF9VU0VSX1BBUkFNUyAgKnBQYXJhbSA9IE5VTEw7Ci0gIFBDTURNWF9FUlJPUiAgZXJyb3JTdGF0dXMgPSBQQ01ETVhfT0s7Ci0gIERVQUxfQ0hBTk5FTF9NT0RFICBkdWFsQ2hhbm5lbE1vZGU7Ci0gIFBDTV9ETVhfQ0hBTk5FTF9NT0RFICBpbkNoTW9kZTsKLSAgUENNX0RNWF9DSEFOTkVMX01PREUgIG91dENoTW9kZTsKLSAgSU5UICAgZGV2TnVsbDsgIC8qIEp1c3QgYSBkdW1teSB0byBhdm9pZCBhIGxvdCBvZiBicmFuY2hlcyBpbiB0aGUgY29kZSAqLwotICBpbnQgICBudW1PdXRDaGFubmVscywgbnVtSW5DaGFubmVsczsKLSAgaW50ICAgaW5TdHJpZGUsIG91dFN0cmlkZSwgb2Zmc2V0OwotICBpbnQgICBkbXhNYXhTY2FsZSwgZG14U2NhbGU7Ci0gIGludCAgIGNoLCBzbG90OwotICBVQ0hBUiBpbk9mZnNldFRhYmxlW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKLQotICBETVhfQlNfTUVUQV9EQVRBICBic01ldGFEYXRhOwotCi0gIGlmICggKHNlbGYgICAgICAgICAgID09IE5VTEwpCi0gICAgfHwgKG5DaGFubmVscyAgICAgID09IE5VTEwpCi0gICAgfHwgKGNoYW5uZWxUeXBlICAgID09IE5VTEwpCi0gICAgfHwgKGNoYW5uZWxJbmRpY2VzID09IE5VTEwpCi0gICAgfHwgKGNoYW5uZWxNYXBwaW5nID09IE5VTEwpICkgewotICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKLSAgfQotCi0gIC8qIEluaXQgdGhlIG91dHB1dCBzY2FsaW5nICovCi0gIGRteFNjYWxlID0gMDsKLSAgaWYgKHBEbXhPdXRTY2FsZSAhPSBOVUxMKSB7Ci0gICAgLyogQXZvaWQgZmluYWwgc2NhbGluZyBpbnRlcm5hbGx5IGFuZCBoYW5kIGl0IHRvIHRoZSBvdXRzaWRlIHdvcmxkLiAqLwotICAgICpwRG14T3V0U2NhbGUgPSAwOwotICAgIGRteE1heFNjYWxlID0gUENNRE1YX01BWF9IRUFEUk9PTTsKLSAgfSBlbHNlIHsKLSAgICAvKiBBcHBseSB0aGUgc2NhbGluZyBpbnRlcm5hbGx5LiAqLwotICAgIHBEbXhPdXRTY2FsZSA9ICZkZXZOdWxsOyAgLyogcmVkaXJlY3QgdG8gdGVtcG9yYWwgc3RhY2sgbWVtb3J5ICovCi0gICAgZG14TWF4U2NhbGUgPSAwOwotICB9Ci0KLSAgcFBhcmFtID0gJnNlbGYtPnVzZXJQYXJhbXM7Ci0gIG51bUluQ2hhbm5lbHMgPSAqbkNoYW5uZWxzOwotCi0gIC8qIFBlcmZvcm0gc29tZSBpbnB1dCBzYW5pdHkgY2hlY2tzICovCi0gIGlmIChwUGNtQnVmID09IE5VTEwpICAgICB7IHJldHVybiAoUENNRE1YX0lOVkFMSURfQVJHVU1FTlQpOyB9Ci0gIGlmIChmcmFtZVNpemUgPT0gMCkgICAgICB7IHJldHVybiAoUENNRE1YX0lOVkFMSURfQVJHVU1FTlQpOyB9Ci0gIGlmICggKG51bUluQ2hhbm5lbHMgPT0gMCkKLSAgICB8fCAobnVtSW5DaGFubmVscyA+IFBDTV9ETVhfTUFYX0lOX0NIQU5ORUxTKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAoUENNRE1YX0lOVkFMSURfQVJHVU1FTlQpOyB9Ci0KLSAgLyogQ2hlY2sgb24gbWlzY29uZmlndXJhdGlvbiAqLwotICBGREtfQVNTRVJUKCAocFBhcmFtLT5udW1PdXRDaGFubmVsc01heCA8PSAwKSBcCi0gICAgICAgICAgIHx8IChwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4ID49IHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNaW4pKTsKLQotICAvKiBEZXRlcm1pbmUgaWYgdGhlIG1vZHVsZSBoYXMgdG8gZG8gcHJvY2Vzc2luZyAqLwotICBpZiAoICAgKHNlbGYtPmFwcGx5UHJvY2Vzc2luZyA9PSAwKQotICAgICYmICAoKHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXggPD0gMCkKLSAgICAgIHx8IChwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4ID49IG51bUluQ2hhbm5lbHMpKQotICAgICYmICAgKHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNaW4gPD0gbnVtSW5DaGFubmVscykgKSB7Ci0gICAgLyogTm90aGluZyB0byBkbyAqLwotICAgIHJldHVybiAoZXJyb3JTdGF0dXMpOwotICB9Ci0KLSAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzICovCi0gIGlmICggKHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXggPiAwKQotICAgICYmIChudW1JbkNoYW5uZWxzID4gcFBhcmFtLT5udW1PdXRDaGFubmVsc01heCkgKSB7Ci0gICAgbnVtT3V0Q2hhbm5lbHMgPSBwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4OwotICB9Ci0gIGVsc2UgaWYgKG51bUluQ2hhbm5lbHMgPCBwUGFyYW0tPm51bU91dENoYW5uZWxzTWluKSB7Ci0gICAgbnVtT3V0Q2hhbm5lbHMgPSBwUGFyYW0tPm51bU91dENoYW5uZWxzTWluOwotICB9Ci0gIGVsc2UgewotICAgIG51bU91dENoYW5uZWxzID0gbnVtSW5DaGFubmVsczsKLSAgfQotCi0gIGR1YWxDaGFubmVsTW9kZSA9IHBQYXJhbS0+ZHVhbENoYW5uZWxNb2RlOwotCi0gIC8qIEFuYWx5c2UgaW5wdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGFuZCBnZXQgY2hhbm5lbCBvZmZzZXQKLSAgICogdGFibGUgdGhhdCBjYW4gYmUgYWNjZXNzZWQgd2l0aCB0aGUgZml4ZWQgY2hhbm5lbCBsYWJlbHMuICovCi0gIGVycm9yU3RhdHVzID0gZ2V0Q2hhbm5lbE1vZGUoCi0gICAgICAgICAgICAgICAgICAgbnVtSW5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICBjaGFubmVsVHlwZSwKLSAgICAgICAgICAgICAgICAgICBjaGFubmVsSW5kaWNlcywKLSAgICAgICAgICAgICAgICAgICBpbk9mZnNldFRhYmxlLAotICAgICAgICAgICAgICAgICAgJmluQ2hNb2RlCi0gICAgICAgICAgICAgICAgICk7Ci0gIGlmICggUENNRE1YX0lTX0ZBVEFMX0VSUk9SKGVycm9yU3RhdHVzKQotICAgIHx8IChpbkNoTW9kZSA9PSBDSF9NT0RFX1VOREVGSU5FRCkgKSB7Ci0gICAgLyogV2UgZG9uJ3QgbmVlZCB0byByZXN0b3JlIGJlY2F1c2UgdGhlIGNoYW5uZWwKLSAgICAgICBjb25maWd1cmF0aW9uIGhhcyBub3QgYmVlbiBjaGFuZ2VkLiBKdXN0IGV4aXQuICovCi0gICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9DSF9DT05GSUcpOwotICB9Ci0KLSAgLyogU2V0IGlucHV0IHN0cmlkZSBhbmQgb2Zmc2V0ICovCi0gIGlmIChmSW50ZXJsZWF2ZWQpIHsKLSAgICBpblN0cmlkZSAgPSBudW1JbkNoYW5uZWxzOwotICAgIG9mZnNldCA9IDE7ICAgICAgICAgICAgICAgIC8qIENoYW5uZWwgc3BlY2lmaWMgb2Zmc2V0IGZhY3RvciAqLwotICB9IGVsc2UgewotICAgIGluU3RyaWRlICA9IDE7Ci0gICAgb2Zmc2V0ID0gZnJhbWVTaXplOyAgICAgICAgLyogQ2hhbm5lbCBzcGVjaWZpYyBvZmZzZXQgZmFjdG9yICovCi0gIH0KLQotICAvKiBSZXNldCBkb3dubWl4IG1ldGEgZGF0YSBpZiBuZWNlc3NhcnkgKi8KLSAgaWYgKCAocFBhcmFtLT5leHBpcnlGcmFtZSA+IDApCi0gICAgJiYgKCsrc2VsZi0+YnNNZXRhRGF0YVswXS5leHBpcnlDb3VudCA+IHBQYXJhbS0+ZXhwaXJ5RnJhbWUpICkKLSAgeyAvKiBUaGUgbWV0YWRhdGEgcmVhZCBmcm9tIGJpdHN0cmVhbSBpcyB0b28gb2xkLiAqLwotICAgIFBDTURNWF9FUlJPUiBlcnIgPSBwY21EbXhfUmVzZXQoc2VsZiwgUENNRE1YX1JFU0VUX0JTX0RBVEEpOwotICAgIEZES19BU1NFUlQoZXJyID09IFBDTURNWF9PSyk7Ci0gIH0KLSAgRkRLbWVtY3B5KCZic01ldGFEYXRhLCAmc2VsZi0+YnNNZXRhRGF0YVtwUGFyYW0tPmZyYW1lRGVsYXldLCBzaXplb2YoRE1YX0JTX01FVEFfREFUQSkpOwotICAvKiBNYWludGFpbiBkZWxheSBsaW5lICovCi0gIGZvciAoc2xvdCA9IHBQYXJhbS0+ZnJhbWVEZWxheTsgc2xvdCA+IDA7IHNsb3QgLT0gMSkgewotICAgIEZES21lbWNweSgmc2VsZi0+YnNNZXRhRGF0YVtzbG90XSwgJnNlbGYtPmJzTWV0YURhdGFbc2xvdC0xXSwgc2l6ZW9mKERNWF9CU19NRVRBX0RBVEEpKTsKLSAgfQotCi0gIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwotI2lmZGVmIFBDTV9ET1dOTUlYX0VOQUJMRQotICBpZiAoIG51bUluQ2hhbm5lbHMgPiBudW1PdXRDaGFubmVscyApCi0gIHsgLyogQXBwbHkgZG93bm1peCAqLwotICAgIElOVF9QQ00gICpwSW5QY21bUENNX0RNWF9NQVhfSU5fQ0hBTk5FTFNdID0geyBOVUxMIH07Ci0gICAgSU5UX1BDTSAgKnBPdXRQY21bUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTXSA9IHsgTlVMTCB9OwotICAgIEZJWFBfRE1YICBtaXhGYWN0b3JzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU107Ci0gICAgVUNIQVIgICAgIG91dE9mZnNldFRhYmxlW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKLSAgICBVSU5UICAgICAgc2FtcGxlOwotICAgIGludCAgICAgICBjaENmZyA9IDA7Ci0gICAgaW50ICAgICAgIGJ5cFNjYWxlID0gMDsKLQotI2lmIChQQ01fRE1YX01BWF9JTl9DSEFOTkVMUyA+PSA3KQotICAgIGlmIChudW1JbkNoYW5uZWxzID4gU0lYX0NIQU5ORUwpIHsKLSAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSBtdWx0aVB1cnBvc2VDaFR5cGVbMl07Ci0KLSAgICAgIC8qIEdldCB0aGUgdHlwZSBvZiB0aGUgbXVsdGlwdXJwb3NlIGNoYW5uZWxzICovCi0gICAgICBtdWx0aVB1cnBvc2VDaFR5cGVbMF0gPSBjaGFubmVsVHlwZVtpbk9mZnNldFRhYmxlW0xFRlRfTVVMVElQUlBTX0NIQU5ORUxdXTsKLSAgICAgIG11bHRpUHVycG9zZUNoVHlwZVsxXSA9IGNoYW5uZWxUeXBlW2luT2Zmc2V0VGFibGVbUklHSFRfTVVMVElQUlBTX0NIQU5ORUxdXTsKLQotICAgICAgLyogQ2hlY2sgaWYgdGhlIGlucHV0IGNvbmZpZ3VyYXRpb24gaXMgb25lIGRlZmluZWQgaW4gdGhlIHN0YW5kYXJkLiAqLwotICAgICAgc3dpdGNoIChpbkNoTW9kZSkgewotICAgICAgY2FzZSBDSF9NT0RFXzVfMF8yXzE6ICAvKiBjaENmZyA3IHx8IDE0ICovCi0gICAgICAgIC8qIEZ1cnRoZXIgYW5hbHlzZSB0aGUgaW5wdXQgY29uZmlnIHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28gQ0hfTU9ERV81XzBfMl8xIGNvbmZpZ3MuICovCi0gICAgICAgIGlmICggKG11bHRpUHVycG9zZUNoVHlwZVswXSA9PSBBQ1RfRlJPTlRfVE9QKQotICAgICAgICAgICYmIChtdWx0aVB1cnBvc2VDaFR5cGVbMV0gPT0gQUNUX0ZST05UX1RPUCkgKSB7Ci0gICAgICAgICAgY2hDZmcgPSAxNDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjaENmZyA9IDc7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIENIX01PREVfM18wXzNfMTogIC8qIGNoQ2ZnIDExICovCi0gICAgICAgIGNoQ2ZnID0gMTE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDSF9NT0RFXzNfMF80XzE6ICAvKiBjaENmZyAxMiAqLwotICAgICAgICBjaENmZyA9IDEyOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGNoQ2ZnID0gMDsgIC8qIE5vdCBhIGtub3duIGNvbmZpZyAqLwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qIFNldCB0aGlzIHN0YWdlcyBvdXRwdXQgc3RyaWRlIGFuZCBjaGFubmVsIG1vZGU6ICovCi0gICAgb3V0U3RyaWRlID0gKGZJbnRlcmxlYXZlZCkgPyBudW1PdXRDaGFubmVscyA6IDE7Ci0gICAgb3V0Q2hNb2RlID0gb3V0Q2hNb2RlVGFibGVbbnVtT3V0Q2hhbm5lbHNdOwotCi0gICAgLyogR2V0IGNoYW5uZWwgZGVzY3JpcHRpb24gYW5kIGNoYW5uZWwgbWFwcGluZyBmb3IgdGhlIGRlc2lyZWQgb3V0cHV0IGNvbmZpZ3VyYXRpb24uICovCi0gICAgZ2V0Q2hhbm5lbERlc2NyaXB0aW9uKAotICAgICAgICAgICAgb3V0Q2hNb2RlLAotICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmcsCi0gICAgICAgICAgICBjaGFubmVsVHlwZSwKLSAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzLAotICAgICAgICAgICAgb3V0T2Zmc2V0VGFibGUKLSAgICAgICAgICAgKTsKLSAgICAvKiBOb3cgdGhlcmUgaXMgbm8gd2F5IGJhY2sgYmVjYXVzZSB3ZSBtb2RpZmllZCB0aGUgY2hhbm5lbCBjb25maWd1cmF0aW9uISAqLwotCi0gICAgLyogQ3JlYXRlIHRoZSBETVggbWF0cml4ICovCi0gICAgZXJyb3JTdGF0dXMgPSBnZXRNaXhGYWN0b3JzICgKLSAgICAgICAgICAgICAgICAgICAgICAgKGNoQ2ZnPjApID8gMSA6IDAsCi0gICAgICAgICAgICAgICAgICAgICAgIChjaENmZz4wKSA/IChQQ01fRE1YX0NIQU5ORUxfTU9ERSljaENmZyA6IGluQ2hNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICBvdXRDaE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAmYnNNZXRhRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgbWl4RmFjdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAmZG14U2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgLyogTm8gZmF0YWwgZXJyb3JzIGNhbiBvY2N1ciBoZXJlLiBUaGUgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYWx3YXlzIHJldHVybiBhIHZhbGlkIG1hdHJpeC4KLSAgICAgICBUaGUgZXJyb3IgY29kZSBpcyB1c2VkIHRvIHNpZ25hbCBjb25maWd1cmF0aW9ucyBhbmQgbWF0cmljZXMgdGhhdCBhcmUgbm90IGNvbmZvcm0gdG8gYW55IHN0YW5kYXJkLiAqLwotCi0gICAgLyogRGV0ZXJtaW5lIHRoZSBmaW5hbCBzY2FsaW5nICovCi0gICAgYnlwU2NhbGUgPSBGREttaW4oZG14TWF4U2NhbGUsIGRteFNjYWxlKTsKLSAgICAqcERteE91dFNjYWxlICs9IGJ5cFNjYWxlOwotICAgIGRteFNjYWxlIC09IGJ5cFNjYWxlOwotCi0gICAgeyAvKiBTZXQgY2hhbm5lbCBwb2ludGVyIGZvciBpbnB1dC4gUmVtb3ZlIGVtcHR5IGNvbHMuICovCi0gICAgICBpbnQgaW5DaCwgb3V0Q2gsIG1hcFtQQ01fRE1YX01BWF9DSEFOTkVMU107Ci0gICAgICBjaCA9IDA7Ci0gICAgICBmb3IgKGluQ2g9MDsgaW5DaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBpbkNoKz0xKSB7Ci0gICAgICAgIGlmIChpbk9mZnNldFRhYmxlW2luQ2hdICE9IDI1NSkgewotICAgICAgICAgIHBJblBjbVtjaF0gPSAmcFBjbUJ1Zltpbk9mZnNldFRhYmxlW2luQ2hdKm9mZnNldF07Ci0gICAgICAgICAgbWFwW2NoKytdICA9IGluQ2g7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChjaCAhPSBudW1JbkNoYW5uZWxzKSB7Ci0jaWZuZGVmIF9fbGludXhfXwotICAgICAgICAgIEFMT0dFKCJiLzIzODc2NDQ0Iik7Ci0jZW5kaWYKLSAgICAgICAgICByZXR1cm4gUENNRE1YX0lOVkFMSURfQVJHVU1FTlQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFJlbW92ZSB1bnVzZWQgY29scyBmcm9tIGZhY3RvciBtYXRyaXggKi8KLSAgICAgIGZvciAoaW5DaD0wOyBpbkNoIDwgbnVtSW5DaGFubmVsczsgaW5DaCs9MSkgewotICAgICAgICBpZiAoaW5DaCAhPSBtYXBbaW5DaF0pIHsKLSAgICAgICAgICBpbnQgb3V0Q2g7Ci0gICAgICAgICAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBvdXRDaCs9MSkgewotICAgICAgICAgICAgbWl4RmFjdG9yc1tvdXRDaF1baW5DaF0gPSBtaXhGYWN0b3JzW291dENoXVttYXBbaW5DaF1dOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBTZXQgY2hhbm5lbCBwb2ludGVyIGZvciBvdXRwdXQuIFJlbW92ZSBlbXB0eSBjb2xzLiAqLwotICAgICAgY2ggPSAwOwotICAgICAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBvdXRDaCs9MSkgewotICAgICAgICBpZiAob3V0T2Zmc2V0VGFibGVbb3V0Q2hdICE9IDI1NSkgewotICAgICAgICAgIHBPdXRQY21bY2hdID0gJnBQY21CdWZbb3V0T2Zmc2V0VGFibGVbb3V0Q2hdKm9mZnNldF07Ci0gICAgICAgICAgbWFwW2NoKytdICA9IG91dENoOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBGREtfQVNTRVJUKGNoID09IG51bU91dENoYW5uZWxzKTsKLQotICAgICAgLyogUmVtb3ZlIHVudXNlZCByb3dzIGZyb20gZmFjdG9yIG1hdHJpeCAqLwotICAgICAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IG51bU91dENoYW5uZWxzOyBvdXRDaCs9MSkgewotICAgICAgICBpZiAob3V0Q2ggIT0gbWFwW291dENoXSkgewotICAgICAgICAgIEZES21lbWNweSgmbWl4RmFjdG9yc1tvdXRDaF0sICZtaXhGYWN0b3JzW21hcFtvdXRDaF1dLCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoRklYUF9ETVgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIFNhbXBsZSBwcm9jZXNzaW5nIGxvb3AgKi8KLSAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspCi0gICAgewotICAgICAgRklYUF9QQ00gdEluW1BDTV9ETVhfTUFYX0lOX0NIQU5ORUxTXTsKLSAgICAgIEZJWFBfREJMIHRPdXRbUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTXSA9IHsgKEZJWFBfREJMKTAgfTsKLSAgICAgIGludCBpbkNoLCBvdXRDaDsKLQotICAgICAgLyogUHJlbG9hZCBhbGwgaW5wdXQgc2FtcGxlcyAqLwotICAgICAgZm9yIChpbkNoPTA7IGluQ2ggPCBudW1JbkNoYW5uZWxzOyBpbkNoKz0xKSB7Ci0gICAgICAgIHRJbltpbkNoXSA9IChGSVhQX1BDTSkqcEluUGNtW2luQ2hdOwotICAgICAgICBwSW5QY21baW5DaF0gKz0gaW5TdHJpZGU7Ci0gICAgICB9Ci0gICAgICAvKiBBcHBseSBkb3dubWl4IGNvZWZmaWNpZW50cyB0byBpbnB1dCBzYW1wbGVzIGFuZCBhY2N1bXVsYXRlIGZvciBvdXRwdXQgKi8KLSAgICAgIGZvciAob3V0Q2g9MDsgb3V0Q2ggPCBudW1PdXRDaGFubmVsczsgb3V0Q2grPTEpIHsKLSAgICAgICAgZm9yIChpbkNoPTA7IGluQ2ggPCBudW1JbkNoYW5uZWxzOyBpbkNoKz0xKSB7Ci0gICAgICAgICAgdE91dFtvdXRDaF0gKz0gZk11bHQodEluW2luQ2hdLCBtaXhGYWN0b3JzW291dENoXVtpbkNoXSk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogV3JpdGUgc2FtcGxlICovCi0jaWYgKFNBTVBMRV9CSVRTID09IERGUkFDVF9CSVRTKQotICAgICAgICAqcE91dFBjbVtvdXRDaF0gPSAoSU5UX1BDTSlTQVRVUkFURV9MRUZUX1NISUZUKHRPdXRbb3V0Q2hdLCBkbXhTY2FsZSwgU0FNUExFX0JJVFMpOwotI2Vsc2UKLSAgICAgICAgKnBPdXRQY21bb3V0Q2hdID0gKElOVF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQodE91dFtvdXRDaF0sIERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTLWRteFNjYWxlLCBTQU1QTEVfQklUUyk7Ci0jZW5kaWYKLSAgICAgICAgcE91dFBjbVtvdXRDaF0gKz0gb3V0U3RyaWRlOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIFVwZGF0ZSB0aGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAqLwotICAgICpuQ2hhbm5lbHMgPSBudW1PdXRDaGFubmVsczsKLQotICB9IC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KLSAgZWxzZQotI2VuZGlmIC8qIFBDTV9ET1dOTUlYX0VOQUJMRSAqLwotI2lmZGVmIFBDTV9DSEFOTkVMX0VYVEVOU0lPTl9FTkFCTEUKLSAgaWYgKCBudW1JbkNoYW5uZWxzIDwgbnVtT3V0Q2hhbm5lbHMgKQotICB7IC8qIEFwcGx5IHJ1ZGltZW50YXJ5IHVwbWl4ICovCi0gICAgLyogU2V0IHVwIGNoYW5uZWwgcG9pbnRlciAqLwotICAgIFVJTlQgICAgIHNhbXBsZTsKLSAgICBVQ0hBUiAgICBvdXRPZmZzZXRUYWJsZVtQQ01fRE1YX01BWF9DSEFOTkVMU107Ci0KLSAgICAvKiBGSVJTVCBTVEFHRQotICAgICAgICAgQ3JlYXRlIGEgc3RlcmVvL2R1YWwgY2hhbm5lbCBzaWduYWwgKi8KLSAgICBpZiAobnVtSW5DaGFubmVscyA9PSBPTkVfQ0hBTk5FTCkKLSAgICB7Ci0gICAgICBJTlRfUENNICAqcEluUGNtW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKLSAgICAgIElOVF9QQ00gICpwT3V0TEYsICpwT3V0UkY7Ci0KLSAgICAgIC8qIFNldCB0aGlzIHN0YWdlcyBvdXRwdXQgc3RyaWRlIGFuZCBjaGFubmVsIG1vZGU6ICovCi0gICAgICBvdXRTdHJpZGUgPSAoZkludGVybGVhdmVkKSA/IFRXT19DSEFOTkVMIDogMTsKLSAgICAgIG91dENoTW9kZSA9IG91dENoTW9kZVRhYmxlW1RXT19DSEFOTkVMXTsKLQotICAgICAgLyogR2V0IGNoYW5uZWwgZGVzY3JpcHRpb24gYW5kIGNoYW5uZWwgbWFwcGluZyBmb3IgdGhpcwotICAgICAgICogc3RhZ2VzIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKGFsd2F5cyBTVEVSRU8pLiAqLwotICAgICAgZ2V0Q2hhbm5lbERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICBvdXRDaE1vZGUsCi0gICAgICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLAotICAgICAgICAgICAgICBjaGFubmVsVHlwZSwKLSAgICAgICAgICAgICAgY2hhbm5lbEluZGljZXMsCi0gICAgICAgICAgICAgIG91dE9mZnNldFRhYmxlCi0gICAgICAgICAgICAgKTsKLSAgICAgIC8qIE5vdyB0aGVyZSBpcyBubyB3YXkgYmFjayBiZWNhdXNlIHdlIG1vZGlmaWVkIHRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24hICovCi0KLSAgICAgIC8qIFNldCBpbnB1dCBjaGFubmVsIHBvaW50ZXIuIFRoZSBmaXJzdCBjaGFubmVsIGlzIGFsd2F5cyBhdCBpbmRleCAwLiAqLwotICAgICAgcEluUGNtW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSA9ICZwUGNtQnVmWyhmcmFtZVNpemUtMSkqaW5TdHJpZGVdOyAgLyogQ29uc2lkZXJpbmcgaW5wdXQgbWFwcGluZyBjb3VsZCBsZWFkIHRvIGEgaW52YWxpZCBwb2ludGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlIGlmIHRoZSBjaGFubmVsIGlzIG5vdCBkZWNsYXJlZCB0byBiZSBhIGZyb250IGNoYW5uZWwuICovCi0KLSAgICAgIC8qIFNldCBvdXRwdXQgY2hhbm5lbCBwb2ludGVyIChmb3IgdGhpcyBzdGFnZSkuICovCi0gICAgICBwT3V0TEYgPSAmcFBjbUJ1ZltvdXRPZmZzZXRUYWJsZVtMRUZUX0ZST05UX0NIQU5ORUxdKm9mZnNldCsoZnJhbWVTaXplLTEpKm91dFN0cmlkZV07Ci0gICAgICBwT3V0UkYgPSAmcFBjbUJ1ZltvdXRPZmZzZXRUYWJsZVtSSUdIVF9GUk9OVF9DSEFOTkVMXSpvZmZzZXQrKGZyYW1lU2l6ZS0xKSpvdXRTdHJpZGVdOwotCi0gICAgICAvKiAxLzAgaW5wdXQ6ICovCi0gICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKLSAgICAgICAgLyogTCcgPSBDOyAgUicgPSBDOyAqLwotICAgICAgICAqcE91dExGID0gKnBPdXRSRiA9ICpwSW5QY21bQ0VOVEVSX0ZST05UX0NIQU5ORUxdOwotCi0gICAgICAgIHBJblBjbVtDRU5URVJfRlJPTlRfQ0hBTk5FTF0gLT0gaW5TdHJpZGU7Ci0gICAgICAgIHBPdXRMRiAtPSBvdXRTdHJpZGU7IHBPdXRSRiAtPSBvdXRTdHJpZGU7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFByZXBhcmUgZm9yIG5leHQgc3RhZ2U6ICovCi0gICAgICBpblN0cmlkZSA9IG91dFN0cmlkZTsKLSAgICAgIGluQ2hNb2RlID0gb3V0Q2hNb2RlOwotICAgICAgRkRLbWVtY3B5KGluT2Zmc2V0VGFibGUsIG91dE9mZnNldFRhYmxlLCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoVUNIQVIpKTsKLSAgICB9Ci0KLSNpZiAoUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTID4gMikKLSAgICAvKiBTRUNPTkQgU1RBR0UKLSAgICAgICAgIEV4dGVuZCB3aXRoIHplcm8gY2hhbm5lbHMgdG8gYWNoaWV2ZWQgdGhlIGRlc2lyZWQgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4gKi8KLSAgICBpZiAobnVtT3V0Q2hhbm5lbHMgPiBUV09fQ0hBTk5FTCkKLSAgICB7Ci0gICAgICBJTlRfUENNICpwSW5bUENNX0RNWF9NQVhfQ0hBTk5FTFNdICA9IHsgTlVMTCB9OwotICAgICAgSU5UX1BDTSAqcE91dFtQQ01fRE1YX01BWF9DSEFOTkVMU10gPSB7IE5VTEwgfTsKLSAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSAgaW5DaFR5cGVzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKLSAgICAgIFVDSEFSICAgIGluQ2hJbmRpY2VzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKLSAgICAgIFVDSEFSICAgIG51bUNoUGVyR3JwWzJdW1BDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTXTsKLSAgICAgIGludCAgICAgIG5Db250ZW50Q2ggPSAwOyAgLyogTnVtYmVyIG9mIGNoYW5uZWxzIHdpdGggY29udGVudCAqLwotICAgICAgaW50ICAgICAgbkVtcHR5Q2ggPSAwOyAgICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgd2l0aCBjb250ZW50ICovCi0gICAgICBpbnQgICAgICBjaCwgY2hHcnAsIGlzQ29tcGF0aWJsZSA9IDE7Ci0KLSAgICAgIC8qIERvIG5vdCBjaGFuZ2UgdGhlIHNpZ25hbGxpbmcgd2hpY2ggaXMgdGhlIGNoYW5uZWwgdHlwZXMgYW5kIGluZGljZXMuCi0gICAgICAgICBKdXN0IHJlb3JkZXIgYW5kIGFkZCBjaGFubmVscy4gU28gZmlyc3Qgc2F2ZSB0aGUgaW5wdXQgc2lnbmFsbGluZy4gKi8KLSAgICAgIEZES21lbWNweShpbkNoVHlwZXMsIGNoYW5uZWxUeXBlLCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoQVVESU9fQ0hBTk5FTF9UWVBFKSk7Ci0gICAgICBGREttZW1jcHkoaW5DaEluZGljZXMsIGNoYW5uZWxJbmRpY2VzLCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoVUNIQVIpKTsKLQotICAgICAgLyogU2V0IHRoaXMgc3RhZ2VzIG91dHB1dCBzdHJpZGUgYW5kIGNoYW5uZWwgbW9kZTogKi8KLSAgICAgIG91dFN0cmlkZSA9IChmSW50ZXJsZWF2ZWQpID8gbnVtT3V0Q2hhbm5lbHMgOiAxOwotICAgICAgb3V0Q2hNb2RlID0gb3V0Q2hNb2RlVGFibGVbbnVtT3V0Q2hhbm5lbHNdOwotCi0gICAgICAvKiBDaGVjayBpZiBpbnB1dCBjaGFubmVsIGNvbmZpZyBjYW4gYmUgZWFzaWx5IG1hcHBlZCB0byB0aGUgZGVzaXJlZCBvdXRwdXQgY29uZmlnLiAqLwotICAgICAgZm9yIChjaEdycCA9IDA7IGNoR3JwIDwgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFM7IGNoR3JwICs9IDEpIHsKLSAgICAgICAgbnVtQ2hQZXJHcnBbSU5dW2NoR3JwXSA9IChpbkNoTW9kZSA+PiAoY2hHcnAqNCkpICYgMHhGOwotICAgICAgICBudW1DaFBlckdycFtPVVRdW2NoR3JwXSA9IChvdXRDaE1vZGUgPj4gKGNoR3JwKjQpKSAmIDB4RjsKLQotICAgICAgICBpZiAobnVtQ2hQZXJHcnBbSU5dW2NoR3JwXSA+IG51bUNoUGVyR3JwW09VVF1bY2hHcnBdKSB7Ci0gICAgICAgICAgaXNDb21wYXRpYmxlID0gMDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoIGlzQ29tcGF0aWJsZSApIHsKLSAgICAgICAgLyogR2V0IG5ldyBjaGFubmVsIGRlc2NyaXB0aW9uIGFuZCBjaGFubmVsCi0gICAgICAgICAqIG1hcHBpbmcgZm9yIHRoZSBkZXNpcmVkIG91dHB1dCBjaGFubmVsIG1vZGUuICovCi0gICAgICAgIGdldENoYW5uZWxEZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICBvdXRDaE1vZGUsCi0gICAgICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmcsCi0gICAgICAgICAgICAgICAgY2hhbm5lbFR5cGUsCi0gICAgICAgICAgICAgICAgY2hhbm5lbEluZGljZXMsCi0gICAgICAgICAgICAgICAgb3V0T2Zmc2V0VGFibGUKLSAgICAgICAgICAgICAgICk7Ci0gICAgICAgIC8qIElmIHRoZSBpbnB1dCBjb25maWcgaGFzIGEgYmFjayBjZW50ZXIgY2hhbm5lbCBidXQgdGhlIG91dHB1dAotICAgICAgICAgICBjb25maWcgaGFzIG5vdCwgY29weSBpdCB0byBsZWZ0IGFuZCByaWdodCAoaWYgYXZhaWxhYmxlKS4gKi8KLSAgICAgICAgaWYgKCAgKG51bUNoUGVyR3JwW0lOXVtDSF9HUk9VUF9SRUFSXSUyKQotICAgICAgICAgICYmICEobnVtQ2hQZXJHcnBbT1VUXVtDSF9HUk9VUF9SRUFSXSUyKSApIHsKLSAgICAgICAgICBpZiAobnVtQ2hQZXJHcnBbSU5dW0NIX0dST1VQX1JFQVJdID09IDEpIHsKLSAgICAgICAgICAgIGluT2Zmc2V0VGFibGVbUklHSFRfUkVBUl9DSEFOTkVMXSA9IGluT2Zmc2V0VGFibGVbTEVGVF9SRUFSX0NIQU5ORUxdOwotICAgICAgICAgIH0gZWxzZSBpZiAobnVtQ2hQZXJHcnBbSU5dW0NIX0dST1VQX1JFQVJdID09IDMpIHsKLSAgICAgICAgICAgIGluT2Zmc2V0VGFibGVbUklHSFRfTVVMVElQUlBTX0NIQU5ORUxdID0gaW5PZmZzZXRUYWJsZVtMRUZUX01VTFRJUFJQU19DSEFOTkVMXTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAvKiBKdXN0IGNvcHkgYW5kIGV4dGVuZCB0aGUgb3JpZ2luYWwgY29uZmlnICovCi0gICAgICAgIEZES21lbWNweShvdXRPZmZzZXRUYWJsZSwgaW5PZmZzZXRUYWJsZSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFNldCBJL08gY2hhbm5lbCBwb2ludGVyLgotICAgICAgICAgTm90ZTogVGhlIGZvbGxvd2luZyBhc3NpZ25tZW50IGFsZ29yaXRobSBjbGVhcnMgdGhlIGNoYW5uZWwgb2Zmc2V0IHRhYmxlcy4KLSAgICAgICAgICAgICAgIFRodXMgdGhleSBjYW4gbm90IGJlIHVzZWQgYWZ0ZXJ3YXJkcy4gKi8KLSAgICAgIGZvciAoY2ggPSAwOyBjaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBjaCs9MSkgewotICAgICAgICBpZiAoIChvdXRPZmZzZXRUYWJsZVtjaF0gPCAyNTUpCi0gICAgICAgICAgJiYgKGluT2Zmc2V0VGFibGVbY2hdIDwgMjU1KSApCi0gICAgICAgIHsgLyogU2V0IEkvTyBwb2ludGVyOiAqLwotICAgICAgICAgIHBJbltuQ29udGVudENoXSA9ICZwUGNtQnVmW2luT2Zmc2V0VGFibGVbY2hdKm9mZnNldCsoZnJhbWVTaXplLTEpKmluU3RyaWRlXTsKLSAgICAgICAgICBwT3V0W25Db250ZW50Q2hdID0gJnBQY21CdWZbb3V0T2Zmc2V0VGFibGVbY2hdKm9mZnNldCsoZnJhbWVTaXplLTEpKm91dFN0cmlkZV07Ci0gICAgICAgICAgLyogVXBkYXRlIHNpZ25hbGxpbmcgKi8KLSAgICAgICAgICBjaGFubmVsVHlwZVtvdXRPZmZzZXRUYWJsZVtjaF1dID0gaW5DaFR5cGVzW2luT2Zmc2V0VGFibGVbY2hdXTsKLSAgICAgICAgICBjaGFubmVsSW5kaWNlc1tvdXRPZmZzZXRUYWJsZVtjaF1dID0gaW5DaEluZGljZXNbaW5PZmZzZXRUYWJsZVtjaF1dOwotICAgICAgICAgIGluT2Zmc2V0VGFibGVbY2hdID0gMjU1OwotICAgICAgICAgIG91dE9mZnNldFRhYmxlW2NoXSA9IDI1NTsKLSAgICAgICAgICBuQ29udGVudENoICs9IDE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICggaXNDb21wYXRpYmxlICkgewotICAgICAgICAvKiBBc3NpZ24gdGhlIHJlbWFpbmluZyBpbnB1dCBjaGFubmVscy4KLSAgICAgICAgICAgVGhpcyBpcyBqdXN0IGEgc2FmZXR5IGFwcGxpYW5jZS4gV2Ugc2hvdWxkIG5ldmVyIG5lZWQgaXQuICovCi0gICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBjaCs9MSkgewotICAgICAgICAgIGlmIChpbk9mZnNldFRhYmxlW2NoXSA8IDI1NSkgewotICAgICAgICAgICAgaW50ICBvdXRDaDsKLSAgICAgICAgICAgIGZvciAob3V0Q2ggPSAwIDsgb3V0Q2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgb3V0Q2ggKz0gMSkgewotICAgICAgICAgICAgICBpZiAob3V0T2Zmc2V0VGFibGVbb3V0Q2hdIDwgMjU1KSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFNldCBJL08gcG9pbnRlcjogKi8KLSAgICAgICAgICAgIHBJbltuQ29udGVudENoXSA9ICZwUGNtQnVmW2luT2Zmc2V0VGFibGVbY2hdKm9mZnNldCsoZnJhbWVTaXplLTEpKmluU3RyaWRlXTsKLSAgICAgICAgICAgIHBPdXRbbkNvbnRlbnRDaF0gPSAmcFBjbUJ1ZltvdXRPZmZzZXRUYWJsZVtvdXRDaF0qb2Zmc2V0KyhmcmFtZVNpemUtMSkqb3V0U3RyaWRlXTsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBzaWduYWxsaW5nICovCi0gICAgICAgICAgICBjaGFubmVsVHlwZVtvdXRPZmZzZXRUYWJsZVtvdXRDaF1dID0gaW5DaFR5cGVzW2luT2Zmc2V0VGFibGVbY2hdXTsKLSAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW291dE9mZnNldFRhYmxlW291dENoXV0gPSBpbkNoSW5kaWNlc1tpbk9mZnNldFRhYmxlW2NoXV07Ci0gICAgICAgICAgICBpbk9mZnNldFRhYmxlW2NoXSA9IDI1NTsKLSAgICAgICAgICAgIG91dE9mZnNldFRhYmxlW291dENoXSA9IDI1NTsKLSAgICAgICAgICAgIG5Db250ZW50Q2ggKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogU2V0IHRoZSByZW1haW5pbmcgb3V0cHV0IGNoYW5uZWwgcG9pbnRlciAqLwotICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgY2grPTEpIHsKLSAgICAgICAgICBpZiAob3V0T2Zmc2V0VGFibGVbY2hdIDwgMjU1KSB7Ci0gICAgICAgICAgICBwT3V0W25Db250ZW50Q2grbkVtcHR5Q2hdID0gJnBQY21CdWZbb3V0T2Zmc2V0VGFibGVbY2hdKm9mZnNldCsoZnJhbWVTaXplLTEpKm91dFN0cmlkZV07Ci0gICAgICAgICAgICAvKiBFeHBhbmQgb3V0cHV0IHNpZ25hbGxpbmcgKi8KLSAgICAgICAgICAgIGNoYW5uZWxUeXBlW291dE9mZnNldFRhYmxlW2NoXV0gPSBBQ1RfTk9ORTsKLSAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW291dE9mZnNldFRhYmxlW2NoXV0gPSBuRW1wdHlDaDsKLSAgICAgICAgICAgIG91dE9mZnNldFRhYmxlW2NoXSA9IDI1NTsKLSAgICAgICAgICAgIG5FbXB0eUNoICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgLyogU2V0IHRoZSByZW1haW5pbmcgb3V0cHV0IGNoYW5uZWwgcG9pbnRlciAqLwotICAgICAgICBmb3IgKGNoID0gbkNvbnRlbnRDaDsgY2ggPCBudW1PdXRDaGFubmVsczsgY2grPTEpIHsKLSAgICAgICAgICBwT3V0W2NoXSA9ICZwUGNtQnVmW2NoKm9mZnNldCsoZnJhbWVTaXplLTEpKm91dFN0cmlkZV07Ci0gICAgICAgICAgLyogRXhwYW5kIG91dHB1dCBzaWduYWxsaW5nICovCi0gICAgICAgICAgY2hhbm5lbFR5cGVbY2hdID0gQUNUX05PTkU7Ci0gICAgICAgICAgY2hhbm5lbEluZGljZXNbY2hdID0gbkVtcHR5Q2g7Ci0gICAgICAgICAgbkVtcHR5Q2ggKz0gMTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBGaXJzdCBjb3B5IHRoZSBjaGFubmVscyB0aGF0IGhhdmUgc2lnbmFsICovCi0gICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKz0xKSB7Ci0gICAgICAgIElOVF9QQ00gdEluW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKLSAgICAgICAgLyogUmVhZCBhbGwgY2hhbm5lbCBzYW1wbGVzICovCi0gICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5Db250ZW50Q2g7IGNoKz0xKSB7Ci0gICAgICAgICAgdEluW2NoXSA9ICpwSW5bY2hdOwotICAgICAgICAgIHBJbltjaF0gLT0gaW5TdHJpZGU7Ci0gICAgICAgIH0KLSAgICAgICAgLyogV3JpdGUgYWxsIGNoYW5uZWwgc2FtcGxlcyAqLwotICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ29udGVudENoOyBjaCs9MSkgewotICAgICAgICAgICpwT3V0W2NoXSA9IHRJbltjaF07Ci0gICAgICAgICAgcE91dFtjaF0gLT0gb3V0U3RyaWRlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIENsZWFyIGFsbCB0aGUgb3RoZXIgY2hhbm5lbHMgKi8KLSAgICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrKykgewotICAgICAgICBmb3IgKGNoID0gbkNvbnRlbnRDaDsgY2ggPCBudW1PdXRDaGFubmVsczsgY2grPTEpIHsKLSAgICAgICAgICAqcE91dFtjaF0gPSAoSU5UX1BDTSkwOwotICAgICAgICAgIHBPdXRbY2hdIC09IG91dFN0cmlkZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSNlbmRpZiAgLyogaWYgKFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyA+IDIpICovCi0KLSAgICAvKiB1cGRhdGUgdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKi8KLSAgICAqbkNoYW5uZWxzID0gbnVtT3V0Q2hhbm5lbHM7Ci0gIH0gLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwotICBlbHNlCi0jZW5kaWYgLyogUENNX0NIQU5ORUxfRVhURU5TSU9OX0VOQUJMRSAqLwotICBpZiAoIG51bUluQ2hhbm5lbHMgPT0gbnVtT3V0Q2hhbm5lbHMgKQotICB7Ci0gICAgLyogRG9uJ3QgbmVlZCB0byBjaGFuZ2UgdGhlIGNoYW5uZWwgZGVzY3JpcHRpb24gaGVyZSAqLwotCi0gICAgc3dpdGNoIChudW1JbkNoYW5uZWxzKQotICAgIHsKLSAgICBjYXNlIDI6Ci0gICAgICB7IC8qIFNldCB1cCBjaGFubmVsIHBvaW50ZXIgKi8KLSAgICAgICAgSU5UX1BDTSAgKnBJblBjbVtQQ01fRE1YX01BWF9DSEFOTkVMU107Ci0gICAgICAgIElOVF9QQ00gICpwT3V0TCwgKnBPdXRSOwotICAgICAgICBGSVhQX0RNWCAgZmxldjsKLQotICAgICAgICBVSU5UIHNhbXBsZTsKLSAgICAgICAgaW50IGluU3RyaWRlLCBvdXRTdHJpZGUsIG9mZnNldDsKLQotICAgICAgICBpZiAoZkludGVybGVhdmVkKSB7Ci0gICAgICAgICAgaW5TdHJpZGUgID0gbnVtSW5DaGFubmVsczsKLSAgICAgICAgICBvdXRTdHJpZGUgPSAyOyAgLyogZml4ZWQgISEhIChiZWxvdyBzdGVyZW8gaXMgZG9ud21peGVkIHRvIG1vbm8gaWYgcmVxdWlyZWQgKi8KLSAgICAgICAgICBvZmZzZXQgPSAxOyAvKiBDaGFubmVsIHNwZWNpZmljIG9mZnNldCBmYWN0b3IgKi8KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpblN0cmlkZSAgPSAxOwotICAgICAgICAgIG91dFN0cmlkZSA9IDE7Ci0gICAgICAgICAgb2Zmc2V0ID0gZnJhbWVTaXplOyAgLyogQ2hhbm5lbCBzcGVjaWZpYyBvZmZzZXQgZmFjdG9yICovCi0gICAgICAgIH0KLQotICAgICAgICAvKiBTZXQgaW5wdXQgY2hhbm5lbCBwb2ludGVyICovCi0gICAgICAgIHBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdICA9ICZwUGNtQnVmW2luT2Zmc2V0VGFibGVbTEVGVF9GUk9OVF9DSEFOTkVMXSpvZmZzZXRdOwotICAgICAgICBwSW5QY21bUklHSFRfRlJPTlRfQ0hBTk5FTF0gPSAmcFBjbUJ1Zltpbk9mZnNldFRhYmxlW1JJR0hUX0ZST05UX0NIQU5ORUxdKm9mZnNldF07Ci0KLSAgICAgICAgLyogU2V0IG91dHB1dCBjaGFubmVsIHBvaW50ZXIgKHNhbWUgYXMgaW5wdXQpICovCi0gICAgICAgIHBPdXRMICA9ICBwSW5QY21bTEVGVF9GUk9OVF9DSEFOTkVMXTsKLSAgICAgICAgcE91dFIgID0gIHBJblBjbVtSSUdIVF9GUk9OVF9DSEFOTkVMXTsKLQotICAgICAgICAvKiBTZXQgZG93bm1peCBsZXZlbHM6ICovCi0gICAgICAgIGZsZXYgPSBGTDJGWENPTlNUX0RNWCgwLjcwNzEwNjc4Zik7Ci0gICAgICAgIC8qIDIvMCBpbnB1dDogKi8KLSAgICAgICAgc3dpdGNoIChkdWFsQ2hhbm5lbE1vZGUpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBDSDFfTU9ERTogIC8qIEwnID0gMC43MDcgKiBDaDE7ICBSJyA9IDAuNzA3ICogQ2gxICovCi0gICAgICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKSB7Ci0gICAgICAgICAgICAqcE91dEwgPSAqcE91dFIgPQotICAgICAgICAgICAgICAoSU5UX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVChmTXVsdCgoRklYUF9QQ00pKnBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdLCBmbGV2KSwgREZSQUNUX0JJVFMtU0FNUExFX0JJVFMsIFNBTVBMRV9CSVRTKTsKLQotICAgICAgICAgICAgcEluUGNtW0xFRlRfRlJPTlRfQ0hBTk5FTF0gKz0gaW5TdHJpZGU7Ci0gICAgICAgICAgICBwT3V0TCArPSBvdXRTdHJpZGU7IHBPdXRSICs9IG91dFN0cmlkZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0gyX01PREU6ICAvKiBMJyA9IDAuNzA3ICogQ2gyOyAgUicgPSAwLjcwNyAqIENoMiAqLwotICAgICAgICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrKykgewotICAgICAgICAgICAgKnBPdXRMID0gKnBPdXRSID0KLSAgICAgICAgICAgICAgKElOVF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQoZk11bHQoKEZJWFBfUENNKSpwSW5QY21bUklHSFRfRlJPTlRfQ0hBTk5FTF0sIGZsZXYpLCBERlJBQ1RfQklUUy1TQU1QTEVfQklUUywgU0FNUExFX0JJVFMpOwotCi0gICAgICAgICAgICBwSW5QY21bUklHSFRfRlJPTlRfQ0hBTk5FTF0gKz0gaW5TdHJpZGU7Ci0gICAgICAgICAgICBwT3V0TCArPSBvdXRTdHJpZGU7IHBPdXRSICs9IG91dFN0cmlkZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTUlYRURfTU9ERTogIC8qIEwnID0gMC41KkNoMSArIDAuNSpDaDI7ICBSJyA9IDAuNSpDaDEgKyAwLjUqQ2gyICovCi0gICAgICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKSB7Ci0gICAgICAgICAgICAqcE91dEwgPSAqcE91dFIgPSAoKnBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdID4+IDEpICsgKCpwSW5QY21bUklHSFRfRlJPTlRfQ0hBTk5FTF0gPj4gMSk7Ci0KLSAgICAgICAgICAgIHBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdICs9IGluU3RyaWRlOyAgcEluUGNtW1JJR0hUX0ZST05UX0NIQU5ORUxdICs9IGluU3RyaWRlOwotICAgICAgICAgICAgcE91dEwgKz0gb3V0U3RyaWRlOyBwT3V0UiArPSBvdXRTdHJpZGU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICBjYXNlIFNURVJFT19NT0RFOgotICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogbm90aGluZyB0byBkbyAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIChlcnJvclN0YXR1cyk7Ci19Ci0KLQotLyoqIENsb3NlIGFuIGluc3RhbmNlIG9mIHRoZSBQQ00gZG93bm1peCBtb2R1bGUuCi0gKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGhhbmRsZSBvZiB0aGUgaW5zdGFuY2UuCi0gKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCi0gKiovCi1QQ01ETVhfRVJST1IgcGNtRG14X0Nsb3NlICgKLSAgICBIQU5ETEVfUENNX0RPV05NSVggKnBTZWxmCi0gICkKLXsKLSAgaWYgKHBTZWxmID09IE5VTEwpIHsKLSAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7Ci0gIH0KLQotICBGcmVlUGNtRG14SW5zdGFuY2UoIHBTZWxmICk7Ci0gICpwU2VsZiA9IE5VTEw7Ci0KLSAgcmV0dXJuIChQQ01ETVhfT0spOwotfQotCi0KLS8qKiBHZXQgbGlicmFyeSBpbmZvIGZvciB0aGlzIG1vZHVsZS4KLSAqIEBwYXJhbSBbb3V0XSBQb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBMSUJfSU5GTyBzdHJ1Y3R1cmUuCi0gKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCi0gKi8KLVBDTURNWF9FUlJPUiBwY21EbXhfR2V0TGliSW5mbyggTElCX0lORk8gKmluZm8gKQotewotICBpbnQgaTsKLQotICBpZiAoaW5mbyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIFBDTURNWF9JTlZBTElEX0FSR1VNRU5UOwotICB9Ci0KLSAgLyogU2VhcmNoIGZvciBuZXh0IGZyZWUgdGFiICovCi0gIGZvciAoaSA9IDA7IGkgPCBGREtfTU9EVUxFX0xBU1Q7IGkrKykgewotICAgIGlmIChpbmZvW2ldLm1vZHVsZV9pZCA9PSBGREtfTk9ORSkgYnJlYWs7Ci0gIH0KLSAgaWYgKGkgPT0gRkRLX01PRFVMRV9MQVNUKSB7Ci0gICAgcmV0dXJuIFBDTURNWF9VTktOT1dOOwotICB9Ci0KLSAgLyogQWRkIHRoZSBsaWJyYXJ5IGluZm8gKi8KLSAgaW5mb1tpXS5tb2R1bGVfaWQgID0gRkRLX1BDTURNWDsKLSAgaW5mb1tpXS52ZXJzaW9uICAgID0gTElCX1ZFUlNJT04oUENNRE1YX0xJQl9WTDAsIFBDTURNWF9MSUJfVkwxLCBQQ01ETVhfTElCX1ZMMik7Ci0gIExJQl9WRVJTSU9OX1NUUklORyhpbmZvK2kpOwotICBpbmZvW2ldLmJ1aWxkX2RhdGUgPSBQQ01ETVhfTElCX0JVSUxEX0RBVEU7Ci0gIGluZm9baV0uYnVpbGRfdGltZSA9IFBDTURNWF9MSUJfQlVJTERfVElNRTsKLSAgaW5mb1tpXS50aXRsZSAgICAgID0gUENNRE1YX0xJQl9USVRMRTsKLQotICAvKiBTZXQgZmxhZ3MgKi8KLSAgaW5mb1tpXS5mbGFncyA9IDAKLSNpZmRlZiBQQ01fRE9XTk1JWF9FTkFCTEUKLSAgICAgIHwgQ0FQRl9ETVhfQkxJTkQgICAvKiBBdCBsZWFzdCBibGluZCBkb3dubWl4aW5nIGlzIHBvc3NpYmxlICovCi0gI2lmZGVmIFBDRV9NRVRBREFUQV9FTkFCTEUKLSAgICAgIHwgQ0FQRl9ETVhfUENFICAgICAvKiBHdWlkZWQgZG93bm1peCB3aXRoIGRhdGEgZnJvbSBNUEVHLTIvNCBQcm9ncmFtIENvbmZpZyBFbGVtZW50cyAoUENFKS4gKi8KLSAgI2lmZGVmIEFSSUJfTUlYRE9XTl9FTkFCTEUKLSAgICAgIHwgQ0FQRl9ETVhfQVJJQiAgICAvKiBQQ0UgZ3VpZGVkIGRvd25taXggd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQgZXF1YXRpb25zIGFuZCBsZXZlbHMuICovCi0gICNlbmRpZgotICNlbmRpZiAvKiBQQ0VfTUVUQURBVEFfRU5BQkxFICovCi0gI2lmZGVmIERTRV9NRVRBREFUQV9FTkFCTEUKLSAgICAgIHwgQ0FQRl9ETVhfRFZCICAgICAvKiBHdWlkZWQgZG93bm1peCB3aXRoIGRhdGEgZnJvbSBEVkIgYW5jaWxsYXJ5IGRhdGEgZmllbGRzLiAqLwotICNlbmRpZgotI2VuZGlmIC8qIFBDTV9ET1dOTUlYX0VOQUJMRSAqLwotI2lmZGVmIFBDTV9DSEFOTkVMX0VYVEVOU0lPTl9FTkFCTEUKLSAgICAgIHwgQ0FQRl9ETVhfQ0hfRVhQICAvKiBTaW1wbGUgdXBtaXhpbmcgYnkgZHVibGljYXRpbmcgY2hhbm5lbHMgb3IgYWRkaW5nIHplcm8gY2hhbm5lbHMuICovCi0jZW5kaWYKLSAgICAgIDsKLQotICAvKiBBZGQgbGliIGluZm8gZm9yIEZESyB0b29scyAoaWYgbm90IHlldCBkb25lKS4gKi8KLSAgRkRLX3Rvb2xzR2V0TGliSW5mbyhpbmZvKTsKLQotICByZXR1cm4gUENNRE1YX09LOwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGliUENNdXRpbHMvc3JjL3ZlcnNpb24uaCBiL2xpYlBDTXV0aWxzL3NyYy92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEzMWFmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYlBDTXV0aWxzL3NyYy92ZXJzaW9uLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogUENNIHV0aWxpdHkgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKFZFUlNJT05fSCkKKyNkZWZpbmUgVkVSU0lPTl9ICisKKy8qIGxpYnJhcnkgaW5mbyAqLworI2RlZmluZSBQQ01VVElMX0xJQl9WTDAgMworI2RlZmluZSBQQ01VVElMX0xJQl9WTDEgMAorI2RlZmluZSBQQ01VVElMX0xJQl9WTDIgMAorI2RlZmluZSBQQ01VVElMX0xJQl9USVRMRSAiUENNIFV0aWxpdHkgTGliIgorI2lmZGVmIF9fQU5EUk9JRF9fCisjZGVmaW5lIFBDTVVUSUxfTElCX0JVSUxEX0RBVEUgIiIKKyNkZWZpbmUgUENNVVRJTF9MSUJfQlVJTERfVElNRSAiIgorI2Vsc2UKKyNkZWZpbmUgUENNVVRJTF9MSUJfQlVJTERfREFURSBfX0RBVEVfXworI2RlZmluZSBQQ01VVElMX0xJQl9CVUlMRF9USU1FIF9fVElNRV9fCisjZW5kaWYKKworI2VuZGlmIC8qICFkZWZpbmVkKFZFUlNJT05fSCkgKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2RlYy9pbmNsdWRlL3NhY19kZWNfZXJyb3Jjb2Rlcy5oIGIvbGliU0FDZGVjL2luY2x1ZGUvc2FjX2RlY19lcnJvcmNvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4YjlmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2RlYy9pbmNsdWRlL3NhY19kZWNfZXJyb3Jjb2Rlcy5oCkBAIC0wLDAgKzEsMTU3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IGVycm9yIGNvZGVzIGZvciBtcGVnIHN1cnJvdW5kIGRlY29kZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQUNfREVDX0VSUk9SQ09ERVNfSAorI2RlZmluZSBTQUNfREVDX0VSUk9SQ09ERVNfSAorCit0eXBlZGVmIGVudW0geworCisgIF9fbXBzX2Vycm9yX3N0YXJ0ID0gLTEwMDAsCisKKyAgTVBTX09LID0gMCwKKworICAvKiBnZW5lcmljL2luaXQgZXJyb3JzICovCisgIE1QU19OT1RPSyA9IF9fbXBzX2Vycm9yX3N0YXJ0LAorCisgIE1QU19PVVRPRk1FTU9SWSwKKyAgTVBTX0lOVkFMSURfSEFORExFLAorICBNUFNfSU5WQUxJRF9QQVJBTUVURVIsICAgICAvKiBTZXRQYXJhbSBub3Qgc3VjY2Vzc2Z1bGwgKi8KKyAgTVBTX1VOU1VQUE9SVEVEX0hSVEZNT0RFTCwgLyogU2V0SFJURk1vZGVsKCkgbm90IHN1Y2Nlc3NmdWxsICovCisgIE1QU19VTlNVUFBPUlRFRF9IUlRGRlJFUSwgIC8qIFNldEhSVEZNb2RlbCgpIG5vdCBzdWNjZXNzZnVsbCAqLworCisgIE1QU19VTlNVUFBPUlRFRF9VUE1JWF9UWVBFLCAvKiBDaGVja0xldmVsVHJlZVVwbWl4VHlwZSgpICovCisgIE1QU19VTlNVUFBPUlRFRF9GT1JNQVQsIC8qIHZhcmlvdXMgZnVuY3Rpb25zOyB1bmtub3duIGFvdCBvciBub19jaGFubmVscyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJiYW5rICovCisgIE1QU19PVVRQVVRfQlVGRkVSX1RPT19TTUFMTCwgLyogU2l6ZSBvZiBwcm92aWRlZCBvdXRwdXQgdGltZSBidWZmZXIgaXMgdG9vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21hbGwgKi8KKworICAvKiBzc2MgZXJyb3JzICovCisgIE1QU19JTlZBTElEX1BBUkFNRVRFUkJBTkRTLCAvKiB1bnN1cHBvcnRlZCBudW1QYXJhbWV0ZXJCYW5kcyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BhdGlhbERlY0RlY29kZUhlYWRlcigpICovCisgIE1QU19JTlZBTElEX1RSRUVDT05GSUcsCisgIE1QU19JTlZBTElEX0hSVEZTRVQsICAgLyogU3BhdGlhbERlY0RlY29kZUhlYWRlcigpICovCisgIE1QU19JTlZBTElEX1RUVCwgICAgICAgLyogU3BhdGlhbERlY0RlY29kZUhlYWRlcigpICovCisgIE1QU19JTlZBTElEX0JPWElEWCwgICAgLyogZWNEYXRhRGVjKCkgKi8KKyAgTVBTX0lOVkFMSURfU0VUSURYLCAgICAvKiBlY0RhdGFEZWMoKSAqLworICBNUFNfSU5WQUxJRF9RVUFOVE1PREUsIC8qIFNwYXRpYWxEZWNQYXJzZVNwZWNpZmljQ29uZmlnKCkgKi8KKyAgTVBTX1VORVFVQUxfU1NDLCAvKiBGREtfU3BhdGlhbERlY0NvbXBhcmVTcGF0aWFsU3BlY2lmaWNDb25maWdIZWFkZXIoKSAqLworICBNUFNfVU5TVVBQT1JURURfQ09ORklHLCAvKiBudW1iZXIgb2YgY29yZSBjaGFubmVsczsgM0RTdGVyZW9JbnZlcnNpb247ICovCisKKyAgLyogcGFyc2UgZXJyb3JzICovCisgIE1QU19QQVJTRV9FUlJPUiwKKyAgTVBTX0lOVkFMSURfVEVNUFNIQVBFLCAvKiBTcGF0aWFsRGVjUGFyc2VGcmFtZURhdGEoKSAqLworCisgIC8qIHJlbmRlciBlcnJvcnMgKi8KKyAgTVBTX1dST05HX1BBUkFNRVRFUlNFVFMsCisgIE1QU19XUk9OR19QQVJBTUVURVJCQU5EUywgLyogZGVjb2RlQW5kTWFwRnJhbWVTbWcoKSAqLworICBNUFNfV1JPTkdfVFJFRUNPTkZJRywKKyAgTVBTX1dST05HX0JMSU5EQ09ORklHLAorICBNUFNfV1JPTkdfT1RULAorICBNUFNfV1JPTkdfUVVBTlRNT0RFLAorICBNUFNfUkVTREVDX0VSUk9SLAorICBNUFNfQVBQTFlfTTJfRVJST1IsIC8qIGVycm9yIGluIGFwcGx5TTJ4KClzZWxlY3Rpb24gKi8KKworICBfX21wc19lcnJvcl9lbmQKKworfSBTQUNERUNfRVJST1I7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliU0FDZGVjL2luY2x1ZGUvc2FjX2RlY19saWIuaCBiL2xpYlNBQ2RlYy9pbmNsdWRlL3NhY19kZWNfbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5N2ExMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2RlYy9pbmNsdWRlL3NhY19kZWNfbGliLmgKQEAgLTAsMCArMSw0NzcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogU3BhY2UgRGVjb2RlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNBQ19ERUNfTElCX0gKKyNkZWZpbmUgU0FDX0RFQ19MSUJfSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorI2luY2x1ZGUgIkZES19hdWRpby5oIgorI2luY2x1ZGUgInNhY19kZWNfZXJyb3Jjb2Rlcy5oIgorI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJGREtfcW1mX2RvbWFpbi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKgorICogXGJyaWVmICBNUEVHIFN1cnJvdW5kIGlucHV0IGRhdGEgaW50ZXJmYWNlIG1vZGUuCisgKiovCit0eXBlZGVmIGVudW0geworICBTQUNfSU5URVJGQUNFX1FNRiA9CisgICAgICAwLCAvKiE8IFVzZSBRTUYgZG9tYWluIGludGVyZmFjZSBmb3IgdGhlIGlucHV0IGRvd25taXggYXVkaW8uICAqLworICBTQUNfSU5URVJGQUNFX1RJTUUsIC8qITwgVXNlIHRpbWUgZG9tYWluIGludGVyZmFjZSBmb3IgdGhlIGlucHV0IGRvd25taXgKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpby4gKi8KKyAgU0FDX0lOVEVSRkFDRV9BVVRPICAvKiE8ICAgICAgICAgICovCit9IFNBQ19JTlBVVF9DT05GSUc7CisKKy8qKgorICogXGJyaWVmICBNUEVHIFN1cnJvdW5kIG91dHB1dCBtb2RlLgorICoqLwordHlwZWRlZiBlbnVtIHsKKyAgU0FDREVDX09VVF9NT0RFX05PUk1BTCA9CisgICAgICAwLCAvKiE8IE5vcm1hbCBtdWx0aSBjaGFubmVsIHByb2Nlc3Npbmcgd2l0aG91dCBvdXRwdXQgcmVzdHJpY3Rpb25zLiAqLworICBTQUNERUNfT1VUX01PREVfQklOQVVSQUwsIC8qITwgVHdvIGNoYW5uZWwgb3V0cHV0IHdpdGggYmluYXVyYWwgcHJvY2Vzc3NpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNBQ0RFQ19PVVRfTU9ERV9TVEVSRU8sICAgLyohPCBBbHdheXMgdHdvIGNoYW5uZWwgb3V0cHV0IG1vZGUuICAgKi8KKyAgU0FDREVDX09VVF9NT0RFXzZDSEFOTkVMICAvKiE8IEFsd2F5cyBwcm9jZXNzIHdpdGggNS4xIGNoYW5uZWwgb3V0cHV0LiAgKi8KK30gU0FDX0RFQ19PVVRQVVRfTU9ERTsKKworLyoqCisgKiBcYnJpZWYgIE1QRUcgU3Vycm91bmQgYmluYXVyYWwgSFJURiBtb2RlbC4KKyAqICAgICAgICAgSFJURiB3aWxsIGJlIGFwcGxpZWQgb25seSBpbiBjb21iaW5hdGlvbiB3aXRoIHVwbWl4dHlwZQorICpTQUNfVVBNSVhfVFlQRV9CSU5BVVJBTC4KKyAqKi8KK3R5cGVkZWYgZW51bSB7CisgIFNBQ19CSU5BVVJBTF9IUlRGX0tFTUFSID0gMCwKKyAgU0FDX0JJTkFVUkFMX0hSVEZfVkFTVCwKKyAgU0FDX0JJTkFVUkFMX0hSVEZfTVBTVlQsCisgIFNBQ19CSU5BVVJBTF9TSU5HTEVfSFJURlMKK30gU0FDX0JJTkFVUkFMX0hSVEZfTU9ERUw7CisKKy8qKgorICogXGJyaWVmICBNUEVHIFN1cnJvdW5kIGRlY29kZXIgaW5zdGFuY2UgYXZhaWxhYmxlLgorICoqLwordHlwZWRlZiBlbnVtIHsKKyAgU0FDX0lOU1RBTkNFX05PVF9GVUxMX0FWQUlMQUJMRSA9CisgICAgICAwLCAvKiE8IE1QRUcgU3Vycm91bmQgZGVjb2RlciBpbnN0YW5jZSBub3QgZnVsbCBhdmFpbGFibGUuICovCisgIFNBQ19JTlNUQU5DRV9GVUxMX0FWQUlMQUJMRSAvKiE8IE1QRUcgU3Vycm91bmQgZGVjb2RlciBpbnN0YW5jZSBmdWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUuICovCit9IFNBQ19JTlNUQU5DRV9BVkFJTDsKKworLyoqCisgKiBcYnJpZWYgIE1QRUcgU3Vycm91bmQgZGVjb2RlciBkeW5hbWljIHBhcmFtZXRlcnMuCisgKgorICogVXNlIG1wZWdTdXJyb3VuZERlY29kZXJfU2V0UGFyYW0oKSBmdW5jdGlvbiB0byBjb25maWd1cmUgaW50ZXJuYWwgc3RhdHVzIG9mCisgKiBmb2xsb3dpbmcgcGFyYW1ldGVycy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgU0FDREVDX09VVFBVVF9NT0RFID0gMHgwMDAxLCAvKiE8IFNldCBNUEVHIFN1cnJvdW5kIGRlY29kZXIgb3V0cHV0IG1vZGUuIFNlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBQ19ERUNfT1VUUFVUX01PREUuICovCisgIFNBQ0RFQ19CTElORF9FTkFCTEUgPQorICAgICAgMHgwMDAyLCAvKiE8IE11bHRpIGNoYW5uZWwgb3V0cHV0IHdpdGhvdXQgTVBFRyBTdXJyb3VuZCBzaWRlIGluZm8uICAgICovCisgIFNBQ0RFQ19QQVJUSUFMTFlfQ09NUExFWCA9CisgICAgICAweDAwMDMsIC8qITwgU2V0IHBhcnRpYWxseSBjb21wbGV4IGZsYWcgZm9yIE1QRUcgU3Vycm91bmQuCisgICAgICAgICAgICAgICAgICAgIDA6IFVzZSBjb21wbGV4IHZhbHVlZCBRTUYgZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgMTogVXNlIHJlYWwgdmFsdWVkIFFNRiBkYXRhIChsb3cgcG93ZXIgbW9kZSkgKi8KKyAgU0FDREVDX0lOVEVSRkFDRSA9CisgICAgICAweDAwMDQsIC8qITwgU2VsZWN0IHNpZ25hbCBpbnB1dCBpbnRlcmZhY2UgZm9yIE1QRUcgU3Vycm91bmQuCisgICAgICAgICAgICAgICAgICAgICBTd2l0Y2ggdGltZSBpbnRlcmZhY2Ugb2ZmOiAgMAorICAgICAgICAgICAgICAgICAgICAgU3dpdGNoIHRpbWUgaW50ZXJmYWNlIG9uOiAgIDEgKi8KKyAgU0FDREVDX0JTX0RFTEFZID0gMHgwMDA1LCAvKiE8IFNlbGVjdCBiaXQgc3RyZWFtIGRlbGF5IGZvciBNUEVHIFN1cnJvdW5kLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2ggYml0IHN0cmVhbSBkZWxheSBvZmY6ICAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaCBiaXQgc3RyZWFtIGRlbGF5IG9uOiAgIDEgKi8KKyAgU0FDREVDX0JJTkFVUkFMX1FVQUxJVFkgPQorICAgICAgMHgwMTAyLCAvKiE8IFNldCBiaW5hdXJhbCBxdWFsaXR5IGZvciBNUEVHIFN1cnJvdW5kIGJpbmF1cmFsIG1vZGUuCisgICAgICAgICAgICAgICAgICAgMDogTG93IENvbXBsZXhpdHksCisgICAgICAgICAgICAgICAgICAgMTogSGlnaCBRdWFsaXR5ICovCisgIFNBQ0RFQ19CSU5BVVJBTF9ESVNUQU5DRSA9IDB4MDEwMywgLyohPCBTZXQgcGVyY2VpdmVkIGRpc3RhbmNlIGZvciBiaW5hdXJhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrIChiaW5hdXJhbCBtb2RlIG9ubHkpLiBUaGUgdmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgIHJhbmdlIGZyb20gMCB0byAxMDAuIFdoZXJlIDEwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBmYXJ0aGVzdCBwZXJjZWl2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZS4gKi8KKyAgU0FDREVDX0JJTkFVUkFMX0RJQUxPR19DTEFSSVRZID0KKyAgICAgIDB4MDEwNCwgLyohPCBTZXQgZGlhbG9nIGNsYXJpdHkgKGZvciBiaW5hdXJhbCBwbGF5YmFjaykuCisgICAgICAgICAgICAgICAgICAgVGhlIHZhbGlkIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMTAwLiAqLworICBTQUNERUNfQklOQVVSQUxfRlJPTlRfQU5HTEUgPSAweDAxMDUsIC8qITwgU2V0IGFuZ2xlIGJldHdlZW4gdGhlIHZpcnR1YWwgZnJvbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVha2VyIHBhaXIgKGJpbmF1cmFsIG1vZGUgb25seSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsaWQgcmFuZ2UgaXMgZnJvbSAwIHRvIDE4MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIgZGVncmVlcy4gKi8KKyAgU0FDREVDX0JJTkFVUkFMX0JBQ0tfQU5HTEUgPSAweDAxMDYsICAvKiE8IFNldCBhbmdsZSBiZXR3ZWVuIHRoZSB2aXJ0dWFsIGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVha2VyIHBhaXIgKGJpbmF1cmFsIG1vZGUgb25seSkuICBUaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCByYW5nZSBpcyBmcm9tIDAgdG8gMTgwIGFuZ3VsYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyZWVzLiAqLworICBTQUNERUNfQklOQVVSQUxfUFJFU0VUID0gMHgwMTA3LCAvKiE8IFNldCBhIHZpcnR1YWwgc3BlYWtlciBzZXR1cCBwcmVzZXQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmF1cmFsIHBsYXliYWNrIChiaW5hdXJhbCBtb2RlIG9ubHkpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1ldGEtcGFyYW1ldGVyIGltcGxpY2l0bHkgbW9kaWZpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FDREVDX0JJTkFVUkFMX0RJU1RBTkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FDREVDX0JJTkFVUkFMX0RJQUxPR19DTEFSSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FDREVDX0JJTkFVUkFMX0ZST05UX0FOR0xFIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FDREVDX0JJTkFVUkFMX0JBQ0tfQU5HTEUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBwcmVzZXRzIGFyZSBhdmFpbGFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBEcnkgcm9vbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogTGl2aW5nIHJvb20gKGRlZmF1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOiBDaW5lbWEgKi8KKworICBTQUNERUNfQlNfSU5URVJSVVBUSU9OID0KKyAgICAgIDB4MDIwMCwgLyohPCBJZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgdW5lcXVhbCB0byAwIGhpbnQgdGhlIE1QRUcgU3Vycm91bmQKKyAgICAgICAgICAgICAgICAgZGVjb2RlciB0aGF0IHRoZSBuZXh0IGlucHV0IGRhdGEgaXMgZGlzY29udGludW91cywgYmVjYXVzZSBvZgorICAgICAgICAgICAgICAgICBmcmFtZSBsb3NzLCBzZWVraW5nLCBldGMuIEFubm91bmNlIHRoZSBkZWNvZGVyIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgIGJpdHN0cmVhbSBkYXRhIHdhcyBpbnRlcnJ1cHRlZCAoZlN5bmMgPSAwKS4gVGhpcyB3aWxsIGNhdXNlIHRoZQorICAgICAgICAgICAgICAgICBzdXJyb3VuZCBkZWNvZGVyIG5vdCB0byBwYXJzZSBhbnkgbmV3IGJpdHN0cmVhbSBkYXRhIHVudGlsIGEKKyAgICAgICAgICAgICAgICAgbmV3IGhlYWRlciB3aXRoIGEgdmFsaWQgU3BhdGlhbCBTcGVjaWZpYyBDb25maWcgYW5kIGEKKyAgICAgICAgICAgICAgICAgaW5kZXBlbmRlbnRseSBkZWNvZGFibGUgZnJhbWUgaXMgZm91bmQuIFNwZWNpYWxseSBpbXBvcnRhbnQKKyAgICAgICAgICAgICAgICAgd2hlbiB0aGUgTVBFRyBTdXJyb3VuZCBkYXRhIGlzIHNwbGl0IGFjY3Jvc3Mgc2V2ZXJhbCBmcmFtZXMKKyAgICAgICAgICAgICAgICAgKGZvciBleGFtcGxlIGluIHRoZSBjYXNlIG9mIEFBQy1MQyBkb3dubWl4IHdpdGggMTAyNAorICAgICAgICAgICAgICAgICBmcmFtZWxlbmd0aCBhbmQgMjA0OCBzdXJyb3VuZCBmcmFtZSBsZW5ndGgpIGFuZCBhIGRpc2NvbnRpbnVpdHkKKyAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdHN0cmVhbSBkYXRhIG9jY3Vycy4gSWYgZlN5bmMgaXMgMSwgYXNzdW1lIHRoYXQgTVBFRworICAgICAgICAgICAgICAgICBTdXJyb3VuZCBkYXRhIGlzIGluIHN5bmMgKG91dCBvZiBiYW5kIGNvbmZpZyBmb3IgZXhhbXBsZSkuICovCisgIFNBQ0RFQ19DTEVBUl9ISVNUT1JZID0gMHgwMjAxLCAvKiE8IElmIHRoZSBnaXZlbiB2YWx1ZSBpcyB1bmVxdWFsIHRvIDAgY2xlYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBpbnRlcm5hbCBzdGF0ZXMgKGRlbGF5IGxpbmVzLCBRTUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlcywgLi4uKSBvZiB0aGUgTVBFRyBTdXJyb3VuZCBkZWNvZGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB3aWxsIGNhdXNlIGEgZGlzY29udGludWl0eSBpbiB0aGUgYXVkaW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBzaWduYWwuICovCisKKyAgU0FDREVDX0NPTkNFQUxfTlVNX0tFRVBfRlJBTUVTID0KKyAgICAgIDB4MDMwMSwgLyohPCBFcnJvciBjb25jZWFsbWVudDogVGhlIE51bWJlciBvZiBmcmFtZXMgdGhlIG1vZHVsZSBrZWVwcyB0aGUKKyAgICAgICAgICAgICAgICAgbGFzdCBzcGF0aWFsIGltYWdlIGJlZm9yZSBmYWRpbmcgdG8gdGhlIHBhcnRpY3VsYXIgc3BhdGlhbAorICAgICAgICAgICAgICAgICBzY2VuYXJpbyBzdGFydHMuIFRoZSBkZWZhdWx0IGlzIDEwIGZyYW1lcy4gKi8KKyAgU0FDREVDX0NPTkNFQUxfRkFERV9PVVRfU0xPUEVfTEVOR1RIID0KKyAgICAgIDB4MDMwMiwgLyohPCBFcnJvciBjb25jZWFsbWVudDogTGVuZ3RoIG9mIHRoZSBzbG9wZSAoaW4gZnJhbWVzKSB0aGUgbW9kdWxlCisgICAgICAgICAgICAgICAgIGNyZWF0ZXMgdG8gZmFkZSBmcm9tIHRoZSBsYXN0IHNwYXRpYWwgc2NlbmFyaW8gdG8gdGhlCisgICAgICAgICAgICAgICAgIHBhcnRpY3VsYXIgZGVmYXVsdCBzY2VuYXJpbyAoZG93bm1peCkgaW4gY2FzZSBvZiBjb25zZWN1dGl2ZQorICAgICAgICAgICAgICAgICBlcnJvcnMuIERlZmF1bHQgaXMgNS4gKi8KKyAgU0FDREVDX0NPTkNFQUxfRkFERV9JTl9TTE9QRV9MRU5HVEggPQorICAgICAgMHgwMzAzLCAvKiE8IEVycm9yIGNvbmNlYWxtZW50OiBMZW5ndGggb2YgdGhlIHNsb3BlIChpbiBmcmFtZXMpIHRoZSBtb2R1bGUKKyAgICAgICAgICAgICAgICAgY3JlYXRlcyB0byBmYWRlIGZyb20gdGhlIGRlZmF1bHQgc3BhdGlhbCBzY2VuYXJpbyAoZG93bm1peCkgdG8KKyAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgc2NlbmFyaW8gYWZ0ZXIgZmFkZS1vdXQuIERlZmF1bHQgcGFyYW1ldGVyIHZhbHVlCisgICAgICAgICAgICAgICAgIGlzIDUuICovCisgIFNBQ0RFQ19DT05DRUFMX05VTV9SRUxFQVNFX0ZSQU1FUyA9CisgICAgICAweDAzMDQgLyohPCBFcnJvciBjb25jZWFsbWVudDogVGhlIG51bWJlciBvZiBlcnJvciBmcmVlIGZyYW1lcyBiZWZvcmUgdGhlCisgICAgICAgICAgICAgICAgbW9kdWxlIHN0YXJ0cyBmYWRpbmcgZnJvbSBkZWZhdWx0IHRvIHRoZSBjdXJyZW50IHNwYXRpYWwKKyAgICAgICAgICAgICAgICBzY2VuYXJpby4gRGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWUgaXMgMyBmcmFtZXMuICovCit9IFNBQ0RFQ19QQVJBTTsKKworI2RlZmluZSBQQ01fTVBTIElOVF9QQ00KKworLyoqCisgKiBcYnJpZWYgTVBFRyBTdXJyb3VuZCBkZWNvZGVyIGhhbmRsZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTXBlZ1N1cnJvdW5kRGVjb2RlciBDTXBlZ1N1cnJvdW5kRGVjb2RlcjsKKworLyoqCisgKiBcYnJpZWYgIENoZWNrIGlmIHRoZSBmdWxsIE1QRUcgU3Vycm91bmQgZGVjb2RlciBpbnN0YW5jZSBpcyBhbGxvY2F0ZWQuCisgKgorICogQ2hlY2sgaWYgdGhlIGZ1bGwgTVBFRyBTdXJyb3VuZCBkZWNvZGVyIGluc3RhbmNlIGlzIGFsbG9jYXRlZC4KKyAqCisgKiBccGFyYW0gcE1wZWdTdXJyb3VuZERlY29kZXIgICBBIHBvaW50ZXIgdG8gYSBkZWNvZGVyIHN0dWN0dXJlLgorICoKKyAqIFxyZXR1cm4gU0FDREVDX0VSUk9SIGVycm9yIGNvZGUKKyAqLworU0FDX0lOU1RBTkNFX0FWQUlMCittcGVnU3Vycm91bmREZWNvZGVyX0lzRnVsbE1wZWdTdXJyb3VuZERlY29kZXJJbnN0YW5jZUF2YWlsYWJsZSgKKyAgICBDTXBlZ1N1cnJvdW5kRGVjb2RlciAqcE1wZWdTdXJyb3VuZERlY29kZXIpOworCisvKioKKyAqIFxicmllZiAgT3BlbiBvbmUgaW5zdGFuY2Ugb2YgdGhlIE1QRUcgU3Vycm91bmQgZGVjb2Rlci4KKyAqCisgKiBBbGxvY2F0ZSBvbmUgaW5zdGFuY2Ugb2YgZGVjb2RlciBhbmQgaW5wdXQgYnVmZmVycy4KKyAqIC0gQWxsb2NhdGUgZGVjb2RlciBzdHJ1Y3R1cmUKKyAqIC0gQWxsb2NhdGUgaW5wdXQgYnVmZmVycyAoUU1GL3RpbWUvTVBTIGRhdGEpCisgKgorICogXHBhcmFtIHBNcGVnU3Vycm91bmREZWNvZGVyICAgQSBwb2ludGVyIHRvIGEgZGVjb2RlciBoYW5kbGU7IGZpbGxlZCBvbgorICogcmV0dXJuLgorICogXHBhcmFtIHNwbGl0TWVtb3J5QWxsb2NhdGlvbiAgQWxsb2NhdGUgb25seSBvdXRlciBsYXllciBvZiBNUFMgZGVjb2Rlci4gQ29yZQorICogcGFydCBpcyByZWFsbG9jYXRlZCBsYXRlciBpZiBuZWVkZWQuCisgKiBccGFyYW0gc3RlcmVvQ29uZmlnSW5kZXggICAgICBVU0FDOiBTYXZlIG1lbW9yeSBieSBvcGVuaW5nIHRoZSBNUFMgZGVjb2RlcgorICogZm9yIGEgc3BlY2lmaWMgc3RlcmVvQ29uZmlnSW5kZXguIChOZWVkcyBvcHRpbWl6YXRpb24gbWFjcm9zIGVuYWJsZWQuKQorICogXHBhcmFtIHBRbWZEb21haW4gICAgICAgICAgICAgUG9pbnRlciB0byBRTUYgZG9tYWluIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIFxyZXR1cm4gU0FDREVDX0VSUk9SIGVycm9yIGNvZGUKKyAqLworU0FDREVDX0VSUk9SIG1wZWdTdXJyb3VuZERlY29kZXJfT3BlbigKKyAgICBDTXBlZ1N1cnJvdW5kRGVjb2RlciAqKnBNcGVnU3Vycm91bmREZWNvZGVyLCBpbnQgc3RlcmVvQ29uZmlnSW5kZXgsCisgICAgSEFORExFX0ZES19RTUZfRE9NQUlOIHBRbWZEb21haW4pOworCisvKioKKyAqIFxicmllZiAgSW5pdCBvbmUgaW5zdGFuY2Ugb2YgdGhlIE1QRUcgU3Vycm91bmQgZGVjb2Rlci4KKyAqCisgKiBJbml0IG9uZSBpbnN0YW5jZSBvZiB0aGUgTVBFRyBTdXJyb3VuZCBkZWNvZGVyCisgKgorICogXHBhcmFtIHBNcGVnU3Vycm91bmREZWNvZGVyICBBIHBvaW50ZXIgdG8gYSBkZWNvZGVyIGhhbmRsZTsKKyAqCisgKiBccmV0dXJuIFNBQ0RFQ19FUlJPUiBlcnJvciBjb2RlCisgKi8KK1NBQ0RFQ19FUlJPUiBtcGVnU3Vycm91bmREZWNvZGVyX0luaXQoCisgICAgQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyKTsKKworLyoqCisgKiBcYnJpZWYgUmVhZCBhbmQgcGFyc2UgU3BhdGlhbFNwZWNpZmljQ29uZmlnLgorICoKKyAqIFxwYXJhbSBwTXBlZ1N1cnJvdW5kRGVjb2RlciAgQSBwb2ludGVyIHRvIGEgZGVjb2RlciBoYW5kbGUuCisgKiBccGFyYW0gaEJzIGJpdHN0cmVhbSBoYW5kbGUgY29uZmlnIHBhcnNpbmcgZGF0YSBzb3VyY2UuCisgKgorICogXHJldHVybiBTQUNERUNfRVJST1IgZXJyb3IgY29kZQorICovCitTQUNERUNfRVJST1IgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9Db25maWcoCisgICAgQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLCBJTlQgc2FtcGxpbmdSYXRlLCBJTlQgc3RlcmVvQ29uZmlnSW5kZXgsCisgICAgSU5UIGNvcmVTYnJGcmFtZUxlbmd0aEluZGV4LCBJTlQgY29uZmlnQnl0ZXMsIGNvbnN0IFVDSEFSIGNvbmZpZ01vZGUsCisgICAgVUNIQVIgKmNvbmZpZ0NoYW5nZWQpOworCitTQUNERUNfRVJST1IKK21wZWdTdXJyb3VuZERlY29kZXJfQ29uZmlndXJlUW1mRG9tYWluKAorICAgIENNcGVnU3Vycm91bmREZWNvZGVyICpwTXBlZ1N1cnJvdW5kRGVjb2RlciwKKyAgICBTQUNfSU5QVVRfQ09ORklHIHNhY19kZWNfaW50ZXJmYWNlLCBVSU5UIGNvcmVTYW1wbGluZ1JhdGUsCisgICAgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjKTsKKworLyoqCisgKiBcYnJpZWYgUGFyc2UgTVBFRyBTdXJyb3VuZCBkYXRhIHdpdGhvdXQgaGVhZGVyCisgKgorICogXHBhcmFtIHBNcGVnU3Vycm91bmREZWNvZGVyIEEgTVBFRyBTdXJycm91bmQgZGVjb2RlciBoYW5kbGUuCisgKiBccGFyYW0gaEJzICAgICAgICAgICAgICAgICAgQml0IHN0cmVhbSBoYW5kbGUgZGF0YSBpbnB1dCBzb3VyY2UKKyAqIFxwYXJhbSBwTXBzRGF0YUJpdHMgICAgICAgICBQb2ludGVyIHRvIG51bWJlciBvZiB2YWxpZCBiaXRzIGluIGV4dGVuc2lvbgorICogcGF5bG9hZC4gRnVuY3Rpb24gdXBkYXRlcyBtcHNEYXRhQml0cyB3aGlsZSBwYXJzaW5nIGJpdHN0cmVhbS4KKyAqIFxwYXJhbSBmR2xvYmFsSW5kZXBlbmRlbmN5RmxhZyBHbG9iYWwgaW5kZXBlbmRlbmN5IGZsYWcgb2YgY3VycmVudCBmcmFtZS4KKyAqCisgKiBccmV0dXJuICBFcnJvciBjb2RlLgorICovCitpbnQgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9QYXJzZU5vSGVhZGVyKAorICAgIENNcGVnU3Vycm91bmREZWNvZGVyICpwTXBlZ1N1cnJvdW5kRGVjb2RlciwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgIGludCAqcE1wc0RhdGFCaXRzLCBpbnQgZkdsb2JhbEluZGVwZW5kZW5jeUZsYWcpOworCisvKiAjaWZkZWYgU0FDREVDX01QU19FTkFCTEUgKi8KKy8qKgorICogXGJyaWVmIFBhcnNlIE1QRUcgU3Vycm91bmQgZGF0YSB3aXRoIGhlYWRlci4gSGVhZGVyIGlzIGFuY1R5cGUsIGFuY1N0YXJ0LAorIGFuY1N0b3AgKDQgYml0cyB0b3RhbCkuIEJvZHkgaXMgYW5jRGF0YVNlZ21lbnRCeXRlW2ldLgorICoKKyAqIFxwYXJhbSBwTXBlZ1N1cnJvdW5kRGVjb2RlciBBIE1QRUcgU3VycnJvdW5kIGRlY29kZXIgaGFuZGxlLgorICogXHBhcmFtIGhCcyAgICAgICAgICAgICAgICAgIEJpdCBzdHJlYW0gaGFuZGxlIGRhdGEgaW5wdXQgc291cmNlCisgKiBccGFyYW0gcE1wc0RhdGFCaXRzICAgICAgICAgUG9pbnRlciB0byBudW1iZXIgb2YgdmFsaWQgYml0cyBpbiBleHRlbnNpb24KKyBwYXlsb2FkLiBGdW5jdGlvbiB1cGRhdGVzIG1wc0RhdGFCaXRzIHdoaWxlIHBhcnNpbmcgYml0c3RyZWFtLiBOZWVkcyB0byBiZSBhCisgbXVsdGlwbGUgb2YgOCArIDQgKDQgYml0cyBoZWFkZXIpLgorICogXHBhcmFtIGNvcmVDb2RlYyAgICAgICAgICAgIFRoZSBhdWRpbyBvYmplY3QgdHlwZSBvZiB0aGUgY29yZSBjb2RlYyBoYW5kbGluZworIHRoZSBkb3dubWl4IGlucHV0IHNpZ25hbC4KKyAqIFxwYXJhbSBzYW1wbGVSYXRlICAgICAgICAgICBTYW1wbGVyYXRlIG9mIGlucHV0IGRvd25taXggZGF0YS4KKyAqIFxwYXJhbSBuQ2hhbm5lbHMgICAgICAgICAgICBBbW91bnQgb2YgaW5wdXQgY2hhbm5lbHMuCisgKiBccGFyYW0gZnJhbWVTaXplICAgICAgICAgICAgQW1vdW50IG9mIGlucHV0IHNhbXBsZXMuCisgKiBccGFyYW0gZkdsb2JhbEluZGVwZW5kZW5jeUZsYWcgR2xvYmFsIGluZGVwZW5kZW5jeSBmbGFnIG9mIGN1cnJlbnQgZnJhbWUuCisgKgorICogXHJldHVybiAgRXJyb3IgY29kZS4KKyAqLworaW50IG1wZWdTdXJyb3VuZERlY29kZXJfUGFyc2UoQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBpbnQgKnBNcHNEYXRhQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywgaW50IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVTaXplLCBpbnQgZkdsb2JhbEluZGVwZW5kZW5jeUZsYWcpOworLyogI2VuZGlmICovCisKKy8qKgorICogXGJyaWVmIEFwcGx5IE1QRUcgU3Vycm91bmQgdXBtaXguCisgKgorICogUHJvY2VzcyBvbmUgZG93bm1peCBhdWRpbyBmcmFtZSBhbmQgZGVjb2RlIG9uZSBzdXJyb3VuZCBmcmFtZSBpZiBpdCBhcHBsaWVzLgorICogRG93bm1peCBmcmFtaW5nIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBzdXJyb3VuZCBmcmFtaW5nLCBzbyBkZXBlbmRpbmcgb24gdGhlCisgKiBmcmFtZSBzaXplIG9mIHRoZSBkb3dubWl4IGF1ZGlvIGRhdGEgYW5kIHRoZSBmcmFtaW5nIGJlaW5nIHVzZWQgYnkgdGhlIE1QRUcKKyAqIFN1cnJvdW5kIGRlY29kZXIsIGl0IGNvdWxkIGJlIHRoYXQgb25seSBldmVyeSBzZWNvbmQgY2FsbCwgZm9yIGV4YW1wbGUsIG9mCisgKiB0aGlzIGZ1bmN0aW9uIGFjdHVhbGx5IHN1cnJvdW5kIGRhdGEgd2FzIGRlY29kZWQuIFRoZSByZXR1cm5lZCB2YWx1ZSBvZgorICogZnJhbWVTaXplIHdpbGwgYmUgemVybywgaWYgbm8gc3Vycm91bmQgZGF0YSB3YXMgZGVjb2RlZC4KKyAqCisgKiBEZWNvZGluZyBvbmUgTVBFRyBTdXJyb3VuZCBmcmFtZS4gRGVwZW5kaW5nIG9uIGludGVyZmFjZSBjb25maWd1cmF0aW9uCisgKiBtcGVnU3Vycm91bmREZWNvZGVyX1NldFBhcmFtKHNlbGYsIFNBQ0RFQ19JTlRFUkZBQ0UsIHZhbHVlKSwgdGhlIFFNRiBvciB0aW1lCisgKiBpbnRlcmZhY2Ugd2lsbCBiZSBhcHBsaWVkLiBFeHRlcm5hbCBhY2Nlc3MgdG8gUU1GIGJ1ZmZlciBpbnRlcmZhY2UgY2FuIGJlCisgKiBhY2hpZXZlZCBieSBtcGVnU3Vycm91bmREZWNvZGVyX0dldFFtZkJ1ZmZlcigpIGNhbGwgYmVmb3JlIGRlY29kZSBmcmFtZS4KKyAqIFdoaWxlIHVzaW5nIHRpbWUgaW50ZXJmYWNlLCBwVGltZURhdGEgYnVmZmVyIHdpbGwgYmUgc2hhcmVkIGFzIGlucHV0IGFuZAorICogb3V0cHV0IGJ1ZmZlci4KKyAqCisgKiBccGFyYW0gcE1wZWdTdXJyb3VuZERlY29kZXIgQSBNUEVHIFN1cnJyb3VuZCBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBwVGltZURhdGEgICAgICAgICAgICBQb2ludGVyIHRvIHRpbWUgYnVmZmVyLiBEZXBlbmRpbmcgb24gaW50ZXJmYWNlCisgKiBjb25maWd1cmF0aW9uLCB0aGUgY29udGVudCBvZiBwVGltZURhdGEgaXMgaWdub3JlZCwgYW5kIHRoZSBpbnRlcm5hbCBRTUYKKyAqIGJ1ZmZlciB3aWxsIGJlIHVzZWQgYXMgaW5wdXQgZGF0YSBzb3VyY2UuCisgKiBPdGhlcndpc2UsIHRoZSBNUEVHIFN1cnJvdW5kIHByb2Nlc3NpbmcgaXMgYXBwbGllZCB0byB0aGUgdGltZXNpZ25hbAorICogcFRpbWVEYXRhLiBGb3IgYm90aCB2YXJpYW50cywgdGhlIHJlc3VsdGluZyBNUEVHCisgKiBTdXJyb3VuZCBzaWduYWwgaXMgd3JpdHRlbiBpbnRvIHBUaW1lRGF0YS4KKyAqIFxwYXJhbSB0aW1lRGF0YVNpemUgICAgICAgICBTaXplIG9mIHBUaW1lRGF0YSAoYXZhaWxhYmxlIGJ1ZmZlciBzaXplKS4KKyAqIFxwYXJhbSB0aW1lRGF0YUZyYW1lU2l6ZSAgICBGcmFtZSBzaXplIG9mIGlucHV0IHRpbWVkYXRhCisgKiBccGFyYW0gbkNoYW5uZWxzICAgICAgICAgICAgUG9pbnRlciB3aGVyZSB0aGUgYW1vdW50IG9mIGlucHV0IGNoYW5uZWxzIGlzCisgKiBnaXZlbiBhbmQgYW1vdW50IG9mIG91dHB1dCBjaGFubmVscyBpcyByZXR1cm5lZC4KKyAqIFxwYXJhbSBmcmFtZVNpemUgICAgICAgICAgICBQb2ludGVyIHdoZXJlIHRoZSBhbW91bnQgb2Ygb3V0cHV0IHNhbXBsZXMgaXMKKyAqIHJldHVybmVkIGludG8uCisgKiBccGFyYW0gY2hhbm5lbFR5cGUgICAgICAgICAgQXJyYXkgd2VyZSB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgZm9yCisgKiBlYWNoIG91dHB1dCBhdWRpbyBjaGFubmVsIGlzIHN0b3JlZCBpbnRvLgorICogXHBhcmFtIGNoYW5uZWxJbmRpY2VzICAgICAgIEFycmF5IHdlcmUgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGluZGV4CisgKiBmb3IgZWFjaCBvdXRwdXQgYXVkaW8gY2hhbm5lbCBpcyBzdG9yZWQgaW50by4KKyAqIFxwYXJhbSBtYXBEZXNjciAgICAgICAgICAgICBDaGFubmVwIG1hcCBkZXNjcmlwdG9yIGZvciBvdXRwdXQgY2hhbm5lbCBtYXBwaW5nCisgKiB0byBiZSB1c2VkIChGcm9tIE1QRUcgUENFIG9yZGVyaW5nIHRvIHdoYXRldmVyIGlzIHJlcXVpcmVkKS4KKyAqCisgKiBccmV0dXJuICBFcnJvciBjb2RlLgorICovCitpbnQgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9BcHBseShDTXBlZ1N1cnJvdW5kRGVjb2RlciAqcE1wZWdTdXJyb3VuZERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICppbnB1dCwgUENNX01QUyAqcFRpbWVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbWVEYXRhU2l6ZSwgaW50IHRpbWVEYXRhRnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpuQ2hhbm5lbHMsIGludCAqZnJhbWVTaXplLCBpbnQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSBjaGFubmVsVHlwZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgY2hhbm5lbEluZGljZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZES19jaGFubmVsTWFwRGVzY3IgKmNvbnN0IG1hcERlc2NyKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgICAgICAgICAgIERlYWxsb2NhdGUgYSBNUEVHIFN1cnJvdW5kIGRlY29kZXIgaW5zdGFuY2UuCisgKiBccGFyYW0gcE1wZWdTdXJyb3VuZERlY29kZXIgIEEgZGVjb2RlciBoYW5kbGUuCisgKiBccmV0dXJuICAgICAgICAgICAgICAgICAgICAgIE5vIHJldHVybiB2YWx1ZS4KKyAqLwordm9pZCBtcGVnU3Vycm91bmREZWNvZGVyX0Nsb3NlKENNcGVnU3Vycm91bmREZWNvZGVyICpwTXBlZ1N1cnJvdW5kRGVjb2Rlcik7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgICAgICAgICAgICAgICBGcmVlIGNvbmZpZyBkZXBlbmRlbnQgTVBFRyBTdXJyb3VuZCBtZW1vcnkuCisgKiBccGFyYW0gcE1wZWdTdXJyb3VuZERlY29kZXIgIEEgZGVjb2RlciBoYW5kbGUuCisgKiBccmV0dXJuICAgICAgICAgICAgICAgICAgICAgIGVycm9yLgorICovCitTQUNERUNfRVJST1IgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9GcmVlTWVtKAorICAgIENNcGVnU3Vycm91bmREZWNvZGVyICpwTXBlZ1N1cnJvdW5kRGVjb2Rlcik7CisKKy8qKgorICogXGJyaWVmICBTZXQgb25lIHNpbmdsZSBNUEVHIFN1cnJvdW5kIGRlY29kZXIgcGFyYW1ldGVyLgorICoKKyAqIFxwYXJhbSBwTXBlZ1N1cnJvdW5kRGVjb2RlciAgQSBNUEVHIFN1cnJyb3VuZCBkZWNvZGVyIGhhbmRsZS4gTXVzdCBub3QgYmUKKyAqIE5VTEwgcG9pbnRlci4KKyAqIFxwYXJhbSBwYXJhbSAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHRvIGJlIHNldC4gU2VlIFNBQ0RFQ19QQVJBTS4KKyAqIFxwYXJhbSB2YWx1ZSAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHZhbHVlLiBTZWUgU0FDREVDX1BBUkFNLgorICoKKyAqIFxyZXR1cm4gIDAgb24gc3VjZXNzLCBhbmQgbm9uLXplcm8gb24gZmFpbHVyZS4KKyAqLworU0FDREVDX0VSUk9SIG1wZWdTdXJyb3VuZERlY29kZXJfU2V0UGFyYW0oCisgICAgQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyLCBjb25zdCBTQUNERUNfUEFSQU0gcGFyYW0sCisgICAgY29uc3QgSU5UIHZhbHVlKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgUmV0cmlldmUgTVBFRyBTdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgaW5mbyBhbmQgZmlsbCBpbmZvIGxpc3Qgd2l0aCBhbGwgZGVwZW5kaW5nIGxpYnJhcnkgaW5mb3MuCisgKiBccGFyYW0gbGliSW5mbyAgUG9pbnRlciB0byBsaWJyYXJ5IGluZm8gbGlzdCB0byBiZSBmaWxsZWQuCisgKiBccmV0dXJuICAgICAgICAgMCBvbiBzdWNlc3MsIGFuZCBub24temVybyBvbiBmYWlsdXJlLgorICoqLworaW50IG1wZWdTdXJyb3VuZERlY29kZXJfR2V0TGliSW5mbyhMSUJfSU5GTyAqbGliSW5mbyk7CisKKy8qKgorICogXGJyaWVmICBTZXQgb25lIHNpbmdsZSBNUEVHIFN1cnJvdW5kIGRlY29kZXIgcGFyYW1ldGVyLgorICoKKyAqIFxwYXJhbSBwTXBlZ1N1cnJvdW5kRGVjb2RlciAgQSB2YWxpZCBNUEVHIFN1cnJyb3VuZCBkZWNvZGVyIGhhbmRsZS4KKyAqCisgKiBccmV0dXJuICBUaGUgYWRkaXRpb25hbCBzaWduYWwgZGVsYXkgY2F1c2VkIGJ5IHRoZSBtb2R1bGUuCisgKi8KK1VJTlQgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9HZXREZWxheShjb25zdCBDTXBlZ1N1cnJvdW5kRGVjb2RlciAqc2VsZik7CisKKy8qKgorICogXGJyaWVmICBHZXQgaW5mbyBvbiB3aGV0aGVyIHRoZSBVU0FDIHBzZXVkbyBMUiBmZWF0dXJlIGlzIGFjdGl2ZS4KKyAqCisgKiBccGFyYW0gcE1wZWdTdXJyb3VuZERlY29kZXIgIEEgdmFsaWQgTVBFRyBTdXJycm91bmQgZGVjb2RlciBoYW5kbGUuCisgKiBccGFyYW0gYnNQc2V1ZG9MciAgICAgICAgICAgIFBvaW50ZXIgdG8gcmV0dXJuIHdldGhlciBwc2V1ZG8gTFIgVVNBQyBmZWF0dXJlCisgKiBpcyB1c2VkLgorICoKKyAqIFxyZXR1cm4gIDAgb24gc3VjZXNzLCBhbmQgbm9uLXplcm8gb24gZmFpbHVyZS4KKyAqLworU0FDREVDX0VSUk9SIG1wZWdTdXJyb3VuZERlY29kZXJfSXNQc2V1ZG9MUigKKyAgICBDTXBlZ1N1cnJvdW5kRGVjb2RlciAqcE1wZWdTdXJyb3VuZERlY29kZXIsIGludCAqYnNQc2V1ZG9Mcik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiAjaWZuZGVmIFNBQ19ERUNfTElCX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2RlYy9zcmMvc2FjX2JpdGRlYy5jcHAgYi9saWJTQUNkZWMvc3JjL3NhY19iaXRkZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZTBjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY19iaXRkZWMuY3BwCkBAIC0wLDAgKzEsMjE0NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBTQUMgRGVjIGJpdHN0cmVhbSBkZWNvZGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJzYWNfYml0ZGVjLmgiCisKKyNpbmNsdWRlICJzYWNfZGVjX2Vycm9yY29kZXMuaCIKKyNpbmNsdWRlICJubGNfZGVjLmgiCisjaW5jbHVkZSAic2FjX3JvbS5oIgorI2luY2x1ZGUgIkZES19tYXRyaXhDYWxsb2MuaCIKKyNpbmNsdWRlICJzYWNfdHNkLmgiCisKK2VudW0geworICBvdHRWc1RvdEluYWN0aXYgPSAwLAorICBvdHRWc1RvdERiMUFjdGl2ID0gMSwKKyAgb3R0VnNUb3REYjJBY3RpdiA9IDIsCisgIG90dFZzVG90RGIxRGIyQWN0aXYgPSAzCit9OworCitzdGF0aWMgU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNEZWNvZGVIZWxwZXJJbmZvKAorICAgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3BhdGlhbFNwZWNpZmljQ29uZmlnLCBVUE1JWFRZUEUgdXBtaXhUeXBlKSB7CisgIGludCBpOworICBVSU5UIHN5bnRheEZsYWdzOworCisgIC8qIERldGVybWluZSBiaXQgc3RyZWFtIHN5bnRheCAqLworICBzeW50YXhGbGFncyA9IDA7CisgIHN3aXRjaCAocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+Y29yZUNvZGVjKSB7CisgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKKyAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgICBzeW50YXhGbGFncyB8PSBTQUNERUNfU1lOVEFYX0xEOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBT1RfVVNBQzoKKyAgICAgIHN5bnRheEZsYWdzIHw9IFNBQ0RFQ19TWU5UQVhfVVNBQzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQU9UX05PTkU6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBNUFNfVU5TVVBQT1JURURfRk9STUFUOworICB9CisKKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+c3ludGF4RmxhZ3MgPSBzeW50YXhGbGFnczsKKworICBzd2l0Y2ggKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnRyZWVDb25maWcpIHsKKyAgICBjYXNlIFRSRUVfMjEyOiB7CisgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5vdHRDTERkZWZhdWx0WzBdID0gMDsKKyAgICB9IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTVBTX0lOVkFMSURfVFJFRUNPTkZJRzsKKyAgfQorCisgIGlmIChzeW50YXhGbGFncyAmIFNBQ0RFQ19TWU5UQVhfVVNBQykgeworICAgIGlmIChwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic090dEJhbmRzUGhhc2VQcmVzZW50KSB7CisgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5udW1PdHRCYW5kc0lQRCA9CisgICAgICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNPdHRCYW5kc1BoYXNlOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgbnVtUGFyYW1ldGVyQmFuZHM7CisKKyAgICAgIG51bVBhcmFtZXRlckJhbmRzID0gcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+ZnJlcVJlczsKKyAgICAgIHN3aXRjaCAobnVtUGFyYW1ldGVyQmFuZHMpIHsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICBjYXNlIDU6CisgICAgICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bnVtT3R0QmFuZHNJUEQgPSAyOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bnVtT3R0QmFuZHNJUEQgPSAzOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOgorICAgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm51bU90dEJhbmRzSVBEID0gNTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5udW1PdHRCYW5kc0lQRCA9IDc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjA6CisgICAgICAgIGNhc2UgMjg6CisgICAgICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bnVtT3R0QmFuZHNJUEQgPSAxMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gTVBTX0lOVkFMSURfUEFSQU1FVEVSQkFORFM7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm51bU90dEJhbmRzSVBEID0gMDsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bk90dEJveGVzOyBpKyspIHsKKyAgICB7CisgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5iaXRzdHJlYW1PdHRCYW5kc1tpXSA9CisgICAgICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+ZnJlcVJlczsKKyAgICB9CisgICAgeworICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bnVtT3R0QmFuZHNbaV0gPQorICAgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJpdHN0cmVhbU90dEJhbmRzW2ldOworICAgICAgaWYgKHN5bnRheEZsYWdzICYgU0FDREVDX1NZTlRBWF9VU0FDICYmCisgICAgICAgICAgIXBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJzT3R0QmFuZHNQaGFzZVByZXNlbnQpIHsKKyAgICAgICAgaWYgKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJSZXNpZHVhbENvZGluZyAmJgorICAgICAgICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+UmVzaWR1YWxDb25maWdbaV0uYlJlc2lkdWFsUHJlc2VudCAmJgorICAgICAgICAgICAgKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm51bU90dEJhbmRzSVBEIDwKKyAgICAgICAgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5SZXNpZHVhbENvbmZpZ1tpXS5uUmVzaWR1YWxCYW5kcykpIHsKKyAgICAgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5udW1PdHRCYW5kc0lQRCA9CisgICAgICAgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPlJlc2lkdWFsQ29uZmlnW2ldLm5SZXNpZHVhbEJhbmRzOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IC8qIGkgKi8KKworICByZXR1cm4gTVBTX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogU3BhdGlhbERlY1BhcnNlRXh0ZW5zaW9uQ29uZmlnCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6CisKKyBSZXR1cm46CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBTQUNERUNfRVJST1IgU3BhdGlhbERlY1BhcnNlRXh0ZW5zaW9uQ29uZmlnKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJpdHN0cmVhbSwgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKmNvbmZpZywKKyAgICBpbnQgbnVtT3R0Qm94ZXMsIGludCBudW1UdHRCb3hlcywgaW50IG51bU91dENoYW4sIGludCBiaXRzQXZhaWxhYmxlKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIElOVCBiYSA9IGJpdHNBdmFpbGFibGU7CisKKyAgY29uZmlnLT5zYWNFeHRDbnQgPSAwOworICBjb25maWctPmJSZXNpZHVhbENvZGluZyA9IDA7CisKKyAgYmEgPSBmTWluKChpbnQpRkRLZ2V0VmFsaWRCaXRzKGJpdHN0cmVhbSksIGJhKTsKKworICB3aGlsZSAoKGJhID49IDgpICYmIChjb25maWctPnNhY0V4dENudCA8IE1BWF9OVU1fRVhUX1RZUEVTKSkgeworICAgIGludCBiaXRzUmVhZCwgbkZpbGxCaXRzOworICAgIElOVCB0bXA7CisgICAgVUlOVCBzYWNFeHRMZW47CisKKyAgICBjb25maWctPnNhY0V4dFR5cGVbY29uZmlnLT5zYWNFeHRDbnRdID0gRkRLcmVhZEJpdHMoYml0c3RyZWFtLCA0KTsKKyAgICBiYSAtPSA0OworCisgICAgc2FjRXh0TGVuID0gRkRLcmVhZEJpdHMoYml0c3RyZWFtLCA0KTsKKyAgICBiYSAtPSA0OworCisgICAgaWYgKHNhY0V4dExlbiA9PSAxNSkgeworICAgICAgc2FjRXh0TGVuICs9IEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgOCk7CisgICAgICBiYSAtPSA4OworICAgICAgaWYgKHNhY0V4dExlbiA9PSAxNSArIDI1NSkgeworICAgICAgICBzYWNFeHRMZW4gKz0gRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAxNik7CisgICAgICAgIGJhIC09IDE2OworICAgICAgfQorICAgIH0KKworICAgIHRtcCA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKAorICAgICAgICBiaXRzdHJlYW0pOyAvKiBFeHRlbnNpb24gY29uZmlnIHBheWxvYWQgc3RhcnQgYW5jaG9yLiAqLworICAgIGlmICgodG1wIDw9IDApIHx8ICh0bXAgPCAoSU5UKXNhY0V4dExlbiAqIDgpIHx8IChiYSA8IChJTlQpc2FjRXh0TGVuICogOCkpIHsKKyAgICAgIGVyciA9IE1QU19QQVJTRV9FUlJPUjsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNvbmZpZy0+c2FjRXh0VHlwZVtjb25maWctPnNhY0V4dENudF0pIHsKKyAgICAgIGRlZmF1bHQ6OyAvKiB1bmtub3duIGV4dGVuc2lvbiBkYXRhID0+IGRvIG5vdGhpbmcgKi8KKyAgICB9CisKKyAgICAvKiBza2lwIHJlbWFpbmluZyBleHRlbnNpb24gZGF0YSAqLworICAgIGJpdHNSZWFkID0gdG1wIC0gRkRLZ2V0VmFsaWRCaXRzKGJpdHN0cmVhbSk7CisgICAgbkZpbGxCaXRzID0gOCAqIHNhY0V4dExlbiAtIGJpdHNSZWFkOworCisgICAgaWYgKG5GaWxsQml0cyA8IDApIHsKKyAgICAgIGVyciA9IE1QU19QQVJTRV9FUlJPUjsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9IGVsc2UgeworICAgICAgLyogU2tpcCBmaWxsIGJpdHMgb3IgYW4gdW5rb3duIGV4dGVuc2lvbi4gKi8KKyAgICAgIEZES3B1c2hGb3IoYml0c3RyZWFtLCBuRmlsbEJpdHMpOworICAgIH0KKworICAgIGJhIC09IDggKiBzYWNFeHRMZW47CisgICAgY29uZmlnLT5zYWNFeHRDbnQrKzsKKyAgfQorCitiYWlsOgorICByZXR1cm4gZXJyOworfQorCitTQUNERUNfRVJST1IgU3BhdGlhbERlY1BhcnNlU3BlY2lmaWNDb25maWdIZWFkZXIoCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYml0c3RyZWFtLAorICAgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3BhdGlhbFNwZWNpZmljQ29uZmlnLAorICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywgU1BBVElBTF9ERUNfVVBNSVhfVFlQRSB1cG1peFR5cGUpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKyAgSU5UIG51bUZpbGxCaXRzOworICBpbnQgc2FjSGVhZGVyTGVuID0gMDsKKyAgaW50IHNhY1RpbWVBbGlnbkZsYWcgPSAwOworCisgIHNhY1RpbWVBbGlnbkZsYWcgPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDEpOworICBzYWNIZWFkZXJMZW4gPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDcpOworCisgIGlmIChzYWNIZWFkZXJMZW4gPT0gMTI3KSB7CisgICAgc2FjSGVhZGVyTGVuICs9IEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMTYpOworICB9CisgIG51bUZpbGxCaXRzID0gRkRLZ2V0VmFsaWRCaXRzKGJpdHN0cmVhbSk7CisKKyAgZXJyID0gU3BhdGlhbERlY1BhcnNlU3BlY2lmaWNDb25maWcoYml0c3RyZWFtLCBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWNIZWFkZXJMZW4sIGNvcmVDb2RlYyk7CisKKyAgbnVtRmlsbEJpdHMgLT0KKyAgICAgIEZES2dldFZhbGlkQml0cyhiaXRzdHJlYW0pOyAvKiB0aGUgbnVtYmVyIG9mIHJlYWQgYml0cyAodG1wQml0cykgKi8KKyAgbnVtRmlsbEJpdHMgPSAoOCAqIHNhY0hlYWRlckxlbikgLSBudW1GaWxsQml0czsKKyAgaWYgKG51bUZpbGxCaXRzIDwgMCkgeworICAgIC8qIFBhcnNpbmcgd2VudCB3cm9uZyAqLworICAgIGVyciA9IE1QU19QQVJTRV9FUlJPUjsKKyAgfQorICAvKiBNb3ZlIHRvIHRoZSB2ZXJ5IGVuZCBvZiB0aGUgU1NDICovCisgIEZES3B1c2hCaURpcmVjdGlvbmFsKGJpdHN0cmVhbSwgbnVtRmlsbEJpdHMpOworCisgIGlmICgoZXJyID09IE1QU19PSykgJiYgc2FjVGltZUFsaWduRmxhZykgeworICAgIC8qIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDE2KTsKKyAgICBlcnIgPSBNUFNfVU5TVVBQT1JURURfQ09ORklHOworICB9CisKKyAgLyogRGVyaXZlIGFkZGl0aW9uYWwgaGVscGVyIHZhcmlhYmxlcyAqLworICBTcGF0aWFsRGVjRGVjb2RlSGVscGVySW5mbyhwU3BhdGlhbFNwZWNpZmljQ29uZmlnLCAoVVBNSVhUWVBFKXVwbWl4VHlwZSk7CisKKyAgcmV0dXJuIGVycjsKK30KKworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNQYXJzZU1wczIxMkNvbmZpZygKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBiaXRzdHJlYW0sCisgICAgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnBTcGF0aWFsU3BlY2lmaWNDb25maWcsIGludCBzYW1wbGluZ1JhdGUsCisgICAgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLCBJTlQgc3RlcmVvQ29uZmlnSW5kZXgsCisgICAgSU5UIGNvcmVTYnJGcmFtZUxlbmd0aEluZGV4KSB7CisgIGludCBpOworCisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnN0ZXJlb0NvbmZpZ0luZGV4ID0gc3RlcmVvQ29uZmlnSW5kZXg7CisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmNvcmVTYnJGcmFtZUxlbmd0aEluZGV4ID0gY29yZVNickZyYW1lTGVuZ3RoSW5kZXg7CisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmZyZXFSZXMgPQorICAgICAgKFNQQVRJQUxERUNfRlJFUV9SRVMpZnJlcVJlc1RhYmxlW0ZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMyldOworICBpZiAocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+ZnJlcVJlcyA9PSAwKSB7CisgICAgcmV0dXJuIE1QU19QQVJTRV9FUlJPUjsgLyogcmVzZXJ2ZWQgdmFsdWUgKi8KKyAgfQorCisgIHN3aXRjaCAoY29yZUNvZGVjKSB7CisgICAgY2FzZSBBT1RfRFJNX1VTQUM6CisgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic0ZpeGVkR2FpbkRNWCA9CisgICAgICAgICAgKFNQQVRJQUxERUNfRklYRURfR0FJTlMpRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAzKTsKKyAgICAgIC8qIHRlbXBTaGFwZUNvbmZpZyA9IChic1RlbXBTaGFwZUNvbmZpZ0RybSA9PSAxKSA/IDMgOiAwICovCisgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50ZW1wU2hhcGVDb25maWcgPQorICAgICAgICAgIChTUEFUSUFMREVDX1RTX0NPTkYpKEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMSkgKiAzKTsKKyAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmRlY29yckNvbmZpZyA9IChTUEFUSUFMREVDX0RFQ09SUl9DT05GKTA7CisgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic0RlY29yclR5cGUgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBT1RfVVNBQzoKKyAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJzRml4ZWRHYWluRE1YID0KKyAgICAgICAgICAoU1BBVElBTERFQ19GSVhFRF9HQUlOUylGREtyZWFkQml0cyhiaXRzdHJlYW0sIDMpOworICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dGVtcFNoYXBlQ29uZmlnID0KKyAgICAgICAgICAoU1BBVElBTERFQ19UU19DT05GKUZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMik7CisgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5kZWNvcnJDb25maWcgPQorICAgICAgICAgIChTUEFUSUFMREVDX0RFQ09SUl9DT05GKUZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMik7CisgICAgICBpZiAocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+ZGVjb3JyQ29uZmlnID4gMikgeworICAgICAgICByZXR1cm4gTVBTX1BBUlNFX0VSUk9SOyAvKiByZXNlcnZlZCB2YWx1ZSAqLworICAgICAgfQorICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNEZWNvcnJUeXBlID0gMDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTVBTX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgfQorICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uVGltZVNsb3RzID0gKGNvcmVTYnJGcmFtZUxlbmd0aEluZGV4ID09IDQpID8gNjQgOiAzMjsKKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNIaWdoUmF0ZU1vZGUgPSAoVUNIQVIpRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAxKTsKKworICB7CisgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNQaGFzZUNvZGluZyA9IChVQ0hBUilGREtyZWFkQml0cyhiaXRzdHJlYW0sIDEpOworICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJzT3R0QmFuZHNQaGFzZVByZXNlbnQgPQorICAgICAgICAoVUNIQVIpRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAxKTsKKyAgICBpZiAocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNPdHRCYW5kc1BoYXNlUHJlc2VudCkgeworICAgICAgaWYgKE1BWF9QQVJBTUVURVJfQkFORFMgPCAocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNPdHRCYW5kc1BoYXNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDUpKSkgeworICAgICAgICByZXR1cm4gTVBTX1BBUlNFX0VSUk9SOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic090dEJhbmRzUGhhc2UgPSAwOworICAgIH0KKyAgfQorCisgIGlmIChzdGVyZW9Db25maWdJbmRleCA+IDEpIHsgLyogZG8gcmVzaWR1YWwgY29kaW5nICovCisgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YlJlc2lkdWFsQ29kaW5nID0gMTsKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5SZXNpZHVhbENvbmZpZy0+YlJlc2lkdWFsUHJlc2VudCA9IDE7CisgICAgaWYgKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmZyZXFSZXMgPAorICAgICAgICAocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+UmVzaWR1YWxDb25maWctPm5SZXNpZHVhbEJhbmRzID0KKyAgICAgICAgICAgICBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDUpKSkgeworICAgICAgcmV0dXJuIE1QU19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNPdHRCYW5kc1BoYXNlID0KKyAgICAgICAgZk1heChwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic090dEJhbmRzUGhhc2UsCisgICAgICAgICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+UmVzaWR1YWxDb25maWctPm5SZXNpZHVhbEJhbmRzKTsKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic1BzZXVkb0xyID0gKFVDSEFSKUZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMSk7CisKKyAgICBpZiAocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNQaGFzZUNvZGluZykgeworICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNQaGFzZUNvZGluZyA9IDM7CisgICAgfQorICB9IGVsc2UgeworICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJSZXNpZHVhbENvZGluZyA9IDA7CisgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+UmVzaWR1YWxDb25maWctPmJSZXNpZHVhbFByZXNlbnQgPSAwOworICB9CisKKyAgaWYgKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnRlbXBTaGFwZUNvbmZpZyA9PSAyKSB7CisgICAgc3dpdGNoIChjb3JlQ29kZWMpIHsKKyAgICAgIGNhc2UgQU9UX1VTQUM6CisgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmVudlF1YW50TW9kZSA9IEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogLyogYWRkZWQgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZyAqLworICAgICAgICBicmVhazsgLyogYWRkZWQgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZyAqLworICAgIH0KKyAgfQorCisgIC8qIFN0YXRpYyBwYXJhbWV0ZXJzICovCisKKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+c2FtcGxpbmdGcmVxID0KKyAgICAgIHNhbXBsaW5nUmF0ZTsgLyogd3JvbmcgZm9yIHN0ZXJlb0NvbmZpZ0luZGV4ID09IDMgYnV0IHZhbHVlIGlzIHVudXNlZCAqLworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50cmVlQ29uZmlnID0gU1BBVElBTERFQ19NT0RFX1JTVkQ3OworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uT3R0Qm94ZXMgPQorICAgICAgdHJlZVByb3BlcnR5VGFibGVbcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dHJlZUNvbmZpZ10ubnVtT3R0Qm94ZXM7CisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5JbnB1dENoYW5uZWxzID0KKyAgICAgIHRyZWVQcm9wZXJ0eVRhYmxlW3BTcGF0aWFsU3BlY2lmaWNDb25maWctPnRyZWVDb25maWddLm51bUlucHV0Q2hhbm5lbHM7CisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5PdXRwdXRDaGFubmVscyA9CisgICAgICB0cmVlUHJvcGVydHlUYWJsZVtwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50cmVlQ29uZmlnXS5udW1PdXRwdXRDaGFubmVsczsKKworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5iQXJiaXRyYXJ5RG93bm1peCA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5PdHRCb3hlczsgaSsrKSB7CisgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+T3R0Q29uZmlnW2ldLm5PdHRCYW5kcyA9IDA7CisgIH0KKworICBpZiAoY29yZUNvZGVjID09IEFPVF9EUk1fVVNBQykgeworICAgIC8qIE1QUyBwYXlsb2FkIGlzIE1QRUcgY29uZm9ybSAtPiBubyBuZWVkIGZvciBwc2V1ZG8gRFJNIEFPVCAqLworICAgIGNvcmVDb2RlYyA9IEFPVF9VU0FDOworICB9CisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmNvcmVDb2RlYyA9IGNvcmVDb2RlYzsKKworICAvKiBEZXJpdmUgYWRkaXRpb25hbCBoZWxwZXIgdmFyaWFibGVzICovCisgIFNwYXRpYWxEZWNEZWNvZGVIZWxwZXJJbmZvKHBTcGF0aWFsU3BlY2lmaWNDb25maWcsIFVQTUlYVFlQRV9OT1JNQUwpOworCisgIHJldHVybiBNUFNfT0s7Cit9CisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjUGFyc2VTcGVjaWZpY0NvbmZpZygKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBiaXRzdHJlYW0sCisgICAgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnBTcGF0aWFsU3BlY2lmaWNDb25maWcsIGludCBzYWNIZWFkZXJMZW4sCisgICAgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIGludCBpOworICBpbnQgYnNTYW1wbGluZ0ZyZXFJbmRleDsKKyAgaW50IGJzRnJlcVJlcywgYjNEYXVkaW9Nb2RlID0gMDsKKyAgaW50IG51bUhlYWRlckJpdHM7CisgIGludCBjZmdTdGFydFBvcywgYml0c0F2YWlsYWJsZTsKKworICBjZmdTdGFydFBvcyA9IEZES2dldFZhbGlkQml0cyhiaXRzdHJlYW0pOworICAvKiBJdCBtaWdodCBiZSB0aGF0IHdlIGRvIG5vdCBrbm93IHRoZSBTU0MgbGVuZ3RoIGJlZm9yZWhhbmQuICovCisgIGlmIChzYWNIZWFkZXJMZW4gPT0gMCkgeworICAgIGJpdHNBdmFpbGFibGUgPSBjZmdTdGFydFBvczsKKyAgfSBlbHNlIHsKKyAgICBiaXRzQXZhaWxhYmxlID0gOCAqIHNhY0hlYWRlckxlbjsKKyAgICBpZiAoYml0c0F2YWlsYWJsZSA+IGNmZ1N0YXJ0UG9zKSB7CisgICAgICBlcnIgPSBNUFNfUEFSU0VfRVJST1I7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICB9CisKKyAgYnNTYW1wbGluZ0ZyZXFJbmRleCA9IEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgNCk7CisKKyAgaWYgKGJzU2FtcGxpbmdGcmVxSW5kZXggPT0gMTUpIHsKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5zYW1wbGluZ0ZyZXEgPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDI0KTsKKyAgfSBlbHNlIHsKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5zYW1wbGluZ0ZyZXEgPQorICAgICAgICBzYW1wbGluZ0ZyZXFUYWJsZVtic1NhbXBsaW5nRnJlcUluZGV4XTsKKyAgICBpZiAocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+c2FtcGxpbmdGcmVxID09IDApIHsKKyAgICAgIGVyciA9IE1QU19QQVJTRV9FUlJPUjsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgIH0KKworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uVGltZVNsb3RzID0gRkRLcmVhZEJpdHMoYml0c3RyZWFtLCA1KSArIDE7CisgIGlmICgocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+blRpbWVTbG90cyA8IDEpIHx8CisgICAgICAocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+blRpbWVTbG90cyA+IE1BWF9USU1FX1NMT1RTKSkgeworICAgIGVyciA9IE1QU19QQVJTRV9FUlJPUjsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICBic0ZyZXFSZXMgPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDMpOworCisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmZyZXFSZXMgPQorICAgICAgKFNQQVRJQUxERUNfRlJFUV9SRVMpZnJlcVJlc1RhYmxlX0xEW2JzRnJlcVJlc107CisKKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dHJlZUNvbmZpZyA9CisgICAgICAoU1BBVElBTERFQ19UUkVFX0NPTkZJRylGREtyZWFkQml0cyhiaXRzdHJlYW0sIDQpOworCisgIGlmIChwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50cmVlQ29uZmlnICE9IFNQQVRJQUxERUNfTU9ERV9SU1ZENykgeworICAgIGVyciA9IE1QU19VTlNVUFBPUlRFRF9DT05GSUc7CisgICAgZ290byBiYWlsOworICB9CisKKyAgeworICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5PdHRCb3hlcyA9CisgICAgICAgIHRyZWVQcm9wZXJ0eVRhYmxlW3BTcGF0aWFsU3BlY2lmaWNDb25maWctPnRyZWVDb25maWddLm51bU90dEJveGVzOworICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5UdHRCb3hlcyA9CisgICAgICAgIHRyZWVQcm9wZXJ0eVRhYmxlW3BTcGF0aWFsU3BlY2lmaWNDb25maWctPnRyZWVDb25maWddLm51bVR0dEJveGVzOworICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5JbnB1dENoYW5uZWxzID0KKyAgICAgICAgdHJlZVByb3BlcnR5VGFibGVbcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dHJlZUNvbmZpZ10ubnVtSW5wdXRDaGFubmVsczsKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uT3V0cHV0Q2hhbm5lbHMgPQorICAgICAgICB0cmVlUHJvcGVydHlUYWJsZVtwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50cmVlQ29uZmlnXS5udW1PdXRwdXRDaGFubmVsczsKKyAgfQorCisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnF1YW50TW9kZSA9CisgICAgICAoU1BBVElBTERFQ19RVUFOVF9NT0RFKUZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMik7CisKKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YkFyYml0cmFyeURvd25taXggPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDEpOworCisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJzRml4ZWRHYWluRE1YID0KKyAgICAgIChTUEFUSUFMREVDX0ZJWEVEX0dBSU5TKUZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMyk7CisKKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dGVtcFNoYXBlQ29uZmlnID0KKyAgICAgIChTUEFUSUFMREVDX1RTX0NPTkYpRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAyKTsKKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+ZGVjb3JyQ29uZmlnID0KKyAgICAgIChTUEFUSUFMREVDX0RFQ09SUl9DT05GKUZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMik7CisgIGlmIChwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5kZWNvcnJDb25maWcgPiAyKSB7CisgICAgcmV0dXJuIE1QU19QQVJTRV9FUlJPUjsgLyogcmVzZXJ2ZWQgdmFsdWUgKi8KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uT3R0Qm94ZXM7IGkrKykgeworICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPk90dENvbmZpZ1tpXS5uT3R0QmFuZHMgPSAwOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5UdHRCb3hlczsgaSsrKSB7CisgICAgaW50IGJUdHREdWFsTW9kZSA9IEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMSk7CisgICAgRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAzKTsgLyogbm90IHN1cHBvcnRlZCAqLworCisgICAgaWYgKGJUdHREdWFsTW9kZSkgeworICAgICAgRkRLcmVhZEJpdHMoYml0c3RyZWFtLCA4KTsgLyogbm90IHN1cHBvcnRlZCAqLworICAgIH0KKyAgfQorCisgIGlmIChwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50ZW1wU2hhcGVDb25maWcgPT0gMikgeworICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmVudlF1YW50TW9kZSA9IEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMSk7CisgIH0KKworICBpZiAoYjNEYXVkaW9Nb2RlKSB7CisgICAgaWYgKEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMikgPT0gMCkgeyAvKiBiM0RhdWRpb0hSVEZzZXQgPyAqLworICAgICAgaW50IGhjOworICAgICAgaW50IEhSVEZudW1CYW5kOworICAgICAgaW50IEhSVEZmcmVxUmVzID0gRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAzKTsKKyAgICAgIGludCBIUlRGbnVtQ2hhbiA9IEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgNCk7CisgICAgICBpbnQgSFJURmFzeW1tZXRyaWMgPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDEpOworCisgICAgICBIUlRGbnVtQmFuZCA9IGZyZXFSZXNUYWJsZV9MRFtIUlRGZnJlcVJlc107CisKKyAgICAgIGZvciAoaGMgPSAwOyBoYyA8IEhSVEZudW1DaGFuOyBoYysrKSB7CisgICAgICAgIEZES3B1c2hGb3IoYml0c3RyZWFtLCBIUlRGbnVtQmFuZCAqIDYpOyAvKiBIUlRGbGV2ZWxMZWZ0W2hjXVtoYl0gKi8KKyAgICAgICAgaWYgKEhSVEZhc3ltbWV0cmljKSB7CisgICAgICAgICAgRkRLcHVzaEZvcihiaXRzdHJlYW0sIEhSVEZudW1CYW5kICogNik7IC8qIEhSVEZsZXZlbFJpZ2h0W2hjXVtoYl0gKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAxKSkgeyAgICAgICAgICAvKiBIUlRGcGhhc2VbaGNdID8gKi8KKyAgICAgICAgICBGREtwdXNoRm9yKGJpdHN0cmVhbSwgSFJURm51bUJhbmQgKiA2KTsgLyogSFJURnBoYXNlTFJbaGNdW2hiXSAqLworICAgICAgICB9CisgICAgICAgIGlmIChGREtyZWFkQml0cyhiaXRzdHJlYW0sIDEpKSB7ICAgICAgICAgIC8qIEhSVEZpY2NbaGNdID8gKi8KKyAgICAgICAgICBGREtwdXNoRm9yKGJpdHN0cmVhbSwgSFJURm51bUJhbmQgKiA2KTsgLyogSFJURmljY0xSW2hjXVtoYl0gKi8KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIEZES2J5dGVBbGlnbihiaXRzdHJlYW0sCisgICAgICAgICAgICAgICBjZmdTdGFydFBvcyk7IC8qIElTTy9JRUMgRkRJUyAyMzAwMy0xOiA1LjIuIC4uLiBieXRlIGFsaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHJlc3BlY3QgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3ludGFjdGljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgaW4gd2hpY2ggQnl0ZUFsaWduKCkgb2NjdXJzLiAqLworCisgIG51bUhlYWRlckJpdHMgPSBjZmdTdGFydFBvcyAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJpdHN0cmVhbSk7CisgIGJpdHNBdmFpbGFibGUgLT0gbnVtSGVhZGVyQml0czsKKworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5zYWNFeHRDbnQgPSAwOworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5iUmVzaWR1YWxDb2RpbmcgPSAwOworCisgIGlmICgoZXJyID09IE1QU19PSykgJiYgKGJpdHNBdmFpbGFibGUgPiAwKSkgeworICAgIGVyciA9IFNwYXRpYWxEZWNQYXJzZUV4dGVuc2lvbkNvbmZpZygKKyAgICAgICAgYml0c3RyZWFtLCBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLCBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uT3R0Qm94ZXMsCisgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5UdHRCb3hlcywKKyAgICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bk91dHB1dENoYW5uZWxzLCBiaXRzQXZhaWxhYmxlKTsKKyAgfQorCisgIEZES2J5dGVBbGlnbigKKyAgICAgIGJpdHN0cmVhbSwKKyAgICAgIGNmZ1N0YXJ0UG9zKTsgLyogU2FtZSBhbGlnbm1lbnQgYW5jaG9yIGFzIGFib3ZlIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgU3BhdGlhbEV4dGVuc2lvbkNvbmZpZygpIGFsd2F5cyByZWFkcyBmdWxsIGJ5dGVzICovCisKKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+Y29yZUNvZGVjID0gY29yZUNvZGVjOworCisgIFNwYXRpYWxEZWNEZWNvZGVIZWxwZXJJbmZvKHBTcGF0aWFsU3BlY2lmaWNDb25maWcsIFVQTUlYVFlQRV9OT1JNQUwpOworCitiYWlsOgorICBpZiAoc2FjSGVhZGVyTGVuID4gMCkgeworICAgIC8qIElmIHRoZSBjb25maWcgaXMgb2Yga25vd24gbGVuZ3RoIHRoZW4gYXNzdXJlIHRoYXQgdGhlCisgICAgICAgYml0YnVmZmVyIGlzIGV4YWN0bHkgYXQgaXRzIGVuZCB3aGVuIGxlYXZpbmcgdGhlIGZ1bmN0aW9uLiAqLworICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKAorICAgICAgICBiaXRzdHJlYW0sCisgICAgICAgIChzYWNIZWFkZXJMZW4gKiA4KSAtIChjZmdTdGFydFBvcyAtIChJTlQpRkRLZ2V0VmFsaWRCaXRzKGJpdHN0cmVhbSkpKTsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKK2ludCBTcGF0aWFsRGVjRGVmYXVsdFNwZWNpZmljQ29uZmlnKAorICAgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3BhdGlhbFNwZWNpZmljQ29uZmlnLAorICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywgaW50IHNhbXBsaW5nRnJlcSwgaW50IG5UaW1lU2xvdHMsCisgICAgaW50IHNhY0RlY29kZXJMZXZlbCwgaW50IGlzQmxpbmQsIGludCBudW1Db3JlQ2hhbm5lbHMpCisKK3sKKyAgaW50IGVyciA9IE1QU19PSzsKKyAgaW50IGk7CisKKyAgRkRLX0FTU0VSVChjb3JlQ29kZWMgIT0gQU9UX05PTkUpOworICBGREtfQVNTRVJUKG5UaW1lU2xvdHMgPiAwKTsKKyAgRkRLX0FTU0VSVChzYW1wbGluZ0ZyZXEgPiAwKTsKKworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5jb3JlQ29kZWMgPSBjb3JlQ29kZWM7CisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnNhbXBsaW5nRnJlcSA9IHNhbXBsaW5nRnJlcTsKKyAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+blRpbWVTbG90cyA9IG5UaW1lU2xvdHM7CisgIGlmICgocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+Y29yZUNvZGVjID09IEFPVF9FUl9BQUNfRUxEKSB8fAorICAgICAgKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmNvcmVDb2RlYyA9PSBBT1RfRVJfQUFDX0xEKSkKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5mcmVxUmVzID0gU1BBVElBTERFQ19GUkVRX1JFU18yMzsKKyAgZWxzZQorICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmZyZXFSZXMgPSBTUEFUSUFMREVDX0ZSRVFfUkVTXzI4OworCisgIHsKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50cmVlQ29uZmlnID0KKyAgICAgICAgU1BBVElBTERFQ19NT0RFX1JTVkQ3OyAvKiAyMTIgIGNvbmZpZ3VyYXRpb24gKi8KKyAgfQorCisgIHsKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uT3R0Qm94ZXMgPQorICAgICAgICB0cmVlUHJvcGVydHlUYWJsZVtwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50cmVlQ29uZmlnXS5udW1PdHRCb3hlczsKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uSW5wdXRDaGFubmVscyA9CisgICAgICAgIHRyZWVQcm9wZXJ0eVRhYmxlW3BTcGF0aWFsU3BlY2lmaWNDb25maWctPnRyZWVDb25maWddLm51bUlucHV0Q2hhbm5lbHM7CisgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bk91dHB1dENoYW5uZWxzID0KKyAgICAgICAgdHJlZVByb3BlcnR5VGFibGVbcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dHJlZUNvbmZpZ10ubnVtT3V0cHV0Q2hhbm5lbHM7CisgIH0KKworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5xdWFudE1vZGUgPSBTUEFUSUFMREVDX1FVQU5UX0ZJTkVfREVGOworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5iQXJiaXRyYXJ5RG93bm1peCA9IDA7CisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJSZXNpZHVhbENvZGluZyA9IDA7CisgIGlmICgocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+Y29yZUNvZGVjID09IEFPVF9FUl9BQUNfRUxEKSB8fAorICAgICAgKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmNvcmVDb2RlYyA9PSBBT1RfRVJfQUFDX0xEKSkKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic0ZpeGVkR2FpbkRNWCA9IFNQQVRJQUxERUNfR0FJTl9SU1ZEMjsKKyAgZWxzZQorICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJzRml4ZWRHYWluRE1YID0gU1BBVElBTERFQ19HQUlOX01PREUwOworCisgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnRlbXBTaGFwZUNvbmZpZyA9IFNQQVRJQUxERUNfVFNfVFBOT1dISVRFOworICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5kZWNvcnJDb25maWcgPSBTUEFUSUFMREVDX0RFQ09SUl9NT0RFMDsKKworICBmb3IgKGkgPSAwOyBpIDwgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bk90dEJveGVzOyBpKyspIHsKKyAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5PdHRDb25maWdbaV0ubk90dEJhbmRzID0gMDsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBjb2Fyc2UyZmluZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorICAgUGFyYW1ldGVyIGluZGV4IG1hcHBpbmcgZnJvbSBjb2Fyc2UgdG8gZmluZSBxdWFudGl6YXRpb24KKworIEFyZ3VtZW50czoKKworSW5wdXQ6CisKK091dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGNvYXJzZTJmaW5lKFNDSEFSICpkYXRhLCBEQVRBX1RZUEUgZGF0YVR5cGUsIGludCBzdGFydEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQmFuZHMpIHsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gc3RhcnRCYW5kOyBpIDwgc3RhcnRCYW5kICsgbnVtQmFuZHM7IGkrKykgeworICAgIGRhdGFbaV0gPDw9IDE7CisgIH0KKworICBpZiAoZGF0YVR5cGUgPT0gdF9DTEQpIHsKKyAgICBmb3IgKGkgPSBzdGFydEJhbmQ7IGkgPCBzdGFydEJhbmQgKyBudW1CYW5kczsgaSsrKSB7CisgICAgICBpZiAoZGF0YVtpXSA9PSAtMTQpCisgICAgICAgIGRhdGFbaV0gPSAtMTU7CisgICAgICBlbHNlIGlmIChkYXRhW2ldID09IDE0KQorICAgICAgICBkYXRhW2ldID0gMTU7CisgICAgfQorICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBmaW5lMmNvYXJzZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorICAgUGFyYW1ldGVyIGluZGV4IG1hcHBpbmcgZnJvbSBmaW5lIHRvIGNvYXJzZSBxdWFudGl6YXRpb24KKworIEFyZ3VtZW50czoKKworSW5wdXQ6CisKK091dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGZpbmUyY29hcnNlKFNDSEFSICpkYXRhLCBEQVRBX1RZUEUgZGF0YVR5cGUsIGludCBzdGFydEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQmFuZHMpIHsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gc3RhcnRCYW5kOyBpIDwgc3RhcnRCYW5kICsgbnVtQmFuZHM7IGkrKykgeworICAgIC8qIE5vdGU6IHRoZSBpZiBjYXNlcyBiZWxvdyBhY3R1YWxseSBtYWtlIGEgZGlmZmVyZW5jZSAobmVnYXRpdmUgdmFsdWVzKSAqLworICAgIGlmIChkYXRhVHlwZSA9PSB0X0NMRCkKKyAgICAgIGRhdGFbaV0gLz0gMjsKKyAgICBlbHNlCisgICAgICBkYXRhW2ldID4+PSAxOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBnZXRTdHJpZGVNYXAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKyAgIEluZGV4IE1hcHBpbmcgYWNjcm9kaW5nIHRvIHBiU3RyaWRlcworCisgQXJndW1lbnRzOgorCitJbnB1dDoKKworT3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBnZXRTdHJpZGVNYXAoaW50IGZyZXFSZXNTdHJpZGUsIGludCBzdGFydEJhbmQsIGludCBzdG9wQmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYVN0cmlkZXMpIHsKKyAgaW50IGksIHBiLCBwYlN0cmlkZSwgZGF0YUJhbmRzLCBzdHJPZmZzZXQ7CisKKyAgcGJTdHJpZGUgPSBwYlN0cmlkZVRhYmxlW2ZyZXFSZXNTdHJpZGVdOworICBkYXRhQmFuZHMgPSAoc3RvcEJhbmQgLSBzdGFydEJhbmQgLSAxKSAvIHBiU3RyaWRlICsgMTsKKworICBhU3RyaWRlc1swXSA9IHN0YXJ0QmFuZDsKKyAgZm9yIChwYiA9IDE7IHBiIDw9IGRhdGFCYW5kczsgcGIrKykgeworICAgIGFTdHJpZGVzW3BiXSA9IGFTdHJpZGVzW3BiIC0gMV0gKyBwYlN0cmlkZTsKKyAgfQorICBzdHJPZmZzZXQgPSAwOworICB3aGlsZSAoYVN0cmlkZXNbZGF0YUJhbmRzXSA+IHN0b3BCYW5kKSB7CisgICAgaWYgKHN0ck9mZnNldCA8IGRhdGFCYW5kcykgc3RyT2Zmc2V0Kys7CisgICAgZm9yIChpID0gc3RyT2Zmc2V0OyBpIDw9IGRhdGFCYW5kczsgaSsrKSB7CisgICAgICBhU3RyaWRlc1tpXS0tOworICAgIH0KKyAgfQorCisgIHJldHVybiBkYXRhQmFuZHM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBlY0RhdGFEZWMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKyAgIERvIGRlbHRhIGRlY29kaW5nIGFuZCBkZXF1YW50aXphdGlvbgorCisgQXJndW1lbnRzOgorCitJbnB1dDoKKworT3V0cHV0OgorCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBTQUNERUNfRVJST1IgZWNEYXRhRGVjKAorICAgIGNvbnN0IFNQQVRJQUxfQlNfRlJBTUUgKmZyYW1lLCBVSU5UIHN5bnRheEZsYWdzLAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJpdHN0cmVhbSwgTE9TU0xFU1NEQVRBICpjb25zdCBsbERhdGEsCisgICAgU0NIQVIgKCpkYXRhKVtNQVhfUEFSQU1FVEVSX1NFVFNdW01BWF9QQVJBTUVURVJfQkFORFNdLCBTQ0hBUiAqKmxhc3RkYXRhLAorICAgIGludCBkYXRhdHlwZSwgaW50IGJveElkeCwgaW50IHN0YXJ0QmFuZCwgaW50IHN0b3BCYW5kLCBTQ0hBUiBkZWZhdWx0VmFsdWUpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKyAgaW50IGksIGosIHBiLCBkYXRhU2V0cywgc2V0SWR4LCBic0RhdGFQYWlyLCBkYXRhQmFuZHMsIG9sZFF1YW50Q29hcnNlWFhYOworICBJTlQgYVN0cmlkZXNbTUFYX1BBUkFNRVRFUl9CQU5EUyArIDFdID0gezB9OworCisgIGRhdGFTZXRzID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IGZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzOyBpKyspIHsKKyAgICBsbERhdGEtPmJzWFhYRGF0YU1vZGVbaV0gPSAoU0NIQVIpRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAyKTsKKworICAgIGlmICgoZnJhbWUtPmJzSW5kZXBlbmRlbmN5RmxhZyA9PSAxKSAmJiAoaSA9PSAwKSAmJgorICAgICAgICAobGxEYXRhLT5ic1hYWERhdGFNb2RlW2ldID09IDEgfHwKKyAgICAgICAgIGxsRGF0YS0+YnNYWFhEYXRhTW9kZVtpXSA9PSAyKSkgeyAvKiBUaGlzIGNoZWNrIGNhdGNoZXMgYml0c3RyZWFtcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZCBieSBvbGRlciBlbmNvZGVyIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZSB0cm91YmxlICovCisgICAgICByZXR1cm4gTVBTX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICBpZiAoKGkgPj0gZnJhbWUtPm51bVBhcmFtZXRlclNldHMgLSAxKSAmJgorICAgICAgICAobGxEYXRhLT5ic1hYWERhdGFNb2RlW2ldID09CisgICAgICAgICAyKSkgeyAvKiBUaGUgaW50ZXJwb2xhdGlvbiBtb2RlIG11c3Qgbm90IGJlIGFjdGl2ZSBmb3IgdGhlIGxhc3QKKyAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBzZXQgKi8KKyAgICAgIHJldHVybiBNUFNfUEFSU0VfRVJST1I7CisgICAgfQorCisgICAgaWYgKGxsRGF0YS0+YnNYWFhEYXRhTW9kZVtpXSA9PSAzKSB7CisgICAgICBkYXRhU2V0cysrOworICAgIH0KKyAgfQorCisgIHNldElkeCA9IDA7CisgIGJzRGF0YVBhaXIgPSAwOworICBvbGRRdWFudENvYXJzZVhYWCA9IGxsRGF0YS0+c3RhdGUtPmJzUXVhbnRDb2Fyc2VYWFhwcmV2UGFyc2U7CisKKyAgZm9yIChpID0gMDsgaSA8IGZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzOyBpKyspIHsKKyAgICBpZiAobGxEYXRhLT5ic1hYWERhdGFNb2RlW2ldID09IDApIHsKKyAgICAgIGZvciAocGIgPSBzdGFydEJhbmQ7IHBiIDwgc3RvcEJhbmQ7IHBiKyspIHsKKyAgICAgICAgbGFzdGRhdGFbYm94SWR4XVtwYl0gPSBkZWZhdWx0VmFsdWU7CisgICAgICB9CisKKyAgICAgIG9sZFF1YW50Q29hcnNlWFhYID0gMDsKKyAgICB9CisKKyAgICBpZiAobGxEYXRhLT5ic1hYWERhdGFNb2RlW2ldID09IDMpIHsKKyAgICAgIGlmIChic0RhdGFQYWlyKSB7CisgICAgICAgIGJzRGF0YVBhaXIgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnNEYXRhUGFpciA9IEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMSk7CisgICAgICAgIGxsRGF0YS0+YnNRdWFudENvYXJzZVhYWFtzZXRJZHhdID0gKFVDSEFSKUZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMSk7CisgICAgICAgIGxsRGF0YS0+YnNGcmVxUmVzU3RyaWRlWFhYW3NldElkeF0gPSAoVUNIQVIpRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAyKTsKKworICAgICAgICBpZiAobGxEYXRhLT5ic1F1YW50Q29hcnNlWFhYW3NldElkeF0gIT0gb2xkUXVhbnRDb2Fyc2VYWFgpIHsKKyAgICAgICAgICBpZiAob2xkUXVhbnRDb2Fyc2VYWFgpIHsKKyAgICAgICAgICAgIGNvYXJzZTJmaW5lKGxhc3RkYXRhW2JveElkeF0sIChEQVRBX1RZUEUpZGF0YXR5cGUsIHN0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BCYW5kIC0gc3RhcnRCYW5kKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluZTJjb2Fyc2UobGFzdGRhdGFbYm94SWR4XSwgKERBVEFfVFlQRSlkYXRhdHlwZSwgc3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcEJhbmQgLSBzdGFydEJhbmQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRhdGFCYW5kcyA9IGdldFN0cmlkZU1hcChsbERhdGEtPmJzRnJlcVJlc1N0cmlkZVhYWFtzZXRJZHhdLCBzdGFydEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wQmFuZCwgYVN0cmlkZXMpOworCisgICAgICAgIGZvciAocGIgPSAwOyBwYiA8IGRhdGFCYW5kczsgcGIrKykgeworICAgICAgICAgIGxhc3RkYXRhW2JveElkeF1bc3RhcnRCYW5kICsgcGJdID0gbGFzdGRhdGFbYm94SWR4XVthU3RyaWRlc1twYl1dOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJveElkeCA+IE1BWF9OVU1fT1RUKSByZXR1cm4gTVBTX0lOVkFMSURfQk9YSURYOworICAgICAgICBpZiAoKHNldElkeCArIGJzRGF0YVBhaXIpID4gTUFYX1BBUkFNRVRFUl9TRVRTKQorICAgICAgICAgIHJldHVybiBNUFNfSU5WQUxJRF9TRVRJRFg7CisKKyAgICAgICAgLyogREVDT0RFUl9UWVBFIGRlZmluZWQgaW4gRkRLX3Rvb2xzICovCisgICAgICAgIERFQ09ERVJfVFlQRSB0aGlzX2RlY29kZXJfdHlwZSA9IFNBQ19ERUNPREVSOworICAgICAgICBpZiAoc3ludGF4RmxhZ3MgJiAoU0FDREVDX1NZTlRBWF9VU0FDIHwgU0FDREVDX1NZTlRBWF9SU1ZENTApKSB7CisgICAgICAgICAgdGhpc19kZWNvZGVyX3R5cGUgPSBVU0FDX0RFQ09ERVI7CisgICAgICAgIH0gZWxzZSBpZiAoc3ludGF4RmxhZ3MgJiBTQUNERUNfU1lOVEFYX0xEKSB7CisgICAgICAgICAgdGhpc19kZWNvZGVyX3R5cGUgPSBTQU9DX0RFQ09ERVI7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSAoU0FDREVDX0VSUk9SKUVjRGF0YVBhaXJEZWMoCisgICAgICAgICAgICB0aGlzX2RlY29kZXJfdHlwZSwgYml0c3RyZWFtLCBkYXRhW2JveElkeF1bc2V0SWR4ICsgMF0sCisgICAgICAgICAgICBkYXRhW2JveElkeF1bc2V0SWR4ICsgMV0sIGxhc3RkYXRhW2JveElkeF0sIChEQVRBX1RZUEUpZGF0YXR5cGUsCisgICAgICAgICAgICBzdGFydEJhbmQsIGRhdGFCYW5kcywgYnNEYXRhUGFpciwgbGxEYXRhLT5ic1F1YW50Q29hcnNlWFhYW3NldElkeF0sCisgICAgICAgICAgICAhKGZyYW1lLT5ic0luZGVwZW5kZW5jeUZsYWcgJiYgKGkgPT0gMCkpIHx8IChzZXRJZHggPiAwKSk7CisgICAgICAgIGlmIChlcnIgIT0gTVBTX09LKSBnb3RvIGJhaWw7CisKKyAgICAgICAgaWYgKGRhdGF0eXBlID09IHRfSVBEKSB7CisgICAgICAgICAgY29uc3QgU0NIQVIgbWFzayA9IChsbERhdGEtPmJzUXVhbnRDb2Fyc2VYWFhbc2V0SWR4XSkgPyA3IDogMTU7CisgICAgICAgICAgZm9yIChwYiA9IDA7IHBiIDwgZGF0YUJhbmRzOyBwYisrKSB7CisgICAgICAgICAgICBmb3IgKGogPSBhU3RyaWRlc1twYl07IGogPCBhU3RyaWRlc1twYiArIDFdOyBqKyspIHsKKyAgICAgICAgICAgICAgbGFzdGRhdGFbYm94SWR4XVtqXSA9CisgICAgICAgICAgICAgICAgICBkYXRhW2JveElkeF1bc2V0SWR4ICsgYnNEYXRhUGFpcl1bc3RhcnRCYW5kICsgcGJdICYgbWFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChwYiA9IDA7IHBiIDwgZGF0YUJhbmRzOyBwYisrKSB7CisgICAgICAgICAgICBmb3IgKGogPSBhU3RyaWRlc1twYl07IGogPCBhU3RyaWRlc1twYiArIDFdOyBqKyspIHsKKyAgICAgICAgICAgICAgbGFzdGRhdGFbYm94SWR4XVtqXSA9CisgICAgICAgICAgICAgICAgICBkYXRhW2JveElkeF1bc2V0SWR4ICsgYnNEYXRhUGFpcl1bc3RhcnRCYW5kICsgcGJdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG9sZFF1YW50Q29hcnNlWFhYID0gbGxEYXRhLT5ic1F1YW50Q29hcnNlWFhYW3NldElkeF07CisKKyAgICAgICAgaWYgKGJzRGF0YVBhaXIpIHsKKyAgICAgICAgICBsbERhdGEtPmJzUXVhbnRDb2Fyc2VYWFhbc2V0SWR4ICsgMV0gPQorICAgICAgICAgICAgICBsbERhdGEtPmJzUXVhbnRDb2Fyc2VYWFhbc2V0SWR4XTsKKyAgICAgICAgICBsbERhdGEtPmJzRnJlcVJlc1N0cmlkZVhYWFtzZXRJZHggKyAxXSA9CisgICAgICAgICAgICAgIGxsRGF0YS0+YnNGcmVxUmVzU3RyaWRlWFhYW3NldElkeF07CisgICAgICAgIH0KKyAgICAgICAgc2V0SWR4ICs9IGJzRGF0YVBhaXIgKyAxOworICAgICAgfSAvKiAhYnNEYXRhUGFpciAqLworICAgIH0gICAvKiBsbERhdGEtPmJzWFhYRGF0YU1vZGVbaV0gPT0gMyAqLworICB9CisKKyAgbGxEYXRhLT5zdGF0ZS0+YnNRdWFudENvYXJzZVhYWHByZXZQYXJzZSA9IG9sZFF1YW50Q29hcnNlWFhYOworCitiYWlsOgorICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogcGFyc2VBcmJpdHJhcnlEb3dubWl4RGF0YQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFNBQ0RFQ19FUlJPUiBwYXJzZUFyYml0cmFyeURvd25taXhEYXRhKAorICAgIHNwYXRpYWxEZWMgKnNlbGYsIGNvbnN0IFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU1NDLAorICAgIGNvbnN0IFVJTlQgc3ludGF4RmxhZ3MsIGNvbnN0IFNQQVRJQUxfQlNfRlJBTUUgKmZyYW1lLAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJpdHN0cmVhbSkgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworICBpbnQgY2g7CisgIGludCBvZmZzZXQgPSBwU1NDLT5uT3R0Qm94ZXM7CisKKyAgLyogQ0xEIChhcmJpdHJhcnkgZG93bi1taXggZ2FpbnMpICovCisgIGZvciAoY2ggPSAwOyBjaCA8IHBTU0MtPm5JbnB1dENoYW5uZWxzOyBjaCsrKSB7CisgICAgZXJyID0gZWNEYXRhRGVjKGZyYW1lLCBzeW50YXhGbGFncywgYml0c3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAmZnJhbWUtPkNMRExvc3NsZXNzRGF0YVtvZmZzZXQgKyBjaF0sCisgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5jbXBBcmJkbXhHYWluSWR4LCBzZWxmLT5jbXBBcmJkbXhHYWluSWR4UHJldiwgdF9DTEQsCisgICAgICAgICAgICAgICAgICAgIGNoLCAwLCBwU1NDLT5mcmVxUmVzLCBhcmJkbXhHYWluRGVmYXVsdCk7CisgICAgaWYgKGVyciAhPSBNUFNfT0spIHJldHVybiBlcnI7CisgIH0KKworICByZXR1cm4gZXJyOworCit9IC8qIHBhcnNlQXJiaXRyYXJ5RG93bm1peERhdGEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IFNwYXRpYWxEZWNQYXJzZUZyYW1lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6CisKKyBJbnB1dDoKKworIE91dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBuQml0c1BhcmFtU2xvdChpbnQgaSkgeworICBpbnQgYml0c1BhcmFtU2xvdDsKKworICBiaXRzUGFyYW1TbG90ID0gZk1heCgwLCBERlJBQ1RfQklUUyAtIDEgLSBmTm9ybXooKEZJWFBfREJMKWkpKTsKKyAgaWYgKCgxIDw8IGJpdHNQYXJhbVNsb3QpIDwgaSkgeworICAgIGJpdHNQYXJhbVNsb3QrKzsKKyAgfQorICBGREtfQVNTRVJUKChiaXRzUGFyYW1TbG90ID49IDApICYmIChiaXRzUGFyYW1TbG90IDw9IDMyKSk7CisKKyAgcmV0dXJuIGJpdHNQYXJhbVNsb3Q7Cit9CisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjUGFyc2VGcmFtZURhdGEoCisgICAgc3BhdGlhbERlY19zdHJ1Y3QgKnNlbGYsIFNQQVRJQUxfQlNfRlJBTUUgKmZyYW1lLAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJpdHN0cmVhbSwKKyAgICBjb25zdCBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqcFNwYXRpYWxTcGVjaWZpY0NvbmZpZywgVVBNSVhUWVBFIHVwbWl4VHlwZSwKKyAgICBpbnQgZkdsb2JhbEluZGVwZW5kZW5jeUZsYWcpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKyAgaW50IGJzRnJhbWluZ1R5cGUsIGRhdGFCYW5kcywgcHMsIHBnLCBpOworICBpbnQgcGI7CisgIGludCBudW1UZW1wU2hhcGVDaGFuID0gMDsKKyAgaW50IGJzTnVtT3V0cHV0Q2hhbm5lbHMgPQorICAgICAgdHJlZVByb3BlcnR5VGFibGVbcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dHJlZUNvbmZpZ10KKyAgICAgICAgICAubnVtT3V0cHV0Q2hhbm5lbHM7IC8qIENBVVRJT046IE1heWJlIGRpZmZlcmVudCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dHJlZUNvbmZpZyBpbiBzb21lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlcyEgKi8KKyAgaW50IHBhcmFtU2V0RXJyID0gMDsKKyAgVUlOVCBhbGlnbkFuY2hvciA9IEZES2dldFZhbGlkQml0cygKKyAgICAgIGJpdHN0cmVhbSk7IC8qIEFuY2hvciBmb3IgQnl0ZUFsaWduKCkgZnVuY3Rpb24uIFNlZSBjb21tZW50IGJlbG93LiAqLworICBVSU5UIHN5bnRheEZsYWdzOworCisgIHN5bnRheEZsYWdzID0gcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+c3ludGF4RmxhZ3M7CisKKyAgaWYgKChzeW50YXhGbGFncyAmIChTQUNERUNfU1lOVEFYX1VTQUMgfCBTQUNERUNfU1lOVEFYX1JTVkQ1MCkpICYmCisgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic0hpZ2hSYXRlTW9kZSA9PSAwKSB7CisgICAgYnNGcmFtaW5nVHlwZSA9IDA7IC8qIGZpeGVkIGZyYW1pbmcgKi8KKyAgICBmcmFtZS0+bnVtUGFyYW1ldGVyU2V0cyA9IDE7CisgIH0gZWxzZSB7CisgICAgYnNGcmFtaW5nVHlwZSA9IEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMSk7CisgICAgaWYgKHN5bnRheEZsYWdzICYgU0FDREVDX1NZTlRBWF9MRCkKKyAgICAgIGZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzID0gRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAxKSArIDE7CisgICAgZWxzZQorICAgICAgZnJhbWUtPm51bVBhcmFtZXRlclNldHMgPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDMpICsgMTsKKyAgfQorCisgIC8qIEFueSBlcnJvciBhZnRlciB0aGlzIGxpbmUgc2hhbGwgdHJpZ2dlciBwYXJhbWV0ZXIgaW52YWxpZGF0aW9uIGF0IGJhaWwKKyAgICogbGFiZWwuICovCisgIHBhcmFtU2V0RXJyID0gMTsKKworICBpZiAoZnJhbWUtPm51bVBhcmFtZXRlclNldHMgPj0gTUFYX1BBUkFNRVRFUl9TRVRTKSB7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogQmFzaWMgY29uZmlnIGNoZWNrLiAqLworICBpZiAocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bklucHV0Q2hhbm5lbHMgPD0gMCB8fAorICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bk91dHB1dENoYW5uZWxzIDw9IDApIHsKKyAgICBlcnIgPSBNUFNfVU5TVVBQT1JURURfQ09ORklHOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIGlmIChic0ZyYW1pbmdUeXBlKSB7CisgICAgaW50IHByZXZQYXJhbVNsb3QgPSAtMTsKKyAgICBpbnQgYml0c1BhcmFtU2xvdDsKKworICAgIHsKKyAgICAgIGJpdHNQYXJhbVNsb3QgPSBuQml0c1BhcmFtU2xvdChwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uVGltZVNsb3RzKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzOyBpKyspIHsKKyAgICAgICAgZnJhbWUtPnBhcmFtU2xvdFtpXSA9IEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgYml0c1BhcmFtU2xvdCk7CisgICAgICAgIC8qIFNhbml0eSBjaGVjayAqLworICAgICAgICBpZiAoKGZyYW1lLT5wYXJhbVNsb3RbaV0gPD0gcHJldlBhcmFtU2xvdCkgfHwKKyAgICAgICAgICAgIChmcmFtZS0+cGFyYW1TbG90W2ldID49IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5UaW1lU2xvdHMpKSB7CisgICAgICAgICAgZXJyID0gTVBTX1BBUlNFX0VSUk9SOworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgICBwcmV2UGFyYW1TbG90ID0gZnJhbWUtPnBhcmFtU2xvdFtpXTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzOyBpKyspIHsKKyAgICAgIGZyYW1lLT5wYXJhbVNsb3RbaV0gPSAoKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5UaW1lU2xvdHMgKiAoaSArIDEpKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTsKKyAgICB9CisgIH0KKworICBpZiAoKHN5bnRheEZsYWdzICYgKFNBQ0RFQ19TWU5UQVhfVVNBQyB8IFNBQ0RFQ19TWU5UQVhfUlNWRDUwKSkgJiYKKyAgICAgIGZHbG9iYWxJbmRlcGVuZGVuY3lGbGFnKSB7CisgICAgZnJhbWUtPmJzSW5kZXBlbmRlbmN5RmxhZyA9IDE7CisgIH0gZWxzZSB7CisgICAgZnJhbWUtPmJzSW5kZXBlbmRlbmN5RmxhZyA9IChVQ0hBUilGREtyZWFkQml0cyhiaXRzdHJlYW0sIDEpOworICB9CisKKyAgLyoKKyAgICogT3R0RGF0YSgpCisgICAqLworICBmb3IgKGkgPSAwOyBpIDwgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bk90dEJveGVzOyBpKyspIHsKKyAgICBlcnIgPSBlY0RhdGFEZWMoZnJhbWUsIHN5bnRheEZsYWdzLCBiaXRzdHJlYW0sICZmcmFtZS0+Q0xETG9zc2xlc3NEYXRhW2ldLAorICAgICAgICAgICAgICAgICAgICBmcmFtZS0+Y21wT3R0Q0xEaWR4LCBzZWxmLT5jbXBPdHRDTERpZHhQcmV2LCB0X0NMRCwgaSwgMCwKKyAgICAgICAgICAgICAgICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+Yml0c3RyZWFtT3R0QmFuZHNbaV0sCisgICAgICAgICAgICAgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm90dENMRGRlZmF1bHRbaV0pOworICAgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICB9IC8qIGkgPCBudW1PdHRCb3hlcyAqLworCisgIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bk90dEJveGVzOyBpKyspIHsKKyAgICAgIGVyciA9IGVjRGF0YURlYyhmcmFtZSwgc3ludGF4RmxhZ3MsIGJpdHN0cmVhbSwgJmZyYW1lLT5JQ0NMb3NzbGVzc0RhdGFbaV0sCisgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmNtcE90dElDQ2lkeCwgc2VsZi0+Y21wT3R0SUNDaWR4UHJldiwgdF9JQ0MsIGksIDAsCisgICAgICAgICAgICAgICAgICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+Yml0c3RyZWFtT3R0QmFuZHNbaV0sIElDQ2RlZmF1bHQpOworICAgICAgaWYgKGVyciAhPSBNUFNfT0spIHsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgIH0gLyogaSA8IG51bU90dEJveGVzICovCisgIH0gICAvKiAhb25lSUNDICovCisKKyAgaWYgKChwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50cmVlQ29uZmlnID09IFNQQVRJQUxERUNfTU9ERV9SU1ZENykgJiYKKyAgICAgIChwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic1BoYXNlQ29kaW5nKSkgeworICAgIGZyYW1lLT5waGFzZU1vZGUgPSBGREtyZWFkQml0cyhiaXRzdHJlYW0sIDEpOworCisgICAgaWYgKGZyYW1lLT5waGFzZU1vZGUgPT0gMCkgeworICAgICAgZm9yIChwYiA9IDA7IHBiIDwgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bnVtT3R0QmFuZHNJUEQ7IHBiKyspIHsKKyAgICAgICAgc2VsZi0+Y21wT3R0SVBEaWR4UHJldlswXVtwYl0gPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWUtPm51bVBhcmFtZXRlclNldHM7IGkrKykgeworICAgICAgICAgIGZyYW1lLT5jbXBPdHRJUERpZHhbMF1baV1bcGJdID0gMDsKKyAgICAgICAgICAvLyBmcmFtZS0+b3R0SVBEaWR4WzBdW2ldW3BiXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLyogc2VsZi0+b3R0SVBEaWR4UHJldlswXVtwYl0gPSAwOyAqLworICAgICAgfQorICAgICAgZnJhbWUtPk9wZFNtb290aGluZ01vZGUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBmcmFtZS0+T3BkU21vb3RoaW5nTW9kZSA9IEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMSk7CisgICAgICBlcnIgPSBlY0RhdGFEZWMoZnJhbWUsIHN5bnRheEZsYWdzLCBiaXRzdHJlYW0sICZmcmFtZS0+SVBETG9zc2xlc3NEYXRhWzBdLAorICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5jbXBPdHRJUERpZHgsIHNlbGYtPmNtcE90dElQRGlkeFByZXYsIHRfSVBELCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm51bU90dEJhbmRzSVBELCBJUERkZWZhdWx0KTsKKyAgICAgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKgorICAgKiBTbWdEYXRhKCkKKyAgICovCisKKyAgeworICAgIGlmICghcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNIaWdoUmF0ZU1vZGUgJiYKKyAgICAgICAgKHN5bnRheEZsYWdzICYgU0FDREVDX1NZTlRBWF9VU0FDKSkgeworICAgICAgZm9yIChwcyA9IDA7IHBzIDwgZnJhbWUtPm51bVBhcmFtZXRlclNldHM7IHBzKyspIHsKKyAgICAgICAgZnJhbWUtPmJzU21vb3RoTW9kZVtwc10gPSAwOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKHBzID0gMDsgcHMgPCBmcmFtZS0+bnVtUGFyYW1ldGVyU2V0czsgcHMrKykgeworICAgICAgICBmcmFtZS0+YnNTbW9vdGhNb2RlW3BzXSA9IChVQ0hBUilGREtyZWFkQml0cyhiaXRzdHJlYW0sIDIpOworICAgICAgICBpZiAoZnJhbWUtPmJzU21vb3RoTW9kZVtwc10gPj0gMikgeworICAgICAgICAgIGZyYW1lLT5ic1Ntb290aFRpbWVbcHNdID0gKFVDSEFSKUZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyYW1lLT5ic1Ntb290aE1vZGVbcHNdID09IDMpIHsKKyAgICAgICAgICBmcmFtZS0+YnNGcmVxUmVzU3RyaWRlU21nW3BzXSA9IChVQ0hBUilGREtyZWFkQml0cyhiaXRzdHJlYW0sIDIpOworICAgICAgICAgIGRhdGFCYW5kcyA9IChwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5mcmVxUmVzIC0gMSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICBwYlN0cmlkZVRhYmxlW2ZyYW1lLT5ic0ZyZXFSZXNTdHJpZGVTbWdbcHNdXSArCisgICAgICAgICAgICAgICAgICAgICAgMTsKKyAgICAgICAgICBmb3IgKHBnID0gMDsgcGcgPCBkYXRhQmFuZHM7IHBnKyspIHsKKyAgICAgICAgICAgIGZyYW1lLT5ic1NtZ0RhdGFbcHNdW3BnXSA9IChVQ0hBUilGREtyZWFkQml0cyhiaXRzdHJlYW0sIDEpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSAvKiBwcyA8IG51bVBhcmFtZXRlclNldHMgKi8KKyAgICB9CisgIH0KKworICAvKgorICAgKiBUZW1wU2hhcGVEYXRhKCkKKyAgICovCisgIGlmICgocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dGVtcFNoYXBlQ29uZmlnID09IDMpICYmCisgICAgICAoc3ludGF4RmxhZ3MgJiBTQUNERUNfU1lOVEFYX1VTQUMpKSB7CisgICAgaW50IFRzZEVycjsKKyAgICBUc2RFcnIgPSBUc2RSZWFkKGJpdHN0cmVhbSwgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+blRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICZmcmFtZS0+VHNkRGF0YVswXSk7CisgICAgaWYgKFRzZEVycikgeworICAgICAgZXJyID0gTVBTX1BBUlNFX0VSUk9SOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmcmFtZS0+VHNkRGF0YVswXS5ic1RzZEVuYWJsZSA9IDA7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgYnNOdW1PdXRwdXRDaGFubmVsczsgaSsrKSB7CisgICAgZnJhbWUtPnRlbXBTaGFwZUVuYWJsZUNoYW5uZWxTVFBbaV0gPSAwOworICAgIGZyYW1lLT50ZW1wU2hhcGVFbmFibGVDaGFubmVsR0VTW2ldID0gMDsKKyAgfQorCisgIGlmICgocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dGVtcFNoYXBlQ29uZmlnID09IDEpIHx8CisgICAgICAocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dGVtcFNoYXBlQ29uZmlnID09IDIpKSB7CisgICAgaW50IGJzVGVtcFNoYXBlRW5hYmxlID0gRkRLcmVhZEJpdHMoYml0c3RyZWFtLCAxKTsKKyAgICBpZiAoYnNUZW1wU2hhcGVFbmFibGUpIHsKKyAgICAgIG51bVRlbXBTaGFwZUNoYW4gPQorICAgICAgICAgIHRlbXBTaGFwZUNoYW5UYWJsZVtwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50ZW1wU2hhcGVDb25maWcgLSAxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT50cmVlQ29uZmlnXTsKKyAgICAgIHN3aXRjaCAocFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dGVtcFNoYXBlQ29uZmlnKSB7CisgICAgICAgIGNhc2UgMTogLyogU1RQICovCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVRlbXBTaGFwZUNoYW47IGkrKykgeworICAgICAgICAgICAgaW50IHN0cEVuYWJsZSA9IEZES3JlYWRCaXRzKGJpdHN0cmVhbSwgMSk7CisgICAgICAgICAgICBmcmFtZS0+dGVtcFNoYXBlRW5hYmxlQ2hhbm5lbFNUUFtpXSA9IHN0cEVuYWJsZTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogLyogR0VTICovCisgICAgICAgIHsKKyAgICAgICAgICBVQ0hBUiBnZXNDaGFubmVsRW5hYmxlW01BWF9PVVRQVVRfQ0hBTk5FTFNdOworCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVRlbXBTaGFwZUNoYW47IGkrKykgeworICAgICAgICAgICAgZ2VzQ2hhbm5lbEVuYWJsZVtpXSA9IChVQ0hBUilGREtyZWFkQml0cyhiaXRzdHJlYW0sIDEpOworICAgICAgICAgICAgZnJhbWUtPnRlbXBTaGFwZUVuYWJsZUNoYW5uZWxHRVNbaV0gPSBnZXNDaGFubmVsRW5hYmxlW2ldOworICAgICAgICAgIH0KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVGVtcFNoYXBlQ2hhbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZ2VzQ2hhbm5lbEVuYWJsZVtpXSkgeworICAgICAgICAgICAgICBpbnQgZW52U2hhcGVEYXRhX3RtcFtNQVhfVElNRV9TTE9UU107CisgICAgICAgICAgICAgIGlmIChodWZmX2RlY19yZXNoYXBlKGJpdHN0cmVhbSwgZW52U2hhcGVEYXRhX3RtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+blRpbWVTbG90cykgIT0gMCkgeworICAgICAgICAgICAgICAgIGVyciA9IE1QU19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZm9yIChpbnQgdHMgPSAwOyB0cyA8IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5UaW1lU2xvdHM7IHRzKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIShlbnZTaGFwZURhdGFfdG1wW3RzXSA+PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAoZW52U2hhcGVEYXRhX3RtcFt0c10gPD0gNCkpIHsKKyAgICAgICAgICAgICAgICAgIGVyciA9IE1QU19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnJhbWUtPmJzRW52U2hhcGVEYXRhW2ldW3RzXSA9IChVQ0hBUillbnZTaGFwZURhdGFfdG1wW3RzXTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBlcnIgPSBNUFNfSU5WQUxJRF9URU1QU0hBUEU7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgIH0gLyogYnNUZW1wU2hhcGVFbmFibGUgKi8KKyAgfSAgIC8qIHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnRlbXBTaGFwZUNvbmZpZyAhPSAwICovCisKKyAgaWYgKHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmJBcmJpdHJhcnlEb3dubWl4ICE9IDApIHsKKyAgICBlcnIgPSBwYXJzZUFyYml0cmFyeURvd25taXhEYXRhKHNlbGYsIHBTcGF0aWFsU3BlY2lmaWNDb25maWcsIHN5bnRheEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUsIGJpdHN0cmVhbSk7CisgICAgaWYgKGVyciAhPSBNUFNfT0spIGdvdG8gYmFpbDsKKyAgfQorCisgIGlmICgxICYmICghKHN5bnRheEZsYWdzICYgKFNBQ0RFQ19TWU5UQVhfVVNBQykpKSkgeworICAgIEZES2J5dGVBbGlnbihiaXRzdHJlYW0sCisgICAgICAgICAgICAgICAgIGFsaWduQW5jaG9yKTsgLyogSVNPL0lFQyBGRElTIDIzMDAzLTE6IDUuMi4gLi4uIGJ5dGUgYWxpZ25tZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCByZXNwZWN0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN5bnRhY3RpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgaW4gd2hpY2ggQnl0ZUFsaWduKCkgb2NjdXJzLiAqLworICB9CisKK2JhaWw6CisgIGlmIChlcnIgIT0gTVBTX09LICYmIHBhcmFtU2V0RXJyICE9IDApIHsKKyAgICAvKiBTaW5jZSB0aGUgcGFyYW1ldGVyIHNldCBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbiB0byB0aGUgaW5zdGFuY2Ugd2UKKyAgICAgKiBuZWVkIHRvIC4uLiAqLworICAgIGZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzID0gMDsgLyogLi4uIHNpZ25hbCB0aGF0IGl0IGlzIGNvcnJ1cHQgLi4uICovCisgIH0KKworICByZXR1cm4gZXJyOworCit9IC8qIFNwYXRpYWxEZWNQYXJzZUZyYW1lICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBjcmVhdGVNYXBwaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6CisKKyBSZXR1cm46CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBjcmVhdGVNYXBwaW5nKGludCBhTWFwW01BWF9QQVJBTUVURVJfQkFORFMgKyAxXSwgaW50IHN0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0b3BCYW5kLCBpbnQgc3RyaWRlKSB7CisgIGludCBpbkJhbmRzLCBvdXRCYW5kcywgYmFuZHNBY2hpdmVkLCBiYW5kc0RpZmYsIGluY3IsIGssIGk7CisgIGludCB2RGtbTUFYX1BBUkFNRVRFUl9CQU5EUyArIDFdOworICBpbkJhbmRzID0gc3RvcEJhbmQgLSBzdGFydEJhbmQ7CisgIG91dEJhbmRzID0gKGluQmFuZHMgLSAxKSAvIHN0cmlkZSArIDE7CisKKyAgaWYgKG91dEJhbmRzIDwgMSkgeworICAgIG91dEJhbmRzID0gMTsKKyAgfQorCisgIGJhbmRzQWNoaXZlZCA9IG91dEJhbmRzICogc3RyaWRlOworICBiYW5kc0RpZmYgPSBpbkJhbmRzIC0gYmFuZHNBY2hpdmVkOworICBmb3IgKGkgPSAwOyBpIDwgb3V0QmFuZHM7IGkrKykgeworICAgIHZEa1tpXSA9IHN0cmlkZTsKKyAgfQorCisgIGlmIChiYW5kc0RpZmYgPiAwKSB7CisgICAgaW5jciA9IC0xOworICAgIGsgPSBvdXRCYW5kcyAtIDE7CisgIH0gZWxzZSB7CisgICAgaW5jciA9IDE7CisgICAgayA9IDA7CisgIH0KKworICB3aGlsZSAoYmFuZHNEaWZmICE9IDApIHsKKyAgICB2RGtba10gPSB2RGtba10gLSBpbmNyOworICAgIGsgPSBrICsgaW5jcjsKKyAgICBiYW5kc0RpZmYgPSBiYW5kc0RpZmYgKyBpbmNyOworICAgIGlmIChrID49IG91dEJhbmRzKSB7CisgICAgICBpZiAoYmFuZHNEaWZmID4gMCkgeworICAgICAgICBrID0gb3V0QmFuZHMgLSAxOworICAgICAgfSBlbHNlIGlmIChiYW5kc0RpZmYgPCAwKSB7CisgICAgICAgIGsgPSAwOworICAgICAgfQorICAgIH0KKyAgfQorICBhTWFwWzBdID0gc3RhcnRCYW5kOworICBmb3IgKGkgPSAwOyBpIDwgb3V0QmFuZHM7IGkrKykgeworICAgIGFNYXBbaSArIDFdID0gYU1hcFtpXSArIHZEa1tpXTsKKyAgfQorfSAvKiBjcmVhdGVNYXBwaW5nICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBtYXBGcmVxdWVuY3kKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKworIEFyZ3VtZW50czoKKworIFJldHVybjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG1hcEZyZXF1ZW5jeShjb25zdCBTQ0hBUiAqcElucHV0LCAvKiBJbnB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICpwT3V0cHV0LCAgICAgIC8qIE91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcE1hcCwgICAgICAgICAgIC8qIE1hcHBpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGF0YUJhbmRzKSAgICAgICAvKiBOdW1iZXIgb2YgZGF0YSBCYW5kcyAqLworeworICBpbnQgaSwgajsKKyAgaW50IHN0YXJ0QmFuZDAgPSBwTWFwWzBdOworCisgIGZvciAoaSA9IDA7IGkgPCBkYXRhQmFuZHM7IGkrKykgeworICAgIGludCBzdGFydEJhbmQsIHN0b3BCYW5kLCB2YWx1ZTsKKworICAgIHZhbHVlID0gcElucHV0W2kgKyBzdGFydEJhbmQwXTsKKworICAgIHN0YXJ0QmFuZCA9IHBNYXBbaV07CisgICAgc3RvcEJhbmQgPSBwTWFwW2kgKyAxXTsKKyAgICBmb3IgKGogPSBzdGFydEJhbmQ7IGogPCBzdG9wQmFuZDsgaisrKSB7CisgICAgICBwT3V0cHV0W2pdID0gdmFsdWU7CisgICAgfQorICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBkZXEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKworIEFyZ3VtZW50czoKKworIFJldHVybjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZGVxSWR4KGludCB2YWx1ZSwgaW50IHBhcmFtVHlwZSkgeworICBpbnQgaWR4ID0gLTE7CisKKyAgc3dpdGNoIChwYXJhbVR5cGUpIHsKKyAgICBjYXNlIHRfQ0xEOgorICAgICAgaWYgKCgodmFsdWUgKyAxNSkgPj0gMCkgJiYgKCh2YWx1ZSArIDE1KSA8IDMxKSkgeworICAgICAgICBpZHggPSAodmFsdWUgKyAxNSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgdF9JQ0M6CisgICAgICBpZiAoKHZhbHVlID49IDApICYmICh2YWx1ZSA8IDgpKSB7CisgICAgICAgIGlkeCA9IHZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHRfSVBEOgorICAgICAgLyogKCsvLSkxNSAqIE1BWF9QQVJBTUVURVJfQkFORFMgZm9yIGRpZmZlcmVudGlhbCBjb2RpbmcgaW4gZnJlcXVlbmN5CisgICAgICAgKiBkb21haW4gKGFjY29yZGluZyB0byByYmwpICovCisgICAgICBpZiAoKHZhbHVlID49IC00MjApICYmICh2YWx1ZSA8PSA0MjApKSB7CisgICAgICAgIGlkeCA9ICh2YWx1ZSAmIDB4Zik7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBGREtfQVNTRVJUKDApOworICB9CisKKyAgcmV0dXJuIGlkeDsKK30KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRnVuY3Rpb25uYW1lOiBmYWN0b3JGdW5jdAorICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBEZXNjcmlwdGlvbjoKKworICAgQXJndW1lbnRzOgorCisgICBSZXR1cm46CisKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTRl9JRFggKDcpCisjZGVmaW5lIFNGX0ZBQ1RPUiAoMykKKyNkZWZpbmUgU0NBTEVfRkFDVE9SICgxIDw8IFNGX0ZBQ1RPUikKKyNkZWZpbmUgU0NBTEVfQ0xEX0MxQzIgKDEgPDwgU0ZfQ0xEX0MxQzIpCisKK3N0YXRpYyBGSVhQX0RCTCBmYWN0b3JGdW5jdChGSVhQX0RCTCBvdHRWc1RvdERiLCBJTlQgcXVhbnRNb2RlKSB7CisgIEZJWFBfREJMIGZhY3RvcjsKKworICBpZiAob3R0VnNUb3REYiA+IEZMMkZYQ09OU1RfREJMKDAuMCkpIHsKKyAgICBvdHRWc1RvdERiID0gRkwyRlhDT05TVF9EQkwoMC4wKTsKKyAgfQorCisgIG90dFZzVG90RGIgPSAtb3R0VnNUb3REYjsKKworICBzd2l0Y2ggKHF1YW50TW9kZSkgeworICAgIGNhc2UgMDoKKyAgICAgIGZhY3RvciA9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyBTQ0FMRV9GQUNUT1IpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgaWYgKG90dFZzVG90RGIgPj0gRkwyRlhDT05TVF9EQkwoMjEuMGYgLyBTQ0FMRV9DTERfQzFDMikpCisgICAgICAgIGZhY3RvciA9IEZMMkZYQ09OU1RfREJMKDUuMGYgLyBTQ0FMRV9GQUNUT1IpOworICAgICAgZWxzZSBpZiAob3R0VnNUb3REYiA8PSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gU0NBTEVfQ0xEX0MxQzIpKQorICAgICAgICBmYWN0b3IgPSBGTDJGWENPTlNUX0RCTCgxLjBmIC8gU0NBTEVfRkFDVE9SKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZmFjdG9yID0gKGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuMmYpLCBvdHRWc1RvdERiKSArCisgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjhmIC8gU0NBTEVfQ0xEX0MxQzIpKQorICAgICAgICAgICAgICAgICA8PCAoU0ZfQ0xEX0MxQzIgLSBTRl9GQUNUT1IpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgaWYgKG90dFZzVG90RGIgPj0gRkwyRlhDT05TVF9EQkwoMjUuMGYgLyBTQ0FMRV9DTERfQzFDMikpIHsKKyAgICAgICAgRkRLX0FTU0VSVChTRl9GQUNUT1IgPT0gMyk7CisgICAgICAgIGZhY3RvciA9IChGSVhQX0RCTCkKKyAgICAgICAgICAgIE1BWFZBTF9EQkw7IC8qIGF2b2lkIHdhcm5pbmc6IEZMMkZYQ09OU1RfREJMKDguMGYvU0NBTEVfRkFDVE9SKSAqLworICAgICAgfSBlbHNlIGlmIChvdHRWc1RvdERiIDw9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyBTQ0FMRV9DTERfQzFDMikpCisgICAgICAgIGZhY3RvciA9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyBTQ0FMRV9GQUNUT1IpOworICAgICAgZWxzZQorICAgICAgICBmYWN0b3IgPSAoZk11bHQoRkwyRlhDT05TVF9EQkwoNy4wZiAvIDI0LjBmKSwgb3R0VnNUb3REYikgKworICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoKDE3LjBmIC8gMjQuMGYpIC8gU0NBTEVfQ0xEX0MxQzIpKQorICAgICAgICAgICAgICAgICA8PCAoU0ZfQ0xEX0MxQzIgLSBTRl9GQUNUT1IpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZhY3RvciA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICB9CisKKyAgcmV0dXJuIChmYWN0b3IpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogZmFjdG9yQ0xECisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6CisKKyBSZXR1cm46CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBmYWN0b3JDTEQoU0NIQVIgKmlkeCwgRklYUF9EQkwgb3R0VnNUb3REYiwgRklYUF9EQkwgKm90dFZzVG90RGIxLAorICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpvdHRWc1RvdERiMiwgU0NIQVIgb3R0VnNUb3REYk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgSU5UIHF1YW50TW9kZSkgeworICBGSVhQX0RCTCBmYWN0b3I7CisgIEZJWFBfREJMIGNsZElkeEZyYWN0OworICBJTlQgY2xkSWR4OworCisgIGZhY3RvciA9IGZhY3RvckZ1bmN0KG90dFZzVG90RGIsIHF1YW50TW9kZSk7CisKKyAgY2xkSWR4RnJhY3QgPQorICAgICAgZk11bHQoKEZJWFBfREJMKSgoKmlkeCkgPDwgKChERlJBQ1RfQklUUyAtIDEpIC0gU0ZfSURYKSksIGZhY3Rvcik7CisgIGNsZElkeEZyYWN0ICs9IEZMMkZYQ09OU1RfREJMKDE1LjVmIC8gKDEgPDwgKFNGX0ZBQ1RPUiArIFNGX0lEWCkpKTsKKyAgY2xkSWR4ID0gZml4cF90cnVuY2F0ZVRvSW50KGNsZElkeEZyYWN0LCBTRl9GQUNUT1IgKyBTRl9JRFgpOworCisgIGNsZElkeCA9IGZNaW4oY2xkSWR4LCAzMCk7CisgIGNsZElkeCA9IGZNYXgoY2xkSWR4LCAwKTsKKworICAqaWR4ID0gY2xkSWR4IC0gMTU7CisKKyAgaWYgKG90dFZzVG90RGJNb2RlICYgb3R0VnNUb3REYjFBY3RpdikKKyAgICAoKm90dFZzVG90RGIxKSA9IG90dFZzVG90RGIgKyBkZXF1YW50Q0xEX2MxW2NsZElkeF07CisKKyAgaWYgKG90dFZzVG90RGJNb2RlICYgb3R0VnNUb3REYjJBY3RpdikKKyAgICAoKm90dFZzVG90RGIyKSA9IG90dFZzVG90RGIgKyBkZXF1YW50Q0xEX2MxWzMwIC0gY2xkSWR4XTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IG1hcEluZGV4RGF0YQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFNBQ0RFQ19FUlJPUiBtYXBJbmRleERhdGEoCisgICAgTE9TU0xFU1NEQVRBICpsbERhdGEsIFNDSEFSICoqKm91dHB1dERhdGFJZHgsIFNDSEFSICoqKm91dHB1dElkeERhdGEsCisgICAgY29uc3QgU0NIQVIgKCpjbXBJZHhEYXRhKVtNQVhfUEFSQU1FVEVSX1NFVFNdW01BWF9QQVJBTUVURVJfQkFORFNdLAorICAgIFNDSEFSICoqKmRpZmZJZHhEYXRhLCBTQ0hBUiB4dHRJZHgsIFNDSEFSICoqaWR4UHJldiwgaW50IHBhcmFtSWR4LAorICAgIGludCBwYXJhbVR5cGUsIGludCBzdGFydEJhbmQsIGludCBzdG9wQmFuZCwgU0NIQVIgZGVmYXVsdFZhbHVlLAorICAgIGludCBudW1QYXJhbWV0ZXJTZXRzLCBjb25zdCBpbnQgKnBhcmFtU2xvdCwgaW50IGV4dGVuZEZyYW1lLCBpbnQgcXVhbnRNb2RlLAorICAgIFNwYXRpYWxEZWNDb25jZWFsbWVudEluZm8gKmNvbmNlYWxtZW50SW5mbywgU0NIQVIgb3R0VnNUb3REYk1vZGUsCisgICAgRklYUF9EQkwgKCpwT3R0VnNUb3REYkluKVtNQVhfUEFSQU1FVEVSX1NFVFNdW01BWF9QQVJBTUVURVJfQkFORFNdLAorICAgIEZJWFBfREJMICgqcE90dFZzVG90RGIxKVtNQVhfUEFSQU1FVEVSX1NFVFNdW01BWF9QQVJBTUVURVJfQkFORFNdLAorICAgIEZJWFBfREJMICgqcE90dFZzVG90RGIyKVtNQVhfUEFSQU1FVEVSX1NFVFNdW01BWF9QQVJBTUVURVJfQkFORFNdKSB7CisgIGludCBhUGFyYW1TbG90c1tNQVhfUEFSQU1FVEVSX1NFVFNdOworICBpbnQgYUludGVycG9sYXRlW01BWF9QQVJBTUVURVJfU0VUU107CisKKyAgaW50IGRhdGFTZXRzOworICBpbnQgYU1hcFtNQVhfUEFSQU1FVEVSX0JBTkRTICsgMV07CisKKyAgaW50IHNldElkeCwgaSwgYmFuZCwgcGFybVNsb3Q7CisgIGludCBkYXRhQmFuZHM7CisgIGludCBwcywgcGI7CisgIGludCBpMTsKKworICBpZiAobnVtUGFyYW1ldGVyU2V0cyA+IE1BWF9QQVJBTUVURVJfU0VUUykgcmV0dXJuIE1QU19XUk9OR19QQVJBTUVURVJTRVRTOworCisgIGRhdGFTZXRzID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IG51bVBhcmFtZXRlclNldHM7IGkrKykgeworICAgIGlmIChsbERhdGEtPmJzWFhYRGF0YU1vZGVbaV0gPT0gMykgeworICAgICAgYVBhcmFtU2xvdHNbZGF0YVNldHNdID0gaTsKKyAgICAgIGRhdGFTZXRzKys7CisgICAgfQorICB9CisKKyAgc2V0SWR4ID0gMDsKKworICAvKiBNYWluIGNvbmNlYWxtZW50IHN0YWdlIGlzIGhlcmU6ICovCisgIFNwYXRpYWxEZWNDb25jZWFsbWVudF9BcHBseSgKKyAgICAgIGNvbmNlYWxtZW50SW5mbywgY21wSWR4RGF0YVt4dHRJZHhdLAorICAgICAgKGRpZmZJZHhEYXRhICE9IE5VTEwpID8gZGlmZklkeERhdGFbeHR0SWR4XSA6IE5VTEwsIGlkeFByZXZbeHR0SWR4XSwKKyAgICAgIGxsRGF0YS0+YnNYWFhEYXRhTW9kZSwgc3RhcnRCYW5kLCBzdG9wQmFuZCwgZGVmYXVsdFZhbHVlLCBwYXJhbVR5cGUsCisgICAgICBudW1QYXJhbWV0ZXJTZXRzKTsKKworICAvKiBQcmVwYXJlIGRhdGEgKi8KKyAgZm9yIChpID0gMDsgaSA8IG51bVBhcmFtZXRlclNldHM7IGkrKykgeworICAgIGlmIChsbERhdGEtPmJzWFhYRGF0YU1vZGVbaV0gPT0gMCkgeworICAgICAgbGxEYXRhLT5ub2NtcFF1YW50Q29hcnNlWFhYW2ldID0gMDsKKyAgICAgIGZvciAoYmFuZCA9IHN0YXJ0QmFuZDsgYmFuZCA8IHN0b3BCYW5kOyBiYW5kKyspIHsKKyAgICAgICAgb3V0cHV0SWR4RGF0YVt4dHRJZHhdW2ldW2JhbmRdID0gZGVmYXVsdFZhbHVlOworICAgICAgfQorICAgICAgZm9yIChiYW5kID0gc3RhcnRCYW5kOyBiYW5kIDwgc3RvcEJhbmQ7IGJhbmQrKykgeworICAgICAgICBpZHhQcmV2W3h0dElkeF1bYmFuZF0gPSBvdXRwdXRJZHhEYXRhW3h0dElkeF1baV1bYmFuZF07CisgICAgICB9CisgICAgICAvKiBCZWNhdXNlIHRoZSBpZHhQcmV2IGFyZSBhbHNvIHNldCB0byB0aGUgZGVmYXVsdFZhbHVlIC0+IHNpZ25hbGl6ZSBmaW5lCisgICAgICAgKi8KKyAgICAgIGxsRGF0YS0+c3RhdGUtPmJzUXVhbnRDb2Fyc2VYWFhwcmV2ID0gMDsKKyAgICB9CisKKyAgICBpZiAobGxEYXRhLT5ic1hYWERhdGFNb2RlW2ldID09IDEpIHsKKyAgICAgIGZvciAoYmFuZCA9IHN0YXJ0QmFuZDsgYmFuZCA8IHN0b3BCYW5kOyBiYW5kKyspIHsKKyAgICAgICAgb3V0cHV0SWR4RGF0YVt4dHRJZHhdW2ldW2JhbmRdID0gaWR4UHJldlt4dHRJZHhdW2JhbmRdOworICAgICAgfQorICAgICAgbGxEYXRhLT5ub2NtcFF1YW50Q29hcnNlWFhYW2ldID0gbGxEYXRhLT5zdGF0ZS0+YnNRdWFudENvYXJzZVhYWHByZXY7CisgICAgfQorCisgICAgaWYgKGxsRGF0YS0+YnNYWFhEYXRhTW9kZVtpXSA9PSAyKSB7CisgICAgICBmb3IgKGJhbmQgPSBzdGFydEJhbmQ7IGJhbmQgPCBzdG9wQmFuZDsgYmFuZCsrKSB7CisgICAgICAgIG91dHB1dElkeERhdGFbeHR0SWR4XVtpXVtiYW5kXSA9IGlkeFByZXZbeHR0SWR4XVtiYW5kXTsKKyAgICAgIH0KKyAgICAgIGxsRGF0YS0+bm9jbXBRdWFudENvYXJzZVhYWFtpXSA9IGxsRGF0YS0+c3RhdGUtPmJzUXVhbnRDb2Fyc2VYWFhwcmV2OworICAgICAgYUludGVycG9sYXRlW2ldID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgYUludGVycG9sYXRlW2ldID0gMDsKKyAgICB9CisKKyAgICBpZiAobGxEYXRhLT5ic1hYWERhdGFNb2RlW2ldID09IDMpIHsKKyAgICAgIGludCBzdHJpZGU7CisKKyAgICAgIHBhcm1TbG90ID0gYVBhcmFtU2xvdHNbc2V0SWR4XTsKKyAgICAgIHN0cmlkZSA9IHBiU3RyaWRlVGFibGVbbGxEYXRhLT5ic0ZyZXFSZXNTdHJpZGVYWFhbc2V0SWR4XV07CisgICAgICBkYXRhQmFuZHMgPSAoc3RvcEJhbmQgLSBzdGFydEJhbmQgLSAxKSAvIHN0cmlkZSArIDE7CisgICAgICBjcmVhdGVNYXBwaW5nKGFNYXAsIHN0YXJ0QmFuZCwgc3RvcEJhbmQsIHN0cmlkZSk7CisgICAgICBtYXBGcmVxdWVuY3koJmNtcElkeERhdGFbeHR0SWR4XVtzZXRJZHhdWzBdLAorICAgICAgICAgICAgICAgICAgICZvdXRwdXRJZHhEYXRhW3h0dElkeF1bcGFybVNsb3RdWzBdLCBhTWFwLCBkYXRhQmFuZHMpOworICAgICAgZm9yIChiYW5kID0gc3RhcnRCYW5kOyBiYW5kIDwgc3RvcEJhbmQ7IGJhbmQrKykgeworICAgICAgICBpZHhQcmV2W3h0dElkeF1bYmFuZF0gPSBvdXRwdXRJZHhEYXRhW3h0dElkeF1bcGFybVNsb3RdW2JhbmRdOworICAgICAgfQorICAgICAgbGxEYXRhLT5zdGF0ZS0+YnNRdWFudENvYXJzZVhYWHByZXYgPSBsbERhdGEtPmJzUXVhbnRDb2Fyc2VYWFhbc2V0SWR4XTsKKyAgICAgIGxsRGF0YS0+bm9jbXBRdWFudENvYXJzZVhYWFtpXSA9IGxsRGF0YS0+YnNRdWFudENvYXJzZVhYWFtzZXRJZHhdOworCisgICAgICBzZXRJZHgrKzsKKyAgICB9CisgICAgaWYgKGRpZmZJZHhEYXRhICE9IE5VTEwpIHsKKyAgICAgIGZvciAoYmFuZCA9IHN0YXJ0QmFuZDsgYmFuZCA8IHN0b3BCYW5kOyBiYW5kKyspIHsKKyAgICAgICAgb3V0cHV0SWR4RGF0YVt4dHRJZHhdW2ldW2JhbmRdICs9IGRpZmZJZHhEYXRhW3h0dElkeF1baV1bYmFuZF07CisgICAgICB9CisgICAgfQorICB9IC8qIGZvciggaSA9IDAgOyBpIDwgbnVtUGFyYW1ldGVyU2V0czsgaSsrICkgKi8KKworICAvKiBNYXAgYWxsIGNvYXJzZSBkYXRhIHRvIGZpbmUgKi8KKyAgZm9yIChpID0gMDsgaSA8IG51bVBhcmFtZXRlclNldHM7IGkrKykgeworICAgIGlmIChsbERhdGEtPm5vY21wUXVhbnRDb2Fyc2VYWFhbaV0gPT0gMSkgeworICAgICAgY29hcnNlMmZpbmUob3V0cHV0SWR4RGF0YVt4dHRJZHhdW2ldLCAoREFUQV9UWVBFKXBhcmFtVHlwZSwgc3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgc3RvcEJhbmQgLSBzdGFydEJhbmQpOworICAgICAgbGxEYXRhLT5ub2NtcFF1YW50Q29hcnNlWFhYW2ldID0gMDsKKyAgICB9CisgIH0KKworICAvKiBJbnRlcnBvbGF0ZSAqLworICBpMSA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBudW1QYXJhbWV0ZXJTZXRzOyBpKyspIHsKKyAgICBpbnQgeGksIGkyLCB4MSwgeDI7CisKKyAgICBpZiAoYUludGVycG9sYXRlW2ldICE9IDEpIHsKKyAgICAgIGkxID0gaTsKKyAgICB9CisgICAgaTIgPSBpOworICAgIHdoaWxlIChhSW50ZXJwb2xhdGVbaTJdID09IDEpIHsKKyAgICAgIGkyKys7CisgICAgfQorICAgIHgxID0gcGFyYW1TbG90W2kxXTsKKyAgICB4aSA9IHBhcmFtU2xvdFtpXTsKKyAgICB4MiA9IHBhcmFtU2xvdFtpMl07CisKKyAgICBpZiAoYUludGVycG9sYXRlW2ldID09IDEpIHsKKyAgICAgIGlmIChpMiA+PSBudW1QYXJhbWV0ZXJTZXRzKSByZXR1cm4gTVBTX1dST05HX1BBUkFNRVRFUlNFVFM7CisgICAgICBmb3IgKGJhbmQgPSBzdGFydEJhbmQ7IGJhbmQgPCBzdG9wQmFuZDsgYmFuZCsrKSB7CisgICAgICAgIGludCB5aSwgeTEsIHkyOworICAgICAgICB5MSA9IG91dHB1dElkeERhdGFbeHR0SWR4XVtpMV1bYmFuZF07CisgICAgICAgIHkyID0gb3V0cHV0SWR4RGF0YVt4dHRJZHhdW2kyXVtiYW5kXTsKKyAgICAgICAgaWYgKHgxICE9IHgyKSB7CisgICAgICAgICAgeWkgPSB5MSArICh4aSAtIHgxKSAqICh5MiAtIHkxKSAvICh4MiAtIHgxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB5aSA9IHkxIC8qKyAoeGkteDEpKih5Mi15MSkvMWUtMTIqLzsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXRJZHhEYXRhW3h0dElkeF1baV1bYmFuZF0gPSB5aTsKKyAgICAgIH0KKyAgICB9CisgIH0gLyogZm9yKCBpID0gMCA7IGkgPCBudW1QYXJhbWV0ZXJTZXRzOyBpKysgKSAqLworCisgIC8qIERlcXVhbnRpemUgZGF0YSBhbmQgYXBwbHkgZmFjdG9yQ0xEIGlmIG5lY2Vzc2FyeSAqLworICBmb3IgKHBzID0gMDsgcHMgPCBudW1QYXJhbWV0ZXJTZXRzOyBwcysrKSB7CisgICAgaWYgKHF1YW50TW9kZSAmJiAocGFyYW1UeXBlID09IHRfQ0xEKSkgeworICAgICAgaWYgKHBPdHRWc1RvdERiSW4gPT0gMCkgcmV0dXJuIE1QU19XUk9OR19PVFQ7CisgICAgICBpZiAoKHBPdHRWc1RvdERiMSA9PSAwKSAmJiAob3R0VnNUb3REYk1vZGUgPT0gb3R0VnNUb3REYjFBY3RpdikpCisgICAgICAgIHJldHVybiBNUFNfV1JPTkdfT1RUOworICAgICAgaWYgKChwT3R0VnNUb3REYjIgPT0gMCkgJiYgKG90dFZzVG90RGJNb2RlID09IG90dFZzVG90RGIyQWN0aXYpKQorICAgICAgICByZXR1cm4gTVBTX1dST05HX09UVDsKKworICAgICAgZm9yIChwYiA9IHN0YXJ0QmFuZDsgcGIgPCBzdG9wQmFuZDsgcGIrKykgeworICAgICAgICBmYWN0b3JDTEQoJihvdXRwdXRJZHhEYXRhW3h0dElkeF1bcHNdW3BiXSksICgqcE90dFZzVG90RGJJbilbcHNdW3BiXSwKKyAgICAgICAgICAgICAgICAgIChwT3R0VnNUb3REYjEgIT0gTlVMTCkgPyAmKCgqcE90dFZzVG90RGIxKVtwc11bcGJdKSA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAocE90dFZzVG90RGIyICE9IE5VTEwpID8gJigoKnBPdHRWc1RvdERiMilbcHNdW3BiXSkgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgb3R0VnNUb3REYk1vZGUsIHF1YW50TW9kZSk7CisgICAgICB9CisgICAgfQorCisgICAgLyogRGVxdWFudGl6ZSBkYXRhICovCisgICAgZm9yIChiYW5kID0gc3RhcnRCYW5kOyBiYW5kIDwgc3RvcEJhbmQ7IGJhbmQrKykgeworICAgICAgb3V0cHV0RGF0YUlkeFt4dHRJZHhdW3BzXVtiYW5kXSA9CisgICAgICAgICAgZGVxSWR4KG91dHB1dElkeERhdGFbeHR0SWR4XVtwc11bYmFuZF0sIHBhcmFtVHlwZSk7CisgICAgICBpZiAob3V0cHV0RGF0YUlkeFt4dHRJZHhdW3BzXVtiYW5kXSA9PSAtMSkgeworICAgICAgICBvdXRwdXREYXRhSWR4W3h0dElkeF1bcHNdW2JhbmRdID0gZGVmYXVsdFZhbHVlOworICAgICAgfQorICAgIH0KKyAgfSAvKiBmb3IoIGkgPSAwIDsgaSA8IG51bVBhcmFtZXRlclNldHM7IGkrKyApICovCisKKyAgaWYgKGV4dGVuZEZyYW1lKSB7CisgICAgZm9yIChiYW5kID0gc3RhcnRCYW5kOyBiYW5kIDwgc3RvcEJhbmQ7IGJhbmQrKykgeworICAgICAgb3V0cHV0RGF0YUlkeFt4dHRJZHhdW251bVBhcmFtZXRlclNldHNdW2JhbmRdID0KKyAgICAgICAgICBvdXRwdXREYXRhSWR4W3h0dElkeF1bbnVtUGFyYW1ldGVyU2V0cyAtIDFdW2JhbmRdOworICAgIH0KKyAgfQorCisgIHJldHVybiBNUFNfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBkZWNvZGVBbmRNYXBGcmFtZU90dAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorICAgRG8gZGVsdGEgZGVjb2RpbmcgYW5kIGRlcXVhbnRpemF0aW9uCisKKyBBcmd1bWVudHM6CisKK0lucHV0OgorCitPdXRwdXQ6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgU0FDREVDX0VSUk9SIGRlY29kZUFuZE1hcEZyYW1lT3R0KEhBTkRMRV9TUEFUSUFMX0RFQyBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEFUSUFMX0JTX0ZSQU1FICpwQ3VyQnMpIHsKKyAgaW50IGksIG90dElkeDsKKyAgaW50IG51bU90dEJveGVzOworCisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisKKyAgbnVtT3R0Qm94ZXMgPSBzZWxmLT5udW1PdHRCb3hlczsKKworICBzd2l0Y2ggKHNlbGYtPnRyZWVDb25maWcpIHsKKyAgICBkZWZhdWx0OiB7CisgICAgICBpZiAoc2VsZi0+cXVhbnRNb2RlICE9IDApIHsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgIH0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1PdHRCb3hlczsgaSsrKSB7CisgICAgICAgIGVyciA9IG1hcEluZGV4RGF0YSgKKyAgICAgICAgICAgICZwQ3VyQnMtPkNMRExvc3NsZXNzRGF0YVtpXSwgLyogTE9TU0xFU1NEQVRBICpsbERhdGEsKi8KKyAgICAgICAgICAgIHNlbGYtPm90dENMRF9fRkRLLCBzZWxmLT5vdXRJZHhEYXRhLAorICAgICAgICAgICAgcEN1ckJzCisgICAgICAgICAgICAgICAgLT5jbXBPdHRDTERpZHgsIC8qIGludAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBJZHhEYXRhW01BWF9OVU1fT1RUXVtNQVhfUEFSQU1FVEVSX1NFVFNdW01BWF9QQVJBTUVURVJfQkFORFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgLyogbm8gZGlmZmVyZW50aWFsIGRhdGEgKi8KKyAgICAgICAgICAgIGksIC8qICBpbnQgICB4dHRJZHgsICBXaGljaCBvdHQvdHR0IGluZGV4IHRvIHVzZSBmb3IgaW5wdXQgYW5kCisgICAgICAgICAgICAgICAgICBvdXRwdXQgYnVmZmVycyAqLworICAgICAgICAgICAgc2VsZi0+b3R0Q0xEaWR4UHJldiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4UHJldltNQVhfTlVNX09UVF1bTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgaSwgdF9DTEQsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnQgICBzdGFydEJhbmQsICovCisgICAgICAgICAgICBzZWxmLT5wQ29uZmlnQ3VycmVudC0+Yml0c3RyZWFtT3R0QmFuZHNbaV0sIC8qICBpbnQgICBzdG9wQmFuZCwgKi8KKyAgICAgICAgICAgIHNlbGYtPnBDb25maWdDdXJyZW50LT5vdHRDTERkZWZhdWx0W2ldLCAvKiBpbnQgICBkZWZhdWx0VmFsdWUsICovCisgICAgICAgICAgICBwQ3VyQnMtPm51bVBhcmFtZXRlclNldHMsIC8qIGludCAgIG51bVBhcmFtZXRlclNldHMpICovCisgICAgICAgICAgICBwQ3VyQnMtPnBhcmFtU2xvdCwgc2VsZi0+ZXh0ZW5kRnJhbWUsIHNlbGYtPnF1YW50TW9kZSwKKyAgICAgICAgICAgICYoc2VsZi0+Y29uY2VhbEluZm8pLCBvdHRWc1RvdEluYWN0aXYsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoZXJyICE9IE1QU19PSykgZ290byBiYWlsOworCisgICAgICB9IC8qIGZvcihpID0gMDsgaSA8IG51bU90dEJveGVzIDsgaSsrICkgKi8KKyAgICAgIGJyZWFrOworICB9IC8qIGNhc2UgKi8KKworICBmb3IgKG90dElkeCA9IDA7IG90dElkeCA8IG51bU90dEJveGVzOyBvdHRJZHgrKykgeworICAgIC8qIFJlYWQgSUNDICovCisgICAgZXJyID0gbWFwSW5kZXhEYXRhKAorICAgICAgICAmcEN1ckJzLT5JQ0NMb3NzbGVzc0RhdGFbb3R0SWR4XSwgLyogTE9TU0xFU1NEQVRBICpsbERhdGEsKi8KKyAgICAgICAgc2VsZi0+b3R0SUNDX19GREssIHNlbGYtPm91dElkeERhdGEsCisgICAgICAgIHBDdXJCcworICAgICAgICAgICAgLT5jbXBPdHRJQ0NpZHgsICAvKiBpbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21wSWR4RGF0YVtNQVhfTlVNX09UVF1bTUFYX1BBUkFNRVRFUl9TRVRTXVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIHNlbGYtPm90dElDQ2RpZmZpZHgsIC8qIGRpZmZlcmVudGlhbCBkYXRhICovCisgICAgICAgIG90dElkeCwgLyogaW50ICAgeHR0SWR4LCAgV2hpY2ggb3R0L3R0dCBpbmRleCB0byB1c2UgZm9yIGlucHV0IGFuZAorICAgICAgICAgICAgICAgICAgIG91dHB1dCBidWZmZXJzICovCisgICAgICAgIHNlbGYtPm90dElDQ2lkeFByZXYsIC8qIGludCAgIGlkeFByZXZbTUFYX05VTV9PVFRdW01BWF9QQVJBTUVURVJfQkFORFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgb3R0SWR4LCB0X0lDQywgMCwgICAgLyogaW50ICAgc3RhcnRCYW5kLCAqLworICAgICAgICBzZWxmLT5wQ29uZmlnQ3VycmVudC0+Yml0c3RyZWFtT3R0QmFuZHNbb3R0SWR4XSwgLyogaW50ICAgc3RvcEJhbmQsICovCisgICAgICAgIElDQ2RlZmF1bHQsICAgICAgICAgICAgICAgLyogaW50ICAgZGVmYXVsdFZhbHVlLCAqLworICAgICAgICBwQ3VyQnMtPm51bVBhcmFtZXRlclNldHMsIC8qIGludCAgIG51bVBhcmFtZXRlclNldHMpICovCisgICAgICAgIHBDdXJCcy0+cGFyYW1TbG90LCBzZWxmLT5leHRlbmRGcmFtZSwgc2VsZi0+cXVhbnRNb2RlLAorICAgICAgICAmKHNlbGYtPmNvbmNlYWxJbmZvKSwgb3R0VnNUb3RJbmFjdGl2LCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZXJyICE9IE1QU19PSykgZ290byBiYWlsOworICB9IC8qIG90dElkeCAqLworCisgIGlmICgoc2VsZi0+dHJlZUNvbmZpZyA9PSBUUkVFXzIxMikgJiYgKHNlbGYtPnBoYXNlQ29kaW5nKSkgeworICAgIGlmIChwQ3VyQnMtPnBoYXNlTW9kZSA9PSAwKSB7CisgICAgICBmb3IgKGludCBwYiA9IDA7IHBiIDwgc2VsZi0+cENvbmZpZ0N1cnJlbnQtPm51bU90dEJhbmRzSVBEOyBwYisrKSB7CisgICAgICAgIHNlbGYtPm90dElQRGlkeFByZXZbMF1bcGJdID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChvdHRJZHggPSAwOyBvdHRJZHggPCBudW1PdHRCb3hlczsgb3R0SWR4KyspIHsKKyAgICAgIGVyciA9IG1hcEluZGV4RGF0YSgKKyAgICAgICAgICAmcEN1ckJzLT5JUERMb3NzbGVzc0RhdGFbb3R0SWR4XSwgc2VsZi0+b3R0SVBEX19GREssIHNlbGYtPm91dElkeERhdGEsCisgICAgICAgICAgcEN1ckJzLT5jbXBPdHRJUERpZHgsIE5VTEwsIG90dElkeCwgc2VsZi0+b3R0SVBEaWR4UHJldiwgb3R0SWR4LAorICAgICAgICAgIHRfSVBELCAwLCBzZWxmLT5udW1PdHRCYW5kc0lQRCwgSVBEZGVmYXVsdCwgcEN1ckJzLT5udW1QYXJhbWV0ZXJTZXRzLAorICAgICAgICAgIHBDdXJCcy0+cGFyYW1TbG90LCBzZWxmLT5leHRlbmRGcmFtZSwgc2VsZi0+cXVhbnRNb2RlLAorICAgICAgICAgICYoc2VsZi0+Y29uY2VhbEluZm8pLCBvdHRWc1RvdEluYWN0aXYsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIH0KKyAgfQorCitiYWlsOgorCisgIHJldHVybiBNUFNfT0s7CisKK30gLyogZGVjb2RlQW5kTWFwRnJhbWVPdHQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IGRlY29kZUFuZE1hcEZyYW1lU21nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisgICBEZWNvZGUgc21vb3RoaW5nIGZsYWdzCisKKyBBcmd1bWVudHM6CisKK0lucHV0OgorCitPdXRwdXQ6CisKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBTQUNERUNfRVJST1IgZGVjb2RlQW5kTWFwRnJhbWVTbWcoSEFORExFX1NQQVRJQUxfREVDIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNQQVRJQUxfQlNfRlJBTUUgKmZyYW1lKSB7CisgIGludCBwcywgcGIsIHBnLCBwYlN0cmlkZSwgZGF0YUJhbmRzLCBwYlN0YXJ0LCBwYlN0b3AsCisgICAgICBhR3JvdXBUb0JhbmRbTUFYX1BBUkFNRVRFUl9CQU5EUyArIDFdOworCisgIGlmIChmcmFtZS0+bnVtUGFyYW1ldGVyU2V0cyA+IE1BWF9QQVJBTUVURVJfU0VUUykKKyAgICByZXR1cm4gTVBTX1dST05HX1BBUkFNRVRFUlNFVFM7CisgIGlmIChzZWxmLT5iaXRzdHJlYW1QYXJhbWV0ZXJCYW5kcyA+IE1BWF9QQVJBTUVURVJfQkFORFMpCisgICAgcmV0dXJuIE1QU19XUk9OR19QQVJBTUVURVJCQU5EUzsKKworICBmb3IgKHBzID0gMDsgcHMgPCBmcmFtZS0+bnVtUGFyYW1ldGVyU2V0czsgcHMrKykgeworICAgIHN3aXRjaCAoZnJhbWUtPmJzU21vb3RoTW9kZVtwc10pIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgc2VsZi0+c21nVGltZVtwc10gPSAyNTY7CisgICAgICAgIEZES21lbWNsZWFyKHNlbGYtPnNtZ0RhdGFbcHNdLAorICAgICAgICAgICAgICAgICAgICBzZWxmLT5iaXRzdHJlYW1QYXJhbWV0ZXJCYW5kcyAqIHNpemVvZihVQ0hBUikpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAocHMgPiAwKSB7CisgICAgICAgICAgc2VsZi0+c21nVGltZVtwc10gPSBzZWxmLT5zbWdUaW1lW3BzIC0gMV07CisgICAgICAgICAgRkRLbWVtY3B5KHNlbGYtPnNtZ0RhdGFbcHNdLCBzZWxmLT5zbWdEYXRhW3BzIC0gMV0sCisgICAgICAgICAgICAgICAgICAgIHNlbGYtPmJpdHN0cmVhbVBhcmFtZXRlckJhbmRzICogc2l6ZW9mKFVDSEFSKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2VsZi0+c21nVGltZVtwc10gPSBzZWxmLT5zbW9vdGhTdGF0ZS0+cHJldlNtZ1RpbWU7CisgICAgICAgICAgRkRLbWVtY3B5KHNlbGYtPnNtZ0RhdGFbcHNdLCBzZWxmLT5zbW9vdGhTdGF0ZS0+cHJldlNtZ0RhdGEsCisgICAgICAgICAgICAgICAgICAgIHNlbGYtPmJpdHN0cmVhbVBhcmFtZXRlckJhbmRzICogc2l6ZW9mKFVDSEFSKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgc2VsZi0+c21nVGltZVtwc10gPSBzbWdUaW1lVGFibGVbZnJhbWUtPmJzU21vb3RoVGltZVtwc11dOworICAgICAgICBmb3IgKHBiID0gMDsgcGIgPCBzZWxmLT5iaXRzdHJlYW1QYXJhbWV0ZXJCYW5kczsgcGIrKykgeworICAgICAgICAgIHNlbGYtPnNtZ0RhdGFbcHNdW3BiXSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgc2VsZi0+c21nVGltZVtwc10gPSBzbWdUaW1lVGFibGVbZnJhbWUtPmJzU21vb3RoVGltZVtwc11dOworICAgICAgICBwYlN0cmlkZSA9IHBiU3RyaWRlVGFibGVbZnJhbWUtPmJzRnJlcVJlc1N0cmlkZVNtZ1twc11dOworICAgICAgICBkYXRhQmFuZHMgPSAoc2VsZi0+Yml0c3RyZWFtUGFyYW1ldGVyQmFuZHMgLSAxKSAvIHBiU3RyaWRlICsgMTsKKyAgICAgICAgY3JlYXRlTWFwcGluZyhhR3JvdXBUb0JhbmQsIDAsIHNlbGYtPmJpdHN0cmVhbVBhcmFtZXRlckJhbmRzLCBwYlN0cmlkZSk7CisgICAgICAgIGZvciAocGcgPSAwOyBwZyA8IGRhdGFCYW5kczsgcGcrKykgeworICAgICAgICAgIHBiU3RhcnQgPSBhR3JvdXBUb0JhbmRbcGddOworICAgICAgICAgIHBiU3RvcCA9IGFHcm91cFRvQmFuZFtwZyArIDFdOworICAgICAgICAgIGZvciAocGIgPSBwYlN0YXJ0OyBwYiA8IHBiU3RvcDsgcGIrKykgeworICAgICAgICAgICAgc2VsZi0+c21nRGF0YVtwc11bcGJdID0gZnJhbWUtPmJzU21nRGF0YVtwc11bcGddOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBzZWxmLT5zbW9vdGhTdGF0ZS0+cHJldlNtZ1RpbWUgPSBzZWxmLT5zbWdUaW1lW2ZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzIC0gMV07CisgIEZES21lbWNweShzZWxmLT5zbW9vdGhTdGF0ZS0+cHJldlNtZ0RhdGEsCisgICAgICAgICAgICBzZWxmLT5zbWdEYXRhW2ZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzIC0gMV0sCisgICAgICAgICAgICBzZWxmLT5iaXRzdHJlYW1QYXJhbWV0ZXJCYW5kcyAqIHNpemVvZihVQ0hBUikpOworCisgIGlmIChzZWxmLT5leHRlbmRGcmFtZSkgeworICAgIHNlbGYtPnNtZ1RpbWVbZnJhbWUtPm51bVBhcmFtZXRlclNldHNdID0KKyAgICAgICAgc2VsZi0+c21nVGltZVtmcmFtZS0+bnVtUGFyYW1ldGVyU2V0cyAtIDFdOworICAgIEZES21lbWNweShzZWxmLT5zbWdEYXRhW2ZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzXSwKKyAgICAgICAgICAgICAgc2VsZi0+c21nRGF0YVtmcmFtZS0+bnVtUGFyYW1ldGVyU2V0cyAtIDFdLAorICAgICAgICAgICAgICBzZWxmLT5iaXRzdHJlYW1QYXJhbWV0ZXJCYW5kcyAqIHNpemVvZihVQ0hBUikpOworICB9CisKKyAgcmV0dXJuIE1QU19PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IGRlY29kZUFuZE1hcEZyYW1lQXJiZG14CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisgICBEbyBkZWx0YSBkZWNvZGluZyBhbmQgZGVxdWFudGl6YXRpb24KKworIEFyZ3VtZW50czoKKworSW5wdXQ6CisKK091dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBTQUNERUNfRVJST1IgZGVjb2RlQW5kTWFwRnJhbWVBcmJkbXgoSEFORExFX1NQQVRJQUxfREVDIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNQQVRJQUxfQlNfRlJBTUUgKmZyYW1lKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIGludCBjaDsKKyAgaW50IG9mZnNldCA9IHNlbGYtPm51bU90dEJveGVzOworCisgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPm51bUlucHV0Q2hhbm5lbHM7IGNoKyspIHsKKyAgICBlcnIgPSBtYXBJbmRleERhdGEoJmZyYW1lLT5DTERMb3NzbGVzc0RhdGFbb2Zmc2V0ICsgY2hdLAorICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5hcmJkbXhHYWluX19GREssIHNlbGYtPm91dElkeERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5jbXBBcmJkbXhHYWluSWR4LCBOVUxMLCAvKiBubyBkaWZmZXJlbnRpYWwgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICBjaCwgc2VsZi0+YXJiZG14R2FpbklkeFByZXYsIG9mZnNldCArIGNoLCB0X0NMRCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+Yml0c3RyZWFtUGFyYW1ldGVyQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgIDAgLypzZWxmLT5hcmJkbXhHYWluRGVmYXVsdCovLCBmcmFtZS0+bnVtUGFyYW1ldGVyU2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnBhcmFtU2xvdCwgc2VsZi0+ZXh0ZW5kRnJhbWUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICYoc2VsZi0+Y29uY2VhbEluZm8pLCBvdHRWc1RvdEluYWN0aXYsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGlmIChlcnIgIT0gTVBTX09LKSBnb3RvIGJhaWw7CisgIH0KKworYmFpbDoKKyAgcmV0dXJuIGVycjsKK30gLyogZGVjb2RlQW5kTWFwRnJhbWVBcmJkbXggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IFNwYXRpYWxEZWNEZWNvZGVGcmFtZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNEZWNvZGVGcmFtZShzcGF0aWFsRGVjICpzZWxmLCBTUEFUSUFMX0JTX0ZSQU1FICpmcmFtZSkgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworCisgIHNlbGYtPmV4dGVuZEZyYW1lID0gMDsKKyAgaWYgKGZyYW1lLT5wYXJhbVNsb3RbZnJhbWUtPm51bVBhcmFtZXRlclNldHMgLSAxXSAhPSBzZWxmLT50aW1lU2xvdHMgLSAxKSB7CisgICAgc2VsZi0+ZXh0ZW5kRnJhbWUgPSAxOworICB9CisKKyAgc2VsZi0+VHNkVHMgPSAwOworCisgIC8qKioqKiogRFRERiBhbmQgTUFQIERBVEEgKioqKioqKiovCisgIGlmICgoZXJyID0gZGVjb2RlQW5kTWFwRnJhbWVPdHQoc2VsZiwgZnJhbWUpKSAhPSBNUFNfT0spIGdvdG8gYmFpbDsKKworICBpZiAoKGVyciA9IGRlY29kZUFuZE1hcEZyYW1lU21nKHNlbGYsIGZyYW1lKSkgIT0gTVBTX09LKSBnb3RvIGJhaWw7CisKKyAgaWYgKHNlbGYtPmFyYml0cmFyeURvd25taXggIT0gMCkgeworICAgIGlmICgoZXJyID0gZGVjb2RlQW5kTWFwRnJhbWVBcmJkbXgoc2VsZiwgZnJhbWUpKSAhPSBNUFNfT0spIGdvdG8gYmFpbDsKKyAgfQorCisgIGlmIChzZWxmLT5leHRlbmRGcmFtZSkgeworICAgIGZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzID0KKyAgICAgICAgZml4TWluKE1BWF9QQVJBTUVURVJfU0VUUywgZnJhbWUtPm51bVBhcmFtZXRlclNldHMgKyAxKTsKKyAgICBmcmFtZS0+cGFyYW1TbG90W2ZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzIC0gMV0gPSBzZWxmLT50aW1lU2xvdHMgLSAxOworICB9CisKK2JhaWw6CisgIHJldHVybiBlcnI7Cit9IC8qIFNwYXRpYWxEZWNEZWNvZGVGcmFtZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBTcGF0aWFsRGVjb2RlSGVhZGVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6CisKKyBSZXR1cm46CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjRGVjb2RlSGVhZGVyKAorICAgIHNwYXRpYWxEZWMgKnNlbGYsIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3BhdGlhbFNwZWNpZmljQ29uZmlnKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIGludCBpOworCisgIHNlbGYtPnNhbXBsaW5nRnJlcSA9IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnNhbXBsaW5nRnJlcTsKKyAgc2VsZi0+dGltZVNsb3RzID0gcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+blRpbWVTbG90czsKKyAgc2VsZi0+ZnJhbWVMZW5ndGggPSBzZWxmLT50aW1lU2xvdHMgKiBzZWxmLT5xbWZCYW5kczsKKyAgc2VsZi0+Yml0c3RyZWFtUGFyYW1ldGVyQmFuZHMgPSBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5mcmVxUmVzOworCisgIGlmIChzZWxmLT5wQ29uZmlnQ3VycmVudC0+c3ludGF4RmxhZ3MgJiBTQUNERUNfU1lOVEFYX0xEKQorICAgIHNlbGYtPmh5YnJpZEJhbmRzID0gc2VsZi0+cW1mQmFuZHM7CisgIGVsc2UKKyAgICBzZWxmLT5oeWJyaWRCYW5kcyA9IFNhY0dldEh5YnJpZFN1YmJhbmRzKHNlbGYtPnFtZkJhbmRzKTsKKyAgc2VsZi0+dHBfaHliQmFuZEJvcmRlciA9IDEyOworCisgIHNlbGYtPm51bVBhcmFtZXRlckJhbmRzID0gc2VsZi0+Yml0c3RyZWFtUGFyYW1ldGVyQmFuZHM7CisKKyAgaWYgKHNlbGYtPnBDb25maWdDdXJyZW50LT5zeW50YXhGbGFncyAmIFNBQ0RFQ19TWU5UQVhfTEQpIHsKKyAgICBzd2l0Y2ggKHNlbGYtPm51bVBhcmFtZXRlckJhbmRzKSB7CisgICAgICBjYXNlIDQ6CisgICAgICAgIHNlbGYtPmtlcm5lbHMgPSBrZXJuZWxzXzRfdG9fNjQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1OgorICAgICAgICBzZWxmLT5rZXJuZWxzID0ga2VybmVsc181X3RvXzY0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgc2VsZi0+a2VybmVscyA9IGtlcm5lbHNfN190b182NDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDk6CisgICAgICAgIHNlbGYtPmtlcm5lbHMgPSBrZXJuZWxzXzlfdG9fNjQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMjoKKyAgICAgICAgc2VsZi0+a2VybmVscyA9IGtlcm5lbHNfMTJfdG9fNjQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNToKKyAgICAgICAgc2VsZi0+a2VybmVscyA9IGtlcm5lbHNfMTVfdG9fNjQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyMzoKKyAgICAgICAgc2VsZi0+a2VybmVscyA9IGtlcm5lbHNfMjNfdG9fNjQ7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE1QU19JTlZBTElEX1BBUkFNRVRFUkJBTkRTOyAvKiB1bnN1cHBvcnRlZCBudW1QYXJhbWV0ZXJCYW5kcyAqLworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKHNlbGYtPm51bVBhcmFtZXRlckJhbmRzKSB7CisgICAgICBjYXNlIDQ6CisgICAgICAgIHNlbGYtPmtlcm5lbHMgPSBrZXJuZWxzXzRfdG9fNzE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1OgorICAgICAgICBzZWxmLT5rZXJuZWxzID0ga2VybmVsc181X3RvXzcxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgc2VsZi0+a2VybmVscyA9IGtlcm5lbHNfN190b183MTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEwOgorICAgICAgICBzZWxmLT5rZXJuZWxzID0ga2VybmVsc18xMF90b183MTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE0OgorICAgICAgICBzZWxmLT5rZXJuZWxzID0ga2VybmVsc18xNF90b183MTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIwOgorICAgICAgICBzZWxmLT5rZXJuZWxzID0ga2VybmVsc18yMF90b183MTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI4OgorICAgICAgICBzZWxmLT5rZXJuZWxzID0ga2VybmVsc18yOF90b183MTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTVBTX0lOVkFMSURfUEFSQU1FVEVSQkFORFM7IC8qIHVuc3VwcG9ydGVkIG51bVBhcmFtZXRlckJhbmRzICovCisgICAgfQorICB9CisKKyAgLyogY3JlYXRlIHBhcmFtIHRvIGh5YiBiYW5kIHRhYmxlICovCisgIEZES21lbWNsZWFyKHNlbGYtPnBhcmFtMmh5YiwgKE1BWF9QQVJBTUVURVJfQkFORFMgKyAxKSAqIHNpemVvZihpbnQpKTsKKyAgZm9yIChpID0gMDsgaSA8IHNlbGYtPmh5YnJpZEJhbmRzOyBpKyspIHsKKyAgICBzZWxmLT5wYXJhbTJoeWJbc2VsZi0+a2VybmVsc1tpXSArIDFdID0gaSArIDE7CisgIH0KKyAgeworICAgIGludCBwYiA9IHNlbGYtPmtlcm5lbHNbaSAtIDFdICsgMjsKKyAgICBmb3IgKDsgcGIgPCAoTUFYX1BBUkFNRVRFUl9CQU5EUyArIDEpOyBwYisrKSB7CisgICAgICBzZWxmLT5wYXJhbTJoeWJbcGJdID0gaTsKKyAgICB9CisgICAgZm9yIChwYiA9IDA7IHBiIDwgTUFYX1BBUkFNRVRFUl9CQU5EUzsgcGIgKz0gMSkgeworICAgICAgc2VsZi0+a2VybmVsc193aWR0aFtwYl0gPSBzZWxmLT5wYXJhbTJoeWJbcGIgKyAxXSAtIHNlbGYtPnBhcmFtMmh5YltwYl07CisgICAgfQorICB9CisKKyAgc2VsZi0+dHJlZUNvbmZpZyA9IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnRyZWVDb25maWc7CisKKyAgc2VsZi0+bnVtT3R0Qm94ZXMgPSBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5uT3R0Qm94ZXM7CisKKyAgc2VsZi0+bnVtSW5wdXRDaGFubmVscyA9IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPm5JbnB1dENoYW5uZWxzOworCisgIHNlbGYtPm51bU91dHB1dENoYW5uZWxzID0gcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+bk91dHB1dENoYW5uZWxzOworCisgIHNlbGYtPnF1YW50TW9kZSA9IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnF1YW50TW9kZTsKKworICBzZWxmLT5hcmJpdHJhcnlEb3dubWl4ID0gcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YkFyYml0cmFyeURvd25taXg7CisKKyAgc2VsZi0+bnVtTTJyb3dzID0gc2VsZi0+bnVtT3V0cHV0Q2hhbm5lbHM7CisKKyAgeworICAgIHNlbGYtPnJlc2lkdWFsQ29kaW5nID0gMDsKKyAgICBpZiAoc2VsZi0+YXJiaXRyYXJ5RG93bm1peCA9PSAyKQorICAgICAgc2VsZi0+YXJiaXRyYXJ5RG93bm1peCA9IDE7IC8qIG5vIGFyYml0cmFyeSBkb3dubWl4IHJlc2lkdWFscyAqLworICB9CisgIGlmICgoc2VsZi0+cENvbmZpZ0N1cnJlbnQtPnN5bnRheEZsYWdzICYgU0FDREVDX1NZTlRBWF9VU0FDKSkgeworICAgIHNlbGYtPnJlc2lkdWFsQ29kaW5nID0gcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YlJlc2lkdWFsQ29kaW5nOworICB9CisKKyAgc2VsZi0+Y2xpcFByb3RlY3RHYWluX19GREsgPQorICAgICAgRlhfQ0ZHMkZYX0RCTChjbGlwR2FpblRhYmxlX19GREtbcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNGaXhlZEdhaW5ETVhdKTsKKyAgc2VsZi0+Y2xpcFByb3RlY3RHYWluU0ZfX0ZESyA9CisgICAgICBjbGlwR2FpblNGVGFibGVfX0ZES1twU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic0ZpeGVkR2FpbkRNWF07CisKKyAgc2VsZi0+dGVtcFNoYXBlQ29uZmlnID0gcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+dGVtcFNoYXBlQ29uZmlnOworCisgIHNlbGYtPmRlY29yckNvbmZpZyA9IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPmRlY29yckNvbmZpZzsKKworICBpZiAoc2VsZi0+dXBtaXhUeXBlID09IFVQTUlYVFlQRV9CWVBBU1MpIHsKKyAgICBzZWxmLT5udW1PdXRwdXRDaGFubmVscyA9IHNlbGYtPm51bUlucHV0Q2hhbm5lbHM7CisgIH0KKworICBzZWxmLT5udW1PdXRwdXRDaGFubmVsc0FUID0gc2VsZi0+bnVtT3V0cHV0Q2hhbm5lbHM7CisKKyAgc2VsZi0+bnVtT3R0QmFuZHNJUEQgPSBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5udW1PdHRCYW5kc0lQRDsKKyAgc2VsZi0+cGhhc2VDb2RpbmcgPSBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic1BoYXNlQ29kaW5nOworICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+bnVtT3R0Qm94ZXM7IGkrKykgeworICAgIHsKKyAgICAgIHNlbGYtPnBDb25maWdDdXJyZW50LT5iaXRzdHJlYW1PdHRCYW5kc1tpXSA9CisgICAgICAgICAgc2VsZi0+Yml0c3RyZWFtUGFyYW1ldGVyQmFuZHM7CisgICAgfQorICAgIHNlbGYtPm51bU90dEJhbmRzW2ldID0gc2VsZi0+cENvbmZpZ0N1cnJlbnQtPmJpdHN0cmVhbU90dEJhbmRzW2ldOworICB9IC8qIGkgKi8KKworICBpZiAoc2VsZi0+cmVzaWR1YWxDb2RpbmcpIHsKKyAgICBpbnQgbnVtQm94ZXMgPSBzZWxmLT5udW1PdHRCb3hlczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQm94ZXM7IGkrKykgeworICAgICAgc2VsZi0+cmVzaWR1YWxQcmVzZW50W2ldID0KKyAgICAgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5SZXNpZHVhbENvbmZpZ1tpXS5iUmVzaWR1YWxQcmVzZW50OworCisgICAgICBpZiAoc2VsZi0+cmVzaWR1YWxQcmVzZW50W2ldKSB7CisgICAgICAgIHNlbGYtPnJlc2lkdWFsQmFuZHNbaV0gPQorICAgICAgICAgICAgcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+UmVzaWR1YWxDb25maWdbaV0ublJlc2lkdWFsQmFuZHM7CisgICAgICAgIC8qIGNvbnZlcnNpb24gZnJvbSBoeWJyaWQgYmFuZHMgdG8gcW1mIGJhbmRzICovCisgICAgICAgIHNlbGYtPnJlc2lkdWFsUU1GQmFuZHNbaV0gPQorICAgICAgICAgICAgZk1heChzZWxmLT5wYXJhbTJoeWJbc2VsZi0+cmVzaWR1YWxCYW5kc1tpXV0gKyAzIC0gMTAsCisgICAgICAgICAgICAgICAgIDMpOyAvKiBzaW1wbGlmaWNhdGlvbiBmb3IgdGhlIGxvd2VzdCAxMCBoeWJyaWQgYmFuZHMgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNlbGYtPnJlc2lkdWFsQmFuZHNbaV0gPSAwOworICAgICAgICBzZWxmLT5yZXNpZHVhbFFNRkJhbmRzW2ldID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0gLyogc2VsZi0+cmVzaWR1YWxDb2RpbmcgKi8KKyAgZWxzZSB7CisgICAgaW50IGJveGVzID0gc2VsZi0+bnVtT3R0Qm94ZXM7CisgICAgZm9yIChpID0gMDsgaSA8IGJveGVzOyBpICs9IDEpIHsKKyAgICAgIHNlbGYtPnJlc2lkdWFsUHJlc2VudFtpXSA9IDA7CisgICAgICBzZWxmLT5yZXNpZHVhbEJhbmRzW2ldID0gMDsKKyAgICB9CisgIH0KKworICBzd2l0Y2ggKHNlbGYtPnRyZWVDb25maWcpIHsKKyAgICBjYXNlIFRSRUVfMjEyOgorICAgICAgc2VsZi0+bnVtRGlyZWt0U2lnbmFscyA9IDE7CisgICAgICBzZWxmLT5udW1EZWNvclNpZ25hbHMgPSAxOworICAgICAgc2VsZi0+bnVtWENoYW5uZWxzID0gMTsKKyAgICAgIGlmIChzZWxmLT5hcmJpdHJhcnlEb3dubWl4ID09IDIpIHsKKyAgICAgICAgc2VsZi0+bnVtWENoYW5uZWxzICs9IDE7CisgICAgICB9CisgICAgICBzZWxmLT5udW1WQ2hhbm5lbHMgPSBzZWxmLT5udW1EaXJla3RTaWduYWxzICsgc2VsZi0+bnVtRGVjb3JTaWduYWxzOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBNUFNfSU5WQUxJRF9UUkVFQ09ORklHOworICB9CisKKyAgc2VsZi0+aGlnaFJhdGVNb2RlID0gcFNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNIaWdoUmF0ZU1vZGU7CisgIHNlbGYtPmRlY29yclR5cGUgPSBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic0RlY29yclR5cGU7CisKKyAgU3BhdGlhbERlY0RlY29kZUhlbHBlckluZm8ocFNwYXRpYWxTcGVjaWZpY0NvbmZpZywgVVBNSVhUWVBFX05PUk1BTCk7CisKKyAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IFNwYXRpYWxEZWNDcmVhdGVCc0ZyYW1lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246IENyZWF0ZSBzcGF0aWFsIGJpdHN0cmVhbSBzdHJ1Y3R1cmUKKworIEFyZ3VtZW50czogICBzcGF0aWFsRGVjKiBzZWxmCisgICAgICAgICAgICAgIGNvbnN0IFNQQVRJQUxfQlNfRlJBTUUgKipic0ZyYW1lCisKKyBSZXR1cm46ICAgICAgLQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNDcmVhdGVCc0ZyYW1lKFNQQVRJQUxfQlNfRlJBTUUgKmJzRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlNfTExfU1RBVEUgKmxsU3RhdGUpIHsKKyAgU1BBVElBTF9CU19GUkFNRSAqcEJzID0gYnNGcmFtZTsKKworICBjb25zdCBpbnQgbWF4TnVtT3R0ID0gTUFYX05VTV9PVFQ7CisgIGNvbnN0IGludCBtYXhOdW1JbnB1dENoYW5uZWxzID0gTUFYX0lOUFVUX0NIQU5ORUxTOworCisgIEZES19BTExPQ0FURV9NRU1PUllfMURfUCgKKyAgICAgIHBCcy0+Y21wT3R0SVBEaWR4LCBtYXhOdW1PdHQgKiBNQVhfUEFSQU1FVEVSX1NFVFMgKiBNQVhfUEFSQU1FVEVSX0JBTkRTLAorICAgICAgU0NIQVIsIFNDSEFSKCopW01BWF9QQVJBTUVURVJfU0VUU11bTUFYX1BBUkFNRVRFUl9CQU5EU10pCisKKyAgLyogQXJiaXRyYXJ5IERvd25taXggKi8KKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRF9QKAorICAgICAgcEJzLT5jbXBBcmJkbXhHYWluSWR4LAorICAgICAgbWF4TnVtSW5wdXRDaGFubmVscyAqIE1BWF9QQVJBTUVURVJfU0VUUyAqIE1BWF9QQVJBTUVURVJfQkFORFMsIFNDSEFSLAorICAgICAgU0NIQVIoKilbTUFYX1BBUkFNRVRFUl9TRVRTXVtNQVhfUEFSQU1FVEVSX0JBTkRTXSkKKworICAvKiBMb3NzbGVzcyBjb250cm9sICovCisgIEZES19BTExPQ0FURV9NRU1PUllfMUQocEJzLT5DTERMb3NzbGVzc0RhdGEsIE1BWF9OVU1fUEFSQU1FVEVSUywgTE9TU0xFU1NEQVRBKQorICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKHBCcy0+SUNDTG9zc2xlc3NEYXRhLCBNQVhfTlVNX1BBUkFNRVRFUlMsIExPU1NMRVNTREFUQSkKKworICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKHBCcy0+SVBETG9zc2xlc3NEYXRhLCBNQVhfTlVNX1BBUkFNRVRFUlMsIExPU1NMRVNTREFUQSkKKworICBwQnMtPm5ld0JzRGF0YSA9IDA7CisgIHBCcy0+bnVtUGFyYW1ldGVyU2V0cyA9IDE7CisKKyAgLyogTGluayBsb3NzbGVzcyBzdGF0ZXMgKi8KKyAgZm9yIChpbnQgeCA9IDA7IHggPCBNQVhfTlVNX1BBUkFNRVRFUlM7IHgrKykgeworICAgIHBCcy0+Q0xETG9zc2xlc3NEYXRhW3hdLnN0YXRlID0gJmxsU3RhdGUtPkNMRExvc3NsZXNzU3RhdGVbeF07CisgICAgcEJzLT5JQ0NMb3NzbGVzc0RhdGFbeF0uc3RhdGUgPSAmbGxTdGF0ZS0+SUNDTG9zc2xlc3NTdGF0ZVt4XTsKKworICAgIHBCcy0+SVBETG9zc2xlc3NEYXRhW3hdLnN0YXRlID0gJmxsU3RhdGUtPklQRExvc3NsZXNzU3RhdGVbeF07CisgIH0KKworICByZXR1cm4gTVBTX09LOworCitiYWlsOgorICByZXR1cm4gTVBTX09VVE9GTUVNT1JZOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogU3BhdGlhbERlY0Nsb3NlQnNGcmFtZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOiBDbG9zZSBzcGF0aWFsIGJpdHN0cmVhbSBzdHJ1Y3R1cmUKKworIEFyZ3VtZW50czogICBzcGF0aWFsRGVjKiBzZWxmCisKKyBSZXR1cm46ICAgICAgLQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBTcGF0aWFsRGVjQ2xvc2VCc0ZyYW1lKFNQQVRJQUxfQlNfRlJBTUUgKnBCcykgeworICBpZiAocEJzICE9IE5VTEwpIHsKKyAgICAvKiBUaGVzZSBhcnJheXMgY29udGFpbiB0aGUgY29tcGFjdCBpbmRpY2VzLCBvbmx5IG9uZSB2YWx1ZSBwZXIgcGJzdHJpZGUsCisgICAgICogb25seSBwYXJhbXNldHMgYWN0dWFsbHkgY29udGFpbmluZyBkYXRhLiAqLworCisgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKHBCcy0+Y21wT3R0SVBEaWR4KTsKKworICAgIC8qIEFyYml0cmFyeSBEb3dubWl4ICovCisgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKHBCcy0+Y21wQXJiZG14R2FpbklkeCk7CisKKyAgICAvKiBMb3NzbGVzcyBjb250cm9sICovCisgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKHBCcy0+SVBETG9zc2xlc3NEYXRhKTsKKyAgICBGREtfRlJFRV9NRU1PUllfMUQocEJzLT5DTERMb3NzbGVzc0RhdGEpOworICAgIEZES19GUkVFX01FTU9SWV8xRChwQnMtPklDQ0xvc3NsZXNzRGF0YSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYlNBQ2RlYy9zcmMvc2FjX2JpdGRlYy5oIGIvbGliU0FDZGVjL3NyYy9zYWNfYml0ZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwYzdkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2RlYy9zcmMvc2FjX2JpdGRlYy5oCkBAIC0wLDAgKzEsMTYxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IFNBQyBEZWMgYml0c3RyZWFtIGRlY29kZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiAgU3BhdGlhbCBBdWRpbyBiaXRzdHJlYW0gZGVjb2RlcgorKi8KKworI2lmbmRlZiBTQUNfQklUREVDX0gKKyNkZWZpbmUgU0FDX0JJVERFQ19ICisKKyNpbmNsdWRlICJzYWNfZGVjLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU0NIQVIgbnVtSW5wdXRDaGFubmVsczsKKyAgU0NIQVIgbnVtT3V0cHV0Q2hhbm5lbHM7CisgIFNDSEFSIG51bU90dEJveGVzOworICBTQ0hBUiBudW1UdHRCb3hlczsKKyAgU0NIQVIgb3R0TW9kZUxmZVtNQVhfTlVNX09UVF07Cit9IFRSRUVQUk9QRVJUSUVTOworCitlbnVtIHsgVFJFRV8yMTIgPSA3LCBUUkVFX0RVTU1ZID0gMjU1IH07CisKK2VudW0geyBRVUFOVF9GSU5FID0gMCwgUVVBTlRfRUJRMSA9IDEsIFFVQU5UX0VCUTIgPSAyIH07CisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjUGFyc2VTcGVjaWZpY0NvbmZpZ0hlYWRlcigKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBiaXRzdHJlYW0sCisgICAgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnBTcGF0aWFsU3BlY2lmaWNDb25maWcsCisgICAgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLCBTUEFUSUFMX0RFQ19VUE1JWF9UWVBFIHVwbWl4VHlwZSk7CisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjUGFyc2VNcHMyMTJDb25maWcoCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gYml0c3RyZWFtLAorICAgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3BhdGlhbFNwZWNpZmljQ29uZmlnLCBpbnQgc2FtcGxpbmdSYXRlLAorICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywgSU5UIHN0ZXJlb0NvbmZpZ0luZGV4LAorICAgIElOVCBjb3JlU2JyRnJhbWVMZW5ndGhJbmRleCk7CisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjUGFyc2VTcGVjaWZpY0NvbmZpZygKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBiaXRzdHJlYW0sCisgICAgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnBTcGF0aWFsU3BlY2lmaWNDb25maWcsIGludCBzYWNIZWFkZXJMZW4sCisgICAgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjKTsKKworaW50IFNwYXRpYWxEZWNEZWZhdWx0U3BlY2lmaWNDb25maWcoCisgICAgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnBTcGF0aWFsU3BlY2lmaWNDb25maWcsCisgICAgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLCBpbnQgc2FtcGxpbmdGcmVxLCBpbnQgblRpbWVTbG90cywKKyAgICBpbnQgc2FjRGVjb2RlckxldmVsLCBpbnQgaXNCbGluZCwgaW50IGNvcmVDaGFubmVscyk7CisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQ3JlYXRlQnNGcmFtZShTUEFUSUFMX0JTX0ZSQU1FICpic0ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJTX0xMX1NUQVRFICpsbFN0YXRlKTsKKwordm9pZCBTcGF0aWFsRGVjQ2xvc2VCc0ZyYW1lKFNQQVRJQUxfQlNfRlJBTUUgKmJzRnJhbWUpOworCitTQUNERUNfRVJST1IgU3BhdGlhbERlY1BhcnNlRnJhbWVEYXRhKAorICAgIHNwYXRpYWxEZWMgKnNlbGYsIFNQQVRJQUxfQlNfRlJBTUUgKmZyYW1lLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBiaXRzdHJlYW0sCisgICAgY29uc3QgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnBTcGF0aWFsU3BlY2lmaWNDb25maWcsIFVQTUlYVFlQRSB1cG1peFR5cGUsCisgICAgaW50IGZHbG9iYWxJbmRlcGVuZGVuY3lGbGFnKTsKKworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNEZWNvZGVGcmFtZShzcGF0aWFsRGVjICpzZWxmLCBTUEFUSUFMX0JTX0ZSQU1FICpmcmFtZSk7CisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjRGVjb2RlSGVhZGVyKAorICAgIHNwYXRpYWxEZWMgKnNlbGYsIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3BhdGlhbFNwZWNpZmljQ29uZmlnKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19jYWxjTTFhbmRNMi5jcHAgYi9saWJTQUNkZWMvc3JjL3NhY19jYWxjTTFhbmRNMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1YTE0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2RlYy9zcmMvc2FjX2NhbGNNMWFuZE0yLmNwcApAQCAtMCwwICsxLDg0OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBTQUMgRGVjIE0xIGFuZCBNMiBjYWxjdWxhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAic2FjX2NhbGNNMWFuZE0yLmgiCisjaW5jbHVkZSAic2FjX2JpdGRlYy5oIgorI2luY2x1ZGUgInNhY19wcm9jZXNzLmgiCisjaW5jbHVkZSAic2FjX3JvbS5oIgorI2luY2x1ZGUgInNhY19zbW9vdGhpbmcuaCIKKyNpbmNsdWRlICJGREtfdHJpZ0ZjdHMuaCIKKworLyogYXNzb3J0ZWQgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cyAqLworCisjZGVmaW5lIEFCU19USFIyIDEuMGUtOQorI2RlZmluZSBTUVJUMl9GREsgXAorICAoKEZJWFBfREJMKUZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMThmKSkgLyogRkRLc3FydCgyLjApIHNjYWxlZCBieSAwLjUgKi8KKworc3RhdGljIHZvaWQgcGFyYW0yVU1YX1BTX19GREsoc3BhdGlhbERlYyogc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIEgxMVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIEgxMltNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIEgyMVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIEgyMltNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGNfbFtNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGNfcltNQVhfUEFSQU1FVEVSX0JBTkRTXSwgaW50IG90dEJveEluZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFyYW1ldGVyU2V0SW5keCwgaW50IHJlc0JhbmRzKTsKKworc3RhdGljIHZvaWQgcGFyYW0yVU1YX1BTX0NvcmVfX0ZESygKKyAgICBjb25zdCBTQ0hBUiBjbGRbTUFYX1BBUkFNRVRFUl9CQU5EU10sIGNvbnN0IFNDSEFSIGljY1tNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICBjb25zdCBpbnQgbnVtT3R0QmFuZHMsIGNvbnN0IGludCByZXNCYW5kcywKKyAgICBGSVhQX0RCTCBIMTFbTUFYX1BBUkFNRVRFUl9CQU5EU10sIEZJWFBfREJMIEgxMltNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICBGSVhQX0RCTCBIMjFbTUFYX1BBUkFNRVRFUl9CQU5EU10sIEZJWFBfREJMIEgyMltNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICBGSVhQX0RCTCBjX2xbTUFYX1BBUkFNRVRFUl9CQU5EU10sIEZJWFBfREJMIGNfcltNQVhfUEFSQU1FVEVSX0JBTkRTXSk7CisKK3N0YXRpYyB2b2lkIHBhcmFtMlVNWF9QU19JUERfT1BEX19GREsoCisgICAgc3BhdGlhbERlYyogc2VsZiwgY29uc3QgU1BBVElBTF9CU19GUkFNRSogZnJhbWUsCisgICAgRklYUF9EQkwgSDExcmVbTUFYX1BBUkFNRVRFUl9CQU5EU10sIEZJWFBfREJMIEgxMnJlW01BWF9QQVJBTUVURVJfQkFORFNdLAorICAgIEZJWFBfREJMIEgyMXJlW01BWF9QQVJBTUVURVJfQkFORFNdLCBGSVhQX0RCTCBIMjJyZVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICBGSVhQX0RCTCBjX2xbTUFYX1BBUkFNRVRFUl9CQU5EU10sIEZJWFBfREJMIGNfcltNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICBpbnQgb3R0Qm94SW5keCwgaW50IHBhcmFtZXRlclNldEluZHgsIGludCByZXNpZHVhbEJhbmRzKTsKKworc3RhdGljIHZvaWQgcGFyYW0yVU1YX1ByZWRpY3Rpb25fX0ZESygKKyAgICBzcGF0aWFsRGVjKiBzZWxmLCBGSVhQX0RCTCBIMTFyZVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICBGSVhQX0RCTCBIMTFpbVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwgRklYUF9EQkwgSDEycmVbTUFYX1BBUkFNRVRFUl9CQU5EU10sCisgICAgRklYUF9EQkwgSDEyaW1bTUFYX1BBUkFNRVRFUl9CQU5EU10sIEZJWFBfREJMIEgyMXJlW01BWF9QQVJBTUVURVJfQkFORFNdLAorICAgIEZJWFBfREJMIEgyMWltW01BWF9QQVJBTUVURVJfQkFORFNdLCBGSVhQX0RCTCBIMjJyZVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICBGSVhQX0RCTCBIMjJpbVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwgaW50IG90dEJveEluZHgsIGludCBwYXJhbWV0ZXJTZXRJbmR4LAorICAgIGludCByZXNCYW5kcyk7CisKKy8qIHN0YXRpYyB2b2lkIFNwYXRpYWxEZWNDYWxjdWxhdGVNMChzcGF0aWFsRGVjKiBzZWxmLGludCBwcyk7ICovCitzdGF0aWMgU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNDYWxjdWxhdGVNMWFuZE0yXzIxMigKKyAgICBzcGF0aWFsRGVjKiBzZWxmLCBpbnQgcHMsIGNvbnN0IFNQQVRJQUxfQlNfRlJBTUUqIGZyYW1lKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IFNwYXRpYWxEZWNHZXRSZXNpZHVhbEluZGV4CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6CisKKyBJbnB1dDoKKworIE91dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBTcGF0aWFsRGVjR2V0UmVzaWR1YWxJbmRleChzcGF0aWFsRGVjKiBzZWxmLCBpbnQgcm93KSB7CisgIHJldHVybiByb3cycmVzaWR1YWxbc2VsZi0+dHJlZUNvbmZpZ11bcm93XTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IFVwZGF0ZUFscGhhCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6CisKKyBJbnB1dDoKKworIE91dHB1dDoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZUFscGhhKHNwYXRpYWxEZWMqIHNlbGYpIHsKKyAgaW50IG5DaEluID0gc2VsZi0+bnVtSW5wdXRDaGFubmVsczsKKyAgaW50IGNoOworCisgIGZvciAoY2ggPSAwOyBjaCA8IG5DaEluOyBjaCsrKSB7CisgICAgRklYUF9EQkwgYWxwaGEgPSAvKiBGTDJGWENPTlNUX0RCTCgxLjBmKSAqLyAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKworICAgIHNlbGYtPmFyYmRteEFscGhhUHJldl9fRkRLW2NoXSA9IHNlbGYtPmFyYmRteEFscGhhX19GREtbY2hdOworCisgICAgc2VsZi0+YXJiZG14QWxwaGFfX0ZES1tjaF0gPSBhbHBoYTsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogU3BhdGlhbERlY0NhbGN1bGF0ZU0xYW5kTTIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRGVzY3JpcHRpb246CisgQXJndW1lbnRzOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQ2FsY3VsYXRlTTFhbmRNMihzcGF0aWFsRGVjKiBzZWxmLCBpbnQgcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1BBVElBTF9CU19GUkFNRSogZnJhbWUpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKworICBpZiAoKHNlbGYtPmFyYml0cmFyeURvd25taXggIT0gMCkgJiYgKHBzID09IDApKSB7CisgICAgdXBkYXRlQWxwaGEoc2VsZik7CisgIH0KKworICBzZWxmLT5wQWN0aXZNMlBhcmFtQmFuZHMgPSBOVUxMOworCisgIHN3aXRjaCAoc2VsZi0+dXBtaXhUeXBlKSB7CisgICAgY2FzZSBVUE1JWFRZUEVfQllQQVNTOgorICAgIGNhc2UgVVBNSVhUWVBFX05PUk1BTDoKKyAgICAgIHN3aXRjaCAoc2VsZi0+dHJlZUNvbmZpZykgeworICAgICAgICBjYXNlIFRSRUVfMjEyOgorICAgICAgICAgIGVyciA9IFNwYXRpYWxEZWNDYWxjdWxhdGVNMWFuZE0yXzIxMihzZWxmLCBwcywgZnJhbWUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGVyciA9IE1QU19XUk9OR19UUkVFQ09ORklHOworICAgICAgfTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGVyciA9IE1QU19XUk9OR19UUkVFQ09ORklHOworICB9CisKKyAgaWYgKGVyciAhPSBNUFNfT0spIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworYmFpbDoKKyAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IFNwYXRpYWxEZWNDYWxjdWxhdGVNMWFuZE0yXzIxMgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFNBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQ2FsY3VsYXRlTTFhbmRNMl8yMTIoCisgICAgc3BhdGlhbERlYyogc2VsZiwgaW50IHBzLCBjb25zdCBTUEFUSUFMX0JTX0ZSQU1FKiBmcmFtZSkgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworICBpbnQgcGI7CisKKyAgRklYUF9EQkwgSDExcmVbTUFYX1BBUkFNRVRFUl9CQU5EU10gPSB7RkwyRlhDT05TVF9EQkwoMC4wZil9OworICBGSVhQX0RCTCBIMTJyZVtNQVhfUEFSQU1FVEVSX0JBTkRTXSA9IHtGTDJGWENPTlNUX0RCTCgwLjBmKX07CisgIEZJWFBfREJMIEgyMXJlW01BWF9QQVJBTUVURVJfQkFORFNdID0ge0ZMMkZYQ09OU1RfREJMKDAuMGYpfTsKKyAgRklYUF9EQkwgSDIycmVbTUFYX1BBUkFNRVRFUl9CQU5EU10gPSB7RkwyRlhDT05TVF9EQkwoMC4wZil9OworICBGSVhQX0RCTCBIMTFpbVtNQVhfUEFSQU1FVEVSX0JBTkRTXSA9IHtGTDJGWENPTlNUX0RCTCgwLjBmKX07CisgIEZJWFBfREJMIEgyMWltW01BWF9QQVJBTUVURVJfQkFORFNdID0ge0ZMMkZYQ09OU1RfREJMKDAuMGYpfTsKKworICBJTlQgcGhhc2VDb2RpbmcgPSBzZWxmLT5waGFzZUNvZGluZzsKKworICBzd2l0Y2ggKHBoYXNlQ29kaW5nKSB7CisgICAgY2FzZSAxOgorICAgICAgLyogcGhhc2UgY29kaW5nOiB5ZXM7IHJlc2lkdWFsczogbm8gKi8KKyAgICAgIHBhcmFtMlVNWF9QU19JUERfT1BEX19GREsoc2VsZiwgZnJhbWUsIEgxMXJlLCBIMTJyZSwgSDIxcmUsIEgyMnJlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBwcywgc2VsZi0+cmVzaWR1YWxCYW5kc1swXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAvKiBwaGFzZSBjb2Rpbmc6IHllczsgcmVzaWR1YWxzOiB5ZXMgKi8KKyAgICAgIHBhcmFtMlVNWF9QcmVkaWN0aW9uX19GREsoc2VsZiwgSDExcmUsIEgxMWltLCBIMTJyZSwgTlVMTCwgSDIxcmUsIEgyMWltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjJyZSwgTlVMTCwgMCwgcHMsIHNlbGYtPnJlc2lkdWFsQmFuZHNbMF0pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChzZWxmLT5yZXNpZHVhbENvZGluZykgeworICAgICAgICAvKiBwaGFzZSBjb2Rpbmc6IG5vOyByZXNpZHVhbHM6IHllcyAqLworICAgICAgICBwYXJhbTJVTVhfUHJlZGljdGlvbl9fRkRLKHNlbGYsIEgxMXJlLCBOVUxMLCBIMTJyZSwgTlVMTCwgSDIxcmUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDIycmUsIE5VTEwsIDAsIHBzLCBzZWxmLT5yZXNpZHVhbEJhbmRzWzBdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHBoYXNlIGNvZGluZzogbm87IHJlc2lkdWFsczogbm8gKi8KKyAgICAgICAgcGFyYW0yVU1YX1BTX19GREsoc2VsZiwgSDExcmUsIEgxMnJlLCBIMjFyZSwgSDIycmUsIE5VTEwsIE5VTEwsIDAsIHBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CisKKyAgZm9yIChwYiA9IDA7IHBiIDwgc2VsZi0+bnVtUGFyYW1ldGVyQmFuZHM7IHBiKyspIHsKKyAgICBzZWxmLT5NMlJlYWxfX0ZES1swXVswXVtwYl0gPSAoSDExcmVbcGJdKTsKKyAgICBzZWxmLT5NMlJlYWxfX0ZES1swXVsxXVtwYl0gPSAoSDEycmVbcGJdKTsKKworICAgIHNlbGYtPk0yUmVhbF9fRkRLWzFdWzBdW3BiXSA9IChIMjFyZVtwYl0pOworICAgIHNlbGYtPk0yUmVhbF9fRkRLWzFdWzFdW3BiXSA9IChIMjJyZVtwYl0pOworICB9CisgIGlmIChwaGFzZUNvZGluZyA9PSAzKSB7CisgICAgZm9yIChwYiA9IDA7IHBiIDwgc2VsZi0+bnVtUGFyYW1ldGVyQmFuZHM7IHBiKyspIHsKKyAgICAgIHNlbGYtPk0ySW1hZ19fRkRLWzBdWzBdW3BiXSA9IChIMTFpbVtwYl0pOworICAgICAgc2VsZi0+TTJJbWFnX19GREtbMV1bMF1bcGJdID0gKEgyMWltW3BiXSk7CisgICAgICBzZWxmLT5NMkltYWdfX0ZES1swXVsxXVtwYl0gPSAoRklYUF9EQkwpMDsgIC8vIEgxMmltW3BiXTsKKyAgICAgIHNlbGYtPk0ySW1hZ19fRkRLWzFdWzFdW3BiXSA9IChGSVhQX0RCTCkwOyAgLy8gSDIyaW1bcGJdOworICAgIH0KKyAgfQorCisgIGlmIChzZWxmLT5waGFzZUNvZGluZyA9PSAxKSB7CisgICAgU3BhdGlhbERlY1Ntb290aE9QRCgKKyAgICAgICAgc2VsZiwgZnJhbWUsCisgICAgICAgIHBzKTsgLyogSU5QVVQ6IFBoYXNlTGVmdCwgUGhhc2VSaWdodCwgKG9wZExlZnRTdGF0ZSwgb3BkUmlnaHRTdGF0ZSkgKi8KKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBwYXJhbTJVTVhfUFNfQ29yZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcGFyYW0yVU1YX1BTX0NvcmVfX0ZESygKKyAgICBjb25zdCBTQ0hBUiBjbGRbTUFYX1BBUkFNRVRFUl9CQU5EU10sIGNvbnN0IFNDSEFSIGljY1tNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICBjb25zdCBpbnQgbnVtT3R0QmFuZHMsIGNvbnN0IGludCByZXNCYW5kcywKKyAgICBGSVhQX0RCTCBIMTFbTUFYX1BBUkFNRVRFUl9CQU5EU10sIEZJWFBfREJMIEgxMltNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICBGSVhQX0RCTCBIMjFbTUFYX1BBUkFNRVRFUl9CQU5EU10sIEZJWFBfREJMIEgyMltNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICBGSVhQX0RCTCBjX2xbTUFYX1BBUkFNRVRFUl9CQU5EU10sIEZJWFBfREJMIGNfcltNQVhfUEFSQU1FVEVSX0JBTkRTXSkgeworICBpbnQgYmFuZDsKKworICBpZiAoKGNfbCAhPSBOVUxMKSAmJiAoY19yICE9IE5VTEwpKSB7CisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG51bU90dEJhbmRzOyBiYW5kKyspIHsKKyAgICAgIFNwYXRpYWxEZXF1YW50R2V0Q0xEVmFsdWVzKGNsZFtiYW5kXSwgJmNfbFtiYW5kXSwgJmNfcltiYW5kXSk7CisgICAgfQorICB9CisKKyAgYmFuZCA9IDA7CisgIEZES19BU1NFUlQocmVzQmFuZHMgPT0gMCk7CisgIGZvciAoOyBiYW5kIDwgbnVtT3R0QmFuZHM7IGJhbmQrKykgeworICAgIC8qIGNvbXB1dGUgbWl4aW5nIHZhcmlhYmxlczogKi8KKyAgICBjb25zdCBpbnQgaWR4MSA9IGNsZFtiYW5kXTsKKyAgICBjb25zdCBpbnQgaWR4MiA9IGljY1tiYW5kXTsKKyAgICBIMTFbYmFuZF0gPSBGWF9DRkcyRlhfREJMKEgxMV9uY1tpZHgxXVtpZHgyXSk7CisgICAgSDIxW2JhbmRdID0gRlhfQ0ZHMkZYX0RCTChIMTFfbmNbMzAgLSBpZHgxXVtpZHgyXSk7CisgICAgSDEyW2JhbmRdID0gRlhfQ0ZHMkZYX0RCTChIMTJfbmNbaWR4MV1baWR4Ml0pOworICAgIEgyMltiYW5kXSA9IEZYX0NGRzJGWF9EQkwoLUgxMl9uY1szMCAtIGlkeDFdW2lkeDJdKTsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogcGFyYW0yVU1YX1BTCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6CisKKyBSZXR1cm46CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBwYXJhbTJVTVhfUFNfX0ZESyhzcGF0aWFsRGVjKiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgSDExW01BWF9QQVJBTUVURVJfQkFORFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgSDEyW01BWF9QQVJBTUVURVJfQkFORFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgSDIxW01BWF9QQVJBTUVURVJfQkFORFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgSDIyW01BWF9QQVJBTUVURVJfQkFORFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgY19sW01BWF9QQVJBTUVURVJfQkFORFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgY19yW01BWF9QQVJBTUVURVJfQkFORFNdLCBpbnQgb3R0Qm94SW5keCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXJhbWV0ZXJTZXRJbmR4LCBpbnQgcmVzaWR1YWxCYW5kcykgeworICBpbnQgYmFuZDsKKyAgcGFyYW0yVU1YX1BTX0NvcmVfX0ZESyhzZWxmLT5vdHRDTERfX0ZES1tvdHRCb3hJbmR4XVtwYXJhbWV0ZXJTZXRJbmR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5vdHRJQ0NfX0ZES1tvdHRCb3hJbmR4XVtwYXJhbWV0ZXJTZXRJbmR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5udW1PdHRCYW5kc1tvdHRCb3hJbmR4XSwgcmVzaWR1YWxCYW5kcywgSDExLCBIMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgSDIxLCBIMjIsIGNfbCwgY19yKTsKKworICBmb3IgKGJhbmQgPSBzZWxmLT5udW1PdHRCYW5kc1tvdHRCb3hJbmR4XTsgYmFuZCA8IHNlbGYtPm51bVBhcmFtZXRlckJhbmRzOworICAgICAgIGJhbmQrKykgeworICAgIEgxMVtiYW5kXSA9IEgyMVtiYW5kXSA9IEgxMltiYW5kXSA9IEgyMltiYW5kXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgIH0KK30KKworI2RlZmluZSBOX0NMRCAoMzEpCisjZGVmaW5lIE5fSVBEICgxNikKKworc3RhdGljIGNvbnN0IEZJWFBfREJMIHNpbklwZF90YWJbTl9JUERdID0geworICAgIEZJWFBfREJMKDB4MDAwMDAwMDApLCBGSVhQX0RCTCgweDMwZmJjNTRlKSwgRklYUF9EQkwoMHg1YTgyNzk5OSksCisgICAgRklYUF9EQkwoMHg3NjQxYWYzZCksIEZJWFBfREJMKDB4N2ZmZmZmZmYpLCBGSVhQX0RCTCgweDc2NDFhZjNkKSwKKyAgICBGSVhQX0RCTCgweDVhODI3OTlhKSwgRklYUF9EQkwoMHgzMGZiYzU0ZCksIEZJWFBfREJMKDB4ZmZmZmZmZmYpLAorICAgIEZJWFBfREJMKDB4Y2YwNDNhYjMpLCBGSVhQX0RCTCgweGE1N2Q4NjY2KSwgRklYUF9EQkwoMHg4OWJlNTBjMyksCisgICAgRklYUF9EQkwoMHg4MDAwMDAwMCksIEZJWFBfREJMKDB4ODliZTUwYzMpLCBGSVhQX0RCTCgweGE1N2Q4NjY2KSwKKyAgICBGSVhQX0RCTCgweGNmMDQzYWIyKSwKK307CisKKy8qIGNvc0lwZFtpXSA9IHNpbklwZFsoaSs0KSYxNV0gKi8KKyNkZWZpbmUgU0lOX0lQRChhKSAoc2luSXBkX3RhYlsoYSldKQorI2RlZmluZSBDT1NfSVBEKGEpIChzaW5JcGRfdGFiWygoYSkgKyA0KSAmIDE1XSkgIC8vKGNvc0lwZF90YWJbKGEpXSkKKworc3RhdGljIGNvbnN0IEZJWFBfU0dMIHNxcnRfb25lX21pbnVzX0lDQzJbOF0gPSB7CisgICAgRkwyRlhDT05TVF9TR0woMC4wZiksCisgICAgRkwyRlhDT05TVF9TR0woMC4zNDkzMjkzNTc0ODM3MzZmKSwKKyAgICBGTDJGWENPTlNUX1NHTCgwLjU0MDc1NTIxOTY2OTY3NmYpLAorICAgIEZMMkZYQ09OU1RfU0dMKDAuNzk5MzA5MTcyNzIzNTQ2ZiksCisgICAgRkwyRlhDT05TVF9TR0woMC45Mjk5NjgxODc4NDMwMDRmKSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woTUFYVkFMX0RCTCksCisgICAgRkwyRlhDT05TVF9TR0woMC44MDgxMzMwMzM2MDI3NmYpLAorICAgIEZMMkZYQ09OU1RfU0dMKDAuMTQxMDY3MzU5Nzk2NjU5ZiksCit9OworCisvKiBleHBvbmVudCBvZiBzcXJ0KENMRCkgKi8KK3N0YXRpYyBjb25zdCBTQ0hBUiBzcXJ0X0NMRF9lW05fQ0xEXSA9IHsKKyAgICAtMjQsIC03LCAtNiwgLTUsIC00LCAtNCwgLTMsIC0zLCAtMiwgLTIsIC0xLCAtMSwgMCwgMCwgMCwgMSwKKyAgICAxLCAgIDEsICAxLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNywgOCwgMjV9OworCitzdGF0aWMgY29uc3QgRklYUF9EQkwgc3FydF9DTERfbVtOX0NMRF0gPSB7CisgICAgRkwyRlhDT05TVF9EQkwoMC41MzA1NDIxNTM1NjYxOTVmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjcxOTc5Njg5NjI0MzY0N2YpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjRmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU2OTA0OTQxMTIxMjQ1NWYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTA1OTY0NDI1NjI2OTQxZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC44OTk3NDYxMjAzMDQ1NTlmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYzNTQ2MjU4Nzc3OTQyNWYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODk3NjE0NzYzNDQxNTcxZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MzM5NTcyNzY5ODQ0NDVmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg5NTQ4ODQ1NTQyNzMzNmYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjMyNDU1NTMyMDMzNjc2ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC43OTYyMTQzNDExMDY5OTVmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjUwMTE4NzIzMzYyNzI3MmYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjMwOTU3MzQ0NDgwMTkzZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC43OTQzMjgyMzQ3MjQyODFmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjVmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYyOTQ2MjcwNTg5NzA4NGYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzkyNDQ2NTk2MjMwNTU3ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC45OTc2MzExNTc0ODQ0NGYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjI3OTcxNjA3ODc3Mzk1ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC43OTA1Njk0MTUwNDIwOTVmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjU1ODM1NDQ5MDE4ODcwNGYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzg4Njk2NjgwNjAwMjQyZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC41NTcwMzE4MzYzMzM1OTFmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjc4NjgyODM4MjM3MTM1NWYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNTU1NzEyMzE1NjM3MTYzZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC45ODgyMTE3Njg4MDI2MTlmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg3ODY1ODMyMDYwOTkyZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC43ODEyNWYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNjk0NjQwMzk0NTQ2NDU0ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC45NDI0MzIxODMwNzc0NDhmKSwKK307CisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBDTERfbVtOX0NMRF0gPSB7CisgICAgRkwyRlhDT05TVF9EQkwoMC4yODE0NzQ5NzY3MTA2NTZmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjUxODEwNzU3MTg0MTk4N2YpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDA5NmYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuMzIzODE3MjMyNDAxMjQyZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC4yNTZmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjgwOTU0MzA4MTAwMzEwNWYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNDAzODEyNzAwNDY3MzI0ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC44MDU3MTIyNjM1NDgyNjdmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjQwMTkwMTgyOTA0MTUzM2YpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuODAxODk5NTczODAzNjM2ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC40ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MzM5NTcyNzY5ODQ0NDVmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjI1MTE4ODY0MzE1MDk1OGYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuMzk4MTA3MTcwNTUzNDk3ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MzA5NTczNDQ0ODAxOTNmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjI1ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC4zOTYyMjMyOTgxMTUyNzhmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYyNzk3MTYwNzg3NzM5NWYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTk1MjY3OTI2MzgzNzQzZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC4zOTQzNDgzNDAzMDAxMjFmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjYyNWYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuMzExNzU5NzM2NzEzODg3ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MjIwNDI0NTM5ODk4NGYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuMzEwMjg0NDY2Njg5MTcyZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MTkwOTg5MDMzMDUxMjNmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjMwODgxNjE3Nzc1MDgxOGYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuOTc2NTYyNWYpLAorICAgIEZMMkZYQ09OU1RfREJMKDAuNzcyMDQwNDQ0Mzc3MDQ2ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC42MTAzNTE1NjI1ZiksCisgICAgRkwyRlhDT05TVF9EQkwoMC40ODI1MjUyNzc3MzU2NTRmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgwLjg4ODE3ODQxOTcwMDEyNSksCit9OworCitzdGF0aWMgRklYUF9EQkwgZGVxdWFudElQRF9DTERfSUNDX3NwbGl0QW5nbGVfX0ZES19GdW5jdGlvbihJTlQgaXBkSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNsZElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBpY2NJZHgpIHsKKyAgRklYUF9EQkwgY2xkOworICBTcGF0aWFsRGVxdWFudEdldENMRDJWYWx1ZXMoY2xkSWR4LCAmY2xkKTsKKworICAvKmNvbnN0IEZJWFBfREJMIG9uZV9tID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CisgIGNvbnN0IGludCBvbmVfZSA9IDA7Ki8KKyAgY29uc3QgRklYUF9EQkwgb25lX20gPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsKKyAgY29uc3QgaW50IG9uZV9lID0gMTsKKyAgLyogaWlkTGluID0gc3FydChjbGQpOyAqLworICBGSVhQX0RCTCBpaWRMaW5fbSA9IHNxcnRfQ0xEX21bY2xkSWR4XTsKKyAgaW50IGlpZExpbl9lID0gc3FydF9DTERfZVtjbGRJZHhdOworICAvKiBpaWRMaW4yID0gY2xkOyAqLworICBGSVhQX0RCTCBpaWRMaW4yX20gPSBDTERfbVtjbGRJZHhdOworICBpbnQgaWlkTGluMl9lID0gc3FydF9DTERfZVtjbGRJZHhdIDw8IDE7CisgIC8qIGlpZExpbjIxID0gaWlkTGluMiArIDEuMGY7ICovCisgIGludCBpaWRMaW4yMV9lOworICBGSVhQX0RCTCBpaWRMaW4yMV9tID0KKyAgICAgIGZBZGROb3JtKGlpZExpbjJfbSwgaWlkTGluMl9lLCBvbmVfbSwgb25lX2UsICZpaWRMaW4yMV9lKTsKKyAgLyogaWlkSWNjMiA9IGlpZExpbiAqIGljYyAqIDIuMGY7ICovCisgIEZJWFBfQ0ZHIGljYyA9IGRlcXVhbnRJQ0NfX0ZES1tpY2NJZHhdOworICBGSVhQX0RCTCB0ZW1wMV9tLCB0ZW1wMWNfbTsKKyAgaW50IHRlbXAxX2UsIHRlbXAxY19lOworICB0ZW1wMV9tID0gZk11bHQoaWlkTGluX20sIGljYyk7CisgIHRlbXAxX2UgPSBpaWRMaW5fZSArIDE7CisKKyAgRklYUF9EQkwgY29zSXBkLCBzaW5JcGQ7CisgIGNvc0lwZCA9IENPU19JUEQoaXBkSWR4KTsKKyAgc2luSXBkID0gU0lOX0lQRChpcGRJZHgpOworCisgIHRlbXAxY19tID0gZk11bHQodGVtcDFfbSwgY29zSXBkKTsKKyAgdGVtcDFjX2UgPSB0ZW1wMV9lOyAgLy8rY29zSXBkX2U7CisKKyAgaW50IHRlbXAyX2UsIHRlbXAzX2UsIGludl90ZW1wM19lLCByYXRpb19lOworICBGSVhQX0RCTCB0ZW1wMl9tID0KKyAgICAgIGZBZGROb3JtKGlpZExpbjIxX20sIGlpZExpbjIxX2UsIHRlbXAxY19tLCB0ZW1wMWNfZSwgJnRlbXAyX2UpOworICBGSVhQX0RCTCB0ZW1wM19tID0KKyAgICAgIGZBZGROb3JtKGlpZExpbjIxX20sIGlpZExpbjIxX2UsIHRlbXAxX20sIHRlbXAxX2UsICZ0ZW1wM19lKTsKKyAgLyogY2FsY3VsYXRlIDEvdGVtcDMgbmVlZGVkIGxhdGVyICovCisgIGludl90ZW1wM19lID0gdGVtcDNfZTsKKyAgRklYUF9EQkwgaW52X3RlbXAzX20gPSBpbnZGaXhwKHRlbXAzX20sICZpbnZfdGVtcDNfZSk7CisgIEZJWFBfREJMIHJhdGlvX20gPQorICAgICAgZkFkZE5vcm0oZk11bHQoaW52X3RlbXAzX20sIHRlbXAyX20pLCAoaW52X3RlbXAzX2UgKyB0ZW1wMl9lKSwKKyAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDFlLTlmKSwgMCwgJnJhdGlvX2UpOworCisgIGludCB3ZWlnaHQyX2UsIHRlbXBiX2F0YW4yX2U7CisgIEZJWFBfREJMIHdlaWdodDJfbSA9CisgICAgICBmUG93KHJhdGlvX20sIHJhdGlvX2UsIEZMMkZYQ09OU1RfREJMKDAuNWYpLCAtMSwgJndlaWdodDJfZSk7CisgIC8qIGF0YW4yKHcyKnNpbklwZCwgdzEqaWlkTGluICsgdzIqY29zSXBkKSA9IGF0YW4yKHcyKnNpbklwZCwgKDIgLSB3MikqaWlkTGluCisgICAqICsgdzIqY29zSXBkKSA9IGF0YW4yKHcyKnNpbklwZCwgMippaWRMaW4gKyB3MiooY29zSXBkIC0gaWlkTGluKSk7ICovCisgIC8qIHRtcGFfYXRhbjIgPSB3MipzaW5JcGQ7IHRtcGJfYXRhbjIgPSAyKmlpZExpbiArIHcyKihjb3NJcGQgLSBpaWRMaW4pOyAqLworICBGSVhQX0RCTCB0ZW1wYl9hdGFuMl9tID0gaWlkTGluX207CisgIHRlbXBiX2F0YW4yX2UgPSBpaWRMaW5fZSArIDE7CisgIGludCBhZGRfdG1wMV9lID0gMDsKKyAgRklYUF9EQkwgYWRkX3RtcDFfbSA9IGZBZGROb3JtKGNvc0lwZCwgMCwgLWlpZExpbl9tLCBpaWRMaW5fZSwgJmFkZF90bXAxX2UpOworICBGSVhQX0RCTCBhZGRfdG1wMl9tID0gZk11bHQoYWRkX3RtcDFfbSwgd2VpZ2h0Ml9tKTsKKyAgaW50IGFkZF90bXAyX2UgPSBhZGRfdG1wMV9lICsgd2VpZ2h0Ml9lOworICB0ZW1wYl9hdGFuMl9tID0gZkFkZE5vcm0odGVtcGJfYXRhbjJfbSwgdGVtcGJfYXRhbjJfZSwgYWRkX3RtcDJfbSwgYWRkX3RtcDJfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wYl9hdGFuMl9lKTsKKworICBGSVhQX0RCTCB0ZW1wYV9hdGFuMl9tID0gZk11bHQod2VpZ2h0Ml9tLCBzaW5JcGQpOworICBpbnQgdGVtcGFfYXRhbjJfZSA9IHdlaWdodDJfZTsgIC8vICsgc2luSXBkX2U7CisKKyAgaWYgKHRlbXBhX2F0YW4yX2UgPiB0ZW1wYl9hdGFuMl9lKSB7CisgICAgdGVtcGJfYXRhbjJfbSA9ICh0ZW1wYl9hdGFuMl9tID4+ICh0ZW1wYV9hdGFuMl9lIC0gdGVtcGJfYXRhbjJfZSkpOworICAgIHRlbXBiX2F0YW4yX2UgPSB0ZW1wYV9hdGFuMl9lOworICB9IGVsc2UgaWYgKHRlbXBiX2F0YW4yX2UgPiB0ZW1wYV9hdGFuMl9lKSB7CisgICAgdGVtcGFfYXRhbjJfbSA9ICh0ZW1wYV9hdGFuMl9tID4+ICh0ZW1wYl9hdGFuMl9lIC0gdGVtcGFfYXRhbjJfZSkpOworICB9CisKKyAgcmV0dXJuIGZpeHBfYXRhbjIodGVtcGFfYXRhbjJfbSwgdGVtcGJfYXRhbjJfbSk7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZU9wZChzcGF0aWFsRGVjKiBzZWxmLCBJTlQgb3R0Qm94SW5keCwgSU5UIHBhcmFtZXRlclNldEluZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgb3BkW01BWF9QQVJBTUVURVJfQkFORFNdKSB7CisgIElOVCBiYW5kOworCisgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBzZWxmLT5udW1PdHRCYW5kc0lQRDsgYmFuZCsrKSB7CisgICAgSU5UIGlkeENsZCA9IHNlbGYtPm90dENMRF9fRkRLW290dEJveEluZHhdW3BhcmFtZXRlclNldEluZHhdW2JhbmRdOworICAgIElOVCBpZHhJcGQgPSBzZWxmLT5vdHRJUERfX0ZES1tvdHRCb3hJbmR4XVtwYXJhbWV0ZXJTZXRJbmR4XVtiYW5kXTsKKyAgICBJTlQgaWR4SWNjID0gc2VsZi0+b3R0SUNDX19GREtbb3R0Qm94SW5keF1bcGFyYW1ldGVyU2V0SW5keF1bYmFuZF07CisgICAgRklYUF9EQkwgY2xkLCBpcGQ7CisKKyAgICBpcGQgPSBGWF9DRkcyRlhfREJMKGRlcXVhbnRJUERfX0ZES1tpZHhJcGRdKTsKKworICAgIFNwYXRpYWxEZXF1YW50R2V0Q0xEMlZhbHVlcyhpZHhDbGQsICZjbGQpOworCisgICAgLyogaXBkKGlkeElwZD09OCkgPT0gUEkgKi8KKyAgICBpZiAoKGNsZCA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgJiYgKGlkeElwZCA9PSA4KSkgeworICAgICAgb3BkWzIgKiBiYW5kXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgIH0gZWxzZSB7CisgICAgICBvcGRbMiAqIGJhbmRdID0gKGRlcXVhbnRJUERfQ0xEX0lDQ19zcGxpdEFuZ2xlX19GREtfRnVuY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHhJcGQsIGlkeENsZCwgaWR4SWNjKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAoSVBEX1NDQUxFIC0gQVQyT19TRikpOworICAgIH0KKyAgICBvcGRbMiAqIGJhbmQgKyAxXSA9IG9wZFsyICogYmFuZF0gLSBpcGQ7CisgIH0KK30KKworLyogd3JhcCBwaGFzZSBpbiByYWQgdG8gdGhlIHJhbmdlIG9mIDAgPD0geCA8IDIqcGkgKi8KK3N0YXRpYyBGSVhQX0RCTCB3cmFwUGhhc2UoRklYUF9EQkwgcGhhc2UpIHsKKyAgd2hpbGUgKHBoYXNlIDwgKEZJWFBfREJMKTApIHBoYXNlICs9IFBJeDJfX0lQRDsKKyAgd2hpbGUgKHBoYXNlID49IFBJeDJfX0lQRCkgcGhhc2UgLT0gUEl4Ml9fSVBEOworICBGREtfQVNTRVJUKChwaGFzZSA+PSAoRklYUF9EQkwpMCkgJiYgKHBoYXNlIDwgUEl4Ml9fSVBEKSk7CisKKyAgcmV0dXJuIHBoYXNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogcGFyYW0yVU1YX1BTX0lQRAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcGFyYW0yVU1YX1BTX0lQRF9PUERfX0ZESygKKyAgICBzcGF0aWFsRGVjKiBzZWxmLCBjb25zdCBTUEFUSUFMX0JTX0ZSQU1FKiBmcmFtZSwKKyAgICBGSVhQX0RCTCBIMTFbTUFYX1BBUkFNRVRFUl9CQU5EU10sIEZJWFBfREJMIEgxMltNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICBGSVhQX0RCTCBIMjFbTUFYX1BBUkFNRVRFUl9CQU5EU10sIEZJWFBfREJMIEgyMltNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICBGSVhQX0RCTCBjX2xbTUFYX1BBUkFNRVRFUl9CQU5EU10sIEZJWFBfREJMIGNfcltNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICBpbnQgb3R0Qm94SW5keCwgaW50IHBhcmFtZXRlclNldEluZHgsIGludCByZXNpZHVhbEJhbmRzKSB7CisgIElOVCBiYW5kOworICBGSVhQX0RCTCBvcGRbMiAqIE1BWF9QQVJBTUVURVJfQkFORFNdOworICBJTlQgbnVtT3R0QmFuZHMgPSBzZWxmLT5udW1PdHRCYW5kc1tvdHRCb3hJbmR4XTsKKyAgSU5UIG51bUlwZEJhbmRzOworCisgIG51bUlwZEJhbmRzID0gZnJhbWUtPnBoYXNlTW9kZSA/IHNlbGYtPm51bU90dEJhbmRzSVBEIDogMDsKKworICBGREtfQVNTRVJUKHNlbGYtPnJlc2lkdWFsQ29kaW5nID09IDApOworCisgIHBhcmFtMlVNWF9QU19Db3JlX19GREsoc2VsZi0+b3R0Q0xEX19GREtbb3R0Qm94SW5keF1bcGFyYW1ldGVyU2V0SW5keF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+b3R0SUNDX19GREtbb3R0Qm94SW5keF1bcGFyYW1ldGVyU2V0SW5keF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+bnVtT3R0QmFuZHNbb3R0Qm94SW5keF0sIHJlc2lkdWFsQmFuZHMsIEgxMSwgSDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEgyMSwgSDIyLCBjX2wsIGNfcik7CisKKyAgZm9yIChiYW5kID0gc2VsZi0+bnVtT3R0QmFuZHNbb3R0Qm94SW5keF07IGJhbmQgPCBzZWxmLT5udW1QYXJhbWV0ZXJCYW5kczsKKyAgICAgICBiYW5kKyspIHsKKyAgICBIMTFbYmFuZF0gPSBIMjFbYmFuZF0gPSBIMTJbYmFuZF0gPSBIMjJbYmFuZF0gPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICB9CisKKyAgaWYgKGZyYW1lLT5waGFzZU1vZGUpIHsKKyAgICBjYWxjdWxhdGVPcGQoc2VsZiwgb3R0Qm94SW5keCwgcGFyYW1ldGVyU2V0SW5keCwgb3BkKTsKKworICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBudW1JcGRCYW5kczsgYmFuZCsrKSB7CisgICAgICBzZWxmLT5QaGFzZUxlZnRfX0ZES1tiYW5kXSA9IHdyYXBQaGFzZShvcGRbMiAqIGJhbmRdKTsKKyAgICAgIHNlbGYtPlBoYXNlUmlnaHRfX0ZES1tiYW5kXSA9IHdyYXBQaGFzZShvcGRbMiAqIGJhbmQgKyAxXSk7CisgICAgfQorICB9CisKKyAgZm9yIChiYW5kID0gbnVtSXBkQmFuZHM7IGJhbmQgPCBudW1PdHRCYW5kczsgYmFuZCsrKSB7CisgICAgc2VsZi0+UGhhc2VMZWZ0X19GREtbYmFuZF0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICBzZWxmLT5QaGFzZVJpZ2h0X19GREtbYmFuZF0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgfQorfQorCitGREtfSU5MSU5FIHZvaWQgcGFyYW0yVU1YX1ByZWRpY3Rpb25fQ29yZV9fRkRLKAorICAgIEZJWFBfREJMKiBIMTFyZSwgRklYUF9EQkwqIEgxMWltLCBGSVhQX0RCTCogSDEycmUsIEZJWFBfREJMKiBIMTJpbSwKKyAgICBGSVhQX0RCTCogSDIxcmUsIEZJWFBfREJMKiBIMjFpbSwgRklYUF9EQkwqIEgyMnJlLCBGSVhQX0RCTCogSDIyaW0sCisgICAgaW50IGNsZElkeCwgaW50IGljY0lkeCwgaW50IGlwZElkeCwgaW50IGJhbmQsIGludCBudW1PdHRCYW5kc0lQRCwKKyAgICBpbnQgcmVzQmFuZHMpIHsKKyNkZWZpbmUgTUFYX1dFSUdIVCAoMS4yZikKKyAgRkRLX0FTU0VSVCgoSDEyaW0gPT0gTlVMTCkgJiYgKEgyMmltID09IE5VTEwpKTsgLyogYWx3YXlzID09IDAgKi8KKworICBpZiAoKGJhbmQgPCBudW1PdHRCYW5kc0lQRCkgJiYgKGNsZElkeCA9PSAxNSkgJiYgKGljY0lkeCA9PSAwKSAmJgorICAgICAgKGlwZElkeCA9PSA4KSkgeworICAgIGNvbnN0IEZJWFBfREJMIGdhaW4gPQorICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjVmIC8gTUFYX1dFSUdIVCkgPj4gU0NBTEVfUEFSQU1fTTJfMjEyX1BSRUQ7CisKKyAgICAqSDExcmUgPSBnYWluOworICAgIGlmIChiYW5kIDwgcmVzQmFuZHMpIHsKKyAgICAgICpIMjFyZSA9IGdhaW47CisgICAgICAqSDEycmUgPSBnYWluOworICAgICAgKkgyMnJlID0gLWdhaW47CisgICAgfSBlbHNlIHsKKyAgICAgICpIMjFyZSA9IC1nYWluOworICAgICAgKkgxMnJlID0gKEZJWFBfREJMKTA7CisgICAgICAqSDIycmUgPSAoRklYUF9EQkwpMDsKKyAgICB9CisgICAgaWYgKChIMTFpbSAhPSBOVUxMKSAmJgorICAgICAgICAoSDIxaW0gIT0gTlVMTCkgLyomJiAoSDEyaW0hPU5VTEwpICYmIChIMjJpbSE9TlVMTCkqLykgeworICAgICAgKkgxMWltID0gKEZJWFBfREJMKTA7CisgICAgICAqSDIxaW0gPSAoRklYUF9EQkwpMDsKKyAgICAgIC8qICpIMTJpbSA9IChGSVhQX0RCTCkwOyAqLworICAgICAgLyogKkgyMmltID0gKEZJWFBfREJMKTA7ICovCisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IEZJWFBfREJMIG9uZV9tID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CisgICAgY29uc3QgaW50IG9uZV9lID0gMDsKKyAgICAvKiBpaWRMaW4gPSBzcXJ0KGNsZCk7ICovCisgICAgRklYUF9EQkwgaWlkTGluX20gPSBzcXJ0X0NMRF9tW2NsZElkeF07CisgICAgaW50IGlpZExpbl9lID0gc3FydF9DTERfZVtjbGRJZHhdOworICAgIC8qIGlpZExpbjIgPSBjbGQ7ICovCisgICAgRklYUF9EQkwgaWlkTGluMl9tID0gQ0xEX21bY2xkSWR4XTsKKyAgICBpbnQgaWlkTGluMl9lID0gc3FydF9DTERfZVtjbGRJZHhdIDw8IDE7CisgICAgLyogaWlkTGluMjEgPSBpaWRMaW4yICsgMS4wZjsgKi8KKyAgICBpbnQgaWlkTGluMjFfZTsKKyAgICBGSVhQX0RCTCBpaWRMaW4yMV9tID0KKyAgICAgICAgZkFkZE5vcm0oaWlkTGluMl9tLCBpaWRMaW4yX2UsIG9uZV9tLCBvbmVfZSwgJmlpZExpbjIxX2UpOworICAgIC8qIGlpZEljYzIgPSBpaWRMaW4gKiBpY2MgKiAyLjBmOyAqLworICAgIEZJWFBfQ0ZHIGljYyA9IGRlcXVhbnRJQ0NfX0ZES1tpY2NJZHhdOworICAgIGludCBpaWRJY2MyX2UgPSBpaWRMaW5fZSArIDE7CisgICAgRklYUF9EQkwgaWlkSWNjMl9tID0gZk11bHQoaWlkTGluX20sIGljYyk7CisgICAgRklYUF9EQkwgdGVtcF9tLCBzcXJ0X3RlbXBfbSwgaW52X3RlbXBfbSwgd2VpZ2h0X207CisgICAgaW50IHRlbXBfZSwgc3FydF90ZW1wX2UsIGludl90ZW1wX2UsIHdlaWdodF9lLCBzY2FsZTsKKyAgICBGSVhQX0RCTCBjb3NJcGQsIHNpbklwZDsKKworICAgIGNvc0lwZCA9IENPU19JUEQoKGJhbmQgPCBudW1PdHRCYW5kc0lQRCkgPyBpcGRJZHggOiAwKTsKKyAgICBzaW5JcGQgPSBTSU5fSVBEKChiYW5kIDwgbnVtT3R0QmFuZHNJUEQpID8gaXBkSWR4IDogMCk7CisKKyAgICAvKiB0ZW1wICAgID0gaWlkTGluMjEgKyBpaWRJY2MyICogY29zSXBkOyAqLworICAgIHRlbXBfbSA9IGZBZGROb3JtKGlpZExpbjIxX20sIGlpZExpbjIxX2UsIGZNdWx0KGlpZEljYzJfbSwgY29zSXBkKSwKKyAgICAgICAgICAgICAgICAgICAgICBpaWRJY2MyX2UsICZ0ZW1wX2UpOworCisgICAgLyogY2FsY3VsYXRlIDEvdGVtcCBuZWVkZWQgbGF0ZXIgKi8KKyAgICBpbnZfdGVtcF9lID0gdGVtcF9lOworICAgIGludl90ZW1wX20gPSBpbnZGaXhwKHRlbXBfbSwgJmludl90ZW1wX2UpOworCisgICAgLyogMS93ZWlnaHQgPSBzcXJ0KHRlbXApICogMS9zcXJ0KGlpZExpbjIxKSAqLworICAgIGlmICh0ZW1wX2UgJiAxKSB7CisgICAgICBzcXJ0X3RlbXBfbSA9IHRlbXBfbSA+PiAxOworICAgICAgc3FydF90ZW1wX2UgPSAodGVtcF9lICsgMSkgPj4gMTsKKyAgICB9IGVsc2UgeworICAgICAgc3FydF90ZW1wX20gPSB0ZW1wX207CisgICAgICBzcXJ0X3RlbXBfZSA9IHRlbXBfZSA+PiAxOworICAgIH0KKyAgICBzcXJ0X3RlbXBfbSA9IHNxcnRGaXhwKHNxcnRfdGVtcF9tKTsKKyAgICBpZiAoaWlkTGluMjFfZSAmIDEpIHsKKyAgICAgIGlpZExpbjIxX2UgKz0gMTsKKyAgICAgIGlpZExpbjIxX20gPj49IDE7CisgICAgfQorICAgIC8qIHdlaWdodF9bbSxlXSBpcyBhY3R1YWxseSAxL3dlaWdodCBpbiB0aGUgbmV4dCBmZXcgbGluZXMgKi8KKyAgICB3ZWlnaHRfbSA9IGludlNxcnROb3JtMihpaWRMaW4yMV9tLCAmd2VpZ2h0X2UpOworICAgIHdlaWdodF9lIC09IGlpZExpbjIxX2UgPj4gMTsKKyAgICB3ZWlnaHRfbSA9IGZNdWx0KHNxcnRfdGVtcF9tLCB3ZWlnaHRfbSk7CisgICAgd2VpZ2h0X2UgKz0gc3FydF90ZW1wX2U7CisgICAgc2NhbGUgPSBmTm9ybSh3ZWlnaHRfbSk7CisgICAgd2VpZ2h0X20gPSBzY2FsZVZhbHVlKHdlaWdodF9tLCBzY2FsZSk7CisgICAgd2VpZ2h0X2UgLT0gc2NhbGU7CisgICAgLyogd2VpZ2h0ID0gMC41ICogbWF4KDEvd2VpZ2h0LCAxL21heFdlaWdodCkgKi8KKyAgICBpZiAoKHdlaWdodF9lIDwgMCkgfHwKKyAgICAgICAgKCh3ZWlnaHRfZSA9PSAwKSAmJiAod2VpZ2h0X20gPCBGTDJGWENPTlNUX0RCTCgxLmYgLyBNQVhfV0VJR0hUKSkpKSB7CisgICAgICB3ZWlnaHRfbSA9IEZMMkZYQ09OU1RfREJMKDEuZiAvIE1BWF9XRUlHSFQpOworICAgICAgd2VpZ2h0X2UgPSAwOworICAgIH0KKyAgICB3ZWlnaHRfZSAtPSAxOworCisgICAgeworICAgICAgRklYUF9EQkwgYWxwaGFSZV9tLCBhbHBoYUltX20sIGFjY3VfbTsKKyAgICAgIGludCBhbHBoYVJlX2UsIGFscGhhSW1fZSwgYWNjdV9lOworICAgICAgLyogYWxwaGFSZSA9ICgxLjBmIC0gaWlkTGluMikgLyB0ZW1wOyAqLworICAgICAgYWxwaGFSZV9tID0gZkFkZE5vcm0ob25lX20sIG9uZV9lLCAtaWlkTGluMl9tLCBpaWRMaW4yX2UsICZhbHBoYVJlX2UpOworICAgICAgYWxwaGFSZV9tID0gZk11bHQoYWxwaGFSZV9tLCBpbnZfdGVtcF9tKTsKKyAgICAgIGFscGhhUmVfZSArPSBpbnZfdGVtcF9lOworCisgICAgICAvKiBIMTFyZSA9IHdlaWdodCAtIGFscGhhUmUgKiB3ZWlnaHQ7ICovCisgICAgICAvKiBIMjFyZSA9IHdlaWdodCArIGFscGhhUmUgKiB3ZWlnaHQ7ICovCisgICAgICBhY2N1X20gPSBmTXVsdChhbHBoYVJlX20sIHdlaWdodF9tKTsKKyAgICAgIGFjY3VfZSA9IGFscGhhUmVfZSArIHdlaWdodF9lOworICAgICAgeworICAgICAgICBpbnQgYWNjdTJfZTsKKyAgICAgICAgRklYUF9EQkwgYWNjdTJfbTsKKyAgICAgICAgYWNjdTJfbSA9IGZBZGROb3JtKHdlaWdodF9tLCB3ZWlnaHRfZSwgLWFjY3VfbSwgYWNjdV9lLCAmYWNjdTJfZSk7CisgICAgICAgICpIMTFyZSA9IHNjYWxlVmFsdWUoYWNjdTJfbSwgYWNjdTJfZSAtIFNDQUxFX1BBUkFNX00yXzIxMl9QUkVEKTsKKyAgICAgICAgYWNjdTJfbSA9IGZBZGROb3JtKHdlaWdodF9tLCB3ZWlnaHRfZSwgYWNjdV9tLCBhY2N1X2UsICZhY2N1Ml9lKTsKKyAgICAgICAgKkgyMXJlID0gc2NhbGVWYWx1ZShhY2N1Ml9tLCBhY2N1Ml9lIC0gU0NBTEVfUEFSQU1fTTJfMjEyX1BSRUQpOworICAgICAgfQorCisgICAgICBpZiAoKEgxMWltICE9IE5VTEwpICYmCisgICAgICAgICAgKEgyMWltICE9IE5VTEwpIC8qJiYgKEgxMmltICE9IE5VTEwpICYmIChIMjJpbSAhPSBOVUxMKSovKSB7CisgICAgICAgIC8qIGFscGhhSW0gPSAtaWlkSWNjMiAqIHNpbklwZCAvIHRlbXA7ICovCisgICAgICAgIGFscGhhSW1fbSA9IGZNdWx0KC1paWRJY2MyX20sIHNpbklwZCk7CisgICAgICAgIGFscGhhSW1fbSA9IGZNdWx0KGFscGhhSW1fbSwgaW52X3RlbXBfbSk7CisgICAgICAgIGFscGhhSW1fZSA9IGlpZEljYzJfZSArIGludl90ZW1wX2U7CisgICAgICAgIC8qIEgxMWltID0gLWFscGhhSW0gKiB3ZWlnaHQ7ICovCisgICAgICAgIC8qIEgyMWltID0gIGFscGhhSW0gKiB3ZWlnaHQ7ICovCisgICAgICAgIGFjY3VfbSA9IGZNdWx0KGFscGhhSW1fbSwgd2VpZ2h0X20pOworICAgICAgICBhY2N1X2UgPSBhbHBoYUltX2UgKyB3ZWlnaHRfZTsKKyAgICAgICAgYWNjdV9tID0gc2NhbGVWYWx1ZShhY2N1X20sIGFjY3VfZSAtIFNDQUxFX1BBUkFNX00yXzIxMl9QUkVEKTsKKyAgICAgICAgKkgxMWltID0gLWFjY3VfbTsKKyAgICAgICAgKkgyMWltID0gYWNjdV9tOworCisgICAgICAgIC8qICpIMTJpbSA9IChGSVhQX0RCTCkwOyAqLworICAgICAgICAvKiAqSDIyaW0gPSAoRklYUF9EQkwpMDsgKi8KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGJhbmQgPCByZXNCYW5kcykgeworICAgICAgRklYUF9EQkwgd2VpZ2h0ID0KKyAgICAgICAgICBzY2FsZVZhbHVlKHdlaWdodF9tLCB3ZWlnaHRfZSAtIFNDQUxFX1BBUkFNX00yXzIxMl9QUkVEKTsKKyAgICAgICpIMTJyZSA9IHdlaWdodDsKKyAgICAgICpIMjJyZSA9IC13ZWlnaHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGJldGEgPSAyLjBmICogaWlkTGluICogKGZsb2F0KSBzcXJ0KDEuMGYgLSBpY2MgKiBpY2MpICogd2VpZ2h0IC8gdGVtcDsKKyAgICAgICAqLworICAgICAgRklYUF9EQkwgYmV0YV9tOworICAgICAgaW50IGJldGFfZTsKKyAgICAgIGJldGFfbSA9IEZYX1NHTDJGWF9EQkwoc3FydF9vbmVfbWludXNfSUNDMltpY2NJZHhdKTsKKyAgICAgIGJldGFfZSA9IDE7IC8qIG11bHRpcGljYXRpb24gd2l0aCAyLjBmICovCisgICAgICBiZXRhX20gPSBmTXVsdChiZXRhX20sIHdlaWdodF9tKTsKKyAgICAgIGJldGFfZSArPSB3ZWlnaHRfZTsKKyAgICAgIGJldGFfbSA9IGZNdWx0KGJldGFfbSwgaWlkTGluX20pOworICAgICAgYmV0YV9lICs9IGlpZExpbl9lOworICAgICAgYmV0YV9tID0gZk11bHQoYmV0YV9tLCBpbnZfdGVtcF9tKTsKKyAgICAgIGJldGFfZSArPSBpbnZfdGVtcF9lOworCisgICAgICBiZXRhX20gPSBzY2FsZVZhbHVlKGJldGFfbSwgYmV0YV9lIC0gU0NBTEVfUEFSQU1fTTJfMjEyX1BSRUQpOworICAgICAgKkgxMnJlID0gYmV0YV9tOworICAgICAgKkgyMnJlID0gLWJldGFfbTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgcGFyYW0yVU1YX1ByZWRpY3Rpb25fX0ZESyhzcGF0aWFsRGVjKiBzZWxmLCBGSVhQX0RCTCogSDExcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiBIMTFpbSwgRklYUF9EQkwqIEgxMnJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogSDEyaW0sIEZJWFBfREJMKiBIMjFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqIEgyMWltLCBGSVhQX0RCTCogSDIycmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiBIMjJpbSwgaW50IG90dEJveEluZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXJhbWV0ZXJTZXRJbmR4LCBpbnQgcmVzQmFuZHMpIHsKKyAgaW50IGJhbmQ7CisgIEZES19BU1NFUlQoKEgxMmltID09IE5VTEwpICYmIChIMjJpbSA9PSBOVUxMKSk7IC8qIGFsd2F5cyA9PSAwICovCisKKyAgZm9yIChiYW5kID0gMDsgYmFuZCA8IHNlbGYtPm51bVBhcmFtZXRlckJhbmRzOyBiYW5kKyspIHsKKyAgICBpbnQgY2xkSWR4ID0gc2VsZi0+b3R0Q0xEX19GREtbb3R0Qm94SW5keF1bcGFyYW1ldGVyU2V0SW5keF1bYmFuZF07CisgICAgaW50IGljY0lkeCA9IHNlbGYtPm90dElDQ19fRkRLW290dEJveEluZHhdW3BhcmFtZXRlclNldEluZHhdW2JhbmRdOworICAgIGludCBpcGRJZHggPSBzZWxmLT5vdHRJUERfX0ZES1tvdHRCb3hJbmR4XVtwYXJhbWV0ZXJTZXRJbmR4XVtiYW5kXTsKKworICAgIHBhcmFtMlVNWF9QcmVkaWN0aW9uX0NvcmVfX0ZESygKKyAgICAgICAgJkgxMXJlW2JhbmRdLCAoSDExaW0gPyAmSDExaW1bYmFuZF0gOiBOVUxMKSwgJkgxMnJlW2JhbmRdLCBOVUxMLAorICAgICAgICAmSDIxcmVbYmFuZF0sIChIMjFpbSA/ICZIMjFpbVtiYW5kXSA6IE5VTEwpLCAmSDIycmVbYmFuZF0sIE5VTEwsIGNsZElkeCwKKyAgICAgICAgaWNjSWR4LCBpcGRJZHgsIGJhbmQsIHNlbGYtPm51bU90dEJhbmRzSVBELCByZXNCYW5kcyk7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6ICBpbml0TTFhbmRNMgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitTQUNERUNfRVJST1IgaW5pdE0xYW5kTTIoc3BhdGlhbERlYyogc2VsZiwgaW50IGluaXRTdGF0ZXNGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25maWdDaGFuZ2VkKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisKKyAgc2VsZi0+Yk92ZXJ3cml0ZU0xTTJwcmV2ID0gKGNvbmZpZ0NoYW5nZWQgJiYgIWluaXRTdGF0ZXNGbGFnKSA/IDEgOiAwOworCisgIHsgc2VsZi0+bnVtTTJyb3dzID0gc2VsZi0+bnVtT3V0cHV0Q2hhbm5lbHM7IH0KKworICBpZiAoaW5pdFN0YXRlc0ZsYWcpIHsKKyAgICBpbnQgaSwgaiwgazsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzZWxmLT5udW1NMnJvd3M7IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IHNlbGYtPm51bVZDaGFubmVsczsgaisrKSB7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBNQVhfUEFSQU1FVEVSX0JBTkRTOyBrKyspIHsKKyAgICAgICAgICBzZWxmLT5NMlJlYWxfX0ZES1tpXVtqXVtrXSA9IEZMMkZYQ09OU1RfREJMKDApOworICAgICAgICAgIHNlbGYtPk0yUmVhbFByZXZfX0ZES1tpXVtqXVtrXSA9IEZMMkZYQ09OU1RfREJMKDApOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2xpYlNBQ2RlYy9zcmMvc2FjX2NhbGNNMWFuZE0yLmggYi9saWJTQUNkZWMvc3JjL3NhY19jYWxjTTFhbmRNMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NjIzOGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY19jYWxjTTFhbmRNMi5oCkBAIC0wLDAgKzEsMTI5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IFNBQyBEZWMgTTEgYW5kIE0yIGNhbGN1bGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHNhX2NhbGNNMWFuZE0yLmggKi8KKworI2lmbmRlZiBTQUNfQ0FMQ00xQU5ETTJfSAorI2RlZmluZSBTQUNfQ0FMQ00xQU5ETTJfSAorCisjaW5jbHVkZSAic2FjX2RlYy5oIgorCisjZGVmaW5lIFNDQUxFX1BBUkFNX00xIDMKKworLyogU2NhbGluZyBvZiBNMiBtYXRyaXgsIGJ1dCBvbmx5IGZvciBiaW5hdXJhbCB1cG1peCB0eXBlLiAqLworI2RlZmluZSBTQ0FMRV9QQVJBTV9DQUxDX00yICgzKQorI2RlZmluZSBTQ0FMRV9QQVJBTV9NMl81MTVYICgzKQorI2RlZmluZSBTQ0FMRV9QQVJBTV9NMl81MjUgKFNDQUxFX1BBUkFNX00xICsgSFJHX1NGICsgMSAtIFNDQUxFX1BBUkFNX0NBTENfTTIpCisjZGVmaW5lIFNDQUxFX1BBUkFNX00yXzIxMl9QUkVEICgzKQorLyogU2NhbGluZyBvZiBzcGVjdHJhbCBkYXRhIGFmdGVyIGFwcGx5aW5nIE0yIG1hdHJpeCwgYnV0IG9ubHkgZm9yIGJpbmF1cmFsCisgICB1cG1peCB0eXBlIFNjYWxpbmcgaXMgY29tcGVuc2F0ZWQgbGF0ZXIgaW4gc3ludGhlc2lzIHFtZiBmaWx0ZXJiYW5rICovCisjZGVmaW5lIFNDQUxFX0RBVEFfQVBQTFlfTTIgKDEpCisKK1NBQ0RFQ19FUlJPUiBpbml0TTFhbmRNMihzcGF0aWFsRGVjKiBzZWxmLCBpbnQgaW5pdFN0YXRlc0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbmZpZ0NoYW5nZWQpOworCitpbnQgU3BhdGlhbERlY0dldFJlc2lkdWFsSW5kZXgoc3BhdGlhbERlYyogc2VsZiwgaW50IHJvdyk7CisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQ2FsY3VsYXRlTTFhbmRNMihzcGF0aWFsRGVjKiBzZWxmLCBpbnQgcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1BBVElBTF9CU19GUkFNRSogZnJhbWUpOworCisjZW5kaWYgLyogU0FDX0NBTENNMUFORE0yX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2RlYy9zcmMvc2FjX2RlYy5jcHAgYi9saWJTQUNkZWMvc3JjL3NhY19kZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MzdkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY19kZWMuY3BwCkBAIC0wLDAgKzEsMTUwOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBTQUMgRGVjb2RlciBMaWJyYXJ5CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJzYWNfZGVjX2Vycm9yY29kZXMuaCIKKyNpbmNsdWRlICJzYWNfZGVjLmgiCisKKyNpbmNsdWRlICJzYWNfcHJvY2Vzcy5oIgorI2luY2x1ZGUgInNhY19iaXRkZWMuaCIKKyNpbmNsdWRlICJzYWNfc21vb3RoaW5nLmgiCisjaW5jbHVkZSAic2FjX2NhbGNNMWFuZE0yLmgiCisjaW5jbHVkZSAic2FjX3Jlc2hhcGVCQkVudi5oIgorI2luY2x1ZGUgInNhY19zdHAuaCIKKyNpbmNsdWRlICJzYWNfcm9tLmgiCisKKyNpbmNsdWRlICJGREtfZGVjb3JyZWxhdGUuaCIKKworI2luY2x1ZGUgIkZES190cmlnRmN0cy5oIgorI2luY2x1ZGUgIkZES19tYXRyaXhDYWxsb2MuaCIKKworLyogc3RhdGljIGludCBwYlN0cmlkZVRhYmxlW10gPSB7MSwgMiwgNSwgMjh9OyBzZWUgc2FjX3JvbS5jcHAgKi8KKworZW51bSB7CisgIEFQUExZX00yX05PTkUgPSAwLCAgICAvKiBpbml0IHZhbHVlICovCisgIEFQUExZX00yID0gMSwgICAgICAgICAvKiBhcHBseSBtMiBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbiAqLworICBBUFBMWV9NMl9NT0RFMjEyID0gMiwgLyogYXBwbHkgbTIgZm9yIDIxMiBtb2RlICovCisgIEFQUExZX00yX01PREUyMTJfUmVzX1BoYXNlQ29kaW5nID0KKyAgICAgIDMgLyogYXBwbHkgbTIgZm9yIDIxMiBtb2RlIHdpdGggcmVzaWR1YWxzIGFuZCBwaGFzZSBjb2RpbmcgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBmdW5jdGlvbjogRkRLX1NwYXRpYWxEZWNJbml0RGVmYXVsdFNwYXRpYWxTcGVjaWZpY0NvbmZpZyAqLworLyogb3V0cHV0OiAgIHN0cnVjdCBvZiB0eXBlIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICovCisvKiBpbnB1dDogICAgY29yZSBjb2RlciBhdWRpbyBvYmplY3QgdHlwZSAqLworLyogaW5wdXQ6ICAgIG5yIG9mIGNvcmUgY2hhbm5lbHMgKi8KKy8qIGlucHV0OiAgICBzYW1wbGluZyByYXRlICovCisvKiBpbnB1dDogICAgbnIgb2YgdGltZSBzbG90cyAqLworLyogaW5wdXQ6ICAgIGRlY29kZXIgbGV2ZWwgKi8KKy8qIGlucHV0OiAgICBmbGFnIGluZGljYXRpbmcgdXBtaXggdHlwZSBibGluZCAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHJldHVybnM6ICBlcnJvciBjb2RlICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IEZES19TcGF0aWFsRGVjSW5pdERlZmF1bHRTcGF0aWFsU3BlY2lmaWNDb25maWcoCisgICAgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnBTcGF0aWFsU3BlY2lmaWNDb25maWcsCisgICAgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLCBpbnQgY29yZUNoYW5uZWxzLCBpbnQgc2FtcGxpbmdGcmVxLAorICAgIGludCBuVGltZVNsb3RzLCBpbnQgZGVjb2RlckxldmVsLCBpbnQgaXNCbGluZCkgeworICByZXR1cm4gU3BhdGlhbERlY0RlZmF1bHRTcGVjaWZpY0NvbmZpZyhwU3BhdGlhbFNwZWNpZmljQ29uZmlnLCBjb3JlQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nRnJlcSwgblRpbWVTbG90cywgZGVjb2RlckxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0JsaW5kLCBjb3JlQ2hhbm5lbHMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZnVuY3Rpb246IEZES19TcGF0aWFsRGVjQ29tcGFyZVNwYXRpYWxTcGVjaWZpY0NvbmZpZ0hlYWRlciAqLworLyogaW5wdXQ6ICAgIDIgcG9pbnRlcnMgdG8gYSBzc2MgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBvdXRwdXQ6ICAgLSAqLworLyogcmV0dXJuczogIGVycm9yIGNvZGUgKDAgPSBlcXVhbCwgPD4wIHVuZXF1YWwpICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IEZES19TcGF0aWFsRGVjQ29tcGFyZVNwYXRpYWxTcGVjaWZpY0NvbmZpZ0hlYWRlcigKKyAgICBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqcFNzYzEsIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3NjMikgeworICBpbnQgcmVzdWx0ID0gTVBTX09LOworCisgIC8qIHdlIGFzc3VtZTogZXZlcnkgYml0IG11c3QgYmUgZXF1YWwgKi8KKyAgaWYgKEZES21lbWNtcChwU3NjMSwgcFNzYzIsIHNpemVvZihTUEFUSUFMX1NQRUNJRklDX0NPTkZJRykpICE9IDApIHsKKyAgICByZXN1bHQgPSBNUFNfVU5FUVVBTF9TU0M7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IFNwYXRpYWxEZWNDbGVhckZyYW1lRGF0YQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOiBDbGVhci9GYWtlIGZyYW1lIGRhdGEgdG8gYXZvaWQgbWlzY29uZmlndXJhdGlvbiBhbmQgYWxsb3cgcHJvcGVyCisgICAgICAgICAgICAgIGVycm9yIGNvbmNlYWxtZW50LgorIEFyZ3VtZW50czoKKyBJbnB1dDogICAgICAgc2VsZiAoZnJhbWUgZGF0YSkKKyBPdXRwdXQ6ICAgICAgTm8gcmV0dXJuIHZhbHVlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgU3BhdGlhbERlY0NsZWFyRnJhbWVEYXRhKAorICAgIHNwYXRpYWxEZWMgKnNlbGYsIC8qIFNoYWxsIGJlIHJlbW92ZWQgKi8KKyAgICBTUEFUSUFMX0JTX0ZSQU1FICpic0ZyYW1lLCBjb25zdCBTQUNERUNfQ1JFQVRJT05fUEFSQU1TICpjb25zdCBzZXR1cCkgeworICBpbnQgaTsKKworICBGREtfQVNTRVJUKHNlbGYgIT0gTlVMTCk7CisgIEZES19BU1NFUlQoYnNGcmFtZSAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChzZXR1cCAhPSBOVUxMKTsKKworICAvKiBkbyBub3QgYXBwbHkgc2hhcGluZyB0b29scyAoR0VTIG9yIFNUUCkgKi8KKyAgZm9yIChpID0gMDsgaSA8IHNldHVwLT5tYXhOdW1PdXRwdXRDaGFubmVsczsKKyAgICAgICBpICs9IDEpIHsgLyogTUFYX09VVFBVVF9DSEFOTkVMUyAqLworICAgIGJzRnJhbWUtPnRlbXBTaGFwZUVuYWJsZUNoYW5uZWxTVFBbaV0gPSAwOworICAgIGJzRnJhbWUtPnRlbXBTaGFwZUVuYWJsZUNoYW5uZWxHRVNbaV0gPSAwOworICB9CisKKyAgYnNGcmFtZS0+VHNkRGF0YS0+YnNUc2RFbmFibGUgPSAwOworCisgIC8qIHVzZSBvbmx5IDEgcGFyYW1ldGVyIHNldCBhdCB0aGUgZW5kIG9mIHRoZSBmcmFtZSAqLworICBic0ZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzID0gMTsKKyAgYnNGcmFtZS0+cGFyYW1TbG90WzBdID0gc2VsZi0+dGltZVNsb3RzIC0gMTsKKworICAvKiBwYXJhbWV0ZXIgc21vb3RoaW5nIHRvb2wgc2V0IHRvIG9mZiAqLworICBic0ZyYW1lLT5ic1Ntb290aE1vZGVbMF0gPSAwOworCisgIC8qIHJlc2V0IHJlc2lkdWFsIGRhdGEgKi8KKyAgeworICAgIGludCByZXNRbWZCYW5kcywgcmVzVGltZVNsb3RzID0gKDEpOworCisgICAgcmVzUW1mQmFuZHMgPSBzZXR1cC0+bWF4TnVtUW1mQmFuZHM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2V0dXAtPmJQcm9jUmVzaWR1YWwKKyAgICAgICAgICAgICAgICAgICAgPyBmTWluKHNldHVwLT5tYXhOdW1SZXNDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwLT5tYXhOdW1PdHRCb3hlcyArIHNldHVwLT5tYXhOdW1JbnB1dENoYW5uZWxzKQorICAgICAgICAgICAgICAgICAgICA6IDA7CisgICAgICAgICBpICs9IDEpIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVzVGltZVNsb3RzOyBqICs9IDEpIHsKKyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCByZXNRbWZCYW5kczsgayArPSAxKSB7CisgICAgICAgICAgc2VsZi0+cW1mUmVzaWR1YWxSZWFsX19GREtbaV1bal1ba10gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgICAgICBzZWxmLT5xbWZSZXNpZHVhbEltYWdfX0ZES1tpXVtqXVtrXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogRkRLX1NwYXRpYWxEZWNPcGVuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6CisKKyBSZXR1cm46CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzcGF0aWFsRGVjICpGREtfU3BhdGlhbERlY09wZW4oY29uc3QgU1BBVElBTF9ERUNfQ09ORklHICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXJlb0NvbmZpZ0luZGV4KSB7CisgIGludCBpOworICBpbnQgbGZTaXplLCBoZlNpemU7CisgIHNwYXRpYWxEZWMgKnNlbGYgPSBOVUxMOworICBTQUNERUNfQ1JFQVRJT05fUEFSQU1TIHNldHVwOworCisgIHN3aXRjaCAoY29uZmlnLT5kZWNvZGVyTGV2ZWwpIHsKKyAgICBjYXNlIERFQ09ERVJfTEVWRUxfMDogLyogMjEyIG1heE51bU91dHB1dENoYW5uZWxzPT0gMiAqLworICAgICAgc2V0dXAubWF4TnVtSW5wdXRDaGFubmVscyA9IDE7CisgICAgICBzZXR1cC5tYXhOdW1PdXRwdXRDaGFubmVscyA9IDI7CisgICAgICBzZXR1cC5tYXhOdW1RbWZCYW5kcyA9IDY0OworICAgICAgc2V0dXAubWF4TnVtWENoYW5uZWxzID0gMjsKKyAgICAgIHNldHVwLm1heE51bVZDaGFubmVscyA9IDI7CisgICAgICBzZXR1cC5tYXhOdW1EZWNvckNoYW5uZWxzID0gMTsKKyAgICAgIHNldHVwLmJQcm9jUmVzaWR1YWwgPSAxOworICAgICAgc2V0dXAubWF4TnVtUmVzaWR1YWxDaGFubmVscyA9IDA7CisgICAgICBzZXR1cC5tYXhOdW1PdHRCb3hlcyA9IDE7CisgICAgICBzZXR1cC5tYXhOdW1QYXJhbXMgPSBzZXR1cC5tYXhOdW1JbnB1dENoYW5uZWxzICsgc2V0dXAubWF4TnVtT3R0Qm94ZXM7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBzZXR1cC5tYXhOdW1SZXNDaGFubmVscyA9IDE7CisKKyAgeworICAgIHN3aXRjaCAoY29uZmlnLT5tYXhOdW1PdXRwdXRDaGFubmVscykgeworICAgICAgY2FzZSBPVVRQVVRfQ0hBTk5FTFNfMl8wOgorICAgICAgICBzZXR1cC5tYXhOdW1PdXRwdXRDaGFubmVscyA9IGZNaW4oc2V0dXAubWF4TnVtT3V0cHV0Q2hhbm5lbHMsIDIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1VUUFVUX0NIQU5ORUxTX0RFRkFVTFQ6CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBzZXR1cC5tYXhOdW1IeWJyaWRCYW5kcyA9IFNhY0dldEh5YnJpZFN1YmJhbmRzKHNldHVwLm1heE51bVFtZkJhbmRzKTsKKworICBzd2l0Y2ggKGNvbmZpZy0+ZGVjb2Rlck1vZGUpIHsKKyAgICBjYXNlIEVYVF9IUV9PTkxZOgorICAgICAgc2V0dXAubWF4TnVtQ21wbHhRbWZCYW5kcyA9IHNldHVwLm1heE51bVFtZkJhbmRzOworICAgICAgc2V0dXAubWF4TnVtQ21wbHhIeWJCYW5kcyA9IHNldHVwLm1heE51bUh5YnJpZEJhbmRzOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHNldHVwLm1heE51bUNtcGx4UW1mQmFuZHMgPSBmaXhNYXgoUENfTlVNX0JBTkRTLCBzZXR1cC5tYXhOdW1RbWZCYW5kcyk7CisgICAgICBzZXR1cC5tYXhOdW1DbXBseEh5YkJhbmRzID0KKyAgICAgICAgICBmaXhNYXgoUENfTlVNX0hZQl9CQU5EUywgc2V0dXAubWF4TnVtSHlicmlkQmFuZHMpOworICAgICAgYnJlYWs7CisgIH0gLyogc3dpdGNoIGNvbmZpZy0+ZGVjb2Rlck1vZGUgKi8KKworICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEX0lOVChzZWxmLCAxLCBzcGF0aWFsRGVjLCBTRUNUX0RBVEFfTDIpCisKKyAgc2VsZi0+Y3JlYXRlUGFyYW1zID0gc2V0dXA7CisKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChzZWxmLT5wYXJhbTJoeWIsIE1BWF9QQVJBTUVURVJfQkFORFMgKyAxLCBpbnQpCisKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChzZWxmLT5udW1PdHRCYW5kcywgc2V0dXAubWF4TnVtT3R0Qm94ZXMsIGludCkKKworICAvKiBhbGxvY2F0ZSBhcnJheXMgKi8KKworICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKHNlbGYtPnNtZ1RpbWUsIE1BWF9QQVJBTUVURVJfU0VUUywgaW50KQorICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEKHNlbGYtPnNtZ0RhdGEsIE1BWF9QQVJBTUVURVJfU0VUUywgTUFYX1BBUkFNRVRFUl9CQU5EUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUikKKworICBGREtfQUxMT0NBVEVfTUVNT1JZXzNEKHNlbGYtPm90dENMRF9fRkRLLCBzZXR1cC5tYXhOdW1PdHRCb3hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUEFSQU1FVEVSX1NFVFMsIE1BWF9QQVJBTUVURVJfQkFORFMsIFNDSEFSKQorICBGREtfQUxMT0NBVEVfTUVNT1JZXzNEKHNlbGYtPm90dElDQ19fRkRLLCBzZXR1cC5tYXhOdW1PdHRCb3hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUEFSQU1FVEVSX1NFVFMsIE1BWF9QQVJBTUVURVJfQkFORFMsIFNDSEFSKQorICBGREtfQUxMT0NBVEVfTUVNT1JZXzNEKHNlbGYtPm90dElQRF9fRkRLLCBzZXR1cC5tYXhOdW1PdHRCb3hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUEFSQU1FVEVSX1NFVFMsIE1BWF9QQVJBTUVURVJfQkFORFMsIFNDSEFSKQorCisgIC8qIExhc3QgcGFyYW1ldGVycyBmcm9tIHByZXYgZnJhbWUgKi8KKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRChzZWxmLT5vdHRDTERpZHhQcmV2LCBzZXR1cC5tYXhOdW1PdHRCb3hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUEFSQU1FVEVSX0JBTkRTLCBTQ0hBUikKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRChzZWxmLT5vdHRJQ0NpZHhQcmV2LCBzZXR1cC5tYXhOdW1PdHRCb3hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUEFSQU1FVEVSX0JBTkRTLCBTQ0hBUikKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8zRChzZWxmLT5vdHRJQ0NkaWZmaWR4LCBzZXR1cC5tYXhOdW1PdHRCb3hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUEFSQU1FVEVSX1NFVFMsIE1BWF9QQVJBTUVURVJfQkFORFMsIFNDSEFSKQorICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEKHNlbGYtPm90dElQRGlkeFByZXYsIHNldHVwLm1heE51bU90dEJveGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QQVJBTUVURVJfQkFORFMsIFNDSEFSKQorICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEKHNlbGYtPmFyYmRteEdhaW5JZHhQcmV2LCBzZXR1cC5tYXhOdW1JbnB1dENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QQVJBTUVURVJfQkFORFMsIFNDSEFSKQorICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEKHNlbGYtPmNtcE90dENMRGlkeFByZXYsIHNldHVwLm1heE51bU90dEJveGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QQVJBTUVURVJfQkFORFMsIFNDSEFSKQorICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEKHNlbGYtPmNtcE90dElDQ2lkeFByZXYsIHNldHVwLm1heE51bU90dEJveGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QQVJBTUVURVJfQkFORFMsIFNDSEFSKQorICBGREtfQUxMT0NBVEVfTUVNT1JZXzNEKHNlbGYtPm91dElkeERhdGEsIHNldHVwLm1heE51bU90dEJveGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QQVJBTUVURVJfU0VUUywgTUFYX1BBUkFNRVRFUl9CQU5EUywgU0NIQVIpCisKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8zRChzZWxmLT5hcmJkbXhHYWluX19GREssIHNldHVwLm1heE51bUlucHV0Q2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BBUkFNRVRFUl9TRVRTLCBNQVhfUEFSQU1FVEVSX0JBTkRTLCBTQ0hBUikKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChzZWxmLT5hcmJkbXhBbHBoYV9fRkRLLCBzZXR1cC5tYXhOdW1JbnB1dENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKQorICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKHNlbGYtPmFyYmRteEFscGhhUHJldl9fRkRLLCBzZXR1cC5tYXhOdW1JbnB1dENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKQorICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEKHNlbGYtPmNtcEFyYmRteEdhaW5JZHhQcmV2LCBzZXR1cC5tYXhOdW1JbnB1dENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QQVJBTUVURVJfQkFORFMsIFNDSEFSKQorCisgIEZES19BTExPQ0FURV9NRU1PUllfMkQoc2VsZi0+Y21wT3R0SVBEaWR4UHJldiwgc2V0dXAubWF4TnVtT3R0Qm94ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BBUkFNRVRFUl9CQU5EUywgU0NIQVIpCisKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8zRF9JTlQoc2VsZi0+TTJSZWFsX19GREssIHNldHVwLm1heE51bU91dHB1dENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5tYXhOdW1WQ2hhbm5lbHMsIE1BWF9QQVJBTUVURVJfQkFORFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMLCBTRUNUX0RBVEFfTDIpCisgIEZES19BTExPQ0FURV9NRU1PUllfM0Qoc2VsZi0+TTJJbWFnX19GREssIHNldHVwLm1heE51bU91dHB1dENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwLm1heE51bVZDaGFubmVscywgTUFYX1BBUkFNRVRFUl9CQU5EUywgRklYUF9EQkwpCisKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8zRF9JTlQoc2VsZi0+TTJSZWFsUHJldl9fRkRLLCBzZXR1cC5tYXhOdW1PdXRwdXRDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4TnVtVkNoYW5uZWxzLCBNQVhfUEFSQU1FVEVSX0JBTkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCwgU0VDVF9EQVRBX0wyKQorICBGREtfQUxMT0NBVEVfTUVNT1JZXzNEKHNlbGYtPk0ySW1hZ1ByZXZfX0ZESywgc2V0dXAubWF4TnVtT3V0cHV0Q2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4TnVtVkNoYW5uZWxzLCBNQVhfUEFSQU1FVEVSX0JBTkRTLCBGSVhQX0RCTCkKKworICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEX0lOVF9BTElHTkVEKAorICAgICAgc2VsZi0+cW1mSW5wdXRSZWFsX19GREssIHNldHVwLm1heE51bUlucHV0Q2hhbm5lbHMsIHNldHVwLm1heE51bVFtZkJhbmRzLAorICAgICAgRklYUF9EQkwsIFNFQ1RfREFUQV9MMikKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRF9JTlRfQUxJR05FRCgKKyAgICAgIHNlbGYtPnFtZklucHV0SW1hZ19fRkRLLCBzZXR1cC5tYXhOdW1JbnB1dENoYW5uZWxzLAorICAgICAgc2V0dXAubWF4TnVtQ21wbHhRbWZCYW5kcywgRklYUF9EQkwsIFNFQ1RfREFUQV9MMikKKworICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEX0lOVChzZWxmLT5oeWJJbnB1dFJlYWxfX0ZESywgc2V0dXAubWF4TnVtSW5wdXRDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4TnVtSHlicmlkQmFuZHMsIEZJWFBfREJMLCBTRUNUX0RBVEFfTDIpCisgIEZES19BTExPQ0FURV9NRU1PUllfMkRfSU5UKHNlbGYtPmh5YklucHV0SW1hZ19fRkRLLCBzZXR1cC5tYXhOdW1JbnB1dENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5tYXhOdW1DbXBseEh5YkJhbmRzLCBGSVhQX0RCTCwgU0VDVF9EQVRBX0wyKQorCisgIGlmIChzZXR1cC5iUHJvY1Jlc2lkdWFsKSB7CisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChzZWxmLT5xbWZSZXNpZHVhbFJlYWxfX0ZESywgc2V0dXAubWF4TnVtUmVzQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKikKKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKHNlbGYtPnFtZlJlc2lkdWFsSW1hZ19fRkRLLCBzZXR1cC5tYXhOdW1SZXNDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqKQorCisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChzZWxmLT5oeWJSZXNpZHVhbFJlYWxfX0ZESywgc2V0dXAubWF4TnVtUmVzQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKQorICAgIEZES19BTExPQ0FURV9NRU1PUllfMUQoc2VsZi0+aHliUmVzaWR1YWxJbWFnX19GREssIHNldHVwLm1heE51bVJlc0NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKikKKworICAgIGZvciAoaSA9IDA7IGkgPCBzZXR1cC5tYXhOdW1SZXNDaGFubmVsczsgaSsrKSB7CisgICAgICBpbnQgcmVzUW1mQmFuZHMgPSAoY29uZmlnLT5kZWNvZGVyTW9kZSA9PSBFWFRfTFBfT05MWSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFBDX05VTV9CQU5EUworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2V0dXAubWF4TnVtUW1mQmFuZHM7CisgICAgICBpbnQgcmVzSHliQmFuZHMgPSAoY29uZmlnLT5kZWNvZGVyTW9kZSA9PSBFWFRfTFBfT05MWSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFBDX05VTV9IWUJfQkFORFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNldHVwLm1heE51bUh5YnJpZEJhbmRzOworICAgICAgLyogQWxpZ25tZW50IGlzIG5lZWRlZCBmb3IgVVNBQyByZXNpZHVhbHMgYmVjYXVzZSBRTUYgYW5hbHlzaXMgZGlyZWN0bHkKKyAgICAgICAqIHdyaXRlcyB0byB0aGlzIGJ1ZmZlci4gKi8KKyAgICAgIEZES19BTExPQ0FURV9NRU1PUllfMkRfSU5UX0FMSUdORUQoc2VsZi0+cW1mUmVzaWR1YWxSZWFsX19GREtbaV0sICgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzUW1mQmFuZHMsIEZJWFBfREJMLCBTRUNUX0RBVEFfTDEpCisgICAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEX0lOVF9BTElHTkVEKHNlbGYtPnFtZlJlc2lkdWFsSW1hZ19fRkRLW2ldLCAoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1FtZkJhbmRzLCBGSVhQX0RCTCwgU0VDVF9EQVRBX0wxKQorCisgICAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKHNlbGYtPmh5YlJlc2lkdWFsUmVhbF9fRkRLW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5tYXhOdW1IeWJyaWRCYW5kcywgRklYUF9EQkwpCisgICAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKHNlbGYtPmh5YlJlc2lkdWFsSW1hZ19fRkRLW2ldLCByZXNIeWJCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwpCisgICAgfQorICB9IC8qIGlmIChzZXR1cC5iUHJvY1Jlc2lkdWFsKSAqLworCisgIEZES19BTExPQ0FURV9NRU1PUllfMkRfSU5UKHNlbGYtPndSZWFsX19GREssIHNldHVwLm1heE51bVZDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4TnVtSHlicmlkQmFuZHMsIEZJWFBfREJMLCBTRUNUX0RBVEFfTDIpCisgIEZES19BTExPQ0FURV9NRU1PUllfMkRfSU5UKHNlbGYtPndJbWFnX19GREssIHNldHVwLm1heE51bVZDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4TnVtQ21wbHhIeWJCYW5kcywgRklYUF9EQkwsIFNFQ1RfREFUQV9MMikKKworICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEX0lOVChzZWxmLT5oeWJPdXRwdXRSZWFsRHJ5X19GREssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwLm1heE51bU91dHB1dENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5tYXhOdW1IeWJyaWRCYW5kcywgRklYUF9EQkwsIFNFQ1RfREFUQV9MMikKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRF9JTlQoc2VsZi0+aHliT3V0cHV0SW1hZ0RyeV9fRkRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5tYXhOdW1PdXRwdXRDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4TnVtQ21wbHhIeWJCYW5kcywgRklYUF9EQkwsIFNFQ1RfREFUQV9MMikKKworICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEX0lOVChzZWxmLT5oeWJPdXRwdXRSZWFsV2V0X19GREssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwLm1heE51bU91dHB1dENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5tYXhOdW1IeWJyaWRCYW5kcywgRklYUF9EQkwsIFNFQ1RfREFUQV9MMikKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRF9JTlQoc2VsZi0+aHliT3V0cHV0SW1hZ1dldF9fRkRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5tYXhOdW1PdXRwdXRDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4TnVtQ21wbHhIeWJCYW5kcywgRklYUF9EQkwsIFNFQ1RfREFUQV9MMikKKworICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKHNlbGYtPmh5YnJpZFN5bnRoZXNpcywgc2V0dXAubWF4TnVtT3V0cHV0Q2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRkRLX1NZTl9IWUJfRklMVEVSKQorCisgIEZES19BTExPQ0FURV9NRU1PUllfMUQoCisgICAgICBzZWxmLT5oeWJyaWRBbmFseXNpcywKKyAgICAgIHNldHVwLmJQcm9jUmVzaWR1YWwgPyBzZXR1cC5tYXhOdW1JbnB1dENoYW5uZWxzICsgc2V0dXAubWF4TnVtUmVzQ2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzZXR1cC5tYXhOdW1JbnB1dENoYW5uZWxzLAorICAgICAgRkRLX0FOQV9IWUJfRklMVEVSKQorCisgIGxmU2l6ZSA9IDIgKiBCVUZGRVJfTEVOX0xGICogTUFYX1FNRl9CQU5EU19UT19IWUJSSUQ7CisgIHsKKyAgICBoZlNpemUgPQorICAgICAgICBCVUZGRVJfTEVOX0hGICogKChzZXR1cC5tYXhOdW1RbWZCYW5kcyAtIE1BWF9RTUZfQkFORFNfVE9fSFlCUklEKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKHNldHVwLm1heE51bUNtcGx4UW1mQmFuZHMgLSBNQVhfUU1GX0JBTkRTX1RPX0hZQlJJRCkpOworICB9CisKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRF9JTlQoc2VsZi0+cEh5YnJpZEFuYVN0YXRlc0xGZG14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5tYXhOdW1JbnB1dENoYW5uZWxzLCBsZlNpemUsIEZJWFBfREJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUX0RBVEFfTDIpIHsKKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEKHNlbGYtPnBIeWJyaWRBbmFTdGF0ZXNIRmRteCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwLm1heE51bUlucHV0Q2hhbm5lbHMsIGhmU2l6ZSwgRklYUF9EQkwpCisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgc2V0dXAubWF4TnVtSW5wdXRDaGFubmVsczsgaSsrKSB7CisgICAgRklYUF9EQkwgKnBIeWJyaWRBbmFTdGF0ZXNIRmRteDsKKworICAgIHBIeWJyaWRBbmFTdGF0ZXNIRmRteCA9IHNlbGYtPnBIeWJyaWRBbmFTdGF0ZXNIRmRteFtpXTsKKworICAgIEZES2h5YnJpZEFuYWx5c2lzT3Blbigmc2VsZi0+aHlicmlkQW5hbHlzaXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnBIeWJyaWRBbmFTdGF0ZXNMRmRteFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGZTaXplICogc2l6ZW9mKEZJWFBfREJMKSwgcEh5YnJpZEFuYVN0YXRlc0hGZG14LAorICAgICAgICAgICAgICAgICAgICAgICAgICBoZlNpemUgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgfQorICBpZiAoc2V0dXAuYlByb2NSZXNpZHVhbCkgeworICAgIGxmU2l6ZSA9IDIgKiBCVUZGRVJfTEVOX0xGICogTUFYX1FNRl9CQU5EU19UT19IWUJSSUQ7CisgICAgaGZTaXplID0gQlVGRkVSX0xFTl9IRiAqCisgICAgICAgICAgICAgKCgoKGNvbmZpZy0+ZGVjb2Rlck1vZGUgPT0gRVhUX0xQX09OTFkpID8gUENfTlVNX0JBTkRTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2V0dXAubWF4TnVtUW1mQmFuZHMpIC0KKyAgICAgICAgICAgICAgIE1BWF9RTUZfQkFORFNfVE9fSFlCUklEKSArCisgICAgICAgICAgICAgIChzZXR1cC5tYXhOdW1DbXBseFFtZkJhbmRzIC0gTUFYX1FNRl9CQU5EU19UT19IWUJSSUQpKTsKKworICAgIEZES19BTExPQ0FURV9NRU1PUllfMkRfSU5UKHNlbGYtPnBIeWJyaWRBbmFTdGF0ZXNMRnJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5tYXhOdW1SZXNDaGFubmVscywgbGZTaXplLCBGSVhQX0RCTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUX0RBVEFfTDIpCisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRChzZWxmLT5wSHlicmlkQW5hU3RhdGVzSEZyZXMsIHNldHVwLm1heE51bVJlc0NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGZTaXplLCBGSVhQX0RCTCkKKworICAgIGZvciAoaSA9IHNldHVwLm1heE51bUlucHV0Q2hhbm5lbHM7CisgICAgICAgICBpIDwgKHNldHVwLm1heE51bUlucHV0Q2hhbm5lbHMgKyBzZXR1cC5tYXhOdW1SZXNDaGFubmVscyk7IGkrKykgeworICAgICAgRkRLaHlicmlkQW5hbHlzaXNPcGVuKAorICAgICAgICAgICZzZWxmLT5oeWJyaWRBbmFseXNpc1tpXSwKKyAgICAgICAgICBzZWxmLT5wSHlicmlkQW5hU3RhdGVzTEZyZXNbaSAtIHNldHVwLm1heE51bUlucHV0Q2hhbm5lbHNdLAorICAgICAgICAgIGxmU2l6ZSAqIHNpemVvZihGSVhQX0RCTCksCisgICAgICAgICAgc2VsZi0+cEh5YnJpZEFuYVN0YXRlc0hGcmVzW2kgLSBzZXR1cC5tYXhOdW1JbnB1dENoYW5uZWxzXSwKKyAgICAgICAgICBoZlNpemUgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICB9CisgIH0KKworICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKHNlbGYtPnNtb290aFN0YXRlLCAxLCBTTU9PVEhJTkdfU1RBVEUpCisgIEZES19BTExPQ0FURV9NRU1PUllfMUQoc2VsZi0+cmVzaGFwZUJCRW52U3RhdGUsIDEsIFJFU0hBUEVfQkJFTlZfU1RBVEUpCisKKyAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChzZWxmLT5hcERlY29yLCBzZXR1cC5tYXhOdW1EZWNvckNoYW5uZWxzLCBERUNPUlJfREVDKQorICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEX0lOVChzZWxmLT5wRGVjb3JCdWZmZXJDcGx4LCBzZXR1cC5tYXhOdW1EZWNvckNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiAqICgoODI1KSArICgzNzMpKSksIEZJWFBfREJMLCBTRUNUX0RBVEFfTDIpCisKKyAgZm9yIChpID0gMDsgaSA8IHNldHVwLm1heE51bURlY29yQ2hhbm5lbHM7IGkrKykgeworICAgIGlmIChGREtkZWNvcnJlbGF0ZU9wZW4oJnNlbGYtPmFwRGVjb3JbaV0sIHNlbGYtPnBEZWNvckJ1ZmZlckNwbHhbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiAqICgoODI1KSArICgzNzMpKSkpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICB9CisKKyAgaWYgKHN1YmJhbmRUUENyZWF0ZSgmc2VsZi0+aFN0cERlYykgIT0gTVBTX09LKSB7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogc2F2ZSBnZW5lcmFsIGRlY29kZXIgY29uZmlndXJhdGlvbiAqLworICBzZWxmLT5kZWNvZGVyTGV2ZWwgPSBjb25maWctPmRlY29kZXJMZXZlbDsKKyAgc2VsZi0+ZGVjb2Rlck1vZGUgPSBjb25maWctPmRlY29kZXJNb2RlOworICBzZWxmLT5iaW5hdXJhbE1vZGUgPSBjb25maWctPmJpbmF1cmFsTW9kZTsKKworICAvKiBwcmVpbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gKi8KKyAgc2VsZi0+cGFydGlhbGx5Q29tcGxleCA9IChjb25maWctPmRlY29kZXJNb2RlICE9IEVYVF9IUV9PTkxZKSA/IDEgOiAwOworCisgIC8qIFNldCB0byBkZWZhdWx0IHN0YXRlICovCisgIFNwYXRpYWxEZWNDb25jZWFsbWVudF9Jbml0KCZzZWxmLT5jb25jZWFsSW5mbywgTVBFR1NfQ09OQ0VBTF9SRVNFVF9BTEwpOworCisgIC8qIEV2ZXJ5dGhpbmcgaXMgZmluZSBzbyByZXR1cm4gdGhlIGhhbmRsZSAqLworICByZXR1cm4gc2VsZjsKKworYmFpbDoKKyAgLyogQ29sbGVjdG9yIGZvciBhbGwgZXJyb3JzLgorICAgICBEZWFsbG9jYXRlIGFsbCBtZW1vcnkgYW5kIHJldHVybiBhIGludmFsaWQgaGFuZGxlLiAqLworICBGREtfU3BhdGlhbERlY0Nsb3NlKHNlbGYpOworCisgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogaXNWYWxpZENvbmZpZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOiBWYWxpZGF0ZSBpZiBjb25maWd1cmF0aW9uIGlzIHN1cHBvcnRlZCBpbiBwcmVzZW50IGluc3RhbmNlCisKKyBBcmd1bWVudHM6CisKKyBSZXR1cm46IDE6IGFsbCBva2F5CisgICAgICAgICAwOiBjb25maWd1cmF0aW9uIG5vdCBzdXBwb3J0ZWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGlzVmFsaWRDb25maWcoc3BhdGlhbERlYyBjb25zdCAqY29uc3Qgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTUEFUSUFMX0RFQ19VUE1JWF9UWVBFIHVwbWl4VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTUEFUSUFMREVDX1BBUkFNIGNvbnN0ICpjb25zdCBwVXNlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQW90KSB7CisgIFVQTUlYVFlQRSBuVXBtaXhUeXBlOworCisgIEZES19BU1NFUlQoc2VsZiAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChwVXNlclBhcmFtcyAhPSBOVUxMKTsKKworICBuVXBtaXhUeXBlID0gKFVQTUlYVFlQRSl1cG1peFR5cGU7CisKKyAgc3dpdGNoIChuVXBtaXhUeXBlKSB7CisgICAgY2FzZSBVUE1JWFRZUEVfQllQQVNTOiAvKiBVUE1JWF9UWVBFX0JZUEFTUyAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSBVUE1JWFRZUEVfTk9STUFMOiAvKiBVUE1JWF9UWVBFX05PUk1BTCAqLworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOyAvKiB1bnN1cHBvcnRlZCB1cG1peFR5cGUgKi8KKyAgfQorCisgIHJldHVybiAxOyAvKiB1cG1peFR5cGUgc3VwcG9ydGVkICovCit9CisKK3N0YXRpYyBTQUNERUNfRVJST1IgQ2hlY2tMZXZlbFRyZWVVcG1peFR5cGUoCisgICAgY29uc3QgU0FDREVDX0NSRUFUSU9OX1BBUkFNUyAqY29uc3QgcENyZWF0ZVBhcmFtcywKKyAgICBjb25zdCBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqY29uc3QgcFNzYywgY29uc3QgaW50IGRlY29kZXJMZXZlbCwKKyAgICBjb25zdCBVUE1JWFRZUEUgdXBtaXhUeXBlKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIGludCBuT3V0cHV0Q2hhbm5lbHMsIHRyZWVDb25maWc7CisKKyAgRkRLX0FTU0VSVChwQ3JlYXRlUGFyYW1zICE9IE5VTEwpOworICBGREtfQVNTRVJUKHBTc2MgIT0gTlVMTCk7CisKKyAgdHJlZUNvbmZpZyA9IHBTc2MtPnRyZWVDb25maWc7CisKKyAgc3dpdGNoIChkZWNvZGVyTGV2ZWwpIHsKKyAgICBjYXNlIDA6IHsKKyAgICAgIGlmICh0cmVlQ29uZmlnICE9IFNQQVRJQUxERUNfTU9ERV9SU1ZENykgeworICAgICAgICBlcnIgPSBNUFNfSU5WQUxJRF9UUkVFQ09ORklHOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGVyciA9IE1QU19JTlZBTElEX1BBUkFNRVRFUiAvKiBNUFNfVU5JTVBMRU1FTlRFRCAqLzsKKyAgICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIHN3aXRjaCAodXBtaXhUeXBlKSB7CisgICAgY2FzZSBVUE1JWFRZUEVfQllQQVNTOgorICAgICAgbk91dHB1dENoYW5uZWxzID0gcFNzYy0+bklucHV0Q2hhbm5lbHM7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbk91dHB1dENoYW5uZWxzID0gcFNzYy0+bk91dHB1dENoYW5uZWxzOworICAgICAgYnJlYWs7CisgIH0KKworICAvKiBJcyBzdWZmaWNpZW50IG1lbW9yeSBhbGxvY2F0ZWQuICovCisgIGlmICgocFNzYy0+bklucHV0Q2hhbm5lbHMgPiBwQ3JlYXRlUGFyYW1zLT5tYXhOdW1JbnB1dENoYW5uZWxzKSB8fAorICAgICAgKG5PdXRwdXRDaGFubmVscyA+IHBDcmVhdGVQYXJhbXMtPm1heE51bU91dHB1dENoYW5uZWxzKSB8fAorICAgICAgKHBTc2MtPm5PdHRCb3hlcyA+IHBDcmVhdGVQYXJhbXMtPm1heE51bU90dEJveGVzKSkgeworICAgIGVyciA9IE1QU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgfQorCitiYWlsOgorICByZXR1cm4gZXJyOworfQorCit2b2lkIFNwYXRpYWxEZWNJbml0UGFyc2VyQ29udGV4dChzcGF0aWFsRGVjICpzZWxmKSB7CisgIGludCBpLCBqOworCisgIGZvciAoaSA9IDA7IGkgPCBzZWxmLT5jcmVhdGVQYXJhbXMubWF4TnVtT3R0Qm94ZXM7IGkgKz0gMSkgeworICAgIGZvciAoaiA9IDA7IGogPCBNQVhfUEFSQU1FVEVSX0JBTkRTOyBqKyspIHsKKyAgICAgIHNlbGYtPm90dENMRGlkeFByZXZbaV1bal0gPSAwOworICAgICAgc2VsZi0+b3R0SUNDaWR4UHJldltpXVtqXSA9IDA7CisgICAgICBzZWxmLT5jbXBPdHRDTERpZHhQcmV2W2ldW2pdID0gMDsKKyAgICAgIHNlbGYtPmNtcE90dElDQ2lkeFByZXZbaV1bal0gPSAwOworICAgIH0KKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+Y3JlYXRlUGFyYW1zLm1heE51bUlucHV0Q2hhbm5lbHM7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCBNQVhfUEFSQU1FVEVSX0JBTkRTOyBqKyspIHsKKyAgICAgIHNlbGYtPmFyYmRteEdhaW5JZHhQcmV2W2ldW2pdID0gMDsKKyAgICAgIHNlbGYtPmNtcEFyYmRteEdhaW5JZHhQcmV2W2ldW2pdID0gMDsKKyAgICB9CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbm5hbWU6IEZES19TcGF0aWFsRGVjSW5pdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitTQUNERUNfRVJST1IgRkRLX1NwYXRpYWxEZWNJbml0KHNwYXRpYWxEZWMgKnNlbGYsIFNQQVRJQUxfQlNfRlJBTUUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqcFNwYXRpYWxTcGVjaWZpY0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5RbWZCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BBVElBTF9ERUNfVVBNSVhfVFlQRSBjb25zdCB1cG1peFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQQVRJQUxERUNfUEFSQU0gKnBVc2VyUGFyYW1zLCBVSU5UIGluaXRGbGFncykgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworICBpbnQgbkNoLCBpLCBqLCBrOworICBpbnQgbWF4UW1mQmFuZHM7CisgIGludCBieXBhc3NNb2RlID0gMDsKKworICBzZWxmLT51c2VGRHJldmVyYiA9IDA7CisKKyAgLyogY2hlY2sgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgKi8KKyAgaWYgKCFpc1ZhbGlkQ29uZmlnKHNlbGYsIHVwbWl4VHlwZSwgcFVzZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLT5jb3JlQ29kZWMpKSB7CisgICAgcmV0dXJuIE1QU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgfQorCisgIC8qIGNoZWNrIHRyZWUgY29uZmlndXJhdGlvbiAqLworICBlcnIgPSBDaGVja0xldmVsVHJlZVVwbWl4VHlwZSgmc2VsZi0+Y3JlYXRlUGFyYW1zLCBwU3BhdGlhbFNwZWNpZmljQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5kZWNvZGVyTGV2ZWwsIChVUE1JWFRZUEUpdXBtaXhUeXBlKTsKKyAgaWYgKGVyciAhPSBNUFNfT0spIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICAvKiBTdG9yZSBhbmQgdXBkYXRlIGluc3RhbmNlIGFmdGVyIGFsbCBjaGVja3MgcGFzc2VkIHN1Y2Nlc3NmdWxseTogKi8KKyAgc2VsZi0+dXBtaXhUeXBlID0gKFVQTUlYVFlQRSl1cG1peFR5cGU7CisKKyAgaWYgKGluaXRGbGFncyAmIE1QRUdTX0lOSVRfUEFSQU1TX0VSUk9SX0NPTkNFQUxNRU5UKSB7IC8qIEF0IGxlYXN0IG9uZSBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2VhbG1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBjaGFuZ2VkICovCisgICAgZXJyID0gU3BhdGlhbERlY0NvbmNlYWxtZW50X1NldFBhcmFtKAorICAgICAgICAmc2VsZi0+Y29uY2VhbEluZm8sIFNBQ19ERUNfQ09OQ0VBTF9NRVRIT0QsIHBVc2VyUGFyYW1zLT5jb25jZWFsTWV0aG9kKTsKKyAgICBpZiAoZXJyICE9IE1QU19PSykgeworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgICBlcnIgPSBTcGF0aWFsRGVjQ29uY2VhbG1lbnRfU2V0UGFyYW0oJnNlbGYtPmNvbmNlYWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQUNfREVDX0NPTkNFQUxfTlVNX0tFRVBfRlJBTUVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlclBhcmFtcy0+Y29uY2VhbE51bUtlZXBGcmFtZXMpOworICAgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgIGVyciA9IFNwYXRpYWxEZWNDb25jZWFsbWVudF9TZXRQYXJhbSgKKyAgICAgICAgJnNlbGYtPmNvbmNlYWxJbmZvLCBTQUNfREVDX0NPTkNFQUxfRkFERV9PVVRfU0xPUEVfTEVOR1RILAorICAgICAgICBwVXNlclBhcmFtcy0+Y29uY2VhbEZhZGVPdXRTbG9wZUxlbmd0aCk7CisgICAgaWYgKGVyciAhPSBNUFNfT0spIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgICAgZXJyID0gU3BhdGlhbERlY0NvbmNlYWxtZW50X1NldFBhcmFtKCZzZWxmLT5jb25jZWFsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FDX0RFQ19DT05DRUFMX0ZBREVfSU5fU0xPUEVfTEVOR1RILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlclBhcmFtcy0+Y29uY2VhbEZhZGVJblNsb3BlTGVuZ3RoKTsKKyAgICBpZiAoZXJyICE9IE1QU19PSykgeworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgICBlcnIgPSBTcGF0aWFsRGVjQ29uY2VhbG1lbnRfU2V0UGFyYW0oJnNlbGYtPmNvbmNlYWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQUNfREVDX0NPTkNFQUxfTlVNX1JFTEVBU0VfRlJBTUVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlclBhcmFtcy0+Y29uY2VhbE51bVJlbGVhc2VGcmFtZXMpOworICAgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICB9CisKKyAgaWYgKGluaXRGbGFncyAmCisgICAgICBNUEVHU19JTklUX1NUQVRFU19FUlJPUl9DT05DRUFMTUVOVCkgeyAvKiBTZXQgdG8gZGVmYXVsdCBzdGF0ZSAqLworICAgIFNwYXRpYWxEZWNDb25jZWFsbWVudF9Jbml0KCZzZWxmLT5jb25jZWFsSW5mbywgTVBFR1NfQ09OQ0VBTF9SRVNFVF9TVEFURSk7CisgIH0KKworICAvKiBkZXRlcm1pbmUgYnlwYXNzIG1vZGUgKi8KKyAgYnlwYXNzTW9kZSB8PSBwVXNlclBhcmFtcy0+YnlwYXNzTW9kZTsKKyAgYnlwYXNzTW9kZSB8PSAoKHNlbGYtPnVwbWl4VHlwZSA9PSBVUE1JWFRZUEVfQllQQVNTKSA/IDEgOiAwKTsKKworICAvKiBzdGF0aWMgZGVjb2RlciBzY2FsZSBkZXBlbmRzIG9uIG51bWJlciBvZiBxbWYgYmFuZHMgKi8KKyAgc3dpdGNoIChuUW1mQmFuZHMpIHsKKyAgICBjYXNlIDE2OgorICAgIGNhc2UgMjQ6CisgICAgY2FzZSAzMjoKKyAgICAgIHNlbGYtPnN0YXRpY0RlY1NjYWxlID0gMjE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY0OgorICAgICAgc2VsZi0+c3RhdGljRGVjU2NhbGUgPSAyMjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTVBTX0lOVkFMSURfUEFSQU1FVEVSOworICB9CisKKyAgc2VsZi0+bnVtUGFyYW1ldGVyU2V0c1ByZXYgPSAxOworCisgIHNlbGYtPnFtZkJhbmRzID0gblFtZkJhbmRzOworICAvKiBzZWxmLT5oeWJyaWRCYW5kcyB3aWxsIGJlIHVwZGF0ZWQgaW4gU3BhdGlhbERlY0RlY29kZUhlYWRlcigpIGJlbG93LiAqLworCisgIHNlbGYtPmJTaGFyZURlbGF5V2l0aFNCUiA9IDA7CisKKyAgZXJyID0gU3BhdGlhbERlY0RlY29kZUhlYWRlcihzZWxmLCBwU3BhdGlhbFNwZWNpZmljQ29uZmlnKTsKKyAgaWYgKGVyciAhPSBNUFNfT0spIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICBzZWxmLT5zdGVyZW9Db25maWdJbmRleCA9IHBTcGF0aWFsU3BlY2lmaWNDb25maWctPnN0ZXJlb0NvbmZpZ0luZGV4OworCisgIGlmIChpbml0RmxhZ3MgJiBNUEVHU19JTklUX1NUQVRFU19BTkFfUU1GX0ZJTFRFUikgeworICAgIHNlbGYtPnFtZklucHV0RGVsYXlCdWZQb3MgPSAwOworICAgIHNlbGYtPnBjX2ZpbHRlcmRlbGF5ID0gMTsgLyogRGl2aXNpb24gYnkgMCBub3QgcG9zc2libGUgKi8KKyAgfQorCisgIG1heFFtZkJhbmRzID0gc2VsZi0+cW1mQmFuZHM7CisKKyAgLyogaW5pdCByZXNpZHVhbCBkZWNvZGVyICovCisKKyAgLyogaW5pdCB0b25hbGl0eSBzbW9vdGhpbmcgKi8KKyAgaWYgKGluaXRGbGFncyAmIE1QRUdTX0lOSVRfU1RBVEVTX1BBUkFNKSB7CisgICAgaW5pdFBhcmFtZXRlclNtb290aGluZyhzZWxmKTsKKyAgfQorCisgIC8qIGluaXQgR0VTICovCisgIGluaXRCQkVudihzZWxmLCAoaW5pdEZsYWdzICYgTVBFR1NfSU5JVF9TVEFURVNfR0VTKSA/IDEgOiAwKTsKKworICAvKiBDbGlwIHByb3RlY3Rpb24gaXMgYXBwbGllZCBvbmx5IGZvciBub3JtYWwgcHJvY2Vzc2luZy4gKi8KKyAgaWYgKCFpc1R3b0NoTW9kZShzZWxmLT51cG1peFR5cGUpICYmICFieXBhc3NNb2RlKSB7CisgICAgc2VsZi0+c3RhdGljRGVjU2NhbGUgKz0gc2VsZi0+Y2xpcFByb3RlY3RHYWluU0ZfX0ZESzsKKyAgfQorCisgIHsKKyAgICBVSU5UIGZsYWdzID0gMDsKKyAgICBJTlQgaW5pdFN0YXRlc0ZsYWcgPSAoaW5pdEZsYWdzICYgTVBFR1NfSU5JVF9TVEFURVNfQU5BX1FNRl9GSUxURVIpID8gMSA6IDA7CisgICAgSU5UIHVzZUxkRmlsdGVyID0KKyAgICAgICAgKHNlbGYtPnBDb25maWdDdXJyZW50LT5zeW50YXhGbGFncyAmIFNBQ0RFQ19TWU5UQVhfTEQpID8gMSA6IDA7CisKKyAgICBmbGFncyA9IHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYuZmxhZ3NfcmVxdWVzdGVkOworICAgIGZsYWdzICY9ICh+KFVJTlQpUU1GX0ZMQUdfTFApOworCisgICAgaWYgKGluaXRTdGF0ZXNGbGFnKQorICAgICAgZmxhZ3MgJj0gflFNRl9GTEFHX0tFRVBfU1RBVEVTOworICAgIGVsc2UKKyAgICAgIGZsYWdzIHw9IFFNRl9GTEFHX0tFRVBfU1RBVEVTOworCisgICAgaWYgKHVzZUxkRmlsdGVyKQorICAgICAgZmxhZ3MgfD0gUU1GX0ZMQUdfTVBTTERGQjsKKyAgICBlbHNlCisgICAgICBmbGFncyAmPSB+UU1GX0ZMQUdfTVBTTERGQjsKKworICAgIHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYuZmxhZ3NfcmVxdWVzdGVkID0gZmxhZ3M7CisgICAgRkRLX1FtZkRvbWFpbl9Db25maWd1cmUoc2VsZi0+cFFtZkRvbWFpbik7CisKKyAgICAvKiBvdXRwdXQgc2NhbGluZyAqLworICAgIGZvciAobkNoID0gMDsgbkNoIDwgc2VsZi0+bnVtT3V0cHV0Q2hhbm5lbHNBVDsgbkNoKyspIHsKKyAgICAgIGludCBvdXRwdXRTY2FsZSA9IDAsIG91dHB1dEdhaW5fZSA9IDAsIHNjYWxlID0gMDsKKyAgICAgIEZJWFBfREJMIG91dHB1dEdhaW5fbSA9IGdldENoR2FpbihzZWxmLCBuQ2gsICZvdXRwdXRHYWluX2UpOworCisgICAgICBpZiAoIWlzVHdvQ2hNb2RlKHNlbGYtPnVwbWl4VHlwZSkgJiYgIWJ5cGFzc01vZGUpIHsKKyAgICAgICAgb3V0cHV0U2NhbGUgKz0KKyAgICAgICAgICAgIHNlbGYtPmNsaXBQcm90ZWN0R2FpblNGX19GREs7IC8qIGNvbnNpZGVyIGNsaXAgcHJvdGVjdGlvbiBzY2FsaW5nIGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50aGVzaXMgcW1mICovCisgICAgICB9CisKKyAgICAgIHNjYWxlID0gb3V0cHV0U2NhbGU7CisKKyAgICAgIHFtZkNoYW5nZU91dFNjYWxlZmFjdG9yKCZzZWxmLT5wUW1mRG9tYWluLT5RbWZEb21haW5PdXRbbkNoXS5mYiwgc2NhbGUpOworICAgICAgcW1mQ2hhbmdlT3V0R2Fpbigmc2VsZi0+cFFtZkRvbWFpbi0+UW1mRG9tYWluT3V0W25DaF0uZmIsIG91dHB1dEdhaW5fbSwKKyAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0R2Fpbl9lKTsKKyAgICB9CisgIH0KKworICBmb3IgKG5DaCA9IDA7IG5DaCA8IHNlbGYtPm51bU91dHB1dENoYW5uZWxzQVQ7IG5DaCsrKSB7CisgICAgRkRLaHlicmlkU3ludGhlc2lzSW5pdCgmc2VsZi0+aHlicmlkU3ludGhlc2lzW25DaF0sIFRIUkVFX1RPX1RFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnFtZkJhbmRzLCBtYXhRbWZCYW5kcyk7CisgIH0KKworICAvKiBmb3IgaW5wdXQsIHJlc2lkdWFsIGNoYW5uZWxzIGFuZCBhcmJpdHJhcnkgZG93bi1taXggcmVzaWR1YWwgY2hhbm5lbHMgKi8KKyAgZm9yIChuQ2ggPSAwOyBuQ2ggPCBzZWxmLT5jcmVhdGVQYXJhbXMubWF4TnVtSW5wdXRDaGFubmVsczsgbkNoKyspIHsKKyAgICBGREtoeWJyaWRBbmFseXNpc0luaXQoCisgICAgICAgICZzZWxmLT5oeWJyaWRBbmFseXNpc1tuQ2hdLCBUSFJFRV9UT19URU4sIHNlbGYtPnFtZkJhbmRzLCBtYXhRbWZCYW5kcywKKyAgICAgICAgKGluaXRGbGFncyAmIE1QRUdTX0lOSVRfU1RBVEVTX0FOQV9IWUJfRklMVEVSKSA/IDEgOiAwKTsKKyAgfQorICBmb3IgKDsgbkNoIDwgKHNlbGYtPmNyZWF0ZVBhcmFtcy5iUHJvY1Jlc2lkdWFsCisgICAgICAgICAgICAgICAgICAgID8gKHNlbGYtPmNyZWF0ZVBhcmFtcy5tYXhOdW1JbnB1dENoYW5uZWxzICsKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+Y3JlYXRlUGFyYW1zLm1heE51bVJlc0NoYW5uZWxzKQorICAgICAgICAgICAgICAgICAgICA6IHNlbGYtPmNyZWF0ZVBhcmFtcy5tYXhOdW1JbnB1dENoYW5uZWxzKTsKKyAgICAgICBuQ2grKykgeworICAgIEZES2h5YnJpZEFuYWx5c2lzSW5pdCgmc2VsZi0+aHlicmlkQW5hbHlzaXNbbkNoXSwgVEhSRUVfVE9fVEVOLCBtYXhRbWZCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UW1mQmFuZHMsIDApOworICB9CisKKyAgeworICAgIGZvciAoayA9IDA7IGsgPCBzZWxmLT5udW1EZWNvclNpZ25hbHM7IGsrKykgeworICAgICAgaW50IGVyckNvZGUsIGlkZWM7CisgICAgICBGREtfREVDT1JSX1RZUEUgZGVjb3JyVHlwZSA9IERFQ09SUl9QUzsKKyAgICAgIGRlY29yclR5cGUgPSBERUNPUlJfTEQ7CisgICAgICBpZiAoc2VsZi0+cENvbmZpZ0N1cnJlbnQtPnN5bnRheEZsYWdzICYKKyAgICAgICAgICAoU0FDREVDX1NZTlRBWF9VU0FDIHwgU0FDREVDX1NZTlRBWF9SU1ZENTApKSB7CisgICAgICAgIGRlY29yclR5cGUgPQorICAgICAgICAgICAgKChzZWxmLT50cmVlQ29uZmlnID09IFRSRUVfMjEyKSAmJiAoc2VsZi0+ZGVjb3JyVHlwZSA9PSBERUNPUlJfUFMpKQorICAgICAgICAgICAgICAgID8gREVDT1JSX1BTCisgICAgICAgICAgICAgICAgOiBERUNPUlJfVVNBQzsKKyAgICAgIH0KKyAgICAgIHsKKyAgICAgICAgaWRlYyA9IGs7CisgICAgICAgIGlmIChzZWxmLT5wQ29uZmlnQ3VycmVudC0+c3ludGF4RmxhZ3MgJiBTQUNERUNfU1lOVEFYX0xEKSB7CisgICAgICAgICAgaWYgKHNlbGYtPnRyZWVDb25maWcgPT0gVFJFRV8yMTIgJiYgayA9PSAwKSB7CisgICAgICAgICAgICBpZGVjID0gMjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVyckNvZGUgPSBGREtkZWNvcnJlbGF0ZUluaXQoCisgICAgICAgICAgJnNlbGYtPmFwRGVjb3Jba10sIHNlbGYtPmh5YnJpZEJhbmRzLCBkZWNvcnJUeXBlLCBEVUNLRVJfQVVUT01BVElDLAorICAgICAgICAgIHNlbGYtPmRlY29yckNvbmZpZywgaWRlYywgMCwgLyogc2VsZi0+cGFydGlhbGx5Q29tcGxleCAqLworICAgICAgICAgIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogaXNMZWdhY3lQUyAqLworICAgICAgICAgIChpbml0RmxhZ3MgJiBNUEVHU19JTklUX1NUQVRFU19ERUNPUlJFTEFUT1IpID8gMSA6IDApOworICAgICAgaWYgKGVyckNvZGUpIHJldHVybiBNUFNfTk9UT0s7CisgICAgfQorICB9IC8qICFzZWxmLT5wYXJ0aWFsbHlDb21wbGV4ICovCisKKyAgZXJyID0gaW5pdE0xYW5kTTIoc2VsZiwgKGluaXRGbGFncyAmIE1QRUdTX0lOSVRfU1RBVEVTX00xTTIpID8gMSA6IDAsCisgICAgICAgICAgICAgICAgICAgIChpbml0RmxhZ3MgJiBNUEVHU19JTklUX0NPTkZJRykgPyAxIDogMCk7CisgIGlmIChlcnIgIT0gTVBTX09LKSByZXR1cm4gZXJyOworCisgIC8qIEluaXRpYWxpemF0aW9uIG9mIHByZXZpb3VzIGZyYW1lIGRhdGEgKi8KKyAgaWYgKGluaXRGbGFncyAmIE1QRUdTX0lOSVRfU1RBVEVTX1BBUkFNKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHNlbGYtPmNyZWF0ZVBhcmFtcy5tYXhOdW1PdHRCb3hlczsgaSArPSAxKSB7CisgICAgICAvKiByZXNldCBpY2MgZGlmZiBkYXRhICovCisgICAgICBmb3IgKGsgPSAwOyBrIDwgTUFYX1BBUkFNRVRFUl9TRVRTOyBrICs9IDEpIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IE1BWF9QQVJBTUVURVJfQkFORFM7IGogKz0gMSkgeworICAgICAgICAgIHNlbGYtPm90dElDQ2RpZmZpZHhbaV1ba11bal0gPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8qIFBhcmFtZXRlciBTbW9vdGhpbmcgKi8KKyAgICAvKiByb2J1c3RuZXNzOiBpbml0IHdpdGggb25lIG9mIHRoZSB2YWx1ZXMgb2Ygc21nVGltZVRhYmxlW10gPSB7NjQsIDEyOCwKKyAgICAgICAyNTYsIDUxMn0gdG8gYXZvaWQgZGl2aXNpb24gYnkgemVybyBpbiBjYWxjRmlsdGVyQ29lZmZfX0ZESygpICovCisgICAgc2VsZi0+c21vb3RoU3RhdGUtPnByZXZTbWdUaW1lID0gc21nVGltZVRhYmxlWzJdOyAvKiA9PSAyNTYgKi8KKyAgICBGREttZW1jbGVhcihzZWxmLT5zbW9vdGhTdGF0ZS0+cHJldlNtZ0RhdGEsCisgICAgICAgICAgICAgICAgTUFYX1BBUkFNRVRFUl9CQU5EUyAqIHNpemVvZihVQ0hBUikpOworICAgIEZES21lbWNsZWFyKHNlbGYtPnNtb290aFN0YXRlLT5vcGRMZWZ0U3RhdGVfX0ZESywKKyAgICAgICAgICAgICAgICBNQVhfUEFSQU1FVEVSX0JBTkRTICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgRkRLbWVtY2xlYXIoc2VsZi0+c21vb3RoU3RhdGUtPm9wZFJpZ2h0U3RhdGVfX0ZESywKKyAgICAgICAgICAgICAgICBNQVhfUEFSQU1FVEVSX0JBTkRTICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIH0KKworICBzZWxmLT5wcmV2VGltZVNsb3QgPSAtMTsKKyAgc2VsZi0+Y3VyVGltZVNsb3QgPQorICAgICAgTUFYX1RJTUVfU0xPVFMgKyAxOyAvKiBJbml0aWFsaXplIHdpdGggYSBpbnZhbGlkIHZhbHVlIHRvIHRyaWdnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2VhbG1lbnQgaWYgZmlyc3QgZnJhbWUgaGFzIG5vIHZhbGlkIGRhdGEuICovCisgIHNlbGYtPmN1clBzID0gMDsKKworICBzdWJiYW5kVFBJbml0KHNlbGYtPmhTdHBEZWMpOworCitiYWlsOgorICByZXR1cm4gZXJyOworfQorCit2b2lkIFNwYXRpYWxEZWNDaGFubmVsUHJvcGVydGllcyhzcGF0aWFsRGVjICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGNoYW5uZWxUeXBlW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBjaGFubmVsSW5kaWNlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkRLX2NoYW5uZWxNYXBEZXNjciAqY29uc3QgbWFwRGVzY3IpIHsKKyAgaWYgKChzZWxmID09IE5VTEwpIHx8IChjaGFubmVsVHlwZSA9PSBOVUxMKSB8fCAoY2hhbm5lbEluZGljZXMgPT0gTlVMTCkgfHwKKyAgICAgIChtYXBEZXNjciA9PSBOVUxMKSkgeworICAgIHJldHVybjsgLyogbm8gZXh0ZXJuIGJ1ZmZlciB0byBiZSBmaWxsZWQgKi8KKyAgfQorCisgIGlmIChzZWxmLT5udW1PdXRwdXRDaGFubmVsc0FUICE9CisgICAgICB0cmVlUHJvcGVydHlUYWJsZVtzZWxmLT50cmVlQ29uZmlnXS5udW1PdXRwdXRDaGFubmVscykgeworICAgIGludCBjaDsKKyAgICAvKiBEZWNsYXJlIGFsbCBjaGFubmVscyB0byBiZSBmcm9udCBjaGFubmVsczogKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzZWxmLT5udW1PdXRwdXRDaGFubmVsc0FUOyBjaCArPSAxKSB7CisgICAgICBjaGFubmVsVHlwZVtjaF0gPSBBQ1RfRlJPTlQ7CisgICAgICBjaGFubmVsSW5kaWNlc1tjaF0gPSBjaDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogSVNPL0lFQyBGRElTIDIzMDAzLTE6MjAwNihFKSwgcGFnZSA0NiwgVGFibGUgNDAgYnNUcmVlQ29uZmlnICovCisgICAgc3dpdGNoIChzZWxmLT50cmVlQ29uZmlnKSB7CisgICAgICBjYXNlIFRSRUVfMjEyOgorICAgICAgICBjaGFubmVsVHlwZVswXSA9IEFDVF9GUk9OVDsKKyAgICAgICAgY2hhbm5lbEluZGljZXNbMF0gPSAwOworICAgICAgICBjaGFubmVsVHlwZVsxXSA9IEFDVF9GUk9OVDsKKyAgICAgICAgY2hhbm5lbEluZGljZXNbMV0gPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6OworICAgIH0KKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogRkRLX1NwYXRpYWxEZWNDbG9zZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIERlc2NyaXB0aW9uOgorCisgQXJndW1lbnRzOgorCisgUmV0dXJuOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEZES19TcGF0aWFsRGVjQ2xvc2Uoc3BhdGlhbERlYyAqc2VsZikgeworICBpZiAoc2VsZikgeworICAgIGludCBrOworCisgICAgaWYgKHNlbGYtPmFwRGVjb3IgIT0gTlVMTCkgeworICAgICAgZm9yIChrID0gMDsgayA8IHNlbGYtPmNyZWF0ZVBhcmFtcy5tYXhOdW1EZWNvckNoYW5uZWxzOyBrKyspIHsKKyAgICAgICAgRkRLZGVjb3JyZWxhdGVDbG9zZSgmKHNlbGYtPmFwRGVjb3Jba10pKTsKKyAgICAgIH0KKyAgICAgIEZES19GUkVFX01FTU9SWV8xRChzZWxmLT5hcERlY29yKTsKKyAgICB9CisgICAgaWYgKHNlbGYtPnBEZWNvckJ1ZmZlckNwbHggIT0gTlVMTCkgeworICAgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKHNlbGYtPnBEZWNvckJ1ZmZlckNwbHgpOworICAgIH0KKworICAgIHN1YmJhbmRUUERlc3Ryb3koJnNlbGYtPmhTdHBEZWMpOworCisgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKHNlbGYtPnJlc2hhcGVCQkVudlN0YXRlKTsKKyAgICBGREtfRlJFRV9NRU1PUllfMUQoc2VsZi0+c21vb3RoU3RhdGUpOworCisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKHNlbGYtPnBIeWJyaWRBbmFTdGF0ZXNMRmRteCk7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKHNlbGYtPnBIeWJyaWRBbmFTdGF0ZXNIRmRteCk7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKHNlbGYtPnBIeWJyaWRBbmFTdGF0ZXNMRnJlcyk7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKHNlbGYtPnBIeWJyaWRBbmFTdGF0ZXNIRnJlcyk7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKHNlbGYtPmh5YnJpZEFuYWx5c2lzKTsKKworICAgIEZES19GUkVFX01FTU9SWV8xRChzZWxmLT5oeWJyaWRTeW50aGVzaXMpOworCisgICAgLyogVGhlIHRpbWUgYnVmZmVyIGlzIHBhc3NlZCB0byB0aGUgZGVjb2RlciBmcm9tIG91dHNpZGUgdG8gYXZvaWQgY29weWluZworICAgICAqICh6ZXJvIGNvcHkpLiAqLworICAgIC8qIEZES19GUkVFX01FTU9SWV8yRChzZWxmLT50aW1lT3V0X19GREspOyAqLworCisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKHNlbGYtPmh5Yk91dHB1dEltYWdXZXRfX0ZESyk7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKHNlbGYtPmh5Yk91dHB1dFJlYWxXZXRfX0ZESyk7CisKKyAgICBGREtfRlJFRV9NRU1PUllfMkQoc2VsZi0+aHliT3V0cHV0SW1hZ0RyeV9fRkRLKTsKKyAgICBGREtfRlJFRV9NRU1PUllfMkQoc2VsZi0+aHliT3V0cHV0UmVhbERyeV9fRkRLKTsKKworICAgIEZES19GUkVFX01FTU9SWV8yRChzZWxmLT53SW1hZ19fRkRLKTsKKyAgICBGREtfRlJFRV9NRU1PUllfMkQoc2VsZi0+d1JlYWxfX0ZESyk7CisKKyAgICBpZiAoc2VsZi0+Y3JlYXRlUGFyYW1zLmJQcm9jUmVzaWR1YWwpIHsKKyAgICAgIGludCBpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+Y3JlYXRlUGFyYW1zLm1heE51bVJlc0NoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgaWYgKHNlbGYtPmh5YlJlc2lkdWFsSW1hZ19fRkRLICE9IE5VTEwpCisgICAgICAgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKHNlbGYtPmh5YlJlc2lkdWFsSW1hZ19fRkRLW2ldKTsKKyAgICAgICAgaWYgKHNlbGYtPmh5YlJlc2lkdWFsUmVhbF9fRkRLICE9IE5VTEwpCisgICAgICAgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKHNlbGYtPmh5YlJlc2lkdWFsUmVhbF9fRkRLW2ldKTsKKyAgICAgICAgaWYgKHNlbGYtPnFtZlJlc2lkdWFsSW1hZ19fRkRLICE9IE5VTEwpCisgICAgICAgICAgRkRLX0ZSRUVfTUVNT1JZXzJEX0FMSUdORUQoc2VsZi0+cW1mUmVzaWR1YWxJbWFnX19GREtbaV0pOworICAgICAgICBpZiAoc2VsZi0+cW1mUmVzaWR1YWxSZWFsX19GREsgIT0gTlVMTCkKKyAgICAgICAgICBGREtfRlJFRV9NRU1PUllfMkRfQUxJR05FRChzZWxmLT5xbWZSZXNpZHVhbFJlYWxfX0ZES1tpXSk7CisgICAgICB9CisKKyAgICAgIEZES19GUkVFX01FTU9SWV8xRChzZWxmLT5oeWJSZXNpZHVhbEltYWdfX0ZESyk7CisgICAgICBGREtfRlJFRV9NRU1PUllfMUQoc2VsZi0+aHliUmVzaWR1YWxSZWFsX19GREspOworCisgICAgICBGREtfRlJFRV9NRU1PUllfMUQoc2VsZi0+cW1mUmVzaWR1YWxJbWFnX19GREspOworICAgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKHNlbGYtPnFtZlJlc2lkdWFsUmVhbF9fRkRLKTsKKworICAgIH0gLyogc2VsZi0+Y3JlYXRlUGFyYW1zLmJQcm9jUmVzaWR1YWwgKi8KKworICAgIEZES19GUkVFX01FTU9SWV8yRChzZWxmLT5oeWJJbnB1dEltYWdfX0ZESyk7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKHNlbGYtPmh5YklucHV0UmVhbF9fRkRLKTsKKworICAgIEZES19GUkVFX01FTU9SWV8yRF9BTElHTkVEKHNlbGYtPnFtZklucHV0SW1hZ19fRkRLKTsKKyAgICBGREtfRlJFRV9NRU1PUllfMkRfQUxJR05FRChzZWxmLT5xbWZJbnB1dFJlYWxfX0ZESyk7CisKKyAgICBGREtfRlJFRV9NRU1PUllfM0Qoc2VsZi0+TTJJbWFnUHJldl9fRkRLKTsKKworICAgIEZES19GUkVFX01FTU9SWV8zRChzZWxmLT5NMlJlYWxQcmV2X19GREspOworCisgICAgRkRLX0ZSRUVfTUVNT1JZXzNEKHNlbGYtPk0ySW1hZ19fRkRLKTsKKworICAgIEZES19GUkVFX01FTU9SWV8zRChzZWxmLT5NMlJlYWxfX0ZESyk7CisKKyAgICBGREtfRlJFRV9NRU1PUllfMUQoc2VsZi0+YXJiZG14QWxwaGFQcmV2X19GREspOworICAgIEZES19GUkVFX01FTU9SWV8xRChzZWxmLT5hcmJkbXhBbHBoYV9fRkRLKTsKKworICAgIEZES19GUkVFX01FTU9SWV8zRChzZWxmLT5hcmJkbXhHYWluX19GREspOworCisgICAgRkRLX0ZSRUVfTUVNT1JZXzNEKHNlbGYtPm90dElQRF9fRkRLKTsKKyAgICBGREtfRlJFRV9NRU1PUllfM0Qoc2VsZi0+b3R0SUNDX19GREspOworICAgIEZES19GUkVFX01FTU9SWV8zRChzZWxmLT5vdHRDTERfX0ZESyk7CisKKyAgICAvKiBMYXN0IHBhcmFtZXRlcnMgZnJvbSBwcmV2IGZyYW1lICovCisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKHNlbGYtPm90dENMRGlkeFByZXYpOworICAgIEZES19GUkVFX01FTU9SWV8yRChzZWxmLT5vdHRJQ0NpZHhQcmV2KTsKKyAgICBGREtfRlJFRV9NRU1PUllfM0Qoc2VsZi0+b3R0SUNDZGlmZmlkeCk7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKHNlbGYtPm90dElQRGlkeFByZXYpOworICAgIEZES19GUkVFX01FTU9SWV8yRChzZWxmLT5hcmJkbXhHYWluSWR4UHJldik7CisKKyAgICBGREtfRlJFRV9NRU1PUllfMkQoc2VsZi0+Y21wT3R0Q0xEaWR4UHJldik7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKHNlbGYtPmNtcE90dElDQ2lkeFByZXYpOworICAgIEZES19GUkVFX01FTU9SWV8zRChzZWxmLT5vdXRJZHhEYXRhKTsKKyAgICBGREtfRlJFRV9NRU1PUllfMkQoc2VsZi0+Y21wT3R0SVBEaWR4UHJldik7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKHNlbGYtPmNtcEFyYmRteEdhaW5JZHhQcmV2KTsKKworICAgIEZES19GUkVFX01FTU9SWV8yRChzZWxmLT5zbWdEYXRhKTsKKyAgICBGREtfRlJFRV9NRU1PUllfMUQoc2VsZi0+c21nVGltZSk7CisKKyAgICBGREtfRlJFRV9NRU1PUllfMUQoc2VsZi0+bnVtT3R0QmFuZHMpOworCisgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKHNlbGYtPnBhcmFtMmh5Yik7CisKKyAgICBGREtfRlJFRV9NRU1PUllfMUQoc2VsZik7CisgIH0KKworICByZXR1cm47Cit9CisKKy8qKgorICogXGJyaWVmIEFwcGx5IFN1cnJvdW5kIGJ5cGFzcyBidWZmZXIgY29waWVzCisgKiBccGFyYW0gc2VsZiBzcGF0aWFsRGVjIGhhbmRsZQorICogXHBhcmFtIGh5YklucHV0UmVhbAorICogXHBhcmFtIGh5YklucHV0SW1hZworICogXHBhcmFtIGh5Yk91dHB1dFJlYWwKKyAqIFxwYXJhbSBoeWJPdXRwdXRJbWFnCisgKiBccGFyYW0gbnVtSW5wdXRDaGFubmVscyBhbW91bnQgaWYgaW5wdXQgY2hhbm5lbHMgYXZhaWxhYmxlIGluIGh5YklucHV0UmVhbAorICogYW5kIGh5YklucHV0SW1hZywgd2hpY2ggbWF5IGRpZmZlciBmcm9tIHNlbGYtPm51bUlucHV0Q2hhbm5lbHMuCisgKi8KK3N0YXRpYyB2b2lkIFNwYXRpYWxEZWNBcHBseUJ5cGFzcyhzcGF0aWFsRGVjICpzZWxmLCBGSVhQX0RCTCAqKmh5YklucHV0UmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmh5YklucHV0SW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmh5Yk91dHB1dFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipoeWJPdXRwdXRJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBudW1JbnB1dENoYW5uZWxzKSB7CisgIGludCBjb21wbGV4SHliQmFuZHM7CisKKyAgY29tcGxleEh5YkJhbmRzID0gc2VsZi0+aHlicmlkQmFuZHM7CisKKyAgeworICAgIGludCBjaDsKKyAgICBpbnQgcmYgPSAtMSwgbGYgPSAtMSwgY2YgPSAtMTsgLyogUmlnaHQgRnJvbnQsIExlZnQgRnJvbnQsIENlbnRlciBGcm9udCAqLworCisgICAgLyogRGV0ZXJtaW5lIG91dHB1dCBjaGFubmVsIGluZGljZXMgYWNjb3JkaW5nIHRvIHRyZWUgY29uZmlnICovCisgICAgc3dpdGNoIChzZWxmLT50cmVlQ29uZmlnKSB7CisgICAgICBjYXNlIFRSRUVfMjEyOiAvKiAyMTIgICovCisgICAgICAgIGxmID0gMDsKKyAgICAgICAgcmYgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6OworICAgIH0KKworICAgIC8qIE5vdGU6IG51bUlucHV0Q2hhbm5lbHMgbWlnaHQgbm90IG1hdGNoIHRoZSB0cmVlIGNvbmZpZyAhICovCisgICAgc3dpdGNoIChudW1JbnB1dENoYW5uZWxzKSB7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChjZiA+IDApIHsKKyAgICAgICAgICBGREttZW1jcHkoaHliT3V0cHV0UmVhbFtjZl0sIGh5YklucHV0UmVhbFswXSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+aHlicmlkQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICBGREttZW1jcHkoaHliT3V0cHV0SW1hZ1tjZl0sIGh5YklucHV0SW1hZ1swXSwKKyAgICAgICAgICAgICAgICAgICAgY29tcGxleEh5YkJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRkRLbWVtY3B5KGh5Yk91dHB1dFJlYWxbbGZdLCBoeWJJbnB1dFJlYWxbMF0sCisgICAgICAgICAgICAgICAgICAgIHNlbGYtPmh5YnJpZEJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgRkRLbWVtY3B5KGh5Yk91dHB1dFJlYWxbcmZdLCBoeWJJbnB1dFJlYWxbMF0sCisgICAgICAgICAgICAgICAgICAgIHNlbGYtPmh5YnJpZEJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgRkRLbWVtY3B5KGh5Yk91dHB1dEltYWdbbGZdLCBoeWJJbnB1dEltYWdbMF0sCisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhIeWJCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICAgIEZES21lbWNweShoeWJPdXRwdXRJbWFnW3JmXSwgaHliSW5wdXRJbWFnWzBdLAorICAgICAgICAgICAgICAgICAgICBjb21wbGV4SHliQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgRkRLX0FTU0VSVChsZiAhPSAtMSk7CisgICAgICAgIEZES19BU1NFUlQocmYgIT0gLTEpOworICAgICAgICBGREttZW1jcHkoaHliT3V0cHV0UmVhbFtsZl0sIGh5YklucHV0UmVhbFswXSwKKyAgICAgICAgICAgICAgICAgIHNlbGYtPmh5YnJpZEJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIEZES21lbWNweShoeWJPdXRwdXRSZWFsW3JmXSwgaHliSW5wdXRSZWFsWzFdLAorICAgICAgICAgICAgICAgICAgc2VsZi0+aHlicmlkQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgRkRLbWVtY3B5KGh5Yk91dHB1dEltYWdbbGZdLCBoeWJJbnB1dEltYWdbMF0sCisgICAgICAgICAgICAgICAgICBjb21wbGV4SHliQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgRkRLbWVtY3B5KGh5Yk91dHB1dEltYWdbcmZdLCBoeWJJbnB1dEltYWdbMV0sCisgICAgICAgICAgICAgICAgICBjb21wbGV4SHliQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPm51bU91dHB1dENoYW5uZWxzQVQ7IGNoKyspIHsKKyAgICAgIGlmIChjaCA9PSBsZiB8fCBjaCA9PSByZiB8fCBjaCA9PSBjZikgeworICAgICAgICBjb250aW51ZTsgLyogU2tpcCBieXBhc3NlZCBjaGFubmVscyAqLworICAgICAgfQorICAgICAgRkRLbWVtY2xlYXIoaHliT3V0cHV0UmVhbFtjaF0sIHNlbGYtPmh5YnJpZEJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBGREttZW1jbGVhcihoeWJPdXRwdXRJbWFnW2NoXSwgY29tcGxleEh5YkJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgfQorICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBTcGF0aWFsRGVjQXBwbHlQYXJhbWV0ZXJTZXRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6CisKKyBSZXR1cm46CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNBcHBseVBhcmFtZXRlclNldHMoCisgICAgc3BhdGlhbERlYyAqc2VsZiwgY29uc3QgU1BBVElBTF9CU19GUkFNRSAqZnJhbWUsIFNQQVRJQUxERUNfSU5QVVRfTU9ERSBtb2RlLAorICAgIFBDTV9NUFMgKmluRGF0YSwgICAgICAgICAgLyogVGltZSBkb21haW4gaW5wdXQgICovCisgICAgRklYUF9EQkwgKipxbWZJbkRhdGFSZWFsLCAvKiBRTUYgZG9tYWluIGRhdGEgbC9yICovCisgICAgRklYUF9EQkwgKipxbWZJbkRhdGFJbWFnLCAvKiBRTUYgZG9tYWluIGRhdGEgbC9yICovCisgICAgVUlOVCBuU2FtcGxlcywgVUlOVCBjb250cm9sRmxhZ3MsIGludCBudW1JbnB1dENoYW5uZWxzLAorICAgIGNvbnN0IEZES19jaGFubmVsTWFwRGVzY3IgKmNvbnN0IG1hcERlc2NyKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisKKyAgRklYUF9TR0wgYWxwaGE7CisKKyAgaW50IHRzOworICBpbnQgY2g7CisgIGludCBoeWI7CisKKyAgaW50IHByZXZTbG90ID0gc2VsZi0+cHJldlRpbWVTbG90OworICBpbnQgcHMgPSBzZWxmLT5jdXJQczsKKyAgaW50IHRzX2lvID0gMDsgLyogaS9vIGRlcGVuZGVudCBzbG90ICovCisgIGludCBieXBhc3NNb2RlID0gKGNvbnRyb2xGbGFncyAmIE1QRUdTX0JZUEFTU01PREUpID8gMSA6IDA7CisKKyAgLyogQnlwYXNzIGNhbiBiZSB0cmlnZ2VyZWQgYnkgdGhlIHVwbWl4VHlwZSwgdG9vLiAqLworICBieXBhc3NNb2RlIHw9ICgoc2VsZi0+dXBtaXhUeXBlID09IFVQTUlYVFlQRV9CWVBBU1MpID8gMSA6IDApOworCisgIC8qCisgICAqIERlY29kZSBhdmFpbGFibGUgc2xvdHMKKyAgICovCisgIGZvciAodHMgPSBzZWxmLT5jdXJUaW1lU2xvdDsKKyAgICAgICB0cyA8PSBmaXhNaW4oc2VsZi0+Y3VyVGltZVNsb3QgKyAoaW50KW5TYW1wbGVzIC8gc2VsZi0+cW1mQmFuZHMgLSAxLAorICAgICAgICAgICAgICAgICAgICBzZWxmLT50aW1lU2xvdHMgLSAxKTsKKyAgICAgICB0cysrLCB0c19pbysrKSB7CisgICAgaW50IGN1cnJTbG90ID0gZnJhbWUtPnBhcmFtU2xvdFtwc107CisKKyAgICAvKgorICAgICAqIEdldCBuZXcgcGFyYW1ldGVyIHNldAorICAgICAqLworICAgIGlmICh0cyA9PSBwcmV2U2xvdCArIDEpIHsKKyAgICAgIGVyciA9IFNwYXRpYWxEZWNDYWxjdWxhdGVNMWFuZE0yKHNlbGYsIHBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUpOyAvKiBpbnB1dDogb3R0Q0xELCBvdHRJQ0MsIC4uLiAqLworICAgICAgLyogb3V0cHV0OiBNMXBhcmFtKFJlYWwvSW1hZyksIE0yKFJlYWwvSW1hZykgKi8KKyAgICAgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgICAgIGJ5cGFzc01vZGUgPSAxOworICAgICAgICBpZiAoc2VsZi0+ZXJySW50ID09IE1QU19PSykgeworICAgICAgICAgIC8qIHN0b3JlIGludGVybmFsIGVycm9yIGJlZm9yIGl0IGdldHMgb3ZlcndyaXR0ZW4gKi8KKyAgICAgICAgICBzZWxmLT5lcnJJbnQgPSBlcnI7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gTVBTX09LOworICAgICAgfQorCisgICAgICBpZiAoKHBzID09IDApICYmIChzZWxmLT5iT3ZlcndyaXRlTTFNMnByZXYgIT0gMCkpIHsKKyAgICAgICAgLyogY29weSBtYXRyaXggZW50cmllcyBvZiBNMS9NMiBvZiB0aGUgZmlyc3QgcGFyYW1ldGVyIHNldCB0byB0aGUKKyAgICAgICAgICAgcHJldmlvdXMgbWF0cmljZXMgKG9mIHRoZSBsYXN0IGZyYW1lKS4gVGhpcyBhdm9pZHMgdGhlIGludGVycG9sYXRpb24KKyAgICAgICAgICAgb2YgaW5jb21wYXRpYmxlIHZhbHVlcy4gRS5nLiBmb3IgcmVzaWR1YWwgYmFuZHMgdGhlIGNvZWZmaWNpZW50cyBhcmUKKyAgICAgICAgICAgY2FsY3VsYXRlZCBkaWZmZXJlbnRseSBjb21wYXJlZCB0byBub24tcmVzaWR1YWwgYmFuZHMuCisgICAgICAgICAqLworICAgICAgICBTcGF0aWFsRGVjQnVmZmVyTWF0cmljZXMoc2VsZik7IC8qIGlucHV0OiBNKDEvMilwYXJhbShSZWFsL0ltYWcpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBNKDEvMilwYXJhbShSZWFsL0ltYWcpUHJldiAqLworICAgICAgICBzZWxmLT5iT3ZlcndyaXRlTTFNMnByZXYgPSAwOworICAgICAgfQorCisgICAgICBTcGF0aWFsRGVjU21vb3RoTTFhbmRNMigKKyAgICAgICAgICBzZWxmLCBmcmFtZSwKKyAgICAgICAgICBwcyk7IC8qIGlucHV0OiBNMXBhcmFtKFJlYWwvSW1hZykoUHJldiksIE0yKFJlYWwvSW1hZykoUHJldikgKi8KKyAgICAgICAgICAgICAgIC8qIG91dHB1dDogTTFwYXJhbShSZWFsL0ltYWcpLCBNMihSZWFsL0ltYWcpICovCisgICAgfQorCisgICAgYWxwaGEgPSBGWF9EQkwyRlhfU0dMKGZEaXZOb3JtKHRzIC0gcHJldlNsb3QsIGN1cnJTbG90IC0gcHJldlNsb3QpKTsKKworICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgY2FzZSBJTlBVVE1PREVfUU1GX1NCUjoKKyAgICAgICAgaWYgKHNlbGYtPnBDb25maWdDdXJyZW50LT5zeW50YXhGbGFncyAmIFNBQ0RFQ19TWU5UQVhfTEQpCisgICAgICAgICAgc2VsZi0+YlNoYXJlRGVsYXlXaXRoU0JSID0gMDsgLyogV2UgZ290IG5vIGh5YnJpZCBkZWxheSAqLworICAgICAgICBlbHNlCisgICAgICAgICAgc2VsZi0+YlNoYXJlRGVsYXlXaXRoU0JSID0gMTsKKyAgICAgICAgU3BhdGlhbERlY0ZlZWRRTUYoc2VsZiwgcW1mSW5EYXRhUmVhbCwgcW1mSW5EYXRhSW1hZywgdHNfaW8sIGJ5cGFzc01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnFtZklucHV0UmVhbF9fRkRLLCBzZWxmLT5xbWZJbnB1dEltYWdfX0ZESywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+bnVtSW5wdXRDaGFubmVscyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJTlBVVE1PREVfVElNRToKKyAgICAgICAgc2VsZi0+YlNoYXJlRGVsYXlXaXRoU0JSID0gMDsKKyAgICAgICAgU3BhdGlhbERlY1FNRkFuYWx5c2lzKHNlbGYsIGluRGF0YSwgdHNfaW8sIGJ5cGFzc01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5xbWZJbnB1dFJlYWxfX0ZESywgc2VsZi0+cW1mSW5wdXRJbWFnX19GREssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5udW1JbnB1dENoYW5uZWxzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoKHNlbGYtPnBDb25maWdDdXJyZW50LT5zeW50YXhGbGFncyAmIFNBQ0RFQ19TWU5UQVhfVVNBQykgJiYKKyAgICAgICAgc2VsZi0+cmVzaWR1YWxDb2RpbmcpIHsKKyAgICAgIGludCBvZmZzZXQ7CisgICAgICBjaCA9IDE7CisKKyAgICAgIG9mZnNldCA9IHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYubkJhbmRzU3ludGhlc2lzICoKKyAgICAgICAgICAgICAgIHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYublFtZlRpbWVTbG90czsKKworICAgICAgeworICAgICAgICBjb25zdCBQQ01fTVBTICppblNhbXBsZXMgPQorICAgICAgICAgICAgJmluRGF0YVt0cyAqIHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYubkJhbmRzQW5hbHlzaXNdOworCisgICAgICAgIENhbGN1bGF0ZVNwYWNlQW5hbHlzaXNRbWYoCisgICAgICAgICAgICAmc2VsZi0+cFFtZkRvbWFpbi0+UW1mRG9tYWluSW5bY2hdLmZiLCBpblNhbXBsZXMgKyAoY2ggKiBvZmZzZXQpLAorICAgICAgICAgICAgc2VsZi0+cW1mUmVzaWR1YWxSZWFsX19GREtbMF1bMF0sIHNlbGYtPnFtZlJlc2lkdWFsSW1hZ19fRkRLWzBdWzBdKTsKKworICAgICAgICBpZiAoIWlzVHdvQ2hNb2RlKHNlbGYtPnVwbWl4VHlwZSkgJiYgIWJ5cGFzc01vZGUpIHsKKyAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgc2VsZl9xbWZSZXNpZHVhbFJlYWxfX0ZES18wXzAgPQorICAgICAgICAgICAgICAmc2VsZi0+cW1mUmVzaWR1YWxSZWFsX19GREtbMF1bMF1bMF07CisgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHNlbGZfcW1mUmVzaWR1YWxJbWFnX19GREtfMF8wID0KKyAgICAgICAgICAgICAgJnNlbGYtPnFtZlJlc2lkdWFsSW1hZ19fRkRLWzBdWzBdWzBdOworCisgICAgICAgICAgaWYgKChzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5CYW5kc0FuYWx5c2lzID09IDI0KSAmJgorICAgICAgICAgICAgICAhKHNlbGYtPnN0ZXJlb0NvbmZpZ0luZGV4ID09IDMpKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+cW1mQmFuZHM7IGkrKykgeworICAgICAgICAgICAgICBzZWxmX3FtZlJlc2lkdWFsUmVhbF9fRkRLXzBfMFtpXSA9CisgICAgICAgICAgICAgICAgICBmTXVsdChzZWxmX3FtZlJlc2lkdWFsUmVhbF9fRkRLXzBfMFtpXSA8PCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+Y2xpcFByb3RlY3RHYWluX19GREspOworICAgICAgICAgICAgICBzZWxmX3FtZlJlc2lkdWFsSW1hZ19fRkRLXzBfMFtpXSA9CisgICAgICAgICAgICAgICAgICBmTXVsdChzZWxmX3FtZlJlc2lkdWFsSW1hZ19fRkRLXzBfMFtpXSA8PCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+Y2xpcFByb3RlY3RHYWluX19GREspOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+cW1mQmFuZHM7IGkrKykgeworICAgICAgICAgICAgICBzZWxmX3FtZlJlc2lkdWFsUmVhbF9fRkRLXzBfMFtpXSA9IGZNdWx0KAorICAgICAgICAgICAgICAgICAgc2VsZl9xbWZSZXNpZHVhbFJlYWxfX0ZES18wXzBbaV0sIHNlbGYtPmNsaXBQcm90ZWN0R2Fpbl9fRkRLKTsKKyAgICAgICAgICAgICAgc2VsZl9xbWZSZXNpZHVhbEltYWdfX0ZES18wXzBbaV0gPSBmTXVsdCgKKyAgICAgICAgICAgICAgICAgIHNlbGZfcW1mUmVzaWR1YWxJbWFnX19GREtfMF8wW2ldLCBzZWxmLT5jbGlwUHJvdGVjdEdhaW5fX0ZESyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgU3BhdGlhbERlY0h5YnJpZEFuYWx5c2lzKAorICAgICAgICBzZWxmLCAvKiBpbnB1dDogcW1mSW5wdXQoUmVhbC9JbWFnKSwgcW1mUmVzaWR1YWwoUmVhbC9JbWFnKSAqLworICAgICAgICBzZWxmLT5xbWZJbnB1dFJlYWxfX0ZESywgc2VsZi0+cW1mSW5wdXRJbWFnX19GREssCisgICAgICAgIHNlbGYtPmh5YklucHV0UmVhbF9fRkRLLCBzZWxmLT5oeWJJbnB1dEltYWdfX0ZESywgdHMsIG51bUlucHV0Q2hhbm5lbHMpOworCisgICAgaWYgKGJ5cGFzc01vZGUpIHsKKyAgICAgIFNwYXRpYWxEZWNBcHBseUJ5cGFzcygKKyAgICAgICAgICBzZWxmLCBzZWxmLT5oeWJJbnB1dFJlYWxfX0ZESywgLyogaW5wdXQ6IGh5YklucHV0KFJlYWwvSW1hZykgKi8KKyAgICAgICAgICBzZWxmLT5oeWJJbnB1dEltYWdfX0ZESywKKyAgICAgICAgICBzZWxmLT5oeWJPdXRwdXRSZWFsRHJ5X19GREssIC8qIG91dHB1dDogaHliT3V0cHV0KFJlYWwvSW1hZylEcnkgKi8KKyAgICAgICAgICBzZWxmLT5oeWJPdXRwdXRJbWFnRHJ5X19GREssIG51bUlucHV0Q2hhbm5lbHMpOworICAgIH0gZWxzZSAvKiAhYnlwYXNzTW9kZSAqLworICAgIHsKKyAgICAgIEZJWFBfREJMICpweFJlYWxbTUFYX05VTV9YQ0hBTk5FTFNdID0ge05VTEx9OworICAgICAgRklYUF9EQkwgKnB4SW1hZ1tNQVhfTlVNX1hDSEFOTkVMU10gPSB7TlVMTH07CisKKyAgICAgIFNwYXRpYWxEZWNDcmVhdGVYKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5oeWJJbnB1dFJlYWxfX0ZESywgLyogaW5wdXQ6IGh5YklucHV0KFJlYWwvSW1hZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHliUmVzaWR1YWwoUmVhbC9JbWFnKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+aHliSW5wdXRJbWFnX19GREssIHB4UmVhbCwgcHhJbWFnKTsKKworICAgICAgeworICAgICAgICBTcGF0aWFsRGVjQXBwbHlNMV9DcmVhdGVXX01vZGUyMTIoCisgICAgICAgICAgICBzZWxmLCBmcmFtZSwgcHhSZWFsLCBweEltYWcsCisgICAgICAgICAgICBzZWxmLT53UmVhbF9fRkRLLCAvKiBvdXRwdXQ6IHcoUmVhbC9JbWFnKSAqLworICAgICAgICAgICAgc2VsZi0+d0ltYWdfX0ZESyk7CisgICAgICB9CisgICAgICBpZiAoZXJyICE9IE1QU19PSykgZ290byBiYWlsOworCisgICAgICBpbnQgYXBwbHlNMkNvbmZpZyA9IEFQUExZX00yX05PTkU7CisKKyAgICAgIGFwcGx5TTJDb25maWcgPSBBUFBMWV9NMjsKKyAgICAgIGlmICgoc2VsZi0+cENvbmZpZ0N1cnJlbnQtPnN5bnRheEZsYWdzICYKKyAgICAgICAgICAgKFNBQ0RFQ19TWU5UQVhfVVNBQyB8IFNBQ0RFQ19TWU5UQVhfUlNWRDUwKSkgJiYKKyAgICAgICAgICAoc2VsZi0+dGVtcFNoYXBlQ29uZmlnICE9IDEpICYmIChzZWxmLT50ZW1wU2hhcGVDb25maWcgIT0gMikpIHsKKyAgICAgICAgaWYgKHNlbGYtPnBoYXNlQ29kaW5nID09IDMpCisgICAgICAgICAgYXBwbHlNMkNvbmZpZyA9IEFQUExZX00yX01PREUyMTJfUmVzX1BoYXNlQ29kaW5nOworICAgICAgICBlbHNlCisgICAgICAgICAgYXBwbHlNMkNvbmZpZyA9IEFQUExZX00yX01PREUyMTI7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoYXBwbHlNMkNvbmZpZykgeworICAgICAgICBjYXNlIEFQUExZX00yX01PREUyMTI6IHsKKyAgICAgICAgICBlcnIgPSBTcGF0aWFsRGVjQXBwbHlNMl9Nb2RlMjEyKAorICAgICAgICAgICAgICBzZWxmLCBwcywgYWxwaGEsIHNlbGYtPndSZWFsX19GREssIHNlbGYtPndJbWFnX19GREssCisgICAgICAgICAgICAgIHNlbGYtPmh5Yk91dHB1dFJlYWxEcnlfX0ZESywgc2VsZi0+aHliT3V0cHV0SW1hZ0RyeV9fRkRLKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBBUFBMWV9NMl9NT0RFMjEyX1Jlc19QaGFzZUNvZGluZzoKKyAgICAgICAgICBlcnIgPSBTcGF0aWFsRGVjQXBwbHlNMl9Nb2RlMjEyX1Jlc2lkdWFsc1BsdXNQaGFzZUNvZGluZygKKyAgICAgICAgICAgICAgc2VsZiwgcHMsIGFscGhhLCBzZWxmLT53UmVhbF9fRkRLLCBzZWxmLT53SW1hZ19fRkRLLAorICAgICAgICAgICAgICBzZWxmLT5oeWJPdXRwdXRSZWFsRHJ5X19GREssIHNlbGYtPmh5Yk91dHB1dEltYWdEcnlfX0ZESyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVBQTFlfTTI6CisgICAgICAgICAgZXJyID0gU3BhdGlhbERlY0FwcGx5TTIoCisgICAgICAgICAgICAgIHNlbGYsIHBzLCBhbHBoYSwgc2VsZi0+d1JlYWxfX0ZESywgc2VsZi0+d0ltYWdfX0ZESywKKyAgICAgICAgICAgICAgc2VsZi0+aHliT3V0cHV0UmVhbERyeV9fRkRLLCBzZWxmLT5oeWJPdXRwdXRJbWFnRHJ5X19GREssCisgICAgICAgICAgICAgIHNlbGYtPmh5Yk91dHB1dFJlYWxXZXRfX0ZESywgc2VsZi0+aHliT3V0cHV0SW1hZ1dldF9fRkRLKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBlcnIgPSBNUFNfQVBQTFlfTTJfRVJST1I7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgfQorCisgICAgICBpZiAoZXJyICE9IE1QU19PSykgZ290byBiYWlsOworCisgICAgICBpZiAoKHNlbGYtPnRlbXBTaGFwZUNvbmZpZyA9PSAyKSAmJiAoIWlzVHdvQ2hNb2RlKHNlbGYtPnVwbWl4VHlwZSkpKSB7CisgICAgICAgIFNwYXRpYWxEZWNSZXNoYXBlQkJFbnYoc2VsZiwgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMpOyAvKiBpbnB1dDogcmVzaGFwZUJCRW52U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoeWJPdXRwdXQoUmVhbC9JbWFnKShEcnkvV2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh5YklucHV0KFJlYWwvSW1hZykgKi8KKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogaHliT3V0cHV0KFJlYWwvSW1hZylEcnkgKi8KKworICAgICAgLyogTWVyZ2UgcGFydHMgb2YgdGhlIGRyeSBhbmQgd2V0IFFNRiBidWZmZXJzLiAqLworICAgICAgaWYgKChzZWxmLT50ZW1wU2hhcGVDb25maWcgPT0gMSkgJiYgKCFpc1R3b0NoTW9kZShzZWxmLT51cG1peFR5cGUpKSkgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzZWxmLT5udW1PdXRwdXRDaGFubmVsczsgY2grKykgeworICAgICAgICAgIGZvciAoaHliID0gMDsgaHliIDwgc2VsZi0+dHBfaHliQmFuZEJvcmRlcjsgaHliKyspIHsKKyAgICAgICAgICAgIHNlbGYtPmh5Yk91dHB1dFJlYWxEcnlfX0ZES1tjaF1baHliXSArPQorICAgICAgICAgICAgICAgIHNlbGYtPmh5Yk91dHB1dFJlYWxXZXRfX0ZES1tjaF1baHliXTsKKyAgICAgICAgICAgIHNlbGYtPmh5Yk91dHB1dEltYWdEcnlfX0ZES1tjaF1baHliXSArPQorICAgICAgICAgICAgICAgIHNlbGYtPmh5Yk91dHB1dEltYWdXZXRfX0ZES1tjaF1baHliXTsKKyAgICAgICAgICB9IC8qIGxvb3AgaHliICovCisgICAgICAgIH0gICAvKiBsb29wIGNoICovCisgICAgICAgIGVyciA9IHN1YmJhbmRUUEFwcGx5KAorICAgICAgICAgICAgc2VsZiwgZnJhbWUpOyAvKiBpbnB1dDogaFN0cERlYywgaHliT3V0cHV0KFJlYWwvSW1hZylEcnkvV2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogaFN0cERlYywgaHliT3V0cHV0KFJlYWwvSW1hZylEcnkgKi8KKyAgICAgICAgaWYgKGVyciAhPSBNUFNfT0spIGdvdG8gYmFpbDsKKyAgICAgIH0gLyogKHNlbGYtPnRlbXBTaGFwZUNvbmZpZyA9PSAxKSAqLworICAgICAgZWxzZSB7CisgICAgICAgIC8qIFRoZSB3ZXQgc2lnbmFsIGlzIGFkZGVkIHRvIHRoZSBkcnkgc2lnbmFsIGluIGFwcGx5TTIgaWYgR0VTIGFuZCBTVFAKKyAgICAgICAgICogYXJlIGRpc2FibGVkICovCisgICAgICAgIGlmICgoc2VsZi0+dGVtcFNoYXBlQ29uZmlnID09IDEpIHx8IChzZWxmLT50ZW1wU2hhcGVDb25maWcgPT0gMikpIHsKKyAgICAgICAgICBpbnQgbkh5YkJhbmRzOworICAgICAgICAgIG5IeWJCYW5kcyA9IHNlbGYtPmh5YnJpZEJhbmRzOworCisgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgc2VsZi0+bnVtT3V0cHV0Q2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwUmVhbERyeSA9IHNlbGYtPmh5Yk91dHB1dFJlYWxEcnlfX0ZES1tjaF07CisgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcEltYWdEcnkgPSBzZWxmLT5oeWJPdXRwdXRJbWFnRHJ5X19GREtbY2hdOworICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBSZWFsV2V0ID0gc2VsZi0+aHliT3V0cHV0UmVhbFdldF9fRkRLW2NoXTsKKyAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwSW1hZ1dldCA9IHNlbGYtPmh5Yk91dHB1dEltYWdXZXRfX0ZES1tjaF07CisgICAgICAgICAgICBmb3IgKGh5YiA9IDA7IGh5YiA8IG5IeWJCYW5kczsgaHliKyspIHsKKyAgICAgICAgICAgICAgcFJlYWxEcnlbaHliXSArPSBwUmVhbFdldFtoeWJdOworICAgICAgICAgICAgICBwSW1hZ0RyeVtoeWJdICs9IHBJbWFnV2V0W2h5Yl07CisgICAgICAgICAgICB9IC8qIGxvb3AgaHliICovCisgICAgICAgICAgICBmb3IgKDsgaHliIDwgc2VsZi0+aHlicmlkQmFuZHM7IGh5YisrKSB7CisgICAgICAgICAgICAgIHBSZWFsRHJ5W2h5Yl0gKz0gcFJlYWxXZXRbaHliXTsKKyAgICAgICAgICAgIH0gLyogbG9vcCBoeWIgKi8KKyAgICAgICAgICB9ICAgLyogbG9vcCBjaCAqLworICAgICAgICB9IC8qICggc2VsZi0+dGVtcFNoYXBlQ29uZmlnID09IDEgKSB8fCAoIHNlbGYtPnRlbXBTaGFwZUNvbmZpZyA9PSAyICkgKi8KKyAgICAgIH0gICAvKiAhc2VsZi0+dGVtcFNoYXBlQ29uZmlnID09IDEgKi8KKyAgICB9ICAgICAvKiAgIWJ5cGFzc01vZGUgKi8KKworICAgIGlmIChzZWxmLT5waGFzZUNvZGluZyA9PSAxKSB7CisgICAgICAvKiBvbmx5IGlmIGJzUGhhc2VDb2RpbmcgPT0gMSBhbmQgYnNSZXNpZHVhbENvZGluZyA9PSAwICovCisKKyAgICAgIFNwYXRpYWxEZWNBcHBseVBoYXNlKAorICAgICAgICAgIHNlbGYsIGFscGhhLCAodHMgPT0gY3VyclNsb3QpIC8qIHNpZ25hbCB0aGUgbGFzdCBzbG90IG9mIHRoZSBzZXQgKi8KKyAgICAgICk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTeW50aGVzaXMgRmlsdGVyaW5nCisgICAgICovCisKKyAgICBlcnIgPSBTcGF0aWFsRGVjU3ludGhlc2lzKAorICAgICAgICBzZWxmLCB0c19pbywKKyAgICAgICAgc2VsZi0+aHliT3V0cHV0UmVhbERyeV9fRkRLLCAvKiBpbnB1dDogaHliT3V0cHV0KFJlYWwvSW1hZylEcnkgKi8KKyAgICAgICAgc2VsZi0+aHliT3V0cHV0SW1hZ0RyeV9fRkRLLCBzZWxmLT50aW1lT3V0X19GREssIC8qIG91dHB1dDogdGltZU91dCAqLworICAgICAgICBudW1JbnB1dENoYW5uZWxzLCBtYXBEZXNjcik7CisKKyAgICBpZiAoZXJyICE9IE1QU19PSykgZ290byBiYWlsOworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgcGFyYW1ldGVyIGJ1ZmZlcgorICAgICAqLworICAgIGlmICh0cyA9PSBjdXJyU2xvdCkgeworICAgICAgU3BhdGlhbERlY0J1ZmZlck1hdHJpY2VzKHNlbGYpOyAvKiBpbnB1dDogTSgxLzIpcGFyYW0oUmVhbC9JbWFnKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IE0oMS8yKXBhcmFtKFJlYWwvSW1hZylQcmV2ICovCisKKyAgICAgIHByZXZTbG90ID0gY3VyclNsb3Q7CisgICAgICBwcysrOworICAgIH0gLyogaWYgKHRzPT1jdXJyU2xvdCkgKi8KKworICB9IC8qIHRzIGxvb3AgKi8KKworICAvKgorICAgKiBTYXZlIHBhcmFtZXRlciBzdGF0ZXMKKyAgICovCisgIHNlbGYtPnByZXZUaW1lU2xvdCA9IHByZXZTbG90OworICBzZWxmLT5jdXJUaW1lU2xvdCA9IHRzOworICBzZWxmLT5jdXJQcyA9IHBzOworCitiYWlsOgorCisgIHJldHVybiBlcnI7Cit9CisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQXBwbHlGcmFtZSgKKyAgICBzcGF0aWFsRGVjICpzZWxmLAorICAgIFNQQVRJQUxfQlNfRlJBTUUgKmZyYW1lLCAvKiBwYXJzZWQgZnJhbWUgZGF0YSB0byBiZSBhcHBsaWVkICovCisgICAgU1BBVElBTERFQ19JTlBVVF9NT0RFIGlucHV0TW9kZSwgUENNX01QUyAqaW5EYXRhLCAvKiBUaW1lIGRvbWFpbiBpbnB1dCAgKi8KKyAgICBGSVhQX0RCTCAqKnFtZkluRGF0YVJlYWwsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFFNRiBkb21haW4gZGF0YSBsL3IgKi8KKyAgICBGSVhQX0RCTCAqKnFtZkluRGF0YUltYWcsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFFNRiBkb21haW4gZGF0YSBsL3IgKi8KKyAgICBQQ01fTVBTICpwY21PdXRCdWYsIC8qIE1BWF9PVVRQVVRfQ0hBTk5FTFMqTUFYX1RJTUVfU0xPVFMqTlVNX1FNRl9CQU5EU10gKi8KKyAgICBVSU5UIG5TYW1wbGVzLCBVSU5UICpwQ29udHJvbEZsYWdzLCBpbnQgbnVtSW5wdXRDaGFubmVscywKKyAgICBjb25zdCBGREtfY2hhbm5lbE1hcERlc2NyICpjb25zdCBtYXBEZXNjcikgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworCisgIGludCBmRGVjQW5kTWFwRnJhbWVEYXRhOworICBpbnQgY29udHJvbEZsYWdzOworCisgIEZES19BU1NFUlQoc2VsZiAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChwQ29udHJvbEZsYWdzICE9IE5VTEwpOworICBGREtfQVNTRVJUKHBjbU91dEJ1ZiAhPSBOVUxMKTsKKworICBzZWxmLT5lcnJJbnQgPSBlcnI7IC8qIEluaXQgaW50ZXJuYWwgZXJyb3IgKi8KKworICBjb250cm9sRmxhZ3MgPSAqcENvbnRyb2xGbGFnczsKKworICBpZiAoKHNlbGYtPnBDb25maWdDdXJyZW50LT5zeW50YXhGbGFncyAmIFNBQ0RFQ19TWU5UQVhfVVNBQykgJiYKKyAgICAgIChzZWxmLT5zdGVyZW9Db25maWdJbmRleCA+IDEpKSB7CisgICAgbnVtSW5wdXRDaGFubmVscyA9CisgICAgICAgIDE7IC8qIERvIG5vdCBjb3VudCByZXNpZHVhbCBjaGFubmVsIGFzIGlucHV0IGNoYW5uZWwuIEl0IGlzIGhhbmRsZWQKKyAgICAgICAgICAgICAgc2VwZXJhdGVseS4gKi8KKyAgfQorCisgIC8qIENoZWNrIGlmIGlucHV0IGFtb3VudCBvZiBjaGFubmVscyBpcyBjb25zaXN0ZW50ICovCisgIGlmIChudW1JbnB1dENoYW5uZWxzICE9IHNlbGYtPm51bUlucHV0Q2hhbm5lbHMpIHsKKyAgICBjb250cm9sRmxhZ3MgfD0gTVBFR1NfQ09OQ0VBTDsKKyAgICBpZiAobnVtSW5wdXRDaGFubmVscyA+IHNlbGYtPmNyZWF0ZVBhcmFtcy5tYXhOdW1JbnB1dENoYW5uZWxzKSB7CisgICAgICByZXR1cm4gTVBTX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgfQorCisgIHNlbGYtPnRpbWVPdXRfX0ZESyA9IHBjbU91dEJ1ZjsKKworICAvKiBEZXRlcm1pbmUgbG9jYWwgZnVuY3Rpb24gY29udHJvbCBmbGFncyAqLworICBmRGVjQW5kTWFwRnJhbWVEYXRhID0gZnJhbWUtPm5ld0JzRGF0YTsKKworICBpZiAoKChmRGVjQW5kTWFwRnJhbWVEYXRhID09CisgICAgICAgIDApIC8qIGFzc3VyZXMgdGhhdCBjb25jZWFsIGZsYWcgd2lsbCBub3QgYmUgc2V0IGZvciBibGluZCBtb2RlICovCisgICAgICAgJiYgKHNlbGYtPmN1clRpbWVTbG90ICsgKGludCluU2FtcGxlcyAvIHNlbGYtPnFtZkJhbmRzID4KKyAgICAgICAgICAgc2VsZi0+dGltZVNsb3RzKSkgfHwKKyAgICAgIChmcmFtZS0+bnVtUGFyYW1ldGVyU2V0cyA9PQorICAgICAgIDApKSB7IC8qIE5ldyBpbnB1dCBzYW1wbGVzIGJ1dCBtaXNzaW5nIHNpZGUgaW5mbyAqLworICAgIGZEZWNBbmRNYXBGcmFtZURhdGEgPSAxOworICAgIGNvbnRyb2xGbGFncyB8PSBNUEVHU19DT05DRUFMOworICB9CisKKyAgaWYgKChmRGVjQW5kTWFwRnJhbWVEYXRhID09IDApICYmCisgICAgICAoZnJhbWUtPnBhcmFtU2xvdFtmTWF4KDAsIGZyYW1lLT5udW1QYXJhbWV0ZXJTZXRzIC0gMSldICE9CisgICAgICAgICAgIChzZWxmLT50aW1lU2xvdHMgLSAxKSB8fAorICAgICAgIHNlbGYtPmN1clRpbWVTbG90ID4KKyAgICAgICAgICAgZnJhbWUtPnBhcmFtU2xvdFtzZWxmLT5jdXJQc10pKSB7IC8qIERldGVjdGVkIGZhdWx0eSBwYXJhbWV0ZXIgc2xvdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS4gKi8KKyAgICBmRGVjQW5kTWFwRnJhbWVEYXRhID0gMTsKKyAgICBjb250cm9sRmxhZ3MgfD0gTVBFR1NfQ09OQ0VBTDsKKyAgfQorCisgIC8qIFVwZGF0ZSBjb25jZWFsbWVudCBzdGF0ZSBtYWNoaW5lICovCisgIFNwYXRpYWxEZWNDb25jZWFsbWVudF9VcGRhdGVTdGF0ZSgKKyAgICAgICZzZWxmLT5jb25jZWFsSW5mbywKKyAgICAgIChjb250cm9sRmxhZ3MgJiBNUEVHU19DT05DRUFMKQorICAgICAgICAgID8gMAorICAgICAgICAgIDogMSk7IC8qIGNvbnZlcnQgZnJvbSBjb25jZWFsIGZsYWcgdG8gZnJhbWUgb2sgZmxhZyAqLworCisgIGlmIChmRGVjQW5kTWFwRnJhbWVEYXRhKSB7CisgICAgLyogUmVzZXQgc3BhdGlhbCBmcmFtaW5nIGNvbnRyb2wgdmFycyAqLworICAgIGZyYW1lLT5uZXdCc0RhdGEgPSAwOworICAgIHNlbGYtPnByZXZUaW1lU2xvdCA9IC0xOworICAgIHNlbGYtPmN1clRpbWVTbG90ID0gMDsKKyAgICBzZWxmLT5jdXJQcyA9IDA7CisKKyAgICBpZiAoY29udHJvbEZsYWdzICYgTVBFR1NfQ09OQ0VBTCkgeworICAgICAgLyogUmVzZXQgZnJhbWUgZGF0YSB0byBhdm9pZCBtaXNjb25maWd1cmF0aW9uLiAqLworICAgICAgU3BhdGlhbERlY0NsZWFyRnJhbWVEYXRhKHNlbGYsIGZyYW1lLCAmc2VsZi0+Y3JlYXRlUGFyYW1zKTsKKyAgICB9CisKKyAgICB7CisgICAgICBlcnIgPSBTcGF0aWFsRGVjRGVjb2RlRnJhbWUoc2VsZiwgZnJhbWUpOyAvKiBpbnB1dDogLi4uICovCisgICAgICAvKiBvdXRwdXQ6IGRlY29kZUFuZE1hcEZyYW1lREFUQSAqLworICAgIH0KKworICAgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgICAvKiBSZXNjdWUgc3RyYXRlZ3kgaXMgdG8gYXBwbHkgYnlwYXNzIG1vZGUgaW4gb3JkZXIKKyAgICAgICAgIHRvIGtlZXAgYXQgbGVhc3QgdGhlIGRvd25taXggY2hhbm5lbHMgY29udGludW91cy4gKi8KKyAgICAgIGNvbnRyb2xGbGFncyB8PSBNUEVHU19DT05DRUFMOworICAgICAgaWYgKHNlbGYtPmVyckludCA9PSBNUFNfT0spIHsKKyAgICAgICAgLyogc3RvcmUgaW50ZXJuYWwgZXJyb3IgYmVmb3IgaXQgZ2V0cyBvdmVyd3JpdHRlbiAqLworICAgICAgICBzZWxmLT5lcnJJbnQgPSBlcnI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZXJyID0gU3BhdGlhbERlY0FwcGx5UGFyYW1ldGVyU2V0cygKKyAgICAgIHNlbGYsIGZyYW1lLCBpbnB1dE1vZGUsIGluRGF0YSwgcW1mSW5EYXRhUmVhbCwgcW1mSW5EYXRhSW1hZywgblNhbXBsZXMsCisgICAgICBjb250cm9sRmxhZ3MgfCAoKGVyciA9PSBNUFNfT0spID8gMCA6IE1QRUdTX0JZUEFTU01PREUpLCBudW1JbnB1dENoYW5uZWxzLAorICAgICAgbWFwRGVzY3IpOworICBpZiAoZXJyICE9IE1QU19PSykgeworICAgIGdvdG8gYmFpbDsKKyAgfQorCitiYWlsOgorCisgICpwQ29udHJvbEZsYWdzID0gY29udHJvbEZsYWdzOworCisgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19kZWMuaCBiL2xpYlNBQ2RlYy9zcmMvc2FjX2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MmFjYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY19kZWMuaApAQCAtMCwwICsxLDUzOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBTQUMgRGVjb2RlciBMaWJyYXJ5IHN0cnVjdHVyZXMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQUNfREVDX0gKKyNkZWZpbmUgU0FDX0RFQ19ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKyNpbmNsdWRlICJzYWNfZGVjX2ludGVyZmFjZS5oIiAvKiBsaWJyYXJ5IGludGVyZmFjZSBpbiAuLi9pbmNsdWRlICovCisKKyNpbmNsdWRlICJGREtfcW1mX2RvbWFpbi5oIgorI2luY2x1ZGUgInNhY19xbWYuaCIKKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiIC8qIG1wNCBiaXRidWZmZXIgKi8KKyNpbmNsdWRlICJzYWNfY2FsY00xYW5kTTIuaCIKKyNpbmNsdWRlICJGREtfaHlicmlkLmgiCisjaW5jbHVkZSAiRkRLX2RlY29ycmVsYXRlLmgiCisjaW5jbHVkZSAic2FjX3Jlc2hhcGVCQkVudi5oIgorCisjaW5jbHVkZSAic2FjX2RlY19jb25jZWFsLmgiCisKKyNpbmNsdWRlICJzYWNfdHNkLmgiCisKKyNpZm5kZWYgTUFYCisjZGVmaW5lIE1BWChhLCBiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisKKyNkZWZpbmUgSUNDZGVmYXVsdCAwCisjZGVmaW5lIElQRGRlZmF1bHQgMAorI2RlZmluZSBhcmJkbXhHYWluRGVmYXVsdCAwCisjZGVmaW5lIENQQ2RlZmF1bHQgMTAKKyNkZWZpbmUgdHR0Q0xEMWRlZmF1bHQgMTUKKyNkZWZpbmUgdHR0Q0xEMmRlZmF1bHQgMAorCisjZGVmaW5lIElTX0hRX09OTFkoYW90KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChhb3QpID09IEFPVF9FUl9BQUNfTEQgfHwgKGFvdCkgPT0gQU9UX0VSX0FBQ19FTEQgfHwgKGFvdCkgPT0gQU9UX1VTQUMgfHwgXAorICAgKGFvdCkgPT0gQU9UX1JTVkQ1MCkKKworI2RlZmluZSBTQ09OU1QoeCkgRkwyRlhDT05TVF9EQkwoeCkKKworI2RlZmluZSBQQ19OVU1fQkFORFMgKDgpCisjZGVmaW5lIFBDX05VTV9IWUJfQkFORFMgKFBDX05VTV9CQU5EUyAtIDMgKyAxMCkKKyNkZWZpbmUgQUJTX1RIUiAoMWUtOWYgKiAzMjc2OCAqIDMyNzY4KQorCisjZGVmaW5lIE1BWF9IWUJSSURfQkFORFMgKE1BWF9OVU1fUU1GX0JBTkRTIC0gMyArIDEwKQorI2RlZmluZSBIWUJSSURfRklMVEVSX0RFTEFZICg2KQorCisjZGVmaW5lIE1BWF9SRVNJRFVBTF9GUkFNRVMgKDQpCisjZGVmaW5lIE1BWF9SRVNJRFVBTF9CSVNUUkVBTSBcCisgICg4MzYpIC8qICA0ODAwMCBicHMgKiAzIHJlcyAvICg4ICogNDQxMDAgLyAyMDQ4ICkgKi8KKyNkZWZpbmUgTUFYX01EQ1RfQ09FRkZTICgxMDI0KQorI2RlZmluZSBTQUNERUNfUkVTSURVQUxfQlNfQlVGX1NJWkUgXAorICAoMTAyNCkgLyogdXNlZCB0byBzZXR1cCBhbmQgY2hlY2sgcmVzaWR1YWwgYml0c3RyZWFtIGJ1ZmZlciAqLworCisjZGVmaW5lIE1BWF9OVU1fUEFSQU1TIChNQVhfTlVNX09UVCArIDQgKiBNQVhfTlVNX1RUVCArIE1BWF9JTlBVVF9DSEFOTkVMUykKKyNkZWZpbmUgTUFYX05VTV9QQVJBTUVURVJTIChNQVgoTUFYX05VTV9QQVJBTVMsIE1BWF9OVU1fT1RUKSkKKworI2RlZmluZSBNQVhfUEFSQU1FVEVSX1NFVFMgKDkpCisKKyNkZWZpbmUgTUFYX00yX0lOUFVUIChNQVhfT1VUUFVUX0NIQU5ORUxTKSAvKiAzIGRpcmVjdCArIDUgZGlmZnVzZSAqLworCisjZGVmaW5lIE1BWF9RTUZfQkFORFNfVE9fSFlCUklEIFwKKyAgKDMpIC8qIDMgYmFuZHMgYXJlIGZpbHRlcmVkIGFnYWluIGluICI0MCBiYW5kcyIgY2FzZSAqLworI2RlZmluZSBQUk9UT19MRU4gKDEzKQorI2RlZmluZSBCVUZGRVJfTEVOX0xGIChQUk9UT19MRU4pCisjZGVmaW5lIEJVRkZFUl9MRU5fSEYgKChQUk9UT19MRU4gLSAxKSAvIDIpCisKKyNkZWZpbmUgTUFYX05PX0RFQ09SUl9DSEFOTkVMUyAoTUFYX09VVFBVVF9DSEFOTkVMUykKKyNkZWZpbmUgSFJURl9BWklNVVRIUyAoNSkKKworI2RlZmluZSBNQVhfTlVNX09UVF9BVCAwCisKKy8qIGxlZnQgb3V0ICovCisKK3R5cGVkZWYgZW51bSB7CisgIFVQTUlYVFlQRV9CWVBBU1MgPSAtMSwgLypqdXN0IGJ5cGFzcyB0aGUgaW5wdXQgY2hhbm5lbHMgd2l0aG91dCBwcm9jZXNzaW5nKi8KKyAgVVBNSVhUWVBFX05PUk1BTCA9IDAgICAvKm11bHRpY2hhbm5lbCBsb3Vkc3BlYWtlciB1cG1peCB3aXRoIHNwYXRpYWwgZGF0YSovCit9IFVQTUlYVFlQRTsKKworc3RhdGljIGlubGluZSBpbnQgaXNUd29DaE1vZGUoVVBNSVhUWVBFIHVwbWl4VHlwZSkgeworICBpbnQgcmV0dmFsID0gMDsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworICAvKiBsZWZ0IG91dCBlbmQgKi8KKworI2RlZmluZSBNUEVHU19CWVBBU1NNT0RFICgweDAwMDAwMDAxKQorI2RlZmluZSBNUEVHU19DT05DRUFMICgweDAwMDAwMDAyKQorCit0eXBlZGVmIHN0cnVjdCBTVFBfREVDICpIQU5ETEVfU1RQX0RFQzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBTQ0hBUiBic1F1YW50Q29hcnNlWFhYcHJldjsKKyAgU0NIQVIgYnNRdWFudENvYXJzZVhYWHByZXZQYXJzZTsKK30gTE9TU0xFU1NTVEFURTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBTQ0hBUiBic1hYWERhdGFNb2RlW01BWF9QQVJBTUVURVJfU0VUU107CisgIFNDSEFSIGJzUXVhbnRDb2Fyc2VYWFhbTUFYX1BBUkFNRVRFUl9TRVRTXTsKKyAgU0NIQVIgYnNGcmVxUmVzU3RyaWRlWFhYW01BWF9QQVJBTUVURVJfU0VUU107CisgIFNDSEFSIG5vY21wUXVhbnRDb2Fyc2VYWFhbTUFYX1BBUkFNRVRFUl9TRVRTXTsKKyAgTE9TU0xFU1NTVEFURSAqc3RhdGU7IC8qIExpbmsgdG8gcGVyc2lzdGVudCBzdGF0ZSBpbmZvcm1hdGlvbiAqLworfSBMT1NTTEVTU0RBVEE7CisKK3N0cnVjdCBTUEFUSUFMX0JTX0ZSQU1FX3N0cnVjdCB7CisgIFVDSEFSIGJzSW5kZXBlbmRlbmN5RmxhZzsKKyAgVUNIQVIgbmV3QnNEYXRhOworICBVQ0hBUiBudW1QYXJhbWV0ZXJTZXRzOworCisgIC8qCisgIElmIGJzRnJhbWluZ1R5cGUgPT0gMCwgdGhlbiB0aGUgcGFyYW1TbG90W3BzXSBmb3IgMCA8PSBwcyA8IG51bVBhcmFtU2V0cyBpcworICBjYWxjdWxhdGVkIGFzIGZvbGxvd3M6IHBhcmFtU2xvdFtwc10gPSBjZWlsKG51bVNsb3RzKihwcysxKS9udW1QYXJhbVNldHMpIC0gMQorICBPdGhlcndpc2UsIGl0IGlzCisgICAgcGFyYW1TbG90W3BzXSA9IGJzUGFyYW1TbG90W3BzXQorICAqLworICBJTlQgcGFyYW1TbG90W01BWF9QQVJBTUVURVJfU0VUU107CisKKyAgLyogVGhlc2UgYXJyYXlzIGNvbnRhaW4gdGhlIGNvbXBhY3QgaW5kaWNlcywgb25seSBvbmUgdmFsdWUgcGVyIHBic3RyaWRlLCBvbmx5CisgICAqIHBhcmFtc2V0cyBhY3R1YWxseSBjb250YWluaW5nIGRhdGEuICovCisgIC8qIFRoZXNlIHZhbHVlcyBhcmUgd3JpdHRlbiBmcm9tIHRoZSBwYXJzZXIgaW4gZWNEYXRhRGVjKCkgYW5kIHJlYWQgZHVyaW5nCisgICAqIGRlY29kZSBpbiBtYXBJbmRleERhdGEoKSAqLworICBTQ0hBUiBjbXBPdHRDTERpZHhbTUFYX05VTV9PVFQgKyBNQVhfTlVNX09UVF9BVF1bTUFYX1BBUkFNRVRFUl9TRVRTXQorICAgICAgICAgICAgICAgICAgICBbTUFYX1BBUkFNRVRFUl9CQU5EU107CisgIFNDSEFSIGNtcE90dElDQ2lkeFtNQVhfTlVNX09UVF1bTUFYX1BBUkFNRVRFUl9TRVRTXVtNQVhfUEFSQU1FVEVSX0JBTkRTXTsKKworICAvKiBTbW9vdGhpbmcgKi8KKyAgVUNIQVIgYnNTbW9vdGhNb2RlW01BWF9QQVJBTUVURVJfU0VUU107CisgIFVDSEFSIGJzU21vb3RoVGltZVtNQVhfUEFSQU1FVEVSX1NFVFNdOworICBVQ0hBUiBic0ZyZXFSZXNTdHJpZGVTbWdbTUFYX1BBUkFNRVRFUl9TRVRTXTsKKyAgVUNIQVIgYnNTbWdEYXRhW01BWF9QQVJBTUVURVJfU0VUU10KKyAgICAgICAgICAgICAgICAgW01BWF9QQVJBTUVURVJfQkFORFNdOyAvKiBzbW9vdGhpbmcgZmxhZ3MsIG9uZSBpZiBiYW5kIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21vb3RoZWQsIG90aGVyd2lzZSB6ZXJvICovCisKKyAgLyogQXJiaXRyYXJ5IERvd25taXggKi8KKyAgU0NIQVIgKCpjbXBBcmJkbXhHYWluSWR4KVtNQVhfUEFSQU1FVEVSX1NFVFNdW01BWF9QQVJBTUVURVJfQkFORFNdOworCisgIC8qIExvc3NsZXNzIGNvbnRyb2wgKi8KKyAgTE9TU0xFU1NEQVRBICpDTERMb3NzbGVzc0RhdGE7CisgIExPU1NMRVNTREFUQSAqSUNDTG9zc2xlc3NEYXRhOworICAvKiBMT1NTTEVTU0RBVEEgKkFER0xvc3NsZXNzRGF0YTsgLT4gaXMgc3RvcmVkIGluIENMRExvc3NsZXNzRGF0YVtvZmZzZXRdICovCisKKyAgTE9TU0xFU1NEQVRBICpJUERMb3NzbGVzc0RhdGE7CisgIFNDSEFSICgqY21wT3R0SVBEaWR4KVtNQVhfUEFSQU1FVEVSX1NFVFNdW01BWF9QQVJBTUVURVJfQkFORFNdOworICBpbnQgcGhhc2VNb2RlOworICBpbnQgT3BkU21vb3RoaW5nTW9kZTsKKworICBVQ0hBUiB0ZW1wU2hhcGVFbmFibGVDaGFubmVsR0VTW01BWF9PVVRQVVRfQ0hBTk5FTFNdOyAvKiE8IEdFUyBzaWRlIGluZm8uICovCisgIFVDSEFSIGJzRW52U2hhcGVEYXRhW01BWF9PVVRQVVRfQ0hBTk5FTFNdCisgICAgICAgICAgICAgICAgICAgICAgW01BWF9USU1FX1NMT1RTXTsgLyohPCBHRVMgc2lkZSBpbmZvIChxdWFudGl6ZWQpLiAqLworCisgIFVDSEFSIHRlbXBTaGFwZUVuYWJsZUNoYW5uZWxTVFBbTUFYX09VVFBVVF9DSEFOTkVMU107IC8qITwgU1RQIHNpZGUgaW5mby4gKi8KKworICBUU0RfREFUQSBUc2REYXRhWzFdOyAvKiE8IFRTRCBkYXRhIHN0cnVjdHVyZS4gKi8KK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogTG9zc2xlc3Mgc3RhdGUgKi8KKyAgTE9TU0xFU1NTVEFURSBDTERMb3NzbGVzc1N0YXRlW01BWF9OVU1fUEFSQU1FVEVSU107CisgIExPU1NMRVNTU1RBVEUgSUNDTG9zc2xlc3NTdGF0ZVtNQVhfTlVNX1BBUkFNRVRFUlNdOworICBMT1NTTEVTU1NUQVRFIElQRExvc3NsZXNzU3RhdGVbTUFYX05VTV9QQVJBTUVURVJTXTsKK30gQlNfTExfU1RBVEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IHByZXZQYXJhbVNsb3Q7CisgIGludCBwcmV2U21nVGltZTsKKyAgVUNIQVIgcHJldlNtZ0RhdGFbTUFYX1BBUkFNRVRFUl9CQU5EU107CisKKyAgRklYUF9EQkwgb3BkTGVmdFN0YXRlX19GREtbTUFYX1BBUkFNRVRFUl9CQU5EU107CisgIEZJWFBfREJMIG9wZFJpZ2h0U3RhdGVfX0ZES1tNQVhfUEFSQU1FVEVSX0JBTkRTXTsKKworfSBTTU9PVEhJTkdfU1RBVEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgRklYUF9EQkwgYWxwaGFfX0ZESzsKKyAgRklYUF9EQkwgYmV0YV9fRkRLOworICBGSVhQX0RCTCBwYXJ0TnJnUHJldl9fRkRLWzIgKiBNQVhfT1VUUFVUX0NIQU5ORUxTICsgTUFYX0lOUFVUX0NIQU5ORUxTXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgW0JCX0VOVl9TSVpFXTsKKyAgRklYUF9EQkwgbm9ybU5yZ1ByZXZfX0ZES1syICogTUFYX09VVFBVVF9DSEFOTkVMUyArIE1BWF9JTlBVVF9DSEFOTkVMU107CisgIEZJWFBfREJMIGZyYW1lTnJnUHJldl9fRkRLWzIgKiBNQVhfT1VUUFVUX0NIQU5ORUxTICsgTUFYX0lOUFVUX0NIQU5ORUxTXTsKKyAgSU5UIHBhcnROcmdQcmV2U0ZbMiAqIE1BWF9PVVRQVVRfQ0hBTk5FTFMgKyBNQVhfSU5QVVRfQ0hBTk5FTFNdOworICBJTlQgcGFydE5yZ1ByZXYyU0ZbMiAqIE1BWF9PVVRQVVRfQ0hBTk5FTFMgKyBNQVhfSU5QVVRfQ0hBTk5FTFNdOworICBJTlQgbm9ybU5yZ1ByZXZTRlsyICogTUFYX09VVFBVVF9DSEFOTkVMUyArIE1BWF9JTlBVVF9DSEFOTkVMU107CisgIElOVCBmcmFtZU5yZ1ByZXZTRlsyICogTUFYX09VVFBVVF9DSEFOTkVMUyArIE1BWF9JTlBVVF9DSEFOTkVMU107Cit9IFJFU0hBUEVfQkJFTlZfU1RBVEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IG1heE51bUlucHV0Q2hhbm5lbHM7CisgIGludCBtYXhOdW1PdXRwdXRDaGFubmVsczsKKyAgaW50IG1heE51bVFtZkJhbmRzOworICBpbnQgbWF4TnVtSHlicmlkQmFuZHM7CisgIGludCBtYXhOdW1YQ2hhbm5lbHM7CisgIGludCBtYXhOdW1WQ2hhbm5lbHM7CisgIGludCBtYXhOdW1EZWNvckNoYW5uZWxzOworICBpbnQgbWF4TnVtQ21wbHhRbWZCYW5kczsKKyAgaW50IG1heE51bUNtcGx4SHliQmFuZHM7CisgIGludCBtYXhOdW1SZXNDaGFubmVsczsKKyAgaW50IGJQcm9jUmVzaWR1YWw7IC8qIHByb2Nlc3MgcmVzaWR1YWwgKi8KKyAgaW50IG1heE51bVJlc2lkdWFsQ2hhbm5lbHM7CisgIGludCBtYXhOdW1PdHRCb3hlczsKKyAgaW50IG1heE51bVBhcmFtczsKKworfSBTQUNERUNfQ1JFQVRJT05fUEFSQU1TOworCitzdHJ1Y3Qgc3BhdGlhbERlY19zdHJ1Y3QgeworICBTQUNERUNfRVJST1IKKyAgZXJySW50OyAgICAgICAgICAgICAvKiBGaWVsZCB0byBzdG9yZSBpbnRlcm5hbCBlcnJvcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgV2lsbCBiZSBjbGVhciBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgZWFjaCBwcm9jZXNzIGNhbGwuICovCisgIGludCBzdGF0aWNEZWNTY2FsZTsgLyogc3RhdGljIHNjYWxlIG9mIGRlY29kZXIgKi8KKworICAvKiBHRU5FUkFMICovCisgIGludCBzYW1wbGluZ0ZyZXE7ICAgICAgIC8qIFtIel0gKi8KKyAgQ0ZHX0xFVkVMIGRlY29kZXJMZXZlbDsgLyogMC4uNSAqLworICBDRkdfRVhURU5UIGRlY29kZXJNb2RlOworICBDRkdfQklOQVVSQUwgYmluYXVyYWxNb2RlOworCisgIFNBQ0RFQ19DUkVBVElPTl9QQVJBTVMgY3JlYXRlUGFyYW1zOworCisgIGludCBudW1Db21wbGV4UHJvY2Vzc2luZ0JhbmRzOworCisgIGludCB0cmVlQ29uZmlnOyAvKiBUUkVFXzUxNTEgPSA1MTUxLCBUUkVFXzUxNTIgPSA1MTUyLCBUUkVFXzUyNSA9IDUyNSwgZGVmaW5lZAorICAgICAgICAgICAgICAgICAgICAgaW4gc2FjX2JpdGRlYy5oICovCisKKyAgaW50IG51bUlucHV0Q2hhbm5lbHM7ICAvKiAxIChNKSBvciAyIChMLFIpICovCisgIGludCBudW1PdXRwdXRDaGFubmVsczsgLyogNiBmb3IgMy8yLjEgKEZMLEZSLEZDLExGLEJMLEJSKSAqLworICBpbnQgbnVtT3R0Qm94ZXM7ICAgICAgIC8qIG51bWJlciBvZiBvdHQgYm94ZXMgKi8KKyAgaW50IG51bU0ycm93czsKKworICBpbnQgbnVtT3V0cHV0Q2hhbm5lbHNBVDsgLyogTnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyBhZnRlciBhcmJpdHJhcnkgdHJlZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyAqLworCisgIGludCBxdWFudE1vZGU7IC8qIFFVQU5UX0ZJTkUsIFFVQU5UX0VCUTEsIFFVQU5UX0VCUTIsIGRlZmluZWQgaW4gc2FjX2JpdGRlYy5oCisgICAgICAgICAgICAgICAgICAqLworICBpbnQgYXJiaXRyYXJ5RG93bm1peDsgLyogKGFyYml0cmFyeURvd25taXggIT0gMCkgMSBhcmJpdHJhcnkgZG93bm1peCBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50LCAyIGFyYml0cmFyeSBkb3dubWl4IHJlc2lkdWFsIGRhdGEgcHJlc2VudCovCisgIGludCByZXNpZHVhbENvZGluZzsgICAvKiAocmVzaWR1YWxDb2RpbmcgIT0gMCkgPT4gcmVzaWR1YWwgY29kaW5nIGRhdGEgcHJlc2VudAorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFVDSEFSIG5yUmVzaWR1YWxGcmFtZTsKKyAgVUNIQVIgbnJBcmJEb3dubWl4UmVzaWR1YWxGcmFtZTsKKyAgRkRLX0JJVFNUUkVBTSAqKmhSZXNpZHVhbEJpdHN0cmVhbXM7CisgIGludCB0ZW1wU2hhcGVDb25maWc7IC8qICovCisgIGludCBkZWNvcnJUeXBlOyAgICAgIC8qIEluZGljYXRlcyB0byB1c2UgUFMgb3Igbm9uZSBQUyBkZWNvcnJlbGF0b3IuICovCisgIGludCBkZWNvcnJDb25maWc7ICAgIC8qIGNob3NlbiBkZWNvcnJlbGF0b3IgKi8KKyAgaW50IGVudlF1YW50TW9kZTsgICAgLyogcXVhbnRpemF0aW9uIG1vZGUgb2YgZW52ZWxvcGUgcmVzaGFwaW5nIGRhdGEgKi8KKworICBGSVhQX0RCTCBjbGlwUHJvdGVjdEdhaW5fX0ZESzsgLyogZ2xvYmFsIGdhaW4gZm9yIHVwbWl4ICovCisgIGNoYXIgY2xpcFByb3RlY3RHYWluU0ZfX0ZESzsgICAvKiBnbG9iYWwgZ2FpbiBmb3IgdXBtaXggKi8KKworICAvKiBDdXJyZW50bHkgaWdub3JpbmcgY2VudGVyIGRlY29ycgorICAgICBudW1WQ2hhbm5lbHMgPSBudW1EaXJla3RTaWduYWxzICsgbnVtRGVjb3JTaWduYWxzICovCisgIGludCBudW1EaXJla3RTaWduYWxzOyAgLyogbmVlZGVkIGZvciBXLCBOdW1iZXIgb2YgZGlyZWt0IHNpZ25hbHMgNTE1IC0+IDEgNTI1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gMyAqLworICBpbnQgd1N0YXJ0UmVzaWR1YWxJZHg7IC8qIFdoZXJlIHRvIHN0YXJ0IHJlYWQgcmVzaWR1YWxzIGZvciBXLCA9IDAgZm9yIDUxNSwgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgZm9yIDUyNSBzaW5jZSBvbmUgcmVzaWR1YWwgaXMgdXNlZCBpbiBWICovCisgIGludCBudW1EZWNvclNpZ25hbHM7ICAgLyogbmVlZGVkIGZvciBXLCBOdW1iZXIgb2YgcmVzaWR1YWwgYW5kIGRlY29ycmVsYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbHMsID0gMiwgMyBmb3IgY2VudGVyIGRlY2NvcmVsYXRpb24qLworICBpbnQgbnVtVkNoYW5uZWxzOyAgICAgIC8qIGRpcmVjdCBzaWduYWxzICsgZGVjb3JlbGF0b3Igc2lnbmFscyAqLworICBpbnQgbnVtWENoYW5uZWxzOyAgICAgIC8qIGRpcmVjdCBpbnB1dCBzaWduYWxzICsgVFRULXJlc2lkdWFscyAqLworCisgIGludCB0aW1lU2xvdHM7ICAgIC8qIGxlbmd0aCBvZiBzcGF0aWFsIGZyYW1lIGluIFFNRiBzYW1wbGVzICovCisgIGludCBjdXJUaW1lU2xvdDsgIC8qIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgdGltZSBzbG90IHVzZWQgZm9yIGh5cGVyZnJhbWluZyAqLworICBpbnQgcHJldlRpbWVTbG90OyAvKiAgKi8KKyAgaW50IGN1clBzOworICBpbnQgZnJhbWVMZW5ndGg7IC8qIG51bWJlciBvZiBvdXRwdXQgd2F2ZWZvcm0gc2FtcGxlcy9jaGFubmVsL2ZyYW1lICovCisgIFVQTUlYVFlQRSB1cG1peFR5cGU7CisgIGludCBwYXJ0aWFsbHlDb21wbGV4OworICBpbnQgdXNlRkRyZXZlcmI7CisKKyAgaW50IGJTaGFyZURlbGF5V2l0aFNCUjsKKworICBpbnQgdHBfaHliQmFuZEJvcmRlcjsgLyogSHlicmlkIGJhbmQgaW5kaWNhdGluZyB0aGUgSFAgZmlsdGVyIGN1dC1vZmYuICovCisKKyAgLyogRlJFUVVFTkNZIE1BUFBJTkcgKi8KKyAgaW50IHFtZkJhbmRzOworICBpbnQgaHlicmlkQmFuZHM7CisgIGNvbnN0IFNDSEFSICprZXJuZWxzOyAvKiBNYXBwaW5nIGh5YnJpZCBiYW5kIHRvIHBhcmFtZXRlciBiYW5kLiAqLworCisgIGludCBUc2RUczsgLyoqPCBUU0QgUU1GIHNsb3QgY291bnRlciAwPD0gdHMgPCBudW1TbG90cyAqLworCisgIGludCAqcGFyYW0yaHliOyAvKiBNYXBwaW5nIHBhcmFtZXRlciBiYW5kcyB0byBoeWJyaWQgYmFuZHMgKi8KKyAgaW50IGtlcm5lbHNfd2lkdGhbTUFYX1BBUkFNRVRFUl9CQU5EU107IC8qIE1hcHBpbmcgcGFybWV0ZXIgYmFuZCB0byBoeWJyaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQgb2Zmc2V0cy4gKi8KKworICAvKiBSZXNpZHVhbCBjb2RpbmcgKi8KKyAgaW50IHJlc2lkdWFsU2FtcGxpbmdGcmVxOworICBVQ0hBUiByZXNpZHVhbFByZXNlbnRbTUFYX05VTV9PVFQgKyBNQVhfTlVNX1RUVF07CisgIFVDSEFSIHJlc2lkdWFsQmFuZHNbTUFYX05VTV9PVFQgKyBNQVhfTlVNX1RUVF07ICAgIC8qIDAsIGlmIG5vIHJlc2lkdWFsIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudCBmb3IgdGhpcyBib3ggKi8KKyAgVUNIQVIgcmVzaWR1YWxRTUZCYW5kc1tNQVhfTlVNX09UVCArIE1BWF9OVU1fVFRUXTsgLyogbmVlZGVkIGZvciBvcHRpbWl6ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRjdDJxbWYgY2FsY3VsYXRpb24gKi8KKyAgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnBDb25maWdDdXJyZW50OworCisgIGludCBhcmJkbXhGcmFtZXNQZXJTcGF0aWFsRnJhbWU7CisgIGludCBhcmJkbXhVcGRRTUY7CisKKyAgaW50IG51bVBhcmFtZXRlckJhbmRzOyAvKiBOdW1iZXIgb2YgcGFyYW1ldGVyIGJhbmRzIDQwLCAyOCwgMjAsIDE0LCAxMCwgLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiovCisgIGludCBiaXRzdHJlYW1QYXJhbWV0ZXJCYW5kczsKKyAgaW50ICpudW1PdHRCYW5kczsgLyogbnVtYmVyIG9mIGJhbmRzIGZvciBlYWNoIG90dCwgaXMgIT0gbnVtUGFyYW1ldGVyQmFuZHMgZm9yCisgICAgICAgICAgICAgICAgICAgICAgIExGRXMgKi8KKworICAvKiAxIE1BUFBJTkcgKi8KKyAgVUNIQVIgZXh0ZW5kRnJhbWU7CisgIFVDSEFSIG51bVBhcmFtZXRlclNldHNQcmV2OworCisgIGludCAqc21nVGltZTsKKyAgVUNIQVIgKipzbWdEYXRhOworCisgIC8qIFBBUkFNRVRFUiBEQVRBIGRlY29kZWQgYW5kIGRlcXVhbnRpemVkICovCisKKyAgLyogTGFzdCBwYXJhbWV0ZXJzIGZyb20gcHJldiBmcmFtZSByZXF1aXJlZCBkdXJpbmcgZGVjb2RlIGluIG1hcEluZGV4RGF0YSgpCisgICAqIGFuZCBub3QgdG91Y2hlZCBkdXJpbmcgcGFyc2UgKi8KKyAgU0NIQVIgKipvdHRDTERpZHhQcmV2OworICBTQ0hBUiAqKm90dElDQ2lkeFByZXY7CisgIFNDSEFSICoqYXJiZG14R2FpbklkeFByZXY7CisgIFNDSEFSICoqb3R0SVBEaWR4UHJldjsKKyAgU0NIQVIgKioqb3V0SWR4RGF0YTsgLyogaXMgdGhpcyByZWFsbHkgcGVyc2lzdGVudCBtZW1vcnkgPyAqLworCisgIC8qIFN0YXRlIG1lbSByZXF1aXJlZCBkdXJpbmcgcGFyc2UgaW4gU3BhdGlhbERlY1BhcnNlRnJhbWVEYXRhKCkgKi8KKyAgU0NIQVIgKipjbXBPdHRDTERpZHhQcmV2OworICBTQ0hBUiAqKmNtcE90dElDQ2lkeFByZXY7CisgIFNDSEFSICoqKm90dElDQ2RpZmZpZHg7CisgIFNDSEFSICoqY21wT3R0SVBEaWR4UHJldjsKKworICAvKiBTdGF0ZSBtZW0gcmVxdWlyZWQgaW4gcGFyc2VBcmJpdHJhcnlEb3dubWl4RGF0YSAqLworICBTQ0hBUiAqKmNtcEFyYmRteEdhaW5JZHhQcmV2OworCisgIFNDSEFSICoqKm90dENMRF9fRkRLOworICBTQ0hBUiAqKipvdHRJQ0NfX0ZESzsKKworICBTQ0hBUiAqKiphcmJkbXhHYWluX19GREs7IC8qIEhvbGRzIHRoZSBhcnRpc3RpYyBkb3dubWl4IGNvcnJlY3Rpb24gaW5kZXguKi8KKworICBGSVhQX0RCTCAqYXJiZG14QWxwaGFfX0ZESzsKKyAgRklYUF9EQkwgKmFyYmRteEFscGhhUHJldl9fRkRLOworCisgIFVDSEFSIHN0ZXJlb0NvbmZpZ0luZGV4OworICBpbnQgaGlnaFJhdGVNb2RlOworCisgIGludCBwaGFzZUNvZGluZzsKKworICBTQ0hBUiAqKipvdHRJUERfX0ZESzsKKworICBGSVhQX0RCTCBQaGFzZUxlZnRfX0ZES1tNQVhfUEFSQU1FVEVSX0JBTkRTXTsKKyAgRklYUF9EQkwgUGhhc2VSaWdodF9fRkRLW01BWF9QQVJBTUVURVJfQkFORFNdOworICBGSVhQX0RCTCBQaGFzZVByZXZMZWZ0X19GREtbTUFYX1BBUkFNRVRFUl9CQU5EU107CisgIEZJWFBfREJMIFBoYXNlUHJldlJpZ2h0X19GREtbTUFYX1BBUkFNRVRFUl9CQU5EU107CisgIGludCBudW1PdHRCYW5kc0lQRDsKKworICAvKiBHQUlOIE1BVFJJQ0lFUyBGT1IgQ1VSUkVOVCBhbmQgUFJFVklPVVMgUEFSTUFURVIgU0VUKHMpKi8KKyAgRklYUF9EQkwgKioqTTJSZWFsX19GREs7CisgIEZJWFBfREJMICoqKk0ySW1hZ19fRkRLOworICBGSVhQX0RCTCAqKipNMlJlYWxQcmV2X19GREs7CisgIEZJWFBfREJMICoqKk0ySW1hZ1ByZXZfX0ZESzsKKworICAvKiBJTlBVVCBTSUdOQUxTICovCisgIEZJWFBfREJMICoqKnFtZklucHV0UmVhbERlbGF5QnVmZmVyX19GREs7CisgIEZJWFBfREJMICoqKnFtZklucHV0SW1hZ0RlbGF5QnVmZmVyX19GREs7CisKKyAgaW50IHBjX2ZpbHRlcmRlbGF5OyAvKiBhZGRpdGlvbmFsIGRlbGF5IHRvIGFsaWduIEhRIHdpdGggTFAgYmVmb3JlIGh5YmlyZAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuYWx5c2lzICovCisgIGludCBxbWZJbnB1dERlbGF5QnVmUG9zOworICBGSVhQX0RCTCAqKnFtZklucHV0UmVhbF9fRkRLOworICBGSVhQX0RCTCAqKnFtZklucHV0SW1hZ19fRkRLOworCisgIEZJWFBfREJMICoqaHliSW5wdXRSZWFsX19GREs7CisgIEZJWFBfREJMICoqaHliSW5wdXRJbWFnX19GREs7CisKKyAgRklYUF9EQkwgKipiaW5JbnB1dFJldmVyYjsKKworICBGSVhQX0RCTCBiaW5HYWluLCByZXZlcmJHYWluOworICBGSVhQX0RCTCBiaW5DZW50ZXJHYWluLCByZXZlcmJDZW50ZXJHYWluOworCisgIC8qIFJFU0lEVUFMIFNJR05BTFMgKi8KKworICBGSVhQX0RCTCAqKipxbWZSZXNpZHVhbFJlYWxfX0ZESzsKKyAgRklYUF9EQkwgKioqcW1mUmVzaWR1YWxJbWFnX19GREs7CisKKyAgRklYUF9EQkwgKipoeWJSZXNpZHVhbFJlYWxfX0ZESzsKKyAgRklYUF9EQkwgKipoeWJSZXNpZHVhbEltYWdfX0ZESzsKKworICBpbnQgcW1mT3V0cHV0UmVhbERyeURlbGF5QnVmUG9zOworICBGSVhQX0RCTCAqKipxbWZPdXRwdXRSZWFsRHJ5RGVsYXlCdWZmZXJfX0ZESzsKKyAgRklYUF9EQkwgKioqcW1mT3V0cHV0SW1hZ0RyeUZpbHRlckJ1ZmZlcl9fRkRLOworICBGSVhQX0RCTCAqcW1mT3V0cHV0SW1hZ0RyeUZpbHRlckJ1ZmZlckJhc2VfX0ZESzsKKworICAvKiBURU1QT1JBUlkgU0lHTkFMUyAqLworCisgIEZJWFBfREJMICoqd1JlYWxfX0ZESzsKKyAgRklYUF9EQkwgKip3SW1hZ19fRkRLOworCisgIC8qIE9VVFBVVCBTSUdOQUxTICovCisgIEZJWFBfREJMICoqaHliT3V0cHV0UmVhbERyeV9fRkRLOworICBGSVhQX0RCTCAqKmh5Yk91dHB1dEltYWdEcnlfX0ZESzsKKyAgRklYUF9EQkwgKipoeWJPdXRwdXRSZWFsV2V0X19GREs7CisgIEZJWFBfREJMICoqaHliT3V0cHV0SW1hZ1dldF9fRkRLOworICBQQ01fTVBTICp0aW1lT3V0X19GREs7CisKKyAgSEFORExFX0ZES19RTUZfRE9NQUlOIHBRbWZEb21haW47CisKKyAgRkRLX0FOQV9IWUJfRklMVEVSCisgICpoeWJyaWRBbmFseXNpczsgLyohPCBwb2ludGVyIEFuYWx5c2lzIGh5YnJpZCBmaWx0ZXJiYW5rIGFycmF5LiAqLworICBGREtfU1lOX0hZQl9GSUxURVIKKyAgKmh5YnJpZFN5bnRoZXNpczsgLyohPCBwb2ludGVyIFN5bnRoZXNpcyBoeWJyaWQgZmlsdGVyYmFuayBhcnJheS4gKi8KKyAgRklYUF9EQkwgKioKKyAgICAgIHBIeWJyaWRBbmFTdGF0ZXNMRmRteDsgLyohPCBwb2ludGVyIHRvIGFuYWx5c2lzIGh5YnJpZCBmaWx0ZXIgc3RhdGVzIExGICovCisgIEZJWFBfREJMICoqCisgICAgICBwSHlicmlkQW5hU3RhdGVzSEZkbXg7IC8qITwgcG9pbnRlciB0byBhbmFseXNpcyBoeWJyaWQgZmlsdGVyIHN0YXRlcyBIRiAqLworICBGSVhQX0RCTCAqKgorICAgICAgcEh5YnJpZEFuYVN0YXRlc0xGcmVzOyAvKiE8IHBvaW50ZXIgdG8gYW5hbHlzaXMgaHlicmlkIGZpbHRlciBzdGF0ZXMgTEYgKi8KKyAgRklYUF9EQkwgKioKKyAgICAgIHBIeWJyaWRBbmFTdGF0ZXNIRnJlczsgLyohPCBwb2ludGVyIHRvIGFuYWx5c2lzIGh5YnJpZCBmaWx0ZXIgc3RhdGVzIEhGICovCisKKyAgREVDT1JSX0RFQyAqYXBEZWNvcjsgLyohPCBwb2ludGVyIGRlY29ycmVsYXRvciBhcnJheS4gKi8KKyAgRklYUF9EQkwgKipwRGVjb3JCdWZmZXJDcGx4OworCisgIFNNT09USElOR19TVEFURSAqc21vb3RoU3RhdGU7IC8qITwgUG9pbnRlciB0byBzbW9vdGhpbmcgc3RhdGVzLiAqLworCisgIFJFU0hBUEVfQkJFTlZfU1RBVEUgKnJlc2hhcGVCQkVudlN0YXRlOyAvKiE8IEdFUyBoYW5kbGUuICovCisgIFNDSEFSIHJvdzJjaGFubmVsRG14R0VTW01BWF9PVVRQVVRfQ0hBTk5FTFNdOworCisgIEhBTkRMRV9TVFBfREVDIGhTdHBEZWM7IC8qITwgU1RQIGhhbmRsZS4gKi8KKworICBjb25zdCBVQ0hBUiAqcEFjdGl2TTJQYXJhbUJhbmRzOworCisgIGludCBiT3ZlcndyaXRlTTFNMnByZXY7IC8qIE92ZXJ3cml0ZSBwcmV2aW91cyBNMi9NMiBwYXJhbXMgd2l0aCBmaXJzdCBzZXQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGZyYW1lIGFmdGVyIFNTQyBjaGFuZ2UgKGFrYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVBZnRlckNvbmZpZ0hhc0NoYW5nZWRGbGFnKS4gKi8KKyAgU3BhdGlhbERlY0NvbmNlYWxtZW50SW5mbyBjb25jZWFsSW5mbzsKK307CisKKyNkZWZpbmUgU0FDREVDX1NZTlRBWF9NUFMgMQorI2RlZmluZSBTQUNERUNfU1lOVEFYX1VTQUMgMgorI2RlZmluZSBTQUNERUNfU1lOVEFYX1JTVkQ1MCA0CisjZGVmaW5lIFNBQ0RFQ19TWU5UQVhfTDIgOAorI2RlZmluZSBTQUNERUNfU1lOVEFYX0wzIDE2CisjZGVmaW5lIFNBQ0RFQ19TWU5UQVhfTEQgMzIKKworc3RhdGljIGlubGluZSBpbnQgR2V0UHJvY0JhbmQoc3BhdGlhbERlY19zdHJ1Y3QgKnNlbGYsIGludCBxcykgeworICByZXR1cm4gc2VsZi0+a2VybmVsc1txc107Cit9CisKKyNlbmRpZiAvKiBTQUNfREVDX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2RlYy9zcmMvc2FjX2RlY19jb25jZWFsLmNwcCBiL2xpYlNBQ2RlYy9zcmMvc2FjX2RlY19jb25jZWFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmVlZjdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZGVjL3NyYy9zYWNfZGVjX2NvbmNlYWwuY3BwCkBAIC0wLDAgKzEsMzkyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBDaHJpc3RpYW4gRXJ0ZWwsIENocmlzdGlhbiBHcmllYmVsCisKKyAgIERlc2NyaXB0aW9uOiBTQUMgRGVjIGVycm9yIGNvbmNlYWxtZW50CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJzYWNfZGVjX2NvbmNlYWwuaCIKKwordm9pZCBTcGF0aWFsRGVjQ29uY2VhbG1lbnRfSW5pdChTcGF0aWFsRGVjQ29uY2VhbG1lbnRJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIHJlc2V0RmxhZ3MpIHsKKyAgRkRLX0FTU0VSVChpbmZvICE9IE5VTEwpOworCisgIGlmIChyZXNldEZsYWdzICYgTVBFR1NfQ09OQ0VBTF9SRVNFVF9TVEFURSkgeworICAgIGluZm8tPmNvbmNlYWxTdGF0ZSA9IFNwYXRpYWxEZWNDb25jZWFsU3RhdGVfSW5pdDsKKyAgICAvKiBGcmFtZSBjb3VudGVycyB3aWxsIGJlIGluaXRpYWxpemVkIGltcGxpY2l0ZWx5IGluIGZ1bmN0aW9uCisgICAgICogU3BhdGlhbERlY0NvbmNlYWxtZW50X1VwZGF0ZVN0YXRlKCkuICovCisgIH0KKworICBpZiAocmVzZXRGbGFncyAmIE1QRUdTX0NPTkNFQUxfUkVTRVRfUEFSQU1FVEVSKSB7CisgICAgLyogU2V0IGRlZmF1bHQgcGFyYW1zICovCisgICAgaW5mby0+Y29uY2VhbFBhcmFtcy5tZXRob2QgPSBNUEVHU19DT05DRUFMX0RFRkFVTFRfTUVUSE9EOworICAgIGluZm8tPmNvbmNlYWxQYXJhbXMubnVtS2VlcEZyYW1lcyA9IE1QRUdTX0NPTkNFQUxfREVGQVVMVF9OVU1fS0VFUF9GUkFNRVM7CisgICAgaW5mby0+Y29uY2VhbFBhcmFtcy5udW1GYWRlT3V0RnJhbWVzID0KKyAgICAgICAgTVBFR1NfQ09OQ0VBTF9ERUZBVUxUX0ZBREVfT1VUX1NMT1BFX0xFTkdUSDsKKyAgICBpbmZvLT5jb25jZWFsUGFyYW1zLm51bUZhZGVJbkZyYW1lcyA9CisgICAgICAgIE1QRUdTX0NPTkNFQUxfREVGQVVMVF9GQURFX0lOX1NMT1BFX0xFTkdUSDsKKyAgICBpbmZvLT5jb25jZWFsUGFyYW1zLm51bVJlbGVhc2VGcmFtZXMgPQorICAgICAgICBNUEVHU19DT05DRUFMX0RFRkFVTFRfTlVNX1JFTEVBU0VfRlJBTUVTOworICB9CisKKyAgcmV0dXJuOworfQorCitpbnQgU3BhdGlhbERlY0NvbmNlYWxtZW50X0FwcGx5KAorICAgIFNwYXRpYWxEZWNDb25jZWFsbWVudEluZm8gKmluZm8sCisgICAgY29uc3QgU0NIQVIgKCpjbXBJZHhEYXRhKVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwgU0NIQVIgKipkaWZmSWR4RGF0YSwKKyAgICBTQ0hBUiAqCisgICAgICAgIGlkeFByZXYsIC8qIGNoYXIKKyAgICAgICAgICAgICAgICAgICAgaWR4UHJldltTUEFUSUFMREVDX01BWF9OVU1fT1RUXVtTUEFUSUFMREVDX01BWF9QQVJBTUVURVJfQkFORFNdLAorICAgICAgICAgICAgICAgICAgKi8KKyAgICBTQ0hBUiAqYnNYWFhEYXRhTW9kZSwgY29uc3QgaW50IHN0YXJ0QmFuZCwgY29uc3QgaW50IHN0b3BCYW5kLAorICAgIGNvbnN0IFNDSEFSIGRlZmF1bHRWYWx1ZSwgY29uc3QgaW50IHBhcmFtVHlwZSwgY29uc3QgaW50IG51bVBhcmFtU2V0cykgeworICBpbnQgYXBwbGllZFByb2Nlc3NpbmcgPSAwOworICBpbnQgYmFuZCwgZGF0YU1vZGUgPSAtMTsKKworICBGREtfQVNTRVJUKGluZm8gIT0gTlVMTCk7CisgIEZES19BU1NFUlQoY21wSWR4RGF0YSAhPSBOVUxMKTsKKyAgRkRLX0FTU0VSVChpZHhQcmV2ICE9IE5VTEwpOworICBGREtfQVNTRVJUKGJzWFhYRGF0YU1vZGUgIT0gTlVMTCk7CisKKyAgLyogUHJvY2Vzc2luZyBkZXBlbmRzIG9ubHkgb24gdGhlIGludGVybmFsIHN0YXRlICovCisgIHN3aXRjaCAoaW5mby0+Y29uY2VhbFN0YXRlKSB7CisgICAgY2FzZSBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX0luaXQ6CisgICAgICBkYXRhTW9kZSA9IDA7IC8qIGRlZmF1bHQgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX09rOgorICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNwYXRpYWxEZWNDb25jZWFsU3RhdGVfS2VlcDoKKyAgICAgIGRhdGFNb2RlID0gMTsgLyoga2VlcCAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNwYXRpYWxEZWNDb25jZWFsU3RhdGVfRmFkZVRvRGVmYXVsdDogeworICAgICAgLyogU3RhcnQgc2ltcGxlIGZhZGUgb3V0ICovCisgICAgICBGSVhQX0RCTCBmYWMgPSBmRGl2Tm9ybShpbmZvLT5jbnRTdGF0ZUZyYW1lcyArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5jb25jZWFsUGFyYW1zLm51bUZhZGVPdXRGcmFtZXMgKyAxKTsKKworICAgICAgZm9yIChiYW5kID0gc3RhcnRCYW5kOyBiYW5kIDwgc3RvcEJhbmQ7IGJhbmQgKz0gMSkgeworICAgICAgICAvKiAgICAgICAgICAgIGlkeFByZXYgPSBmYWMgKiBkZWZhdWx0VmFsdWUgKyAoMS1mYWMpICogaWR4UHJldjsgKi8KKyAgICAgICAgaWR4UHJldltiYW5kXSA9CisgICAgICAgICAgICBmTXVsdEkoZmFjLCBkZWZhdWx0VmFsdWUgLSBpZHhQcmV2W2JhbmRdKSArIGlkeFByZXZbYmFuZF07CisgICAgICB9CisgICAgICBkYXRhTW9kZSA9IDE7IC8qIGtlZXAgKi8KKyAgICAgIGFwcGxpZWRQcm9jZXNzaW5nID0gMTsKKyAgICB9IGJyZWFrOworCisgICAgY2FzZSBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX0RlZmF1bHQ6CisgICAgICBmb3IgKGJhbmQgPSBzdGFydEJhbmQ7IGJhbmQgPCBzdG9wQmFuZDsgYmFuZCArPSAxKSB7CisgICAgICAgIGlkeFByZXZbYmFuZF0gPSBkZWZhdWx0VmFsdWU7CisgICAgICB9CisgICAgICBkYXRhTW9kZSA9IDE7IC8qIGtlZXAgKi8KKyAgICAgIGFwcGxpZWRQcm9jZXNzaW5nID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX0ZhZGVGcm9tRGVmYXVsdDogeworICAgICAgRklYUF9EQkwgZmFjID0gZkRpdk5vcm0oaW5mby0+Y250VmFsaWRGcmFtZXMgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+Y29uY2VhbFBhcmFtcy5udW1GYWRlSW5GcmFtZXMgKyAxKTsKKworICAgICAgZm9yIChiYW5kID0gc3RhcnRCYW5kOyBiYW5kIDwgc3RvcEJhbmQ7IGJhbmQgKz0gMSkgeworICAgICAgICAvKiAgICAgICAgICAgIGlkeFByZXYgPSBmYWMgKiBjbXBJZHhEYXRhICsgKDEtZmFjKSAqIGRlZmF1bHRWYWx1ZTsgKi8KKyAgICAgICAgaWR4UHJldltiYW5kXSA9CisgICAgICAgICAgICBmTXVsdEkoZmFjLCBjbXBJZHhEYXRhW251bVBhcmFtU2V0cyAtIDFdW2JhbmRdIC0gZGVmYXVsdFZhbHVlKSArCisgICAgICAgICAgICBkZWZhdWx0VmFsdWU7CisgICAgICB9CisgICAgICBkYXRhTW9kZSA9IDE7IC8qIGtlZXAgKi8KKyAgICAgIGFwcGxpZWRQcm9jZXNzaW5nID0gMTsKKyAgICB9IGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIEZES19BU1NFUlQoMCk7IC8qIEFsbCB2YWxpZCBzdGF0ZXMgc2hhbGwgYmUgaGFuZGxlZCBhYm92ZS4gKi8KKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKGRhdGFNb2RlID49IDApIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUGFyYW1TZXRzOyBpICs9IDEpIHsKKyAgICAgIGJzWFhYRGF0YU1vZGVbaV0gPSBkYXRhTW9kZTsKKyAgICAgIGlmIChkaWZmSWR4RGF0YSAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoYmFuZCA9IHN0YXJ0QmFuZDsgYmFuZCA8IHN0b3BCYW5kOyBiYW5kICs9IDEpIHsKKyAgICAgICAgICBkaWZmSWR4RGF0YVtpXVtiYW5kXSA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gYXBwbGllZFByb2Nlc3Npbmc7Cit9CisKK3ZvaWQgU3BhdGlhbERlY0NvbmNlYWxtZW50X1VwZGF0ZVN0YXRlKFNwYXRpYWxEZWNDb25jZWFsbWVudEluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZnJhbWVPaykgeworICBGREtfQVNTRVJUKGluZm8gIT0gTlVMTCk7CisKKyAgaWYgKGZyYW1lT2spIHsKKyAgICBpbmZvLT5jbnRWYWxpZEZyYW1lcyArPSAxOworICB9IGVsc2UgeworICAgIGluZm8tPmNudFZhbGlkRnJhbWVzID0gMDsKKyAgfQorCisgIHN3aXRjaCAoaW5mby0+Y29uY2VhbFN0YXRlKSB7CisgICAgY2FzZSBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX0luaXQ6CisgICAgICBpZiAoZnJhbWVPaykgeworICAgICAgICAvKiBORVhUIFNUQVRFOiBPayAqLworICAgICAgICBpbmZvLT5jb25jZWFsU3RhdGUgPSBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX09rOworICAgICAgICBpbmZvLT5jbnRTdGF0ZUZyYW1lcyA9IDA7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9PazoKKyAgICAgIGlmICghZnJhbWVPaykgeworICAgICAgICAvKiBORVhUIFNUQVRFOiBLZWVwICovCisgICAgICAgIGluZm8tPmNvbmNlYWxTdGF0ZSA9IFNwYXRpYWxEZWNDb25jZWFsU3RhdGVfS2VlcDsKKyAgICAgICAgaW5mby0+Y250U3RhdGVGcmFtZXMgPSAwOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNwYXRpYWxEZWNDb25jZWFsU3RhdGVfS2VlcDoKKyAgICAgIGluZm8tPmNudFN0YXRlRnJhbWVzICs9IDE7CisgICAgICBpZiAoZnJhbWVPaykgeworICAgICAgICAvKiBORVhUIFNUQVRFOiBPayAqLworICAgICAgICBpbmZvLT5jb25jZWFsU3RhdGUgPSBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX09rOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGluZm8tPmNudFN0YXRlRnJhbWVzID49IGluZm8tPmNvbmNlYWxQYXJhbXMubnVtS2VlcEZyYW1lcykgeworICAgICAgICAgIGlmIChpbmZvLT5jb25jZWFsUGFyYW1zLm51bUZhZGVPdXRGcmFtZXMgPT0gMCkgeworICAgICAgICAgICAgLyogTkVYVCBTVEFURTogRGVmYXVsdCAqLworICAgICAgICAgICAgaW5mby0+Y29uY2VhbFN0YXRlID0gU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9EZWZhdWx0OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBORVhUIFNUQVRFOiBGYWRlIHRvIGRlZmF1bHQgKi8KKyAgICAgICAgICAgIGluZm8tPmNvbmNlYWxTdGF0ZSA9IFNwYXRpYWxEZWNDb25jZWFsU3RhdGVfRmFkZVRvRGVmYXVsdDsKKyAgICAgICAgICAgIGluZm8tPmNudFN0YXRlRnJhbWVzID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX0ZhZGVUb0RlZmF1bHQ6CisgICAgICBpbmZvLT5jbnRTdGF0ZUZyYW1lcyArPSAxOworICAgICAgaWYgKGluZm8tPmNudFZhbGlkRnJhbWVzID4gMCkgeworICAgICAgICAvKiBORVhUIFNUQVRFOiBGYWRlIGluIGZyb20gZGVmYXVsdCAqLworICAgICAgICBpbmZvLT5jb25jZWFsU3RhdGUgPSBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX0ZhZGVGcm9tRGVmYXVsdDsKKyAgICAgICAgaW5mby0+Y250U3RhdGVGcmFtZXMgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGluZm8tPmNudFN0YXRlRnJhbWVzID49IGluZm8tPmNvbmNlYWxQYXJhbXMubnVtRmFkZU91dEZyYW1lcykgeworICAgICAgICAgIC8qIE5FWFQgU1RBVEU6IERlZmF1bHQgKi8KKyAgICAgICAgICBpbmZvLT5jb25jZWFsU3RhdGUgPSBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX0RlZmF1bHQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX0RlZmF1bHQ6CisgICAgICBpZiAoaW5mby0+Y250VmFsaWRGcmFtZXMgPiAwKSB7CisgICAgICAgIGlmIChpbmZvLT5jb25jZWFsUGFyYW1zLm51bUZhZGVJbkZyYW1lcyA9PSAwKSB7CisgICAgICAgICAgLyogTkVYVCBTVEFURTogT2sgKi8KKyAgICAgICAgICBpbmZvLT5jb25jZWFsU3RhdGUgPSBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX09rOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIE5FWFQgU1RBVEU6IEZhZGUgaW4gZnJvbSBkZWZhdWx0ICovCisgICAgICAgICAgaW5mby0+Y29uY2VhbFN0YXRlID0gU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9GYWRlRnJvbURlZmF1bHQ7CisgICAgICAgICAgaW5mby0+Y250VmFsaWRGcmFtZXMgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9GYWRlRnJvbURlZmF1bHQ6CisgICAgICBpbmZvLT5jbnRWYWxpZEZyYW1lcyArPSAxOworICAgICAgaWYgKGZyYW1lT2spIHsKKyAgICAgICAgaWYgKGluZm8tPmNudFZhbGlkRnJhbWVzID49IGluZm8tPmNvbmNlYWxQYXJhbXMubnVtRmFkZUluRnJhbWVzKSB7CisgICAgICAgICAgLyogTkVYVCBTVEFURTogT2sgKi8KKyAgICAgICAgICBpbmZvLT5jb25jZWFsU3RhdGUgPSBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX09rOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBORVhUIFNUQVRFOiBGYWRlIHRvIGRlZmF1bHQgKi8KKyAgICAgICAgaW5mby0+Y29uY2VhbFN0YXRlID0gU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9GYWRlVG9EZWZhdWx0OworICAgICAgICBpbmZvLT5jbnRTdGF0ZUZyYW1lcyA9IDA7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBGREtfQVNTRVJUKDApOyAvKiBBbGwgdmFsaWQgc3RhdGVzIHNob3VsZCBiZSBoYW5kbGVkIGFib3ZlISAqLworICAgICAgYnJlYWs7CisgIH0KK30KKworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNDb25jZWFsbWVudF9TZXRQYXJhbShTcGF0aWFsRGVjQ29uY2VhbG1lbnRJbmZvICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQUNfREVDX0NPTkNFQUxfUEFSQU0gcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB2YWx1ZSkgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworCisgIHN3aXRjaCAocGFyYW0pIHsKKyAgICBjYXNlIFNBQ19ERUNfQ09OQ0VBTF9NRVRIT0Q6CisgICAgICBzd2l0Y2ggKChTcGF0aWFsRGVjQ29uY2VhbG1lbnRNZXRob2QpdmFsdWUpIHsKKyAgICAgICAgY2FzZSBTQUNfREVDX0NPTkNFQUxfV0lUSF9aRVJPX1ZBTFVFRF9PVVRQVVQ6CisgICAgICAgIGNhc2UgU0FDX0RFQ19DT05DRUFMX0JZX0ZBRElOR19QQVJBTUVURVJTOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGVyciA9IE1QU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIC8qIHN0b3JlIHBhcmFtZXRlciB2YWx1ZSAqLworICAgICAgICBzZWxmLT5jb25jZWFsUGFyYW1zLm1ldGhvZCA9IChTcGF0aWFsRGVjQ29uY2VhbG1lbnRNZXRob2QpdmFsdWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBlcnIgPSBNUFNfSU5WQUxJRF9IQU5ETEU7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0FDX0RFQ19DT05DRUFMX05VTV9LRUVQX0ZSQU1FUzoKKyAgICAgIGlmICh2YWx1ZSA8IDApIHsKKyAgICAgICAgZXJyID0gTVBTX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIC8qIHN0b3JlIHBhcmFtZXRlciB2YWx1ZSAqLworICAgICAgICBzZWxmLT5jb25jZWFsUGFyYW1zLm51bUtlZXBGcmFtZXMgPSAoVUlOVCl2YWx1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IE1QU19JTlZBTElEX0hBTkRMRTsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBTQUNfREVDX0NPTkNFQUxfRkFERV9PVVRfU0xPUEVfTEVOR1RIOgorICAgICAgaWYgKHZhbHVlIDwgMCkgeworICAgICAgICBlcnIgPSBNUFNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICAgICAgLyogc3RvcmUgcGFyYW1ldGVyIHZhbHVlICovCisgICAgICAgIHNlbGYtPmNvbmNlYWxQYXJhbXMubnVtRmFkZU91dEZyYW1lcyA9IChVSU5UKXZhbHVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gTVBTX0lOVkFMSURfSEFORExFOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFNBQ19ERUNfQ09OQ0VBTF9GQURFX0lOX1NMT1BFX0xFTkdUSDoKKyAgICAgIGlmICh2YWx1ZSA8IDApIHsKKyAgICAgICAgZXJyID0gTVBTX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIC8qIHN0b3JlIHBhcmFtZXRlciB2YWx1ZSAqLworICAgICAgICBzZWxmLT5jb25jZWFsUGFyYW1zLm51bUZhZGVJbkZyYW1lcyA9IChVSU5UKXZhbHVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gTVBTX0lOVkFMSURfSEFORExFOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFNBQ19ERUNfQ09OQ0VBTF9OVU1fUkVMRUFTRV9GUkFNRVM6CisgICAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgIGVyciA9IE1QU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICAvKiBzdG9yZSBwYXJhbWV0ZXIgdmFsdWUgKi8KKyAgICAgICAgc2VsZi0+Y29uY2VhbFBhcmFtcy5udW1SZWxlYXNlRnJhbWVzID0gKFVJTlQpdmFsdWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBlcnIgPSBNUFNfSU5WQUxJRF9IQU5ETEU7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBlcnIgPSBNUFNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICBnb3RvIGJhaWw7CisgIH0KKworYmFpbDoKKyAgcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2xpYlNBQ2RlYy9zcmMvc2FjX2RlY19jb25jZWFsLmggYi9saWJTQUNkZWMvc3JjL3NhY19kZWNfY29uY2VhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZjUyNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY19kZWNfY29uY2VhbC5oCkBAIC0wLDAgKzEsMTg3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBDaHJpc3RpYW4gRXJ0ZWwsIENocmlzdGlhbiBHcmllYmVsCisKKyAgIERlc2NyaXB0aW9uOiBTQUMgRGVjIGVycm9yIGNvbmNlYWxtZW50CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0FDX0RFQ19DT05DRUFMX0gKKyNkZWZpbmUgU0FDX0RFQ19DT05DRUFMX0gKKworI2luY2x1ZGUgInNhY19kZWNfaW50ZXJmYWNlLmgiCisKKy8qIE1vZHVsZXMgZHluYW1pYyBwYXJhbWV0ZXJzOiAqLwordHlwZWRlZiBlbnVtIHsKKyAgU0FDX0RFQ19DT05DRUFMX01FVEhPRCA9IDAsCisgIFNBQ19ERUNfQ09OQ0VBTF9OVU1fS0VFUF9GUkFNRVMsCisgIFNBQ19ERUNfQ09OQ0VBTF9GQURFX09VVF9TTE9QRV9MRU5HVEgsCisgIFNBQ19ERUNfQ09OQ0VBTF9GQURFX0lOX1NMT1BFX0xFTkdUSCwKKyAgU0FDX0RFQ19DT05DRUFMX05VTV9SRUxFQVNFX0ZSQU1FUworCit9IFNBQ19ERUNfQ09OQ0VBTF9QQVJBTTsKKworLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisvKiBzYWNfZGVjX2ludGVyZmFjZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwordHlwZWRlZiBlbnVtIHsKKyAgU0FDX0RFQ19DT05DRUFMX1dJVEhfWkVST19WQUxVRURfT1VUUFVUID0gMCwKKyAgU0FDX0RFQ19DT05DRUFMX0JZX0ZBRElOR19QQVJBTUVURVJTID0gMQorCit9IFNwYXRpYWxEZWNDb25jZWFsbWVudE1ldGhvZDsKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisvKiBEZWZhdWx0IGR5bmFtaWMgcGFyYW1ldGVyIHZhbHVlczogKi8KKyNkZWZpbmUgTVBFR1NfQ09OQ0VBTF9ERUZBVUxUX01FVEhPRCBTQUNfREVDX0NPTkNFQUxfQllfRkFESU5HX1BBUkFNRVRFUlMKKyNkZWZpbmUgTVBFR1NfQ09OQ0VBTF9ERUZBVUxUX05VTV9LRUVQX0ZSQU1FUyAoMTApCisjZGVmaW5lIE1QRUdTX0NPTkNFQUxfREVGQVVMVF9GQURFX09VVF9TTE9QRV9MRU5HVEggKDUpCisjZGVmaW5lIE1QRUdTX0NPTkNFQUxfREVGQVVMVF9GQURFX0lOX1NMT1BFX0xFTkdUSCAoNSkKKyNkZWZpbmUgTVBFR1NfQ09OQ0VBTF9ERUZBVUxUX05VTV9SRUxFQVNFX0ZSQU1FUyAoMykKKwordHlwZWRlZiBlbnVtIHsKKyAgU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9Jbml0ID0gMCwKKyAgU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9PaywKKyAgU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9LZWVwLAorICBTcGF0aWFsRGVjQ29uY2VhbFN0YXRlX0ZhZGVUb0RlZmF1bHQsCisgIFNwYXRpYWxEZWNDb25jZWFsU3RhdGVfRGVmYXVsdCwKKyAgU3BhdGlhbERlY0NvbmNlYWxTdGF0ZV9GYWRlRnJvbURlZmF1bHQKKworfSBTcGF0aWFsRGVjQ29uY2VhbG1lbnRTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBTcGF0aWFsRGVjQ29uY2VhbG1lbnRNZXRob2QgbWV0aG9kOworCisgIFVJTlQgbnVtS2VlcEZyYW1lczsKKyAgVUlOVCBudW1GYWRlT3V0RnJhbWVzOworICBVSU5UIG51bUZhZGVJbkZyYW1lczsKKyAgVUlOVCBudW1SZWxlYXNlRnJhbWVzOworCit9IFNwYXRpYWxEZWNDb25jZWFsbWVudFBhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBTcGF0aWFsRGVjQ29uY2VhbG1lbnRQYXJhbXMgY29uY2VhbFBhcmFtczsgLyogVXNlciBzZXQgcGFyYW1zICovCisgIFNwYXRpYWxEZWNDb25jZWFsbWVudFN0YXRlCisgICAgICBjb25jZWFsU3RhdGU7IC8qIFN0YXRlIG9mIGludGVybmFsIHN0YXRlIG1hY2hpbmUgKGZhZGUtaW4vb3V0IGV0YykgKi8KKworICBVSU5UIGNudFN0YXRlRnJhbWVzOyAvKiBDb3VudGVyIGZvciBmYWRlLWluL291dCBoYW5kbGluZyAqLworICBVSU5UIGNudFZhbGlkRnJhbWVzOyAvKiBDb3VudGVyIGZvciB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGdvb2QgZnJhbWVzKi8KKworfSBTcGF0aWFsRGVjQ29uY2VhbG1lbnRJbmZvOworCisvKiBNb2R1bGUgcmVzZXQgZmxhZ3MgKi8KKyNkZWZpbmUgTVBFR1NfQ09OQ0VBTF9SRVNFVF9TVEFURSAoMHgwMSkKKyNkZWZpbmUgTVBFR1NfQ09OQ0VBTF9SRVNFVF9QQVJBTUVURVIgKDB4MDIpCisjZGVmaW5lIE1QRUdTX0NPTkNFQUxfUkVTRVRfQUxMICgweEZGKQorCit2b2lkIFNwYXRpYWxEZWNDb25jZWFsbWVudF9Jbml0KFNwYXRpYWxEZWNDb25jZWFsbWVudEluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgcmVzZXRGbGFncyk7CisKK2ludCBTcGF0aWFsRGVjQ29uY2VhbG1lbnRfQXBwbHkoU3BhdGlhbERlY0NvbmNlYWxtZW50SW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NIQVIgKCpjbXBJZHhEYXRhKVtNQVhfUEFSQU1FVEVSX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgKipkaWZmSWR4RGF0YSwgU0NIQVIgKmlkeFByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICpic1hYWERhdGFNb2RlLCBjb25zdCBpbnQgc3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3RvcEJhbmQsIGNvbnN0IFNDSEFSIGRlZmF1bHRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHBhcmFtVHlwZSwgY29uc3QgaW50IG51bVBhcmFtU2V0cyk7CisKK3ZvaWQgU3BhdGlhbERlY0NvbmNlYWxtZW50X1VwZGF0ZVN0YXRlKFNwYXRpYWxEZWNDb25jZWFsbWVudEluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZnJhbWVPayk7CisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQ29uY2VhbG1lbnRfU2V0UGFyYW0oU3BhdGlhbERlY0NvbmNlYWxtZW50SW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0FDX0RFQ19DT05DRUFMX1BBUkFNIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgdmFsdWUpOworCisjZW5kaWYgLyogU0FDX0RFQ19DT05DRUFMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2RlYy9zcmMvc2FjX2RlY19pbnRlcmZhY2UuaCBiL2xpYlNBQ2RlYy9zcmMvc2FjX2RlY19pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmVlYTkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZGVjL3NyYy9zYWNfZGVjX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsMzM1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IFNBQyBEZWNvZGVyIExpYnJhcnkgSW50ZXJmYWNlCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0FDX0RFQ19JTlRFUkZBQ0VfSAorI2RlZmluZSBTQUNfREVDX0lOVEVSRkFDRV9ICisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgInNhY19kZWNfZXJyb3Jjb2Rlcy5oIgorI2luY2x1ZGUgInNhY19kZWNfc3NjX3N0cnVjdC5oIgorCisvKioKKyAqIFxicmllZiAgQmFzZWxpbmUgTVBFRy1TdXJyb3VuZCBwcm9maWxlIExldmVsIDEtNS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgREVDT0RFUl9MRVZFTF8wID0gMCwgLyohPCBMZXZlbCAwOiBkdW1teSBsZXZlbDsgMjEyIG9ubHkgKi8KKyAgREVDT0RFUl9MRVZFTF82ID0gNiAgLyohPCBMZXZlbCA2OiBubyBzdXBwb3J0ICovCit9IENGR19MRVZFTDsKKworLyoKKyAqIFxicmllZiAgTnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyByZXN0cmljdGlvbi4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgT1VUUFVUX0NIQU5ORUxTX0RFRkFVTFQsIC8qITwgRGVmYXVsdCBjb25maWd1cmF0aW9uIGRlcGVuZGluZyBvbiBEZWNvZGVyIExldmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgT1VUUFVUX0NIQU5ORUxTXzJfMCwgICAgIC8qITwgTGltaXRhdGlvbiB0byBzdGVyZW8gb3V0cHV0ICovCisgIE9VVFBVVF9DSEFOTkVMU181XzEgICAgICAvKiE8IExpbWl0YXRpb24gdG8gNS4xIG91dHB1dCAqLworfSBDRkdfUkVTVFJJQ1RJT047CisKKy8qCisgKiBcYnJpZWYgIFN1cHBvcnRlZCBkZWNvZGVyIG1vZGUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEVYVF9IUV9PTkxZID0gMCwgIC8qITwgSGlnaCBRdWFsaXR5IHByb2Nlc3Npbmcgb25seSAqLworICBFWFRfTFBfT05MWSA9IDEsICAvKiE8IExvdyBQb3dlciBwcm9jZXNpbmcgb25seSAqLworICBFWFRfSFFfQU5EX0xQID0gMiAvKiE8IFN1cHBvcnQgYm90aCBIUSBhbmQgTFAgcHJvY2Vzc2luZyAqLworfSBDRkdfRVhURU5UOworCisvKgorICogXGJyaWVmICBTdXBwb3J0ZWQgYmluYXVyYWwgbW9kZS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgQklOQVVSQUxfTk9ORSA9IC0xIC8qITwgTm8gYmluYXVyYWwgcHJvY2VzaW5nIHN1cHBvcnRlZCAqLworfSBDRkdfQklOQVVSQUw7CisKKy8qKgorICogXGJyaWVmICBEZWNvZGVyIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlLgorICoKKyAqIFRoZXNlIHN0cnVjdHVyZSBjb250YWlucyBhbGwgcGFyYW1ldGVycyBuZWNlc3NhcnkgZm9yIGRlY29kZXIgb3BlbiBmdW5jdGlvbi4KKyAqIFRoZSBjb25maWd1cmF0aW9uIHNwZWNpZmllcyB0aGUgZnVuY3Rpb25hbCByYW5nZSBvZiB0aGUgZGVjb2RlciBpbnN0YW5jZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBDRkdfTEVWRUwgZGVjb2RlckxldmVsOworICBDRkdfRVhURU5UIGRlY29kZXJNb2RlOworICBDRkdfUkVTVFJJQ1RJT04gbWF4TnVtT3V0cHV0Q2hhbm5lbHM7CisgIENGR19CSU5BVVJBTCBiaW5hdXJhbE1vZGU7CisKK30gU1BBVElBTF9ERUNfQ09ORklHOworCit0eXBlZGVmIGVudW0geworICBJTlBVVE1PREVfUU1GID0gMTAwMCwKKyAgSU5QVVRNT0RFX1FNRl9TQlIgPSAxMDAxLAorICBJTlBVVE1PREVfVElNRSA9IDEwMDIKK30gU1BBVElBTERFQ19JTlBVVF9NT0RFOworCisvKioKKyAqIFxicmllZiAgTVBFRyBTdXJyb3VuZCB1cG1peCB0eXBlIG1vZGUuCisgKiovCit0eXBlZGVmIGVudW0geworICBVUE1JWF9UWVBFX0JZUEFTUyA9CisgICAgICAtMSwgLyohPCBCeXBhc3MgdGhlIGRvd25taXggY2hhbm5lbHMgZnJvbSB0aGUgY29yZSBkZWNvZGVyLiAgICAqLworICBVUE1JWF9UWVBFX05PUk1BTCA9IDAgLyohPCBNdWx0aSBjaGFubmVsIG91dHB1dC4gKi8KKworfSBTUEFUSUFMX0RFQ19VUE1JWF9UWVBFOworCisvKioKKyAqIFxicmllZiAgRHluYW1pYyBkZWNvZGVyIHBhcmFtZXRlcnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogQmFzaWNzICovCisgIFVDSEFSIG91dHB1dE1vZGU7CisgIFVDSEFSIGJsaW5kRW5hYmxlOworICBVQ0hBUiBieXBhc3NNb2RlOworCisgIC8qIEVycm9yIGNvbmNlYWxtZW50ICovCisgIFVDSEFSIGNvbmNlYWxNZXRob2Q7CisgIFVJTlQgY29uY2VhbE51bUtlZXBGcmFtZXM7CisgIFVJTlQgY29uY2VhbEZhZGVPdXRTbG9wZUxlbmd0aDsKKyAgVUlOVCBjb25jZWFsRmFkZUluU2xvcGVMZW5ndGg7CisgIFVJTlQgY29uY2VhbE51bVJlbGVhc2VGcmFtZXM7CisKK30gU1BBVElBTERFQ19QQVJBTTsKKworLyoqCisgKiBcYnJpZWYgRmxhZ3Mgd2hpY2ggY29udHJvbCB0aGUgaW5pdGlhbGl6YXRpb24KKyAqKi8KK3R5cGVkZWYgZW51bSB7CisgIE1QRUdTX0lOSVRfTk9ORSA9IDB4MDAwMDAwMDAsIC8qITwgSW5kaWNhdGVzIG5vIGluaXRpYWxpemF0aW9uICovCisKKyAgTVBFR1NfSU5JVF9DT05GSUcgPSAweDAwMDAwMDEwLCAvKiE8IEluZGljYXRlcyBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGR1ZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTQyB2YWx1ZSBjaGFuZ2VzICovCisKKyAgTVBFR1NfSU5JVF9TVEFURVNfQU5BX1FNRl9GSUxURVIgPQorICAgICAgMHgwMDAwMDEwMCwgLyohPCBDb250cm9scyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGFuYWx5c2lzIHFtZiBmaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRlcyAqLworICBNUEVHU19JTklUX1NUQVRFU19TWU5fUU1GX0ZJTFRFUiA9CisgICAgICAweDAwMDAwMjAwLCAvKiE8IENvbnRyb2xzIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgc3ludGhlc2lzIHFtZiBmaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRlcyAqLworICBNUEVHU19JTklUX1NUQVRFU19BTkFfSFlCX0ZJTFRFUiA9IDB4MDAwMDA0MDAsIC8qITwgQ29udHJvbHMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHlzaXMgaHlicmlkIGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlcyAqLworICBNUEVHU19JTklUX1NUQVRFU19ERUNPUlJFTEFUT1IgPQorICAgICAgMHgwMDAwMDgwMCwgLyohPCBDb250cm9scyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGRlY29ycmVsYXRvciBzdGF0ZXMgKi8KKyAgTVBFR1NfSU5JVF9TVEFURVNfTTFNMiA9IDB4MDAwMDIwMDAsIC8qITwgQ29udHJvbHMgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9yeSBpbiBtMSBhbmQgbTIgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGlvbiAqLworICBNUEVHU19JTklUX1NUQVRFU19HRVMgPSAweDAwMDA0MDAwLCAgLyohPCBDb250cm9scyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0b3J5IGluIHRoZSBnZXMgY2FsY3VsYXRpb24gKi8KKyAgTVBFR1NfSU5JVF9TVEFURVNfUkVWRVJCID0KKyAgICAgIDB4MDAwMDgwMDAsIC8qITwgQ29udHJvbHMgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSByZXZlcmIgc3RhdGVzICovCisgIE1QRUdTX0lOSVRfU1RBVEVTX1BBUkFNID0KKyAgICAgIDB4MDAwMjAwMDAsIC8qITwgQ29udHJvbHMgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBoaXN0b3J5IG9mIGFsbCBvdGhlcgorICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyICovCisgIE1QRUdTX0lOSVRfU1RBVEVTX0VSUk9SX0NPTkNFQUxNRU5UID0KKyAgICAgIDB4MDAwODAwMDAsIC8qITwgQ29udHJvbHMgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBlcnJvciBjb25jZWFsbWVudAorICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIHN0YXRlICovCisgIE1QRUdTX0lOSVRfUEFSQU1TX0VSUk9SX0NPTkNFQUxNRU5UID0gMHgwMDIwMDAwMCAvKiE8IENvbnRyb2xzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aG9sZSBlcnJvciBjb25jZWFsbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHNldCAqLworCit9IE1QRUdTX0lOSVRfQ1RSTF9GTEFHUzsKKworI2RlZmluZSBNQVNLX01QRUdTX0lOSVRfQUxMX1NUQVRFUyAoMHgwMDBGRkYwMCkKKyNkZWZpbmUgTUFTS19NUEVHU19JTklUX0FMTF9QQVJBTVMgKDB4MDBGMDAwMDApCisKK3R5cGVkZWYgc3RydWN0IHNwYXRpYWxEZWNfc3RydWN0IHNwYXRpYWxEZWMsICpIQU5ETEVfU1BBVElBTF9ERUM7CisKK3R5cGVkZWYgc3RydWN0IFNQQVRJQUxfQlNfRlJBTUVfc3RydWN0IFNQQVRJQUxfQlNfRlJBTUU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUlOVCBzaXplUGVyc2lzdGVudDsgICAgIC8qIHBlcnNpc3RlbnQgbWVtb3J5ICovCisgIFVJTlQgc2l6ZUZhc3RQZXJzaXN0ZW50OyAvKiBmYXN0IHBlcnNpc3RlbnQgbWVtb3J5ICovCisKK30gTUVNX1JFUVVJUkVNRU5UUzsKKworI2RlZmluZSBQQ01fTVBTIElOVF9QQ00KKyNkZWZpbmUgUENNX01QU0YgRklYUF9QQ00KKworI2RlZmluZSBGSVhQX0RCTDJQQ01fTVBTKHgpICgoSU5UX1BDTSlGWF9EQkwyRlhfUENNKHgpKQorCisvKiBleHBvc2VkIGZ1bmN0aW9ucyAobGlicmFyeSBpbnRlcmZhY2UpICovCisKK2ludCBGREtfU3BhdGlhbERlY0NvbXBhcmVTcGF0aWFsU3BlY2lmaWNDb25maWdIZWFkZXIoCisgICAgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnBTc2MxLCBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqcFNzYzIpOworCitpbnQgRkRLX1NwYXRpYWxEZWNJbml0RGVmYXVsdFNwYXRpYWxTcGVjaWZpY0NvbmZpZygKKyAgICBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqcFNwYXRpYWxTcGVjaWZpY0NvbmZpZywKKyAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsIGludCBjb3JlQ2hhbm5lbHMsIGludCBzYW1wbGluZ0ZyZXEsCisgICAgaW50IG5UaW1lU2xvdHMsIGludCBkZWNvZGVyTGV2ZWwsIGludCBpc0JsaW5kKTsKKworc3BhdGlhbERlYyAqRkRLX1NwYXRpYWxEZWNPcGVuKGNvbnN0IFNQQVRJQUxfREVDX0NPTkZJRyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVyZW9Db25maWdJbmRleCk7CisKKy8qKgorICogXGJyaWVmIEluaXRpYWxpemUgc3RhdGUgdmFyaWFibGVzIG9mIHRoZSBNUFMgcGFyc2VyCisgKi8KK3ZvaWQgU3BhdGlhbERlY0luaXRQYXJzZXJDb250ZXh0KHNwYXRpYWxEZWMgKnNlbGYpOworCisvKioKKyAqIFxicmllZiBJbml0aWFsaXplIHN0YXRlIG9mIE1QUyBkZWNvZGVyLiBUaGlzIG1heSBoYXBwZW4gYWZ0ZXIgdGhlIGZpcnN0IHBhcnNlCisgKiBvcGVyYXRpb24uCisgKi8KK1NBQ0RFQ19FUlJPUiBGREtfU3BhdGlhbERlY0luaXQoc3BhdGlhbERlYyAqc2VsZiwgU1BBVElBTF9CU19GUkFNRSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3BhdGlhbFNwZWNpZmljQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblFtZkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEFUSUFMX0RFQ19VUE1JWF9UWVBFIGNvbnN0IHVwbWl4VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BBVElBTERFQ19QQVJBTSAqcFVzZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgaW5pdEZsYWdzIC8qIE1QRUdTX0lOSVRfQ1RSTF9GTEFHUyAqLworKTsKKworLyoqCisgKiBcYnJpZWYgQXBwbHkgZGVjb2RlZCBNUEVHIFN1cnJvdW5kIHBhcmFtZXRlcnMgdG8gdGltZSBkb21haW4gb3IgUU1GIGRvd24gbWl4CisgKiBkYXRhLgorICogXHBhcmFtIHNlbGYgc3BhdGlhbCBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBpbkRhdGEgUG9pbnRlciB0byB0aW1lIGRvbWFpbiBpbnB1dCBkb3duIG1peCBkYXRhIGlmIGFueS4KKyAqIFxwYXJhbSBxbWZJbkRhdGFSZWFsIFBvaW50ZXIgYXJyYXkgb2YgUU1GIGRvbWFpbiBkb3duIG1peCBpbnB1dCBkYXRhIChyZWFsCisgKiBwYXJ0KS4KKyAqIFxwYXJhbSBxbWZJbkRhdGFJbWFnIFBvaW50ZXIgYXJyYXkgb2YgUU1GIGRvbWFpbiBkb3duIG1peCBpbnB1dCBkYXRhCisgKiAoaW1hZ2luYXJ5IHBhcnQpLgorICogXHBhcmFtIHBjbU91dEJ1ZiBQb2ludGVyIHRvIGEgdGltZSBkb21haW4gYnVmZmVyIHdlcmUgdGhlIHVwbWl4ZWQgb3V0cHV0IGRhdGEKKyAqIHdpbGwgYmUgc3RvcmVkIGludG8uCisgKiBccGFyYW0gblNhbXBsZXMgQW1vdW50IG9mIGF1ZGlvIHNhbXBsZXMgcGVyIGNoYW5uZWwgb2YgZG93biBtaXggaW5wdXQgZGF0YQorICogKGZyYW1lIGxlbmd0aCkuCisgKiBccGFyYW0gcENvbnRyb2xGbGFncyBwb2ludGVyIHRvIGNvbnRyb2wgZmxhZ3MgZmllbGQ7IGlucHV0L291dHB1dC4KKyAqIFxwYXJhbSBudW1JbnB1dENoYW5uZWxzIGFtb3VudCBvZiBkb3duIG1peCBpbnB1dCBjaGFubmVscy4gTWlnaHQgbm90IG1hdGNoCisgKiB0aGUgY3VycmVudCB0cmVlIGNvbmZpZywgdXNlZnVsIGZvciBpbnRlcm5hbCBzYW5pdHkgY2hlY2tzIGFuZCBieXBhc3MgbW9kZS4KKyAqIFxwYXJhbSBjaGFubmVsTWFwcGluZyBhcnJheSBjb250YWluaW5nIHRoZSBkZXNpcmVkIG91dHB1dCBjaGFubmVsIG9yZGVyaW5nIHRvCisgKiB0cmFuc2Zvcm0gTVBFRyBQQ0Ugc3R5bGUgb3JkZXJpbmcgdG8gYW55IG90aGVyIGNoYW5uZWwgb3JkZXJpbmcuIEZpcnN0CisgKiBkaW1lbnNpb24gaXMgdGhlIHRvdGFsIGNoYW5uZWwgY291bnQuCisgKi8KK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQXBwbHlGcmFtZSgKKyAgICBzcGF0aWFsRGVjICpzZWxmLCBTUEFUSUFMX0JTX0ZSQU1FICpmcmFtZSwgU1BBVElBTERFQ19JTlBVVF9NT0RFIGlucHV0TW9kZSwKKyAgICBQQ01fTVBTICppbkRhdGEsICAgICAgICAgIC8qIFRpbWUgZG9tYWluIGlucHV0ICAqLworICAgIEZJWFBfREJMICoqcW1mSW5EYXRhUmVhbCwgLyogaW50ZXJsZWF2ZWQgbC9yICovCisgICAgRklYUF9EQkwgKipxbWZJbkRhdGFJbWFnLCAvKiBpbnRlcmxlYXZlZCBsL3IgKi8KKyAgICBQQ01fTVBTICpwY21PdXRCdWYsIC8qIE1BWF9PVVRQVVRfQ0hBTk5FTFMqTUFYX1RJTUVfU0xPVFMqTlVNX1FNRl9CQU5EU10gKi8KKyAgICBVSU5UIG5TYW1wbGVzLCBVSU5UICpwQ29udHJvbEZsYWdzLCBpbnQgbnVtSW5wdXRDaGFubmVscywKKyAgICBjb25zdCBGREtfY2hhbm5lbE1hcERlc2NyICpjb25zdCBtYXBEZXNjcik7CisKKy8qKgorICogXGJyaWVmIEZpbGwgZ2l2ZW4gYXJyYXlzIHdpdGggYXVkaW8gY2hhbm5lbCB0eXBlcyBhbmQgaW5kaWNlcy4KKyAqIFxwYXJhbSBzZWxmIHNwYXRpYWwgZGVjb2RlciBoYW5kbGUuCisgKiBccGFyYW0gY2hhbm5lbFR5cGUgYXJyYXkgd2hlcmUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGVzIGZyIGVhY2ggb3V0cHV0CisgKiBjaGFubmVscyBhcmUgc3RvcmVkIGludG8uCisgKiBccGFyYW0gY2hhbm5lbEluZGljZXMgYXJyYXkgd2hlcmUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgaW5kaWNlcyBmciBlYWNoCisgKiBvdXRwdXQgY2hhbm5lbHMgYXJlIHN0b3JlZCBpbnRvLgorICovCit2b2lkIFNwYXRpYWxEZWNDaGFubmVsUHJvcGVydGllcyhzcGF0aWFsRGVjICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGNoYW5uZWxUeXBlW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBjaGFubmVsSW5kaWNlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkRLX2NoYW5uZWxNYXBEZXNjciAqY29uc3QgbWFwRGVzY3IpOworCit2b2lkIEZES19TcGF0aWFsRGVjQ2xvc2Uoc3BhdGlhbERlYyAqc2VsZik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTQUNfREVDX0lOVEVSRkFDRV9IICovCmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19kZWNfbGliLmNwcCBiL2xpYlNBQ2RlYy9zcmMvc2FjX2RlY19saWIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZjliZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY19kZWNfbGliLmNwcApAQCAtMCwwICsxLDE5MTkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogU0FDIERlY29kZXIgTGlicmFyeSBJbnRlcmZhY2UKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInNhY19kZWNfbGliLmgiCisjaW5jbHVkZSAic2FjX2RlY19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJzYWNfZGVjLmgiCisjaW5jbHVkZSAic2FjX2JpdGRlYy5oIgorI2luY2x1ZGUgIkZES19tYXRyaXhDYWxsb2MuaCIKKworI2RlZmluZSBNUFNfREFUQV9CVUZGRVJfU0laRSAoMjA0OCkKKworLyoqCisgKiBcYnJpZWYgTVBFRyBTdXJyb3VuZCBkYXRhIGluZGljYXRpb24uCisgKiovCit0eXBlZGVmIGVudW0geworICBNUEVHU19BTkNUWVBFX0ZSQU1FID0gMCwgLyohPCBNUEVHIFN1cnJvdW5kIGZyYW1lLCBzZWUgSVNPL0lFQyAyMzAwMy0xICovCisgIE1QRUdTX0FOQ1RZUEVfSEVBREVSX0FORF9GUkFNRSA9IDEsIC8qITwgTVBFRyBTdXJyb3VuZCBoZWFkZXIgYW5kIE1QRUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vycm91bmQgZnJhbWUsIHNlZSBJU08vSUVDIDIzMDAzLTEgKi8KKyAgTVBFR1NfQU5DVFlQRV9SRVNFUlZFRF8xID0gMiwgICAgICAgLyohPCByZXNlcnZlZCwgc2VlIElTTy9JRUMgMjMwMDMtMSAqLworICBNUEVHU19BTkNUWVBFX1JFU0VSVkVEXzIgPSAzICAgICAgICAvKiE8IHJlc2VydmVkLCBzZWUgSVNPL0lFQyAyMzAwMy0xKi8KK30gTVBFR1NfQU5DVFlQRTsKKworLyoqCisgKiBcYnJpZWYgTVBFRyBTdXJyb3VuZCBkYXRhIHNlZ21lbnQgaW5kaWNhdGlvbi4KKyAqKi8KK3R5cGVkZWYgZW51bSB7CisgIE1QRUdTX0NPTlRJTlVFID0gMCwgLyohPCBJbmRpY2F0ZXMgaWYgZGF0YSBzZWdtZW50IGNvbnRpbnVlcyBhIGRhdGEgYmxvY2suICovCisgIE1QRUdTX1NUT1AgPSAxLCAgICAgLyohPCBJbmRpY2F0ZXMgaWYgZGF0YSBzZWdtZW50IGVuZHMgYSBkYXRhIGJsb2NrLiAqLworICBNUEVHU19TVEFSVCA9IDIsICAgIC8qITwgSW5kaWNhdGVzIGlmIGRhdGEgc2VnbWVudCBiZWdpbnMgYSBkYXRhIGJsb2NrLiAqLworICBNUEVHU19TVEFSVF9TVE9QID0KKyAgICAgIDMgLyohPCBJbmRpY2F0ZXMgaWYgZGF0YSBzZWdtZW50IGJlZ2lucyBhbmQgZW5kcyBhIGRhdGEgYmxvY2suICovCit9IE1QRUdTX0FOQ1NUQVJUU1RPUDsKKworLyoqCisgKiBcYnJpZWYgTVBFRyBTdXJyb3VuZCBzeW5jaHJvbml6YWl0b24gc3RhdGUuCisgKgorICogIENBVVRJT046IENoYW5naW5nIHRoZSBlbnVtZXJhdGlvbiB2YWx1ZXMgY2FuIGJyZWFrIHRoZSBzeW5jIG1lY2hhbmlzbQorICpiZWNhdXNlIGl0IGlzIGJhc2VkIG9uIGNvbXBhcmluZyB0aGUgc3RhdGUgdmFsdWVzLgorICoqLwordHlwZWRlZiBlbnVtIHsKKyAgTVBFR1NfU1lOQ19MT1NUID0KKyAgICAgIDAsIC8qITwgSW5kaWNhdGVzIGxvc3Qgc3luYyBiZWNhdXNlIG9mIGN1cnJlbnQgZGlzY29udGludWl0eS4gKi8KKyAgTVBFR1NfU1lOQ19GT1VORCA9IDEsICAgLyohPCBQYXJzZWQgYSB2YWxpZCBoZWFkZXIgYW5kIChyZSlpbnRpYWxpemF0aW9uIHdhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgY29tcGxldGVkLiAqLworICBNUEVHU19TWU5DX0NPTVBMRVRFID0gMiAvKiE8IEluIHN5bmMgYW5kIGNvbnRpbnVvdXMuIEZvdW5kIGFuIGluZGVwZW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIGluIGFkZGl0aW9uIHRvIE1QRUdTX1NZTkNfRk9VTkQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlY29uZGl0aW9uOiBNUEVHU19TWU5DX0ZPVU5ELiAqLworfSBNUEVHU19TWU5DU1RBVEU7CisKKy8qKgorICogXGJyaWVmIE1QRUcgU3Vycm91bmQgb3BlcmF0aW9uIG1vZGUuCisgKiovCit0eXBlZGVmIGVudW0geworICBNUEVHU19PUE1PREVfRU1NID0gMCwgICAgICAgICAgIC8qITwgTW9kZTogRW5oYW5jZWQgTWF0cml4IE1vZGUgKEJsaW5kKSAqLworICBNUEVHU19PUE1PREVfTVBTX1BBWUxPQUQgPSAxLCAgIC8qITwgTW9kZTogTm9ybWFsLCBTdGVyZW8gb3IgQmluYXVyYWwgKi8KKyAgTVBFR1NfT1BNT0RFX05PX01QU19QQVlMT0FEID0gMiAvKiE8IE1vZGU6IG5vIE1QRUcgU3Vycm91bmQgcGF5bG9hZCAqLworfSBNUEVHU19PUE1PREU7CisKKy8qKgorICogXGJyaWVmIE1QRUcgU3Vycm91bmQgaW5pdCBmbGFncy4KKyAqKi8KK3R5cGVkZWYgZW51bSB7CisgIE1QRUdTX0lOSVRfT0sgPSAweDAwMDAwMDAwLCAvKiE8IGluZGljYXRlIGNvcnJlY3QgaW5pdGlhbGl6YXRpb24gKi8KKyAgTVBFR1NfSU5JVF9FTkZPUkNFX1JFSU5JVCA9CisgICAgICAweDAwMDAwMDAxLCAvKiE8IGluZGljYXRlIGNvbXBsZXRlIGluaXRpYWxpemF0aW9uICovCisKKyAgTVBFR1NfSU5JVF9DSEFOR0VfT1VUUFVUX01PREUgPQorICAgICAgMHgwMDAwMDAxMCwgLyohPCBpbmRpY2F0ZSBjaGFuZ2Ugb2YgdGhlIG91dHB1dCBtb2RlICovCisgIE1QRUdTX0lOSVRfQ0hBTkdFX1BBUlRJQUxMWV9DT01QTEVYID0KKyAgICAgIDB4MDAwMDAwMjAsIC8qITwgaW5kaWNhdGUgY2hhbmdlIG9mIGxvdyBwb3dlci9oaWdoIHF1YWxpdHkgKi8KKyAgTVBFR1NfSU5JVF9DSEFOR0VfVElNRV9GUkVRX0lOVEVSRkFDRSA9CisgICAgICAweDAwMDAwMDQwLCAvKiE8IGluZGljYXRlIGNoYW5nZSBvZiBxbWYvdGltZSBpbnRlcmZhY2UgKi8KKyAgTVBFR1NfSU5JVF9DSEFOR0VfSEVBREVSID0gMHgwMDAwMDA4MCwgLyohPCBpbmRpY2F0ZSBjaGFuZ2Ugb2YgaGVhZGVyICovCisKKyAgTVBFR1NfSU5JVF9FUlJPUl9QQVlMT0FEID0KKyAgICAgIDB4MDAwMDAxMDAsIC8qITwgaW5kaWNhdGUgcGF5bG9hZC9hbmNUeXBlL2FuY1N0YXJ0U3RvcCBlcnJvciAqLworCisgIE1QRUdTX0lOSVRfQlNfSU5URVJSVVBUSU9OID0KKyAgICAgIDB4MDAwMDEwMDAsIC8qITwgaW5kaWNhdGUgYml0c3RyZWFtIGludGVycnVwdGlvbiAgKi8KKyAgTVBFR1NfSU5JVF9DTEVBUl9ISVNUT1JZID0KKyAgICAgIDB4MDAwMDIwMDAsIC8qITwgaW5kaWNhdGUgdGhhdCBhbGwgc3RhdGVzIHNoYWxsIGJlIGNsZWFyZWQgKi8KKworICAvKiBSZS1pbml0aWFsaXphdGlvbiBvZiBzdWJtb2R1bGVzICovCisKKyAgTVBFR1NfSU5JVF9DSEFOR0VfQ09OQ0VBTF9QQVJBTVMgPSAweDAwMTAwMDAwLCAvKiE8IGluZGljYXRlIGEgY2hhbmdlIG9mIGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhc3Qgb25lIGVycm9yIGNvbmNlYWxtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0gKi8KKworICAvKiBObyByZS1pbml0aWFsaXphdGlvbiBuZWVkZWQsIGN1cnJlbnRseSBub3QgdXNlZCAqLworICBNUEVHU19JTklUX0NIQU5HRV9CWVBBU1NfTU9ERSA9CisgICAgICAweDAxMDAwMDAwLCAvKiE8IGluZGljYXRlIGNoYW5nZSBvZiBieXBhc3MgbW9kZSAqLworCisgIC8qIFJlLWluaXRpYWxpemF0aW9uIG5lZWRlZCwgY3VycmVudGx5IG5vdCB1c2VkICovCisgIE1QRUdTX0lOSVRfRVJST1JfQU5DX1RZUEUgPSAweDEwMDAwMDAwLCAvKiE8IGluZGljYXRlIGFuY1R5cGUgZXJyb3IqLworICBNUEVHU19JTklUX0VSUk9SX0FOQ19TVEFSVFNUT1AgPQorICAgICAgMHgyMDAwMDAwMCAvKiE8IGluZGljYXRlIGFuY1N0YXJ0U3RvcCBlcnJvciAqLworfSBNUEVHU19JTklUX0ZMQUdTOworCitzdHJ1Y3QgTXBlZ1N1cnJvdW5kRGVjb2RlciB7CisgIEhBTkRMRV9GREtfUU1GX0RPTUFJTiBwUW1mRG9tYWluOworICBVQ0hBUiBtcHNEYXRhW01QU19EQVRBX0JVRkZFUl9TSVpFXTsgLyogQnVmZmVyIGZvciBNUFMgcGF5bG9hZCBhY2Nyb3NzIG1vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gb25lIHNlZ21lbnQgKi8KKyAgSU5UIG1wc0RhdGFCaXRzOyAgICAgICAgICAgICAgICAgICAgIC8qIEFtb3VudCBvZiBiaXRzIGluIG1wc0RhdGEgKi8KKyAgLyogTVBFRyBTdXJyb3VuZCBkZWNvZGVyICovCisgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHIHNwYXRpYWxTcGVjaWZpY0NvbmZpZ1sxXTsgLyogU1NDIGRlbGF5IGxpbmUgd2hpY2ggaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGR1cmluZyBkZWNvZGluZyAqLworICBzcGF0aWFsRGVjICpwU3BhdGlhbERlYzsKKyAgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcKKyAgc3BhdGlhbFNwZWNpZmljQ29uZmlnQmFja3VwOyAvKiBTU0MgdXNlZCB3aGlsZSBwYXJzaW5nICovCisKKyAgLyogQ3JlYXRpb24gcGFyYW1ldGVyICovCisgIFVDSEFSIG1wZWdTdXJyb3VuZERlY29kZXJMZXZlbDsKKyAgLyogUnVuLXRpbWUgcGFyYW1ldGVyICovCisgIFVDSEFSIG1wZWdTdXJyb3VuZFNzY0lzR2xvYmFsQ2ZnOyAvKiBGbGFnIHRlbGxpbmcgdGhhdCB0aGUgU1NDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOjpzcGF0aWFsU3BlY2lmaWNDb25maWcpIGlzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC1vZi1iYW5kIGNvbmZpZ3VyYXRpb24uICovCisgIFVDSEFSIG1wZWdTdXJyb3VuZFVzZVRpbWVJbnRlcmZhY2U7CisKKyAgU1BBVElBTF9CU19GUkFNRQorICBic0ZyYW1lc1sxXTsgICAgICAgICAvKiBCaXRzdHJlYW0gU3RydWN0cyB0aGF0IGNvbnRhaW4gZGF0YSByZWFkIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYXRpYWxGcmFtZSgpIGJpdHN0cmVhbSBlbGVtZW50ICovCisgIEJTX0xMX1NUQVRFIGxsU3RhdGU7IC8qIEJpdCBzdHJlYW0gcGFyc2VyIHN0YXRlIG1lbW9yeSAqLworICBVQ0hBUiBic0ZyYW1lUGFyc2U7ICAvKiBDdXJyZW50IHBhcnNlIGZyYW1lIGNvbnRleHQgaW5kZXggKi8KKyAgVUNIQVIgYnNGcmFtZURlY29kZTsgLyogQ3VycmVudCBkZWNvZGUvYXBwbHkgZnJhbWUgY29udGV4dCBpbmRleCAqLworICBVQ0hBUiBic0ZyYW1lRGVsYXk7ICAvKiBBbW91bnQgb2YgZnJhbWVzIGRlbGF5IGJldHdlZW4gcGFyc2luZyBhbmQgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgaS5lLiBmb3IgaW50ZXJwb2xhdGlvbiBlcnJvciBjb25jZWFsbWVudC4gKi8KKworICAvKiBVc2VyIHByYW1ldGVycyAqLworICBTUEFUSUFMREVDX1BBUkFNIG1wZWdTdXJyb3VuZFVzZXJQYXJhbXM7CisKKyAgLyogSW50ZXJuYWwgZmxhZ3MgKi8KKyAgU1BBVElBTF9ERUNfVVBNSVhfVFlQRSB1cG1peFR5cGU7CisgIGludCBpbml0RmxhZ3NbMV07CisgIE1QRUdTX0FOQ1NUQVJUU1RPUCBhbmNTdGFydFN0b3BQcmV2OworICBNUEVHU19TWU5DU1RBVEUgZk9uU3luY1sxXTsKKworICAvKiBJbml0YWwgZGVjb2RlciBjb25maWd1cmF0aW9uICovCisgIFNQQVRJQUxfREVDX0NPTkZJRyBkZWNDb25maWc7Cit9OworCitzdGF0aWMgU0FDREVDX0VSUk9SIHNzY1BhcnNlQ2hlY2soY29uc3QgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnBTc2MpOworCisvKioKKyAqIFxicmllZiBHZXQgdGhlIG51bWJlciBvZiBRTUYgYmFuZHMgZnJvbSB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5IChpbiBIeikKKyAqKi8KK3N0YXRpYyBpbnQgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9HZXROck9mUW1mQmFuZHMoCisgICAgY29uc3QgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnBTc2MsIFVJTlQgc2FtcGxlUmF0ZSkgeworICBVSU5UIHNhbXBsaW5nRnJlcXVlbmN5ID0gc2FtcGxlUmF0ZTsKKyAgaW50IHFtZkJhbmRzID0gNjQ7CisKKyAgaWYgKHBTc2MgIT0gTlVMTCkgeworICAgIHN3aXRjaCAocFNzYy0+Y29yZUNvZGVjKSB7CisgICAgICBjYXNlIEFPVF9VU0FDOgorICAgICAgICBpZiAoKHBTc2MtPnN0ZXJlb0NvbmZpZ0luZGV4ID09IDMpKSB7CisgICAgICAgICAgc3RhdGljIGNvbnN0IFVDSEFSIG1hcElkeDJRbWZCYW5kc1szXSA9IHsyNCwgMzIsIDE2fTsKKyAgICAgICAgICBGREtfQVNTRVJUKChwU3NjLT5jb3JlU2JyRnJhbWVMZW5ndGhJbmRleCA+PSAyKSAmJgorICAgICAgICAgICAgICAgICAgICAgKHBTc2MtPmNvcmVTYnJGcmFtZUxlbmd0aEluZGV4IDw9IDQpKTsKKyAgICAgICAgICBxbWZCYW5kcyA9IG1hcElkeDJRbWZCYW5kc1twU3NjLT5jb3JlU2JyRnJhbWVMZW5ndGhJbmRleCAtIDJdOworICAgICAgICB9CisgICAgICAgIHJldHVybiBxbWZCYW5kczsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHNhbXBsaW5nRnJlcXVlbmN5ID0gcFNzYy0+c2FtcGxpbmdGcmVxOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBudW1iZXIgb2YgUU1GIGJhbmRzIGRlcGVuZCBvbiBzYW1wbGluZyBmcmVxdWVuY3ksIHNlZSBGRElTIDIzMDAzLTE6MjAwNgorICAgKiBDaGFwdGVyIDYuMy4zICovCisgIGlmIChzYW1wbGluZ0ZyZXF1ZW5jeSA8IDI3NzEzKSB7CisgICAgcW1mQmFuZHMgPSAzMjsKKyAgfQorICBpZiAoc2FtcGxpbmdGcmVxdWVuY3kgPiA1NTQyNikgeworICAgIHFtZkJhbmRzID0gMTI4OworICB9CisKKyAgcmV0dXJuIHFtZkJhbmRzOworfQorCisvKioKKyAqIFxicmllZiBBbmFseXNlIGluaXQgZmxhZ3MKKyAqKi8KK3N0YXRpYyBpbnQgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9DYWxjSW5pdEZsYWdzKFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3NjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3NjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1cG1peFR5cGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpbmF1cmFsUXVhbGl0eUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFydGlhbGx5Q29tcGxleEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmN0cmxGbGFncykgeworICAvKiBBbmFseXNlIGNvcmUgY29kZXIgKi8KKyAgaWYgKHBTc2MxLT5jb3JlQ29kZWMgIT0gcFNzYzItPmNvcmVDb2RlYykgeworICAgICpjdHJsRmxhZ3MgfD0gTUFTS19NUEVHU19JTklUX0FMTF9TVEFURVM7CisgICAgKmN0cmxGbGFncyB8PSBNQVNLX01QRUdTX0lOSVRfQUxMX1BBUkFNUzsKKyAgfSBlbHNlIHsKKyAgICAvKiBBbmFseXNlIGVsZW1lbnRzIGZvciBpbml0aWFsaXphdGlvbiBvZiBzcGFjZSBhbmFseXNpcyBxbWYgZmlsdGVyYmFuayAqLworICAgIGlmICgocGFydGlhbGx5Q29tcGxleEZsYWcpIHx8IChwU3NjMS0+dHJlZUNvbmZpZyAhPSBwU3NjMi0+dHJlZUNvbmZpZykgfHwKKyAgICAgICAgKHBTc2MxLT5zYW1wbGluZ0ZyZXEgIT0gcFNzYzItPnNhbXBsaW5nRnJlcSkpIHsKKyAgICAgICpjdHJsRmxhZ3MgfD0gTVBFR1NfSU5JVF9TVEFURVNfQU5BX1FNRl9GSUxURVI7CisgICAgICAqY3RybEZsYWdzIHw9IE1QRUdTX0lOSVRfU1RBVEVTX0FOQV9IWUJfRklMVEVSOworICAgIH0KKworICAgIC8qIEFuYWx5c2UgZWxlbWVudHMgZm9yIGluaXRpYWxpemF0aW9uIG9mIHNwYWNlIHN5bnRoZXNpcyBxbWYgZmlsdGVyYmFuayAqLworICAgIGlmICgodXBtaXhUeXBlRmxhZykgfHwgKHBhcnRpYWxseUNvbXBsZXhGbGFnKSB8fAorICAgICAgICAocFNzYzEtPnRyZWVDb25maWcgIT0gcFNzYzItPnRyZWVDb25maWcpIHx8CisgICAgICAgIChwU3NjMS0+c2FtcGxpbmdGcmVxICE9IHBTc2MyLT5zYW1wbGluZ0ZyZXEpIHx8CisgICAgICAgIChwU3NjMS0+YnNGaXhlZEdhaW5ETVggIT0gcFNzYzItPmJzRml4ZWRHYWluRE1YKSkgeworICAgICAgKmN0cmxGbGFncyB8PSBNUEVHU19JTklUX1NUQVRFU19TWU5fUU1GX0ZJTFRFUjsKKyAgICB9CisKKyAgICAvKiBBbmFseXNlIGVsZW1lbnRzIGZvciBpbml0aWFsaXphdGlvbiBvZiBkZWNvcnJlbGF0b3IgKi8KKyAgICBpZiAoKHVwbWl4VHlwZUZsYWcpIHx8IChwYXJ0aWFsbHlDb21wbGV4RmxhZykgfHwKKyAgICAgICAgKHBTc2MxLT50cmVlQ29uZmlnICE9IHBTc2MyLT50cmVlQ29uZmlnKSB8fAorICAgICAgICAocFNzYzEtPnNhbXBsaW5nRnJlcSAhPSBwU3NjMi0+c2FtcGxpbmdGcmVxKSB8fAorICAgICAgICAocFNzYzEtPmRlY29yckNvbmZpZyAhPSBwU3NjMi0+ZGVjb3JyQ29uZmlnKSkgeworICAgICAgKmN0cmxGbGFncyB8PSBNUEVHU19JTklUX1NUQVRFU19ERUNPUlJFTEFUT1I7CisgICAgfQorCisgICAgLyogQW5hbHlzZSBlbGVtZW50cyBmb3IgaW5pdGlhbGl6YXRpb24gb2YgbTEgYW5kIG0yIGNhbGN1bGF0aW9uICovCisgICAgaWYgKCh1cG1peFR5cGVGbGFnKSB8fCAoYmluYXVyYWxRdWFsaXR5RmxhZykgfHwKKyAgICAgICAgKHBTc2MxLT50cmVlQ29uZmlnICE9IHBTc2MyLT50cmVlQ29uZmlnKSB8fAorICAgICAgICAocFNzYzEtPnNhbXBsaW5nRnJlcSAhPSBwU3NjMi0+c2FtcGxpbmdGcmVxKSkKKworICAgIHsKKyAgICAgICpjdHJsRmxhZ3MgfD0gTVBFR1NfSU5JVF9TVEFURVNfTTFNMjsKKyAgICB9CisKKyAgICAvKiBBbmFseXNlIGVsZW1lbnRzIGZvciBpbml0aWFsaXphdGlvbiBvZiBHRVMgKi8KKyAgICBpZiAoKHVwbWl4VHlwZUZsYWcpIHx8IChwU3NjMS0+dHJlZUNvbmZpZyAhPSBwU3NjMi0+dHJlZUNvbmZpZykgfHwKKyAgICAgICAgKHBTc2MxLT50ZW1wU2hhcGVDb25maWcgIT0gcFNzYzItPnRlbXBTaGFwZUNvbmZpZykpIHsKKyAgICAgICpjdHJsRmxhZ3MgfD0gTVBFR1NfSU5JVF9TVEFURVNfR0VTOworICAgIH0KKworICAgIC8qIEFuYWx5c2UgZWxlbWVudHMgZm9yIGluaXRpYWxpemF0aW9uIG9mIEZEcmV2ZXJiICovCisgICAgaWYgKCh1cG1peFR5cGVGbGFnKSB8fCAoYmluYXVyYWxRdWFsaXR5RmxhZykgfHwgKHBhcnRpYWxseUNvbXBsZXhGbGFnKSB8fAorICAgICAgICAocFNzYzEtPnNhbXBsaW5nRnJlcSAhPSBwU3NjMi0+c2FtcGxpbmdGcmVxKSB8fAorICAgICAgICAocFNzYzEtPm5UaW1lU2xvdHMgIT0gcFNzYzItPm5UaW1lU2xvdHMpKSB7CisgICAgICAqY3RybEZsYWdzIHw9IE1QRUdTX0lOSVRfU1RBVEVTX1JFVkVSQjsKKyAgICB9CisKKyAgICAvKiBSZXNldCBwcmV2aW91cyBmcmFtZSBkYXRhIHdoZW5ldmVyIHRoZSBjb25maWcgY2hhbmdlcyAqLworICAgIGlmICgqY3RybEZsYWdzICYgTVBFR1NfSU5JVF9DT05GSUcpIHsKKyAgICAgICpjdHJsRmxhZ3MgfD0gTVBFR1NfSU5JVF9TVEFURVNfUEFSQU07CisgICAgfQorICB9CisKKyAgcmV0dXJuIE1QU19PSzsKK30KKworLyoqCisgKiBcYnJpZWYgUmVzZXQgTVBFRyBTdXJyb3VuZCBzdGF0dXMgaW5mbworICoqLworc3RhdGljIHZvaWQgdXBkYXRlTXBlZ1N1cnJvdW5kRGVjb2RlclN0YXR1cygKKyAgICBDTXBlZ1N1cnJvdW5kRGVjb2RlciAqcE1wZWdTdXJyb3VuZERlY29kZXIsIGludCBpbml0RmxhZ3MsCisgICAgTVBFR1NfU1lOQ1NUQVRFIGZPblN5bmMsIE1QRUdTX0FOQ1NUQVJUU1RPUCBhbmNTdGFydFN0b3BQcmV2KSB7CisgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5pbml0RmxhZ3NbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdIHw9CisgICAgICBpbml0RmxhZ3M7CisgIGlmICgocE1wZWdTdXJyb3VuZERlY29kZXItPm1wZWdTdXJyb3VuZFNzY0lzR2xvYmFsQ2ZnICE9IDApICYmCisgICAgICAocE1wZWdTdXJyb3VuZERlY29kZXItPmZPblN5bmNbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdID49CisgICAgICAgTVBFR1NfU1lOQ19GT1VORCkgJiYKKyAgICAgIChmT25TeW5jIDwgTVBFR1NfU1lOQ19GT1VORCkpIHsKKyAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+Zk9uU3luY1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV0gPQorICAgICAgICBNUEVHU19TWU5DX0ZPVU5EOworICB9IGVsc2UgeworICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5mT25TeW5jW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lRGVjb2RlXSA9CisgICAgICAgIGZPblN5bmM7CisgIH0KKyAgcE1wZWdTdXJyb3VuZERlY29kZXItPmFuY1N0YXJ0U3RvcFByZXYgPSBhbmNTdGFydFN0b3BQcmV2OworfQorCitzdGF0aWMgU0FDREVDX0VSUk9SIG1wZWdTdXJyb3VuZERlY29kZXJfQ3JlYXRlKAorICAgIENNcGVnU3Vycm91bmREZWNvZGVyICoqcE1wZWdTdXJyb3VuZERlY29kZXIsIGludCBzdGVyZW9Db25maWdJbmRleCwKKyAgICBIQU5ETEVfRkRLX1FNRl9ET01BSU4gcFFtZkRvbWFpbik7CisKK1NBQ19JTlNUQU5DRV9BVkFJTAorbXBlZ1N1cnJvdW5kRGVjb2Rlcl9Jc0Z1bGxNcGVnU3Vycm91bmREZWNvZGVySW5zdGFuY2VBdmFpbGFibGUoCisgICAgQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyKSB7CisgIFNBQ19JTlNUQU5DRV9BVkFJTCBpbnN0YW5jZUF2YWlsYWJsZSA9IFNBQ19JTlNUQU5DRV9OT1RfRlVMTF9BVkFJTEFCTEU7CisKKyAgaWYgKHBNcGVnU3Vycm91bmREZWNvZGVyLT5wU3BhdGlhbERlYyAhPSBOVUxMKSB7CisgICAgaW5zdGFuY2VBdmFpbGFibGUgPSBTQUNfSU5TVEFOQ0VfRlVMTF9BVkFJTEFCTEU7CisgIH0KKworICByZXR1cm4gaW5zdGFuY2VBdmFpbGFibGU7Cit9CisKK1NBQ0RFQ19FUlJPUiBtcGVnU3Vycm91bmREZWNvZGVyX09wZW4oCisgICAgQ01wZWdTdXJyb3VuZERlY29kZXIgKipwTXBlZ1N1cnJvdW5kRGVjb2RlciwgaW50IHN0ZXJlb0NvbmZpZ0luZGV4LAorICAgIEhBTkRMRV9GREtfUU1GX0RPTUFJTiBwUW1mRG9tYWluKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnJvcjsKKworICBlcnJvciA9IG1wZWdTdXJyb3VuZERlY29kZXJfQ3JlYXRlKHBNcGVnU3Vycm91bmREZWNvZGVyLCBzdGVyZW9Db25maWdJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mRG9tYWluKTsKKworICByZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogXGJyaWVmICBSZW5hbWVkIGZ1bmN0aW9uIGZyb20gZ2V0VXBtaXhUeXBlIHRvIGNoZWNrX1VQYXJhbV9CdWlsZF9EZWNDb25maWcuCisgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHVzZXIgcGFyYW1zLCBkZWNvZGVyIGNvbmZpZyBhbmQgU1NDIGFyZSB2YWxpZAorICogICAgICAgICBhbmQgaWYgdGhlIGRlY29kZXIgYnVpbGQgY2FuIGhhbmRsZSBhbGwgdGhpcyBzZXR0aW5ncy4KKyAqICAgICAgICAgVGhlIHVwbWl4IHR5cGUgbWF5IGJlIG1vZGlmaWVkIGJ5IHRoaXMgZnVuY3Rpb24uCisgKiAgICAgICAgIEl0IGlzIGNhbGxlZCBpbiBpbml0TXBlZ1N1cnJvdW5kRGVjb2RlcigpIGFmdGVyIHRoZSBzc2MgcGFyc2UgY2hlY2ssCisgKiAgICAgICAgIHRvIGhhdmUgYWxsIGNoZWNrcyBpbiBvbmUgcGxhY2UgYW5kIHRvIGVuc3VyZSB0aGVzZSBjaGVja3MgYXJlIGFsd2F5cworICogICAgICAgICBwZXJmb3JtZWQgaWYgY29uZmlnIGNoYW5nZXMgKGluYmFuZCBhbmQgb3V0LW9mLWJhbmQpLgorICoKKyAqIFxwYXJhbSBwVXNlclBhcmFtcyAgVXNlciBkYXRhIGhhbmRsZS4KKyAqIFxwYXJhbSBwRGVjQ29uZmlnICAgZGVjb2RlciBjb25maWcgaGFuZGxlLgorICogXHBhcmFtIHBTc2MgICAgICAgICBzcGF0aWFsIHNwZWNpZmljIGNvbmZpZyBoYW5kbGUuCisgKiBccGFyYW0gcFVwbWl4VHlwZSAgIHVwbWl4IHR5cGUgd2hpY2ggaXMgc2V0IGJ5IHRoaXMgZnVuY3Rpb24KKyAqCisgKiBccmV0dXJuICBNUFNfT0sgb24gc3VjZXNzLCBhbmQgZWxzZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgU0FDREVDX0VSUk9SIGNoZWNrX1VQYXJhbV9CdWlsZF9EZWNDb25maWcoCisgICAgU1BBVElBTERFQ19QQVJBTSBjb25zdCAqcFVzZXJQYXJhbXMsIFNQQVRJQUxfREVDX0NPTkZJRyBjb25zdCAqcERlY0NvbmZpZywKKyAgICBjb25zdCBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqcFNzYywgU1BBVElBTF9ERUNfVVBNSVhfVFlQRSAqcFVwbWl4VHlwZSkgeworICBpbnQgZG14Q2hhbm5lbHMsIG91dENoYW5uZWxzLCBtYXhOdW1PdXRDaGFubmVsczsKKworICBGREtfQVNTRVJUKHBVc2VyUGFyYW1zICE9IE5VTEwpOworICBGREtfQVNTRVJUKHBVcG1peFR5cGUgIT0gTlVMTCk7CisKKyAgLyogY2hlY2tzIGlmIGltcGxlbWVudGF0aW9uIGNhbiBoYW5kbGUgdGhlIFNzYyAqLworCisgIHN3aXRjaCAocFNzYy0+dHJlZUNvbmZpZykgeworICAgIGNhc2UgU1BBVElBTERFQ19NT0RFX1JTVkQ3OiAvKiAyMTIgKi8KKyAgICAgIGRteENoYW5uZWxzID0gMTsKKyAgICAgIG91dENoYW5uZWxzID0gMjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTVBTX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgfQorCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAvKiBBbmFseXNlIHBEZWNDb25maWcgcGFyYW1zICovCisgIHN3aXRjaCAocERlY0NvbmZpZy0+YmluYXVyYWxNb2RlKSB7CisgICAgY2FzZSBCSU5BVVJBTF9OT05FOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBNUFNfVU5TVVBQT1JURURfQ09ORklHOworICB9CisKKyAgc3dpdGNoIChwRGVjQ29uZmlnLT5kZWNvZGVyTW9kZSkgeworICAgIGNhc2UgRVhUX0hRX09OTFk6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE1QU19VTlNVUFBPUlRFRF9DT05GSUc7CisgIH0KKworICBzd2l0Y2ggKHBEZWNDb25maWctPm1heE51bU91dHB1dENoYW5uZWxzKSB7CisgICAgY2FzZSBPVVRQVVRfQ0hBTk5FTFNfREVGQVVMVDoKKyAgICAgIC8qIE5vIHNwZWNpYWwgcmVzdHJpY3Rpb25zIC0+IEdldCB0aGUgbGV2ZWwgcmVzdHJpY3Rpb246ICovCisgICAgICBzd2l0Y2ggKHBEZWNDb25maWctPmRlY29kZXJMZXZlbCkgeworICAgICAgICBjYXNlIERFQ09ERVJfTEVWRUxfMDoKKyAgICAgICAgICBtYXhOdW1PdXRDaGFubmVscyA9IDI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIE1QU19VTlNVUFBPUlRFRF9DT05GSUc7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIE9VVFBVVF9DSEFOTkVMU18yXzA6CisgICAgICBtYXhOdW1PdXRDaGFubmVscyA9IDI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE1QU19VTlNVUFBPUlRFRF9DT05GSUc7CisgIH0KKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgIC8qIGNoZWNrIGlmIHdlIGNhbiBoYW5kbGUgdXNlciBwYXJhbXMgKi8KKyAgaWYgKHBVc2VyUGFyYW1zLT5ibGluZEVuYWJsZSA9PSAxKSB7CisgICAgcmV0dXJuIE1QU19VTlNVUFBPUlRFRF9DT05GSUc7CisgIH0KKyAgeworICAgIHN3aXRjaCAoKFNBQ19ERUNfT1VUUFVUX01PREUpcFVzZXJQYXJhbXMtPm91dHB1dE1vZGUpIHsKKyAgICAgIGNhc2UgU0FDREVDX09VVF9NT0RFX05PUk1BTDoKKyAgICAgICAgaWYgKG1heE51bU91dENoYW5uZWxzID49IG91dENoYW5uZWxzKSB7CisgICAgICAgICAgKnBVcG1peFR5cGUgPSBVUE1JWF9UWVBFX05PUk1BTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB7ICpwVXBtaXhUeXBlID0gVVBNSVhfVFlQRV9CWVBBU1M7IH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0FDREVDX09VVF9NT0RFX1NURVJFTzoKKyAgICAgICAgaWYgKGRteENoYW5uZWxzID09IDEpIHsKKyAgICAgICAgICBpZiAob3V0Q2hhbm5lbHMgPT0gMikgeworICAgICAgICAgICAgKnBVcG1peFR5cGUgPSBVUE1JWF9UWVBFX05PUk1BTDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKnBVcG1peFR5cGUgPSBVUE1JWF9UWVBFX0JZUEFTUzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0FDREVDX09VVF9NT0RFXzZDSEFOTkVMOgorICAgICAgICBpZiAob3V0Q2hhbm5lbHMgPiA2KSB7CisgICAgICAgICAgeyAqcFVwbWl4VHlwZSA9IFVQTUlYX1RZUEVfQllQQVNTOyB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKnBVcG1peFR5cGUgPSBVUE1JWF9UWVBFX05PUk1BTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBNUFNfVU5TVVBQT1JURURfQ09ORklHOworICAgIH0KKyAgfQorCisgIHJldHVybiBNUFNfT0s7Cit9CisKKy8qKgorICogXGJyaWVmIEluaXQgTVBFRyBTdXJyb3VuZCBkZWNvZGVyLgorICoqLworc3RhdGljIFNBQ0RFQ19FUlJPUiBpbml0TXBlZ1N1cnJvdW5kRGVjb2RlcigKKyAgICBDTXBlZ1N1cnJvdW5kRGVjb2RlciAqcE1wZWdTdXJyb3VuZERlY29kZXIpIHsKKyAgU0FDREVDX0VSUk9SIGVycjsKKyAgaW50IGluaXRGbGFncyA9IE1QRUdTX0lOSVRfTk9ORSwgaW5pdEZsYWdzRGVjOworICBpbnQgdXBtaXhUeXBlQ3VyciA9IHBNcGVnU3Vycm91bmREZWNvZGVyLT51cG1peFR5cGU7CisKKyAgRkRLX0FTU0VSVChwTXBlZ1N1cnJvdW5kRGVjb2RlciAhPSBOVUxMKTsKKworICBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqY29uc3QgcFNTQ2lucHV0ID0KKyAgICAgICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+c3BhdGlhbFNwZWNpZmljQ29uZmlnQmFja3VwOworICBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqY29uc3QgcFNTQ3RhcmdldCA9CisgICAgICAmcE1wZWdTdXJyb3VuZERlY29kZXIKKyAgICAgICAgICAgLT5zcGF0aWFsU3BlY2lmaWNDb25maWdbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdOworICBpbml0RmxhZ3NEZWMgPQorICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPmluaXRGbGFnc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV07CisKKyAgaWYgKHBTU0NpbnB1dC0+Y29yZUNvZGVjICE9IEFPVF9VU0FDKSB7CisgICAgLyogaGVyZSB3ZSBjaGVjayBpZiB3ZSBoYXZlIGEgdmFsaWQgU3NjICovCisgICAgZXJyID0gc3NjUGFyc2VDaGVjayhwU1NDaW5wdXQpOworICAgIGlmIChlcnIgIT0gTVBTX09LKSBnb3RvIGJhaWw7CisgIH0KKworICAvKiBoZXJlIHdlIGNoZWNrIGlmIFNzYyBtYXRjaGVzIGJ1aWxkOyBhbHNvIGNoZWNrIFVQYXJhbXMgYW5kIERlY0NvbmZpZyAqLworICAvKiBpZiBkZXNpcmVkIHVwbWl4VHlwZSBpcyBjaGFuZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBlcnIgPSBjaGVja19VUGFyYW1fQnVpbGRfRGVjQ29uZmlnKAorICAgICAgJnBNcGVnU3Vycm91bmREZWNvZGVyLT5tcGVnU3Vycm91bmRVc2VyUGFyYW1zLAorICAgICAgJnBNcGVnU3Vycm91bmREZWNvZGVyLT5kZWNDb25maWcsIHBTU0NpbnB1dCwKKyAgICAgICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+dXBtaXhUeXBlKTsKKyAgaWYgKGVyciAhPSBNUFNfT0spIGdvdG8gYmFpbDsKKworICAvKiBpbml0IGNvbmZpZyAqLworICBpZiAoaW5pdEZsYWdzRGVjICYgTVBFR1NfSU5JVF9DSEFOR0VfSEVBREVSKSB7CisgICAgaW5pdEZsYWdzIHw9IE1QRUdTX0lOSVRfQ09ORklHOworICB9CisgIC8qIGluaXQgYWxsIHN0YXRlcyAqLworICBpZiAoaW5pdEZsYWdzRGVjICYgTVBFR1NfSU5JVF9DTEVBUl9ISVNUT1JZKSB7CisgICAgaW5pdEZsYWdzIHw9IE1BU0tfTVBFR1NfSU5JVF9BTExfU1RBVEVTOworICB9CisgIGlmIChpbml0RmxhZ3NEZWMgJiBNUEVHU19JTklUX0NIQU5HRV9DT05DRUFMX1BBUkFNUykgeworICAgIGluaXRGbGFncyB8PSBNUEVHU19JTklUX1BBUkFNU19FUlJPUl9DT05DRUFMTUVOVDsKKyAgfQorCisgIGlmIChpbml0RmxhZ3NEZWMgJiBNUEVHU19JTklUX0VORk9SQ0VfUkVJTklUKSB7CisgICAgLyogaW5pdCBhbGwgc3RhdGVzICovCisgICAgaW5pdEZsYWdzIHw9IE1BU0tfTVBFR1NfSU5JVF9BTExfU1RBVEVTOworICAgIGluaXRGbGFncyB8PSBNQVNLX01QRUdTX0lOSVRfQUxMX1BBUkFNUzsKKyAgfSBlbHNlIHsKKyAgICAvKiBhbmFseXNlIHN0YXRlcyB3aGljaCBoYXZlIHRvIGJlIGluaXRpYWxpemVkICovCisgICAgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9DYWxjSW5pdEZsYWdzKAorICAgICAgICBwU1NDdGFyZ2V0LCBwU1NDaW5wdXQsCisgICAgICAgICh1cG1peFR5cGVDdXJyICE9CisgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+dXBtaXhUeXBlKSwgLyogdXBtaXhUeXBlIGNoYW5nZWQgKi8KKyAgICAgICAgMCwgKGluaXRGbGFnc0RlYyAmIE1QRUdTX0lOSVRfQ0hBTkdFX1BBUlRJQUxMWV9DT01QTEVYKSA/IDEgOiAwLAorICAgICAgICAmaW5pdEZsYWdzKTsKKyAgfQorCisgIHsKKyAgICBpbnQgbnJPZlFtZkJhbmRzOworICAgIEZES21lbWNweShwU1NDdGFyZ2V0LCBwU1NDaW5wdXQsIHNpemVvZihTUEFUSUFMX1NQRUNJRklDX0NPTkZJRykpOworCisgICAgbnJPZlFtZkJhbmRzID0gbXBlZ1N1cnJvdW5kRGVjb2Rlcl9HZXROck9mUW1mQmFuZHMoCisgICAgICAgIHBTU0N0YXJnZXQsIHBTU0N0YXJnZXQtPnNhbXBsaW5nRnJlcSk7CisgICAgZXJyID0gRkRLX1NwYXRpYWxEZWNJbml0KAorICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMsCisgICAgICAgICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZXNbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdLAorICAgICAgICBwU1NDdGFyZ2V0LCBuck9mUW1mQmFuZHMsIHBNcGVnU3Vycm91bmREZWNvZGVyLT51cG1peFR5cGUsCisgICAgICAgICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBlZ1N1cnJvdW5kVXNlclBhcmFtcywgaW5pdEZsYWdzKTsKKworICAgIGlmIChlcnIgIT0gTVBTX09LKSBnb3RvIGJhaWw7CisKKyAgICAvKiBTaWduYWwgdGhhdCB3ZSBnb3QgYSBoZWFkZXIgYW5kIGNhbiBnbyBvbiBkZWNvZGluZyAqLworICAgIGlmIChlcnIgPT0gTVBTX09LKSB7CisgICAgICBpbml0RmxhZ3NEZWMgPSBNUEVHU19JTklUX09LOworICAgICAgeworICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+Zk9uU3luY1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV0gPQorICAgICAgICAgICAgTVBFR1NfU1lOQ19GT1VORDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworYmFpbDoKKyAgcE1wZWdTdXJyb3VuZERlY29kZXItPmluaXRGbGFnc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV0gPQorICAgICAgaW5pdEZsYWdzRGVjOworICByZXR1cm4gZXJyOworfQorCisvKioKKyAqIFxicmllZiBJbml0IE1QRUcgU3Vycm91bmQgZGVjb2Rlci4KKyAqKi8KK1NBQ0RFQ19FUlJPUiBtcGVnU3Vycm91bmREZWNvZGVyX0luaXQoCisgICAgQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisKKyAgaWYgKHBNcGVnU3Vycm91bmREZWNvZGVyLT5pbml0RmxhZ3NbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdKSB7CisgICAgZXJyID0gaW5pdE1wZWdTdXJyb3VuZERlY29kZXIocE1wZWdTdXJyb3VuZERlY29kZXIpOworICB9CisgIHJldHVybiBlcnI7Cit9CisKKy8qKgorICogXGJyaWVmIE9wZW4gTVBFRyBTdXJyb3VuZCBkZWNvZGVyLgorICoqLworc3RhdGljIFNBQ0RFQ19FUlJPUiBtcGVnU3Vycm91bmREZWNvZGVyX0NyZWF0ZSgKKyAgICBDTXBlZ1N1cnJvdW5kRGVjb2RlciAqKnBNcGVnU3Vycm91bmREZWNvZGVyLCBpbnQgc3RlcmVvQ29uZmlnSW5kZXgsCisgICAgSEFORExFX0ZES19RTUZfRE9NQUlOIHBRbWZEb21haW4pIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKyAgQ01wZWdTdXJyb3VuZERlY29kZXIgKnNhY0RlYyA9IE5VTEw7CisgIHNwYXRpYWxEZWMgKnNlbGYgPSBOVUxMOworCisgIC8qIGRlY29kZXJMZXZlbCAgZGVjb2Rlck1vZGUgIG1heE51bU91dHB1dENoYW5uZWxzICBiaW5hdXJhbE1vZGUgKi8KKyAgc3RhdGljIGNvbnN0IFNQQVRJQUxfREVDX0NPTkZJRyBkZWNDb25maWcgPSB7CisgICAgICAoQ0ZHX0xFVkVMKSgwKSwgRVhUX0hRX09OTFksIE9VVFBVVF9DSEFOTkVMU19ERUZBVUxULCBCSU5BVVJBTF9OT05FfTsKKworICBpZiAoKnBNcGVnU3Vycm91bmREZWNvZGVyID09IE5VTEwpIHsKKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKCpwTXBlZ1N1cnJvdW5kRGVjb2RlciwgMSwgQ01wZWdTdXJyb3VuZERlY29kZXIpCisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE7IGkrKykgeworICAgICAgZXJyID0gU3BhdGlhbERlY0NyZWF0ZUJzRnJhbWUoJigqcE1wZWdTdXJyb3VuZERlY29kZXIpLT5ic0ZyYW1lc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoKnBNcGVnU3Vycm91bmREZWNvZGVyKS0+bGxTdGF0ZSk7CisgICAgICBpZiAoZXJyICE9IE1QU19PSykgeworICAgICAgICBzYWNEZWMgPSAqcE1wZWdTdXJyb3VuZERlY29kZXI7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9CisgICAgKCpwTXBlZ1N1cnJvdW5kRGVjb2RlciktPnBRbWZEb21haW4gPSBwUW1mRG9tYWluOworCisgICAgKCpwTXBlZ1N1cnJvdW5kRGVjb2RlciktPmJzRnJhbWVEZWxheSA9IDE7CisgICAgKCpwTXBlZ1N1cnJvdW5kRGVjb2RlciktPmJzRnJhbWVQYXJzZSA9IDA7CisgICAgKCpwTXBlZ1N1cnJvdW5kRGVjb2RlciktPmJzRnJhbWVEZWNvZGUgPSAwOworCisgICAgcmV0dXJuIGVycjsKKyAgfSBlbHNlIHsKKyAgICBzYWNEZWMgPSAqcE1wZWdTdXJyb3VuZERlY29kZXI7CisgIH0KKworICBpZiAoc2FjRGVjLT5wU3BhdGlhbERlYyA9PSBOVUxMKSB7CisgICAgaWYgKChzZWxmID0gRkRLX1NwYXRpYWxEZWNPcGVuKCZkZWNDb25maWcsIHN0ZXJlb0NvbmZpZ0luZGV4KSkgPT0gTlVMTCkgeworICAgICAgZXJyID0gTVBTX09VVE9GTUVNT1JZOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzZWxmID0gc2FjRGVjLT5wU3BhdGlhbERlYzsKKyAgfQorCisgIHNlbGYtPnBRbWZEb21haW4gPSBzYWNEZWMtPnBRbWZEb21haW47CisKKyAgc2FjRGVjLT5wU3BhdGlhbERlYyA9IHNlbGY7CisKKyAgLyogZGVmYXVsdCBwYXJhbWV0ZXIgc2V0ICovCisgIHNhY0RlYy0+bXBlZ1N1cnJvdW5kVXNlclBhcmFtcy5vdXRwdXRNb2RlID0gU0FDREVDX09VVF9NT0RFX05PUk1BTDsKKyAgc2FjRGVjLT5tcGVnU3Vycm91bmRVc2VyUGFyYW1zLmJsaW5kRW5hYmxlID0gMDsKKyAgc2FjRGVjLT5tcGVnU3Vycm91bmRVc2VyUGFyYW1zLmJ5cGFzc01vZGUgPSAwOworICBzYWNEZWMtPm1wZWdTdXJyb3VuZFVzZXJQYXJhbXMuY29uY2VhbE1ldGhvZCA9IDE7CisgIHNhY0RlYy0+bXBlZ1N1cnJvdW5kVXNlclBhcmFtcy5jb25jZWFsTnVtS2VlcEZyYW1lcyA9IDEwOworICBzYWNEZWMtPm1wZWdTdXJyb3VuZFVzZXJQYXJhbXMuY29uY2VhbEZhZGVPdXRTbG9wZUxlbmd0aCA9IDU7CisgIHNhY0RlYy0+bXBlZ1N1cnJvdW5kVXNlclBhcmFtcy5jb25jZWFsRmFkZUluU2xvcGVMZW5ndGggPSA1OworICBzYWNEZWMtPm1wZWdTdXJyb3VuZFVzZXJQYXJhbXMuY29uY2VhbE51bVJlbGVhc2VGcmFtZXMgPSAzOworICBzYWNEZWMtPm1wZWdTdXJyb3VuZFNzY0lzR2xvYmFsQ2ZnID0gMDsKKyAgc2FjRGVjLT5tcGVnU3Vycm91bmRVc2VUaW1lSW50ZXJmYWNlID0gMTsKKyAgc2FjRGVjLT5tcGVnU3Vycm91bmREZWNvZGVyTGV2ZWwgPSBkZWNDb25maWcuZGVjb2RlckxldmVsOworCisgIHNhY0RlYy0+dXBtaXhUeXBlID0gVVBNSVhfVFlQRV9OT1JNQUw7CisKKyAgLyogc2lnbmFsaXplIHNwYXRpYWwgZGVjb2RlciByZS1pbml0YWxpemF0aW9uICovCisgIHVwZGF0ZU1wZWdTdXJyb3VuZERlY29kZXJTdGF0dXMoc2FjRGVjLCBNUEVHU19JTklUX0VORk9SQ0VfUkVJTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUdTX1NZTkNfTE9TVCwgTVBFR1NfU1RPUCk7CisKKyAgLyogcmV0dXJuIGRlY29kZXIgaW5zdGFuY2UgKi8KKyAgKnBNcGVnU3Vycm91bmREZWNvZGVyID0gc2FjRGVjOworICBzYWNEZWMtPmRlY0NvbmZpZyA9IGRlY0NvbmZpZzsKKworICBTcGF0aWFsRGVjSW5pdFBhcnNlckNvbnRleHQoc2FjRGVjLT5wU3BhdGlhbERlYyk7CisKKyAgcmV0dXJuIGVycjsKKworYmFpbDoKKyAgaWYgKHNhY0RlYyAhPSBOVUxMKSB7CisgICAgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9DbG9zZShzYWNEZWMpOworICB9CisgICpwTXBlZ1N1cnJvdW5kRGVjb2RlciA9IE5VTEw7CisgIGlmIChlcnIgPT0gTVBTX09LKSB7CisgICAgcmV0dXJuIE1QU19PVVRPRk1FTU9SWTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZXJyOworICB9Cit9CisKKy8qKgorICogXGJyaWVmIENvbmZpZyBNUEVHIFN1cnJvdW5kIGRlY29kZXIuCisgKiovCitTQUNERUNfRVJST1IgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9Db25maWcoCisgICAgQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLCBJTlQgc2FtcGxpbmdSYXRlLCBJTlQgc3RlcmVvQ29uZmlnSW5kZXgsCisgICAgSU5UIGNvcmVTYnJGcmFtZUxlbmd0aEluZGV4LCBJTlQgY29uZmlnQnl0ZXMsIGNvbnN0IFVDSEFSIGNvbmZpZ01vZGUsCisgICAgVUNIQVIgKmNvbmZpZ0NoYW5nZWQpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKyAgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgc3BhdGlhbFNwZWNpZmljQ29uZmlnOworCisgIHN3aXRjaCAoY29yZUNvZGVjKSB7CisgICAgY2FzZSBBT1RfRFJNX1VTQUM6CisgICAgY2FzZSBBT1RfVVNBQzoKKyAgICAgIGlmIChjb25maWdNb2RlID09IEFDX0NNX0RFVF9DRkdfQ0hBTkdFKSB7CisgICAgICAgIC8qIEluIGNvbmZpZyBkZXRlY3Rpb24gbW9kZSB3cml0ZSBzcGF0aWFsIHNwZWNpZmljIGNvbmZpZyBwYXJhbWV0ZXJzCisgICAgICAgICAqIGludG8gdGVtcG9yYXJpbHkgYWxsb2NhdGVkIHN0cnVjdHVyZSAqLworICAgICAgICBlcnIgPSBTcGF0aWFsRGVjUGFyc2VNcHMyMTJDb25maWcoCisgICAgICAgICAgICBoQnMsICZzcGF0aWFsU3BlY2lmaWNDb25maWcsIHNhbXBsaW5nUmF0ZSwgY29yZUNvZGVjLAorICAgICAgICAgICAgc3RlcmVvQ29uZmlnSW5kZXgsIGNvcmVTYnJGcmFtZUxlbmd0aEluZGV4KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IFNwYXRpYWxEZWNQYXJzZU1wczIxMkNvbmZpZygKKyAgICAgICAgICAgIGhCcywgJnBNcGVnU3Vycm91bmREZWNvZGVyLT5zcGF0aWFsU3BlY2lmaWNDb25maWdCYWNrdXAsCisgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIGNvcmVDb2RlYywgc3RlcmVvQ29uZmlnSW5kZXgsCisgICAgICAgICAgICBjb3JlU2JyRnJhbWVMZW5ndGhJbmRleCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKKyAgICAgIGlmIChjb25maWdNb2RlID09IEFDX0NNX0RFVF9DRkdfQ0hBTkdFKSB7CisgICAgICAgIC8qIEluIGNvbmZpZyBkZXRlY3Rpb24gbW9kZSB3cml0ZSBzcGF0aWFsIHNwZWNpZmljIGNvbmZpZyBwYXJhbWV0ZXJzCisgICAgICAgICAqIGludG8gdGVtcG9yYXJpbHkgYWxsb2NhdGVkIHN0cnVjdHVyZSAqLworICAgICAgICBlcnIgPSBTcGF0aWFsRGVjUGFyc2VTcGVjaWZpY0NvbmZpZyhoQnMsICZzcGF0aWFsU3BlY2lmaWNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0J5dGVzLCBjb3JlQ29kZWMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gU3BhdGlhbERlY1BhcnNlU3BlY2lmaWNDb25maWcoCisgICAgICAgICAgICBoQnMsICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+c3BhdGlhbFNwZWNpZmljQ29uZmlnQmFja3VwLAorICAgICAgICAgICAgY29uZmlnQnl0ZXMsIGNvcmVDb2RlYyk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZXJyID0gTVBTX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKGVyciAhPSBNUFNfT0spIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICBpZiAoY29uZmlnTW9kZSAmIEFDX0NNX0RFVF9DRkdfQ0hBTkdFKSB7CisgICAgcmV0dXJuIGVycjsKKyAgfQorCisgIGlmIChjb25maWdNb2RlICYgQUNfQ01fQUxMT0NfTUVNKSB7CisgICAgaWYgKCpjb25maWdDaGFuZ2VkKSB7CisgICAgICBpZiAoKGVyciA9IG1wZWdTdXJyb3VuZERlY29kZXJfT3BlbigmcE1wZWdTdXJyb3VuZERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVyZW9Db25maWdJbmRleCwgTlVMTCkpKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgeworICAgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpzc2NQYXJzZSA9CisgICAgICAgICZwTXBlZ1N1cnJvdW5kRGVjb2RlcgorICAgICAgICAgICAgIC0+c3BhdGlhbFNwZWNpZmljQ29uZmlnW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lUGFyc2VdOworCisgICAgaWYgKEZES19TcGF0aWFsRGVjQ29tcGFyZVNwYXRpYWxTcGVjaWZpY0NvbmZpZ0hlYWRlcigKKyAgICAgICAgICAgICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+c3BhdGlhbFNwZWNpZmljQ29uZmlnQmFja3VwLCBzc2NQYXJzZSkpIHsKKyAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5pbml0RmxhZ3NbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVQYXJzZV0gfD0KKyAgICAgICAgICBNUEVHU19JTklUX0NIQU5HRV9IRUFERVI7CisgICAgICAvKiBFcnJvciByZXNpbGllbmNlIGNvZGUgKi8KKyAgICAgIGlmIChwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMgPT0gTlVMTCkgeworICAgICAgICBlcnIgPSBNUFNfTk9UT0s7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIFNwYXRpYWxEZWNJbml0UGFyc2VyQ29udGV4dChwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMpOworICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPnBTcGF0aWFsRGVjLT5wQ29uZmlnQ3VycmVudCA9CisgICAgICAgICAgJnBNcGVnU3Vycm91bmREZWNvZGVyCisgICAgICAgICAgICAgICAtPnNwYXRpYWxTcGVjaWZpY0NvbmZpZ1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV07CisgICAgfQorICB9CisKKyAgaWYgKGVyciA9PSBNUFNfT0spIHsKKyAgICAvKiBXZSBnb3QgYSB2YWxpZCBvdXQtb2YtYmFuZCBjb25maWd1cmF0aW9uIHNvIGxhYmVsIGl0IGFjY29yZGluZ2x5LiAqLworICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5tcGVnU3Vycm91bmRTc2NJc0dsb2JhbENmZyA9IDE7CisgIH0KKworYmFpbDoKKyAgcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBcYnJpZWYgRGV0ZXJtaW5lIE1QRUcgU3Vycm91bmQgb3BlcmF0aW9uIG1vZGUuCisgKiovCitzdGF0aWMgTVBFR1NfT1BNT0RFIG1wZWdTdXJyb3VuZE9wZXJhdGlvbk1vZGUoCisgICAgQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyLCBpbnQgbXBzRGF0YUJpdHMpIHsKKyAgTVBFR1NfT1BNT0RFIG1vZGU7CisKKyAgeworICAgIGlmICgobXBzRGF0YUJpdHMgPiAwKSAmJgorICAgICAgICAocE1wZWdTdXJyb3VuZERlY29kZXItPm1wZWdTdXJyb3VuZFVzZXJQYXJhbXMuYmxpbmRFbmFibGUgPT0gMCkpIHsKKyAgICAgIG1vZGUgPSBNUEVHU19PUE1PREVfTVBTX1BBWUxPQUQ7IC8qIE1vZGU6IE5vcm1hbCwgU3RlcmVvIG9yIEJpbmF1cmFsICovCisgICAgfSBlbHNlIHsKKyAgICAgIG1vZGUgPSBNUEVHU19PUE1PREVfTk9fTVBTX1BBWUxPQUQ7IC8qIE1vZGU6IE5vIE1QRUcgU3Vycm91bmQgUGF5bG9hZCAqLworICAgICAgdXBkYXRlTXBlZ1N1cnJvdW5kRGVjb2RlclN0YXR1cyhwTXBlZ1N1cnJvdW5kRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFR1NfSU5JVF9FUlJPUl9QQVlMT0FELCBNUEVHU19TWU5DX0xPU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUdTX1NUT1ApOworICAgIH0KKyAgfQorCisgIHJldHVybiAobW9kZSk7Cit9CisKKy8qKgorICogXGJyaWVmICBDaGVjayBzc2MgZm9yIHBhcnNlIGVycm9ycy4KKyAqICAgICAgICAgVGhpcyBvbmUgaXMgY2FsbGVkIGluIGluaXRNcGVnU3Vycm91bmREZWNvZGVyKCkKKyAqICAgICAgICAgdG8gZW5zdXJlIGNoZWNraW5nIG9mIGluYmFuZCBhbmQgb3V0LW9mLWJhbmQgbXBzIGNvbmZpZ3MuCisgKiAgICAgICAgIE9ubHkgcGFyc2UgZXJyb3JzIGNoZWNrZWQgaGVyZSEgQ2hlY2sgZm9yIHZhbGlkIGNvbmZpZyBpcyBkb25lCisgKiAgICAgICAgIGluIGNoZWNrX1VQYXJhbV9CdWlsZF9EZWNDb25maWcoKSEKKyAqCisgKiBccGFyYW0gcFNzYyAgICAgICAgIHNwYXRpYWwgc3BlY2lmaWMgY29uZmlnIGhhbmRsZS4KKyAqCisgKiBccmV0dXJuICBNUFNfT0sgb24gc3VjZXNzLCBhbmQgZWxzZSBvbiBwYXJzZSBlcnJvci4KKyAqLworc3RhdGljIFNBQ0RFQ19FUlJPUiBzc2NQYXJzZUNoZWNrKGNvbnN0IFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpwU3NjKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisKKyAgaWYgKHBTc2MtPnNhbXBsaW5nRnJlcSA+IDk2MDAwKSByZXR1cm4gTVBTX1BBUlNFX0VSUk9SOworICBpZiAocFNzYy0+c2FtcGxpbmdGcmVxIDwgODAwMCkgcmV0dXJuIE1QU19QQVJTRV9FUlJPUjsKKworICBzd2l0Y2ggKHBTc2MtPmZyZXFSZXMpIHsKKyAgICBjYXNlIFNQQVRJQUxERUNfRlJFUV9SRVNfMjg6CisgICAgY2FzZSBTUEFUSUFMREVDX0ZSRVFfUkVTXzIwOgorICAgIGNhc2UgU1BBVElBTERFQ19GUkVRX1JFU18xNDoKKyAgICBjYXNlIFNQQVRJQUxERUNfRlJFUV9SRVNfMTA6CisgICAgY2FzZSBTUEFUSUFMREVDX0ZSRVFfUkVTXzIzOgorICAgIGNhc2UgU1BBVElBTERFQ19GUkVRX1JFU18xNToKKyAgICBjYXNlIFNQQVRJQUxERUNfRlJFUV9SRVNfMTI6CisgICAgY2FzZSBTUEFUSUFMREVDX0ZSRVFfUkVTXzk6CisgICAgY2FzZSBTUEFUSUFMREVDX0ZSRVFfUkVTXzc6CisgICAgY2FzZSBTUEFUSUFMREVDX0ZSRVFfUkVTXzU6CisgICAgY2FzZSBTUEFUSUFMREVDX0ZSRVFfUkVTXzQ6CisgICAgICBicmVhazsKKyAgICBjYXNlIFNQQVRJQUxERUNfRlJFUV9SRVNfNDA6IC8qIDQwIGRvZXNuJ3QgZXhpc3QgaW4gSVNPL0lFQyAyMzAwMy0xICovCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBNUFNfUEFSU0VfRVJST1I7CisgIH0KKworICBpZiAoKHBTc2MtPnRyZWVDb25maWcgPCAwKSB8fCAocFNzYy0+dHJlZUNvbmZpZyA+IDcpKSB7CisgICAgcmV0dXJuIE1QU19QQVJTRV9FUlJPUjsKKyAgfQorCisgIGlmICgocFNzYy0+cXVhbnRNb2RlIDwgMCkgfHwgKHBTc2MtPnF1YW50TW9kZSA+IDIpKSB7CisgICAgcmV0dXJuIE1QU19QQVJTRV9FUlJPUjsKKyAgfQorCisgIGlmIChwU3NjLT50ZW1wU2hhcGVDb25maWcgPT0gMykgeworICAgIHJldHVybiBNUFNfUEFSU0VfRVJST1I7CisgIH0KKworICBpZiAocFNzYy0+ZGVjb3JyQ29uZmlnID09IDMpIHsKKyAgICByZXR1cm4gTVBTX1BBUlNFX0VSUk9SOworICB9CisKKyAgLyogbm93IHdlIGFyZSBzdXJlIHRoZXJlIHdlcmUgbm8gcGFyc2luZyBlcnJvcnMgKi8KKworICByZXR1cm4gZXJyOworfQorCisvKioKKyAqIFxicmllZiAgQ2hlY2sgbnVtYmVyIG9mIHRpbWUgc2xvdHMKKyAqCisgKiBCYXNpY2FsbHkgdGhlIG1wcyBmcmFtZSBsZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjb3JlIGNvZGVyIGZyYW1lCisgKiBsZW5ndGguIFRoZSBiZWxvdyB0YWJsZSBzaG93cyBhbGwgdmFsaWQgY29uZmlndXJhdGlvbnMgaW4gZGV0YWlsLiBTZWUgSVNPL0lFQworICogMjMwMDMtMTogIlRhYmxlIDRBIC0gQWxsb3dlZCB2YWx1ZXMgZm9yIGJzRnJhbWVMZW5ndGggaW4gdGhlIEJhc2VsaW5lIE1QRUcKKyAqIFN1cnJvdW5kIFByb2ZpbGUiCisgKgorICogRG93bm1peCBDb2RlciAgICAgICAgRG93bm1peCBDb2RlICAgICAgQWxsb3dlZCB2YWx1ZXMgZm9yIGJzRnJhbWVMZW5ndGgKKyAqIEFsbG93ZWQgZnJhbWUgc2l6ZXMgZm9yIG5vcm1hbCwgZG93bnNhbXBsZWQgYW5kIHVwc2FtcGxlZCBNUFMgRnJhbWVsZW5ndGgKKyAqICAgICAgICAgICAgICAgICAgICAgIChRTUYgU2FtcGxlcykKKyAqCisgKiBBQUMgMTAyNCAgICAgICAgICAgICAgICAgIDE2ICAgICAgICAgICAxNSwgMzEsIDQ3LCA2MyAxMDI0ICAyMDQ4ICAzMDcyICA0MDk2CisgKiBkb3duc2FtcGxlZCBNUFMgICAgICAgICAgIDMyICAgICAgICAgICAzMSwgNjMgMTAyNCAgMjA0OCB1cHNhbXBsZWQgTVBTCisgKiA4ICAgICAgICAgICAgNywgMTUsIDIzLCAzMSwgMzksIDQ3LCA1NSwgNjMsIDcxICAgIDEwMjQgIDIwNDggIDMwNzIgIDQwOTYKKyAqIDUxMjAgIDYxNDQgIDcxNjggIDgxOTIgIDkyMTYKKyAqCisgKiBBQUMgOTYwICAgICAgICAgICAgICAgICAgIDE1ICAgICAgICAgICAxNCwgMjksIDQ0LCA1OSA5NjAgIDE5MjAgIDI4ODAgIDM4NDAKKyAqIGRvd25zYW1wbGVkIE1QUyAgICAgICAgICAgMzAgICAgICAgICAgIDI5LCA1OSA5NjAgIDE5MjAgdXBzYW1wbGVkIE1QUworICogNyw1ICAgICAgICAgICAxNCwgMjksIDQ0LCA1OSAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAgIDM4NDAgIDU3NjAgIDc2ODAKKyAqCisgKiBIRS1BQUMgMTAyNC8yMDQ4ICAgICAgICAgIDMyICAgICAgICAgICAzMSwgNjMgMjA0OCAgNDA5NiBkb3duc2FtcGxlZCBNUFMKKyAqIDY0ICAgICAgICAgICA2MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNDggdXBzYW1wbGVkIE1QUworICogMTYgICAgICAgICAgIDE1LCAzMSwgNDcsIDYzICAgICAgICAgICAgICAgICAgICAgICAgMjA0OCAgNDA5NiAgNjE0NCAgODE5MgorICoKKyAqIEhFLUFBQyA5NjAvMTkyMCAgICAgICAgICAgMzAgICAgICAgICAgIDI5LCA1OSAxOTIwICAzODQwIGRvd25zYW1wbGVkIE1QUworICogNjAgICAgICAgICAgIDU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMCB1cHNhbXBsZWQgTVBTCisgKiAxNSAgICAgICAgICAgMTQsIDI5LCA0NCwgNTkgICAgICAgICAgICAgICAgICAgICAgICAxOTIwICAzODQwICA1NzYwICA3NjgwCisgKgorICogQlNBQyAgICAgICAgICAgICAgICAgICAgICAxNiAgICAgICAgICAgMTUsIDMxLCA0NywgNjMgMTAyNCAgMjA0OCAgMzA3MiAgNDA5NgorICogZG93bnNhbXBsZWQgTVBTICAgICAgICAgICAzMiAgICAgICAgICAgMzEsIDYzIDEwMjQgIDIwNDggdXBzYW1wbGVkIE1QUworICogOCAgICAgICAgICAgIDcsIDE1LCAyMywgMzEsIDM5LCA0NywgNTUsIDYzLCA3MSAgICAxMDI0ICAyMDQ4ICAzMDcyICA0MDk2CisgKiA1MTIwICA2MTQ0ICA3MTY4ICA4MTkyICA5MjE2CisgKgorICogQlNBQyB3aXRoIFNCUiAgICAgICAgICAgICAzMiAgICAgICAgICAgMzEsIDYzIDIwNDggIDQwOTYgZG93bnNhbXBsZWQgTVBTCisgKiA2NCAgICAgICAgICAgNjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4IHVwc2FtcGxlZCBNUFMKKyAqIDE2ICAgICAgICAgICAxNSwgMzEsIDQ3LCA2MyAgICAgICAgICAgICAgICAgICAgICAgIDIwNDggIDQwOTYgIDYxNDQgIDgxOTIKKyAqCisgKiBBQUMgTEQgNTEyICAgICAgICAgICAgICAgICA4ICAgICAgICAgICAgNywgMTUsIDIzLCAzMSwgMzksIDQ3LCA1NSwgNjMsIDcxCisgKiA1MTIgIDEwMjQgIDE1MzYgIDIwNDggIDI1NjAgIDMwNzIgIDM1ODQgIDQwOTYgIDQ2MDggZG93bnNhbXBsZWQgTVBTCisgKiAxNiAgICAgICAgICAgMTUsIDMxLCA0NywgNjMgICAgICAgICAgICAgICAgICAgICAgICAgNTEyICAxMDI0ICAxNTM2ICAyMDQ4CisgKgorICogQUFDIEVMRCA1MTIgICAgICAgICAgICAgICAgOCAgICAgICAgICAgIDcsIDE1LCAyMywgMzEsIDM5LCA0NywgNTUsIDYzLCA3MQorICogNTEyICAxMDI0ICAxNTM2ICAyMDQ4ICAyNTYwICAzMDcyICAzNTg0ICA0MDk2ICA0NjA4IGRvd25zYW1wbGVkIE1QUworICogMTYgICAgICAgICAgIDE1LCAzMSwgNDcsIDYzICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiAgMTAyNCAgMTUzNiAgMjA0OAorICoKKyAqIEFBQyBFTEQgd2l0aCBTQlIgNTEyLzEwMjQgMTYgICAgICAgICAgIDE1LCAzMSwgNDcsIDYzIDEwMjQgIDIwNDggIDMwNzIgIDQwOTYKKyAqIGRvd25zYW1wbGVkIE1QUyAgICAgICAgICAgMzIgICAgICAgICAgIDMxLCA2MyAxMDI0ICAyMDQ4IHVwc2FtcGxlZCBNUFMKKyAqIDggICAgICAgICAgICA3LCAxNSwgMjMsIDMxLCAzOSwgNDcsIDU1LCA2MywgNzEgICAgMTAyNCAgMjA0OCAgMzA3MiAgNDA5NgorICogNTEyMCAgNjE0NCAgNzE2OCAgODE5MiAgOTIxNgorICoKKyAqIE1QRUcxLzIgTGF5ZXIgSUkgICAgICAgICAgMTggICAgICAgICAgIDE3LCAzNSwgNTMsIDcxIDExNTIgIDIzMDQgIDM0NTYgIDQ2MDgKKyAqIGRvd25zYW1wbGVkIE1QUyAgICAgICAgICAgMzYgICAgICAgICAgIDM1LCA3MSAxMTUyICAyMzA0CisgKgorICogTVBFRzEvMiBMYXllciBJSUkgICAgICAgICAxOCAgICAgICAgICAgMTcsIDM1LCA1MywgNzEgMTE1MiAgMjMwNCAgMzQ1NiAgNDYwOAorICogZG93bnNhbXBsZWQgTVBTICAgICAgICAgICAzNiAgICAgICAgICAgMzUsIDcxIDExNTIgIDIzMDQKKyAqCisgKiBccGFyYW0gZnJhbWVMZW5ndGgKKyAqIFxwYXJhbSBxbWZCYW5kcworICogXHBhcmFtIHRpbWVTbG90cworICoKKyAqIFxyZXR1cm4gIGVycm9yIGNvZGUKKyAqLworU0FDREVDX0VSUk9SIGNoZWNrVGltZVNsb3RzKGludCBmcmFtZUxlbmd0aCwgaW50IHFtZkJhbmRzLCBpbnQgdGltZVNsb3RzKSB7CisgIGludCBsZW47CisgIGludCBtYXhGcmFtZUxlbmd0aDsKKworICBpZiAocW1mQmFuZHMgPT0gNjQpIHsKKyAgICAvKiBub3JtYWwgTVBFRyBTdXJyb3VuZCAqLworICAgIHN3aXRjaCAoZnJhbWVMZW5ndGgpIHsKKyAgICAgIGNhc2UgOTYwOgorICAgICAgY2FzZSAxOTIwOgorICAgICAgICBtYXhGcmFtZUxlbmd0aCA9IDM4NDA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMDI0OgorICAgICAgY2FzZSAyMDQ4OgorICAgICAgICBtYXhGcmFtZUxlbmd0aCA9IDQwOTY7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1MTI6CisgICAgICBjYXNlIDExNTI6CisgICAgICAgIG1heEZyYW1lTGVuZ3RoID0gNDYwODsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTVBTX1BBUlNFX0VSUk9SOworICAgIH0KKyAgfSBlbHNlIGlmIChxbWZCYW5kcyA9PSAzMikgeworICAgIC8qIGRvd25zYW1wbGVkIE1QRUcgU3Vycm91bmQgKi8KKyAgICBzd2l0Y2ggKGZyYW1lTGVuZ3RoKSB7CisgICAgICBjYXNlIDk2MDoKKyAgICAgIGNhc2UgMTkyMDoKKyAgICAgICAgbWF4RnJhbWVMZW5ndGggPSAxOTIwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNTEyOgorICAgICAgY2FzZSAxMDI0OgorICAgICAgY2FzZSAyMDQ4OgorICAgICAgICBtYXhGcmFtZUxlbmd0aCA9IDIwNDg7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMTUyOgorICAgICAgICBtYXhGcmFtZUxlbmd0aCA9IDIzMDQ7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE1QU19QQVJTRV9FUlJPUjsKKyAgICB9CisgIH0gZWxzZSBpZiAocW1mQmFuZHMgPT0gMTI4KSB7CisgICAgLyogdXBzYW1wbGVkIE1QRUcgU3Vycm91bmQgKi8KKyAgICBzd2l0Y2ggKGZyYW1lTGVuZ3RoKSB7CisgICAgICBjYXNlIDE5MjA6CisgICAgICAgIG1heEZyYW1lTGVuZ3RoID0gNzY4MDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEwMjQ6CisgICAgICAgIG1heEZyYW1lTGVuZ3RoID0gOTIxNjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIwNDg6CisgICAgICAgIG1heEZyYW1lTGVuZ3RoID0gODE5MjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDUxMjoKKyAgICAgIGNhc2UgOTYwOgorICAgICAgY2FzZSAxMTUyOgorICAgICAgLyogbm8gYnJlYWssIG5vIHN1cHBvcnQgZm9yIHVwc2FtcGxlZCBNUEVHIFN1cnJvdW5kICovCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTVBTX1BBUlNFX0VSUk9SOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTVBTX1BBUlNFX0VSUk9SOworICB9CisKKyAgbGVuID0gZnJhbWVMZW5ndGg7CisKKyAgd2hpbGUgKGxlbiA8PSBtYXhGcmFtZUxlbmd0aCkgeworICAgIGlmIChsZW4gPT0gdGltZVNsb3RzICogcW1mQmFuZHMpIHsKKyAgICAgIHJldHVybiBNUFNfT0s7CisgICAgfQorICAgIGxlbiArPSBmcmFtZUxlbmd0aDsKKyAgfQorICByZXR1cm4gTVBTX1BBUlNFX0VSUk9SOworfQorCisvKioKKyAqIFxicmllZiAgQ2hlY2sgc3NjIGZvciBjb25zaXN0ZW5jeSAoZS5nLiBiaXQgZXJyb3JzIGNvdWxkIGNhdXNlIHRyb3VibGUpCisgKiAgICAgICAgIEZpcnN0IG9mIGN1cnJlbnRseSB0d28gc3NjLWNoZWNrcy4KKyAqICAgICAgICAgVGhpcyAob2xkKSBvbmUgaXMgY2FsbGVkIGluIG1wZWdTdXJyb3VuZERlY29kZXJfQXBwbHkoKQorICogICAgICAgICBvbmx5IGlmIGluYmFuZCBtcHMgY29uZmlnIGlzIGNvbnRhaW5lZCBpbiBzdHJlYW0uCisgKgorICogICAgICAgICBOZXcgc3NjIGNoZWNrIGlzIHNwbGl0IGluIHR3byBmdW5jdGlvbnMgc3NjUGFyc2VDaGVjaygpIGFuZAorICogY2hlY2tfVVBhcmFtX0J1aWxkX0RlY0NvbmZpZygpLiBzc2NQYXJzZUNoZWNrKCkgY2hlY2tzIG9ubHkgZm9yIGNvcnJlY3QKKyAqIHBhcnNpbmcuIGNoZWNrX1VQYXJhbV9CdWlsZF9EZWNDb25maWcoKSBpcyB1c2VkIHRvIGNoZWNrIGlmIHdlIGhhdmUgYQorICogdmFsaWQgY29uZmlnLiBCb3RoIGFyZSBjYWxsZWQgaW4gaW5pdE1wZWdTdXJyb3VuZERlY29kZXIoKSB0byBlbnN1cmUKKyAqIGNoZWNraW5nIG9mIGluYmFuZCBhbmQgb3V0LW9mLWJhbmQgbXBzIGNvbmZpZ3MuCisgKgorICogICAgICAgICBJZiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBpbnRlZ3JhdGVkIGludG8gdGhlIG5ldyBmdW5jdGlvbnMuCisgKiAgICAgICAgIFdlIGNhbiByZW1vdmUgdGhpcyBvbmUuCisgKgorICogXHBhcmFtIHBTc2MgICAgICAgICBzcGF0aWFsIHNwZWNpZmljIGNvbmZpZyBoYW5kbGUuCisgKiBccGFyYW0gZnJhbWVMZW5ndGgKKyAqIFxwYXJhbSBzYW1wbGVSYXRlCisgKgorICogXHJldHVybiAgTVBTX09LIG9uIHN1Y2VzcywgYW5kIGVsc2Ugb24gZmFpbHVyZS4KKyAqLworc3RhdGljIFNBQ0RFQ19FUlJPUiBzc2NDaGVja0luQmFuZChTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqcFNzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lTGVuZ3RoLCBpbnQgc2FtcGxlUmF0ZSkgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworICBpbnQgcW1mQmFuZHM7CisKKyAgRkRLX0FTU0VSVChwU3NjICE9IE5VTEwpOworCisgIC8qIGNvcmUgZnMgYW5kIG1wcyBmcyBtdXN0IG1hdGNoICovCisgIGlmIChwU3NjLT5zYW1wbGluZ0ZyZXEgIT0gc2FtcGxlUmF0ZSkgeworICAgIGVyciA9IE1QU19QQVJTRV9FUlJPUiAvKiBNUEVHU0RFQ19TU0NfUEFSU0VfRVJST1IgKi87CisgIH0KKworICBxbWZCYW5kcyA9IG1wZWdTdXJyb3VuZERlY29kZXJfR2V0TnJPZlFtZkJhbmRzKHBTc2MsIHBTc2MtPnNhbXBsaW5nRnJlcSk7CisKKyAgaWYgKGNoZWNrVGltZVNsb3RzKGZyYW1lTGVuZ3RoLCBxbWZCYW5kcywgcFNzYy0+blRpbWVTbG90cykgIT0gTVBTX09LKSB7CisgICAgZXJyID0gTVBTX1BBUlNFX0VSUk9SOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworU0FDREVDX0VSUk9SCittcGVnU3Vycm91bmREZWNvZGVyX0NvbmZpZ3VyZVFtZkRvbWFpbigKKyAgICBDTXBlZ1N1cnJvdW5kRGVjb2RlciAqcE1wZWdTdXJyb3VuZERlY29kZXIsCisgICAgU0FDX0lOUFVUX0NPTkZJRyBzYWNfZGVjX2ludGVyZmFjZSwgVUlOVCBjb3JlU2FtcGxpbmdSYXRlLAorICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYykgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworICBGREtfUU1GX0RPTUFJTl9HQyAqcEdDID0gTlVMTDsKKworICBpZiAocE1wZWdTdXJyb3VuZERlY29kZXIgPT0gTlVMTCkgeworICAgIHJldHVybiBNUFNfSU5WQUxJRF9IQU5ETEU7CisgIH0KKworICBGREtfQVNTRVJUKHBNcGVnU3Vycm91bmREZWNvZGVyLT5wU3BhdGlhbERlYyk7CisKKyAgcEdDID0gJnBNcGVnU3Vycm91bmREZWNvZGVyLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mOworICBpZiAocE1wZWdTdXJyb3VuZERlY29kZXItPm1wZWdTdXJyb3VuZFNzY0lzR2xvYmFsQ2ZnKSB7CisgICAgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnBTU0MgPQorICAgICAgICAmcE1wZWdTdXJyb3VuZERlY29kZXItPnNwYXRpYWxTcGVjaWZpY0NvbmZpZ0JhY2t1cDsKKyAgICBpZiAoc2FjX2RlY19pbnRlcmZhY2UgPT0gU0FDX0lOVEVSRkFDRV9USU1FKSB7CisgICAgICAvKiBGb3IgU0FDX0lOVEVSRkFDRV9RTUYgdGhlc2UgcGFyYW1ldGVycyBhcmUgc2V0IGJ5IFNCUi4gKi8KKyAgICAgIHBHQy0+bkJhbmRzQW5hbHlzaXNfcmVxdWVzdGVkID0gbXBlZ1N1cnJvdW5kRGVjb2Rlcl9HZXROck9mUW1mQmFuZHMoCisgICAgICAgICAgcFNTQywgY29yZVNhbXBsaW5nUmF0ZSk7IC8qIGNvcmVTYW1wbGluZ1JhdGUgPT0gb3V0cHV0U2FtcGxpbmdSYXRlIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQUNfSU5URVJGQUNFX1RJTUUgKi8KKyAgICAgIHBHQy0+bkJhbmRzU3ludGhlc2lzX3JlcXVlc3RlZCA9IHBHQy0+bkJhbmRzQW5hbHlzaXNfcmVxdWVzdGVkOworICAgICAgcEdDLT5uSW5wdXRDaGFubmVsc19yZXF1ZXN0ZWQgPQorICAgICAgICAgIGZNYXgoKFVJTlQpcFNTQy0+bklucHV0Q2hhbm5lbHMsIChVSU5UKXBHQy0+bklucHV0Q2hhbm5lbHNfcmVxdWVzdGVkKTsKKyAgICB9CisgICAgcEdDLT5uT3V0cHV0Q2hhbm5lbHNfcmVxdWVzdGVkID0KKyAgICAgICAgZk1heCgoVUlOVClwU1NDLT5uT3V0cHV0Q2hhbm5lbHMsIChVSU5UKXBHQy0+bk91dHB1dENoYW5uZWxzX3JlcXVlc3RlZCk7CisgIH0gZWxzZSB7CisgICAgaWYgKHNhY19kZWNfaW50ZXJmYWNlID09IFNBQ19JTlRFUkZBQ0VfVElNRSkgeworICAgICAgLyogRm9yIFNBQ19JTlRFUkZBQ0VfUU1GIHRoZXNlIHBhcmFtZXRlcnMgYXJlIHNldCBieSBTQlIuICovCisgICAgICBwR0MtPm5CYW5kc0FuYWx5c2lzX3JlcXVlc3RlZCA9IG1wZWdTdXJyb3VuZERlY29kZXJfR2V0TnJPZlFtZkJhbmRzKAorICAgICAgICAgIE5VTEwsIGNvcmVTYW1wbGluZ1JhdGUpOyAvKiBjb3JlU2FtcGxpbmdSYXRlID09IG91dHB1dFNhbXBsaW5nUmF0ZSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FDX0lOVEVSRkFDRV9USU1FICovCisgICAgICBwR0MtPm5CYW5kc1N5bnRoZXNpc19yZXF1ZXN0ZWQgPSBwR0MtPm5CYW5kc0FuYWx5c2lzX3JlcXVlc3RlZDsKKyAgICAgIHBHQy0+bklucHV0Q2hhbm5lbHNfcmVxdWVzdGVkID0KKyAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMtPmNyZWF0ZVBhcmFtcy5tYXhOdW1JbnB1dENoYW5uZWxzOworICAgIH0KKyAgICBwR0MtPm5PdXRwdXRDaGFubmVsc19yZXF1ZXN0ZWQgPQorICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMtPmNyZWF0ZVBhcmFtcy5tYXhOdW1PdXRwdXRDaGFubmVsczsKKyAgfQorICBwR0MtPm5RbWZQcm9jQmFuZHNfcmVxdWVzdGVkID0gNjQ7CisgIHBHQy0+blFtZlByb2NDaGFubmVsc19yZXF1ZXN0ZWQgPQorICAgICAgZk1pbigoSU5UKXBHQy0+bklucHV0Q2hhbm5lbHNfcmVxdWVzdGVkLAorICAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMtPmNyZWF0ZVBhcmFtcy5tYXhOdW1JbnB1dENoYW5uZWxzKTsKKworICBpZiAoY29yZUNvZGVjID09IEFPVF9FUl9BQUNfRUxEKSB7CisgICAgcEdDLT5mbGFnc19yZXF1ZXN0ZWQgfD0gUU1GX0ZMQUdfTVBTTERGQjsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKy8qKgorICogXGJyaWVmIERlY29kZSBNUEVHIFN1cnJvdW5kIGZyYW1lLgorICoqLworaW50IG1wZWdTdXJyb3VuZERlY29kZXJfUGFyc2VOb0hlYWRlcigKKyAgICBDTXBlZ1N1cnJvdW5kRGVjb2RlciAqcE1wZWdTdXJyb3VuZERlY29kZXIsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICBpbnQgKnBNcHNEYXRhQml0cywgaW50IGZHbG9iYWxJbmRlcGVuZGVuY3lGbGFnKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHICpzc2NQYXJzZTsKKyAgaW50IGJpdHNBdmFpbCwgbnVtU2FjQml0czsKKworICBpZiAocE1wZWdTdXJyb3VuZERlY29kZXIgPT0gTlVMTCB8fCBoQnMgPT0gTlVMTCkgeworICAgIHJldHVybiBNUFNfSU5WQUxJRF9IQU5ETEU7CisgIH0KKworICBzc2NQYXJzZSA9ICZwTXBlZ1N1cnJvdW5kRGVjb2RlcgorICAgICAgICAgICAgICAgICAgLT5zcGF0aWFsU3BlY2lmaWNDb25maWdbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVQYXJzZV07CisKKyAgYml0c0F2YWlsID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisKKyAgLyogRmlyc3Qgc3BhdGlhbCBzcGVjaWZpYyBjb25maWcgaXMgcGFyc2VkIGludG8gc3BhdGlhbFNwZWNpZmljQ29uZmlnQmFja3VwLAorICAgKiBzZWNvbmQgc3BhdGlhbFNwZWNpZmljQ29uZmlnQmFja3VwIGlzIGNvcGllZCBpbnRvCisgICAqIHNwYXRpYWxTcGVjaWZpY0NvbmZpZ1tic0ZyYW1lRGVjb2RlXSAqLworICBpZiAocE1wZWdTdXJyb3VuZERlY29kZXItPmluaXRGbGFnc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZVBhcnNlXSkgeworICAgIEZES21lbWNweShzc2NQYXJzZSwgJnBNcGVnU3Vycm91bmREZWNvZGVyLT5zcGF0aWFsU3BlY2lmaWNDb25maWdCYWNrdXAsCisgICAgICAgICAgICAgIHNpemVvZihTUEFUSUFMX1NQRUNJRklDX0NPTkZJRykpOworICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5mT25TeW5jW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lUGFyc2VdID0KKyAgICAgICAgTVBFR1NfU1lOQ19GT1VORDsKKyAgfQorCisgIGlmIChiaXRzQXZhaWwgPD0gMCkgeworICAgIGVyciA9IE1QU19QQVJTRV9FUlJPUjsKKyAgfSBlbHNlIHsKKyAgICBlcnIgPSBTcGF0aWFsRGVjUGFyc2VGcmFtZURhdGEoCisgICAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5wU3BhdGlhbERlYywKKyAgICAgICAgJnBNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZVBhcnNlXSwKKyAgICAgICAgaEJzLCBzc2NQYXJzZSwgKFVQTUlYVFlQRSlwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+dXBtaXhUeXBlLAorICAgICAgICBmR2xvYmFsSW5kZXBlbmRlbmN5RmxhZyk7CisgICAgaWYgKGVyciA9PSBNUFNfT0spIHsKKyAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZVBhcnNlXQorICAgICAgICAgIC5uZXdCc0RhdGEgPSAxOworICAgIH0KKyAgfQorCisgIG51bVNhY0JpdHMgPSBiaXRzQXZhaWwgLSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpOworCisgIGlmIChudW1TYWNCaXRzID4gYml0c0F2YWlsKSB7CisgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVzW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lUGFyc2VdCisgICAgICAgIC5uZXdCc0RhdGEgPSAwOworICAgIGVyciA9IE1QU19QQVJTRV9FUlJPUjsKKyAgfQorCisgICpwTXBzRGF0YUJpdHMgLT0gbnVtU2FjQml0czsKKworICByZXR1cm4gZXJyOworfQorCisvKioKKyAqIFxicmllZiBDaGVjaywgaWYgYW5jVHlwZSBpcyB2YWxpZC4KKyAqKi8KK3N0YXRpYyBpbnQgaXNWYWxpZEFuY1R5cGUoQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW5jVHlwZSkgeworICBpbnQgcmV0ID0gMTsKKworICBpZiAoKGFuY1R5cGUgIT0gTVBFR1NfQU5DVFlQRV9IRUFERVJfQU5EX0ZSQU1FKSAmJgorICAgICAgKGFuY1R5cGUgIT0gTVBFR1NfQU5DVFlQRV9GUkFNRSkpIHsKKyAgICByZXQgPSAwOworICB9CisKKyAgaWYgKHJldCA9PSAwKSB7CisgICAgdXBkYXRlTXBlZ1N1cnJvdW5kRGVjb2RlclN0YXR1cyhwTXBlZ1N1cnJvdW5kRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUdTX0lOSVRfRVJST1JfUEFZTE9BRCwgTVBFR1NfU1lOQ19MT1NULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFR1NfU1RPUCk7CisgIH0KKworICByZXR1cm4gKHJldCk7Cit9CisKKy8qKgorICogXGJyaWVmIENoZWNrLCBpZiBhbmNTdGFydFN0b3AgaXMgdmFsaWQuCisgKiovCitzdGF0aWMgaW50IGlzVmFsaWRBbmNTdGFydFN0b3AoQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbmNTdGFydFN0b3ApIHsKKyAgaW50IHJldCA9IDE7CisKKyAgc3dpdGNoIChhbmNTdGFydFN0b3ApIHsKKyAgICBjYXNlIE1QRUdTX1NUQVJUOgorICAgICAgLyogU2VxdWVuY2Ugc3RhcnQgLSBzdGFydCBhbmQgY29udGludWUgLSBzdGFydCBub3QgYWxsb3dlZCAqLworICAgICAgaWYgKChwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YW5jU3RhcnRTdG9wUHJldiA9PSBNUEVHU19TVEFSVCkgfHwKKyAgICAgICAgICAocE1wZWdTdXJyb3VuZERlY29kZXItPmFuY1N0YXJ0U3RvcFByZXYgPT0gTVBFR1NfQ09OVElOVUUpKSB7CisgICAgICAgIHJldCA9IDA7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTVBFR1NfU1RPUDoKKyAgICAgIC8qIE1QUyBwYXlsb2FkIG9mIHRoZSBwcmV2aW91cyBmcmFtZSBtdXN0IGJlIHZhbGlkIGlmIGN1cnJlbnQgdHlwZSBpcyBzdG9wCisgICAgICAgICBTZXF1ZW5jZSBzdGFydHN0b3AgLSBzdG9wIGFuZCBzdG9wIC0gc3RvcCBub3QgYWxsb3dlZAorICAgICAgICAgU2VxdWVuY2Ugc3RhcnRzdG9wIC0gY29udGludWUgYW5kIHN0b3AgLSBjb250aW51ZSBhcmUgYWxsb3dlZCAqLworICAgICAgaWYgKChwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YW5jU3RhcnRTdG9wUHJldiA9PSBNUEVHU19TVE9QKSB8fAorICAgICAgICAgIChwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YW5jU3RhcnRTdG9wUHJldiA9PSBNUEVHU19TVEFSVF9TVE9QKSkgeworICAgICAgICByZXQgPSAwOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1QRUdTX0NPTlRJTlVFOgorICAgIGNhc2UgTVBFR1NfU1RBUlRfU1RPUDoKKyAgICAgIC8qIE5vIGVycm9yIGRldGVjdGlvbiBwb3NzaWJsZSBmb3IgdGhpcyBzdGF0ZXMgKi8KKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKHJldCA9PSAwKSB7CisgICAgdXBkYXRlTXBlZ1N1cnJvdW5kRGVjb2RlclN0YXR1cyhwTXBlZ1N1cnJvdW5kRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUdTX0lOSVRfRVJST1JfUEFZTE9BRCwgTVBFR1NfU1lOQ19MT1NULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFR1NfU1RPUCk7CisgIH0gZWxzZSB7CisgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPmFuY1N0YXJ0U3RvcFByZXYgPSAoTVBFR1NfQU5DU1RBUlRTVE9QKWFuY1N0YXJ0U3RvcDsKKyAgfQorCisgIHJldHVybiAocmV0KTsKK30KKworaW50IG1wZWdTdXJyb3VuZERlY29kZXJfUGFyc2UoQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBpbnQgKnBNcHNEYXRhQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywgaW50IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVTaXplLCBpbnQgZkdsb2JhbEluZGVwZW5kZW5jeUZsYWcpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKyAgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnNzY1BhcnNlOworICBTUEFUSUFMX0JTX0ZSQU1FICpic0ZyYW1lOworICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoTXBzQnNEYXRhID0gTlVMTDsKKyAgRkRLX0JJVFNUUkVBTSBtcHNCc0RhdGE7CisgIGludCBtcHNEYXRhQml0cyA9ICpwTXBzRGF0YUJpdHM7CisgIGludCBtcHNCc0JpdHM7CisgIE1QRUdTX0FOQ1RZUEUgYW5jVHlwZTsKKyAgTVBFR1NfQU5DU1RBUlRTVE9QIGFuY1N0YXJ0U3RvcDsKKworICBpZiAocE1wZWdTdXJyb3VuZERlY29kZXIgPT0gTlVMTCkgeworICAgIHJldHVybiBNUFNfSU5WQUxJRF9IQU5ETEU7CisgIH0KKworICBGREtfQVNTRVJUKHBNcGVnU3Vycm91bmREZWNvZGVyLT5wU3BhdGlhbERlYyk7CisKKyAgbXBzQnNCaXRzID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CisKKyAgc3NjUGFyc2UgPSAmcE1wZWdTdXJyb3VuZERlY29kZXIKKyAgICAgICAgICAgICAgICAgIC0+c3BhdGlhbFNwZWNpZmljQ29uZmlnW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lUGFyc2VdOworICBic0ZyYW1lID0gJnBNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZVBhcnNlXTsKKworICAvKgorICAgICBGaW5kIG9wZXJhdGlvbiBtb2RlIG9mIG1wZWcgc3Vycm91bmQgZGVjb2RlcjoKKyAgICAgLSBNUEVHU19PUE1PREVfRU1NOiAgICAgICAgICAgIE1vZGU6IEVuaGFuY2VkIE1hdHJpeCBNb2RlIChCbGluZCkKKyAgICAgLSBNUEVHU19PUE1PREVfTVBTX1BBWUxPQUQ6ICAgIE1vZGU6IE5vcm1hbCwgU3RlcmVvIG9yIEJpbmF1cmFsCisgICAgIC0gTVBFR1NfT1BNT0RFX05PX01QU19QQVlMT0FEOiBNb2RlOiBObyBNcGVnU3Vycm91bmQgUGF5bG9hZAorICAqLworICB7CisgICAgLyogUGFyc2UgYW5jVHlwZSBhbmQgYW5jU3RhcnRTdG9wICovCisgICAgYW5jVHlwZSA9IChNUEVHU19BTkNUWVBFKUZES3JlYWRCaXRzKGhCcywgMik7CisgICAgYW5jU3RhcnRTdG9wID0gKE1QRUdTX0FOQ1NUQVJUU1RPUClGREtyZWFkQml0cyhoQnMsIDIpOworICAgIG1wc0RhdGFCaXRzIC09IDQ7CisKKyAgICAvKiBTZXQgdmFsaWQgYW5jIHR5cGUgZmxhZywgaWYgYW5jVHlwZSBzaWduYWxzIGEgcGF5bG9hZCB3aXRoIGVpdGhlciBoZWFkZXIKKyAgICAgKiBhbmQgZnJhbWUgb3IgZnJhbWUgKi8KKyAgICBpZiAoaXNWYWxpZEFuY1R5cGUocE1wZWdTdXJyb3VuZERlY29kZXIsIGFuY1R5cGUpKSB7CisgICAgICAvKiBTZXQgdmFsaWQgYW5jIHN0YXJ0c3RvcCBmbGFnLCBpZiB0cmFuc21pdHRlZCBzZXF1ZW5jZSBpcyBub3QgaWxsZWdhbCAqLworICAgICAgaWYgKGlzVmFsaWRBbmNTdGFydFN0b3AocE1wZWdTdXJyb3VuZERlY29kZXIsIGFuY1N0YXJ0U3RvcCkpIHsKKyAgICAgICAgc3dpdGNoIChhbmNTdGFydFN0b3ApIHsKKyAgICAgICAgICBjYXNlIE1QRUdTX1NUQVJUOgorICAgICAgICAgICAgLyogQXNzdW1pbmcgdGhhdCBjb3JlIGNvZGVyIGZyYW1lIHNpemUgKEFBQykgaXMgc21hbGxlciB0aGFuIE1QUworICAgICAgICAgICAgICAgY29kZXIgZnJhbWUgc2l6ZS4gU2F2ZSBhdWRpbyBkYXRhIGZvciBuZXh0IGZyYW1lLiAqLworICAgICAgICAgICAgaWYgKG1wc0RhdGFCaXRzID4gTVBTX0RBVEFfQlVGRkVSX1NJWkUgKiA4KSB7CisgICAgICAgICAgICAgIGVyciA9IE1QU19OT1RPSzsKKyAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtcHNEYXRhQml0cyAvIDg7IGkrKykgeworICAgICAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBzRGF0YVtpXSA9IEZES3JlYWRCaXRzKGhCcywgOCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBzRGF0YUJpdHMgPSBtcHNEYXRhQml0czsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBNUEVHU19DT05USU5VRToKKyAgICAgICAgICBjYXNlIE1QRUdTX1NUT1A6CisgICAgICAgICAgICAvKiBBc3N1bWluZyB0aGF0IGNvcmUgY29kZXIgZnJhbWUgc2l6ZSAoQUFDKSBpcyBzbWFsbGVyIHRoYW4gTVBTCisgICAgICAgICAgICAgICBjb2RlciBmcmFtZSBzaXplLiBTYXZlIGF1ZGlvIGRhdGEgZm9yIG5leHQgZnJhbWUuICovCisgICAgICAgICAgICBpZiAoKHBNcGVnU3Vycm91bmREZWNvZGVyLT5tcHNEYXRhQml0cyArIG1wc0RhdGFCaXRzKSA+CisgICAgICAgICAgICAgICAgTVBTX0RBVEFfQlVGRkVSX1NJWkUgKiA4KSB7CisgICAgICAgICAgICAgIGVyciA9IE1QU19OT1RPSzsKKyAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtcHNEYXRhQml0cyAvIDg7IGkrKykgeworICAgICAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2RlcgorICAgICAgICAgICAgICAgICAgLT5tcHNEYXRhWyhwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBzRGF0YUJpdHMgLyA4KSArIGldID0KKyAgICAgICAgICAgICAgICAgIEZES3JlYWRCaXRzKGhCcywgOCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBzRGF0YUJpdHMgKz0gbXBzRGF0YUJpdHM7CisgICAgICAgICAgICBGREtpbml0Qml0U3RyZWFtKCZtcHNCc0RhdGEsIHBNcGVnU3Vycm91bmREZWNvZGVyLT5tcHNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfQlVGU0laRV9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPm1wc0RhdGFCaXRzLCBCU19SRUFERVIpOworICAgICAgICAgICAgaE1wc0JzRGF0YSA9ICZtcHNCc0RhdGE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgTVBFR1NfU1RBUlRfU1RPUDoKKyAgICAgICAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5tcHNEYXRhQml0cyA9IG1wc0RhdGFCaXRzOworICAgICAgICAgICAgaE1wc0JzRGF0YSA9IGhCczsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGFuY1N0YXJ0U3RvcCA9PSBNUEVHU19TVE9QKSB8fAorICAgICAgICAgICAgKGFuY1N0YXJ0U3RvcCA9PSBNUEVHU19TVEFSVF9TVE9QKSkgeworICAgICAgICAgIHN3aXRjaCAoYW5jVHlwZSkgeworICAgICAgICAgICAgY2FzZSBNUEVHU19BTkNUWVBFX0hFQURFUl9BTkRfRlJBTUU6IHsKKyAgICAgICAgICAgICAgaW50IHBhcnNlUmVzdWx0LCBiaXRzUmVhZDsKKyAgICAgICAgICAgICAgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgc3BhdGlhbFNwZWNpZmljQ29uZmlnVG1wID0KKyAgICAgICAgICAgICAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5zcGF0aWFsU3BlY2lmaWNDb25maWdCYWNrdXA7CisKKyAgICAgICAgICAgICAgLyogUGFyc2Ugc3BhdGlhbCBzcGVjaWZpYyBjb25maWcgKi8KKyAgICAgICAgICAgICAgYml0c1JlYWQgPSBGREtnZXRWYWxpZEJpdHMoaE1wc0JzRGF0YSk7CisKKyAgICAgICAgICAgICAgZXJyID0gU3BhdGlhbERlY1BhcnNlU3BlY2lmaWNDb25maWdIZWFkZXIoCisgICAgICAgICAgICAgICAgICBoTXBzQnNEYXRhLAorICAgICAgICAgICAgICAgICAgJnBNcGVnU3Vycm91bmREZWNvZGVyLT5zcGF0aWFsU3BlY2lmaWNDb25maWdCYWNrdXAsIGNvcmVDb2RlYywKKyAgICAgICAgICAgICAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT51cG1peFR5cGUpOworCisgICAgICAgICAgICAgIGJpdHNSZWFkID0gKGJpdHNSZWFkIC0gRkRLZ2V0VmFsaWRCaXRzKGhNcHNCc0RhdGEpKTsKKyAgICAgICAgICAgICAgcGFyc2VSZXN1bHQgPSAoKGVyciA9PSBNUFNfT0spID8gYml0c1JlYWQgOiAtYml0c1JlYWQpOworCisgICAgICAgICAgICAgIGlmIChwYXJzZVJlc3VsdCA8IDApIHsKKyAgICAgICAgICAgICAgICBwYXJzZVJlc3VsdCA9IC1wYXJzZVJlc3VsdDsKKyAgICAgICAgICAgICAgICBlcnIgPSBNUFNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IE1QU19PSykgeworICAgICAgICAgICAgICAgIC8qIENoZWNrIFNTQyBmb3IgY29uc2lzdGVuY3kgKGUuZy4gYml0IGVycm9ycyBjb3VsZCBjYXVzZQorICAgICAgICAgICAgICAgICAqIHRyb3VibGUpICovCisgICAgICAgICAgICAgICAgZXJyID0gc3NjQ2hlY2tJbkJhbmQoCisgICAgICAgICAgICAgICAgICAgICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+c3BhdGlhbFNwZWNpZmljQ29uZmlnQmFja3VwLAorICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUsIHNhbXBsZVJhdGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgICAgICAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPnNwYXRpYWxTcGVjaWZpY0NvbmZpZ0JhY2t1cCA9CisgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxTcGVjaWZpY0NvbmZpZ1RtcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5tcHNEYXRhQml0cyAtPSBwYXJzZVJlc3VsdDsKKworICAgICAgICAgICAgICAvKiBJbml0aWF0ZSByZS1pbml0aWFsaXphdGlvbiwgaWYgaGVhZGVyIGhhcyBjaGFuZ2VkICovCisgICAgICAgICAgICAgIGlmIChGREtfU3BhdGlhbERlY0NvbXBhcmVTcGF0aWFsU3BlY2lmaWNDb25maWdIZWFkZXIoCisgICAgICAgICAgICAgICAgICAgICAgJnBNcGVnU3Vycm91bmREZWNvZGVyLT5zcGF0aWFsU3BlY2lmaWNDb25maWdCYWNrdXAsCisgICAgICAgICAgICAgICAgICAgICAgc3NjUGFyc2UpID09IE1QU19VTkVRVUFMX1NTQykgeworICAgICAgICAgICAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyCisgICAgICAgICAgICAgICAgICAgIC0+aW5pdEZsYWdzW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lUGFyc2VdIHw9CisgICAgICAgICAgICAgICAgICAgIE1QRUdTX0lOSVRfQ0hBTkdFX0hFQURFUjsKKyAgICAgICAgICAgICAgICBTcGF0aWFsRGVjSW5pdFBhcnNlckNvbnRleHQocE1wZWdTdXJyb3VuZERlY29kZXItPnBTcGF0aWFsRGVjKTsKKyAgICAgICAgICAgICAgICAvKiBXZSBmb3VuZCBhIHZhbGlkIGluLWJhbmQgY29uZmlndXJhdGlvbi4gVGhlcmVmb3JlIGFueQorICAgICAgICAgICAgICAgICAqIHByZXZpb3VzIGNvbmZpZyBpcyBpbnZhbGlkIG5vdy4gKi8KKyAgICAgICAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBlZ1N1cnJvdW5kU3NjSXNHbG9iYWxDZmcgPSAwOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1QRUdTX0FOQ1RZUEVfRlJBTUU6CisKKyAgICAgICAgICAgICAgaWYgKHBNcGVnU3Vycm91bmREZWNvZGVyCisgICAgICAgICAgICAgICAgICAgICAgLT5pbml0RmxhZ3NbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVQYXJzZV0gJgorICAgICAgICAgICAgICAgICAgTVBFR1NfSU5JVF9FUlJPUl9QQVlMT0FEKSB7CisgICAgICAgICAgICAgICAgZXJyID0gTVBTX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogRmlyc3Qgc3BhdGlhbCBzcGVjaWZpYyBjb25maWcgaXMgcGFyc2VkIGludG8KKyAgICAgICAgICAgICAgICogc3BhdGlhbFNwZWNpZmljQ29uZmlnQmFja3VwLCBzZWNvbmQgc3BhdGlhbFNwZWNpZmljQ29uZmlnQmFja3VwCisgICAgICAgICAgICAgICAqIGlzIGNvcGllZCBpbnRvIHNwYXRpYWxTcGVjaWZpY0NvbmZpZ1tic0ZyYW1lRGVjb2RlXSAqLworICAgICAgICAgICAgICBpZiAocE1wZWdTdXJyb3VuZERlY29kZXIKKyAgICAgICAgICAgICAgICAgICAgICAtPmluaXRGbGFnc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZVBhcnNlXSkgeworICAgICAgICAgICAgICAgIEZES21lbWNweShzc2NQYXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBNcGVnU3Vycm91bmREZWNvZGVyLT5zcGF0aWFsU3BlY2lmaWNDb25maWdCYWNrdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihTUEFUSUFMX1NQRUNJRklDX0NPTkZJRykpOworICAgICAgICAgICAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyCisgICAgICAgICAgICAgICAgICAgIC0+Zk9uU3luY1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZVBhcnNlXSA9CisgICAgICAgICAgICAgICAgICAgIE1QRUdTX1NZTkNfRk9VTkQ7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAocE1wZWdTdXJyb3VuZERlY29kZXIKKyAgICAgICAgICAgICAgICAgICAgICAtPmZPblN5bmNbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVQYXJzZV0gPj0KKyAgICAgICAgICAgICAgICAgIE1QRUdTX1NZTkNfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmJpdHMgPSAwLCBiaXRzQXZhaWw7CisKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE1QU19PSykgeworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYml0c0F2YWlsID0gRkRLZ2V0VmFsaWRCaXRzKGhNcHNCc0RhdGEpOworCisgICAgICAgICAgICAgICAgaWYgKGJpdHNBdmFpbCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICBlcnIgPSBNUFNfUEFSU0VfRVJST1I7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGVyciA9IFNwYXRpYWxEZWNQYXJzZUZyYW1lRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMsIGJzRnJhbWUsIGhNcHNCc0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgc3NjUGFyc2UsIChVUE1JWFRZUEUpcE1wZWdTdXJyb3VuZERlY29kZXItPnVwbWl4VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBmR2xvYmFsSW5kZXBlbmRlbmN5RmxhZyk7CisgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE1QU19PSykgeworICAgICAgICAgICAgICAgICAgICBic0ZyYW1lLT5uZXdCc0RhdGEgPSAxOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG5iaXRzID0gYml0c0F2YWlsIC0gKElOVClGREtnZXRWYWxpZEJpdHMoaE1wc0JzRGF0YSk7CisKKyAgICAgICAgICAgICAgICBpZiAoKG5iaXRzID4gYml0c0F2YWlsKSB8fAorICAgICAgICAgICAgICAgICAgICAobmJpdHMgPiBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBzRGF0YUJpdHMpIHx8CisgICAgICAgICAgICAgICAgICAgIChwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBzRGF0YUJpdHMgPiBuYml0cyArIDcgJiYKKyAgICAgICAgICAgICAgICAgICAgICFJU19MT1dERUxBWShjb3JlQ29kZWMpKSkgeworICAgICAgICAgICAgICAgICAgYnNGcmFtZS0+bmV3QnNEYXRhID0gMDsKKyAgICAgICAgICAgICAgICAgIGVyciA9IE1QU19QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBzRGF0YUJpdHMgLT0gbmJpdHM7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8qIGFkZGVkIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyAgICAgICAgICAgICAgZXJyID0gTVBTX05PVE9LOworICAgICAgICAgICAgICBicmVhazsgLyogYWRkZWQgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZyAqLworICAgICAgICAgIH0gICAgICAgICAgLyogc3dpdGNoIChhbmNUeXBlKSAqLworCisgICAgICAgICAgaWYgKGVyciA9PSBNUFNfT0spIHsKKyAgICAgICAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5hbmNTdGFydFN0b3BQcmV2ID0gYW5jU3RhcnRTdG9wOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1cGRhdGVNcGVnU3Vycm91bmREZWNvZGVyU3RhdHVzKHBNcGVnU3Vycm91bmREZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHU19JTklUX0VSUk9SX1BBWUxPQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUdTX1NZTkNfTE9TVCwgTVBFR1NfU1RPUCk7CisgICAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBzRGF0YUJpdHMgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfSAvKiAoYW5jU3RhcnRTdG9wID09IE1QRUdTX1NUT1ApIHx8IChhbmNTdGFydFN0b3AgPT0gTVBFR1NfU1RBUlRfU1RPUCkKKyAgICAgICAgICAgKi8KKyAgICAgIH0gICAvKiB2YWxpZEFuY1N0YXJ0U3RvcCAqLworICAgIH0gICAgIC8qIHZhbGlkQW5jVHlwZSAqLworICB9CisKK2JhaWw6CisKKyAgKnBNcHNEYXRhQml0cyAtPSAobXBzQnNCaXRzIC0gRkRLZ2V0VmFsaWRCaXRzKGhCcykpOworCisgIHJldHVybiBlcnI7Cit9CisKK2ludCBtcGVnU3Vycm91bmREZWNvZGVyX0FwcGx5KENNcGVnU3Vycm91bmREZWNvZGVyICpwTXBlZ1N1cnJvdW5kRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKmlucHV0LCBQQ01fTVBTICpwVGltZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdGltZURhdGFTaXplLCBpbnQgdGltZURhdGFGcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm5DaGFubmVscywgaW50ICpmcmFtZVNpemUsIGludCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIGNoYW5uZWxUeXBlW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBjaGFubmVsSW5kaWNlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkRLX2NoYW5uZWxNYXBEZXNjciAqY29uc3QgbWFwRGVzY3IpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKyAgUENNX01QUyAqcFRpbWVPdXQgPSBwVGltZURhdGE7CisgIFVJTlQgaW5pdENvbnRyb2xGbGFncyA9IDAsIGNvbnRyb2xGbGFncyA9IDA7CisgIGludCB0aW1lRGF0YVJlcXVpcmVkU2l6ZSA9IDA7CisgIGludCBuZXdEYXRhOworCisgIGlmIChwTXBlZ1N1cnJvdW5kRGVjb2RlciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE1QU19JTlZBTElEX0hBTkRMRTsKKyAgfQorCisgIEZES19BU1NFUlQocE1wZWdTdXJyb3VuZERlY29kZXItPnBTcGF0aWFsRGVjKTsKKworICBpZiAoIUZES19jaE1hcERlc2NyX2lzVmFsaWQobWFwRGVzY3IpKSB7CisgICAgcmV0dXJuIE1QU19JTlZBTElEX0hBTkRMRTsKKyAgfQorCisgIGlmICgoKm5DaGFubmVscyA8PSAwKSB8fCAoKm5DaGFubmVscyA+IDIpKSB7CisgICAgcmV0dXJuIE1QU19OT1RPSzsKKyAgfQorCisgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5wU3BhdGlhbERlYy0+cENvbmZpZ0N1cnJlbnQgPQorICAgICAgJnBNcGVnU3Vycm91bmREZWNvZGVyCisgICAgICAgICAgIC0+c3BhdGlhbFNwZWNpZmljQ29uZmlnW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lRGVjb2RlXTsKKyAgbmV3RGF0YSA9IHBNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZVBhcnNlXQorICAgICAgICAgICAgICAgIC5uZXdCc0RhdGE7CisKKyAgc3dpdGNoIChtcGVnU3Vycm91bmRPcGVyYXRpb25Nb2RlKHBNcGVnU3Vycm91bmREZWNvZGVyLCAxMDAwKSkgeworICAgIGNhc2UgTVBFR1NfT1BNT0RFX01QU19QQVlMT0FEOgorICAgICAgaWYgKHBNcGVnU3Vycm91bmREZWNvZGVyCisgICAgICAgICAgICAgIC0+aW5pdEZsYWdzW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lRGVjb2RlXSkgeworICAgICAgICBlcnIgPSBpbml0TXBlZ1N1cnJvdW5kRGVjb2RlcihwTXBlZ1N1cnJvdW5kRGVjb2Rlcik7CisgICAgICB9CisKKyAgICAgIGlmIChlcnIgPT0gTVBTX09LKSB7CisgICAgICAgIGlmICgocE1wZWdTdXJyb3VuZERlY29kZXIKKyAgICAgICAgICAgICAgICAgLT5mT25TeW5jW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lRGVjb2RlXSAhPQorICAgICAgICAgICAgIE1QRUdTX1NZTkNfQ09NUExFVEUpICYmCisgICAgICAgICAgICAocE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVzW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lRGVjb2RlXQorICAgICAgICAgICAgICAgICAuYnNJbmRlcGVuZGVuY3lGbGFnID09IDEpKSB7CisgICAgICAgICAgLyogV2UgZ290IGEgdmFsaWQgaGVhZGVyIGFuZCBpbmRlcGVuZGVudGx5IGRlY29kZWFibGUgZnJhbWUgZGF0YS4KKyAgICAgICAgICAgICAgLT4gR28gdG8gdGhlIG5leHQgc3luYyBsZXZlbCBhbmQgc3RhcnQgcHJvY2Vzc2luZy4gKi8KKyAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+Zk9uU3luY1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV0gPQorICAgICAgICAgICAgICBNUEVHU19TWU5DX0NPTVBMRVRFOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBXZSBnb3QgYSB2YWxpZCBjb25maWcgaGVhZGVyIGJ1dCBmb3VuZCBhbiBlcnJvciB3aGlsZSBwYXJzaW5nIHRoZQorICAgICAgICAgICBiaXRzdHJlYW0uIFdhaXQgZm9yIHRoZSBuZXh0IGluZGVwZW5kZW50IGZyYW1lIGFuZCBhcHBseSBlcnJvcgorICAgICAgICAgICBjb25lYWxtZW50IGluIHRoZSBtZWFudGltZS4gKi8KKyAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPmZPblN5bmNbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdID0KKyAgICAgICAgICAgIE1QRUdTX1NZTkNfRk9VTkQ7CisgICAgICAgIGNvbnRyb2xGbGFncyB8PSBNUEVHU19DT05DRUFMOworICAgICAgICBlcnIgPSBNUFNfT0s7CisgICAgICB9CisgICAgICAvKgorICAgICAgICAgQ29uY2VhbG1lbnQ6CisgICAgICAgICAtIEJpdHN0cmVhbSBpcyBhdmFpbGFibGUsIG5vIHN5bmMgZm91bmQgZHVyaW5nIGJpdHN0cmVhbSBwcm9jZXNzaW5nCisgICAgICAgICAtIEJpdHN0cmVhbSBpcyBhdmFpbGFibGUsIHN5bmMgbG9zdCBkdWUgdG8gY29ycnVwdGVkIGJpdHN0cmVhbQorICAgICAgICAgLSBCaXRzdHJlYW0gaXMgYXZhaWxhYmxlLCBzeW5jIGZvdW5kIGJ1dCBubyBpbmRlcGVuZGVudCBmcmFtZQorICAgICAgKi8KKyAgICAgIGlmIChwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+Zk9uU3luY1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV0gIT0KKyAgICAgICAgICBNUEVHU19TWU5DX0NPTVBMRVRFKSB7CisgICAgICAgIGNvbnRyb2xGbGFncyB8PSBNUEVHU19DT05DRUFMOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1QRUdTX09QTU9ERV9OT19NUFNfUEFZTE9BRDoKKyAgICAgIC8qIENvbmNlYWxtZW50OiBObyBiaXRzdHJlYW0gaXMgYXZhaWxhYmxlICovCisgICAgICBjb250cm9sRmxhZ3MgfD0gTVBFR1NfQ09OQ0VBTDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGVyciA9IE1QU19OT1RPSzsKKyAgfQorCisgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyoKKyAgICogRm9yY2UgQnlwYXNzTW9kZSBpZiBjaG9vc2VuIGJ5IHVzZXIKKyAgICovCisgIGlmIChwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBlZ1N1cnJvdW5kVXNlclBhcmFtcy5ieXBhc3NNb2RlKSB7CisgICAgY29udHJvbEZsYWdzIHw9IE1QRUdTX0JZUEFTU01PREU7CisgIH0KKworICBpZiAocE1wZWdTdXJyb3VuZERlY29kZXItPmluaXRGbGFnc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV0pIHsKKyAgICBpbnQgc3RhcnRXaXRoRGZsdENmZyA9IDA7CisgICAgLyoKKyAgICAgKiBJbml0IHdpdGggYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgd2UgY2FtZSBoZXJlIGFuZCBhcmUgc3RpbGwgbm90CisgICAgICogaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgaWYgKHBNcGVnU3Vycm91bmREZWNvZGVyLT5pbml0RmxhZ3NbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdICYKKyAgICAgICAgTVBFR1NfSU5JVF9FTkZPUkNFX1JFSU5JVCkgeworICAgICAgLyogR2V0IGRlZmF1bHQgc3BhdGlhbCBzcGVjaWZpYyBjb25maWcgKi8KKyAgICAgIGlmIChGREtfU3BhdGlhbERlY0luaXREZWZhdWx0U3BhdGlhbFNwZWNpZmljQ29uZmlnKAorICAgICAgICAgICAgICAmcE1wZWdTdXJyb3VuZERlY29kZXItPnNwYXRpYWxTcGVjaWZpY0NvbmZpZ0JhY2t1cCwgY29yZUNvZGVjLAorICAgICAgICAgICAgICAqbkNoYW5uZWxzLCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAqZnJhbWVTaXplIC8KKyAgICAgICAgICAgICAgICAgIG1wZWdTdXJyb3VuZERlY29kZXJfR2V0TnJPZlFtZkJhbmRzKE5VTEwsIHNhbXBsZVJhdGUpLAorICAgICAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBlZ1N1cnJvdW5kRGVjb2RlckxldmVsLAorICAgICAgICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBlZ1N1cnJvdW5kVXNlclBhcmFtcy5ibGluZEVuYWJsZSkpIHsKKyAgICAgICAgZXJyID0gTVBTX05PVE9LOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisKKyAgICAgIC8qIEluaXRpYXRlIHJlLWluaXRpYWxpemF0aW9uLCBpZiBoZWFkZXIgaGFzIGNoYW5nZWQgKi8KKyAgICAgIGlmIChGREtfU3BhdGlhbERlY0NvbXBhcmVTcGF0aWFsU3BlY2lmaWNDb25maWdIZWFkZXIoCisgICAgICAgICAgICAgICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+c3BhdGlhbFNwZWNpZmljQ29uZmlnQmFja3VwLAorICAgICAgICAgICAgICAmcE1wZWdTdXJyb3VuZERlY29kZXItPnNwYXRpYWxTcGVjaWZpY0NvbmZpZworICAgICAgICAgICAgICAgICAgIFtwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV0pID09IE1QU19VTkVRVUFMX1NTQykgeworICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+aW5pdEZsYWdzW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lRGVjb2RlXSB8PQorICAgICAgICAgICAgTVBFR1NfSU5JVF9DSEFOR0VfSEVBREVSOworICAgICAgICBTcGF0aWFsRGVjSW5pdFBhcnNlckNvbnRleHQocE1wZWdTdXJyb3VuZERlY29kZXItPnBTcGF0aWFsRGVjKTsKKyAgICAgIH0KKworICAgICAgc3RhcnRXaXRoRGZsdENmZyA9IDE7CisgICAgfQorCisgICAgLyogRmlyc3Qgc3BhdGlhbCBzcGVjaWZpYyBjb25maWcgaXMgcGFyc2VkIGludG8gc3BhdGlhbFNwZWNpZmljQ29uZmlnQmFja3VwLAorICAgICAqIHNlY29uZCBzcGF0aWFsU3BlY2lmaWNDb25maWdCYWNrdXAgaXMgY29waWVkIGludG8gc3BhdGlhbFNwZWNpZmljQ29uZmlnCisgICAgICovCisgICAgZXJyID0gaW5pdE1wZWdTdXJyb3VuZERlY29kZXIocE1wZWdTdXJyb3VuZERlY29kZXIpOworCisgICAgaWYgKHN0YXJ0V2l0aERmbHRDZmcpIHsKKyAgICAgIC8qIGluaXRpYWxpemVkIHdpdGggZGVmYXVsdCBjb25maWcsIGJ1dCBubyBzeW5jIGZvdW5kICovCisgICAgICAvKiBtYXliZSB1c2UgdXBkYXRlTXBlZ1N1cnJvdW5kRGVjb2RlclN0YXR1cyBsYXRlciBvbiAqLworICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPmZPblN5bmNbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdID0KKyAgICAgICAgICBNUEVHU19TWU5DX0xPU1Q7CisgICAgfQorCisgICAgLyogU2luY2Ugd2UgZG8gbm90IGhhdmUgc3RhdGUgTVBFR1NfU1lOQ19DT01QTEVURSBhcHBseSBjb25jZWFsbWVudCAqLworICAgIGNvbnRyb2xGbGFncyB8PSBNUEVHU19DT05DRUFMOworCisgICAgaWYgKGVyciAhPSBNUFNfT0spIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgIH0KKworICAvKgorICAgKiBQcm9jZXNzIE1QRUcgU3Vycm91bmQgQXVkaW8KKyAgICovCisgIGluaXRDb250cm9sRmxhZ3MgPSBjb250cm9sRmxhZ3M7CisKKyAgLyogQ2hlY2sgdGhhdCBwcm92aWRlZCBvdXRwdXQgYnVmZmVyIGlzIGxhcmdlIGVub3VnaC4gKi8KKyAgdGltZURhdGFSZXF1aXJlZFNpemUgPQorICAgICAgKHRpbWVEYXRhRnJhbWVTaXplICoKKyAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMtPm51bU91dHB1dENoYW5uZWxzQVQgKgorICAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5CYW5kc1N5bnRoZXNpcykgLworICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPnBRbWZEb21haW4tPmdsb2JhbENvbmYubkJhbmRzQW5hbHlzaXM7CisgIGlmICh0aW1lRGF0YVNpemUgPCB0aW1lRGF0YVJlcXVpcmVkU2l6ZSkgeworICAgIGVyciA9IE1QU19PVVRQVVRfQlVGRkVSX1RPT19TTUFMTDsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICBpZiAoKHBNcGVnU3Vycm91bmREZWNvZGVyLT5wU3BhdGlhbERlYy0+cENvbmZpZ0N1cnJlbnQtPnN5bnRheEZsYWdzICYKKyAgICAgICBTQUNERUNfU1lOVEFYX1VTQUMpICYmCisgICAgICAocE1wZWdTdXJyb3VuZERlY29kZXItPnBTcGF0aWFsRGVjLT5zdGVyZW9Db25maWdJbmRleCA+IDEpKSB7CisgICAgRkRLX0FTU0VSVCh0aW1lRGF0YVJlcXVpcmVkU2l6ZSA+PSB0aW1lRGF0YUZyYW1lU2l6ZSAqICpuQ2hhbm5lbHMpOworICAgIC8qIFBsYWNlIHNhbXBsZXMgY29tcHJpc2luZyBRTUYgdGltZSBzbG90cyBzcGFjZWQgYXQgUU1GIG91dHB1dCBCYW5kIHJhc3RlcgorICAgICAqIHRvIGFsbG93IHNsb3Qgd2lzZSBwcm9jZXNzaW5nICovCisgICAgaW50IHRpbWVEYXRhRnJhbWVTaXplT3V0ID0KKyAgICAgICAgKHRpbWVEYXRhRnJhbWVTaXplICoKKyAgICAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5CYW5kc1N5bnRoZXNpcykgLworICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFFtZkRvbWFpbi0+Z2xvYmFsQ29uZi5uQmFuZHNBbmFseXNpczsKKyAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFFtZkRvbWFpbi0+Z2xvYmFsQ29uZi5URGlucHV0ID0KKyAgICAgICAgcFRpbWVEYXRhICsgdGltZURhdGFGcmFtZVNpemVPdXQgLSB0aW1lRGF0YUZyYW1lU2l6ZTsKKyAgICBmb3IgKGludCBpID0gKm5DaGFubmVscyAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICBGREttZW1tb3ZlKHBUaW1lRGF0YSArIChpICsgMSkgKiB0aW1lRGF0YUZyYW1lU2l6ZU91dCAtIHRpbWVEYXRhRnJhbWVTaXplLAorICAgICAgICAgICAgICAgICBwVGltZURhdGEgKyB0aW1lRGF0YUZyYW1lU2l6ZSAqIGksCisgICAgICAgICAgICAgICAgIHNpemVvZihQQ01fTVBTKSAqIHRpbWVEYXRhRnJhbWVTaXplKTsKKyAgICAgIEZES21lbWNsZWFyKHBUaW1lRGF0YSArIGkgKiB0aW1lRGF0YUZyYW1lU2l6ZU91dCwKKyAgICAgICAgICAgICAgICAgIHNpemVvZihQQ01fTVBTKSAqICh0aW1lRGF0YUZyYW1lU2l6ZU91dCAtIHRpbWVEYXRhRnJhbWVTaXplKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBlZ1N1cnJvdW5kVXNlVGltZUludGVyZmFjZSkgeworICAgICAgRkRLbWVtY3B5KGlucHV0LCBwVGltZURhdGEsCisgICAgICAgICAgICAgICAgc2l6ZW9mKElOVF9QQ00pICogKCpuQ2hhbm5lbHMpICogKCpmcmFtZVNpemUpKTsKKyAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLlREaW5wdXQgPSBpbnB1dDsKKyAgICB9CisgIH0KKworICAvKgorICAgKiBQcm9jZXNzIE1QRUcgU3Vycm91bmQgQXVkaW8KKyAgICovCisgIGVyciA9IFNwYXRpYWxEZWNBcHBseUZyYW1lKAorICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPnBTcGF0aWFsRGVjLAorICAgICAgJnBNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV0sCisgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBlZ1N1cnJvdW5kVXNlVGltZUludGVyZmFjZSA/IElOUFVUTU9ERV9USU1FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IElOUFVUTU9ERV9RTUZfU0JSLAorICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPnBRbWZEb21haW4tPmdsb2JhbENvbmYuVERpbnB1dCwgTlVMTCwgTlVMTCwKKyAgICAgIHBUaW1lT3V0LCAqZnJhbWVTaXplLCAmY29udHJvbEZsYWdzLCAqbkNoYW5uZWxzLCBtYXBEZXNjcik7CisgICpuQ2hhbm5lbHMgPSBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMtPm51bU91dHB1dENoYW5uZWxzQVQ7CisKKyAgaWYgKGVyciAhPQorICAgICAgTVBTX09LKSB7IC8qIEEgZmF0YWwgZXJyb3Igb2NjdXJlZC4gR28gYmFjayB0byBzdGFydCBhbmQgdHJ5IGFnYWluOiAqLworICAgIHVwZGF0ZU1wZWdTdXJyb3VuZERlY29kZXJTdGF0dXMocE1wZWdTdXJyb3VuZERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHU19JTklUX0VORk9SQ0VfUkVJTklULCBNUEVHU19TWU5DX0xPU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHU19TVE9QKTsKKyAgICAqZnJhbWVTaXplID0KKyAgICAgICAgMDsgLyogRGVjbGFyZSB0aGF0IGZyYW1ld29yayBjYW4gbm90IHVzZSB0aGUgZGF0YSBpbiBwVGltZU91dC4gKi8KKyAgfSBlbHNlIHsKKyAgICBpZiAoKChjb250cm9sRmxhZ3MgJiBNUEVHU19DT05DRUFMKSAmJgorICAgICAgICAgIShpbml0Q29udHJvbEZsYWdzICYgTVBFR1NfQ09OQ0VBTCkpIHx8CisgICAgICAgIChwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMtPmVyckludCAhPQorICAgICAgICAgTVBTX09LKSkgeyAvKiBBY2NvdW50IGZvciBlcnJvcnMgdGhhdCBvY2N1cmVkIGluCisgICAgICAgICAgICAgICAgICAgICAgIFNwYXRpYWxEZWNBcHBseUZyYW1lKCk6ICovCisgICAgICB1cGRhdGVNcGVnU3Vycm91bmREZWNvZGVyU3RhdHVzKHBNcGVnU3Vycm91bmREZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHU19JTklUX0VSUk9SX1BBWUxPQUQsIE1QRUdTX1NZTkNfTE9TVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFR1NfU1RPUCk7CisgICAgfQorICB9CisKKyAgaWYgKChlcnIgPT0gTVBTX09LKSAmJiAhKGNvbnRyb2xGbGFncyAmIE1QRUdTX0JZUEFTU01PREUpICYmCisgICAgICAhKHBNcGVnU3Vycm91bmREZWNvZGVyLT51cG1peFR5cGUgPT0gVVBNSVhfVFlQRV9CWVBBU1MpKSB7CisgICAgU3BhdGlhbERlY0NoYW5uZWxQcm9wZXJ0aWVzKHBNcGVnU3Vycm91bmREZWNvZGVyLT5wU3BhdGlhbERlYywgY2hhbm5lbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzLCBtYXBEZXNjcik7CisgIH0KKworYmFpbDoKKworICBpZiAobmV3RGF0YSkgeworICAgIC8qIG51bVBhcmFtZXRlclNldHNQcmV2IHNoYWxsIG9ubHkgYmUgcmVhZCBpbiB0aGUgZGVjb2RlIHByb2Nlc3MsIGJlY2F1c2Ugb2YKKyAgICAgICB0aGF0IHdlIGNhbiB1cGRhdGUgdGhpcyBzdGF0ZSB2YXJpYWJsZSBoZXJlICovCisgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPnBTcGF0aWFsRGVjLT5udW1QYXJhbWV0ZXJTZXRzUHJldiA9CisgICAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV0KKyAgICAgICAgICAgIC5udW1QYXJhbWV0ZXJTZXRzOworICB9CisKKyAgcmV0dXJuIChlcnIpOworfQorCisvKioKKyAqIFxicmllZiBGcmVlIGNvbmZpZyBkZXBlbmRlbnQgTVBFRyBTdXJyb3VuZCBtZW1vcnkuCisgKiovCitTQUNERUNfRVJST1IgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9GcmVlTWVtKAorICAgIENNcGVnU3Vycm91bmREZWNvZGVyICpwTXBlZ1N1cnJvdW5kRGVjb2RlcikgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworCisgIGlmIChwTXBlZ1N1cnJvdW5kRGVjb2RlciAhPSBOVUxMKSB7CisgICAgRkRLX1NwYXRpYWxEZWNDbG9zZShwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMpOworICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5wU3BhdGlhbERlYyA9IE5VTEw7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCisvKioKKyAqIFxicmllZiBDbG9zZSBNUEVHIFN1cnJvdW5kIGRlY29kZXIuCisgKiovCit2b2lkIG1wZWdTdXJyb3VuZERlY29kZXJfQ2xvc2UoQ01wZWdTdXJyb3VuZERlY29kZXIgKnBNcGVnU3Vycm91bmREZWNvZGVyKSB7CisgIGlmIChwTXBlZ1N1cnJvdW5kRGVjb2RlciAhPSBOVUxMKSB7CisgICAgRkRLX1NwYXRpYWxEZWNDbG9zZShwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+cFNwYXRpYWxEZWMpOworICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5wU3BhdGlhbERlYyA9IE5VTEw7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE7IGkrKykgeworICAgICAgU3BhdGlhbERlY0Nsb3NlQnNGcmFtZSgmcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVzW2ldKTsKKyAgICB9CisKKyAgICBGREtfRlJFRV9NRU1PUllfMUQocE1wZWdTdXJyb3VuZERlY29kZXIpOworICB9Cit9CisKKyNkZWZpbmUgU0FDREVDX1ZMMCAyCisjZGVmaW5lIFNBQ0RFQ19WTDEgMAorI2RlZmluZSBTQUNERUNfVkwyIDAKKworaW50IG1wZWdTdXJyb3VuZERlY29kZXJfR2V0TGliSW5mbyhMSUJfSU5GTyAqaW5mbykgeworICBpbnQgaTsKKworICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogc2VhcmNoIGZvciBuZXh0IGZyZWUgdGFiICovCisgIGZvciAoaSA9IDA7IGkgPCBGREtfTU9EVUxFX0xBU1Q7IGkrKykgeworICAgIGlmIChpbmZvW2ldLm1vZHVsZV9pZCA9PSBGREtfTk9ORSkgYnJlYWs7CisgIH0KKyAgaWYgKGkgPT0gRkRLX01PRFVMRV9MQVNUKSByZXR1cm4gLTE7CisKKyAgaW5mbyArPSBpOworCisgIGluZm8tPm1vZHVsZV9pZCA9IEZES19NUFNERUM7CisjaWZkZWYgX19BTkRST0lEX18KKyAgaW5mby0+YnVpbGRfZGF0ZSA9ICIiOworICBpbmZvLT5idWlsZF90aW1lID0gIiI7CisjZWxzZQorICBpbmZvLT5idWlsZF9kYXRlID0gX19EQVRFX187CisgIGluZm8tPmJ1aWxkX3RpbWUgPSBfX1RJTUVfXzsKKyNlbmRpZgorICBpbmZvLT50aXRsZSA9ICJNUEVHIFN1cnJvdW5kIERlY29kZXIiOworICBpbmZvLT52ZXJzaW9uID0gTElCX1ZFUlNJT04oU0FDREVDX1ZMMCwgU0FDREVDX1ZMMSwgU0FDREVDX1ZMMik7CisgIExJQl9WRVJTSU9OX1NUUklORyhpbmZvKTsKKyAgaW5mby0+ZmxhZ3MgPSAwIHwgQ0FQRl9NUFNfTEQgfCBDQVBGX01QU19VU0FDIHwgQ0FQRl9NUFNfSFEgfAorICAgICAgICAgICAgICAgIENBUEZfTVBTXzFDSF9JTiB8IENBUEZfTVBTXzJDSF9PVVQ7IC8qIGVuZCBmbGFncyAqLworCisgIHJldHVybiAwOworfQorCitTQUNERUNfRVJST1IgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9TZXRQYXJhbSgKKyAgICBDTXBlZ1N1cnJvdW5kRGVjb2RlciAqcE1wZWdTdXJyb3VuZERlY29kZXIsIGNvbnN0IFNBQ0RFQ19QQVJBTSBwYXJhbSwKKyAgICBjb25zdCBJTlQgdmFsdWUpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKyAgU1BBVElBTERFQ19QQVJBTSAqcFVzZXJQYXJhbXMgPSBOVUxMOworCisgIC8qIGNoZWNrIGRlY29kZXIgaGFuZGxlICovCisgIGlmIChwTXBlZ1N1cnJvdW5kRGVjb2RlciAhPSBOVUxMKSB7CisgICAgLyogaW5pdCBsb2NhbCBzaG9ydGN1dHMgKi8KKyAgICBwVXNlclBhcmFtcyA9ICZwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+bXBlZ1N1cnJvdW5kVXNlclBhcmFtczsKKyAgfSBlbHNlIHsKKyAgICBlcnIgPSBNUFNfSU5WQUxJRF9IQU5ETEU7CisgICAgLyogY2hlY2sgdGhlIHBhcmFtZXRlciB2YWx1ZXMgYmVmb3JlIGV4aXRpbmcuICovCisgIH0KKworICAvKiBhcHBseSBwYXJhbSB2YWx1ZSAqLworICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBTQUNERUNfT1VUUFVUX01PREU6CisgICAgICBzd2l0Y2ggKChTQUNfREVDX09VVFBVVF9NT0RFKXZhbHVlKSB7CisgICAgICAgIGNhc2UgU0FDREVDX09VVF9NT0RFX05PUk1BTDoKKyAgICAgICAgY2FzZSBTQUNERUNfT1VUX01PREVfU1RFUkVPOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGVyciA9IE1QU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgIH0KKyAgICAgIGlmIChlcnIgPT0gTVBTX09LKSB7CisgICAgICAgIGlmICgwKSB7CisgICAgICAgICAgZXJyID0gTVBTX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICB9IGVsc2UgaWYgKHBVc2VyUGFyYW1zLT5vdXRwdXRNb2RlICE9IChVQ0hBUil2YWx1ZSkgeworICAgICAgICAgIHBVc2VyUGFyYW1zLT5vdXRwdXRNb2RlID0gKFVDSEFSKXZhbHVlOworICAgICAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyCisgICAgICAgICAgICAgIC0+aW5pdEZsYWdzW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lRGVjb2RlXSB8PQorICAgICAgICAgICAgICBNUEVHU19JTklUX0NIQU5HRV9PVVRQVVRfTU9ERTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNBQ0RFQ19JTlRFUkZBQ0U6CisgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMSkgeworICAgICAgICBlcnIgPSBNUFNfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICB9CisgICAgICBpZiAoZXJyICE9IE1QU19PSykgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBpZiAocE1wZWdTdXJyb3VuZERlY29kZXItPm1wZWdTdXJyb3VuZFVzZVRpbWVJbnRlcmZhY2UgIT0gKFVDSEFSKXZhbHVlKSB7CisgICAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5tcGVnU3Vycm91bmRVc2VUaW1lSW50ZXJmYWNlID0gKFVDSEFSKXZhbHVlOworICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+aW5pdEZsYWdzW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lRGVjb2RlXSB8PQorICAgICAgICAgICAgTVBFR1NfSU5JVF9DSEFOR0VfVElNRV9GUkVRX0lOVEVSRkFDRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTQUNERUNfQlNfSU5URVJSVVBUSU9OOgorICAgICAgaWYgKChlcnIgPT0gTVBTX09LKSAmJiAodmFsdWUgIT0gMCkpIHsKKyAgICAgICAgdXBkYXRlTXBlZ1N1cnJvdW5kRGVjb2RlclN0YXR1cyhwTXBlZ1N1cnJvdW5kRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHU19JTklUX0JTX0lOVEVSUlVQVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHU19TWU5DX0xPU1QsIE1QRUdTX1NUT1ApOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNBQ0RFQ19DTEVBUl9ISVNUT1JZOgorICAgICAgaWYgKChlcnIgPT0gTVBTX09LKSAmJiAodmFsdWUgIT0gMCkpIHsKKyAgICAgICAgLyogSnVzdCByZXNldCB0aGUgc3RhdGVzIGFuZCBnbyBvbi4gKi8KKyAgICAgICAgdXBkYXRlTXBlZ1N1cnJvdW5kRGVjb2RlclN0YXR1cyhwTXBlZ1N1cnJvdW5kRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHU19JTklUX0NMRUFSX0hJU1RPUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFR1NfU1lOQ19MT1NULCBNUEVHU19TVE9QKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTQUNERUNfQ09OQ0VBTF9OVU1fS0VFUF9GUkFNRVM6CisgICAgICBpZiAodmFsdWUgPCAwKSB7IC8qIENoZWNrIHZhbGlkIHZhbHVlIHJhbmdlICovCisgICAgICAgIGVyciA9IE1QU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgIH0KKyAgICAgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIGlmIChwVXNlclBhcmFtcy0+Y29uY2VhbE51bUtlZXBGcmFtZXMgIT0gKFVJTlQpdmFsdWUpIHsKKyAgICAgICAgcFVzZXJQYXJhbXMtPmNvbmNlYWxOdW1LZWVwRnJhbWVzID0gKFVJTlQpdmFsdWU7CisgICAgICAgIHBNcGVnU3Vycm91bmREZWNvZGVyLT5pbml0RmxhZ3NbcE1wZWdTdXJyb3VuZERlY29kZXItPmJzRnJhbWVEZWNvZGVdIHw9CisgICAgICAgICAgICBNUEVHU19JTklUX0NIQU5HRV9DT05DRUFMX1BBUkFNUzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTQUNERUNfQ09OQ0VBTF9GQURFX09VVF9TTE9QRV9MRU5HVEg6CisgICAgICBpZiAodmFsdWUgPCAwKSB7IC8qIENoZWNrIHZhbGlkIHZhbHVlIHJhbmdlICovCisgICAgICAgIGVyciA9IE1QU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgIH0KKyAgICAgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIGlmIChwVXNlclBhcmFtcy0+Y29uY2VhbEZhZGVPdXRTbG9wZUxlbmd0aCAhPSAoVUlOVCl2YWx1ZSkgeworICAgICAgICBwVXNlclBhcmFtcy0+Y29uY2VhbEZhZGVPdXRTbG9wZUxlbmd0aCA9IChVSU5UKXZhbHVlOworICAgICAgICBwTXBlZ1N1cnJvdW5kRGVjb2Rlci0+aW5pdEZsYWdzW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lRGVjb2RlXSB8PQorICAgICAgICAgICAgTVBFR1NfSU5JVF9DSEFOR0VfQ09OQ0VBTF9QQVJBTVM7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0FDREVDX0NPTkNFQUxfRkFERV9JTl9TTE9QRV9MRU5HVEg6CisgICAgICBpZiAodmFsdWUgPCAwKSB7IC8qIENoZWNrIHZhbGlkIHZhbHVlIHJhbmdlICovCisgICAgICAgIGVyciA9IE1QU19JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgIH0KKyAgICAgIGlmIChlcnIgIT0gTVBTX09LKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIGlmIChwVXNlclBhcmFtcy0+Y29uY2VhbEZhZGVJblNsb3BlTGVuZ3RoICE9IChVSU5UKXZhbHVlKSB7CisgICAgICAgIHBVc2VyUGFyYW1zLT5jb25jZWFsRmFkZUluU2xvcGVMZW5ndGggPSAoVUlOVCl2YWx1ZTsKKyAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPmluaXRGbGFnc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV0gfD0KKyAgICAgICAgICAgIE1QRUdTX0lOSVRfQ0hBTkdFX0NPTkNFQUxfUEFSQU1TOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNBQ0RFQ19DT05DRUFMX05VTV9SRUxFQVNFX0ZSQU1FUzoKKyAgICAgIGlmICh2YWx1ZSA8IDApIHsgLyogQ2hlY2sgdmFsaWQgdmFsdWUgcmFuZ2UgKi8KKyAgICAgICAgZXJyID0gTVBTX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgfQorICAgICAgaWYgKGVyciAhPSBNUFNfT0spIHsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgICAgaWYgKHBVc2VyUGFyYW1zLT5jb25jZWFsTnVtUmVsZWFzZUZyYW1lcyAhPSAoVUlOVCl2YWx1ZSkgeworICAgICAgICBwVXNlclBhcmFtcy0+Y29uY2VhbE51bVJlbGVhc2VGcmFtZXMgPSAoVUlOVCl2YWx1ZTsKKyAgICAgICAgcE1wZWdTdXJyb3VuZERlY29kZXItPmluaXRGbGFnc1twTXBlZ1N1cnJvdW5kRGVjb2Rlci0+YnNGcmFtZURlY29kZV0gfD0KKyAgICAgICAgICAgIE1QRUdTX0lOSVRfQ0hBTkdFX0NPTkNFQUxfUEFSQU1TOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXJyID0gTVBTX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgYnJlYWs7CisgIH0gLyogc3dpdGNoKHBhcmFtKSAqLworCitiYWlsOgorICByZXR1cm4gZXJyOworfQorCitTQUNERUNfRVJST1IgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9Jc1BzZXVkb0xSKAorICAgIENNcGVnU3Vycm91bmREZWNvZGVyICpwTXBlZ1N1cnJvdW5kRGVjb2RlciwgaW50ICpic1BzZXVkb0xyKSB7CisgIGlmIChwTXBlZ1N1cnJvdW5kRGVjb2RlciAhPSBOVUxMKSB7CisgICAgY29uc3QgU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgKnNzY0RlY29kZSA9CisgICAgICAgICZwTXBlZ1N1cnJvdW5kRGVjb2RlcgorICAgICAgICAgICAgIC0+c3BhdGlhbFNwZWNpZmljQ29uZmlnW3BNcGVnU3Vycm91bmREZWNvZGVyLT5ic0ZyYW1lRGVjb2RlXTsKKyAgICAqYnNQc2V1ZG9MciA9IChpbnQpc3NjRGVjb2RlLT5ic1BzZXVkb0xyOworICAgIHJldHVybiBNUFNfT0s7CisgIH0gZWxzZQorICAgIHJldHVybiBNUFNfSU5WQUxJRF9IQU5ETEU7Cit9CisKKy8qKgorICogXGJyaWVmIEdldCB0aGUgc2lnbmFsIGRlbGF5IGNhdXNlZCBieSB0aGUgTVBFRyBTdXJyb3VuZCBkZWNvZGVyIG1vZHVsZS4KKyAqKi8KK1VJTlQgbXBlZ1N1cnJvdW5kRGVjb2Rlcl9HZXREZWxheShjb25zdCBDTXBlZ1N1cnJvdW5kRGVjb2RlciAqc2VsZikgeworICBJTlQgb3V0cHV0RGVsYXkgPSAwOworCisgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICBjb25zdCBTUEFUSUFMX1NQRUNJRklDX0NPTkZJRyAqc3NjRGVjb2RlID0KKyAgICAgICAgJnNlbGYtPnNwYXRpYWxTcGVjaWZpY0NvbmZpZ1tzZWxmLT5ic0ZyYW1lRGVjb2RlXTsKKyAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMgPSBzc2NEZWNvZGUtPmNvcmVDb2RlYzsKKworICAgIC8qIFNlZSBjaGFwdGVyIDQuNSAoZGVsYXkgYW5kIHN5bmNocm9uaXphdGlvbikgb2YgSVNPL0lFQyBGRElTIDIzMDAzLTEgYW5kCisgICAgICAgY2hhcHRlciA1LjQuMyBvZiBJU08vSUVDIEZESVMgMjMwMDMtMiBmb3IgZGV0YWlscyBvbiB0aGUgZm9sbG93aW5nCisgICAgICAgZmlndXJlcy4gKi8KKworICAgIGlmIChjb3JlQ29kZWMgPiBBT1RfTlVMTF9PQkpFQ1QpIHsKKyAgICAgIGlmIChJU19MT1dERUxBWShjb3JlQ29kZWMpKSB7CisgICAgICAgIC8qIEFsbCBsb3cgZGVsYXkgdmFyaWFudHMgKEVSLUFBQy0oRSlMRCk6ICovCisgICAgICAgIG91dHB1dERlbGF5ICs9IDI1NjsKKyAgICAgIH0gZWxzZSBpZiAoIUlTX1VTQUMoY29yZUNvZGVjKSkgeworICAgICAgICAvKiBCeSB0aGUgbWV0aG9kIG9mIGVsaW1pbmF0aW9uIHRoaXMgaXMgdGhlIEdBIChBQUMtTEMsIEhFLUFBQywgLi4uKQorICAgICAgICAgKiBicmFuY2g6ICovCisgICAgICAgIG91dHB1dERlbGF5ICs9IDMyMCArIDI1NzsgLyogY29zIHRvIGV4cCBkZWxheSArIFFNRiBzeW50aGVzaXMgKi8KKyAgICAgICAgaWYgKHNlbGYtPm1wZWdTdXJyb3VuZFVzZVRpbWVJbnRlcmZhY2UpIHsKKyAgICAgICAgICBvdXRwdXREZWxheSArPSAzMjAgKyAzODQ7IC8qIFFNRiBhbmQgaHlicmlkIGFuYWx5c2lzICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gKG91dHB1dERlbGF5KTsKK30KZGlmZiAtLWdpdCBhL2xpYlNBQ2RlYy9zcmMvc2FjX2RlY19zc2Nfc3RydWN0LmggYi9saWJTQUNkZWMvc3JjL3NhY19kZWNfc3NjX3N0cnVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2N2I0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY19kZWNfc3NjX3N0cnVjdC5oCkBAIC0wLDAgKzEsMjgzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IGludGVyZmFjZSAtIHNwYXRpYWwgc3BlY2lmaWMgY29uZmlnIHN0cnVjdAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNBQ19ERUNfU1NDX1NUUlVDVF9ICisjZGVmaW5lIFNBQ19ERUNfU1NDX1NUUlVDVF9ICisKKyNpbmNsdWRlICJGREtfYXVkaW8uaCIKKworI2RlZmluZSBNQVhfTlVNX1FNRl9CQU5EUyAoMTI4KQorI2RlZmluZSBNQVhfVElNRV9TTE9UUyA2NAorI2RlZmluZSBNQVhfSU5QVVRfQ0hBTk5FTFMgMQorI2RlZmluZSBNQVhfT1VUUFVUX0NIQU5ORUxTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAyIC8qIENBVVRJT046IFRoaXMgZG9lcyBOT1QgcmVzdHJpY3QgdGhlIG51bWJlciBvZiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBjaGFubmVscyBleGNsdXNpdmVseSEgSW4gYWRkaXRpb24gaXQgXAorICAgICAgIGFmZmVjdHMgdGhlIG1heCBudW1iZXIgb2YgYml0c3RyZWFtIGFuZCByZXNpZHVhbCBjaGFubmVscyEgKi8KKyNkZWZpbmUgTUFYX05VTV9PVFQgKDUpCisjZGVmaW5lIE1BWF9OVU1fVFRUICgwKQorI2RlZmluZSBNQVhfTlVNX0VYVF9UWVBFUyAoOCkKKyNkZWZpbmUgTUFYX1BBUkFNRVRFUl9CQU5EUyAoMjgpCisjZGVmaW5lIE1BWF9QQVJBTUVURVJfQkFORFNfTEQgKDIzKQorCisjZGVmaW5lIE1BWF9OVU1fWENIQU5ORUxTICg2KQorCisjZGVmaW5lIE1BWF9BUkJJVFJBUllfVFJFRV9MRVZFTFMgKDApCisKK3R5cGVkZWYgZW51bSB7CisgIC8qIENBVVRJT046IERvIG5vdCBjaGFuZ2UgZW51bSB2YWx1ZXMhICovCisgIFNQQVRJQUxERUNfRlJFUV9SRVNfNDAgPSA0MCwKKyAgU1BBVElBTERFQ19GUkVRX1JFU18yOCA9IDI4LAorICBTUEFUSUFMREVDX0ZSRVFfUkVTXzIzID0gMjMsCisgIFNQQVRJQUxERUNfRlJFUV9SRVNfMjAgPSAyMCwKKyAgU1BBVElBTERFQ19GUkVRX1JFU18xNSA9IDE1LAorICBTUEFUSUFMREVDX0ZSRVFfUkVTXzE0ID0gMTQsCisgIFNQQVRJQUxERUNfRlJFUV9SRVNfMTIgPSAxMiwKKyAgU1BBVElBTERFQ19GUkVRX1JFU18xMCA9IDEwLAorICBTUEFUSUFMREVDX0ZSRVFfUkVTXzkgPSA5LAorICBTUEFUSUFMREVDX0ZSRVFfUkVTXzcgPSA3LAorICBTUEFUSUFMREVDX0ZSRVFfUkVTXzUgPSA1LAorICBTUEFUSUFMREVDX0ZSRVFfUkVTXzQgPSA0CisKK30gU1BBVElBTERFQ19GUkVRX1JFUzsKKwordHlwZWRlZiBlbnVtIHsKKworICBTUEFUSUFMREVDX1FVQU5UX0ZJTkVfREVGID0gMCwKKyAgU1BBVElBTERFQ19RVUFOVF9FRFExID0gMSwKKyAgU1BBVElBTERFQ19RVUFOVF9FRFEyID0gMiwKKyAgU1BBVElBTERFQ19RVUFOVF9SU1ZEMyA9IDMsCisgIFNQQVRJQUxERUNfUVVBTlRfUlNWRDQgPSA0LAorICBTUEFUSUFMREVDX1FVQU5UX1JTVkQ1ID0gNSwKKyAgU1BBVElBTERFQ19RVUFOVF9SU1ZENiA9IDYsCisgIFNQQVRJQUxERUNfUVVBTlRfUlNWRDcgPSA3CisKK30gU1BBVElBTERFQ19RVUFOVF9NT0RFOworCit0eXBlZGVmIGVudW0geyBTUEFUSUFMREVDX01PREVfUlNWRDcgPSA3IH0gU1BBVElBTERFQ19UUkVFX0NPTkZJRzsKKwordHlwZWRlZiBlbnVtIHsKKworICBTUEFUSUFMREVDX0dBSU5fTU9ERTAgPSAwLAorICBTUEFUSUFMREVDX0dBSU5fUlNWRDEgPSAxLAorICBTUEFUSUFMREVDX0dBSU5fUlNWRDIgPSAyLAorICBTUEFUSUFMREVDX0dBSU5fUlNWRDMgPSAzLAorICBTUEFUSUFMREVDX0dBSU5fUlNWRDQgPSA0LAorICBTUEFUSUFMREVDX0dBSU5fUlNWRDUgPSA1LAorICBTUEFUSUFMREVDX0dBSU5fUlNWRDYgPSA2LAorICBTUEFUSUFMREVDX0dBSU5fUlNWRDcgPSA3LAorICBTUEFUSUFMREVDX0dBSU5fUlNWRDggPSA4LAorICBTUEFUSUFMREVDX0dBSU5fUlNWRDkgPSA5LAorICBTUEFUSUFMREVDX0dBSU5fUlNWRDEwID0gMTAsCisgIFNQQVRJQUxERUNfR0FJTl9SU1ZEMTEgPSAxMSwKKyAgU1BBVElBTERFQ19HQUlOX1JTVkQxMiA9IDEyLAorICBTUEFUSUFMREVDX0dBSU5fUlNWRDEzID0gMTMsCisgIFNQQVRJQUxERUNfR0FJTl9SU1ZEMTQgPSAxNCwKKyAgU1BBVElBTERFQ19HQUlOX1JTVkQxNSA9IDE1CisKK30gU1BBVElBTERFQ19GSVhFRF9HQUlOUzsKKwordHlwZWRlZiBlbnVtIHsKKworICBTUEFUSUFMREVDX1RTX1RQTk9XSElURSA9IDAsCisgIFNQQVRJQUxERUNfVFNfVFBXSElURSA9IDEsCisgIFNQQVRJQUxERUNfVFNfVEVTID0gMiwKKyAgU1BBVElBTERFQ19UU19OT1RTID0gMywKKyAgU1BBVElBTERFQ19UU19SU1ZENCA9IDQsCisgIFNQQVRJQUxERUNfVFNfUlNWRDUgPSA1LAorICBTUEFUSUFMREVDX1RTX1JTVkQ2ID0gNiwKKyAgU1BBVElBTERFQ19UU19SU1ZENyA9IDcsCisgIFNQQVRJQUxERUNfVFNfUlNWRDggPSA4LAorICBTUEFUSUFMREVDX1RTX1JTVkQ5ID0gOSwKKyAgU1BBVElBTERFQ19UU19SU1ZEMTAgPSAxMCwKKyAgU1BBVElBTERFQ19UU19SU1ZEMTEgPSAxMSwKKyAgU1BBVElBTERFQ19UU19SU1ZEMTIgPSAxMiwKKyAgU1BBVElBTERFQ19UU19SU1ZEMTMgPSAxMywKKyAgU1BBVElBTERFQ19UU19SU1ZEMTQgPSAxNCwKKyAgU1BBVElBTERFQ19UU19SU1ZEMTUgPSAxNQorCit9IFNQQVRJQUxERUNfVFNfQ09ORjsKKwordHlwZWRlZiBlbnVtIHsKKworICBTUEFUSUFMREVDX0RFQ09SUl9NT0RFMCA9IDAsCisgIFNQQVRJQUxERUNfREVDT1JSX01PREUxID0gMSwKKyAgU1BBVElBTERFQ19ERUNPUlJfTU9ERTIgPSAyLAorICBTUEFUSUFMREVDX0RFQ09SUl9SU1ZEMyA9IDMsCisgIFNQQVRJQUxERUNfREVDT1JSX1JTVkQ0ID0gNCwKKyAgU1BBVElBTERFQ19ERUNPUlJfUlNWRDUgPSA1LAorICBTUEFUSUFMREVDX0RFQ09SUl9SU1ZENiA9IDYsCisgIFNQQVRJQUxERUNfREVDT1JSX1JTVkQ3ID0gNywKKyAgU1BBVElBTERFQ19ERUNPUlJfUlNWRDggPSA4LAorICBTUEFUSUFMREVDX0RFQ09SUl9SU1ZEOSA9IDksCisgIFNQQVRJQUxERUNfREVDT1JSX1JTVkQxMCA9IDEwLAorICBTUEFUSUFMREVDX0RFQ09SUl9SU1ZEMTEgPSAxMSwKKyAgU1BBVElBTERFQ19ERUNPUlJfUlNWRDEyID0gMTIsCisgIFNQQVRJQUxERUNfREVDT1JSX1JTVkQxMyA9IDEzLAorICBTUEFUSUFMREVDX0RFQ09SUl9SU1ZEMTQgPSAxNCwKKyAgU1BBVElBTERFQ19ERUNPUlJfUlNWRDE1ID0gMTUKKworfSBTUEFUSUFMREVDX0RFQ09SUl9DT05GOworCit0eXBlZGVmIHN0cnVjdCBUX1NQQVRJQUxERUNfT1RUX0NPTkYgeworICBpbnQgbk90dEJhbmRzOworCit9IFNQQVRJQUxERUNfT1RUX0NPTkY7CisKK3R5cGVkZWYgc3RydWN0IFRfU1BBVElBTERFQ19SRVNJRFVBTF9DT05GIHsKKyAgaW50IGJSZXNpZHVhbFByZXNlbnQ7CisgIGludCBuUmVzaWR1YWxCYW5kczsKKworfSBTUEFUSUFMREVDX1JFU0lEVUFMX0NPTkY7CisKK3R5cGVkZWYgc3RydWN0IFRfU1BBVElBTF9TUEVDSUZJQ19DT05GSUcgeworICBVSU5UIHN5bnRheEZsYWdzOworICBpbnQgc2FtcGxpbmdGcmVxOworICBpbnQgblRpbWVTbG90czsKKyAgU1BBVElBTERFQ19GUkVRX1JFUyBmcmVxUmVzOworICBTUEFUSUFMREVDX1RSRUVfQ09ORklHIHRyZWVDb25maWc7CisgIFNQQVRJQUxERUNfUVVBTlRfTU9ERSBxdWFudE1vZGU7CisgIGludCBiQXJiaXRyYXJ5RG93bm1peDsKKworICBpbnQgYlJlc2lkdWFsQ29kaW5nOworICBTUEFUSUFMREVDX0ZJWEVEX0dBSU5TIGJzRml4ZWRHYWluRE1YOworCisgIFNQQVRJQUxERUNfVFNfQ09ORiB0ZW1wU2hhcGVDb25maWc7CisgIFNQQVRJQUxERUNfREVDT1JSX0NPTkYgZGVjb3JyQ29uZmlnOworCisgIGludCBuSW5wdXRDaGFubmVsczsgIC8qIGRlcml2ZWQgZnJvbSAgdHJlZUNvbmZpZyAqLworICBpbnQgbk91dHB1dENoYW5uZWxzOyAvKiBkZXJpdmVkIGZyb20gIHRyZWVDb25maWcgKi8KKworICAvKiBvdHQgY29uZmlnICovCisgIGludCBuT3R0Qm94ZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVyaXZlZCBmcm9tICB0cmVlQ29uZmlnICovCisgIFNQQVRJQUxERUNfT1RUX0NPTkYgT3R0Q29uZmlnW01BWF9OVU1fT1RUXTsgLyogZGltZW5zaW9uIG5PdHRCb3hlcyAqLworCisgIC8qIHR0dCBjb25maWcgKi8KKyAgaW50IG5UdHRCb3hlczsgLyogZGVyaXZlZCBmcm9tICB0cmVlQ29uZmlnICovCisKKyAgLyogcmVzaWR1YWwgY29uZmlnICovCisgIFNQQVRJQUxERUNfUkVTSURVQUxfQ09ORgorICBSZXNpZHVhbENvbmZpZ1tNQVhfTlVNX09UVCArCisgICAgICAgICAgICAgICAgIE1BWF9OVU1fVFRUXTsgLyogZGltZW5zaW9uIChuT3R0Qm94ZXMgKyBuVHR0Qm94ZXMpICovCisKKyAgaW50IHNhY0V4dENudDsKKyAgaW50IHNhY0V4dFR5cGVbTUFYX05VTV9FWFRfVFlQRVNdOworICBpbnQgZW52UXVhbnRNb2RlOworCisgIEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYzsKKworICBVQ0hBUiBzdGVyZW9Db25maWdJbmRleDsKKyAgVUNIQVIgY29yZVNickZyYW1lTGVuZ3RoSW5kZXg7IC8qIFRhYmxlIDcwIGluIElTTy9JRUMgRkRJUyAyMzAwMy0zOjIwMTEgKi8KKyAgVUNIQVIgYnNIaWdoUmF0ZU1vZGU7CisgIFVDSEFSIGJzRGVjb3JyVHlwZTsKKyAgVUNIQVIgYnNQc2V1ZG9McjsKKyAgVUNIQVIgYnNQaGFzZUNvZGluZzsKKyAgVUNIQVIgYnNPdHRCYW5kc1BoYXNlUHJlc2VudDsKKyAgaW50IGJzT3R0QmFuZHNQaGFzZTsKKworICBTQ0hBUiBvdHRDTERkZWZhdWx0W01BWF9OVU1fT1RUXTsKKyAgVUNIQVIgbnVtT3R0QmFuZHNJUEQ7CisgIFVDSEFSIGJpdHN0cmVhbU90dEJhbmRzW01BWF9OVU1fT1RUXTsKKyAgVUNIQVIgbnVtT3R0QmFuZHNbTUFYX05VTV9PVFRdOworCit9IFNQQVRJQUxfU1BFQ0lGSUNfQ09ORklHOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYlNBQ2RlYy9zcmMvc2FjX3Byb2Nlc3MuY3BwIGIvbGliU0FDZGVjL3NyYy9zYWNfcHJvY2Vzcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjNzJhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2RlYy9zcmMvc2FjX3Byb2Nlc3MuY3BwCkBAIC0wLDAgKzEsMTA2NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBTQUMgUHJvY2Vzc2luZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkYXRhIHN0cnVjdHVyZXMgYW5kIGludGVyZmFjZXMgZm9yIHNwYXRpYWwgYXVkaW8gcmVmZXJlbmNlIHNvZnR3YXJlICovCisjaW5jbHVkZSAic2FjX3Byb2Nlc3MuaCIKKworI2luY2x1ZGUgInNhY19iaXRkZWMuaCIKKyNpbmNsdWRlICJzYWNfY2FsY00xYW5kTTIuaCIKKyNpbmNsdWRlICJzYWNfc21vb3RoaW5nLmgiCisjaW5jbHVkZSAic2FjX3JvbS5oIgorCisjaW5jbHVkZSAic2FjX2RlY19lcnJvcmNvZGVzLmgiCisKKyNpbmNsdWRlICJGREtfdHJpZ0ZjdHMuaCIKKyNpbmNsdWRlICJGREtfZGVjb3JyZWxhdGUuaCIKKworLyoqCisgKiBcYnJpZWYgIExpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHBhcmFtZXRlciB2YWx1ZXMuCisgKiAgICAgICAgIGEqYWxwaGEgKyBiKigxLWFscGhhKQorICogICAgICAgPSBhKmFscGhhICsgYiAtIGIqYWxwaGEKKyAqCisgKiBccGFyYW0gYWxwaGEgICAgICAgICAgICAgICBXZWlnaHRpbmcgZmFjdG9yLgorICogXHBhcmFtIGEgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIGEuCisgKiBccGFyYW0gYiAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgYi4KKyAqCisgKiBccmV0dXJuIEludGVycG9sYXRlZCBwYXJhbWV0ZXIgdmFsdWUuCisgKi8KK0ZES19JTkxJTkUgRklYUF9EQkwgaW50ZXJwb2xhdGVQYXJhbWV0ZXIoY29uc3QgRklYUF9TR0wgYWxwaGEsIGNvbnN0IEZJWFBfREJMIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIGIpIHsKKyAgcmV0dXJuIChiIC0gZk11bHQoYWxwaGEsIGIpICsgZk11bHQoYWxwaGEsIGEpKTsKK30KKworLyoqCisgKiBcYnJpZWYgTWFwIE1QRUcgU3Vycm91bmQgY2hhbm5lbCBpbmRpY2VzIHRvIE1QRUcgNCBQQ0UgbGlrZSBjaGFubmVsIGluZGljZXMuCisgKiBccGFyYW0gc2VsZiBTcGF0aWFsIGRlY29kZXIgaGFuZGxlLgorICogXHBhcmFtIGNoIE1QRUcgU3Vycm91bmQgY2hhbm5lbCBpbmRleC4KKyAqIFxyZXR1cm4gTVBFRyA0IFBDRSBzdHlsZSBjaGFubmVsIGluZGV4LCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBNUEVHCisgKiBTdXJyb3VuZCBjaGFubmVsIGluZGV4LgorICovCitzdGF0aWMgVUlOVCBtYXBDaGFubmVsKHNwYXRpYWxEZWMgKnNlbGYsIFVJTlQgY2gpIHsKKyAgc3RhdGljIGNvbnN0IFVDSEFSIGNoYW5lbElkeFtdWzhdID0geworICAgICAgezAsIDEsIDIsIDMsIDQsIDUsIDYsIDd9LCAvKiAgYmluYXVyYWwsIFRSRUVfMjEyLCBhcmJpdHJhcnkgdHJlZSAqLworICB9OworCisgIGludCBpZHggPSAwOworCisgIHJldHVybiAoY2hhbmVsSWR4W2lkeF1bY2hdKTsKK30KKworRklYUF9EQkwgZ2V0Q2hHYWluKHNwYXRpYWxEZWMgKnNlbGYsIFVJTlQgY2gsIElOVCAqc2NhbGUpIHsKKyAgLyogaW5pdCBubyBnYWluIG1vZGlmaWVyICovCisgIEZJWFBfREJMIGdhaW4gPSAweDgwMDAwMDAwOworICAqc2NhbGUgPSAwOworCisgIGlmICgoIWlzVHdvQ2hNb2RlKHNlbGYtPnVwbWl4VHlwZSkpICYmCisgICAgICAoc2VsZi0+dXBtaXhUeXBlICE9IFVQTUlYVFlQRV9CWVBBU1MpKSB7CisgICAgaWYgKChjaCA9PSAwKSB8fCAoY2ggPT0gMSkgfHwgKGNoID09IDIpKSB7CisgICAgICAvKiBubyBtb2RpZmllciAqLworICAgIH0KKyAgfQorCisgIHJldHVybiBnYWluOworfQorCitTQUNERUNfRVJST1IgU3BhdGlhbERlY1FNRkFuYWx5c2lzKHNwYXRpYWxEZWMgKnNlbGYsIGNvbnN0IFBDTV9NUFMgKmluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHRzLCBjb25zdCBJTlQgYnlwYXNzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxbWZSZWFsLCBGSVhQX0RCTCAqKnFtZkltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBudW1JbnB1dENoYW5uZWxzKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIGludCBjaCwgb2Zmc2V0OworCisgIG9mZnNldCA9IHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYubkJhbmRzU3ludGhlc2lzICoKKyAgICAgICAgICAgc2VsZi0+cFFtZkRvbWFpbi0+Z2xvYmFsQ29uZi5uUW1mVGltZVNsb3RzOworCisgIHsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBudW1JbnB1dENoYW5uZWxzOyBjaCsrKSB7CisgICAgICBjb25zdCBQQ01fTVBTICppblNhbXBsZXMgPQorICAgICAgICAgICZpbkRhdGFbdHMgKiBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5CYW5kc0FuYWx5c2lzXTsKKyAgICAgIEZJWFBfREJMICpwUW1mUmVhbEFuYWx5c2lzID0gcW1mUmVhbFtjaF07IC8qIG5vIGRlbGF5IGluIGJsaW5kIG1vZGUgKi8KKyAgICAgIEZJWFBfREJMICpwUW1mSW1hZ0FuYWx5c2lzID0gcW1mSW1hZ1tjaF07CisKKyAgICAgIENhbGN1bGF0ZVNwYWNlQW5hbHlzaXNRbWYoJnNlbGYtPnBRbWZEb21haW4tPlFtZkRvbWFpbkluW2NoXS5mYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TYW1wbGVzICsgKGNoICogb2Zmc2V0KSwgcFFtZlJlYWxBbmFseXNpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZkltYWdBbmFseXNpcyk7CisKKyAgICAgIGlmICghaXNUd29DaE1vZGUoc2VsZi0+dXBtaXhUeXBlKSAmJiAhYnlwYXNzTW9kZSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlbGYtPnFtZkJhbmRzOyBpKyspIHsKKyAgICAgICAgICBxbWZSZWFsW2NoXVtpXSA9IGZNdWx0KHFtZlJlYWxbY2hdW2ldLCBzZWxmLT5jbGlwUHJvdGVjdEdhaW5fX0ZESyk7CisgICAgICAgICAgcW1mSW1hZ1tjaF1baV0gPSBmTXVsdChxbWZJbWFnW2NoXVtpXSwgc2VsZi0+Y2xpcFByb3RlY3RHYWluX19GREspOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgc2VsZi0+cW1mSW5wdXREZWxheUJ1ZlBvcyA9CisgICAgICAoc2VsZi0+cW1mSW5wdXREZWxheUJ1ZlBvcyArIDEpICUgc2VsZi0+cGNfZmlsdGVyZGVsYXk7CisKKyAgcmV0dXJuIGVycjsKK30KKworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNGZWVkUU1GKHNwYXRpYWxEZWMgKnNlbGYsIEZJWFBfREJMICoqcW1mSW5EYXRhUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnFtZkluRGF0YUltYWcsIGNvbnN0IElOVCB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYnlwYXNzTW9kZSwgRklYUF9EQkwgKipxbWZSZWFsX19GREssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxbWZJbWFnX19GREssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG51bUlucHV0Q2hhbm5lbHMpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKyAgaW50IGNoOworCisgIHsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBudW1JbnB1dENoYW5uZWxzOyBjaCsrKSB7CisgICAgICBGSVhQX0RCTCAqcFFtZlJlYWxBbmFseXNpcyA9CisgICAgICAgICAgcW1mUmVhbF9fRkRLW2NoXTsgLyogbm8gZGVsYXkgaW4gYmxpbmQgbW9kZSAqLworICAgICAgRklYUF9EQkwgKnBRbWZJbWFnQW5hbHlzaXMgPSBxbWZJbWFnX19GREtbY2hdOworCisgICAgICAvKiBXcml0ZSBJbnB1dCBkYXRhIHRvIHBRbWZSZWFsQW5hbHlzaXMuICovCisgICAgICBpZiAoc2VsZi0+YlNoYXJlRGVsYXlXaXRoU0JSKSB7CisgICAgICAgIEZES19RbWZEb21haW5fR2V0U2xvdCgKKyAgICAgICAgICAgICZzZWxmLT5wUW1mRG9tYWluLT5RbWZEb21haW5JbltjaF0sIHRzICsgSFlCUklEX0ZJTFRFUl9ERUxBWSwgMCwKKyAgICAgICAgICAgIE1BWF9RTUZfQkFORFNfVE9fSFlCUklELCBwUW1mUmVhbEFuYWx5c2lzLCBwUW1mSW1hZ0FuYWx5c2lzLCAxNSk7CisgICAgICAgIEZES19RbWZEb21haW5fR2V0U2xvdCgmc2VsZi0+cFFtZkRvbWFpbi0+UW1mRG9tYWluSW5bY2hdLCB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9RTUZfQkFORFNfVE9fSFlCUklELCBzZWxmLT5xbWZCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZSZWFsQW5hbHlzaXMsIHBRbWZJbWFnQW5hbHlzaXMsIDE1KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZES19RbWZEb21haW5fR2V0U2xvdCgmc2VsZi0+cFFtZkRvbWFpbi0+UW1mRG9tYWluSW5bY2hdLCB0cywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnFtZkJhbmRzLCBwUW1mUmVhbEFuYWx5c2lzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZkltYWdBbmFseXNpcywgMTUpOworICAgICAgfQorICAgICAgaWYgKHRzID09IHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYublFtZlRpbWVTbG90cyAtIDEpIHsKKyAgICAgICAgLyogSXMgY3VycmVudGx5IGFsc28gbmVlZGVkIGluIGNhc2Ugd2UgZG9udCBoYXZlIGFueSBvdmVybGFwLiBXZSBuZWVkIHRvCisgICAgICAgICAqIHNhdmUgbGJfc2NhbGUgdG8gb3ZfbGJfc2NhbGUgKi8KKyAgICAgICAgRkRLX1FtZkRvbWFpbl9TYXZlT3ZlcmxhcCgmc2VsZi0+cFFtZkRvbWFpbi0+UW1mRG9tYWluSW5bY2hdLCAwKTsKKyAgICAgIH0KKworICAgICAgLyogQXBwbHkgY2xpcCBwcm90ZWN0aW9uIHRvIG91dHB1dC4gKi8KKyAgICAgIGlmICghaXNUd29DaE1vZGUoc2VsZi0+dXBtaXhUeXBlKSAmJiAhYnlwYXNzTW9kZSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlbGYtPnFtZkJhbmRzOyBpKyspIHsKKyAgICAgICAgICBxbWZSZWFsX19GREtbY2hdW2ldID0KKyAgICAgICAgICAgICAgZk11bHQocW1mUmVhbF9fRkRLW2NoXVtpXSwgc2VsZi0+Y2xpcFByb3RlY3RHYWluX19GREspOworICAgICAgICAgIHFtZkltYWdfX0ZES1tjaF1baV0gPQorICAgICAgICAgICAgICBmTXVsdChxbWZJbWFnX19GREtbY2hdW2ldLCBzZWxmLT5jbGlwUHJvdGVjdEdhaW5fX0ZESyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0gLyogRW5kIG9mIGxvb3Agb3ZlciBudW1JbnB1dENoYW5uZWxzICovCisgIH0KKworICBzZWxmLT5xbWZJbnB1dERlbGF5QnVmUG9zID0KKyAgICAgIChzZWxmLT5xbWZJbnB1dERlbGF5QnVmUG9zICsgMSkgJSBzZWxmLT5wY19maWx0ZXJkZWxheTsKKworICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogU3BhdGlhbERlY0h5YnJpZEFuYWx5c2lzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246CisKKyBBcmd1bWVudHM6CisKKyBJbnB1dDoKKyAgZmxvYXQqKiBwb2ludGVyc1s0XSBsZWZ0UmVhbCwgbGVmdEltLCByaWdodFJlYWwsIHJpZ2h0SW0KKworIE91dHB1dDoKKyAgZmxvYXQgc2VsZi0+cW1mSW5wdXRSZWFsW01BWF9JTlBVVF9DSEFOTkVMU11bTUFYX1RJTUVfU0xPVFNdW01BWF9RTUZfQkFORFNdOworICBmbG9hdCBzZWxmLT5xbWZJbnB1dEltYWdbTUFYX0lOUFVUX0NIQU5ORUxTXVtNQVhfVElNRV9TTE9UU11bTUFYX1FNRl9CQU5EU107CisKKyAgZmxvYXQKK3NlbGYtPmh5YklucHV0UmVhbFtNQVhfSU5QVVRfQ0hBTk5FTFNdW01BWF9USU1FX1NMT1RTXVtNQVhfSFlCUklEX0JBTkRTXTsgZmxvYXQKK3NlbGYtPmh5YklucHV0SW1hZ1tNQVhfSU5QVVRfQ0hBTk5FTFNdW01BWF9USU1FX1NMT1RTXVtNQVhfSFlCUklEX0JBTkRTXTsKKworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNIeWJyaWRBbmFseXNpcyhzcGF0aWFsRGVjICpzZWxmLCBGSVhQX0RCTCAqKnFtZklucHV0UmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxbWZJbnB1dEltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqaHliT3V0cHV0UmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipoeWJPdXRwdXRJbWFnLCBjb25zdCBJTlQgdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBudW1JbnB1dENoYW5uZWxzKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIGludCBjaDsKKworICBmb3IgKGNoID0gMDsgY2ggPCBudW1JbnB1dENoYW5uZWxzOworICAgICAgIGNoKyspIC8qIGh5YnJpZCBmaWx0ZXJpbmcgZm9yIGRvd24tbWl4IHNpZ25hbHMgKi8KKyAgeworICAgIGlmIChzZWxmLT5wQ29uZmlnQ3VycmVudC0+c3ludGF4RmxhZ3MgJiBTQUNERUNfU1lOVEFYX0xEKSB7CisgICAgICBpbnQgazsKKyAgICAgIC8qIE5vIGh5YnJpZCBmaWx0ZXJpbmcuIEp1c3QgY29weSB0aGUgUU1GIGRhdGEuICovCisgICAgICBmb3IgKGsgPSAwOyBrIDwgc2VsZi0+aHlicmlkQmFuZHM7IGsgKz0gMSkgeworICAgICAgICBoeWJPdXRwdXRSZWFsW2NoXVtrXSA9IHFtZklucHV0UmVhbFtjaF1ba107CisgICAgICAgIGh5Yk91dHB1dEltYWdbY2hdW2tdID0gcW1mSW5wdXRJbWFnW2NoXVtrXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc2VsZi0+aHlicmlkQW5hbHlzaXNbY2hdLmhmTW9kZSA9IHNlbGYtPmJTaGFyZURlbGF5V2l0aFNCUjsKKworICAgICAgaWYgKHNlbGYtPnN0ZXJlb0NvbmZpZ0luZGV4ID09IDMpCisgICAgICAgIEZES19BU1NFUlQoc2VsZi0+aHlicmlkQW5hbHlzaXNbY2hdLmhmTW9kZSA9PSAwKTsKKyAgICAgIEZES2h5YnJpZEFuYWx5c2lzQXBwbHkoJnNlbGYtPmh5YnJpZEFuYWx5c2lzW2NoXSwgcW1mSW5wdXRSZWFsW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW1mSW5wdXRJbWFnW2NoXSwgaHliT3V0cHV0UmVhbFtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh5Yk91dHB1dEltYWdbY2hdKTsKKyAgICB9CisgIH0KKworICBpZiAoKHNlbGYtPnBDb25maWdDdXJyZW50LT5zeW50YXhGbGFncyAmIFNBQ0RFQ19TWU5UQVhfVVNBQykgJiYKKyAgICAgIHNlbGYtPnJlc2lkdWFsQ29kaW5nKSB7CisgICAgc2VsZi0+aHlicmlkQW5hbHlzaXNbbnVtSW5wdXRDaGFubmVsc10uaGZNb2RlID0gMDsKKyAgICBGREtoeWJyaWRBbmFseXNpc0FwcGx5KAorICAgICAgICAmc2VsZi0+aHlicmlkQW5hbHlzaXNbbnVtSW5wdXRDaGFubmVsc10sCisgICAgICAgIHNlbGYtPnFtZlJlc2lkdWFsUmVhbF9fRkRLWzBdWzBdLCBzZWxmLT5xbWZSZXNpZHVhbEltYWdfX0ZES1swXVswXSwKKyAgICAgICAgc2VsZi0+aHliUmVzaWR1YWxSZWFsX19GREtbMF0sIHNlbGYtPmh5YlJlc2lkdWFsSW1hZ19fRkRLWzBdKTsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQ3JlYXRlWChzcGF0aWFsRGVjICpzZWxmLCBGSVhQX0RCTCAqKmh5YklucHV0UmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmh5YklucHV0SW1hZywgRklYUF9EQkwgKipweFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipweEltYWcpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKyAgaW50IHJvdzsKKworICAvKiBDcmVhdGluZyB3RHJ5ICovCisgIGZvciAocm93ID0gMDsgcm93IDwgc2VsZi0+bnVtSW5wdXRDaGFubmVsczsgcm93KyspIHsKKyAgICAvKiBwb2ludGVyIHRvIGRpcmVjdCBzaWduYWxzICovCisgICAgcHhSZWFsW3Jvd10gPSBoeWJJbnB1dFJlYWxbcm93XTsKKyAgICBweEltYWdbcm93XSA9IGh5YklucHV0SW1hZ1tyb3ddOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgTTJQYXJhbVRvS2VybmVsTXVsdChGSVhQX1NHTCAqUkVTVFJJQ1QgcEtlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIE1wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIE1wYXJhbVByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqUkVTVFJJQ1QgcFdpZHRoLCBGSVhQX1NHTCBhbHBoYV9fRkRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkJhbmRzKSB7CisgIGludCBwYjsKKworICBmb3IgKHBiID0gMDsgcGIgPCBuQmFuZHM7IHBiKyspIHsKKyAgICBGSVhQX1NHTCB0bXAgPSBGWF9EQkwyRlhfU0dMKAorICAgICAgICBpbnRlcnBvbGF0ZVBhcmFtZXRlcihhbHBoYV9fRkRLLCBNcGFyYW1bcGJdLCBNcGFyYW1QcmV2W3BiXSkpOworCisgICAgaW50IGkgPSBwV2lkdGhbcGJdOworICAgIGlmIChpICYgMSkgKnBLZXJuZWwrKyA9IHRtcDsKKyAgICBpZiAoaSAmIDIpIHsKKyAgICAgICpwS2VybmVsKysgPSB0bXA7CisgICAgICAqcEtlcm5lbCsrID0gdG1wOworICAgIH0KKyAgICBmb3IgKGkgPj49IDI7IGktLTspIHsKKyAgICAgICpwS2VybmVsKysgPSB0bXA7CisgICAgICAqcEtlcm5lbCsrID0gdG1wOworICAgICAgKnBLZXJuZWwrKyA9IHRtcDsKKyAgICAgICpwS2VybmVsKysgPSB0bXA7CisgICAgfQorICB9Cit9CisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjQXBwbHlNMV9DcmVhdGVXX01vZGUyMTIoCisgICAgc3BhdGlhbERlYyAqc2VsZiwgY29uc3QgU1BBVElBTF9CU19GUkFNRSAqZnJhbWUsIEZJWFBfREJMICoqeFJlYWwsCisgICAgRklYUF9EQkwgKip4SW1hZywgRklYUF9EQkwgKip2UmVhbCwgRklYUF9EQkwgKip2SW1hZykgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworICBpbnQgcmVzOworICBGSVhQX0RCTCAqZGVjb3JySW5SZWFsID0gdlJlYWxbMF07CisgIEZJWFBfREJMICpkZWNvcnJJbkltYWcgPSB2SW1hZ1swXTsKKworICAvKiBNMSBkb2VzIG5vdCBkbyBhbnl0aGluZyBpbiAyMTIgbW9kZSwgc28gdXNlIHNpbXBsaWZpZWQgcHJvY2Vzc2luZyAqLworICBGREtfQVNTRVJUKHNlbGYtPm51bVZDaGFubmVscyA9PSAyKTsKKyAgRkRLX0FTU0VSVChzZWxmLT5udW1EaXJla3RTaWduYWxzID09IDEpOworICBGREtfQVNTRVJUKHNlbGYtPm51bURlY29yU2lnbmFscyA9PSAxKTsKKyAgRkRLbWVtY3B5KHZSZWFsWzBdLCB4UmVhbFswXSwgc2VsZi0+aHlicmlkQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY3B5KHZJbWFnWzBdLCB4SW1hZ1swXSwgc2VsZi0+aHlicmlkQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKworICBpZiAoaXNUc2RBY3RpdmUoZnJhbWUtPlRzZERhdGEpKSB7CisgICAgLyogR2VuZXJhdGUgdl97eCxub25Ucn0gYXMgaW5wdXQgZm9yIGFsbHBhc3MgYmFzZWQgZGVjb3JyZWxhdG9yICovCisgICAgVHNkR2VuZXJhdGVOb25UcihzZWxmLT5oeWJyaWRCYW5kcywgZnJhbWUtPlRzZERhdGEsIHNlbGYtPlRzZFRzLCB2UmVhbFswXSwKKyAgICAgICAgICAgICAgICAgICAgIHZJbWFnWzBdLCB2UmVhbFsxXSwgdkltYWdbMV0sICZkZWNvcnJJblJlYWwsCisgICAgICAgICAgICAgICAgICAgICAmZGVjb3JySW5JbWFnKTsKKyAgfQorICAvKiAtIERlY29ycmVsYXRlICovCisgIHJlcyA9IFNwYXRpYWxEZWNHZXRSZXNpZHVhbEluZGV4KHNlbGYsIDEpOworICBpZiAoRkRLZGVjb3JyZWxhdGVBcHBseSgmc2VsZi0+YXBEZWNvclswXSwgZGVjb3JySW5SZWFsLCBkZWNvcnJJbkltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZSZWFsWzFdLCB2SW1hZ1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+cGFyYW0yaHliW3NlbGYtPnJlc2lkdWFsQmFuZHNbcmVzXV0pKSB7CisgICAgcmV0dXJuIE1QU19OT1RPSzsKKyAgfQorICBpZiAoaXNUc2RBY3RpdmUoZnJhbWUtPlRzZERhdGEpKSB7CisgICAgLyogR2VuZXJhdGUgdl97eCxUcn0sIGFwcGx5IHRyYW5zaWVudCBkZWNvcnJlbGF0b3IgYW5kIGFkZCB0byBhbGxwYXNzIGJhc2VkCisgICAgICogZGVjb3JyZWxhdG9yIG91dHB1dCAqLworICAgIFRzZEFwcGx5KHNlbGYtPmh5YnJpZEJhbmRzLCBmcmFtZS0+VHNkRGF0YSwgJnNlbGYtPlRzZFRzLAorICAgICAgICAgICAgIHZSZWFsWzBdLCAvKiBpbnB1dDogdl94ICovCisgICAgICAgICAgICAgdkltYWdbMF0sCisgICAgICAgICAgICAgdlJlYWxbMV0sIC8qIGlucHV0OiBkX3t4LG5vblRyfTsgb3V0cHV0OiBkX3t4LG5vblRyfSArIGRfe3gsVHJ9ICovCisgICAgICAgICAgICAgdkltYWdbMV0pOworICB9CisKKyAgLyogV3JpdGUgcmVzaWR1YWwgc2lnbmFsIGluIGFwcHJvcmlhdGUgcGFyYW1ldGVyIGJhbmRzICovCisgIGlmIChzZWxmLT5yZXNpZHVhbEJhbmRzW3Jlc10gPiAwKSB7CisgICAgaW50IHN0b3BCYW5kID0gc2VsZi0+cGFyYW0yaHliW3NlbGYtPnJlc2lkdWFsQmFuZHNbcmVzXV07CisgICAgRkRLbWVtY3B5KHZSZWFsWzFdLCBzZWxmLT5oeWJSZXNpZHVhbFJlYWxfX0ZES1tyZXNdLAorICAgICAgICAgICAgICBmaXhNaW4oc3RvcEJhbmQsIHNlbGYtPmh5YnJpZEJhbmRzKSAqIHNpemVvZihGSVhQX0RCTCkpOworICAgIEZES21lbWNweSh2SW1hZ1sxXSwgc2VsZi0+aHliUmVzaWR1YWxJbWFnX19GREtbcmVzXSwKKyAgICAgICAgICAgICAgZml4TWluKHN0b3BCYW5kLCBzZWxmLT5oeWJyaWRCYW5kcykgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgfSAvKiAoc2VsZi0+cmVzaWR1YWxCYW5kc1tyZXNdPjApICovCisKKyAgcmV0dXJuIGVycjsKK30KKworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNBcHBseU0yX01vZGUyMTIoc3BhdGlhbERlYyAqc2VsZiwgSU5UIHBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgYWxwaGEsIEZJWFBfREJMICoqd1JlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKndJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipoeWJPdXRwdXRSZWFsRHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipoeWJPdXRwdXRJbWFnRHJ5KSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisgIElOVCByb3c7CisKKyAgSU5UICpwV2lkdGggPSBzZWxmLT5rZXJuZWxzX3dpZHRoOworICAvKiBmb3Igc3RlcmVvQ29uZmlnSW5kZXggPT0gMyBjYXNlIGh5YnJpZEJhbmRzIGlzIDwgNzEgKi8KKyAgSU5UIHBiX21heCA9IHNlbGYtPmtlcm5lbHNbc2VsZi0+aHlicmlkQmFuZHMgLSAxXSArIDE7CisgIElOVCBtYXhfcm93ID0gc2VsZi0+bnVtT3V0cHV0Q2hhbm5lbHM7CisKKyAgSU5UIE0yX2V4cCA9IDA7CisgIGlmIChzZWxmLT5yZXNpZHVhbENvZGluZykgTTJfZXhwID0gMzsKKworICBmb3IgKHJvdyA9IDA7IHJvdyA8IG1heF9yb3c7IHJvdysrKSAgLy8gMiB0aW1lcworICB7CisgICAgRklYUF9EQkwgKk1wYXJhbTAgPSBzZWxmLT5NMlJlYWxfX0ZES1tyb3ddWzBdOworICAgIEZJWFBfREJMICpNcGFyYW0xID0gc2VsZi0+TTJSZWFsX19GREtbcm93XVsxXTsKKyAgICBGSVhQX0RCTCAqTXBhcmFtUHJldjAgPSBzZWxmLT5NMlJlYWxQcmV2X19GREtbcm93XVswXTsKKyAgICBGSVhQX0RCTCAqTXBhcmFtUHJldjEgPSBzZWxmLT5NMlJlYWxQcmV2X19GREtbcm93XVsxXTsKKworICAgIEZJWFBfREJMICpSRVNUUklDVCBwSHliT3V0UmVhbERyeSA9IGh5Yk91dHB1dFJlYWxEcnlbcm93XTsKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcEh5Yk91dEltYWdEcnkgPSBoeWJPdXRwdXRJbWFnRHJ5W3Jvd107CisKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcFdSZWFsMCA9IHdSZWFsWzBdOworICAgIEZJWFBfREJMICpSRVNUUklDVCBwV1JlYWwxID0gd1JlYWxbMV07CisgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBXSW1hZzAgPSB3SW1hZ1swXTsKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcFdJbWFnMSA9IHdJbWFnWzFdOworICAgIGZvciAoSU5UIHBiID0gMDsgcGIgPCBwYl9tYXg7IHBiKyspIHsKKyAgICAgIEZJWFBfREJMIHRtcDAsIHRtcDE7CisKKyAgICAgIHRtcDAgPSBpbnRlcnBvbGF0ZVBhcmFtZXRlcihhbHBoYSwgTXBhcmFtMFtwYl0sIE1wYXJhbVByZXYwW3BiXSk7CisgICAgICB0bXAxID0gaW50ZXJwb2xhdGVQYXJhbWV0ZXIoYWxwaGEsIE1wYXJhbTFbcGJdLCBNcGFyYW1QcmV2MVtwYl0pOworCisgICAgICBJTlQgaSA9IHBXaWR0aFtwYl07CisKKyAgICAgIGRvICAvLyBhYm91dCAzLTQgdGltZXMKKyAgICAgIHsKKyAgICAgICAgRklYUF9EQkwgdmFyMCwgdmFyMSwgcmVhbCwgaW1hZzsKKworICAgICAgICB2YXIwID0gKnBXUmVhbDArKzsKKyAgICAgICAgdmFyMSA9ICpwV1JlYWwxKys7CisgICAgICAgIHJlYWwgPSBmTXVsdERpdjIodmFyMCwgdG1wMCk7CisgICAgICAgIHZhcjAgPSAqcFdJbWFnMCsrOworICAgICAgICByZWFsID0gZk11bHRBZGREaXYyKHJlYWwsIHZhcjEsIHRtcDEpOworICAgICAgICB2YXIxID0gKnBXSW1hZzErKzsKKyAgICAgICAgaW1hZyA9IGZNdWx0RGl2Mih2YXIwLCB0bXAwKTsKKyAgICAgICAgKnBIeWJPdXRSZWFsRHJ5KysgPSByZWFsIDw8ICgxICsgTTJfZXhwKTsKKyAgICAgICAgaW1hZyA9IGZNdWx0QWRkRGl2MihpbWFnLCB2YXIxLCB0bXAxKTsKKyAgICAgICAgKnBIeWJPdXRJbWFnRHJ5KysgPSBpbWFnIDw8ICgxICsgTTJfZXhwKTsKKyAgICAgIH0gd2hpbGUgKC0taSAhPSAwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGVycjsKK30KKworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNBcHBseU0yX01vZGUyMTJfUmVzaWR1YWxzUGx1c1BoYXNlQ29kaW5nKAorICAgIHNwYXRpYWxEZWMgKnNlbGYsIElOVCBwcywgY29uc3QgRklYUF9TR0wgYWxwaGEsIEZJWFBfREJMICoqd1JlYWwsCisgICAgRklYUF9EQkwgKip3SW1hZywgRklYUF9EQkwgKipoeWJPdXRwdXRSZWFsRHJ5LAorICAgIEZJWFBfREJMICoqaHliT3V0cHV0SW1hZ0RyeSkgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworICBJTlQgcm93OworICBJTlQgc2NhbGVfcGFyYW1fbTI7CisgIElOVCAqcFdpZHRoID0gc2VsZi0+a2VybmVsc193aWR0aDsKKyAgSU5UIHBiX21heCA9IHNlbGYtPmtlcm5lbHNbc2VsZi0+aHlicmlkQmFuZHMgLSAxXSArIDE7CisKKyAgc2NhbGVfcGFyYW1fbTIgPSBTQ0FMRV9QQVJBTV9NMl8yMTJfUFJFRCArIFNDQUxFX0RBVEFfQVBQTFlfTTI7CisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBzZWxmLT5udW1NMnJvd3M7IHJvdysrKSB7CisgICAgSU5UIHFzLCBwYjsKKworICAgIEZJWFBfREJMICpSRVNUUklDVCBwV1JlYWwwID0gd1JlYWxbMF07CisgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBXSW1hZzAgPSB3SW1hZ1swXTsKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcFdSZWFsMSA9IHdSZWFsWzFdOworICAgIEZJWFBfREJMICpSRVNUUklDVCBwV0ltYWcxID0gd0ltYWdbMV07CisKKyAgICBGSVhQX0RCTCAqTVJlYWwwID0gc2VsZi0+TTJSZWFsX19GREtbcm93XVswXTsKKyAgICBGSVhQX0RCTCAqTUltYWcwID0gc2VsZi0+TTJJbWFnX19GREtbcm93XVswXTsKKyAgICBGSVhQX0RCTCAqTVJlYWwxID0gc2VsZi0+TTJSZWFsX19GREtbcm93XVsxXTsKKyAgICBGSVhQX0RCTCAqTVJlYWxQcmV2MCA9IHNlbGYtPk0yUmVhbFByZXZfX0ZES1tyb3ddWzBdOworICAgIEZJWFBfREJMICpNSW1hZ1ByZXYwID0gc2VsZi0+TTJJbWFnUHJldl9fRkRLW3Jvd11bMF07CisgICAgRklYUF9EQkwgKk1SZWFsUHJldjEgPSBzZWxmLT5NMlJlYWxQcmV2X19GREtbcm93XVsxXTsKKworICAgIEZJWFBfREJMICpSRVNUUklDVCBwSHliT3V0UmVhbERyeSA9IGh5Yk91dHB1dFJlYWxEcnlbcm93XTsKKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcEh5Yk91dEltYWdEcnkgPSBoeWJPdXRwdXRJbWFnRHJ5W3Jvd107CisKKyAgICBGREtfQVNTRVJUKCEoc2VsZi0+cENvbmZpZ0N1cnJlbnQtPnN5bnRheEZsYWdzICYgU0FDREVDX1NZTlRBWF9MRCkpOworICAgIEZES19BU1NFUlQoKHBXaWR0aFswXSArIHBXaWR0aFsxXSkgPj0gMyk7CisKKyAgICBmb3IgKHBiID0gMCwgcXMgPSAzOyBwYiA8IDI7IHBiKyspIHsKKyAgICAgIElOVCBzOworICAgICAgRklYUF9EQkwgbWF4VmFsOworICAgICAgRklYUF9TR0wgbVJlYWwxOworICAgICAgRklYUF9TR0wgbVJlYWwwLCBtSW1hZzA7CisgICAgICBGSVhQX0RCTCBpUmVhbDAsIGlJbWFnMCwgaVJlYWwxOworCisgICAgICBpUmVhbDAgPSBpbnRlcnBvbGF0ZVBhcmFtZXRlcihhbHBoYSwgTVJlYWwwW3BiXSwgTVJlYWxQcmV2MFtwYl0pOworICAgICAgaUltYWcwID0gLWludGVycG9sYXRlUGFyYW1ldGVyKGFscGhhLCBNSW1hZzBbcGJdLCBNSW1hZ1ByZXYwW3BiXSk7CisgICAgICBpUmVhbDEgPSBpbnRlcnBvbGF0ZVBhcmFtZXRlcihhbHBoYSwgTVJlYWwxW3BiXSwgTVJlYWxQcmV2MVtwYl0pOworCisgICAgICBtYXhWYWwgPSBmQWJzKGlSZWFsMCkgfCBmQWJzKGlJbWFnMCk7CisgICAgICBtYXhWYWwgfD0gZkFicyhpUmVhbDEpOworCisgICAgICBzID0gZk1heChDbnRMZWFkaW5nWmVyb3MobWF4VmFsKSAtIDEsIDApOworICAgICAgcyA9IGZNaW4ocywgc2NhbGVfcGFyYW1fbTIpOworCisgICAgICBtUmVhbDAgPSBGWF9EQkwyRlhfU0dMKGlSZWFsMCA8PCBzKTsKKyAgICAgIG1JbWFnMCA9IEZYX0RCTDJGWF9TR0woaUltYWcwIDw8IHMpOworICAgICAgbVJlYWwxID0gRlhfREJMMkZYX1NHTChpUmVhbDEgPDwgcyk7CisKKyAgICAgIHMgPSBzY2FsZV9wYXJhbV9tMiAtIHM7CisKKyAgICAgIElOVCBpID0gcFdpZHRoW3BiXTsKKworICAgICAgZG8geworICAgICAgICBGSVhQX0RCTCByZWFsLCBpbWFnLCB3UmVhbDAsIHdJbWFnMCwgd1JlYWwxLCB3SW1hZzE7CisKKyAgICAgICAgd1JlYWwwID0gKnBXUmVhbDArKzsKKyAgICAgICAgd0ltYWcwID0gKnBXSW1hZzArKzsKKyAgICAgICAgd1JlYWwxID0gKnBXUmVhbDErKzsKKyAgICAgICAgd0ltYWcxID0gKnBXSW1hZzErKzsKKworICAgICAgICBjcGx4TXVsdERpdjIoJnJlYWwsICZpbWFnLCB3UmVhbDAsIHdJbWFnMCwgbVJlYWwwLCBtSW1hZzApOworCisgICAgICAgICpwSHliT3V0UmVhbERyeSsrID0gZk11bHRBZGREaXYyKHJlYWwsIHdSZWFsMSwgbVJlYWwxKSA8PCBzOworICAgICAgICAqcEh5Yk91dEltYWdEcnkrKyA9IGZNdWx0QWRkRGl2MihpbWFnLCB3SW1hZzEsIG1SZWFsMSkgPDwgczsKKworICAgICAgICBpZiAocXMgPiAwKSB7CisgICAgICAgICAgbUltYWcwID0gLW1JbWFnMDsKKyAgICAgICAgICBxcy0tOworICAgICAgICB9CisgICAgICB9IHdoaWxlICgtLWkgIT0gMCk7CisgICAgfQorCisgICAgZm9yICg7IHBiIDwgcGJfbWF4OyBwYisrKSB7CisgICAgICBJTlQgczsKKyAgICAgIEZJWFBfREJMIG1heFZhbDsKKyAgICAgIEZJWFBfU0dMIG1SZWFsMTsKKyAgICAgIEZJWFBfU0dMIG1SZWFsMCwgbUltYWcwOworICAgICAgRklYUF9EQkwgaVJlYWwwLCBpSW1hZzAsIGlSZWFsMTsKKworICAgICAgaVJlYWwwID0gaW50ZXJwb2xhdGVQYXJhbWV0ZXIoYWxwaGEsIE1SZWFsMFtwYl0sIE1SZWFsUHJldjBbcGJdKTsKKyAgICAgIGlJbWFnMCA9IGludGVycG9sYXRlUGFyYW1ldGVyKGFscGhhLCBNSW1hZzBbcGJdLCBNSW1hZ1ByZXYwW3BiXSk7CisgICAgICBpUmVhbDEgPSBpbnRlcnBvbGF0ZVBhcmFtZXRlcihhbHBoYSwgTVJlYWwxW3BiXSwgTVJlYWxQcmV2MVtwYl0pOworCisgICAgICBtYXhWYWwgPSBmQWJzKGlSZWFsMCkgfCBmQWJzKGlJbWFnMCk7CisgICAgICBtYXhWYWwgfD0gZkFicyhpUmVhbDEpOworCisgICAgICBzID0gZk1heChDbnRMZWFkaW5nWmVyb3MobWF4VmFsKSAtIDEsIDApOworICAgICAgcyA9IGZNaW4ocywgc2NhbGVfcGFyYW1fbTIpOworCisgICAgICBtUmVhbDAgPSBGWF9EQkwyRlhfU0dMKGlSZWFsMCA8PCBzKTsKKyAgICAgIG1JbWFnMCA9IEZYX0RCTDJGWF9TR0woaUltYWcwIDw8IHMpOworICAgICAgbVJlYWwxID0gRlhfREJMMkZYX1NHTChpUmVhbDEgPDwgcyk7CisKKyAgICAgIHMgPSBzY2FsZV9wYXJhbV9tMiAtIHM7CisKKyAgICAgIElOVCBpID0gcFdpZHRoW3BiXTsKKworICAgICAgZG8geworICAgICAgICBGSVhQX0RCTCByZWFsLCBpbWFnLCB3UmVhbDAsIHdJbWFnMCwgd1JlYWwxLCB3SW1hZzE7CisKKyAgICAgICAgd1JlYWwwID0gKnBXUmVhbDArKzsKKyAgICAgICAgd0ltYWcwID0gKnBXSW1hZzArKzsKKyAgICAgICAgd1JlYWwxID0gKnBXUmVhbDErKzsKKyAgICAgICAgd0ltYWcxID0gKnBXSW1hZzErKzsKKworICAgICAgICBjcGx4TXVsdERpdjIoJnJlYWwsICZpbWFnLCB3UmVhbDAsIHdJbWFnMCwgbVJlYWwwLCBtSW1hZzApOworCisgICAgICAgICpwSHliT3V0UmVhbERyeSsrID0gZk11bHRBZGREaXYyKHJlYWwsIHdSZWFsMSwgbVJlYWwxKSA8PCBzOworICAgICAgICAqcEh5Yk91dEltYWdEcnkrKyA9IGZNdWx0QWRkRGl2MihpbWFnLCB3SW1hZzEsIG1SZWFsMSkgPDwgczsKKyAgICAgIH0gd2hpbGUgKC0taSAhPSAwKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZXJyOworfQorCitTQUNERUNfRVJST1IgU3BhdGlhbERlY0FwcGx5TTIoc3BhdGlhbERlYyAqc2VsZiwgSU5UIHBzLCBjb25zdCBGSVhQX1NHTCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKndSZWFsLCBGSVhQX0RCTCAqKndJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqaHliT3V0cHV0UmVhbERyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmh5Yk91dHB1dEltYWdEcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipoeWJPdXRwdXRSZWFsV2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqaHliT3V0cHV0SW1hZ1dldCkgeworICBTQUNERUNfRVJST1IgZXJyID0gTVBTX09LOworCisgIHsKKyAgICBpbnQgcXMsIHJvdywgY29sOworICAgIGludCBjb21wbGV4SHliQmFuZHM7CisgICAgaW50IGNvbXBsZXhQYXJCYW5kczsKKyAgICBpbnQgc2NhbGVfcGFyYW1fbTIgPSAwOworICAgIGludCB0b29sc0Rpc2FibGVkOworCisgICAgVUNIQVIgYWN0aXZQYXJhbUJhbmRzOworICAgIEZJWFBfREJMICpSRVNUUklDVCBwV1JlYWwsICpSRVNUUklDVCBwV0ltYWcsICpSRVNUUklDVCBwSHliT3V0UmVhbERyeSwKKyAgICAgICAgKlJFU1RSSUNUIHBIeWJPdXRJbWFnRHJ5LCAqUkVTVFJJQ1QgcEh5Yk91dFJlYWxXZXQsCisgICAgICAgICpSRVNUUklDVCBwSHliT3V0SW1hZ1dldDsKKyAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocEtlcm5lbCwgRklYUF9TR0wsIE1BWF9IWUJSSURfQkFORFMpOworCisgICAgLyogVGhlIHdldCBzaWduYWwgaXMgYWRkZWQgdG8gdGhlIGRyeSBzaWduYWwgZGlyZWN0bHkgaW4gYXBwbHlNMiBpZiBHRVMgYW5kCisgICAgICogU1RQIGFyZSBkaXNhYmxlZCAqLworICAgIHRvb2xzRGlzYWJsZWQgPQorICAgICAgICAoKHNlbGYtPnRlbXBTaGFwZUNvbmZpZyA9PSAxKSB8fCAoc2VsZi0+dGVtcFNoYXBlQ29uZmlnID09IDIpKSA/IDAgOiAxOworCisgICAgeworICAgICAgY29tcGxleEh5YkJhbmRzID0gc2VsZi0+aHlicmlkQmFuZHM7CisgICAgICBjb21wbGV4UGFyQmFuZHMgPSBzZWxmLT5udW1QYXJhbWV0ZXJCYW5kczsKKyAgICB9CisKKyAgICBGREttZW1jbGVhcihoeWJPdXRwdXRJbWFnRHJ5WzBdLAorICAgICAgICAgICAgICAgIHNlbGYtPmNyZWF0ZVBhcmFtcy5tYXhOdW1PdXRwdXRDaGFubmVscyAqCisgICAgICAgICAgICAgICAgICAgIHNlbGYtPmNyZWF0ZVBhcmFtcy5tYXhOdW1DbXBseEh5YkJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgRkRLbWVtY2xlYXIoaHliT3V0cHV0UmVhbERyeVswXSwgc2VsZi0+Y3JlYXRlUGFyYW1zLm1heE51bU91dHB1dENoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+Y3JlYXRlUGFyYW1zLm1heE51bUh5YnJpZEJhbmRzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgICBpZiAoIXRvb2xzRGlzYWJsZWQpIHsKKyAgICAgIEZES21lbWNsZWFyKGh5Yk91dHB1dFJlYWxXZXRbMF0sCisgICAgICAgICAgICAgICAgICBzZWxmLT5jcmVhdGVQYXJhbXMubWF4TnVtT3V0cHV0Q2hhbm5lbHMgKgorICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmNyZWF0ZVBhcmFtcy5tYXhOdW1IeWJyaWRCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgRkRLbWVtY2xlYXIoaHliT3V0cHV0SW1hZ1dldFswXSwKKyAgICAgICAgICAgICAgICAgIHNlbGYtPmNyZWF0ZVBhcmFtcy5tYXhOdW1PdXRwdXRDaGFubmVscyAqCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+Y3JlYXRlUGFyYW1zLm1heE51bUNtcGx4SHliQmFuZHMgKgorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkpOworICAgIH0KKworICAgIGlmIChzZWxmLT5waGFzZUNvZGluZyA9PSAzKSB7CisgICAgICAvKiArIFNDQUxFX0RBVEFfQVBQTFlfTTIgdG8gY29tcGVuc2F0ZSBmb3IgRGl2MiBiZWxvdyA/ISAqLworICAgICAgc2NhbGVfcGFyYW1fbTIgPSBTQ0FMRV9QQVJBTV9NMl8yMTJfUFJFRCArIFNDQUxFX0RBVEFfQVBQTFlfTTI7CisgICAgfQorCisgICAgZm9yIChyb3cgPSAwOyByb3cgPCBzZWxmLT5udW1NMnJvd3M7IHJvdysrKSB7CisgICAgICBwSHliT3V0UmVhbERyeSA9IGh5Yk91dHB1dFJlYWxEcnlbcm93XTsKKyAgICAgIHBIeWJPdXRJbWFnRHJ5ID0gaHliT3V0cHV0SW1hZ0RyeVtyb3ddOworCisgICAgICBpZiAodG9vbHNEaXNhYmxlZCkgeworICAgICAgICBwSHliT3V0UmVhbFdldCA9IGh5Yk91dHB1dFJlYWxEcnlbcm93XTsKKyAgICAgICAgcEh5Yk91dEltYWdXZXQgPSBoeWJPdXRwdXRJbWFnRHJ5W3Jvd107CisgICAgICB9IGVsc2UgeworICAgICAgICBwSHliT3V0UmVhbFdldCA9IGh5Yk91dHB1dFJlYWxXZXRbcm93XTsKKyAgICAgICAgcEh5Yk91dEltYWdXZXQgPSBoeWJPdXRwdXRJbWFnV2V0W3Jvd107CisgICAgICB9CisKKyAgICAgIGZvciAoY29sID0gMDsgY29sIDwgc2VsZi0+bnVtRGlyZWt0U2lnbmFsczsgY29sKyspIHsKKyAgICAgICAgaWYgKHNlbGYtPnBBY3Rpdk0yUGFyYW1CYW5kcyA9PQorICAgICAgICAgICAgMCkgeyAvKiBkZWZhdWx0IHNldHRpbmcsIGNhbGN1bGF0ZSBhbGwgcm93cyBhbmQgY29sdW1ucyAqLworICAgICAgICAgIGFjdGl2UGFyYW1CYW5kcyA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKHNlbGYtPnBBY3Rpdk0yUGFyYW1CYW5kc1tNQVhfTTJfSU5QVVQgKiByb3cgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sXSkgLyogdGFibGUgd2l0aCBhY3RpdiBhbmQgaW5hY3RpdgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZHMgZXhpc3RzIGZvciBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uICovCisgICAgICAgICAgICBhY3RpdlBhcmFtQmFuZHMgPSAxOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFjdGl2UGFyYW1CYW5kcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFjdGl2UGFyYW1CYW5kcykgeworICAgICAgICAgIHBXUmVhbCA9IHdSZWFsW2NvbF07CisgICAgICAgICAgcFdJbWFnID0gd0ltYWdbY29sXTsKKworICAgICAgICAgIE0yUGFyYW1Ub0tlcm5lbE11bHQocEtlcm5lbCwgc2VsZi0+TTJSZWFsX19GREtbcm93XVtjb2xdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+TTJSZWFsUHJldl9fRkRLW3Jvd11bY29sXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmtlcm5lbHNfd2lkdGgsIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+bnVtUGFyYW1ldGVyQmFuZHMpOworCisgICAgICAgICAgaWYgKDEgJiYgKHNlbGYtPnBoYXNlQ29kaW5nICE9IDMpKSB7CisgICAgICAgICAgICAvKiBkaXJlY3Qgc2lnbmFscyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBvbmx5IG9uZSBzYW1wbGUgd2lsbCBiZSBhc3NpZ25lZCB0byBlYWNoIHJvdywgaGVuY2UKKyAgICAgICAgICAgICAgICogYWNjdW11bGF0aW9uIGlzIG5vdCBuZWNjZXNzYXJ5OyB0aGF0IGlzIHZhbGlkIGZvciBhbGwKKyAgICAgICAgICAgICAgICogY29uZmlndXJhdGlvbnMgKi8KKyAgICAgICAgICAgICAgZm9yIChxcyA9IDA7IHFzIDwgY29tcGxleEh5YkJhbmRzOyBxcysrKSB7CisgICAgICAgICAgICAgICAgcEh5Yk91dFJlYWxEcnlbcXNdID0gZk11bHQocFdSZWFsW3FzXSwgcEtlcm5lbFtxc10pOworICAgICAgICAgICAgICAgIHBIeWJPdXRJbWFnRHJ5W3FzXSA9IGZNdWx0KHBXSW1hZ1txc10sIHBLZXJuZWxbcXNdKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7IC8qICBpc0JpbmF1cmFsTW9kZShzZWxmLT51cG1peFR5cGUpICAqLworCisgICAgICAgICAgICBmb3IgKHFzID0gMDsgcXMgPCBjb21wbGV4SHliQmFuZHM7IHFzKyspIHsKKyAgICAgICAgICAgICAgcEh5Yk91dFJlYWxEcnlbcXNdICs9IGZNdWx0RGl2MihwV1JlYWxbcXNdLCBwS2VybmVsW3FzXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisgICAgICAgICAgICAgIHBIeWJPdXRJbWFnRHJ5W3FzXSArPSBmTXVsdERpdjIocFdJbWFnW3FzXSwgcEtlcm5lbFtxc10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGVfcGFyYW1fbTIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNMlBhcmFtVG9LZXJuZWxNdWx0KHBLZXJuZWwsIHNlbGYtPk0ySW1hZ19fRkRLW3Jvd11bY29sXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+TTJJbWFnUHJldl9fRkRLW3Jvd11bY29sXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+a2VybmVsc193aWR0aCwgYWxwaGEsIGNvbXBsZXhQYXJCYW5kcyk7CisKKyAgICAgICAgICAgIC8qIGRpcmVjdCBzaWduYWxzIHNpZ24gaXMgLTEgZm9yIHFzID0gMCwyICovCisgICAgICAgICAgICBwSHliT3V0UmVhbERyeVswXSArPSBmTXVsdERpdjIocFdJbWFnWzBdLCBwS2VybmVsWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKyAgICAgICAgICAgIHBIeWJPdXRJbWFnRHJ5WzBdIC09IGZNdWx0RGl2MihwV1JlYWxbMF0sIHBLZXJuZWxbMF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGVfcGFyYW1fbTIpOworCisgICAgICAgICAgICBwSHliT3V0UmVhbERyeVsyXSArPSBmTXVsdERpdjIocFdJbWFnWzJdLCBwS2VybmVsWzJdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKyAgICAgICAgICAgIHBIeWJPdXRJbWFnRHJ5WzJdIC09IGZNdWx0RGl2MihwV1JlYWxbMl0sIHBLZXJuZWxbMl0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGVfcGFyYW1fbTIpOworCisgICAgICAgICAgICAvKiBkaXJlY3Qgc2lnbmFscyBzaWduIGlzICsxIGZvciBxcyA9IDEsMyw0LDUsLi4uLGNvbXBsZXhIeWJCYW5kcyAqLworICAgICAgICAgICAgcEh5Yk91dFJlYWxEcnlbMV0gLT0gZk11bHREaXYyKHBXSW1hZ1sxXSwgcEtlcm5lbFsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisgICAgICAgICAgICBwSHliT3V0SW1hZ0RyeVsxXSArPSBmTXVsdERpdjIocFdSZWFsWzFdLCBwS2VybmVsWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKworICAgICAgICAgICAgZm9yIChxcyA9IDM7IHFzIDwgY29tcGxleEh5YkJhbmRzOyBxcysrKSB7CisgICAgICAgICAgICAgIHBIeWJPdXRSZWFsRHJ5W3FzXSAtPSBmTXVsdERpdjIocFdJbWFnW3FzXSwgcEtlcm5lbFtxc10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGVfcGFyYW1fbTIpOworICAgICAgICAgICAgICBwSHliT3V0SW1hZ0RyeVtxc10gKz0gZk11bHREaXYyKHBXUmVhbFtxc10sIHBLZXJuZWxbcXNdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IC8qIHNlbGYtPnVwbWl4VHlwZSAqLworICAgICAgICB9ICAgLyogaWYgKGFjdGl2UGFyYW1CYW5kcykgKi8KKyAgICAgIH0gICAgIC8qIHNlbGYtPm51bURpcmVrdFNpZ25hbHMgKi8KKworICAgICAgZm9yICg7IGNvbCA8IHNlbGYtPm51bVZDaGFubmVsczsgY29sKyspIHsKKyAgICAgICAgaWYgKHNlbGYtPnBBY3Rpdk0yUGFyYW1CYW5kcyA9PQorICAgICAgICAgICAgMCkgeyAvKiBkZWZhdWx0IHNldHRpbmcsIGNhbGN1bGF0ZSBhbGwgcm93cyBhbmQgY29sdW1ucyAqLworICAgICAgICAgIGFjdGl2UGFyYW1CYW5kcyA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKHNlbGYtPnBBY3Rpdk0yUGFyYW1CYW5kc1tNQVhfTTJfSU5QVVQgKiByb3cgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sXSkgLyogdGFibGUgd2l0aCBhY3RpdiBhbmQgaW5hY3RpdgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZHMgZXhpc3RzIGZvciBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uICovCisgICAgICAgICAgICBhY3RpdlBhcmFtQmFuZHMgPSAxOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFjdGl2UGFyYW1CYW5kcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWN0aXZQYXJhbUJhbmRzKSB7CisgICAgICAgICAgaW50IHJlc0JhbmRJbmRleDsKKyAgICAgICAgICBpbnQgcmVzSHliSW5kZXg7CisKKyAgICAgICAgICByZXNCYW5kSW5kZXggPQorICAgICAgICAgICAgICBzZWxmLT5yZXNpZHVhbEJhbmRzW1NwYXRpYWxEZWNHZXRSZXNpZHVhbEluZGV4KHNlbGYsIGNvbCldOworICAgICAgICAgIHJlc0h5YkluZGV4ID0gc2VsZi0+cGFyYW0yaHliW3Jlc0JhbmRJbmRleF07CisKKyAgICAgICAgICBwV1JlYWwgPSB3UmVhbFtjb2xdOworICAgICAgICAgIHBXSW1hZyA9IHdJbWFnW2NvbF07CisKKyAgICAgICAgICBNMlBhcmFtVG9LZXJuZWxNdWx0KHBLZXJuZWwsIHNlbGYtPk0yUmVhbF9fRkRLW3Jvd11bY29sXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPk0yUmVhbFByZXZfX0ZES1tyb3ddW2NvbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5rZXJuZWxzX3dpZHRoLCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPm51bVBhcmFtZXRlckJhbmRzKTsKKworICAgICAgICAgIGlmICgxICYmIChzZWxmLT5waGFzZUNvZGluZyAhPSAzKSkgeworICAgICAgICAgICAgLyogcmVzaWR1YWwgc2lnbmFscyAqLworICAgICAgICAgICAgZm9yIChxcyA9IDA7IHFzIDwgcmVzSHliSW5kZXg7IHFzKyspIHsKKyAgICAgICAgICAgICAgcEh5Yk91dFJlYWxEcnlbcXNdICs9IGZNdWx0KHBXUmVhbFtxc10sIHBLZXJuZWxbcXNdKTsKKyAgICAgICAgICAgICAgcEh5Yk91dEltYWdEcnlbcXNdICs9IGZNdWx0KHBXSW1hZ1txc10sIHBLZXJuZWxbcXNdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGRlY29yIHNpZ25hbHMgKi8KKyAgICAgICAgICAgIGZvciAoOyBxcyA8IGNvbXBsZXhIeWJCYW5kczsgcXMrKykgeworICAgICAgICAgICAgICBwSHliT3V0UmVhbFdldFtxc10gKz0gZk11bHQocFdSZWFsW3FzXSwgcEtlcm5lbFtxc10pOworICAgICAgICAgICAgICBwSHliT3V0SW1hZ1dldFtxc10gKz0gZk11bHQocFdJbWFnW3FzXSwgcEtlcm5lbFtxc10pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7IC8qIHNlbGYtPnVwbWl4VHlwZSAqLworICAgICAgICAgICAgLyogcmVzaWR1YWwgc2lnbmFscyAqLworICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBIeWJPdXRSZWFsOworICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBIeWJPdXRJbWFnOworCisgICAgICAgICAgICBmb3IgKHFzID0gMDsgcXMgPCByZXNIeWJJbmRleDsgcXMrKykgeworICAgICAgICAgICAgICBwSHliT3V0UmVhbERyeVtxc10gKz0gZk11bHREaXYyKHBXUmVhbFtxc10sIHBLZXJuZWxbcXNdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKyAgICAgICAgICAgICAgcEh5Yk91dEltYWdEcnlbcXNdICs9IGZNdWx0RGl2MihwV0ltYWdbcXNdLCBwS2VybmVsW3FzXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBkZWNvciBzaWduYWxzICovCisgICAgICAgICAgICBmb3IgKDsgcXMgPCBjb21wbGV4SHliQmFuZHM7IHFzKyspIHsKKyAgICAgICAgICAgICAgcEh5Yk91dFJlYWxXZXRbcXNdICs9IGZNdWx0RGl2MihwV1JlYWxbcXNdLCBwS2VybmVsW3FzXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisgICAgICAgICAgICAgIHBIeWJPdXRJbWFnV2V0W3FzXSArPSBmTXVsdERpdjIocFdJbWFnW3FzXSwgcEtlcm5lbFtxc10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGVfcGFyYW1fbTIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNMlBhcmFtVG9LZXJuZWxNdWx0KHBLZXJuZWwsIHNlbGYtPk0ySW1hZ19fRkRLW3Jvd11bY29sXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+TTJJbWFnUHJldl9fRkRLW3Jvd11bY29sXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+a2VybmVsc193aWR0aCwgYWxwaGEsIGNvbXBsZXhQYXJCYW5kcyk7CisKKyAgICAgICAgICAgIC8qIGRpcmVjdCBzaWduYWxzIHNpZ24gaXMgLTEgZm9yIHFzID0gMCwyICovCisgICAgICAgICAgICAvKiBkaXJlY3Qgc2lnbmFscyBzaWduIGlzICsxIGZvciBxcyA9IDEsMy4uICovCisgICAgICAgICAgICBpZiAodG9vbHNEaXNhYmxlZCkgeworICAgICAgICAgICAgICBwSHliT3V0UmVhbERyeVswXSArPSBmTXVsdERpdjIocFdJbWFnWzBdLCBwS2VybmVsWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGVfcGFyYW1fbTIpOworICAgICAgICAgICAgICBwSHliT3V0SW1hZ0RyeVswXSAtPSBmTXVsdERpdjIocFdSZWFsWzBdLCBwS2VybmVsWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGVfcGFyYW1fbTIpOworCisgICAgICAgICAgICAgIHBIeWJPdXRSZWFsRHJ5WzFdIC09IGZNdWx0RGl2MihwV0ltYWdbMV0sIHBLZXJuZWxbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisgICAgICAgICAgICAgIHBIeWJPdXRJbWFnRHJ5WzFdICs9IGZNdWx0RGl2MihwV1JlYWxbMV0sIHBLZXJuZWxbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisKKyAgICAgICAgICAgICAgcEh5Yk91dFJlYWxEcnlbMl0gKz0gZk11bHREaXYyKHBXSW1hZ1syXSwgcEtlcm5lbFsyXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKyAgICAgICAgICAgICAgcEh5Yk91dEltYWdEcnlbMl0gLT0gZk11bHREaXYyKHBXUmVhbFsyXSwgcEtlcm5lbFsyXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHBIeWJPdXRSZWFsID0gJnBIeWJPdXRSZWFsRHJ5WzBdOworICAgICAgICAgICAgICBwSHliT3V0SW1hZyA9ICZwSHliT3V0SW1hZ0RyeVswXTsKKyAgICAgICAgICAgICAgaWYgKDAgPT0gcmVzSHliSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBwSHliT3V0UmVhbCA9ICZwSHliT3V0UmVhbFdldFswXTsKKyAgICAgICAgICAgICAgICBwSHliT3V0SW1hZyA9ICZwSHliT3V0SW1hZ1dldFswXTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBwSHliT3V0UmVhbFswXSArPSBmTXVsdERpdjIocFdJbWFnWzBdLCBwS2VybmVsWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGVfcGFyYW1fbTIpOworICAgICAgICAgICAgICBwSHliT3V0SW1hZ1swXSAtPSBmTXVsdERpdjIocFdSZWFsWzBdLCBwS2VybmVsWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGVfcGFyYW1fbTIpOworCisgICAgICAgICAgICAgIGlmICgxID09IHJlc0h5YkluZGV4KSB7CisgICAgICAgICAgICAgICAgcEh5Yk91dFJlYWwgPSAmcEh5Yk91dFJlYWxXZXRbMF07CisgICAgICAgICAgICAgICAgcEh5Yk91dEltYWcgPSAmcEh5Yk91dEltYWdXZXRbMF07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgcEh5Yk91dFJlYWxbMV0gLT0gZk11bHREaXYyKHBXSW1hZ1sxXSwgcEtlcm5lbFsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKyAgICAgICAgICAgICAgcEh5Yk91dEltYWdbMV0gKz0gZk11bHREaXYyKHBXUmVhbFsxXSwgcEtlcm5lbFsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKworICAgICAgICAgICAgICBpZiAoMiA9PSByZXNIeWJJbmRleCkgeworICAgICAgICAgICAgICAgIHBIeWJPdXRSZWFsID0gJnBIeWJPdXRSZWFsV2V0WzBdOworICAgICAgICAgICAgICAgIHBIeWJPdXRJbWFnID0gJnBIeWJPdXRJbWFnV2V0WzBdOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHBIeWJPdXRSZWFsWzJdICs9IGZNdWx0RGl2MihwV0ltYWdbMl0sIHBLZXJuZWxbMl0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisgICAgICAgICAgICAgIHBIeWJPdXRJbWFnWzJdIC09IGZNdWx0RGl2MihwV1JlYWxbMl0sIHBLZXJuZWxbMl0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAocXMgPSAzOyBxcyA8IHJlc0h5YkluZGV4OyBxcysrKSB7CisgICAgICAgICAgICAgIHBIeWJPdXRSZWFsRHJ5W3FzXSAtPSBmTXVsdERpdjIocFdJbWFnW3FzXSwgcEtlcm5lbFtxc10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoc2NhbGVfcGFyYW1fbTIpOworICAgICAgICAgICAgICBwSHliT3V0SW1hZ0RyeVtxc10gKz0gZk11bHREaXYyKHBXUmVhbFtxc10sIHBLZXJuZWxbcXNdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGRlY29yIHNpZ25hbHMgKi8KKyAgICAgICAgICAgIGZvciAoOyBxcyA8IGNvbXBsZXhIeWJCYW5kczsgcXMrKykgeworICAgICAgICAgICAgICBwSHliT3V0UmVhbFdldFtxc10gLT0gZk11bHREaXYyKHBXSW1hZ1txc10sIHBLZXJuZWxbcXNdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlX3BhcmFtX20yKTsKKyAgICAgICAgICAgICAgcEh5Yk91dEltYWdXZXRbcXNdICs9IGZNdWx0RGl2MihwV1JlYWxbcXNdLCBwS2VybmVsW3FzXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZV9wYXJhbV9tMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSAvKiBzZWxmLT51cG1peFR5cGUgKi8KKyAgICAgICAgfSAgIC8qIGlmIChhY3RpdlBhcmFtQmFuZHMpIHsgKi8KKyAgICAgIH0gICAgIC8qICBzZWxmLT5udW1WQ2hhbm5lbHMgKi8KKyAgICB9CisKKyAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHBLZXJuZWwsIEZJWFBfU0dMLCBNQVhfSFlCUklEX0JBTkRTKTsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjU3ludGhlc2lzKHNwYXRpYWxEZWMgKnNlbGYsIGNvbnN0IElOVCB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqaHliT3V0cHV0UmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqaHliT3V0cHV0SW1hZywgUENNX01QUyAqdGltZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBudW1JbnB1dENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkRLX2NoYW5uZWxNYXBEZXNjciAqY29uc3QgbWFwRGVzY3IpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKworICBpbnQgY2g7CisgIGludCBzdHJpZGUsIG9mZnNldDsKKworICBzdHJpZGUgPSBzZWxmLT5udW1PdXRwdXRDaGFubmVsc0FUOworICBvZmZzZXQgPSAxOworCisgIFBDTV9NUFMgKnBUaW1lT3V0X19GREsgPQorICAgICAgJnRpbWVPdXRbc3RyaWRlICogc2VsZi0+cFFtZkRvbWFpbi0+Z2xvYmFsQ29uZi5uQmFuZHNTeW50aGVzaXMgKiB0c107CisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChwUW1mUmVhbCwgRklYUF9EQkwsIFFNRl9NQVhfU1lOVEhFU0lTX0JBTkRTKTsKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHBRbWZJbWFnLCBGSVhQX0RCTCwgUU1GX01BWF9TWU5USEVTSVNfQkFORFMpOworCisgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPm51bU91dHB1dENoYW5uZWxzQVQ7IGNoKyspIHsKKyAgICBpZiAoc2VsZi0+cENvbmZpZ0N1cnJlbnQtPnN5bnRheEZsYWdzICYgU0FDREVDX1NZTlRBWF9MRCkgeworICAgICAgaW50IGs7CisgICAgICAvKiBObyBoeWJyaWQgZmlsdGVyaW5nLiBKdXN0IGNvcHkgdGhlIFFNRiBkYXRhLiAqLworICAgICAgZm9yIChrID0gMDsgayA8IHNlbGYtPmh5YnJpZEJhbmRzOyBrICs9IDEpIHsKKyAgICAgICAgcFFtZlJlYWxba10gPSBoeWJPdXRwdXRSZWFsW2NoXVtrXTsKKyAgICAgICAgcFFtZkltYWdba10gPSBoeWJPdXRwdXRJbWFnW2NoXVtrXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgRkRLaHlicmlkU3ludGhlc2lzQXBwbHkoJnNlbGYtPmh5YnJpZFN5bnRoZXNpc1tjaF0sIGh5Yk91dHB1dFJlYWxbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHliT3V0cHV0SW1hZ1tjaF0sIHBRbWZSZWFsLCBwUW1mSW1hZyk7CisgICAgfQorCisgICAgLyogTWFwIGNoYW5uZWwgaW5kaWNlcyBmcm9tIE1QRUcgU3Vycm91bmQgLT4gUENFIHN0eWxlIC0+IGNoYW5uZWxNYXBwaW5nW10KKyAgICAgKi8KKyAgICBGREtfQVNTRVJUKHNlbGYtPm51bU91dHB1dENoYW5uZWxzQVQgPD0gNik7CisgICAgaW50IG91dENoID0gRkRLX2NoTWFwRGVzY3JfZ2V0TWFwVmFsdWUobWFwRGVzY3IsIG1hcENoYW5uZWwoc2VsZiwgY2gpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPm51bU91dHB1dENoYW5uZWxzQVQpOworCisgICAgeworICAgICAgaWYgKHNlbGYtPnN0ZXJlb0NvbmZpZ0luZGV4ID09IDMpIHsKKyAgICAgICAgLyogTVBTIC0+IFNCUiAqLworICAgICAgICBpbnQgaTsKKyAgICAgICAgRklYUF9EQkwgKnBXb3JrQnVmUmVhbCwgKnBXb3JrQnVmSW1hZzsKKyAgICAgICAgRkRLX0FTU0VSVCgoc2VsZi0+cFFtZkRvbWFpbi0+UW1mRG9tYWluT3V0W291dENoXS5mYi5vdXRHYWluX20gPT0KKyAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKTB4ODAwMDAwMDApICYmCisgICAgICAgICAgICAgICAgICAgKHNlbGYtPnBRbWZEb21haW4tPlFtZkRvbWFpbk91dFtvdXRDaF0uZmIub3V0R2Fpbl9lID09IDApKTsKKyAgICAgICAgRkRLX1FtZkRvbWFpbl9HZXRXb3JrQnVmZmVyKCZzZWxmLT5wUW1mRG9tYWluLT5RbWZEb21haW5JbltvdXRDaF0sIHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBXb3JrQnVmUmVhbCwgJnBXb3JrQnVmSW1hZyk7CisgICAgICAgIEZES19BU1NFUlQoc2VsZi0+cW1mQmFuZHMgPD0KKyAgICAgICAgICAgICAgICAgICBzZWxmLT5wUW1mRG9tYWluLT5RbWZEb21haW5JbltvdXRDaF0ud29ya0J1Zl9uQmFuZHMpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+cW1mQmFuZHM7IGkrKykgeworICAgICAgICAgIHBXb3JrQnVmUmVhbFtpXSA9IHBRbWZSZWFsW2ldOworICAgICAgICAgIHBXb3JrQnVmSW1hZ1tpXSA9IHBRbWZJbWFnW2ldOworICAgICAgICB9CisgICAgICAgIHNlbGYtPnBRbWZEb21haW4tPlFtZkRvbWFpbkluW291dENoXS5zY2FsaW5nLmxiX3NjYWxlID0KKyAgICAgICAgICAgIC03OyAvKi1BTEdPUklUSE1JQ19TQ0FMSU5HX0lOX0FOQUxZU0lTX0ZJTFRFUkJBTks7Ki8KKyAgICAgICAgc2VsZi0+cFFtZkRvbWFpbi0+UW1mRG9tYWluSW5bb3V0Q2hdLnNjYWxpbmcubGJfc2NhbGUgLT0KKyAgICAgICAgICAgIHNlbGYtPnBRbWZEb21haW4tPlFtZkRvbWFpbkluW291dENoXS5mYi5maWx0ZXJTY2FsZTsKKyAgICAgICAgc2VsZi0+cFFtZkRvbWFpbi0+UW1mRG9tYWluSW5bb3V0Q2hdLnNjYWxpbmcubGJfc2NhbGUgLT0KKyAgICAgICAgICAgIHNlbGYtPmNsaXBQcm90ZWN0R2FpblNGX19GREs7CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIENhbGwgdGhlIFFNRiBzeW50aGVzaXMgZm9yIGRyeS4gKi8KKyAgICAgICAgZXJyID0gQ2FsY3VsYXRlU3BhY2VTeW50aGVzaXNRbWYoJnNlbGYtPnBRbWZEb21haW4tPlFtZkRvbWFpbk91dFtvdXRDaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZSZWFsLCBwUW1mSW1hZywgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZU91dF9fRkRLICsgKG9mZnNldCAqIG91dENoKSk7CisgICAgICB9CisgICAgICBpZiAoZXJyICE9IE1QU19PSykgZ290byBiYWlsOworICAgIH0KKyAgfSAvKiBjaCBsb29wICovCisKK2JhaWw6CisgIENfQUxMT0NfU0NSQVRDSF9FTkQocFFtZkltYWcsIEZJWFBfREJMLCBRTUZfTUFYX1NZTlRIRVNJU19CQU5EUyk7CisgIENfQUxMT0NfU0NSQVRDSF9FTkQocFFtZlJlYWwsIEZJWFBfREJMLCBRTUZfTUFYX1NZTlRIRVNJU19CQU5EUyk7CisKKyAgcmV0dXJuIGVycjsKK30KKwordm9pZCBTcGF0aWFsRGVjQnVmZmVyTWF0cmljZXMoc3BhdGlhbERlYyAqc2VsZikgeworICBpbnQgcm93LCBjb2w7CisgIGludCBjb21wbGV4UGFyQmFuZHM7CisgIGNvbXBsZXhQYXJCYW5kcyA9IHNlbGYtPm51bVBhcmFtZXRlckJhbmRzOworCisgIC8qCisgICAgYnVmZmVyIG1hdHJpY2VzIE0yCisgICovCisgIGZvciAocm93ID0gMDsgcm93IDwgc2VsZi0+bnVtTTJyb3dzOyByb3crKykgeworICAgIGZvciAoY29sID0gMDsgY29sIDwgc2VsZi0+bnVtVkNoYW5uZWxzOyBjb2wrKykgeworICAgICAgRkRLbWVtY3B5KHNlbGYtPk0yUmVhbFByZXZfX0ZES1tyb3ddW2NvbF0sIHNlbGYtPk0yUmVhbF9fRkRLW3Jvd11bY29sXSwKKyAgICAgICAgICAgICAgICBzZWxmLT5udW1QYXJhbWV0ZXJCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgaWYgKDAgfHwgKHNlbGYtPnBoYXNlQ29kaW5nID09IDMpKSB7CisgICAgICAgIEZES21lbWNweShzZWxmLT5NMkltYWdQcmV2X19GREtbcm93XVtjb2xdLCBzZWxmLT5NMkltYWdfX0ZES1tyb3ddW2NvbF0sCisgICAgICAgICAgICAgICAgICBjb21wbGV4UGFyQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBidWZmZXIgcGhhc2UgKi8KKyAgRkRLbWVtY3B5KHNlbGYtPlBoYXNlUHJldkxlZnRfX0ZESywgc2VsZi0+UGhhc2VMZWZ0X19GREssCisgICAgICAgICAgICBzZWxmLT5udW1QYXJhbWV0ZXJCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOworICBGREttZW1jcHkoc2VsZi0+UGhhc2VQcmV2UmlnaHRfX0ZESywgc2VsZi0+UGhhc2VSaWdodF9fRkRLLAorICAgICAgICAgICAgc2VsZi0+bnVtUGFyYW1ldGVyQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKK30KKworI2RlZmluZSBQSEFTRV9TQ0FMRSAyCisKKyNpZm5kZWYgUF9QSQorI2RlZmluZSBQX1BJIDMuMTQxNTkyNjUzNTg5NzkzMgorI2VuZGlmCisKKy8qIEZvciBiZXR0ZXIgcHJlY2lzaW9uLCBQSSAocGlfeDIpIGlzIGFscmVhZHkgZG91YmxlZCAqLworc3RhdGljIEZJWFBfREJMIGludGVycF9hbmdsZV9fRkRLKEZJWFBfREJMIGFuZ2xlMSwgRklYUF9EQkwgYW5nbGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMIGFscGhhLCBGSVhQX0RCTCBwaV94MikgeworICBpZiAoYW5nbGUyIC0gYW5nbGUxID4gKHBpX3gyID4+IDEpKSBhbmdsZTIgLT0gcGlfeDI7CisKKyAgaWYgKGFuZ2xlMSAtIGFuZ2xlMiA+IChwaV94MiA+PiAxKSkgYW5nbGUxIC09IHBpX3gyOworCisgIHJldHVybiBpbnRlcnBvbGF0ZVBhcmFtZXRlcihhbHBoYSwgYW5nbGUyLCBhbmdsZTEpOworfQorCisvKgorICoKKyAqLwordm9pZCBTcGF0aWFsRGVjQXBwbHlQaGFzZShzcGF0aWFsRGVjICpzZWxmLCBGSVhQX1NHTCBhbHBoYV9fRkRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdFNsb3RPZlBhcmFtU2V0KSB7CisgIGludCBwYiwgcXM7CisgIEZJWFBfREJMIHBwYltNQVhfUEFSQU1FVEVSX0JBTkRTICoKKyAgICAgICAgICAgICAgIDRdOyAvKiBsZWZ0IHJlYWwsIGltYWcgLSByaWdodCByZWFsLCBpbWFnIGludGVybGVhdmVkICovCisKKyAgY29uc3QgRklYUF9EQkwgcGlfeDIgPSBQSXgyX19JUEQ7CisgIGZvciAocGIgPSAwOyBwYiA8IHNlbGYtPm51bVBhcmFtZXRlckJhbmRzOyBwYisrKSB7CisgICAgRklYUF9EQkwgcGwsIHByOworCisgICAgcGwgPSBpbnRlcnBfYW5nbGVfX0ZESyhzZWxmLT5QaGFzZVByZXZMZWZ0X19GREtbcGJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+UGhhc2VMZWZ0X19GREtbcGJdLCBhbHBoYV9fRkRLLCBwaV94Mik7CisgICAgcHIgPSBpbnRlcnBfYW5nbGVfX0ZESyhzZWxmLT5QaGFzZVByZXZSaWdodF9fRkRLW3BiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPlBoYXNlUmlnaHRfX0ZES1twYl0sIGFscGhhX19GREssIHBpX3gyKTsKKworICAgIGlubGluZV9maXhwX2Nvc19zaW4ocGwsIHByLCBJUERfU0NBTEUsICZwcGJbNCAqIHBiXSk7CisgIH0KKworICAvKiBzaWduIGlzIC0xIGZvciBxcyA9IDAsMiBhbmQgKzEgZm9yIHFzID0gMSAqLworCisgIGNvbnN0IFNDSEFSICprZXJuZWxzID0gJnNlbGYtPmtlcm5lbHNbMF07CisKKyAgRklYUF9EQkwgKkRyeV9yZWFsMCA9ICZzZWxmLT5oeWJPdXRwdXRSZWFsRHJ5X19GREtbMF1bMF07CisgIEZJWFBfREJMICpEcnlfaW1hZzAgPSAmc2VsZi0+aHliT3V0cHV0SW1hZ0RyeV9fRkRLWzBdWzBdOworICBGSVhQX0RCTCAqRHJ5X3JlYWwxID0gJnNlbGYtPmh5Yk91dHB1dFJlYWxEcnlfX0ZES1sxXVswXTsKKyAgRklYUF9EQkwgKkRyeV9pbWFnMSA9ICZzZWxmLT5oeWJPdXRwdXRJbWFnRHJ5X19GREtbMV1bMF07CisKKyAgZm9yIChxcyA9IDI7IHFzID49IDA7IHFzLS0pIHsKKyAgICBGSVhQX0RCTCBvdXRfcmUsIG91dF9pbTsKKworICAgIHBiID0gKmtlcm5lbHMrKzsKKyAgICBpZiAocXMgPT0gMSkgLyogc2lnbltxc10gPj0gMCAqLworICAgIHsKKyAgICAgIGNwbHhNdWx0RGl2Migmb3V0X3JlLCAmb3V0X2ltLCAqRHJ5X3JlYWwwLCAqRHJ5X2ltYWcwLCBwcGJbNCAqIHBiICsgMF0sCisgICAgICAgICAgICAgICAgICAgcHBiWzQgKiBwYiArIDFdKTsKKyAgICAgIG91dF9yZSA8PD0gUEhBU0VfU0NBTEUgLSAxOworICAgICAgb3V0X2ltIDw8PSBQSEFTRV9TQ0FMRSAtIDE7CisgICAgICAqRHJ5X3JlYWwwKysgPSBvdXRfcmU7CisgICAgICAqRHJ5X2ltYWcwKysgPSBvdXRfaW07CisKKyAgICAgIGNwbHhNdWx0RGl2Migmb3V0X3JlLCAmb3V0X2ltLCAqRHJ5X3JlYWwxLCAqRHJ5X2ltYWcxLCBwcGJbNCAqIHBiICsgMl0sCisgICAgICAgICAgICAgICAgICAgcHBiWzQgKiBwYiArIDNdKTsKKyAgICAgIG91dF9yZSA8PD0gUEhBU0VfU0NBTEUgLSAxOworICAgICAgb3V0X2ltIDw8PSBQSEFTRV9TQ0FMRSAtIDE7CisgICAgICAqRHJ5X3JlYWwxKysgPSBvdXRfcmU7CisgICAgICAqRHJ5X2ltYWcxKysgPSBvdXRfaW07CisgICAgfSBlbHNlIHsKKyAgICAgIGNwbHhNdWx0RGl2Migmb3V0X3JlLCAmb3V0X2ltLCAqRHJ5X3JlYWwwLCAqRHJ5X2ltYWcwLCBwcGJbNCAqIHBiICsgMF0sCisgICAgICAgICAgICAgICAgICAgLXBwYls0ICogcGIgKyAxXSk7CisgICAgICBvdXRfcmUgPDw9IFBIQVNFX1NDQUxFIC0gMTsKKyAgICAgIG91dF9pbSA8PD0gUEhBU0VfU0NBTEUgLSAxOworICAgICAgKkRyeV9yZWFsMCsrID0gb3V0X3JlOworICAgICAgKkRyeV9pbWFnMCsrID0gb3V0X2ltOworCisgICAgICBjcGx4TXVsdERpdjIoJm91dF9yZSwgJm91dF9pbSwgKkRyeV9yZWFsMSwgKkRyeV9pbWFnMSwgcHBiWzQgKiBwYiArIDJdLAorICAgICAgICAgICAgICAgICAgIC1wcGJbNCAqIHBiICsgM10pOworICAgICAgb3V0X3JlIDw8PSBQSEFTRV9TQ0FMRSAtIDE7CisgICAgICBvdXRfaW0gPDw9IFBIQVNFX1NDQUxFIC0gMTsKKyAgICAgICpEcnlfcmVhbDErKyA9IG91dF9yZTsKKyAgICAgICpEcnlfaW1hZzErKyA9IG91dF9pbTsKKyAgICB9CisgIH0KKworICAvKiBzaWduIGlzICsxIGZvciBxcyA+PTMgKi8KKyAgZm9yIChxcyA9IHNlbGYtPmh5YnJpZEJhbmRzIC0gMzsgcXMtLTspIHsKKyAgICBGSVhQX0RCTCBvdXRfcmUsIG91dF9pbTsKKworICAgIHBiID0gKmtlcm5lbHMrKzsKKyAgICBjcGx4TXVsdERpdjIoJm91dF9yZSwgJm91dF9pbSwgKkRyeV9yZWFsMCwgKkRyeV9pbWFnMCwgcHBiWzQgKiBwYiArIDBdLAorICAgICAgICAgICAgICAgICBwcGJbNCAqIHBiICsgMV0pOworICAgIG91dF9yZSA8PD0gUEhBU0VfU0NBTEUgLSAxOworICAgIG91dF9pbSA8PD0gUEhBU0VfU0NBTEUgLSAxOworICAgICpEcnlfcmVhbDArKyA9IG91dF9yZTsKKyAgICAqRHJ5X2ltYWcwKysgPSBvdXRfaW07CisKKyAgICBjcGx4TXVsdERpdjIoJm91dF9yZSwgJm91dF9pbSwgKkRyeV9yZWFsMSwgKkRyeV9pbWFnMSwgcHBiWzQgKiBwYiArIDJdLAorICAgICAgICAgICAgICAgICBwcGJbNCAqIHBiICsgM10pOworICAgIG91dF9yZSA8PD0gUEhBU0VfU0NBTEUgLSAxOworICAgIG91dF9pbSA8PD0gUEhBU0VfU0NBTEUgLSAxOworICAgICpEcnlfcmVhbDErKyA9IG91dF9yZTsKKyAgICAqRHJ5X2ltYWcxKysgPSBvdXRfaW07CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYlNBQ2RlYy9zcmMvc2FjX3Byb2Nlc3MuaCBiL2xpYlNBQ2RlYy9zcmMvc2FjX3Byb2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTJmMmZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZGVjL3NyYy9zYWNfcHJvY2Vzcy5oCkBAIC0wLDAgKzEsMjk3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IFNBQyBQcm9jZXNzaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIFBvbHlwaGFzZSBGaWx0ZXJiYW5rCisqLworCisjaWZuZGVmIFNBQ19QUk9DRVNTX0gKKyNkZWZpbmUgU0FDX1BST0NFU1NfSAorCisjaW5jbHVkZSAic2FjX2RlYy5oIgorCit2b2lkIFNwYXRpYWxEZWNBcHBseVBoYXNlKHNwYXRpYWxEZWMgKnNlbGYsIEZJWFBfU0dMIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdFNsb3RPZlBhcmFtU2V0KTsKKworLyoqCisgKiBcYnJpZWYgIEFwcGx5IFFNRiBBbmFseXNpcyBGaWx0ZXJiYW5rLgorICoKKyAqIENhbGN1bGF0ZXMgcW1mIGRhdGEgb24gZG93bm1peCBpbnB1dCB0aW1lIGRhdGEuCisgKiBEZWxheWxpbmVzIHdpbGwgYmUgYXBwbGllZCBpZiBuZWNlc3NhcmF5LgorICoKKyAqIFxwYXJhbSBzZWxmICAgICAgICAgICAgICAgIEEgc3BhdGlhbCBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBpbkRhdGEgICAgICAgICAgICAgIERvd25taXggY2hhbm5lbCB0aW1lIGRhdGEgYXMgaW5wdXQuCisgKiBccGFyYW0gdHMgICAgICAgICAgICAgICAgICBTaWduYWxzIHRpbWUgc2xvdCBvZmZzZXQgZm9yIGlucHV0IGJ1ZmZlci4KKyAqIFxwYXJhbSBxbWZSZWFsICAgICAgICAgICAgIERvd25taXggY2hhbm5lbCBxbWYgb3V0cHV0IGRhdGEuCisgKiBccGFyYW0gcW1mSW1hZyAgICAgICAgICAgICBEb3dubWl4IGNoYW5uZWwgcW1mIG91dHB1dCBkYXRhLgorICoKKyAqIFxyZXR1cm4gIEVycm9yIHN0YXR1cy4KKyAqLworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNRTUZBbmFseXNpcyhzcGF0aWFsRGVjICpzZWxmLCBjb25zdCBQQ01fTVBTICppbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB0cywgY29uc3QgSU5UIGJ5cGFzc01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcW1mUmVhbCwgRklYUF9EQkwgKipxbWZJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtSW5wdXRDaGFubmVscyk7CisKKy8qKgorICogXGJyaWVmICBGZWVkIHNwYXRpYWwgZGVjb2RlciB3aXRoIGV4dGVybmFsIHFtZiBkYXRhLgorICoKKyAqIFxwYXJhbSBzZWxmICAgICAgICAgICAgICAgIEEgc3BhdGlhbCBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBxbWZJbkRhdGFSZWFsICAgICAgIEV4dGVybmFsIHFtZiBkb3dubWl4IGRhdGEgYXMgaW5wdXQuCisgKiBccGFyYW0gcW1mSW5EYXRhSW1hZyAgICAgICBFeHRlcm5hbCBxbWYgZG93bm1peCBkYXRhIGFzIGlucHV0LgorICogXHBhcmFtIHRzICAgICAgICAgICAgICAgICAgU2lnbmFscyB0aW1lIHNsb3QgaW4gaW5wdXQgYnVmZmVyIHRvIHByb2Nlc3MuCisgKiBccGFyYW0gcW1mUmVhbCAgICAgICAgICAgICBEb3dubWl4IGNoYW5uZWwgcW1mIG91dHB1dCBkYXRhLgorICogXHBhcmFtIHFtZkltYWcgICAgICAgICAgICAgRG93bm1peCBjaGFubmVsIHFtZiBvdXRwdXQgZGF0YS4KKyAqIFxwYXJhbSBudW1JbnB1dENoYW5uZWxzICAgIE51bWJlciBvZiBpbnB1dCBjaGFubmVscy4gTWlnaHQgZGlmZmVyIGZyb20KKyAqIHNlbGYtPm51bUlucHV0Q2hhbm5lbHMuCisgKgorICogXHJldHVybiAgRXJyb3Igc3RhdHVzLgorICovCitTQUNERUNfRVJST1IgU3BhdGlhbERlY0ZlZWRRTUYoc3BhdGlhbERlYyAqc2VsZiwgRklYUF9EQkwgKipxbWZJbkRhdGFSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcW1mSW5EYXRhSW1hZywgY29uc3QgSU5UIHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBieXBhc3NNb2RlLCBGSVhQX0RCTCAqKnFtZlJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxbWZJbWFnLCBjb25zdCBJTlQgbnVtSW5wdXRDaGFubmVscyk7CisKKy8qKgorICogXGJyaWVmICBBcHBseSBIeWJyZGlkIEFuYWx5c2lzIEZpbHRlcmJhbmsuCisgKgorICogQ2FsY3VsYXRlcyBoeWJyaWQgZGF0YSBvbiBkb3dubWl4IGlucHV0IGRhdGEuCisgKiBSZXNpZHVhbCBoeWJyaWQgc2lnbmFscyB3aWxsIGFsc28gYmUgY2FsY3VsYXRlZCBvbiBjdXJyZW50IHNsb3QgaWYgYXZhaWxhYmxlLgorICoKKyAqIFxwYXJhbSBzZWxmICAgICAgICAgICAgICAgIEEgc3BhdGlhbCBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBxbWZJbnB1dFJlYWwgICAgICAgIERvd25taXggY2hhbm5lbCBxbWYgZGF0YSBhcyBpbnB1dC4KKyAqIFxwYXJhbSBxbWZJbnB1dEltYWcgICAgICAgIERvd25taXggY2hhbm5lbCBxbWYgZGF0YSBhcyBpbnB1dC4KKyAqIFxwYXJhbSBoeWJPdXRwdXRSZWFsICAgICAgIERvd25taXggY2hhbm5lbCBoeWJyaWQgb3V0cHV0IGRhdGEuCisgKiBccGFyYW0gaHliT3V0cHV0SW1hZyAgICAgICBEb3dubWl4IGNoYW5uZWwgaHlicmlkIG91dHB1dCBkYXRhLgorICogXHBhcmFtIHRzICAgICAgICAgICAgICAgICAgU2lnbmFscyB0aW1lIHNsb3QgaW4gc3BhdGlhbCBmcmFtZSB0byBwcm9jZXNzLgorICogXHBhcmFtIG51bUlucHV0Q2hhbm5lbHMgICAgTnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzLiBNaWdodCBkaWZmZXIgZnJvbQorICogc2VsZi0+bnVtSW5wdXRDaGFubmVscy4KKyAqCisgKiBccmV0dXJuICBFcnJvciBzdGF0dXMuCisgKi8KK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjSHlicmlkQW5hbHlzaXMoc3BhdGlhbERlYyAqc2VsZiwgRklYUF9EQkwgKipxbWZJbnB1dFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcW1mSW5wdXRJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmh5Yk91dHB1dFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqaHliT3V0cHV0SW1hZywgY29uc3QgSU5UIHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbnVtSW5wdXRDaGFubmVscyk7CisKKy8qKgorICogXGJyaWVmICBDcmVhdGUgWCBkYXRhLgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIGxpc3Qgb3ZlciBYY2hhbm5lbHMgcG9pbnRpbmcgdG8gZG93bm1peCBpbnB1dCBjaGFubmVscworICogYW5kIHRvIHJlc2lkdWFsIGNoYW5uZWxzIHdoZW4gcHJvdmlkZWQuCisgKgorICogXHBhcmFtIHNlbGYgICAgICAgICAgICAgICAgQSBzcGF0aWFsIGRlY29kZXIgaGFuZGxlLgorICogXHBhcmFtIGh5YklucHV0UmVhbCAgICAgICAgRG93bm1peCBjaGFubmVsIGh5YnJpZCBkYXRhIGFzIGlucHV0LgorICogXHBhcmFtIGh5YklucHV0SW1hZyAgICAgICAgRG93bm1peCBjaGFubmVsIGh5YnJpZCBkYXRhIGFzIGlucHV0LgorICogXHBhcmFtIHB4UmVhbCAgICAgICAgICAgICAgUG9pbnRlciB0byBoeWJyaWQgYW5kIHJlc2lkdWFsIGRhdGEgYXMgb3V0cHV0LgorICogXHBhcmFtIHB4SW1hZyAgICAgICAgICAgICAgUG9pbnRlciB0byBoeWJyaWQgYW5kIHJlc2lkdWFsIGRhdGEgYXMgb3V0cHV0LgorICoKKyAqIFxyZXR1cm4gIEVycm9yIHN0YXR1cy4KKyAqLworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNDcmVhdGVYKHNwYXRpYWxEZWMgKnNlbGYsIEZJWFBfREJMICoqaHliSW5wdXRSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqaHliSW5wdXRJbWFnLCBGSVhQX0RCTCAqKnB4UmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnB4SW1hZyk7CisKKy8qKgorICogXGJyaWVmICBNUFMyMTIgY29tYmluZWQgdmVyc2lvbiBvZiBhcHBseSBNMSBwYXJhbWV0ZXJzIGFuZCBjcmVhdGUgd2V0IHNpZ25hbAorICoKKyAqIFxwYXJhbSBzZWxmICAgICAgICAgICAgICAgIEEgc3BhdGlhbCBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSB4UmVhbCAgICAgICAgICAgICAgIERvd25taXggYW5kIHJlc2lkdWFsIFggZGF0YSBhcyBpbnB1dC4KKyAqIFxwYXJhbSB4SW1hZyAgICAgICAgICAgICAgIERvd25taXggYW5kIHJlc2lkdWFsIFggZGF0YSBhcyBpbnB1dC4KKyAqIFxwYXJhbSB2UmVhbCAgICAgICAgICAgICAgIG91dHB1dCBkYXRhOiBbMF0gZGlyZWN0IHNpZ25hbCAoVik7IFsxXSB3ZXQgc2lnbmFsCisgKiAoVykuCisgKiBccGFyYW0gdkltYWcgICAgICAgICAgICAgICBvdXRwdXQgZGF0YTogWzBdIGRpcmVjdCBzaWduYWwgKFYpOyBbMV0gd2V0IHNpZ25hbAorICogKFcpLgorICoKKyAqIFxyZXR1cm4gIEVycm9yIHN0YXR1cy4KKyAqLworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNBcHBseU0xX0NyZWF0ZVdfTW9kZTIxMigKKyAgICBzcGF0aWFsRGVjICpzZWxmLCBjb25zdCBTUEFUSUFMX0JTX0ZSQU1FICpmcmFtZSwgRklYUF9EQkwgKip4UmVhbCwKKyAgICBGSVhQX0RCTCAqKnhJbWFnLCBGSVhQX0RCTCAqKnZSZWFsLCBGSVhQX0RCTCAqKnZJbWFnKTsKKworLyoqCisgKiBcYnJpZWYgIEFwcGx5IE0yIHBhcmFtZXRlcnMuCisgKgorICogXHBhcmFtIHNlbGYgICAgICAgICAgICAgICAgQSBzcGF0aWFsIGRlY29kZXIgaGFuZGxlLgorICogXHBhcmFtIHBzICAgICAgICAgICAgICAgICAgU2lnbmFscyBwYXJhbWV0ZXIgYmFuZCBmcm9tIHdoZXJlIE0yIHBhcmFtZXRlciB0bworICogdXNlLgorICogXHBhcmFtIGFscGhhICAgICAgICAgICAgICAgU21vb3RoaW5nIGZhY3RvciBiZXR3ZWVuIGN1cnJlbnQgYW5kIHByZXZpb3VzCisgKiBwYXJhbWV0ZXIgYmFuZC4gUmFuZ2VhYmlsaXR5IGJldHdlZW4gMC5mIGFuZCAxLmYuCisgKiBccGFyYW0gd1JlYWwgICAgICAgICAgICAgICBXZXQgaW5wdXQgZGF0YS4KKyAqIFxwYXJhbSB3SW1hZyAgICAgICAgICAgICAgIFdldCBpbnB1dCBkYXRhLgorICogXHBhcmFtIGh5Yk91dHB1dFJlYWxEcnkgICAgRHJ5IG91dHB1dCBkYXRhLgorICogXHBhcmFtIGh5Yk91dHB1dEltYWdEcnkgICAgRHJ5IG91dHB1dCBkYXRhLgorICogXHBhcmFtIGh5Yk91dHB1dFJlYWxXZXQgICAgV2V0IG91dHB1dCBkYXRhLgorICogXHBhcmFtIGh5Yk91dHB1dEltYWdXZXQgICAgV2V0IG91dHB1dCBkYXRhLgorICoKKyAqIFxyZXR1cm4gIEVycm9yIHN0YXR1cy4KKyAqLworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNBcHBseU0yKHNwYXRpYWxEZWMgKnNlbGYsIElOVCBwcywgY29uc3QgRklYUF9TR0wgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKip3UmVhbCwgRklYUF9EQkwgKip3SW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmh5Yk91dHB1dFJlYWxEcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipoeWJPdXRwdXRJbWFnRHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqaHliT3V0cHV0UmVhbFdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmh5Yk91dHB1dEltYWdXZXQpOworCisvKioKKyAqIFxicmllZiAgQXBwbHkgTTIgcGFyYW1ldGVyIGZvciAyMTIgbW9kZSB3aXRoIHJlc2lkdWFsQ29kaW5nIGFuZCBwaGFzZUNvZGluZy4KKyAqCisgKiBccGFyYW0gc2VsZiAgICAgICAgICAgICAgICBbaV0gQSBzcGF0aWFsIGRlY29kZXIgaGFuZGxlLgorICogXHBhcmFtIHBzICAgICAgICAgICAgICAgICAgW2ldIFNpZ25hbHMgcGFyYW1ldGVyIGJhbmQgZnJvbSB3aGVyZSBNMiBwYXJhbWV0ZXIKKyAqIHRvIHVzZS4KKyAqIFxwYXJhbSBhbHBoYSAgICAgICAgICAgICAgIFtpXSBTbW9vdGhpbmcgZmFjdG9yIGJldHdlZW4gY3VycmVudCBhbmQgcHJldmlvdXMKKyAqIHBhcmFtZXRlciBiYW5kLiBSYW5nZWFiaWxpdHkgYmV0d2VlbiAwLmYgYW5kIDEuZi4KKyAqIFxwYXJhbSB3UmVhbCAgICAgICAgICAgICAgIFtpXSBXZXQgaW5wdXQgZGF0YS4KKyAqIFxwYXJhbSB3SW1hZyAgICAgICAgICAgICAgIFtpXSBXZXQgaW5wdXQgZGF0YS4KKyAqIFxwYXJhbSBoeWJPdXRwdXRSZWFsRHJ5ICAgIFtvXSBEcnkgb3V0cHV0IGRhdGEuCisgKiBccGFyYW0gaHliT3V0cHV0SW1hZ0RyeSAgICBbb10gRHJ5IG91dHB1dCBkYXRhLgorICoKKyAqIFxyZXR1cm4gZXJyb3IKKyAqLworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNBcHBseU0yX01vZGUyMTJfUmVzaWR1YWxzUGx1c1BoYXNlQ29kaW5nKAorICAgIHNwYXRpYWxEZWMgKnNlbGYsIElOVCBwcywgY29uc3QgRklYUF9TR0wgYWxwaGEsIEZJWFBfREJMICoqd1JlYWwsCisgICAgRklYUF9EQkwgKip3SW1hZywgRklYUF9EQkwgKipoeWJPdXRwdXRSZWFsRHJ5LCBGSVhQX0RCTCAqKmh5Yk91dHB1dEltYWdEcnkpOworCisvKioKKyAqIFxicmllZiAgQXBwbHkgTTIgcGFyYW1ldGVyIGZvciAyMTIgbW9kZSwgdXBtaXggZnJvbSBtb25vIHRvIHN0ZXJlby4KKyAqCisgKiBccGFyYW0gc2VsZiAgICAgICAgICAgICAgICBbaV0gQSBzcGF0aWFsIGRlY29kZXIgaGFuZGxlLgorICogXHBhcmFtIHBzICAgICAgICAgICAgICAgICAgW2ldIFNpZ25hbHMgcGFyYW1ldGVyIGJhbmQgZnJvbSB3aGVyZSBNMiBwYXJhbWV0ZXIKKyAqIHRvIHVzZS4KKyAqIFxwYXJhbSBhbHBoYSAgICAgICAgICAgICAgIFtpXSBTbW9vdGhpbmcgZmFjdG9yIGJldHdlZW4gY3VycmVudCBhbmQgcHJldmlvdXMKKyAqIHBhcmFtZXRlciBiYW5kLiBSYW5nZWFiaWxpdHkgYmV0d2VlbiAwLmYgYW5kIDEuZi4KKyAqIFxwYXJhbSB3UmVhbCAgICAgICAgICAgICAgIFtpXSBXZXQgaW5wdXQgZGF0YS4KKyAqIFxwYXJhbSB3SW1hZyAgICAgICAgICAgICAgIFtpXSBXZXQgaW5wdXQgZGF0YS4KKyAqIFxwYXJhbSBoeWJPdXRwdXRSZWFsRHJ5ICAgIFtvXSBEcnkgb3V0cHV0IGRhdGEuCisgKiBccGFyYW0gaHliT3V0cHV0SW1hZ0RyeSAgICBbb10gRHJ5IG91dHB1dCBkYXRhLgorICoKKyAqIFxyZXR1cm4gZXJyb3IKKyAqLworU0FDREVDX0VSUk9SIFNwYXRpYWxEZWNBcHBseU0yX01vZGUyMTIoc3BhdGlhbERlYyAqc2VsZiwgSU5UIHBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9TR0wgYWxwaGEsIEZJWFBfREJMICoqd1JlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKndJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipoeWJPdXRwdXRSZWFsRHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipoeWJPdXRwdXRJbWFnRHJ5KTsKKworLyoqCisgKiBcYnJpZWYgIENvbnZlcnQgSHlicmlkIGlucHV0IHRvIG91dHB1dCBhdWRpbyBkYXRhLgorICoKKyAqIFxwYXJhbSBoU3BhY2VTeW50aGVzaXNRbWYgIEEgc3BhdGlhbCBkZWNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSB0cyAgICAgICAgICAgICAgICAgIFNpZ25hbHMgdGltZSBzbG90IGluIHNwYXRpYWwgZnJhbWUgdG8gcHJvY2Vzcy4KKyAqIFxwYXJhbSBoeWJPdXRwdXRSZWFsICAgICAgIEh5YnJpZCBkYXRhIGFzIGlucHV0LgorICogXHBhcmFtIGh5Yk91dHB1dEltYWcgICAgICAgSHlicmlkIGRhdGEgYXMgaW5wdXQuCisgKiBccGFyYW0gdGltZU91dCAgICAgICAgICAgICBhdWRpbyBvdXRwdXQgZGF0YS4KKyAqCisgKiBccmV0dXJuICBFcnJvciBzdGF0dXMuCisgKi8KK1NBQ0RFQ19FUlJPUiBTcGF0aWFsRGVjU3ludGhlc2lzKHNwYXRpYWxEZWMgKnNlbGYsIGNvbnN0IElOVCB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqaHliT3V0cHV0UmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqaHliT3V0cHV0SW1hZywgUENNX01QUyAqdGltZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBudW1JbnB1dENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkRLX2NoYW5uZWxNYXBEZXNjciAqY29uc3QgbWFwRGVzY3IpOworCit2b2lkIFNwYXRpYWxEZWNCdWZmZXJNYXRyaWNlcyhzcGF0aWFsRGVjICpzZWxmKTsKKworRklYUF9EQkwgZ2V0Q2hHYWluKHNwYXRpYWxEZWMgKnNlbGYsIFVJTlQgY2gsIElOVCAqc2NhbGUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYlNBQ2RlYy9zcmMvc2FjX3FtZi5jcHAgYi9saWJTQUNkZWMvc3JjL3NhY19xbWYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzU0OTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY19xbWYuY3BwCkBAIC0wLDAgKzEsMTU2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IFNBQyBEZWMgUU1GIHByb2Nlc3NpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInNhY19xbWYuaCIKKworI2luY2x1ZGUgIkZES19tYXRyaXhDYWxsb2MuaCIKKyNpbmNsdWRlICJzYWNfZGVjX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgInNhY19yb20uaCIKKworI2luY2x1ZGUgInFtZi5oIgorCitTQUNERUNfRVJST1IgQ2FsY3VsYXRlU3BhY2VTeW50aGVzaXNRbWYoCisgICAgY29uc3QgSEFORExFX0ZES19RTUZfRE9NQUlOX09VVCBoUW1mRG9tYWluT3V0Q2gsIGNvbnN0IEZJWFBfREJMICpTciwKKyAgICBjb25zdCBGSVhQX0RCTCAqU2ksIGNvbnN0IElOVCBzdHJpZGUsIElOVF9QQ00gKnRpbWVTaWcpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKworICBpZiAoaFFtZkRvbWFpbk91dENoID09IE5VTEwpIHsKKyAgICBlcnIgPSBNUFNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgSEFORExFX1NQQUNFX1NZTlRIRVNJU19RTUYgaFNwYWNlU3ludGhlc2lzUW1mID0gJmhRbWZEb21haW5PdXRDaC0+ZmI7CisjaWYgKFFNRl9NQVhfU1lOVEhFU0lTX0JBTkRTIDw9IDY0KQorICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQocFdvcmtCdWZmZXIsIEZJWFBfREJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFFNRl9NQVhfU1lOVEhFU0lTX0JBTkRTIDw8IDEpKTsKKyNlbHNlCisgICAgQ19BQUxMT0NfU1RBQ0tfU1RBUlQocFdvcmtCdWZmZXIsIEZJWFBfREJMLCAoUU1GX01BWF9TWU5USEVTSVNfQkFORFMgPDwgMSkpOworI2VuZGlmCisKKyAgICBxbWZTeW50aGVzaXNGaWx0ZXJpbmdTbG90KGhTcGFjZVN5bnRoZXNpc1FtZiwgU3IsIFNpLCAwLCAwLCB0aW1lU2lnLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29ya0J1ZmZlcik7CisKKyNpZiAoUU1GX01BWF9TWU5USEVTSVNfQkFORFMgPD0gNjQpCisgICAgQ19BQUxMT0NfU0NSQVRDSF9FTkQocFdvcmtCdWZmZXIsIEZJWFBfREJMLCAoUU1GX01BWF9TWU5USEVTSVNfQkFORFMgPDwgMSkpOworI2Vsc2UKKyAgICBDX0FBTExPQ19TVEFDS19FTkQocFdvcmtCdWZmZXIsIEZJWFBfREJMLCAoUU1GX01BWF9TWU5USEVTSVNfQkFORFMgPDwgMSkpOworI2VuZGlmCisgIH0KKworICByZXR1cm4gZXJyOworfQorCitTQUNERUNfRVJST1IgQ2FsY3VsYXRlU3BhY2VBbmFseXNpc1FtZigKKyAgICBIQU5ETEVfU1BBQ0VfQU5BTFlTSVNfUU1GIGhTcGFjZUFuYWx5c2lzUW1mLCBjb25zdCBQQ01fTVBTICp0aW1lU2lnLAorICAgIEZJWFBfREJMICpTciwgRklYUF9EQkwgKlNpKSB7CisgIFNBQ0RFQ19FUlJPUiBlcnIgPSBNUFNfT0s7CisKKyAgaWYgKGhTcGFjZUFuYWx5c2lzUW1mID09IE5VTEwpIHsKKyAgICBlcnIgPSBNUFNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChwV29ya0J1ZmZlciwgRklYUF9EQkwsICg2NCA8PCAxKSk7CisKKyAgICBxbWZBbmFseXNpc0ZpbHRlcmluZ1Nsb3QoaFNwYWNlQW5hbHlzaXNRbWYsIFNyLCBTaSwgdGltZVNpZywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtCdWZmZXIpOworICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKHBXb3JrQnVmZmVyLCBGSVhQX0RCTCwgKDY0IDw8IDEpKTsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19xbWYuaCBiL2xpYlNBQ2RlYy9zcmMvc2FjX3FtZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZGM4MzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY19xbWYuaApAQCAtMCwwICsxLDE0MyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBTQUMgRGVjIFFNRiBwcm9jZXNzaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0FDX1FNRl9ICisjZGVmaW5lIFNBQ19RTUZfSAorCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjaW5jbHVkZSAic2FjX2RlY19pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgIkZES19xbWZfZG9tYWluLmgiCisjZGVmaW5lIEhBTkRMRV9TUEFDRV9BTkFMWVNJU19RTUYgSEFORExFX1FNRl9GSUxURVJfQkFOSworI2RlZmluZSBIQU5ETEVfU1BBQ0VfU1lOVEhFU0lTX1FNRiBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LCisKKy8qKgorICogXGJyaWVmICBDb252ZXJ0IFFtZiBpbnB1dCB0byBvdXRwdXQgYXVkaW8gZGF0YS4KKyAqCisgKiBccGFyYW0gaFNwYWNlU3ludGhlc2lzUW1mICBBIFFtZiBTeW50aGVzaXMgRmlsdGVyYmFuayBoYW5kbGUuCisgKiBccGFyYW0gU3IgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIFFtZiBpbnB1dCBidWZmZXIuCisgKiBccGFyYW0gU2kgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIFFtZiBpbnB1dCBidWZmZXIuCisgKiBccGFyYW0gc3RyaWRlICAgICAgICAgICAgICBTdHJpZGUgZmFjdG9yIGZvciBvdXRwdXQgZGF0YSwgMSBpZiBub25lLgorICogXHBhcmFtIHRpbWVTaWcgICAgICAgICAgICAgKE5vbmUtKUludGVybGVhdmVkIGF1ZGlvIG91dHB1dCBkYXRhLgorICoKKyAqIFxyZXR1cm4gIEVycm9yIHN0YXR1cy4KKyAqLworU0FDREVDX0VSUk9SIENhbGN1bGF0ZVNwYWNlU3ludGhlc2lzUW1mKAorICAgIGNvbnN0IEhBTkRMRV9GREtfUU1GX0RPTUFJTl9PVVQgaFFtZkRvbWFpbk91dENoLCBjb25zdCBGSVhQX0RCTCAqU3IsCisgICAgY29uc3QgRklYUF9EQkwgKlNpLCBjb25zdCBJTlQgc3RyaWRlLCBJTlRfUENNICp0aW1lU2lnKTsKKworLyoqCisgKiBcYnJpZWYgIENvbnZlcnQgYXVkaW8gaW5wdXQgZGF0YSB0byBxbWYgcmVwcmVzZW50YXRpb24uCisgKgorICogXHBhcmFtIGhTcGFjZUFuYWx5c2lzUW1mICAgQSBRbWYgQW5hbHlzaXMgRmlsdGVyYmFuayBoYW5kbGUuCisgKiBccGFyYW0gdGltZVNpZyAgICAgICAgICAgICAoTm9uZS0pSW50ZXJsZWF2ZCBhdWRpbyBpbnB1dCBkYXRhLgorICogXHBhcmFtIFNyICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBRbWYgb3V0cHV0IGJ1ZmZlci4KKyAqIFxwYXJhbSBTaSAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gUW1mIG91dHB1dCBidWZmZXIuCisgKgorICogXHJldHVybiAgRXJyb3Igc3RhdHVzLgorICovCitTQUNERUNfRVJST1IgQ2FsY3VsYXRlU3BhY2VBbmFseXNpc1FtZigKKyAgICBIQU5ETEVfU1BBQ0VfQU5BTFlTSVNfUU1GIGhTcGFjZUFuYWx5c2lzUW1mLCBjb25zdCBQQ01fTVBTICp0aW1lU2lnLAorICAgIEZJWFBfREJMICpTciwgRklYUF9EQkwgKlNpKTsKKworI2VuZGlmIC8qIFNBQ19RTUZfSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0FDZGVjL3NyYy9zYWNfcmVzaGFwZUJCRW52LmNwcCBiL2xpYlNBQ2RlYy9zcmMvc2FjX3Jlc2hhcGVCQkVudi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjMGFjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2RlYy9zcmMvc2FjX3Jlc2hhcGVCQkVudi5jcHAKQEAgLTAsMCArMSw2ODAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogU0FDIERlYyBndWlkZWQgZW52ZWxvcGUgc2hhcGluZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAic2FjX3Jlc2hhcGVCQkVudi5oIgorCisjaW5jbHVkZSAic2FjX2RlYy5oIgorI2luY2x1ZGUgInNhY19iaXRkZWMuaCIKKyNpbmNsdWRlICJzYWNfY2FsY00xYW5kTTIuaCIKKyNpbmNsdWRlICJzYWNfcmVzaGFwZUJCRW52LmgiCisjaW5jbHVkZSAic2FjX3JvbS5oIgorCisjZGVmaW5lIElOUF9EUllfV0VUIDAKKyNkZWZpbmUgSU5QX0RNWCAxCisKKyNkZWZpbmUgU0ZfU0hBUEUgMQorI2RlZmluZSBTRl9ESVYzMiA2CisjZGVmaW5lIFNGX0ZBQ1RPUl9TTE9UIDUKKworI2RlZmluZSBTVEFSVF9CQl9FTlYgMCAvKiAxMCAqLworI2RlZmluZSBFTkRfQkJfRU5WIDkgICAvKiAxOCAqLworCisjZGVmaW5lIFNGX0FMUEhBMSA4CisjZGVmaW5lIFNGX0JFVEExIDQKKwordm9pZCBpbml0QkJFbnYoc3BhdGlhbERlYyAqc2VsZiwgaW50IGluaXRTdGF0ZXNGbGFnKSB7CisgIElOVCBjaCwgazsKKworICBmb3IgKGNoID0gMDsgY2ggPCBzZWxmLT5udW1PdXRwdXRDaGFubmVsczsgY2grKykgeworICAgIGsgPSByb3cyY2hhbm5lbEdFU1tzZWxmLT50cmVlQ29uZmlnXVtjaF07CisgICAgc2VsZi0+cm93MmNoYW5uZWxEbXhHRVNbY2hdID0gazsKKyAgICBpZiAoayA9PSAtMSkgY29udGludWU7CisKKyAgICBzd2l0Y2ggKHNlbGYtPnRyZWVDb25maWcpIHsKKyAgICAgIGNhc2UgVFJFRV8yMTI6CisgICAgICAgIHNlbGYtPnJvdzJjaGFubmVsRG14R0VTW2NoXSA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDo7CisgICAgfQorICB9CisKKyAgaWYgKGluaXRTdGF0ZXNGbGFnKSB7CisgICAgZm9yIChrID0gMDsgayA8IDIgKiBNQVhfT1VUUFVUX0NIQU5ORUxTICsgTUFYX0lOUFVUX0NIQU5ORUxTOyBrKyspIHsKKyAgICAgIHNlbGYtPnJlc2hhcGVCQkVudlN0YXRlLT5ub3JtTnJnUHJldl9fRkRLW2tdID0KKyAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjVmKTsgLyogMzI3NjguZiozMjc2OC5mICovCisgICAgICBzZWxmLT5yZXNoYXBlQkJFbnZTdGF0ZS0+bm9ybU5yZ1ByZXZTRltrXSA9IERGUkFDVF9CSVRTIC0gMTsKKyAgICAgIHNlbGYtPnJlc2hhcGVCQkVudlN0YXRlLT5wYXJ0TnJnUHJldlNGW2tdID0gMDsKKyAgICAgIHNlbGYtPnJlc2hhcGVCQkVudlN0YXRlLT5wYXJ0TnJnUHJldjJTRltrXSA9IDA7CisgICAgICBzZWxmLT5yZXNoYXBlQkJFbnZTdGF0ZS0+ZnJhbWVOcmdQcmV2U0Zba10gPSAwOworICAgIH0KKyAgfQorCisgIHNlbGYtPnJlc2hhcGVCQkVudlN0YXRlLT5hbHBoYV9fRkRLID0KKyAgICAgIEZMMkZYQ09OU1RfREJMKDAuOTk2Mzc4NDU1NzVmKTsgLyogRkRLZXhwKC02NCAvICgwLjRmICAqIDQ0MTAwKSkgKi8KKyAgc2VsZi0+cmVzaGFwZUJCRW52U3RhdGUtPmJldGFfX0ZESyA9CisgICAgICBGTDJGWENPTlNUX0RCTCgwLjk2NDM2OTA5NDg4Zik7IC8qIEZES2V4cCgtNjQgLyAoMC4wNGYgKiA0NDEwMCkpICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRTbG90TnJnSFEoRklYUF9EQkwgKlJFU1RSSUNUIHBSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcEltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBzbG90TnJnLCBJTlQgbWF4VmFsU0YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBoeWJCYW5kcykgeworICBJTlQgcXM7CisgIEZJWFBfREJMIG5yZzsKKworICAvKiBxcyA9IDEyLCAxMywgMTQgKi8KKyAgc2xvdE5yZ1swXSA9ICgoZlBvdzJEaXYyKCgqcFJlYWwrKykgPDwgbWF4VmFsU0YpICsKKyAgICAgICAgICAgICAgICAgZlBvdzJEaXYyKCgqcEltYWcrKykgPDwgbWF4VmFsU0YpKSA+PgorICAgICAgICAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgc2xvdE5yZ1sxXSA9ICgoZlBvdzJEaXYyKCgqcFJlYWwrKykgPDwgbWF4VmFsU0YpICsKKyAgICAgICAgICAgICAgICAgZlBvdzJEaXYyKCgqcEltYWcrKykgPDwgbWF4VmFsU0YpKSA+PgorICAgICAgICAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgc2xvdE5yZ1syXSA9ICgoZlBvdzJEaXYyKCgqcFJlYWwrKykgPDwgbWF4VmFsU0YpICsKKyAgICAgICAgICAgICAgICAgZlBvdzJEaXYyKCgqcEltYWcrKykgPDwgbWF4VmFsU0YpKSA+PgorICAgICAgICAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgLyogcXMgPSAxNSAqLworICBzbG90TnJnWzNdID0gKChmUG93MkRpdjIoKCpwUmVhbCsrKSA8PCBtYXhWYWxTRikgKworICAgICAgICAgICAgICAgICBmUG93MkRpdjIoKCpwSW1hZysrKSA8PCBtYXhWYWxTRikpID4+CisgICAgICAgICAgICAgICAgKFNGX0ZBQ1RPUl9TTE9UIC0gMSkpOworICAvKiBxcyA9IDE2LCAxNyAqLworICBucmcgPSAoKGZQb3cyRGl2MigoKnBSZWFsKyspIDw8IG1heFZhbFNGKSArCisgICAgICAgICAgZlBvdzJEaXYyKCgqcEltYWcrKykgPDwgbWF4VmFsU0YpKSA+PgorICAgICAgICAgKFNGX0ZBQ1RPUl9TTE9UIC0gMSkpOworICBzbG90TnJnWzRdID0gbnJnICsgKChmUG93MkRpdjIoKCpwUmVhbCsrKSA8PCBtYXhWYWxTRikgKworICAgICAgICAgICAgICAgICAgICAgICBmUG93MkRpdjIoKCpwSW1hZysrKSA8PCBtYXhWYWxTRikpID4+CisgICAgICAgICAgICAgICAgICAgICAgKFNGX0ZBQ1RPUl9TTE9UIC0gMSkpOworICAvKiBxcyA9IDE4LCAxOSwgMjAgKi8KKyAgbnJnID0gKChmUG93MkRpdjIoKCpwUmVhbCsrKSA8PCBtYXhWYWxTRikgKworICAgICAgICAgIGZQb3cyRGl2MigoKnBJbWFnKyspIDw8IG1heFZhbFNGKSkgPj4KKyAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgbnJnICs9ICgoZlBvdzJEaXYyKCgqcFJlYWwrKykgPDwgbWF4VmFsU0YpICsKKyAgICAgICAgICAgZlBvdzJEaXYyKCgqcEltYWcrKykgPDwgbWF4VmFsU0YpKSA+PgorICAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgc2xvdE5yZ1s1XSA9IG5yZyArICgoZlBvdzJEaXYyKCgqcFJlYWwrKykgPDwgbWF4VmFsU0YpICsKKyAgICAgICAgICAgICAgICAgICAgICAgZlBvdzJEaXYyKCgqcEltYWcrKykgPDwgbWF4VmFsU0YpKSA+PgorICAgICAgICAgICAgICAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgLyogcXMgPSAyMSwgMjIgKi8KKyAgbnJnID0gKChmUG93MkRpdjIoKCpwUmVhbCsrKSA8PCBtYXhWYWxTRikgKworICAgICAgICAgIGZQb3cyRGl2MigoKnBJbWFnKyspIDw8IG1heFZhbFNGKSkgPj4KKyAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgc2xvdE5yZ1s2XSA9IG5yZyArICgoZlBvdzJEaXYyKCgqcFJlYWwrKykgPDwgbWF4VmFsU0YpICsKKyAgICAgICAgICAgICAgICAgICAgICAgZlBvdzJEaXYyKCgqcEltYWcrKykgPDwgbWF4VmFsU0YpKSA+PgorICAgICAgICAgICAgICAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgLyogcXMgPSAyMywgMjQgKi8KKyAgaWYgKGh5YkJhbmRzID4gMjMpIHsKKyAgICBzbG90TnJnWzZdICs9ICgoZlBvdzJEaXYyKCgqcFJlYWwrKykgPDwgbWF4VmFsU0YpICsKKyAgICAgICAgICAgICAgICAgICAgZlBvdzJEaXYyKCgqcEltYWcrKykgPDwgbWF4VmFsU0YpKSA+PgorICAgICAgICAgICAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgICBzbG90TnJnWzZdICs9ICgoZlBvdzJEaXYyKCgqcFJlYWwrKykgPDwgbWF4VmFsU0YpICsKKyAgICAgICAgICAgICAgICAgICAgZlBvdzJEaXYyKCgqcEltYWcrKykgPDwgbWF4VmFsU0YpKSA+PgorICAgICAgICAgICAgICAgICAgIChTRl9GQUNUT1JfU0xPVCAtIDEpKTsKKyAgICAvKiBxcyA9IDI1LCAyNiwgMjksIDI4LCAyOSAqLworICAgIG5yZyA9ICgoZlBvdzJEaXYyKCgqcFJlYWwrKykgPDwgbWF4VmFsU0YpICsKKyAgICAgICAgICAgIGZQb3cyRGl2MigoKnBJbWFnKyspIDw8IG1heFZhbFNGKSkgPj4KKyAgICAgICAgICAgKFNGX0ZBQ1RPUl9TTE9UIC0gMSkpOworICAgIG5yZyArPSAoKGZQb3cyRGl2MigoKnBSZWFsKyspIDw8IG1heFZhbFNGKSArCisgICAgICAgICAgICAgZlBvdzJEaXYyKCgqcEltYWcrKykgPDwgbWF4VmFsU0YpKSA+PgorICAgICAgICAgICAgKFNGX0ZBQ1RPUl9TTE9UIC0gMSkpOworICAgIG5yZyArPSAoKGZQb3cyRGl2MigoKnBSZWFsKyspIDw8IG1heFZhbFNGKSArCisgICAgICAgICAgICAgZlBvdzJEaXYyKCgqcEltYWcrKykgPDwgbWF4VmFsU0YpKSA+PgorICAgICAgICAgICAgKFNGX0ZBQ1RPUl9TTE9UIC0gMSkpOworICAgIG5yZyArPSAoKGZQb3cyRGl2MigoKnBSZWFsKyspIDw8IG1heFZhbFNGKSArCisgICAgICAgICAgICAgZlBvdzJEaXYyKCgqcEltYWcrKykgPDwgbWF4VmFsU0YpKSA+PgorICAgICAgICAgICAgKFNGX0ZBQ1RPUl9TTE9UIC0gMSkpOworICAgIHNsb3ROcmdbN10gPSBucmcgKyAoKGZQb3cyRGl2MigoKnBSZWFsKyspIDw8IG1heFZhbFNGKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgZlBvdzJEaXYyKCgqcEltYWcrKykgPDwgbWF4VmFsU0YpKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgKFNGX0ZBQ1RPUl9TTE9UIC0gMSkpOworICAgIC8qIHFzID0gMzAgLi4uIG1pbig0MSxoeWJCYW5kcy0xKSAqLworICAgIG5yZyA9ICgoZlBvdzJEaXYyKCgqcFJlYWwrKykgPDwgbWF4VmFsU0YpICsKKyAgICAgICAgICAgIGZQb3cyRGl2MigoKnBJbWFnKyspIDw8IG1heFZhbFNGKSkgPj4KKyAgICAgICAgICAgKFNGX0ZBQ1RPUl9TTE9UIC0gMSkpOworICAgIGZvciAocXMgPSAzMTsgcXMgPCBoeWJCYW5kczsgcXMrKykgeworICAgICAgbnJnICs9ICgoZlBvdzJEaXYyKCgqcFJlYWwrKykgPDwgbWF4VmFsU0YpICsKKyAgICAgICAgICAgICAgIGZQb3cyRGl2MigoKnBJbWFnKyspIDw8IG1heFZhbFNGKSkgPj4KKyAgICAgICAgICAgICAgKFNGX0ZBQ1RPUl9TTE9UIC0gMSkpOworICAgIH0KKyAgICBzbG90TnJnWzhdID0gbnJnOworICB9IGVsc2UgeworICAgIHNsb3ROcmdbN10gPSAoRklYUF9EQkwpMDsKKyAgICBzbG90TnJnWzhdID0gKEZJWFBfREJMKTA7CisgIH0KK30KKworc3RhdGljIGlubGluZSBJTlQgZ2V0TWF4VmFsRG14KEZJWFBfREJMICpSRVNUUklDVCBwUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcEltYWcsIElOVCBjcGx4QmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGh5YkJhbmRzKSB7CisgIElOVCBxcywgY2x6OworICBGSVhQX0RCTCBtYXhWYWwgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICBmb3IgKHFzID0gMTI7IHFzIDwgY3BseEJhbmRzOyBxcysrKSB7CisgICAgbWF4VmFsIHw9IGZBYnMocFJlYWxbcXNdKTsKKyAgICBtYXhWYWwgfD0gZkFicyhwSW1hZ1txc10pOworICB9CisgIGZvciAoOyBxcyA8IGh5YkJhbmRzOyBxcysrKSB7CisgICAgbWF4VmFsIHw9IGZBYnMocFJlYWxbcXNdKTsKKyAgfQorCisgIGNseiA9IGZpeE1heCgwLCBDbnRMZWFkaW5nWmVyb3MobWF4VmFsKSAtIDEpOworCisgIHJldHVybiAoY2x6KTsKK30KKworc3RhdGljIGlubGluZSBJTlQgZ2V0TWF4VmFsRHJ5V2V0KEZJWFBfREJMICpSRVNUUklDVCBwUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcEltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBIeWJPdXRwdXRSZWFsRHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwSHliT3V0cHV0SW1hZ0RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcEh5Yk91dHB1dFJlYWxXZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHBIeWJPdXRwdXRJbWFnV2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjcGx4QmFuZHMsIElOVCBoeWJCYW5kcykgeworICBJTlQgcXMsIGNsejsKKyAgRklYUF9EQkwgbWF4VmFsID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisKKyAgZm9yIChxcyA9IDEyOyBxcyA8IGNwbHhCYW5kczsgcXMrKykgeworICAgIHBSZWFsW3FzXSA9IHBIeWJPdXRwdXRSZWFsRHJ5W3FzXSArIHBIeWJPdXRwdXRSZWFsV2V0W3FzXTsKKyAgICBtYXhWYWwgfD0gZkFicyhwUmVhbFtxc10pOworICAgIHBJbWFnW3FzXSA9IHBIeWJPdXRwdXRJbWFnRHJ5W3FzXSArIHBIeWJPdXRwdXRJbWFnV2V0W3FzXTsKKyAgICBtYXhWYWwgfD0gZkFicyhwSW1hZ1txc10pOworICB9CisgIGZvciAoOyBxcyA8IGh5YkJhbmRzOyBxcysrKSB7CisgICAgcFJlYWxbcXNdID0gcEh5Yk91dHB1dFJlYWxEcnlbcXNdICsgcEh5Yk91dHB1dFJlYWxXZXRbcXNdOworICAgIG1heFZhbCB8PSBmQWJzKHBSZWFsW3FzXSk7CisgIH0KKworICBjbHogPSBmaXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKG1heFZhbCkgLSAxKTsKKworICByZXR1cm4gKGNseik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbG90QW1wKEZJWFBfREJMICpSRVNUUklDVCBzbG90QW1wX2RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBzbG90QW1wX3dldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwSHliT3V0cHV0UmVhbERyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwSHliT3V0cHV0SW1hZ0RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwSHliT3V0cHV0UmVhbFdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwSHliT3V0cHV0SW1hZ1dldCwgSU5UIGNwbHhCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBoeWJCYW5kcykgeworICBJTlQgcXM7CisgIEZJWFBfREJMIGRyeSwgd2V0OworCisgIGRyeSA9IHdldCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICBmb3IgKHFzID0gMDsgcXMgPCBjcGx4QmFuZHM7IHFzKyspIHsKKyAgICBkcnkgPSBmQWRkU2F0dXJhdGUoZHJ5LCBmUG93MkRpdjIocEh5Yk91dHB1dFJlYWxEcnlbcXNdKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZQb3cyRGl2MihwSHliT3V0cHV0SW1hZ0RyeVtxc10pKTsKKyAgICB3ZXQgPSBmQWRkU2F0dXJhdGUod2V0LCBmUG93MkRpdjIocEh5Yk91dHB1dFJlYWxXZXRbcXNdKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZQb3cyRGl2MihwSHliT3V0cHV0SW1hZ1dldFtxc10pKTsKKyAgfQorICBmb3IgKDsgcXMgPCBoeWJCYW5kczsgcXMrKykgeworICAgIGRyeSA9IGZBZGRTYXR1cmF0ZShkcnksIGZQb3cyRGl2MihwSHliT3V0cHV0UmVhbERyeVtxc10pKTsKKyAgICB3ZXQgPSBmQWRkU2F0dXJhdGUod2V0LCBmUG93MkRpdjIocEh5Yk91dHB1dFJlYWxXZXRbcXNdKSk7CisgIH0KKyAgKnNsb3RBbXBfZHJ5ID0gZHJ5OworICAqc2xvdEFtcF93ZXQgPSB3ZXQ7Cit9CisKKyNpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQorX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQorI2VuZGlmCitzdGF0aWMgdm9pZAorc2hhcGVCQkVudihGSVhQX0RCTCAqcEh5Yk91dHB1dFJlYWxEcnksIEZJWFBfREJMICpwSHliT3V0cHV0SW1hZ0RyeSwKKyAgICAgICAgICAgRklYUF9EQkwgZHJ5RmFjLCBJTlQgc2NhbGUsIElOVCBjcGx4QmFuZHMsIElOVCBoeWJCYW5kcykgeworICBJTlQgcXM7CisKKyAgaWYgKHNjYWxlID09IDApIHsKKyAgICBmb3IgKHFzID0gMDsgcXMgPCBjcGx4QmFuZHM7IHFzKyspIHsKKyAgICAgIHBIeWJPdXRwdXRSZWFsRHJ5W3FzXSA9IGZNdWx0RGl2MihwSHliT3V0cHV0UmVhbERyeVtxc10sIGRyeUZhYyk7CisgICAgICBwSHliT3V0cHV0SW1hZ0RyeVtxc10gPSBmTXVsdERpdjIocEh5Yk91dHB1dEltYWdEcnlbcXNdLCBkcnlGYWMpOworICAgIH0KKyAgICBmb3IgKDsgcXMgPCBoeWJCYW5kczsgcXMrKykgeworICAgICAgcEh5Yk91dHB1dFJlYWxEcnlbcXNdID0gZk11bHREaXYyKHBIeWJPdXRwdXRSZWFsRHJ5W3FzXSwgZHJ5RmFjKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChxcyA9IDA7IHFzIDwgY3BseEJhbmRzOyBxcysrKSB7CisgICAgICBwSHliT3V0cHV0UmVhbERyeVtxc10gPSBmTXVsdERpdjIocEh5Yk91dHB1dFJlYWxEcnlbcXNdLCBkcnlGYWMpIDw8IHNjYWxlOworICAgICAgcEh5Yk91dHB1dEltYWdEcnlbcXNdID0gZk11bHREaXYyKHBIeWJPdXRwdXRJbWFnRHJ5W3FzXSwgZHJ5RmFjKSA8PCBzY2FsZTsKKyAgICB9CisgICAgZm9yICg7IHFzIDwgaHliQmFuZHM7IHFzKyspIHsKKyAgICAgIHBIeWJPdXRwdXRSZWFsRHJ5W3FzXSA9IGZNdWx0RGl2MihwSHliT3V0cHV0UmVhbERyeVtxc10sIGRyeUZhYykgPDwgc2NhbGU7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIGV4dHJhY3RCQkVudihzcGF0aWFsRGVjICpzZWxmLCBJTlQgaW5wLCBJTlQgc3RhcnQsIElOVCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcEVudiwgY29uc3QgU1BBVElBTF9CU19GUkFNRSAqZnJhbWUpIHsKKyAgSU5UIGNoLCBwYiwgcHJldkNoT2ZmczsKKyAgSU5UIGNseiwgc2NhbGUsIHNjYWxlX21pbiwgZW52U0Y7CisgIElOVCBzY2FsZUN1ciwgc2NhbGVQcmV2LCBjb21tb25TY2FsZTsKKyAgSU5UIHNsb3ROcmdTRiwgcGFydE5yZ1NGLCBmcmFtZU5yZ1NGOworICBJTlQgKnBQYXJ0TnJnUHJldlNGLCAqcEZyYW1lTnJnUHJldlNGOworICBJTlQgKnBOb3JtTnJnUHJldlNGLCAqcFBhcnROcmdQcmV2MlNGOworCisgIEZJWFBfREJMIG1heFZhbCwgZW52LCBmcmFtZU5yZywgbm9ybU5yZzsKKyAgRklYUF9EQkwgKnBSZWFsLCAqcEltYWc7CisgIEZJWFBfREJMICpwYXJ0TnJnLCAqcGFydE5yZ1ByZXY7CisKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHBTY3JhdGNoQnVmZmVyLCBGSVhQX0RCTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICgyICogNDIgKyBNQVhfUEFSQU1FVEVSX0JBTkRTKSk7CisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChyZXNQYiwgRklYUF9EQkwsIChFTkRfQkJfRU5WIC0gU1RBUlRfQkJfRU5WKSk7CisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChyZXNQYlNGLCBJTlQsIChFTkRfQkJfRU5WIC0gU1RBUlRfQkJfRU5WKSk7CisKKyAgRklYUF9EQkwgKnNsb3ROcmcgPSBwU2NyYXRjaEJ1ZmZlciArICgyICogNDIpOworCisgIFJFU0hBUEVfQkJFTlZfU1RBVEUgKnBCQkVudlN0YXRlID0gc2VsZi0+cmVzaGFwZUJCRW52U3RhdGU7CisKKyAgRklYUF9EQkwgYWxwaGEgPSBwQkJFbnZTdGF0ZS0+YWxwaGFfX0ZESzsKKyAgLypGSVhQX0RCTCAgYWxwaGExID0gKEZMMkZYQ09OU1RfREJMKDEuMGYpIC0gYWxwaGEpIDw8IFNGX0FMUEhBMTsqLworICBGSVhQX0RCTCBhbHBoYTEgPSAoKEZJWFBfREJMKU1BWFZBTF9EQkwgLSBhbHBoYSkgPDwgU0ZfQUxQSEExOworICBGSVhQX0RCTCBiZXRhID0gcEJCRW52U3RhdGUtPmJldGFfX0ZESzsKKyAgLypGSVhQX0RCTCAgYmV0YTEgID0gKEZMMkZYQ09OU1RfREJMKDEuMGYpIC0gYmV0YSkgPDwgU0ZfQkVUQTE7Ki8KKyAgRklYUF9EQkwgYmV0YTEgPSAoKEZJWFBfREJMKU1BWFZBTF9EQkwgLSBiZXRhKSA8PCBTRl9CRVRBMTsKKworICBJTlQgc2hhcGVBY3RpdiA9IDE7CisgIElOVCBoeWJCYW5kcyA9IGZpeE1pbig0Miwgc2VsZi0+aHlicmlkQmFuZHMpOworICBJTlQgc3RhdGljU2NhbGUgPSBzZWxmLT5zdGF0aWNEZWNTY2FsZTsKKyAgSU5UIGNwbHhCYW5kczsKKyAgY3BseEJhbmRzID0gZml4TWluKDQyLCBzZWxmLT5oeWJyaWRCYW5kcyk7CisKKyAgZm9yIChjaCA9IHN0YXJ0OyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgaWYgKGlucCA9PSBJTlBfRFJZX1dFVCkgeworICAgICAgSU5UIGNoMiA9IHJvdzJjaGFubmVsR0VTW3NlbGYtPnRyZWVDb25maWddW2NoXTsKKyAgICAgIGlmIChjaDIgPT0gLTEpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZnJhbWUtPnRlbXBTaGFwZUVuYWJsZUNoYW5uZWxHRVNbY2gyXSkgeworICAgICAgICAgIHNoYXBlQWN0aXYgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNoYXBlQWN0aXYgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgICBwcmV2Q2hPZmZzID0gY2g7CisgICAgICBwUmVhbCA9IHBTY3JhdGNoQnVmZmVyOworICAgICAgcEltYWcgPSBwU2NyYXRjaEJ1ZmZlciArIDQyOworICAgICAgY2x6ID0gZ2V0TWF4VmFsRHJ5V2V0KAorICAgICAgICAgIHBSZWFsLCBwSW1hZywgc2VsZi0+aHliT3V0cHV0UmVhbERyeV9fRkRLW2NoXSwKKyAgICAgICAgICBzZWxmLT5oeWJPdXRwdXRJbWFnRHJ5X19GREtbY2hdLCBzZWxmLT5oeWJPdXRwdXRSZWFsV2V0X19GREtbY2hdLAorICAgICAgICAgIHNlbGYtPmh5Yk91dHB1dEltYWdXZXRfX0ZES1tjaF0sIGNwbHhCYW5kcywgaHliQmFuZHMpOworICAgIH0gZWxzZSB7CisgICAgICBwcmV2Q2hPZmZzID0gY2ggKyBzZWxmLT5udW1PdXRwdXRDaGFubmVsczsKKyAgICAgIHBSZWFsID0gc2VsZi0+aHliSW5wdXRSZWFsX19GREtbY2hdOworICAgICAgcEltYWcgPSBzZWxmLT5oeWJJbnB1dEltYWdfX0ZES1tjaF07CisgICAgICBjbHogPSBnZXRNYXhWYWxEbXgocFJlYWwsIHBJbWFnLCBjcGx4QmFuZHMsIGh5YkJhbmRzKTsKKyAgICB9CisKKyAgICBwYXJ0TnJnID0gcGFydE5yZ1ByZXYgPSBwQkJFbnZTdGF0ZS0+cGFydE5yZ1ByZXZfX0ZES1twcmV2Q2hPZmZzXTsKKyAgICBwUGFydE5yZ1ByZXZTRiA9ICZwQkJFbnZTdGF0ZS0+cGFydE5yZ1ByZXZTRltwcmV2Q2hPZmZzXTsKKyAgICBwRnJhbWVOcmdQcmV2U0YgPSAmcEJCRW52U3RhdGUtPmZyYW1lTnJnUHJldlNGW3ByZXZDaE9mZnNdOworICAgIHBOb3JtTnJnUHJldlNGID0gJnBCQkVudlN0YXRlLT5ub3JtTnJnUHJldlNGW3ByZXZDaE9mZnNdOworICAgIHBQYXJ0TnJnUHJldjJTRiA9ICZwQkJFbnZTdGF0ZS0+cGFydE5yZ1ByZXYyU0ZbcHJldkNoT2Zmc107CisKKyAgICAvKiBjYWxjdWxhdGUgc2xvdCBlbmVyZ3kgKi8KKyAgICB7CisgICAgICBnZXRTbG90TnJnSFEoJnBSZWFsWzEyXSwgJnBJbWFnWzEyXSwgc2xvdE5yZywgY2x6LAorICAgICAgICAgICAgICAgICAgIGZpeE1pbig0Miwgc2VsZi0+aHlicmlkQmFuZHMpKTsgLyogc2NhbGUgc2xvdE5yZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIqKHN0YXRpY1NjYWxlLWNseikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ZfRkFDVE9SX1NMT1QgKi8KKyAgICB9CisKKyAgICBzbG90TnJnU0YgPSAyICogKHN0YXRpY1NjYWxlIC0gY2x6KSArIFNGX0ZBQ1RPUl9TTE9UOworICAgIGZyYW1lTnJnU0YgPSAyICogKHN0YXRpY1NjYWxlIC0gY2x6KSArIFNGX0ZBQ1RPUl9TTE9UOworCisgICAgcGFydE5yZ1NGID0gZml4TWF4KHNsb3ROcmdTRiAtIFNGX0FMUEhBMSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgIHBQYXJ0TnJnUHJldlNGWzBdIC0gcFBhcnROcmdQcmV2MlNGWzBdICsgMSk7CisgICAgc2NhbGVQcmV2ID0gZml4TWF4KGZpeE1pbihwYXJ0TnJnU0YgLSBwUGFydE5yZ1ByZXZTRlswXSwgREZSQUNUX0JJVFMgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgLShERlJBQ1RfQklUUyAtIDEpKTsKKyAgICBzY2FsZUN1ciA9CisgICAgICAgIGZpeE1heChmaXhNaW4ocGFydE5yZ1NGIC0gc2xvdE5yZ1NGICsgU0ZfQUxQSEExLCBERlJBQ1RfQklUUyAtIDEpLAorICAgICAgICAgICAgICAgLShERlJBQ1RfQklUUyAtIDEpKTsKKworICAgIG1heFZhbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgIGZyYW1lTnJnID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgaWYgKChzY2FsZUN1ciA8IDApICYmIChzY2FsZVByZXYgPCAwKSkgeworICAgICAgc2NhbGVDdXIgPSAtc2NhbGVDdXI7CisgICAgICBzY2FsZVByZXYgPSAtc2NhbGVQcmV2OworICAgICAgZm9yIChwYiA9IFNUQVJUX0JCX0VOVjsgcGIgPCBFTkRfQkJfRU5WOyBwYisrKSB7CisgICAgICAgIHBhcnROcmdbcGJdID0gKChmTXVsdERpdjIoYWxwaGExLCBzbG90TnJnW3BiXSkgPDwgc2NhbGVDdXIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgKGZNdWx0RGl2MihhbHBoYSwgcGFydE5yZ1ByZXZbcGJdKSA8PCBzY2FsZVByZXYpKQorICAgICAgICAgICAgICAgICAgICAgIDw8IDE7CisgICAgICAgIG1heFZhbCB8PSBwYXJ0TnJnW3BiXTsKKyAgICAgICAgZnJhbWVOcmcgKz0gc2xvdE5yZ1twYl0gPj4gMzsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChzY2FsZUN1ciA+PSAwKSAmJiAoc2NhbGVQcmV2ID49IDApKSB7CisgICAgICBmb3IgKHBiID0gU1RBUlRfQkJfRU5WOyBwYiA8IEVORF9CQl9FTlY7IHBiKyspIHsKKyAgICAgICAgcGFydE5yZ1twYl0gPSAoKGZNdWx0RGl2MihhbHBoYTEsIHNsb3ROcmdbcGJdKSA+PiBzY2FsZUN1cikgKworICAgICAgICAgICAgICAgICAgICAgICAoZk11bHREaXYyKGFscGhhLCBwYXJ0TnJnUHJldltwYl0pID4+IHNjYWxlUHJldikpCisgICAgICAgICAgICAgICAgICAgICAgPDwgMTsKKyAgICAgICAgbWF4VmFsIHw9IHBhcnROcmdbcGJdOworICAgICAgICBmcmFtZU5yZyArPSBzbG90TnJnW3BiXSA+PiAzOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoKHNjYWxlQ3VyIDwgMCkgJiYgKHNjYWxlUHJldiA+PSAwKSkgeworICAgICAgc2NhbGVDdXIgPSAtc2NhbGVDdXI7CisgICAgICBmb3IgKHBiID0gU1RBUlRfQkJfRU5WOyBwYiA8IEVORF9CQl9FTlY7IHBiKyspIHsKKyAgICAgICAgcGFydE5yZ1twYl0gPSAoKGZNdWx0RGl2MihhbHBoYTEsIHNsb3ROcmdbcGJdKSA8PCBzY2FsZUN1cikgKworICAgICAgICAgICAgICAgICAgICAgICAoZk11bHREaXYyKGFscGhhLCBwYXJ0TnJnUHJldltwYl0pID4+IHNjYWxlUHJldikpCisgICAgICAgICAgICAgICAgICAgICAgPDwgMTsKKyAgICAgICAgbWF4VmFsIHw9IHBhcnROcmdbcGJdOworICAgICAgICBmcmFtZU5yZyArPSBzbG90TnJnW3BiXSA+PiAzOworICAgICAgfQorICAgIH0gZWxzZSB7IC8qIGlmICggKHNjYWxlQ3VyID49IDApICYmIChzY2FsZVByZXYgPCAwKSApICovCisgICAgICBzY2FsZVByZXYgPSAtc2NhbGVQcmV2OworICAgICAgZm9yIChwYiA9IFNUQVJUX0JCX0VOVjsgcGIgPCBFTkRfQkJfRU5WOyBwYisrKSB7CisgICAgICAgIHBhcnROcmdbcGJdID0gKChmTXVsdERpdjIoYWxwaGExLCBzbG90TnJnW3BiXSkgPj4gc2NhbGVDdXIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgKGZNdWx0RGl2MihhbHBoYSwgcGFydE5yZ1ByZXZbcGJdKSA8PCBzY2FsZVByZXYpKQorICAgICAgICAgICAgICAgICAgICAgIDw8IDE7CisgICAgICAgIG1heFZhbCB8PSBwYXJ0TnJnW3BiXTsKKyAgICAgICAgZnJhbWVOcmcgKz0gc2xvdE5yZ1twYl0gPj4gMzsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBmcmFtZU5yZyAvPSAoRU5EX0JCX0VOViAtIFNUQVJUX0JCX0VOVik7IDAuODg4ODg4ODg4ODhmID0KKyAgICAgKiAoMS8oRU5EX0JCX0VOVi1TVEFSVF9CQl9FTlYpPDwzOyBzaGlmdCB3aXRoIDMgaXMgY29tcGVuc2F0ZWQgaW4gbG9vcAorICAgICAqIGFib3ZlICovCisgICAgZnJhbWVOcmcgPSBmTXVsdChmcmFtZU5yZywgRkwyRlhDT05TVF9EQkwoMC44ODg4ODg4ODg4OGYpKTsKKworICAgIC8qIHN0b3JlIHNjYWxlZmFjdG9yIGFuZCBoZWFkcm9vbSBmb3IgcGFydCBucmcgcHJldiAqLworICAgIHBQYXJ0TnJnUHJldlNGWzBdID0gcGFydE5yZ1NGOworICAgIHBQYXJ0TnJnUHJldjJTRlswXSA9IGZpeE1heCgwLCBDbnRMZWFkaW5nWmVyb3MobWF4VmFsKSAtIDEpOworCisgICAgY29tbW9uU2NhbGUgPSBmaXhNYXgoZnJhbWVOcmdTRiAtIFNGX0FMUEhBMSArIDEsIHBGcmFtZU5yZ1ByZXZTRlswXSArIDEpOworICAgIHNjYWxlUHJldiA9IGZpeE1pbihjb21tb25TY2FsZSAtIHBGcmFtZU5yZ1ByZXZTRlswXSwgREZSQUNUX0JJVFMgLSAxKTsKKyAgICBzY2FsZUN1ciA9IGZpeE1pbihjb21tb25TY2FsZSAtIGZyYW1lTnJnU0YgKyBTRl9BTFBIQTEsIERGUkFDVF9CSVRTIC0gMSk7CisgICAgZnJhbWVOcmdTRiA9IGNvbW1vblNjYWxlOworCisgICAgZnJhbWVOcmcgPSAoKGZNdWx0RGl2MihhbHBoYTEsIGZyYW1lTnJnKSA+PiBzY2FsZUN1cikgKworICAgICAgICAgICAgICAgIChmTXVsdERpdjIoYWxwaGEsIHBCQkVudlN0YXRlLT5mcmFtZU5yZ1ByZXZfX0ZES1twcmV2Q2hPZmZzXSkgPj4KKyAgICAgICAgICAgICAgICAgc2NhbGVQcmV2KSkKKyAgICAgICAgICAgICAgIDw8IDE7CisKKyAgICBjbHogPSBmaXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKGZyYW1lTnJnKSAtIDEpOworICAgIHBCQkVudlN0YXRlLT5mcmFtZU5yZ1ByZXZfX0ZES1twcmV2Q2hPZmZzXSA9IGZyYW1lTnJnIDw8IGNsejsKKyAgICBwRnJhbWVOcmdQcmV2U0ZbMF0gPSBmcmFtZU5yZ1NGIC0gY2x6OworCisgICAgZW52ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgc2NhbGUgPSBjbHogKyBwYXJ0TnJnU0YgLSBmcmFtZU5yZ1NGOworICAgIHNjYWxlX21pbiA9IERGUkFDVF9CSVRTIC0gMTsKKyAgICBmb3IgKHBiID0gU1RBUlRfQkJfRU5WOyBwYiA8IEVORF9CQl9FTlY7IHBiKyspIHsKKyAgICAgIGlmICgocGFydE5yZ1twYl0gfCBzbG90TnJnW3BiXSkgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgICAgSU5UIHM7CisgICAgICAgIElOVCBzYyA9IDA7CisgICAgICAgIElOVCBzbiA9IGZpeE1heCgwLCBDbnRMZWFkaW5nWmVyb3Moc2xvdE5yZ1twYl0pIC0gMSk7CisgICAgICAgIEZJWFBfREJMIGludl9zcXJ0ID0gaW52U3FydE5vcm0yKHBhcnROcmdbcGJdLCAmc2MpOworICAgICAgICBGSVhQX0RCTCByZXMgPSBmTXVsdChzbG90TnJnW3BiXSA8PCBzbiwgZlBvdzIoaW52X3NxcnQpKTsKKworICAgICAgICBzID0gZml4TWF4KDAsIENudExlYWRpbmdaZXJvcyhyZXMpIC0gMSk7CisgICAgICAgIHJlcyA9IHJlcyA8PCBzOworCisgICAgICAgIHNjID0gc2NhbGUgLSAoMiAqIHNjIC0gc24gLSBzKTsKKyAgICAgICAgc2NhbGVfbWluID0gZml4TWluKHNjYWxlX21pbiwgc2MpOworCisgICAgICAgIHJlc1BiW3BiXSA9IHJlczsKKyAgICAgICAgcmVzUGJTRltwYl0gPSBzYzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc1BiW3BiXSA9IChGSVhQX0RCTCkwOworICAgICAgICByZXNQYlNGW3BiXSA9IDA7CisgICAgICB9CisgICAgfQorCisgICAgc2NhbGVfbWluID0gNCAtIHNjYWxlX21pbjsKKworICAgIGZvciAocGIgPSBTVEFSVF9CQl9FTlY7IHBiIDwgRU5EX0JCX0VOVjsgcGIrKykgeworICAgICAgSU5UIHNjID0gZml4TWF4KGZpeE1pbihyZXNQYlNGW3BiXSArIHNjYWxlX21pbiwgREZSQUNUX0JJVFMgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAtKERGUkFDVF9CSVRTIC0gMSkpOworCisgICAgICBpZiAoc2MgPCAwKSB7CisgICAgICAgIGVudiArPSByZXNQYltwYl0gPDwgKC1zYyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbnYgKz0gcmVzUGJbcGJdID4+IChzYyk7CisgICAgICB9CisgICAgfQorCisgICAgZW52ID0gZk11bHREaXYyKGVudiwgcEJCRW52U3RhdGUtPmZyYW1lTnJnUHJldl9fRkRLW3ByZXZDaE9mZnNdKTsKKyAgICBlbnZTRiA9IHNsb3ROcmdTRiArIHNjYWxlX21pbiArIDE7CisKKyAgICBjb21tb25TY2FsZSA9IGZpeE1heChlbnZTRiAtIFNGX0JFVEExICsgMSwgcE5vcm1OcmdQcmV2U0ZbMF0gKyAxKTsKKyAgICBzY2FsZVByZXYgPSBmaXhNaW4oY29tbW9uU2NhbGUgLSBwTm9ybU5yZ1ByZXZTRlswXSwgREZSQUNUX0JJVFMgLSAxKTsKKyAgICBzY2FsZUN1ciA9IGZpeE1pbihjb21tb25TY2FsZSAtIGVudlNGICsgU0ZfQkVUQTEsIERGUkFDVF9CSVRTIC0gMSk7CisKKyAgICBub3JtTnJnID0gKChmTXVsdERpdjIoYmV0YTEsIGVudikgPj4gc2NhbGVDdXIpICsKKyAgICAgICAgICAgICAgIChmTXVsdERpdjIoYmV0YSwgcEJCRW52U3RhdGUtPm5vcm1OcmdQcmV2X19GREtbcHJldkNoT2Zmc10pID4+CisgICAgICAgICAgICAgICAgc2NhbGVQcmV2KSkKKyAgICAgICAgICAgICAgPDwgMTsKKworICAgIGNseiA9IGZpeE1heCgwLCBDbnRMZWFkaW5nWmVyb3Mobm9ybU5yZykgLSAxKTsKKyAgICBwQkJFbnZTdGF0ZS0+bm9ybU5yZ1ByZXZfX0ZES1twcmV2Q2hPZmZzXSA9IG5vcm1OcmcgPDwgY2x6OworICAgIHBOb3JtTnJnUHJldlNGWzBdID0gY29tbW9uU2NhbGUgLSBjbHo7CisKKyAgICBpZiAoc2hhcGVBY3RpdikgeworICAgICAgaWYgKChlbnYgfCBub3JtTnJnKSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgICBJTlQgc2MsIHNlLCBzbjsKKyAgICAgICAgc2UgPSBmaXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKGVudikgLSAxKTsKKyAgICAgICAgc2MgPSBjb21tb25TY2FsZSArIFNGX0RJVjMyIC0gZW52U0YgKyBzZTsKKyAgICAgICAgZW52ID0gZk11bHQoc3FydEZpeHAoKGVudiA8PCBzZSkgPj4gKHNjICYgMHgxKSksCisgICAgICAgICAgICAgICAgICAgIGludlNxcnROb3JtMihub3JtTnJnLCAmc24pKTsKKworICAgICAgICBzYyA9IGZpeE1pbigoc2MgPj4gMSkgLSBzbiwgREZSQUNUX0JJVFMgLSAxKTsKKyAgICAgICAgaWYgKHNjIDwgMCkgeworICAgICAgICAgIGVudiA8PD0gKC1zYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZW52ID4+PSAoc2MpOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBlbnYgaXMgc2NhbGVkIGJ5IFNGX0RJVjMyLzIgYml0cyAqLworICAgIH0KKyAgICBwRW52W2NoXSA9IGVudjsKKyAgfQorCisgIENfQUxMT0NfU0NSQVRDSF9FTkQocmVzUGJTRiwgSU5ULCAoRU5EX0JCX0VOViAtIFNUQVJUX0JCX0VOVikpOworICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHJlc1BiLCBGSVhQX0RCTCwgKEVORF9CQl9FTlYgLSBTVEFSVF9CQl9FTlYpKTsKKyAgQ19BTExPQ19TQ1JBVENIX0VORChwU2NyYXRjaEJ1ZmZlciwgRklYUF9EQkwsICgyICogNDIgKyBNQVhfUEFSQU1FVEVSX0JBTkRTKSk7Cit9CisKK3ZvaWQgU3BhdGlhbERlY1Jlc2hhcGVCQkVudihzcGF0aWFsRGVjICpzZWxmLCBjb25zdCBTUEFUSUFMX0JTX0ZSQU1FICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdHMpIHsKKyAgSU5UIGNoLCBzY2FsZTsKKyAgSU5UIGRyeUZhY1NGLCBzbG90QW1wU0Y7CisgIEZJWFBfREJMIHRtcCwgZHJ5RmFjLCBlbnZTaGFwZTsKKyAgRklYUF9EQkwgc2xvdEFtcF9kcnksIHNsb3RBbXBfd2V0LCBzbG90QW1wX3JhdGlvOworICBGSVhQX0RCTCBlbnZEcnlbTUFYX09VVFBVVF9DSEFOTkVMU10sIGVudkRteFsyXTsKKworICBJTlQgY3BseEJhbmRzOworICBJTlQgaHliQmFuZHMgPSBzZWxmLT5oeWJyaWRCYW5kcyAtIDY7CisKKyAgY3BseEJhbmRzID0gc2VsZi0+aHlicmlkQmFuZHMgLSA2OworCisgIC8qIGV4dHJhY3QgZG93bm1peCBlbnZlbG9wZShzKSAqLworICBzd2l0Y2ggKHNlbGYtPnRyZWVDb25maWcpIHsKKyAgICBkZWZhdWx0OgorICAgICAgZXh0cmFjdEJCRW52KHNlbGYsIElOUF9ETVgsIDAsIGZNaW4oc2VsZi0+bnVtSW5wdXRDaGFubmVscywgMiksIGVudkRteCwKKyAgICAgICAgICAgICAgICAgICBmcmFtZSk7CisgIH0KKworICAvKiBleHRyYWN0IGRyeSBhbmQgd2V0IGVudmVsb3BlcyAqLworICBleHRyYWN0QkJFbnYoc2VsZiwgSU5QX0RSWV9XRVQsIDAsIHNlbGYtPm51bU91dHB1dENoYW5uZWxzLCBlbnZEcnksIGZyYW1lKTsKKworICBmb3IgKGNoID0gMDsgY2ggPCBzZWxmLT5udW1PdXRwdXRDaGFubmVsczsgY2grKykgeworICAgIElOVCBjaDI7CisKKyAgICBjaDIgPSByb3cyY2hhbm5lbEdFU1tzZWxmLT50cmVlQ29uZmlnXVtjaF07CisKKyAgICBpZiAoY2gyID09IC0xKSBjb250aW51ZTsKKworICAgIGlmIChmcmFtZS0+dGVtcFNoYXBlRW5hYmxlQ2hhbm5lbEdFU1tjaDJdKSB7CisgICAgICBJTlQgc2M7CisKKyAgICAgIC8qIHJlc2hhcGUgZHJ5IGFuZCB3ZXQgc2lnbmFscyBhY2NvcmRpbmcgdG8gdHJhbnNtaXR0ZWQgZW52ZWxvcGUgKi8KKworICAgICAgLyogRGUtcXVhbnRpemUgR0VTIGRhdGEgKi8KKyAgICAgIEZES19BU1NFUlQoKGZyYW1lLT5ic0VudlNoYXBlRGF0YVtjaDJdW3RzXSA+PSAwKSAmJgorICAgICAgICAgICAgICAgICAoZnJhbWUtPmJzRW52U2hhcGVEYXRhW2NoMl1bdHNdIDw9IDQpKTsKKyAgICAgIEZES19BU1NFUlQoKHNlbGYtPmVudlF1YW50TW9kZSA9PSAwKSB8fCAoc2VsZi0+ZW52UXVhbnRNb2RlID09IDEpKTsKKyAgICAgIGVudlNoYXBlID0KKyAgICAgICAgICBGWF9DRkcyRlhfREJMKGVudlNoYXBlRGF0YVRhYmxlX19GREtbZnJhbWUtPmJzRW52U2hhcGVEYXRhW2NoMl1bdHNdXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmLT5lbnZRdWFudE1vZGVdKTsKKworICAgICAgLyogZ2V0IGRvd25taXggY2hhbm5lbCAqLworICAgICAgY2gyID0gc2VsZi0+cm93MmNoYW5uZWxEbXhHRVNbY2hdOworCisgICAgICAvKiBtdWx0aXBseSByYXRpbyB3aXRoIGRteCBlbnZlbG9wZTsgdG1wIGlzIHNjYWxlZCBieSBTRl9ESVYzMi8yK1NGX1NIQVBFCisgICAgICAgKiBiaXRzICovCisgICAgICBpZiAoY2gyID09IDIpIHsKKyAgICAgICAgdG1wID0gZk11bHREaXYyKGVudlNoYXBlLCBlbnZEbXhbMF0pICsgZk11bHREaXYyKGVudlNoYXBlLCBlbnZEbXhbMV0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdG1wID0gZk11bHQoZW52U2hhcGUsIGVudkRteFtjaDJdKTsKKyAgICAgIH0KKworICAgICAgLyogd2VpZ2h0aW5nIGZhY3RvcnMgKi8KKyAgICAgIGRyeUZhY1NGID0gc2xvdEFtcFNGID0gMDsKKyAgICAgIGRyeUZhYyA9IHNsb3RBbXBfcmF0aW8gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKworICAgICAgLyogZHJ5RmFjIHdpbGwgYmUgc2NhbGVkIGJ5IGRyeUZhY1NGIGJpdHMgKi8KKyAgICAgIGlmIChlbnZEcnlbY2hdICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICAgIGVudkRyeVtjaF0gPSBpbnZTcXJ0Tm9ybTIoZW52RHJ5W2NoXSwgJmRyeUZhY1NGKTsKKyAgICAgICAgZHJ5RmFjID0gZk11bHREaXYyKHRtcCwgZlBvdzJEaXYyKGVudkRyeVtjaF0pKSA8PCAyOworICAgICAgICBkcnlGYWNTRiA9IFNGX1NIQVBFICsgMiAqIGRyeUZhY1NGOworICAgICAgfQorCisgICAgICAvKiBjYWxjdWxhdGUgc2xvdEFtcF9kcnkgYW5kIHNsb3RBbXBfd2V0ICovCisgICAgICBzbG90QW1wKCZzbG90QW1wX2RyeSwgJnNsb3RBbXBfd2V0LCAmc2VsZi0+aHliT3V0cHV0UmVhbERyeV9fRkRLW2NoXVs2XSwKKyAgICAgICAgICAgICAgJnNlbGYtPmh5Yk91dHB1dEltYWdEcnlfX0ZES1tjaF1bNl0sCisgICAgICAgICAgICAgICZzZWxmLT5oeWJPdXRwdXRSZWFsV2V0X19GREtbY2hdWzZdLAorICAgICAgICAgICAgICAmc2VsZi0+aHliT3V0cHV0SW1hZ1dldF9fRkRLW2NoXVs2XSwgY3BseEJhbmRzLCBoeWJCYW5kcyk7CisKKyAgICAgIC8qIHNsb3RBbXBfcmF0aW8gd2lsbCBiZSBzY2FsZWQgYnkgc2xvdEFtcFNGIGJpdHMgKi8KKyAgICAgIGlmIChzbG90QW1wX2RyeSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgICBzYyA9IGZpeE1heCgwLCBDbnRMZWFkaW5nWmVyb3Moc2xvdEFtcF93ZXQpIC0gMSk7CisgICAgICAgIHNjID0gc2MgLSAoc2MgJiAxKTsKKworICAgICAgICBzbG90QW1wX3dldCA9IHNxcnRGaXhwKHNsb3RBbXBfd2V0IDw8IHNjKTsKKyAgICAgICAgc2xvdEFtcF9kcnkgPSBpbnZTcXJ0Tm9ybTIoc2xvdEFtcF9kcnksICZzbG90QW1wU0YpOworCisgICAgICAgIHNsb3RBbXBfcmF0aW8gPSBmTXVsdChzbG90QW1wX3dldCwgc2xvdEFtcF9kcnkpOworICAgICAgICBzbG90QW1wU0YgPSBzbG90QW1wU0YgLSAoc2MgPj4gMSk7CisgICAgICB9CisKKyAgICAgIC8qIGNhbGN1bGF0ZSBjb21tb24gc2NhbGUgZmFjdG9yICovCisgICAgICBzY2FsZSA9CisgICAgICAgICAgZml4TWF4KDMsIGZpeE1heChkcnlGYWNTRiwgc2xvdEFtcFNGKSk7IC8qIHNjYWxlIGlzIGF0IGxlYXN0IHdpdGggMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzIHRvIGF2b2lkIG92ZXJmbG93cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGNhbGN1bGF0aW5nIGRyeUZhYyAgKi8KKyAgICAgIGRyeUZhYyA9IGRyeUZhYyA+PiAoc2NhbGUgLSBkcnlGYWNTRik7CisgICAgICBzbG90QW1wX3JhdGlvID0gc2xvdEFtcF9yYXRpbyA+PiAoc2NhbGUgLSBzbG90QW1wU0YpOworCisgICAgICAvKiBsaW1pdCBkcnlGYWMgKi8KKyAgICAgIGRyeUZhYyA9IGZpeE1heCgKKyAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjI1ZikgPj4gKElOVClmaXhNaW4oMiAqIHNjYWxlLCBERlJBQ1RfQklUUyAtIDEpLAorICAgICAgICAgIGZNdWx0KGRyeUZhYywgc2xvdEFtcF9yYXRpbykgLSAoc2xvdEFtcF9yYXRpbyA+PiBzY2FsZSkgKworICAgICAgICAgICAgICAoZHJ5RmFjID4+IHNjYWxlKSk7CisgICAgICBkcnlGYWMgPSBmaXhNaW4oCisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC41MGYpID4+IChJTlQpZml4TWluKDIgKiBzY2FsZSAtIDMsIERGUkFDVF9CSVRTIC0gMSksCisgICAgICAgICAgZHJ5RmFjKTsgLyogcmVkdWNlIHNoaWZ0IGJpdHMgYnkgMywgYmVjYXVzZSB1cHBlcgorICAgICAgICAgICAgICAgICAgICAgIGxpbWl0IDQuMCBpcyBzY2FsZWQgd2l0aCAzIGJpdHMgKi8KKyAgICAgIHNjYWxlID0gMiAqIHNjYWxlICsgMTsKKworICAgICAgLyogaW1wcm92ZSBwcmVjaXNpb24gZm9yIGRyeUZhYyAqLworICAgICAgc2MgPSBmaXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKGRyeUZhYykgLSAxKTsKKyAgICAgIGRyeUZhYyA9IGRyeUZhYyA8PCAoSU5UKWZpeE1pbihzY2FsZSwgc2MpOworICAgICAgc2NhbGUgPSBzY2FsZSAtIGZpeE1pbihzY2FsZSwgc2MpOworCisgICAgICAvKiBzaGFwaW5nICovCisgICAgICBzaGFwZUJCRW52KCZzZWxmLT5oeWJPdXRwdXRSZWFsRHJ5X19GREtbY2hdWzZdLAorICAgICAgICAgICAgICAgICAmc2VsZi0+aHliT3V0cHV0SW1hZ0RyeV9fRkRLW2NoXVs2XSwgZHJ5RmFjLCBzY2FsZSwgY3BseEJhbmRzLAorICAgICAgICAgICAgICAgICBoeWJCYW5kcyk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19yZXNoYXBlQkJFbnYuaCBiL2xpYlNBQ2RlYy9zcmMvc2FjX3Jlc2hhcGVCQkVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NTg1MzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY19yZXNoYXBlQkJFbnYuaApAQCAtMCwwICsxLDExNCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBTQUMgRGVjIGd1aWRlZCBlbnZlbG9wZSBzaGFwaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0FDX1JFU0hBUEVCQkVOVl9ICisjZGVmaW5lIFNBQ19SRVNIQVBFQkJFTlZfSAorCisjaW5jbHVkZSAic2FjX2RlY19pbnRlcmZhY2UuaCIKKworI2RlZmluZSBCQl9FTlZfU0laRSA5IC8qIEVORF9CQl9FTlYgLSBTVEFSVF9CQl9FTlYgKi8KKwordm9pZCBpbml0QkJFbnYoc3BhdGlhbERlYyAqc2VsZiwgaW50IGluaXRTdGF0ZXNGbGFnKTsKK3ZvaWQgU3BhdGlhbERlY1Jlc2hhcGVCQkVudihzcGF0aWFsRGVjICpzZWxmLCBjb25zdCBTUEFUSUFMX0JTX0ZSQU1FICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYlNBQ2RlYy9zcmMvc2FjX3JvbS5jcHAgYi9saWJTQUNkZWMvc3JjL3NhY19yb20uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyODViNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY19yb20uY3BwCkBAIC0wLDAgKzEsNzA5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IFNBQyBEZWMgdGFibGVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJzYWNfcm9tLmgiCisjaW5jbHVkZSAic2FjX2NhbGNNMWFuZE0yLmgiCisKKyNkZWZpbmUgU0NBTEVfQ1BDKGEpIChGTDJGWENPTlNUX0NGRyhhIC8gKGZsb2F0KSgxIDw8IFNDQUxFX1BBUkFNX00xKSkpCitjb25zdCBGSVhQX0NGRyBkZXF1YW50Q1BDX19GREtbXSA9IHsKKyAgICBTQ0FMRV9DUEMoLTIuMGYpLCBTQ0FMRV9DUEMoLTEuOWYpLCBTQ0FMRV9DUEMoLTEuOGYpLCBTQ0FMRV9DUEMoLTEuN2YpLAorICAgIFNDQUxFX0NQQygtMS42ZiksIFNDQUxFX0NQQygtMS41ZiksIFNDQUxFX0NQQygtMS40ZiksIFNDQUxFX0NQQygtMS4zZiksCisgICAgU0NBTEVfQ1BDKC0xLjJmKSwgU0NBTEVfQ1BDKC0xLjFmKSwgU0NBTEVfQ1BDKC0xLjBmKSwgU0NBTEVfQ1BDKC0wLjlmKSwKKyAgICBTQ0FMRV9DUEMoLTAuOGYpLCBTQ0FMRV9DUEMoLTAuN2YpLCBTQ0FMRV9DUEMoLTAuNmYpLCBTQ0FMRV9DUEMoLTAuNWYpLAorICAgIFNDQUxFX0NQQygtMC40ZiksIFNDQUxFX0NQQygtMC4zZiksIFNDQUxFX0NQQygtMC4yZiksIFNDQUxFX0NQQygtMC4xZiksCisgICAgU0NBTEVfQ1BDKDAuMGYpLCAgU0NBTEVfQ1BDKDAuMWYpLCAgU0NBTEVfQ1BDKDAuMmYpLCAgU0NBTEVfQ1BDKDAuM2YpLAorICAgIFNDQUxFX0NQQygwLjRmKSwgIFNDQUxFX0NQQygwLjVmKSwgIFNDQUxFX0NQQygwLjZmKSwgIFNDQUxFX0NQQygwLjdmKSwKKyAgICBTQ0FMRV9DUEMoMC44ZiksICBTQ0FMRV9DUEMoMC45ZiksICBTQ0FMRV9DUEMoMS4wZiksICBTQ0FMRV9DUEMoMS4xZiksCisgICAgU0NBTEVfQ1BDKDEuMmYpLCAgU0NBTEVfQ1BDKDEuM2YpLCAgU0NBTEVfQ1BDKDEuNGYpLCAgU0NBTEVfQ1BDKDEuNWYpLAorICAgIFNDQUxFX0NQQygxLjZmKSwgIFNDQUxFX0NQQygxLjdmKSwgIFNDQUxFX0NQQygxLjhmKSwgIFNDQUxFX0NQQygxLjlmKSwKKyAgICBTQ0FMRV9DUEMoMi4wZiksICBTQ0FMRV9DUEMoMi4xZiksICBTQ0FMRV9DUEMoMi4yZiksICBTQ0FMRV9DUEMoMi4zZiksCisgICAgU0NBTEVfQ1BDKDIuNGYpLCAgU0NBTEVfQ1BDKDIuNWYpLCAgU0NBTEVfQ1BDKDIuNmYpLCAgU0NBTEVfQ1BDKDIuN2YpLAorICAgIFNDQUxFX0NQQygyLjhmKSwgIFNDQUxFX0NQQygyLjlmKSwgIFNDQUxFX0NQQygzLjBmKX07CisKKyNkZWZpbmUgU0NBTEVfSUNDKGEpIChGTDJGWENPTlNUX0NGRyhhKSkKK2NvbnN0IEZJWFBfQ0ZHIGRlcXVhbnRJQ0NfX0ZES1s4XSA9IHsKKyAgICAvKlNDQUxFX0lDQygxLjAwMDAwZikqLyBGWF9EQkwyRlhfQ0ZHKE1BWFZBTF9EQkwpLAorICAgIFNDQUxFX0lDQygwLjkzNzBmKSwKKyAgICBTQ0FMRV9JQ0MoMC44NDExOGYpLAorICAgIFNDQUxFX0lDQygwLjYwMDkyZiksCisgICAgU0NBTEVfSUNDKDAuMzY3NjRmKSwKKyAgICBTQ0FMRV9JQ0MoMC4wMDAwZiksCisgICAgU0NBTEVfSUNDKC0wLjU4OTAwZiksCisgICAgU0NBTEVfSUNDKC0wLjk5MDBmKX07CisKKyNkZWZpbmUgU0NBTEVfQ0xEMihhKSAoRkwyRlhDT05TVF9DRkcoYSAvIChmbG9hdCkoMSA8PCA4KSkpCitjb25zdCBGSVhQX0NGRyBkZXF1YW50Q0xEX19GREtbMzFdID0geworICAgIFNDQUxFX0NMRDIoLTE1MC4wZiksIFNDQUxFX0NMRDIoLTQ1LjBmKSwgU0NBTEVfQ0xEMigtNDAuMGYpLAorICAgIFNDQUxFX0NMRDIoLTM1LjBmKSwgIFNDQUxFX0NMRDIoLTMwLjBmKSwgU0NBTEVfQ0xEMigtMjUuMGYpLAorICAgIFNDQUxFX0NMRDIoLTIyLjBmKSwgIFNDQUxFX0NMRDIoLTE5LjBmKSwgU0NBTEVfQ0xEMigtMTYuMGYpLAorICAgIFNDQUxFX0NMRDIoLTEzLjBmKSwgIFNDQUxFX0NMRDIoLTEwLjBmKSwgU0NBTEVfQ0xEMigtOC4wZiksCisgICAgU0NBTEVfQ0xEMigtNi4wZiksICAgU0NBTEVfQ0xEMigtNC4wZiksICBTQ0FMRV9DTEQyKC0yLjBmKSwKKyAgICBTQ0FMRV9DTEQyKDAuMGYpLCAgICBTQ0FMRV9DTEQyKDIuMGYpLCAgIFNDQUxFX0NMRDIoNC4wZiksCisgICAgU0NBTEVfQ0xEMig2LjBmKSwgICAgU0NBTEVfQ0xEMig4LjBmKSwgICBTQ0FMRV9DTEQyKDEwLjBmKSwKKyAgICBTQ0FMRV9DTEQyKDEzLjBmKSwgICBTQ0FMRV9DTEQyKDE2LjBmKSwgIFNDQUxFX0NMRDIoMTkuMGYpLAorICAgIFNDQUxFX0NMRDIoMjIuMGYpLCAgIFNDQUxFX0NMRDIoMjUuMGYpLCAgU0NBTEVfQ0xEMigzMC4wZiksCisgICAgU0NBTEVfQ0xEMigzNS4wZiksICAgU0NBTEVfQ0xEMig0MC4wZiksICBTQ0FMRV9DTEQyKDQ1LjBmKSwKKyAgICBTQ0FMRV9DTEQyKDE1MC4wZil9OworCisjZGVmaW5lIFNDQUxFX0lQRChhKSAoRkwyRlhDT05TVF9DRkcoYSAvIChmbG9hdCkoMSA8PCBJUERfU0NBTEUpKSkKK2NvbnN0IEZJWFBfQ0ZHIGRlcXVhbnRJUERfX0ZES1sxNl0gPSB7CisgICAgLyogU0NBTEVfSVBEKDAuMDAwMDAwMDAwZiksIFNDQUxFX0lQRCgwLjM5MjY5OTA4MmYpLAorICAgICAgIFNDQUxFX0lQRCgwLjc4NTM5ODE2M2YpLCBTQ0FMRV9JUEQoMS4xNzgwOTcyNDVmKSwKKyAgICAgICBTQ0FMRV9JUEQoMS41NzA3OTYzMjdmKSwgU0NBTEVfSVBEKDEuOTYzNDk1NDA4ZiksCisgICAgICAgU0NBTEVfSVBEKDIuMzU2MTk0NDkwZiksIFNDQUxFX0lQRCgyLjc0ODg5MzU3MmYpLAorICAgICAgIFNDQUxFX0lQRCgzLjE0MTU5MjY1NGYpLCBTQ0FMRV9JUEQoMy41MzQyOTE3MzVmKSwKKyAgICAgICBTQ0FMRV9JUEQoMy45MjY5OTA4MTdmKSwgU0NBTEVfSVBEKDQuMzE5Njg5ODk5ZiksCisgICAgICAgU0NBTEVfSVBEKDQuNzEyMzg4OTgwZiksIFNDQUxFX0lQRCg1LjEwNTA4ODA2MmYpLAorICAgICAgIFNDQUxFX0lQRCg1LjQ5Nzc4NzE0NGYpLCBTQ0FMRV9JUEQoNS44OTA0ODYyMjVmKSAqLworICAgIFNDQUxFX0lQRCgwLjAwMDAwMDAwMDAwMDAwZiksIFNDQUxFX0lQRCgwLjM5MjY5OTA4MmYpLAorICAgIFNDQUxFX0lQRCgwLjc4NTM5ODE2MzM5NzQ1ZiksIFNDQUxFX0lQRCgxLjE3ODA5NzI0NWYpLAorICAgIFNDQUxFX0lQRCgxLjU3MDc5NjMyNjc5NDkwZiksIFNDQUxFX0lQRCgxLjk2MzQ5NTQwOGYpLAorICAgIFNDQUxFX0lQRCgyLjM1NjE5NDQ5MDE5MjM0ZiksIFNDQUxFX0lQRCgyLjc0ODg5MzU3MmYpLAorICAgIFNDQUxFX0lQRCgzLjE0MTU5MjY1MzU4OTc5ZiksIFNDQUxFX0lQRCgzLjUzNDI5MTczNWYpLAorICAgIFNDQUxFX0lQRCgzLjkyNjk5MDgxNjk4NzI0ZiksIFNDQUxFX0lQRCg0LjMxOTY4OTg5OWYpLAorICAgIFNDQUxFX0lQRCg0LjcxMjM4ODk4MDM4NDY5ZiksIFNDQUxFX0lQRCg1LjEwNTA4ODA2MmYpLAorICAgIFNDQUxFX0lQRCg1LjQ5Nzc4NzE0Mzc4MjE0ZiksIFNDQUxFX0lQRCg1Ljg5MDQ4NjIyNWYpfTsKKworI2RlZmluZSBTQ0FMRV9TUExJVF9BTkdMRShhKSAoRkwyRlhDT05TVF9DRkcoYSAvIChmbG9hdCkoMSA8PCBJUERfU0NBTEUpKSkKKy8qCisgIEdlbmVyYXRlIHRhYmxlIGRlcXVhbnRJUERfQ0xEX0lDQ19zcGxpdEFuZ2xlX19GREtbMTZdWzMxXVs4XToKKworICAjZGVmaW5lIEFCU19USFIgICAgICAgICAgICAgICAgICAgICAgICAgKCAxZS05ZiAqIDMyNzY4ICogMzI3NjggKQorCisgIGZsb2F0IGRlcXVhbnRJQ0NbXSA9CisgIHsxLjAwMDBmLDAuOTM3MGYsMC44NDExOGYsMC42MDA5MmYsMC4zNjc2NGYsMC4wZiwtMC41ODkwZiwtMC45OTAwZn07IGZsb2F0CisgIGRlcXVhbnRDTERbXSA9CisgIHstMTUwLjAsLTQ1LjAsLTQwLjAsLTM1LjAsLTMwLjAsLTI1LjAsLTIyLjAsLTE5LjAsLTE2LjAsLTEzLjAsLTEwLjAsIC04LjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC02LjAsIC00LjAsIC0yLjAsICAwLjAsICAyLjAsICA0LjAsICA2LjAsICA4LjAsCisgIDEwLjAsIDEzLjAsIDE2LjAsIDE5LjAsIDIyLjAsIDI1LjAsIDMwLjAsIDM1LjAsIDQwLjAsIDQ1LjAsIDE1MC4wIH07IGZsb2F0CisgIGRlcXVhbnRJUERbXSA9CisgIHswLmYsMC4zOTI2OTkwODJmLDAuNzg1Mzk4MTYzZiwxLjE3ODA5NzI0NWYsMS41NzA3OTYzMjdmLDEuOTYzNDk1NDA4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDIuMzU2MTk0NDlmLDIuNzQ4ODkzNTcyZiwzLjE0MTU5MjY1NGYsMy41MzQyOTE3MzVmLDMuOTI2OTkwODE3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDQuMzE5Njg5ODk5Ziw0LjcxMjM4ODk4Ziw1LjEwNTA4ODA2MmYsNS40OTc3ODcxNDRmLDUuODkwNDg2MjI1Zn07CisKKyAgZm9yIChpcGRJZHg9MDsgaXBkSWR4PDE2OyBpcGRJZHgrKykKKyAgICBmb3IgKGNsZElkeD0wOyBjbGRJZHg8MzE7IGNsZElkeCsrKQorICAgICAgZm9yIChpY2NJZHg9MDsgaWNjSWR4PDg7IGljY0lkeCsrKSB7CisgICAgICAgIGlwZCA9IGRlcXVhbnRJUERbaXBkSWR4XTsKKyAgICAgICAgY2xkID0gZGVxdWFudENMRFtjbGRJZHhdOworICAgICAgICBpY2MgPSBkZXF1YW50SUNDW2ljY0lkeF07CisgICAgICAgIGlpZExpbiA9IChmbG9hdCkgcG93KDEwLjBmLCBjbGQgLyAyMC4wZik7CisgICAgICAgIGlpZExpbjIgPSBpaWRMaW4gKiBpaWRMaW47CisgICAgICAgIGlpZExpbjIxID0gaWlkTGluMiArIDEuMGY7CisgICAgICAgIHNpbklwZCA9IChmbG9hdCkgc2luKGlwZCk7CisgICAgICAgIGNvc0lwZCA9IChmbG9hdCkgY29zKGlwZCk7CisgICAgICAgIHRlbXAxID0gMi4wZiAqIGljYyAqIGlpZExpbjsKKyAgICAgICAgdGVtcDFjID0gdGVtcDEgKiBjb3NJcGQ7CisgICAgICAgIHJhdGlvID0gKGlpZExpbjIxICsgdGVtcDFjKSAvIChpaWRMaW4yMSArIHRlbXAxKSArIEFCU19USFI7CisgICAgICAgIHcyID0gKGZsb2F0KSBwb3cocmF0aW8sIDAuMjVmKTsKKyAgICAgICAgdzEgPSAyLjBmIC0gdzI7CisgICAgICAgIGRlcXVhbnRJUERfQ0xEX0lDQ19zcGxpdEFuZ2xlX19GREtbaXBkSWR4XVtjbGRJZHhdW2ljY0lkeF0gPSAoZmxvYXQpCisgIGF0YW4yKHcyICogc2luSXBkLCB3MSAqIGlpZExpbiArIHcyICogY29zSXBkKTsKKyAgICAgIH0KKyovCisKKyNkZWZpbmUgU0NBTEVfQ0xEKGEpIChGTDJGWENPTlNUX0NGRyhhKSkKKworY29uc3QgRklYUF9DRkcgZGVxdWFudENMRF9jX2xbMzFdID0geworICAgIFNDQUxFX0NMRCgwLjAwMDAwMDAzMTZmKSwKKyAgICBTQ0FMRV9DTEQoMC4wMDU2MjMzMjQzZiksCisgICAgU0NBTEVfQ0xEKDAuMDA5OTk5NDk5N2YpLAorICAgIFNDQUxFX0NMRCgwLjAxNzc3OTk4MzZmKSwKKyAgICBTQ0FMRV9DTEQoMC4wMzE2MDY5NzU5ZiksCisgICAgU0NBTEVfQ0xEKDAuMDU2MTQ1NDI5NmYpLAorICAgIFNDQUxFX0NMRCgwLjA3OTE4MzQwNzFmKSwKKyAgICBTQ0FMRV9DTEQoMC4xMTE1MDIxNzgwZiksCisgICAgU0NBTEVfQ0xEKDAuMTU2NTM1NTA2MmYpLAorICAgIFNDQUxFX0NMRCgwLjIxODQ2NDQ2MzlmKSwKKyAgICBTQ0FMRV9DTEQoMC4zMDE1MTEzNDczZiksCisgICAgU0NBTEVfQ0xEKDAuMzY5ODc0MTQ5NmYpLAorICAgIFNDQUxFX0NMRCgwLjQ0ODA2MjQ3OTVmKSwKKyAgICBTQ0FMRV9DTEQoMC41MzM2MTcxMzg5ZiksCisgICAgU0NBTEVfQ0xEKDAuNjIxOTgzMjMwMWYpLAorICAgIFNDQUxFX0NMRCgwLjcwNzEwNjc2OTFmKSwKKyAgICBTQ0FMRV9DTEQoMC43ODMwMzA1Njk2ZiksCisgICAgU0NBTEVfQ0xEKDAuODQ1NzI2MTkyMGYpLAorICAgIFNDQUxFX0NMRCgwLjg5NDAwMjE5OTJmKSwKKyAgICBTQ0FMRV9DTEQoMC45MjkwODE4NTcyZiksCisgICAgU0NBTEVfQ0xEKDAuOTUzNDYyNjAwN2YpLAorICAgIFNDQUxFX0NMRCgwLjk3NTg0NDkxOTdmKSwKKyAgICBTQ0FMRV9DTEQoMC45ODc2NzIzMjg5ZiksCisgICAgU0NBTEVfQ0xEKDAuOTkzNzY0MTYyMWYpLAorICAgIFNDQUxFX0NMRCgwLjk5Njg2MDA4NjlmKSwKKyAgICBTQ0FMRV9DTEQoMC45OTg0MjI2MjI3ZiksCisgICAgU0NBTEVfQ0xEKDAuOTk5NTAwMzkzOWYpLAorICAgIFNDQUxFX0NMRCgwLjk5OTg0MTkyODVmKSwKKyAgICBTQ0FMRV9DTEQoMC45OTk5NDk5OTE3ZiksCisgICAgU0NBTEVfQ0xEKDAuOTk5OTg0MjA0OGYpLAorICAgIC8qU0NBTEVfQ0xEKDEuMDAwMDAwMDAwMGYpKi8gRlhfREJMMkZYX0NGRyhNQVhWQUxfREJMKX07CisKKyNkZWZpbmUgU0NfSChhKSAoRkwyRlhDT05TVF9DRkcoYSkpCisjZGVmaW5lIERBVEFfVFlQRV9IIEZJWFBfQ0ZHCisKKy8qIG5vdCBjb3JyZWxhdGVkICB0YWJsZXMgKi8KK2NvbnN0IERBVEFfVFlQRV9IIEgxMV9uY1szMV1bOF0gPSB7CisgICAge1NDX0goMC4wMDAwMDAwMzE2ZiksIFNDX0goMC4wMDAwMDAwMjk2ZiksIFNDX0goMC4wMDAwMDAwMjY2ZiksCisgICAgIFNDX0goMC4wMDAwMDAwMTkwZiksIFNDX0goMC4wMDAwMDAwMTE2ZiksIFNDX0goMC4wMDAwMDAwMDAwZiksCisgICAgIFNDX0goLTAuMDAwMDAwMDE4NmYpLCBTQ19IKC0wLjAwMDAwMDAzMTNmKX0sCisgICAge1NDX0goMC4wMDU2MjMzMjQzZiksIFNDX0goMC4wMDUyNzI4ODM1ZiksIFNDX0goMC4wMDQ3Mzk0MDk4ZiksCisgICAgIFNDX0goMC4wMDMzOTkyNjkyZiksIFNDX0goMC4wMDIwOTQ2MjIyZiksIFNDX0goMC4wMDAwMzE2MjE1ZiksCisgICAgIFNDX0goLTAuMDAzMjkxMzgyOWYpLCBTQ19IKC0wLjAwNTU2NjQ1NjRmKX0sCisgICAge1NDX0goMC4wMDk5OTk0OTk3ZiksIFNDX0goMC4wMDkzODE1NjQzZiksIFNDX0goMC4wMDg0NDAyNTQzZiksCisgICAgIFNDX0goMC4wMDYwNzIyMTI1ZiksIFNDX0goMC4wMDM3NjIyMTc5ZiksIFNDX0goMC4wMDAwOTk5ODk4ZiksCisgICAgIFNDX0goLTAuMDA1ODIzODIwOGYpLCBTQ19IKC0wLjAwOTg5NzQ4NDRmKX0sCisgICAge1NDX0goMC4wMTc3Nzk5ODM2ZiksIFNDX0goMC4wMTY2OTc0ODMxZiksIFNDX0goMC4wMTUwNDY1ODQ0ZiksCisgICAgIFNDX0goMC4wMTA4ODMxNDA0ZiksIFNDX0goMC4wMDY4MDczODIyZiksIFNDX0goMC4wMDAzMTYxMjY3ZiksCisgICAgIFNDX0goLTAuMDEwMjYyNjUxNGYpLCBTQ19IKC0wLjAxNzU5NTcyMTRmKX0sCisgICAge1NDX0goMC4wMzE2MDY5NzU5ZiksIFNDX0goMC4wMjk3MzI0ODQ0ZiksIFNDX0goMC4wMjY4NjgxMjczZiksCisgICAgIFNDX0goMC4wMTk2MTM4OTc0ZiksIFNDX0goMC4wMTI0NjkxOTY3ZiksIFNDX0goMC4wMDA5OTg5OTg4ZiksCisgICAgIFNDX0goLTAuMDE3OTQ1MjgwM2YpLCBTQ19IKC0wLjAzMTI3MDA0MjFmKX0sCisgICAge1NDX0goMC4wNTYxNDU0Mjk2ZiksIFNDX0goMC4wNTI5NjUwNDg3ZiksIFNDX0goMC4wNDgwODk2OTA1ZiksCisgICAgIFNDX0goMC4wMzU2NTY0NjM0ZiksIFNDX0goMC4wMjMyODYwMDczZiksIFNDX0goMC4wMDMxNTIzMDgxZiksCisgICAgIFNDX0goLTAuMDMwOTAyOTQwOGYpLCBTQ19IKC0wLjA1NTUxNTQ4MzBmKX0sCisgICAge1NDX0goMC4wNzkxODM0MDcxZiksIFNDX0goMC4wNzQ4ODQyNTgyZiksIFNDX0goMC4wNjgyNzYyMTE2ZiksCisgICAgIFNDX0goMC4wNTEzMjQxNjY0ZiksIFNDX0goMC4wMzQzMDgwMzQ5ZiksIFNDX0goMC4wMDYyNzAwMDcyZiksCisgICAgIFNDX0goLTAuMDQyMjM0MDM3MWYpLCBTQ19IKC0wLjA3ODI0OTkzODhmKX0sCisgICAge1NDX0goMC4xMTE1MDIxNzgwZiksIFNDX0goMC4xMDU3OTI0ODUyZiksIFNDX0goMC4wOTY5ODczMDcxZiksCisgICAgIFNDX0goMC4wNzQyMzA1MTQ1ZiksIFNDX0goMC4wNTExMjc3NjE2ZiksIFNDX0goMC4wMTI0MzI3Mjg5ZiksCisgICAgIFNDX0goLTAuMDU2NjU5NjYxMmYpLCBTQ19IKC0wLjExMDA4OTYyOTlmKX0sCisgICAge1NDX0goMC4xNTY1MzU1MDYyZiksIFNDX0goMC4xNDkxMzY2MTc4ZiksIFNDX0goMC4xMzc2ODI2MzE2ZiksCisgICAgIFNDX0goMC4xMDc4MTg2NDA4ZiksIFNDX0goMC4wNzcwNzk0MDA0ZiksIFNDX0goMC4wMjQ1MDMzNTU4ZiksCisgICAgIFNDX0goLTAuMDczNTk4MDQyMWYpLCBTQ19IKC0wLjE1NDMzMDMxMzJmKX0sCisgICAge1NDX0goMC4yMTg0NjQ0NjM5ZiksIFNDX0goMC4yMDkxOTc5NjgyZiksIFNDX0goMC4xOTQ3OTQ4MTg4ZiksCisgICAgIFNDX0goMC4xNTY4ODIyMjY1ZiksIFNDX0goMC4xMTcyNDc4OTQ0ZiksIFNDX0goMC4wNDc3MjY3MTMxZiksCisgICAgIFNDX0goLTAuMDg5OTUwNzI1NGYpLCBTQ19IKC0wLjIxNDg1MjY0NjBmKX0sCisgICAge1NDX0goMC4zMDE1MTEzNDczZiksIFNDX0goMC4yOTA0MzkxMjg5ZiksIFNDX0goMC4yNzMxNjczNDE5ZiksCisgICAgIFNDX0goMC4yMjczMDI0MDIzZiksIFNDX0goMC4xNzg2MjM5MTQ3ZiksIFNDX0goMC4wOTA5MDkwNzg3ZiksCisgICAgIFNDX0goLTAuMDk2NDI1NTMzM2YpLCBTQ19IKC0wLjI5NTExMjQ5MDdmKX0sCisgICAge1NDX0goMC4zNjk4NzQxNDk2ZiksIFNDX0goMC4zNTc4Mjg0MDg1ZiksIFNDX0goMC4zMzkwMDY2OTIyZiksCisgICAgIFNDX0goMC4yODg4MTA4NDkyZiksIFNDX0goMC4yMzUxMTE3NDMyZiksIFNDX0goMC4xMzY4MDY4NzU1ZiksCisgICAgIFNDX0goLTAuMDg1MDI5NjA5NWYpLCBTQ19IKC0wLjM1OTc5NjYxMzVmKX0sCisgICAge1NDX0goMC40NDgwNjI0Nzk1ZiksIFNDX0goMC40MzU0MDI1NDI0ZiksIFNDX0goMC40MTU2MDc3NTA0ZiksCisgICAgIFNDX0goMC4zNjI3MTIwMjU2ZiksIFNDX0goMC4zMDU4ODIzOTQzZiksIFNDX0goMC4yMDA3NTk5NzcxZiksCisgICAgIFNDX0goLTAuMDQ4NDAyMDkzNGYpLCBTQ19IKC0wLjQzMDQ5NDA3MDFmKX0sCisgICAge1NDX0goMC41MzM2MTcxMzg5ZiksIFNDX0goMC41MjA4NDcxNDE3ZiksIFNDX0goMC41MDA4OTM1OTI4ZiksCisgICAgIFNDX0goMC40NDc2NDIwNTgxZiksIFNDX0goMC4zOTA1MDQ0NDk2ZiksIFNDX0goMC4yODQ3NDcyNDI5ZiksCisgICAgIFNDX0goMC4wMjc2Njc2MDA3ZiksIFNDX0goLTAuNDk2NjU3OTA4MGYpfSwKKyAgICB7U0NfSCgwLjYyMTk4MzIzMDFmKSwgU0NfSCgwLjYwOTY5NjM4ODJmKSwgU0NfSCgwLjU5MDU0MTU0MTZmKSwKKyAgICAgU0NfSCgwLjUzOTY5NTAyNDVmKSwgU0NfSCgwLjQ4NTYwNzA1NzhmKSwgU0NfSCgwLjM4Njg2MzExMjRmKSwKKyAgICAgU0NfSCgwLjE1MzE2NTI5NTdmKSwgU0NfSCgtMC41MDQ1MzYxNTE5Zil9LAorICAgIHtTQ19IKDAuNzA3MTA2NzY5MWYpLCBTQ19IKDAuNjk1ODgwNzExMWYpLCBTQ19IKDAuNjc4NDUwNDA1NmYpLAorICAgICBTQ19IKDAuNjMyNjM3MzIxOWYpLCBTQ19IKDAuNTg0NzMwNjg0OGYpLCBTQ19IKDAuNDk5OTk5OTcwMmYpLAorICAgICBTQ19IKDAuMzIwNTQ2NDQ4MmYpLCBTQ19IKDAuMDUwMDAwMDA0NWYpfSwKKyAgICB7U0NfSCgwLjc4MzAzMDU2OTZmKSwgU0NfSCgwLjc3MzMwNjc4NzBmKSwgU0NfSCgwLjc1ODI5NjEzMjFmKSwKKyAgICAgU0NfSCgwLjcxOTQwNTU5MTVmKSwgU0NfSCgwLjY3OTc3MDUyOTNmKSwgU0NfSCgwLjYxMzEzNjg4NzZmKSwKKyAgICAgU0NfSCgwLjQ5OTczMzI2OTJmKSwgU0NfSCgwLjY5MzQxOTM5NjlmKX0sCisgICAge1NDX0goMC44NDU3MjYxOTIwZiksIFNDX0goMC44Mzc3Mjc0ODcxZiksIFNDX0goMC44MjU0Njk0OTM5ZiksCisgICAgIFNDX0goMC43OTQyODUxNzgyZiksIFNDX0goMC43NjM1NDM5MDM4ZiksIFNDX0goMC43MTUyNTI3NTcxZiksCisgICAgIFNDX0goMC42NTY3MTIyOTM2ZiksIFNDX0goMC44MjI5MDYxOTYxZil9LAorICAgIHtTQ19IKDAuODk0MDAyMTk5MmYpLCBTQ19IKDAuODg3NzI0ODE2OGYpLCBTQ19IKDAuODc4MTg1NTEwNmYpLAorICAgICBTQ19IKDAuODU0NDIzNzYxNGYpLCBTQ19IKDAuODMxODkxODM0N2YpLCBTQ19IKDAuNzk5MjM5OTMzNWYpLAorICAgICBTQ19IKDAuNzc1MTI3NTMwMWYpLCBTQ19IKDAuODg1MzI3Njk2OGYpfSwKKyAgICB7U0NfSCgwLjkyOTA4MTg1NzJmKSwgU0NfSCgwLjkyNDM1MjQwNzVmKSwgU0NfSCgwLjkxNzIzMDQ4NjlmKSwKKyAgICAgU0NfSCgwLjg5OTg4Nzc0MDZmKSwgU0NfSCgwLjg4NDExNzQ4NDFmKSwgU0NfSCgwLjg2MzE5MzA5NDdmKSwKKyAgICAgU0NfSCgwLjg1NjUxMzk3NzFmKSwgU0NfSCgwLjkyNTExNjEyMThmKX0sCisgICAge1NDX0goMC45NTM0NjI2MDA3ZiksIFNDX0goMC45NTAwMTkzMDAwZiksIFNDX0goMC45NDQ4ODIxNTQ1ZiksCisgICAgIFNDX0goMC45MzI2NTY1MjY2ZiksIFNDX0goMC45MjIwMDIzNzUxZiksIFNDX0goMC45MDkwOTA5MzYyZiksCisgICAgIFNDX0goMC45MDk2NTkxNDczZiksIFNDX0goMC45NTE0NTg0NTQxZil9LAorICAgIHtTQ19IKDAuOTc1ODQ0OTE5N2YpLCBTQ19IKDAuOTczODEyMjgyMWYpLCBTQ19IKDAuOTcwODIwMDY5M2YpLAorICAgICBTQ19IKDAuOTYzOTI4NzU5MWYpLCBTQ19IKDAuOTU4Mjc2MzkxMGYpLCBTQ19IKDAuOTUyMjczMzA5MmYpLAorICAgICBTQ19IKDAuOTU1MzIwNzE1OWYpLCBTQ19IKDAuOTc1MDQyNzAwOGYpfSwKKyAgICB7U0NfSCgwLjk4NzY3MjMyODlmKSwgU0NfSCgwLjk4NjUyNjcyNzdmKSwgU0NfSCgwLjk4NDg2MDMwMTBmKSwKKyAgICAgU0NfSCgwLjk4MTEzMTAxNzJmKSwgU0NfSCgwLjk3ODIzMDI5NzZmKSwgU0NfSCgwLjk3NTQ5NjY0OTdmKSwKKyAgICAgU0NfSCgwLjk3Nzk2MjEzNjNmKSwgU0NfSCgwLjk4NzMyNTI1MTFmKX0sCisgICAge1NDX0goMC45OTM3NjQxNjIxZiksIFNDX0goMC45OTMxMzk3NDM4ZiksIFNDX0goMC45OTIyNDA0Mjg5ZiksCisgICAgIFNDX0goMC45OTAyNzUwMjU0ZiksIFNDX0goMC45ODg4MTE2NzE3ZiksIFNDX0goMC45ODc1NjcyNDYwZiksCisgICAgIFNDX0goMC45ODkxMTMxNTIwZiksIFNDX0goMC45OTM2MDY2ODY2Zil9LAorICAgIHtTQ19IKDAuOTk2ODYwMDg2OWYpLCBTQ19IKDAuOTk2NTI3NzkxMGYpLCBTQ19IKDAuOTk2MDUzMDQwMGYpLAorICAgICBTQ19IKDAuOTk1MDM0NzU0M2YpLCBTQ19IKDAuOTk0MzAyMjcyOGYpLCBTQ19IKDAuOTkzNzMwMDA4NmYpLAorICAgICBTQ19IKDAuOTk0NjA3MzI5NGYpLCBTQ19IKDAuOTk2Nzg2MzU2MGYpfSwKKyAgICB7U0NfSCgwLjk5ODQyMjYyMjdmKSwgU0NfSCgwLjk5ODI0ODgxNTVmKSwgU0NfSCgwLjk5ODAwMjA1MjNmKSwKKyAgICAgU0NfSCgwLjk5NzQ4MDIxMzZmKSwgU0NfSCgwLjk5NzExNDY1ODRmKSwgU0NfSCgwLjk5Njg0NzY4OTJmKSwKKyAgICAgU0NfSCgwLjk5NzMyMTYwNTdmKSwgU0NfSCgwLjk5ODM4NzM5NjNmKX0sCisgICAge1NDX0goMC45OTk1MDAzOTM5ZiksIFNDX0goMC45OTk0NDI4NzU0ZiksIFNDX0goMC45OTkzNjE3NTM1ZiksCisgICAgIFNDX0goMC45OTkxOTMwNzIzZiksIFNDX0goMC45OTkwNzgzMzM0ZiksIFNDX0goMC45OTkwMDEwMjYyZiksCisgICAgIFNDX0goMC45OTkxNjE2NjA3ZiksIFNDX0goMC45OTk0ODk3ODQyZil9LAorICAgIHtTQ19IKDAuOTk5ODQxOTI4NWYpLCBTQ19IKDAuOTk5ODIzMjcyMmYpLCBTQ19IKDAuOTk5Nzk3MDQ2MmYpLAorICAgICBTQ19IKDAuOTk5NzQzMDQ0NGYpLCBTQ19IKDAuOTk5NzA2OTgzNmYpLCBTQ19IKDAuOTk5NjgzODU3MGYpLAorICAgICBTQ19IKDAuOTk5NzM2NDg3OWYpLCBTQ19IKDAuOTk5ODM4NjUwMmYpfSwKKyAgICB7U0NfSCgwLjk5OTk0OTk5MTdmKSwgU0NfSCgwLjk5OTk0NDAzMTJmKSwgU0NfSCgwLjk5OTkzNTYyNzBmKSwKKyAgICAgU0NfSCgwLjk5OTkxODQwMTJmKSwgU0NfSCgwLjk5OTkwNzA3NjRmKSwgU0NfSCgwLjk5OTg5OTk4MzRmKSwKKyAgICAgU0NfSCgwLjk5OTkxNjk3MDdmKSwgU0NfSCgwLjk5OTk0ODk3ODRmKX0sCisgICAge1NDX0goMC45OTk5ODQyMDQ4ZiksIFNDX0goMC45OTk5ODIyOTc0ZiksIFNDX0goMC45OTk5Nzk2MTUyZiksCisgICAgIFNDX0goMC45OTk5NzQxOTEyZiksIFNDX0goMC45OTk5NzA2MTQ5ZiksIFNDX0goMC45OTk5Njg0MDk1ZiksCisgICAgIFNDX0goMC45OTk5NzM4MzM2ZiksIFNDX0goMC45OTk5ODM5MDY3Zil9LAorICAgIC8qIHsgU0NfSCggMS4wMDAwMDAwMDAwZiksIFNDX0goIDEuMDAwMDAwMDAwMGYpLCBTQ19IKCAxLjAwMDAwMDAwMDBmKSwKKyAgICAgICBTQ19IKCAxLjAwMDAwMDAwMDBmKSwgU0NfSCggMS4wMDAwMDAwMDAwZiksIFNDX0goIDEuMDAwMDAwMDAwMGYpLAorICAgICAgIFNDX0goIDEuMDAwMDAwMDAwMGYpLCBTQ19IKCAxLjAwMDAwMDAwMDBmKX0gKi8KKyAgICB7RlhfREJMMkZYX0NGRyhNQVhWQUxfREJMKSwgRlhfREJMMkZYX0NGRyhNQVhWQUxfREJMKSwKKyAgICAgRlhfREJMMkZYX0NGRyhNQVhWQUxfREJMKSwgRlhfREJMMkZYX0NGRyhNQVhWQUxfREJMKSwKKyAgICAgRlhfREJMMkZYX0NGRyhNQVhWQUxfREJMKSwgRlhfREJMMkZYX0NGRyhNQVhWQUxfREJMKSwKKyAgICAgRlhfREJMMkZYX0NGRyhNQVhWQUxfREJMKSwgRlhfREJMMkZYX0NGRyhNQVhWQUxfREJMKX19OworY29uc3QgREFUQV9UWVBFX0ggSDEyX25jWzMxXVs4XSA9IHsKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjAwMDAwMDAxMTBmKSwgU0NfSCgwLjAwMDAwMDAxNzFmKSwKKyAgICAgU0NfSCgwLjAwMDAwMDAyNTNmKSwgU0NfSCgwLjAwMDAwMDAyOTRmKSwgU0NfSCgwLjAwMDAwMDAzMTZmKSwKKyAgICAgU0NfSCgwLjAwMDAwMDAyNTZmKSwgU0NfSCgwLjAwMDAwMDAwNDVmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4wMDE5NTQwOTI0ZiksIFNDX0goMC4wMDMwMjY1MTEzZiksCisgICAgIFNDX0goMC4wMDQ0Nzk1OTIyZiksIFNDX0goMC4wMDUyMTg2NTI1ZiksIFNDX0goMC4wMDU2MjMyMzU0ZiksCisgICAgIFNDX0goMC4wMDQ1NTk0NDg5ZiksIFNDX0goMC4wMDA3OTc3MDg1Zil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMDAzNDYwNjcyMGYpLCBTQ19IKDAuMDA1MzYyMDk4NmYpLAorICAgICBTQ19IKDAuMDA3OTQ0Njk4NGYpLCBTQ19IKDAuMDA5MjY0NzU2MGYpLCBTQ19IKDAuMDA5OTk4OTk5NWYpLAorICAgICBTQ19IKDAuMDA4MTI4NTM2OWYpLCBTQ19IKDAuMDAxNDI0NzA2NGYpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjAwNjEwOTE2MThmKSwgU0NfSCgwLjAwOTQ3MjQ5MjJmKSwKKyAgICAgU0NfSCgwLjAxNDA2MDA1MjFmKSwgU0NfSCgwLjAxNjQyNTIwNTRmKSwgU0NfSCgwLjAxNzc3NzE3MjhmKSwKKyAgICAgU0NfSCgwLjAxNDUxOTE1MzJmKSwgU0NfSCgwLjAwMjU1MzExNDBmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4wMTA3MjI4ODU4ZiksIFNDX0goMC4wMTY2NDY0NjE2ZiksCisgICAgIFNDX0goMC4wMjQ3ODQ5OTM0ZiksIFNDX0goMC4wMjkwNDM0MTc0ZiksIFNDX0goMC4wMzE1OTExODQ0ZiksCisgICAgIFNDX0goMC4wMjYwMTg2MDY1ZiksIFNDX0goMC4wMDQ2MDI3NjE1Zil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMDE4NjI4Mjg2MmYpLCBTQ19IKDAuMDI4OTc3NDIyMGYpLAorICAgICBTQ19IKDAuMDQzMzY5NjM5N2YpLCBTQ19IKDAuMDUxMDg4ODU0N2YpLCBTQ19IKDAuMDU2MDU2ODY0NmYpLAorICAgICBTQ19IKDAuMDQ2ODc1NTU1MWYpLCBTQ19IKDAuMDA4Mzg2OTI2N2YpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjAyNTczNjM1NDNmKSwgU0NfSCgwLjA0MDEwNDQ5NzJmKSwKKyAgICAgU0NfSCgwLjA2MDI5Nzk0MzdmKSwgU0NfSCgwLjA3MTM2NTA1MTBmKSwgU0NfSCgwLjA3ODkzNDc3MzhmKSwKKyAgICAgU0NfSCgwLjA2Njk3OTgzMjlmKSwgU0NfSCgwLjAxMjEyMjY3NjdmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4wMzUyMjMzNzIzZiksIFNDX0goMC4wNTUwMTA4OTI1ZiksCisgICAgIFNDX0goMC4wODMyMDE5NTk3ZiksIFNDX0goMC4wOTkwODkyOTQ3ZiksIFNDX0goMC4xMTA4MDY4NzQ5ZiksCisgICAgIFNDX0goMC4wOTYwMzM0MjQxZiksIFNDX0goMC4wMTc2OTIwNTkzZil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMDQ3NTU2NjUzNmYpLCBTQ19IKDAuMDc0NDc3MjI1NWYpLAorICAgICBTQ19IKDAuMTEzNDgzNTAzNWYpLCBTQ19IKDAuMTM2MjQyOTExMmYpLCBTQ19IKDAuMTU0NjA1NzkxMGYpLAorICAgICBTQ19IKDAuMTM4MTU0NTk2MWYpLCBTQ19IKDAuMDI2MTgyNDM5MmYpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjA2Mjk1MTgxODFmKSwgU0NfSCgwLjA5ODkwMjQ4NjNmKSwKKyAgICAgU0NfSCgwLjE1MjAzNTE2MTlmKSwgU0NfSCgwLjE4NDMzNTcwODZmKSwgU0NfSCgwLjIxMzE4NzQ0MTJmKSwKKyAgICAgU0NfSCgwLjE5OTA4Njg4OTZmKSwgU0NfSCgwLjAzOTU2MDg5OTFmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4wODA5NTgwOTA3ZiksIFNDX0goMC4xMjc2MjcxNDkyZiksCisgICAgIFNDX0goMC4xOTgwOTc3MzU2ZiksIFNDX0goMC4yNDI5MDQ0ODQzZiksIFNDX0goMC4yODc0Nzk3ODgxZiksCisgICAgIFNDX0goMC4yODU2NzY3NDc2ZiksIFNDX0goMC4wNjE3ODc1NjQzZil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMDkzNjI1NDMzN2YpLCBTQ19IKDAuMTQ3OTIzNDM5N2YpLAorICAgICBTQ19IKDAuMjMxMDczOTYwN2YpLCBTQ19IKDAuMjg1NTMzNDU4MGYpLCBTQ19IKDAuMzQzNjQzMzY3M2YpLAorICAgICBTQ19IKDAuMzU5OTY3ODU3NmYpLCBTQ19IKDAuMDg1NzUxMjcyN2YpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjEwNTc1NzM3ODBmKSwgU0NfSCgwLjE2NzQyMjE3NTRmKSwKKyAgICAgU0NfSCgwLjI2MzA1ODg0MTJmKSwgU0NfSCgwLjMyNzQwNzkyNjNmKSwgU0NfSCgwLjQwMDU2ODg3MjdmKSwKKyAgICAgU0NfSCgwLjQ0NTQ0MDQ3MTJmKSwgU0NfSCgwLjEyNDIzNzA1MzFmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4xMTYwNDA5MzAyZiksIFNDX0goMC4xODM5OTE1MDY3ZiksCisgICAgIFNDX0goMC4yOTA0NTQ1NjY1ZiksIFNDX0goMC4zNjM2NjY3NzI4ZiksIFNDX0goMC40NTEyOTM5NzUxZiksCisgICAgIFNDX0goMC41MzI4OTkzNzk3ZiksIFNDX0goMC4xOTUxMzYyNjQwZil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMTIzMDE4MjA1MmYpLCBTQ19IKDAuMTk1MjUzMjk3N2YpLAorICAgICBTQ19IKDAuMzA5MTgwMjU5N2YpLCBTQ19IKDAuMzg4NjUwMTQ5MWYpLCBTQ19IKDAuNDg3MDMxODc3MGYpLAorICAgICBTQ19IKDAuNjAyODI5NTc1NWYpLCBTQ19IKDAuMzYzNzM5NTIwM2YpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjEyNTQ5OTAyNTBmKSwgU0NfSCgwLjE5OTI2MTExNDBmKSwKKyAgICAgU0NfSCgwLjMxNTg2Mzg3NzVmKSwgU0NfSCgwLjM5NzYwNTMyOThmKSwgU0NfSCgwLjUwMDAwMDAwMDBmKSwKKyAgICAgU0NfSCgwLjYzMDI3NzY5MzNmKSwgU0NfSCgwLjcwNTMzNjgwOTJmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4xMjMwMTgyMDUyZiksIFNDX0goMC4xOTUyNTMzMTI2ZiksCisgICAgIFNDX0goMC4zMDkxODAyNTk3ZiksIFNDX0goMC4zODg2NTAxNDkxZiksIFNDX0goMC40ODcwMzE5MDY4ZiksCisgICAgIFNDX0goMC42MDI4Mjk1NzU1ZiksIFNDX0goMC4zNjM3Mzk0OTA1Zil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMTE2MDQwOTMwMmYpLCBTQ19IKDAuMTgzOTkxNTIxNmYpLAorICAgICBTQ19IKDAuMjkwNDU0NTY2NWYpLCBTQ19IKDAuMzYzNjY2ODAyNmYpLCBTQ19IKDAuNDUxMjkzOTc1MWYpLAorICAgICBTQ19IKDAuNTMyODk5Mzc5N2YpLCBTQ19IKDAuMTk1MTM2MjA0NGYpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjEwNTc1NzM4NTVmKSwgU0NfSCgwLjE2NzQyMjE3NTRmKSwKKyAgICAgU0NfSCgwLjI2MzA1ODg3MTBmKSwgU0NfSCgwLjMyNzQwNzkyNjNmKSwgU0NfSCgwLjQwMDU2ODg3MjdmKSwKKyAgICAgU0NfSCgwLjQ0NTQ0MDUwMTBmKSwgU0NfSCgwLjEyNDIzNzAzODJmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4wOTM2MjU0MzM3ZiksIFNDX0goMC4xNDc5MjM0Mzk3ZiksCisgICAgIFNDX0goMC4yMzEwNzM5NjA3ZiksIFNDX0goMC4yODU1MzM0NTgwZiksIFNDX0goMC4zNDM2NDMzNjczZiksCisgICAgIFNDX0goMC4zNTk5Njc4NTc2ZiksIFNDX0goMC4wODU3NTEyNjUzZil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMDgwOTU4MDkwN2YpLCBTQ19IKDAuMTI3NjI3MTQ5MmYpLAorICAgICBTQ19IKDAuMTk4MDk3NzIwN2YpLCBTQ19IKDAuMjQyOTA0NDg0M2YpLCBTQ19IKDAuMjg3NDc5Nzg4MWYpLAorICAgICBTQ19IKDAuMjg1Njc2NzQ3NmYpLCBTQ19IKDAuMDYxNzg3NTYwNmYpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjA2Mjk1MTgxMDdmKSwgU0NfSCgwLjA5ODkwMjQ4NjNmKSwKKyAgICAgU0NfSCgwLjE1MjAzNTE2MTlmKSwgU0NfSCgwLjE4NDMzNTcyMzVmKSwgU0NfSCgwLjIxMzE4NzQ0MTJmKSwKKyAgICAgU0NfSCgwLjE5OTA4Njg4OTZmKSwgU0NfSCgwLjAzOTU2MDk0MDFmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4wNDc1NTY2NDYyZiksIFNDX0goMC4wNzQ0NzcyMjU1ZiksCisgICAgIFNDX0goMC4xMTM0ODM1MTg0ZiksIFNDX0goMC4xMzYyNDI5MTEyZiksIFNDX0goMC4xNTQ2MDU3NzYxZiksCisgICAgIFNDX0goMC4xMzgxNTQ1OTYxZiksIFNDX0goMC4wMjYxODI0ODAyZil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMDM1MjIzMzc5N2YpLCBTQ19IKDAuMDU1MDEwODk2MmYpLAorICAgICBTQ19IKDAuMDgzMjAxOTQ0OGYpLCBTQ19IKDAuMDk5MDg5Mjc5OGYpLCBTQ19IKDAuMTEwODA2ODUyNmYpLAorICAgICBTQ19IKDAuMDk2MDMzNDQ2NWYpLCBTQ19IKDAuMDE3NjkyMDY4NmYpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjAyNTczNjM1MjRmKSwgU0NfSCgwLjA0MDEwNDQ5MzVmKSwKKyAgICAgU0NfSCgwLjA2MDI5Nzk0NzRmKSwgU0NfSCgwLjA3MTM2NTA4MDhmKSwgU0NfSCgwLjA3ODkzNDc1ODlmKSwKKyAgICAgU0NfSCgwLjA2Njk3OTc5NTdmKSwgU0NfSCgwLjAxMjEyMjY1MTZmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4wMTg2MjgyODgxZiksIFNDX0goMC4wMjg5Nzc0MjU4ZiksCisgICAgIFNDX0goMC4wNDMzNjk2MjQ4ZiksIFNDX0goMC4wNTEwODg4NTQ3ZiksIFNDX0goMC4wNTYwNTY4OTA2ZiksCisgICAgIFNDX0goMC4wNDY4NzU1ODg2ZiksIFNDX0goMC4wMDgzODY5NzE0Zil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMDEwNzIyODgzMGYpLCBTQ19IKDAuMDE2NjQ2NDcyN2YpLAorICAgICBTQ19IKDAuMDI0Nzg0OTgyMmYpLCBTQ19IKDAuMDI5MDQzNDI0OWYpLCBTQ19IKDAuMDMxNTkxMTYyMWYpLAorICAgICBTQ19IKDAuMDI2MDE4NjQ3NWYpLCBTQ19IKDAuMDA0NjAyNzM3N2YpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjAwNjEwOTE1NzZmKSwgU0NfSCgwLjAwOTQ3MjQ4OTRmKSwKKyAgICAgU0NfSCgwLjAxNDA2MDA0NjVmKSwgU0NfSCgwLjAxNjQyNTE5NDJmKSwgU0NfSCgwLjAxNzc3NzE1MjRmKSwKKyAgICAgU0NfSCgwLjAxNDUxOTE1MDRmKSwgU0NfSCgwLjAwMjU1MzA1NjdmKX0sCisgICAge1NDX0goMC4wMDAwMDAwMDAwZiksIFNDX0goMC4wMDM0NjA2NzQzZiksIFNDX0goMC4wMDUzNjIwOTc2ZiksCisgICAgIFNDX0goMC4wMDc5NDQ2OTk0ZiksIFNDX0goMC4wMDkyNjQ3NjcyZiksIFNDX0goMC4wMDk5OTkwMjU2ZiksCisgICAgIFNDX0goMC4wMDgxMjg1MDQzZiksIFNDX0goMC4wMDE0MjQ3MTc3Zil9LAorICAgIHtTQ19IKDAuMDAwMDAwMDAwMGYpLCBTQ19IKDAuMDAxOTU0MDkxMmYpLCBTQ19IKDAuMDAzMDI2NTIyNWYpLAorICAgICBTQ19IKDAuMDA0NDc5NTkwOGYpLCBTQ19IKDAuMDA1MjE4NjM4MWYpLCBTQ19IKDAuMDA1NjIzMjIyM2YpLAorICAgICBTQ19IKDAuMDA0NTU5NDI4OWYpLCBTQ19IKDAuMDAwNzk3NzM1OWYpfSwKKyAgICB7U0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjAwMDAwMDAxNDlmKSwgU0NfSCgwLjAwMDAwMDAyOThmKSwKKyAgICAgU0NfSCgwLjAwMDAwMDAyOThmKSwgU0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjAwMDAwMDA1OTZmKSwKKyAgICAgU0NfSCgwLjAwMDAwMDAwMDBmKSwgU0NfSCgwLjAwMDAwMDAwMDBmKX19OworCisvKgorICBmb3IgKGk9MDsgaTwzMTsgaSsrKSB7CisgICAgY2xkID0gZGVxdWFudENMRFtpXTsKKyAgICB2YWwgPSAoZmxvYXQpKEZES2V4cChjbGQvZGJlKS8oMStGREtleHAoY2xkL2RiZSkpKTsKKyAgICB2YWwgPSAoZmxvYXQpKGRiZSpGREtsb2codmFsKSk7CisgIH0KKyovCisjZGVmaW5lIFNDQUxFX0NMRF9DMUMyKGEpIChGTDJGWENPTlNUX0RCTChhIC8gKGZsb2F0KSgxIDw8IFNGX0NMRF9DMUMyKSkpCitjb25zdCBGSVhQX0RCTCBkZXF1YW50Q0xEX2MxWzMxXSA9IHtTQ0FMRV9DTERfQzFDMigtMS41MDAwMDAwMDAwMDAwMDAwZSswMDJmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC00LjUwMDAxMzczMjkxMDE1NjNlKzAwMWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoLTQuMDAwMDQzNDg3NTQ4ODI4MWUrMDAxZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigtMy41MDAxMzczMjkxMDE1NjI1ZSswMDFmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC0zLjAwMDQzNDExMjU0ODgyODFlKzAwMWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoLTIuNTAxMzcxMTkyOTMyMTI4OWUrMDAxZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigtMi4yMDI3MzE1MTM5NzcwNTA4ZSswMDFmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC0xLjkwNTQzMzI3MzMxNTQyOTdlKzAwMWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoLTEuNjEwNzc0MjMwOTU3MDMxM2UrMDAxZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigtMS4zMjEyMzg0MjIzOTM3OTg4ZSswMDFmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC0xLjA0MTM5MjcwNzgyNDcwNzBlKzAwMWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoLTguNjM4OTIwNzgzOTk2NTgyMGUrMDAwZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigtNi45NzMyMjc5Nzc3NTI2ODU1ZSswMDBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC01LjQ1NTQwNDI4MTYxNjIxMDllKzAwMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoLTQuMTI0NDI1ODg4MDYxNTIzNGUrMDAwZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigtMy4wMTAyOTk5MjEwMzU3NjY2ZSswMDBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC0yLjEyNDQyNTg4ODA2MTUyMzRlKzAwMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoLTEuNDU1NDA0NTIwMDM0NzkwMGUrMDAwZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigtOS43MzIyNzg1ODU0MzM5NjAwZS0wMDFmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC02LjM4OTIwMzY2NzY0MDY4NjBlLTAwMWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoLTQuMTM5MjY2OTA4MTY4NzkyN2UtMDAxZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigtMi4xMjM4Mzg2NjMxMDExOTYzZS0wMDFmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC0xLjA3NzQyMTc1NDU5ODYxNzZlLTAwMWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoLTUuNDMzMzIyMTE2NzMyNTk3NGUtMDAyZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigtMi43MzE1OTUwMDIxMTQ3NzI4ZS0wMDJmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC0xLjM3MTE5MzQ5MDkyMjQ1MTBlLTAwMmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoLTQuMzQwNjU2NTY3MzY0OTMxMWUtMDAzZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigtMS4zNzMyMDg4MjY0MDc3OTAyZS0wMDNmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0NMRF9DMUMyKC00LjM0Mzg4MjYxMDU1NTczODJlLTAwNGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVfQ0xEX0MxQzIoLTEuMzc0NTY2NjM2NTEzOTE4NmUtMDA0ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9DTERfQzFDMigwLjAwMDAwMDAwMDAwMDAwMDBlKzAwMGYpfTsKKworLyogc2FjX3N0cCAqLworLyogbm9uZSBzY2FsZWQgKi8KK2NvbnN0IEZJWFBfQ0ZHIEJQX19GREtbXSA9IHtGTDJGWENPTlNUX0NGRygwLjczOTE5OTk5NTk5NDU3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0NGRygwLjk3OTA5OTk4ODkzNzM4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0NGRygwLjk5OTMwMDAwMzA1MTc2KX07CisKKy8qIHNjYWxlZCB3aXRoIDI2IGJpdHMgKi8KK2NvbnN0IEZJWFBfQ0ZHIEJQX0dGX19GREtbXSA9IHsKKyAgICBGTDJGWENPTlNUX0NGRygwLjAwMDAwMDAwNjQzMzMwKSwgRkwyRlhDT05TVF9DRkcoMC4wMDAwNDM5Njg1MDIzMiksCisgICAgRkwyRlhDT05TVF9DRkcoMC4wMDA4NzQ1Njk0ODU1MiksIEZMMkZYQ09OU1RfQ0ZHKDAuMDA0NzQ2NDgyMjAyNDMpLAorICAgIEZMMkZYQ09OU1RfQ0ZHKDAuMDE3MTc5ODcyNDQ4MDApLCBGTDJGWENPTlNUX0NGRygwLjA0OTA2NzQyNDkxMDczKSwKKyAgICBGTDJGWENPTlNUX0NGRygwLjEwNTY5NTE4NjU2NzI5KSwgRkwyRlhDT05TVF9DRkcoMC4yMTE2NTc2NzU5MjY1MyksCisgICAgRkwyRlhDT05TVF9DRkcoMC4zNjAzNjc2MjQ3ODAyNCksIEZMMkZYQ09OU1RfQ0ZHKDAuNTk4OTQxODI3NjY5NDgpLAorICAgIEZMMkZYQ09OU1RfQ0ZHKDAuODE2NDE2Nzg5MjkxMjkpLCBGTDJGWENPTlNUX0NGRygwLjk3NDE4NDgxMTMzMzk3KSwKKyAgICBGTDJGWENPTlNUX0NGRygwLjk5NTc1NDExNjEwODQ1KSwgRkwyRlhDT05TVF9DRkcoMC44ODg0MjY2NjI4MTM2MSksCisgICAgRkwyRlhDT05TVF9DRkcoMC43OTIyMjMxNzA2MzczNiksIEZMMkZYQ09OU1RfQ0ZHKDAuNzA4Mjg2MDQzMTg2MDQpLAorICAgIEZMMkZYQ09OU1RfQ0ZHKDAuNjYzOTUwNTQ4MTYzMzgpLCBGTDJGWENPTlNUX0NGRygwLjY0NjMzNzM5NTE2OTUyKSwKKyAgICBGTDJGWENPTlNUX0NGRygwLjY2MDk4Mjc4MTg1MjU1KX07CisKKy8qIHNhY19iaXRkZWMgKi8KK2NvbnN0IElOVCBzYW1wbGluZ0ZyZXFUYWJsZVsxNl0gPSB7OTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsIDIyMDUwLCAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MzUwLCAgMCwgICAgIDAsICAgICAwfTsKKworY29uc3QgVUNIQVIgZnJlcVJlc1RhYmxlW10gPSB7MCwgMjgsIDIwLCAxNCwgMTAsIDcsIDUsIDR9OworCitjb25zdCBVQ0hBUiBmcmVxUmVzVGFibGVfTERbXSA9IHswLCAyMywgMTUsIDEyLCA5LCA3LCA1LCA0fTsKKworY29uc3QgVUNIQVIgdGVtcFNoYXBlQ2hhblRhYmxlW11bOF0gPSB7ezUsIDUsIDQsIDYsIDYsIDQsIDQsIDJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezUsIDUsIDUsIDcsIDcsIDQsIDQsIDJ9fTsKKworY29uc3QgVFJFRVBST1BFUlRJRVMgdHJlZVByb3BlcnR5VGFibGVbXSA9IHsKKyAgICB7MSwgNiwgNSwgMCwgezAsIDAsIDAsIDAsIDF9fSwgezEsIDYsIDUsIDAsIHswLCAwLCAxLCAwLCAwfX0sCisgICAgezIsIDYsIDMsIDEsIHsxLCAwLCAwLCAwLCAwfX0sIHsyLCA4LCA1LCAxLCB7MSwgMCwgMCwgMCwgMH19LAorICAgIHsyLCA4LCA1LCAxLCB7MSwgMCwgMCwgMCwgMH19LCB7NiwgOCwgMiwgMCwgezAsIDAsIDAsIDAsIDB9fSwKKyAgICB7NiwgOCwgMiwgMCwgezAsIDAsIDAsIDAsIDB9fSwgezEsIDIsIDEsIDAsIHswLCAwLCAwLCAwLCAwfX19OworCitjb25zdCBTQ0hBUiBrZXJuZWxzXzRfdG9fNzFbTUFYX0hZQlJJRF9CQU5EU10gPSB7CisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDN9OworCitjb25zdCBTQ0hBUiBrZXJuZWxzXzVfdG9fNzFbTUFYX0hZQlJJRF9CQU5EU10gPSB7CisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDR9OworCitjb25zdCBTQ0hBUiBrZXJuZWxzXzdfdG9fNzFbTUFYX0hZQlJJRF9CQU5EU10gPSB7CisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMiwgMiwgMiwgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNSwgNSwKKyAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCisgICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwKKyAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDZ9OworCitjb25zdCBTQ0hBUiBrZXJuZWxzXzEwX3RvXzcxW01BWF9IWUJSSURfQkFORFNdID0geworICAgIDAsIDAsIDAsIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDcsIDcsIDcsIDgsIDgsCisgICAgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwKKyAgICA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LAorICAgIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksCisgICAgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwKKyAgICA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5fTsKKworY29uc3QgU0NIQVIga2VybmVsc18xNF90b183MVtNQVhfSFlCUklEX0JBTkRTXSA9IHsKKyAgICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAyLCAgMywgIDQsICA0LCAgNSwgIDYsICA2LCAgNywgIDcsICA4LCAgOCwKKyAgICA4LCAgOSwgIDksICA5LCAgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxM307CisKK2NvbnN0IFNDSEFSIGtlcm5lbHNfMjBfdG9fNzFbTUFYX0hZQlJJRF9CQU5EU10gPSB7CisgICAgMCwgIDAsICAxLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgMTAsIDExLCAxMiwgMTMsIDE0LAorICAgIDE0LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCwKKyAgICAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksCisgICAgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LAorICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwKKyAgICAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksCisgICAgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LAorICAgIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5fTsKKworY29uc3QgU0NIQVIga2VybmVsc18yOF90b183MVtNQVhfSFlCUklEX0JBTkRTXSA9IHsKKyAgICAwLCAgMCwgIDEsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICAxMCwgMTEsIDEyLCAxMywgMTQsCisgICAgMTUsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIyLCAyMiwgMjIsIDIzLAorICAgIDIzLCAyMywgMjMsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjYsIDI2LCAyNiwKKyAgICAyNiwgMjYsIDI2LCAyNiwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsCisgICAgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LAorICAgIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywKKyAgICAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsCisgICAgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjd9OworCitjb25zdCBTQ0hBUiBrZXJuZWxzXzRfdG9fNjRbTUFYX0hZQlJJRF9CQU5EU10gPSB7CisgICAgMCwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDN9OworCitjb25zdCBTQ0hBUiBrZXJuZWxzXzVfdG9fNjRbTUFYX0hZQlJJRF9CQU5EU10gPSB7CisgICAgMCwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDR9OworCitjb25zdCBTQ0hBUiBrZXJuZWxzXzdfdG9fNjRbTUFYX0hZQlJJRF9CQU5EU10gPSB7CisgICAgMCwgMSwgMiwgMiwgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwKKyAgICA1LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCisgICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwKKyAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDZ9OworCitjb25zdCBTQ0hBUiBrZXJuZWxzXzlfdG9fNjRbTUFYX0hZQlJJRF9CQU5EU10gPSB7CisgICAgMCwgMSwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNiwgNiwgNiwgNywgNywgNywgNywgNywgNywgNywgNywKKyAgICA3LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorICAgIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCisgICAgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKyAgICA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorICAgIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDh9OworCitjb25zdCBTQ0hBUiBrZXJuZWxzXzEyX3RvXzY0W01BWF9IWUJSSURfQkFORFNdID0geworICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwgIDksCisgICAgOSwgIDksICA5LCAgOSwgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExfTsKKworY29uc3QgU0NIQVIga2VybmVsc18xNV90b182NFtNQVhfSFlCUklEX0JBTkRTXSA9IHsKKyAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgOSwgIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTR9OworCitjb25zdCBTQ0hBUiBrZXJuZWxzXzIzX3RvXzY0W01BWF9IWUJSSURfQkFORFNdID0geworICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICAxMCwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE1LAorICAgIDE1LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCwgMTksIDE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLAorICAgIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLAorICAgIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLAorICAgIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLAorICAgIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLAorICAgIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMn07CisKK2NvbnN0IFVDSEFSIG1hcHBpbmdfMTVfdG9fMjNbTUFYX1BBUkFNRVRFUl9CQU5EU19MRF0gPSB7CisgICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDksIDEwLAorICAgIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTQsIDE0LCAxNH07CisKK2NvbnN0IFVDSEFSIG1hcHBpbmdfMTJfdG9fMjNbTUFYX1BBUkFNRVRFUl9CQU5EU19MRF0gPSB7CisgICAgMCwgMSwgMiwgMywgNCwgNCwgNSwgNSwgNiwgNiwgNiwgNywgNywgOCwgOCwgOSwgOSwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMX07CisKK2NvbnN0IFVDSEFSIG1hcHBpbmdfOV90b18yM1tNQVhfUEFSQU1FVEVSX0JBTkRTX0xEXSA9IHsKKyAgICAwLCAxLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA2LCA2LCA3LCA3LCA3LCA3LCA4LCA4LCA4LCA4LCA4LCA4fTsKKworY29uc3QgVUNIQVIgbWFwcGluZ183X3RvXzIzW01BWF9QQVJBTUVURVJfQkFORFNfTERdID0geworICAgIDAsIDEsIDIsIDIsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDYsIDYsIDYsIDYsIDYsIDZ9OworCitjb25zdCBVQ0hBUiBtYXBwaW5nXzVfdG9fMjNbTUFYX1BBUkFNRVRFUl9CQU5EU19MRF0gPSB7CisgICAgMCwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNCwgNH07CisKK2NvbnN0IFVDSEFSIG1hcHBpbmdfNF90b18yM1tNQVhfUEFSQU1FVEVSX0JBTkRTX0xEXSA9IHsKKyAgICAwLCAwLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzLCAzfTsKKworY29uc3QgRklYUF9DRkcgY2xpcEdhaW5UYWJsZV9fRkRLW10gPSB7CisgICAgLypDTElQX1BST1RFQ1RfR0FJTl8wKDEuMDAwMDAwZikqLyBGWF9EQkwyRlhfQ0ZHKE1BWFZBTF9EQkwpLAorICAgIENMSVBfUFJPVEVDVF9HQUlOXzEoMS4xODkyMDdmKSwKKyAgICBDTElQX1BST1RFQ1RfR0FJTl8xKDEuNDE0MjEzZiksCisgICAgQ0xJUF9QUk9URUNUX0dBSU5fMSgxLjY4MTc5MmYpLAorICAgIC8qQ0xJUF9QUk9URUNUX0dBSU5fMSgyLjAwMDAwMGYpKi8gRlhfREJMMkZYX0NGRyhNQVhWQUxfREJMKSwKKyAgICBDTElQX1BST1RFQ1RfR0FJTl8yKDIuMzc4NDE0ZiksCisgICAgQ0xJUF9QUk9URUNUX0dBSU5fMigyLjgyODQyN2YpLAorICAgIC8qQ0xJUF9QUk9URUNUX0dBSU5fMig0LjAwMDAwMGYpKi8gRlhfREJMMkZYX0NGRyhNQVhWQUxfREJMKX07CisKK2NvbnN0IFVDSEFSIGNsaXBHYWluU0ZUYWJsZV9fRkRLW10gPSB7MCwgMSwgMSwgMSwgMSwgMiwgMiwgMn07CisKK2NvbnN0IFVDSEFSIHBiU3RyaWRlVGFibGVbXSA9IHsxLCAyLCA1LCAyOH07CisKK2NvbnN0IGludCBzbWdUaW1lVGFibGVbXSA9IHs2NCwgMTI4LCAyNTYsIDUxMn07CisKKy8qIHRhYmxlIGlzIHNjYWxlZCBieSBmYWN0b3IgMC41ICovCitjb25zdCBGSVhQX0NGRyBlbnZTaGFwZURhdGFUYWJsZV9fRkRLWzVdWzJdID0geworICAgIHtGTDJGWENPTlNUX0NGRygwLjI1MDAwMDAwMDAwMDAwZiksIEZMMkZYQ09OU1RfQ0ZHKDAuMjUwMDAwMDAwMDAwMDBmKX0sCisgICAge0ZMMkZYQ09OU1RfQ0ZHKDAuMzUzNTUzMzkwNTkzMjdmKSwgRkwyRlhDT05TVF9DRkcoMC4zMTQ5ODAyNjI0NzM3MmYpfSwKKyAgICB7RkwyRlhDT05TVF9DRkcoMC41MDAwMDAwMDAwMDAwMGYpLCBGTDJGWENPTlNUX0NGRygwLjM5Njg1MDI2Mjk5MjA1Zil9LAorICAgIHtGTDJGWENPTlNUX0NGRygwLjcwNzEwNjc4MTE4NjU1ZiksIEZMMkZYQ09OU1RfQ0ZHKDAuNTAwMDAwMDAwMDAwMDBmKX0sCisgICAgey8qRkwyRlhDT05TVF9DRkcoIDEuMDAwMDAwMDAwMDAwMDBmKSovIEZYX0RCTDJGWF9DRkcoTUFYVkFMX0RCTCksCisgICAgIEZMMkZYQ09OU1RfQ0ZHKDAuNjI5OTYwNTI0OTQ3NDRmKX19OworCisvKiBzYWNfY2FsY00xYW5kTTIgKi8KK2NvbnN0IFNDSEFSIHJvdzJjaGFubmVsU1RQW11bTUFYX00yX0lOUFVUXSA9IHt7MCwgMX0sIHswLCAzfSwgezAsIDJ9LCAgezAsIDR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCA0fSwgezAsIDJ9LCB7LTEsIDJ9LCB7MCwgMX19OworCitjb25zdCBTQ0hBUiByb3cyY2hhbm5lbEdFU1tdW01BWF9NMl9JTlBVVF0gPSB7ezAsIDF9LCB7MCwgM30sIHswLCAzfSwgIHswLCA1fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgNX0sIHswLCAyfSwgey0xLCAyfSwgezAsIDF9fTsKKworY29uc3QgU0NIQVIgcm93MnJlc2lkdWFsW11bTUFYX00yX0lOUFVUXSA9IHt7LTEsIDB9LCAgey0xLCAwfSwgIHstMSwgLTF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTEsIC0xfSwgey0xLCAtMX0sIHstMSwgLTF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTEsIC0xfSwgey0xLCAwfX07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBzYWNfZ2V0Q0xEVmFsdWVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgRGVzY3JpcHRpb246IEdldCBDTEQgdmFsdWVzIGZyb20gdGFibGUgaW5kZXguCisKKyBBcmd1bWVudHM6CisgICBpbmRleDogVGFibGUgaW5kZXgKKyAgICpjdSwgKmNsIDogUG9pbnRlciB0byBsb2NhdGlvbnMgd2hlcmUgcmVzdWx0aW5nIHZhbHVlcyB3aWxsIGJlIHdyaXR0ZW4gdG8uCisKKyBSZXR1cm46IG5vdGhpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgU3BhdGlhbERlcXVhbnRHZXRDTERWYWx1ZXMoaW50IGluZGV4LCBGSVhQX0RCTCogY3UsIEZJWFBfREJMKiBjbCkgeworICAqY3UgPSBGWF9DRkcyRlhfREJMKGRlcXVhbnRDTERfY19sW2luZGV4XSk7CisgICpjbCA9IEZYX0NGRzJGWF9EQkwoZGVxdWFudENMRF9jX2xbMzEgLSAxIC0gaW5kZXhdKTsKK30KKwordm9pZCBTcGF0aWFsRGVxdWFudEdldENMRDJWYWx1ZXMoaW50IGlkeCwgRklYUF9EQkwqIHgpIHsKKyAgKnggPSBGWF9DRkcyRlhfREJMKGRlcXVhbnRDTERfX0ZES1tpZHhdKTsKK30KZGlmZiAtLWdpdCBhL2xpYlNBQ2RlYy9zcmMvc2FjX3JvbS5oIGIvbGliU0FDZGVjL3NyYy9zYWNfcm9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM2NmZiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2RlYy9zcmMvc2FjX3JvbS5oCkBAIC0wLDAgKzEsMjMwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IFNBQyBEZWMgdGFibGVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0FDX1JPTV9ICisjZGVmaW5lIFNBQ19ST01fSAorCisjaW5jbHVkZSAiRkRLX2FyY2hkZWYuaCIKKyNpbmNsdWRlICJzYWNfZGVjX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiaHVmZl9ub2Rlcy5oIgorI2luY2x1ZGUgInNhY19iaXRkZWMuaCIKKyNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKKworLyogR2xvYmFsIFJPTSB0YWJsZSBkYXRhIHR5cGU6ICovCisjaWZuZGVmIEFSQ0hfUFJFRkVSX01VTFRfMzJ4MzIKKyNkZWZpbmUgRklYUF9DRkcgRklYUF9TR0wKKyNkZWZpbmUgRlhfQ0ZHMkZYX0RCTCBGWF9TR0wyRlhfREJMCisjZGVmaW5lIEZYX0NGRzJGWF9TR0wKKyNkZWZpbmUgQ0ZHKGEpIChGWF9EQkwyRlhDT05TVF9TR0woYSkpCisjZGVmaW5lIEZMMkZYQ09OU1RfQ0ZHIEZMMkZYQ09OU1RfU0dMCisjZGVmaW5lIEZYX0RCTDJGWF9DRkcoeCkgRlhfREJMMkZYX1NHTCgoRklYUF9EQkwpKHgpKQorI2Vsc2UKKyNkZWZpbmUgRklYUF9DRkcgRklYUF9EQkwKKyNkZWZpbmUgRlhfQ0ZHMkZYX0RCTAorI2RlZmluZSBGWF9DRkcyRlhfU0dMIEZYX0RCTDJGWF9TR0wKKyNkZWZpbmUgQ0ZHKGEpIEZJWFBfREJMKGEpCisjZGVmaW5lIEZMMkZYQ09OU1RfQ0ZHIEZMMkZYQ09OU1RfREJMCisjZGVmaW5lIEZYX0RCTDJGWF9DRkcoeCkgKChGSVhQX0RCTCkoeCkpCisjZW5kaWYKKworLyogb3RoZXJzICAqLworI2RlZmluZSBTQ0FMRV9JTlZfSUNDICgyKQorI2RlZmluZSBHX2RkX1NDQUxFICgyKQorCisjZGVmaW5lIFFDQ19TQ0FMRSAxCisjZGVmaW5lIE0xTTJfREFUQSBGSVhQX0RCTAorI2lmbmRlZiBBUkNIX1BSRUZFUl9NVUxUXzMyeDMyCisjZGVmaW5lIE0xTTJfQ0RBVEEgRklYUF9TR0wKKyNkZWZpbmUgTTFNMl9DREFUQTJGWF9EQkwoYSkgRlhfU0dMMkZYX0RCTChhKQorI2RlZmluZSBGWF9EQkwyTTFNMl9DREFUQShhKSBGWF9EQkwyRlhfU0dMKGEpCisjZWxzZQorI2RlZmluZSBNMU0yX0NEQVRBIEZJWFBfREJMCisjZGVmaW5lIE0xTTJfQ0RBVEEyRlhfREJMKGEpIChhKQorI2RlZmluZSBGWF9EQkwyTTFNMl9DREFUQShhKSAoYSkKKyNlbmRpZgorCisjZGVmaW5lIENMSVBfUFJPVEVDVF9HQUlOXzAoeCkgRkwyRlhDT05TVF9DRkcoKCh4KSAvIChmbG9hdCkoMSA8PCAwKSkpCisjZGVmaW5lIENMSVBfUFJPVEVDVF9HQUlOXzEoeCkgRkwyRlhDT05TVF9DRkcoKCh4KSAvIChmbG9hdCkoMSA8PCAxKSkpCisjZGVmaW5lIENMSVBfUFJPVEVDVF9HQUlOXzIoeCkgRkwyRlhDT05TVF9DRkcoKCh4KSAvIChmbG9hdCkoMSA8PCAyKSkpCisKKyNkZWZpbmUgU0ZfQ0xEX0MxQzIgKDgpCisKK2V4dGVybiBjb25zdCBGSVhQX0NGRyBkZXF1YW50Q1BDX19GREtbXTsKK2V4dGVybiBjb25zdCBGSVhQX0NGRyBkZXF1YW50SUNDX19GREtbOF07CitleHRlcm4gY29uc3QgRklYUF9DRkcgZGVxdWFudENMRF9fRkRLWzMxXTsKKworI2RlZmluZSBJUERfU0NBTEUgKDUpCisjZGVmaW5lIFBJX19JUEQgKEZMMkZYQ09OU1RfREJMKDMuMTQxNTkyNjUzNTg5NzkzMmYgLyAoZmxvYXQpKDEgPDwgSVBEX1NDQUxFKSkpCisvKiBEZWZpbmUgZm9yIFBJKjIgZm9yIGJldHRlciBwcmVjaXNpb24gaW4gIFNwYXRpYWxEZWNBcHBseVBoYXNlKCkgKi8KKyNkZWZpbmUgUEl4Ml9fSVBEIFwKKyAgKEZMMkZYQ09OU1RfREJMKDMuMTQxNTkyNjUzNTg5NzkzMmYgLyAoZmxvYXQpKDEgPDwgKElQRF9TQ0FMRSAtIDEpKSkpCisKK2V4dGVybiBjb25zdCBGSVhQX0NGRyBkZXF1YW50SVBEX19GREtbMTZdOworCitleHRlcm4gY29uc3QgRklYUF9DRkcgSDExX25jWzMxXVs4XTsKK2V4dGVybiBjb25zdCBGSVhQX0NGRyBIMTJfbmNbMzFdWzhdOworCitleHRlcm4gY29uc3QgRklYUF9EQkwgZGVxdWFudENMRF9jMVszMV07CisKK2V4dGVybiBjb25zdCBGSVhQX0NGRyBCUF9fRkRLW107CitleHRlcm4gY29uc3QgRklYUF9DRkcgQlBfR0ZfX0ZES1tdOworZXh0ZXJuIGNvbnN0IFNDSEFSIHJvdzJjaGFubmVsU1RQW11bTUFYX00yX0lOUFVUXTsKKworLyogc2FjX2JpdGRlYyAqLworZXh0ZXJuIGNvbnN0IElOVCBzYW1wbGluZ0ZyZXFUYWJsZVsxNl07CitleHRlcm4gY29uc3QgVUNIQVIgZnJlcVJlc1RhYmxlW107CitleHRlcm4gY29uc3QgVUNIQVIgZnJlcVJlc1RhYmxlX0xEW107CitleHRlcm4gY29uc3QgVUNIQVIgdGVtcFNoYXBlQ2hhblRhYmxlWzJdWzhdOworZXh0ZXJuIGNvbnN0IFRSRUVQUk9QRVJUSUVTIHRyZWVQcm9wZXJ0eVRhYmxlW107CisKK2V4dGVybiBjb25zdCBTQ0hBUiBrZXJuZWxzXzRfdG9fNzFbTUFYX0hZQlJJRF9CQU5EU107CitleHRlcm4gY29uc3QgU0NIQVIga2VybmVsc181X3RvXzcxW01BWF9IWUJSSURfQkFORFNdOworZXh0ZXJuIGNvbnN0IFNDSEFSIGtlcm5lbHNfN190b183MVtNQVhfSFlCUklEX0JBTkRTXTsKK2V4dGVybiBjb25zdCBTQ0hBUiBrZXJuZWxzXzEwX3RvXzcxW01BWF9IWUJSSURfQkFORFNdOworZXh0ZXJuIGNvbnN0IFNDSEFSIGtlcm5lbHNfMTRfdG9fNzFbTUFYX0hZQlJJRF9CQU5EU107CitleHRlcm4gY29uc3QgU0NIQVIga2VybmVsc18yMF90b183MVtNQVhfSFlCUklEX0JBTkRTXTsKK2V4dGVybiBjb25zdCBTQ0hBUiBrZXJuZWxzXzI4X3RvXzcxW01BWF9IWUJSSURfQkFORFNdOworCitleHRlcm4gY29uc3QgVUNIQVIgbWFwcGluZ180X3RvXzI4W01BWF9QQVJBTUVURVJfQkFORFNdOworZXh0ZXJuIGNvbnN0IFVDSEFSIG1hcHBpbmdfNV90b18yOFtNQVhfUEFSQU1FVEVSX0JBTkRTXTsKK2V4dGVybiBjb25zdCBVQ0hBUiBtYXBwaW5nXzdfdG9fMjhbTUFYX1BBUkFNRVRFUl9CQU5EU107CitleHRlcm4gY29uc3QgVUNIQVIgbWFwcGluZ18xMF90b18yOFtNQVhfUEFSQU1FVEVSX0JBTkRTXTsKK2V4dGVybiBjb25zdCBVQ0hBUiBtYXBwaW5nXzE0X3RvXzI4W01BWF9QQVJBTUVURVJfQkFORFNdOworZXh0ZXJuIGNvbnN0IFVDSEFSIG1hcHBpbmdfMjBfdG9fMjhbTUFYX1BBUkFNRVRFUl9CQU5EU107CitleHRlcm4gY29uc3QgU0NIQVIga2VybmVsc180X3RvXzY0W01BWF9IWUJSSURfQkFORFNdOworZXh0ZXJuIGNvbnN0IFNDSEFSIGtlcm5lbHNfNV90b182NFtNQVhfSFlCUklEX0JBTkRTXTsKK2V4dGVybiBjb25zdCBTQ0hBUiBrZXJuZWxzXzdfdG9fNjRbTUFYX0hZQlJJRF9CQU5EU107CitleHRlcm4gY29uc3QgU0NIQVIga2VybmVsc185X3RvXzY0W01BWF9IWUJSSURfQkFORFNdOworZXh0ZXJuIGNvbnN0IFNDSEFSIGtlcm5lbHNfMTJfdG9fNjRbTUFYX0hZQlJJRF9CQU5EU107CitleHRlcm4gY29uc3QgU0NIQVIga2VybmVsc18xNV90b182NFtNQVhfSFlCUklEX0JBTkRTXTsKK2V4dGVybiBjb25zdCBTQ0hBUiBrZXJuZWxzXzIzX3RvXzY0W01BWF9IWUJSSURfQkFORFNdOworCitleHRlcm4gY29uc3QgVUNIQVIgbWFwcGluZ18xNV90b18yM1tNQVhfUEFSQU1FVEVSX0JBTkRTX0xEXTsKK2V4dGVybiBjb25zdCBVQ0hBUiBtYXBwaW5nXzEyX3RvXzIzW01BWF9QQVJBTUVURVJfQkFORFNfTERdOworZXh0ZXJuIGNvbnN0IFVDSEFSIG1hcHBpbmdfOV90b18yM1tNQVhfUEFSQU1FVEVSX0JBTkRTX0xEXTsKK2V4dGVybiBjb25zdCBVQ0hBUiBtYXBwaW5nXzdfdG9fMjNbTUFYX1BBUkFNRVRFUl9CQU5EU19MRF07CitleHRlcm4gY29uc3QgVUNIQVIgbWFwcGluZ181X3RvXzIzW01BWF9QQVJBTUVURVJfQkFORFNfTERdOworZXh0ZXJuIGNvbnN0IFVDSEFSIG1hcHBpbmdfNF90b18yM1tNQVhfUEFSQU1FVEVSX0JBTkRTX0xEXTsKKworZXh0ZXJuIGNvbnN0IEZJWFBfQ0ZHIGNsaXBHYWluVGFibGVfX0ZES1tdOworZXh0ZXJuIGNvbnN0IFVDSEFSIGNsaXBHYWluU0ZUYWJsZV9fRkRLW107CisKK2V4dGVybiBjb25zdCBVQ0hBUiBwYlN0cmlkZVRhYmxlW107CitleHRlcm4gY29uc3QgaW50IHNtZ1RpbWVUYWJsZVtdOworCitleHRlcm4gY29uc3QgRklYUF9DRkcgZW52U2hhcGVEYXRhVGFibGVfX0ZES1s1XVsyXTsKK2V4dGVybiBjb25zdCBTQ0hBUiByb3cyY2hhbm5lbEdFU1tdW01BWF9NMl9JTlBVVF07CisKKy8qIHNhY19jYWxjTTFhbmRNMiAqLworZXh0ZXJuIGNvbnN0IFNDSEFSIHJvdzJyZXNpZHVhbFtdW01BWF9NMl9JTlBVVF07CisKK3ZvaWQgU3BhdGlhbERlcXVhbnRHZXRDTERWYWx1ZXMoaW50IGluZGV4LCBGSVhQX0RCTCogY3UsIEZJWFBfREJMKiBjbCk7CisKK3ZvaWQgU3BhdGlhbERlcXVhbnRHZXRDTEQyVmFsdWVzKGludCBpbmRleCwgRklYUF9EQkwqIHgpOworCisvKiBFeHRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zICovCitzdGF0aWMgaW5saW5lIGludCBTYWNHZXRIeWJyaWRTdWJiYW5kcyhpbnQgcW1mU3ViYmFuZHMpIHsKKyAgcmV0dXJuIHFtZlN1YmJhbmRzIC0gTUFYX1FNRl9CQU5EU19UT19IWUJSSUQgKyAxMDsKK30KKworI2VuZGlmIC8qIFNBQ19ST01fSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0FDZGVjL3NyYy9zYWNfc21vb3RoaW5nLmNwcCBiL2xpYlNBQ2RlYy9zcmMvc2FjX3Ntb290aGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVlNjU1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2RlYy9zcmMvc2FjX3Ntb290aGluZy5jcHAKQEAgLTAsMCArMSwyOTUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjogU0FDIERlYyBwYXJhbWV0ZXIgc21vb3RoaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJzYWNfZGVjLmgiCisjaW5jbHVkZSAic2FjX2JpdGRlYy5oIgorI2luY2x1ZGUgInNhY19zbW9vdGhpbmcuaCIKKyNpbmNsdWRlICJzYWNfcm9tLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBjYWxjRmlsdGVyQ29lZmYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKworIEFyZ3VtZW50czoKKworIElucHV0OgorCisgT3V0cHV0OgorCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgRklYUF9EQkwgY2FsY0ZpbHRlckNvZWZmX19GREsoc3BhdGlhbERlYyAqc2VsZiwgaW50IHBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNQQVRJQUxfQlNfRlJBTUUgKmZyYW1lKSB7CisgIGludCBkU2xvdHM7CisgIEZJWFBfREJMIGRlbHRhOworCisgIGRTbG90cyA9IGZyYW1lLT5wYXJhbVNsb3RbcHNdIC0gc2VsZi0+c21vb3RoU3RhdGUtPnByZXZQYXJhbVNsb3Q7CisKKyAgaWYgKGRTbG90cyA8PSAwKSB7CisgICAgZFNsb3RzICs9IHNlbGYtPnRpbWVTbG90czsKKyAgfQorCisgIGRlbHRhID0gZkRpdk5vcm0oZFNsb3RzLCBzZWxmLT5zbWdUaW1lW3BzXSk7CisKKyAgcmV0dXJuIGRlbHRhOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogZ2V0U21vb3RoT25PZmYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBEZXNjcmlwdGlvbjoKKworIEFyZ3VtZW50czoKKworIElucHV0OgorCisgT3V0cHV0OgorCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGdldFNtb290aE9uT2ZmKHNwYXRpYWxEZWMgKnNlbGYsIGludCBwcywgaW50IHBiKSB7CisgIGludCBzbW9vdGhCYW5kID0gMDsKKworICBzbW9vdGhCYW5kID0gc2VsZi0+c21nRGF0YVtwc11bcGJdOworCisgIHJldHVybiBzbW9vdGhCYW5kOworfQorCit2b2lkIFNwYXRpYWxEZWNTbW9vdGhNMWFuZE0yKHNwYXRpYWxEZWMgKnNlbGYsIGNvbnN0IFNQQVRJQUxfQlNfRlJBTUUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHMpIHsKKyAgRklYUF9EQkwgZGVsdGFfX0ZESzsKKyAgRklYUF9EQkwgb25lX21pbnVzX2RlbHRhX19GREs7CisKKyAgaW50IHBiLCByb3csIGNvbDsKKyAgaW50IHJlc2lkdWFsQmFuZHMgPSAwOworCisgIGlmIChzZWxmLT5yZXNpZHVhbENvZGluZykgeworICAgIGludCBpOworICAgIGludCBib3hlcyA9IHNlbGYtPm51bU90dEJveGVzOworICAgIGZvciAoaSA9IDA7IGkgPCBib3hlczsgaSsrKSB7CisgICAgICBpZiAoc2VsZi0+cmVzaWR1YWxCYW5kc1tpXSA+IHJlc2lkdWFsQmFuZHMpIHsKKyAgICAgICAgcmVzaWR1YWxCYW5kcyA9IHNlbGYtPnJlc2lkdWFsQmFuZHNbaV07CisgICAgICB9CisgICAgfQorICB9CisKKyAgZGVsdGFfX0ZESyA9IGNhbGNGaWx0ZXJDb2VmZl9fRkRLKHNlbGYsIHBzLCBmcmFtZSk7CisgIGlmIChkZWx0YV9fRkRLID09IC8qRkwyRlhDT05TVF9EQkwoMS4wZikqLyAoRklYUF9EQkwpTUFYVkFMX0RCTCkKKyAgICBvbmVfbWludXNfZGVsdGFfX0ZESyA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICBlbHNlIGlmIChkZWx0YV9fRkRLID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKQorICAgIG9uZV9taW51c19kZWx0YV9fRkRLID0gLypGTDJGWENPTlNUX0RCTCgxLjBmKSovIChGSVhQX0RCTClNQVhWQUxfREJMOworICBlbHNlCisgICAgb25lX21pbnVzX2RlbHRhX19GREsgPSAoRkwyRlhDT05TVF9EQkwoMC41ZikgLSAoZGVsdGFfX0ZESyA+PiAxKSkgPDwgMTsKKworICBmb3IgKHBiID0gMDsgcGIgPCBzZWxmLT5udW1QYXJhbWV0ZXJCYW5kczsgcGIrKykgeworICAgIGludCBzbW9vdGhCYW5kOworCisgICAgc21vb3RoQmFuZCA9IGdldFNtb290aE9uT2ZmKHNlbGYsIHBzLCBwYik7CisKKyAgICBpZiAoc21vb3RoQmFuZCAmJiAocGIgPj0gcmVzaWR1YWxCYW5kcykpIHsKKyAgICAgIGZvciAocm93ID0gMDsgcm93IDwgc2VsZi0+bnVtTTJyb3dzOyByb3crKykgeworICAgICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IHNlbGYtPm51bVZDaGFubmVsczsgY29sKyspIHsKKyAgICAgICAgICBzZWxmLT5NMlJlYWxfX0ZES1tyb3ddW2NvbF1bcGJdID0KKyAgICAgICAgICAgICAgKChmTXVsdERpdjIoZGVsdGFfX0ZESywgc2VsZi0+TTJSZWFsX19GREtbcm93XVtjb2xdW3BiXSkgKworICAgICAgICAgICAgICAgIGZNdWx0RGl2MihvbmVfbWludXNfZGVsdGFfX0ZESywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+TTJSZWFsUHJldl9fRkRLW3Jvd11bY29sXVtwYl0pKQorICAgICAgICAgICAgICAgPDwgMSk7CisgICAgICAgICAgaWYgKDAgfHwgKHNlbGYtPnBoYXNlQ29kaW5nID09IDMpKSB7CisgICAgICAgICAgICBzZWxmLT5NMkltYWdfX0ZES1tyb3ddW2NvbF1bcGJdID0KKyAgICAgICAgICAgICAgICAoKGZNdWx0RGl2MihkZWx0YV9fRkRLLCBzZWxmLT5NMkltYWdfX0ZES1tyb3ddW2NvbF1bcGJdKSArCisgICAgICAgICAgICAgICAgICBmTXVsdERpdjIob25lX21pbnVzX2RlbHRhX19GREssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+TTJJbWFnUHJldl9fRkRLW3Jvd11bY29sXVtwYl0pKQorICAgICAgICAgICAgICAgICA8PCAxKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgc2VsZi0+c21vb3RoU3RhdGUtPnByZXZQYXJhbVNsb3QgPSBmcmFtZS0+cGFyYW1TbG90W3BzXTsKK30KKworLyogaW5pdCBzdGF0ZXMgKi8KK3ZvaWQgaW5pdFBhcmFtZXRlclNtb290aGluZyhzcGF0aWFsRGVjICpzZWxmKSB7CisgIHNlbGYtPnNtb290aFN0YXRlLT5wcmV2UGFyYW1TbG90ID0gMDsKK30KKwordm9pZCBTcGF0aWFsRGVjU21vb3RoT1BEKHNwYXRpYWxEZWMgKnNlbGYsIGNvbnN0IFNQQVRJQUxfQlNfRlJBTUUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcykgeworICBpbnQgcGI7CisgIGludCBkU2xvdHM7CisgIEZJWFBfREJMIGRlbHRhX19GREs7CisgIEZJWFBfREJMIG9uZV9taW51c19kZWx0YV9fRkRLOworICBGSVhQX0RCTCAqcGhhc2VMZWZ0U21vb3RoX19GREsgPSBzZWxmLT5zbW9vdGhTdGF0ZS0+b3BkTGVmdFN0YXRlX19GREs7CisgIEZJWFBfREJMICpwaGFzZVJpZ2h0U21vb3RoX19GREsgPSBzZWxmLT5zbW9vdGhTdGF0ZS0+b3BkUmlnaHRTdGF0ZV9fRkRLOworICBpbnQgcXVhbnRDb2Fyc2U7CisKKyAgcXVhbnRDb2Fyc2UgPSBmcmFtZS0+SVBETG9zc2xlc3NEYXRhWzBdLmJzUXVhbnRDb2Fyc2VYWFhbcHNdOworCisgIGlmIChmcmFtZS0+T3BkU21vb3RoaW5nTW9kZSA9PSAwKSB7CisgICAgRkRLbWVtY3B5KHBoYXNlTGVmdFNtb290aF9fRkRLLCBzZWxmLT5QaGFzZUxlZnRfX0ZESywKKyAgICAgICAgICAgICAgc2VsZi0+bnVtUGFyYW1ldGVyQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICBGREttZW1jcHkocGhhc2VSaWdodFNtb290aF9fRkRLLCBzZWxmLT5QaGFzZVJpZ2h0X19GREssCisgICAgICAgICAgICAgIHNlbGYtPm51bVBhcmFtZXRlckJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIH0gZWxzZSB7CisgICAgaWYgKHBzID09IDApIHsKKyAgICAgIGRTbG90cyA9IGZyYW1lLT5wYXJhbVNsb3RbcHNdICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgZFNsb3RzID0gZnJhbWUtPnBhcmFtU2xvdFtwc10gLSBmcmFtZS0+cGFyYW1TbG90W3BzIC0gMV07CisgICAgfQorCisgICAgZGVsdGFfX0ZESyA9IChGSVhQX0RCTCkoKElOVCkoRkwyRlhDT05TVF9EQkwoMC4wMDc4MTI1ZikpICogZFNsb3RzKTsKKworICAgIGlmIChkZWx0YV9fRkRLID09IChGSVhQX0RCTClNQVhWQUxfREJMIC8qRkwyRlhDT05TVF9EQkwoMS4wZikqLykKKyAgICAgIG9uZV9taW51c19kZWx0YV9fRkRLID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgZWxzZSBpZiAoZGVsdGFfX0ZESyA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkKKyAgICAgIG9uZV9taW51c19kZWx0YV9fRkRLID0gKEZJWFBfREJMKU1BWFZBTF9EQkwgLypGTDJGWENPTlNUX0RCTCgxLjBmKSovOworICAgIGVsc2UKKyAgICAgIG9uZV9taW51c19kZWx0YV9fRkRLID0gKEZMMkZYQ09OU1RfREJMKDAuNWYpIC0gKGRlbHRhX19GREsgPj4gMSkpIDw8IDE7CisKKyAgICBmb3IgKHBiID0gMDsgcGIgPCBzZWxmLT5udW1QYXJhbWV0ZXJCYW5kczsgcGIrKykgeworICAgICAgRklYUF9EQkwgdG1wTCwgdG1wUiwgdG1wOworCisgICAgICB0bXBMID0gc2VsZi0+UGhhc2VMZWZ0X19GREtbcGJdOworICAgICAgdG1wUiA9IHNlbGYtPlBoYXNlUmlnaHRfX0ZES1twYl07CisKKyAgICAgIHdoaWxlICh0bXBMID4gcGhhc2VMZWZ0U21vb3RoX19GREtbcGJdICsgUElfX0lQRCkgdG1wTCAtPSBQSV9fSVBEIDw8IDE7CisgICAgICB3aGlsZSAodG1wTCA8IHBoYXNlTGVmdFNtb290aF9fRkRLW3BiXSAtIFBJX19JUEQpIHRtcEwgKz0gUElfX0lQRCA8PCAxOworICAgICAgd2hpbGUgKHRtcFIgPiBwaGFzZVJpZ2h0U21vb3RoX19GREtbcGJdICsgUElfX0lQRCkgdG1wUiAtPSBQSV9fSVBEIDw8IDE7CisgICAgICB3aGlsZSAodG1wUiA8IHBoYXNlUmlnaHRTbW9vdGhfX0ZES1twYl0gLSBQSV9fSVBEKSB0bXBSICs9IFBJX19JUEQgPDwgMTsKKworICAgICAgcGhhc2VMZWZ0U21vb3RoX19GREtbcGJdID0KKyAgICAgICAgICBmTXVsdChkZWx0YV9fRkRLLCB0bXBMKSArCisgICAgICAgICAgZk11bHQob25lX21pbnVzX2RlbHRhX19GREssIHBoYXNlTGVmdFNtb290aF9fRkRLW3BiXSk7CisgICAgICBwaGFzZVJpZ2h0U21vb3RoX19GREtbcGJdID0KKyAgICAgICAgICBmTXVsdChkZWx0YV9fRkRLLCB0bXBSKSArCisgICAgICAgICAgZk11bHQob25lX21pbnVzX2RlbHRhX19GREssIHBoYXNlUmlnaHRTbW9vdGhfX0ZES1twYl0pOworCisgICAgICB0bXAgPSAoKCh0bXBMID4+IDEpIC0gKHRtcFIgPj4gMSkpIC0gKChwaGFzZUxlZnRTbW9vdGhfX0ZES1twYl0gPj4gMSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGhhc2VSaWdodFNtb290aF9fRkRLW3BiXSA+PiAxKSkpCisgICAgICAgICAgICA8PCAxOworICAgICAgd2hpbGUgKHRtcCA+IFBJX19JUEQpIHRtcCAtPSBQSV9fSVBEIDw8IDE7CisgICAgICB3aGlsZSAodG1wIDwgLVBJX19JUEQpIHRtcCArPSBQSV9fSVBEIDw8IDE7CisgICAgICBpZiAoZml4cF9hYnModG1wKSA+IGZNdWx0KChxdWFudENvYXJzZSA/IEZMMkZYQ09OU1RfREJMKDUwLmYgLyAxODAuZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRkwyRlhDT05TVF9EQkwoMjUuZiAvIDE4MC5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJX19JUEQpKSB7CisgICAgICAgIHBoYXNlTGVmdFNtb290aF9fRkRLW3BiXSA9IHRtcEw7CisgICAgICAgIHBoYXNlUmlnaHRTbW9vdGhfX0ZES1twYl0gPSB0bXBSOworICAgICAgfQorCisgICAgICB3aGlsZSAocGhhc2VMZWZ0U21vb3RoX19GREtbcGJdID4gUElfX0lQRCA8PCAxKQorICAgICAgICBwaGFzZUxlZnRTbW9vdGhfX0ZES1twYl0gLT0gUElfX0lQRCA8PCAxOworICAgICAgd2hpbGUgKHBoYXNlTGVmdFNtb290aF9fRkRLW3BiXSA8IChGSVhQX0RCTCkwKQorICAgICAgICBwaGFzZUxlZnRTbW9vdGhfX0ZES1twYl0gKz0gUElfX0lQRCA8PCAxOworICAgICAgd2hpbGUgKHBoYXNlUmlnaHRTbW9vdGhfX0ZES1twYl0gPiBQSV9fSVBEIDw8IDEpCisgICAgICAgIHBoYXNlUmlnaHRTbW9vdGhfX0ZES1twYl0gLT0gUElfX0lQRCA8PCAxOworICAgICAgd2hpbGUgKHBoYXNlUmlnaHRTbW9vdGhfX0ZES1twYl0gPCAoRklYUF9EQkwpMCkKKyAgICAgICAgcGhhc2VSaWdodFNtb290aF9fRkRLW3BiXSArPSBQSV9fSVBEIDw8IDE7CisKKyAgICAgIHNlbGYtPlBoYXNlTGVmdF9fRkRLW3BiXSA9IHBoYXNlTGVmdFNtb290aF9fRkRLW3BiXTsKKyAgICAgIHNlbGYtPlBoYXNlUmlnaHRfX0ZES1twYl0gPSBwaGFzZVJpZ2h0U21vb3RoX19GREtbcGJdOworICAgIH0KKyAgfQorICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19zbW9vdGhpbmcuaCBiL2xpYlNBQ2RlYy9zcmMvc2FjX3Ntb290aGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZjNmNWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY19zbW9vdGhpbmcuaApAQCAtMCwwICsxLDExNCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBTQUMgRGVjIHBhcmFtZXRlciBzbW9vdGhpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQUNfU01PT1RISU5HX0gKKyNkZWZpbmUgU0FDX1NNT09USElOR19ICisKKyNpbmNsdWRlICJzYWNfZGVjLmgiCisKK3ZvaWQgaW5pdFBhcmFtZXRlclNtb290aGluZyhzcGF0aWFsRGVjICpzZWxmKTsKK3ZvaWQgU3BhdGlhbERlY1Ntb290aE0xYW5kTTIoc3BhdGlhbERlYyAqc2VsZiwgY29uc3QgU1BBVElBTF9CU19GUkFNRSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcyk7Cit2b2lkIFNwYXRpYWxEZWNTbW9vdGhPUEQoc3BhdGlhbERlYyAqc2VsZiwgY29uc3QgU1BBVElBTF9CU19GUkFNRSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19zdHAuY3BwIGIvbGliU0FDZGVjL3NyYy9zYWNfc3RwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MThlOWRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZGVjL3NyYy9zYWNfc3RwLmNwcApAQCAtMCwwICsxLDU0OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBTQUMgRGVjIHN1YmJhbmQgcHJvY2Vzc2luZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAic2FjX3N0cC5oIgorI2luY2x1ZGUgInNhY19jYWxjTTFhbmRNMi5oIgorI2luY2x1ZGUgInNhY19iaXRkZWMuaCIKKyNpbmNsdWRlICJGREtfbWF0cml4Q2FsbG9jLmgiCisjaW5jbHVkZSAic2FjX3JvbS5oIgorCisjZGVmaW5lIEJQX0dGX1NUQVJUIDYKKyNkZWZpbmUgQlBfR0ZfU0laRSAyNQorI2RlZmluZSBIUF9TSVpFIDkKKyNkZWZpbmUgU1RQX1VQREFURV9FTkVSR1lfUkFURSAzMgorCisjZGVmaW5lIFNGX1dFVCA1CisjZGVmaW5lIFNGX0RSWSBcCisgIDMgLyogU0ZfRFJZID09IDIgd291bGQgcHJvZHVjZSBnb29kIGNvbmZvcm1hbmNlIHRlc3QgcmVzdWx0cyBhcyB3ZWxsICovCisjZGVmaW5lIFNGX1BST0RVQ1RfQlBfR0YgMTMKKyNkZWZpbmUgU0ZfUFJPRFVDVF9CUF9HRl9HRiAyNgorI2RlZmluZSBTRl9TQ0FMRSAyCisKKyNkZWZpbmUgU0ZfU0NBTEVfTEQ2NCBGTDJGWENPTlNUX0RCTCgwLjAzMTI1KSAgICAgIC8qIExENjQoKDE8PFNGX1NDQUxFKSkqLworI2RlZmluZSBTVFBfTFBGX0NPRUZGMV9fRkRLIEZMMkZYQ09OU1RfREJMKDAuOTUwZikgLyogMC45NSAqLworI2RlZmluZSBPTkVfTUlOVVNfU1RQX0xQRl9DT0VGRjFfX0ZESyBGTDJGWENPTlNUX0RCTCgwLjA1ZikgLyogMS4wIC0gMC45NSAqLworI2RlZmluZSBTVFBfTFBGX0NPRUZGMl9fRkRLIEZMMkZYQ09OU1RfREJMKDAuNDUwZikgICAgICAgICAgLyogMC40NSAqLworI2RlZmluZSBPTkVfTUlOVVNfU1RQX0xQRl9DT0VGRjJfX0ZESyBcCisgIEZMMkZYQ09OU1RfREJMKDEuMGYgLSAwLjQ1MGYpIC8qIDEuMCAtIDAuNDUgKi8KKyNkZWZpbmUgU1RQX1NDQUxFX0xJTUlUX19GREsgXAorICBGTDJGWENPTlNUX0RCTCgyLjgyZiAvIChmbG9hdCkoMSA8PCBTRl9TQ0FMRSkpIC8qIHNjYWxlZCBieSBTRl9TQ0FMRSAqLworI2RlZmluZSBPTkVfRElWX1NUUF9TQ0FMRV9MSU1JVF9fRkRLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTDJGWENPTlNUX0RCTCgxLjBmIC8gMi44MmYgLyAoZmxvYXQpKDEgPDwgU0ZfU0NBTEUpKSAvKiBzY2FsZWQgYnkgU0ZfU0NBTEUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQUJTX1RIUl9fRkRLICAgICAgIFwKKyAgRkwyRlhDT05TVF9EQkwoQUJTX1RIUiAvIFwKKyAgICAgICAgICAgICAgICAgKChmbG9hdCkoMSA8PCAoMjIgKyAyMiAtIDI2KSkpKSAvKiBzY2FsZWQgYnkgMTggYml0cyAqLworI2RlZmluZSBBQlNfVEhSMl9fRkRLICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRkwyRlhDT05TVF9EQkwoQUJTX1RIUiAqIDMyLjBmICogMzIuMGYgLyBcCisgICAgICAgICAgICAgICAgICgoZmxvYXQpKDEgPDwgKDIyICsgMjIgLSAyNikpKSkgLyogc2NhbGVkIGJ5IDEwIGJpdHMgKi8KKyNkZWZpbmUgU1RQX1NDQUxFX0xJTUlUX0hJIFwKKyAgRkwyRlhDT05TVF9EQkwoMy4wMjIyMjIyMjIyMiAvICgxIDw8IFNGX1NDQUxFKSkgLyogc2VlIDQuIGJlbG93ICovCisjZGVmaW5lIFNUUF9TQ0FMRV9MSU1JVF9MTyBcCisgIEZMMkZYQ09OU1RfREJMKDAuMjgyODk5OTIxMTkgLyAoMSA8PCBTRl9TQ0FMRSkpIC8qIHNlZSA0LiBiZWxvdyAqLworI2RlZmluZSBTVFBfU0NBTEVfTElNSVRfSElfTEQ2NCAgICAgICAgICAgICAgICAgXAorICBGTDJGWENPTlNUX0RCTCgwLjA0OTg2MjgwNDUyKSAvKiBzZWUgNC4gYmVsb3cgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1RQX1NDQUxFX0xJTUlUX0xPX0xENjQgICAgICAgICAgICAgICAgIFwKKyAgRkwyRlhDT05TVF9EQkwoMC4wNTY5MjYxMzUwMCkgLyogc2VlIDQuIGJlbG93IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qICBTY2FsZSBmYWN0b3IgY2FsY3VsYXRpb24gZm9yIHRoZSBkaWZmdXNlIHNpZ25hbCBuZWVkcyBhZGFwdGVkIHRocmVzaG9sZHMKKyAgICBmb3IgU1RQX1NDQUxFX0xJTUlUIGFuZCAxL1NUUF9TQ0FMRV9MSU1JVDoKKworICAgIDEuIHNjYWxlID0gc3FydChEcnlOcmcvV2V0TnJnKQorCisgICAgMi4gRGFtcGluZyBvZiBzY2FsZSBmYWN0b3IKKyAgICAgICBzY2FsZTIgPSAwLjEgKyAwLjkgKiBzY2FsZQorCisgICAgMy4gTGltaXRpbmcgb2Ygc2NhbGUgZmFjdG9yCisgICAgICAgICAgU1RQX1NDQUxFX0xJTUlUICAgICAgICAgICA+PSAgICAgICAgc2NhbGUyICAgICAgICA+PSAxL1NUUF9TQ0FMRV9MSU1JVAorICAgICAgID0+IFNUUF9TQ0FMRV9MSU1JVCAgICAgICAgICAgPj0gICgwLjEgKyAwLjkgKiBzY2FsZSkgPj0gMS9TVFBfU0NBTEVfTElNSVQKKyAgICAgICA9PiAoU1RQX1NDQUxFX0xJTUlULTAuMSkvMC45ID49ICAgICAgICBzY2FsZSAgICAgICAgID49CisgICAoMS9TVFBfU0NBTEVfTElNSVQtMC4xKS8wLjkKKworICAgIDMuIExpbWl0aW5nIG9mIHNjYWxlIGZhY3RvciBiZWZvcmUgc3FydCBjYWxjdWxhdGlvbgorICAgICAgICgoU1RQX1NDQUxFX0xJTUlULTAuMSkvMC45KV4yID49IChzY2FsZV4yKSA+PQorICAgKCgxL1NUUF9TQ0FMRV9MSU1JVC0wLjEpLzAuOSleMiAoU1RQX1NDQUxFX0xJTUlUX0hJKV4yICAgICAgICA+PSAoc2NhbGVeMikgPj0KKyAgIChTVFBfU0NBTEVfTElNSVRfTE8pXjIKKworICAgIDQuIFRocmVzaG9sZHMgZm9yIGxpbWl0aW5nIG9mIHNjYWxlIGZhY3RvcgorICAgICAgIFNUUF9TQ0FMRV9MSU1JVF9ISSAgICAgID0gKCgyLjgyLTAuMSkvMC45KQorICAgICAgIFNUUF9TQ0FMRV9MSU1JVF9MTyAgICAgID0gKCgoMS4wLzIuODIpLTAuMSkvMC45KQorICAgICAgIFNUUF9TQ0FMRV9MSU1JVF9ISV9MRDY0ID0gTEQ2NChTVFBfU0NBTEVfTElNSVRfSEkqU1RQX1NDQUxFX0xJTUlUX0hJKQorICAgICAgIFNUUF9TQ0FMRV9MSU1JVF9MT19MRDY0ID0gTEQ2NChTVFBfU0NBTEVfTElNSVRfTE8qU1RQX1NDQUxFX0xJTUlUX0xPKQorKi8KKworI2RlZmluZSBEUllfRU5FUl9XRUlHSFQoRHJ5RW5lcikgRHJ5RW5lciA9IERyeUVuZXIgPj4gZHJ5X3NjYWxlX2RteAorCisjZGVmaW5lIFdFVF9FTkVSX1dFSUdIVChXZXRFbmVyKSBXZXRFbmVyID0gV2V0RW5lciA8PCB3ZXRfc2NhbGVfZG14CisKKyNkZWZpbmUgRFJZX0VORVJfU1VNX1JFQUwoRHJ5RW5lciwgZG14UmVhbCwgbikgXAorICBEcnlFbmVyICs9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmTXVsdERpdjIoZlBvdzJEaXYyKGRteFJlYWwgPDwgU0ZfRFJZKSwgcEJQW25dKSA+PiAoKDIgKiBTRl9EUlkpIC0gMikKKworI2RlZmluZSBEUllfRU5FUl9TVU1fQ1BMWChEcnlFbmVyLCBkbXhSZWFsLCBkbXhJbWFnLCBuKSBcCisgIERyeUVuZXIgKz0gZk11bHREaXYyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZQb3cyRGl2MihkbXhSZWFsIDw8IFNGX0RSWSkgKyBmUG93MkRpdjIoZG14SW1hZyA8PCBTRl9EUlkpLCBwQlBbbl0pCisKKyNkZWZpbmUgQ0FMQ19XRVRfU0NBTEUoZHJ5SWR4LCB3ZXRJZHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgoRHJ5RW5lckxENjRbZHJ5SWR4XSAtIFNUUF9TQ0FMRV9MSU1JVF9ISV9MRDY0KSA+IFdldEVuZXJMRDY0W3dldElkeF0pIHsgXAorICAgIHNjYWxlW3dldElkeF0gPSBTVFBfU0NBTEVfTElNSVRfSEk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIGlmIChEcnlFbmVyTEQ2NFtkcnlJZHhdIDwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKFdldEVuZXJMRDY0W3dldElkeF0gLSBTVFBfU0NBTEVfTElNSVRfTE9fTEQ2NCkpIHsgICAgICAgICAgICAgICAgXAorICAgIHNjYWxlW3dldElkeF0gPSBTVFBfU0NBTEVfTElNSVRfTE87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG1wID0gKChEcnlFbmVyTEQ2NFtkcnlJZHhdIC0gV2V0RW5lckxENjRbd2V0SWR4XSkgPj4gMSkgLSBTRl9TQ0FMRV9MRDY0OyAgXAorICAgIHNjYWxlW3dldElkeF0gPSBDYWxjSW52TGREYXRhKHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitzdHJ1Y3QgU1RQX0RFQyB7CisgIEZJWFBfREJMIHJ1bkRyeUVuZXJbTUFYX0lOUFVUX0NIQU5ORUxTXTsKKyAgRklYUF9EQkwgcnVuV2V0RW5lcltNQVhfT1VUUFVUX0NIQU5ORUxTXTsKKyAgRklYUF9EQkwgb2xkRHJ5RW5lckxENjRbTUFYX0lOUFVUX0NIQU5ORUxTXTsKKyAgRklYUF9EQkwgb2xkV2V0RW5lckxENjRbTUFYX09VVFBVVF9DSEFOTkVMU107CisgIEZJWFBfREJMIHByZXZfdHBfc2NhbGVbTUFYX09VVFBVVF9DSEFOTkVMU107CisgIGNvbnN0IEZJWFBfQ0ZHICpCUDsKKyAgY29uc3QgRklYUF9DRkcgKkJQX0dGOworICBpbnQgdXBkYXRlX29sZF9lbmVyOworfTsKKworaW5saW5lIHZvaWQgY29tYmluZVNpZ25hbFJlYWwoRklYUF9EQkwgKmh5Yk91dHB1dFJlYWxEcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqaHliT3V0cHV0UmVhbFdldCwgaW50IGJhbmRzKSB7CisgIGludCBuOworCisgIGZvciAobiA9IGJhbmRzIC0gMTsgbiA+PSAwOyBuLS0pIHsKKyAgICAqaHliT3V0cHV0UmVhbERyeSA9ICpoeWJPdXRwdXRSZWFsRHJ5ICsgKmh5Yk91dHB1dFJlYWxXZXQ7CisgICAgaHliT3V0cHV0UmVhbERyeSsrLCBoeWJPdXRwdXRSZWFsV2V0Kys7CisgIH0KK30KKworaW5saW5lIHZvaWQgY29tYmluZVNpZ25hbFJlYWxTY2FsZTEoRklYUF9EQkwgKmh5Yk91dHB1dFJlYWxEcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqaHliT3V0cHV0UmVhbFdldCwgRklYUF9EQkwgc2NhbGVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhbmRzKSB7CisgIGludCBuOworCisgIGZvciAobiA9IGJhbmRzIC0gMTsgbiA+PSAwOyBuLS0pIHsKKyAgICAqaHliT3V0cHV0UmVhbERyeSA9CisgICAgICAgICpoeWJPdXRwdXRSZWFsRHJ5ICsKKyAgICAgICAgKGZNdWx0RGl2MigqaHliT3V0cHV0UmVhbFdldCwgc2NhbGVYKSA8PCAoU0ZfU0NBTEUgKyAxKSk7CisgICAgaHliT3V0cHV0UmVhbERyeSsrLCBoeWJPdXRwdXRSZWFsV2V0Kys7CisgIH0KK30KKworaW5saW5lIHZvaWQgY29tYmluZVNpZ25hbENwbHgoRklYUF9EQkwgKmh5Yk91dHB1dFJlYWxEcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqaHliT3V0cHV0SW1hZ0RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpoeWJPdXRwdXRSZWFsV2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmh5Yk91dHB1dEltYWdXZXQsIGludCBiYW5kcykgeworICBpbnQgbjsKKworICBmb3IgKG4gPSBiYW5kcyAtIDE7IG4gPj0gMDsgbi0tKSB7CisgICAgKmh5Yk91dHB1dFJlYWxEcnkgPSAqaHliT3V0cHV0UmVhbERyeSArICpoeWJPdXRwdXRSZWFsV2V0OworICAgICpoeWJPdXRwdXRJbWFnRHJ5ID0gKmh5Yk91dHB1dEltYWdEcnkgKyAqaHliT3V0cHV0SW1hZ1dldDsKKyAgICBoeWJPdXRwdXRSZWFsRHJ5KyssIGh5Yk91dHB1dFJlYWxXZXQrKzsKKyAgICBoeWJPdXRwdXRJbWFnRHJ5KyssIGh5Yk91dHB1dEltYWdXZXQrKzsKKyAgfQorfQorCitpbmxpbmUgdm9pZCBjb21iaW5lU2lnbmFsQ3BseFNjYWxlMShGSVhQX0RCTCAqaHliT3V0cHV0UmVhbERyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpoeWJPdXRwdXRJbWFnRHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmh5Yk91dHB1dFJlYWxXZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqaHliT3V0cHV0SW1hZ1dldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfQ0ZHICpwQlAsIEZJWFBfREJMIHNjYWxlWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiYW5kcykgeworICBpbnQgbjsKKyAgRklYUF9EQkwgc2NhbGVZOworICBmb3IgKG4gPSBiYW5kcyAtIDE7IG4gPj0gMDsgbi0tKSB7CisgICAgc2NhbGVZID0gZk11bHREaXYyKHNjYWxlWCwgKnBCUCk7CisgICAgKmh5Yk91dHB1dFJlYWxEcnkgPQorICAgICAgICAqaHliT3V0cHV0UmVhbERyeSArCisgICAgICAgIChmTXVsdERpdjIoKmh5Yk91dHB1dFJlYWxXZXQsIHNjYWxlWSkgPDwgKFNGX1NDQUxFICsgMikpOworICAgICpoeWJPdXRwdXRJbWFnRHJ5ID0KKyAgICAgICAgKmh5Yk91dHB1dEltYWdEcnkgKworICAgICAgICAoZk11bHREaXYyKCpoeWJPdXRwdXRJbWFnV2V0LCBzY2FsZVkpIDw8IChTRl9TQ0FMRSArIDIpKTsKKyAgICBoeWJPdXRwdXRSZWFsRHJ5KyssIGh5Yk91dHB1dFJlYWxXZXQrKzsKKyAgICBoeWJPdXRwdXRJbWFnRHJ5KyssIGh5Yk91dHB1dEltYWdXZXQrKzsKKyAgICBwQlArKzsKKyAgfQorfQorCitpbmxpbmUgdm9pZCBjb21iaW5lU2lnbmFsQ3BseFNjYWxlMihGSVhQX0RCTCAqaHliT3V0cHV0UmVhbERyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpoeWJPdXRwdXRJbWFnRHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmh5Yk91dHB1dFJlYWxXZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqaHliT3V0cHV0SW1hZ1dldCwgRklYUF9EQkwgc2NhbGVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhbmRzKSB7CisgIGludCBuOworCisgIGZvciAobiA9IGJhbmRzIC0gMTsgbiA+PSAwOyBuLS0pIHsKKyAgICAqaHliT3V0cHV0UmVhbERyeSA9CisgICAgICAgICpoeWJPdXRwdXRSZWFsRHJ5ICsKKyAgICAgICAgKGZNdWx0RGl2MigqaHliT3V0cHV0UmVhbFdldCwgc2NhbGVYKSA8PCAoU0ZfU0NBTEUgKyAxKSk7CisgICAgKmh5Yk91dHB1dEltYWdEcnkgPQorICAgICAgICAqaHliT3V0cHV0SW1hZ0RyeSArCisgICAgICAgIChmTXVsdERpdjIoKmh5Yk91dHB1dEltYWdXZXQsIHNjYWxlWCkgPDwgKFNGX1NDQUxFICsgMSkpOworICAgIGh5Yk91dHB1dFJlYWxEcnkrKywgaHliT3V0cHV0UmVhbFdldCsrOworICAgIGh5Yk91dHB1dEltYWdEcnkrKywgaHliT3V0cHV0SW1hZ1dldCsrOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBzdWJiYW5kVFBDcmVhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTQUNERUNfRVJST1Igc3ViYmFuZFRQQ3JlYXRlKEhBTkRMRV9TVFBfREVDICpoU3RwRGVjKSB7CisgIEhBTkRMRV9TVFBfREVDIHNlbGYgPSBOVUxMOworICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKHNlbGYsIDEsIHN0cnVjdCBTVFBfREVDKQorICBpZiAoaFN0cERlYyAhPSBOVUxMKSB7CisgICAgKmhTdHBEZWMgPSBzZWxmOworICB9CisKKyAgcmV0dXJuIE1QU19PSzsKK2JhaWw6CisgIHJldHVybiBNUFNfT1VUT0ZNRU1PUlk7Cit9CisKK1NBQ0RFQ19FUlJPUiBzdWJiYW5kVFBJbml0KEhBTkRMRV9TVFBfREVDIHNlbGYpIHsKKyAgU0FDREVDX0VSUk9SIGVyciA9IE1QU19PSzsKKyAgaW50IGNoOworCisgIGZvciAoY2ggPSAwOyBjaCA8IE1BWF9PVVRQVVRfQ0hBTk5FTFM7IGNoKyspIHsKKyAgICBzZWxmLT5wcmV2X3RwX3NjYWxlW2NoXSA9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAoMSA8PCBTRl9TQ0FMRSkpOworICAgIHNlbGYtPm9sZFdldEVuZXJMRDY0W2NoXSA9CisgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMzQzNzVmKTsgLyogMzI3NjguMCozMjc2OC4wLzJeKDQ0LTI2LTEwKSAqLworICB9CisgIGZvciAoY2ggPSAwOyBjaCA8IE1BWF9JTlBVVF9DSEFOTkVMUzsgY2grKykgeworICAgIHNlbGYtPm9sZERyeUVuZXJMRDY0W2NoXSA9CisgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMTg3NWYpOyAvKiAzMjc2OC4wKjMyNzY4LjAvMl4oNDQtMjYpICovCisgIH0KKworICBzZWxmLT5CUCA9IEJQX19GREs7CisgIHNlbGYtPkJQX0dGID0gQlBfR0ZfX0ZESzsKKworICBzZWxmLT51cGRhdGVfb2xkX2VuZXIgPSAwOworCisgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBzdWJiYW5kVFBEZXN0cm95CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzdWJiYW5kVFBEZXN0cm95KEhBTkRMRV9TVFBfREVDICpoU3RwRGVjKSB7CisgIGlmIChoU3RwRGVjICE9IE5VTEwpIHsKKyAgICBGREtfRlJFRV9NRU1PUllfMUQoKmhTdHBEZWMpOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb25uYW1lOiBzdWJiYW5kVFBBcHBseQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NBQ0RFQ19FUlJPUiBzdWJiYW5kVFBBcHBseShzcGF0aWFsRGVjICpzZWxmLCBjb25zdCBTUEFUSUFMX0JTX0ZSQU1FICpmcmFtZSkgeworICBGSVhQX0RCTCAqcW1mT3V0cHV0UmVhbERyeVtNQVhfT1VUUFVUX0NIQU5ORUxTXTsKKyAgRklYUF9EQkwgKnFtZk91dHB1dEltYWdEcnlbTUFYX09VVFBVVF9DSEFOTkVMU107CisgIEZJWFBfREJMICpxbWZPdXRwdXRSZWFsV2V0W01BWF9PVVRQVVRfQ0hBTk5FTFNdOworICBGSVhQX0RCTCAqcW1mT3V0cHV0SW1hZ1dldFtNQVhfT1VUUFVUX0NIQU5ORUxTXTsKKworICBGSVhQX0RCTCBEcnlFbmVyW01BWF9JTlBVVF9DSEFOTkVMU107CisgIEZJWFBfREJMIHNjYWxlW01BWF9PVVRQVVRfQ0hBTk5FTFNdOworCisgIEZJWFBfREJMIERyeUVuZXJMRDY0W01BWF9JTlBVVF9DSEFOTkVMU107CisgIEZJWFBfREJMIFdldEVuZXJMRDY0W01BWF9PVVRQVVRfQ0hBTk5FTFNdOworCisgIEZJWFBfREJMIERyeUVuZXIwID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgIEZJWFBfREJMIFdldEVuZXJYLCBkYW1wLCB0bXA7CisgIEZJWFBfREJMIGRteFJlYWwwLCBkbXhJbWFnMDsKKyAgaW50IHNraXBDaGFubmVsc1tNQVhfT1VUUFVUX0NIQU5ORUxTXTsKKyAgaW50IG4sIGNoLCBjcGx4QmFuZHMsIGNwbHhIeWJCYW5kczsKKyAgaW50IGRyeV9zY2FsZV9kbXgsIHdldF9zY2FsZV9kbXg7CisgIGludCBpX0xGLCBpX1JGOworICBIQU5ETEVfU1RQX0RFQyBoU3RwRGVjOworICBjb25zdCBGSVhQX0NGRyAqcEJQOworCisgIGludCBucmdTY2FsZSA9ICgyICogc2VsZi0+Y2xpcFByb3RlY3RHYWluU0ZfX0ZESyk7CisKKyAgaFN0cERlYyA9IHNlbGYtPmhTdHBEZWM7CisKKyAgLyogc2V0IHNjYWxlZmFjdG9yIGFuZCBsb29wIGNvdW50ZXIgKi8KKyAgRkRLX0FTU0VSVChTRl9EUlkgPj0gMSk7CisgIHsKKyAgICBjcGx4QmFuZHMgPSBCUF9HRl9TSVpFOworICAgIGNwbHhIeWJCYW5kcyA9IHNlbGYtPmh5YnJpZEJhbmRzOworICAgIGRyeV9zY2FsZV9kbXggPSAoMiAqIFNGX0RSWSkgLSAyOworICAgIHdldF9zY2FsZV9kbXggPSAyOworICB9CisKKyAgLyogc2V0dXAgcG9pbnRlciBmb3IgZm9ybWluZyB0aGUgZGlyZWN0IGRvd25taXggc2lnbmFsICovCisgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPm51bU91dHB1dENoYW5uZWxzOyBjaCsrKSB7CisgICAgcW1mT3V0cHV0UmVhbERyeVtjaF0gPSAmc2VsZi0+aHliT3V0cHV0UmVhbERyeV9fRkRLW2NoXVs3XTsKKyAgICBxbWZPdXRwdXRSZWFsV2V0W2NoXSA9ICZzZWxmLT5oeWJPdXRwdXRSZWFsV2V0X19GREtbY2hdWzddOworICAgIHFtZk91dHB1dEltYWdEcnlbY2hdID0gJnNlbGYtPmh5Yk91dHB1dEltYWdEcnlfX0ZES1tjaF1bN107CisgICAgcW1mT3V0cHV0SW1hZ1dldFtjaF0gPSAmc2VsZi0+aHliT3V0cHV0SW1hZ1dldF9fRkRLW2NoXVs3XTsKKyAgfQorCisgIC8qIGNsZWFyIHNraXBwaW5nIGZsYWcgZm9yIGFsbCBvdXRwdXQgY2hhbm5lbHMgKi8KKyAgRkRLbWVtc2V0KHNraXBDaGFubmVscywgMCwgc2VsZi0+bnVtT3V0cHV0Q2hhbm5lbHMgKiBzaXplb2YoaW50KSk7CisKKyAgLyogc2V0IHNjYWxlIHZhbHVlcyB0byB6ZXJvICovCisgIEZES21lbXNldChzY2FsZSwgMCwgc2VsZi0+bnVtT3V0cHV0Q2hhbm5lbHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKworICAvKiB1cGRhdGUgbm9ybWFsaXNhdGlvbiBlbmVyZ3kgd2l0aCBsYXRlc3Qgc21vb3RoZWQgZW5lcmd5ICovCisgIGlmIChoU3RwRGVjLT51cGRhdGVfb2xkX2VuZXIgPT0gU1RQX1VQREFURV9FTkVSR1lfUkFURSkgeworICAgIGhTdHBEZWMtPnVwZGF0ZV9vbGRfZW5lciA9IDE7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgc2VsZi0+bnVtSW5wdXRDaGFubmVsczsgY2grKykgeworICAgICAgaFN0cERlYy0+b2xkRHJ5RW5lckxENjRbY2hdID0KKyAgICAgICAgICBDYWxjTGREYXRhKGhTdHBEZWMtPnJ1bkRyeUVuZXJbY2hdICsgQUJTX1RIUl9fRkRLKTsKKyAgICB9CisgICAgZm9yIChjaCA9IDA7IGNoIDwgc2VsZi0+bnVtT3V0cHV0Q2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIGhTdHBEZWMtPm9sZFdldEVuZXJMRDY0W2NoXSA9CisgICAgICAgICAgQ2FsY0xkRGF0YShoU3RwRGVjLT5ydW5XZXRFbmVyW2NoXSArIEFCU19USFIyX19GREspOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBoU3RwRGVjLT51cGRhdGVfb2xkX2VuZXIrKzsKKyAgfQorCisgIC8qIGdldCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKi8KKyAgc3dpdGNoIChzZWxmLT50cmVlQ29uZmlnKSB7CisgICAgY2FzZSBUUkVFXzIxMjoKKyAgICAgIGlfTEYgPSAwOworICAgICAgaV9SRiA9IDE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE1QU19XUk9OR19UUkVFQ09ORklHOworICB9CisKKyAgLyogZm9ybSB0aGUgJ2RpcmVjdCcgZG93bm1peCBzaWduYWwgKi8KKyAgcEJQID0gaFN0cERlYy0+QlBfR0YgLSBCUF9HRl9TVEFSVDsKKyAgc3dpdGNoIChzZWxmLT50cmVlQ29uZmlnKSB7CisgICAgY2FzZSBUUkVFXzIxMjoKKyAgICAgIGZvciAobiA9IEJQX0dGX1NUQVJUOyBuIDwgY3BseEJhbmRzOyBuKyspIHsKKyAgICAgICAgZG14UmVhbDAgPSBxbWZPdXRwdXRSZWFsRHJ5W2lfTEZdW25dICsgcW1mT3V0cHV0UmVhbERyeVtpX1JGXVtuXTsKKyAgICAgICAgZG14SW1hZzAgPSBxbWZPdXRwdXRJbWFnRHJ5W2lfTEZdW25dICsgcW1mT3V0cHV0SW1hZ0RyeVtpX1JGXVtuXTsKKyAgICAgICAgRFJZX0VORVJfU1VNX0NQTFgoRHJ5RW5lcjAsIGRteFJlYWwwLCBkbXhJbWFnMCwgbik7CisgICAgICB9CisgICAgICBEUllfRU5FUl9XRUlHSFQoRHJ5RW5lcjApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDo7CisgIH0KKyAgRHJ5RW5lclswXSA9IERyeUVuZXIwOworCisgIC8qIG5vcm1hbGlzZSB0aGUgJ2RpcmVjdCcgc2lnbmFscyAqLworICBmb3IgKGNoID0gMDsgY2ggPCBzZWxmLT5udW1JbnB1dENoYW5uZWxzOyBjaCsrKSB7CisgICAgRHJ5RW5lcltjaF0gPSBEcnlFbmVyW2NoXSA8PCAobnJnU2NhbGUpOworICAgIGhTdHBEZWMtPnJ1bkRyeUVuZXJbY2hdID0KKyAgICAgICAgZk11bHQoU1RQX0xQRl9DT0VGRjFfX0ZESywgaFN0cERlYy0+cnVuRHJ5RW5lcltjaF0pICsKKyAgICAgICAgZk11bHQoT05FX01JTlVTX1NUUF9MUEZfQ09FRkYxX19GREssIERyeUVuZXJbY2hdKTsKKyAgICBpZiAoRHJ5RW5lcltjaF0gIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgIERyeUVuZXJMRDY0W2NoXSA9CisgICAgICAgICAgZml4TWF4KChDYWxjTGREYXRhKERyeUVuZXJbY2hdKSAtIGhTdHBEZWMtPm9sZERyeUVuZXJMRDY0W2NoXSksCisgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKC0wLjQ4NDM3NWYpKTsKKyAgICB9IGVsc2UgeworICAgICAgRHJ5RW5lckxENjRbY2hdID0gRkwyRlhDT05TVF9EQkwoLTAuNDg0Mzc1Zik7CisgICAgfQorICB9CisgIGlmIChzZWxmLT50cmVlQ29uZmlnID09IFRSRUVfMjEyKSB7CisgICAgZm9yICg7IGNoIDwgTUFYX0lOUFVUX0NIQU5ORUxTOyBjaCsrKSB7CisgICAgICBEcnlFbmVyTEQ2NFtjaF0gPSBGTDJGWENPTlNUX0RCTCgtMC40ODQzNzVmKTsKKyAgICB9CisgIH0KKworICAvKiBub3JtYWxpc2UgdGhlICdkaWZmdXNlJyBzaWduYWxzICovCisgIHBCUCA9IGhTdHBEZWMtPkJQX0dGIC0gQlBfR0ZfU1RBUlQ7CisgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPm51bU91dHB1dENoYW5uZWxzOyBjaCsrKSB7CisgICAgaWYgKHNraXBDaGFubmVsc1tjaF0pIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIFdldEVuZXJYID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgZm9yIChuID0gQlBfR0ZfU1RBUlQ7IG4gPCBjcGx4QmFuZHM7IG4rKykgeworICAgICAgdG1wID0gZlBvdzJEaXYyKHFtZk91dHB1dFJlYWxXZXRbY2hdW25dIDw8IFNGX1dFVCk7CisgICAgICB0bXAgKz0gZlBvdzJEaXYyKHFtZk91dHB1dEltYWdXZXRbY2hdW25dIDw8IFNGX1dFVCk7CisgICAgICBXZXRFbmVyWCArPSBmTXVsdERpdjIodG1wLCBwQlBbbl0pOworICAgIH0KKyAgICBXRVRfRU5FUl9XRUlHSFQoV2V0RW5lclgpOworCisgICAgV2V0RW5lclggPSBXZXRFbmVyWCA8PCAobnJnU2NhbGUpOworICAgIGhTdHBEZWMtPnJ1bldldEVuZXJbY2hdID0KKyAgICAgICAgZk11bHQoU1RQX0xQRl9DT0VGRjFfX0ZESywgaFN0cERlYy0+cnVuV2V0RW5lcltjaF0pICsKKyAgICAgICAgZk11bHQoT05FX01JTlVTX1NUUF9MUEZfQ09FRkYxX19GREssIFdldEVuZXJYKTsKKworICAgIGlmIChXZXRFbmVyWCA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgV2V0RW5lckxENjRbY2hdID0gRkwyRlhDT05TVF9EQkwoLTAuNDg0Mzc1Zik7CisgICAgfSBlbHNlIHsKKyAgICAgIFdldEVuZXJMRDY0W2NoXSA9CisgICAgICAgICAgZml4TWF4KChDYWxjTGREYXRhKFdldEVuZXJYKSAtIGhTdHBEZWMtPm9sZFdldEVuZXJMRDY0W2NoXSksCisgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKC0wLjQ4NDM3NWYpKTsKKyAgICB9CisgIH0KKworICAvKiBjb21wdXRlIHNjYWxlIGZhY3RvciBmb3IgdGhlICdkaWZmdXNlJyBzaWduYWxzICovCisgIHN3aXRjaCAoc2VsZi0+dHJlZUNvbmZpZykgeworICAgIGNhc2UgVFJFRV8yMTI6CisgICAgICBpZiAoRHJ5RW5lclswXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgICBDQUxDX1dFVF9TQ0FMRSgwLCBpX0xGKTsKKyAgICAgICAgQ0FMQ19XRVRfU0NBTEUoMCwgaV9SRik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OjsKKyAgfQorCisgIGRhbXAgPSBGTDJGWENPTlNUX0RCTCgwLjFmIC8gKDEgPDwgU0ZfU0NBTEUpKTsKKyAgZm9yIChjaCA9IDA7IGNoIDwgc2VsZi0+bnVtT3V0cHV0Q2hhbm5lbHM7IGNoKyspIHsKKyAgICAvKiBkYW1wIHRoZSBzY2FsaW5nIGZhY3RvciAqLworICAgIHNjYWxlW2NoXSA9IGRhbXAgKyBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjlmKSwgc2NhbGVbY2hdKTsKKworICAgIC8qIGxpbWl0aW5nIHRoZSBzY2FsZSBmYWN0b3IgKi8KKyAgICBpZiAoc2NhbGVbY2hdID4gU1RQX1NDQUxFX0xJTUlUX19GREspIHsKKyAgICAgIHNjYWxlW2NoXSA9IFNUUF9TQ0FMRV9MSU1JVF9fRkRLOworICAgIH0KKyAgICBpZiAoc2NhbGVbY2hdIDwgT05FX0RJVl9TVFBfU0NBTEVfTElNSVRfX0ZESykgeworICAgICAgc2NhbGVbY2hdID0gT05FX0RJVl9TVFBfU0NBTEVfTElNSVRfX0ZESzsKKyAgICB9CisKKyAgICAvKiBsb3cgcGFzcyBmaWx0ZXIgdGhlIHNjYWxpbmcgZmFjdG9yICovCisgICAgc2NhbGVbY2hdID0KKyAgICAgICAgZk11bHQoU1RQX0xQRl9DT0VGRjJfX0ZESywgc2NhbGVbY2hdKSArCisgICAgICAgIGZNdWx0KE9ORV9NSU5VU19TVFBfTFBGX0NPRUZGMl9fRkRLLCBoU3RwRGVjLT5wcmV2X3RwX3NjYWxlW2NoXSk7CisgICAgaFN0cERlYy0+cHJldl90cF9zY2FsZVtjaF0gPSBzY2FsZVtjaF07CisgIH0KKworICAvKiBjb21iaW5lICdkaXJlY3QnIGFuZCBzY2FsZWQgJ2RpZmZ1c2UnIHNpZ25hbCAqLworICBGREtfQVNTRVJUKChIUF9TSVpFIC0gMyArIDEwIC0gMSkgPT0gUENfTlVNX0hZQl9CQU5EUyk7CisgIGNvbnN0IFNDSEFSICpjaGFubmxJbmRleCA9IHJvdzJjaGFubmVsU1RQW3NlbGYtPnRyZWVDb25maWddOworCisgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPm51bU91dHB1dENoYW5uZWxzOyBjaCsrKSB7CisgICAgaW50IG5vX3NjYWxpbmc7CisKKyAgICBub19zY2FsaW5nID0gIWZyYW1lLT50ZW1wU2hhcGVFbmFibGVDaGFubmVsU1RQW2NoYW5ubEluZGV4W2NoXV07CisgICAgaWYgKG5vX3NjYWxpbmcpIHsKKyAgICAgIGNvbWJpbmVTaWduYWxDcGx4KAorICAgICAgICAgICZzZWxmLT5oeWJPdXRwdXRSZWFsRHJ5X19GREtbY2hdW3NlbGYtPnRwX2h5YkJhbmRCb3JkZXJdLAorICAgICAgICAgICZzZWxmLT5oeWJPdXRwdXRJbWFnRHJ5X19GREtbY2hdW3NlbGYtPnRwX2h5YkJhbmRCb3JkZXJdLAorICAgICAgICAgICZzZWxmLT5oeWJPdXRwdXRSZWFsV2V0X19GREtbY2hdW3NlbGYtPnRwX2h5YkJhbmRCb3JkZXJdLAorICAgICAgICAgICZzZWxmLT5oeWJPdXRwdXRJbWFnV2V0X19GREtbY2hdW3NlbGYtPnRwX2h5YkJhbmRCb3JkZXJdLAorICAgICAgICAgIGNwbHhIeWJCYW5kcyAtIHNlbGYtPnRwX2h5YkJhbmRCb3JkZXIpOworCisgICAgfSBlbHNlIHsKKyAgICAgIEZJWFBfREJMIHNjYWxlWDsKKyAgICAgIHNjYWxlWCA9IHNjYWxlW2NoXTsKKyAgICAgIHBCUCA9IGhTdHBEZWMtPkJQIC0gc2VsZi0+dHBfaHliQmFuZEJvcmRlcjsKKyAgICAgIC8qIEJhbmRbSFBfU0laRS0zKzEwLTFdIG5lZWRzIG5vdCB0byBiZSBwcm9jZXNzZWQgaW4KKyAgICAgICAgIGNvbWJpbmVTaWduYWxDcGx4U2NhbGUxKCksIGJlY2F1c2UgcEJbSFBfU0laRS0zKzEwLTFdIHdvdWxkIGJlIDEuMCAqLworICAgICAgY29tYmluZVNpZ25hbENwbHhTY2FsZTEoCisgICAgICAgICAgJnNlbGYtPmh5Yk91dHB1dFJlYWxEcnlfX0ZES1tjaF1bc2VsZi0+dHBfaHliQmFuZEJvcmRlcl0sCisgICAgICAgICAgJnNlbGYtPmh5Yk91dHB1dEltYWdEcnlfX0ZES1tjaF1bc2VsZi0+dHBfaHliQmFuZEJvcmRlcl0sCisgICAgICAgICAgJnNlbGYtPmh5Yk91dHB1dFJlYWxXZXRfX0ZES1tjaF1bc2VsZi0+dHBfaHliQmFuZEJvcmRlcl0sCisgICAgICAgICAgJnNlbGYtPmh5Yk91dHB1dEltYWdXZXRfX0ZES1tjaF1bc2VsZi0+dHBfaHliQmFuZEJvcmRlcl0sCisgICAgICAgICAgJnBCUFtzZWxmLT50cF9oeWJCYW5kQm9yZGVyXSwgc2NhbGVYLAorICAgICAgICAgIChIUF9TSVpFIC0gMyArIDEwIC0gMSkgLSBzZWxmLT50cF9oeWJCYW5kQm9yZGVyKTsKKworICAgICAgeworICAgICAgICBjb21iaW5lU2lnbmFsQ3BseFNjYWxlMigKKyAgICAgICAgICAgICZzZWxmLT5oeWJPdXRwdXRSZWFsRHJ5X19GREtbY2hdW0hQX1NJWkUgLSAzICsgMTAgLSAxXSwKKyAgICAgICAgICAgICZzZWxmLT5oeWJPdXRwdXRJbWFnRHJ5X19GREtbY2hdW0hQX1NJWkUgLSAzICsgMTAgLSAxXSwKKyAgICAgICAgICAgICZzZWxmLT5oeWJPdXRwdXRSZWFsV2V0X19GREtbY2hdW0hQX1NJWkUgLSAzICsgMTAgLSAxXSwKKyAgICAgICAgICAgICZzZWxmLT5oeWJPdXRwdXRJbWFnV2V0X19GREtbY2hdW0hQX1NJWkUgLSAzICsgMTAgLSAxXSwgc2NhbGVYLAorICAgICAgICAgICAgY3BseEh5YkJhbmRzIC0gKEhQX1NJWkUgLSAzICsgMTAgLSAxKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIChTQUNERUNfRVJST1IpTVBTX09LOworICA7Cit9CmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY19zdHAuaCBiL2xpYlNBQ2RlYy9zcmMvc2FjX3N0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NDcxYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY19zdHAuaApAQCAtMCwwICsxLDExNSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBTQUMgRGVjIHN1YmJhbmQgcHJvY2Vzc2luZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNBQ19TVFBfSAorI2RlZmluZSBTQUNfU1RQX0gKKworI2luY2x1ZGUgInNhY19kZWMuaCIKKworU0FDREVDX0VSUk9SIHN1YmJhbmRUUENyZWF0ZShIQU5ETEVfU1RQX0RFQyAqaFN0cERlYyk7CisKK1NBQ0RFQ19FUlJPUiBzdWJiYW5kVFBJbml0KEhBTkRMRV9TVFBfREVDIHNlbGYpOworCitTQUNERUNfRVJST1Igc3ViYmFuZFRQQXBwbHkoc3BhdGlhbERlYyAqc2VsZiwgY29uc3QgU1BBVElBTF9CU19GUkFNRSAqZnJhbWUpOwordm9pZCBzdWJiYW5kVFBEZXN0cm95KEhBTkRMRV9TVFBfREVDICpoU3RwRGVjKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY190c2QuY3BwIGIvbGliU0FDZGVjL3NyYy9zYWNfdHNkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGFjY2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZGVjL3NyYy9zYWNfdHNkLmNwcApAQCAtMCwwICsxLDM1MyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWF0dGhpYXMgSGlsZGVuYnJhbmQKKworICAgRGVzY3JpcHRpb246IFVTQUMgTVBTMjEyIFRyYW5zaWVudCBTdGVlcmluZyBEZWNvcnJlbGF0b3IgKFRTRCkKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInNhY190c2QuaCIKKworI2RlZmluZSBUU0RfU1RBUlRfQkFORCAoNykKKyNkZWZpbmUgU0laRV9TICg0KQorI2RlZmluZSBTSVpFX0MgKDUpCisKKy8qKiogVGFibGVzICoqKi8KK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitzdGF0aWMgY29uc3QgVUNIQVIgbkJpdHNUc2RDV18zMnNsb3RzWzMyXSA9IHsKKyAgICA1LCAgOSwgIDEzLCAxNiwgMTgsIDIwLCAyMiwgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMjksIDMwLCAzMCwKKyAgICAzMCwgMjksIDI5LCAyOCwgMjcsIDI2LCAyNSwgMjQsIDIyLCAyMCwgMTgsIDE2LCAxMywgOSwgIDUsICAwfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK3N0YXRpYyBjb25zdCBVQ0hBUiBuQml0c1RzZENXXzY0c2xvdHNbNjRdID0geworICAgIDYsICAxMSwgMTYsIDIwLCAyMywgMjcsIDMwLCAzMywgMzUsIDM4LCA0MCwgNDIsIDQ0LCA0NiwgNDgsIDQ5LAorICAgIDUxLCA1MiwgNTMsIDU1LCA1NiwgNTcsIDU4LCA1OCwgNTksIDYwLCA2MCwgNjAsIDYxLCA2MSwgNjEsIDYxLAorICAgIDYxLCA2MSwgNjEsIDYwLCA2MCwgNjAsIDU5LCA1OCwgNTgsIDU3LCA1NiwgNTUsIDUzLCA1MiwgNTEsIDQ5LAorICAgIDQ4LCA0NiwgNDQsIDQyLCA0MCwgMzgsIDM1LCAzMywgMzAsIDI3LCAyMywgMjAsIDE2LCAxMSwgNiwgIDB9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorc3RhdGljIGNvbnN0IEZJWFBfU1RQIHBoaVRzZFs4XSA9IHsKKyAgICBTVENQKDB4N2ZmZmZmZmYsIDB4MDAwMDAwMDApLCBTVENQKDB4NWE4Mjc5OWEsIDB4NWE4Mjc5OWEpLAorICAgIFNUQ1AoMHgwMDAwMDAwMCwgMHg3ZmZmZmZmZiksIFNUQ1AoMHhhNTdkODY2NiwgMHg1YTgyNzk5YSksCisgICAgU1RDUCgweDgwMDAwMDAwLCAweDAwMDAwMDAwKSwgU1RDUCgweGE1N2Q4NjY2LCAweGE1N2Q4NjY2KSwKKyAgICBTVENQKDB4MDAwMDAwMDAsIDB4ODAwMDAwMDApLCBTVENQKDB4NWE4Mjc5OWEsIDB4YTU3ZDg2NjYpLAorfTsKKworLyoqKiBTdGF0aWMgRnVuY3Rpb25zICoqKi8KK3N0YXRpYyB2b2lkIGxvbmdtdWx0MShVU0hPUlQgYVtdLCBVU0hPUlQgYiwgVVNIT1JUIGRbXSwgaW50IGxlbikgeworICBpbnQgazsKKyAgVUxPTkcgdG1wOworICBVTE9ORyBiMCA9IChVTE9ORyliOworCisgIHRtcCA9ICgoVUxPTkcpYVswXSkgKiBiMDsKKyAgZFswXSA9IChVU0hPUlQpdG1wOworCisgIGZvciAoayA9IDE7IGsgPCBsZW47IGsrKykgeworICAgIHRtcCA9ICh0bXAgPj4gMTYpICsgKChVTE9ORylhW2tdKSAqIGIwOworICAgIGRba10gPSAoVVNIT1JUKXRtcDsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBsb25nZGl2KFVTSE9SVCBiW10sIFVTSE9SVCBhLCBVU0hPUlQgZFtdLCBVU0hPUlQgKnByLCBpbnQgbGVuKSB7CisgIFVMT05HIHI7CisgIFVMT05HIHRtcDsKKyAgaW50IGs7CisKKyAgRkRLX0FTU0VSVChhICE9IDApOworCisgIHIgPSAwOworCisgIGZvciAoayA9IGxlbiAtIDE7IGsgPj0gMDsgay0tKSB7CisgICAgdG1wID0gKChVTE9ORyliW2tdKSArIChyIDw8IDE2KTsKKworICAgIGlmICh0bXApIHsKKyAgICAgIGRba10gPSAoVVNIT1JUKSh0bXAgLyBhKTsKKyAgICAgIHIgPSB0bXAgLSBkW2tdICogYTsKKyAgICB9IGVsc2UgeworICAgICAgZFtrXSA9IDA7CisgICAgfQorICB9CisgICpwciA9IChVU0hPUlQpcjsKK30KKworc3RhdGljIHZvaWQgbG9uZ3N1YihVU0hPUlQgYVtdLCBVU0hPUlQgYltdLCBpbnQgbGVuYSwgaW50IGxlbmIpIHsKKyAgaW50IGg7CisgIExPTkcgY2FycnkgPSAwOworCisgIEZES19BU1NFUlQobGVuYSA+PSBsZW5iKTsKKyAgZm9yIChoID0gMDsgaCA8IGxlbmI7IGgrKykgeworICAgIGNhcnJ5ICs9ICgoTE9ORylhW2hdKSAtICgoTE9ORyliW2hdKTsKKyAgICBhW2hdID0gKFVTSE9SVCljYXJyeTsKKyAgICBjYXJyeSA9IGNhcnJ5ID4+IDE2OworICB9CisKKyAgZm9yICg7IGggPCBsZW5hOyBoKyspIHsKKyAgICBjYXJyeSA9ICgoTE9ORylhW2hdKSArIGNhcnJ5OworICAgIGFbaF0gPSAoVVNIT1JUKWNhcnJ5OworICAgIGNhcnJ5ID0gY2FycnkgPj4gMTY7CisgIH0KKworICBGREtfQVNTRVJUKGNhcnJ5ID09CisgICAgICAgICAgICAgMCk7IC8qIGNhcnJ5ICE9IDAgaW5kaWNhdGVzIHN1YnRyYWN0aW9uIHVuZGVyZmxvdywgZS5nLiBiID4gYSAqLworICByZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgbG9uZ2NvbXBhcmUoVVNIT1JUIGFbXSwgVVNIT1JUIGJbXSwgaW50IGxlbikgeworICBpbnQgaTsKKworICBmb3IgKGkgPSBsZW4gLSAxOyBpID4gMDsgaS0tKSB7CisgICAgaWYgKGFbaV0gIT0gYltpXSkgYnJlYWs7CisgIH0KKyAgcmV0dXJuIChhW2ldID49IGJbaV0pID8gMSA6IDA7Cit9CisKK0ZES19JTkxJTkUgaW50IGlzVHJTbG90KGNvbnN0IFRTRF9EQVRBICpwVHNkRGF0YSwgY29uc3QgaW50IHRzKSB7CisgIHJldHVybiAocFRzZERhdGEtPmJzVHNkVHJQaGFzZURhdGFbdHNdID49IDApOworfQorCisvKioqIFB1YmxpYyBGdW5jdGlvbnMgKioqLworaW50IFRzZFJlYWQoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBjb25zdCBpbnQgbnVtU2xvdHMsIFRTRF9EQVRBICpwVHNkRGF0YSkgeworICBpbnQgbkJpdHNUclNsb3RzID0gMDsKKyAgaW50IGJzVHNkTnVtVHJTbG90czsKKyAgY29uc3QgVUNIQVIgKm5CaXRzVHNkQ1dfdGFiID0gTlVMTDsKKworICBzd2l0Y2ggKG51bVNsb3RzKSB7CisgICAgY2FzZSAzMjoKKyAgICAgIG5CaXRzVHJTbG90cyA9IDQ7CisgICAgICBuQml0c1RzZENXX3RhYiA9IG5CaXRzVHNkQ1dfMzJzbG90czsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjQ6CisgICAgICBuQml0c1RyU2xvdHMgPSA1OworICAgICAgbkJpdHNUc2RDV190YWIgPSBuQml0c1RzZENXXzY0c2xvdHM7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDE7CisgIH0KKworICAvKioqIFJlYWQgVGVtcFNoYXBlRGF0YSBmb3IgYnNUZW1wU2hhcGVDb25maWcgPT0gMyAqKiovCisgIHBUc2REYXRhLT5ic1RzZEVuYWJsZSA9IEZES3JlYWRCaXQoaEJzKTsKKyAgaWYgKCFwVHNkRGF0YS0+YnNUc2RFbmFibGUpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qKiogUGFyc2UvRGVjb2RlIFRzZERhdGEoKSAqKiovCisgIHBUc2REYXRhLT5udW1TbG90cyA9IG51bVNsb3RzOworCisgIGJzVHNkTnVtVHJTbG90cyA9IEZES3JlYWRCaXRzKGhCcywgbkJpdHNUclNsb3RzKTsKKworICAvKiBEZWNvZGUgdHJhbnNpZW50IHNsb3QgcG9zaXRpb25zICovCisgIHsKKyAgICBpbnQgbkJpdHNUc2RDVyA9IChpbnQpbkJpdHNUc2RDV190YWJbYnNUc2ROdW1UclNsb3RzXTsKKyAgICBTQ0hBUiAqcGhhc2VEYXRhID0gcFRzZERhdGEtPmJzVHNkVHJQaGFzZURhdGE7CisgICAgaW50IHAgPSBic1RzZE51bVRyU2xvdHMgKyAxOworICAgIGludCBrLCBoOworICAgIFVTSE9SVCBzW1NJWkVfU10gPSB7MH07CisgICAgVVNIT1JUIGNbU0laRV9DXSA9IHswfTsKKyAgICBVU0hPUlQgclsxXTsKKworICAgIC8qIEluaXQgd2l0aCBUc2RTZXBEYXRhW2tdID0gMCAqLworICAgIGZvciAoayA9IDA7IGsgPCBudW1TbG90czsgaysrKSB7CisgICAgICBwaGFzZURhdGFba10gPSAtMTsgLyogbWVhbnMgVHNkU2VwRGF0YVtdID0gMCAqLworICAgIH0KKworICAgIGZvciAoaCA9IChTSVpFX1MgLSAxKTsgaCA+PSAwOyBoLS0pIHsKKyAgICAgIGlmIChuQml0c1RzZENXID4gaCAqIDE2KSB7CisgICAgICAgIHNbaF0gPSAoVVNIT1JUKUZES3JlYWRCaXRzKGhCcywgbkJpdHNUc2RDVyAtIGggKiAxNik7CisgICAgICAgIG5CaXRzVHNkQ1cgPSBoICogMTY7CisgICAgICB9CisgICAgfQorCisgICAgLyogYyA9IHByb2Rfe2g9MX1ee3B9IChrLXAraCkvaCAqLworICAgIGsgPSBudW1TbG90cyAtIDE7CisgICAgY1swXSA9IGsgLSBwICsgMTsKKyAgICBmb3IgKGggPSAyOyBoIDw9IHA7IGgrKykgeworICAgICAgbG9uZ211bHQxKGMsIChrIC0gcCArIGgpLCBjLCA1KTsgLyogYyAqPSBrIC0gcCArIGg7ICovCisgICAgICBsb25nZGl2KGMsIGgsIGMsIHIsIDUpOyAgICAgICAgICAvKiBjIC89IGg7ICovCisgICAgICBGREtfQVNTRVJUKCpyID09IDApOworICAgIH0KKworICAgIC8qIGdvIHRocm91Z2ggYWxsIHNsb3RzICovCisgICAgZm9yICg7IGsgPj0gMDsgay0tKSB7CisgICAgICBpZiAocCA+IGspIHsKKyAgICAgICAgZm9yICg7IGsgPj0gMDsgay0tKSB7CisgICAgICAgICAgcGhhc2VEYXRhW2tdID0gMTsgLyogbWVhbnMgVHNkU2VwRGF0YVtdID0gMSAqLworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGxvbmdjb21wYXJlKHMsIGMsIDQpKSB7IC8qIChzID49IGMpICovCisgICAgICAgIGxvbmdzdWIocywgYywgNCwgNCk7ICAgICAgLyogcyAtPSBjOyAqLworICAgICAgICBwaGFzZURhdGFba10gPSAxOyAgICAgICAgIC8qIG1lYW5zIFRzZFNlcERhdGFbXSA9IDEgKi8KKyAgICAgICAgaWYgKHAgPT0gMSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8qIFVwZGF0ZSBjIGZvciBuZXh0IGl0ZXJhdGlvbjogY19uZXcgPSBjX29sZCAqIHAgLyBrICovCisgICAgICAgIGxvbmdtdWx0MShjLCBwLCBjLCA1KTsKKyAgICAgICAgcC0tOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogVXBkYXRlIGMgZm9yIG5leHQgaXRlcmF0aW9uOiBjX25ldyA9IGNfb2xkICogKGstcCkgLyBrICovCisgICAgICAgIGxvbmdtdWx0MShjLCAoayAtIHApLCBjLCA1KTsKKyAgICAgIH0KKyAgICAgIGxvbmdkaXYoYywgaywgYywgciwgNSk7CisgICAgICBGREtfQVNTRVJUKCpyID09IDApOworICAgIH0KKworICAgIC8qIFJlYWQgcGhhc2UgZGF0YSAqLworICAgIGZvciAoayA9IDA7IGsgPCBudW1TbG90czsgaysrKSB7CisgICAgICBpZiAocGhhc2VEYXRhW2tdID09IDEpIHsKKyAgICAgICAgcGhhc2VEYXRhW2tdID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKwordm9pZCBUc2RHZW5lcmF0ZU5vblRyKGNvbnN0IGludCBudW1IeWJyaWRCYW5kcywgY29uc3QgVFNEX0RBVEEgKnBUc2REYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0cywgRklYUF9EQkwgKnBWZGlyZWN0UmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcFZkaXJlY3RJbWFnLCBGSVhQX0RCTCAqcFZub25UclJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBWbm9uVHJJbWFnLCBGSVhQX0RCTCAqKnBwRGVjb3JySW5SZWFsLAorICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcHBEZWNvcnJJbkltYWcpIHsKKyAgaW50IGsgPSAwOworCisgIGlmICghaXNUclNsb3QocFRzZERhdGEsIHRzKSkgeworICAgIC8qIExldCBhbGxwYXNzIGJhc2VkIGRlY29ycmVsYXRvciByZWFkIGZyb20gZGlyZWN0IGlucHV0LiAqLworICAgICpwcERlY29yckluUmVhbCA9IHBWZGlyZWN0UmVhbDsKKyAgICAqcHBEZWNvcnJJbkltYWcgPSBwVmRpcmVjdEltYWc7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogR2VuZXJhdGUgbm9uVHIgaW5wdXQgc2lnbmFsIGZvciBhbGxwYXNzIGJhc2VkIGRlY29ycmVsYXRvciAqLworICBmb3IgKDsgayA8IFRTRF9TVEFSVF9CQU5EOyBrKyspIHsKKyAgICBwVm5vblRyUmVhbFtrXSA9IHBWZGlyZWN0UmVhbFtrXTsKKyAgICBwVm5vblRySW1hZ1trXSA9IHBWZGlyZWN0SW1hZ1trXTsKKyAgfQorICBmb3IgKDsgayA8IG51bUh5YnJpZEJhbmRzOyBrKyspIHsKKyAgICBwVm5vblRyUmVhbFtrXSA9IChGSVhQX0RCTCkwOworICAgIHBWbm9uVHJJbWFnW2tdID0gKEZJWFBfREJMKTA7CisgIH0KKyAgKnBwRGVjb3JySW5SZWFsID0gcFZub25UclJlYWw7CisgICpwcERlY29yckluSW1hZyA9IHBWbm9uVHJJbWFnOworfQorCit2b2lkIFRzZEFwcGx5KGNvbnN0IGludCBudW1IeWJyaWRCYW5kcywgY29uc3QgVFNEX0RBVEEgKnBUc2REYXRhLCBpbnQgKnBUc2RUcywKKyAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnBWZGlyZWN0UmVhbCwgY29uc3QgRklYUF9EQkwgKnBWZGlyZWN0SW1hZywKKyAgICAgICAgICAgICAgRklYUF9EQkwgKnBEbm9uVHJSZWFsLCBGSVhQX0RCTCAqcERub25UckltYWcpIHsKKyAgY29uc3QgaW50IHRzID0gKnBUc2RUczsKKworICBpZiAoaXNUclNsb3QocFRzZERhdGEsIHRzKSkgeworICAgIGludCBrOworICAgIGNvbnN0IEZJWFBfU1RQICpwaGkgPSAmcGhpVHNkW3BUc2REYXRhLT5ic1RzZFRyUGhhc2VEYXRhW3RzXV07CisgICAgRkRLX0FTU0VSVCgocFRzZERhdGEtPmJzVHNkVHJQaGFzZURhdGFbdHNdID49IDApICYmCisgICAgICAgICAgICAgICAocFRzZERhdGEtPmJzVHNkVHJQaGFzZURhdGFbdHNdIDwgOCkpOworCisgICAgLyogZCA9IGRfbm9uVHIgKyB2X2RpcmVjdCAqIGV4cChqICogYnNUc2RUclBoYXNlRGF0YVt0c10vNCAqIHBpICkgKi8KKyAgICBmb3IgKGsgPSBUU0RfU1RBUlRfQkFORDsgayA8IG51bUh5YnJpZEJhbmRzOyBrKyspIHsKKyAgICAgIEZJWFBfREJMIHRlbXBSZWFsLCB0ZW1wSW1hZzsKKyAgICAgIGNwbHhNdWx0KCZ0ZW1wUmVhbCwgJnRlbXBJbWFnLCBwVmRpcmVjdFJlYWxba10sIHBWZGlyZWN0SW1hZ1trXSwgKnBoaSk7CisgICAgICBwRG5vblRyUmVhbFtrXSArPSB0ZW1wUmVhbDsKKyAgICAgIHBEbm9uVHJJbWFnW2tdICs9IHRlbXBJbWFnOworICAgIH0KKyAgfQorCisgIC8qIFRoZSBtb2R1bG8gTUFYX1RTRF9USU1FX1NMT1RTIG9wZXJhdGlvbiBpcyB0byBhdm9pZCBpbGxlZ2FsIG1lbW9yeSBhY2Nlc3NlcworICAgKiBpbiBjYXNlIG9mIGVycm9ycy4gKi8KKyAgKnBUc2RUcyA9ICh0cyArIDEpICYgKE1BWF9UU0RfVElNRV9TTE9UUyAtIDEpOworICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9saWJTQUNkZWMvc3JjL3NhY190c2QuaCBiL2xpYlNBQ2RlYy9zcmMvc2FjX3RzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MjFlMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNkZWMvc3JjL3NhY190c2QuaApAQCAtMCwwICsxLDE2NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWF0dGhpYXMgSGlsZGVuYnJhbmQKKworICAgRGVzY3JpcHRpb246IFVTQUMgTVBTMjEyIFRyYW5zaWVudCBTdGVlcmluZyBEZWNvcnJlbGF0b3IgKFRTRCkKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQUNfVFNEX0gKKyNkZWZpbmUgU0FDX1RTRF9ICisKKyNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCisjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgorCisjZGVmaW5lIE1BWF9UU0RfVElNRV9TTE9UUyAoNjQpCisKKy8qKiBTdHJ1Y3R1cmUgd2hpY2ggaG9sZHMgdGhlIGRhdGEgbmVlZGVkIHRvIGFwcGx5IFRTRCB0byBjdXJyZW50IGZyYW1lLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBic1RzZEVuYWJsZTsgLyoqPCBmb3IgY3VycmVudCBmcmFtZSBUU0QgaXMgKDA6ZGlzYWJsZWQsIDE6ZW5hYmxlZCkgKi8KKyAgVUNIQVIgbnVtU2xvdHM7ICAgIC8qKjwgdG90YWwgbnVtYmVyIG9mIFFNRiBzbG90cyBwZXIgZnJhbWUgKi8KKyAgU0NIQVIKKyAgYnNUc2RUclBoYXNlRGF0YVtNQVhfVFNEX1RJTUVfU0xPVFNdOyAvKio8IC0xID0+IFRzZFNlcERhdGFbdHNdPTA7IDAtNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgb2YgYnNUc2RUclBoYXNlRGF0YVt0c10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgVHNkU2VwRGF0YVt0c109MSAqLworfSBUU0RfREFUQTsKKworRkRLX0lOTElORSBpbnQgaXNUc2RBY3RpdmUoY29uc3QgVFNEX0RBVEEgKnBUc2REYXRhKSB7CisgIHJldHVybiAoaW50KXBUc2REYXRhLT5ic1RzZEVuYWJsZTsKK30KKworLyoqCisgKiBcYnJpZWYgUGFyc2UgYW5kIERlY29kZSBUU0QgZGF0YS4KKyAqIFxwYXJhbVtpbl0gaEJzIGJpdHN0cmVhbSBoYW5kbGUgdG8gcmVhZCBkYXRhIGZyb20uCisgKiBccGFyYW1baW5dIG51bVNsb3RzIG51bWJlciBvZiBRTUYgc2xvdHMgcGVyIGZyYW1lLgorICogXHBhcmFtW291dF0gcFRzZERhdGEgcG9pbnRlciB0byBUU0QgZGF0YSBzdHJ1Y3R1cmUuCisgKiBccmV0dXJuIDAgb24gc3VjY2VzLCAxIG9uIGVycm9yLgorICovCitpbnQgVHNkUmVhZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIGNvbnN0IGludCBudW1TbG90cywgVFNEX0RBVEEgKnBUc2REYXRhKTsKKworLyoqCisgKiBcYnJpZWYgUGVyZm9ybSB0cmFuc2llbnQgc2VwZXJhdGlvbiAodl97eCxub25Ucn0gc2lnbmFsKS4KKyAqIFxwYXJhbVtpbl0gbnVtSHlicmlkQmFuZHMgbnVtYmVyIG9mIGh5YnJpZCBiYW5kcy4KKyAqIFxwYXJhbVtpbl0gcFRzZERhdGEgcG9pbnRlciB0byBUU0QgZGF0YSBzdHJ1Y3R1cmUuCisgKiBccGFyYW1baW5dIHBWZGlyZWN0UmVhbCBwb2ludGVyIHRvIGFycmF5IHdpdGggZGlyZWN0IHNpZ25hbC4KKyAqIFxwYXJhbVtpbl0gcFZkaXJlY3RJbWFnIHBvaW50ZXIgdG8gYXJyYXkgd2l0aCBkaXJlY3Qgc2lnbmFsLgorICogXHBhcmFtW291dF0gcFZub25UclJlYWwgcG9pbnRlciB0byBhcnJheSB3aXRoIG5vblRyIHNpZ25hbC4KKyAqIFxwYXJhbVtvdXRdIHBWbm9uVHJJbWFnIHBvaW50ZXIgdG8gYXJyYXkgd2l0aCBub25UciBzaWduYWwuCisgKiBccGFyYW1bb3V0XSBwcERlY29yckluUmVhbCBoYW5kbGUgdG8gYXJyYXkgd2hlcmUgYWxscGFzcyBiYXNlZCBkZWNvcnJlbGF0b3IKKyAqIHNob3VsZCByZWFkIGZyb20gKG1vZGlmaWVkIGJ5IHRoaXMgZnVuY3Rpb24pLgorICogXHBhcmFtW291dF0gcHBEZWNvcnJJbkltYWcgaGFuZGxlIHRvIGFycmF5IHdoZXJlIGFsbHBhc3MgYmFzZWQgZGVjb3JyZWxhdG9yCisgKiBzaG91bGQgcmVhZCBmcm9tIChtb2RpZmllZCBieSB0aGlzIGZ1bmN0aW9uKS4KKyAqLwordm9pZCBUc2RHZW5lcmF0ZU5vblRyKGNvbnN0IGludCBudW1IeWJyaWRCYW5kcywgY29uc3QgVFNEX0RBVEEgKnBUc2REYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0cywgRklYUF9EQkwgKnBWZGlyZWN0UmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcFZkaXJlY3RJbWFnLCBGSVhQX0RCTCAqcFZub25UclJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBWbm9uVHJJbWFnLCBGSVhQX0RCTCAqKnBwRGVjb3JySW5SZWFsLAorICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcHBEZWNvcnJJbkltYWcpOworCisvKioKKyAqIFxicmllZiBHZW5lcmF0ZSBkX3t4LFRyfSBzaWduYWwgYW5kIGFkZCB0byBkX3t4LG5vblRyfSBzaWduYWwKKyAqIFxwYXJhbVtpbl0gbnVtSHlicmlkQmFuZHMKKyAqIFxwYXJhbVtpbixvdXRdIHBUc2REYXRhCisgKiBccGFyYW0gcFRzZFRzIHBvaW50ZXIgdG8gcGVyc2lzdGVudCB0aW1lIHNsb3QgY291bnRlcgorICogXHBhcmFtW2luXSBwVmRpcmVjdFJlYWwKKyAqIFxwYXJhbVtpbl0gcFZkaXJlY3RJbWFnCisgKiBccGFyYW1bb3V0XSBwRG5vblRyUmVhbAorICogXHBhcmFtW291dF0gcERub25UckltYWcKKyAqLwordm9pZCBUc2RBcHBseShjb25zdCBpbnQgbnVtSHlicmlkQmFuZHMsIGNvbnN0IFRTRF9EQVRBICpwVHNkRGF0YSwgaW50ICpwVHNkVHMsCisgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpwVmRpcmVjdFJlYWwsIGNvbnN0IEZJWFBfREJMICpwVmRpcmVjdEltYWcsCisgICAgICAgICAgICAgIEZJWFBfREJMICpwRG5vblRyUmVhbCwgRklYUF9EQkwgKnBEbm9uVHJJbWFnKTsKKworI2VuZGlmIC8qICNpZm5kZWYgU0FDX1RTRF9IICovCmRpZmYgLS1naXQgYS9saWJTQUNlbmMvaW5jbHVkZS9zYWNlbmNfbGliLmggYi9saWJTQUNlbmMvaW5jbHVkZS9zYWNlbmNfbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4Y2MwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2VuYy9pbmNsdWRlL3NhY2VuY19saWIuaApAQCAtMCwwICsxLDQwNSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWF4IE5ldWVuZG9yZgorCisgICBEZXNjcmlwdGlvbjogRW5jb2RlciBMaWJyYXJ5IEludGVyZmFjZQorICAgICAgICAgICAgICAgIEVuY29kZXIgQVBJCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLyoqCisgICBcZmlsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQUNFTkNfTElCX0gKKyNkZWZpbmUgU0FDRU5DX0xJQl9ICisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKKyNpbmNsdWRlICJGREtfYXVkaW8uaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogIFNwYWNlIGVuY29kZXIgZXJyb3IgY29kZXMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIFNBQ0VOQ19PSyA9IDB4MDAwMDAwMDAsIC8qITwgTm8gZXJyb3IgaGFwcGVuZWQuIEFsbCBmaW5lLiAqLworICBTQUNFTkNfSU5WQUxJRF9IQU5ETEUgPQorICAgICAgMHgwMDAwMDA4MCwgLyohPCBIYW5kbGUgcGFzc2VkIHRvIGZ1bmN0aW9uIGNhbGwgd2FzIGludmFsaWQuICovCisgIFNBQ0VOQ19NRU1PUllfRVJST1IgPSAweDAwMDAwODAwLCAvKiE8IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gKi8KKyAgU0FDRU5DX0lOSVRfRVJST1IgPSAweDAwMDA4MDAwLCAgIC8qITwgR2VuZXJhbCBpbml0aWFsaXphdGlvbiBlcnJvci4gKi8KKyAgU0FDRU5DX0VOQ09ERV9FUlJPUiA9CisgICAgICAweDAwMDgwMDAwLCAvKiE8IFRoZSBlbmNvZGluZyBwcm9jZXNzIHdhcyBpbnRlcnJ1cHRlZCBieSBhbiB1bmV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgICBlcnJvci4gKi8KKyAgU0FDRU5DX1BBUkFNX0VSUk9SID0gMHgwMDgwMDAwMCwgICAgICAgICAgIC8qITwgSW52YWxpZCBydW50aW1lIHBhcmFtZXRlci4gKi8KKyAgU0FDRU5DX1VOU1VQUE9SVEVEX1BBUkFNRVRFUiA9IDB4MDA4MDAwMDEsIC8qITwgUGFyYW1ldGVyIG5vdCBhdmFpbGFibGUuICovCisgIFNBQ0VOQ19JTlZBTElEX0NPTkZJRyA9IDB4MDA4MDAwMDIsICAgICAgICAvKiE8IENvbmZpZ3VyYXRpb24gbm90IHByb3ZpZGVkLiAqLworICBTQUNFTkNfVU5LTk9XTl9FUlJPUiA9IDB4MDgwMDAwMDAgICAgICAgICAgLyohPCBVbmtub3duIGVycm9yLiAqLworCit9IEZES19TQUNFTkNfRVJST1I7CisKK3R5cGVkZWYgZW51bSB7CisgIFNBQ0VOQ19JTlZBTElEX01PREUgPSAwLAorICBTQUNFTkNfMjEyID0gOCwKKyAgU0FDRU5DX0VTQ0FQRSA9IDE1CisKK30gTVA0U1BBQ0VFTkNfTU9ERTsKKwordHlwZWRlZiBlbnVtIHsKKyAgU0FDRU5DX0JBTkRTX0lOVkFMSUQgPSAwLAorICBTQUNFTkNfQkFORFNfNCA9IDQsCisgIFNBQ0VOQ19CQU5EU181ID0gNSwKKyAgU0FDRU5DX0JBTkRTXzcgPSA3LAorICBTQUNFTkNfQkFORFNfOSA9IDksCisgIFNBQ0VOQ19CQU5EU18xMiA9IDEyLAorICBTQUNFTkNfQkFORFNfMTUgPSAxNSwKKyAgU0FDRU5DX0JBTkRTXzIzID0gMjMKKworfSBNUDRTUEFDRUVOQ19CQU5EU19DT05GSUc7CisKK3R5cGVkZWYgZW51bSB7CisgIFNBQ0VOQ19RVUFOVE1PREVfSU5WQUxJRCA9IC0xLAorICBTQUNFTkNfUVVBTlRNT0RFX0ZJTkUgPSAwLAorICBTQUNFTkNfUVVBTlRNT0RFX0VCUTEgPSAxLAorICBTQUNFTkNfUVVBTlRNT0RFX0VCUTIgPSAyLAorICBTQUNFTkNfUVVBTlRNT0RFX1JTVkQzID0gMworCit9IE1QNFNQQUNFRU5DX1FVQU5UTU9ERTsKKwordHlwZWRlZiBlbnVtIHsKKyAgU0FDRU5DX0RNWEdBSU5fSU5WQUxJRCA9IC0xLAorICBTQUNFTkNfRE1YR0FJTl8wX2RCID0gMCwKKyAgU0FDRU5DX0RNWEdBSU5fMV81X2RCID0gMSwKKyAgU0FDRU5DX0RNWEdBSU5fM19kQiA9IDIsCisgIFNBQ0VOQ19ETVhHQUlOXzRfNV9kQiA9IDMsCisgIFNBQ0VOQ19ETVhHQUlOXzZfZEIgPSA0LAorICBTQUNFTkNfRE1YR0FJTl83XzVfZEIgPSA1LAorICBTQUNFTkNfRE1YR0FJTl85X2RCID0gNiwKKyAgU0FDRU5DX0RNWEdBSU5fMTJfZEIgPSA3CisKK30gTVA0U1BBQ0VFTkNfRE1YX0dBSU47CisKKy8qKgorICogXGJyaWVmICBTcGFjZSBFbmNvZGVyIHNldHRpbmcgcGFyYW1ldGVycy4KKyAqCisgKiBVc2UgRkRLX3NhY2VuY19zZXRQYXJhbSgpIGZ1bmN0aW9uIHRvIGNvbmZpZ3VyZSB0aGUgaW50ZXJuYWwgc3RhdHVzIG9mIHRoZQorICogZm9sbG93aW5nIHBhcmFtZXRlcnMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIFNBQ0VOQ19MT1dERUxBWSwgLyohPCBDb25maWd1cmUgbG93ZGVsYXkgTVBFRyBTdXJyb3VuZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogRGlzYWJsZSBMb3dkZWxheS4gKGRlZmF1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IEVuYWJsZSBMb3dkZWxheS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC0gMjogRW5hYmxlIExvd2RlbGF5IGluY2x1ZGluZyBrZWVwIGZyYW1lLiAqLworCisgIFNBQ0VOQ19FTkNfTU9ERSwgLyohPCBDb25maWd1cmUgZW5jb2RlciB0cmVlIG1vZGUuIFNlZSA6Ok1QNFNQQUNFRU5DX01PREUgZm9yCisgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIHZhbHVlcy4gKi8KKworICBTQUNFTkNfU0FNUExFUkFURSwgLyohPCBDb25maWd1cmUgZW5jb2RlciBzYW1wbGluZyByYXRlLiAqLworCisgIFNBQ0VOQ19GUkFNRV9USU1FX1NMT1RTLCAvKiE8IENvbmZpZ3VyZSBudW1iZXIgb2Ygc2xvdHMgcGVyIHNwYXRpYWwgZnJhbWUuICovCisKKyAgU0FDRU5DX1BBUkFNX0JBTkRTLCAvKiE8IENvbmZpZ3VyZSBudW1iZXIgb2YgcGFyYW1ldGVyIGJhbmRzLiBTZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICA6Ok1QNFNQQUNFRU5DX0JBTkRTX0NPTkZJRyBmb3IgYXZhaWxhYmxlIHZhbHVlcy4gKi8KKworICBTQUNFTkNfVElNRV9ET01fRE1YLCAvKiE8IENvbmZpZ3VyZSB0aW1lIGRvbWFpbiBkb3dubWl4LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMDogTm8gdGltZSBkb21haW4gZG93bm1peC4gKGRlZmF1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxOiBTdGF0aWMgdGltZSBkb21haW4gZG93bm1peC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI6IEVuaGFuY2VkIHRpbWUgZG9tYWluIGRvd25taXgsIHN0ZXJlbyB0byBtb25vCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkuICovCisKKyAgU0FDRU5DX0RNWF9HQUlOLCAvKiE8IENvbmZpZ3VyZSBkb3dubWl4IGdhaW4uIFNlZSA6Ok1QNFNQQUNFRU5DX0RNWF9HQUlOIGZvcgorICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB2YWx1ZXMuICovCisKKyAgU0FDRU5DX0NPQVJTRV9RVUFOVCwgLyohPCBVc2UgY29hcnNlIHBhcmFtZXRlciBxdWFudGl6YXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAwOiBObyAoZGVmYXVsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDE6IFllcyAqLworCisgIFNBQ0VOQ19RVUFOVF9NT0RFLCAvKiE8IENvbmZpZ3VyZSBxdWFuaXR6YXRpb24gbW9kZS4gU2VlCisgICAgICAgICAgICAgICAgICAgICAgICA6Ok1QNFNQQUNFRU5DX1FVQU5UTU9ERSBmb3IgYXZhaWxhYmxlIHZhbHVlcy4gKi8KKworICBTQUNFTkNfVElNRV9BTElHTk1FTlQsIC8qITwgQ29uZmlndXJlIHRpbWUgYWxpZ25tZW50IGluIHNhbXBsZXMuICovCisKKyAgU0FDRU5DX0lOREVQRU5ERU5DWV9DT1VOVCwgLyohPCBDb25maWd1cmUgdGhlIGluZGVwZW5kZW5jeSBjb3VudC4gKGNvdW50ID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbnMgaW5kZXBlbmRlbmN5RmxhZyA9PSAxKSAqLworCisgIFNBQ0VOQ19JTkRFUEVOREVOQ1lfRkFDVE9SLCAvKiE8IEhvdyBvZnRlbiBzaG91bGQgd2Ugc2V0IHRoZSBpbmRlcGVuZGVuY3kgZmxhZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgU0FDRU5DX05PTkUgLyohPCAtLS0tLS0gKi8KKworfSBTUEFDRUVOQ19QQVJBTTsKKworLyoqCisgKiAgRGVzY3JpYmVzIFNwYXRpYWwgU3BlY2lmaWMgQ29uZmlnLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIElOVCBuU3NjU2l6ZUJpdHM7IC8qITwgTnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gcFNzYyBidWZmZXIuICovCisgIFVDSEFSICpwU3NjOyAgICAgIC8qITwgU3BhdGlhbFNwZWNpZmljQ29uZmlnIGJ1ZmZlciBpbiBiaW5hcnkgZm9ybWF0LiAqLworCit9IE1QRUc0U1BBQ0VFTkNfU1NDQlVGOworCisvKioKKyAqICBQcm92aWRlcyBzb21lIGluZm8gYWJvdXQgdGhlIGVuY29kZXIgY29uZmlndXJhdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBJTlQgblNhbXBsZVJhdGU7ICAgICAgICAgLyohPCBDb25maWd1cmVkIHNhbXBsaW5nIHJhdGUuKi8KKyAgSU5UIG5TYW1wbGVzRnJhbWU7ICAgICAgIC8qITwgRnJhbWUgbGVuZ3RoIGluIHNhbXBsZXMuICovCisgIElOVCBuVG90YWxJbnB1dENoYW5uZWxzOyAvKiE8IE51bWJlciBvZiBleHBlY3RlZCBhdWRpbyBpbnB1dCBjaGFubmVscy4gKi8KKyAgSU5UIG5EbXhEZWxheTsgICAgICAgICAgIC8qITwgRGVsYXkgb2YgdGhlIGRvd25taXhlZCBzaWduYWwuICovCisgIElOVCBuQ29kZWNEZWxheTsgICAgICAgICAvKiE8IERlbGF5IG9mIHRoZSB3aG9sZSBlbi0vZGVjb2RlZCBzaWduYWwsIGluY2x1ZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZS1jb2RlciBkZWxheS4gKi8KKyAgSU5UIG5EZWNvZGVyRGVsYXk7ICAgICAgIC8qITwgRGVsYXkgYWRkZWQgYnkgdGhlIE1QNFNQQUNFIGRlY29kZXIuICovCisgIElOVCBuUGF5bG9hZERlbGF5OyAgICAgICAvKiE8IERlbGF5IG9mIHRoZSBwYXlsb2FkLiAqLworICBJTlQgbkRpc2NhcmRPdXRGcmFtZXM7IC8qITwgTnVtYmVyIG9mIGRteCBmcmFtZXMgdG8gZGlzY2FyZCBmb3IgYWxpZ25tZW50IHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0uICovCisKKyAgTVBFRzRTUEFDRUVOQ19TU0NCVUYKKyAgKnBTc2NCdWY7IC8qITwgUG9pbnRlciB0byBTcGF0aWFsIFNwZWNpZmljIENvbmZpZyBzdHJ1Y3R1cmUuICovCisKK30gTVA0U1BBQ0VFTkNfSU5GTzsKKworLyoqCisgKiAgTVBFRyBTdXJyb3VuZCBlbmNvZGVyIGhhbmRsZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTVA0U1BBQ0VfRU5DT0RFUiAqSEFORExFX01QNFNQQUNFX0VOQ09ERVI7CisKKy8qKgorICogIERlZmluZXMgdGhlIGlucHV0IGFyZ3VtZW50cyBmb3IgYSBGREtfc2FjZW5jX2VuY29kZSgpIGNhbGwuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UIG5JbnB1dFNhbXBsZXM7IC8qITwgTnVtYmVyIG9mIHZhbGlkIGlucHV0IGF1ZGlvIHNhbXBsZXMgKG11bHRpcGxlIG9mIGlucHV0CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscykuICovCisgIFVJTlQgaW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbDsgLyohPCBTaXplIG9mIGlucHV0IGJ1ZmZlciAoaW5wdXQgYXVkaW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzKSBwZXIgY2hhbm5lbC4gKi8KKyAgVUlOVCBpc0lucHV0SW50ZXJsZWF2ZWQ7IC8qITwgSW5kaWNhdGVzIGlmIGlucHV0IGF1ZGlvIHNhbXBsZXMgYXJlIHJlcHJlc2VudGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBibG9ja3Mgb3IgaW50ZXJsZWF2ZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMCA6IGluIGJsb2Nrcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxIDogaW50ZXJsZWF2ZWQuICovCisKK30gU0FDRU5DX0luQXJnczsKKworLyoqCisgKiAgRGVmaW5lcyB0aGUgb3V0cHV0IGFyZ3VtZW50cyBmb3IgYSBGREtfc2FjZW5jX2VuY29kZSgpIGNhbGwuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UIG5PdXRwdXRCaXRzOyAgICAvKiE8IE51bWJlciBvZiB2YWxpZCBwYXlsb2FkIGJpdHMgZ2VuZXJhdGVkIGR1cmluZworICAgICAgICAgICAgICAgICAgICAgICAgIEZES19zYWNlbmNfZW5jb2RlKCkuICovCisgIElOVCBuT3V0cHV0U2FtcGxlczsgLyohPCBOdW1iZXIgb2YgdmFsaWQgb3V0cHV0IGF1ZGlvIHNhbXBsZXMgZ2VuZXJhdGVkIGR1cmluZworICAgICAgICAgICAgICAgICAgICAgICAgIEZES19zYWNlbmNfZW5jb2RlKCkuICovCisgIFVJTlQgblNhbXBsZXNDb25zdW1lZDsgLyohPCBOdW1iZXIgb2YgaW5wdXQgYXVkaW8gc2FtcGxlcyBjb25zdW1lZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZES19zYWNlbmNfZW5jb2RlKCkuICovCisKK30gU0FDRU5DX091dEFyZ3M7CisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFxicmllZiAgT3BlbnMgYSBuZXcgaW5zdGFjZSBvZiB0aGUgTVBFRyBTdXJyb3VuZCBlbmNvZGVyLgorICoKKyAqIFxwYXJhbSBwaE1wNFNwYWNlRW5jICAgICAgUG9pbnRlciB0byB0aGUgZW5jb2RlciBoYW5kbGUgdG8gYmUgZGVhbGxvY2F0ZWQuCisgKgorICogXHJldHVybgorICogICAgICAgICAgLSBTQUNFTkNfT0ssIG9uIHN1Y2Nlc3MuCisgKiAgICAgICAgICAtIFNBQ0VOQ19JTlZBTElEX0hBTkRMRSwgU0FDRU5DX01FTU9SWV9FUlJPUiwgb24gZmFpbHVyZS4KKyAqLworRkRLX1NBQ0VOQ19FUlJPUiBGREtfc2FjZW5jX29wZW4oSEFORExFX01QNFNQQUNFX0VOQ09ERVIgKnBoTXA0U3BhY2VFbmMpOworCisvKioKKyAqIFxicmllZiAgRmluYWxpemVzIG9wZW5pbmcgcHJvY2VzcyBvZiBNUEVHIFN1cnJvdW5kIGVuY29kZXIuCisgKgorICogU2hvd3MsIGhvdyBtYW55IHNhbXBsZXMgYXJlIG5lZWRlZCBhcyBpbnB1dAorICoKKyAqIFxwYXJhbSBoTXA0U3BhY2VFbmMgICAgICAgQSB2YWxpZCBNUEVHIFN1cnJvdW5kIGVuY29kZXIgaGFuZGxlLgorICogXHBhcmFtIGRteERlbGF5ICAgICAgICAgICBEb3dubWl4IGRlbGF5LgorICoKKyAqIFxyZXR1cm4KKyAqICAgICAgICAgIC0gU0FDRU5DX09LLCBvbiBzdWNjZXNzLgorICogICAgICAgICAgLSBTQUNFTkNfSU5WQUxJRF9IQU5ETEUsIFNBQ0VOQ19JTklUX0VSUk9SLCBTQUNFTkNfSU5WQUxJRF9DT05GSUcsCisgKiBvbiBmYWlsdXJlLgorICovCitGREtfU0FDRU5DX0VSUk9SIEZES19zYWNlbmNfaW5pdChIQU5ETEVfTVA0U1BBQ0VfRU5DT0RFUiBoTXA0U3BhY2VFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZG14RGVsYXkpOworCisvKioKKyAqIFxicmllZiAgQ2xvc2UgdGhlIE1QRUcgU3Vycm91bmQgZW5jb2RlciBpbnN0YW5jZS4KKyAqCisgKiBEZWFsbG9jYXRlIGVuY29kZXIgaW5zdGFuY2UgYW5kIGZyZWUgd2hvbGUgbWVtb3J5LgorICoKKyAqIFxwYXJhbSBwaE1wNFNwYWNlRW5jICAgICAgUG9pbnRlciB0byB0aGUgZW5jb2RlciBoYW5kbGUgdG8gYmUgZGVhbGxvY2F0ZWQuCisgKgorICogXHJldHVybgorICogICAgICAgICAgLSBTQUNFTkNfT0ssIG9uIHN1Y2Nlc3MuCisgKiAgICAgICAgICAtIFNBQ0VOQ19JTlZBTElEX0hBTkRMRSwgb24gZmFpbHVyZS4KKyAqLworRkRLX1NBQ0VOQ19FUlJPUiBGREtfc2FjZW5jX2Nsb3NlKEhBTkRMRV9NUDRTUEFDRV9FTkNPREVSICpwaE1wNFNwYWNlRW5jKTsKKworLyoqCisgKiBcYnJpZWYgIE1QRUcgc3Vycm91bmQgcGFyYW1ldGVyIGV4dHJhY3Rpb24sIGZyYW13aXNlLgorICoKKyAqIFxwYXJhbSBoTXA0U3BhY2VFbmMgICAgICAgQSB2YWxpZCBNUEVHIFN1cnJvdW5kIGVuY29kZXIgaGFuZGxlLgorICoKKyAqIFxyZXR1cm4KKyAqICAgICAgICAgIC0gU0FDRU5DX09LLCBvbiBzdWNjZXNzLgorICogICAgICAgICAgLSBTQUNFTkNfSU5WQUxJRF9IQU5ETEUsIG9uIGZhaWx1cmUuCisgKi8KK0ZES19TQUNFTkNfRVJST1IgRkRLX3NhY2VuY19lbmNvZGUoY29uc3QgSEFORExFX01QNFNQQUNFX0VOQ09ERVIgaE1wNFNwYWNlRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGREtfYnVmRGVzY3IgKmluQnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkRLX2J1ZkRlc2NyICpvdXRCdWZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQUNFTkNfSW5BcmdzICppbmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBQ0VOQ19PdXRBcmdzICpvdXRhcmdzKTsKKworLyoqCisgKiBcYnJpZWYgIFByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHByb2R1Y2VkIGJpdHN0cmVhbS4KKyAqCisgKiBccGFyYW0gaE1wNFNwYWNlRW5jICAgICAgIEEgdmFsaWQgTVBFRyBTdXJyb3VuZCBlbmNvZGVyIGhhbmRsZS4KKyAqIFxwYXJhbSBwSW5mbyAgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbmNvZGVyIGluZm8gc3RydWN0LCBmaWxsZWQgb24KKyAqIHJldHVybi4KKyAqCisgKiBccmV0dXJuCisgKiAgICAgICAgICAtIFNBQ0VOQ19PSywgb24gc3VjY2Vzcy4KKyAqICAgICAgICAgIC0gU0FDRU5DX0lOVkFMSURfSEFORExFLCBvbiBmYWlsdXJlLgorICovCitGREtfU0FDRU5DX0VSUk9SIEZES19zYWNlbmNfZ2V0SW5mbyhjb25zdCBIQU5ETEVfTVA0U1BBQ0VfRU5DT0RFUiBoTXA0U3BhY2VFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUDRTUEFDRUVOQ19JTkZPICpjb25zdCBwSW5mbyk7CisKKy8qKgorICogXGJyaWVmICBTZXQgb25lIHNpbmdsZSBNUEVHIFN1cnJvdW5kIGVuY29kZXIgcGFyYW1ldGVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNvbmZpZ3VyYXRpb24gb2YgYWxsIGVuY29kZXIgcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4KKyAqIDo6U1BBQ0VFTkNfUEFSQU0uIEVhY2ggcGFyYW1ldGVyIG11c3QgYmUgc2V0IHdpdGggYSBzZXBhcmF0ZSBmdW5jdGlvbiBjYWxsLgorICogQW4gaW50ZXJuYWwgdmFsaWRhdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbiB2YWx1ZSByYW5nZSB3aWxsIGJlIGRvbmUuCisgKgorICogXHBhcmFtIGhNcDRTcGFjZUVuYyAgICAgICBBIHZhbGlkIE1QRUcgU3Vycm91bmQgZW5jb2RlciBoYW5kbGUuCisgKiBccGFyYW0gcGFyYW0gICAgICAgICAgICAgIFBhcmFtZXRlciB0byBiZSBzZXQuIFNlZSA6OlNQQUNFRU5DX1BBUkFNLgorICogXHBhcmFtIHZhbHVlICAgICAgICAgICAgICBQYXJhbWV0ZXIgdmFsdWUuIFNlZSBwYXJhbWV0ZXIgZGVzY3JpcHRpb24gaW4KKyAqIDo6U1BBQ0VFTkNfUEFSQU0uCisgKgorICogXHJldHVybgorICogICAgICAgICAgLSBTQUNFTkNfT0ssIG9uIHN1Y2Nlc3MuCisgKiAgICAgICAgICAtIFNBQ0VOQ19JTlZBTElEX0hBTkRMRSwgU0FDRU5DX1VOU1VQUE9SVEVEX1BBUkFNRVRFUiwKKyAqIFNBQ0VOQ19JTlZBTElEX0NPTkZJRywgb24gZmFpbHVyZS4KKyAqLworRkRLX1NBQ0VOQ19FUlJPUiBGREtfc2FjZW5jX3NldFBhcmFtKEhBTkRMRV9NUDRTUEFDRV9FTkNPREVSIGhNcDRTcGFjZUVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTUEFDRUVOQ19QQVJBTSBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIHZhbHVlKTsKKworLyoqCisgKiBcYnJpZWYgIEdldCBpbmZvcm1hdGlvbiBhYm91dCBNUEVHIFN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSBidWlsZC4KKyAqCisgKiBGaWxsIGEgZ2l2ZW4gTElCX0lORk8gc3RydWN0dXJlIHdpdGggbGlicmFyeSB2ZXJzaW9uIGluZm9ybWF0aW9uLgorICoKKyAqIFxwYXJhbSBpbmZvICAgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBhbGxvY2F0ZWQgTElCX0lORk8gc3RydWN0LgorICoKKyAqIFxyZXR1cm4KKyAqICAgICAgICAgIC0gU0FDRU5DX09LLCBvbiBzdWNjZXNzLgorICogICAgICAgICAgLSBTQUNFTkNfSU5WQUxJRF9IQU5ETEUsIFNBQ0VOQ19JTklUX0VSUk9SLCBvbiBmYWlsdXJlLgorICovCitGREtfU0FDRU5DX0VSUk9SIEZES19zYWNlbmNfZ2V0TGliSW5mbyhMSUJfSU5GTyAqaW5mbyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTQUNFTkNfTElCX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2JpdHN0cmVhbS5jcHAgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19iaXRzdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhY2ZjMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19iaXRzdHJlYW0uY3BwCkBAIC0wLDAgKzEsODI2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246IEVuY29kZXIgTGlicmFyeSBJbnRlcmZhY2UKKyAgICAgICAgICAgICAgICBCaXRzdHJlYW0gV3JpdGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJzYWNlbmNfYml0c3RyZWFtLmgiCisjaW5jbHVkZSAic2FjZW5jX2NvbnN0LmgiCisKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworI2luY2x1ZGUgIkZES19tYXRyaXhDYWxsb2MuaCIKKyNpbmNsdWRlICJzYWNlbmNfbmxjX2VuYy5oIgorCisvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1BWF9GUkVRX1JFU19JTkRFWCA4CisjZGVmaW5lIE1BWF9TQU1QTElOR19GUkVRVUVOQ1lfSU5ERVggMTMKKyNkZWZpbmUgU0FNUExJTkdfRlJFUVVFTkNZX0lOREVYX0VTQ0FQRSAxNQorCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisgIFNDSEFSIGNsZF9vbGRbU0FDRU5DX01BWF9OVU1fQk9YRVNdW01BWF9OVU1fQklOU107CisgIFNDSEFSIGljY19vbGRbU0FDRU5DX01BWF9OVU1fQk9YRVNdW01BWF9OVU1fQklOU107CisgIFVDSEFSIHF1YW50Q29hcnNlQ2xkUHJldltTQUNFTkNfTUFYX05VTV9CT1hFU11bTUFYX05VTV9QQVJBTVNdOworICBVQ0hBUiBxdWFudENvYXJzZUljY1ByZXZbU0FDRU5DX01BWF9OVU1fQk9YRVNdW01BWF9OVU1fUEFSQU1TXTsKKworfSBQUkVWX09UVERBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgUFJFVl9PVFREQVRBIHByZXZPdHREYXRhOworCit9IFNUQVRJQ19TUEFUSUFMRlJBTUU7CisKK3R5cGVkZWYgc3RydWN0IEJTRl9JTlNUQU5DRSB7CisgIFNQQVRJQUxTUEVDSUZJQ0NPTkZJRyBzcGF0aWFsU3BlY2lmaWNDb25maWc7CisgIFNQQVRJQUxGUkFNRSBmcmFtZTsKKyAgU1RBVElDX1NQQVRJQUxGUkFNRSBwcmV2RnJhbWVEYXRhOworCit9IEJTRl9JTlNUQU5DRTsKKworLyogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGNvbnN0IElOVCBTYW1wbGVSYXRlVGFibGVbTUFYX1NBTVBMSU5HX0ZSRVFVRU5DWV9JTkRFWF0gPSB7CisgICAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwgMjQwMDAsCisgICAgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAsICA3MzUwfTsKKworc3RhdGljIGNvbnN0IFVDSEFSIEZyZXFSZXNCaW5UYWJsZV9MRFtNQVhfRlJFUV9SRVNfSU5ERVhdID0gezAsIDIzLCAxNSwgMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwgNywgIDUsICA0fTsKK3N0YXRpYyBjb25zdCBVQ0hBUiBGcmVxUmVzU3RyaWRlVGFibGVfTERbXSA9IHsxLCAyLCA1LCAyM307CisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEZES19TQUNFTkNfRVJST1IgRHVwbGljYXRlTG9zc2xlc3NEYXRhKAorICAgIGNvbnN0IElOVCBzdGFydEJveCwgY29uc3QgSU5UIHN0b3BCb3gsCisgICAgY29uc3QgTE9TU0xFU1NEQVRBICpjb25zdCBoTG9zc2xlc3NEYXRhRnJvbSwgY29uc3QgSU5UIHNldEZyb20sCisgICAgTE9TU0xFU1NEQVRBICpjb25zdCBoTG9zc2xlc3NEYXRhVG8sIGNvbnN0IElOVCBzZXRUbykgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgoTlVMTCA9PSBoTG9zc2xlc3NEYXRhRnJvbSkgfHwgKE5VTEwgPT0gaExvc3NsZXNzRGF0YVRvKSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGludCBpOworCisgICAgZm9yIChpID0gc3RhcnRCb3g7IGkgPCBzdG9wQm94OyBpKyspIHsKKyAgICAgIGhMb3NzbGVzc0RhdGFUby0+YnNYWFhEYXRhTW9kZVtpXVtzZXRUb10gPQorICAgICAgICAgIGhMb3NzbGVzc0RhdGFGcm9tLT5ic1hYWERhdGFNb2RlW2ldW3NldEZyb21dOworICAgICAgaExvc3NsZXNzRGF0YVRvLT5ic0RhdGFQYWlyW2ldW3NldFRvXSA9CisgICAgICAgICAgaExvc3NsZXNzRGF0YUZyb20tPmJzRGF0YVBhaXJbaV1bc2V0RnJvbV07CisgICAgICBoTG9zc2xlc3NEYXRhVG8tPmJzUXVhbnRDb2Fyc2VYWFhbaV1bc2V0VG9dID0KKyAgICAgICAgICBoTG9zc2xlc3NEYXRhRnJvbS0+YnNRdWFudENvYXJzZVhYWFtpXVtzZXRGcm9tXTsKKyAgICAgIGhMb3NzbGVzc0RhdGFUby0+YnNGcmVxUmVzU3RyaWRlWFhYW2ldW3NldFRvXSA9CisgICAgICAgICAgaExvc3NsZXNzRGF0YUZyb20tPmJzRnJlcVJlc1N0cmlkZVhYWFtpXVtzZXRGcm9tXTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGVycm9yOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZHVwbGljYXRlUGFyYW1ldGVyU2V0KAorICAgIGNvbnN0IFNQQVRJQUxGUkFNRSAqY29uc3QgaEZyb20sIGNvbnN0IElOVCBzZXRGcm9tLCBTUEFUSUFMRlJBTUUgKmNvbnN0IGhUbywKKyAgICBjb25zdCBJTlQgc2V0VG8pIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKE5VTEwgPT0gaEZyb20pIHx8IChOVUxMID09IGhUbykpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgYm94OworICAgIC8qIE9ubHkgQ29weSBQYXJhbWV0ZXIgU2V0IHNlbGVjdGl2ZSBzdHVmZiAqLworCisgICAgLyogT1RULURhdGEgKi8KKyAgICBmb3IgKGJveCA9IDA7IGJveCA8IFNBQ0VOQ19NQVhfTlVNX0JPWEVTOyBib3grKykgeworICAgICAgRkRLbWVtY3B5KGhUby0+b3R0RGF0YS5jbGRbYm94XVtzZXRUb10sIGhGcm9tLT5vdHREYXRhLmNsZFtib3hdW3NldEZyb21dLAorICAgICAgICAgICAgICAgIHNpemVvZihoRnJvbS0+b3R0RGF0YS5jbGRbMF1bMF0pKTsKKyAgICAgIEZES21lbWNweShoVG8tPm90dERhdGEuaWNjW2JveF1bc2V0VG9dLCBoRnJvbS0+b3R0RGF0YS5pY2NbYm94XVtzZXRGcm9tXSwKKyAgICAgICAgICAgICAgICBzaXplb2YoaEZyb20tPm90dERhdGEuaWNjWzBdWzBdKSk7CisgICAgfQorCisgICAgLyogTE9TU0xFU1NEQVRBICovCisgICAgRHVwbGljYXRlTG9zc2xlc3NEYXRhKDAsIFNBQ0VOQ19NQVhfTlVNX0JPWEVTLCAmaEZyb20tPkNMRExvc3NsZXNzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RnJvbSwgJmhUby0+Q0xETG9zc2xlc3NEYXRhLCBzZXRUbyk7CisgICAgRHVwbGljYXRlTG9zc2xlc3NEYXRhKDAsIFNBQ0VOQ19NQVhfTlVNX0JPWEVTLCAmaEZyb20tPklDQ0xvc3NsZXNzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RnJvbSwgJmhUby0+SUNDTG9zc2xlc3NEYXRhLCBzZXRUbyk7CisKKyAgfSAvKiB2YWxpZCBoYW5kbGUgKi8KKworICByZXR1cm4gZXJyb3I7Cit9CisKKy8qIHNldCBmcmFtZSBkZWZhdWx0cyAqLworc3RhdGljIHZvaWQgY2xlYXJGcmFtZShTUEFUSUFMRlJBTUUgKmNvbnN0IHBGcmFtZSkgeworICBGREttZW1jbGVhcihwRnJhbWUsIHNpemVvZihTUEFUSUFMRlJBTUUpKTsKKworICBwRnJhbWUtPmJzSW5kZXBlbmRlbmN5RmxhZyA9IDE7CisgIHBGcmFtZS0+ZnJhbWluZ0luZm8ubnVtUGFyYW1TZXRzID0gMTsKK30KKworc3RhdGljIHZvaWQgZmluZTJjb2Fyc2UoU0NIQVIgKmNvbnN0IGRhdGEsIGNvbnN0IERBVEFfVFlQRSBkYXRhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzdGFydEJhbmQsIGNvbnN0IElOVCBudW1CYW5kcykgeworICBpbnQgaTsKKyAgaWYgKGRhdGFUeXBlID09IHRfQ0xEKSB7CisgICAgZm9yIChpID0gc3RhcnRCYW5kOyBpIDwgc3RhcnRCYW5kICsgbnVtQmFuZHM7IGkrKykgeworICAgICAgZGF0YVtpXSAvPSAyOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSBzdGFydEJhbmQ7IGkgPCBzdGFydEJhbmQgKyBudW1CYW5kczsgaSsrKSB7CisgICAgICBkYXRhW2ldID4+PSAxOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBjb2Fyc2UyZmluZShTQ0hBUiAqY29uc3QgZGF0YSwgY29uc3QgREFUQV9UWVBFIGRhdGFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHN0YXJ0QmFuZCwgY29uc3QgSU5UIG51bUJhbmRzKSB7CisgIGludCBpOworCisgIGZvciAoaSA9IHN0YXJ0QmFuZDsgaSA8IHN0YXJ0QmFuZCArIG51bUJhbmRzOyBpKyspIHsKKyAgICBkYXRhW2ldIDw8PSAxOworICB9CisKKyAgaWYgKGRhdGFUeXBlID09IHRfQ0xEKSB7CisgICAgZm9yIChpID0gc3RhcnRCYW5kOyBpIDwgc3RhcnRCYW5kICsgbnVtQmFuZHM7IGkrKykgeworICAgICAgaWYgKGRhdGFbaV0gPT0gLTE0KSB7CisgICAgICAgIGRhdGFbaV0gPSAtMTU7CisgICAgICB9IGVsc2UgaWYgKGRhdGFbaV0gPT0gMTQpIHsKKyAgICAgICAgZGF0YVtpXSA9IDE1OworICAgICAgfQorICAgIH0KKyAgfSAvKiAoZGF0YVR5cGUgPT0gdF9DTEQpICovCit9CisKK3N0YXRpYyBVQ0hBUiBnZXRCc0ZyZXFSZXNTdHJpZGUoY29uc3QgSU5UIGluZGV4KSB7CisgIGNvbnN0IFVDSEFSICpwRnJlcVJlc1N0cmlkZVRhYmxlID0gTlVMTDsKKyAgaW50IGZyZXFSZXNTdHJpZGVUYWJsZVNpemUgPSAwOworCisgIHBGcmVxUmVzU3RyaWRlVGFibGUgPSBGcmVxUmVzU3RyaWRlVGFibGVfTEQ7CisgIGZyZXFSZXNTdHJpZGVUYWJsZVNpemUgPQorICAgICAgc2l6ZW9mKEZyZXFSZXNTdHJpZGVUYWJsZV9MRCkgLyBzaXplb2YoKkZyZXFSZXNTdHJpZGVUYWJsZV9MRCk7CisKKyAgcmV0dXJuICgoKE5VTEwgIT0gcEZyZXFSZXNTdHJpZGVUYWJsZSkgJiYgKGluZGV4ID49IDApICYmCisgICAgICAgICAgIChpbmRleCA8IGZyZXFSZXNTdHJpZGVUYWJsZVNpemUpKQorICAgICAgICAgICAgICA/IHBGcmVxUmVzU3RyaWRlVGFibGVbaW5kZXhdCisgICAgICAgICAgICAgIDogMSk7Cit9CisKKy8qIHdyaXRlIGRhdGEgdG8gYml0c3RyZWFtICovCitzdGF0aWMgdm9pZCBlY0RhdGEoSEFORExFX0ZES19CSVRTVFJFQU0gYml0c3RyZWFtLAorICAgICAgICAgICAgICAgICAgIFNDSEFSIGRhdGFbTUFYX05VTV9QQVJBTVNdW01BWF9OVU1fQklOU10sCisgICAgICAgICAgICAgICAgICAgU0NIQVIgb2xkRGF0YVtNQVhfTlVNX0JJTlNdLAorICAgICAgICAgICAgICAgICAgIFVDSEFSIHF1YW50Q29hcnNlWFhYcHJldltNQVhfTlVNX1BBUkFNU10sCisgICAgICAgICAgICAgICAgICAgTE9TU0xFU1NEQVRBICpjb25zdCBsb3NzbGVzc0RhdGEsIGNvbnN0IERBVEFfVFlQRSBkYXRhVHlwZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgcGFyYW1JZHgsIGNvbnN0IElOVCBudW1QYXJhbVNldHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGluZGVwZW5kZW5jeUZsYWcsIGNvbnN0IElOVCBzdGFydEJhbmQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHN0b3BCYW5kLCBjb25zdCBJTlQgZGVmYXVsdFZhbHVlKSB7CisgIGludCBwcywgcGIsIHN0ck9mZnNldCwgcGJTdHJpZGUsIGRhdGFCYW5kcywgaTsKKyAgaW50IGFTdHJpZGVzW01BWF9OVU1fQklOUyArIDFdID0gezB9OworICBTSE9SVCBjbXBJZHhEYXRhWzJdW01BWF9OVU1fQklOU10gPSB7ezB9fTsKKyAgU0hPUlQgY21wT2xkRGF0YVtNQVhfTlVNX0JJTlNdID0gezB9OworCisgIC8qIGJzWFhYRGF0YU1vZGUgKi8KKyAgaWYgKGluZGVwZW5kZW5jeUZsYWcgfHwgKGxvc3NsZXNzRGF0YS0+YnNRdWFudENvYXJzZVhYWFtwYXJhbUlkeF1bMF0gIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50Q29hcnNlWFhYcHJldltwYXJhbUlkeF0pKSB7CisgICAgbG9zc2xlc3NEYXRhLT5ic1hYWERhdGFNb2RlW3BhcmFtSWR4XVswXSA9IEZJTkVDT0FSU0U7CisgIH0gZWxzZSB7CisgICAgbG9zc2xlc3NEYXRhLT5ic1hYWERhdGFNb2RlW3BhcmFtSWR4XVswXSA9IEtFRVA7CisgICAgZm9yIChpID0gc3RhcnRCYW5kOyBpIDwgc3RvcEJhbmQ7IGkrKykgeworICAgICAgaWYgKGRhdGFbMF1baV0gIT0gb2xkRGF0YVtpXSkgeworICAgICAgICBsb3NzbGVzc0RhdGEtPmJzWFhYRGF0YU1vZGVbcGFyYW1JZHhdWzBdID0gRklORUNPQVJTRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgRkRLd3JpdGVCaXRzKGJpdHN0cmVhbSwgbG9zc2xlc3NEYXRhLT5ic1hYWERhdGFNb2RlW3BhcmFtSWR4XVswXSwgMik7CisKKyAgZm9yIChwcyA9IDE7IHBzIDwgbnVtUGFyYW1TZXRzOyBwcysrKSB7CisgICAgaWYgKGxvc3NsZXNzRGF0YS0+YnNRdWFudENvYXJzZVhYWFtwYXJhbUlkeF1bcHNdICE9CisgICAgICAgIGxvc3NsZXNzRGF0YS0+YnNRdWFudENvYXJzZVhYWFtwYXJhbUlkeF1bcHMgLSAxXSkgeworICAgICAgbG9zc2xlc3NEYXRhLT5ic1hYWERhdGFNb2RlW3BhcmFtSWR4XVtwc10gPSBGSU5FQ09BUlNFOworICAgIH0gZWxzZSB7CisgICAgICBsb3NzbGVzc0RhdGEtPmJzWFhYRGF0YU1vZGVbcGFyYW1JZHhdW3BzXSA9IEtFRVA7CisgICAgICBmb3IgKGkgPSBzdGFydEJhbmQ7IGkgPCBzdG9wQmFuZDsgaSsrKSB7CisgICAgICAgIGlmIChkYXRhW3BzXVtpXSAhPSBkYXRhW3BzIC0gMV1baV0pIHsKKyAgICAgICAgICBsb3NzbGVzc0RhdGEtPmJzWFhYRGF0YU1vZGVbcGFyYW1JZHhdW3BzXSA9IEZJTkVDT0FSU0U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBGREt3cml0ZUJpdHMoYml0c3RyZWFtLCBsb3NzbGVzc0RhdGEtPmJzWFhYRGF0YU1vZGVbcGFyYW1JZHhdW3BzXSwgMik7CisgIH0gLyogZm9yIHBzICovCisKKyAgLyogQ3JlYXRlIGRhdGEgcGFpcnMgaWYgcG9zc2libGUgKi8KKyAgZm9yIChwcyA9IDA7IHBzIDwgKG51bVBhcmFtU2V0cyAtIDEpOyBwcysrKSB7CisgICAgaWYgKGxvc3NsZXNzRGF0YS0+YnNYWFhEYXRhTW9kZVtwYXJhbUlkeF1bcHNdID09IEZJTkVDT0FSU0UpIHsKKyAgICAgIC8qIENoZWNrIGlmIG5leHQgcGFyYW1ldGVyIHNldCBpcyBGSU5DT0FSU0UgKi8KKyAgICAgIGlmIChsb3NzbGVzc0RhdGEtPmJzWFhYRGF0YU1vZGVbcGFyYW1JZHhdW3BzICsgMV0gPT0gRklORUNPQVJTRSkgeworICAgICAgICAvKiBXZSBoYXZlIHRvIGNoZWNrIGlmIHBzIGFuZCBwcysxIHVzZSB0aGUgc2FtZSBic1hYWFF1YW50TW9kZSAqLworICAgICAgICAvKiBhbmQgYWxzbyBoYXZlIHRoZSBzYW1lIHN0cmlkZSAqLworICAgICAgICBpZiAoKGxvc3NsZXNzRGF0YS0+YnNRdWFudENvYXJzZVhYWFtwYXJhbUlkeF1bcHMgKyAxXSA9PQorICAgICAgICAgICAgIGxvc3NsZXNzRGF0YS0+YnNRdWFudENvYXJzZVhYWFtwYXJhbUlkeF1bcHNdKSAmJgorICAgICAgICAgICAgKGxvc3NsZXNzRGF0YS0+YnNGcmVxUmVzU3RyaWRlWFhYW3BhcmFtSWR4XVtwcyArIDFdID09CisgICAgICAgICAgICAgbG9zc2xlc3NEYXRhLT5ic0ZyZXFSZXNTdHJpZGVYWFhbcGFyYW1JZHhdW3BzXSkpIHsKKyAgICAgICAgICBsb3NzbGVzc0RhdGEtPmJzRGF0YVBhaXJbcGFyYW1JZHhdW3BzXSA9IDE7CisgICAgICAgICAgbG9zc2xlc3NEYXRhLT5ic0RhdGFQYWlyW3BhcmFtSWR4XVtwcyArIDFdID0gMTsKKworICAgICAgICAgIC8qIFdlIGhhdmUgYSBkYXRhIHBhaXIgLT4gSnVtcCB0byB0aGUgcHMgYWZ0ZXIgbmV4dCBwcyovCisgICAgICAgICAgcHMrKzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogZGF0YU1vZGUgb2YgbmV4dCBwcyBpcyBub3QgRklORUNPQVJTRSBvciBkb2VzIG5vdCB1c2UgdGhlIHNhbWUKKyAgICAgICAqIGJzWFhYUXVhbnRNb2RlL3N0cmlkZSAqLworICAgICAgLyogLT4gbm8gZGF0YVBhaXIgcG9zc2libGUgKi8KKyAgICAgIGxvc3NsZXNzRGF0YS0+YnNEYXRhUGFpcltwYXJhbUlkeF1bcHNdID0gMDsKKworICAgICAgLyogSW5pdGlhbGl6ZSBwcyBhZnRlciBuZXh0IHBzIHRvIFplcm8gKG9ubHkgaW1wb3J0YW50IGZvciB0aGUgbGFzdAorICAgICAgICogcGFyYW1ldGVyIHNldCkgKi8KKyAgICAgIGxvc3NsZXNzRGF0YS0+YnNEYXRhUGFpcltwYXJhbUlkeF1bcHMgKyAxXSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIE5vIEZJTkVDT0FSU0UgLT4gbm8gZGF0YSBwYWlyIHBvc3NpYmxlICovCisgICAgICBsb3NzbGVzc0RhdGEtPmJzRGF0YVBhaXJbcGFyYW1JZHhdW3BzXSA9IDA7CisKKyAgICAgIC8qIEluaXRpYWxpemUgcHMgYWZ0ZXIgbmV4dCBwcyB0byBaZXJvIChvbmx5IGltcG9ydGFudCBmb3IgdGhlIGxhc3QKKyAgICAgICAqIHBhcmFtZXRlciBzZXQpICovCisgICAgICBsb3NzbGVzc0RhdGEtPmJzRGF0YVBhaXJbcGFyYW1JZHhdW3BzICsgMV0gPSAwOworICAgIH0KKyAgfSAvKiBmb3IgcHMgKi8KKworICBmb3IgKHBzID0gMDsgcHMgPCBudW1QYXJhbVNldHM7IHBzKyspIHsKKyAgICBpZiAobG9zc2xlc3NEYXRhLT5ic1hYWERhdGFNb2RlW3BhcmFtSWR4XVtwc10gPT0gREVGQVVMVCkgeworICAgICAgLyogUHJlcGFyZSBvbGQgZGF0YSAqLworICAgICAgZm9yIChpID0gc3RhcnRCYW5kOyBpIDwgc3RvcEJhbmQ7IGkrKykgeworICAgICAgICBvbGREYXRhW2ldID0gZGVmYXVsdFZhbHVlOworICAgICAgfQorICAgICAgcXVhbnRDb2Fyc2VYWFhwcmV2W3BhcmFtSWR4XSA9IDA7IC8qIERlZmF1bHQgZGF0YSBhcmUgYWx3YXlzIGZpbmUgKi8KKyAgICB9CisKKyAgICBpZiAobG9zc2xlc3NEYXRhLT5ic1hYWERhdGFNb2RlW3BhcmFtSWR4XVtwc10gPT0gRklORUNPQVJTRSkgeworICAgICAgRkRLd3JpdGVCaXRzKGJpdHN0cmVhbSwgbG9zc2xlc3NEYXRhLT5ic0RhdGFQYWlyW3BhcmFtSWR4XVtwc10sIDEpOworICAgICAgRkRLd3JpdGVCaXRzKGJpdHN0cmVhbSwgbG9zc2xlc3NEYXRhLT5ic1F1YW50Q29hcnNlWFhYW3BhcmFtSWR4XVtwc10sIDEpOworICAgICAgRkRLd3JpdGVCaXRzKGJpdHN0cmVhbSwgbG9zc2xlc3NEYXRhLT5ic0ZyZXFSZXNTdHJpZGVYWFhbcGFyYW1JZHhdW3BzXSwKKyAgICAgICAgICAgICAgICAgICAyKTsKKworICAgICAgaWYgKGxvc3NsZXNzRGF0YS0+YnNRdWFudENvYXJzZVhYWFtwYXJhbUlkeF1bcHNdICE9CisgICAgICAgICAgcXVhbnRDb2Fyc2VYWFhwcmV2W3BhcmFtSWR4XSkgeworICAgICAgICBpZiAocXVhbnRDb2Fyc2VYWFhwcmV2W3BhcmFtSWR4XSkgeworICAgICAgICAgIGNvYXJzZTJmaW5lKG9sZERhdGEsIGRhdGFUeXBlLCBzdGFydEJhbmQsIHN0b3BCYW5kIC0gc3RhcnRCYW5kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmaW5lMmNvYXJzZShvbGREYXRhLCBkYXRhVHlwZSwgc3RhcnRCYW5kLCBzdG9wQmFuZCAtIHN0YXJ0QmFuZCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogSGFuZGxlIHN0cmlkZXMgKi8KKyAgICAgIHBiU3RyaWRlID0KKyAgICAgICAgICBnZXRCc0ZyZXFSZXNTdHJpZGUobG9zc2xlc3NEYXRhLT5ic0ZyZXFSZXNTdHJpZGVYWFhbcGFyYW1JZHhdW3BzXSk7CisgICAgICBkYXRhQmFuZHMgPSAoc3RvcEJhbmQgLSBzdGFydEJhbmQgLSAxKSAvIHBiU3RyaWRlICsgMTsKKworICAgICAgYVN0cmlkZXNbMF0gPSBzdGFydEJhbmQ7CisgICAgICBmb3IgKHBiID0gMTsgcGIgPD0gZGF0YUJhbmRzOyBwYisrKSB7CisgICAgICAgIGFTdHJpZGVzW3BiXSA9IGFTdHJpZGVzW3BiIC0gMV0gKyBwYlN0cmlkZTsKKyAgICAgIH0KKworICAgICAgc3RyT2Zmc2V0ID0gMDsKKyAgICAgIHdoaWxlIChhU3RyaWRlc1tkYXRhQmFuZHNdID4gc3RvcEJhbmQpIHsKKyAgICAgICAgaWYgKHN0ck9mZnNldCA8IGRhdGFCYW5kcykgeworICAgICAgICAgIHN0ck9mZnNldCsrOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IHN0ck9mZnNldDsgaSA8PSBkYXRhQmFuZHM7IGkrKykgeworICAgICAgICAgIGFTdHJpZGVzW2ldLS07CisgICAgICAgIH0KKyAgICAgIH0gLyogd2hpbGUgKi8KKworICAgICAgZm9yIChwYiA9IDA7IHBiIDwgZGF0YUJhbmRzOyBwYisrKSB7CisgICAgICAgIGNtcE9sZERhdGFbc3RhcnRCYW5kICsgcGJdID0gb2xkRGF0YVthU3RyaWRlc1twYl1dOworICAgICAgICBjbXBJZHhEYXRhWzBdW3N0YXJ0QmFuZCArIHBiXSA9IGRhdGFbcHNdW2FTdHJpZGVzW3BiXV07CisKKyAgICAgICAgaWYgKGxvc3NsZXNzRGF0YS0+YnNEYXRhUGFpcltwYXJhbUlkeF1bcHNdKSB7CisgICAgICAgICAgY21wSWR4RGF0YVsxXVtzdGFydEJhbmQgKyBwYl0gPSBkYXRhW3BzICsgMV1bYVN0cmlkZXNbcGJdXTsKKyAgICAgICAgfQorICAgICAgfSAvKiBmb3IgcGIqLworCisgICAgICAvKiBGaW5hbGx5IGVuY29kZSAqLworICAgICAgaWYgKGxvc3NsZXNzRGF0YS0+YnNEYXRhUGFpcltwYXJhbUlkeF1bcHNdKSB7CisgICAgICAgIGZka19zYWNlbmNfZWNEYXRhUGFpckVuYyhiaXRzdHJlYW0sIGNtcElkeERhdGEsIGNtcE9sZERhdGEsIGRhdGFUeXBlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRCYW5kLCBkYXRhQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3NzbGVzc0RhdGEtPmJzUXVhbnRDb2Fyc2VYWFhbcGFyYW1JZHhdW3BzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVwZW5kZW5jeUZsYWcgJiYgKHBzID09IDApKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZka19zYWNlbmNfZWNEYXRhU2luZ2xlRW5jKGJpdHN0cmVhbSwgY21wSWR4RGF0YSwgY21wT2xkRGF0YSwgZGF0YVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHN0YXJ0QmFuZCwgZGF0YUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3NzbGVzc0RhdGEtPmJzUXVhbnRDb2Fyc2VYWFhbcGFyYW1JZHhdW3BzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXBlbmRlbmN5RmxhZyAmJiAocHMgPT0gMCkpOworICAgICAgfQorCisgICAgICAvKiBPdmVyd3JpdGUgb2xkIGRhdGEgKi8KKyAgICAgIGZvciAoaSA9IHN0YXJ0QmFuZDsgaSA8IHN0b3BCYW5kOyBpKyspIHsKKyAgICAgICAgaWYgKGxvc3NsZXNzRGF0YS0+YnNEYXRhUGFpcltwYXJhbUlkeF1bcHNdKSB7CisgICAgICAgICAgb2xkRGF0YVtpXSA9IGRhdGFbcHMgKyAxXVtpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvbGREYXRhW2ldID0gZGF0YVtwc11baV07CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcXVhbnRDb2Fyc2VYWFhwcmV2W3BhcmFtSWR4XSA9CisgICAgICAgICAgbG9zc2xlc3NEYXRhLT5ic1F1YW50Q29hcnNlWFhYW3BhcmFtSWR4XVtwc107CisKKyAgICAgIC8qIEp1bXAgZm9yd2FyZCBpZiB3ZSBoYXZlIGVuY29kZWQgYSBkYXRhIHBhaXIgKi8KKyAgICAgIGlmIChsb3NzbGVzc0RhdGEtPmJzRGF0YVBhaXJbcGFyYW1JZHhdW3BzXSkgeworICAgICAgICBwcysrOworICAgICAgfQorCisgICAgfSAvKiBpZiAobG9zc2xlc3NEYXRhLT5ic1hYWERhdGFNb2RlW3BhcmFtSWR4XVtwc10gPT0gRklORUNPQVJTRSApICovCisgIH0gICAvKiBmb3IgcHMgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCaXRzdHJlYW0gZm9ybWF0dGVyIGludGVyZmFjZSBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEZES19TQUNFTkNfRVJST1IgZ2V0QnNGcmVxUmVzSW5kZXgoY29uc3QgSU5UIG51bUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpjb25zdCBwYnNGcmVxUmVzSW5kZXgpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoTlVMTCA9PSBwYnNGcmVxUmVzSW5kZXgpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBVQ0hBUiAqcEZyZXFSZXNCaW5UYWJsZSA9IEZyZXFSZXNCaW5UYWJsZV9MRDsKKyAgICBpbnQgaTsKKyAgICAqcGJzRnJlcVJlc0luZGV4ID0gLTE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0ZSRVFfUkVTX0lOREVYOyBpKyspIHsKKyAgICAgIGlmIChudW1CYW5kcyA9PSBwRnJlcVJlc0JpblRhYmxlW2ldKSB7CisgICAgICAgICpwYnNGcmVxUmVzSW5kZXggPSBpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCpwYnNGcmVxUmVzSW5kZXggPCAwIHx8ICpwYnNGcmVxUmVzSW5kZXggPj0gTUFYX0ZSRVFfUkVTX0lOREVYKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiBnZXRTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4KAorICAgIGNvbnN0IElOVCBic1NhbXBsaW5nRnJlcXVlbmN5LCBJTlQgKmNvbnN0IHBic1NhbXBsaW5nRnJlcXVlbmN5SW5kZXgpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoTlVMTCA9PSBwYnNTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4KSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaW50IGk7CisgICAgKnBic1NhbXBsaW5nRnJlcXVlbmN5SW5kZXggPSBTQU1QTElOR19GUkVRVUVOQ1lfSU5ERVhfRVNDQVBFOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9TQU1QTElOR19GUkVRVUVOQ1lfSU5ERVg7IGkrKykgeworICAgICAgaWYgKGJzU2FtcGxpbmdGcmVxdWVuY3kgPT0gU2FtcGxlUmF0ZVRhYmxlW2ldKSB7IC8qc3BhdGlhbCBzYW1wbGluZyByYXRlKi8KKyAgICAgICAgKnBic1NhbXBsaW5nRnJlcXVlbmN5SW5kZXggPSBpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGVycm9yOworfQorCisvKiBkZXN0cm95IGVuY29kZXIgaW5zdGFuY2UgKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19kZXN0cm95U3BhdGlhbEJpdHN0cmVhbUVuY29kZXIoCisgICAgSEFORExFX0JTRl9JTlNUQU5DRSAqc2VsZlB0cikgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgoc2VsZlB0ciA9PSBOVUxMKSB8fCAoKnNlbGZQdHIgPT0gTlVMTCkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoKnNlbGZQdHIgIT0gTlVMTCkgeworICAgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKCpzZWxmUHRyKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGVycm9yOworfQorCisvKiBjcmVhdGUgZW5jb2RlciBpbnN0YW5jZSAqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2NyZWF0ZVNwYXRpYWxCaXRzdHJlYW1FbmNvZGVyKAorICAgIEhBTkRMRV9CU0ZfSU5TVEFOQ0UgKnNlbGZQdHIpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoTlVMTCA9PSBzZWxmUHRyKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgLyogYWxsb2NhdGUgZW5jb2RlciBzdHJ1Y3QgKi8KKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKCpzZWxmUHRyLCAxLCBCU0ZfSU5TVEFOQ0UpOworICB9CisgIHJldHVybiBlcnJvcjsKKworYmFpbDoKKyAgZmRrX3NhY2VuY19kZXN0cm95U3BhdGlhbEJpdHN0cmVhbUVuY29kZXIoc2VsZlB0cik7CisgIHJldHVybiAoKFNBQ0VOQ19PSyA9PSBlcnJvcikgPyBTQUNFTkNfTUVNT1JZX0VSUk9SIDogZXJyb3IpOworfQorCisvKiBpbml0IGVuY29kZXIgaW5zdGFuY2UgKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19pbml0U3BhdGlhbEJpdHN0cmVhbUVuY29kZXIoCisgICAgSEFORExFX0JTRl9JTlNUQU5DRSBzZWxmUHRyKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKHNlbGZQdHIgPT0gTlVMTCkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIC8qIGluaXQvY2xlYXIgKi8KKyAgICBjbGVhckZyYW1lKCZzZWxmUHRyLT5mcmFtZSk7CisKKyAgfSAvKiB2YWxpZCBoYW5kbGUgKi8KKyAgcmV0dXJuIGVycm9yOworfQorCisvKiBnZXQgU3BhdGlhbFNwZWNpZmljQ29uZmlnIHN0cnVjdCAqLworU1BBVElBTFNQRUNJRklDQ09ORklHICpmZGtfc2FjZW5jX2dldFNwYXRpYWxTcGVjaWZpY0NvbmZpZygKKyAgICBIQU5ETEVfQlNGX0lOU1RBTkNFIHNlbGZQdHIpIHsKKyAgcmV0dXJuICgoc2VsZlB0ciA9PSBOVUxMKSA/IE5VTEwgOiAmKHNlbGZQdHItPnNwYXRpYWxTcGVjaWZpY0NvbmZpZykpOworfQorCisvKiB3cml0ZSBTcGF0aWFsU3BlY2lmaWNDb25maWcgdG8gc3RyZWFtICovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfd3JpdGVTcGF0aWFsU3BlY2lmaWNDb25maWcoCisgICAgU1BBVElBTFNQRUNJRklDQ09ORklHICpjb25zdCBzcGF0aWFsU3BlY2lmaWNDb25maWcsCisgICAgVUNIQVIgKmNvbnN0IHBPdXRwdXRCdWZmZXIsIGNvbnN0IElOVCBvdXRwdXRCdWZmZXJTaXplLAorICAgIElOVCAqY29uc3QgcG5PdXRwdXRCaXRzKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisgIElOVCBic1NhbXBsaW5nRnJlcXVlbmN5SW5kZXggPSAwOworICBJTlQgYnNGcmVxUmVzID0gMDsKKworICBpZiAoKHNwYXRpYWxTcGVjaWZpY0NvbmZpZyA9PSBOVUxMKSB8fCAocE91dHB1dEJ1ZmZlciA9PSBOVUxMKSB8fAorICAgICAgKHBuT3V0cHV0Qml0cyA9PSBOVUxMKSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIEZES19CSVRTVFJFQU0gYml0c3RyZWFtOworCisgICAgLyogRmluZCBGcmVxUmVzICovCisgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBnZXRCc0ZyZXFSZXNJbmRleChzcGF0aWFsU3BlY2lmaWNDb25maWctPm51bUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJzRnJlcVJlcykpKQorICAgICAgZ290byBiYWlsOworCisgICAgLyogRmluZCBTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ICovCisgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBnZXRTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4KAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsU3BlY2lmaWNDb25maWctPmJzU2FtcGxpbmdGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZic1NhbXBsaW5nRnJlcXVlbmN5SW5kZXgpKSkKKyAgICAgIGdvdG8gYmFpbDsKKworICAgIC8qIGJpbmQgZXh0ZXJuIGJ1ZmZlciB0byBiaXRzdHJlYW0gaGFuZGxlICovCisgICAgRkRLaW5pdEJpdFN0cmVhbSgmYml0c3RyZWFtLCBwT3V0cHV0QnVmZmVyLCBvdXRwdXRCdWZmZXJTaXplLCAwLCBCU19XUklURVIpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogd3JpdGUgdG8gYml0c3RyZWFtICovCisKKyAgICBGREt3cml0ZUJpdHMoJmJpdHN0cmVhbSwgYnNTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4LCA0KTsKKworICAgIGlmIChic1NhbXBsaW5nRnJlcXVlbmN5SW5kZXggPT0gMTUpIHsKKyAgICAgIEZES3dyaXRlQml0cygmYml0c3RyZWFtLCBzcGF0aWFsU3BlY2lmaWNDb25maWctPmJzU2FtcGxpbmdGcmVxdWVuY3ksIDI0KTsKKyAgICB9CisKKyAgICBGREt3cml0ZUJpdHMoJmJpdHN0cmVhbSwgc3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic0ZyYW1lTGVuZ3RoLCA1KTsKKworICAgIEZES3dyaXRlQml0cygmYml0c3RyZWFtLCBic0ZyZXFSZXMsIDMpOworICAgIEZES3dyaXRlQml0cygmYml0c3RyZWFtLCBzcGF0aWFsU3BlY2lmaWNDb25maWctPmJzVHJlZUNvbmZpZywgNCk7CisgICAgRkRLd3JpdGVCaXRzKCZiaXRzdHJlYW0sIHNwYXRpYWxTcGVjaWZpY0NvbmZpZy0+YnNRdWFudE1vZGUsIDIpOworCisgICAgRkRLd3JpdGVCaXRzKCZiaXRzdHJlYW0sIDAsIDEpOyAvKiBic0FyYml0cmFyeURvd25taXggKi8KKworICAgIEZES3dyaXRlQml0cygmYml0c3RyZWFtLCBzcGF0aWFsU3BlY2lmaWNDb25maWctPmJzRml4ZWRHYWluRE1YLCAzKTsKKworICAgIEZES3dyaXRlQml0cygmYml0c3RyZWFtLCBURU1QU0hBUEVfT0ZGLCAyKTsKKyAgICBGREt3cml0ZUJpdHMoJmJpdHN0cmVhbSwgc3BhdGlhbFNwZWNpZmljQ29uZmlnLT5ic0RlY29yckNvbmZpZywgMik7CisKKyAgICBGREtieXRlQWxpZ24oJmJpdHN0cmVhbSwgMCk7IC8qIGJ5dGUgYWxpZ25tZW50ICovCisKKyAgICAvKiByZXR1cm4gbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYml0c3RyZWFtICovCisgICAgaWYgKCgqcG5PdXRwdXRCaXRzID0gRkRLZ2V0VmFsaWRCaXRzKCZiaXRzdHJlYW0pKSA+CisgICAgICAgIChvdXRwdXRCdWZmZXJTaXplICogOCkpIHsKKyAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qIHRlcm1pbmF0ZSBidWZmZXIgd2l0aCBhbGlnbm1lbnQgKi8KKyAgICBGREtieXRlQWxpZ24oJmJpdHN0cmVhbSwgMCk7CisKKyAgfSAvKiB2YWxpZCBoYW5kbGUgKi8KKworYmFpbDoKKyAgcmV0dXJuIGVycm9yOworfQorCisvKiBnZXQgU3BhdGlhbEZyYW1lIHN0cnVjdCAqLworU1BBVElBTEZSQU1FICpmZGtfc2FjZW5jX2dldFNwYXRpYWxGcmFtZShIQU5ETEVfQlNGX0lOU1RBTkNFIHNlbGZQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNQQVRJQUxGUkFNRV9UWVBFIGZyYW1lVHlwZSkgeworICBpbnQgaWR4ID0gLTE7CisKKyAgc3dpdGNoIChmcmFtZVR5cGUpIHsKKyAgICBjYXNlIFJFQURfU1BBVElBTEZSQU1FOgorICAgIGNhc2UgV1JJVEVfU1BBVElBTEZSQU1FOgorICAgICAgaWR4ID0gMDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZHggPSAtMTsgLyogaW52YWxpZCBjb25maWd1cmF0aW9uICovCisgIH0gICAgICAgICAgICAgLyogc3dpdGNoIGZyYW1lVHlwZSAqLworCisgIHJldHVybiAoKChzZWxmUHRyID09IE5VTEwpIHx8IChpZHggPT0gLTEpKSA/IE5VTEwgOiAmc2VsZlB0ci0+ZnJhbWUpOworfQorCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiB3cml0ZUZyYW1pbmdJbmZvKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZSQU1JTkdJTkZPICpjb25zdCBwRnJhbWluZ0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBmcmFtZUxlbmd0aCkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgoaEJpdHN0cmVhbSA9PSBOVUxMKSB8fCAocEZyYW1pbmdJbmZvID09IE5VTEwpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sIHBGcmFtaW5nSW5mby0+YnNGcmFtaW5nVHlwZSwgMSk7CisgICAgRkRLd3JpdGVCaXRzKGhCaXRzdHJlYW0sIHBGcmFtaW5nSW5mby0+bnVtUGFyYW1TZXRzIC0gMSwgMSk7CisKKyAgICBpZiAocEZyYW1pbmdJbmZvLT5ic0ZyYW1pbmdUeXBlKSB7CisgICAgICBpbnQgcHMgPSAwOworICAgICAgaW50IG51bVBhcmFtU2V0cyA9IHBGcmFtaW5nSW5mby0+bnVtUGFyYW1TZXRzOworCisgICAgICB7CisgICAgICAgIGZvciAocHMgPSAwOyBwcyA8IG51bVBhcmFtU2V0czsgcHMrKykgeworICAgICAgICAgIGludCBiaXRzUGFyYW1TbG90ID0gMDsKKyAgICAgICAgICB3aGlsZSAoKDEgPDwgYml0c1BhcmFtU2xvdCkgPCAoZnJhbWVMZW5ndGggKyAxKSkgYml0c1BhcmFtU2xvdCsrOworICAgICAgICAgIGlmIChiaXRzUGFyYW1TbG90ID4gMCkKKyAgICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLCBwRnJhbWluZ0luZm8tPmJzUGFyYW1TbG90c1twc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgYml0c1BhcmFtU2xvdCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IC8qIHBGcmFtaW5nSW5mby0+YnNGcmFtaW5nVHlwZSAqLworICB9ICAgLyogdmFsaWQgaGFuZGxlICovCisKKyAgcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiB3cml0ZVNtZ0RhdGEoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTTUdEQVRBICpjb25zdCBwU21nRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbnVtUGFyYW1TZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBkYXRhQmFuZHMpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKGhCaXRzdHJlYW0gPT0gTlVMTCkgfHwgKHBTbWdEYXRhID09IE5VTEwpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUGFyYW1TZXRzOyBpKyspIHsKKyAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLCBwU21nRGF0YS0+YnNTbW9vdGhNb2RlW2ldLCAyKTsKKworICAgICAgaWYgKHBTbWdEYXRhLT5ic1Ntb290aE1vZGVbaV0gPj0gMikgeworICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwgcFNtZ0RhdGEtPmJzU21vb3RoVGltZVtpXSwgMik7CisgICAgICB9CisgICAgICBpZiAocFNtZ0RhdGEtPmJzU21vb3RoTW9kZVtpXSA9PSAzKSB7CisgICAgICAgIGNvbnN0IGludCBzdHJpZGUgPSBnZXRCc0ZyZXFSZXNTdHJpZGUocFNtZ0RhdGEtPmJzRnJlcVJlc1N0cmlkZVtpXSk7CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0c3RyZWFtLCBwU21nRGF0YS0+YnNGcmVxUmVzU3RyaWRlW2ldLCAyKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGRhdGFCYW5kczsgaiArPSBzdHJpZGUpIHsKKyAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdHN0cmVhbSwgcFNtZ0RhdGEtPmJzU21nRGF0YVtpXVtqXSwgMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IC8qIGZvciBpICovCisgIH0gICAvKiB2YWxpZCBoYW5kbGUgKi8KKworICByZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBGREtfU0FDRU5DX0VSUk9SIHdyaXRlT3R0RGF0YSgKKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0c3RyZWFtLCBQUkVWX09UVERBVEEgKmNvbnN0IHBQcmV2T3R0RGF0YSwKKyAgICBPVFREQVRBICpjb25zdCBwT3R0RGF0YSwgY29uc3QgT1RUQ09ORklHIG90dENvbmZpZ1tTQUNFTkNfTUFYX05VTV9CT1hFU10sCisgICAgTE9TU0xFU1NEQVRBICpjb25zdCBwQ0xETG9zc2xlc3NEYXRhLCBMT1NTTEVTU0RBVEEgKmNvbnN0IHBJQ0NMb3NzbGVzc0RhdGEsCisgICAgY29uc3QgSU5UIG51bU90dEJveGVzLCBjb25zdCBJTlQgbnVtQmFuZHMsIGNvbnN0IElOVCBudW1QYXJhbVNldHMsCisgICAgY29uc3QgSU5UIGJzSW5kZXBlbmRlbmN5RmxhZykgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgoaEJpdHN0cmVhbSA9PSBOVUxMKSB8fCAocFByZXZPdHREYXRhID09IE5VTEwpIHx8IChwT3R0RGF0YSA9PSBOVUxMKSB8fAorICAgICAgKG90dENvbmZpZyA9PSBOVUxMKSB8fCAocENMRExvc3NsZXNzRGF0YSA9PSBOVUxMKSB8fAorICAgICAgKHBJQ0NMb3NzbGVzc0RhdGEgPT0gTlVMTCkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtT3R0Qm94ZXM7IGkrKykgeworICAgICAgZWNEYXRhKGhCaXRzdHJlYW0sIHBPdHREYXRhLT5jbGRbaV0sIHBQcmV2T3R0RGF0YS0+Y2xkX29sZFtpXSwKKyAgICAgICAgICAgICBwUHJldk90dERhdGEtPnF1YW50Q29hcnNlQ2xkUHJldltpXSwgcENMRExvc3NsZXNzRGF0YSwgdF9DTEQsIGksCisgICAgICAgICAgICAgbnVtUGFyYW1TZXRzLCBic0luZGVwZW5kZW5jeUZsYWcsIDAsIG90dENvbmZpZ1tpXS5ic090dEJhbmRzLCAxNSk7CisgICAgfQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1PdHRCb3hlczsgaSsrKSB7CisgICAgICAgIHsKKyAgICAgICAgICBlY0RhdGEoaEJpdHN0cmVhbSwgcE90dERhdGEtPmljY1tpXSwgcFByZXZPdHREYXRhLT5pY2Nfb2xkW2ldLAorICAgICAgICAgICAgICAgICBwUHJldk90dERhdGEtPnF1YW50Q29hcnNlSWNjUHJldltpXSwgcElDQ0xvc3NsZXNzRGF0YSwgdF9JQ0MsCisgICAgICAgICAgICAgICAgIGksIG51bVBhcmFtU2V0cywgYnNJbmRlcGVuZGVuY3lGbGFnLCAwLCBudW1CYW5kcywgMCk7CisgICAgICAgIH0KKyAgICAgIH0gLyogZm9yIGkgKi8KKyAgICB9CisgIH0gLyogdmFsaWQgaGFuZGxlICovCisKKyAgcmV0dXJuIGVycm9yOworfQorCisvKiB3cml0ZSBleHRlbnNpb24gZnJhbWUgZGF0YSB0byBzdHJlYW0gKi8KK3N0YXRpYyBGREtfU0FDRU5DX0VSUk9SIFdyaXRlU3BhdGlhbEV4dGVuc2lvbkZyYW1lKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGJpdHN0cmVhbSwgSEFORExFX0JTRl9JTlNUQU5DRSBzZWxmKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKChiaXRzdHJlYW0gPT0gTlVMTCkgfHwgKHNlbGYgPT0gTlVMTCkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBGREtieXRlQWxpZ24oYml0c3RyZWFtLCAwKTsKKyAgfSAvKiB2YWxpZCBoYW5kbGUgKi8KKworICByZXR1cm4gZXJyb3I7Cit9CisKKy8qIHdyaXRlIGZyYW1lIGRhdGEgdG8gc3RyZWFtICovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfd3JpdGVTcGF0aWFsRnJhbWUoVUNIQVIgKmNvbnN0IHBPdXRwdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG91dHB1dEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpjb25zdCBwbk91dHB1dEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0JTRl9JTlNUQU5DRSBzZWxmUHRyKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKChwT3V0cHV0QnVmZmVyID09IE5VTEwpIHx8IChwbk91dHB1dEJpdHMgPT0gTlVMTCkgfHwgKHNlbGZQdHIgPT0gTlVMTCkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBTUEFUSUFMRlJBTUUgKmZyYW1lID0gTlVMTDsKKyAgICBTUEFUSUFMU1BFQ0lGSUNDT05GSUcgKmNvbmZpZyA9IE5VTEw7CisgICAgRkRLX0JJVFNUUkVBTSBiaXRzdHJlYW07CisKKyAgICBpbnQgaSwgaiwgbnVtUGFyYW1TZXRzLCBudW1PdHRCb3hlczsKKworICAgIGlmICgoTlVMTCA9PQorICAgICAgICAgKGZyYW1lID0gZmRrX3NhY2VuY19nZXRTcGF0aWFsRnJhbWUoc2VsZlB0ciwgUkVBRF9TUEFUSUFMRlJBTUUpKSkgfHwKKyAgICAgICAgKE5VTEwgPT0gKGNvbmZpZyA9ICYoc2VsZlB0ci0+c3BhdGlhbFNwZWNpZmljQ29uZmlnKSkpKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBudW1PdHRCb3hlcyA9IHNlbGZQdHItPnNwYXRpYWxTcGVjaWZpY0NvbmZpZy50cmVlRGVzY3JpcHRpb24ubnVtT3R0Qm94ZXM7CisKKyAgICBudW1QYXJhbVNldHMgPSBmcmFtZS0+ZnJhbWluZ0luZm8ubnVtUGFyYW1TZXRzOworCisgICAgaWYgKGZyYW1lLT5iVXNlQkJDdWVzKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgU0FDRU5DX01BWF9OVU1fQk9YRVM7IGkrKykgeworICAgICAgICAvKiBJZiBhIHRyYW5zaWVudCB3YXMgZGV0ZWN0ZWQsIGZvcmNlIG9ubHkgdGhlIHNlY29uZCBwcyBicm9hZCBiYW5kICovCisgICAgICAgIGlmIChudW1QYXJhbVNldHMgPT0gMSkgeworICAgICAgICAgIGZyYW1lLT5DTERMb3NzbGVzc0RhdGEuYnNGcmVxUmVzU3RyaWRlWFhYW2ldWzBdID0gMzsKKyAgICAgICAgICBmcmFtZS0+SUNDTG9zc2xlc3NEYXRhLmJzRnJlcVJlc1N0cmlkZVhYWFtpXVswXSA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChqID0gMTsgaiA8IE1BWF9OVU1fUEFSQU1TOyBqKyspIHsKKyAgICAgICAgICAgIGZyYW1lLT5DTERMb3NzbGVzc0RhdGEuYnNGcmVxUmVzU3RyaWRlWFhYW2ldW2pdID0gMzsKKyAgICAgICAgICAgIGZyYW1lLT5JQ0NMb3NzbGVzc0RhdGEuYnNGcmVxUmVzU3RyaWRlWFhYW2ldW2pdID0gMzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IC8qIGZyYW1lLT5iVXNlQkJDdWVzICovCisKKyAgICAvKiBiaW5kIGV4dGVybiBidWZmZXIgdG8gYml0c3RyZWFtIGhhbmRsZSAqLworICAgIEZES2luaXRCaXRTdHJlYW0oJmJpdHN0cmVhbSwgcE91dHB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyU2l6ZSwgMCwgQlNfV1JJVEVSKTsKKworICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gd3JpdGVGcmFtaW5nSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJpdHN0cmVhbSwgJihmcmFtZS0+ZnJhbWluZ0luZm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmUHRyLT5zcGF0aWFsU3BlY2lmaWNDb25maWcuYnNGcmFtZUxlbmd0aCkpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogd3JpdGUgYnNJbmRlcGVuZGVuY3lGbGFnICovCisgICAgRkRLd3JpdGVCaXRzKCZiaXRzdHJlYW0sIGZyYW1lLT5ic0luZGVwZW5kZW5jeUZsYWcsIDEpOworCisgICAgLyogd3JpdGUgc3BhdGlhbCBkYXRhIHRvIGJpdHN0cmVhbSAqLworICAgIGlmIChTQUNFTkNfT0sgIT0KKyAgICAgICAgKGVycm9yID0gd3JpdGVPdHREYXRhKCZiaXRzdHJlYW0sICZzZWxmUHRyLT5wcmV2RnJhbWVEYXRhLnByZXZPdHREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lLT5vdHREYXRhLCBjb25maWctPm90dENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZS0+Q0xETG9zc2xlc3NEYXRhLCAmZnJhbWUtPklDQ0xvc3NsZXNzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bU90dEJveGVzLCBjb25maWctPm51bUJhbmRzLCBudW1QYXJhbVNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+YnNJbmRlcGVuZGVuY3lGbGFnKSkpIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSB3cml0ZVNtZ0RhdGEoJmJpdHN0cmVhbSwgJmZyYW1lLT5zbWdEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVBhcmFtU2V0cywgY29uZmlnLT5udW1CYW5kcykpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogYnl0ZSBhbGlnbm1lbnQgKi8KKyAgICBGREtieXRlQWxpZ24oJmJpdHN0cmVhbSwgMCk7CisKKyAgICAvKiBXcml0ZSBTcGF0aWFsRXh0ZW5zaW9uRnJhbWUgKi8KKyAgICBpZiAoU0FDRU5DX09LICE9CisgICAgICAgIChlcnJvciA9IFdyaXRlU3BhdGlhbEV4dGVuc2lvbkZyYW1lKCZiaXRzdHJlYW0sIHNlbGZQdHIpKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChOVUxMID09CisgICAgICAgIChmcmFtZSA9IGZka19zYWNlbmNfZ2V0U3BhdGlhbEZyYW1lKHNlbGZQdHIsIFdSSVRFX1NQQVRJQUxGUkFNRSkpKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBjbGVhckZyYW1lKGZyYW1lKTsKKworICAgIC8qIHJldHVybiBudW1iZXIgb2YgdmFsaWQgYml0cyBpbiBiaXRzdHJlYW0gKi8KKyAgICBpZiAoKCpwbk91dHB1dEJpdHMgPSBGREtnZXRWYWxpZEJpdHMoJmJpdHN0cmVhbSkpID4KKyAgICAgICAgKG91dHB1dEJ1ZmZlclNpemUgKiA4KSkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogdGVybWluYXRlIGJ1ZmZlciB3aXRoIGFsaWdubWVudCAqLworICAgIEZES2J5dGVBbGlnbigmYml0c3RyZWFtLCAwKTsKKworICB9IC8qIHZhbGlkIGhhbmRsZSAqLworCitiYWlsOgorICByZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY19iaXRzdHJlYW0uaCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2JpdHN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YjdiNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19iaXRzdHJlYW0uaApAQCAtMCwwICsxLDI5NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOiBFbmNvZGVyIExpYnJhcnkgSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgQml0c3RyZWFtIFdyaXRlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNBQ0VOQ19CSVRTVFJFQU1fSAorI2RlZmluZSBTQUNFTkNfQklUU1RSRUFNX0gKKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJGREtfbWF0cml4Q2FsbG9jLmgiCisjaW5jbHVkZSAic2FjZW5jX2xpYi5oIgorI2luY2x1ZGUgInNhY2VuY19jb25zdC5oIgorCisvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1BWF9OVU1fQklOUyAyMworI2RlZmluZSBNQVhfTlVNX1BBUkFNUyAyCisjZGVmaW5lIE1BWF9OVU1fT1VUUFVUQ0hBTk5FTFMgU0FDRU5DX01BWF9PVVRQVVRfQ0hBTk5FTFMKKyNkZWZpbmUgTUFYX1RJTUVfU0xPVFMgMzIKKwordHlwZWRlZiBlbnVtIHsKKyAgVFJFRV8yMTIgPSA3LAorICBUUkVFX0VTQ0FQRSA9IDE1CisKK30gVFJFRUNPTkZJRzsKKwordHlwZWRlZiBlbnVtIHsKKyAgRlJFUV9SRVNfNDAgPSAwLAorICBGUkVRX1JFU18yMCA9IDEsCisgIEZSRVFfUkVTXzEwID0gMiwKKyAgRlJFUV9SRVNfNSA9IDMKKworfSBGUkVROworCit0eXBlZGVmIGVudW0geworICBRVUFOVE1PREVfSU5WQUxJRCA9IC0xLAorICBRVUFOVE1PREVfRklORSA9IDAsCisgIFFVQU5UTU9ERV9FQlExID0gMSwKKyAgUVVBTlRNT0RFX0VCUTIgPSAyCisKK30gUVVBTlRNT0RFOworCit0eXBlZGVmIGVudW0geworICBURU1QU0hBUEVfT0ZGID0gMAorCit9IFRFTVBTSEFQRUNPTkZJRzsKKwordHlwZWRlZiBlbnVtIHsKKyAgRklYRURHQUlORE1YX0lOVkFMSUQgPSAtMSwKKyAgRklYRURHQUlORE1YXzAgPSAwLAorICBGSVhFREdBSU5ETVhfMSA9IDEsCisgIEZJWEVER0FJTkRNWF8yID0gMiwKKyAgRklYRURHQUlORE1YXzMgPSAzLAorICBGSVhFREdBSU5ETVhfNCA9IDQsCisgIEZJWEVER0FJTkRNWF81ID0gNSwKKyAgRklYRURHQUlORE1YXzYgPSA2LAorICBGSVhFREdBSU5ETVhfNyA9IDcKKworfSBGSVhFREdBSU5ETVhDT05GSUc7CisKK3R5cGVkZWYgZW51bSB7CisgIERFQ09SUl9JTlZBTElEID0gLTEsCisgIERFQ09SUl9RTUZTUExJVDAgPSAwLCAvKiBRTUYgc3BsaXRmcmVxOiAzLCAxNSwgMjQsIDY1ICovCisgIERFQ09SUl9RTUZTUExJVDEgPSAxLCAvKiBRTUYgc3BsaXRmcmVxOiAzLCA1MCwgNjUsIDY1ICovCisgIERFQ09SUl9RTUZTUExJVDIgPSAyICAvKiBRTUYgc3BsaXRmcmVxOiAwLCAxNSwgNjUsIDY1ICovCisKK30gREVDT1JSQ09ORklHOworCit0eXBlZGVmIGVudW0geworICBERUZBVUxUID0gMCwKKyAgS0VFUCA9IDEsCisgIElOVEVSUE9MQVRFID0gMiwKKyAgRklORUNPQVJTRSA9IDMKKworfSBEQVRBX01PREU7CisKK3R5cGVkZWYgZW51bSB7CisgIFJFQURfU1BBVElBTEZSQU1FID0gMCwKKyAgV1JJVEVfU1BBVElBTEZSQU1FID0gMQorCit9IFNQQVRJQUxGUkFNRV9UWVBFOworCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisgIElOVCBudW1PdHRCb3hlczsKKyAgSU5UIG51bUluQ2hhbjsKKyAgSU5UIG51bU91dENoYW47CisKK30gVFJFRURFU0NSSVBUSU9OOworCit0eXBlZGVmIHN0cnVjdCB7CisgIElOVCBic090dEJhbmRzOworCit9IE9UVENPTkZJRzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBJTlQgYnNTYW1wbGluZ0ZyZXF1ZW5jeTsgLyogZm9yIGJzU2FtcGxpbmdGcmVxdWVuY3lJbmRleCAqLworICBJTlQgYnNGcmFtZUxlbmd0aDsKKyAgSU5UIG51bUJhbmRzOyAvKiBmb3IgYnNGcmVxUmVzICovCisgIFRSRUVDT05GSUcgYnNUcmVlQ29uZmlnOworICBRVUFOVE1PREUgYnNRdWFudE1vZGU7CisgIEZJWEVER0FJTkRNWENPTkZJRyBic0ZpeGVkR2FpbkRNWDsKKyAgaW50IGJzRW52UXVhbnRNb2RlOworICBERUNPUlJDT05GSUcgYnNEZWNvcnJDb25maWc7CisgIFRSRUVERVNDUklQVElPTiB0cmVlRGVzY3JpcHRpb247CisgIE9UVENPTkZJRyBvdHRDb25maWdbU0FDRU5DX01BWF9OVU1fQk9YRVNdOworCit9IFNQQVRJQUxTUEVDSUZJQ0NPTkZJRzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBic0ZyYW1pbmdUeXBlOworICBVQ0hBUiBudW1QYXJhbVNldHM7CisgIFVDSEFSIGJzUGFyYW1TbG90c1tNQVhfTlVNX1BBUkFNU107CisKK30gRlJBTUlOR0lORk87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU0NIQVIgY2xkW1NBQ0VOQ19NQVhfTlVNX0JPWEVTXVtNQVhfTlVNX1BBUkFNU11bTUFYX05VTV9CSU5TXTsKKyAgU0NIQVIgaWNjW1NBQ0VOQ19NQVhfTlVNX0JPWEVTXVtNQVhfTlVNX1BBUkFNU11bTUFYX05VTV9CSU5TXTsKKworfSBPVFREQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIGJzU21vb3RoTW9kZVtNQVhfTlVNX1BBUkFNU107CisgIFVDSEFSIGJzU21vb3RoVGltZVtNQVhfTlVNX1BBUkFNU107CisgIFVDSEFSIGJzRnJlcVJlc1N0cmlkZVtNQVhfTlVNX1BBUkFNU107CisgIFVDSEFSIGJzU21nRGF0YVtNQVhfTlVNX1BBUkFNU11bTUFYX05VTV9CSU5TXTsKKworfSBTTUdEQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIGJzRW52U2hhcGVDaGFubmVsW01BWF9OVU1fT1VUUFVUQ0hBTk5FTFNdOworICBVQ0hBUiBic0VudlNoYXBlRGF0YVtNQVhfTlVNX09VVFBVVENIQU5ORUxTXVtNQVhfVElNRV9TTE9UU107CisKK30gVEVNUFNIQVBFREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBic1hYWERhdGFNb2RlW1NBQ0VOQ19NQVhfTlVNX0JPWEVTXVtNQVhfTlVNX1BBUkFNU107CisgIFVDSEFSIGJzRGF0YVBhaXJbU0FDRU5DX01BWF9OVU1fQk9YRVNdW01BWF9OVU1fUEFSQU1TXTsKKyAgVUNIQVIgYnNRdWFudENvYXJzZVhYWFtTQUNFTkNfTUFYX05VTV9CT1hFU11bTUFYX05VTV9QQVJBTVNdOworICBVQ0hBUiBic0ZyZXFSZXNTdHJpZGVYWFhbU0FDRU5DX01BWF9OVU1fQk9YRVNdW01BWF9OVU1fUEFSQU1TXTsKKworfSBMT1NTTEVTU0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgRlJBTUlOR0lORk8gZnJhbWluZ0luZm87CisgIFVDSEFSIGJzSW5kZXBlbmRlbmN5RmxhZzsKKyAgT1RUREFUQSBvdHREYXRhOworICBTTUdEQVRBIHNtZ0RhdGE7CisgIFRFTVBTSEFQRURBVEEgdGVtcFNoYXBlRGF0YTsKKyAgTE9TU0xFU1NEQVRBIENMRExvc3NsZXNzRGF0YTsKKyAgTE9TU0xFU1NEQVRBIElDQ0xvc3NsZXNzRGF0YTsKKyAgVUNIQVIgYlVzZUJCQ3VlczsKKworfSBTUEFUSUFMRlJBTUU7CisKK3R5cGVkZWYgc3RydWN0IEJTRl9JTlNUQU5DRSAqSEFORExFX0JTRl9JTlNUQU5DRTsKKworLyogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBkZXN0cm95IGVuY29kZXIgaW5zdGFuY2UgKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19kZXN0cm95U3BhdGlhbEJpdHN0cmVhbUVuY29kZXIoCisgICAgSEFORExFX0JTRl9JTlNUQU5DRSAqc2VsZlB0cik7CisKKy8qIGNyZWF0ZSBlbmNvZGVyIGluc3RhbmNlICovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfY3JlYXRlU3BhdGlhbEJpdHN0cmVhbUVuY29kZXIoCisgICAgSEFORExFX0JTRl9JTlNUQU5DRSAqc2VsZlB0cik7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19pbml0U3BhdGlhbEJpdHN0cmVhbUVuY29kZXIoCisgICAgSEFORExFX0JTRl9JTlNUQU5DRSBzZWxmUHRyKTsKKworLyogZ2V0IFNwYXRpYWxTcGVjaWZpY0NvbmZpZyBzdHJ1Y3QgKi8KK1NQQVRJQUxTUEVDSUZJQ0NPTkZJRyAqZmRrX3NhY2VuY19nZXRTcGF0aWFsU3BlY2lmaWNDb25maWcoCisgICAgSEFORExFX0JTRl9JTlNUQU5DRSBzZWxmUHRyKTsKKworLyogd3JpdGUgU3BhdGlhbFNwZWNpZmljQ29uZmlnIHRvIHN0cmVhbSAqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3dyaXRlU3BhdGlhbFNwZWNpZmljQ29uZmlnKAorICAgIFNQQVRJQUxTUEVDSUZJQ0NPTkZJRyAqY29uc3Qgc3BhdGlhbFNwZWNpZmljQ29uZmlnLAorICAgIFVDSEFSICpjb25zdCBwT3V0cHV0QnVmZmVyLCBjb25zdCBJTlQgb3V0cHV0QnVmZmVyU2l6ZSwKKyAgICBJTlQgKmNvbnN0IHBuT3V0cHV0Qml0cyk7CisKKy8qIGdldCBTcGF0aWFsRnJhbWUgc3RydWN0ICovCitTUEFUSUFMRlJBTUUgKmZka19zYWNlbmNfZ2V0U3BhdGlhbEZyYW1lKEhBTkRMRV9CU0ZfSU5TVEFOQ0Ugc2VsZlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1BBVElBTEZSQU1FX1RZUEUgZnJhbWVUeXBlKTsKKworLyogd3JpdGUgZnJhbWUgZGF0YSB0byBzdHJlYW0gKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY193cml0ZVNwYXRpYWxGcmFtZShVQ0hBUiAqY29uc3QgcE91dHB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgb3V0cHV0QnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmNvbnN0IHBuT3V0cHV0Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQlNGX0lOU1RBTkNFIHNlbGZQdHIpOworCisvKiBDb3B5L1NhdmUgc3BhdGlhbCBmcmFtZSBkYXRhIGZvciBvbmUgcGFyYW1ldGVyIHNldCAqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2R1cGxpY2F0ZVBhcmFtZXRlclNldCgKKyAgICBjb25zdCBTUEFUSUFMRlJBTUUgKmNvbnN0IGhGcm9tLCBjb25zdCBJTlQgc2V0RnJvbSwgU1BBVElBTEZSQU1FICpjb25zdCBoVG8sCisgICAgY29uc3QgSU5UIHNldFRvKTsKKworI2VuZGlmIC8qIFNBQ0VOQ19CSVRTVFJFQU1fSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0FDZW5jL3NyYy9zYWNlbmNfY29uc3QuaCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2NvbnN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2ZTc2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2NvbnN0LmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hcmt1cyBNdWx0cnVzCisKKyAgIERlc2NyaXB0aW9uOiBFbmNvZGVyIExpYnJhcnkgSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgY29uc3RhbnRzIHRvIE1QRUctNCBzcGF0aWFsIGVuY29kZXIgbGliCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0FDRU5DX0NPTlNUX0gKKyNkZWZpbmUgU0FDRU5DX0NPTlNUX0gKKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgorCisvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE5VTV9RTUZfQkFORFMgNjQKKyNkZWZpbmUgTUFYX1FNRl9CQU5EUyAxMjgKKworI2RlZmluZSBTQUNFTkNfTUFYX05VTV9CT1hFUyAxCisjZGVmaW5lIFNBQ0VOQ19NQVhfSU5QVVRfQ0hBTk5FTFMgMgorI2RlZmluZSBTQUNFTkNfTUFYX09VVFBVVF9DSEFOTkVMUyAxCisKKyNkZWZpbmUgU0FDRU5DX0ZMT0FUX0VQU0lMT04gKDFlLTlmKQorCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgLyogU0FDRU5DX0NPTlNUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2RlbGF5LmNwcCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2RlbGF5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmVkNmIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfZGVsYXkuY3BwCkBAIC0wLDAgKzEsNDcyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBDaHJpc3RpYW4gR29ldHRsaW5nZXIKKworICAgRGVzY3JpcHRpb246IEVuY29kZXIgTGlicmFyeSBJbnRlcmZhY2UKKyAgICAgICAgICAgICAgICBkZWxheSBtYW5hZ2VtZW50IG9mIHRoZSBlbmNvZGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLyoqCisgXGZpbGUKKyBUaGlzIGZpbGUgY29udGFpbnMgYWxsIGRlbGF5IGluZnJhc3RydWN0dXJlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAic2FjZW5jX2RlbGF5LmgiCisjaW5jbHVkZSAic2FjZW5jX2NvbnN0LmgiCisjaW5jbHVkZSAiRkRLX21hdHJpeENhbGxvYy5oIgorCisvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBERUxBWSB7CisgIHN0cnVjdCBERUxBWV9DT05GSUcgeworICAgIC8qIFJvdXRpbmcgQ29uZmlnIFN3aXRjaGVzKi8KKyAgICBJTlQgYkRteEFsaWduOworICAgIElOVCBiVGltZURvbURteDsKKyAgICBJTlQgYk1pbmltaXplRGVsYXk7CisgICAgSU5UIGJTYWNUaW1lQWxpZ25tZW50RHluYW1pY091dDsKKworICAgIC8qIE5lZWRlZCBJbnB1dCBWYXJpYWJsZXMqLworICAgIElOVCBuUW1mTGVuOworICAgIElOVCBuRnJhbWVMZW47CisgICAgSU5UIG5TdXJyb3VuZERlbGF5OworICAgIElOVCBuQXJiRG14RGVsYXk7CisgICAgSU5UIG5MaW1pdGVyRGVsYXk7CisgICAgSU5UIG5Db3JlQ29kZXJEZWxheTsKKyAgICBJTlQgblNhY1N0cmVhbU11eERlbGF5OworICAgIElOVCBuU2FjVGltZUFsaWdubWVudDsgLyogT3ZlcndyaXR0ZW4sIGlmIGJTYWNUaW1lQWxpZ25tZW50RHluYW1pY091dCAqLworICB9IGNvbmZpZzsKKworICAvKiBWYXJpYWJsZSBEZWxheWJ1ZmZlcnMgLT4gRGVsYXlzICovCisgIElOVCBuRG14QWxpZ25CdWZmZXI7CisgIElOVCBuU3Vycm91bmRBbmFseXNpc0J1ZmZlcjsKKyAgSU5UIG5BcmJEbXhBbmFseXNpc0J1ZmZlcjsKKyAgSU5UIG5PdXRwdXRBdWRpb0J1ZmZlcjsKKyAgSU5UIG5CaXRzdHJlYW1GcmFtZUJ1ZmZlcjsKKyAgSU5UIG5PdXRwdXRBdWRpb1FtZkZyYW1lQnVmZmVyOworICBJTlQgbkRpc2NhcmRPdXRGcmFtZXM7CisKKyAgLyogVmFyaWFibGUgRGVsYXlidWZmZXJzIENvbXB1dGF0aW9uIFZhcmlhYmxlcyAqLworICBJTlQgbkJpdHN0cmVhbUZyYW1lQnVmZmVyU2l6ZTsKKworICAvKiBPdXRwdXQ6IEluZm9zICovCisgIElOVCBuSW5mb0RteERlbGF5OyAvKiBEZWxheSBvZiB0aGUgZG93bm1peGVkIHNpZ25hbCBhZnRlciB0aGUgc3BhY2UgZW5jb2RlciAqLworICBJTlQgbkluZm9Db2RlY0RlbGF5OyAvKiBEZWxheSBvZiB0aGUgd2hvbGUgZW4tL2RlY29kZXIgaW5jbHVkaW5nIENvcmVDb2RlciAqLworICBJTlQgbkluZm9EZWNvZGVyRGVsYXk7IC8qIERlbGF5IG9mIHRoZSBNcGVnIFN1cnJvdW5kIGRlY29kZXIgKi8KK307CisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlZmluaXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Z1bmN0aW9ubmFtZTogZmRrX3NhY2VuY19kZWxheV9PcGVuKCkKK2Rlc2NyaXB0aW9uOiAgaW5pdGlhbGl6ZXMgRGVsYXlzCityZXR1cm5zOiAgICAgIG5vRXJyb3Igb24gc3VjY2VzcywgYW4gYXByb3ByaWF0ZSBlcnJvciBjb2RlIGVsc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19kZWxheV9PcGVuKEhBTkRMRV9ERUxBWSAqcGhEZWxheSkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChOVUxMID09IHBoRGVsYXkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKCpwaERlbGF5LCAxLCBzdHJ1Y3QgREVMQVkpOworICB9CisgIHJldHVybiBlcnJvcjsKKworYmFpbDoKKyAgZmRrX3NhY2VuY19kZWxheV9DbG9zZShwaERlbGF5KTsKKyAgcmV0dXJuICgoU0FDRU5DX09LID09IGVycm9yKSA/IFNBQ0VOQ19NRU1PUllfRVJST1IgOiBlcnJvcik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Z1bmN0aW9ubmFtZTogZmRrX3NhY2VuY19kZWxheV9DbG9zZSgpCitkZXNjcmlwdGlvbjogIGRlc3RydWN0cyBEZWxheQorcmV0dXJuczogICAgICBub0Vycm9yIG9uIHN1Y2Nlc3MsIGFuIGFwcm9wcmlhdGUgZXJyb3IgY29kZSBlbHNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZGVsYXlfQ2xvc2UoSEFORExFX0RFTEFZICpwaERlbGF5KSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKE5VTEwgPT0gcGhEZWxheSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGlmIChOVUxMICE9ICpwaERlbGF5KSB7CisgICAgICBGREtfRlJFRV9NRU1PUllfMUQoKnBoRGVsYXkpOworICAgIH0KKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19kZWxheV9Jbml0KEhBTkRMRV9ERUxBWSBoRGVsYXksIGNvbnN0IElOVCBuUW1mTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5GcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuQ29yZUNvZGVyRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgblNhY1N0cmVhbU11eERlbGF5KSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKE5VTEwgPT0gaERlbGF5KSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgLyogRmlsbCBzdHJ1Y3R1cmUgYmVmb3JlIGNhbGN1bGF0aW9uICovCisgICAgRkRLbWVtY2xlYXIoJmhEZWxheS0+Y29uZmlnLCBzaXplb2YoaERlbGF5LT5jb25maWcpKTsKKworICAgIGhEZWxheS0+Y29uZmlnLm5RbWZMZW4gPSBuUW1mTGVuOworICAgIGhEZWxheS0+Y29uZmlnLm5GcmFtZUxlbiA9IG5GcmFtZUxlbjsKKyAgICBoRGVsYXktPmNvbmZpZy5uQ29yZUNvZGVyRGVsYXkgPSBuQ29yZUNvZGVyRGVsYXk7CisgICAgaERlbGF5LT5jb25maWcublNhY1N0cmVhbU11eERlbGF5ID0gblNhY1N0cmVhbU11eERlbGF5OworICB9CisgIHJldHVybiBlcnJvcjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZnVuY3Rpb25uYW1lOiBmZGtfc2FjZW5jX2RlbGF5X1N1YkNhbHVsYXRlQnVmZmVyRGVsYXlzKCkKK2Rlc2NyaXB0aW9uOiAgQ2FsY3VsYXRlcyB0aGUgRGVsYXlzIG9mIHRoZSBidWZmZXJzCityZXR1cm5zOiAgICAgIEVycm9yIENvZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19kZWxheV9TdWJDYWx1bGF0ZUJ1ZmZlckRlbGF5cyhIQU5ETEVfREVMQVkgaERlbCkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChOVUxMID09IGhEZWwpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbkVuY29kZXJBbkRlbGF5LCBuRW5jb2RlclN5bkRlbGF5LCBuRW5jb2RlcldpbkRlbGF5LCBuRGVjb2RlckFuRGVsYXksCisgICAgICAgIG5EZWNvZGVyU3luRGVsYXksIG5SZXNpZHVhbENvZGVyRnJhbWVEZWxheSwKKyAgICAgICAgbkFyYkRteFJlc2lkdWFsQ29kZXJGcmFtZURlbGF5OworCisgICAgaWYgKGhEZWwtPmNvbmZpZy5iU2FjVGltZUFsaWdubWVudER5bmFtaWNPdXQgPiAwKSB7CisgICAgICBoRGVsLT5jb25maWcublNhY1RpbWVBbGlnbm1lbnQgPSAwOworICAgIH0KKworICAgIHsKKyAgICAgIG5FbmNvZGVyQW5EZWxheSA9CisgICAgICAgICAgMiAqIGhEZWwtPmNvbmZpZy5uUW1mTGVuICsKKyAgICAgICAgICBoRGVsLT5jb25maWcublFtZkxlbiAvIDI7IC8qIE9ubHkgTGQtUU1GIERlbGF5LCBubyBoeWJyaWQgKi8KKyAgICAgIG5FbmNvZGVyU3luRGVsYXkgPSAxICogaERlbC0+Y29uZmlnLm5RbWZMZW4gKyBoRGVsLT5jb25maWcublFtZkxlbiAvIDI7CisgICAgICBuRGVjb2RlckFuRGVsYXkgPSAyICogaERlbC0+Y29uZmlnLm5RbWZMZW4gKyBoRGVsLT5jb25maWcublFtZkxlbiAvIDI7CisgICAgICBuRGVjb2RlclN5bkRlbGF5ID0gMSAqIGhEZWwtPmNvbmZpZy5uUW1mTGVuICsgaERlbC0+Y29uZmlnLm5RbWZMZW4gLyAyOworICAgICAgbkVuY29kZXJXaW5EZWxheSA9CisgICAgICAgICAgaERlbC0+Y29uZmlnLm5GcmFtZUxlbiAvIDI7IC8qIFdpbmRvd0xvb2thaGVhZCBpcyBqdXN0IGhhbGYgYSBmcmFtZSAqLworICAgIH0KKworICAgIHsgblJlc2lkdWFsQ29kZXJGcmFtZURlbGF5ID0gMDsgfQorCisgICAgeyBuQXJiRG14UmVzaWR1YWxDb2RlckZyYW1lRGVsYXkgPSAwOyB9CisKKyAgICAvKiBDYWxjdWxhdGUgdmFyaWFibGUgQnVmZmVyLURlbGF5cyAqLworICAgIGlmIChoRGVsLT5jb25maWcuYlRpbWVEb21EbXggPT0gMCkgeworICAgICAgLyogQXJiaXRyYXJ5RG14IGFuZCBUZERteCBvZmYgKi8KKyAgICAgIGludCB0ZW1wRGVsYXk7CisKKyAgICAgIGhEZWwtPm5TdXJyb3VuZEFuYWx5c2lzQnVmZmVyID0gMDsKKyAgICAgIGhEZWwtPm5BcmJEbXhBbmFseXNpc0J1ZmZlciA9IDA7CisgICAgICB0ZW1wRGVsYXkgPSBuRW5jb2RlclN5bkRlbGF5ICsgaERlbC0+Y29uZmlnLm5MaW1pdGVyRGVsYXkgKworICAgICAgICAgICAgICAgICAgaERlbC0+Y29uZmlnLm5Db3JlQ29kZXJEZWxheSArCisgICAgICAgICAgICAgICAgICBoRGVsLT5jb25maWcublNhY1RpbWVBbGlnbm1lbnQgKyBuRGVjb2RlckFuRGVsYXk7CisgICAgICB0ZW1wRGVsYXkgPSAoblJlc2lkdWFsQ29kZXJGcmFtZURlbGF5ICogaERlbC0+Y29uZmlnLm5GcmFtZUxlbikgKworICAgICAgICAgICAgICAgICAgaERlbC0+Y29uZmlnLm5TYWNTdHJlYW1NdXhEZWxheSAtIHRlbXBEZWxheTsKKworICAgICAgaWYgKHRlbXBEZWxheSA+IDApIHsKKyAgICAgICAgaERlbC0+bkJpdHN0cmVhbUZyYW1lQnVmZmVyID0gMDsKKyAgICAgICAgaERlbC0+bk91dHB1dEF1ZGlvQnVmZmVyID0gdGVtcERlbGF5OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGVtcERlbGF5ID0gLXRlbXBEZWxheTsKKyAgICAgICAgaERlbC0+bkJpdHN0cmVhbUZyYW1lQnVmZmVyID0KKyAgICAgICAgICAgICh0ZW1wRGVsYXkgKyBoRGVsLT5jb25maWcubkZyYW1lTGVuIC0gMSkgLyBoRGVsLT5jb25maWcubkZyYW1lTGVuOworICAgICAgICBoRGVsLT5uT3V0cHV0QXVkaW9CdWZmZXIgPQorICAgICAgICAgICAgKGhEZWwtPm5CaXRzdHJlYW1GcmFtZUJ1ZmZlciAqIGhEZWwtPmNvbmZpZy5uRnJhbWVMZW4pIC0gdGVtcERlbGF5OworICAgICAgfQorCisgICAgICBoRGVsLT5uT3V0cHV0QXVkaW9RbWZGcmFtZUJ1ZmZlciA9CisgICAgICAgICAgKGhEZWwtPm5PdXRwdXRBdWRpb0J1ZmZlciArIChoRGVsLT5jb25maWcublFtZkxlbiAvIDIpIC0gMSkgLworICAgICAgICAgIGhEZWwtPmNvbmZpZy5uUW1mTGVuOworCisgICAgICBpZiAoaERlbC0+Y29uZmlnLmJEbXhBbGlnbiA+IDApIHsKKyAgICAgICAgdGVtcERlbGF5ID0gbkVuY29kZXJXaW5EZWxheSArIG5FbmNvZGVyQW5EZWxheSArIG5FbmNvZGVyU3luRGVsYXkgKworICAgICAgICAgICAgICAgICAgICBoRGVsLT5uT3V0cHV0QXVkaW9CdWZmZXIgKyBoRGVsLT5jb25maWcubkxpbWl0ZXJEZWxheSArCisgICAgICAgICAgICAgICAgICAgIGhEZWwtPmNvbmZpZy5uQ29yZUNvZGVyRGVsYXk7CisgICAgICAgIGhEZWwtPm5EaXNjYXJkT3V0RnJhbWVzID0KKyAgICAgICAgICAgICh0ZW1wRGVsYXkgKyBoRGVsLT5jb25maWcubkZyYW1lTGVuIC0gMSkgLyBoRGVsLT5jb25maWcubkZyYW1lTGVuOworICAgICAgICBoRGVsLT5uRG14QWxpZ25CdWZmZXIgPQorICAgICAgICAgICAgaERlbC0+bkRpc2NhcmRPdXRGcmFtZXMgKiBoRGVsLT5jb25maWcubkZyYW1lTGVuIC0gdGVtcERlbGF5OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaERlbC0+bkRpc2NhcmRPdXRGcmFtZXMgPSAwOworICAgICAgICBoRGVsLT5uRG14QWxpZ25CdWZmZXIgPSAwOworICAgICAgfQorCisgICAgICAvKiBPdXRwdXQ6IEluZm8tVmFyaWFibGVzICovCisgICAgICBoRGVsLT5uSW5mb0RteERlbGF5ID0gaERlbC0+blN1cnJvdW5kQW5hbHlzaXNCdWZmZXIgKyBuRW5jb2RlckFuRGVsYXkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5FbmNvZGVyV2luRGVsYXkgKyBuRW5jb2RlclN5bkRlbGF5ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRGVsLT5uT3V0cHV0QXVkaW9CdWZmZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhEZWwtPmNvbmZpZy5uTGltaXRlckRlbGF5OworICAgICAgaERlbC0+bkluZm9Db2RlY0RlbGF5ID0KKyAgICAgICAgICBoRGVsLT5uSW5mb0RteERlbGF5ICsgaERlbC0+Y29uZmlnLm5Db3JlQ29kZXJEZWxheSArCisgICAgICAgICAgaERlbC0+Y29uZmlnLm5TYWNUaW1lQWxpZ25tZW50ICsgbkRlY29kZXJBbkRlbGF5ICsgbkRlY29kZXJTeW5EZWxheTsKKworICAgIH0gZWxzZSB7CisgICAgICAvKiBBcmJpdHJhcnlEbXggb3IgVGREbXggb24gKi8KKyAgICAgIGludCB0ZW1wRGVsYXkxLCB0ZW1wRGVsYXkyLCB0ZW1wRGVsYXkxMiwgdGVtcERlbGF5MzsKKworICAgICAgdGVtcERlbGF5MSA9IGhEZWwtPmNvbmZpZy5uQXJiRG14RGVsYXkgLSBoRGVsLT5jb25maWcublN1cnJvdW5kRGVsYXk7CisKKyAgICAgIGlmICh0ZW1wRGVsYXkxID49IDApIHsKKyAgICAgICAgaERlbC0+blN1cnJvdW5kQW5hbHlzaXNCdWZmZXIgPSB0ZW1wRGVsYXkxOworICAgICAgICBoRGVsLT5uQXJiRG14QW5hbHlzaXNCdWZmZXIgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaERlbC0+blN1cnJvdW5kQW5hbHlzaXNCdWZmZXIgPSAwOworICAgICAgICBoRGVsLT5uQXJiRG14QW5hbHlzaXNCdWZmZXIgPSAtdGVtcERlbGF5MTsKKyAgICAgIH0KKworICAgICAgdGVtcERlbGF5MSA9IG5FbmNvZGVyV2luRGVsYXkgKyBoRGVsLT5jb25maWcublN1cnJvdW5kRGVsYXkgKworICAgICAgICAgICAgICAgICAgIGhEZWwtPm5TdXJyb3VuZEFuYWx5c2lzQnVmZmVyICsKKyAgICAgICAgICAgICAgICAgICBuRW5jb2RlckFuRGVsYXk7IC8qU3Vycm91bmQgUGF0aCovCisgICAgICB0ZW1wRGVsYXkyID0gbkVuY29kZXJXaW5EZWxheSArIGhEZWwtPmNvbmZpZy5uQXJiRG14RGVsYXkgKworICAgICAgICAgICAgICAgICAgIGhEZWwtPm5BcmJEbXhBbmFseXNpc0J1ZmZlciArCisgICAgICAgICAgICAgICAgICAgbkVuY29kZXJBbkRlbGF5OyAvKiBBcmJEbXggQ29tcGFyZSBQYXRoICovCisgICAgICB0ZW1wRGVsYXkzID0gaERlbC0+Y29uZmlnLm5BcmJEbXhEZWxheSArIGhEZWwtPmNvbmZpZy5uTGltaXRlckRlbGF5ICsKKyAgICAgICAgICAgICAgICAgICBoRGVsLT5jb25maWcubkNvcmVDb2RlckRlbGF5ICsKKyAgICAgICAgICAgICAgICAgICBoRGVsLT5jb25maWcublNhY1RpbWVBbGlnbm1lbnQgKworICAgICAgICAgICAgICAgICAgIG5EZWNvZGVyQW5EZWxheTsgLyogQXJiRG14IFBhc3N0aHJvdWdoKi8KKworICAgICAgdGVtcERlbGF5MTIgPQorICAgICAgICAgIEZES21heChuUmVzaWR1YWxDb2RlckZyYW1lRGVsYXksIG5BcmJEbXhSZXNpZHVhbENvZGVyRnJhbWVEZWxheSkgKgorICAgICAgICAgIGhEZWwtPmNvbmZpZy5uRnJhbWVMZW47CisgICAgICB0ZW1wRGVsYXkxMiArPSBoRGVsLT5jb25maWcublNhY1N0cmVhbU11eERlbGF5OworCisgICAgICBpZiAodGVtcERlbGF5MSA+IHRlbXBEZWxheTIpIHsKKyAgICAgICAgdGVtcERlbGF5MTIgKz0gdGVtcERlbGF5MTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRlbXBEZWxheTEyICs9IHRlbXBEZWxheTI7CisgICAgICB9CisKKyAgICAgIGlmICh0ZW1wRGVsYXkzID4gdGVtcERlbGF5MTIpIHsKKyAgICAgICAgaWYgKGhEZWwtPmNvbmZpZy5iTWluaW1pemVEZWxheSA+IDApIHsKKyAgICAgICAgICBoRGVsLT5uQml0c3RyZWFtRnJhbWVCdWZmZXIgPQorICAgICAgICAgICAgICAodGVtcERlbGF5MyAtIHRlbXBEZWxheTEyKSAvIGhEZWwtPmNvbmZpZy5uRnJhbWVMZW47IC8qZmxvb3IqLworICAgICAgICAgIGhEZWwtPm5PdXRwdXRBdWRpb0J1ZmZlciA9IDA7CisgICAgICAgICAgaERlbC0+blN1cnJvdW5kQW5hbHlzaXNCdWZmZXIgKz0KKyAgICAgICAgICAgICAgKHRlbXBEZWxheTMgLSB0ZW1wRGVsYXkxMiAtCisgICAgICAgICAgICAgICAoaERlbC0+bkJpdHN0cmVhbUZyYW1lQnVmZmVyICogaERlbC0+Y29uZmlnLm5GcmFtZUxlbikpOworICAgICAgICAgIGhEZWwtPm5BcmJEbXhBbmFseXNpc0J1ZmZlciArPQorICAgICAgICAgICAgICAodGVtcERlbGF5MyAtIHRlbXBEZWxheTEyIC0KKyAgICAgICAgICAgICAgIChoRGVsLT5uQml0c3RyZWFtRnJhbWVCdWZmZXIgKiBoRGVsLT5jb25maWcubkZyYW1lTGVuKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaERlbC0+bkJpdHN0cmVhbUZyYW1lQnVmZmVyID0KKyAgICAgICAgICAgICAgKCh0ZW1wRGVsYXkzIC0gdGVtcERlbGF5MTIpICsgaERlbC0+Y29uZmlnLm5GcmFtZUxlbiAtIDEpIC8KKyAgICAgICAgICAgICAgaERlbC0+Y29uZmlnLm5GcmFtZUxlbjsKKyAgICAgICAgICBoRGVsLT5uT3V0cHV0QXVkaW9CdWZmZXIgPQorICAgICAgICAgICAgICBoRGVsLT5uQml0c3RyZWFtRnJhbWVCdWZmZXIgKiBoRGVsLT5jb25maWcubkZyYW1lTGVuICsKKyAgICAgICAgICAgICAgdGVtcERlbGF5MTIgLSB0ZW1wRGVsYXkzOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBoRGVsLT5uQml0c3RyZWFtRnJhbWVCdWZmZXIgPSAwOworICAgICAgICBoRGVsLT5uT3V0cHV0QXVkaW9CdWZmZXIgPSB0ZW1wRGVsYXkxMiAtIHRlbXBEZWxheTM7CisgICAgICB9CisKKyAgICAgIGlmIChoRGVsLT5jb25maWcuYkRteEFsaWduID4gMCkgeworICAgICAgICBpbnQgdGVtcERlbGF5ID0gaERlbC0+Y29uZmlnLm5BcmJEbXhEZWxheSArIGhEZWwtPm5PdXRwdXRBdWRpb0J1ZmZlciArCisgICAgICAgICAgICAgICAgICAgICAgICBoRGVsLT5jb25maWcubkxpbWl0ZXJEZWxheSArCisgICAgICAgICAgICAgICAgICAgICAgICBoRGVsLT5jb25maWcubkNvcmVDb2RlckRlbGF5OworICAgICAgICBoRGVsLT5uRGlzY2FyZE91dEZyYW1lcyA9CisgICAgICAgICAgICAodGVtcERlbGF5ICsgaERlbC0+Y29uZmlnLm5GcmFtZUxlbiAtIDEpIC8gaERlbC0+Y29uZmlnLm5GcmFtZUxlbjsKKyAgICAgICAgaERlbC0+bkRteEFsaWduQnVmZmVyID0KKyAgICAgICAgICAgIGhEZWwtPm5EaXNjYXJkT3V0RnJhbWVzICogaERlbC0+Y29uZmlnLm5GcmFtZUxlbiAtIHRlbXBEZWxheTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhEZWwtPm5EaXNjYXJkT3V0RnJhbWVzID0gMDsKKyAgICAgICAgaERlbC0+bkRteEFsaWduQnVmZmVyID0gMDsKKyAgICAgIH0KKworICAgICAgLyogT3V0cHV0OiBJbmZvLVZhcmlhYmxlcyAqLworICAgICAgaERlbC0+bkluZm9EbXhEZWxheSA9IGhEZWwtPmNvbmZpZy5uQXJiRG14RGVsYXkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhEZWwtPm5PdXRwdXRBdWRpb0J1ZmZlciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaERlbC0+Y29uZmlnLm5MaW1pdGVyRGVsYXk7CisgICAgICBoRGVsLT5uSW5mb0NvZGVjRGVsYXkgPQorICAgICAgICAgIGhEZWwtPm5JbmZvRG14RGVsYXkgKyBoRGVsLT5jb25maWcubkNvcmVDb2RlckRlbGF5ICsKKyAgICAgICAgICBoRGVsLT5jb25maWcublNhY1RpbWVBbGlnbm1lbnQgKyBuRGVjb2RlckFuRGVsYXkgKyBuRGVjb2RlclN5bkRlbGF5OworICAgICAgaERlbC0+bkluZm9EZWNvZGVyRGVsYXkgPSBuRGVjb2RlckFuRGVsYXkgKyBuRGVjb2RlclN5bkRlbGF5OworCisgICAgfSAvKiBBcmJpdHJhcnlEbXggb3IgVGREbXggb24gKi8KKworICAgIC8qIEFkZGl0b25hbCBWYXJpYWJsZXMgbmVlZGVkIGZvciBDb21wdXRhdGlvbiBJc3N1ZXMgKi8KKyAgICBoRGVsLT5uQml0c3RyZWFtRnJhbWVCdWZmZXJTaXplID0gaERlbC0+bkJpdHN0cmVhbUZyYW1lQnVmZmVyICsgMTsKKyAgfQorCisgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIEZES19TQUNFTkNfRVJST1IgYXNzaWduUGFyYW1ldGVySW5SYW5nZSgKKyAgICBjb25zdCBJTlQgc3RhcnRSYW5nZSwgLyogaW5jbHVkaW5nIHN0YXJ0UmFuZ2UgKi8KKyAgICBjb25zdCBJTlQgc3RvcFJhbmdlLCAgLyogaW5jbHVkaW5nIHN0b3BSYW5nZSAqLworICAgIGNvbnN0IElOVCB2YWx1ZSwgICAgICAvKiB2YWx1ZSB0byB3cml0ZSovCisgICAgSU5UICpjb25zdCBwdHIgICAgICAgIC8qIGRlc3RpbmF0aW9uIHBvaW50ZXIqLworKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisKKyAgaWYgKChzdGFydFJhbmdlIDw9IHZhbHVlKSAmJiAodmFsdWUgPD0gc3RvcFJhbmdlKSkgeworICAgICpwdHIgPSB2YWx1ZTsKKyAgICBlcnJvciA9IFNBQ0VOQ19PSzsKKyAgfQorCisgIHJldHVybiBlcnJvcjsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2RlbGF5X1NldERteEFsaWduKEhBTkRMRV9ERUxBWSBoRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGJEbXhBbGlnbkluKSB7CisgIHJldHVybiAoYXNzaWduUGFyYW1ldGVySW5SYW5nZSgwLCAxLCBiRG14QWxpZ25JbiwgJmhEZWxheS0+Y29uZmlnLmJEbXhBbGlnbikpOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZGVsYXlfU2V0VGltZURvbURteChIQU5ETEVfREVMQVkgaERlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGJUaW1lRG9tRG14SW4pIHsKKyAgcmV0dXJuICgKKyAgICAgIGFzc2lnblBhcmFtZXRlckluUmFuZ2UoMCwgMSwgYlRpbWVEb21EbXhJbiwgJmhEZWxheS0+Y29uZmlnLmJUaW1lRG9tRG14KSk7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19kZWxheV9TZXRTYWNUaW1lQWxpZ25tZW50RHluYW1pY091dCgKKyAgICBIQU5ETEVfREVMQVkgaERlbGF5LCBjb25zdCBJTlQgYlNhY1RpbWVBbGlnbm1lbnREeW5hbWljT3V0SW4pIHsKKyAgcmV0dXJuIChhc3NpZ25QYXJhbWV0ZXJJblJhbmdlKDAsIDEsIGJTYWNUaW1lQWxpZ25tZW50RHluYW1pY091dEluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhEZWxheS0+Y29uZmlnLmJTYWNUaW1lQWxpZ25tZW50RHluYW1pY091dCkpOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZGVsYXlfU2V0TlNhY1RpbWVBbGlnbm1lbnQoCisgICAgSEFORExFX0RFTEFZIGhEZWxheSwgY29uc3QgSU5UIG5TYWNUaW1lQWxpZ25tZW50SW4pIHsKKyAgcmV0dXJuIChhc3NpZ25QYXJhbWV0ZXJJblJhbmdlKC0zMjc2OCwgMzI3NjcsIG5TYWNUaW1lQWxpZ25tZW50SW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaERlbGF5LT5jb25maWcublNhY1RpbWVBbGlnbm1lbnQpKTsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2RlbGF5X1NldE1pbmltaXplRGVsYXkoSEFORExFX0RFTEFZIGhEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBiTWluaW1pemVEZWxheSkgeworICByZXR1cm4gKGFzc2lnblBhcmFtZXRlckluUmFuZ2UoMCwgMSwgYk1pbmltaXplRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaERlbGF5LT5jb25maWcuYk1pbmltaXplRGVsYXkpKTsKK30KKworSU5UIGZka19zYWNlbmNfZGVsYXlfR2V0T3V0cHV0QXVkaW9CdWZmZXJEZWxheShIQU5ETEVfREVMQVkgaERlbGF5KSB7CisgIHJldHVybiAoaERlbGF5LT5uT3V0cHV0QXVkaW9CdWZmZXIpOworfQorCitJTlQgZmRrX3NhY2VuY19kZWxheV9HZXRTdXJyb3VuZEFuYWx5c2lzQnVmZmVyRGVsYXkoSEFORExFX0RFTEFZIGhEZWxheSkgeworICByZXR1cm4gKGhEZWxheS0+blN1cnJvdW5kQW5hbHlzaXNCdWZmZXIpOworfQorCitJTlQgZmRrX3NhY2VuY19kZWxheV9HZXRBcmJEbXhBbmFseXNpc0J1ZmZlckRlbGF5KEhBTkRMRV9ERUxBWSBoRGVsYXkpIHsKKyAgcmV0dXJuIChoRGVsYXktPm5BcmJEbXhBbmFseXNpc0J1ZmZlcik7Cit9CisKK0lOVCBmZGtfc2FjZW5jX2RlbGF5X0dldEJpdHN0cmVhbUZyYW1lQnVmZmVyU2l6ZShIQU5ETEVfREVMQVkgaERlbGF5KSB7CisgIHJldHVybiAoaERlbGF5LT5uQml0c3RyZWFtRnJhbWVCdWZmZXJTaXplKTsKK30KKworSU5UIGZka19zYWNlbmNfZGVsYXlfR2V0RG14QWxpZ25CdWZmZXJEZWxheShIQU5ETEVfREVMQVkgaERlbGF5KSB7CisgIHJldHVybiAoaERlbGF5LT5uRG14QWxpZ25CdWZmZXIpOworfQorCitJTlQgZmRrX3NhY2VuY19kZWxheV9HZXREaXNjYXJkT3V0RnJhbWVzKEhBTkRMRV9ERUxBWSBoRGVsYXkpIHsKKyAgcmV0dXJuIChoRGVsYXktPm5EaXNjYXJkT3V0RnJhbWVzKTsKK30KKworSU5UIGZka19zYWNlbmNfZGVsYXlfR2V0SW5mb0RteERlbGF5KEhBTkRMRV9ERUxBWSBoRGVsYXkpIHsKKyAgcmV0dXJuIChoRGVsYXktPm5JbmZvRG14RGVsYXkpOworfQorCitJTlQgZmRrX3NhY2VuY19kZWxheV9HZXRJbmZvQ29kZWNEZWxheShIQU5ETEVfREVMQVkgaERlbGF5KSB7CisgIHJldHVybiAoaERlbGF5LT5uSW5mb0NvZGVjRGVsYXkpOworfQorCitJTlQgZmRrX3NhY2VuY19kZWxheV9HZXRJbmZvRGVjb2RlckRlbGF5KEhBTkRMRV9ERUxBWSBoRGVsYXkpIHsKKyAgcmV0dXJuIChoRGVsYXktPm5JbmZvRGVjb2RlckRlbGF5KTsKK30KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2RlbGF5LmggYi9saWJTQUNlbmMvc3JjL3NhY2VuY19kZWxheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YmZiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19kZWxheS5oCkBAIC0wLDAgKzEsMTc1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBDaHJpc3RpYW4gR29ldHRsaW5nZXIKKworICAgRGVzY3JpcHRpb246IEVuY29kZXIgTGlicmFyeSBJbnRlcmZhY2UKKyAgICAgICAgICAgICAgICBkZWxheSBtYW5hZ2VtZW50IG9mIHRoZSBlbmNvZGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLyoqCisgICBcZmlsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgU0FDRU5DX0RFTEFZX0gKKyNkZWZpbmUgU0FDRU5DX0RFTEFZX0gKKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInNhY2VuY19saWIuaCIKKyNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKKyNpbmNsdWRlICJGREtfbWF0cml4Q2FsbG9jLmgiCisKKy8qIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTUFYX0RFTEFZX0lOUFVUIDEwMjQKKyNkZWZpbmUgTUFYX0RFTEFZX09VVFBVVCA0MDk2CisvKiBidW1wZWQgZnJvbSAwIHRvIDUuIHRoaXMgc2hvdWxkIGJlIGVxdWFsIG9yIGxhcmdlciB0byB0aGUgZHVhbHJhdGUgc2JyCisgKiByZXNhbXBsZXIgZmlsdGVyIGxlbmd0aCAqLworI2RlZmluZSBNQVhfREVMQVlfU1VSUk9VTkRfQU5BTFlTSVMgNQorI2RlZmluZSBNQVhfQklUU1RSRUFNX0RFTEFZIDEKKworLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgREVMQVkgKkhBTkRMRV9ERUxBWTsKKworLyogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZGVsYXlfT3BlbihIQU5ETEVfREVMQVkgKnBoRGVsYXkpOworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZGVsYXlfQ2xvc2UoSEFORExFX0RFTEFZICpwaERlbGF5KTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2RlbGF5X0luaXQoSEFORExFX0RFTEFZIGhEZWxheSwgY29uc3QgSU5UIG5RbWZMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5Db3JlQ29kZXJEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuU2FjU3RyZWFtTXV4RGVsYXkpOworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZGVsYXlfU3ViQ2FsdWxhdGVCdWZmZXJEZWxheXMoSEFORExFX0RFTEFZIGhEZWwpOworCisvKiBTZXQgRXhwZXJ0IENvbmZpZyBQYXJhbWV0ZXJzICovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZGVsYXlfU2V0RG14QWxpZ24oSEFORExFX0RFTEFZIGhEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYkRteEFsaWduSW4pOworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZGVsYXlfU2V0VGltZURvbURteChIQU5ETEVfREVMQVkgaERlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGJUaW1lRG9tRG14SW4pOworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZGVsYXlfU2V0U2FjVGltZUFsaWdubWVudER5bmFtaWNPdXQoCisgICAgSEFORExFX0RFTEFZIGhEZWxheSwgY29uc3QgSU5UIGJTYWNUaW1lQWxpZ25tZW50RHluYW1pY091dEluKTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2RlbGF5X1NldE5TYWNUaW1lQWxpZ25tZW50KAorICAgIEhBTkRMRV9ERUxBWSBoRGVsYXksIGNvbnN0IElOVCBuU2FjVGltZUFsaWdubWVudEluKTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2RlbGF5X1NldE1pbmltaXplRGVsYXkoSEFORExFX0RFTEFZIGhEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBiTWluaW1pemVEZWxheSk7CisKKy8qIEdldCBJbnRlcm5hbCBWYXJpYWJsZXMgKi8KK0lOVCBmZGtfc2FjZW5jX2RlbGF5X0dldE91dHB1dEF1ZGlvQnVmZmVyRGVsYXkoSEFORExFX0RFTEFZIGhEZWxheSk7CisKK0lOVCBmZGtfc2FjZW5jX2RlbGF5X0dldFN1cnJvdW5kQW5hbHlzaXNCdWZmZXJEZWxheShIQU5ETEVfREVMQVkgaERlbGF5KTsKKworSU5UIGZka19zYWNlbmNfZGVsYXlfR2V0QXJiRG14QW5hbHlzaXNCdWZmZXJEZWxheShIQU5ETEVfREVMQVkgaERlbGF5KTsKKworSU5UIGZka19zYWNlbmNfZGVsYXlfR2V0Qml0c3RyZWFtRnJhbWVCdWZmZXJTaXplKEhBTkRMRV9ERUxBWSBoRGVsYXkpOworCitJTlQgZmRrX3NhY2VuY19kZWxheV9HZXREbXhBbGlnbkJ1ZmZlckRlbGF5KEhBTkRMRV9ERUxBWSBoRGVsYXkpOworCitJTlQgZmRrX3NhY2VuY19kZWxheV9HZXREaXNjYXJkT3V0RnJhbWVzKEhBTkRMRV9ERUxBWSBoRGVsYXkpOworCitJTlQgZmRrX3NhY2VuY19kZWxheV9HZXRJbmZvRG14RGVsYXkoSEFORExFX0RFTEFZIGhEZWxheSk7CisKK0lOVCBmZGtfc2FjZW5jX2RlbGF5X0dldEluZm9Db2RlY0RlbGF5KEhBTkRMRV9ERUxBWSBoRGVsYXkpOworCitJTlQgZmRrX3NhY2VuY19kZWxheV9HZXRJbmZvRGVjb2RlckRlbGF5KEhBTkRMRV9ERUxBWSBoRGVsYXkpOworCisjZW5kaWYgLyogU0FDRU5DX0RFTEFZX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2RteF90ZG9tX2VuaC5jcHAgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19kbXhfdGRvbV9lbmguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNjZjODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19kbXhfdGRvbV9lbmguY3BwCkBAIC0wLDAgKzEsNjM5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNLiBMdWlzIFZhbGVybworCisgICBEZXNjcmlwdGlvbjogRW5oYW5jZWQgVGltZSBEb21haW4gRG93bm1peAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAic2FjZW5jX2RteF90ZG9tX2VuaC5oIgorCisjaW5jbHVkZSAiRkRLX21hdHJpeENhbGxvYy5oIgorI2luY2x1ZGUgIkZES190cmlnRmN0cy5oIgorI2luY2x1ZGUgImZpeHBvaW50X21hdGguaCIKKworLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQSV9GTFQgMy4xNDE1OTI2NTM1ODk3OTMxZgorI2RlZmluZSBBTFBIQV9GTFQgMC4wMDAxZgorCisjZGVmaW5lIFBJX0UgKDIpCisjZGVmaW5lIFBJX00gKEZMMkZYQ09OU1RfREJMKFBJX0ZMVCAvICgxIDw8IFBJX0UpKSkKKworI2RlZmluZSBBTFBIQV9FICgxMykKKyNkZWZpbmUgQUxQSEFfTSAoRkwyRlhDT05TVF9EQkwoQUxQSEFfRkxUICogKDEgPDwgQUxQSEFfRSkpKQorCitlbnVtIHsgTCA9IDAsIFIgPSAxIH07CisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IFRfRU5IQU5DRURfVElNRV9ET01BSU5fRE1YIHsKKyAgaW50IG1heEZyYW1lbGVuZ3RoOworCisgIGludCBmcmFtZWxlbmd0aDsKKworICBGSVhQX0RCTCBwcmV2X2dhaW5fbVsyXTsKKyAgSU5UIHByZXZfZ2Fpbl9lOworICBGSVhQX0RCTCBwcmV2X0gxX21bMl07CisgIElOVCBwcmV2X0gxX2U7CisKKyAgRklYUF9EQkwgKnNpbnVzV2luZG93X207CisgIFNDSEFSIHNpbnVzV2luZG93X2U7CisKKyAgRklYUF9EQkwgcHJldl9MZWZ0X207CisgIElOVCBwcmV2X0xlZnRfZTsKKyAgRklYUF9EQkwgcHJldl9SaWdodF9tOworICBJTlQgcHJldl9SaWdodF9lOworICBGSVhQX0RCTCBwcmV2X1hOcmdfbTsKKyAgSU5UIHByZXZfWE5yZ19lOworCisgIEZJWFBfREJMIGxpbl9iYkNsZF93ZWlnaHRfbTsKKyAgSU5UIGxpbl9iYkNsZF93ZWlnaHRfZTsKKyAgRklYUF9EQkwgZ2Fpbl93ZWlnaHRfbVsyXTsKKyAgSU5UIGdhaW5fd2VpZ2h0X2U7CisKK30gRU5IQU5DRURfVElNRV9ET01BSU5fRE1YOworCisvKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZVJhdGlvKGNvbnN0IEZJWFBfREJMIHNxcnRfbGluQ2xkX20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc3FydF9saW5DbGRfZSwgY29uc3QgRklYUF9EQkwgbGluX0NsZF9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGxpbl9DbGRfZSwgY29uc3QgRklYUF9EQkwgSWNjX20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgSWNjX2UsIEZJWFBfREJMIEdfbVsyXSwgSU5UICpHX2UpOworCitzdGF0aWMgdm9pZCBjYWxjdWxhdGVEbXhHYWlucyhjb25zdCBGSVhQX0RCTCBsaW5fQ2xkX20sIGNvbnN0IElOVCBsaW5fQ2xkX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBsaW5fQ2xkMl9tLCBjb25zdCBJTlQgbGluX0NsZDJfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIEljY19tLCBjb25zdCBJTlQgSWNjX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBHX21bMl0sIGNvbnN0IElOVCBHX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBIMV9tWzJdLCBJTlQgKnBIMV9lKTsKKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEZJWFBfREJMIGludlNxcnROb3JtMihjb25zdCBGSVhQX0RCTCBvcF9tLCBjb25zdCBJTlQgb3BfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpjb25zdCByZXN1bHRfZSkgeworICBGSVhQX0RCTCBzcmNfbSA9IG9wX207CisgIGludCBzcmNfZSA9IG9wX2U7CisKKyAgaWYgKHNyY19lICYgMSkgeworICAgIHNyY19tID4+PSAxOworICAgIHNyY19lICs9IDE7CisgIH0KKworICBzcmNfbSA9IGludlNxcnROb3JtMihzcmNfbSwgcmVzdWx0X2UpOworICAqcmVzdWx0X2UgPSAoKnJlc3VsdF9lKSAtIChzcmNfZSA+PiAxKTsKKworICByZXR1cm4gc3JjX207Cit9CisKK3N0YXRpYyBGSVhQX0RCTCBzcXJ0Rml4cChjb25zdCBGSVhQX0RCTCBvcF9tLCBjb25zdCBJTlQgb3BfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmNvbnN0IHJlc3VsdF9lKSB7CisgIEZJWFBfREJMIHNyY19tID0gb3BfbTsKKyAgaW50IHNyY19lID0gb3BfZTsKKworICBpZiAoc3JjX2UgJiAxKSB7CisgICAgc3JjX20gPj49IDE7CisgICAgc3JjX2UgKz0gMTsKKyAgfQorCisgICpyZXN1bHRfZSA9IChzcmNfZSA+PiAxKTsKKyAgcmV0dXJuIHNxcnRGaXhwKHNyY19tKTsKK30KKworc3RhdGljIEZJWFBfREJMIGZpeHBBZGQoY29uc3QgRklYUF9EQkwgc3JjMV9tLCBjb25zdCBJTlQgc3JjMV9lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgc3JjMl9tLCBjb25zdCBJTlQgc3JjMl9lLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpjb25zdCBkc3RfZSkgeworICBGSVhQX0RCTCBkc3RfbTsKKworICBpZiAoc3JjMV9tID09IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICAqZHN0X2UgPSBzcmMyX2U7CisgICAgZHN0X20gPSBzcmMyX207CisgIH0gZWxzZSBpZiAoc3JjMl9tID09IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICAqZHN0X2UgPSBzcmMxX2U7CisgICAgZHN0X20gPSBzcmMxX207CisgIH0gZWxzZSB7CisgICAgKmRzdF9lID0gZml4TWF4KHNyYzFfZSwgc3JjMl9lKSArIDE7CisgICAgZHN0X20gPQorICAgICAgICBzY2FsZVZhbHVlKHNyYzFfbSwgZml4TWF4KChzcmMxX2UgLSAoKmRzdF9lKSksIC0oREZSQUNUX0JJVFMgLSAxKSkpICsKKyAgICAgICAgc2NhbGVWYWx1ZShzcmMyX20sIGZpeE1heCgoc3JjMl9lIC0gKCpkc3RfZSkpLCAtKERGUkFDVF9CSVRTIC0gMSkpKTsKKyAgfQorICByZXR1cm4gZHN0X207Cit9CisKKy8qKgorICogXGJyaWVmICBTdW0gdXAgZml4cG9pbnQgdmFsdWVzIHdpdGggYmVzdCBwb3NzaWJsZSBhY2N1cmFjeS4KKyAqCisgKiBccGFyYW0gdmFsdWUxICAgICAgICBGaXJzdCBpbnB1dCB2YWx1ZS4KKyAqIFxwYXJhbSBxMSAgICAgICAgICAgIFNjYWxpbmcgZmFjdG9yIG9mIGZpcnN0IGlucHV0IHZhbHVlLgorICogXHBhcmFtIHBWYWx1ZTIgICAgICAgUG9pbnRlciB0byBzZWNvbmQgaW5wdXQgdmFsdWUsIHdpbGwgYmUgbW9kaWZpZWQgb24KKyAqIHJldHVybi4KKyAqIFxwYXJhbSBwUTIgICAgICAgICAgIFBvaW50ZXIgdG8gc2Vjb25kIHNjYWxpbmcgZmFjdG9yLCB3aWxsIGJlIG1vZGlmaWVkIG9uCisgKiByZXR1cm4uCisgKgorICogXHJldHVybiAgICB2b2lkCisgKi8KK3N0YXRpYyB2b2lkIGZpeHBBZGROb3JtKGNvbnN0IEZJWFBfREJMIHZhbHVlMSwgY29uc3QgSU5UIHExLAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmNvbnN0IHBWYWx1ZTIsIElOVCAqY29uc3QgcFEyKSB7CisgIGNvbnN0IGludCBoZWFkcm9vbTEgPSBmTm9ybXooZml4cF9hYnModmFsdWUxKSkgLSAxOworICBjb25zdCBpbnQgaGVhZHJvb20yID0gZk5vcm16KGZpeHBfYWJzKCpwVmFsdWUyKSkgLSAxOworICBpbnQgcmVzdWx0U2NhbGUgPSBmaXhNYXgocTEgLSBoZWFkcm9vbTEsICgqcFEyKSAtIGhlYWRyb29tMik7CisKKyAgaWYgKCh2YWx1ZTEgIT0gRkwyRlhDT05TVF9EQkwoMC5mKSkgJiYgKCpwVmFsdWUyICE9IEZMMkZYQ09OU1RfREJMKDAuZikpKSB7CisgICAgcmVzdWx0U2NhbGUrKzsKKyAgfQorCisgICpwVmFsdWUyID0KKyAgICAgIHNjYWxlVmFsdWUodmFsdWUxLCBxMSAtIHJlc3VsdFNjYWxlKSArCisgICAgICBzY2FsZVZhbHVlKCpwVmFsdWUyLCBmaXhNYXgoLShERlJBQ1RfQklUUyAtIDEpLCAoKCpwUTIpIC0gcmVzdWx0U2NhbGUpKSk7CisgICpwUTIgPSAoKnBWYWx1ZTIgIT0gKEZJWFBfREJMKTApID8gcmVzdWx0U2NhbGUgOiBERlJBQ1RfQklUUyAtIDE7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19vcGVuX2VuaGFuY2VkVGltZURvbWFpbkRteCgKKyAgICBIQU5ETEVfRU5IQU5DRURfVElNRV9ET01BSU5fRE1YICpwaEVuaGFuY2VkVGltZURteCwgY29uc3QgSU5UIGZyYW1lbGVuZ3RoKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisgIEhBTkRMRV9FTkhBTkNFRF9USU1FX0RPTUFJTl9ETVggaEVuaGFuY2VkVGltZURteCA9IE5VTEw7CisKKyAgaWYgKE5VTEwgPT0gcGhFbmhhbmNlZFRpbWVEbXgpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKGhFbmhhbmNlZFRpbWVEbXgsIDEsIEVOSEFOQ0VEX1RJTUVfRE9NQUlOX0RNWCk7CisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChoRW5oYW5jZWRUaW1lRG14LT5zaW51c1dpbmRvd19tLCAxICsgZnJhbWVsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCk7CisgICAgaEVuaGFuY2VkVGltZURteC0+bWF4RnJhbWVsZW5ndGggPSBmcmFtZWxlbmd0aDsKKyAgICAqcGhFbmhhbmNlZFRpbWVEbXggPSBoRW5oYW5jZWRUaW1lRG14OworICB9CisgIHJldHVybiBlcnJvcjsKKworYmFpbDoKKyAgZmRrX3NhY2VuY19jbG9zZV9lbmhhbmNlZFRpbWVEb21haW5EbXgoJmhFbmhhbmNlZFRpbWVEbXgpOworICByZXR1cm4gKChTQUNFTkNfT0sgPT0gZXJyb3IpID8gU0FDRU5DX01FTU9SWV9FUlJPUiA6IGVycm9yKTsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2luaXRfZW5oYW5jZWRUaW1lRG9tYWluRG14KAorICAgIEhBTkRMRV9FTkhBTkNFRF9USU1FX0RPTUFJTl9ETVggaEVuaGFuY2VkVGltZURteCwKKyAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgcElucHV0R2Fpbl9tLCBjb25zdCBJTlQgaW5wdXRHYWluX2UsCisgICAgY29uc3QgRklYUF9EQkwgb3V0cHV0R2Fpbl9tLCBjb25zdCBJTlQgb3V0cHV0R2Fpbl9lLAorICAgIGNvbnN0IElOVCBmcmFtZWxlbmd0aCkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChoRW5oYW5jZWRUaW1lRG14ID09IE5VTEwpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgc21wOworICAgIGlmIChmcmFtZWxlbmd0aCA+IGhFbmhhbmNlZFRpbWVEbXgtPm1heEZyYW1lbGVuZ3RoKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTklUX0VSUk9SOworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGhFbmhhbmNlZFRpbWVEbXgtPmZyYW1lbGVuZ3RoID0gZnJhbWVsZW5ndGg7CisKKyAgICBJTlQgZGVsdGF4X2U7CisgICAgRklYUF9EQkwgZGVsdGF4X207CisKKyAgICBkZWx0YXhfbSA9IGZEaXZOb3JtSGlnaFByZWMoCisgICAgICAgIFBJX00sIChGSVhQX0RCTCkoMiAqIGhFbmhhbmNlZFRpbWVEbXgtPmZyYW1lbGVuZ3RoKSwgJmRlbHRheF9lKTsKKyAgICBkZWx0YXhfbSA9IHNjYWxlVmFsdWUoZGVsdGF4X20sIFBJX0UgKyBkZWx0YXhfZSAtIChERlJBQ1RfQklUUyAtIDEpIC0gMSk7CisgICAgZGVsdGF4X2UgPSAxOworCisgICAgZm9yIChzbXAgPSAwOyBzbXAgPCBoRW5oYW5jZWRUaW1lRG14LT5mcmFtZWxlbmd0aCArIDE7IHNtcCsrKSB7CisgICAgICBoRW5oYW5jZWRUaW1lRG14LT5zaW51c1dpbmRvd19tW3NtcF0gPQorICAgICAgICAgIGZNdWx0KEFMUEhBX00sIGZQb3cyKGZpeHBfc2luKHNtcCAqIGRlbHRheF9tLCBkZWx0YXhfZSkpKTsKKyAgICB9CisgICAgaEVuaGFuY2VkVGltZURteC0+c2ludXNXaW5kb3dfZSA9IC1BTFBIQV9FOworCisgICAgaEVuaGFuY2VkVGltZURteC0+cHJldl9MZWZ0X20gPSBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X1JpZ2h0X20gPQorICAgICAgICBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X1hOcmdfbSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CisgICAgaEVuaGFuY2VkVGltZURteC0+cHJldl9MZWZ0X2UgPSBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X1JpZ2h0X2UgPQorICAgICAgICBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X1hOcmdfZSA9IERGUkFDVF9CSVRTIC0gMTsKKworICAgIGhFbmhhbmNlZFRpbWVEbXgtPmxpbl9iYkNsZF93ZWlnaHRfbSA9CisgICAgICAgIGZEaXZOb3JtSGlnaFByZWMoZlBvdzIocElucHV0R2Fpbl9tW0xdKSwgZlBvdzIocElucHV0R2Fpbl9tW1JdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmaEVuaGFuY2VkVGltZURteC0+bGluX2JiQ2xkX3dlaWdodF9lKTsKKworICAgIGhFbmhhbmNlZFRpbWVEbXgtPmdhaW5fd2VpZ2h0X21bTF0gPSBmTXVsdChwSW5wdXRHYWluX21bTF0sIG91dHB1dEdhaW5fbSk7CisgICAgaEVuaGFuY2VkVGltZURteC0+Z2Fpbl93ZWlnaHRfbVtSXSA9IGZNdWx0KHBJbnB1dEdhaW5fbVtSXSwgb3V0cHV0R2Fpbl9tKTsKKyAgICBoRW5oYW5jZWRUaW1lRG14LT5nYWluX3dlaWdodF9lID0KKyAgICAgICAgLWZOb3JtKGZpeE1heChoRW5oYW5jZWRUaW1lRG14LT5nYWluX3dlaWdodF9tW0xdLAorICAgICAgICAgICAgICAgICAgICAgIGhFbmhhbmNlZFRpbWVEbXgtPmdhaW5fd2VpZ2h0X21bUl0pKTsKKworICAgIGhFbmhhbmNlZFRpbWVEbXgtPmdhaW5fd2VpZ2h0X21bTF0gPSBzY2FsZVZhbHVlKAorICAgICAgICBoRW5oYW5jZWRUaW1lRG14LT5nYWluX3dlaWdodF9tW0xdLCAtaEVuaGFuY2VkVGltZURteC0+Z2Fpbl93ZWlnaHRfZSk7CisgICAgaEVuaGFuY2VkVGltZURteC0+Z2Fpbl93ZWlnaHRfbVtSXSA9IHNjYWxlVmFsdWUoCisgICAgICAgIGhFbmhhbmNlZFRpbWVEbXgtPmdhaW5fd2VpZ2h0X21bUl0sIC1oRW5oYW5jZWRUaW1lRG14LT5nYWluX3dlaWdodF9lKTsKKyAgICBoRW5oYW5jZWRUaW1lRG14LT5nYWluX3dlaWdodF9lICs9IGlucHV0R2Fpbl9lICsgb3V0cHV0R2Fpbl9lOworCisgICAgaEVuaGFuY2VkVGltZURteC0+cHJldl9nYWluX21bTF0gPSBoRW5oYW5jZWRUaW1lRG14LT5nYWluX3dlaWdodF9tW0xdID4+IDE7CisgICAgaEVuaGFuY2VkVGltZURteC0+cHJldl9nYWluX21bUl0gPSBoRW5oYW5jZWRUaW1lRG14LT5nYWluX3dlaWdodF9tW1JdID4+IDE7CisgICAgaEVuaGFuY2VkVGltZURteC0+cHJldl9nYWluX2UgPSBoRW5oYW5jZWRUaW1lRG14LT5nYWluX3dlaWdodF9lICsgMTsKKworICAgIGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfSDFfbVtMXSA9CisgICAgICAgIHNjYWxlVmFsdWUoaEVuaGFuY2VkVGltZURteC0+Z2Fpbl93ZWlnaHRfbVtMXSwgLTQpOworICAgIGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfSDFfbVtSXSA9CisgICAgICAgIHNjYWxlVmFsdWUoaEVuaGFuY2VkVGltZURteC0+Z2Fpbl93ZWlnaHRfbVtSXSwgLTQpOworICAgIGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfSDFfZSA9IDIgKyAyICsgaEVuaGFuY2VkVGltZURteC0+Z2Fpbl93ZWlnaHRfZTsKKyAgfQorYmFpbDoKKyAgcmV0dXJuIGVycm9yOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfYXBwbHlfZW5oYW5jZWRUaW1lRG9tYWluRG14KAorICAgIEhBTkRMRV9FTkhBTkNFRF9USU1FX0RPTUFJTl9ETVggaEVuaGFuY2VkVGltZURteCwKKyAgICBjb25zdCBJTlRfUENNICpjb25zdCAqY29uc3QgaW5wdXRUaW1lLCBJTlRfUENNICpjb25zdCBvdXRwdXRUaW1lRG14LAorICAgIGNvbnN0IElOVCBJbnB1dERlbGF5KSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKChOVUxMID09IGhFbmhhbmNlZFRpbWVEbXgpIHx8IChOVUxMID09IGlucHV0VGltZSkgfHwKKyAgICAgIChOVUxMID09IGlucHV0VGltZVtMXSkgfHwgKE5VTEwgPT0gaW5wdXRUaW1lW1JdKSB8fAorICAgICAgKE5VTEwgPT0gb3V0cHV0VGltZURteCkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgc21wOworICAgIEZJWFBfREJMIGxpbl9iYkNsZF9tLCBsaW5fQ2xkX20sIGJiQ29ycl9tLCBzcXJ0X2xpbkNsZF9tLCBHX21bMl0sIEgxX21bMl0sCisgICAgICAgIGdhaW5MZWZ0X20sIGdhaW5SaWdodF9tOworICAgIEZJWFBfREJMIGJiTnJnTGVmdF9tLCBiYk5yZ1JpZ2h0X20sIGJiWE5yZ19tLCBucmdMZWZ0X20sIG5yZ1JpZ2h0X20sIG5yZ1hfbTsKKyAgICBJTlQgbGluX2JiQ2xkX2UsIGxpbl9DbGRfZSwgYmJDb3JyX2UsIHNxcnRfbGluQ2xkX2UsIEdfZSwgSDFfZTsKKyAgICBJTlQgYmJOcmdMZWZ0X2UsIGJiTnJnUmlnaHRfZSwgYmJYTnJnX2UsIG5yZ0xlZnRfZSwgbnJnUmlnaHRfZSwgbnJnWF9lOworCisgICAgLyogSW5jcmVhc2UgZW5lcmd5IHRpbWUgcmVzb2x1dGlvbiB3aXRoIHNob3J0ZXIgcHJvY2Vzc2luZyBibG9ja3MuIDEyOCBpcyBhbgorICAgICAqIGVtcGlyaWMgdmFsdWUuICovCisgICAgY29uc3QgaW50IGdyYW51bGVMZW5ndGggPSBmaXhNaW4oMTI4LCBoRW5oYW5jZWRUaW1lRG14LT5mcmFtZWxlbmd0aCk7CisgICAgaW50IGdyYW51bGVTaGlmdCA9CisgICAgICAgIChncmFudWxlTGVuZ3RoID4gMSkKKyAgICAgICAgICAgID8gKChERlJBQ1RfQklUUyAtIDEpIC0gZk5vcm0oKEZJWFBfREJMKShncmFudWxlTGVuZ3RoIC0gMSkpKQorICAgICAgICAgICAgOiAwOworICAgIGdyYW51bGVTaGlmdCA9IGZpeE1heCgKKyAgICAgICAgMywgZ3JhbnVsZVNoaWZ0ICsKKyAgICAgICAgICAgICAgIDEpOyAvKiBvbmUgYml0IG1vcmUgaGVhZHJvb20gZm9yIHdvcnN0IGNhc2UgYWNjdW11bGF0aW9uICovCisKKyAgICBzbXAgPSAwOworCisgICAgLyogUHJldmVudCBkaXZpc2lvbiBieSB6ZXJvLiAqLworICAgIGJiTnJnTGVmdF9tID0gYmJOcmdSaWdodF9tID0gYmJYTnJnX20gPSAoRklYUF9EQkwpKDEpOworICAgIGJiTnJnTGVmdF9lID0gYmJOcmdSaWdodF9lID0gYmJYTnJnX2UgPSAwOworCisgICAgZG8geworICAgICAgY29uc3QgaW50IG9mZnNldCA9IHNtcDsKKyAgICAgIEZJWFBfREJMIHBhcnRpYWxMLCBwYXJ0aWFsUiwgcGFydGlhbFg7CisgICAgICBwYXJ0aWFsTCA9IHBhcnRpYWxSID0gcGFydGlhbFggPSBGTDJGWENPTlNUX0RCTCgwLmYpOworCisgICAgICBpbnQgaW5fbWFyZ2luID0gRkRLbWluKAorICAgICAgICAgIGdldFNjYWxlZmFjdG9yUENNKAorICAgICAgICAgICAgICAmaW5wdXRUaW1lW0xdW29mZnNldF0sCisgICAgICAgICAgICAgIGZpeE1pbihvZmZzZXQgKyBncmFudWxlTGVuZ3RoLCBoRW5oYW5jZWRUaW1lRG14LT5mcmFtZWxlbmd0aCkgLQorICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAxKSwKKyAgICAgICAgICBnZXRTY2FsZWZhY3RvclBDTSgKKyAgICAgICAgICAgICAgJmlucHV0VGltZVtSXVtvZmZzZXRdLAorICAgICAgICAgICAgICBmaXhNaW4ob2Zmc2V0ICsgZ3JhbnVsZUxlbmd0aCwgaEVuaGFuY2VkVGltZURteC0+ZnJhbWVsZW5ndGgpIC0KKyAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgMSkpOworCisgICAgICAvKiBwYXJ0aWFsIGVuZXJneSAqLworICAgICAgZm9yIChzbXAgPSBvZmZzZXQ7CisgICAgICAgICAgIHNtcCA8IGZpeE1pbihvZmZzZXQgKyBncmFudWxlTGVuZ3RoLCBoRW5oYW5jZWRUaW1lRG14LT5mcmFtZWxlbmd0aCk7CisgICAgICAgICAgIHNtcCsrKSB7CisgICAgICAgIEZJWFBfUENNIGlucHV0TCA9CisgICAgICAgICAgICBzY2FsZVZhbHVlKChGSVhQX1BDTSlpbnB1dFRpbWVbTF1bc21wXSwgaW5fbWFyZ2luIC0gMSk7CisgICAgICAgIEZJWFBfUENNIGlucHV0UiA9CisgICAgICAgICAgICBzY2FsZVZhbHVlKChGSVhQX1BDTSlpbnB1dFRpbWVbUl1bc21wXSwgaW5fbWFyZ2luIC0gMSk7CisKKyAgICAgICAgcGFydGlhbEwgKz0gZlBvdzJEaXYyKGlucHV0TCkgPj4gKGdyYW51bGVTaGlmdCAtIDMpOworICAgICAgICBwYXJ0aWFsUiArPSBmUG93MkRpdjIoaW5wdXRSKSA+PiAoZ3JhbnVsZVNoaWZ0IC0gMyk7CisgICAgICAgIHBhcnRpYWxYICs9IGZNdWx0RGl2MihpbnB1dEwsIGlucHV0UikgPj4gKGdyYW51bGVTaGlmdCAtIDMpOworICAgICAgfQorCisgICAgICBmaXhwQWRkTm9ybShwYXJ0aWFsTCwgZ3JhbnVsZVNoaWZ0IC0gMiAqIGluX21hcmdpbiwgJmJiTnJnTGVmdF9tLAorICAgICAgICAgICAgICAgICAgJmJiTnJnTGVmdF9lKTsKKyAgICAgIGZpeHBBZGROb3JtKHBhcnRpYWxSLCBncmFudWxlU2hpZnQgLSAyICogaW5fbWFyZ2luLCAmYmJOcmdSaWdodF9tLAorICAgICAgICAgICAgICAgICAgJmJiTnJnUmlnaHRfZSk7CisgICAgICBmaXhwQWRkTm9ybShwYXJ0aWFsWCwgZ3JhbnVsZVNoaWZ0IC0gMiAqIGluX21hcmdpbiwgJmJiWE5yZ19tLCAmYmJYTnJnX2UpOworICAgIH0gd2hpbGUgKHNtcCA8IGhFbmhhbmNlZFRpbWVEbXgtPmZyYW1lbGVuZ3RoKTsKKworICAgIG5yZ0xlZnRfbSA9CisgICAgICAgIGZpeHBBZGQoaEVuaGFuY2VkVGltZURteC0+cHJldl9MZWZ0X20sIGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfTGVmdF9lLAorICAgICAgICAgICAgICAgIGJiTnJnTGVmdF9tLCBiYk5yZ0xlZnRfZSwgJm5yZ0xlZnRfZSk7CisgICAgbnJnUmlnaHRfbSA9CisgICAgICAgIGZpeHBBZGQoaEVuaGFuY2VkVGltZURteC0+cHJldl9SaWdodF9tLCBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X1JpZ2h0X2UsCisgICAgICAgICAgICAgICAgYmJOcmdSaWdodF9tLCBiYk5yZ1JpZ2h0X2UsICZucmdSaWdodF9lKTsKKyAgICBucmdYX20gPQorICAgICAgICBmaXhwQWRkKGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfWE5yZ19tLCBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X1hOcmdfZSwKKyAgICAgICAgICAgICAgICBiYlhOcmdfbSwgYmJYTnJnX2UsICZucmdYX2UpOworCisgICAgbGluX2JiQ2xkX20gPSBmTXVsdChoRW5oYW5jZWRUaW1lRG14LT5saW5fYmJDbGRfd2VpZ2h0X20sCisgICAgICAgICAgICAgICAgICAgICAgICBmRGl2Tm9ybShucmdMZWZ0X20sIG5yZ1JpZ2h0X20sICZsaW5fYmJDbGRfZSkpOworICAgIGxpbl9iYkNsZF9lICs9CisgICAgICAgIGhFbmhhbmNlZFRpbWVEbXgtPmxpbl9iYkNsZF93ZWlnaHRfZSArIG5yZ0xlZnRfZSAtIG5yZ1JpZ2h0X2U7CisKKyAgICBiYkNvcnJfbSA9IGZNdWx0KG5yZ1hfbSwgaW52U3FydE5vcm0yKGZNdWx0KG5yZ0xlZnRfbSwgbnJnUmlnaHRfbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucmdMZWZ0X2UgKyBucmdSaWdodF9lLCAmYmJDb3JyX2UpKTsKKyAgICBiYkNvcnJfZSArPSBucmdYX2U7CisKKyAgICBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X0xlZnRfbSA9IGJiTnJnTGVmdF9tOworICAgIGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfTGVmdF9lID0gYmJOcmdMZWZ0X2U7CisgICAgaEVuaGFuY2VkVGltZURteC0+cHJldl9SaWdodF9tID0gYmJOcmdSaWdodF9tOworICAgIGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfUmlnaHRfZSA9IGJiTnJnUmlnaHRfZTsKKyAgICBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X1hOcmdfbSA9IGJiWE5yZ19tOworICAgIGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfWE5yZ19lID0gYmJYTnJnX2U7CisKKyAgICAvKgorICAgICAgIGJiQ2xkICAgID0gMTAuZipsb2cxMChsaW5fYmJDbGQpCisKKyAgICAgICBsaW5fQ2xkICA9IHBvdygxMCxiYkNsZC8yMCkKKyAgICAgICAgICAgICAgICA9IHBvdygxMCwxMC5mKmxvZzEwKGxpbl9iYkNsZCkvMjAuZikKKyAgICAgICAgICAgICAgICA9IHNxcnQobGluX2JiQ2xkKQorCisgICAgICAgbGluX0NsZDIgPSBsaW5fQ2xkKmxpbl9DbGQKKyAgICAgICAgICAgICAgICA9IHNxcnQobGluX2JiQ2xkKSpzcXJ0KGxpbl9iYkNsZCkKKyAgICAgICAgICAgICAgICA9IGxpbl9iYkNsZAorICAgICAqLworICAgIGxpbl9DbGRfbSA9IHNxcnRGaXhwKGxpbl9iYkNsZF9tLCBsaW5fYmJDbGRfZSwgJmxpbl9DbGRfZSk7CisgICAgc3FydF9saW5DbGRfbSA9IHNxcnRGaXhwKGxpbl9DbGRfbSwgbGluX0NsZF9lLCAmc3FydF9saW5DbGRfZSk7CisKKyAgICAvKmNhbGN1bGF0ZSBob3cgbXVjaCByaWdodCBhbmQgaG93IG11Y2ggbGVmdCBzaWduYWwsIHRvIGF2b2lkIHNpZ25hbAorICAgICAqIGNhbmNlbGxhdGlvbnMqLworICAgIGNhbGN1bGF0ZVJhdGlvKHNxcnRfbGluQ2xkX20sIHNxcnRfbGluQ2xkX2UsIGxpbl9DbGRfbSwgbGluX0NsZF9lLCBiYkNvcnJfbSwKKyAgICAgICAgICAgICAgICAgICBiYkNvcnJfZSwgR19tLCAmR19lKTsKKworICAgIC8qY2FsY3VsYXRlIGRvd25taXggZ2FpbnMqLworICAgIGNhbGN1bGF0ZURteEdhaW5zKGxpbl9DbGRfbSwgbGluX0NsZF9lLCBsaW5fYmJDbGRfbSwgbGluX2JiQ2xkX2UsIGJiQ29ycl9tLAorICAgICAgICAgICAgICAgICAgICAgIGJiQ29ycl9lLCBHX20sIEdfZSwgSDFfbSwgJkgxX2UpOworCisgICAgLyphZGFwdCBvdXRwdXQgZ2FpbnMqLworICAgIEgxX21bTF0gPSBmTXVsdChIMV9tW0xdLCBoRW5oYW5jZWRUaW1lRG14LT5nYWluX3dlaWdodF9tW0xdKTsKKyAgICBIMV9tW1JdID0gZk11bHQoSDFfbVtSXSwgaEVuaGFuY2VkVGltZURteC0+Z2Fpbl93ZWlnaHRfbVtSXSk7CisgICAgSDFfZSArPSBoRW5oYW5jZWRUaW1lRG14LT5nYWluX3dlaWdodF9lOworCisgICAgZ2FpbkxlZnRfbSA9IGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfZ2Fpbl9tW0xdOworICAgIGdhaW5SaWdodF9tID0gaEVuaGFuY2VkVGltZURteC0+cHJldl9nYWluX21bUl07CisKKyAgICBJTlQgaW50ZXJtZWRpYXRlX2dhaW5fZSA9CisgICAgICAgICtoRW5oYW5jZWRUaW1lRG14LT5zaW51c1dpbmRvd19lICsgSDFfZSAtIGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfZ2Fpbl9lOworCisgICAgZm9yIChzbXAgPSAwOyBzbXAgPCBoRW5oYW5jZWRUaW1lRG14LT5mcmFtZWxlbmd0aDsgc21wKyspIHsKKyAgICAgIGNvbnN0IElOVCBOID0gaEVuaGFuY2VkVGltZURteC0+ZnJhbWVsZW5ndGg7CisgICAgICBGSVhQX0RCTCBpbnRlcm1lZGlhdGVfZ2FpbkxlZnRfbSwgaW50ZXJtZWRpYXRlX2dhaW5SaWdodF9tLCB0bXA7CisKKyAgICAgIGludGVybWVkaWF0ZV9nYWluTGVmdF9tID0KKyAgICAgICAgICBzY2FsZVZhbHVlKChmTXVsdChoRW5oYW5jZWRUaW1lRG14LT5zaW51c1dpbmRvd19tW3NtcF0sIEgxX21bTF0pICsKKyAgICAgICAgICAgICAgICAgICAgICBmTXVsdChoRW5oYW5jZWRUaW1lRG14LT5zaW51c1dpbmRvd19tW04gLSBzbXBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfSDFfbVtMXSkpLAorICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX2dhaW5fZSk7CisgICAgICBpbnRlcm1lZGlhdGVfZ2FpblJpZ2h0X20gPQorICAgICAgICAgIHNjYWxlVmFsdWUoKGZNdWx0KGhFbmhhbmNlZFRpbWVEbXgtPnNpbnVzV2luZG93X21bc21wXSwgSDFfbVtSXSkgKworICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGhFbmhhbmNlZFRpbWVEbXgtPnNpbnVzV2luZG93X21bTiAtIHNtcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVuaGFuY2VkVGltZURteC0+cHJldl9IMV9tW1JdKSksCisgICAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGVfZ2Fpbl9lKTsKKworICAgICAgZ2FpbkxlZnRfbSA9IGludGVybWVkaWF0ZV9nYWluTGVmdF9tICsKKyAgICAgICAgICAgICAgICAgICBmTXVsdChGTDJGWENPTlNUX0RCTCgxLmYgLSBBTFBIQV9GTFQpLCBnYWluTGVmdF9tKTsKKyAgICAgIGdhaW5SaWdodF9tID0gaW50ZXJtZWRpYXRlX2dhaW5SaWdodF9tICsKKyAgICAgICAgICAgICAgICAgICAgZk11bHQoRkwyRlhDT05TVF9EQkwoMS5mIC0gQUxQSEFfRkxUKSwgZ2FpblJpZ2h0X20pOworCisgICAgICB0bXAgPSBmTXVsdERpdjIoZ2FpbkxlZnRfbSwgKEZJWFBfUENNKWlucHV0VGltZVtMXVtzbXAgKyBJbnB1dERlbGF5XSkgKworICAgICAgICAgICAgZk11bHREaXYyKGdhaW5SaWdodF9tLCAoRklYUF9QQ00paW5wdXRUaW1lW1JdW3NtcCArIElucHV0RGVsYXldKTsKKyAgICAgIG91dHB1dFRpbWVEbXhbc21wXSA9IChJTlRfUENNKVNBVFVSQVRFX1NISUZUKAorICAgICAgICAgIHRtcCwKKyAgICAgICAgICAtKGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfZ2Fpbl9lICsgMSAtIChERlJBQ1RfQklUUyAtIFNBTVBMRV9CSVRTKSksCisgICAgICAgICAgU0FNUExFX0JJVFMpOworICAgIH0KKworICAgIGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfZ2Fpbl9tW0xdID0gZ2FpbkxlZnRfbTsKKyAgICBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X2dhaW5fbVtSXSA9IGdhaW5SaWdodF9tOworCisgICAgaEVuaGFuY2VkVGltZURteC0+cHJldl9IMV9tW0xdID0gSDFfbVtMXTsKKyAgICBoRW5oYW5jZWRUaW1lRG14LT5wcmV2X0gxX21bUl0gPSBIMV9tW1JdOworICAgIGhFbmhhbmNlZFRpbWVEbXgtPnByZXZfSDFfZSA9IEgxX2U7CisgIH0KKworICByZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZVJhdGlvKGNvbnN0IEZJWFBfREJMIHNxcnRfbGluQ2xkX20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc3FydF9saW5DbGRfZSwgY29uc3QgRklYUF9EQkwgbGluX0NsZF9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGxpbl9DbGRfZSwgY29uc3QgRklYUF9EQkwgSWNjX20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgSWNjX2UsIEZJWFBfREJMIEdfbVsyXSwgSU5UICpHX2UpIHsKKyNkZWZpbmUgR19TQ0FMRV9GQUNUT1IgKDIpCisKKyAgaWYgKEljY19tID49IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICBHX21bMF0gPSBHX21bMV0gPSBGTDJGWENPTlNUX0RCTCgxLmYgLyAoZmxvYXQpKDEgPDwgR19TQ0FMRV9GQUNUT1IpKTsKKyAgICBHX2VbMF0gPSBHX1NDQUxFX0ZBQ1RPUjsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBGSVhQX0RCTCBtYXhfZ2Fpbl9mYWN0b3IgPQorICAgICAgICBGTDJGWENPTlNUX0RCTCgyLmYgLyAoZmxvYXQpKDEgPDwgR19TQ0FMRV9GQUNUT1IpKTsKKyAgICBGSVhQX0RCTCB0bXAxX20sIHRtcDJfbSwgbnVtZXJhdG9yX20sIGRlbm9taW5hdG9yX20sIHJfbSwgcjRfbSwgcTsKKyAgICBJTlQgdG1wMV9lLCB0bXAyX2UsIG51bWVyYXRvcl9lLCBkZW5vbWluYXRvcl9lLCByX2UsIHI0X2U7CisKKyAgICAvKiAgciAgID0gKGxpbl9DbGQgKyAxICsgMipJY2Mqc3FydF9saW5DbGQpIC8gKGxpbl9DbGQgKyAxIC0KKyAgICAgKiAyKkljYypzcXJ0X2xpbkNsZCkgPSAodG1wMSArIHRtcDIpIC8gKHRtcDEgLSB0bXAyKQorICAgICAqLworICAgIHRtcDFfbSA9CisgICAgICAgIGZpeHBBZGQobGluX0NsZF9tLCBsaW5fQ2xkX2UsIEZMMkZYQ09OU1RfREJMKDEuZiAvIDIuZiksIDEsICZ0bXAxX2UpOworCisgICAgdG1wMl9tID0gZk11bHQoSWNjX20sIHNxcnRfbGluQ2xkX20pOworICAgIHRtcDJfZSA9IDEgKyBJY2NfZSArIHNxcnRfbGluQ2xkX2U7CisgICAgbnVtZXJhdG9yX20gPSBmaXhwQWRkKHRtcDFfbSwgdG1wMV9lLCB0bXAyX20sIHRtcDJfZSwgJm51bWVyYXRvcl9lKTsKKyAgICBkZW5vbWluYXRvcl9tID0gZml4cEFkZCh0bXAxX20sIHRtcDFfZSwgLXRtcDJfbSwgdG1wMl9lLCAmZGVub21pbmF0b3JfZSk7CisKKyAgICBpZiAoKG51bWVyYXRvcl9tID4gRkwyRlhDT05TVF9EQkwoMC5mKSkgJiYKKyAgICAgICAgKGRlbm9taW5hdG9yX20gPiBGTDJGWENPTlNUX0RCTCgwLmYpKSkgeworICAgICAgcl9tID0gZkRpdk5vcm0obnVtZXJhdG9yX20sIGRlbm9taW5hdG9yX20sICZyX2UpOworICAgICAgcl9lICs9IG51bWVyYXRvcl9lIC0gZGVub21pbmF0b3JfZTsKKworICAgICAgLyogcl80ID0gc3FydCggc3FydCggciApICkgKi8KKyAgICAgIHI0X20gPSBzcXJ0Rml4cChyX20sIHJfZSwgJnI0X2UpOworICAgICAgcjRfbSA9IHNxcnRGaXhwKHI0X20sIHI0X2UsICZyNF9lKTsKKworICAgICAgcjRfZSAtPSBHX1NDQUxFX0ZBQ1RPUjsKKworICAgICAgLyogcSA9IG1pbihyNF9tLCBtYXhfZ2Fpbl9mYWN0b3IpICovCisgICAgICBxID0gKChyNF9lID49IDApICYmIChyNF9tID49IChtYXhfZ2Fpbl9mYWN0b3IgPj4gcjRfZSkpKQorICAgICAgICAgICAgICA/IG1heF9nYWluX2ZhY3RvcgorICAgICAgICAgICAgICA6IHNjYWxlVmFsdWUocjRfbSwgcjRfZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHEgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICAgIH0KKworICAgIEdfbVswXSA9IG1heF9nYWluX2ZhY3RvciAtIHE7CisgICAgR19tWzFdID0gcTsKKworICAgICpHX2UgPSBHX1NDQUxFX0ZBQ1RPUjsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBjYWxjdWxhdGVEbXhHYWlucyhjb25zdCBGSVhQX0RCTCBsaW5fQ2xkX20sIGNvbnN0IElOVCBsaW5fQ2xkX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBsaW5fQ2xkMl9tLCBjb25zdCBJTlQgbGluX0NsZDJfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIEljY19tLCBjb25zdCBJTlQgSWNjX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBHX21bMl0sIGNvbnN0IElOVCBHX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBIMV9tWzJdLCBJTlQgKnBIMV9lKSB7CisjZGVmaW5lIEgxX1NDQUxFX0ZBQ1RPUiAoMikKKyAgY29uc3QgRklYUF9EQkwgbWF4X2dhaW5fZmFjdG9yID0KKyAgICAgIEZMMkZYQ09OU1RfREJMKDIuZiAvIChmbG9hdCkoMSA8PCBIMV9TQ0FMRV9GQUNUT1IpKTsKKworICBGSVhQX0RCTCBucmdSaWdodF9tLCBucmdMZWZ0X20sIGNyb3NzTnJnX20sIGludl93ZWlnaHRfbnVtX20sCisgICAgICBpbnZfd2VpZ2h0X2Rlbm9tX20sIGludmVyc2Vfd2VpZ2h0X20sIGludmVyc2Vfd2VpZ2h0X2xpbWl0ZWQ7CisgIElOVCBucmdSaWdodF9lLCBucmdMZWZ0X2UsIGNyb3NzTnJnX2UsIGludl93ZWlnaHRfbnVtX2UsIGludl93ZWlnaHRfZGVub21fZSwKKyAgICAgIGludmVyc2Vfd2VpZ2h0X2U7CisKKyAgLyogbnJnUmlnaHQgPSBzcXJ0KDEvKGxpbl9DbGQyICsgMSkgKi8KKyAgbnJnUmlnaHRfbSA9IGZpeHBBZGQobGluX0NsZDJfbSwgbGluX0NsZDJfZSwgRkwyRlhDT05TVF9EQkwoMS5mIC8gMi5mKSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgJm5yZ1JpZ2h0X2UpOworICBucmdSaWdodF9tID0gaW52U3FydE5vcm0yKG5yZ1JpZ2h0X20sIG5yZ1JpZ2h0X2UsICZucmdSaWdodF9lKTsKKworICAvKiBucmdMZWZ0ID0gbGluX0NsZCAqIG5yZ1JpZ2h0ICovCisgIG5yZ0xlZnRfbSA9IGZNdWx0KGxpbl9DbGRfbSwgbnJnUmlnaHRfbSk7CisgIG5yZ0xlZnRfZSA9IGxpbl9DbGRfZSArIG5yZ1JpZ2h0X2U7CisKKyAgLyogY3Jvc3NOcmcgPSBzcXJ0KG5yZ0xlZnQqbnJnUmlnaHQpICovCisgIGNyb3NzTnJnX20gPSBzcXJ0Rml4cChmTXVsdChucmdMZWZ0X20sIG5yZ1JpZ2h0X20pLCBucmdMZWZ0X2UgKyBucmdSaWdodF9lLAorICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3NzTnJnX2UpOworCisgIC8qIGludmVyc2Vfd2VpZ2h0ID0gc3FydCgobnJnTGVmdCArIG5yZ1JpZ2h0KSAvICggKEdbMF0qR1swXSpucmdMZWZ0KSArCisgICAqIChHWzFdKkdbMV0qbnJnUmlnaHQpICsgMipHWzBdKkdbMV0qSWNjKmNyb3NzTnJnKSkgPSBzcXJ0KGludl93ZWlnaHRfbnVtIC8KKyAgICogaW52X3dlaWdodF9kZW5vbSkKKyAgICovCisgIGludl93ZWlnaHRfbnVtX20gPQorICAgICAgZml4cEFkZChucmdSaWdodF9tLCBucmdSaWdodF9lLCBucmdMZWZ0X20sIG5yZ0xlZnRfZSwgJmludl93ZWlnaHRfbnVtX2UpOworCisgIGludl93ZWlnaHRfZGVub21fbSA9CisgICAgICBmaXhwQWRkKGZNdWx0KGZQb3cyKEdfbVswXSksIG5yZ0xlZnRfbSksIDIgKiBHX2UgKyBucmdMZWZ0X2UsCisgICAgICAgICAgICAgIGZNdWx0KGZQb3cyKEdfbVsxXSksIG5yZ1JpZ2h0X20pLCAyICogR19lICsgbnJnUmlnaHRfZSwKKyAgICAgICAgICAgICAgJmludl93ZWlnaHRfZGVub21fZSk7CisKKyAgaW52X3dlaWdodF9kZW5vbV9tID0KKyAgICAgIGZpeHBBZGQoZk11bHQoZk11bHQoZk11bHQoR19tWzBdLCBHX21bMV0pLCBjcm9zc05yZ19tKSwgSWNjX20pLAorICAgICAgICAgICAgICAxICsgMiAqIEdfZSArIGNyb3NzTnJnX2UgKyBJY2NfZSwgaW52X3dlaWdodF9kZW5vbV9tLAorICAgICAgICAgICAgICBpbnZfd2VpZ2h0X2Rlbm9tX2UsICZpbnZfd2VpZ2h0X2Rlbm9tX2UpOworCisgIGlmIChpbnZfd2VpZ2h0X2Rlbm9tX20gPiBGTDJGWENPTlNUX0RCTCgwLmYpKSB7CisgICAgaW52ZXJzZV93ZWlnaHRfbSA9CisgICAgICAgIGZEaXZOb3JtKGludl93ZWlnaHRfbnVtX20sIGludl93ZWlnaHRfZGVub21fbSwgJmludmVyc2Vfd2VpZ2h0X2UpOworICAgIGludmVyc2Vfd2VpZ2h0X20gPQorICAgICAgICBzcXJ0Rml4cChpbnZlcnNlX3dlaWdodF9tLAorICAgICAgICAgICAgICAgICBpbnZlcnNlX3dlaWdodF9lICsgaW52X3dlaWdodF9udW1fZSAtIGludl93ZWlnaHRfZGVub21fZSwKKyAgICAgICAgICAgICAgICAgJmludmVyc2Vfd2VpZ2h0X2UpOworICAgIGludmVyc2Vfd2VpZ2h0X2UgLT0gSDFfU0NBTEVfRkFDVE9SOworCisgICAgLyogaW52ZXJzZV93ZWlnaHRfbGltaXRlZCA9IG1pbihtYXhfZ2Fpbl9mYWN0b3IsIGludmVyc2Vfd2VpZ2h0KSAqLworICAgIGludmVyc2Vfd2VpZ2h0X2xpbWl0ZWQgPQorICAgICAgICAoKGludmVyc2Vfd2VpZ2h0X2UgPj0gMCkgJiYKKyAgICAgICAgIChpbnZlcnNlX3dlaWdodF9tID49IChtYXhfZ2Fpbl9mYWN0b3IgPj4gaW52ZXJzZV93ZWlnaHRfZSkpKQorICAgICAgICAgICAgPyBtYXhfZ2Fpbl9mYWN0b3IKKyAgICAgICAgICAgIDogc2NhbGVWYWx1ZShpbnZlcnNlX3dlaWdodF9tLCBpbnZlcnNlX3dlaWdodF9lKTsKKyAgfSBlbHNlIHsKKyAgICBpbnZlcnNlX3dlaWdodF9saW1pdGVkID0gbWF4X2dhaW5fZmFjdG9yOworICB9CisKKyAgSDFfbVswXSA9IGZNdWx0KEdfbVswXSwgaW52ZXJzZV93ZWlnaHRfbGltaXRlZCk7CisgIEgxX21bMV0gPSBmTXVsdChHX21bMV0sIGludmVyc2Vfd2VpZ2h0X2xpbWl0ZWQpOworCisgICpwSDFfZSA9IEdfZSArIEgxX1NDQUxFX0ZBQ1RPUjsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2Nsb3NlX2VuaGFuY2VkVGltZURvbWFpbkRteCgKKyAgICBIQU5ETEVfRU5IQU5DRURfVElNRV9ET01BSU5fRE1YICpwaEVuaGFuY2VkVGltZURteCkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChwaEVuaGFuY2VkVGltZURteCA9PSBOVUxMKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaWYgKCpwaEVuaGFuY2VkVGltZURteCAhPSBOVUxMKSB7CisgICAgICBpZiAoKCpwaEVuaGFuY2VkVGltZURteCktPnNpbnVzV2luZG93X20gIT0gTlVMTCkgeworICAgICAgICBGREtfRlJFRV9NRU1PUllfMUQoKCpwaEVuaGFuY2VkVGltZURteCktPnNpbnVzV2luZG93X20pOworICAgICAgfQorICAgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKCpwaEVuaGFuY2VkVGltZURteCk7CisgICAgfQorICB9CisgIHJldHVybiBlcnJvcjsKK30KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2RteF90ZG9tX2VuaC5oIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfZG14X3Rkb21fZW5oLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzOTkxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2RteF90ZG9tX2VuaC5oCkBAIC0wLDAgKzEsMTM0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNLiBMdWlzIFZhbGVybworCisgICBEZXNjcmlwdGlvbjogRW5oYW5jZWQgVGltZSBEb21haW4gRG93bm1peAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNBQ0VOQ19ETVhfVERPTV9FTkhfSAorI2RlZmluZSBTQUNFTkNfRE1YX1RET01fRU5IX0gKKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInNhY2VuY19saWIuaCIKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKy8qIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgVF9FTkhBTkNFRF9USU1FX0RPTUFJTl9ETVggKkhBTkRMRV9FTkhBTkNFRF9USU1FX0RPTUFJTl9ETVg7CisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX29wZW5fZW5oYW5jZWRUaW1lRG9tYWluRG14KAorICAgIEhBTkRMRV9FTkhBTkNFRF9USU1FX0RPTUFJTl9ETVggKmhFbmhhbmNlZFRpbWVEbXgsIGNvbnN0IElOVCBmcmFtZWxlbmd0aCk7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19pbml0X2VuaGFuY2VkVGltZURvbWFpbkRteCgKKyAgICBIQU5ETEVfRU5IQU5DRURfVElNRV9ET01BSU5fRE1YIGhFbmhhbmNlZFRpbWVEbXgsCisgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHBJbnB1dEdhaW5fbSwgY29uc3QgSU5UIGlucHV0R2Fpbl9lLAorICAgIGNvbnN0IEZJWFBfREJMIG91dHB1dEdhaW5fbSwgY29uc3QgSU5UIG91dHB1dEdhaW5fZSwgY29uc3QgSU5UIGZyYW1lbGVuZ3RoKTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2FwcGx5X2VuaGFuY2VkVGltZURvbWFpbkRteCgKKyAgICBIQU5ETEVfRU5IQU5DRURfVElNRV9ET01BSU5fRE1YIGhFbmhhbmNlZFRpbWVEbXgsCisgICAgY29uc3QgSU5UX1BDTSAqY29uc3QgKmNvbnN0IGlucHV0VGltZSwgSU5UX1BDTSAqY29uc3Qgb3V0cHV0VGltZURteCwKKyAgICBjb25zdCBJTlQgSW5wdXREZWxheSk7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19jbG9zZV9lbmhhbmNlZFRpbWVEb21haW5EbXgoCisgICAgSEFORExFX0VOSEFOQ0VEX1RJTUVfRE9NQUlOX0RNWCAqaEVuaGFuY2VkVGltZURteCk7CisKKyNlbmRpZiAvKiBTQUNFTkNfRE1YX1RET01fRU5IX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2ZpbHRlci5jcHAgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19maWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZjA3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19maWx0ZXIuY3BwCkBAIC0wLDAgKzEsMjA3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNLiBNdWx0cnVzCisKKyAgIERlc2NyaXB0aW9uOiBFbmNvZGVyIExpYnJhcnkKKyAgICAgICAgICAgICAgICBGaWx0ZXIgZnVuY3Rpb25zCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJzYWNlbmNfZmlsdGVyLmgiCisKKy8qIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgVF9EQ19GSUxURVIgeworICBGSVhQX0RCTCBjX19GREs7CisgIEZJWFBfREJMIHN0YXRlX19GREs7CisKK30gRENfRklMVEVSOworCisvKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2NyZWF0ZURDRmlsdGVyKEhBTkRMRV9EQ19GSUxURVIgKmhEQ0ZpbHRlcikgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChOVUxMID09IGhEQ0ZpbHRlcikgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIEZES19BTExPQ0FURV9NRU1PUllfMUQoKmhEQ0ZpbHRlciwgMSwgRENfRklMVEVSKTsKKyAgfQorICByZXR1cm4gZXJyb3I7CisKK2JhaWw6CisgIGZka19zYWNlbmNfZGVzdHJveURDRmlsdGVyKGhEQ0ZpbHRlcik7CisgIHJldHVybiAoKFNBQ0VOQ19PSyA9PSBlcnJvcikgPyBTQUNFTkNfTUVNT1JZX0VSUk9SIDogZXJyb3IpOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfaW5pdERDRmlsdGVyKEhBTkRMRV9EQ19GSUxURVIgaERDRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIHNhbXBsZVJhdGUpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBGSVhQX0RCTCBleHBDOworICBpbnQgczsKKworICAvKiBDb252ZXJzaW9uIGZvciB1c2Ugb2YgQ2FsY0ludkxkRGF0YTogZV54ID0gMl4oeCpsb2cxMChlKS9sb2cxMCgyKSA9CisgICAgIENhbGNJbnZMZERhdGEoeCpsb2cxMChlKS9sb2cxMCgyKS82NC4wKSAxLjQ0MjY5NTA0MDg5ID0gbG9nMTAoZSkvbG9nMTAoMikKKyAgICAgMC41ICAgICAgICAgICA9IHNjYWxlIGNvbnN0YW50IHZhbHVlIHdpdGggMSBCaXRzCisgICovCisgIGV4cEMgPSBmRGl2Tm9ybUhpZ2hQcmVjKChGSVhQX0RCTCkyMCwgKEZJWFBfREJMKXNhbXBsZVJhdGUsICZzKTsKKyAgZXhwQyA9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgtMS40NDI2OTUwNDA4OSAqIDAuNSksIGV4cEMpID4+CisgICAgICAgICAoTERfREFUQV9TSElGVCAtIDEgLSAxKTsKKworICBpZiAocyA8IDApCisgICAgZXhwQyA9IGV4cEMgPj4gKC1zKTsKKyAgZWxzZQorICAgIGV4cEMgPSBleHBDIDw8IChzKTsKKworICBleHBDID0gQ2FsY0ludkxkRGF0YShleHBDKTsKKworICBoRENGaWx0ZXItPmNfX0ZESyA9IGV4cEM7CisgIGhEQ0ZpbHRlci0+c3RhdGVfX0ZESyA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworCisgIHJldHVybiBlcnJvcjsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2Rlc3Ryb3lEQ0ZpbHRlcihIQU5ETEVfRENfRklMVEVSICpoRENGaWx0ZXIpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKGhEQ0ZpbHRlciAhPSBOVUxMKSAmJiAoKmhEQ0ZpbHRlciAhPSBOVUxMKSkgeworICAgIEZES2ZyZWUoKmhEQ0ZpbHRlcik7CisKKyAgICAqaERDRmlsdGVyID0gTlVMTDsKKyAgfQorCisgIHJldHVybiBlcnJvcjsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2FwcGx5RENGaWx0ZXIoSEFORExFX0RDX0ZJTFRFUiBoRENGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlRfUENNICpjb25zdCBzaWduYWxJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKmNvbnN0IHNpZ25hbE91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzaWduYWxMZW5ndGgpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKGhEQ0ZpbHRlciA9PSBOVUxMKSB8fCAoc2lnbmFsSW4gPT0gTlVMTCkgfHwgKHNpZ25hbE91dCA9PSBOVUxMKSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGNvbnN0IElOVF9QQ00gKmNvbnN0IHggPSBzaWduYWxJbjsKKyAgICBJTlRfUENNICpjb25zdCB5ID0gc2lnbmFsT3V0OworICAgIGNvbnN0IEZJWFBfREJMIGMgPSBoRENGaWx0ZXItPmNfX0ZESzsKKyAgICBGSVhQX0RCTCAqY29uc3Qgc3RhdGUgPSAmaERDRmlsdGVyLT5zdGF0ZV9fRkRLOworICAgIGludCBpOworICAgIEZJWFBfREJMIHgwLCB4MSwgeTE7CisKKyAgICB4MSA9IHgwID0gRlhfUENNMkZYX0RCTCh4WzBdKSA+PiBEQ19GSUxURVJfU0Y7CisgICAgeTEgPSB4MCArICgqc3RhdGUpOworCisgICAgZm9yIChpID0gMTsgaSA8IHNpZ25hbExlbmd0aDsgaSsrKSB7CisgICAgICB4MCA9IEZYX1BDTTJGWF9EQkwoeFtpXSkgPj4gRENfRklMVEVSX1NGOworICAgICAgeVtpIC0gMV0gPSBGWF9EQkwyRlhfUENNKHkxKTsKKyAgICAgIHkxID0geDAgLSB4MSArIGZNdWx0KGMsIHkxKTsKKyAgICAgIHgxID0geDA7CisgICAgfQorCisgICAgKnN0YXRlID0gZk11bHQoYywgeTEpIC0geDE7CisgICAgeVtpIC0gMV0gPSBGWF9EQkwyRlhfUENNKHkxKTsKKyAgfQorCisgIHJldHVybiBlcnJvcjsKK30KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2ZpbHRlci5oIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfZmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlM2FiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2ZpbHRlci5oCkBAIC0wLDAgKzEsMTMzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNLiBNdWx0cnVzCisKKyAgIERlc2NyaXB0aW9uOiBFbmNvZGVyIExpYnJhcnkgSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgRmlsdGVyIGZ1bmN0aW9ucworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNBQ0VOQ19GSUxURVJfSAorI2RlZmluZSBTQUNFTkNfRklMVEVSX0gKKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKyNpbmNsdWRlICJzYWNlbmNfbGliLmgiCisjaW5jbHVkZSAiRkRLX21hdHJpeENhbGxvYy5oIgorCisvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIERDX0ZJTFRFUl9TRiAxCisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IFRfRENfRklMVEVSICpIQU5ETEVfRENfRklMVEVSOworCisvKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19jcmVhdGVEQ0ZpbHRlcihIQU5ETEVfRENfRklMVEVSICpoRENGaWx0ZXIpOworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfaW5pdERDRmlsdGVyKEhBTkRMRV9EQ19GSUxURVIgaERDRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIHNhbXBsZVJhdGUpOworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZGVzdHJveURDRmlsdGVyKEhBTkRMRV9EQ19GSUxURVIgKmhEQ0ZpbHRlcik7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19hcHBseURDRmlsdGVyKEhBTkRMRV9EQ19GSUxURVIgaERDRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UX1BDTSAqY29uc3Qgc2lnbmFsSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICpjb25zdCBzaWduYWxPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2lnbmFsTGVuZ3RoKTsKKworI2VuZGlmIC8qIFNBQ0VOQ19GSUxURVJfSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0FDZW5jL3NyYy9zYWNlbmNfZnJhbWV3aW5kb3dpbmcuY3BwIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfZnJhbWV3aW5kb3dpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZjBmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19mcmFtZXdpbmRvd2luZy5jcHAKQEAgLTAsMCArMSw1NjggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1heCBOZXVlbmRvcmYKKworICAgRGVzY3JpcHRpb246IEVuY29kZXIgTGlicmFyeSBJbnRlcmZhY2UKKyAgICAgICAgICAgICAgICBHZXQgd2luZG93cyBmb3IgZnJhbWluZworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC8qKgorICAgXGZpbGUKKyAgIERlc2NyaXB0aW9uIG9mIGZpbGUgY29udGVudHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJzYWNlbmNfZnJhbWV3aW5kb3dpbmcuaCIKKyNpbmNsdWRlICJzYWNlbmNfdmVjdG9yZnVuY3Rpb25zLmgiCisKKy8qIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgVF9GUkFNRVdJTkRPVyB7CisgIElOVCBuVGltZVNsb3RzTWF4OworICBJTlQgYkZyYW1lS2VlcDsKKyAgSU5UIHN0YXJ0U2xvcGU7CisgIElOVCBzdG9wU2xvcGU7CisgIElOVCBzdGFydFJlY3Q7CisgIElOVCBzdG9wUmVjdDsKKworICBJTlQgdGFwZXJBbmFMZW47CisgIElOVCB0YXBlclN5bkxlbjsKKyAgRklYUF9XSU4gcFRhcGVyQW5hX19GREtbTUFYX1RJTUVfU0xPVFNdOworICBGSVhQX1dJTiBwVGFwZXJTeW5fX0ZES1tNQVhfVElNRV9TTE9UU107CisKK30gRlJBTUVXSU5ET1c7CisKK3R5cGVkZWYgZW51bSB7CisgIEZJWF9JTlZBTElEID0gLTEsCisgIEZJWF9SRUNUX1NNT09USCA9IDAsCisgIEZJWF9TTU9PVEhfUkVDVCA9IDEsCisgIEZJWF9MQVJHRV9TTU9PVEggPSAyLAorICBGSVhfUkVDVF9UUklBTkcgPSAzCisKK30gRklYX1RZUEU7CisKK3R5cGVkZWYgZW51bSB7CisgIFZBUl9JTlZBTElEID0gLTEsCisgIFZBUl9IT0xEID0gMCwKKyAgVkFSX0lTT0xBVEUgPSAxCisKK30gVkFSX1RZUEU7CisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlZmluaXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBjYWxjVGFwZXJXaW4oRklYUF9XSU4gKnBUYXBlcldpbiwgSU5UIHRpbWVTbG90cykgeworICBGSVhQX0RCTCB4OworICBpbnQgaSwgc2NhbGU7CisKKyAgZm9yIChpID0gMDsgaSA8IHRpbWVTbG90czsgaSsrKSB7CisgICAgeCA9IGZEaXZOb3JtSGlnaFByZWMoKEZJWFBfREJMKWksIChGSVhQX0RCTCl0aW1lU2xvdHMsICZzY2FsZSk7CisKKyAgICBpZiAoc2NhbGUgPCAwKSB7CisgICAgICBwVGFwZXJXaW5baV0gPSBGWF9EQkwyRlhfV0lOKHggPj4gKC1zY2FsZSkpOworICAgIH0gZWxzZSB7CisgICAgICBwVGFwZXJXaW5baV0gPSBGWF9EQkwyRlhfV0lOKHggPDwgKHNjYWxlKSk7CisgICAgfQorICB9CisgIHBUYXBlcldpblt0aW1lU2xvdHNdID0gRlhfREJMMkZYX1dJTigoRklYUF9EQkwpTUFYVkFMX0RCTCk7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19mcmFtZVdpbmRvd19DcmVhdGUoCisgICAgSEFORExFX0ZSQU1FV0lORE9XICpwaEZyYW1lV2luZG93KSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKE5VTEwgPT0gcGhGcmFtZVdpbmRvdykgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIC8qIE1lbW9yeSBBbGxvY2F0aW9uICovCisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRCgqcGhGcmFtZVdpbmRvdywgMSwgRlJBTUVXSU5ET1cpOworICB9CisgIHJldHVybiBlcnJvcjsKKworYmFpbDoKKyAgZmRrX3NhY2VuY19mcmFtZVdpbmRvd19EZXN0cm95KHBoRnJhbWVXaW5kb3cpOworICByZXR1cm4gKChTQUNFTkNfT0sgPT0gZXJyb3IpID8gU0FDRU5DX01FTU9SWV9FUlJPUiA6IGVycm9yKTsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2ZyYW1lV2luZG93X0luaXQoCisgICAgSEFORExFX0ZSQU1FV0lORE9XIGhGcmFtZVdpbmRvdywKKyAgICBjb25zdCBGUkFNRVdJTkRPV19DT05GSUcgKmNvbnN0IHBGcmFtZVdpbmRvd0NvbmZpZykgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgoaEZyYW1lV2luZG93ID09IE5VTEwpIHx8IChwRnJhbWVXaW5kb3dDb25maWcgPT0gTlVMTCkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIGlmIChwRnJhbWVXaW5kb3dDb25maWctPm5UaW1lU2xvdHNNYXggPCAwKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5JVF9FUlJPUjsKKyAgfSBlbHNlIHsKKyAgICBpbnQgdHM7CisgICAgaEZyYW1lV2luZG93LT5iRnJhbWVLZWVwID0gcEZyYW1lV2luZG93Q29uZmlnLT5iRnJhbWVLZWVwOworICAgIGhGcmFtZVdpbmRvdy0+blRpbWVTbG90c01heCA9IHBGcmFtZVdpbmRvd0NvbmZpZy0+blRpbWVTbG90c01heDsKKworICAgIEZJWFBfV0lOIHdpbk1heFZhbCA9IEZYX0RCTDJGWF9XSU4oKEZJWFBfREJMKU1BWFZBTF9EQkwpOworICAgIGludCB0aW1lU2xvdHMgPSBwRnJhbWVXaW5kb3dDb25maWctPm5UaW1lU2xvdHNNYXg7CisgICAgeworICAgICAgaEZyYW1lV2luZG93LT5zdGFydFNsb3BlID0gMDsKKyAgICAgIGhGcmFtZVdpbmRvdy0+c3RvcFNsb3BlID0gKCgzICogdGltZVNsb3RzKSA+PiAxKSAtIDE7CisgICAgICBoRnJhbWVXaW5kb3ctPnN0YXJ0UmVjdCA9IHRpbWVTbG90cyA+PiAxOworICAgICAgaEZyYW1lV2luZG93LT5zdG9wUmVjdCA9IHRpbWVTbG90czsKKyAgICAgIGNhbGNUYXBlcldpbihoRnJhbWVXaW5kb3ctPnBUYXBlclN5bl9fRkRLLCB0aW1lU2xvdHMgPj4gMSk7CisgICAgICBoRnJhbWVXaW5kb3ctPnRhcGVyU3luTGVuID0gdGltZVNsb3RzID4+IDE7CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRlIFRhcGVyIGZvciBub24tcmVjdC4gYW5hLiB3aW5kb3dzICovCisgICAgaEZyYW1lV2luZG93LT50YXBlckFuYUxlbiA9CisgICAgICAgIGhGcmFtZVdpbmRvdy0+c3RhcnRSZWN0IC0gaEZyYW1lV2luZG93LT5zdGFydFNsb3BlOworICAgIGZvciAodHMgPSAwOyB0cyA8IGhGcmFtZVdpbmRvdy0+dGFwZXJBbmFMZW47IHRzKyspIHsKKyAgICAgIHsgaEZyYW1lV2luZG93LT5wVGFwZXJBbmFfX0ZES1t0c10gPSB3aW5NYXhWYWw7IH0KKyAgICB9CisgIH0KKworICByZXR1cm4gZXJyb3I7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19mcmFtZVdpbmRvd19EZXN0cm95KAorICAgIEhBTkRMRV9GUkFNRVdJTkRPVyAqcGhGcmFtZVdpbmRvdykgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgoTlVMTCAhPSBwaEZyYW1lV2luZG93KSAmJiAoTlVMTCAhPSAqcGhGcmFtZVdpbmRvdykpIHsKKyAgICBGREtmcmVlKCpwaEZyYW1lV2luZG93KTsKKyAgICAqcGhGcmFtZVdpbmRvdyA9IE5VTEw7CisgIH0KKyAgcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiBGcmFtZVdpbkxpc3RfUmVzZXQoRlJBTUVXSU5fTElTVCAqY29uc3QgcEZyYW1lV2luTGlzdCkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChOVUxMID09IHBGcmFtZVdpbkxpc3QpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgayA9IDA7CisgICAgZm9yIChrID0gMDsgayA8IE1BWF9OVU1fUEFSQU1TOyBrKyspIHsKKyAgICAgIHBGcmFtZVdpbkxpc3QtPmRhdFtrXS5zbG90ID0gLTE7CisgICAgICBwRnJhbWVXaW5MaXN0LT5kYXRba10uaG9sZCA9IEZXX0lOVFA7CisgICAgfQorICAgIHBGcmFtZVdpbkxpc3QtPm4gPSAwOworICB9CisgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIEZES19TQUNFTkNfRVJST1IgRnJhbWVXaW5kb3dMaXN0X0FkZChGUkFNRVdJTl9MSVNUICpjb25zdCBwRnJhbWVXaW5MaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRldfU0xPVFRZUEUgaG9sZCkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChOVUxMID09IHBGcmFtZVdpbkxpc3QpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBpZiAocEZyYW1lV2luTGlzdC0+biA+PSBNQVhfTlVNX1BBUkFNUykgeyAvKiBQbGFjZSBsZWZ0IGluIExpc3QgPyovCisgICAgICBlcnJvciA9IFNBQ0VOQ19QQVJBTV9FUlJPUjsKKyAgICB9IGVsc2UgaWYgKHBGcmFtZVdpbkxpc3QtPm4gPiAwICYmCisgICAgICAgICAgICAgICBwRnJhbWVXaW5MaXN0LT5kYXRbcEZyYW1lV2luTGlzdC0+biAtIDFdLnNsb3QgLSBzbG90ID4gMCkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfUEFSQU1fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgIHBGcmFtZVdpbkxpc3QtPmRhdFtwRnJhbWVXaW5MaXN0LT5uXS5zbG90ID0gc2xvdDsKKyAgICAgIHBGcmFtZVdpbkxpc3QtPmRhdFtwRnJhbWVXaW5MaXN0LT5uXS5ob2xkID0gaG9sZDsKKyAgICAgIHBGcmFtZVdpbkxpc3QtPm4rKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiBGcmFtZVdpbmRvd0xpc3RfUmVtb3ZlKAorICAgIEZSQU1FV0lOX0xJU1QgKmNvbnN0IHBGcmFtZVdpbkxpc3QsIGNvbnN0IElOVCBpZHgpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoTlVMTCA9PSBwRnJhbWVXaW5MaXN0KSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaW50IGsgPSAwOworICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBNQVhfTlVNX1BBUkFNUykgeworICAgICAgZXJyb3IgPSBTQUNFTkNfUEFSQU1fRVJST1I7CisgICAgfSBlbHNlIGlmIChwRnJhbWVXaW5MaXN0LT5uID4gMCkgeworICAgICAgaWYgKGlkeCA9PSBNQVhfTlVNX1BBUkFNUyAtIDEpIHsKKyAgICAgICAgcEZyYW1lV2luTGlzdC0+ZGF0W2lkeF0uc2xvdCA9IC0xOworICAgICAgICBwRnJhbWVXaW5MaXN0LT5kYXRbaWR4XS5ob2xkID0gRldfSU5UUDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoayA9IGlkeDsgayA8IE1BWF9OVU1fUEFSQU1TIC0gMTsgaysrKSB7CisgICAgICAgICAgcEZyYW1lV2luTGlzdC0+ZGF0W2tdID0gcEZyYW1lV2luTGlzdC0+ZGF0W2sgKyAxXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcEZyYW1lV2luTGlzdC0+bi0tOworICAgIH0KKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBGREtfU0FDRU5DX0VSUk9SIEZyYW1lV2luZG93TGlzdF9MaW1pdCgKKyAgICBGUkFNRVdJTl9MSVNUICpjb25zdCBwRnJhbWVXaW5MaXN0LCBjb25zdCBJTlQgbGwgLypsb3dlciBsaW1pdCovLAorICAgIGNvbnN0IElOVCB1bCAvKnVwcGVyIGxpbWl0Ki8KKykgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChOVUxMID09IHBGcmFtZVdpbkxpc3QpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgayA9IDA7CisgICAgZm9yIChrID0gMDsgayA8IHBGcmFtZVdpbkxpc3QtPm47IGsrKykgeworICAgICAgaWYgKHBGcmFtZVdpbkxpc3QtPmRhdFtrXS5zbG90IDwgbGwgfHwgcEZyYW1lV2luTGlzdC0+ZGF0W2tdLnNsb3QgPiB1bCkgeworICAgICAgICBGcmFtZVdpbmRvd0xpc3RfUmVtb3ZlKHBGcmFtZVdpbkxpc3QsIGspOworICAgICAgICAtLWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBlcnJvcjsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2ZyYW1lV2luZG93X0dldFdpbmRvdygKKyAgICBIQU5ETEVfRlJBTUVXSU5ET1cgaEZyYW1lV2luZG93LCBJTlQgdHJfcG9zW01BWF9OVU1fUEFSQU1TXSwKKyAgICBjb25zdCBJTlQgdGltZVNsb3RzLCBGUkFNSU5HSU5GTyAqY29uc3QgcEZyYW1pbmdJbmZvLAorICAgIEZJWFBfV0lOICpwV2luZG93QW5hX19GREtbTUFYX05VTV9QQVJBTVNdLAorICAgIEZSQU1FV0lOX0xJU1QgKmNvbnN0IHBGcmFtZVdpbkxpc3QsIGNvbnN0IElOVCBhdm9pZF9rZWVwKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKChoRnJhbWVXaW5kb3cgPT0gTlVMTCkgfHwgKHRyX3BvcyA9PSBOVUxMKSB8fCAocEZyYW1pbmdJbmZvID09IE5VTEwpIHx8CisgICAgICAocEZyYW1lV2luTGlzdCA9PSBOVUxMKSB8fCAocFdpbmRvd0FuYV9fRkRLID09IE5VTEwpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgY29uc3QgVkFSX1RZUEUgdmFyVHlwZSA9IFZBUl9IT0xEOworICAgIGNvbnN0IGludCB0cmFuTCA9IDQ7CisgICAgaW50IHdpbkNudCA9IDA7CisgICAgaW50IHcsIHBzOworCisgICAgaW50IHN0YXJ0U2xvcGUgPSBoRnJhbWVXaW5kb3ctPnN0YXJ0U2xvcGU7CisgICAgaW50IHN0b3BTbG9wZSA9IGhGcmFtZVdpbmRvdy0+c3RvcFNsb3BlOworICAgIGludCBzdGFydFJlY3QgPSBoRnJhbWVXaW5kb3ctPnN0YXJ0UmVjdDsKKyAgICBpbnQgc3RvcFJlY3QgPSBoRnJhbWVXaW5kb3ctPnN0b3BSZWN0OworICAgIGludCB0YXBlckFuYUxlbiA9IGhGcmFtZVdpbmRvdy0+dGFwZXJBbmFMZW47CisKKyAgICBGSVhQX1dJTiB3aW5NYXhWYWwgPSBGWF9EQkwyRlhfV0lOKChGSVhQX0RCTClNQVhWQUxfREJMKTsKKyAgICBGSVhQX1dJTiBhcHBseVJpZ2h0V2luZG93R2Fpbl9fRkRLW01BWF9OVU1fUEFSQU1TXTsKKyAgICBGSVhQX1dJTiAqcFRhcGVyQW5hX19GREsgPSBoRnJhbWVXaW5kb3ctPnBUYXBlckFuYV9fRkRLOworCisgICAgLyogc2FuaXR5IGNoZWNrICovCisgICAgZm9yIChwcyA9IDA7IHBzIDwgTUFYX05VTV9QQVJBTVM7IHBzKyspIHsKKyAgICAgIGlmIChwV2luZG93QW5hX19GREtbcHNdID09IE5VTEwpIHsKKyAgICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHRpbWVTbG90cyA+IGhGcmFtZVdpbmRvdy0+blRpbWVTbG90c01heCkgfHwgKHRpbWVTbG90cyA8IDApKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBSZXNldCAqLworICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gRnJhbWVXaW5MaXN0X1Jlc2V0KHBGcmFtZVdpbkxpc3QpKSkgZ290byBiYWlsOworCisgICAgRkRLbWVtY2xlYXIoYXBwbHlSaWdodFdpbmRvd0dhaW5fX0ZESywgc2l6ZW9mKGFwcGx5UmlnaHRXaW5kb3dHYWluX19GREspKTsKKworICAgIGlmICh0cl9wb3NbMF0gPiAtMSkgeyAvKiBUcmFuc2llbnRzIGluIGZpcnN0IChsZWZ0KSBoYWxmPyAqLworICAgICAgaW50IHBfbCA9IHRyX3Bvc1swXTsKKyAgICAgIHdpbkNudCA9IDA7CisKKyAgICAgIC8qIENyZWF0ZSBQYXJhbWV0ZXIgUG9zaXRpb25zICovCisgICAgICBzd2l0Y2ggKHZhclR5cGUpIHsKKyAgICAgICAgY2FzZSBWQVJfSE9MRDoKKyAgICAgICAgICBpZiAoU0FDRU5DX09LICE9CisgICAgICAgICAgICAgIChlcnJvciA9IEZyYW1lV2luZG93TGlzdF9BZGQocEZyYW1lV2luTGlzdCwgcF9sIC0gMSwgRldfSE9MRCkpKQorICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgIGlmIChTQUNFTkNfT0sgIT0KKyAgICAgICAgICAgICAgKGVycm9yID0gRnJhbWVXaW5kb3dMaXN0X0FkZChwRnJhbWVXaW5MaXN0LCBwX2wsIEZXX0lOVFApKSkKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWQVJfSVNPTEFURToKKyAgICAgICAgICBpZiAoU0FDRU5DX09LICE9CisgICAgICAgICAgICAgIChlcnJvciA9IEZyYW1lV2luZG93TGlzdF9BZGQocEZyYW1lV2luTGlzdCwgcF9sIC0gMSwgRldfSE9MRCkpKQorICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgIGlmIChTQUNFTkNfT0sgIT0KKyAgICAgICAgICAgICAgKGVycm9yID0gRnJhbWVXaW5kb3dMaXN0X0FkZChwRnJhbWVXaW5MaXN0LCBwX2wsIEZXX0lOVFApKSkKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICBpZiAoU0FDRU5DX09LICE9IChlcnJvciA9IEZyYW1lV2luZG93TGlzdF9BZGQocEZyYW1lV2luTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9sICsgdHJhbkwsIEZXX0hPTEQpKSkKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICBpZiAoU0FDRU5DX09LICE9IChlcnJvciA9IEZyYW1lV2luZG93TGlzdF9BZGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGcmFtZVdpbkxpc3QsIHBfbCArIHRyYW5MICsgMSwgRldfSU5UUCkpKQorICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvKiBPdXRzaWRlIG9mIGZyYW1lPyA9PiBLaWNrIE91dCAqLworICAgICAgaWYgKFNBQ0VOQ19PSyAhPQorICAgICAgICAgIChlcnJvciA9IEZyYW1lV2luZG93TGlzdF9MaW1pdChwRnJhbWVXaW5MaXN0LCAwLCB0aW1lU2xvdHMgLSAxKSkpCisgICAgICAgIGdvdG8gYmFpbDsKKworICAgICAgLyogQWRkIHRpbWVTbG90cyBhcyB0ZW1wb3JhcnkgYm9yZGVyIGZvciB3aW5kb3cgY3JlYXRpb24gKi8KKyAgICAgIGlmIChTQUNFTkNfT0sgIT0KKyAgICAgICAgICAoZXJyb3IgPSBGcmFtZVdpbmRvd0xpc3RfQWRkKHBGcmFtZVdpbkxpc3QsIHRpbWVTbG90cyAtIDEsIEZXX0hPTEQpKSkKKyAgICAgICAgZ290byBiYWlsOworCisgICAgICAvKiBDcmVhdGUgV2luZG93cyAqLworICAgICAgZm9yIChwcyA9IDA7IHBzIDwgcEZyYW1lV2luTGlzdC0+biAtIDE7IHBzKyspIHsKKyAgICAgICAgaWYgKEZXX0hPTEQgIT0gcEZyYW1lV2luTGlzdC0+ZGF0W3BzXS5ob2xkKSB7CisgICAgICAgICAgaW50IGNvbnN0IHN0YXJ0ID0gcEZyYW1lV2luTGlzdC0+ZGF0W3BzXS5zbG90OworICAgICAgICAgIGludCBjb25zdCBzdG9wID0gcEZyYW1lV2luTGlzdC0+ZGF0W3BzICsgMV0uc2xvdDsKKworICAgICAgICAgIC8qIEFuYWx5c2lzIFdpbmRvdyAqLworICAgICAgICAgIEZES21lbXNldF9mbGV4KHBXaW5kb3dBbmFfX0ZES1t3aW5DbnRdLCBGWF9EQkwyRlhfV0lOKChGSVhQX0RCTCkwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCk7CisgICAgICAgICAgRkRLbWVtc2V0X2ZsZXgoJnBXaW5kb3dBbmFfX0ZES1t3aW5DbnRdW3N0YXJ0XSwgd2luTWF4VmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AgLSBzdGFydCArIDEpOworICAgICAgICAgIEZES21lbXNldF9mbGV4KCZwV2luZG93QW5hX19GREtbd2luQ250XVtzdG9wICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfREJMMkZYX1dJTigoRklYUF9EQkwpMCksIHRpbWVTbG90cyAtIHN0b3AgLSAxKTsKKworICAgICAgICAgIGFwcGx5UmlnaHRXaW5kb3dHYWluX19GREtbd2luQ250XSA9CisgICAgICAgICAgICAgIHBXaW5kb3dBbmFfX0ZES1t3aW5DbnRdW3RpbWVTbG90cyAtIDFdOworICAgICAgICAgIHdpbkNudCsrOworICAgICAgICB9CisgICAgICB9IC8qIHBzICovCisKKyAgICAgIC8qIFBvcCB0ZW1wb3JhcnkgZnJhbWUgYm9yZGVyICovCisgICAgICBpZiAoU0FDRU5DX09LICE9CisgICAgICAgICAgKGVycm9yID0gRnJhbWVXaW5kb3dMaXN0X1JlbW92ZShwRnJhbWVXaW5MaXN0LCBwRnJhbWVXaW5MaXN0LT5uIC0gMSkpKQorICAgICAgICBnb3RvIGJhaWw7CisgICAgfSBlbHNlIHsgLyogTm8gdHJhbnNpZW50IGluIGxlZnQgaGFsZiBvZiBhbmEuIHdpbmRvdyAqLworICAgICAgd2luQ250ID0gMDsKKworICAgICAgLyogQWRkIHBhcmFtdGVyIHNldCBhdCBlbmQgb2YgZnJhbWUgKi8KKyAgICAgIGlmIChTQUNFTkNfT0sgIT0KKyAgICAgICAgICAoZXJyb3IgPSBGcmFtZVdpbmRvd0xpc3RfQWRkKHBGcmFtZVdpbkxpc3QsIHRpbWVTbG90cyAtIDEsIEZXX0lOVFApKSkKKyAgICAgICAgZ290byBiYWlsOworICAgICAgLyogQW5hbHlzaXMgV2luZG93ICovCisgICAgICBGREttZW1zZXRfZmxleChwV2luZG93QW5hX19GREtbd2luQ250XSwgRlhfREJMMkZYX1dJTigoRklYUF9EQkwpMCksCisgICAgICAgICAgICAgICAgICAgICBzdGFydFNsb3BlKTsKKyAgICAgIEZES21lbWNweV9mbGV4KCZwV2luZG93QW5hX19GREtbd2luQ250XVtzdGFydFNsb3BlXSwgMSwgcFRhcGVyQW5hX19GREssIDEsCisgICAgICAgICAgICAgICAgICAgICB0YXBlckFuYUxlbik7CisgICAgICBGREttZW1zZXRfZmxleCgmcFdpbmRvd0FuYV9fRkRLW3dpbkNudF1bc3RhcnRSZWN0XSwgd2luTWF4VmFsLAorICAgICAgICAgICAgICAgICAgICAgdGltZVNsb3RzIC0gc3RhcnRSZWN0KTsKKworICAgICAgYXBwbHlSaWdodFdpbmRvd0dhaW5fX0ZES1t3aW5DbnRdID0gd2luTWF4VmFsOworICAgICAgd2luQ250Kys7CisgICAgfSAvKiBpZiAodHJfcG9zWzBdID4gLTEpICovCisKKyAgICBmb3IgKHcgPSAwOyB3IDwgd2luQ250OyB3KyspIHsKKyAgICAgIGlmIChhcHBseVJpZ2h0V2luZG93R2Fpbl9fRkRLW3ddID4gKEZJWFBfV0lOKTApIHsKKyAgICAgICAgaWYgKHRyX3Bvc1sxXSA+IC0xKSB7IC8qIFRyYW5zaWVudHMgaW4gc2Vjb25kIChyaWdodCkgaGFsZj8gKi8KKyAgICAgICAgICBpbnQgcF9yID0gdHJfcG9zWzFdOworCisgICAgICAgICAgLyogQW5hbHlzaXMgV2luZG93ICovCisgICAgICAgICAgRkRLbWVtc2V0X2ZsZXgoJnBXaW5kb3dBbmFfX0ZES1t3XVt0aW1lU2xvdHNdLCB3aW5NYXhWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgcF9yIC0gdGltZVNsb3RzKTsKKyAgICAgICAgICBGREttZW1zZXRfZmxleCgmcFdpbmRvd0FuYV9fRkRLW3ddW3Bfcl0sIEZYX0RCTDJGWF9XSU4oKEZJWFBfREJMKTApLAorICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiB0aW1lU2xvdHMgLSBwX3IpOworCisgICAgICAgIH0gZWxzZSB7IC8qIE5vIHRyYW5zaWVudCBpbiByaWdodCBoYWxmIG9mIGFuYS4gd2luZG93ICovCisgICAgICAgICAgLyogQW5hbHlzaXMgV2luZG93ICovCisgICAgICAgICAgRkRLbWVtc2V0X2ZsZXgoJnBXaW5kb3dBbmFfX0ZES1t3XVt0aW1lU2xvdHNdLCB3aW5NYXhWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcFJlY3QgLSB0aW1lU2xvdHMgKyAxKTsKKyAgICAgICAgICBGREttZW1jcHlfZmxleCgmcFdpbmRvd0FuYV9fRkRLW3ddW3N0b3BSZWN0XSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcFRhcGVyQW5hX19GREtbdGFwZXJBbmFMZW4gLSAxXSwgLTEsIHRhcGVyQW5hTGVuKTsKKyAgICAgICAgICBGREttZW1zZXRfZmxleCgmcFdpbmRvd0FuYV9fRkRLW3ddW3N0b3BTbG9wZSArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RCTDJGWF9XSU4oKEZJWFBfREJMKTApLAorICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiB0aW1lU2xvdHMgLSBzdG9wU2xvcGUgLSAxKTsKKworICAgICAgICB9IC8qIGlmICh0cl9wb3NbMV0gPiAtMSkgKi8KKworICAgICAgICAvKiBXZWlnaHQgKi8KKyAgICAgICAgaWYgKGFwcGx5UmlnaHRXaW5kb3dHYWluX19GREtbd10gPCB3aW5NYXhWYWwpIHsKKyAgICAgICAgICBpbnQgdHM7CisgICAgICAgICAgZm9yICh0cyA9IDA7IHRzIDwgdGltZVNsb3RzOyB0cysrKSB7CisgICAgICAgICAgICBwV2luZG93QW5hX19GREtbd11bdGltZVNsb3RzICsgdHNdID0KKyAgICAgICAgICAgICAgICBGWF9EQkwyRlhfV0lOKGZNdWx0KHBXaW5kb3dBbmFfX0ZES1t3XVt0aW1lU2xvdHMgKyB0c10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVJpZ2h0V2luZG93R2Fpbl9fRkRLW3ddKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IC8qIGlmIChhcHBseVJpZ2h0V2luZG93R2Fpblt3XSA+IDAuMGYpICovCisgICAgICBlbHNlIHsKKyAgICAgICAgLyogQWxsIFplcm8gKi8KKyAgICAgICAgRkRLbWVtc2V0X2ZsZXgoJnBXaW5kb3dBbmFfX0ZES1t3XVt0aW1lU2xvdHNdLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9EQkwyRlhfV0lOKChGSVhQX0RCTCkwKSwgdGltZVNsb3RzKTsKKyAgICAgIH0KKyAgICB9IC8qIGxvb3Agb3ZlciB3aW5kb3dzICovCisKKyAgICBpZiAoaEZyYW1lV2luZG93LT5iRnJhbWVLZWVwID09IDEpIHsKKyAgICAgIEZES21lbWNweV9mbGV4KCZwV2luZG93QW5hX19GREtbMF1bMiAqIHRpbWVTbG90c10sIDEsCisgICAgICAgICAgICAgICAgICAgICAmcFdpbmRvd0FuYV9fRkRLWzBdW3RpbWVTbG90c10sIDEsIHRpbWVTbG90cyk7CisgICAgICBGREttZW1jcHlfZmxleCgmcFdpbmRvd0FuYV9fRkRLWzBdW3RpbWVTbG90c10sIDEsIHBXaW5kb3dBbmFfX0ZES1swXSwgMSwKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVTbG90cyk7CisKKyAgICAgIGlmIChhdm9pZF9rZWVwICE9IDApIHsKKyAgICAgICAgRkRLbWVtc2V0X2ZsZXgocFdpbmRvd0FuYV9fRkRLWzBdLCBGWF9EQkwyRlhfV0lOKChGSVhQX0RCTCkwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGltZVNsb3RzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZES21lbXNldF9mbGV4KHBXaW5kb3dBbmFfX0ZES1swXSwgd2luTWF4VmFsLCB0aW1lU2xvdHMpOworICAgICAgfQorICAgIH0gLyogaWYgKGhGcmFtZVdpbmRvdy0+YkZyYW1lS2VlcD09MSkgKi8KKworICAgIC8qIEZlZWQgSW5mbyB0byBCaXRzdHJlYW0gRm9ybWF0dGVyICovCisgICAgcEZyYW1pbmdJbmZvLT5udW1QYXJhbVNldHMgPSBwRnJhbWVXaW5MaXN0LT5uOworICAgIHBGcmFtaW5nSW5mby0+YnNGcmFtaW5nVHlwZSA9IDE7IC8qIHZhcmlhYmxlIGZyYW1pbmcgKi8KKyAgICBmb3IgKHBzID0gMDsgcHMgPCBwRnJhbWluZ0luZm8tPm51bVBhcmFtU2V0czsgcHMrKykgeworICAgICAgcEZyYW1pbmdJbmZvLT5ic1BhcmFtU2xvdHNbcHNdID0gcEZyYW1lV2luTGlzdC0+ZGF0W3BzXS5zbG90OworICAgIH0KKworICAgIC8qIGlmIHRoZXJlIGlzIGp1c3Qgb25lIHBhcmFtIHNldCBhdCBsYXN0IHNsb3QsCisgICAgICAgdXNlIGZpeGVkIGZyYW1pbmcgdG8gc2F2ZSBzb21lIGJpdHMgKi8KKyAgICBpZiAoKHBGcmFtaW5nSW5mby0+bnVtUGFyYW1TZXRzID09IDEpICYmCisgICAgICAgIChwRnJhbWluZ0luZm8tPmJzUGFyYW1TbG90c1swXSA9PSB0aW1lU2xvdHMgLSAxKSkgeworICAgICAgcEZyYW1pbmdJbmZvLT5ic0ZyYW1pbmdUeXBlID0gMDsKKyAgICB9CisKKyAgfSAvKiB2YWxpZCBoYW5kbGUgKi8KKworYmFpbDoKKworICByZXR1cm4gZXJyb3I7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19hbmFseXNpc1dpbmRvd2luZygKKyAgICBjb25zdCBJTlQgblRpbWVTbG90cywgY29uc3QgSU5UIHN0YXJ0VGltZVNsb3QsCisgICAgRklYUF9XSU4gKnBGcmFtZVdpbmRvd0FuYV9fRkRLLCBjb25zdCBGSVhQX0RQSyAqY29uc3QgKmNvbnN0IHBwRGF0YUluX19GREssCisgICAgRklYUF9EUEsgKmNvbnN0ICpjb25zdCBwcERhdGFPdXRfX0ZESywgY29uc3QgSU5UIG5IeWJyaWRCYW5kcywKKyAgICBjb25zdCBJTlQgZGltKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKChwRnJhbWVXaW5kb3dBbmFfX0ZESyA9PSBOVUxMKSB8fCAocHBEYXRhSW5fX0ZESyA9PSBOVUxMKSB8fAorICAgICAgKHBwRGF0YU91dF9fRkRLID09IE5VTEwpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaW50IGksIHRzOworICAgIEZJWFBfV0lOIG1heFZhbCA9IEZYX0RCTDJGWF9XSU4oKEZJWFBfREJMKU1BWFZBTF9EQkwpOworCisgICAgaWYgKGRpbSA9PSBGV19DSEFOR0VfRElNKSB7CisgICAgICBmb3IgKHRzID0gc3RhcnRUaW1lU2xvdDsgdHMgPCBuVGltZVNsb3RzOyB0cysrKSB7CisgICAgICAgIEZJWFBfV0lOIHdpbiA9IHBGcmFtZVdpbmRvd0FuYV9fRkRLW3RzXTsKKyAgICAgICAgaWYgKHdpbiA9PSBtYXhWYWwpIHsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbkh5YnJpZEJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgIHBwRGF0YU91dF9fRkRLW2ldW3RzXS52LnJlID0gcHBEYXRhSW5fX0ZES1t0c11baV0udi5yZTsKKyAgICAgICAgICAgIHBwRGF0YU91dF9fRkRLW2ldW3RzXS52LmltID0gcHBEYXRhSW5fX0ZES1t0c11baV0udi5pbTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5IeWJyaWRCYW5kczsgaSsrKSB7CisgICAgICAgICAgICBwcERhdGFPdXRfX0ZES1tpXVt0c10udi5yZSA9IGZNdWx0KHdpbiwgcHBEYXRhSW5fX0ZES1t0c11baV0udi5yZSk7CisgICAgICAgICAgICBwcERhdGFPdXRfX0ZES1tpXVt0c10udi5pbSA9IGZNdWx0KHdpbiwgcHBEYXRhSW5fX0ZES1t0c11baV0udi5pbSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IC8qIHRzICovCisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAodHMgPSBzdGFydFRpbWVTbG90OyB0cyA8IG5UaW1lU2xvdHM7IHRzKyspIHsKKyAgICAgICAgRklYUF9XSU4gd2luID0gcEZyYW1lV2luZG93QW5hX19GREtbdHNdOworICAgICAgICBpZiAod2luID09IG1heFZhbCkgeworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuSHlicmlkQmFuZHM7IGkrKykgeworICAgICAgICAgICAgcHBEYXRhT3V0X19GREtbdHNdW2ldLnYucmUgPSBwcERhdGFJbl9fRkRLW3RzXVtpXS52LnJlOworICAgICAgICAgICAgcHBEYXRhT3V0X19GREtbdHNdW2ldLnYuaW0gPSBwcERhdGFJbl9fRkRLW3RzXVtpXS52LmltOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbkh5YnJpZEJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgIHBwRGF0YU91dF9fRkRLW3RzXVtpXS52LnJlID0gZk11bHQod2luLCBwcERhdGFJbl9fRkRLW3RzXVtpXS52LnJlKTsKKyAgICAgICAgICAgIHBwRGF0YU91dF9fRkRLW3RzXVtpXS52LmltID0gZk11bHQod2luLCBwcERhdGFJbl9fRkRLW3RzXVtpXS52LmltKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gLyogdHMgKi8KKyAgICB9CisgIH0KKworICByZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY19mcmFtZXdpbmRvd2luZy5oIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfZnJhbWV3aW5kb3dpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjIyZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfZnJhbWV3aW5kb3dpbmcuaApAQCAtMCwwICsxLDE4MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWF4IE5ldWVuZG9yZgorCisgICBEZXNjcmlwdGlvbjogRW5jb2RlciBMaWJyYXJ5IEludGVyZmFjZQorICAgICAgICAgICAgICAgIEdldCB3aW5kb3dzIGZvciBmcmFtaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0FDRU5DX0ZSQU1FV0lORE9XSU5HX0gKKyNkZWZpbmUgU0FDRU5DX0ZSQU1FV0lORE9XSU5HX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAvKioKKyAgIFxmaWxlCisgICBEZXNjcmlwdGlvbiBvZiBmaWxlIGNvbnRlbnRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisjaW5jbHVkZSAic2FjZW5jX2xpYi5oIgorI2luY2x1ZGUgInNhY2VuY19iaXRzdHJlYW0uaCIKKworLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBGSVhQX1dJTiBGSVhQX0RCTAorI2RlZmluZSBGWF9EQkwyRlhfV0lOKHgpICh4KQorI2RlZmluZSBEQUxEQVRBVFlQRV9XSU4gREFMREFUQVRZUEVfREZSQUNUCisKK3R5cGVkZWYgZW51bSB7CisgIEZXX0lOVFAgPSAwLAorICBGV19IT0xEID0gMQorCit9IEZXX1NMT1RUWVBFOworCit0eXBlZGVmIGVudW0geworICBGV19MRUFWRV9ESU0gPSAwLAorICBGV19DSEFOR0VfRElNID0gMQorCit9IEZXX0RJTUVOU0lPTjsKKworLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgVF9GUkFNRVdJTkRPVyAqSEFORExFX0ZSQU1FV0lORE9XOworCit0eXBlZGVmIHN0cnVjdCBUX0ZSQU1FV0lORE9XX0NPTkZJRyB7CisgIElOVCBuVGltZVNsb3RzTWF4OworICBJTlQgYkZyYW1lS2VlcDsKKworfSBGUkFNRVdJTkRPV19DT05GSUc7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UIHNsb3Q7CisgIEZXX1NMT1RUWVBFIGhvbGQ7CisKK30gRlJBTUVXSU5fREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBGUkFNRVdJTl9EQVRBIGRhdFtNQVhfTlVNX1BBUkFNU107CisgIElOVCBuOworCit9IEZSQU1FV0lOX0xJU1Q7CisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2ZyYW1lV2luZG93X0NyZWF0ZSgKKyAgICBIQU5ETEVfRlJBTUVXSU5ET1cgKnBoRnJhbWVXaW5kb3cpOworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZnJhbWVXaW5kb3dfSW5pdCgKKyAgICBIQU5ETEVfRlJBTUVXSU5ET1cgaEZyYW1lV2luZG93LAorICAgIGNvbnN0IEZSQU1FV0lORE9XX0NPTkZJRyAqY29uc3QgcEZyYW1lV2luZG93Q29uZmlnKTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2ZyYW1lV2luZG93X0Rlc3Ryb3koCisgICAgSEFORExFX0ZSQU1FV0lORE9XICpwaEZyYW1lV2luZG93KTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2ZyYW1lV2luZG93X0dldFdpbmRvdygKKyAgICBIQU5ETEVfRlJBTUVXSU5ET1cgaEZyYW1lV2luZG93LCBJTlQgdHJfcG9zW01BWF9OVU1fUEFSQU1TXSwKKyAgICBjb25zdCBJTlQgdGltZVNsb3RzLCBGUkFNSU5HSU5GTyAqY29uc3QgcEZyYW1pbmdJbmZvLAorICAgIEZJWFBfV0lOICpwV2luZG93QW5hX19GREtbTUFYX05VTV9QQVJBTVNdLAorICAgIEZSQU1FV0lOX0xJU1QgKmNvbnN0IHBGcmFtZVdpbkxpc3QsIGNvbnN0IElOVCBhdm9pZF9rZWVwKTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2FuYWx5c2lzV2luZG93aW5nKAorICAgIGNvbnN0IElOVCBuVGltZVNsb3RzLCBjb25zdCBJTlQgc3RhcnRUaW1lU2xvdCwKKyAgICBGSVhQX1dJTiAqcEZyYW1lV2luZG93QW5hX19GREssIGNvbnN0IEZJWFBfRFBLICpjb25zdCAqY29uc3QgcHBEYXRhSW5fX0ZESywKKyAgICBGSVhQX0RQSyAqY29uc3QgKmNvbnN0IHBwRGF0YU91dF9fRkRLLCBjb25zdCBJTlQgbkh5YnJpZEJhbmRzLAorICAgIGNvbnN0IElOVCBkaW0pOworCisjZW5kaWYgLyogU0FDRU5DX0ZSQU1FV0lORE9XSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2h1ZmZfdGFiLmNwcCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2h1ZmZfdGFiLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjI4ZWNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfaHVmZl90YWIuY3BwCkBAIC0wLDAgKzEsOTk3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXJrdXMgTG9od2Fzc2VyCisKKyAgIERlc2NyaXB0aW9uOiBTQUMtRW5jb2RlciBjb25zdGFudCBodWZmbWFuIHRhYmxlcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAic2FjZW5jX2h1ZmZfdGFiLmgiCisKKy8qIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBIVUZGX0NMRF9UQUJMRSBmZGtfc2FjZW5jX2h1ZmZDTERUYWIgPSB7CisgICAgey8qIGgxRFsyXVszMV0gKi8KKyAgICAge0hVRkZfUEFDSygweDAwMDAwMDAwLCAxKSwgIEhVRkZfUEFDSygweDAwMDAwMDAyLCAyKSwKKyAgICAgIEhVRkZfUEFDSygweDAwMDAwMDA2LCAzKSwgIEhVRkZfUEFDSygweDAwMDAwMDBlLCA0KSwKKyAgICAgIEhVRkZfUEFDSygweDAwMDAwMDFlLCA1KSwgIEhVRkZfUEFDSygweDAwMDAwMDNlLCA2KSwKKyAgICAgIEhVRkZfUEFDSygweDAwMDAwMDdlLCA3KSwgIEhVRkZfUEFDSygweDAwMDAwMGZlLCA4KSwKKyAgICAgIEhVRkZfUEFDSygweDAwMDAwMWZlLCA5KSwgIEhVRkZfUEFDSygweDAwMDAwM2ZlLCAxMCksCisgICAgICBIVUZGX1BBQ0soMHgwMDAwMDdmZSwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMGZmZSwgMTIpLAorICAgICAgSFVGRl9QQUNLKDB4MDAwMDFmZmUsIDEzKSwgSFVGRl9QQUNLKDB4MDAwMDdmZmUsIDE1KSwKKyAgICAgIEhVRkZfUEFDSygweDAwMDA3ZmZjLCAxNSksIEhVRkZfUEFDSygweDAwMDBmZmZlLCAxNiksCisgICAgICBIVUZGX1BBQ0soMHgwMDAwZmZmYSwgMTYpLCBIVUZGX1BBQ0soMHgwMDAxZmZmZSwgMTcpLAorICAgICAgSFVGRl9QQUNLKDB4MDAwMWZmZjYsIDE3KSwgSFVGRl9QQUNLKDB4MDAwM2ZmZmUsIDE4KSwKKyAgICAgIEhVRkZfUEFDSygweDAwMDNmZmZmLCAxOCksIEhVRkZfUEFDSygweDAwMDdmZmRlLCAxOSksCisgICAgICBIVUZGX1BBQ0soMHgwMDAzZmZlZSwgMTgpLCBIVUZGX1BBQ0soMHgwMDBmZmZiZSwgMjApLAorICAgICAgSFVGRl9QQUNLKDB4MDAxZmZmN2UsIDIxKSwgSFVGRl9QQUNLKDB4MDBmZmZiZmMsIDI0KSwKKyAgICAgIEhVRkZfUEFDSygweDAwZmZmYmZkLCAyNCksIEhVRkZfUEFDSygweDAwZmZmYmZlLCAyNCksCisgICAgICBIVUZGX1BBQ0soMHgwMGZmZmJmZiwgMjQpLCBIVUZGX1BBQ0soMHgwMDdmZmRmYywgMjMpLAorICAgICAgSFVGRl9QQUNLKDB4MDA3ZmZkZmQsIDIzKX0sCisgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMSksICBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMiksCisgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwNiwgMyksICBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCksCisgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxZSwgNSksICBIVUZGX1BBQ0soMHgwMDAwMDAzZSwgNiksCisgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA3ZSwgNyksICBIVUZGX1BBQ0soMHgwMDAwMDFmZSwgOSksCisgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFmYywgOSksICBIVUZGX1BBQ0soMHgwMDAwMDNmZSwgMTApLAorICAgICAgSFVGRl9QQUNLKDB4MDAwMDAzZmEsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDA3ZmUsIDExKSwKKyAgICAgIEhVRkZfUEFDSygweDAwMDAwN2Y2LCAxMSksIEhVRkZfUEFDSygweDAwMDAwZmZlLCAxMiksCisgICAgICBIVUZGX1BBQ0soMHgwMDAwMGZlZSwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMWZmZSwgMTMpLAorICAgICAgSFVGRl9QQUNLKDB4MDAwMDFmZGUsIDEzKSwgSFVGRl9QQUNLKDB4MDAwMDNmZmUsIDE0KSwKKyAgICAgIEhVRkZfUEFDSygweDAwMDAzZmJlLCAxNCksIEhVRkZfUEFDSygweDAwMDAzZmJmLCAxNCksCisgICAgICBIVUZGX1BBQ0soMHgwMDAwN2ZmZSwgMTUpLCBIVUZGX1BBQ0soMHgwMDAwZmZmZSwgMTYpLAorICAgICAgSFVGRl9QQUNLKDB4MDAwMWZmZmUsIDE3KSwgSFVGRl9QQUNLKDB4MDAwN2ZmZmUsIDE5KSwKKyAgICAgIEhVRkZfUEFDSygweDAwMDdmZmZjLCAxOSksIEhVRkZfUEFDSygweDAwMGZmZmZhLCAyMCksCisgICAgICBIVUZGX1BBQ0soMHgwMDFmZmZmYywgMjEpLCBIVUZGX1BBQ0soMHgwMDFmZmZmZCwgMjEpLAorICAgICAgSFVGRl9QQUNLKDB4MDAxZmZmZmUsIDIxKSwgSFVGRl9QQUNLKDB4MDAxZmZmZmYsIDIxKSwKKyAgICAgIEhVRkZfUEFDSygweDAwMGZmZmZiLCAyMCl9fSwKKyAgICB7ICAvKiBIVUZGX0NMRF9UQUJfMkQgKi8KKyAgICAgeyAvKiBIVUZGX0NMRF9UQUJfMkRbMF1bXSAqLworICAgICAgey8qIEhVRkZfQ0xEX1RBQl8yRFswXVswXSAqLworICAgICAgIHsKKyAgICAgICAgICAgLyogTEFWM18yRCAqLworICAgICAgICAgICB7e0hVRkZfUEFDSygweDAwMDAwMDAyLCAyKSwgSFVGRl9QQUNLKDB4MDAwMDAwMDIsIDMpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDA0LCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwM2UsIDgpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwNiwgNCksIEhVRkZfUEFDSygweDAwMDAwMDA3LCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNiksIEhVRkZfUEFDSygweDAwMDAwMGZlLCAxMCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDdlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwMWUsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDBjLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDUsIDUpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDBmZiwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDAwZCwgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMywgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVY1XzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDIsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMywgMyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMTAsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDA3YywgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZDYsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDNlZSwgMTApfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwYSwgNCksIEhVRkZfUEFDSygweDAwMDAwMDBjLCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxNiwgNSksIEhVRkZfUEFDSygweDAwMDAwMDM0LCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBmZSwgOCksIEhVRkZfUEFDSygweDAwMDAxZjdlLCAxMyl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDdlLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwMzYsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDI2LCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwNDYsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMTFlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAxZjYsIDkpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDExZiwgOSksIEhVRkZfUEFDSygweDAwMDAwMGQ3LCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA4ZSwgOCksIEhVRkZfUEFDSygweDAwMDAwMGZmLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA2YSwgNyksIEhVRkZfUEFDSygweDAwMDAwMDRlLCA3KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDBmYmUsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDA3ZGUsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA0ZiwgNyksIEhVRkZfUEFDSygweDAwMDAwMDM3LCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxNywgNSksIEhVRkZfUEFDSygweDAwMDAwMDFlLCA1KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDFmN2YsIDEzKSwgSFVGRl9QQUNLKDB4MDAwMDAwZmEsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDIyLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMTIsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDBlLCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDIpfX0sCisgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDAwLCAwKSAvKiBlc2NhcGUgKi8KKyAgICAgICB9LAorICAgICAgIHsKKyAgICAgICAgICAgLyogTEFWN18yRCAqLworICAgICAgICAgICB7e0hVRkZfUEFDSygweDAwMDAwMDBlLCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGEsIDQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDBhLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwN2MsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGJlLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAxN2EsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGVlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDA3YjYsIDExKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDYsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAwYywgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMTYsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAyNiwgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwM2UsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDAyZSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZWMsIDkpLCBIVUZGX1BBQ0soMHgwMDAwNDdjZSwgMTUpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAxNiwgNiksIEhVRkZfUEFDSygweDAwMDAwMDNjLCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAyMiwgNiksIEhVRkZfUEFDSygweDAwMDAwMDRlLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAzZiwgNyksIEhVRkZfUEFDSygweDAwMDAwMDVlLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDhmYSwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDhmYiwgMTIpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDA1ZiwgOCksIEhVRkZfUEFDSygweDAwMDAwMGZhLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBiZiwgOCksIEhVRkZfUEFDSygweDAwMDAwMDNhLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFmNiwgOSksIEhVRkZfUEFDSygweDAwMDAwMWRlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAzZGEsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDA3YjcsIDExKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAxZGYsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDAzZWUsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDE3YiwgOSksIEhVRkZfUEFDSygweDAwMDAwM2VmLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZWUsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDA4ZSwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZWYsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDFmZSwgOSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwOGY4LCAxMiksIEhVRkZfUEFDSygweDAwMDAwNDdlLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA0N2YsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDAwNzYsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDNjLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwNDYsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDdhLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwN2UsIDcpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMjNlNiwgMTQpLCBIVUZGX1BBQ0soMHgwMDAwMTFmMiwgMTMpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWZmLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwM2QsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDRmLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwMmUsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDEyLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDQsIDQpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwNDdjZiwgMTUpLCBIVUZGX1BBQ0soMHgwMDAwMDExZSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwYmMsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDBmZSwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMWMsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAxMCwgNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMGQsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVY5XzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDYsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAwNywgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDYsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDA3ZSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMGEsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDAxZSwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwOGEsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDA0ZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMjc2LCAxMCksIEhVRkZfUEFDSygweDAwMDAwMmUyLCAxMSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDAwLCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGEsIDQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDE2LCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMjYsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDc2LCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwZjIsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDEyLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwNWUsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDhiLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDJlNzYsIDE1KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMTIsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAwNywgNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMzgsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDA3YywgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDgsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDA0NiwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZjYsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDFjYSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDE3M2EsIDE0KSwgSFVGRl9QQUNLKDB4MDAwMDE3MzgsIDE0KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwOWUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDA0YSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMjYsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDAwYywgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNGUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDBmNywgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxM2EsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDA5ZSwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwOWZlLCAxMiksIEhVRkZfUEFDSygweDAwMDAwMTNlLCAxMil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDI2LCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwMWEsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWU2LCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAxZTIsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGVlLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAxY2UsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMjc3LCAxMCksIEhVRkZfUEFDSygweDAwMDAwM2NlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAyZTYsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDA0ZmMsIDExKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAyZTMsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDAxNzAsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDE3MiwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDBiYSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwM2UsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDFlMywgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMWIsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAzZiwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwOWUsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDA5ZiwgOSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwYjllLCAxMyksIEhVRkZfUEFDSygweDAwMDAwOWZmLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA0ZmQsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDA0ZmUsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFjZiwgOSksIEhVRkZfUEFDSygweDAwMDAwMGVmLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA0NCwgOCksIEhVRkZfUEFDSygweDAwMDAwMDVmLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBlNCwgOCksIEhVRkZfUEFDSygweDAwMDAwMGYwLCA4KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDJlNzIsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMDAxM2YsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMGI5ZiwgMTMpLCBIVUZGX1BBQ0soMHgwMDAwMDEzZSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZmUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDA0NywgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDA3ZCwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMTAsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAyNCwgNil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAyZTc3LCAxNSksIEhVRkZfUEFDSygweDAwMDA1Y2U2LCAxNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwYmIsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDBlNiwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMTYsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDBmZiwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwN2EsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDAzYSwgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMTcsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgNCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDA1Y2U3LCAxNiksIEhVRkZfUEFDSygweDAwMDAwM2NmLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMTcsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDFjYiwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwOWMsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDA0YiwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMTYsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAwYSwgNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDgsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAwNiwgMyl9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH19LAorICAgICAgey8qIEhVRkZfQ0xEX1RBQl8yRFswXVsxXSAqLworICAgICAgIHsKKyAgICAgICAgICAgLyogTEFWM18yRCAqLworICAgICAgICAgICB7e0hVRkZfUEFDSygweDAwMDAwMDAwLCAxKSwgSFVGRl9QQUNLKDB4MDAwMDAwM2UsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwNzZlLCAxMSksIEhVRkZfUEFDSygweDAwMDAwZWRlLCAxMil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDA2LCAzKSwgSFVGRl9QQUNLKDB4MDAwMDAwM2YsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwM2I2LCAxMCksIEhVRkZfUEFDSygweDAwMDAwMDNhLCA2KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMWMsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDBlZSwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZGEsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDAxZSwgNSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMGVmLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDBlZGYsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBlYywgOCksIEhVRkZfUEFDSygweDAwMDAwMDAyLCAyKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMCkgLyogZXNjYXBlICovCisgICAgICAgfSwKKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjVfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwNiwgMyksIEhVRkZfUEFDSygweDAwMDAwMDFjLCA1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA3ZSwgOCksIEhVRkZfUEFDSygweDAwMDAwZWZjLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMGVmZmUsIDE2KSwgSFVGRl9QQUNLKDB4MDAwMWRmZmUsIDE3KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDQsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAwYSwgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwM2UsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMGVmZSwgMTIpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDA3N2ZlLCAxNSksIEhVRkZfUEFDSygweDAwMDAwMDc2LCA3KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDYsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAxNiwgNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwYmUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMGVmZCwgMTIpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGVlLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDUpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAzZSwgNiksIEhVRkZfUEFDSygweDAwMDAwMDJlLCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFkZSwgOSksIEhVRkZfUEFDSygweDAwMDAwM2JlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwN2UsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDAxZSwgNSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDdmLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwNWUsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAzYmZlLCAxNCksIEhVRkZfUEFDSygweDAwMDAwMGZlLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxZSwgNiksIEhVRkZfUEFDSygweDAwMDAwMDAyLCAzKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwYmYsIDgpLCBIVUZGX1BBQ0soMHgwMDAxZGZmZiwgMTcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAxZGZlLCAxMyksIEhVRkZfUEFDSygweDAwMDAwMGZmLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAzYSwgNiksIEhVRkZfUEFDSygweDAwMDAwMDAwLCAyKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMCkgLyogZXNjYXBlICovCisgICAgICAgfSwKKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjdfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMyksIEhVRkZfUEFDSygweDAwMDAwMDFjLCA1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBiYywgOCksIEhVRkZfUEFDSygweDAwMDAwNWZjLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDVmZmUsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMmZmZGUsIDE4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDBiZmY3ZSwgMjApLCBIVUZGX1BBQ0soMHgwMDE3ZmVmZiwgMjEpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwNCwgMyksIEhVRkZfUEFDSygweDAwMDAwMDBhLCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNyksIEhVRkZfUEFDSygweDAwMDAwMmZhLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZmUsIDEzKSwgSFVGRl9QQUNLKDB4MDAwMGJmZjIsIDE2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDA1ZmZiZSwgMTkpLCBIVUZGX1BBQ0soMHgwMDAwMDBlZSwgOCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDAyLCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMTYsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGY2LCA4KSwgSFVGRl9QQUNLKDB4MDAwMDA1ZmUsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFmZiwgMTMpLCBIVUZGX1BBQ0soMHgwMDAwYmZmNiwgMTYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWRlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwN2UsIDcpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwMCwgNSksIEhVRkZfUEFDSygweDAwMDAwMDNjLCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgOCksIEhVRkZfUEFDSygweDAwMDAwMDNlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDJmZmUsIDE0KSwgSFVGRl9QQUNLKDB4MDAwMDAyZmIsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBmNywgOCksIEhVRkZfUEFDSygweDAwMDAwMDJlLCA2KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDYsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDA3YSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMGEsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDA3ZSwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGZlLCAxMiksIEhVRkZfUEFDSygweDAwMDAwMDE2LCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwNiwgNyksIEhVRkZfUEFDSygweDAwMDAwMDAyLCA1KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMGYsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDA3NiwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMTcsIDkpLCBIVUZGX1BBQ0soMHgwMDAwNWZmOCwgMTUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwYmZlLCAxMiksIEhVRkZfUEFDSygweDAwMDAwMDFlLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA3ZiwgNyksIEhVRkZfUEFDSygweDAwMDAwMDAzLCA0KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDQsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDBiZCwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMGJmZjMsIDE2KSwgSFVGRl9QQUNLKDB4MDAwMDVmZmYsIDE1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMGJmYSwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDE3YywgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwM2EsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMywgMyl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMTdlLCA5KSwgSFVGRl9QQUNLKDB4MDAxN2ZlZmUsIDIxKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAxN2ZlZSwgMTcpLCBIVUZGX1BBQ0soMHgwMDAwNWZmYSwgMTUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwYmZiLCAxMiksIEhVRkZfUEFDSygweDAwMDAwMWRmLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAzZSwgNiksIEhVRkZfUEFDSygweDAwMDAwMDA2LCAzKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDE3ZmVmZiwgMjEpIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVY5XzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMGUsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAxNCwgNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwOGUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDRmZSwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAyM2ZlLCAxNCksIEhVRkZfUEFDSygweDAwMDA4ZmZlLCAxNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwNWZmYmMsIDE5KSwgSFVGRl9QQUNLKDB4MDAxN2ZlZjcsIDIxKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDE3ZmVmNywgMjEpLCBIVUZGX1BBQ0soMHgwMDE3ZmVmNywgMjEpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMyksIEhVRkZfUEFDSygweDAwMDAwMDAyLCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA0NCwgNyksIEhVRkZfUEFDSygweDAwMDAwMjdlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDE3ZmMsIDEzKSwgSFVGRl9QQUNLKDB4MDAwMGJmZjYsIDE2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDA1ZmZiZSwgMTkpLCBIVUZGX1BBQ0soMHgwMDAxMWZmOCwgMTcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMGJmZjdhLCAyMCksIEhVRkZfUEFDSygweDAwMDAwMGJjLCA4KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDYsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAxNiwgNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMWEsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDBmZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAxMWY2LCAxMyksIEhVRkZfUEFDSygweDAwMDBiZmZlLCAxNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMTFmZjksIDE3KSwgSFVGRl9QQUNLKDB4MDAxN2ZlZjYsIDIxKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDExZSwgOSksIEhVRkZfUEFDSygweDAwMDAwMDU2LCA3KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMTAsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAzZSwgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwOWUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDdmZSwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAxMWY3LCAxMyksIEhVRkZfUEFDSygweDAwMDA1ZmY4LCAxNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMTdmZWUsIDE3KSwgSFVGRl9QQUNLKDB4MDAwMDA3ZmYsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBhZSwgOCksIEhVRkZfUEFDSygweDAwMDAwMDFlLCA3KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMjYsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZWUsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDQ3ZSwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwYmZjLCAxMiksIEhVRkZfUEFDSygweDAwMDBiZmZmLCAxNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA4ZmEsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDAwNmUsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWVmLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwN2UsIDcpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDA3YSwgNyksIEhVRkZfUEFDSygweDAwMDAwMDRlLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA3ZSwgOSksIEhVRkZfUEFDSygweDAwMDAwMGRlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDExZmUsIDEzKSwgSFVGRl9QQUNLKDB4MDAwMDJmZmUsIDE0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDRmZiwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDBmZiwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGJkLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwMmUsIDYpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDBmZSwgOCksIEhVRkZfUEFDSygweDAwMDAwMGFmLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFlYywgOSksIEhVRkZfUEFDSygweDAwMDAwMWJlLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMTFmZmUsIDE3KSwgSFVGRl9QQUNLKDB4MDAwMDJmZmEsIDE0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDhmZSwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDNmZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDQ2LCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwMTIsIDUpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAzZSwgOCksIEhVRkZfUEFDSygweDAwMDAwMDQ1LCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDJmZSwgMTApLCBIVUZGX1BBQ0soMHgwMDBiZmY3ZSwgMjApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDA1ZmY5LCAxNSksIEhVRkZfUEFDSygweDAwMDA1ZmZhLCAxNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBiZmQsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDAxM2UsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDBjLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDcsIDQpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDBiZSwgOCksIEhVRkZfUEFDSygweDAwMDAwMDM2LCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDBiZmY3ZiwgMjApLCBIVUZGX1BBQ0soMHgwMDAyM2ZmZSwgMTgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDExZmZhLCAxNyksIEhVRkZfUEFDSygweDAwMDA1ZmZlLCAxNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxYmYsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDAxZWQsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDJhLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDMpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDE3ZSwgOSksIEhVRkZfUEFDSygweDAwMTdmZWY3LCAyMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwNDdmZmUsIDE5KSwgSFVGRl9QQUNLKDB4MDAwNDdmZmYsIDE5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAxMWZmYiwgMTcpLCBIVUZGX1BBQ0soMHgwMDAwMmZmYiwgMTQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwNDdjLCAxMSksIEhVRkZfUEFDSygweDAwMDAwMWZlLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAzYywgNiksIEhVRkZfUEFDSygweDAwMDAwMDA2LCAzKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDE3ZmVmNywgMjEpIC8qIGVzY2FwZSAqLworICAgICAgIH19fSwKKyAgICAgeyAvKiBIVUZGX0NMRF9UQUJfMkRbMV1bXSAqLworICAgICAgey8qIEhVRkZfQ0xEX1RBQl8yRFsxXVswXSAqLworICAgICAgIHsKKyAgICAgICAgICAgLyogTEFWM18yRCAqLworICAgICAgICAgICB7e0hVRkZfUEFDSygweDAwMDAwMDAwLCAxKSwgSFVGRl9QQUNLKDB4MDAwMDAwMWUsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwM2JlLCAxMCksIEhVRkZfUEFDSygweDAwMDAwZWZlLCAxMil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDA2LCAzKSwgSFVGRl9QQUNLKDB4MDAwMDAwMWMsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWRlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwZWEsIDgpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDA3NCwgNyksIEhVRkZfUEFDSygweDAwMDAwMGVlLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBlYiwgOCksIEhVRkZfUEFDSygweDAwMDAwMDFmLCA1KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDA3N2UsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDBlZmYsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA3NiwgNyksIEhVRkZfUEFDSygweDAwMDAwMDAyLCAyKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMCkgLyogZXNjYXBlICovCisgICAgICAgfSwKKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjVfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMiksIEhVRkZfUEFDSygweDAwMDAwMDA2LCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAyNCwgNyksIEhVRkZfUEFDSygweDAwMDAwMjVlLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDNjZmUsIDE0KSwgSFVGRl9QQUNLKDB4MDAwMDc5ZmUsIDE1KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDYsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAwNywgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNzgsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDNjZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAxZTdlLCAxMyksIEhVRkZfUEFDSygweDAwMDAwMGJlLCA5KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDgsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAzZSwgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMjYsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDEyZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGJmLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwMmUsIDcpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAyNywgNyksIEhVRkZfUEFDSygweDAwMDAwMDdhLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFlNCwgOSksIEhVRkZfUEFDSygweDAwMDAwMDk2LCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA3YiwgNyksIEhVRkZfUEFDSygweDAwMDAwMDNmLCA2KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAxZTYsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDFlNSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBmM2UsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDAwNWUsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDE2LCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDQpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDc5ZSwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwNzlmZiwgMTUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMjVmLCAxMSksIEhVRkZfUEFDSygweDAwMDAwMDRhLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwYSwgNSksIEhVRkZfUEFDSygweDAwMDAwMDAyLCAyKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMCkgLyogZXNjYXBlICovCisgICAgICAgfSwKKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjdfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMiksIEhVRkZfUEFDSygweDAwMDAwMDA2LCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBkZSwgOCksIEhVRkZfUEFDSygweDAwMDAwNjllLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDM0ZmUsIDE0KSwgSFVGRl9QQUNLKDB4MDAwMWE3ZmUsIDE3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDA2OWZmNiwgMTkpLCBIVUZGX1BBQ0soMHgwMDA2OWZmNywgMTkpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMyksIEhVRkZfUEFDSygweDAwMDAwMDBjLCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA2YSwgNyksIEhVRkZfUEFDSygweDAwMDAwMzRlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDFmZGUsIDEzKSwgSFVGRl9QQUNLKDB4MDAwMDY5ZmUsIDE1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAxYTdmYywgMTcpLCBIVUZGX1BBQ0soMHgwMDAwMDM3MiwgMTApfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAzZSwgNiksIEhVRkZfUEFDSygweDAwMDAwMDNjLCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBkZiwgOCksIEhVRkZfUEFDSygweDAwMDAwMWVlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBkZGUsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDY5ZmEsIDE1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDM3MywgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDA3YSwgOCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDNlLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwNjgsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWJhLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAzZjYsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMGQzZSwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDM0YywgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWZhLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwZDIsIDgpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDA3ZSwgOCksIEhVRkZfUEFDSygweDAwMDAwMDdmLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFmOCwgOSksIEhVRkZfUEFDSygweDAwMDAwNmVlLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAzZGUsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDAxYjgsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWZjLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwNmIsIDcpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDBmNiwgOSksIEhVRkZfUEFDSygweDAwMDAwMWZlLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDM0ZCwgMTApLCBIVUZGX1BBQ0soMHgwMDAwM2ZiZSwgMTQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwN2Y2LCAxMSksIEhVRkZfUEFDSygweDAwMDAwM2ZhLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwM2MsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDAzZCwgNil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwM2Y3LCAxMCksIEhVRkZfUEFDSygweDAwMDAwMzc2LCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMWE3ZmYsIDE3KSwgSFVGRl9QQUNLKDB4MDAwMDNmYmYsIDE0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMGRkZiwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDFmOSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMzYsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwM2RmLCAxMSksIEhVRkZfUEFDSygweDAwMDM0ZmZhLCAxOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDY5ZmIsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMDM0ZmMsIDE0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMGZlZSwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDFmZiwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVY5XzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDYsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAwNCwgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMTIsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDdmZSwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAxZjdlLCAxMyksIEhVRkZfUEFDSygweDAwMDBmYmZlLCAxNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMWY3ZmUsIDE3KSwgSFVGRl9QQUNLKDB4MDAwYjdkZmUsIDIxKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDBiN2RmZiwgMjEpLCBIVUZGX1BBQ0soMHgwMDBiN2RmZiwgMjEpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMyksIEhVRkZfUEFDSygweDAwMDAwMDA2LCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA3YywgNyksIEhVRkZfUEFDSygweDAwMDAwMDQ2LCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDdkMCwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMWY0ZSwgMTQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDBiN2ZlLCAxNyksIEhVRkZfUEFDSygweDAwMDA1YmVlLCAxNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMTZmYmUsIDE4KSwgSFVGRl9QQUNLKDB4MDAwMDAzZWUsIDEwKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDYsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAwYSwgNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMmUsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDNmZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwN2QyLCAxMiksIEhVRkZfUEFDSygweDAwMDAxZjRmLCAxNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDJkZmUsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMGI3ZGUsIDE3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFmZSwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDAyZSwgOCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDdhLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwN2UsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDdhLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAxZmEsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDdmZSwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMWY3YywgMTMpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAxNmZhLCAxNCksIEhVRkZfUEFDSygweDAwMDAwMDllLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMjAsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAyMSwgOCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMGZlLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwMTYsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGZlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAxNmUsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA5ZiwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMGI3YywgMTMpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwM2RlLCAxMSksIEhVRkZfUEFDSygweDAwMDAwMGI2LCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBiZSwgOSksIEhVRkZfUEFDSygweDAwMDAwMDdjLCA4KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwNWEsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDA3OCwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNDcsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDA0NCwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA3ZmYsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDA3ZDEsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFmNiwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDFmNywgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDJmLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwMmMsIDcpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDBmYywgOSksIEhVRkZfUEFDSygweDAwMDAwMWY2LCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBmNiwgOSksIEhVRkZfUEFDSygweDAwMDAwN2ZmLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDE2ZmUsIDE0KSwgSFVGRl9QQUNLKDB4MDAwMDAyZGUsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDNlYSwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDBiZiwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZmEsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAwYSwgNil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDRlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwMjYsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWVlLCAxMCksIEhVRkZfUEFDSygweDAwMDA1YmZlLCAxNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDNlZmUsIDE0KSwgSFVGRl9QQUNLKDB4MDAwMDBiN2UsIDEzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDNlYiwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDFmZSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwN2IsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDAwNywgNSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMWZiLCAxMCksIEhVRkZfUEFDSygweDAwMDAwMDQ1LCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAxNmZmZSwgMTgpLCBIVUZGX1BBQ0soMHgwMDAxZjdmZiwgMTcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAyZGY2LCAxNSksIEhVRkZfUEFDSygweDAwMDAxZjdkLCAxMyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAzZmUsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDAwNWUsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDNjLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDQpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDNkZiwgMTEpLCBIVUZGX1BBQ0soMHgwMDA1YmVmZSwgMjApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDJkZjdlLCAxOSksIEhVRkZfUEFDSygweDAwMDE2ZmZmLCAxOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDdkZmUsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMDBmYTYsIDEzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDdkZSwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDA3OSwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwYjdkZmYsIDIxKSAvKiBlc2NhcGUgKi8KKyAgICAgICB9fSwKKyAgICAgIHsvKiBIVUZGX0NMRF9UQUJfMkRbMV1bMV0gKi8KKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjNfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMSksIEhVRkZfUEFDSygweDAwMDAwMDBlLCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBmYSwgOCksIEhVRkZfUEFDSygweDAwMDAwN2RlLCAxMSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDBjLCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMWUsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGZlLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAxZjYsIDkpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDBmZiwgOCksIEhVRkZfUEFDSygweDAwMDAwMDdjLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA3ZSwgNyksIEhVRkZfUEFDSygweDAwMDAwMDFhLCA1KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDA3ZGYsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDAzZWUsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxYiwgNSksIEhVRkZfUEFDSygweDAwMDAwMDAyLCAyKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMCkgLyogZXNjYXBlICovCisgICAgICAgfSwKKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjVfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwNiwgMyksIEhVRkZfUEFDSygweDAwMDAwMDBlLCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA3YywgNyksIEhVRkZfUEFDSygweDAwMDAwM2ZlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBmYmUsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDNlZmUsIDE0KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDAsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMSwgMyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwM2MsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDA1ZSwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA3ZGUsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDA3YmUsIDExKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMWUsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAwYSwgNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMWYsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDA1ZiwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZWUsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDFmNiwgOSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMWZlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwZmUsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGY2LCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwZmEsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDdlLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwMTYsIDYpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDdiZiwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDNkZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwM2VlLCAxMCksIEhVRkZfUEFDSygweDAwMDAwMDdhLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNSksIEhVRkZfUEFDSygweDAwMDAwMDA2LCA0KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDNlZmYsIDE0KSwgSFVGRl9QQUNLKDB4MDAwMDFmN2UsIDEzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDNmZiwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDAyZSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDQsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVY3XzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDIsIDMpLCBIVUZGX1BBQ0soMHgwMDAwMDAwYSwgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMWEsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDFiZSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA2ZTYsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDA2N2EsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMGNmMiwgMTMpLCBIVUZGX1BBQ0soMHgwMDAwMzNkZSwgMTUpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwYywgNCksIEhVRkZfUEFDSygweDAwMDAwMDBlLCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNSksIEhVRkZfUEFDSygweDAwMDAwMGRlLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDM3MiwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDNkNiwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwNjc4LCAxMiksIEhVRkZfUEFDSygweDAwMDAwY2Y2LCAxMyl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDM2LCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMTIsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDNlLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwM2MsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWI4LCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAzZDQsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDMzZSwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDMzZiwgMTEpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDA3ZSwgOCksIEhVRkZfUEFDSygweDAwMDAwMDZhLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA0ZSwgNyksIEhVRkZfUEFDSygweDAwMDAwMDdlLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFiYSwgOSksIEhVRkZfUEFDSygweDAwMDAwMGNlLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBmNiwgOSksIEhVRkZfUEFDSygweDAwMDAwMWVlLCAxMCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMWVmLCAxMCksIEhVRkZfUEFDSygweDAwMDAwMTNlLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA3ZiwgOCksIEhVRkZfUEFDSygweDAwMDAwMDY2LCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBkNiwgOCksIEhVRkZfUEFDSygweDAwMDAwMDNlLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBkNywgOCksIEhVRkZfUEFDSygweDAwMDAwMDllLCA4KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDA3YWUsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDAxZTgsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFlOSwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDI3ZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDMyLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwMTgsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDI2LCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMzQsIDYpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMGNmMywgMTMpLCBIVUZGX1BBQ0soMHgwMDAwMDdhYSwgMTIpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwN2FiLCAxMiksIEhVRkZfUEFDSygweDAwMDAwMjdmLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxYmYsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDAxYiwgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMWUsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAwYiwgNCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAzM2RmLCAxNSksIEhVRkZfUEFDSygweDAwMDAxOWVlLCAxNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA3YWYsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDA2ZTcsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFiYiwgOSksIEhVRkZfUEFDSygweDAwMDAwMDdmLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwOCwgNCksIEhVRkZfUEFDSygweDAwMDAwMDAwLCAyKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMCkgLyogZXNjYXBlICovCisgICAgICAgfSwKKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjlfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCksIEhVRkZfUEFDSygweDAwMDAwMDA4LCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA3ZSwgNyksIEhVRkZfUEFDSygweDAwMDAwMWZlLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFiYSwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMGRiZSwgMTIpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwZDdlLCAxMyksIEhVRkZfUEFDSygweDAwMDAxYWY2LCAxNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDdmZWMsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMWZmYjYsIDE3KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMGEsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAwYywgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMGMsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAzNiwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZGUsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDVmZSwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwNmJlLCAxMiksIEhVRkZfUEFDSygweDAwMDAxYjdlLCAxMyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDdmZWUsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMDZkZmUsIDE1KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMWUsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMGEsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDA2YSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxYWUsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDZmZSwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMzc2LCAxMSksIEhVRkZfUEFDSygweDAwMDAwZGZlLCAxMyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBkZmYsIDEzKSwgSFVGRl9QQUNLKDB4MDAwMDBkN2YsIDEzKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwYjYsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDA1ZSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwN2MsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDA2ZSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNmEsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDE2YSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBmZmUsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDBkZmUsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMGZmYywgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMWJmZSwgMTMpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDM1ZSwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDFiNiwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNWUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDBiNCwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNmMsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDE3ZSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAzNmUsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDAzZWUsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDM3ZSwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDM3NywgMTEpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMGZmZiwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDFhZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWJlLCAxMCksIEhVRkZfUEFDSygweDAwMDAwMWY2LCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFiZSwgOSksIEhVRkZfUEFDSygweDAwMDAwMGRhLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBmZSwgOCksIEhVRkZfUEFDSygweDAwMDAwMTZiLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBkNiwgOSksIEhVRkZfUEFDSygweDAwMDAwMzdlLCAxMCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAxN2ZlLCAxMyksIEhVRkZfUEFDSygweDAwMDAwYmZlLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA3ZGUsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDA2ZGUsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFiOCwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDBkNiwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMmUsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDAzNCwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZGUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDBiZSwgOCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDA3ZmVmLCAxNSksIEhVRkZfUEFDSygweDAwMDAwNmJjLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDFiZmYsIDEzKSwgSFVGRl9QQUNLKDB4MDAwMDFmZmEsIDEzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFiOSwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDNmZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGZhLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwMmUsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDM0LCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMWYsIDYpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwNmRmZiwgMTUpLCBIVUZGX1BBQ0soMHgwMDAwMWFmNywgMTQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAzNmZlLCAxNCksIEhVRkZfUEFDSygweDAwMDAwNmZlLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBmYmUsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDAzNWYsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBiNywgOCksIEhVRkZfUEFDSygweDAwMDAwMDJjLCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxZSwgNSksIEhVRkZfUEFDSygweDAwMDAwMDA5LCA0KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMWZmYjcsIDE3KSwgSFVGRl9QQUNLKDB4MDAwMGZmZGEsIDE2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMGQ3YSwgMTMpLCBIVUZGX1BBQ0soMHgwMDAwMTdmZiwgMTMpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwZmJmLCAxMiksIEhVRkZfUEFDSygweDAwMDAwMmZlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNWYsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAxNiwgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDQsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH19fX19OworCitjb25zdCBIVUZGX0lDQ19UQUJMRSBmZGtfc2FjZW5jX2h1ZmZJQ0NUYWIgPSB7CisgICAgey8qIGgxRFsyXVs4XSAqLworICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDAsIDEpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMiksCisgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwNiwgMyksIEhVRkZfUEFDSygweDAwMDAwMDBlLCA0KSwKKyAgICAgIEhVRkZfUEFDSygweDAwMDAwMDFlLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwM2UsIDYpLAorICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwN2UsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDA3ZiwgNyl9LAorICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDAsIDEpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMiksCisgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwNiwgMyksIEhVRkZfUEFDSygweDAwMDAwMDBlLCA0KSwKKyAgICAgIEhVRkZfUEFDSygweDAwMDAwMDFlLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwM2UsIDYpLAorICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwN2UsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDA3ZiwgNyl9fSwKKyAgICB7ICAvKiBIVUZGX0lDQ19UQUJfMkQgKi8KKyAgICAgeyAvKiBIVUZGX0lDQ19UQUJfMkRbMF1bXSAqLworICAgICAgey8qIEhVRkZfSUNDX1RBQl8yRFswXVswXSAqLworICAgICAgIHsKKyAgICAgICAgICAgLyogTEFWMV8yRCAqLworICAgICAgICAgICB7e0hVRkZfUEFDSygweDAwMDAwMDAwLCAxKSwgSFVGRl9QQUNLKDB4MDAwMDAwMDYsIDMpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwNywgMyksIEhVRkZfUEFDSygweDAwMDAwMDAyLCAyKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMCkgLyogZXNjYXBlICovCisgICAgICAgfSwKKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjNfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMiksIEhVRkZfUEFDSygweDAwMDAwMDAwLCAyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwYSwgNSksIEhVRkZfUEFDSygweDAwMDAwMDdlLCA4KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMGUsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAwNCwgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMTYsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDNmZSwgMTEpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDFmZSwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDBmZSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwM2UsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDAxZSwgNil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwM2ZmLCAxMSksIEhVRkZfUEFDSygweDAwMDAwMDE3LCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwNiwgNCksIEhVRkZfUEFDSygweDAwMDAwMDAzLCAyKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMCkgLyogZXNjYXBlICovCisgICAgICAgfSwKKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjVfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMiksIEhVRkZfUEFDSygweDAwMDAwMDAyLCAzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwYywgNSksIEhVRkZfUEFDSygweDAwMDAwMDZhLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBkYywgOCksIEhVRkZfUEFDSygweDAwMDAwNmVlLCAxMSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDFlLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGMsIDQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDBkLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMWUsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWFlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMGRkZmYsIDE2KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwZGUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDA3ZSwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMWYsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDFiZSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDZlZmUsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMGRkZmUsIDE2KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDM3N2UsIDE0KSwgSFVGRl9QQUNLKDB4MDAwMDFiYmUsIDEzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMGRkZSwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDFiZiwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZDYsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDM3NiwgMTApfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwZGRmZiwgMTYpLCBIVUZGX1BBQ0soMHgwMDAwZGRmZiwgMTYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWJhLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwMzQsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDNlLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDUpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwZGRmZiwgMTYpLCBIVUZGX1BBQ0soMHgwMDAwMDFhZiwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwN2YsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDAzNiwgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMGRkZmYsIDE2KSAvKiBlc2NhcGUgKi8KKyAgICAgICB9LAorICAgICAgIHsKKyAgICAgICAgICAgLyogTEFWN18yRCAqLworICAgICAgICAgICB7e0hVRkZfUEFDSygweDAwMDAwMDAwLCAyKSwgSFVGRl9QQUNLKDB4MDAwMDAwMGMsIDQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDJlLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwNDQsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDg2LCA4KSwgSFVGRl9QQUNLKDB4MDAwMDA2OWUsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDQzZSwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDg3YSwgMTIpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAxZSwgNSksIEhVRkZfUEFDSygweDAwMDAwMDBlLCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAyYSwgNiksIEhVRkZfUEFDSygweDAwMDAwMDQ2LCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDE1ZSwgOSksIEhVRkZfUEFDSygweDAwMDAwMDQ3LCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDM0YSwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDg3YiwgMTIpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDBkNiwgOCksIEhVRkZfUEFDSygweDAwMDAwMDI2LCA2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAyZiwgNiksIEhVRkZfUEFDSygweDAwMDAwMGQ3LCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA2YSwgNyksIEhVRkZfUEFDSygweDAwMDAwMzRlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA4N2IsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDA4N2IsIDEyKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAyYmUsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDAxYTYsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWJlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwMTIsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWJmLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDA4N2IsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDg3YiwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDg3YiwgMTIpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDg3YiwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDg3YiwgMTIpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwODdiLCAxMiksIEhVRkZfUEFDSygweDAwMDAwODdiLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMzYsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDBkMCwgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA0M2MsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDA0M2YsIDExKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDA4N2IsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDA4N2IsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDg3YiwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDM0YiwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDI3LCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwMjAsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDQyLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwZDEsIDgpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDg3YiwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDg3YiwgMTIpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMmJmLCAxMCksIEhVRkZfUEFDSygweDAwMDAwMGRlLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBhZSwgOCksIEhVRkZfUEFDSygweDAwMDAwMDU2LCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxNiwgNSksIEhVRkZfUEFDSygweDAwMDAwMDE0LCA1KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDA4N2IsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDA2OWYsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFhNCwgOSksIEhVRkZfUEFDSygweDAwMDAwMTBlLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA0NSwgNyksIEhVRkZfUEFDSygweDAwMDAwMDZlLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxZiwgNSksIEhVRkZfUEFDSygweDAwMDAwMDAxLCAyKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDg3YiwgMTIpIC8qIGVzY2FwZSAqLworICAgICAgIH19LAorICAgICAgey8qIEhVRkZfSUNDX1RBQl8yRFswXVsxXSAqLworICAgICAgIHsKKyAgICAgICAgICAgLyogTEFWMV8yRCAqLworICAgICAgICAgICB7e0hVRkZfUEFDSygweDAwMDAwMDAwLCAxKSwgSFVGRl9QQUNLKDB4MDAwMDAwMDYsIDMpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwNywgMyksIEhVRkZfUEFDSygweDAwMDAwMDAyLCAyKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMCkgLyogZXNjYXBlICovCisgICAgICAgfSwKKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjNfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMiksIEhVRkZfUEFDSygweDAwMDAwMDA0LCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDE3ZSwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDJmZSwgMTEpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMiksIEhVRkZfUEFDSygweDAwMDAwMDBlLCA1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBiZSwgOSksIEhVRkZfUEFDSygweDAwMDAwMDE2LCA2KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMGYsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAxNCwgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNWUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAwNiwgNCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDJlLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAyZmYsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxNSwgNiksIEhVRkZfUEFDSygweDAwMDAwMDAzLCAyKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMCkgLyogZXNjYXBlICovCisgICAgICAgfSwKKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjVfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMiksIEhVRkZfUEFDSygweDAwMDAwMDFlLCA1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDNmYywgMTApLCBIVUZGX1BBQ0soMHgwMDAwZmZmYSwgMTYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMGZmZjllLCAyMCksIEhVRkZfUEFDSygweDAwMGZmZjlmLCAyMCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDA2LCAzKSwgSFVGRl9QQUNLKDB4MDAwMDAwMDQsIDQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGJlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDdmZmUsIDE1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDA3ZmZjZSwgMTkpLCBIVUZGX1BBQ0soMHgwMDAwMDBmZSwgOCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDA2LCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMWUsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwM2ZkLCAxMCksIEhVRkZfUEFDSygweDAwMDBmZmZiLCAxNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBmZmUsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDAwM2UsIDYpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwYSwgNSksIEhVRkZfUEFDSygweDAwMDAwMDdlLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMWZmZSwgMTMpLCBIVUZGX1BBQ0soMHgwMDAwN2ZmZiwgMTUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDVlLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDUpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAxZiwgNiksIEhVRkZfUEFDSygweDAwMDAwM2ZlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMWZmZjIsIDE3KSwgSFVGRl9QQUNLKDB4MDAwMDBmZmMsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAyZSwgNyksIEhVRkZfUEFDSygweDAwMDAwMDBlLCA0KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwYmYsIDkpLCBIVUZGX1BBQ0soMHgwMDAzZmZlNiwgMTgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDBmZmY4LCAxNiksIEhVRkZfUEFDSygweDAwMDAwZmZkLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMTYsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMil9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVY3XzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDIsIDIpLCBIVUZGX1BBQ0soMHgwMDAwMDAxZSwgNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBmZmUsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMGZmZmYsIDE2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwZmZmZSwgMTYpLCBIVUZGX1BBQ0soMHgwMDAwZmZmZiwgMTYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDBmZmZmLCAxNiksIEhVRkZfUEFDSygweDAwMDBmZmZmLCAxNil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDA2LCAzKSwgSFVGRl9QQUNLKDB4MDAwMDAwMDgsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwN2ZlLCAxMSksIEhVRkZfUEFDSygweDAwMDBmZmZmLCAxNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMGZmZmYsIDE2KSwgSFVGRl9QQUNLKDB4MDAwMGZmZmYsIDE2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwZmZmZiwgMTYpLCBIVUZGX1BBQ0soMHgwMDAwMDA1YSwgOCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDA2LCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwN2EsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMTY0LCAxMCksIEhVRkZfUEFDSygweDAwMDA3ZmZhLCAxNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMGZmZmYsIDE2KSwgSFVGRl9QQUNLKDB4MDAwMGZmZmYsIDE2KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMWZlZSwgMTMpLCBIVUZGX1BBQ0soMHgwMDAwMDAzYywgNil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDBlLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwZmUsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMmNlLCAxMSksIEhVRkZfUEFDSygweDAwMDAwMmNmLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDdmZmIsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMDFmZWMsIDEzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBiMCwgOSksIEhVRkZfUEFDSygweDAwMDAwMDJlLCA3KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwM2UsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDNmZSwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMTY1LCAxMCksIEhVRkZfUEFDSygweDAwMDA3ZmZjLCAxNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDFmZWYsIDEzKSwgSFVGRl9QQUNLKDB4MDAwMDA3ZmEsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDdmOCwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDAxZiwgNil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDJmLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwZjYsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAxZmVkLCAxMyksIEhVRkZfUEFDSygweDAwMDBmZmZmLCAxNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDdmZmQsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMDBmZjIsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBiMSwgOSksIEhVRkZfUEFDSygweDAwMDAwMDBhLCA1KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwMDksIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDE2NiwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDBmZmZmLCAxNiksIEhVRkZfUEFDSygweDAwMDBmZmZmLCAxNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDdmZmUsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMDNmZmMsIDE0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA1YiwgOCksIEhVRkZfUEFDSygweDAwMDAwMDBlLCA0KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwN2UsIDcpLCBIVUZGX1BBQ0soMHgwMDAwZmZmZiwgMTYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDBmZmZmLCAxNiksIEhVRkZfUEFDSygweDAwMDBmZmZmLCAxNiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMGZmZmYsIDE2KSwgSFVGRl9QQUNLKDB4MDAwMDBmZjMsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBmNywgOCksIEhVRkZfUEFDSygweDAwMDAwMDAwLCAyKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwZmZmZiwgMTYpIC8qIGVzY2FwZSAqLworICAgICAgIH19fSwKKyAgICAgeyAvKiBIVUZGX0lDQ19UQUJfMkRbMV1bXSAqLworICAgICAgey8qIEhVRkZfSUNDX1RBQl8yRFsxXVswXSAqLworICAgICAgIHsKKyAgICAgICAgICAgLyogTEFWMV8yRCAqLworICAgICAgICAgICB7e0hVRkZfUEFDSygweDAwMDAwMDAwLCAxKSwgSFVGRl9QQUNLKDB4MDAwMDAwMDYsIDMpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwNywgMyksIEhVRkZfUEFDSygweDAwMDAwMDAyLCAyKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMCkgLyogZXNjYXBlICovCisgICAgICAgfSwKKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjNfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMiksIEhVRkZfUEFDSygweDAwMDAwMDBlLCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDM3ZSwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMGRmZSwgMTIpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwZiwgNCksIEhVRkZfUEFDSygweDAwMDAwMDBjLCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDFiYSwgOSksIEhVRkZfUEFDSygweDAwMDAwMWJiLCA5KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwZGUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDBkYywgOCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxYmUsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDAxYSwgNSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwNmZlLCAxMSksIEhVRkZfUEFDSygweDAwMDAwZGZmLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMzYsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMSl9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVY1XzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDAsIDEpLCBIVUZGX1BBQ0soMHgwMDAwMDAwYywgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxYjYsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMWI3YywgMTMpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDBkYmZlLCAxNiksIEhVRkZfUEFDSygweDAwMDM2ZmZmLCAxOCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDBlLCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMWUsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWJlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDBkZmUsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAzNmZmZSwgMTgpLCBIVUZGX1BBQ0soMHgwMDAwMDM2ZSwgMTApfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDA2ZSwgNyksIEhVRkZfUEFDSygweDAwMDAwMGZlLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBkOCwgOCksIEhVRkZfUEFDSygweDAwMDAzNmZlLCAxNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA2ZGUsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDAwZGUsIDgpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDFmYSwgOSksIEhVRkZfUEFDSygweDAwMDAwMGRhLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMGRmZiwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMWI3ZSwgMTMpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGQ5LCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwZmYsIDgpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDNmNiwgMTApLCBIVUZGX1BBQ0soMHgwMDAwMDZmZSwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDA2ZGZlLCAxNSksIEhVRkZfUEFDSygweDAwMDAwMzdlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZmMsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAxYSwgNSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwN2VlLCAxMSksIEhVRkZfUEFDSygweDAwMDFiN2ZlLCAxNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDFiN2QsIDEzKSwgSFVGRl9QQUNLKDB4MDAwMDA3ZWYsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAzZSwgNiksIEhVRkZfUEFDSygweDAwMDAwMDAyLCAyKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAzNmZmZiwgMTgpIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVY3XzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDAsIDEpLCBIVUZGX1BBQ0soMHgwMDAwMDAwYywgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA3ZWUsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDFlN2UsIDEzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwM2NmZSwgMTQpLCBIVUZGX1BBQ0soMHgwMDAwNzlmZiwgMTUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDA3OWZmLCAxNSksIEhVRkZfUEFDSygweDAwMDA3OWZmLCAxNSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDBlLCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMWEsIDUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWU2LCA5KSwgSFVGRl9QQUNLKDB4MDAwMDFmYmUsIDEzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwNzlmZSwgMTUpLCBIVUZGX1BBQ0soMHgwMDAwNzlmZiwgMTUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDA3OWZmLCAxNSksIEhVRkZfUEFDSygweDAwMDAwNmZjLCAxMSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDZjLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwZjYsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWJhLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDBkZmMsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMGRmZCwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwNzlmZiwgMTUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwZjNlLCAxMiksIEhVRkZfUEFDSygweDAwMDAwMWJiLCA5KX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAwZGMsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDFmZSwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAzNmUsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDAzZmUsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwNzlmZiwgMTUpLCBIVUZGX1BBQ0soMHgwMDAwMGZkZSwgMTIpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWVlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwZjIsIDgpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDFmYSwgOSksIEhVRkZfUEFDSygweDAwMDAwM2Y2LCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxYmUsIDkpLCBIVUZGX1BBQ0soMHgwMDAwNzlmZiwgMTUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAxZmJmLCAxMyksIEhVRkZfUEFDSygweDAwMDAwM2NlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAzZmYsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDAwZGUsIDgpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDA3OCwgNyksIEhVRkZfUEFDSygweDAwMDAwMGRhLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwNzlmZiwgMTUpLCBIVUZGX1BBQ0soMHgwMDAwNzlmZiwgMTUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwNmZkLCAxMSksIEhVRkZfUEFDSygweDAwMDAwMzZjLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZWYsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDBmZSwgOCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMzZmLCAxMCksIEhVRkZfUEFDSygweDAwMDAwZGZlLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDc5ZmYsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMDc5ZmYsIDE1KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwNzlmZiwgMTUpLCBIVUZGX1BBQ0soMHgwMDAwMDM2ZCwgMTApLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGZjLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwM2UsIDYpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMGRmZiwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwNzlmZiwgMTUpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDA3OWZmLCAxNSksIEhVRkZfUEFDSygweDAwMDA3OWZmLCAxNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDc5ZmYsIDE1KSwgSFVGRl9QQUNLKDB4MDAwMDA3OWUsIDExKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDA3YSwgNyksIEhVRkZfUEFDSygweDAwMDAwMDAyLCAyKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwNzlmZiwgMTUpIC8qIGVzY2FwZSAqLworICAgICAgIH19LAorICAgICAgey8qIEhVRkZfSUNDX1RBQl8yRFsxXVsxXSAqLworICAgICAgIHsKKyAgICAgICAgICAgLyogTEFWMV8yRCAqLworICAgICAgICAgICB7e0hVRkZfUEFDSygweDAwMDAwMDAwLCAxKSwgSFVGRl9QQUNLKDB4MDAwMDAwMDYsIDMpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwNywgMyksIEhVRkZfUEFDSygweDAwMDAwMDAyLCAyKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMCkgLyogZXNjYXBlICovCisgICAgICAgfSwKKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjNfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMiksIEhVRkZfUEFDSygweDAwMDAwMDBlLCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBmYywgOCksIEhVRkZfUEFDSygweDAwMDAwZmRlLCAxMil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDBjLCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGQsIDQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMWZlLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDA3ZWUsIDExKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDAxZmEsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDFmZiwgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZmUsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDAzZSwgNil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwZmRmLCAxMiksIEhVRkZfUEFDSygweDAwMDAwM2Y2LCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMWUsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMSl9fSwKKyAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDAsIDApIC8qIGVzY2FwZSAqLworICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAvKiBMQVY1XzJEICovCisgICAgICAgICAgIHt7SFVGRl9QQUNLKDB4MDAwMDAwMDAsIDIpLCBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwM2EsIDcpLCBIVUZGX1BBQ0soMHgwMDAwMDY3NiwgMTEpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAxOWZlLCAxMyksIEhVRkZfUEFDSygweDAwMDBjZWJlLCAxNil9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDBmLCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDIsIDMpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDFlLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwZmUsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAxOWQ2LCAxMyksIEhVRkZfUEFDSygweDAwMDA2NzVlLCAxNSl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMDNlLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwMzIsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDE4LCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAzM2UsIDEwKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMGNmZSwgMTIpLCBIVUZGX1BBQ0soMHgwMDAwMDY3NywgMTEpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDY3NCwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDE5YywgOSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZmYsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDAzYiwgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMWMsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDA3ZSwgOCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAzM2ZlLCAxNCksIEhVRkZfUEFDSygweDAwMDAzM2ZmLCAxNCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBjZWEsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDAwNjYsIDcpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDFhLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDYsIDQpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwY2ViZiwgMTYpLCBIVUZGX1BBQ0soMHgwMDAwMzNhZSwgMTQpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwNjdlLCAxMSksIEhVRkZfUEFDSygweDAwMDAwMTllLCA5KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxYiwgNSksIEhVRkZfUEFDSygweDAwMDAwMDAyLCAyKX19LAorICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwMCwgMCkgLyogZXNjYXBlICovCisgICAgICAgfSwKKyAgICAgICB7CisgICAgICAgICAgIC8qIExBVjdfMkQgKi8KKyAgICAgICAgICAge3tIVUZGX1BBQ0soMHgwMDAwMDAwMiwgMiksIEhVRkZfUEFDSygweDAwMDAwMDAyLCA0KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDBmZSwgOSksIEhVRkZfUEFDSygweDAwMDAwN2JlLCAxMiksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDBmZmMsIDEzKSwgSFVGRl9QQUNLKDB4MDAwMDBmZmQsIDEzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMWVmZSwgMTUpLCBIVUZGX1BBQ0soMHgwMDAwM2RmZSwgMTYpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAwNCwgNCksIEhVRkZfUEFDSygweDAwMDAwMDAwLCAzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAzYywgNyksIEhVRkZfUEFDSygweDAwMDAwMGY2LCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZGEsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDAzZmUsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwM2RmZSwgMTUpLCBIVUZGX1BBQ0soMHgwMDAwM2RmZiwgMTYpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwMDAzYywgOCksIEhVRkZfUEFDSygweDAwMDAwMDNlLCA3KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwYSwgNSksIEhVRkZfUEFDSygweDAwMDAwMDNhLCA4KSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDNkZSwgMTEpLCBIVUZGX1BBQ0soMHgwMDAwMDdiZSwgMTMpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwZjdlLCAxNCksIEhVRkZfUEFDSygweDAwMDAxZWZlLCAxNCl9LAorICAgICAgICAgICAge0hVRkZfUEFDSygweDAwMDAwMWRlLCAxMSksIEhVRkZfUEFDSygweDAwMDAwMGVjLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwN2UsIDkpLCBIVUZGX1BBQ0soMHgwMDAwMDAwYywgNSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZWUsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDBmN2UsIDEzKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMDdmYywgMTIpLCBIVUZGX1BBQ0soMHgwMDAwM2RmZiwgMTUpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwN2ZmZSwgMTYpLCBIVUZGX1BBQ0soMHgwMDAwMDNiZSwgMTIpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMGZlLCAxMCksIEhVRkZfUEFDSygweDAwMDAwMWZlLCAxMCksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMWEsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAxYywgNyksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDA3ZmQsIDEyKSwgSFVGRl9QQUNLKDB4MDAwMDBmZmUsIDEzKX0sCisgICAgICAgICAgICB7SFVGRl9QQUNLKDB4MDAwMDNkZmYsIDE2KSwgSFVGRl9QQUNLKDB4MDAwMDAzYmYsIDEyKSwKKyAgICAgICAgICAgICBIVUZGX1BBQ0soMHgwMDAwMWZmZSwgMTQpLCBIVUZGX1BBQ0soMHgwMDAwMDNmZiwgMTIpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDNlLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwMWIsIDYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDdlLCA4KSwgSFVGRl9QQUNLKDB4MDAwMDAwZjYsIDkpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwN2ZmZiwgMTYpLCBIVUZGX1BBQ0soMHgwMDAwM2RmZiwgMTYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAzZmZlLCAxNSksIEhVRkZfUEFDSygweDAwMDAwMWRiLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAwZWUsIDEwKSwgSFVGRl9QQUNLKDB4MDAwMDAwN2EsIDgpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDBlLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGIsIDUpfSwKKyAgICAgICAgICAgIHtIVUZGX1BBQ0soMHgwMDAwM2RmZiwgMTYpLCBIVUZGX1BBQ0soMHgwMDAwM2RmZiwgMTYpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwM2RlLCAxMiksIEhVRkZfUEFDSygweDAwMDAwMWZlLCAxMSksCisgICAgICAgICAgICAgSFVGRl9QQUNLKDB4MDAwMDAxZWUsIDExKSwgSFVGRl9QQUNLKDB4MDAwMDAwN2EsIDkpLAorICAgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAwMDA2LCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDMsIDIpfX0sCisgICAgICAgICAgIEhVRkZfUEFDSygweDAwMDAzZGZmLCAxNikgLyogZXNjYXBlICovCisgICAgICAgfX19fX07CisKK2NvbnN0IEhVRkZfUFQwX1RBQkxFIGZka19zYWNlbmNfaHVmZlBhcnQwVGFiID0geworICAgIHsvKiBDTEQgKi8KKyAgICAgSFVGRl9QQUNLKDB4MDAwMDAwNTIsIDgpLCBIVUZGX1BBQ0soMHgwMDAwMDBhZSwgOSksCisgICAgIEhVRkZfUEFDSygweDAwMDAwMGFmLCA5KSwgSFVGRl9QQUNLKDB4MDAwMDAwMjgsIDcpLAorICAgICBIVUZGX1BBQ0soMHgwMDAwMDA2ZSwgNyksIEhVRkZfUEFDSygweDAwMDAwMDM2LCA2KSwKKyAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMWUsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAwZSwgNCksCisgICAgIEhVRkZfUEFDSygweDAwMDAwMDBjLCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGEsIDQpLAorICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwMiwgNCksIEhVRkZfUEFDSygweDAwMDAwMDE2LCA1KSwKKyAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMTIsIDUpLCBIVUZGX1BBQ0soMHgwMDAwMDAxNywgNSksCisgICAgIEhVRkZfUEFDSygweDAwMDAwMDAwLCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMDQsIDQpLAorICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwNiwgNCksIEhVRkZfUEFDSygweDAwMDAwMDA4LCA0KSwKKyAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDcsIDQpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMywgNCksCisgICAgIEhVRkZfUEFDSygweDAwMDAwMDAxLCA0KSwgSFVGRl9QQUNLKDB4MDAwMDAwMWEsIDUpLAorICAgICBIVUZGX1BBQ0soMHgwMDAwMDAxMywgNSksIEhVRkZfUEFDSygweDAwMDAwMDNlLCA2KSwKKyAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMTYsIDYpLCBIVUZGX1BBQ0soMHgwMDAwMDAxNywgNiksCisgICAgIEhVRkZfUEFDSygweDAwMDAwMDZmLCA3KSwgSFVGRl9QQUNLKDB4MDAwMDAwMmEsIDcpLAorICAgICBIVUZGX1BBQ0soMHgwMDAwMDA1NiwgOCksIEhVRkZfUEFDSygweDAwMDAwMDUzLCA4KSwKKyAgICAgSFVGRl9QQUNLKDB4MDAwMDAwM2YsIDYpfSwKKyAgICB7LyogSUNDICovCisgICAgIEhVRkZfUEFDSygweDAwMDAwMDFlLCA1KSwgSFVGRl9QQUNLKDB4MDAwMDAwMGUsIDQpLAorICAgICBIVUZGX1BBQ0soMHgwMDAwMDAwNiwgMyksIEhVRkZfUEFDSygweDAwMDAwMDAwLCAyKSwKKyAgICAgSFVGRl9QQUNLKDB4MDAwMDAwMDIsIDIpLCBIVUZGX1BBQ0soMHgwMDAwMDAwMSwgMiksCisgICAgIEhVRkZfUEFDSygweDAwMDAwMDNlLCA2KSwgSFVGRl9QQUNLKDB4MDAwMDAwM2YsIDYpfX07CisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbGliU0FDZW5jL3NyYy9zYWNlbmNfaHVmZl90YWIuaCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2h1ZmZfdGFiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q2YzMzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2h1ZmZfdGFiLmgKQEAgLTAsMCArMSwyMjIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hcmt1cyBMb2h3YXNzZXIKKworICAgRGVzY3JpcHRpb246IFNBQy1FbmNvZGVyIGNvbnN0YW50IGh1ZmZtYW4gdGFibGVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0FDRU5DX0hVRkZfVEFCX0gKKyNkZWZpbmUgU0FDRU5DX0hVRkZfVEFCX0gKKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgorCisvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEhVRkZfUEFDSyhhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKChVTE9ORylhKSAmIDB4MDBGRkZGRkYpIDw8IDgpIHwgKCgoVUxPTkcpYikgJiAweEZGKSBcCisgIH0gLyohPCBQYWNrIGh1ZmZtYW4gdmFsdWUgYW5kIGxlbmd0aCBpbmZvcm1hdGlvbi4gKi8KKyNkZWZpbmUgSFVGRl9WQUxVRShhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoYS5wYWNrZWQgPj4gOCkgJiAweDAwRkZGRkZGKSkgLyohPCBSZXR1cm4gdmFsdWUgZnJvbSBwYWNrZWQgdGFibGUgZW50cnkuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhVRkZfTEVOR1RIKGEpIFwKKyAgKChhLnBhY2tlZCAmIDB4RkYpKSAvKiE8IFJldHVybiBsZW5ndGggZnJvbSBwYWNrZWQgdGFibGUgZW50cnkuICovCisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogXGJyaWVmICBUaGlzIHN0cnVjdCBjb250YWlucyBwYWNrZWQgaHVmZm1hbiBlbnRyaWVzLgorICoKKyAqIFRoZSBwYWNrZWQgZW50cnkgY29uc2lzdCBvZiBoZmZtYW4gdmFsdWUgYW5kIGxlbmd0aCBpbmZvcm1hdGlvbi4KKyAqCisgKiAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgIHwgICAgICAgICB2YWx1ZSAgICAgICAgICB8IGxlbmd0aCB8CisgKiAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgIHw8LS0tLS0tLSAzMS4uLjggLS0tLS0tLT58PCA3Li4wID58CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUxPTkcgcGFja2VkOyAvKiEgUGFja2VkIGh1ZmZtYW4gZW50cnk6CisgICAgICAgICAgICAgICAgICAgIC0gbG93ZXIgOCBiaXQgYXJlIHJlc2Vydm9lZCBmb3IgbGVuZ3RoIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgIC0gdXBwZXIgMjQgYml0IGNvbnRhaW5zIGh1ZmZtYW4gdmFsdWUgKi8KK30gSFVGRl9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBIVUZGX0VOVFJZIGVudHJ5WzJdWzJdOworICBIVUZGX0VOVFJZIGVzY2FwZTsKKworfSBMQVYxXzJEOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEhVRkZfRU5UUlkgZW50cnlbNF1bNF07CisgIEhVRkZfRU5UUlkgZXNjYXBlOworCit9IExBVjNfMkQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgSFVGRl9FTlRSWSBlbnRyeVs2XVs2XTsKKyAgSFVGRl9FTlRSWSBlc2NhcGU7CisKK30gTEFWNV8yRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBIVUZGX0VOVFJZIGVudHJ5WzddWzddOworICBIVUZGX0VOVFJZIGVzY2FwZTsKKworfSBMQVY2XzJEOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEhVRkZfRU5UUlkgZW50cnlbOF1bOF07CisgIEhVRkZfRU5UUlkgZXNjYXBlOworCit9IExBVjdfMkQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgSFVGRl9FTlRSWSBlbnRyeVsxMF1bMTBdOworICBIVUZGX0VOVFJZIGVzY2FwZTsKKworfSBMQVY5XzJEOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEhVRkZfRU5UUlkgZW50cnlbMTNdWzEzXTsKKyAgSFVGRl9FTlRSWSBlc2NhcGU7CisKK30gTEFWMTJfMkQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgTEFWM18yRCBsYXYzOworICBMQVY1XzJEIGxhdjU7CisgIExBVjdfMkQgbGF2NzsKKyAgTEFWOV8yRCBsYXY5OworCit9IEhVRkZfQ0xEX1RBQl8yRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBMQVYxXzJEIGxhdjE7CisgIExBVjNfMkQgbGF2MzsKKyAgTEFWNV8yRCBsYXY1OworICBMQVY3XzJEIGxhdjc7CisKK30gSFVGRl9JQ0NfVEFCXzJEOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEhVRkZfRU5UUlkgaDFEWzJdWzMxXTsKKyAgSFVGRl9DTERfVEFCXzJEIGgyRFsyXVsyXTsKKworfSBIVUZGX0NMRF9UQUJMRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBIVUZGX0VOVFJZIGgxRFsyXVs4XTsKKyAgSFVGRl9JQ0NfVEFCXzJEIGgyRFsyXVsyXTsKKworfSBIVUZGX0lDQ19UQUJMRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBIVUZGX0VOVFJZIGNsZFszMV07CisgIEhVRkZfRU5UUlkgaWNjWzhdOworCit9IEhVRkZfUFQwX1RBQkxFOworCit0eXBlZGVmIEhVRkZfRU5UUlkgSFVGRl9SRVNfVEFCTEVbNV1bOF07CisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBjb25zdCBIVUZGX0NMRF9UQUJMRSBmZGtfc2FjZW5jX2h1ZmZDTERUYWI7CitleHRlcm4gY29uc3QgSFVGRl9JQ0NfVEFCTEUgZmRrX3NhY2VuY19odWZmSUNDVGFiOworZXh0ZXJuIGNvbnN0IEhVRkZfUFQwX1RBQkxFIGZka19zYWNlbmNfaHVmZlBhcnQwVGFiOworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNlbmRpZiAvKiBTQUNFTkNfSFVGRl9UQUJfSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0FDZW5jL3NyYy9zYWNlbmNfbGliLmNwcCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2xpYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhMTY1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX2xpYi5jcHAKQEAgLTAsMCArMSwyMDQyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXggTmV1ZW5kb3JmCisKKyAgIERlc2NyaXB0aW9uOiBFbmNvZGVyIExpYnJhcnkgSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgSW50ZXJmYWNlIHRvIFNwYWNpYWwgQXVkaW8gQ29kaW5nIEVuY29kZXIgbGliCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitcZmlsZQorRGVzY3JpcHRpb24gb2YgZmlsZSBjb250ZW50cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAic2FjZW5jX2xpYi5oIgorI2luY2x1ZGUgInNhY2VuY19jb25zdC5oIgorI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCisjaW5jbHVkZSAiRkRLX2NvcmUuaCIKKyNpbmNsdWRlICJzYWNlbmNfdHJlZS5oIgorI2luY2x1ZGUgInNhY2VuY19iaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJzYWNlbmNfb25zZXRkZXRlY3QuaCIKKyNpbmNsdWRlICJzYWNlbmNfZnJhbWV3aW5kb3dpbmcuaCIKKyNpbmNsdWRlICJzYWNlbmNfZmlsdGVyLmgiCisjaW5jbHVkZSAic2FjZW5jX3BhcmFtZXh0cmFjdC5oIgorI2luY2x1ZGUgInNhY2VuY19zdGF0aWNnYWluLmgiCisjaW5jbHVkZSAic2FjZW5jX2RlbGF5LmgiCisjaW5jbHVkZSAic2FjZW5jX2RteF90ZG9tX2VuaC5oIgorI2luY2x1ZGUgInNhY2VuY192ZWN0b3JmdW5jdGlvbnMuaCIKKyNpbmNsdWRlICJxbWYuaCIKKworLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFbmNvZGVyIGxpYnJhcnkgaW5mbyAqLworI2RlZmluZSBTQUNFTkNfTElCX1ZMMCAyCisjZGVmaW5lIFNBQ0VOQ19MSUJfVkwxIDAKKyNkZWZpbmUgU0FDRU5DX0xJQl9WTDIgMAorI2RlZmluZSBTQUNFTkNfTElCX1RJVExFICJNUEVHIFN1cnJvdW5kIEVuY29kZXIiCisjaWZkZWYgX19BTkRST0lEX18KKyNkZWZpbmUgU0FDRU5DX0xJQl9CVUlMRF9EQVRFICIiCisjZGVmaW5lIFNBQ0VOQ19MSUJfQlVJTERfVElNRSAiIgorI2Vsc2UKKyNkZWZpbmUgU0FDRU5DX0xJQl9CVUlMRF9EQVRFIF9fREFURV9fCisjZGVmaW5lIFNBQ0VOQ19MSUJfQlVJTERfVElNRSBfX1RJTUVfXworI2VuZGlmCisKKyNkZWZpbmUgTUFYX01QRUdTX0JZVEVTICgxIDw8IDE0KQorI2RlZmluZSBNQVhfU1NDX0JZVEVTICgxIDw8IDYpCisKKyNkZWZpbmUgTUFYX1NQQUNFX1RSRUVfQ0hBTk5FTFMgMgorI2RlZmluZSBOVU1fS0VFUF9XSU5ET1dTIDMKKworLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgeworICBNUDRTUEFDRUVOQ19NT0RFIGVuY01vZGU7CisgIE1QNFNQQUNFRU5DX0JBTkRTX0NPTkZJRyBuUGFyYW1CYW5kczsKKyAgTVA0U1BBQ0VFTkNfUVVBTlRNT0RFIHF1YW50TW9kZTsKKyAgVUNIQVIgYlVzZUNvYXJzZVF1YW50OworICBVQ0hBUiBiTGRNb2RlOworICBVQ0hBUiBiVGltZURvbWFpbkRteDsKKyAgVUlOVCBzYW1wbGVSYXRlOworICBVSU5UIGZyYW1lVGltZVNsb3RzOyAgICAgLyogZS5nLiAzMiB3aGVuIHVzZWQgd2l0aCBIRS1BQUMgKi8KKyAgVUlOVCBpbmRlcGVuZGVuY3lGYWN0b3I7IC8qIGhvdyBvZnRlbiBzaG91bGQgd2Ugc2V0IHRoZSBpbmRlcGVuZGVuY3kgZmxhZyAqLworICBJTlQgdGltZUFsaWdubWVudDsgICAgICAgLyogYWRkaXRpb25hbCBkZWxheSBmb3IgZG93bm1peCAqLworCit9IE1QNFNQQUNFRU5DX1NFVFVQLCAqSEFORExFX01QNFNQQUNFRU5DX1NFVFVQOworCitzdHJ1Y3QgRU5DX0NPTkZJR19TRVRVUCB7CisgIFVDSEFSIGJFbmNNb2RlXzIxMjsKKyAgVUNIQVIgbWF4SHlicmlkSW5TdGF0aWNTbG90czsKKyAgTE9ORyBtYXhTYW1wbGluZ3JhdGU7CisgIElOVCBtYXhBbmFseXNpc0xlbmd0aFRpbWVTbG90czsKKyAgSU5UIG1heEh5YnJpZEJhbmRzOworICBJTlQgbWF4UW1mQmFuZHM7CisgIElOVCBtYXhDaEluOworICBJTlQgbWF4RnJhbWVUaW1lU2xvdHM7CisgIElOVCBtYXhGcmFtZUxlbmd0aDsKKyAgSU5UIG1heENoT3V0OworICBJTlQgbWF4Q2hUb3RPdXQ7Cit9OworCitzdHJ1Y3QgTVA0U1BBQ0VfRU5DT0RFUiB7CisgIE1QNFNQQUNFRU5DX1NFVFVQIHVzZXI7CisKKyAgRU5DX0NPTkZJR19TRVRVUCBzZXR1cDsgLyogZGVzY3JpYmUgYWxsb2NhdGVkIGluc3RhbmNlICovCisKKyAgSEFORExFX0ZSQU1FV0lORE9XCisgIGhGcmFtZVdpbmRvdzsgICAgICAvKiBXaW5kb3dpbmcsIG9ubHkgY3JlYXRlZCt1cGRhdGVkLCBidXQgbm90IHVzZWQgKi8KKyAgSU5UIG5TYW1wbGVzVmFsaWQ7IC8qIElucHV0IEJ1ZmZlciBIYW5kbGluZyAqLworCisgIC8qIFJvdXRpbmcgU2Vuc2libGUgU3dpdGNoZXMvVmFyaWFibGVzICovCisgIE1QNFNQQUNFRU5DX0JBTkRTX0NPTkZJRyBuUGFyYW1CYW5kczsKKyAgVUNIQVIgdXNlVGltZURvbURvd25taXg7CisKKyAgLyogbm90IFJvdXRpbmcgU2Vuc2libGUgU3dpdGNoZXMvVmFyaWJsZXMgLSBtdXN0IGJlIGNvbnRhaW5lZCBpbiBDaGVjayAqLworICBNUDRTUEFDRUVOQ19NT0RFIGVuY01vZGU7CisgIFVDSEFSIGJFbmNNb2RlXzIxMl9vbmx5OworCisgIC8qIG5vdCBSb3V0aW5nIFNlbnNpYmxlIFN3aXRjaGVzL1ZhcmlibGVzICsgbG93ZXIgQ2xhc3NlcyAqLworICBVQ0hBUiB1c2VGcmFtZUtlZXA7CisgIFVJTlQgaW5kZXBlbmRlbmN5RmFjdG9yOworICBVSU5UIG5TYW1wbGVSYXRlOworICBVQ0hBUiBuSW5wdXRDaGFubmVsczsKKyAgVUNIQVIgbk91dHB1dENoYW5uZWxzOworICBVQ0hBUiBuRnJhbWVUaW1lU2xvdHM7IC8qIGUuZy4gMzIgd2hlbiB1c2VkIHdpdGggSEUtQUFDICovCisgIFVDSEFSIG5RbWZCYW5kczsKKyAgVUNIQVIgbkh5YnJpZEJhbmRzOworICBVSU5UIG5GcmFtZUxlbmd0aDsgLyogbnVtYmVyIG9mIG91dHB1dCB3YXZlZm9ybSBzYW1wbGVzL2NoYW5uZWwvZnJhbWUgKi8KKworICAvKiBub3QgUm91dGluZyBTZW5zaWJsZSBTd2l0Y2hlcy9WYXJpYmxlcyArIGxvd2VyIENsYXNzZXMsIHNlY29uZGFyeSBjb21wdXRlZAorICAgKi8KKyAgSU5UIG5TYW1wbGVzTmV4dDsKKyAgSU5UIG5BbmFseXNpc0xlbmd0aFRpbWVTbG90czsKKyAgSU5UIG5BbmFseXNpc0xvb2thaGVhZFRpbWVTbG90czsKKyAgSU5UIG5VcGRhdGVIeWJyaWRQb3NpdGlvblRpbWVTbG90czsKKyAgSU5UICpwbk91dHB1dEJpdHM7CisgIElOVCBuSW5wdXREZWxheTsKKyAgSU5UIG5PdXRwdXRCdWZmZXJEZWxheTsKKyAgSU5UIG5TdXJyb3VuZEFuYWx5c2lzQnVmZmVyRGVsYXk7CisgIElOVCBuQml0c3RyZWFtRGVsYXlCdWZmZXI7CisgIElOVCBuQml0c3RyZWFtQnVmZmVyUmVhZDsKKyAgSU5UIG5CaXRzdHJlYW1CdWZmZXJXcml0ZTsKKyAgSU5UIG5EaXNjYXJkT3V0RnJhbWVzOworICBJTlQgYXZvaWRfa2VlcDsKKworICAvKiBub3QgUm91dGluZyBTZW5zaWJsZSBTd2l0Y2hlcy9WYXJpYmxlcyAtPiBtb3ZlZCB0byBsb3dlciBDbGFzc2VzICovCisgIFVDSEFSIHVzZUNvYXJzZVF1YW50Q2xkOyAgICAvKiBPbmx5IFVzZWQgaW4gU3BhY2VUcmVlU2V0dXAgKi8KKyAgVUNIQVIgdXNlQ29hcnNlUXVhbnRJY2M7ICAgIC8qIE9ubHkgVXNlZCBpbiBTcGFjZVRyZWVTZXR1cCAqLworICBVQ0hBUiB1c2VDb2Fyc2VRdWFudENwYzsgICAgLyogT25seSBVc2VkIGluIFNwYWNlVHJlZVNldHVwICovCisgIFVDSEFSIHVzZUNvYXJzZVF1YW50QXJiRG14OyAvKiBBcmJpdHJhcnlEbXgsLi4uIG5vdCBhdmFpbGFibGUgeWV0ICovCisgIE1QNFNQQUNFRU5DX1FVQU5UTU9ERQorICBxdWFudE1vZGU7ICAgICAgICAgIC8qIFVzZWQgZm9yIHF1YW5pdHphdGlvbiBhbmQgaW4gYml0c3RyZWFtIHdyaXRlciAqLworICBJTlQgY29yZUNvZGVyRGVsYXk7IC8qIFVzZWQgaW4gZGVsYXkgY29tcGVuc2F0aW9uICovCisgIElOVCB0aW1lQWxpZ25tZW50OyAgLyogVXNlZCBpbiBkZWxheSBjb21wZW5zYXRpb24gKi8KKworICAvKiBMb2NhbCBQcm9jZXNzaW5nIFZhcmlhYmxlcyAqLworICBJTlQgaW5kZXBlbmRlbmN5Q291bnQ7CisgIElOVCBpbmRlcGVuZGVuY3lGbGFnOworICBJTlQgKipwcFRyQ3VyclBvczsgICAgICAgICAgICAgICAgLyogYmVsb25ncyBzb21laG93IHRvIE9uc2V0IERldGVjdGlvbiAqLworICBJTlQgdHJQcmV2UG9zWzIgKiBNQVhfTlVNX1RSQU5TXTsgLyogYmVsb25ncyBzb21laG93IHRvIE9uc2V0IERldGVjdGlvbiAqLworCisgIEZSQU1FV0lOX0xJU1QgZnJhbWVXaW5MaXN0OworICBTUEFUSUFMRlJBTUUgc2F2ZUZyYW1lOworCisgIC8qIE1vZHVsZS1IYW5kbGVzICovCisgIFNQQUNFX1RSRUVfU0VUVVAgc3BhY2VUcmVlU2V0dXA7CisgIE1QRUc0U1BBQ0VFTkNfU1NDQlVGIHNzY0J1ZjsKKyAgRklYUF9XSU4gKnBGcmFtZVdpbmRvd0FuYV9fRkRLW01BWF9OVU1fUEFSQU1TXTsKKyAgSEFORExFX1FNRl9GSUxURVJfQkFOSyAqcGhRbWZGaWx0SW5fX0ZESzsKKyAgSEFORExFX0RDX0ZJTFRFUiBwaERDRmlsdGVyU2lnSW5bU0FDRU5DX01BWF9JTlBVVF9DSEFOTkVMU107CisgIEhBTkRMRV9PTlNFVF9ERVRFQ1QgcGhPbnNldFtTQUNFTkNfTUFYX0lOUFVUX0NIQU5ORUxTXTsKKyAgSEFORExFX1NQQUNFX1RSRUUgaFNwYWNlVHJlZTsKKyAgSEFORExFX0JTRl9JTlNUQU5DRSBoQml0c3RyZWFtRm9ybWF0dGVyOworICBIQU5ETEVfU1RBVElDX0dBSU5fQ09ORklHIGhTdGF0aWNHYWluQ29uZmlnOworICBIQU5ETEVfU1RBVElDX0dBSU4gaFN0YXRpY0dhaW47CisgIEhBTkRMRV9ERUxBWSBoRGVsYXk7CisKKyAgLyogZW5oYW5jZWQgdGltZSBkb21haW4gZG93bm1peCAoZm9yIHN0ZXJlbyBpbnB1dCkgKi8KKyAgSEFORExFX0VOSEFOQ0VEX1RJTUVfRE9NQUlOX0RNWCBoRW5oYW5jZWRUaW1lRG14OworCisgIC8qIERhdGEgQnVmZmVycyAqLworICBJTlRfUENNICoqcHBUaW1lU2lnSW5fX0ZESzsKKyAgSU5UX1BDTSAqKnBwVGltZVNpZ0RlbGF5SW5fX0ZESzsKKyAgSU5UX1BDTSAqKnBwVGltZVNpZ091dF9fRkRLOworICBGSVhQX0RQSyAqKipwcHBIeWJyaWRJbl9fRkRLOworICBGSVhQX0RQSyAqKipwcHBIeWJyaWRJblN0YXRpY19fRkRLOworICBGSVhQX0RQSyAqKipwcHBQcm9jRGF0YUluX19GREs7CisgIElOVF9QQ00gKnBPdXRwdXREZWxheUJ1ZmZlcl9fRkRLOworCisgIFVDSEFSICoqcHBCaXRzdHJlYW1EZWxheUJ1ZmZlcjsKKworICBVQ0hBUiAqcFBhcmFtZXRlckJhbmQySHlicmlkQmFuZE9mZnNldDsKKyAgSU5UIHN0YXRpY0dhaW5TY2FsZTsKKworICBJTlQgKnBFbmNvZGVySW5wdXRDaFNjYWxlOworICBJTlQgKnN0YXRpY1RpbWVEb21haW5EbXhJblNjYWxlOworfTsKKworLyogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGNvbnN0IFVDSEFSIHBWYWxpZEJhbmRzX0xkWzhdID0gezQsIDUsIDcsIDksIDEyLCAxNSwgMjMsIDQwfTsKKworc3RhdGljIGNvbnN0IFVDSEFSIHFtZjJxbWZbXSA9IC8qIEJ5cGFzcyB0aGUgSHlicmlkQW55bHlpcy9TeW50aGVzaXMqLworICAgIHswLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsCisgICAgIDE1LCAgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwKKyAgICAgMzAsICAzMSwgIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LAorICAgICA0NSwgIDQ2LCAgNDcsICA0OCwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksCisgICAgIDYwLCAgNjEsICA2MiwgIDYzLCAgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwKKyAgICAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwgIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LAorICAgICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsICA5NiwgIDk3LCAgOTgsICA5OSwgIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LAorICAgICAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LAorICAgICAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyN307CisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBGREtfU0FDRU5DX0VSUk9SIG1wNFNwYWNlRW5jX2NyZWF0ZSgKKyAgICBIQU5ETEVfTVA0U1BBQ0VfRU5DT0RFUiAqcGhNcDRTcGFjZUVuYyk7CisKK3N0YXRpYyBGREtfU0FDRU5DX0VSUk9SIEZpbGxTcGF0aWFsU3BlY2lmaWNDb25maWcoCisgICAgY29uc3QgSEFORExFX01QNFNQQUNFX0VOQ09ERVIgaEVuYywgU1BBVElBTFNQRUNJRklDQ09ORklHICpjb25zdCBoU3NjKTsKKworc3RhdGljIEZES19TQUNFTkNfRVJST1IgbXA0U3BhY2VFbmNfRmlsbFNwYWNlVHJlZVNldHVwKAorICAgIGNvbnN0IEhBTkRMRV9NUDRTUEFDRV9FTkNPREVSIGhFbmMsCisgICAgU1BBQ0VfVFJFRV9TRVRVUCAqY29uc3QgaFNwYWNlVHJlZVNldHVwKTsKKworc3RhdGljIEZES19TQUNFTkNfRVJST1IgbXA0U3BhY2VFbmNfSW5pdERlbGF5Q29tcGVuc2F0aW9uKAorICAgIEhBTkRMRV9NUDRTUEFDRV9FTkNPREVSIGhNcDRTcGFjZUVuYywgY29uc3QgSU5UIGNvcmVDb2RlckRlbGF5KTsKKworc3RhdGljIEZES19TQUNFTkNfRVJST1IgbXA0U3BhY2VFbmNfSW5pdERlZmF1bHQoCisgICAgSEFORExFX01QNFNQQUNFX0VOQ09ERVIgaE1wNFNwYWNlRW5jKTsKKworc3RhdGljIERFQ09SUkNPTkZJRyBtcDRTcGFjZUVuY19HZXREZWNvcnJDb25maWcoY29uc3QgTVA0U1BBQ0VFTkNfTU9ERSBlbmNNb2RlKTsKKworc3RhdGljIEZES19TQUNFTkNfRVJST1IgbXA0U3BhY2VFbmNfSW5pdE51bVBhcmFtQmFuZHMoCisgICAgSEFORExFX01QNFNQQUNFX0VOQ09ERVIgaEVuYywgY29uc3QgTVA0U1BBQ0VFTkNfQkFORFNfQ09ORklHIG5QYXJhbUJhbmRzKTsKKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVJTlQgbXA0U3BhY2VFbmNfR2V0TnVtUW1mQmFuZHMoY29uc3QgVUlOVCBuU2FtcGxlUmF0ZSkgeworICBVSU5UIG5RbWZCYW5kcyA9IDA7CisKKyAgaWYgKG5TYW1wbGVSYXRlIDwgMjc3MTMpCisgICAgblFtZkJhbmRzID0gMzI7CisgIGVsc2UgaWYgKG5TYW1wbGVSYXRlIDwgNTU0MjYpCisgICAgblFtZkJhbmRzID0gNjQ7CisKKyAgcmV0dXJuIG5RbWZCYW5kczsKK30KKworc3RhdGljIFVJTlQgdXBkYXRlUW1mRmxhZ3MoY29uc3QgVUlOVCBmbGFncywgY29uc3QgSU5UIGtlZXBTdGF0ZXMpIHsKKyAgVUlOVCBxbWZGbGFncyA9IGZsYWdzOworCisgIHFtZkZsYWdzID0gKHFtZkZsYWdzICYgKH4oVUlOVClRTUZfRkxBR19MUCkpOworICBxbWZGbGFncyA9IChxbWZGbGFncyB8IFFNRl9GTEFHX01QU0xERkIpOworICBxbWZGbGFncyA9IChrZWVwU3RhdGVzKSA/IChxbWZGbGFncyB8IFFNRl9GTEFHX0tFRVBfU1RBVEVTKQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IChxbWZGbGFncyAmICh+KFVJTlQpUU1GX0ZMQUdfS0VFUF9TVEFURVMpKTsKKworICByZXR1cm4gcW1mRmxhZ3M7Cit9CisKK3N0YXRpYyBJTlQgZnJlcTJIeWJyaWRCYW5kKGNvbnN0IFVJTlQgbkZyZXF1ZW5jeSwgY29uc3QgVUlOVCBuU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgblFtZkJhbmRzKSB7CisgIC8qCisgICAgblFtZlNsb3RXaWR0aCA9IChuU2FtcGxlUmF0ZS8yKSAvIG5RbWZCYW5kczsKKyAgICBuUW1mQmFuZCAgICAgID0gbkZyZXF1ZW5jeSAvIG5RbWZTbG90V2lkdGg7CisgICovCisgIGludCBuSHlicmlkQmFuZCA9IC0xOworICBpbnQgc2NhbGUgPSAwOworICBjb25zdCBGSVhQX0RCTCB0ZW1wID0gZkRpdk5vcm0oKEZJWFBfREJMKSgyICogbkZyZXF1ZW5jeSAqIG5RbWZCYW5kcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpblNhbXBsZVJhdGUsICZzY2FsZSk7CisgIGNvbnN0IGludCBuUW1mQmFuZCA9IHNjYWxlVmFsdWUodGVtcCwgc2NhbGUgLSAoREZSQUNUX0JJVFMgLSAxKSk7CisKKyAgaWYgKChuUW1mQmFuZCA+IC0xKSAmJiAoblFtZkJhbmQgPCAoaW50KW5RbWZCYW5kcykpIHsKKyAgICBuSHlicmlkQmFuZCA9IHFtZjJxbWZbblFtZkJhbmRdOworICB9CisKKyAgcmV0dXJuIG5IeWJyaWRCYW5kOworfQorCisvKgorICogRXhhbWluZSBidWZmZXIgZGVzY3JpcHRvciByZWdhcmRpbmcgY2hvb3NlbiB0eXBlLgorICoKKyAqIFxwYXJhbSBwQnVmRGVzYyAgICAgICAgICAgICAgUG9pbnRlciB0byBidWZmZXIgZGVzY3JpcHRvcgorICogXHBhcmFtIHR5cGUgICAgICAgICAgICAgICAgICBCdWZmZXIgdHlwZSB0byBsb29rIGZvci4KKworICogXHJldHVybiAtIEJ1ZmZlciBkZXNjcmlwdG9yIGluZGV4LgorICogICAgICAgICAtMSwgaWYgdGhlcmUgaXMgbm8gZW50cnkgYXZhaWxhYmxlLgorICovCitzdGF0aWMgSU5UIGdldEJ1ZkRlc2NJZHgoY29uc3QgRkRLX2J1ZkRlc2NyICpwQnVmRGVzYywgY29uc3QgVUlOVCB0eXBlKSB7CisgIElOVCBpLCBpZHggPSAtMTsKKworICBmb3IgKGkgPSAwOyBpIDwgKGludClwQnVmRGVzYy0+bnVtQnVmczsgaSsrKSB7CisgICAgaWYgKHBCdWZEZXNjLT5wQnVmVHlwZVtpXSA9PSB0eXBlKSB7CisgICAgICBpZHggPSBpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBpZHg7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgRkRLX3NhY2VuY19vcGVuKEhBTkRMRV9NUDRTUEFDRV9FTkNPREVSICpwaE1wNFNwYWNlRW5jKSB7CisgIHJldHVybiBtcDRTcGFjZUVuY19jcmVhdGUocGhNcDRTcGFjZUVuYyk7Cit9CisKK3N0YXRpYyBGREtfU0FDRU5DX0VSUk9SIG1wNFNwYWNlRW5jX2NyZWF0ZSgKKyAgICBIQU5ETEVfTVA0U1BBQ0VfRU5DT0RFUiAqcGhNcDRTcGFjZUVuYykgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworICBIQU5ETEVfTVA0U1BBQ0VfRU5DT0RFUiBoRW5jID0gTlVMTDsKKyAgRU5DX0NPTkZJR19TRVRVUCBzZXR1cDsKKworICBpZiAoTlVMTCA9PSBwaE1wNFNwYWNlRW5jKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaW50IGksIGNoOworICAgIEZES21lbWNsZWFyKCZzZXR1cCwgc2l6ZW9mKEVOQ19DT05GSUdfU0VUVVApKTsKKworICAgIC8qIEFsbG9jYXRlIEVuY29kZXIgSW5zdGFuY2UgKi8KKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKGhFbmMsIDEsIHN0cnVjdCBNUDRTUEFDRV9FTkNPREVSKTsKKworICAgIC8qIENsZWFyIGV2ZXJ5dGhpbmcsIGFsc28gcG9pbnRlcnMuICovCisgICAgaWYgKE5VTEwgIT0gaEVuYykgeworICAgICAgRkRLbWVtY2xlYXIoaEVuYywgc2l6ZW9mKHN0cnVjdCBNUDRTUEFDRV9FTkNPREVSKSk7CisgICAgfQorCisgICAgc2V0dXAubWF4U2FtcGxpbmdyYXRlID0gNDgwMDA7CisgICAgc2V0dXAubWF4RnJhbWVUaW1lU2xvdHMgPSAxNjsKKworICAgIHNldHVwLm1heEFuYWx5c2lzTGVuZ3RoVGltZVNsb3RzID0gMyAqIHNldHVwLm1heEZyYW1lVGltZVNsb3RzOworICAgIHNldHVwLm1heFFtZkJhbmRzID0gbXA0U3BhY2VFbmNfR2V0TnVtUW1mQmFuZHMoc2V0dXAubWF4U2FtcGxpbmdyYXRlKTsKKyAgICA7CisgICAgc2V0dXAubWF4SHlicmlkQmFuZHMgPSBzZXR1cC5tYXhRbWZCYW5kczsKKyAgICBzZXR1cC5tYXhGcmFtZUxlbmd0aCA9IHNldHVwLm1heFFtZkJhbmRzICogc2V0dXAubWF4RnJhbWVUaW1lU2xvdHM7CisKKyAgICBzZXR1cC5tYXhDaEluID0gMjsKKyAgICBzZXR1cC5tYXhDaE91dCA9IDE7CisgICAgc2V0dXAubWF4Q2hUb3RPdXQgPSBzZXR1cC5tYXhDaE91dDsKKyAgICBzZXR1cC5iRW5jTW9kZV8yMTIgPSAxOworICAgIHNldHVwLm1heEh5YnJpZEluU3RhdGljU2xvdHMgPSAyNDsKKworICAgIC8qIE9wZW4gU3RhdGljIEdhaW4qLworICAgIGlmIChTQUNFTkNfT0sgIT0KKyAgICAgICAgKGVycm9yID0gZmRrX3NhY2VuY19zdGF0aWNHYWluX09wZW5Db25maWcoJmhFbmMtPmhTdGF0aWNHYWluQ29uZmlnKSkpIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBlbmhhbmNlZCB0aW1lIGRvbWFpbiBkb3dubWl4IChmb3Igc3RlcmVvIGlucHV0KSAqLworICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZmRrX3NhY2VuY19vcGVuX2VuaGFuY2VkVGltZURvbWFpbkRteCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbmMtPmhFbmhhbmNlZFRpbWVEbXgsIHNldHVwLm1heEZyYW1lTGVuZ3RoKSkpIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKGhFbmMtPnBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfTlVNX1BBUkFNX0JBTkRTLCBVQ0hBUik7CisKKyAgICAvKiBDcmVhdGUgU3BhY2UgVHJlZSBmaXJzdCwgdG8gZ2V0IG51bWJlciBvZiBpbi0vb3V0cHV0IGNoYW5uZWxzICovCisgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBmZGtfc2FjZW5jX3NwYWNlVHJlZV9PcGVuKCZoRW5jLT5oU3BhY2VUcmVlKSkpIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKGhFbmMtPnBFbmNvZGVySW5wdXRDaFNjYWxlLCBzZXR1cC5tYXhDaEluLCBJTlQpOworICAgIEZES19BTExPQ0FURV9NRU1PUllfMUQoaEVuYy0+c3RhdGljVGltZURvbWFpbkRteEluU2NhbGUsIHNldHVwLm1heENoSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQpOworCisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChoRW5jLT5waFFtZkZpbHRJbl9fRkRLLCBzZXR1cC5tYXhDaEluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyk7CisKKyAgICAvKiBBbGxvY2F0ZSBBbmFseXNpcyBGaWx0ZXJiYW5rIFN0cnVjdHMgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzZXR1cC5tYXhDaEluOyBjaCsrKSB7CisgICAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEX0lOVChoRW5jLT5waFFtZkZpbHRJbl9fRkRLW2NoXSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBRTUZfRklMVEVSX0JBTkssIFNFQ1RfREFUQV9MMikKKyAgICAgIEZES19BTExPQ0FURV9NRU1PUllfMURfSU5UKGhFbmMtPnBoUW1mRmlsdEluX19GREtbY2hdLT5GaWx0ZXJTdGF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogNSAqIHNldHVwLm1heFFtZkJhbmRzLCBGSVhQX1FBUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RfREFUQV9MMikKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBTeW50aGVzaXMgRmlsdGVyYmFuayBTdHJ1Y3RzIGZvciBhcmJpdHJhcnkgZG93bm1peCAqLworCisgICAgLyogQWxsb2NhdGUgREMgRmlsdGVyIFN0cnVjdCBmb3Igbm9ybWFsIHNpZ25hbCBpbnB1dCAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IHNldHVwLm1heENoSW47IGNoKyspIHsKKyAgICAgIGlmIChTQUNFTkNfT0sgIT0KKyAgICAgICAgICAoZXJyb3IgPSBmZGtfc2FjZW5jX2NyZWF0ZURDRmlsdGVyKCZoRW5jLT5waERDRmlsdGVyU2lnSW5bY2hdKSkpIHsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgIH0KKworICAgIC8qIE9wZW4gT25zZXQgRGV0ZWN0aW9uICovCisgICAgZm9yIChjaCA9IDA7IGNoIDwgc2V0dXAubWF4Q2hJbjsgY2grKykgeworICAgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBmZGtfc2FjZW5jX29uc2V0RGV0ZWN0X09wZW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbmMtPnBoT25zZXRbY2hdLCBzZXR1cC5tYXhGcmFtZVRpbWVTbG90cykpKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzJEKGhFbmMtPnBwVHJDdXJyUG9zLCBzZXR1cC5tYXhDaEluLCBNQVhfTlVNX1RSQU5TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UKTsKKworICAgIC8qIENyZWF0ZSBXaW5kb3dpbmcgKi8KKyAgICBpZiAoU0FDRU5DX09LICE9CisgICAgICAgIChlcnJvciA9IGZka19zYWNlbmNfZnJhbWVXaW5kb3dfQ3JlYXRlKCZoRW5jLT5oRnJhbWVXaW5kb3cpKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qIE9wZW4gc3RhdGljIGdhaW4gKi8KKyAgICBpZiAoU0FDRU5DX09LICE9IChlcnJvciA9IGZka19zYWNlbmNfc3RhdGljR2Fpbl9PcGVuKCZoRW5jLT5oU3RhdGljR2FpbikpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogY3JlYXRlIGJpdHN0cmVhbSBlbmNvZGVyICovCisgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBmZGtfc2FjZW5jX2NyZWF0ZVNwYXRpYWxCaXRzdHJlYW1FbmNvZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVuYy0+aEJpdHN0cmVhbUZvcm1hdHRlcikpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChoRW5jLT5zc2NCdWYucFNzYywgTUFYX1NTQ19CWVRFUywgVUNIQVIpOworCisgICAgeworICAgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRChoRW5jLT5wcFRpbWVTaWdJbl9fRkRLLCBzZXR1cC5tYXhDaEluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5tYXhGcmFtZUxlbmd0aCArIE1BWF9ERUxBWV9TVVJST1VORF9BTkFMWVNJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSk7CisgICAgfQorICAgIEZES19BTExPQ0FURV9NRU1PUllfMkQoaEVuYy0+cHBUaW1lU2lnRGVsYXlJbl9fRkRLLCBzZXR1cC5tYXhDaEluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0RFTEFZX1NVUlJPVU5EX0FOQUxZU0lTLCBJTlRfUENNKTsKKworICAgIC8qIENyZWF0ZSBuZXcgYnVmZmVycyBmb3Igc2V2ZXJhbCBzaWduYWxzIChpbmNsdWRpbmcgYXJiaXRyYXJ5IGRvd25taXgpICovCisgICAgaWYgKHNldHVwLmJFbmNNb2RlXzIxMiA9PSAwKSB7CisgICAgICAvKiBwT3V0cHV0RGVsYXlCdWZmZXJfX0ZESyBidWZmZXIgaXMgbm90IG5lZWRlZCBmb3IgU0FDRU5DXzIxMiBtb2RlICovCisgICAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKAorICAgICAgICAgIGhFbmMtPnBPdXRwdXREZWxheUJ1ZmZlcl9fRkRLLAorICAgICAgICAgIChzZXR1cC5tYXhGcmFtZUxlbmd0aCArIE1BWF9ERUxBWV9PVVRQVVQpICogc2V0dXAubWF4Q2hPdXQsIElOVF9QQ00pOworICAgIH0KKworICAgIC8qIGFsbG9jYXRlIGJ1ZmZlcnMgKi8KKyAgICBpZiAoc2V0dXAuYkVuY01vZGVfMjEyID09IDApIHsKKyAgICAgIC8qIHBwVGltZVNpZ091dF9fRkRLIGJ1ZmZlciBpcyBub3QgbmVlZGVkIGZvciBTQUNFTkNfMjEyIG1vZGUgKi8KKyAgICAgIEZES19BTExPQ0FURV9NRU1PUllfMkQoaEVuYy0+cHBUaW1lU2lnT3V0X19GREssIHNldHVwLm1heENoVG90T3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5tYXhGcmFtZUxlbmd0aCwgSU5UX1BDTSk7CisgICAgfQorCisgICAgaWYgKHNldHVwLmJFbmNNb2RlXzIxMiA9PSAxKSB7CisgICAgICAvKiBwcHBIeWJyaWRJbl9fRkRLIGJ1ZmZlciBjYW4gYmUgcmVkdWNlZCBieSBtYXhGcmFtZVRpbWVTbG90cy8yIHNsb3RzIGZvcgorICAgICAgICogU0FDRU5DXzIxMiBtb2RlICovCisgICAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzNEKAorICAgICAgICAgIGhFbmMtPnBwcEh5YnJpZEluX19GREssIHNldHVwLm1heENoSW4sCisgICAgICAgICAgc2V0dXAubWF4QW5hbHlzaXNMZW5ndGhUaW1lU2xvdHMgLSAoc2V0dXAubWF4RnJhbWVUaW1lU2xvdHMgPj4gMSksCisgICAgICAgICAgc2V0dXAubWF4SHlicmlkQmFuZHMsIEZJWFBfRFBLKTsKKyAgICAgIEZES19BTExPQ0FURV9NRU1PUllfM0QoaEVuYy0+cHBwSHlicmlkSW5TdGF0aWNfX0ZESywgc2V0dXAubWF4Q2hJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4SHlicmlkSW5TdGF0aWNTbG90cywgc2V0dXAubWF4SHlicmlkQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfRFBLKTsKKyAgICB9IGVsc2UgeworICAgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8zRChoRW5jLT5wcHBIeWJyaWRJbl9fRkRLLCBzZXR1cC5tYXhDaEluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5tYXhBbmFseXNpc0xlbmd0aFRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4SHlicmlkQmFuZHMsIEZJWFBfRFBLKTsKKyAgICB9CisKKyAgICBpZiAoc2V0dXAuYkVuY01vZGVfMjEyID09IDApIHsKKyAgICAgIC8qIHBwcFByb2NEYXRhSW5fX0ZESyBidWZmZXIgaXMgbm90IG5lZWRlZCBmb3IgU0FDRU5DXzIxMiBtb2RlICovCisgICAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzNEKGhFbmMtPnBwcFByb2NEYXRhSW5fX0ZESywgTUFYX1NQQUNFX1RSRUVfQ0hBTk5FTFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwLm1heEFuYWx5c2lzTGVuZ3RoVGltZVNsb3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5tYXhIeWJyaWRCYW5kcywgRklYUF9EUEspOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9QQVJBTVM7IGkrKykgeworICAgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChoRW5jLT5wRnJhbWVXaW5kb3dBbmFfX0ZES1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXAubWF4QW5hbHlzaXNMZW5ndGhUaW1lU2xvdHMsIEZJWFBfV0lOKTsKKyAgICB9IC8qIGZvciBpICovCisKKyAgICBpZiAoU0FDRU5DX09LICE9IChlcnJvciA9IGZka19zYWNlbmNfZGVsYXlfT3BlbigmaEVuYy0+aERlbGF5KSkpIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAoc2V0dXAuYkVuY01vZGVfMjEyID09IDApIHsKKyAgICAgIC8qIHBwQml0c3RyZWFtRGVsYXlCdWZmZXIgYnVmZmVyIGlzIG5vdCBuZWVkZWQgZm9yIFNBQ0VOQ18yMTIgbW9kZSAqLworICAgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8yRChoRW5jLT5wcEJpdHN0cmVhbURlbGF5QnVmZmVyLCBNQVhfQklUU1RSRUFNX0RFTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfTVBFR1NfQllURVMsIFVDSEFSKTsKKyAgICB9CisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChoRW5jLT5wbk91dHB1dEJpdHMsIE1BWF9CSVRTVFJFQU1fREVMQVksIElOVCk7CisKKyAgICBoRW5jLT5zZXR1cCA9IHNldHVwOyAvKiBzYXZlIGNvbmZpZ3VyYXRpb24gdXNlZCB3aGlsZSBlbmNvZGVyIGFsbG9jYXRpb24uICovCisgICAgbXA0U3BhY2VFbmNfSW5pdERlZmF1bHQoaEVuYyk7CisKKyAgICBpZiAoTlVMTCAhPSBwaE1wNFNwYWNlRW5jKSB7CisgICAgICAqcGhNcDRTcGFjZUVuYyA9IGhFbmM7IC8qIHJldHVybiBlbmNvZGVyIGhhbmRsZSAqLworICAgIH0KKworICB9IC8qIHZhbGlkIGhhbmRsZSAqLworCisgIHJldHVybiBlcnJvcjsKKworYmFpbDoKKyAgaWYgKE5VTEwgIT0gaEVuYykgeworICAgIGhFbmMtPnNldHVwID0gc2V0dXA7CisgICAgRkRLX3NhY2VuY19jbG9zZSgmaEVuYyk7CisgIH0KKyAgcmV0dXJuICgoU0FDRU5DX09LID09IGVycm9yKSA/IFNBQ0VOQ19NRU1PUllfRVJST1IgOiBlcnJvcik7Cit9CisKK3N0YXRpYyBGREtfU0FDRU5DX0VSUk9SIG1wNFNwYWNlRW5jX0luaXREZWZhdWx0KEhBTkRMRV9NUDRTUEFDRV9FTkNPREVSIGhFbmMpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnIgPSBTQUNFTkNfT0s7CisKKyAgLyogR2V0IGRlZmF1bHQgc3RhdGljIGdhaW4gY29uZmlndXJhdGlvbi4gKi8KKyAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyID0gZmRrX3NhY2VuY19zdGF0aWNHYWluX0luaXREZWZhdWx0Q29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgaEVuYy0+aFN0YXRpY0dhaW5Db25maWcpKSkgeworICAgIGdvdG8gYmFpbDsKKyAgfQorCitiYWlsOgorICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiBGREtfc2FjZW5jX2NvbmZpZ3VyZSgKKyAgICBIQU5ETEVfTVA0U1BBQ0VfRU5DT0RFUiBoRW5jLCBjb25zdCBIQU5ETEVfTVA0U1BBQ0VFTkNfU0VUVVAgaFNldHVwKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaEVuYy0+blNhbXBsZVJhdGUgPSBoU2V0dXAtPnNhbXBsZVJhdGU7CisgIGhFbmMtPmVuY01vZGUgPSBoU2V0dXAtPmVuY01vZGU7CisgIGhFbmMtPm5RbWZCYW5kcyA9IG1wNFNwYWNlRW5jX0dldE51bVFtZkJhbmRzKGhFbmMtPm5TYW1wbGVSYXRlKTsKKworICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIHNldCB0aW1lIGRvbWFpbiBkb3dubWl4IGZvciAyMTIgKi8KKyAgaWYgKGhTZXR1cC0+ZW5jTW9kZSA9PSBTQUNFTkNfMjEyICYmIGhTZXR1cC0+YlRpbWVEb21haW5EbXggPT0gMCkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICB9IGVsc2UgeworICAgIGhFbmMtPnVzZVRpbWVEb21Eb3dubWl4ID0gaFNldHVwLT5iVGltZURvbWFpbkRteDsKKyAgfQorCisgIGhFbmMtPnRpbWVBbGlnbm1lbnQgPSBoU2V0dXAtPnRpbWVBbGlnbm1lbnQ7CisgIGhFbmMtPnF1YW50TW9kZSA9IGhTZXR1cC0+cXVhbnRNb2RlOworCisgIGhFbmMtPnVzZUNvYXJzZVF1YW50Q2xkID0gaFNldHVwLT5iVXNlQ29hcnNlUXVhbnQ7CisgIGhFbmMtPnVzZUNvYXJzZVF1YW50Q3BjID0gaFNldHVwLT5iVXNlQ29hcnNlUXVhbnQ7CisgIGhFbmMtPnVzZUZyYW1lS2VlcCA9IChoU2V0dXAtPmJMZE1vZGUgPT0gMik7CisgIGhFbmMtPnVzZUNvYXJzZVF1YW50SWNjID0gMDsgICAgLyogbm90IGF2YWlsYWJsZSAqLworICBoRW5jLT51c2VDb2Fyc2VRdWFudEFyYkRteCA9IDA7IC8qIG5vdCBhdmFpbGFibGUgZm9yIHVzZXIgcmlnaHQgbm93ICovCisgIGhFbmMtPmluZGVwZW5kZW5jeUZhY3RvciA9IGhTZXR1cC0+aW5kZXBlbmRlbmN5RmFjdG9yOworICBoRW5jLT5pbmRlcGVuZGVuY3lDb3VudCA9IDA7CisgIGhFbmMtPmluZGVwZW5kZW5jeUZsYWcgPSAxOworCisgIC8qIHNldCBudW1iZXIgb2YgSHlicmlkIGJhbmRzICovCisgIGhFbmMtPm5IeWJyaWRCYW5kcyA9IGhFbmMtPm5RbWZCYW5kczsKKyAgaEVuYy0+bkZyYW1lVGltZVNsb3RzID0gaFNldHVwLT5mcmFtZVRpbWVTbG90czsKKyAgbXA0U3BhY2VFbmNfSW5pdE51bVBhcmFtQmFuZHMoaEVuYywgaFNldHVwLT5uUGFyYW1CYW5kcyk7CisKKyAgcmV0dXJuIGVycm9yOworfQorCitGREtfU0FDRU5DX0VSUk9SIEZES19zYWNlbmNfaW5pdChIQU5ETEVfTVA0U1BBQ0VfRU5DT0RFUiBoRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGRteERlbGF5KSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgLyogU2FuaXR5IENoZWNrcyAqLworICBpZiAoTlVMTCA9PSBoRW5jKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgY29uc3QgaW50IGluaXRTdGF0ZXNGbGFnID0gMTsKKworICAgIGludCBjaDsgLyogbG9vcCBjb3VudGVyICovCisgICAgaW50IG5DaEluQXJiRG14OworCisgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBGREtfc2FjZW5jX2NvbmZpZ3VyZShoRW5jLCAmaEVuYy0+dXNlcikpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgaEVuYy0+YkVuY01vZGVfMjEyX29ubHkgPSBoRW5jLT5zZXR1cC5iRW5jTW9kZV8yMTI7CisKKyAgICAvKiBTbG90cyBwZXIgRnJhbWUgYW5kIEZyYW1lIExlbmd0aCAqLworICAgIGlmIChoRW5jLT5uRnJhbWVUaW1lU2xvdHMgPCAxKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgICAgaEVuYy0+bkZyYW1lTGVuZ3RoID0gaEVuYy0+blFtZkJhbmRzICogaEVuYy0+bkZyYW1lVGltZVNsb3RzOworCisgICAgaWYgKGhFbmMtPnVzZUZyYW1lS2VlcCA9PSAxKSB7CisgICAgICBoRW5jLT5uQW5hbHlzaXNMZW5ndGhUaW1lU2xvdHMgPSAzICogaEVuYy0+bkZyYW1lVGltZVNsb3RzOworICAgICAgaEVuYy0+blVwZGF0ZUh5YnJpZFBvc2l0aW9uVGltZVNsb3RzID0gaEVuYy0+bkZyYW1lVGltZVNsb3RzOworICAgIH0gZWxzZSB7CisgICAgICBoRW5jLT5uQW5hbHlzaXNMZW5ndGhUaW1lU2xvdHMgPSAyICogaEVuYy0+bkZyYW1lVGltZVNsb3RzOworICAgICAgaEVuYy0+blVwZGF0ZUh5YnJpZFBvc2l0aW9uVGltZVNsb3RzID0gMDsKKyAgICB9CisKKyAgICB7CisgICAgICBoRW5jLT5uQW5hbHlzaXNMb29rYWhlYWRUaW1lU2xvdHMgPQorICAgICAgICAgIGhFbmMtPm5BbmFseXNpc0xlbmd0aFRpbWVTbG90cyAtIDMgKiBoRW5jLT5uRnJhbWVUaW1lU2xvdHMgLyAyOworICAgIH0KKworICAgIC8qIGluaXQgcGFyYW1ldGVyQmFuZDJoeWJyaWRCYW5kT2Zmc2V0IHRhYmxlICovCisgICAgZmRrX3NhY2VuY19jYWxjUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0KAorICAgICAgICAoQk9YX1NVQkJBTkRfQ09ORklHKWhFbmMtPm5QYXJhbUJhbmRzLCBoRW5jLT5uSHlicmlkQmFuZHMsCisgICAgICAgIGhFbmMtPnBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXQpOworCisgICAgLyogRmlsbCBTZXR1cCBzdHJ1Y3R1cmUgZm9yIFNwYWNlIFRyZWUgKi8KKyAgICBpZiAoU0FDRU5DX09LICE9CisgICAgICAgIChlcnJvciA9IG1wNFNwYWNlRW5jX0ZpbGxTcGFjZVRyZWVTZXR1cChoRW5jLCAmaEVuYy0+c3BhY2VUcmVlU2V0dXApKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qIEluaXQgc3BhY2UgdHJlZSBjb25maWd1cmF0aW9uICovCisgICAgaWYgKFNBQ0VOQ19PSyAhPQorICAgICAgICAoZXJyb3IgPSBmZGtfc2FjZW5jX3NwYWNlVHJlZV9Jbml0KAorICAgICAgICAgICAgIGhFbmMtPmhTcGFjZVRyZWUsICZoRW5jLT5zcGFjZVRyZWVTZXR1cCwKKyAgICAgICAgICAgICBoRW5jLT5wUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0LCBoRW5jLT51c2VGcmFtZUtlZXApKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qIEdldCBzcGFjZSB0cmVlIGRlc2NyaXB0aW9uIGFuZCByZXN1bHRpbmcgbnVtYmVyIG9mIGlucHV0L291dHB1dCBjaGFubmVscworICAgICAqLworICAgIHsKKyAgICAgIFNQQUNFX1RSRUVfREVTQ1JJUFRJT04gc3BhY2VUcmVlRGVzY3JpcHRpb247CisKKyAgICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZmRrX3NhY2VuY19zcGFjZVRyZWVfR2V0RGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVuYy0+aFNwYWNlVHJlZSwgJnNwYWNlVHJlZURlc2NyaXB0aW9uKSkpIHsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorCisgICAgICBoRW5jLT5uSW5wdXRDaGFubmVscyA9CisgICAgICAgICAgc3BhY2VUcmVlRGVzY3JpcHRpb24ubk91dENoYW5uZWxzOyAvKiBzcGFjZSB0cmVlIGRlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmliZXMgZGVjb2RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiAqLworICAgICAgaEVuYy0+bk91dHB1dENoYW5uZWxzID0KKyAgICAgICAgICBzcGFjZVRyZWVEZXNjcmlwdGlvbi5uSW5DaGFubmVsczsgLyogc3BhY2UgdHJlZSBkZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmliZXMgZGVjb2RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uICovCisgICAgfQorCisgICAgbkNoSW5BcmJEbXggPSAwOworCisgICAgLyogSU5JVElBTElaQVRJT04gKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBoRW5jLT5uSW5wdXRDaGFubmVsczsgY2grKykgeworICAgICAgLyogc2NhbGluZyBpbiBhbmFseXNpcyBxbWYgZmlsdGVyYmFuayAoNykgKi8KKyAgICAgIGhFbmMtPnBFbmNvZGVySW5wdXRDaFNjYWxlW2NoXSA9IDc7CisKKyAgICAgIHsKKyAgICAgICAgLyogYWRkaXRpb25hbCBzY2FsaW5nIGluIHFtZiBwcm90b3R5cGUgZmlsdGVyIGZvciBsb3cgZGVsYXkgKi8KKyAgICAgICAgaEVuYy0+cEVuY29kZXJJbnB1dENoU2NhbGVbY2hdICs9IDE7CisgICAgICB9CisKKyAgICAgIHsgaEVuYy0+cEVuY29kZXJJbnB1dENoU2NhbGVbY2hdICs9IERDX0ZJTFRFUl9TRjsgfQorICAgIH0gLyogbklucHV0Q2hhbm5lbHMgKi8KKworICAgIC8qIEluaXQgYW5hbHlzaXMgZmlsdGVyYmFuayAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IGhFbmMtPm5JbnB1dENoYW5uZWxzOyBjaCsrKSB7CisgICAgICBoRW5jLT5waFFtZkZpbHRJbl9fRkRLW2NoXS0+ZmxhZ3MgPQorICAgICAgICAgIHVwZGF0ZVFtZkZsYWdzKGhFbmMtPnBoUW1mRmlsdEluX19GREtbY2hdLT5mbGFncywgIWluaXRTdGF0ZXNGbGFnKTsKKworICAgICAgaWYgKDAgIT0gcW1mSW5pdEFuYWx5c2lzRmlsdGVyQmFuaygKKyAgICAgICAgICAgICAgICAgICBoRW5jLT5waFFtZkZpbHRJbl9fRkRLW2NoXSwKKyAgICAgICAgICAgICAgICAgICAoRklYUF9RQVMgKiloRW5jLT5waFFtZkZpbHRJbl9fRkRLW2NoXS0+RmlsdGVyU3RhdGVzLCAxLAorICAgICAgICAgICAgICAgICAgIGhFbmMtPm5RbWZCYW5kcywgaEVuYy0+blFtZkJhbmRzLCBoRW5jLT5uUW1mQmFuZHMsCisgICAgICAgICAgICAgICAgICAgaEVuYy0+cGhRbWZGaWx0SW5fX0ZES1tjaF0tPmZsYWdzKSkgeworICAgICAgICBlcnJvciA9IFNBQ0VOQ19JTklUX0VSUk9SOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSBEQyBGaWx0ZXIuICovCisgICAgeworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgaEVuYy0+bklucHV0Q2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBmZGtfc2FjZW5jX2luaXREQ0ZpbHRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbmMtPnBoRENGaWx0ZXJTaWdJbltjaF0sIGhFbmMtPm5TYW1wbGVSYXRlKSkpIHsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJbml0IG9uc2V0IGRldGVjdC4gKi8KKyAgICB7CisgICAgICAvKiBpbml0IG9uc2V0IGRldGVjdCBjb25maWd1cmF0aW9uIHN0cnVjdCAqLworICAgICAgT05TRVRfREVURUNUX0NPTkZJRyBvbnNldERldGVjdENvbmZpZzsKKyAgICAgIG9uc2V0RGV0ZWN0Q29uZmlnLm1heFRpbWVTbG90cyA9IGhFbmMtPm5GcmFtZVRpbWVTbG90czsKKyAgICAgIG9uc2V0RGV0ZWN0Q29uZmlnLmxvd2VyQm91bmRPbnNldERldGVjdGlvbiA9CisgICAgICAgICAgZnJlcTJIeWJyaWRCYW5kKDE3MjUsIGhFbmMtPm5TYW1wbGVSYXRlLCBoRW5jLT5uUW1mQmFuZHMpOworICAgICAgb25zZXREZXRlY3RDb25maWcudXBwZXJCb3VuZE9uc2V0RGV0ZWN0aW9uID0gaEVuYy0+bkh5YnJpZEJhbmRzOworCisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBoRW5jLT5uSW5wdXRDaGFubmVsczsgY2grKykgeworICAgICAgICBpZiAoU0FDRU5DX09LICE9IChlcnJvciA9IGZka19zYWNlbmNfb25zZXREZXRlY3RfSW5pdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbmMtPnBoT25zZXRbY2hdLCAmb25zZXREZXRlY3RDb25maWcsIDEpKSkgeworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgIC8qIGluaXQgd2luZG93aW5nICovCisgICAgICBGUkFNRVdJTkRPV19DT05GSUcgZnJhbWV3aW5kb3dDb25maWc7CisgICAgICBmcmFtZXdpbmRvd0NvbmZpZy5uVGltZVNsb3RzTWF4ID0gaEVuYy0+bkZyYW1lVGltZVNsb3RzOworICAgICAgZnJhbWV3aW5kb3dDb25maWcuYkZyYW1lS2VlcCA9IGhFbmMtPnVzZUZyYW1lS2VlcDsKKworICAgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBmZGtfc2FjZW5jX2ZyYW1lV2luZG93X0luaXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVuYy0+aEZyYW1lV2luZG93LCAmZnJhbWV3aW5kb3dDb25maWcpKSkgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfQorCisgICAgLyogU2V0IGVuY29kZXIgbW9kZSBmb3Igc3RhdGljIGdhaW4gaW5pdGlhbGl6YXRpb24uICovCisgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fU2V0RW5jTW9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaEVuYy0+aFN0YXRpY0dhaW5Db25maWcsIGhFbmMtPmVuY01vZGUpKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qIEluaXQgc3RhdGljIGdhaW4uICovCisgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fSW5pdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaEVuYy0+aFN0YXRpY0dhaW4sIGhFbmMtPmhTdGF0aWNHYWluQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmKGhFbmMtPnN0YXRpY0dhaW5TY2FsZSkpKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGZvciAoY2ggPSAwOyBjaCA8IGhFbmMtPm5JbnB1dENoYW5uZWxzOyBjaCsrKSB7CisgICAgICBoRW5jLT5wRW5jb2RlcklucHV0Q2hTY2FsZVtjaF0gKz0gaEVuYy0+c3RhdGljR2FpblNjYWxlOworICAgIH0KKworICAgIC8qIGVuaGFuY2VkIGRvd25taXggZm9yIHN0ZXJlbyBpbnB1dCovCisgICAgaWYgKGhFbmMtPnVzZVRpbWVEb21Eb3dubWl4ICE9IDApIHsKKyAgICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZmRrX3NhY2VuY19pbml0X2VuaGFuY2VkVGltZURvbWFpbkRteCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW5jLT5oRW5oYW5jZWRUaW1lRG14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZka19zYWNlbmNfZ2V0UHJlR2FpblB0ckZESyhoRW5jLT5oU3RhdGljR2FpbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVuYy0+c3RhdGljR2FpblNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZka19zYWNlbmNfZ2V0UG9zdEdhaW5GREsoaEVuYy0+aFN0YXRpY0dhaW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbmMtPnN0YXRpY0dhaW5TY2FsZSwgaEVuYy0+bkZyYW1lTGVuZ3RoKSkpIHsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgIH0KKworICAgIC8qIENyZWF0ZSBjb25maWcgc3RydWN0dXJlIGZvciBiaXRzdHJlYW0gZm9ybWF0dGVyIGluY2x1ZGluZyBhcmJpdHJhcnkKKyAgICAgKiBkb3dubWl4IHJlc2lkdWFsICovCisgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBmZGtfc2FjZW5jX2luaXRTcGF0aWFsQml0c3RyZWFtRW5jb2RlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaEVuYy0+aEJpdHN0cmVhbUZvcm1hdHRlcikpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBGaWxsU3BhdGlhbFNwZWNpZmljQ29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICBoRW5jLCBmZGtfc2FjZW5jX2dldFNwYXRpYWxTcGVjaWZpY0NvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbmMtPmhCaXRzdHJlYW1Gb3JtYXR0ZXIpKSkpIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAoU0FDRU5DX09LICE9CisgICAgICAgIChlcnJvciA9IGZka19zYWNlbmNfd3JpdGVTcGF0aWFsU3BlY2lmaWNDb25maWcoCisgICAgICAgICAgICAgZmRrX3NhY2VuY19nZXRTcGF0aWFsU3BlY2lmaWNDb25maWcoaEVuYy0+aEJpdHN0cmVhbUZvcm1hdHRlciksCisgICAgICAgICAgICAgaEVuYy0+c3NjQnVmLnBTc2MsIE1BWF9TU0NfQllURVMsICZoRW5jLT5zc2NCdWYublNzY1NpemVCaXRzKSkpIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBpbml0IGRlbGF5IGNvbXBlbnNhdGlvbiB3aXRoIGRteCBjb3JlIGNvZGVyIGRlbGF5OyBpZiBubyBjb3JlIGNvZGVyIGlzCisgICAgICogdXNlZCwgbWFueSBvdGhlciBidWZmZXJzIGFyZSBpbml0aWFsaXplZCBuZXZlcnRoZWxlc3MgKi8KKyAgICBpZiAoU0FDRU5DX09LICE9CisgICAgICAgIChlcnJvciA9IG1wNFNwYWNlRW5jX0luaXREZWxheUNvbXBlbnNhdGlvbihoRW5jLCBkbXhEZWxheSkpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogSG93IG11Y2ggaW5wdXQgZG8gd2UgbmVlZD8gKi8KKyAgICBoRW5jLT5uU2FtcGxlc05leHQgPQorICAgICAgICBoRW5jLT5uRnJhbWVMZW5ndGggKiAoaEVuYy0+bklucHV0Q2hhbm5lbHMgKyBuQ2hJbkFyYkRteCk7CisgICAgaEVuYy0+blNhbXBsZXNWYWxpZCA9IDA7CisgIH0gLyogdmFsaWQgaGFuZGxlICovCisKK2JhaWw6CisgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIElOVCBnZXRBbmFseXNpc0xlbmd0aFRpbWVTbG90cyhGSVhQX1dJTiAqcEZyYW1lV2luZG93QW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblRpbWVTbG90cykgeworICBpbnQgaTsKKyAgZm9yIChpID0gblRpbWVTbG90cyAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgaWYgKHBGcmFtZVdpbmRvd0FuYVtpXSAhPSAoRklYUF9XSU4pMCkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIG5UaW1lU2xvdHMgPSBpICsgMTsKKyAgcmV0dXJuIG5UaW1lU2xvdHM7Cit9CisKK3N0YXRpYyBJTlQgZ2V0QW5hbHlzaXNTdGFydFRpbWVTbG90KEZJWFBfV0lOICpwRnJhbWVXaW5kb3dBbmEsIElOVCBuVGltZVNsb3RzKSB7CisgIGludCBzdGFydFRpbWVTbG90ID0gMDsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBuVGltZVNsb3RzOyBpKyspIHsKKyAgICBpZiAocEZyYW1lV2luZG93QW5hW2ldICE9IChGSVhQX1dJTikwKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgc3RhcnRUaW1lU2xvdCA9IGk7CisgIHJldHVybiBzdGFydFRpbWVTbG90OworfQorCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiBfX0ZlZWREZWludGVyUHJlU2NhbGUoCisgICAgSEFORExFX01QNFNQQUNFX0VOQ09ERVIgaEVuYywgSU5UX1BDTSBjb25zdCAqY29uc3QgcFNhbXBsZXMsCisgICAgSU5UX1BDTSAqY29uc3QgcE91dHB1dFNhbXBsZXMsIElOVCBjb25zdCBuU2FtcGxlcywKKyAgICBVSU5UIGNvbnN0IGlzSW5wdXRJbnRlcmxlYXZlZCwgVUlOVCBjb25zdCBpbnB1dEJ1ZmZlclNpemVQZXJDaGFubmVsLAorICAgIFVJTlQgKmNvbnN0IHBuU2FtcGxlc0ZlZCkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgoaEVuYyA9PSBOVUxMKSB8fCAocFNhbXBsZXMgPT0gTlVMTCkgfHwgKHBuU2FtcGxlc0ZlZCA9PSBOVUxMKSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgaWYgKG5TYW1wbGVzID09IDApIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsgLyogRmx1c2hpbmcgbm90IGltcGxlbWVudGVkICovCisgIH0gZWxzZSB7CisgICAgaW50IGNoOworICAgIGNvbnN0IElOVCBuQ2hJbiA9IGhFbmMtPm5JbnB1dENoYW5uZWxzOworICAgIGNvbnN0IElOVCBuQ2hJbldpdGhEbXggPSBuQ2hJbjsKKyAgICBjb25zdCBJTlQgc2FtcGxlc1RvRmVlZCA9CisgICAgICAgIEZES21pbihuU2FtcGxlcywgaEVuYy0+blNhbXBsZXNOZXh0IC0gaEVuYy0+blNhbXBsZXNWYWxpZCk7CisgICAgY29uc3QgSU5UIG5TYW1wbGVzUGVyQ2hhbm5lbCA9IHNhbXBsZXNUb0ZlZWQgLyBuQ2hJbldpdGhEbXg7CisKKyAgICBpZiAoKHNhbXBsZXNUb0ZlZWQgPCAwKSB8fCAoc2FtcGxlc1RvRmVlZCAlIG5DaEluV2l0aERteCAhPSAwKSB8fAorICAgICAgICAoc2FtcGxlc1RvRmVlZCA+IG5DaEluV2l0aERteCAqIChJTlQpaEVuYy0+bkZyYW1lTGVuZ3RoKSkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgIGludCBpOworCisgICAgY29uc3QgSU5UX1BDTSAqcElucHV0X19GREs7CisgICAgY29uc3QgSU5UX1BDTSAqcElucHV0Ml9fRkRLOworCisgICAgeyAvKiBubyBkbXggYWxpZ24gPSBkZWZhdWx0Ki8KKyAgICAgIHBJbnB1dF9fRkRLID0gcFNhbXBsZXM7CisgICAgICBwSW5wdXQyX19GREsgPSBwU2FtcGxlcyArIChoRW5jLT5uSW5wdXREZWxheSAqIG5DaEluV2l0aERteCk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGhFbmMtPm5JbnB1dENoYW5uZWxzOyBpKyspIHsKKyAgICAgIGhFbmMtPnN0YXRpY1RpbWVEb21haW5EbXhJblNjYWxlW2ldID0gaEVuYy0+c3RhdGljR2FpblNjYWxlOworICAgIH0KKworICAgIC8qKioqKiAgICAgICAgTi1jaGFubmVsLWlucHV0ICAgICAqKioqKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hJbjsgY2grKykgeworICAgICAgLyogV3JpdGUgZGVsYXllZCB0aW1lIHNpZ25hbCBpbnRvIHRpbWUgc2lnbmFsIGJ1ZmZlciAqLworICAgICAgRkRLbWVtY3B5KCYoaEVuYy0+cHBUaW1lU2lnSW5fX0ZES1tjaF1bMF0pLAorICAgICAgICAgICAgICAgICYoaEVuYy0+cHBUaW1lU2lnRGVsYXlJbl9fRkRLW2NoXVswXSksCisgICAgICAgICAgICAgICAgaEVuYy0+blN1cnJvdW5kQW5hbHlzaXNCdWZmZXJEZWxheSAqIHNpemVvZihJTlRfUENNKSk7CisKKyAgICAgIGlmIChpc0lucHV0SW50ZXJsZWF2ZWQpIHsKKyAgICAgICAgLyogQWRkIHRoZSBuZXcgZnJhbWUgZGUtaW50ZXJsZWF2ZWQuIEFwcGx5IG5TdXJyb3VuZEFuYWx5c2lzQnVmZmVyRGVsYXkuCisgICAgICAgICAqLworICAgICAgICBGREttZW1jcHlfZmxleCgKKyAgICAgICAgICAgICYoaEVuYy0+cHBUaW1lU2lnSW5fX0ZES1tjaF1baEVuYy0+blN1cnJvdW5kQW5hbHlzaXNCdWZmZXJEZWxheV0pLAorICAgICAgICAgICAgMSwgcElucHV0X19GREsgKyBjaCwgbkNoSW5XaXRoRG14LCBoRW5jLT5uSW5wdXREZWxheSk7CisgICAgICAgIEZES21lbWNweV9mbGV4KAorICAgICAgICAgICAgJihoRW5jLT5wcFRpbWVTaWdJbl9fRkRLW2NoXVtoRW5jLT5uU3Vycm91bmRBbmFseXNpc0J1ZmZlckRlbGF5ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVuYy0+bklucHV0RGVsYXldKSwKKyAgICAgICAgICAgIDEsIHBJbnB1dDJfX0ZESyArIGNoLCBuQ2hJbldpdGhEbXgsCisgICAgICAgICAgICBuU2FtcGxlc1BlckNoYW5uZWwgLSBoRW5jLT5uSW5wdXREZWxheSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBJbnB1dCBpcyBhbHJlYWR5IGRlaW50ZXJsZWF2ZWQsIGp1c3QgY29weSAqLworICAgICAgICBGREttZW1jcHkoCisgICAgICAgICAgICAmKGhFbmMtPnBwVGltZVNpZ0luX19GREtbY2hdW2hFbmMtPm5TdXJyb3VuZEFuYWx5c2lzQnVmZmVyRGVsYXldKSwKKyAgICAgICAgICAgIHBJbnB1dF9fRkRLICsgY2ggKiBpbnB1dEJ1ZmZlclNpemVQZXJDaGFubmVsLAorICAgICAgICAgICAgaEVuYy0+bklucHV0RGVsYXkgKiBzaXplb2YoSU5UX1BDTSkpOworICAgICAgICBGREttZW1jcHkoCisgICAgICAgICAgICAmKGhFbmMtPnBwVGltZVNpZ0luX19GREtbY2hdW2hFbmMtPm5TdXJyb3VuZEFuYWx5c2lzQnVmZmVyRGVsYXkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW5jLT5uSW5wdXREZWxheV0pLAorICAgICAgICAgICAgcElucHV0Ml9fRkRLICsgY2ggKiBpbnB1dEJ1ZmZlclNpemVQZXJDaGFubmVsLAorICAgICAgICAgICAgKG5TYW1wbGVzUGVyQ2hhbm5lbCAtIGhFbmMtPm5JbnB1dERlbGF5KSAqIHNpemVvZihJTlRfUENNKSk7CisgICAgICB9CisKKyAgICAgIC8qIFVwZGF0ZSB0aW1lIHNpZ25hbCBkZWxheSBidWZmZXIgKi8KKyAgICAgIEZES21lbWNweSgmKGhFbmMtPnBwVGltZVNpZ0RlbGF5SW5fX0ZES1tjaF1bMF0pLAorICAgICAgICAgICAgICAgICYoaEVuYy0+cHBUaW1lU2lnSW5fX0ZES1tjaF1baEVuYy0+bkZyYW1lTGVuZ3RoXSksCisgICAgICAgICAgICAgICAgaEVuYy0+blN1cnJvdW5kQW5hbHlzaXNCdWZmZXJEZWxheSAqIHNpemVvZihJTlRfUENNKSk7CisgICAgfSAvKiBmb3IgY2ggKi8KKworICAgIC8qKioqKiAgICAgIE5vIEFyYml0cmFyeSBEb3dubWl4ICAgICAgKioqKiovCisgICAgLyogIkNydWRlIFREIERteCI6IFRpbWUgRG9tYWluRG93bm1peCArIE5PIEFyYml0cmFyeSBEb3dubWl4LCBEZWxheSBBZGRlZCBhdAorICAgICAqIHBPdXRwdXRCdWZmZXIgKi8KKyAgICBpZiAoKGhFbmMtPnVzZVRpbWVEb21Eb3dubWl4ID4gMCkpIHsKKyAgICAgIGlmICgoaEVuYy0+dXNlVGltZURvbURvd25taXggPT0gMSkgfHwgKGhFbmMtPm5JbnB1dENoYW5uZWxzICE9IDIpKSB7CisgICAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBlbmhhbmNlZCB0aW1lIGRvbWFpbiBkb3dubWl4IChmb3Igc3RlcmVvIGlucHV0KSAqLworICAgICAgICBpZiAoaEVuYy0+ZW5jTW9kZSA9PSBTQUNFTkNfMjEyKSB7CisgICAgICAgICAgaWYgKHBPdXRwdXRTYW1wbGVzID09IE5VTEwpIHsKKyAgICAgICAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgIH0KKworICAgICAgICAgIGZka19zYWNlbmNfYXBwbHlfZW5oYW5jZWRUaW1lRG9tYWluRG14KAorICAgICAgICAgICAgICBoRW5jLT5oRW5oYW5jZWRUaW1lRG14LCBoRW5jLT5wcFRpbWVTaWdJbl9fRkRLLCBwT3V0cHV0U2FtcGxlcywKKyAgICAgICAgICAgICAgaEVuYy0+blN1cnJvdW5kQW5hbHlzaXNCdWZmZXJEZWxheSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKCZoRW5jLT5wcFRpbWVTaWdPdXRfX0ZES1swXVswXSA9PSBOVUxMKSB7CisgICAgICAgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmZGtfc2FjZW5jX2FwcGx5X2VuaGFuY2VkVGltZURvbWFpbkRteCgKKyAgICAgICAgICAgICAgaEVuYy0+aEVuaGFuY2VkVGltZURteCwgaEVuYy0+cHBUaW1lU2lnSW5fX0ZESywKKyAgICAgICAgICAgICAgJmhFbmMtPnBwVGltZVNpZ091dF9fRkRLWzBdWzBdLAorICAgICAgICAgICAgICBoRW5jLT5uU3Vycm91bmRBbmFseXNpc0J1ZmZlckRlbGF5KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIHVwZGF0ZSBudW1iZXIgb2Ygc2FtcGxlcyBzdGlsbCB0byBwcm9jZXNzICovCisgICAgaEVuYy0+blNhbXBsZXNWYWxpZCArPSBzYW1wbGVzVG9GZWVkOworCisgICAgLypyZXR1cm4gbnVtYmVyIG9mIGZlZCBzYW1wbGVzICovCisgICAgKnBuU2FtcGxlc0ZlZCA9IHNhbXBsZXNUb0ZlZWQ7CisgIH0KK2JhaWw6CisgIHJldHVybiBlcnJvcjsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBGREtfc2FjZW5jX2VuY29kZShjb25zdCBIQU5ETEVfTVA0U1BBQ0VfRU5DT0RFUiBoTXA0U3BhY2VFbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZES19idWZEZXNjciAqaW5CdWZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGREtfYnVmRGVzY3IgKm91dEJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNBQ0VOQ19JbkFyZ3MgKmluYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FDRU5DX091dEFyZ3MgKm91dGFyZ3MpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBjb25zdCBJTlRfUENNICpwSW5wdXRTYW1wbGVzID0KKyAgICAgIChjb25zdCBJTlRfUENNICopaW5CdWZEZXNjLT5wcEJhc2VbZ2V0QnVmRGVzY0lkeCgKKyAgICAgICAgICBpbkJ1ZkRlc2MsIChGREtfQlVGX1RZUEVfSU5QVVQgfCBGREtfQlVGX1RZUEVfUENNX0RBVEEpKV07CisKKyAgSU5UX1BDTSAqY29uc3QgcE91dHB1dFNhbXBsZXMgPSAoSU5UX1BDTSAqKW91dEJ1ZkRlc2MtPnBwQmFzZVtnZXRCdWZEZXNjSWR4KAorICAgICAgb3V0QnVmRGVzYywgKEZES19CVUZfVFlQRV9PVVRQVVQgfCBGREtfQlVGX1RZUEVfUENNX0RBVEEpKV07CisKKyAgY29uc3QgaW50IG5PdXRwdXRTYW1wbGVzQnVmZmVyU2l6ZSA9CisgICAgICBvdXRCdWZEZXNjLT5wQnVmU2l6ZVtnZXRCdWZEZXNjSWR4KAorICAgICAgICAgIG91dEJ1ZkRlc2MsIChGREtfQlVGX1RZUEVfT1VUUFVUIHwgRkRLX0JVRl9UWVBFX1BDTV9EQVRBKSldIC8KKyAgICAgIG91dEJ1ZkRlc2MtPnBFbGVTaXplW2dldEJ1ZkRlc2NJZHgoCisgICAgICAgICAgb3V0QnVmRGVzYywgKEZES19CVUZfVFlQRV9PVVRQVVQgfCBGREtfQlVGX1RZUEVfUENNX0RBVEEpKV07CisKKyAgaWYgKChoTXA0U3BhY2VFbmMgPT0gTlVMTCkgfHwgKHBJbnB1dFNhbXBsZXMgPT0gTlVMTCkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbk91dHB1dFNhbXBsZXM7CisgICAgaW50IGksIGNoLCBwcywgd2luQ250LCB0cywgc2xvdDsKKyAgICBJTlQgY3VyclRyYW5zUG9zID0gLTE7CisgICAgU1BBVElBTEZSQU1FICpwRnJhbWVEYXRhID0gTlVMTDsKKworICAgIC8qIEltcHJvdmUgQ29kZSBSZWFkYWJpbGl0eSAqLworICAgIGNvbnN0IGludCBuQ2hJbiA9IGhNcDRTcGFjZUVuYy0+bklucHV0Q2hhbm5lbHM7CisgICAgY29uc3QgaW50IG5DaEluV2l0aERteCA9IG5DaEluOworICAgIGNvbnN0IGludCBuQ2hPdXQgPSBoTXA0U3BhY2VFbmMtPm5PdXRwdXRDaGFubmVsczsKKyAgICBjb25zdCBpbnQgblNhbXBsZXNQZXJDaGFubmVsID0gaW5hcmdzLT5uSW5wdXRTYW1wbGVzIC8gbkNoSW5XaXRoRG14OworICAgIGNvbnN0IGludCBuT3V0cHV0U2FtcGxlc01heCA9IG5TYW1wbGVzUGVyQ2hhbm5lbCAqIG5DaE91dDsKKyAgICBjb25zdCBpbnQgbkZyYW1lVGltZVNsb3RzID0gaE1wNFNwYWNlRW5jLT5uRnJhbWVUaW1lU2xvdHM7CisKKyAgICBJTlQgZW5jb2RlcklucHV0Q2hTY2FsZVtTQUNFTkNfTUFYX0lOUFVUX0NIQU5ORUxTXTsKKyAgICBJTlQgbkZyYW1lVGltZVNsb3RzUmVkdWN0aW9uID0gMDsKKworICAgIGlmIChoTXA0U3BhY2VFbmMtPmVuY01vZGUgPT0gU0FDRU5DXzIxMikgeworICAgICAgbkZyYW1lVGltZVNsb3RzUmVkdWN0aW9uID0gaE1wNFNwYWNlRW5jLT5uRnJhbWVUaW1lU2xvdHMgPj4gMTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbkNoSW47IGkrKykKKyAgICAgIGVuY29kZXJJbnB1dENoU2NhbGVbaV0gPSBoTXA0U3BhY2VFbmMtPnBFbmNvZGVySW5wdXRDaFNjYWxlW2ldOworCisgICAgLyogU2FuaXR5IENoZWNrICovCisgICAgaWYgKCgwICE9IGluYXJncy0+bklucHV0U2FtcGxlcyAlIG5DaEluV2l0aERteCkpIHsKKyAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIC8qCisgICAgICogR2V0IEZyYW1lIERhdGEgSGFuZGxlLgorICAgICAqLworCisgICAgLyogZ2V0IGJpdHN0cmVhbSBoYW5kbGUgKGZvciBzdG9yYWdlIG9mIGNsZCdzLCBpY2MncyBhbmQgc28gb24pCisgICAgICogZ2V0IHNwYXRpYWxmcmFtZSAyIGZyYW1lcyBpbiB0aGUgZnV0dXJlOyBOT1RFOiB0aGlzIGlzIG5lY2Vzc2FyeSB0bworICAgICAqIHN5bmNocm9uaXNlIHNwYXRpYWwgZGF0YSBhbmQgYXVkaW8gZGF0YSAqLworICAgIGlmIChOVUxMID09IChwRnJhbWVEYXRhID0gZmRrX3NhY2VuY19nZXRTcGF0aWFsRnJhbWUoCisgICAgICAgICAgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPmhCaXRzdHJlYW1Gb3JtYXR0ZXIsIFdSSVRFX1NQQVRJQUxGUkFNRSkpKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBJbmRlcGVuZGVudCBGcmFtZXMgQ291bnRlcnMqLworICAgIGlmIChoTXA0U3BhY2VFbmMtPm5EaXNjYXJkT3V0RnJhbWVzID4KKyAgICAgICAgMCkgeyAvKiBJbmRlcGVuZGVudCBGcmFtZXMgaWYgdGhleSBzaG91bGQgYmUgZGlzY2FyZGVkLCBSZXNldCBDb3VudGVyKi8KKyAgICAgIGhNcDRTcGFjZUVuYy0+aW5kZXBlbmRlbmN5Q291bnQgPQorICAgICAgICAgIDA7IC8qIFJlc2V0IHRoZSBjb3VudGVyLCBmaXJzdCB2YWxpZCBmcmFtZSBpcyBhbiBpbmRlcGVuZGVudCBvbmUqLworICAgICAgaE1wNFNwYWNlRW5jLT5pbmRlcGVuZGVuY3lGbGFnID0gMTsKKyAgICB9IGVsc2UgeyAvKmhNcDRTcGFjZUVuYy0+bkRpc2NhcmRPdXRGcmFtZXMgPT0gMCovCisgICAgICBoTXA0U3BhY2VFbmMtPmluZGVwZW5kZW5jeUZsYWcgPQorICAgICAgICAgIChoTXA0U3BhY2VFbmMtPmluZGVwZW5kZW5jeUNvdW50ID09IDApID8gMSA6IDA7CisgICAgICBpZiAoaE1wNFNwYWNlRW5jLT5pbmRlcGVuZGVuY3lGYWN0b3IgPiAwKSB7CisgICAgICAgIGhNcDRTcGFjZUVuYy0+aW5kZXBlbmRlbmN5Q291bnQrKzsKKyAgICAgICAgaE1wNFNwYWNlRW5jLT5pbmRlcGVuZGVuY3lDb3VudCA9CisgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPmluZGVwZW5kZW5jeUNvdW50ICUKKyAgICAgICAgICAgICgoaW50KWhNcDRTcGFjZUVuYy0+aW5kZXBlbmRlbmN5RmFjdG9yKTsKKyAgICAgIH0gZWxzZSB7IC8qIGluZGVwZW5kZW5jeUZhY3RvciA9PSAwICovCisgICAgICAgIGhNcDRTcGFjZUVuYy0+aW5kZXBlbmRlbmN5Q291bnQgPSAtMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRpbWUgc2lnbmFsIHByZXByb2Nlc3Npbmc6CisgICAgICogLSBGZWVkIGlucHV0IGJ1ZmZlcgorICAgICAqIC0gUHJlc2NhbGUgdGltZSBzaWduYWwKKyAgICAgKiAtIEFwcGx5IERDIGZpbHRlciBvbiBpbnB1dCBzaWduYWwKKyAgICAgKi8KKworICAgIC8qIEZlZWQsIERlaW50ZXJsZWF2ZSwgUHJlLVNjYWxlIHRoZSBpbnB1dCB0aW1lIHNpZ25hbHMgKi8KKyAgICBpZiAoU0FDRU5DX09LICE9CisgICAgICAgIChlcnJvciA9IF9fRmVlZERlaW50ZXJQcmVTY2FsZSgKKyAgICAgICAgICAgICBoTXA0U3BhY2VFbmMsIHBJbnB1dFNhbXBsZXMsIHBPdXRwdXRTYW1wbGVzLCBpbmFyZ3MtPm5JbnB1dFNhbXBsZXMsCisgICAgICAgICAgICAgaW5hcmdzLT5pc0lucHV0SW50ZXJsZWF2ZWQsIGluYXJncy0+aW5wdXRCdWZmZXJTaXplUGVyQ2hhbm5lbCwKKyAgICAgICAgICAgICAmb3V0YXJncy0+blNhbXBsZXNDb25zdW1lZCkpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgaWYgKGhNcDRTcGFjZUVuYy0+blNhbXBsZXNOZXh0ICE9IGhNcDRTcGFjZUVuYy0+blNhbXBsZXNWYWxpZCkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgaWYgKGhNcDRTcGFjZUVuYy0+ZW5jTW9kZSA9PSBTQUNFTkNfMjEyICYmCisgICAgICAgIGhNcDRTcGFjZUVuYy0+YkVuY01vZGVfMjEyX29ubHkpIHsKKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaEluOyBjaCsrKSB7CisgICAgICAgIGZvciAoc2xvdCA9IDA7IHNsb3QgPCBuRnJhbWVUaW1lU2xvdHM7IHNsb3QrKykgeworICAgICAgICAgIHNldENwbHhWZWMoCisgICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+cHBwSHlicmlkSW5fX0ZESworICAgICAgICAgICAgICAgICAgW2NoXVtoTXA0U3BhY2VFbmMtPm5VcGRhdGVIeWJyaWRQb3NpdGlvblRpbWVTbG90cyArCisgICAgICAgICAgICAgICAgICAgICAgIG5GcmFtZVRpbWVTbG90cyAtIG5GcmFtZVRpbWVTbG90c1JlZHVjdGlvbiArIHNsb3RdLAorICAgICAgICAgICAgICAoRklYUF9EQkwpMCwgaE1wNFNwYWNlRW5jLT5uSHlicmlkQmFuZHMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaW1lIC8gRnJlcXVlbmN5OgorICAgICAqIC0gVC9GIGF1ZGlvIGlucHV0IGNoYW5uZWxzCisgICAgICogLSBUL0YgYXJiaXRyYXJ5IGRvd25taXggaW5wdXQgY2hhbm5lbHMKKyAgICAgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hJbjsgY2grKykgeworICAgICAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChwUW1mSW5SZWFsLCBGSVhQX0RCTCwgTUFYX1FNRl9CQU5EUykKKyAgICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQocFFtZkluSW1hZywgRklYUF9EQkwsIE1BWF9RTUZfQkFORFMpCisgICAgICBGSVhQX0dBSU4gKnBQcmVHYWluID0KKyAgICAgICAgICBmZGtfc2FjZW5jX2dldFByZUdhaW5QdHJGREsoaE1wNFNwYWNlRW5jLT5oU3RhdGljR2Fpbik7CisKKyAgICAgIGZvciAodHMgPSAwOyB0cyA8IG5GcmFtZVRpbWVTbG90czsgdHMrKykgeworICAgICAgICBGSVhQX0RCTCAqcFNwZWNSZWFsOworICAgICAgICBGSVhQX0RCTCAqcFNwZWNJbWFnOworCisgICAgICAgIElOVF9QQ00gKnBUaW1lSW4gPQorICAgICAgICAgICAgJmhNcDRTcGFjZUVuYy0+cHBUaW1lU2lnSW5fX0ZES1tjaF1bKHRzICogaE1wNFNwYWNlRW5jLT5uUW1mQmFuZHMpXTsKKworICAgICAgICB7CisgICAgICAgICAgLyogQXBwbHkgREMgZmlsdGVyIG9uIGlucHV0IGNoYW5uZWxzICovCisgICAgICAgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBmZGtfc2FjZW5jX2FwcGx5RENGaWx0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+cGhEQ0ZpbHRlclNpZ0luW2NoXSwgcFRpbWVJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVJbiwgaE1wNFNwYWNlRW5jLT5uUW1mQmFuZHMpKSkgeworICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFFNRiBmaWx0ZXJiYW5rICovCisgICAgICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChwV29ya0J1ZmZlciwgRklYUF9EQkwsIChNQVhfUU1GX0JBTkRTIDw8IDEpKTsKKworICAgICAgICBxbWZBbmFseXNpc0ZpbHRlcmluZ1Nsb3QoaE1wNFNwYWNlRW5jLT5waFFtZkZpbHRJbl9fRkRLW2NoXSwgcFFtZkluUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbkltYWcsIHBUaW1lSW4sIDEsIHBXb3JrQnVmZmVyKTsKKworICAgICAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHBXb3JrQnVmZmVyLCBGSVhQX0RCTCwgKE1BWF9RTUZfQkFORFMgPDwgMSkpOworCisgICAgICAgIHBTcGVjUmVhbCA9IHBRbWZJblJlYWw7CisgICAgICAgIHBTcGVjSW1hZyA9IHBRbWZJbkltYWc7CisKKyAgICAgICAgLyogQXBwbHkgcHJlLXNjYWxlIGFmdGVyIGZpbHRlcmJhbmsgKi8KKyAgICAgICAgaWYgKE1BWFZBTF9HQUlOICE9IHBQcmVHYWluW2NoXSkgeworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoTXA0U3BhY2VFbmMtPm5IeWJyaWRCYW5kczsgaSsrKSB7CisgICAgICAgICAgICBoTXA0U3BhY2VFbmMKKyAgICAgICAgICAgICAgICAtPnBwcEh5YnJpZEluX19GREtbY2hdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hNcDRTcGFjZUVuYy0+bkFuYWx5c2lzTG9va2FoZWFkVGltZVNsb3RzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNdW2ldCisgICAgICAgICAgICAgICAgLnYucmUgPSBmTXVsdChwU3BlY1JlYWxbaV0sIHBQcmVHYWluW2NoXSk7CisgICAgICAgICAgICBoTXA0U3BhY2VFbmMKKyAgICAgICAgICAgICAgICAtPnBwcEh5YnJpZEluX19GREtbY2hdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hNcDRTcGFjZUVuYy0+bkFuYWx5c2lzTG9va2FoZWFkVGltZVNsb3RzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNdW2ldCisgICAgICAgICAgICAgICAgLnYuaW0gPSBmTXVsdChwU3BlY0ltYWdbaV0sIHBQcmVHYWluW2NoXSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoTXA0U3BhY2VFbmMtPm5IeWJyaWRCYW5kczsgaSsrKSB7CisgICAgICAgICAgICBoTXA0U3BhY2VFbmMKKyAgICAgICAgICAgICAgICAtPnBwcEh5YnJpZEluX19GREtbY2hdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hNcDRTcGFjZUVuYy0+bkFuYWx5c2lzTG9va2FoZWFkVGltZVNsb3RzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNdW2ldCisgICAgICAgICAgICAgICAgLnYucmUgPSBwU3BlY1JlYWxbaV07CisgICAgICAgICAgICBoTXA0U3BhY2VFbmMKKyAgICAgICAgICAgICAgICAtPnBwcEh5YnJpZEluX19GREtbY2hdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hNcDRTcGFjZUVuYy0+bkFuYWx5c2lzTG9va2FoZWFkVGltZVNsb3RzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNdW2ldCisgICAgICAgICAgICAgICAgLnYuaW0gPSBwU3BlY0ltYWdbaV07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IC8qIHRzICovCisgICAgICBDX0FBTExPQ19TQ1JBVENIX0VORChwUW1mSW5JbWFnLCBGSVhQX0RCTCwgTUFYX1FNRl9CQU5EUykKKyAgICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKHBRbWZJblJlYWwsIEZJWFBfREJMLCBNQVhfUU1GX0JBTkRTKQorCisgICAgICBpZiAoU0FDRU5DX09LICE9IGVycm9yKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9IC8qIGNoICovCisKKyAgICBpZiAoaE1wNFNwYWNlRW5jLT5lbmNNb2RlID09IFNBQ0VOQ18yMTIgJiYKKyAgICAgICAgaE1wNFNwYWNlRW5jLT5iRW5jTW9kZV8yMTJfb25seSkgeworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoSW47IGNoKyspIHsKKyAgICAgICAgZm9yIChzbG90ID0gMDsKKyAgICAgICAgICAgICBzbG90IDwgKGludCkoaE1wNFNwYWNlRW5jLT5uVXBkYXRlSHlicmlkUG9zaXRpb25UaW1lU2xvdHMgKworICAgICAgICAgICAgICAgICAgICAgICAgICBuRnJhbWVUaW1lU2xvdHMgLSBuRnJhbWVUaW1lU2xvdHNSZWR1Y3Rpb24pOworICAgICAgICAgICAgIHNsb3QrKykgeworICAgICAgICAgIGNvcHlDcGx4VmVjKGhNcDRTcGFjZUVuYy0+cHBwSHlicmlkSW5fX0ZES1tjaF1bc2xvdF0sCisgICAgICAgICAgICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5wcHBIeWJyaWRJblN0YXRpY19fRkRLW2NoXVtzbG90XSwKKyAgICAgICAgICAgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPm5IeWJyaWRCYW5kcyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaEluOyBjaCsrKSB7CisgICAgICAgIGZvciAoc2xvdCA9IDA7CisgICAgICAgICAgICAgc2xvdCA8IChpbnQpKGhNcDRTcGFjZUVuYy0+blVwZGF0ZUh5YnJpZFBvc2l0aW9uVGltZVNsb3RzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbkZyYW1lVGltZVNsb3RzIC0gbkZyYW1lVGltZVNsb3RzUmVkdWN0aW9uKTsKKyAgICAgICAgICAgICBzbG90KyspIHsKKyAgICAgICAgICBjb3B5Q3BseFZlYygKKyAgICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5wcHBIeWJyaWRJblN0YXRpY19fRkRLW2NoXVtzbG90XSwKKyAgICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5wcHBIeWJyaWRJbl9fRkRLW2NoXVtuRnJhbWVUaW1lU2xvdHMgKyBzbG90XSwKKyAgICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5uSHlicmlkQmFuZHMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBPbnNldCBEZXRlY3Rpb246CisgICAgICogLSBkZXRlY3Rpb24gb2YgdHJhbnNpZW50cworICAgICAqIC0gYnVpbGQgZnJhbWluZworICAgICAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaEluOyBjaCsrKSB7CisgICAgICBpZiAoY2ggIT0gMykgeyAvKiAhTEZFICovCisgICAgICAgIGlmIChTQUNFTkNfT0sgIT0KKyAgICAgICAgICAgIChlcnJvciA9IGZka19zYWNlbmNfb25zZXREZXRlY3RfQXBwbHkoCisgICAgICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+cGhPbnNldFtjaF0sIG5GcmFtZVRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5uSHlicmlkQmFuZHMsCisgICAgICAgICAgICAgICAgICZoTXA0U3BhY2VFbmMtPnBwcEh5YnJpZEluX19GREsKKyAgICAgICAgICAgICAgICAgICAgICBbY2hdW2hNcDRTcGFjZUVuYy0+bkFuYWx5c2lzTG9va2FoZWFkVGltZVNsb3RzXSwKKyAgICAgICAgICAgICAgICAgZW5jb2RlcklucHV0Q2hTY2FsZVtjaF0sCisgICAgICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+dHJQcmV2UG9zWzFdLCAvKiBjb250YWlucyBwcmV2aW91cyBUcmFuc2llbnQgKi8KKyAgICAgICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5wcFRyQ3VyclBvc1tjaF0pKSkgeworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoMSkgJiYgKGhNcDRTcGFjZUVuYy0+dXNlRnJhbWVLZWVwID09IDApKSB7CisgICAgICAgICAgaE1wNFNwYWNlRW5jLT5wcFRyQ3VyclBvc1tjaF1bMF0gPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpbmQgZmlyc3QgVHJhbnNpZW50IFBvc2l0aW9uICovCisgICAgICAgIGlmICgoaE1wNFNwYWNlRW5jLT5wcFRyQ3VyclBvc1tjaF1bMF0gPj0gMCkgJiYKKyAgICAgICAgICAgICgoY3VyclRyYW5zUG9zIDwgMCkgfHwKKyAgICAgICAgICAgICAoaE1wNFNwYWNlRW5jLT5wcFRyQ3VyclBvc1tjaF1bMF0gPCBjdXJyVHJhbnNQb3MpKSkgeworICAgICAgICAgIGN1cnJUcmFuc1BvcyA9IGhNcDRTcGFjZUVuYy0+cHBUckN1cnJQb3NbY2hdWzBdOworICAgICAgICB9CisgICAgICB9IC8qICFMRkUgKi8KKyAgICB9ICAgLyogY2ggKi8KKworICAgIGlmIChoTXA0U3BhY2VFbmMtPnVzZUZyYW1lS2VlcCA9PSAxKSB7CisgICAgICBpZiAoKGN1cnJUcmFuc1BvcyAhPSAtMSkgfHwgKGhNcDRTcGFjZUVuYy0+aW5kZXBlbmRlbmN5RmxhZyA9PSAxKSkgeworICAgICAgICBoTXA0U3BhY2VFbmMtPmF2b2lkX2tlZXAgPSBOVU1fS0VFUF9XSU5ET1dTOworICAgICAgICBjdXJyVHJhbnNQb3MgPSAtMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTYXZlIHByZXZpb3VzIFRyYW5zaWVudCBQb3NpdGlvbiAqLworICAgIGhNcDRTcGFjZUVuYy0+dHJQcmV2UG9zWzBdID0KKyAgICAgICAgRkRLbWF4KC0xLCBoTXA0U3BhY2VFbmMtPnRyUHJldlBvc1sxXSAtIChJTlQpbkZyYW1lVGltZVNsb3RzKTsKKyAgICBoTXA0U3BhY2VFbmMtPnRyUHJldlBvc1sxXSA9IGN1cnJUcmFuc1BvczsKKworICAgIC8qIFVwZGF0ZSBPbnNldCBEZXRlY3Rpb24gRW5lcmd5IEJ1ZmZlciAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaEluOyBjaCsrKSB7CisgICAgICBpZiAoU0FDRU5DX09LICE9IChlcnJvciA9IGZka19zYWNlbmNfb25zZXREZXRlY3RfVXBkYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+cGhPbnNldFtjaF0sIG5GcmFtZVRpbWVTbG90cykpKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGcmFtaW5nICovCisgICAgaWYgKFNBQ0VOQ19PSyAhPQorICAgICAgICAoZXJyb3IgPSBmZGtfc2FjZW5jX2ZyYW1lV2luZG93X0dldFdpbmRvdygKKyAgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPmhGcmFtZVdpbmRvdywgaE1wNFNwYWNlRW5jLT50clByZXZQb3MsCisgICAgICAgICAgICAgbkZyYW1lVGltZVNsb3RzLCAmcEZyYW1lRGF0YS0+ZnJhbWluZ0luZm8sCisgICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5wRnJhbWVXaW5kb3dBbmFfX0ZESywgJmhNcDRTcGFjZUVuYy0+ZnJhbWVXaW5MaXN0LAorICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+YXZvaWRfa2VlcCkpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBNUFMgUHJvY2Vzc2luZzoKKyAgICAgKi8KKyAgICBmb3IgKHBzID0gMCwgd2luQ250ID0gMDsgcHMgPCBoTXA0U3BhY2VFbmMtPmZyYW1lV2luTGlzdC5uOyArK3BzKSB7CisgICAgICAvKiBBbmFseXNpcyBXaW5kb3dpbmcgKi8KKyAgICAgIGlmIChoTXA0U3BhY2VFbmMtPmZyYW1lV2luTGlzdC5kYXRbcHNdLmhvbGQgPT0gRldfSE9MRCkgeworICAgICAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworICAgICAgICAvKiBPTkxZIENPUFkgQU5EIEhPTEQgUFJFVklPVVMgUEFSQU1FVEVSUyAqLworICAgICAgICBpZiAoU0FDRU5DX09LICE9IChlcnJvciA9IGZka19zYWNlbmNfZHVwbGljYXRlUGFyYW1ldGVyU2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhNcDRTcGFjZUVuYy0+c2F2ZUZyYW1lLCAwLCBwRnJhbWVEYXRhLCBwcykpKSB7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisKKyAgICAgIH0gZWxzZSB7IC8qICFGV19IT0xEICovCisgICAgICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisgICAgICAgIC8qIE5FVyBXSU5ET1cgKi8KKworICAgICAgICBJTlQgbkFuYWx5c2lzTGVuZ3RoVGltZVNsb3RzLCBhbmFseXNpc1N0YXJ0VGltZVNsb3Q7CisKKyAgICAgICAgbkFuYWx5c2lzTGVuZ3RoVGltZVNsb3RzID0gZ2V0QW5hbHlzaXNMZW5ndGhUaW1lU2xvdHMoCisgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPnBGcmFtZVdpbmRvd0FuYV9fRkRLW3dpbkNudF0sCisgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPm5BbmFseXNpc0xlbmd0aFRpbWVTbG90cyk7CisKKyAgICAgICAgYW5hbHlzaXNTdGFydFRpbWVTbG90ID0KKyAgICAgICAgICAgIGdldEFuYWx5c2lzU3RhcnRUaW1lU2xvdChoTXA0U3BhY2VFbmMtPnBGcmFtZVdpbmRvd0FuYV9fRkRLW3dpbkNudF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5uQW5hbHlzaXNMZW5ndGhUaW1lU2xvdHMpOworCisgICAgICAgIC8qIHBlcmZvcm0gbWFpbiBzaWduYWwgYW5hbHlzaXMgd2luZG93aW5nIGluCisgICAgICAgICAqIGZka19zYWNlbmNfc3BhY2VUcmVlX0FwcGx5KCkgKi8KKyAgICAgICAgRklYUF9XSU4gKnBGcmFtZVdpbmRvd0FuYV9fRkRLID0KKyAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+cEZyYW1lV2luZG93QW5hX19GREtbd2luQ250XTsKKyAgICAgICAgRklYUF9EUEsgKioqcHBwSHlicmlkSW5fX0ZESyA9IGhNcDRTcGFjZUVuYy0+cHBwSHlicmlkSW5fX0ZESzsKKyAgICAgICAgRklYUF9EUEsgKioqcHBwUHJvY0RhdGFJbl9fRkRLID0gaE1wNFNwYWNlRW5jLT5wcHBQcm9jRGF0YUluX19GREs7CisKKyAgICAgICAgaWYgKGhNcDRTcGFjZUVuYy0+ZW5jTW9kZSA9PSBTQUNFTkNfMjEyICYmCisgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPmJFbmNNb2RlXzIxMl9vbmx5KSB7CisgICAgICAgICAgcHBwUHJvY0RhdGFJbl9fRkRLID0gcHBwSHlicmlkSW5fX0ZESzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChTQUNFTkNfT0sgIT0KKyAgICAgICAgICAgIChlcnJvciA9IGZka19zYWNlbmNfc3BhY2VUcmVlX0FwcGx5KAorICAgICAgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPmhTcGFjZVRyZWUsIHBzLCBuQ2hJbiwgbkFuYWx5c2lzTGVuZ3RoVGltZVNsb3RzLAorICAgICAgICAgICAgICAgICBhbmFseXNpc1N0YXJ0VGltZVNsb3QsIGhNcDRTcGFjZUVuYy0+bkh5YnJpZEJhbmRzLAorICAgICAgICAgICAgICAgICBwRnJhbWVXaW5kb3dBbmFfX0ZESywgcHBwSHlicmlkSW5fX0ZESywKKyAgICAgICAgICAgICAgICAgcHBwUHJvY0RhdGFJbl9fRkRLLCAvKiBtdWx0aS1jaGFubmVsIGlucHV0ICovCisgICAgICAgICAgICAgICAgIHBGcmFtZURhdGEsIGhNcDRTcGFjZUVuYy0+YXZvaWRfa2VlcCwgZW5jb2RlcklucHV0Q2hTY2FsZSkpKSB7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisKKyAgICAgICAgLyogU2F2ZSBzcGF0aWFsIGZyYW1lIGZvciBwb3RlbnRpYWwgaG9sZCBwYXJhbWV0ZXIgc2V0ICovCisgICAgICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZmRrX3NhY2VuY19kdXBsaWNhdGVQYXJhbWV0ZXJTZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnJhbWVEYXRhLCBwcywgJmhNcDRTcGFjZUVuYy0+c2F2ZUZyYW1lLCAwKSkpIHsKKyAgICAgICAgICBnb3RvIGJhaWw7CisgICAgICAgIH0KKworICAgICAgICArK3dpbkNudDsKKyAgICAgIH0KKyAgICAgIGlmIChoTXA0U3BhY2VFbmMtPmF2b2lkX2tlZXAgPiAwKSB7CisgICAgICAgIGhNcDRTcGFjZUVuYy0+YXZvaWRfa2VlcC0tOworICAgICAgfQorICAgIH0gLyogTG9vcCBvdmVyIFBhcmFtZXRlciBTZXRzICovCisgICAgLyogLS0tLSBFbmQgb2YgUHJvY2Vzc2luZyBMb29wIC0tLS0gKi8KKworICAgIC8qCisgICAgICogVXBkYXRlIGh5YnJpZEluUmVhbC9JbWFnIGJ1ZmZlciBhbmQgZG8gdGhlIHNhbWUgZm9yIGFyYkRteAorICAgICAqIHRoaXMgbWVhbnMgdG8gbW92ZSB0aGUgaHlicmlkIGRhdGEgb2YgdGhlIGN1cnJlbnQgZnJhbWUgdG8gdGhlIGJlZ2lubmluZworICAgICAqIG9mIHRoZSAyKm5GcmFtZUxlbmd0aC1sb25nIGJ1ZmZlcgorICAgICAqLworICAgIGlmICghKGhNcDRTcGFjZUVuYy0+ZW5jTW9kZSA9PSBTQUNFTkNfMjEyICYmCisgICAgICAgICAgaE1wNFNwYWNlRW5jLT5iRW5jTW9kZV8yMTJfb25seSkpIHsKKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaEluOyBjaCsrKSB7IC8qIGZvciBhdXRvbWF0aWMgZG93bm1peCAqLworICAgICAgICBmb3IgKHNsb3QgPSAwOworICAgICAgICAgICAgIHNsb3QgPCAoaW50KShoTXA0U3BhY2VFbmMtPm5VcGRhdGVIeWJyaWRQb3NpdGlvblRpbWVTbG90cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5GcmFtZVRpbWVTbG90cyAtIG5GcmFtZVRpbWVTbG90c1JlZHVjdGlvbik7CisgICAgICAgICAgICAgc2xvdCsrKSB7CisgICAgICAgICAgY29weUNwbHhWZWMoCisgICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+cHBwSHlicmlkSW5fX0ZES1tjaF1bc2xvdF0sCisgICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+cHBwSHlicmlkSW5fX0ZES1tjaF1bbkZyYW1lVGltZVNsb3RzICsgc2xvdF0sCisgICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+bkh5YnJpZEJhbmRzKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNsb3QgPSAwOyBzbG90IDwgbkZyYW1lVGltZVNsb3RzOyBzbG90KyspIHsKKyAgICAgICAgICBzZXRDcGx4VmVjKAorICAgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPnBwcEh5YnJpZEluX19GREsKKyAgICAgICAgICAgICAgICAgIFtjaF1baE1wNFNwYWNlRW5jLT5uVXBkYXRlSHlicmlkUG9zaXRpb25UaW1lU2xvdHMgKworICAgICAgICAgICAgICAgICAgICAgICBuRnJhbWVUaW1lU2xvdHMgLSBuRnJhbWVUaW1lU2xvdHNSZWR1Y3Rpb24gKyBzbG90XSwKKyAgICAgICAgICAgICAgKEZJWFBfREJMKTAsIGhNcDRTcGFjZUVuYy0+bkh5YnJpZEJhbmRzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvKgorICAgICAqIFNwYXRpYWwgVG9uYWxpdHk6CisgICAgICovCisgICAgeworICAgICAgLyogU21vb3RoIGNvbmZpZyBvZmYuICovCisgICAgICBGREttZW1jbGVhcigmcEZyYW1lRGF0YS0+c21nRGF0YSwgc2l6ZW9mKHBGcmFtZURhdGEtPnNtZ0RhdGEpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENyZWF0ZSBiaXRzdHJlYW0KKyAgICAgKiAtIGNvbnRyb2wgaW5kZXBlbmRlY3kgZmxhZworICAgICAqIC0gd3JpdGUgc3BhdGlhbCBmcmFtZQorICAgICAqIC0gcmV0dXJuIGJpdHN0cmVhbQorICAgICAqLworICAgIFVDSEFSICpwQml0c3RyZWFtRGVsYXlCdWZmZXI7CisKKyAgICBpZiAoaE1wNFNwYWNlRW5jLT5lbmNNb2RlID09IFNBQ0VOQ18yMTIpIHsKKyAgICAgIC8qIG5vIGJpdHN0cmVhbSBkZWxheSBidWZmZXIgZm9yIFNBQ0VOQ18yMTIgbW9kZSwgd3JpdGUgYml0c3RyZWFtIGRpcmVjdGx5CisgICAgICAgKiBpbnRvIHRoZSBzYWNPdXRCdWZmZXIgYnVmZmVyIHdoaWNoIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3JlIHJvdXRpbmUgKi8KKyAgICAgIHBCaXRzdHJlYW1EZWxheUJ1ZmZlciA9IChVQ0hBUiAqKW91dEJ1ZkRlc2MtPnBwQmFzZVsxXTsKKyAgICB9IGVsc2UgeworICAgICAgLyogYml0c3RyZWFtIGRlbGF5IGlzIGhhbmRsZWQgaW4gcHBCaXRzdHJlYW1EZWxheUJ1ZmZlciBidWZmZXIgKi8KKyAgICAgIHBCaXRzdHJlYW1EZWxheUJ1ZmZlciA9CisgICAgICAgICAgaE1wNFNwYWNlRW5jCisgICAgICAgICAgICAgIC0+cHBCaXRzdHJlYW1EZWxheUJ1ZmZlcltoTXA0U3BhY2VFbmMtPm5CaXRzdHJlYW1CdWZmZXJXcml0ZV07CisgICAgfQorICAgIGlmIChwQml0c3RyZWFtRGVsYXlCdWZmZXIgPT0gTlVMTCkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgcEZyYW1lRGF0YS0+YnNJbmRlcGVuZGVuY3lGbGFnID0gaE1wNFNwYWNlRW5jLT5pbmRlcGVuZGVuY3lGbGFnOworCisgICAgaWYgKFNBQ0VOQ19PSyAhPQorICAgICAgICAoZXJyb3IgPSBmZGtfc2FjZW5jX3dyaXRlU3BhdGlhbEZyYW1lKAorICAgICAgICAgICAgIHBCaXRzdHJlYW1EZWxheUJ1ZmZlciwgTUFYX01QRUdTX0JZVEVTLAorICAgICAgICAgICAgICZoTXA0U3BhY2VFbmMtPnBuT3V0cHV0Qml0c1toTXA0U3BhY2VFbmMtPm5CaXRzdHJlYW1CdWZmZXJXcml0ZV0sCisgICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5oQml0c3RyZWFtRm9ybWF0dGVyKSkpIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiByZXR1cm4gYml0c3RyZWFtIGluZm8gKi8KKyAgICBpZiAoKGhNcDRTcGFjZUVuYy0+bkRpc2NhcmRPdXRGcmFtZXMgPT0gMCkgJiYKKyAgICAgICAgKGdldEJ1ZkRlc2NJZHgob3V0QnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgKEZES19CVUZfVFlQRV9PVVRQVVQgfCBGREtfQlVGX1RZUEVfQlNfREFUQSkpICE9IC0xKSkgeworICAgICAgY29uc3QgSU5UIGlkeCA9IGdldEJ1ZkRlc2NJZHgoCisgICAgICAgICAgb3V0QnVmRGVzYywgKEZES19CVUZfVFlQRV9PVVRQVVQgfCBGREtfQlVGX1RZUEVfQlNfREFUQSkpOworICAgICAgY29uc3QgSU5UIG91dEJpdHMgPQorICAgICAgICAgIGhNcDRTcGFjZUVuYy0+cG5PdXRwdXRCaXRzW2hNcDRTcGFjZUVuYy0+bkJpdHN0cmVhbUJ1ZmZlclJlYWRdOworCisgICAgICBpZiAoKChvdXRCaXRzICsgNykgLyA4KSA+CisgICAgICAgICAgKElOVCkob3V0QnVmRGVzYy0+cEJ1ZlNpemVbaWR4XSAvIG91dEJ1ZkRlc2MtPnBFbGVTaXplW2lkeF0pKSB7CisgICAgICAgIG91dGFyZ3MtPm5PdXRwdXRCaXRzID0gMDsKKyAgICAgICAgZXJyb3IgPSBTQUNFTkNfRU5DT0RFX0VSUk9SOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisKKyAgICAgIC8qIHJldHVybiBiaXRzdHJlYW0gYnVmZmVyLCBjb3B5IGRlbGF5ZWQgYml0c3RyZWFtIGZvciBhbGwgY29uZmlndXJhdGlvbnMKKyAgICAgICAqIGV4Y2VwdCBmb3IgdGhlIFNBQ0VOQ18yMTIgbW9kZSAqLworICAgICAgaWYgKGhNcDRTcGFjZUVuYy0+ZW5jTW9kZSAhPSBTQUNFTkNfMjEyKSB7CisgICAgICAgIEZES21lbWNweSgKKyAgICAgICAgICAgIG91dEJ1ZkRlc2MtPnBwQmFzZVtpZHhdLAorICAgICAgICAgICAgaE1wNFNwYWNlRW5jCisgICAgICAgICAgICAgICAgLT5wcEJpdHN0cmVhbURlbGF5QnVmZmVyW2hNcDRTcGFjZUVuYy0+bkJpdHN0cmVhbUJ1ZmZlclJlYWRdLAorICAgICAgICAgICAgKG91dEJpdHMgKyA3KSAvIDgpOworICAgICAgfQorCisgICAgICAvKiByZXR1cm4gbnVtYmVyIG9mIHZhbGlkIGJpdHMgKi8KKyAgICAgIG91dGFyZ3MtPm5PdXRwdXRCaXRzID0gb3V0Qml0czsKKyAgICB9IGVsc2UgeyAvKiBObyBzcGF0aWFsIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkIGlmIHRoZSBjdXJyZW50IGZyYW1lIGlzIHRvIGJlCisgICAgICAgICAgICAgICAgZGlzY2FyZGVkLiAqLworICAgICAgb3V0YXJncy0+bk91dHB1dEJpdHMgPSAwOworICAgIH0KKworICAgIC8qIHVwZGF0ZSBwb2ludGVycyAqLworICAgIGhNcDRTcGFjZUVuYy0+bkJpdHN0cmVhbUJ1ZmZlclJlYWQgPQorICAgICAgICAoaE1wNFNwYWNlRW5jLT5uQml0c3RyZWFtQnVmZmVyUmVhZCArIDEpICUKKyAgICAgICAgaE1wNFNwYWNlRW5jLT5uQml0c3RyZWFtRGVsYXlCdWZmZXI7CisgICAgaE1wNFNwYWNlRW5jLT5uQml0c3RyZWFtQnVmZmVyV3JpdGUgPQorICAgICAgICAoaE1wNFNwYWNlRW5jLT5uQml0c3RyZWFtQnVmZmVyV3JpdGUgKyAxKSAlCisgICAgICAgIGhNcDRTcGFjZUVuYy0+bkJpdHN0cmVhbURlbGF5QnVmZmVyOworCisgICAgLyogU2V0IE91dHB1dCBQYXJhbWV0ZXJzICovCisgICAgbk91dHB1dFNhbXBsZXMgPQorICAgICAgICAoaE1wNFNwYWNlRW5jLT5uRGlzY2FyZE91dEZyYW1lcyA9PSAwKQorICAgICAgICAgICAgPyAobk91dHB1dFNhbXBsZXNNYXgpCisgICAgICAgICAgICA6IDA7IC8qIGRvbid0IG91dHB1dCBzYW1wbGVzIGluIGNhc2UgZnJhbWVzIHRvIGJlIGRpc2NhcmRlZCAqLworICAgIGlmIChuT3V0cHV0U2FtcGxlcyA+IG5PdXRwdXRTYW1wbGVzQnVmZmVyU2l6ZSkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgIG91dGFyZ3MtPm5PdXRwdXRTYW1wbGVzID0gbk91dHB1dFNhbXBsZXM7CisKKyAgICB7IC8qICFiUW1mT3V0cHV0ICovCisKKyAgICAgIGlmIChoTXA0U3BhY2VFbmMtPmVuY01vZGUgIT0gU0FDRU5DXzIxMikgeworICAgICAgICAvKiBkZWxheSBvdXRwdXQgc2FtcGxlcyBhbmQgaW50ZXJsZWF2ZSB0aGVtICovCisgICAgICAgIC8qIG5vdGU6IGluIGNhc2Ugb2YgYXJiaXRyYXJ5IGRvd25taXggdGhpcyB3aWxsIGFsd2F5cyBiZSBwcm9jZXNzZWQsCisgICAgICAgICAqIGJlY2F1c2Ugbk91dHB1dFNhbXBsZXMgIT0gMCwgZXZlbiBpZiBiRE1YQWxpZ24gaXMgc3dpdGNoZWQgb24gKi8KKyAgICAgICAgLyogYWx3YXlzIHJ1biBjb3B5LWZ1bmMsIHNvIG5PdXRwdXRTYW1wbGVzTWF4IGluc3RlYWQgb2Ygbk91dHB1dFNhbXBsZXMKKyAgICAgICAgICovCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5DaE91dDsgY2grKykgeworICAgICAgICAgIEZES21lbWNweV9mbGV4KAorICAgICAgICAgICAgICAmaE1wNFNwYWNlRW5jLT5wT3V0cHV0RGVsYXlCdWZmZXJfX0ZESworICAgICAgICAgICAgICAgICAgIFtjaCArIChoTXA0U3BhY2VFbmMtPm5PdXRwdXRCdWZmZXJEZWxheSkgKiBuQ2hPdXRdLAorICAgICAgICAgICAgICBuQ2hPdXQsIGhNcDRTcGFjZUVuYy0+cHBUaW1lU2lnT3V0X19GREtbY2hdLCAxLAorICAgICAgICAgICAgICBuT3V0cHV0U2FtcGxlc01heCAvIG5DaE91dCk7CisgICAgICAgIH0KKworICAgICAgICAvKiB3cml0ZSBkZWxheWVkIGRhdGEgaW4gb3V0cHV0IHBjbSBzdHJlYW0gKi8KKyAgICAgICAgLyogYWx3YXlzIGNhbGN1bGF0ZSwgbGltaXRlciBtdXN0IGhhdmUgYSBsb29rYWhlYWQhISEgKi8KKyAgICAgICAgRkRLbWVtY3B5KHBPdXRwdXRTYW1wbGVzLCBoTXA0U3BhY2VFbmMtPnBPdXRwdXREZWxheUJ1ZmZlcl9fRkRLLAorICAgICAgICAgICAgICAgICAgbk91dHB1dFNhbXBsZXNNYXggKiBzaXplb2YoSU5UX1BDTSkpOworCisgICAgICAgIC8qIHVwZGF0ZSBkZWxheSBidWZmZXIgKG1vdmUgYmFjayBlbmQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyKSAqLworICAgICAgICBGREttZW1tb3ZlKAorICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT5wT3V0cHV0RGVsYXlCdWZmZXJfX0ZESywKKyAgICAgICAgICAgICZoTXA0U3BhY2VFbmMtPnBPdXRwdXREZWxheUJ1ZmZlcl9fRkRLW25PdXRwdXRTYW1wbGVzTWF4XSwKKyAgICAgICAgICAgIG5DaE91dCAqIChoTXA0U3BhY2VFbmMtPm5PdXRwdXRCdWZmZXJEZWxheSkgKiBzaXplb2YoSU5UX1BDTSkpOworICAgICAgfQorCisgICAgICBpZiAoaE1wNFNwYWNlRW5jLT51c2VUaW1lRG9tRG93bm1peCA8PSAwKSB7CisgICAgICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZmRrX3NhY2VuY19zdGF0aWNQb3N0R2Fpbl9BcHBseUZESygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+aFN0YXRpY0dhaW4sIHBPdXRwdXRTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbk91dHB1dFNhbXBsZXNNYXgsIDApKSkgeworICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgfSAvKiAhYlFtZk91dHB1dCAqLworCisgICAgaWYgKGhNcDRTcGFjZUVuYy0+bkRpc2NhcmRPdXRGcmFtZXMgPiAwKSB7CisgICAgICBoTXA0U3BhY2VFbmMtPm5EaXNjYXJkT3V0RnJhbWVzLS07CisgICAgfQorCisgICAgLyogSW52YWxpZGF0ZSBJbnB1dCBCdWZmZXIgKi8KKyAgICBoTXA0U3BhY2VFbmMtPm5TYW1wbGVzVmFsaWQgPSAwOworCisgIH0gLyogdmFsaWQgaGFuZGxlICovCitiYWlsOgorICByZXR1cm4gZXJyb3I7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgRkRLX3NhY2VuY19jbG9zZShIQU5ETEVfTVA0U1BBQ0VfRU5DT0RFUiAqcGhNcDRTcGFjZUVuYykgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChOVUxMICE9IHBoTXA0U3BhY2VFbmMpIHsKKyAgICBpZiAoTlVMTCAhPSAqcGhNcDRTcGFjZUVuYykgeworICAgICAgaW50IGNoLCBpOworICAgICAgSEFORExFX01QNFNQQUNFX0VOQ09ERVIgY29uc3QgaEVuYyA9ICpwaE1wNFNwYWNlRW5jOworCisgICAgICBpZiAoaEVuYy0+cFBhcmFtZXRlckJhbmQySHlicmlkQmFuZE9mZnNldCAhPSBOVUxMKSB7CisgICAgICAgIEZES19GUkVFX01FTU9SWV8xRChoRW5jLT5wUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0KTsKKyAgICAgIH0KKyAgICAgIC8qIEZyZWUgQW5hbHlzaXMgRmlsdGVyYmFuayBTdHJ1Y3RzICovCisgICAgICBpZiAoaEVuYy0+cEVuY29kZXJJbnB1dENoU2NhbGUgIT0gTlVMTCkgeworICAgICAgICBGREtfRlJFRV9NRU1PUllfMUQoaEVuYy0+cEVuY29kZXJJbnB1dENoU2NhbGUpOworICAgICAgfQorICAgICAgaWYgKGhFbmMtPnN0YXRpY1RpbWVEb21haW5EbXhJblNjYWxlICE9IE5VTEwpIHsKKyAgICAgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKGhFbmMtPnN0YXRpY1RpbWVEb21haW5EbXhJblNjYWxlKTsKKyAgICAgIH0KKyAgICAgIGlmIChoRW5jLT5waFFtZkZpbHRJbl9fRkRLICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgaEVuYy0+c2V0dXAubWF4Q2hJbjsgY2grKykgeworICAgICAgICAgIGlmIChoRW5jLT5waFFtZkZpbHRJbl9fRkRLW2NoXSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoaEVuYy0+cGhRbWZGaWx0SW5fX0ZES1tjaF0tPkZpbHRlclN0YXRlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgIEZES19GUkVFX01FTU9SWV8xRChoRW5jLT5waFFtZkZpbHRJbl9fRkRLW2NoXS0+RmlsdGVyU3RhdGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZES19GUkVFX01FTU9SWV8xRChoRW5jLT5waFFtZkZpbHRJbl9fRkRLW2NoXSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZES19GUkVFX01FTU9SWV8xRChoRW5jLT5waFFtZkZpbHRJbl9fRkRLKTsKKyAgICAgIH0KKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGhFbmMtPnNldHVwLm1heENoSW47IGNoKyspIHsKKyAgICAgICAgaWYgKE5VTEwgIT0gaEVuYy0+cGhEQ0ZpbHRlclNpZ0luW2NoXSkgeworICAgICAgICAgIGZka19zYWNlbmNfZGVzdHJveURDRmlsdGVyKCZoRW5jLT5waERDRmlsdGVyU2lnSW5bY2hdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogQ2xvc2UgT25zZXQgRGV0ZWN0aW9uICovCisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBoRW5jLT5zZXR1cC5tYXhDaEluOyBjaCsrKSB7CisgICAgICAgIGlmIChOVUxMICE9IGhFbmMtPnBoT25zZXRbY2hdKSB7CisgICAgICAgICAgZmRrX3NhY2VuY19vbnNldERldGVjdF9DbG9zZSgmaEVuYy0+cGhPbnNldFtjaF0pOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoaEVuYy0+cHBUckN1cnJQb3MpIHsKKyAgICAgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKGhFbmMtPnBwVHJDdXJyUG9zKTsKKyAgICAgIH0KKyAgICAgIGlmIChoRW5jLT5oRnJhbWVXaW5kb3cpIHsKKyAgICAgICAgZmRrX3NhY2VuY19mcmFtZVdpbmRvd19EZXN0cm95KCZoRW5jLT5oRnJhbWVXaW5kb3cpOworICAgICAgfQorICAgICAgLyogQ2xvc2UgU3BhY2UgVHJlZSAqLworICAgICAgaWYgKE5VTEwgIT0gaEVuYy0+aFNwYWNlVHJlZSkgeworICAgICAgICBmZGtfc2FjZW5jX3NwYWNlVHJlZV9DbG9zZSgmaEVuYy0+aFNwYWNlVHJlZSk7CisgICAgICB9CisgICAgICBpZiAoTlVMTCAhPSBoRW5jLT5oRW5oYW5jZWRUaW1lRG14KSB7CisgICAgICAgIGZka19zYWNlbmNfY2xvc2VfZW5oYW5jZWRUaW1lRG9tYWluRG14KCZoRW5jLT5oRW5oYW5jZWRUaW1lRG14KTsKKyAgICAgIH0KKyAgICAgIC8qIENsb3NlIFN0YXRpYyBHYWluICovCisgICAgICBpZiAoTlVMTCAhPSBoRW5jLT5oU3RhdGljR2FpbikgeworICAgICAgICBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fQ2xvc2UoJmhFbmMtPmhTdGF0aWNHYWluKTsKKyAgICAgIH0KKyAgICAgIGlmIChOVUxMICE9IGhFbmMtPmhTdGF0aWNHYWluQ29uZmlnKSB7CisgICAgICAgIGZka19zYWNlbmNfc3RhdGljR2Fpbl9DbG9zZUNvbmZpZygmaEVuYy0+aFN0YXRpY0dhaW5Db25maWcpOworICAgICAgfQorICAgICAgLyogQ2xvc2UgRGVsYXkqLworICAgICAgaWYgKE5VTEwgIT0gaEVuYy0+aERlbGF5KSB7CisgICAgICAgIGZka19zYWNlbmNfZGVsYXlfQ2xvc2UoJmhFbmMtPmhEZWxheSk7CisgICAgICB9CisgICAgICAvKiBEZWxldGUgQml0c3RyZWFtIFN0dWZmICovCisgICAgICBpZiAoTlVMTCAhPSBoRW5jLT5oQml0c3RyZWFtRm9ybWF0dGVyKSB7CisgICAgICAgIGZka19zYWNlbmNfZGVzdHJveVNwYXRpYWxCaXRzdHJlYW1FbmNvZGVyKCYoaEVuYy0+aEJpdHN0cmVhbUZvcm1hdHRlcikpOworICAgICAgfQorICAgICAgaWYgKGhFbmMtPnBwcEh5YnJpZEluX19GREsgIT0gTlVMTCkgeworICAgICAgICBpZiAoaEVuYy0+c2V0dXAuYkVuY01vZGVfMjEyID09IDEpIHsKKyAgICAgICAgICBGREtfRlJFRV9NRU1PUllfM0QoaEVuYy0+cHBwSHlicmlkSW5fX0ZESyk7CisgICAgICAgICAgRkRLX0ZSRUVfTUVNT1JZXzNEKGhFbmMtPnBwcEh5YnJpZEluU3RhdGljX19GREspOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEZES19GUkVFX01FTU9SWV8zRChoRW5jLT5wcHBIeWJyaWRJbl9fRkRLKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGhFbmMtPnBwcFByb2NEYXRhSW5fX0ZESyAhPSBOVUxMKSB7CisgICAgICAgIEZES19GUkVFX01FTU9SWV8zRChoRW5jLT5wcHBQcm9jRGF0YUluX19GREspOworICAgICAgfQorICAgICAgaWYgKGhFbmMtPnBPdXRwdXREZWxheUJ1ZmZlcl9fRkRLICE9IE5VTEwpIHsKKyAgICAgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKGhFbmMtPnBPdXRwdXREZWxheUJ1ZmZlcl9fRkRLKTsKKyAgICAgIH0KKyAgICAgIGlmIChoRW5jLT5wcFRpbWVTaWdJbl9fRkRLICE9IE5VTEwpIHsKKyAgICAgICAgeyBGREtfRlJFRV9NRU1PUllfMkQoaEVuYy0+cHBUaW1lU2lnSW5fX0ZESyk7IH0KKyAgICAgIH0KKyAgICAgIGlmIChoRW5jLT5wcFRpbWVTaWdEZWxheUluX19GREsgIT0gTlVMTCkgeworICAgICAgICBGREtfRlJFRV9NRU1PUllfMkQoaEVuYy0+cHBUaW1lU2lnRGVsYXlJbl9fRkRLKTsKKyAgICAgIH0KKyAgICAgIGlmIChoRW5jLT5wcFRpbWVTaWdPdXRfX0ZESyAhPSBOVUxMKSB7CisgICAgICAgIEZES19GUkVFX01FTU9SWV8yRChoRW5jLT5wcFRpbWVTaWdPdXRfX0ZESyk7CisgICAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9QQVJBTVM7IGkrKykgeworICAgICAgICBpZiAoaEVuYy0+cEZyYW1lV2luZG93QW5hX19GREtbaV0gIT0gTlVMTCkgeworICAgICAgICAgIEZES19GUkVFX01FTU9SWV8xRChoRW5jLT5wRnJhbWVXaW5kb3dBbmFfX0ZES1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChoRW5jLT5wbk91dHB1dEJpdHMgIT0gTlVMTCkgeworICAgICAgICBGREtfRlJFRV9NRU1PUllfMUQoaEVuYy0+cG5PdXRwdXRCaXRzKTsKKyAgICAgIH0KKyAgICAgIGlmIChoRW5jLT5wcEJpdHN0cmVhbURlbGF5QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgRkRLX0ZSRUVfTUVNT1JZXzJEKGhFbmMtPnBwQml0c3RyZWFtRGVsYXlCdWZmZXIpOworICAgICAgfQorICAgICAgaWYgKGhFbmMtPnNzY0J1Zi5wU3NjICE9IE5VTEwpIHsKKyAgICAgICAgRkRLX0ZSRUVfTUVNT1JZXzFEKGhFbmMtPnNzY0J1Zi5wU3NjKTsKKyAgICAgIH0KKyAgICAgIEZES19GUkVFX01FTU9SWV8xRCgqcGhNcDRTcGFjZUVuYyk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGVycm9yOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGZ1bmN0aW9ubmFtZTogbXA0U3BhY2VFbmNfSW5pdERlbGF5Q29tcGVuc2F0aW9uKCkKKyAgZGVzY3JpcHRpb246ICBpbml0aWFsemVzIGRlbGF5IGNvbXBlbnNhdGlvbgorICByZXR1cm5zOiAgICAgIG5vRXJyb3Igb24gc3VjY2VzcywgYW4gYXByb3ByaWF0ZSBlcnJvciBjb2RlIGVsc2UKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIEZES19TQUNFTkNfRVJST1IgbXA0U3BhY2VFbmNfSW5pdERlbGF5Q29tcGVuc2F0aW9uKAorICAgIEhBTkRMRV9NUDRTUEFDRV9FTkNPREVSIGhNcDRTcGFjZUVuYywgY29uc3QgSU5UIGNvcmVDb2RlckRlbGF5KSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgLyogU2FuaXR5IENoZWNrICovCisgIGlmIChoTXA0U3BhY2VFbmMgPT0gTlVMTCkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGhNcDRTcGFjZUVuYy0+Y29yZUNvZGVyRGVsYXkgPSBjb3JlQ29kZXJEZWxheTsKKworICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZmRrX3NhY2VuY19kZWxheV9Jbml0KAorICAgICAgICAgICAgICAgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPmhEZWxheSwgaE1wNFNwYWNlRW5jLT5uUW1mQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+bkZyYW1lTGVuZ3RoLCBjb3JlQ29kZXJEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaE1wNFNwYWNlRW5jLT50aW1lQWxpZ25tZW50KSkpIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBmZGtfc2FjZW5jX2RlbGF5X1NldERteEFsaWduKGhNcDRTcGFjZUVuYy0+aERlbGF5LCAwKTsKKyAgICBmZGtfc2FjZW5jX2RlbGF5X1NldFRpbWVEb21EbXgoCisgICAgICAgIGhNcDRTcGFjZUVuYy0+aERlbGF5LCAoaE1wNFNwYWNlRW5jLT51c2VUaW1lRG9tRG93bm1peCA+PSAxKSA/IDEgOiAwKTsKKyAgICBmZGtfc2FjZW5jX2RlbGF5X1NldE1pbmltaXplRGVsYXkoaE1wNFNwYWNlRW5jLT5oRGVsYXksIDEpOworCisgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBmZGtfc2FjZW5jX2RlbGF5X1N1YkNhbHVsYXRlQnVmZmVyRGVsYXlzKAorICAgICAgICAgICAgICAgICAgICAgICAgICBoTXA0U3BhY2VFbmMtPmhEZWxheSkpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogaW5pdCBvdXRwdXQgZGVsYXkgY29tcGVuc2F0aW9uICovCisgICAgaE1wNFNwYWNlRW5jLT5uQml0c3RyZWFtRGVsYXlCdWZmZXIgPQorICAgICAgICBmZGtfc2FjZW5jX2RlbGF5X0dldEJpdHN0cmVhbUZyYW1lQnVmZmVyU2l6ZShoTXA0U3BhY2VFbmMtPmhEZWxheSk7CisgICAgaE1wNFNwYWNlRW5jLT5uT3V0cHV0QnVmZmVyRGVsYXkgPQorICAgICAgICBmZGtfc2FjZW5jX2RlbGF5X0dldE91dHB1dEF1ZGlvQnVmZmVyRGVsYXkoaE1wNFNwYWNlRW5jLT5oRGVsYXkpOworICAgIGhNcDRTcGFjZUVuYy0+blN1cnJvdW5kQW5hbHlzaXNCdWZmZXJEZWxheSA9CisgICAgICAgIGZka19zYWNlbmNfZGVsYXlfR2V0U3Vycm91bmRBbmFseXNpc0J1ZmZlckRlbGF5KGhNcDRTcGFjZUVuYy0+aERlbGF5KTsKKyAgICBoTXA0U3BhY2VFbmMtPm5CaXRzdHJlYW1CdWZmZXJSZWFkID0gMDsKKyAgICBoTXA0U3BhY2VFbmMtPm5CaXRzdHJlYW1CdWZmZXJXcml0ZSA9CisgICAgICAgIGhNcDRTcGFjZUVuYy0+bkJpdHN0cmVhbURlbGF5QnVmZmVyIC0gMTsKKworICAgIGlmIChoTXA0U3BhY2VFbmMtPmVuY01vZGUgPT0gU0FDRU5DXzIxMikgeworICAgICAgLyogbW9kZSAyMTIgZXhwZWN0cyBubyBiaXRzdHJlYW0gZGVsYXkgKi8KKyAgICAgIGlmIChoTXA0U3BhY2VFbmMtPm5CaXRzdHJlYW1CdWZmZXJXcml0ZSAhPQorICAgICAgICAgIGhNcDRTcGFjZUVuYy0+bkJpdHN0cmVhbUJ1ZmZlclJlYWQpIHsKKyAgICAgICAgZXJyb3IgPSBTQUNFTkNfUEFSQU1fRVJST1I7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKworICAgICAgLyogbW9kZSAyMTIgZXhwZWN0cyBubyBvdXRwdXQgYnVmZmVyIGRlbGF5ICovCisgICAgICBpZiAoaE1wNFNwYWNlRW5jLT5uT3V0cHV0QnVmZmVyRGVsYXkgIT0gMCkgeworICAgICAgICBlcnJvciA9IFNBQ0VOQ19QQVJBTV9FUlJPUjsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgIH0KKworICAgIC8qKiogSW5wdXQgZGVsYXkgdG8gb2J0YWluIGEgbmV0IGVuY29kZXIgZGVsYXkgdGhhdCBpcyBhIG11bHRpcGxlCisgICAgb2YgdGhlIHVzZWQgZnJhbWVsZW5ndGggdG8gZW5zdXJlIHN5bmNocm9uaXphdGlvbiBvZiBmcmFtaW5nCisgICAgaW4gYXJ0aXN0aWMgZG93bi1taXggd2l0aCB0aGUgY29ycmVzcG9uZGluZyBzcGF0aWFsIGRhdGEuICAgICAgKioqLworICAgIGhNcDRTcGFjZUVuYy0+bkRpc2NhcmRPdXRGcmFtZXMgPQorICAgICAgICBmZGtfc2FjZW5jX2RlbGF5X0dldERpc2NhcmRPdXRGcmFtZXMoaE1wNFNwYWNlRW5jLT5oRGVsYXkpOworICAgIGhNcDRTcGFjZUVuYy0+bklucHV0RGVsYXkgPQorICAgICAgICBmZGtfc2FjZW5jX2RlbGF5X0dldERteEFsaWduQnVmZmVyRGVsYXkoaE1wNFNwYWNlRW5jLT5oRGVsYXkpOworCisgICAgLyogcmVzZXQgaW5kZXBlbmRlbmN5IEZsYWcgY291bnRlciAqLworICAgIGhNcDRTcGFjZUVuYy0+aW5kZXBlbmRlbmN5Q291bnQgPSAwOworICAgIGhNcDRTcGFjZUVuYy0+aW5kZXBlbmRlbmN5RmxhZyA9IDE7CisKKyAgICBpbnQgaTsKKworICAgIC8qIHdyaXRlIHNvbWUgcGFyYW1ldGVycyB0byBiaXRzdHJlYW0gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaE1wNFNwYWNlRW5jLT5uQml0c3RyZWFtRGVsYXlCdWZmZXIgLSAxOyBpKyspIHsKKyAgICAgIFNQQVRJQUxGUkFNRSAqcEZyYW1lRGF0YSA9IE5VTEw7CisKKyAgICAgIGlmIChOVUxMID09IChwRnJhbWVEYXRhID0gZmRrX3NhY2VuY19nZXRTcGF0aWFsRnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgIGhNcDRTcGFjZUVuYy0+aEJpdHN0cmVhbUZvcm1hdHRlciwgUkVBRF9TUEFUSUFMRlJBTUUpKSkgeworICAgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorCisgICAgICBwRnJhbWVEYXRhLT5ic0luZGVwZW5kZW5jeUZsYWcgPSAxOworICAgICAgcEZyYW1lRGF0YS0+ZnJhbWluZ0luZm8ubnVtUGFyYW1TZXRzID0gMTsKKyAgICAgIHBGcmFtZURhdGEtPmZyYW1pbmdJbmZvLmJzRnJhbWluZ1R5cGUgPSAwOworCisgICAgICBmZGtfc2FjZW5jX3dyaXRlU3BhdGlhbEZyYW1lKAorICAgICAgICAgIGhNcDRTcGFjZUVuYy0+cHBCaXRzdHJlYW1EZWxheUJ1ZmZlcltpXSwgTUFYX01QRUdTX0JZVEVTLAorICAgICAgICAgICZoTXA0U3BhY2VFbmMtPnBuT3V0cHV0Qml0c1tpXSwgaE1wNFNwYWNlRW5jLT5oQml0c3RyZWFtRm9ybWF0dGVyKTsKKyAgICB9CisKKyAgICBpZiAoKGhNcDRTcGFjZUVuYy0+bklucHV0RGVsYXkgPiBNQVhfREVMQVlfSU5QVVQpIHx8CisgICAgICAgIChoTXA0U3BhY2VFbmMtPm5PdXRwdXRCdWZmZXJEZWxheSA+IE1BWF9ERUxBWV9PVVRQVVQpIHx8CisgICAgICAgIChoTXA0U3BhY2VFbmMtPm5TdXJyb3VuZEFuYWx5c2lzQnVmZmVyRGVsYXkgPgorICAgICAgICAgTUFYX0RFTEFZX1NVUlJPVU5EX0FOQUxZU0lTKSB8fAorICAgICAgICAoaE1wNFNwYWNlRW5jLT5uQml0c3RyZWFtRGVsYXlCdWZmZXIgPiBNQVhfQklUU1RSRUFNX0RFTEFZKSkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5JVF9FUlJPUjsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgIH0KKworYmFpbDoKKworICByZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBRVUFOVE1PREUgX19tYXBRdWFudE1vZGUoY29uc3QgTVA0U1BBQ0VFTkNfUVVBTlRNT0RFIHF1YW50TW9kZSkgeworICBRVUFOVE1PREUgYnNRdWFudE1vZGUgPSBRVUFOVE1PREVfSU5WQUxJRDsKKworICBzd2l0Y2ggKHF1YW50TW9kZSkgeworICAgIGNhc2UgU0FDRU5DX1FVQU5UTU9ERV9GSU5FOgorICAgICAgYnNRdWFudE1vZGUgPSBRVUFOVE1PREVfRklORTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0FDRU5DX1FVQU5UTU9ERV9FQlExOgorICAgICAgYnNRdWFudE1vZGUgPSBRVUFOVE1PREVfRUJRMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0FDRU5DX1FVQU5UTU9ERV9FQlEyOgorICAgICAgYnNRdWFudE1vZGUgPSBRVUFOVE1PREVfRUJRMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0FDRU5DX1FVQU5UTU9ERV9SU1ZEMzoKKyAgICBjYXNlIFNBQ0VOQ19RVUFOVE1PREVfSU5WQUxJRDoKKyAgICBkZWZhdWx0OgorICAgICAgYnNRdWFudE1vZGUgPSBRVUFOVE1PREVfSU5WQUxJRDsKKyAgfSAvKiBzd2l0Y2ggaEVuYy0+cXVhbnRNb2RlICovCisKKyAgcmV0dXJuIGJzUXVhbnRNb2RlOworfQorCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiBGaWxsU3BhdGlhbFNwZWNpZmljQ29uZmlnKAorICAgIGNvbnN0IEhBTkRMRV9NUDRTUEFDRV9FTkNPREVSIGhFbmMsIFNQQVRJQUxTUEVDSUZJQ0NPTkZJRyAqY29uc3QgaFNzYykgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgoTlVMTCA9PSBoRW5jKSB8fCAoTlVMTCA9PSBoU3NjKSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIFNQQUNFX1RSRUVfREVTQ1JJUFRJT04gc3BhY2VUcmVlRGVzY3JpcHRpb247CisgICAgaW50IGk7CisKKyAgICAvKiBHZXQgdHJlZSBkZXNjcmlwdGlvbiAqLworICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gZmRrX3NhY2VuY19zcGFjZVRyZWVfR2V0RGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbmMtPmhTcGFjZVRyZWUsICZzcGFjZVRyZWVEZXNjcmlwdGlvbikpKSB7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgLyogRmlsbCBTU0MgKi8KKyAgICBGREttZW1jbGVhcihoU3NjLCBzaXplb2YoU1BBVElBTFNQRUNJRklDQ09ORklHKSk7IC8qIHJlc2V0ICovCisKKyAgICBoU3NjLT5udW1CYW5kcyA9IGhFbmMtPnNwYWNlVHJlZVNldHVwLm5QYXJhbUJhbmRzOyAvKiBmb3IgYnNGcmVxUmVzICovCisKKyAgICAvKiBGaWxsIHRyZWUgY29uZmlndXJhdGlvbiAqLworICAgIGhTc2MtPnRyZWVEZXNjcmlwdGlvbi5udW1PdHRCb3hlcyA9IHNwYWNlVHJlZURlc2NyaXB0aW9uLm5PdHRCb3hlczsKKyAgICBoU3NjLT50cmVlRGVzY3JpcHRpb24ubnVtSW5DaGFuID0gc3BhY2VUcmVlRGVzY3JpcHRpb24ubkluQ2hhbm5lbHM7CisgICAgaFNzYy0+dHJlZURlc2NyaXB0aW9uLm51bU91dENoYW4gPSBzcGFjZVRyZWVEZXNjcmlwdGlvbi5uT3V0Q2hhbm5lbHM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgU0FDRU5DX01BWF9OVU1fQk9YRVM7IGkrKykgeworICAgICAgaFNzYy0+b3R0Q29uZmlnW2ldLmJzT3R0QmFuZHMgPSBoU3NjLT5udW1CYW5kczsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGhFbmMtPmVuY01vZGUpIHsKKyAgICAgIGNhc2UgU0FDRU5DXzIxMjoKKyAgICAgICAgaFNzYy0+YnNUcmVlQ29uZmlnID0gVFJFRV8yMTI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTQUNFTkNfSU5WQUxJRF9NT0RFOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBoU3NjLT5ic1NhbXBsaW5nRnJlcXVlbmN5ID0KKyAgICAgICAgaEVuYy0+blNhbXBsZVJhdGU7IC8qIGZvciBic1NhbXBsaW5nRnJlcXVlbmN5SW5kZXggKi8KKyAgICBoU3NjLT5ic0ZyYW1lTGVuZ3RoID0gaEVuYy0+bkZyYW1lVGltZVNsb3RzIC0gMTsKKworICAgIC8qIG1hcCBkZWNvcnIgdHlwZSAqLworICAgIGlmIChERUNPUlJfSU5WQUxJRCA9PQorICAgICAgICAoaFNzYy0+YnNEZWNvcnJDb25maWcgPSBtcDRTcGFjZUVuY19HZXREZWNvcnJDb25maWcoaEVuYy0+ZW5jTW9kZSkpKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBtYXAgcXVhbnRNb2RlICovCisgICAgaWYgKFFVQU5UTU9ERV9JTlZBTElEID09CisgICAgICAgIChoU3NjLT5ic1F1YW50TW9kZSA9IF9fbWFwUXVhbnRNb2RlKGhFbmMtPnF1YW50TW9kZSkpKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBDb25maWd1cmUgR2FpbnMqLworICAgIGhTc2MtPmJzRml4ZWRHYWluRE1YID0gZmRrX3NhY2VuY19zdGF0aWNHYWluX0dldERteEdhaW4oaEVuYy0+aFN0YXRpY0dhaW4pOworICAgIGhTc2MtPmJzRW52UXVhbnRNb2RlID0gMDsKKworICB9IC8qIHZhbGlkIGhhbmRsZSAqLworCitiYWlsOgorICByZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBGREtfU0FDRU5DX0VSUk9SIG1wNFNwYWNlRW5jX0ZpbGxTcGFjZVRyZWVTZXR1cCgKKyAgICBjb25zdCBIQU5ETEVfTVA0U1BBQ0VfRU5DT0RFUiBoRW5jLAorICAgIFNQQUNFX1RSRUVfU0VUVVAgKmNvbnN0IGhTcGFjZVRyZWVTZXR1cCkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIC8qIFNhbml0eSBDaGVjayAqLworICBpZiAoTlVMTCA9PSBoRW5jIHx8IE5VTEwgPT0gaFNwYWNlVHJlZVNldHVwKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgUVVBTlRNT0RFIHRtcFF1YW50bW9kZSA9IFFVQU5UTU9ERV9JTlZBTElEOworCisgICAgLyogbWFwIHF1YW50TW9kZSAqLworICAgIGlmIChRVUFOVE1PREVfSU5WQUxJRCA9PSAodG1wUXVhbnRtb2RlID0gX19tYXBRdWFudE1vZGUoaEVuYy0+cXVhbnRNb2RlKSkpIHsKKyAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGhTcGFjZVRyZWVTZXR1cC0+blBhcmFtQmFuZHMgPSBoRW5jLT5uUGFyYW1CYW5kczsKKyAgICBoU3BhY2VUcmVlU2V0dXAtPmJVc2VDb2Fyc2VRdWFudFR0b0NsZCA9IGhFbmMtPnVzZUNvYXJzZVF1YW50Q2xkOworICAgIGhTcGFjZVRyZWVTZXR1cC0+YlVzZUNvYXJzZVF1YW50VHRvSWNjID0gaEVuYy0+dXNlQ29hcnNlUXVhbnRJY2M7CisgICAgaFNwYWNlVHJlZVNldHVwLT5xdWFudE1vZGUgPSB0bXBRdWFudG1vZGU7CisgICAgaFNwYWNlVHJlZVNldHVwLT5uSHlicmlkQmFuZHNNYXggPSBoRW5jLT5uSHlicmlkQmFuZHM7CisKKyAgICBzd2l0Y2ggKGhFbmMtPmVuY01vZGUpIHsKKyAgICAgIGNhc2UgU0FDRU5DXzIxMjoKKyAgICAgICAgaFNwYWNlVHJlZVNldHVwLT5tb2RlID0gU1BBQ0VUUkVFXzIxMjsKKyAgICAgICAgaFNwYWNlVHJlZVNldHVwLT5uQ2hhbm5lbHNJbk1heCA9IDI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTQUNFTkNfSU5WQUxJRF9NT0RFOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9IC8qIHN3aXRjaCBoRW5jLT5lbmNNb2RlICovCisKKyAgfSAvKiB2YWxpZCBoYW5kbGUgKi8KK2JhaWw6CisgIHJldHVybiBlcnJvcjsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBGREtfc2FjZW5jX2dldEluZm8oY29uc3QgSEFORExFX01QNFNQQUNFX0VOQ09ERVIgaE1wNFNwYWNlRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVA0U1BBQ0VFTkNfSU5GTyAqY29uc3QgcEluZm8pIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKE5VTEwgPT0gaE1wNFNwYWNlRW5jKSB8fCAoTlVMTCA9PSBwSW5mbykpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBwSW5mby0+blNhbXBsZVJhdGUgPSBoTXA0U3BhY2VFbmMtPm5TYW1wbGVSYXRlOworICAgIHBJbmZvLT5uU2FtcGxlc0ZyYW1lID0gaE1wNFNwYWNlRW5jLT5uRnJhbWVMZW5ndGg7CisgICAgcEluZm8tPm5Ub3RhbElucHV0Q2hhbm5lbHMgPSBoTXA0U3BhY2VFbmMtPm5JbnB1dENoYW5uZWxzOworICAgIHBJbmZvLT5uRG14RGVsYXkgPSBmZGtfc2FjZW5jX2RlbGF5X0dldEluZm9EbXhEZWxheShoTXA0U3BhY2VFbmMtPmhEZWxheSk7CisgICAgcEluZm8tPm5Db2RlY0RlbGF5ID0KKyAgICAgICAgZmRrX3NhY2VuY19kZWxheV9HZXRJbmZvQ29kZWNEZWxheShoTXA0U3BhY2VFbmMtPmhEZWxheSk7CisgICAgcEluZm8tPm5EZWNvZGVyRGVsYXkgPQorICAgICAgICBmZGtfc2FjZW5jX2RlbGF5X0dldEluZm9EZWNvZGVyRGVsYXkoaE1wNFNwYWNlRW5jLT5oRGVsYXkpOworICAgIHBJbmZvLT5uUGF5bG9hZERlbGF5ID0KKyAgICAgICAgZmRrX3NhY2VuY19kZWxheV9HZXRCaXRzdHJlYW1GcmFtZUJ1ZmZlclNpemUoaE1wNFNwYWNlRW5jLT5oRGVsYXkpIC0gMTsKKyAgICBwSW5mby0+bkRpc2NhcmRPdXRGcmFtZXMgPSBoTXA0U3BhY2VFbmMtPm5EaXNjYXJkT3V0RnJhbWVzOworCisgICAgcEluZm8tPnBTc2NCdWYgPSAmaE1wNFNwYWNlRW5jLT5zc2NCdWY7CisgIH0KKyAgcmV0dXJuIGVycm9yOworfQorCitGREtfU0FDRU5DX0VSUk9SIEZES19zYWNlbmNfc2V0UGFyYW0oSEFORExFX01QNFNQQUNFX0VOQ09ERVIgaE1wNFNwYWNlRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNQQUNFRU5DX1BBUkFNIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgdmFsdWUpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICAvKiBjaGVjayBlbmNvZGVyIGhhbmRsZSAqLworICBpZiAoaE1wNFNwYWNlRW5jID09IE5VTEwpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICAvKiBhcHBseSBwYXJhbSB2YWx1ZSAqLworICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBTQUNFTkNfTE9XREVMQVk6CisgICAgICBpZiAoISgodmFsdWUgPT0gMCkgfHwgKHZhbHVlID09IDEpIHx8ICh2YWx1ZSA9PSAyKSkpIHsKKyAgICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaE1wNFNwYWNlRW5jLT51c2VyLmJMZE1vZGUgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTQUNFTkNfRU5DX01PREU6CisgICAgICBzd2l0Y2ggKChNUDRTUEFDRUVOQ19NT0RFKXZhbHVlKSB7CisgICAgICAgIGNhc2UgU0FDRU5DXzIxMjoKKyAgICAgICAgICBoTXA0U3BhY2VFbmMtPnVzZXIuZW5jTW9kZSA9IChNUDRTUEFDRUVOQ19NT0RFKXZhbHVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNBQ0VOQ19TQU1QTEVSQVRFOgorICAgICAgaWYgKCgoaW50KXZhbHVlIDwgMCkgfHwKKyAgICAgICAgICAoKGludCl2YWx1ZSA+IGhNcDRTcGFjZUVuYy0+c2V0dXAubWF4U2FtcGxpbmdyYXRlKSkgeworICAgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBoTXA0U3BhY2VFbmMtPnVzZXIuc2FtcGxlUmF0ZSA9IHZhbHVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNBQ0VOQ19GUkFNRV9USU1FX1NMT1RTOgorICAgICAgaWYgKCgoaW50KXZhbHVlIDwgMCkgfHwKKyAgICAgICAgICAoKGludCl2YWx1ZSA+IGhNcDRTcGFjZUVuYy0+c2V0dXAubWF4RnJhbWVUaW1lU2xvdHMpKSB7CisgICAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGhNcDRTcGFjZUVuYy0+dXNlci5mcmFtZVRpbWVTbG90cyA9IHZhbHVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNBQ0VOQ19QQVJBTV9CQU5EUzoKKyAgICAgIHN3aXRjaCAoKE1QNFNQQUNFRU5DX0JBTkRTX0NPTkZJRyl2YWx1ZSkgeworICAgICAgICBjYXNlIFNBQ0VOQ19CQU5EU180OgorICAgICAgICBjYXNlIFNBQ0VOQ19CQU5EU181OgorICAgICAgICBjYXNlIFNBQ0VOQ19CQU5EU183OgorICAgICAgICBjYXNlIFNBQ0VOQ19CQU5EU185OgorICAgICAgICBjYXNlIFNBQ0VOQ19CQU5EU18xMjoKKyAgICAgICAgY2FzZSBTQUNFTkNfQkFORFNfMTU6CisgICAgICAgIGNhc2UgU0FDRU5DX0JBTkRTXzIzOgorICAgICAgICAgIGhNcDRTcGFjZUVuYy0+dXNlci5uUGFyYW1CYW5kcyA9IChNUDRTUEFDRUVOQ19CQU5EU19DT05GSUcpdmFsdWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0FDRU5DX1RJTUVfRE9NX0RNWDoKKyAgICAgIGlmICghKCh2YWx1ZSA9PSAwKSB8fCAodmFsdWUgPT0gMikpKSB7CisgICAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGhNcDRTcGFjZUVuYy0+dXNlci5iVGltZURvbWFpbkRteCA9IHZhbHVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNBQ0VOQ19ETVhfR0FJTjoKKyAgICAgIGlmICghKCh2YWx1ZSA9PSAwKSB8fCAodmFsdWUgPT0gMSkgfHwgKHZhbHVlID09IDIpIHx8ICh2YWx1ZSA9PSAzKSB8fAorICAgICAgICAgICAgKHZhbHVlID09IDQpIHx8ICh2YWx1ZSA9PSA1KSB8fCAodmFsdWUgPT0gNikgfHwgKHZhbHVlID09IDcpKSkgeworICAgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlcnJvciA9IGZka19zYWNlbmNfc3RhdGljR2Fpbl9TZXREbXhHYWluKGhNcDRTcGFjZUVuYy0+aFN0YXRpY0dhaW5Db25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNUDRTUEFDRUVOQ19ETVhfR0FJTil2YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0FDRU5DX0NPQVJTRV9RVUFOVDoKKyAgICAgIGlmICghKCh2YWx1ZSA9PSAwKSB8fCAodmFsdWUgPT0gMSkpKSB7CisgICAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGhNcDRTcGFjZUVuYy0+dXNlci5iVXNlQ29hcnNlUXVhbnQgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTQUNFTkNfUVVBTlRfTU9ERToKKyAgICAgIHN3aXRjaCAoKE1QNFNQQUNFRU5DX1FVQU5UTU9ERSl2YWx1ZSkgeworICAgICAgICBjYXNlIFNBQ0VOQ19RVUFOVE1PREVfRklORToKKyAgICAgICAgY2FzZSBTQUNFTkNfUVVBTlRNT0RFX0VCUTE6CisgICAgICAgIGNhc2UgU0FDRU5DX1FVQU5UTU9ERV9FQlEyOgorICAgICAgICAgIGhNcDRTcGFjZUVuYy0+dXNlci5xdWFudE1vZGUgPSAoTVA0U1BBQ0VFTkNfUVVBTlRNT0RFKXZhbHVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNBQ0VOQ19USU1FX0FMSUdOTUVOVDoKKyAgICAgIGlmICgoSU5UKXZhbHVlIDwgLTMyNzY4IHx8IChJTlQpdmFsdWUgPiAzMjc2NykgeworICAgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBoTXA0U3BhY2VFbmMtPnVzZXIudGltZUFsaWdubWVudCA9IHZhbHVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNBQ0VOQ19JTkRFUEVOREVOQ1lfQ09VTlQ6CisgICAgICBoTXA0U3BhY2VFbmMtPmluZGVwZW5kZW5jeUNvdW50ID0gdmFsdWU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0FDRU5DX0lOREVQRU5ERU5DWV9GQUNUT1I6CisgICAgICBoTXA0U3BhY2VFbmMtPnVzZXIuaW5kZXBlbmRlbmN5RmFjdG9yID0gdmFsdWU7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciA9IFNBQ0VOQ19VTlNVUFBPUlRFRF9QQVJBTUVURVI7CisgICAgICBicmVhazsKKyAgfSAvKiBzd2l0Y2gocGFyYW0pICovCitiYWlsOgorICByZXR1cm4gZXJyb3I7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgRkRLX3NhY2VuY19nZXRMaWJJbmZvKExJQl9JTkZPICppbmZvKSB7CisgIGludCBpID0gMDsKKworICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfQorCisgIEZES190b29sc0dldExpYkluZm8oaW5mbyk7CisKKyAgLyogc2VhcmNoIGZvciBuZXh0IGZyZWUgdGFiICovCisgIGZvciAoaSA9IDA7IGkgPCBGREtfTU9EVUxFX0xBU1Q7IGkrKykgeworICAgIGlmIChpbmZvW2ldLm1vZHVsZV9pZCA9PSBGREtfTk9ORSkgYnJlYWs7CisgIH0KKyAgaWYgKGkgPT0gRkRLX01PRFVMRV9MQVNUKSB7CisgICAgcmV0dXJuIFNBQ0VOQ19JTklUX0VSUk9SOworICB9CisKKyAgaW5mb1tpXS5tb2R1bGVfaWQgPSBGREtfTVBTRU5DOworICBpbmZvW2ldLmJ1aWxkX2RhdGUgPSBTQUNFTkNfTElCX0JVSUxEX0RBVEU7CisgIGluZm9baV0uYnVpbGRfdGltZSA9IFNBQ0VOQ19MSUJfQlVJTERfVElNRTsKKyAgaW5mb1tpXS50aXRsZSA9IFNBQ0VOQ19MSUJfVElUTEU7CisgIGluZm9baV0udmVyc2lvbiA9IExJQl9WRVJTSU9OKFNBQ0VOQ19MSUJfVkwwLCBTQUNFTkNfTElCX1ZMMSwgU0FDRU5DX0xJQl9WTDIpOworICBMSUJfVkVSU0lPTl9TVFJJTkcoJmluZm9baV0pOworCisgIC8qIENhcGFiaWxpdHkgZmxhZ3MgKi8KKyAgaW5mb1tpXS5mbGFncyA9IDA7CisgIC8qIEVuZCBvZiBmbGFncyAqLworCisgIHJldHVybiBTQUNFTkNfT0s7Cit9CisKK3N0YXRpYyBERUNPUlJDT05GSUcgbXA0U3BhY2VFbmNfR2V0RGVjb3JyQ29uZmlnKAorICAgIGNvbnN0IE1QNFNQQUNFRU5DX01PREUgZW5jTW9kZSkgeworICBERUNPUlJDT05GSUcgZGVjb3JyQ29uZmlnID0gREVDT1JSX0lOVkFMSUQ7CisKKyAgLyogc2V0IGRlY29yckNvbmZpZyBkZXBlbmRlbnQgb24gdHJlZSBtb2RlICovCisgIHN3aXRjaCAoZW5jTW9kZSkgeworICAgIGNhc2UgU0FDRU5DXzIxMjoKKyAgICAgIGRlY29yckNvbmZpZyA9IERFQ09SUl9RTUZTUExJVDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNBQ0VOQ19JTlZBTElEX01PREU6CisgICAgZGVmYXVsdDoKKyAgICAgIGRlY29yckNvbmZpZyA9IERFQ09SUl9JTlZBTElEOworICB9CisgIHJldHVybiBkZWNvcnJDb25maWc7Cit9CisKK3N0YXRpYyBGREtfU0FDRU5DX0VSUk9SIG1wNFNwYWNlRW5jX0luaXROdW1QYXJhbUJhbmRzKAorICAgIEhBTkRMRV9NUDRTUEFDRV9FTkNPREVSIGhFbmMsIGNvbnN0IE1QNFNQQUNFRU5DX0JBTkRTX0NPTkZJRyBuUGFyYW1CYW5kcykgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIC8qIFNldC9DaGVjayBuUGFyYW1CYW5kcyAqLworICBpbnQgayA9IDA7CisgIGNvbnN0IGludCBuID0gc2l6ZW9mKHBWYWxpZEJhbmRzX0xkKSAvIHNpemVvZihVQ0hBUik7CisgIGNvbnN0IFVDSEFSICpwQmFuZHMgPSBwVmFsaWRCYW5kc19MZDsKKworICB3aGlsZSAoayA8IG4gJiYgcEJhbmRzW2tdICE9IChVQ0hBUiluUGFyYW1CYW5kcykgKytrOworICBpZiAoayA9PSBuKSB7CisgICAgaEVuYy0+blBhcmFtQmFuZHMgPSBTQUNFTkNfQkFORFNfSU5WQUxJRDsKKyAgfSBlbHNlIHsKKyAgICBoRW5jLT5uUGFyYW1CYW5kcyA9IG5QYXJhbUJhbmRzOworICB9CisgIHJldHVybiBlcnJvcjsKK30KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX25sY19lbmMuY3BwIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfbmxjX2VuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhNmNjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX25sY19lbmMuY3BwCkBAIC0wLDAgKzEsMTQ0MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgS2Fyc3RlbiBMaW56bWVpZXIKKworICAgRGVzY3JpcHRpb246IE5vaXNlbGVzcyBDb2RpbmcKKyAgICAgICAgICAgICAgICBIdWZmbWFuIGVuY29kZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInNhY2VuY19ubGNfZW5jLmgiCisKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorI2luY2x1ZGUgImZpeHBvaW50X21hdGguaCIKKworI2luY2x1ZGUgInNhY2VuY19jb25zdC5oIgorI2luY2x1ZGUgInNhY2VuY19odWZmX3RhYi5oIgorI2luY2x1ZGUgInNhY2VuY19wYXJhbWV4dHJhY3QuaCIKKworLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQQUlSX1NISUZUIDQKKyNkZWZpbmUgUEFJUl9NQVNLIDB4ZgorCisjZGVmaW5lIFBCQ19NSU5fQkFORFMgNQorCit0eXBlZGVmIGVudW0geworICBCQUNLV0FSRFMgPSAweDAsCisgIEZPUldBUkRTID0gMHgxCisKK30gRElSRUNUSU9OOworCit0eXBlZGVmIGVudW0geworICBESUZGX0ZSRVEgPSAweDAsCisgIERJRkZfVElNRSA9IDB4MQorCit9IERJRkZfVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKyAgSFVGRl8xRCA9IDB4MCwKKyAgSFVGRl8yRCA9IDB4MQorCit9IENPRElOR19TQ0hFTUU7CisKK3R5cGVkZWYgZW51bSB7CisgIEZSRVFfUEFJUiA9IDB4MCwKKyAgVElNRV9QQUlSID0gMHgxCisKK30gUEFJUklORzsKKworLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY29uc3QgVUNIQVIgbGF2SHVmZlZhbFs0XSA9IHswLCAyLCA2LCA3fTsKK3N0YXRpYyBjb25zdCBVQ0hBUiBsYXZIdWZmTGVuWzRdID0gezEsIDIsIDMsIDN9OworCitzdGF0aWMgY29uc3QgVUNIQVIgbGF2X3N0ZXBfQ0xEW10gPSB7MCwgMCwgMCwgMCwgMSwgMSwgMiwgMiwgMywgM307CitzdGF0aWMgY29uc3QgVUNIQVIgbGF2X3N0ZXBfSUNDW10gPSB7MCwgMCwgMSwgMSwgMiwgMiwgMywgM307CisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc3BsaXRfbHNiKGNvbnN0IFNIT1JUICpjb25zdCBpbl9kYXRhLCBTSE9SVCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG51bV92YWwsIFNIT1JUICpjb25zdCBvdXRfZGF0YV9sc2IsCisgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKmNvbnN0IG91dF9kYXRhX21zYikgeworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3ZhbDsgaSsrKSB7CisgICAgU0hPUlQgdmFsID0gaW5fZGF0YVtpXSArIG9mZnNldDsKKyAgICBpZiAob3V0X2RhdGFfbHNiICE9IE5VTEwpIG91dF9kYXRhX2xzYltpXSA9IHZhbCAmIDB4MDAwMTsKKyAgICBpZiAob3V0X2RhdGFfbXNiICE9IE5VTEwpIG91dF9kYXRhX21zYltpXSA9IHZhbCA+PiAxOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGFwcGx5X2xzYl9jb2RpbmcoSEFORExFX0ZES19CSVRTVFJFQU0gc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgKmNvbnN0IGluX2RhdGFfbHNiLCBjb25zdCBVSU5UIG51bV9sc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBudW1fdmFsKSB7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fdmFsOyBpKyspIHsKKyAgICBGREt3cml0ZUJpdHMoc3RybSwgaW5fZGF0YV9sc2JbaV0sIG51bV9sc2IpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGNhbGNfZGlmZl9mcmVxKGNvbnN0IFNIT1JUICpjb25zdCBpbl9kYXRhLCBTSE9SVCAqY29uc3Qgb3V0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbnVtX3ZhbCkgeworICBpbnQgaTsKKyAgb3V0X2RhdGFbMF0gPSBpbl9kYXRhWzBdOworCisgIGZvciAoaSA9IDE7IGkgPCBudW1fdmFsOyBpKyspIHsKKyAgICBvdXRfZGF0YVtpXSA9IGluX2RhdGFbaV0gLSBpbl9kYXRhW2kgLSAxXTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBjYWxjX2RpZmZfdGltZShjb25zdCBTSE9SVCAqY29uc3QgaW5fZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUICpjb25zdCBwcmV2X2RhdGEsIFNIT1JUICpjb25zdCBvdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBudW1fdmFsKSB7CisgIGludCBpOworICBvdXRfZGF0YVswXSA9IGluX2RhdGFbMF07CisgIG91dF9kYXRhWzFdID0gcHJldl9kYXRhWzBdOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fdmFsOyBpKyspIHsKKyAgICBvdXRfZGF0YVtpICsgMl0gPSBpbl9kYXRhW2ldIC0gcHJldl9kYXRhW2ldOworICB9Cit9CisKK3N0YXRpYyBJTlQgc3ltX2NoZWNrKFNIT1JUIGRhdGFbMl0sIGNvbnN0IElOVCBsYXYsIFNIT1JUICpjb25zdCBwU3ltX2JpdHMpIHsKKyAgVUNIQVIgc3ltQml0cyA9IDA7CisgIGludCBzdW1fdmFsID0gZGF0YVswXSArIGRhdGFbMV07CisgIGludCBkaWZmX3ZhbCA9IGRhdGFbMF0gLSBkYXRhWzFdOworICBpbnQgbnVtX3NiaXRzID0gMDsKKworICBpZiAoc3VtX3ZhbCAhPSAwKSB7CisgICAgaW50IHN1bV9uZWcgPSAoc3VtX3ZhbCA8IDApID8gMSA6IDA7CisgICAgaWYgKHN1bV9uZWcpIHsKKyAgICAgIHN1bV92YWwgPSAtc3VtX3ZhbDsKKyAgICAgIGRpZmZfdmFsID0gLWRpZmZfdmFsOworICAgIH0KKyAgICBzeW1CaXRzID0gKHN5bUJpdHMgPDwgMSkgfCBzdW1fbmVnOworICAgIG51bV9zYml0cysrOworICB9CisKKyAgaWYgKGRpZmZfdmFsICE9IDApIHsKKyAgICBpbnQgZGlmZl9uZWcgPSAoZGlmZl92YWwgPCAwKSA/IDEgOiAwOworICAgIGlmIChkaWZmX25lZykgeworICAgICAgZGlmZl92YWwgPSAtZGlmZl92YWw7CisgICAgfQorICAgIHN5bUJpdHMgPSAoc3ltQml0cyA8PCAxKSB8IGRpZmZfbmVnOworICAgIG51bV9zYml0cysrOworICB9CisKKyAgaWYgKHBTeW1fYml0cyAhPSBOVUxMKSB7CisgICAgKnBTeW1fYml0cyA9IHN5bUJpdHM7CisgIH0KKworICBpZiAoc3VtX3ZhbCAlIDIpIHsKKyAgICBkYXRhWzBdID0gbGF2IC0gc3VtX3ZhbCAvIDI7CisgICAgZGF0YVsxXSA9IGxhdiAtIGRpZmZfdmFsIC8gMjsKKyAgfSBlbHNlIHsKKyAgICBkYXRhWzBdID0gc3VtX3ZhbCAvIDI7CisgICAgZGF0YVsxXSA9IGRpZmZfdmFsIC8gMjsKKyAgfQorCisgIHJldHVybiBudW1fc2JpdHM7Cit9CisKK3N0YXRpYyBJTlQgaWxvZzIoVUlOVCBpKSB7CisgIGludCBsID0gMDsKKworICBpZiAoaSkgaS0tOworICB3aGlsZSAoaSA+IDApIHsKKyAgICBpID4+PSAxOworICAgIGwrKzsKKyAgfQorCisgIHJldHVybiBsOworfQorCitzdGF0aWMgU0hPUlQgY2FsY19wY21fYml0cyhjb25zdCBTSE9SVCBudW1fdmFsLCBjb25zdCBTSE9SVCBudW1fbGV2ZWxzKSB7CisgIFNIT1JUIG51bV9jb21wbGV0ZV9jaHVua3MgPSAwLCByZXN0X2NodW5rX3NpemUgPSAwOworICBTSE9SVCBtYXhfZ3JwX2xlbiA9IDAsIGJpdHNfcGNtID0gMDsKKyAgaW50IGNodW5rX2xldmVscywgaTsKKworICBzd2l0Y2ggKG51bV9sZXZlbHMpIHsKKyAgICBjYXNlIDM6CisgICAgICBtYXhfZ3JwX2xlbiA9IDU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICBtYXhfZ3JwX2xlbiA9IDU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICBtYXhfZ3JwX2xlbiA9IDY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDExOgorICAgICAgbWF4X2dycF9sZW4gPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzoKKyAgICAgIG1heF9ncnBfbGVuID0gNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTk6CisgICAgICBtYXhfZ3JwX2xlbiA9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI1OgorICAgICAgbWF4X2dycF9sZW4gPSAzOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1MToKKyAgICAgIG1heF9ncnBfbGVuID0gNDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBtYXhfZ3JwX2xlbiA9IDE7CisgIH0KKworICBudW1fY29tcGxldGVfY2h1bmtzID0gbnVtX3ZhbCAvIG1heF9ncnBfbGVuOworICByZXN0X2NodW5rX3NpemUgPSBudW1fdmFsICUgbWF4X2dycF9sZW47CisKKyAgY2h1bmtfbGV2ZWxzID0gMTsKKyAgZm9yIChpID0gMTsgaSA8PSBtYXhfZ3JwX2xlbjsgaSsrKSB7CisgICAgY2h1bmtfbGV2ZWxzICo9IG51bV9sZXZlbHM7CisgIH0KKworICBiaXRzX3BjbSA9IChTSE9SVCkoaWxvZzIoY2h1bmtfbGV2ZWxzKSAqIG51bV9jb21wbGV0ZV9jaHVua3MpOworICBiaXRzX3BjbSArPSAoU0hPUlQpKGlsb2cyKG51bV9sZXZlbHMpICogcmVzdF9jaHVua19zaXplKTsKKworICByZXR1cm4gYml0c19wY207Cit9CisKK3N0YXRpYyB2b2lkIGFwcGx5X3BjbV9jb2RpbmcoSEFORExFX0ZES19CSVRTVFJFQU0gc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgKmNvbnN0IGluX2RhdGFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgKmNvbnN0IGluX2RhdGFfMiwgY29uc3QgU0hPUlQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCBudW1fdmFsLCBjb25zdCBTSE9SVCBudW1fbGV2ZWxzKSB7CisgIFNIT1JUIGkgPSAwLCBqID0gMCwgaWR4ID0gMDsKKyAgU0hPUlQgbWF4X2dycF9sZW4gPSAwLCBncnBfbGVuID0gMCwgbmV4dF92YWwgPSAwOworICBpbnQgZ3JwX3ZhbCA9IDAsIGNodW5rX2xldmVscyA9IDA7CisKKyAgU0hPUlQgcGNtX2NodW5rX3NpemVbN10gPSB7MH07CisKKyAgc3dpdGNoIChudW1fbGV2ZWxzKSB7CisgICAgY2FzZSAzOgorICAgICAgbWF4X2dycF9sZW4gPSA1OworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgbWF4X2dycF9sZW4gPSAzOworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgbWF4X2dycF9sZW4gPSA1OworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgbWF4X2dycF9sZW4gPSA2OworICAgICAgYnJlYWs7CisgICAgY2FzZSA5OgorICAgICAgbWF4X2dycF9sZW4gPSA1OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMToKKyAgICAgIG1heF9ncnBfbGVuID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6CisgICAgICBtYXhfZ3JwX2xlbiA9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE5OgorICAgICAgbWF4X2dycF9sZW4gPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNToKKyAgICAgIG1heF9ncnBfbGVuID0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNTE6CisgICAgICBtYXhfZ3JwX2xlbiA9IDQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbWF4X2dycF9sZW4gPSAxOworICB9CisKKyAgY2h1bmtfbGV2ZWxzID0gMTsKKyAgZm9yIChpID0gMTsgaSA8PSBtYXhfZ3JwX2xlbjsgaSsrKSB7CisgICAgY2h1bmtfbGV2ZWxzICo9IG51bV9sZXZlbHM7CisgICAgcGNtX2NodW5rX3NpemVbaV0gPSBpbG9nMihjaHVua19sZXZlbHMpOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV92YWw7IGkgKz0gbWF4X2dycF9sZW4pIHsKKyAgICBncnBfbGVuID0gRkRLbWluKG1heF9ncnBfbGVuLCBudW1fdmFsIC0gaSk7CisgICAgZ3JwX3ZhbCA9IDA7CisgICAgZm9yIChqID0gMDsgaiA8IGdycF9sZW47IGorKykgeworICAgICAgaWR4ID0gaSArIGo7CisgICAgICBpZiAoaW5fZGF0YV8yID09IE5VTEwpIHsKKyAgICAgICAgbmV4dF92YWwgPSBpbl9kYXRhXzFbaWR4XTsKKyAgICAgIH0gZWxzZSBpZiAoaW5fZGF0YV8xID09IE5VTEwpIHsKKyAgICAgICAgbmV4dF92YWwgPSBpbl9kYXRhXzJbaWR4XTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5leHRfdmFsID0gKChpZHggJSAyKSA/IGluX2RhdGFfMltpZHggLyAyXSA6IGluX2RhdGFfMVtpZHggLyAyXSk7CisgICAgICB9CisgICAgICBuZXh0X3ZhbCArPSBvZmZzZXQ7CisgICAgICBncnBfdmFsID0gZ3JwX3ZhbCAqIG51bV9sZXZlbHMgKyBuZXh0X3ZhbDsKKyAgICB9CisKKyAgICBGREt3cml0ZUJpdHMoc3RybSwgZ3JwX3ZhbCwgcGNtX2NodW5rX3NpemVbZ3JwX2xlbl0pOworICB9Cit9CisKK3N0YXRpYyBVSU5UIGh1ZmZfZW5jXzFEKEhBTkRMRV9GREtfQklUU1RSRUFNIHN0cm0sIGNvbnN0IERBVEFfVFlQRSBkYXRhX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZGltMSwgU0hPUlQgKmNvbnN0IGluX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCBudW1fdmFsLCBjb25zdCBTSE9SVCBwMF9mbGFnKSB7CisgIGludCBpLCBvZmZzZXQgPSAwOworICBVSU5UIGh1ZmZCaXRzID0gMDsKKworICBIVUZGX0VOVFJZIHBhcnQwID0gezB9OworICBjb25zdCBIVUZGX0VOVFJZICpwSHVmZlRhYiA9IE5VTEw7CisKKyAgc3dpdGNoIChkYXRhX3R5cGUpIHsKKyAgICBjYXNlIHRfQ0xEOgorICAgICAgcEh1ZmZUYWIgPSBmZGtfc2FjZW5jX2h1ZmZDTERUYWIuaDFEW2RpbTFdOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X0lDQzoKKyAgICAgIHBIdWZmVGFiID0gZmRrX3NhY2VuY19odWZmSUNDVGFiLmgxRFtkaW0xXTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKHAwX2ZsYWcpIHsKKyAgICBzd2l0Y2ggKGRhdGFfdHlwZSkgeworICAgICAgY2FzZSB0X0NMRDoKKyAgICAgICAgcGFydDAgPSBmZGtfc2FjZW5jX2h1ZmZQYXJ0MFRhYi5jbGRbaW5fZGF0YVswXV07CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X0lDQzoKKyAgICAgICAgcGFydDAgPSBmZGtfc2FjZW5jX2h1ZmZQYXJ0MFRhYi5pY2NbaW5fZGF0YVswXV07CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBodWZmQml0cyArPSBGREt3cml0ZUJpdHMoc3RybSwgSFVGRl9WQUxVRShwYXJ0MCksIEhVRkZfTEVOR1RIKHBhcnQwKSk7CisgICAgb2Zmc2V0ID0gMTsKKyAgfQorCisgIGZvciAoaSA9IG9mZnNldDsgaSA8IG51bV92YWw7IGkrKykgeworICAgIGludCBpZF9zaWduID0gMDsKKyAgICBpbnQgaWQgPSBpbl9kYXRhW2ldOworCisgICAgaWYgKGlkICE9IDApIHsKKyAgICAgIGlkX3NpZ24gPSAwOworICAgICAgaWYgKGlkIDwgMCkgeworICAgICAgICBpZCA9IC1pZDsKKyAgICAgICAgaWRfc2lnbiA9IDE7CisgICAgICB9CisgICAgfQorCisgICAgaHVmZkJpdHMgKz0KKyAgICAgICAgRkRLd3JpdGVCaXRzKHN0cm0sIEhVRkZfVkFMVUUocEh1ZmZUYWJbaWRdKSwgSFVGRl9MRU5HVEgocEh1ZmZUYWJbaWRdKSk7CisKKyAgICBpZiAoaWQgIT0gMCkgeworICAgICAgaHVmZkJpdHMgKz0gRkRLd3JpdGVCaXRzKHN0cm0sIGlkX3NpZ24sIDEpOworICAgIH0KKyAgfSAvKiBmb3IgaSAqLworCisgIHJldHVybiBodWZmQml0czsKK30KKworc3RhdGljIHZvaWQgZ2V0SHVmZkVudHJ5KGNvbnN0IElOVCBsYXYsIGNvbnN0IERBVEFfVFlQRSBkYXRhX3R5cGUsIGNvbnN0IElOVCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNIT1JUIHRhYl9pZHhfMkRbMl0sIGNvbnN0IFNIT1JUIGluX2RhdGFbXVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIVUZGX0VOVFJZICpjb25zdCBwRW50cnksIEhVRkZfRU5UUlkgKmNvbnN0IHBFc2NhcGUpIHsKKyAgY29uc3QgSFVGRl9DTERfVEFCXzJEICpwQ0xEMmRUYWIgPQorICAgICAgJmZka19zYWNlbmNfaHVmZkNMRFRhYi5oMkRbdGFiX2lkeF8yRFswXV1bdGFiX2lkeF8yRFsxXV07CisgIGNvbnN0IEhVRkZfSUNDX1RBQl8yRCAqcElDQzJkVGFiID0KKyAgICAgICZmZGtfc2FjZW5jX2h1ZmZJQ0NUYWIuaDJEW3RhYl9pZHhfMkRbMF1dW3RhYl9pZHhfMkRbMV1dOworCisgIHN3aXRjaCAobGF2KSB7CisgICAgY2FzZSAxOiB7CisgICAgICBjb25zdCBMQVYxXzJEICpwTGF2MSA9IE5VTEw7CisgICAgICBzd2l0Y2ggKGRhdGFfdHlwZSkgeworICAgICAgICBjYXNlIHRfQ0xEOgorICAgICAgICAgIHBMYXYxID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X0lDQzoKKyAgICAgICAgICBwTGF2MSA9ICZwSUNDMmRUYWItPmxhdjE7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAocExhdjEgIT0gTlVMTCkgeworICAgICAgICAqcEVudHJ5ID0gcExhdjEtPmVudHJ5W2luX2RhdGFbaV1bMF1dW2luX2RhdGFbaV1bMV1dOworICAgICAgICAqcEVzY2FwZSA9IHBMYXYxLT5lc2NhcGU7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIDM6IHsKKyAgICAgIGNvbnN0IExBVjNfMkQgKnBMYXYzID0gTlVMTDsKKyAgICAgIHN3aXRjaCAoZGF0YV90eXBlKSB7CisgICAgICAgIGNhc2UgdF9DTEQ6CisgICAgICAgICAgcExhdjMgPSAmcENMRDJkVGFiLT5sYXYzOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfSUNDOgorICAgICAgICAgIHBMYXYzID0gJnBJQ0MyZFRhYi0+bGF2MzsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChwTGF2MyAhPSBOVUxMKSB7CisgICAgICAgICpwRW50cnkgPSBwTGF2My0+ZW50cnlbaW5fZGF0YVtpXVswXV1baW5fZGF0YVtpXVsxXV07CisgICAgICAgICpwRXNjYXBlID0gcExhdjMtPmVzY2FwZTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgNTogeworICAgICAgY29uc3QgTEFWNV8yRCAqcExhdjUgPSBOVUxMOworICAgICAgc3dpdGNoIChkYXRhX3R5cGUpIHsKKyAgICAgICAgY2FzZSB0X0NMRDoKKyAgICAgICAgICBwTGF2NSA9ICZwQ0xEMmRUYWItPmxhdjU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9JQ0M6CisgICAgICAgICAgcExhdjUgPSAmcElDQzJkVGFiLT5sYXY1OworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHBMYXY1ICE9IE5VTEwpIHsKKyAgICAgICAgKnBFbnRyeSA9IHBMYXY1LT5lbnRyeVtpbl9kYXRhW2ldWzBdXVtpbl9kYXRhW2ldWzFdXTsKKyAgICAgICAgKnBFc2NhcGUgPSBwTGF2NS0+ZXNjYXBlOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSA3OiB7CisgICAgICBjb25zdCBMQVY3XzJEICpwTGF2NyA9IE5VTEw7CisgICAgICBzd2l0Y2ggKGRhdGFfdHlwZSkgeworICAgICAgICBjYXNlIHRfQ0xEOgorICAgICAgICAgIHBMYXY3ID0gJnBDTEQyZFRhYi0+bGF2NzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X0lDQzoKKyAgICAgICAgICBwTGF2NyA9ICZwSUNDMmRUYWItPmxhdjc7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAocExhdjcgIT0gTlVMTCkgeworICAgICAgICAqcEVudHJ5ID0gcExhdjctPmVudHJ5W2luX2RhdGFbaV1bMF1dW2luX2RhdGFbaV1bMV1dOworICAgICAgICAqcEVzY2FwZSA9IHBMYXY3LT5lc2NhcGU7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIDk6IHsKKyAgICAgIGNvbnN0IExBVjlfMkQgKnBMYXY5ID0gTlVMTDsKKyAgICAgIHN3aXRjaCAoZGF0YV90eXBlKSB7CisgICAgICAgIGNhc2UgdF9DTEQ6CisgICAgICAgICAgcExhdjkgPSAmcENMRDJkVGFiLT5sYXY5OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfSUNDOgorICAgICAgICAgIHBMYXY5ID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChwTGF2OSAhPSBOVUxMKSB7CisgICAgICAgICpwRW50cnkgPSBwTGF2OS0+ZW50cnlbaW5fZGF0YVtpXVswXV1baW5fZGF0YVtpXVsxXV07CisgICAgICAgICpwRXNjYXBlID0gcExhdjktPmVzY2FwZTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBVSU5UIGh1ZmZfZW5jXzJEKEhBTkRMRV9GREtfQklUU1RSRUFNIHN0cm0sIGNvbnN0IERBVEFfVFlQRSBkYXRhX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCB0YWJfaWR4XzJEWzJdLCBTSE9SVCBsYXZfaWR4LCBTSE9SVCBpbl9kYXRhW11bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCBudW1fdmFsLCBTSE9SVCBzdHJpZGUsIFNIT1JUICpwMF9kYXRhWzJdKSB7CisgIFNIT1JUIGkgPSAwLCBsYXYgPSAwLCBudW1fc2JpdHMgPSAwLCBzeW1fYml0cyA9IDAsIGVzY0lkeCA9IDA7CisgIFNIT1JUIGVzY19kYXRhWzJdW01BWEJBTkRTXSA9IHt7MH19OworCisgIFVJTlQgaHVmZkJpdHMgPSAwOworCisgIGNvbnN0IEhVRkZfRU5UUlkgKnBIdWZmRW50cnkgPSBOVUxMOworCisgIHN3aXRjaCAoZGF0YV90eXBlKSB7CisgICAgY2FzZSB0X0NMRDoKKyAgICAgIGxhdiA9IDIgKiBsYXZfaWR4ICsgMzsgLyogTEFWICovCisgICAgICBwSHVmZkVudHJ5ID0gZmRrX3NhY2VuY19odWZmUGFydDBUYWIuY2xkOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X0lDQzoKKyAgICAgIGxhdiA9IDIgKiBsYXZfaWR4ICsgMTsgLyogTEFWICovCisgICAgICBwSHVmZkVudHJ5ID0gZmRrX3NhY2VuY19odWZmUGFydDBUYWIuaWNjOworICAgICAgYnJlYWs7CisgIH0KKworICAvKiBQYXJ0aXRpb24gMCAqLworICBpZiAocDBfZGF0YVswXSAhPSBOVUxMKSB7CisgICAgSFVGRl9FTlRSWSBlbnRyeSA9IHBIdWZmRW50cnlbKnAwX2RhdGFbMF1dOworICAgIGh1ZmZCaXRzICs9IEZES3dyaXRlQml0cyhzdHJtLCBIVUZGX1ZBTFVFKGVudHJ5KSwgSFVGRl9MRU5HVEgoZW50cnkpKTsKKyAgfQorICBpZiAocDBfZGF0YVsxXSAhPSBOVUxMKSB7CisgICAgSFVGRl9FTlRSWSBlbnRyeSA9IHBIdWZmRW50cnlbKnAwX2RhdGFbMV1dOworICAgIGh1ZmZCaXRzICs9IEZES3dyaXRlQml0cyhzdHJtLCBIVUZGX1ZBTFVFKGVudHJ5KSwgSFVGRl9MRU5HVEgoZW50cnkpKTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBudW1fdmFsOyBpICs9IHN0cmlkZSkgeworICAgIEhVRkZfRU5UUlkgZW50cnkgPSB7MH07CisgICAgSFVGRl9FTlRSWSBlc2NhcGUgPSB7MH07CisKKyAgICBlc2NfZGF0YVswXVtlc2NJZHhdID0gaW5fZGF0YVtpXVswXSArIGxhdjsKKyAgICBlc2NfZGF0YVsxXVtlc2NJZHhdID0gaW5fZGF0YVtpXVsxXSArIGxhdjsKKworICAgIG51bV9zYml0cyA9IHN5bV9jaGVjayhpbl9kYXRhW2ldLCBsYXYsICZzeW1fYml0cyk7CisKKyAgICBnZXRIdWZmRW50cnkobGF2LCBkYXRhX3R5cGUsIGksIHRhYl9pZHhfMkQsIGluX2RhdGEsICZlbnRyeSwgJmVzY2FwZSk7CisKKyAgICBodWZmQml0cyArPSBGREt3cml0ZUJpdHMoc3RybSwgSFVGRl9WQUxVRShlbnRyeSksIEhVRkZfTEVOR1RIKGVudHJ5KSk7CisKKyAgICBpZiAoKEhVRkZfVkFMVUUoZW50cnkpID09IEhVRkZfVkFMVUUoZXNjYXBlKSkgJiYKKyAgICAgICAgKEhVRkZfTEVOR1RIKGVudHJ5KSA9PSBIVUZGX0xFTkdUSChlc2NhcGUpKSkgeworICAgICAgZXNjSWR4Kys7CisgICAgfSBlbHNlIHsKKyAgICAgIGh1ZmZCaXRzICs9IEZES3dyaXRlQml0cyhzdHJtLCBzeW1fYml0cywgbnVtX3NiaXRzKTsKKyAgICB9CisgIH0gLyogZm9yIGkgKi8KKworICBpZiAoZXNjSWR4ID4gMCkgeworICAgIGh1ZmZCaXRzICs9IGNhbGNfcGNtX2JpdHMoMiAqIGVzY0lkeCwgKDIgKiBsYXYgKyAxKSk7CisgICAgaWYgKHN0cm0gIT0gTlVMTCkgeworICAgICAgYXBwbHlfcGNtX2NvZGluZyhzdHJtLCBlc2NfZGF0YVswXSwgZXNjX2RhdGFbMV0sIDAgLypvZmZzZXQqLywgMiAqIGVzY0lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgKDIgKiBsYXYgKyAxKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGh1ZmZCaXRzOworfQorCitzdGF0aWMgU0NIQVIgZ2V0X25leHRfbGF2X3N0ZXAoY29uc3QgSU5UIGxhdiwgY29uc3QgREFUQV9UWVBFIGRhdGFfdHlwZSkgeworICBTQ0hBUiBsYXZfc3RlcCA9IDA7CisKKyAgc3dpdGNoIChkYXRhX3R5cGUpIHsKKyAgICBjYXNlIHRfQ0xEOgorICAgICAgbGF2X3N0ZXAgPSAobGF2ID4gOSkgPyAtMSA6IGxhdl9zdGVwX0NMRFtsYXZdOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X0lDQzoKKyAgICAgIGxhdl9zdGVwID0gKGxhdiA+IDcpID8gLTEgOiBsYXZfc3RlcF9JQ0NbbGF2XTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGxhdl9zdGVwOworfQorCitzdGF0aWMgSU5UIGRpZmZfdHlwZV9vZmZzZXQoY29uc3QgRElGRl9UWVBFIGRpZmZfdHlwZSkgeworICBpbnQgb2Zmc2V0ID0gMDsKKyAgc3dpdGNoIChkaWZmX3R5cGUpIHsKKyAgICBjYXNlIERJRkZfRlJFUToKKyAgICAgIG9mZnNldCA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIERJRkZfVElNRToKKyAgICAgIG9mZnNldCA9IDI7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgU0hPUlQgY2FsY19odWZmX2JpdHMoU0hPUlQgKmluX2RhdGFfMSwgU0hPUlQgKmluX2RhdGFfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQVRBX1RZUEUgZGF0YV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERJRkZfVFlQRSBkaWZmX3R5cGVfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBESUZGX1RZUEUgZGlmZl90eXBlXzIsIGNvbnN0IFNIT1JUIG51bV92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKmNvbnN0IGxhdl9pZHgsIFNIT1JUICpjb25zdCBjZGdfc2NoZW1lKSB7CisgIFNIT1JUIHRhYl9pZHhfMkRbMl1bMl0gPSB7ezB9fTsKKyAgU0hPUlQgdGFiX2lkeF8xRFsyXSA9IHswfTsKKyAgU0hPUlQgZGZfcmVzdF9mbGFnWzJdID0gezB9OworICBTSE9SVCBwMF9mbGFnWzJdID0gezB9OworCisgIFNIT1JUIHBhaXJfdmVjW01BWEJBTkRTXVsyXSA9IHt7MH19OworCisgIFNIT1JUICpwMF9kYXRhXzFbMl0gPSB7TlVMTH07CisgIFNIT1JUICpwMF9kYXRhXzJbMl0gPSB7TlVMTH07CisKKyAgU0hPUlQgaSA9IDA7CisgIFNIT1JUIGxhdl9mcFsyXSA9IHswfTsKKworICBTSE9SVCBiaXRfY291bnRfMUQgPSAwOworICBTSE9SVCBiaXRfY291bnRfMkRfZnJlcSA9IDA7CisgIFNIT1JUIGJpdF9jb3VudF9taW4gPSAwOworCisgIFNIT1JUIG51bV92YWxfMV9zaG9ydCA9IDA7CisgIFNIT1JUIG51bV92YWxfMl9zaG9ydCA9IDA7CisKKyAgU0hPUlQgKmluX2RhdGFfMV9zaG9ydCA9IE5VTEw7CisgIFNIT1JUICppbl9kYXRhXzJfc2hvcnQgPSBOVUxMOworCisgIC8qIDFEIEh1ZmZtYW4gY29kaW5nICovCisgIGJpdF9jb3VudF8xRCA9IDE7IC8qIEhVRkZfMUQgKi8KKworICBudW1fdmFsXzFfc2hvcnQgPSBudW1fdmFsOworICBudW1fdmFsXzJfc2hvcnQgPSBudW1fdmFsOworCisgIGlmIChpbl9kYXRhXzEgIT0gTlVMTCkgeworICAgIGluX2RhdGFfMV9zaG9ydCA9IGluX2RhdGFfMSArIGRpZmZfdHlwZV9vZmZzZXQoZGlmZl90eXBlXzEpOworICB9CisgIGlmIChpbl9kYXRhXzIgIT0gTlVMTCkgeworICAgIGluX2RhdGFfMl9zaG9ydCA9IGluX2RhdGFfMiArIGRpZmZfdHlwZV9vZmZzZXQoZGlmZl90eXBlXzIpOworICB9CisKKyAgcDBfZmxhZ1swXSA9IChkaWZmX3R5cGVfMSA9PSBESUZGX0ZSRVEpOworICBwMF9mbGFnWzFdID0gKGRpZmZfdHlwZV8yID09IERJRkZfRlJFUSk7CisKKyAgdGFiX2lkeF8xRFswXSA9IChkaWZmX3R5cGVfMSA9PSBESUZGX0ZSRVEpID8gMCA6IDE7CisgIHRhYl9pZHhfMURbMV0gPSAoZGlmZl90eXBlXzIgPT0gRElGRl9GUkVRKSA/IDAgOiAxOworCisgIGlmIChpbl9kYXRhXzEgIT0gTlVMTCkgeworICAgIGJpdF9jb3VudF8xRCArPSBodWZmX2VuY18xRChOVUxMLCBkYXRhX3R5cGUsIHRhYl9pZHhfMURbMF0sIGluX2RhdGFfMV9zaG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3ZhbF8xX3Nob3J0LCBwMF9mbGFnWzBdKTsKKyAgfQorICBpZiAoaW5fZGF0YV8yICE9IE5VTEwpIHsKKyAgICBiaXRfY291bnRfMUQgKz0gaHVmZl9lbmNfMUQoTlVMTCwgZGF0YV90eXBlLCB0YWJfaWR4XzFEWzFdLCBpbl9kYXRhXzJfc2hvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV92YWxfMl9zaG9ydCwgcDBfZmxhZ1sxXSk7CisgIH0KKworICBiaXRfY291bnRfbWluID0gYml0X2NvdW50XzFEOworICAqY2RnX3NjaGVtZSA9IEhVRkZfMUQgPDwgUEFJUl9TSElGVDsKKyAgbGF2X2lkeFswXSA9IGxhdl9pZHhbMV0gPSAtMTsKKworICAvKiBIdWZmbWFuIDJEIGZyZXF1ZW5jeSBwYWlycyAqLworICBiaXRfY291bnRfMkRfZnJlcSA9IDE7IC8qIEhVRkZfMkQgKi8KKworICBudW1fdmFsXzFfc2hvcnQgPSBudW1fdmFsOworICBudW1fdmFsXzJfc2hvcnQgPSBudW1fdmFsOworCisgIGlmIChpbl9kYXRhXzEgIT0gTlVMTCkgeworICAgIGluX2RhdGFfMV9zaG9ydCA9IGluX2RhdGFfMSArIGRpZmZfdHlwZV9vZmZzZXQoZGlmZl90eXBlXzEpOworICB9CisgIGlmIChpbl9kYXRhXzIgIT0gTlVMTCkgeworICAgIGluX2RhdGFfMl9zaG9ydCA9IGluX2RhdGFfMiArIGRpZmZfdHlwZV9vZmZzZXQoZGlmZl90eXBlXzIpOworICB9CisKKyAgbGF2X2ZwWzBdID0gbGF2X2ZwWzFdID0gMDsKKworICBwMF9kYXRhXzFbMF0gPSBOVUxMOworICBwMF9kYXRhXzFbMV0gPSBOVUxMOworICBwMF9kYXRhXzJbMF0gPSBOVUxMOworICBwMF9kYXRhXzJbMV0gPSBOVUxMOworCisgIGlmIChpbl9kYXRhXzEgIT0gTlVMTCkgeworICAgIGlmIChkaWZmX3R5cGVfMSA9PSBESUZGX0ZSRVEpIHsKKyAgICAgIHAwX2RhdGFfMVswXSA9ICZpbl9kYXRhXzFbMF07CisgICAgICBwMF9kYXRhXzFbMV0gPSBOVUxMOworCisgICAgICBudW1fdmFsXzFfc2hvcnQgLT0gMTsKKyAgICAgIGluX2RhdGFfMV9zaG9ydCArPSAxOworICAgIH0KKworICAgIGRmX3Jlc3RfZmxhZ1swXSA9IG51bV92YWxfMV9zaG9ydCAlIDI7CisKKyAgICBpZiAoZGZfcmVzdF9mbGFnWzBdKSBudW1fdmFsXzFfc2hvcnQgLT0gMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdmFsXzFfc2hvcnQgLSAxOyBpICs9IDIpIHsKKyAgICAgIHBhaXJfdmVjW2ldWzBdID0gaW5fZGF0YV8xX3Nob3J0W2ldOworICAgICAgcGFpcl92ZWNbaV1bMV0gPSBpbl9kYXRhXzFfc2hvcnRbaSArIDFdOworCisgICAgICBsYXZfZnBbMF0gPSBGREttYXgobGF2X2ZwWzBdLCBmQWJzKHBhaXJfdmVjW2ldWzBdKSk7CisgICAgICBsYXZfZnBbMF0gPSBGREttYXgobGF2X2ZwWzBdLCBmQWJzKHBhaXJfdmVjW2ldWzFdKSk7CisgICAgfQorCisgICAgdGFiX2lkeF8yRFswXVswXSA9IChkaWZmX3R5cGVfMSA9PSBESUZGX1RJTUUpID8gMSA6IDA7CisgICAgdGFiX2lkeF8yRFswXVsxXSA9IDA7CisKKyAgICB0YWJfaWR4XzFEWzBdID0gKGRpZmZfdHlwZV8xID09IERJRkZfRlJFUSkgPyAwIDogMTsKKworICAgIGxhdl9mcFswXSA9IGdldF9uZXh0X2xhdl9zdGVwKGxhdl9mcFswXSwgZGF0YV90eXBlKTsKKworICAgIGlmIChsYXZfZnBbMF0gIT0gLTEpIGJpdF9jb3VudF8yRF9mcmVxICs9IGxhdkh1ZmZMZW5bbGF2X2ZwWzBdXTsKKyAgfQorCisgIGlmIChpbl9kYXRhXzIgIT0gTlVMTCkgeworICAgIGlmIChkaWZmX3R5cGVfMiA9PSBESUZGX0ZSRVEpIHsKKyAgICAgIHAwX2RhdGFfMlswXSA9IE5VTEw7CisgICAgICBwMF9kYXRhXzJbMV0gPSAmaW5fZGF0YV8yWzBdOworCisgICAgICBudW1fdmFsXzJfc2hvcnQgLT0gMTsKKyAgICAgIGluX2RhdGFfMl9zaG9ydCArPSAxOworICAgIH0KKworICAgIGRmX3Jlc3RfZmxhZ1sxXSA9IG51bV92YWxfMl9zaG9ydCAlIDI7CisKKyAgICBpZiAoZGZfcmVzdF9mbGFnWzFdKSBudW1fdmFsXzJfc2hvcnQgLT0gMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdmFsXzJfc2hvcnQgLSAxOyBpICs9IDIpIHsKKyAgICAgIHBhaXJfdmVjW2kgKyAxXVswXSA9IGluX2RhdGFfMl9zaG9ydFtpXTsKKyAgICAgIHBhaXJfdmVjW2kgKyAxXVsxXSA9IGluX2RhdGFfMl9zaG9ydFtpICsgMV07CisKKyAgICAgIGxhdl9mcFsxXSA9IEZES21heChsYXZfZnBbMV0sIGZBYnMocGFpcl92ZWNbaSArIDFdWzBdKSk7CisgICAgICBsYXZfZnBbMV0gPSBGREttYXgobGF2X2ZwWzFdLCBmQWJzKHBhaXJfdmVjW2kgKyAxXVsxXSkpOworICAgIH0KKworICAgIHRhYl9pZHhfMkRbMV1bMF0gPSAoZGlmZl90eXBlXzIgPT0gRElGRl9USU1FKSA/IDEgOiAwOworICAgIHRhYl9pZHhfMkRbMV1bMV0gPSAwOworCisgICAgdGFiX2lkeF8xRFsxXSA9IChkaWZmX3R5cGVfMiA9PSBESUZGX0ZSRVEpID8gMCA6IDE7CisKKyAgICBsYXZfZnBbMV0gPSBnZXRfbmV4dF9sYXZfc3RlcChsYXZfZnBbMV0sIGRhdGFfdHlwZSk7CisKKyAgICBpZiAobGF2X2ZwWzFdICE9IC0xKSBiaXRfY291bnRfMkRfZnJlcSArPSBsYXZIdWZmTGVuW2xhdl9mcFsxXV07CisgIH0KKworICBpZiAoKGxhdl9mcFswXSAhPSAtMSkgJiYgKGxhdl9mcFsxXSAhPSAtMSkpIHsKKyAgICBpZiAoaW5fZGF0YV8xICE9IE5VTEwpIHsKKyAgICAgIGJpdF9jb3VudF8yRF9mcmVxICs9CisgICAgICAgICAgaHVmZl9lbmNfMkQoTlVMTCwgZGF0YV90eXBlLCB0YWJfaWR4XzJEWzBdLCBsYXZfZnBbMF0sIHBhaXJfdmVjLAorICAgICAgICAgICAgICAgICAgICAgIG51bV92YWxfMV9zaG9ydCwgMiwgcDBfZGF0YV8xKTsKKyAgICB9CisgICAgaWYgKGluX2RhdGFfMiAhPSBOVUxMKSB7CisgICAgICBiaXRfY291bnRfMkRfZnJlcSArPQorICAgICAgICAgIGh1ZmZfZW5jXzJEKE5VTEwsIGRhdGFfdHlwZSwgdGFiX2lkeF8yRFsxXSwgbGF2X2ZwWzFdLCBwYWlyX3ZlYyArIDEsCisgICAgICAgICAgICAgICAgICAgICAgbnVtX3ZhbF8yX3Nob3J0LCAyLCBwMF9kYXRhXzIpOworICAgIH0KKyAgICBpZiAoaW5fZGF0YV8xICE9IE5VTEwpIHsKKyAgICAgIGlmIChkZl9yZXN0X2ZsYWdbMF0pCisgICAgICAgIGJpdF9jb3VudF8yRF9mcmVxICs9CisgICAgICAgICAgICBodWZmX2VuY18xRChOVUxMLCBkYXRhX3R5cGUsIHRhYl9pZHhfMURbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbl9kYXRhXzFfc2hvcnQgKyBudW1fdmFsXzFfc2hvcnQsIDEsIDApOworICAgIH0KKyAgICBpZiAoaW5fZGF0YV8yICE9IE5VTEwpIHsKKyAgICAgIGlmIChkZl9yZXN0X2ZsYWdbMV0pCisgICAgICAgIGJpdF9jb3VudF8yRF9mcmVxICs9CisgICAgICAgICAgICBodWZmX2VuY18xRChOVUxMLCBkYXRhX3R5cGUsIHRhYl9pZHhfMURbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbl9kYXRhXzJfc2hvcnQgKyBudW1fdmFsXzJfc2hvcnQsIDEsIDApOworICAgIH0KKworICAgIGlmIChiaXRfY291bnRfMkRfZnJlcSA8IGJpdF9jb3VudF9taW4pIHsKKyAgICAgIGJpdF9jb3VudF9taW4gPSBiaXRfY291bnRfMkRfZnJlcTsKKyAgICAgICpjZGdfc2NoZW1lID0gSFVGRl8yRCA8PCBQQUlSX1NISUZUIHwgRlJFUV9QQUlSOworICAgICAgbGF2X2lkeFswXSA9IGxhdl9mcFswXTsKKyAgICAgIGxhdl9pZHhbMV0gPSBsYXZfZnBbMV07CisgICAgfQorICB9CisKKyAgcmV0dXJuIGJpdF9jb3VudF9taW47Cit9CisKK3N0YXRpYyB2b2lkIGFwcGx5X2h1ZmZfY29kaW5nKEhBTkRMRV9GREtfQklUU1RSRUFNIHN0cm0sIFNIT1JUICpjb25zdCBpbl9kYXRhXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqY29uc3QgaW5fZGF0YV8yLCBjb25zdCBEQVRBX1RZUEUgZGF0YV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRElGRl9UWVBFIGRpZmZfdHlwZV8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRElGRl9UWVBFIGRpZmZfdHlwZV8yLCBjb25zdCBTSE9SVCBudW1fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0hPUlQgKmNvbnN0IGxhdl9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTSE9SVCBjZGdfc2NoZW1lKSB7CisgIFNIT1JUIHRhYl9pZHhfMkRbMl1bMl0gPSB7ezB9fTsKKyAgU0hPUlQgdGFiX2lkeF8xRFsyXSA9IHswfTsKKyAgU0hPUlQgZGZfcmVzdF9mbGFnWzJdID0gezB9OworICBTSE9SVCBwMF9mbGFnWzJdID0gezB9OworCisgIFNIT1JUIHBhaXJfdmVjW01BWEJBTkRTXVsyXSA9IHt7MH19OworCisgIFNIT1JUICpwMF9kYXRhXzFbMl0gPSB7TlVMTH07CisgIFNIT1JUICpwMF9kYXRhXzJbMl0gPSB7TlVMTH07CisKKyAgU0hPUlQgaSA9IDA7CisKKyAgU0hPUlQgbnVtX3ZhbF8xX3Nob3J0ID0gbnVtX3ZhbDsKKyAgU0hPUlQgbnVtX3ZhbF8yX3Nob3J0ID0gbnVtX3ZhbDsKKworICBTSE9SVCAqaW5fZGF0YV8xX3Nob3J0ID0gTlVMTDsKKyAgU0hPUlQgKmluX2RhdGFfMl9zaG9ydCA9IE5VTEw7CisKKyAgLyogT2Zmc2V0ICovCisgIGlmIChpbl9kYXRhXzEgIT0gTlVMTCkgeworICAgIGluX2RhdGFfMV9zaG9ydCA9IGluX2RhdGFfMSArIGRpZmZfdHlwZV9vZmZzZXQoZGlmZl90eXBlXzEpOworICB9CisgIGlmIChpbl9kYXRhXzIgIT0gTlVMTCkgeworICAgIGluX2RhdGFfMl9zaG9ydCA9IGluX2RhdGFfMiArIGRpZmZfdHlwZV9vZmZzZXQoZGlmZl90eXBlXzIpOworICB9CisKKyAgLyogU2lnbmFsaXplIGNvZGluZyBzY2hlbWUgKi8KKyAgRkRLd3JpdGVCaXRzKHN0cm0sIGNkZ19zY2hlbWUgPj4gUEFJUl9TSElGVCwgMSk7CisKKyAgc3dpdGNoIChjZGdfc2NoZW1lID4+IFBBSVJfU0hJRlQpIHsKKyAgICBjYXNlIEhVRkZfMUQ6CisKKyAgICAgIHAwX2ZsYWdbMF0gPSAoZGlmZl90eXBlXzEgPT0gRElGRl9GUkVRKTsKKyAgICAgIHAwX2ZsYWdbMV0gPSAoZGlmZl90eXBlXzIgPT0gRElGRl9GUkVRKTsKKworICAgICAgdGFiX2lkeF8xRFswXSA9IChkaWZmX3R5cGVfMSA9PSBESUZGX0ZSRVEpID8gMCA6IDE7CisgICAgICB0YWJfaWR4XzFEWzFdID0gKGRpZmZfdHlwZV8yID09IERJRkZfRlJFUSkgPyAwIDogMTsKKworICAgICAgaWYgKGluX2RhdGFfMSAhPSBOVUxMKSB7CisgICAgICAgIGh1ZmZfZW5jXzFEKHN0cm0sIGRhdGFfdHlwZSwgdGFiX2lkeF8xRFswXSwgaW5fZGF0YV8xX3Nob3J0LAorICAgICAgICAgICAgICAgICAgICBudW1fdmFsXzFfc2hvcnQsIHAwX2ZsYWdbMF0pOworICAgICAgfQorICAgICAgaWYgKGluX2RhdGFfMiAhPSBOVUxMKSB7CisgICAgICAgIGh1ZmZfZW5jXzFEKHN0cm0sIGRhdGFfdHlwZSwgdGFiX2lkeF8xRFsxXSwgaW5fZGF0YV8yX3Nob3J0LAorICAgICAgICAgICAgICAgICAgICBudW1fdmFsXzJfc2hvcnQsIHAwX2ZsYWdbMV0pOworICAgICAgfQorICAgICAgYnJlYWs7IC8qIEhVRkZfMUQgKi8KKworICAgIGNhc2UgSFVGRl8yRDoKKworICAgICAgc3dpdGNoIChjZGdfc2NoZW1lICYgUEFJUl9NQVNLKSB7CisgICAgICAgIGNhc2UgRlJFUV9QQUlSOgorCisgICAgICAgICAgaWYgKGluX2RhdGFfMSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoZGlmZl90eXBlXzEgPT0gRElGRl9GUkVRKSB7CisgICAgICAgICAgICAgIHAwX2RhdGFfMVswXSA9ICZpbl9kYXRhXzFbMF07CisgICAgICAgICAgICAgIHAwX2RhdGFfMVsxXSA9IE5VTEw7CisKKyAgICAgICAgICAgICAgbnVtX3ZhbF8xX3Nob3J0IC09IDE7CisgICAgICAgICAgICAgIGluX2RhdGFfMV9zaG9ydCArPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZl9yZXN0X2ZsYWdbMF0gPSBudW1fdmFsXzFfc2hvcnQgJSAyOworCisgICAgICAgICAgICBpZiAoZGZfcmVzdF9mbGFnWzBdKSBudW1fdmFsXzFfc2hvcnQgLT0gMTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV92YWxfMV9zaG9ydCAtIDE7IGkgKz0gMikgeworICAgICAgICAgICAgICBwYWlyX3ZlY1tpXVswXSA9IGluX2RhdGFfMV9zaG9ydFtpXTsKKyAgICAgICAgICAgICAgcGFpcl92ZWNbaV1bMV0gPSBpbl9kYXRhXzFfc2hvcnRbaSArIDFdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0YWJfaWR4XzJEWzBdWzBdID0gKGRpZmZfdHlwZV8xID09IERJRkZfVElNRSkgPyAxIDogMDsKKyAgICAgICAgICAgIHRhYl9pZHhfMkRbMF1bMV0gPSAwOworCisgICAgICAgICAgICB0YWJfaWR4XzFEWzBdID0gKGRpZmZfdHlwZV8xID09IERJRkZfRlJFUSkgPyAwIDogMTsKKyAgICAgICAgICB9IC8qIGlmKCBpbl9kYXRhXzEgIT0gTlVMTCApICovCisKKyAgICAgICAgICBpZiAoaW5fZGF0YV8yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChkaWZmX3R5cGVfMiA9PSBESUZGX0ZSRVEpIHsKKyAgICAgICAgICAgICAgcDBfZGF0YV8yWzBdID0gTlVMTDsKKyAgICAgICAgICAgICAgcDBfZGF0YV8yWzFdID0gJmluX2RhdGFfMlswXTsKKworICAgICAgICAgICAgICBudW1fdmFsXzJfc2hvcnQgLT0gMTsKKyAgICAgICAgICAgICAgaW5fZGF0YV8yX3Nob3J0ICs9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRmX3Jlc3RfZmxhZ1sxXSA9IG51bV92YWxfMl9zaG9ydCAlIDI7CisKKyAgICAgICAgICAgIGlmIChkZl9yZXN0X2ZsYWdbMV0pIG51bV92YWxfMl9zaG9ydCAtPSAxOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3ZhbF8yX3Nob3J0IC0gMTsgaSArPSAyKSB7CisgICAgICAgICAgICAgIHBhaXJfdmVjW2kgKyAxXVswXSA9IGluX2RhdGFfMl9zaG9ydFtpXTsKKyAgICAgICAgICAgICAgcGFpcl92ZWNbaSArIDFdWzFdID0gaW5fZGF0YV8yX3Nob3J0W2kgKyAxXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGFiX2lkeF8yRFsxXVswXSA9IChkaWZmX3R5cGVfMiA9PSBESUZGX1RJTUUpID8gMSA6IDA7CisgICAgICAgICAgICB0YWJfaWR4XzJEWzFdWzFdID0gMDsKKworICAgICAgICAgICAgdGFiX2lkeF8xRFsxXSA9IChkaWZmX3R5cGVfMiA9PSBESUZGX0ZSRVEpID8gMCA6IDE7CisgICAgICAgICAgfSAvKiBpZiggaW5fZGF0YV8yICE9IE5VTEwgKSAqLworCisgICAgICAgICAgaWYgKGluX2RhdGFfMSAhPSBOVUxMKSB7CisgICAgICAgICAgICBGREt3cml0ZUJpdHMoc3RybSwgbGF2SHVmZlZhbFtsYXZfaWR4WzBdXSwgbGF2SHVmZkxlbltsYXZfaWR4WzBdXSk7CisgICAgICAgICAgICBodWZmX2VuY18yRChzdHJtLCBkYXRhX3R5cGUsIHRhYl9pZHhfMkRbMF0sIGxhdl9pZHhbMF0sIHBhaXJfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3ZhbF8xX3Nob3J0LCAyLCBwMF9kYXRhXzEpOworICAgICAgICAgICAgaWYgKGRmX3Jlc3RfZmxhZ1swXSkgeworICAgICAgICAgICAgICBodWZmX2VuY18xRChzdHJtLCBkYXRhX3R5cGUsIHRhYl9pZHhfMURbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2RhdGFfMV9zaG9ydCArIG51bV92YWxfMV9zaG9ydCwgMSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChpbl9kYXRhXzIgIT0gTlVMTCkgeworICAgICAgICAgICAgRkRLd3JpdGVCaXRzKHN0cm0sIGxhdkh1ZmZWYWxbbGF2X2lkeFsxXV0sIGxhdkh1ZmZMZW5bbGF2X2lkeFsxXV0pOworICAgICAgICAgICAgaHVmZl9lbmNfMkQoc3RybSwgZGF0YV90eXBlLCB0YWJfaWR4XzJEWzFdLCBsYXZfaWR4WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFpcl92ZWMgKyAxLCBudW1fdmFsXzJfc2hvcnQsIDIsIHAwX2RhdGFfMik7CisgICAgICAgICAgICBpZiAoZGZfcmVzdF9mbGFnWzFdKSB7CisgICAgICAgICAgICAgIGh1ZmZfZW5jXzFEKHN0cm0sIGRhdGFfdHlwZSwgdGFiX2lkeF8xRFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fZGF0YV8yX3Nob3J0ICsgbnVtX3ZhbF8yX3Nob3J0LCAxLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7IC8qIEZSRVFfUEFJUiAqLworCisgICAgICAgIGNhc2UgVElNRV9QQUlSOgorCisgICAgICAgICAgaWYgKChkaWZmX3R5cGVfMSA9PSBESUZGX0ZSRVEpIHx8IChkaWZmX3R5cGVfMiA9PSBESUZGX0ZSRVEpKSB7CisgICAgICAgICAgICBwMF9kYXRhXzFbMF0gPSAmaW5fZGF0YV8xWzBdOworICAgICAgICAgICAgcDBfZGF0YV8xWzFdID0gJmluX2RhdGFfMlswXTsKKworICAgICAgICAgICAgaW5fZGF0YV8xX3Nob3J0ICs9IDE7CisgICAgICAgICAgICBpbl9kYXRhXzJfc2hvcnQgKz0gMTsKKworICAgICAgICAgICAgbnVtX3ZhbF8xX3Nob3J0IC09IDE7CisgICAgICAgICAgfQorCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV92YWxfMV9zaG9ydDsgaSsrKSB7CisgICAgICAgICAgICBwYWlyX3ZlY1tpXVswXSA9IGluX2RhdGFfMV9zaG9ydFtpXTsKKyAgICAgICAgICAgIHBhaXJfdmVjW2ldWzFdID0gaW5fZGF0YV8yX3Nob3J0W2ldOworICAgICAgICAgIH0KKworICAgICAgICAgIHRhYl9pZHhfMkRbMF1bMF0gPQorICAgICAgICAgICAgICAoKGRpZmZfdHlwZV8xID09IERJRkZfVElNRSkgfHwgKGRpZmZfdHlwZV8yID09IERJRkZfVElNRSkpID8gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICAgICAgICB0YWJfaWR4XzJEWzBdWzFdID0gMTsKKworICAgICAgICAgIEZES3dyaXRlQml0cyhzdHJtLCBsYXZIdWZmVmFsW2xhdl9pZHhbMF1dLCBsYXZIdWZmTGVuW2xhdl9pZHhbMF1dKTsKKworICAgICAgICAgIGh1ZmZfZW5jXzJEKHN0cm0sIGRhdGFfdHlwZSwgdGFiX2lkeF8yRFswXSwgbGF2X2lkeFswXSwgcGFpcl92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgbnVtX3ZhbF8xX3Nob3J0LCAxLCBwMF9kYXRhXzEpOworCisgICAgICAgICAgYnJlYWs7IC8qIFRJTUVfUEFJUiAqLworICAgICAgfSAgICAgICAgICAvKiBzd2l0Y2goIGNkZ19zY2hlbWUgJiBQQUlSX01BU0sgKSAqLworCisgICAgICBicmVhazsgLyogSFVGRl8yRCAqLworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9IC8qIHN3aXRjaCggY2RnX3NjaGVtZSA+PiBQQUlSX1NISUZUICkgKi8KK30KKworSU5UIGZka19zYWNlbmNfZWNEYXRhUGFpckVuYyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCBhYUluRGF0YVtdW01BWEJBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgYUhpc3RvcnlbTUFYQkFORFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQVRBX1RZUEUgZGF0YV90eXBlLCBjb25zdCBJTlQgc2V0SWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc3RhcnRCYW5kLCBjb25zdCBJTlQgZGF0YUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgY29hcnNlX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpbmRlcGVuZGVuY3lfZmxhZykgeworICBTSE9SVCByZXNldCA9IDAsIHBiID0gMDsKKyAgU0hPUlQgcXVhbnRfbGV2ZWxzID0gMCwgcXVhbnRfb2Zmc2V0ID0gMCwgbnVtX3BjbV92YWwgPSAwOworCisgIFNIT1JUIHNwbGl0THNiX2ZsYWcgPSAwOworICBTSE9SVCBwY21Db2RpbmdfZmxhZyA9IDA7CisKKyAgU0hPUlQgYWxsb3dEaWZmVGltZUJhY2tfZmxhZyA9ICFpbmRlcGVuZGVuY3lfZmxhZyB8fCAoc2V0SWR4ID4gMCk7CisKKyAgU0hPUlQgbnVtX2xzYl9iaXRzID0gLTE7CisgIFNIT1JUIG51bV9wY21fYml0cyA9IC0xOworCisgIFNIT1JUIHF1YW50X2RhdGFfbHNiWzJdW01BWEJBTkRTXTsKKyAgU0hPUlQgcXVhbnRfZGF0YV9tc2JbMl1bTUFYQkFORFNdOworCisgIFNIT1JUIHF1YW50X2RhdGFfaGlzdF9sc2JbTUFYQkFORFNdOworICBTSE9SVCBxdWFudF9kYXRhX2hpc3RfbXNiW01BWEJBTkRTXTsKKworICBTSE9SVCBkYXRhX2RpZmZfZnJlcVsyXVtNQVhCQU5EU107CisgIFNIT1JUIGRhdGFfZGlmZl90aW1lWzJdW01BWEJBTkRTICsgMl07CisKKyAgU0hPUlQgKnBfcXVhbnRfZGF0YV9tc2JbMl07CisgIFNIT1JUICpwX3F1YW50X2RhdGFfaGlzdF9tc2IgPSBOVUxMOworCisgIFNIT1JUIG1pbl9iaXRzX2FsbCA9IDA7CisgIFNIT1JUIG1pbl9mb3VuZCA9IDA7CisKKyAgU0hPUlQgbWluX2JpdHNfZGZfZGYgPSAtMTsKKyAgU0hPUlQgbWluX2JpdHNfZGZfZHQgPSAtMTsKKyAgU0hPUlQgbWluX2JpdHNfZHRid19kZiA9IC0xOworICBTSE9SVCBtaW5fYml0c19kdF9kdCA9IC0xOworCisgIFNIT1JUIGxhdl9kZl9kZlsyXSA9IHstMSwgLTF9OworICBTSE9SVCBsYXZfZGZfZHRbMl0gPSB7LTEsIC0xfTsKKyAgU0hPUlQgbGF2X2R0YndfZGZbMl0gPSB7LTEsIC0xfTsKKyAgU0hPUlQgbGF2X2R0X2R0WzJdID0gey0xLCAtMX07CisKKyAgU0hPUlQgY29kaW5nX3NjaGVtZV9kZl9kZiA9IDA7CisgIFNIT1JUIGNvZGluZ19zY2hlbWVfZGZfZHQgPSAwOworICBTSE9SVCBjb2Rpbmdfc2NoZW1lX2R0YndfZGYgPSAwOworICBTSE9SVCBjb2Rpbmdfc2NoZW1lX2R0X2R0ID0gMDsKKworICBzd2l0Y2ggKGRhdGFfdHlwZSkgeworICAgIGNhc2UgdF9DTEQ6CisgICAgICBpZiAoY29hcnNlX2ZsYWcpIHsKKyAgICAgICAgc3BsaXRMc2JfZmxhZyA9IDA7CisgICAgICAgIHF1YW50X2xldmVscyA9IDE1OworICAgICAgICBxdWFudF9vZmZzZXQgPSA3OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3BsaXRMc2JfZmxhZyA9IDA7CisgICAgICAgIHF1YW50X2xldmVscyA9IDMxOworICAgICAgICBxdWFudF9vZmZzZXQgPSAxNTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9JQ0M6CisgICAgICBpZiAoY29hcnNlX2ZsYWcpIHsKKyAgICAgICAgc3BsaXRMc2JfZmxhZyA9IDA7CisgICAgICAgIHF1YW50X2xldmVscyA9IDQ7CisgICAgICAgIHF1YW50X29mZnNldCA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcGxpdExzYl9mbGFnID0gMDsKKyAgICAgICAgcXVhbnRfbGV2ZWxzID0gODsKKyAgICAgICAgcXVhbnRfb2Zmc2V0ID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9IC8qIHN3aXRjaCggZGF0YV90eXBlICkgKi8KKworICAvKiBTcGxpdCBvZmYgTFNCICovCisgIGlmIChzcGxpdExzYl9mbGFnKSB7CisgICAgc3BsaXRfbHNiKGFhSW5EYXRhW3NldElkeF0gKyBzdGFydEJhbmQsIHF1YW50X29mZnNldCwgZGF0YUJhbmRzLAorICAgICAgICAgICAgICBxdWFudF9kYXRhX2xzYlswXSwgcXVhbnRfZGF0YV9tc2JbMF0pOworCisgICAgc3BsaXRfbHNiKGFhSW5EYXRhW3NldElkeCArIDFdICsgc3RhcnRCYW5kLCBxdWFudF9vZmZzZXQsIGRhdGFCYW5kcywKKyAgICAgICAgICAgICAgcXVhbnRfZGF0YV9sc2JbMV0sIHF1YW50X2RhdGFfbXNiWzFdKTsKKworICAgIHBfcXVhbnRfZGF0YV9tc2JbMF0gPSBxdWFudF9kYXRhX21zYlswXTsKKyAgICBwX3F1YW50X2RhdGFfbXNiWzFdID0gcXVhbnRfZGF0YV9tc2JbMV07CisKKyAgICBudW1fbHNiX2JpdHMgPSAyICogZGF0YUJhbmRzOworICB9IGVsc2UgaWYgKHF1YW50X29mZnNldCAhPSAwKSB7CisgICAgZm9yIChwYiA9IDA7IHBiIDwgZGF0YUJhbmRzOyBwYisrKSB7CisgICAgICBxdWFudF9kYXRhX21zYlswXVtwYl0gPSBhYUluRGF0YVtzZXRJZHhdW3N0YXJ0QmFuZCArIHBiXSArIHF1YW50X29mZnNldDsKKyAgICAgIHF1YW50X2RhdGFfbXNiWzFdW3BiXSA9CisgICAgICAgICAgYWFJbkRhdGFbc2V0SWR4ICsgMV1bc3RhcnRCYW5kICsgcGJdICsgcXVhbnRfb2Zmc2V0OworICAgIH0KKworICAgIHBfcXVhbnRfZGF0YV9tc2JbMF0gPSBxdWFudF9kYXRhX21zYlswXTsKKyAgICBwX3F1YW50X2RhdGFfbXNiWzFdID0gcXVhbnRfZGF0YV9tc2JbMV07CisKKyAgICBudW1fbHNiX2JpdHMgPSAwOworICB9IGVsc2UgeworICAgIHBfcXVhbnRfZGF0YV9tc2JbMF0gPSBhYUluRGF0YVtzZXRJZHhdICsgc3RhcnRCYW5kOworICAgIHBfcXVhbnRfZGF0YV9tc2JbMV0gPSBhYUluRGF0YVtzZXRJZHggKyAxXSArIHN0YXJ0QmFuZDsKKworICAgIG51bV9sc2JfYml0cyA9IDA7CisgIH0KKworICBpZiAoYWxsb3dEaWZmVGltZUJhY2tfZmxhZykgeworICAgIGlmIChzcGxpdExzYl9mbGFnKSB7CisgICAgICBzcGxpdF9sc2IoYUhpc3RvcnkgKyBzdGFydEJhbmQsIHF1YW50X29mZnNldCwgZGF0YUJhbmRzLAorICAgICAgICAgICAgICAgIHF1YW50X2RhdGFfaGlzdF9sc2IsIHF1YW50X2RhdGFfaGlzdF9tc2IpOworCisgICAgICBwX3F1YW50X2RhdGFfaGlzdF9tc2IgPSBxdWFudF9kYXRhX2hpc3RfbXNiOworICAgIH0gZWxzZSBpZiAocXVhbnRfb2Zmc2V0ICE9IDApIHsKKyAgICAgIGZvciAocGIgPSAwOyBwYiA8IGRhdGFCYW5kczsgcGIrKykgeworICAgICAgICBxdWFudF9kYXRhX2hpc3RfbXNiW3BiXSA9IGFIaXN0b3J5W3N0YXJ0QmFuZCArIHBiXSArIHF1YW50X29mZnNldDsKKyAgICAgIH0KKyAgICAgIHBfcXVhbnRfZGF0YV9oaXN0X21zYiA9IHF1YW50X2RhdGFfaGlzdF9tc2I7CisgICAgfSBlbHNlIHsKKyAgICAgIHBfcXVhbnRfZGF0YV9oaXN0X21zYiA9IGFIaXN0b3J5ICsgc3RhcnRCYW5kOworICAgIH0KKyAgfQorCisgIC8qIENhbGN1bGF0ZSBmcmVxdWVuY3kgZGlmZmVyZW5jZXMgKi8KKyAgY2FsY19kaWZmX2ZyZXEocF9xdWFudF9kYXRhX21zYlswXSwgZGF0YV9kaWZmX2ZyZXFbMF0sIGRhdGFCYW5kcyk7CisKKyAgY2FsY19kaWZmX2ZyZXEocF9xdWFudF9kYXRhX21zYlsxXSwgZGF0YV9kaWZmX2ZyZXFbMV0sIGRhdGFCYW5kcyk7CisKKyAgLyogQ2FsY3VsYXRlIHRpbWUgZGlmZmVyZW5jZXMgKi8KKyAgaWYgKGFsbG93RGlmZlRpbWVCYWNrX2ZsYWcpIHsKKyAgICBjYWxjX2RpZmZfdGltZShwX3F1YW50X2RhdGFfbXNiWzBdLCBwX3F1YW50X2RhdGFfaGlzdF9tc2IsCisgICAgICAgICAgICAgICAgICAgZGF0YV9kaWZmX3RpbWVbMF0sIGRhdGFCYW5kcyk7CisgIH0KKworICBjYWxjX2RpZmZfdGltZShwX3F1YW50X2RhdGFfbXNiWzFdLCBwX3F1YW50X2RhdGFfbXNiWzBdLCBkYXRhX2RpZmZfdGltZVsxXSwKKyAgICAgICAgICAgICAgICAgZGF0YUJhbmRzKTsKKworICAvKiBDYWxjdWxhdGUgY29kaW5nIHNjaGVtZSB3aXRoIG1pbnVtdW0gYml0IGNvbnN1bXB0aW9uICovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIG51bV9wY21fYml0cyA9IGNhbGNfcGNtX2JpdHMoMiAqIGRhdGFCYW5kcywgcXVhbnRfbGV2ZWxzKTsKKyAgbnVtX3BjbV92YWwgPSAyICogZGF0YUJhbmRzOworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIG1pbl9iaXRzX2FsbCA9IG51bV9wY21fYml0czsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIG1pbl9iaXRzX2RmX2RmID0KKyAgICAgIGNhbGNfaHVmZl9iaXRzKGRhdGFfZGlmZl9mcmVxWzBdLCBkYXRhX2RpZmZfZnJlcVsxXSwgZGF0YV90eXBlLCBESUZGX0ZSRVEsCisgICAgICAgICAgICAgICAgICAgICBESUZGX0ZSRVEsIGRhdGFCYW5kcywgbGF2X2RmX2RmLCAmY29kaW5nX3NjaGVtZV9kZl9kZik7CisKKyAgbWluX2JpdHNfZGZfZGYgKz0gMjsKKworICBtaW5fYml0c19kZl9kZiArPSBudW1fbHNiX2JpdHM7CisKKyAgaWYgKG1pbl9iaXRzX2RmX2RmIDwgbWluX2JpdHNfYWxsKSB7CisgICAgbWluX2JpdHNfYWxsID0gbWluX2JpdHNfZGZfZGY7CisgIH0KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIG1pbl9iaXRzX2RmX2R0ID0KKyAgICAgIGNhbGNfaHVmZl9iaXRzKGRhdGFfZGlmZl9mcmVxWzBdLCBkYXRhX2RpZmZfdGltZVsxXSwgZGF0YV90eXBlLCBESUZGX0ZSRVEsCisgICAgICAgICAgICAgICAgICAgICBESUZGX1RJTUUsIGRhdGFCYW5kcywgbGF2X2RmX2R0LCAmY29kaW5nX3NjaGVtZV9kZl9kdCk7CisKKyAgbWluX2JpdHNfZGZfZHQgKz0gMjsKKworICBtaW5fYml0c19kZl9kdCArPSBudW1fbHNiX2JpdHM7CisKKyAgaWYgKG1pbl9iaXRzX2RmX2R0IDwgbWluX2JpdHNfYWxsKSB7CisgICAgbWluX2JpdHNfYWxsID0gbWluX2JpdHNfZGZfZHQ7CisgIH0KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIGlmIChhbGxvd0RpZmZUaW1lQmFja19mbGFnKSB7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgbWluX2JpdHNfZHRid19kZiA9IGNhbGNfaHVmZl9iaXRzKAorICAgICAgICBkYXRhX2RpZmZfdGltZVswXSwgZGF0YV9kaWZmX2ZyZXFbMV0sIGRhdGFfdHlwZSwgRElGRl9USU1FLCBESUZGX0ZSRVEsCisgICAgICAgIGRhdGFCYW5kcywgbGF2X2R0YndfZGYsICZjb2Rpbmdfc2NoZW1lX2R0YndfZGYpOworCisgICAgbWluX2JpdHNfZHRid19kZiArPSAyOworCisgICAgbWluX2JpdHNfZHRid19kZiArPSBudW1fbHNiX2JpdHM7CisKKyAgICBpZiAobWluX2JpdHNfZHRid19kZiA8IG1pbl9iaXRzX2FsbCkgeworICAgICAgbWluX2JpdHNfYWxsID0gbWluX2JpdHNfZHRid19kZjsKKyAgICB9CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBtaW5fYml0c19kdF9kdCA9IGNhbGNfaHVmZl9iaXRzKGRhdGFfZGlmZl90aW1lWzBdLCBkYXRhX2RpZmZfdGltZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfdHlwZSwgRElGRl9USU1FLCBESUZGX1RJTUUsIGRhdGFCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdl9kdF9kdCwgJmNvZGluZ19zY2hlbWVfZHRfZHQpOworCisgICAgbWluX2JpdHNfZHRfZHQgKz0gMjsKKworICAgIG1pbl9iaXRzX2R0X2R0ICs9IG51bV9sc2JfYml0czsKKworICAgIGlmIChtaW5fYml0c19kdF9kdCA8IG1pbl9iaXRzX2FsbCkgeworICAgICAgbWluX2JpdHNfYWxsID0gbWluX2JpdHNfZHRfZHQ7CisgICAgfQorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIH0gLyogaWYoIGFsbG93RGlmZlRpbWVCYWNrX2ZsYWcgKSAqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qIFN0YXJ0IGFjdHVhbCBjb2Rpbmcgbm93ICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyogUENNIG9yIERpZmYvSHVmZiBDb2Rpbmc/ICovCisgIHBjbUNvZGluZ19mbGFnID0gKG1pbl9iaXRzX2FsbCA9PSBudW1fcGNtX2JpdHMpOworCisgIEZES3dyaXRlQml0cyhzdHJtLCBwY21Db2RpbmdfZmxhZywgMSk7CisKKyAgaWYgKHBjbUNvZGluZ19mbGFnKSB7CisgICAgLyogR3JvdXBlZCBQQ00gQ29kaW5nICovCisgICAgYXBwbHlfcGNtX2NvZGluZyhzdHJtLCBhYUluRGF0YVtzZXRJZHhdICsgc3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgICAgYWFJbkRhdGFbc2V0SWR4ICsgMV0gKyBzdGFydEJhbmQsIHF1YW50X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgIG51bV9wY21fdmFsLCBxdWFudF9sZXZlbHMpOworICB9IGVsc2UgeworICAgIC8qIERpZmYvSHVmZiBDb2RpbmcgKi8KKworICAgIG1pbl9mb3VuZCA9IDA7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAobWluX2JpdHNfYWxsID09IG1pbl9iaXRzX2RmX2RmKSB7CisgICAgICBGREt3cml0ZUJpdHMoc3RybSwgRElGRl9GUkVRLCAxKTsKKyAgICAgIEZES3dyaXRlQml0cyhzdHJtLCBESUZGX0ZSRVEsIDEpOworCisgICAgICBhcHBseV9odWZmX2NvZGluZyhzdHJtLCBkYXRhX2RpZmZfZnJlcVswXSwgZGF0YV9kaWZmX2ZyZXFbMV0sIGRhdGFfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJRkZfRlJFUSwgRElGRl9GUkVRLCBkYXRhQmFuZHMsIGxhdl9kZl9kZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGluZ19zY2hlbWVfZGZfZGYpOworCisgICAgICBtaW5fZm91bmQgPSAxOworICAgIH0KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICghbWluX2ZvdW5kICYmIChtaW5fYml0c19hbGwgPT0gbWluX2JpdHNfZGZfZHQpKSB7CisgICAgICBGREt3cml0ZUJpdHMoc3RybSwgRElGRl9GUkVRLCAxKTsKKyAgICAgIEZES3dyaXRlQml0cyhzdHJtLCBESUZGX1RJTUUsIDEpOworCisgICAgICBhcHBseV9odWZmX2NvZGluZyhzdHJtLCBkYXRhX2RpZmZfZnJlcVswXSwgZGF0YV9kaWZmX3RpbWVbMV0sIGRhdGFfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJRkZfRlJFUSwgRElGRl9USU1FLCBkYXRhQmFuZHMsIGxhdl9kZl9kdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGluZ19zY2hlbWVfZGZfZHQpOworCisgICAgICBtaW5fZm91bmQgPSAxOworICAgIH0KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKGFsbG93RGlmZlRpbWVCYWNrX2ZsYWcpIHsKKyAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgaWYgKCFtaW5fZm91bmQgJiYgKG1pbl9iaXRzX2FsbCA9PSBtaW5fYml0c19kdGJ3X2RmKSkgeworICAgICAgICBGREt3cml0ZUJpdHMoc3RybSwgRElGRl9USU1FLCAxKTsKKyAgICAgICAgRkRLd3JpdGVCaXRzKHN0cm0sIERJRkZfRlJFUSwgMSk7CisKKyAgICAgICAgYXBwbHlfaHVmZl9jb2Rpbmcoc3RybSwgZGF0YV9kaWZmX3RpbWVbMF0sIGRhdGFfZGlmZl9mcmVxWzFdLCBkYXRhX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERJRkZfVElNRSwgRElGRl9GUkVRLCBkYXRhQmFuZHMsIGxhdl9kdGJ3X2RmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rpbmdfc2NoZW1lX2R0YndfZGYpOworCisgICAgICAgIG1pbl9mb3VuZCA9IDE7CisgICAgICB9CisgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICBpZiAoIW1pbl9mb3VuZCAmJiAobWluX2JpdHNfYWxsID09IG1pbl9iaXRzX2R0X2R0KSkgeworICAgICAgICBGREt3cml0ZUJpdHMoc3RybSwgRElGRl9USU1FLCAxKTsKKyAgICAgICAgRkRLd3JpdGVCaXRzKHN0cm0sIERJRkZfVElNRSwgMSk7CisKKyAgICAgICAgYXBwbHlfaHVmZl9jb2Rpbmcoc3RybSwgZGF0YV9kaWZmX3RpbWVbMF0sIGRhdGFfZGlmZl90aW1lWzFdLCBkYXRhX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERJRkZfVElNRSwgRElGRl9USU1FLCBkYXRhQmFuZHMsIGxhdl9kdF9kdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaW5nX3NjaGVtZV9kdF9kdCk7CisgICAgICB9CisgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIH0gLyogaWYoIGFsbG93RGlmZlRpbWVCYWNrX2ZsYWcgKSAqLworCisgICAgLyogTFNCIGNvZGluZyAqLworICAgIGlmIChzcGxpdExzYl9mbGFnKSB7CisgICAgICBhcHBseV9sc2JfY29kaW5nKHN0cm0sIHF1YW50X2RhdGFfbHNiWzBdLCAxLCBkYXRhQmFuZHMpOworCisgICAgICBhcHBseV9sc2JfY29kaW5nKHN0cm0sIHF1YW50X2RhdGFfbHNiWzFdLCAxLCBkYXRhQmFuZHMpOworICAgIH0KKworICB9IC8qIERpZmYvSHVmZi9MU0IgY29kaW5nICovCisKKyAgcmV0dXJuIHJlc2V0OworfQorCitJTlQgZmRrX3NhY2VuY19lY0RhdGFTaW5nbGVFbmMoSEFORExFX0ZES19CSVRTVFJFQU0gc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCBhYUluRGF0YVtdW01BWEJBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCBhSGlzdG9yeVtNQVhCQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREFUQV9UWVBFIGRhdGFfdHlwZSwgY29uc3QgSU5UIHNldElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc3RhcnRCYW5kLCBjb25zdCBJTlQgZGF0YUJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBjb2Fyc2VfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaW5kZXBlbmRlbmN5X2ZsYWcpIHsKKyAgU0hPUlQgcmVzZXQgPSAwLCBwYiA9IDA7CisgIFNIT1JUIHF1YW50X2xldmVscyA9IDAsIHF1YW50X29mZnNldCA9IDAsIG51bV9wY21fdmFsID0gMDsKKworICBTSE9SVCBzcGxpdExzYl9mbGFnID0gMDsKKyAgU0hPUlQgcGNtQ29kaW5nX2ZsYWcgPSAwOworCisgIFNIT1JUIGFsbG93RGlmZlRpbWVCYWNrX2ZsYWcgPSAhaW5kZXBlbmRlbmN5X2ZsYWcgfHwgKHNldElkeCA+IDApOworCisgIFNIT1JUIG51bV9sc2JfYml0cyA9IC0xOworICBTSE9SVCBudW1fcGNtX2JpdHMgPSAtMTsKKworICBTSE9SVCBxdWFudF9kYXRhX2xzYltNQVhCQU5EU107CisgIFNIT1JUIHF1YW50X2RhdGFfbXNiW01BWEJBTkRTXTsKKworICBTSE9SVCBxdWFudF9kYXRhX2hpc3RfbHNiW01BWEJBTkRTXTsKKyAgU0hPUlQgcXVhbnRfZGF0YV9oaXN0X21zYltNQVhCQU5EU107CisKKyAgU0hPUlQgZGF0YV9kaWZmX2ZyZXFbTUFYQkFORFNdOworICBTSE9SVCBkYXRhX2RpZmZfdGltZVtNQVhCQU5EUyArIDJdOworCisgIFNIT1JUICpwX3F1YW50X2RhdGFfbXNiOworICBTSE9SVCAqcF9xdWFudF9kYXRhX2hpc3RfbXNiID0gTlVMTDsKKworICBTSE9SVCBtaW5fYml0c19hbGwgPSAwOworICBTSE9SVCBtaW5fZm91bmQgPSAwOworCisgIFNIT1JUIG1pbl9iaXRzX2RmID0gLTE7CisgIFNIT1JUIG1pbl9iaXRzX2R0ID0gLTE7CisKKyAgU0hPUlQgbGF2X2RmWzJdID0gey0xLCAtMX07CisgIFNIT1JUIGxhdl9kdFsyXSA9IHstMSwgLTF9OworCisgIFNIT1JUIGNvZGluZ19zY2hlbWVfZGYgPSAwOworICBTSE9SVCBjb2Rpbmdfc2NoZW1lX2R0ID0gMDsKKworICBzd2l0Y2ggKGRhdGFfdHlwZSkgeworICAgIGNhc2UgdF9DTEQ6CisgICAgICBpZiAoY29hcnNlX2ZsYWcpIHsKKyAgICAgICAgc3BsaXRMc2JfZmxhZyA9IDA7CisgICAgICAgIHF1YW50X2xldmVscyA9IDE1OworICAgICAgICBxdWFudF9vZmZzZXQgPSA3OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3BsaXRMc2JfZmxhZyA9IDA7CisgICAgICAgIHF1YW50X2xldmVscyA9IDMxOworICAgICAgICBxdWFudF9vZmZzZXQgPSAxNTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9JQ0M6CisgICAgICBpZiAoY29hcnNlX2ZsYWcpIHsKKyAgICAgICAgc3BsaXRMc2JfZmxhZyA9IDA7CisgICAgICAgIHF1YW50X2xldmVscyA9IDQ7CisgICAgICAgIHF1YW50X29mZnNldCA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcGxpdExzYl9mbGFnID0gMDsKKyAgICAgICAgcXVhbnRfbGV2ZWxzID0gODsKKyAgICAgICAgcXVhbnRfb2Zmc2V0ID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9IC8qIHN3aXRjaCggZGF0YV90eXBlICkgKi8KKworICAvKiBTcGxpdCBvZmYgTFNCICovCisgIGlmIChzcGxpdExzYl9mbGFnKSB7CisgICAgc3BsaXRfbHNiKGFhSW5EYXRhW3NldElkeF0gKyBzdGFydEJhbmQsIHF1YW50X29mZnNldCwgZGF0YUJhbmRzLAorICAgICAgICAgICAgICBxdWFudF9kYXRhX2xzYiwgcXVhbnRfZGF0YV9tc2IpOworCisgICAgcF9xdWFudF9kYXRhX21zYiA9IHF1YW50X2RhdGFfbXNiOworICAgIG51bV9sc2JfYml0cyA9IGRhdGFCYW5kczsKKyAgfSBlbHNlIGlmIChxdWFudF9vZmZzZXQgIT0gMCkgeworICAgIGZvciAocGIgPSAwOyBwYiA8IGRhdGFCYW5kczsgcGIrKykgeworICAgICAgcXVhbnRfZGF0YV9tc2JbcGJdID0gYWFJbkRhdGFbc2V0SWR4XVtzdGFydEJhbmQgKyBwYl0gKyBxdWFudF9vZmZzZXQ7CisgICAgfQorCisgICAgcF9xdWFudF9kYXRhX21zYiA9IHF1YW50X2RhdGFfbXNiOworICAgIG51bV9sc2JfYml0cyA9IDA7CisgIH0gZWxzZSB7CisgICAgcF9xdWFudF9kYXRhX21zYiA9IGFhSW5EYXRhW3NldElkeF0gKyBzdGFydEJhbmQ7CisgICAgbnVtX2xzYl9iaXRzID0gMDsKKyAgfQorCisgIGlmIChhbGxvd0RpZmZUaW1lQmFja19mbGFnKSB7CisgICAgaWYgKHNwbGl0THNiX2ZsYWcpIHsKKyAgICAgIHNwbGl0X2xzYihhSGlzdG9yeSArIHN0YXJ0QmFuZCwgcXVhbnRfb2Zmc2V0LCBkYXRhQmFuZHMsCisgICAgICAgICAgICAgICAgcXVhbnRfZGF0YV9oaXN0X2xzYiwgcXVhbnRfZGF0YV9oaXN0X21zYik7CisKKyAgICAgIHBfcXVhbnRfZGF0YV9oaXN0X21zYiA9IHF1YW50X2RhdGFfaGlzdF9tc2I7CisgICAgfSBlbHNlIGlmIChxdWFudF9vZmZzZXQgIT0gMCkgeworICAgICAgZm9yIChwYiA9IDA7IHBiIDwgZGF0YUJhbmRzOyBwYisrKSB7CisgICAgICAgIHF1YW50X2RhdGFfaGlzdF9tc2JbcGJdID0gYUhpc3Rvcnlbc3RhcnRCYW5kICsgcGJdICsgcXVhbnRfb2Zmc2V0OworICAgICAgfQorICAgICAgcF9xdWFudF9kYXRhX2hpc3RfbXNiID0gcXVhbnRfZGF0YV9oaXN0X21zYjsKKyAgICB9IGVsc2UgeworICAgICAgcF9xdWFudF9kYXRhX2hpc3RfbXNiID0gYUhpc3RvcnkgKyBzdGFydEJhbmQ7CisgICAgfQorICB9CisKKyAgLyogQ2FsY3VsYXRlIGZyZXF1ZW5jeSBkaWZmZXJlbmNlcyAqLworICBjYWxjX2RpZmZfZnJlcShwX3F1YW50X2RhdGFfbXNiLCBkYXRhX2RpZmZfZnJlcSwgZGF0YUJhbmRzKTsKKworICAvKiBDYWxjdWxhdGUgdGltZSBkaWZmZXJlbmNlcyAqLworICBpZiAoYWxsb3dEaWZmVGltZUJhY2tfZmxhZykgeworICAgIGNhbGNfZGlmZl90aW1lKHBfcXVhbnRfZGF0YV9tc2IsIHBfcXVhbnRfZGF0YV9oaXN0X21zYiwgZGF0YV9kaWZmX3RpbWUsCisgICAgICAgICAgICAgICAgICAgZGF0YUJhbmRzKTsKKyAgfQorCisgIC8qIENhbGN1bGF0ZSBjb2Rpbmcgc2NoZW1lIHdpdGggbWludW11bSBiaXQgY29uc3VtcHRpb24gKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgbnVtX3BjbV9iaXRzID0gY2FsY19wY21fYml0cyhkYXRhQmFuZHMsIHF1YW50X2xldmVscyk7CisgIG51bV9wY21fdmFsID0gZGF0YUJhbmRzOworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIG1pbl9iaXRzX2FsbCA9IG51bV9wY21fYml0czsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIG1pbl9iaXRzX2RmID0gY2FsY19odWZmX2JpdHMoZGF0YV9kaWZmX2ZyZXEsIE5VTEwsIGRhdGFfdHlwZSwgRElGRl9GUkVRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRkZfRlJFUSwgZGF0YUJhbmRzLCBsYXZfZGYsICZjb2Rpbmdfc2NoZW1lX2RmKTsKKworICBpZiAoYWxsb3dEaWZmVGltZUJhY2tfZmxhZykgbWluX2JpdHNfZGYgKz0gMTsKKworICBtaW5fYml0c19kZiArPSBudW1fbHNiX2JpdHM7CisKKyAgaWYgKG1pbl9iaXRzX2RmIDwgbWluX2JpdHNfYWxsKSB7CisgICAgbWluX2JpdHNfYWxsID0gbWluX2JpdHNfZGY7CisgIH0KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGlmIChhbGxvd0RpZmZUaW1lQmFja19mbGFnKSB7CisgICAgbWluX2JpdHNfZHQgPQorICAgICAgICBjYWxjX2h1ZmZfYml0cyhkYXRhX2RpZmZfdGltZSwgTlVMTCwgZGF0YV90eXBlLCBESUZGX1RJTUUsIERJRkZfVElNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YUJhbmRzLCBsYXZfZHQsICZjb2Rpbmdfc2NoZW1lX2R0KTsKKworICAgIG1pbl9iaXRzX2R0ICs9IDE7CisgICAgbWluX2JpdHNfZHQgKz0gbnVtX2xzYl9iaXRzOworCisgICAgaWYgKG1pbl9iaXRzX2R0IDwgbWluX2JpdHNfYWxsKSB7CisgICAgICBtaW5fYml0c19hbGwgPSBtaW5fYml0c19kdDsKKyAgICB9CisgIH0gLyogaWYoIGFsbG93RGlmZlRpbWVCYWNrX2ZsYWcgKSAqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qIFN0YXJ0IGFjdHVhbCBjb2Rpbmcgbm93ICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyogUENNIG9yIERpZmYvSHVmZiBDb2Rpbmc/ICovCisgIHBjbUNvZGluZ19mbGFnID0gKG1pbl9iaXRzX2FsbCA9PSBudW1fcGNtX2JpdHMpOworCisgIEZES3dyaXRlQml0cyhzdHJtLCBwY21Db2RpbmdfZmxhZywgMSk7CisKKyAgaWYgKHBjbUNvZGluZ19mbGFnKSB7CisgICAgLyogR3JvdXBlZCBQQ00gQ29kaW5nICovCisgICAgYXBwbHlfcGNtX2NvZGluZyhzdHJtLCBhYUluRGF0YVtzZXRJZHhdICsgc3RhcnRCYW5kLCBOVUxMLCBxdWFudF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBudW1fcGNtX3ZhbCwgcXVhbnRfbGV2ZWxzKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBEaWZmL0h1ZmYgQ29kaW5nICovCisKKyAgICBtaW5fZm91bmQgPSAwOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKG1pbl9iaXRzX2FsbCA9PSBtaW5fYml0c19kZikgeworICAgICAgaWYgKGFsbG93RGlmZlRpbWVCYWNrX2ZsYWcpIHsKKyAgICAgICAgRkRLd3JpdGVCaXRzKHN0cm0sIERJRkZfRlJFUSwgMSk7CisgICAgICB9CisKKyAgICAgIGFwcGx5X2h1ZmZfY29kaW5nKHN0cm0sIGRhdGFfZGlmZl9mcmVxLCBOVUxMLCBkYXRhX3R5cGUsIERJRkZfRlJFUSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJRkZfRlJFUSwgZGF0YUJhbmRzLCBsYXZfZGYsIGNvZGluZ19zY2hlbWVfZGYpOworCisgICAgICBtaW5fZm91bmQgPSAxOworICAgIH0gLyogaWYoIG1pbl9iaXRzX2FsbCA9PSBtaW5fYml0c19kZiApICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoYWxsb3dEaWZmVGltZUJhY2tfZmxhZykgeworICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICBpZiAoIW1pbl9mb3VuZCAmJiAobWluX2JpdHNfYWxsID09IG1pbl9iaXRzX2R0KSkgeworICAgICAgICBGREt3cml0ZUJpdHMoc3RybSwgRElGRl9USU1FLCAxKTsKKworICAgICAgICBhcHBseV9odWZmX2NvZGluZyhzdHJtLCBkYXRhX2RpZmZfdGltZSwgTlVMTCwgZGF0YV90eXBlLCBESUZGX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERJRkZfVElNRSwgZGF0YUJhbmRzLCBsYXZfZHQsIGNvZGluZ19zY2hlbWVfZHQpOworICAgICAgfQorICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICB9IC8qIGlmKCBhbGxvd0RpZmZUaW1lQmFja19mbGFnICkgKi8KKworICAgIC8qIExTQiBjb2RpbmcgKi8KKyAgICBpZiAoc3BsaXRMc2JfZmxhZykgeworICAgICAgYXBwbHlfbHNiX2NvZGluZyhzdHJtLCBxdWFudF9kYXRhX2xzYiwgMSwgZGF0YUJhbmRzKTsKKyAgICB9CisKKyAgfSAvKiBEaWZmL0h1ZmYvTFNCIGNvZGluZyAqLworCisgIHJldHVybiByZXNldDsKK30KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX25sY19lbmMuaCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX25sY19lbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDZiMzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfbmxjX2VuYy5oCkBAIC0wLDAgKzEsMTQxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBLYXJzdGVuIExpbnptZWllcgorCisgICBEZXNjcmlwdGlvbjogTm9pc2VsZXNzIENvZGluZworICAgICAgICAgICAgICAgIEh1ZmZtYW4gZW5jb2RlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNBQ0VOQ19OTENfRU5DX0gKKyNkZWZpbmUgU0FDRU5DX05MQ19FTkNfSAorCisvKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAic2FjZW5jX2NvbnN0LmgiCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorI2luY2x1ZGUgInNhY2VuY19iaXRzdHJlYW0uaCIKKworLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBNQVhCQU5EUyBNQVhfTlVNX0JJTlMgLyogbWF4aW11bSBudW1iZXIgb2YgZnJlcXVlbmN5IGJhbmRzICovCisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgZW51bSB7CisgIHRfQ0xELAorICB0X0lDQworCit9IERBVEFfVFlQRTsKKworLyogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQgZmRrX3NhY2VuY19lY0RhdGFQYWlyRW5jKEhBTkRMRV9GREtfQklUU1RSRUFNIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUIGFhSW5EYXRhW11bTUFYQkFORFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCBhSGlzdG9yeVtNQVhCQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERBVEFfVFlQRSBkYXRhX3R5cGUsIGNvbnN0IElOVCBzZXRJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzdGFydEJhbmQsIGNvbnN0IElOVCBkYXRhQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBjb2Fyc2VfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGluZGVwZW5kZW5jeV9mbGFnKTsKKworSU5UIGZka19zYWNlbmNfZWNEYXRhU2luZ2xlRW5jKEhBTkRMRV9GREtfQklUU1RSRUFNIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgYWFJbkRhdGFbXVtNQVhCQU5EU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgYUhpc3RvcnlbTUFYQkFORFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERBVEFfVFlQRSBkYXRhX3R5cGUsIGNvbnN0IElOVCBzZXRJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHN0YXJ0QmFuZCwgY29uc3QgSU5UIGRhdGFCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgY29hcnNlX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGluZGVwZW5kZW5jeV9mbGFnKTsKKworI2VuZGlmIC8qIFNBQ0VOQ19OTENfRU5DX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX29uc2V0ZGV0ZWN0LmNwcCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX29uc2V0ZGV0ZWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTlhZWUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfb25zZXRkZXRlY3QuY3BwCkBAIC0wLDAgKzEsMzgxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXggTmV1ZW5kb3JmCisKKyAgIERlc2NyaXB0aW9uOiBFbmNvZGVyIExpYnJhcnkgSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgRGV0ZWN0IE9uc2V0IGluIGN1cnJlbnQgZnJhbWUKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAvKioKKyAgIFxmaWxlCisgICBEZXNjcmlwdGlvbiBvZiBmaWxlIGNvbnRlbnRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAic2FjZW5jX29uc2V0ZGV0ZWN0LmgiCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKyNpbmNsdWRlICJzYWNlbmNfdmVjdG9yZnVuY3Rpb25zLmgiCisKKy8qIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgU1BBQ0VfT05TRVRfVEhSRVNIT0xEICgzLjApCisjZGVmaW5lIFNQQUNFX09OU0VUX1RIUkVTSE9MRF9TRiAoMykKKyNkZWZpbmUgU1BBQ0VfT05TRVRfVEhSRVNIT0xEX1NRVUFSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChGTDJGWENPTlNUX0RCTCgoMS4wIC8gKFNQQUNFX09OU0VUX1RIUkVTSE9MRCAqIFNQQUNFX09OU0VUX1RIUkVTSE9MRCkpICogXAorICAgICAgICAgICAgICAgICAgKGZsb2F0KSgxIDw8IFNQQUNFX09OU0VUX1RIUkVTSE9MRF9TRikpKQorCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgT05TRVRfREVURUNUIHsKKyAgSU5UIG1heFRpbWVTbG90czsKKyAgSU5UIG1pblRyYW5zaWVudERpc3RhbmNlOworICBJTlQgYXZnRW5lcmd5RGlzdGFuY2U7CisgIElOVCBsb3dlckJvdW5kT25zZXREZXRlY3Rpb247CisgIElOVCB1cHBlckJvdW5kT25zZXREZXRlY3Rpb247CisgIEZJWFBfREJMICpwRW5lcmd5SGlzdF9fRkRLOworICBTQ0hBUiAqcEVuZXJneUhpc3RTY2FsZTsKKyAgU0NIQVIgYXZnRW5lcmd5RGlzdGFuY2VTY2FsZTsKK307CisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlZmluaXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfb25zZXREZXRlY3RfT3BlbihIQU5ETEVfT05TRVRfREVURUNUICpwaE9uc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBtYXhUaW1lU2xvdHMpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKyAgSEFORExFX09OU0VUX0RFVEVDVCBoT25zZXQgPSBOVUxMOworCisgIGlmIChOVUxMID09IHBoT25zZXQpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICAvKiBNZW1vcnkgQWxsb2NhdGlvbiAqLworICAgIEZES19BTExPQ0FURV9NRU1PUllfMUQoaE9uc2V0LCAxLCBzdHJ1Y3QgT05TRVRfREVURUNUKTsKKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKGhPbnNldC0+cEVuZXJneUhpc3RfX0ZESywgMTYgKyBtYXhUaW1lU2xvdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCk7CisgICAgRkRLX0FMTE9DQVRFX01FTU9SWV8xRChoT25zZXQtPnBFbmVyZ3lIaXN0U2NhbGUsIDE2ICsgbWF4VGltZVNsb3RzLCBTQ0hBUik7CisKKyAgICBoT25zZXQtPm1heFRpbWVTbG90cyA9IG1heFRpbWVTbG90czsKKyAgICBoT25zZXQtPm1pblRyYW5zaWVudERpc3RhbmNlID0KKyAgICAgICAgODsgLyogbWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIGRldGVjdGVkIHRyYW5zaWVudHMgKi8KKyAgICBoT25zZXQtPmF2Z0VuZXJneURpc3RhbmNlID0gMTY7IC8qIGF2ZXJhZ2UgZW5lcmd5IGRpc3RhbmNlICovCisKKyAgICBoT25zZXQtPmF2Z0VuZXJneURpc3RhbmNlU2NhbGUgPSA0OworICAgICpwaE9uc2V0ID0gaE9uc2V0OworICB9CisgIHJldHVybiBlcnJvcjsKKworYmFpbDoKKyAgZmRrX3NhY2VuY19vbnNldERldGVjdF9DbG9zZSgmaE9uc2V0KTsKKyAgcmV0dXJuICgoU0FDRU5DX09LID09IGVycm9yKSA/IFNBQ0VOQ19NRU1PUllfRVJST1IgOiBlcnJvcik7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19vbnNldERldGVjdF9Jbml0KAorICAgIEhBTkRMRV9PTlNFVF9ERVRFQ1QgaE9uc2V0LAorICAgIGNvbnN0IE9OU0VUX0RFVEVDVF9DT05GSUcgKmNvbnN0IHBPbnNldERldGVjdENvbmZpZywgY29uc3QgVUlOVCBpbml0RmxhZ3MpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKE5VTEwgPT0gaE9uc2V0KSB8fCAocE9uc2V0RGV0ZWN0Q29uZmlnID09IE5VTEwpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaWYgKChwT25zZXREZXRlY3RDb25maWctPm1heFRpbWVTbG90cyA+IGhPbnNldC0+bWF4VGltZVNsb3RzKSB8fAorICAgICAgICAocE9uc2V0RGV0ZWN0Q29uZmlnLT51cHBlckJvdW5kT25zZXREZXRlY3Rpb24gPAorICAgICAgICAgaE9uc2V0LT5sb3dlckJvdW5kT25zZXREZXRlY3Rpb24pKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBoT25zZXQtPm1heFRpbWVTbG90cyA9IHBPbnNldERldGVjdENvbmZpZy0+bWF4VGltZVNsb3RzOworICAgIGhPbnNldC0+bG93ZXJCb3VuZE9uc2V0RGV0ZWN0aW9uID0KKyAgICAgICAgcE9uc2V0RGV0ZWN0Q29uZmlnLT5sb3dlckJvdW5kT25zZXREZXRlY3Rpb247CisgICAgaE9uc2V0LT51cHBlckJvdW5kT25zZXREZXRlY3Rpb24gPQorICAgICAgICBwT25zZXREZXRlY3RDb25maWctPnVwcGVyQm91bmRPbnNldERldGVjdGlvbjsKKworICAgIGhPbnNldC0+bWluVHJhbnNpZW50RGlzdGFuY2UgPQorICAgICAgICA4OyAvKiBtaW5pbXVtIGRpc3RhbmNlIGJldHdlZW4gZGV0ZWN0ZWQgdHJhbnNpZW50cyAqLworICAgIGhPbnNldC0+YXZnRW5lcmd5RGlzdGFuY2UgPSAxNjsgLyogYXZlcmFnZSBlbmVyZ3kgZGlzdGFuY2UgKi8KKworICAgIGhPbnNldC0+YXZnRW5lcmd5RGlzdGFuY2VTY2FsZSA9IDQ7CisKKyAgICAvKiBJbml0IC8gUmVzZXQgKi8KKyAgICBpZiAoaW5pdEZsYWdzKSB7CisgICAgICBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBoT25zZXQtPmF2Z0VuZXJneURpc3RhbmNlICsgaE9uc2V0LT5tYXhUaW1lU2xvdHM7IGkrKykKKyAgICAgICAgaE9uc2V0LT5wRW5lcmd5SGlzdFNjYWxlW2ldID0gLShERlJBQ1RfQklUUyAtIDMpOworCisgICAgICBGREttZW1zZXRfZmxleCgKKyAgICAgICAgICBoT25zZXQtPnBFbmVyZ3lIaXN0X19GREssCisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoU0FDRU5DX0ZMT0FUX0VQU0lMT04gKiAoMSA8PCAoREZSQUNUX0JJVFMgLSAzKSkpLAorICAgICAgICAgIGhPbnNldC0+YXZnRW5lcmd5RGlzdGFuY2UgKyBoT25zZXQtPm1heFRpbWVTbG90cyk7CisgICAgfQorICB9CisKK2JhaWw6CisgIHJldHVybiBlcnJvcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfb25zZXREZXRlY3RfQ2xvc2UoSEFORExFX09OU0VUX0RFVEVDVCAqcGhPbnNldCkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgoTlVMTCAhPSBwaE9uc2V0KSAmJiAoTlVMTCAhPSAqcGhPbnNldCkpIHsKKyAgICBpZiAoTlVMTCAhPSAoKnBoT25zZXQpLT5wRW5lcmd5SGlzdF9fRkRLKSB7CisgICAgICBGREtmcmVlKCgqcGhPbnNldCktPnBFbmVyZ3lIaXN0X19GREspOworICAgIH0KKyAgICAoKnBoT25zZXQpLT5wRW5lcmd5SGlzdF9fRkRLID0gTlVMTDsKKworICAgIGlmIChOVUxMICE9ICgqcGhPbnNldCktPnBFbmVyZ3lIaXN0U2NhbGUpIHsKKyAgICAgIEZES2ZyZWUoKCpwaE9uc2V0KS0+cEVuZXJneUhpc3RTY2FsZSk7CisgICAgfQorICAgICgqcGhPbnNldCktPnBFbmVyZ3lIaXN0U2NhbGUgPSBOVUxMOworICAgIEZES2ZyZWUoKnBoT25zZXQpOworICAgICpwaE9uc2V0ID0gTlVMTDsKKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX29uc2V0RGV0ZWN0X1VwZGF0ZShIQU5ETEVfT05TRVRfREVURUNUIGhPbnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHRpbWVTbG90cykgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChOVUxMID09IGhPbnNldCkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGlmICh0aW1lU2xvdHMgPiBoT25zZXQtPm1heFRpbWVTbG90cykgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBpOworICAgICAgLyogU2hpZnQgb2xkIGRhdGEgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBoT25zZXQtPmF2Z0VuZXJneURpc3RhbmNlOyBpKyspIHsKKyAgICAgICAgaE9uc2V0LT5wRW5lcmd5SGlzdF9fRkRLW2ldID0gaE9uc2V0LT5wRW5lcmd5SGlzdF9fRkRLW2kgKyB0aW1lU2xvdHNdOworICAgICAgICBoT25zZXQtPnBFbmVyZ3lIaXN0U2NhbGVbaV0gPSBoT25zZXQtPnBFbmVyZ3lIaXN0U2NhbGVbaSArIHRpbWVTbG90c107CisgICAgICB9CisKKyAgICAgIC8qIENsZWFyIGZvciBuZXcgZGF0YSAqLworICAgICAgRkRLbWVtc2V0X2ZsZXgoJmhPbnNldC0+cEVuZXJneUhpc3RfX0ZES1toT25zZXQtPmF2Z0VuZXJneURpc3RhbmNlXSwKKyAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKFNBQ0VOQ19GTE9BVF9FUFNJTE9OKSwgdGltZVNsb3RzKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGVycm9yOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19vbnNldERldGVjdF9BcHBseSgKKyAgICBIQU5ETEVfT05TRVRfREVURUNUIGhPbnNldCwgY29uc3QgSU5UIG5UaW1lU2xvdHMsIGNvbnN0IElOVCBuSHlicmlkQmFuZHMsCisgICAgRklYUF9EUEsgKmNvbnN0ICpjb25zdCBwcEh5YnJpZERhdGFfX0ZESywgY29uc3QgSU5UIGh5YnJpZERhdGFTY2FsZSwKKyAgICBjb25zdCBJTlQgcHJldlBvcywgSU5UIHBUcmFuc2llbnRQb3NbTUFYX05VTV9UUkFOU10pIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoZW52cywgRklYUF9EQkwsICgxNiArIE1BWF9USU1FX1NMT1RTKSkKKyAgRkRLbWVtY2xlYXIoZW52cywgKDE2ICsgTUFYX1RJTUVfU0xPVFMpICogc2l6ZW9mKEZJWFBfREJMKSk7CisKKyAgaWYgKChoT25zZXQgPT0gTlVMTCkgfHwgKHBUcmFuc2llbnRQb3MgPT0gTlVMTCkgfHwKKyAgICAgIChwcEh5YnJpZERhdGFfX0ZESyA9PSBOVUxMKSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGludCBpLCB0cywgdHJDbnQsIGN1cnJQb3M7CisKKyAgICBpZiAoKG5UaW1lU2xvdHMgPCAwKSB8fCAoblRpbWVTbG90cyA+IGhPbnNldC0+bWF4VGltZVNsb3RzKSB8fAorICAgICAgICAoaE9uc2V0LT5sb3dlckJvdW5kT25zZXREZXRlY3Rpb24gPCAtMSkgfHwKKyAgICAgICAgKGhPbnNldC0+dXBwZXJCb3VuZE9uc2V0RGV0ZWN0aW9uID4gbkh5YnJpZEJhbmRzKSkgeworICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgY29uc3QgaW50IGxvd2VyQm91bmRPbnNldERldGVjdGlvbiA9IGhPbnNldC0+bG93ZXJCb3VuZE9uc2V0RGV0ZWN0aW9uOworICAgIGNvbnN0IGludCB1cHBlckJvdW5kT25zZXREZXRlY3Rpb24gPSBoT25zZXQtPnVwcGVyQm91bmRPbnNldERldGVjdGlvbjsKKyAgICBjb25zdCBpbnQgTSA9IGhPbnNldC0+YXZnRW5lcmd5RGlzdGFuY2U7CisKKyAgICB7CisgICAgICBTQ0hBUiAqZW52U2NhbGUgPSBoT25zZXQtPnBFbmVyZ3lIaXN0U2NhbGU7CisgICAgICBGSVhQX0RCTCAqZW52ID0gaE9uc2V0LT5wRW5lcmd5SGlzdF9fRkRLOworICAgICAgY29uc3QgRklYUF9EQkwgdGhyZXNob2xkX3NxdWFyZSA9IFNQQUNFX09OU0VUX1RIUkVTSE9MRF9TUVVBUkU7CisKKyAgICAgIHRyQ250ID0gMDsKKworICAgICAgLyogcmVzZXQgdHJhbnNpZW50IGFycmF5ICovCisgICAgICBGREttZW1zZXRfZmxleChwVHJhbnNpZW50UG9zLCAtMSwgTUFYX05VTV9UUkFOUyk7CisKKyAgICAgIC8qIG1pbmltdW0gdHJhbnNpZW50IGRpc3RhbmNlIG9mIG1pblRyYW5zRGlzdCBRTUYgc2FtcGxlcyAqLworICAgICAgaWYgKHByZXZQb3MgPiAwKSB7CisgICAgICAgIGN1cnJQb3MgPSBGREttYXgoblRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2UG9zIC0gblRpbWVTbG90cyArIGhPbnNldC0+bWluVHJhbnNpZW50RGlzdGFuY2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY3VyclBvcyA9IG5UaW1lU2xvdHM7CisgICAgICB9CisKKyAgICAgIC8qIGdldCBlbmVyZ3kgYW5kIHNjYWxlZmFjdG9yIGZvciBlYWNoIHRpbWUgc2xvdCAqLworICAgICAgaW50IG91dFNjYWxlOworICAgICAgaW50IGluU2NhbGUgPSAzOyAvKiBzY2FsZSBmYWN0b3IgZGV0ZXJtaW5lZCBlbXBpcmljYWxseSAqLworICAgICAgZm9yICh0cyA9IDA7IHRzIDwgblRpbWVTbG90czsgdHMrKykgeworICAgICAgICBlbnZbTSArIHRzXSA9IHN1bVVwQ3BseFBvdzIoCisgICAgICAgICAgICAmcHBIeWJyaWREYXRhX19GREtbdHNdW2xvd2VyQm91bmRPbnNldERldGVjdGlvbiArIDFdLAorICAgICAgICAgICAgU1VNX1VQX0RZTkFNSUNfU0NBTEUsIGluU2NhbGUsICZvdXRTY2FsZSwKKyAgICAgICAgICAgIHVwcGVyQm91bmRPbnNldERldGVjdGlvbiAtIGxvd2VyQm91bmRPbnNldERldGVjdGlvbiAtIDEpOworICAgICAgICBlbnZTY2FsZVtNICsgdHNdID0gb3V0U2NhbGUgKyAoaHlicmlkRGF0YVNjYWxlIDw8IDEpOworICAgICAgfQorCisgICAgICAvKiBjYWxjdWxhdGUgY29tbW9uIHNjYWxlIGZvciBhbGwgdGltZSBzbG90cyAqLworICAgICAgU0NIQVIgbWF4U2NhbGUgPSAtKERGUkFDVF9CSVRTIC0gMSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgKG5UaW1lU2xvdHMgKyBNKTsgaSsrKSB7CisgICAgICAgIG1heFNjYWxlID0gZml4TWF4KG1heFNjYWxlLCBlbnZTY2FsZVtpXSk7CisgICAgICB9CisKKyAgICAgIC8qIGFwcGx5IGNvbW1vbiBzY2FsZSBhbmQgc3RvcmUgZW5lcmd5IGluIHRlbXBvcmFyeSBidWZmZXIgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCAoblRpbWVTbG90cyArIE0pOyBpKyspIHsKKyAgICAgICAgZW52c1tpXSA9IGVudltpXSA+PiBmaXhNaW4oKG1heFNjYWxlIC0gZW52U2NhbGVbaV0pLCAoREZSQUNUX0JJVFMgLSAxKSk7CisgICAgICB9CisKKyAgICAgIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgZm9yIChpID0gMDsgaSA8IChuVGltZVNsb3RzICsgTSk7IGkrKykgeworICAgICAgICBtYXhWYWwgfD0gZkFicyhlbnZzW2ldKTsKKyAgICAgIH0KKworICAgICAgaW50IHMgPSBmaXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKG1heFZhbCkgLSAxKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IChuVGltZVNsb3RzICsgTSk7IGkrKykgeworICAgICAgICBlbnZzW2ldID0gZW52c1tpXSA8PCBzOworICAgICAgfQorCisgICAgICBpbnQgY3VyclBvc1ByZXYgPSBjdXJyUG9zOworICAgICAgRklYUF9EQkwgcDEsIHAyOworICAgICAgcDIgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgIGZvciAoOyAoY3VyclBvcyA8IChuVGltZVNsb3RzIDw8IDEpKSAmJiAodHJDbnQgPCBNQVhfTlVNX1RSQU5TKTsKKyAgICAgICAgICAgY3VyclBvcysrKSB7CisgICAgICAgIHAxID0gZk11bHREaXYyKGVudnNbY3VyclBvcyAtIG5UaW1lU2xvdHMgKyBNXSwgdGhyZXNob2xkX3NxdWFyZSkgPj4KKyAgICAgICAgICAgICAoU1BBQ0VfT05TRVRfVEhSRVNIT0xEX1NGIC0gMSk7CisKKyAgICAgICAgLyogQ2FsY3VsYXRlIGF2ZXJhZ2Ugb2YgcGFzdCBNIGVuZXJneSB2YWx1ZXMgKi8KKyAgICAgICAgaWYgKGN1cnJQb3NQcmV2ID09IChjdXJyUG9zIC0gMSkpIHsKKyAgICAgICAgICAvKiByZW1vdmUgbGFzdCBhbmQgYWRkIG5ldyBlbGVtZW50ICovCisgICAgICAgICAgcDIgLT0gKGVudnNbY3VyclBvc1ByZXYgLSBuVGltZVNsb3RzXSA+PgorICAgICAgICAgICAgICAgICAoaW50KWhPbnNldC0+YXZnRW5lcmd5RGlzdGFuY2VTY2FsZSk7CisgICAgICAgICAgcDIgKz0gKGVudnNbY3VyclBvcyAtIG5UaW1lU2xvdHMgKyBNIC0gMV0gPj4KKyAgICAgICAgICAgICAgICAgKGludCloT25zZXQtPmF2Z0VuZXJneURpc3RhbmNlU2NhbGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIGNhbGN1bGF0ZSBjb21wbGV0ZSB2ZWN0b3IgKi8KKyAgICAgICAgICBwMiA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgICAgIGZvciAodHMgPSAwOyB0cyA8IE07IHRzKyspIHsKKyAgICAgICAgICAgIHAyICs9IChlbnZzW2N1cnJQb3MgLSBuVGltZVNsb3RzICsgdHNdID4+CisgICAgICAgICAgICAgICAgICAgKGludCloT25zZXQtPmF2Z0VuZXJneURpc3RhbmNlU2NhbGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjdXJyUG9zUHJldiA9IGN1cnJQb3M7CisKKyAgICAgICAgeworICAgICAgICAgIC8qIHNhdmUgcG9zaXRpb24gaWYgdHJhbnNpZW50IGZvdW5kICovCisgICAgICAgICAgaWYgKHAxID4gcDIpIHsKKyAgICAgICAgICAgIHBUcmFuc2llbnRQb3NbdHJDbnQrK10gPSBjdXJyUG9zOworICAgICAgICAgICAgY3VyclBvcyArPSBoT25zZXQtPm1pblRyYW5zaWVudERpc3RhbmNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSAvKiBmb3IgY3VyclBvcyAqLworICAgIH0KKworICB9IC8qIHZhbGlkIGhhbmRsZSovCitiYWlsOgorCisgIENfQUxMT0NfU0NSQVRDSF9FTkQoZW52cywgRklYUF9EQkwsICgxNiArIE1BWF9USU1FX1NMT1RTKSkKKworICByZXR1cm4gZXJyb3I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX29uc2V0ZGV0ZWN0LmggYi9saWJTQUNlbmMvc3JjL3NhY2VuY19vbnNldGRldGVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmM2YwYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19vbnNldGRldGVjdC5oCkBAIC0wLDAgKzEsMTU0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXggTmV1ZW5kb3JmCisKKyAgIERlc2NyaXB0aW9uOiBFbmNvZGVyIExpYnJhcnkgSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgRGV0ZXJtaW5lIFRFUyBmbGFncworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNBQ0VOQ19PTlNFVERFVEVDVF9ICisjZGVmaW5lIFNBQ0VOQ19PTlNFVERFVEVDVF9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLyoqCisgICBcZmlsZQorICAgRGVzY3JpcHRpb24gb2YgZmlsZSBjb250ZW50cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKyNpbmNsdWRlICJGREtfbWF0cml4Q2FsbG9jLmgiCisjaW5jbHVkZSAic2FjZW5jX2xpYi5oIgorI2luY2x1ZGUgInNhY2VuY19iaXRzdHJlYW0uaCIgLyogZm9yIGRlZi4gb2YgTUFYX05VTV9QQVJBTVMgKi8KKworLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBNQVhfTlVNX1RSQU5TIChNQVhfTlVNX1BBUkFNUyAvIDIpCisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IFRfT05TRVRfREVURUNUX0NPTkZJRyB7CisgIElOVCBtYXhUaW1lU2xvdHM7CisKKyAgLyogY2FsYyB0cmFuc2llbiBkZXRlY3Rpb24gaW4gXWxvd2VyQm91bmRPbnNldERldGVjdGlvbjsKKyAgICogdXBwZXJCb3VuZE9uc2V0RGV0ZWN0aW9uWyAqLworICBJTlQgbG93ZXJCb3VuZE9uc2V0RGV0ZWN0aW9uOworICBJTlQgdXBwZXJCb3VuZE9uc2V0RGV0ZWN0aW9uOworCit9IE9OU0VUX0RFVEVDVF9DT05GSUc7CisKK3R5cGVkZWYgc3RydWN0IE9OU0VUX0RFVEVDVCAqSEFORExFX09OU0VUX0RFVEVDVDsKKworLyogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfb25zZXREZXRlY3RfT3BlbihIQU5ETEVfT05TRVRfREVURUNUICpwaE9uc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBtYXhUaW1lU2xvdHMpOworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfb25zZXREZXRlY3RfSW5pdCgKKyAgICBIQU5ETEVfT05TRVRfREVURUNUIGhPbnNldCwKKyAgICBjb25zdCBPTlNFVF9ERVRFQ1RfQ09ORklHICpjb25zdCBwT25zZXREZXRlY3RDb25maWcsIGNvbnN0IFVJTlQgaW5pdEZsYWdzKTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX29uc2V0RGV0ZWN0X0Nsb3NlKEhBTkRMRV9PTlNFVF9ERVRFQ1QgKnBoT25zZXQpOworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfb25zZXREZXRlY3RfVXBkYXRlKEhBTkRMRV9PTlNFVF9ERVRFQ1QgaE9uc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgdGltZVNsb3RzKTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX29uc2V0RGV0ZWN0X0FwcGx5KAorICAgIEhBTkRMRV9PTlNFVF9ERVRFQ1QgaE9uc2V0LCBjb25zdCBJTlQgblRpbWVTbG90cywgY29uc3QgSU5UIG5IeWJyaWRCYW5kcywKKyAgICBGSVhQX0RQSyAqY29uc3QgKmNvbnN0IHBwSHlicmlkRGF0YV9fRkRLLCBjb25zdCBJTlQgaHlicmlkRGF0YVNjYWxlLAorICAgIGNvbnN0IElOVCBwcmV2UG9zLCBJTlQgcFRyYW5zaWVudFBvc1tNQVhfTlVNX1RSQU5TXSk7CisKKyNlbmRpZiAvKiBTQUNFTkNfT05TRVRERVRFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0FDZW5jL3NyYy9zYWNlbmNfcGFyYW1leHRyYWN0LmNwcCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX3BhcmFtZXh0cmFjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNiY2UxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX3BhcmFtZXh0cmFjdC5jcHAKQEAgLTAsMCArMSw3MjUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE0uIE11bHRydXMKKworICAgRGVzY3JpcHRpb246IFBhcmFtZXRlciBFeHRyYWN0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJzYWNlbmNfcGFyYW1leHRyYWN0LmgiCisjaW5jbHVkZSAic2FjZW5jX3RyZWUuaCIKKyNpbmNsdWRlICJzYWNlbmNfdmVjdG9yZnVuY3Rpb25zLmgiCisKKy8qIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTE9HMTBfMl8xMCAoMy4wMTAyOTk5NTY2NGYpIC8qIDEwLjBmKmxvZzEwKDIuZikgKi8KKyNkZWZpbmUgU0NBTEVfQ0xERV9TRiAoNykgICAgICAgICAgIC8qIG1heFZhbCBpbiBRdWFudCB0YWIgaXMgKy8tICA1MCAqLworI2RlZmluZSBTQ0FMRV9DTEREX1NGICg4KSAgICAgICAgICAgLyogbWF4VmFsIGluIFF1YW50IHRhYiBpcyArLy0gMTUwICovCisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IFRfVFRPX0JPWCB7CisgIEZJWFBfREJMIHBDbGRfX0ZES1tNQVhfTlVNX1BBUkFNX0JBTkRTXTsKKyAgRklYUF9EQkwgcEljY19fRkRLW01BWF9OVU1fUEFSQU1fQkFORFNdOworICBGSVhQX0RCTCBwQ2xkUXVhbnRfX0ZES1tNQVhfTlVNX1BBUkFNX0JBTkRTXTsKKworICBjb25zdCBGSVhQX0RCTCAqcEljY1F1YW50VGFibGVfX0ZESzsKKyAgY29uc3QgRklYUF9EQkwgKnBDbGRRdWFudFRhYmxlRGVjX19GREs7CisgIGNvbnN0IEZJWFBfREJMICpwQ2xkUXVhbnRUYWJsZUVuY19fRkRLOworCisgIFNDSEFSIHBDbGRFYlFJZHhbTUFYX05VTV9QQVJBTV9CQU5EU107CisgIFNDSEFSIHBJY2NEb3dubWl4SWR4W01BWF9OVU1fUEFSQU1fQkFORFNdOworCisgIFVDSEFSICpwUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0OworICBjb25zdCBJTlQgKnBTdWJiYW5kSW1hZ1NpZ247CisgIFVDSEFSIG5IeWJyaWRCYW5kc01heDsKKyAgVUNIQVIgblBhcmFtZXRlckJhbmRzOworICBVQ0hBUiBiRnJhbWVLZWVwOworCisgIFVDSEFSIGljY0NvcnJlbGF0aW9uQ29oZXJlbmNlQm9yZGVyOworICBCT1hfUVVBTlRNT0RFIGJveFF1YW50TW9kZTsKKworICBVQ0hBUiBuSWNjUXVhbnRTdGVwczsKKyAgVUNIQVIgbkljY1F1YW50T2Zmc2V0OworCisgIFVDSEFSIG5DbGRRdWFudFN0ZXBzOworICBVQ0hBUiBuQ2xkUXVhbnRPZmZzZXQ7CisKKyAgVUNIQVIgYlVzZUNvYXJzZVF1YW50Q2xkOworICBVQ0hBUiBiVXNlQ29hcnNlUXVhbnRJY2M7CisKK30gVFRPX0JPWDsKKworc3RydWN0IEJPWF9TVUJCQU5EX1NFVFVQIHsKKyAgQk9YX1NVQkJBTkRfQ09ORklHIHN1YmJhbmRDb25maWc7CisgIFVDSEFSIG5QYXJhbWV0ZXJCYW5kczsKKyAgY29uc3QgVUNIQVIgKnBTdWJiYW5kMlBhcmFtZXRlckluZGV4TGQ7CisgIFVDSEFSIGljY0NvcnJlbGF0aW9uQ29oZXJlbmNlQm9yZGVyOworfTsKKworLyogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGNvbnN0IFVDSEFSIHN1YmJhbmQyUGFyYW1ldGVyNF9MZFtOVU1fUU1GX0JBTkRTXSA9IHsKKyAgICAwLCAwLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgIDIsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgM307CisKK3N0YXRpYyBjb25zdCBVQ0hBUiBzdWJiYW5kMlBhcmFtZXRlcjVfTGRbTlVNX1FNRl9CQU5EU10gPSB7CisgICAgMCwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAzLCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDR9OworCitzdGF0aWMgY29uc3QgVUNIQVIgc3ViYmFuZDJQYXJhbWV0ZXI3X0xkW05VTV9RTUZfQkFORFNdID0geworICAgIDAsIDEsIDIsIDIsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCisgICAgNSwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwKKyAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2fTsKKworc3RhdGljIGNvbnN0IFVDSEFSIHN1YmJhbmQyUGFyYW1ldGVyOV9MZFtOVU1fUU1GX0JBTkRTXSA9IHsKKyAgICAwLCAxLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA2LCA2LCA2LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICAgIDcsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCisgICAgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOH07CisKK3N0YXRpYyBjb25zdCBVQ0hBUiBzdWJiYW5kMlBhcmFtZXRlcjEyX0xkW05VTV9RTUZfQkFORFNdID0geworICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgOCwgIDgsCisgICAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTF9OworCitzdGF0aWMgY29uc3QgVUNIQVIgc3ViYmFuZDJQYXJhbWV0ZXIxNV9MZFtOVU1fUU1GX0JBTkRTXSA9IHsKKyAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgOSwgIDEwLCAxMCwgMTAsIDExLCAxMSwKKyAgICAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNH07CisKK3N0YXRpYyBjb25zdCBVQ0hBUiBzdWJiYW5kMlBhcmFtZXRlcjIzX0xkW05VTV9RTUZfQkFORFNdID0geworICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICAxMCwgMTEsIDEyLCAxMiwgMTMsIDEzLAorICAgIDE0LCAxNCwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCwgMTksIDE5LAorICAgIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLAorICAgIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyfTsKKworc3RhdGljIGNvbnN0IElOVCBzdWJiYW5kSW1hZ1NpZ25fTGRbTlVNX1FNRl9CQU5EU10gPSB7CisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCit9OworCisjZGVmaW5lIFNDQUxFX0NMREUoYSkgKEZMMkZYQ09OU1RfREJMKGEgLyAoZmxvYXQpKDEgPDwgU0NBTEVfQ0xERV9TRikpKQorc3RhdGljIGNvbnN0IEZJWFBfREJMIGNsZFF1YW50VGFibGVGaW5lRW5jX19GREtbTUFYX0NMRF9RVUFOVF9GSU5FXSA9IHsKKyAgICBTQ0FMRV9DTERFKC01MC4wKSwgU0NBTEVfQ0xERSgtNDUuMCksIFNDQUxFX0NMREUoLTQwLjApLCBTQ0FMRV9DTERFKC0zNS4wKSwKKyAgICBTQ0FMRV9DTERFKC0zMC4wKSwgU0NBTEVfQ0xERSgtMjUuMCksIFNDQUxFX0NMREUoLTIyLjApLCBTQ0FMRV9DTERFKC0xOS4wKSwKKyAgICBTQ0FMRV9DTERFKC0xNi4wKSwgU0NBTEVfQ0xERSgtMTMuMCksIFNDQUxFX0NMREUoLTEwLjApLCBTQ0FMRV9DTERFKC04LjApLAorICAgIFNDQUxFX0NMREUoLTYuMCksICBTQ0FMRV9DTERFKC00LjApLCAgU0NBTEVfQ0xERSgtMi4wKSwgIFNDQUxFX0NMREUoMC4wKSwKKyAgICBTQ0FMRV9DTERFKDIuMCksICAgU0NBTEVfQ0xERSg0LjApLCAgIFNDQUxFX0NMREUoNi4wKSwgICBTQ0FMRV9DTERFKDguMCksCisgICAgU0NBTEVfQ0xERSgxMC4wKSwgIFNDQUxFX0NMREUoMTMuMCksICBTQ0FMRV9DTERFKDE2LjApLCAgU0NBTEVfQ0xERSgxOS4wKSwKKyAgICBTQ0FMRV9DTERFKDIyLjApLCAgU0NBTEVfQ0xERSgyNS4wKSwgIFNDQUxFX0NMREUoMzAuMCksICBTQ0FMRV9DTERFKDM1LjApLAorICAgIFNDQUxFX0NMREUoNDAuMCksICBTQ0FMRV9DTERFKDQ1LjApLCAgU0NBTEVfQ0xERSg1MC4wKX07CisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBjbGRRdWFudFRhYmxlQ29hcnNlRW5jX19GREtbTUFYX0NMRF9RVUFOVF9DT0FSU0VdID0geworICAgIFNDQUxFX0NMREUoLTUwLjApLCBTQ0FMRV9DTERFKC0zNS4wKSwgU0NBTEVfQ0xERSgtMjUuMCksIFNDQUxFX0NMREUoLTE5LjApLAorICAgIFNDQUxFX0NMREUoLTEzLjApLCBTQ0FMRV9DTERFKC04LjApLCAgU0NBTEVfQ0xERSgtNC4wKSwgIFNDQUxFX0NMREUoMC4wKSwKKyAgICBTQ0FMRV9DTERFKDQuMCksICAgU0NBTEVfQ0xERSg4LjApLCAgIFNDQUxFX0NMREUoMTMuMCksICBTQ0FMRV9DTERFKDE5LjApLAorICAgIFNDQUxFX0NMREUoMjUuMCksICBTQ0FMRV9DTERFKDM1LjApLCAgU0NBTEVfQ0xERSg1MC4wKX07CisKKyNkZWZpbmUgU0NBTEVfQ0xERChhKSAoRkwyRlhDT05TVF9EQkwoYSAvIChmbG9hdCkoMSA8PCBTQ0FMRV9DTEREX1NGKSkpCitzdGF0aWMgY29uc3QgRklYUF9EQkwgY2xkUXVhbnRUYWJsZUZpbmVEZWNfX0ZES1tNQVhfQ0xEX1FVQU5UX0ZJTkVdID0geworICAgIFNDQUxFX0NMREQoLTE1MC4wKSwgU0NBTEVfQ0xERCgtNDUuMCksIFNDQUxFX0NMREQoLTQwLjApLCBTQ0FMRV9DTEREKC0zNS4wKSwKKyAgICBTQ0FMRV9DTEREKC0zMC4wKSwgIFNDQUxFX0NMREQoLTI1LjApLCBTQ0FMRV9DTEREKC0yMi4wKSwgU0NBTEVfQ0xERCgtMTkuMCksCisgICAgU0NBTEVfQ0xERCgtMTYuMCksICBTQ0FMRV9DTEREKC0xMy4wKSwgU0NBTEVfQ0xERCgtMTAuMCksIFNDQUxFX0NMREQoLTguMCksCisgICAgU0NBTEVfQ0xERCgtNi4wKSwgICBTQ0FMRV9DTEREKC00LjApLCAgU0NBTEVfQ0xERCgtMi4wKSwgIFNDQUxFX0NMREQoMC4wKSwKKyAgICBTQ0FMRV9DTEREKDIuMCksICAgIFNDQUxFX0NMREQoNC4wKSwgICBTQ0FMRV9DTEREKDYuMCksICAgU0NBTEVfQ0xERCg4LjApLAorICAgIFNDQUxFX0NMREQoMTAuMCksICAgU0NBTEVfQ0xERCgxMy4wKSwgIFNDQUxFX0NMREQoMTYuMCksICBTQ0FMRV9DTEREKDE5LjApLAorICAgIFNDQUxFX0NMREQoMjIuMCksICAgU0NBTEVfQ0xERCgyNS4wKSwgIFNDQUxFX0NMREQoMzAuMCksICBTQ0FMRV9DTEREKDM1LjApLAorICAgIFNDQUxFX0NMREQoNDAuMCksICAgU0NBTEVfQ0xERCg0NS4wKSwgIFNDQUxFX0NMREQoMTUwLjApfTsKKworc3RhdGljIGNvbnN0IEZJWFBfREJMIGNsZFF1YW50VGFibGVDb2Fyc2VEZWNfX0ZES1tNQVhfQ0xEX1FVQU5UX0NPQVJTRV0gPSB7CisgICAgU0NBTEVfQ0xERCgtMTUwLjApLCBTQ0FMRV9DTEREKC0zNS4wKSwgU0NBTEVfQ0xERCgtMjUuMCksIFNDQUxFX0NMREQoLTE5LjApLAorICAgIFNDQUxFX0NMREQoLTEzLjApLCAgU0NBTEVfQ0xERCgtOC4wKSwgIFNDQUxFX0NMREQoLTQuMCksICBTQ0FMRV9DTEREKDAuMCksCisgICAgU0NBTEVfQ0xERCg0LjApLCAgICBTQ0FMRV9DTEREKDguMCksICAgU0NBTEVfQ0xERCgxMy4wKSwgIFNDQUxFX0NMREQoMTkuMCksCisgICAgU0NBTEVfQ0xERCgyNS4wKSwgICBTQ0FMRV9DTEREKDM1LjApLCAgU0NBTEVfQ0xERCgxNTAuMCl9OworCisjZGVmaW5lIFNDQUxFX0lDQyhhKSAoRkwyRlhDT05TVF9EQkwoYSkpCitzdGF0aWMgY29uc3QgRklYUF9EQkwgaWNjUXVhbnRUYWJsZUZpbmVfX0ZES1tNQVhfSUNDX1FVQU5UX0ZJTkVdID0geworICAgIFNDQUxFX0lDQygwLjk5OTk5OTk5OTUzKSwgU0NBTEVfSUNDKDAuOTM3ZiksICAgU0NBTEVfSUNDKDAuODQxMThmKSwKKyAgICBTQ0FMRV9JQ0MoMC42MDA5MmYpLCAgICAgIFNDQUxFX0lDQygwLjM2NzY0ZiksIFNDQUxFX0lDQygwLjBmKSwKKyAgICBTQ0FMRV9JQ0MoLTAuNTg5ZiksICAgICAgIFNDQUxFX0lDQygtMC45OWYpfTsKKworc3RhdGljIGNvbnN0IEZJWFBfREJMIGljY1F1YW50VGFibGVDb2Fyc2VfX0ZES1tNQVhfSUNDX1FVQU5UX0NPQVJTRV0gPSB7CisgICAgU0NBTEVfSUNDKDAuOTk5OTk5OTk5NTMpLCBTQ0FMRV9JQ0MoMC44NDExOGYpLCBTQ0FMRV9JQ0MoMC4zNjc2NGYpLAorICAgIFNDQUxFX0lDQygtMC41ODkwZil9OworCitzdGF0aWMgY29uc3QgQk9YX1NVQkJBTkRfU0VUVVAgYm94U3ViYmFuZFNldHVwW10gPSB7CisgICAge0JPWF9TVUJCQU5EU180LCA0LCBzdWJiYW5kMlBhcmFtZXRlcjRfTGQsIDF9LAorICAgIHtCT1hfU1VCQkFORFNfNSwgNSwgc3ViYmFuZDJQYXJhbWV0ZXI1X0xkLCAyfSwKKyAgICB7Qk9YX1NVQkJBTkRTXzcsIDcsIHN1YmJhbmQyUGFyYW1ldGVyN19MZCwgM30sCisgICAge0JPWF9TVUJCQU5EU185LCA5LCBzdWJiYW5kMlBhcmFtZXRlcjlfTGQsIDR9LAorICAgIHtCT1hfU1VCQkFORFNfMTIsIDEyLCBzdWJiYW5kMlBhcmFtZXRlcjEyX0xkLCA0fSwKKyAgICB7Qk9YX1NVQkJBTkRTXzE1LCAxNSwgc3ViYmFuZDJQYXJhbWV0ZXIxNV9MZCwgNX0sCisgICAge0JPWF9TVUJCQU5EU18yMywgMjMsIHN1YmJhbmQyUGFyYW1ldGVyMjNfTGQsIDh9fTsKKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlZmluaXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY29uc3QgQk9YX1NVQkJBTkRfU0VUVVAgKmdldEJveFN1YmJhbmRTZXR1cCgKKyAgICBjb25zdCBCT1hfU1VCQkFORF9DT05GSUcgc3ViYmFuZENvbmZpZykgeworICBpbnQgaTsKKyAgY29uc3QgQk9YX1NVQkJBTkRfU0VUVVAgKnNldHVwID0gTlVMTDsKKworICBmb3IgKGkgPSAwOyBpIDwgKGludCkoc2l6ZW9mKGJveFN1YmJhbmRTZXR1cCkgLyBzaXplb2YoQk9YX1NVQkJBTkRfU0VUVVApKTsKKyAgICAgICBpKyspIHsKKyAgICBpZiAoYm94U3ViYmFuZFNldHVwW2ldLnN1YmJhbmRDb25maWcgPT0gc3ViYmFuZENvbmZpZykgeworICAgICAgc2V0dXAgPSAmYm94U3ViYmFuZFNldHVwW2ldOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBzZXR1cDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIEFwcGx5QkJDdWVzRkRLKEZJWFBfREJMICpjb25zdCBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgblBhcmFtQmFuZHMpIHsKKyAgaW50IGksIHM7CisgIEZJWFBfREJMIHRtcCwgaW52UGFyYW1CYW5kczsKKworICBpbnZQYXJhbUJhbmRzID0gZkRpdk5vcm1IaWdoUHJlYygoRklYUF9EQkwpMSwgKEZJWFBfREJMKW5QYXJhbUJhbmRzLCAmcyk7CisgIHMgPSAtczsKKworICB0bXAgPSBmTXVsdChwRGF0YVswXSwgaW52UGFyYW1CYW5kcykgPj4gczsKKyAgZm9yIChpID0gMTsgaSA8IG5QYXJhbUJhbmRzOyBpKyspIHsKKyAgICB0bXAgKz0gZk11bHQocERhdGFbaV0sIGludlBhcmFtQmFuZHMpID4+IHM7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgblBhcmFtQmFuZHM7IGkrKykgeworICAgIHBEYXRhW2ldID0gdG1wOworICB9Cit9CisKK3N0YXRpYyBJTlQgZ2V0TnVtYmVyUGFyYW1ldGVyQmFuZHMoY29uc3QgQk9YX1NVQkJBTkRfQ09ORklHIHN1YmJhbmRDb25maWcpIHsKKyAgY29uc3QgQk9YX1NVQkJBTkRfU0VUVVAgKnNldHVwID0gZ2V0Qm94U3ViYmFuZFNldHVwKHN1YmJhbmRDb25maWcpOworICByZXR1cm4gKChzZXR1cCA9PSBOVUxMKSA/IDAgOiBzZXR1cC0+blBhcmFtZXRlckJhbmRzKTsKK30KKworc3RhdGljIGNvbnN0IFVDSEFSICpnZXRTdWJiYW5kMlBhcmFtZXRlckluZGV4KAorICAgIGNvbnN0IEJPWF9TVUJCQU5EX0NPTkZJRyBzdWJiYW5kQ29uZmlnKSB7CisgIGNvbnN0IEJPWF9TVUJCQU5EX1NFVFVQICpzZXR1cCA9IGdldEJveFN1YmJhbmRTZXR1cChzdWJiYW5kQ29uZmlnKTsKKworICByZXR1cm4gKChzZXR1cCA9PSBOVUxMKSA/IE5VTEwgOiAoc2V0dXAtPnBTdWJiYW5kMlBhcmFtZXRlckluZGV4TGQpKTsKK30KKwordm9pZCBmZGtfc2FjZW5jX2NhbGNQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXQoCisgICAgY29uc3QgQk9YX1NVQkJBTkRfQ09ORklHIHN1YmJhbmRDb25maWcsIGNvbnN0IElOVCBuSHlicmlkQmFuZHMsCisgICAgVUNIQVIgKnBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXQpIHsKKyAgY29uc3QgQk9YX1NVQkJBTkRfU0VUVVAgKnNldHVwID0gZ2V0Qm94U3ViYmFuZFNldHVwKHN1YmJhbmRDb25maWcpOworICBjb25zdCBVQ0hBUiAqcFN1YmJhbmQyUGFyYW1ldGVySW5kZXg7CisKKyAgaW50IGksIHBiOworCisgIHBTdWJiYW5kMlBhcmFtZXRlckluZGV4ID0gc2V0dXAtPnBTdWJiYW5kMlBhcmFtZXRlckluZGV4TGQ7CisKKyAgZm9yIChwYiA9IDAsIGkgPSAwOyBpIDwgbkh5YnJpZEJhbmRzIC0gMTsgaSsrKSB7CisgICAgaWYgKHBTdWJiYW5kMlBhcmFtZXRlckluZGV4W2kgKyAxXSAtIHBTdWJiYW5kMlBhcmFtZXRlckluZGV4W2ldKSB7CisgICAgICBwUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0W3BiKytdID0gKGkgKyAxKTsKKyAgICB9CisgIH0KKyAgcFBhcmFtZXRlckJhbmQySHlicmlkQmFuZE9mZnNldFtwYisrXSA9IChpICsgMSk7Cit9CisKK2NvbnN0IElOVCAqZmRrX3NhY2VuY19nZXRTdWJiYW5kSW1hZ1NpZ24oKSB7CisgIGNvbnN0IElOVCAqcEltYWdTaWduID0gTlVMTDsKKworICBwSW1hZ1NpZ24gPSBzdWJiYW5kSW1hZ1NpZ25fTGQ7CisKKyAgcmV0dXJuIChwSW1hZ1NpZ24pOworfQorCitzdGF0aWMgSU5UIGdldEljY0NvcnJlbGF0aW9uQ29oZXJlbmNlQm9yZGVyKAorICAgIGNvbnN0IEJPWF9TVUJCQU5EX0NPTkZJRyBzdWJiYW5kQ29uZmlnLCBjb25zdCBJTlQgYlVzZUNvaGVyZW5jZU9ubHkpIHsKKyAgY29uc3QgQk9YX1NVQkJBTkRfU0VUVVAgKnNldHVwID0gZ2V0Qm94U3ViYmFuZFNldHVwKHN1YmJhbmRDb25maWcpOworICByZXR1cm4gKAorICAgICAgKHNldHVwID09IE5VTEwpCisgICAgICAgICAgPyAwCisgICAgICAgICAgOiAoKGJVc2VDb2hlcmVuY2VPbmx5KSA/IDAgOiBzZXR1cC0+aWNjQ29ycmVsYXRpb25Db2hlcmVuY2VCb3JkZXIpKTsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2NyZWF0ZVR0b0JveChIQU5ETEVfVFRPX0JPWCAqaFR0b0JveCkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChOVUxMID09IGhUdG9Cb3gpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKCpoVHRvQm94LCAxLCBUVE9fQk9YKTsKKyAgfQorICByZXR1cm4gZXJyb3I7CisKK2JhaWw6CisgIGZka19zYWNlbmNfZGVzdHJveVR0b0JveChoVHRvQm94KTsKKyAgcmV0dXJuICgoU0FDRU5DX09LID09IGVycm9yKSA/IFNBQ0VOQ19NRU1PUllfRVJST1IgOiBlcnJvcik7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19pbml0VHRvQm94KEhBTkRMRV9UVE9fQk9YIGhUdG9Cb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVE9fQk9YX0NPTkZJRyAqY29uc3QgdHRvQm94Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXQpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKGhUdG9Cb3ggPT0gTlVMTCkgfHwgKHR0b0JveENvbmZpZyA9PSBOVUxMKSB8fAorICAgICAgKHBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXQgPT0gTlVMTCkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBGREttZW1jbGVhcihoVHRvQm94LCBzaXplb2YoVFRPX0JPWCkpOworCisgICAgaFR0b0JveC0+YlVzZUNvYXJzZVF1YW50Q2xkID0gdHRvQm94Q29uZmlnLT5iVXNlQ29hcnNlUXVhbnRDbGQ7CisgICAgaFR0b0JveC0+YlVzZUNvYXJzZVF1YW50SWNjID0gdHRvQm94Q29uZmlnLT5iVXNlQ29hcnNlUXVhbnRJY2M7CisgICAgaFR0b0JveC0+Ym94UXVhbnRNb2RlID0gdHRvQm94Q29uZmlnLT5ib3hRdWFudE1vZGU7CisgICAgaFR0b0JveC0+aWNjQ29ycmVsYXRpb25Db2hlcmVuY2VCb3JkZXIgPSBnZXRJY2NDb3JyZWxhdGlvbkNvaGVyZW5jZUJvcmRlcigKKyAgICAgICAgdHRvQm94Q29uZmlnLT5zdWJiYW5kQ29uZmlnLCB0dG9Cb3hDb25maWctPmJVc2VDb2hlcmVuY2VJY2NPbmx5KTsKKyAgICBoVHRvQm94LT5uSHlicmlkQmFuZHNNYXggPSB0dG9Cb3hDb25maWctPm5IeWJyaWRCYW5kc01heDsKKyAgICBoVHRvQm94LT5uUGFyYW1ldGVyQmFuZHMgPQorICAgICAgICBnZXROdW1iZXJQYXJhbWV0ZXJCYW5kcyh0dG9Cb3hDb25maWctPnN1YmJhbmRDb25maWcpOworICAgIGhUdG9Cb3gtPmJGcmFtZUtlZXAgPSB0dG9Cb3hDb25maWctPmJGcmFtZUtlZXA7CisKKyAgICBoVHRvQm94LT5uSWNjUXVhbnRTdGVwcyA9CisgICAgICAgIGZka19zYWNlbmNfZ2V0TnVtYmVySWNjUXVhbnRMZXZlbHMoaFR0b0JveC0+YlVzZUNvYXJzZVF1YW50SWNjKTsKKyAgICBoVHRvQm94LT5uSWNjUXVhbnRPZmZzZXQgPQorICAgICAgICBmZGtfc2FjZW5jX2dldEljY1F1YW50T2Zmc2V0KGhUdG9Cb3gtPmJVc2VDb2Fyc2VRdWFudEljYyk7CisKKyAgICBoVHRvQm94LT5wSWNjUXVhbnRUYWJsZV9fRkRLID0gaFR0b0JveC0+YlVzZUNvYXJzZVF1YW50SWNjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGljY1F1YW50VGFibGVDb2Fyc2VfX0ZESworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpY2NRdWFudFRhYmxlRmluZV9fRkRLOworICAgIGhUdG9Cb3gtPnBDbGRRdWFudFRhYmxlRGVjX19GREsgPSBoVHRvQm94LT5iVXNlQ29hcnNlUXVhbnRDbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2xkUXVhbnRUYWJsZUNvYXJzZURlY19fRkRLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNsZFF1YW50VGFibGVGaW5lRGVjX19GREs7CisgICAgaFR0b0JveC0+cENsZFF1YW50VGFibGVFbmNfX0ZESyA9IGhUdG9Cb3gtPmJVc2VDb2Fyc2VRdWFudENsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjbGRRdWFudFRhYmxlQ29hcnNlRW5jX19GREsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY2xkUXVhbnRUYWJsZUZpbmVFbmNfX0ZESzsKKworICAgIGhUdG9Cb3gtPm5DbGRRdWFudFN0ZXBzID0KKyAgICAgICAgZmRrX3NhY2VuY19nZXROdW1iZXJDbGRRdWFudExldmVscyhoVHRvQm94LT5iVXNlQ29hcnNlUXVhbnRDbGQpOworICAgIGhUdG9Cb3gtPm5DbGRRdWFudE9mZnNldCA9CisgICAgICAgIGZka19zYWNlbmNfZ2V0Q2xkUXVhbnRPZmZzZXQoaFR0b0JveC0+YlVzZUNvYXJzZVF1YW50Q2xkKTsKKworICAgIC8qIHNhbml0eSAqLworICAgIGlmIChOVUxMID09IChoVHRvQm94LT5wUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0ID0KKyAgICAgICAgICAgICAgICAgICAgIHBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXQpKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTklUX0VSUk9SOworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChOVUxMID09IChoVHRvQm94LT5wU3ViYmFuZEltYWdTaWduID0gZmRrX3NhY2VuY19nZXRTdWJiYW5kSW1hZ1NpZ24oKSkpIHsKKyAgICAgIGVycm9yID0gU0FDRU5DX0lOSVRfRVJST1I7CisgICAgfQorCisgICAgaWYgKChoVHRvQm94LT5ib3hRdWFudE1vZGUgIT0gQk9YX1FVQU5UTU9ERV9GSU5FKSAmJgorICAgICAgICAoaFR0b0JveC0+Ym94UXVhbnRNb2RlICE9IEJPWF9RVUFOVE1PREVfRUJRMSkgJiYKKyAgICAgICAgKGhUdG9Cb3gtPmJveFF1YW50TW9kZSAhPSBCT1hfUVVBTlRNT0RFX0VCUTIpKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTklUX0VSUk9SOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfQorYmFpbDoKKyAgcmV0dXJuIGVycm9yOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfZGVzdHJveVR0b0JveChIQU5ETEVfVFRPX0JPWCAqaFR0b0JveCkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgqaFR0b0JveCAhPSBOVUxMKSB7CisgICAgRkRLZnJlZSgqaFR0b0JveCk7CisgICAgKmhUdG9Cb3ggPSBOVUxMOworICB9CisKKyAgcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiBjYWxjdWxhdGVJY2NGREsoY29uc3QgSU5UIG5QYXJhbUJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGNvcnJlbGF0aW9uQ29oZXJlbmNlQm9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBwUHdyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgcFB3cjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHBQcm9kUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBjb25zdCAqY29uc3QgcFByb2RJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpjb25zdCBwSWNjKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKChwUHdyMSA9PSBOVUxMKSB8fCAocFB3cjIgPT0gTlVMTCkgfHwgKHBQcm9kUmVhbCA9PSBOVUxMKSB8fAorICAgICAgKHBQcm9kSW1hZyA9PSBOVUxMKSB8fCAocEljYyA9PSBOVUxMKSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIC8qIHNhbml0eSBjaGVjayBib3JkZXIgKi8KKyAgICBpZiAoY29ycmVsYXRpb25Db2hlcmVuY2VCb3JkZXIgPiBuUGFyYW1CYW5kKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICB9IGVsc2UgeworICAgICAgLyogY29ycmVsYXRpb24gKi8KKyAgICAgIEZES2NhbGNDb3JyZWxhdGlvblZlYyhwSWNjLCBwUHJvZFJlYWwsIHBQd3IxLCBwUHdyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbkNvaGVyZW5jZUJvcmRlcik7CisKKyAgICAgIC8qIGNvaGVyZW5jZSAqLworICAgICAgY2FsY0NvaGVyZW5jZVZlYygmcEljY1tjb3JyZWxhdGlvbkNvaGVyZW5jZUJvcmRlcl0sCisgICAgICAgICAgICAgICAgICAgICAgICZwUHJvZFJlYWxbY29ycmVsYXRpb25Db2hlcmVuY2VCb3JkZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAmcFByb2RJbWFnW2NvcnJlbGF0aW9uQ29oZXJlbmNlQm9yZGVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnBQd3IxW2NvcnJlbGF0aW9uQ29oZXJlbmNlQm9yZGVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnBQd3IyW2NvcnJlbGF0aW9uQ29oZXJlbmNlQm9yZGVyXSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgblBhcmFtQmFuZCAtIGNvcnJlbGF0aW9uQ29oZXJlbmNlQm9yZGVyKTsKKworICAgIH0gLyogdmFsaWQgY29uZmlndXJhdGlvbiAqLworICB9ICAgLyogdmFsaWQgaGFuZGxlICovCisKKyAgcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBRdWFudGl6ZUNvZWZGREsoY29uc3QgRklYUF9EQkwgKmNvbnN0IGlucHV0LCBjb25zdCBJTlQgbkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBxdWFudFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpZHhPZmZzZXQsIGNvbnN0IElOVCBuUXVhbnRTdGVwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqY29uc3QgcXVhbnRPdXQpIHsKKyAgaW50IGJhbmQ7CisgIGNvbnN0IGludCByZXZlcnNlID0gKHF1YW50VGFibGVbMF0gPiBxdWFudFRhYmxlWzFdKTsKKworICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbkJhbmRzOyBiYW5kKyspIHsKKyAgICBGSVhQX0RCTCBxVmFsOworICAgIEZJWFBfREJMIGN1clZhbCA9IGlucHV0W2JhbmRdOworCisgICAgaW50IGxvd2VyID0gMDsKKyAgICBpbnQgdXBwZXIgPSBuUXVhbnRTdGVwcyAtIDE7CisKKyAgICBpZiAocmV2ZXJzZSkgeworICAgICAgd2hpbGUgKHVwcGVyIC0gbG93ZXIgPiAxKSB7CisgICAgICAgIGludCBpZHggPSAobG93ZXIgKyB1cHBlcikgPj4gMTsKKyAgICAgICAgcVZhbCA9IHF1YW50VGFibGVbaWR4XTsKKyAgICAgICAgaWYgKGN1clZhbCA+PSBxVmFsKSB7CisgICAgICAgICAgdXBwZXIgPSBpZHg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbG93ZXIgPSBpZHg7CisgICAgICAgIH0KKyAgICAgIH0gLyogd2hpbGUgKi8KKworICAgICAgaWYgKChjdXJWYWwgLSBxdWFudFRhYmxlW2xvd2VyXSkgPj0gKHF1YW50VGFibGVbdXBwZXJdIC0gY3VyVmFsKSkgeworICAgICAgICBxdWFudE91dFtiYW5kXSA9IGxvd2VyIC0gaWR4T2Zmc2V0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcXVhbnRPdXRbYmFuZF0gPSB1cHBlciAtIGlkeE9mZnNldDsKKyAgICAgIH0KKyAgICB9IC8qIGlmIHJldmVyc2UgKi8KKyAgICBlbHNlIHsKKyAgICAgIHdoaWxlICh1cHBlciAtIGxvd2VyID4gMSkgeworICAgICAgICBpbnQgaWR4ID0gKGxvd2VyICsgdXBwZXIpID4+IDE7CisgICAgICAgIHFWYWwgPSBxdWFudFRhYmxlW2lkeF07CisgICAgICAgIGlmIChjdXJWYWwgPD0gcVZhbCkgeworICAgICAgICAgIHVwcGVyID0gaWR4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGxvd2VyID0gaWR4OworICAgICAgICB9CisgICAgICB9IC8qIHdoaWxlICovCisKKyAgICAgIGlmICgoY3VyVmFsIC0gcXVhbnRUYWJsZVtsb3dlcl0pIDw9IChxdWFudFRhYmxlW3VwcGVyXSAtIGN1clZhbCkpIHsKKyAgICAgICAgcXVhbnRPdXRbYmFuZF0gPSBsb3dlciAtIGlkeE9mZnNldDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHF1YW50T3V0W2JhbmRdID0gdXBwZXIgLSBpZHhPZmZzZXQ7CisgICAgICB9CisgICAgfSAvKiBlbHNlIHJldmVyc2UgKi8KKyAgfSAgIC8qIGZvciBiYW5kICovCit9CisKK3N0YXRpYyB2b2lkIGRlUXVhbnRpemVDb2VmRkRLKGNvbnN0IFNDSEFSICpjb25zdCBpbnB1dCwgY29uc3QgSU5UIG5CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBxdWFudFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGlkeE9mZnNldCwgRklYUF9EQkwgKmNvbnN0IGRlcXVhbnRPdXQpIHsKKyAgaW50IGJhbmQ7CisKKyAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG5CYW5kczsgYmFuZCsrKSB7CisgICAgZGVxdWFudE91dFtiYW5kXSA9IHF1YW50VGFibGVbaW5wdXRbYmFuZF0gKyBpZHhPZmZzZXRdOworICB9Cit9CisKK3N0YXRpYyB2b2lkIENhbGN1bGF0ZUNsZEZESyhGSVhQX0RCTCAqY29uc3QgcENsZCwgY29uc3QgRklYUF9EQkwgKmNvbnN0IHBQd3IxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBwUHdyMiwgY29uc3QgSU5UIHNjYWxlQ2gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqY29uc3QgcGJTY2FsZUNoMSwgY29uc3QgSU5UIHNjYWxlQ2gyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqY29uc3QgcGJTY2FsZUNoMiwgY29uc3QgaW50IG5QYXJhbUJhbmQpIHsKKyAgSU5UIGk7CisgIEZJWFBfREJMIGxkUHdyMSwgbGRQd3IyLCBjbGQ7CisgIEZJWFBfREJMIG1heFB3ciA9IEZMMkZYQ09OU1RfREJMKAorICAgICAgMzAuMGYgLworICAgICAgKDEgPDwgKExEX0RBVEFfU0hJRlQgKworICAgICAgICAgICAgIDEpKSk7IC8qIGNvbnNpZGVyIFNBQ0VOQ19GTE9BVF9FUFNJTE9OIGluIHBvd2VyIGNhbGN1bGF0aW9uICovCisKKyAgZm9yIChpID0gMDsgaSA8IG5QYXJhbUJhbmQ7IGkrKykgeworICAgIGxkUHdyMSA9CisgICAgICAgIChDYWxjTGREYXRhKHBQd3IxW2ldKSA+PiAxKSArICgoRklYUF9EQkwpKHNjYWxlQ2gxICsgcGJTY2FsZUNoMVtpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChERlJBQ1RfQklUUyAtIDEgLSBMRF9EQVRBX1NISUZUKSk7CisgICAgbGRQd3IyID0KKyAgICAgICAgKENhbGNMZERhdGEocFB3cjJbaV0pID4+IDEpICsgKChGSVhQX0RCTCkoc2NhbGVDaDIgKyBwYlNjYWxlQ2gyW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKERGUkFDVF9CSVRTIC0gMSAtIExEX0RBVEFfU0hJRlQpKTsKKworICAgIGxkUHdyMSA9IGZpeE1heChmaXhNaW4obGRQd3IxLCBtYXhQd3IpLCAtbWF4UHdyKTsKKyAgICBsZFB3cjIgPSBmaXhNYXgoZml4TWluKGxkUHdyMiwgbWF4UHdyKSwgLW1heFB3cik7CisKKyAgICAvKiBsZFB3cjEgYW5kIGxkUHdyMiBhcmUgc2NhbGVkIGJ5IExEX0RBVEFfU0hJRlQgYW5kIGFkZGl0aW9uYWwgMSBiaXQ7IDEgYml0CisgICAgICogc2NhbGUgYnkgZk11bHREaXYyKCkgKi8KKyAgICBjbGQgPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoTE9HMTBfMl8xMCAvICgxIDw8IFNDQUxFX0NMREVfU0YpKSwKKyAgICAgICAgICAgICAgICAgICAgbGRQd3IxIC0gbGRQd3IyKTsKKworICAgIGNsZCA9CisgICAgICAgIGZpeE1pbihjbGQsIChGSVhQX0RCTCkoKChGSVhQX0RCTClNQVhWQUxfREJMKSA+PiAoTERfREFUQV9TSElGVCArIDIpKSk7CisgICAgY2xkID0KKyAgICAgICAgZml4TWF4KGNsZCwgKEZJWFBfREJMKSgoKEZJWFBfREJMKU1JTlZBTF9EQkwpID4+IChMRF9EQVRBX1NISUZUICsgMikpKTsKKyAgICBwQ2xkW2ldID0gY2xkIDw8IChMRF9EQVRBX1NISUZUICsgMik7CisgIH0KK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2FwcGx5VHRvQm94KAorICAgIEhBTkRMRV9UVE9fQk9YIGhUdG9Cb3gsIGNvbnN0IElOVCBuVGltZVNsb3RzLCBjb25zdCBJTlQgc3RhcnRUaW1lU2xvdCwKKyAgICBjb25zdCBJTlQgbkh5YnJpZEJhbmRzLCBjb25zdCBGSVhQX0RQSyAqY29uc3QgKmNvbnN0IHBwSHlicmlkRGF0YTFfX0ZESywKKyAgICBjb25zdCBGSVhQX0RQSyAqY29uc3QgKmNvbnN0IHBwSHlicmlkRGF0YTJfX0ZESywgU0NIQVIgKmNvbnN0IHBJY2NJZHgsCisgICAgVUNIQVIgKmNvbnN0IHBiSWNjUXVhbnRDb2Fyc2UsIFNDSEFSICpjb25zdCBwQ2xkSWR4LAorICAgIFVDSEFSICpjb25zdCBwYkNsZFF1YW50Q29hcnNlLCBjb25zdCBJTlQgYlVzZUJCQ3VlcywgSU5UICpzY2FsZUNoMSwKKyAgICBJTlQgKnNjYWxlQ2gyKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHBvd2VySHlicmlkRGF0YTFfX0ZESywgRklYUF9EQkwsIE1BWF9OVU1fUEFSQU1fQkFORFMpCisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChwb3dlckh5YnJpZERhdGEyX19GREssIEZJWFBfREJMLCBNQVhfTlVNX1BBUkFNX0JBTkRTKQorICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocHJvZEh5YnJpZERhdGFSZWFsX19GREssIEZJWFBfREJMLCBNQVhfTlVNX1BBUkFNX0JBTkRTKQorICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocHJvZEh5YnJpZERhdGFJbWFnX19GREssIEZJWFBfREJMLCBNQVhfTlVNX1BBUkFNX0JBTkRTKQorCisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChJY2NEb3dubWl4X19GREssIEZJWFBfREJMLCBNQVhfTlVNX1BBUkFNX0JBTkRTKQorICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoSWNjRG93bm1peFF1YW50X19GREssIEZJWFBfREJMLCBNQVhfTlVNX1BBUkFNX0JBTkRTKQorICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocGJTY2FsZUNoMSwgSU5ULCBNQVhfTlVNX1BBUkFNX0JBTkRTKQorICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocGJTY2FsZUNoMiwgSU5ULCBNQVhfTlVNX1BBUkFNX0JBTkRTKQorCisgIGlmICgoaFR0b0JveCA9PSBOVUxMKSB8fCAocENsZElkeCA9PSBOVUxMKSB8fCAocGJDbGRRdWFudENvYXJzZSA9PSBOVUxMKSB8fAorICAgICAgKHBwSHlicmlkRGF0YTFfX0ZESyA9PSBOVUxMKSB8fCAocHBIeWJyaWREYXRhMl9fRkRLID09IE5VTEwpIHx8CisgICAgICAocEljY0lkeCA9PSBOVUxMKSB8fCAocGJJY2NRdWFudENvYXJzZSA9PSBOVUxMKSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGludCBqLCBwYjsKKyAgICBjb25zdCBpbnQgblBhcmFtQmFuZHMgPSBoVHRvQm94LT5uUGFyYW1ldGVyQmFuZHM7CisgICAgY29uc3QgaW50IGJVc2VFYlEgPSAoaFR0b0JveC0+Ym94UXVhbnRNb2RlID09IEJPWF9RVUFOVE1PREVfRUJRMSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChoVHRvQm94LT5ib3hRdWFudE1vZGUgPT0gQk9YX1FVQU5UTU9ERV9FQlEyKTsKKworICAgIC8qIHNhbml0eSBjaGVjayAqLworICAgIGlmICgobkh5YnJpZEJhbmRzIDwgMCkgfHwgKG5IeWJyaWRCYW5kcyA+IGhUdG9Cb3gtPm5IeWJyaWRCYW5kc01heCkpIHsKKyAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGludCBvdXRTY2FsZTsgICAgLyogc2NhbGVmYWN0b3Igd2lsbCBub3QgYmUgZXZhbHVhdGVkICovCisgICAgaW50IGluU2NhbGUgPSA1OyAvKiBzY2FsZSBmYWN0b3IgZGV0ZXJtaW5lZCBlbXBpcmljYWxseSAqLworCisgICAgLyogY2FsY3VsYXRlIHRoZSBoZWFkcm9vbSBvZiB0aGUgaHlicmlkIGRhdGEgZm9yIGVhY2ggcGFyYW1ldGVyIGJhbmQgKi8KKyAgICBGREtjYWxjUGJTY2FsZUZhY3RvcihwcEh5YnJpZERhdGExX19GREssCisgICAgICAgICAgICAgICAgICAgICAgICAgaFR0b0JveC0+cFBhcmFtZXRlckJhbmQySHlicmlkQmFuZE9mZnNldCwgcGJTY2FsZUNoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWVTbG90LCBuVGltZVNsb3RzLCBuUGFyYW1CYW5kcyk7CisgICAgRkRLY2FsY1BiU2NhbGVGYWN0b3IocHBIeWJyaWREYXRhMl9fRkRLLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhUdG9Cb3gtPnBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXQsIHBiU2NhbGVDaDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lU2xvdCwgblRpbWVTbG90cywgblBhcmFtQmFuZHMpOworCisgICAgZm9yIChqID0gMCwgcGIgPSAwOyBwYiA8IG5QYXJhbUJhbmRzOyBwYisrKSB7CisgICAgICBGSVhQX0RCTCBkYXRhMSwgZGF0YTI7CisgICAgICBkYXRhMSA9IGRhdGEyID0gKEZJWFBfREJMKTA7CisgICAgICBmb3IgKDsgaiA8IGhUdG9Cb3gtPnBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXRbcGJdOyBqKyspIHsKKyAgICAgICAgZGF0YTEgKz0gc3VtVXBDcGx4UG93MkRpbTIocHBIeWJyaWREYXRhMV9fRkRLLCBTVU1fVVBfU1RBVElDX1NDQUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNjYWxlICsgcGJTY2FsZUNoMVtwYl0sICZvdXRTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lU2xvdCwgblRpbWVTbG90cywgaiwgaiArIDEpOworICAgICAgICBkYXRhMiArPSBzdW1VcENwbHhQb3cyRGltMihwcEh5YnJpZERhdGEyX19GREssIFNVTV9VUF9TVEFUSUNfU0NBTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2NhbGUgKyBwYlNjYWxlQ2gyW3BiXSwgJm91dFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWVTbG90LCBuVGltZVNsb3RzLCBqLCBqICsgMSk7CisgICAgICB9IC8qIGZvciBqICovCisgICAgICBwb3dlckh5YnJpZERhdGExX19GREtbcGJdID0gZGF0YTE7CisgICAgICBwb3dlckh5YnJpZERhdGEyX19GREtbcGJdID0gZGF0YTI7CisgICAgfSAvKiBwYiAqLworCisgICAgeworICAgICAgZm9yIChqID0gMCwgcGIgPSAwOyBwYiA8IG5QYXJhbUJhbmRzOyBwYisrKSB7CisgICAgICAgIEZJWFBfREJMIGRhdGFSZWFsLCBkYXRhSW1hZzsKKyAgICAgICAgZGF0YVJlYWwgPSBkYXRhSW1hZyA9IChGSVhQX0RCTCkwOworICAgICAgICBmb3IgKDsgaiA8IGhUdG9Cb3gtPnBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXRbcGJdOyBqKyspIHsKKyAgICAgICAgICBGSVhQX0RQSyBzY2FsYXJQcm9kOworICAgICAgICAgIGNwbHhfY3BseFNjYWxhclByb2R1Y3QoJnNjYWxhclByb2QsIHBwSHlicmlkRGF0YTFfX0ZESywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwSHlicmlkRGF0YTJfX0ZESywgaW5TY2FsZSArIHBiU2NhbGVDaDFbcGJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TY2FsZSArIHBiU2NhbGVDaDJbcGJdLCAmb3V0U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWVTbG90LCBuVGltZVNsb3RzLCBqLCBqICsgMSk7CisgICAgICAgICAgZGF0YVJlYWwgKz0gc2NhbGFyUHJvZC52LnJlOworICAgICAgICAgIGlmIChoVHRvQm94LT5wU3ViYmFuZEltYWdTaWduW2pdIDwgMCkgeworICAgICAgICAgICAgZGF0YUltYWcgLT0gc2NhbGFyUHJvZC52LmltOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhSW1hZyArPSBzY2FsYXJQcm9kLnYuaW07CisgICAgICAgICAgfQorICAgICAgICB9IC8qIGZvciBqICovCisgICAgICAgIHByb2RIeWJyaWREYXRhUmVhbF9fRkRLW3BiXSA9IGRhdGFSZWFsOworICAgICAgICBwcm9kSHlicmlkRGF0YUltYWdfX0ZES1twYl0gPSBkYXRhSW1hZzsKKyAgICAgIH0gLyogcGIgKi8KKworICAgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBjYWxjdWxhdGVJY2NGREsoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgblBhcmFtQmFuZHMsIGhUdG9Cb3gtPmljY0NvcnJlbGF0aW9uQ29oZXJlbmNlQm9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvd2VySHlicmlkRGF0YTFfX0ZESywgcG93ZXJIeWJyaWREYXRhMl9fRkRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2RIeWJyaWREYXRhUmVhbF9fRkRLLCBwcm9kSHlicmlkRGF0YUltYWdfX0ZESywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVHRvQm94LT5wSWNjX19GREspKSkgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisKKyAgICAgIC8qIGNhbGN1bGF0ZSBjb3JyZWxhdGlvbiBiYXNlZCBJY2MgZm9yIGRvd25taXggKi8KKyAgICAgIGlmIChTQUNFTkNfT0sgIT0gKGVycm9yID0gY2FsY3VsYXRlSWNjRkRLKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYXJhbUJhbmRzLCBuUGFyYW1CYW5kcywgcG93ZXJIeWJyaWREYXRhMV9fRkRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvd2VySHlicmlkRGF0YTJfX0ZESywgcHJvZEh5YnJpZERhdGFSZWFsX19GREssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZEh5YnJpZERhdGFJbWFnX19GREssIEljY0Rvd25taXhfX0ZESykpKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJVc2VFYlEpIHsKKyAgICAgIENhbGN1bGF0ZUNsZEZESyhoVHRvQm94LT5wQ2xkX19GREssIHBvd2VySHlicmlkRGF0YTFfX0ZESywKKyAgICAgICAgICAgICAgICAgICAgICBwb3dlckh5YnJpZERhdGEyX19GREssICpzY2FsZUNoMSArIGluU2NhbGUgKyAxLAorICAgICAgICAgICAgICAgICAgICAgIHBiU2NhbGVDaDEsICpzY2FsZUNoMiArIGluU2NhbGUgKyAxLCBwYlNjYWxlQ2gyLAorICAgICAgICAgICAgICAgICAgICAgIG5QYXJhbUJhbmRzKTsKKyAgICB9CisKKyAgICBpZiAoYlVzZUJCQ3VlcykgeworICAgICAgQXBwbHlCQkN1ZXNGREsoJmhUdG9Cb3gtPnBDbGRfX0ZES1swXSwgblBhcmFtQmFuZHMpOworCisgICAgICB7IEFwcGx5QkJDdWVzRkRLKCZoVHRvQm94LT5wSWNjX19GREtbMF0sIG5QYXJhbUJhbmRzKTsgfQorCisgICAgfSAvKiBiVXNlQkJDdWVzICovCisKKyAgICAvKiBxdWFudGl6ZS9kZS1xdWFudGl6ZSBpY2MgKi8KKyAgICB7CisgICAgICBRdWFudGl6ZUNvZWZGREsoaFR0b0JveC0+cEljY19fRkRLLCBuUGFyYW1CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICBoVHRvQm94LT5wSWNjUXVhbnRUYWJsZV9fRkRLLCBoVHRvQm94LT5uSWNjUXVhbnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgaFR0b0JveC0+bkljY1F1YW50U3RlcHMsIHBJY2NJZHgpOworICAgICAgUXVhbnRpemVDb2VmRkRLKEljY0Rvd25taXhfX0ZESywgblBhcmFtQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgaFR0b0JveC0+cEljY1F1YW50VGFibGVfX0ZESywgaFR0b0JveC0+bkljY1F1YW50T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGhUdG9Cb3gtPm5JY2NRdWFudFN0ZXBzLCBoVHRvQm94LT5wSWNjRG93bm1peElkeCk7CisgICAgICBkZVF1YW50aXplQ29lZkZESyhoVHRvQm94LT5wSWNjRG93bm1peElkeCwgblBhcmFtQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICBoVHRvQm94LT5wSWNjUXVhbnRUYWJsZV9fRkRLLCBoVHRvQm94LT5uSWNjUXVhbnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBJY2NEb3dubWl4UXVhbnRfX0ZESyk7CisKKyAgICAgICpwYkljY1F1YW50Q29hcnNlID0gaFR0b0JveC0+YlVzZUNvYXJzZVF1YW50SWNjOworICAgIH0KKworICAgIC8qIHF1YW50aXplL2RlLXF1YW50aXplIGNsZCAqLworICAgIGlmICghYlVzZUViUSkgeworICAgICAgUXVhbnRpemVDb2VmRkRLKGhUdG9Cb3gtPnBDbGRfX0ZESywgblBhcmFtQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgaFR0b0JveC0+cENsZFF1YW50VGFibGVFbmNfX0ZESywgaFR0b0JveC0+bkNsZFF1YW50T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGhUdG9Cb3gtPm5DbGRRdWFudFN0ZXBzLCBwQ2xkSWR4KTsKKyAgICAgIGRlUXVhbnRpemVDb2VmRkRLKHBDbGRJZHgsIG5QYXJhbUJhbmRzLCBoVHRvQm94LT5wQ2xkUXVhbnRUYWJsZURlY19fRkRLLAorICAgICAgICAgICAgICAgICAgICAgICAgaFR0b0JveC0+bkNsZFF1YW50T2Zmc2V0LCBoVHRvQm94LT5wQ2xkUXVhbnRfX0ZESyk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZES21lbWNweShwQ2xkSWR4LCBoVHRvQm94LT5wQ2xkRWJRSWR4LCBuUGFyYW1CYW5kcyAqIHNpemVvZihTQ0hBUikpOworICAgIH0KKyAgICAqcGJDbGRRdWFudENvYXJzZSA9IGhUdG9Cb3gtPmJVc2VDb2Fyc2VRdWFudENsZDsKKworICB9IC8qIHZhbGlkIGhhbmRsZSAqLworCitiYWlsOgorICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHBiU2NhbGVDaDIsIElOVCwgTUFYX05VTV9QQVJBTV9CQU5EUykKKyAgQ19BTExPQ19TQ1JBVENIX0VORChwYlNjYWxlQ2gxLCBJTlQsIE1BWF9OVU1fUEFSQU1fQkFORFMpCisgIENfQUxMT0NfU0NSQVRDSF9FTkQoSWNjRG93bm1peFF1YW50X19GREssIEZJWFBfREJMLCBNQVhfTlVNX1BBUkFNX0JBTkRTKQorICBDX0FMTE9DX1NDUkFUQ0hfRU5EKEljY0Rvd25taXhfX0ZESywgRklYUF9EQkwsIE1BWF9OVU1fUEFSQU1fQkFORFMpCisKKyAgQ19BTExPQ19TQ1JBVENIX0VORChwcm9kSHlicmlkRGF0YUltYWdfX0ZESywgRklYUF9EQkwsIE1BWF9OVU1fUEFSQU1fQkFORFMpCisgIENfQUxMT0NfU0NSQVRDSF9FTkQocHJvZEh5YnJpZERhdGFSZWFsX19GREssIEZJWFBfREJMLCBNQVhfTlVNX1BBUkFNX0JBTkRTKQorICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHBvd2VySHlicmlkRGF0YTJfX0ZESywgRklYUF9EQkwsIE1BWF9OVU1fUEFSQU1fQkFORFMpCisgIENfQUxMT0NfU0NSQVRDSF9FTkQocG93ZXJIeWJyaWREYXRhMV9fRkRLLCBGSVhQX0RCTCwgTUFYX05VTV9QQVJBTV9CQU5EUykKKworICByZXR1cm4gZXJyb3I7Cit9CisKK0lOVCBmZGtfc2FjZW5jX3N1YmJhbmQyUGFyYW1CYW5kKGNvbnN0IEJPWF9TVUJCQU5EX0NPTkZJRyBib3hTdWJiYW5kQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5TdWJiYW5kKSB7CisgIElOVCBuUGFyYW1CYW5kID0gLTE7CisgIGNvbnN0IFVDSEFSICpwU3ViYmFuZDJQYXJhbWV0ZXJJbmRleCA9CisgICAgICBnZXRTdWJiYW5kMlBhcmFtZXRlckluZGV4KGJveFN1YmJhbmRDb25maWcpOworCisgIGlmIChwU3ViYmFuZDJQYXJhbWV0ZXJJbmRleCAhPSBOVUxMKSB7CisgICAgY29uc3QgaW50IGh5YnJpZF9yZXNvbHV0aW9uID0gNjQ7CisKKyAgICBpZiAoKG5TdWJiYW5kID4gLTEpICYmIChuU3ViYmFuZCA8IGh5YnJpZF9yZXNvbHV0aW9uKSkgeworICAgICAgblBhcmFtQmFuZCA9IHBTdWJiYW5kMlBhcmFtZXRlckluZGV4W25TdWJiYW5kXTsKKyAgICB9CisgIH0KKworICByZXR1cm4gblBhcmFtQmFuZDsKK30KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX3BhcmFtZXh0cmFjdC5oIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfcGFyYW1leHRyYWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViYjkwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX3BhcmFtZXh0cmFjdC5oCkBAIC0wLDAgKzEsMjE0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNLiBNdWx0cnVzCisKKyAgIERlc2NyaXB0aW9uOiBQYXJhbWV0ZXIgRXh0cmFjdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNBQ0VOQ19QQVJBTUVYVFJBQ1RfSAorI2RlZmluZSBTQUNFTkNfUEFSQU1FWFRSQUNUX0gKKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKyNpbmNsdWRlICJzYWNlbmNfbGliLmgiCisjaW5jbHVkZSAic2FjZW5jX2NvbnN0LmgiCisjaW5jbHVkZSAic2FjZW5jX2JpdHN0cmVhbS5oIgorCisvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1BWF9DTERfUVVBTlRfRklORSAoMzEpCisjZGVmaW5lIE1BWF9DTERfUVVBTlRfQ09BUlNFICgxNSkKKyNkZWZpbmUgT0ZGU0VUX0NMRF9RVUFOVF9DT0FSU0UgKDcpCisjZGVmaW5lIE9GRlNFVF9DTERfUVVBTlRfRklORSAoMTUpCisKKyNkZWZpbmUgTUFYX0lDQ19RVUFOVF9DT0FSU0UgKDQpCisjZGVmaW5lIE1BWF9JQ0NfUVVBTlRfRklORSAoOCkKKyNkZWZpbmUgT0ZGU0VUX0lDQ19RVUFOVF9DT0FSU0UgKDApCisjZGVmaW5lIE9GRlNFVF9JQ0NfUVVBTlRfRklORSAoMCkKKworI2RlZmluZSBNQVhfTlVNX1BBUkFNX0JBTkRTICgyOCkKKworI2RlZmluZSBOVU1fTUFQUEVEX0hZQlJJRF9CQU5EUyAoMTYpCisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IFRfVFRPX0JPWCAqSEFORExFX1RUT19CT1g7CisKK3R5cGVkZWYgZW51bSB7CisgIEJPWF9TVUJCQU5EU19JTlZBTElEID0gMCwKKyAgQk9YX1NVQkJBTkRTXzQgPSA0LAorICBCT1hfU1VCQkFORFNfNSA9IDUsCisgIEJPWF9TVUJCQU5EU183ID0gNywKKyAgQk9YX1NVQkJBTkRTXzkgPSA5LAorICBCT1hfU1VCQkFORFNfMTIgPSAxMiwKKyAgQk9YX1NVQkJBTkRTXzE1ID0gMTUsCisgIEJPWF9TVUJCQU5EU18yMyA9IDIzCisKK30gQk9YX1NVQkJBTkRfQ09ORklHOworCit0eXBlZGVmIGVudW0geworICBCT1hfUVVBTlRNT0RFX0lOVkFMSUQgPSAtMSwKKyAgQk9YX1FVQU5UTU9ERV9GSU5FID0gMCwKKyAgQk9YX1FVQU5UTU9ERV9FQlExID0gMSwKKyAgQk9YX1FVQU5UTU9ERV9FQlEyID0gMiwKKyAgQk9YX1FVQU5UTU9ERV9SRVNFUlZFRDMgPSAzLAorICBCT1hfUVVBTlRNT0RFX1JFU0VSVkVENCA9IDQsCisgIEJPWF9RVUFOVE1PREVfUkVTRVJWRUQ1ID0gNSwKKyAgQk9YX1FVQU5UTU9ERV9SRVNFUlZFRDYgPSA2LAorICBCT1hfUVVBTlRNT0RFX1JFU0VSVkVENyA9IDcKKworfSBCT1hfUVVBTlRNT0RFOworCit0eXBlZGVmIHN0cnVjdCBUX1RUT19CT1hfQ09ORklHIHsKKyAgVUNIQVIgYlVzZUNvYXJzZVF1YW50Q2xkOworICBVQ0hBUiBiVXNlQ29hcnNlUXVhbnRJY2M7CisgIFVDSEFSIGJVc2VDb2hlcmVuY2VJY2NPbmx5OworCisgIEJPWF9TVUJCQU5EX0NPTkZJRyBzdWJiYW5kQ29uZmlnOworICBCT1hfUVVBTlRNT0RFIGJveFF1YW50TW9kZTsKKworICBVQ0hBUiBuSHlicmlkQmFuZHNNYXg7CisKKyAgVUNIQVIgYkZyYW1lS2VlcDsKKworfSBUVE9fQk9YX0NPTkZJRzsKKworLyogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfY3JlYXRlVHRvQm94KEhBTkRMRV9UVE9fQk9YICpoVHRvQm94KTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2luaXRUdG9Cb3goSEFORExFX1RUT19CT1ggaFR0b0JveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUT19CT1hfQ09ORklHICpjb25zdCB0dG9Cb3hDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcFBhcmFtZXRlckJhbmQySHlicmlkQmFuZE9mZnNldCk7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19kZXN0cm95VHRvQm94KEhBTkRMRV9UVE9fQk9YICpoVHRvQm94KTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX2FwcGx5VHRvQm94KAorICAgIEhBTkRMRV9UVE9fQk9YIGhUdG9Cb3gsIGNvbnN0IElOVCBuVGltZVNsb3RzLCBjb25zdCBJTlQgc3RhcnRUaW1lU2xvdCwKKyAgICBjb25zdCBJTlQgbkh5YnJpZEJhbmRzLCBjb25zdCBGSVhQX0RQSyAqY29uc3QgKmNvbnN0IHBwSHlicmlkRGF0YTFfX0ZESywKKyAgICBjb25zdCBGSVhQX0RQSyAqY29uc3QgKmNvbnN0IHBwSHlicmlkRGF0YTJfX0ZESywgU0NIQVIgKmNvbnN0IHBJY2NJZHgsCisgICAgVUNIQVIgKmNvbnN0IHBiSWNjUXVhbnRDb2Fyc2UsIFNDSEFSICpjb25zdCBwQ2xkSWR4LAorICAgIFVDSEFSICpjb25zdCBwYkNsZFF1YW50Q29hcnNlLCBjb25zdCBJTlQgYlVzZUJCQ3VlcywgSU5UICpzY2FsZUNoMCwKKyAgICBJTlQgKnNjYWxlQ2gxKTsKKworSU5UIGZka19zYWNlbmNfc3ViYmFuZDJQYXJhbUJhbmQoY29uc3QgQk9YX1NVQkJBTkRfQ09ORklHIGJveFN1YmJhbmRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgblN1YmJhbmQpOworCitjb25zdCBJTlQgKmZka19zYWNlbmNfZ2V0U3ViYmFuZEltYWdTaWduKCk7CisKK3ZvaWQgZmRrX3NhY2VuY19jYWxjUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0KAorICAgIGNvbnN0IEJPWF9TVUJCQU5EX0NPTkZJRyBzdWJiYW5kQ29uZmlnLCBjb25zdCBJTlQgbkh5YnJpZEJhbmRzLAorICAgIFVDSEFSICpwUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0KTsKKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSBVQ0hBUiBmZGtfc2FjZW5jX2dldENsZFF1YW50T2Zmc2V0KGNvbnN0IElOVCBiVXNlQ29hcnNlUXVhbnQpIHsKKyAgcmV0dXJuICgoYlVzZUNvYXJzZVF1YW50KSA/IE9GRlNFVF9DTERfUVVBTlRfQ09BUlNFIDogT0ZGU0VUX0NMRF9RVUFOVF9GSU5FKTsKK30KK3N0YXRpYyBpbmxpbmUgVUNIQVIgZmRrX3NhY2VuY19nZXRJY2NRdWFudE9mZnNldChjb25zdCBJTlQgYlVzZUNvYXJzZVF1YW50KSB7CisgIHJldHVybiAoKGJVc2VDb2Fyc2VRdWFudCkgPyBPRkZTRVRfSUNDX1FVQU5UX0NPQVJTRSA6IE9GRlNFVF9JQ0NfUVVBTlRfRklORSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgVUNIQVIgZmRrX3NhY2VuY19nZXROdW1iZXJDbGRRdWFudExldmVscygKKyAgICBjb25zdCBJTlQgYlVzZUNvYXJzZVF1YW50KSB7CisgIHJldHVybiAoKGJVc2VDb2Fyc2VRdWFudCkgPyBNQVhfQ0xEX1FVQU5UX0NPQVJTRSA6IE1BWF9DTERfUVVBTlRfRklORSk7Cit9CitzdGF0aWMgaW5saW5lIFVDSEFSIGZka19zYWNlbmNfZ2V0TnVtYmVySWNjUXVhbnRMZXZlbHMoCisgICAgY29uc3QgSU5UIGJVc2VDb2Fyc2VRdWFudCkgeworICByZXR1cm4gKChiVXNlQ29hcnNlUXVhbnQpID8gTUFYX0lDQ19RVUFOVF9DT0FSU0UgOiBNQVhfSUNDX1FVQU5UX0ZJTkUpOworfQorCisjZW5kaWYgLyogU0FDRU5DX1BBUkFNRVhUUkFDVF9IICovCmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY19zdGF0aWNnYWluLmNwcCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX3N0YXRpY2dhaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZjlmOGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNlbmMvc3JjL3NhY2VuY19zdGF0aWNnYWluLmNwcApAQCAtMCwwICsxLDQ0NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEdvZXR0bGluZ2VyCisKKyAgIERlc2NyaXB0aW9uOiBFbmNvZGVyIExpYnJhcnkgSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgZ2FpbiBtYW5hZ2VtZW50IG9mIHRoZSBlbmNvZGVyCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorXGZpbGUKK1RoaXMgZmlsZSBjb250YWlucyBhbGwgc3RhdGljIGdhaW4gaW5mcmFzdHJ1Y3R1cmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInNhY2VuY19zdGF0aWNnYWluLmgiCisKKy8qIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTVA0U1BBQ0VFTkNfRE1YX0dBSU5fREVGQVVMVCBTQUNFTkNfRE1YR0FJTl8zX2RCCisjZGVmaW5lIEdBSU5DRl9TRiAoNCkKKyNkZWZpbmUgR0FJTkNUMSh4KSBGTDJGWENPTlNUX0RCTCh4KQorI2RlZmluZSBHQUlOQ0YoeCkgRkwyRlhDT05TVF9EQkwoeCkKKworI2RlZmluZSBHQUlOQ1QyKHgpIEZMMkZYQ09OU1RfREJMKHgpCisjZGVmaW5lIEZYX0RCTDJGWF9HQUlOKHgpICh4KQorCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgU1RBVElDX0dBSU4geworICAvKiBFeHRlcm5hbCBDb25maWcgVmFsdWVzICovCisgIE1QNFNQQUNFRU5DX01PREUgZW5jTW9kZTsKKyAgTVA0U1BBQ0VFTkNfRE1YX0dBSU4gZml4ZWRHYWluRE1YOworICBJTlQgcHJlR2FpbkZhY3RvckRiOworCisgIC8qIEludGVybmFsIFZhbHVlcyAqLworICBGSVhQX0dBSU4gUG9zdEdhaW5fX0ZESzsKKyAgRklYUF9HQUlOIHBQcmVHYWluX19GREtbU0FDRU5DX01BWF9JTlBVVF9DSEFOTkVMU107Cit9OworCisvKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICAgcHJlR2FpbkZhY3RvclRhYmxlOgorCisgICBwcmUgY2FsY3VsYXRpb246IChmbG9hdClwb3coMTAuZiwoKChmbG9hdCkgeCkvMjAuZikpLyhmbG9hdCkoMTw8R0FJTkNGX1NGKSwgeAorICAgPSAtMjAgLi4uICsyMAorKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBwcmVHYWluRmFjdG9yVGFibGVfX0ZES1s0MV0gPSB7CisgICAgR0FJTkNGKDYuMjUwMDAwMDkzMWUtMDAzKSwgR0FJTkNGKDcuMDEyNjE1NDQ2MGUtMDAzKSwKKyAgICBHQUlOQ0YoNy44NjgyODM0MjgzZS0wMDMpLCBHQUlOQ0YoOC44MjgzNTk2NTYwZS0wMDMpLAorICAgIEdBSU5DRig5LjkwNTU4MjI5MzllLTAwMyksIEdBSU5DRigxLjExMTQyNDYyMTJlLTAwMiksCisgICAgR0FJTkNGKDEuMjQ3MDM4OTcxNmUtMDAyKSwgR0FJTkNGKDEuMzk5MjAwNjg5MGUtMDAyKSwKKyAgICBHQUlOQ0YoMS41Njk5Mjg5NzM5ZS0wMDIpLCBHQUlOQ0YoMS43NjE0ODkzNjE1ZS0wMDIpLAorICAgIEdBSU5DRigxLjk3NjQyMzUyNDNlLTAwMiksIEdBSU5DRigyLjIxNzU4MzczMDhlLTAwMiksCisgICAgR0FJTkNGKDIuNDg4MTY5ODE5MWUtMDAyKSwgR0FJTkNGKDIuNzkxNzcyNDEwM2UtMDAyKSwKKyAgICBHQUlOQ0YoMy4xMzI0MjAwMzMyZS0wMDIpLCBHQUlOQ0YoMy41MTQ2MzMzMjc3ZS0wMDIpLAorICAgIEdBSU5DRigzLjk0MzQ4MzUzMTVlLTAwMiksIEdBSU5DRig0LjQyNDY2MTAyNTRlLTAwMiksCisgICAgR0FJTkNGKDQuOTY0NTUxMzI5NmUtMDAyKSwgR0FJTkNGKDUuNTcwMzE4MTc3M2UtMDAyKSwKKyAgICBHQUlOQ0YoNi4yNTAwMDAwMDAwZS0wMDIpLCBHQUlOQ0YoNy4wMTI2MTUzNTI5ZS0wMDIpLAorICAgIEdBSU5DRig3Ljg2ODI4Mzk4NzBlLTAwMiksIEdBSU5DRig4LjgyODM1OTg0MjNlLTAwMiksCisgICAgR0FJTkNGKDkuOTA1NTgyNjY2NGUtMDAyKSwgR0FJTkNGKDEuMTExNDI0NjM5OGUtMDAxKSwKKyAgICBHQUlOQ0YoMS4yNDcwMzg5MTU4ZS0wMDEpLCBHQUlOQ0YoMS4zOTkyMDA3MDc3ZS0wMDEpLAorICAgIEdBSU5DRigxLjU2OTkyODk3MzllLTAwMSksIEdBSU5DRigxLjc2MTQ4OTM2MTVlLTAwMSksCisgICAgR0FJTkNGKDEuOTc2NDIzNTYxNmUtMDAxKSwgR0FJTkNGKDIuMjE3NTgzNjU2M2UtMDAxKSwKKyAgICBHQUlOQ0YoMi40ODgxNjk4MTkxZS0wMDEpLCBHQUlOQ0YoMi43OTE3NzI0ODQ4ZS0wMDEpLAorICAgIEdBSU5DRigzLjEzMjQyMDE4MjJlLTAwMSksIEdBSU5DRigzLjUxNDYzMzE3ODdlLTAwMSksCisgICAgR0FJTkNGKDMuOTQzNDgzNTMxNWUtMDAxKSwgR0FJTkNGKDQuNDI0NjYxMDk5OWUtMDAxKSwKKyAgICBHQUlOQ0YoNC45NjQ1NTEzMjk2ZS0wMDEpLCBHQUlOQ0YoNS41NzAzMTgxMDI4ZS0wMDEpLAorICAgIEdBSU5DRig2LjI1MDAwMDAwMDBlLTAwMSl9OworCitzdGF0aWMgY29uc3QgRklYUF9HQUlOIGRteEdhaW5UYWJsZV9fRkRLW10gPSB7CisgICAgLyogR0FJTkNUMigxLjApLCAqLyBHQUlOQ1QyKDAuODQwODk2NTBmKSwKKyAgICBHQUlOQ1QyKDAuNzA3MTA3MDZmKSwKKyAgICBHQUlOQ1QyKDAuNTk0NjAzODVmKSwKKyAgICBHQUlOQ1QyKDAuNTAwMDAwMDBmKSwKKyAgICBHQUlOQ1QyKDAuNDIwNDQ4MjVmKSwKKyAgICBHQUlOQ1QyKDAuMzUzNTUzNDFmKSwKKyAgICBHQUlOQ1QyKDAuMjUwMDAwMDBmKX07CisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmdW5jdGlvbm5hbWU6IGZka19zYWNlbmNfc3RhdGljR2Fpbl9PcGVuQ29uZmlnKCkKK2Rlc2NyaXB0aW9uOiAgb3BlbnMgYW5kIHNldHMgQ29uZmlnU3RydWN0IHRvIERlZmF1bHQgVmFsdWVzCityZXR1cm5zOiAgICAgIG5vRXJyb3Igb24gc3VjY2VzcywgYW4gYXByb3ByaWF0ZSBlcnJvciBjb2RlIGVsc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19zdGF0aWNHYWluX09wZW5Db25maWcoCisgICAgSEFORExFX1NUQVRJQ19HQUlOX0NPTkZJRyAqcGhTdGF0aWNHYWluQ29uZmlnKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKE5VTEwgPT0gcGhTdGF0aWNHYWluQ29uZmlnKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgLyogQWxsb2NhdGUgSW5zdGFuY2UgKi8KKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKCpwaFN0YXRpY0dhaW5Db25maWcsIDEsIHN0cnVjdCBTVEFUSUNfR0FJTl9DT05GSUcpOworICB9CisgIHJldHVybiBlcnJvcjsKKworYmFpbDoKKyAgZmRrX3NhY2VuY19zdGF0aWNHYWluX0Nsb3NlQ29uZmlnKHBoU3RhdGljR2FpbkNvbmZpZyk7CisgIHJldHVybiAoKFNBQ0VOQ19PSyA9PSBlcnJvcikgPyBTQUNFTkNfTUVNT1JZX0VSUk9SIDogZXJyb3IpOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfc3RhdGljR2Fpbl9Jbml0RGVmYXVsdENvbmZpZygKKyAgICBIQU5ETEVfU1RBVElDX0dBSU5fQ09ORklHIGhTdGF0aWNHYWluQ29uZmlnKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKE5VTEwgPT0gaFN0YXRpY0dhaW5Db25maWcpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICAvKiBOZWNlc3NhcnkgSW5wdXQgVmFyaWFibGVzICovCisgICAgaFN0YXRpY0dhaW5Db25maWctPmVuY01vZGUgPSBTQUNFTkNfSU5WQUxJRF9NT0RFOworCisgICAgLyogT3B0aW9uYWwgQ29uZmlncyBTZXQgdG8gRGVmYXVsdCBWYWx1ZXMgKi8KKyAgICBoU3RhdGljR2FpbkNvbmZpZy0+Zml4ZWRHYWluRE1YID0gTVA0U1BBQ0VFTkNfRE1YX0dBSU5fREVGQVVMVDsKKyAgICBoU3RhdGljR2FpbkNvbmZpZy0+cHJlR2FpbkZhY3RvckRiID0gMDsKKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Z1bmN0aW9ubmFtZTogZmRrX3NhY2VuY19zdGF0aWNHYWluX0Nsb3NlQ29uZmlnKCkKK2Rlc2NyaXB0aW9uOiAgZGVzdHJ1Y3RzIFN0YXRpYyBHYWluIENvbmZpZyBTdHJ1Y3R1cmUKK3JldHVybnM6ICAgICAgbm9FcnJvciBvbiBzdWNjZXNzLCBhbiBhcHJvcHJpYXRlIGVycm9yIGNvZGUgZWxzZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fQ2xvc2VDb25maWcoCisgICAgSEFORExFX1NUQVRJQ19HQUlOX0NPTkZJRyAqcGhTdGF0aWNHYWluQ29uZmlnKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKChwaFN0YXRpY0dhaW5Db25maWcgPT0gTlVMTCkgfHwgKCpwaFN0YXRpY0dhaW5Db25maWcgPT0gTlVMTCkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICBGREtmcmVlKCpwaFN0YXRpY0dhaW5Db25maWcpOworICAgICpwaFN0YXRpY0dhaW5Db25maWcgPSBOVUxMOworICB9CisgIHJldHVybiBlcnJvcjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZnVuY3Rpb25uYW1lOiBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fT3BlbigpCitkZXNjcmlwdGlvbjogIGluaXRpYWxpemVzIFN0YXRpYyBHYWlucworcmV0dXJuczogICAgICBub0Vycm9yIG9uIHN1Y2Nlc3MsIGFuIGFwcm9wcmlhdGUgZXJyb3IgY29kZSBlbHNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfc3RhdGljR2Fpbl9PcGVuKEhBTkRMRV9TVEFUSUNfR0FJTiAqcGhTdGF0aWNHYWluKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKE5VTEwgPT0gcGhTdGF0aWNHYWluKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgLyogQWxsb2NhdGUgSW5zdGFuY2UgKi8KKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKCpwaFN0YXRpY0dhaW4sIDEsIHN0cnVjdCBTVEFUSUNfR0FJTik7CisgIH0KKyAgcmV0dXJuIGVycm9yOworCitiYWlsOgorICByZXR1cm4gKChTQUNFTkNfT0sgPT0gZXJyb3IpID8gU0FDRU5DX01FTU9SWV9FUlJPUiA6IGVycm9yKTsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fSW5pdCgKKyAgICBIQU5ETEVfU1RBVElDX0dBSU4gaFN0YXRpY0dhaW4sCisgICAgY29uc3QgSEFORExFX1NUQVRJQ19HQUlOX0NPTkZJRyBoU3RhdGljR2FpbkNvbmZpZywgSU5UICpjb25zdCBzY2FsZSkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgoaFN0YXRpY0dhaW4gPT0gTlVMTCkgfHwgKGhTdGF0aWNHYWluQ29uZmlnID09IE5VTEwpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaFN0YXRpY0dhaW4tPmVuY01vZGUgPSBoU3RhdGljR2FpbkNvbmZpZy0+ZW5jTW9kZTsKKyAgICBoU3RhdGljR2Fpbi0+Zml4ZWRHYWluRE1YID0gaFN0YXRpY0dhaW5Db25maWctPmZpeGVkR2FpbkRNWDsKKyAgICBoU3RhdGljR2Fpbi0+cHJlR2FpbkZhY3RvckRiID0gaFN0YXRpY0dhaW5Db25maWctPnByZUdhaW5GYWN0b3JEYjsKKworICAgIGlmICgoaFN0YXRpY0dhaW4tPnByZUdhaW5GYWN0b3JEYiA8IC0yMCkgfHwKKyAgICAgICAgKGhTdGF0aWNHYWluLT5wcmVHYWluRmFjdG9yRGIgPiAyMCkpIHsKKyAgICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIEZJWFBfREJMIGZQcmVHYWluRmFjdG9yX19GREs7CisKKyAgICBpZiAoaFN0YXRpY0dhaW4tPnByZUdhaW5GYWN0b3JEYiA9PSAwKSB7CisgICAgICBmUHJlR2FpbkZhY3Rvcl9fRkRLID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CisgICAgICAqc2NhbGUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgczsKKyAgICAgIGZQcmVHYWluRmFjdG9yX19GREsgPQorICAgICAgICAgIHByZUdhaW5GYWN0b3JUYWJsZV9fRkRLW2hTdGF0aWNHYWluLT5wcmVHYWluRmFjdG9yRGIgKyAyMF07CisgICAgICBzID0gZml4TWF4KDAsIENudExlYWRpbmdaZXJvcyhmUHJlR2FpbkZhY3Rvcl9fRkRLKSAtIDEpOworICAgICAgZlByZUdhaW5GYWN0b3JfX0ZESyA9IGZQcmVHYWluRmFjdG9yX19GREsgPDwgKHMpOworICAgICAgKnNjYWxlID0gR0FJTkNGX1NGIC0gczsKKyAgICB9CisKKyAgICBpZiAoaFN0YXRpY0dhaW4tPmZpeGVkR2FpbkRNWCA9PSAwKQorICAgICAgaFN0YXRpY0dhaW4tPlBvc3RHYWluX19GREsgPSBNQVhWQUxfR0FJTjsKKyAgICBlbHNlCisgICAgICBoU3RhdGljR2Fpbi0+UG9zdEdhaW5fX0ZESyA9CisgICAgICAgICAgZG14R2FpblRhYmxlX19GREtbaFN0YXRpY0dhaW4tPmZpeGVkR2FpbkRNWCAtIDFdOworCisgICAgRkRLbWVtY2xlYXIoCisgICAgICAgIGhTdGF0aWNHYWluLT5wUHJlR2Fpbl9fRkRLLAorICAgICAgICBzaXplb2YoaFN0YXRpY0dhaW4tPnBQcmVHYWluX19GREspKTsgLyogemVybyBhbGwgaW5wdXQgY2hhbm5lbHMgKi8KKworICAgIC8qIENvbmZpZ3VyZSBQcmVHYWluLVZlY3RvciAqLworICAgIGlmIChoU3RhdGljR2Fpbi0+ZW5jTW9kZSA9PSBTQUNFTkNfMjEyKSB7CisgICAgICBoU3RhdGljR2Fpbi0+cFByZUdhaW5fX0ZES1swXSA9CisgICAgICAgICAgRlhfREJMMkZYX0dBSU4oZlByZUdhaW5GYWN0b3JfX0ZESyk7IC8qIEwgKi8KKyAgICAgIGhTdGF0aWNHYWluLT5wUHJlR2Fpbl9fRkRLWzFdID0KKyAgICAgICAgICBGWF9EQkwyRlhfR0FJTihmUHJlR2FpbkZhY3Rvcl9fRkRLKTsgLyogUiAqLworICAgIH0gZWxzZSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0NPTkZJRzsKKyAgICB9CisKKyAgfSAvKiB2YWxpZCBoYW5kbGUgKi8KKworYmFpbDoKKworICByZXR1cm4gZXJyb3I7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Z1bmN0aW9ubmFtZTogZmRrX3NhY2VuY19zdGF0aWNHYWluX0Nsb3NlKCkKK2Rlc2NyaXB0aW9uOiAgZGVzdHJ1Y3RzIFN0YXRpYyBHYWlucworcmV0dXJuczogICAgICBub0Vycm9yIG9uIHN1Y2Nlc3MsIGFuIGFwcm9wcmlhdGUgZXJyb3IgY29kZSBlbHNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfc3RhdGljR2Fpbl9DbG9zZShIQU5ETEVfU1RBVElDX0dBSU4gKnBoU3RhdGljR2FpbikgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmICgocGhTdGF0aWNHYWluID09IE5VTEwpIHx8ICgqcGhTdGF0aWNHYWluID09IE5VTEwpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgRkRLZnJlZSgqcGhTdGF0aWNHYWluKTsKKyAgICAqcGhTdGF0aWNHYWluID0gTlVMTDsKKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Z1bmN0aW9ubmFtZTogZmRrX3NhY2VuY19zdGF0aWNQb3N0R2Fpbl9BcHBseQorZGVzY3JpcHRpb246ICBtdWx0aXBseSB0aGUgT3V0cHV0IHNhbXBsZXMgd2l0aCB0aGUgUG9zdEdhaW4KK3JldHVybnM6ICAgICAgbm9FcnJvciBvbiBzdWNjZXNzLCBhbiBhcHJvcHJpYXRlIGVycm9yIGNvZGUgZWxzZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3N0YXRpY1Bvc3RHYWluX0FwcGx5RkRLKAorICAgIGNvbnN0IEhBTkRMRV9TVEFUSUNfR0FJTiBoU3RhdGljR2FpbiwgSU5UX1BDTSAqY29uc3QgcE91dHB1dFNhbXBsZXMsCisgICAgY29uc3QgSU5UIG5PdXRwdXRTYW1wbGVzLCBjb25zdCBJTlQgc2NhbGUpIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoTlVMTCA9PSBoU3RhdGljR2FpbikgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGludCBpOworICAgIEZJWFBfR0FJTiBwb3N0R2FpbiA9IGhTdGF0aWNHYWluLT5Qb3N0R2Fpbl9fRkRLOworCisgICAgaWYgKHNjYWxlIDwgMCkgeworICAgICAgaWYgKHBvc3RHYWluID09IE1BWFZBTF9HQUlOKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuT3V0cHV0U2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgcE91dHB1dFNhbXBsZXNbaV0gPSBwT3V0cHV0U2FtcGxlc1tpXSA+PiAoLXNjYWxlKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5PdXRwdXRTYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICBwT3V0cHV0U2FtcGxlc1tpXSA9IEZYX0RCTDJGWF9QQ00oCisgICAgICAgICAgICAgIGZNdWx0KHBvc3RHYWluLCBGWF9QQ00yRlhfREJMKHBPdXRwdXRTYW1wbGVzW2ldKSkgPj4gKC1zY2FsZSkpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChwb3N0R2FpbiA9PSBNQVhWQUxfR0FJTikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbk91dHB1dFNhbXBsZXM7IGkrKykgeworICAgICAgICAgIHBPdXRwdXRTYW1wbGVzW2ldID0gRlhfREJMMkZYX1BDTShTQVRVUkFURV9MRUZUX1NISUZUKAorICAgICAgICAgICAgICBGWF9QQ00yRlhfREJMKHBPdXRwdXRTYW1wbGVzW2ldKSwgc2NhbGUsIERGUkFDVF9CSVRTKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuT3V0cHV0U2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgcE91dHB1dFNhbXBsZXNbaV0gPSBGWF9EQkwyRlhfUENNKFNBVFVSQVRFX0xFRlRfU0hJRlQoCisgICAgICAgICAgICAgIGZNdWx0KHBvc3RHYWluLCBGWF9QQ00yRlhfREJMKHBPdXRwdXRTYW1wbGVzW2ldKSksIHNjYWxlLAorICAgICAgICAgICAgICBERlJBQ1RfQklUUykpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBlcnJvcjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZnVuY3Rpb25uYW1lOiBmZGtfc2FjZW5jX2dldFByZUdhaW5QdHIoKS8gZmRrX3NhY2VuY19nZXRQb3N0R2FpbigpCitkZXNjcmlwdGlvbjogIGdldCBHYWluLVBvaW50ZXJzIGZyb20gc3RydWN0CityZXR1cm5zOiAgICAgIFBvaW50ZXIgdG8gUHJlR2FpbiBvciBwb3N0R2FpbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworRklYUF9HQUlOICpmZGtfc2FjZW5jX2dldFByZUdhaW5QdHJGREsoSEFORExFX1NUQVRJQ19HQUlOIGhTdGF0aWNHYWluKSB7CisgIHJldHVybiAoKGhTdGF0aWNHYWluID09IE5VTEwpID8gTlVMTCA6IGhTdGF0aWNHYWluLT5wUHJlR2Fpbl9fRkRLKTsKK30KKworRklYUF9HQUlOIGZka19zYWNlbmNfZ2V0UG9zdEdhaW5GREsoSEFORExFX1NUQVRJQ19HQUlOIGhTdGF0aWNHYWluKSB7CisgIHJldHVybiAoaFN0YXRpY0dhaW4tPlBvc3RHYWluX19GREspOworfQorCisvKiBnZXQgZml4ZWQgZG93bm1peCBnYWluIGFuZCBtYXAgaXQgdG8gYml0c3RyZWFtIGVudW0gKi8KK0ZJWEVER0FJTkRNWENPTkZJRyBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fR2V0RG14R2FpbigKKyAgICBjb25zdCBIQU5ETEVfU1RBVElDX0dBSU4gaFN0YXRpY0dhaW4pIHsKKyAgRklYRURHQUlORE1YQ09ORklHIGRteEdhaW4gPSBGSVhFREdBSU5ETVhfSU5WQUxJRDsKKworICBzd2l0Y2ggKGhTdGF0aWNHYWluLT5maXhlZEdhaW5ETVgpIHsKKyAgICBjYXNlIDA6CisgICAgICBkbXhHYWluID0gRklYRURHQUlORE1YXzA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBkbXhHYWluID0gRklYRURHQUlORE1YXzE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBkbXhHYWluID0gRklYRURHQUlORE1YXzI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBkbXhHYWluID0gRklYRURHQUlORE1YXzM7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBkbXhHYWluID0gRklYRURHQUlORE1YXzQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBkbXhHYWluID0gRklYRURHQUlORE1YXzU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICBkbXhHYWluID0gRklYRURHQUlORE1YXzY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICBkbXhHYWluID0gRklYRURHQUlORE1YXzc7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZG14R2FpbiA9IEZJWEVER0FJTkRNWF9JTlZBTElEOworICB9CisgIHJldHVybiBkbXhHYWluOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfc3RhdGljR2Fpbl9TZXREbXhHYWluKAorICAgIEhBTkRMRV9TVEFUSUNfR0FJTl9DT05GSUcgaFN0YXRpY0dhaW5DZmcsCisgICAgY29uc3QgTVA0U1BBQ0VFTkNfRE1YX0dBSU4gZG14R2FpbikgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChOVUxMID09IGhTdGF0aWNHYWluQ2ZnKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaFN0YXRpY0dhaW5DZmctPmZpeGVkR2FpbkRNWCA9IGRteEdhaW47CisgIH0KKyAgcmV0dXJuIGVycm9yOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfc3RhdGljR2Fpbl9TZXRFbmNNb2RlKAorICAgIEhBTkRMRV9TVEFUSUNfR0FJTl9DT05GSUcgaFN0YXRpY0dhaW5DZmcsIGNvbnN0IE1QNFNQQUNFRU5DX01PREUgZW5jTW9kZSkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworCisgIGlmIChOVUxMID09IGhTdGF0aWNHYWluQ2ZnKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaFN0YXRpY0dhaW5DZmctPmVuY01vZGUgPSBlbmNNb2RlOworICB9CisgIHJldHVybiBlcnJvcjsKK30KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX3N0YXRpY2dhaW4uaCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX3N0YXRpY2dhaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGIzYmVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfc3RhdGljZ2Fpbi5oCkBAIC0wLDAgKzEsMTc3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBDaHJpc3RpYW4gR29ldHRsaW5nZXIKKworICAgRGVzY3JpcHRpb246IEVuY29kZXIgTGlicmFyeSBJbnRlcmZhYworICAgICAgICAgICAgICAgIGdhaW4gbWFuYWdlbWVudCBvZiB0aGUgZW5jb2RlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC8qKgorICAgXGZpbGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0FDRU5DX1NUQVRJQ0dBSU5fSAorI2RlZmluZSBTQUNFTkNfU1RBVElDR0FJTl9ICisKKy8qIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisjaW5jbHVkZSAic2FjZW5jX2xpYi5oIgorI2luY2x1ZGUgInNhY2VuY19jb25zdC5oIgorI2luY2x1ZGUgInNhY2VuY19iaXRzdHJlYW0uaCIKKworLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBGSVhQX0dBSU4gRklYUF9EQkwKKyNkZWZpbmUgTUFYVkFMX0dBSU4gKChGSVhQX0RCTClNQVhWQUxfREJMKQorCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgU1RBVElDX0dBSU5fQ09ORklHIHsKKyAgTVA0U1BBQ0VFTkNfTU9ERSBlbmNNb2RlOworICBNUDRTUEFDRUVOQ19ETVhfR0FJTiBmaXhlZEdhaW5ETVg7CisgIElOVCBwcmVHYWluRmFjdG9yRGI7Cit9OworCit0eXBlZGVmIHN0cnVjdCBTVEFUSUNfR0FJTl9DT05GSUcgKkhBTkRMRV9TVEFUSUNfR0FJTl9DT05GSUc7Cit0eXBlZGVmIHN0cnVjdCBTVEFUSUNfR0FJTiAqSEFORExFX1NUQVRJQ19HQUlOOworCisvKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5pdGlhbGl6ZXMgU3RhdGljIEdhaW4gQ29tcHV0YXRpb24gQ29uZmlnICovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfc3RhdGljR2Fpbl9PcGVuQ29uZmlnKAorICAgIEhBTkRMRV9TVEFUSUNfR0FJTl9DT05GSUcgKnBoU3RhdGljR2FpbkNvbmZpZyk7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19zdGF0aWNHYWluX0luaXREZWZhdWx0Q29uZmlnKAorICAgIEhBTkRMRV9TVEFUSUNfR0FJTl9DT05GSUcgaFN0YXRpY0dhaW5Db25maWcpOworCisvKiBEZWxldGVzIFN0YXRpYyBHYWluIENvbXB1dGF0aW9uIENvbmZpZyB+RGVzdHJ1Y3RvciAqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fQ2xvc2VDb25maWcoCisgICAgSEFORExFX1NUQVRJQ19HQUlOX0NPTkZJRyAqcGhTdGF0aWNHYWluQ29uZmlnKTsKKworLyogSW5pdGlhbGl6ZXMgU3RhdGljIEdhaW4gQ29tcHV0YXRpb24gfkNvbnN0cnVjdG9yICovCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfc3RhdGljR2Fpbl9PcGVuKEhBTkRMRV9TVEFUSUNfR0FJTiAqcGhTdGF0aWNHYWluKTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fSW5pdCgKKyAgICBIQU5ETEVfU1RBVElDX0dBSU4gaFN0YXRpY0dhaW4sCisgICAgY29uc3QgSEFORExFX1NUQVRJQ19HQUlOX0NPTkZJRyBoU3RhdGljR2FpbkNvbmZpZywgSU5UICpjb25zdCBzY2FsZSk7CisKKy8qIERlbGV0ZXMgU3RhdGljIEdhaW4gQ29tcHV0YXRpb24gSW5mcmFzdHVjdHVyZSB+RGVzdHJ1Y3RvciAqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fQ2xvc2UoSEFORExFX1NUQVRJQ19HQUlOICpwaFN0YXRpY0dhaW4pOworCisvKiBBcHBseSBQb3N0R2FpbiB0byB0aGUgb3V0cHV0IFBDTSBEb3dubWl4LVNpZ25hbCAqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3N0YXRpY1Bvc3RHYWluX0FwcGx5RkRLKAorICAgIGNvbnN0IEhBTkRMRV9TVEFUSUNfR0FJTiBoU3RhdGljR2FpbiwgSU5UX1BDTSAqY29uc3QgcE91dHB1dFNhbXBsZXMsCisgICAgY29uc3QgSU5UIG5PdXRwdXRTYW1wbGVzLCBjb25zdCBJTlQgc2NhbGUpOworCisvKiBHZXQgUG9pbnRlciB0byBQcmVHYWluLXZlY3RvciAqLworRklYUF9HQUlOICpmZGtfc2FjZW5jX2dldFByZUdhaW5QdHJGREsoSEFORExFX1NUQVRJQ19HQUlOIGhTdGF0aWNHYWluKTsKKworLyogR2V0IFBvaW50ZXIgdG8gUG9zdEdhaW4tY29lZiAqLworRklYUF9HQUlOIGZka19zYWNlbmNfZ2V0UG9zdEdhaW5GREsoSEFORExFX1NUQVRJQ19HQUlOIGhTdGF0aWNHYWluKTsKKworRklYRURHQUlORE1YQ09ORklHIGZka19zYWNlbmNfc3RhdGljR2Fpbl9HZXREbXhHYWluKAorICAgIGNvbnN0IEhBTkRMRV9TVEFUSUNfR0FJTiBoU3RhdGljR2Fpbik7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19zdGF0aWNHYWluX1NldERteEdhaW4oCisgICAgSEFORExFX1NUQVRJQ19HQUlOX0NPTkZJRyBoU3RhdGljR2FpbkNmZywKKyAgICBjb25zdCBNUDRTUEFDRUVOQ19ETVhfR0FJTiBkbXhHYWluKTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3N0YXRpY0dhaW5fU2V0RW5jTW9kZSgKKyAgICBIQU5ETEVfU1RBVElDX0dBSU5fQ09ORklHIGhTdGF0aWNHYWluQ2ZnLCBjb25zdCBNUDRTUEFDRUVOQ19NT0RFIGVuY01vZGUpOworCisjZW5kaWYgLyogU0FDRU5DX1NUQVRJQ0dBSU5fSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0FDZW5jL3NyYy9zYWNlbmNfdHJlZS5jcHAgYi9saWJTQUNlbmMvc3JjL3NhY2VuY190cmVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2QzMTI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfdHJlZS5jcHAKQEAgLTAsMCArMSw0ODggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1QRUcgc3Vycm91bmQgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1heCBOZXVlbmRvcmYKKworICAgRGVzY3JpcHRpb246IEVuY29kZXIgTGlicmFyeSBJbnRlcmZhY2UKKyAgICAgICAgICAgICAgICBUcmVlIFN0cnVjdHVyZSBmb3IgU3BhY2UgRW5jb2RlcgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAic2FjZW5jX3RyZWUuaCIKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorI2luY2x1ZGUgInNhY2VuY19jb25zdC5oIgorI2luY2x1ZGUgInNhY2VuY19wYXJhbWV4dHJhY3QuaCIKKyNpbmNsdWRlICJzYWNlbmNfZnJhbWV3aW5kb3dpbmcuaCIKKyNpbmNsdWRlICJGREtfbWF0cml4Q2FsbG9jLmgiCisKKy8qIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2VudW0geyBCT1hfMCA9IDAsIEJPWF8xID0gMSB9OworCitlbnVtIHsgQ0hfTCA9IDAsIENIX1IgPSAxIH07CisKK2VudW0geyBUVE9fQ0hfMCA9IDAsIFRUT19DSF8xID0gMSB9OworCitlbnVtIHsgV0lOX0lOQUNUSVYgPSAwLCBXSU5fQUNUSVYgPSAxIH07CisKK2VudW0geyBNQVhfS0VFUF9GUkFNRUNPVU5UID0gMTAwIH07CisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBTUEFDRV9UUkVFIHsKKyAgU1BBQ0VUUkVFX01PREUgbW9kZTsKKyAgU1BBQ0VfVFJFRV9ERVNDUklQVElPTiBkZXNjcjsKKyAgSEFORExFX1RUT19CT1ggdHRvQm94W1NBQ0VOQ19NQVhfTlVNX0JPWEVTXTsKKyAgVUNIQVIgblBhcmFtQmFuZHM7CisgIFVDSEFSIGJVc2VDb2Fyc2VRdWFudFR0b0ljYzsKKyAgVUNIQVIgYlVzZUNvYXJzZVF1YW50VHRvQ2xkOworICBRVUFOVE1PREUgcXVhbnRNb2RlOworICBJTlQgZnJhbWVDb3VudDsKKyAgVUNIQVIgYkZyYW1lS2VlcDsKKworICAvKiBJbnRlcm1lZGlhdGUgYnVmZmVycyAqLworICBVQ0hBUiBwQ2xkX3ByZXZbU0FDRU5DX01BWF9OVU1fQk9YRVNdW01BWF9OVU1fUEFSQU1fQkFORFNdOworICBVQ0hBUiBwSWNjX3ByZXZbU0FDRU5DX01BWF9OVU1fQk9YRVNdW01BWF9OVU1fUEFSQU1fQkFORFNdOworCisgIFVDSEFSIG5DaGFubmVsc0luTWF4OworICBVQ0hBUiBuSHlicmlkQmFuZHNNYXg7Cit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIGJveElkOworICBVQ0hBUiBpbkNoMTsKKyAgVUNIQVIgaW5DaDI7CisgIFVDSEFSIGluQ2gzOworICBVQ0hBUiBpbkNoNDsKKyAgVUNIQVIgd0NoMTsKKyAgVUNIQVIgd0NoMjsKKworfSBUVE9fREVTQ1JJUFRPUjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBTUEFDRVRSRUVfTU9ERSBtb2RlOworICBTUEFDRV9UUkVFX0RFU0NSSVBUSU9OIHRyZWVEZXNjcmlwdGlvbjsKKworfSBUUkVFX0NPTkZJRzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBTUEFDRVRSRUVfTU9ERSBtb2RlOworICBVQ0hBUiBuQ2hhbm5lbHNJbjsKKyAgVUNIQVIgbkNoYW5uZWxzT3V0OworICBVQ0hBUiBuVHRvQm94ZXM7CisgIFRUT19ERVNDUklQVE9SIHR0b19kZXNjcmlwdG9yWzFdOworCit9IFRSRUVfU0VUVVA7CisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBjb25zdCBUUkVFX0NPTkZJRyB0cmVlQ29uZmlnVGFibGVbXSA9IHsKKyAgICB7U1BBQ0VUUkVFX0lOVkFMSURfTU9ERSwgezAsIDAsIDB9fSwge1NQQUNFVFJFRV8yMTIsIHsxLCAxLCAyfX19OworCitzdGF0aWMgY29uc3QgVFJFRV9TRVRVUCB0cmVlU2V0dXBUYWJsZVtdID0geworICAgIHtTUEFDRVRSRUVfSU5WQUxJRF9NT0RFLCAwLCAwLCAwLCB7ezAsIDAsIDAsIDAsIDAsIDAsIDB9fX0sCisgICAge1NQQUNFVFJFRV8yMTIsCisgICAgIDIsCisgICAgIDEsCisgICAgIDEsCisgICAgIHt7Qk9YXzAsIENIX0wsIENIX1IsIFRUT19DSF8wLCBUVE9fQ0hfMSwgV0lOX0FDVElWLCBXSU5fQUNUSVZ9fX19OworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVmaW5pdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBGREtfU0FDRU5DX0VSUk9SIGdldFRyZWVDb25maWcoCisgICAgY29uc3QgU1BBQ0VUUkVFX01PREUgbW9kZSwgU1BBQ0VfVFJFRV9ERVNDUklQVElPTiAqcFRyZWVEZXNjcmlwdGlvbikgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX0lOSVRfRVJST1I7CisKKyAgaWYgKHBUcmVlRGVzY3JpcHRpb24gPT0gTlVMTCkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KShzaXplb2YodHJlZUNvbmZpZ1RhYmxlKSAvIHNpemVvZihUUkVFX0NPTkZJRykpOyBpKyspIHsKKyAgICAgIGlmICh0cmVlQ29uZmlnVGFibGVbaV0ubW9kZSA9PSBtb2RlKSB7CisgICAgICAgICpwVHJlZURlc2NyaXB0aW9uID0gdHJlZUNvbmZpZ1RhYmxlW2ldLnRyZWVEZXNjcmlwdGlvbjsKKyAgICAgICAgZXJyb3IgPSBTQUNFTkNfT0s7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSAvKiB2YWxpZCBoYW5kbGUgKi8KKyAgcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgY29uc3QgVFJFRV9TRVRVUCAqZ2V0VHJlZVNldHVwKGNvbnN0IFNQQUNFVFJFRV9NT0RFIG1vZGUpIHsKKyAgaW50IGk7CisgIGNvbnN0IFRSRUVfU0VUVVAgKnNldHVwID0gTlVMTDsKKworICBmb3IgKGkgPSAwOyBpIDwgKGludCkoc2l6ZW9mKHRyZWVTZXR1cFRhYmxlKSAvIHNpemVvZihUUkVFX1NFVFVQKSk7IGkrKykgeworICAgIGlmICh0cmVlU2V0dXBUYWJsZVtpXS5tb2RlID09IG1vZGUpIHsKKyAgICAgIHNldHVwID0gJnRyZWVTZXR1cFRhYmxlW2ldOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBzZXR1cDsKK30KKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3NwYWNlVHJlZV9PcGVuKEhBTkRMRV9TUEFDRV9UUkVFICpwaFNwYWNlVHJlZSkgeworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworICBIQU5ETEVfU1BBQ0VfVFJFRSBoU3BhY2VUcmVlID0gTlVMTDsKKworICBpZiAoTlVMTCA9PSBwaFNwYWNlVHJlZSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfSEFORExFOworICB9IGVsc2UgeworICAgIGludCBib3g7CisKKyAgICBGREtfQUxMT0NBVEVfTUVNT1JZXzFEKGhTcGFjZVRyZWUsIDEsIHN0cnVjdCBTUEFDRV9UUkVFKTsKKworICAgIGZvciAoYm94ID0gMDsgYm94IDwgU0FDRU5DX01BWF9OVU1fQk9YRVM7IGJveCsrKSB7CisgICAgICBIQU5ETEVfVFRPX0JPWCB0dG9Cb3ggPSBOVUxMOworICAgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBmZGtfc2FjZW5jX2NyZWF0ZVR0b0JveCgmdHRvQm94KSkpIHsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorICAgICAgaWYgKE5VTEwgIT0gaFNwYWNlVHJlZSkgeworICAgICAgICBoU3BhY2VUcmVlLT50dG9Cb3hbYm94XSA9IHR0b0JveDsKKyAgICAgIH0KKyAgICB9CisgICAgKnBoU3BhY2VUcmVlID0gaFNwYWNlVHJlZTsKKyAgfQorICByZXR1cm4gZXJyb3I7CisKK2JhaWw6CisgIGZka19zYWNlbmNfc3BhY2VUcmVlX0Nsb3NlKCZoU3BhY2VUcmVlKTsKKyAgcmV0dXJuICgoU0FDRU5DX09LID09IGVycm9yKSA/IFNBQ0VOQ19NRU1PUllfRVJST1IgOiBlcnJvcik7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19zcGFjZVRyZWVfSW5pdCgKKyAgICBIQU5ETEVfU1BBQ0VfVFJFRSBoU1QsIGNvbnN0IFNQQUNFX1RSRUVfU0VUVVAgKmNvbnN0IGhTZXR1cCwKKyAgICBVQ0hBUiAqcFBhcmFtZXRlckJhbmQySHlicmlkQmFuZE9mZnNldCwgY29uc3QgSU5UIGJGcmFtZUtlZXApIHsKKyAgRkRLX1NBQ0VOQ19FUlJPUiBlcnJvciA9IFNBQ0VOQ19PSzsKKworICBpZiAoKGhTVCA9PSBOVUxMKSB8fCAoaFNldHVwID09IE5VTEwpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaW50IGJUdG9Cb3hGcm9udEJhY2tDb21iaW5bU0FDRU5DX01BWF9OVU1fQk9YRVNdID0gezB9OworICAgIGludCBib3ggPSAwOworCisgICAgaFNULT5mcmFtZUNvdW50ID0gMDsKKyAgICBoU1QtPmJGcmFtZUtlZXAgPSBiRnJhbWVLZWVwOworCisgICAgLyogSW5pdCAqLworICAgIGhTVC0+bW9kZSA9IGhTZXR1cC0+bW9kZTsKKyAgICBoU1QtPm5QYXJhbUJhbmRzID0gaFNldHVwLT5uUGFyYW1CYW5kczsKKyAgICBoU1QtPmJVc2VDb2Fyc2VRdWFudFR0b0ljYyA9IGhTZXR1cC0+YlVzZUNvYXJzZVF1YW50VHRvSWNjOworICAgIGhTVC0+YlVzZUNvYXJzZVF1YW50VHRvQ2xkID0gaFNldHVwLT5iVXNlQ29hcnNlUXVhbnRUdG9DbGQ7CisgICAgaFNULT5xdWFudE1vZGUgPSBoU2V0dXAtPnF1YW50TW9kZTsKKyAgICBoU1QtPm5DaGFubmVsc0luTWF4ID0gaFNldHVwLT5uQ2hhbm5lbHNJbk1heDsKKyAgICBoU1QtPm5IeWJyaWRCYW5kc01heCA9IGhTZXR1cC0+bkh5YnJpZEJhbmRzTWF4OworCisgICAgaWYgKFNBQ0VOQ19PSyAhPSAoZXJyb3IgPSBnZXRUcmVlQ29uZmlnKGhTVC0+bW9kZSwgJmhTVC0+ZGVzY3IpKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIHN3aXRjaCAoaFNULT5tb2RlKSB7CisgICAgICBjYXNlIFNQQUNFVFJFRV8yMTI6CisgICAgICAgIGJUdG9Cb3hGcm9udEJhY2tDb21iaW5bQk9YXzBdID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNQQUNFVFJFRV9JTlZBTElEX01PREU6CisgICAgICBkZWZhdWx0OgorICAgICAgICBlcnJvciA9IFNBQ0VOQ19JTklUX0VSUk9SOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfSAvKiBzd2l0Y2ggKGhTVC0+bW9kZSkgKi8KKworICAgIGlmIChoU1QtPmRlc2NyLm5PdHRCb3hlcyA+IFNBQ0VOQ19NQVhfTlVNX0JPWEVTKSB7CisgICAgICBlcnJvciA9IFNBQ0VOQ19JTklUX0VSUk9SOworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGZvciAoYm94ID0gMDsgYm94IDwgaFNULT5kZXNjci5uT3R0Qm94ZXM7IGJveCsrKSB7CisgICAgICBUVE9fQk9YX0NPTkZJRyBib3hDb25maWc7CisgICAgICBib3hDb25maWcuc3ViYmFuZENvbmZpZyA9IChCT1hfU1VCQkFORF9DT05GSUcpaFNULT5uUGFyYW1CYW5kczsKKyAgICAgIGJveENvbmZpZy5iVXNlQ29hcnNlUXVhbnRDbGQgPSBoU1QtPmJVc2VDb2Fyc2VRdWFudFR0b0NsZDsKKyAgICAgIGJveENvbmZpZy5iVXNlQ29hcnNlUXVhbnRJY2MgPSBoU1QtPmJVc2VDb2Fyc2VRdWFudFR0b0ljYzsKKyAgICAgIGJveENvbmZpZy5iVXNlQ29oZXJlbmNlSWNjT25seSA9IGJUdG9Cb3hGcm9udEJhY2tDb21iaW5bYm94XTsKKyAgICAgIGJveENvbmZpZy5ib3hRdWFudE1vZGUgPSAoQk9YX1FVQU5UTU9ERSloU1QtPnF1YW50TW9kZTsKKyAgICAgIGJveENvbmZpZy5uSHlicmlkQmFuZHNNYXggPSBoU1QtPm5IeWJyaWRCYW5kc01heDsKKyAgICAgIGJveENvbmZpZy5iRnJhbWVLZWVwID0gaFNULT5iRnJhbWVLZWVwOworCisgICAgICBpZiAoU0FDRU5DX09LICE9CisgICAgICAgICAgKGVycm9yID0gZmRrX3NhY2VuY19pbml0VHRvQm94KGhTVC0+dHRvQm94W2JveF0sICZib3hDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXQpKSkgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfSAvKiBmb3IgYm94ICovCisKKyAgfSAvKiB2YWxpZCBoYW5kbGUgKi8KKworYmFpbDoKKyAgcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBTcGFjZVRyZWVfRnJhbWVLZWVwMjEyKGNvbnN0IEhBTkRMRV9TUEFDRV9UUkVFIGhTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BBVElBTEZSQU1FICpjb25zdCBoU1RPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBhdm9pZF9rZWVwKSB7CisgIGludCBwYjsKKworICBpZiAoYXZvaWRfa2VlcCA9PSAwKSB7CisgICAgaWYgKGhTVC0+ZnJhbWVDb3VudCAlIDIgPT0gMCkgeworICAgICAgZm9yIChwYiA9IDA7IHBiIDwgaFNULT5uUGFyYW1CYW5kczsgcGIrKykgeworICAgICAgICBoU1QtPnBJY2NfcHJldltCT1hfMF1bcGJdID0gaFNUT3V0LT5vdHREYXRhLmljY1tCT1hfMF1bMF1bcGJdOworICAgICAgICBoU1RPdXQtPm90dERhdGEuY2xkW0JPWF8wXVswXVtwYl0gPSBoU1QtPnBDbGRfcHJldltCT1hfMF1bcGJdOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKHBiID0gMDsgcGIgPCBoU1QtPm5QYXJhbUJhbmRzOyBwYisrKSB7CisgICAgICAgIGhTVE91dC0+b3R0RGF0YS5pY2NbQk9YXzBdWzBdW3BiXSA9IGhTVC0+cEljY19wcmV2W0JPWF8wXVtwYl07CisgICAgICAgIGhTVC0+cENsZF9wcmV2W0JPWF8wXVtwYl0gPSBoU1RPdXQtPm90dERhdGEuY2xkW0JPWF8wXVswXVtwYl07CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAocGIgPSAwOyBwYiA8IGhTVC0+blBhcmFtQmFuZHM7IHBiKyspIHsKKyAgICAgIGhTVC0+cEljY19wcmV2W0JPWF8wXVtwYl0gPSBoU1RPdXQtPm90dERhdGEuaWNjW0JPWF8wXVswXVtwYl07CisgICAgICBoU1QtPnBDbGRfcHJldltCT1hfMF1bcGJdID0gaFNUT3V0LT5vdHREYXRhLmNsZFtCT1hfMF1bMF1bcGJdOworICAgIH0KKyAgfQorICBoU1QtPmZyYW1lQ291bnQrKzsKKyAgaWYgKGhTVC0+ZnJhbWVDb3VudCA9PSBNQVhfS0VFUF9GUkFNRUNPVU5UKSB7CisgICAgaFNULT5mcmFtZUNvdW50ID0gMDsKKyAgfQorfQorCitzdGF0aWMgRkRLX1NBQ0VOQ19FUlJPUiBTcGFjZVRyZWVfRnJhbWVLZWVwKGNvbnN0IEhBTkRMRV9TUEFDRV9UUkVFIGhTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BBVElBTEZSQU1FICpjb25zdCBoU1RPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBhdm9pZF9rZWVwKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgc3dpdGNoIChoU1QtPm1vZGUpIHsKKyAgICBjYXNlIFNQQUNFVFJFRV8yMTI6CisgICAgICBTcGFjZVRyZWVfRnJhbWVLZWVwMjEyKGhTVCwgaFNUT3V0LCBhdm9pZF9rZWVwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1BBQ0VUUkVFX0lOVkFMSURfTU9ERToKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19zcGFjZVRyZWVfQXBwbHkoCisgICAgSEFORExFX1NQQUNFX1RSRUUgaFNULCBjb25zdCBJTlQgcGFyYW1TZXQsIGNvbnN0IElOVCBuQ2hhbm5lbHNJbiwKKyAgICBjb25zdCBJTlQgblRpbWVTbG90cywgY29uc3QgSU5UIHN0YXJ0VGltZVNsb3QsIGNvbnN0IElOVCBuSHlicmlkQmFuZHMsCisgICAgRklYUF9XSU4gKnBGcmFtZVdpbmRvd0FuYV9fRkRLLAorICAgIEZJWFBfRFBLICpjb25zdCAqY29uc3QgKmNvbnN0IHBwcEh5YnJpZF9fRkRLLAorICAgIEZJWFBfRFBLICpjb25zdCAqY29uc3QgKmNvbnN0IHBwcEh5YnJpZEluX19GREssIFNQQVRJQUxGUkFNRSAqY29uc3QgaFNUT3V0LAorICAgIGNvbnN0IElOVCBhdm9pZF9rZWVwLCBJTlQgKnBFbmNvZGVySW5wdXRDaFNjYWxlKSB7CisgIC8qKiBcdmVyYmF0aW0KKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBUUkVFXzIxMgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fCisgICAgICAgIEwgLS0gVFRPX0NIXzAgLS18ICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgVFRPXzAgfC0tIFRUT19DSF8wCisgICAgICAgIFIgLS0gVFRPX0NIXzEgLS18X19fX19fX3wKKworICBcZW5kdmVyYmF0aW0gKi8KKworICBGREtfU0FDRU5DX0VSUk9SIGVycm9yID0gU0FDRU5DX09LOworICBpbnQgazsKKyAgY29uc3QgVFJFRV9TRVRVUCAqdHJlZVNldHVwID0gTlVMTDsKKworICBpZiAoKGhTVCA9PSBOVUxMKSB8fCAoaFNUT3V0ID09IE5VTEwpIHx8IChwcHBIeWJyaWRfX0ZESyA9PSBOVUxMKSB8fAorICAgICAgKHBwcEh5YnJpZEluX19GREsgPT0gTlVMTCkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICBpZiAoKHRyZWVTZXR1cCA9IGdldFRyZWVTZXR1cChoU1QtPm1vZGUpKSA9PSBOVUxMKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9DT05GSUc7CisgICAgZ290byBiYWlsOworICB9CisKKyAgLyogU2FuaXR5IENoZWNrcyAqLworICBpZiAoKG5DaGFubmVsc0luICE9IHRyZWVTZXR1cC0+bkNoYW5uZWxzSW4pIHx8CisgICAgICAobkNoYW5uZWxzSW4gPiBoU1QtPm5DaGFubmVsc0luTWF4KSB8fAorICAgICAgKG5IeWJyaWRCYW5kcyA+IGhTVC0+bkh5YnJpZEJhbmRzTWF4KSkgeworICAgIGVycm9yID0gU0FDRU5DX0lOVkFMSURfQ09ORklHOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIEFwcGx5IGFsbCBUVE8gYm94ZXMuICovCisgIGZvciAoayA9IDA7IGsgPCB0cmVlU2V0dXAtPm5UdG9Cb3hlczsgaysrKSB7CisgICAgY29uc3QgVFRPX0RFU0NSSVBUT1IgKnBUVE8gPSAmdHJlZVNldHVwLT50dG9fZGVzY3JpcHRvcltrXTsKKworICAgIGludCBpLCBpbkNoWzJdLCBvdXRDaFsyXSwgd2luWzJdOworCisgICAgaW5DaFswXSA9IHBUVE8tPmluQ2gxOworICAgIG91dENoWzBdID0gcFRUTy0+aW5DaDM7CisgICAgd2luWzBdID0gcFRUTy0+d0NoMTsKKyAgICBpbkNoWzFdID0gcFRUTy0+aW5DaDI7CisgICAgb3V0Q2hbMV0gPSBwVFRPLT5pbkNoNDsKKyAgICB3aW5bMV0gPSBwVFRPLT53Q2gyOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgaWYgKHdpbltpXSA9PSBXSU5fQUNUSVYpIHsKKyAgICAgICAgZmRrX3NhY2VuY19hbmFseXNpc1dpbmRvd2luZygKKyAgICAgICAgICAgIG5UaW1lU2xvdHMsIHN0YXJ0VGltZVNsb3QsIHBGcmFtZVdpbmRvd0FuYV9fRkRLLAorICAgICAgICAgICAgcHBwSHlicmlkX19GREtbaW5DaFtpXV0sIHBwcEh5YnJpZEluX19GREtbb3V0Q2hbaV1dLCBuSHlicmlkQmFuZHMsCisgICAgICAgICAgICBGV19MRUFWRV9ESU0pOworICAgICAgfQorICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSBvdXRwdXQgZG93bm1peCB3aXRoaW4gbGFzdCBUVE8gYm94LCBpZiBubyBUVFQgYm94IGlzIGFwcGxpZWQuCisgICAgICovCisgICAgaWYgKFNBQ0VOQ19PSyAhPQorICAgICAgICAoZXJyb3IgPSBmZGtfc2FjZW5jX2FwcGx5VHRvQm94KAorICAgICAgICAgICAgIGhTVC0+dHRvQm94W3BUVE8tPmJveElkXSwgblRpbWVTbG90cywgc3RhcnRUaW1lU2xvdCwgbkh5YnJpZEJhbmRzLAorICAgICAgICAgICAgIHBwcEh5YnJpZEluX19GREtbcFRUTy0+aW5DaDNdLCBwcHBIeWJyaWRJbl9fRkRLW3BUVE8tPmluQ2g0XSwKKyAgICAgICAgICAgICBoU1RPdXQtPm90dERhdGEuaWNjW3BUVE8tPmJveElkXVtwYXJhbVNldF0sCisgICAgICAgICAgICAgJihoU1RPdXQtPklDQ0xvc3NsZXNzRGF0YS5ic1F1YW50Q29hcnNlWFhYW3BUVE8tPmJveElkXVtwYXJhbVNldF0pLAorICAgICAgICAgICAgIGhTVE91dC0+b3R0RGF0YS5jbGRbcFRUTy0+Ym94SWRdW3BhcmFtU2V0XSwKKyAgICAgICAgICAgICAmKGhTVE91dC0+Q0xETG9zc2xlc3NEYXRhLmJzUXVhbnRDb2Fyc2VYWFhbcFRUTy0+Ym94SWRdW3BhcmFtU2V0XSksCisgICAgICAgICAgICAgaFNUT3V0LT5iVXNlQkJDdWVzLCAmcEVuY29kZXJJbnB1dENoU2NhbGVbaW5DaFswXV0sCisgICAgICAgICAgICAgJnBFbmNvZGVySW5wdXRDaFNjYWxlW2luQ2hbMV1dKSkpIHsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgIH0KKworICBpZiAoaFNULT5iRnJhbWVLZWVwID09IDEpIHsKKyAgICBpZiAoU0FDRU5DX09LICE9IChlcnJvciA9IFNwYWNlVHJlZV9GcmFtZUtlZXAoaFNULCBoU1RPdXQsIGF2b2lkX2tlZXApKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfQorCitiYWlsOgorICByZXR1cm4gZXJyb3I7Cit9CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19zcGFjZVRyZWVfQ2xvc2UoSEFORExFX1NQQUNFX1RSRUUgKnBoU3BhY2VUcmVlKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKChwaFNwYWNlVHJlZSA9PSBOVUxMKSB8fCAoKnBoU3BhY2VUcmVlID09IE5VTEwpKSB7CisgICAgZXJyb3IgPSBTQUNFTkNfSU5WQUxJRF9IQU5ETEU7CisgIH0gZWxzZSB7CisgICAgaW50IGJveDsKKyAgICBIQU5ETEVfU1BBQ0VfVFJFRSBjb25zdCBoU1QgPSAqcGhTcGFjZVRyZWU7CisKKyAgICAvKiBmb3IgKGJveCA9IDA7IGJveCA8IGhTVC0+ZGVzY3Iubk90dEJveGVzOyArK2JveCkgeyAqLworICAgIGZvciAoYm94ID0gMDsgYm94IDwgU0FDRU5DX01BWF9OVU1fQk9YRVM7ICsrYm94KSB7CisgICAgICBpZiAoU0FDRU5DX09LICE9IChlcnJvciA9IGZka19zYWNlbmNfZGVzdHJveVR0b0JveCgmaFNULT50dG9Cb3hbYm94XSkpKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBGREtmcmVlKCpwaFNwYWNlVHJlZSk7CisgICAgKnBoU3BhY2VUcmVlID0gTlVMTDsKKyAgfQorYmFpbDoKKyAgcmV0dXJuIGVycm9yOworfQorCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfc3BhY2VUcmVlX0dldERlc2NyaXB0aW9uKAorICAgIGNvbnN0IEhBTkRMRV9TUEFDRV9UUkVFIGhTcGFjZVRyZWUsCisgICAgU1BBQ0VfVFJFRV9ERVNDUklQVElPTiAqcFNwYWNlVHJlZURlc2NyaXB0aW9uKSB7CisgIEZES19TQUNFTkNfRVJST1IgZXJyb3IgPSBTQUNFTkNfT0s7CisKKyAgaWYgKChoU3BhY2VUcmVlID09IE5VTEwpIHx8IChwU3BhY2VUcmVlRGVzY3JpcHRpb24gPT0gTlVMTCkpIHsKKyAgICBlcnJvciA9IFNBQ0VOQ19JTlZBTElEX0hBTkRMRTsKKyAgfSBlbHNlIHsKKyAgICAqcFNwYWNlVHJlZURlc2NyaXB0aW9uID0gaFNwYWNlVHJlZS0+ZGVzY3I7CisgIH0KKyAgcmV0dXJuIGVycm9yOworfQorCitJTlQgZmRrX3NhY2VuY19zcGFjZVRyZWVfSHlicmlkMlBhcmFtQmFuZChjb25zdCBJTlQgblBhcmFtQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkh5YnJpZEJhbmQpIHsKKyAgcmV0dXJuIGZka19zYWNlbmNfc3ViYmFuZDJQYXJhbUJhbmQoKEJPWF9TVUJCQU5EX0NPTkZJRyluUGFyYW1CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkh5YnJpZEJhbmQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX3RyZWUuaCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX3RyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWY1YjJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfdHJlZS5oCkBAIC0wLDAgKzEsMTY4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNUEVHIHN1cnJvdW5kIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBNYXggTmV1ZW5kb3JmCisKKyAgIERlc2NyaXB0aW9uOiBFbmNvZGVyIExpYnJhcnkgSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgVHJlZSBTdHJ1Y3R1cmUgZm9yIFNwYWNlIEVuY29kZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTQUNFTkNfVFJFRV9ICisjZGVmaW5lIFNBQ0VOQ19UUkVFX0gKKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInNhY2VuY19mcmFtZXdpbmRvd2luZy5oIgorI2luY2x1ZGUgInNhY2VuY19saWIuaCIKKyNpbmNsdWRlICJzYWNlbmNfYml0c3RyZWFtLmgiCisKKy8qIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKyAgU1BBQ0VUUkVFX0lOVkFMSURfTU9ERSA9IDAsCisgIFNQQUNFVFJFRV8yMTIgPSA4CisKK30gU1BBQ0VUUkVFX01PREU7CisKK3R5cGVkZWYgc3RydWN0IFNQQUNFX1RSRUUgKkhBTkRMRV9TUEFDRV9UUkVFOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIG5QYXJhbUJhbmRzOworICBVQ0hBUiBiVXNlQ29hcnNlUXVhbnRUdG9DbGQ7CisgIFVDSEFSIGJVc2VDb2Fyc2VRdWFudFR0b0ljYzsKKyAgUVVBTlRNT0RFIHF1YW50TW9kZTsKKyAgU1BBQ0VUUkVFX01PREUgbW9kZTsKKworICBVQ0hBUiBuQ2hhbm5lbHNJbk1heDsKKyAgVUNIQVIgbkh5YnJpZEJhbmRzTWF4OworCit9IFNQQUNFX1RSRUVfU0VUVVA7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgbk90dEJveGVzOworICBVQ0hBUiBuSW5DaGFubmVsczsKKyAgVUNIQVIgbk91dENoYW5uZWxzOworCit9IFNQQUNFX1RSRUVfREVTQ1JJUFRJT047CisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3NwYWNlVHJlZV9PcGVuKEhBTkRMRV9TUEFDRV9UUkVFICpwaFNwYWNlVHJlZSk7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19zcGFjZVRyZWVfSW5pdCgKKyAgICBIQU5ETEVfU1BBQ0VfVFJFRSBoU1QsIGNvbnN0IFNQQUNFX1RSRUVfU0VUVVAgKmNvbnN0IGhTZXR1cCwKKyAgICBVQ0hBUiAqcFBhcmFtZXRlckJhbmQySHlicmlkQmFuZE9mZnNldCwgY29uc3QgSU5UIGJGcmFtZUtlZXApOworCitGREtfU0FDRU5DX0VSUk9SIGZka19zYWNlbmNfc3BhY2VUcmVlX0FwcGx5KAorICAgIEhBTkRMRV9TUEFDRV9UUkVFIGhTVCwgY29uc3QgSU5UIHBhcmFtU2V0LCBjb25zdCBJTlQgbkNoYW5uZWxzSW4sCisgICAgY29uc3QgSU5UIG5UaW1lU2xvdHMsIGNvbnN0IElOVCBzdGFydFRpbWVTbG90LCBjb25zdCBJTlQgbkh5YnJpZEJhbmRzLAorICAgIEZJWFBfV0lOICpwRnJhbWVXaW5kb3dBbmFfX0ZESywKKyAgICBGSVhQX0RQSyAqY29uc3QgKmNvbnN0ICpjb25zdCBwcHBIeWJyaWRfX0ZESywKKyAgICBGSVhQX0RQSyAqY29uc3QgKmNvbnN0ICpjb25zdCBwcHBIeWJyaWRJbl9fRkRLLCBTUEFUSUFMRlJBTUUgKmNvbnN0IGhTVE91dCwKKyAgICBjb25zdCBJTlQgYXZvaWRfa2VlcCwgSU5UICpwRW5jb2RlcklucHV0Q2hTY2FsZSk7CisKK0ZES19TQUNFTkNfRVJST1IgZmRrX3NhY2VuY19zcGFjZVRyZWVfQ2xvc2UoSEFORExFX1NQQUNFX1RSRUUgKnBoU3BhY2VUcmVlKTsKKworRkRLX1NBQ0VOQ19FUlJPUiBmZGtfc2FjZW5jX3NwYWNlVHJlZV9HZXREZXNjcmlwdGlvbigKKyAgICBjb25zdCBIQU5ETEVfU1BBQ0VfVFJFRSBoU3BhY2VUcmVlLAorICAgIFNQQUNFX1RSRUVfREVTQ1JJUFRJT04gKnBTcGFjZVRyZWVEZXNjcmlwdGlvbik7CisKK0lOVCBmZGtfc2FjZW5jX3NwYWNlVHJlZV9IeWJyaWQyUGFyYW1CYW5kKGNvbnN0IElOVCBuUGFyYW1CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuSHlicmlkQmFuZCk7CisKKyNlbmRpZiAvKiBTQUNFTkNfVFJFRV9IICovCmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY192ZWN0b3JmdW5jdGlvbnMuY3BwIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfdmVjdG9yZnVuY3Rpb25zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWUyNGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliU0FDZW5jL3NyYy9zYWNlbmNfdmVjdG9yZnVuY3Rpb25zLmNwcApAQCAtMCwwICsxLDQ1MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKKyAgIERlc2NyaXB0aW9uOiBFbmNvZGVyIExpYnJhcnkgSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgdmVjdG9yIGZ1bmN0aW9ucworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1xmaWxlCitUaGlzIGZpbGUgY29udGFpbnMgdmVjdG9yIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAic2FjZW5jX3ZlY3RvcmZ1bmN0aW9ucy5oIgorCisvKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGdW5jdGlvbiAvIENsYXNzIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVmaW5pdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworRklYUF9EQkwgc3VtVXBDcGx4UG93Mihjb25zdCBGSVhQX0RQSyAqY29uc3QgeCwgY29uc3QgSU5UIHNjYWxlTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGluU2NhbGVGYWN0b3IsIElOVCAqY29uc3Qgb3V0U2NhbGVGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuKSB7CisgIGludCBpLCBjczsKKworICBpZiAoc2NhbGVNb2RlID09IFNVTV9VUF9EWU5BTUlDX1NDQUxFKSB7CisgICAgLyogY2FsY3VsYXRlIGhlYWRyb29tICovCisgICAgRklYUF9EQkwgbWF4VmFsID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgbWF4VmFsIHw9IGZBYnMoeFtpXS52LnJlKTsKKyAgICAgIG1heFZhbCB8PSBmQWJzKHhbaV0udi5pbSk7CisgICAgfQorICAgIGNzID0gaW5TY2FsZUZhY3RvciAtIGZpeE1heCgwLCBDbnRMZWFkaW5nWmVyb3MobWF4VmFsKSAtIDEpOworICB9IGVsc2UgeworICAgIGNzID0gaW5TY2FsZUZhY3RvcjsKKyAgfQorCisgIC8qIGNvbnNpZGVyIHNjYWxpbmcgb2YgZW5lcmd5IGFuZCBzY2FsaW5nIGluIGZQb3cyRGl2MiBhbmQgYWRkaXRpb24gKi8KKyAgKm91dFNjYWxlRmFjdG9yID0gMiAqIGNzICsgMjsKKworICAvKiBtYWtlIHN1cmUgdGhhdCB0aGUgc2NhbGVmYWN0b3IgaXMgaW4gdGhlIHJhbmdlIG9mIC0oREZSQUNUX0JJVFMtMSksIC4uLiAsCisgICAqIChERlJBQ1RfQklUUy0xKSAqLworICBjcyA9IGZpeE1heChmaXhNaW4oY3MsIERGUkFDVF9CSVRTIC0gMSksIC0oREZSQUNUX0JJVFMgLSAxKSk7CisKKyAgLyogc3VtIHVwIGNvbXBsZXggZW5lcmd5IHNhbXBsZXMgKi8KKyAgRklYUF9EQkwgcmUsIGltLCBzdW07CisKKyAgcmUgPSBpbSA9IHN1bSA9IEZMMkZYQ09OU1RfREJMKDAuMCk7CisgIGlmIChjcyA8IDApIHsKKyAgICBjcyA9IC1jczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICByZSArPSBmUG93MkRpdjIoeFtpXS52LnJlIDw8IGNzKTsKKyAgICAgIGltICs9IGZQb3cyRGl2Mih4W2ldLnYuaW0gPDwgY3MpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjcyA9IDIgKiBjczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICByZSArPSBmUG93MkRpdjIoeFtpXS52LnJlKSA+PiBjczsKKyAgICAgIGltICs9IGZQb3cyRGl2Mih4W2ldLnYuaW0pID4+IGNzOworICAgIH0KKyAgfQorCisgIHN1bSA9IChyZSA+PiAxKSArIChpbSA+PiAxKTsKKworICByZXR1cm4gKHN1bSk7Cit9CisKK0ZJWFBfREJMIHN1bVVwQ3BseFBvdzJEaW0yKGNvbnN0IEZJWFBfRFBLICpjb25zdCAqY29uc3QgeCwgY29uc3QgSU5UIHNjYWxlTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpblNjYWxlRmFjdG9yLCBJTlQgKmNvbnN0IG91dFNjYWxlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNEaW0xLCBjb25zdCBJTlQgbkRpbTEsIGNvbnN0IElOVCBzRGltMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuRGltMikgeworICBpbnQgaSwgaiwgY3M7CisKKyAgaWYgKHNjYWxlTW9kZSA9PSBTVU1fVVBfRFlOQU1JQ19TQ0FMRSkgeworICAgIC8qIGNhbGN1bGF0ZSBoZWFkcm9vbSAqLworICAgIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgIGZvciAoaSA9IHNEaW0xOyBpIDwgbkRpbTE7IGkrKykgeworICAgICAgZm9yIChqID0gc0RpbTI7IGogPCBuRGltMjsgaisrKSB7CisgICAgICAgIG1heFZhbCB8PSBmQWJzKHhbaV1bal0udi5yZSk7CisgICAgICAgIG1heFZhbCB8PSBmQWJzKHhbaV1bal0udi5pbSk7CisgICAgICB9CisgICAgfQorICAgIGNzID0gaW5TY2FsZUZhY3RvciAtIGZpeE1heCgwLCBDbnRMZWFkaW5nWmVyb3MobWF4VmFsKSAtIDEpOworICB9IGVsc2UgeworICAgIGNzID0gaW5TY2FsZUZhY3RvcjsKKyAgfQorCisgIC8qIGNvbnNpZGVyIHNjYWxpbmcgb2YgZW5lcmd5IGFuZCBzY2FsaW5nIGluIGZQb3cyRGl2MiBhbmQgYWRkaXRpb24gKi8KKyAgKm91dFNjYWxlRmFjdG9yID0gMiAqIGNzICsgMjsKKworICAvKiBtYWtlIHN1cmUgdGhhdCB0aGUgc2NhbGVmYWN0b3IgaXMgaW4gdGhlIHJhbmdlIG9mIC0oREZSQUNUX0JJVFMtMSksIC4uLiAsCisgICAqIChERlJBQ1RfQklUUy0xKSAqLworICBjcyA9IGZpeE1heChmaXhNaW4oY3MsIERGUkFDVF9CSVRTIC0gMSksIC0oREZSQUNUX0JJVFMgLSAxKSk7CisKKyAgLyogc3VtIHVwIGNvbXBsZXggZW5lcmd5IHNhbXBsZXMgKi8KKyAgRklYUF9EQkwgcmUsIGltLCBzdW07CisKKyAgcmUgPSBpbSA9IHN1bSA9IEZMMkZYQ09OU1RfREJMKDAuMCk7CisgIGlmIChjcyA8IDApIHsKKyAgICBjcyA9IC1jczsKKyAgICBmb3IgKGkgPSBzRGltMTsgaSA8IG5EaW0xOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IHNEaW0yOyBqIDwgbkRpbTI7IGorKykgeworICAgICAgICByZSArPSBmUG93MkRpdjIoeFtpXVtqXS52LnJlIDw8IGNzKTsKKyAgICAgICAgaW0gKz0gZlBvdzJEaXYyKHhbaV1bal0udi5pbSA8PCBjcyk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGNzID0gMiAqIGNzOworICAgIGZvciAoaSA9IHNEaW0xOyBpIDwgbkRpbTE7IGkrKykgeworICAgICAgZm9yIChqID0gc0RpbTI7IGogPCBuRGltMjsgaisrKSB7CisgICAgICAgIHJlICs9IGZQb3cyRGl2Mih4W2ldW2pdLnYucmUpID4+IGNzOworICAgICAgICBpbSArPSBmUG93MkRpdjIoeFtpXVtqXS52LmltKSA+PiBjczsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdW0gPSAocmUgPj4gMSkgKyAoaW0gPj4gMSk7CisKKyAgcmV0dXJuIChzdW0pOworfQorCit2b2lkIGNvcHlDcGx4VmVjKEZJWFBfRFBLICpjb25zdCBaLCBjb25zdCBGSVhQX0RQSyAqY29uc3QgWCwgY29uc3QgSU5UIG4pIHsKKyAgRkRLbWVtbW92ZShaLCBYLCBzaXplb2YoRklYUF9EUEspICogbik7Cit9CisKK3ZvaWQgc2V0Q3BseFZlYyhGSVhQX0RQSyAqY29uc3QgWiwgY29uc3QgRklYUF9EQkwgYSwgY29uc3QgSU5UIG4pIHsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIFpbaV0udi5yZSA9IGE7CisgICAgWltpXS52LmltID0gYTsKKyAgfQorfQorCit2b2lkIGNwbHhfY3BseFNjYWxhclByb2R1Y3QoRklYUF9EUEsgKmNvbnN0IFosIGNvbnN0IEZJWFBfRFBLICpjb25zdCAqY29uc3QgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RQSyAqY29uc3QgKmNvbnN0IFksIGNvbnN0IElOVCBzY2FsZVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNjYWxlWSwgSU5UICpjb25zdCBzY2FsZVosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNEaW0xLCBjb25zdCBJTlQgbkRpbTEsIGNvbnN0IElOVCBzRGltMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbkRpbTIpIHsKKyAgaW50IGksIGosIHN4LCBzeTsKKyAgRklYUF9EQkwgeHJlLCB5cmUsIHhpbSwgeWltLCByZSwgaW07CisKKyAgLyogbWFrZSBzdXJlIHRoYXQgdGhlIHNjYWxlZmFjdG9yIGlzIGluIHRoZSByYW5nZSBvZiAtKERGUkFDVF9CSVRTLTEpLCAuLi4gLAorICAgKiAoREZSQUNUX0JJVFMtMSkgKi8KKyAgc3ggPSBmaXhNYXgoZml4TWluKHNjYWxlWCwgREZSQUNUX0JJVFMgLSAxKSwgLShERlJBQ1RfQklUUyAtIDEpKTsKKyAgc3kgPSBmaXhNYXgoZml4TWluKHNjYWxlWSwgREZSQUNUX0JJVFMgLSAxKSwgLShERlJBQ1RfQklUUyAtIDEpKTsKKworICAvKiBjb25zaWRlciBzY2FsaW5nIG9mIGVuZXJneSBhbmQgc2NhbGluZyBpbiBmTXVsdERpdjIgYW5kIHNoaWZ0IG9mIHJlc3VsdAorICAgKiB2YWx1ZXMgKi8KKyAgKnNjYWxlWiA9IHN4ICsgc3kgKyAyOworCisgIHJlID0gKEZJWFBfREJMKTA7CisgIGltID0gKEZJWFBfREJMKTA7CisgIGlmICgoc3ggPCAwKSAmJiAoc3kgPCAwKSkgeworICAgIHN4ID0gLXN4OworICAgIHN5ID0gLXN5OworICAgIGZvciAoaSA9IHNEaW0xOyBpIDwgbkRpbTE7IGkrKykgeworICAgICAgZm9yIChqID0gc0RpbTI7IGogPCBuRGltMjsgaisrKSB7CisgICAgICAgIHhyZSA9IFhbaV1bal0udi5yZSA8PCBzeDsKKyAgICAgICAgeGltID0gWFtpXVtqXS52LmltIDw8IHN4OworICAgICAgICB5cmUgPSBZW2ldW2pdLnYucmUgPDwgc3k7CisgICAgICAgIHlpbSA9IFlbaV1bal0udi5pbSA8PCBzeTsKKyAgICAgICAgcmUgKz0gZk11bHREaXYyKHhyZSwgeXJlKSArIGZNdWx0RGl2Mih4aW0sIHlpbSk7CisgICAgICAgIGltICs9IGZNdWx0RGl2Mih4aW0sIHlyZSkgLSBmTXVsdERpdjIoeHJlLCB5aW0pOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICgoc3ggPj0gMCkgJiYgKHN5ID49IDApKSB7CisgICAgZm9yIChpID0gc0RpbTE7IGkgPCBuRGltMTsgaSsrKSB7CisgICAgICBmb3IgKGogPSBzRGltMjsgaiA8IG5EaW0yOyBqKyspIHsKKyAgICAgICAgeHJlID0gWFtpXVtqXS52LnJlOworICAgICAgICB4aW0gPSBYW2ldW2pdLnYuaW07CisgICAgICAgIHlyZSA9IFlbaV1bal0udi5yZTsKKyAgICAgICAgeWltID0gWVtpXVtqXS52LmltOworICAgICAgICByZSArPSAoZk11bHREaXYyKHhyZSwgeXJlKSArIGZNdWx0RGl2Mih4aW0sIHlpbSkpID4+IChzeCArIHN5KTsKKyAgICAgICAgaW0gKz0gKGZNdWx0RGl2Mih4aW0sIHlyZSkgLSBmTXVsdERpdjIoeHJlLCB5aW0pKSA+PiAoc3ggKyBzeSk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKChzeCA8IDApICYmIChzeSA+PSAwKSkgeworICAgIHN4ID0gLXN4OworICAgIGZvciAoaSA9IHNEaW0xOyBpIDwgbkRpbTE7IGkrKykgeworICAgICAgZm9yIChqID0gc0RpbTI7IGogPCBuRGltMjsgaisrKSB7CisgICAgICAgIHhyZSA9IFhbaV1bal0udi5yZSA8PCBzeDsKKyAgICAgICAgeGltID0gWFtpXVtqXS52LmltIDw8IHN4OworICAgICAgICB5cmUgPSBZW2ldW2pdLnYucmU7CisgICAgICAgIHlpbSA9IFlbaV1bal0udi5pbTsKKyAgICAgICAgcmUgKz0gKGZNdWx0RGl2Mih4cmUsIHlyZSkgKyBmTXVsdERpdjIoeGltLCB5aW0pKSA+PiBzeTsKKyAgICAgICAgaW0gKz0gKGZNdWx0RGl2Mih4aW0sIHlyZSkgLSBmTXVsdERpdjIoeHJlLCB5aW0pKSA+PiBzeTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3kgPSAtc3k7CisgICAgZm9yIChpID0gc0RpbTE7IGkgPCBuRGltMTsgaSsrKSB7CisgICAgICBmb3IgKGogPSBzRGltMjsgaiA8IG5EaW0yOyBqKyspIHsKKyAgICAgICAgeHJlID0gWFtpXVtqXS52LnJlOworICAgICAgICB4aW0gPSBYW2ldW2pdLnYuaW07CisgICAgICAgIHlyZSA9IFlbaV1bal0udi5yZSA8PCBzeTsKKyAgICAgICAgeWltID0gWVtpXVtqXS52LmltIDw8IHN5OworICAgICAgICByZSArPSAoZk11bHREaXYyKHhyZSwgeXJlKSArIGZNdWx0RGl2Mih4aW0sIHlpbSkpID4+IHN4OworICAgICAgICBpbSArPSAoZk11bHREaXYyKHhpbSwgeXJlKSAtIGZNdWx0RGl2Mih4cmUsIHlpbSkpID4+IHN4OworICAgICAgfQorICAgIH0KKyAgfQorCisgIFotPnYucmUgPSByZSA+PiAxOworICBaLT52LmltID0gaW0gPj4gMTsKK30KKwordm9pZCBGREtjYWxjQ29ycmVsYXRpb25WZWMoRklYUF9EQkwgKmNvbnN0IHosIGNvbnN0IEZJWFBfREJMICpjb25zdCBwcjEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0IHAxLCBjb25zdCBGSVhQX0RCTCAqY29uc3QgcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbikgeworICBpbnQgaSwgczsKKyAgRklYUF9EQkwgcDEyLCBjb3I7CisKKyAgLyogY29ycmVsYXRpb24gKi8KKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIHAxMiA9IGZNdWx0KHAxW2ldLCBwMltpXSk7CisgICAgaWYgKHAxMiA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICBwMTIgPSBpbnZTcXJ0Tm9ybTIocDEyLCAmcyk7CisgICAgICBjb3IgPSBmTXVsdChwcjEyW2ldLCBwMTIpOworICAgICAgeltpXSA9IFNBVFVSQVRFX0xFRlRfU0hJRlQoY29yLCBzLCBERlJBQ1RfQklUUyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHpbaV0gPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKyAgICB9CisgIH0KK30KKwordm9pZCBjYWxjQ29oZXJlbmNlVmVjKEZJWFBfREJMICpjb25zdCB6LCBjb25zdCBGSVhQX0RCTCAqY29uc3QgcDEyciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgcDEyaSwgY29uc3QgRklYUF9EQkwgKmNvbnN0IHAxLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBwMiwgY29uc3QgSU5UIHNjYWxlUDEyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzY2FsZVAsIGNvbnN0IElOVCBuKSB7CisgIGludCBpLCBzLCBzMSwgczI7CisgIEZJWFBfREJMIGNvaCwgcDEyLCBwMTJyaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgczIgPSBmaXhNaW4oZml4TWF4KDAsIENvdW50TGVhZGluZ0JpdHMocDEycltpXSkgLSAxKSwKKyAgICAgICAgICAgICAgICBmaXhNYXgoMCwgQ291bnRMZWFkaW5nQml0cyhwMTJpW2ldKSAtIDEpKTsKKyAgICBwMTJyaSA9IHNxcnRGaXhwKGZQb3cyRGl2MihwMTJyW2ldIDw8IHMyKSArIGZQb3cyRGl2MihwMTJpW2ldIDw8IHMyKSk7CisgICAgczEgPSBmaXhNaW4oZml4TWF4KDAsIENvdW50TGVhZGluZ0JpdHMocDFbaV0pIC0gMSksCisgICAgICAgICAgICAgICAgZml4TWF4KDAsIENvdW50TGVhZGluZ0JpdHMocDJbaV0pIC0gMSkpOworICAgIHAxMiA9IGZNdWx0RGl2MihwMVtpXSA8PCBzMSwgcDJbaV0gPDwgczEpOworCisgICAgaWYgKHAxMiA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICBwMTIgPSBpbnZTcXJ0Tm9ybTIocDEyLCAmcyk7CisgICAgICBjb2ggPSBmTXVsdChwMTJyaSwgcDEyKTsKKyAgICAgIHMgPSBmaXhNYXgoZml4TWluKChzY2FsZVAxMiAtIHNjYWxlUCArIHMgKyBzMSAtIHMyKSwgREZSQUNUX0JJVFMgLSAxKSwKKyAgICAgICAgICAgICAgICAgLShERlJBQ1RfQklUUyAtIDEpKTsKKyAgICAgIGlmIChzIDwgMCkgeworICAgICAgICB6W2ldID0gY29oID4+ICgtcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICB6W2ldID0gU0FUVVJBVEVfTEVGVF9TSElGVChjb2gsIHMsIERGUkFDVF9CSVRTKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgeltpXSA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICAgIH0KKyAgfQorfQorCit2b2lkIGFkZFdlaWdodGVkQ3BseFZlYyhGSVhQX0RQSyAqY29uc3QgKmNvbnN0IFosIGNvbnN0IEZJWFBfREJMICpjb25zdCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EUEsgKmNvbnN0ICpjb25zdCBYLCBjb25zdCBGSVhQX0RCTCAqY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfRFBLICpjb25zdCAqY29uc3QgWSwgY29uc3QgSU5UIHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpjb25zdCBzY2FsZUNoMSwgY29uc3QgSU5UIHNjYWxlQ2gyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKmNvbnN0IHBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgblBhcmFtZXRlckJhbmRzLCBjb25zdCBJTlQgblRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzdGFydFRpbWVTbG90KSB7CisgIGludCBwYiwgaiwgaTsKKyAgaW50IGNzLCBzMSwgczI7CisKKyAgLyogZGV0ZXJtaW5lIG1heGltdW0gc2NhbGUgb2YgYm90aCBjaGFubmVscyAqLworICBjcyA9IGZpeE1heCgqc2NhbGVDaDEsIHNjYWxlQ2gyKTsKKyAgczEgPSBjcyAtICgqc2NhbGVDaDEpOworICBzMiA9IGNzIC0gc2NhbGVDaDI7CisKKyAgLyogc2NhbGVmYWN0b3IgMSBpcyB1cGRhdGVkIHdpdGggY29tbW9uIHNjYWxlIG9mIGNoYW5uZWwgMSBhbmQgY2hhbm5lbDIgKi8KKyAgKnNjYWxlQ2gxID0gY3M7CisKKyAgLyogc2NhbGUgb2YgYSBhbmQgYjsgYWRkaXRpb25hbCBzY2FsZSBmb3IgZk11bHREaXYyKCkgKi8KKyAgZm9yIChqID0gMCwgcGIgPSAwOyBwYiA8IG5QYXJhbWV0ZXJCYW5kczsgcGIrKykgeworICAgIEZJWFBfREJMIGFQYiwgYlBiOworICAgIGFQYiA9IGFbcGJdLCBiUGIgPSBiW3BiXTsKKyAgICBmb3IgKDsgaiA8IHBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXRbcGJdOyBqKyspIHsKKyAgICAgIGZvciAoaSA9IHN0YXJ0VGltZVNsb3Q7IGkgPCBuVGltZVNsb3RzOyBpKyspIHsKKyAgICAgICAgWltqXVtpXS52LnJlID0gKChmTXVsdERpdjIoYVBiLCBYW2pdW2ldLnYucmUpID4+IHMxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAoZk11bHREaXYyKGJQYiwgWVtqXVtpXS52LnJlKSA+PiBzMikpCisgICAgICAgICAgICAgICAgICAgICAgIDw8IChzY2FsZSArIDEpOworICAgICAgICBaW2pdW2ldLnYuaW0gPSAoKGZNdWx0RGl2MihhUGIsIFhbal1baV0udi5pbSkgPj4gczEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChmTXVsdERpdjIoYlBiLCBZW2pdW2ldLnYuaW0pID4+IHMyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgKHNjYWxlICsgMSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgRkRLY2FsY1BiU2NhbGVGYWN0b3IoY29uc3QgRklYUF9EUEsgKmNvbnN0ICpjb25zdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqY29uc3QgcFBhcmFtZXRlckJhbmQySHlicmlkQmFuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpjb25zdCBvdXRTY2FsZUZhY3RvciwgY29uc3QgSU5UIHN0YXJ0VGltZVNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuVGltZVNsb3RzLCBjb25zdCBJTlQgblBhcmFtQmFuZHMpIHsKKyAgaW50IGksIGosIHBiOworCisgIC8qIGNhbGN1bGF0ZSBoZWFkcm9vbSAqLworICBmb3IgKGogPSAwLCBwYiA9IDA7IHBiIDwgblBhcmFtQmFuZHM7IHBiKyspIHsKKyAgICBGSVhQX0RCTCBtYXhWYWwgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICBmb3IgKDsgaiA8IHBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXRbcGJdOyBqKyspIHsKKyAgICAgIGZvciAoaSA9IHN0YXJ0VGltZVNsb3Q7IGkgPCBuVGltZVNsb3RzOyBpKyspIHsKKyAgICAgICAgbWF4VmFsIHw9IGZBYnMoeFtpXVtqXS52LnJlKTsKKyAgICAgICAgbWF4VmFsIHw9IGZBYnMoeFtpXVtqXS52LmltKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0U2NhbGVGYWN0b3JbcGJdID0gLWZpeE1heCgwLCBDbnRMZWFkaW5nWmVyb3MobWF4VmFsKSAtIDEpOworICB9Cit9CisKK0lOVCBGREtjYWxjU2NhbGVGYWN0b3IoY29uc3QgRklYUF9EQkwgKmNvbnN0IHgsIGNvbnN0IEZJWFBfREJMICpjb25zdCB5LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbikgeworICBpbnQgaTsKKworICAvKiBjYWxjdWxhdGUgaGVhZHJvb20gKi8KKyAgRklYUF9EQkwgbWF4VmFsID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgIGlmICh4ICE9IE5VTEwpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBtYXhWYWwgfD0gZkFicyh4W2ldKTsKKyAgICB9CisgIH0KKworICBpZiAoeSAhPSBOVUxMKSB7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgbWF4VmFsIHw9IGZBYnMoeVtpXSk7CisgICAgfQorICB9CisKKyAgaWYgKG1heFZhbCA9PSAoRklYUF9EQkwpMCkKKyAgICByZXR1cm4gKC0oREZSQUNUX0JJVFMgLSAxKSk7CisgIGVsc2UKKyAgICByZXR1cm4gKC1Db3VudExlYWRpbmdCaXRzKG1heFZhbCkpOworfQorCitJTlQgRkRLY2FsY1NjYWxlRmFjdG9yRFBLKGNvbnN0IEZJWFBfRFBLICpSRVNUUklDVCB4LCBjb25zdCBJTlQgc3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYmFuZHMpIHsKKyAgSU5UIHFzLCBjbHo7CisgIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworCisgIGZvciAocXMgPSBzdGFydEJhbmQ7IHFzIDwgYmFuZHM7IHFzKyspIHsKKyAgICBtYXhWYWwgfD0gZkFicyh4W3FzXS52LnJlKTsKKyAgICBtYXhWYWwgfD0gZkFicyh4W3FzXS52LmltKTsKKyAgfQorCisgIGNseiA9IC1maXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKG1heFZhbCkgLSAxKTsKKworICByZXR1cm4gKGNseik7Cit9CmRpZmYgLS1naXQgYS9saWJTQUNlbmMvc3JjL3NhY2VuY192ZWN0b3JmdW5jdGlvbnMuaCBiL2xpYlNBQ2VuYy9zcmMvc2FjZW5jX3ZlY3RvcmZ1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YzRhYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQUNlbmMvc3JjL3NhY2VuY192ZWN0b3JmdW5jdGlvbnMuaApAQCAtMCwwICsxLDQ4OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBzdXJyb3VuZCBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgSm9zZWYgSG9lcGZsCisKKyAgIERlc2NyaXB0aW9uOiBFbmNvZGVyIExpYnJhcnkgSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgdmVjdG9yIGZ1bmN0aW9ucworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1xmaWxlCitUaGlzIGZpbGUgY29udGFpbnMgdmVjdG9yIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNBQ0VOQ19WRUNUT1JGVU5DVElPTlNfSAorI2RlZmluZSBTQUNFTkNfVkVDVE9SRlVOQ1RJT05TX0gKKworLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworLyogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTVU1fVVBfU1RBVElDX1NDQUxFIDAKKyNkZWZpbmUgU1VNX1VQX0RZTkFNSUNfU0NBTEUgMQorCisvKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gLyBDbGFzcyBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFxicmllZiAgICAgICAgICBWZWN0b3IgZnVuY3Rpb24gOiBTdW0gdXAgY29tcGxleCBwb3dlcgorICoKKyAqICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA6IHJldCA9IHN1bSggcmV7WFtpXX0gKiByZXtYW2ldfSArIGlte1hbaV19ICoKKyAqIGlte1hbaV19ICksICBpPTAsLi4uLG4tMSByZXQgaXMgc2NhbGVkIGJ5IG91dFNjYWxlRmFjdG9yCisgKgorICogXHBhcmFtICAgICAgICAgIGNvbnN0IEZJWFBfRFBLIHhbXQorICogICAgICAgICAgICAgICAgIElucHV0OiBjb21wbGV4IHZlY3RvciBvZiB0aGUgbGVuZ3RoIG4KKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50IHNjYWxlTW9kZQorICogICAgICAgICAgICAgICAgIElucHV0OiBjaG9vc2Ugc3RhdGljIG9yIGR5bmFtaWMgc2NhbGluZworICogKFNVTV9VUF9EWU5BTUlDX1NDQUxFL1NVTV9VUF9TVEFUSUNfU0NBTEUpCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBpblNjYWxlRmFjdG9yCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IGRldGVybWluZSBoZWFkcm9vbSBiaXRzIGZvciB0aGUgY29tcGxleCBpbnB1dCB2ZWN0b3IKKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50IG91dFNjYWxlRmFjdG9yCisgKiAgICAgICAgICAgICAgICAgT3V0cHV0OiBjb21wbGV0ZSBzY2FsaW5nIGluIGVuZXJneSBjYWxjdWxhdGlvbgorICoKKyAqIFxyZXR1cm4gICAgICAgICBGSVhQX0RCTCByZXQKKyAqLworRklYUF9EQkwgc3VtVXBDcGx4UG93Mihjb25zdCBGSVhQX0RQSyAqY29uc3QgeCwgY29uc3QgSU5UIHNjYWxlTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGluU2NhbGVGYWN0b3IsIElOVCAqY29uc3Qgb3V0U2NhbGVGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgVmVjdG9yIGZ1bmN0aW9uIDogU3VtIHVwIGNvbXBsZXggcG93ZXIKKyAqCisgKiAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gOiByZXQgPSBzdW0oIHJle1hbaV1bal19ICogcmV7WFtpXVtdfSArCisgKiBpbXtYW2ldW119ICogaW17WFtpXVtdfSApLCAgaT1zRGltMSwuLi4sbkRpbTEtMSBpPXNEaW0yLC4uLixuRGltMi0xIHJldCBpcworICogc2NhbGVkIGJ5IG91dFNjYWxlRmFjdG9yCisgKgorICogXHBhcmFtICAgICAgICAgIGNvbnN0IEZJWFBfRFBLIHhbXQorICogICAgICAgICAgICAgICAgIElucHV0OiBjb21wbGV4IHZlY3RvciBvZiB0aGUgbGVuZ3RoIG4KKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50IHNjYWxlTW9kZQorICogICAgICAgICAgICAgICAgIElucHV0OiBjaG9vc2Ugc3RhdGljIG9yIGR5bmFtaWMgc2NhbGluZworICogKFNVTV9VUF9EWU5BTUlDX1NDQUxFL1NVTV9VUF9TVEFUSUNfU0NBTEUpCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBpblNjYWxlRmFjdG9yCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IGRldGVybWluZSBoZWFkcm9vbSBiaXRzIGZvciB0aGUgY29tcGxleCBpbnB1dCB2ZWN0b3IKKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50IG91dFNjYWxlRmFjdG9yCisgKiAgICAgICAgICAgICAgICAgT3V0cHV0OiBjb21wbGV0ZSBzY2FsaW5nIGluIGVuZXJneSBjYWxjdWxhdGlvbgorICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgc0RpbTEKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogc3RhcnQgaW5kZXggZm9yIGxvb3AgY291bnRlciBpbiBkaW1lbnNpb24gMQorICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgbkRpbTEKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogbG9vcCBjb3VudGVyIGluIGRpbWVuc2lvbiAxCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBzRGltMgorICogICAgICAgICAgICAgICAgIElucHV0OiBzdGFydCBpbmRleCBmb3IgbG9vcCBjb3VudGVyIGluIGRpbWVuc2lvbiAyCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBuRGltMgorICogICAgICAgICAgICAgICAgIElucHV0OiBsb29wIGNvdW50ZXIgaW4gZGltZW5zaW9uIDIKKyAqCisgKiBccmV0dXJuICAgICAgICAgRklYUF9EQkwgcmV0CisgKi8KK0ZJWFBfREJMIHN1bVVwQ3BseFBvdzJEaW0yKGNvbnN0IEZJWFBfRFBLICpjb25zdCAqY29uc3QgeCwgY29uc3QgSU5UIHNjYWxlTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpblNjYWxlRmFjdG9yLCBJTlQgKmNvbnN0IG91dFNjYWxlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHNEaW0xLCBjb25zdCBJTlQgbkRpbTEsIGNvbnN0IElOVCBzRGltMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuRGltMik7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFZlY3RvciBmdW5jdGlvbiA6IFpbaV0gPSBYW2ldLCAgaT0wLC4uLixuLTEKKyAqCisgKiAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gOiByZXtaW2ldfSA9IHJle1hbaV19LCAgaT0wLC4uLixuLTEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlte1pbaV19ID0gaW17WFtpXX0sICBpPTAsLi4uLG4tMQorICoKKyAqICAgICAgICAgICAgICAgICBDb3B5IGNvbXBsZXggdmVjdG9yIFhbXSB0byBjb21wbGV4IHZlY3RvciBaW10uCisgKiAgICAgICAgICAgICAgICAgSXQgaXMgYWxsb3dlZCB0byBvdmVybGF5IFhbXSB3aXRoIFpbXS4KKyAqCisgKiBccGFyYW0gICAgICAgICAgRklYUF9EUEsgWltdCisgKiAgICAgICAgICAgICAgICAgT3V0cHV0OiB2ZWN0b3Igb2YgdGhlIGxlbmd0aCBuCisgKgorICogXHBhcmFtICAgICAgICAgIGNvbnN0IEZJWFBfRFBLIFhbXQorICogICAgICAgICAgICAgICAgIElucHV0OiB2ZWN0b3Igb2YgdGhlIGxlbmd0aCBuCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBuCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IGxlbmd0aCBvZiB2ZWN0b3IgWltdIGFuZCBYW10KKyAqCisgKiBccmV0dXJuICAgICAgICAgdm9pZAorICovCit2b2lkIGNvcHlDcGx4VmVjKEZJWFBfRFBLICpjb25zdCBaLCBjb25zdCBGSVhQX0RQSyAqY29uc3QgWCwgY29uc3QgSU5UIG4pOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBWZWN0b3IgZnVuY3Rpb24gOiBaW2ldID0gYSwgIGk9MCwuLi4sbi0xCisgKgorICogICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uIDogcmV7WltpXX0gPSBhLCAgaT0wLC4uLixuLTEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlte1pbaV19ID0gYSwgIGk9MCwuLi4sbi0xCisgKgorICogICAgICAgICAgICAgICAgIFNldCByZWFsIGFuZCBpbWFnaW5hcnkgcGFydCBvZiB0aGUgY29tcGxleCB2YWx1ZSBaIHRvIGEuCisgKgorICogXHBhcmFtICAgICAgICAgIEZJUFhfRFBLIFpbXQorICogICAgICAgICAgICAgICAgIE91dHB1dDogdmVjdG9yIG9mIHRoZSBsZW5ndGggbgorICoKKyAqIFxwYXJhbSAgICAgICAgICBjb25zdCBGSVhQX0RCTCBhCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IGNvbnN0YW50IHZhbHVlCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBuCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IGxlbmd0aCBvZiB2ZWN0b3IgWltdCisgKgorICogXHJldHVybiAgICAgICAgIHZvaWQKKyAqLwordm9pZCBzZXRDcGx4VmVjKEZJWFBfRFBLICpjb25zdCBaLCBjb25zdCBGSVhQX0RCTCBhLCBjb25zdCBJTlQgbik7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFZlY3RvciBmdW5jdGlvbiA6IENhbGN1bGF0ZSBjb21wbGV4LXZhbHVlZCByZXN1bHQgb2YgY29tcGxleAorICogc2NhbGFyIHByb2R1Y3QKKyAqCisgKiAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gOiByZXtafSA9IHN1bSggcmV7WFtpXX0gKiByZXtZW2ldfSArIGlte1hbaV19ICoKKyAqIGlte1lbaV19LCAgaT0wLC4uLixuLTEgKSBpbXtafSA9IHN1bSggaW17WFtpXX0gKiByZXtZW2ldfSAtIHJle1hbaV19ICoKKyAqIGlte1lbaV19LCAgaT0wLC4uLixuLTEgKQorICoKKyAqICAgICAgICAgICAgICAgICBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29tcGxleC12YWx1ZWQgcmVzdWx0IG9mIHRoZSBjb21wbGV4CisgKiBzY2FsYXIgcHJvZHVjdCBhdCB0aGUgYWRkcmVzcyBvZiBaLiBUaGUgcmVzdWx0IGlzIHNjYWxlZCBieSBzY2FsZVouCisgKgorICogXHBhcmFtICAgICAgICAgIEZJWFBfRFBLICpaCisgKiAgICAgICAgICAgICAgICAgT3V0cHV0OiBwb2ludGVyIHRvIFoKKyAqCisgKiBccGFyYW0gICAgICAgICAgY29uc3QgRklYUF9EUEsgKmNvbnN0ICpjb25zdCBYCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHZlY3RvciBvZiB0aGUgbGVuZ3RoIG4KKyAqCisgKiBccGFyYW0gICAgICAgICAgY29uc3QgRklYUF9EUEsgKmNvbnN0ICpjb25zdCBZCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHZlY3RvciBvZiB0aGUgbGVuZ3RoIG4KKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50IHNjYWxlWAorICogICAgICAgICAgICAgICAgIElucHV0OiBzY2FsZWZhY3RvciBvZiB2ZWN0b3IgWFtdCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBzY2FsZVkKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogc2NhbGVmYWN0b3Igb2YgdmVjdG9yIFlbXQorICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgc2NhbGVaCisgKiAgICAgICAgICAgICAgICAgT3V0cHV0OiBzY2FsZWZhY3RvciBvZiB2ZWN0b3IgWltdCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBzRGltMQorICogICAgICAgICAgICAgICAgIElucHV0OiBzdGFydCBpbmRleCBmb3IgbG9vcCBjb3VudGVyIGluIGRpbWVuc2lvbiAxCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBuRGltMQorICogICAgICAgICAgICAgICAgIElucHV0OiBsb29wIGNvdW50ZXIgaW4gZGltZW5zaW9uIDEKKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50IHNEaW0yCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHN0YXJ0IGluZGV4IGZvciBsb29wIGNvdW50ZXIgaW4gZGltZW5zaW9uIDIKKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50IG5EaW0yCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IGxvb3AgY291bnRlciBpbiBkaW1lbnNpb24gMgorICoKKyAqIFxyZXR1cm4gICAgICAgICB2b2lkCisgKi8KK3ZvaWQgY3BseF9jcGx4U2NhbGFyUHJvZHVjdChGSVhQX0RQSyAqY29uc3QgWiwgY29uc3QgRklYUF9EUEsgKmNvbnN0ICpjb25zdCBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfRFBLICpjb25zdCAqY29uc3QgWSwgY29uc3QgSU5UIHNjYWxlWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2NhbGVZLCBJTlQgKmNvbnN0IHNjYWxlWiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc0RpbTEsIGNvbnN0IElOVCBuRGltMSwgY29uc3QgSU5UIHNEaW0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBuRGltMik7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFZlY3RvciBmdW5jdGlvbiA6IENhbGN1bGF0ZSBjb3JyZWxhdGlvbgorICoKKyAqICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA6IHpbaV0gPSBwcjEyW2ldIC8gc3FydChwMVtpXSpwMltpXSkgLAorICogaT0wLC4uLixuLTEKKyAqCisgKiBccGFyYW0gICAgICAgICAgRklYUF9EQkwgeltdCisgKiAgICAgICAgICAgICAgICAgT3V0cHV0OiB2ZWN0b3Igb2YgbGVuZ3RoIG4KKyAqCisgKiBccGFyYW0gICAgICAgICAgY29uc3QgRklYUF9EQkwgcHIxMltdCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHZlY3RvciBvZiB0aGUgbGVuZ3RoIG4KKyAqCisgKiBccGFyYW0gICAgICAgICAgY29uc3QgRklYUF9EQkwgcDFbXQorICogICAgICAgICAgICAgICAgIElucHV0OiB2ZWN0b3Igb2YgdGhlIGxlbmd0aCBuCisgKgorICogXHBhcmFtICAgICAgICAgIGNvbnN0IEZJWFBfREJMIHAyW10KKyAqICAgICAgICAgICAgICAgICBJbnB1dDogdmVjdG9yIG9mIHRoZSBsZW5ndGggbgorICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgbgorICogICAgICAgICAgICAgICAgIElucHV0OiBsZW5ndGggb2YgdmVjdG9yIHByMTJbXSwgcDFbXSBhbmQgcDJbXQorICoKKyAqIFxyZXR1cm4gICAgICAgICB2b2lkCisgKi8KK3ZvaWQgRkRLY2FsY0NvcnJlbGF0aW9uVmVjKEZJWFBfREJMICpjb25zdCB6LCBjb25zdCBGSVhQX0RCTCAqY29uc3QgcHIxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBwMSwgY29uc3QgRklYUF9EQkwgKmNvbnN0IHAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG4pOworCisvKioKKyAqIFxicmllZiAgICAgICAgICBWZWN0b3IgZnVuY3Rpb24gOiBDYWxjdWxhdGUgY29oZXJlbmNlCisgKgorICogICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uIDogeltpXSA9IHNxcnQoIChwMTJyW2ldKnAxMnJbaV0gKworICogcDEyaVtpXSpwMTJpW2ldKSAvIChwMVtpXSpwMltpXSkgKSwgIGk9MCwuLi4sbi0xCisgKgorICogXHBhcmFtICAgICAgICAgIEZJWFBfREJMIHpbXQorICogICAgICAgICAgICAgICAgIE91dHB1dDogdmVjdG9yIG9mIGxlbmd0aCBuCisgKgorICogXHBhcmFtICAgICAgICAgIGNvbnN0IEZJWFBfREJMIHAxMnJbXQorICogICAgICAgICAgICAgICAgIElucHV0OiB2ZWN0b3Igb2YgdGhlIGxlbmd0aCBuCisgKgorICogXHBhcmFtICAgICAgICAgIGNvbnN0IEZJWFBfREJMIHAxMmlbXQorICogICAgICAgICAgICAgICAgIElucHV0OiB2ZWN0b3Igb2YgdGhlIGxlbmd0aCBuCisgKgorICogXHBhcmFtICAgICAgICAgIGNvbnN0IEZJWFBfREJMIHAxW10KKyAqICAgICAgICAgICAgICAgICBJbnB1dDogdmVjdG9yIG9mIHRoZSBsZW5ndGggbgorICoKKyAqIFxwYXJhbSAgICAgICAgICBjb25zdCBGSVhQX0RCTCBwMltdCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHZlY3RvciBvZiB0aGUgbGVuZ3RoIG4KKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50IHNjYWxlUDEyW10KKyAqICAgICAgICAgICAgICAgICBJbnB1dDogc2NhbGVmYWN0b3Igb2YgcDEyciBhbmQgcDEyaQorICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgc2NhbGVQCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHNjYWxlZmFjdG9yIG9mIHAxIGFuZCBwMgorICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgbgorICogICAgICAgICAgICAgICAgIElucHV0OiBsZW5ndGggb2YgdmVjdG9yIHAxMnJbXSwgcDEyaVtdLCBwMVtdIGFuZCBwMltdCisgKgorICogXHJldHVybiAgICAgICAgIHZvaWQKKyAqLwordm9pZCBjYWxjQ29oZXJlbmNlVmVjKEZJWFBfREJMICpjb25zdCB6LCBjb25zdCBGSVhQX0RCTCAqY29uc3QgcDEyciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgcDEyaSwgY29uc3QgRklYUF9EQkwgKmNvbnN0IHAxLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCBwMiwgY29uc3QgSU5UIHNjYWxlUDEyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzY2FsZVAsIGNvbnN0IElOVCBuKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgVmVjdG9yIGZ1bmN0aW9uIDogWltqXVtpXSA9IGFbcGJdICogWFtqXVtpXSArIGJbcGJdICoKKyAqIFlbal1baV0sICBqPTAsLi4uLG5IeWJyaWRCYW5kcy0xOyAgaT1zdGFydFRpbWVTbG90LC4uLixuVGltZVNsb3RzLTE7CisgKiBwYj0wLC4uLixuUGFyYW1ldGVyQmFuZHMtMQorICoKKyAqICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA6IHJle1pbal1baV19ID0gYVtwYl0gKiByZXtYW2pdW2ldfSArIGJbcGJdICoKKyAqIHJle1lbal1baV19LCAgaj0wLC4uLixuSHlicmlkQmFuZHMtMTsgIGk9c3RhcnRUaW1lU2xvdCwuLi4sblRpbWVTbG90cy0xOworICogcGI9MCwuLi4sblBhcmFtZXRlckJhbmRzLTEgaW17WltqXVtpXX0gPSBhW3BiXSAqIGlte1hbal1baV19ICsgYltwYl0gKgorICogaW17WVtqXVtpXX0sICBqPTAsLi4uLG5IeWJyaWRCYW5kcy0xOworICogaT1zdGFydFRpbWVTbG90LC4uLixuVGltZVNsb3RzLTE7ICBwYj0wLC4uLixuUGFyYW1ldGVyQmFuZHMtMQorICoKKyAqICAgICAgICAgICAgICAgICBJdCBpcyBhbGxvd2VkIHRvIG92ZXJsYXkgWFtdIG9yIFlbXSB3aXRoIFpbXS4gVGhlIHNjYWxlZmFjdG9yCisgKiBvZiBjaGFubmVsIDEgaXMgdXBkYXRlZCB3aXRoIHRoZSBjb21tb24gc2NhbGVmYWN0b3Igb2YgY2hhbm5lbCAxIGFuZAorICogY2hhbm5lbCAyLgorICoKKyAqIFxwYXJhbSAgICAgICAgICBGSVhQX0RQSyAqKloKKyAqICAgICAgICAgICAgICAgICBPdXRwdXQ6IHZlY3RvciBvZiB0aGUgbGVuZ3RoIG5IeWJyaWRCYW5kcypuVGltZVNsb3RzCisgKgorICogXHBhcmFtICAgICAgICAgIGNvbnN0IEZJWFBfREJMICphCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHZlY3RvciBvZiBsZW5ndGggblBhcmFtZXRlckJhbmRzCisgKgorICogXHBhcmFtICAgICAgICAgIGNvbnN0IEZJWFBfRFBLICoqWAorICogICAgICAgICAgICAgICAgIElucHV0OiB2ZWN0b3Igb2YgdGhlIGxlbmd0aCBuSHlicmlkQmFuZHMqblRpbWVTbG90cworICoKKyAqIFxwYXJhbSAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqYgorICogICAgICAgICAgICAgICAgIElucHV0OiB2ZWN0b3Igb2YgbGVuZ3RoIG5QYXJhbWV0ZXJCYW5kcworICoKKyAqIFxwYXJhbSAgICAgICAgICBjb25zdCBGSVhQX0RQSyAqKlkKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogdmVjdG9yIG9mIHRoZSBsZW5ndGggbkh5YnJpZEJhbmRzKm5UaW1lU2xvdHMKKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50IHNjYWxlCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHNjYWxlIG9mIHZlY3RvciBhIGFuZCBiCisgKgorICogXHBhcmFtICAgICAgICAgIGludCAqc2NhbGVDaDEKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogc2NhbGUgb2YgY2gxCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBzY2FsZUNoMgorICogICAgICAgICAgICAgICAgIElucHV0OiBzY2FsZSBvZiBjaDIKKyAqCisgKiBccGFyYW0gICAgICAgICAgVUNIQVIgKnBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXQKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogdmVjdG9yIG9mIGxlbmd0aCBuUGFyYW1ldGVyQmFuZHMKKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50IG5UaW1lU2xvdHMKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogbnVtYmVyIG9mIHRpbWUgc2xvdHMKKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50IHN0YXJ0VGltZVNsb3QKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogc3RhcnQgdGltZSBzbG90CisgKgorICogXHJldHVybiAgICAgICAgIHZvaWQKKyAqLwordm9pZCBhZGRXZWlnaHRlZENwbHhWZWMoRklYUF9EUEsgKmNvbnN0ICpjb25zdCBaLCBjb25zdCBGSVhQX0RCTCAqY29uc3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfRFBLICpjb25zdCAqY29uc3QgWCwgY29uc3QgRklYUF9EQkwgKmNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RQSyAqY29uc3QgKmNvbnN0IFksIGNvbnN0IElOVCBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqY29uc3Qgc2NhbGVDaDEsIGNvbnN0IElOVCBzY2FsZUNoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpjb25zdCBwUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5QYXJhbWV0ZXJCYW5kcywgY29uc3QgSU5UIG5UaW1lU2xvdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc3RhcnRUaW1lU2xvdCk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFZlY3RvciBmdW5jdGlvbiA6IENhbGN1bGF0ZSB0aGUgaGVhZHJvb20gb2YgYSBjb21wbGV4IHZlY3RvcgorICogaW4gYSBwYXJhbWV0ZXIgYmFuZCBncmlkCisgKgorICogXHBhcmFtICAgICAgICAgIEZJWFBfRFBLICoqeAorICogICAgICAgICAgICAgICAgIElucHV0OiBwb2ludGVyIHRvIGNvbXBsZXggaW5wdXQgdmVjdG9yCisgKgorICogXHBhcmFtICAgICAgICAgIFVDSEFSICpwUGFyYW1ldGVyQmFuZDJIeWJyaWRCYW5kT2Zmc2V0CisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHBvaW50ZXIgdG8gaHlicmlkIGJhbmQgb2Zmc2V0cworICoKKyAqIFxwYXJhbSAgICAgICAgICBpbnQgKm91dFNjYWxlRmFjdG9yCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IHBvaW50ZXIgdG8gb3VwdXQgc2NhbGVmYWN0b3IKKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50IHN0YXJ0VGltZVNsb3QKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogc3RhcnQgdGltZSBzbG90CisgKgorICogXHBhcmFtICAgICAgICAgIGludCBuVGltZVNsb3RzCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IG51bWJlciBvZiB0aW1lIHNsb3QKKyAqCisgKiBccGFyYW0gICAgICAgICAgaW50IG5QYXJhbUJhbmRzCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IG51bWJlciBvZiBwYXJhbWV0ZXIgYmFuZHMKKyAqCisgKiBccmV0dXJuICAgICAgICAgdm9pZAorICovCit2b2lkIEZES2NhbGNQYlNjYWxlRmFjdG9yKGNvbnN0IEZJWFBfRFBLICpjb25zdCAqY29uc3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKmNvbnN0IHBQYXJhbWV0ZXJCYW5kMkh5YnJpZEJhbmRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqY29uc3Qgb3V0U2NhbGVGYWN0b3IsIGNvbnN0IElOVCBzdGFydFRpbWVTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgblRpbWVTbG90cywgY29uc3QgSU5UIG5QYXJhbUJhbmRzKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgVmVjdG9yIGZ1bmN0aW9uIDogQ2FsY3VsYXRlIHRoZSBjb21tb24gaGVhZHJvb20gb2YgdHdvCisgKiBzcGFyYXRlIHZlY3RvcnMKKyAqCisgKiBccGFyYW0gICAgICAgICAgRklYUF9EQkwgKngKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogcG9pbnRlciB0byBmaXJzdCBpbnB1dCB2ZWN0b3IKKyAqCisgKiBccGFyYW0gICAgICAgICAgRklYUF9EQkwgKnkKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogcG9pbnRlciB0byBzZWNvbmQgaW5wdXQgdmVjdG9yCisgKgorICogXHBhcmFtICAgICAgICAgIGludCBuCisgKiAgICAgICAgICAgICAgICAgSW5wdXQ6IG51bWJlciBvZiBzYW1wbGVzCisgKgorICogXHJldHVybiAgICAgICAgIGludCBoZWFkcm9tbSBpbiBiaXRzCisgKi8KK0lOVCBGREtjYWxjU2NhbGVGYWN0b3IoY29uc3QgRklYUF9EQkwgKmNvbnN0IHgsIGNvbnN0IEZJWFBfREJMICpjb25zdCB5LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgbik7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgIFZlY3RvciBmdW5jdGlvbiA6IENhbGN1bGF0ZSB0aGUgaGVhZHJvb20gb2YgYSBjb21wbGV4IHZlY3RvcgorICoKKyAqIFxwYXJhbSAgICAgICAgICBGSVhQX0RQSyAqeAorICogICAgICAgICAgICAgICAgIElucHV0OiBwb2ludGVyIHRvIGNvbXBsZXggaW5wdXQgdmVjdG9yCisgKgorICogXHBhcmFtICAgICAgICAgIElOVCBzdGFydEJhbmQKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogc3RhcnQgYmFuZAorICoKKyAqIFxwYXJhbSAgICAgICAgICBJTlQgYmFuZHMKKyAqICAgICAgICAgICAgICAgICBJbnB1dDogbnVtYmVyIG9mIGJhbmRzCisgKgorICogXHJldHVybiAgICAgICAgIGludCBoZWFkcm9tbSBpbiBiaXRzCisgKi8KK0lOVCBGREtjYWxjU2NhbGVGYWN0b3JEUEsoY29uc3QgRklYUF9EUEsgKlJFU1RSSUNUIHgsIGNvbnN0IElOVCBzdGFydEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBiYW5kcyk7CisKKy8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVmaW5pdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIHZvaWQgRkRLbWVtY3B5X2ZsZXgoVCAqY29uc3QgZHN0LCBjb25zdCBJTlQgZHN0U3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCAqY29uc3Qgc3JjLCBjb25zdCBJTlQgc3JjU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5TYW1wbGVzKSB7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBuU2FtcGxlczsgaSsrKSB7CisgICAgZHN0W2kgKiBkc3RTdHJpZGVdID0gc3JjW2kgKiBzcmNTdHJpZGVdOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIHZvaWQgRkRLbWVtc2V0X2ZsZXgoVCAqY29uc3QgeCwgY29uc3QgVCBjLCBjb25zdCBJTlQgblNhbXBsZXMpIHsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG5TYW1wbGVzOyBpKyspIHsKKyAgICB4W2ldID0gYzsKKyAgfQorfQorCisjZW5kaWYgLyogU0FDRU5DX1ZFQ1RPUkZVTkNUSU9OU19IICovCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvaW5jbHVkZS9zYnJkZWNvZGVyLmggYi9saWJTQlJkZWMvaW5jbHVkZS9zYnJkZWNvZGVyLmgKaW5kZXggM2JiOWJhMy4uY2M1NTU3MiAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL2luY2x1ZGUvc2JyZGVjb2Rlci5oCisrKyBiL2xpYlNCUmRlYy9pbmNsdWRlL3NicmRlY29kZXIuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyNSArOTAsMjggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgQXV0aG9yKHMpOgorCiAgICBEZXNjcmlwdGlvbjogU0JSIGRlY29kZXIgZnJvbnQtZW5kIHByb3RvdHlwZXMgYW5kIGRlZmluaXRpb25zLgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIF9fU0JSREVDT0RFUl9ICi0jZGVmaW5lIF9fU0JSREVDT0RFUl9ICisjaWZuZGVmIFNCUkRFQ09ERVJfSAorI2RlZmluZSBTQlJERUNPREVSX0gKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAogI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKICNpbmNsdWRlICJGREtfYXVkaW8uaCIKIAorI2luY2x1ZGUgIkZES19xbWZfZG9tYWluLmgiCiAKLSNkZWZpbmUgU0JSX0RFQlVHX0VYVEhMUCAiXAorI2RlZmluZSBTQlJfREVCVUdfRVhUSExQIFwKKyAgIlwKIC0tLSBTQlIgLS0tXG5cCiAgICAgMHgwMDAwMDAxMCBBbmNpbGxhcnkgZGF0YSBhbmQgU0JSLUhlYWRlclxuXAogICAgIDB4MDAwMDAwMjAgU0JSLVNpZGUgaW5mb1xuXApAQCAtMTEwLDY0ICsxMjQsOTIgQEAKICIKIAogLyogQ2FwYWJpbGl0eSBmbGFncyAqLwotI2RlZmluZSBDQVBGX1NCUl9MUCAgICAgICAgICAweDAwMDAwMDAxICAgLyohPCBGbGFnIGluZGljYXRpbmcgbGlicmFyeSdzIGNhcGFiaWxpdHkgb2YgTG93IFBvd2VyIG1vZGUuICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9TQlJfSFEgICAgICAgICAgMHgwMDAwMDAwMiAgIC8qITwgRmxhZyBpbmRpY2F0aW5nIGxpYnJhcnkncyBjYXBhYmlsaXR5IG9mIEhpZ2ggUXVhbGl0eSBtb2RlLiAgICAgICAgICovCi0jZGVmaW5lIENBUEZfU0JSX0RSTV9CUyAgICAgIDB4MDAwMDAwMDQgICAvKiE8IEZsYWcgaW5kaWNhdGluZyBsaWJyYXJ5J3MgY2FwYWJpbGl0eSB0byBkZWNvZGUgRFJNIFNCUiBkYXRhLiAgICAgICAqLwotI2RlZmluZSBDQVBGX1NCUl9DT05DRUFMTUVOVCAweDAwMDAwMDA4ICAgLyohPCBGbGFnIGluZGljYXRpbmcgbGlicmFyeSdzIGNhcGFiaWxpdHkgdG8gY29uY2VhbCBlcnJvbmVvdXMgZnJhbWVzLiAgKi8KLSNkZWZpbmUgQ0FQRl9TQlJfRFJDICAgICAgICAgMHgwMDAwMDAxMCAgIC8qITwgRmxhZyBpbmRpY2F0aW5nIGxpYnJhcnkncyBjYXBhYmlsaXR5IGZvciBEeW5hbWljIFJhbmdlIENvbnRyb2wuICAgICovCi0jZGVmaW5lIENBUEZfU0JSX1BTX01QRUcgICAgIDB4MDAwMDAwMjAgICAvKiE8IEZsYWcgaW5kaWNhdGluZyBsaWJyYXJ5J3MgY2FwYWJpbGl0eSB0byBkbyBNUEVHIFBhcmFtZXRyaWMgU3RlcmVvLiAqLwotI2RlZmluZSBDQVBGX1NCUl9QU19EUk0gICAgICAweDAwMDAwMDQwICAgLyohPCBGbGFnIGluZGljYXRpbmcgbGlicmFyeSdzIGNhcGFiaWxpdHkgdG8gZG8gRFJNIFBhcmFtZXRyaWMgU3RlcmVvLiAgKi8KKyNkZWZpbmUgQ0FQRl9TQlJfTFAgXAorICAweDAwMDAwMDAxIC8qITwgRmxhZyBpbmRpY2F0aW5nIGxpYnJhcnkncyBjYXBhYmlsaXR5IG9mIExvdyBQb3dlciBtb2RlLiAqLworI2RlZmluZSBDQVBGX1NCUl9IUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDIgLyohPCBGbGFnIGluZGljYXRpbmcgbGlicmFyeSdzIGNhcGFiaWxpdHkgb2YgSGlnaCBRdWFsaXR5IG1vZGUuIFwKKyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9TQlJfRFJNX0JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDQgLyohPCBGbGFnIGluZGljYXRpbmcgbGlicmFyeSdzIGNhcGFiaWxpdHkgdG8gZGVjb2RlIERSTSBTQlIgZGF0YS4gXAorICAgICAgICAgICAgICAqLworI2RlZmluZSBDQVBGX1NCUl9DT05DRUFMTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwOCAvKiE8IEZsYWcgaW5kaWNhdGluZyBsaWJyYXJ5J3MgY2FwYWJpbGl0eSB0byBjb25jZWFsIGVycm9uZW91cyBcCisgICAgICAgICAgICAgICAgZnJhbWVzLiAgICAgICAgICAqLworI2RlZmluZSBDQVBGX1NCUl9EUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAxMCAvKiE8IEZsYWcgaW5kaWNhdGluZyBsaWJyYXJ5J3MgY2FwYWJpbGl0eSBmb3IgRHluYW1pYyBSYW5nZSBcCisgICAgICAgICAgICAgICAgQ29udHJvbC4gICAgICAgICAgICAqLworI2RlZmluZSBDQVBGX1NCUl9QU19NUEVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMjAgLyohPCBGbGFnIGluZGljYXRpbmcgbGlicmFyeSdzIGNhcGFiaWxpdHkgdG8gZG8gTVBFRyBQYXJhbWV0cmljIFwKKyAgICAgICAgICAgICAgICBTdGVyZW8uICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9TQlJfUFNfRFJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwNDAgLyohPCBGbGFnIGluZGljYXRpbmcgbGlicmFyeSdzIGNhcGFiaWxpdHkgdG8gZG8gRFJNIFBhcmFtZXRyaWMgXAorICAgICAgICAgICAgICAgIFN0ZXJlby4gICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9TQlJfRUxEX0RPV05TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDgwIC8qITwgRmxhZyBpbmRpY2F0aW5nIGxpYnJhcnkncyBjYXBhYmlsaXR5IHRvIGRvIEVMRCBkZWNvZGluZyBpbiBcCisgICAgICAgICAgICAgICAgZG93bnNjYWxlZCBtb2RlICovCisjZGVmaW5lIENBUEZfU0JSX0hCRUhRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMTAwIC8qITwgRmxhZyBpbmRpY2F0aW5nIGxpYnJhcnkncyBjYXBhYmlsaXR5IHRvIGRvIEhRIEhhcm1vbmljIFwKKyAgICAgICAgICAgICAgICB0cmFuc3Bvc2luZyAgICAgICAgICovCiAKLXR5cGVkZWYgZW51bQotewotICBTQlJERUNfT0sgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBbGwgZmluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0JSREVDX0NPTkNFQUwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNCUkRFQ19OT1NZTkNILCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTQlJERUNfSUxMRUdBTF9QUk9HUkFNLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0JSREVDX0lMTEVHQUxfVEFHLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNCUkRFQ19JTExFR0FMX0NITl9DT05GSUcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTQlJERUNfSUxMRUdBTF9TRUNUSU9OLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0JSREVDX0lMTEVHQUxfU0NGQUNUT1JTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNCUkRFQ19JTExFR0FMX1BVTFNFX0RBVEEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTQlJERUNfTUFJTl9QUk9GSUxFX05PVF9JTVBMRU1FTlRFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0JSREVDX0dDX05PVF9JTVBMRU1FTlRFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNCUkRFQ19JTExFR0FMX1BMVVNfRUxFX0lELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBTQlJERUNfQ1JFQVRFX0VSUk9SLCAgICAgICAgICAgICAgICAgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgU0JSREVDX05PVF9JTklUSUFMSVpFRCwgICAgICAgICAgICAgIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVELCAgICAgICAgICAgICAvKiE8IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gUHJvYmFibHkgbm90IGVub3VnaCBtZW1vcnkgYXZhaWxhYmxlLiAqLwotICBTQlJERUNfUEFSU0VfRVJST1IsICAgICAgICAgICAgICAgICAgLyohPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRywgICAgICAgICAgIC8qITwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFNCUkRFQ19TRVRfUEFSQU1fRkFJTCAgICAgICAgICAgICAgICAvKiE8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwordHlwZWRlZiBlbnVtIHsKKyAgU0JSREVDX09LID0gMCwgLyohPCBBbGwgZmluZS4gKi8KKyAgLyogU0JSREVDX0NPTkNFQUwsICovCisgIC8qIFNCUkRFQ19OT1NZTkNILCAqLworICAvKiBTQlJERUNfSUxMRUdBTF9QUk9HUkFNLCAqLworICAvKiBTQlJERUNfSUxMRUdBTF9UQUcsICovCisgIC8qIFNCUkRFQ19JTExFR0FMX0NITl9DT05GSUcsICovCisgIC8qIFNCUkRFQ19JTExFR0FMX1NFQ1RJT04sICovCisgIC8qIFNCUkRFQ19JTExFR0FMX1NDRkFDVE9SUywgKi8KKyAgLyogU0JSREVDX0lMTEVHQUxfUFVMU0VfREFUQSwgKi8KKyAgLyogU0JSREVDX01BSU5fUFJPRklMRV9OT1RfSU1QTEVNRU5URUQsICovCisgIC8qIFNCUkRFQ19HQ19OT1RfSU1QTEVNRU5URUQsICovCisgIC8qIFNCUkRFQ19JTExFR0FMX1BMVVNfRUxFX0lELCAqLworICBTQlJERUNfSU5WQUxJRF9BUkdVTUVOVCwgICAvKiE8ICAgKi8KKyAgU0JSREVDX0NSRUFURV9FUlJPUiwgICAgICAgLyohPCAgICAgICAqLworICBTQlJERUNfTk9UX0lOSVRJQUxJWkVELCAgICAvKiE8ICAgICovCisgIFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVELCAgIC8qITwgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiBQcm9iYWJseSBub3QgZW5vdWdoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBhdmFpbGFibGUuICovCisgIFNCUkRFQ19QQVJTRV9FUlJPUiwgICAgICAgIC8qITwgICAgICAgICovCisgIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUcsIC8qITwgKi8KKyAgU0JSREVDX1NFVF9QQVJBTV9GQUlMLCAgICAgLyohPCAgICAgKi8KKyAgU0JSREVDX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMIC8qITwgKi8KIH0gU0JSX0VSUk9SOwogCi10eXBlZGVmIGVudW0KLXsKLSAgU0JSX1NZU1RFTV9CSVRTVFJFQU1fREVMQVksICAgICAgICAgIC8qITwgU3lzdGVtOiBTd2l0Y2ggdG8gZW5hYmxlIGFuIGFkZGl0aW9uYWwgU0JSIGJpdHN0cmVhbSBkZWxheSBvZiBvbmUgZnJhbWUuICovCi0gIFNCUl9RTUZfTU9ERSwgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNldCBRTUYgbW9kZSwgZWl0aGVyIGNvbXBsZXggb3IgbG93IHBvd2VyLiAqLwotICBTQlJfTERfUU1GX1RJTUVfQUxJR04sICAgICAgICAgICAgICAgLyohPCBTZXQgUU1GIHR5cGUsIGVpdGhlciBMRC1NUFMgb3IgQ0xERkIuIFJlbGV2YW50IGZvciBFTEQgc3RyZWFtcyBvbmx5LiAqLwotICBTQlJfRkxVU0hfREFUQSwgICAgICAgICAgICAgICAgICAgICAgLyohPCBTZXQgaW50ZXJuYWwgc3RhdGUgdG8gZmx1c2ggdGhlIGRlY29kZXIgd2l0aCB0aGUgbmV4dCBwcm9jZXNzIGNhbGwuICovCi0gIFNCUl9DTEVBUl9ISVNUT1JZLCAgICAgICAgICAgICAgICAgICAvKiE8IENsZWFyIGFsbCBpbnRlcm5hbCBzdGF0ZXMgKGRlbGF5IGxpbmVzLCBRTUYgc3RhdGVzLCAuLi4pLiAqLwotICBTQlJfQlNfSU5URVJSVVBUSU9OICAgICAgICAgICAgICAgICAgLyohPCBTaWduYWwgYml0IHN0cmVhbSBpbnRlcnJ1cHRpb24uIFZhbHVlIGlzIGlnbm9yZWQuICovCit0eXBlZGVmIGVudW0geworICBTQlJfU1lTVEVNX0JJVFNUUkVBTV9ERUxBWSwgLyohPCBTeXN0ZW06IFN3aXRjaCB0byBlbmFibGUgYW4gYWRkaXRpb25hbCBTQlIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbSBkZWxheSBvZiBvbmUgZnJhbWUuICovCisgIFNCUl9RTUZfTU9ERSwgICAgICAgICAgICAgICAvKiE8IFNldCBRTUYgbW9kZSwgZWl0aGVyIGNvbXBsZXggb3IgbG93IHBvd2VyLiAqLworICBTQlJfTERfUU1GX1RJTUVfQUxJR04sIC8qITwgU2V0IFFNRiB0eXBlLCBlaXRoZXIgTEQtTVBTIG9yIENMREZCLiBSZWxldmFudCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEQgc3RyZWFtcyBvbmx5LiAqLworICBTQlJfRkxVU0hfREFUQSwgICAgIC8qITwgU2V0IGludGVybmFsIHN0YXRlIHRvIGZsdXNoIHRoZSBkZWNvZGVyIHdpdGggdGhlIG5leHQKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzIGNhbGwuICovCisgIFNCUl9DTEVBUl9ISVNUT1JZLCAgLyohPCBDbGVhciBhbGwgaW50ZXJuYWwgc3RhdGVzIChkZWxheSBsaW5lcywgUU1GIHN0YXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pLiAqLworICBTQlJfQlNfSU5URVJSVVBUSU9OIC8qITwgU2lnbmFsIGJpdCBzdHJlYW0gaW50ZXJydXB0aW9uLiBWYWx1ZSBpcyBpZ25vcmVkLiAqLworICAsCisgIFNCUl9TS0lQX1FNRiAvKiE8IEVuYWJsZSBza2lwcGluZyBvZiBRTUYgc3RlcDogMSBza2lwIGFuYWx5c2lzLCAyIHNraXAKKyAgICAgICAgICAgICAgICAgIHN5bnRoZXNpcyAqLwogfSBTQlJERUNfUEFSQU07CiAKIHR5cGVkZWYgc3RydWN0IFNCUl9ERUNPREVSX0lOU1RBTkNFICpIQU5ETEVfU0JSREVDT0RFUjsKIAotCiAjaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKK2V4dGVybiAiQyIgewogI2VuZGlmCiAKLQogLyoqCi0gKiBcYnJpZWYgICAgICAgIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgb25lIFNCUiBkZWNvZGVyIGluc3RhbmNlLgotICogXHBhcmFtIHBTZWxmICBQb2ludGVyIHRvIHdoZXJlIGEgU0JSIGRlY29kZXIgaGFuZGxlIGlzIGNvcGllZCBpbnRvLgotICogXHJldHVybiAgICAgICBFcnJvciBjb2RlLgorICogXGJyaWVmICAgICAgICAgICAgIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgb25lIFNCUiBkZWNvZGVyIGluc3RhbmNlLgorICogXHBhcmFtIHBTZWxmICAgICAgIFBvaW50ZXIgdG8gd2hlcmUgYSBTQlIgZGVjb2RlciBoYW5kbGUgaXMgY29waWVkIGludG8uCisgKiBccGFyYW0gcFFtZkRvbWFpbiAgUG9pbnRlciB0byBRTUYgZG9tYWluIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIFxyZXR1cm4gICAgICAgICAgICBFcnJvciBjb2RlLgogICovCi1TQlJfRVJST1Igc2JyRGVjb2Rlcl9PcGVuICggSEFORExFX1NCUkRFQ09ERVIgKnBTZWxmICk7CitTQlJfRVJST1Igc2JyRGVjb2Rlcl9PcGVuKEhBTkRMRV9TQlJERUNPREVSICpwU2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19RTUZfRE9NQUlOIHBRbWZEb21haW4pOwogCiAvKioKLSAqIFxicmllZiAgSW5pdGlhbGl6ZSBhIFNCUiBkZWNvZGVyIHJ1bnRpbWUgaW5zdGFuY2UuIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBkZWNvZGluZyBzdGFydHMuCisgKiBcYnJpZWYgIEluaXRpYWxpemUgYSBTQlIgZGVjb2RlciBydW50aW1lIGluc3RhbmNlLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUKKyAqIGRlY29kaW5nIHN0YXJ0cy4KICAqCiAgKiBccGFyYW0gc2VsZiAgICAgICAgICAgICBIYW5kbGUgdG8gYSBTQlIgZGVjb2RlciBpbnN0YW5jZS4KICAqIFxwYXJhbSBzYW1wbGVSYXRlSW4gICAgIElucHV0IHNhbXBsZXJhdGUgb2YgdGhlIFNCUiBkZWNvZGVyIGluc3RhbmNlLgpAQCAtMTc1LDQwICsyMTcsNTIgQEAKICAqIFxwYXJhbSBzYW1wbGVzUGVyRnJhbWUgIE51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZXMuCiAgKiBccGFyYW0gY29yZUNvZGVjICAgICAgICBBdWRpbyBPYmplY3QgVHlwZSAoQU9UKSBvZiB0aGUgY29yZSBjb2RlYy4KICAqIFxwYXJhbSBlbGVtZW50SUQgICAgICAgIFRhYmxlIHdpdGggTVBFRy00IGVsZW1lbnQgSWRzIGluIGNhbm9uaWNhbCBvcmRlci4KLSAqIFxwYXJhbSBmb3JjZVJlc2V0ICAgICAgIEZsYWcgdGhhdCBlbmZvcmNlcyBhIGNvbXBsZXRlIGRlY29kZXIgcmVzZXQuCisgKiBccGFyYW0gZWxlbWVudEluZGV4ICAgICBTQlIgZWxlbWVudCBpbmRleAorICogXHBhcmFtIGhhcm1vbmljU0JSCisgKiBccGFyYW0gc3RlcmVvQ29uZmlnSW5kZXgKKyAqIFxwYXJhbSBkb3duc2NhbGVGYWN0b3IgIEVMRCBkb3duc2NhbGUgZmFjdG9yCisgKiBccGFyYW0gY29uZmlnTW9kZSAgICAgICBUYWJsZSB3aXRoIE1QRUctNCBlbGVtZW50IElkcyBpbiBjYW5vbmljYWwgb3JkZXIuCisgKiBccGFyYW0gY29uZmlnQ2hhbmdlZCAgICBGbGFnIHRoYXQgZW5mb3JjZXMgYSBjb21wbGV0ZSBkZWNvZGVyIHJlc2V0LgogICoKICAqIFxyZXR1cm4gIEVycm9yIGNvZGUuCiAgKi8KLVNCUl9FUlJPUiBzYnJEZWNvZGVyX0luaXRFbGVtZW50ICgKLSAgICAgICAgSEFORExFX1NCUkRFQ09ERVIgICAgICAgc2VsZiwKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgc2FtcGxlUmF0ZUluLAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVSYXRlT3V0LAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKLSAgICAgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgICAgZWxlbWVudElELAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBlbGVtZW50SW5kZXgKLSAgICAgICAgKTsKK1NCUl9FUlJPUiBzYnJEZWNvZGVyX0luaXRFbGVtZW50KAorICAgIEhBTkRMRV9TQlJERUNPREVSIHNlbGYsIGNvbnN0IGludCBzYW1wbGVSYXRlSW4sIGNvbnN0IGludCBzYW1wbGVSYXRlT3V0LAorICAgIGNvbnN0IGludCBzYW1wbGVzUGVyRnJhbWUsIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKKyAgICBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbGVtZW50SUQsIGNvbnN0IGludCBlbGVtZW50SW5kZXgsCisgICAgY29uc3QgVUNIQVIgaGFybW9uaWNTQlIsIGNvbnN0IFVDSEFSIHN0ZXJlb0NvbmZpZ0luZGV4LAorICAgIGNvbnN0IFVDSEFSIGNvbmZpZ01vZGUsIFVDSEFSICpjb25maWdDaGFuZ2VkLCBjb25zdCBJTlQgZG93bnNjYWxlRmFjdG9yKTsKKworLyoqCisgKiBcYnJpZWYgRnJlZSBjb25maWcgZGVwZW5kZW50IFNCUiBtZW1vcnkuCisgKiBccGFyYW0gc2VsZiBTQlIgZGVjb2RlciBpbnN0YW5jZSBoYW5kbGUKKyAqLworU0JSX0VSUk9SIHNickRlY29kZXJfRnJlZU1lbShIQU5ETEVfU0JSREVDT0RFUiAqc2VsZik7CiAKIC8qKgogICogXGJyaWVmIHBhc3Mgb3V0IG9mIGJhbmQgU0JSIGhlYWRlciB0byBTQlIgZGVjb2RlcgogICoKICAqIFxwYXJhbSBzZWxmICAgICAgICAgSGFuZGxlIHRvIGEgU0JSIGRlY29kZXIgaW5zdGFuY2UuCiAgKiBccGFyYW0gaEJzICAgICAgICAgIGJpdCBzdHJlYW0gaGFuZGxlIGRhdGEgc291cmNlLgorICogXHBhcmFtIHNhbXBsZVJhdGVJbiBTQlIgaW5wdXQgc2FtcGxpbmcgcmF0ZQorICogXHBhcmFtIHNhbXBsZVJhdGVPdXQgU0JSIG91dHB1dCBzYW1wbGluZyByYXRlCisgKiBccGFyYW0gc2FtcGxlc1BlckZyYW1lIGZyYW1lIGxlbmd0aAogICogXHBhcmFtIGVsZW1lbnRJRCAgICBTQlIgZWxlbWVudCBJRC4KICAqIFxwYXJhbSBlbGVtZW50SW5kZXggU0JSIGVsZW1lbnQgaW5kZXguCisgKiBccGFyYW0gaGFybW9uaWNTQlIKKyAqIFxwYXJhbSBzdGVyZW9Db25maWdJbmRleAorICogXHBhcmFtIGRvd25zY2FsZUZhY3RvciAgRUxEIGRvd25zY2FsZSBmYWN0b3IKICAqCiAgKiBccmV0dXJuICBFcnJvciBjb2RlLgogICovCi1JTlQgc2JyRGVjb2Rlcl9IZWFkZXIgKAotICAgICAgICBIQU5ETEVfU0JSREVDT0RFUiAgICAgICBzZWxmLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICBoQnMsCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGVSYXRlSW4sCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGVSYXRlT3V0LAotICAgICAgICBjb25zdCBJTlQgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICBjb25zdCBBVURJT19PQkpFQ1RfVFlQRSBjb3JlQ29kZWMsCi0gICAgICAgIGNvbnN0IE1QNF9FTEVNRU5UX0lEICAgIGVsZW1lbnRJRCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgZWxlbWVudEluZGV4Ci0gICAgICAgICk7CitJTlQgc2JyRGVjb2Rlcl9IZWFkZXIoSEFORExFX1NCUkRFQ09ERVIgc2VsZiwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzYW1wbGVSYXRlSW4sIGNvbnN0IElOVCBzYW1wbGVSYXRlT3V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGVsZW1lbnRJRCwgY29uc3QgSU5UIGVsZW1lbnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBoYXJtb25pY1NCUiwgY29uc3QgVUNIQVIgc3RlcmVvQ29uZmlnSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgY29uZmlnTW9kZSwgVUNIQVIgKmNvbmZpZ0NoYW5nZWQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGRvd25zY2FsZUZhY3Rvcik7CiAKIC8qKgogICogXGJyaWVmICAgICAgICBTZXQgYSBwYXJhbWV0ZXIgb2YgdGhlIFNCUiBkZWNvZGVyIHJ1bnRpbWUgaW5zdGFuY2UuCkBAIC0yMTcsMzIgKzI3MSwzMiBAQAogICogXHBhcmFtIHZhbHVlICBOZXcgcGFyYW1ldGVyIHZhbHVlLgogICogXHJldHVybiAgICAgICBFcnJvciBjb2RlLgogICovCi1TQlJfRVJST1Igc2JyRGVjb2Rlcl9TZXRQYXJhbSAoIEhBTkRMRV9TQlJERUNPREVSICAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0JSREVDX1BBUkFNICBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICB2YWx1ZSApOworU0JSX0VSUk9SIHNickRlY29kZXJfU2V0UGFyYW0oSEFORExFX1NCUkRFQ09ERVIgc2VsZiwgY29uc3QgU0JSREVDX1BBUkFNIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHZhbHVlKTsKIAogLyoqCiAgKiBcYnJpZWYgIEZlZWQgRFJDIGNoYW5uZWwgZGF0YSBpbnRvIGEgU0JSIGRlY29kZXIgcnVudGltZSBpbnN0YW5jZS4KICAqCiAgKiBccGFyYW0gc2VsZiAgICAgICAgICAgICAgICAgICAgU0JSIGRlY29kZXIgaGFuZGxlLgotICogXHBhcmFtIGNoICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWwgbnVtYmVyIHRvIHdoaWNoIHRoZSBEUkMgZGF0YSBpcyBhc3NvY2lhdGVkIHRvLgorICogXHBhcmFtIGNoICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWwgbnVtYmVyIHRvIHdoaWNoIHRoZSBEUkMgZGF0YSBpcworICogYXNzb2NpYXRlZCB0by4KICAqIFxwYXJhbSBudW1CYW5kcyAgICAgICAgICAgICAgICBOdW1iZXIgb2YgRFJDIGJhbmRzLgotICogXHBhcmFtIHBOZXh0RmFjdF9tYWcgICAgICAgICAgIFBvaW50ZXIgdG8gYSB0YWJsZSB3aXRoIHRoZSBEUkMgZmFjdG9yIG1hZ25pdHVkZXMuCisgKiBccGFyYW0gcE5leHRGYWN0X21hZyAgICAgICAgICAgUG9pbnRlciB0byBhIHRhYmxlIHdpdGggdGhlIERSQyBmYWN0b3IKKyAqIG1hZ25pdHVkZXMuCiAgKiBccGFyYW0gbmV4dEZhY3RfZXhwICAgICAgICAgICAgRXhwb25lbnQgZm9yIGFsbCBEUkMgZmFjdG9ycy4KICAqIFxwYXJhbSBkcmNJbnRlcnBvbGF0aW9uU2NoZW1lICBEUkMgaW50ZXJwb2xhdGlvbiBzY2hlbWUuCi0gKiBccGFyYW0gd2luU2VxdWVuY2UgICAgICAgICAgICAgV2luZG93IHNlcXVlbmNlIGZyb20gY29yZSBjb2RlciAoZWlnaHQgc2hvcnQgb3Igb25lIGxvbmcgd2luZG93KS4KLSAqIFxwYXJhbSBwQmFuZFRvcCAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgdGFibGUgd2l0aCB0aGUgdG9wIGJvcmRlcnMgZm9yIGFsbCBEUkMgYmFuZHMuCisgKiBccGFyYW0gd2luU2VxdWVuY2UgICAgICAgICAgICAgV2luZG93IHNlcXVlbmNlIGZyb20gY29yZSBjb2RlciAoZWlnaHQgc2hvcnQKKyAqIG9yIG9uZSBsb25nIHdpbmRvdykuCisgKiBccGFyYW0gcEJhbmRUb3AgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhIHRhYmxlIHdpdGggdGhlIHRvcCBib3JkZXJzIGZvcgorICogYWxsIERSQyBiYW5kcy4KICAqCiAgKiBccmV0dXJuICBFcnJvciBjb2RlLgogICovCi1TQlJfRVJST1Igc2JyRGVjb2Rlcl9kcmNGZWVkQ2hhbm5lbCAoIEhBTkRMRV9TQlJERUNPREVSICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgY2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICBudW1CYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgICAgKnBOZXh0RmFjdF9tYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICBuZXh0RmFjdF9leHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICAgICAgICAgICAgICBkcmNJbnRlcnBvbGF0aW9uU2NoZW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgd2luU2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgICpwQmFuZFRvcCApOworU0JSX0VSUk9SIHNickRlY29kZXJfZHJjRmVlZENoYW5uZWwoSEFORExFX1NCUkRFQ09ERVIgc2VsZiwgSU5UIGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBudW1CYW5kcywgRklYUF9EQkwgKnBOZXh0RmFjdF9tYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbmV4dEZhY3RfZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgZHJjSW50ZXJwb2xhdGlvblNjaGVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIHdpblNlcXVlbmNlLCBVU0hPUlQgKnBCYW5kVG9wKTsKIAogLyoqCiAgKiBcYnJpZWYgIERpc2FibGUgU0JSIERSQyBmb3IgYSBjZXJ0YWluIGNoYW5uZWwuCkBAIC0yNTIsNDIgKzMwNiw0MSBAQAogICoKICAqIFxyZXR1cm4gIE5vbmUuCiAgKi8KLXZvaWQgc2JyRGVjb2Rlcl9kcmNEaXNhYmxlICggSEFORExFX1NCUkRFQ09ERVIgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICBjaCApOwotCit2b2lkIHNickRlY29kZXJfZHJjRGlzYWJsZShIQU5ETEVfU0JSREVDT0RFUiBzZWxmLCBJTlQgY2gpOwogCiAvKioKLSAqIFxicmllZiAgUGFyc2Ugb25lIFNCUiBlbGVtZW50IGRhdGEgZXh0ZW5zaW9uIGRhdGEgYmxvY2suIFRoZSBiaXQgc3RyZWFtIHBvc2l0aW9uIHdpbGwKLSAqICAgICAgICAgYmUgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlIFNCUiBwYXlsb2FkIGJsb2NrLiBUaGUgcmVtYWluaW5nIGJpdHMgd2lsbCBiZSByZXR1cm5lZAotICogICAgICAgICBpbnRvICpjb3VudCBpZiBhIHBheWxvYWQgbGVuZ3RoIGlzIGdpdmVuIChieVBheUxlbiA+IDApLiBJZiBubyBTQlIgcGF5bG9hZCBsZW5ndGggaXMKLSAqICAgICAgICAgZ2l2ZW4gKGJzUGF5TGVuIDwgMCkgdGhlbiB0aGUgYml0IHN0cmVhbSBwb3NpdGlvbiBvbiByZXR1cm4gd2lsbCBiZSByYW5kb20gYWZ0ZXIgdGhpcwotICogICAgICAgICBmdW5jdGlvbiBjYWxsIGluIGNhc2Ugb2YgZXJyb3JzLCBhbmQgYW55IGZ1cnRoZXIgZGVjb2Rpbmcgd2lsbCBiZSBjb21wbGV0ZWx5IHBvaW50bGVzcy4KLSAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBhY2NlcHRzIGVpdGhlciBub3JtYWwgb3JkZXJlZCBTQlIgZGF0YSBvciByZXZlcnNlIG9yZGVyZWQgRFJNIFNCUiBkYXRhLgorICogXGJyaWVmICBQYXJzZSBvbmUgU0JSIGVsZW1lbnQgZGF0YSBleHRlbnNpb24gZGF0YSBibG9jay4gVGhlIGJpdCBzdHJlYW0KKyAqIHBvc2l0aW9uIHdpbGwgYmUgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlIFNCUiBwYXlsb2FkIGJsb2NrLiBUaGUgcmVtYWluaW5nCisgKiBiaXRzIHdpbGwgYmUgcmV0dXJuZWQgaW50byAqY291bnQgaWYgYSBwYXlsb2FkIGxlbmd0aCBpcyBnaXZlbgorICogKGJ5UGF5TGVuID4gMCkuIElmIG5vIFNCUiBwYXlsb2FkIGxlbmd0aCBpcyBnaXZlbiAoYnNQYXlMZW4gPCAwKSB0aGVuCisgKiB0aGUgYml0IHN0cmVhbSBwb3NpdGlvbiBvbiByZXR1cm4gd2lsbCBiZSByYW5kb20gYWZ0ZXIgdGhpcyBmdW5jdGlvbgorICogY2FsbCBpbiBjYXNlIG9mIGVycm9ycywgYW5kIGFueSBmdXJ0aGVyIGRlY29kaW5nIHdpbGwgYmUgY29tcGxldGVseQorICogcG9pbnRsZXNzLiBUaGlzIGZ1bmN0aW9uIGFjY2VwdHMgZWl0aGVyIG5vcm1hbCBvcmRlcmVkIFNCUiBkYXRhIG9yIHJldmVyc2UKKyAqIG9yZGVyZWQgRFJNIFNCUiBkYXRhLgogICoKICAqIFxwYXJhbSBzZWxmICAgICAgICAgICBTQlIgZGVjb2RlciBoYW5kbGUuCiAgKiBccGFyYW0gaEJzICAgICAgICAgICAgQml0IHN0cmVhbSBoYW5kbGUgYXMgZGF0YSBzb3VyY2UuCi0gKiBccGFyYW0gY291bnQgICAgICAgICAgUG9pbnRlciB0byBhbiBpbnRlZ2VyIHdoZXJlIHRoZSBhbW91bnQgb2YgcGFyc2VkIFNCUiBwYXlsb2FkIGJpdHMgaXMgc3RvcmVkIGludG8uCi0gKiBccGFyYW0gYnNQYXlMZW4gICAgICAgSWYgPiAwIHRoaXMgdmFsdWUgaXMgdGhlIFNCUiBwYXlsb2FkIGxlbmd0aC4gSWYgPCAwLCB0aGUgU0JSIHBheWxvYWQgbGVuZ3RoIGlzIHVua25vd24uCisgKiBccGFyYW0gY291bnQgICAgICAgICAgUG9pbnRlciB0byBhbiBpbnRlZ2VyIHdoZXJlIHRoZSBhbW91bnQgb2YgcGFyc2VkIFNCUgorICogcGF5bG9hZCBiaXRzIGlzIHN0b3JlZCBpbnRvLgorICogXHBhcmFtIGJzUGF5TGVuICAgICAgIElmID4gMCB0aGlzIHZhbHVlIGlzIHRoZSBTQlIgcGF5bG9hZCBsZW5ndGguIElmIDwgMCwKKyAqIHRoZSBTQlIgcGF5bG9hZCBsZW5ndGggaXMgdW5rbm93bi4KICAqIFxwYXJhbSBmbGFncyAgICAgICAgICBDUkMgZmxhZyAoMDogRVhUX1NCUl9EQVRBOyAxOiBFWFRfU0JSX0RBVEFfQ1JDKQogICogXHBhcmFtIHByZXZfZWxlbWVudCAgIFByZXZpb3VzIE1QRUctNCBlbGVtZW50IElELgogICogXHBhcmFtIGVsZW1lbnRfaW5kZXggIEluZGV4IG9mIHRoZSBjdXJyZW50IGVsZW1lbnQuCisgKiBccGFyYW0gYWNGbGFncyAgICAgICAgQXVkaW8gY29kZWMgZmxhZ3MKICAqCiAgKiBccmV0dXJuICBFcnJvciBjb2RlLgogICovCi1TQlJfRVJST1Igc2JyRGVjb2Rlcl9QYXJzZSAoCi0gICAgICAgIEhBTkRMRV9TQlJERUNPREVSICBzZWxmLAotICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCi0gICAgICAgIGludCAqY291bnQsCi0gICAgICAgIGludCAgYnNQYXlMZW4sCi0gICAgICAgIGludCAgY3JjRmxhZywKLSAgICAgICAgTVA0X0VMRU1FTlRfSUQgcHJldl9lbGVtZW50LAotICAgICAgICBpbnQgZWxlbWVudF9pbmRleCwKLSAgICAgICAgaW50IGZHbG9iYWxJbmRlcGVuZGVuY3lGbGFnCi0gICAgICAgICk7CitTQlJfRVJST1Igc2JyRGVjb2Rlcl9QYXJzZShIQU5ETEVfU0JSREVDT0RFUiBzZWxmLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcERybUJzQnVmZmVyLCBVU0hPUlQgZHJtQnNCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb3VudCwgaW50IGJzUGF5TGVuLCBpbnQgY3JjRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QNF9FTEVNRU5UX0lEIHByZXZfZWxlbWVudCwgaW50IGVsZW1lbnRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGFjRmxhZ3MsIFVJTlQgYWNFbEZsYWdzW10pOwogCiAvKioKLSAqIFxicmllZiAgVGhpcyBmdW5jdGlvbiBkZWNvZGVzIHRoZSBnaXZlbiBTQlIgYml0c3RyZWFtcyBhbmQgYXBwbGllcyBTQlIgdG8gdGhlIGdpdmVuIHRpbWUgZGF0YS4KLSAqIAorICogXGJyaWVmICBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgdGhlIGdpdmVuIFNCUiBiaXRzdHJlYW1zIGFuZCBhcHBsaWVzIFNCUiB0byB0aGUKKyAqIGdpdmVuIHRpbWUgZGF0YS4KKyAqCiAgKiBTQlItcHJvY2Vzc2luZyB3b3JrcyBJblBsYWNlLiBJLmUuIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGhhcyB0byBwcm92aWRlCiAgKiBhIHRpbWUgZG9tYWluIGJ1ZmZlciB0aW1lRGF0YSB3aGljaCBjYW4gaG9sZCB0aGUgY29tcGxldGVseSBkZWNvZGVkCiAgKiByZXN1bHQuCkBAIC0yOTcsNDggKzM1MCw0OSBAQAogICoKICAqIFxwYXJhbSBzZWxmICAgICAgICAgICAgSGFuZGxlIG9mIGFuIG9wZW4gU0JSIGRlY29kZXIgaW5zdGFuY2UuCiAgKiBccGFyYW0gaFNickJzICAgICAgICAgIFNCUiBCaXRzdHJlYW0gaGFuZGxlLgotICogXHBhcmFtIHRpbWVEYXRhICAgICAgICBQb2ludGVyIHRvIGlucHV0IGFuZCBmaW5hbGx5IHVwc2FtcGxlZCBvdXRwdXQgZGF0YS4KLSAqIFxwYXJhbSBudW1DaGFubmVscyAgICAgUG9pbnRlciB0byBhIGJ1ZmZlciBob2xkaW5nIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaW4gdGltZSBkYXRhIGJ1ZmZlci4KKyAqIFxwYXJhbSBpbnB1dCAgICAgICAgICAgUG9pbnRlciB0byBpbnB1dCBkYXRhLgorICogXHBhcmFtIHRpbWVEYXRhICAgICAgICBQb2ludGVyIHRvIHVwc2FtcGxlZCBvdXRwdXQgZGF0YS4KKyAqIFxwYXJhbSB0aW1lRGF0YVNpemUgICAgU2l6ZSBvZiB0aW1lRGF0YS4KKyAqIFxwYXJhbSBudW1DaGFubmVscyAgICAgUG9pbnRlciB0byBhIGJ1ZmZlciBob2xkaW5nIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaW4KKyAqIHRpbWUgZGF0YSBidWZmZXIuCiAgKiBccGFyYW0gc2FtcGxlUmF0ZSAgICAgIE91dHB1dCBzYW1wbGVyYXRlLgogICogXHBhcmFtIGNoYW5uZWxNYXBwaW5nICBDaGFubmVsIG1hcHBpbmcgaW5kaWNlcy4KLSAqIFxwYXJhbSBpbnRlcmxlYXZlZCAgICAgRmxhZyBpbmRpY2F0aW5nIGlmIHRpbWUgZGF0YSBpcyBzdG9yZWQgaW50ZXJsZWF2ZWQgKDE6IEludGVybGVhdmVkIHRpbWUgZGF0YSwgMDogbm9uLWludGVybGVhdmVkIHRpbWVkYXRhKS4KLSAqIFxwYXJhbSBjb3JlRGVjb2RlZE9rICAgRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBjb3JlIGRlY29kZXIgZGlkIG5vdCBmaW5kIGFueSBlcnJvciAoMDogY29yZSBkZWNvZGVyIGZvdW5kIGVycm9ycywgMTogbm8gZXJyb3JzKS4KLSAqIFxwYXJhbSBwc0RlY29kZWQgICAgICAgUG9pbnRlciB0byBhIGJ1ZmZlciBob2xkaW5nIGEgZmxhZy4gSW5wdXQ6IFBTIGlzIHBvc3NpYmxlLCBPdXRwdXQ6IFBTIGhhcyBiZWVuIHJlbmRlcmVkLgorICogXHBhcmFtIGNvcmVEZWNvZGVkT2sgICBGbGFnIGluZGljYXRpbmcgaWYgdGhlIGNvcmUgZGVjb2RlciBkaWQgbm90IGZpbmQgYW55CisgKiBlcnJvciAoMDogY29yZSBkZWNvZGVyIGZvdW5kIGVycm9ycywgMTogbm8gZXJyb3JzKS4KKyAqIFxwYXJhbSBwc0RlY29kZWQgICAgICAgUG9pbnRlciB0byBhIGJ1ZmZlciBob2xkaW5nIGEgZmxhZy4gSW5wdXQ6IFBTIGlzCisgKiBwb3NzaWJsZSwgT3V0cHV0OiBQUyBoYXMgYmVlbiByZW5kZXJlZC4KICAqCiAgKiBccmV0dXJuICBFcnJvciBjb2RlLgogICovCi1TQlJfRVJST1Igc2JyRGVjb2Rlcl9BcHBseSAoIEhBTkRMRV9TQlJERUNPREVSICAgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgICAgICAgKnRpbWVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICpudW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgICAgICAgICAgY2hhbm5lbE1hcHBpbmdbKDgpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgaW50ZXJsZWF2ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIGNvcmVEZWNvZGVkT2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICAgKnBzRGVjb2RlZCApOwotCitTQlJfRVJST1Igc2JyRGVjb2Rlcl9BcHBseShIQU5ETEVfU0JSREVDT0RFUiBzZWxmLCBJTlRfUENNICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKnRpbWVEYXRhLCBjb25zdCBpbnQgdGltZURhdGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpudW1DaGFubmVscywgaW50ICpzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkRLX2NoYW5uZWxNYXBEZXNjciAqY29uc3QgbWFwRGVzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbWFwSWR4LCBjb25zdCBpbnQgY29yZURlY29kZWRPaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwc0RlY29kZWQpOwogCiAvKioKICAqIFxicmllZiAgICAgICBDbG9zZSBTQlIgZGVjb2RlciBpbnN0YW5jZSBhbmQgZnJlZSBtZW1vcnkuCiAgKiBccGFyYW0gc2VsZiAgU0JSIGRlY29kZXIgaGFuZGxlLgogICogXHJldHVybiAgICAgIEVycm9yIENvZGUuCiAgKi8KLVNCUl9FUlJPUiBzYnJEZWNvZGVyX0Nsb3NlICggSEFORExFX1NCUkRFQ09ERVIgKnNlbGYgKTsKLQorU0JSX0VSUk9SIHNickRlY29kZXJfQ2xvc2UoSEFORExFX1NCUkRFQ09ERVIgKnNlbGYpOwogCiAvKioKICAqIFxicmllZiAgICAgICBHZXQgU0JSIGRlY29kZXIgbGlicmFyeSBpbmZvcm1hdGlvbi4KLSAqIFxwYXJhbSBpbmZvICBQb2ludGVyIHRvIGEgTElCX0lORk8gc3RydWN0LCB3aGVyZSBsaWJyYXJ5IGluZm9ybWF0aW9uIGlzIHdyaXR0ZW4gdG8uCi0gKiBccmV0dXJuICAgICAgMCBvbiBzdWNjZXNzLCAtMSBpZiBpbnZhbGlkIGhhbmRsZSBvciBpZiBubyBmcmVlIGVsZW1lbnQgaXMgYXZhaWxhYmxlIHRvIHdyaXRlIGluZm9ybWF0aW9uIHRvLgorICogXHBhcmFtIGluZm8gIFBvaW50ZXIgdG8gYSBMSUJfSU5GTyBzdHJ1Y3QsIHdoZXJlIGxpYnJhcnkgaW5mb3JtYXRpb24gaXMKKyAqIHdyaXR0ZW4gdG8uCisgKiBccmV0dXJuICAgICAgMCBvbiBzdWNjZXNzLCAtMSBpZiBpbnZhbGlkIGhhbmRsZSBvciBpZiBubyBmcmVlIGVsZW1lbnQgaXMKKyAqIGF2YWlsYWJsZSB0byB3cml0ZSBpbmZvcm1hdGlvbiB0by4KICAqLwotSU5UIHNickRlY29kZXJfR2V0TGliSW5mbyggTElCX0lORk8gKmluZm8gKTsgICAgCitJTlQgc2JyRGVjb2Rlcl9HZXRMaWJJbmZvKExJQl9JTkZPICppbmZvKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICAgRGV0ZXJtaW5lIHRoZSBtb2R1bGVzIG91dHB1dCBzaWduYWwgZGVsYXkgaW4gc2FtcGxlcy4KICAqIFxwYXJhbSBzZWxmICBTQlIgZGVjb2RlciBoYW5kbGUuCiAgKiBccmV0dXJuICAgICAgVGhlIG51bWJlciBvZiBzYW1wbGVzIHNpZ25hbCBkZWxheSBhZGRlZCBieSB0aGUgbW9kdWxlLgogICovCi1VSU5UIHNickRlY29kZXJfR2V0RGVsYXkoIGNvbnN0IEhBTkRMRV9TQlJERUNPREVSIHNlbGYgKTsKLQorVUlOVCBzYnJEZWNvZGVyX0dldERlbGF5KGNvbnN0IEhBTkRMRV9TQlJERUNPREVSIHNlbGYpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvSEZnZW5fcHJlRmxhdC5jcHAgYi9saWJTQlJkZWMvc3JjL0hGZ2VuX3ByZUZsYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YWRiYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQlJkZWMvc3JjL0hGZ2VuX3ByZUZsYXQuY3BwCkBAIC0wLDAgKzEsOTkzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBPbGl2ZXIgTW9zZXIsIE1hbnVlbCBKYW5kZXIsIE1hdHRoaWFzIEhpbGRlbmJyYW5kCisKKyAgIERlc2NyaXB0aW9uOiBRTUYgZnJlcXVlbmN5IHByZS13aGl0ZW5pbmcgZm9yIFNCUi4KKyAgICAgICAgICAgICAgICBJbiB0aGUgZG9jdW1lbnRhdGlvbiB0aGUgdGVybXMgInNjYWxlIGZhY3RvciIgYW5kICJleHBvbmVudCIKKyAgICAgICAgICAgICAgICBtZWFuIHRoZSBzYW1lLiBWYXJpYWJsZXMgY29udGFpbmluZyBzdWNoIGluZm9ybWF0aW9uIGhhdmUKKyAgICAgICAgICAgICAgICB0aGUgc3VmZml4ICJfc2YiLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiSEZnZW5fcHJlRmxhdC5oIgorCisjZGVmaW5lIFBPTFlfT1JERVIgMworI2RlZmluZSBNQVhMT1dCQU5EUyAzMgorI2RlZmluZSBMT0cxMEZBQyAwLjc1MjU3NDk4OTE1OTk1M2YgICAgIC8qID09IDEwL2xvZzIoMTApICogMl4tMiAqLworI2RlZmluZSBMT0cxMEZBQ19JTlYgMC42NjQzODU2MTg5Nzc0NzJmIC8qID09IGxvZzIoMTApLzIwICogMl4yICAqLworCisjZGVmaW5lIEZJWFBfQ0hCIEZJWFBfU0dMIC8qIFNUQiBzaW51cyBUYWIgdXNlZCBpbiB0cmFuc2Zvcm1hdGlvbiAqLworI2RlZmluZSBDSEMoYSkgKEZYX0RCTDJGWENPTlNUX1NHTChhKSkKKyNkZWZpbmUgRlhfQ0hCMkZYX0RCTChhKSBGWF9TR0wyRlhfREJMKGEpCisKK3R5cGVkZWYgc3RydWN0IGJhY2tzdWJzdF9kYXRhIHsKKyAgRklYUF9DSEIgTG5vcm0xZFszXTsgLyohPCBOb3JtYWxpemVkIEwgbWF0cml4ICovCisgIFNDSEFSIExub3JtMWRfc2ZbM107CisgIEZJWFBfQ0hCIExub3JtaWkKKyAgICAgIFszXTsgLyohPCBUaGUgZGlhZ29uYWwgZGF0YSBwb2ludHMgW2ldW2ldIG9mIHRoZSBub3JtYWxpemVkIEwgbWF0cml4ICovCisgIFNDSEFSIExub3JtaWlfc2ZbM107CisgIEZJWFBfQ0hCIEJtdWwwCisgICAgICBbNF07IC8qITwgVG8gbm9ybWFsaXplIEwqeD1iLCBCbXVsMCBpcyB3aGF0IHdlIG5lZWQgdG8gbXVsdGlwbHkgYiB3aXRoLiAqLworICBTQ0hBUiBCbXVsMF9zZls0XTsKKyAgRklYUF9DSEIgTG5vcm1JbnYxZFs2XTsgLyohPCBOb3JtYWxpemVkIGludmVydGVkIEwgbWF0cml4IChMJykgKi8KKyAgU0NIQVIgTG5vcm1JbnYxZF9zZls2XTsKKyAgRklYUF9DSEIKKyAgQm11bDFbNF07IC8qITwgVG8gbm9ybWFsaXplIEwnKng9YiwgQm11bDEgaXMgd2hhdCB3ZSBuZWVkIHRvIG11bHRpcGx5IGIKKyAgICAgICAgICAgICAgIHdpdGguICovCisgIFNDSEFSIEJtdWwxX3NmWzRdOworfSBiYWNrc3Vic3RfZGF0YTsKKworLyogZm9yIGVhY2ggZWxlbWVudCBuIGRvLCBmKG4pID0gdHJ1bmMobG9nMihuKSkrMSAgKi8KK2NvbnN0IFVDSEFSIGdldExvZzJbMzJdID0gezAsIDEsIDIsIDIsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1fTsKKworLyoqIFxkZWYgIEJTRF9JRFhfT0ZGU0VUCisgKgorICogIGJzZFtdIGJlZ2lucyBhdCBpbmRleCAwIHdpdGggZGF0YSBmb3IgbnVtQmFuZHM9NS4gVGhlIGNvcnJlY3QgYnNkW10gaXMKKyAqICBpbmRleGVkIGxpa2UgYnNkW251bUJhbmRzLUJTRF9JRFhfT0ZGU0VUXS4KKyAqLworI2RlZmluZSBCU0RfSURYX09GRlNFVCA1CisKKyNkZWZpbmUgTl9OVU1CQU5EUyAgICAgICAgICAgICAgIFwKKyAgTUFYTE9XQkFORFMgLSBCU0RfSURYX09GRlNFVCArIFwKKyAgICAgIDEgLyohPCBOdW1iZXIgb2YgYmFja3N1YnN0X2RhdGEgZWxlbWVudHMgaW4gYnNkICovCisKK2NvbnN0IGJhY2tzdWJzdF9kYXRhIGJzZFtOX05VTUJBTkRTXSA9IHsKKyAgICB7CisgICAgICAgIC8qIG51bUJhbmRzPTUgKi8KKyAgICAgICAge0NIQygweDY2Yzg1YTUyKSwgQ0hDKDB4NDI3OGU1ODcpLCBDSEMoMHg2OTdkY2FmZil9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NjZhNjE3ODkpLCBDSEMoMHg1MjUzYjhlMyksIENIQygweDVhZGRhZDgxKX0sCisgICAgICAgIHszLCA0LCAxfSwKKyAgICAgICAge0NIQygweDc1MjVlZTkwKSwgQ0hDKDB4NmUyYTEyMTApLCBDSEMoMHg2NTIzYmI0MCksIENIQygweDU5ODIyZWFkKX0sCisgICAgICAgIHstNiwgLTQsIC0yLCAwfSwKKyAgICAgICAge0NIQygweDYwOWU0Y2FkKSwgQ0hDKDB4NTljN2UzMTIpLCBDSEMoMHg2ODFlZWNhYyksIENIQygweDQ0MGVhODkzKSwKKyAgICAgICAgIENIQygweDRhMjE0YmIzKSwgQ0hDKDB4NTNjMzQ1YTEpfSwKKyAgICAgICAgezEsIDAsIC0xLCAtMSwgLTMsIC01fSwKKyAgICAgICAge0NIQygweDc1MjVlZTkwKSwgQ0hDKDB4NTg1ODc5MzYpLCBDSEMoMHg0MTBkMGIzOCksIENIQygweDdmMTUxOWQ2KX0sCisgICAgICAgIHstNiwgLTEsIDIsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz02ICovCisgICAgICAgIHtDSEMoMHg2ODk0MzI4NSksIENIQygweDQ4NDFkMmMzKSwgQ0hDKDB4NmE2MjE0YzcpfSwKKyAgICAgICAgey0xLCAwLCAwfSwKKyAgICAgICAge0NIQygweDYzYzU5MjNlKSwgQ0hDKDB4NGU5MDZlMTgpLCBDSEMoMHg2Mjg1YWY4YSl9LAorICAgICAgICB7MywgNCwgMX0sCisgICAgICAgIHtDSEMoMHg3MjYzOTQwYiksIENIQygweDQyNGE2OWE1KSwgQ0hDKDB4NGFlODM4M2EpLCBDSEMoMHg1MTdiNzczMCl9LAorICAgICAgICB7LTcsIC00LCAtMiwgMH0sCisgICAgICAgIHtDSEMoMHg1MThhZWU1ZiksIENIQygweDQ4MjNhMDk2KSwgQ0hDKDB4NDM3NjRhMzkpLCBDSEMoMHg2ZTZmYWYyMyksCisgICAgICAgICBDSEMoMHg2MWJiYTQ0ZiksIENIQygweDU5ZDhiMTMyKX0sCisgICAgICAgIHsxLCAwLCAtMSwgLTIsIC00LCAtNn0sCisgICAgICAgIHtDSEMoMHg3MjYzOTQwYiksIENIQygweDY3NTdiZmYyKSwgQ0hDKDB4NWJmNDBmZTApLCBDSEMoMHg3ZDZmNDI5Mil9LAorICAgICAgICB7LTcsIC0yLCAxLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogbnVtQmFuZHM9NyAqLworICAgICAgICB7Q0hDKDB4Njk5YjRjM2MpLCBDSEMoMHg0YjhiNzAyZiksIENIQygweDZhZTUxYTRmKX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg2MjNhN2Y0OSksIENIQygweDRjY2M5MWZjKSwgQ0hDKDB4NjhmMDQ4ZGQpfSwKKyAgICAgICAgezMsIDQsIDF9LAorICAgICAgICB7Q0hDKDB4N2U2ZWJlMTgpLCBDSEMoMHg1NzAxZGFmMiksIENIQygweDc0YTgxOThiKSwgQ0hDKDB4NGIzOTlhYTEpfSwKKyAgICAgICAgey04LCAtNSwgLTMsIDB9LAorICAgICAgICB7Q0hDKDB4NDY0YTY0YTYpLCBDSEMoMHg3OGU0MjYzMyksIENIQygweDVlZTE3NGJhKSwgQ0hDKDB4NWQwMDA4YzgpLAorICAgICAgICAgQ0hDKDB4NDU1Y2ZmMGYpLCBDSEMoMHg2YjkxMDBlNyl9LAorICAgICAgICB7MSwgLTEsIC0yLCAtMiwgLTQsIC03fSwKKyAgICAgICAge0NIQygweDdlNmViZTE4KSwgQ0hDKDB4NDJjNTJlZmUpLCBDSEMoMHg0NWZlNDAxZiksIENIQygweDdiNTgwOGVmKX0sCisgICAgICAgIHstOCwgLTIsIDEsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz04ICovCisgICAgICAgIHtDSEMoMHg2YTNmZDliNCksIENIQygweDRkOTk4MjNmKSwgQ0hDKDB4NmIzNzJhOTQpfSwKKyAgICAgICAgey0xLCAwLCAwfSwKKyAgICAgICAge0NIQygweDYxNGM2ZWY3KSwgQ0hDKDB4NGJkMDY2OTkpLCBDSEMoMHg2ZTU5Y2ZjYSl9LAorICAgICAgICB7MywgNCwgMX0sCisgICAgICAgIHtDSEMoMHg0YzM4OWNjNSksIENIQygweDc5Njg2NjgxKSwgQ0hDKDB4NWUyNTQ0YzIpLCBDSEMoMHg0NjMwNWI0Myl9LAorICAgICAgICB7LTgsIC02LCAtMywgMH0sCisgICAgICAgIHtDSEMoMHg3YjRjYTdjNiksIENIQygweDY4MjcwYWM1KSwgQ0hDKDB4NDY3YzY0NGMpLCBDSEMoMHg1MDVjMWIwZiksCisgICAgICAgICBDSEMoMHg2N2ExNDc3OCksIENIQygweDQ1ODAxNzY3KX0sCisgICAgICAgIHswLCAtMSwgLTIsIC0yLCAtNSwgLTd9LAorICAgICAgICB7Q0hDKDB4NGMzODljYzUpLCBDSEMoMHg1YzQ5OWNlYiksIENIQygweDZmODYzYzlmKSwgQ0hDKDB4NzkwNTliZmMpfSwKKyAgICAgICAgey04LCAtMywgMCwgMH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC8qIG51bUJhbmRzPTkgKi8KKyAgICAgICAge0NIQygweDZhYWQ5OTg4KSwgQ0hDKDB4NGVmOGFjMTgpLCBDSEMoMHg2YjZkZjExNil9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NjBiMTU5YjApLCBDSEMoMHg0YjMzZjc3MiksIENIQygweDcyZjU1NzNkKX0sCisgICAgICAgIHszLCA0LCAxfSwKKyAgICAgICAge0NIQygweDYyMDZjYjE4KSwgQ0hDKDB4NThhN2Q4ZGMpLCBDSEMoMHg0ZTBiMmQwYiksIENIQygweDQyMDdhZDg0KX0sCisgICAgICAgIHstOSwgLTYsIC0zLCAwfSwKKyAgICAgICAge0NIQygweDZkYWRhZGFlKSwgQ0hDKDB4NWI4YjJjZmMpLCBDSEMoMHg2Y2Y2MWRiMiksIENIQygweDQ2YzNjOTBiKSwKKyAgICAgICAgIENIQygweDUwNjMxNGVhKSwgQ0hDKDB4NWYwMzRhY2QpfSwKKyAgICAgICAgezAsIC0xLCAtMywgLTIsIC01LCAtOH0sCisgICAgICAgIHtDSEMoMHg2MjA2Y2IxOCksIENIQygweDQyZjhiOGRlKSwgQ0hDKDB4NWJiNDc3NmYpLCBDSEMoMHg3NjlhY2M3OSl9LAorICAgICAgICB7LTksIC0zLCAwLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogbnVtQmFuZHM9MTAgKi8KKyAgICAgICAge0NIQygweDZhZmE3MjUyKSwgQ0hDKDB4NGZlZWQzZWQpLCBDSEMoMHg2Yjk0NTA0ZCl9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NjA0Njc4OTkpLCBDSEMoMHg0YWNiYWZiYSksIENIQygweDc2ZWIzMjdmKX0sCisgICAgICAgIHszLCA0LCAxfSwKKyAgICAgICAge0NIQygweDQyNDE1YjE1KSwgQ0hDKDB4NDMxMDgwZGEpLCBDSEMoMHg0MjBmMWMzMiksIENIQygweDdkMGMxYWViKX0sCisgICAgICAgIHstOSwgLTYsIC0zLCAtMX0sCisgICAgICAgIHtDSEMoMHg2MmIyYzdhNCksIENIQygweDUxYjA0MGE2KSwgQ0hDKDB4NTZjYWRkYjQpLCBDSEMoMHg3ZTc0YTJjOCksCisgICAgICAgICBDSEMoMHg0MDMwYWRmNSksIENIQygweDQzZDFkYzRmKX0sCisgICAgICAgIHswLCAtMSwgLTMsIC0zLCAtNSwgLTh9LAorICAgICAgICB7Q0hDKDB4NDI0MTViMTUpLCBDSEMoMHg2NGUyOTliMyksIENIQygweDRkMzNiNWU4KSwgQ0hDKDB4NzQyY2VlNWYpfSwKKyAgICAgICAgey05LCAtNCwgMCwgMH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC8qIG51bUJhbmRzPTExICovCisgICAgICAgIHtDSEMoMHg2YjMyNThiYiksIENIQygweDUwYTIxMjMzKSwgQ0hDKDB4NmJiMDNjMTkpfSwKKyAgICAgICAgey0xLCAwLCAwfSwKKyAgICAgICAge0NIQygweDVmZjk5N2M2KSwgQ0hDKDB4NGE4MjcwNmUpLCBDSEMoMHg3YTVhYWUzNil9LAorICAgICAgICB7MywgNCwgMX0sCisgICAgICAgIHtDSEMoMHg1ZDJmYjRmYiksIENIQygweDY4NWJkZGQ4KSwgQ0hDKDB4NzFiNWU5ODMpLCBDSEMoMHg3NzA4YzkwYil9LAorICAgICAgICB7LTEwLCAtNywgLTQsIC0xfSwKKyAgICAgICAge0NIQygweDU5YWNlZWEyKSwgQ0hDKDB4NDljNDI4YTApLCBDSEMoMHg0NmNhNTUyNyksIENIQygweDcyNGJlODg0KSwKKyAgICAgICAgIENIQygweDY4ZTU4NmRhKSwgQ0hDKDB4NjQzNDg1YjYpfSwKKyAgICAgICAgezAsIC0xLCAtMywgLTMsIC02LCAtOX0sCisgICAgICAgIHtDSEMoMHg1ZDJmYjRmYiksIENIQygweDRlM2ZhZDFhKSwgQ0hDKDB4NDIzMTBiYTIpLCBDSEMoMHg3MWM4YjNjZSl9LAorICAgICAgICB7LTEwLCAtNCwgMCwgMH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC8qIG51bUJhbmRzPTEyICovCisgICAgICAgIHtDSEMoMHg2YjVjNDcyNiksIENIQygweDUxMjhhNGE4KSwgQ0hDKDB4NmJjNTJlZTEpfSwKKyAgICAgICAgey0xLCAwLCAwfSwKKyAgICAgICAge0NIQygweDVmYzA2NjE4KSwgQ0hDKDB4NGE0Y2U1NTkpLCBDSEMoMHg3ZDVjMTZlOSl9LAorICAgICAgICB7MywgNCwgMX0sCisgICAgICAgIHtDSEMoMHg0M2FmODM0MiksIENIQygweDUzMTUzM2QzKSwgQ0hDKDB4NjMzNjYwYTYpLCBDSEMoMHg3MWNlNjA1Mil9LAorICAgICAgICB7LTEwLCAtNywgLTQsIC0xfSwKKyAgICAgICAge0NIQygweDUyMjM3M2Q3KSwgQ0hDKDB4NDM0MTUwY2IpLCBDSEMoMHg3NWI1OGFmYyksIENIQygweDY4NDc0ZjJkKSwKKyAgICAgICAgIENIQygweDU3NTM0OGE1KSwgQ0hDKDB4NGMyMDk3M2YpfSwKKyAgICAgICAgezAsIC0xLCAtNCwgLTMsIC02LCAtOX0sCisgICAgICAgIHtDSEMoMHg0M2FmODM0MiksIENIQygweDdjNGQzZDExKSwgQ0hDKDB4NzMyZTEzZGIpLCBDSEMoMHg2Zjc1NmFjNCl9LAorICAgICAgICB7LTEwLCAtNSwgLTEsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz0xMyAqLworICAgICAgICB7Q0hDKDB4NmI3Yzg5NTMpLCBDSEMoMHg1MTkwM2ZjZCksIENIQygweDZiZDU0ZDJlKX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg1Zjk0YWJmMCksIENIQygweDRhMjQ4MGZhKSwgQ0hDKDB4NDAwMTM1NTMpfSwKKyAgICAgICAgezMsIDQsIDJ9LAorICAgICAgICB7Q0hDKDB4NjUwMTIzNmUpLCBDSEMoMHg0MzZiOWM0ZSksIENIQygweDU3OGQ3ODgxKSwgQ0hDKDB4NmQzNGY5MmUpfSwKKyAgICAgICAgey0xMSwgLTcsIC00LCAtMX0sCisgICAgICAgIHtDSEMoMHg0YmMwZTJiMiksIENIQygweDdiOWQxMmFjKSwgQ0hDKDB4NjM2YzFjMWIpLCBDSEMoMHg1ZmUxNWMyYiksCisgICAgICAgICBDSEMoMHg0OWQ1NDg3OSksIENIQygweDc2NjJjZmE1KX0sCisgICAgICAgIHswLCAtMiwgLTQsIC0zLCAtNiwgLTEwfSwKKyAgICAgICAge0NIQygweDY1MDEyMzZlKSwgQ0hDKDB4NjRiMDU5ZmUpLCBDSEMoMHg2NTZkODM1OSksIENIQygweDZkMzcwOTAwKX0sCisgICAgICAgIHstMTEsIC01LCAtMSwgMH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC8qIG51bUJhbmRzPTE0ICovCisgICAgICAgIHtDSEMoMHg2Yjk1ZTI3NiksIENIQygweDUxZTFiNjM3KSwgQ0hDKDB4NmJlMWY3ZWQpfSwKKyAgICAgICAgey0xLCAwLCAwfSwKKyAgICAgICAge0NIQygweDVmNzI3YTFjKSwgQ0hDKDB4NGEwNTNlOWMpLCBDSEMoMHg0MTJlNTI4Yyl9LAorICAgICAgICB7MywgNCwgMn0sCisgICAgICAgIHtDSEMoMHg0ZDE3OGJkNCksIENIQygweDZmMzNiNGU4KSwgQ0hDKDB4NGUwMjhmN2YpLCBDSEMoMHg2OTFlZTEwNCl9LAorICAgICAgICB7LTExLCAtOCwgLTQsIC0xfSwKKyAgICAgICAge0NIQygweDQ2NDczZDNmKSwgQ0hDKDB4NzI1YmQwYTYpLCBDSEMoMHg1NTE5OTg4NSksIENIQygweDU4YmNjNTZiKSwKKyAgICAgICAgIENIQygweDdlN2U2Mjg4KSwgQ0hDKDB4NWRkZWY2ZWIpfSwKKyAgICAgICAgezAsIC0yLCAtNCwgLTMsIC03LCAtMTB9LAorICAgICAgICB7Q0hDKDB4NGQxNzhiZDQpLCBDSEMoMHg1MmViZDQ2NyksIENIQygweDVhMzk1YTZlKSwgQ0hDKDB4NmIwZjcyNGYpfSwKKyAgICAgICAgey0xMSwgLTUsIC0xLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogbnVtQmFuZHM9MTUgKi8KKyAgICAgICAge0NIQygweDZiYWEyYTIyKSwgQ0hDKDB4NTIyMmViOTEpLCBDSEMoMHg2YmVjMWE4Nil9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NWY1NzM5M2IpLCBDSEMoMHg0OWVjODkzNCksIENIQygweDQyM2I1YjU4KX0sCisgICAgICAgIHszLCA0LCAyfSwKKyAgICAgICAge0NIQygweDc3ZmQyNDg2KSwgQ0hDKDB4NWNmYmRmMmMpLCBDSEMoMHg0NjE1M2JkMSksIENIQygweDY1NzU3ZWQ5KX0sCisgICAgICAgIHstMTIsIC04LCAtNCwgLTF9LAorICAgICAgICB7Q0hDKDB4NDE4ODhlZTYpLCBDSEMoMHg2YTY2MWRiMyksIENIQygweDQ5YWJjOGM4KSwgQ0hDKDB4NTI5NjU4NDgpLAorICAgICAgICAgQ0hDKDB4NmQ5MzAxYjcpLCBDSEMoMHg0YmIwNDcyMSl9LAorICAgICAgICB7MCwgLTIsIC00LCAtMywgLTcsIC0xMH0sCisgICAgICAgIHtDSEMoMHg3N2ZkMjQ4NiksIENIQygweDQ1NDI0YzY4KSwgQ0hDKDB4NTBmMzNjYzYpLCBDSEMoMHg2OGZmNDNmMCl9LAorICAgICAgICB7LTEyLCAtNSwgLTEsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz0xNiAqLworICAgICAgICB7Q0hDKDB4NmJiYWE0OTkpLCBDSEMoMHg1MjU3ZWQ5NCksIENIQygweDZiZjQ1NmU0KX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg1ZjQxMjU5NCksIENIQygweDQ5ZDhhNzY2KSwgQ0hDKDB4NDMyZDFkYmQpfSwKKyAgICAgICAgezMsIDQsIDJ9LAorICAgICAgICB7Q0hDKDB4NWVmNWNmZGUpLCBDSEMoMHg0ZWFmY2QyZCksIENIQygweDdlZDM2ODkzKSwgQ0hDKDB4NjIyNzRiNDUpfSwKKyAgICAgICAgey0xMiwgLTgsIC01LCAtMX0sCisgICAgICAgIHtDSEMoMHg3YWM0MzhmNSksIENIQygweDYzN2FhYjIxKSwgQ0hDKDB4NDA2NzYxN2EpLCBDSEMoMHg0ZDNjNmVjNyksCisgICAgICAgICBDSEMoMHg1ZmQ2ZTBkZCksIENIQygweDdiZDVmMDI0KX0sCisgICAgICAgIHstMSwgLTIsIC00LCAtMywgLTcsIC0xMX0sCisgICAgICAgIHtDSEMoMHg1ZWY1Y2ZkZSksIENIQygweDc1MWQwZDRmKSwgQ0hDKDB4NDkyYjNjNDEpLCBDSEMoMHg2NzA2NTQwOSl9LAorICAgICAgICB7LTEyLCAtNiwgLTEsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz0xNyAqLworICAgICAgICB7Q0hDKDB4NmJjODM2YzkpLCBDSEMoMHg1MjgzOTk3ZSksIENIQygweDZiZmIxZjVlKX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg1ZjJmMDJiNiksIENIQygweDQ5Yzg2OGU5KSwgQ0hDKDB4NDQwNzgxNTEpfSwKKyAgICAgICAgezMsIDQsIDJ9LAorICAgICAgICB7Q0hDKDB4NGM0M2I2NWEpLCBDSEMoMHg0MzQ5ZGNmNiksIENIQygweDczNzk5ZTJkKSwgQ0hDKDB4NWYyNjcyNzQpfSwKKyAgICAgICAgey0xMiwgLTgsIC01LCAtMX0sCisgICAgICAgIHtDSEMoMHg3MzcyNjM5NCksIENIQygweDVkNjg1MTFhKSwgQ0hDKDB4NzE5MWJiY2MpLCBDSEMoMHg0ODg5OGM3MCksCisgICAgICAgICBDSEMoMHg1NDg5NTZlMSksIENIQygweDY2OTgxY2U4KX0sCisgICAgICAgIHstMSwgLTIsIC01LCAtMywgLTcsIC0xMX0sCisgICAgICAgIHtDSEMoMHg0YzQzYjY1YSksIENIQygweDY0MTMxMTE2KSwgQ0hDKDB4NDI5MDI4ZTIpLCBDSEMoMHg2NTI0MDIxMSl9LAorICAgICAgICB7LTEyLCAtNiwgLTEsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz0xOCAqLworICAgICAgICB7Q0hDKDB4NmJkMzg2MGQpLCBDSEMoMHg1MmE4MDE1NiksIENIQygweDZjMDBjNjhkKX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg1ZjFmZWQ4NiksIENIQygweDQ5YmFmNjM2KSwgQ0hDKDB4NDRjZGI5ZGMpfSwKKyAgICAgICAgezMsIDQsIDJ9LAorICAgICAgICB7Q0hDKDB4N2MxODkzODkpLCBDSEMoMHg3NDI2NjZkOCksIENIQygweDY5YjhjNzc2KSwgQ0hDKDB4NWM2N2UyN2QpfSwKKyAgICAgICAgey0xMywgLTksIC01LCAtMX0sCisgICAgICAgIHtDSEMoMHg2Y2YxZWE3NiksIENIQygweDU4MDk1NzAzKSwgQ0hDKDB4NjRlMzUxYTkpLCBDSEMoMHg0NDYwZGE5MCksCisgICAgICAgICBDSEMoMHg0YjFmODA4MyksIENIQygweDU1ZjJkM2UxKX0sCisgICAgICAgIHstMSwgLTIsIC01LCAtMywgLTcsIC0xMX0sCisgICAgICAgIHtDSEMoMHg3YzE4OTM4OSksIENIQygweDU2NTE3OTJhKSwgQ0hDKDB4NzljYjliM2QpLCBDSEMoMHg2MzU3NjljMCl9LAorICAgICAgICB7LTEzLCAtNiwgLTIsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz0xOSAqLworICAgICAgICB7Q0hDKDB4NmJkZDBjNDApLCBDSEMoMHg1MmM2YWJmNiksIENIQygweDZjMDU4OTUwKX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg1ZjEzM2Y4OCksIENIQygweDQ5YWZiMzA1KSwgQ0hDKDB4NDU4MjZkNzMpfSwKKyAgICAgICAgezMsIDQsIDJ9LAorICAgICAgICB7Q0hDKDB4NjYyMWExNjQpLCBDSEMoMHg2NTEyNTI4ZSksIENIQygweDYxNDQ5ZmM4KSwgQ0hDKDB4NTllMmEwYzApfSwKKyAgICAgICAgey0xMywgLTksIC01LCAtMX0sCisgICAgICAgIHtDSEMoMHg2NzIxY2FkYiksIENIQygweDUzNDA0Y2Q0KSwgQ0hDKDB4NWEzODllOTEpLCBDSEMoMHg0MGFiY2JkMiksCisgICAgICAgICBDSEMoMHg0MzMzMmYwMSksIENIQygweDQ4YjgyZTQ2KX0sCisgICAgICAgIHstMSwgLTIsIC01LCAtMywgLTcsIC0xMX0sCisgICAgICAgIHtDSEMoMHg2NjIxYTE2NCksIENIQygweDRiMTJjYzI4KSwgQ0hDKDB4NmZmZDRkZjgpLCBDSEMoMHg2MTlmODM1ZSl9LAorICAgICAgICB7LTEzLCAtNiwgLTIsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz0yMCAqLworICAgICAgICB7Q0hDKDB4NmJlNTI0YzUpLCBDSEMoMHg1MmUwYmViMyksIENIQygweDZjMDk5NTUyKX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg1ZjA4N2M2OCksIENIQygweDQ5YTYyYmI1KSwgQ0hDKDB4NDYyN2QxNzUpfSwKKyAgICAgICAgezMsIDQsIDJ9LAorICAgICAgICB7Q0hDKDB4NTRlYzZhZmUpLCBDSEMoMHg1ODk5MWE0MiksIENIQygweDU5ZTIzZThjKSwgQ0hDKDB4NTc4ZjRlZjQpfSwKKyAgICAgICAgey0xMywgLTksIC01LCAtMX0sCisgICAgICAgIHtDSEMoMHg2MWU3OGY2ZiksIENIQygweDRlZjVlMWU5KSwgQ0hDKDB4NTEyOWMzYjgpLCBDSEMoMHg3YWIwZjdiMiksCisgICAgICAgICBDSEMoMHg3OGVmYjA3NiksIENIQygweDdjMjU2N2VhKX0sCisgICAgICAgIHstMSwgLTIsIC01LCAtNCwgLTgsIC0xMn0sCisgICAgICAgIHtDSEMoMHg1NGVjNmFmZSksIENIQygweDQxYzc4MTJjKSwgQ0hDKDB4Njc2ZjZmOGQpLCBDSEMoMHg1ZmZiMzgzZil9LAorICAgICAgICB7LTEzLCAtNiwgLTIsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz0yMSAqLworICAgICAgICB7Q0hDKDB4NmJlYzE1NDIpLCBDSEMoMHg1MmY3MTkyOSksIENIQygweDZjMGQwZDVlKX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg1ZWZmNDVjNSksIENIQygweDQ5OWUwOTJkKSwgQ0hDKDB4NDZiZmMwYzkpfSwKKyAgICAgICAgezMsIDQsIDJ9LAorICAgICAgICB7Q0hDKDB4NDc0NTdhNzgpLCBDSEMoMHg0ZTJkOTliMyksIENIQygweDUzNjM3ZWE1KSwgQ0hDKDB4NTU2N2QwZTkpfSwKKyAgICAgICAgey0xMywgLTksIC01LCAtMX0sCisgICAgICAgIHtDSEMoMHg1ZDJkYzYxYiksIENIQygweDRiMTc2MGM4KSwgQ0hDKDB4NDk2N2NmMzkpLCBDSEMoMHg3NGIxMTNkOCksCisgICAgICAgICBDSEMoMHg2ZDY2NzZiNiksIENIQygweDZhZDExNGU5KX0sCisgICAgICAgIHstMSwgLTIsIC01LCAtNCwgLTgsIC0xMn0sCisgICAgICAgIHtDSEMoMHg0NzQ1N2E3OCksIENIQygweDc0MGFjY2FhKSwgQ0hDKDB4NWZlYjY2MDkpLCBDSEMoMHg1ZTY5NmY5NSl9LAorICAgICAgICB7LTEzLCAtNywgLTIsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz0yMiAqLworICAgICAgICB7Q0hDKDB4NmJmMjEzODcpLCBDSEMoMHg1MzBhNjgzYyksIENIQygweDZjMTAwYzU5KX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg1ZWY3NTJlYSksIENIQygweDQ5OTcwOGM2KSwgQ0hDKDB4NDc0YmNkMWIpfSwKKyAgICAgICAgezMsIDQsIDJ9LAorICAgICAgICB7Q0hDKDB4NzhhMjFhYjcpLCBDSEMoMHg0NTY1OGFlYyksIENIQygweDRkYTNjNGZlKSwgQ0hDKDB4NTM2NzA5NGIpfSwKKyAgICAgICAgey0xNCwgLTksIC01LCAtMX0sCisgICAgICAgIHtDSEMoMHg1OGUyZGY2YSksIENIQygweDQ3OTU5OTBlKSwgQ0hDKDB4NDJiNWUwZjcpLCBDSEMoMHg2ZjQwOGM2NCksCisgICAgICAgICBDSEMoMHg2MzcwYmViZiksIENIQygweDVjOTFjYTg1KX0sCisgICAgICAgIHstMSwgLTIsIC01LCAtNCwgLTgsIC0xMn0sCisgICAgICAgIHtDSEMoMHg3OGEyMWFiNyksIENIQygweDY2Zjk1MWQ2KSwgQ0hDKDB4NTk0NjA1YmIpLCBDSEMoMHg1Y2U5MTY1Nyl9LAorICAgICAgICB7LTE0LCAtNywgLTIsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz0yMyAqLworICAgICAgICB7Q0hDKDB4NmJmNzQ5YjIpLCBDSEMoMHg1MzFiMzM0OCksIENIQygweDZjMTJhNzUwKX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg1ZWYwNmIxNyksIENIQygweDQ5OTBmNmM5KSwgQ0hDKDB4NDdjZDRjNWIpfSwKKyAgICAgICAgezMsIDQsIDJ9LAorICAgICAgICB7Q0hDKDB4NjZkZWRlMzYpLCBDSEMoMHg3YmRmOTBhOSksIENIQygweDQ4ODViMmI5KSwgQ0hDKDB4NTE4OGE2YjcpfSwKKyAgICAgICAgey0xNCwgLTEwLCAtNSwgLTF9LAorICAgICAgICB7Q0hDKDB4NTRmODU4MTIpLCBDSEMoMHg0NDY0MTRhZSksIENIQygweDc5YzhkNTE5KSwgQ0hDKDB4NmE0YzJmMzEpLAorICAgICAgICAgQ0hDKDB4NWFjODMyNWYpLCBDSEMoMHg1MGJmOTIwMCl9LAorICAgICAgICB7LTEsIC0yLCAtNiwgLTQsIC04LCAtMTJ9LAorICAgICAgICB7Q0hDKDB4NjZkZWRlMzYpLCBDSEMoMHg1YmUwZDkwZSksIENIQygweDUzNWNjNDUzKSwgQ0hDKDB4NWI3OTIzZjApfSwKKyAgICAgICAgey0xNCwgLTcsIC0yLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogbnVtQmFuZHM9MjQgKi8KKyAgICAgICAge0NIQygweDZiZmJkOTFkKSwgQ0hDKDB4NTMyOWU1ODApLCBDSEMoMHg2YzE0ZWVlZCl9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NWVlYTYxNzkpLCBDSEMoMHg0OThiYWE5MCksIENIQygweDQ4NDU2MzVkKX0sCisgICAgICAgIHszLCA0LCAyfSwKKyAgICAgICAge0NIQygweDU4NTU5YjdlKSwgQ0hDKDB4NmYxYjIzMWYpLCBDSEMoMHg0M2YxNzg5YiksIENIQygweDRmYzhmY2I4KX0sCisgICAgICAgIHstMTQsIC0xMCwgLTUsIC0xfSwKKyAgICAgICAge0NIQygweDUxNjIxNzc1KSwgQ0hDKDB4NDE3ODgxYTMpLCBDSEMoMHg2ZjliYTliNiksIENIQygweDY1YzQxMmIyKSwKKyAgICAgICAgIENIQygweDUzMzUyYzYxKSwgQ0hDKDB4NDZkYjljYWYpfSwKKyAgICAgICAgey0xLCAtMiwgLTYsIC00LCAtOCwgLTEyfSwKKyAgICAgICAge0NIQygweDU4NTU5YjdlKSwgQ0hDKDB4NTI2MzYwMDMpLCBDSEMoMHg0ZTEzYjMxNiksIENIQygweDVhMTg5Y2RmKX0sCisgICAgICAgIHstMTQsIC03LCAtMiwgMH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC8qIG51bUJhbmRzPTI1ICovCisgICAgICAgIHtDSEMoMHg2YmZmZGM3MyksIENIQygweDUzMzZkNGFmKSwgQ0hDKDB4NmMxNmYwODQpfSwKKyAgICAgICAgey0xLCAwLCAwfSwKKyAgICAgICAge0NIQygweDVlZTUxMjQ5KSwgQ0hDKDB4NDk4NzAzY2MpLCBDSEMoMHg0OGI1MGU0Zil9LAorICAgICAgICB7MywgNCwgMn0sCisgICAgICAgIHtDSEMoMHg0YzU2MTZjZiksIENIQygweDY0MWI5ZmFkKSwgQ0hDKDB4N2ZhNzM1ZTApLCBDSEMoMHg0ZTI0ZTU3YSl9LAorICAgICAgICB7LTE0LCAtMTAsIC02LCAtMX0sCisgICAgICAgIHtDSEMoMHg0ZTE1ZjQ3YSksIENIQygweDdkOTQ4MWQ2KSwgQ0hDKDB4NjZhODJmOGEpLCBDSEMoMHg2MTlhZTk3MSksCisgICAgICAgICBDSEMoMHg0YzhiMmY1ZiksIENIQygweDdkMDllYzExKX0sCisgICAgICAgIHstMSwgLTMsIC02LCAtNCwgLTgsIC0xM30sCisgICAgICAgIHtDSEMoMHg0YzU2MTZjZiksIENIQygweDRhMzc3MGZiKSwgQ0hDKDB4NDk1NDAyZGUpLCBDSEMoMHg1OGM2OTNmYSl9LAorICAgICAgICB7LTE0LCAtNywgLTIsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz0yNiAqLworICAgICAgICB7Q0hDKDB4NmMwMzY5NDMpLCBDSEMoMHg1MzQyNDYyNSksIENIQygweDZjMThiNmRjKX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg1ZWUwNjBhYSksIENIQygweDQ5ODJlODhhKSwgQ0hDKDB4NDkxZDI3N2YpfSwKKyAgICAgICAgezMsIDQsIDJ9LAorICAgICAgICB7Q0hDKDB4NDI1YWRhNWIpLCBDSEMoMHg1YTkzNjhhYyksIENIQygweDc4MzgwYTQyKSwgQ0hDKDB4NGM5OWFhMDUpfSwKKyAgICAgICAgey0xNCwgLTEwLCAtNiwgLTF9LAorICAgICAgICB7Q0hDKDB4NGIwYjU2OWMpLCBDSEMoMHg3OGE0MjBkYSksIENIQygweDVlYmRmMjAzKSwgQ0hDKDB4NWRjNTdlNjMpLAorICAgICAgICAgQ0hDKDB4NDZhNjUwZmYpLCBDSEMoMHg2ZWUxM2ZiOCl9LAorICAgICAgICB7LTEsIC0zLCAtNiwgLTQsIC04LCAtMTN9LAorICAgICAgICB7Q0hDKDB4NDI1YWRhNWIpLCBDSEMoMHg0MzIzMDczYyksIENIQygweDQ1MGFlOTJiKSwgQ0hDKDB4NTc4MjJhZDUpfSwKKyAgICAgICAgey0xNCwgLTcsIC0yLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogbnVtQmFuZHM9MjcgKi8KKyAgICAgICAge0NIQygweDZjMDY5MTFhKSwgQ0hDKDB4NTM0YzcyNjEpLCBDSEMoMHg2YzFhNGFiYSl9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NWVkYzM1MjQpLCBDSEMoMHg0OTdmNDNjMCksIENIQygweDQ5N2U2Y2Q4KX0sCisgICAgICAgIHszLCA0LCAyfSwKKyAgICAgICAge0NIQygweDczZmI1NTBlKSwgQ0hDKDB4NTI0NDg5NGYpLCBDSEMoMHg3MTdhYWQ3OCksIENIQygweDRiMjRlZjZjKX0sCisgICAgICAgIHstMTUsIC0xMCwgLTYsIC0xfSwKKyAgICAgICAge0NIQygweDQ4M2FlYmU0KSwgQ0hDKDB4NzQxMzkxMTYpLCBDSEMoMHg1N2I1ODAzNyksIENIQygweDVhM2E0ZjNjKSwKKyAgICAgICAgIENIQygweDQxNjk1MGZlKSwgQ0hDKDB4NjJjN2Y0ZjIpfSwKKyAgICAgICAgey0xLCAtMywgLTYsIC00LCAtOCwgLTEzfSwKKyAgICAgICAge0NIQygweDczZmI1NTBlKSwgQ0hDKDB4NzllZmI5OTQpLCBDSEMoMHg0MTI4Y2FiNyksIENIQygweDU2NGE5MTlhKX0sCisgICAgICAgIHstMTUsIC04LCAtMiwgMH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC8qIG51bUJhbmRzPTI4ICovCisgICAgICAgIHtDSEMoMHg2YzA5NjI2NCksIENIQygweDUzNTU4N2NkKSwgQ0hDKDB4NmMxYmIzNTUpfSwKKyAgICAgICAgey0xLCAwLCAwfSwKKyAgICAgICAge0NIQygweDVlZDg3Yzc2KSwgQ0hDKDB4NDk3YzA0MzkpLCBDSEMoMHg0OWQ5ODQ1Mil9LAorICAgICAgICB7MywgNCwgMn0sCisgICAgICAgIHtDSEMoMHg2NWRlYzViZiksIENIQygweDRhZmQxYmEzKSwgQ0hDKDB4NmI1OGI0YjMpLCBDSEMoMHg0OWM0YTdiMCl9LAorICAgICAgICB7LTE1LCAtMTAsIC02LCAtMX0sCisgICAgICAgIHtDSEMoMHg0NTllNmViMSksIENIQygweDZmZDg1MGI3KSwgQ0hDKDB4NTE2ZTdiZTkpLCBDSEMoMHg1NmYxM2QwNSksCisgICAgICAgICBDSEMoMHg3OTc4NTU5NCksIENIQygweDU4NjE3ZGU3KX0sCisgICAgICAgIHstMSwgLTMsIC02LCAtNCwgLTksIC0xM30sCisgICAgICAgIHtDSEMoMHg2NWRlYzViZiksIENIQygweDZmMjE2OGFhKSwgQ0hDKDB4N2I0MTMxMGYpLCBDSEMoMHg1NTFmMDY5Mil9LAorICAgICAgICB7LTE1LCAtOCwgLTMsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvKiBudW1CYW5kcz0yOSAqLworICAgICAgICB7Q0hDKDB4NmMwYmU5MTMpLCBDSEMoMHg1MzVkYWNkNSksIENIQygweDZjMWNmNmEzKX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg1ZWQ1MjZiNCksIENIQygweDQ5NzkxYmM1KSwgQ0hDKDB4NGEyZWZmOTkpfSwKKyAgICAgICAgezMsIDQsIDJ9LAorICAgICAgICB7Q0hDKDB4NTllNDRhZmUpLCBDSEMoMHg0NDk0OWFkYSksIENIQygweDY1YmYzNmY1KSwgQ0hDKDB4NDg3NzA1YTApfSwKKyAgICAgICAgey0xNSwgLTEwLCAtNiwgLTF9LAorICAgICAgICB7Q0hDKDB4NDMzMDc3NzkpLCBDSEMoMHg2YmU5NTljNCksIENIQygweDRiY2UyMTIyKSwgQ0hDKDB4NTNlMzRkODkpLAorICAgICAgICAgQ0hDKDB4NzExNWZmODIpLCBDSEMoMHg0ZjY0MjFhMSl9LAorICAgICAgICB7LTEsIC0zLCAtNiwgLTQsIC05LCAtMTN9LAorICAgICAgICB7Q0hDKDB4NTllNDRhZmUpLCBDSEMoMHg2NTllYWI3ZCksIENIQygweDc0Y2VhNDU5KSwgQ0hDKDB4NTNmZWQ1NzQpfSwKKyAgICAgICAgey0xNSwgLTgsIC0zLCAwfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLyogbnVtQmFuZHM9MzAgKi8KKyAgICAgICAge0NIQygweDZjMGUyZjE3KSwgQ0hDKDB4NTM2NTAxODEpLCBDSEMoMHg2YzFlMTk5ZCl9LAorICAgICAgICB7LTEsIDAsIDB9LAorICAgICAgICB7Q0hDKDB4NWVkMjI2OWYpLCBDSEMoMHg0OTc2N2U5ZSksIENIQygweDRhN2Y1ZjBiKX0sCisgICAgICAgIHszLCA0LCAyfSwKKyAgICAgICAge0NIQygweDRmYWE0YWU2KSwgQ0hDKDB4N2RkM2JmMTEpLCBDSEMoMHg2MDllMjczMiksIENIQygweDQ3M2E3MmU5KX0sCisgICAgICAgIHstMTUsIC0xMSwgLTYsIC0xfSwKKyAgICAgICAge0NIQygweDQwZWM1N2M2KSwgQ0hDKDB4NjgzZWUxNDcpLCBDSEMoMHg0NmJlMjYxZCksIENIQygweDUxMGE3OTgzKSwKKyAgICAgICAgIENIQygweDY5OGE4NGNiKSwgQ0hDKDB4NDc5NGE5MjcpfSwKKyAgICAgICAgey0xLCAtMywgLTYsIC00LCAtOSwgLTEzfSwKKyAgICAgICAge0NIQygweDRmYWE0YWU2KSwgQ0hDKDB4NWQzNjE1YWQpLCBDSEMoMHg2ZWU3NDc3MyksIENIQygweDUyZTk1NmExKX0sCisgICAgICAgIHstMTUsIC04LCAtMywgMH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC8qIG51bUJhbmRzPTMxICovCisgICAgICAgIHtDSEMoMHg2YzEwM2NjOSksIENIQygweDUzNmJhMGFjKSwgQ0hDKDB4NmMxZjIwNzApfSwKKyAgICAgICAgey0xLCAwLCAwfSwKKyAgICAgICAge0NIQygweDVlY2Y3MTFlKSwgQ0hDKDB4NDk3NDIyZWEpLCBDSEMoMHg0YWNiMTQzOCl9LAorICAgICAgICB7MywgNCwgMn0sCisgICAgICAgIHtDSEMoMHg0NmUzMjJhZCksIENIQygweDczYzMyZjNjKSwgQ0hDKDB4NWJlN2QxNzIpLCBDSEMoMHg0NjBkODgwMCl9LAorICAgICAgICB7LTE1LCAtMTEsIC02LCAtMX0sCisgICAgICAgIHtDSEMoMHg3ZDliZjhhZCksIENIQygweDY0ZDIyMzUxKSwgQ0hDKDB4NDIyYmRjODEpLCBDSEMoMHg0ZTYxODRhYSksCisgICAgICAgICBDSEMoMHg2MmJhMjM3NSksIENIQygweDQwYzMyNWRlKX0sCisgICAgICAgIHstMiwgLTMsIC02LCAtNCwgLTksIC0xM30sCisgICAgICAgIHtDSEMoMHg0NmUzMjJhZCksIENIQygweDU1YmVmMmEzKSwgQ0hDKDB4Njk3YjMxMzUpLCBDSEMoMHg1MWRkZWU0ZCl9LAorICAgICAgICB7LTE1LCAtOCwgLTMsIDB9LAorICAgIH0sCisgICAgeworICAgICAgICAvLyBudW1CYW5kcz0zMgorICAgICAgICB7Q0hDKDB4NmMxMjE5MzMpLCBDSEMoMHg1MzcxYTEwNCksIENIQygweDZjMjAwZWEwKX0sCisgICAgICAgIHstMSwgMCwgMH0sCisgICAgICAgIHtDSEMoMHg1ZWNjZmNkMyksIENIQygweDQ5NzIwMDYwKSwgQ0hDKDB4NGIxMjgzZjApfSwKKyAgICAgICAgezMsIDQsIDJ9LAorICAgICAgICB7Q0hDKDB4N2VhMTJhNTIpLCBDSEMoMHg2YWNhMzMwMyksIENIQygweDU3OTA3MmJmKSwgQ0hDKDB4NDRlZjA1NmUpfSwKKyAgICAgICAgey0xNiwgLTExLCAtNiwgLTF9LAorICAgICAgICB7Q0hDKDB4NzlhM2E5YWIpLCBDSEMoMHg2MTlkMzhmYyksIENIQygweDdjMGYwNzM0KSwgQ0hDKDB4NGJlM2RkNWQpLAorICAgICAgICAgQ0hDKDB4NWM4ZDcxNjMpLCBDSEMoMHg3NTkxMDY1Zil9LAorICAgICAgICB7LTIsIC0zLCAtNywgLTQsIC05LCAtMTR9LAorICAgICAgICB7Q0hDKDB4N2VhMTJhNTIpLCBDSEMoMHg0ZjE3ODJhNiksIENIQygweDY0N2NiY2IyKSwgQ0hDKDB4NTBkYzBiYjEpfSwKKyAgICAgICAgey0xNiwgLTgsIC0zLCAwfSwKKyAgICB9LAorfTsKKworLyoqIFxkZWYgIFNVTV9TQUZFVFkKKyAqCisgKiAgU1VNX1NBRlRFWSBkZWZpbmVzIHRoZSBiaXRzIG5lZWRlZCB0byByaWdodC1zaGlmdCBldmVyeSBzdW1tYW5kIGluCisgKiAgb3JkZXIgdG8gYmUgb3ZlcmZsb3ctc2FmZS4gSW4gdGhlIHR3byBiYWNrc3Vic3QgZnVuY3Rpb25zIHdlIHN1bSB1cCA0CisgKiAgdmFsdWVzLiBTaW5jZSBvbmUgb2Ygd2hpY2ggaXMgZGVmaW5pdGVseSBub3QgTUFYVkFMX0RCTCAodGhlIExbeF1beV0pLAorICogIHdlIHNwYXJlIGp1c3QgMiBzYWZldHkgYml0cyBpbnN0ZWFkIG9mIDMuCisgKi8KKyNkZWZpbmUgU1VNX1NBRkVUWSAyCisKKy8qKgorICogXGJyaWVmICBTb2x2ZXMgTCp4PWIgdmlhIGJhY2tzdWJzdGl0dXRpb24gYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcKKyAqIHN0cnVjdHVyZToKKyAqCisgKiAgeFswXSA9ICBiWzBdOworICogIHhbMV0gPSAoYlsxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHhbMF0pIC8gTFsxXVsxXTsKKyAqICB4WzJdID0gKGJbMl0gLSB4WzFdKkxbMl1bMV0gICAgICAgICAgICAgICAgLSB4WzBdKSAvIExbMl1bMl07CisgKiAgeFszXSA9IChiWzNdIC0geFsyXSpMWzNdWzJdIC0geFsxXSpMWzNdWzFdIC0geFswXSkgLyBMWzNdWzNdOworICoKKyAqIFxwYXJhbVtpbl0gIG51bUJhbmRzICBTQlIgY3Jvc3NvdmVyIGJhbmQgaW5kZXgKKyAqIFxwYXJhbVtpbl0gIGIgICAgICAgICB0aGUgYiBpbiBMKng9YiAob25lLWRpbWVuc2lvbmFsKQorICogXHBhcmFtW291dF0geCAgICAgICAgIG91dHB1dCBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyAobWFudGlzc2EpCisgKiBccGFyYW1bb3V0XSB4X3NmICAgICAgZXhwb25lbnRzIG9mIHhbXQorICovCitzdGF0aWMgdm9pZCBiYWNrc3Vic3RfZncoY29uc3QgaW50IG51bUJhbmRzLCBjb25zdCBGSVhQX0RCTCAqY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgeCwgaW50ICpSRVNUUklDVCB4X3NmKSB7CisgIGludCBpLCBrOworICBpbnQgbTsgLyogdGhlIHRyaXAgY291bnRlciB0aGF0IGluZGV4ZXMgaW5jcmVtZW50YWxseSB0aHJvdWdoIExub3JtMWRbXSAqLworCisgIGNvbnN0IEZJWFBfQ0hCICpSRVNUUklDVCBwTG5vcm0xZCA9IGJzZFtudW1CYW5kcyAtIEJTRF9JRFhfT0ZGU0VUXS5Mbm9ybTFkOworICBjb25zdCBTQ0hBUiAqUkVTVFJJQ1QgcExub3JtMWRfc2YgPSBic2RbbnVtQmFuZHMgLSBCU0RfSURYX09GRlNFVF0uTG5vcm0xZF9zZjsKKyAgY29uc3QgRklYUF9DSEIgKlJFU1RSSUNUIHBMbm9ybWlpID0gYnNkW251bUJhbmRzIC0gQlNEX0lEWF9PRkZTRVRdLkxub3JtaWk7CisgIGNvbnN0IFNDSEFSICpSRVNUUklDVCBwTG5vcm1paV9zZiA9IGJzZFtudW1CYW5kcyAtIEJTRF9JRFhfT0ZGU0VUXS5Mbm9ybWlpX3NmOworCisgIHhbMF0gPSBiWzBdOworCisgIGZvciAoaSA9IDEsIG0gPSAwOyBpIDw9IFBPTFlfT1JERVI7ICsraSkgeworICAgIEZJWFBfREJMIHN1bSA9IGJbaV0gPj4gU1VNX1NBRkVUWTsKKyAgICBpbnQgc3VtX3NmID0geF9zZltpXTsKKyAgICBmb3IgKGsgPSBpIC0gMTsgayA+IDA7IC0taywgKyttKSB7CisgICAgICBpbnQgZTsKKyAgICAgIEZJWFBfREJMIG11bHQgPSBmTXVsdE5vcm0oRlhfQ0hCMkZYX0RCTChwTG5vcm0xZFttXSksIHhba10sICZlKTsKKyAgICAgIGludCBtdWx0X3NmID0gcExub3JtMWRfc2ZbbV0gKyB4X3NmW2tdICsgZTsKKworICAgICAgLyogY2hlY2sgaWYgdGhlIG5ldyBzdW1tYW5kIG11bHQgaGFzIGEgZGlmZmVyZW50IHNmIHRoYW4gdGhlIHN1bSBjdXJyZW50bHkKKyAgICAgICAqIGhhcyAqLworICAgICAgaW50IGRpZmYgPSBtdWx0X3NmIC0gc3VtX3NmOworCisgICAgICBpZiAoZGlmZiA+IDApIHsKKyAgICAgICAgLyogeWVzLCBhbmQgaXQgcmVxdWlyZXMgdGhlIHN1bSB0byBiZSBhZGp1c3RlZCAoc2NhbGVkIGRvd24pICovCisgICAgICAgIHN1bSA+Pj0gZGlmZjsKKyAgICAgICAgc3VtX3NmID0gbXVsdF9zZjsKKyAgICAgIH0gZWxzZSBpZiAoZGlmZiA8IDApIHsKKyAgICAgICAgLyogeWVzLCBidXQgaGVyZSBtdWx0IG5lZWRzIHRvIGJlIHNjYWxlZCBkb3duICovCisgICAgICAgIG11bHQgPj49IC1kaWZmOworICAgICAgfQorICAgICAgc3VtIC09IChtdWx0ID4+IFNVTV9TQUZFVFkpOworICAgIH0KKworICAgIC8qIC0geFswXSAqLworICAgIGlmICh4X3NmWzBdID4gc3VtX3NmKSB7CisgICAgICBzdW0gPj49ICh4X3NmWzBdIC0gc3VtX3NmKTsKKyAgICAgIHN1bV9zZiA9IHhfc2ZbMF07CisgICAgfQorICAgIHN1bSAtPSAoeFswXSA+PiAoc3VtX3NmIC0geF9zZlswXSArIFNVTV9TQUZFVFkpKTsKKworICAgIC8qIGluc3RlYWQgb2YgdGhlIGRpdmlzaW9uIC9MW2ldW2ldLCB3ZSBtdWx0aXBseSBieSB0aGUgaW52ZXJzZSAqLworICAgIGludCBlOworICAgIHhbaV0gPSBmTXVsdE5vcm0oc3VtLCBGWF9DSEIyRlhfREJMKHBMbm9ybWlpW2kgLSAxXSksICZlKTsKKyAgICB4X3NmW2ldID0gc3VtX3NmICsgcExub3JtaWlfc2ZbaSAtIDFdICsgZSArIFNVTV9TQUZFVFk7CisgIH0KK30KKworLyoqCisgKiBcYnJpZWYgU29sdmVzIEwqeD1iIHZpYSBiYWNrc3Vic3RpdHV0aW9uIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nCisgKiBzdHJ1Y3R1cmU6CisgKgorICogIHhbM10gPSBiWzNdOworICogIHhbMl0gPSBiWzJdIC0gTFsyXVszXSp4WzNdOworICogIHhbMV0gPSBiWzFdIC0gTFsxXVsyXSp4WzJdIC0gTFsxXVszXSp4WzNdOworICogIHhbMF0gPSBiWzBdIC0gTFswXVsxXSp4WzFdIC0gTFswXVsyXSp4WzJdIC0gTFswXVszXSp4WzNdOworICoKKyAqIFxwYXJhbVtpbl0gIG51bUJhbmRzICBTQlIgY3Jvc3NvdmVyIGJhbmQgaW5kZXgKKyAqIFxwYXJhbVtpbl0gIGIgICAgICAgICB0aGUgYiBpbiBMKng9YiAob25lLWRpbWVuc2lvbmFsKQorICogXHBhcmFtW291dF0geCAgICAgICAgIHNvbHV0aW9uIHZlY3RvcgorICogXHBhcmFtW291dF0geF9zZiAgICAgIGV4cG9uZW50cyBvZiB4W10KKyAqLworc3RhdGljIHZvaWQgYmFja3N1YnN0X2J3KGNvbnN0IGludCBudW1CYW5kcywgY29uc3QgRklYUF9EQkwgKmNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHgsIGludCAqUkVTVFJJQ1QgeF9zZikgeworICBpbnQgaSwgazsKKyAgaW50IG07IC8qIHRoZSB0cmlwIGNvdW50ZXIgdGhhdCBpbmRleGVzIGluY3JlbWVudGFsbHkgdGhyb3VnaCBMbm9ybUludjFkW10gKi8KKworICBjb25zdCBGSVhQX0NIQiAqUkVTVFJJQ1QgcExub3JtSW52MWQgPQorICAgICAgYnNkW251bUJhbmRzIC0gQlNEX0lEWF9PRkZTRVRdLkxub3JtSW52MWQ7CisgIGNvbnN0IFNDSEFSICpSRVNUUklDVCBwTG5vcm1JbnYxZF9zZiA9CisgICAgICBic2RbbnVtQmFuZHMgLSBCU0RfSURYX09GRlNFVF0uTG5vcm1JbnYxZF9zZjsKKworICB4W1BPTFlfT1JERVJdID0gYltQT0xZX09SREVSXTsKKworICBmb3IgKGkgPSBQT0xZX09SREVSIC0gMSwgbSA9IDA7IGkgPj0gMDsgaS0tKSB7CisgICAgRklYUF9EQkwgc3VtID0gYltpXSA+PiBTVU1fU0FGRVRZOworICAgIGludCBzdW1fc2YgPSB4X3NmW2ldOyAvKiBzdW0ncyBzZiBidXQgZGlzcmVnYXJkaW5nIFNVTV9TQUZFVFkgKGFkZGVkIGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb24ncyBlbmQpICovCisKKyAgICBmb3IgKGsgPSBpICsgMTsgayA8PSBQT0xZX09SREVSOyArK2ssICsrbSkgeworICAgICAgaW50IGU7CisgICAgICBGSVhQX0RCTCBtdWx0ID0gZk11bHROb3JtKEZYX0NIQjJGWF9EQkwocExub3JtSW52MWRbbV0pLCB4W2tdLCAmZSk7CisgICAgICBpbnQgbXVsdF9zZiA9IHBMbm9ybUludjFkX3NmW21dICsgeF9zZltrXSArIGU7CisKKyAgICAgIC8qIGNoZWNrIGlmIHRoZSBuZXcgc3VtbWFuZCBtdWx0IGhhcyBhIGRpZmZlcmVudCBzZiB0aGFuIHN1bSBjdXJyZW50bHkgaGFzCisgICAgICAgKi8KKyAgICAgIGludCBkaWZmID0gbXVsdF9zZiAtIHN1bV9zZjsKKworICAgICAgaWYgKGRpZmYgPiAwKSB7CisgICAgICAgIC8qIHllcywgYW5kIGl0IHJlcXVpcmVzIHRoZSBzdW0gdiB0byBiZSBhZGp1c3RlZCAoc2NhbGVkIGRvd24pICovCisgICAgICAgIHN1bSA+Pj0gZGlmZjsKKyAgICAgICAgc3VtX3NmID0gbXVsdF9zZjsKKyAgICAgIH0gZWxzZSBpZiAoZGlmZiA8IDApIHsKKyAgICAgICAgLyogeWVzLCBidXQgaGVyZSBtdWx0IG5lZWRzIHRvIGJlIHNjYWxlZCBkb3duICovCisgICAgICAgIG11bHQgPj49IC1kaWZmOworICAgICAgfQorCisgICAgICAvKiBtdWx0IGhhcyBub3cgdGhlIHNhbWUgc2YgdGhhbiB3aGF0IGl0IGlzIGFib3V0IHRvIGJlIGFkZGVkIHRvLiAqLworICAgICAgLyogc2NhbGUgbXVsdCBkb3duIGFkZGl0aW9uYWxseSBzbyB0aGF0IGJ1aWxkaW5nIHRoZSBzdW0gaXMgb3ZlcmZsb3ctc2FmZS4KKyAgICAgICAqLworICAgICAgc3VtIC09IChtdWx0ID4+IFNVTV9TQUZFVFkpOworICAgIH0KKworICAgIHhfc2ZbaV0gPSBzdW1fc2YgKyBTVU1fU0FGRVRZOworICAgIHhbaV0gPSBzdW07CisgIH0KK30KKworLyoqCisgKiBcYnJpZWYgIFNvbHZlcyBhIHN5c3RlbSBvZiBsaW5lYXIgZXF1YXRpb25zIChMKng9Yikgd2l0aCB0aGUgQ2hvbGVza3kKKyAqIGFsZ29yaXRobS4KKyAqCisgKiBccGFyYW1baW5dICAgICBudW1CYW5kcyAgU0JSIGNyb3Nzb3ZlciBiYW5kIGluZGV4CisgKiBccGFyYW1baW4sb3V0XSBiICAgICAgICAgaW5wdXQ6IHZlY3RvciBiLCBvdXRwdXQ6IHNvbHV0aW9uIHZlY3RvciBwLgorICogXHBhcmFtW2luLG91dF0gYl9zZiAgICAgIGlucHV0OiBleHBvbmVudCBvZiBiOyBvdXRwdXQ6IGV4cG9uZW50IG9mIHNvbHV0aW9uCisgKiBwLgorICovCitzdGF0aWMgdm9pZCBjaG9sZXNreVNvbHZlKGNvbnN0IGludCBudW1CYW5kcywgRklYUF9EQkwgKlJFU1RSSUNUIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqUkVTVFJJQ1QgYl9zZikgeworICBpbnQgaSwgZTsKKworICBjb25zdCBGSVhQX0NIQiAqUkVTVFJJQ1QgcEJtdWwwID0gYnNkW251bUJhbmRzIC0gQlNEX0lEWF9PRkZTRVRdLkJtdWwwOworICBjb25zdCBTQ0hBUiAqUkVTVFJJQ1QgcEJtdWwwX3NmID0gYnNkW251bUJhbmRzIC0gQlNEX0lEWF9PRkZTRVRdLkJtdWwwX3NmOworICBjb25zdCBGSVhQX0NIQiAqUkVTVFJJQ1QgcEJtdWwxID0gYnNkW251bUJhbmRzIC0gQlNEX0lEWF9PRkZTRVRdLkJtdWwxOworICBjb25zdCBTQ0hBUiAqUkVTVFJJQ1QgcEJtdWwxX3NmID0gYnNkW251bUJhbmRzIC0gQlNEX0lEWF9PRkZTRVRdLkJtdWwxX3NmOworCisgIC8qIG5vcm1hbGl6ZSBiICovCisgIEZJWFBfREJMIGJub3JtZWRbUE9MWV9PUkRFUiArIDFdOworICBmb3IgKGkgPSAwOyBpIDw9IFBPTFlfT1JERVI7ICsraSkgeworICAgIGJub3JtZWRbaV0gPSBmTXVsdE5vcm0oYltpXSwgRlhfQ0hCMkZYX0RCTChwQm11bDBbaV0pLCAmZSk7CisgICAgYl9zZltpXSArPSBwQm11bDBfc2ZbaV0gKyBlOworICB9CisKKyAgYmFja3N1YnN0X2Z3KG51bUJhbmRzLCBibm9ybWVkLCBiLCBiX3NmKTsKKworICAvKiBub3JtYWxpemUgYiBhZ2FpbiAqLworICBmb3IgKGkgPSAwOyBpIDw9IFBPTFlfT1JERVI7ICsraSkgeworICAgIGJub3JtZWRbaV0gPSBmTXVsdE5vcm0oYltpXSwgRlhfQ0hCMkZYX0RCTChwQm11bDFbaV0pLCAmZSk7CisgICAgYl9zZltpXSArPSBwQm11bDFfc2ZbaV0gKyBlOworICB9CisKKyAgYmFja3N1YnN0X2J3KG51bUJhbmRzLCBibm9ybWVkLCBiLCBiX3NmKTsKK30KKworLyoqCisgKiBcYnJpZWYgIEZpbmQgcG9seW5vbWlhbCBhcHByb3hpbWF0aW9uIG9mIHZlY3RvciB5IHdpdGggaW1wbGljaXQgYWJzY2lzYXMKKyAqIHg9MCwxLDIsMy4ubi0xCisgKgorICogIFRoZSBwcm9ibGVtIChWXlQgKiBWICogcCA9IFZeVCAqIHkpIGlzIHNvbHZlZCB3aXRoIENob2xlc2t5LgorICogIFYgaXMgdGhlIFZhbmRlcm1vZGUgTWF0cml4IGNvbnN0cnVjdGVkIHdpdGggeCA9IDAuLi5uLTE7CisgKiAgQSA9IFZeVCAqIFY7IGIgPSBWXlQgKiB5OworICoKKyAqIFxwYXJhbVtpbl0gIG51bUJhbmRzICBTQlIgY3Jvc3NvdmVyIGJhbmQgaW5kZXggKEJTRF9JRFhfT0ZGU0VUIDw9IG51bUJhbmRzIDw9CisgKiBNQVhMT1dCQU5EUykKKyAqIFxwYXJhbVtpbl0gIHkgICAgICAgICBpbnB1dCB2ZWN0b3IgKG1hbnRpc3NhKQorICogXHBhcmFtW2luXSAgeV9zZiAgICAgIGV4cG9uZW50cyBvZiB5W10KKyAqIFxwYXJhbVtvdXRdIHAgICAgICAgICBvdXRwdXQgcG9seW5vbWlhbCBjb2VmZmljaWVudHMgKG1hbnRpc3NhKQorICogXHBhcmFtW291dF0gcF9zZiAgICAgIGV4cG9uZW50cyBvZiBwW10KKyAqLworc3RhdGljIHZvaWQgcG9seWZpdChjb25zdCBpbnQgbnVtQmFuZHMsIGNvbnN0IEZJWFBfREJMICpjb25zdCB5LCBjb25zdCBpbnQgeV9zZiwKKyAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHAsIGludCAqUkVTVFJJQ1QgcF9zZikgeworICBpbnQgaSwgazsKKyAgTE9ORyB2W1BPTFlfT1JERVIgKyAxXTsKKyAgaW50IHN1bV9zYWZ0ZXkgPSBnZXRMb2cyW251bUJhbmRzIC0gMV07CisKKyAgRkRLX0FTU0VSVCgobnVtQmFuZHMgPj0gQlNEX0lEWF9PRkZTRVQpICYmIChudW1CYW5kcyA8PSBNQVhMT1dCQU5EUykpOworCisgIC8qIGNvbnN0cnVjdCB2ZWN0b3IgYltdIHRlbXBvcmFyaWx5IHN0b3JlZCBpbiBhcnJheSBwW10gKi8KKyAgRkRLbWVtY2xlYXIocCwgKFBPTFlfT1JERVIgKyAxKSAqIHNpemVvZihGSVhQX0RCTCkpOworCisgIC8qIHBbXSBhcmUgdGhlIHN1bXMgb3ZlciBuIHZhbHVlcyBhbmQgZWFjaCBwW2ldIGhhcyBpdHMgb3duIHNmICovCisgIGZvciAoaSA9IDA7IGkgPD0gUE9MWV9PUkRFUjsgKytpKSBwX3NmW2ldID0gMSAtIERGUkFDVF9CSVRTOworCisgIGZvciAoayA9IDA7IGsgPCBudW1CYW5kczsgaysrKSB7CisgICAgdlswXSA9IChMT05HKTE7CisgICAgZm9yIChpID0gMTsgaSA8PSBQT0xZX09SREVSOyBpKyspIHsKKyAgICAgIHZbaV0gPSBrICogdltpIC0gMV07CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8PSBQT0xZX09SREVSOyBpKyspIHsKKyAgICAgIGlmICh2W1BPTFlfT1JERVIgLSBpXSAhPSAwICYmIHlba10gIT0gRklYUF9EQkwoMCkpIHsKKyAgICAgICAgaW50IGU7CisgICAgICAgIEZJWFBfREJMIG11bHQgPSBmTXVsdE5vcm0oKEZJWFBfREJMKXZbUE9MWV9PUkRFUiAtIGldLCB5W2tdLCAmZSk7CisgICAgICAgIGludCBzZiA9IERGUkFDVF9CSVRTIC0gMSArIHlfc2YgKyBlOworCisgICAgICAgIC8qIGNoZWNrIGlmIHRoZSBuZXcgc3VtbWFuZCBoYXMgYSBkaWZmZXJlbnQgc2YgdGhhbiB0aGUgc3VtIHBbaV0KKyAgICAgICAgICogY3VycmVudGx5IGhhcyAqLworICAgICAgICBpbnQgZGlmZiA9IHNmIC0gcF9zZltpXTsKKworICAgICAgICBpZiAoZGlmZiA+IDApIHsKKyAgICAgICAgICAvKiB5ZXMsIGFuZCBpdCByZXF1aXJlcyB0aGUgc3VtIHBbaV0gdG8gYmUgYWRqdXN0ZWQgKHNjYWxlZCBkb3duKSAqLworICAgICAgICAgIHBbaV0gPj49IGZNaW4oREZSQUNUX0JJVFMgLSAxLCBkaWZmKTsKKyAgICAgICAgICBwX3NmW2ldID0gc2Y7CisgICAgICAgIH0gZWxzZSBpZiAoZGlmZiA8IDApIHsKKyAgICAgICAgICAvKiB5ZXMsIGJ1dCBoZXJlIG11bHQgbmVlZHMgdG8gYmUgc2NhbGVkIGRvd24gKi8KKyAgICAgICAgICBtdWx0ID4+PSAtZGlmZjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG11bHQgaGFzIG5vdyB0aGUgc2FtZSBzZiB0aGFuIHdoYXQgaXQgaXMgYWJvdXQgdG8gYmUgYWRkZWQgdG8uCisgICAgICAgICAgIHNjYWxlIG11bHQgZG93biBhZGRpdGlvbmFsbHkgc28gdGhhdCBidWlsZGluZyB0aGUgc3VtIGlzCisgICAgICAgICAgIG92ZXJmbG93LXNhZmUuICovCisgICAgICAgIHBbaV0gKz0gbXVsdCA+PiBzdW1fc2FmdGV5OworICAgICAgfQorICAgIH0KKyAgfQorCisgIHBfc2ZbMF0gKz0gc3VtX3NhZnRleTsKKyAgcF9zZlsxXSArPSBzdW1fc2FmdGV5OworICBwX3NmWzJdICs9IHN1bV9zYWZ0ZXk7CisgIHBfc2ZbM10gKz0gc3VtX3NhZnRleTsKKworICBjaG9sZXNreVNvbHZlKG51bUJhbmRzLCBwLCBwX3NmKTsKK30KKworLyoqCisgKiBcYnJpZWYgIENhbGN1bGF0ZXMgdGhlIG91dHB1dCBvZiBhIFBPTFlfT1JERVItZGVncmVlIHBvbHlub21pYWwgZnVuY3Rpb24KKyAqICAgICAgICAgd2l0aCBIb3JuZXIgc2NoZW1lOgorICoKKyAqICAgICAgICAgeSh4KSA9IHAzICsgcDIqeCArIHAxKnheMiArIHAwKnheMworICogICAgICAgICAgICAgID0gcDMgKyB4KihwMiArIHgqKHAxICsgeCpwMCkpCisgKgorICogICAgICAgICBUaGUgZm9yIGxvb3AgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgbXVsdC9hZGQgcGFydHMgaW4geSh4KSBhcyBhYm92ZSwKKyAqICAgICAgICAgZHVyaW5nIHdoaWNoIHJlZ3VsYXIgdXBzY2FsaW5nIGVuc3VyZXMgYSBzdGFibGUgZXhwb25lbnQgb2YgdGhlCisgKiAgICAgICAgIHJlc3VsdC4KKyAqCisgKiBccGFyYW1baW5dICBwICAgICAgIGNvZWZmaWNpZW50cyBhcyBpbiB5KHgpCisgKiBccGFyYW1baW5dICBwX3NmICAgIGV4cG9uZW50cyBvZiBwW10KKyAqIFxwYXJhbVtpbl0gIHhfaW50ICAgbm9uLWZyYWN0aW9uYWwgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiB4IGFzIGluIHkoeCkKKyAqIFxwYXJhbVtvdXRdIG91dF9zZiAgZXhwb25lbnQgb2YgcmV0dXJuIHZhbHVlCisgKgorICogXHJldHVybiAgICAgICAgICAgICByZXN1bHQgeSh4KQorICovCitzdGF0aWMgRklYUF9EQkwgcG9seXZhbChjb25zdCBGSVhQX0RCTCAqY29uc3QgcCwgY29uc3QgaW50ICpjb25zdCBwX3NmLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHhfaW50LCBpbnQgKm91dF9zZikgeworICBGREtfQVNTRVJUKHhfaW50IDw9IDMxKTsgLyogb3RoZXJ3aXNlIGdldExvZzJbXSBuZWVkcyBtb3JlIGVsZW1lbnRzICovCisKKyAgaW50IGssIHhfc2Y7CisgIGludCByZXN1bHRfc2Y7ICAgLyogd29ya2luZyBzcGFjZSB0byBjb21wdXRlIHJldHVybiB2YWx1ZSAqb3V0X3NmICovCisgIEZJWFBfREJMIHg7ICAgICAgLyogZnJhY3Rpb25hbCB2YWx1ZSBvZiB4X2ludCAqLworICBGSVhQX0RCTCByZXN1bHQ7IC8qIHJldHVybiB2YWx1ZSAqLworCisgIC8qIGlmIHggPT0gMCwgdGhlbiB5KHgpIGlzIGp1c3QgcDMgKi8KKyAgaWYgKHhfaW50ICE9IDApIHsKKyAgICB4X3NmID0gZ2V0TG9nMlt4X2ludF07CisgICAgeCA9IChGSVhQX0RCTCl4X2ludCA8PCAoREZSQUNUX0JJVFMgLSAxIC0geF9zZik7CisgIH0gZWxzZSB7CisgICAgKm91dF9zZiA9IHBfc2ZbM107CisgICAgcmV0dXJuIHBbM107CisgIH0KKworICByZXN1bHQgPSBwWzBdOworICByZXN1bHRfc2YgPSBwX3NmWzBdOworCisgIGZvciAoayA9IDE7IGsgPD0gUE9MWV9PUkRFUjsgKytrKSB7CisgICAgRklYUF9EQkwgbXVsdCA9IGZNdWx0KHgsIHJlc3VsdCk7CisgICAgaW50IG11bHRfc2YgPSB4X3NmICsgcmVzdWx0X3NmOworCisgICAgaW50IHJvb20gPSBDb3VudExlYWRpbmdCaXRzKG11bHQpOworICAgIG11bHQgPDw9IHJvb207CisgICAgbXVsdF9zZiAtPSByb29tOworCisgICAgRklYUF9EQkwgcHAgPSBwW2tdOworICAgIGludCBwcF9zZiA9IHBfc2Zba107CisKKyAgICAvKiBlcXVhbGl6ZSB0aGUgc2hpZnQgZmFjdG9ycyBvZiBwcCBhbmQgbXVsdCBzbyB0aGF0IHdlIGNhbiBzdW0gdGhlbSB1cCAqLworICAgIGludCBkaWZmID0gcHBfc2YgLSBtdWx0X3NmOworCisgICAgaWYgKGRpZmYgPiAwKSB7CisgICAgICBkaWZmID0gZk1pbihkaWZmLCBERlJBQ1RfQklUUyAtIDEpOworICAgICAgbXVsdCA+Pj0gZGlmZjsKKyAgICB9IGVsc2UgaWYgKGRpZmYgPCAwKSB7CisgICAgICBkaWZmID0gZk1heChkaWZmLCAxIC0gREZSQUNUX0JJVFMpOworICAgICAgcHAgPj49IC1kaWZmOworICAgIH0KKworICAgIC8qIGRvd25zaGlmdCBieSAxIHRvIGVuc3VyZSBzYWZlIHN1bW1hdGlvbiAqLworICAgIG11bHQgPj49IDE7CisgICAgbXVsdF9zZisrOworICAgIHBwID4+PSAxOworICAgIHBwX3NmKys7CisKKyAgICByZXN1bHRfc2YgPSBmTWF4KHBwX3NmLCBtdWx0X3NmKTsKKworICAgIHJlc3VsdCA9IG11bHQgKyBwcDsKKyAgICAvKiByYXJlbHksIG11bHQgYW5kIHBwIGhhcHBlbiB0byBiZSBhbG1vc3QgZXF1YWwgZXhjZXB0IHRoZWlyIHNpZ24sCisgICAgYW5kIHRoZW4gdXBvbiBzdW1tYXRpb24sIHJlc3VsdCBiZWNvbWVzIHNvIHNtYWxsLCB0aGF0IGl0IGlzIHdpdGhpbgorICAgIHRoZSBpbmFjY3VyYWN5IHJhbmdlIG9mIGEgZmV3IGJpdHMsIGFuZCB0aGVuIHRoZSByZWxhdGl2ZSBlcnJvcgorICAgIHByb2R1Y2VkIGJ5IHRoaXMgZnVuY3Rpb24gbWF5IGJlY29tZSBIVUdFICovCisgIH0KKworICAqb3V0X3NmID0gcmVzdWx0X3NmOworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIHNickRlY29kZXJfY2FsY3VsYXRlR2FpblZlYyhGSVhQX0RCTCAqKnNvdXJjZUJ1ZmZlclJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnNvdXJjZUJ1ZmZlckltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlQnVmX2Vfb3ZlcmxhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VCdWZfZV9jdXJyZW50LCBpbnQgb3ZlcmxhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBHYWluVmVjLCBpbnQgKkdhaW5WZWNfZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bUJhbmRzLCBjb25zdCBpbnQgc3RhcnRTYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3RvcFNhbXBsZSkgeworICBGSVhQX0RCTCBwW1BPTFlfT1JERVIgKyAxXTsKKyAgRklYUF9EQkwgbWVhbk5yZzsKKyAgRklYUF9EQkwgTG93RW52W01BWExPV0JBTkRTXTsKKyAgRklYUF9EQkwgaW52TnVtQmFuZHMgPSBHZXRJbnZJbnQobnVtQmFuZHMpOworICBGSVhQX0RCTCBpbnZOdW1TbG90cyA9IEdldEludkludChzdG9wU2FtcGxlIC0gc3RhcnRTYW1wbGUpOworICBpbnQgaSwgbG9CYW5kLCBleHAsIHNjYWxlX25yZywgc2NhbGVfbnJnX292OworICBpbnQgc3VtX3NjYWxlID0gNSwgc3VtX3NjYWxlX292ID0gMzsKKworICBpZiAob3ZlcmxhcCA+IDgpIHsKKyAgICBGREtfQVNTRVJUKG92ZXJsYXAgPD0gMTYpOworICAgIHN1bV9zY2FsZV9vdiArPSAxOworICAgIHN1bV9zY2FsZSArPSAxOworICB9CisKKyAgLyogZXhwb25lbnRzIG9mIGVuZXJneSB2YWx1ZXMgKi8KKyAgc291cmNlQnVmX2Vfb3ZlcmxhcCA9IHNvdXJjZUJ1Zl9lX292ZXJsYXAgKiAyICsgc3VtX3NjYWxlX292OworICBzb3VyY2VCdWZfZV9jdXJyZW50ID0gc291cmNlQnVmX2VfY3VycmVudCAqIDIgKyBzdW1fc2NhbGU7CisgIGV4cCA9IGZNYXgoc291cmNlQnVmX2Vfb3ZlcmxhcCwgc291cmNlQnVmX2VfY3VycmVudCk7CisgIHNjYWxlX25yZyA9IHNvdXJjZUJ1Zl9lX2N1cnJlbnQgLSBleHA7CisgIHNjYWxlX25yZ19vdiA9IHNvdXJjZUJ1Zl9lX292ZXJsYXAgLSBleHA7CisKKyAgbWVhbk5yZyA9IChGSVhQX0RCTCkwOworICAvKiBDYWxjdWxhdGUgdGhlIHNwZWN0cmFsIGVudmVsb3BlIGluIGRCIG92ZXIgdGhlIGN1cnJlbnQgY29weS11cCBmcmFtZS4gKi8KKyAgZm9yIChsb0JhbmQgPSAwOyBsb0JhbmQgPCBudW1CYW5kczsgbG9CYW5kKyspIHsKKyAgICBGSVhQX0RCTCBucmdfb3YsIG5yZzsKKyAgICBJTlQgcmVzZXJ2ZSA9IDAsIGV4cF9uZXc7CisgICAgRklYUF9EQkwgbWF4VmFsID0gRkwyRlhfREJMKDAuMGYpOworCisgICAgZm9yIChpID0gc3RhcnRTYW1wbGU7IGkgPCBzdG9wU2FtcGxlOyBpKyspIHsKKyAgICAgIG1heFZhbCB8PQorICAgICAgICAgIChGSVhQX0RCTCkoKExPTkcpKHNvdXJjZUJ1ZmZlclJlYWxbaV1bbG9CYW5kXSkgXgorICAgICAgICAgICAgICAgICAgICAgKChMT05HKXNvdXJjZUJ1ZmZlclJlYWxbaV1bbG9CYW5kXSA+PiAoU0FNUExFX0JJVFMgLSAxKSkpOworICAgICAgbWF4VmFsIHw9CisgICAgICAgICAgKEZJWFBfREJMKSgoTE9ORykoc291cmNlQnVmZmVySW1hZ1tpXVtsb0JhbmRdKSBeCisgICAgICAgICAgICAgICAgICAgICAoKExPTkcpc291cmNlQnVmZmVySW1hZ1tpXVtsb0JhbmRdID4+IChTQU1QTEVfQklUUyAtIDEpKSk7CisgICAgfQorCisgICAgaWYgKG1heFZhbCAhPSBGTDJGWF9EQkwoMC4wZikpIHsKKyAgICAgIHJlc2VydmUgPSBmaXhNYXgoMCwgQ250TGVhZGluZ1plcm9zKG1heFZhbCkgLSAyKTsKKyAgICB9CisKKyAgICBucmdfb3YgPSBucmcgPSAoRklYUF9EQkwpMDsKKyAgICBpZiAoc2NhbGVfbnJnX292ID4gLTMxKSB7CisgICAgICBmb3IgKGkgPSBzdGFydFNhbXBsZTsgaSA8IG92ZXJsYXA7IGkrKykgeworICAgICAgICBucmdfb3YgKz0gKGZQb3cyRGl2Mihzb3VyY2VCdWZmZXJSZWFsW2ldW2xvQmFuZF0gPDwgcmVzZXJ2ZSkgKworICAgICAgICAgICAgICAgICAgIGZQb3cyRGl2Mihzb3VyY2VCdWZmZXJJbWFnW2ldW2xvQmFuZF0gPDwgcmVzZXJ2ZSkpID4+CisgICAgICAgICAgICAgICAgICBzdW1fc2NhbGVfb3Y7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHNjYWxlX25yZ19vdiA9IDA7CisgICAgfQorICAgIGlmIChzY2FsZV9ucmcgPiAtMzEpIHsKKyAgICAgIGZvciAoaSA9IG92ZXJsYXA7IGkgPCBzdG9wU2FtcGxlOyBpKyspIHsKKyAgICAgICAgbnJnICs9IChmUG93MkRpdjIoc291cmNlQnVmZmVyUmVhbFtpXVtsb0JhbmRdIDw8IHJlc2VydmUpICsKKyAgICAgICAgICAgICAgICBmUG93MkRpdjIoc291cmNlQnVmZmVySW1hZ1tpXVtsb0JhbmRdIDw8IHJlc2VydmUpKSA+PgorICAgICAgICAgICAgICAgc3VtX3NjYWxlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzY2FsZV9ucmcgPSAwOworICAgIH0KKworICAgIG5yZyA9IChzY2FsZVZhbHVlKG5yZ19vdiwgc2NhbGVfbnJnX292KSA+PiAxKSArCisgICAgICAgICAgKHNjYWxlVmFsdWUobnJnLCBzY2FsZV9ucmcpID4+IDEpOworICAgIG5yZyA9IGZNdWx0KG5yZywgaW52TnVtU2xvdHMpOworCisgICAgZXhwX25ldyA9CisgICAgICAgIGV4cCAtICgyICogcmVzZXJ2ZSkgKworICAgICAgICAyOyAvKiArMSBmb3IgYWRkaXRpb24gZGlyZWN0bHkgYWJvdmUsICsxIGZvciBmUG93MkRpdjIgaW4gbG9vcHMgYWJvdmUgKi8KKworICAgIC8qIExvd0VudiA9IDEwKmxvZzEwKG5yZykgPSBsb2cyKG5yZykgKiAxMC9sb2cyKDEwKSAqLworICAgIC8qIGV4cG9uZW50IG9mIGxvZ2FyaXRobWljIGVuZXJneSBpcyA4ICovCisgICAgaWYgKG5yZyA+IChGSVhQX0RCTCkwKSB7CisgICAgICBpbnQgZXhwX2xvZzI7CisgICAgICBucmcgPSBDYWxjTG9nMihucmcsIGV4cF9uZXcsICZleHBfbG9nMik7CisgICAgICBucmcgPSBzY2FsZVZhbHVlKG5yZywgZXhwX2xvZzIgLSA2KTsKKyAgICAgIG5yZyA9IGZNdWx0KEZMMkZYQ09OU1RfU0dMKExPRzEwRkFDKSwgbnJnKTsKKyAgICB9IGVsc2UgeworICAgICAgbnJnID0gKEZJWFBfREJMKTA7CisgICAgfQorICAgIExvd0Vudltsb0JhbmRdID0gbnJnOworICAgIG1lYW5OcmcgKz0gZk11bHQobnJnLCBpbnZOdW1CYW5kcyk7CisgIH0KKyAgZXhwID0gNiArIDI7IC8qIGV4cG9uZW50IG9mIExvd0VudjogKzIgaXMgZXhwb25lbnQgb2YgTE9HMTBGQUMgKi8KKworICAvKiBzdWJ0cmFjdCBtZWFuIGJlZm9yZSBwb2x5bm9taWFsIGFwcHJveGltYXRpb24gdG8gcmVkdWNlIGR5bmFtaWMgb2YgcFtdICovCisgIGZvciAobG9CYW5kID0gMDsgbG9CYW5kIDwgbnVtQmFuZHM7IGxvQmFuZCsrKSB7CisgICAgTG93RW52W2xvQmFuZF0gPSBtZWFuTnJnIC0gTG93RW52W2xvQmFuZF07CisgIH0KKworICAvKiBGb3IgbnVtQmFuZHMgPCBCU0RfSURYX09GRlNFVCAoPT0gUE9MWV9PUkRFUisyKSB3ZSBkb250IGdldCBhbgorICAgICBvdmVyZGV0ZXJtaW5lZCBlcXVhdGlvbiBzeXN0ZW0uIFRoZSBjYWxjdWxhdGVkIHBvbHlub21pYWwgd2lsbCBleGFjdGx5IGZpdAorICAgICB0aGUgaW5wdXQgZGF0YSBhbmQgZXZhbHVhdGluZyB0aGUgcG9seW5vbWlhbCB3aWxsIGxlYWQgdG8gdGhlIHNhbWUgdmVjdG9yCisgICAgIHRoYW4gdGhlIG9yaWdpbmFsIGlucHV0IHZlY3RvcjogbG93RW52U2xvcGVbXSA9PSBsb3dFbnZbXQorICAqLworICBpZiAobnVtQmFuZHMgPiBQT0xZX09SREVSICsgMSkgeworICAgIC8qIEZpbmQgcG9seW5vbWlhbCBhcHByb3hpbWF0aW9uIG9mIExvd0VudiAqLworICAgIGludCBwX3NmW1BPTFlfT1JERVIgKyAxXTsKKworICAgIHBvbHlmaXQobnVtQmFuZHMsIExvd0VudiwgZXhwLCBwLCBwX3NmKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgICBpbnQgc2Y7CisKKyAgICAgIC8qIGxvd0JhbmRFbnZTbG9wZVtpXSA9IHRtcDsgKi8KKyAgICAgIEZJWFBfREJMIHRtcCA9IHBvbHl2YWwocCwgcF9zZiwgaSwgJnNmKTsKKworICAgICAgLyogR2FpblZlYyA9IDEwXigobWVhbih5KS15KS8yMCkgPSAyXiggKG1lYW4oeSkteSkgKiBsb2cyKDEwKS8yMCApICovCisgICAgICB0bXAgPSBmTXVsdCh0bXAsIEZMMkZYQ09OU1RfU0dMKExPRzEwRkFDX0lOVikpOworICAgICAgR2FpblZlY1tpXSA9IGYyUG93KHRtcCwgc2YgLSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICZHYWluVmVjX2V4cFtpXSk7IC8qIC0yIGlzIGV4cG9uZW50IG9mIExPRzEwRkFDX0lOViAqLworICAgIH0KKyAgfSBlbHNlIHsgLyogbnVtQmFuZHMgPD0gUE9MWV9PUkRFUisxICovCisgICAgZm9yIChpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgIGludCBzZiA9IGV4cDsgLyogZXhwb25lbnQgb2YgTG93RW52W10gKi8KKworICAgICAgLyogbG93QmFuZEVudlNsb3BlW2ldID0gTG93RW52W2ldOyAqLworICAgICAgRklYUF9EQkwgdG1wID0gTG93RW52W2ldOworCisgICAgICAvKiBHYWluVmVjID0gMTBeKChtZWFuKHkpLXkpLzIwKSA9IDJeKCAobWVhbih5KS15KSAqIGxvZzIoMTApLzIwICkgKi8KKyAgICAgIHRtcCA9IGZNdWx0KHRtcCwgRkwyRlhDT05TVF9TR0woTE9HMTBGQUNfSU5WKSk7CisgICAgICBHYWluVmVjW2ldID0gZjJQb3codG1wLCBzZiAtIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgJkdhaW5WZWNfZXhwW2ldKTsgLyogLTIgaXMgZXhwb25lbnQgb2YgTE9HMTBGQUNfSU5WICovCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL0hGZ2VuX3ByZUZsYXQuaCBiL2xpYlNCUmRlYy9zcmMvSEZnZW5fcHJlRmxhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZmM0OWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQlJkZWMvc3JjL0hGZ2VuX3ByZUZsYXQuaApAQCAtMCwwICsxLDEzMiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlciwgTWF0dGhpYXMgSGlsZGVuYnJhbmQKKworICAgRGVzY3JpcHRpb246IFFNRiBmcmVxdWVuY3kgcHJlIHdoaXRlbmluZyBmb3IgU0JSCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJjb21tb25fZml4LmgiCisKKyNpZm5kZWYgSEZHRU5fUFJFRkxBVF9ICisjZGVmaW5lIEhGR0VOX1BSRUZMQVRfSAorCisjZGVmaW5lIEdBSU5fVkVDX0VYUCA2IC8qIGV4cG9uZW50IG9mIEdhaW5WZWNbXSAqLworCisvKioKKyAqIFxicmllZiBGaW5kIGdhaW4gdmVjdG9yIHRvIGZsYXR0ZW4gdGhlIFFNRiBmcmVxdWVuY3kgYmFuZHMgd2hpdGhvdXQgbG9vc2luZworICogdGhlIGZpbmUgc3RydWN0dXJlLgorICogXHBhcmFtW2luXSBzb3VyY2VCdWZmZXJSZWFsIHJlYWwgcGFydCBvZiBRTUYgZG9tYWluIGRhdGEuCisgKiBccGFyYW1baW5dIHNvdXJjZUJ1ZmZlckltYWcgaW1hZ2luYXJ5IHBhcnQgb2YgUU1GIGRvbWFpbiBkYXRhLgorICogXHBhcmFtW2luXSBzb3VyY2VCdWZmZXJfZV9vdmVybGFwIGV4cG9uZW50IG9mIHNvdXJjZUJ1ZmZlclJlYWwuCisgKiBccGFyYW1baW5dIHNvdXJjZUJ1ZmZlcl9lX2N1cnJlbnQgZXhwb25lbnQgb2Ygc291cmNlQnVmZmVySW1hZy4KKyAqIFxwYXJhbVtpbl0gb3ZlcmxhcCBudW1iZXIgb2Ygb3ZlcmxhcCBzYW1wbGVzLgorICogXHBhcmFtW291dF0gR2FpblZlYyBhcnJheSBvZiBnYWluIHZhbHVlcyAob25lIGZvciBlYWNoIFFNRiBiYW5kKS4KKyAqIFxwYXJhbVtvdXRdIEdhaW5WZWNfZXhwIGV4cG9uZW50cyBvZiBHYWluVmVjIChvbmUgZm9yIGVhY2ggUU1GIGJhbmQpLgorICogXHBhcmFtW2luXSBudW1CYW5kcyBudW1iZXIgb2YgbG93IGJhbmRzIChrXzApLgorICogXHBhcmFtW2luXSBzdGFydFNhbXBsZSB0aW1lIHNsb3Qgc3RhcnQuCisgKiBccGFyYW1baW5dIHN0b3BTYW1wbGUgdGltZSBzbG90IHN0b3AuCisgKi8KK3ZvaWQgc2JyRGVjb2Rlcl9jYWxjdWxhdGVHYWluVmVjKEZJWFBfREJMICoqc291cmNlQnVmZmVyUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqc291cmNlQnVmZmVySW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VCdWZmZXJfZV9vdmVybGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZUJ1ZmZlcl9lX2N1cnJlbnQsIGludCBvdmVybGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgR2FpblZlY1tdLCBpbnQgR2FpblZlY19leHBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBudW1CYW5kcywgY29uc3QgaW50IHN0YXJ0U2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN0b3BTYW1wbGUpOworCisjZW5kaWYgLyogX19IRkdFTl9QUkVGTEFUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvYXJtL2Vudl9jYWxjX2FybS5jcHAgYi9saWJTQlJkZWMvc3JjL2FybS9lbnZfY2FsY19hcm0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmIxN2Q4Li4wMDAwMDAwCi0tLSBhL2xpYlNCUmRlYy9zcmMvYXJtL2Vudl9jYWxjX2FybS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6ICAgQXJ0aHVyIFRyaXR0aGFydAotICAgRGVzY3JpcHRpb246IChBUk0gb3B0aW1pc2VkKSBTQlIgZG9tYWluIGNvZGluZwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIElOQ0xVU0lPTl9HVUFSRF9DQUxDX0VOVl9BUk0KLSNkZWZpbmUgSU5DTFVTSU9OX0dVQVJEX0NBTENfRU5WX0FSTQotCi0KLS8qIQotICBcYnJpZWYgICBDb21wdXRlIG1heGltYWwgdmFsdWUgb2YgYSBjb21wbGV4IGFycmF5IChyZS9pbSkgb2YgYSBnaXZlbiB3aWR0aAotICAgICAgICAgICBOZWdhdGl2ZSB2YWx1ZXMgYXJlIHRlbXBvcmFyaWx5IGxvZ2ljYWxseSBvcidlZCB3aXRoIDB4RkZGRkZGRkYKLSAgICAgICAgICAgaW5zdGVhZCBvZiBuZWdhdGluZyB0aGUgdmFsdWUsIGlmIHRoZSBzaWduIGJpdCBpcyBzZXQuCi0gIFxwYXJhbSAgIG1heFZhbCAgUHJlc2V0IG1heGltYWwgdmFsdWUKLSAgXHBhcmFtICAgcmVUbXAgICByZWFsIGlucHV0IHNpZ25hbAotICBccGFyYW0gICBpbVRtcCAgIGltYWdpbmFyeSBpbnB1dCBzaWduYWwKLSAgXHJldHVybiAgbmV3IG1heGltYWwgdmFsdWUKLSovCi0KLSNpZmRlZiBGVU5DVElPTl9GREtfZ2V0X21heHZhbAotX19hc20gRklYUF9EQkwgRkRLX2dldF9tYXh2YWwgKEZJWFBfREJMIG1heFZhbCwgRklYUF9EQkwgKnJlVG1wLCBGSVhQX0RCTCAqaW1UbXAsIGludCB3aWR0aCApCi17Ci0KLSAgLyogUmVnaXN0ZXIgbWFwOgotICAgICByMCAgICBtYXhWYWwKLSAgICAgcjEgICAgcmVUbXAKLSAgICAgcjIgICAgaW1UbXAKLSAgICAgcjMgICAgd2lkdGgKLSAgICAgcjQgICAgcmVhbAotICAgICByNSAgICBpbWFnCi0gICovCi0gICAgUFVTSCAgICB7cjQtcjV9Ci0KLSAgICBNT1ZTICAgIHIzLCByMywgQVNSICMxCi0gICAgQURDICAgICByMywgcjMsICMwCi0gICAgQkNTICAgICBGREtfZ2V0X21heHZhbF9sb29wXzJuZF9wYXJ0Ci0gICAgQkVRICAgICBGREtfZ2V0X21heHZhbF9sb29wX2VuZAotCi1GREtfZ2V0X21heHZhbF9sb29wCi0gICAgTERSICAgICByNCwgW3IxXSwgIzQKLSAgICBMRFIgICAgIHI1LCBbcjJdLCAjNAotICAgIEVPUiAgICAgcjQsIHI0LCByNCwgQVNSICMzMQotICAgIEVPUiAgICAgcjUsIHI1LCByNSwgQVNSICMzMQotICAgIE9SUiAgICAgcjAsIHIwLCByNAotICAgIE9SUiAgICAgcjAsIHIwLCByNQotCi1GREtfZ2V0X21heHZhbF9sb29wXzJuZF9wYXJ0Ci0gICAgTERSICAgICByNCwgW3IxXSwgIzQKLSAgICBMRFIgICAgIHI1LCBbcjJdLCAjNAotICAgIEVPUiAgICAgcjQsIHI0LCByNCwgQVNSICMzMQotICAgIEVPUiAgICAgcjUsIHI1LCByNSwgQVNSICMzMQotICAgIE9SUiAgICAgcjAsIHIwLCByNAotICAgIE9SUiAgICAgcjAsIHIwLCByNQotCi0gICAgU1VCUyAgICByMywgcjMsICMxCi0gICAgQk5FICAgICBGREtfZ2V0X21heHZhbF9sb29wCi0KLUZES19nZXRfbWF4dmFsX2xvb3BfZW5kCi0gICAgUE9QICAgICB7cjQtcjV9Ci0gICAgQlggICAgICBscgotfQotI2VuZGlmIC8qIEZVTkNUSU9OX0ZES19nZXRfbWF4dmFsICovCi0KLSNlbmRpZiAvKiBJTkNMVVNJT05fR1VBUkRfQ0FMQ19FTlZfQVJNICovCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL2FybS9scHBfdHJhbl9hcm0uY3BwIGIvbGliU0JSZGVjL3NyYy9hcm0vbHBwX3RyYW5fYXJtLmNwcAppbmRleCA3OGJiYzJjLi5kYjE5NDhmIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL2FybS9scHBfdHJhbl9hcm0uY3BwCisrKyBiL2xpYlNCUmRlYy9zcmMvYXJtL2xwcF90cmFuX2FybS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNzMgKzkwLDcwIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgQXJ0aHVyIFRyaXR0aGFydAorCiAgICBEZXNjcmlwdGlvbjogKEFSTSBvcHRpbWlzZWQpIExQUCB0cmFuc3Bvc2VyIHN1YnJvdXRpbmVzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmIGRlZmluZWQoX19hcm1fXykKIAotCiAjZGVmaW5lIEZVTkNUSU9OX0xQUFRSQU5TUE9TRVJfZnVuYzEKIAogI2lmZGVmIEZVTkNUSU9OX0xQUFRSQU5TUE9TRVJfZnVuYzEKIAotLyogTm90ZTogVGhpcyBjb2RlIHJlcXVpcmVzIG9ubHkgNDMgY3ljbGVzIHBlciBpdGVyYXRpb24gaW5zdGVhZCBvZiA2MSBvbiBBUk05MjZFSi1TICovCi1fX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKSBzdGF0aWMgdm9pZCBscHBUcmFuc3Bvc2VyX2Z1bmMxKAotICBGSVhQX0RCTCAqbG93QmFuZFJlYWwsCi0gIEZJWFBfREJMICpsb3dCYW5kSW1hZywKLSAgRklYUF9EQkwgKipxbWZCdWZmZXJSZWFsLAotICBGSVhQX0RCTCAqKnFtZkJ1ZmZlckltYWcsCi0gIGludCBsb29wcywKLSAgaW50IGhpQmFuZCwKLSAgaW50IGR5bmFtaWNTY2FsZSwKLSAgaW50IGRlc2NhbGUsCi0gIEZJWFBfU0dMIGEwciwKLSAgRklYUF9TR0wgYTBpLAotICBGSVhQX1NHTCBhMXIsCi0gIEZJWFBfU0dMIGExaSkKLXsKLQorLyogTm90ZTogVGhpcyBjb2RlIHJlcXVpcmVzIG9ubHkgNDMgY3ljbGVzIHBlciBpdGVyYXRpb24gaW5zdGVhZCBvZiA2MSBvbgorICogQVJNOTI2RUotUyAqLworc3RhdGljIHZvaWQgbHBwVHJhbnNwb3Nlcl9mdW5jMShGSVhQX0RCTCAqbG93QmFuZFJlYWwsIEZJWFBfREJMICpsb3dCYW5kSW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxbWZCdWZmZXJSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnFtZkJ1ZmZlckltYWcsIGludCBsb29wcywgaW50IGhpQmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGR5bmFtaWNTY2FsZSwgaW50IGRlc2NhbGUsIEZJWFBfU0dMIGEwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgYTBpLCBGSVhQX1NHTCBhMXIsIEZJWFBfU0dMIGExaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZQcmVXaGl0ZW5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHByZVdoaXRlbmluZ0dhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVXaGl0ZW5pbmdHYWluc19zZikgewogICBGSVhQX0RCTCByZWFsMSwgcmVhbDIsIGltYWcxLCBpbWFnMiwgYWNjdTEsIGFjY3UyOwogCiAgIHJlYWwyID0gbG93QmFuZFJlYWxbLTJdOwogICByZWFsMSA9IGxvd0JhbmRSZWFsWy0xXTsKICAgaW1hZzIgPSBsb3dCYW5kSW1hZ1stMl07CiAgIGltYWcxID0gbG93QmFuZEltYWdbLTFdOwotICBmb3IoaW50IGk9MDsgaSA8IGxvb3BzOyBpKyspCi0gIHsKLSAgICBhY2N1MSA9IGZNdWx0RGl2MiggICAgICAgICBhMHIscmVhbDEpOwotICAgIGFjY3UyID0gZk11bHREaXYyKCAgICAgICAgIGEwaSxpbWFnMSk7Ci0gICAgYWNjdTEgPSBmTXVsdEFkZERpdjIoYWNjdTEsYTFyLHJlYWwyKTsKLSAgICBhY2N1MiA9IGZNdWx0QWRkRGl2MihhY2N1MixhMWksaW1hZzIpOwotICAgIHJlYWwyID0gZk11bHREaXYyKCAgICAgICAgIGExaSxyZWFsMik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9vcHM7IGkrKykgeworICAgIGFjY3UxID0gZk11bHREaXYyKGEwciwgcmVhbDEpOworICAgIGFjY3UyID0gZk11bHREaXYyKGEwaSwgaW1hZzEpOworICAgIGFjY3UxID0gZk11bHRBZGREaXYyKGFjY3UxLCBhMXIsIHJlYWwyKTsKKyAgICBhY2N1MiA9IGZNdWx0QWRkRGl2MihhY2N1MiwgYTFpLCBpbWFnMik7CisgICAgcmVhbDIgPSBmTXVsdERpdjIoYTFpLCByZWFsMik7CiAgICAgYWNjdTEgPSBhY2N1MSAtIGFjY3UyOwogICAgIGFjY3UxID0gYWNjdTEgPj4gZHluYW1pY1NjYWxlOwogCi0gICAgYWNjdTIgPSBmTXVsdEFkZERpdjIocmVhbDIsYTFyLGltYWcyKTsKKyAgICBhY2N1MiA9IGZNdWx0QWRkRGl2MihyZWFsMiwgYTFyLCBpbWFnMik7CiAgICAgcmVhbDIgPSByZWFsMTsKICAgICBpbWFnMiA9IGltYWcxOwotICAgIGFjY3UyID0gZk11bHRBZGREaXYyKGFjY3UyLGEwaSxyZWFsMSk7CisgICAgYWNjdTIgPSBmTXVsdEFkZERpdjIoYWNjdTIsIGEwaSwgcmVhbDEpOwogICAgIHJlYWwxID0gbG93QmFuZFJlYWxbaV07Ci0gICAgYWNjdTIgPSBmTXVsdEFkZERpdjIoYWNjdTIsYTByLGltYWcxKTsKKyAgICBhY2N1MiA9IGZNdWx0QWRkRGl2MihhY2N1MiwgYTByLCBpbWFnMSk7CiAgICAgaW1hZzEgPSBsb3dCYW5kSW1hZ1tpXTsKICAgICBhY2N1MiA9IGFjY3UyID4+IGR5bmFtaWNTY2FsZTsKIAogICAgIGFjY3UxIDw8PSAxOwogICAgIGFjY3UyIDw8PSAxOwotCi0gICAgcW1mQnVmZmVyUmVhbFtpXVtoaUJhbmRdID0gYWNjdTEgKyAocmVhbDE+PmRlc2NhbGUpOwotICAgIHFtZkJ1ZmZlckltYWdbaV1baGlCYW5kXSA9IGFjY3UyICsgKGltYWcxPj5kZXNjYWxlKTsKKyAgICBhY2N1MSArPSAocmVhbDEgPj4gZGVzY2FsZSk7CisgICAgYWNjdTIgKz0gKGltYWcxID4+IGRlc2NhbGUpOworICAgIGlmIChmUHJlV2hpdGVuaW5nKSB7CisgICAgICBhY2N1MSA9IHNjYWxlVmFsdWVTYXR1cmF0ZShmTXVsdERpdjIoYWNjdTEsIHByZVdoaXRlbmluZ0dhaW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlV2hpdGVuaW5nR2FpbnNfc2YpOworICAgICAgYWNjdTIgPSBzY2FsZVZhbHVlU2F0dXJhdGUoZk11bHREaXYyKGFjY3UyLCBwcmVXaGl0ZW5pbmdHYWluKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZVdoaXRlbmluZ0dhaW5zX3NmKTsKKyAgICB9CisgICAgcW1mQnVmZmVyUmVhbFtpXVtoaUJhbmRdID0gYWNjdTE7CisgICAgcW1mQnVmZmVySW1hZ1tpXVtoaUJhbmRdID0gYWNjdTI7CiAgIH0KIH0KLSNlbmRpZiAgLyogI2lmZGVmIEZVTkNUSU9OX0xQUFRSQU5TUE9TRVJfZnVuYzEgKi8KLSNlbmRpZiAgLyogX19hcm1fXyAqLworI2VuZGlmIC8qICNpZmRlZiBGVU5DVElPTl9MUFBUUkFOU1BPU0VSX2Z1bmMxICovCiAKLQotCisjZW5kaWYgLyogX19hcm1fXyAqLwpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9lbnZfY2FsYy5jcHAgYi9saWJTQlJkZWMvc3JjL2Vudl9jYWxjLmNwcAppbmRleCA3M2JkN2JhLi5kN2E4YmI1IDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL2Vudl9jYWxjLmNwcAorKysgYi9saWJTQlJkZWMvc3JjL2Vudl9jYWxjLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxMSArOTAsMTkgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBFbnZlbG9wZSBjYWxjdWxhdGlvbiAgCisgIFxicmllZiAgRW52ZWxvcGUgY2FsY3VsYXRpb24KIAogICBUaGUgZW52ZWxvcGUgYWRqdXN0b3IgY29tcGFyZXMgdGhlIGVuZXJnaWVzIHByZXNlbnQgaW4gdGhlIHRyYW5zcG9zZWQKICAgaGlnaGJhbmQgdG8gdGhlIHJlZmVyZW5jZSBlbmVyZ2llcyBjb252ZXllZCB3aXRoIHRoZSBiaXRzdHJlYW0uCkBAIC0xMTEsMTYgKzEzMCwxNyBAQAogICBIb3dldmVyLCBpbiBhdmVyYWdlIG9ubHkgdGhlIGRhdGEgb2YgMSBmcmFtZSBpcyBiZWluZyBwcm9jZXNzZWQgYXMKICAgdGhlIGFkanVzdG9yIGlzIGNhbGxlZCBvbmNlIHBlciBmcmFtZS4KIAotICBEZXBlbmRpbmcgb24gdGhlIGZyZXF1ZW5jeSByYW5nZSBzZXQgaW4gdGhlIGJpdHN0cmVhbSwgb25seSBRTUYtc3ViYmFuZHMgYmV0d2VlbgotICA8ZW0+bG93U3ViYmFuZDwvZW0+IGFuZCA8ZW0+aGlnaFN1YmJhbmQ8L2VtPiBhcmUgYWRqdXN0ZWQuCisgIERlcGVuZGluZyBvbiB0aGUgZnJlcXVlbmN5IHJhbmdlIHNldCBpbiB0aGUgYml0c3RyZWFtLCBvbmx5IFFNRi1zdWJiYW5kcworICBiZXR3ZWVuIDxlbT5sb3dTdWJiYW5kPC9lbT4gYW5kIDxlbT5oaWdoU3ViYmFuZDwvZW0+IGFyZSBhZGp1c3RlZC4KIAotICBTY2FsaW5nIG9mIHNwZWN0cmFsIGRhdGEgdG8gbWF4aW1pemUgU05SIChzZWUgI1FNRl9TQ0FMRV9GQUNUT1IpIGFzIHdlbGwgYXMgYSBzcGVjaWFsIE1hbnRpc3NhLUV4cG9uZW50IGZvcm1hdAotICAoIHNlZSAgY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSApIGFyZSBiZWluZyB1c2VkLiBUaGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhpcyBtb2R1bGVzIGlzIGNhbGN1bGF0ZVNickVudmVsb3BlKCkuCisgIFNjYWxpbmcgb2Ygc3BlY3RyYWwgZGF0YSB0byBtYXhpbWl6ZSBTTlIgKHNlZSAjUU1GX1NDQUxFX0ZBQ1RPUikgYXMgd2VsbCBhcyBhCisgIHNwZWNpYWwgTWFudGlzc2EtRXhwb25lbnQgZm9ybWF0ICggc2VlICBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpICkgYXJlIGJlaW5nCisgIHVzZWQuIFRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGlzIG1vZHVsZXMgaXMgY2FsY3VsYXRlU2JyRW52ZWxvcGUoKS4KIAotICBcc2Egc2JyX3NjYWxlLmgsICNRTUZfU0NBTEVfRkFDVE9SLCBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpLCBccmVmIGRvY3VtZW50YXRpb25PdmVydmlldworICBcc2Egc2JyX3NjYWxlLmgsICNRTUZfU0NBTEVfRkFDVE9SLCBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpLCBccmVmCisgIGRvY3VtZW50YXRpb25PdmVydmlldwogKi8KIAotCiAjaW5jbHVkZSAiZW52X2NhbGMuaCIKIAogI2luY2x1ZGUgInNicmRlY19mcmVxX3NjYS5oIgpAQCAtMTI5LDIwMyArMTQ5LDI2MCBAQAogI2luY2x1ZGUgInNicl9yYW0uaCIKICNpbmNsdWRlICJzYnJfcm9tLmgiCiAKLSNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIiAgICAgICAgICAgLyogbmVlZCBGREtwb3coKSBmb3IgZGVidWcgb3V0cHV0cyAqLworI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiIC8qIG5lZWQgRkRLcG93KCkgZm9yIGRlYnVnIG91dHB1dHMgKi8KIAotI2lmIGRlZmluZWQoX19hcm1fXykKLSNpbmNsdWRlICJhcm0vZW52X2NhbGNfYXJtLmNwcCIKLSNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgeworICBGSVhQX0RCTCBucmdSZWZbTUFYX0ZSRVFfQ09FRkZTXTsKKyAgRklYUF9EQkwgbnJnRXN0W01BWF9GUkVRX0NPRUZGU107CisgIEZJWFBfREJMIG5yZ0dhaW5bTUFYX0ZSRVFfQ09FRkZTXTsKKyAgRklYUF9EQkwgbm9pc2VMZXZlbFtNQVhfRlJFUV9DT0VGRlNdOworICBGSVhQX0RCTCBucmdTaW5lW01BWF9GUkVRX0NPRUZGU107CiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgRklYUF9EQkwgbnJnUmVmW01BWF9GUkVRX0NPRUZGU107Ci0gICAgRklYUF9EQkwgbnJnRXN0W01BWF9GUkVRX0NPRUZGU107Ci0gICAgRklYUF9EQkwgbnJnR2FpbltNQVhfRlJFUV9DT0VGRlNdOwotICAgIEZJWFBfREJMIG5vaXNlTGV2ZWxbTUFYX0ZSRVFfQ09FRkZTXTsKLSAgICBGSVhQX0RCTCBucmdTaW5lW01BWF9GUkVRX0NPRUZGU107CisgIFNDSEFSIG5yZ1JlZl9lW01BWF9GUkVRX0NPRUZGU107CisgIFNDSEFSIG5yZ0VzdF9lW01BWF9GUkVRX0NPRUZGU107CisgIFNDSEFSIG5yZ0dhaW5fZVtNQVhfRlJFUV9DT0VGRlNdOworICBTQ0hBUiBub2lzZUxldmVsX2VbTUFYX0ZSRVFfQ09FRkZTXTsKKyAgU0NIQVIgbnJnU2luZV9lW01BWF9GUkVRX0NPRUZGU107CisgIC8qIHlldCBhbm90aGVyIGV4cG9uZW50IFswXTogZm9yIHRzIDwgbm9fY29sczsgWzFdOiBmb3IgdHMgPj0gbm9fY29scyAqLworICBTQ0hBUiBleHBvbmVudFsyXTsKK30gRU5WX0NBTENfTlJHUzsKIAotICAgIFNDSEFSICAgbnJnUmVmX2VbTUFYX0ZSRVFfQ09FRkZTXTsKLSAgICBTQ0hBUiAgIG5yZ0VzdF9lW01BWF9GUkVRX0NPRUZGU107Ci0gICAgU0NIQVIgICBucmdHYWluX2VbTUFYX0ZSRVFfQ09FRkZTXTsKLSAgICBTQ0hBUiAgIG5vaXNlTGV2ZWxfZVtNQVhfRlJFUV9DT0VGRlNdOwotICAgIFNDSEFSICAgbnJnU2luZV9lW01BWF9GUkVRX0NPRUZGU107Ci19Ci1FTlZfQ0FMQ19OUkdTOworc3RhdGljIHZvaWQgZXF1YWxpemVGaWx0QnVmZmVyRXhwKEZJWFBfREJMICpmaWx0QnVmZmVyLCBTQ0hBUiAqZmlsdEJ1ZmZlcl9lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpOcmdHYWluLCBTQ0hBUiAqTnJnR2Fpbl9lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJiYW5kcyk7CiAKLXN0YXRpYyB2b2lkIGVxdWFsaXplRmlsdEJ1ZmZlckV4cChGSVhQX0RCTCAqZmlsdEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICpmaWx0QnVmZmVyX2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKk5yZ0dhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAqTnJnR2Fpbl9lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBzdWJiYW5kcyk7CitzdGF0aWMgdm9pZCBjYWxjTnJnUGVyU3ViYmFuZChGSVhQX0RCTCAqKmFuYWx5c0J1ZmZlclJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmFuYWx5c0J1ZmZlckltYWcsIGludCBsb3dTdWJiYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpZ2hTdWJiYW5kLCBpbnQgc3RhcnRfcG9zLCBpbnQgbmV4dF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiBmcmFtZUV4cCwgRklYUF9EQkwgKm5yZ0VzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICpucmdFc3RfZSk7CiAKLXN0YXRpYyB2b2lkIGNhbGNOcmdQZXJTdWJiYW5kKEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlclJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJJbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGxvd1N1YmJhbmQsIGludCBoaWdoU3ViYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzdGFydF9wb3MsICBpbnQgbmV4dF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgZnJhbWVFeHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbnJnRXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKm5yZ0VzdF9lICk7CitzdGF0aWMgdm9pZCBjYWxjTnJnUGVyU2ZiKEZJWFBfREJMICoqYW5hbHlzQnVmZmVyUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiphbmFseXNCdWZmZXJJbWFnLCBpbnQgblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmZyZXFCYW5kVGFibGUsIGludCBzdGFydF9wb3MsIGludCBuZXh0X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgaW5wdXRfZSwgRklYUF9EQkwgKm5yZ19lc3QsIFNDSEFSICpucmdfZXN0X2UpOwogCi1zdGF0aWMgdm9pZCBjYWxjTnJnUGVyU2ZiKEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlclJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlckltYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBuU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAqZnJlcUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIHN0YXJ0X3BvcywgIGludCBuZXh0X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgIGlucHV0X2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpucmdfZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqbnJnX2VzdF9lICk7CitzdGF0aWMgdm9pZCBjYWxjU3ViYmFuZEdhaW4oRklYUF9EQkwgbnJnUmVmLCBTQ0hBUiBucmdSZWZfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTICpucmdzLCBpbnQgYywgRklYUF9EQkwgdG1wTm9pc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgdG1wTm9pc2VfZSwgVUNIQVIgc2luZVByZXNlbnRGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIHNpbmVNYXBwZWQsIGludCBub05vaXNlRmxhZyk7CiAKLXN0YXRpYyB2b2lkIGNhbGNTdWJiYW5kR2FpbihGSVhQX0RCTCAgbnJnUmVmLCBTQ0hBUiBucmdSZWZfZSwgRU5WX0NBTENfTlJHUyogbnJncywgaW50IGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgIHRtcE5vaXNlLCBTQ0hBUiB0bXBOb2lzZV9lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICBzaW5lUHJlc2VudEZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgIHNpbmVNYXBwZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vTm9pc2VGbGFnKTsKK3N0YXRpYyB2b2lkIGNhbGNBdmdHYWluKEVOVl9DQUxDX05SR1MgKm5yZ3MsIGludCBsb3dTdWJiYW5kLCBpbnQgaGlnaFN1YmJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc3VtUmVmX20sIFNDSEFSICpzdW1SZWZfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwdHJBdmdHYWluX20sIFNDSEFSICpwdHJBdmdHYWluX2UpOwogCi1zdGF0aWMgdm9pZCBjYWxjQXZnR2FpbihFTlZfQ0FMQ19OUkdTKiBucmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBsb3dTdWJiYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBoaWdoU3ViYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqc3VtUmVmX20sCi0gICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgKnN1bVJlZl9lLAotICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpwdHJBdmdHYWluX20sCi0gICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgKnB0ckF2Z0dhaW5fZSk7CitzdGF0aWMgdm9pZCBhZGp1c3RUaW1lU2xvdF9FbGRHcmlkKEZJWFBfREJMICpwdHJSZWFsLCBFTlZfQ0FMQ19OUkdTICpucmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcHRySGFybUluZGV4LCBpbnQgbG93U3ViYmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub1N1YmJhbmRzLCBpbnQgc2NhbGVfY2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9Ob2lzZUZsYWcsIGludCAqcHRyUGhhc2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjYWxlX2RpZmZfbG93KTsKIAotc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RfRWxkR3JpZChGSVhQX0RCTCAgKnB0clJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnB0ckhhcm1JbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBsb3dTdWJiYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBub1N1YmJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHNjYWxlX2NoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBub05vaXNlRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICpwdHJQaGFzZUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHNjYWxlX2RpZmZfbG93KTsKK3N0YXRpYyB2b2lkIGFkanVzdFRpbWVTbG90TEMoRklYUF9EQkwgKnB0clJlYWwsIEVOVl9DQUxDX05SR1MgKm5yZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwdHJIYXJtSW5kZXgsIGludCBsb3dTdWJiYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vU3ViYmFuZHMsIGludCBzY2FsZV9jaGFuZ2UsIGludCBub05vaXNlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwdHJQaGFzZUluZGV4KTsKIAotc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RMQyhGSVhQX0RCTCAgKnB0clJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnB0ckhhcm1JbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBsb3dTdWJiYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBub1N1YmJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHNjYWxlX2NoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBub05vaXNlRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICpwdHJQaGFzZUluZGV4KTsKLXN0YXRpYyB2b2lkIGFkanVzdFRpbWVTbG90SFEoRklYUF9EQkwgICpwdHJSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpwdHJJbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaF9zYnJfY2FsX2VudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOVl9DQUxDX05SR1MqIG5yZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbG93U3ViYmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbm9TdWJiYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBzY2FsZV9jaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCBzbW9vdGhfcmF0aW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbm9Ob2lzZUZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgZmlsdEJ1ZmZlck5vaXNlU2hpZnQpOworLyoqCisgKiBcYnJpZWYgVmFyaWFudCBvZiBhZGp1c3RUaW1lU2xvdEhRKCkgd2hpY2ggb25seSByZWdhcmRzIGdhaW4gYW5kIG5vaXNlIGJ1dCBubworICogYWRkaXRpb25hbCBoYXJtb25pY3MKKyAqLworc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RIUV9HYWluQW5kTm9pc2UoCisgICAgRklYUF9EQkwgKnB0clJlYWwsIEZJWFBfREJMICpwdHJJbWFnLAorICAgIEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhfc2JyX2NhbF9lbnYsIEVOVl9DQUxDX05SR1MgKm5yZ3MsCisgICAgaW50IGxvd1N1YmJhbmRzLCBpbnQgbm9TdWJiYW5kcywgaW50IHNjYWxlX2NoYW5nZSwgRklYUF9TR0wgc21vb3RoX3JhdGlvLAorICAgIGludCBub05vaXNlRmxhZywgaW50IGZpbHRCdWZmZXJOb2lzZVNoaWZ0KTsKKy8qKgorICogXGJyaWVmIFZhcmlhbnQgb2YgYWRqdXN0VGltZVNsb3RIUSgpIHdoaWNoIG9ubHkgYWRkcyB0aGUgYWRkaXRpb25hbCBoYXJtb25pY3MKKyAqLworc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RIUV9BZGRIYXJtb25pY3MoCisgICAgRklYUF9EQkwgKnB0clJlYWwsIEZJWFBfREJMICpwdHJJbWFnLAorICAgIEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhfc2JyX2NhbF9lbnYsIEVOVl9DQUxDX05SR1MgKm5yZ3MsCisgICAgaW50IGxvd1N1YmJhbmRzLCBpbnQgbm9TdWJiYW5kcywgaW50IHNjYWxlX2NoYW5nZSk7CiAKK3N0YXRpYyB2b2lkIGFkanVzdFRpbWVTbG90SFEoRklYUF9EQkwgKnB0clJlYWwsIEZJWFBfREJMICpwdHJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoX3Nicl9jYWxfZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTICpucmdzLCBpbnQgbG93U3ViYmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub1N1YmJhbmRzLCBpbnQgc2NhbGVfY2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCBzbW9vdGhfcmF0aW8sIGludCBub05vaXNlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbHRCdWZmZXJOb2lzZVNoaWZ0KTsKIAogLyohCiAgIFxicmllZiAgICAgTWFwIHNpbmUgZmxhZ3MgZnJvbSBiaXRzdHJlYW0gdG8gUU1GIGJhbmRzCiAKLSAgVGhlIGJpdHN0cmVhbSBjYXJyaWVzIG9ubHkgMSBzaW5lIGZsYWcgcGVyIGJhbmQgYW5kIGZyYW1lLgotICBUaGlzIGZ1bmN0aW9uIG1hcHMgZXZlcnkgc2luZSBmbGFnIGZyb20gdGhlIGJpdHN0cmVhbSB0byBhIHNwZWNpZmljIFFNRiBzdWJiYW5kCi0gIGFuZCB0byBhIHNwZWNpZmljIGVudmVsb3BlIHdoZXJlIHRoZSBzaW5lIHNoYWxsIHN0YXJ0LgotICBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB0aGUgdmVjdG9yIHNpbmVNYXBwZWQgd2hpY2ggY29udGFpbnMgb25lIGVudHJ5IHBlcgotICBRTUYgc3ViYmFuZC4gVGhlIHZhbHVlIG9mIGFuIGVudHJ5IHNwZWNpZmllcyB0aGUgZW52ZWxvcGUgd2hlcmUgYSBzaW5lCi0gIHNoYWxsIHN0YXJ0LiBBIHZhbHVlIG9mICNNQVhfRU5WRUxPUEVTIGluZGljYXRlcyB0aGF0IG5vIHNpbmUgaXMgcHJlc2VudAotICBpbiB0aGUgc3ViYmFuZC4KLSAgVGhlIG1pc3NpbmcgaGFybW9uaWNzIGZsYWdzIGZyb20gdGhlIHByZXZpb3VzIGZyYW1lIChoYXJtRmxhZ3NQcmV2KSBkZXRlcm1pbmUKLSAgaWYgYSBzaW5lIHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmcmFtZSBvciBhdCB0aGUgdHJhbnNpZW50IHBvc2l0aW9uLgotICBBZGRpdGlvbmFsbHksIHRoZSBmbGFncyBpbiBoYXJtRmxhZ3NQcmV2IGFyZSBiZWluZyB1cGRhdGVkIGJ5IHRoaXMgZnVuY3Rpb24KLSAgZm9yIHRoZSBuZXh0IGZyYW1lLgorICBUaGUgYml0c3RyZWFtIGNhcnJpZXMgb25seSAxIHNpbmUgZmxhZyBwZXIgYmFuZCAoU2ZiKSBhbmQgZnJhbWUuCisgIFRoaXMgZnVuY3Rpb24gbWFwcyBldmVyeSBzaW5lIGZsYWcgZnJvbSB0aGUgYml0c3RyZWFtIHRvIGEgc3BlY2lmaWMgUU1GCisgIHN1YmJhbmQgYW5kIHRvIGEgc3BlY2lmaWMgZW52ZWxvcGUgd2hlcmUgdGhlIHNpbmUgc2hhbGwgc3RhcnQuIFRoZSByZXN1bHQgaXMKKyAgc3RvcmVkIGluIHRoZSB2ZWN0b3Igc2luZU1hcHBlZCB3aGljaCBjb250YWlucyBvbmUgZW50cnkgcGVyIFFNRiBzdWJiYW5kLiBUaGUKKyAgdmFsdWUgb2YgYW4gZW50cnkgc3BlY2lmaWVzIHRoZSBlbnZlbG9wZSB3aGVyZSBhIHNpbmUgc2hhbGwgc3RhcnQuIEEgdmFsdWUgb2YKKyAgMzIgaW5kaWNhdGVzIHRoYXQgbm8gc2luZSBpcyBwcmVzZW50IGluIHRoZSBzdWJiYW5kLiBUaGUgbWlzc2luZyBoYXJtb25pY3MKKyAgZmxhZ3MgZnJvbSB0aGUgcHJldmlvdXMgZnJhbWUgKGhhcm1GbGFnc1ByZXYpIGRldGVybWluZSBpZiBhIHNpbmUgc3RhcnRzIGF0CisgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZyYW1lIG9yIGF0IHRoZSB0cmFuc2llbnQgcG9zaXRpb24uIEFkZGl0aW9uYWxseSwgdGhlCisgIGZsYWdzIGluIGhhcm1GbGFnc1ByZXYgYXJlIGJlaW5nIHVwZGF0ZWQgYnkgdGhpcyBmdW5jdGlvbiBmb3IgdGhlIG5leHQgZnJhbWUuCiAqLwotc3RhdGljIHZvaWQgbWFwU2luZUZsYWdzKFVDSEFSICpmcmVxQmFuZFRhYmxlLCAgICAgICAgIC8qITwgQmFuZCBib3JkZXJzICh0aGVyZSdzIG9ubHkgMSBmbGFnIHBlciBiYW5kKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU2ZiLCAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGJhbmRzIGluIHRoZSB0YWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICphZGRIYXJtb25pY3MsICAgICAgICAgICAvKiE8IHZlY3RvciB3aXRoIDEgZmxhZyBwZXIgc2ZiICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpoYXJtRmxhZ3NQcmV2LCAgICAgICAgICAgLyohPCBQYWNrZWQgJ2FkZEhhcm1vbmljcycgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbkVudiwgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zaWVudCBwb3NpdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICpzaW5lTWFwcGVkKSAgICAgICAgICAgIC8qITwgUmVzdWx0aW5nIHZlY3RvciBvZiBzaW5lIHN0YXJ0IHBvc2l0aW9ucyBmb3IgZWFjaCBRTUYgYmFuZCAqLworc3RhdGljIHZvaWQgbWFwU2luZUZsYWdzKAorICAgIFVDSEFSICpmcmVxQmFuZFRhYmxlLCAvKiE8IEJhbmQgYm9yZGVycyAodGhlcmUncyBvbmx5IDEgZmxhZyBwZXIgYmFuZCkgKi8KKyAgICBpbnQgblNmYiwgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgaW4gdGhlIHRhYmxlICovCisgICAgVUxPTkcgKmFkZEhhcm1vbmljcywgIC8qITwgUGFja2VkIGFkZEhhcm1vbmljcyBvZiBjdXJyZW50IGZyYW1lIChhbGlnbmVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBNU0IpICovCisgICAgVUxPTkcgKmhhcm1GbGFnc1ByZXYsIC8qITwgUGFja2VkIGFkZEhhcm1vbmljcyBvZiBwcmV2aW91cyBmcmFtZSAoYWxpZ25lZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgTFNCKSAqLworICAgIFVMT05HICpoYXJtRmxhZ3NQcmV2QWN0aXZlLCAvKiE8IFBhY2tlZCBzaW5lTWFwcGVkIG9mIHByZXZpb3VzIGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGlnbmVkIHRvIHRoZSBMU0IpICovCisgICAgaW50IHRyYW5FbnYsICAgICAgICAgICAgICAgIC8qITwgVHJhbnNpZW50IHBvc2l0aW9uICovCisgICAgU0NIQVIgKnNpbmVNYXBwZWQpIC8qITwgUmVzdWx0aW5nIHZlY3RvciBvZiBzaW5lIHN0YXJ0IHBvc2l0aW9ucyBmb3IgZWFjaAorICAgICAgICAgICAgICAgICAgICAgICAgICBRTUYgYmFuZCAqLwogCiB7CiAgIGludCBpOwotICBpbnQgbG93U3ViYmFuZDIgPSBmcmVxQmFuZFRhYmxlWzBdPDwxOwotICBpbnQgYml0Y291bnQgPSAwOwotICBpbnQgb2xkZmxhZ3MgPSAqaGFybUZsYWdzUHJldjsKLSAgaW50IG5ld2ZsYWdzID0gMDsKKyAgaW50IGJpdGNvdW50ID0gMzE7CisgIFVMT05HIGhhcm1GbGFnc1FtZkJhbmRzW0FERF9IQVJNT05JQ1NfRkxBR1NfU0laRV0gPSB7MH07CisgIFVMT05HICpjdXJGbGFncyA9IGFkZEhhcm1vbmljczsKIAogICAvKgotICAgIEZvcm1hdCBvZiBoYXJtRmxhZ3NQcmV2OgorICAgIEZvcm1hdCBvZiBhZGRIYXJtb25pY3MgKGFsaWduZWQgdG8gTVNCKToKIAotICAgIGZpcnN0IHdvcmQgPSBmbGFncyBmb3IgaGlnaGVzdCAxNiBzZmIgYmFuZHMgaW4gdXNlCi0gICAgc2Vjb25kIHdvcmQgPSBmbGFncyBmb3IgbmV4dCBsb3dlciAxNiBzZmIgYmFuZHMgKGlmIHByZXNlbnQpCi0gICAgdGhpcmQgd29yZCA9IGZsYWdzIGZvciBsb3dlc3QgMTYgc2ZiIGJhbmRzIChpZiBwcmVzZW50KQorICAgICAgVXAgdG8gTUFYX0ZSRVFfQ09FRkZTIHNmYiBiYW5kcyBjYW4gYmUgZmxhZ2dlZCBmb3IgYSBzaWduLgorICAgICAgZmlyc3Qgd29yZCAgPSBmbGFncyBmb3IgbG93ZXN0IDMyIHNmYiBiYW5kcyBpbiB1c2UKKyAgICAgIHNlY29uZCB3b3JkID0gZmxhZ3MgZm9yIGhpZ2VzdCAzMiBzZmIgYmFuZHMgKGlmIHByZXNlbnQpCiAKLSAgICBVcCB0byBNQVhfRlJFUV9DT0VGRlMgc2ZiIGJhbmRzIGNhbiBiZSBmbGFnZ2VkIGZvciBhIHNpZ24uCi0gICAgVGhlIGxvd2VzdCBiaXQgb2YgdGhlIGZpcnN0IHdvcmQgY29ycmVzcG9uZHMgdG8gdGhlIF9oaWdoZXN0XyBzZmIgYmFuZCBpbiB1c2UuCi0gICAgVGhpcyBpcyBlbnN1cmVzIHRoYXQgZWFjaCBmbGFnIGlzICBtYXBwZWQgdG8gdGhlIHNhbWUgUU1GIGJhbmQgZXZlbiBhZnRlciBhCi0gICAgY2hhbmdlIG9mIHRoZSBjcm9zc292ZXItZnJlcXVlbmN5LgorICAgIEZvcm1hdCBvZiBoYXJtRmxhZ3NQcmV2IChhbGlnbmVkIHRvIExTQik6CisKKyAgICAgIEluZGV4IGlzIGFic29sdXRlIChub3QgcmVsYXRpdmUgdG8gbHNiKSBzbyBpdCBpcyBjb3JyZWN0IGV2ZW4gaWYgbHNiCisgICAgY2hhbmdlcyBmaXJzdCB3b3JkICA9IGZsYWdzIGZvciBsb3dlc3QgMzIgcW1mIGJhbmRzICgwLi4uMzEpIHNlY29uZCB3b3JkID0KKyAgICBmbGFncyBmb3IgbmV4dCBoaWdoZXIgMzIgcW1mIGJhbmRzICgzMi4uLjYzKQorCiAgICovCiAKLQogICAvKiBSZXNldCB0aGUgb3V0cHV0IHZlY3RvciBmaXJzdCAqLwotICBGREttZW1zZXQoc2luZU1hcHBlZCwgTUFYX0VOVkVMT1BFUyxNQVhfRlJFUV9DT0VGRlMpOyAvKiBNQVhfRU5WRUxPUEVTIG1lYW5zICdubyBzaW5lJyAqLworICBGREttZW1zZXQoc2luZU1hcHBlZCwgMzIsCisgICAgICAgICAgICBNQVhfRlJFUV9DT0VGRlMgKiBzaXplb2YoU0NIQVIpKTsgLyogMzIgbWVhbnMgJ25vIHNpbmUnICovCisgIEZES21lbWNsZWFyKGhhcm1GbGFnc1ByZXZBY3RpdmUsIEFERF9IQVJNT05JQ1NfRkxBR1NfU0laRSAqIHNpemVvZihVTE9ORykpOworICBmb3IgKGkgPSAwOyBpIDwgblNmYjsgaSsrKSB7CisgICAgVUxPTkcgbWFza1NmYiA9CisgICAgICAgIDEgPDwgYml0Y291bnQ7IC8qIG1hc2sgdG8gZXh0cmFjdCBhZGRIYXJtb25pY3MgZmxhZyBvZiBjdXJyZW50IFNmYiAqLwogCi0gIGZyZXFCYW5kVGFibGUgKz0gblNmYjsKLSAgYWRkSGFybW9uaWNzICArPSBuU2ZiLTE7CisgICAgaWYgKCpjdXJGbGFncyAmIG1hc2tTZmIpIHsgICAgICAgICAgLyogVGhlcmUgaXMgYSBzaW5lIGluIHRoaXMgYmFuZCAqLworICAgICAgY29uc3QgaW50IGxzYiA9IGZyZXFCYW5kVGFibGVbMF07IC8qIHN0YXJ0IG9mIHNiciByYW5nZSAqLworICAgICAgLyogcW1mIGJhbmQgdG8gd2hpY2ggc2luZSBzaG91bGQgYmUgYWRkZWQgKi8KKyAgICAgIGNvbnN0IGludCBxbWZCYW5kID0gKGZyZXFCYW5kVGFibGVbaV0gKyBmcmVxQmFuZFRhYmxlW2kgKyAxXSkgPj4gMTsKKyAgICAgIGNvbnN0IGludCBxbWZCYW5kRGl2MzIgPSBxbWZCYW5kID4+IDU7CisgICAgICBjb25zdCBpbnQgbWFza1FtZkJhbmQgPQorICAgICAgICAgIDEgPDwgKHFtZkJhbmQgJgorICAgICAgICAgICAgICAgIDMxKTsgLyogbWFzayB0byBleHRyYWN0IGhhcm1vbmljIGZsYWcgZnJvbSBwcmV2RmxhZ3MgKi8KIAotICBmb3IgKGk9blNmYjsgaSE9MDsgaS0tKSB7Ci0gICAgaW50IHVpID0gKmZyZXFCYW5kVGFibGUtLTsgICAgICAgICAgICAgICAgIC8qIFVwcGVyIGxpbWl0IG9mIHRoZSBjdXJyZW50IHNjYWxlIGZhY3RvciBiYW5kLiAqLwotICAgIGludCBsaSA9ICpmcmVxQmFuZFRhYmxlOyAgICAgICAgICAgICAgICAgICAvKiBMb3dlciBsaW1pdCBvZiB0aGUgY3VycmVudCBzY2FsZSBmYWN0b3IgYmFuZC4gKi8KLQotICAgIGlmICggKmFkZEhhcm1vbmljcy0tICkgeyAgICAgICAgICAgICAgICAgICAvKiBUaGVyZSBpcyBhIHNpbmUgaW4gdGhpcyBiYW5kICovCi0KLSAgICAgIHVuc2lnbmVkIGludCBtYXNrID0gMSA8PCBiaXRjb3VudDsKLSAgICAgIG5ld2ZsYWdzIHw9IG1hc2s7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IGZsYWcgKi8KKyAgICAgIC8qIG1hcHBpbmcgb2Ygc2ZiIHdpdGggc2luZSB0byBhIGNlcnRhaW4gcW1mIGJhbmQgLT4gZm9yIGhhcm1GbGFnc1ByZXYgKi8KKyAgICAgIGhhcm1GbGFnc1FtZkJhbmRzW3FtZkJhbmREaXYzMl0gfD0gbWFza1FtZkJhbmQ7CiAKICAgICAgIC8qCi0gICAgICAgIElmIHRoZXJlIHdhcyBhIHNpbmUgaW4gdGhlIGxhc3QgZnJhbWUsIGxldCBpdCBjb250aW51ZSBmcm9tIHRoZSBmaXJzdCBlbnZlbG9wZSBvbgotICAgICAgICBlbHNlIHN0YXJ0IGF0IHRoZSB0cmFuc2llbnQgcG9zaXRpb24uCisgICAgICAgIElmIHRoZXJlIHdhcyBhIHNpbmUgaW4gdGhlIGxhc3QgZnJhbWUsIGxldCBpdCBjb250aW51ZSBmcm9tIHRoZSBmaXJzdAorICAgICAgICBlbnZlbG9wZSBvbiBlbHNlIHN0YXJ0IGF0IHRoZSB0cmFuc2llbnQgcG9zaXRpb24uIEluZGV4aW5nIG9mIHNpbmVNYXBwZWQKKyAgICAgICAgc3RhcnRzIHJlbGF0aXZlIHRvIGxzYi4KICAgICAgICovCi0gICAgICBzaW5lTWFwcGVkWyh1aStsaS1sb3dTdWJiYW5kMikgPj4gMV0gPSAoIG9sZGZsYWdzICYgbWFzayApID8gMCA6IHRyYW5FbnY7CisgICAgICBzaW5lTWFwcGVkW3FtZkJhbmQgLSBsc2JdID0KKyAgICAgICAgICAoaGFybUZsYWdzUHJldltxbWZCYW5kRGl2MzJdICYgbWFza1FtZkJhbmQpID8gMCA6IHRyYW5FbnY7CisgICAgICBpZiAoc2luZU1hcHBlZFtxbWZCYW5kIC0gbHNiXSA8IFBWQ19OVElNRVNMT1QpIHsKKyAgICAgICAgaGFybUZsYWdzUHJldkFjdGl2ZVtxbWZCYW5kRGl2MzJdIHw9IG1hc2tRbWZCYW5kOworICAgICAgfQogICAgIH0KIAotICAgIGlmICgoKytiaXRjb3VudCA9PSAxNikgfHwgaT09MSkgewotICAgICAgYml0Y291bnQgPSAwOwotICAgICAgKmhhcm1GbGFnc1ByZXYrKyA9IG5ld2ZsYWdzOwotICAgICAgb2xkZmxhZ3MgPSAqaGFybUZsYWdzUHJldjsgICAgICAgICAgICAgICAvKiBGZXRjaCAxNiBvZiB0aGUgb2xkIGZsYWdzICovCi0gICAgICBuZXdmbGFncyA9IDA7CisgICAgaWYgKGJpdGNvdW50LS0gPT0gMCkgeworICAgICAgYml0Y291bnQgPSAzMTsKKyAgICAgIGN1ckZsYWdzKys7CiAgICAgfQogICB9CisgIEZES21lbWNweShoYXJtRmxhZ3NQcmV2LCBoYXJtRmxhZ3NRbWZCYW5kcywKKyAgICAgICAgICAgIHNpemVvZihVTE9ORykgKiBBRERfSEFSTU9OSUNTX0ZMQUdTX1NJWkUpOwogfQogCisvKiEKKyAgXGJyaWVmICAgICBSZXN0b3JlIHNpbmVNYXBwZWQgb2YgcHJldmlvdXMgZnJhbWUKKworICBGb3IgUFZDIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IHRoZSBQVkMgZnJhbWluZyAoYWx3YXlzIDApIGlzIG91dCBvZiBzeW5jIHdpdGgKKyAgdGhlIFNCUiBmcmFtaW5nLiBUaGUgYWRkaW5nIG9mIGFkZGl0aW9uYWwgaGFybW9uaWNzIGlzIGRvbmUgYmFzZWQgb24gdGhlIFNCUgorICBmcmFtaW5nLiBJZiB0aGUgU0JSIGZyYW1pbmcgaXMgdHJhaWxpbmcgdGhlIFBWQyBmcmFtaW5nIHRoZSBzaW5lIG1hcHBpbmcgb2YKKyAgdGhlIHByZXZpb3VzIFNCUiBmcmFtZSBuZWVkcyB0byBiZSB1c2VkIGZvciB0aGUgb3ZlcmxhcHBpbmcgdGltZSBzbG90cy4KKyovCisvKnN0YXRpYyovIHZvaWQgbWFwU2luZUZsYWdzUHZjKAorICAgIFVDSEFSICpmcmVxQmFuZFRhYmxlLCAgICAgICAvKiE8IEJhbmQgYm9yZGVycyAodGhlcmUncyBvbmx5IDEgZmxhZyBwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZCkgKi8KKyAgICBpbnQgblNmYiwgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgaW4gdGhlIHRhYmxlICovCisgICAgVUxPTkcgKmhhcm1GbGFnc1ByZXYsICAgICAgIC8qITwgUGFja2VkIGFkZEhhcm1vbmljcyBvZiBwcmV2aW91cyBmcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxpZ25lZCB0byB0aGUgTVNCKSAqLworICAgIFVMT05HICpoYXJtRmxhZ3NQcmV2QWN0aXZlLCAvKiE8IFBhY2tlZCBzaW5lTWFwcGVkIG9mIHByZXZpb3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIChhbGlnbmVkIHRvIHRoZSBMU0IpICovCisgICAgU0NIQVIgKnNpbmVNYXBwZWQsICAgICAgICAgIC8qITwgUmVzdWx0aW5nIHZlY3RvciBvZiBzaW5lIHN0YXJ0IHBvc2l0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZWFjaCBRTUYgYmFuZCAqLworICAgIGludCBzaW51c29pZGFsUG9zLCAgICAgICAgICAvKiE8IHNpbnVzb2lkYWwgcG9zaXRpb24gKi8KKyAgICBTQ0hBUiAqc2ludXNvaWRhbFBvc1ByZXYsICAgLyohPCBzaW51c29pZGFsIHBvc2l0aW9uIG9mIHByZXZpb3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lICovCisgICAgaW50IHRyYWlsaW5nU2JyRnJhbWUpICAgICAgIC8qITwgaW5kaWNhdGlvbiBpZiB0aGUgU0JSIGZyYW1pbmcgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmcgdGhlIFBWQyBmcmFtaW5nICovCit7CisgIC8qIFJlc2V0IHRoZSBvdXRwdXQgdmVjdG9yIGZpcnN0ICovCisgIEZES21lbXNldChzaW5lTWFwcGVkLCAzMiwgTUFYX0ZSRVFfQ09FRkZTKTsgLyogMzIgbWVhbnMgJ25vIHNpbmUnICovCisKKyAgaWYgKHRyYWlsaW5nU2JyRnJhbWUpIHsKKyAgICAvKiByZXN0b3JlIHNpbmVNYXBwZWRbXSBvZiBwcmV2aW91cyBmcmFtZSAqLworICAgIGludCBpOworICAgIGNvbnN0IGludCBsc2IgPSBmcmVxQmFuZFRhYmxlWzBdOworICAgIGNvbnN0IGludCB1c2IgPSBmcmVxQmFuZFRhYmxlW25TZmJdOworICAgIGZvciAoaSA9IGxzYjsgaSA8IHVzYjsgaSsrKSB7CisgICAgICBjb25zdCBpbnQgcW1mQmFuZERpdjMyID0gaSA+PiA1OworICAgICAgY29uc3QgaW50IG1hc2tRbWZCYW5kID0KKyAgICAgICAgICAxIDw8IChpICYgMzEpOyAvKiBtYXNrIHRvIGV4dHJhY3QgaGFybW9uaWMgZmxhZyBmcm9tIHByZXZGbGFncyAqLworCisgICAgICAvKiBUd28gY2FzZXMgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIC4uLiAqLworICAgICAgaWYgKGhhcm1GbGFnc1ByZXZBY3RpdmVbcW1mQmFuZERpdjMyXSAmIG1hc2tRbWZCYW5kKSB7CisgICAgICAgIC8qIHRoZSBzaW5lIG1hcHBpbmcgYWxyZWFkeSBzdGFydGVkIGxhc3QgUFZDIGZyYW1lIC0+IHNlYW1sZXNzbHkKKyAgICAgICAgICogY29udGludWUgKi8KKyAgICAgICAgc2luZU1hcHBlZFtpIC0gbHNiXSA9IDA7CisgICAgICB9IGVsc2UgaWYgKGhhcm1GbGFnc1ByZXZbcW1mQmFuZERpdjMyXSAmIG1hc2tRbWZCYW5kKSB7CisgICAgICAgIC8qIHNpbnVzb2lkYWxQb3Mgb2YgcHJldiBQVkMgZnJhbWUgd2FzID49IFBWQ19OVElNRVNMT1QgLT4gc2luZSBzdGFydHMKKyAgICAgICAgICogaW4gdGhpcyBmcmFtZSAqLworICAgICAgICBzaW5lTWFwcGVkW2kgLSBsc2JdID0KKyAgICAgICAgICAgICpzaW51c29pZGFsUG9zUHJldiAtIFBWQ19OVElNRVNMT1Q7IC8qIHdlIGFyZSAxNiBzYnIgdGltZSBzbG90cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWhlYWQgb2YgbGFzdCBmcmFtZSBub3cgKi8KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgKnNpbnVzb2lkYWxQb3NQcmV2ID0gc2ludXNvaWRhbFBvczsKK30KIAogLyohCiAgIFxicmllZiAgICAgUmVkdWNlIGdhaW4tYWRqdXN0bWVudCBpbmR1Y2VkIGFsaWFzaW5nIGZvciByZWFsIHZhbHVlZCBmaWx0ZXJiYW5rLgogKi8KLS8qc3RhdGljKi8gdm9pZAotYWxpYXNpbmdSZWR1Y3Rpb24oRklYUF9EQkwqIGRlZ3JlZUFsaWFzLCAgICAgICAvKiE8IGVzdGltYXRlZCBhbGlhc2luZyBmb3IgZWFjaCBRTUYgY2hhbm5lbCAqLwotICAgICAgICAgICAgICAgICAgRU5WX0NBTENfTlJHUyogbnJncywKLSAgICAgICAgICAgICAgICAgIGludCogICAgICB1c2VBbGlhc1JlZHVjdGlvbiwgLyohPCBzeW50aGV0aWMgc2luZSBlbmdlcmd5IGZvciBlYWNoIHN1YmJhbmQsIHVzZWQgYXMgZmxhZyAqLwotICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vU3ViYmFuZHMpICAgICAgICAvKiE8IG51bWJlciBvZiBRTUYgY2hhbm5lbHMgdG8gcHJvY2VzcyAqLworLypzdGF0aWMqLyB2b2lkIGFsaWFzaW5nUmVkdWN0aW9uKAorICAgIEZJWFBfREJMICpkZWdyZWVBbGlhcywgLyohPCBlc3RpbWF0ZWQgYWxpYXNpbmcgZm9yIGVhY2ggUU1GCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsICovCisgICAgRU5WX0NBTENfTlJHUyAqbnJncywKKyAgICBVQ0hBUiAqdXNlQWxpYXNSZWR1Y3Rpb24sIC8qITwgc3ludGhldGljIHNpbmUgZW5lcmd5IGZvciBlYWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJiYW5kLCB1c2VkIGFzIGZsYWcgKi8KKyAgICBpbnQgbm9TdWJiYW5kcykgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIFFNRiBjaGFubmVscyB0byBwcm9jZXNzICovCiB7Ci0gIEZJWFBfREJMKiBucmdHYWluICAgPSBucmdzLT5ucmdHYWluOyAgICAgICAgICAvKiE8IHN1YmJhbmQgZ2FpbnMgdG8gYmUgbW9kaWZpZWQgKi8KLSAgU0NIQVIqICAgIG5yZ0dhaW5fZSA9IG5yZ3MtPm5yZ0dhaW5fZTsgICAgICAgIC8qITwgc3ViYmFuZCBnYWlucyB0byBiZSBtb2RpZmllZCAoZXhwb25lbnRzKSAqLwotICBGSVhQX0RCTCogbnJnRXN0ICAgID0gbnJncy0+bnJnRXN0OyAgICAgICAgICAgLyohPCBzdWJiYW5kIGVuZXJneSBiZWZvcmUgYW1wbGlmaWNhdGlvbiAqLwotICBTQ0hBUiogICAgbnJnRXN0X2UgID0gbnJncy0+bnJnRXN0X2U7ICAgICAgICAgLyohPCBzdWJiYW5kIGVuZXJneSBiZWZvcmUgYW1wbGlmaWNhdGlvbiAoZXhwb25lbnRzKSAqLworICBGSVhQX0RCTCAqbnJnR2FpbiA9IG5yZ3MtPm5yZ0dhaW47IC8qITwgc3ViYmFuZCBnYWlucyB0byBiZSBtb2RpZmllZCAqLworICBTQ0hBUiAqbnJnR2Fpbl9lID0KKyAgICAgIG5yZ3MtPm5yZ0dhaW5fZTsgLyohPCBzdWJiYW5kIGdhaW5zIHRvIGJlIG1vZGlmaWVkIChleHBvbmVudHMpICovCisgIEZJWFBfREJMICpucmdFc3QgPSBucmdzLT5ucmdFc3Q7IC8qITwgc3ViYmFuZCBlbmVyZ3kgYmVmb3JlIGFtcGxpZmljYXRpb24gKi8KKyAgU0NIQVIgKm5yZ0VzdF9lID0KKyAgICAgIG5yZ3MtPm5yZ0VzdF9lOyAvKiE8IHN1YmJhbmQgZW5lcmd5IGJlZm9yZSBhbXBsaWZpY2F0aW9uIChleHBvbmVudHMpICovCiAgIGludCBncm91cGluZyA9IDAsIGluZGV4ID0gMCwgbm9Hcm91cHMsIGs7CiAgIGludCBncm91cFZlY3RvcltNQVhfRlJFUV9DT0VGRlNdOwogCiAgIC8qIENhbGN1bGF0ZSBncm91cGluZyovCi0gIGZvciAoayA9IDA7IGsgPCBub1N1YmJhbmRzLTE7IGsrKyApewotICAgIGlmICggKGRlZ3JlZUFsaWFzW2sgKyAxXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgJiYgdXNlQWxpYXNSZWR1Y3Rpb25ba10gKSB7Ci0gICAgICBpZihncm91cGluZz09MCl7CisgIGZvciAoayA9IDA7IGsgPCBub1N1YmJhbmRzIC0gMTsgaysrKSB7CisgICAgaWYgKChkZWdyZWVBbGlhc1trICsgMV0gIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpICYmIHVzZUFsaWFzUmVkdWN0aW9uW2tdKSB7CisgICAgICBpZiAoZ3JvdXBpbmcgPT0gMCkgewogICAgICAgICBncm91cFZlY3RvcltpbmRleCsrXSA9IGs7CiAgICAgICAgIGdyb3VwaW5nID0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2V7Ci0gICAgICAgIGlmKGdyb3VwVmVjdG9yW2luZGV4LTFdICsgMyA9PSBrKXsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChncm91cFZlY3RvcltpbmRleCAtIDFdICsgMyA9PSBrKSB7CiAgICAgICAgICAgZ3JvdXBWZWN0b3JbaW5kZXgrK10gPSBrICsgMTsKICAgICAgICAgICBncm91cGluZyA9IDA7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZXsKLSAgICAgIGlmKGdyb3VwaW5nKXsKLSAgICAgICAgaWYodXNlQWxpYXNSZWR1Y3Rpb25ba10pCisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChncm91cGluZykgeworICAgICAgICBpZiAodXNlQWxpYXNSZWR1Y3Rpb25ba10pCiAgICAgICAgICAgZ3JvdXBWZWN0b3JbaW5kZXgrK10gPSBrICsgMTsKICAgICAgICAgZWxzZQogICAgICAgICAgIGdyb3VwVmVjdG9yW2luZGV4KytdID0gazsKQEAgLTMzNCw5MCArNDExLDM4NCBAQAogICAgIH0KICAgfQogCi0gIGlmKGdyb3VwaW5nKXsKKyAgaWYgKGdyb3VwaW5nKSB7CiAgICAgZ3JvdXBWZWN0b3JbaW5kZXgrK10gPSBub1N1YmJhbmRzOwogICB9CiAgIG5vR3JvdXBzID0gaW5kZXggPj4gMTsKIAotCiAgIC8qQ2FsY3VsYXRlIG5ldyBnYWluKi8KLSAgZm9yIChpbnQgZ3JvdXAgPSAwOyBncm91cCA8IG5vR3JvdXBzOyBncm91cCArKykgewotICAgIEZJWFBfREJMIG5yZ09yaWcgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsgICAgLyogT3JpZ2luYWwgc2lnbmFsIGVuZXJneSBpbiBjdXJyZW50IGdyb3VwIG9mIGJhbmRzICovCi0gICAgU0NIQVIgICAgbnJnT3JpZ19lID0gMDsKLSAgICBGSVhQX0RCTCBucmdBbXAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsgICAgIC8qIEFtcGxpZmllZCBzaWduYWwgZW5lcmd5IGluIGdyb3VwICh1c2luZyBjdXJyZW50IGdhaW5zKSAqLwotICAgIFNDSEFSICAgIG5yZ0FtcF9lID0gMDsKLSAgICBGSVhQX0RCTCBucmdNb2QgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsgICAvKiBTaWduYWwgZW5lcmd5IGluIGdyb3VwIHdoZW4gYXBwbHlpbmcgbW9kaWZpZWQgZ2FpbnMgKi8KLSAgICBTQ0hBUiAgICBucmdNb2RfZSA9IDA7Ci0gICAgRklYUF9EQkwgZ3JvdXBHYWluOyAgICAgICAgIC8qIFRvdGFsIGVuZXJneSBnYWluIGluIGdyb3VwICovCi0gICAgU0NIQVIgICAgZ3JvdXBHYWluX2U7Ci0gICAgRklYUF9EQkwgY29tcGVuc2F0aW9uOyAgICAgIC8qIENvbXBlbnNhdGlvbiBmYWN0b3IgZm9yIHRoZSBlbmVyZ3kgY2hhbmdlIHdoZW4gYXBwbHlpbmcgbW9kaWZpZWQgZ2FpbnMgKi8KLSAgICBTQ0hBUiAgICBjb21wZW5zYXRpb25fZTsKKyAgZm9yIChpbnQgZ3JvdXAgPSAwOyBncm91cCA8IG5vR3JvdXBzOyBncm91cCsrKSB7CisgICAgRklYUF9EQkwgbnJnT3JpZyA9IEZMMkZYQ09OU1RfREJMKAorICAgICAgICAwLjBmKTsgLyogT3JpZ2luYWwgc2lnbmFsIGVuZXJneSBpbiBjdXJyZW50IGdyb3VwIG9mIGJhbmRzICovCisgICAgU0NIQVIgbnJnT3JpZ19lID0gMDsKKyAgICBGSVhQX0RCTCBucmdBbXAgPSBGTDJGWENPTlNUX0RCTCgKKyAgICAgICAgMC4wZik7IC8qIEFtcGxpZmllZCBzaWduYWwgZW5lcmd5IGluIGdyb3VwICh1c2luZyBjdXJyZW50IGdhaW5zKSAqLworICAgIFNDSEFSIG5yZ0FtcF9lID0gMDsKKyAgICBGSVhQX0RCTCBucmdNb2QgPSBGTDJGWENPTlNUX0RCTCgKKyAgICAgICAgMC4wZik7IC8qIFNpZ25hbCBlbmVyZ3kgaW4gZ3JvdXAgd2hlbiBhcHBseWluZyBtb2RpZmllZCBnYWlucyAqLworICAgIFNDSEFSIG5yZ01vZF9lID0gMDsKKyAgICBGSVhQX0RCTCBncm91cEdhaW47IC8qIFRvdGFsIGVuZXJneSBnYWluIGluIGdyb3VwICovCisgICAgU0NIQVIgZ3JvdXBHYWluX2U7CisgICAgRklYUF9EQkwgY29tcGVuc2F0aW9uOyAvKiBDb21wZW5zYXRpb24gZmFjdG9yIGZvciB0aGUgZW5lcmd5IGNoYW5nZSB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBseWluZyBtb2RpZmllZCBnYWlucyAqLworICAgIFNDSEFSIGNvbXBlbnNhdGlvbl9lOwogCi0gICAgaW50IHN0YXJ0R3JvdXAgPSBncm91cFZlY3RvclsyKmdyb3VwXTsKLSAgICBpbnQgc3RvcEdyb3VwICA9IGdyb3VwVmVjdG9yWzIqZ3JvdXArMV07CisgICAgaW50IHN0YXJ0R3JvdXAgPSBncm91cFZlY3RvclsyICogZ3JvdXBdOworICAgIGludCBzdG9wR3JvdXAgPSBncm91cFZlY3RvclsyICogZ3JvdXAgKyAxXTsKIAotICAgIC8qIENhbGN1bGF0ZSB0b3RhbCBlbmVyZ3kgaW4gZ3JvdXAgYmVmb3JlIGFuZCBhZnRlciBhbXBsaWZpY2F0aW9uIHdpdGggY3VycmVudCBnYWluczogKi8KLSAgICBmb3IoayA9IHN0YXJ0R3JvdXA7IGsgPCBzdG9wR3JvdXA7IGsrKyl7CisgICAgLyogQ2FsY3VsYXRlIHRvdGFsIGVuZXJneSBpbiBncm91cCBiZWZvcmUgYW5kIGFmdGVyIGFtcGxpZmljYXRpb24gd2l0aAorICAgICAqIGN1cnJlbnQgZ2FpbnM6ICovCisgICAgZm9yIChrID0gc3RhcnRHcm91cDsgayA8IHN0b3BHcm91cDsgaysrKSB7CiAgICAgICAvKiBHZXQgb3JpZ2luYWwgYmFuZCBlbmVyZ3kgKi8KICAgICAgIEZJWFBfREJMIHRtcCA9IG5yZ0VzdFtrXTsKLSAgICAgIFNDSEFSICAgIHRtcF9lID0gbnJnRXN0X2Vba107CisgICAgICBTQ0hBUiB0bXBfZSA9IG5yZ0VzdF9lW2tdOwogCiAgICAgICBGREtfYWRkX01hbnRFeHAodG1wLCB0bXBfZSwgbnJnT3JpZywgbnJnT3JpZ19lLCAmbnJnT3JpZywgJm5yZ09yaWdfZSk7CiAKICAgICAgIC8qIE11bHRpcGx5IGJhbmQgZW5lcmd5IHdpdGggY3VycmVudCBnYWluICovCi0gICAgICB0bXAgPSBmTXVsdCh0bXAsbnJnR2FpbltrXSk7CisgICAgICB0bXAgPSBmTXVsdCh0bXAsIG5yZ0dhaW5ba10pOwogICAgICAgdG1wX2UgPSB0bXBfZSArIG5yZ0dhaW5fZVtrXTsKIAogICAgICAgRkRLX2FkZF9NYW50RXhwKHRtcCwgdG1wX2UsIG5yZ0FtcCwgbnJnQW1wX2UsICZucmdBbXAsICZucmdBbXBfZSk7CiAgICAgfQogCiAgICAgLyogQ2FsY3VsYXRlIHRvdGFsIGVuZXJneSBnYWluIGluIGdyb3VwICovCi0gICAgRkRLX2RpdmlkZV9NYW50RXhwKG5yZ0FtcCwgbnJnQW1wX2UsCi0gICAgICAgICAgICAgICAgICAgICAgIG5yZ09yaWcsIG5yZ09yaWdfZSwKLSAgICAgICAgICAgICAgICAgICAgICAgJmdyb3VwR2FpbiwgJmdyb3VwR2Fpbl9lKTsKKyAgICBGREtfZGl2aWRlX01hbnRFeHAobnJnQW1wLCBucmdBbXBfZSwgbnJnT3JpZywgbnJnT3JpZ19lLCAmZ3JvdXBHYWluLAorICAgICAgICAgICAgICAgICAgICAgICAmZ3JvdXBHYWluX2UpOwogCi0gICAgZm9yKGsgPSBzdGFydEdyb3VwOyBrIDwgc3RvcEdyb3VwOyBrKyspeworICAgIGZvciAoayA9IHN0YXJ0R3JvdXA7IGsgPCBzdG9wR3JvdXA7IGsrKykgewogICAgICAgRklYUF9EQkwgdG1wOwotICAgICAgU0NIQVIgICAgdG1wX2U7CisgICAgICBTQ0hBUiB0bXBfZTsKIAogICAgICAgRklYUF9EQkwgYWxwaGEgPSBkZWdyZWVBbGlhc1trXTsKICAgICAgIGlmIChrIDwgbm9TdWJiYW5kcyAtIDEpIHsKLSAgICAgICAgaWYgKGRlZ3JlZUFsaWFzW2sgKyAxXSA+IGFscGhhKQotICAgICAgICAgIGFscGhhID0gZGVncmVlQWxpYXNbayArIDFdOworICAgICAgICBpZiAoZGVncmVlQWxpYXNbayArIDFdID4gYWxwaGEpIGFscGhhID0gZGVncmVlQWxpYXNbayArIDFdOwogICAgICAgfQogCiAgICAgICAvKiBNb2RpZnkgZ2FpbiBkZXBlbmRpbmcgb24gdGhlIGRlZ3JlZSBvZiBhbGlhc2luZyAqLwotICAgICAgRkRLX2FkZF9NYW50RXhwKCBmTXVsdChhbHBoYSxncm91cEdhaW4pLCBncm91cEdhaW5fZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZk11bHQoLypGTDJGWENPTlNUX0RCTCgxLjBmKSovIChGSVhQX0RCTClNQVhWQUxfREJMIC0gYWxwaGEsbnJnR2FpbltrXSksIG5yZ0dhaW5fZVtrXSwKLSAgICAgICAgICAgICAgICAgICAgICAgJm5yZ0dhaW5ba10sICZucmdHYWluX2Vba10gKTsKKyAgICAgIEZES19hZGRfTWFudEV4cCgKKyAgICAgICAgICBmTXVsdChhbHBoYSwgZ3JvdXBHYWluKSwgZ3JvdXBHYWluX2UsCisgICAgICAgICAgZk11bHQoLypGTDJGWENPTlNUX0RCTCgxLjBmKSovIChGSVhQX0RCTClNQVhWQUxfREJMIC0gYWxwaGEsCisgICAgICAgICAgICAgICAgbnJnR2FpbltrXSksCisgICAgICAgICAgbnJnR2Fpbl9lW2tdLCAmbnJnR2FpbltrXSwgJm5yZ0dhaW5fZVtrXSk7CiAKICAgICAgIC8qIEFwcGx5IG1vZGlmaWVkIGdhaW4gdG8gb3JpZ2luYWwgZW5lcmd5ICovCi0gICAgICB0bXAgPSBmTXVsdChucmdHYWluW2tdLG5yZ0VzdFtrXSk7CisgICAgICB0bXAgPSBmTXVsdChucmdHYWluW2tdLCBucmdFc3Rba10pOwogICAgICAgdG1wX2UgPSBucmdHYWluX2Vba10gKyBucmdFc3RfZVtrXTsKIAogICAgICAgLyogQWNjdW11bGF0ZSBlbmVyZ3kgd2l0aCBtb2RpZmllZCBnYWlucyBhcHBsaWVkICovCi0gICAgICBGREtfYWRkX01hbnRFeHAoIHRtcCwgdG1wX2UsCi0gICAgICAgICAgICAgICAgICAgICAgIG5yZ01vZCwgbnJnTW9kX2UsCi0gICAgICAgICAgICAgICAgICAgICAgICZucmdNb2QsICZucmdNb2RfZSApOworICAgICAgRkRLX2FkZF9NYW50RXhwKHRtcCwgdG1wX2UsIG5yZ01vZCwgbnJnTW9kX2UsICZucmdNb2QsICZucmdNb2RfZSk7CiAgICAgfQogCi0gICAgLyogQ2FsY3VsYXRlIGNvbXBlbnNhdGlvbiBmYWN0b3IgdG8gcmV0YWluIHRoZSBlbmVyZ3kgb2YgdGhlIGFtcGxpZmllZCBzaWduYWwgKi8KLSAgICBGREtfZGl2aWRlX01hbnRFeHAobnJnQW1wLCBucmdBbXBfZSwKLSAgICAgICAgICAgICAgICAgICAgICAgbnJnTW9kLCBucmdNb2RfZSwKLSAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBlbnNhdGlvbiwgJmNvbXBlbnNhdGlvbl9lKTsKKyAgICAvKiBDYWxjdWxhdGUgY29tcGVuc2F0aW9uIGZhY3RvciB0byByZXRhaW4gdGhlIGVuZXJneSBvZiB0aGUgYW1wbGlmaWVkCisgICAgICogc2lnbmFsICovCisgICAgRkRLX2RpdmlkZV9NYW50RXhwKG5yZ0FtcCwgbnJnQW1wX2UsIG5yZ01vZCwgbnJnTW9kX2UsICZjb21wZW5zYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICZjb21wZW5zYXRpb25fZSk7CiAKICAgICAvKiBBcHBseSBjb21wZW5zYXRpb24gZmFjdG9yIHRvIGFsbCBnYWlucyBvZiB0aGUgZ3JvdXAgKi8KLSAgICBmb3IoayA9IHN0YXJ0R3JvdXA7IGsgPCBzdG9wR3JvdXA7IGsrKyl7Ci0gICAgICBucmdHYWluW2tdID0gZk11bHQobnJnR2FpbltrXSxjb21wZW5zYXRpb24pOworICAgIGZvciAoayA9IHN0YXJ0R3JvdXA7IGsgPCBzdG9wR3JvdXA7IGsrKykgeworICAgICAgbnJnR2FpbltrXSA9IGZNdWx0KG5yZ0dhaW5ba10sIGNvbXBlbnNhdGlvbik7CiAgICAgICBucmdHYWluX2Vba10gPSBucmdHYWluX2Vba10gKyBjb21wZW5zYXRpb25fZTsKICAgICB9CiAgIH0KIH0KIAorI2RlZmluZSBJTlRFUl9URVNfU0ZfQ0hBTkdFIDMKIAotIC8qIENvbnZlcnQgaGVhZHJvb20gYml0cyB0byBleHBvbmVudCAqLwotI2RlZmluZSBTQ0FMRTJFWFAocykgKDE1LShzKSkKLSNkZWZpbmUgRVhQMlNDQUxFKGUpICgxNS0oZSkpCit0eXBlZGVmIHN0cnVjdCB7CisgIEZJWFBfREJMIHN1YnNhbXBsZV9wb3dlcl9sb3dbKCgoMTAyNCkgLyAoMzIpICogKDQpIC8gMikgKyAoMyAqICg0KSkpXTsKKyAgRklYUF9EQkwgc3Vic2FtcGxlX3Bvd2VyX2hpZ2hbKCgoMTAyNCkgLyAoMzIpICogKDQpIC8gMikgKyAoMyAqICg0KSkpXTsKKyAgRklYUF9EQkwgZ2FpblsoKCgxMDI0KSAvICgzMikgKiAoNCkgLyAyKSArICgzICogKDQpKSldOworICBTQ0hBUiBzdWJzYW1wbGVfcG93ZXJfbG93X3NmWygoKDEwMjQpIC8gKDMyKSAqICg0KSAvIDIpICsgKDMgKiAoNCkpKV07CisgIFNDSEFSIHN1YnNhbXBsZV9wb3dlcl9oaWdoX3NmWygoKDEwMjQpIC8gKDMyKSAqICg0KSAvIDIpICsgKDMgKiAoNCkpKV07Cit9IElURVNfVEVNUDsKKworc3RhdGljIHZvaWQgYXBwbHlfaW50ZXJfdGVzKEZJWFBfREJMICoqcW1mUmVhbCwgRklYUF9EQkwgKipxbWZJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFNRl9TQ0FMRV9GQUNUT1IgKnNiclNjYWxlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDSEFSIGV4cFsyXSwgY29uc3QgaW50IFJBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN0YXJ0UG9zLCBjb25zdCBpbnQgc3RvcFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbG93U3ViYmFuZCwgY29uc3QgaW50IG5iU3ViYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBnYW1tYV9pZHgpIHsKKyAgaW50IGhpZ2hTdWJiYW5kID0gbG93U3ViYmFuZCArIG5iU3ViYmFuZDsKKyAgRklYUF9EQkwgKnN1YnNhbXBsZV9wb3dlcl9oaWdoLCAqc3Vic2FtcGxlX3Bvd2VyX2xvdzsKKyAgU0NIQVIgKnN1YnNhbXBsZV9wb3dlcl9oaWdoX3NmLCAqc3Vic2FtcGxlX3Bvd2VyX2xvd19zZjsKKyAgRklYUF9EQkwgdG90YWxfcG93ZXJfaGlnaCA9IChGSVhQX0RCTCkwOworICBGSVhQX0RCTCB0b3RhbF9wb3dlcl9sb3cgPSAoRklYUF9EQkwpMDsKKyAgRklYUF9EQkwgKmdhaW47CisgIGludCBnYWluX3NmWygoKDEwMjQpIC8gKDMyKSAqICg0KSAvIDIpICsgKDMgKiAoNCkpKV07CisKKyAgLyogZ2FtbWFbZ2FtbWFfaWR4XSA9IHswLjBmLCAxLjBmLCAyLjBmLCA0LjBmfSAqLworICBpbnQgZ2FtbWFfc2YgPQorICAgICAgKGludClnYW1tYV9pZHggLSAxOyAvKiBwZXJoYXBzICsxIHRvIHNhdmUgb25lIGJpdD8gKDAuOTk5OTlmIHZzIDEuZikgKi8KKworICBpbnQgbmJTdWJzYW1wbGUgPSBzdG9wUG9zIC0gc3RhcnRQb3M7CisgIGludCBpLCBqOworCisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChwVG1wLCBJVEVTX1RFTVAsIDEpOworICBzdWJzYW1wbGVfcG93ZXJfaGlnaCA9IHBUbXAtPnN1YnNhbXBsZV9wb3dlcl9oaWdoOworICBzdWJzYW1wbGVfcG93ZXJfbG93ID0gcFRtcC0+c3Vic2FtcGxlX3Bvd2VyX2xvdzsKKyAgc3Vic2FtcGxlX3Bvd2VyX2hpZ2hfc2YgPSBwVG1wLT5zdWJzYW1wbGVfcG93ZXJfaGlnaF9zZjsKKyAgc3Vic2FtcGxlX3Bvd2VyX2xvd19zZiA9IHBUbXAtPnN1YnNhbXBsZV9wb3dlcl9sb3dfc2Y7CisgIGdhaW4gPSBwVG1wLT5nYWluOworCisgIGlmIChnYW1tYV9pZHggPiAwKSB7CisgICAgaW50IHByZVNoaWZ0MiA9IDMyIC0gZk5vcm16KChGSVhQX0RCTCluYlN1YnNhbXBsZSk7CisgICAgaW50IHRvdGFsX3Bvd2VyX2xvd19zZiA9IDEgLSBERlJBQ1RfQklUUzsKKyAgICBpbnQgdG90YWxfcG93ZXJfaGlnaF9zZiA9IDEgLSBERlJBQ1RfQklUUzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYlN1YnNhbXBsZTsgKytpKSB7CisgICAgICBGSVhQX0RCTCBidWZmZXJSZWFsWygoKDEwMjQpIC8gKDMyKSAqICg0KSAvIDIpICsgKDMgKiAoNCkpKV07CisgICAgICBGSVhQX0RCTCBidWZmZXJJbWFnWygoKDEwMjQpIC8gKDMyKSAqICg0KSAvIDIpICsgKDMgKiAoNCkpKV07CisgICAgICBGSVhQX0RCTCBtYXhWYWwgPSAoRklYUF9EQkwpMDsKKworICAgICAgaW50IHRzID0gc3RhcnRQb3MgKyBpOworCisgICAgICBpbnQgbG93X3NmID0gKHRzIDwgMyAqIFJBVEUpID8gc2JyU2NhbGVGYWN0b3ItPm92X2xiX3NjYWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlOworICAgICAgbG93X3NmID0gMTUgLSBsb3dfc2Y7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCBsb3dTdWJiYW5kOyArK2opIHsKKyAgICAgICAgYnVmZmVySW1hZ1tqXSA9IHFtZkltYWdbc3RhcnRQb3MgKyBpXVtqXTsKKyAgICAgICAgbWF4VmFsIHw9IChGSVhQX0RCTCkoKExPTkcpKGJ1ZmZlckltYWdbal0pIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMT05HKWJ1ZmZlckltYWdbal0gPj4gKERGUkFDVF9CSVRTIC0gMSkpKTsKKyAgICAgICAgYnVmZmVyUmVhbFtqXSA9IHFtZlJlYWxbc3RhcnRQb3MgKyBpXVtqXTsKKyAgICAgICAgbWF4VmFsIHw9IChGSVhQX0RCTCkoKExPTkcpKGJ1ZmZlclJlYWxbal0pIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMT05HKWJ1ZmZlclJlYWxbal0gPj4gKERGUkFDVF9CSVRTIC0gMSkpKTsKKyAgICAgIH0KKworICAgICAgc3Vic2FtcGxlX3Bvd2VyX2xvd1tpXSA9IChGSVhQX0RCTCkwOworICAgICAgc3Vic2FtcGxlX3Bvd2VyX2xvd19zZltpXSA9IDA7CisKKyAgICAgIGlmIChtYXhWYWwgIT0gRkwyRlhDT05TVF9EQkwoMC5mKSkgeworICAgICAgICAvKiBtdWx0aXBseSBmaXJzdCwgdGhlbiBzaGlmdCBmb3Igc2FmZSBzdW1tYXRpb24gKi8KKyAgICAgICAgaW50IHByZVNoaWZ0ID0gMSAtIENudExlYWRpbmdaZXJvcyhtYXhWYWwpOworICAgICAgICBpbnQgcG9zdFNoaWZ0ID0gMzIgLSBmTm9ybXooKEZJWFBfREJMKWxvd1N1YmJhbmQpOworCisgICAgICAgIC8qIHJlZHVjZSBwcmVTaGlmdCBiZWNhdXNlIG90aGVyd2lzZSB3ZSByaXNrIHRvIHNxdWFyZSAtMS5mICovCisgICAgICAgIGlmIChwcmVTaGlmdCAhPSAwKSBwcmVTaGlmdCsrOworCisgICAgICAgIHN1YnNhbXBsZV9wb3dlcl9sb3dfc2ZbaV0gKz0gKGxvd19zZiArIHByZVNoaWZ0KSAqIDIgKyBwb3N0U2hpZnQgKyAxOworCisgICAgICAgIHNjYWxlVmFsdWVzKGJ1ZmZlclJlYWwsIGxvd1N1YmJhbmQsIC1wcmVTaGlmdCk7CisgICAgICAgIHNjYWxlVmFsdWVzKGJ1ZmZlckltYWcsIGxvd1N1YmJhbmQsIC1wcmVTaGlmdCk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsb3dTdWJiYW5kOyArK2opIHsKKyAgICAgICAgICBGSVhQX0RCTCBhZGRtZTsKKyAgICAgICAgICBhZGRtZSA9IGZQb3cyRGl2MihidWZmZXJSZWFsW2pdKTsKKyAgICAgICAgICBzdWJzYW1wbGVfcG93ZXJfbG93W2ldICs9IGFkZG1lID4+IHBvc3RTaGlmdDsKKyAgICAgICAgICBhZGRtZSA9IGZQb3cyRGl2MihidWZmZXJJbWFnW2pdKTsKKyAgICAgICAgICBzdWJzYW1wbGVfcG93ZXJfbG93W2ldICs9IGFkZG1lID4+IHBvc3RTaGlmdDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBub3cgZ2V0IGhpZ2ggKi8KKworICAgICAgbWF4VmFsID0gKEZJWFBfREJMKTA7CisKKyAgICAgIGludCBoaWdoX3NmID0gZXhwWyh0cyA8IDE2ICogUkFURSkgPyAwIDogMV07CisKKyAgICAgIGZvciAoaiA9IGxvd1N1YmJhbmQ7IGogPCBoaWdoU3ViYmFuZDsgKytqKSB7CisgICAgICAgIGJ1ZmZlckltYWdbal0gPSBxbWZJbWFnW3N0YXJ0UG9zICsgaV1bal07CisgICAgICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKShidWZmZXJJbWFnW2pdKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTE9ORylidWZmZXJJbWFnW2pdID4+IChERlJBQ1RfQklUUyAtIDEpKSk7CisgICAgICAgIGJ1ZmZlclJlYWxbal0gPSBxbWZSZWFsW3N0YXJ0UG9zICsgaV1bal07CisgICAgICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKShidWZmZXJSZWFsW2pdKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTE9ORylidWZmZXJSZWFsW2pdID4+IChERlJBQ1RfQklUUyAtIDEpKSk7CisgICAgICB9CisKKyAgICAgIHN1YnNhbXBsZV9wb3dlcl9oaWdoW2ldID0gKEZJWFBfREJMKTA7CisgICAgICBzdWJzYW1wbGVfcG93ZXJfaGlnaF9zZltpXSA9IDA7CisKKyAgICAgIGlmIChtYXhWYWwgIT0gRkwyRlhDT05TVF9EQkwoMC5mKSkgeworICAgICAgICBpbnQgcHJlU2hpZnQgPSAxIC0gQ250TGVhZGluZ1plcm9zKG1heFZhbCk7CisgICAgICAgIC8qIHJlZHVjZSBwcmVTaGlmdCBiZWNhdXNlIG90aGVyd2lzZSB3ZSByaXNrIHRvIHNxdWFyZSAtMS5mICovCisgICAgICAgIGlmIChwcmVTaGlmdCAhPSAwKSBwcmVTaGlmdCsrOworCisgICAgICAgIGludCBwb3N0U2hpZnQgPSAzMiAtIGZOb3JteigoRklYUF9EQkwpKGhpZ2hTdWJiYW5kIC0gbG93U3ViYmFuZCkpOworICAgICAgICBzdWJzYW1wbGVfcG93ZXJfaGlnaF9zZltpXSArPSAoaGlnaF9zZiArIHByZVNoaWZ0KSAqIDIgKyBwb3N0U2hpZnQgKyAxOworCisgICAgICAgIHNjYWxlVmFsdWVzKCZidWZmZXJSZWFsW2xvd1N1YmJhbmRdLCBoaWdoU3ViYmFuZCAtIGxvd1N1YmJhbmQsCisgICAgICAgICAgICAgICAgICAgIC1wcmVTaGlmdCk7CisgICAgICAgIHNjYWxlVmFsdWVzKCZidWZmZXJJbWFnW2xvd1N1YmJhbmRdLCBoaWdoU3ViYmFuZCAtIGxvd1N1YmJhbmQsCisgICAgICAgICAgICAgICAgICAgIC1wcmVTaGlmdCk7CisgICAgICAgIGZvciAoaiA9IGxvd1N1YmJhbmQ7IGogPCBoaWdoU3ViYmFuZDsgaisrKSB7CisgICAgICAgICAgc3Vic2FtcGxlX3Bvd2VyX2hpZ2hbaV0gKz0gZlBvdzJEaXYyKGJ1ZmZlclJlYWxbal0pID4+IHBvc3RTaGlmdDsKKyAgICAgICAgICBzdWJzYW1wbGVfcG93ZXJfaGlnaFtpXSArPSBmUG93MkRpdjIoYnVmZmVySW1hZ1tqXSkgPj4gcG9zdFNoaWZ0OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIHN1bSBhbGwgdG9nZXRoZXIgKi8KKyAgICAgIEZJWFBfREJMIG5ld19zdW1tYW5kID0gc3Vic2FtcGxlX3Bvd2VyX2xvd1tpXTsKKyAgICAgIGludCBuZXdfc3VtbWFuZF9zZiA9IHN1YnNhbXBsZV9wb3dlcl9sb3dfc2ZbaV07CisKKyAgICAgIC8qIG1ha2Ugc3VyZSB0aGUgY3VycmVudCBzdW0sIGFuZCB0aGUgbmV3IHN1bW1hbmQgaGF2ZSB0aGUgc2FtZSBTRiAqLworICAgICAgaWYgKG5ld19zdW1tYW5kX3NmID4gdG90YWxfcG93ZXJfbG93X3NmKSB7CisgICAgICAgIGludCBkaWZmID0gZk1pbihERlJBQ1RfQklUUyAtIDEsIG5ld19zdW1tYW5kX3NmIC0gdG90YWxfcG93ZXJfbG93X3NmKTsKKyAgICAgICAgdG90YWxfcG93ZXJfbG93ID4+PSBkaWZmOworICAgICAgICB0b3RhbF9wb3dlcl9sb3dfc2YgPSBuZXdfc3VtbWFuZF9zZjsKKyAgICAgIH0gZWxzZSBpZiAobmV3X3N1bW1hbmRfc2YgPCB0b3RhbF9wb3dlcl9sb3dfc2YpIHsKKyAgICAgICAgbmV3X3N1bW1hbmQgPj49IHRvdGFsX3Bvd2VyX2xvd19zZiAtIG5ld19zdW1tYW5kX3NmOworICAgICAgfQorCisgICAgICB0b3RhbF9wb3dlcl9sb3cgKz0gKG5ld19zdW1tYW5kID4+IHByZVNoaWZ0Mik7CisKKyAgICAgIG5ld19zdW1tYW5kID0gc3Vic2FtcGxlX3Bvd2VyX2hpZ2hbaV07CisgICAgICBuZXdfc3VtbWFuZF9zZiA9IHN1YnNhbXBsZV9wb3dlcl9oaWdoX3NmW2ldOworICAgICAgaWYgKG5ld19zdW1tYW5kX3NmID4gdG90YWxfcG93ZXJfaGlnaF9zZikgeworICAgICAgICB0b3RhbF9wb3dlcl9oaWdoID4+PQorICAgICAgICAgICAgZk1pbihERlJBQ1RfQklUUyAtIDEsIG5ld19zdW1tYW5kX3NmIC0gdG90YWxfcG93ZXJfaGlnaF9zZik7CisgICAgICAgIHRvdGFsX3Bvd2VyX2hpZ2hfc2YgPSBuZXdfc3VtbWFuZF9zZjsKKyAgICAgIH0gZWxzZSBpZiAobmV3X3N1bW1hbmRfc2YgPCB0b3RhbF9wb3dlcl9oaWdoX3NmKSB7CisgICAgICAgIG5ld19zdW1tYW5kID4+PSB0b3RhbF9wb3dlcl9oaWdoX3NmIC0gbmV3X3N1bW1hbmRfc2Y7CisgICAgICB9CisKKyAgICAgIHRvdGFsX3Bvd2VyX2hpZ2ggKz0gKG5ld19zdW1tYW5kID4+IHByZVNoaWZ0Mik7CisgICAgfQorCisgICAgdG90YWxfcG93ZXJfbG93X3NmICs9IHByZVNoaWZ0MjsKKyAgICB0b3RhbF9wb3dlcl9oaWdoX3NmICs9IHByZVNoaWZ0MjsKKworICAgIC8qIGdhaW5baV0gPSBlX0xPV1tpXSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuYlN1YnNhbXBsZTsgKytpKSB7CisgICAgICBpbnQgc2YyOworICAgICAgRklYUF9EQkwgbXVsdCA9CisgICAgICAgICAgZk11bHROb3JtKHN1YnNhbXBsZV9wb3dlcl9sb3dbaV0sIChGSVhQX0RCTCluYlN1YnNhbXBsZSwgJnNmMik7CisgICAgICBpbnQgbXVsdF9zZiA9IHN1YnNhbXBsZV9wb3dlcl9sb3dfc2ZbaV0gKyBERlJBQ1RfQklUUyAtIDEgKyBzZjI7CisKKyAgICAgIGlmICh0b3RhbF9wb3dlcl9sb3cgIT0gRklYUF9EQkwoMCkpIHsKKyAgICAgICAgZ2FpbltpXSA9IGZEaXZOb3JtKG11bHQsIHRvdGFsX3Bvd2VyX2xvdywgJnNmMik7CisgICAgICAgIGdhaW5fc2ZbaV0gPSBtdWx0X3NmIC0gdG90YWxfcG93ZXJfbG93X3NmICsgc2YyOworICAgICAgICBnYWluW2ldID0gc3FydEZpeHBfbG9va3VwKGdhaW5baV0sICZnYWluX3NmW2ldKTsKKyAgICAgICAgaWYgKGdhaW5fc2ZbaV0gPCAwKSB7CisgICAgICAgICAgZ2FpbltpXSA+Pj0gLWdhaW5fc2ZbaV07CisgICAgICAgICAgZ2Fpbl9zZltpXSA9IDA7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtdWx0ID09IEZJWFBfREJMKDApKSB7CisgICAgICAgICAgZ2FpbltpXSA9IEZJWFBfREJMKDApOworICAgICAgICAgIGdhaW5fc2ZbaV0gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdhaW5baV0gPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKyAgICAgICAgICBnYWluX3NmW2ldID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIEZJWFBfREJMIHRvdGFsX3Bvd2VyX2hpZ2hfYWZ0ZXIgPSAoRklYUF9EQkwpMDsKKyAgICBpbnQgdG90YWxfcG93ZXJfaGlnaF9hZnRlcl9zZiA9IDEgLSBERlJBQ1RfQklUUzsKKworICAgIC8qIGdhaW5baV0gPSBnX2ludGVyW2ldICovCisgICAgZm9yIChpID0gMDsgaSA8IG5iU3Vic2FtcGxlOyArK2kpIHsKKyAgICAgIGlmIChnYWluX3NmW2ldIDwgMCkgeworICAgICAgICBnYWluW2ldID4+PSAtZ2Fpbl9zZltpXTsKKyAgICAgICAgZ2Fpbl9zZltpXSA9IDA7CisgICAgICB9CisKKyAgICAgIC8qIGNhbGN1bGF0ZTogZ2FpbltpXSA9IDEuMGYgKyBnYW1tYSAqIChnYWluW2ldIC0gMS4wZik7ICovCisgICAgICBGSVhQX0RCTCBvbmUgPSAoRklYUF9EQkwpTUFYVkFMX0RCTCA+PgorICAgICAgICAgICAgICAgICAgICAgZ2Fpbl9zZltpXTsgLyogdG8gc3Vic3RyYWN0IHRoaXMgZnJvbSBnYWluW2ldICovCisKKyAgICAgIC8qIGdhbW1hIGlzIGFjdHVhbGx5IGFsd2F5cyAxIGFjY29yZGluZyB0byB0aGUgdGFibGUsIHNvIHNraXAgdGhlCisgICAgICAgKiBmTXVsdERpdjIgKi8KKyAgICAgIEZJWFBfREJMIG11bHQgPSAoZ2FpbltpXSAtIG9uZSkgPj4gMTsKKyAgICAgIGludCBtdWx0X3NmID0gZ2Fpbl9zZltpXSArIGdhbW1hX3NmOworCisgICAgICBvbmUgPSBGTDJGWENPTlNUX0RCTCgwLjVmKSA+PiBtdWx0X3NmOworICAgICAgZ2FpbltpXSA9IG9uZSArIG11bHQ7CisgICAgICBnYWluX3NmW2ldICs9IGdhbW1hX3NmICsgMTsgLyogKzEgYmVjYXVzZSBvZiBmTXVsdERpdjIoKSAqLworCisgICAgICAvKiBzZXQgZ2FpbiB0byBhdCBsZWFzdCAwLjJmICovCisgICAgICBGSVhQX0RCTCBwb2ludF90d28gPSBGTDJGWENPTlNUX0RCTCgwLjhmKTsgLyogc2NhbGVkIHVwIGJ5IDIgKi8KKyAgICAgIGludCBwb2ludF90d29fc2YgPSAtMjsKKworICAgICAgRklYUF9EQkwgdG1wID0gZ2FpbltpXTsKKyAgICAgIGlmIChwb2ludF90d29fc2YgPCBnYWluX3NmW2ldKSB7CisgICAgICAgIHBvaW50X3R3byA+Pj0gZ2Fpbl9zZltpXSAtIHBvaW50X3R3b19zZjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRtcCA+Pj0gcG9pbnRfdHdvX3NmIC0gZ2Fpbl9zZltpXTsKKyAgICAgIH0KKworICAgICAgLyogbGltaXQgYW5kIGNhbGN1bGF0ZSBnYWluW2ldXjIgdG9vICovCisgICAgICBGSVhQX0RCTCBnYWluX3BvdzI7CisgICAgICBpbnQgZ2Fpbl9wb3cyX3NmOworICAgICAgaWYgKHRtcCA8IHBvaW50X3R3bykgeworICAgICAgICBnYWluW2ldID0gRkwyRlhDT05TVF9EQkwoMC44Zik7CisgICAgICAgIGdhaW5fc2ZbaV0gPSAtMjsKKyAgICAgICAgZ2Fpbl9wb3cyID0gRkwyRlhDT05TVF9EQkwoMC42NGYpOworICAgICAgICBnYWluX3BvdzJfc2YgPSAtNDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHRoaXMgdXBzY2FsaW5nIHNlZW1zIHF1aXRlIGltcG9ydGFudCAqLworICAgICAgICBpbnQgciA9IENvdW50TGVhZGluZ0JpdHMoZ2FpbltpXSk7CisgICAgICAgIGdhaW5baV0gPDw9IHI7CisgICAgICAgIGdhaW5fc2ZbaV0gLT0gcjsKKworICAgICAgICBnYWluX3BvdzIgPSBmUG93MihnYWluW2ldKTsKKyAgICAgICAgZ2Fpbl9wb3cyX3NmID0gZ2Fpbl9zZltpXSA8PCAxOworICAgICAgfQorCisgICAgICBpbnQgcm9vbTsKKyAgICAgIHN1YnNhbXBsZV9wb3dlcl9oaWdoW2ldID0KKyAgICAgICAgICBmTXVsdE5vcm0oc3Vic2FtcGxlX3Bvd2VyX2hpZ2hbaV0sIGdhaW5fcG93MiwgJnJvb20pOworICAgICAgc3Vic2FtcGxlX3Bvd2VyX2hpZ2hfc2ZbaV0gPQorICAgICAgICAgIHN1YnNhbXBsZV9wb3dlcl9oaWdoX3NmW2ldICsgZ2Fpbl9wb3cyX3NmICsgcm9vbTsKKworICAgICAgaW50IG5ld19zdW1tYW5kX3NmID0gc3Vic2FtcGxlX3Bvd2VyX2hpZ2hfc2ZbaV07IC8qICsgZ2Fpbl9wb3cyX3NmOyAqLworICAgICAgaWYgKG5ld19zdW1tYW5kX3NmID4gdG90YWxfcG93ZXJfaGlnaF9hZnRlcl9zZikgeworICAgICAgICB0b3RhbF9wb3dlcl9oaWdoX2FmdGVyID4+PQorICAgICAgICAgICAgZk1pbihERlJBQ1RfQklUUyAtIDEsIG5ld19zdW1tYW5kX3NmIC0gdG90YWxfcG93ZXJfaGlnaF9hZnRlcl9zZik7CisgICAgICAgIHRvdGFsX3Bvd2VyX2hpZ2hfYWZ0ZXJfc2YgPSBuZXdfc3VtbWFuZF9zZjsKKyAgICAgIH0gZWxzZSBpZiAobmV3X3N1bW1hbmRfc2YgPCB0b3RhbF9wb3dlcl9oaWdoX2FmdGVyX3NmKSB7CisgICAgICAgIHN1YnNhbXBsZV9wb3dlcl9oaWdoW2ldID4+PSB0b3RhbF9wb3dlcl9oaWdoX2FmdGVyX3NmIC0gbmV3X3N1bW1hbmRfc2Y7CisgICAgICB9CisgICAgICB0b3RhbF9wb3dlcl9oaWdoX2FmdGVyICs9IHN1YnNhbXBsZV9wb3dlcl9oaWdoW2ldID4+IHByZVNoaWZ0MjsKKyAgICB9CisKKyAgICB0b3RhbF9wb3dlcl9oaWdoX2FmdGVyX3NmICs9IHByZVNoaWZ0MjsKKworICAgIGludCBzZjIgPSAwOworICAgIEZJWFBfREJMIGdhaW5fYWRqXzIgPSBGTDJGWF9EQkwoMC41Zik7CisgICAgaW50IGdhaW5fYWRqXzJfc2YgPSAxOworCisgICAgaWYgKCh0b3RhbF9wb3dlcl9oaWdoICE9IChGSVhQX0RCTCkwKSAmJgorICAgICAgICAodG90YWxfcG93ZXJfaGlnaF9hZnRlciAhPSAoRklYUF9EQkwpMCkpIHsKKyAgICAgIGdhaW5fYWRqXzIgPSBmRGl2Tm9ybSh0b3RhbF9wb3dlcl9oaWdoLCB0b3RhbF9wb3dlcl9oaWdoX2FmdGVyLCAmc2YyKTsKKyAgICAgIGdhaW5fYWRqXzJfc2YgPSB0b3RhbF9wb3dlcl9oaWdoX3NmIC0gdG90YWxfcG93ZXJfaGlnaF9hZnRlcl9zZiArIHNmMjsKKyAgICB9CisKKyAgICBGSVhQX0RCTCBnYWluX2FkaiA9IHNxcnRGaXhwX2xvb2t1cChnYWluX2Fkal8yLCAmZ2Fpbl9hZGpfMl9zZik7CisgICAgaW50IGdhaW5fYWRqX3NmID0gZ2Fpbl9hZGpfMl9zZjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYlN1YnNhbXBsZTsgKytpKSB7CisgICAgICBnYWluW2ldID0gZk11bHQoZ2FpbltpXSwgZ2Fpbl9hZGopOworICAgICAgZ2Fpbl9zZltpXSArPSBnYWluX2Fkal9zZjsKKworICAgICAgLyogbGltaXQgZ2FpbiAqLworICAgICAgaWYgKGdhaW5fc2ZbaV0gPiBJTlRFUl9URVNfU0ZfQ0hBTkdFKSB7CisgICAgICAgIGdhaW5baV0gPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKKyAgICAgICAgZ2Fpbl9zZltpXSA9IElOVEVSX1RFU19TRl9DSEFOR0U7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG5iU3Vic2FtcGxlOyArK2kpIHsKKyAgICAgIC8qIGVxdWFsaXplIGdhaW5bXSdzIHNjYWxlIGZhY3RvcnMgKi8KKyAgICAgIGdhaW5baV0gPj49IElOVEVSX1RFU19TRl9DSEFOR0UgLSBnYWluX3NmW2ldOworCisgICAgICBmb3IgKGogPSBsb3dTdWJiYW5kOyBqIDwgaGlnaFN1YmJhbmQ7IGorKykgeworICAgICAgICBxbWZSZWFsW3N0YXJ0UG9zICsgaV1bal0gPSBmTXVsdChxbWZSZWFsW3N0YXJ0UG9zICsgaV1bal0sIGdhaW5baV0pOworICAgICAgICBxbWZJbWFnW3N0YXJ0UG9zICsgaV1bal0gPSBmTXVsdChxbWZJbWFnW3N0YXJ0UG9zICsgaV1bal0sIGdhaW5baV0pOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsgLyogZ2FtbWFfaWR4ID09IDAgKi8KKyAgICAvKiBJbnRlci1URVMgaXMgbm90IGFjdGl2ZS4gU3RpbGwgcGVyZm9ybSB0aGUgc2NhbGUgY2hhbmdlIHRvIGhhdmUgYQorICAgICAqIGNvbnNpc3RlbnQgc2NhbGluZyBmb3IgYWxsIGVudmVsb3BlcyBvZiB0aGlzIGZyYW1lLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuYlN1YnNhbXBsZTsgKytpKSB7CisgICAgICBmb3IgKGogPSBsb3dTdWJiYW5kOyBqIDwgaGlnaFN1YmJhbmQ7IGorKykgeworICAgICAgICBxbWZSZWFsW3N0YXJ0UG9zICsgaV1bal0gPj49IElOVEVSX1RFU19TRl9DSEFOR0U7CisgICAgICAgIHFtZkltYWdbc3RhcnRQb3MgKyBpXVtqXSA+Pj0gSU5URVJfVEVTX1NGX0NIQU5HRTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgQ19BTExPQ19TQ1JBVENIX0VORChwVG1wLCBJVEVTX1RFTVAsIDEpOworfQogCiAvKiEKICAgXGJyaWVmICBBcHBseSBzcGVjdHJhbCBlbnZlbG9wZSB0byBzdWJiYW5kIHNhbXBsZXMKQEAgLTQzMCw3ICs4MDEsOCBAQAogICB0aGUgc3VmZml4ZXMgPGVtPl9tPC9lbT4gYW5kICA8ZW0+X2U8L2VtPiByZXNwZWN0aXZlbHkuIFRoZSBjb250cm9sIGRhdGEKICAgaW4gI2hGcmFtZURhdGEgY29udGFpbnRzIGVudmVsb3BlIGRhdGEgd2hpY2ggaXMgcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtYXQgYnV0CiAgIHN0b3JlZCBpbiBzaW5nbGUgd29yZHMuIChTZWUgcmVxdWFudGl6ZUVudmVsb3BlRGF0YSgpIGZvciBkZXRhaWxzKS4gVGhpcyBkYXRhCi0gIGlzIHVucGFja2VkIHdpdGhpbiBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpIHRvIGZvbGxvdyB0aGUgZGVzY3JpYmVkIHN1ZmZpeCBjb252ZW50aW9uLgorICBpcyB1bnBhY2tlZCB3aXRoaW4gY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSB0byBmb2xsb3cgdGhlIGRlc2NyaWJlZCBzdWZmaXgKKyAgY29udmVudGlvbi4KIAogICBUaGUgYWN0dWFsIHZhbHVlIChjb21wYXJhYmxlIHRvIHRoZSBjb3JyZXNwb25kaW5nIGZsb2F0LXZhcmlhYmxlIGluIHRoZQogICByZXNlYXJjaC1pbXBsZW1lbnRhdGlvbikgb2YgYSBtYW50aXNzYS9leHBvbmVudC1wYWlyIGNhbiBiZSBjYWxjdWxhdGVkIGFzCkBAIC00MzgsNDkgKzgxMCw0NSBAQAogICBcZiQgdmFsdWUgPSB2YWx1ZVxfbSAqIDJee3ZhbHVlXF9lfSBcZiQKIAogICBBbGwgZW5lcmdpZXMgYW5kIG5vaXNlIGxldmVscyBkZWNvZGVkIGZyb20gdGhlIGJpdHN0cmVhbSBzdWl0IGZvciBhbgotICBvcmlnaW5hbCBzaWduYWwgbWFnbml0dWRlIG9mIFxmJFxwbSAzMjc2OCBcZiQgcmF0aGVyIHRoYW4gXGYkIFxwbSAxXGYkLiBUaGVyZWZvcmUsCi0gIHRoZSBzY2FsZSBmYWN0b3IgPGVtPmhiX3NjYWxlPC9lbT4gcGFzc2VkIGludG8gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNvbnZlcnRlZAotICB0byBhbiAnaW5wdXQgZXhwb25lbnQnICgjaW5wdXRfZSksIHdoaWNoIGZpdHMgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLgorICBvcmlnaW5hbCBzaWduYWwgbWFnbml0dWRlIG9mIFxmJFxwbSAzMjc2OCBcZiQgcmF0aGVyIHRoYW4gXGYkIFxwbSAxXGYkLgorICBUaGVyZWZvcmUsIHRoZSBzY2FsZSBmYWN0b3IgPGVtPmhiX3NjYWxlPC9lbT4gcGFzc2VkIGludG8gdGhpcyBmdW5jdGlvbiB3aWxsCisgIGJlIGNvbnZlcnRlZCB0byBhbiAnaW5wdXQgZXhwb25lbnQnICgjaW5wdXRfZSksIHdoaWNoIGZpdHMgdGhlIGludGVybmFsCisgIHJlcHJlc2VudGF0aW9uLgogCiAgIEJlZm9yZSB0aGUgYWN0dWFsIHByb2Nlc3NpbmcsIGFuIGV4cG9uZW50ICNhZGpfZSBmb3IgcmVzdWx0aW5nIGFkanVzdGVkCiAgIHNhbXBsZXMgaXMgZGVyaXZlZCBmcm9tIHRoZSBtYXhpbXVtIHJlZmVyZW5jZSBlbmVyZ3kuCiAKICAgVGhlbiwgZm9yIGVhY2ggZW52ZWxvcGUsIHRoZSBmb2xsb3dpbmcgc3RlcHMgYXJlIHBlcmZvcm1lZDoKIAotICBcbGkgQ2FsY3VsYXRlIGVuZXJneSBpbiB0aGUgc2lnbmFsIHRvIGJlIGFkanVzdGVkLiBEZXBlbmRpbmcgb24gdGhlIHRoZSB2YWx1ZSBvZgotICAgICAgI2ludGVycG9sRnJlcSAoaW50ZXJwb2xhdGlvbiBtb2RlKSwgdGhpcyBpcyBlaXRoZXIgZG9uZSBzZXBlcmF0ZWx5Ci0gICAgICBmb3IgZWFjaCBRTUYtc3ViYmFuZCBvciBmb3IgZWFjaCBTQlItYmFuZC4KLSAgICAgIFRoZSByZXN1bHRpbmcgZW5lcmdpZXMgYXJlIHN0b3JlZCBpbiAjbnJnRXN0X21bI01BWF9GUkVRX0NPRUZGU10gKG1hbnRpc3NhcykKLSAgICAgIGFuZCAjbnJnRXN0X2VbI01BWF9GUkVRX0NPRUZGU10gKGV4cG9uZW50cykuCi0gIFxsaSBDYWxjdWxhdGUgZ2FpbiBhbmQgbm9pc2UgbGV2ZWwgZm9yIGVhY2ggc3ViYmFuZDo8YnI+Ci0gICAgICBcZiQgZ2FpbiAgPSBcc3FydHsgXGZyYWN7bnJnUmVmfXtucmdFc3R9IFxjZG90ICgxIC0gbm9pc2VSYXRpbykgfQotICAgICAgICAgIFxoc3BhY2V7MmNtfQotICAgICAgICAgIG5vaXNlID0gXHNxcnR7IG5yZ1JlZiBcY2RvdCBub2lzZVJhdGlvIH0KLSAgICAgIFxmJDxicj4KLSAgICAgIHdoZXJlIDxlbT5ub2lzZVJhdGlvPC9lbT4gYW5kIDxlbT5ucmdSZWY8L2VtPiBhcmUgZXh0cmFjdGVkIGZyb20gdGhlCi0gICAgICBiaXRzdHJlYW0gYW5kIDxlbT5ucmdFc3Q8L2VtPiBpcyB0aGUgc3ViYmFuZCBlbmVyZ3kgYmVmb3JlIGFkanVzdG1lbnQuCi0gICAgICBUaGUgcmVzdWx0aW5nIGdhaW5zIGFyZSBzdG9yZWQgaW4gI25yZ0dhaW5fbVsjTUFYX0ZSRVFfQ09FRkZTXQotICAgICAgKG1hbnRpc3NhcykgYW5kICNucmdHYWluX2VbI01BWF9GUkVRX0NPRUZGU10gKGV4cG9uZW50cyksIHRoZSBub2lzZSBsZXZlbHMKLSAgICAgIGFyZSBzdG9yZWQgaW4gI25vaXNlTGV2ZWxfbVsjTUFYX0ZSRVFfQ09FRkZTXSBhbmQgI25vaXNlTGV2ZWxfZVsjTUFYX0ZSRVFfQ09FRkZTXQotICAgICAgKGV4cG9uZW50cykuCi0gICAgICBUaGUgc2luZSBsZXZlbHMgYXJlIHN0b3JlZCBpbiAjbnJnU2luZV9tWyNNQVhfRlJFUV9DT0VGRlNdCi0gICAgICBhbmQgI25yZ1NpbmVfZVsjTUFYX0ZSRVFfQ09FRkZTXS4KLSAgXGxpIE5vaXNlIGxpbWl0aW5nOiBUaGUgZ2FpbiBmb3IgZWFjaCBzdWJiYW5kIGlzIGxpbWl0ZWQgYm90aCBhYnNvbHV0ZWx5Ci0gICAgICBhbmQgcmVsYXRpdmVseSBjb21wYXJlZCB0byB0aGUgdG90YWwgZ2FpbiBvdmVyIGFsbCBzdWJiYW5kcy4KLSAgXGxpIEJvb3N0IGdhaW46IENhbGN1bGF0ZSBhbmQgYXBwbHkgYm9vc3QgZmFjdG9yIGZvciBlYWNoIGxpbWl0ZXIgYmFuZAotICAgICAgaW4gb3JkZXIgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIGVuZXJneSBsb3NzIGltcG9zZWQgYnkgdGhlIGxpbWl0aW5nLgotICBcbGkgQXBwbHkgZ2FpbnMgYW5kIGFkZCBub2lzZTogVGhlIGdhaW5zIGFuZCBub2lzZSBsZXZlbHMgYXJlIGFwcGxpZWQKLSAgICAgIHRvIGFsbCB0aW1lc2xvdHMgb2YgdGhlIGN1cnJlbnQgZW52ZWxvcGUuIEEgc2hvcnQgRklSLWZpbHRlciAobGVuZ3RoIDQKLSAgICAgIFFNRi10aW1lc2xvdHMpIGNhbiBiZSB1c2VkIHRvIHNtb290aCB0aGUgc3VkZGVuIGNoYW5nZSBhdCB0aGUgZW52ZWxvcGUgYm9yZGVycy4KLSAgICAgIEVhY2ggY29tcGxleCBzdWJiYW5kIHNhbXBsZSBvZiB0aGUgY3VycmVudCB0aW1lc2xvdCBpcyBtdWx0aXBsaWVkIGJ5IHRoZQotICAgICAgc21vb3RoZWQgZ2FpbiwgdGhlbiByYW5kb20gbm9pc2Ugd2l0aCB0aGUgY2FsY3VsYXRlZCBsZXZlbCBpcyBhZGRlZC4KKyAgXGxpIENhbGN1bGF0ZSBlbmVyZ3kgaW4gdGhlIHNpZ25hbCB0byBiZSBhZGp1c3RlZC4gRGVwZW5kaW5nIG9uIHRoZSB0aGUgdmFsdWUKKyAgb2YgI2ludGVycG9sRnJlcSAoaW50ZXJwb2xhdGlvbiBtb2RlKSwgdGhpcyBpcyBlaXRoZXIgZG9uZSBzZXBlcmF0ZWx5IGZvciBlYWNoCisgIFFNRi1zdWJiYW5kIG9yIGZvciBlYWNoIFNCUi1iYW5kLiBUaGUgcmVzdWx0aW5nIGVuZXJnaWVzIGFyZSBzdG9yZWQgaW4KKyAgI25yZ0VzdF9tWyNNQVhfRlJFUV9DT0VGRlNdIChtYW50aXNzYXMpIGFuZCAjbnJnRXN0X2VbI01BWF9GUkVRX0NPRUZGU10KKyAgKGV4cG9uZW50cykuIFxsaSBDYWxjdWxhdGUgZ2FpbiBhbmQgbm9pc2UgbGV2ZWwgZm9yIGVhY2ggc3ViYmFuZDo8YnI+IFxmJCBnYWluCisgID0gXHNxcnR7IFxmcmFje25yZ1JlZn17bnJnRXN0fSBcY2RvdCAoMSAtIG5vaXNlUmF0aW8pIH0gXGhzcGFjZXsyY219IG5vaXNlID0KKyAgXHNxcnR7IG5yZ1JlZiBcY2RvdCBub2lzZVJhdGlvIH0gXGYkPGJyPiB3aGVyZSA8ZW0+bm9pc2VSYXRpbzwvZW0+IGFuZAorICA8ZW0+bnJnUmVmPC9lbT4gYXJlIGV4dHJhY3RlZCBmcm9tIHRoZSBiaXRzdHJlYW0gYW5kIDxlbT5ucmdFc3Q8L2VtPiBpcyB0aGUKKyAgc3ViYmFuZCBlbmVyZ3kgYmVmb3JlIGFkanVzdG1lbnQuIFRoZSByZXN1bHRpbmcgZ2FpbnMgYXJlIHN0b3JlZCBpbgorICAjbnJnR2Fpbl9tWyNNQVhfRlJFUV9DT0VGRlNdIChtYW50aXNzYXMpIGFuZCAjbnJnR2Fpbl9lWyNNQVhfRlJFUV9DT0VGRlNdCisgIChleHBvbmVudHMpLCB0aGUgbm9pc2UgbGV2ZWxzIGFyZSBzdG9yZWQgaW4gI25vaXNlTGV2ZWxfbVsjTUFYX0ZSRVFfQ09FRkZTXQorICBhbmQgI25vaXNlTGV2ZWxfZVsjTUFYX0ZSRVFfQ09FRkZTXSAoZXhwb25lbnRzKS4gVGhlIHNpbmUgbGV2ZWxzIGFyZSBzdG9yZWQgaW4KKyAgI25yZ1NpbmVfbVsjTUFYX0ZSRVFfQ09FRkZTXSBhbmQgI25yZ1NpbmVfZVsjTUFYX0ZSRVFfQ09FRkZTXS4gXGxpIE5vaXNlCisgIGxpbWl0aW5nOiBUaGUgZ2FpbiBmb3IgZWFjaCBzdWJiYW5kIGlzIGxpbWl0ZWQgYm90aCBhYnNvbHV0ZWx5IGFuZCByZWxhdGl2ZWx5CisgIGNvbXBhcmVkIHRvIHRoZSB0b3RhbCBnYWluIG92ZXIgYWxsIHN1YmJhbmRzLiBcbGkgQm9vc3QgZ2FpbjogQ2FsY3VsYXRlIGFuZAorICBhcHBseSBib29zdCBmYWN0b3IgZm9yIGVhY2ggbGltaXRlciBiYW5kIGluIG9yZGVyIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBlbmVyZ3kKKyAgbG9zcyBpbXBvc2VkIGJ5IHRoZSBsaW1pdGluZy4gXGxpIEFwcGx5IGdhaW5zIGFuZCBhZGQgbm9pc2U6IFRoZSBnYWlucyBhbmQKKyAgbm9pc2UgbGV2ZWxzIGFyZSBhcHBsaWVkIHRvIGFsbCB0aW1lc2xvdHMgb2YgdGhlIGN1cnJlbnQgZW52ZWxvcGUuIEEgc2hvcnQKKyAgRklSLWZpbHRlciAobGVuZ3RoIDQgUU1GLXRpbWVzbG90cykgY2FuIGJlIHVzZWQgdG8gc21vb3RoIHRoZSBzdWRkZW4gY2hhbmdlIGF0CisgIHRoZSBlbnZlbG9wZSBib3JkZXJzLiBFYWNoIGNvbXBsZXggc3ViYmFuZCBzYW1wbGUgb2YgdGhlIGN1cnJlbnQgdGltZXNsb3QgaXMKKyAgbXVsdGlwbGllZCBieSB0aGUgc21vb3RoZWQgZ2FpbiwgdGhlbiByYW5kb20gbm9pc2Ugd2l0aCB0aGUgY2FsY3VsYXRlZCBsZXZlbAorICBpcyBhZGRlZC4KIAogICBcbm90ZQogICBUbyByZWR1Y2UgdGhlIHN0YWNrIHNpemUsIHNvbWUgb2YgdGhlIGxvY2FsIGFycmF5cyBjb3VsZCBiZSBsb2NhdGVkIHdpdGhpbgogICB0aGUgdGltZSBvdXRwdXQgYnVmZmVyLiBPZiB0aGUgNTEyIHNhbXBsZXMgdGVtcG9yYXJpbHkgYXZhaWxhYmxlIHRoZXJlLAogICBhYm91dCBoYWxmIHRoZSBzaXplIGlzIGFscmVhZHkgdXNlZCBieSAjU0JSX0ZSQU1FX0RBVEEuIEEgcG9pbnRlciB0byB0aGUKLSAgcmVtYWluaW5nIGZyZWUgbWVtb3J5IGNvdWxkIGJlIHN1cHBsaWVkIGJ5IGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gY2FsY3VsYXRlU2JyRW52ZWxvcGUoKQotICBpbiBzYnJfZGVjOgorICByZW1haW5pbmcgZnJlZSBtZW1vcnkgY291bGQgYmUgc3VwcGxpZWQgYnkgYW4gYWRkaXRpb25hbCBhcmd1bWVudCB0bworICBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpIGluIHNicl9kZWM6CiAKICAgXHBhcgogICBcY29kZQpAQCAtNDkwLDEyICs4NTgsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgaEZyYW1lRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUW1mQnVmZmVyUmVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUW1mQnVmZmVySW1hZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZU91dFB0ciArIHNpemVvZihTQlJfRlJBTUVfREFUQSkvc2l6ZW9mKEZsb2F0KSArIDEpOwotICBcZW5kY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lT3V0UHRyICsgc2l6ZW9mKFNCUl9GUkFNRV9EQVRBKS9zaXplb2YoRmxvYXQpICsKKyAgMSk7IFxlbmRjb2RlCiAKICAgXHBhcgotICBXaXRoaW4gY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSwgc29tZSBwb2ludGVycyBjb3VsZCBiZSBkZWZpbmVkIGluc3RlYWQgb2YgdGhlIGFycmF5cwotICAjbnJnUmVmX20sICNucmdSZWZfZSwgI25yZ0VzdF9tLCAjbnJnRXN0X2UsICNub2lzZUxldmVsX206CisgIFdpdGhpbiBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpLCBzb21lIHBvaW50ZXJzIGNvdWxkIGJlIGRlZmluZWQgaW5zdGVhZCBvZiB0aGUKKyAgYXJyYXlzICNucmdSZWZfbSwgI25yZ1JlZl9lLCAjbnJnRXN0X20sICNucmdFc3RfZSwgI25vaXNlTGV2ZWxfbToKIAogICBccGFyCiAgIFxjb2RlCkBAIC01MDgsNTYgKzg3NiwxMDMgQEAKIAogICA8YnI+CiAqLwotdm9pZAotY2FsY3VsYXRlU2JyRW52ZWxvcGUgKFFNRl9TQ0FMRV9GQUNUT1IgICpzYnJTY2FsZUZhY3RvciwgICAgICAgICAgIC8qITwgU2NhbGluZyBmYWN0b3JzICovCi0gICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaF9zYnJfY2FsX2VudiwgLyohPCBIYW5kbGUgdG8gc3RydWN0IGZpbGxlZCBieSB0aGUgY3JlYXRlLWZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgICAgICAgICAgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBICBoRnJhbWVEYXRhLCAgICAgICAgICAgLyohPCBDb250cm9sIGRhdGEgb2YgY3VycmVudCBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqYW5hbHlzQnVmZmVyUmVhbCwgICAgICAgICAgICAgICAgIC8qITwgUmVhbCBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyB0byBiZSBwcm9jZXNzZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmFuYWx5c0J1ZmZlckltYWcsICAgICAgICAgICAgICAgICAvKiE8IEltYWcgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgdG8gYmUgcHJvY2Vzc2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHVzZUxQLAotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpkZWdyZWVBbGlhcywgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRXN0aW1hdGVkIGFsaWFzaW5nIGZvciBlYWNoIFFNRiBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZnJhbWVFcnJvckZsYWcKLSAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gIGludCBjLCBpLCBqLCBlbnZOb2lzZSA9IDA7Ci0gIFVDSEFSKiAgIGJvcmRlcnMgPSBoRnJhbWVEYXRhLT5mcmFtZUluZm8uYm9yZGVyczsKLQotICBGSVhQX1NHTCAqbm9pc2VMZXZlbHMgICAgICAgPSBoRnJhbWVEYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWw7Cit2b2lkIGNhbGN1bGF0ZVNickVudmVsb3BlKAorICAgIFFNRl9TQ0FMRV9GQUNUT1IgKnNiclNjYWxlRmFjdG9yLCAvKiE8IFNjYWxpbmcgZmFjdG9ycyAqLworICAgIEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFCisgICAgICAgIGhfc2JyX2NhbF9lbnYsIC8qITwgSGFuZGxlIHRvIHN0cnVjdCBmaWxsZWQgYnkgdGhlIGNyZWF0ZS1mdW5jdGlvbiAqLworICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoRnJhbWVEYXRhLCAgIC8qITwgQ29udHJvbCBkYXRhIG9mIGN1cnJlbnQgZnJhbWUgKi8KKyAgICBQVkNfRFlOQU1JQ19EQVRBICpwUHZjRHluYW1pY0RhdGEsCisgICAgRklYUF9EQkwgKgorICAgICAgICAqYW5hbHlzQnVmZmVyUmVhbCwgLyohPCBSZWFsIHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzIHRvIGJlIHByb2Nlc3NlZCAqLworICAgIEZJWFBfREJMICoKKyAgICAgICAgKmFuYWx5c0J1ZmZlckltYWcsIC8qITwgSW1hZyBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICBjb25zdCBpbnQgdXNlTFAsCisgICAgRklYUF9EQkwgKmRlZ3JlZUFsaWFzLCAvKiE8IEVzdGltYXRlZCBhbGlhc2luZyBmb3IgZWFjaCBRTUYgY2hhbm5lbCAqLworICAgIGNvbnN0IFVJTlQgZmxhZ3MsIGNvbnN0IGludCBmcmFtZUVycm9yRmxhZykgeworICBpbnQgYywgaSwgaV9zdG9wLCBqLCBlbnZOb2lzZSA9IDA7CisgIFVDSEFSICpib3JkZXJzID0gaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLmJvcmRlcnM7CisgIFVDSEFSICpib3JkZXJzUHZjID0gaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLnB2Y0JvcmRlcnM7CisgIGludCBwdmNfbW9kZSA9IHBQdmNEeW5hbWljRGF0YS0+cHZjX21vZGU7CisgIGludCBmaXJzdF9zdGFydCA9CisgICAgICAoKHB2Y19tb2RlID4gMCkgPyBib3JkZXJzUHZjWzBdIDogYm9yZGVyc1swXSkgKiBoSGVhZGVyRGF0YS0+dGltZVN0ZXA7CisgIEZJWFBfU0dMICpub2lzZUxldmVscyA9IGhGcmFtZURhdGEtPnNick5vaXNlRmxvb3JMZXZlbDsKICAgSEFORExFX0ZSRVFfQkFORF9EQVRBIGhGcmVxID0gJmhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGE7CisgIFVDSEFSICoqcEZyZXFCYW5kVGFibGUgPSBoRnJlcS0+ZnJlcUJhbmRUYWJsZTsKKyAgVUNIQVIgKnBGcmVxQmFuZFRhYmxlTm9pc2UgPSBoRnJlcS0+ZnJlcUJhbmRUYWJsZU5vaXNlOwogCi0gIGludCBsb3dTdWJiYW5kICA9IGhGcmVxLT5sb3dTdWJiYW5kOworICBpbnQgbG93U3ViYmFuZCA9IGhGcmVxLT5sb3dTdWJiYW5kOwogICBpbnQgaGlnaFN1YmJhbmQgPSBoRnJlcS0+aGlnaFN1YmJhbmQ7Ci0gIGludCBub1N1YmJhbmRzICA9IGhpZ2hTdWJiYW5kIC0gbG93U3ViYmFuZDsKKyAgaW50IG5vU3ViYmFuZHMgPSBoaWdoU3ViYmFuZCAtIGxvd1N1YmJhbmQ7CiAKLSAgaW50ICAgIG5vTm9pc2VCYW5kcyA9IGhGcmVxLT5uTmZiOwotICBpbnQgICAgbm9fY29scyAgICAgID0gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cyAqIGhIZWFkZXJEYXRhLT50aW1lU3RlcDsKLSAgVUNIQVIgIGZpcnN0X3N0YXJ0ICA9IGJvcmRlcnNbMF0gKiBoSGVhZGVyRGF0YS0+dGltZVN0ZXA7CisgIC8qIG9sZCBoaWdoIHN1YmJhbmQgYmVmb3JlIGhlYWRlcmNoYW5nZQorICAgICB3ZSBhc3VtZSBubyBoZWFkZXJjaGFuZ2UgaGVyZSAgICAgICAgKi8KKyAgaW50IG92X2hpZ2hTdWJiYW5kID0gaEZyZXEtPmhpZ2hTdWJiYW5kOwogCi0gIFNDSEFSICBzaW5lTWFwcGVkW01BWF9GUkVRX0NPRUZGU107Ci0gIFNDSEFSICBvdl9hZGpfZSA9IFNDQUxFMkVYUChzYnJTY2FsZUZhY3Rvci0+b3ZfaGJfc2NhbGUpOwotICBTQ0hBUiAgYWRqX2UgPSAwOwotICBTQ0hBUiAgb3V0cHV0X2U7Ci0gIFNDSEFSICBmaW5hbF9lID0gMDsKKyAgaW50IG5vTm9pc2VCYW5kcyA9IGhGcmVxLT5uTmZiOworICBVQ0hBUiAqbm9TdWJGcmFtZUJhbmRzID0gaEZyZXEtPm5TZmI7CisgIGludCBub19jb2xzID0gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cyAqIGhIZWFkZXJEYXRhLT50aW1lU3RlcDsKIAotICBTQ0hBUiAgbWF4R2FpbkxpbWl0X2UgPSAoZnJhbWVFcnJvckZsYWcpID8gTUFYX0dBSU5fQ09OQ0VBTF9FWFAgOiBNQVhfR0FJTl9FWFA7CisgIFNDSEFSIHNpbmVNYXBwZWRbTUFYX0ZSRVFfQ09FRkZTXTsKKyAgU0NIQVIgb3ZfYWRqX2UgPSBTQ0FMRTJFWFAoc2JyU2NhbGVGYWN0b3ItPm92X2hiX3NjYWxlKTsKKyAgU0NIQVIgYWRqX2UgPSAwOworICBTQ0hBUiBvdXRwdXRfZTsKKyAgU0NIQVIgZmluYWxfZSA9IDA7CisgIC8qIGludGVyLVRFUyBpcyBhY3RpdmUgaW4gb25lIG9yIG1vcmUgZW52ZWxvcGVzIG9mIHRoZSBjdXJyZW50IFNCUiBmcmFtZSAqLworICBjb25zdCBpbnQgaVRFU19lbmFibGUgPSBoRnJhbWVEYXRhLT5pVEVTYWN0aXZlOworICBjb25zdCBpbnQgaVRFU19zY2FsZV9jaGFuZ2UgPSAoaVRFU19lbmFibGUpID8gSU5URVJfVEVTX1NGX0NIQU5HRSA6IDA7CisgIFNDSEFSIG1heEdhaW5MaW1pdF9lID0gKGZyYW1lRXJyb3JGbGFnKSA/IE1BWF9HQUlOX0NPTkNFQUxfRVhQIDogTUFYX0dBSU5fRVhQOwogCi0gIGludCB1c2VBbGlhc1JlZHVjdGlvbls2NF07CiAgIFVDSEFSIHNtb290aF9sZW5ndGggPSAwOwogCi0gIEZJWFBfU0dMICogcEllbnYgPSBoRnJhbWVEYXRhLT5pRW52ZWxvcGU7CisgIEZJWFBfU0dMICpwSWVudiA9IGhGcmFtZURhdGEtPmlFbnZlbG9wZTsKIAotICAvKgotICAgIEV4dHJhY3Qgc2luZSBmbGFncyBmb3IgYWxsIFFNRiBiYW5kcwotICAqLwotICBtYXBTaW5lRmxhZ3MoaEZyZXEtPmZyZXFCYW5kVGFibGVbMV0sCi0gICAgICAgICAgICAgICBoRnJlcS0+blNmYlsxXSwKLSAgICAgICAgICAgICAgIGhGcmFtZURhdGEtPmFkZEhhcm1vbmljcywKLSAgICAgICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmhhcm1GbGFnc1ByZXYsCi0gICAgICAgICAgICAgICBoRnJhbWVEYXRhLT5mcmFtZUluZm8udHJhbkVudiwKLSAgICAgICAgICAgICAgIHNpbmVNYXBwZWQpOworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQodXNlQWxpYXNSZWR1Y3Rpb24sIFVDSEFSLCA2NCkKIAorICAvKiBpZiB2YWx1ZXMgZGlmZmVyIHdlIGhhZCBhIGhlYWRlcmNoYW5nZTsgaWYgb2xkIGhpZ2hiYW5kIGlzIGJpZ2dlciB0aGVuIG5ldworICAgICBvbmUgd2UgbmVlZCB0byBwYXRjaCBvdmVybGFwLWhpZ2hiYW5kLXNjYWxpbmcgZm9yIHRoaXMgZnJhbWUgKHNlZSB1c2Ugb2YKKyAgICAgb3ZfaGlnaFN1YmJhbmQpIGFzIG92ZXJsYXAgY29udGFpbnMgaGlnaGVyIGZyZXF1ZW5jeSBjb21wb25lbnRzIHdoaWNoIHdvdWxkCisgICAgIGdldCBsb3N0ICovCisgIGlmIChoRnJlcS0+aGlnaFN1YmJhbmQgPCBoRnJlcS0+b3ZfaGlnaFN1YmJhbmQpIHsKKyAgICBvdl9oaWdoU3ViYmFuZCA9IGhGcmVxLT5vdl9oaWdoU3ViYmFuZDsKKyAgfQorCisgIGlmIChwdmNfbW9kZSA+IDApIHsKKyAgICBpZiAoaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLmJvcmRlcnNOb2lzZVswXSA+IGJvcmRlcnNQdmNbMF0pIHsKKyAgICAgIC8qIG5vaXNlIGVudmVsb3BlIG9mIHByZXZpb3VzIGZyYW1lIGlzIHRyYWlsaW5nIGludG8gY3VycmVudCBQVkMgZnJhbWUgKi8KKyAgICAgIGVudk5vaXNlID0gLTE7CisgICAgICBub2lzZUxldmVscyA9IGhfc2JyX2NhbF9lbnYtPnByZXZTYnJOb2lzZUZsb29yTGV2ZWw7CisgICAgICBub05vaXNlQmFuZHMgPSBoX3Nicl9jYWxfZW52LT5wcmV2Tk5mYjsKKyAgICAgIG5vU3ViRnJhbWVCYW5kcyA9IGhfc2JyX2NhbF9lbnYtPnByZXZOU2ZiOworICAgICAgbG93U3ViYmFuZCA9IGhfc2JyX2NhbF9lbnYtPnByZXZMb1N1YmJhbmQ7CisgICAgICBoaWdoU3ViYmFuZCA9IGhfc2JyX2NhbF9lbnYtPnByZXZIaVN1YmJhbmQ7CisKKyAgICAgIG5vU3ViYmFuZHMgPSBoaWdoU3ViYmFuZCAtIGxvd1N1YmJhbmQ7CisgICAgICBvdl9oaWdoU3ViYmFuZCA9IGhpZ2hTdWJiYW5kOworICAgICAgaWYgKGhpZ2hTdWJiYW5kIDwgaF9zYnJfY2FsX2Vudi0+cHJldl9vdl9oaWdoU3ViYmFuZCkgeworICAgICAgICBvdl9oaWdoU3ViYmFuZCA9IGhfc2JyX2NhbF9lbnYtPnByZXZfb3ZfaGlnaFN1YmJhbmQ7CisgICAgICB9CisKKyAgICAgIHBGcmVxQmFuZFRhYmxlWzBdID0gaF9zYnJfY2FsX2Vudi0+cHJldkZyZXFCYW5kVGFibGVMbzsKKyAgICAgIHBGcmVxQmFuZFRhYmxlWzFdID0gaF9zYnJfY2FsX2Vudi0+cHJldkZyZXFCYW5kVGFibGVIaTsKKyAgICAgIHBGcmVxQmFuZFRhYmxlTm9pc2UgPSBoX3Nicl9jYWxfZW52LT5wcmV2RnJlcUJhbmRUYWJsZU5vaXNlOworICAgIH0KKworICAgIG1hcFNpbmVGbGFnc1B2YyhwRnJlcUJhbmRUYWJsZVsxXSwgbm9TdWJGcmFtZUJhbmRzWzFdLAorICAgICAgICAgICAgICAgICAgICBoX3Nicl9jYWxfZW52LT5oYXJtRmxhZ3NQcmV2LAorICAgICAgICAgICAgICAgICAgICBoX3Nicl9jYWxfZW52LT5oYXJtRmxhZ3NQcmV2QWN0aXZlLCBzaW5lTWFwcGVkLAorICAgICAgICAgICAgICAgICAgICBoRnJhbWVEYXRhLT5zaW51c29pZGFsX3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAmaF9zYnJfY2FsX2Vudi0+c2ludXNvaWRhbF9wb3NpdGlvblByZXYsCisgICAgICAgICAgICAgICAgICAgIChib3JkZXJzWzBdID4gYm9yZGVyc1B2Y1swXSkgPyAxIDogMCk7CisgIH0gZWxzZSB7CisgICAgLyoKKyAgICAgIEV4dHJhY3Qgc2luZSBmbGFncyBmb3IgYWxsIFFNRiBiYW5kcworICAgICovCisgICAgbWFwU2luZUZsYWdzKHBGcmVxQmFuZFRhYmxlWzFdLCBub1N1YkZyYW1lQmFuZHNbMV0sCisgICAgICAgICAgICAgICAgIGhGcmFtZURhdGEtPmFkZEhhcm1vbmljcywgaF9zYnJfY2FsX2Vudi0+aGFybUZsYWdzUHJldiwKKyAgICAgICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+aGFybUZsYWdzUHJldkFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLnRyYW5FbnYsIHNpbmVNYXBwZWQpOworICB9CiAKICAgLyoKICAgICBTY2FuIGZvciBtYXhpbXVtIGluIGJ1ZmZlcmQgbm9pc2UgbGV2ZWxzLgpAQCAtNTY3LDE2MyArOTgyLDI4OSBAQAogICAgIGluIHJlZmVyZW5jZSBlbmVyZ2llcwogICAqLwogICBpZiAoIXVzZUxQKQotICAgIGFkal9lID0gaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlX2UgLSBnZXRTY2FsZWZhY3RvcihoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2UsIG5vU3ViYmFuZHMpOworICAgIGFkal9lID0gaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlX2UgLQorICAgICAgICAgICAgZ2V0U2NhbGVmYWN0b3IoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlLCBub1N1YmJhbmRzKTsKIAogICAvKgogICAgIFNjYW4gZm9yIG1heGltdW0gcmVmZXJlbmNlIGVuZXJneSB0byBiZSBhYmxlCiAgICAgdG8gc2VsZWN0IGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgYWRqX2UgYW5kIGZpbmFsX2UuCiAgICovCi0KLSAgZm9yIChpID0gMDsgaSA8IGhGcmFtZURhdGEtPmZyYW1lSW5mby5uRW52ZWxvcGVzOyBpKyspIHsKLSAgICBJTlQgbWF4U2ZiTnJnX2UgPSAtRlJBQ1RfQklUUytOUkdfRVhQX09GRlNFVDsgLyogc3RhcnQgdmFsdWUgZm9yIG1heGltdW0gc2VhcmNoICovCi0KLSAgICAvKiBGZXRjaCBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3IgY3VycmVudCBlbnZlbG9wZTogKi8KLSAgICBmb3IgKGo9aEZyZXEtPm5TZmJbaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLmZyZXFSZXNbaV1dOyBqIT0wOyBqLS0pIHsKLSAgICAgIG1heFNmYk5yZ19lID0gZml4TWF4KG1heFNmYk5yZ19lLChJTlQpKChMT05HKSgqcEllbnYrKykgJiBNQVNLX0UpKTsKLSAgICB9Ci0gICAgbWF4U2ZiTnJnX2UgLT0gTlJHX0VYUF9PRkZTRVQ7CisgIGlmIChwdmNfbW9kZSA+IDApIHsKKyAgICBJTlQgbWF4U2ZiTnJnX2UgPSBwUHZjRHluYW1pY0RhdGEtPnByZWRFc2dfZXhwTWF4OwogCiAgICAgLyogRW5lcmd5IC0+IG1hZ25pdHVkZSAoc3FydCBoYWxmZW5zIGV4cG9uZW50KSAqLwotICAgIG1heFNmYk5yZ19lID0gKG1heFNmYk5yZ19lKzEpID4+IDE7ICAvKiArMSB0byBnbyBzYWZlIChyb3VuZCB0byBuZXh0IGhpZ2hlciBpbnQpICovCisgICAgbWF4U2ZiTnJnX2UgPQorICAgICAgICAobWF4U2ZiTnJnX2UgKyAxKSA+PiAxOyAvKiArMSB0byBnbyBzYWZlIChyb3VuZCB0byBuZXh0IGhpZ2hlciBpbnQpICovCiAKICAgICAvKiBTb21lIHNhZmV0eSBtYXJnaW4gaXMgbmVlZGVkIGZvciAyIHJlYXNvbnM6CiAgICAgICAgLSBUaGUgc2lnbmFsIGVuZXJneSBpcyBub3QgZXF1YWxseSBzcHJlYWQgb3ZlciBhbGwgc3ViYmFuZCBzYW1wbGVzIGluCiAgICAgICAgICBhIHNwZWNpZmljIHNmYiBvZiBhbiBlbnZlbG9wZSAoTnJnIGNvdWxkIGJlIHRvbyBoaWdoIGJ5IGEgZmFjdG9yIG9mCiAgICAgICAgICBlbnZXaWR0aCAqIHNmYldpZHRoKQotICAgICAgIC0gU21vb3RoaW5nIGNhbiBzbWVhciBoaWdoIGdhaW5zIG9mIHRoZSBwcmV2aW91cyBlbnZlbG9wZSBpbnRvIHRoZSBjdXJyZW50CisgICAgICAgLSBTbW9vdGhpbmcgY2FuIHNtZWFyIGhpZ2ggZ2FpbnMgb2YgdGhlIHByZXZpb3VzIGVudmVsb3BlIGludG8gdGhlCisgICAgICAgY3VycmVudAogICAgICovCiAgICAgbWF4U2ZiTnJnX2UgKz0gNjsKIAotICAgIGlmIChib3JkZXJzW2ldIDwgaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cykKLSAgICAgIC8qIFRoaXMgZW52ZWxvcGUgYWZmZWN0cyB0aW1lc2xvdHMgdGhhdCBiZWxvbmcgdG8gdGhlIG91dHB1dCBmcmFtZSAqLwotICAgICAgYWRqX2UgPSAobWF4U2ZiTnJnX2UgPiBhZGpfZSkgPyBtYXhTZmJOcmdfZSA6IGFkal9lOworICAgIGFkal9lID0gbWF4U2ZiTnJnX2U7CisgICAgLy8gZmluYWxfZSBzaG91bGQgbm90IGV4aXN0IGZvciBQVkMgZml4Zml4IGZyYW1pbmcKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLm5FbnZlbG9wZXM7IGkrKykgeworICAgICAgSU5UIG1heFNmYk5yZ19lID0KKyAgICAgICAgICAtRlJBQ1RfQklUUyArIE5SR19FWFBfT0ZGU0VUOyAvKiBzdGFydCB2YWx1ZSBmb3IgbWF4aW11bSBzZWFyY2ggKi8KIAotICAgIGlmIChib3JkZXJzW2krMV0gPiBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzKQotICAgICAgLyogVGhpcyBlbnZlbG9wZSBhZmZlY3RzIHRpbWVzbG90cyBhZnRlciB0aGUgb3V0cHV0IGZyYW1lICovCi0gICAgICBmaW5hbF9lID0gIChtYXhTZmJOcmdfZSA+IGZpbmFsX2UpID8gbWF4U2ZiTnJnX2UgOiBmaW5hbF9lOworICAgICAgLyogRmV0Y2ggZnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIGN1cnJlbnQgZW52ZWxvcGU6ICovCisgICAgICBmb3IgKGogPSBub1N1YkZyYW1lQmFuZHNbaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLmZyZXFSZXNbaV1dOyBqICE9IDA7IGotLSkgeworICAgICAgICBtYXhTZmJOcmdfZSA9IGZpeE1heChtYXhTZmJOcmdfZSwgKElOVCkoKExPTkcpKCpwSWVudisrKSAmIE1BU0tfRSkpOworICAgICAgfQorICAgICAgbWF4U2ZiTnJnX2UgLT0gTlJHX0VYUF9PRkZTRVQ7CiAKKyAgICAgIC8qIEVuZXJneSAtPiBtYWduaXR1ZGUgKHNxcnQgaGFsZmVucyBleHBvbmVudCkgKi8KKyAgICAgIG1heFNmYk5yZ19lID0KKyAgICAgICAgICAobWF4U2ZiTnJnX2UgKyAxKSA+PiAxOyAvKiArMSB0byBnbyBzYWZlIChyb3VuZCB0byBuZXh0IGhpZ2hlciBpbnQpICovCisKKyAgICAgIC8qIFNvbWUgc2FmZXR5IG1hcmdpbiBpcyBuZWVkZWQgZm9yIDIgcmVhc29uczoKKyAgICAgICAgIC0gVGhlIHNpZ25hbCBlbmVyZ3kgaXMgbm90IGVxdWFsbHkgc3ByZWFkIG92ZXIgYWxsIHN1YmJhbmQgc2FtcGxlcyBpbgorICAgICAgICAgICBhIHNwZWNpZmljIHNmYiBvZiBhbiBlbnZlbG9wZSAoTnJnIGNvdWxkIGJlIHRvbyBoaWdoIGJ5IGEgZmFjdG9yIG9mCisgICAgICAgICAgIGVudldpZHRoICogc2ZiV2lkdGgpCisgICAgICAgICAtIFNtb290aGluZyBjYW4gc21lYXIgaGlnaCBnYWlucyBvZiB0aGUgcHJldmlvdXMgZW52ZWxvcGUgaW50byB0aGUKKyAgICAgICAgIGN1cnJlbnQKKyAgICAgICovCisgICAgICBtYXhTZmJOcmdfZSArPSA2OworCisgICAgICBpZiAoYm9yZGVyc1tpXSA8IGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMpCisgICAgICAgIC8qIFRoaXMgZW52ZWxvcGUgYWZmZWN0cyB0aW1lc2xvdHMgdGhhdCBiZWxvbmcgdG8gdGhlIG91dHB1dCBmcmFtZSAqLworICAgICAgICBhZGpfZSA9IGZNYXgobWF4U2ZiTnJnX2UsIGFkal9lKTsKKworICAgICAgaWYgKGJvcmRlcnNbaSArIDFdID4gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cykKKyAgICAgICAgLyogVGhpcyBlbnZlbG9wZSBhZmZlY3RzIHRpbWVzbG90cyBhZnRlciB0aGUgb3V0cHV0IGZyYW1lICovCisgICAgICAgIGZpbmFsX2UgPSBmTWF4KG1heFNmYk5yZ19lLCBmaW5hbF9lKTsKKyAgICB9CiAgIH0KLQogICAvKgogICAgIENhbGN1bGF0ZSBhZGp1c3RtZW50IGZhY3RvcnMgYW5kIGFwcGx5IHRoZW0gZm9yIGV2ZXJ5IGVudmVsb3BlLgogICAqLwogICBwSWVudiA9IGhGcmFtZURhdGEtPmlFbnZlbG9wZTsKIAotICBmb3IgKGkgPSAwOyBpIDwgaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLm5FbnZlbG9wZXM7IGkrKykgewotCisgIGlmIChwdmNfbW9kZSA+IDApIHsKKyAgICAvKiBpdGVyYXRlIG92ZXIgU0JSIHRpbWUgc2xvdHMgc3RhcnRpbmcgd2l0aCBib3JkZXJzUHZjW2ldICovCisgICAgaSA9IGJvcmRlcnNQdmNbMF07IC8qIHVzdWFsbHkgMDsgY2FuIGJlID4wIGlmIHN3aXRjaGluZyBmcm9tIGxlZ2FjeSBTQlIgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgUFZDICovCisgICAgaV9zdG9wID0gUFZDX05USU1FU0xPVDsKKyAgICBGREtfQVNTRVJUKGJvcmRlcnNQdmNbaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLm5FbnZlbG9wZXNdID09IFBWQ19OVElNRVNMT1QpOworICB9IGVsc2UgeworICAgIC8qIGl0ZXJhdGUgb3ZlciBTQlIgZW52ZWxvcGVzIHN0YXJ0aW5nIHdpdGggMCAqLworICAgIGkgPSAwOworICAgIGlfc3RvcCA9IGhGcmFtZURhdGEtPmZyYW1lSW5mby5uRW52ZWxvcGVzOworICB9CisgIGZvciAoOyBpIDwgaV9zdG9wOyBpKyspIHsKICAgICBpbnQgaywgbm9Ob2lzZUZsYWc7Ci0gICAgU0NIQVIgIG5vaXNlX2UsIGlucHV0X2UgPSBTQ0FMRTJFWFAoc2JyU2NhbGVGYWN0b3ItPmhiX3NjYWxlKTsKKyAgICBTQ0hBUiBub2lzZV9lLCBpbnB1dF9lID0gU0NBTEUyRVhQKHNiclNjYWxlRmFjdG9yLT5oYl9zY2FsZSk7CiAgICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHBOcmdzLCBFTlZfQ0FMQ19OUkdTLCAxKTsKIAogICAgIC8qCiAgICAgICBIZWxwZXIgdmFyaWFibGVzLgogICAgICovCi0gICAgVUNIQVIgc3RhcnRfcG9zID0gaEhlYWRlckRhdGEtPnRpbWVTdGVwICogYm9yZGVyc1tpXTsgIC8qIFN0YXJ0LXBvc2l0aW9uIGluIHRpbWUgKHN1YmJhbmQgc2FtcGxlKSBmb3IgY3VycmVudCBlbnZlbG9wZS4gKi8KLSAgICBVQ0hBUiBzdG9wX3BvcyA9IGhIZWFkZXJEYXRhLT50aW1lU3RlcCAqIGJvcmRlcnNbaSsxXTsgLyogU3RvcC1wb3NpdGlvbiBpbiB0aW1lIChzdWJiYW5kIHNhbXBsZSkgZm9yIGN1cnJlbnQgZW52ZWxvcGUuICovCi0gICAgVUNIQVIgZnJlcV9yZXMgPSBoRnJhbWVEYXRhLT5mcmFtZUluZm8uZnJlcVJlc1tpXTsgICAgIC8qIEZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBjdXJyZW50IGVudmVsb3BlLiAqLworICAgIGludCBzdGFydF9wb3MsIHN0b3BfcG9zLCBmcmVxX3JlczsKKyAgICBpZiAocHZjX21vZGUgPiAwKSB7CisgICAgICBzdGFydF9wb3MgPQorICAgICAgICAgIGhIZWFkZXJEYXRhLT50aW1lU3RlcCAqCisgICAgICAgICAgaTsgLyogU3RhcnQtcG9zaXRpb24gaW4gdGltZSAoc3ViYmFuZCBzYW1wbGUpIGZvciBjdXJyZW50IGVudmVsb3BlLiAqLworICAgICAgc3RvcF9wb3MgPSBoSGVhZGVyRGF0YS0+dGltZVN0ZXAgKiAoaSArIDEpOyAvKiBTdG9wLXBvc2l0aW9uIGluIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN1YmJhbmQgc2FtcGxlKSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBlbnZlbG9wZS4gKi8KKyAgICAgIGZyZXFfcmVzID0KKyAgICAgICAgICBoRnJhbWVEYXRhLT5mcmFtZUluZm8KKyAgICAgICAgICAgICAgLmZyZXFSZXNbMF07IC8qIEZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBjdXJyZW50IGVudmVsb3BlLiAqLworICAgICAgRkRLX0FTU0VSVCgKKyAgICAgICAgICBmcmVxX3JlcyA9PQorICAgICAgICAgIGhGcmFtZURhdGEtPmZyYW1lSW5mby5mcmVxUmVzW2hGcmFtZURhdGEtPmZyYW1lSW5mby5uRW52ZWxvcGVzIC0gMV0pOworICAgIH0gZWxzZSB7CisgICAgICBzdGFydF9wb3MgPSBoSGVhZGVyRGF0YS0+dGltZVN0ZXAgKgorICAgICAgICAgICAgICAgICAgYm9yZGVyc1tpXTsgLyogU3RhcnQtcG9zaXRpb24gaW4gdGltZSAoc3ViYmFuZCBzYW1wbGUpIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBlbnZlbG9wZS4gKi8KKyAgICAgIHN0b3BfcG9zID0gaEhlYWRlckRhdGEtPnRpbWVTdGVwICoKKyAgICAgICAgICAgICAgICAgYm9yZGVyc1tpICsgMV07IC8qIFN0b3AtcG9zaXRpb24gaW4gdGltZSAoc3ViYmFuZCBzYW1wbGUpIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBlbnZlbG9wZS4gKi8KKyAgICAgIGZyZXFfcmVzID0KKyAgICAgICAgICBoRnJhbWVEYXRhLT5mcmFtZUluZm8KKyAgICAgICAgICAgICAgLmZyZXFSZXNbaV07IC8qIEZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBjdXJyZW50IGVudmVsb3BlLiAqLworICAgIH0KIAotCi0gICAgLyogQWx3YXlzIGRvIGZ1bGx5IGluaXRpYWxpemUgdGhlIHRlbXBvcmFyeSBlbmVyZ3kgdGFibGUuIFRoaXMgcHJldmVudHMgbmVnYXRpdmUgZW5lcmdpZXMgYW5kIGV4dHJlbWUgZ2FpbiBmYWN0b3JzIGluCi0gICAgICAgY2FzZXMgd2hlcmUgdGhlIG51bWJlciBvZiBsaW1pdGVyIGJhbmRzIGV4Y2VlZHMgdGhlIG51bWJlciBvZiBzdWJiYW5kcy4gVGhlIGxhdHRlciBjYW4gYmUgY2F1c2VkIGJ5IHVuZGV0ZWN0ZWQgYml0Ci0gICAgICAgZXJyb3JzIGFuZCBpcyB0ZXN0ZWQgYnkgc29tZSBzdHJlYW1zIGZyb20gdGhlIGNlcnRpZmljYXRpb24gc2V0LiAqLworICAgIC8qIEFsd2F5cyBmdWxseSBpbml0aWFsaXplIHRoZSB0ZW1wb3JhcnkgZW5lcmd5IHRhYmxlLiBUaGlzIHByZXZlbnRzCisgICAgICAgbmVnYXRpdmUgZW5lcmdpZXMgYW5kIGV4dHJlbWUgZ2FpbiBmYWN0b3JzIGluIGNhc2VzIHdoZXJlIHRoZSBudW1iZXIgb2YKKyAgICAgICBsaW1pdGVyIGJhbmRzIGV4Y2VlZHMgdGhlIG51bWJlciBvZiBzdWJiYW5kcy4gVGhlIGxhdHRlciBjYW4gYmUgY2F1c2VkIGJ5CisgICAgICAgdW5kZXRlY3RlZCBiaXQgZXJyb3JzIGFuZCBpcyB0ZXN0ZWQgYnkgc29tZSBzdHJlYW1zIGZyb20gdGhlCisgICAgICAgY2VydGlmaWNhdGlvbiBzZXQuICovCiAgICAgRkRLbWVtY2xlYXIocE5yZ3MsIHNpemVvZihFTlZfQ0FMQ19OUkdTKSk7CiAKLSAgICAvKiBJZiB0aGUgc3RhcnQtcG9zIG9mIHRoZSBjdXJyZW50IGVudmVsb3BlIGVxdWFscyB0aGUgc3RvcCBwb3Mgb2YgdGhlIGN1cnJlbnQKLSAgICAgICBub2lzZSBlbnZlbG9wZSwgaW5jcmVhc2UgdGhlIHBvaW50ZXIgKGkuZS4gY2hvb3NlIHRoZSBuZXh0IG5vaXNlLWZsb29yKS4qLwotICAgIGlmIChib3JkZXJzW2ldID09IGhGcmFtZURhdGEtPmZyYW1lSW5mby5ib3JkZXJzTm9pc2VbZW52Tm9pc2UrMV0pewotICAgICAgbm9pc2VMZXZlbHMgKz0gbm9Ob2lzZUJhbmRzOyAgIC8qIFRoZSBub2lzZSBmbG9vciBkYXRhIGlzIHN0b3JlZCBpbiBhIHJvdyBbbm9pc2VGbG9vcjEgbm9pc2VGbG9vcjIuLi5dLiovCi0gICAgICBlbnZOb2lzZSsrOwotICAgIH0KKyAgICBpZiAocHZjX21vZGUgPiAwKSB7CisgICAgICAvKiBnZXQgcHJlZGljdGVkIGVuZXJneSB2YWx1ZXMgZnJvbSBQVkMgbW9kdWxlICovCisgICAgICBleHBhbmRQcmVkRXNnKHBQdmNEeW5hbWljRGF0YSwgaSwgKGludClNQVhfRlJFUV9DT0VGRlMsIHBOcmdzLT5ucmdSZWYsCisgICAgICAgICAgICAgICAgICAgIHBOcmdzLT5ucmdSZWZfZSk7CiAKLSAgICBpZihpPT1oRnJhbWVEYXRhLT5mcmFtZUluZm8udHJhbkVudiB8fCBpPT1oX3Nicl9jYWxfZW52LT5wcmV2VHJhbkVudikgLyogYXR0YWNrICovCisgICAgICBpZiAoaSA9PSBib3JkZXJzWzBdKSB7CisgICAgICAgIG1hcFNpbmVGbGFncyhwRnJlcUJhbmRUYWJsZVsxXSwgbm9TdWJGcmFtZUJhbmRzWzFdLAorICAgICAgICAgICAgICAgICAgICAgaEZyYW1lRGF0YS0+YWRkSGFybW9uaWNzLCBoX3Nicl9jYWxfZW52LT5oYXJtRmxhZ3NQcmV2LAorICAgICAgICAgICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+aGFybUZsYWdzUHJldkFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgIGhGcmFtZURhdGEtPnNpbnVzb2lkYWxfcG9zaXRpb24sIHNpbmVNYXBwZWQpOworICAgICAgfQorCisgICAgICBpZiAoaSA+PSBoRnJhbWVEYXRhLT5mcmFtZUluZm8uYm9yZGVyc05vaXNlW2Vudk5vaXNlICsgMV0pIHsKKyAgICAgICAgaWYgKGVudk5vaXNlID49IDApIHsKKyAgICAgICAgICBub2lzZUxldmVscyArPSBub05vaXNlQmFuZHM7IC8qIFRoZSBub2lzZSBmbG9vciBkYXRhIGlzIHN0b3JlZCBpbiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgW25vaXNlRmxvb3IxIG5vaXNlRmxvb3IyLi4uXS4qLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIGxlYXZlIHRyYWlsaW5nIG5vaXNlIGVudmVsb3BlIG9mIHBhc3QgZnJhbWUgKi8KKyAgICAgICAgICBub05vaXNlQmFuZHMgPSBoRnJlcS0+bk5mYjsKKyAgICAgICAgICBub1N1YkZyYW1lQmFuZHMgPSBoRnJlcS0+blNmYjsKKyAgICAgICAgICBub2lzZUxldmVscyA9IGhGcmFtZURhdGEtPnNick5vaXNlRmxvb3JMZXZlbDsKKworICAgICAgICAgIGxvd1N1YmJhbmQgPSBoRnJlcS0+bG93U3ViYmFuZDsKKyAgICAgICAgICBoaWdoU3ViYmFuZCA9IGhGcmVxLT5oaWdoU3ViYmFuZDsKKworICAgICAgICAgIG5vU3ViYmFuZHMgPSBoaWdoU3ViYmFuZCAtIGxvd1N1YmJhbmQ7CisgICAgICAgICAgb3ZfaGlnaFN1YmJhbmQgPSBoaWdoU3ViYmFuZDsKKyAgICAgICAgICBpZiAoaGlnaFN1YmJhbmQgPCBoRnJlcS0+b3ZfaGlnaFN1YmJhbmQpIHsKKyAgICAgICAgICAgIG92X2hpZ2hTdWJiYW5kID0gaEZyZXEtPm92X2hpZ2hTdWJiYW5kOworICAgICAgICAgIH0KKworICAgICAgICAgIHBGcmVxQmFuZFRhYmxlWzBdID0gaEZyZXEtPmZyZXFCYW5kVGFibGVMbzsKKyAgICAgICAgICBwRnJlcUJhbmRUYWJsZVsxXSA9IGhGcmVxLT5mcmVxQmFuZFRhYmxlSGk7CisgICAgICAgICAgcEZyZXFCYW5kVGFibGVOb2lzZSA9IGhGcmVxLT5mcmVxQmFuZFRhYmxlTm9pc2U7CisgICAgICAgIH0KKyAgICAgICAgZW52Tm9pc2UrKzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogSWYgdGhlIHN0YXJ0LXBvcyBvZiB0aGUgY3VycmVudCBlbnZlbG9wZSBlcXVhbHMgdGhlIHN0b3AgcG9zIG9mIHRoZQorICAgICAgICAgY3VycmVudCBub2lzZSBlbnZlbG9wZSwgaW5jcmVhc2UgdGhlIHBvaW50ZXIgKGkuZS4gY2hvb3NlIHRoZSBuZXh0CisgICAgICAgICBub2lzZS1mbG9vcikuKi8KKyAgICAgIGlmIChib3JkZXJzW2ldID09IGhGcmFtZURhdGEtPmZyYW1lSW5mby5ib3JkZXJzTm9pc2VbZW52Tm9pc2UgKyAxXSkgeworICAgICAgICBub2lzZUxldmVscyArPSBub05vaXNlQmFuZHM7IC8qIFRoZSBub2lzZSBmbG9vciBkYXRhIGlzIHN0b3JlZCBpbiBhIHJvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtub2lzZUZsb29yMSBub2lzZUZsb29yMi4uLl0uKi8KKyAgICAgICAgZW52Tm9pc2UrKzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGkgPT0gaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLnRyYW5FbnYgfHwKKyAgICAgICAgaSA9PSBoX3Nicl9jYWxfZW52LT5wcmV2VHJhbkVudikgLyogYXR0YWNrICovCiAgICAgewogICAgICAgbm9Ob2lzZUZsYWcgPSAxOwotICAgICAgaWYgKCF1c2VMUCkKLSAgICAgICAgc21vb3RoX2xlbmd0aCA9IDA7ICAvKiBObyBzbW9vdGhpbmcgb24gYXR0YWNrcyEgKi8KLSAgICB9Ci0gICAgZWxzZSB7CisgICAgICBpZiAoIXVzZUxQKSBzbW9vdGhfbGVuZ3RoID0gMDsgLyogTm8gc21vb3RoaW5nIG9uIGF0dGFja3MhICovCisgICAgfSBlbHNlIHsKICAgICAgIG5vTm9pc2VGbGFnID0gMDsKICAgICAgIGlmICghdXNlTFApCi0gICAgICAgIHNtb290aF9sZW5ndGggPSAoMSAtIGhIZWFkZXJEYXRhLT5ic19kYXRhLnNtb290aGluZ0xlbmd0aCkgPDwgMjsgIC8qIGNhbiBiZWNvbWUgZWl0aGVyIDAgb3IgNCAqLworICAgICAgICBzbW9vdGhfbGVuZ3RoID0gKDEgLSBoSGVhZGVyRGF0YS0+YnNfZGF0YS5zbW9vdGhpbmdMZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAyOyAvKiBjYW4gYmVjb21lIGVpdGhlciAwIG9yIDQgKi8KICAgICB9CiAKLQogICAgIC8qCiAgICAgICBFbmVyZ3kgZXN0aW1hdGlvbiBpbiB0cmFuc3Bvc2VkIGhpZ2hiYW5kLgogICAgICovCiAgICAgaWYgKGhIZWFkZXJEYXRhLT5ic19kYXRhLmludGVycG9sRnJlcSkKLSAgICAgIGNhbGNOcmdQZXJTdWJiYW5kKGFuYWx5c0J1ZmZlclJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAodXNlTFApID8gTlVMTCA6IGFuYWx5c0J1ZmZlckltYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBsb3dTdWJiYW5kLCBoaWdoU3ViYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3Bvcywgc3RvcF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9lLAotICAgICAgICAgICAgICAgICAgICAgICAgcE5yZ3MtPm5yZ0VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdzLT5ucmdFc3RfZSk7CisgICAgICBjYWxjTnJnUGVyU3ViYmFuZChhbmFseXNCdWZmZXJSZWFsLCAodXNlTFApID8gTlVMTCA6IGFuYWx5c0J1ZmZlckltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICBsb3dTdWJiYW5kLCBoaWdoU3ViYmFuZCwgc3RhcnRfcG9zLCBzdG9wX3BvcywgaW5wdXRfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdzLT5ucmdFc3QsIHBOcmdzLT5ucmdFc3RfZSk7CiAgICAgZWxzZQotICAgICAgY2FsY05yZ1BlclNmYihhbmFseXNCdWZmZXJSZWFsLAotICAgICAgICAgICAgICAgICAgICAodXNlTFApID8gTlVMTCA6IGFuYWx5c0J1ZmZlckltYWcsCi0gICAgICAgICAgICAgICAgICAgIGhGcmVxLT5uU2ZiW2ZyZXFfcmVzXSwKLSAgICAgICAgICAgICAgICAgICAgaEZyZXEtPmZyZXFCYW5kVGFibGVbZnJlcV9yZXNdLAotICAgICAgICAgICAgICAgICAgICBzdGFydF9wb3MsIHN0b3BfcG9zLAotICAgICAgICAgICAgICAgICAgICBpbnB1dF9lLAotICAgICAgICAgICAgICAgICAgICBwTnJncy0+bnJnRXN0LAorICAgICAgY2FsY05yZ1BlclNmYihhbmFseXNCdWZmZXJSZWFsLCAodXNlTFApID8gTlVMTCA6IGFuYWx5c0J1ZmZlckltYWcsCisgICAgICAgICAgICAgICAgICAgIG5vU3ViRnJhbWVCYW5kc1tmcmVxX3Jlc10sIHBGcmVxQmFuZFRhYmxlW2ZyZXFfcmVzXSwKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9zLCBzdG9wX3BvcywgaW5wdXRfZSwgcE5yZ3MtPm5yZ0VzdCwKICAgICAgICAgICAgICAgICAgICAgcE5yZ3MtPm5yZ0VzdF9lKTsKIAogICAgIC8qCiAgICAgICBDYWxjdWxhdGUgc3ViYmFuZCBnYWlucwogICAgICovCiAgICAgewotICAgICAgVUNIQVIgKiB0YWJsZSA9IGhGcmVxLT5mcmVxQmFuZFRhYmxlW2ZyZXFfcmVzXTsKLSAgICAgIFVDSEFSICogcFVpTm9pc2UgPSAmaEZyZXEtPmZyZXFCYW5kVGFibGVOb2lzZVsxXTsgLyohIFVwcGVyIGxpbWl0IG9mIHRoZSBjdXJyZW50IG5vaXNlIGZsb29yIGJhbmQuICovCisgICAgICBVQ0hBUiAqdGFibGUgPSBwRnJlcUJhbmRUYWJsZVtmcmVxX3Jlc107CisgICAgICBVQ0hBUiAqcFVpTm9pc2UgPQorICAgICAgICAgICZwRnJlcUJhbmRUYWJsZU5vaXNlWzFdOyAvKiEgVXBwZXIgbGltaXQgb2YgdGhlIGN1cnJlbnQgbm9pc2UgZmxvb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZC4gKi8KIAotICAgICAgRklYUF9TR0wgKiBwTm9pc2VMZXZlbHMgPSBub2lzZUxldmVsczsKKyAgICAgIEZJWFBfU0dMICpwTm9pc2VMZXZlbHMgPSBub2lzZUxldmVsczsKIAotICAgICAgRklYUF9EQkwgdG1wTm9pc2UgPSBGWF9TR0wyRlhfREJMKChGSVhQX1NHTCkoKExPTkcpKCpwTm9pc2VMZXZlbHMpICYgTUFTS19NKSk7Ci0gICAgICBTQ0hBUiAgICB0bXBOb2lzZV9lID0gKFVDSEFSKSgoTE9ORykoKnBOb2lzZUxldmVscysrKSAmIE1BU0tfRSkgLSBOT0lTRV9FWFBfT0ZGU0VUOworICAgICAgRklYUF9EQkwgdG1wTm9pc2UgPQorICAgICAgICAgIEZYX1NHTDJGWF9EQkwoKEZJWFBfU0dMKSgoTE9ORykoKnBOb2lzZUxldmVscykgJiBNQVNLX00pKTsKKyAgICAgIFNDSEFSIHRtcE5vaXNlX2UgPQorICAgICAgICAgIChVQ0hBUikoKExPTkcpKCpwTm9pc2VMZXZlbHMrKykgJiBNQVNLX0UpIC0gTk9JU0VfRVhQX09GRlNFVDsKIAogICAgICAgaW50IGNjID0gMDsKICAgICAgIGMgPSAwOwotICAgICAgZm9yIChqID0gMDsgaiA8IGhGcmVxLT5uU2ZiW2ZyZXFfcmVzXTsgaisrKSB7CisgICAgICBpZiAocHZjX21vZGUgPiAwKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBub1N1YkZyYW1lQmFuZHNbZnJlcV9yZXNdOyBqKyspIHsKKyAgICAgICAgICBVQ0hBUiBzaW5lUHJlc2VudEZsYWcgPSAwOworICAgICAgICAgIGludCBsaSA9IHRhYmxlW2pdOworICAgICAgICAgIGludCB1aSA9IHRhYmxlW2ogKyAxXTsKIAotICAgICAgICBGSVhQX0RCTCByZWZOcmcgICA9IEZYX1NHTDJGWF9EQkwoKEZJWFBfU0dMKSgoTE9ORykoKnBJZW52KSAmIE1BU0tfTSkpOwotICAgICAgICBTQ0hBUiAgICByZWZOcmdfZSA9IChTQ0hBUikoKExPTkcpKCpwSWVudikgJiBNQVNLX0UpIC0gTlJHX0VYUF9PRkZTRVQ7Ci0KLSAgICAgICAgVUNIQVIgc2luZVByZXNlbnRGbGFnID0gMDsKLSAgICAgICAgaW50IGxpID0gdGFibGVbal07Ci0gICAgICAgIGludCB1aSA9IHRhYmxlW2orMV07Ci0KLSAgICAgICAgZm9yIChrPWxpOyBrPHVpOyBrKyspIHsKLSAgICAgICAgICBzaW5lUHJlc2VudEZsYWcgfD0gKGkgPj0gc2luZU1hcHBlZFtjY10pOwotICAgICAgICAgIGNjKys7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGs9bGk7IGs8dWk7IGsrKykgewotICAgICAgICAgIGlmIChrID49ICpwVWlOb2lzZSkgewotICAgICAgICAgICAgdG1wTm9pc2UgPSBGWF9TR0wyRlhfREJMKChGSVhQX1NHTCkoKExPTkcpKCpwTm9pc2VMZXZlbHMpICYgTUFTS19NKSk7Ci0gICAgICAgICAgICB0bXBOb2lzZV9lID0gKFNDSEFSKSgoTE9ORykoKnBOb2lzZUxldmVscysrKSAmIE1BU0tfRSkgLSBOT0lTRV9FWFBfT0ZGU0VUOwotCi0gICAgICAgICAgICBwVWlOb2lzZSsrOworICAgICAgICAgIGZvciAoayA9IGxpOyBrIDwgdWk7IGsrKykgeworICAgICAgICAgICAgc2luZVByZXNlbnRGbGFnIHw9IChpID49IHNpbmVNYXBwZWRbY2NdKTsKKyAgICAgICAgICAgIGNjKys7CiAgICAgICAgICAgfQogCi0gICAgICAgICAgRkRLX0FTU0VSVChrID49IGxvd1N1YmJhbmQpOworICAgICAgICAgIGZvciAoayA9IGxpOyBrIDwgdWk7IGsrKykgeworICAgICAgICAgICAgRklYUF9EQkwgcmVmTnJnID0gcE5yZ3MtPm5yZ1JlZltrIC0gbG93U3ViYmFuZF07CisgICAgICAgICAgICBTQ0hBUiByZWZOcmdfZSA9IHBOcmdzLT5ucmdSZWZfZVtrIC0gbG93U3ViYmFuZF07CiAKLSAgICAgICAgICBpZiAodXNlTFApCi0gICAgICAgICAgICB1c2VBbGlhc1JlZHVjdGlvbltrLWxvd1N1YmJhbmRdID0gIXNpbmVQcmVzZW50RmxhZzsKKyAgICAgICAgICAgIGlmIChrID49ICpwVWlOb2lzZSkgeworICAgICAgICAgICAgICB0bXBOb2lzZSA9CisgICAgICAgICAgICAgICAgICBGWF9TR0wyRlhfREJMKChGSVhQX1NHTCkoKExPTkcpKCpwTm9pc2VMZXZlbHMpICYgTUFTS19NKSk7CisgICAgICAgICAgICAgIHRtcE5vaXNlX2UgPQorICAgICAgICAgICAgICAgICAgKFNDSEFSKSgoTE9ORykoKnBOb2lzZUxldmVscysrKSAmIE1BU0tfRSkgLSBOT0lTRV9FWFBfT0ZGU0VUOwogCi0gICAgICAgICAgcE5yZ3MtPm5yZ1NpbmVbY10gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgICAgICBwTnJncy0+bnJnU2luZV9lW2NdID0gMDsKKyAgICAgICAgICAgICAgcFVpTm9pc2UrKzsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgIGNhbGNTdWJiYW5kR2FpbihyZWZOcmcsIHJlZk5yZ19lLCBwTnJncywgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wTm9pc2UsIHRtcE5vaXNlX2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmVQcmVzZW50RmxhZywgaSA+PSBzaW5lTWFwcGVkW2NdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBub05vaXNlRmxhZyk7CisgICAgICAgICAgICBGREtfQVNTRVJUKGsgPj0gbG93U3ViYmFuZCk7CiAKLSAgICAgICAgICBwTnJncy0+bnJnUmVmW2NdICAgPSByZWZOcmc7Ci0gICAgICAgICAgcE5yZ3MtPm5yZ1JlZl9lW2NdID0gcmVmTnJnX2U7CisgICAgICAgICAgICBpZiAodXNlTFApIHVzZUFsaWFzUmVkdWN0aW9uW2sgLSBsb3dTdWJiYW5kXSA9ICFzaW5lUHJlc2VudEZsYWc7CiAKLSAgICAgICAgICBjKys7CisgICAgICAgICAgICBwTnJncy0+bnJnU2luZVtjXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgICAgICAgcE5yZ3MtPm5yZ1NpbmVfZVtjXSA9IDA7CisKKyAgICAgICAgICAgIGNhbGNTdWJiYW5kR2FpbihyZWZOcmcsIHJlZk5yZ19lLCBwTnJncywgYywgdG1wTm9pc2UsIHRtcE5vaXNlX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZVByZXNlbnRGbGFnLCBpID49IHNpbmVNYXBwZWRbY10sIG5vTm9pc2VGbGFnKTsKKworICAgICAgICAgICAgYysrOworICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBwSWVudisrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG5vU3ViRnJhbWVCYW5kc1tmcmVxX3Jlc107IGorKykgeworICAgICAgICAgIEZJWFBfREJMIHJlZk5yZyA9IEZYX1NHTDJGWF9EQkwoKEZJWFBfU0dMKSgoTE9ORykoKnBJZW52KSAmIE1BU0tfTSkpOworICAgICAgICAgIFNDSEFSIHJlZk5yZ19lID0gKFNDSEFSKSgoTE9ORykoKnBJZW52KSAmIE1BU0tfRSkgLSBOUkdfRVhQX09GRlNFVDsKKworICAgICAgICAgIFVDSEFSIHNpbmVQcmVzZW50RmxhZyA9IDA7CisgICAgICAgICAgaW50IGxpID0gdGFibGVbal07CisgICAgICAgICAgaW50IHVpID0gdGFibGVbaiArIDFdOworCisgICAgICAgICAgZm9yIChrID0gbGk7IGsgPCB1aTsgaysrKSB7CisgICAgICAgICAgICBzaW5lUHJlc2VudEZsYWcgfD0gKGkgPj0gc2luZU1hcHBlZFtjY10pOworICAgICAgICAgICAgY2MrKzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmb3IgKGsgPSBsaTsgayA8IHVpOyBrKyspIHsKKyAgICAgICAgICAgIGlmIChrID49ICpwVWlOb2lzZSkgeworICAgICAgICAgICAgICB0bXBOb2lzZSA9CisgICAgICAgICAgICAgICAgICBGWF9TR0wyRlhfREJMKChGSVhQX1NHTCkoKExPTkcpKCpwTm9pc2VMZXZlbHMpICYgTUFTS19NKSk7CisgICAgICAgICAgICAgIHRtcE5vaXNlX2UgPQorICAgICAgICAgICAgICAgICAgKFNDSEFSKSgoTE9ORykoKnBOb2lzZUxldmVscysrKSAmIE1BU0tfRSkgLSBOT0lTRV9FWFBfT0ZGU0VUOworCisgICAgICAgICAgICAgIHBVaU5vaXNlKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZES19BU1NFUlQoayA+PSBsb3dTdWJiYW5kKTsKKworICAgICAgICAgICAgaWYgKHVzZUxQKSB1c2VBbGlhc1JlZHVjdGlvbltrIC0gbG93U3ViYmFuZF0gPSAhc2luZVByZXNlbnRGbGFnOworCisgICAgICAgICAgICBwTnJncy0+bnJnU2luZVtjXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgICAgICAgcE5yZ3MtPm5yZ1NpbmVfZVtjXSA9IDA7CisKKyAgICAgICAgICAgIGNhbGNTdWJiYW5kR2FpbihyZWZOcmcsIHJlZk5yZ19lLCBwTnJncywgYywgdG1wTm9pc2UsIHRtcE5vaXNlX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZVByZXNlbnRGbGFnLCBpID49IHNpbmVNYXBwZWRbY10sIG5vTm9pc2VGbGFnKTsKKworICAgICAgICAgICAgcE5yZ3MtPm5yZ1JlZltjXSA9IHJlZk5yZzsKKyAgICAgICAgICAgIHBOcmdzLT5ucmdSZWZfZVtjXSA9IHJlZk5yZ19lOworCisgICAgICAgICAgICBjKys7CisgICAgICAgICAgfQorICAgICAgICAgIHBJZW52Kys7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKQEAgLTczMiwxOSArMTI3MywzMCBAQAogICAgICovCiAKICAgICBmb3IgKGMgPSAwOyBjIDwgaEZyZXEtPm5vTGltaXRlckJhbmRzOyBjKyspIHsKLQogICAgICAgRklYUF9EQkwgc3VtUmVmLCBib29zdEdhaW4sIG1heEdhaW47CiAgICAgICBGSVhQX0RCTCBhY2N1ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICBTQ0hBUiAgIHN1bVJlZl9lLCBib29zdEdhaW5fZSwgbWF4R2Fpbl9lLCBhY2N1X2UgPSAwOworICAgICAgU0NIQVIgc3VtUmVmX2UsIGJvb3N0R2Fpbl9lLCBtYXhHYWluX2UsIGFjY3VfZSA9IDA7CisgICAgICBpbnQgbWF4R2FpbkxpbUdhaW5TdW1fZSA9IDA7CiAKLSAgICAgIGNhbGNBdmdHYWluKHBOcmdzLAotICAgICAgICAgICAgICAgICAgaEZyZXEtPmxpbWl0ZXJCYW5kVGFibGVbY10sIGhGcmVxLT5saW1pdGVyQmFuZFRhYmxlW2MrMV0sCi0gICAgICAgICAgICAgICAgICAmc3VtUmVmLCAmc3VtUmVmX2UsCi0gICAgICAgICAgICAgICAgICAmbWF4R2FpbiwgJm1heEdhaW5fZSk7CisgICAgICBjYWxjQXZnR2FpbihwTnJncywgaEZyZXEtPmxpbWl0ZXJCYW5kVGFibGVbY10sCisgICAgICAgICAgICAgICAgICBoRnJlcS0+bGltaXRlckJhbmRUYWJsZVtjICsgMV0sICZzdW1SZWYsICZzdW1SZWZfZSwgJm1heEdhaW4sCisgICAgICAgICAgICAgICAgICAmbWF4R2Fpbl9lKTsKIAogICAgICAgLyogTXVsdGlwbHkgbWF4R2FpbiB3aXRoIGxpbWl0ZXJHYWluOiAqLwotICAgICAgbWF4R2FpbiA9IGZNdWx0KG1heEdhaW4sIEZES19zYnJEZWNvZGVyX3Nicl9saW1HYWluc19tW2hIZWFkZXJEYXRhLT5ic19kYXRhLmxpbWl0ZXJHYWluc10pOwotICAgICAgbWF4R2Fpbl9lICs9IEZES19zYnJEZWNvZGVyX3Nicl9saW1HYWluc19lW2hIZWFkZXJEYXRhLT5ic19kYXRhLmxpbWl0ZXJHYWluc107CisgICAgICBtYXhHYWluID0gZk11bHQoCisgICAgICAgICAgbWF4R2FpbiwKKyAgICAgICAgICBGREtfc2JyRGVjb2Rlcl9zYnJfbGltR2FpbnNfbVtoSGVhZGVyRGF0YS0+YnNfZGF0YS5saW1pdGVyR2FpbnNdKTsKKyAgICAgIC8qIG1heEdhaW5fZSArPQorICAgICAgICogRkRLX3NickRlY29kZXJfc2JyX2xpbUdhaW5zX2VbaEhlYWRlckRhdGEtPmJzX2RhdGEubGltaXRlckdhaW5zXTsgKi8KKyAgICAgIC8qIFRoZSBhZGRpdGlvbiBvZiBtYXhHYWluX2UgYW5kIEZES19zYnJEZWNvZGVyX3Nicl9saW1HYWluc19lWzNdIG1pZ2h0CisgICAgICAgICB5aWVsZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIDEyNyB3aGljaCBkb2Vzbid0IGZpdCBpbnRvIGFuIFNDSEFSISBJbiB0aGVzZQorICAgICAgICAgcmFyZSBzaXR1YXRpb25zIGxpbWl0IG1heEdhaW5fZSB0byAxMjcuCisgICAgICAqLworICAgICAgbWF4R2FpbkxpbUdhaW5TdW1fZSA9CisgICAgICAgICAgbWF4R2Fpbl9lICsKKyAgICAgICAgICBGREtfc2JyRGVjb2Rlcl9zYnJfbGltR2FpbnNfZVtoSGVhZGVyRGF0YS0+YnNfZGF0YS5saW1pdGVyR2FpbnNdOworICAgICAgbWF4R2Fpbl9lID0KKyAgICAgICAgICAobWF4R2FpbkxpbUdhaW5TdW1fZSA+IDEyNykgPyAoU0NIQVIpMTI3IDogKFNDSEFSKW1heEdhaW5MaW1HYWluU3VtX2U7CiAKICAgICAgIC8qIFNjYWxlIG1hbnRpc3NhIG9mIE1heEdhaW4gaW50byByYW5nZSBiZXR3ZWVuIDAuNSBhbmQgMTogKi8KICAgICAgIGlmIChtYXhHYWluID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKQpAQCAtNzUyLDcgKzEzMDQsNyBAQAogICAgICAgZWxzZSB7CiAgICAgICAgIFNDSEFSIGNoYXJUZW1wID0gQ291bnRMZWFkaW5nQml0cyhtYXhHYWluKTsKICAgICAgICAgbWF4R2Fpbl9lIC09IGNoYXJUZW1wOwotICAgICAgICBtYXhHYWluICA8PD0gKGludCljaGFyVGVtcDsKKyAgICAgICAgbWF4R2FpbiA8PD0gKGludCljaGFyVGVtcDsKICAgICAgIH0KIAogICAgICAgaWYgKG1heEdhaW5fZSA+PSBtYXhHYWluTGltaXRfZSkgeyAvKiB1cHBlciBsaW1pdCAoZS5nLiA5NiBkQikgKi8KQEAgLTc2MCwyMCArMTMxMiwyMSBAQAogICAgICAgICBtYXhHYWluX2UgPSBtYXhHYWluTGltaXRfZTsKICAgICAgIH0KIAotCiAgICAgICAvKiBFdmVyeSBzdWJiYW5kIGdhaW4gaXMgY29tcGFyZWQgdG8gdGhlIHNjYWxlZCAiYXZlcmFnZSBnYWluIgogICAgICAgICAgYW5kIGxpbWl0ZWQgaWYgbmVjZXNzYXJ5OiAqLwotICAgICAgZm9yIChrID0gaEZyZXEtPmxpbWl0ZXJCYW5kVGFibGVbY107IGsgPCBoRnJlcS0+bGltaXRlckJhbmRUYWJsZVtjKzFdOyBrKyspIHsKLSAgICAgICAgaWYgKCAocE5yZ3MtPm5yZ0dhaW5fZVtrXSA+IG1heEdhaW5fZSkgfHwgKHBOcmdzLT5ucmdHYWluX2Vba10gPT0gbWF4R2Fpbl9lICYmIHBOcmdzLT5ucmdHYWluW2tdPm1heEdhaW4pICkgewotCisgICAgICBmb3IgKGsgPSBoRnJlcS0+bGltaXRlckJhbmRUYWJsZVtjXTsgayA8IGhGcmVxLT5saW1pdGVyQmFuZFRhYmxlW2MgKyAxXTsKKyAgICAgICAgICAgaysrKSB7CisgICAgICAgIGlmICgocE5yZ3MtPm5yZ0dhaW5fZVtrXSA+IG1heEdhaW5fZSkgfHwKKyAgICAgICAgICAgIChwTnJncy0+bnJnR2Fpbl9lW2tdID09IG1heEdhaW5fZSAmJiBwTnJncy0+bnJnR2FpbltrXSA+IG1heEdhaW4pKSB7CiAgICAgICAgICAgRklYUF9EQkwgbm9pc2VBbXA7Ci0gICAgICAgICAgU0NIQVIgICAgbm9pc2VBbXBfZTsKKyAgICAgICAgICBTQ0hBUiBub2lzZUFtcF9lOwogCi0gICAgICAgICAgRkRLX2RpdmlkZV9NYW50RXhwKG1heEdhaW4sIG1heEdhaW5fZSwgcE5yZ3MtPm5yZ0dhaW5ba10sIHBOcmdzLT5ucmdHYWluX2Vba10sICZub2lzZUFtcCwgJm5vaXNlQW1wX2UpOwotICAgICAgICAgIHBOcmdzLT5ub2lzZUxldmVsW2tdICAgID0gZk11bHQocE5yZ3MtPm5vaXNlTGV2ZWxba10sbm9pc2VBbXApOworICAgICAgICAgIEZES19kaXZpZGVfTWFudEV4cChtYXhHYWluLCBtYXhHYWluX2UsIHBOcmdzLT5ucmdHYWluW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnJncy0+bnJnR2Fpbl9lW2tdLCAmbm9pc2VBbXAsICZub2lzZUFtcF9lKTsKKyAgICAgICAgICBwTnJncy0+bm9pc2VMZXZlbFtrXSA9IGZNdWx0KHBOcmdzLT5ub2lzZUxldmVsW2tdLCBub2lzZUFtcCk7CiAgICAgICAgICAgcE5yZ3MtPm5vaXNlTGV2ZWxfZVtrXSArPSBub2lzZUFtcF9lOwotICAgICAgICAgIHBOcmdzLT5ucmdHYWluW2tdICAgICAgID0gbWF4R2FpbjsKLSAgICAgICAgICBwTnJncy0+bnJnR2Fpbl9lW2tdICAgICA9IG1heEdhaW5fZTsKKyAgICAgICAgICBwTnJncy0+bnJnR2FpbltrXSA9IG1heEdhaW47CisgICAgICAgICAgcE5yZ3MtPm5yZ0dhaW5fZVtrXSA9IG1heEdhaW5fZTsKICAgICAgICAgfQogICAgICAgfQogCkBAIC03ODMsMjEgKzEzMzYsMjIgQEAKICAgICAgICAgMi4gQ2FsY3VsYXRlIGJvb3N0IGZhY3RvciBieSBjb21wYXJpc29uIHdpdGggcmVmZXJlbmNlIGVuZXJneQogICAgICAgICAzLiBBcHBseSBib29zdCBmYWN0b3IgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIGVuZXJneSBsb3NzIGR1ZSB0byBsaW1pdGluZwogICAgICAgKi8KLSAgICAgIGZvciAoayA9IGhGcmVxLT5saW1pdGVyQmFuZFRhYmxlW2NdOyBrIDwgaEZyZXEtPmxpbWl0ZXJCYW5kVGFibGVbYyArIDFdOyBrKyspIHsKLQorICAgICAgZm9yIChrID0gaEZyZXEtPmxpbWl0ZXJCYW5kVGFibGVbY107IGsgPCBoRnJlcS0+bGltaXRlckJhbmRUYWJsZVtjICsgMV07CisgICAgICAgICAgIGsrKykgewogICAgICAgICAvKiAxLmEgIEFkZCBlbmVyZ3kgb2YgYWRqdXN0ZWQgc2lnbmFsICh1c2luZyBwcmVsaW1pbmFyeSBnYWluKSAqLwotICAgICAgICBGSVhQX0RCTCAgdG1wICAgPSBmTXVsdChwTnJncy0+bnJnR2FpbltrXSxwTnJncy0+bnJnRXN0W2tdKTsKLSAgICAgICAgU0NIQVIgICAgIHRtcF9lID0gcE5yZ3MtPm5yZ0dhaW5fZVtrXSArIHBOcmdzLT5ucmdFc3RfZVtrXTsKKyAgICAgICAgRklYUF9EQkwgdG1wID0gZk11bHQocE5yZ3MtPm5yZ0dhaW5ba10sIHBOcmdzLT5ucmdFc3Rba10pOworICAgICAgICBTQ0hBUiB0bXBfZSA9IHBOcmdzLT5ucmdHYWluX2Vba10gKyBwTnJncy0+bnJnRXN0X2Vba107CiAgICAgICAgIEZES19hZGRfTWFudEV4cCh0bXAsIHRtcF9lLCBhY2N1LCBhY2N1X2UsICZhY2N1LCAmYWNjdV9lKTsKIAogICAgICAgICAvKiAxLmIgIEFkZCBzaW5lIGVuZXJneSAoaWYgcHJlc2VudCkgKi8KLSAgICAgICAgaWYocE5yZ3MtPm5yZ1NpbmVba10gIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKLSAgICAgICAgICBGREtfYWRkX01hbnRFeHAocE5yZ3MtPm5yZ1NpbmVba10sIHBOcmdzLT5ucmdTaW5lX2Vba10sIGFjY3UsIGFjY3VfZSwgJmFjY3UsICZhY2N1X2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgeworICAgICAgICBpZiAocE5yZ3MtPm5yZ1NpbmVba10gIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgICAgICBGREtfYWRkX01hbnRFeHAocE5yZ3MtPm5yZ1NpbmVba10sIHBOcmdzLT5ucmdTaW5lX2Vba10sIGFjY3UsIGFjY3VfZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjY3UsICZhY2N1X2UpOworICAgICAgICB9IGVsc2UgewogICAgICAgICAgIC8qIDEuYyAgQWRkIG5vaXNlIGVuZXJneSAoaWYgcHJlc2VudCkgKi8KLSAgICAgICAgICBpZihub05vaXNlRmxhZyA9PSAwKSB7Ci0gICAgICAgICAgICBGREtfYWRkX01hbnRFeHAocE5yZ3MtPm5vaXNlTGV2ZWxba10sIHBOcmdzLT5ub2lzZUxldmVsX2Vba10sIGFjY3UsIGFjY3VfZSwgJmFjY3UsICZhY2N1X2UpOworICAgICAgICAgIGlmIChub05vaXNlRmxhZyA9PSAwKSB7CisgICAgICAgICAgICBGREtfYWRkX01hbnRFeHAocE5yZ3MtPm5vaXNlTGV2ZWxba10sIHBOcmdzLT5ub2lzZUxldmVsX2Vba10sIGFjY3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdV9lLCAmYWNjdSwgJmFjY3VfZSk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CkBAIC04MTIsMzMgKzEzNjYsMzAgQEAKICAgICAgICAgYm9vc3RHYWluX2UgPSBzdW1SZWZfZSAtIGFjY3VfZSArIGRpdl9lOwogICAgICAgfQogCi0KICAgICAgIC8qIDIuYiBSZXN1bHQgdG9vIGhpZ2g/IC0tPiBMaW1pdCB0aGUgYm9vc3QgZmFjdG9yIHRvICs0IGRCICovCi0gICAgICBpZigoYm9vc3RHYWluX2UgID4gMykgfHwKLSAgICAgICAgIChib29zdEdhaW5fZSA9PSAyICYmIGJvb3N0R2FpbiA+IEZMMkZYQ09OU1RfREJMKDAuNjI3OTcxNmYpKSB8fAotICAgICAgICAgKGJvb3N0R2Fpbl9lID09IDMgJiYgYm9vc3RHYWluID4gRkwyRlhDT05TVF9EQkwoMC4zMTM5ODU4ZikpICkKLSAgICAgIHsKKyAgICAgIGlmICgoYm9vc3RHYWluX2UgPiAzKSB8fAorICAgICAgICAgIChib29zdEdhaW5fZSA9PSAyICYmIGJvb3N0R2FpbiA+IEZMMkZYQ09OU1RfREJMKDAuNjI3OTcxNmYpKSB8fAorICAgICAgICAgIChib29zdEdhaW5fZSA9PSAzICYmIGJvb3N0R2FpbiA+IEZMMkZYQ09OU1RfREJMKDAuMzEzOTg1OGYpKSkgewogICAgICAgICBib29zdEdhaW4gPSBGTDJGWENPTlNUX0RCTCgwLjYyNzk3MTZmKTsKICAgICAgICAgYm9vc3RHYWluX2UgPSAyOwogICAgICAgfQogICAgICAgLyogMy4gIE11bHRpcGx5IGFsbCBzaWduYWwgY29tcG9uZW50cyB3aXRoIHRoZSBib29zdCBmYWN0b3IgKi8KLSAgICAgIGZvciAoayA9IGhGcmVxLT5saW1pdGVyQmFuZFRhYmxlW2NdOyBrIDwgaEZyZXEtPmxpbWl0ZXJCYW5kVGFibGVbYyArIDFdOyBrKyspIHsKLSAgICAgICAgcE5yZ3MtPm5yZ0dhaW5ba10gICA9IGZNdWx0RGl2MihwTnJncy0+bnJnR2FpbltrXSxib29zdEdhaW4pOworICAgICAgZm9yIChrID0gaEZyZXEtPmxpbWl0ZXJCYW5kVGFibGVbY107IGsgPCBoRnJlcS0+bGltaXRlckJhbmRUYWJsZVtjICsgMV07CisgICAgICAgICAgIGsrKykgeworICAgICAgICBwTnJncy0+bnJnR2FpbltrXSA9IGZNdWx0RGl2MihwTnJncy0+bnJnR2FpbltrXSwgYm9vc3RHYWluKTsKICAgICAgICAgcE5yZ3MtPm5yZ0dhaW5fZVtrXSA9IHBOcmdzLT5ucmdHYWluX2Vba10gKyBib29zdEdhaW5fZSArIDE7CiAKLSAgICAgICAgcE5yZ3MtPm5yZ1NpbmVba10gICA9IGZNdWx0RGl2MihwTnJncy0+bnJnU2luZVtrXSxib29zdEdhaW4pOworICAgICAgICBwTnJncy0+bnJnU2luZVtrXSA9IGZNdWx0RGl2MihwTnJncy0+bnJnU2luZVtrXSwgYm9vc3RHYWluKTsKICAgICAgICAgcE5yZ3MtPm5yZ1NpbmVfZVtrXSA9IHBOcmdzLT5ucmdTaW5lX2Vba10gKyBib29zdEdhaW5fZSArIDE7CiAKLSAgICAgICAgcE5yZ3MtPm5vaXNlTGV2ZWxba10gICA9IGZNdWx0RGl2MihwTnJncy0+bm9pc2VMZXZlbFtrXSxib29zdEdhaW4pOworICAgICAgICBwTnJncy0+bm9pc2VMZXZlbFtrXSA9IGZNdWx0RGl2MihwTnJncy0+bm9pc2VMZXZlbFtrXSwgYm9vc3RHYWluKTsKICAgICAgICAgcE5yZ3MtPm5vaXNlTGV2ZWxfZVtrXSA9IHBOcmdzLT5ub2lzZUxldmVsX2Vba10gKyBib29zdEdhaW5fZSArIDE7CiAgICAgICB9CiAgICAgfQogICAgIC8qIEVuZCBvZiBub2lzZSBsaW1pdGluZyAqLwogCiAgICAgaWYgKHVzZUxQKQotICAgICAgYWxpYXNpbmdSZWR1Y3Rpb24oZGVncmVlQWxpYXMrbG93U3ViYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgdXNlQWxpYXNSZWR1Y3Rpb24sCisgICAgICBhbGlhc2luZ1JlZHVjdGlvbihkZWdyZWVBbGlhcyArIGxvd1N1YmJhbmQsIHBOcmdzLCB1c2VBbGlhc1JlZHVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgIG5vU3ViYmFuZHMpOwogCiAgICAgLyogRm9yIHRoZSB0aW1lc2xvdHMgd2l0aGluIHRoZSByYW5nZSBmb3IgdGhlIG91dHB1dCBmcmFtZSwKQEAgLTg1MiwxNCArMTQwMywxNCBAQAogICAgIC8qCiAgICAgICBDb252ZXJ0IGVuZXJnaWVzIHRvIGFtcGxpdHVkZSBsZXZlbHMKICAgICAqLwotICAgIGZvciAoaz0wOyBrPG5vU3ViYmFuZHM7IGsrKykgewotICAgICAgRkRLX3NxcnRfTWFudEV4cCgmcE5yZ3MtPm5yZ1NpbmVba10sICAgICZwTnJncy0+bnJnU2luZV9lW2tdLCAgICAmbm9pc2VfZSk7Ci0gICAgICBGREtfc3FydF9NYW50RXhwKCZwTnJncy0+bnJnR2FpbltrXSwgICAgJnBOcmdzLT5ucmdHYWluX2Vba10sICAgICZwTnJncy0+bnJnR2Fpbl9lW2tdKTsKLSAgICAgIEZES19zcXJ0X01hbnRFeHAoJnBOcmdzLT5ub2lzZUxldmVsW2tdLCAmcE5yZ3MtPm5vaXNlTGV2ZWxfZVtrXSwgJm5vaXNlX2UpOworICAgIGZvciAoayA9IDA7IGsgPCBub1N1YmJhbmRzOyBrKyspIHsKKyAgICAgIEZES19zcXJ0X01hbnRFeHAoJnBOcmdzLT5ucmdTaW5lW2tdLCAmcE5yZ3MtPm5yZ1NpbmVfZVtrXSwgJm5vaXNlX2UpOworICAgICAgRkRLX3NxcnRfTWFudEV4cCgmcE5yZ3MtPm5yZ0dhaW5ba10sICZwTnJncy0+bnJnR2Fpbl9lW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAmcE5yZ3MtPm5yZ0dhaW5fZVtrXSk7CisgICAgICBGREtfc3FydF9NYW50RXhwKCZwTnJncy0+bm9pc2VMZXZlbFtrXSwgJnBOcmdzLT5ub2lzZUxldmVsX2Vba10sCisgICAgICAgICAgICAgICAgICAgICAgICZub2lzZV9lKTsKICAgICB9CiAKLQotCiAgICAgLyoKICAgICAgIEFwcGx5IGNhbGN1bGF0ZWQgZ2FpbnMgYW5kIGFkYXB0aXZlIG5vaXNlCiAgICAgKi8KQEAgLTg2OCw0MCArMTQxOSw0MiBAQAogICAgIHsKICAgICAgIGludCBzY2FsZV9jaGFuZ2UsIHNjX2NoYW5nZTsKICAgICAgIEZJWFBfU0dMIHNtb290aF9yYXRpbzsKLSAgICAgIGludCBmaWx0QnVmZmVyTm9pc2VTaGlmdD0wOworICAgICAgaW50IGZpbHRCdWZmZXJOb2lzZVNoaWZ0ID0gMDsKIAogICAgICAgLyogSW5pdGlhbGl6ZSBzbW9vdGhpbmcgYnVmZmVycyB3aXRoIHRoZSBmaXJzdCB2YWxpZCB2YWx1ZXMgKi8KLSAgICAgIGlmIChoX3Nicl9jYWxfZW52LT5zdGFydFVwKQotICAgICAgeworICAgICAgaWYgKGhfc2JyX2NhbF9lbnYtPnN0YXJ0VXApIHsKICAgICAgICAgaWYgKCF1c2VMUCkgewogICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZV9lID0gbm9pc2VfZTsKIAotICAgICAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyX2UsICAgIHBOcmdzLT5ucmdHYWluX2UsICBub1N1YmJhbmRzKnNpemVvZihTQ0hBUikpOwotICAgICAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2UsIHBOcmdzLT5ub2lzZUxldmVsLCBub1N1YmJhbmRzKnNpemVvZihGSVhQX0RCTCkpOwotICAgICAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyLCAgICAgIHBOcmdzLT5ucmdHYWluLCAgICBub1N1YmJhbmRzKnNpemVvZihGSVhQX0RCTCkpOwotCisgICAgICAgICAgRkRLbWVtY3B5KGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJfZSwgcE5yZ3MtPm5yZ0dhaW5fZSwKKyAgICAgICAgICAgICAgICAgICAgbm9TdWJiYW5kcyAqIHNpemVvZihTQ0hBUikpOworICAgICAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2UsIHBOcmdzLT5ub2lzZUxldmVsLAorICAgICAgICAgICAgICAgICAgICBub1N1YmJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgRkRLbWVtY3B5KGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXIsIHBOcmdzLT5ucmdHYWluLAorICAgICAgICAgICAgICAgICAgICBub1N1YmJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CiAgICAgICAgIH0KICAgICAgICAgaF9zYnJfY2FsX2Vudi0+c3RhcnRVcCA9IDA7CiAgICAgICB9CiAKICAgICAgIGlmICghdXNlTFApIHsKLQotICAgICAgICBlcXVhbGl6ZUZpbHRCdWZmZXJFeHAoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlciwgICAgLyogYnVmZmVyZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJfZSwgIC8qIGJ1ZmZlcmVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnJncy0+bnJnR2FpbiwgICAgICAgICAgICAgICAvKiBjdXJyZW50ICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5yZ3MtPm5yZ0dhaW5fZSwgICAgICAgICAgICAgLyogY3VycmVudCAgKi8KKyAgICAgICAgZXF1YWxpemVGaWx0QnVmZmVyRXhwKGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXIsICAgLyogYnVmZmVyZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJfZSwgLyogYnVmZmVyZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdzLT5ucmdHYWluLCAgICAgICAgICAgICAgLyogY3VycmVudCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdzLT5ucmdHYWluX2UsICAgICAgICAgICAgLyogY3VycmVudCAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vU3ViYmFuZHMpOwogCiAgICAgICAgIC8qIEFkYXB0IGV4cG9uZW50IG9mIGJ1ZmZlcmVkIG5vaXNlIGxldmVscyB0byB0aGUgY3VycmVudCBleHBvbmVudAogICAgICAgICAgICBzbyB0aGV5IGNhbiBlYXNpbHkgYmUgc21vb3RoZWQgKi8KLSAgICAgICAgaWYoKGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZV9lIC0gbm9pc2VfZSk+PTApIHsKLSAgICAgICAgICBpbnQgc2hpZnQgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSwoaW50KShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2VfZSAtIG5vaXNlX2UpKTsKLSAgICAgICAgICBmb3IgKGs9MDsgazxub1N1YmJhbmRzOyBrKyspCisgICAgICAgIGlmICgoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlX2UgLSBub2lzZV9lKSA+PSAwKSB7CisgICAgICAgICAgaW50IHNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlX2UgLSBub2lzZV9lKSk7CisgICAgICAgICAgZm9yIChrID0gMDsgayA8IG5vU3ViYmFuZHM7IGsrKykKICAgICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZVtrXSA8PD0gc2hpZnQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgaW50IHNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsLShpbnQpKGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZV9lIC0gbm9pc2VfZSkpOwotICAgICAgICAgIGZvciAoaz0wOyBrPG5vU3ViYmFuZHM7IGsrKykKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbnQgc2hpZnQgPQorICAgICAgICAgICAgICBmaXhNaW4oREZSQUNUX0JJVFMgLSAxLAorICAgICAgICAgICAgICAgICAgICAgLShpbnQpKGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZV9lIC0gbm9pc2VfZSkpOworICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBub1N1YmJhbmRzOyBrKyspCiAgICAgICAgICAgICBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2Vba10gPj49IHNoaWZ0OwogICAgICAgICB9CiAKQEAgLTkwOSw2MCArMTQ2Miw2MSBAQAogICAgICAgfQogCiAgICAgICAvKiBmaW5kIGJlc3Qgc2NhbGluZyEgKi8KLSAgICAgIHNjYWxlX2NoYW5nZSA9IC0oREZSQUNUX0JJVFMtMSk7Ci0gICAgICBmb3Ioaz0wO2s8bm9TdWJiYW5kcztrKyspIHsKLSAgICAgICAgICBzY2FsZV9jaGFuZ2UgPSBmaXhNYXgoc2NhbGVfY2hhbmdlLChpbnQpcE5yZ3MtPm5yZ0dhaW5fZVtrXSk7CisgICAgICBzY2FsZV9jaGFuZ2UgPSAtKERGUkFDVF9CSVRTIC0gMSk7CisgICAgICBmb3IgKGsgPSAwOyBrIDwgbm9TdWJiYW5kczsgaysrKSB7CisgICAgICAgIHNjYWxlX2NoYW5nZSA9IGZpeE1heChzY2FsZV9jaGFuZ2UsIChpbnQpcE5yZ3MtPm5yZ0dhaW5fZVtrXSk7CiAgICAgICB9Ci0gICAgICBzY19jaGFuZ2UgPSAoc3RhcnRfcG9zPG5vX2NvbHMpPyBhZGpfZSAtIGlucHV0X2UgOiBmaW5hbF9lIC0gaW5wdXRfZTsKKyAgICAgIHNjX2NoYW5nZSA9IChzdGFydF9wb3MgPCBub19jb2xzKSA/IGFkal9lIC0gaW5wdXRfZSA6IGZpbmFsX2UgLSBpbnB1dF9lOwogCi0gICAgICBpZiAoKHNjYWxlX2NoYW5nZS1zY19jaGFuZ2UrMSk8MCkKLSAgICAgICAgICBzY2FsZV9jaGFuZ2UtPShzY2FsZV9jaGFuZ2Utc2NfY2hhbmdlKzEpOworICAgICAgaWYgKChzY2FsZV9jaGFuZ2UgLSBzY19jaGFuZ2UgKyAxKSA8IDApCisgICAgICAgIHNjYWxlX2NoYW5nZSAtPSAoc2NhbGVfY2hhbmdlIC0gc2NfY2hhbmdlICsgMSk7CiAKLSAgICAgIHNjYWxlX2NoYW5nZSA9IChzY2FsZV9jaGFuZ2Utc2NfY2hhbmdlKSsxOworICAgICAgc2NhbGVfY2hhbmdlID0gKHNjYWxlX2NoYW5nZSAtIHNjX2NoYW5nZSkgKyAxOwogCi0gICAgICBmb3Ioaz0wO2s8bm9TdWJiYW5kcztrKyspIHsKLSAgICAgICAgICBpbnQgc2MgPSBzY2FsZV9jaGFuZ2UtcE5yZ3MtPm5yZ0dhaW5fZVtrXSArIChzY19jaGFuZ2UtMSk7Ci0gICAgICAgICAgcE5yZ3MtPm5yZ0dhaW5ba10gID4+PSBzYzsKLSAgICAgICAgICBwTnJncy0+bnJnR2Fpbl9lW2tdICs9IHNjOworICAgICAgZm9yIChrID0gMDsgayA8IG5vU3ViYmFuZHM7IGsrKykgeworICAgICAgICBpbnQgc2MgPSBzY2FsZV9jaGFuZ2UgLSBwTnJncy0+bnJnR2Fpbl9lW2tdICsgKHNjX2NoYW5nZSAtIDEpOworICAgICAgICBwTnJncy0+bnJnR2FpbltrXSA+Pj0gc2M7CisgICAgICAgIHBOcmdzLT5ucmdHYWluX2Vba10gKz0gc2M7CiAgICAgICB9CiAKICAgICAgIGlmICghdXNlTFApIHsKLSAgICAgICAgZm9yKGs9MDtrPG5vU3ViYmFuZHM7aysrKSB7Ci0gICAgICAgICAgaW50IHNjID0gc2NhbGVfY2hhbmdlLWhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJfZVtrXSArIChzY19jaGFuZ2UtMSk7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBub1N1YmJhbmRzOyBrKyspIHsKKyAgICAgICAgICBpbnQgc2MgPQorICAgICAgICAgICAgICBzY2FsZV9jaGFuZ2UgLSBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyX2Vba10gKyAoc2NfY2hhbmdlIC0gMSk7CiAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlcltrXSA+Pj0gc2M7CiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgZm9yIChqID0gc3RhcnRfcG9zOyBqIDwgc3RvcF9wb3M7IGorKykKLSAgICAgIHsKLSAgICAgICAgLyogVGhpcyB0aW1lc2xvdCBpcyBsb2NhdGVkIHdpdGhpbiB0aGUgZmlyc3QgcGFydCBvZiB0aGUgcHJvY2Vzc2luZyBidWZmZXIKLSAgICAgICAgICAgYW5kIHdpbGwgYmUgZmVkIGludG8gdGhlIFFNRi1zeW50aGVzaXMgZm9yIHRoZSBjdXJyZW50IGZyYW1lLgorICAgICAgZm9yIChqID0gc3RhcnRfcG9zOyBqIDwgc3RvcF9wb3M7IGorKykgeworICAgICAgICAvKiBUaGlzIHRpbWVzbG90IGlzIGxvY2F0ZWQgd2l0aGluIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBwcm9jZXNzaW5nCisgICAgICAgICAgIGJ1ZmZlciBhbmQgd2lsbCBiZSBmZWQgaW50byB0aGUgUU1GLXN5bnRoZXNpcyBmb3IgdGhlIGN1cnJlbnQgZnJhbWUuCiAgICAgICAgICAgICAgICBhZGpfZSAtIGlucHV0X2UKICAgICAgICAgICAgVGhpcyB0aW1lc2xvdCB3aWxsIG5vdCB5ZXQgYmUgZmVkIGludG8gdGhlIFFNRiBzbyB3ZSBkbyBub3QgY2FyZQogICAgICAgICAgICBhYm91dCB0aGUgYWRqX2UuCiAgICAgICAgICAgICAgICBzY19jaGFuZ2UgPSBmaW5hbF9lIC0gaW5wdXRfZQogICAgICAgICAqLwotICAgICAgICBpZiAoIChqPT1ub19jb2xzKSAmJiAoc3RhcnRfcG9zPG5vX2NvbHMpICkKLSAgICAgICAgewotICAgICAgICAgIGludCBzaGlmdCA9IChpbnQpIChub2lzZV9lIC0gZmluYWxfZSk7CisgICAgICAgIGlmICgoaiA9PSBub19jb2xzKSAmJiAoc3RhcnRfcG9zIDwgbm9fY29scykpIHsKKyAgICAgICAgICBpbnQgc2hpZnQgPSAoaW50KShub2lzZV9lIC0gZmluYWxfZSk7CiAgICAgICAgICAgaWYgKCF1c2VMUCkKLSAgICAgICAgICAgIGZpbHRCdWZmZXJOb2lzZVNoaWZ0ID0gc2hpZnQ7ICAgICAgICAgICAgICAgLyogc2hpZnRpbmcgb2YgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlW2tdIHdpbGwgYmUgYXBwbGllZCBpbiBmdW5jdGlvbiBhZGp1c3RUaW1lU2xvdEhRKCkgKi8KLSAgICAgICAgICBpZiAoc2hpZnQ+PTApIHsKLSAgICAgICAgICAgIHNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsc2hpZnQpOwotICAgICAgICAgICAgZm9yIChrPTA7IGs8bm9TdWJiYW5kczsgaysrKSB7CisgICAgICAgICAgICBmaWx0QnVmZmVyTm9pc2VTaGlmdCA9IHNoaWZ0OyAvKiBzaGlmdGluZyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlW2tdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGFwcGxpZWQgaW4gZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdFRpbWVTbG90SFEoKSAqLworICAgICAgICAgIGlmIChzaGlmdCA+PSAwKSB7CisgICAgICAgICAgICBzaGlmdCA9IGZpeE1pbihERlJBQ1RfQklUUyAtIDEsIHNoaWZ0KTsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBub1N1YmJhbmRzOyBrKyspIHsKICAgICAgICAgICAgICAgcE5yZ3MtPm5yZ1NpbmVba10gPDw9IHNoaWZ0OwotICAgICAgICAgICAgICBwTnJncy0+bm9pc2VMZXZlbFtrXSAgPDw9IHNoaWZ0OworICAgICAgICAgICAgICBwTnJncy0+bm9pc2VMZXZlbFtrXSA8PD0gc2hpZnQ7CiAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgIGlmICghdXNlTFApCiAgICAgICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlW2tdICA8PD0gc2hpZnQ7CiAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgc2hpZnQgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSwtc2hpZnQpOwotICAgICAgICAgICAgZm9yIChrPTA7IGs8bm9TdWJiYW5kczsgaysrKSB7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTIC0gMSwgLXNoaWZ0KTsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBub1N1YmJhbmRzOyBrKyspIHsKICAgICAgICAgICAgICAgcE5yZ3MtPm5yZ1NpbmVba10gPj49IHNoaWZ0OwotICAgICAgICAgICAgICBwTnJncy0+bm9pc2VMZXZlbFtrXSAgPj49IHNoaWZ0OworICAgICAgICAgICAgICBwTnJncy0+bm9pc2VMZXZlbFtrXSA+Pj0gc2hpZnQ7CiAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgIGlmICghdXNlTFApCiAgICAgICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlW2tdICA+Pj0gc2hpZnQ7CkBAIC05NzMsMTgyICsxNTI3LDI0OCBAQAogICAgICAgICAgIC8qIHVwZGF0ZSBub2lzZSBzY2FsaW5nICovCiAgICAgICAgICAgbm9pc2VfZSA9IGZpbmFsX2U7CiAgICAgICAgICAgaWYgKCF1c2VMUCkKLSAgICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZV9lID0gbm9pc2VfZTsgIC8qIHNjYWxpbmcgdmFsdWUgdW51c2VkISAqLworICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlX2UgPQorICAgICAgICAgICAgICAgIG5vaXNlX2U7IC8qIHNjYWxpbmcgdmFsdWUgdW51c2VkISAqLwogCiAgICAgICAgICAgLyogdXBkYXRlIGdhaW4gYnVmZmVyKi8KICAgICAgICAgICBzY19jaGFuZ2UgLT0gKGZpbmFsX2UgLSBpbnB1dF9lKTsKIAotICAgICAgICAgIGlmIChzY19jaGFuZ2U8MCkgewotICAgICAgICAgICAgZm9yKGs9MDtrPG5vU3ViYmFuZHM7aysrKSB7Ci0gICAgICAgICAgICAgICAgcE5yZ3MtPm5yZ0dhaW5ba10gID4+PSAtc2NfY2hhbmdlOwotICAgICAgICAgICAgICAgIHBOcmdzLT5ucmdHYWluX2Vba10gKz0gLXNjX2NoYW5nZTsKKyAgICAgICAgICBpZiAoc2NfY2hhbmdlIDwgMCkgeworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG5vU3ViYmFuZHM7IGsrKykgeworICAgICAgICAgICAgICBwTnJncy0+bnJnR2FpbltrXSA+Pj0gLXNjX2NoYW5nZTsKKyAgICAgICAgICAgICAgcE5yZ3MtPm5yZ0dhaW5fZVtrXSArPSAtc2NfY2hhbmdlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCF1c2VMUCkgewotICAgICAgICAgICAgICBmb3Ioaz0wO2s8bm9TdWJiYW5kcztrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlcltrXSA+Pj0gLXNjX2NoYW5nZTsKKyAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG5vU3ViYmFuZHM7IGsrKykgeworICAgICAgICAgICAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJba10gPj49IC1zY19jaGFuZ2U7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2NhbGVfY2hhbmdlKz1zY19jaGFuZ2U7CisgICAgICAgICAgICBzY2FsZV9jaGFuZ2UgKz0gc2NfY2hhbmdlOwogICAgICAgICAgIH0KIAotICAgICAgICB9IC8vIGlmCisgICAgICAgIH0gLyogaWYgKi8KIAogICAgICAgICBpZiAoIXVzZUxQKSB7Ci0KICAgICAgICAgICAvKiBQcmV2ZW50IHRoZSBzbW9vdGhpbmcgZmlsdGVyIGZyb20gcnVubmluZyBvbiBjb25zdGFudCBsZXZlbHMgKi8KLSAgICAgICAgICBpZiAoai1zdGFydF9wb3MgPCBzbW9vdGhfbGVuZ3RoKQotICAgICAgICAgICAgc21vb3RoX3JhdGlvID0gRkRLX3NickRlY29kZXJfc2JyX3Ntb290aEZpbHRlcltqLXN0YXJ0X3Bvc107CisgICAgICAgICAgaWYgKGogLSBzdGFydF9wb3MgPCBzbW9vdGhfbGVuZ3RoKQorICAgICAgICAgICAgc21vb3RoX3JhdGlvID0gRkRLX3NickRlY29kZXJfc2JyX3Ntb290aEZpbHRlcltqIC0gc3RhcnRfcG9zXTsKICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICBzbW9vdGhfcmF0aW8gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKIAotICAgICAgICAgIGFkanVzdFRpbWVTbG90SFEoJmFuYWx5c0J1ZmZlclJlYWxbal1bbG93U3ViYmFuZF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmYW5hbHlzQnVmZmVySW1hZ1tqXVtsb3dTdWJiYW5kXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyX2NhbF9lbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwTnJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd1N1YmJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBub1N1YmJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc21vb3RoX3JhdGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Ob2lzZUZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0QnVmZmVyTm9pc2VTaGlmdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgICAgaWYgKGlURVNfZW5hYmxlKSB7CisgICAgICAgICAgICAvKiBhZGp1c3RUaW1lU2xvdEhRKCkgd2l0aG91dCBhZGRpbmcgb2YgYWRkaXRpb25hbCBoYXJtb25pY3MgKi8KKyAgICAgICAgICAgIGFkanVzdFRpbWVTbG90SFFfR2FpbkFuZE5vaXNlKAorICAgICAgICAgICAgICAgICZhbmFseXNCdWZmZXJSZWFsW2pdW2xvd1N1YmJhbmRdLAorICAgICAgICAgICAgICAgICZhbmFseXNCdWZmZXJJbWFnW2pdW2xvd1N1YmJhbmRdLCBoX3Nicl9jYWxfZW52LCBwTnJncywKKyAgICAgICAgICAgICAgICBsb3dTdWJiYW5kLCBub1N1YmJhbmRzLCBzY2FsZV9jaGFuZ2UsIHNtb290aF9yYXRpbywgbm9Ob2lzZUZsYWcsCisgICAgICAgICAgICAgICAgZmlsdEJ1ZmZlck5vaXNlU2hpZnQpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGp1c3RUaW1lU2xvdEhRKCZhbmFseXNCdWZmZXJSZWFsW2pdW2xvd1N1YmJhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYW5hbHlzQnVmZmVySW1hZ1tqXVtsb3dTdWJiYW5kXSwgaF9zYnJfY2FsX2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5yZ3MsIGxvd1N1YmJhbmQsIG5vU3ViYmFuZHMsIHNjYWxlX2NoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21vb3RoX3JhdGlvLCBub05vaXNlRmxhZywgZmlsdEJ1ZmZlck5vaXNlU2hpZnQpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBGREtfQVNTRVJUKCFpVEVTX2VuYWJsZSk7IC8qIG5vdCBzdXBwb3J0ZWQgKi8KICAgICAgICAgICBpZiAoZmxhZ3MgJiBTQlJERUNfRUxEX0dSSUQpIHsKLSAgICAgICAgICAgIGFkanVzdFRpbWVTbG90X0VsZEdyaWQoJmFuYWx5c0J1ZmZlclJlYWxbal1bbG93U3ViYmFuZF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwTnJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfc2JyX2NhbF9lbnYtPmhhcm1JbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd1N1YmJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBub1N1YmJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Ob2lzZUZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZoX3Nicl9jYWxfZW52LT5waGFzZUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQMlNDQUxFKGFkal9lKSAtIHNiclNjYWxlRmFjdG9yLT5sYl9zY2FsZSk7Ci0gICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgYWRqdXN0VGltZVNsb3RMQygmYW5hbHlzQnVmZmVyUmVhbFtqXVtsb3dTdWJiYW5kXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9zYnJfY2FsX2Vudi0+aGFybUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93U3ViYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vU3ViYmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9jaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBub05vaXNlRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfc2JyX2NhbF9lbnYtPnBoYXNlSW5kZXgpOworICAgICAgICAgICAgLyogRkRLbWVtc2V0KGFuYWx5c0J1ZmZlclJlYWxbal0sIDAsIDY0ICogc2l6ZW9mKEZJWFBfREJMKSk7ICovCisgICAgICAgICAgICBhZGp1c3RUaW1lU2xvdF9FbGRHcmlkKCZhbmFseXNCdWZmZXJSZWFsW2pdW2xvd1N1YmJhbmRdLCBwTnJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfc2JyX2NhbF9lbnYtPmhhcm1JbmRleCwgbG93U3ViYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9TdWJiYW5kcywgc2NhbGVfY2hhbmdlLCBub05vaXNlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfc2JyX2NhbF9lbnYtPnBoYXNlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUDJTQ0FMRShhZGpfZSkgLSBzYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGp1c3RUaW1lU2xvdExDKCZhbmFseXNCdWZmZXJSZWFsW2pdW2xvd1N1YmJhbmRdLCBwTnJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfc2JyX2NhbF9lbnYtPmhhcm1JbmRleCwgbG93U3ViYmFuZCwgbm9TdWJiYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY2hhbmdlLCBub05vaXNlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfc2JyX2NhbF9lbnYtPnBoYXNlSW5kZXgpOwogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgfSAvLyBmb3IKKyAgICAgICAgLyogSW4gY2FzZSB0aGUgZW52ZWxvcGUgc3BhbnMgYWNjcm9zcyB0aGUgbm9fY29scyBib3JkZXIgYm90aCBleHBvbmVudHMKKyAgICAgICAgICogYXJlIG5lZWRlZC4gKi8KKyAgICAgICAgLyogbnJnR2Fpbl9lWzAuLi4obm9TdWJiYW5kcy0xKV0gYXJlIGVxdWFsaXplZCBieQorICAgICAgICAgKiBlcXVhbGl6ZUZpbHRCdWZmZXJFeHAoKSAqLworICAgICAgICBwTnJncy0+ZXhwb25lbnRbKGogPCBub19jb2xzKSA/IDAgOiAxXSA9CisgICAgICAgICAgICAoU0NIQVIpKCgxNSAtIHNiclNjYWxlRmFjdG9yLT5oYl9zY2FsZSkgKyBwTnJncy0+bnJnR2Fpbl9lWzBdICsgMSAtCisgICAgICAgICAgICAgICAgICAgIHNjYWxlX2NoYW5nZSk7CisgICAgICB9IC8qIGZvciAqLworCisgICAgICBpZiAoaVRFU19lbmFibGUpIHsKKyAgICAgICAgYXBwbHlfaW50ZXJfdGVzKAorICAgICAgICAgICAgYW5hbHlzQnVmZmVyUmVhbCwgLyogcEFCdWZSLCAqLworICAgICAgICAgICAgYW5hbHlzQnVmZmVySW1hZywgLyogcEFCdWZJLCAqLworICAgICAgICAgICAgc2JyU2NhbGVGYWN0b3IsIHBOcmdzLT5leHBvbmVudCwgaEhlYWRlckRhdGEtPnRpbWVTdGVwLCBzdGFydF9wb3MsCisgICAgICAgICAgICBzdG9wX3BvcywgbG93U3ViYmFuZCwgbm9TdWJiYW5kcywKKyAgICAgICAgICAgIGhGcmFtZURhdGEKKyAgICAgICAgICAgICAgICAtPmludGVyVGVtcFNoYXBlTW9kZVtpXSAvKiBmcmFtZURhdGEtPmludGVyVGVtcFNoYXBlTW9kZVtlbnZdICovCisgICAgICAgICk7CisKKyAgICAgICAgLyogYWRkIGFkZGl0aW9uYWwgaGFybW9uaWNzICovCisgICAgICAgIGZvciAoaiA9IHN0YXJ0X3BvczsgaiA8IHN0b3BfcG9zOyBqKyspIHsKKyAgICAgICAgICAvKiBtYXRjaCBleHBvbmVudCBvZiBhZGRpdGlvbmFsIGhhcm1vbmljcyB0byBzY2FsZSBjaGFuZ2Ugb2YgUU1GIGRhdGEKKyAgICAgICAgICAgKiBjYXVzZWQgYnkgYXBwbHlfaW50ZXJfdGVzKCkgKi8KKyAgICAgICAgICBzY2FsZV9jaGFuZ2UgPSAwOworCisgICAgICAgICAgaWYgKChzdGFydF9wb3MgPD0gbm9fY29scykgJiYgKHN0b3BfcG9zID4gbm9fY29scykpIHsKKyAgICAgICAgICAgIC8qIFNjYWxpbmcgb2YgYW5hbHlzQnVmZmVycyB3YXMgcG90ZW50aWFsbHkgY2hhbmdlZCB3aXRoaW4gdGhpcworICAgICAgICAgICAgICAgZW52ZWxvcGUuIFRoZSBwTnJncy0+bnJnU2luZV9lIG1hdGNoIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUKKyAgICAgICAgICAgICAgIGVudmVsb3BlLiBGb3IgKGo8PW5vX2NvbHMpIHRoZSBleHBvbmVudCBvZiB0aGUgc2luZSBlbmVyZ2llcyBoYXMKKyAgICAgICAgICAgICAgIHRvIGJlIGFkYXB0ZWQuICovCisgICAgICAgICAgICBzY2FsZV9jaGFuZ2UgPSBwTnJncy0+ZXhwb25lbnRbMV0gLSBwTnJncy0+ZXhwb25lbnRbMF07CisgICAgICAgICAgfQorCisgICAgICAgICAgYWRqdXN0VGltZVNsb3RIUV9BZGRIYXJtb25pY3MoCisgICAgICAgICAgICAgICZhbmFseXNCdWZmZXJSZWFsW2pdW2xvd1N1YmJhbmRdLAorICAgICAgICAgICAgICAmYW5hbHlzQnVmZmVySW1hZ1tqXVtsb3dTdWJiYW5kXSwgaF9zYnJfY2FsX2VudiwgcE5yZ3MsCisgICAgICAgICAgICAgIGxvd1N1YmJhbmQsIG5vU3ViYmFuZHMsCisgICAgICAgICAgICAgIC1pVEVTX3NjYWxlX2NoYW5nZSArICgoaiA8IG5vX2NvbHMpID8gc2NhbGVfY2hhbmdlIDogMCkpOworICAgICAgICB9CisgICAgICB9CiAKICAgICAgIGlmICghdXNlTFApIHsKICAgICAgICAgLyogVXBkYXRlIHRpbWUtc21vb3RoaW5nLWJ1ZmZlcnMgZm9yIGdhaW5zIGFuZCBub2lzZSBsZXZlbHMKLSAgICAgICAgICAgVGhlIGdhaW5zIGFuZCB0aGUgbm9pc2UgdmFsdWVzIG9mIHRoZSBjdXJyZW50IGVudmVsb3BlIGFyZSBjb3BpZWQgaW50byB0aGUgYnVmZmVyLgotICAgICAgICAgICBUaGlzIGhhcyB0byBiZSBkb25lIGF0IHRoZSBlbmQgb2YgZWFjaCBlbnZlbG9wZSBhcyB0aGUgdmFsdWVzIGFyZSByZXF1aXJlZCBmb3IKLSAgICAgICAgICAgYSBzbW9vdGggdHJhbnNpdGlvbiB0byB0aGUgbmV4dCBlbnZlbG9wZS4gKi8KLSAgICAgICAgRkRLbWVtY3B5KGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXIsICAgICAgcE5yZ3MtPm5yZ0dhaW4sICAgIG5vU3ViYmFuZHMqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyX2UsICAgIHBOcmdzLT5ucmdHYWluX2UsICBub1N1YmJhbmRzKnNpemVvZihTQ0hBUikpOwotICAgICAgICBGREttZW1jcHkoaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlLCBwTnJncy0+bm9pc2VMZXZlbCwgbm9TdWJiYW5kcypzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICAgVGhlIGdhaW5zIGFuZCB0aGUgbm9pc2UgdmFsdWVzIG9mIHRoZSBjdXJyZW50IGVudmVsb3BlIGFyZSBjb3BpZWQKKyAgICAgICAgICAgaW50byB0aGUgYnVmZmVyLiBUaGlzIGhhcyB0byBiZSBkb25lIGF0IHRoZSBlbmQgb2YgZWFjaCBlbnZlbG9wZSBhcworICAgICAgICAgICB0aGUgdmFsdWVzIGFyZSByZXF1aXJlZCBmb3IgYSBzbW9vdGggdHJhbnNpdGlvbiB0byB0aGUgbmV4dCBlbnZlbG9wZS4KKyAgICAgICAgICovCisgICAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyLCBwTnJncy0+bnJnR2FpbiwKKyAgICAgICAgICAgICAgICAgIG5vU3ViYmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgRkRLbWVtY3B5KGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJfZSwgcE5yZ3MtPm5yZ0dhaW5fZSwKKyAgICAgICAgICAgICAgICAgIG5vU3ViYmFuZHMgKiBzaXplb2YoU0NIQVIpKTsKKyAgICAgICAgRkRLbWVtY3B5KGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZSwgcE5yZ3MtPm5vaXNlTGV2ZWwsCisgICAgICAgICAgICAgICAgICBub1N1YmJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CiAgICAgICB9Ci0KICAgICB9CiAgICAgQ19BTExPQ19TQ1JBVENIX0VORChwTnJncywgRU5WX0NBTENfTlJHUywgMSk7CiAgIH0KIAorICAvKiBhZGFwdCBhZGpfZSB0byB0aGUgc2NhbGUgY2hhbmdlIGNhdXNlZCBieSBhcHBseV9pbnRlcl90ZXMoKSAqLworICBhZGpfZSArPSBpVEVTX3NjYWxlX2NoYW5nZTsKKwogICAvKiBSZXNjYWxlIG91dHB1dCBzYW1wbGVzICovCiAgIHsKICAgICBGSVhQX0RCTCBtYXhWYWw7CiAgICAgaW50IG92X3Jlc2VydmUsIHJlc2VydmU7CiAKICAgICAvKiBEZXRlcm1pbmUgaGVhZHJvb20gaW4gb2xkIGFkanVzdGVkIHNhbXBsZXMgKi8KLSAgICBtYXhWYWwgPSBtYXhTdWJiYW5kU2FtcGxlKCBhbmFseXNCdWZmZXJSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZUxQKSA/IE5VTEwgOiBhbmFseXNCdWZmZXJJbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd1N1YmJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaFN1YmJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9zdGFydCk7CisgICAgbWF4VmFsID0KKyAgICAgICAgbWF4U3ViYmFuZFNhbXBsZShhbmFseXNCdWZmZXJSZWFsLCAodXNlTFApID8gTlVMTCA6IGFuYWx5c0J1ZmZlckltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG93U3ViYmFuZCwgb3ZfaGlnaFN1YmJhbmQsIDAsIGZpcnN0X3N0YXJ0KTsKIAogICAgIG92X3Jlc2VydmUgPSBmTm9ybShtYXhWYWwpOwogCiAgICAgLyogRGV0ZXJtaW5lIGhlYWRyb29tIGluIG5ldyBhZGp1c3RlZCBzYW1wbGVzICovCi0gICAgbWF4VmFsID0gbWF4U3ViYmFuZFNhbXBsZSggYW5hbHlzQnVmZmVyUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlTFApID8gTlVMTCA6IGFuYWx5c0J1ZmZlckltYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93U3ViYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoU3ViYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub19jb2xzKTsKKyAgICBtYXhWYWwgPQorICAgICAgICBtYXhTdWJiYW5kU2FtcGxlKGFuYWx5c0J1ZmZlclJlYWwsICh1c2VMUCkgPyBOVUxMIDogYW5hbHlzQnVmZmVySW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb3dTdWJiYW5kLCBoaWdoU3ViYmFuZCwgZmlyc3Rfc3RhcnQsIG5vX2NvbHMpOwogCiAgICAgcmVzZXJ2ZSA9IGZOb3JtKG1heFZhbCk7CiAKICAgICAvKiBEZXRlcm1pbmUgY29tbW9uIG91dHB1dCBleHBvbmVudCAqLwotICAgIGlmIChvdl9hZGpfZSAtIG92X3Jlc2VydmUgID4gIGFkal9lIC0gcmVzZXJ2ZSApIC8qIHNldCBvdXRwdXRfZSB0byB0aGUgbWF4aW11bSAqLwotICAgICAgb3V0cHV0X2UgPSBvdl9hZGpfZSAtIG92X3Jlc2VydmU7Ci0gICAgZWxzZQotICAgICAgb3V0cHV0X2UgPSBhZGpfZSAtIHJlc2VydmU7CisgICAgb3V0cHV0X2UgPSBmTWF4KG92X2Fkal9lIC0gb3ZfcmVzZXJ2ZSwgYWRqX2UgLSByZXNlcnZlKTsKIAogICAgIC8qIFJlc2NhbGUgb2xkIHNhbXBsZXMgKi8KLSAgICByZXNjYWxlU3ViYmFuZFNhbXBsZXMoIGFuYWx5c0J1ZmZlclJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlTFApID8gTlVMTCA6IGFuYWx5c0J1ZmZlckltYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dTdWJiYW5kLCBoaWdoU3ViYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGZpcnN0X3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZfYWRqX2UgLSBvdXRwdXRfZSk7CisgICAgcmVzY2FsZVN1YmJhbmRTYW1wbGVzKGFuYWx5c0J1ZmZlclJlYWwsICh1c2VMUCkgPyBOVUxMIDogYW5hbHlzQnVmZmVySW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG93U3ViYmFuZCwgb3ZfaGlnaFN1YmJhbmQsIDAsIGZpcnN0X3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdl9hZGpfZSAtIG91dHB1dF9lKTsKIAogICAgIC8qIFJlc2NhbGUgbmV3IHNhbXBsZXMgKi8KLSAgICByZXNjYWxlU3ViYmFuZFNhbXBsZXMoIGFuYWx5c0J1ZmZlclJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlTFApID8gTlVMTCA6IGFuYWx5c0J1ZmZlckltYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dTdWJiYW5kLCBoaWdoU3ViYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3N0YXJ0LCBub19jb2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqX2UgLSBvdXRwdXRfZSk7CisgICAgcmVzY2FsZVN1YmJhbmRTYW1wbGVzKGFuYWx5c0J1ZmZlclJlYWwsICh1c2VMUCkgPyBOVUxMIDogYW5hbHlzQnVmZmVySW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG93U3ViYmFuZCwgaGlnaFN1YmJhbmQsIGZpcnN0X3N0YXJ0LCBub19jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhZGpfZSAtIG91dHB1dF9lKTsKICAgfQogCiAgIC8qIFVwZGF0ZSBoYl9zY2FsZSAqLwogICBzYnJTY2FsZUZhY3Rvci0+aGJfc2NhbGUgPSBFWFAyU0NBTEUob3V0cHV0X2UpOwogCiAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgZmluYWwgZXhwb25lbnQgZm9yIHRoZSBuZXh0IGZyYW1lOiAqLwotICBzYnJTY2FsZUZhY3Rvci0+b3ZfaGJfc2NhbGUgPSBFWFAyU0NBTEUoZmluYWxfZSk7CisgIC8qIGFkYXB0IGZpbmFsX2UgdG8gdGhlIHNjYWxlIGNoYW5nZSBjYXVzZWQgYnkgYXBwbHlfaW50ZXJfdGVzKCkgKi8KKyAgc2JyU2NhbGVGYWN0b3ItPm92X2hiX3NjYWxlID0gRVhQMlNDQUxFKGZpbmFsX2UgKyBpVEVTX3NjYWxlX2NoYW5nZSk7CiAKLQotICAvKiBXZSBuZWVkIHRvIHJlbWViZXIgdG8gdGhlIG5leHQgZnJhbWUgdGhhdCB0aGUgdHJhbnNpZW50CisgIC8qIFdlIG5lZWQgdG8gcmVtZW1iZXIgdG8gdGhlIG5leHQgZnJhbWUgdGhhdCB0aGUgdHJhbnNpZW50CiAgICAgIHdpbGwgb2NjdXIgaW4gdGhlIGZpcnN0IGVudmVsb3BlIChpZiB0cmFuRW52ID09IG5FbnZlbG9wZXMpLiAqLwotICBpZihoRnJhbWVEYXRhLT5mcmFtZUluZm8udHJhbkVudiA9PSBoRnJhbWVEYXRhLT5mcmFtZUluZm8ubkVudmVsb3BlcykKKyAgaWYgKGhGcmFtZURhdGEtPmZyYW1lSW5mby50cmFuRW52ID09IGhGcmFtZURhdGEtPmZyYW1lSW5mby5uRW52ZWxvcGVzKQogICAgIGhfc2JyX2NhbF9lbnYtPnByZXZUcmFuRW52ID0gMDsKICAgZWxzZQogICAgIGhfc2JyX2NhbF9lbnYtPnByZXZUcmFuRW52ID0gLTE7CiAKLX0KKyAgaWYgKHB2Y19tb2RlID4gMCkgeworICAgIC8qIE5vdCBtb3JlIHRoYW4ganVzdCB0aGUgbGFzdCBub2lzZSBlbnZlbG9wZSByZWFjaGVzIGludG8gdGhlIG5leHQgUFZDCisgICAgICAgZnJhbWUhIFRoaXMgc2hvdWxkIGJlIHRydWUgYmVjYXVzZSBic19ub2lzZV9wb3NpdGlvbiBpcyA8PSAxNSAqLworICAgIEZES19BU1NFUlQoaEZyYW1lRGF0YS0+ZnJhbWVJbmZvCisgICAgICAgICAgICAgICAgICAgLmJvcmRlcnNOb2lzZVtoRnJhbWVEYXRhLT5mcmFtZUluZm8ubk5vaXNlRW52ZWxvcGVzIC0gMV0gPAorICAgICAgICAgICAgICAgUFZDX05USU1FU0xPVCk7CisgICAgaWYgKGhGcmFtZURhdGEtPmZyYW1lSW5mbworICAgICAgICAgICAgLmJvcmRlcnNOb2lzZVtoRnJhbWVEYXRhLT5mcmFtZUluZm8ubk5vaXNlRW52ZWxvcGVzXSA+CisgICAgICAgIFBWQ19OVElNRVNMT1QpIHsKKyAgICAgIEZES19BU1NFUlQobm9pc2VMZXZlbHMgPT0KKyAgICAgICAgICAgICAgICAgKGhGcmFtZURhdGEtPnNick5vaXNlRmxvb3JMZXZlbCArCisgICAgICAgICAgICAgICAgICAoaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLm5Ob2lzZUVudmVsb3BlcyAtIDEpICogbm9Ob2lzZUJhbmRzKSk7CisgICAgICBoX3Nicl9jYWxfZW52LT5wcmV2Tk5mYiA9IG5vTm9pc2VCYW5kczsKIAorICAgICAgaF9zYnJfY2FsX2Vudi0+cHJldk5TZmJbMF0gPSBub1N1YkZyYW1lQmFuZHNbMF07CisgICAgICBoX3Nicl9jYWxfZW52LT5wcmV2TlNmYlsxXSA9IG5vU3ViRnJhbWVCYW5kc1sxXTsKKworICAgICAgaF9zYnJfY2FsX2Vudi0+cHJldkxvU3ViYmFuZCA9IGxvd1N1YmJhbmQ7CisgICAgICBoX3Nicl9jYWxfZW52LT5wcmV2SGlTdWJiYW5kID0gaGlnaFN1YmJhbmQ7CisgICAgICBoX3Nicl9jYWxfZW52LT5wcmV2X292X2hpZ2hTdWJiYW5kID0gb3ZfaGlnaFN1YmJhbmQ7CisKKyAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5wcmV2RnJlcUJhbmRUYWJsZUxvLCBwRnJlcUJhbmRUYWJsZVswXSwKKyAgICAgICAgICAgICAgICBub1N1YkZyYW1lQmFuZHNbMF0gKyAxKTsKKyAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5wcmV2RnJlcUJhbmRUYWJsZUhpLCBwRnJlcUJhbmRUYWJsZVsxXSwKKyAgICAgICAgICAgICAgICBub1N1YkZyYW1lQmFuZHNbMV0gKyAxKTsKKyAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5wcmV2RnJlcUJhbmRUYWJsZU5vaXNlLAorICAgICAgICAgICAgICAgIGhGcmVxLT5mcmVxQmFuZFRhYmxlTm9pc2UsIHNpemVvZihoRnJlcS0+ZnJlcUJhbmRUYWJsZU5vaXNlKSk7CisKKyAgICAgIEZES21lbWNweShoX3Nicl9jYWxfZW52LT5wcmV2U2JyTm9pc2VGbG9vckxldmVsLCBub2lzZUxldmVscywKKyAgICAgICAgICAgICAgICBNQVhfTk9JU0VfQ09FRkZTICogc2l6ZW9mKEZJWFBfU0dMKSk7CisgICAgfQorICB9CisKKyAgQ19BTExPQ19TQ1JBVENIX0VORCh1c2VBbGlhc1JlZHVjdGlvbiwgVUNIQVIsIDY0KQorfQogCiAvKiEKICAgXGJyaWVmICAgQ3JlYXRlIGVudmVsb3BlIGluc3RhbmNlCiAKLSAgTXVzdCBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBjaGFubmVsIGJlZm9yZSBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpIGNhbiBiZSB1c2VkLgorICBNdXN0IGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIGNoYW5uZWwgYmVmb3JlIGNhbGN1bGF0ZVNickVudmVsb3BlKCkgY2FuIGJlCisgIHVzZWQuCiAKICAgXHJldHVybiAgZXJyb3JDb2RlLCAwIGlmIHN1Y2Nlc3NmdWwKICovCiBTQlJfRVJST1IKLWNyZWF0ZVNickVudmVsb3BlQ2FsYyAoSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaHMsICAgLyohPCBwb2ludGVyIHRvIGVudmVsb3BlIGluc3RhbmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIC8qITwgc3RhdGljIFNCUiBjb250cm9sIGRhdGEsIGluaXRpYWxpemVkIHdpdGggZGVmYXVsdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNoYW4sICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFubmVsIGZvciB3aGljaCB0byBhc3NpZ24gYnVmZmVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzKQoteworY3JlYXRlU2JyRW52ZWxvcGVDYWxjKAorICAgIEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhzLCAvKiE8IHBvaW50ZXIgdG8gZW52ZWxvcGUgaW5zdGFuY2UgKi8KKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBCisgICAgICAgIGhIZWFkZXJEYXRhLCAvKiE8IHN0YXRpYyBTQlIgY29udHJvbCBkYXRhLCBpbml0aWFsaXplZCB3aXRoIGRlZmF1bHRzICovCisgICAgY29uc3QgaW50IGNoYW4sICAvKiE8IENoYW5uZWwgZm9yIHdoaWNoIHRvIGFzc2lnbiBidWZmZXJzICovCisgICAgY29uc3QgVUlOVCBmbGFncykgewogICBTQlJfRVJST1IgZXJyID0gU0JSREVDX09LOwogICBpbnQgaTsKIAogICAvKiBDbGVhciBwcmV2aW91cyBtaXNzaW5nIGhhcm1vbmljcyBmbGFncyAqLwotICBmb3IgKGk9MDsgaTwoTUFYX0ZSRVFfQ09FRkZTKzE1KT4+NDsgaSsrKSB7CisgIGZvciAoaSA9IDA7IGkgPCBBRERfSEFSTU9OSUNTX0ZMQUdTX1NJWkU7IGkrKykgewogICAgIGhzLT5oYXJtRmxhZ3NQcmV2W2ldID0gMDsKKyAgICBocy0+aGFybUZsYWdzUHJldkFjdGl2ZVtpXSA9IDA7CiAgIH0KICAgaHMtPmhhcm1JbmRleCA9IDA7CiAKKyAgRkRLbWVtY2xlYXIoaHMtPnByZXZTYnJOb2lzZUZsb29yTGV2ZWwsIHNpemVvZihocy0+cHJldlNick5vaXNlRmxvb3JMZXZlbCkpOworICBocy0+cHJldk5OZmIgPSAwOworICBGREttZW1jbGVhcihocy0+cHJldkZyZXFCYW5kVGFibGVOb2lzZSwgc2l6ZW9mKGhzLT5wcmV2RnJlcUJhbmRUYWJsZU5vaXNlKSk7CisgIGhzLT5zaW51c29pZGFsX3Bvc2l0aW9uUHJldiA9IDA7CisKICAgLyoKICAgICBTZXR1cCBwb2ludGVycyBmb3IgdGltZSBzbW9vdGhpbmcuCiAgICAgVGhlIGJ1ZmZlciBpdHNlbGYgd2lsbCBiZSBpbml0aWFsaXplZCBsYXRlciB0cmlnZ2VyZWQgYnkgdGhlIHN0YXJ0VXAtZmxhZy4KICAgKi8KICAgaHMtPnByZXZUcmFuRW52ID0gLTE7CiAKLQogICAvKiBpbml0aWFsaXphdGlvbiAqLwogICByZXNldFNickVudmVsb3BlQ2FsYyhocyk7CiAKLSAgaWYgKGNoYW49PTApIHsgLyogZG8gdGhpcyBvbmx5IG9uY2UgKi8KKyAgaWYgKGNoYW4gPT0gMCkgeyAvKiBkbyB0aGlzIG9ubHkgb25jZSAqLwogICAgIGVyciA9IHJlc2V0RnJlcUJhbmRUYWJsZXMoaEhlYWRlckRhdGEsIGZsYWdzKTsKICAgfQogCkBAIC0xMTU4LDE2ICsxNzc4LDEyIEBACiAvKiEKICAgXGJyaWVmICAgQ3JlYXRlIGVudmVsb3BlIGluc3RhbmNlCiAKLSAgTXVzdCBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBjaGFubmVsIGJlZm9yZSBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpIGNhbiBiZSB1c2VkLgorICBNdXN0IGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIGNoYW5uZWwgYmVmb3JlIGNhbGN1bGF0ZVNickVudmVsb3BlKCkgY2FuIGJlCisgIHVzZWQuCiAKICAgXHJldHVybiAgZXJyb3JDb2RlLCAwIGlmIHN1Y2Nlc3NmdWwKICovCi1pbnQKLWRlbGV0ZVNickVudmVsb3BlQ2FsYyAoSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaHMpCi17Ci0gIHJldHVybiAwOwotfQotCitpbnQgZGVsZXRlU2JyRW52ZWxvcGVDYWxjKEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhzKSB7IHJldHVybiAwOyB9CiAKIC8qIQogICBcYnJpZWYgICBSZXNldCBlbnZlbG9wZSBpbnN0YW5jZQpAQCAtMTE3NywxOCArMTc5MywxOCBAQAogCiAgIFxyZXR1cm4gIGVycm9yQ29kZSwgMCBpZiBzdWNjZXNzZnVsCiAqLwotdm9pZAotcmVzZXRTYnJFbnZlbG9wZUNhbGMgKEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhDYWxFbnYpIC8qITwgcG9pbnRlciB0byBlbnZlbG9wZSBpbnN0YW5jZSAqLwordm9pZCByZXNldFNickVudmVsb3BlQ2FsYygKKyAgICBIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoQ2FsRW52KSAvKiE8IHBvaW50ZXIgdG8gZW52ZWxvcGUgaW5zdGFuY2UgKi8KIHsKICAgaENhbEVudi0+cGhhc2VJbmRleCA9IDA7CiAKLSAgLyogTm9pc2UgZXhwb25lbnQgbmVlZHMgdG8gYmUgcmVzZXQgYmVjYXVzZSB0aGUgb3V0cHV0IGV4cG9uZW50IGZvciB0aGUgbmV4dCBmcmFtZSBkZXBlbmRzIG9uIGl0ICovCisgIC8qIE5vaXNlIGV4cG9uZW50IG5lZWRzIHRvIGJlIHJlc2V0IGJlY2F1c2UgdGhlIG91dHB1dCBleHBvbmVudCBmb3IgdGhlIG5leHQKKyAgICogZnJhbWUgZGVwZW5kcyBvbiBpdCAqLwogICBoQ2FsRW52LT5maWx0QnVmZmVyTm9pc2VfZSA9IDA7CiAKICAgaENhbEVudi0+c3RhcnRVcCA9IDE7CiB9CiAKLQogLyohCiAgIFxicmllZiAgRXF1YWxpemUgZXhwb25lbnRzIG9mIHRoZSBidWZmZXJlZCBnYWluIHZhbHVlcyBhbmQgdGhlIG5ldyBvbmVzCiAKQEAgLTExOTYsNDAgKzE4MTIsNDEgQEAKICAgY2FuIGJlIHBlcmZvcm1lZC4KICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBlbnZlbG9wZSBiZWZvcmUgYWRqdXN0aW5nLgogKi8KLXN0YXRpYyB2b2lkIGVxdWFsaXplRmlsdEJ1ZmZlckV4cChGSVhQX0RCTCAqZmlsdEJ1ZmZlciwgICAgIC8qITwgYnVmZmVyZCBnYWlucyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICpmaWx0QnVmZmVyX2UsICAgLyohPCBleHBvbmVudHMgb2YgYnVmZmVyZCBnYWlucyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpucmdHYWluLCAgICAgICAgLyohPCBnYWlucyBmb3IgY3VycmVudCBlbnZlbG9wZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICpucmdHYWluX2UsICAgICAgLyohPCBleHBvbmVudHMgb2YgZ2FpbnMgZm9yIGN1cnJlbnQgZW52ZWxvcGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgc3ViYmFuZHMpICAgICAgIC8qITwgTnVtYmVyIG9mIFFNRiBzdWJiYW5kcyAqLworc3RhdGljIHZvaWQgZXF1YWxpemVGaWx0QnVmZmVyRXhwKAorICAgIEZJWFBfREJMICpmaWx0QnVmZmVyLCAvKiE8IGJ1ZmZlcmQgZ2FpbnMgKi8KKyAgICBTQ0hBUiAqZmlsdEJ1ZmZlcl9lLCAgLyohPCBleHBvbmVudHMgb2YgYnVmZmVyZCBnYWlucyAqLworICAgIEZJWFBfREJMICpucmdHYWluLCAgICAvKiE8IGdhaW5zIGZvciBjdXJyZW50IGVudmVsb3BlICovCisgICAgU0NIQVIgKm5yZ0dhaW5fZSwgICAgIC8qITwgZXhwb25lbnRzIG9mIGdhaW5zIGZvciBjdXJyZW50IGVudmVsb3BlICovCisgICAgaW50IHN1YmJhbmRzKSAgICAgICAgIC8qITwgTnVtYmVyIG9mIFFNRiBzdWJiYW5kcyAqLwogewotICBpbnQgICBiYW5kOwotICBpbnQgIGRpZmY7CisgIGludCBiYW5kOworICBpbnQgZGlmZjsKIAotICBmb3IgKGJhbmQ9MDsgYmFuZDxzdWJiYW5kczsgYmFuZCsrKXsKLSAgICBkaWZmID0gKGludCkgKG5yZ0dhaW5fZVtiYW5kXSAtIGZpbHRCdWZmZXJfZVtiYW5kXSk7Ci0gICAgaWYgKGRpZmY+MCkgewotICAgICAgZmlsdEJ1ZmZlcltiYW5kXSA+Pj0gZGlmZjsgICAvKiBDb21wZW5zYXRlIGZvciB0aGUgc2NhbGUgY2hhbmdlIGJ5IHNoaWZ0aW5nIHRoZSBtYW50aXNzYS4gKi8KLSAgICAgIGZpbHRCdWZmZXJfZVtiYW5kXSArPSBkaWZmOyAgLyogTmV3IGdhaW4gaXMgYmlnZ2VyLCB1c2UgaXRzIGV4cG9uZW50ICovCi0gICAgfQotICAgIGVsc2UgaWYgKGRpZmY8MCkgeworICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgc3ViYmFuZHM7IGJhbmQrKykgeworICAgIGRpZmYgPSAoaW50KShucmdHYWluX2VbYmFuZF0gLSBmaWx0QnVmZmVyX2VbYmFuZF0pOworICAgIGlmIChkaWZmID4gMCkgeworICAgICAgZmlsdEJ1ZmZlcltiYW5kXSA+Pj0KKyAgICAgICAgICBkaWZmOyAvKiBDb21wZW5zYXRlIGZvciB0aGUgc2NhbGUgY2hhbmdlIGJ5IHNoaWZ0aW5nIHRoZSBtYW50aXNzYS4gKi8KKyAgICAgIGZpbHRCdWZmZXJfZVtiYW5kXSArPSBkaWZmOyAvKiBOZXcgZ2FpbiBpcyBiaWdnZXIsIHVzZSBpdHMgZXhwb25lbnQgKi8KKyAgICB9IGVsc2UgaWYgKGRpZmYgPCAwKSB7CiAgICAgICAvKiBUaGUgYnVmZmVyZWQgZ2FpbnMgc2VlbSB0byBiZSBsYXJnZXIsIGJ1dCBtYXliZSB0aGVyZQogICAgICAgICAgYXJlIHNvbWUgdW51c2VkIGJpdHMgbGVmdCBpbiB0aGUgbWFudGlzc2EgKi8KIAotICAgICAgaW50IHJlc2VydmUgPSBDbnRMZWFkaW5nWmVyb3MoZml4cF9hYnMoZmlsdEJ1ZmZlcltiYW5kXSkpLTE7CisgICAgICBpbnQgcmVzZXJ2ZSA9IENudExlYWRpbmdaZXJvcyhmaXhwX2FicyhmaWx0QnVmZmVyW2JhbmRdKSkgLSAxOwogCiAgICAgICBpZiAoKC1kaWZmKSA8PSByZXNlcnZlKSB7CiAgICAgICAgIC8qIFRoZXJlIGlzIGVub3VnaCBzcGFjZSBpbiB0aGUgYnVmZmVyZWQgbWFudGlzc2Egc28KICAgICAgICAgICAgdGhhdCB3ZSBjYW4gdGFrZSB0aGUgbmV3IGV4cG9uZW50IGFzIGNvbW1vbi4KICAgICAgICAgKi8KICAgICAgICAgZmlsdEJ1ZmZlcltiYW5kXSA8PD0gKC1kaWZmKTsKLSAgICAgICAgZmlsdEJ1ZmZlcl9lW2JhbmRdICs9IGRpZmY7ICAvKiBiZWNvbWVzIGVxdWFsIHRvICpwdHJOZXdFeHAgKi8KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBmaWx0QnVmZmVyW2JhbmRdIDw8PSByZXNlcnZlOyAgIC8qIFNoaWZ0IHRoZSBtYW50aXNzYSBhcyBmYXIgYXMgcG9zc2libGU6ICovCi0gICAgICAgIGZpbHRCdWZmZXJfZVtiYW5kXSAtPSByZXNlcnZlOyAgLyogQ29tcGVuc2F0ZSBpbiB0aGUgZXhwb25lbnQ6ICovCisgICAgICAgIGZpbHRCdWZmZXJfZVtiYW5kXSArPSBkaWZmOyAvKiBiZWNvbWVzIGVxdWFsIHRvICpwdHJOZXdFeHAgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpbHRCdWZmZXJbYmFuZF0gPDw9CisgICAgICAgICAgICByZXNlcnZlOyAvKiBTaGlmdCB0aGUgbWFudGlzc2EgYXMgZmFyIGFzIHBvc3NpYmxlOiAqLworICAgICAgICBmaWx0QnVmZmVyX2VbYmFuZF0gLT0gcmVzZXJ2ZTsgLyogQ29tcGVuc2F0ZSBpbiB0aGUgZXhwb25lbnQ6ICovCiAKICAgICAgICAgLyogRm9yIHRoZSByZW1haW5pbmcgZGlmZmVyZW5jZSwgY2hhbmdlIHRoZSBuZXcgZ2FpbiB2YWx1ZSAqLwotICAgICAgICBkaWZmID0gZml4TWluKC0ocmVzZXJ2ZSArIGRpZmYpLERGUkFDVF9CSVRTLTEpOworICAgICAgICBkaWZmID0gZml4TWluKC0ocmVzZXJ2ZSArIGRpZmYpLCBERlJBQ1RfQklUUyAtIDEpOwogICAgICAgICBucmdHYWluW2JhbmRdID4+PSBkaWZmOwogICAgICAgICBucmdHYWluX2VbYmFuZF0gKz0gZGlmZjsKICAgICAgIH0KQEAgLTEyNDQsMzEgKzE4NjEsNDEgQEAKICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlc2NhbGUgdGhlIGF1ZGlvIGRhdGEgaW4gdGhlIG92ZXJsYXAgYnVmZmVyCiAgIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gZW52ZWxvcGUgYWRqdXN0ZWQgd2l0aCB0aGUgbGFzdCBmcmFtZS4KICovCi12b2lkIHJlc2NhbGVTdWJiYW5kU2FtcGxlcyhGSVhQX0RCTCAqKiByZSwgICAvKiE8IFJlYWwgcGFydCBvZiBpbnB1dCBhbmQgb3V0cHV0IHN1YmJhbmQgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiogaW0sICAgLyohPCBJbWFnaW5hcnkgcGFydCBvZiBpbnB1dCBhbmQgb3V0cHV0IHN1YmJhbmQgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvd1N1YmJhbmQsICAgLyohPCBCZWdpbiBvZiBmcmVxdWVuY3kgcmFuZ2UgdG8gcHJvY2VzcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpZ2hTdWJiYW5kLCAgLyohPCBFbmQgb2YgZnJlcXVlbmN5IHJhbmdlIHRvIHByb2Nlc3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9wb3MsICAgIC8qITwgQmVnaW4gb2YgdGltZSByYWdlIChRTUYtdGltZXNsb3QpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dF9wb3MsICAgICAvKiE8IEVuZCBvZiB0aW1lIHJhZ2UgKFFNRi10aW1lc2xvdCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGlmdCkgICAgICAgIC8qITwgbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgKi8KK3ZvaWQgcmVzY2FsZVN1YmJhbmRTYW1wbGVzKAorICAgIEZJWFBfREJMICoqcmUsICAgLyohPCBSZWFsIHBhcnQgb2YgaW5wdXQgYW5kIG91dHB1dCBzdWJiYW5kIHNhbXBsZXMgKi8KKyAgICBGSVhQX0RCTCAqKmltLCAgIC8qITwgSW1hZ2luYXJ5IHBhcnQgb2YgaW5wdXQgYW5kIG91dHB1dCBzdWJiYW5kIHNhbXBsZXMgKi8KKyAgICBpbnQgbG93U3ViYmFuZCwgIC8qITwgQmVnaW4gb2YgZnJlcXVlbmN5IHJhbmdlIHRvIHByb2Nlc3MgKi8KKyAgICBpbnQgaGlnaFN1YmJhbmQsIC8qITwgRW5kIG9mIGZyZXF1ZW5jeSByYW5nZSB0byBwcm9jZXNzICovCisgICAgaW50IHN0YXJ0X3BvcywgICAvKiE8IEJlZ2luIG9mIHRpbWUgcmFnZSAoUU1GLXRpbWVzbG90KSAqLworICAgIGludCBuZXh0X3BvcywgICAgLyohPCBFbmQgb2YgdGltZSByYWdlIChRTUYtdGltZXNsb3QpICovCisgICAgaW50IHNoaWZ0KSAgICAgICAvKiE8IG51bWJlciBvZiBiaXRzIHRvIHNoaWZ0ICovCiB7Ci0gIGludCB3aWR0aCA9IGhpZ2hTdWJiYW5kLWxvd1N1YmJhbmQ7CisgIGludCB3aWR0aCA9IGhpZ2hTdWJiYW5kIC0gbG93U3ViYmFuZDsKIAotICBpZiAoICh3aWR0aCA+IDApICYmIChzaGlmdCE9MCkgKSB7Ci0gICAgaWYgKGltIT1OVUxMKSB7Ci0gICAgICBmb3IgKGludCBsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7Ci0gICAgICAgICAgc2NhbGVWYWx1ZXMoJnJlW2xdW2xvd1N1YmJhbmRdLCB3aWR0aCwgc2hpZnQpOwotICAgICAgICAgIHNjYWxlVmFsdWVzKCZpbVtsXVtsb3dTdWJiYW5kXSwgd2lkdGgsIHNoaWZ0KTsKKyAgaWYgKCh3aWR0aCA+IDApICYmIChzaGlmdCAhPSAwKSkgeworICAgIGlmIChpbSAhPSBOVUxMKSB7CisgICAgICBmb3IgKGludCBsID0gc3RhcnRfcG9zOyBsIDwgbmV4dF9wb3M7IGwrKykgeworICAgICAgICBzY2FsZVZhbHVlcygmcmVbbF1bbG93U3ViYmFuZF0sIHdpZHRoLCBzaGlmdCk7CisgICAgICAgIHNjYWxlVmFsdWVzKCZpbVtsXVtsb3dTdWJiYW5kXSwgd2lkdGgsIHNoaWZ0KTsKICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGludCBsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7Ci0gICAgICAgICAgc2NhbGVWYWx1ZXMoJnJlW2xdW2xvd1N1YmJhbmRdLCB3aWR0aCwgc2hpZnQpOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBsID0gc3RhcnRfcG9zOyBsIDwgbmV4dF9wb3M7IGwrKykgeworICAgICAgICBzY2FsZVZhbHVlcygmcmVbbF1bbG93U3ViYmFuZF0sIHdpZHRoLCBzaGlmdCk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKK3N0YXRpYyBpbmxpbmUgRklYUF9EQkwgRkRLX2dldF9tYXh2YWxfcmVhbChGSVhQX0RCTCBtYXhWYWwsIEZJWFBfREJMICpyZVRtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgd2lkdGgpIHsKKyAgbWF4VmFsID0gKEZJWFBfREJMKTA7CisgIHdoaWxlICh3aWR0aC0tICE9IDApIHsKKyAgICBGSVhQX0RCTCB0bXAgPSAqKHJlVG1wKyspOworICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKSh0bXApIF4gKChMT05HKXRtcCA+PiAoREZSQUNUX0JJVFMgLSAxKSkpOworICB9CisKKyAgcmV0dXJuIG1heFZhbDsKK30KIAogLyohCiAgIFxicmllZiAgIERldGVybWluZSBoZWFkcm9vbSBmb3Igc2hpZnRpbmcKQEAgLTEyNzksNTUgKzE5MDYsNTggQEAKICAgXHJldHVybiAgTnVtYmVyIG9mIGZyZWUgYml0cyBpbiB0aGUgYmlnZ2VzdCBzcGVjdHJhbCB2YWx1ZQogKi8KIAotRklYUF9EQkwgbWF4U3ViYmFuZFNhbXBsZSggRklYUF9EQkwgKiogcmUsICAgLyohPCBSZWFsIHBhcnQgb2YgaW5wdXQgYW5kIG91dHB1dCBzdWJiYW5kIHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqIGltLCAgIC8qITwgUmVhbCBwYXJ0IG9mIGlucHV0IGFuZCBvdXRwdXQgc3ViYmFuZCBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG93U3ViYmFuZCwgICAvKiE8IEJlZ2luIG9mIGZyZXF1ZW5jeSByYW5nZSB0byBwcm9jZXNzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGlnaFN1YmJhbmQsICAvKiE8IE51bWJlciBvZiBRTUYgYmFuZHMgdG8gcHJvY2VzcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3BvcywgICAgLyohPCBCZWdpbiBvZiB0aW1lIHJhZ2UgKFFNRi10aW1lc2xvdCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXh0X3BvcyAgICAgIC8qITwgRW5kIG9mIHRpbWUgcmFnZSAoUU1GLXRpbWVzbG90KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CitGSVhQX0RCTCBtYXhTdWJiYW5kU2FtcGxlKAorICAgIEZJWFBfREJMICoqcmUsICAgLyohPCBSZWFsIHBhcnQgb2YgaW5wdXQgYW5kIG91dHB1dCBzdWJiYW5kIHNhbXBsZXMgKi8KKyAgICBGSVhQX0RCTCAqKmltLCAgIC8qITwgUmVhbCBwYXJ0IG9mIGlucHV0IGFuZCBvdXRwdXQgc3ViYmFuZCBzYW1wbGVzICovCisgICAgaW50IGxvd1N1YmJhbmQsICAvKiE8IEJlZ2luIG9mIGZyZXF1ZW5jeSByYW5nZSB0byBwcm9jZXNzICovCisgICAgaW50IGhpZ2hTdWJiYW5kLCAvKiE8IE51bWJlciBvZiBRTUYgYmFuZHMgdG8gcHJvY2VzcyAqLworICAgIGludCBzdGFydF9wb3MsICAgLyohPCBCZWdpbiBvZiB0aW1lIHJhZ2UgKFFNRi10aW1lc2xvdCkgKi8KKyAgICBpbnQgbmV4dF9wb3MgICAgIC8qITwgRW5kIG9mIHRpbWUgcmFnZSAoUU1GLXRpbWVzbG90KSAqLworKSB7CiAgIEZJWFBfREJMIG1heFZhbCA9IEZMMkZYX0RCTCgwLjBmKTsKICAgdW5zaWduZWQgaW50IHdpZHRoID0gaGlnaFN1YmJhbmQgLSBsb3dTdWJiYW5kOwogCiAgIEZES19BU1NFUlQod2lkdGggPD0gKDY0KSk7CiAKLSAgaWYgKCB3aWR0aCA+IDAgKSB7Ci0gICAgaWYgKGltIT1OVUxMKSAKLSAgICB7Ci0gICAgICBmb3IgKGludCBsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSAKLSAgICAgIHsKLSNpZmRlZiBGVU5DVElPTl9GREtfZ2V0X21heHZhbAotICAgICAgICBtYXhWYWwgPSBGREtfZ2V0X21heHZhbChtYXhWYWwsICZyZVtsXVtsb3dTdWJiYW5kXSwgJmltW2xdW2xvd1N1YmJhbmRdLCB3aWR0aCk7Ci0jZWxzZQotICAgICAgICBpbnQgaz13aWR0aDsKKyAgaWYgKHdpZHRoID4gMCkgeworICAgIGlmIChpbSAhPSBOVUxMKSB7CisgICAgICBmb3IgKGludCBsID0gc3RhcnRfcG9zOyBsIDwgbmV4dF9wb3M7IGwrKykgeworICAgICAgICBpbnQgayA9IHdpZHRoOwogICAgICAgICBGSVhQX0RCTCAqcmVUbXAgPSAmcmVbbF1bbG93U3ViYmFuZF07CiAgICAgICAgIEZJWFBfREJMICppbVRtcCA9ICZpbVtsXVtsb3dTdWJiYW5kXTsKLSAgICAgICAgZG97CisgICAgICAgIGRvIHsKICAgICAgICAgICBGSVhQX0RCTCB0bXAxID0gKihyZVRtcCsrKTsKICAgICAgICAgICBGSVhQX0RCTCB0bXAyID0gKihpbVRtcCsrKTsKLSAgICAgICAgICBtYXhWYWwgfD0gKEZJWFBfREJMKSgoTE9ORykodG1wMSleKChMT05HKXRtcDE+PihERlJBQ1RfQklUUy0xKSkpOwotICAgICAgICAgIG1heFZhbCB8PSAoRklYUF9EQkwpKChMT05HKSh0bXAyKV4oKExPTkcpdG1wMj4+KERGUkFDVF9CSVRTLTEpKSk7Ci0gICAgICAgIH0gd2hpbGUoLS1rIT0wKTsKLSNlbmRpZgorICAgICAgICAgIG1heFZhbCB8PQorICAgICAgICAgICAgICAoRklYUF9EQkwpKChMT05HKSh0bXAxKSBeICgoTE9ORyl0bXAxID4+IChERlJBQ1RfQklUUyAtIDEpKSk7CisgICAgICAgICAgbWF4VmFsIHw9CisgICAgICAgICAgICAgIChGSVhQX0RCTCkoKExPTkcpKHRtcDIpIF4gKChMT05HKXRtcDIgPj4gKERGUkFDVF9CSVRTIC0gMSkpKTsKKyAgICAgICAgfSB3aGlsZSAoLS1rICE9IDApOwogICAgICAgfQotICAgIH0gZWxzZQotICAgIHsKLSAgICAgIGZvciAoaW50IGw9c3RhcnRfcG9zOyBsPG5leHRfcG9zOyBsKyspIHsKLSAgICAgICAgaW50IGs9d2lkdGg7Ci0gICAgICAgIEZJWFBfREJMICpyZVRtcCA9ICZyZVtsXVtsb3dTdWJiYW5kXTsKLSAgICAgICAgZG97Ci0gICAgICAgICAgRklYUF9EQkwgdG1wID0gKihyZVRtcCsrKTsKLSAgICAgICAgICBtYXhWYWwgfD0gKEZJWFBfREJMKSgoTE9ORykodG1wKV4oKExPTkcpdG1wPj4oREZSQUNUX0JJVFMtMSkpKTsKLSAgICAgICAgfXdoaWxlKC0tayE9MCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGwgPSBzdGFydF9wb3M7IGwgPCBuZXh0X3BvczsgbCsrKSB7CisgICAgICAgIG1heFZhbCB8PSBGREtfZ2V0X21heHZhbF9yZWFsKG1heFZhbCwgJnJlW2xdW2xvd1N1YmJhbmRdLCB3aWR0aCk7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgcmV0dXJuKG1heFZhbCk7CisgIGlmIChtYXhWYWwgPiAoRklYUF9EQkwpMCkgeworICAgIC8qIEZvciBuZWdhdGl2ZSBpbnB1dCB2YWx1ZXMsIG1heFZhbCBpcyB0b28gc21hbGwgYnkgMS4gQWRkIDEgb25seSB3aGVuCisgICAgICogbmVjZXNzYXJ5OiBpZiBtYXhWYWwgaXMgYSBwb3dlciBvZiAyICovCisgICAgRklYUF9EQkwgbG93ZXJQb3cyID0KKyAgICAgICAgKEZJWFBfREJMKSgxIDw8IChERlJBQ1RfQklUUyAtIDEgLSBDbnRMZWFkaW5nWmVyb3MobWF4VmFsKSkpOworICAgIGlmIChtYXhWYWwgPT0gbG93ZXJQb3cyKSBtYXhWYWwgKz0gKEZJWFBfREJMKTE7CisgIH0KKworICByZXR1cm4gKG1heFZhbCk7CiB9CiAKLSNkZWZpbmUgU0hJRlRfQkVGT1JFX1NRVUFSRSAoMykgLyogKDcvMikgKi8KKy8qICNkZWZpbmUgU0hJRlRfQkVGT1JFX1NRVUFSRSAoMykgKi8gLyogKDcvMikgKi8KKy8qIEF2b2lkIGFzc2VydGlvbiBmYWlsdXJlcyB0cmlnZ2VyZCBieSBvdmVyZmxvd3Mgd2hpY2ggb2NjdXJlZCBpbiByb2J1c3RuZXNzCisgICB0ZXN0cy4gU2V0dGluZyB0aGUgU0hJRlRfQkVGT1JFX1NRVUFSRSB0byA0IGhhcyBuZWdsaWdpYmxlIGVmZmVjdCBvbiAoVVNBQykKKyAgIGNvbmZvcm1hbmNlIHJlc3VsdHMuICovCisjZGVmaW5lIFNISUZUX0JFRk9SRV9TUVVBUkUgKDQpIC8qICgoOCAtIDApIC8gMikgKi8KKwogLyohPAogICBJZiB0aGUgYWNjdW11bGF0b3IgZG9lcyBub3QgcHJvdmlkZSBlbm91Z2ggb3ZlcmZsb3cgYml0cyBvcgogICBkb2VzIG5vdCBwcm92aWRlIGEgaGlnaCBkeW5hbWljIHJhbmdlLCB0aGUgYmVsb3cgZW5lcmd5IGNhbGN1bGF0aW9uCkBAIC0xMzUxLDkyICsxOTgxLDEwMCBAQAogCiAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIGludGVycG9sRnJlcSBpcyB0cnVlLgogKi8KLXN0YXRpYyB2b2lkIGNhbGNOcmdQZXJTdWJiYW5kKEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlclJlYWwsIC8qITwgUmVhbCBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICoqYW5hbHlzQnVmZmVySW1hZywgLyohPCBJbWFnaW5hcnkgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBsb3dTdWJiYW5kLCAgICAgICAgICAgLyohPCBCZWdpbiBvZiB0aGUgU0JSIGZyZXF1ZW5jeSByYW5nZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGhpZ2hTdWJiYW5kLCAgICAgICAgICAvKiE8IEhpZ2ggZW5kIG9mIHRoZSBTQlIgZnJlcXVlbmN5IHJhbmdlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgc3RhcnRfcG9zLCAgICAgICAgICAgIC8qITwgRmlyc3QgUU1GLXNsb3Qgb2YgY3VycmVudCBlbnZlbG9wZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5leHRfcG9zLCAgICAgICAgICAgICAvKiE8IExhc3QgUU1GLXNsb3Qgb2YgY3VycmVudCBlbnZlbG9wZSArIDEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICBmcmFtZUV4cCwgICAgICAgICAgICAgLyohPCBDb21tb24gZXhwb25lbnQgZm9yIGFsbCBpbnB1dCBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbnJnRXN0LCAgICAgICAgICAgICAgIC8qITwgcmVzdWx0aW5nIEVuZXJneSAoMC4uMSkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICpucmdFc3RfZSApICAgICAgICAgICAgLyohPCBFeHBvbmVudCBvZiByZXN1bHRpbmcgRW5lcmd5ICovCitzdGF0aWMgdm9pZCBjYWxjTnJnUGVyU3ViYmFuZCgKKyAgICBGSVhQX0RCTCAqKmFuYWx5c0J1ZmZlclJlYWwsIC8qITwgUmVhbCBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyAqLworICAgIEZJWFBfREJMICoqYW5hbHlzQnVmZmVySW1hZywgLyohPCBJbWFnaW5hcnkgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgKi8KKyAgICBpbnQgbG93U3ViYmFuZCwgICAgICAgICAgICAgIC8qITwgQmVnaW4gb2YgdGhlIFNCUiBmcmVxdWVuY3kgcmFuZ2UgKi8KKyAgICBpbnQgaGlnaFN1YmJhbmQsICAgICAgICAgICAgIC8qITwgSGlnaCBlbmQgb2YgdGhlIFNCUiBmcmVxdWVuY3kgcmFuZ2UgKi8KKyAgICBpbnQgc3RhcnRfcG9zLCAgICAgICAgICAgICAgIC8qITwgRmlyc3QgUU1GLXNsb3Qgb2YgY3VycmVudCBlbnZlbG9wZSAqLworICAgIGludCBuZXh0X3BvcywgICAgICAgICAgICAgICAgLyohPCBMYXN0IFFNRi1zbG90IG9mIGN1cnJlbnQgZW52ZWxvcGUgKyAxICovCisgICAgU0NIQVIgZnJhbWVFeHAsICAgICAgICAgICAgICAvKiE8IENvbW1vbiBleHBvbmVudCBmb3IgYWxsIGlucHV0IHNhbXBsZXMgKi8KKyAgICBGSVhQX0RCTCAqbnJnRXN0LCAgICAgICAgICAgIC8qITwgcmVzdWx0aW5nIEVuZXJneSAoMC4uMSkgKi8KKyAgICBTQ0hBUiAqbnJnRXN0X2UpICAgICAgICAgICAgIC8qITwgRXhwb25lbnQgb2YgcmVzdWx0aW5nIEVuZXJneSAqLwogewogICBGSVhQX1NHTCBpbnZXaWR0aDsKLSAgU0NIQVIgIHByZVNoaWZ0OwotICBTQ0hBUiAgc2hpZnQ7CisgIFNDSEFSIHByZVNoaWZ0OworICBTQ0hBUiBzaGlmdDsKICAgRklYUF9EQkwgc3VtOwotICBpbnQgayxsOworICBpbnQgazsKIAogICAvKiBEaXZpZGUgYnkgd2lkdGggb2YgZW52ZWxvcGUgbGF0ZXI6ICovCiAgIGludldpZHRoID0gRlhfREJMMkZYX1NHTChHZXRJbnZJbnQobmV4dF9wb3MgLSBzdGFydF9wb3MpKTsKLSAgLyogVGhlIGNvbW1vbiBleHBvbmVudCBuZWVkcyB0byBiZSBkb3VibGVkIGJlY2F1c2UgYWxsIG1hbnRpc3NhcyBhcmUgc3F1YXJlZDogKi8KKyAgLyogVGhlIGNvbW1vbiBleHBvbmVudCBuZWVkcyB0byBiZSBkb3VibGVkIGJlY2F1c2UgYWxsIG1hbnRpc3NhcyBhcmUgc3F1YXJlZDoKKyAgICovCiAgIGZyYW1lRXhwID0gZnJhbWVFeHAgPDwgMTsKIAotICBmb3IgKGs9bG93U3ViYmFuZDsgazxoaWdoU3ViYmFuZDsgaysrKSB7Ci0gICAgRklYUF9EQkwgIGJ1ZmZlclJlYWxbKCgoMTAyNCkvKDMyKSkrKDYpKV07Ci0gICAgRklYUF9EQkwgIGJ1ZmZlckltYWdbKCgoMTAyNCkvKDMyKSkrKDYpKV07Ci0gICAgRklYUF9EQkwgbWF4VmFsID0gRkwyRlhfREJMKDAuMGYpOworICBmb3IgKGsgPSBsb3dTdWJiYW5kOyBrIDwgaGlnaFN1YmJhbmQ7IGsrKykgeworICAgIEZJWFBfREJMIGJ1ZmZlclJlYWxbKCgoMTAyNCkgLyAoMzIpICogKDQpIC8gMikgKyAoMyAqICg0KSkpXTsKKyAgICBGSVhQX0RCTCBidWZmZXJJbWFnWygoKDEwMjQpIC8gKDMyKSAqICg0KSAvIDIpICsgKDMgKiAoNCkpKV07CisgICAgRklYUF9EQkwgbWF4VmFsOwogCi0gICAgaWYgKGFuYWx5c0J1ZmZlckltYWchPU5VTEwpCi0gICAgewotICAgICAgZm9yIChsPXN0YXJ0X3BvcztsPG5leHRfcG9zO2wrKykgCi0gICAgICB7CisgICAgaWYgKGFuYWx5c0J1ZmZlckltYWcgIT0gTlVMTCkgeworICAgICAgaW50IGw7CisgICAgICBtYXhWYWwgPSBGTDJGWF9EQkwoMC4wZik7CisgICAgICBmb3IgKGwgPSBzdGFydF9wb3M7IGwgPCBuZXh0X3BvczsgbCsrKSB7CiAgICAgICAgIGJ1ZmZlckltYWdbbF0gPSBhbmFseXNCdWZmZXJJbWFnW2xdW2tdOwotICAgICAgICBtYXhWYWwgfD0gKEZJWFBfREJMKSgoTE9ORykoYnVmZmVySW1hZ1tsXSleKChMT05HKWJ1ZmZlckltYWdbbF0+PihERlJBQ1RfQklUUy0xKSkpOworICAgICAgICBtYXhWYWwgfD0gKEZJWFBfREJMKSgoTE9ORykoYnVmZmVySW1hZ1tsXSkgXgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExPTkcpYnVmZmVySW1hZ1tsXSA+PiAoREZSQUNUX0JJVFMgLSAxKSkpOwogICAgICAgICBidWZmZXJSZWFsW2xdID0gYW5hbHlzQnVmZmVyUmVhbFtsXVtrXTsKLSAgICAgICAgbWF4VmFsIHw9IChGSVhQX0RCTCkoKExPTkcpKGJ1ZmZlclJlYWxbbF0pXigoTE9ORylidWZmZXJSZWFsW2xdPj4oREZSQUNUX0JJVFMtMSkpKTsKKyAgICAgICAgbWF4VmFsIHw9IChGSVhQX0RCTCkoKExPTkcpKGJ1ZmZlclJlYWxbbF0pIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMT05HKWJ1ZmZlclJlYWxbbF0gPj4gKERGUkFDVF9CSVRTIC0gMSkpKTsKICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZvciAobD1zdGFydF9wb3M7bDxuZXh0X3BvcztsKyspCi0gICAgICB7CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBsOworICAgICAgbWF4VmFsID0gRkwyRlhfREJMKDAuMGYpOworICAgICAgZm9yIChsID0gc3RhcnRfcG9zOyBsIDwgbmV4dF9wb3M7IGwrKykgewogICAgICAgICBidWZmZXJSZWFsW2xdID0gYW5hbHlzQnVmZmVyUmVhbFtsXVtrXTsKLSAgICAgICAgbWF4VmFsIHw9IChGSVhQX0RCTCkoKExPTkcpKGJ1ZmZlclJlYWxbbF0pXigoTE9ORylidWZmZXJSZWFsW2xdPj4oREZSQUNUX0JJVFMtMSkpKTsKKyAgICAgICAgbWF4VmFsIHw9IChGSVhQX0RCTCkoKExPTkcpKGJ1ZmZlclJlYWxbbF0pIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMT05HKWJ1ZmZlclJlYWxbbF0gPj4gKERGUkFDVF9CSVRTIC0gMSkpKTsKICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAobWF4VmFsIT1GTDJGWENPTlNUX0RCTCgwLmYpKSB7Ci0KLQorICAgIGlmIChtYXhWYWwgIT0gRkwyRlhDT05TVF9EQkwoMC5mKSkgewogICAgICAgLyogSWYgdGhlIGFjY3UgZG9lcyBub3QgcHJvdmlkZSBlbm91Z2ggb3ZlcmZsb3cgYml0cywgd2UgY2Fubm90CiAgICAgICAgICBzaGlmdCB0aGUgc2FtcGxlcyB1cCB0byB0aGUgbGltaXQuCiAgICAgICAgICBJbnN0ZWFkLCBrZWVwIHVwIHRvIDMgZnJlZSBiaXRzIGluIGVhY2ggc2FtcGxlLCBpLmUuIHVwIHRvCiAgICAgICAgICA2IGJpdHMgYWZ0ZXIgY2FsY3VsYXRpb24gb2Ygc3F1YXJlLgogICAgICAgICAgUGxlYXNlIG5vdGUgdGhlIGNvbW1lbnQgb24gc2F0dXJhdGVkIGFyaXRobWV0aWMgYWJvdmUhCiAgICAgICAqLwotICAgICAgRklYUF9EQkwgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgcHJlU2hpZnQgPSBDbnRMZWFkaW5nWmVyb3MobWF4VmFsKS0xOworICAgICAgRklYUF9EQkwgYWNjdTsKKyAgICAgIHByZVNoaWZ0ID0gQ250TGVhZGluZ1plcm9zKG1heFZhbCkgLSAxOwogICAgICAgcHJlU2hpZnQgLT0gU0hJRlRfQkVGT1JFX1NRVUFSRTsKIAotICAgICAgaWYgKHByZVNoaWZ0Pj0wKSB7Ci0gICAgICAgIGlmIChhbmFseXNCdWZmZXJJbWFnIT1OVUxMKSB7Ci0gICAgICAgICAgZm9yIChsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7CisgICAgICAvKiBMaW1pdCBwcmVTaGlmdCB0byBhIG1heGltdW0gdmFsdWUgdG8gcHJldmVudCBhY2N1bXVsYXRvciBvdmVyZmxvdyBpbgorICAgICAgICAgZXhjZXB0aW9uYWwgc2l0dWF0aW9ucyB3aGVyZSB0aGUgc2lnbmFsIGluIHRoZSBhbmFseXNpcy1idWZmZXIgaXMgdmVyeQorICAgICAgICAgc21hbGwgKHNtYWxsIG1heFZhbCkuCisgICAgICAqLworICAgICAgcHJlU2hpZnQgPSBmTWluKHByZVNoaWZ0LCAoU0NIQVIpMjUpOworCisgICAgICBhY2N1ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICBpZiAocHJlU2hpZnQgPj0gMCkgeworICAgICAgICBpbnQgbDsKKyAgICAgICAgaWYgKGFuYWx5c0J1ZmZlckltYWcgIT0gTlVMTCkgeworICAgICAgICAgIGZvciAobCA9IHN0YXJ0X3BvczsgbCA8IG5leHRfcG9zOyBsKyspIHsKICAgICAgICAgICAgIEZJWFBfREJMIHRlbXAxID0gYnVmZmVyUmVhbFtsXSA8PCAoaW50KXByZVNoaWZ0OwogICAgICAgICAgICAgRklYUF9EQkwgdGVtcDIgPSBidWZmZXJJbWFnW2xdIDw8IChpbnQpcHJlU2hpZnQ7CiAgICAgICAgICAgICBhY2N1ID0gZlBvdzJBZGREaXYyKGFjY3UsIHRlbXAxKTsKICAgICAgICAgICAgIGFjY3UgPSBmUG93MkFkZERpdjIoYWNjdSwgdGVtcDIpOwogICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGw9c3RhcnRfcG9zOyBsPG5leHRfcG9zOyBsKyspIHsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKGwgPSBzdGFydF9wb3M7IGwgPCBuZXh0X3BvczsgbCsrKSB7CiAgICAgICAgICAgICBGSVhQX0RCTCB0ZW1wID0gYnVmZmVyUmVhbFtsXSA8PCAoaW50KXByZVNoaWZ0OwogICAgICAgICAgICAgYWNjdSA9IGZQb3cyQWRkRGl2MihhY2N1LCB0ZW1wKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgeyAgICAvKiBpZiBuZWdhdGl2ZSBzaGlmdCB2YWx1ZSAqLworICAgICAgfSBlbHNlIHsgLyogaWYgbmVnYXRpdmUgc2hpZnQgdmFsdWUgKi8KKyAgICAgICAgaW50IGw7CiAgICAgICAgIGludCBuZWdwcmVTaGlmdCA9IC1wcmVTaGlmdDsKLSAgICAgICAgaWYgKGFuYWx5c0J1ZmZlckltYWchPU5VTEwpIHsKLSAgICAgICAgICBmb3IgKGw9c3RhcnRfcG9zOyBsPG5leHRfcG9zOyBsKyspIHsKKyAgICAgICAgaWYgKGFuYWx5c0J1ZmZlckltYWcgIT0gTlVMTCkgeworICAgICAgICAgIGZvciAobCA9IHN0YXJ0X3BvczsgbCA8IG5leHRfcG9zOyBsKyspIHsKICAgICAgICAgICAgIEZJWFBfREJMIHRlbXAxID0gYnVmZmVyUmVhbFtsXSA+PiAoaW50KW5lZ3ByZVNoaWZ0OwogICAgICAgICAgICAgRklYUF9EQkwgdGVtcDIgPSBidWZmZXJJbWFnW2xdID4+IChpbnQpbmVncHJlU2hpZnQ7CiAgICAgICAgICAgICBhY2N1ID0gZlBvdzJBZGREaXYyKGFjY3UsIHRlbXAxKTsKICAgICAgICAgICAgIGFjY3UgPSBmUG93MkFkZERpdjIoYWNjdSwgdGVtcDIpOwogICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGw9c3RhcnRfcG9zOyBsPG5leHRfcG9zOyBsKyspIHsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKGwgPSBzdGFydF9wb3M7IGwgPCBuZXh0X3BvczsgbCsrKSB7CiAgICAgICAgICAgICBGSVhQX0RCTCB0ZW1wID0gYnVmZmVyUmVhbFtsXSA+PiAoaW50KW5lZ3ByZVNoaWZ0OwogICAgICAgICAgICAgYWNjdSA9IGZQb3cyQWRkRGl2MihhY2N1LCB0ZW1wKTsKICAgICAgICAgICB9CkBAIC0xNDUxLDEzICsyMDg5LDEyIEBACiAgICAgICAvKiBEaXZpZGUgYnkgd2lkdGggb2YgZW52ZWxvcGUgYW5kIGFwcGx5IGZyYW1lIHNjYWxlOiAqLwogICAgICAgKm5yZ0VzdCsrID0gZk11bHQoc3VtLCBpbnZXaWR0aCk7CiAgICAgICBzaGlmdCArPSAyICogcHJlU2hpZnQ7Ci0gICAgICBpZiAoYW5hbHlzQnVmZmVySW1hZyE9TlVMTCkKKyAgICAgIGlmIChhbmFseXNCdWZmZXJJbWFnICE9IE5VTEwpCiAgICAgICAgICpucmdFc3RfZSsrID0gZnJhbWVFeHAgLSBzaGlmdDsKICAgICAgIGVsc2UKLSAgICAgICAgKm5yZ0VzdF9lKysgPSBmcmFtZUV4cCAtIHNoaWZ0ICsgMTsgIC8qICsxIGR1ZSB0byBtaXNzaW5nIGltYWcuIHBhcnQgKi8KLSAgICB9IC8qIG1heFZhbCE9MCAqLworICAgICAgICAqbnJnRXN0X2UrKyA9IGZyYW1lRXhwIC0gc2hpZnQgKyAxOyAvKiArMSBkdWUgdG8gbWlzc2luZyBpbWFnLiBwYXJ0ICovCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heFZhbCE9MCAqLwogICAgIGVsc2UgewotCiAgICAgICAvKiBQcmV2ZW50IGEgemVyby1tYW50aXNzYS1udW1iZXIgZnJvbSBiZWluZyBtaXNpbnRlcnByZXRlZAogICAgICAgICAgZHVlIHRvIGl0cyBleHBvbmVudC4gKi8KICAgICAgICpucmdFc3QrKyA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwpAQCAtMTQ3Miw0NSArMjEwOSw0MiBAQAogCiAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIGludGVycG9sRnJlcSBpcyBmYWxzZS4KICovCi1zdGF0aWMgdm9pZCBjYWxjTnJnUGVyU2ZiKEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlclJlYWwsICAvKiE8IFJlYWwgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICoqYW5hbHlzQnVmZmVySW1hZywgIC8qITwgSW1hZ2luYXJ5IHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBuU2ZiLCAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBzY2FsZSBmYWN0b3IgYmFuZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgKmZyZXFCYW5kVGFibGUsICAgICAgIC8qITwgRmlyc3QgU3ViYmFuZCBmb3IgZWFjaCBTZmIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIHN0YXJ0X3BvcywgICAgICAgICAgIC8qITwgRmlyc3QgUU1GLXNsb3Qgb2YgY3VycmVudCBlbnZlbG9wZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbmV4dF9wb3MsICAgICAgICAgICAgLyohPCBMYXN0IFFNRi1zbG90IG9mIGN1cnJlbnQgZW52ZWxvcGUgKyAxICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICBpbnB1dF9lLCAgICAgICAgICAgICAvKiE8IENvbW1vbiBleHBvbmVudCBmb3IgYWxsIGlucHV0IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm5yZ0VzdCwgICAgICAgICAgICAgIC8qITwgcmVzdWx0aW5nIEVuZXJneSAoMC4uMSkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKm5yZ0VzdF9lICkgICAgICAgICAgIC8qITwgRXhwb25lbnQgb2YgcmVzdWx0aW5nIEVuZXJneSAqLworc3RhdGljIHZvaWQgY2FsY05yZ1BlclNmYigKKyAgICBGSVhQX0RCTCAqKmFuYWx5c0J1ZmZlclJlYWwsIC8qITwgUmVhbCBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyAqLworICAgIEZJWFBfREJMICoqYW5hbHlzQnVmZmVySW1hZywgLyohPCBJbWFnaW5hcnkgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgKi8KKyAgICBpbnQgblNmYiwgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHNjYWxlIGZhY3RvciBiYW5kcyAqLworICAgIFVDSEFSICpmcmVxQmFuZFRhYmxlLCAgICAgICAgLyohPCBGaXJzdCBTdWJiYW5kIGZvciBlYWNoIFNmYiAqLworICAgIGludCBzdGFydF9wb3MsICAgICAgICAgICAgICAgLyohPCBGaXJzdCBRTUYtc2xvdCBvZiBjdXJyZW50IGVudmVsb3BlICovCisgICAgaW50IG5leHRfcG9zLCAgICAgICAgICAgICAgICAvKiE8IExhc3QgUU1GLXNsb3Qgb2YgY3VycmVudCBlbnZlbG9wZSArIDEgKi8KKyAgICBTQ0hBUiBpbnB1dF9lLCAgICAgICAgICAgICAgIC8qITwgQ29tbW9uIGV4cG9uZW50IGZvciBhbGwgaW5wdXQgc2FtcGxlcyAqLworICAgIEZJWFBfREJMICpucmdFc3QsICAgICAgICAgICAgLyohPCByZXN1bHRpbmcgRW5lcmd5ICgwLi4xKSAqLworICAgIFNDSEFSICpucmdFc3RfZSkgICAgICAgICAgICAgLyohPCBFeHBvbmVudCBvZiByZXN1bHRpbmcgRW5lcmd5ICovCiB7Ci0gIEZJWFBfU0dMICBpbnZXaWR0aDsKLSAgRklYUF9EQkwgIHRlbXA7Ci0gIFNDSEFSICBwcmVTaGlmdDsKLSAgU0NIQVIgICBzaGlmdCwgc3VtX2U7Ci0gIEZJWFBfREJMICBzdW07CisgIEZJWFBfU0dMIGludldpZHRoOworICBGSVhQX0RCTCB0ZW1wOworICBTQ0hBUiBwcmVTaGlmdDsKKyAgU0NIQVIgc2hpZnQsIHN1bV9lOworICBGSVhQX0RCTCBzdW07CiAKLSAgaW50IGosayxsLGxpLHVpOworICBpbnQgaiwgaywgbCwgbGksIHVpOwogICBGSVhQX0RCTCBzdW1BbGwsIHN1bUxpbmU7IC8qIFNpbmdsZSBwcmVjaXNpb24gd291bGQgYmUgc3VmZmljaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IG92ZXJmbG93IGJpdHMgYXJlIHJlcXVpcmVkIGZvciBhY2N1bXVsYXRpb24gKi8KIAogICAvKiBEaXZpZGUgYnkgd2lkdGggb2YgZW52ZWxvcGUgbGF0ZXI6ICovCiAgIGludldpZHRoID0gRlhfREJMMkZYX1NHTChHZXRJbnZJbnQobmV4dF9wb3MgLSBzdGFydF9wb3MpKTsKLSAgLyogVGhlIGNvbW1vbiBleHBvbmVudCBuZWVkcyB0byBiZSBkb3VibGVkIGJlY2F1c2UgYWxsIG1hbnRpc3NhcyBhcmUgc3F1YXJlZDogKi8KKyAgLyogVGhlIGNvbW1vbiBleHBvbmVudCBuZWVkcyB0byBiZSBkb3VibGVkIGJlY2F1c2UgYWxsIG1hbnRpc3NhcyBhcmUgc3F1YXJlZDoKKyAgICovCiAgIGlucHV0X2UgPSBpbnB1dF9lIDw8IDE7CiAKLSAgZm9yKGo9MDsgajxuU2ZiOyBqKyspIHsKKyAgZm9yIChqID0gMDsgaiA8IG5TZmI7IGorKykgewogICAgIGxpID0gZnJlcUJhbmRUYWJsZVtqXTsKLSAgICB1aSA9IGZyZXFCYW5kVGFibGVbaisxXTsKKyAgICB1aSA9IGZyZXFCYW5kVGFibGVbaiArIDFdOwogCi0gICAgRklYUF9EQkwgbWF4VmFsID0gbWF4U3ViYmFuZFNhbXBsZSggYW5hbHlzQnVmZmVyUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmFseXNCdWZmZXJJbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3BvcyApOworICAgIEZJWFBfREJMIG1heFZhbCA9IG1heFN1YmJhbmRTYW1wbGUoYW5hbHlzQnVmZmVyUmVhbCwgYW5hbHlzQnVmZmVySW1hZywgbGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aSwgc3RhcnRfcG9zLCBuZXh0X3Bvcyk7CiAKLSAgICBpZiAobWF4VmFsIT1GTDJGWENPTlNUX0RCTCgwLmYpKSB7Ci0KLSAgICAgIHByZVNoaWZ0ID0gQ250TGVhZGluZ1plcm9zKG1heFZhbCktMTsKKyAgICBpZiAobWF4VmFsICE9IEZMMkZYQ09OU1RfREJMKDAuZikpIHsKKyAgICAgIHByZVNoaWZ0ID0gQ250TGVhZGluZ1plcm9zKG1heFZhbCkgLSAxOwogCiAgICAgICAvKiBJZiB0aGUgYWNjdSBkb2VzIG5vdCBwcm92aWRlIGVub3VnaCBvdmVyZmxvdyBiaXRzLCB3ZSBjYW5ub3QKICAgICAgICAgIHNoaWZ0IHRoZSBzYW1wbGVzIHVwIHRvIHRoZSBsaW1pdC4KQEAgLTE1MjIsMzggKzIxNTYsMzQgQEAKIAogICAgICAgc3VtQWxsID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKLQotICAgICAgZm9yIChrPWxpOyBrPHVpOyBrKyspIHsKLQorICAgICAgZm9yIChrID0gbGk7IGsgPCB1aTsgaysrKSB7CiAgICAgICAgIHN1bUxpbmUgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKIAotICAgICAgICBpZiAoYW5hbHlzQnVmZmVySW1hZyE9TlVMTCkgewotICAgICAgICAgIGlmIChwcmVTaGlmdD49MCkgewotICAgICAgICAgICAgZm9yIChsPXN0YXJ0X3BvczsgbDxuZXh0X3BvczsgbCsrKSB7Ci0gICAgICAgICAgICAgIHRlbXAgICA9IGFuYWx5c0J1ZmZlclJlYWxbbF1ba10gPDwgKGludClwcmVTaGlmdDsKKyAgICAgICAgaWYgKGFuYWx5c0J1ZmZlckltYWcgIT0gTlVMTCkgeworICAgICAgICAgIGlmIChwcmVTaGlmdCA+PSAwKSB7CisgICAgICAgICAgICBmb3IgKGwgPSBzdGFydF9wb3M7IGwgPCBuZXh0X3BvczsgbCsrKSB7CisgICAgICAgICAgICAgIHRlbXAgPSBhbmFseXNCdWZmZXJSZWFsW2xdW2tdIDw8IChpbnQpcHJlU2hpZnQ7CiAgICAgICAgICAgICAgIHN1bUxpbmUgKz0gZlBvdzJEaXYyKHRlbXApOwotICAgICAgICAgICAgICB0ZW1wICAgPSBhbmFseXNCdWZmZXJJbWFnW2xdW2tdIDw8IChpbnQpcHJlU2hpZnQ7CisgICAgICAgICAgICAgIHRlbXAgPSBhbmFseXNCdWZmZXJJbWFnW2xdW2tdIDw8IChpbnQpcHJlU2hpZnQ7CiAgICAgICAgICAgICAgIHN1bUxpbmUgKz0gZlBvdzJEaXYyKHRlbXApOwotCiAgICAgICAgICAgICB9CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAobD1zdGFydF9wb3M7IGw8bmV4dF9wb3M7IGwrKykgewotICAgICAgICAgICAgICB0ZW1wICAgPSBhbmFseXNCdWZmZXJSZWFsW2xdW2tdID4+IC0oaW50KXByZVNoaWZ0OworICAgICAgICAgICAgZm9yIChsID0gc3RhcnRfcG9zOyBsIDwgbmV4dF9wb3M7IGwrKykgeworICAgICAgICAgICAgICB0ZW1wID0gYW5hbHlzQnVmZmVyUmVhbFtsXVtrXSA+PiAtKGludClwcmVTaGlmdDsKICAgICAgICAgICAgICAgc3VtTGluZSArPSBmUG93MkRpdjIodGVtcCk7Ci0gICAgICAgICAgICAgIHRlbXAgICA9IGFuYWx5c0J1ZmZlckltYWdbbF1ba10gPj4gLShpbnQpcHJlU2hpZnQ7CisgICAgICAgICAgICAgIHRlbXAgPSBhbmFseXNCdWZmZXJJbWFnW2xdW2tdID4+IC0oaW50KXByZVNoaWZ0OwogICAgICAgICAgICAgICBzdW1MaW5lICs9IGZQb3cyRGl2Mih0ZW1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHByZVNoaWZ0Pj0wKSB7Ci0gICAgICAgICAgICBmb3IgKGw9c3RhcnRfcG9zOyBsPG5leHRfcG9zOyBsKyspIHsKLSAgICAgICAgICAgICAgdGVtcCAgID0gYW5hbHlzQnVmZmVyUmVhbFtsXVtrXSA8PCAoaW50KXByZVNoaWZ0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChwcmVTaGlmdCA+PSAwKSB7CisgICAgICAgICAgICBmb3IgKGwgPSBzdGFydF9wb3M7IGwgPCBuZXh0X3BvczsgbCsrKSB7CisgICAgICAgICAgICAgIHRlbXAgPSBhbmFseXNCdWZmZXJSZWFsW2xdW2tdIDw8IChpbnQpcHJlU2hpZnQ7CiAgICAgICAgICAgICAgIHN1bUxpbmUgKz0gZlBvdzJEaXYyKHRlbXApOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGw9c3RhcnRfcG9zOyBsPG5leHRfcG9zOyBsKyspIHsKLSAgICAgICAgICAgICAgdGVtcCAgID0gYW5hbHlzQnVmZmVyUmVhbFtsXVtrXSA+PiAtKGludClwcmVTaGlmdDsKKyAgICAgICAgICAgIGZvciAobCA9IHN0YXJ0X3BvczsgbCA8IG5leHRfcG9zOyBsKyspIHsKKyAgICAgICAgICAgICAgdGVtcCA9IGFuYWx5c0J1ZmZlclJlYWxbbF1ba10gPj4gLShpbnQpcHJlU2hpZnQ7CiAgICAgICAgICAgICAgIHN1bUxpbmUgKz0gZlBvdzJEaXYyKHRlbXApOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KQEAgLTE1NjEsOCArMjE5MSw4IEBACiAKICAgICAgICAgLyogVGhlIG51bWJlciBvZiBRTUYtY2hhbm5lbHMgcGVyIFNCUiBiYW5kcyBtYXkgYmUgdXAgdG8gMTUuCiAgICAgICAgICAgIFNoaWZ0IHJpZ2h0IHRvIGF2b2lkIG92ZXJmbG93cyBpbiBzdW0gb3ZlciBhbGwgY2hhbm5lbHMuICovCi0gICAgICAgIHN1bUxpbmUgPSBzdW1MaW5lID4+ICg0LTEpOwotICAgICAgICBzdW1BbGwgICs9IHN1bUxpbmU7CisgICAgICAgIHN1bUxpbmUgPSBzdW1MaW5lID4+ICg0IC0gMSk7CisgICAgICAgIHN1bUFsbCArPSBzdW1MaW5lOwogICAgICAgfQogCiAgICAgICAvKiBDb252ZXJ0IGRvdWJsZSBwcmVjaXNpb24gdG8gTWFudGlzc2EvRXhwb25lbnQ6ICovCkBAIC0xNTcwLDYyICsyMjAwLDY2IEBACiAgICAgICBzdW0gPSBzdW1BbGwgPDwgKGludClzaGlmdDsKIAogICAgICAgLyogRGl2aWRlIGJ5IHdpZHRoIG9mIGVudmVsb3BlOiAqLwotICAgICAgc3VtID0gZk11bHQoc3VtLGludldpZHRoKTsKKyAgICAgIHN1bSA9IGZNdWx0KHN1bSwgaW52V2lkdGgpOwogCiAgICAgICAvKiBEaXZpZGUgYnkgd2lkdGggb2YgU2ZiOiAqLwotICAgICAgc3VtID0gZk11bHQoc3VtLCBGWF9EQkwyRlhfU0dMKEdldEludkludCh1aS1saSkpKTsKKyAgICAgIHN1bSA9IGZNdWx0KHN1bSwgRlhfREJMMkZYX1NHTChHZXRJbnZJbnQodWkgLSBsaSkpKTsKIAogICAgICAgLyogU2V0IGFsbCBTdWJiYW5kIGVuZXJnaWVzIGluIHRoZSBTZmIgdG8gdGhlIGF2ZXJhZ2UgZW5lcmd5OiAqLwotICAgICAgaWYgKGFuYWx5c0J1ZmZlckltYWchPU5VTEwpCi0gICAgICAgIHN1bV9lID0gaW5wdXRfZSArIDQgLSBzaGlmdDsgIC8qIC00IHRvIGNvbXBlbnNhdGUgcmlnaHQtc2hpZnQgKi8KKyAgICAgIGlmIChhbmFseXNCdWZmZXJJbWFnICE9IE5VTEwpCisgICAgICAgIHN1bV9lID0gaW5wdXRfZSArIDQgLSBzaGlmdDsgLyogLTQgdG8gY29tcGVuc2F0ZSByaWdodC1zaGlmdCAqLwogICAgICAgZWxzZQotICAgICAgICBzdW1fZSA9IGlucHV0X2UgKyA0ICsgMSAtIHNoaWZ0OyAgLyogLTQgdG8gY29tcGVuc2F0ZSByaWdodC1zaGlmdDsgKzEgZHVlIHRvIG1pc3NpbmcgaW1hZy4gcGFydCAqLworICAgICAgICBzdW1fZSA9IGlucHV0X2UgKyA0ICsgMSAtCisgICAgICAgICAgICAgICAgc2hpZnQ7IC8qIC00IHRvIGNvbXBlbnNhdGUgcmlnaHQtc2hpZnQ7ICsxIGR1ZSB0byBtaXNzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWcuIHBhcnQgKi8KIAogICAgICAgc3VtX2UgLT0gMiAqIHByZVNoaWZ0OwogICAgIH0gLyogbWF4VmFsIT0wICovCiAgICAgZWxzZSB7Ci0KICAgICAgIC8qIFByZXZlbnQgYSB6ZXJvLW1hbnRpc3NhLW51bWJlciBmcm9tIGJlaW5nIG1pc2ludGVycHJldGVkCiAgICAgICAgICBkdWUgdG8gaXRzIGV4cG9uZW50LiAqLwogICAgICAgc3VtID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICBzdW1fZSA9IDA7CiAgICAgfQogCi0gICAgZm9yIChrPWxpOyBrPHVpOyBrKyspCi0gICAgewotICAgICAgKm5yZ0VzdCsrICAgPSBzdW07CisgICAgZm9yIChrID0gbGk7IGsgPCB1aTsgaysrKSB7CisgICAgICAqbnJnRXN0KysgPSBzdW07CiAgICAgICAqbnJnRXN0X2UrKyA9IHN1bV9lOwogICAgIH0KICAgfQogfQogCi0KIC8qIQogICBcYnJpZWYgIENhbGN1bGF0ZSBnYWluLCBub2lzZSwgYW5kIGFkZGl0aW9uYWwgc2luZSBsZXZlbCBmb3Igb25lIHN1YmJhbmQuCiAKICAgVGhlIHJlc3VsdGluZyBlbmVyZ3kgZ2FpbiBpcyBnaXZlbiBieSBtYW50aXNzYSBhbmQgZXhwb25lbnQuCiAqLwotc3RhdGljIHZvaWQgY2FsY1N1YmJhbmRHYWluKEZJWFBfREJMICBucmdSZWYsICAgICAgICAgICAgLyohPCBSZWZlcmVuY2UgRW5lcmd5IGFjY29yZGluZyB0byBlbnZlbG9wZSBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgIG5yZ1JlZl9lLCAgICAgICAgICAvKiE8IFJlZmVyZW5jZSBFbmVyZ3kgYWNjb3JkaW5nIHRvIGVudmVsb3BlIGRhdGEgKGV4cG9uZW50KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOVl9DQUxDX05SR1MqIG5yZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgIHRtcE5vaXNlLCAgICAgICAgICAvKiE8IFJlbGF0aXZlIG5vaXNlIGxldmVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgIHRtcE5vaXNlX2UsICAgICAgICAvKiE8IFJlbGF0aXZlIG5vaXNlIGxldmVsIChleHBvbmVudCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgc2luZVByZXNlbnRGbGFnLCAgIC8qITwgSW5kaWNhdGVzIGlmIHNpbmUgaXMgcHJlc2VudCBvbiBiYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgIHNpbmVNYXBwZWQsICAgICAgICAvKiE8IEluZGljYXRlcyBpZiBzaW5lIG11c3QgYmUgYWRkZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9Ob2lzZUZsYWcpICAgICAgIC8qITwgRmxhZyB0byBzdXBwcmVzcyBub2lzZSBhZGRpdGlvbiAqLworc3RhdGljIHZvaWQgY2FsY1N1YmJhbmRHYWluKAorICAgIEZJWFBfREJMIG5yZ1JlZiwgLyohPCBSZWZlcmVuY2UgRW5lcmd5IGFjY29yZGluZyB0byBlbnZlbG9wZSBkYXRhICovCisgICAgU0NIQVIKKyAgICAgICAgbnJnUmVmX2UsIC8qITwgUmVmZXJlbmNlIEVuZXJneSBhY2NvcmRpbmcgdG8gZW52ZWxvcGUgZGF0YSAoZXhwb25lbnQpICovCisgICAgRU5WX0NBTENfTlJHUyAqbnJncywgaW50IGksIEZJWFBfREJMIHRtcE5vaXNlLCAvKiE8IFJlbGF0aXZlIG5vaXNlIGxldmVsICovCisgICAgU0NIQVIgdG1wTm9pc2VfZSwgICAgICAvKiE8IFJlbGF0aXZlIG5vaXNlIGxldmVsIChleHBvbmVudCkgKi8KKyAgICBVQ0hBUiBzaW5lUHJlc2VudEZsYWcsIC8qITwgSW5kaWNhdGVzIGlmIHNpbmUgaXMgcHJlc2VudCBvbiBiYW5kICovCisgICAgVUNIQVIgc2luZU1hcHBlZCwgICAgICAvKiE8IEluZGljYXRlcyBpZiBzaW5lIG11c3QgYmUgYWRkZWQgKi8KKyAgICBpbnQgbm9Ob2lzZUZsYWcpICAgICAgIC8qITwgRmxhZyB0byBzdXBwcmVzcyBub2lzZSBhZGRpdGlvbiAqLwogewotICBGSVhQX0RCTCAgbnJnRXN0ICAgICAgICAgID0gbnJncy0+bnJnRXN0W2ldOyAgICAgICAgICAgIC8qITwgRW5lcmd5IGluIHRyYW5zcG9zZWQgc2lnbmFsICovCi0gIFNDSEFSICAgICBucmdFc3RfZSAgICAgICAgPSBucmdzLT5ucmdFc3RfZVtpXTsgICAgICAgICAgLyohPCBFbmVyZ3kgaW4gdHJhbnNwb3NlZCBzaWduYWwgKGV4cG9uZW50KSAqLwotICBGSVhQX0RCTCAqcHRyTnJnR2FpbiAgICAgID0gJm5yZ3MtPm5yZ0dhaW5baV07ICAgICAgICAgIC8qITwgUmVzdWx0aW5nIGVuZXJneSBnYWluICovCi0gIFNDSEFSICAgICpwdHJOcmdHYWluX2UgICAgPSAmbnJncy0+bnJnR2Fpbl9lW2ldOyAgICAgICAgLyohPCBSZXN1bHRpbmcgZW5lcmd5IGdhaW4gKGV4cG9uZW50KSAqLwotICBGSVhQX0RCTCAqcHRyTm9pc2VMZXZlbCAgID0gJm5yZ3MtPm5vaXNlTGV2ZWxbaV07ICAgICAgIC8qITwgUmVzdWx0aW5nIGFic29sdXRlIG5vaXNlIGVuZXJneSAqLwotICBTQ0hBUiAgICAqcHRyTm9pc2VMZXZlbF9lID0gJm5yZ3MtPm5vaXNlTGV2ZWxfZVtpXTsgICAgIC8qITwgUmVzdWx0aW5nIGFic29sdXRlIG5vaXNlIGVuZXJneSAoZXhwb25lbnQpICovCi0gIEZJWFBfREJMICpwdHJOcmdTaW5lICAgICAgPSAmbnJncy0+bnJnU2luZVtpXTsgICAgICAgICAgLyohPCBBZGRpdGlvbmFsIHNpbmUgZW5lcmd5ICovCi0gIFNDSEFSICAgICpwdHJOcmdTaW5lX2UgICAgPSAmbnJncy0+bnJnU2luZV9lW2ldOyAgICAgICAgLyohPCBBZGRpdGlvbmFsIHNpbmUgZW5lcmd5IChleHBvbmVudCkgKi8KKyAgRklYUF9EQkwgbnJnRXN0ID0gbnJncy0+bnJnRXN0W2ldOyAvKiE8IEVuZXJneSBpbiB0cmFuc3Bvc2VkIHNpZ25hbCAqLworICBTQ0hBUiBucmdFc3RfZSA9CisgICAgICBucmdzLT5ucmdFc3RfZVtpXTsgLyohPCBFbmVyZ3kgaW4gdHJhbnNwb3NlZCBzaWduYWwgKGV4cG9uZW50KSAqLworICBGSVhQX0RCTCAqcHRyTnJnR2FpbiA9ICZucmdzLT5ucmdHYWluW2ldOyAvKiE8IFJlc3VsdGluZyBlbmVyZ3kgZ2FpbiAqLworICBTQ0hBUiAqcHRyTnJnR2Fpbl9lID0KKyAgICAgICZucmdzLT5ucmdHYWluX2VbaV07IC8qITwgUmVzdWx0aW5nIGVuZXJneSBnYWluIChleHBvbmVudCkgKi8KKyAgRklYUF9EQkwgKnB0ck5vaXNlTGV2ZWwgPQorICAgICAgJm5yZ3MtPm5vaXNlTGV2ZWxbaV07IC8qITwgUmVzdWx0aW5nIGFic29sdXRlIG5vaXNlIGVuZXJneSAqLworICBTQ0hBUiAqcHRyTm9pc2VMZXZlbF9lID0KKyAgICAgICZucmdzLT5ub2lzZUxldmVsX2VbaV07IC8qITwgUmVzdWx0aW5nIGFic29sdXRlIG5vaXNlIGVuZXJneSAoZXhwb25lbnQpICovCisgIEZJWFBfREJMICpwdHJOcmdTaW5lID0gJm5yZ3MtPm5yZ1NpbmVbaV07IC8qITwgQWRkaXRpb25hbCBzaW5lIGVuZXJneSAqLworICBTQ0hBUiAqcHRyTnJnU2luZV9lID0KKyAgICAgICZucmdzLT5ucmdTaW5lX2VbaV07IC8qITwgQWRkaXRpb25hbCBzaW5lIGVuZXJneSAoZXhwb25lbnQpICovCiAKICAgRklYUF9EQkwgYSwgYiwgYzsKLSAgU0NIQVIgICAgYV9lLCBiX2UsIGNfZTsKKyAgU0NIQVIgYV9lLCBiX2UsIGNfZTsKIAogICAvKgogICAgICBUaGlzIGFkZGl0aW9uIG9mIDEgcHJldmVudHMgZGl2aXNpb25zIGJ5IHplcm8gaW4gdGhlIHJlZmVyZW5jZSBjb2RlLgpAQCAtMTYzMyw3NCArMjI2Nyw2NCBAQAogICAgICB2ZXJ5IGhpZ2ggd2hpY2ggY291bGQgY2F1c2Ugc29tZSB0cm91YmxlIGR1ZSB0byB0aGUgc21vb3RoaW5nLgogICAqLwogICBiX2UgPSAoaW50KShucmdFc3RfZSAtIDEpOwotICBpZiAoYl9lPj0wKSB7Ci0gICAgbnJnRXN0ID0gKEZMMkZYQ09OU1RfREJMKDAuNWYpID4+IChJTlQpZml4TWluKGJfZSsxLERGUkFDVF9CSVRTLTEpKSArIChucmdFc3QgPj4gMSk7Ci0gICAgbnJnRXN0X2UgKz0gMTsgIC8qIHNoaWZ0IGJ5IDEgYml0IHRvIGF2b2lkIG92ZXJmbG93ICovCisgIGlmIChiX2UgPj0gMCkgeworICAgIG5yZ0VzdCA9IChGTDJGWENPTlNUX0RCTCgwLjVmKSA+PiAoSU5UKWZpeE1pbihiX2UgKyAxLCBERlJBQ1RfQklUUyAtIDEpKSArCisgICAgICAgICAgICAgKG5yZ0VzdCA+PiAxKTsKKyAgICBucmdFc3RfZSArPSAxOyAvKiBzaGlmdCBieSAxIGJpdCB0byBhdm9pZCBvdmVyZmxvdyAqLwogCiAgIH0gZWxzZSB7Ci0gICAgbnJnRXN0ID0gKG5yZ0VzdCA+PiAoSU5UKShmaXhNaW4oLWJfZSsxLERGUkFDVF9CSVRTLTEpKSkgKyAoRkwyRlhDT05TVF9EQkwoMC41ZikgPj4gMSk7Ci0gICAgbnJnRXN0X2UgPSAyOyAgLyogc2hpZnQgYnkgMSBiaXQgdG8gYXZvaWQgb3ZlcmZsb3cgKi8KKyAgICBucmdFc3QgPSAobnJnRXN0ID4+IChJTlQpKGZpeE1pbigtYl9lICsgMSwgREZSQUNUX0JJVFMgLSAxKSkpICsKKyAgICAgICAgICAgICAoRkwyRlhDT05TVF9EQkwoMC41ZikgPj4gMSk7CisgICAgbnJnRXN0X2UgPSAyOyAvKiBzaGlmdCBieSAxIGJpdCB0byBhdm9pZCBvdmVyZmxvdyAqLwogICB9CiAKICAgLyogIEEgPSBOcmdSZWYgKiBUbXBOb2lzZSAqLwotICBhID0gZk11bHQobnJnUmVmLHRtcE5vaXNlKTsKKyAgYSA9IGZNdWx0KG5yZ1JlZiwgdG1wTm9pc2UpOwogICBhX2UgPSBucmdSZWZfZSArIHRtcE5vaXNlX2U7CiAKICAgLyogIEIgPSAxICsgVG1wTm9pc2UgKi8KICAgYl9lID0gKGludCkodG1wTm9pc2VfZSAtIDEpOwotICBpZiAoYl9lPj0wKSB7Ci0gICAgYiA9IChGTDJGWENPTlNUX0RCTCgwLjVmKSA+PiAoSU5UKWZpeE1pbihiX2UrMSxERlJBQ1RfQklUUy0xKSkgKyAodG1wTm9pc2UgPj4gMSk7Ci0gICAgYl9lID0gdG1wTm9pc2VfZSArIDE7ICAvKiBzaGlmdCBieSAxIGJpdCB0byBhdm9pZCBvdmVyZmxvdyAqLworICBpZiAoYl9lID49IDApIHsKKyAgICBiID0gKEZMMkZYQ09OU1RfREJMKDAuNWYpID4+IChJTlQpZml4TWluKGJfZSArIDEsIERGUkFDVF9CSVRTIC0gMSkpICsKKyAgICAgICAgKHRtcE5vaXNlID4+IDEpOworICAgIGJfZSA9IHRtcE5vaXNlX2UgKyAxOyAvKiBzaGlmdCBieSAxIGJpdCB0byBhdm9pZCBvdmVyZmxvdyAqLwogICB9IGVsc2UgewotICAgIGIgPSAodG1wTm9pc2UgPj4gKElOVCkoZml4TWluKC1iX2UrMSxERlJBQ1RfQklUUy0xKSkpICsgKEZMMkZYQ09OU1RfREJMKDAuNWYpID4+IDEpOwotICAgIGJfZSA9IDI7ICAvKiBzaGlmdCBieSAxIGJpdCB0byBhdm9pZCBvdmVyZmxvdyAqLworICAgIGIgPSAodG1wTm9pc2UgPj4gKElOVCkoZml4TWluKC1iX2UgKyAxLCBERlJBQ1RfQklUUyAtIDEpKSkgKworICAgICAgICAoRkwyRlhDT05TVF9EQkwoMC41ZikgPj4gMSk7CisgICAgYl9lID0gMjsgLyogc2hpZnQgYnkgMSBiaXQgdG8gYXZvaWQgb3ZlcmZsb3cgKi8KICAgfQogCiAgIC8qICBub2lzZUxldmVsID0gQSAvIEIgPSAoTnJnUmVmICogVG1wTm9pc2UpIC8gKDEgKyBUbXBOb2lzZSkgKi8KLSAgRkRLX2RpdmlkZV9NYW50RXhwKCBhLCAgYV9lLAotICAgICAgICAgICAgICAgICAgICAgIGIsICBiX2UsCi0gICAgICAgICAgICAgICAgICAgICAgcHRyTm9pc2VMZXZlbCwgcHRyTm9pc2VMZXZlbF9lKTsKKyAgRkRLX2RpdmlkZV9NYW50RXhwKGEsIGFfZSwgYiwgYl9lLCBwdHJOb2lzZUxldmVsLCBwdHJOb2lzZUxldmVsX2UpOwogCiAgIGlmIChzaW5lUHJlc2VudEZsYWcpIHsKLQogICAgIC8qICBDID0gKDEgKyBUbXBOb2lzZSkgKiBOcmdFc3QgKi8KLSAgICBjID0gZk11bHQoYixucmdFc3QpOworICAgIGMgPSBmTXVsdChiLCBucmdFc3QpOwogICAgIGNfZSA9IGJfZSArIG5yZ0VzdF9lOwogCiAgICAgLyogIGdhaW4gPSBBIC8gQyA9IChOcmdSZWYgKiBUbXBOb2lzZSkgLyAoMSArIFRtcE5vaXNlKSAqIE5yZ0VzdCAqLwotICAgIEZES19kaXZpZGVfTWFudEV4cCggYSwgIGFfZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGMsICBjX2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBwdHJOcmdHYWluLCBwdHJOcmdHYWluX2UpOworICAgIEZES19kaXZpZGVfTWFudEV4cChhLCBhX2UsIGMsIGNfZSwgcHRyTnJnR2FpbiwgcHRyTnJnR2Fpbl9lKTsKIAogICAgIGlmIChzaW5lTWFwcGVkKSB7Ci0KICAgICAgIC8qICBzaW5lTGV2ZWwgPSBucmdSZWYvICgxICsgVG1wTm9pc2UpICovCi0gICAgICBGREtfZGl2aWRlX01hbnRFeHAoIG5yZ1JlZiwgIG5yZ1JlZl9lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBiLCAgYl9lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJOcmdTaW5lLCBwdHJOcmdTaW5lX2UpOworICAgICAgRkRLX2RpdmlkZV9NYW50RXhwKG5yZ1JlZiwgbnJnUmVmX2UsIGIsIGJfZSwgcHRyTnJnU2luZSwgcHRyTnJnU2luZV9lKTsKICAgICB9Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgaWYgKG5vTm9pc2VGbGFnKSB7CiAgICAgICAvKiAgQiA9IE5yZ0VzdCAqLwogICAgICAgYiA9IG5yZ0VzdDsKICAgICAgIGJfZSA9IG5yZ0VzdF9lOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgLyogIEIgPSBOcmdFc3QgKiAoMSArIFRtcE5vaXNlKSAqLwotICAgICAgYiA9IGZNdWx0KGIsbnJnRXN0KTsKKyAgICAgIGIgPSBmTXVsdChiLCBucmdFc3QpOwogICAgICAgYl9lID0gYl9lICsgbnJnRXN0X2U7CiAgICAgfQogCi0KICAgICAvKiAgZ2FpbiA9IG5yZ1JlZiAvIEIgKi8KLSAgICBGREtfZGl2aWRlX01hbnRFeHAoIG5yZ1JlZiwgIG5yZ1JlZl9lLAotICAgICAgICAgICAgICAgICAgICAgICAgYiwgIGJfZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHB0ck5yZ0dhaW4sIHB0ck5yZ0dhaW5fZSk7CisgICAgRkRLX2RpdmlkZV9NYW50RXhwKG5yZ1JlZiwgbnJnUmVmX2UsIGIsIGJfZSwgcHRyTnJnR2FpbiwgcHRyTnJnR2Fpbl9lKTsKICAgfQogfQogCi0KIC8qIQogICBcYnJpZWYgIENhbGN1bGF0ZSAiYXZlcmFnZSBnYWluIiBmb3IgdGhlIHNwZWNpZmllZCBzdWJiYW5kIHJhbmdlLgogCkBAIC0xNzA5LDEyMSArMjMzMywxNDAgQEAKICAgVGhlIHJlc3VsdCBpcyB1c2VkIGFzIGEgcmVsYXRpdmUgbGltaXQgZm9yIGFsbCBnYWlucyB3aXRoaW4gdGhlCiAgIGN1cnJlbnQgImxpbWl0ZXIgYmFuZCIgKGEgY2VydGFpbiBmcmVxdWVuY3kgcmFuZ2UpLgogKi8KLXN0YXRpYyB2b2lkIGNhbGNBdmdHYWluKEVOVl9DQUxDX05SR1MqIG5yZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIGxvd1N1YmJhbmQsICAgIC8qITwgQmVnaW4gb2YgdGhlIGxpbWl0ZXIgYmFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBoaWdoU3ViYmFuZCwgICAvKiE8IEhpZ2ggZW5kIG9mIHRoZSBsaW1pdGVyIGJhbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqcHRyU3VtUmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICpwdHJTdW1SZWZfZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqcHRyQXZnR2FpbiwgIC8qITwgUmVzdWx0aW5nIG92ZXJhbGwgZ2FpbiAobWFudGlzc2EpICovCi0gICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgKnB0ckF2Z0dhaW5fZSkgIC8qITwgUmVzdWx0aW5nIG92ZXJhbGwgZ2FpbiAoZXhwb25lbnQpICovCitzdGF0aWMgdm9pZCBjYWxjQXZnR2FpbigKKyAgICBFTlZfQ0FMQ19OUkdTICpucmdzLCBpbnQgbG93U3ViYmFuZCwgLyohPCBCZWdpbiBvZiB0aGUgbGltaXRlciBiYW5kICovCisgICAgaW50IGhpZ2hTdWJiYW5kLCAgICAgICAgICAgICAgICAgICAgIC8qITwgSGlnaCBlbmQgb2YgdGhlIGxpbWl0ZXIgYmFuZCAqLworICAgIEZJWFBfREJMICpwdHJTdW1SZWYsIFNDSEFSICpwdHJTdW1SZWZfZSwKKyAgICBGSVhQX0RCTCAqcHRyQXZnR2FpbiwgLyohPCBSZXN1bHRpbmcgb3ZlcmFsbCBnYWluIChtYW50aXNzYSkgKi8KKyAgICBTQ0hBUiAqcHRyQXZnR2Fpbl9lKSAgLyohPCBSZXN1bHRpbmcgb3ZlcmFsbCBnYWluIChleHBvbmVudCkgKi8KIHsKLSAgRklYUF9EQkwgICpucmdSZWYgICA9IG5yZ3MtPm5yZ1JlZjsgICAgICAgLyohPCBSZWZlcmVuY2UgRW5lcmd5IGFjY29yZGluZyB0byBlbnZlbG9wZSBkYXRhICovCi0gIFNDSEFSICAgICAqbnJnUmVmX2UgPSBucmdzLT5ucmdSZWZfZTsgICAgIC8qITwgUmVmZXJlbmNlIEVuZXJneSBhY2NvcmRpbmcgdG8gZW52ZWxvcGUgZGF0YSAoZXhwb25lbnQpICovCi0gIEZJWFBfREJMICAqbnJnRXN0ICAgPSBucmdzLT5ucmdFc3Q7ICAgICAgIC8qITwgRW5lcmd5IGluIHRyYW5zcG9zZWQgc2lnbmFsICovCi0gIFNDSEFSICAgICAqbnJnRXN0X2UgPSBucmdzLT5ucmdFc3RfZTsgICAgIC8qITwgRW5lcmd5IGluIHRyYW5zcG9zZWQgc2lnbmFsIChleHBvbmVudCkgKi8KKyAgRklYUF9EQkwgKm5yZ1JlZiA9CisgICAgICBucmdzLT5ucmdSZWY7IC8qITwgUmVmZXJlbmNlIEVuZXJneSBhY2NvcmRpbmcgdG8gZW52ZWxvcGUgZGF0YSAqLworICBTQ0hBUiAqbnJnUmVmX2UgPQorICAgICAgbnJncy0+bnJnUmVmX2U7IC8qITwgUmVmZXJlbmNlIEVuZXJneSBhY2NvcmRpbmcgdG8gZW52ZWxvcGUgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgIChleHBvbmVudCkgKi8KKyAgRklYUF9EQkwgKm5yZ0VzdCA9IG5yZ3MtPm5yZ0VzdDsgLyohPCBFbmVyZ3kgaW4gdHJhbnNwb3NlZCBzaWduYWwgKi8KKyAgU0NIQVIgKm5yZ0VzdF9lID0KKyAgICAgIG5yZ3MtPm5yZ0VzdF9lOyAvKiE8IEVuZXJneSBpbiB0cmFuc3Bvc2VkIHNpZ25hbCAoZXhwb25lbnQpICovCiAKICAgRklYUF9EQkwgc3VtUmVmID0gMTsKICAgRklYUF9EQkwgc3VtRXN0ID0gMTsKLSAgU0NIQVIgICAgc3VtUmVmX2UgPSAtRlJBQ1RfQklUUzsKLSAgU0NIQVIgICAgc3VtRXN0X2UgPSAtRlJBQ1RfQklUUzsKLSAgaW50ICAgICAgazsKKyAgU0NIQVIgc3VtUmVmX2UgPSAtRlJBQ1RfQklUUzsKKyAgU0NIQVIgc3VtRXN0X2UgPSAtRlJBQ1RfQklUUzsKKyAgaW50IGs7CiAKLSAgZm9yIChrPWxvd1N1YmJhbmQ7IGs8aGlnaFN1YmJhbmQ7IGsrKyl7CisgIGZvciAoayA9IGxvd1N1YmJhbmQ7IGsgPCBoaWdoU3ViYmFuZDsgaysrKSB7CiAgICAgLyogQWRkIG5yZ1JlZltrXSB0byBzdW1SZWY6ICovCi0gICAgRkRLX2FkZF9NYW50RXhwKCBzdW1SZWYsIHN1bVJlZl9lLAotICAgICAgICAgICAgICAgICAgICAgbnJnUmVmW2tdLCBucmdSZWZfZVtrXSwKLSAgICAgICAgICAgICAgICAgICAgICZzdW1SZWYsICZzdW1SZWZfZSApOworICAgIEZES19hZGRfTWFudEV4cChzdW1SZWYsIHN1bVJlZl9lLCBucmdSZWZba10sIG5yZ1JlZl9lW2tdLCAmc3VtUmVmLAorICAgICAgICAgICAgICAgICAgICAmc3VtUmVmX2UpOwogCiAgICAgLyogQWRkIG5yZ0VzdFtrXSB0byBzdW1Fc3Q6ICovCi0gICAgRkRLX2FkZF9NYW50RXhwKCBzdW1Fc3QsIHN1bUVzdF9lLAotICAgICAgICAgICAgICAgICAgICAgbnJnRXN0W2tdLCBucmdFc3RfZVtrXSwKLSAgICAgICAgICAgICAgICAgICAgICZzdW1Fc3QsICZzdW1Fc3RfZSApOworICAgIEZES19hZGRfTWFudEV4cChzdW1Fc3QsIHN1bUVzdF9lLCBucmdFc3Rba10sIG5yZ0VzdF9lW2tdLCAmc3VtRXN0LAorICAgICAgICAgICAgICAgICAgICAmc3VtRXN0X2UpOwogICB9CiAKLSAgRkRLX2RpdmlkZV9NYW50RXhwKHN1bVJlZiwgc3VtUmVmX2UsCi0gICAgICAgICAgICAgICAgICAgICBzdW1Fc3QsIHN1bUVzdF9lLAotICAgICAgICAgICAgICAgICAgICAgcHRyQXZnR2FpbiwgcHRyQXZnR2Fpbl9lKTsKKyAgRkRLX2RpdmlkZV9NYW50RXhwKHN1bVJlZiwgc3VtUmVmX2UsIHN1bUVzdCwgc3VtRXN0X2UsIHB0ckF2Z0dhaW4sCisgICAgICAgICAgICAgICAgICAgICBwdHJBdmdHYWluX2UpOwogCiAgICpwdHJTdW1SZWYgPSBzdW1SZWY7CiAgICpwdHJTdW1SZWZfZSA9IHN1bVJlZl9lOwogfQogCiBzdGF0aWMgdm9pZCBhZGp1c3RUaW1lU2xvdF9FbGRHcmlkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnB0clJlYWwsICAgICAgICAvKiE8IFN1YmJhbmQgc2FtcGxlcyB0byBiZSBhZGp1c3RlZCwgcmVhbCBwYXJ0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgKnB0ckhhcm1JbmRleCwgICAvKiE8IEhhcm1vbmljIGluZGV4ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbG93U3ViYmFuZCwgICAgIC8qITwgTG93ZXN0IFFNRi1jaGFubmVsIGluIHRoZSBjdXJyZW50bHkgdXNlZCBTQlIgcmFuZ2UuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9TdWJiYW5kcywgICAgIC8qITwgTnVtYmVyIG9mIFFNRiBzdWJiYW5kcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIHNjYWxlX2NoYW5nZSwgICAvKiE8IE51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IGFkanVzdGVkIHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBub05vaXNlRmxhZywgICAgLyohPCBGbGFnIHRvIHN1cHByZXNzIG5vaXNlIGFkZGl0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAqcHRyUGhhc2VJbmRleCwgIC8qITwgU3RhcnQgaW5kZXggdG8gcmFuZG9tIG51bWJlciBhcnJheSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIHNjYWxlX2RpZmZfbG93KSAvKiE8ICAqLworICAgIEZJWFBfREJMICpSRVNUUklDVAorICAgICAgICBwdHJSZWFsLCAvKiE8IFN1YmJhbmQgc2FtcGxlcyB0byBiZSBhZGp1c3RlZCwgcmVhbCBwYXJ0ICovCisgICAgRU5WX0NBTENfTlJHUyAqbnJncywgVUNIQVIgKnB0ckhhcm1JbmRleCwgLyohPCBIYXJtb25pYyBpbmRleCAqLworICAgIGludCBsb3dTdWJiYW5kLCAvKiE8IExvd2VzdCBRTUYtY2hhbm5lbCBpbiB0aGUgY3VycmVudGx5IHVzZWQgU0JSIHJhbmdlLiAqLworICAgIGludCBub1N1YmJhbmRzLCAvKiE8IE51bWJlciBvZiBRTUYgc3ViYmFuZHMgKi8KKyAgICBpbnQgc2NhbGVfY2hhbmdlLCAgIC8qITwgTnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgYWRqdXN0ZWQgc2FtcGxlcyAqLworICAgIGludCBub05vaXNlRmxhZywgICAgLyohPCBGbGFnIHRvIHN1cHByZXNzIG5vaXNlIGFkZGl0aW9uICovCisgICAgaW50ICpwdHJQaGFzZUluZGV4LCAvKiE8IFN0YXJ0IGluZGV4IHRvIHJhbmRvbSBudW1iZXIgYXJyYXkgKi8KKyAgICBpbnQgc2NhbGVfZGlmZl9sb3cpIC8qITwgICovCisKIHsKICAgaW50IGs7Ci0gIEZJWFBfREJMICBzaWduYWxSZWFsLCBzYk5vaXNlOworICBGSVhQX0RCTCBzaWduYWxSZWFsLCBzYk5vaXNlOwogICBpbnQgdG9uZV9jb3VudCA9IDA7CiAKLSAgRklYUF9EQkwgKnBHYWluICAgICAgID0gbnJncy0+bnJnR2FpbjsgICAgIC8qITwgR2FpbnMgb2YgY3VycmVudCBlbnZlbG9wZSAqLwotICBGSVhQX0RCTCAqcE5vaXNlTGV2ZWwgPSBucmdzLT5ub2lzZUxldmVsOyAgLyohPCBOb2lzZSBsZXZlbHMgb2YgY3VycmVudCBlbnZlbG9wZSAqLwotICBGSVhQX0RCTCAqcFNpbmVMZXZlbCAgPSBucmdzLT5ucmdTaW5lOyAgICAgLyohPCBTaW5lIGxldmVscyAqLworICBGSVhQX0RCTCAqcEdhaW4gPSBucmdzLT5ucmdHYWluOyAvKiE8IEdhaW5zIG9mIGN1cnJlbnQgZW52ZWxvcGUgKi8KKyAgRklYUF9EQkwgKlJFU1RSSUNUIHBOb2lzZUxldmVsID0KKyAgICAgIG5yZ3MtPm5vaXNlTGV2ZWw7IC8qITwgTm9pc2UgbGV2ZWxzIG9mIGN1cnJlbnQgZW52ZWxvcGUgKi8KKyAgRklYUF9EQkwgKlJFU1RSSUNUIHBTaW5lTGV2ZWwgPSBucmdzLT5ucmdTaW5lOyAvKiE8IFNpbmUgbGV2ZWxzICovCiAKLSAgaW50ICAgIHBoYXNlSW5kZXggPSAqcHRyUGhhc2VJbmRleDsKLSAgVUNIQVIgIGhhcm1JbmRleCAgPSAqcHRySGFybUluZGV4OworICBpbnQgcGhhc2VJbmRleCA9ICpwdHJQaGFzZUluZGV4OworICBVQ0hBUiBoYXJtSW5kZXggPSAqcHRySGFybUluZGV4OwogCi0gIHN0YXRpYyBjb25zdCBJTlQgaGFybW9uaWNQaGFzZSBbMl1bNF0gPSB7Ci0gICAgeyAxLCAwLCAtMSwgIDB9LAotICAgIHsgMCwgMSwgIDAsIC0xfQotICB9OworICBzdGF0aWMgY29uc3QgSU5UIGhhcm1vbmljUGhhc2VbNF1bMl0gPSB7ezEsIDB9LCB7MCwgMX0sIHstMSwgMH0sIHswLCAtMX19OwogCi0gIHN0YXRpYyBjb25zdCBGSVhQX0RCTCBoYXJtb25pY1BoYXNlWCBbMl1bNF0gPSB7Ci0gICAgeyBGTDJGWENPTlNUX0RCTCgyLjAqMS4yNDUxODMxNTQ1MzkxMzllLTAwMSksICBGTDJGWENPTlNUX0RCTCgyLjAqLTEuMTIzNzY3ODU5MzI1MDI4ZS0wMDEpLCAgRkwyRlhDT05TVF9EQkwoMi4wKi0xLjI0NTE4MzE1NDUzOTEzOWUtMDAxKSwgRkwyRlhDT05TVF9EQkwoMi4wKiAxLjEyMzc2Nzg1OTMyNTAyOGUtMDAxKSB9LAotICAgIHsgRkwyRlhDT05TVF9EQkwoMi4wKjEuMjQ1MTgzMTU0NTM5MTM5ZS0wMDEpLCAgRkwyRlhDT05TVF9EQkwoMi4wKiAxLjEyMzc2Nzg1OTMyNTAyOGUtMDAxKSwgIEZMMkZYQ09OU1RfREJMKDIuMCotMS4yNDUxODMxNTQ1MzkxMzllLTAwMSksIEZMMkZYQ09OU1RfREJMKDIuMCotMS4xMjM3Njc4NTkzMjUwMjhlLTAwMSkgfQotICB9OworICBzdGF0aWMgY29uc3QgRklYUF9EQkwgaGFybW9uaWNQaGFzZVhbNF1bMl0gPSB7CisgICAgICB7RkwyRlhDT05TVF9EQkwoMi4wICogMS4yNDUxODMxNTQ1MzkxMzllLTAwMSksCisgICAgICAgRkwyRlhDT05TVF9EQkwoMi4wICogMS4yNDUxODMxNTQ1MzkxMzllLTAwMSl9LAorICAgICAge0ZMMkZYQ09OU1RfREJMKDIuMCAqIC0xLjEyMzc2Nzg1OTMyNTAyOGUtMDAxKSwKKyAgICAgICBGTDJGWENPTlNUX0RCTCgyLjAgKiAxLjEyMzc2Nzg1OTMyNTAyOGUtMDAxKX0sCisgICAgICB7RkwyRlhDT05TVF9EQkwoMi4wICogLTEuMjQ1MTgzMTU0NTM5MTM5ZS0wMDEpLAorICAgICAgIEZMMkZYQ09OU1RfREJMKDIuMCAqIC0xLjI0NTE4MzE1NDUzOTEzOWUtMDAxKX0sCisgICAgICB7RkwyRlhDT05TVF9EQkwoMi4wICogMS4xMjM3Njc4NTkzMjUwMjhlLTAwMSksCisgICAgICAgRkwyRlhDT05TVF9EQkwoMi4wICogLTEuMTIzNzY3ODU5MzI1MDI4ZS0wMDEpfX07CiAKLSAgZm9yIChrPTA7IGsgPCBub1N1YmJhbmRzOyBrKyspIHsKKyAgY29uc3QgRklYUF9EQkwgKnBfaGFybW9uaWNQaGFzZVggPSAmaGFybW9uaWNQaGFzZVhbaGFybUluZGV4XVswXTsKKyAgY29uc3QgSU5UICpwX2hhcm1vbmljUGhhc2UgPSAmaGFybW9uaWNQaGFzZVtoYXJtSW5kZXhdWzBdOwogCisgICoocHRyUmVhbCAtIDEpID0gZkFkZFNhdHVyYXRlKAorICAgICAgKihwdHJSZWFsIC0gMSksCisgICAgICBTQVRVUkFURV9TSElGVChmTXVsdERpdjIocF9oYXJtb25pY1BoYXNlWFtsb3dTdWJiYW5kICYgMV0sIHBTaW5lTGV2ZWxbMF0pLAorICAgICAgICAgICAgICAgICAgICAgc2NhbGVfZGlmZl9sb3csIERGUkFDVF9CSVRTKSk7CisgIEZJWFBfREJMIHBTaW5lTGV2ZWxfcHJldiA9IChGSVhQX0RCTCkwOworCisgIGludCBpZHhfayA9IGxvd1N1YmJhbmQgJiAxOworCisgIGZvciAoayA9IDA7IGsgPCBub1N1YmJhbmRzOyBrKyspIHsKKyAgICBGSVhQX0RCTCBzaW5lTGV2ZWxfY3VyciA9ICpwU2luZUxldmVsKys7CiAgICAgcGhhc2VJbmRleCA9IChwaGFzZUluZGV4ICsgMSkgJiAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKIAotICAgIGlmKCAocFNpbmVMZXZlbFswXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgfHwgKG5vTm9pc2VGbGFnID09IDEpICl7Ci0gICAgICBzYk5vaXNlID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNiTm9pc2UgPSBwTm9pc2VMZXZlbFswXTsKKyAgICBzaWduYWxSZWFsID0gZk11bHREaXYyKCpwdHJSZWFsLCAqcEdhaW4rKykgPDwgKChpbnQpc2NhbGVfY2hhbmdlKTsKKyAgICBzYk5vaXNlID0gKnBOb2lzZUxldmVsKys7CisgICAgaWYgKCgoSU5UKXNpbmVMZXZlbF9jdXJyIHwgbm9Ob2lzZUZsYWcpID09IDApIHsKKyAgICAgIHNpZ25hbFJlYWwgKz0KKyAgICAgICAgICAoZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtwaGFzZUluZGV4XVswXSwgc2JOb2lzZSkKKyAgICAgICAgICAgPDwgNCk7CiAgICAgfQotCi0gICAgc2lnbmFsUmVhbCA9IGZNdWx0RGl2MigqcHRyUmVhbCwqcEdhaW4pIDw8ICgoaW50KXNjYWxlX2NoYW5nZSk7Ci0KLSAgICBzaWduYWxSZWFsICs9IChmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW3BoYXNlSW5kZXhdWzBdLCBzYk5vaXNlKTw8NCk7Ci0KLSAgICBzaWduYWxSZWFsICs9IHBTaW5lTGV2ZWxbMF0gKiBoYXJtb25pY1BoYXNlWzBdW2hhcm1JbmRleF07Ci0KLSAgICAqcHRyUmVhbCA9IHNpZ25hbFJlYWw7Ci0KLSAgICBpZiAoayA9PSAwKSB7Ci0gICAgICAqKHB0clJlYWwtMSkgKz0gc2NhbGVWYWx1ZShmTXVsdERpdjIoaGFybW9uaWNQaGFzZVhbbG93U3ViYmFuZCYxXVtoYXJtSW5kZXhdLCBwU2luZUxldmVsWzBdKSwgLXNjYWxlX2RpZmZfbG93KSAgOwotICAgICAgaWYgKGsgPCBub1N1YmJhbmRzIC0gMSkgewotICAgICAgICAqKHB0clJlYWwpICAgKz0gZk11bHREaXYyKHBTaW5lTGV2ZWxbMV0sIGhhcm1vbmljUGhhc2VYWyhsb3dTdWJiYW5kKzEpJjFdW2hhcm1JbmRleF0pOworICAgIHNpZ25hbFJlYWwgKz0gc2luZUxldmVsX2N1cnIgKiBwX2hhcm1vbmljUGhhc2VbMF07CisgICAgc2lnbmFsUmVhbCA9CisgICAgICAgIGZNdWx0QWRkRGl2MihzaWduYWxSZWFsLCBwU2luZUxldmVsX3ByZXYsIHBfaGFybW9uaWNQaGFzZVhbaWR4X2tdKTsKKyAgICBwU2luZUxldmVsX3ByZXYgPSBzaW5lTGV2ZWxfY3VycjsKKyAgICBpZHhfayA9ICFpZHhfazsKKyAgICBpZiAoayA8IG5vU3ViYmFuZHMgLSAxKSB7CisgICAgICBzaWduYWxSZWFsID0KKyAgICAgICAgICBmTXVsdEFkZERpdjIoc2lnbmFsUmVhbCwgcFNpbmVMZXZlbFswXSwgcF9oYXJtb25pY1BoYXNlWFtpZHhfa10pOworICAgIH0gZWxzZSAvKiAoayA9PSBub1N1YmJhbmRzIC0gMSkgICovCisgICAgeworICAgICAgaWYgKGsgKyBsb3dTdWJiYW5kICsgMSA8IDYzKSB7CisgICAgICAgICoocHRyUmVhbCArIDEpICs9IGZNdWx0RGl2MihwU2luZUxldmVsX3ByZXYsIHBfaGFybW9uaWNQaGFzZVhbaWR4X2tdKTsKICAgICAgIH0KICAgICB9Ci0gICAgaWYgKGsgPiAwICYmIGsgPCBub1N1YmJhbmRzIC0gMSAmJiB0b25lX2NvdW50IDwgMTYpIHsKLSAgICAgICoocHRyUmVhbCkgICArPSBmTXVsdERpdjIocFNpbmVMZXZlbFstIDFdLCBoYXJtb25pY1BoYXNlWCBbKGxvd1N1YmJhbmQraykmMV0gIFtoYXJtSW5kZXhdKTsKLSAgICAgICoocHRyUmVhbCkgICArPSBmTXVsdERpdjIocFNpbmVMZXZlbFsrIDFdLCBoYXJtb25pY1BoYXNlWCBbKGxvd1N1YmJhbmQraysxKSYxXVtoYXJtSW5kZXhdKTsKLSAgICB9Ci0gICAgaWYgKGsgPT0gbm9TdWJiYW5kcyAtIDEgJiYgdG9uZV9jb3VudCA8IDE2KSB7Ci0gICAgICBpZiAoayA+IDApIHsKLSAgICAgICAgKihwdHJSZWFsKSAgICs9IGZNdWx0RGl2MihwU2luZUxldmVsWy0gMV0sIGhhcm1vbmljUGhhc2VYIFsobG93U3ViYmFuZCtrKSYxXVtoYXJtSW5kZXhdKTsKLSAgICAgIH0KLSAgICAgIGlmIChrICsgbG93U3ViYmFuZCArIDE8IDYzKSB7Ci0gICAgICAgICoocHRyUmVhbCsxKSArPSBmTXVsdERpdjIocFNpbmVMZXZlbFswXSwgaGFybW9uaWNQaGFzZVhbKGxvd1N1YmJhbmQraysxKSYxXVtoYXJtSW5kZXhdKTsKLSAgICAgIH0KLSAgICB9CisgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7CiAKLSAgICBpZihwU2luZUxldmVsWzBdICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKXsKLSAgICAgIHRvbmVfY291bnQrKzsKKyAgICBpZiAocFNpbmVMZXZlbF9wcmV2ICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICBpZiAoKyt0b25lX2NvdW50ID09IDE2KSB7CisgICAgICAgIGsrKzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgfQotICAgIHB0clJlYWwrKzsKLSAgICBwTm9pc2VMZXZlbCsrOwotICAgIHBHYWluKys7Ci0gICAgcFNpbmVMZXZlbCsrOworICB9CisgIC8qIFJ1biBhZ2FpbiwgaWYgcHJldmlvdXMgbG9vcCBnb3QgYnJlYWtlZCB3aXRoIHRvbmVfY291bnQgPSAxNiAqLworICBmb3IgKDsgayA8IG5vU3ViYmFuZHM7IGsrKykgeworICAgIEZJWFBfREJMIHNpbmVMZXZlbF9jdXJyID0gKnBTaW5lTGV2ZWwrKzsKKyAgICBwaGFzZUluZGV4ID0gKHBoYXNlSW5kZXggKyAxKSAmIChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOworCisgICAgc2lnbmFsUmVhbCA9IGZNdWx0RGl2MigqcHRyUmVhbCwgKnBHYWluKyspIDw8ICgoaW50KXNjYWxlX2NoYW5nZSk7CisgICAgc2JOb2lzZSA9ICpwTm9pc2VMZXZlbCsrOworICAgIGlmICgoKElOVClzaW5lTGV2ZWxfY3VyciB8IG5vTm9pc2VGbGFnKSA9PSAwKSB7CisgICAgICBzaWduYWxSZWFsICs9CisgICAgICAgICAgKGZNdWx0RGl2MihGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbcGhhc2VJbmRleF1bMF0sIHNiTm9pc2UpCisgICAgICAgICAgIDw8IDQpOworICAgIH0KKyAgICBzaWduYWxSZWFsICs9IHNpbmVMZXZlbF9jdXJyICogcF9oYXJtb25pY1BoYXNlWzBdOworICAgICpwdHJSZWFsKysgPSBzaWduYWxSZWFsOwogICB9CiAKICAgKnB0ckhhcm1JbmRleCA9IChoYXJtSW5kZXggKyAxKSAmIDM7CkBAIC0xODM1LDI5ICsyNDc4LDMwIEBACiAgICAgICAgICAgIGFuZCBhZGQgdGhlIG5vaXNlZmxvb3IuCiAqLwogCi1zdGF0aWMgdm9pZCBhZGp1c3RUaW1lU2xvdExDKEZJWFBfREJMICpwdHJSZWFsLCAgICAgICAvKiE8IFN1YmJhbmQgc2FtcGxlcyB0byBiZSBhZGp1c3RlZCwgcmVhbCBwYXJ0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOVl9DQUxDX05SR1MqIG5yZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICpwdHJIYXJtSW5kZXgsICAvKiE8IEhhcm1vbmljIGluZGV4ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBsb3dTdWJiYW5kLCAgICAvKiE8IExvd2VzdCBRTUYtY2hhbm5lbCBpbiB0aGUgY3VycmVudGx5IHVzZWQgU0JSIHJhbmdlLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9TdWJiYW5kcywgICAgLyohPCBOdW1iZXIgb2YgUU1GIHN1YmJhbmRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzY2FsZV9jaGFuZ2UsICAvKiE8IE51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IGFkanVzdGVkIHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vTm9pc2VGbGFnLCAgIC8qITwgRmxhZyB0byBzdXBwcmVzcyBub2lzZSBhZGRpdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAqcHRyUGhhc2VJbmRleCkgLyohPCBTdGFydCBpbmRleCB0byByYW5kb20gbnVtYmVyIGFycmF5ICovCitzdGF0aWMgdm9pZCBhZGp1c3RUaW1lU2xvdExDKAorICAgIEZJWFBfREJMICpwdHJSZWFsLCAvKiE8IFN1YmJhbmQgc2FtcGxlcyB0byBiZSBhZGp1c3RlZCwgcmVhbCBwYXJ0ICovCisgICAgRU5WX0NBTENfTlJHUyAqbnJncywgVUNIQVIgKnB0ckhhcm1JbmRleCwgLyohPCBIYXJtb25pYyBpbmRleCAqLworICAgIGludCBsb3dTdWJiYW5kLCAvKiE8IExvd2VzdCBRTUYtY2hhbm5lbCBpbiB0aGUgY3VycmVudGx5IHVzZWQgU0JSIHJhbmdlLiAqLworICAgIGludCBub1N1YmJhbmRzLCAvKiE8IE51bWJlciBvZiBRTUYgc3ViYmFuZHMgKi8KKyAgICBpbnQgc2NhbGVfY2hhbmdlLCAgIC8qITwgTnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgYWRqdXN0ZWQgc2FtcGxlcyAqLworICAgIGludCBub05vaXNlRmxhZywgICAgLyohPCBGbGFnIHRvIHN1cHByZXNzIG5vaXNlIGFkZGl0aW9uICovCisgICAgaW50ICpwdHJQaGFzZUluZGV4KSAvKiE8IFN0YXJ0IGluZGV4IHRvIHJhbmRvbSBudW1iZXIgYXJyYXkgKi8KIHsKLSAgRklYUF9EQkwgKnBHYWluICAgICAgID0gbnJncy0+bnJnR2FpbjsgICAgIC8qITwgR2FpbnMgb2YgY3VycmVudCBlbnZlbG9wZSAqLwotICBGSVhQX0RCTCAqcE5vaXNlTGV2ZWwgPSBucmdzLT5ub2lzZUxldmVsOyAgLyohPCBOb2lzZSBsZXZlbHMgb2YgY3VycmVudCBlbnZlbG9wZSAqLwotICBGSVhQX0RCTCAqcFNpbmVMZXZlbCAgPSBucmdzLT5ucmdTaW5lOyAgICAgLyohPCBTaW5lIGxldmVscyAqLworICBGSVhQX0RCTCAqcEdhaW4gPSBucmdzLT5ucmdHYWluOyAvKiE8IEdhaW5zIG9mIGN1cnJlbnQgZW52ZWxvcGUgKi8KKyAgRklYUF9EQkwgKnBOb2lzZUxldmVsID0KKyAgICAgIG5yZ3MtPm5vaXNlTGV2ZWw7ICAgICAgICAgICAgICAgICAvKiE8IE5vaXNlIGxldmVscyBvZiBjdXJyZW50IGVudmVsb3BlICovCisgIEZJWFBfREJMICpwU2luZUxldmVsID0gbnJncy0+bnJnU2luZTsgLyohPCBTaW5lIGxldmVscyAqLwogCi0gIGludCAgICBrOwotICBpbnQgICAgaW5kZXggPSAqcHRyUGhhc2VJbmRleDsKLSAgVUNIQVIgIGhhcm1JbmRleCA9ICpwdHJIYXJtSW5kZXg7Ci0gIFVDSEFSICBmcmVxSW52RmxhZyA9IChsb3dTdWJiYW5kICYgMSk7Ci0gIEZJWFBfREJMICBzaWduYWxSZWFsLCBzaW5lTGV2ZWwsIHNpbmVMZXZlbE5leHQsIHNpbmVMZXZlbFByZXY7Ci0gIGludCAgICB0b25lX2NvdW50ID0gMDsKLSAgaW50ICAgIHNpbmVTaWduID0gMTsKKyAgaW50IGs7CisgIGludCBpbmRleCA9ICpwdHJQaGFzZUluZGV4OworICBVQ0hBUiBoYXJtSW5kZXggPSAqcHRySGFybUluZGV4OworICBVQ0hBUiBmcmVxSW52RmxhZyA9IChsb3dTdWJiYW5kICYgMSk7CisgIEZJWFBfREJMIHNpZ25hbFJlYWwsIHNpbmVMZXZlbCwgc2luZUxldmVsTmV4dCwgc2luZUxldmVsUHJldjsKKyAgaW50IHRvbmVfY291bnQgPSAwOworICBpbnQgc2luZVNpZ24gPSAxOwogCi0gICNkZWZpbmUgQzEgICAoKEZJWFBfU0dMKUZMMkZYQ09OU1RfU0dMKDIuZiowLjAwODE1ZikpCi0gICNkZWZpbmUgQzFfQ0xERkIgKChGSVhQX1NHTClGTDJGWENPTlNUX1NHTCgyLmYqMC4xNjc3M2YpKQorI2RlZmluZSBDMSAoKEZJWFBfU0dMKUZMMkZYQ09OU1RfU0dMKDIuZiAqIDAuMDA4MTVmKSkKKyNkZWZpbmUgQzFfQ0xERkIgKChGSVhQX1NHTClGTDJGWENPTlNUX1NHTCgyLmYgKiAwLjE2NzczZikpCiAKICAgLyoKICAgICBGaXJzdCBwYXNzIGZvciBrPTAgcHVsbGVkIG91dCBvZiB0aGUgbG9vcDoKQEAgLTE4NzAsMzggKzI1MTQsNDAgQEAKICAgICBvZiB0aGUgc2lnbmFsIGFuZCBzaG91bGQgYmUgY2FycmllZCBvdXQgd2l0aCBmdWxsIGFjY3VyYWN5CiAgICAgKHN1cHBseWluZyAjRlJBQ1RfQklUUyB2YWxpZCBiaXRzKS4KICAgKi8KLSAgc2lnbmFsUmVhbCAgICA9IGZNdWx0RGl2MigqcHRyUmVhbCwqcEdhaW4rKykgPDwgKChpbnQpc2NhbGVfY2hhbmdlKTsKLSAgc2luZUxldmVsICAgICA9ICpwU2luZUxldmVsKys7CisgIHNpZ25hbFJlYWwgPSBmTXVsdERpdjIoKnB0clJlYWwsICpwR2FpbisrKSA8PCAoKGludClzY2FsZV9jaGFuZ2UpOworICBzaW5lTGV2ZWwgPSAqcFNpbmVMZXZlbCsrOwogICBzaW5lTGV2ZWxOZXh0ID0gKG5vU3ViYmFuZHMgPiAxKSA/IHBTaW5lTGV2ZWxbMF0gOiBGTDJGWENPTlNUX0RCTCgwLjBmKTsKIAotICBpZiAoc2luZUxldmVsIT1GTDJGWENPTlNUX0RCTCgwLjBmKSkgdG9uZV9jb3VudCsrOworICBpZiAoc2luZUxldmVsICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKQorICAgIHRvbmVfY291bnQrKzsKICAgZWxzZSBpZiAoIW5vTm9pc2VGbGFnKQotICAgICAgICAvKiBBZGQgbm9pc2VmbG9vciB0byB0aGUgYW1wbGlmaWVkIHNpZ25hbCAqLwotICAgICAgICBzaWduYWxSZWFsICs9IChmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVswXSwgcE5vaXNlTGV2ZWxbMF0pPDw0KTsKKyAgICAvKiBBZGQgbm9pc2VmbG9vciB0byB0aGUgYW1wbGlmaWVkIHNpZ25hbCAqLworICAgIHNpZ25hbFJlYWwgKz0KKyAgICAgICAgKGZNdWx0RGl2MihGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbaW5kZXhdWzBdLCBwTm9pc2VMZXZlbFswXSkKKyAgICAgICAgIDw8IDQpOwogCiAgIHsKLSAgICBpZiAoIShoYXJtSW5kZXgmMHgxKSkgeworICAgIGlmICghKGhhcm1JbmRleCAmIDB4MSkpIHsKICAgICAgIC8qIGhhcm1JbmRleCAwLDIgKi8KLSAgICAgIHNpZ25hbFJlYWwgKz0gKGhhcm1JbmRleCYweDIpID8gLXNpbmVMZXZlbCA6IHNpbmVMZXZlbDsKKyAgICAgIHNpZ25hbFJlYWwgKz0gKGhhcm1JbmRleCAmIDB4MikgPyAtc2luZUxldmVsIDogc2luZUxldmVsOwogICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICAvKiBoYXJtSW5kZXggMSwzIGluIGNvbWJpbmF0aW9uIHdpdGggZnJlcUludkZsYWcgKi8KLSAgICAgIGludCBzaGlmdCA9IChpbnQpIChzY2FsZV9jaGFuZ2UrMSk7Ci0gICAgICBzaGlmdCA9IChzaGlmdD49MCkgPyBmaXhNaW4oREZSQUNUX0JJVFMtMSxzaGlmdCkgOiBmaXhNYXgoLShERlJBQ1RfQklUUy0xKSxzaGlmdCk7CisgICAgICBpbnQgc2hpZnQgPSAoaW50KShzY2FsZV9jaGFuZ2UgKyAxKTsKKyAgICAgIHNoaWZ0ID0gKHNoaWZ0ID49IDApID8gZml4TWluKERGUkFDVF9CSVRTIC0gMSwgc2hpZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZpeE1heCgtKERGUkFDVF9CSVRTIC0gMSksIHNoaWZ0KTsKIAotICAgICAgRklYUF9EQkwgdG1wMSA9IChzaGlmdD49MCkgPyAoIGZNdWx0RGl2MihDMSwgc2luZUxldmVsKSA+PiBzaGlmdCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICggZk11bHREaXYyKEMxLCBzaW5lTGV2ZWwpIDw8ICgtc2hpZnQpICk7CisgICAgICBGSVhQX0RCTCB0bXAxID0gKHNoaWZ0ID49IDApID8gKGZNdWx0RGl2MihDMSwgc2luZUxldmVsKSA+PiBzaGlmdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZk11bHREaXYyKEMxLCBzaW5lTGV2ZWwpIDw8ICgtc2hpZnQpKTsKICAgICAgIEZJWFBfREJMIHRtcDIgPSBmTXVsdERpdjIoQzEsIHNpbmVMZXZlbE5leHQpOwogCi0KICAgICAgIC8qIHNhdmUgc3dpdGNoIGFuZCBjb21wYXJlIG9wZXJhdGlvbnMgYW5kIHJlZHVjZSB0byBYT1Igc3RhdGVtZW50ICovCi0gICAgICBpZiAoICgoaGFybUluZGV4Pj4xKSYweDEpXmZyZXFJbnZGbGFnKSB7Ci0gICAgICAgICAgKihwdHJSZWFsLTEpICs9IHRtcDE7Ci0gICAgICAgICAgc2lnbmFsUmVhbCAgIC09IHRtcDI7CisgICAgICBpZiAoKChoYXJtSW5kZXggPj4gMSkgJiAweDEpIF4gZnJlcUludkZsYWcpIHsKKyAgICAgICAgKihwdHJSZWFsIC0gMSkgKz0gdG1wMTsKKyAgICAgICAgc2lnbmFsUmVhbCAtPSB0bXAyOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAqKHB0clJlYWwtMSkgLT0gdG1wMTsKLSAgICAgICAgICBzaWduYWxSZWFsICAgKz0gdG1wMjsKKyAgICAgICAgKihwdHJSZWFsIC0gMSkgLT0gdG1wMTsKKyAgICAgICAgc2lnbmFsUmVhbCArPSB0bXAyOwogICAgICAgfQogICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7CiAgICAgICBmcmVxSW52RmxhZyA9ICFmcmVxSW52RmxhZzsKQEAgLTE5MTAsNDUgKzI1NTYsNTEgQEAKIAogICBwTm9pc2VMZXZlbCsrOwogCi0gIGlmICggbm9TdWJiYW5kcyA+IDIgKSB7Ci0gICAgaWYgKCEoaGFybUluZGV4JjB4MSkpIHsKKyAgaWYgKG5vU3ViYmFuZHMgPiAyKSB7CisgICAgaWYgKCEoaGFybUluZGV4ICYgMHgxKSkgewogICAgICAgLyogaGFybUluZGV4IDAsMiAqLwotICAgICAgaWYoIWhhcm1JbmRleCkgCi0gICAgICB7CisgICAgICBpZiAoIWhhcm1JbmRleCkgewogICAgICAgICBzaW5lU2lnbiA9IDA7CiAgICAgICB9CiAKLSAgICAgIGZvciAoaz1ub1N1YmJhbmRzLTI7IGshPTA7IGstLSkgeworICAgICAgZm9yIChrID0gbm9TdWJiYW5kcyAtIDI7IGsgIT0gMDsgay0tKSB7CiAgICAgICAgIEZJWFBfREJMIHNpbmVsZXZlbCA9ICpwU2luZUxldmVsKys7CiAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIGlmICgoKHNpZ25hbFJlYWwgPSAoc2luZVNpZ24gPyAtc2luZWxldmVsIDogc2luZWxldmVsKSkgPT0gRkwyRlhDT05TVF9EQkwoMC4wZikpICAmJiAhbm9Ob2lzZUZsYWcpIAotICAgICAgICB7CisgICAgICAgIGlmICgoKHNpZ25hbFJlYWwgPSAoc2luZVNpZ24gPyAtc2luZWxldmVsIDogc2luZWxldmVsKSkgPT0KKyAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjBmKSkgJiYKKyAgICAgICAgICAgICFub05vaXNlRmxhZykgewogICAgICAgICAgIC8qIEFkZCBub2lzZWZsb29yIHRvIHRoZSBhbXBsaWZpZWQgc2lnbmFsICovCiAgICAgICAgICAgaW5kZXggJj0gKFNCUl9ORl9OT19SQU5ET01fVkFMIC0gMSk7Ci0gICAgICAgICAgc2lnbmFsUmVhbCArPSAoZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHBOb2lzZUxldmVsWzBdKTw8NCk7CisgICAgICAgICAgc2lnbmFsUmVhbCArPSAoZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2lzZUxldmVsWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDQpOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKiBUaGUgbmV4dCBtdWx0aXBsaWNhdGlvbiBjb25zdGl0dXRlcyB0aGUgYWN0dWFsIGVudmVsb3BlIGFkanVzdG1lbnQgb2YgdGhlIHNpZ25hbC4gKi8KLSAgICAgICAgc2lnbmFsUmVhbCArPSBmTXVsdERpdjIoKnB0clJlYWwsKnBHYWluKyspIDw8ICgoaW50KXNjYWxlX2NoYW5nZSk7CisKKyAgICAgICAgLyogVGhlIG5leHQgbXVsdGlwbGljYXRpb24gY29uc3RpdHV0ZXMgdGhlIGFjdHVhbCBlbnZlbG9wZSBhZGp1c3RtZW50IG9mCisgICAgICAgICAqIHRoZSBzaWduYWwuICovCisgICAgICAgIHNpZ25hbFJlYWwgKz0gZk11bHREaXYyKCpwdHJSZWFsLCAqcEdhaW4rKykgPDwgKChpbnQpc2NhbGVfY2hhbmdlKTsKIAogICAgICAgICBwTm9pc2VMZXZlbCsrOwogICAgICAgICAqcHRyUmVhbCsrID0gc2lnbmFsUmVhbDsKICAgICAgIH0gLyogZm9yIC4uLiAqLwotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgLyogaGFybUluZGV4IDEsMyBpbiBjb21iaW5hdGlvbiB3aXRoIGZyZXFJbnZGbGFnICovCi0gICAgICBpZiAoaGFybUluZGV4PT0xKSBmcmVxSW52RmxhZyA9ICFmcmVxSW52RmxhZzsKKyAgICAgIGlmIChoYXJtSW5kZXggPT0gMSkgZnJlcUludkZsYWcgPSAhZnJlcUludkZsYWc7CiAKLSAgICAgIGZvciAoaz1ub1N1YmJhbmRzLTI7IGshPTA7IGstLSkgeworICAgICAgZm9yIChrID0gbm9TdWJiYW5kcyAtIDI7IGsgIT0gMDsgay0tKSB7CiAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIC8qIFRoZSBuZXh0IG11bHRpcGxpY2F0aW9uIGNvbnN0aXR1dGVzIHRoZSBhY3R1YWwgZW52ZWxvcGUgYWRqdXN0bWVudCBvZiB0aGUgc2lnbmFsLiAqLwotICAgICAgICBzaWduYWxSZWFsID0gZk11bHREaXYyKCpwdHJSZWFsLCpwR2FpbisrKSA8PCAoKGludClzY2FsZV9jaGFuZ2UpOworICAgICAgICAvKiBUaGUgbmV4dCBtdWx0aXBsaWNhdGlvbiBjb25zdGl0dXRlcyB0aGUgYWN0dWFsIGVudmVsb3BlIGFkanVzdG1lbnQgb2YKKyAgICAgICAgICogdGhlIHNpZ25hbC4gKi8KKyAgICAgICAgc2lnbmFsUmVhbCA9IGZNdWx0RGl2MigqcHRyUmVhbCwgKnBHYWluKyspIDw8ICgoaW50KXNjYWxlX2NoYW5nZSk7CiAKLSAgICAgICAgaWYgKCpwU2luZUxldmVsKyshPUZMMkZYQ09OU1RfREJMKDAuMGYpKSB0b25lX2NvdW50Kys7CisgICAgICAgIGlmICgqcFNpbmVMZXZlbCsrICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKQorICAgICAgICAgIHRvbmVfY291bnQrKzsKICAgICAgICAgZWxzZSBpZiAoIW5vTm9pc2VGbGFnKSB7CiAgICAgICAgICAgLyogQWRkIG5vaXNlZmxvb3IgdG8gdGhlIGFtcGxpZmllZCBzaWduYWwgKi8KICAgICAgICAgICBpbmRleCAmPSAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKLSAgICAgICAgICBzaWduYWxSZWFsICs9IChmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVswXSwgcE5vaXNlTGV2ZWxbMF0pPDw0KTsKKyAgICAgICAgICBzaWduYWxSZWFsICs9IChmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vaXNlTGV2ZWxbMF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgNCk7CiAgICAgICAgIH0KIAogICAgICAgICBwTm9pc2VMZXZlbCsrOwpAQCAtMTk2Niw3NiArMjYxOCwyNDcgQEAKIAogICBpZiAobm9TdWJiYW5kcyA+IC0xKSB7CiAgICAgaW5kZXgrKzsKLSAgICAvKiBUaGUgbmV4dCBtdWx0aXBsaWNhdGlvbiBjb25zdGl0dXRlcyB0aGUgYWN0dWFsIGVudmVsb3BlIGFkanVzdG1lbnQgb2YgdGhlIHNpZ25hbC4gKi8KLSAgICBzaWduYWxSZWFsICAgID0gZk11bHREaXYyKCpwdHJSZWFsLCpwR2FpbikgPDwgKChpbnQpc2NhbGVfY2hhbmdlKTsKLSAgICBzaW5lTGV2ZWxQcmV2ID0gZk11bHREaXYyKHBTaW5lTGV2ZWxbLTFdLEZMMkZYX1NHTCgwLjAxNjNmKSk7Ci0gICAgc2luZUxldmVsICAgICA9IHBTaW5lTGV2ZWxbMF07CisgICAgLyogVGhlIG5leHQgbXVsdGlwbGljYXRpb24gY29uc3RpdHV0ZXMgdGhlIGFjdHVhbCBlbnZlbG9wZSBhZGp1c3RtZW50IG9mIHRoZQorICAgICAqIHNpZ25hbC4gKi8KKyAgICBzaWduYWxSZWFsID0gZk11bHREaXYyKCpwdHJSZWFsLCAqcEdhaW4pIDw8ICgoaW50KXNjYWxlX2NoYW5nZSk7CisgICAgc2luZUxldmVsUHJldiA9IGZNdWx0RGl2MihwU2luZUxldmVsWy0xXSwgRkwyRlhfU0dMKDAuMDE2M2YpKTsKKyAgICBzaW5lTGV2ZWwgPSBwU2luZUxldmVsWzBdOwogCi0gICAgaWYgKHBTaW5lTGV2ZWxbMF0hPUZMMkZYQ09OU1RfREJMKDAuMGYpKSB0b25lX2NvdW50Kys7CisgICAgaWYgKHBTaW5lTGV2ZWxbMF0gIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpCisgICAgICB0b25lX2NvdW50Kys7CiAgICAgZWxzZSBpZiAoIW5vTm9pc2VGbGFnKSB7Ci0gICAgICAgIC8qIEFkZCBub2lzZWZsb29yIHRvIHRoZSBhbXBsaWZpZWQgc2lnbmFsICovCi0gICAgICAgIGluZGV4ICY9IChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOwotICAgICAgICBzaWduYWxSZWFsID0gc2lnbmFsUmVhbCArIChmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVswXSwgcE5vaXNlTGV2ZWxbMF0pPDw0KTsKKyAgICAgIC8qIEFkZCBub2lzZWZsb29yIHRvIHRoZSBhbXBsaWZpZWQgc2lnbmFsICovCisgICAgICBpbmRleCAmPSAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKKyAgICAgIHNpZ25hbFJlYWwgPQorICAgICAgICAgIHNpZ25hbFJlYWwgKworICAgICAgICAgIChmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVswXSwgcE5vaXNlTGV2ZWxbMF0pCisgICAgICAgICAgIDw8IDQpOwogICAgIH0KIAotICAgIGlmICghKGhhcm1JbmRleCYweDEpKSB7CisgICAgaWYgKCEoaGFybUluZGV4ICYgMHgxKSkgewogICAgICAgLyogaGFybUluZGV4IDAsMiAqLwotICAgICAgKnB0clJlYWwgPSBzaWduYWxSZWFsICsgKCAoc2luZVNpZ24pID8gLXNpbmVMZXZlbCA6IHNpbmVMZXZlbCk7Ci0gICAgfQotICAgIGVsc2UgeworICAgICAgKnB0clJlYWwgPSBzaWduYWxSZWFsICsgKChzaW5lU2lnbikgPyAtc2luZUxldmVsIDogc2luZUxldmVsKTsKKyAgICB9IGVsc2UgewogICAgICAgLyogaGFybUluZGV4IDEsMyBpbiBjb21iaW5hdGlvbiB3aXRoIGZyZXFJbnZGbGFnICovCi0gICAgICBpZih0b25lX2NvdW50IDw9IDE2KXsKKyAgICAgIGlmICh0b25lX2NvdW50IDw9IDE2KSB7CiAgICAgICAgIGlmIChmcmVxSW52RmxhZykgewotICAgICAgICAgICpwdHJSZWFsKysgICA9IHNpZ25hbFJlYWwgLSBzaW5lTGV2ZWxQcmV2OworICAgICAgICAgICpwdHJSZWFsKysgPSBzaWduYWxSZWFsIC0gc2luZUxldmVsUHJldjsKICAgICAgICAgICBpZiAobm9TdWJiYW5kcyArIGxvd1N1YmJhbmQgPCA2MykKICAgICAgICAgICAgICpwdHJSZWFsID0gKnB0clJlYWwgKyBmTXVsdERpdjIoQzEsIHNpbmVMZXZlbCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWwgKyBzaW5lTGV2ZWxQcmV2OwogICAgICAgICAgIGlmIChub1N1YmJhbmRzICsgbG93U3ViYmFuZCA8IDYzKQogICAgICAgICAgICAgKnB0clJlYWwgPSAqcHRyUmVhbCAtIGZNdWx0RGl2MihDMSwgc2luZUxldmVsKTsKICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSAqcHRyUmVhbCA9IHNpZ25hbFJlYWw7CisgICAgICB9IGVsc2UKKyAgICAgICAgKnB0clJlYWwgPSBzaWduYWxSZWFsOwogICAgIH0KICAgfQogICAqcHRySGFybUluZGV4ID0gKGhhcm1JbmRleCArIDEpICYgMzsKICAgKnB0clBoYXNlSW5kZXggPSBpbmRleCAmIChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOwogfQotc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RIUSgKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcHRyUmVhbCwgICAgICAvKiE8IFN1YmJhbmQgc2FtcGxlcyB0byBiZSBhZGp1c3RlZCwgcmVhbCBwYXJ0ICovCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHB0ckltYWcsICAgICAgLyohPCBTdWJiYW5kIHNhbXBsZXMgdG8gYmUgYWRqdXN0ZWQsIGltYWcgcGFydCAqLwotICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhfc2JyX2NhbF9lbnYsCi0gICAgICAgICAgICAgICAgICAgICAgRU5WX0NBTENfTlJHUyogbnJncywKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbG93U3ViYmFuZCwgICAgICAgICAgICAvKiE8IExvd2VzdCBRTUYtY2hhbm5lbCBpbiB0aGUgY3VycmVudGx5IHVzZWQgU0JSIHJhbmdlLiAqLwotICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBub1N1YmJhbmRzLCAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIFFNRiBzdWJiYW5kcyAqLwotICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzY2FsZV9jaGFuZ2UsICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgYWRqdXN0ZWQgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICBzbW9vdGhfcmF0aW8sICAgICAgICAgIC8qITwgSW1wYWN0IG9mIGxhc3QgZW52ZWxvcGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9Ob2lzZUZsYWcsICAgICAgICAgICAvKiE8IFN0YXJ0IGluZGV4IHRvIHJhbmRvbSBudW1iZXIgYXJyYXkgKi8KLSAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgZmlsdEJ1ZmZlck5vaXNlU2hpZnQpICAvKiE8IFNoaWZ0IGZhY3RvciBvZiBmaWx0QnVmZmVyTm9pc2UgKi8KKworc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RIUV9HYWluQW5kTm9pc2UoCisgICAgRklYUF9EQkwgKlJFU1RSSUNUCisgICAgICAgIHB0clJlYWwsIC8qITwgU3ViYmFuZCBzYW1wbGVzIHRvIGJlIGFkanVzdGVkLCByZWFsIHBhcnQgKi8KKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QKKyAgICAgICAgcHRySW1hZywgLyohPCBTdWJiYW5kIHNhbXBsZXMgdG8gYmUgYWRqdXN0ZWQsIGltYWcgcGFydCAqLworICAgIEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhfc2JyX2NhbF9lbnYsIEVOVl9DQUxDX05SR1MgKm5yZ3MsCisgICAgaW50IGxvd1N1YmJhbmQsIC8qITwgTG93ZXN0IFFNRi1jaGFubmVsIGluIHRoZSBjdXJyZW50bHkgdXNlZCBTQlIgcmFuZ2UuICovCisgICAgaW50IG5vU3ViYmFuZHMsIC8qITwgTnVtYmVyIG9mIFFNRiBzdWJiYW5kcyAqLworICAgIGludCBzY2FsZV9jaGFuZ2UsICAgICAgICAgLyohPCBOdW1iZXIgb2YgYml0cyB0byBzaGlmdCBhZGp1c3RlZCBzYW1wbGVzICovCisgICAgRklYUF9TR0wgc21vb3RoX3JhdGlvLCAgICAvKiE8IEltcGFjdCBvZiBsYXN0IGVudmVsb3BlICovCisgICAgaW50IG5vTm9pc2VGbGFnLCAgICAgICAgICAvKiE8IFN0YXJ0IGluZGV4IHRvIHJhbmRvbSBudW1iZXIgYXJyYXkgKi8KKyAgICBpbnQgZmlsdEJ1ZmZlck5vaXNlU2hpZnQpIC8qITwgU2hpZnQgZmFjdG9yIG9mIGZpbHRCdWZmZXJOb2lzZSAqLwogeworICBGSVhQX0RCTCAqUkVTVFJJQ1QgZ2FpbiA9IG5yZ3MtPm5yZ0dhaW47IC8qITwgR2FpbnMgb2YgY3VycmVudCBlbnZlbG9wZSAqLworICBGSVhQX0RCTCAqUkVTVFJJQ1Qgbm9pc2VMZXZlbCA9CisgICAgICBucmdzLT5ub2lzZUxldmVsOyAvKiE8IE5vaXNlIGxldmVscyBvZiBjdXJyZW50IGVudmVsb3BlICovCisgIEZJWFBfREJMICpSRVNUUklDVCBwU2luZUxldmVsID0gbnJncy0+bnJnU2luZTsgLyohPCBTaW5lIGxldmVscyAqLwogCi0gIEZJWFBfREJMICpSRVNUUklDVCBnYWluICAgICAgID0gbnJncy0+bnJnR2FpbjsgICAgICAgIC8qITwgR2FpbnMgb2YgY3VycmVudCBlbnZlbG9wZSAqLwotICBGSVhQX0RCTCAqUkVTVFJJQ1Qgbm9pc2VMZXZlbCA9IG5yZ3MtPm5vaXNlTGV2ZWw7ICAgICAvKiE8IE5vaXNlIGxldmVscyBvZiBjdXJyZW50IGVudmVsb3BlICovCi0gIEZJWFBfREJMICpSRVNUUklDVCBwU2luZUxldmVsID0gbnJncy0+bnJnU2luZTsgICAgICAgIC8qITwgU2luZSBsZXZlbHMgKi8KKyAgRklYUF9EQkwgKlJFU1RSSUNUIGZpbHRCdWZmZXIgPQorICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlcjsgLyohPCBHYWlucyBvZiBsYXN0IGVudmVsb3BlICovCisgIEZJWFBfREJMICpSRVNUUklDVCBmaWx0QnVmZmVyTm9pc2UgPQorICAgICAgaF9zYnJfY2FsX2Vudi0+ZmlsdEJ1ZmZlck5vaXNlOyAvKiE8IE5vaXNlIGxldmVscyBvZiBsYXN0IGVudmVsb3BlICovCisgIGludCAqUkVTVFJJQ1QgcHRyUGhhc2VJbmRleCA9CisgICAgICAmaF9zYnJfY2FsX2Vudi0+cGhhc2VJbmRleDsgLyohPCBTdGFydCBpbmRleCB0byByYW5kb20gbnVtYmVyIGFycmF5ICovCiAKLSAgRklYUF9EQkwgKlJFU1RSSUNUIGZpbHRCdWZmZXIgICAgICA9IGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXI7ICAgICAgLyohPCBHYWlucyBvZiBsYXN0IGVudmVsb3BlICovCi0gIEZJWFBfREJMICpSRVNUUklDVCBmaWx0QnVmZmVyTm9pc2UgPSBoX3Nicl9jYWxfZW52LT5maWx0QnVmZmVyTm9pc2U7IC8qITwgTm9pc2UgbGV2ZWxzIG9mIGxhc3QgZW52ZWxvcGUgKi8KLSAgVUNIQVIgICAgKlJFU1RSSUNUIHB0ckhhcm1JbmRleCAgICA9Jmhfc2JyX2NhbF9lbnYtPmhhcm1JbmRleDsgICAgICAgLyohPCBIYXJtb25pYyBpbmRleCAqLwotICBpbnQgICAgICAqUkVTVFJJQ1QgcHRyUGhhc2VJbmRleCAgID0maF9zYnJfY2FsX2Vudi0+cGhhc2VJbmRleDsgICAgICAvKiE8IFN0YXJ0IGluZGV4IHRvIHJhbmRvbSBudW1iZXIgYXJyYXkgKi8KLQotICBpbnQgICAgazsKKyAgaW50IGs7CiAgIEZJWFBfREJMIHNpZ25hbFJlYWwsIHNpZ25hbEltYWc7Ci0gIEZJWFBfREJMIG5vaXNlUmVhbCwgIG5vaXNlSW1hZzsKLSAgRklYUF9EQkwgIHNtb290aGVkR2Fpbiwgc21vb3RoZWROb2lzZTsKLSAgRklYUF9TR0wgZGlyZWN0X3JhdGlvID0gLypGTDJGWENPTlNUX1NHTCgxLjBmKSAqLyAoRklYUF9TR0wpTUFYVkFMX1NHTCAtIHNtb290aF9yYXRpbzsKLSAgaW50ICAgIGluZGV4ID0gKnB0clBoYXNlSW5kZXg7Ci0gIFVDSEFSICAgaGFybUluZGV4ID0gKnB0ckhhcm1JbmRleDsKKyAgRklYUF9EQkwgbm9pc2VSZWFsLCBub2lzZUltYWc7CisgIEZJWFBfREJMIHNtb290aGVkR2Fpbiwgc21vb3RoZWROb2lzZTsKKyAgRklYUF9TR0wgZGlyZWN0X3JhdGlvID0KKyAgICAgIC8qRkwyRlhDT05TVF9TR0woMS4wZikgKi8gKEZJWFBfU0dMKU1BWFZBTF9TR0wgLSBzbW9vdGhfcmF0aW87CisgIGludCBpbmRleCA9ICpwdHJQaGFzZUluZGV4OworICBpbnQgc2hpZnQ7CisKKyAgKnB0clBoYXNlSW5kZXggPSAoaW5kZXggKyBub1N1YmJhbmRzKSAmIChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOworCisgIGZpbHRCdWZmZXJOb2lzZVNoaWZ0ICs9CisgICAgICAxOyAvKiBkdWUgdG8gbGF0ZXIgdXNlIG9mIGZNdWx0RGl2MiBpbnN0ZWFkIG9mIGZNdWx0ICovCisgIGlmIChmaWx0QnVmZmVyTm9pc2VTaGlmdCA8IDApIHsKKyAgICBzaGlmdCA9IGZpeE1pbihERlJBQ1RfQklUUyAtIDEsIC1maWx0QnVmZmVyTm9pc2VTaGlmdCk7CisgIH0gZWxzZSB7CisgICAgc2hpZnQgPSBmaXhNaW4oREZSQUNUX0JJVFMgLSAxLCBmaWx0QnVmZmVyTm9pc2VTaGlmdCk7CisgIH0KKworICBpZiAoc21vb3RoX3JhdGlvID4gRkwyRlhDT05TVF9TR0woMC4wZikpIHsKKyAgICBmb3IgKGsgPSAwOyBrIDwgbm9TdWJiYW5kczsgaysrKSB7CisgICAgICAvKgorICAgICAgICBTbW9vdGhpbmc6IFRoZSBvbGQgZW52ZWxvcGUgaGFzIGJlZW4gYnVmZmVyZCBhbmQgYSBjZXJ0YWluIHJhdGlvCisgICAgICAgIG9mIHRoZSBvbGQgZ2FpbnMgYW5kIG5vaXNlIGxldmVscyBpcyB1c2VkLgorICAgICAgKi8KKyAgICAgIHNtb290aGVkR2FpbiA9CisgICAgICAgICAgZk11bHQoc21vb3RoX3JhdGlvLCBmaWx0QnVmZmVyW2tdKSArIGZNdWx0KGRpcmVjdF9yYXRpbywgZ2FpbltrXSk7CisKKyAgICAgIGlmIChmaWx0QnVmZmVyTm9pc2VTaGlmdCA8IDApIHsKKyAgICAgICAgc21vb3RoZWROb2lzZSA9IChmTXVsdERpdjIoc21vb3RoX3JhdGlvLCBmaWx0QnVmZmVyTm9pc2Vba10pID4+IHNoaWZ0KSArCisgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChkaXJlY3RfcmF0aW8sIG5vaXNlTGV2ZWxba10pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc21vb3RoZWROb2lzZSA9IChmTXVsdERpdjIoc21vb3RoX3JhdGlvLCBmaWx0QnVmZmVyTm9pc2Vba10pIDw8IHNoaWZ0KSArCisgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChkaXJlY3RfcmF0aW8sIG5vaXNlTGV2ZWxba10pOworICAgICAgfQorCisgICAgICAvKgorICAgICAgICBUaGUgbmV4dCAyIG11bHRpcGxpY2F0aW9ucyBjb25zdGl0dXRlIHRoZSBhY3R1YWwgZW52ZWxvcGUgYWRqdXN0bWVudAorICAgICAgICBvZiB0aGUgc2lnbmFsIGFuZCBzaG91bGQgYmUgY2FycmllZCBvdXQgd2l0aCBmdWxsIGFjY3VyYWN5CisgICAgICAgIChzdXBwbHlpbmcgI0RGUkFDVF9CSVRTIHZhbGlkIGJpdHMpLgorICAgICAgKi8KKyAgICAgIHNpZ25hbFJlYWwgPSBmTXVsdERpdjIoKnB0clJlYWwsIHNtb290aGVkR2FpbikgPDwgKChpbnQpc2NhbGVfY2hhbmdlKTsKKyAgICAgIHNpZ25hbEltYWcgPSBmTXVsdERpdjIoKnB0ckltYWcsIHNtb290aGVkR2FpbikgPDwgKChpbnQpc2NhbGVfY2hhbmdlKTsKKworICAgICAgaW5kZXgrKzsKKworICAgICAgaWYgKChwU2luZUxldmVsW2tdICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB8fCBub05vaXNlRmxhZykgeworICAgICAgICAvKiBKdXN0IHRoZSBhbXBsaWZpZWQgc2lnbmFsIGlzIHNhdmVkICovCisgICAgICAgICpwdHJSZWFsKysgPSBzaWduYWxSZWFsOworICAgICAgICAqcHRySW1hZysrID0gc2lnbmFsSW1hZzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEFkZCBub2lzZWZsb29yIHRvIHRoZSBhbXBsaWZpZWQgc2lnbmFsICovCisgICAgICAgIGluZGV4ICY9IChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOworICAgICAgICBub2lzZVJlYWwgPQorICAgICAgICAgICAgZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHNtb290aGVkTm9pc2UpCisgICAgICAgICAgICA8PCA0OworICAgICAgICBub2lzZUltYWcgPQorICAgICAgICAgICAgZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMV0sIHNtb290aGVkTm9pc2UpCisgICAgICAgICAgICA8PCA0OworICAgICAgICAqcHRyUmVhbCsrID0gKHNpZ25hbFJlYWwgKyBub2lzZVJlYWwpOworICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcgKyBub2lzZUltYWcpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGsgPSAwOyBrIDwgbm9TdWJiYW5kczsgaysrKSB7CisgICAgICBzbW9vdGhlZEdhaW4gPSBnYWluW2tdOworICAgICAgc2lnbmFsUmVhbCA9IGZNdWx0RGl2MigqcHRyUmVhbCwgc21vb3RoZWRHYWluKSA8PCBzY2FsZV9jaGFuZ2U7CisgICAgICBzaWduYWxJbWFnID0gZk11bHREaXYyKCpwdHJJbWFnLCBzbW9vdGhlZEdhaW4pIDw8IHNjYWxlX2NoYW5nZTsKKworICAgICAgaW5kZXgrKzsKKworICAgICAgaWYgKChwU2luZUxldmVsW2tdID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAmJiAobm9Ob2lzZUZsYWcgPT0gMCkpIHsKKyAgICAgICAgLyogQWRkIG5vaXNlZmxvb3IgdG8gdGhlIGFtcGxpZmllZCBzaWduYWwgKi8KKyAgICAgICAgc21vb3RoZWROb2lzZSA9IG5vaXNlTGV2ZWxba107CisgICAgICAgIGluZGV4ICY9IChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOworICAgICAgICBub2lzZVJlYWwgPQorICAgICAgICAgICAgZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHNtb290aGVkTm9pc2UpOworICAgICAgICBub2lzZUltYWcgPQorICAgICAgICAgICAgZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMV0sIHNtb290aGVkTm9pc2UpOworCisgICAgICAgIC8qIEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZSBpcyBkb3duc2NhbGVkIGJ5IDJeMyAqLworICAgICAgICBzaWduYWxSZWFsICs9IG5vaXNlUmVhbCA8PCA0OworICAgICAgICBzaWduYWxJbWFnICs9IG5vaXNlSW1hZyA8PCA0OworICAgICAgfQorICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7CisgICAgICAqcHRySW1hZysrID0gc2lnbmFsSW1hZzsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RIUV9BZGRIYXJtb25pY3MoCisgICAgRklYUF9EQkwgKlJFU1RSSUNUCisgICAgICAgIHB0clJlYWwsIC8qITwgU3ViYmFuZCBzYW1wbGVzIHRvIGJlIGFkanVzdGVkLCByZWFsIHBhcnQgKi8KKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QKKyAgICAgICAgcHRySW1hZywgLyohPCBTdWJiYW5kIHNhbXBsZXMgdG8gYmUgYWRqdXN0ZWQsIGltYWcgcGFydCAqLworICAgIEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhfc2JyX2NhbF9lbnYsIEVOVl9DQUxDX05SR1MgKm5yZ3MsCisgICAgaW50IGxvd1N1YmJhbmQsICAvKiE8IExvd2VzdCBRTUYtY2hhbm5lbCBpbiB0aGUgY3VycmVudGx5IHVzZWQgU0JSIHJhbmdlLiAqLworICAgIGludCBub1N1YmJhbmRzLCAgLyohPCBOdW1iZXIgb2YgUU1GIHN1YmJhbmRzICovCisgICAgaW50IHNjYWxlX2NoYW5nZSAvKiE8IFNjYWxlIG1pc21hdGNoIGJldHdlZW4gUU1GIGlucHV0IGFuZCBzaW5lTGV2ZWwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9uZW50LiAqLworKSB7CisgIEZJWFBfREJMICpSRVNUUklDVCBwU2luZUxldmVsID0gbnJncy0+bnJnU2luZTsgLyohPCBTaW5lIGxldmVscyAqLworICBVQ0hBUiAqUkVTVFJJQ1QgcHRySGFybUluZGV4ID0KKyAgICAgICZoX3Nicl9jYWxfZW52LT5oYXJtSW5kZXg7IC8qITwgSGFybW9uaWMgaW5kZXggKi8KKworICBpbnQgazsKKyAgRklYUF9EQkwgc2lnbmFsUmVhbCwgc2lnbmFsSW1hZzsKKyAgVUNIQVIgaGFybUluZGV4ID0gKnB0ckhhcm1JbmRleDsKKyAgaW50IGZyZXFJbnZGbGFnID0gKGxvd1N1YmJhbmQgJiAxKTsKKyAgRklYUF9EQkwgc2luZUxldmVsOworCisgICpwdHJIYXJtSW5kZXggPSAoaGFybUluZGV4ICsgMSkgJiAzOworCisgIGZvciAoayA9IDA7IGsgPCBub1N1YmJhbmRzOyBrKyspIHsKKyAgICBzaW5lTGV2ZWwgPSBwU2luZUxldmVsW2tdOworICAgIGZyZXFJbnZGbGFnIF49IDE7CisgICAgaWYgKHNpbmVMZXZlbCAhPSBGTDJGWENPTlNUX0RCTCgwLmYpKSB7CisgICAgICBzaWduYWxSZWFsID0gcHRyUmVhbFtrXTsKKyAgICAgIHNpZ25hbEltYWcgPSBwdHJJbWFnW2tdOworICAgICAgc2luZUxldmVsID0gc2NhbGVWYWx1ZShzaW5lTGV2ZWwsIHNjYWxlX2NoYW5nZSk7CisgICAgICBpZiAoaGFybUluZGV4ICYgMikgeworICAgICAgICAvKiBjYXNlIDIsMyAqLworICAgICAgICBzaW5lTGV2ZWwgPSAtc2luZUxldmVsOworICAgICAgfQorICAgICAgaWYgKCEoaGFybUluZGV4ICYgMSkpIHsKKyAgICAgICAgLyogY2FzZSAwLDI6ICovCisgICAgICAgIHB0clJlYWxba10gPSBzaWduYWxSZWFsICsgc2luZUxldmVsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogY2FzZSAxLDMgKi8KKyAgICAgICAgaWYgKCFmcmVxSW52RmxhZykgc2luZUxldmVsID0gLXNpbmVMZXZlbDsKKyAgICAgICAgcHRySW1hZ1trXSA9IHNpZ25hbEltYWcgKyBzaW5lTGV2ZWw7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIGFkanVzdFRpbWVTbG90SFEoCisgICAgRklYUF9EQkwgKlJFU1RSSUNUCisgICAgICAgIHB0clJlYWwsIC8qITwgU3ViYmFuZCBzYW1wbGVzIHRvIGJlIGFkanVzdGVkLCByZWFsIHBhcnQgKi8KKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1QKKyAgICAgICAgcHRySW1hZywgLyohPCBTdWJiYW5kIHNhbXBsZXMgdG8gYmUgYWRqdXN0ZWQsIGltYWcgcGFydCAqLworICAgIEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhfc2JyX2NhbF9lbnYsIEVOVl9DQUxDX05SR1MgKm5yZ3MsCisgICAgaW50IGxvd1N1YmJhbmQsIC8qITwgTG93ZXN0IFFNRi1jaGFubmVsIGluIHRoZSBjdXJyZW50bHkgdXNlZCBTQlIgcmFuZ2UuICovCisgICAgaW50IG5vU3ViYmFuZHMsIC8qITwgTnVtYmVyIG9mIFFNRiBzdWJiYW5kcyAqLworICAgIGludCBzY2FsZV9jaGFuZ2UsICAgICAgICAgLyohPCBOdW1iZXIgb2YgYml0cyB0byBzaGlmdCBhZGp1c3RlZCBzYW1wbGVzICovCisgICAgRklYUF9TR0wgc21vb3RoX3JhdGlvLCAgICAvKiE8IEltcGFjdCBvZiBsYXN0IGVudmVsb3BlICovCisgICAgaW50IG5vTm9pc2VGbGFnLCAgICAgICAgICAvKiE8IFN0YXJ0IGluZGV4IHRvIHJhbmRvbSBudW1iZXIgYXJyYXkgKi8KKyAgICBpbnQgZmlsdEJ1ZmZlck5vaXNlU2hpZnQpIC8qITwgU2hpZnQgZmFjdG9yIG9mIGZpbHRCdWZmZXJOb2lzZSAqLworeworICBGSVhQX0RCTCAqUkVTVFJJQ1QgZ2FpbiA9IG5yZ3MtPm5yZ0dhaW47IC8qITwgR2FpbnMgb2YgY3VycmVudCBlbnZlbG9wZSAqLworICBGSVhQX0RCTCAqUkVTVFJJQ1Qgbm9pc2VMZXZlbCA9CisgICAgICBucmdzLT5ub2lzZUxldmVsOyAvKiE8IE5vaXNlIGxldmVscyBvZiBjdXJyZW50IGVudmVsb3BlICovCisgIEZJWFBfREJMICpSRVNUUklDVCBwU2luZUxldmVsID0gbnJncy0+bnJnU2luZTsgLyohPCBTaW5lIGxldmVscyAqLworCisgIEZJWFBfREJMICpSRVNUUklDVCBmaWx0QnVmZmVyID0KKyAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXI7IC8qITwgR2FpbnMgb2YgbGFzdCBlbnZlbG9wZSAqLworICBGSVhQX0RCTCAqUkVTVFJJQ1QgZmlsdEJ1ZmZlck5vaXNlID0KKyAgICAgIGhfc2JyX2NhbF9lbnYtPmZpbHRCdWZmZXJOb2lzZTsgLyohPCBOb2lzZSBsZXZlbHMgb2YgbGFzdCBlbnZlbG9wZSAqLworICBVQ0hBUiAqUkVTVFJJQ1QgcHRySGFybUluZGV4ID0KKyAgICAgICZoX3Nicl9jYWxfZW52LT5oYXJtSW5kZXg7IC8qITwgSGFybW9uaWMgaW5kZXggKi8KKyAgaW50ICpSRVNUUklDVCBwdHJQaGFzZUluZGV4ID0KKyAgICAgICZoX3Nicl9jYWxfZW52LT5waGFzZUluZGV4OyAvKiE8IFN0YXJ0IGluZGV4IHRvIHJhbmRvbSBudW1iZXIgYXJyYXkgKi8KKworICBpbnQgazsKKyAgRklYUF9EQkwgc2lnbmFsUmVhbCwgc2lnbmFsSW1hZzsKKyAgRklYUF9EQkwgbm9pc2VSZWFsLCBub2lzZUltYWc7CisgIEZJWFBfREJMIHNtb290aGVkR2Fpbiwgc21vb3RoZWROb2lzZTsKKyAgRklYUF9TR0wgZGlyZWN0X3JhdGlvID0KKyAgICAgIC8qRkwyRlhDT05TVF9TR0woMS4wZikgKi8gKEZJWFBfU0dMKU1BWFZBTF9TR0wgLSBzbW9vdGhfcmF0aW87CisgIGludCBpbmRleCA9ICpwdHJQaGFzZUluZGV4OworICBVQ0hBUiBoYXJtSW5kZXggPSAqcHRySGFybUluZGV4OwogICBpbnQgZnJlcUludkZsYWcgPSAobG93U3ViYmFuZCAmIDEpOwogICBGSVhQX0RCTCBzaW5lTGV2ZWw7CiAgIGludCBzaGlmdDsKIAotICAqcHRyUGhhc2VJbmRleCA9IChpbmRleCtub1N1YmJhbmRzKSAmIChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOworICAqcHRyUGhhc2VJbmRleCA9IChpbmRleCArIG5vU3ViYmFuZHMpICYgKFNCUl9ORl9OT19SQU5ET01fVkFMIC0gMSk7CiAgICpwdHJIYXJtSW5kZXggPSAoaGFybUluZGV4ICsgMSkgJiAzOwogCiAgIC8qCkBAIC0yMDQ3LDMwICsyODcwLDI5IEBACiAgICAgb2YgdGhlIHdob2xlIGZ1bmN0aW9uIGRlY3JlYXNlZCBieSBhYm91dCAyMCAlCiAgICovCiAKLSAgZmlsdEJ1ZmZlck5vaXNlU2hpZnQgKz0gMTsgICAgICAvKiBkdWUgdG8gbGF0ZXIgdXNlIG9mIGZNdWx0RGl2MiBpbnN0ZWFkIG9mIGZNdWx0ICovCi0gIGlmIChmaWx0QnVmZmVyTm9pc2VTaGlmdDwwKQotICAgIHNoaWZ0ID0gZml4TWluKERGUkFDVF9CSVRTLTEsLWZpbHRCdWZmZXJOb2lzZVNoaWZ0KTsKKyAgZmlsdEJ1ZmZlck5vaXNlU2hpZnQgKz0KKyAgICAgIDE7IC8qIGR1ZSB0byBsYXRlciB1c2Ugb2YgZk11bHREaXYyIGluc3RlYWQgb2YgZk11bHQgKi8KKyAgaWYgKGZpbHRCdWZmZXJOb2lzZVNoaWZ0IDwgMCkKKyAgICBzaGlmdCA9IGZpeE1pbihERlJBQ1RfQklUUyAtIDEsIC1maWx0QnVmZmVyTm9pc2VTaGlmdCk7CiAgIGVsc2UKLSAgICBzaGlmdCA9IGZpeE1pbihERlJBQ1RfQklUUy0xLCBmaWx0QnVmZmVyTm9pc2VTaGlmdCk7CisgICAgc2hpZnQgPSBmaXhNaW4oREZSQUNUX0JJVFMgLSAxLCBmaWx0QnVmZmVyTm9pc2VTaGlmdCk7CiAKICAgaWYgKHNtb290aF9yYXRpbyA+IEZMMkZYQ09OU1RfU0dMKDAuMGYpKSB7Ci0KLSAgICBmb3IgKGs9MDsgazxub1N1YmJhbmRzOyBrKyspIHsKKyAgICBmb3IgKGsgPSAwOyBrIDwgbm9TdWJiYW5kczsgaysrKSB7CiAgICAgICAvKgogICAgICAgICBTbW9vdGhpbmc6IFRoZSBvbGQgZW52ZWxvcGUgaGFzIGJlZW4gYnVmZmVyZCBhbmQgYSBjZXJ0YWluIHJhdGlvCiAgICAgICAgIG9mIHRoZSBvbGQgZ2FpbnMgYW5kIG5vaXNlIGxldmVscyBpcyB1c2VkLgogICAgICAgKi8KIAotICAgICAgc21vb3RoZWRHYWluID0gZk11bHQoc21vb3RoX3JhdGlvLGZpbHRCdWZmZXJba10pICsKLSAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGRpcmVjdF9yYXRpbyxnYWluW2tdKTsKKyAgICAgIHNtb290aGVkR2FpbiA9CisgICAgICAgICAgZk11bHQoc21vb3RoX3JhdGlvLCBmaWx0QnVmZmVyW2tdKSArIGZNdWx0KGRpcmVjdF9yYXRpbywgZ2FpbltrXSk7CiAKLSAgICAgIGlmIChmaWx0QnVmZmVyTm9pc2VTaGlmdDwwKSB7Ci0gICAgICAgIHNtb290aGVkTm9pc2UgPSAoZk11bHREaXYyKHNtb290aF9yYXRpbyxmaWx0QnVmZmVyTm9pc2Vba10pPj5zaGlmdCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGRpcmVjdF9yYXRpbyxub2lzZUxldmVsW2tdKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBzbW9vdGhlZE5vaXNlID0gKGZNdWx0RGl2MihzbW9vdGhfcmF0aW8sZmlsdEJ1ZmZlck5vaXNlW2tdKTw8c2hpZnQpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChkaXJlY3RfcmF0aW8sbm9pc2VMZXZlbFtrXSk7CisgICAgICBpZiAoZmlsdEJ1ZmZlck5vaXNlU2hpZnQgPCAwKSB7CisgICAgICAgIHNtb290aGVkTm9pc2UgPSAoZk11bHREaXYyKHNtb290aF9yYXRpbywgZmlsdEJ1ZmZlck5vaXNlW2tdKSA+PiBzaGlmdCkgKworICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQoZGlyZWN0X3JhdGlvLCBub2lzZUxldmVsW2tdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNtb290aGVkTm9pc2UgPSAoZk11bHREaXYyKHNtb290aF9yYXRpbywgZmlsdEJ1ZmZlck5vaXNlW2tdKSA8PCBzaGlmdCkgKworICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQoZGlyZWN0X3JhdGlvLCBub2lzZUxldmVsW2tdKTsKICAgICAgIH0KIAogICAgICAgLyoKQEAgLTIwNzgsNTAgKzI5MDAsNTMgQEAKICAgICAgICAgb2YgdGhlIHNpZ25hbCBhbmQgc2hvdWxkIGJlIGNhcnJpZWQgb3V0IHdpdGggZnVsbCBhY2N1cmFjeQogICAgICAgICAoc3VwcGx5aW5nICNERlJBQ1RfQklUUyB2YWxpZCBiaXRzKS4KICAgICAgICovCi0gICAgICBzaWduYWxSZWFsID0gZk11bHREaXYyKCpwdHJSZWFsLHNtb290aGVkR2Fpbik8PCgoaW50KXNjYWxlX2NoYW5nZSk7Ci0gICAgICBzaWduYWxJbWFnID0gZk11bHREaXYyKCpwdHJJbWFnLHNtb290aGVkR2Fpbik8PCgoaW50KXNjYWxlX2NoYW5nZSk7CisgICAgICBzaWduYWxSZWFsID0gZk11bHREaXYyKCpwdHJSZWFsLCBzbW9vdGhlZEdhaW4pIDw8ICgoaW50KXNjYWxlX2NoYW5nZSk7CisgICAgICBzaWduYWxJbWFnID0gZk11bHREaXYyKCpwdHJJbWFnLCBzbW9vdGhlZEdhaW4pIDw8ICgoaW50KXNjYWxlX2NoYW5nZSk7CiAKICAgICAgIGluZGV4Kys7CiAKICAgICAgIGlmIChwU2luZUxldmVsW2tdICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CiAgICAgICAgIHNpbmVMZXZlbCA9IHBTaW5lTGV2ZWxba107CiAKLSAgICAgICAgc3dpdGNoKGhhcm1JbmRleCkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgKnB0clJlYWwrKyA9IChzaWduYWxSZWFsICsgc2luZUxldmVsKTsKLSAgICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgKnB0clJlYWwrKyA9IChzaWduYWxSZWFsIC0gc2luZUxldmVsKTsKLSAgICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgKnB0clJlYWwrKyA9IChzaWduYWxSZWFsKTsKLSAgICAgICAgICBpZiAoZnJlcUludkZsYWcpCi0gICAgICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcgLSBzaW5lTGV2ZWwpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICpwdHJJbWFnKysgPSAoc2lnbmFsSW1hZyArIHNpbmVMZXZlbCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAqcHRyUmVhbCsrID0gc2lnbmFsUmVhbDsKLSAgICAgICAgICBpZiAoZnJlcUludkZsYWcpCi0gICAgICAgICAgICAqcHRySW1hZysrID0gKHNpZ25hbEltYWcgKyBzaW5lTGV2ZWwpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICpwdHJJbWFnKysgPSAoc2lnbmFsSW1hZyAtIHNpbmVMZXZlbCk7Ci0gICAgICAgICAgYnJlYWs7CisgICAgICAgIHN3aXRjaCAoaGFybUluZGV4KSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgKnB0clJlYWwrKyA9IChzaWduYWxSZWFsICsgc2luZUxldmVsKTsKKyAgICAgICAgICAgICpwdHJJbWFnKysgPSAoc2lnbmFsSW1hZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAqcHRyUmVhbCsrID0gKHNpZ25hbFJlYWwgLSBzaW5lTGV2ZWwpOworICAgICAgICAgICAgKnB0ckltYWcrKyA9IChzaWduYWxJbWFnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICpwdHJSZWFsKysgPSAoc2lnbmFsUmVhbCk7CisgICAgICAgICAgICBpZiAoZnJlcUludkZsYWcpCisgICAgICAgICAgICAgICpwdHJJbWFnKysgPSAoc2lnbmFsSW1hZyAtIHNpbmVMZXZlbCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICpwdHJJbWFnKysgPSAoc2lnbmFsSW1hZyArIHNpbmVMZXZlbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAqcHRyUmVhbCsrID0gc2lnbmFsUmVhbDsKKyAgICAgICAgICAgIGlmIChmcmVxSW52RmxhZykKKyAgICAgICAgICAgICAgKnB0ckltYWcrKyA9IChzaWduYWxJbWFnICsgc2luZUxldmVsKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgKnB0ckltYWcrKyA9IChzaWduYWxJbWFnIC0gc2luZUxldmVsKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChub05vaXNlRmxhZykgewogICAgICAgICAgIC8qIEp1c3QgdGhlIGFtcGxpZmllZCBzaWduYWwgaXMgc2F2ZWQgKi8KICAgICAgICAgICAqcHRyUmVhbCsrID0gKHNpZ25hbFJlYWwpOwogICAgICAgICAgICpwdHJJbWFnKysgPSAoc2lnbmFsSW1hZyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgLyogQWRkIG5vaXNlZmxvb3IgdG8gdGhlIGFtcGxpZmllZCBzaWduYWwgKi8KICAgICAgICAgICBpbmRleCAmPSAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKLSAgICAgICAgICBub2lzZVJlYWwgPSBmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVswXSwgc21vb3RoZWROb2lzZSk8PDQ7Ci0gICAgICAgICAgbm9pc2VJbWFnID0gZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMV0sIHNtb290aGVkTm9pc2UpPDw0OworICAgICAgICAgIC8qIEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZSBpcyBkb3duc2NhbGVkIGJ5IDJeMyAqLworICAgICAgICAgIG5vaXNlUmVhbCA9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbaW5kZXhdWzBdLCBzbW9vdGhlZE5vaXNlKQorICAgICAgICAgICAgICA8PCA0OworICAgICAgICAgIG5vaXNlSW1hZyA9CisgICAgICAgICAgICAgIGZNdWx0RGl2MihGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbaW5kZXhdWzFdLCBzbW9vdGhlZE5vaXNlKQorICAgICAgICAgICAgICA8PCA0OwogICAgICAgICAgICpwdHJSZWFsKysgPSAoc2lnbmFsUmVhbCArIG5vaXNlUmVhbCk7CiAgICAgICAgICAgKnB0ckltYWcrKyA9IChzaWduYWxJbWFnICsgbm9pc2VJbWFnKTsKICAgICAgICAgfQpAQCAtMjEyOSw1MiArMjk1NCw0OCBAQAogICAgICAgZnJlcUludkZsYWcgXj0gMTsKICAgICB9CiAKLSAgfQotICBlbHNlIAotICB7Ci0gICAgZm9yIChrPTA7IGs8bm9TdWJiYW5kczsgaysrKSAKLSAgICB7Ci0gICAgICBzbW9vdGhlZEdhaW4gID0gZ2FpbltrXTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGsgPSAwOyBrIDwgbm9TdWJiYW5kczsgaysrKSB7CisgICAgICBzbW9vdGhlZEdhaW4gPSBnYWluW2tdOwogICAgICAgc2lnbmFsUmVhbCA9IGZNdWx0RGl2MigqcHRyUmVhbCwgc21vb3RoZWRHYWluKSA8PCBzY2FsZV9jaGFuZ2U7CiAgICAgICBzaWduYWxJbWFnID0gZk11bHREaXYyKCpwdHJJbWFnLCBzbW9vdGhlZEdhaW4pIDw8IHNjYWxlX2NoYW5nZTsKIAogICAgICAgaW5kZXgrKzsKIAotICAgICAgaWYgKChzaW5lTGV2ZWwgPSBwU2luZUxldmVsW2tdKSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAoaGFybUluZGV4KSAKLSAgICAgICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgc2lnbmFsUmVhbCArPSBzaW5lTGV2ZWw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICBpZiAoZnJlcUludkZsYWcpCi0gICAgICAgICAgICBzaWduYWxJbWFnIC09IHNpbmVMZXZlbDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzaWduYWxJbWFnICs9IHNpbmVMZXZlbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgIHNpZ25hbFJlYWwgLT0gc2luZUxldmVsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgaWYgKGZyZXFJbnZGbGFnKQotICAgICAgICAgICAgc2lnbmFsSW1hZyArPSBzaW5lTGV2ZWw7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc2lnbmFsSW1hZyAtPSBzaW5lTGV2ZWw7Ci0gICAgICAgICAgYnJlYWs7CisgICAgICBpZiAoKHNpbmVMZXZlbCA9IHBTaW5lTGV2ZWxba10pICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICAgIHN3aXRjaCAoaGFybUluZGV4KSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgc2lnbmFsUmVhbCArPSBzaW5lTGV2ZWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBpZiAoZnJlcUludkZsYWcpCisgICAgICAgICAgICAgIHNpZ25hbEltYWcgLT0gc2luZUxldmVsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBzaWduYWxJbWFnICs9IHNpbmVMZXZlbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHNpZ25hbFJlYWwgLT0gc2luZUxldmVsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgaWYgKGZyZXFJbnZGbGFnKQorICAgICAgICAgICAgICBzaWduYWxJbWFnICs9IHNpbmVMZXZlbDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgc2lnbmFsSW1hZyAtPSBzaW5lTGV2ZWw7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSAKLSAgICAgIHsKLSAgICAgICAgaWYgKG5vTm9pc2VGbGFnID09IDApCi0gICAgICAgIHsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChub05vaXNlRmxhZyA9PSAwKSB7CiAgICAgICAgICAgLyogQWRkIG5vaXNlZmxvb3IgdG8gdGhlIGFtcGxpZmllZCBzaWduYWwgKi8KICAgICAgICAgICBzbW9vdGhlZE5vaXNlID0gbm9pc2VMZXZlbFtrXTsKICAgICAgICAgICBpbmRleCAmPSAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKLSAgICAgICAgICBub2lzZVJlYWwgPSBmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVswXSwgc21vb3RoZWROb2lzZSk7Ci0gICAgICAgICAgbm9pc2VJbWFnID0gZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMV0sIHNtb290aGVkTm9pc2UpOwotICAgICAgICAgIHNpZ25hbFJlYWwgKz0gbm9pc2VSZWFsPDw0OwotICAgICAgICAgIHNpZ25hbEltYWcgKz0gbm9pc2VJbWFnPDw0OworICAgICAgICAgIG5vaXNlUmVhbCA9IGZNdWx0RGl2MihGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbaW5kZXhdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbW9vdGhlZE5vaXNlKTsKKyAgICAgICAgICBub2lzZUltYWcgPSBmTXVsdERpdjIoRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW2luZGV4XVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21vb3RoZWROb2lzZSk7CisKKyAgICAgICAgICAvKiBGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2UgaXMgZG93bnNjYWxlZCBieSAyXjMgKi8KKyAgICAgICAgICBzaWduYWxSZWFsICs9IG5vaXNlUmVhbCA8PCA0OworICAgICAgICAgIHNpZ25hbEltYWcgKz0gbm9pc2VJbWFnIDw8IDQ7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgICpwdHJSZWFsKysgPSBzaWduYWxSZWFsOwpAQCAtMjE4NSw3ICszMDA2LDYgQEAKICAgfQogfQogCi0KIC8qIQogICBcYnJpZWYgICBSZXNldCBsaW1pdGVyIGJhbmRzLgogCkBAIC0yMTk1LDE0ICszMDE1LDE1IEBACiAgIFxyZXR1cm4gIFNCUkRFQ19PSyBpZiBvaywgIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUcgb24gZXJyb3IKICovCiBTQlJfRVJST1IKLVJlc2V0TGltaXRlckJhbmRzICggVUNIQVIgKmxpbWl0ZXJCYW5kVGFibGUsICAgLyohPCBSZXN1bHRpbmcgYmFuZCBib3JkZXJzIGluIFFNRiBjaGFubmVscyAqLwotICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqbm9MaW1pdGVyQmFuZHMsICAgICAvKiE8IFJlc3VsdGluZyBudW1iZXIgb2YgbGltaXRlciBiYW5kICovCi0gICAgICAgICAgICAgICAgICAgIFVDSEFSICpmcmVxQmFuZFRhYmxlLCAgICAgIC8qITwgVGFibGUgd2l0aCBwb3NzaWJsZSBiYW5kIGJvcmRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgaW50IG5vRnJlcUJhbmRzLCAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBiYW5kcyBpbiBmcmVxQmFuZFRhYmxlICovCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFBBVENIX1BBUkFNICpwYXRjaFBhcmFtLCAgICAgLyohPCBUcmFuc3Bvc2VyIHBhdGNoIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgaW50IG5vUGF0Y2hlcywgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB0cmFuc3Bvc2VyIHBhdGNoZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgaW50IGxpbWl0ZXJCYW5kcykgICAgICAgICAgICAgICAgICAvKiE8IFNlbGVjdGVkICdiYW5kIGRlbnNpdHknIGZyb20gYml0c3RyZWFtICovCi17CitSZXNldExpbWl0ZXJCYW5kcygKKyAgICBVQ0hBUiAqbGltaXRlckJhbmRUYWJsZSwgLyohPCBSZXN1bHRpbmcgYmFuZCBib3JkZXJzIGluIFFNRiBjaGFubmVscyAqLworICAgIFVDSEFSICpub0xpbWl0ZXJCYW5kcywgICAvKiE8IFJlc3VsdGluZyBudW1iZXIgb2YgbGltaXRlciBiYW5kICovCisgICAgVUNIQVIgKmZyZXFCYW5kVGFibGUsICAgIC8qITwgVGFibGUgd2l0aCBwb3NzaWJsZSBiYW5kIGJvcmRlcnMgKi8KKyAgICBpbnQgbm9GcmVxQmFuZHMsICAgICAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgaW4gZnJlcUJhbmRUYWJsZSAqLworICAgIGNvbnN0IFBBVENIX1BBUkFNICpwYXRjaFBhcmFtLCAvKiE8IFRyYW5zcG9zZXIgcGF0Y2ggcGFyYW1ldGVycyAqLworICAgIGludCBub1BhdGNoZXMsICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB0cmFuc3Bvc2VyIHBhdGNoZXMgKi8KKyAgICBpbnQgbGltaXRlckJhbmRzLCAvKiE8IFNlbGVjdGVkICdiYW5kIGRlbnNpdHknIGZyb20gYml0c3RyZWFtICovCisgICAgVUNIQVIgc2JyUGF0Y2hpbmdNb2RlLCBpbnQgeE92ZXJRbWZbTUFYX05VTV9QQVRDSEVTXSwgaW50IGI0MVNicikgewogICBpbnQgaSwgaywgaXNQYXRjaEJvcmRlclsyXSwgbG9MaW1JbmRleCwgaGlMaW1JbmRleCwgdGVtcE5vTGltLCBuQmFuZHM7CiAgIFVDSEFSIHdvcmtMaW1pdGVyQmFuZFRhYmxlW01BWF9GUkVRX0NPRUZGUyAvIDIgKyBNQVhfTlVNX1BBVENIRVMgKyAxXTsKICAgaW50IHBhdGNoQm9yZGVyc1tNQVhfTlVNX1BBVENIRVMgKyAxXTsKQEAgLTIyMTIsMTMgKzMwMzMsMjggQEAKICAgaW50IGhpZ2hTdWJiYW5kID0gZnJlcUJhbmRUYWJsZVtub0ZyZXFCYW5kc107CiAKICAgLyogMSBsaW1pdGVyIGJhbmQuICovCi0gIGlmKGxpbWl0ZXJCYW5kcyA9PSAwKSB7CisgIGlmIChsaW1pdGVyQmFuZHMgPT0gMCkgewogICAgIGxpbWl0ZXJCYW5kVGFibGVbMF0gPSAwOwogICAgIGxpbWl0ZXJCYW5kVGFibGVbMV0gPSBoaWdoU3ViYmFuZCAtIGxvd1N1YmJhbmQ7CiAgICAgbkJhbmRzID0gMTsKICAgfSBlbHNlIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbm9QYXRjaGVzOyBpKyspIHsKLSAgICAgIHBhdGNoQm9yZGVyc1tpXSA9IHBhdGNoUGFyYW1baV0uZ3VhcmRTdGFydEJhbmQgLSBsb3dTdWJiYW5kOworICAgIGlmICghc2JyUGF0Y2hpbmdNb2RlICYmIHhPdmVyUW1mICE9IE5VTEwpIHsKKyAgICAgIG5vUGF0Y2hlcyA9IDA7CisKKyAgICAgIGlmIChiNDFTYnIgPT0gMSkgeworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTUFYX05VTV9QQVRDSEVTX0hCRTsgaSsrKQorICAgICAgICAgIGlmICh4T3ZlclFtZltpXSAhPSAwKSBub1BhdGNoZXMrKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBNQVhfU1RSRVRDSF9IQkU7IGkrKykKKyAgICAgICAgICBpZiAoeE92ZXJRbWZbaV0gIT0gMCkgbm9QYXRjaGVzKys7CisgICAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbm9QYXRjaGVzOyBpKyspIHsKKyAgICAgICAgcGF0Y2hCb3JkZXJzW2ldID0geE92ZXJRbWZbaV0gLSBsb3dTdWJiYW5kOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbm9QYXRjaGVzOyBpKyspIHsKKyAgICAgICAgcGF0Y2hCb3JkZXJzW2ldID0gcGF0Y2hQYXJhbVtpXS5ndWFyZFN0YXJ0QmFuZCAtIGxvd1N1YmJhbmQ7CisgICAgICB9CiAgICAgfQogICAgIHBhdGNoQm9yZGVyc1tpXSA9IGhpZ2hTdWJiYW5kIC0gbG93U3ViYmFuZDsKIApAQCAtMjIzNiwzNSArMzA3MiwzOCBAQAogICAgIGxvTGltSW5kZXggPSAwOwogICAgIGhpTGltSW5kZXggPSAxOwogCi0KICAgICB3aGlsZSAoaGlMaW1JbmRleCA8PSB0ZW1wTm9MaW0pIHsKICAgICAgIEZJWFBfREJMIGRpdl9tLCBvY3RfbSwgdGVtcDsKLSAgICAgIElOVCBkaXZfZSAgPSAwLCBvY3RfZSAgPSAwLCB0ZW1wX2UgPSAwOworICAgICAgSU5UIGRpdl9lID0gMCwgb2N0X2UgPSAwLCB0ZW1wX2UgPSAwOwogCiAgICAgICBrMiA9IHdvcmtMaW1pdGVyQmFuZFRhYmxlW2hpTGltSW5kZXhdICsgbG93U3ViYmFuZDsKICAgICAgIGt4ID0gd29ya0xpbWl0ZXJCYW5kVGFibGVbbG9MaW1JbmRleF0gKyBsb3dTdWJiYW5kOwogCi0gICAgICBkaXZfbSAgPSBmRGl2Tm9ybShrMiwga3gsICZkaXZfZSk7CisgICAgICBkaXZfbSA9IGZEaXZOb3JtKGsyLCBreCwgJmRpdl9lKTsKIAogICAgICAgLyogY2FsY3VsYXRlIG51bWJlciBvZiBvY3RhdmVzICovCi0gICAgICBvY3RfbSAgPSBmTG9nMihkaXZfbSwgZGl2X2UsICZvY3RfZSk7CisgICAgICBvY3RfbSA9IGZMb2cyKGRpdl9tLCBkaXZfZSwgJm9jdF9lKTsKIAogICAgICAgLyogbXVsdGlwbHkgd2l0aCBsaW1pdGVyYmFuZHMgcGVyIG9jdGF2ZSAgICAqLwogICAgICAgLyogdmFsdWVzIDEsIDEuMiwgMiwgMyAtPiBzY2FsZSBmYWN0b3Igb2YgMiAqLwotICAgICAgdGVtcCA9IGZNdWx0Tm9ybShvY3RfbSwgRkRLX3NickRlY29kZXJfc2JyX2xpbWl0ZXJCYW5kc1Blck9jdGF2ZURpdjRfREJMW2xpbWl0ZXJCYW5kc10sICZ0ZW1wX2UpOworICAgICAgdGVtcCA9IGZNdWx0Tm9ybSgKKyAgICAgICAgICBvY3RfbSwgRkRLX3NickRlY29kZXJfc2JyX2xpbWl0ZXJCYW5kc1Blck9jdGF2ZURpdjRfREJMW2xpbWl0ZXJCYW5kc10sCisgICAgICAgICAgJnRlbXBfZSk7CiAKLSAgICAgIC8qIG92ZXJhbGwgc2NhbGUgZmFjdG9yIG9mIHRlbXAgaXN0IGFkZGl0aW9uIG9mIHNjYWxlZmFjdG9ycyBmcm9tIGxvZzIgY2FsY3VsYXRpb24sCi0gICAgICAgICBsaW1pdGVyIGJhbmRzIHNjYWxlZmFjdG9yICgyKSBhbmQgbGltaXRlciBiYW5kcyBtdWx0aXBsaWNhdGlvbiAqLworICAgICAgLyogb3ZlcmFsbCBzY2FsZSBmYWN0b3Igb2YgdGVtcCBpc3QgYWRkaXRpb24gb2Ygc2NhbGVmYWN0b3JzIGZyb20gbG9nMgorICAgICAgICAgY2FsY3VsYXRpb24sIGxpbWl0ZXIgYmFuZHMgc2NhbGVmYWN0b3IgKDIpIGFuZCBsaW1pdGVyIGJhbmRzCisgICAgICAgICBtdWx0aXBsaWNhdGlvbiAqLwogICAgICAgdGVtcF9lICs9IG9jdF9lICsgMjsKIAogICAgICAgLyogICAgZGl2IGNhbiBiZSBhIG1heGltdW0gb2YgNjQgKGsyID0gNjQgYW5kIGt4ID0gMSkKICAgICAgICAgIC0+IG9jdCBjYW4gYmUgYSBtYXhpbXVtIG9mIDYKLSAgICAgICAgIC0+IHRlbXAgY2FuIGJlIGEgbWF4aW11bSBvZiAxOCAoYXMgbGltaXRlckJhbmRzUGVyT2N0b2F2ZSBpcyBhIG1heGltdW0gZmFjdG9yIG9mIDMpCisgICAgICAgICAtPiB0ZW1wIGNhbiBiZSBhIG1heGltdW0gb2YgMTggKGFzIGxpbWl0ZXJCYW5kc1Blck9jdG9hdmUgaXMgYSBtYXhpbXVtCisgICAgICAgICBmYWN0b3Igb2YgMykKICAgICAgICAgIC0+IHdlIG5lZWQgYSBzY2FsZSBmYWN0b3Igb2YgNSBmb3IgY29tcGFyaXNzb24KICAgICAgICovCi0gICAgICBpZiAodGVtcCA+PiAoNSAtIHRlbXBfZSkgPCBGTDJGWENPTlNUX0RCTCAoMC40OWYpID4+IDUpIHsKLQotICAgICAgICBpZiAod29ya0xpbWl0ZXJCYW5kVGFibGVbaGlMaW1JbmRleF0gPT0gd29ya0xpbWl0ZXJCYW5kVGFibGVbbG9MaW1JbmRleF0pIHsKKyAgICAgIGlmICh0ZW1wID4+ICg1IC0gdGVtcF9lKSA8IEZMMkZYQ09OU1RfREJMKDAuNDlmKSA+PiA1KSB7CisgICAgICAgIGlmICh3b3JrTGltaXRlckJhbmRUYWJsZVtoaUxpbUluZGV4XSA9PQorICAgICAgICAgICAgd29ya0xpbWl0ZXJCYW5kVGFibGVbbG9MaW1JbmRleF0pIHsKICAgICAgICAgICB3b3JrTGltaXRlckJhbmRUYWJsZVtoaUxpbUluZGV4XSA9IGhpZ2hTdWJiYW5kOwogICAgICAgICAgIG5CYW5kcy0tOwogICAgICAgICAgIGhpTGltSW5kZXgrKzsKQEAgLTIyOTYsMTIgKzMxMzUsMTEgQEAKICAgICAgIH0KICAgICAgIGxvTGltSW5kZXggPSBoaUxpbUluZGV4OwogICAgICAgaGlMaW1JbmRleCsrOwotCiAgICAgfQogICAgIHNoZWxsc29ydCh3b3JrTGltaXRlckJhbmRUYWJsZSwgdGVtcE5vTGltICsgMSk7CiAKICAgICAvKiBUZXN0IGlmIGFsZ29yaXRobSBleGNlZWRlZCBtYXhpbXVtIGFsbG93ZWQgbGltaXRlcmJhbmRzICovCi0gICAgaWYoIG5CYW5kcyA+IE1BWF9OVU1fTElNSVRFUlMgfHwgbkJhbmRzIDw9IDApIHsKKyAgICBpZiAobkJhbmRzID4gTUFYX05VTV9MSU1JVEVSUyB8fCBuQmFuZHMgPD0gMCkgewogICAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CiAgICAgfQogCkBAIC0yMzE0LDQgKzMxNTIsMyBAQAogCiAgIHJldHVybiBTQlJERUNfT0s7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvZW52X2NhbGMuaCBiL2xpYlNCUmRlYy9zcmMvZW52X2NhbGMuaAppbmRleCA4MTU0MTY2Li5jZmYzNjVkIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL2Vudl9jYWxjLmgKKysrIGIvbGliU0JSZGVjL3NyYy9lbnZfY2FsYy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDg3ICs5MCw5MyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIEVudmVsb3BlIGNhbGN1bGF0aW9uIHByb3RvdHlwZXMgIAorICBcYnJpZWYgIEVudmVsb3BlIGNhbGN1bGF0aW9uIHByb3RvdHlwZXMKICovCi0jaWZuZGVmIF9fRU5WX0NBTENfSAotI2RlZmluZSBfX0VOVl9DQUxDX0gKKyNpZm5kZWYgRU5WX0NBTENfSAorI2RlZmluZSBFTlZfQ0FMQ19ICiAKICNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCi0jaW5jbHVkZSAiZW52X2V4dHIuaCIgIC8qIGZvciBIQU5ETEVfU0JSX0hFQURFUl9EQVRBICovCi0jaW5jbHVkZSAic2JyX3NjYWxlLmgiCisjaW5jbHVkZSAiZW52X2V4dHIuaCIgLyogZm9yIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgKi8KIAordHlwZWRlZiBzdHJ1Y3QgeworICBGSVhQX0RCTCBmaWx0QnVmZmVyW01BWF9GUkVRX0NPRUZGU107ICAgICAgLyohPCBwcmV2aW91cyBnYWlucyAocmVxdWlyZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbW9vdGhpbmcpICovCisgIEZJWFBfREJMIGZpbHRCdWZmZXJOb2lzZVtNQVhfRlJFUV9DT0VGRlNdOyAvKiE8IHByZXZpb3VzIG5vaXNlIGxldmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcXVpcmVkIGZvciBzbW9vdGhpbmcpICovCisgIFNDSEFSIGZpbHRCdWZmZXJfZVtNQVhfRlJFUV9DT0VGRlNdOyAgICAgICAvKiE8IEV4cG9uZW50cyBvZiBwcmV2aW91cyBnYWlucyAqLworICBTQ0hBUiBmaWx0QnVmZmVyTm9pc2VfZTsgLyohPCBDb21tb24gZXhwb25lbnQgb2YgcHJldmlvdXMgbm9pc2UgbGV2ZWxzICovCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIEZJWFBfREJMICBmaWx0QnVmZmVyW01BWF9GUkVRX0NPRUZGU107ICAgICAgICAgIC8qITwgcHJldmlvdXMgZ2FpbnMgKHJlcXVpcmVkIGZvciBzbW9vdGhpbmcpICovCi0gIEZJWFBfREJMICBmaWx0QnVmZmVyTm9pc2VbTUFYX0ZSRVFfQ09FRkZTXTsgICAgIC8qITwgcHJldmlvdXMgbm9pc2UgbGV2ZWxzIChyZXF1aXJlZCBmb3Igc21vb3RoaW5nKSAqLwotICBTQ0hBUiAgICAgZmlsdEJ1ZmZlcl9lW01BWF9GUkVRX0NPRUZGU107ICAgICAgICAvKiE8IEV4cG9uZW50cyBvZiBwcmV2aW91cyBnYWlucyAqLwotICBTQ0hBUiAgICAgZmlsdEJ1ZmZlck5vaXNlX2U7ICAgICAgICAgICAgICAgICAgICAvKiE8IENvbW1vbiBleHBvbmVudCBvZiBwcmV2aW91cyBub2lzZSBsZXZlbHMgKi8KKyAgaW50IHN0YXJ0VXA7ICAgICAvKiE8IGZsYWcgdG8gc2lnbmFsIGluaXRpYWwgY29uZGl0aW9ucyBpbiBidWZmZXJzICovCisgIGludCBwaGFzZUluZGV4OyAgLyohPCBJbmRleCBmb3IgcmFuZG9tUGFzZSBhcnJheSAqLworICBpbnQgcHJldlRyYW5FbnY7IC8qITwgVGhlIHRyYW5zaWVudCBlbnZlbG9wZSBvZiB0aGUgcHJldmlvdXMgZnJhbWUuICovCiAKLSAgaW50IHN0YXJ0VXA7ICAgICAgICAgICAgICAgLyohPCBmbGFnIHRvIHNpZ25hbCBpbml0aWFsIGNvbmRpdGlvbnMgaW4gYnVmZmVycyAqLwotICBpbnQgcGhhc2VJbmRleDsgICAgICAgICAgICAvKiE8IEluZGV4IGZvciByYW5kb21QYXNlIGFycmF5ICovCi0gIGludCBwcmV2VHJhbkVudjsgICAgICAgICAgIC8qITwgVGhlIHRyYW5zaWVudCBlbnZlbG9wZSBvZiB0aGUgcHJldmlvdXMgZnJhbWUuICovCisgIFVMT05HIGhhcm1GbGFnc1ByZXZbQUREX0hBUk1PTklDU19GTEFHU19TSVpFXTsKKyAgLyohPCBXb3JkcyB3aXRoIDE2IGZsYWdzIGVhY2ggaW5kaWNhdGluZyB3aGVyZSBhIHNpbmUgd2FzIGFkZGVkIGluIHRoZQorICAgKiBwcmV2aW91cyBmcmFtZS4qLworICBVQ0hBUiBoYXJtSW5kZXg7ICAgICAvKiE8IEN1cnJlbnQgcGhhc2Ugb2Ygc3ludGhldGljIHNpbmUgKi8KKyAgaW50IHNiclBhdGNoaW5nTW9kZTsgLyohPCBDdXJyZW50IHBhdGNoaW5nIG1vZGUgICAgICAgICAgICovCiAKLSAgaW50IGhhcm1GbGFnc1ByZXZbKE1BWF9GUkVRX0NPRUZGUysxNSkvMTZdOwotICAvKiE8IFdvcmRzIHdpdGggMTYgZmxhZ3MgZWFjaCBpbmRpY2F0aW5nIHdoZXJlIGEgc2luZSB3YXMgYWRkZWQgaW4gdGhlIHByZXZpb3VzIGZyYW1lLiovCi0gIFVDSEFSIGhhcm1JbmRleDsgICAgICAgICAgICAvKiE8IEN1cnJlbnQgcGhhc2Ugb2Ygc3ludGhldGljIHNpbmUgKi8KLQotfQotU0JSX0NBTENVTEFURV9FTlZFTE9QRTsKKyAgRklYUF9TR0wgcHJldlNick5vaXNlRmxvb3JMZXZlbFtNQVhfTk9JU0VfQ09FRkZTXTsKKyAgVUNIQVIgcHJldk5OZmI7CisgIFVDSEFSIHByZXZOU2ZiWzJdOworICBVQ0hBUiBwcmV2TG9TdWJiYW5kOworICBVQ0hBUiBwcmV2SGlTdWJiYW5kOworICBVQ0hBUiBwcmV2X292X2hpZ2hTdWJiYW5kOworICBVQ0hBUiAqcHJldkZyZXFCYW5kVGFibGVbMl07CisgIFVDSEFSIHByZXZGcmVxQmFuZFRhYmxlTG9bTUFYX0ZSRVFfQ09FRkZTIC8gMiArIDFdOworICBVQ0hBUiBwcmV2RnJlcUJhbmRUYWJsZUhpW01BWF9GUkVRX0NPRUZGUyArIDFdOworICBVQ0hBUiBwcmV2RnJlcUJhbmRUYWJsZU5vaXNlW01BWF9OT0lTRV9DT0VGRlMgKyAxXTsKKyAgU0NIQVIgc2ludXNvaWRhbF9wb3NpdGlvblByZXY7CisgIFVMT05HIGhhcm1GbGFnc1ByZXZBY3RpdmVbQUREX0hBUk1PTklDU19GTEFHU19TSVpFXTsKK30gU0JSX0NBTENVTEFURV9FTlZFTE9QRTsKIAogdHlwZWRlZiBTQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFICpIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRTsKIAotCi0KLXZvaWQKLWNhbGN1bGF0ZVNickVudmVsb3BlIChRTUZfU0NBTEVfRkFDVE9SICAqc2JyU2NhbGVGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaF9zYnJfY2FsX2VudiwKLSAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoRnJhbWVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqYW5hbHlzQnVmZmVyUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmFuYWx5c0J1ZmZlckltYWcsICAgICAgICAgICAgICAgICAvKiE8IEltYWcgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgdG8gYmUgcHJvY2Vzc2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHVzZUxQLAotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpkZWdyZWVBbGlhcywgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRXN0aW1hdGVkIGFsaWFzaW5nIGZvciBlYWNoIFFNRiBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZnJhbWVFcnJvckZsYWcKLSAgICAgICAgICAgICAgICAgICAgICApOwordm9pZCBjYWxjdWxhdGVTYnJFbnZlbG9wZSgKKyAgICBRTUZfU0NBTEVfRkFDVE9SICpzYnJTY2FsZUZhY3RvciwKKyAgICBIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoX3Nicl9jYWxfZW52LAorICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoRnJhbWVEYXRhLAorICAgIFBWQ19EWU5BTUlDX0RBVEEgKnBQdmNEeW5hbWljRGF0YSwgRklYUF9EQkwgKiphbmFseXNCdWZmZXJSZWFsLAorICAgIEZJWFBfREJMICoKKyAgICAgICAgKmFuYWx5c0J1ZmZlckltYWcsIC8qITwgSW1hZyBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICBjb25zdCBpbnQgdXNlTFAsCisgICAgRklYUF9EQkwgKmRlZ3JlZUFsaWFzLCAvKiE8IEVzdGltYXRlZCBhbGlhc2luZyBmb3IgZWFjaCBRTUYgY2hhbm5lbCAqLworICAgIGNvbnN0IFVJTlQgZmxhZ3MsIGNvbnN0IGludCBmcmFtZUVycm9yRmxhZyk7CiAKIFNCUl9FUlJPUgotY3JlYXRlU2JyRW52ZWxvcGVDYWxjIChIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoU2JyQ2FsY3VsYXRlRW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjaGFuLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzKTsKK2NyZWF0ZVNickVudmVsb3BlQ2FsYyhIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoU2JyQ2FsY3VsYXRlRW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgY29uc3QgaW50IGNoYW4sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncyk7CiAKLWludAotZGVsZXRlU2JyRW52ZWxvcGVDYWxjIChIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoU2JyQ2FsY3VsYXRlRW52ZWxvcGUpOworaW50IGRlbGV0ZVNickVudmVsb3BlQ2FsYyhIQU5ETEVfU0JSX0NBTENVTEFURV9FTlZFTE9QRSBoU2JyQ2FsY3VsYXRlRW52ZWxvcGUpOwogCi12b2lkCi1yZXNldFNickVudmVsb3BlQ2FsYyAoSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaENhbEVudik7Cit2b2lkIHJlc2V0U2JyRW52ZWxvcGVDYWxjKEhBTkRMRV9TQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIGhDYWxFbnYpOwogCiBTQlJfRVJST1IKLVJlc2V0TGltaXRlckJhbmRzICggVUNIQVIgKmxpbWl0ZXJCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgIFVDSEFSICpub0xpbWl0ZXJCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmZyZXFCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgIGludCBub0ZyZXFCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgUEFUQ0hfUEFSQU0gKnBhdGNoUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgIGludCBub1BhdGNoZXMsCi0gICAgICAgICAgICAgICAgICAgIGludCBsaW1pdGVyQmFuZHMpOworUmVzZXRMaW1pdGVyQmFuZHMoVUNIQVIgKmxpbWl0ZXJCYW5kVGFibGUsIFVDSEFSICpub0xpbWl0ZXJCYW5kcywKKyAgICAgICAgICAgICAgICAgIFVDSEFSICpmcmVxQmFuZFRhYmxlLCBpbnQgbm9GcmVxQmFuZHMsCisgICAgICAgICAgICAgICAgICBjb25zdCBQQVRDSF9QQVJBTSAqcGF0Y2hQYXJhbSwgaW50IG5vUGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgIGludCBsaW1pdGVyQmFuZHMsIFVDSEFSIHNiclBhdGNoaW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgIGludCB4T3ZlclFtZltNQVhfTlVNX1BBVENIRVNdLCBpbnQgc2JyUmF0aW8pOwogCi12b2lkIHJlc2NhbGVTdWJiYW5kU2FtcGxlcyggRklYUF9EQkwgKiogcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiogaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvd1N1YmJhbmQsIGludCBub1N1YmJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9wb3MsICBpbnQgbmV4dF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoaWZ0KTsKK3ZvaWQgcmVzY2FsZVN1YmJhbmRTYW1wbGVzKEZJWFBfREJMICoqcmUsIEZJWFBfREJMICoqaW0sIGludCBsb3dTdWJiYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vU3ViYmFuZHMsIGludCBzdGFydF9wb3MsIGludCBuZXh0X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGlmdCk7CiAKLUZJWFBfREJMIG1heFN1YmJhbmRTYW1wbGUoIEZJWFBfREJMICoqIGFuYWx5c0J1ZmZlclJlYWxfbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqIGFuYWx5c0J1ZmZlckltYWdfbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb3dTdWJiYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpZ2hTdWJiYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdG9wX3Bvcyk7CitGSVhQX0RCTCBtYXhTdWJiYW5kU2FtcGxlKEZJWFBfREJMICoqYW5hbHlzQnVmZmVyUmVhbF9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmFuYWx5c0J1ZmZlckltYWdfbSwgaW50IGxvd1N1YmJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaWdoU3ViYmFuZCwgaW50IHN0YXJ0X3BvcywgaW50IHN0b3BfcG9zKTsKIAotI2VuZGlmIC8vIF9fRU5WX0NBTENfSAorI2VuZGlmICAvLyBFTlZfQ0FMQ19ICmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL2Vudl9kZWMuY3BwIGIvbGliU0JSZGVjL3NyYy9lbnZfZGVjLmNwcAppbmRleCBjNjVjMTY5Li44OGM5MmNkIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL2Vudl9kZWMuY3BwCisrKyBiL2xpYlNCUmRlYy9zcmMvZW52X2RlYy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTMgKzkwLDIxIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgZW52ZWxvcGUgZGVjb2RpbmcgIAotICBUaGlzIG1vZHVsZSBwcm92aWRlcyBlbnZlbG9wZSBkZWNvZGluZyBhbmQgZXJyb3IgY29uY2VhbG1lbnQgYWxnb3JpdGhtcy4gVGhlIG1haW4KLSAgZW50cnkgcG9pbnQgaXMgZGVjb2RlU2JyRGF0YSgpLgorICBcYnJpZWYgIGVudmVsb3BlIGRlY29kaW5nCisgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGVudmVsb3BlIGRlY29kaW5nIGFuZCBlcnJvciBjb25jZWFsbWVudCBhbGdvcml0aG1zLiBUaGUKKyAgbWFpbiBlbnRyeSBwb2ludCBpcyBkZWNvZGVTYnJEYXRhKCkuCiAKICAgXHNhIGRlY29kZVNickRhdGEoKSxccmVmIGRvY3VtZW50YXRpb25PdmVydmlldwogKi8KQEAgLTk3LDQzICsxMTYsNDEgQEAKIAogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAKK3N0YXRpYyB2b2lkIGRlY29kZUVudmVsb3BlKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9zYnJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGFfb3RoZXJDaGFubmVsKTsKK3N0YXRpYyB2b2lkIHNicl9lbnZlbG9wZV91bm1hcHBpbmcoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZGF0YV9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9kYXRhX3JpZ2h0KTsKK3N0YXRpYyB2b2lkIHJlcXVhbnRpemVFbnZlbG9wZURhdGEoSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbXBSZXNvbHV0aW9uKTsKK3N0YXRpYyB2b2lkIGRlbHRhVG9MaW5lYXJQY21FbnZlbG9wZURlY29kaW5nKAorICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLAorICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhKTsKK3N0YXRpYyB2b2lkIGRlY29kZU5vaXNlRmxvb3JsZXZlbHMoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhKTsKK3N0YXRpYyB2b2lkIHRpbWVDb21wZW5zYXRlRmlyc3RFbnZlbG9wZShIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhKTsKK3N0YXRpYyBpbnQgY2hlY2tFbnZlbG9wZURhdGEoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhKTsKIAotc3RhdGljIHZvaWQgZGVjb2RlRW52ZWxvcGUgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGFfb3RoZXJDaGFubmVsKTsKLXN0YXRpYyB2b2lkIHNicl9lbnZlbG9wZV91bm1hcHBpbmcgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9kYXRhX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9kYXRhX3JpZ2h0KTsKLXN0YXRpYyB2b2lkIHJlcXVhbnRpemVFbnZlbG9wZURhdGEgKEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFtcFJlc29sdXRpb24pOwotc3RhdGljIHZvaWQgZGVsdGFUb0xpbmVhclBjbUVudmVsb3BlRGVjb2RpbmcgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGEpOwotc3RhdGljIHZvaWQgZGVjb2RlTm9pc2VGbG9vcmxldmVscyAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGEpOwotc3RhdGljIHZvaWQgdGltZUNvbXBlbnNhdGVGaXJzdEVudmVsb3BlIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9zYnJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGEpOwotc3RhdGljIGludCBjaGVja0VudmVsb3BlRGF0YSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGEpOworI2RlZmluZSBTQlJfRU5FUkdZX1BBTl9PRkZTRVQgKDEyIDw8IEVOVl9FWFBfRlJBQ1QpCisjZGVmaW5lIFNCUl9NQVhfRU5FUkdZICgzNSA8PCBFTlZfRVhQX0ZSQUNUKQogCi0KLQotI2RlZmluZSBTQlJfRU5FUkdZX1BBTl9PRkZTRVQgICAoMTIgPDwgRU5WX0VYUF9GUkFDVCkKLSNkZWZpbmUgU0JSX01BWF9FTkVSR1kgICAgICAgICAgKDM1IDw8IEVOVl9FWFBfRlJBQ1QpCi0KLSNkZWZpbmUgREVDQVkgICAgICAgICAgICAgICAgICAgKCAxIDw8IEVOVl9FWFBfRlJBQ1QpCisjZGVmaW5lIERFQ0FZICgxIDw8IEVOVl9FWFBfRlJBQ1QpCiAKICNpZiBFTlZfRVhQX0ZSQUNUCi0jZGVmaW5lIERFQ0FZX0NPVVBMSU5HICAgICAgICAgICggMSA8PCAoRU5WX0VYUF9GUkFDVC0xKSApIC8qITwgY29ycmVzcG9uZHMgdG8gYSB2YWx1ZSBvZiAwLjUgKi8KKyNkZWZpbmUgREVDQVlfQ09VUExJTkcgXAorICAoMSA8PCAoRU5WX0VYUF9GUkFDVCAtIDEpKSAvKiE8IGNvcnJlc3BvbmRzIHRvIGEgdmFsdWUgb2YgMC41ICovCiAjZWxzZQotI2RlZmluZSBERUNBWV9DT1VQTElORyAgICAgICAgICAgIDEgIC8qITwgSWYgdGhlIGVuZXJneSBkYXRhIGlzIG5vdCBzaGlmdGVkLCB1c2UgMSBpbnN0ZWFkIG9mIDAuNSAqLworI2RlZmluZSBERUNBWV9DT1VQTElORyBcCisgIDEgLyohPCBJZiB0aGUgZW5lcmd5IGRhdGEgaXMgbm90IHNoaWZ0ZWQsIHVzZSAxIGluc3RlYWQgb2YgMC41ICovCiAjZW5kaWYKIAotCiAvKiEKICAgXGJyaWVmICBDb252ZXJ0IHRhYmxlIGluZGV4CiAqLwpAQCAtMTQxLDI5ICsxNTgsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsICAvKiE8IGluZGV4IHRvIHNjYWxlZmFjdG9yIGJhbmQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzKSAgICAvKiE8IGZyZXF1ZW5jeSByZXNvbHV0aW9uICovCiB7Ci0gIGlmKHJlcyA9PSAwKQotICB7Ci0gICAgaWYgKG9mZnNldCA+PSAwKQotICAgIHsKLSAgICAgICAgaWYgKGluZGV4IDwgb2Zmc2V0KQotICAgICAgICAgIHJldHVybihpbmRleCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4oMippbmRleCAtIG9mZnNldCk7CisgIGlmIChyZXMgPT0gMCkgeworICAgIGlmIChvZmZzZXQgPj0gMCkgeworICAgICAgaWYgKGluZGV4IDwgb2Zmc2V0KQorICAgICAgICByZXR1cm4gKGluZGV4KTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICgyICogaW5kZXggLSBvZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICBvZmZzZXQgPSAtb2Zmc2V0OworICAgICAgaWYgKGluZGV4IDwgb2Zmc2V0KQorICAgICAgICByZXR1cm4gKDIgKiBpbmRleCArIGluZGV4KTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICgyICogaW5kZXggKyBvZmZzZXQpOwogICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0OwotICAgICAgICBpZiAoaW5kZXggPCBvZmZzZXQpCi0gICAgICAgICAgcmV0dXJuKDIqaW5kZXgraW5kZXgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcmV0dXJuKDIqaW5kZXggKyBvZmZzZXQpOwotICAgIH0KLSAgfQotICBlbHNlCi0gICAgcmV0dXJuKGluZGV4KTsKKyAgfSBlbHNlCisgICAgcmV0dXJuIChpbmRleCk7CiB9CiAKLQogLyohCiAgIFxicmllZiAgVXBkYXRlIHByZXZpb3VzIGVudmVsb3BlIHZhbHVlIGZvciBkZWx0YS1jb2RpbmcKIApAQCAtMTczLDExNSArMTg0LDExOSBAQAogICBsb3cgZnJlcXVlbmN5IHJlc29sdXRpb24sIHRoZSBlbmVyZ3kgdmFsdWUgd2lsbCBiZSBtYXBwZWQgdG8gdGhlCiAgIGNvcnJlc3BvbmRpbmcgaGlnaC1yZXMgYmFuZHMuCiAqLwotc3RhdGljIHZvaWQgbWFwTG93UmVzRW5lcmd5VmFsKEZJWFBfU0dMIGN1cnJWYWwsICAvKiE8IGN1cnJlbnQgZW5lcmd5IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wqIHByZXZEYXRhLC8qITwgcG9pbnRlciB0byBwcmV2aW91cyBkYXRhIHZlY3RvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsICAgICAgLyohPCBtYXBwaW5nIGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgICAgICAgLyohPCBpbmRleCB0byBzY2FsZWZhY3RvciBiYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcykgICAgICAgICAvKiE8IGZyZXF1ZW55IHJlc29sdXRpb24gKi8KK3N0YXRpYyB2b2lkIG1hcExvd1Jlc0VuZXJneVZhbCgKKyAgICBGSVhQX1NHTCBjdXJyVmFsLCAgIC8qITwgY3VycmVudCBlbmVyZ3kgdmFsdWUgKi8KKyAgICBGSVhQX1NHTCAqcHJldkRhdGEsIC8qITwgcG9pbnRlciB0byBwcmV2aW91cyBkYXRhIHZlY3RvciAqLworICAgIGludCBvZmZzZXQsICAgICAgICAgLyohPCBtYXBwaW5nIGZhY3RvciAqLworICAgIGludCBpbmRleCwgICAgICAgICAgLyohPCBpbmRleCB0byBzY2FsZWZhY3RvciBiYW5kICovCisgICAgaW50IHJlcykgICAgICAgICAgICAvKiE8IGZyZXF1ZW55IHJlc29sdXRpb24gKi8KIHsKLSAgaWYocmVzID09IDApCi0gIHsKLSAgICBpZiAob2Zmc2V0ID49IDApCi0gICAgewotICAgICAgICBpZihpbmRleCA8IG9mZnNldCkKLSAgICAgICAgICAgIHByZXZEYXRhW2luZGV4XSA9IGN1cnJWYWw7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHJldkRhdGFbMippbmRleCAtIG9mZnNldF0gPSBjdXJyVmFsOwotICAgICAgICAgICAgcHJldkRhdGFbMippbmRleCsxIC0gb2Zmc2V0XSA9IGN1cnJWYWw7Ci0gICAgICAgIH0KKyAgaWYgKHJlcyA9PSAwKSB7CisgICAgaWYgKG9mZnNldCA+PSAwKSB7CisgICAgICBpZiAoaW5kZXggPCBvZmZzZXQpCisgICAgICAgIHByZXZEYXRhW2luZGV4XSA9IGN1cnJWYWw7CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJldkRhdGFbMiAqIGluZGV4IC0gb2Zmc2V0XSA9IGN1cnJWYWw7CisgICAgICAgIHByZXZEYXRhWzIgKiBpbmRleCArIDEgLSBvZmZzZXRdID0gY3VyclZhbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKKyAgICAgIGlmIChpbmRleCA8IG9mZnNldCkgeworICAgICAgICBwcmV2RGF0YVszICogaW5kZXhdID0gY3VyclZhbDsKKyAgICAgICAgcHJldkRhdGFbMyAqIGluZGV4ICsgMV0gPSBjdXJyVmFsOworICAgICAgICBwcmV2RGF0YVszICogaW5kZXggKyAyXSA9IGN1cnJWYWw7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmV2RGF0YVsyICogaW5kZXggKyBvZmZzZXRdID0gY3VyclZhbDsKKyAgICAgICAgcHJldkRhdGFbMiAqIGluZGV4ICsgMSArIG9mZnNldF0gPSBjdXJyVmFsOworICAgICAgfQogICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0OwotICAgICAgICBpZiAoaW5kZXggPCBvZmZzZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZXZEYXRhWzMqaW5kZXhdID0gY3VyclZhbDsKLSAgICAgICAgICAgIHByZXZEYXRhWzMqaW5kZXgrMV0gPSBjdXJyVmFsOwotICAgICAgICAgICAgcHJldkRhdGFbMyppbmRleCsyXSA9IGN1cnJWYWw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmV2RGF0YVsyKmluZGV4ICsgb2Zmc2V0XSA9IGN1cnJWYWw7Ci0gICAgICAgICAgICBwcmV2RGF0YVsyKmluZGV4ICsgMSArIG9mZnNldF0gPSBjdXJyVmFsOwotICAgICAgICB9Ci0gICAgfQotICB9Ci0gIGVsc2UKKyAgfSBlbHNlCiAgICAgcHJldkRhdGFbaW5kZXhdID0gY3VyclZhbDsKIH0KIAotCi0KIC8qIQogICBcYnJpZWYgICAgQ29udmVydCByYXcgZW52ZWxvcGUgYW5kIG5vaXNlZmxvb3IgZGF0YSB0byBlbmVyZ3kgbGV2ZWxzCiAKLSAgVGhpcyBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgYnkgc2JyRGVjb2Rlcl9QYXJzZUVsZW1lbnQoKSBhbmQgcHJvdmlkZXMgdHdvIGltcG9ydGFudCBhbGdvcml0aG1zOgorICBUaGlzIGZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZCBieSBzYnJEZWNvZGVyX1BhcnNlRWxlbWVudCgpIGFuZCBwcm92aWRlcyB0d28KKyAgaW1wb3J0YW50IGFsZ29yaXRobXM6CiAKLSAgRmlyc3QgdGhlIGZ1bmN0aW9uIGRlY29kZXMgZW52ZWxvcGVzIGFuZCBub2lzZSBmbG9vciBsZXZlbHMgYXMgZGVzY3JpYmVkIGluIHJlcXVhbnRpemVFbnZlbG9wZURhdGEoKQotICBhbmQgc2JyX2VudmVsb3BlX3VubWFwcGluZygpLiBUaGUgZnVuY3Rpb24gYWxzbyBpbXBsZW1lbnRzIGNvbmNlYWxtZW50IGFsZ29yaXRobXMgaW4gY2FzZSB0aGVyZSBhcmUgZXJyb3JzCi0gIHdpdGhpbiB0aGUgc2JyIGRhdGEuIEZvciBib3RoIG9wZXJhdGlvbnMgZnJhY3Rpb25hbCBhcml0aG1ldGljIGlzIHVzZWQuCi0gIFRoZXJlZm9yZSB5b3UgbWlnaHQgZW5jb3VudGVyIGRpZmZlcmVudCBvdXRwdXQgdmFsdWVzIG9uIHlvdXIgdGFyZ2V0Ci0gIHN5c3RlbSBjb21wYXJlZCB0byB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLgorICBGaXJzdCB0aGUgZnVuY3Rpb24gZGVjb2RlcyBlbnZlbG9wZXMgYW5kIG5vaXNlIGZsb29yIGxldmVscyBhcyBkZXNjcmliZWQgaW4KKyAgcmVxdWFudGl6ZUVudmVsb3BlRGF0YSgpIGFuZCBzYnJfZW52ZWxvcGVfdW5tYXBwaW5nKCkuIFRoZSBmdW5jdGlvbiBhbHNvCisgIGltcGxlbWVudHMgY29uY2VhbG1lbnQgYWxnb3JpdGhtcyBpbiBjYXNlIHRoZXJlIGFyZSBlcnJvcnMgd2l0aGluIHRoZSBzYnIKKyAgZGF0YS4gRm9yIGJvdGggb3BlcmF0aW9ucyBmcmFjdGlvbmFsIGFyaXRobWV0aWMgaXMgdXNlZC4gVGhlcmVmb3JlIHlvdSBtaWdodAorICBlbmNvdW50ZXIgZGlmZmVyZW50IG91dHB1dCB2YWx1ZXMgb24geW91ciB0YXJnZXQgc3lzdGVtIGNvbXBhcmVkIHRvIHRoZQorICByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uCiAqLwotdm9pZAotZGVjb2RlU2JyRGF0YSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgICAgICAgICAgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCi0gICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9kYXRhX2xlZnQsICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gbGVmdCBjaGFubmVsIGZyYW1lIGRhdGEgKi8KLSAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhX2xlZnQsIC8qITwgcG9pbnRlciB0byBsZWZ0IGNoYW5uZWwgcHJldmlvdXMgZnJhbWUgZGF0YSAqLwotICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZGF0YV9yaWdodCwgICAgICAgICAgLyohPCBwb2ludGVyIHRvIHJpZ2h0IGNoYW5uZWwgZnJhbWUgZGF0YSAqLwotICAgICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGFfcmlnaHQpLyohPCBwb2ludGVyIHRvIHJpZ2h0IGNoYW5uZWwgcHJldmlvdXMgZnJhbWUgZGF0YSAqLwordm9pZCBkZWNvZGVTYnJEYXRhKAorICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQQorICAgICAgICBoX2RhdGFfbGVmdCwgLyohPCBwb2ludGVyIHRvIGxlZnQgY2hhbm5lbCBmcmFtZSBkYXRhICovCisgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEKKyAgICAgICAgaF9wcmV2X2RhdGFfbGVmdCwgLyohPCBwb2ludGVyIHRvIGxlZnQgY2hhbm5lbCBwcmV2aW91cyBmcmFtZSBkYXRhICovCisgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBCisgICAgICAgIGhfZGF0YV9yaWdodCwgLyohPCBwb2ludGVyIHRvIHJpZ2h0IGNoYW5uZWwgZnJhbWUgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBCisgICAgICAgIGhfcHJldl9kYXRhX3JpZ2h0KSAvKiE8IHBvaW50ZXIgdG8gcmlnaHQgY2hhbm5lbCBwcmV2aW91cyBmcmFtZSBkYXRhICovCiB7CiAgIEZJWFBfU0dMIHRlbXBTZmJOcmdQcmV2W01BWF9GUkVRX0NPRUZGU107CiAgIGludCBlcnJMZWZ0OwogCi0gIC8qIFNhdmUgcHJldmlvdXMgZW5lcmd5IHZhbHVlcyB0byBiZSBhYmxlIHRvIHJldXNlIHRoZW0gbGF0ZXIgZm9yIGNvbmNlYWxtZW50LiAqLwotICBGREttZW1jcHkgKHRlbXBTZmJOcmdQcmV2LCBoX3ByZXZfZGF0YV9sZWZ0LT5zZmJfbnJnX3ByZXYsIE1BWF9GUkVRX0NPRUZGUyAqIHNpemVvZihGSVhQX1NHTCkpOworICAvKiBTYXZlIHByZXZpb3VzIGVuZXJneSB2YWx1ZXMgdG8gYmUgYWJsZSB0byByZXVzZSB0aGVtIGxhdGVyIGZvciBjb25jZWFsbWVudC4KKyAgICovCisgIEZES21lbWNweSh0ZW1wU2ZiTnJnUHJldiwgaF9wcmV2X2RhdGFfbGVmdC0+c2ZiX25yZ19wcmV2LAorICAgICAgICAgICAgTUFYX0ZSRVFfQ09FRkZTICogc2l6ZW9mKEZJWFBfU0dMKSk7CiAKLSAgZGVjb2RlRW52ZWxvcGUgKGhIZWFkZXJEYXRhLCBoX2RhdGFfbGVmdCwgaF9wcmV2X2RhdGFfbGVmdCwgaF9wcmV2X2RhdGFfcmlnaHQpOwotICBkZWNvZGVOb2lzZUZsb29ybGV2ZWxzIChoSGVhZGVyRGF0YSwgaF9kYXRhX2xlZnQsIGhfcHJldl9kYXRhX2xlZnQpOworICBpZiAoaEhlYWRlckRhdGEtPmZyYW1lRXJyb3JGbGFnIHx8IGhIZWFkZXJEYXRhLT5ic19pbmZvLnB2Y19tb2RlID09IDApIHsKKyAgICBkZWNvZGVFbnZlbG9wZShoSGVhZGVyRGF0YSwgaF9kYXRhX2xlZnQsIGhfcHJldl9kYXRhX2xlZnQsCisgICAgICAgICAgICAgICAgICAgaF9wcmV2X2RhdGFfcmlnaHQpOworICB9IGVsc2UgeworICAgIEZES19BU1NFUlQoaF9kYXRhX3JpZ2h0ID09IE5VTEwpOworICB9CisgIGRlY29kZU5vaXNlRmxvb3JsZXZlbHMoaEhlYWRlckRhdGEsIGhfZGF0YV9sZWZ0LCBoX3ByZXZfZGF0YV9sZWZ0KTsKIAotICBpZihoX2RhdGFfcmlnaHQgIT0gTlVMTCkgeworICBpZiAoaF9kYXRhX3JpZ2h0ICE9IE5VTEwpIHsKICAgICBlcnJMZWZ0ID0gaEhlYWRlckRhdGEtPmZyYW1lRXJyb3JGbGFnOwotICAgIGRlY29kZUVudmVsb3BlIChoSGVhZGVyRGF0YSwgaF9kYXRhX3JpZ2h0LCBoX3ByZXZfZGF0YV9yaWdodCwgaF9wcmV2X2RhdGFfbGVmdCk7Ci0gICAgZGVjb2RlTm9pc2VGbG9vcmxldmVscyAoaEhlYWRlckRhdGEsIGhfZGF0YV9yaWdodCwgaF9wcmV2X2RhdGFfcmlnaHQpOworICAgIGRlY29kZUVudmVsb3BlKGhIZWFkZXJEYXRhLCBoX2RhdGFfcmlnaHQsIGhfcHJldl9kYXRhX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgIGhfcHJldl9kYXRhX2xlZnQpOworICAgIGRlY29kZU5vaXNlRmxvb3JsZXZlbHMoaEhlYWRlckRhdGEsIGhfZGF0YV9yaWdodCwgaF9wcmV2X2RhdGFfcmlnaHQpOwogCiAgICAgaWYgKCFlcnJMZWZ0ICYmIGhIZWFkZXJEYXRhLT5mcmFtZUVycm9yRmxhZykgewotICAgICAgLyogSWYgYW4gZXJyb3Igb2NjdXJzIGluIHRoZSByaWdodCBjaGFubmVsIHdoZXJlIHRoZSBsZWZ0IGNoYW5uZWwgc2VlbWVkIG9rLAotICAgICAgICAgd2UgYXBwbHkgY29uY2VhbG1lbnQgYWxzbyBvbiB0aGUgbGVmdCBjaGFubmVsLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgY291cGxpbmcKLSAgICAgICAgIG1vZGVzIG9mIGJvdGggY2hhbm5lbHMgbWF0Y2ggYW5kIHRoYXQgd2UgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZW52ZWxvcGVzIGluCi0gICAgICAgICBjb3VwbGluZyBtb2RlLgotICAgICAgICAgSG93ZXZlciwgYXMgdGhlIGxlZnQgY2hhbm5lbCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBiZWZvcmUsIHRoZSByZXN1bHRpbmcKLSAgICAgICAgIGVuZXJneSBsZXZlbHMgYXJlIG5vdCB0aGUgc2FtZSBhcyBpZiB0aGUgbGVmdCBjaGFubmVsIGhhZCBiZWVuIGNvbmNlYWxlZAotICAgICAgICAgZHVyaW5nIHRoZSBmaXJzdCBjYWxsIG9mIGRlY29kZUVudmVsb3BlKCkuCisgICAgICAvKiBJZiBhbiBlcnJvciBvY2N1cnMgaW4gdGhlIHJpZ2h0IGNoYW5uZWwgd2hlcmUgdGhlIGxlZnQgY2hhbm5lbCBzZWVtZWQKKyAgICAgICAgIG9rLCB3ZSBhcHBseSBjb25jZWFsbWVudCBhbHNvIG9uIHRoZSBsZWZ0IGNoYW5uZWwuIFRoaXMgZW5zdXJlcyB0aGF0CisgICAgICAgICB0aGUgY291cGxpbmcgbW9kZXMgb2YgYm90aCBjaGFubmVscyBtYXRjaCBhbmQgdGhhdCB3ZSBoYXZlIHRoZSBzYW1lCisgICAgICAgICBudW1iZXIgb2YgZW52ZWxvcGVzIGluIGNvdXBsaW5nIG1vZGUuIEhvd2V2ZXIsIGFzIHRoZSBsZWZ0IGNoYW5uZWwgaGFzCisgICAgICAgICBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGJlZm9yZSwgdGhlIHJlc3VsdGluZyBlbmVyZ3kgbGV2ZWxzIGFyZSBub3QgdGhlCisgICAgICAgICBzYW1lIGFzIGlmIHRoZSBsZWZ0IGNoYW5uZWwgaGFkIGJlZW4gY29uY2VhbGVkIGR1cmluZyB0aGUgZmlyc3QgY2FsbCBvZgorICAgICAgICAgZGVjb2RlRW52ZWxvcGUoKS4KICAgICAgICovCi0gICAgICAvKiBSZXN0b3JlIHByZXZpb3VzIGVuZXJneSB2YWx1ZXMgZm9yIGNvbmNlYWxtZW50LCBiZWNhdXNlIHRoZSB2YWx1ZXMgaGF2ZSBiZWVuCi0gICAgICAgICBvdmVyd3JpdHRlbiBieSB0aGUgZmlyc3QgY2FsbCBvZiBkZWNvZGVFbnZlbG9wZSgpLiAqLwotICAgICAgRkRLbWVtY3B5IChoX3ByZXZfZGF0YV9sZWZ0LT5zZmJfbnJnX3ByZXYsIHRlbXBTZmJOcmdQcmV2LCBNQVhfRlJFUV9DT0VGRlMgKiBzaXplb2YoRklYUF9TR0wpKTsKKyAgICAgIC8qIFJlc3RvcmUgcHJldmlvdXMgZW5lcmd5IHZhbHVlcyBmb3IgY29uY2VhbG1lbnQsIGJlY2F1c2UgdGhlIHZhbHVlcyBoYXZlCisgICAgICAgICBiZWVuIG92ZXJ3cml0dGVuIGJ5IHRoZSBmaXJzdCBjYWxsIG9mIGRlY29kZUVudmVsb3BlKCkuICovCisgICAgICBGREttZW1jcHkoaF9wcmV2X2RhdGFfbGVmdC0+c2ZiX25yZ19wcmV2LCB0ZW1wU2ZiTnJnUHJldiwKKyAgICAgICAgICAgICAgICBNQVhfRlJFUV9DT0VGRlMgKiBzaXplb2YoRklYUF9TR0wpKTsKICAgICAgIC8qIERvIGNvbmNlYWxtZW50ICovCi0gICAgICBkZWNvZGVFbnZlbG9wZSAoaEhlYWRlckRhdGEsIGhfZGF0YV9sZWZ0LCBoX3ByZXZfZGF0YV9sZWZ0LCBoX3ByZXZfZGF0YV9yaWdodCk7CisgICAgICBkZWNvZGVFbnZlbG9wZShoSGVhZGVyRGF0YSwgaF9kYXRhX2xlZnQsIGhfcHJldl9kYXRhX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICBoX3ByZXZfZGF0YV9yaWdodCk7CiAgICAgfQogCiAgICAgaWYgKGhfZGF0YV9sZWZ0LT5jb3VwbGluZykgewotICAgICAgc2JyX2VudmVsb3BlX3VubWFwcGluZyAoaEhlYWRlckRhdGEsIGhfZGF0YV9sZWZ0LCBoX2RhdGFfcmlnaHQpOworICAgICAgc2JyX2VudmVsb3BlX3VubWFwcGluZyhoSGVhZGVyRGF0YSwgaF9kYXRhX2xlZnQsIGhfZGF0YV9yaWdodCk7CiAgICAgfQogICB9CiAKICAgLyogRGlzcGxheSB0aGUgZGF0YSBmb3IgZGVidWdnaW5nOiAqLwogfQogCi0KIC8qIQogICBcYnJpZWYgICBDb252ZXJ0IGZyb20gY291cGxlZCBjaGFubmVscyB0byBpbmRlcGVuZGVudCBML1IgZGF0YQogKi8KLXN0YXRpYyB2b2lkCi1zYnJfZW52ZWxvcGVfdW5tYXBwaW5nIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2RhdGFfbGVmdCwgIC8qITwgcG9pbnRlciB0byBsZWZ0IGNoYW5uZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2RhdGFfcmlnaHQpIC8qITwgcG9pbnRlciB0byByaWdodCBjaGFubmVsICovCitzdGF0aWMgdm9pZCBzYnJfZW52ZWxvcGVfdW5tYXBwaW5nKAorICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2RhdGFfbGVmdCwgIC8qITwgcG9pbnRlciB0byBsZWZ0IGNoYW5uZWwgKi8KKyAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9kYXRhX3JpZ2h0KSAvKiE8IHBvaW50ZXIgdG8gcmlnaHQgY2hhbm5lbCAqLwogewogICBpbnQgaTsKICAgRklYUF9TR0wgdGVtcExfbSwgdGVtcFJfbSwgdGVtcFJwbHVzMV9tLCBuZXdMX20sIG5ld1JfbTsKLSAgU0NIQVIgICB0ZW1wTF9lLCB0ZW1wUl9lLCB0ZW1wUnBsdXMxX2UsIG5ld0xfZSwgbmV3Ul9lOwotCisgIFNDSEFSIHRlbXBMX2UsIHRlbXBSX2UsIHRlbXBScGx1czFfZSwgbmV3TF9lLCBuZXdSX2U7CiAKICAgLyogMS4gVW5tYXAgKGFscmVhZHkgZGVxdWFudGl6ZWQpIGNvdXBsZWQgZW52ZWxvcGUgZW5lcmdpZXMgKi8KIApAQCAtMjg5LDUxICszMDQsNTMgQEAKICAgICB0ZW1wUl9tID0gKEZJWFBfU0dMKSgoTE9ORyloX2RhdGFfcmlnaHQtPmlFbnZlbG9wZVtpXSAmIE1BU0tfTSk7CiAgICAgdGVtcFJfZSA9IChTQ0hBUikoKExPTkcpaF9kYXRhX3JpZ2h0LT5pRW52ZWxvcGVbaV0gJiBNQVNLX0UpOwogCi0gICAgdGVtcFJfZSAtPSAoMTggKyBOUkdfRVhQX09GRlNFVCk7ICAvKiAtMTggPSBsZChVTk1BUFBJTkdfU0NBTEUgLyBoX2RhdGFfcmlnaHQtPm5DaGFubmVscykgKi8KKyAgICB0ZW1wUl9lIC09ICgxOCArIE5SR19FWFBfT0ZGU0VUKTsgLyogLTE4ID0gbGQoVU5NQVBQSU5HX1NDQUxFIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9kYXRhX3JpZ2h0LT5uQ2hhbm5lbHMpICovCiAgICAgdGVtcExfbSA9IChGSVhQX1NHTCkoKExPTkcpaF9kYXRhX2xlZnQtPmlFbnZlbG9wZVtpXSAmIE1BU0tfTSk7CiAgICAgdGVtcExfZSA9IChTQ0hBUikoKExPTkcpaF9kYXRhX2xlZnQtPmlFbnZlbG9wZVtpXSAmIE1BU0tfRSk7CiAKICAgICB0ZW1wTF9lIC09IE5SR19FWFBfT0ZGU0VUOwogCiAgICAgLyogQ2FsY3VsYXRlIHRlbXBSaWdodCsxICovCi0gICAgRkRLX2FkZF9NYW50RXhwKCB0ZW1wUl9tLCB0ZW1wUl9lLAotICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9TR0woMC41ZiksIDEsICAvKiAxLjAgKi8KLSAgICAgICAgICAgICAgICAgICAgICZ0ZW1wUnBsdXMxX20sICZ0ZW1wUnBsdXMxX2UpOworICAgIEZES19hZGRfTWFudEV4cCh0ZW1wUl9tLCB0ZW1wUl9lLCBGTDJGWENPTlNUX1NHTCgwLjVmKSwgMSwgLyogMS4wICovCisgICAgICAgICAgICAgICAgICAgICZ0ZW1wUnBsdXMxX20sICZ0ZW1wUnBsdXMxX2UpOwogCi0gICAgRkRLX2RpdmlkZV9NYW50RXhwKCB0ZW1wTF9tLCB0ZW1wTF9lKzEsICAvKiAgMiAqIHRlbXBMZWZ0ICovCi0gICAgICAgICAgICAgICAgICAgICAgIHRlbXBScGx1czFfbSwgdGVtcFJwbHVzMV9lLAotICAgICAgICAgICAgICAgICAgICAgICAmbmV3Ul9tLCAmbmV3Ul9lICk7CisgICAgRkRLX2RpdmlkZV9NYW50RXhwKHRlbXBMX20sIHRlbXBMX2UgKyAxLCAvKiAgMiAqIHRlbXBMZWZ0ICovCisgICAgICAgICAgICAgICAgICAgICAgIHRlbXBScGx1czFfbSwgdGVtcFJwbHVzMV9lLCAmbmV3Ul9tLCAmbmV3Ul9lKTsKIAogICAgIGlmIChuZXdSX20gPj0gKChGSVhQX1NHTClNQVhWQUxfU0dMIC0gUk9VTkRJTkcpKSB7CiAgICAgICBuZXdSX20gPj49IDE7CiAgICAgICBuZXdSX2UgKz0gMTsKICAgICB9CiAKLSAgICBuZXdMX20gPSBGWF9EQkwyRlhfU0dMKGZNdWx0KHRlbXBSX20sbmV3Ul9tKSk7CisgICAgbmV3TF9tID0gRlhfREJMMkZYX1NHTChmTXVsdCh0ZW1wUl9tLCBuZXdSX20pKTsKICAgICBuZXdMX2UgPSB0ZW1wUl9lICsgbmV3Ul9lOwogCi0gICAgaF9kYXRhX3JpZ2h0LT5pRW52ZWxvcGVbaV0gPSAoKEZJWFBfU0dMKSgoU0hPUlQpKEZJWFBfU0dMKShuZXdSX20gKyBST1VORElORykgJiBNQVNLX00pKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfU0dMKSgoU0hPUlQpKEZJWFBfU0dMKShuZXdSX2UgKyBOUkdfRVhQX09GRlNFVCkgJiBNQVNLX0UpOwotICAgIGhfZGF0YV9sZWZ0LT5pRW52ZWxvcGVbaV0gPSAgKChGSVhQX1NHTCkoKFNIT1JUKShGSVhQX1NHTCkobmV3TF9tICsgUk9VTkRJTkcpICYgTUFTS19NKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1NHTCkoKFNIT1JUKShGSVhQX1NHTCkobmV3TF9lICsgTlJHX0VYUF9PRkZTRVQpICYgTUFTS19FKTsKKyAgICBoX2RhdGFfcmlnaHQtPmlFbnZlbG9wZVtpXSA9CisgICAgICAgICgoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpKG5ld1JfbSArIFJPVU5ESU5HKSAmIE1BU0tfTSkpICsKKyAgICAgICAgKEZJWFBfU0dMKSgoU0hPUlQpKEZJWFBfU0dMKShuZXdSX2UgKyBOUkdfRVhQX09GRlNFVCkgJiBNQVNLX0UpOworICAgIGhfZGF0YV9sZWZ0LT5pRW52ZWxvcGVbaV0gPQorICAgICAgICAoKEZJWFBfU0dMKSgoU0hPUlQpKEZJWFBfU0dMKShuZXdMX20gKyBST1VORElORykgJiBNQVNLX00pKSArCisgICAgICAgIChGSVhQX1NHTCkoKFNIT1JUKShGSVhQX1NHTCkobmV3TF9lICsgTlJHX0VYUF9PRkZTRVQpICYgTUFTS19FKTsKICAgfQogCiAgIC8qIDIuIERlcXVhbnRpemUgYW5kIHVubWFwIGNvdXBsZWQgbm9pc2UgZmxvb3IgbGV2ZWxzICovCiAKLSAgZm9yIChpID0gMDsgaSA8IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubk5mYiAqIGhfZGF0YV9sZWZ0LT5mcmFtZUluZm8ubk5vaXNlRW52ZWxvcGVzOyBpKyspIHsKLQorICBmb3IgKGkgPSAwOyBpIDwgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uTmZiICoKKyAgICAgICAgICAgICAgICAgICAgICBoX2RhdGFfbGVmdC0+ZnJhbWVJbmZvLm5Ob2lzZUVudmVsb3BlczsKKyAgICAgICBpKyspIHsKICAgICB0ZW1wTF9lID0gKFNDSEFSKSg2IC0gKExPTkcpaF9kYXRhX2xlZnQtPnNick5vaXNlRmxvb3JMZXZlbFtpXSk7Ci0gICAgdGVtcFJfZSA9IChTQ0hBUikoKExPTkcpaF9kYXRhX3JpZ2h0LT5zYnJOb2lzZUZsb29yTGV2ZWxbaV0gLSAxMikgLypTQlJfRU5FUkdZX1BBTl9PRkZTRVQqLzsKKyAgICB0ZW1wUl9lID0gKFNDSEFSKSgoTE9ORyloX2RhdGFfcmlnaHQtPnNick5vaXNlRmxvb3JMZXZlbFtpXSAtCisgICAgICAgICAgICAgICAgICAgICAgMTIpIC8qU0JSX0VORVJHWV9QQU5fT0ZGU0VUKi87CiAKICAgICAvKiBDYWxjdWxhdGUgdGVtcFIrMSAqLwotICAgIEZES19hZGRfTWFudEV4cCggRkwyRlhDT05TVF9TR0woMC41ZiksIDErdGVtcFJfZSwgLyogdGVtcFIgKi8KLSAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfU0dMKDAuNWYpLCAxLCAgICAgICAgIC8qICAxLjAgICovCi0gICAgICAgICAgICAgICAgICAgICAmdGVtcFJwbHVzMV9tLCAmdGVtcFJwbHVzMV9lKTsKKyAgICBGREtfYWRkX01hbnRFeHAoRkwyRlhDT05TVF9TR0woMC41ZiksIDEgKyB0ZW1wUl9lLCAvKiB0ZW1wUiAqLworICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX1NHTCgwLjVmKSwgMSwgICAgICAgICAgIC8qICAxLjAgICovCisgICAgICAgICAgICAgICAgICAgICZ0ZW1wUnBsdXMxX20sICZ0ZW1wUnBsdXMxX2UpOwogCiAgICAgLyogQ2FsY3VsYXRlIDIqdGVtcExlZnQvKHRlbXBSKzEpICovCi0gICAgRkRLX2RpdmlkZV9NYW50RXhwKCBGTDJGWENPTlNUX1NHTCgwLjVmKSwgdGVtcExfZSsyLCAgLyogIDIgKiB0ZW1wTGVmdCAqLwotICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUnBsdXMxX20sIHRlbXBScGx1czFfZSwKLSAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JfbSwgJm5ld1JfZSApOworICAgIEZES19kaXZpZGVfTWFudEV4cChGTDJGWENPTlNUX1NHTCgwLjVmKSwgdGVtcExfZSArIDIsIC8qICAyICogdGVtcExlZnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgdGVtcFJwbHVzMV9tLCB0ZW1wUnBsdXMxX2UsICZuZXdSX20sICZuZXdSX2UpOwogCiAgICAgLyogaWYgKG5ld1JfbSA+PSAoKEZJWFBfU0dMKU1BWFZBTF9TR0wgLSBST1VORElORykpIHsKICAgICAgIG5ld1JfbSA+Pj0gMTsKQEAgLTM0MywxNCArMzYwLDE1IEBACiAgICAgLyogTCA9IHRlbXBSICogUiAqLwogICAgIG5ld0xfbSA9IG5ld1JfbTsKICAgICBuZXdMX2UgPSBuZXdSX2UgKyB0ZW1wUl9lOwotICAgIGhfZGF0YV9yaWdodC0+c2JyTm9pc2VGbG9vckxldmVsW2ldID0gKChGSVhQX1NHTCkoKFNIT1JUKShGSVhQX1NHTCkobmV3Ul9tICsgUk9VTkRJTkcpICYgTUFTS19NKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1NHTCkoKFNIT1JUKShGSVhQX1NHTCkobmV3Ul9lICsgTk9JU0VfRVhQX09GRlNFVCkgJiBNQVNLX0UpOwotICAgIGhfZGF0YV9sZWZ0LT5zYnJOb2lzZUZsb29yTGV2ZWxbaV0gPSAgKChGSVhQX1NHTCkoKFNIT1JUKShGSVhQX1NHTCkobmV3TF9tICsgUk9VTkRJTkcpICYgTUFTS19NKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1NHTCkoKFNIT1JUKShGSVhQX1NHTCkobmV3TF9lICsgTk9JU0VfRVhQX09GRlNFVCkgJiBNQVNLX0UpOworICAgIGhfZGF0YV9yaWdodC0+c2JyTm9pc2VGbG9vckxldmVsW2ldID0KKyAgICAgICAgKChGSVhQX1NHTCkoKFNIT1JUKShGSVhQX1NHTCkobmV3Ul9tICsgUk9VTkRJTkcpICYgTUFTS19NKSkgKworICAgICAgICAoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpKG5ld1JfZSArIE5PSVNFX0VYUF9PRkZTRVQpICYgTUFTS19FKTsKKyAgICBoX2RhdGFfbGVmdC0+c2JyTm9pc2VGbG9vckxldmVsW2ldID0KKyAgICAgICAgKChGSVhQX1NHTCkoKFNIT1JUKShGSVhQX1NHTCkobmV3TF9tICsgUk9VTkRJTkcpICYgTUFTS19NKSkgKworICAgICAgICAoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpKG5ld0xfZSArIE5PSVNFX0VYUF9PRkZTRVQpICYgTUFTS19FKTsKICAgfQogfQogCi0KIC8qIQogICBcYnJpZWYgICAgU2ltcGxlIGFsdGVybmF0aXZlIHRvIHRoZSByZWFsIFNCUiBjb25jZWFsbWVudAogCkBAIC0zNTksMjQgKzM3NywyMyBAQAogICBUaGUgZGVsdGEtY29kZWQgZW5lcmdpZXMgYXJlIHNldCB0byBuZWdhdGl2ZSB2YWx1ZXMsIHJlc3VsdGluZyBpbiBhIGZhZGUtZG93bi4KICAgSW4gY2FzZSBvZiBjb3VwbGluZywgdGhlIGJhbGFuY2UtY2hhbm5lbCB3aWxsIG1vdmUgdG93YXJkcyB0aGUgY2VudGVyLgogKi8KLXN0YXRpYyB2b2lkCi1sZWFuU2JyQ29uY2VhbG1lbnQoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgICAgIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaF9zYnJfZGF0YSwgICAgICAvKiE8IHBvaW50ZXIgdG8gY3VycmVudCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGEgIC8qITwgcG9pbnRlciB0byBkYXRhIG9mIGxhc3QgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICAgICApCi17Ci0gIEZJWFBfU0dMIHRhcmdldDsgIC8qIHRhcmdldGVkIGxldmVsIGZvciBzZmJfbnJnX3ByZXYgZHVyaW5nIGZhZGUtZG93biAqLwotICBGSVhQX1NHTCBzdGVwOyAgICAvKiBzcGVlZCBvZiBmYWRlICovCitzdGF0aWMgdm9pZCBsZWFuU2JyQ29uY2VhbG1lbnQoCisgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgICAgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCisgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsICAgICAgLyohPCBwb2ludGVyIHRvIGN1cnJlbnQgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhIC8qITwgcG9pbnRlciB0byBkYXRhIG9mIGxhc3QgZnJhbWUgKi8KKykgeworICBGSVhQX1NHTCB0YXJnZXQ7IC8qIHRhcmdldGVkIGxldmVsIGZvciBzZmJfbnJnX3ByZXYgZHVyaW5nIGZhZGUtZG93biAqLworICBGSVhQX1NHTCBzdGVwOyAgIC8qIHNwZWVkIG9mIGZhZGUgKi8KICAgaW50IGk7CiAKLSAgaW50IGN1cnJlbnRTdGFydFBvcyA9IEZES21heCgwLCBoX3ByZXZfZGF0YS0+c3RvcFBvcyAtIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMpOworICBpbnQgY3VycmVudFN0YXJ0UG9zID0KKyAgICAgIGZNYXgoMCwgaF9wcmV2X2RhdGEtPnN0b3BQb3MgLSBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzKTsKICAgaW50IGN1cnJlbnRTdG9wUG9zID0gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90czsKIAotCiAgIC8qIFVzZSBzb21lIHNldHRpbmdzIG9mIHRoZSBwcmV2aW91cyBmcmFtZSAqLwogICBoX3Nicl9kYXRhLT5hbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lID0gaF9wcmV2X2RhdGEtPmFtcFJlczsKICAgaF9zYnJfZGF0YS0+Y291cGxpbmcgPSBoX3ByZXZfZGF0YS0+Y291cGxpbmc7Ci0gIGZvcihpPTA7aTxNQVhfSU5WRl9CQU5EUztpKyspCisgIGZvciAoaSA9IDA7IGkgPCBNQVhfSU5WRl9CQU5EUzsgaSsrKQogICAgIGhfc2JyX2RhdGEtPnNicl9pbnZmX21vZGVbaV0gPSBoX3ByZXZfZGF0YS0+c2JyX2ludmZfbW9kZVtpXTsKIAogICAvKiBHZW5lcmF0ZSBjb25jZWFsaW5nIGNvbnRyb2wgZGF0YSAqLwpAQCAtMzg1LDcgKzQwMiw3IEBACiAgIGhfc2JyX2RhdGEtPmZyYW1lSW5mby5ib3JkZXJzWzBdID0gY3VycmVudFN0YXJ0UG9zOwogICBoX3Nicl9kYXRhLT5mcmFtZUluZm8uYm9yZGVyc1sxXSA9IGN1cnJlbnRTdG9wUG9zOwogICBoX3Nicl9kYXRhLT5mcmFtZUluZm8uZnJlcVJlc1swXSA9IDE7Ci0gIGhfc2JyX2RhdGEtPmZyYW1lSW5mby50cmFuRW52ID0gLTE7ICAvKiBubyB0cmFuc2llbnQgKi8KKyAgaF9zYnJfZGF0YS0+ZnJhbWVJbmZvLnRyYW5FbnYgPSAtMTsgLyogbm8gdHJhbnNpZW50ICovCiAgIGhfc2JyX2RhdGEtPmZyYW1lSW5mby5uTm9pc2VFbnZlbG9wZXMgPSAxOwogICBoX3Nicl9kYXRhLT5mcmFtZUluZm8uYm9yZGVyc05vaXNlWzBdID0gY3VycmVudFN0YXJ0UG9zOwogICBoX3Nicl9kYXRhLT5mcmFtZUluZm8uYm9yZGVyc05vaXNlWzFdID0gY3VycmVudFN0b3BQb3M7CkBAIC0zOTksMTcgKzQxNiwxNiBAQAogICBpZiAoaF9zYnJfZGF0YS0+Y291cGxpbmcgPT0gQ09VUExJTkdfQkFMKSB7CiAgICAgdGFyZ2V0ID0gKEZJWFBfU0dMKVNCUl9FTkVSR1lfUEFOX09GRlNFVDsKICAgICBzdGVwID0gKEZJWFBfU0dMKURFQ0FZX0NPVVBMSU5HOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIHRhcmdldCA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwotICAgIHN0ZXAgICA9IChGSVhQX1NHTClERUNBWTsKKyAgICBzdGVwID0gKEZJWFBfU0dMKURFQ0FZOwogICB9CiAgIGlmIChoSGVhZGVyRGF0YS0+YnNfaW5mby5hbXBSZXNvbHV0aW9uID09IDApIHsKICAgICB0YXJnZXQgPDw9IDE7Ci0gICAgc3RlcCAgIDw8PSAxOworICAgIHN0ZXAgPDw9IDE7CiAgIH0KIAotICBmb3IgKGk9MDsgaSA8IGhfc2JyX2RhdGEtPm5TY2FsZUZhY3RvcnM7IGkrKykgeworICBmb3IgKGkgPSAwOyBpIDwgaF9zYnJfZGF0YS0+blNjYWxlRmFjdG9yczsgaSsrKSB7CiAgICAgaWYgKGhfcHJldl9kYXRhLT5zZmJfbnJnX3ByZXZbaV0gPiB0YXJnZXQpCiAgICAgICBoX3Nicl9kYXRhLT5pRW52ZWxvcGVbaV0gPSAtc3RlcDsKICAgICBlbHNlCkBAIC00MTksMTIzICs0MzUsMTI1IEBACiAgIC8qIE5vaXNlZmxvb3IgbGV2ZWxzIGFyZSBhbHdheXMgY2xlYXJlZCAuLi4gKi8KIAogICBoX3Nicl9kYXRhLT5kb21haW5fdmVjX25vaXNlWzBdID0gMTsKLSAgZm9yIChpPTA7IGkgPCBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5OZmI7IGkrKykKKyAgZm9yIChpID0gMDsgaSA8IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubk5mYjsgaSsrKQogICAgIGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwogCiAgIC8qIC4uLiBhbmQgc28gYXJlIHRoZSBzaW5lcyAqLwotICBGREttZW1jbGVhcihoX3Nicl9kYXRhLT5hZGRIYXJtb25pY3MsIE1BWF9GUkVRX0NPRUZGUyk7CisgIEZES21lbWNsZWFyKGhfc2JyX2RhdGEtPmFkZEhhcm1vbmljcywKKyAgICAgICAgICAgICAgc2l6ZW9mKFVMT05HKSAqIEFERF9IQVJNT05JQ1NfRkxBR1NfU0laRSk7CiB9CiAKLQogLyohCiAgIFxicmllZiAgIEJ1aWxkIHJlZmVyZW5jZSBlbmVyZ2llcyBhbmQgbm9pc2UgbGV2ZWxzIGZyb20gYml0c3RyZWFtIGVsZW1lbnRzCiAqLwotc3RhdGljIHZvaWQKLWRlY29kZUVudmVsb3BlIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgICAgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCi0gICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBICBoX3Nicl9kYXRhLCAgICAgIC8qITwgcG9pbnRlciB0byBjdXJyZW50IGRhdGEgKi8KLSAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSwgLyohPCBwb2ludGVyIHRvIGRhdGEgb2YgbGFzdCBmcmFtZSAqLwotICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIG90aGVyQ2hhbm5lbCAvKiE8IG90aGVyIGNoYW5uZWwncyBsYXN0IGZyYW1lIGRhdGEgKi8KLSAgICAgICAgICAgICAgICApCi17CitzdGF0aWMgdm9pZCBkZWNvZGVFbnZlbG9wZSgKKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9zYnJfZGF0YSwgICAvKiE8IHBvaW50ZXIgdG8gY3VycmVudCBkYXRhICovCisgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEKKyAgICAgICAgaF9wcmV2X2RhdGEsIC8qITwgcG9pbnRlciB0byBkYXRhIG9mIGxhc3QgZnJhbWUgKi8KKyAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQQorICAgICAgICBvdGhlckNoYW5uZWwgLyohPCBvdGhlciBjaGFubmVsJ3MgbGFzdCBmcmFtZSBkYXRhICovCispIHsKICAgaW50IGk7CiAgIGludCBmRnJhbWVFcnJvciA9IGhIZWFkZXJEYXRhLT5mcmFtZUVycm9yRmxhZzsKICAgRklYUF9TR0wgdGVtcFNmYk5yZ1ByZXZbTUFYX0ZSRVFfQ09FRkZTXTsKIAogICBpZiAoIWZGcmFtZUVycm9yKSB7CiAgICAgLyoKLSAgICAgIFRvIGF2b2lkIGRpc3RvcnRpb25zIGFmdGVyIGJhZCBmcmFtZXMsIHNldCB0aGUgZXJyb3IgZmxhZyBpZiBkZWx0YSBjb2RpbmcgaW4gdGltZSBvY2N1cnMuCi0gICAgICBIb3dldmVyLCBTQlIgY2FuIHRha2UgYSBsaXR0bGUgbG9uZ2VyIHRvIGNvbWUgdXAgYWdhaW4uCisgICAgICBUbyBhdm9pZCBkaXN0b3J0aW9ucyBhZnRlciBiYWQgZnJhbWVzLCBzZXQgdGhlIGVycm9yIGZsYWcgaWYgZGVsdGEgY29kaW5nCisgICAgICBpbiB0aW1lIG9jY3Vycy4gSG93ZXZlciwgU0JSIGNhbiB0YWtlIGEgbGl0dGxlIGxvbmdlciB0byBjb21lIHVwIGFnYWluLgogICAgICovCi0gICAgaWYgKCBoX3ByZXZfZGF0YS0+ZnJhbWVFcnJvckZsYWcgKSB7CisgICAgaWYgKGhfcHJldl9kYXRhLT5mcmFtZUVycm9yRmxhZykgewogICAgICAgaWYgKGhfc2JyX2RhdGEtPmRvbWFpbl92ZWNbMF0gIT0gMCkgewogICAgICAgICBmRnJhbWVFcnJvciA9IDE7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgIC8qIENoZWNrIHRoYXQgdGhlIHByZXZpb3VzIHN0b3AgcG9zaXRpb24gYW5kIHRoZSBjdXJyZW50IHN0YXJ0IHBvc2l0aW9uIG1hdGNoLgotICAgICAgICAgKENvdWxkIGJlIGRvbmUgaW4gY2hlY2tGcmFtZUluZm8oKSwgYnV0IHRoZSBwcmV2aW91cyBmcmFtZSBkYXRhIGlzIG5vdCBhdmFpbGFibGUgdGhlcmUpICovCi0gICAgICBpZiAoIGhfc2JyX2RhdGEtPmZyYW1lSW5mby5ib3JkZXJzWzBdICE9IGhfcHJldl9kYXRhLT5zdG9wUG9zIC0gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cyApIHsKLSAgICAgICAgLyogQm90aCB0aGUgcHJldmlvdXMgYXMgd2VsbCBhcyB0aGUgY3VycmVudCBmcmFtZSBhcmUgZmxhZ2dlZCB0byBiZSBvaywgYnV0IHRoZXkgZG8gbm90IG1hdGNoISAqLworICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgcHJldmlvdXMgc3RvcCBwb3NpdGlvbiBhbmQgdGhlIGN1cnJlbnQgc3RhcnQgcG9zaXRpb24KKyAgICAgICAgIG1hdGNoLiAoQ291bGQgYmUgZG9uZSBpbiBjaGVja0ZyYW1lSW5mbygpLCBidXQgdGhlIHByZXZpb3VzIGZyYW1lIGRhdGEKKyAgICAgICAgIGlzIG5vdCBhdmFpbGFibGUgdGhlcmUpICovCisgICAgICBpZiAoaF9zYnJfZGF0YS0+ZnJhbWVJbmZvLmJvcmRlcnNbMF0gIT0KKyAgICAgICAgICBoX3ByZXZfZGF0YS0+c3RvcFBvcyAtIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMpIHsKKyAgICAgICAgLyogQm90aCB0aGUgcHJldmlvdXMgYXMgd2VsbCBhcyB0aGUgY3VycmVudCBmcmFtZSBhcmUgZmxhZ2dlZCB0byBiZSBvaywKKyAgICAgICAgICogYnV0IHRoZXkgZG8gbm90IG1hdGNoISAqLwogICAgICAgICBpZiAoaF9zYnJfZGF0YS0+ZG9tYWluX3ZlY1swXSA9PSAxKSB7Ci0gICAgICAgICAgLyogUHJlZmVyIGNvbmNlYWxtZW50IG92ZXIgZGVsdGEtdGltZSBjb2RpbmcgYmV0d2VlbiB0aGUgbWlzbWF0Y2hpbmcgZnJhbWVzICovCisgICAgICAgICAgLyogUHJlZmVyIGNvbmNlYWxtZW50IG92ZXIgZGVsdGEtdGltZSBjb2RpbmcgYmV0d2VlbiB0aGUgbWlzbWF0Y2hpbmcKKyAgICAgICAgICAgKiBmcmFtZXMgKi8KICAgICAgICAgICBmRnJhbWVFcnJvciA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgLyogQ2xvc2UgdGhlIGdhcCBpbiB0aW1lIGJ5IHRyaWdnZXJpbmcgdGltZUNvbXBlbnNhdGVGaXJzdEVudmVsb3BlKCkgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBDbG9zZSB0aGUgZ2FwIGluIHRpbWUgYnkgdHJpZ2dlcmluZyB0aW1lQ29tcGVuc2F0ZUZpcnN0RW52ZWxvcGUoKQorICAgICAgICAgICAqLwogICAgICAgICAgIGZGcmFtZUVycm9yID0gMTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogCisgIGlmIChmRnJhbWVFcnJvcikgLyogRXJyb3IgaXMgZGV0ZWN0ZWQgKi8KKyAgeworICAgIGxlYW5TYnJDb25jZWFsbWVudChoSGVhZGVyRGF0YSwgaF9zYnJfZGF0YSwgaF9wcmV2X2RhdGEpOwogCi0gIGlmIChmRnJhbWVFcnJvcikgICAgICAgLyogRXJyb3IgaXMgZGV0ZWN0ZWQgKi8KLSAgICB7Ci0gICAgICBsZWFuU2JyQ29uY2VhbG1lbnQoaEhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoX3ByZXZfZGF0YSk7Ci0KLSAgICAgIC8qIGRlY29kZSB0aGUgZW52ZWxvcGUgZGF0YSB0byBsaW5lYXIgUENNICovCi0gICAgICBkZWx0YVRvTGluZWFyUGNtRW52ZWxvcGVEZWNvZGluZyAoaEhlYWRlckRhdGEsIGhfc2JyX2RhdGEsIGhfcHJldl9kYXRhKTsKLSAgICB9Ci0gIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRG8gYSB0ZW1wb3JhcnkgZHVtbXkgZGVjb2RpbmcgYW5kIGNoZWNrIHRoYXQgdGhlIGVudmVsb3BlIHZhbHVlcyBhcmUgd2l0aGluIGxpbWl0cyAqLwotICAgIHsKLSAgICAgIGlmIChoX3ByZXZfZGF0YS0+ZnJhbWVFcnJvckZsYWcpIHsKLSAgICAgICAgdGltZUNvbXBlbnNhdGVGaXJzdEVudmVsb3BlIChoSGVhZGVyRGF0YSwgaF9zYnJfZGF0YSwgaF9wcmV2X2RhdGEpOwotICAgICAgICBpZiAoaF9zYnJfZGF0YS0+Y291cGxpbmcgIT0gaF9wcmV2X2RhdGEtPmNvdXBsaW5nKSB7Ci0gICAgICAgICAgLyoKLSAgICAgICAgICAgIENvdXBsaW5nIG1vZGUgaGFzIGNoYW5nZWQgZHVyaW5nIGNvbmNlYWxtZW50LgotICAgICAgICAgICAgIFRoZSBzdG9yZWQgZW5lcmd5IGxldmVscyBuZWVkIHRvIGJlIGNvbnZlcnRlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uU2ZiWzFdOyBpKyspIHsKLSAgICAgICAgICAgIC8qIEZvcm1lciBMZXZlbC1DaGFubmVsIHdpbGwgYmUgdXNlZCBmb3IgYm90aCBjaGFubmVscyAqLwotICAgICAgICAgICAgaWYgKGhfcHJldl9kYXRhLT5jb3VwbGluZyA9PSBDT1VQTElOR19CQUwpCi0gICAgICAgICAgICAgIGhfcHJldl9kYXRhLT5zZmJfbnJnX3ByZXZbaV0gPSBvdGhlckNoYW5uZWwtPnNmYl9ucmdfcHJldltpXTsKLSAgICAgICAgICAgIC8qIEZvcm1lciBML1Igd2lsbCBiZSBjb21iaW5lZCBhcyB0aGUgbmV3IExldmVsLUNoYW5uZWwgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKGhfc2JyX2RhdGEtPmNvdXBsaW5nID09IENPVVBMSU5HX0xFVkVMKQotICAgICAgICAgICAgICBoX3ByZXZfZGF0YS0+c2ZiX25yZ19wcmV2W2ldID0gKGhfcHJldl9kYXRhLT5zZmJfbnJnX3ByZXZbaV0gKyBvdGhlckNoYW5uZWwtPnNmYl9ucmdfcHJldltpXSkgPj4gMTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGhfc2JyX2RhdGEtPmNvdXBsaW5nID09IENPVVBMSU5HX0JBTCkKLSAgICAgICAgICAgICAgaF9wcmV2X2RhdGEtPnNmYl9ucmdfcHJldltpXSA9IChGSVhQX1NHTClTQlJfRU5FUkdZX1BBTl9PRkZTRVQ7Ci0gICAgICAgICAgfQorICAgIC8qIGRlY29kZSB0aGUgZW52ZWxvcGUgZGF0YSB0byBsaW5lYXIgUENNICovCisgICAgZGVsdGFUb0xpbmVhclBjbUVudmVsb3BlRGVjb2RpbmcoaEhlYWRlckRhdGEsIGhfc2JyX2RhdGEsIGhfcHJldl9kYXRhKTsKKyAgfSBlbHNlIC8qRG8gYSB0ZW1wb3JhcnkgZHVtbXkgZGVjb2RpbmcgYW5kIGNoZWNrIHRoYXQgdGhlIGVudmVsb3BlIHZhbHVlcyBhcmUKKyAgICAgICAgICAgIHdpdGhpbiBsaW1pdHMgKi8KKyAgeworICAgIGlmIChoX3ByZXZfZGF0YS0+ZnJhbWVFcnJvckZsYWcpIHsKKyAgICAgIHRpbWVDb21wZW5zYXRlRmlyc3RFbnZlbG9wZShoSGVhZGVyRGF0YSwgaF9zYnJfZGF0YSwgaF9wcmV2X2RhdGEpOworICAgICAgaWYgKGhfc2JyX2RhdGEtPmNvdXBsaW5nICE9IGhfcHJldl9kYXRhLT5jb3VwbGluZykgeworICAgICAgICAvKgorICAgICAgICAgIENvdXBsaW5nIG1vZGUgaGFzIGNoYW5nZWQgZHVyaW5nIGNvbmNlYWxtZW50LgorICAgICAgICAgICBUaGUgc3RvcmVkIGVuZXJneSBsZXZlbHMgbmVlZCB0byBiZSBjb252ZXJ0ZWQuCisgICAgICAgICAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uU2ZiWzFdOyBpKyspIHsKKyAgICAgICAgICAvKiBGb3JtZXIgTGV2ZWwtQ2hhbm5lbCB3aWxsIGJlIHVzZWQgZm9yIGJvdGggY2hhbm5lbHMgKi8KKyAgICAgICAgICBpZiAoaF9wcmV2X2RhdGEtPmNvdXBsaW5nID09IENPVVBMSU5HX0JBTCkKKyAgICAgICAgICAgIGhfcHJldl9kYXRhLT5zZmJfbnJnX3ByZXZbaV0gPSBvdGhlckNoYW5uZWwtPnNmYl9ucmdfcHJldltpXTsKKyAgICAgICAgICAvKiBGb3JtZXIgTC9SIHdpbGwgYmUgY29tYmluZWQgYXMgdGhlIG5ldyBMZXZlbC1DaGFubmVsICovCisgICAgICAgICAgZWxzZSBpZiAoaF9zYnJfZGF0YS0+Y291cGxpbmcgPT0gQ09VUExJTkdfTEVWRUwpCisgICAgICAgICAgICBoX3ByZXZfZGF0YS0+c2ZiX25yZ19wcmV2W2ldID0gKGhfcHJldl9kYXRhLT5zZmJfbnJnX3ByZXZbaV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlckNoYW5uZWwtPnNmYl9ucmdfcHJldltpXSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOworICAgICAgICAgIGVsc2UgaWYgKGhfc2JyX2RhdGEtPmNvdXBsaW5nID09IENPVVBMSU5HX0JBTCkKKyAgICAgICAgICAgIGhfcHJldl9kYXRhLT5zZmJfbnJnX3ByZXZbaV0gPSAoRklYUF9TR0wpU0JSX0VORVJHWV9QQU5fT0ZGU0VUOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBGREttZW1jcHkgKHRlbXBTZmJOcmdQcmV2LCBoX3ByZXZfZGF0YS0+c2ZiX25yZ19wcmV2LAotICAgICAgICAgICAgICBNQVhfRlJFUV9DT0VGRlMgKiBzaXplb2YgKEZJWFBfU0dMKSk7Ci0KLSAgICAgIGRlbHRhVG9MaW5lYXJQY21FbnZlbG9wZURlY29kaW5nIChoSGVhZGVyRGF0YSwgaF9zYnJfZGF0YSwgaF9wcmV2X2RhdGEpOwotCi0gICAgICBmRnJhbWVFcnJvciA9IGNoZWNrRW52ZWxvcGVEYXRhIChoSGVhZGVyRGF0YSwgaF9zYnJfZGF0YSwgaF9wcmV2X2RhdGEpOwotCi0gICAgICBpZiAoZkZyYW1lRXJyb3IpCi0gICAgICAgIHsKLSAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJhbWVFcnJvckZsYWcgPSAxOwotICAgICAgICAgIEZES21lbWNweSAoaF9wcmV2X2RhdGEtPnNmYl9ucmdfcHJldiwgdGVtcFNmYk5yZ1ByZXYsCi0gICAgICAgICAgICAgICAgICBNQVhfRlJFUV9DT0VGRlMgKiBzaXplb2YgKEZJWFBfU0dMKSk7Ci0gICAgICAgICAgZGVjb2RlRW52ZWxvcGUgKGhIZWFkZXJEYXRhLCBoX3Nicl9kYXRhLCBoX3ByZXZfZGF0YSwgb3RoZXJDaGFubmVsKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KICAgICB9CisgICAgRkRLbWVtY3B5KHRlbXBTZmJOcmdQcmV2LCBoX3ByZXZfZGF0YS0+c2ZiX25yZ19wcmV2LAorICAgICAgICAgICAgICBNQVhfRlJFUV9DT0VGRlMgKiBzaXplb2YoRklYUF9TR0wpKTsKIAotICByZXF1YW50aXplRW52ZWxvcGVEYXRhIChoX3Nicl9kYXRhLCBoX3Nicl9kYXRhLT5hbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lKTsKKyAgICBkZWx0YVRvTGluZWFyUGNtRW52ZWxvcGVEZWNvZGluZyhoSGVhZGVyRGF0YSwgaF9zYnJfZGF0YSwgaF9wcmV2X2RhdGEpOworCisgICAgZkZyYW1lRXJyb3IgPSBjaGVja0VudmVsb3BlRGF0YShoSGVhZGVyRGF0YSwgaF9zYnJfZGF0YSwgaF9wcmV2X2RhdGEpOworCisgICAgaWYgKGZGcmFtZUVycm9yKSB7CisgICAgICBoSGVhZGVyRGF0YS0+ZnJhbWVFcnJvckZsYWcgPSAxOworICAgICAgRkRLbWVtY3B5KGhfcHJldl9kYXRhLT5zZmJfbnJnX3ByZXYsIHRlbXBTZmJOcmdQcmV2LAorICAgICAgICAgICAgICAgIE1BWF9GUkVRX0NPRUZGUyAqIHNpemVvZihGSVhQX1NHTCkpOworICAgICAgZGVjb2RlRW52ZWxvcGUoaEhlYWRlckRhdGEsIGhfc2JyX2RhdGEsIGhfcHJldl9kYXRhLCBvdGhlckNoYW5uZWwpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIHJlcXVhbnRpemVFbnZlbG9wZURhdGEoaF9zYnJfZGF0YSwgaF9zYnJfZGF0YS0+YW1wUmVzb2x1dGlvbkN1cnJlbnRGcmFtZSk7CiAKICAgaEhlYWRlckRhdGEtPmZyYW1lRXJyb3JGbGFnID0gZkZyYW1lRXJyb3I7CiB9CiAKLQogLyohCiAgIFxicmllZiAgIFZlcmlmeSB0aGF0IGVudmVsb3BlIGVuZXJnaWVzIGFyZSB3aXRoaW4gdGhlIGFsbG93ZWQgcmFuZ2UKICAgXHJldHVybiAgMCBpZiBhbGwgaXMgZmluZSwgMSBpZiBhbiBlbnZlbG9wZSB2YWx1ZSB3YXMgdG9vIGhpZ2gKICovCi1zdGF0aWMgaW50Ci1jaGVja0VudmVsb3BlRGF0YSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgICAgIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLCAgICAgICAvKiE8IHBvaW50ZXIgdG8gY3VycmVudCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGEgIC8qITwgcG9pbnRlciB0byBkYXRhIG9mIGxhc3QgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICAgICApCi17CitzdGF0aWMgaW50IGNoZWNrRW52ZWxvcGVEYXRhKAorICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAgIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLCAgICAgIC8qITwgcG9pbnRlciB0byBjdXJyZW50IGRhdGEgKi8KKyAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSAvKiE8IHBvaW50ZXIgdG8gZGF0YSBvZiBsYXN0IGZyYW1lICovCispIHsKICAgRklYUF9TR0wgKmlFbnZlbG9wZSA9IGhfc2JyX2RhdGEtPmlFbnZlbG9wZTsKICAgRklYUF9TR0wgKnNmYl9ucmdfcHJldiA9IGhfcHJldl9kYXRhLT5zZmJfbnJnX3ByZXY7Ci0gIGludCAgICBpID0gMCwgZXJyb3JGbGFnID0gMDsKLSAgRklYUF9TR0wgc2JyX21heF9lbmVyZ3kgPQotICAgIChoX3Nicl9kYXRhLT5hbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lID09IDEpID8gU0JSX01BWF9FTkVSR1kgOiAoU0JSX01BWF9FTkVSR1kgPDwgMSk7CisgIGludCBpID0gMCwgZXJyb3JGbGFnID0gMDsKKyAgRklYUF9TR0wgc2JyX21heF9lbmVyZ3kgPSAoaF9zYnJfZGF0YS0+YW1wUmVzb2x1dGlvbkN1cnJlbnRGcmFtZSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNCUl9NQVhfRU5FUkdZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKFNCUl9NQVhfRU5FUkdZIDw8IDEpOwogCiAgIC8qCiAgICAgUmFuZ2UgY2hlY2sgZm9yIGN1cnJlbnQgZW5lcmdpZXMKQEAgLTU2MSw3ICs1NzksNiBAQAogICByZXR1cm4gKGVycm9yRmxhZyk7CiB9CiAKLQogLyohCiAgIFxicmllZiAgIFZlcmlmeSB0aGF0IHRoZSBub2lzZSBsZXZlbHMgYXJlIHdpdGhpbiB0aGUgYWxsb3dlZCByYW5nZQogCkBAIC01NjksNDkgKzU4Niw1NSBAQAogICBXaGVuIHRoZSBub2lzZS1sZXZlbHMgYXJlIGJlaW5nIGRlY29kZWQsIGl0IGlzIGFscmVhZHkgdG9vIGxhdGUgZm9yCiAgIGNvbmNlYWxtZW50LiBUaGVyZWZvcmUgdGhlIG5vaXNlIGxldmVscyBhcmUgc2ltcGx5IGxpbWl0ZWQgaGVyZS4KICovCi1zdGF0aWMgdm9pZAotbGltaXROb2lzZUxldmVscyhIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgICAgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCi0gICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhKSAgICAgICAvKiE8IHBvaW50ZXIgdG8gY3VycmVudCBkYXRhICovCitzdGF0aWMgdm9pZCBsaW1pdE5vaXNlTGV2ZWxzKAorICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhKSAgIC8qITwgcG9pbnRlciB0byBjdXJyZW50IGRhdGEgKi8KIHsKICAgaW50IGk7CiAgIGludCBuTmZiID0gaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uTmZiOwogCi0gIC8qCi0gICAgU2V0IHJhbmdlIGxpbWl0cy4gVGhlIGV4YWN0IHZhbHVlcyBkZXBlbmQgb24gdGhlIGNvdXBsaW5nIG1vZGUuCi0gICAgSG93ZXZlciB0aGlzIGxpbWl0YXRpb24gaXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIGF2b2lkIHVubGltaXRlZAotICAgIGFjY3VtdWxhdGlvbiBvZiB0aGUgZGVsdGEtY29kZWQgbm9pc2UgbGV2ZWxzLgotICAqLwotICAjZGVmaW5lIGxvd2VyTGltaXQgICAoKEZJWFBfU0dMKTApICAgICAvKiBsb3dlckxpbWl0IGFjdHVhbGx5IHJlZmVycyB0byB0aGUgX2hpZ2hlc3RfIG5vaXNlIGVuZXJneSAqLwotICAjZGVmaW5lIHVwcGVyTGltaXQgICAoKEZJWFBfU0dMKTM1KSAgICAvKiB1cHBlckxpbWl0IGFjdHVhbGx5IHJlZmVycyB0byB0aGUgX2xvd2VzdF8gbm9pc2UgZW5lcmd5ICovCisvKgorICBTZXQgcmFuZ2UgbGltaXRzLiBUaGUgZXhhY3QgdmFsdWVzIGRlcGVuZCBvbiB0aGUgY291cGxpbmcgbW9kZS4KKyAgSG93ZXZlciB0aGlzIGxpbWl0YXRpb24gaXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIGF2b2lkIHVubGltaXRlZAorICBhY2N1bXVsYXRpb24gb2YgdGhlIGRlbHRhLWNvZGVkIG5vaXNlIGxldmVscy4KKyovCisjZGVmaW5lIGxvd2VyTGltaXQgXAorICAoKEZJWFBfU0dMKTApIC8qIGxvd2VyTGltaXQgYWN0dWFsbHkgcmVmZXJzIHRvIHRoZSBfaGlnaGVzdF8gbm9pc2UgZW5lcmd5ICovCisjZGVmaW5lIHVwcGVyTGltaXQgXAorICAoKEZJWFBfU0dMKTM1KSAvKiB1cHBlckxpbWl0IGFjdHVhbGx5IHJlZmVycyB0byB0aGUgX2xvd2VzdF8gbm9pc2UgZW5lcmd5ICovCiAKICAgLyoKICAgICBSYW5nZSBjaGVjayBmb3IgY3VycmVudCBub2lzZSBsZXZlbHMKICAgKi8KICAgZm9yIChpID0gMDsgaSA8IGhfc2JyX2RhdGEtPmZyYW1lSW5mby5uTm9pc2VFbnZlbG9wZXMgKiBuTmZiOyBpKyspIHsKLSAgICBoX3Nicl9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaV0gPSBmaXhNaW4oaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2ldLCB1cHBlckxpbWl0KTsKLSAgICBoX3Nicl9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaV0gPSBmaXhNYXgoaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2ldLCBsb3dlckxpbWl0KTsKKyAgICBoX3Nicl9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaV0gPQorICAgICAgICBmaXhNaW4oaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2ldLCB1cHBlckxpbWl0KTsKKyAgICBoX3Nicl9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaV0gPQorICAgICAgICBmaXhNYXgoaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2ldLCBsb3dlckxpbWl0KTsKICAgfQogfQogCi0KIC8qIQogICBcYnJpZWYgICBDb21wZW5zYXRlIGZvciB0aGUgd3JvbmcgdGltaW5nIHRoYXQgbWlnaHQgb2NjdXIgYWZ0ZXIgYSBmcmFtZSBlcnJvci4KICovCi1zdGF0aWMgdm9pZAotdGltZUNvbXBlbnNhdGVGaXJzdEVudmVsb3BlIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsICAgLyohPCBwb2ludGVyIHRvIGFjdHVhbCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhKSAgLyohPCBwb2ludGVyIHRvIGRhdGEgb2YgbGFzdCBmcmFtZSAqLworc3RhdGljIHZvaWQgdGltZUNvbXBlbnNhdGVGaXJzdEVudmVsb3BlKAorICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX3Nicl9kYXRhLCAgIC8qITwgcG9pbnRlciB0byBhY3R1YWwgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBCisgICAgICAgIGhfcHJldl9kYXRhKSAvKiE8IHBvaW50ZXIgdG8gZGF0YSBvZiBsYXN0IGZyYW1lICovCiB7CiAgIGludCBpLCBuU2NhbGVmYWN0b3JzOwogICBGUkFNRV9JTkZPICpwRnJhbWVJbmZvID0gJmhfc2JyX2RhdGEtPmZyYW1lSW5mbzsKICAgVUNIQVIgKm5TZmIgPSBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5TZmI7Ci0gIGludCBlc3RpbWF0ZWRTdGFydFBvcyA9IGhfcHJldl9kYXRhLT5zdG9wUG9zIC0gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90czsKKyAgaW50IGVzdGltYXRlZFN0YXJ0UG9zID0KKyAgICAgIGZNYXgoMCwgaF9wcmV2X2RhdGEtPnN0b3BQb3MgLSBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzKTsKICAgaW50IHJlZkxlbiwgbmV3TGVuLCBzaGlmdDsKLSAgRklYUF9TR0wgIGRlbHRhRXhwOworICBGSVhQX1NHTCBkZWx0YUV4cDsKIAogICAvKiBPcmlnaW5hbCBsZW5ndGggb2YgZmlyc3QgZW52ZWxvcGUgYWNjb3JkaW5nIHRvIGJpdHN0cmVhbSAqLwogICByZWZMZW4gPSBwRnJhbWVJbmZvLT5ib3JkZXJzWzFdIC0gcEZyYW1lSW5mby0+Ym9yZGVyc1swXTsKLSAgLyogQ29ycmVjdGVkIGxlbmd0aCBvZiBmaXJzdCBlbnZlbG9wZSAoY29uY2VhbGluZyBjYW4gbWFrZSB0aGUgZmlyc3QgZW52ZWxvcGUgbG9uZ2VyKSAqLworICAvKiBDb3JyZWN0ZWQgbGVuZ3RoIG9mIGZpcnN0IGVudmVsb3BlIChjb25jZWFsaW5nIGNhbiBtYWtlIHRoZSBmaXJzdCBlbnZlbG9wZQorICAgKiBsb25nZXIpICovCiAgIG5ld0xlbiA9IHBGcmFtZUluZm8tPmJvcmRlcnNbMV0gLSBlc3RpbWF0ZWRTdGFydFBvczsKIAogICBpZiAobmV3TGVuIDw9IDApIHsKQEAgLTYyNSw3ICs2NDgsOCBAQAogICBkZWx0YUV4cCA9IEZES19nZXROdW1PY3RhdmVzRGl2OChuZXdMZW4sIHJlZkxlbik7CiAKICAgLyogU2hpZnQgYnkgLTMgdG8gcmVzY2FsZSBsZC10YWJsZSwgYW1wUmVzLTEgdG8gZW5hYmxlIGNvYXJzZXIgc3RlcHMgKi8KLSAgc2hpZnQgPSAoRlJBQ1RfQklUUyAtIDEgLSBFTlZfRVhQX0ZSQUNUIC0gMSArIGhfc2JyX2RhdGEtPmFtcFJlc29sdXRpb25DdXJyZW50RnJhbWUgLSAzKTsKKyAgc2hpZnQgPSAoRlJBQ1RfQklUUyAtIDEgLSBFTlZfRVhQX0ZSQUNUIC0gMSArCisgICAgICAgICAgIGhfc2JyX2RhdGEtPmFtcFJlc29sdXRpb25DdXJyZW50RnJhbWUgLSAzKTsKICAgZGVsdGFFeHAgPSBkZWx0YUV4cCA+PiBzaGlmdDsKICAgcEZyYW1lSW5mby0+Ym9yZGVyc1swXSA9IGVzdGltYXRlZFN0YXJ0UG9zOwogICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMF0gPSBlc3RpbWF0ZWRTdGFydFBvczsKQEAgLTYzOCw4ICs2NjIsNiBAQAogICB9CiB9CiAKLQotCiAvKiEKICAgXGJyaWVmICAgQ29udmVydCBlYWNoIGVudmVsb3BlIHZhbHVlIGZyb20gbG9nYXJpdGhtaWMgdG8gbGluZWFyIGRvbWFpbgogCkBAIC02NjAsOSArNjgyLDggQEAKIAogICBUaGUgZGF0YSBpcyB0aGVuIHVzZWQgaW4gY2FsY3VsYXRlU2JyRW52ZWxvcGUoKS4KICovCi1zdGF0aWMgdm9pZAotcmVxdWFudGl6ZUVudmVsb3BlRGF0YSAoSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsIGludCBhbXBSZXNvbHV0aW9uKQoteworc3RhdGljIHZvaWQgcmVxdWFudGl6ZUVudmVsb3BlRGF0YShIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9zYnJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFtcFJlc29sdXRpb24pIHsKICAgaW50IGk7CiAgIEZJWFBfU0dMIG1hbnRpc3NhOwogICBpbnQgYW1wU2hpZnQgPSAxIC0gYW1wUmVzb2x1dGlvbjsKQEAgLTY3MiwxNiArNjkzLDE1IEBACiAgICAgIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGlzIGFycmF5IGhhcyB0byBiZSBhZGFwdGVkIQogICAqLwogI2lmIEVOVl9FWFBfRlJBQ1QKLSAgc3RhdGljIGNvbnN0IEZJWFBfU0dMIHBvdzJbRU5WX0VYUF9GUkFDVF0gPQotICB7Ci0gICAgRkwyRlhDT05TVF9TR0woMC41ZiAqIHBvdygyLjBmLCBwb3coMC41ZiwgMSkpKSwgLyogMC43MDcxICovCi0gICAgRkwyRlhDT05TVF9TR0woMC41ZiAqIHBvdygyLjBmLCBwb3coMC41ZiwgMikpKSwgLyogMC41OTQ2ICovCi0gICAgRkwyRlhDT05TVF9TR0woMC41ZiAqIHBvdygyLjBmLCBwb3coMC41ZiwgMykpKSwKLSAgICBGTDJGWENPTlNUX1NHTCgwLjVmICogcG93KDIuMGYsIHBvdygwLjVmLCA0KSkpLAotICAgIEZMMkZYQ09OU1RfU0dMKDAuNWYgKiBwb3coMi4wZiwgcG93KDAuNWYsIDUpKSksCi0gICAgRkwyRlhDT05TVF9TR0woMC41ZiAqIHBvdygyLjBmLCBwb3coMC41ZiwgNikpKSwKLSAgICBGTDJGWENPTlNUX1NHTCgwLjVmICogcG93KDIuMGYsIHBvdygwLjVmLCA3KSkpLAotICAgIEZMMkZYQ09OU1RfU0dMKDAuNWYgKiBwb3coMi4wZiwgcG93KDAuNWYsIDgpKSkgIC8qIDAuNTAxMyAqLworICBzdGF0aWMgY29uc3QgRklYUF9TR0wgcG93MltFTlZfRVhQX0ZSQUNUXSA9IHsKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDAuNWYgKiBwb3coMi4wZiwgcG93KDAuNWYsIDEpKSksIC8qIDAuNzA3MSAqLworICAgICAgRkwyRlhDT05TVF9TR0woMC41ZiAqIHBvdygyLjBmLCBwb3coMC41ZiwgMikpKSwgLyogMC41OTQ2ICovCisgICAgICBGTDJGWENPTlNUX1NHTCgwLjVmICogcG93KDIuMGYsIHBvdygwLjVmLCAzKSkpLAorICAgICAgRkwyRlhDT05TVF9TR0woMC41ZiAqIHBvdygyLjBmLCBwb3coMC41ZiwgNCkpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDAuNWYgKiBwb3coMi4wZiwgcG93KDAuNWYsIDUpKSksCisgICAgICBGTDJGWENPTlNUX1NHTCgwLjVmICogcG93KDIuMGYsIHBvdygwLjVmLCA2KSkpLAorICAgICAgRkwyRlhDT05TVF9TR0woMC41ZiAqIHBvdygyLjBmLCBwb3coMC41ZiwgNykpKSwKKyAgICAgIEZMMkZYQ09OU1RfU0dMKDAuNWYgKiBwb3coMi4wZiwgcG93KDAuNWYsIDgpKSkgLyogMC41MDEzICovCiAgIH07CiAKICAgaW50IGJpdCwgbWFzazsKQEAgLTY5OCwxMyArNzE4LDEzIEBACiAgICAgLyogQW1wbGlmeSBtYW50aXNzYSBhY2NvcmRpbmcgdG8gdGhlIGZyYWN0aW9uYWwgcGFydCBvZiB0aGUKICAgICAgICBleHBvbmVudCAocmVzdWx0IHdpbGwgYmUgYmV0d2VlbiAwLjUwMDAwMCBhbmQgMC45OTk5OTkpCiAgICAgKi8KLSAgICBtYXNrID0gMTsgIC8qIGJlZ2luIHdpdGggbG93ZXN0IGJpdCBvZiBleHBvbmVudCAqLworICAgIG1hc2sgPSAxOyAvKiBiZWdpbiB3aXRoIGxvd2VzdCBiaXQgb2YgZXhwb25lbnQgKi8KIAotICAgIGZvciAoIGJpdD1FTlZfRVhQX0ZSQUNULTE7IGJpdD49MDsgYml0LS0gKSB7CisgICAgZm9yIChiaXQgPSBFTlZfRVhQX0ZSQUNUIC0gMTsgYml0ID49IDA7IGJpdC0tKSB7CiAgICAgICBpZiAoZXhwb25lbnQgJiBtYXNrKSB7CiAgICAgICAgIC8qIFRoZSBjdXJyZW50IGJpdCBvZiB0aGUgZXhwb25lbnQgaXMgc2V0LAogICAgICAgICAgICBtdWx0aXBseSBtYW50aXNzYSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGZhY3RvcjogKi8KLSAgICAgICAgbWFudGlzc2EgPSAoRklYUF9TR0wpKCAobWFudGlzc2EgKiBwb3cyW2JpdF0pIDw8IDEpOworICAgICAgICBtYW50aXNzYSA9IChGSVhQX1NHTCkoKG1hbnRpc3NhICogcG93MltiaXRdKSA8PCAxKTsKICAgICAgIH0KICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBiaXQgKi8KICAgICAgIG1hc2sgPSBtYXNrIDw8IDE7CkBAIC03MTQsNDAgKzczNCw0MyBAQAogICAgIGV4cG9uZW50ID0gZXhwb25lbnQgPj4gRU5WX0VYUF9GUkFDVDsKIAogI2Vsc2UKLSAgICAvKiBJbiBjYXNlIG9mIHRoZSBoaWdoIGFtcGxpdHVkZSByZXNvbHV0aW9uLCAxIGJpdCBvZiB0aGUgZXhwb25lbnQgZ2V0cyBsb3N0IGJ5IHRoZSBzaGlmdC4KLSAgICAgICBUaGlzIHdpbGwgYmUgY29tcGVuc2F0ZWQgYnkgYSBtYW50aXNzYSBvZiAwLjUqc3FydCgyKSBpbnN0ZWFkIG9mIDAuNSBpZiB0aGF0IGJpdCBpcyAxLiAqLwotICAgIG1hbnRpc3NhID0gKGV4cG9uZW50ICYgYW1wU2hpZnQpID8gRkwyRlhDT05TVF9TR0woMC43MDcxMDY3ODExODY1NDhmKSA6IEZMMkZYQ09OU1RfU0dMKDAuNWYpOworICAgIC8qIEluIGNhc2Ugb2YgdGhlIGhpZ2ggYW1wbGl0dWRlIHJlc29sdXRpb24sIDEgYml0IG9mIHRoZSBleHBvbmVudCBnZXRzIGxvc3QKKyAgICAgICBieSB0aGUgc2hpZnQuIFRoaXMgd2lsbCBiZSBjb21wZW5zYXRlZCBieSBhIG1hbnRpc3NhIG9mIDAuNSpzcXJ0KDIpCisgICAgICAgaW5zdGVhZCBvZiAwLjUgaWYgdGhhdCBiaXQgaXMgMS4gKi8KKyAgICBtYW50aXNzYSA9IChleHBvbmVudCAmIGFtcFNoaWZ0KSA/IEZMMkZYQ09OU1RfU0dMKDAuNzA3MTA2NzgxMTg2NTQ4ZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZMMkZYQ09OU1RfU0dMKDAuNWYpOwogICAgIGV4cG9uZW50ID0gZXhwb25lbnQgPj4gYW1wU2hpZnQ7CiAjZW5kaWYKIAogICAgIC8qCi0gICAgICBNYW50aXNzYSB3YXMgc2V0IHRvIDAuNSAoaW5zdGVhZCBvZiAxLjAsIHRoZXJlZm9yZSBpbmNyZWFzZSBleHBvbmVudCBieSAxKS4KLSAgICAgIE11bHRpcGx5IGJ5IEw9bkNoYW5uZWxzPTY0IGJ5IGluY3JlYXNpbmcgZXhwb25lbnQgYnkgYW5vdGhlciA2LgorICAgICAgTWFudGlzc2Egd2FzIHNldCB0byAwLjUgKGluc3RlYWQgb2YgMS4wLCB0aGVyZWZvcmUgaW5jcmVhc2UgZXhwb25lbnQgYnkKKyAgICAgIDEpLiBNdWx0aXBseSBieSBMPW5DaGFubmVscz02NCBieSBpbmNyZWFzaW5nIGV4cG9uZW50IGJ5IGFub3RoZXIgNi4KICAgICAgID0+IEluY3JlYXNlIGV4cG9uZW50IGJ5IDcKICAgICAqLwogICAgIGV4cG9uZW50ICs9IDcgKyBOUkdfRVhQX09GRlNFVDsKIAogICAgIC8qIENvbWJpbmUgbWFudGlzc2EgYW5kIGV4cG9uZW50IGFuZCB3cml0ZSBiYWNrIHRoZSByZXN1bHQgKi8KLSAgICBoX3Nicl9kYXRhLT5pRW52ZWxvcGVbaV0gPSAoRklYUF9TR0wpKCgoTE9ORyltYW50aXNzYSAmIE1BU0tfTSkgfCAoZXhwb25lbnQgJiBNQVNLX0UpKTsKLQorICAgIGhfc2JyX2RhdGEtPmlFbnZlbG9wZVtpXSA9CisgICAgICAgICgoRklYUF9TR0wpKChTSE9SVCkoRklYUF9TR0wpbWFudGlzc2EgJiBNQVNLX00pKSArCisgICAgICAgIChGSVhQX1NHTCkoKFNIT1JUKShGSVhQX1NHTClleHBvbmVudCAmIE1BU0tfRSk7CiAgIH0KIH0KIAotCiAvKiEKICAgXGJyaWVmICAgQnVpbGQgbmV3IHJlZmVyZW5jZSBlbmVyZ2llcyBmcm9tIG9sZCBvbmVzIGFuZCBkZWx0YSBjb2RlZCBkYXRhCiAqLwotc3RhdGljIHZvaWQKLWRlbHRhVG9MaW5lYXJQY21FbnZlbG9wZURlY29kaW5nIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgICAgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsICAgICAgIC8qITwgcG9pbnRlciB0byBjdXJyZW50IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSkgLyohPCBwb2ludGVyIHRvIHByZXZpb3VzIGRhdGEgKi8KK3N0YXRpYyB2b2lkIGRlbHRhVG9MaW5lYXJQY21FbnZlbG9wZURlY29kaW5nKAorICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAgICAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9zYnJfZGF0YSwgICAgICAgLyohPCBwb2ludGVyIHRvIGN1cnJlbnQgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhKSAvKiE8IHBvaW50ZXIgdG8gcHJldmlvdXMgZGF0YSAqLwogewogICBpbnQgaSwgZG9tYWluLCBub19vZl9iYW5kcywgYmFuZCwgZnJlcVJlczsKIAogICBGSVhQX1NHTCAqc2ZiX25yZ19wcmV2ID0gaF9wcmV2X2RhdGEtPnNmYl9ucmdfcHJldjsKICAgRklYUF9TR0wgKnB0cl9ucmcgPSBoX3Nicl9kYXRhLT5pRW52ZWxvcGU7CiAKLSAgaW50IG9mZnNldCA9IDIgKiBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5TZmJbMF0gLSBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5TZmJbMV07CisgIGludCBvZmZzZXQgPQorICAgICAgMiAqIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEublNmYlswXSAtIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEublNmYlsxXTsKIAogICBmb3IgKGkgPSAwOyBpIDwgaF9zYnJfZGF0YS0+ZnJhbWVJbmZvLm5FbnZlbG9wZXM7IGkrKykgewogICAgIGRvbWFpbiA9IGhfc2JyX2RhdGEtPmRvbWFpbl92ZWNbaV07CkBAIC03NTksMjIgKzc4MiwxOCBAQAogCiAgICAgRkRLX0FTU0VSVChub19vZl9iYW5kcyA8ICg2NCkpOwogCi0gICAgaWYgKGRvbWFpbiA9PSAwKQotICAgIHsKKyAgICBpZiAoZG9tYWluID09IDApIHsKICAgICAgIG1hcExvd1Jlc0VuZXJneVZhbCgqcHRyX25yZywgc2ZiX25yZ19wcmV2LCBvZmZzZXQsIDAsIGZyZXFSZXMpOwogICAgICAgcHRyX25yZysrOwotICAgICAgZm9yIChiYW5kID0gMTsgYmFuZCA8IG5vX29mX2JhbmRzOyBiYW5kKyspCi0gICAgICB7Ci0gICAgICAgICpwdHJfbnJnID0gKnB0cl9ucmcgKyAqKHB0cl9ucmctMSk7CisgICAgICBmb3IgKGJhbmQgPSAxOyBiYW5kIDwgbm9fb2ZfYmFuZHM7IGJhbmQrKykgeworICAgICAgICAqcHRyX25yZyA9ICpwdHJfbnJnICsgKihwdHJfbnJnIC0gMSk7CiAgICAgICAgIG1hcExvd1Jlc0VuZXJneVZhbCgqcHRyX25yZywgc2ZiX25yZ19wcmV2LCBvZmZzZXQsIGJhbmQsIGZyZXFSZXMpOwogICAgICAgICBwdHJfbnJnKys7CiAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbm9fb2ZfYmFuZHM7IGJhbmQrKykKLSAgICAgIHsKLSAgICAgICAgKnB0cl9ucmcgPSAqcHRyX25yZyArIHNmYl9ucmdfcHJldltpbmRleExvdzJIaWdoKG9mZnNldCwgYmFuZCwgZnJlcVJlcyldOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbm9fb2ZfYmFuZHM7IGJhbmQrKykgeworICAgICAgICAqcHRyX25yZyA9CisgICAgICAgICAgICAqcHRyX25yZyArIHNmYl9ucmdfcHJldltpbmRleExvdzJIaWdoKG9mZnNldCwgYmFuZCwgZnJlcVJlcyldOwogICAgICAgICBtYXBMb3dSZXNFbmVyZ3lWYWwoKnB0cl9ucmcsIHNmYl9ucmdfcHJldiwgb2Zmc2V0LCBiYW5kLCBmcmVxUmVzKTsKICAgICAgICAgcHRyX25yZysrOwogICAgICAgfQpAQCAtNzgyLDE0ICs4MDEsMTMgQEAKICAgfQogfQogCi0KIC8qIQogICBcYnJpZWYgICBCdWlsZCBuZXcgbm9pc2UgbGV2ZWxzIGZyb20gb2xkIG9uZXMgYW5kIGRlbHRhIGNvZGVkIGRhdGEKICovCi1zdGF0aWMgdm9pZAotZGVjb2RlTm9pc2VGbG9vcmxldmVscyAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgICAgIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsICAgICAgIC8qITwgcG9pbnRlciB0byBjdXJyZW50IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhKSAvKiE8IHBvaW50ZXIgdG8gcHJldmlvdXMgZGF0YSAqLworc3RhdGljIHZvaWQgZGVjb2RlTm9pc2VGbG9vcmxldmVscygKKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgICAgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCisgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfc2JyX2RhdGEsICAgICAgIC8qITwgcG9pbnRlciB0byBjdXJyZW50IGRhdGEgKi8KKyAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSkgLyohPCBwb2ludGVyIHRvIHByZXZpb3VzIGRhdGEgKi8KIHsKICAgaW50IGk7CiAgIGludCBuTmZiID0gaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uTmZiOwpAQCAtODAzLDggKzgyMSw3IEBACiAgICAgICBub2lzZUxldmVsICs9IGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpXTsKICAgICAgIGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpXSA9IG5vaXNlTGV2ZWw7CiAgICAgfQotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIGZvciAoaSA9IDA7IGkgPCBuTmZiOyBpKyspIHsKICAgICAgIGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpXSArPSBoX3ByZXZfZGF0YS0+cHJldk5vaXNlTGV2ZWxbaV07CiAgICAgfQpAQCAtODE2LDE0ICs4MzMsMTQgQEAKICAgaWYgKG5Ob2lzZUZsb29yRW52ZWxvcGVzID4gMSkgewogICAgIGlmIChoX3Nicl9kYXRhLT5kb21haW5fdmVjX25vaXNlWzFdID09IDApIHsKICAgICAgIEZJWFBfU0dMIG5vaXNlTGV2ZWwgPSBoX3Nicl9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbbk5mYl07Ci0gICAgICBmb3IgKGkgPSBuTmZiICsgMTsgaSA8IDIqbk5mYjsgaSsrKSB7CisgICAgICBmb3IgKGkgPSBuTmZiICsgMTsgaSA8IDIgKiBuTmZiOyBpKyspIHsKICAgICAgICAgbm9pc2VMZXZlbCArPSBoX3Nicl9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaV07CiAgICAgICAgIGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpXSA9IG5vaXNlTGV2ZWw7CiAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICBmb3IgKGkgPSAwOyBpIDwgbk5mYjsgaSsrKSB7Ci0gICAgICAgIGhfc2JyX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpICsgbk5mYl0gKz0gaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2ldOworICAgICAgICBoX3Nicl9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaSArIG5OZmJdICs9CisgICAgICAgICAgICBoX3Nicl9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaV07CiAgICAgICB9CiAgICAgfQogICB9CkBAIC04MzIsMjEgKzg0OSwyMCBAQAogCiAgIC8qIFVwZGF0ZSBwcmV2Tm9pc2VMZXZlbCB3aXRoIHRoZSBsYXN0IG5vaXNlIGVudmVsb3BlICovCiAgIGZvciAoaSA9IDA7IGkgPCBuTmZiOyBpKyspCi0gICAgaF9wcmV2X2RhdGEtPnByZXZOb2lzZUxldmVsW2ldID0gaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2kgKyBuTmZiKihuTm9pc2VGbG9vckVudmVsb3Blcy0xKV07Ci0KKyAgICBoX3ByZXZfZGF0YS0+cHJldk5vaXNlTGV2ZWxbaV0gPQorICAgICAgICBoX3Nicl9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaSArIG5OZmIgKiAobk5vaXNlRmxvb3JFbnZlbG9wZXMgLSAxKV07CiAKICAgLyogUmVxdWFudGl6ZSB0aGUgbm9pc2UgZmxvb3IgbGV2ZWxzIGluIENPVVBMSU5HX09GRi1tb2RlICovCiAgIGlmICghaF9zYnJfZGF0YS0+Y291cGxpbmcpIHsKICAgICBpbnQgbmZfZTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBuTm9pc2VGbG9vckVudmVsb3BlcypuTmZiOyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbk5vaXNlRmxvb3JFbnZlbG9wZXMgKiBuTmZiOyBpKyspIHsKICAgICAgIG5mX2UgPSA2IC0gKExPTkcpaF9zYnJfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2ldICsgMSArIE5PSVNFX0VYUF9PRkZTRVQ7CiAgICAgICAvKiArMSB0byBjb21wZW5zYXRlIGZvciBhIG1hbnRpc3NhIG9mIDAuNSBpbnN0ZWFkIG9mIDEuMCAqLwogCiAgICAgICBoX3Nicl9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaV0gPQotICAgICAgICAoRklYUF9TR0wpKCAoKExPTkcpRkwyRlhDT05TVF9TR0woMC41ZikpICsgIC8qIG1hbnRpc3NhICovCi0gICAgICAgICAgICAgICAgICAobmZfZSAmIE1BU0tfRSkgKTsgLyogZXhwb25lbnQgKi8KLQorICAgICAgICAgIChGSVhQX1NHTCkoKChMT05HKUZMMkZYQ09OU1RfU0dMKDAuNWYpKSArIC8qIG1hbnRpc3NhICovCisgICAgICAgICAgICAgICAgICAgICAobmZfZSAmIE1BU0tfRSkpOyAgICAgICAgICAgICAgLyogZXhwb25lbnQgKi8KICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvZW52X2RlYy5oIGIvbGliU0JSZGVjL3NyYy9lbnZfZGVjLmgKaW5kZXggNmY2ZGFlMy4uMGIxMWNlMSAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9lbnZfZGVjLmgKKysrIGIvbGliU0JSZGVjL3NyYy9lbnZfZGVjLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjMgKzkwLDMwIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgRW52ZWxvcGUgZGVjb2RpbmcgIAorICBcYnJpZWYgIEVudmVsb3BlIGRlY29kaW5nCiAqLwotI2lmbmRlZiBfX0VOVl9ERUNfSAotI2RlZmluZSBfX0VOVl9ERUNfSAorI2lmbmRlZiBFTlZfREVDX0gKKyNkZWZpbmUgRU5WX0RFQ19ICiAKICNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCiAjaW5jbHVkZSAiZW52X2V4dHIuaCIKIAotdm9pZCBkZWNvZGVTYnJEYXRhIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9kYXRhX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2RhdGFfcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhX3JpZ2h0KTsKLQordm9pZCBkZWNvZGVTYnJEYXRhKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZGF0YV9sZWZ0LAorICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhX2xlZnQsCisgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZGF0YV9yaWdodCwKKyAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YV9yaWdodCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9lbnZfZXh0ci5jcHAgYi9saWJTQlJkZWMvc3JjL2Vudl9leHRyLmNwcAppbmRleCA0ZDUzYTEzLi5lNmFlNmRjIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL2Vudl9leHRyLmNwcAorKysgYi9saWJTQlJkZWMvc3JjL2Vudl9leHRyLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw0NyArOTAsNjUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBFbnZlbG9wZSBleHRyYWN0aW9uICAKLSAgVGhlIGZ1bmN0aW9ucyBwcm92aWRlZCBieSB0aGlzIG1vZHVsZSBhcmUgbW9zdGx5IGNhbGxlZCBieSBhcHBseVNCUigpLiBBZnRlciBpdCBpcwotICBkZXRlcm1pbmVkIHRoYXQgdGhlcmUgaXMgdmFsaWQgU0JSIGRhdGEsIHNickdldEhlYWRlckRhdGEoKSBtaWdodCBiZSBjYWxsZWQgaWYgdGhlIGN1cnJlbnQKLSAgU0JSIGRhdGEgY29udGFpbnMgYW4gXHJlZiBTQlJfSEVBREVSX0VMRU1FTlQgYXMgb3Bwb3NlZCB0byBhIFxyZWYgU0JSX1NUQU5EQVJEX0VMRU1FTlQuIFRoaXMgZnVuY3Rpb24KLSAgbWF5IHJldHVybiB2YXJpb3VzIGVycm9yIGNvZGVzIGFzIGRlZmluZWQgaW4gI1NCUl9IRUFERVJfU1RBVFVTIC4gTW9zdCBpbXBvcnRhbnRseSBpdCByZXR1cm5zIEhFQURFUl9SRVNFVCB3aGVuIGRlY29kZXIKLSAgc2V0dGluZ3MgbmVlZCB0byBiZSByZWNhbGN1bGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBTQlIgc3BlY2lmaWNhdGlvbnMuIEluIHRoYXQgY2FzZSBhcHBseVNCUigpCi0gIHdpbGwgaW5pdGlhdGl0ZSB0aGUgcmVxdWlyZWQgcmUtY29uZmlndXJhdGlvbi4KKyAgXGJyaWVmICBFbnZlbG9wZSBleHRyYWN0aW9uCisgIFRoZSBmdW5jdGlvbnMgcHJvdmlkZWQgYnkgdGhpcyBtb2R1bGUgYXJlIG1vc3RseSBjYWxsZWQgYnkgYXBwbHlTQlIoKS4gQWZ0ZXIKKyAgaXQgaXMgZGV0ZXJtaW5lZCB0aGF0IHRoZXJlIGlzIHZhbGlkIFNCUiBkYXRhLCBzYnJHZXRIZWFkZXJEYXRhKCkgbWlnaHQgYmUKKyAgY2FsbGVkIGlmIHRoZSBjdXJyZW50IFNCUiBkYXRhIGNvbnRhaW5zIGFuIFxyZWYgU0JSX0hFQURFUl9FTEVNRU5UIGFzIG9wcG9zZWQKKyAgdG8gYSBccmVmIFNCUl9TVEFOREFSRF9FTEVNRU5ULiBUaGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gdmFyaW91cyBlcnJvciBjb2RlcworICBhcyBkZWZpbmVkIGluICNTQlJfSEVBREVSX1NUQVRVUyAuIE1vc3QgaW1wb3J0YW50bHkgaXQgcmV0dXJucyBIRUFERVJfUkVTRVQKKyAgd2hlbiBkZWNvZGVyIHNldHRpbmdzIG5lZWQgdG8gYmUgcmVjYWxjdWxhdGVkIGFjY29yZGluZyB0byB0aGUgU0JSCisgIHNwZWNpZmljYXRpb25zLiBJbiB0aGF0IGNhc2UgYXBwbHlTQlIoKSB3aWxsIGluaXRpYXRpdGUgdGhlIHJlcXVpcmVkCisgIHJlLWNvbmZpZ3VyYXRpb24uCiAKICAgVGhlIGhlYWRlciBkYXRhIGlzIHN0b3JlZCBpbiBhICNTQlJfSEVBREVSX0RBVEEgc3RydWN0dXJlLgogCi0gIFRoZSBhY3R1YWwgU0JSIGRhdGEgZm9yIHRoZSBjdXJyZW50IGZyYW1lIGlzIGRlY29kZWQgaW50byBTQlJfRlJBTUVfREFUQSBzdHVjdHVyZXMgYnkgc2JyR2V0Q2hhbm5lbFBhaXJFbGVtZW50KCkKLSAgW2ZvciBzdGVyZW8gc3RyZWFtc10gYW5kIHNickdldFNpbmdsZUNoYW5uZWxFbGVtZW50KCkgW2ZvciBtb25vIHN0cmVhbXNdLiBUaGVyZSBpcyBubyBmcmFjdGlvbmFsIGFyaXRobWV0aWMgaW52b2x2ZWQuCisgIFRoZSBhY3R1YWwgU0JSIGRhdGEgZm9yIHRoZSBjdXJyZW50IGZyYW1lIGlzIGRlY29kZWQgaW50byBTQlJfRlJBTUVfREFUQQorICBzdHVjdHVyZXMgYnkgc2JyR2V0Q2hhbm5lbFBhaXJFbGVtZW50KCkgW2ZvciBzdGVyZW8gc3RyZWFtc10gYW5kCisgIHNickdldFNpbmdsZUNoYW5uZWxFbGVtZW50KCkgW2ZvciBtb25vIHN0cmVhbXNdLiBUaGVyZSBpcyBubyBmcmFjdGlvbmFsCisgIGFyaXRobWV0aWMgaW52b2x2ZWQuCiAKLSAgT25jZSB0aGUgaW5mb3JtYXRpb24gaXMgZXh0cmFjdGVkLCB0aGUgZGF0YSBuZWVkcyB0byBiZSBmdXJ0aGVyIHByZXBhcmVkIGJlZm9yZSB0aGUgYWN0dWFsIGRlY29kaW5nIHByb2Nlc3MuCi0gIFRoaXMgaXMgZG9uZSBpbiBkZWNvZGVTYnJEYXRhKCkuCisgIE9uY2UgdGhlIGluZm9ybWF0aW9uIGlzIGV4dHJhY3RlZCwgdGhlIGRhdGEgbmVlZHMgdG8gYmUgZnVydGhlciBwcmVwYXJlZAorICBiZWZvcmUgdGhlIGFjdHVhbCBkZWNvZGluZyBwcm9jZXNzLiBUaGlzIGlzIGRvbmUgaW4gZGVjb2RlU2JyRGF0YSgpLgogCiAgIFxzYSBEZXNjcmlwdGlvbiBvZiBidWZmZXIgbWFuYWdlbWVudCBpbiBhcHBseVNCUigpLiBccmVmIGRvY3VtZW50YXRpb25PdmVydmlldwogCiAgIDxoMT5BYm91dCB0aGUgU0JSIGRhdGEgZm9ybWF0OjwvaDE+CiAKLSAgRWFjaCBmcmFtZSBpbmNsdWRlcyBTQlIgZGF0YSAoc2lkZSBjaGFpbiBpbmZvcm1hdGlvbiksIGFuZCBjYW4gYmUgZWl0aGVyIHRoZSBccmVmIFNCUl9IRUFERVJfRUxFTUVOVCBvciB0aGUgXHJlZiBTQlJfU1RBTkRBUkRfRUxFTUVOVC4KLSAgUGFydHMgb2YgdGhlIGRhdGEgY2FuIGJlIHByb3RlY3RlZCBieSBhIENSQyBjaGVja3N1bS4KKyAgRWFjaCBmcmFtZSBpbmNsdWRlcyBTQlIgZGF0YSAoc2lkZSBjaGFpbiBpbmZvcm1hdGlvbiksIGFuZCBjYW4gYmUgZWl0aGVyIHRoZQorICBccmVmIFNCUl9IRUFERVJfRUxFTUVOVCBvciB0aGUgXHJlZiBTQlJfU1RBTkRBUkRfRUxFTUVOVC4gUGFydHMgb2YgdGhlIGRhdGEKKyAgY2FuIGJlIHByb3RlY3RlZCBieSBhIENSQyBjaGVja3N1bS4KIAogICBcYW5jaG9yIFNCUl9IRUFERVJfRUxFTUVOVCA8aDI+VGhlIFNCUl9IRUFERVJfRUxFTUVOVDwvaDI+CiAKLSAgVGhlIFNCUl9IRUFERVJfRUxFTUVOVCBjYW4gYmUgdHJhbnNtaXR0ZWQgd2l0aCBldmVyeSBmcmFtZSwgaG93ZXZlciwgaXQgdHlwaWNhbGx5IGlzIHNlbmQgZXZlcnkgc2Vjb25kIG9yIHNvLiBJdCBjb250YWlucyBmdW5kYW1lbnRhbAotICBpbmZvcm1hdGlvbiBzdWNoIGFzIFNCUiBzYW1wbGluZyBmcmVxdWVuY3kgYW5kIGZyZXF1ZW5jeSByYW5nZSBhcyB3ZWxsIGFzIGNvbnRyb2wgc2lnbmFscyB0aGF0IGRvIG5vdCByZXF1aXJlIGZyZXF1ZW50IGNoYW5nZXMuIEl0IGFsc28KLSAgaW5jbHVkZXMgdGhlIFxyZWYgU0JSX1NUQU5EQVJEX0VMRU1FTlQuCisgIFRoZSBTQlJfSEVBREVSX0VMRU1FTlQgY2FuIGJlIHRyYW5zbWl0dGVkIHdpdGggZXZlcnkgZnJhbWUsIGhvd2V2ZXIsIGl0CisgIHR5cGljYWxseSBpcyBzZW5kIGV2ZXJ5IHNlY29uZCBvciBzby4gSXQgY29udGFpbnMgZnVuZGFtZW50YWwgaW5mb3JtYXRpb24gc3VjaAorICBhcyBTQlIgc2FtcGxpbmcgZnJlcXVlbmN5IGFuZCBmcmVxdWVuY3kgcmFuZ2UgYXMgd2VsbCBhcyBjb250cm9sIHNpZ25hbHMgdGhhdAorICBkbyBub3QgcmVxdWlyZSBmcmVxdWVudCBjaGFuZ2VzLiBJdCBhbHNvIGluY2x1ZGVzIHRoZSBccmVmCisgIFNCUl9TVEFOREFSRF9FTEVNRU5ULgogCi0gIERlcGVuZGluZyBvbiB0aGUgY2hhbmdlcyBiZXR3ZWVuIHRoZSBpbmZvcm1hdGlvbiBpbiBhIGN1cnJlbnQgU0JSX0hFQURFUl9FTEVNRU5UIGFuZCB0aGUgcHJldmlvdXMgU0JSX0hFQURFUl9FTEVNRU5ULCB0aGUgU0JSIGRlY29kZXIgbWlnaHQgbmVlZAotICB0byBiZSByZXNldCBhbmQgcmVjb25maWd1cmVkIChlLmcuIG5ldyB0YWJsZXMgbmVlZCB0byBiZSBjYWxjdWxhdGVkKS4KKyAgRGVwZW5kaW5nIG9uIHRoZSBjaGFuZ2VzIGJldHdlZW4gdGhlIGluZm9ybWF0aW9uIGluIGEgY3VycmVudAorICBTQlJfSEVBREVSX0VMRU1FTlQgYW5kIHRoZSBwcmV2aW91cyBTQlJfSEVBREVSX0VMRU1FTlQsIHRoZSBTQlIgZGVjb2RlciBtaWdodAorICBuZWVkIHRvIGJlIHJlc2V0IGFuZCByZWNvbmZpZ3VyZWQgKGUuZy4gbmV3IHRhYmxlcyBuZWVkIHRvIGJlIGNhbGN1bGF0ZWQpLgogCiAgIFxhbmNob3IgU0JSX1NUQU5EQVJEX0VMRU1FTlQgPGgyPlRoZSBTQlJfU1RBTkRBUkRfRUxFTUVOVDwvaDI+CiAKLSAgVGhpcyBkYXRhIGNhbiBiZSBzdWJkaXZpZGVkIGludG8gInNpZGUgaW5mbyIgYW5kICJyYXcgZGF0YSIsIHdoZXJlIHNpZGUgaW5mbyBpcyBkZWZpbmVkIGFzIHNpZ25hbHMgbmVlZGVkIHRvIGRlY29kZSB0aGUgcmF3IGRhdGEKLSAgYW5kIHNvbWUgZGVjb2RlciB0dW5pbmcgc2lnbmFscy4gUmF3IGRhdGEgaXMgcmVmZXJyZWQgdG8gYXMgUENNIGFuZCBIdWZmbWFuIGNvZGVkIGVudmVsb3BlIGFuZCBub2lzZSBmbG9vciBlc3RpbWF0ZXMuIFRoZSBzaWRlIGluZm8gYWxzbwotICBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGltZS1mcmVxdWVuY3kgZ3JpZCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUuCisgIFRoaXMgZGF0YSBjYW4gYmUgc3ViZGl2aWRlZCBpbnRvICJzaWRlIGluZm8iIGFuZCAicmF3IGRhdGEiLCB3aGVyZSBzaWRlIGluZm8KKyAgaXMgZGVmaW5lZCBhcyBzaWduYWxzIG5lZWRlZCB0byBkZWNvZGUgdGhlIHJhdyBkYXRhIGFuZCBzb21lIGRlY29kZXIgdHVuaW5nCisgIHNpZ25hbHMuIFJhdyBkYXRhIGlzIHJlZmVycmVkIHRvIGFzIFBDTSBhbmQgSHVmZm1hbiBjb2RlZCBlbnZlbG9wZSBhbmQgbm9pc2UKKyAgZmxvb3IgZXN0aW1hdGVzLiBUaGUgc2lkZSBpbmZvIGFsc28gaW5jbHVkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgIHRpbWUtZnJlcXVlbmN5IGdyaWQgZm9yIHRoZSBjdXJyZW50IGZyYW1lLgogCiAgIFxzYSBccmVmIGRvY3VtZW50YXRpb25PdmVydmlldwogKi8KQEAgLTEzMCw2MCArMTU5LDExNSBAQAogI2luY2x1ZGUgInNicl9yb20uaCIKICNpbmNsdWRlICJodWZmX2RlYy5oIgogCi0KICNpbmNsdWRlICJwc2JpdGRlYy5oIgogCi0jZGVmaW5lIERSTV9QQVJBTUVUUklDX1NURVJFTyAgIDAKLSNkZWZpbmUgRVhURU5TSU9OX0lEX1BTX0NPRElORyAgMgorI2RlZmluZSBEUk1fUEFSQU1FVFJJQ19TVEVSRU8gMAorI2RlZmluZSBFWFRFTlNJT05fSURfUFNfQ09ESU5HIDIKIAorc3RhdGljIGludCBleHRyYWN0UHZjRnJhbWVJbmZvKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgICAgICAgICAgIC8qITwgYml0YnVmZmVyIGhhbmRsZSAqLworICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2ZyYW1lX2RhdGEsIC8qITwgcG9pbnRlciB0byBtZW1vcnkgd2hlcmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtaW5mbyB3aWxsIGJlIHN0b3JlZCAqLworICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9mcmFtZV9kYXRhLCAvKiE8IHBvaW50ZXIgdG8gbWVtb3J5IHdoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcmV2aW91cyBmcmFtZS1pbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkICovCisgICAgVUNIQVIgcHZjX21vZGVfbGFzdCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUFZDIG1vZGUgb2YgbGFzdCBmcmFtZSAqLworICAgIGNvbnN0IFVJTlQgZmxhZ3MpOworc3RhdGljIGludCBleHRyYWN0RnJhbWVJbmZvKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2ZyYW1lX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBuck9mQ2hhbm5lbHMsIGNvbnN0IFVJTlQgZmxhZ3MpOwogCi1zdGF0aWMgaW50IGV4dHJhY3RGcmFtZUluZm8gKEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhfZnJhbWVfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICBuck9mQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgZmxhZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworc3RhdGljIGludCBzYnJHZXRQdmNFbnZlbG9wZShIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9mcmFtZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIGNvbnN0IFVJTlQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgcHZjTW9kZSk7CitzdGF0aWMgaW50IHNickdldEVudmVsb3BlKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2ZyYW1lX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgY29uc3QgVUlOVCBmbGFncyk7CiAKK3N0YXRpYyB2b2lkIHNickdldERpcmVjdGlvbkNvbnRyb2xEYXRhKEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoRnJhbWVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncywgY29uc3QgaW50IGJzX3B2Y19tb2RlKTsKIAotc3RhdGljIGludCBzYnJHZXRFbnZlbG9wZSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaF9mcmFtZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICBoQnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzKTsKK3N0YXRpYyB2b2lkIHNickdldE5vaXNlRmxvb3JEYXRhKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9mcmFtZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzKTsKIAotc3RhdGljIHZvaWQgc2JyR2V0RGlyZWN0aW9uQ29udHJvbERhdGEgKEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoRnJhbWVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcyk7CitzdGF0aWMgaW50IGNoZWNrRnJhbWVJbmZvKEZSQU1FX0lORk8gKnBGcmFtZUluZm8sIGludCBudW1iZXJPZlRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG92ZXJsYXAsIGludCB0aW1lU3RlcCk7CiAKLXN0YXRpYyB2b2lkIHNickdldE5vaXNlRmxvb3JEYXRhIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaF9mcmFtZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJzKTsKKy8qIE1hcHBpbmcgdG8gc3RkIHNhbXBsZXJhdGUgdGFibGUgYWNjb3JkaW5nIHRvIDE0NDk2LTMgKDQuNi4xOC4yLjYpICovCit0eXBlZGVmIHN0cnVjdCBTUl9NQVBQSU5HIHsKKyAgVUlOVCBmc1JhbmdlTG87IC8qIElmIGZzUmFuZ2VMbyhuKzEpPmZzPj1mc1JhbmdlTG8obiksIGl0IHdpbGwgYmUgbWFwcGVkIHRvLi4uCisgICAgICAgICAgICAgICAgICAgKi8KKyAgVUlOVCBmc01hcHBlZDsgIC8qIGZzTWFwcGVkLiAqLworfSBTUl9NQVBQSU5HOwogCi1zdGF0aWMgaW50IGNoZWNrRnJhbWVJbmZvIChGUkFNRV9JTkZPICpwRnJhbWVJbmZvLCBpbnQgbnVtYmVyT2ZUaW1lU2xvdHMsIGludCBvdmVybGFwLCBpbnQgdGltZVN0ZXApOworc3RhdGljIGNvbnN0IFNSX01BUFBJTkcgc3RkU2FtcGxlUmF0ZXNNYXBwaW5nW10gPSB7CisgICAgezAsIDgwMDB9LCAgICAgIHs5MzkxLCAxMTAyNX0sICB7MTE1MDIsIDEyMDAwfSwgezEzODU2LCAxNjAwMH0sCisgICAgezE4NzgzLCAyMjA1MH0sIHsyMzAwNCwgMjQwMDB9LCB7Mjc3MTMsIDMyMDAwfSwgezM3NTY2LCA0NDEwMH0sCisgICAgezQ2MDA5LCA0ODAwMH0sIHs1NTQyNiwgNjQwMDB9LCB7NzUxMzIsIDg4MjAwfSwgezkyMDE3LCA5NjAwMH19Oworc3RhdGljIGNvbnN0IFNSX01BUFBJTkcgc3RkU2FtcGxlUmF0ZXNNYXBwaW5nVXNhY1tdID0geworICAgIHswLCAxNjAwMH0sICAgICB7MTg3ODMsIDIyMDUwfSwgezIzMDA0LCAyNDAwMH0sIHsyNzcxMywgMzIwMDB9LAorICAgIHszNTc3NywgNDAwMDB9LCB7NDIwMDAsIDQ0MTAwfSwgezQ2MDA5LCA0ODAwMH0sIHs1NTQyNiwgNjQwMDB9LAorICAgIHs3NTEzMiwgODgyMDB9LCB7OTIwMTcsIDk2MDAwfX07CisKK1VJTlQgc2JyZGVjX21hcFRvU3RkU2FtcGxlUmF0ZShVSU5UIGZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgaXNVc2FjKSAvKiE8IE91dHB1dCBzYW1wbGluZyBmcmVxdWVuY3kgKi8KK3sKKyAgVUlOVCBmc01hcHBlZCA9IGZzLCB0YWJsZVNpemUgPSAwOworICBjb25zdCBTUl9NQVBQSU5HICptYXBwaW5nVGFibGU7CisgIGludCBpOworCisgIGlmICghaXNVc2FjKSB7CisgICAgbWFwcGluZ1RhYmxlID0gc3RkU2FtcGxlUmF0ZXNNYXBwaW5nOworICAgIHRhYmxlU2l6ZSA9IHNpemVvZihzdGRTYW1wbGVSYXRlc01hcHBpbmcpIC8gc2l6ZW9mKFNSX01BUFBJTkcpOworICB9IGVsc2UgeworICAgIG1hcHBpbmdUYWJsZSA9IHN0ZFNhbXBsZVJhdGVzTWFwcGluZ1VzYWM7CisgICAgdGFibGVTaXplID0gc2l6ZW9mKHN0ZFNhbXBsZVJhdGVzTWFwcGluZ1VzYWMpIC8gc2l6ZW9mKFNSX01BUFBJTkcpOworICB9CisKKyAgZm9yIChpID0gdGFibGVTaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBpZiAoZnMgPj0gbWFwcGluZ1RhYmxlW2ldLmZzUmFuZ2VMbykgeworICAgICAgZnNNYXBwZWQgPSBtYXBwaW5nVGFibGVbaV0uZnNNYXBwZWQ7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gKGZzTWFwcGVkKTsKK30KIAogU0JSX0VSUk9SCi1pbml0SGVhZGVyRGF0YSAoCi0gICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgIGhIZWFkZXJEYXRhLAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVSYXRlSW4sCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgIHNhbXBsZVJhdGVPdXQsCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgZmxhZ3MKLSAgICAgICAgKQoteworaW5pdEhlYWRlckRhdGEoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgY29uc3QgaW50IHNhbXBsZVJhdGVJbiwKKyAgICAgICAgICAgICAgIGNvbnN0IGludCBzYW1wbGVSYXRlT3V0LCBjb25zdCBJTlQgZG93bnNjYWxlRmFjdG9yLAorICAgICAgICAgICAgICAgY29uc3QgaW50IHNhbXBsZXNQZXJGcmFtZSwgY29uc3QgVUlOVCBmbGFncywKKyAgICAgICAgICAgICAgIGNvbnN0IGludCBzZXREZWZhdWx0SGRyKSB7CiAgIEhBTkRMRV9GUkVRX0JBTkRfREFUQSBoRnJlcSA9ICZoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhOwogICBTQlJfRVJST1Igc2JyRXJyb3IgPSBTQlJERUNfT0s7CiAgIGludCBudW1BbmFseXNpc0JhbmRzOworICBpbnQgc2FtcGxlUmF0ZVByb2M7CiAKLSAgaWYgKCBzYW1wbGVSYXRlSW4gPT0gc2FtcGxlUmF0ZU91dCApIHsKLSAgICBoSGVhZGVyRGF0YS0+c2JyUHJvY1NtcGxSYXRlID0gc2FtcGxlUmF0ZU91dDw8MTsKKyAgaWYgKCEoZmxhZ3MgJiAoU0JSREVDX1NZTlRBWF9VU0FDIHwgU0JSREVDX1NZTlRBWF9SU1ZENTApKSkgeworICAgIHNhbXBsZVJhdGVQcm9jID0KKyAgICAgICAgc2JyZGVjX21hcFRvU3RkU2FtcGxlUmF0ZShzYW1wbGVSYXRlT3V0ICogZG93bnNjYWxlRmFjdG9yLCAwKTsKKyAgfSBlbHNlIHsKKyAgICBzYW1wbGVSYXRlUHJvYyA9IHNhbXBsZVJhdGVPdXQgKiBkb3duc2NhbGVGYWN0b3I7CisgIH0KKworICBpZiAoc2FtcGxlUmF0ZUluID09IHNhbXBsZVJhdGVPdXQpIHsKKyAgICBoSGVhZGVyRGF0YS0+c2JyUHJvY1NtcGxSYXRlID0gc2FtcGxlUmF0ZVByb2MgPDwgMTsKICAgICBudW1BbmFseXNpc0JhbmRzID0gMzI7CiAgIH0gZWxzZSB7Ci0gICAgaEhlYWRlckRhdGEtPnNiclByb2NTbXBsUmF0ZSA9IHNhbXBsZVJhdGVPdXQ7Ci0gICAgaWYgKCAoc2FtcGxlUmF0ZU91dD4+MSkgPT0gc2FtcGxlUmF0ZUluKSB7CisgICAgaEhlYWRlckRhdGEtPnNiclByb2NTbXBsUmF0ZSA9IHNhbXBsZVJhdGVQcm9jOworICAgIGlmICgoc2FtcGxlUmF0ZU91dCA+PiAxKSA9PSBzYW1wbGVSYXRlSW4pIHsKICAgICAgIC8qIDE6MiAqLwogICAgICAgbnVtQW5hbHlzaXNCYW5kcyA9IDMyOwotICAgIH0gZWxzZSBpZiAoIChzYW1wbGVSYXRlT3V0Pj4yKSA9PSBzYW1wbGVSYXRlSW4gKSB7CisgICAgfSBlbHNlIGlmICgoc2FtcGxlUmF0ZU91dCA+PiAyKSA9PSBzYW1wbGVSYXRlSW4pIHsKICAgICAgIC8qIDE6NCAqLwotICAgICAgbnVtQW5hbHlzaXNCYW5kcyA9IDMyOwotICAgIH0gZWxzZSBpZiAoIChzYW1wbGVSYXRlT3V0KjMpPj4zID09IChzYW1wbGVSYXRlSW4qOCk+PjMgKSB7CisgICAgICBudW1BbmFseXNpc0JhbmRzID0gMTY7CisgICAgfSBlbHNlIGlmICgoc2FtcGxlUmF0ZU91dCAqIDMpID4+IDMgPT0gKHNhbXBsZVJhdGVJbiAqIDgpID4+IDMpIHsKICAgICAgIC8qIDM6OCwgMy80IGNvcmUgZnJhbWUgbGVuZ3RoICovCiAgICAgICBudW1BbmFseXNpc0JhbmRzID0gMjQ7CiAgICAgfSBlbHNlIHsKQEAgLTE5MSw3NCArMjc1LDk5IEBACiAgICAgICBnb3RvIGJhaWw7CiAgICAgfQogICB9CisgIG51bUFuYWx5c2lzQmFuZHMgLz0gZG93bnNjYWxlRmFjdG9yOwogCi0gIC8qIEZpbGwgaW4gZGVmYXVsdCB2YWx1ZXMgZmlyc3QgKi8KLSAgaEhlYWRlckRhdGEtPnN5bmNTdGF0ZSAgICAgICAgICA9IFNCUl9OT1RfSU5JVElBTElaRUQ7Ci0gIGhIZWFkZXJEYXRhLT5zdGF0dXMgICAgICAgICAgICAgPSAwOwotICBoSGVhZGVyRGF0YS0+ZnJhbWVFcnJvckZsYWcgICAgID0gMDsKKyAgaWYgKHNldERlZmF1bHRIZHIpIHsKKyAgICAvKiBGaWxsIGluIGRlZmF1bHQgdmFsdWVzIGZpcnN0ICovCisgICAgaEhlYWRlckRhdGEtPnN5bmNTdGF0ZSA9IFNCUl9OT1RfSU5JVElBTElaRUQ7CisgICAgaEhlYWRlckRhdGEtPnN0YXR1cyA9IDA7CisgICAgaEhlYWRlckRhdGEtPmZyYW1lRXJyb3JGbGFnID0gMDsKIAotICBoSGVhZGVyRGF0YS0+YnNfaW5mby5hbXBSZXNvbHV0aW9uICAgICA9IDE7Ci0gIGhIZWFkZXJEYXRhLT5ic19pbmZvLnhvdmVyX2JhbmQgICAgICAgID0gMDsKLSAgaEhlYWRlckRhdGEtPmJzX2luZm8uc2JyX3ByZXByb2Nlc3NpbmcgPSAwOworICAgIGhIZWFkZXJEYXRhLT5ic19pbmZvLmFtcFJlc29sdXRpb24gPSAxOworICAgIGhIZWFkZXJEYXRhLT5ic19pbmZvLnhvdmVyX2JhbmQgPSAwOworICAgIGhIZWFkZXJEYXRhLT5ic19pbmZvLnNicl9wcmVwcm9jZXNzaW5nID0gMDsKKyAgICBoSGVhZGVyRGF0YS0+YnNfaW5mby5wdmNfbW9kZSA9IDA7CiAKLSAgaEhlYWRlckRhdGEtPmJzX2RhdGEuc3RhcnRGcmVxICAgICAgID0gNTsKLSAgaEhlYWRlckRhdGEtPmJzX2RhdGEuc3RvcEZyZXEgICAgICAgID0gMDsKLSAgaEhlYWRlckRhdGEtPmJzX2RhdGEuZnJlcVNjYWxlICAgICAgID0gMjsKLSAgaEhlYWRlckRhdGEtPmJzX2RhdGEuYWx0ZXJTY2FsZSAgICAgID0gMTsKLSAgaEhlYWRlckRhdGEtPmJzX2RhdGEubm9pc2VfYmFuZHMgICAgID0gMjsKLSAgaEhlYWRlckRhdGEtPmJzX2RhdGEubGltaXRlckJhbmRzICAgID0gMjsKLSAgaEhlYWRlckRhdGEtPmJzX2RhdGEubGltaXRlckdhaW5zICAgID0gMjsKLSAgaEhlYWRlckRhdGEtPmJzX2RhdGEuaW50ZXJwb2xGcmVxICAgID0gMTsKLSAgaEhlYWRlckRhdGEtPmJzX2RhdGEuc21vb3RoaW5nTGVuZ3RoID0gMTsKKyAgICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5zdGFydEZyZXEgPSA1OworICAgIGhIZWFkZXJEYXRhLT5ic19kYXRhLnN0b3BGcmVxID0gMDsKKyAgICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5mcmVxU2NhbGUgPQorICAgICAgICAwOyAvKiBwcmV2aW91c2x5IDI7IGZvciBFTEQgcmVkdWNlZCBkZWxheSBiaXRzdHJlYW1zCisgICAgICAgICAgIC9zYW1wbGVyYXRlcyBpbml0aWFsaXppbmcgb2YgdGhlIHNiciBkZWNvZGVyIGluc3RhbmNlIGZhaWxzIGlmCisgICAgICAgICAgIGZyZXFTY2FsZSBpcyBzZXQgdG8gMiBiZWNhdXNlIG5vIG1hc3RlciB0YWJsZSBjYW4gYmUgZ2VuZXJhdGVkOyBpbgorICAgICAgICAgICBFTEQgcmVkdWNlZCBkZWxheSBiaXRzdHJlYW1zIHRoaXMgdmFsdWUgaXMgYWx3YXlzIDA7IGdldHMgb3ZlcndyaXR0ZW4KKyAgICAgICAgICAgd2hlbiBoZWFkZXIgaXMgcmVhZCAqLworICAgIGhIZWFkZXJEYXRhLT5ic19kYXRhLmFsdGVyU2NhbGUgPSAxOworICAgIGhIZWFkZXJEYXRhLT5ic19kYXRhLm5vaXNlX2JhbmRzID0gMjsKKyAgICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5saW1pdGVyQmFuZHMgPSAyOworICAgIGhIZWFkZXJEYXRhLT5ic19kYXRhLmxpbWl0ZXJHYWlucyA9IDI7CisgICAgaEhlYWRlckRhdGEtPmJzX2RhdGEuaW50ZXJwb2xGcmVxID0gMTsKKyAgICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5zbW9vdGhpbmdMZW5ndGggPSAxOwogCi0gIGhIZWFkZXJEYXRhLT50aW1lU3RlcCA9IChmbGFncyAmIFNCUkRFQ19FTERfR1JJRCkgPyAxIDogMjsKLQotICAvKiBTZXR1cCBwb2ludGVycyB0byBmcmVxdWVuY3kgYmFuZCB0YWJsZXMgKi8KLSAgaEZyZXEtPmZyZXFCYW5kVGFibGVbMF0gID0gaEZyZXEtPmZyZXFCYW5kVGFibGVMbzsKLSAgaEZyZXEtPmZyZXFCYW5kVGFibGVbMV0gPSBoRnJlcS0+ZnJlcUJhbmRUYWJsZUhpOwotCi0gIC8qIFBhdGNoIHNvbWUgZW50cmllcyAqLwotICBpZiAoc2FtcGxlUmF0ZU91dCA+IDI0MDAwKSB7ICAgIC8qIFRyaWdnZXIgYW4gZXJyb3IgaWYgU0JSIGlzIGdvaW5nIHRvIGJlIHByb2Nlc3NlZCB3aXRob3V0ICAgICAqLwotICAgIGhIZWFkZXJEYXRhLT5ic19kYXRhLnN0YXJ0RnJlcSA9IDc7ICAgLyogICBoYXZpbmcgcmVhZCB0aGVzZSBmcmVxdWVuY3kgdmFsdWVzIGZyb20gYml0IHN0cmVhbSBiZWZvcmUuICovCi0gICAgaEhlYWRlckRhdGEtPmJzX2RhdGEuc3RvcEZyZXEgID0gMzsKKyAgICAvKiBQYXRjaCBzb21lIGVudHJpZXMgKi8KKyAgICBpZiAoc2FtcGxlUmF0ZU91dCAqIGRvd25zY2FsZUZhY3RvciA+PSA5NjAwMCkgeworICAgICAgaEhlYWRlckRhdGEtPmJzX2RhdGEuc3RhcnRGcmVxID0KKyAgICAgICAgICA0OyAvKiAgIGhhdmluZyByZWFkIHRoZXNlIGZyZXF1ZW5jeSB2YWx1ZXMgZnJvbSBiaXQgc3RyZWFtIGJlZm9yZS4gKi8KKyAgICAgIGhIZWFkZXJEYXRhLT5ic19kYXRhLnN0b3BGcmVxID0gMzsKKyAgICB9IGVsc2UgaWYgKHNhbXBsZVJhdGVPdXQgKiBkb3duc2NhbGVGYWN0b3IgPgorICAgICAgICAgICAgICAgMjQwMDApIHsgLyogVHJpZ2dlciBhbiBlcnJvciBpZiBTQlIgaXMgZ29pbmcgdG8gYmUgcHJvY2Vzc2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0ICAgICAqLworICAgICAgaEhlYWRlckRhdGEtPmJzX2RhdGEuc3RhcnRGcmVxID0KKyAgICAgICAgICA3OyAvKiAgIGhhdmluZyByZWFkIHRoZXNlIGZyZXF1ZW5jeSB2YWx1ZXMgZnJvbSBiaXQgc3RyZWFtIGJlZm9yZS4gKi8KKyAgICAgIGhIZWFkZXJEYXRhLT5ic19kYXRhLnN0b3BGcmVxID0gMzsKKyAgICB9CiAgIH0KIAotICAvKiBPbmUgU0JSIHRpbWVzbG90IGNvcnJlc3BvbmRzIHRvIHRoZSBhbW91bnQgb2Ygc2FtcGxlcyBlcXVhbCB0byB0aGUgYW1vdW50IG9mIGFuYWx5c2lzIGJhbmRzLCBkaXZpZGVkIGJ5IHRoZSB0aW1lc3RlcC4gKi8KLSAgaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cyA9IChzYW1wbGVzUGVyRnJhbWUvbnVtQW5hbHlzaXNCYW5kcykgPj4gKGhIZWFkZXJEYXRhLT50aW1lU3RlcCAtIDEpOworICBpZiAoKHNhbXBsZVJhdGVPdXQgPj4gMikgPT0gc2FtcGxlUmF0ZUluKSB7CisgICAgaEhlYWRlckRhdGEtPnRpbWVTdGVwID0gNDsKKyAgfSBlbHNlIHsKKyAgICBoSGVhZGVyRGF0YS0+dGltZVN0ZXAgPSAoZmxhZ3MgJiBTQlJERUNfRUxEX0dSSUQpID8gMSA6IDI7CisgIH0KKworICAvKiBTZXR1cCBwb2ludGVycyB0byBmcmVxdWVuY3kgYmFuZCB0YWJsZXMgKi8KKyAgaEZyZXEtPmZyZXFCYW5kVGFibGVbMF0gPSBoRnJlcS0+ZnJlcUJhbmRUYWJsZUxvOworICBoRnJlcS0+ZnJlcUJhbmRUYWJsZVsxXSA9IGhGcmVxLT5mcmVxQmFuZFRhYmxlSGk7CisKKyAgLyogT25lIFNCUiB0aW1lc2xvdCBjb3JyZXNwb25kcyB0byB0aGUgYW1vdW50IG9mIHNhbXBsZXMgZXF1YWwgdG8gdGhlIGFtb3VudAorICAgKiBvZiBhbmFseXNpcyBiYW5kcywgZGl2aWRlZCBieSB0aGUgdGltZXN0ZXAuICovCisgIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMgPQorICAgICAgKHNhbXBsZXNQZXJGcmFtZSAvIG51bUFuYWx5c2lzQmFuZHMpID4+IChoSGVhZGVyRGF0YS0+dGltZVN0ZXAgLSAxKTsKICAgaWYgKGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMgPiAoMTYpKSB7CiAgICAgc2JyRXJyb3IgPSBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogICB9CiAKICAgaEhlYWRlckRhdGEtPm51bWJlck9mQW5hbHlzaXNCYW5kcyA9IG51bUFuYWx5c2lzQmFuZHM7CisgIGlmICgoc2FtcGxlUmF0ZU91dCA+PiAyKSA9PSBzYW1wbGVSYXRlSW4pIHsKKyAgICBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzIDw8PSAxOworICB9CiAKIGJhaWw6CiAgIHJldHVybiBzYnJFcnJvcjsKIH0KIAotCiAvKiEKICAgXGJyaWVmICAgSW5pdGlhbGl6ZSB0aGUgU0JSX1BSRVZfRlJBTUVfREFUQSBzdHJ1Y3QKICovCi12b2lkCi1pbml0U2JyUHJldkZyYW1lRGF0YSAoSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGEsIC8qITwgaGFuZGxlIHRvIHN0cnVjdCBTQlJfUFJFVl9GUkFNRV9EQVRBICovCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVTbG90cykgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRnJhbWVsZW5ndGggaW4gU0JSLXRpbWVzbG90cyAqLwordm9pZCBpbml0U2JyUHJldkZyYW1lRGF0YSgKKyAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQQorICAgICAgICBoX3ByZXZfZGF0YSwgLyohPCBoYW5kbGUgdG8gc3RydWN0IFNCUl9QUkVWX0ZSQU1FX0RBVEEgKi8KKyAgICBpbnQgdGltZVNsb3RzKSAgIC8qITwgRnJhbWVsZW5ndGggaW4gU0JSLXRpbWVzbG90cyAqLwogewogICBpbnQgaTsKIAogICAvKiBTZXQgcHJldmlvdXMgZW5lcmd5IGFuZCBub2lzZSBsZXZlbHMgdG8gMCBmb3IgdGhlIGNhc2UKICAgICAgdGhhdCBkZWNvZGluZyBzdGFydHMgaW4gdGhlIG1pZGRsZSBvZiBhIGJpdHN0cmVhbSAqLwotICBmb3IgKGk9MDsgaSA8IE1BWF9GUkVRX0NPRUZGUzsgaSsrKQorICBmb3IgKGkgPSAwOyBpIDwgTUFYX0ZSRVFfQ09FRkZTOyBpKyspCiAgICAgaF9wcmV2X2RhdGEtPnNmYl9ucmdfcHJldltpXSA9IChGSVhQX0RCTCkwOwotICBmb3IgKGk9MDsgaSA8IE1BWF9OT0lTRV9DT0VGRlM7IGkrKykKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9OT0lTRV9DT0VGRlM7IGkrKykKICAgICBoX3ByZXZfZGF0YS0+cHJldk5vaXNlTGV2ZWxbaV0gPSAoRklYUF9EQkwpMDsKLSAgZm9yIChpPTA7IGkgPCBNQVhfSU5WRl9CQU5EUzsgaSsrKQotICAgIGhfcHJldl9kYXRhLT5zYnJfaW52Zl9tb2RlW2ldID0gSU5WRl9PRkY7CisgIGZvciAoaSA9IDA7IGkgPCBNQVhfSU5WRl9CQU5EUzsgaSsrKSBoX3ByZXZfZGF0YS0+c2JyX2ludmZfbW9kZVtpXSA9IElOVkZfT0ZGOwogCiAgIGhfcHJldl9kYXRhLT5zdG9wUG9zID0gdGltZVNsb3RzOwogICBoX3ByZXZfZGF0YS0+Y291cGxpbmcgPSBDT1VQTElOR19PRkY7CiAgIGhfcHJldl9kYXRhLT5hbXBSZXMgPSAwOwotfQogCisgIEZES21lbWNsZWFyKCZoX3ByZXZfZGF0YS0+cHJldkZyYW1lSW5mbywgc2l6ZW9mKGhfcHJldl9kYXRhLT5wcmV2RnJhbWVJbmZvKSk7Cit9CiAKIC8qIQogICBcYnJpZWYgICBSZWFkIGhlYWRlciBkYXRhIGZyb20gYml0c3RyZWFtCkBAIC0yNjYsNzQgKzM3NSw5MiBAQAogICBccmV0dXJuICBlcnJvciBzdGF0dXMgLSAwIGlmIG9rCiAqLwogU0JSX0hFQURFUl9TVEFUVVMKLXNickdldEhlYWRlckRhdGEgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCcywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgIGZJc1NickRhdGEpCi17CitzYnJHZXRIZWFkZXJEYXRhKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncywgY29uc3QgaW50IGZJc1NickRhdGEsCisgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIGNvbmZpZ01vZGUpIHsKICAgU0JSX0hFQURFUl9EQVRBX0JTICpwQnNEYXRhOwogICBTQlJfSEVBREVSX0RBVEFfQlMgbGFzdEhlYWRlcjsKICAgU0JSX0hFQURFUl9EQVRBX0JTX0lORk8gbGFzdEluZm87Ci0gIGludCBoZWFkZXJFeHRyYTE9MCwgaGVhZGVyRXh0cmEyPTA7CisgIGludCBoZWFkZXJFeHRyYTEgPSAwLCBoZWFkZXJFeHRyYTIgPSAwOworCisgIC8qIFJlYWQgYW5kIGRpc2NhcmQgbmV3IGhlYWRlciBpbiBjb25maWcgY2hhbmdlIGRldGVjdGlvbiBtb2RlICovCisgIGlmIChjb25maWdNb2RlICYgQUNfQ01fREVUX0NGR19DSEFOR0UpIHsKKyAgICBpZiAoIShmbGFncyAmIChTQlJERUNfU1lOVEFYX1JTVkQ1MCB8IFNCUkRFQ19TWU5UQVhfVVNBQykpKSB7CisgICAgICAvKiBhbXBSZXNvbHV0aW9uICovCisgICAgICBGREtyZWFkQml0cyhoQnMsIDEpOworICAgIH0KKyAgICAvKiBzdGFydEZyZXEsIHN0b3BGcmVxICovCisgICAgRkRLcHVzaEZvcihoQnMsIDgpOworICAgIGlmICghKGZsYWdzICYgKFNCUkRFQ19TWU5UQVhfUlNWRDUwIHwgU0JSREVDX1NZTlRBWF9VU0FDKSkpIHsKKyAgICAgIC8qIHhvdmVyX2JhbmQgKi8KKyAgICAgIEZES3JlYWRCaXRzKGhCcywgMyk7CisgICAgICAvKiByZXNlcnZlZCBiaXRzICovCisgICAgICBGREtyZWFkQml0cyhoQnMsIDIpOworICAgIH0KKyAgICBoZWFkZXJFeHRyYTEgPSBGREtyZWFkQml0KGhCcyk7CisgICAgaGVhZGVyRXh0cmEyID0gRkRLcmVhZEJpdChoQnMpOworICAgIEZES3B1c2hGb3IoaEJzLCA1ICogaGVhZGVyRXh0cmExICsgNiAqIGhlYWRlckV4dHJhMik7CisKKyAgICByZXR1cm4gSEVBREVSX09LOworICB9CiAKICAgLyogQ29weSBTQlIgYml0IHN0cmVhbSBoZWFkZXIgdG8gdGVtcG9yYXJ5IGhlYWRlciAqLwogICBsYXN0SGVhZGVyID0gaEhlYWRlckRhdGEtPmJzX2RhdGE7Ci0gIGxhc3RJbmZvICAgPSBoSGVhZGVyRGF0YS0+YnNfaW5mbzsKKyAgbGFzdEluZm8gPSBoSGVhZGVyRGF0YS0+YnNfaW5mbzsKIAogICAvKiBSZWFkIG5ldyBoZWFkZXIgZnJvbSBiaXRzdHJlYW0gKi8KLSAgeworICBpZiAoKGZsYWdzICYgKFNCUkRFQ19TWU5UQVhfUlNWRDUwIHwgU0JSREVDX1NZTlRBWF9VU0FDKSkgJiYgIWZJc1NickRhdGEpIHsKKyAgICBwQnNEYXRhID0gJmhIZWFkZXJEYXRhLT5ic19kZmx0OworICB9IGVsc2UgewogICAgIHBCc0RhdGEgPSAmaEhlYWRlckRhdGEtPmJzX2RhdGE7CiAgIH0KIAotICB7Ci0gICAgaEhlYWRlckRhdGEtPmJzX2luZm8uYW1wUmVzb2x1dGlvbiA9IEZES3JlYWRCaXRzIChoQnMsIDEpOworICBpZiAoIShmbGFncyAmIChTQlJERUNfU1lOVEFYX1JTVkQ1MCB8IFNCUkRFQ19TWU5UQVhfVVNBQykpKSB7CisgICAgaEhlYWRlckRhdGEtPmJzX2luZm8uYW1wUmVzb2x1dGlvbiA9IEZES3JlYWRCaXRzKGhCcywgMSk7CiAgIH0KIAotICBwQnNEYXRhLT5zdGFydEZyZXEgPSBGREtyZWFkQml0cyAoaEJzLCA0KTsKLSAgcEJzRGF0YS0+c3RvcEZyZXEgPSBGREtyZWFkQml0cyAoaEJzLCA0KTsKKyAgcEJzRGF0YS0+c3RhcnRGcmVxID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgcEJzRGF0YS0+c3RvcEZyZXEgPSBGREtyZWFkQml0cyhoQnMsIDQpOwogCi0gIHsKLSAgICBoSGVhZGVyRGF0YS0+YnNfaW5mby54b3Zlcl9iYW5kID0gRkRLcmVhZEJpdHMgKGhCcywgMyk7Ci0gICAgRkRLcmVhZEJpdHMgKGhCcywgMik7CisgIGlmICghKGZsYWdzICYgKFNCUkRFQ19TWU5UQVhfUlNWRDUwIHwgU0JSREVDX1NZTlRBWF9VU0FDKSkpIHsKKyAgICBoSGVhZGVyRGF0YS0+YnNfaW5mby54b3Zlcl9iYW5kID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKKyAgICBGREtyZWFkQml0cyhoQnMsIDIpOwogICB9CiAKLSAgaGVhZGVyRXh0cmExID0gRkRLcmVhZEJpdHMgKGhCcywgMSk7Ci0gIGhlYWRlckV4dHJhMiA9IEZES3JlYWRCaXRzIChoQnMsIDEpOworICBoZWFkZXJFeHRyYTEgPSBGREtyZWFkQml0cyhoQnMsIDEpOworICBoZWFkZXJFeHRyYTIgPSBGREtyZWFkQml0cyhoQnMsIDEpOwogCiAgIC8qIEhhbmRsZSBleHRyYSBoZWFkZXIgaW5mb3JtYXRpb24gKi8KLSAgaWYoIGhlYWRlckV4dHJhMSkgCi0gIHsKLSAgICBwQnNEYXRhLT5mcmVxU2NhbGUgPSBGREtyZWFkQml0cyAoaEJzLCAyKTsKLSAgICBwQnNEYXRhLT5hbHRlclNjYWxlID0gRkRLcmVhZEJpdHMgKGhCcywgMSk7Ci0gICAgcEJzRGF0YS0+bm9pc2VfYmFuZHMgPSBGREtyZWFkQml0cyAoaEJzLCAyKTsKLSAgfQotICBlbHNlIHsKLSAgICBwQnNEYXRhLT5mcmVxU2NhbGUgICA9IDI7Ci0gICAgcEJzRGF0YS0+YWx0ZXJTY2FsZSAgPSAxOworICBpZiAoaGVhZGVyRXh0cmExKSB7CisgICAgcEJzRGF0YS0+ZnJlcVNjYWxlID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsKKyAgICBwQnNEYXRhLT5hbHRlclNjYWxlID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICBwQnNEYXRhLT5ub2lzZV9iYW5kcyA9IEZES3JlYWRCaXRzKGhCcywgMik7CisgIH0gZWxzZSB7CisgICAgcEJzRGF0YS0+ZnJlcVNjYWxlID0gMjsKKyAgICBwQnNEYXRhLT5hbHRlclNjYWxlID0gMTsKICAgICBwQnNEYXRhLT5ub2lzZV9iYW5kcyA9IDI7CiAgIH0KIAogICBpZiAoaGVhZGVyRXh0cmEyKSB7Ci0gICAgcEJzRGF0YS0+bGltaXRlckJhbmRzID0gRkRLcmVhZEJpdHMgKGhCcywgMik7Ci0gICAgcEJzRGF0YS0+bGltaXRlckdhaW5zID0gRkRLcmVhZEJpdHMgKGhCcywgMik7Ci0gICAgcEJzRGF0YS0+aW50ZXJwb2xGcmVxID0gRkRLcmVhZEJpdHMgKGhCcywgMSk7Ci0gICAgcEJzRGF0YS0+c21vb3RoaW5nTGVuZ3RoID0gRkRLcmVhZEJpdHMgKGhCcywgMSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgcEJzRGF0YS0+bGltaXRlckJhbmRzICAgID0gMjsKLSAgICBwQnNEYXRhLT5saW1pdGVyR2FpbnMgICAgPSAyOwotICAgIHBCc0RhdGEtPmludGVycG9sRnJlcSAgICA9IDE7CisgICAgcEJzRGF0YS0+bGltaXRlckJhbmRzID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsKKyAgICBwQnNEYXRhLT5saW1pdGVyR2FpbnMgPSBGREtyZWFkQml0cyhoQnMsIDIpOworICAgIHBCc0RhdGEtPmludGVycG9sRnJlcSA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgcEJzRGF0YS0+c21vb3RoaW5nTGVuZ3RoID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgfSBlbHNlIHsKKyAgICBwQnNEYXRhLT5saW1pdGVyQmFuZHMgPSAyOworICAgIHBCc0RhdGEtPmxpbWl0ZXJHYWlucyA9IDI7CisgICAgcEJzRGF0YS0+aW50ZXJwb2xGcmVxID0gMTsKICAgICBwQnNEYXRhLT5zbW9vdGhpbmdMZW5ndGggPSAxOwogICB9CiAKICAgLyogTG9vayBmb3IgbmV3IHNldHRpbmdzLiBJRUMgMTQ0OTYtMywgNC42LjE4LjMuMSAqLwotICBpZihoSGVhZGVyRGF0YS0+c3luY1N0YXRlIDwgU0JSX0hFQURFUiB8fAotICAgICBsYXN0SGVhZGVyLnN0YXJ0RnJlcSAgICE9IHBCc0RhdGEtPnN0YXJ0RnJlcSAgIHx8Ci0gICAgIGxhc3RIZWFkZXIuc3RvcEZyZXEgICAgIT0gcEJzRGF0YS0+c3RvcEZyZXEgICAgfHwKLSAgICAgbGFzdEhlYWRlci5mcmVxU2NhbGUgICAhPSBwQnNEYXRhLT5mcmVxU2NhbGUgICB8fAotICAgICBsYXN0SGVhZGVyLmFsdGVyU2NhbGUgICE9IHBCc0RhdGEtPmFsdGVyU2NhbGUgIHx8Ci0gICAgIGxhc3RIZWFkZXIubm9pc2VfYmFuZHMgIT0gcEJzRGF0YS0+bm9pc2VfYmFuZHMgfHwKLSAgICAgbGFzdEluZm8ueG92ZXJfYmFuZCAgICAhPSBoSGVhZGVyRGF0YS0+YnNfaW5mby54b3Zlcl9iYW5kKSB7CisgIGlmIChoSGVhZGVyRGF0YS0+c3luY1N0YXRlIDwgU0JSX0hFQURFUiB8fAorICAgICAgbGFzdEhlYWRlci5zdGFydEZyZXEgIT0gcEJzRGF0YS0+c3RhcnRGcmVxIHx8CisgICAgICBsYXN0SGVhZGVyLnN0b3BGcmVxICE9IHBCc0RhdGEtPnN0b3BGcmVxIHx8CisgICAgICBsYXN0SGVhZGVyLmZyZXFTY2FsZSAhPSBwQnNEYXRhLT5mcmVxU2NhbGUgfHwKKyAgICAgIGxhc3RIZWFkZXIuYWx0ZXJTY2FsZSAhPSBwQnNEYXRhLT5hbHRlclNjYWxlIHx8CisgICAgICBsYXN0SGVhZGVyLm5vaXNlX2JhbmRzICE9IHBCc0RhdGEtPm5vaXNlX2JhbmRzIHx8CisgICAgICBsYXN0SW5mby54b3Zlcl9iYW5kICE9IGhIZWFkZXJEYXRhLT5ic19pbmZvLnhvdmVyX2JhbmQpIHsKICAgICByZXR1cm4gSEVBREVSX1JFU0VUOyAvKiBOZXcgc2V0dGluZ3MgKi8KICAgfQogCkBAIC0zNDUsMjcgKzQ3Miw0NSBAQAogCiAgIFxyZXR1cm4gIGVycm9yIHN0YXR1cyAtIDAgaWYgb2sKICovCi1pbnQKLXNickdldFN5bnRoZXRpY0NvZGVkRGF0YShIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaEZyYW1lRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCcykKLXsKK2ludCBzYnJHZXRTeW50aGV0aWNDb2RlZERhdGEoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhGcmFtZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgY29uc3QgVUlOVCBmbGFncykgewogICBpbnQgaSwgYml0c1JlYWQgPSAwOwogCi0gIGludCBmbGFnID0gRkRLcmVhZEJpdHMoaEJzLDEpOworICBpbnQgYWRkX2hhcm1vbmljX2ZsYWcgPSBGREtyZWFkQml0cyhoQnMsIDEpOwogICBiaXRzUmVhZCsrOwogCi0gIGlmKGZsYWcpewotICAgIGZvcihpPTA7aTxoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5TZmJbMV07aSsrKXsKLSAgICAgIGhGcmFtZURhdGEtPmFkZEhhcm1vbmljc1tpXSAgPSBGREtyZWFkQml0cyAoaEJzLCAxICk7Ci0gICAgICBiaXRzUmVhZCsrOworICBpZiAoYWRkX2hhcm1vbmljX2ZsYWcpIHsKKyAgICBpbnQgblNmYiA9IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEublNmYlsxXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQUREX0hBUk1PTklDU19GTEFHU19TSVpFOyBpKyspIHsKKyAgICAgIC8qIHJlYWQgbWF4aW11bSAzMiBiaXRzIGFuZCBhbGlnbiB0aGVtIHRvIHRoZSBNU0IgKi8KKyAgICAgIGludCByZWFkQml0cyA9IGZNaW4oMzIsIG5TZmIpOworICAgICAgblNmYiAtPSByZWFkQml0czsKKyAgICAgIGlmIChyZWFkQml0cyA+IDApIHsKKyAgICAgICAgaEZyYW1lRGF0YS0+YWRkSGFybW9uaWNzW2ldID0gRkRLcmVhZEJpdHMoaEJzLCByZWFkQml0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKDMyIC0gcmVhZEJpdHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaEZyYW1lRGF0YS0+YWRkSGFybW9uaWNzW2ldID0gMDsKKyAgICAgIH0KKworICAgICAgYml0c1JlYWQgKz0gcmVhZEJpdHM7CiAgICAgfQorICAgIC8qIGJzX3B2Y19tb2RlID0gMCBmb3IgUnN2ZDUwICovCisgICAgaWYgKGZsYWdzICYgU0JSREVDX1NZTlRBWF9VU0FDKSB7CisgICAgICBpZiAoaEhlYWRlckRhdGEtPmJzX2luZm8ucHZjX21vZGUpIHsKKyAgICAgICAgaW50IGJzX3NpbnVzb2lkYWxfcG9zaXRpb24gPSAzMTsKKyAgICAgICAgaWYgKEZES3JlYWRCaXQoaEJzKSAvKiBic19zaW51c29pZGFsX3Bvc2l0aW9uX2ZsYWcgKi8pIHsKKyAgICAgICAgICBic19zaW51c29pZGFsX3Bvc2l0aW9uID0gRkRLcmVhZEJpdHMoaEJzLCA1KTsKKyAgICAgICAgfQorICAgICAgICBoRnJhbWVEYXRhLT5zaW51c29pZGFsX3Bvc2l0aW9uID0gYnNfc2ludXNvaWRhbF9wb3NpdGlvbjsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IEFERF9IQVJNT05JQ1NfRkxBR1NfU0laRTsgaSsrKQorICAgICAgaEZyYW1lRGF0YS0+YWRkSGFybW9uaWNzW2ldID0gMDsKICAgfQotICBlbHNlIHsKLSAgICBmb3IoaT0wOyBpPE1BWF9GUkVRX0NPRUZGUzsgaSsrKQotICAgICAgaEZyYW1lRGF0YS0+YWRkSGFybW9uaWNzW2ldICA9IDA7Ci0gIH0KLSAgcmV0dXJuKGJpdHNSZWFkKTsKKworICByZXR1cm4gKGJpdHNSZWFkKTsKIH0KIAogLyohCkBAIC0zNzcsMTYgKzUyMiwxNiBAQAogICBhcmUgdW51c2VkLiBUaGUgZGF0YSBzaG91bGQgYmUgc2tpcHBlZCBpbiBvcmRlciB0byB1cGRhdGUgdGhlIG51bWJlcgogICBvZiByZWFkIGJpdHMgZm9yIHRoZSBjb25zaXN0ZW5jeSBjaGVjayBpbiBhcHBseVNCUigpLgogKi8KLXN0YXRpYyBpbnQgIGV4dHJhY3RFeHRlbmRlZERhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAgIC8qITwgaGFuZGxlIHRvIFNCUiBoZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICBoQnMgICAgICAgICAgICAgLyohPCBIYW5kbGUgdG8gdGhlIGJpdCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsSEFORExFX1BTX0RFQyBoUGFyYW1ldHJpY1N0ZXJlb0RlYyAgICAgLyohPCBQYXJhbWV0cmljIFN0ZXJlbyBEZWNvZGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgeworc3RhdGljIGludCBleHRyYWN0RXh0ZW5kZWREYXRhKAorICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIC8qITwgaGFuZGxlIHRvIFNCUiBoZWFkZXIgKi8KKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgICAgICAgICAgICAvKiE8IEhhbmRsZSB0byB0aGUgYml0IGJ1ZmZlciAqLworICAgICwKKyAgICBIQU5ETEVfUFNfREVDIGhQYXJhbWV0cmljU3RlcmVvRGVjIC8qITwgUGFyYW1ldHJpYyBTdGVyZW8gRGVjb2RlciAqLworKSB7CiAgIElOVCBuQml0c0xlZnQ7CiAgIGludCBleHRlbmRlZF9kYXRhOwogICBpbnQgaSwgZnJhbWVPayA9IDE7CiAKLQogICBleHRlbmRlZF9kYXRhID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKIAogICBpZiAoZXh0ZW5kZWRfZGF0YSkgewpAQCAtMzk0LDkgKzUzOSw3IEBACiAgICAgaW50IGJQc1JlYWQgPSAwOwogCiAgICAgY250ID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKLSAgICBpZiAoY250ID09ICgxPDw0KS0xKQotICAgICAgY250ICs9IEZES3JlYWRCaXRzKGhCcywgOCk7Ci0KKyAgICBpZiAoY250ID09ICgxIDw8IDQpIC0gMSkgY250ICs9IEZES3JlYWRCaXRzKGhCcywgOCk7CiAKICAgICBuQml0c0xlZnQgPSA4ICogY250OwogCkBAIC00MTIsNTIgKzU1NSw1MiBAQAogICAgICAgaW50IGV4dGVuc2lvbl9pZCA9IEZES3JlYWRCaXRzKGhCcywgMik7CiAgICAgICBuQml0c0xlZnQgLT0gMjsKIAotICAgICAgc3dpdGNoKGV4dGVuc2lvbl9pZCkgewotCi0KLQorICAgICAgc3dpdGNoIChleHRlbnNpb25faWQpIHsKICAgICAgICAgY2FzZSBFWFRFTlNJT05fSURfUFNfQ09ESU5HOgogCi0gICAgICAgIC8qIFJlYWQgUFMgZGF0YSBmcm9tIGJpdHN0cmVhbSAqLworICAgICAgICAgIC8qIFJlYWQgUFMgZGF0YSBmcm9tIGJpdHN0cmVhbSAqLwogCi0gICAgICAgIGlmIChoUGFyYW1ldHJpY1N0ZXJlb0RlYyAhPSBOVUxMKSB7Ci0gICAgICAgICAgaWYoYlBzUmVhZCAmJiAhaFBhcmFtZXRyaWNTdGVyZW9EZWMtPmJzRGF0YVtoUGFyYW1ldHJpY1N0ZXJlb0RlYy0+YnNSZWFkU2xvdF0ubXBlZy5iUHNIZWFkZXJWYWxpZCkgewotICAgICAgICAgICAgY250ID0gbkJpdHNMZWZ0ID4+IDM7IC8qIG51bWJlciBvZiByZW1haW5pbmcgYnl0ZXMgKi8KLSAgICAgICAgICAgIGZvciAoaT0wOyBpPGNudDsgaSsrKQotICAgICAgICAgICAgICBGREtyZWFkQml0cyhoQnMsIDgpOwotICAgICAgICAgICAgbkJpdHNMZWZ0IC09IGNudCAqIDg7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5CaXRzTGVmdCAtPSBSZWFkUHNEYXRhKGhQYXJhbWV0cmljU3RlcmVvRGVjLCBoQnMsIG5CaXRzTGVmdCk7Ci0gICAgICAgICAgICBiUHNSZWFkID0gMTsKKyAgICAgICAgICBpZiAoaFBhcmFtZXRyaWNTdGVyZW9EZWMgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGJQc1JlYWQgJiYKKyAgICAgICAgICAgICAgICAhaFBhcmFtZXRyaWNTdGVyZW9EZWMtPmJzRGF0YVtoUGFyYW1ldHJpY1N0ZXJlb0RlYy0+YnNSZWFkU2xvdF0KKyAgICAgICAgICAgICAgICAgICAgIC5tcGVnLmJQc0hlYWRlclZhbGlkKSB7CisgICAgICAgICAgICAgIGNudCA9IG5CaXRzTGVmdCA+PiAzOyAvKiBudW1iZXIgb2YgcmVtYWluaW5nIGJ5dGVzICovCisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgRkRLcmVhZEJpdHMoaEJzLCA4KTsKKyAgICAgICAgICAgICAgbkJpdHNMZWZ0IC09IGNudCAqIDg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBuQml0c0xlZnQgLT0KKyAgICAgICAgICAgICAgICAgIChJTlQpUmVhZFBzRGF0YShoUGFyYW1ldHJpY1N0ZXJlb0RlYywgaEJzLCBuQml0c0xlZnQpOworICAgICAgICAgICAgICBiUHNSZWFkID0gMTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgIH0KIAotICAgICAgICAgIC8qIHBhcmFtZXRyaWMgc3RlcmVvIGRldGVjdGVkLCBjb3VsZCBzZXQgY2hhbm5lbE1vZGUgYWNjb3JkaW5nbHkgaGVyZSAgKi8KKyAgICAgICAgICAvKiBwYXJhbWV0cmljIHN0ZXJlbyBkZXRlY3RlZCwgY291bGQgc2V0IGNoYW5uZWxNb2RlIGFjY29yZGluZ2x5IGhlcmUKKyAgICAgICAgICAgKi8KICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogIlRoZSB1c2FnZSBvZiB0aGlzIHBhcmFtZXRyaWMgc3RlcmVvIGV4dGVuc2lvbiB0byBIRS1BQUMgaXMgICAgICAgICAqLwotICAgICAgICAgIC8qIHNpZ25hbGxlZCBpbXBsaWNpdGx5IGluIHRoZSBiaXRzdHJlYW0uIEhlbmNlLCBpZiBhbiBzYnJfZXh0ZW5zaW9uKCkgKi8KLSAgICAgICAgICAvKiB3aXRoIGJzX2V4dGVuc2lvbl9pZD09RVhURU5TSU9OX0lEX1BTIGlzIGZvdW5kIGluIHRoZSBTQlIgcGFydCBvZiAgICovCi0gICAgICAgICAgLyogdGhlIGJpdHN0cmVhbSwgYSBkZWNvZGVyIHN1cHBvcnRpbmcgdGhlIGNvbWJpbmF0aW9uIG9mIFNCUiBhbmQgUFMgICAqLwotICAgICAgICAgIC8qIHNoYWxsIG9wZXJhdGUgdGhlIFBTIHRvb2wgdG8gZ2VuZXJhdGUgYSBzdGVyZW8gb3V0cHV0IHNpZ25hbC4iICAgICAgKi8KLSAgICAgICAgICAvKiBzb3VyY2U6IElTTy9JRUMgMTQ0OTYtMzoyMDAxL0ZEQU0gMjoyMDA0KEUpICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgLyogIlRoZSB1c2FnZSBvZiB0aGlzIHBhcmFtZXRyaWMgc3RlcmVvIGV4dGVuc2lvbiB0byBIRS1BQUMgaXMgKi8KKyAgICAgICAgICAvKiBzaWduYWxsZWQgaW1wbGljaXRseSBpbiB0aGUgYml0c3RyZWFtLiBIZW5jZSwgaWYgYW4gc2JyX2V4dGVuc2lvbigpCisgICAgICAgICAgICovCisgICAgICAgICAgLyogd2l0aCBic19leHRlbnNpb25faWQ9PUVYVEVOU0lPTl9JRF9QUyBpcyBmb3VuZCBpbiB0aGUgU0JSIHBhcnQgb2YKKyAgICAgICAgICAgKi8KKyAgICAgICAgICAvKiB0aGUgYml0c3RyZWFtLCBhIGRlY29kZXIgc3VwcG9ydGluZyB0aGUgY29tYmluYXRpb24gb2YgU0JSIGFuZCBQUworICAgICAgICAgICAqLworICAgICAgICAgIC8qIHNoYWxsIG9wZXJhdGUgdGhlIFBTIHRvb2wgdG8gZ2VuZXJhdGUgYSBzdGVyZW8gb3V0cHV0IHNpZ25hbC4iICovCisgICAgICAgICAgLyogc291cmNlOiBJU08vSUVDIDE0NDk2LTM6MjAwMS9GREFNIDI6MjAwNChFKSAqLwogCi0gICAgICAgIGJyZWFrOworICAgICAgICAgIGJyZWFrOwogCi0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGNudCA9IG5CaXRzTGVmdCA+PiAzOyAvKiBudW1iZXIgb2YgcmVtYWluaW5nIGJ5dGVzICovCi0gICAgICAgIGZvciAoaT0wOyBpPGNudDsgaSsrKQotICAgICAgICAgIEZES3JlYWRCaXRzKGhCcywgOCk7Ci0gICAgICAgIG5CaXRzTGVmdCAtPSBjbnQgKiA4OwotICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBjbnQgPSBuQml0c0xlZnQgPj4gMzsgLyogbnVtYmVyIG9mIHJlbWFpbmluZyBieXRlcyAqLworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgRkRLcmVhZEJpdHMoaEJzLCA4KTsKKyAgICAgICAgICBuQml0c0xlZnQgLT0gY250ICogODsKKyAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAKICAgICBpZiAobkJpdHNMZWZ0IDwgMCkgewogICAgICAgZnJhbWVPayA9IDA7CiAgICAgICBnb3RvIGJhaWw7Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICAvKiBSZWFkIGZpbGwgYml0cyBmb3IgYnl0ZSBhbGlnbm1lbnQgKi8KICAgICAgIEZES3JlYWRCaXRzKGhCcywgbkJpdHNMZWZ0KTsKICAgICB9CkBAIC00NjcsMTk2ICs2MTAsMjA4IEBACiAgIHJldHVybiAoZnJhbWVPayk7CiB9CiAKLQogLyohCi0gIFxicmllZiAgIFJlYWQgYml0c3RyZWFtIGVsZW1lbnRzIG9mIG9uZSBjaGFubmVsCi0KLSAgXHJldHVybiAgU2JyRnJhbWVPSzogIDE9b2ssIDA9ZXJyb3IKKyAgXGJyaWVmICAgICAgUmVhZCBiaXRzdHJlYW0gZWxlbWVudHMgb2YgYSBTQlIgY2hhbm5lbCBlbGVtZW50CisgIFxyZXR1cm4gICAgIFNickZyYW1lT0sKICovCi1pbnQKLXNickdldFNpbmdsZUNoYW5uZWxFbGVtZW50IChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgICAgICAgICAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhGcmFtZURhdGEsICAgICAgICAgICAvKiE8IENvbnRyb2wgZGF0YSBvZiBjdXJyZW50IGZyYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICBoQnMsICAgICAgICAgICAgICAgICAgLyohPCBIYW5kbGUgdG8gc3RydWN0IEJJVF9CVUYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUFNfREVDICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvRGVjLCAvKiE8IEhhbmRsZSB0byBQUyBkZWNvZGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgIG92ZXJsYXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgaW50IGk7CitpbnQgc2JyR2V0Q2hhbm5lbEVsZW1lbnQoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaEZyYW1lRGF0YUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhGcmFtZURhdGFSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoRnJhbWVEYXRhTGVmdFByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgcHZjX21vZGVfbGFzdCwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9QU19ERUMgaFBhcmFtZXRyaWNTdGVyZW9EZWMsIGNvbnN0IFVJTlQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG92ZXJsYXApIHsKKyAgaW50IGksIGJzX2NvdXBsaW5nID0gQ09VUExJTkdfT0ZGOworICBjb25zdCBpbnQgbkNoID0gKGhGcmFtZURhdGFSaWdodCA9PSBOVUxMKSA/IDEgOiAyOwogCi0KLSAgaEZyYW1lRGF0YS0+Y291cGxpbmcgPSBDT1VQTElOR19PRkY7Ci0KLSAgeworICBpZiAoIShmbGFncyAmIChTQlJERUNfU1lOVEFYX1VTQUMgfCBTQlJERUNfU1lOVEFYX1JTVkQ1MCkpKSB7CiAgICAgLyogUmVzZXJ2ZWQgYml0cyAqLwotICAgIGlmIChGREtyZWFkQml0cyhoQnMsIDEpKSB7ICAvKiBic19kYXRhX2V4dHJhICovCisgICAgaWYgKEZES3JlYWRCaXRzKGhCcywgMSkpIHsgLyogYnNfZGF0YV9leHRyYSAqLwogICAgICAgRkRLcmVhZEJpdHMoaEJzLCA0KTsKLSAgICAgIGlmIChmbGFncyAmIFNCUkRFQ19TWU5UQVhfU0NBTCkgeworICAgICAgaWYgKChmbGFncyAmIFNCUkRFQ19TWU5UQVhfU0NBTCkgfHwgKG5DaCA9PSAyKSkgewogICAgICAgICBGREtyZWFkQml0cyhoQnMsIDQpOwogICAgICAgfQogICAgIH0KICAgfQogCi0gIGlmIChmbGFncyAmIFNCUkRFQ19TWU5UQVhfU0NBTCkgewotICAgIEZES3JlYWRCaXRzIChoQnMsIDEpOyAgICAgLyogYnNfY291cGxpbmcgKi8KLSAgfQotCi0gIC8qCi0gICAgR3JpZCBjb250cm9sCi0gICovCi0gIGlmICggIWV4dHJhY3RGcmFtZUluZm8gKCBoQnMsIGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhLCAxLCBmbGFncykgKQotICAgcmV0dXJuIDA7Ci0KLSAgaWYgKCAhY2hlY2tGcmFtZUluZm8gKCZoRnJhbWVEYXRhLT5mcmFtZUluZm8sIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMsIG92ZXJsYXAsIGhIZWFkZXJEYXRhLT50aW1lU3RlcCkgKQotICAgIHJldHVybiAwOwotCi0KLSAgLyoKLSAgICBGZXRjaCBkb21haW4gdmVjdG9ycyAodGltZSBvciBmcmVxdWVuY3kgZGlyZWN0aW9uIGZvciBkZWx0YS1jb2RpbmcpCi0gICovCi0gIHNickdldERpcmVjdGlvbkNvbnRyb2xEYXRhIChoRnJhbWVEYXRhLCBoQnMpOwotCi0gIGZvciAoaT0wOyBpPGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubkludmZCYW5kczsgaSsrKSB7Ci0gICAgaEZyYW1lRGF0YS0+c2JyX2ludmZfbW9kZVtpXSA9Ci0gICAgICAoSU5WRl9NT0RFKSBGREtyZWFkQml0cyAoaEJzLCAyKTsKLSAgfQotCi0KLQotICAvKiByYXcgZGF0YSAqLwotICBpZiAoICFzYnJHZXRFbnZlbG9wZSAoaEhlYWRlckRhdGEsIGhGcmFtZURhdGEsIGhCcywgZmxhZ3MpICkKLSAgICByZXR1cm4gMDsKLQotCi0gIHNickdldE5vaXNlRmxvb3JEYXRhIChoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YSwgaEJzKTsKLQotICBzYnJHZXRTeW50aGV0aWNDb2RlZERhdGEoaEhlYWRlckRhdGEsIGhGcmFtZURhdGEsIGhCcyk7Ci0KLSAgewotICAgIC8qIHNiciBleHRlbmRlZCBkYXRhICovCi0gICAgaWYgKCEgZXh0cmFjdEV4dGVuZGVkRGF0YSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxoUGFyYW1ldHJpY1N0ZXJlb0RlYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpIHsKLSAgICAgIHJldHVybiAwOworICBpZiAobkNoID09IDIpIHsKKyAgICAvKiBSZWFkIGNvdXBsaW5nIGZsYWcgKi8KKyAgICBic19jb3VwbGluZyA9IEZES3JlYWRCaXRzKGhCcywgMSk7CisgICAgaWYgKGJzX2NvdXBsaW5nKSB7CisgICAgICBoRnJhbWVEYXRhTGVmdC0+Y291cGxpbmcgPSBDT1VQTElOR19MRVZFTDsKKyAgICAgIGhGcmFtZURhdGFSaWdodC0+Y291cGxpbmcgPSBDT1VQTElOR19CQUw7CisgICAgfSBlbHNlIHsKKyAgICAgIGhGcmFtZURhdGFMZWZ0LT5jb3VwbGluZyA9IENPVVBMSU5HX09GRjsKKyAgICAgIGhGcmFtZURhdGFSaWdodC0+Y291cGxpbmcgPSBDT1VQTElOR19PRkY7CiAgICAgfQotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotCi0vKiEKLSAgXGJyaWVmICAgICAgUmVhZCBiaXRzdHJlYW0gZWxlbWVudHMgb2YgYSBjaGFubmVsIHBhaXIKLSAgXHJldHVybiAgICAgU2JyRnJhbWVPSwotKi8KLWludAotc2JyR2V0Q2hhbm5lbFBhaXJFbGVtZW50IChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgICAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBICBoRnJhbWVEYXRhTGVmdCwgLyohPCBEeW5hbWljIGNvbnRyb2wgZGF0YSBmb3IgZmlyc3QgY2hhbm5lbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhGcmFtZURhdGFSaWdodCwvKiE8IER5bmFtaWMgY29udHJvbCBkYXRhIGZvciBzZWNvbmQgY2hhbm5lbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCcywgICAgICAgICAgICAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgQklUX0JVRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3ZlcmxhcCApCi17Ci0gIGludCBpLCBiaXQ7Ci0KLQotICAvKiBSZXNlcnZlZCBiaXRzICovCi0gIGlmIChGREtyZWFkQml0cyhoQnMsIDEpKSB7ICAvKiBic19kYXRhX2V4dHJhICovCi0gICAgRkRLcmVhZEJpdHMoaEJzLCA0KTsKLSAgICBGREtyZWFkQml0cyhoQnMsIDQpOwotICB9Ci0KLSAgLyogUmVhZCBjb3VwbGluZyBmbGFnICovCi0gIGJpdCA9IEZES3JlYWRCaXRzIChoQnMsIDEpOwotCi0gIGlmIChiaXQpIHsKLSAgICBoRnJhbWVEYXRhTGVmdC0+Y291cGxpbmcgPSBDT1VQTElOR19MRVZFTDsKLSAgICBoRnJhbWVEYXRhUmlnaHQtPmNvdXBsaW5nID0gQ09VUExJTkdfQkFMOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgeworICAgIGlmIChmbGFncyAmIFNCUkRFQ19TWU5UQVhfU0NBTCkgeworICAgICAgRkRLcmVhZEJpdHMoaEJzLCAxKTsgLyogYnNfY291cGxpbmcgKi8KKyAgICB9CiAgICAgaEZyYW1lRGF0YUxlZnQtPmNvdXBsaW5nID0gQ09VUExJTkdfT0ZGOwotICAgIGhGcmFtZURhdGFSaWdodC0+Y291cGxpbmcgPSBDT1VQTElOR19PRkY7CiAgIH0KIAorICBpZiAoZmxhZ3MgJiAoU0JSREVDX1NZTlRBWF9VU0FDIHwgU0JSREVDX1NZTlRBWF9SU1ZENTApKSB7CisgICAgaWYgKGZsYWdzICYgU0JSREVDX1VTQUNfSEFSTU9OSUNTQlIpIHsKKyAgICAgIGhGcmFtZURhdGFMZWZ0LT5zYnJQYXRjaGluZ01vZGUgPSBGREtyZWFkQml0KGhCcyk7CisgICAgICBpZiAoaEZyYW1lRGF0YUxlZnQtPnNiclBhdGNoaW5nTW9kZSA9PSAwKSB7CisgICAgICAgIGhGcmFtZURhdGFMZWZ0LT5zYnJPdmVyc2FtcGxpbmdGbGFnID0gRkRLcmVhZEJpdChoQnMpOworICAgICAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSB7IC8qIHNiclBpdGNoSW5CaW5zRmxhZyAqLworICAgICAgICAgIGhGcmFtZURhdGFMZWZ0LT5zYnJQaXRjaEluQmlucyA9IEZES3JlYWRCaXRzKGhCcywgNyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaEZyYW1lRGF0YUxlZnQtPnNiclBpdGNoSW5CaW5zID0gMDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaEZyYW1lRGF0YUxlZnQtPnNick92ZXJzYW1wbGluZ0ZsYWcgPSAwOworICAgICAgICBoRnJhbWVEYXRhTGVmdC0+c2JyUGl0Y2hJbkJpbnMgPSAwOworICAgICAgfQogCi0gIC8qCi0gICAgR3JpZCBjb250cm9sCi0gICovCi0gIGlmICggIWV4dHJhY3RGcmFtZUluZm8gKGhCcywgaEhlYWRlckRhdGEsIGhGcmFtZURhdGFMZWZ0LCAyLCBmbGFncykgKQotICAgIHJldHVybiAwOworICAgICAgaWYgKG5DaCA9PSAyKSB7CisgICAgICAgIGlmIChic19jb3VwbGluZykgeworICAgICAgICAgIGhGcmFtZURhdGFSaWdodC0+c2JyUGF0Y2hpbmdNb2RlID0gaEZyYW1lRGF0YUxlZnQtPnNiclBhdGNoaW5nTW9kZTsKKyAgICAgICAgICBoRnJhbWVEYXRhUmlnaHQtPnNick92ZXJzYW1wbGluZ0ZsYWcgPQorICAgICAgICAgICAgICBoRnJhbWVEYXRhTGVmdC0+c2JyT3ZlcnNhbXBsaW5nRmxhZzsKKyAgICAgICAgICBoRnJhbWVEYXRhUmlnaHQtPnNiclBpdGNoSW5CaW5zID0gaEZyYW1lRGF0YUxlZnQtPnNiclBpdGNoSW5CaW5zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGhGcmFtZURhdGFSaWdodC0+c2JyUGF0Y2hpbmdNb2RlID0gRkRLcmVhZEJpdChoQnMpOworICAgICAgICAgIGlmIChoRnJhbWVEYXRhUmlnaHQtPnNiclBhdGNoaW5nTW9kZSA9PSAwKSB7CisgICAgICAgICAgICBoRnJhbWVEYXRhUmlnaHQtPnNick92ZXJzYW1wbGluZ0ZsYWcgPSBGREtyZWFkQml0KGhCcyk7CisgICAgICAgICAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSB7IC8qIHNiclBpdGNoSW5CaW5zRmxhZyAqLworICAgICAgICAgICAgICBoRnJhbWVEYXRhUmlnaHQtPnNiclBpdGNoSW5CaW5zID0gRkRLcmVhZEJpdHMoaEJzLCA3KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGhGcmFtZURhdGFSaWdodC0+c2JyUGl0Y2hJbkJpbnMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoRnJhbWVEYXRhUmlnaHQtPnNick92ZXJzYW1wbGluZ0ZsYWcgPSAwOworICAgICAgICAgICAgaEZyYW1lRGF0YVJpZ2h0LT5zYnJQaXRjaEluQmlucyA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChuQ2ggPT0gMikgeworICAgICAgICBoRnJhbWVEYXRhUmlnaHQtPnNiclBhdGNoaW5nTW9kZSA9IDE7CisgICAgICAgIGhGcmFtZURhdGFSaWdodC0+c2JyT3ZlcnNhbXBsaW5nRmxhZyA9IDA7CisgICAgICAgIGhGcmFtZURhdGFSaWdodC0+c2JyUGl0Y2hJbkJpbnMgPSAwOworICAgICAgfQogCi0gIGlmICggIWNoZWNrRnJhbWVJbmZvICgmaEZyYW1lRGF0YUxlZnQtPmZyYW1lSW5mbywgaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cywgb3ZlcmxhcCwgaEhlYWRlckRhdGEtPnRpbWVTdGVwKSApCi0gICAgcmV0dXJuIDA7CisgICAgICBoRnJhbWVEYXRhTGVmdC0+c2JyUGF0Y2hpbmdNb2RlID0gMTsKKyAgICAgIGhGcmFtZURhdGFMZWZ0LT5zYnJPdmVyc2FtcGxpbmdGbGFnID0gMDsKKyAgICAgIGhGcmFtZURhdGFMZWZ0LT5zYnJQaXRjaEluQmlucyA9IDA7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChuQ2ggPT0gMikgeworICAgICAgaEZyYW1lRGF0YVJpZ2h0LT5zYnJQYXRjaGluZ01vZGUgPSAxOworICAgICAgaEZyYW1lRGF0YVJpZ2h0LT5zYnJPdmVyc2FtcGxpbmdGbGFnID0gMDsKKyAgICAgIGhGcmFtZURhdGFSaWdodC0+c2JyUGl0Y2hJbkJpbnMgPSAwOworICAgIH0KIAotICBpZiAoaEZyYW1lRGF0YUxlZnQtPmNvdXBsaW5nKSB7Ci0gICAgRkRLbWVtY3B5ICgmaEZyYW1lRGF0YVJpZ2h0LT5mcmFtZUluZm8sICZoRnJhbWVEYXRhTGVmdC0+ZnJhbWVJbmZvLCBzaXplb2YoRlJBTUVfSU5GTykpOwotICAgIGhGcmFtZURhdGFSaWdodC0+YW1wUmVzb2x1dGlvbkN1cnJlbnRGcmFtZSA9IGhGcmFtZURhdGFMZWZ0LT5hbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lOwotICB9Ci0gIGVsc2UgewotICAgIGlmICggIWV4dHJhY3RGcmFtZUluZm8gKGhCcywgaEhlYWRlckRhdGEsIGhGcmFtZURhdGFSaWdodCwgMiwgZmxhZ3MpICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKCAhY2hlY2tGcmFtZUluZm8gKCZoRnJhbWVEYXRhUmlnaHQtPmZyYW1lSW5mbywgaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cywgb3ZlcmxhcCwgaEhlYWRlckRhdGEtPnRpbWVTdGVwKSApCi0gICAgICByZXR1cm4gMDsKKyAgICBoRnJhbWVEYXRhTGVmdC0+c2JyUGF0Y2hpbmdNb2RlID0gMTsKKyAgICBoRnJhbWVEYXRhTGVmdC0+c2JyT3ZlcnNhbXBsaW5nRmxhZyA9IDA7CisgICAgaEZyYW1lRGF0YUxlZnQtPnNiclBpdGNoSW5CaW5zID0gMDsKICAgfQogCiAgIC8qCi0gICAgRmV0Y2ggZG9tYWluIHZlY3RvcnMgKHRpbWUgb3IgZnJlcXVlbmN5IGRpcmVjdGlvbiBmb3IgZGVsdGEtY29kaW5nKQorICAgIHNicl9ncmlkKCk6IEdyaWQgY29udHJvbAogICAqLwotICBzYnJHZXREaXJlY3Rpb25Db250cm9sRGF0YSAoaEZyYW1lRGF0YUxlZnQsIGhCcyk7Ci0gIHNickdldERpcmVjdGlvbkNvbnRyb2xEYXRhIChoRnJhbWVEYXRhUmlnaHQsIGhCcyk7CisgIGlmIChoSGVhZGVyRGF0YS0+YnNfaW5mby5wdmNfbW9kZSkgeworICAgIEZES19BU1NFUlQobkNoID09IDEpOyAvKiBQVkMgbm90IHBvc3NpYmxlIGZvciBDUEUgKi8KKyAgICBpZiAoIWV4dHJhY3RQdmNGcmFtZUluZm8oaEJzLCBoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhGcmFtZURhdGFMZWZ0UHJldiwgcHZjX21vZGVfbGFzdCwgZmxhZ3MpKQorICAgICAgcmV0dXJuIDA7CiAKLSAgZm9yIChpPTA7IGk8aEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uSW52ZkJhbmRzOyBpKyspIHsKLSAgICBoRnJhbWVEYXRhTGVmdC0+c2JyX2ludmZfbW9kZVtpXSA9IChJTlZGX01PREUpIEZES3JlYWRCaXRzIChoQnMsIDIpOworICAgIGlmICghY2hlY2tGcmFtZUluZm8oJmhGcmFtZURhdGFMZWZ0LT5mcmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzLCBvdmVybGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPnRpbWVTdGVwKSkKKyAgICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIGlmICghZXh0cmFjdEZyYW1lSW5mbyhoQnMsIGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhTGVmdCwgMSwgZmxhZ3MpKSByZXR1cm4gMDsKKworICAgIGlmICghY2hlY2tGcmFtZUluZm8oJmhGcmFtZURhdGFMZWZ0LT5mcmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzLCBvdmVybGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPnRpbWVTdGVwKSkKKyAgICAgIHJldHVybiAwOworICB9CisgIGlmIChuQ2ggPT0gMikgeworICAgIGlmIChoRnJhbWVEYXRhTGVmdC0+Y291cGxpbmcpIHsKKyAgICAgIEZES21lbWNweSgmaEZyYW1lRGF0YVJpZ2h0LT5mcmFtZUluZm8sICZoRnJhbWVEYXRhTGVmdC0+ZnJhbWVJbmZvLAorICAgICAgICAgICAgICAgIHNpemVvZihGUkFNRV9JTkZPKSk7CisgICAgICBoRnJhbWVEYXRhUmlnaHQtPmFtcFJlc29sdXRpb25DdXJyZW50RnJhbWUgPQorICAgICAgICAgIGhGcmFtZURhdGFMZWZ0LT5hbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIWV4dHJhY3RGcmFtZUluZm8oaEJzLCBoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YVJpZ2h0LCAyLCBmbGFncykpCisgICAgICAgIHJldHVybiAwOworCisgICAgICBpZiAoIWNoZWNrRnJhbWVJbmZvKCZoRnJhbWVEYXRhUmlnaHQtPmZyYW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cywgb3ZlcmxhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPnRpbWVTdGVwKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogICB9CiAKLSAgaWYgKGhGcmFtZURhdGFMZWZ0LT5jb3VwbGluZykgewotICAgIGZvciAoaT0wOyBpPGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubkludmZCYW5kczsgaSsrKSB7Ci0gICAgICBoRnJhbWVEYXRhUmlnaHQtPnNicl9pbnZmX21vZGVbaV0gPSBoRnJhbWVEYXRhTGVmdC0+c2JyX2ludmZfbW9kZVtpXTsKLSAgICB9CisgIC8qCisgICAgc2JyX2R0ZGYoKTogRmV0Y2ggZG9tYWluIHZlY3RvcnMgKHRpbWUgb3IgZnJlcXVlbmN5IGRpcmVjdGlvbiBmb3IKKyAgICBkZWx0YS1jb2RpbmcpCisgICovCisgIHNickdldERpcmVjdGlvbkNvbnRyb2xEYXRhKGhGcmFtZURhdGFMZWZ0LCBoQnMsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+YnNfaW5mby5wdmNfbW9kZSk7CisgIGlmIChuQ2ggPT0gMikgeworICAgIHNickdldERpcmVjdGlvbkNvbnRyb2xEYXRhKGhGcmFtZURhdGFSaWdodCwgaEJzLCBmbGFncywgMCk7CisgIH0KIAotCi0gICAgaWYgKCAhc2JyR2V0RW52ZWxvcGUgKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhTGVmdCwgaEJzLCBmbGFncykgKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBzYnJHZXROb2lzZUZsb29yRGF0YSAoaEhlYWRlckRhdGEsIGhGcmFtZURhdGFMZWZ0LCBoQnMpOwotCi0gICAgaWYgKCAhc2JyR2V0RW52ZWxvcGUgKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhUmlnaHQsIGhCcywgZmxhZ3MpICkgewotICAgICAgcmV0dXJuIDA7CisgIC8qIHNicl9pbnZmKCkgKi8KKyAgZm9yIChpID0gMDsgaSA8IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubkludmZCYW5kczsgaSsrKSB7CisgICAgaEZyYW1lRGF0YUxlZnQtPnNicl9pbnZmX21vZGVbaV0gPSAoSU5WRl9NT0RFKUZES3JlYWRCaXRzKGhCcywgMik7CisgIH0KKyAgaWYgKG5DaCA9PSAyKSB7CisgICAgaWYgKGhGcmFtZURhdGFMZWZ0LT5jb3VwbGluZykgeworICAgICAgZm9yIChpID0gMDsgaSA8IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubkludmZCYW5kczsgaSsrKSB7CisgICAgICAgIGhGcmFtZURhdGFSaWdodC0+c2JyX2ludmZfbW9kZVtpXSA9IGhGcmFtZURhdGFMZWZ0LT5zYnJfaW52Zl9tb2RlW2ldOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uSW52ZkJhbmRzOyBpKyspIHsKKyAgICAgICAgaEZyYW1lRGF0YVJpZ2h0LT5zYnJfaW52Zl9tb2RlW2ldID0gKElOVkZfTU9ERSlGREtyZWFkQml0cyhoQnMsIDIpOworICAgICAgfQogICAgIH0KICAgfQotICBlbHNlIHsKIAotICAgIGZvciAoaT0wOyBpPGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubkludmZCYW5kczsgaSsrKSB7Ci0gICAgICBoRnJhbWVEYXRhUmlnaHQtPnNicl9pbnZmX21vZGVbaV0gPSAoSU5WRl9NT0RFKSBGREtyZWFkQml0cyAoaEJzLCAyKTsKKyAgaWYgKG5DaCA9PSAxKSB7CisgICAgaWYgKGhIZWFkZXJEYXRhLT5ic19pbmZvLnB2Y19tb2RlKSB7CisgICAgICBpZiAoIXNickdldFB2Y0VudmVsb3BlKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhTGVmdCwgaEJzLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmJzX2luZm8ucHZjX21vZGUpKQorICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKCFzYnJHZXRFbnZlbG9wZShoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YUxlZnQsIGhCcywgZmxhZ3MpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBzYnJHZXROb2lzZUZsb29yRGF0YShoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YUxlZnQsIGhCcyk7CisgIH0gZWxzZSBpZiAoaEZyYW1lRGF0YUxlZnQtPmNvdXBsaW5nKSB7CisgICAgaWYgKCFzYnJHZXRFbnZlbG9wZShoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YUxlZnQsIGhCcywgZmxhZ3MpKSB7CisgICAgICByZXR1cm4gMDsKICAgICB9CiAKKyAgICBzYnJHZXROb2lzZUZsb29yRGF0YShoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YUxlZnQsIGhCcyk7CiAKLQotICAgIGlmICggIXNickdldEVudmVsb3BlIChoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YUxlZnQsIGhCcywgZmxhZ3MpICkKKyAgICBpZiAoIXNickdldEVudmVsb3BlKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhUmlnaHQsIGhCcywgZmxhZ3MpKSB7CiAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc2JyR2V0Tm9pc2VGbG9vckRhdGEoaEhlYWRlckRhdGEsIGhGcmFtZURhdGFSaWdodCwgaEJzKTsKKyAgfSBlbHNlIHsgLyogbkNoID09IDIgJiYgbm8gY291cGxpbmcgKi8KIAotICAgIGlmICggIXNickdldEVudmVsb3BlIChoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YVJpZ2h0LCBoQnMsIGZsYWdzKSApCi0gICAgICByZXR1cm4gMDsKKyAgICBpZiAoIXNickdldEVudmVsb3BlKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhTGVmdCwgaEJzLCBmbGFncykpIHJldHVybiAwOwogCi0gICAgc2JyR2V0Tm9pc2VGbG9vckRhdGEgKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhTGVmdCwgaEJzKTsKKyAgICBpZiAoIXNickdldEVudmVsb3BlKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhUmlnaHQsIGhCcywgZmxhZ3MpKSByZXR1cm4gMDsKIAorICAgIHNickdldE5vaXNlRmxvb3JEYXRhKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhTGVmdCwgaEJzKTsKKworICAgIHNickdldE5vaXNlRmxvb3JEYXRhKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhUmlnaHQsIGhCcyk7CiAgIH0KLSAgc2JyR2V0Tm9pc2VGbG9vckRhdGEgKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhUmlnaHQsIGhCcyk7CiAKLSAgc2JyR2V0U3ludGhldGljQ29kZWREYXRhKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhTGVmdCwgaEJzKTsKLSAgc2JyR2V0U3ludGhldGljQ29kZWREYXRhKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhUmlnaHQsIGhCcyk7CisgIHNickdldFN5bnRoZXRpY0NvZGVkRGF0YShoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YUxlZnQsIGhCcywgZmxhZ3MpOworICBpZiAobkNoID09IDIpIHsKKyAgICBzYnJHZXRTeW50aGV0aWNDb2RlZERhdGEoaEhlYWRlckRhdGEsIGhGcmFtZURhdGFSaWdodCwgaEJzLCBmbGFncyk7CisgIH0KIAotICB7Ci0gICAgaWYgKCEgZXh0cmFjdEV4dGVuZGVkRGF0YSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKSB7CisgIGlmICghKGZsYWdzICYgKFNCUkRFQ19TWU5UQVhfVVNBQyB8IFNCUkRFQ19TWU5UQVhfUlNWRDUwKSkpIHsKKyAgICBpZiAoIWV4dHJhY3RFeHRlbmRlZERhdGEoaEhlYWRlckRhdGEsIGhCcywgaFBhcmFtZXRyaWNTdGVyZW9EZWMpKSB7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgIH0KQEAgLTY2NCwzOCArODE5LDUwIEBACiAgIHJldHVybiAxOwogfQogCi0KLQotCiAvKiEKICAgXGJyaWVmICAgUmVhZCBkaXJlY3Rpb24gY29udHJvbCBkYXRhIGZyb20gYml0c3RyZWFtCiAqLwotdm9pZAotc2JyR2V0RGlyZWN0aW9uQ29udHJvbERhdGEgKEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2ZyYW1lX2RhdGEsIC8qITwgaGFuZGxlIHRvIHN0cnVjdCBTQlJfRlJBTUVfREFUQSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQnMpICAgICAgICAgIC8qITwgaGFuZGxlIHRvIHN0cnVjdCBCSVRfQlVGICovCit2b2lkIHNickdldERpcmVjdGlvbkNvbnRyb2xEYXRhKAorICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2ZyYW1lX2RhdGEsIC8qITwgaGFuZGxlIHRvIHN0cnVjdCBTQlJfRlJBTUVfREFUQSAqLworICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgICAgICAgICAgIC8qITwgaGFuZGxlIHRvIHN0cnVjdCBCSVRfQlVGICovCisgICAgY29uc3QgVUlOVCBmbGFncywgY29uc3QgaW50IGJzX3B2Y19tb2RlKQorCiB7CiAgIGludCBpOworICBpbnQgaW5kZXBGbGFnID0gMDsKIAotICBmb3IgKGkgPSAwOyBpIDwgaF9mcmFtZV9kYXRhLT5mcmFtZUluZm8ubkVudmVsb3BlczsgaSsrKSB7Ci0gICAgaF9mcmFtZV9kYXRhLT5kb21haW5fdmVjW2ldID0gRkRLcmVhZEJpdHMgKGhCcywgMSk7CisgIGlmIChmbGFncyAmIChTQlJERUNfU1lOVEFYX1VTQUMgfCBTQlJERUNfU1lOVEFYX1JTVkQ1MCkpIHsKKyAgICBpbmRlcEZsYWcgPSBmbGFncyAmIFNCUkRFQ19VU0FDX0lOREVQOwogICB9CiAKLSAgZm9yIChpID0gMDsgaSA8IGhfZnJhbWVfZGF0YS0+ZnJhbWVJbmZvLm5Ob2lzZUVudmVsb3BlczsgaSsrKSB7Ci0gICAgaF9mcmFtZV9kYXRhLT5kb21haW5fdmVjX25vaXNlW2ldID0gRkRLcmVhZEJpdHMgKGhCcywgMSk7CisgIGlmIChic19wdmNfbW9kZSA9PSAwKSB7CisgICAgaSA9IDA7CisgICAgaWYgKGluZGVwRmxhZykgeworICAgICAgaF9mcmFtZV9kYXRhLT5kb21haW5fdmVjW2krK10gPSAwOworICAgIH0KKyAgICBmb3IgKDsgaSA8IGhfZnJhbWVfZGF0YS0+ZnJhbWVJbmZvLm5FbnZlbG9wZXM7IGkrKykgeworICAgICAgaF9mcmFtZV9kYXRhLT5kb21haW5fdmVjW2ldID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKKyAgICB9CisgIH0KKworICBpID0gMDsKKyAgaWYgKGluZGVwRmxhZykgeworICAgIGhfZnJhbWVfZGF0YS0+ZG9tYWluX3ZlY19ub2lzZVtpKytdID0gMDsKKyAgfQorICBmb3IgKDsgaSA8IGhfZnJhbWVfZGF0YS0+ZnJhbWVJbmZvLm5Ob2lzZUVudmVsb3BlczsgaSsrKSB7CisgICAgaF9mcmFtZV9kYXRhLT5kb21haW5fdmVjX25vaXNlW2ldID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKICAgfQogfQogCi0KLQogLyohCiAgIFxicmllZiAgIFJlYWQgbm9pc2UtZmxvb3ItbGV2ZWwgZGF0YSBmcm9tIGJpdHN0cmVhbQogKi8KLXZvaWQKLXNickdldE5vaXNlRmxvb3JEYXRhIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBICBoX2ZyYW1lX2RhdGEsIC8qITwgaGFuZGxlIHRvIHN0cnVjdCBTQlJfRlJBTUVfREFUQSAqLwotICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJzKSAgICAgICAgICAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgQklUX0JVRiAqLwordm9pZCBzYnJHZXROb2lzZUZsb29yRGF0YSgKKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9mcmFtZV9kYXRhLCAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgU0JSX0ZSQU1FX0RBVEEgKi8KKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMpICAgICAgICAgICAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgQklUX0JVRiAqLwogewotICBpbnQgaSxqOworICBpbnQgaSwgajsKICAgaW50IGRlbHRhOwogICBDT1VQTElOR19NT0RFIGNvdXBsaW5nOwogICBpbnQgbm9Ob2lzZUJhbmRzID0gaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uTmZiOwpAQCAtNzA2LDYxICs4NzMsMTU3IEBACiAKICAgY291cGxpbmcgPSBoX2ZyYW1lX2RhdGEtPmNvdXBsaW5nOwogCi0KICAgLyoKICAgICBTZWxlY3QgaHVmZm1hbiBjb2RlYm9vayBkZXBlbmRpbmcgb24gY291cGxpbmcgbW9kZQogICAqLwogICBpZiAoY291cGxpbmcgPT0gQ09VUExJTkdfQkFMKSB7CiAgICAgaGNiX25vaXNlID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19Ob2lzZUJhbGFuY2UxMVQ7Ci0gICAgaGNiX25vaXNlRiA9IChIdWZmbWFuKSZGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfRW52QmFsYW5jZTExRjsgIC8qICJzYnJfaHVmZkJvb2tfTm9pc2VCYWxhbmNlMTFGIiAqLworICAgIGhjYl9ub2lzZUYgPQorICAgICAgICAoSHVmZm1hbikmRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkJhbGFuY2UxMUY7IC8qICJzYnJfaHVmZkJvb2tfTm9pc2VCYWxhbmNlMTFGIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgIGVudkRhdGFUYWJsZUNvbXBGYWN0b3IgPSAxOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIGhjYl9ub2lzZSA9IChIdWZmbWFuKSZGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfTm9pc2VMZXZlbDExVDsKLSAgICBoY2Jfbm9pc2VGID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZMZXZlbDExRjsgICAgLyogInNicl9odWZmQm9va19Ob2lzZUxldmVsMTFGIiAqLworICAgIGhjYl9ub2lzZUYgPQorICAgICAgICAoSHVmZm1hbikmRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkxldmVsMTFGOyAvKiAic2JyX2h1ZmZCb29rX05vaXNlTGV2ZWwxMUYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgIGVudkRhdGFUYWJsZUNvbXBGYWN0b3IgPSAwOwogICB9CiAKICAgLyoKICAgICBSZWFkIHJhdyBub2lzZS1lbnZlbG9wZSBkYXRhCiAgICovCi0gIGZvciAoaT0wOyBpPGhfZnJhbWVfZGF0YS0+ZnJhbWVJbmZvLm5Ob2lzZUVudmVsb3BlczsgaSsrKSB7Ci0KLQorICBmb3IgKGkgPSAwOyBpIDwgaF9mcmFtZV9kYXRhLT5mcmFtZUluZm8ubk5vaXNlRW52ZWxvcGVzOyBpKyspIHsKICAgICBpZiAoaF9mcmFtZV9kYXRhLT5kb21haW5fdmVjX25vaXNlW2ldID09IDApIHsKICAgICAgIGlmIChjb3VwbGluZyA9PSBDT1VQTElOR19CQUwpIHsKLSAgICAgICAgaF9mcmFtZV9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaSpub05vaXNlQmFuZHNdID0KLSAgICAgICAgICAoRklYUF9TR0wpICgoKGludClGREtyZWFkQml0cyAoaEJzLCA1KSkgPDwgZW52RGF0YVRhYmxlQ29tcEZhY3Rvcik7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaF9mcmFtZV9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaSpub05vaXNlQmFuZHNdID0KLSAgICAgICAgICAoRklYUF9TR0wpIChpbnQpRkRLcmVhZEJpdHMgKGhCcywgNSk7CisgICAgICAgIGhfZnJhbWVfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2kgKiBub05vaXNlQmFuZHNdID0KKyAgICAgICAgICAgIChGSVhQX1NHTCkoKChpbnQpRkRLcmVhZEJpdHMoaEJzLCA1KSkgPDwgZW52RGF0YVRhYmxlQ29tcEZhY3Rvcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBoX2ZyYW1lX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpICogbm9Ob2lzZUJhbmRzXSA9CisgICAgICAgICAgICAoRklYUF9TR0wpKGludClGREtyZWFkQml0cyhoQnMsIDUpOwogICAgICAgfQogCiAgICAgICBmb3IgKGogPSAxOyBqIDwgbm9Ob2lzZUJhbmRzOyBqKyspIHsKICAgICAgICAgZGVsdGEgPSBEZWNvZGVIdWZmbWFuQ1coaGNiX25vaXNlRiwgaEJzKTsKLSAgICAgICAgaF9mcmFtZV9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaSpub05vaXNlQmFuZHMral0gPSAoRklYUF9TR0wpIChkZWx0YSA8PCBlbnZEYXRhVGFibGVDb21wRmFjdG9yKTsKKyAgICAgICAgaF9mcmFtZV9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaSAqIG5vTm9pc2VCYW5kcyArIGpdID0KKyAgICAgICAgICAgIChGSVhQX1NHTCkoZGVsdGEgPDwgZW52RGF0YVRhYmxlQ29tcEZhY3Rvcik7CiAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICBmb3IgKGogPSAwOyBqIDwgbm9Ob2lzZUJhbmRzOyBqKyspIHsKICAgICAgICAgZGVsdGEgPSBEZWNvZGVIdWZmbWFuQ1coaGNiX25vaXNlLCBoQnMpOwotICAgICAgICBoX2ZyYW1lX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpKm5vTm9pc2VCYW5kcytqXSA9IChGSVhQX1NHTCkgKGRlbHRhIDw8IGVudkRhdGFUYWJsZUNvbXBGYWN0b3IpOworICAgICAgICBoX2ZyYW1lX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpICogbm9Ob2lzZUJhbmRzICsgal0gPQorICAgICAgICAgICAgKEZJWFBfU0dMKShkZWx0YSA8PCBlbnZEYXRhVGFibGVDb21wRmFjdG9yKTsKICAgICAgIH0KICAgICB9CiAgIH0KIH0KIAorLyogbnMgPSBtYXBOc01vZGUybnNbcHZjTW9kZS0xXVtuc01vZGVdICovCitzdGF0aWMgY29uc3QgVUNIQVIgbWFwTnNNb2RlMm5zWzJdWzJdID0geworICAgIHsxNiwgNH0sIC8qIHB2Y01vZGUgPSAxICovCisgICAgezEyLCAzfSAgLyogcHZjTW9kZSA9IDIgKi8KK307CiAKK3N0YXRpYyBpbnQgc2JyR2V0UHZjRW52ZWxvcGUoCisgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCisgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZnJhbWVfZGF0YSwgLyohPCBoYW5kbGUgdG8gc3RydWN0IFNCUl9GUkFNRV9EQVRBICovCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCAgICAgICAgICAgLyohPCBoYW5kbGUgdG8gc3RydWN0IEJJVF9CVUYgKi8KKyAgICBjb25zdCBVSU5UIGZsYWdzLCBjb25zdCBVSU5UIHB2Y01vZGUpIHsKKyAgaW50IGRpdk1vZGUsIG5zTW9kZTsKKyAgaW50IGluZGVwRmxhZyA9IGZsYWdzICYgU0JSREVDX1VTQUNfSU5ERVA7CisgIFVDSEFSICpwdmNJRCA9IGhfZnJhbWVfZGF0YS0+cHZjSUQ7CisKKyAgZGl2TW9kZSA9IEZES3JlYWRCaXRzKGhCcywgUFZDX0RJVk1PREVfQklUUyk7CisgIG5zTW9kZSA9IEZES3JlYWRCaXQoaEJzKTsKKyAgRkRLX0FTU0VSVCgocHZjTW9kZSA9PSAxKSB8fCAocHZjTW9kZSA9PSAyKSk7CisgIGhfZnJhbWVfZGF0YS0+bnMgPSBtYXBOc01vZGUybnNbcHZjTW9kZSAtIDFdW25zTW9kZV07CisKKyAgaWYgKGRpdk1vZGUgPD0gMykgeworICAgIGludCBpLCBrID0gMSwgc3VtX2xlbmd0aCA9IDAsIHJldXNlX3BjdklEOworCisgICAgLyogc3BlY2lhbCB0cmVhdG1lbnQgZm9yIGZpcnN0IHRpbWUgc2xvdCBrPTAgKi8KKyAgICBpbmRlcEZsYWcgPyAocmV1c2VfcGN2SUQgPSAwKSA6IChyZXVzZV9wY3ZJRCA9IEZES3JlYWRCaXQoaEJzKSk7CisgICAgaWYgKHJldXNlX3BjdklEKSB7CisgICAgICBwdmNJRFswXSA9IGhIZWFkZXJEYXRhLT5wdmNJRHByZXY7CisgICAgfSBlbHNlIHsKKyAgICAgIHB2Y0lEWzBdID0gRkRLcmVhZEJpdHMoaEJzLCBQVkNfUFZDSURfQklUUyk7CisgICAgfQorCisgICAgLyogb3RoZXIgdGltZSBzbG90cyBrPjAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZGl2TW9kZTsgaSsrKSB7CisgICAgICBpbnQgbGVuZ3RoLCBudW1CaXRzID0gNDsKKworICAgICAgaWYgKHN1bV9sZW5ndGggPj0gMTMpIHsKKyAgICAgICAgbnVtQml0cyA9IDE7CisgICAgICB9IGVsc2UgaWYgKHN1bV9sZW5ndGggPj0gMTEpIHsKKyAgICAgICAgbnVtQml0cyA9IDI7CisgICAgICB9IGVsc2UgaWYgKHN1bV9sZW5ndGggPj0gNykgeworICAgICAgICBudW1CaXRzID0gMzsKKyAgICAgIH0KKworICAgICAgbGVuZ3RoID0gRkRLcmVhZEJpdHMoaEJzLCBudW1CaXRzKTsKKyAgICAgIHN1bV9sZW5ndGggKz0gbGVuZ3RoICsgMTsKKyAgICAgIGlmIChzdW1fbGVuZ3RoID49IFBWQ19OVElNRVNMT1QpIHsKKyAgICAgICAgcmV0dXJuIDA7IC8qIHBhcnNlIGVycm9yICovCisgICAgICB9CisgICAgICBmb3IgKDsgbGVuZ3RoLS07IGsrKykgeworICAgICAgICBwdmNJRFtrXSA9IHB2Y0lEW2sgLSAxXTsKKyAgICAgIH0KKyAgICAgIHB2Y0lEW2srK10gPSBGREtyZWFkQml0cyhoQnMsIFBWQ19QVkNJRF9CSVRTKTsKKyAgICB9CisgICAgZm9yICg7IGsgPCAxNjsgaysrKSB7CisgICAgICBwdmNJRFtrXSA9IHB2Y0lEW2sgLSAxXTsKKyAgICB9CisgIH0gZWxzZSB7IC8qIGRpdk1vZGUgPj0gNCAqLworICAgIGludCBudW1fZ3JpZF9pbmZvLCBmaXhlZF9sZW5ndGgsIGdyaWRfaW5mbywgaiwgayA9IDA7CisKKyAgICBkaXZNb2RlIC09IDQ7CisgICAgbnVtX2dyaWRfaW5mbyA9IDIgPDwgZGl2TW9kZTsKKyAgICBmaXhlZF9sZW5ndGggPSA4ID4+IGRpdk1vZGU7CisgICAgRkRLX0FTU0VSVChudW1fZ3JpZF9pbmZvICogZml4ZWRfbGVuZ3RoID09IFBWQ19OVElNRVNMT1QpOworCisgICAgLyogc3BlY2lhbCB0cmVhdG1lbnQgZm9yIGZpcnN0IHRpbWUgc2xvdCBrPTAgKi8KKyAgICBpbmRlcEZsYWcgPyAoZ3JpZF9pbmZvID0gMSkgOiAoZ3JpZF9pbmZvID0gRkRLcmVhZEJpdChoQnMpKTsKKyAgICBpZiAoZ3JpZF9pbmZvKSB7CisgICAgICBwdmNJRFtrKytdID0gRkRLcmVhZEJpdHMoaEJzLCBQVkNfUFZDSURfQklUUyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHB2Y0lEW2srK10gPSBoSGVhZGVyRGF0YS0+cHZjSURwcmV2OworICAgIH0KKyAgICBqID0gZml4ZWRfbGVuZ3RoIC0gMTsKKyAgICBmb3IgKDsgai0tOyBrKyspIHsKKyAgICAgIHB2Y0lEW2tdID0gcHZjSURbayAtIDFdOworICAgIH0KKyAgICBudW1fZ3JpZF9pbmZvLS07CisKKyAgICAvKiBvdGhlciB0aW1lIHNsb3RzIGs+MCAqLworICAgIGZvciAoOyBudW1fZ3JpZF9pbmZvLS07KSB7CisgICAgICBqID0gZml4ZWRfbGVuZ3RoOworICAgICAgZ3JpZF9pbmZvID0gRkRLcmVhZEJpdChoQnMpOworICAgICAgaWYgKGdyaWRfaW5mbykgeworICAgICAgICBwdmNJRFtrKytdID0gRkRLcmVhZEJpdHMoaEJzLCBQVkNfUFZDSURfQklUUyk7CisgICAgICAgIGotLTsKKyAgICAgIH0KKyAgICAgIGZvciAoOyBqLS07IGsrKykgeworICAgICAgICBwdmNJRFtrXSA9IHB2Y0lEW2sgLSAxXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBoSGVhZGVyRGF0YS0+cHZjSURwcmV2ID0gcHZjSURbUFZDX05USU1FU0xPVCAtIDFdOworCisgIC8qIHVzYWdlIG9mIFBWQyBleGNsdWRlcyBpbnRlci1URVMgdG9vbCAqLworICBoX2ZyYW1lX2RhdGEtPmlURVNhY3RpdmUgPSAoVUNIQVIpMDsKKworICByZXR1cm4gMTsKK30KIC8qIQogICBcYnJpZWYgICBSZWFkIGVudmVsb3BlIGRhdGEgZnJvbSBiaXRzdHJlYW0KICovCi1zdGF0aWMgaW50Ci1zYnJHZXRFbnZlbG9wZSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLwotICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaF9mcmFtZV9kYXRhLCAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgU0JSX0ZSQU1FX0RBVEEgKi8KLSAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCcywgICAgICAgICAgLyohPCBoYW5kbGUgdG8gc3RydWN0IEJJVF9CVUYgKi8KLSAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgIGZsYWdzKQoteworc3RhdGljIGludCBzYnJHZXRFbnZlbG9wZSgKKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KKyAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaF9mcmFtZV9kYXRhLCAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgU0JSX0ZSQU1FX0RBVEEgKi8KKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsICAgICAgICAgICAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgQklUX0JVRiAqLworICAgIGNvbnN0IFVJTlQgZmxhZ3MpIHsKICAgaW50IGksIGo7CiAgIFVDSEFSIG5vX2JhbmRbTUFYX0VOVkVMT1BFU107CiAgIGludCBkZWx0YSA9IDA7CkBAIC03NzQsNyArMTAzNyw3IEBACiAKICAgaF9mcmFtZV9kYXRhLT5uU2NhbGVGYWN0b3JzID0gMDsKIAotICBpZiAoIChoX2ZyYW1lX2RhdGEtPmZyYW1lSW5mby5mcmFtZUNsYXNzID09IDApICYmIChuRW52ZWxvcGVzID09IDEpICkgeworICBpZiAoKGhfZnJhbWVfZGF0YS0+ZnJhbWVJbmZvLmZyYW1lQ2xhc3MgPT0gMCkgJiYgKG5FbnZlbG9wZXMgPT0gMSkpIHsKICAgICBpZiAoZmxhZ3MgJiBTQlJERUNfRUxEX0dSSUQpCiAgICAgICBhbXBSZXMgPSBoX2ZyYW1lX2RhdGEtPmFtcFJlc29sdXRpb25DdXJyZW50RnJhbWU7CiAgICAgZWxzZQpAQCAtNzg1LDEzICsxMDQ4LDEwIEBACiAgIC8qCiAgICAgU2V0IG51bWJlciBvZiBiaXRzIGZvciBmaXJzdCB2YWx1ZSBkZXBlbmRpbmcgb24gYW1wbGl0dWRlIHJlc29sdXRpb24KICAgKi8KLSAgaWYoYW1wUmVzID09IDEpCi0gIHsKKyAgaWYgKGFtcFJlcyA9PSAxKSB7CiAgICAgc3RhcnRfYml0cyA9IDY7CiAgICAgc3RhcnRfYml0c19iYWxhbmNlID0gNTsKLSAgfQotICBlbHNlCi0gIHsKKyAgfSBlbHNlIHsKICAgICBzdGFydF9iaXRzID0gNzsKICAgICBzdGFydF9iaXRzX2JhbGFuY2UgPSA2OwogICB9CkBAIC04MDAsMTEgKzEwNjAsMTEgQEAKICAgICBDYWxjdWxhdGUgbnVtYmVyIG9mIHZhbHVlcyBmb3IgZWFjaCBlbnZlbG9wZSBhbmQgYWxsdG9nZXRoZXIKICAgKi8KICAgZm9yIChpID0gMDsgaSA8IG5FbnZlbG9wZXM7IGkrKykgewotICAgIG5vX2JhbmRbaV0gPSBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5TZmJbaF9mcmFtZV9kYXRhLT5mcmFtZUluZm8uZnJlcVJlc1tpXV07CisgICAgbm9fYmFuZFtpXSA9CisgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEublNmYltoX2ZyYW1lX2RhdGEtPmZyYW1lSW5mby5mcmVxUmVzW2ldXTsKICAgICBoX2ZyYW1lX2RhdGEtPm5TY2FsZUZhY3RvcnMgKz0gbm9fYmFuZFtpXTsKICAgfQotICBpZiAoaF9mcmFtZV9kYXRhLT5uU2NhbGVGYWN0b3JzID4gTUFYX05VTV9FTlZFTE9QRV9WQUxVRVMpCi0gICAgcmV0dXJuIDA7CisgIGlmIChoX2ZyYW1lX2RhdGEtPm5TY2FsZUZhY3RvcnMgPiBNQVhfTlVNX0VOVkVMT1BFX1ZBTFVFUykgcmV0dXJuIDA7CiAKICAgLyoKICAgICBTZWxlY3QgSHVmZm1hbiBjb2RlYm9vayBkZXBlbmRpbmcgb24gY291cGxpbmcgbW9kZSBhbmQgYW1wbGl0dWRlIHJlc29sdXRpb24KQEAgLTgxNCw1NyArMTA3NCw2NCBAQAogICAgIGlmIChhbXBSZXMgPT0gMCkgewogICAgICAgaGNiX3QgPSAoSHVmZm1hbikmRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkJhbGFuY2UxMFQ7CiAgICAgICBoY2JfZiA9IChIdWZmbWFuKSZGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfRW52QmFsYW5jZTEwRjsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIGhjYl90ID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZCYWxhbmNlMTFUOwogICAgICAgaGNiX2YgPSAoSHVmZm1hbikmRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkJhbGFuY2UxMUY7CiAgICAgfQotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIGVudkRhdGFUYWJsZUNvbXBGYWN0b3IgPSAwOwogICAgIGlmIChhbXBSZXMgPT0gMCkgewogICAgICAgaGNiX3QgPSAoSHVmZm1hbikmRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkxldmVsMTBUOwogICAgICAgaGNiX2YgPSAoSHVmZm1hbikmRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkxldmVsMTBGOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgaGNiX3QgPSAoSHVmZm1hbikmRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkxldmVsMTFUOwogICAgICAgaGNiX2YgPSAoSHVmZm1hbikmRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkxldmVsMTFGOwogICAgIH0KICAgfQogCisgIGhfZnJhbWVfZGF0YS0+aVRFU2FjdGl2ZSA9IChVQ0hBUikwOyAvKiBkaXNhYmxlIGludGVyLVRFUyBieSBkZWZhdWx0ICovCiAgIC8qCiAgICAgTm93IHJlYWQgcmF3IGVudmVsb3BlIGRhdGEKICAgKi8KICAgZm9yIChqID0gMCwgb2Zmc2V0ID0gMDsgaiA8IG5FbnZlbG9wZXM7IGorKykgewotCi0KICAgICBpZiAoaF9mcmFtZV9kYXRhLT5kb21haW5fdmVjW2pdID09IDApIHsKICAgICAgIGlmIChjb3VwbGluZyA9PSBDT1VQTElOR19CQUwpIHsKICAgICAgICAgaF9mcmFtZV9kYXRhLT5pRW52ZWxvcGVbb2Zmc2V0XSA9Ci0gICAgICAgICAgKEZJWFBfU0dMKSAoKCAoaW50KUZES3JlYWRCaXRzKGhCcywgc3RhcnRfYml0c19iYWxhbmNlKSkgPDwgZW52RGF0YVRhYmxlQ29tcEZhY3Rvcik7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKKyAgICAgICAgICAgIChGSVhQX1NHTCkoKChpbnQpRkRLcmVhZEJpdHMoaEJzLCBzdGFydF9iaXRzX2JhbGFuY2UpKQorICAgICAgICAgICAgICAgICAgICAgICA8PCBlbnZEYXRhVGFibGVDb21wRmFjdG9yKTsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIGhfZnJhbWVfZGF0YS0+aUVudmVsb3BlW29mZnNldF0gPQotICAgICAgICAgIChGSVhQX1NHTCkgKGludClGREtyZWFkQml0cyAoaEJzLCBzdGFydF9iaXRzKTsKKyAgICAgICAgICAgIChGSVhQX1NHTCkoaW50KUZES3JlYWRCaXRzKGhCcywgc3RhcnRfYml0cyk7CiAgICAgICB9CiAgICAgfQogCiAgICAgZm9yIChpID0gKDEgLSBoX2ZyYW1lX2RhdGEtPmRvbWFpbl92ZWNbal0pOyBpIDwgbm9fYmFuZFtqXTsgaSsrKSB7Ci0KICAgICAgIGlmIChoX2ZyYW1lX2RhdGEtPmRvbWFpbl92ZWNbal0gPT0gMCkgewogICAgICAgICBkZWx0YSA9IERlY29kZUh1ZmZtYW5DVyhoY2JfZiwgaEJzKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgeworICAgICAgfSBlbHNlIHsKICAgICAgICAgZGVsdGEgPSBEZWNvZGVIdWZmbWFuQ1coaGNiX3QsIGhCcyk7CiAgICAgICB9CiAKLSAgICAgIGhfZnJhbWVfZGF0YS0+aUVudmVsb3BlW29mZnNldCArIGldID0gKEZJWFBfU0dMKSAoZGVsdGEgPDwgZW52RGF0YVRhYmxlQ29tcEZhY3Rvcik7CisgICAgICBoX2ZyYW1lX2RhdGEtPmlFbnZlbG9wZVtvZmZzZXQgKyBpXSA9CisgICAgICAgICAgKEZJWFBfU0dMKShkZWx0YSA8PCBlbnZEYXRhVGFibGVDb21wRmFjdG9yKTsKKyAgICB9CisgICAgaWYgKChmbGFncyAmIFNCUkRFQ19TWU5UQVhfVVNBQykgJiYgKGZsYWdzICYgU0JSREVDX1VTQUNfSVRFUykpIHsKKyAgICAgIGludCBic190ZW1wX3NoYXBlID0gRkRLcmVhZEJpdChoQnMpOworICAgICAgRkRLX0FTU0VSVChqIDwgOCk7CisgICAgICBoX2ZyYW1lX2RhdGEtPmlURVNhY3RpdmUgfD0gKFVDSEFSKShic190ZW1wX3NoYXBlIDw8IGopOworICAgICAgaWYgKGJzX3RlbXBfc2hhcGUpIHsKKyAgICAgICAgaF9mcmFtZV9kYXRhLT5pbnRlclRlbXBTaGFwZU1vZGVbal0gPQorICAgICAgICAgICAgRkRLcmVhZDJCaXRzKGhCcyk7IC8qIGJzX2ludGVyX3RlbXBfc2hhcGVfbW9kZSAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaF9mcmFtZV9kYXRhLT5pbnRlclRlbXBTaGFwZU1vZGVbal0gPSAwOworICAgICAgfQogICAgIH0KICAgICBvZmZzZXQgKz0gbm9fYmFuZFtqXTsKICAgfQogCiAjaWYgRU5WX0VYUF9GUkFDVAotICAvKiBDb252ZXJ0IGZyb20gaW50IHRvIHNjYWxlZCBmcmFjdCAoRU5WX0VYUF9GUkFDVCBiaXRzIGZvciB0aGUgZnJhY3Rpb25hbCBwYXJ0KSAqLworICAvKiBDb252ZXJ0IGZyb20gaW50IHRvIHNjYWxlZCBmcmFjdCAoRU5WX0VYUF9GUkFDVCBiaXRzIGZvciB0aGUgZnJhY3Rpb25hbAorICAgKiBwYXJ0KSAqLwogICBmb3IgKGkgPSAwOyBpIDwgaF9mcmFtZV9kYXRhLT5uU2NhbGVGYWN0b3JzOyBpKyspIHsKICAgICBoX2ZyYW1lX2RhdGEtPmlFbnZlbG9wZVtpXSA8PD0gRU5WX0VYUF9GUkFDVDsKICAgfQpAQCAtODczLDYxICsxMTQwLDUzIEBACiAgIHJldHVybiAxOwogfQogCi0KLS8vc3RhdGljIGNvbnN0IEZSQU1FX0lORk8gdl9mcmFtZV9pbmZvMV84ID0geyAwLCAxLCB7MCwgOH0sIHsxfSwgLTEsIDEsIHswLCA4fSB9Owotc3RhdGljIGNvbnN0IEZSQU1FX0lORk8gdl9mcmFtZV9pbmZvMl84ID0geyAwLCAyLCB7MCwgNCwgOH0sIHsxLCAxfSwgLTEsIDIsIHswLCA0LCA4fSB9Owotc3RhdGljIGNvbnN0IEZSQU1FX0lORk8gdl9mcmFtZV9pbmZvNF84ID0geyAwLCA0LCB7MCwgMiwgNCwgNiwgOH0sIHsxLCAxLCAxLCAxfSwgLTEsIDIsIHswLCA0LCA4fSB9OwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCi0gIFxicmllZiAgICBHZW5lcmF0ZXMgZnJhbWUgaW5mbyBmb3IgRklYRklYb25seSBmcmFtZSBjbGFzcyB1c2VkIGZvciBsb3cgZGVsYXkgdmVyc2lvbgorICBcYnJpZWYgICAgR2VuZXJhdGVzIGZyYW1lIGluZm8gZm9yIEZJWEZJWG9ubHkgZnJhbWUgY2xhc3MgdXNlZCBmb3IgbG93IGRlbGF5CisgdmVyc2lvbgogCiAgIFxyZXR1cm4gICBub3RoaW5nCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSBzdGF0aWMgdm9pZCBnZW5lcmF0ZUZpeEZpeE9ubHkgKCBGUkFNRV9JTkZPICpoU2JyRnJhbWVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuUG9zSW50ZXJuYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlclRpbWVTbG90cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgaW50IG5FbnYsIGksIHRyYW5JZHg7Ci0gICAgY29uc3QgaW50ICpwVGFibGU7CitzdGF0aWMgdm9pZCBnZW5lcmF0ZUZpeEZpeE9ubHkoRlJBTUVfSU5GTyAqaFNickZyYW1lSW5mbywgaW50IHRyYW5Qb3NJbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyVGltZVNsb3RzLCBjb25zdCBVSU5UIGZsYWdzKSB7CisgIGludCBuRW52LCBpLCB0cmFuSWR4OworICBjb25zdCBpbnQgKnBUYWJsZTsKIAotICAgIHN3aXRjaCAobnVtYmVyVGltZVNsb3RzKSB7Ci0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIHBUYWJsZSA9IEZES19zYnJEZWNvZGVyX2VudmVsb3BlVGFibGVfOFt0cmFuUG9zSW50ZXJuYWxdOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICBwVGFibGUgPSBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzE1W3RyYW5Qb3NJbnRlcm5hbF07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgIHBUYWJsZSA9IEZES19zYnJEZWNvZGVyX2VudmVsb3BlVGFibGVfMTZbdHJhblBvc0ludGVybmFsXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgRkRLX0FTU0VSVCgwKTsKLSAgICAgICAgICAgIC8qIGluIGNhc2UgYXNzZXJ0aW9uIGNoZWNrcyBhcmUgZGlzYWJsZWQsIGZvcmNlIGEgZGVmaW5pdGUgbWVtb3J5IGZhdWx0IGF0IGZpcnN0IGFjY2VzcyAqLwotICAgICAgICAgICAgcFRhYmxlID0gTlVMTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KKyAgc3dpdGNoIChudW1iZXJUaW1lU2xvdHMpIHsKKyAgICBjYXNlIDg6CisgICAgICBwVGFibGUgPSBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzhbdHJhblBvc0ludGVybmFsXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTU6CisgICAgICBwVGFibGUgPSBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzE1W3RyYW5Qb3NJbnRlcm5hbF07CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgMTY6CisgICAgICBwVGFibGUgPSBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzE2W3RyYW5Qb3NJbnRlcm5hbF07CisgICAgICBicmVhazsKKyAgfQogCi0gICAgLyogbG9vayBudW1iZXIgb2YgZW52ZWxvcGVzIGluIHRhYmxlICovCi0gICAgbkVudiA9IHBUYWJsZVswXTsKLSAgICAvKiBsb29rIHVwIGVudmVsb3BlIGRpc3RyaWJ1dGlvbiBpbiB0YWJsZSAqLwotICAgIGZvciAoaT0xOyBpPG5FbnY7IGkrKykKLSAgICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tpXSA9IHBUYWJsZVtpKzJdOwotICAgIC8qIG9wZW4gYW5kIGNsb3NlIGZyYW1lIGJvcmRlciAqLwotICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbMF0gICAgPSAwOwotICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbbkVudl0gPSBudW1iZXJUaW1lU2xvdHM7Ci0gICAgaFNickZyYW1lSW5mby0+bkVudmVsb3BlcyA9IG5FbnY7CisgIC8qIGxvb2sgbnVtYmVyIG9mIGVudmVsb3BlcyBpbiB0YWJsZSAqLworICBuRW52ID0gcFRhYmxlWzBdOworICAvKiBsb29rIHVwIGVudmVsb3BlIGRpc3RyaWJ1dGlvbiBpbiB0YWJsZSAqLworICBmb3IgKGkgPSAxOyBpIDwgbkVudjsgaSsrKSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2ldID0gcFRhYmxlW2kgKyAyXTsKKyAgLyogb3BlbiBhbmQgY2xvc2UgZnJhbWUgYm9yZGVyICovCisgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbMF0gPSAwOworICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnZdID0gbnVtYmVyVGltZVNsb3RzOworICBoU2JyRnJhbWVJbmZvLT5uRW52ZWxvcGVzID0gbkVudjsKIAotICAgLyogdHJhbnNpZW50IGlkeCAqLwotICAgIHRyYW5JZHggPSBoU2JyRnJhbWVJbmZvLT50cmFuRW52ID0gcFRhYmxlWzFdOworICAvKiB0cmFuc2llbnQgaWR4ICovCisgIHRyYW5JZHggPSBoU2JyRnJhbWVJbmZvLT50cmFuRW52ID0gcFRhYmxlWzFdOwogCi0gICAgLyogYWRkIG5vaXNlIGZsb29ycyAqLwotICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVswXSA9IDA7Ci0gICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1t0cmFuSWR4P3RyYW5JZHg6MV07Ci0gICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzJdID0gbnVtYmVyVGltZVNsb3RzOwotICAgIC8qIG5FbnYgaXMgYWx3YXlzID4gMSwgc28gbk5vaXNlRW52ZWxvcGVzIGlzIGFsd2F5cyAyIChJRUMgMTQ0OTYtMyA0LjYuMTkuMy4yKSAqLwotICAgIGhTYnJGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3BlcyA9IDI7CisgIC8qIGFkZCBub2lzZSBmbG9vcnMgKi8KKyAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzBdID0gMDsKKyAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0KKyAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbdHJhbklkeCA/IHRyYW5JZHggOiAxXTsKKyAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzJdID0gbnVtYmVyVGltZVNsb3RzOworICAvKiBuRW52IGlzIGFsd2F5cyA+IDEsIHNvIG5Ob2lzZUVudmVsb3BlcyBpcyBhbHdheXMgMiAoSUVDIDE0NDk2LTMgNC42LjE5LjMuMikKKyAgICovCisgIGhTYnJGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3BlcyA9IDI7CiB9CiAKIC8qIQpAQCAtOTM1LDM1NSArMTE5NCw0MzAgQEAKIAogICBccmV0dXJuIHplcm8gZm9yIGJpdHN0cmVhbSBlcnJvciwgb25lIGZvciBjb3JyZWN0LgogKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RMb3dEZWxheUdyaWQgKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsICAgICAgICAgIC8qITwgYml0YnVmZmVyIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2ZyYW1lX2RhdGEsIC8qITwgY29udGFpbnMgdGhlIEZSQU1FX0lORk8gc3RydWN0IHRvIGJlIGZpbGxlZCAqLwotICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVTbG90cwotICAgICAgICAgICAgICAgICAgICApCi17Ci0gIEZSQU1FX0lORk8gKiBwRnJhbWVJbmZvID0gJmhfZnJhbWVfZGF0YS0+ZnJhbWVJbmZvOworc3RhdGljIGludCBleHRyYWN0TG93RGVsYXlHcmlkKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsIC8qITwgYml0YnVmZmVyIGhhbmRsZSAqLworICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCisgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBCisgICAgICAgIGhfZnJhbWVfZGF0YSwgLyohPCBjb250YWlucyB0aGUgRlJBTUVfSU5GTyBzdHJ1Y3QgdG8gYmUgZmlsbGVkICovCisgICAgaW50IHRpbWVTbG90cywgY29uc3QgVUlOVCBmbGFncykgeworICBGUkFNRV9JTkZPICpwRnJhbWVJbmZvID0gJmhfZnJhbWVfZGF0YS0+ZnJhbWVJbmZvOwogICBJTlQgbnVtYmVyVGltZVNsb3RzID0gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90czsKICAgSU5UIHRlbXAgPSAwLCBrOwogCi0gICAgICAvKiBGSVhGSVhvbmx5IGZyYW1pbmcgY2FzZSAqLwotICAgICAgaF9mcmFtZV9kYXRhLT5mcmFtZUluZm8uZnJhbWVDbGFzcyA9IDA7CisgIC8qIEZJWEZJWG9ubHkgZnJhbWluZyBjYXNlICovCisgIGhfZnJhbWVfZGF0YS0+ZnJhbWVJbmZvLmZyYW1lQ2xhc3MgPSAwOwogCi0gICAgICAvKiBnZXQgdGhlIHRyYW5zaWVudCBwb3NpdGlvbiBmcm9tIHRoZSBiaXRzdHJlYW0gKi8KLSAgICAgIHN3aXRjaCAodGltZVNsb3RzKXsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgIC8qIDNiaXQgdHJhbnNpZW50IHBvc2l0aW9uICh0ZW1wPXswOy4uOzd9KSAqLwotICAgICAgICAgIHRlbXAgPSBGREtyZWFkQml0cyggaEJpdEJ1ZiwgMyk7Ci0gICAgICAgICAgYnJlYWs7CisgIC8qIGdldCB0aGUgdHJhbnNpZW50IHBvc2l0aW9uIGZyb20gdGhlIGJpdHN0cmVhbSAqLworICBzd2l0Y2ggKHRpbWVTbG90cykgeworICAgIGNhc2UgODoKKyAgICAgIC8qIDNiaXQgdHJhbnNpZW50IHBvc2l0aW9uICh0ZW1wPXswOy4uOzd9KSAqLworICAgICAgdGVtcCA9IEZES3JlYWRCaXRzKGhCaXRCdWYsIDMpOworICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAvKiA0Yml0IHRyYW5zaWVudCBwb3NpdGlvbiAodGVtcD17MDsuLjsxNX0pICovCi0gICAgICAgICAgdGVtcCA9IEZES3JlYWRCaXRzKCBoQml0QnVmLCA0KTsKLSAgICAgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgorICAgIGNhc2UgMTU6CisgICAgICAvKiA0Yml0IHRyYW5zaWVudCBwb3NpdGlvbiAodGVtcD17MDsuLjsxNX0pICovCisgICAgICB0ZW1wID0gRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgNCk7CisgICAgICBicmVhazsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiAwOwotICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgfQogCi0gICAgICAvKiBjYWxjdWxhdGUgYm9yZGVycyBhY2NvcmRpbmcgdG8gdGhlIHRyYW5zaWVudCBwb3NpdGlvbiAqLwotICAgICAgZ2VuZXJhdGVGaXhGaXhPbmx5ICggcEZyYW1lSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJUaW1lU2xvdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICApOworICAvKiBGb3IgImNhc2UgMTUiIG9ubHkqLworICBpZiAodGVtcCA+PSB0aW1lU2xvdHMpIHsKKyAgICByZXR1cm4gMDsKKyAgfQogCi0gICAgICAvKiBkZWNvZGUgZnJlcSByZXM6ICovCi0gICAgICBmb3IgKGsgPSAwOyBrIDwgcEZyYW1lSW5mby0+bkVudmVsb3BlczsgaysrKSB7Ci0gICAgICAgICAgcEZyYW1lSW5mby0+ZnJlcVJlc1trXSA9IChVQ0hBUikgRkRLcmVhZEJpdHMgKGhCaXRCdWYsIDEpOyAvKiBmID0gRiBbMSBiaXRzXSAqLyAgICAgICAgICAKLSAgICAgIH0KKyAgLyogY2FsY3VsYXRlIGJvcmRlcnMgYWNjb3JkaW5nIHRvIHRoZSB0cmFuc2llbnQgcG9zaXRpb24gKi8KKyAgZ2VuZXJhdGVGaXhGaXhPbmx5KHBGcmFtZUluZm8sIHRlbXAsIG51bWJlclRpbWVTbG90cywgZmxhZ3MpOwogCisgIC8qIGRlY29kZSBmcmVxIHJlczogKi8KKyAgZm9yIChrID0gMDsgayA8IHBGcmFtZUluZm8tPm5FbnZlbG9wZXM7IGsrKykgeworICAgIHBGcmFtZUluZm8tPmZyZXFSZXNba10gPQorICAgICAgICAoVUNIQVIpRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgMSk7IC8qIGYgPSBGIFsxIGJpdHNdICovCisgIH0KIAogICByZXR1cm4gMTsKIH0KIAogLyohCi0gIFxicmllZiAgIEV4dHJhY3QgdGhlIGZyYW1lIGluZm9ybWF0aW9uIChzdHJ1Y3R1cmUgRlJBTUVfSU5GTykgZnJvbSB0aGUgYml0c3RyZWFtCi0gIFxyZXR1cm4gIFplcm8gZm9yIGJpdHN0cmVhbSBlcnJvciwgb25lIGZvciBjb3JyZWN0LgorICBcYnJpZWYgICBFeHRyYWN0IHRoZSBQVkMgZnJhbWUgaW5mb3JtYXRpb24gKHN0cnVjdHVyZSBGUkFNRV9JTkZPKSBmcm9tIHRoZQorICBiaXRzdHJlYW0gXHJldHVybiAgWmVybyBmb3IgYml0c3RyZWFtIGVycm9yLCBvbmUgZm9yIGNvcnJlY3QuCiAqLwotaW50Ci1leHRyYWN0RnJhbWVJbmZvICggSEFORExFX0ZES19CSVRTVFJFQU0gICBoQnMsICAgICAgICAgIC8qITwgYml0YnVmZmVyIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhfZnJhbWVfZGF0YSwgLyohPCBwb2ludGVyIHRvIG1lbW9yeSB3aGVyZSB0aGUgZnJhbWUtaW5mbyB3aWxsIGJlIHN0b3JlZCAqLwotICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgbnJPZkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgZmxhZ3MKLSAgICAgICAgICAgICAgICAgKQotewotICBGUkFNRV9JTkZPICogcEZyYW1lSW5mbyA9ICZoX2ZyYW1lX2RhdGEtPmZyYW1lSW5mbzsKK2ludCBleHRyYWN0UHZjRnJhbWVJbmZvKAorICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgICAgICAgICAgIC8qITwgYml0YnVmZmVyIGhhbmRsZSAqLworICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoX2ZyYW1lX2RhdGEsIC8qITwgcG9pbnRlciB0byBtZW1vcnkgd2hlcmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtaW5mbyB3aWxsIGJlIHN0b3JlZCAqLworICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9mcmFtZV9kYXRhLCAvKiE8IHBvaW50ZXIgdG8gbWVtb3J5IHdoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcmV2aW91cyBmcmFtZS1pbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkICovCisgICAgVUNIQVIgcHZjX21vZGVfbGFzdCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUFZDIG1vZGUgb2YgbGFzdCBmcmFtZSAqLworICAgIGNvbnN0IFVJTlQgZmxhZ3MpIHsKKyAgRlJBTUVfSU5GTyAqcEZyYW1lSW5mbyA9ICZoX2ZyYW1lX2RhdGEtPmZyYW1lSW5mbzsKKyAgRlJBTUVfSU5GTyAqcFByZXZGcmFtZUluZm8gPSAmaF9wcmV2X2ZyYW1lX2RhdGEtPnByZXZGcmFtZUluZm87CisgIGludCBic192YXJfbGVuX2hmLCBic19ub2lzZV9wb3NpdGlvbjsKKyAgYnNfbm9pc2VfcG9zaXRpb24gPSBGREtyZWFkQml0cyhoQnMsIDQpOyAvKiBTQlJfUFZDX05PSVNFUE9TSVRJT05fQklUUyA0ICovCisgIGJzX3Zhcl9sZW5faGYgPSBGREtyZWFkQml0KGhCcyk7CisgIHBGcmFtZUluZm8tPm5vaXNlUG9zaXRpb24gPSBic19ub2lzZV9wb3NpdGlvbjsKKyAgcEZyYW1lSW5mby0+dHJhbkVudiA9IC0xOworCisgIC8qIEluaXQgZm9yIGJzX25vaXNlX3Bvc2l0aW9uID09IDAgaW4gY2FzZSBhIHBhcnNlIGVycm9yIGlzIGZvdW5kIGJlbG93LiAqLworICBwRnJhbWVJbmZvLT5uRW52ZWxvcGVzID0gMTsKKyAgcEZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMTsKKyAgcEZyYW1lSW5mby0+ZnJlcVJlc1swXSA9IDA7CisKKyAgaWYgKGJzX3Zhcl9sZW5faGYpIHsgLyogMSBvciAzIEJpdHMgKi8KKyAgICBwRnJhbWVJbmZvLT52YXJMZW5ndGggPSBGREtyZWFkQml0cyhoQnMsIDIpICsgMTsKKyAgICBpZiAocEZyYW1lSW5mby0+dmFyTGVuZ3RoID4gMykgeworICAgICAgcEZyYW1lSW5mby0+dmFyTGVuZ3RoID0KKyAgICAgICAgICAwOyAgICAvKiBhc3N1bWUgYnNfdmFyX2xlbl9oZiA9PSAwIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgIHJldHVybiAwOyAvKiByZXNlcnZlZCB2YWx1ZSAtPiBwYXJzZSBlcnJvciAqLworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwRnJhbWVJbmZvLT52YXJMZW5ndGggPSAwOworICB9CisKKyAgaWYgKGJzX25vaXNlX3Bvc2l0aW9uKSB7CisgICAgcEZyYW1lSW5mby0+bkVudmVsb3BlcyA9IDI7CisgICAgcEZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMjsKKyAgICBGREttZW1jbGVhcihwRnJhbWVJbmZvLT5mcmVxUmVzLCBzaXplb2YocEZyYW1lSW5mby0+ZnJlcVJlcykpOworICB9CisKKyAgLyogZnJhbWUgYm9yZGVyIGNhbGN1bGF0aW9uICovCisgIGlmIChoSGVhZGVyRGF0YS0+YnNfaW5mby5wdmNfbW9kZSA+IDApIHsKKyAgICAvKiBTZWUgIjcuNS4xLjQgSEYgYWRqdXN0bWVudCBvZiBTQlIgZW52ZWxvcGUgc2NhbGVmYWN0b3JzIiBmb3IgcmVmZXJlbmNlLgorICAgICAqLworCisgICAgRkRLX0FTU0VSVCgocEZyYW1lSW5mby0+bkVudmVsb3BlcyA9PSAxKSB8fCAocEZyYW1lSW5mby0+bkVudmVsb3BlcyA9PSAyKSk7CisKKyAgICAvKiBsZWZ0IHRpbWVib3JkZXItb2Zmc2V0OiB1c2UgdGhlIHRpbWVib3JkZXIgb2YgcHJldiBTQlIgZnJhbWUgKi8KKyAgICBpZiAocFByZXZGcmFtZUluZm8tPm5FbnZlbG9wZXMgPiAwKSB7CisgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzWzBdID0KKyAgICAgICAgICBwUHJldkZyYW1lSW5mby0+Ym9yZGVyc1twUHJldkZyYW1lSW5mby0+bkVudmVsb3Blc10gLSBQVkNfTlRJTUVTTE9UOworICAgICAgRkRLX0FTU0VSVChwRnJhbWVJbmZvLT5ib3JkZXJzWzBdIDw9IDMpOworICAgIH0gZWxzZSB7CisgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzWzBdID0gMDsKKyAgICB9CisKKyAgICAvKiByaWdodCB0aW1lYm9yZGVyLW9mZnNldDogKi8KKyAgICBwRnJhbWVJbmZvLT5ib3JkZXJzW3BGcmFtZUluZm8tPm5FbnZlbG9wZXNdID0gMTYgKyBwRnJhbWVJbmZvLT52YXJMZW5ndGg7CisKKyAgICBpZiAocEZyYW1lSW5mby0+bkVudmVsb3BlcyA9PSAyKSB7CisgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzWzFdID0gcEZyYW1lSW5mby0+bm9pc2VQb3NpdGlvbjsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGlvbiBvZiBQVkMgdGltZSBib3JkZXJzIHRfRVBWQyAqLworICAgIGlmIChwdmNfbW9kZV9sYXN0ID09IDApIHsKKyAgICAgIC8qIHRoZXJlIHdhcyBhIGxlZ2FjeSBTQlIgZnJhbWUgYmVmb3JlIHRoaXMgZnJhbWUgPT4gdXNlIGJzX3Zhcl9sZW4nIGZvcgorICAgICAgICogZmlyc3QgUFZDIHRpbWVzbG90ICovCisgICAgICBwRnJhbWVJbmZvLT5wdmNCb3JkZXJzWzBdID0gcEZyYW1lSW5mby0+Ym9yZGVyc1swXTsKKyAgICB9IGVsc2UgeworICAgICAgcEZyYW1lSW5mby0+cHZjQm9yZGVyc1swXSA9IDA7CisgICAgfQorICAgIGlmIChwRnJhbWVJbmZvLT5uRW52ZWxvcGVzID09IDIpIHsKKyAgICAgIHBGcmFtZUluZm8tPnB2Y0JvcmRlcnNbMV0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzWzFdOworICAgIH0KKyAgICBwRnJhbWVJbmZvLT5wdmNCb3JkZXJzW3BGcmFtZUluZm8tPm5FbnZlbG9wZXNdID0gMTY7CisKKyAgICAvKiBjYWxjdWxhdGlvbiBvZiBTQlIgbm9pc2UtZmxvb3IgdGltZS1ib3JkZXIgdmVjdG9yOiAqLworICAgIGZvciAoSU5UIGkgPSAwOyBpIDw9IHBGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3BlczsgaSsrKSB7CisgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbaV0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzW2ldOworICAgIH0KKworICAgIHBGcmFtZUluZm8tPnRyYW5FbnYgPSAtMTsgLyogdHJhbkVudiBub3QgdXNlZCAqLworICB9CisgIHJldHVybiAxOworfQorCisvKiEKKyAgXGJyaWVmICAgRXh0cmFjdCB0aGUgZnJhbWUgaW5mb3JtYXRpb24gKHN0cnVjdHVyZSBGUkFNRV9JTkZPKSBmcm9tIHRoZQorICBiaXRzdHJlYW0gXHJldHVybiAgWmVybyBmb3IgYml0c3RyZWFtIGVycm9yLCBvbmUgZm9yIGNvcnJlY3QuCisqLworaW50IGV4dHJhY3RGcmFtZUluZm8oCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCAgICAgICAgICAgLyohPCBiaXRidWZmZXIgaGFuZGxlICovCisgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCisgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZnJhbWVfZGF0YSwgLyohPCBwb2ludGVyIHRvIG1lbW9yeSB3aGVyZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS1pbmZvIHdpbGwgYmUgc3RvcmVkICovCisgICAgY29uc3QgVUlOVCBuck9mQ2hhbm5lbHMsIGNvbnN0IFVJTlQgZmxhZ3MpIHsKKyAgRlJBTUVfSU5GTyAqcEZyYW1lSW5mbyA9ICZoX2ZyYW1lX2RhdGEtPmZyYW1lSW5mbzsKICAgaW50IG51bWJlclRpbWVTbG90cyA9IGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHM7Ci0gIGludCBwb2ludGVyX2JpdHMgPSAwLCBuRW52ID0gMCwgYiA9IDAsIGJvcmRlciwgaSwgbiA9IDAsCi0gICAgaywgcCwgYUwsIGFSLCBuTCwgblIsCi0gICAgdGVtcCA9IDAsIHN0YXRpY0ZyZXFSZXM7CisgIGludCBwb2ludGVyX2JpdHMgPSAwLCBuRW52ID0gMCwgYiA9IDAsIGJvcmRlciwgaSwgbiA9IDAsIGssIHAsIGFMLCBhUiwgbkwsIG5SLAorICAgICAgdGVtcCA9IDAsIHN0YXRpY0ZyZXFSZXM7CiAgIFVDSEFSIGZyYW1lQ2xhc3M7CiAKICAgaWYgKGZsYWdzICYgU0JSREVDX0VMRF9HUklEKSB7Ci0gICAgICAvKiBDT0RFQ19BQUNMRCAoTEQrU0JSKSBvbmx5IHVzZXMgdGhlIG5vcm1hbCAwIEdyaWQgZm9yIG5vbi10cmFuc2llbnQgRnJhbWVzIGFuZCB0aGUgTG93RGVsYXlHcmlkIGZvciB0cmFuc2llbnQgRnJhbWVzICovCi0gICAgICBmcmFtZUNsYXNzID0gRkRLcmVhZEJpdHMgKGhCcywgMSk7IC8qIGZyYW1lQ2xhc3MgPSBbMSBiaXRdICovCi0gICAgICBpZiAoIGZyYW1lQ2xhc3MgPT0gMSApIHsKLSAgICAgICAgLyogaWYgZnJhbWVDbGFzcyA9PSAxLCBleHRyYWN0IExvd0RlbGF5U2JyR3JpZCwgb3RoZXJ3aXNlIGV4dHJhY3Qgbm9ybWFsIFNCUi1HcmlkIGZvciBGSVhJRlggKi8KLSAgICAgICAgLyogZXh0cmFjdCB0aGUgQUFDTEQtU2JyLUdyaWQgKi8KLSAgICAgICAgcEZyYW1lSW5mby0+ZnJhbWVDbGFzcyA9IGZyYW1lQ2xhc3M7Ci0gICAgICAgIGV4dHJhY3RMb3dEZWxheUdyaWQgKGhCcywgaEhlYWRlckRhdGEsIGhfZnJhbWVfZGF0YSwgbnVtYmVyVGltZVNsb3RzKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gIH0gZWxzZQotICB7Ci0gICAgZnJhbWVDbGFzcyA9IEZES3JlYWRCaXRzIChoQnMsIDIpOyAvKiBmcmFtZUNsYXNzID0gQyBbMiBiaXRzXSAqLwotICB9Ci0KLQotICBzd2l0Y2ggKGZyYW1lQ2xhc3MpIHsKLSAgY2FzZSAwOgotICAgIHRlbXAgPSBGREtyZWFkQml0cyAoaEJzLCAyKTsgICAgIC8qIEUgWzIgYml0cyBdICovCi0gICAgbkVudiA9IChpbnQpICgxIDw8IHRlbXApOyAgICAvKiBFIC0+IGUgKi8KLQotICAgIGlmICgoZmxhZ3MgJiBTQlJERUNfRUxEX0dSSUQpICYmIChuRW52ID09IDEpKQotICAgICAgaF9mcmFtZV9kYXRhLT5hbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lID0gRkRLcmVhZEJpdHMoIGhCcywgMSk7IC8qIG5ldyBFTEQgU3ludGF4IDA3LTExLTA5ICovCi0KLSAgICBzdGF0aWNGcmVxUmVzID0gRkRLcmVhZEJpdHMgKGhCcywgMSk7Ci0KLSAgICB7Ci0gICAgICBpZiAobkVudiA+IE1BWF9FTlZFTE9QRVNfSEVBQUMpCi0gICAgICAgIHJldHVybiAwOworICAgIC8qIENPREVDX0FBQ0xEIChMRCtTQlIpIG9ubHkgdXNlcyB0aGUgbm9ybWFsIDAgR3JpZCBmb3Igbm9uLXRyYW5zaWVudCBGcmFtZXMKKyAgICAgKiBhbmQgdGhlIExvd0RlbGF5R3JpZCBmb3IgdHJhbnNpZW50IEZyYW1lcyAqLworICAgIGZyYW1lQ2xhc3MgPSBGREtyZWFkQml0cyhoQnMsIDEpOyAvKiBmcmFtZUNsYXNzID0gWzEgYml0XSAqLworICAgIGlmIChmcmFtZUNsYXNzID09IDEpIHsKKyAgICAgIC8qIGlmIGZyYW1lQ2xhc3MgPT0gMSwgZXh0cmFjdCBMb3dEZWxheVNickdyaWQsIG90aGVyd2lzZSBleHRyYWN0IG5vcm1hbAorICAgICAgICogU0JSLUdyaWQgZm9yIEZJWElGWCAqLworICAgICAgLyogZXh0cmFjdCB0aGUgQUFDTEQtU2JyLUdyaWQgKi8KKyAgICAgIHBGcmFtZUluZm8tPmZyYW1lQ2xhc3MgPSBmcmFtZUNsYXNzOworICAgICAgaW50IGVyciA9IDE7CisgICAgICBlcnIgPSBleHRyYWN0TG93RGVsYXlHcmlkKGhCcywgaEhlYWRlckRhdGEsIGhfZnJhbWVfZGF0YSwgbnVtYmVyVGltZVNsb3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICByZXR1cm4gZXJyOwogICAgIH0KLQotICAgIGIgPSBuRW52ICsgMTsKLSAgICBzd2l0Y2ggKG5FbnYpIHsKLSAgICBjYXNlIDE6Ci0gICAgICBzd2l0Y2ggKG51bWJlclRpbWVTbG90cykgewotICAgICAgICBjYXNlIDE1OgotICAgICAgICAgIEZES21lbWNweSAocEZyYW1lSW5mbywgJkZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMV8xNSwgc2l6ZW9mKEZSQU1FX0lORk8pKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICBGREttZW1jcHkgKHBGcmFtZUluZm8sICZGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzFfMTYsIHNpemVvZihGUkFNRV9JTkZPKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgRkRLX0FTU0VSVCgwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHN3aXRjaCAobnVtYmVyVGltZVNsb3RzKSB7Ci0gICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgRkRLbWVtY3B5IChwRnJhbWVJbmZvLCAmRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8yXzE1LCBzaXplb2YoRlJBTUVfSU5GTykpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE2OgotICAgICAgICAgIEZES21lbWNweSAocEZyYW1lSW5mbywgJkZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMl8xNiwgc2l6ZW9mKEZSQU1FX0lORk8pKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBGREtfQVNTRVJUKDApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgc3dpdGNoIChudW1iZXJUaW1lU2xvdHMpIHsKLSAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICBGREttZW1jcHkgKHBGcmFtZUluZm8sICZGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzRfMTUsIHNpemVvZihGUkFNRV9JTkZPKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgRkRLbWVtY3B5IChwRnJhbWVJbmZvLCAmRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm80XzE2LCBzaXplb2YoRlJBTUVfSU5GTykpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIEZES19BU1NFUlQoMCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0jaWYgKE1BWF9FTlZFTE9QRVMgPj0gOCkKLSAgICAgIHN3aXRjaCAobnVtYmVyVGltZVNsb3RzKSB7Ci0gICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgRkRLbWVtY3B5IChwRnJhbWVJbmZvLCAmRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm84XzE1LCBzaXplb2YoRlJBTUVfSU5GTykpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE2OgotICAgICAgICAgIEZES21lbWNweSAocEZyYW1lSW5mbywgJkZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvOF8xNiwgc2l6ZW9mKEZSQU1FX0lORk8pKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBGREtfQVNTRVJUKDApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZWxzZQotICAgICAgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgICB9Ci0gICAgLyogQXBwbHkgY29ycmVjdCBmcmVxUmVzIChIaWdoIGlzIGRlZmF1bHQpICovCi0gICAgaWYgKCFzdGF0aWNGcmVxUmVzKSB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbkVudiA7IGkrKykKLSAgICAgICAgcEZyYW1lSW5mby0+ZnJlcVJlc1tpXSA9IDA7Ci0gICAgfQotCi0gICAgYnJlYWs7Ci0gIGNhc2UgMToKLSAgY2FzZSAyOgotICAgIHRlbXAgPSBGREtyZWFkQml0cyAoaEJzLCAyKTsgIC8qIEEgWzIgYml0c10gKi8KLQotICAgIG4gICAgPSBGREtyZWFkQml0cyAoaEJzLCAyKTsgIC8qIG4gPSBOIFsyIGJpdHNdICovCi0KLSAgICBuRW52ID0gbiArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAjIGVudmVsb3BlcyAqLwotICAgIGIgPSBuRW52ICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICMgYm9yZGVycyAgICovCi0KLSAgICBicmVhazsKKyAgfSBlbHNlIHsKKyAgICBmcmFtZUNsYXNzID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsgLyogZnJhbWVDbGFzcyA9IEMgWzIgYml0c10gKi8KICAgfQogCiAgIHN3aXRjaCAoZnJhbWVDbGFzcykgewotICBjYXNlIDE6Ci0gICAgLyogRGVjb2RlIGJvcmRlcnM6ICovCi0gICAgcEZyYW1lSW5mby0+Ym9yZGVyc1swXSA9IDA7ICAgICAgICAgICAgICAgLyogZmlyc3QgYm9yZGVyICAgICAgICAgICovCi0gICAgYm9yZGVyID0gdGVtcCArIG51bWJlclRpbWVTbG90czsgICAgICAgICAgLyogQSAtPiBhUiAgICAgICAgICAgICAgICovCi0gICAgaSA9IGItMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnJhbWUgaW5mbyBpbmRleCBmb3IgbGFzdCBib3JkZXIgKi8KLSAgICBwRnJhbWVJbmZvLT5ib3JkZXJzW2ldID0gYm9yZGVyOyAgICAgICAgICAvKiBsYXN0IGJvcmRlciAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgZm9yIChrID0gMDsgayA8IG47IGsrKykgewotICAgICAgdGVtcCA9IEZES3JlYWRCaXRzIChoQnMsIDIpOy8qIFIgWzIgYml0c10gKi8KLSAgICAgIGJvcmRlciAtPSAoMiAqIHRlbXAgKyAyKTsgICAgICAgICAgICAgICAvKiBSIC0+IHIgICAgICAgICAgICAgICAgKi8KLSAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNbLS1pXSA9IGJvcmRlcjsKLSAgICB9Ci0KLQotICAgIC8qIERlY29kZSBwb2ludGVyOiAqLwotICAgIHBvaW50ZXJfYml0cyA9IERGUkFDVF9CSVRTIC0gMSAtIENvdW50TGVhZGluZ0JpdHMoKEZJWFBfREJMKShuKzEpKTsKLSAgICBwID0gRkRLcmVhZEJpdHMgKGhCcywgcG9pbnRlcl9iaXRzKTsgICAgIC8qIHAgPSBQIFtwb2ludGVyX2JpdHMgYml0c10gKi8KLQotICAgIGlmIChwID4gbisxKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBwRnJhbWVJbmZvLT50cmFuRW52ID0gcCA/IG4gKyAyIC0gcCA6IC0xOwotCi0KLSAgICAvKiBEZWNvZGUgZnJlcSByZXM6ICovCi0gICAgZm9yIChrID0gbjsgayA+PSAwOyBrLS0pIHsKLSAgICAgIHBGcmFtZUluZm8tPmZyZXFSZXNba10gPSBGREtyZWFkQml0cyAoaEJzLCAxKTsgLyogZiA9IEYgWzEgYml0c10gKi8KLSAgICB9Ci0KLQotICAgIC8qIENhbGN1bGF0ZSBub2lzZSBmbG9vciBtaWRkbGUgYm9yZGVyOiAqLwotICAgIGlmIChwID09IDAgfHwgcCA9PSAxKQotICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gcEZyYW1lSW5mby0+Ym9yZGVyc1tuXTsKLSAgICBlbHNlCi0gICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzW3BGcmFtZUluZm8tPnRyYW5FbnZdOwotCi0gICAgYnJlYWs7Ci0KLSAgY2FzZSAyOgotICAgIC8qIERlY29kZSBib3JkZXJzOiAqLwotICAgIGJvcmRlciA9IHRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEgLT4gYUwgKi8KLSAgICBwRnJhbWVJbmZvLT5ib3JkZXJzWzBdID0gYm9yZGVyOyAgICAgICAgICAvKiBmaXJzdCBib3JkZXIgKi8KLQotICAgIGZvciAoayA9IDE7IGsgPD0gbjsgaysrKSB7Ci0gICAgICB0ZW1wID0gRkRLcmVhZEJpdHMgKGhCcywgMik7LyogUiBbMiBiaXRzXSAqLwotICAgICAgYm9yZGVyICs9ICgyICogdGVtcCArIDIpOyAgICAgICAgICAgICAgIC8qIFIgLT4gciAgICAgICAgICAgICAgICAqLwotICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc1trXSA9IGJvcmRlcjsKLSAgICB9Ci0gICAgcEZyYW1lSW5mby0+Ym9yZGVyc1trXSA9IG51bWJlclRpbWVTbG90czsgLyogbGFzdCBib3JkZXIgKi8KLQotCi0gICAgLyogRGVjb2RlIHBvaW50ZXI6ICovCi0gICAgcG9pbnRlcl9iaXRzID0gREZSQUNUX0JJVFMgLSAxIC0gQ291bnRMZWFkaW5nQml0cygoRklYUF9EQkwpKG4rMSkpOwotICAgIHAgPSBGREtyZWFkQml0cyAoaEJzLCBwb2ludGVyX2JpdHMpOyAgICAgLyogcCA9IFAgW3BvaW50ZXJfYml0cyBiaXRzXSAqLwotICAgIGlmIChwID4gbisxKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAocCA9PSAwIHx8IHAgPT0gMSkKLSAgICAgIHBGcmFtZUluZm8tPnRyYW5FbnYgPSAtMTsKLSAgICBlbHNlCi0gICAgICBwRnJhbWVJbmZvLT50cmFuRW52ID0gcCAtIDE7Ci0KLQotCi0gICAgLyogRGVjb2RlIGZyZXEgcmVzOiAqLwotICAgIGZvciAoayA9IDA7IGsgPD0gbjsgaysrKSB7Ci0gICAgICBwRnJhbWVJbmZvLT5mcmVxUmVzW2tdID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsgLyogZiA9IEYgWzEgYml0c10gKi8KLSAgICB9Ci0KLQotCi0gICAgLyogQ2FsY3VsYXRlIG5vaXNlIGZsb29yIG1pZGRsZSBib3JkZXI6ICovCi0gICAgc3dpdGNoIChwKSB7CiAgICAgY2FzZSAwOgotICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gcEZyYW1lSW5mby0+Ym9yZGVyc1sxXTsKKyAgICAgIHRlbXAgPSBGREtyZWFkQml0cyhoQnMsIDIpOyAvKiBFIFsyIGJpdHMgXSAqLworICAgICAgbkVudiA9IChpbnQpKDEgPDwgdGVtcCk7ICAgIC8qIEUgLT4gZSAqLworCisgICAgICBpZiAoKGZsYWdzICYgU0JSREVDX0VMRF9HUklEKSAmJiAobkVudiA9PSAxKSkKKyAgICAgICAgaF9mcmFtZV9kYXRhLT5hbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lID0KKyAgICAgICAgICAgIEZES3JlYWRCaXRzKGhCcywgMSk7IC8qIG5ldyBFTEQgU3ludGF4IDA3LTExLTA5ICovCisKKyAgICAgIHN0YXRpY0ZyZXFSZXMgPSBGREtyZWFkQml0cyhoQnMsIDEpOworCisgICAgICBpZiAoZmxhZ3MgJiAoU0JSREVDX1NZTlRBWF9VU0FDIHwgU0JSREVDX1NZTlRBWF9SU1ZENTApKSB7CisgICAgICAgIGlmIChuRW52ID4gTUFYX0VOVkVMT1BFU19VU0FDKSByZXR1cm4gMDsKKyAgICAgIH0gZWxzZQorCisgICAgICAgIGIgPSBuRW52ICsgMTsKKyAgICAgIHN3aXRjaCAobkVudikgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgc3dpdGNoIChudW1iZXJUaW1lU2xvdHMpIHsKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgIEZES21lbWNweShwRnJhbWVJbmZvLCAmRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8xXzE1LAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZSQU1FX0lORk8pKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICBGREttZW1jcHkocEZyYW1lSW5mbywgJkZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMV8xNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGUkFNRV9JTkZPKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBzd2l0Y2ggKG51bWJlclRpbWVTbG90cykgeworICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgRkRLbWVtY3B5KHBGcmFtZUluZm8sICZGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzJfMTUsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRlJBTUVfSU5GTykpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgIEZES21lbWNweShwRnJhbWVJbmZvLCAmRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8yXzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZSQU1FX0lORk8pKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBGREtfQVNTRVJUKDApOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgIHN3aXRjaCAobnVtYmVyVGltZVNsb3RzKSB7CisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICBGREttZW1jcHkocEZyYW1lSW5mbywgJkZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvNF8xNSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGUkFNRV9JTkZPKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgRkRLbWVtY3B5KHBGcmFtZUluZm8sICZGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzRfMTYsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRlJBTUVfSU5GTykpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg6CisjaWYgKE1BWF9FTlZFTE9QRVMgPj0gOCkKKyAgICAgICAgICBzd2l0Y2ggKG51bWJlclRpbWVTbG90cykgeworICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgRkRLbWVtY3B5KHBGcmFtZUluZm8sICZGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzhfMTUsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRlJBTUVfSU5GTykpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgIEZES21lbWNweShwRnJhbWVJbmZvLCAmRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm84XzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZSQU1FX0lORk8pKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBGREtfQVNTRVJUKDApOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyNlbHNlCisgICAgICAgICAgcmV0dXJuIDA7CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIC8qIEFwcGx5IGNvcnJlY3QgZnJlcVJlcyAoSGlnaCBpcyBkZWZhdWx0KSAqLworICAgICAgaWYgKCFzdGF0aWNGcmVxUmVzKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuRW52OyBpKyspIHBGcmFtZUluZm8tPmZyZXFSZXNbaV0gPSAwOworICAgICAgfQorCiAgICAgICBicmVhazsKICAgICBjYXNlIDE6Ci0gICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzW25dOworICAgIGNhc2UgMjoKKyAgICAgIHRlbXAgPSBGREtyZWFkQml0cyhoQnMsIDIpOyAvKiBBIFsyIGJpdHNdICovCisKKyAgICAgIG4gPSBGREtyZWFkQml0cyhoQnMsIDIpOyAvKiBuID0gTiBbMiBiaXRzXSAqLworCisgICAgICBuRW52ID0gbiArIDE7IC8qICMgZW52ZWxvcGVzICovCisgICAgICBiID0gbkVudiArIDE7IC8qICMgYm9yZGVycyAgICovCisKICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzW3BGcmFtZUluZm8tPnRyYW5FbnZdOwotICAgICAgYnJlYWs7Ci0gICAgfQorICB9CiAKLSAgICBicmVhazsKKyAgc3dpdGNoIChmcmFtZUNsYXNzKSB7CisgICAgY2FzZSAxOgorICAgICAgLyogRGVjb2RlIGJvcmRlcnM6ICovCisgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzWzBdID0gMDsgICAgICAvKiBmaXJzdCBib3JkZXIgICAgICAgICAgKi8KKyAgICAgIGJvcmRlciA9IHRlbXAgKyBudW1iZXJUaW1lU2xvdHM7IC8qIEEgLT4gYVIgICAgICAgICAgICAgICAqLworICAgICAgaSA9IGIgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgLyogZnJhbWUgaW5mbyBpbmRleCBmb3IgbGFzdCBib3JkZXIgKi8KKyAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNbaV0gPSBib3JkZXI7IC8qIGxhc3QgYm9yZGVyICAgICAgICAgICAgICAgICAgICAgICovCiAKLSAgY2FzZSAzOgotICAgIC8qIHZfY3RybFNpZ25hbCA9IFtmcmFtZUNsYXNzLGFMLGFSLG5MLG5SLHZfckwsdl9yUixwLHZfZkxSXTsgKi8KKyAgICAgIGZvciAoayA9IDA7IGsgPCBuOyBrKyspIHsKKyAgICAgICAgdGVtcCA9IEZES3JlYWRCaXRzKGhCcywgMik7IC8qIFIgWzIgYml0c10gKi8KKyAgICAgICAgYm9yZGVyIC09ICgyICogdGVtcCArIDIpOyAgIC8qIFIgLT4gciAgICAgICAgICAgICAgICAqLworICAgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzWy0taV0gPSBib3JkZXI7CisgICAgICB9CiAKLSAgICBhTCA9IEZES3JlYWRCaXRzIChoQnMsIDIpOyAgICAgICAvKiBBTCBbMiBiaXRzXSwgQUwgLT4gYUwgKi8KKyAgICAgIC8qIERlY29kZSBwb2ludGVyOiAqLworICAgICAgcG9pbnRlcl9iaXRzID0gREZSQUNUX0JJVFMgLSAxIC0gQ291bnRMZWFkaW5nQml0cygoRklYUF9EQkwpKG4gKyAxKSk7CisgICAgICBwID0gRkRLcmVhZEJpdHMoaEJzLCBwb2ludGVyX2JpdHMpOyAvKiBwID0gUCBbcG9pbnRlcl9iaXRzIGJpdHNdICovCiAKLSAgICBhUiA9IEZES3JlYWRCaXRzIChoQnMsIDIpICsgbnVtYmVyVGltZVNsb3RzOyAgICAgLyogQVIgWzIgYml0c10sIEFSIC0+IGFSICovCisgICAgICBpZiAocCA+IG4gKyAxKSByZXR1cm4gMDsKIAotICAgIG5MID0gRkRLcmVhZEJpdHMgKGhCcywgMik7ICAgICAgIC8qIG5MID0gTkwgWzIgYml0c10gKi8KKyAgICAgIHBGcmFtZUluZm8tPnRyYW5FbnYgPSBwID8gbiArIDIgLSBwIDogLTE7CiAKLSAgICBuUiA9IEZES3JlYWRCaXRzIChoQnMsIDIpOyAgICAgICAvKiBuUiA9IE5SIFsyIGJpdHNdICovCisgICAgICAvKiBEZWNvZGUgZnJlcSByZXM6ICovCisgICAgICBmb3IgKGsgPSBuOyBrID49IDA7IGstLSkgeworICAgICAgICBwRnJhbWVJbmZvLT5mcmVxUmVzW2tdID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsgLyogZiA9IEYgWzEgYml0c10gKi8KKyAgICAgIH0KIAotCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIENhbGN1bGF0ZSBoZWxwIHZhcmlhYmxlcwotICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgLyogZ2VuZXJhbDogKi8KLSAgICBuRW52ID0gbkwgKyBuUiArIDE7ICAgICAgICAgICAgLyogIyBlbnZlbG9wZXMgKi8KLSAgICBpZiAobkVudiA+IE1BWF9FTlZFTE9QRVMpCi0gICAgICByZXR1cm4gMDsKLSAgICBiID0gbkVudiArIDE7ICAgICAgICAgICAgICAgICAgLyogIyBib3JkZXJzICAgKi8KLQotCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIERlY29kZSBlbnZlbG9wZXMKLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0gICAgLyogTC1ib3JkZXJzOiAgICovCi0gICAgYm9yZGVyICAgICAgICAgICAgPSBhTDsgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgYm9yZGVyICovCi0gICAgcEZyYW1lSW5mby0+Ym9yZGVyc1swXSA9IGJvcmRlcjsKLQotICAgIGZvciAoayA9IDE7IGsgPD0gbkw7IGsrKykgewotICAgICAgdGVtcCA9IEZES3JlYWRCaXRzIChoQnMsIDIpOy8qIFIgWzIgYml0c10gKi8KLSAgICAgIGJvcmRlciArPSAoMiAqIHRlbXAgKyAyKTsgICAgICAgICAgICAgICAvKiBSIC0+IHIgICAgICAgICAgICAgICAgKi8KLSAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNba10gPSBib3JkZXI7Ci0gICAgfQotCi0KLSAgICAvKiBSLWJvcmRlcnM6ICAqLwotICAgIGJvcmRlciA9IGFSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxhc3QgYm9yZGVyICovCi0gICAgaSAgICAgID0gbkVudjsKLQotICAgIHBGcmFtZUluZm8tPmJvcmRlcnNbaV0gPSBib3JkZXI7Ci0KLSAgICBmb3IgKGsgPSAwOyBrIDwgblI7IGsrKykgewotICAgICAgdGVtcCA9IEZES3JlYWRCaXRzIChoQnMsIDIpOy8qIFIgWzIgYml0c10gKi8KLSAgICAgIGJvcmRlciAtPSAoMiAqIHRlbXAgKyAyKTsgICAgICAgICAgICAgICAvKiBSIC0+IHIgICAgICAgICAgICAgICAgKi8KLSAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNbLS1pXSA9IGJvcmRlcjsKLSAgICB9Ci0KLQotICAgIC8qIGRlY29kZSBwb2ludGVyOiAqLwotICAgIHBvaW50ZXJfYml0cyA9IERGUkFDVF9CSVRTIC0gMSAtIENvdW50TGVhZGluZ0JpdHMoKEZJWFBfREJMKShuTCtuUisxKSk7Ci0gICAgcCA9IEZES3JlYWRCaXRzIChoQnMsIHBvaW50ZXJfYml0cyk7ICAgICAvKiBwID0gUCBbcG9pbnRlcl9iaXRzIGJpdHNdICovCi0KLSAgICBpZiAocCA+IG5MK25SKzEpCi0gICAgICByZXR1cm4gMDsKLQotICAgIHBGcmFtZUluZm8tPnRyYW5FbnYgPSBwID8gYiAtIHAgOiAtMTsKLQotCi0KLSAgICAvKiBkZWNvZGUgZnJlcSByZXM6ICovCi0gICAgZm9yIChrID0gMDsgayA8IG5FbnY7IGsrKykgewotICAgICAgcEZyYW1lSW5mby0+ZnJlcVJlc1trXSA9IEZES3JlYWRCaXRzKGhCcywgMSk7IC8qIGYgPSBGIFsxIGJpdHNdICovCi0gICAgfQotCi0KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgRGVjb2RlIG5vaXNlIGZsb29ycwotICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVswXSA9IGFMOwotCi0gICAgaWYgKG5FbnYgPT0gMSkgewotICAgICAgLyogMSBub2lzZSBmbG9vciBlbnZlbG9wZTogKi8KLSAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IGFSOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8qIDIgbm9pc2UgZmxvb3IgZW52ZWxvcGVzICovCisgICAgICAvKiBDYWxjdWxhdGUgbm9pc2UgZmxvb3IgbWlkZGxlIGJvcmRlcjogKi8KICAgICAgIGlmIChwID09IDAgfHwgcCA9PSAxKQotICAgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzW25FbnYgLSAxXTsKKyAgICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gcEZyYW1lSW5mby0+Ym9yZGVyc1tuXTsKICAgICAgIGVsc2UKICAgICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gcEZyYW1lSW5mby0+Ym9yZGVyc1twRnJhbWVJbmZvLT50cmFuRW52XTsKLSAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsyXSA9IGFSOwotICAgIH0KLSAgICBicmVhazsKLSAgfQogCisgICAgICBicmVhazsKKworICAgIGNhc2UgMjoKKyAgICAgIC8qIERlY29kZSBib3JkZXJzOiAqLworICAgICAgYm9yZGVyID0gdGVtcDsgICAgICAgICAgICAgICAgICAgLyogQSAtPiBhTCAqLworICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc1swXSA9IGJvcmRlcjsgLyogZmlyc3QgYm9yZGVyICovCisKKyAgICAgIGZvciAoayA9IDE7IGsgPD0gbjsgaysrKSB7CisgICAgICAgIHRlbXAgPSBGREtyZWFkQml0cyhoQnMsIDIpOyAvKiBSIFsyIGJpdHNdICovCisgICAgICAgIGJvcmRlciArPSAoMiAqIHRlbXAgKyAyKTsgICAvKiBSIC0+IHIgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc1trXSA9IGJvcmRlcjsKKyAgICAgIH0KKyAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNba10gPSBudW1iZXJUaW1lU2xvdHM7IC8qIGxhc3QgYm9yZGVyICovCisKKyAgICAgIC8qIERlY29kZSBwb2ludGVyOiAqLworICAgICAgcG9pbnRlcl9iaXRzID0gREZSQUNUX0JJVFMgLSAxIC0gQ291bnRMZWFkaW5nQml0cygoRklYUF9EQkwpKG4gKyAxKSk7CisgICAgICBwID0gRkRLcmVhZEJpdHMoaEJzLCBwb2ludGVyX2JpdHMpOyAvKiBwID0gUCBbcG9pbnRlcl9iaXRzIGJpdHNdICovCisgICAgICBpZiAocCA+IG4gKyAxKSByZXR1cm4gMDsKKworICAgICAgaWYgKHAgPT0gMCB8fCBwID09IDEpCisgICAgICAgIHBGcmFtZUluZm8tPnRyYW5FbnYgPSAtMTsKKyAgICAgIGVsc2UKKyAgICAgICAgcEZyYW1lSW5mby0+dHJhbkVudiA9IHAgLSAxOworCisgICAgICAvKiBEZWNvZGUgZnJlcSByZXM6ICovCisgICAgICBmb3IgKGsgPSAwOyBrIDw9IG47IGsrKykgeworICAgICAgICBwRnJhbWVJbmZvLT5mcmVxUmVzW2tdID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsgLyogZiA9IEYgWzEgYml0c10gKi8KKyAgICAgIH0KKworICAgICAgLyogQ2FsY3VsYXRlIG5vaXNlIGZsb29yIG1pZGRsZSBib3JkZXI6ICovCisgICAgICBzd2l0Y2ggKHApIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IHBGcmFtZUluZm8tPmJvcmRlcnNbMV07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzW25dOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9CisgICAgICAgICAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNbcEZyYW1lSW5mby0+dHJhbkVudl07CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAzOgorICAgICAgLyogdl9jdHJsU2lnbmFsID0gW2ZyYW1lQ2xhc3MsYUwsYVIsbkwsblIsdl9yTCx2X3JSLHAsdl9mTFJdOyAqLworCisgICAgICBhTCA9IEZES3JlYWRCaXRzKGhCcywgMik7IC8qIEFMIFsyIGJpdHNdLCBBTCAtPiBhTCAqLworCisgICAgICBhUiA9IEZES3JlYWRCaXRzKGhCcywgMikgKyBudW1iZXJUaW1lU2xvdHM7IC8qIEFSIFsyIGJpdHNdLCBBUiAtPiBhUiAqLworCisgICAgICBuTCA9IEZES3JlYWRCaXRzKGhCcywgMik7IC8qIG5MID0gTkwgWzIgYml0c10gKi8KKworICAgICAgblIgPSBGREtyZWFkQml0cyhoQnMsIDIpOyAvKiBuUiA9IE5SIFsyIGJpdHNdICovCisKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBDYWxjdWxhdGUgaGVscCB2YXJpYWJsZXMKKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgICAvKiBnZW5lcmFsOiAqLworICAgICAgbkVudiA9IG5MICsgblIgKyAxOyAvKiAjIGVudmVsb3BlcyAqLworICAgICAgaWYgKG5FbnYgPiBNQVhfRU5WRUxPUEVTKSByZXR1cm4gMDsKKyAgICAgIGIgPSBuRW52ICsgMTsgLyogIyBib3JkZXJzICAgKi8KKworICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIERlY29kZSBlbnZlbG9wZXMKKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgICAvKiBMLWJvcmRlcnM6ICAgKi8KKyAgICAgIGJvcmRlciA9IGFMOyAvKiBmaXJzdCBib3JkZXIgKi8KKyAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNbMF0gPSBib3JkZXI7CisKKyAgICAgIGZvciAoayA9IDE7IGsgPD0gbkw7IGsrKykgeworICAgICAgICB0ZW1wID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsgLyogUiBbMiBiaXRzXSAqLworICAgICAgICBib3JkZXIgKz0gKDIgKiB0ZW1wICsgMik7ICAgLyogUiAtPiByICAgICAgICAgICAgICAgICovCisgICAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNba10gPSBib3JkZXI7CisgICAgICB9CisKKyAgICAgIC8qIFItYm9yZGVyczogICovCisgICAgICBib3JkZXIgPSBhUjsgLyogbGFzdCBib3JkZXIgKi8KKyAgICAgIGkgPSBuRW52OworCisgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzW2ldID0gYm9yZGVyOworCisgICAgICBmb3IgKGsgPSAwOyBrIDwgblI7IGsrKykgeworICAgICAgICB0ZW1wID0gRkRLcmVhZEJpdHMoaEJzLCAyKTsgLyogUiBbMiBiaXRzXSAqLworICAgICAgICBib3JkZXIgLT0gKDIgKiB0ZW1wICsgMik7ICAgLyogUiAtPiByICAgICAgICAgICAgICAgICovCisgICAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNbLS1pXSA9IGJvcmRlcjsKKyAgICAgIH0KKworICAgICAgLyogZGVjb2RlIHBvaW50ZXI6ICovCisgICAgICBwb2ludGVyX2JpdHMgPQorICAgICAgICAgIERGUkFDVF9CSVRTIC0gMSAtIENvdW50TGVhZGluZ0JpdHMoKEZJWFBfREJMKShuTCArIG5SICsgMSkpOworICAgICAgcCA9IEZES3JlYWRCaXRzKGhCcywgcG9pbnRlcl9iaXRzKTsgLyogcCA9IFAgW3BvaW50ZXJfYml0cyBiaXRzXSAqLworCisgICAgICBpZiAocCA+IG5MICsgblIgKyAxKSByZXR1cm4gMDsKKworICAgICAgcEZyYW1lSW5mby0+dHJhbkVudiA9IHAgPyBiIC0gcCA6IC0xOworCisgICAgICAvKiBkZWNvZGUgZnJlcSByZXM6ICovCisgICAgICBmb3IgKGsgPSAwOyBrIDwgbkVudjsgaysrKSB7CisgICAgICAgIHBGcmFtZUluZm8tPmZyZXFSZXNba10gPSBGREtyZWFkQml0cyhoQnMsIDEpOyAvKiBmID0gRiBbMSBiaXRzXSAqLworICAgICAgfQorCisgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgRGVjb2RlIG5vaXNlIGZsb29ycworICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMF0gPSBhTDsKKworICAgICAgaWYgKG5FbnYgPT0gMSkgeworICAgICAgICAvKiAxIG5vaXNlIGZsb29yIGVudmVsb3BlOiAqLworICAgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBhUjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIDIgbm9pc2UgZmxvb3IgZW52ZWxvcGVzICovCisgICAgICAgIGlmIChwID09IDAgfHwgcCA9PSAxKQorICAgICAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IHBGcmFtZUluZm8tPmJvcmRlcnNbbkVudiAtIDFdOworICAgICAgICBlbHNlCisgICAgICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0KKyAgICAgICAgICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc1twRnJhbWVJbmZvLT50cmFuRW52XTsKKyAgICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzJdID0gYVI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQogCiAgIC8qCiAgICAgU3RvcmUgbnVtYmVyIG9mIGVudmVsb3Blcywgbm9pc2UgZmxvb3IgZW52ZWxvcGVzIGFuZCBmcmFtZSBjbGFzcwpAQCAtMTMwMCwyNSArMTYzNCwyNCBAQAogICBpZiAocEZyYW1lSW5mby0+ZnJhbWVDbGFzcyA9PSAyIHx8IHBGcmFtZUluZm8tPmZyYW1lQ2xhc3MgPT0gMSkgewogICAgIC8qIGNhbGN1bGF0ZSBub2lzZSBmbG9vciBmaXJzdCBhbmQgbGFzdCBib3JkZXJzOiAqLwogICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVswXSA9IHBGcmFtZUluZm8tPmJvcmRlcnNbMF07Ci0gICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlW3BGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3Blc10gPSBwRnJhbWVJbmZvLT5ib3JkZXJzW25FbnZdOworICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVtwRnJhbWVJbmZvLT5uTm9pc2VFbnZlbG9wZXNdID0KKyAgICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc1tuRW52XTsKICAgfQogCi0KICAgcmV0dXJuIDE7CiB9CiAKLQogLyohCiAgIFxicmllZiAgIENoZWNrIGlmIHRoZSBmcmFtZUluZm8gdmVjdG9yIGhhcyByZWFzb25hYmxlIHZhbHVlcy4KICAgXHJldHVybiAgWmVybyBmb3IgZXJyb3IsIG9uZSBmb3IgY29ycmVjdAogKi8KLXN0YXRpYyBpbnQKLWNoZWNrRnJhbWVJbmZvIChGUkFNRV9JTkZPICogcEZyYW1lSW5mbywgLyohPCBwb2ludGVyIHRvIGZyYW1lSW5mbyAqLwotICAgICAgICAgICAgICAgIGludCBudW1iZXJPZlRpbWVTbG90cywgICAvKiE8IFFNRiB0aW1lIHNsb3RzIHBlciBmcmFtZSAqLwotICAgICAgICAgICAgICAgIGludCBvdmVybGFwLCAgICAgICAgICAgICAvKiE8IEFtb3VudCBvZiBvdmVybGFwIFFNRiB0aW1lIHNsb3RzICovCi0gICAgICAgICAgICAgICAgaW50IHRpbWVTdGVwKSAgICAgICAgICAgIC8qITwgUU1GIHNsb3RzIHRvIFNCUiBzbG90cyBzdGVwIGZhY3RvciAqLworc3RhdGljIGludCBjaGVja0ZyYW1lSW5mbygKKyAgICBGUkFNRV9JTkZPICpwRnJhbWVJbmZvLCAvKiE8IHBvaW50ZXIgdG8gZnJhbWVJbmZvICovCisgICAgaW50IG51bWJlck9mVGltZVNsb3RzLCAgLyohPCBRTUYgdGltZSBzbG90cyBwZXIgZnJhbWUgKi8KKyAgICBpbnQgb3ZlcmxhcCwgICAgICAgICAgICAvKiE8IEFtb3VudCBvZiBvdmVybGFwIFFNRiB0aW1lIHNsb3RzICovCisgICAgaW50IHRpbWVTdGVwKSAgICAgICAgICAgLyohPCBRTUYgc2xvdHMgdG8gU0JSIHNsb3RzIHN0ZXAgZmFjdG9yICovCiB7Ci0gIGludCBtYXhQb3MsaSxqOworICBpbnQgbWF4UG9zLCBpLCBqOwogICBpbnQgc3RhcnRQb3M7CiAgIGludCBzdG9wUG9zOwogICBpbnQgdHJhbkVudjsKQEAgLTEzMjcsNzEgKzE2NjAsNjUgQEAKICAgaW50IG5FbnZlbG9wZXMgPSBwRnJhbWVJbmZvLT5uRW52ZWxvcGVzOwogICBpbnQgbk5vaXNlRW52ZWxvcGVzID0gcEZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzOwogCi0gIGlmKG5FbnZlbG9wZXMgPCAxIHx8IG5FbnZlbG9wZXMgPiBNQVhfRU5WRUxPUEVTKQotICAgIHJldHVybiAwOworICBpZiAobkVudmVsb3BlcyA8IDEgfHwgbkVudmVsb3BlcyA+IE1BWF9FTlZFTE9QRVMpIHJldHVybiAwOwogCi0gIGlmKG5Ob2lzZUVudmVsb3BlcyA+IE1BWF9OT0lTRV9FTlZFTE9QRVMpCi0gICAgcmV0dXJuIDA7CisgIGlmIChuTm9pc2VFbnZlbG9wZXMgPiBNQVhfTk9JU0VfRU5WRUxPUEVTKSByZXR1cm4gMDsKIAotICBzdGFydFBvcyAgICAgICAgPSBwRnJhbWVJbmZvLT5ib3JkZXJzWzBdOwotICBzdG9wUG9zICAgICAgICAgPSBwRnJhbWVJbmZvLT5ib3JkZXJzW25FbnZlbG9wZXNdOwotICB0cmFuRW52ICAgICAgICAgPSBwRnJhbWVJbmZvLT50cmFuRW52OwotICBzdGFydFBvc05vaXNlICAgPSBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMF07Ci0gIHN0b3BQb3NOb2lzZSAgICA9IHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVtuTm9pc2VFbnZlbG9wZXNdOworICBzdGFydFBvcyA9IHBGcmFtZUluZm8tPmJvcmRlcnNbMF07CisgIHN0b3BQb3MgPSBwRnJhbWVJbmZvLT5ib3JkZXJzW25FbnZlbG9wZXNdOworICB0cmFuRW52ID0gcEZyYW1lSW5mby0+dHJhbkVudjsKKyAgc3RhcnRQb3NOb2lzZSA9IHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVswXTsKKyAgc3RvcFBvc05vaXNlID0gcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlW25Ob2lzZUVudmVsb3Blc107CiAKLSAgaWYgKG92ZXJsYXAgPCAwIHx8IG92ZXJsYXAgPiAoNikpIHsKKyAgaWYgKG92ZXJsYXAgPCAwIHx8IG92ZXJsYXAgPiAoMyAqICg0KSkpIHsKICAgICByZXR1cm4gMDsKICAgfQotICBpZiAodGltZVN0ZXAgPCAxIHx8IHRpbWVTdGVwID4gMikgeworICBpZiAodGltZVN0ZXAgPCAxIHx8IHRpbWVTdGVwID4gKDQpKSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KLSAgbWF4UG9zID0gbnVtYmVyT2ZUaW1lU2xvdHMgKyAob3ZlcmxhcC90aW1lU3RlcCk7CisgIG1heFBvcyA9IG51bWJlck9mVGltZVNsb3RzICsgKG92ZXJsYXAgLyB0aW1lU3RlcCk7CiAKLSAgLyogQ2hlY2sgdGhhdCB0aGUgc3RhcnQgYW5kIHN0b3AgcG9zaXRpb25zIG9mIHRoZSBmcmFtZSBhcmUgcmVhc29uYWJsZSB2YWx1ZXMuICovCi0gIGlmKCAoc3RhcnRQb3MgPCAwKSB8fCAoc3RhcnRQb3MgPj0gc3RvcFBvcykgKQorICAvKiBDaGVjayB0aGF0IHRoZSBzdGFydCBhbmQgc3RvcCBwb3NpdGlvbnMgb2YgdGhlIGZyYW1lIGFyZSByZWFzb25hYmxlIHZhbHVlcy4KKyAgICovCisgIGlmICgoc3RhcnRQb3MgPCAwKSB8fCAoc3RhcnRQb3MgPj0gc3RvcFBvcykpIHJldHVybiAwOworICBpZiAoc3RhcnRQb3MgPiBtYXhQb3MgLSBudW1iZXJPZlRpbWVTbG90cykgLyogRmlyc3QgZW52LiBtdXN0IHN0YXJ0IGluIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RseSBhZnRlciB0aGUgb3ZlcmxhcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyICovCiAgICAgcmV0dXJuIDA7Ci0gIGlmKCBzdGFydFBvcyA+IG1heFBvcy1udW1iZXJPZlRpbWVTbG90cyApIC8qIEZpcnN0IGVudi4gbXVzdCBzdGFydCBpbiBvciBkaXJlY3RseSBhZnRlciB0aGUgb3ZlcmxhcCBidWZmZXIgKi8KKyAgaWYgKHN0b3BQb3MgPCBudW1iZXJPZlRpbWVTbG90cykgLyogT25lIGNvbXBsZXRlIGZyYW1lIG11c3QgYmUgcmVhZHkgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBhZnRlciBwcm9jZXNzaW5nICovCiAgICAgcmV0dXJuIDA7Ci0gIGlmKCBzdG9wUG9zIDwgbnVtYmVyT2ZUaW1lU2xvdHMgKSAvKiBPbmUgY29tcGxldGUgZnJhbWUgbXVzdCBiZSByZWFkeSBmb3Igb3V0cHV0IGFmdGVyIHByb2Nlc3NpbmcgKi8KLSAgICByZXR1cm4gMDsKLSAgaWYoc3RvcFBvcyA+IG1heFBvcykKLSAgICByZXR1cm4gMDsKKyAgaWYgKHN0b3BQb3MgPiBtYXhQb3MpIHJldHVybiAwOwogCi0gIC8qIENoZWNrIHRoYXQgdGhlICBzdGFydCBib3JkZXIgZm9yIGV2ZXJ5IGVudmVsb3BlIGlzIHN0cmljdGx5IGxhdGVyIGluIHRpbWUgKi8KLSAgZm9yKGk9MDtpPG5FbnZlbG9wZXM7aSsrKSB7Ci0gICAgaWYocEZyYW1lSW5mby0+Ym9yZGVyc1tpXSA+PSBwRnJhbWVJbmZvLT5ib3JkZXJzW2krMV0pCi0gICAgICByZXR1cm4gMDsKKyAgLyogQ2hlY2sgdGhhdCB0aGUgIHN0YXJ0IGJvcmRlciBmb3IgZXZlcnkgZW52ZWxvcGUgaXMgc3RyaWN0bHkgbGF0ZXIgaW4gdGltZQorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IG5FbnZlbG9wZXM7IGkrKykgeworICAgIGlmIChwRnJhbWVJbmZvLT5ib3JkZXJzW2ldID49IHBGcmFtZUluZm8tPmJvcmRlcnNbaSArIDFdKSByZXR1cm4gMDsKICAgfQogCiAgIC8qIENoZWNrIHRoYXQgdGhlIGVudmVsb3BlIHRvIGJlIHNob3J0ZW5lZCBpcyBhY3R1YWxseSBhbW9uZyB0aGUgZW52ZWxvcGVzICovCi0gIGlmKHRyYW5FbnY+bkVudmVsb3BlcykKLSAgICByZXR1cm4gMDsKLQorICBpZiAodHJhbkVudiA+IG5FbnZlbG9wZXMpIHJldHVybiAwOwogCiAgIC8qIENoZWNrIHRoZSBub2lzZSBib3JkZXJzICovCi0gIGlmKG5FbnZlbG9wZXM9PTEgJiYgbk5vaXNlRW52ZWxvcGVzPjEpCi0gICAgcmV0dXJuIDA7CisgIGlmIChuRW52ZWxvcGVzID09IDEgJiYgbk5vaXNlRW52ZWxvcGVzID4gMSkgcmV0dXJuIDA7CiAKLSAgaWYoc3RhcnRQb3MgIT0gc3RhcnRQb3NOb2lzZSB8fCBzdG9wUG9zICE9IHN0b3BQb3NOb2lzZSkKLSAgICByZXR1cm4gMDsKKyAgaWYgKHN0YXJ0UG9zICE9IHN0YXJ0UG9zTm9pc2UgfHwgc3RvcFBvcyAhPSBzdG9wUG9zTm9pc2UpIHJldHVybiAwOwogCi0KLSAgLyogQ2hlY2sgdGhhdCB0aGUgIHN0YXJ0IGJvcmRlciBmb3IgZXZlcnkgbm9pc2UtZW52ZWxvcGUgaXMgc3RyaWN0bHkgbGF0ZXIgaW4gdGltZSovCi0gIGZvcihpPTA7IGk8bk5vaXNlRW52ZWxvcGVzOyBpKyspIHsKLSAgICBpZihwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbaV0gPj0gcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlW2krMV0pCisgIC8qIENoZWNrIHRoYXQgdGhlICBzdGFydCBib3JkZXIgZm9yIGV2ZXJ5IG5vaXNlLWVudmVsb3BlIGlzIHN0cmljdGx5IGxhdGVyIGluCisgICAqIHRpbWUqLworICBmb3IgKGkgPSAwOyBpIDwgbk5vaXNlRW52ZWxvcGVzOyBpKyspIHsKKyAgICBpZiAocEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlW2ldID49IHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVtpICsgMV0pCiAgICAgICByZXR1cm4gMDsKICAgfQogCiAgIC8qIENoZWNrIHRoYXQgZXZlcnkgbm9pc2UgYm9yZGVyIGlzIHRoZSBzYW1lIGFzIGFuIGVudmVsb3BlIGJvcmRlciovCi0gIGZvcihpPTA7IGk8bk5vaXNlRW52ZWxvcGVzOyBpKyspIHsKKyAgZm9yIChpID0gMDsgaSA8IG5Ob2lzZUVudmVsb3BlczsgaSsrKSB7CiAgICAgc3RhcnRQb3NOb2lzZSA9IHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVtpXTsKIAotICAgIGZvcihqPTA7IGo8bkVudmVsb3BlczsgaisrKSB7Ci0gICAgICBpZihwRnJhbWVJbmZvLT5ib3JkZXJzW2pdID09IHN0YXJ0UG9zTm9pc2UpCi0gICAgICAgIGJyZWFrOworICAgIGZvciAoaiA9IDA7IGogPCBuRW52ZWxvcGVzOyBqKyspIHsKKyAgICAgIGlmIChwRnJhbWVJbmZvLT5ib3JkZXJzW2pdID09IHN0YXJ0UG9zTm9pc2UpIGJyZWFrOwogICAgIH0KLSAgICBpZihqPT1uRW52ZWxvcGVzKQotICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGogPT0gbkVudmVsb3BlcykgcmV0dXJuIDA7CiAgIH0KIAogICByZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvZW52X2V4dHIuaCBiL2xpYlNCUmRlYy9zcmMvZW52X2V4dHIuaAppbmRleCAwNTE4ZWE5Li4zOGMwNGEzIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL2Vudl9leHRyLmgKKysrIGIvbGliU0JSZGVjL3NyYy9lbnZfZXh0ci5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE1ICs5MCwyMyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIEVudmVsb3BlIGV4dHJhY3Rpb24gcHJvdG90eXBlcyAgCisgIFxicmllZiAgRW52ZWxvcGUgZXh0cmFjdGlvbiBwcm90b3R5cGVzCiAqLwogCi0jaWZuZGVmIF9fRU5WRUxPUEVfRVhUUkFDVElPTl9ICi0jZGVmaW5lIF9fRU5WRUxPUEVfRVhUUkFDVElPTl9ICisjaWZuZGVmIEVOVl9FWFRSX0gKKyNkZWZpbmUgRU5WX0VYVFJfSAogCiAjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgogCkBAIC05NSw2ICsxMTQsNyBAQAogI2luY2x1ZGUgImxwcF90cmFuLmgiCiAKICNpbmNsdWRlICJwc2RlYy5oIgorI2luY2x1ZGUgInB2Y19kZWMuaCIKIAogI2RlZmluZSBFTlZfRVhQX0ZSQUNUIDAKIC8qITwgU2hpZnQgcmF3IGVudmVsb3BlIGRhdGEgdG8gc3VwcG9ydCBmcmFjdGlvbmFsIG51bWJlcnMuCkBAIC0xMDQsMjA4ICsxMjQsMjc4IEBACiAqLwogCiAjZGVmaW5lIEVYUF9CSVRTIDYKLS8qITwgU2l6ZSBvZiBleHBvbmVudC1wYXJ0IG9mIGEgcHNldWRvIGZsb2F0IGVudmVsb3BlIHZhbHVlIChzaG91bGQgYmUgYXQgbGVhc3QgNikuCi0gIFRoZSByZW1haW5pbmcgYml0cyBpbiBlYWNoIHdvcmQgYXJlIHVzZWQgZm9yIHRoZSBtYW50aXNzYSAoc2hvdWxkIGJlIGF0IGxlYXN0IDEwKS4KLSAgVGhpcyBmb3JtYXQgaXMgdXNlZCBpbiB0aGUgYXJyYXlzIGlFbnZlbG9wZVtdIGFuZCBzYnJOb2lzZUZsb29yTGV2ZWxbXQotICBpbiB0aGUgRlJBTUVfREFUQSBzdHJ1Y3Qgd2hpY2ggbXVzdCBmaXQgaW4gYSBjZXJ0YWluIHBhcnQgb2YgdGhlIG91dHB1dCBidWZmZXIKLSAgKFNlZSBidWZmZXIgbWFuYWdlbWVudCBpbiBzYnJfZGVjLmNwcCkuCi0gIEV4cG9uZW50cyBhbmQgbWFudGlzc2FzIGNvdWxkIGFsc28gYmUgc3RvcmVkIGluIHNlcGFyYXRlIGFycmF5cy4KLSAgQWNjZXNzaW5nIHRoZSBleHBvbmVudCBvciB0aGUgbWFudGlzc2Egd291bGQgYmUgc2ltcGxpZmllZCBhbmQgdGhlIG1hc2tzICNNQVNLX0UKLSAgcmVzcC4gI01BU0tfTSB3b3VsZCAgIG5vIGxvbmdlciBiZSByZXF1aXJlZC4KKy8qITwgU2l6ZSBvZiBleHBvbmVudC1wYXJ0IG9mIGEgcHNldWRvIGZsb2F0IGVudmVsb3BlIHZhbHVlIChzaG91bGQgYmUgYXQgbGVhc3QKKyAgNikuIFRoZSByZW1haW5pbmcgYml0cyBpbiBlYWNoIHdvcmQgYXJlIHVzZWQgZm9yIHRoZSBtYW50aXNzYSAoc2hvdWxkIGJlIGF0CisgIGxlYXN0IDEwKS4gVGhpcyBmb3JtYXQgaXMgdXNlZCBpbiB0aGUgYXJyYXlzIGlFbnZlbG9wZVtdIGFuZAorICBzYnJOb2lzZUZsb29yTGV2ZWxbXSBpbiB0aGUgRlJBTUVfREFUQSBzdHJ1Y3Qgd2hpY2ggbXVzdCBmaXQgaW4gYSBjZXJ0YWluIHBhcnQKKyAgb2YgdGhlIG91dHB1dCBidWZmZXIgKFNlZSBidWZmZXIgbWFuYWdlbWVudCBpbiBzYnJfZGVjLmNwcCkuIEV4cG9uZW50cyBhbmQKKyAgbWFudGlzc2FzIGNvdWxkIGFsc28gYmUgc3RvcmVkIGluIHNlcGFyYXRlIGFycmF5cy4gQWNjZXNzaW5nIHRoZSBleHBvbmVudCBvcgorICB0aGUgbWFudGlzc2Egd291bGQgYmUgc2ltcGxpZmllZCBhbmQgdGhlIG1hc2tzICNNQVNLX0UgcmVzcC4gI01BU0tfTSB3b3VsZAorICBubyBsb25nZXIgYmUgcmVxdWlyZWQuCiAqLwogCi0jZGVmaW5lIE1BU0tfTSAoKCgxIDw8IChGUkFDVF9CSVRTIC0gRVhQX0JJVFMpKSAtIDEpIDw8IEVYUF9CSVRTKSAgLyohPCBNYXNrIGZvciBleHRyYWN0aW5nIHRoZSBtYW50aXNzYSBvZiBhIHBzZXVkbyBmbG9hdCBlbnZlbG9wZSB2YWx1ZSAqLwotI2RlZmluZSBNQVNLX0UgKCgxIDw8IEVYUF9CSVRTKSAtIDEpICAgICAgICAgICAvKiE8IE1hc2sgZm9yIGV4dHJhY3RpbmcgdGhlIGV4cG9uZW50IG9mIGEgcHNldWRvIGZsb2F0IGVudmVsb3BlIHZhbHVlICovCisjZGVmaW5lIE1BU0tfTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKDEgPDwgKEZSQUNUX0JJVFMgLSBFWFBfQklUUykpIC0gMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA8PCBFWFBfQklUUykgLyohPCBNYXNrIGZvciBleHRyYWN0aW5nIHRoZSBtYW50aXNzYSBvZiBhIHBzZXVkbyBmbG9hdCBcCisgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUgdmFsdWUgKi8KKyNkZWZpbmUgTUFTS19FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKDEgPDwgRVhQX0JJVFMpIC0gMSkgLyohPCBNYXNrIGZvciBleHRyYWN0aW5nIHRoZSBleHBvbmVudCBvZiBhIHBzZXVkbyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBlbnZlbG9wZSB2YWx1ZSAqLwogCi0jZGVmaW5lIFNJR05fRVhUICggKChTQ0hBUiktMSkgXiBNQVNLX0UpICAgICAgICAvKiE8IGEgQ0hBUi1jb25zdGFudCB3aXRoIGFsbCBiaXRzIGFib3ZlIG91ciBzaWduLWJpdCBzZXQgKi8KLSNkZWZpbmUgUk9VTkRJTkcgKCAoRklYUF9TR0wpKDE8PChFWFBfQklUUy0xKSkgKSAvKiE8IDAuNS1vZmZzZXQgZm9yIHJvdW5kaW5nIHRoZSBtYW50aXNzYSBvZiBhIHBzZXVkby1mbG9hdCBlbnZlbG9wZSB2YWx1ZSAqLwotI2RlZmluZSBOUkdfRVhQX09GRlNFVCAgMTYgICAgICAgICAgICAgICAgICAgICAvKiE8IFdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlZmVyZW5jZSBlbmVyZ3kncyBleHBvbmVudCB0byBwcmV2ZW50IG5lZ2F0aXZlIG51bWJlcnMgKi8KLSNkZWZpbmUgTk9JU0VfRVhQX09GRlNFVCAgMzggICAgICAgICAgICAgICAgICAgLyohPCBXaWxsIGJlIGFkZGVkIHRvIHRoZSBub2lzZSBsZXZlbCBleHBvbmVudCB0byBwcmV2ZW50IG5lZ2F0aXZlIG51bWJlcnMgKi8KKyNkZWZpbmUgU0lHTl9FWFQgXAorICAoKChTQ0hBUiktMSkgXiBcCisgICBNQVNLX0UpIC8qITwgYSBDSEFSLWNvbnN0YW50IHdpdGggYWxsIGJpdHMgYWJvdmUgb3VyIHNpZ24tYml0IHNldCAqLworI2RlZmluZSBST1VORElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKEZJWFBfU0dMKSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgMSA8PCAoRVhQX0JJVFMgLSAxKSkpIC8qITwgMC41LW9mZnNldCBmb3Igcm91bmRpbmcgdGhlIG1hbnRpc3NhIG9mIGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXVkby1mbG9hdCBlbnZlbG9wZSB2YWx1ZSAqLworI2RlZmluZSBOUkdfRVhQX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMTYgLyohPCBXaWxsIGJlIGFkZGVkIHRvIHRoZSByZWZlcmVuY2UgZW5lcmd5J3MgZXhwb25lbnQgdG8gcHJldmVudCBuZWdhdGl2ZSBcCisgICAgICAgIG51bWJlcnMgKi8KKyNkZWZpbmUgTk9JU0VfRVhQX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMzggLyohPCBXaWxsIGJlIGFkZGVkIHRvIHRoZSBub2lzZSBsZXZlbCBleHBvbmVudCB0byBwcmV2ZW50IG5lZ2F0aXZlIFwKKyAgICAgICAgbnVtYmVycyAqLwogCi10eXBlZGVmIGVudW0KLXsKKyNkZWZpbmUgQUREX0hBUk1PTklDU19GTEFHU19TSVpFIDIgLyogY2VpbChNQVhfRlJFUV9DT0VGRlMvMzIpICovCisKK3R5cGVkZWYgZW51bSB7CiAgIEhFQURFUl9OT1RfUFJFU0VOVCwKICAgSEVBREVSX0VSUk9SLAogICBIRUFERVJfT0ssCiAgIEhFQURFUl9SRVNFVAotfQotU0JSX0hFQURFUl9TVEFUVVM7Cit9IFNCUl9IRUFERVJfU1RBVFVTOwogCi10eXBlZGVmIGVudW0KLXsKK3R5cGVkZWYgZW51bSB7CiAgIFNCUl9OT1RfSU5JVElBTElaRUQgPSAwLAogICBVUFNBTVBMSU5HID0gMSwKICAgU0JSX0hFQURFUiA9IDIsCiAgIFNCUl9BQ1RJVkUgPSAzCi19Ci1TQlJfU1lOQ19TVEFURTsKK30gU0JSX1NZTkNfU1RBVEU7CiAKK3R5cGVkZWYgZW51bSB7IENPVVBMSU5HX09GRiA9IDAsIENPVVBMSU5HX0xFVkVMLCBDT1VQTElOR19CQUwgfSBDT1VQTElOR19NT0RFOwogCi10eXBlZGVmIGVudW0KLXsKLSAgQ09VUExJTkdfT0ZGID0gMCwKLSAgQ09VUExJTkdfTEVWRUwsCi0gIENPVVBMSU5HX0JBTAotfQotQ09VUExJTkdfTU9ERTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgVUNIQVIgblNmYlsyXTsgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIFNCUi1iYW5kcyBmb3IgbG93IGFuZCBoaWdoIGZyZXEtcmVzb2x1dGlvbiAqLwotICBVQ0hBUiBuTmZiOyAgICAgICAgICAgICAgLyohPCBBY3R1YWwgbnVtYmVyIG9mIG5vaXNlIGJhbmRzIHRvIHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtKi8KLSAgVUNIQVIgbnVtTWFzdGVyOyAgICAgICAgIC8qITwgTnVtYmVyIG9mIFNCUi1iYW5kcyBpbiB2X2tfbWFzdGVyICovCi0gIFVDSEFSIGxvd1N1YmJhbmQ7ICAgICAgICAvKiE8IFFNRi1iYW5kIHdoZXJlIFNCUiBmcmVxdWVuY3kgcmFuZ2Ugc3RhcnRzICovCi0gIFVDSEFSIGhpZ2hTdWJiYW5kOyAgICAgICAvKiE8IFFNRi1iYW5kIHdoZXJlIFNCUiBmcmVxdWVuY3kgcmFuZ2UgZW5kcyAqLwotICBVQ0hBUiBsaW1pdGVyQmFuZFRhYmxlW01BWF9OVU1fTElNSVRFUlMrMV07IC8qITwgTGltaXRlciBiYW5kIHRhYmxlLiAqLwotICBVQ0hBUiBub0xpbWl0ZXJCYW5kczsgICAgLyohPCBOdW1iZXIgb2YgbGltaXRlciBiYW5kcy4gKi8KLSAgVUNIQVIgbkludmZCYW5kczsgICAgICAgIC8qITwgTnVtYmVyIG9mIGJhbmRzIGZvciBpbnZlcnNlIGZpbHRlcmluZyAqLwotICBVQ0hBUiAqZnJlcUJhbmRUYWJsZVsyXTsgLyohPCBQb2ludGVycyB0byBmcmVxQmFuZFRhYmxlTG8gYW5kIGZyZXFCYW5kVGFibGVIaSAqLwotICBVQ0hBUiBmcmVxQmFuZFRhYmxlTG9bTUFYX0ZSRVFfQ09FRkZTLzIrMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFwcGluZyBvZiBTQlIgYmFuZHMgdG8gUU1GIGJhbmRzIGZvciBsb3cgZnJlcXVlbmN5IHJlc29sdXRpb24gKi8KLSAgVUNIQVIgZnJlcUJhbmRUYWJsZUhpW01BWF9GUkVRX0NPRUZGUysxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYXBwaW5nIG9mIFNCUiBiYW5kcyB0byBRTUYgYmFuZHMgZm9yIGhpZ2ggZnJlcXVlbmN5IHJlc29sdXRpb24gKi8KLSAgVUNIQVIgZnJlcUJhbmRUYWJsZU5vaXNlW01BWF9OT0lTRV9DT0VGRlMrMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFwcGluZyBvZiBTQlIgbm9pc2UgYmFuZHMgdG8gUU1GIGJhbmRzICovCi0gIFVDSEFSIHZfa19tYXN0ZXJbTUFYX0ZSRVFfQ09FRkZTKzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1hc3RlciBCYW5kVGFibGUgd2hpY2ggZnJlcUJhbmRUYWJsZSBpcyBkZXJpdmVkIGZyb20gKi8KLX0KLUZSRVFfQkFORF9EQVRBOwordHlwZWRlZiBzdHJ1Y3QgeworICBVQ0hBUiBuU2ZiWzJdOyAvKiE8IE51bWJlciBvZiBTQlItYmFuZHMgZm9yIGxvdyBhbmQgaGlnaCBmcmVxLXJlc29sdXRpb24gKi8KKyAgVUNIQVIgbk5mYjsgICAgLyohPCBBY3R1YWwgbnVtYmVyIG9mIG5vaXNlIGJhbmRzIHRvIHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtKi8KKyAgVUNIQVIgbnVtTWFzdGVyOyAgICAgIC8qITwgTnVtYmVyIG9mIFNCUi1iYW5kcyBpbiB2X2tfbWFzdGVyICovCisgIFVDSEFSIGxvd1N1YmJhbmQ7ICAgICAvKiE8IFFNRi1iYW5kIHdoZXJlIFNCUiBmcmVxdWVuY3kgcmFuZ2Ugc3RhcnRzICovCisgIFVDSEFSIGhpZ2hTdWJiYW5kOyAgICAvKiE8IFFNRi1iYW5kIHdoZXJlIFNCUiBmcmVxdWVuY3kgcmFuZ2UgZW5kcyAqLworICBVQ0hBUiBvdl9oaWdoU3ViYmFuZDsgLyohPCBpZiBoZWFkZXJjaGFuZ2UgYXBwbGllcyB0aGlzIHZhbHVlIGhvbGRzIHRoZSBvbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hiYW5kIHZhbHVlIC0+IGhpZ2hiYW5kIHZhbHVlIG9mIG92ZXJsYXAgYXJlYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgZm9yIG92ZXJsYXAgaW4gdXNhYyB3aGVuIGhlYWRlcmNoYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJzIGJldHdlZW4gWFZBUiBhbmQgVkFSWCBmcmFtZSAqLworICBVQ0hBUiBsaW1pdGVyQmFuZFRhYmxlW01BWF9OVU1fTElNSVRFUlMgKyAxXTsgLyohPCBMaW1pdGVyIGJhbmQgdGFibGUuICovCisgIFVDSEFSIG5vTGltaXRlckJhbmRzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBsaW1pdGVyIGJhbmRzLiAqLworICBVQ0hBUiBuSW52ZkJhbmRzOyAvKiE8IE51bWJlciBvZiBiYW5kcyBmb3IgaW52ZXJzZSBmaWx0ZXJpbmcgKi8KKyAgVUNIQVIKKyAgKmZyZXFCYW5kVGFibGVbMl07IC8qITwgUG9pbnRlcnMgdG8gZnJlcUJhbmRUYWJsZUxvIGFuZCBmcmVxQmFuZFRhYmxlSGkgKi8KKyAgVUNIQVIgZnJlcUJhbmRUYWJsZUxvW01BWF9GUkVRX0NPRUZGUyAvIDIgKyAxXTsKKyAgLyohPCBNYXBwaW5nIG9mIFNCUiBiYW5kcyB0byBRTUYgYmFuZHMgZm9yIGxvdyBmcmVxdWVuY3kgcmVzb2x1dGlvbiAqLworICBVQ0hBUiBmcmVxQmFuZFRhYmxlSGlbTUFYX0ZSRVFfQ09FRkZTICsgMV07CisgIC8qITwgTWFwcGluZyBvZiBTQlIgYmFuZHMgdG8gUU1GIGJhbmRzIGZvciBoaWdoIGZyZXF1ZW5jeSByZXNvbHV0aW9uICovCisgIFVDSEFSIGZyZXFCYW5kVGFibGVOb2lzZVtNQVhfTk9JU0VfQ09FRkZTICsgMV07CisgIC8qITwgTWFwcGluZyBvZiBTQlIgbm9pc2UgYmFuZHMgdG8gUU1GIGJhbmRzICovCisgIFVDSEFSIHZfa19tYXN0ZXJbTUFYX0ZSRVFfQ09FRkZTICsgMV07CisgIC8qITwgTWFzdGVyIEJhbmRUYWJsZSB3aGljaCBmcmVxQmFuZFRhYmxlIGlzIGRlcml2ZWQgZnJvbSAqLworfSBGUkVRX0JBTkRfREFUQTsKIAogdHlwZWRlZiBGUkVRX0JBTkRfREFUQSAqSEFORExFX0ZSRVFfQkFORF9EQVRBOwogCi0jZGVmaW5lIFNCUkRFQ19FTERfR1JJRCAgICAgICAgMQotI2RlZmluZSBTQlJERUNfU1lOVEFYX1NDQUwgICAgIDIKLSNkZWZpbmUgU0JSREVDX1NZTlRBWF9VU0FDICAgICA0Ci0jZGVmaW5lIFNCUkRFQ19TWU5UQVhfUlNWRDUwICAgOAotI2RlZmluZSBTQlJERUNfTE9XX1BPV0VSICAgICAgMTYgIC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IExvdyBQb3dlciBRTUYgbW9kZSBzaGFsbCBiZSB1c2VkLiAqLwotI2RlZmluZSBTQlJERUNfUFNfREVDT0RFRCAgICAgMzIgIC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IFBTIHdhcyBkZWNvZGVkIGFuZCByZW5kZXJlZC4gKi8KLSNkZWZpbmUgU0JSREVDX0xEX01QU19RTUYgICAgNTEyICAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgTEQtTVBTIFFNRiBzaGFsbCBiZSB1c2VkLiAqLwotI2RlZmluZSBTQlJERUNfU1lOVEFYX0RSTSAgIDIwNDggIC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IERSTTMwL0RSTSsgcmV2ZXJzZSBzeW50YXggaXMgYmVpbmcgdXNlZC4gKi8KLSNkZWZpbmUgU0JSREVDX0RPV05TQU1QTEUgICA4MTkyICAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgZG93bnNhbXBsaW5nIG1vZGUgaXMgdXNlZC4gKi8KLSNkZWZpbmUgU0JSREVDX0ZMVVNIICAgICAgIDE2Mzg0ICAvKiBGbGFnIGlzIHVzZWQgdG8gZmx1c2ggYWxsIGVsZW1lbnRzIGluIHVzZS4gKi8KLSNkZWZpbmUgU0JSREVDX0ZPUkNFX1JFU0VUIDMyNzY4ICAvKiBGbGFnIGlzIHVzZWQgdG8gZm9yY2UgYSByZXNldCBvZiBhbGwgZWxlbWVudHMgaW4gdXNlLiAqLworI2RlZmluZSBTQlJERUNfRUxEX0dSSUQgMQorI2RlZmluZSBTQlJERUNfU1lOVEFYX1NDQUwgMgorI2RlZmluZSBTQlJERUNfU1lOVEFYX1VTQUMgNAorI2RlZmluZSBTQlJERUNfU1lOVEFYX1JTVkQ1MCA4CisjZGVmaW5lIFNCUkRFQ19VU0FDX0lOREVQIFwKKyAgMTYgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgVVNBQyBnbG9iYWwgaW5kZXBlbmRlbmN5IGZsYWcgaXMgYWN0aXZlLiAqLworI2RlZmluZSBTQlJERUNfTE9XX1BPV0VSIFwKKyAgMzIgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgTG93IFBvd2VyIFFNRiBtb2RlIHNoYWxsIGJlIHVzZWQuICovCisjZGVmaW5lIFNCUkRFQ19QU19ERUNPREVEIFwKKyAgNjQgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgUFMgd2FzIGRlY29kZWQgYW5kIHJlbmRlcmVkLiAqLworI2RlZmluZSBTQlJERUNfUVVBRF9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAxMjggLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgVVNBQyBTQlIgNDoxIGlzIGFjdGl2ZS4gXAorICAgICAgICovCisjZGVmaW5lIFNCUkRFQ19VU0FDX0hBUk1PTklDU0JSIFwKKyAgMjU2IC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IFVTQUMgSEJFIHRvb2wgaXMgYWN0aXZlLiAqLworI2RlZmluZSBTQlJERUNfTERfTVBTX1FNRiBcCisgIDUxMiAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgTEQtTVBTIFFNRiBzaGFsbCBiZSB1c2VkLiAqLworI2RlZmluZSBTQlJERUNfVVNBQ19JVEVTIFwKKyAgMTAyNCAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCBVU0FDIGludGVyIFRFUyB0b29sIGlzIGFjdGl2ZS4gKi8KKyNkZWZpbmUgU0JSREVDX1NZTlRBWF9EUk0gXAorICAyMDQ4IC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IERSTTMwL0RSTSsgcmV2ZXJzZSBzeW50YXggaXMgYmVpbmcgdXNlZC4gKi8KKyNkZWZpbmUgU0JSREVDX0VMRF9ET1dOU0NBTEUgXAorICA0MDk2IC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IEVMRCBkb3duc2NhbGVkIG1vZGUgZGVjb2RpbmcgaXMgdXNlZCAqLworI2RlZmluZSBTQlJERUNfRE9XTlNBTVBMRSBcCisgIDgxOTIgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGRvd25zYW1wbGluZyBtb2RlIGlzIHVzZWQuICovCisjZGVmaW5lIFNCUkRFQ19GTFVTSCAxNjM4NCAvKiBGbGFnIGlzIHVzZWQgdG8gZmx1c2ggYWxsIGVsZW1lbnRzIGluIHVzZS4gKi8KKyNkZWZpbmUgU0JSREVDX0ZPUkNFX1JFU0VUIFwKKyAgMzI3NjggLyogRmxhZyBpcyB1c2VkIHRvIGZvcmNlIGEgcmVzZXQgb2YgYWxsIGVsZW1lbnRzIGluIHVzZS4gKi8KKyNkZWZpbmUgU0JSREVDX1NLSVBfUU1GX0FOQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoMSA8PCAyMSkgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGlucHV0IGRhdGEgaXMgcHJvdmlkZWQgaW4gdGhlIFFNRiBcCisgICAgICAgICAgICAgICBkb21haW4uICovCisjZGVmaW5lIFNCUkRFQ19TS0lQX1FNRl9TWU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgxIDw8IDIyKSAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgb3V0cHV0IGRhdGEgaXMgZXhwb3J0ZWQgaW4gdGhlIFFNRiBcCisgICAgICAgICAgICAgICBkb21haW4uICovCiAKLSNkZWZpbmUgU0JSREVDX0hEUl9TVEFUX1JFU0VUICAxCisjZGVmaW5lIFNCUkRFQ19IRFJfU1RBVF9SRVNFVCAxCiAjZGVmaW5lIFNCUkRFQ19IRFJfU1RBVF9VUERBVEUgMgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIFVDSEFSIGFtcFJlc29sdXRpb247ICAgICAgIC8qITwgQW1wbGl0dWRlIHJlc29sdXRpb24gb2YgZW52ZWxvcGUgdmFsdWVzICgwOiAxLjVkQiwgMTogM2RCKSAqLwotICBVQ0hBUiB4b3Zlcl9iYW5kOyAgICAgICAgICAvKiE8IFN0YXJ0IGluZGV4IGluICN2X2tfbWFzdGVyW10gdXNlZCBmb3IgZHluYW1pYyBjcm9zc292ZXIgZnJlcXVlbmN5ICovCi0gIFVDSEFSIHNicl9wcmVwcm9jZXNzaW5nOyAgIC8qITwgU0JSIHByZXdoaXRlbmluZyBmbGFnLiAqLworICBVQ0hBUiBhbXBSZXNvbHV0aW9uOyAvKiE8IEFtcGxpdHVkZSByZXNvbHV0aW9uIG9mIGVudmVsb3BlIHZhbHVlcyAoMDogMS41ZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IDNkQikgKi8KKyAgVUNIQVIKKyAgeG92ZXJfYmFuZDsgLyohPCBTdGFydCBpbmRleCBpbiAjdl9rX21hc3RlcltdIHVzZWQgZm9yIGR5bmFtaWMgY3Jvc3NvdmVyCisgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSAqLworICBVQ0hBUiBzYnJfcHJlcHJvY2Vzc2luZzsgLyohPCBTQlIgcHJld2hpdGVuaW5nIGZsYWcuICovCisgIFVDSEFSIHB2Y19tb2RlOyAgICAgICAgICAvKiE8IFByZWRpY3RpdmUgdmVjdG9yIGNvZGluZyBtb2RlICovCiB9IFNCUl9IRUFERVJfREFUQV9CU19JTkZPOwogCiB0eXBlZGVmIHN0cnVjdCB7CiAgIC8qIENoYW5nZXMgaW4gdGhlc2UgdmFyaWFibGVzIGNhdXNlcyBhIHJlc2V0IG9mIHRoZSBkZWNvZGVyICovCi0gIFVDSEFSIHN0YXJ0RnJlcTsgICAgICAgICAgIC8qITwgSW5kZXggZm9yIFNCUiBzdGFydCBmcmVxdWVuY3kgKi8KLSAgVUNIQVIgc3RvcEZyZXE7ICAgICAgICAgICAgLyohPCBJbmRleCBmb3IgU0JSIGhpZ2hlc3QgZnJlcXVlbmN5ICovCi0gIFVDSEFSIGZyZXFTY2FsZTsgICAgICAgICAgIC8qITwgMDogbGluZWFyIHNjYWxlLCAgMS0zIGxvZ2FyaXRobWljIHNjYWxlcyAqLwotICBVQ0hBUiBhbHRlclNjYWxlOyAgICAgICAgICAvKiE8IEZsYWcgZm9yIGNvYXJzZXIgZnJlcXVlbmN5IHJlc29sdXRpb24gKi8KLSAgVUNIQVIgbm9pc2VfYmFuZHM7ICAgICAgICAgLyohPCBOb2lzZSBiYW5kcyBwZXIgb2N0YXZlLCByZWFkIGZyb20gYml0c3RyZWFtKi8KKyAgVUNIQVIgc3RhcnRGcmVxOyAgIC8qITwgSW5kZXggZm9yIFNCUiBzdGFydCBmcmVxdWVuY3kgKi8KKyAgVUNIQVIgc3RvcEZyZXE7ICAgIC8qITwgSW5kZXggZm9yIFNCUiBoaWdoZXN0IGZyZXF1ZW5jeSAqLworICBVQ0hBUiBmcmVxU2NhbGU7ICAgLyohPCAwOiBsaW5lYXIgc2NhbGUsICAxLTMgbG9nYXJpdGhtaWMgc2NhbGVzICovCisgIFVDSEFSIGFsdGVyU2NhbGU7ICAvKiE8IEZsYWcgZm9yIGNvYXJzZXIgZnJlcXVlbmN5IHJlc29sdXRpb24gKi8KKyAgVUNIQVIgbm9pc2VfYmFuZHM7IC8qITwgTm9pc2UgYmFuZHMgcGVyIG9jdGF2ZSwgcmVhZCBmcm9tIGJpdHN0cmVhbSovCiAKICAgLyogZG9uJ3QgcmVxdWlyZSByZXNldCAqLwotICBVQ0hBUiBsaW1pdGVyQmFuZHM7ICAgICAgICAvKiE8IEluZGV4IGZvciBudW1iZXIgb2YgbGltaXRlciBiYW5kcyBwZXIgb2N0YXZlICovCi0gIFVDSEFSIGxpbWl0ZXJHYWluczsgICAgICAgIC8qITwgSW5kZXggdG8gc2VsZWN0IGdhaW4gbGltaXQgKi8KLSAgVUNIQVIgaW50ZXJwb2xGcmVxOyAgICAgICAgLyohPCBTZWxlY3QgZ2FpbiBjYWxjdWxhdGlvbiBtZXRob2QgKDE6IHBlciBRTUYgY2hhbm5lbCwgMDogcGVyIFNCUiBiYW5kKSAqLwotICBVQ0hBUiBzbW9vdGhpbmdMZW5ndGg7ICAgICAvKiE8IFNtb290aGluZyBvZiBnYWlucyBvdmVyIHRpbWUgKDA6IG9uICAxOiBvZmYpICovCisgIFVDSEFSIGxpbWl0ZXJCYW5kczsgLyohPCBJbmRleCBmb3IgbnVtYmVyIG9mIGxpbWl0ZXIgYmFuZHMgcGVyIG9jdGF2ZSAqLworICBVQ0hBUiBsaW1pdGVyR2FpbnM7IC8qITwgSW5kZXggdG8gc2VsZWN0IGdhaW4gbGltaXQgKi8KKyAgVUNIQVIgaW50ZXJwb2xGcmVxOyAvKiE8IFNlbGVjdCBnYWluIGNhbGN1bGF0aW9uIG1ldGhvZCAoMTogcGVyIFFNRiBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIDA6IHBlciBTQlIgYmFuZCkgKi8KKyAgVUNIQVIgc21vb3RoaW5nTGVuZ3RoOyAvKiE8IFNtb290aGluZyBvZiBnYWlucyBvdmVyIHRpbWUgKDA6IG9uICAxOiBvZmYpICovCiAKIH0gU0JSX0hFQURFUl9EQVRBX0JTOwogCi10eXBlZGVmIHN0cnVjdAotewotICBTQlJfU1lOQ19TVEFURSBzeW5jU3RhdGU7ICAgIC8qITwgVGhlIGN1cnJlbnQgaW5pdGlhbGl6YXRpb24gc3RhdHVzIG9mIHRoZSBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgU0JSX1NZTkNfU1RBVEUKKyAgc3luY1N0YXRlOyAvKiE8IFRoZSBjdXJyZW50IGluaXRpYWxpemF0aW9uIHN0YXR1cyBvZiB0aGUgaGVhZGVyICovCiAKLSAgVUNIQVIgc3RhdHVzOyAgICAgICAgICAgICAgICAvKiE8IEZsYWdzIGZpZWxkIHVzZWQgZm9yIHNpZ25hbGluZyBhIHJlc2V0IHJpZ2h0IGJlZm9yZSB0aGUgcHJvY2Vzc2luZyBzdGFydHMgYW5kIGFuIHVwZGF0ZSBmcm9tIGNvbmZpZyAoZS5nLiBBU0MpLiAqLwotICBVQ0hBUiBmcmFtZUVycm9yRmxhZzsgICAgICAgIC8qITwgRnJhbWUgZGF0YSB2YWxpZCBmbGFnLiBDQVVUSU9OOiBUaGlzIHZhcmlhYmxlIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGZsYWcgc3RvcmVkIGluIHRoZSBlbGVtZW50IHN0cnVjdHVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb2YgdGhlIGZyYW1lIGRlbGF5LiBUaGVyZSBpdCBtaWdodCBoYXBwZW4gdGhhdCBkaWZmZXJlbnQgc2xvdHMgdXNlIHRoZSBzYW1lIGhlYWRlci4gKi8KKyAgVUNIQVIgc3RhdHVzOyAvKiE8IEZsYWdzIGZpZWxkIHVzZWQgZm9yIHNpZ25hbGluZyBhIHJlc2V0IHJpZ2h0IGJlZm9yZSB0aGUKKyAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIHN0YXJ0cyBhbmQgYW4gdXBkYXRlIGZyb20gY29uZmlnIChlLmcuIEFTQykuICovCisgIFVDSEFSCisgIGZyYW1lRXJyb3JGbGFnOyAvKiE8IEZyYW1lIGRhdGEgdmFsaWQgZmxhZy4gQ0FVVElPTjogVGhpcyB2YXJpYWJsZSB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdHRlbiBieSB0aGUgZmxhZyBzdG9yZWQgaW4gdGhlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZS4gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvZiB0aGUgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgIGRlbGF5LiBUaGVyZSBpdCBtaWdodCBoYXBwZW4gdGhhdCBkaWZmZXJlbnQgc2xvdHMgdXNlCisgICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSBoZWFkZXIuICovCiAgIFVDSEFSIG51bWJlclRpbWVTbG90czsgICAgICAgLyohPCBBQUM6IDE2LDE1ICovCiAgIFVDSEFSIG51bWJlck9mQW5hbHlzaXNCYW5kczsgLyohPCBOdW1iZXIgb2YgUU1GIGFuYWx5c2lzIGJhbmRzICovCiAgIFVDSEFSIHRpbWVTdGVwOyAgICAgICAgICAgICAgLyohPCBUaW1lIHJlc29sdXRpb24gb2YgU0JSIGluIFFNRi1zbG90cyAqLwotICBVSU5UICBzYnJQcm9jU21wbFJhdGU7ICAgICAgIC8qITwgU0JSIHByb2Nlc3Npbmcgc2FtcGxpbmcgZnJlcXVlbmN5ICghPSBPdXRwdXRTYW1wbGluZ1JhdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsd2F5czogQ29yZVNhbXBsaW5nUmF0ZSAqIFVwU2FtcGxpbmdGYWN0b3I7IGV2ZW4gaW4gc2luZ2xlIHJhdGUgbW9kZSkgKi8KKyAgVUlOVAorICAgICAgc2JyUHJvY1NtcGxSYXRlOyAvKiE8IFNCUiBwcm9jZXNzaW5nIHNhbXBsaW5nIGZyZXF1ZW5jeSAoIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U2FtcGxpbmdSYXRlKSAgICAgICAgKGFsd2F5czogQ29yZVNhbXBsaW5nUmF0ZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVwU2FtcGxpbmdGYWN0b3I7IGV2ZW4gaW4gc2luZ2xlIHJhdGUgbW9kZSkgKi8KIAotICBTQlJfSEVBREVSX0RBVEFfQlMgICAgICBic19kYXRhOyAgLyohPCBjdXJyZW50IFNCUiBoZWFkZXIuICovCi0gIFNCUl9IRUFERVJfREFUQV9CU19JTkZPIGJzX2luZm87ICAvKiE8IFNCUiBpbmZvLiAqLworICBTQlJfSEVBREVSX0RBVEFfQlMgYnNfZGF0YTsgICAgICAvKiE8IGN1cnJlbnQgU0JSIGhlYWRlci4gKi8KKyAgU0JSX0hFQURFUl9EQVRBX0JTIGJzX2RmbHQ7ICAgICAgLyohPCBEZWZhdWx0IHNiciBoZWFkZXIuICovCisgIFNCUl9IRUFERVJfREFUQV9CU19JTkZPIGJzX2luZm87IC8qITwgU0JSIGluZm8uICovCiAKLSAgRlJFUV9CQU5EX0RBVEEgZnJlcUJhbmREYXRhOyAgLyohPCBQb2ludGVyIHRvIHN0cnVjdCAjRlJFUV9CQU5EX0RBVEEgKi8KLX0KLVNCUl9IRUFERVJfREFUQTsKKyAgRlJFUV9CQU5EX0RBVEEgZnJlcUJhbmREYXRhOyAvKiE8IFBvaW50ZXIgdG8gc3RydWN0ICNGUkVRX0JBTkRfREFUQSAqLworICBVQ0hBUiBwdmNJRHByZXY7Cit9IFNCUl9IRUFERVJfREFUQTsKIAogdHlwZWRlZiBTQlJfSEVBREVSX0RBVEEgKkhBTkRMRV9TQlJfSEVBREVSX0RBVEE7CiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgZnJhbWVDbGFzczsgICAgICAgICAgICAgICAgIC8qITwgU2VsZWN0IGdyaWQgdHlwZSAqLworICBVQ0hBUiBuRW52ZWxvcGVzOyAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZW52ZWxvcGVzICovCisgIFVDSEFSIGJvcmRlcnNbTUFYX0VOVkVMT1BFUyArIDFdOyAvKiE8IEVudmVsb3BlIGJvcmRlcnMgKGluIFNCUi10aW1lc2xvdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmcuIG1wM1BSTzogMC4uMTEpICovCisgIFVDSEFSIGZyZXFSZXNbTUFYX0VOVkVMT1BFU107ICAgICAvKiE8IEZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBlYWNoIGVudmVsb3BlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMD1sb3csIDE9aGlnaCkgKi8KKyAgU0NIQVIgdHJhbkVudjsgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNpZW50IGVudmVsb3BlLCAtMSBpZiBub25lICovCisgIFVDSEFSIG5Ob2lzZUVudmVsb3BlczsgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBlbnZlbG9wZXMgKi8KKyAgVUNIQVIKKyAgYm9yZGVyc05vaXNlW01BWF9OT0lTRV9FTlZFTE9QRVMgKyAxXTsgLyohPCBib3JkZXJzIG9mIG5vaXNlIGVudmVsb3BlcyAqLworICBVQ0hBUiBwdmNCb3JkZXJzW01BWF9QVkNfRU5WRUxPUEVTICsgMV07CisgIFVDSEFSIG5vaXNlUG9zaXRpb247CisgIFVDSEFSIHZhckxlbmd0aDsKK30gRlJBTUVfSU5GTzsKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgVUNIQVIgZnJhbWVDbGFzczsgICAgICAgICAgICAgICAvKiE8IFNlbGVjdCBncmlkIHR5cGUgKi8KLSAgVUNIQVIgbkVudmVsb3BlczsgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBlbnZlbG9wZXMgKi8KLSAgVUNIQVIgYm9yZGVyc1tNQVhfRU5WRUxPUEVTKzFdOyAvKiE8IEVudmVsb3BlIGJvcmRlcnMgKGluIFNCUi10aW1lc2xvdHMsIGUuZy4gbXAzUFJPOiAwLi4xMSkgKi8KLSAgVUNIQVIgZnJlcVJlc1tNQVhfRU5WRUxPUEVTXTsgICAvKiE8IEZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBlYWNoIGVudmVsb3BlICgwPWxvdywgMT1oaWdoKSAqLwotICBTQ0hBUiAgdHJhbkVudjsgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNpZW50IGVudmVsb3BlLCAtMSBpZiBub25lICovCi0gIFVDSEFSIG5Ob2lzZUVudmVsb3BlczsgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygbm9pc2UgZW52ZWxvcGVzICovCi0gIFVDSEFSIGJvcmRlcnNOb2lzZVtNQVhfTk9JU0VfRU5WRUxPUEVTKzFdOy8qITwgYm9yZGVycyBvZiBub2lzZSBlbnZlbG9wZXMgKi8KLX0KLUZSQU1FX0lORk87Ci0KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRklYUF9TR0wgc2ZiX25yZ19wcmV2W01BWF9GUkVRX0NPRUZGU107ICAgIC8qITwgUHJldmlvdXMgZW52ZWxvcGUgKHJlcXVpcmVkIGZvciBkaWZmZXJlbnRpYWwtY29kZWQgdmFsdWVzKSAqLwotICBGSVhQX1NHTCBwcmV2Tm9pc2VMZXZlbFtNQVhfTk9JU0VfQ09FRkZTXTsgLyohPCBQcmV2aW91cyBub2lzZSBlbnZlbG9wZSAocmVxdWlyZWQgZm9yIGRpZmZlcmVudGlhbC1jb2RlZCB2YWx1ZXMpICovCi0gIENPVVBMSU5HX01PREUgY291cGxpbmc7ICAgICAgICAgICAgICAgICAgICAvKiE8IFN0ZXJlby1tb2RlIG9mIHByZXZpb3VzIGZyYW1lICovCi0gIElOVkZfTU9ERSBzYnJfaW52Zl9tb2RlW01BWF9JTlZGX0JBTkRTXTsgICAvKiE8IFByZXZpb3VzIHN0cmVuZ3RoIG9mIGZpbHRlcmluZyBpbiB0cmFuc3Bvc2VyICovCi0gIFVDSEFSIGFtcFJlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFByZXZpb3VzIGFtcGxpdHVkZSByZXNvbHV0aW9uICgwOiAxLjVkQiwgMTogM2RCKSAqLwotICBVQ0hBUiBzdG9wUG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQb3NpdGlvbiBpbiB0aW1lIHdoZXJlIGxhc3QgZW52ZWxvcGUgZW5kZWQgKi8KLSAgVUNIQVIgZnJhbWVFcnJvckZsYWc7ICAgICAgICAgICAgICAgICAgICAgIC8qITwgUHJldmlvdXMgZnJhbWUgc3RhdHVzICovCi19Ci1TQlJfUFJFVl9GUkFNRV9EQVRBOwordHlwZWRlZiBzdHJ1Y3QgeworICBGSVhQX1NHTCBzZmJfbnJnX3ByZXZbTUFYX0ZSRVFfQ09FRkZTXTsgLyohPCBQcmV2aW91cyBlbnZlbG9wZSAocmVxdWlyZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnRpYWwtY29kZWQgdmFsdWVzKSAqLworICBGSVhQX1NHTAorICBwcmV2Tm9pc2VMZXZlbFtNQVhfTk9JU0VfQ09FRkZTXTsgLyohPCBQcmV2aW91cyBub2lzZSBlbnZlbG9wZSAocmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBkaWZmZXJlbnRpYWwtY29kZWQgdmFsdWVzKSAqLworICBDT1VQTElOR19NT0RFIGNvdXBsaW5nOyAgICAgICAgICAgLyohPCBTdGVyZW8tbW9kZSBvZiBwcmV2aW91cyBmcmFtZSAqLworICBJTlZGX01PREUgc2JyX2ludmZfbW9kZVtNQVhfSU5WRl9CQU5EU107IC8qITwgUHJldmlvdXMgc3RyZW5ndGggb2YgZmlsdGVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdHJhbnNwb3NlciAqLworICBVQ0hBUiBhbXBSZXM7ICAgICAgICAgLyohPCBQcmV2aW91cyBhbXBsaXR1ZGUgcmVzb2x1dGlvbiAoMDogMS41ZEIsIDE6IDNkQikgKi8KKyAgVUNIQVIgc3RvcFBvczsgICAgICAgIC8qITwgUG9zaXRpb24gaW4gdGltZSB3aGVyZSBsYXN0IGVudmVsb3BlIGVuZGVkICovCisgIFVDSEFSIGZyYW1lRXJyb3JGbGFnOyAvKiE8IFByZXZpb3VzIGZyYW1lIHN0YXR1cyAqLworICBVQ0hBUiBwcmV2U2JyUGl0Y2hJbkJpbnM7IC8qITwgUHJldmlvdXMgZnJhbWUgcGl0Y2hJbkJpbnMgKi8KKyAgRlJBTUVfSU5GTyBwcmV2RnJhbWVJbmZvOworfSBTQlJfUFJFVl9GUkFNRV9EQVRBOwogCiB0eXBlZGVmIFNCUl9QUkVWX0ZSQU1FX0RBVEEgKkhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBOwogCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBuU2NhbGVGYWN0b3JzOyAvKiE8IHRvdGFsIG51bWJlciBvZiBzY2FsZWZhY3RvcnMgaW4gZnJhbWUgKi8KIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgaW50IG5TY2FsZUZhY3RvcnM7ICAgICAgICAgICAgICAgICAgICAvKiE8IHRvdGFsIG51bWJlciBvZiBzY2FsZWZhY3RvcnMgaW4gZnJhbWUgKi8KKyAgRlJBTUVfSU5GTyBmcmFtZUluZm87ICAgICAgICAgICAgLyohPCB0aW1lIGdyaWQgZm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgVUNIQVIgZG9tYWluX3ZlY1tNQVhfRU5WRUxPUEVTXTsgLyohPCBCaXRmaWVsZCBjb250YWluaW5nIGRpcmVjdGlvbiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YS1jb2RpbmcgZm9yIGVhY2ggZW52ZWxvcGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDA6ZnJlcXVlbmN5LCAxOnRpbWUpICovCisgIFVDSEFSIGRvbWFpbl92ZWNfbm9pc2UKKyAgICAgIFtNQVhfTk9JU0VfRU5WRUxPUEVTXTsgLyohPCBTYW1lIGFzIGFib3ZlLCBidXQgZm9yIG5vaXNlIGVudmVsb3BlcyAqLwogCi0gIEZSQU1FX0lORk8gZnJhbWVJbmZvOyAgICAgICAgICAgICAgICAgLyohPCB0aW1lIGdyaWQgZm9yIGN1cnJlbnQgZnJhbWUgKi8KLSAgVUNIQVIgZG9tYWluX3ZlY1tNQVhfRU5WRUxPUEVTXTsgICAgICAvKiE8IEJpdGZpZWxkIGNvbnRhaW5pbmcgZGlyZWN0aW9uIG9mIGRlbHRhLWNvZGluZyBmb3IgZWFjaCBlbnZlbG9wZSAoMDpmcmVxdWVuY3ksIDE6dGltZSkgKi8KLSAgVUNIQVIgZG9tYWluX3ZlY19ub2lzZVtNQVhfTk9JU0VfRU5WRUxPUEVTXTsgLyohPCBTYW1lIGFzIGFib3ZlLCBidXQgZm9yIG5vaXNlIGVudmVsb3BlcyAqLworICBJTlZGX01PREUKKyAgc2JyX2ludmZfbW9kZVtNQVhfSU5WRl9CQU5EU107IC8qITwgU3RyZW5ndGggb2YgZmlsdGVyaW5nIGluIHRyYW5zcG9zZXIgKi8KKyAgQ09VUExJTkdfTU9ERSBjb3VwbGluZzsgICAgICAgIC8qITwgU3RlcmVvLW1vZGUgKi8KKyAgaW50IGFtcFJlc29sdXRpb25DdXJyZW50RnJhbWU7IC8qITwgQW1wbGl0dWRlIHJlc29sdXRpb24gb2YgZW52ZWxvcGUgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMDogMS41ZEIsIDE6IDNkQikgKi8KIAotICBJTlZGX01PREUgc2JyX2ludmZfbW9kZVtNQVhfSU5WRl9CQU5EU107IC8qITwgU3RyZW5ndGggb2YgZmlsdGVyaW5nIGluIHRyYW5zcG9zZXIgKi8KLSAgQ09VUExJTkdfTU9ERSBjb3VwbGluZzsgICAgICAgICAgICAgICAgICAvKiE8IFN0ZXJlby1tb2RlICovCi0gIGludCBhbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lOyAgICAgICAgICAgLyohPCBBbXBsaXR1ZGUgcmVzb2x1dGlvbiBvZiBlbnZlbG9wZSB2YWx1ZXMgKDA6IDEuNWRCLCAxOiAzZEIpICovCi0KLSAgVUNIQVIgYWRkSGFybW9uaWNzW01BWF9GUkVRX0NPRUZGU107ICAgICAvKiE8IEZsYWdzIGZvciBzeW50aGV0aWMgc2luZSBhZGRpdGlvbiAqLworICBVTE9ORyBhZGRIYXJtb25pY3NbQUREX0hBUk1PTklDU19GTEFHU19TSVpFXTsgLyohPCBGbGFncyBmb3Igc3ludGhldGljIHNpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uIChhbGlnbmVkIHRvIE1TQikgKi8KIAogICBGSVhQX1NHTCBpRW52ZWxvcGVbTUFYX05VTV9FTlZFTE9QRV9WQUxVRVNdOyAgICAgICAvKiE8IEVudmVsb3BlIGRhdGEgKi8KICAgRklYUF9TR0wgc2JyTm9pc2VGbG9vckxldmVsW01BWF9OVU1fTk9JU0VfVkFMVUVTXTsgLyohPCBOb2lzZSBlbnZlbG9wZSBkYXRhICovCi19Ci1TQlJfRlJBTUVfREFUQTsKKyAgVUNIQVIgaVRFU2FjdGl2ZTsgLyohPCBPbmUgZmxhZyBmb3IgZWFjaCBlbnZlbG9wZSB0byBlbmFibGUgVVNBQyBpbnRlci1URVMgKi8KKyAgVUNIQVIKKyAgaW50ZXJUZW1wU2hhcGVNb2RlW01BWF9FTlZFTE9QRVNdOyAvKiE8IFVTQUMgaW50ZXItVEVTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzX2ludGVyX3RlbXBfc2hhcGVfbW9kZVtjaF1bZW52XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICovCisgIFVDSEFSIHB2Y0lEW1BWQ19OVElNRVNMT1RdOyAgICAgICAgLyohPCBPbmUgUFZDIElEIHZhbHVlIGZvciBlYWNoIHRpbWUgc2xvdCAqLworICBVQ0hBUiBuczsKKyAgVUNIQVIgc2ludXNvaWRhbF9wb3NpdGlvbjsKKworICBVQ0hBUiBzYnJQYXRjaGluZ01vZGU7CisgIFVDSEFSIHNick92ZXJzYW1wbGluZ0ZsYWc7CisgIFVDSEFSIHNiclBpdGNoSW5CaW5zOworfSBTQlJfRlJBTUVfREFUQTsKIAogdHlwZWRlZiBTQlJfRlJBTUVfREFUQSAqSEFORExFX1NCUl9GUkFNRV9EQVRBOwogCi12b2lkIGluaXRTYnJQcmV2RnJhbWVEYXRhIChIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lU2xvdHMpOworLyohCitcYnJpZWYgICBNYXBzIHNhbXBsaW5nIGZyZXF1ZW5jaWVzIHRvIGZyZXF1ZW5jaWVzIGZvciB3aGljaCBzZXR1cCB0YWJsZXMgYXJlCithdmFpbGFibGUKIAorTWFwcyBhcmJpdGFyeSBzYW1wbGluZyBmcmVxdWVuY3kgdG8gbmVhcmVzdCBuZWlnaGJvcnMgZm9yIHdoaWNoIHNldHVwIHRhYmxlcworYXJlIGF2YWlsYWJsZSAoZS5nLiAyNTYwMCAtPiAyNDAwMCkuCitVc2VkIGZvciBzdGFydEZyZXEgY2FsY3VsYXRpb24uCitUaGUgbWFwcGluZyBpcyBkZWZpbmVkIGluIDE0NDk2LTMgKDQuNi4xOC4yLjYpLCBmcyhTQlIpLCBhbmQgdGFibGUgNC44MgogCi1pbnQgc2JyR2V0U2luZ2xlQ2hhbm5lbEVsZW1lbnQgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaEZyYW1lRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICBoQml0QnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUFNfREVDIGhQYXJhbWV0cmljU3RlcmVvRGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgIG92ZXJsYXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworXHJldHVybiAgbWFwcGVkIHNhbXBsaW5nIGZyZXF1ZW5jeQorKi8KK1VJTlQgc2JyZGVjX21hcFRvU3RkU2FtcGxlUmF0ZShVSU5UIGZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgaXNVc2FjKTsgLyohPCBPdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5ICovCiAKLWludCBzYnJHZXRDaGFubmVsUGFpckVsZW1lbnQgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhGcmFtZURhdGFMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBICBoRnJhbWVEYXRhUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCaXRCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICBvdmVybGFwKTsKK3ZvaWQgaW5pdFNiclByZXZGcmFtZURhdGEoSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lU2xvdHMpOworCitpbnQgc2JyR2V0Q2hhbm5lbEVsZW1lbnQoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgaEZyYW1lRGF0YUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhGcmFtZURhdGFSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoRnJhbWVEYXRhTGVmdFByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgcHZjX21vZGVfbGFzdCwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUFNfREVDIGhQYXJhbWV0cmljU3RlcmVvRGVjLCBjb25zdCBVSU5UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvdmVybGFwKTsKIAogU0JSX0hFQURFUl9TVEFUVVMKLXNickdldEhlYWRlckRhdGEgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgIGZJc1NickRhdGEpOworc2JyR2V0SGVhZGVyRGF0YShIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsIGNvbnN0IFVJTlQgZmxhZ3MsCisgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmSXNTYnJEYXRhLCBjb25zdCBVQ0hBUiBjb25maWdNb2RlKTsKIAogLyohCiAgIFxicmllZiAgICAgSW5pdGlhbGl6ZSBTQlIgaGVhZGVyIGRhdGEKQEAgLTMxNCwxMSArNDA0LDEyIEBACiAgIGRlcGVuZGluZyBvbiB0aGUgY29yZSBjb2RlYy4KICovCiBTQlJfRVJST1IKLWluaXRIZWFkZXJEYXRhICgKLSAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSAgaEhlYWRlckRhdGEsCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgIHNhbXBsZVJhdGVJbiwKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgc2FtcGxlUmF0ZU91dCwKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICBmbGFncwotICAgICAgICApOworaW5pdEhlYWRlckRhdGEoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgY29uc3QgaW50IHNhbXBsZVJhdGVJbiwKKyAgICAgICAgICAgICAgIGNvbnN0IGludCBzYW1wbGVSYXRlT3V0LCBjb25zdCBJTlQgZG93bnNjYWxlRmFjdG9yLAorICAgICAgICAgICAgICAgY29uc3QgaW50IHNhbXBsZXNQZXJGcmFtZSwgY29uc3QgVUlOVCBmbGFncywKKyAgICAgICAgICAgICAgIGNvbnN0IGludCBzZXREZWZhdWx0SGRyKTsKICNlbmRpZgorCisvKiBDb252ZXJ0IGhlYWRyb29tIGJpdHMgdG8gZXhwb25lbnQgKi8KKyNkZWZpbmUgU0NBTEUyRVhQKHMpICgxNSAtIChzKSkKKyNkZWZpbmUgRVhQMlNDQUxFKGUpICgxNSAtIChlKSkKZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvaGJlLmNwcCBiL2xpYlNCUmRlYy9zcmMvaGJlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2IyMWM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliU0JSZGVjL3NyYy9oYmUuY3BwCkBAIC0wLDAgKzEsMjE5OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICBGYXN0IEZGVCByb3V0aW5lcyBwcm90b3R5cGVzCisgIFxhdXRob3IgRmFiaWFuIEhhdXNzZWwKKyovCisKKyNpbmNsdWRlICJoYmUuaCIKKyNpbmNsdWRlICJxbWYuaCIKKyNpbmNsdWRlICJlbnZfZXh0ci5oIgorCisjZGVmaW5lIEhCRV9NQVhfUU1GX0JBTkRTICg0MCkKKworI2RlZmluZSBIQkVfTUFYX09VVF9TTE9UUyAoMTEpCisKKyNkZWZpbmUgUU1GX1dJTl9MRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoMTIgKyA2IC0gNCAtIDEpIC8qIDYgc3ViYmFuZCBzbG90cyBleHRyYSBkZWxheSB0byBhbGlnbiB3aXRoIEhRIC0gNCBzbG90cyBcCisgICAgICAgICAgICAgICAgICAgICAgdG8gY29tcGVuc2F0ZSBmb3IgY3JpdGljYWwgc2FtcGxpbmcgZGVsYXkgLSAxIHNsb3QgdG8gIFwKKyAgICAgICAgICAgICAgICAgICAgICBhbGlnbiBjcml0aWNhbCBzYW1wbGluZyBleGFjdGx5ICh3IGFkZGl0aW9uYWwgdGltZSAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbiBkZWxheSkqLworCisjaWZuZGVmIFBJCisjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgaW50IHhQcm9kdWN0c1tNQVhfU1RSRVRDSF9IQkUgLSAxXSA9IHsKKyAgICAxLCAxLCAxfTsgLyogQ3Jvc3MgcHJvZHVjdHMgb24oMSkvb2ZmKDApIGZvciBUPTIsMyw0LiAqLworc3RhdGljIGNvbnN0IGludCBzdGFydFN1YmJhbmQya0xbMzNdID0geworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAyLCAgMiwgIDIsICA0LCAgNCwgIDQsICA0LCAgNCwgIDYsIDYsCisgICAgNiwgOCwgOCwgOCwgOCwgOCwgMTAsIDEwLCAxMCwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTJ9OworCitzdGF0aWMgY29uc3QgaW50IHBtaW4gPSAxMjsKKworc3RhdGljIGNvbnN0IEZJWFBfREJMIGhpbnRSZWFsX0ZbNF1bM10gPSB7CisgICAge0ZMMkZYQ09OU1RfREJMKDAuMzk4NDAzMzVmKSwgRkwyRlhDT05TVF9EQkwoMC4zOTg0MDMzNWYpLAorICAgICBGTDJGWENPTlNUX0RCTCgtMC4zOTg0MDMzNWYpfSwKKyAgICB7RkwyRlhDT05TVF9EQkwoMC4zOTg0MDMzNWYpLCBGTDJGWENPTlNUX0RCTCgtMC4zOTg0MDMzNWYpLAorICAgICBGTDJGWENPTlNUX0RCTCgtMC4zOTg0MDMzNWYpfSwKKyAgICB7RkwyRlhDT05TVF9EQkwoLTAuMzk4NDAzMzVmKSwgRkwyRlhDT05TVF9EQkwoLTAuMzk4NDAzMzVmKSwKKyAgICAgRkwyRlhDT05TVF9EQkwoMC4zOTg0MDMzNWYpfSwKKyAgICB7RkwyRlhDT05TVF9EQkwoLTAuMzk4NDAzMzVmKSwgRkwyRlhDT05TVF9EQkwoMC4zOTg0MDMzNWYpLAorICAgICBGTDJGWENPTlNUX0RCTCgwLjM5ODQwMzM1Zil9fTsKKworc3RhdGljIGNvbnN0IEZJWFBfREJMIGZhY3RvcnNbNF0gPSB7CisgICAgRkwyRlhDT05TVF9EQkwoMC4zOTg0MDMzNWYpLCBGTDJGWENPTlNUX0RCTCgtMC4zOTg0MDMzNWYpLAorICAgIEZMMkZYQ09OU1RfREJMKC0wLjM5ODQwMzM1ZiksIEZMMkZYQ09OU1RfREJMKDAuMzk4NDAzMzVmKX07CisKKyNkZWZpbmUgUFNDQUxFIDMyCisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBwX0ZbMTI4XSA9IHtGTDJGWENPTlNUX0RCTCgwLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMi5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgzLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDQuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoNS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg2LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDcuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoOC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg5LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEwLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDExLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEyLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEzLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDE0LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDE1LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDE2LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDE3LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDE4LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDE5LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDIwLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDIxLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDIyLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDIzLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDI0LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDI1LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDI2LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDI3LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDI4LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDI5LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDMwLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDMxLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDMyLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDMzLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDM0LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDM1LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDM2LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDM3LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDM4LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDM5LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDQwLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDQxLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDQyLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDQzLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDQ0LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDQ1LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDQ2LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDQ3LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDQ4LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDQ5LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDUwLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDUxLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDUyLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDUzLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDU0LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDU1LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDU2LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDU3LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDU4LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDU5LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDYwLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDYxLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDYyLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDYzLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDY0LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDY1LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDY2LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDY3LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDY4LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDY5LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDcwLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDcxLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDcyLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDczLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDc0LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDc1LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDc2LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDc3LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDc4LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDc5LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDgwLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDgxLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDgyLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDgzLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDg0LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDg1LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDg2LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDg3LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDg4LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDg5LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDkwLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDkxLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDkyLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDkzLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDk0LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDk1LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDk2LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDk3LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDk4LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDk5LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEwMC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMDEuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMTAyLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEwMy5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMDQuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMTA1LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEwNi5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMDcuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMTA4LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEwOS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMTAuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMTExLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDExMi5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMTMuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMTE0LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDExNS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMTYuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMTE3LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDExOC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMTkuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMTIwLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEyMS5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMjIuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMTIzLmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEyNC5mIC8gKFBTQ0FMRSAqIDEyLmYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxMjUuZiAvIChQU0NBTEUgKiAxMi5mKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMTI2LmYgLyAoUFNDQUxFICogMTIuZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEyNy5mIC8gKFBTQ0FMRSAqIDEyLmYpKX07CisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBiYW5kX0ZbNjRdID0geworICAgIEZMMkZYQ09OU1RfREJMKCgwLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgyLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgzLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg0LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg1LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg2LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg3LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg4LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg5LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxMC5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTEuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDEyLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxMy5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTQuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDE1LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxNi5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMTcuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDE4LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgxOS5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMjAuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDIxLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgyMi5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMjMuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDI0LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgyNS5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMjYuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDI3LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgyOC5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMjkuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDMwLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgzMS5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMzIuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDMzLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgzNC5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMzUuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDM2LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCgzNy5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoMzguZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDM5LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg0MC5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNDEuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDQyLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg0My5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNDQuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDQ1LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg0Ni5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNDcuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDQ4LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg0OS5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNTAuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDUxLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg1Mi5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNTMuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDU0LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg1NS5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNTYuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDU3LmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg1OC5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNTkuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDYwLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpLAorICAgIEZMMkZYQ09OU1RfREJMKCg2MS5mICogMi5mICsgMSkgLyAoUFNDQUxFIDw8IDIpKSwKKyAgICBGTDJGWENPTlNUX0RCTCgoNjIuZiAqIDIuZiArIDEpIC8gKFBTQ0FMRSA8PCAyKSksCisgICAgRkwyRlhDT05TVF9EQkwoKDYzLmYgKiAyLmYgKyAxKSAvIChQU0NBTEUgPDwgMikpfTsKKworc3RhdGljIGNvbnN0IEZJWFBfREJMIHRyX3N0clszXSA9IHtGTDJGWENPTlNUX0RCTCgxLmYgLyA0LmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgyLmYgLyA0LmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgzLmYgLyA0LmYpfTsKKworc3RhdGljIGNvbnN0IEZJWFBfREJMIHN0cmV0Y2hmYWNbM10gPSB7RkwyRlhDT05TVF9EQkwoMS5mIC8gMi5mKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDEuZiAvIDMuZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgxLmYgLyA0LmYpfTsKKworc3RhdGljIGNvbnN0IEZJWFBfREJMIGNvc19GWzY0XSA9IHsKKyAgICAyNjM1MzAyOCwgICAtNzkwNDMyMDgsICAgMTMxNjg1Nzc2LCAgLTE4NDI0NDk0NCwgIDIzNjY5NzIxNiwgIC0yODkwMDY5MTIsCisgICAgMzQxMTQyNDk2LCAgLTM5MzA3MjYwOCwgIDQ0NDc3Mzk4NCwgIC00OTYxOTEzOTIsICA1NDczMjU4MjQsICAtNTk4MTE0NzUyLAorICAgIDY0ODU1OTEwNCwgIC02OTg1OTcyNDgsICA3NDgyMzAwMTYsICAtNzk3NDExOTA0LCAgODQ2MDgzMjAwLCAgLTg5NDI3NTEzNiwKKyAgICA5NDE5MjgxOTIsICAtOTg5MDEzNzYwLCAgMTAzNTQ3NDYyNCwgLTEwODEzNDA2NzIsIDExMjY1NTUxMzYsIC0xMTcxMDYzMjk2LAorICAgIDEyMTQ4OTM2OTYsIC0xMjU3OTkyMTkyLCAxMzAwMzMyNTQ0LCAtMTM0MTg4OTQwOCwgMTM4MjYxMjczNiwgLTE0MjI1MDM4MDgsCisgICAgMTQ2MTU4Njk0NCwgLTE0OTk3NDE0NDAsIDE1MzcwMzkxMDQsIC0xNTczMzY0ODY0LCAxNjA4NzQzODA4LCAtMTY0MzE5NjY3MiwKKyAgICAxNjc2NjE3MzQ0LCAtMTcwOTAyODk5MiwgMTc0MDQ1MDU2MCwgLTE3NzA3ODQ4OTYsIDE4MDAwODk0NzIsIC0xODI4MjczNTM2LAorICAgIDE4NTUzNTc0NDAsIC0xODgxMzU2Mjg4LCAxOTA2MTkwMDgwLCAtMTkyOTg3NjYwOCwgMTk1MjQyODkyOCwgLTE5NzM3Nzc2NjQsCisgICAgMTk5Mzk2Mjg4MCwgLTIwMTI5MjIyNDAsIDIwMzA2NzAyMDgsIC0yMDQ3MjE2MDAwLCAyMDYyNTA4Mjg4LCAtMjA3NjU1OTQ4OCwKKyAgICAyMDg5Mzc2MTI4LCAtMjEwMDkzMjIyNCwgMjExMTE5NjgwMCwgLTIxMjAyMTQ3ODQsIDIxMjc5NTM3OTIsIC0yMTM0Mzk0MzY4LAorICAgIDIxMzk1NjUwNTYsIC0yMTQzNDQ0ODY0LCAyMTQ2MDI2NjI0LCAtMjE0NzMyMTg1Nn07CisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCB0d2lkZGxlWzEyMV0gPSB7MTA3Mzc0MTgyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA3MTQ0Mjg2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA2NDU1NTgxNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA1MzExMDE3NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAzNzE1NDk1OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxNjc1ODQ4NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTkyMDA4MDk0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjMwMDk3NzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkyOTg4NzY5NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODkyNzgzNjk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NTE4NTY2NjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwNzI4MTg0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzU5MjUwMTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDc5NjcxNzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1MzY1MjYwNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTk2NTM4OTk1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzY4NzA5MTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3NDkwMzg2NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDEwOTAzMjA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNDUxNDI5OTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3NzkwNDgzNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA5NDc2NjM4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDAxNTE0MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwMjI2MDc1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzAyMjYwNzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNDAxNTE0MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yMDk0NzY2MzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNzc5MDQ4MzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zNDUxNDI5OTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00MTA5MDMyMDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NzQ5MDM4NjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC01MzY4NzA5MTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC01OTY1Mzg5OTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02NTM2NTI2MDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MDc5NjcxNzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03NTkyNTAxMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04MDcyODE4NDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NTE4NTY2NjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04OTI3ODM2OTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05Mjk4ODc2OTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05NjMwMDk3NzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05OTIwMDgwOTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDE2NzU4NDg0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTAzNzE1NDk1OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNTMxMTAxNzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDY0NTU1ODE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA3MTQ0Mjg2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzM3NDE4MjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDcxNDQyODYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTA2NDU1NTgxNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNTMxMTAxNzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDM3MTU0OTU5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTAxNjc1ODQ4NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTk5MjAwODA5NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTk2MzAwOTc3MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTkyOTg4NzY5NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg5Mjc4MzY5OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg1MTg1NjY2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTgwNzI4MTg0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTc1OTI1MDEyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcwNzk2NzE3OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTY1MzY1MjYwNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTU5NjUzODk5NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTUzNjg3MDkxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTQ3NDkwMzg2NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTQxMDkwMzIwNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTM0NTE0Mjk5OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTI3NzkwNDgzNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIwOTQ3NjYzOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE0MDE1MTQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcwMjI2MDc1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDIyNjA3NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQwMTUxNDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDk0NzY2MzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3NzkwNDgzNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQ1MTQyOTk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MTA5MDMyMDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3NDkwMzg2NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM2ODcwOTEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTY1Mzg5OTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1MzY1MjYwNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzA3OTY3MTc4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NTkyNTAxMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwNzI4MTg0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODUxODU2NjYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OTI3ODM2OTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkyOTg4NzY5NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYzMDA5NzczLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5OTIwMDgwOTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTY3NTg0ODQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMzcxNTQ5NTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNTMxMTAxNzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNjQ1NTU4MTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNzE0NDI4NjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNzM3NDE4MjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNzE0NDI4NjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNjQ1NTU4MTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNTMxMTAxNzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMzcxNTQ5NTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTY3NTg0ODQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk5MjAwODA5NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYzMDA5NzczLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5Mjk4ODc2OTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg5Mjc4MzY5OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODUxODU2NjYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDcyODE4NDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc1OTI1MDEyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzA3OTY3MTc4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTM2NTI2MDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5NjUzODk5NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM2ODcwOTEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzQ5MDM4NjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxMDkwMzIwNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQ1MTQyOTk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzc5MDQ4MzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwOTQ3NjYzOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQwMTUxNDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDIyNjA3NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH07CisKKyNpZiBGSVhQX1FUVyA9PSBGSVhQX1NHTAorI2RlZmluZSBIVFcoeCkgKHgpCisjZWxzZQorI2RlZmluZSBIVFcoeCkgRlhfREJMMkZYX1FUVyhGWF9TR0wyRlhfREJMKChjb25zdCBGSVhQX1NHTCl4KSkKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgRklYUF9RVFcgcG9zdF90d2lkZGxlX2Nvc184WzhdID0geworICAgIEhUVygtMTYwNiksICBIVFcoNDc1NiksICBIVFcoLTc3MjMpLCAgSFRXKDEwMzk0KSwKKyAgICBIVFcoLTEyNjY1KSwgSFRXKDE0NDQ5KSwgSFRXKC0xNTY3OSksIEhUVygxNjMwNSl9OworCitzdGF0aWMgY29uc3QgRklYUF9RVFcgcG9zdF90d2lkZGxlX2Nvc18xNlsxNl0gPSB7CisgICAgSFRXKC04MDQpLCAgIEhUVygyNDA0KSwgIEhUVygtMzk4MSksICBIVFcoNTUyMCksICBIVFcoLTcwMDUpLCAgSFRXKDg0MjMpLAorICAgIEhUVygtOTc2MCksICBIVFcoMTEwMDMpLCBIVFcoLTEyMTQwKSwgSFRXKDEzMTYwKSwgSFRXKC0xNDA1MyksIEhUVygxNDgxMSksCisgICAgSFRXKC0xNTQyNiksIEhUVygxNTg5MyksIEhUVygtMTYyMDcpLCBIVFcoMTYzNjQpfTsKKworc3RhdGljIGNvbnN0IEZJWFBfUVRXIHBvc3RfdHdpZGRsZV9jb3NfMjRbMjRdID0geworICAgIEhUVygtNTM2KSwgICBIVFcoMTYwNiksICBIVFcoLTI2NjkpLCAgSFRXKDM3MjApLCAgSFRXKC00NzU2KSwgIEhUVyg1NzcxKSwKKyAgICBIVFcoLTY3NjIpLCAgSFRXKDc3MjMpLCAgSFRXKC04NjUyKSwgIEhUVyg5NTQzKSwgIEhUVygtMTAzOTQpLCBIVFcoMTEyMDApLAorICAgIEhUVygtMTE5NTgpLCBIVFcoMTI2NjUpLCBIVFcoLTEzMzE4KSwgSFRXKDEzOTEzKSwgSFRXKC0xNDQ0OSksIEhUVygxNDkyNCksCisgICAgSFRXKC0xNTMzNCksIEhUVygxNTY3OSksIEhUVygtMTU5NTYpLCBIVFcoMTYxNjUpLCBIVFcoLTE2MzA1KSwgSFRXKDE2Mzc1KX07CisKK3N0YXRpYyBjb25zdCBGSVhQX1FUVyBwb3N0X3R3aWRkbGVfY29zXzMyWzMyXSA9IHsKKyAgICBIVFcoLTQwMiksICAgSFRXKDEyMDUpLCAgSFRXKC0yMDA2KSwgIEhUVygyODAxKSwgIEhUVygtMzU5MCksICBIVFcoNDM3MCksCisgICAgSFRXKC01MTM5KSwgIEhUVyg1ODk3KSwgIEhUVygtNjYzOSksICBIVFcoNzM2NiksICBIVFcoLTgwNzYpLCAgSFRXKDg3NjUpLAorICAgIEhUVygtOTQzNCksICBIVFcoMTAwODApLCBIVFcoLTEwNzAyKSwgSFRXKDExMjk3KSwgSFRXKC0xMTg2NiksIEhUVygxMjQwNiksCisgICAgSFRXKC0xMjkxNiksIEhUVygxMzM5NSksIEhUVygtMTM4NDIpLCBIVFcoMTQyNTYpLCBIVFcoLTE0NjM1KSwgSFRXKDE0OTc4KSwKKyAgICBIVFcoLTE1Mjg2KSwgSFRXKDE1NTU3KSwgSFRXKC0xNTc5MSksIEhUVygxNTk4NiksIEhUVygtMTYxNDMpLCBIVFcoMTYyNjEpLAorICAgIEhUVygtMTYzNDApLCBIVFcoMTYzNzkpfTsKKworc3RhdGljIGNvbnN0IEZJWFBfUVRXIHBvc3RfdHdpZGRsZV9jb3NfNDBbNDBdID0geworICAgIEhUVygtMzIyKSwgICBIVFcoOTY1KSwgICBIVFcoLTE2MDYpLCAgSFRXKDIyNDUpLCAgSFRXKC0yODgwKSwgIEhUVygzNTExKSwKKyAgICBIVFcoLTQxMzcpLCAgSFRXKDQ3NTYpLCAgSFRXKC01MzY4KSwgIEhUVyg1OTcxKSwgIEhUVygtNjU2NiksICBIVFcoNzE1MCksCisgICAgSFRXKC03NzIzKSwgIEhUVyg4Mjg1KSwgIEhUVygtODgzMyksICBIVFcoOTM2OCksICBIVFcoLTk4ODkpLCAgSFRXKDEwMzk0KSwKKyAgICBIVFcoLTEwODgzKSwgSFRXKDExMzU2KSwgSFRXKC0xMTgxMCksIEhUVygxMjI0NyksIEhUVygtMTI2NjUpLCBIVFcoMTMwNjMpLAorICAgIEhUVygtMTM0NDEpLCBIVFcoMTM3OTkpLCBIVFcoLTE0MTM1KSwgSFRXKDE0NDQ5KSwgSFRXKC0xNDc0MSksIEhUVygxNTAxMSksCisgICAgSFRXKC0xNTI1NyksIEhUVygxNTQ4MCksIEhUVygtMTU2NzkpLCBIVFcoMTU4NTMpLCBIVFcoLTE2MDAzKSwgSFRXKDE2MTI5KSwKKyAgICBIVFcoLTE2MjI5KSwgSFRXKDE2MzA1KSwgSFRXKC0xNjM1NiksIEhUVygxNjM4MSl9OworCitzdGF0aWMgY29uc3QgRklYUF9RVFcgcG9zdF90d2lkZGxlX3Npbl84WzhdID0geworICAgIEhUVygxNjMwNSksIEhUVygtMTU2NzkpLCBIVFcoMTQ0NDkpLCBIVFcoLTEyNjY1KSwKKyAgICBIVFcoMTAzOTQpLCBIVFcoLTc3MjMpLCAgSFRXKDQ3NTYpLCAgSFRXKC0xNjA2KX07CisKK3N0YXRpYyBjb25zdCBGSVhQX1FUVyBwb3N0X3R3aWRkbGVfc2luXzE2WzE2XSA9IHsKKyAgICBIVFcoMTYzNjQpLCBIVFcoLTE2MjA3KSwgSFRXKDE1ODkzKSwgSFRXKC0xNTQyNiksIEhUVygxNDgxMSksIEhUVygtMTQwNTMpLAorICAgIEhUVygxMzE2MCksIEhUVygtMTIxNDApLCBIVFcoMTEwMDMpLCBIVFcoLTk3NjApLCAgSFRXKDg0MjMpLCAgSFRXKC03MDA1KSwKKyAgICBIVFcoNTUyMCksICBIVFcoLTM5ODEpLCAgSFRXKDI0MDQpLCAgSFRXKC04MDQpfTsKKworc3RhdGljIGNvbnN0IEZJWFBfUVRXIHBvc3RfdHdpZGRsZV9zaW5fMjRbMjRdID0geworICAgIEhUVygxNjM3NSksIEhUVygtMTYzMDUpLCBIVFcoMTYxNjUpLCBIVFcoLTE1OTU2KSwgSFRXKDE1Njc5KSwgSFRXKC0xNTMzNCksCisgICAgSFRXKDE0OTI0KSwgSFRXKC0xNDQ0OSksIEhUVygxMzkxMyksIEhUVygtMTMzMTgpLCBIVFcoMTI2NjUpLCBIVFcoLTExOTU4KSwKKyAgICBIVFcoMTEyMDApLCBIVFcoLTEwMzk0KSwgSFRXKDk1NDMpLCAgSFRXKC04NjUyKSwgIEhUVyg3NzIzKSwgIEhUVygtNjc2MiksCisgICAgSFRXKDU3NzEpLCAgSFRXKC00NzU2KSwgIEhUVygzNzIwKSwgIEhUVygtMjY2OSksICBIVFcoMTYwNiksICBIVFcoLTUzNil9OworCitzdGF0aWMgY29uc3QgRklYUF9RVFcgcG9zdF90d2lkZGxlX3Npbl8zMlszMl0gPSB7CisgICAgSFRXKDE2Mzc5KSwgSFRXKC0xNjM0MCksIEhUVygxNjI2MSksIEhUVygtMTYxNDMpLCBIVFcoMTU5ODYpLCBIVFcoLTE1NzkxKSwKKyAgICBIVFcoMTU1NTcpLCBIVFcoLTE1Mjg2KSwgSFRXKDE0OTc4KSwgSFRXKC0xNDYzNSksIEhUVygxNDI1NiksIEhUVygtMTM4NDIpLAorICAgIEhUVygxMzM5NSksIEhUVygtMTI5MTYpLCBIVFcoMTI0MDYpLCBIVFcoLTExODY2KSwgSFRXKDExMjk3KSwgSFRXKC0xMDcwMiksCisgICAgSFRXKDEwMDgwKSwgSFRXKC05NDM0KSwgIEhUVyg4NzY1KSwgIEhUVygtODA3NiksICBIVFcoNzM2NiksICBIVFcoLTY2MzkpLAorICAgIEhUVyg1ODk3KSwgIEhUVygtNTEzOSksICBIVFcoNDM3MCksICBIVFcoLTM1OTApLCAgSFRXKDI4MDEpLCAgSFRXKC0yMDA2KSwKKyAgICBIVFcoMTIwNSksICBIVFcoLTQwMil9OworCitzdGF0aWMgY29uc3QgRklYUF9RVFcgcG9zdF90d2lkZGxlX3Npbl80MFs0MF0gPSB7CisgICAgSFRXKDE2MzgxKSwgSFRXKC0xNjM1NiksIEhUVygxNjMwNSksIEhUVygtMTYyMjkpLCBIVFcoMTYxMjkpLCBIVFcoLTE2MDAzKSwKKyAgICBIVFcoMTU4NTMpLCBIVFcoLTE1Njc5KSwgSFRXKDE1NDgwKSwgSFRXKC0xNTI1NyksIEhUVygxNTAxMSksIEhUVygtMTQ3NDEpLAorICAgIEhUVygxNDQ0OSksIEhUVygtMTQxMzUpLCBIVFcoMTM3OTkpLCBIVFcoLTEzNDQxKSwgSFRXKDEzMDYzKSwgSFRXKC0xMjY2NSksCisgICAgSFRXKDEyMjQ3KSwgSFRXKC0xMTgxMCksIEhUVygxMTM1NiksIEhUVygtMTA4ODMpLCBIVFcoMTAzOTQpLCBIVFcoLTk4ODkpLAorICAgIEhUVyg5MzY4KSwgIEhUVygtODgzMyksICBIVFcoODI4NSksICBIVFcoLTc3MjMpLCAgSFRXKDcxNTApLCAgSFRXKC02NTY2KSwKKyAgICBIVFcoNTk3MSksICBIVFcoLTUzNjgpLCAgSFRXKDQ3NTYpLCAgSFRXKC00MTM3KSwgIEhUVygzNTExKSwgIEhUVygtMjg4MCksCisgICAgSFRXKDIyNDUpLCAgSFRXKC0xNjA2KSwgIEhUVyg5NjUpLCAgIEhUVygtMzIyKX07CisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBwcmVNb2RDb3NbMzJdID0geworICAgIC03NDk4NzU3NzYsIDc4NjY4MTUzNiwgICA3MTEyNjM1NTIsICAtODIxNTkyMDY0LCAgLTY3MDkzNzc5MiwgODU0NTIzMzkyLAorICAgIDYyODk5NTY0OCwgIC04ODUzOTYwMzIsICAtNTg1NTM4MjQwLCA5MTQxMzU2ODAsICAgNTQwNjcwMjA4LCAgLTk0MDY3MzA4OCwKKyAgICAtNDk0NDk5NjgwLCA5NjQ5NDQzODQsICAgNDQ3MTM3ODI0LCAgLTk4Njg5MTAwOCwgIC0zOTg2OTg4MTYsIDEwMDY0NjAwOTYsCisgICAgMzQ5Mjk5MjY0LCAgLTEwMjM2MDQ1NDQsIC0yOTkwNTgyNDAsIDEwMzgyODMwNzIsICAyNDgwOTY3NTIsICAtMTA1MDQ2MDI4OCwKKyAgICAtMTk2NTM3NTg0LCAxMDYwMTA2ODE2LCAgMTQ0NTA0OTI4LCAgLTEwNjcxOTk0ODgsIC05MjEyNDE2MCwgIDEwNzE3MjExNTIsCisgICAgMzk1MjE0NTYsICAgLTEwNzM2NjA5OTJ9OworCitzdGF0aWMgY29uc3QgRklYUF9EQkwgcHJlTW9kU2luWzMyXSA9IHsKKyAgICA3Njg1MTAxNDQsICAgNzMwNzg5NzYwLCAgLTgwNDM3OTA3MiwgIC02OTEzMDg4NjQsIDgzODMxMDIwOCwgICA2NTAxNjI1NjAsCisgICAgLTg3MDIyMTc2MCwgIC02MDc0NDk5MjAsIDkwMDAzNjkyOCwgICA1NjMyNzM4NTYsICAtOTI3NjgzNzc2LCAgLTUxNzc0MDg5NiwKKyAgICA5NTMwOTU4MDgsICAgNDcwOTYwNjA4LCAgLTk3NjIxMTcxMiwgIC00MjMwNDU3MjgsIDk5Njk3NTgwOCwgICAzNzQxMTE3MTIsCisgICAgLTEwMTUzMzgxMTIsIC0zMjQyNzY0MTYsIDEwMzEyNTQ0MDAsICAyNzM2NTk5MDQsICAtMTA0NDY4NjMzNiwgLTIyMjM4NDE0NCwKKyAgICAxMDU1NjAxNDcyLCAgMTcwNTcyNjQwLCAgLTEwNjM5NzM2MzIsIC0xMTgzNTAxOTIsIDEwNjk3ODI1MjgsICA2NTg0MjY0MCwKKyAgICAtMTA3MzAxNDIwOCwgLTEzMTc2NDY0fTsKKworLyogVGhlIGN1YmUgcm9vdCBmdW5jdGlvbiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IGludkN1YmVSb290Tm9ybTIKKyAgICBkZXNjcmlwdGlvbjogIGRlbGl2ZXJzIDEvY3ViZXJvb3Qob3ApIGluIFExLjMxIGZvcm1hdCBhbmQgbW9kaWZpZWQgZXhwb25lbnQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENVQkVfUk9PVF9CSVRTIDcKKyNkZWZpbmUgQ1VCRV9ST09UX1ZBTFVFUyAoMTI4ICsgMikKKyNkZWZpbmUgQ1VCRV9ST09UX0JJVFNfTUFTSyAweDdmCisjZGVmaW5lIENVQkVfUk9PVF9GUkFDVF9CSVRTX01BU0sgMHgwMDdGRkZGRgorLyogSW52ZXJzZSBjdWJlIHJvb3QgdGFibGUgZm9yIG9wZXJhbmRzIHJ1bm5pbmcgZnJvbSAwLjUgdG8gMS4wICovCisvKiAoSU5UKSAoMS4wL2N1YmVyb290KChvcCkpKTsgICAgICAgICAgICAgICAgICAgICovCisvKiBJbXBsaWNpdCBleHBvbmVudCBpcyAxLiAgICAgICAgICAgICAgICAgICAgICAgICovCisKK0xOS19TRUNUSU9OX0NPTlNUREFUQQorc3RhdGljIGNvbnN0IEZJWFBfREJMIGludkN1YmVSb290VGFiW0NVQkVfUk9PVF9WQUxVRVNdID0geworICAgICgweDUwYTI4YmU2KSwgKDB4NTA2ZDExNzIpLCAoMHg1MDM4MjNjNCksICgweDUwMDNjMDVhKSwgKDB4NGZjZmU0YzApLAorICAgICgweDRmOWM4ZTkyKSwgKDB4NGY2OWJiN2QpLCAoMHg0ZjM3NjkzYiksICgweDRmMDU5NTk0KSwgKDB4NGVkNDNlNWYpLAorICAgICgweDRlYTM2MTgxKSwgKDB4NGU3MmZjZWEpLCAoMHg0ZTQzMGU5OCksICgweDRlMTM5NDk1KSwgKDB4NGRlNDhjZjUpLAorICAgICgweDRkYjVmNWRiKSwgKDB4NGQ4N2NkNzMpLCAoMHg0ZDVhMTFmMiksICgweDRkMmNjMTljKSwgKDB4NGNmZmRhYmIpLAorICAgICgweDRjZDM1YmE0KSwgKDB4NGNhNzQyYjcpLCAoMHg0YzdiOGU1YyksICgweDRjNTAzZDA1KSwgKDB4NGMyNTRkMmEpLAorICAgICgweDRiZmFiZDUwKSwgKDB4NGJkMDhjMDApLCAoMHg0YmE2YjdjZCksICgweDRiN2QzZjUzKSwgKDB4NGI1NDIxMzQpLAorICAgICgweDRiMmI1YzE4KSwgKDB4NGIwMmVlYjEpLCAoMHg0YWRhZDdiOCksICgweDRhYjMxNWVhKSwgKDB4NGE4YmE4MGQpLAorICAgICgweDRhNjQ4Y2VjKSwgKDB4NGEzZGMzNWIpLCAoMHg0YTE3NGEzMCksICgweDQ5ZjEyMDRhKSwgKDB4NDljYjQ0OGQpLAorICAgICgweDQ5YTViNWUyKSwgKDB4NDk4MDczMzkpLCAoMHg0OTViN2I4NiksICgweDQ5MzZjZGMyKSwgKDB4NDkxMjY4ZWMpLAorICAgICgweDQ4ZWU0YzA4KSwgKDB4NDhjYTc2MWYpLCAoMHg0OGE2ZTYzZSksICgweDQ4ODM5Yjc2KSwgKDB4NDg2MDk0ZGUpLAorICAgICgweDQ4M2RkMTkwKSwgKDB4NDgxYjUwYWQpLCAoMHg0N2Y5MTE1NiksICgweDQ3ZDcxMmIzKSwgKDB4NDdiNTUzZjApLAorICAgICgweDQ3OTNkNDNjKSwgKDB4NDc3MjkyYzkpLCAoMHg0NzUxOGVjZSksICgweDQ3MzBjNzg1KSwgKDB4NDcxMDNjMmQpLAorICAgICgweDQ2ZWZlYzA2KSwgKDB4NDZjZmQ2NTUpLCAoMHg0NmFmZmE2MSksICgweDQ2OTA1Nzc3KSwgKDB4NDY3MGVjZTQpLAorICAgICgweDQ2NTFiOWY5KSwgKDB4NDYzMmJlMGIpLCAoMHg0NjEzZjg3MSksICgweDQ1ZjU2ODg1KSwgKDB4NDVkNzBkYTUpLAorICAgICgweDQ1YjhlNzJmKSwgKDB4NDU5YWY0ODcpLCAoMHg0NTdkMzUxMSksICgweDQ1NWZhODM1KSwgKDB4NDU0MjRkNWQpLAorICAgICgweDQ1MjUyM2Y2KSwgKDB4NDUwODJiNmUpLCAoMHg0NGViNjMzNyksICgweDQ0Y2VjYWM1KSwgKDB4NDRiMjYxOGQpLAorICAgICgweDQ0OTYyNzA4KSwgKDB4NDQ3YTFhYjEpLCAoMHg0NDVlM2MwMiksICgweDQ0NDI4YTdjKSwgKDB4NDQyNzA1OWUpLAorICAgICgweDQ0MGJhY2VjKSwgKDB4NDNmMDdmZTkpLCAoMHg0M2Q1N2UxYyksICgweDQzYmFhNzBlKSwgKDB4NDM5ZmZhNDgpLAorICAgICgweDQzODU3NzU3KSwgKDB4NDM2YjFkYzgpLCAoMHg0MzUwZWQyYiksICgweDQzMzZlNTExKSwgKDB4NDMxZDA1MGMpLAorICAgICgweDQzMDM0Y2IyKSwgKDB4NDJlOWJiOTgpLCAoMHg0MmQwNTE1NiksICgweDQyYjcwZDg1KSwgKDB4NDI5ZGVmYzApLAorICAgICgweDQyODRmN2EyKSwgKDB4NDI2YzI0Y2IpLCAoMHg0MjUzNzZkOCksICgweDQyM2FlZDZhKSwgKDB4NDIyMjg4MjMpLAorICAgICgweDQyMGE0NmE2KSwgKDB4NDFmMjI4OTgpLCAoMHg0MWRhMmQ5ZiksICgweDQxYzI1NTYxKSwgKDB4NDFhYTlmODYpLAorICAgICgweDQxOTMwYmJhKSwgKDB4NDE3Yjk5YTUpLCAoMHg0MTY0NDhmNSksICgweDQxNGQxOTU2KSwgKDB4NDEzNjBhNzYpLAorICAgICgweDQxMWYxYzA2KSwgKDB4NDEwODRkYjUpLCAoMHg0MGYxOWYzNSksICgweDQwZGIxMDM5KSwgKDB4NDBjNGEwNzQpLAorICAgICgweDQwYWU0ZjliKSwgKDB4NDA5ODFkNjQpLCAoMHg0MDgyMDk4NSksICgweDQwNmMxM2I2KSwgKDB4NDA1NjNiYjEpLAorICAgICgweDQwNDA4MTJlKSwgKDB4NDAyYWUzZTcpLCAoMHg0MDE1NjM5OSksICgweDQwMDAwMDAwKSwgKDB4M0ZFQUI4RDkpfTsKKy8qICBuLmEuICAqLworc3RhdGljIGNvbnN0IEZJWFBfREJMIGludkN1YmVSb290Q29ycmVjdGlvblszXSA9IHsweDQwMDAwMDAwLCAweDUwQTI4QkU2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY1OTdGQTk1fTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBcYnJpZWYgY2FsY3VsYXRlIDEuMC9jdWJlX3Jvb3Qob3ApLCBvcCBjb250YWlucyBtYW50aXNzYSBhbmQgZXhwb25lbnQKKyAqIFxwYXJhbSBvcF9tOiAoaSkgbWFudGlzc2Egb2Ygb3BlcmFuZCwgbXVzdCBub3QgYmUgemVybyAoMHgwMDAwLjAwMDApIG9yCisgKiBuZWdhdGl2ZQorICogXHBhcmFtIG9wX2U6IChpKSBwb2ludGVyIHRvIHRoZSBleHBvbmVudCBvZiB0aGUgb3BlcmFuZCAobXVzdCBiZSBpbml0aWFsaXplZCkKKyAqIGFuZCAuLiAobykgcG9pbnRlciB0byB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdAorICogXHJldHVybjogICAgIChvKSBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CisgKiBcZGVzY3JpcHRpb246CisgKiAgVGhpcyByb3V0aW5lIGNhbGN1bGF0ZXMgdGhlIGN1YmUgcm9vdCBvZiB0aGUgaW5wdXQgb3BlcmFuZCwgdGhhdCBpcworICogIGdpdmVuIHdpdGggaXRzIG1hbnRpc3NhIGluIFEzMSBmb3JtYXQgKEZJWFBfREJMKSBhbmQgaXRzIGV4cG9uZW50IChJTlQpLgorICogIFRoZSByZXN1bHRpbmcgbWFudGlzc2EgaXMgcmV0dXJuZWQgaW4gZm9ybWF0IFEzMS4gVGhlIGV4cG9uZW50ICgqb3BfZSkKKyAqICBpcyBtb2RpZmllZCBhY2NvcmRpbmdseS4gSXQgaXMgbm90IGFzc3VyZWQsIHRoYXQgdGhlIHJlc3VsdCBpcyBmdWxseQorICogbGVmdC1hbGlnbmVkIGJ1dCBhc3N1bWVkIHRvIGhhdmUgbm90IG1vcmUgdGhhbiAyIGJpdHMgaGVhZHJvb20uIFRoZXJlIGlzIG9uZQorICogbWFjcm8gdG8gYWN0aXZhdGUgdGhlIHVzZSBvZiB0aGlzIGFsZ29yaXRobTogRlVOQ1RJT05faW52Q3ViZVJvb3ROb3JtMiBCeQorICogbWVhbnMgb2YgYWN0aXZhdGluZyB0aGUgbWFjcm8gSU5WQ1VCRVJPT1ROT1JNMl9MSU5FQVJfSU5URVJQT0xBVEVfSFEsIGEKKyAqIHNsaWdodGx5IGhpZ2hlciBwcmVjaXNpb24gaXMgcmVhY2hhYmxlIChieSBkZWZhdWx0LCBub3QgYWN0aXZlKS4gRm9yIERFQlVHCisgKiBwdXJwb3NlIG9ubHk6IGEgRkRLX0FTU0VSVCBtYWNybyB2YWxpZGF0ZXMsIGlmIHRoZSBpbnB1dCBtYW50aXNzYSBpcyBncmVhdGVyCisgKiB6ZXJvLgorICoKKyAqLworc3RhdGljCisjaWZkZWYgX19hcm1fXworICAgIEZJWFBfREJMIF9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUpKQorICAgIGludkN1YmVSb290Tm9ybTIoRklYUF9EQkwgb3BfbSwgSU5UKiBvcF9lKQorI2Vsc2UKKyAgICBGSVhQX0RCTAorICAgIGludkN1YmVSb290Tm9ybTIoRklYUF9EQkwgb3BfbSwgSU5UKiBvcF9lKQorI2VuZGlmCit7CisgIEZES19BU1NFUlQob3BfbSA+IEZJWFBfREJMKDApKTsKKworICAvKiBub3JtYWxpemUgaW5wdXQsIGNhbGN1bGF0ZSBzaGlmdCB2YWx1ZSAqLworICBJTlQgZXhwb25lbnQgPSAoSU5UKWZOb3JteihvcF9tKSAtIDE7CisgIG9wX20gPDw9IGV4cG9uZW50OworCisgIElOVCBpbmRleCA9IChJTlQpKG9wX20gPj4gKERGUkFDVF9CSVRTIC0gMSAtIChDVUJFX1JPT1RfQklUUyArIDEpKSkgJgorICAgICAgICAgICAgICBDVUJFX1JPT1RfQklUU19NQVNLOworICBGSVhQX0RCTCBmcmFjdCA9IChGSVhQX0RCTCkoKChJTlQpb3BfbSAmIENVQkVfUk9PVF9GUkFDVF9CSVRTX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoQ1VCRV9ST09UX0JJVFMgKyAxKSk7CisgIEZJWFBfREJMIGRpZmYgPSBpbnZDdWJlUm9vdFRhYltpbmRleCArIDFdIC0gaW52Q3ViZVJvb3RUYWJbaW5kZXhdOworICBvcF9tID0gZk11bHRBZGREaXYyKGludkN1YmVSb290VGFiW2luZGV4XSwgZGlmZiA8PCAxLCBmcmFjdCk7CisjaWYgZGVmaW5lZChJTlZDVUJFUk9PVE5PUk0yX0xJTkVBUl9JTlRFUlBPTEFURV9IUSkKKyAgLyogcmVnMSA9IHRbaV0gKyAodFtpKzFdLXRbaV0pKmZyYWN0IC4uLiBhbHJlYWR5IGNvbXB1dGVkIC4uLiArCisgICAqICgxLWZyYWN0KWZyYWN0Kih0W2krMl0tdFtpKzFdKS8yICovCisgIGlmIChmcmFjdCAhPSAoRklYUF9EQkwpMCkgeworICAgIC8qIGZyYWN0ID0gZnJhY3QgKiAoMSAtIGZyYWN0KSAqLworICAgIGZyYWN0ID0gZk11bHREaXYyKGZyYWN0LCAoRklYUF9EQkwpKChMT05HKTB4ODAwMDAwMDAgLSAoTE9ORylmcmFjdCkpIDw8IDE7CisgICAgZGlmZiA9IGRpZmYgLSAoaW52Q3ViZVJvb3RUYWJbaW5kZXggKyAyXSAtIGludkN1YmVSb290VGFiW2luZGV4ICsgMV0pOworICAgIG9wX20gPSBmTXVsdEFkZERpdjIob3BfbSwgZnJhY3QsIGRpZmYpOworICB9CisjZW5kaWYgLyogSU5WQ1VCRVJPT1ROT1JNMl9MSU5FQVJfSU5URVJQT0xBVEVfSFEgKi8KKworICAvKiBjYWxjdWxhdGUgdGhlIG91dHB1dCBleHBvbmVudCA9IGlucHV0ICogZXhwLzMgPSBjdWJpY3Jvb3QobSkqMl4oZXhwLzMpCisgICAqIHdoZXJlIDJeKGV4cC8zKSA9IDJeaycqMiBvciAyXmsnKjJeKDEvMykgb3IgMl5rJyoyXigyLzMpICovCisgIGV4cG9uZW50ID0gZXhwb25lbnQgLSAqb3BfZSArIDM7CisgIElOVCBzaGlmdF90bXAgPQorICAgICAgKChJTlQpZk11bHREaXYyKChGSVhQX1NHTClmQWJzKGV4cG9uZW50KSwgKEZJWFBfU0dMKTB4NTU1NikpID4+IDE2OworICBpZiAoZXhwb25lbnQgPCAwKSB7CisgICAgc2hpZnRfdG1wID0gLXNoaWZ0X3RtcDsKKyAgfQorICBJTlQgcmVtID0gZXhwb25lbnQgLSAzICogc2hpZnRfdG1wOworICBpZiAocmVtIDwgMCkgeworICAgIHJlbSArPSAzOworICAgIHNoaWZ0X3RtcC0tOworICB9CisKKyAgKm9wX2UgPSBzaGlmdF90bXA7CisgIG9wX20gPSBmTXVsdERpdjIob3BfbSwgaW52Q3ViZVJvb3RDb3JyZWN0aW9uW3JlbV0pIDw8IDI7CisKKyAgcmV0dXJuIChvcF9tKTsKK30KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgZnVuY3Rpb25uYW1lOiBpbnZGb3VydGhSb290Tm9ybTIKKyAgICAgIGRlc2NyaXB0aW9uOiAgZGVsaXZlcnMgMS9Gb3VydGhSb290KG9wKSBpbiBRMS4zMSBmb3JtYXQgYW5kIG1vZGlmaWVkCisgIGV4cG9uZW50CisKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRk9VUlRIUk9PVF9CSVRTIDcKKyNkZWZpbmUgRk9VUlRIUk9PVF9WQUxVRVMgKDEyOCArIDIpCisjZGVmaW5lIEZPVVJUSFJPT1RfQklUU19NQVNLIDB4N2YKKyNkZWZpbmUgRk9VUlRIUk9PVF9GUkFDVF9CSVRTX01BU0sgMHgwMDdGRkZGRgorCitMTktfU0VDVElPTl9DT05TVERBVEEKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBpbnZGb3VydGhSb290VGFiW0ZPVVJUSFJPT1RfVkFMVUVTXSA9IHsKKyAgICAoMHg0YzFiZjgyOSksICgweDRiZjYxOTc3KSwgKDB4NGJkMDk4NDMpLCAoMHg0YmFiNzJlZiksICgweDRiODZhN2ViKSwKKyAgICAoMHg0YjYyMzVhYyksICgweDRiM2UxYWI2KSwgKDB4NGIxYTU1OTIpLCAoMHg0YWY2ZTRkNCksICgweDRhZDNjNzE4KSwKKyAgICAoMHg0YWIwZmIwMyksICgweDRhOGU3ZjQyKSwgKDB4NGE2YzUyODgpLCAoMHg0YTRhNzM5MyksICgweDRhMjhlMTI2KSwKKyAgICAoMHg0YTA3OWEwYyksICgweDQ5ZTY5ZDE2KSwgKDB4NDljNWU5MWYpLCAoMHg0OWE1N2QwNCksICgweDQ5ODU1N2FjKSwKKyAgICAoMHg0OTY1NzgwMiksICgweDQ5NDVkY2Y5KSwgKDB4NDkyNjg1ODgpLCAoMHg0OTA3NzBhYyksICgweDQ4ZTg5ZDZhKSwKKyAgICAoMHg0OGNhMGFjOSksICgweDQ4YWJiN2Q2KSwgKDB4NDg4ZGEzYTYpLCAoMHg0ODZmY2Q0ZiksICgweDQ4NTIzM2VkKSwKKyAgICAoMHg0ODM0ZDZhMyksICgweDQ4MTdiNDk2KSwgKDB4NDdmYWNjZjApLCAoMHg0N2RlMWVlMCksICgweDQ3YzFhOTk5KSwKKyAgICAoMHg0N2E1NmM1MSksICgweDQ3ODk2NjQzKSwgKDB4NDc2ZDk2YWYpLCAoMHg0NzUxZmNkNiksICgweDQ3MzY5N2ZmKSwKKyAgICAoMHg0NzFiNjc3MyksICgweDQ3MDA2YTgxKSwgKDB4NDZlNWEwNzkpLCAoMHg0NmNiMDhhZSksICgweDQ2YjBhMjc5KSwKKyAgICAoMHg0Njk2NmQzNCksICgweDQ2N2M2ODNkKSwgKDB4NDY2MjkyZjQpLCAoMHg0NjQ4ZWNiYyksICgweDQ2MmY3NGZlKSwKKyAgICAoMHg0NjE2MmIyMCksICgweDQ1ZmQwZTkxKSwgKDB4NDVlNDFlYmUpLCAoMHg0NWNiNWIxOSksICgweDQ1YjJjMzE1KSwKKyAgICAoMHg0NTlhNTYyYSksICgweDQ1ODIxM2NmKSwgKDB4NDU2OWZiODEpLCAoMHg0NTUyMGNiYyksICgweDQ1M2E0NzAxKSwKKyAgICAoMHg0NTIyYTlkMSksICgweDQ1MGIzNGIwKSwgKDB4NDRmM2U3MjYpLCAoMHg0NGRjYzBiYSksICgweDQ0YzVjMGY3KSwKKyAgICAoMHg0NGFlZTc2OCksICgweDQ0OTgzMzllKSwgKDB4NDQ4MWE1MjcpLCAoMHg0NDZiM2I5NiksICgweDQ0NTRmNjdlKSwKKyAgICAoMHg0NDNlZDU3NiksICgweDQ0MjhkODE1KSwgKDB4NDQxMmZkZjMpLCAoMHg0M2ZkNDZhZCksICgweDQzZTdiMWRlKSwKKyAgICAoMHg0M2QyM2YyMyksICgweDQzYmNlZTFlKSwgKDB4NDNhN2JlNmYpLCAoMHg0MzkyYWZiOCksICgweDQzN2RjMTlkKSwKKyAgICAoMHg0MzY4ZjNjNSksICgweDQzNTQ0NWQ2KSwgKDB4NDMzZmI3NzkpLCAoMHg0MzJiNDg1NiksICgweDQzMTZmODFhKSwKKyAgICAoMHg0MzAyYzY2ZiksICgweDQyZWViMzA1KSwgKDB4NDJkYWJkOGEpLCAoMHg0MmM2ZTVhZCksICgweDQyYjMyYjIxKSwKKyAgICAoMHg0MjlmOGQ5NiksICgweDQyOGMwY2MyKSwgKDB4NDI3OGE4NTkpLCAoMHg0MjY1NjAxMCksICgweDQyNTIzMzllKSwKKyAgICAoMHg0MjNmMjJiYyksICgweDQyMmMyZDIzKSwgKDB4NDIxOTUyOGIpLCAoMHg0MjA2OTJiMiksICgweDQxZjNlZDUxKSwKKyAgICAoMHg0MWUxNjIyOCksICgweDQxY2VmMGYyKSwgKDB4NDFiYzk5NzEpLCAoMHg0MWFhNWI2MiksICgweDQxOTgzNjg3KSwKKyAgICAoMHg0MTg2MmFhMiksICgweDQxNzQzNzc1KSwgKDB4NDE2MjVjYzMpLCAoMHg0MTUwOWE1MCksICgweDQxM2VlZmUyKSwKKyAgICAoMHg0MTJkNWQzZSksICgweDQxMWJlMjJiKSwgKDB4NDEwYTdlNzApLCAoMHg0MGY5MzFkNSksICgweDQwZTdmYzIzKSwKKyAgICAoMHg0MGQ2ZGQyNCksICgweDQwYzVkNGEyKSwgKDB4NDBiNGUyNjgpLCAoMHg0MGE0MDY0MiksICgweDQwOTMzZmZjKSwKKyAgICAoMHg0MDgyOGY2NCksICgweDQwNzFmNDQ3KSwgKDB4NDA2MTZlNzMpLCAoMHg0MDUwZmRiOSksICgweDQwNDBhMWU2KSwKKyAgICAoMHg0MDMwNWFjYyksICgweDQwMjAyODNjKSwgKDB4NDAxMDBhMDgpLCAoMHg0MDAwMDAwMCksICgweDNmZjAwOWY5KSwKK307CisKK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBpbnZGb3VydGhSb290Q29ycmVjdGlvbls0XSA9IHsweDQwMDAwMDAwLCAweDRDMUJGODI5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NUE4Mjc5OUEsIDB4NkJBMjdFNjV9OworCisvKiBUaGUgZm91cnRoIHJvb3QgZnVuY3Rpb24gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmIGNhbGN1bGF0ZSAxLjAvZm91cnRoX3Jvb3Qob3ApLCBvcCBjb250YWlucyBtYW50aXNzYSBhbmQgZXhwb25lbnQKKyAqIFxwYXJhbSBvcF9tOiAoaSkgbWFudGlzc2Egb2Ygb3BlcmFuZCwgbXVzdCBub3QgYmUgemVybyAoMHgwMDAwLjAwMDApIG9yCisgKiBuZWdhdGl2ZQorICogXHBhcmFtIG9wX2U6IChpKSBwb2ludGVyIHRvIHRoZSBleHBvbmVudCBvZiB0aGUgb3BlcmFuZCAobXVzdCBiZSBpbml0aWFsaXplZCkKKyAqIGFuZCAuLiAobykgcG9pbnRlciB0byB0aGUgZXhwb25lbnQgb2YgdGhlIHJlc3VsdAorICogXHJldHVybjogICAgIChvKSBtYW50aXNzYSBvZiB0aGUgcmVzdWx0CisgKiBcZGVzY3JpcHRpb246CisgKiAgVGhpcyByb3V0aW5lIGNhbGN1bGF0ZXMgdGhlIGN1YmUgcm9vdCBvZiB0aGUgaW5wdXQgb3BlcmFuZCwgdGhhdCBpcworICogIGdpdmVuIHdpdGggaXRzIG1hbnRpc3NhIGluIFEzMSBmb3JtYXQgKEZJWFBfREJMKSBhbmQgaXRzIGV4cG9uZW50IChJTlQpLgorICogIFRoZSByZXN1bHRpbmcgbWFudGlzc2EgaXMgcmV0dXJuZWQgaW4gZm9ybWF0IFEzMS4gVGhlIGV4cG9uZW50ICgqb3BfZSkKKyAqICBpcyBtb2RpZmllZCBhY2NvcmRpbmdseS4gSXQgaXMgbm90IGFzc3VyZWQsIHRoYXQgdGhlIHJlc3VsdCBpcyBmdWxseQorICogbGVmdC1hbGlnbmVkIGJ1dCBhc3N1bWVkIHRvIGhhdmUgbm90IG1vcmUgdGhhbiAyIGJpdHMgaGVhZHJvb20uIFRoZXJlIGlzIG9uZQorICogbWFjcm8gdG8gYWN0aXZhdGUgdGhlIHVzZSBvZiB0aGlzIGFsZ29yaXRobTogRlVOQ1RJT05faW52Rm91cnRoUm9vdE5vcm0yIEJ5CisgKiBtZWFucyBvZiBhY3RpdmF0aW5nIHRoZSBtYWNybyBJTlZGT1VSVEhST09UTk9STTJfTElORUFSX0lOVEVSUE9MQVRFX0hRLCBhCisgKiBzbGlnaHRseSBoaWdoZXIgcHJlY2lzaW9uIGlzIHJlYWNoYWJsZSAoYnkgZGVmYXVsdCwgbm90IGFjdGl2ZSkuIEZvciBERUJVRworICogcHVycG9zZSBvbmx5OiBhIEZES19BU1NFUlQgbWFjcm8gdmFsaWRhdGVzLCBpZiB0aGUgaW5wdXQgbWFudGlzc2EgaXMgZ3JlYXRlcgorICogemVyby4KKyAqCisgKi8KKworLyogI2RlZmluZSBJTlZGT1VSVEhST09UTk9STTJfTElORUFSX0lOVEVSUE9MQVRFX0hRICovCisKK3N0YXRpYworI2lmZGVmIF9fYXJtX18KKyAgICBGSVhQX0RCTCBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKKyAgICBpbnZGb3VydGhSb290Tm9ybTIoRklYUF9EQkwgb3BfbSwgSU5UKiBvcF9lKQorI2Vsc2UKKyAgICBGSVhQX0RCTAorICAgIGludkZvdXJ0aFJvb3ROb3JtMihGSVhQX0RCTCBvcF9tLCBJTlQqIG9wX2UpCisjZW5kaWYKK3sKKyAgRkRLX0FTU0VSVChvcF9tID4gRkwyRlhDT05TVF9EQkwoMC4wKSk7CisKKyAgLyogbm9ybWFsaXplIGlucHV0LCBjYWxjdWxhdGUgc2hpZnQgdmFsdWUgKi8KKyAgSU5UIGV4cG9uZW50ID0gKElOVClmTm9ybXoob3BfbSkgLSAxOworICBvcF9tIDw8PSBleHBvbmVudDsKKworICBJTlQgaW5kZXggPSAoSU5UKShvcF9tID4+IChERlJBQ1RfQklUUyAtIDEgLSAoRk9VUlRIUk9PVF9CSVRTICsgMSkpKSAmCisgICAgICAgICAgICAgIEZPVVJUSFJPT1RfQklUU19NQVNLOworICBGSVhQX0RCTCBmcmFjdCA9IChGSVhQX0RCTCkoKChJTlQpb3BfbSAmIEZPVVJUSFJPT1RfRlJBQ1RfQklUU19NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKEZPVVJUSFJPT1RfQklUUyArIDEpKTsKKyAgRklYUF9EQkwgZGlmZiA9IGludkZvdXJ0aFJvb3RUYWJbaW5kZXggKyAxXSAtIGludkZvdXJ0aFJvb3RUYWJbaW5kZXhdOworICBvcF9tID0gaW52Rm91cnRoUm9vdFRhYltpbmRleF0gKyAoZk11bHREaXYyKGRpZmYsIGZyYWN0KSA8PCAxKTsKKworI2lmIGRlZmluZWQoSU5WRk9VUlRIUk9PVE5PUk0yX0xJTkVBUl9JTlRFUlBPTEFURV9IUSkKKyAgLyogcmVnMSA9IHRbaV0gKyAodFtpKzFdLXRbaV0pKmZyYWN0IC4uLiBhbHJlYWR5IGNvbXB1dGVkIC4uLiArCisgICAqICgxLWZyYWN0KWZyYWN0Kih0W2krMl0tdFtpKzFdKS8yICovCisgIGlmIChmcmFjdCAhPSAoRklYUF9EQkwpMCkgeworICAgIC8qIGZyYWN0ID0gZnJhY3QgKiAoMSAtIGZyYWN0KSAqLworICAgIGZyYWN0ID0gZk11bHREaXYyKGZyYWN0LCAoRklYUF9EQkwpKChMT05HKTB4ODAwMDAwMDAgLSAoTE9ORylmcmFjdCkpIDw8IDE7CisgICAgZGlmZiA9IGRpZmYgLSAoaW52Rm91cnRoUm9vdFRhYltpbmRleCArIDJdIC0gaW52Rm91cnRoUm9vdFRhYltpbmRleCArIDFdKTsKKyAgICBvcF9tID0gZk11bHRBZGREaXYyKG9wX20sIGZyYWN0LCBkaWZmKTsKKyAgfQorI2VuZGlmIC8qIElOVkZPVVJUSFJPT1ROT1JNMl9MSU5FQVJfSU5URVJQT0xBVEVfSFEgKi8KKworICBleHBvbmVudCA9IGV4cG9uZW50IC0gKm9wX2UgKyA0OworICBJTlQgcmVtID0gZXhwb25lbnQgJiAweDAwMDAwMDAzOworICBJTlQgc2hpZnRfdG1wID0gKGV4cG9uZW50ID4+IDIpOworCisgICpvcF9lID0gc2hpZnRfdG1wOworICBvcF9tID0gZk11bHREaXYyKG9wX20sIGludkZvdXJ0aFJvb3RDb3JyZWN0aW9uW3JlbV0pIDw8IDI7CisKKyAgcmV0dXJuIChvcF9tKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBmdW5jdGlvbm5hbWU6IGludjNFaWd0aFJvb3ROb3JtMgorICAgIGRlc2NyaXB0aW9uOiAgZGVsaXZlcnMgMS9jdWJlcnQob3ApIG5vcm1hbGl6ZWQgdG8gLjUuLi4xIGFuZCB0aGUgc2hpZnQgdmFsdWUKK29mIHRoZSBPVVRQVVQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFRIUkVFSUdUSFJPT1RfQklUUyA3CisjZGVmaW5lIFRIUkVFSUdUSFJPT1RfVkFMVUVTICgxMjggKyAyKQorI2RlZmluZSBUSFJFRUlHVEhST09UX0JJVFNfTUFTSyAweDdmCisjZGVmaW5lIFRIUkVFSUdUSFJPT1RfRlJBQ1RfQklUU19NQVNLIDB4MDA3RkZGRkYKKworTE5LX1NFQ1RJT05fQ09OU1REQVRBCitzdGF0aWMgY29uc3QgRklYUF9EQkwgaW52M0VpZ3RoUm9vdFRhYltUSFJFRUlHVEhST09UX1ZBTFVFU10gPSB7CisgICAgKDB4NDVjYWUwZjIpLCAoMHg0NWI5ODFiZiksICgweDQ1YTg0OTJhKSwgKDB4NDU5NzM2OTEpLCAoMHg0NTg2NDk1OSksCisgICAgKDB4NDU3NTgwZTYpLCAoMHg0NTY0ZGNhNCksICgweDQ1NTQ1YzAwKSwgKDB4NDU0M2ZlNmIpLCAoMHg0NTMzYzM1YSksCisgICAgKDB4NDUyM2FhNDQpLCAoMHg0NTEzYjJhNCksICgweDQ1MDNkYmY3KSwgKDB4NDRmNDI1YmUpLCAoMHg0NGU0OGY3YiksCisgICAgKDB4NDRkNTE4YjYpLCAoMHg0NGM1YzBmNyksICgweDQ0YjY4N2M4KSwgKDB4NDRhNzZjYjgpLCAoMHg0NDk4NmY1OCksCisgICAgKDB4NDQ4OThmMzgpLCAoMHg0NDdhY2JlZiksICgweDQ0NmMyNTE0KSwgKDB4NDQ1ZDlhM2YpLCAoMHg0NDRmMmIwZCksCisgICAgKDB4NDQ0MGQ3MWEpLCAoMHg0NDMyOWUwNyksICgweDQ0MjQ3ZjczKSwgKDB4NDQxNjdiMDQpLCAoMHg0NDA4OTA1ZSksCisgICAgKDB4NDNmYWJmMjgpLCAoMHg0M2VkMDcwYiksICgweDQzZGY2N2IwKSwgKDB4NDNkMWUwYzUpLCAoMHg0M2M0NzFmNyksCisgICAgKDB4NDNiNzFhZjYpLCAoMHg0M2E5ZGI3MSksICgweDQzOWNiMzFjKSwgKDB4NDM4ZmExYWIpLCAoMHg0MzgyYTZkMiksCisgICAgKDB4NDM3NWMyNDgpLCAoMHg0MzY4ZjNjNSksICgweDQzNWMzYjAzKSwgKDB4NDM0Zjk3YmMpLCAoMHg0MzQzMDlhYyksCisgICAgKDB4NDMzNjkwOTEpLCAoMHg0MzJhMmMyOCksICgweDQzMWRkYzMwKSwgKDB4NDMxMWEwNmMpLCAoMHg0MzA1Nzg5YyksCisgICAgKDB4NDJmOTY0ODMpLCAoMHg0MmVkNjNlNSksICgweDQyZTE3Njg4KSwgKDB4NDJkNTljMzApLCAoMHg0MmM5ZDRhNiksCisgICAgKDB4NDJiZTFmYjEpLCAoMHg0MmIyN2QxYSksICgweDQyYTZlY2FjKSwgKDB4NDI5YjZlMmYpLCAoMHg0MjkwMDE3MiksCisgICAgKDB4NDI4NGE2M2YpLCAoMHg0Mjc5NWM2NCksICgweDQyNmUyM2IwKSwgKDB4NDI2MmZiZjIpLCAoMHg0MjU3ZTRmOSksCisgICAgKDB4NDI0Y2RlOTYpLCAoMHg0MjQxZTg5YSksICgweDQyMzcwMmQ4KSwgKDB4NDIyYzJkMjMpLCAoMHg0MjIxNjc0ZCksCisgICAgKDB4NDIxNmIxMmMpLCAoMHg0MjBjMGE5NCksICgweDQyMDE3MzViKSwgKDB4NDFmNmViNTcpLCAoMHg0MWVjNzI1ZiksCisgICAgKDB4NDFlMjA4NGIpLCAoMHg0MWQ3YWNmMyksICgweDQxY2Q2MDMwKSwgKDB4NDFjMzIxZGIpLCAoMHg0MWI4ZjFjZSksCisgICAgKDB4NDFhZWNmZTUpLCAoMHg0MWE0YmJmOCksICgweDQxOWFiNWU2KSwgKDB4NDE5MGJkODkpLCAoMHg0MTg2ZDJiZiksCisgICAgKDB4NDE3Y2Y1NjUpLCAoMHg0MTczMjU1OCksICgweDQxNjk2Mjc3KSwgKDB4NDE1ZmFjYTEpLCAoMHg0MTU2MDNiNCksCisgICAgKDB4NDE0YzY3OTIpLCAoMHg0MTQyZDgxOCksICgweDQxMzk1NTJhKSwgKDB4NDEyZmRlYTYpLCAoMHg0MTI2NzQ3MCksCisgICAgKDB4NDExZDE2NjgpLCAoMHg0MTEzYzQ3MiksICgweDQxMGE3ZTcwKSwgKDB4NDEwMTQ0NDUpLCAoMHg0MGY4MTVkNCksCisgICAgKDB4NDBlZWYzMDIpLCAoMHg0MGU1ZGJiNCksICgweDQwZGNjZmNkKSwgKDB4NDBkM2NmMzMpLCAoMHg0MGNhZDljYiksCisgICAgKDB4NDBjMWVmN2IpLCAoMHg0MGI5MTAyYSksICgweDQwYjAzYmJkKSwgKDB4NDBhNzcyMWMpLCAoMHg0MDllYjMyZSksCisgICAgKDB4NDA5NWZlZGEpLCAoMHg0MDhkNTUwOCksICgweDQwODRiNWEwKSwgKDB4NDA3YzIwOGIpLCAoMHg0MDczOTViMiksCisgICAgKDB4NDA2YjE0ZmQpLCAoMHg0MDYyOWU1NiksICgweDQwNWEzMWE2KSwgKDB4NDA1MWNlZDgpLCAoMHg0MDQ5NzVkNSksCisgICAgKDB4NDA0MTI2ODkpLCAoMHg0MDM4ZTBkZCksICgweDQwMzBhNGJkKSwgKDB4NDAyODcyMTUpLCAoMHg0MDIwNDhjZiksCisgICAgKDB4NDAxODI4ZDcpLCAoMHg0MDEwMTIxYSksICgweDQwMDgwNDgzKSwgKDB4NDAwMDAwMDApLCAoMHgzZmY4MDQ3ZCksCit9OworCisvKiBUaGUgbGFzdCB2YWx1ZSBpcyByb3VuZGVkIGluIG9yZGVyIHRvIGF2b2lkIGFueSBvdmVyZmxvdyBkdWUgdG8gdGhlIHZhbHVlcworICogcmFuZ2Ugb2YgdGhlIHJvb3QgdGFibGUgKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBpbnYzRWlndGhSb290Q29ycmVjdGlvbls4XSA9IHsKKyAgICAweDQwMDAwMDAwLCAweDQ1Q0FFMEYyLCAweDRDMUJGODI5LCAweDUyRkY2QjU1LAorICAgIDB4NUE4Mjc5OUEsIDB4NjJCMzk1MDksIDB4NkJBMjdFNjUsIDB4NzU2MDYzNzN9OworCisvKiBUaGUgMy84IHJvb3QgZnVuY3Rpb24gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogXGJyaWVmIGNhbGN1bGF0ZSAxLjAvM0VpZ3RoX3Jvb3Qob3ApID0gMS4wLyh4KV4oMy84KSwgb3AgY29udGFpbnMgbWFudGlzc2EKKyAqIGFuZCBleHBvbmVudAorICogXHBhcmFtIG9wX206IChpKSBtYW50aXNzYSBvZiBvcGVyYW5kLCBtdXN0IG5vdCBiZSB6ZXJvICgweDAwMDAuMDAwMCkgb3IKKyAqIG5lZ2F0aXZlCisgKiBccGFyYW0gb3BfZTogKGkpIHBvaW50ZXIgdG8gdGhlIGV4cG9uZW50IG9mIHRoZSBvcGVyYW5kIChtdXN0IGJlIGluaXRpYWxpemVkKQorICogYW5kIC4uIChvKSBwb2ludGVyIHRvIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0CisgKiBccmV0dXJuOiAgICAgKG8pIG1hbnRpc3NhIG9mIHRoZSByZXN1bHQKKyAqIFxkZXNjcmlwdGlvbjoKKyAqICBUaGlzIHJvdXRpbmUgY2FsY3VsYXRlcyB0aGUgY3ViZSByb290IG9mIHRoZSBpbnB1dCBvcGVyYW5kLCB0aGF0IGlzCisgKiAgZ2l2ZW4gd2l0aCBpdHMgbWFudGlzc2EgaW4gUTMxIGZvcm1hdCAoRklYUF9EQkwpIGFuZCBpdHMgZXhwb25lbnQgKElOVCkuCisgKiAgVGhlIHJlc3VsdGluZyBtYW50aXNzYSBpcyByZXR1cm5lZCBpbiBmb3JtYXQgUTMxLiBUaGUgZXhwb25lbnQgKCpvcF9lKQorICogIGlzIG1vZGlmaWVkIGFjY29yZGluZ2x5LiBJdCBpcyBub3QgYXNzdXJlZCwgdGhhdCB0aGUgcmVzdWx0IGlzIGZ1bGx5CisgKiBsZWZ0LWFsaWduZWQgYnV0IGFzc3VtZWQgdG8gaGF2ZSBub3QgbW9yZSB0aGFuIDIgYml0cyBoZWFkcm9vbS4gVGhlcmUgaXMgb25lCisgKiBtYWNybyB0byBhY3RpdmF0ZSB0aGUgdXNlIG9mIHRoaXMgYWxnb3JpdGhtOiBGVU5DVElPTl9pbnYzRWlndGhSb290Tm9ybTIgQnkKKyAqIG1lYW5zIG9mIGFjdGl2YXRpbmcgdGhlIG1hY3JvIElOVlRIUkVFSUdUSFJPT1ROT1JNMl9MSU5FQVJfSU5URVJQT0xBVEVfSFEsIGEKKyAqIHNsaWdodGx5IGhpZ2hlciBwcmVjaXNpb24gaXMgcmVhY2hhYmxlIChieSBkZWZhdWx0LCBub3QgYWN0aXZlKS4gRm9yIERFQlVHCisgKiBwdXJwb3NlIG9ubHk6IGEgRkRLX0FTU0VSVCBtYWNybyB2YWxpZGF0ZXMsIGlmIHRoZSBpbnB1dCBtYW50aXNzYSBpcyBncmVhdGVyCisgKiB6ZXJvLgorICoKKyAqLworCisvKiAjZGVmaW5lIElOVlRIUkVFSUdUSFJPT1ROT1JNMl9MSU5FQVJfSU5URVJQT0xBVEVfSFEgKi8KKworc3RhdGljCisjaWZkZWYgX19hcm1fXworICAgIEZJWFBfREJMIF9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUpKQorICAgIGludjNFaWd0aFJvb3ROb3JtMihGSVhQX0RCTCBvcF9tLCBJTlQqIG9wX2UpCisjZWxzZQorICAgIEZJWFBfREJMCisgICAgaW52M0VpZ3RoUm9vdE5vcm0yKEZJWFBfREJMIG9wX20sIElOVCogb3BfZSkKKyNlbmRpZgoreworICBGREtfQVNTRVJUKG9wX20gPiBGTDJGWENPTlNUX0RCTCgwLjApKTsKKworICAvKiBub3JtYWxpemUgaW5wdXQsIGNhbGN1bGF0ZSBzaGlmdCBvcF9tdWUgKi8KKyAgSU5UIGV4cG9uZW50ID0gKElOVClmTm9ybXoob3BfbSkgLSAxOworICBvcF9tIDw8PSBleHBvbmVudDsKKworICBJTlQgaW5kZXggPSAoSU5UKShvcF9tID4+IChERlJBQ1RfQklUUyAtIDEgLSAoVEhSRUVJR1RIUk9PVF9CSVRTICsgMSkpKSAmCisgICAgICAgICAgICAgIFRIUkVFSUdUSFJPT1RfQklUU19NQVNLOworICBGSVhQX0RCTCBmcmFjdCA9IChGSVhQX0RCTCkoKChJTlQpb3BfbSAmIFRIUkVFSUdUSFJPT1RfRlJBQ1RfQklUU19NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKFRIUkVFSUdUSFJPT1RfQklUUyArIDEpKTsKKyAgRklYUF9EQkwgZGlmZiA9IGludjNFaWd0aFJvb3RUYWJbaW5kZXggKyAxXSAtIGludjNFaWd0aFJvb3RUYWJbaW5kZXhdOworICBvcF9tID0gaW52M0VpZ3RoUm9vdFRhYltpbmRleF0gKyAoZk11bHREaXYyKGRpZmYsIGZyYWN0KSA8PCAxKTsKKworI2lmIGRlZmluZWQoSU5WVEhSRUVJR1RIUk9PVE5PUk0yX0xJTkVBUl9JTlRFUlBPTEFURV9IUSkKKyAgLyogb3BfbSA9IHRbaV0gKyAodFtpKzFdLXRbaV0pKmZyYWN0IC4uLiBhbHJlYWR5IGNvbXB1dGVkIC4uLiArCisgICAqICgxLWZyYWN0KWZyYWN0Kih0W2krMl0tdFtpKzFdKS8yICovCisgIGlmIChmcmFjdCAhPSAoRklYUF9EQkwpMCkgeworICAgIC8qIGZyYWN0ID0gZnJhY3QgKiAoMSAtIGZyYWN0KSAqLworICAgIGZyYWN0ID0gZk11bHREaXYyKGZyYWN0LCAoRklYUF9EQkwpKChMT05HKTB4ODAwMDAwMDAgLSAoTE9ORylmcmFjdCkpIDw8IDE7CisgICAgZGlmZiA9IGRpZmYgLSAoaW52M0VpZ3RoUm9vdFRhYltpbmRleCArIDJdIC0gaW52M0VpZ3RoUm9vdFRhYltpbmRleCArIDFdKTsKKyAgICBvcF9tID0gZk11bHRBZGREaXYyKG9wX20sIGZyYWN0LCBkaWZmKTsKKyAgfQorI2VuZGlmIC8qIElOVlRIUkVFSUdUSFJPT1ROT1JNMl9MSU5FQVJfSU5URVJQT0xBVEVfSFEgKi8KKworICBleHBvbmVudCA9IGV4cG9uZW50IC0gKm9wX2UgKyA4OworICBJTlQgcmVtID0gZXhwb25lbnQgJiAweDAwMDAwMDA3OworICBJTlQgc2hpZnRfdG1wID0gKGV4cG9uZW50ID4+IDMpOworCisgICpvcF9lID0gc2hpZnRfdG1wICogMzsKKyAgb3BfbSA9IGZNdWx0RGl2MihvcF9tLCBpbnYzRWlndGhSb290Q29ycmVjdGlvbltyZW1dKSA8PCAyOworCisgIHJldHVybiAoZk11bHQob3BfbSwgZk11bHQob3BfbSwgb3BfbSkpKTsKK30KKworU0JSX0VSUk9SCitRbWZUcmFuc3Bvc2VyQ3JlYXRlKEhBTkRMRV9IQkVfVFJBTlNQT1NFUiogaFFtZlRyYW5zcG9zZXIsIGNvbnN0IGludCBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgIGludCBiRGlzYWJsZUNyb3NzUHJvZHVjdHMsIGludCBiU2JyNDEpIHsKKyAgSEFORExFX0hCRV9UUkFOU1BPU0VSIGhRbWZUcmFuID0gTlVMTDsKKworICBpbnQgaTsKKworICBpZiAoaFFtZlRyYW5zcG9zZXIgIT0gTlVMTCkgeworICAgIC8qIE1lbW9yeSBhbGxvY2F0aW9uICovCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaFFtZlRyYW4gPQorICAgICAgICAoSEFORExFX0hCRV9UUkFOU1BPU0VSKUZES2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGhiZVRyYW5zcG9zZXIpKTsKKyAgICBpZiAoaFFtZlRyYW4gPT0gTlVMTCkgeworICAgICAgcmV0dXJuIFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVEOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfU1RSRVRDSF9IQkUgLSAxOyBpKyspIHsKKyAgICAgIGhRbWZUcmFuLT5iWFByb2R1Y3RzW2ldID0gKGJEaXNhYmxlQ3Jvc3NQcm9kdWN0cyA/IDAgOiB4UHJvZHVjdHNbaV0pOworICAgIH0KKworICAgIGhRbWZUcmFuLT50aW1lRG9tYWluV2luTGVuID0gZnJhbWVTaXplOworICAgIGlmIChmcmFtZVNpemUgPT0gNzY4KSB7CisgICAgICBoUW1mVHJhbi0+bm9Db2xzID0KKyAgICAgICAgICAoOCAqIGZyYW1lU2l6ZSAvIDMpIC8gUU1GX1NZTlRIX0NIQU5ORUxTOyAvKiAzMiBmb3IgMjQ6NjQgKi8KKyAgICB9IGVsc2UgeworICAgICAgaFFtZlRyYW4tPm5vQ29scyA9CisgICAgICAgICAgKGJTYnI0MSArIDEpICogMiAqIGZyYW1lU2l6ZSAvCisgICAgICAgICAgUU1GX1NZTlRIX0NIQU5ORUxTOyAvKiAzMiBmb3IgMzI6NjQgYW5kIDY0IGZvciAxNjo2NCAtPiBpZGVudGljYWwgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNicmRlYy0+bm9fY29scyAqLworICAgIH0KKworICAgIGhRbWZUcmFuLT5ub0NoYW5uZWxzID0gZnJhbWVTaXplIC8gaFFtZlRyYW4tPm5vQ29sczsKKworICAgIGhRbWZUcmFuLT5xbWZJbkJ1ZlNpemUgPSBRTUZfV0lOX0xFTjsKKyAgICBoUW1mVHJhbi0+cW1mT3V0QnVmU2l6ZSA9IDIgKiAoaFFtZlRyYW4tPm5vQ29scyAvIDIgKyBRTUZfV0lOX0xFTiAtIDEpOworCisgICAgaFFtZlRyYW4tPmluQnVmX0YgPQorICAgICAgICAoSU5UX1BDTSopRkRLY2FsbG9jKFFNRl9TWU5USF9DSEFOTkVMUyArIDIwICsgMSwgc2l6ZW9mKElOVF9QQ00pKTsKKyAgICAvKiBidWZmZXJlZCB0aW1lIHNpZ25hbCBuZWVkcyB0byBiZSBkZWxheWVkIGJ5IHN5bnRoZXNpc19zaXplOyBtYXgKKyAgICAgKiBzeW50aGVzaXNfc2l6ZSA9IDIwOyAqLworICAgIGlmIChoUW1mVHJhbi0+aW5CdWZfRiA9PSBOVUxMKSB7CisgICAgICBRbWZUcmFuc3Bvc2VyQ2xvc2UoaFFtZlRyYW4pOworICAgICAgcmV0dXJuIFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVEOworICAgIH0KKworICAgIGhRbWZUcmFuLT5xbWZJbkJ1ZlJlYWxfRiA9CisgICAgICAgIChGSVhQX0RCTCoqKUZES2NhbGxvYyhoUW1mVHJhbi0+cW1mSW5CdWZTaXplLCBzaXplb2YoRklYUF9EQkwqKSk7CisgICAgaFFtZlRyYW4tPnFtZkluQnVmSW1hZ19GID0KKyAgICAgICAgKEZJWFBfREJMKiopRkRLY2FsbG9jKGhRbWZUcmFuLT5xbWZJbkJ1ZlNpemUsIHNpemVvZihGSVhQX0RCTCopKTsKKworICAgIGlmIChoUW1mVHJhbi0+cW1mSW5CdWZSZWFsX0YgPT0gTlVMTCkgeworICAgICAgUW1mVHJhbnNwb3NlckNsb3NlKGhRbWZUcmFuKTsKKyAgICAgIHJldHVybiBTQlJERUNfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICB9CisgICAgaWYgKGhRbWZUcmFuLT5xbWZJbkJ1ZkltYWdfRiA9PSBOVUxMKSB7CisgICAgICBRbWZUcmFuc3Bvc2VyQ2xvc2UoaFFtZlRyYW4pOworICAgICAgcmV0dXJuIFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVEOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBoUW1mVHJhbi0+cW1mSW5CdWZTaXplOyBpKyspIHsKKyAgICAgIGhRbWZUcmFuLT5xbWZJbkJ1ZlJlYWxfRltpXSA9IChGSVhQX0RCTCopRkRLYWFsbG9jKAorICAgICAgICAgIFFNRl9TWU5USF9DSEFOTkVMUyAqIHNpemVvZihGSVhQX0RCTCksIEFMSUdOTUVOVF9ERUZBVUxUKTsKKyAgICAgIGhRbWZUcmFuLT5xbWZJbkJ1ZkltYWdfRltpXSA9IChGSVhQX0RCTCopRkRLYWFsbG9jKAorICAgICAgICAgIFFNRl9TWU5USF9DSEFOTkVMUyAqIHNpemVvZihGSVhQX0RCTCksIEFMSUdOTUVOVF9ERUZBVUxUKTsKKyAgICAgIGlmIChoUW1mVHJhbi0+cW1mSW5CdWZSZWFsX0ZbaV0gPT0gTlVMTCkgeworICAgICAgICBRbWZUcmFuc3Bvc2VyQ2xvc2UoaFFtZlRyYW4pOworICAgICAgICByZXR1cm4gU0JSREVDX01FTV9BTExPQ19GQUlMRUQ7CisgICAgICB9CisgICAgICBpZiAoaFFtZlRyYW4tPnFtZkluQnVmSW1hZ19GW2ldID09IE5VTEwpIHsKKyAgICAgICAgUW1mVHJhbnNwb3NlckNsb3NlKGhRbWZUcmFuKTsKKyAgICAgICAgcmV0dXJuIFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVEOworICAgICAgfQorICAgIH0KKworICAgIGhRbWZUcmFuLT5xbWZIQkVCdWZSZWFsX0YgPQorICAgICAgICAoRklYUF9EQkwqKilGREtjYWxsb2MoSEJFX01BWF9PVVRfU0xPVFMsIHNpemVvZihGSVhQX0RCTCopKTsKKyAgICBoUW1mVHJhbi0+cW1mSEJFQnVmSW1hZ19GID0KKyAgICAgICAgKEZJWFBfREJMKiopRkRLY2FsbG9jKEhCRV9NQVhfT1VUX1NMT1RTLCBzaXplb2YoRklYUF9EQkwqKSk7CisKKyAgICBpZiAoaFFtZlRyYW4tPnFtZkhCRUJ1ZlJlYWxfRiA9PSBOVUxMKSB7CisgICAgICBRbWZUcmFuc3Bvc2VyQ2xvc2UoaFFtZlRyYW4pOworICAgICAgcmV0dXJuIFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVEOworICAgIH0KKyAgICBpZiAoaFFtZlRyYW4tPnFtZkhCRUJ1ZkltYWdfRiA9PSBOVUxMKSB7CisgICAgICBRbWZUcmFuc3Bvc2VyQ2xvc2UoaFFtZlRyYW4pOworICAgICAgcmV0dXJuIFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVEOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBIQkVfTUFYX09VVF9TTE9UUzsgaSsrKSB7CisgICAgICBoUW1mVHJhbi0+cW1mSEJFQnVmUmVhbF9GW2ldID0KKyAgICAgICAgICAoRklYUF9EQkwqKUZES2NhbGxvYyhRTUZfU1lOVEhfQ0hBTk5FTFMsIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgaFFtZlRyYW4tPnFtZkhCRUJ1ZkltYWdfRltpXSA9CisgICAgICAgICAgKEZJWFBfREJMKilGREtjYWxsb2MoUU1GX1NZTlRIX0NIQU5ORUxTLCBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIGlmIChoUW1mVHJhbi0+cW1mSEJFQnVmUmVhbF9GW2ldID09IE5VTEwpIHsKKyAgICAgICAgUW1mVHJhbnNwb3NlckNsb3NlKGhRbWZUcmFuKTsKKyAgICAgICAgcmV0dXJuIFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVEOworICAgICAgfQorICAgICAgaWYgKGhRbWZUcmFuLT5xbWZIQkVCdWZJbWFnX0ZbaV0gPT0gTlVMTCkgeworICAgICAgICBRbWZUcmFuc3Bvc2VyQ2xvc2UoaFFtZlRyYW4pOworICAgICAgICByZXR1cm4gU0JSREVDX01FTV9BTExPQ19GQUlMRUQ7CisgICAgICB9CisgICAgfQorCisgICAgaFFtZlRyYW4tPnFtZkJ1ZmZlckNvZGVjVGVtcFNsb3RfRiA9CisgICAgICAgIChGSVhQX0RCTCopRkRLY2FsbG9jKFFNRl9TWU5USF9DSEFOTkVMUyAvIDIsIHNpemVvZihGSVhQX0RCTCkpOworICAgIGlmIChoUW1mVHJhbi0+cW1mQnVmZmVyQ29kZWNUZW1wU2xvdF9GID09IE5VTEwpIHsKKyAgICAgIFFtZlRyYW5zcG9zZXJDbG9zZShoUW1mVHJhbik7CisgICAgICByZXR1cm4gU0JSREVDX01FTV9BTExPQ19GQUlMRUQ7CisgICAgfQorCisgICAgaFFtZlRyYW4tPmJTYnI0MSA9IGJTYnI0MTsKKworICAgIGhRbWZUcmFuLT5oaWdoYmFuZF9leHBbMF0gPSAwOworICAgIGhRbWZUcmFuLT5oaWdoYmFuZF9leHBbMV0gPSAwOworICAgIGhRbWZUcmFuLT50YXJnZXRfZXhwWzBdID0gMDsKKyAgICBoUW1mVHJhbi0+dGFyZ2V0X2V4cFsxXSA9IDA7CisKKyAgICAqaFFtZlRyYW5zcG9zZXIgPSBoUW1mVHJhbjsKKyAgfQorCisgIHJldHVybiBTQlJERUNfT0s7Cit9CisKK1NCUl9FUlJPUiBRbWZUcmFuc3Bvc2VyUmVJbml0KEhBTkRMRV9IQkVfVFJBTlNQT1NFUiBoUW1mVHJhbnNwb3NlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSKiBGcmVxQmFuZFRhYmxlWzJdLCBVQ0hBUiBOU2ZiWzJdKQorLyogcmVtb3ZlZCBiU2JyNDEgZnJvbSBwYXJhbWV0ZXJsaXN0OgorICAgZG9uJ3Qga25vdyB3aGVyZSB0byBnZXQgdGhpcyB2YWx1ZSBmcm9tCisgICBhdCBjYWxsLXNpZGUgKi8KK3sKKyAgaW50IEwsIHNmYiwgcGF0Y2gsIHN0b3BQYXRjaCwgcW1mRXJyOworCisgIGlmIChoUW1mVHJhbnNwb3NlciAhPSBOVUxMKSB7CisgICAgY29uc3QgRklYUF9RVFcqIHRtcF90X2NvczsKKyAgICBjb25zdCBGSVhQX1FUVyogdG1wX3Rfc2luOworCisgICAgaFFtZlRyYW5zcG9zZXItPnN0YXJ0QmFuZCA9IEZyZXFCYW5kVGFibGVbMF1bMF07CisgICAgaFFtZlRyYW5zcG9zZXItPnN0b3BCYW5kID0gRnJlcUJhbmRUYWJsZVswXVtOU2ZiWzBdXTsKKworICAgIGhRbWZUcmFuc3Bvc2VyLT5zeW50aFNpemUgPQorICAgICAgICA0ICogKChoUW1mVHJhbnNwb3Nlci0+c3RhcnRCYW5kICsgNCkgLyA4ICsgMSk7IC8qIDgsIDEyLCAxNiwgMjAgKi8KKyAgICBoUW1mVHJhbnNwb3Nlci0+a3N0YXJ0ID0gc3RhcnRTdWJiYW5kMmtMW2hRbWZUcmFuc3Bvc2VyLT5zdGFydEJhbmRdOworCisgICAgLyogZG9uJ3Qga25vdyB3aGVyZSB0byB0YWtlIHRoaXMgaW5mb3JtYXRpb24gZnJvbSAqLworICAgIC8qIGhRbWZUcmFuc3Bvc2VyLT5iU2JyNDEgPSBiU2JyNDE7ICAgICAgICAgICAgICAgKi8KKworICAgIGlmIChoUW1mVHJhbnNwb3Nlci0+YlNicjQxKSB7CisgICAgICBpZiAoaFFtZlRyYW5zcG9zZXItPmtzdGFydCArIGhRbWZUcmFuc3Bvc2VyLT5zeW50aFNpemUgPiAxNikKKyAgICAgICAgaFFtZlRyYW5zcG9zZXItPmtzdGFydCA9IDE2IC0gaFFtZlRyYW5zcG9zZXItPnN5bnRoU2l6ZTsKKyAgICB9IGVsc2UgaWYgKGhRbWZUcmFuc3Bvc2VyLT50aW1lRG9tYWluV2luTGVuID09IDc2OCkgeworICAgICAgaWYgKGhRbWZUcmFuc3Bvc2VyLT5rc3RhcnQgKyBoUW1mVHJhbnNwb3Nlci0+c3ludGhTaXplID4gMjQpCisgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5rc3RhcnQgPSAyNCAtIGhRbWZUcmFuc3Bvc2VyLT5zeW50aFNpemU7CisgICAgfQorCisgICAgaFFtZlRyYW5zcG9zZXItPnN5bnRoZXNpc1FtZlByZU1vZENvc19GID0KKyAgICAgICAgJnByZU1vZENvc1toUW1mVHJhbnNwb3Nlci0+a3N0YXJ0XTsKKyAgICBoUW1mVHJhbnNwb3Nlci0+c3ludGhlc2lzUW1mUHJlTW9kU2luX0YgPQorICAgICAgICAmcHJlTW9kU2luW2hRbWZUcmFuc3Bvc2VyLT5rc3RhcnRdOworCisgICAgTCA9IDIgKiBoUW1mVHJhbnNwb3Nlci0+c3ludGhTaXplOyAvKiA4LCAxNiwgMjQsIDMyLCA0MCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hhbmdlIGFuYWx5c2lzIHBvc3QgdHdpZGRsZXMgKi8KKworICAgIHN3aXRjaCAoTCkgeworICAgICAgY2FzZSA4OgorICAgICAgICB0bXBfdF9jb3MgPSBwb3N0X3R3aWRkbGVfY29zXzg7CisgICAgICAgIHRtcF90X3NpbiA9IHBvc3RfdHdpZGRsZV9zaW5fODsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE2OgorICAgICAgICB0bXBfdF9jb3MgPSBwb3N0X3R3aWRkbGVfY29zXzE2OworICAgICAgICB0bXBfdF9zaW4gPSBwb3N0X3R3aWRkbGVfc2luXzE2OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjQ6CisgICAgICAgIHRtcF90X2NvcyA9IHBvc3RfdHdpZGRsZV9jb3NfMjQ7CisgICAgICAgIHRtcF90X3NpbiA9IHBvc3RfdHdpZGRsZV9zaW5fMjQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzMjoKKyAgICAgICAgdG1wX3RfY29zID0gcG9zdF90d2lkZGxlX2Nvc18zMjsKKyAgICAgICAgdG1wX3Rfc2luID0gcG9zdF90d2lkZGxlX3Npbl8zMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQwOgorICAgICAgICB0bXBfdF9jb3MgPSBwb3N0X3R3aWRkbGVfY29zXzQwOworICAgICAgICB0bXBfdF9zaW4gPSBwb3N0X3R3aWRkbGVfc2luXzQwOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOworICAgIH0KKworICAgIHFtZkVyciA9IHFtZkluaXRTeW50aGVzaXNGaWx0ZXJCYW5rKAorICAgICAgICAmaFFtZlRyYW5zcG9zZXItPkhCRVN5bnRoZXNpc1FNRiwgaFFtZlRyYW5zcG9zZXItPnN5blFtZlN0YXRlcywKKyAgICAgICAgaFFtZlRyYW5zcG9zZXItPm5vQ29scywgMCwgaFFtZlRyYW5zcG9zZXItPnN5bnRoU2l6ZSwKKyAgICAgICAgaFFtZlRyYW5zcG9zZXItPnN5bnRoU2l6ZSwgMSk7CisgICAgaWYgKHFtZkVyciAhPSAwKSB7CisgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgICB9CisKKyAgICBxbWZFcnIgPSBxbWZJbml0QW5hbHlzaXNGaWx0ZXJCYW5rKAorICAgICAgICAmaFFtZlRyYW5zcG9zZXItPkhCRUFuYWx5c2lzY1FNRiwgaFFtZlRyYW5zcG9zZXItPmFuYVFtZlN0YXRlcywKKyAgICAgICAgaFFtZlRyYW5zcG9zZXItPm5vQ29scyAvIDIsIDAsIDIgKiBoUW1mVHJhbnNwb3Nlci0+c3ludGhTaXplLAorICAgICAgICAyICogaFFtZlRyYW5zcG9zZXItPnN5bnRoU2l6ZSwgMCk7CisKKyAgICBpZiAocW1mRXJyICE9IDApIHsKKyAgICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOworICAgIH0KKworICAgIGhRbWZUcmFuc3Bvc2VyLT5IQkVBbmFseXNpc2NRTUYudF9jb3MgPSB0bXBfdF9jb3M7CisgICAgaFFtZlRyYW5zcG9zZXItPkhCRUFuYWx5c2lzY1FNRi50X3NpbiA9IHRtcF90X3NpbjsKKworICAgIEZES21lbXNldChoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWYsIDAsCisgICAgICAgICAgICAgIE1BWF9OVU1fUEFUQ0hFUyAqIHNpemVvZihpbnQpKTsgLyogZ2xvYmFsICovCisgICAgc2ZiID0gMDsKKyAgICBpZiAoaFFtZlRyYW5zcG9zZXItPmJTYnI0MSkgeworICAgICAgc3RvcFBhdGNoID0gTUFYX05VTV9QQVRDSEVTOworICAgICAgaFFtZlRyYW5zcG9zZXItPm1heFN0cmV0Y2ggPSBNQVhfU1RSRVRDSF9IQkU7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0b3BQYXRjaCA9IE1BWF9TVFJFVENIX0hCRTsKKyAgICB9CisKKyAgICBmb3IgKHBhdGNoID0gMTsgcGF0Y2ggPD0gc3RvcFBhdGNoOyBwYXRjaCsrKSB7CisgICAgICB3aGlsZSAoc2ZiIDw9IE5TZmJbMF0gJiYKKyAgICAgICAgICAgICBGcmVxQmFuZFRhYmxlWzBdW3NmYl0gPD0gcGF0Y2ggKiBoUW1mVHJhbnNwb3Nlci0+c3RhcnRCYW5kKQorICAgICAgICBzZmIrKzsKKyAgICAgIGlmIChzZmIgPD0gTlNmYlswXSkgeworICAgICAgICAvKiBJZiB0aGUgZGlzdGFuY2UgaXMgbGFyZ2VyIHRoYW4gdGhyZWUgUU1GIGJhbmRzIC0gdHJ5IGFsaWduaW5nIHRvIGhpZ2gKKyAgICAgICAgICogcmVzb2x1dGlvbiBmcmVxdWVuY3kgYmFuZHMgaW5zdGVhZC4gKi8KKyAgICAgICAgaWYgKChwYXRjaCAqIGhRbWZUcmFuc3Bvc2VyLT5zdGFydEJhbmQgLSBGcmVxQmFuZFRhYmxlWzBdW3NmYiAtIDFdKSA8PQorICAgICAgICAgICAgMykgeworICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT54T3ZlclFtZltwYXRjaCAtIDFdID0gRnJlcUJhbmRUYWJsZVswXVtzZmIgLSAxXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbnQgc2ZiX3RtcCA9IDA7CisgICAgICAgICAgd2hpbGUgKHNmYl90bXAgPD0gTlNmYlsxXSAmJgorICAgICAgICAgICAgICAgICBGcmVxQmFuZFRhYmxlWzFdW3NmYl90bXBdIDw9IHBhdGNoICogaFFtZlRyYW5zcG9zZXItPnN0YXJ0QmFuZCkKKyAgICAgICAgICAgIHNmYl90bXArKzsKKyAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbcGF0Y2ggLSAxXSA9IEZyZXFCYW5kVGFibGVbMV1bc2ZiX3RtcCAtIDFdOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbcGF0Y2ggLSAxXSA9IGhRbWZUcmFuc3Bvc2VyLT5zdG9wQmFuZDsKKyAgICAgICAgaFFtZlRyYW5zcG9zZXItPm1heFN0cmV0Y2ggPSBmTWluKHBhdGNoLCBNQVhfU1RSRVRDSF9IQkUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBoUW1mVHJhbnNwb3Nlci0+aGlnaGJhbmRfZXhwWzBdID0gMDsKKyAgICBoUW1mVHJhbnNwb3Nlci0+aGlnaGJhbmRfZXhwWzFdID0gMDsKKyAgICBoUW1mVHJhbnNwb3Nlci0+dGFyZ2V0X2V4cFswXSA9IDA7CisgICAgaFFtZlRyYW5zcG9zZXItPnRhcmdldF9leHBbMV0gPSAwOworICB9CisKKyAgcmV0dXJuIFNCUkRFQ19PSzsKK30KKwordm9pZCBRbWZUcmFuc3Bvc2VyQ2xvc2UoSEFORExFX0hCRV9UUkFOU1BPU0VSIGhRbWZUcmFuc3Bvc2VyKSB7CisgIGludCBpOworCisgIGlmIChoUW1mVHJhbnNwb3NlciAhPSBOVUxMKSB7CisgICAgaWYgKGhRbWZUcmFuc3Bvc2VyLT5pbkJ1Zl9GKSBGREtmcmVlKGhRbWZUcmFuc3Bvc2VyLT5pbkJ1Zl9GKTsKKworICAgIGlmIChoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0YpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZTaXplOyBpKyspIHsKKyAgICAgICAgRkRLYWZyZWUoaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmUmVhbF9GW2ldKTsKKyAgICAgIH0KKyAgICAgIEZES2ZyZWUoaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmUmVhbF9GKTsKKyAgICB9CisKKyAgICBpZiAoaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmU2l6ZTsgaSsrKSB7CisgICAgICAgIEZES2FmcmVlKGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZkltYWdfRltpXSk7CisgICAgICB9CisgICAgICBGREtmcmVlKGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZkltYWdfRik7CisgICAgfQorCisgICAgaWYgKGhRbWZUcmFuc3Bvc2VyLT5xbWZIQkVCdWZSZWFsX0YpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBIQkVfTUFYX09VVF9TTE9UUzsgaSsrKSB7CisgICAgICAgIEZES2ZyZWUoaFFtZlRyYW5zcG9zZXItPnFtZkhCRUJ1ZlJlYWxfRltpXSk7CisgICAgICB9CisgICAgICBGREtmcmVlKGhRbWZUcmFuc3Bvc2VyLT5xbWZIQkVCdWZSZWFsX0YpOworICAgIH0KKworICAgIGlmIChoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmSW1hZ19GKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgSEJFX01BWF9PVVRfU0xPVFM7IGkrKykgeworICAgICAgICBGREtmcmVlKGhRbWZUcmFuc3Bvc2VyLT5xbWZIQkVCdWZJbWFnX0ZbaV0pOworICAgICAgfQorICAgICAgRkRLZnJlZShoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmSW1hZ19GKTsKKyAgICB9CisKKyAgICBGREtmcmVlKGhRbWZUcmFuc3Bvc2VyLT5xbWZCdWZmZXJDb2RlY1RlbXBTbG90X0YpOworCisgICAgRkRLZnJlZShoUW1mVHJhbnNwb3Nlcik7CisgIH0KK30KKworaW5saW5lIHZvaWQgc2NhbGVVcChGSVhQX0RCTCogcmVhbF9tLCBGSVhQX0RCTCogaW1hZ19tLCBJTlQqIF9lKSB7CisgIElOVCByZXNlcnZlOworICAvKiBzaGlmdCBnY19yIGFuZCBnY19pIHVwIGlmIHBvc3NpYmxlICovCisgIHJlc2VydmUgPSBDbnRMZWFkaW5nWmVyb3MoKElOVCgqcmVhbF9tKSBeIElOVCgoKnJlYWxfbSA+PiAzMSkpKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElOVCgqaW1hZ19tKSBeIElOVCgoKmltYWdfbSA+PiAzMSkpKSkgLQorICAgICAgICAgICAgMTsKKyAgcmVzZXJ2ZSA9IGZNYXgocmVzZXJ2ZSAtIDEsCisgICAgICAgICAgICAgICAgIDApOyAvKiBMZWF2ZSBvbmUgYml0IGhlYWRyb29tIHN1Y2ggdGhhdCAocmVhbF9tXjIgKyBpbWFnX21eMikKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IG92ZXJmbG93IGxhdGVyIGlmIGJvdGggYXJlIDB4ODAwMDAwMDAuICovCisgIHJlc2VydmUgPSBmTWluKHJlc2VydmUsICpfZSk7CisgIEZES19BU1NFUlQocmVzZXJ2ZSA+PSAwKTsKKyAgKnJlYWxfbSA8PD0gcmVzZXJ2ZTsKKyAgKmltYWdfbSA8PD0gcmVzZXJ2ZTsKKyAgKl9lIC09IHJlc2VydmU7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZUNlbnRlckZJWFAoRklYUF9EQkwgZ2FtbWFWZWNSZWFsLCBGSVhQX0RCTCBnYW1tYVZlY0ltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiBjZW50ZXJSZWFsLCBGSVhQX0RCTCogY2VudGVySW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UKiBleHBvbmVudCwgaW50IHN0cmV0Y2gsIGludCBtdWx0KSB7CisgIHNjYWxlVXAoJmdhbW1hVmVjUmVhbCwgJmdhbW1hVmVjSW1hZywgZXhwb25lbnQpOworICBGSVhQX0RCTCBlbmVyZ3kgPSBmUG93MkRpdjIoZ2FtbWFWZWNSZWFsKSArIGZQb3cyRGl2MihnYW1tYVZlY0ltYWcpOworCisgIGlmIChlbmVyZ3kgIT0gRkwyRlhDT05TVF9EQkwoMC5mKSkgeworICAgIEZJWFBfREJMIGdjX3JfbSwgZ2NfaV9tLCBmYWN0b3JfbSA9IChGSVhQX0RCTCkwOworICAgIElOVCBmYWN0b3JfZSwgZ2NfZTsKKyAgICBmYWN0b3JfZSA9IDIgKiAoKmV4cG9uZW50KSArIDE7CisKKyAgICBzd2l0Y2ggKHN0cmV0Y2gpIHsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgZmFjdG9yX20gPSBpbnZGb3VydGhSb290Tm9ybTIoZW5lcmd5LCAmZmFjdG9yX2UpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgZmFjdG9yX20gPSBpbnZDdWJlUm9vdE5vcm0yKGVuZXJneSwgJmZhY3Rvcl9lKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ6CisgICAgICAgIGZhY3Rvcl9tID0gaW52M0VpZ3RoUm9vdE5vcm0yKGVuZXJneSwgJmZhY3Rvcl9lKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZ2Nfcl9tID0gZk11bHREaXYyKGdhbW1hVmVjUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX20pOyAvKiBleHBvbmVudCA9IEhCRV9TQ0FMRSArIGZhY3Rvcl9lICsgMSAqLworICAgIGdjX2lfbSA9IGZNdWx0RGl2MihnYW1tYVZlY0ltYWcsCisgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9tKTsgLyogZXhwb25lbnQgPSBIQkVfU0NBTEUgKyBmYWN0b3JfZSArIDEqLworICAgIGdjX2UgPSAqZXhwb25lbnQgKyBmYWN0b3JfZSArIDE7CisKKyAgICBzY2FsZVVwKCZnY19yX20sICZnY19pX20sICZnY19lKTsKKworICAgIHN3aXRjaCAobXVsdCkgeworICAgICAgY2FzZSAwOgorICAgICAgICAqY2VudGVyUmVhbCA9IGdjX3JfbTsKKyAgICAgICAgKmNlbnRlckltYWcgPSBnY19pX207CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICAqY2VudGVyUmVhbCA9IGZQb3cyRGl2MihnY19yX20pIC0gZlBvdzJEaXYyKGdjX2lfbSk7CisgICAgICAgICpjZW50ZXJJbWFnID0gZk11bHQoZ2Nfcl9tLCBnY19pX20pOworICAgICAgICBnY19lID0gMiAqIGdjX2UgKyAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgRklYUF9EQkwgdG1wX3IgPSBnY19yX207CisgICAgICAgIEZJWFBfREJMIHRtcF9pID0gZ2NfaV9tOworICAgICAgICBnY19yX20gPSBmUG93MkRpdjIoZ2Nfcl9tKSAtIGZQb3cyRGl2MihnY19pX20pOworICAgICAgICBnY19pX20gPSBmTXVsdCh0bXBfciwgZ2NfaV9tKTsKKyAgICAgICAgZ2NfZSA9IDMgKiBnY19lICsgMSArIDE7CisgICAgICAgIGNwbHhNdWx0RGl2MigmY2VudGVyUmVhbFswXSwgJmNlbnRlckltYWdbMF0sIGdjX3JfbSwgZ2NfaV9tLCB0bXBfciwKKyAgICAgICAgICAgICAgICAgICAgIHRtcF9pKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc2NhbGVVcChjZW50ZXJSZWFsLCBjZW50ZXJJbWFnLCAmZ2NfZSk7CisKKyAgICBGREtfQVNTRVJUKGdjX2UgPj0gMCk7CisgICAgKmV4cG9uZW50ID0gZ2NfZTsKKyAgfSBlbHNlIHsKKyAgICAqY2VudGVyUmVhbCA9IGVuZXJneTsgLyogZW5lcmd5ID0gMCAqLworICAgICpjZW50ZXJJbWFnID0gZW5lcmd5OyAvKiBlbmVyZ3kgPSAwICovCisgICAgKmV4cG9uZW50ID0gKElOVCllbmVyZ3k7CisgIH0KK30KKworc3RhdGljIGludCBnZXRIQkVTY2FsZUZhY3RvckZyYW1lKGNvbnN0IGludCBiU2JyNDEsIGNvbnN0IGludCBtYXhTdHJldGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBwaXRjaEluQmlucykgeworICBpZiAocGl0Y2hJbkJpbnMgPj0gcG1pbiAqICgxICsgYlNicjQxKSkgeworICAgIC8qIGNyb3NzcHJvZHVjdHMgZW5hYmxlZCAqLworICAgIHJldHVybiAyNjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKG1heFN0cmV0Y2ggPT0gMikgPyAyNCA6IDI1OworICB9Cit9CisKK3N0YXRpYyB2b2lkIGFkZEhpZ2hCYW5kUGFydChGSVhQX0RCTCBnX3JfbSwgRklYUF9EQkwgZ19pX20sIElOVCBnX2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgbXVsdCwgRklYUF9EQkwgZ2FtbWFDZW50ZXJSZWFsX20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgZ2FtbWFDZW50ZXJJbWFnX20sIElOVCBnYW1tYUNlbnRlcl9lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdHJldGNoLCBJTlQgc2NhbGVfZmFjdG9yX2hiZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogcW1mSEJFQnVmUmVhbF9GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiBxbWZIQkVCdWZJbWFnX0YpIHsKKyAgaWYgKChnX3JfbSB8IGdfaV9tKSAhPSBGTDJGWENPTlNUX0RCTCgwLmYpKSB7CisgICAgRklYUF9EQkwgZmFjdG9yX20gPSAoRklYUF9EQkwpMDsKKyAgICBJTlQgZmFjdG9yX2U7CisgICAgSU5UIGFkZCA9IChzdHJldGNoID09IDQpID8gMSA6IDA7CisgICAgSU5UIHNoaWZ0ID0gKHN0cmV0Y2ggPT0gNCkgPyAxIDogMjsKKworICAgIHNjYWxlVXAoJmdfcl9tLCAmZ19pX20sICZnX2UpOworICAgIEZJWFBfREJMIGVuZXJneSA9IGZQb3cyQWRkRGl2MihmUG93MkRpdjIoZ19yX20pLCBnX2lfbSk7CisgICAgZmFjdG9yX2UgPSAyICogZ19lICsgMTsKKworICAgIHN3aXRjaCAoc3RyZXRjaCkgeworICAgICAgY2FzZSAyOgorICAgICAgICBmYWN0b3JfbSA9IGludkZvdXJ0aFJvb3ROb3JtMihlbmVyZ3ksICZmYWN0b3JfZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOgorICAgICAgICBmYWN0b3JfbSA9IGludkN1YmVSb290Tm9ybTIoZW5lcmd5LCAmZmFjdG9yX2UpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgZmFjdG9yX20gPSBpbnYzRWlndGhSb290Tm9ybTIoZW5lcmd5LCAmZmFjdG9yX2UpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBmYWN0b3JfbSA9IGZNdWx0KGZhY3Rvcl9tLCBtdWx0KTsKKworICAgIEZJWFBfREJMIHRtcF9yLCB0bXBfaTsKKyAgICBjcGx4TXVsdERpdjIoJnRtcF9yLCAmdG1wX2ksIGdfcl9tLCBnX2lfbSwgZ2FtbWFDZW50ZXJSZWFsX20sCisgICAgICAgICAgICAgICAgIGdhbW1hQ2VudGVySW1hZ19tKTsKKworICAgIGdfcl9tID0gZk11bHREaXYyKHRtcF9yLCBmYWN0b3JfbSkgPDwgc2hpZnQ7CisgICAgZ19pX20gPSBmTXVsdERpdjIodG1wX2ksIGZhY3Rvcl9tKSA8PCBzaGlmdDsKKyAgICBnX2UgPSBzY2FsZV9mYWN0b3JfaGJlIC0gKGdfZSArIGZhY3Rvcl9lICsgZ2FtbWFDZW50ZXJfZSArIGFkZCk7CisgICAgZk1heCgoSU5UKTAsIGdfZSk7CisgICAgKnFtZkhCRUJ1ZlJlYWxfRiArPSBnX3JfbSA+PiBnX2U7CisgICAgKnFtZkhCRUJ1ZkltYWdfRiArPSBnX2lfbSA+PiBnX2U7CisgIH0KK30KKwordm9pZCBRbWZUcmFuc3Bvc2VyQXBwbHkoSEFORExFX0hCRV9UUkFOU1BPU0VSIGhRbWZUcmFuc3Bvc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqKiBxbWZCdWZmZXJDb2RlY1JlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCoqIHFtZkJ1ZmZlckNvZGVjSW1hZywgaW50IG5Db2xzSW4sCisgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCoqIHBwUW1mQnVmZmVyT3V0UmVhbF9GLAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwqKiBwcFFtZkJ1ZmZlck91dEltYWdfRiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGxwY0ZpbHRlclN0YXRlc1JlYWxbMiArICgzICogKDQpKV1bKDY0KV0sCisgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBscGNGaWx0ZXJTdGF0ZXNJbWFnWzIgKyAoMyAqICg0KSldWyg2NCldLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoSW5CaW5zLCBpbnQgc2NhbGVfbGIsIGludCBzY2FsZV9oYmUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNjYWxlX2hiLCBpbnQgdGltZVN0ZXAsIGludCBmaXJzdFNsb3RPZmZzc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG92X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtFRVBfU1RBVEVTX1NZTkNFRF9NT0RFIGtlZXBTdGF0ZXNTeW5jZWRNb2RlKSB7CisgIGludCBpLCBqLCBzdHJldGNoLCBiYW5kLCBzb3VyY2ViYW5kLCByLCBzOworICBpbnQgcW1mVm9jb2RlckNvbHNJbiA9IGhRbWZUcmFuc3Bvc2VyLT5ub0NvbHMgLyAyOworICBpbnQgYlNicjQxID0gaFFtZlRyYW5zcG9zZXItPmJTYnI0MTsKKworICBjb25zdCBpbnQgd2luTGVuZ3RoWzNdID0gezEwLCA4LCA2fTsKKyAgY29uc3QgaW50IHNsb3RPZmZzZXQgPSA2OyAvKiBoUW1mVHJhbnNwb3Nlci0+d2luTGVuLTY7ICovCisKKyAgaW50IHFtZk9mZnNldCA9IDIgKiBoUW1mVHJhbnNwb3Nlci0+a3N0YXJ0OworICBpbnQgc2NhbGVfYm9yZGVyID0gKG5Db2xzSW4gPT0gNjQpID8gMzIgOiBuQ29sc0luOworCisgIElOVCBzbG90X3N0cmV0Y2g0WzldID0gezAsIDAsIDAsIDAsIDIsIDQsIDYsIDgsIDEwfTsKKyAgSU5UIHNsb3Rfc3RyZXRjaDJbMTFdID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfTsKKyAgSU5UIHNsb3Rfc3RyZXRjaDNbMTBdID0gezAsIDAsIDAsIDEsIDMsIDQsIDYsIDcsIDksIDEwfTsKKyAgSU5UIGZpbHRfc3RyZXRjaDNbMTBdID0gezAsIDAsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDF9OworICBJTlQgZmlsdF9kdW1teVsxMV0gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07CisgIElOVCogcFNsb3RTdHJldGNoOworICBJTlQqIHBGaWx0OworCisgIGludCBvZmZzZXQgPSAwOyAvKiB3aGVyZSB0byB0YWtlICBRbWZUcmFuc3Bvc2VyIGRhdGEgKi8KKworICBpbnQgc2lnblByZU1vZCA9CisgICAgICAoaFFtZlRyYW5zcG9zZXItPnN5bnRoZXNpc1FtZlByZU1vZENvc19GWzBdIDwgRkwyRlhDT05TVF9EQkwoMC5mKSkgPyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAtMTsKKworICBpbnQgc2NhbGVfZmFjdG9yX2hiZSA9CisgICAgICBnZXRIQkVTY2FsZUZhY3RvckZyYW1lKGJTYnI0MSwgaFFtZlRyYW5zcG9zZXItPm1heFN0cmV0Y2gsIHBpdGNoSW5CaW5zKTsKKworICBpZiAoa2VlcFN0YXRlc1N5bmNlZE1vZGUgIT0gS0VFUF9TVEFURVNfU1lOQ0VEX09GRikgeworICAgIG9mZnNldCA9IGhRbWZUcmFuc3Bvc2VyLT5ub0NvbHMgLSBvdl9sZW4gLSBMUENfT1JERVI7CisgIH0KKworICBoUW1mVHJhbnNwb3Nlci0+aGlnaGJhbmRfZXhwWzBdID0gaFFtZlRyYW5zcG9zZXItPmhpZ2hiYW5kX2V4cFsxXTsKKyAgaFFtZlRyYW5zcG9zZXItPnRhcmdldF9leHBbMF0gPSBoUW1mVHJhbnNwb3Nlci0+dGFyZ2V0X2V4cFsxXTsKKworICBoUW1mVHJhbnNwb3Nlci0+aGlnaGJhbmRfZXhwWzFdID0gc2NhbGVfZmFjdG9yX2hiZTsKKyAgaFFtZlRyYW5zcG9zZXItPnRhcmdldF9leHBbMV0gPQorICAgICAgZml4TWF4KGhRbWZUcmFuc3Bvc2VyLT5oaWdoYmFuZF9leHBbMV0sIGhRbWZUcmFuc3Bvc2VyLT5oaWdoYmFuZF9leHBbMF0pOworCisgIHNjYWxlX2ZhY3Rvcl9oYmUgPSBoUW1mVHJhbnNwb3Nlci0+dGFyZ2V0X2V4cFsxXTsKKworICBpbnQgc2hpZnRfb3YgPSBoUW1mVHJhbnNwb3Nlci0+dGFyZ2V0X2V4cFswXSAtIGhRbWZUcmFuc3Bvc2VyLT50YXJnZXRfZXhwWzFdOworCisgIGlmIChzaGlmdF9vdiAhPSAwKSB7CisgICAgZm9yIChpID0gMDsgaSA8IEhCRV9NQVhfT1VUX1NMT1RTOyBpKyspIHsKKyAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBRTUZfU1lOVEhfQ0hBTk5FTFM7IGJhbmQrKykgeworICAgICAgICBpZiAoc2hpZnRfb3YgPj0gMCkgeworICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZIQkVCdWZSZWFsX0ZbaV1bYmFuZF0gPDw9IHNoaWZ0X292OworICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZIQkVCdWZJbWFnX0ZbaV1bYmFuZF0gPDw9IHNoaWZ0X292OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZIQkVCdWZSZWFsX0ZbaV1bYmFuZF0gPj49ICgtc2hpZnRfb3YpOworICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZIQkVCdWZJbWFnX0ZbaV1bYmFuZF0gPj49ICgtc2hpZnRfb3YpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKChrZWVwU3RhdGVzU3luY2VkTW9kZSA9PSBLRUVQX1NUQVRFU19TWU5DRURfT0ZGKSAmJiBzaGlmdF9vdiAhPSAwKSB7CisgICAgZm9yIChpID0gdGltZVN0ZXAgKiBmaXJzdFNsb3RPZmZzc2V0OyBpIDwgb3ZfbGVuOyBpKyspIHsKKyAgICAgIGZvciAoYmFuZCA9IGhRbWZUcmFuc3Bvc2VyLT5zdGFydEJhbmQ7IGJhbmQgPCBoUW1mVHJhbnNwb3Nlci0+c3RvcEJhbmQ7CisgICAgICAgICAgIGJhbmQrKykgeworICAgICAgICBpZiAoc2hpZnRfb3YgPj0gMCkgeworICAgICAgICAgIHBwUW1mQnVmZmVyT3V0UmVhbF9GW2ldW2JhbmRdIDw8PSBzaGlmdF9vdjsKKyAgICAgICAgICBwcFFtZkJ1ZmZlck91dEltYWdfRltpXVtiYW5kXSA8PD0gc2hpZnRfb3Y7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHBRbWZCdWZmZXJPdXRSZWFsX0ZbaV1bYmFuZF0gPj49ICgtc2hpZnRfb3YpOworICAgICAgICAgIHBwUW1mQnVmZmVyT3V0SW1hZ19GW2ldW2JhbmRdID4+PSAoLXNoaWZ0X292KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIHNoaWZ0IGxwYyBmaWx0ZXJzdGF0ZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgdGltZVN0ZXAgKiBmaXJzdFNsb3RPZmZzc2V0ICsgTFBDX09SREVSOyBpKyspIHsKKyAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCAoNjQpOyBiYW5kKyspIHsKKyAgICAgICAgaWYgKHNoaWZ0X292ID49IDApIHsKKyAgICAgICAgICBscGNGaWx0ZXJTdGF0ZXNSZWFsW2ldW2JhbmRdIDw8PSBzaGlmdF9vdjsKKyAgICAgICAgICBscGNGaWx0ZXJTdGF0ZXNJbWFnW2ldW2JhbmRdIDw8PSBzaGlmdF9vdjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBscGNGaWx0ZXJTdGF0ZXNSZWFsW2ldW2JhbmRdID4+PSAoLXNoaWZ0X292KTsKKyAgICAgICAgICBscGNGaWx0ZXJTdGF0ZXNJbWFnW2ldW2JhbmRdID4+PSAoLXNoaWZ0X292KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIEZJWFBfREJMIHR3aWRfbV9uZXdbM11bMl07IC8qIFtzdHJldGNoXVtjb3Mvc2luXSAqLworICBJTlQgc3RlcHNpemUgPSAxICsgIWJTYnI0MSwgc2luZV9vZmZzZXQgPSAyNCwgbW9kID0gOTY7CisgIElOVCBtdWx0WzNdID0gezEsIDIsIDN9OworCisgIGZvciAocyA9IDA7IHMgPD0gTUFYX1NUUkVUQ0hfSEJFIC0gMjsgcysrKSB7CisgICAgdHdpZF9tX25ld1tzXVswXSA9IHR3aWRkbGVbKG11bHRbc10gKiAoc3RlcHNpemUgKiBwaXRjaEluQmlucykpICUgbW9kXTsKKyAgICB0d2lkX21fbmV3W3NdWzFdID0KKyAgICAgICAgdHdpZGRsZVsoKG11bHRbc10gKiAoc3RlcHNpemUgKiBwaXRjaEluQmlucykpICsgc2luZV9vZmZzZXQpICUgbW9kXTsKKyAgfQorCisgIC8qIFRpbWUtc3RyZXRjaCAqLworICBmb3IgKGogPSAwOyBqIDwgcW1mVm9jb2RlckNvbHNJbjsgaisrKSB7CisgICAgaW50IHNpZ24gPSAtMSwgaywgeiwgYWRkcnNoaWZ0LCBjb2RlY1RlbXBfZTsKKyAgICAvKiB1cGRhdGUgaW5idWYgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaFFtZlRyYW5zcG9zZXItPnN5bnRoU2l6ZTsgaSsrKSB7CisgICAgICBoUW1mVHJhbnNwb3Nlci0+aW5CdWZfRltpXSA9CisgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPmluQnVmX0ZbaSArIDIgKiBoUW1mVHJhbnNwb3Nlci0+c3ludGhTaXplXTsKKyAgICB9CisKKyAgICAvKiBydW4gc3ludGhlc2lzIGZvciB0d28gc2JyIHNsb3RzIGFzIHRyYW5zcG9zZXIgdXNlcworICAgIGhhbGYgc2xvdHMgZG91YmxlIGJhbmRzIHJlcHJlc2VudGF0aW9uICovCisgICAgZm9yICh6ID0gMDsgeiA8IDI7IHorKykgeworICAgICAgaW50IHNjYWxlX2ZhY3RvciA9ICgobkNvbHNJbiA9PSA2NCkgJiYgKCgyICogaiArIHopIDwgc2NhbGVfYm9yZGVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzY2FsZV9sYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNjYWxlX2hiZTsKKyAgICAgIGNvZGVjVGVtcF9lID0gc2NhbGVfZmFjdG9yIC0gMTsgLyogLTIgZm9yIERpdjIgYW5kIGNvcy9zaW4gc2NhbGUgb2YgMSAqLworCisgICAgICBmb3IgKGsgPSAwOyBrIDwgaFFtZlRyYW5zcG9zZXItPnN5bnRoU2l6ZTsgaysrKSB7CisgICAgICAgIGludCBraSA9IGhRbWZUcmFuc3Bvc2VyLT5rc3RhcnQgKyBrOworICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mQnVmZmVyQ29kZWNUZW1wU2xvdF9GW2tdID0KKyAgICAgICAgICAgIGZNdWx0RGl2MihzaWduUHJlTW9kICogaFFtZlRyYW5zcG9zZXItPnN5bnRoZXNpc1FtZlByZU1vZENvc19GW2tdLAorICAgICAgICAgICAgICAgICAgICAgIHFtZkJ1ZmZlckNvZGVjUmVhbFsyICogaiArIHpdW2tpXSk7CisgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZCdWZmZXJDb2RlY1RlbXBTbG90X0Zba10gKz0KKyAgICAgICAgICAgIGZNdWx0RGl2MihzaWduUHJlTW9kICogaFFtZlRyYW5zcG9zZXItPnN5bnRoZXNpc1FtZlByZU1vZFNpbl9GW2tdLAorICAgICAgICAgICAgICAgICAgICAgIHFtZkJ1ZmZlckNvZGVjSW1hZ1syICogaiArIHpdW2tpXSk7CisgICAgICB9CisKKyAgICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQocFdvcmtCdWZmZXIsIEZJWFBfREJMLCAoSEJFX01BWF9RTUZfQkFORFMgPDwgMSkpOworCisgICAgICBxbWZTeW50aGVzaXNGaWx0ZXJpbmdTbG90KAorICAgICAgICAgICZoUW1mVHJhbnNwb3Nlci0+SEJFU3ludGhlc2lzUU1GLAorICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZCdWZmZXJDb2RlY1RlbXBTbG90X0YsIE5VTEwsIDAsCisgICAgICAgICAgLTcgLSBoUW1mVHJhbnNwb3Nlci0+SEJFU3ludGhlc2lzUU1GLmZpbHRlclNjYWxlIC0gY29kZWNUZW1wX2UgKyAxLAorICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5pbkJ1Zl9GICsgaFFtZlRyYW5zcG9zZXItPnN5bnRoU2l6ZSAqICh6ICsgMSksIDEsCisgICAgICAgICAgcFdvcmtCdWZmZXIpOworCisgICAgICBDX0FBTExPQ19TQ1JBVENIX0VORChwV29ya0J1ZmZlciwgRklYUF9EQkwsIChIQkVfTUFYX1FNRl9CQU5EUyA8PCAxKSk7CisgICAgfQorCisgICAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChwV29ya0J1ZmZlciwgRklYUF9EQkwsIChIQkVfTUFYX1FNRl9CQU5EUyA8PCAxKSk7CisKKyAgICBxbWZBbmFseXNpc0ZpbHRlcmluZ1Nsb3QoJmhRbWZUcmFuc3Bvc2VyLT5IQkVBbmFseXNpc2NRTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZlJlYWxfRltRTUZfV0lOX0xFTiAtIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZJbWFnX0ZbUU1GX1dJTl9MRU4gLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPmluQnVmX0YgKyAxLCAxLCBwV29ya0J1ZmZlcik7CisKKyAgICBDX0FBTExPQ19TQ1JBVENIX0VORChwV29ya0J1ZmZlciwgRklYUF9EQkwsIChIQkVfTUFYX1FNRl9CQU5EUyA8PCAxKSk7CisKKyAgICBpZiAoKGtlZXBTdGF0ZXNTeW5jZWRNb2RlID09IEtFRVBfU1RBVEVTX1NZTkNFRF9OT1JNQUwpICYmCisgICAgICAgIGogPD0gcW1mVm9jb2RlckNvbHNJbiAtICgoTFBDX09SREVSICsgb3ZfbGVuICsgUU1GX1dJTl9MRU4gLSAxKSA+PiAxKSkgeworICAgICAgLyogdXBkYXRlIGluIGJ1ZmZlciAqLworICAgICAgZm9yIChpID0gMDsgaSA8IFFNRl9XSU5fTEVOIC0gMTsgaSsrKSB7CisgICAgICAgIEZES21lbWNweSgKKyAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZlJlYWxfRltpXSwKKyAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZlJlYWxfRltpICsgMV0sCisgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogaFFtZlRyYW5zcG9zZXItPkhCRUFuYWx5c2lzY1FNRi5ub19jaGFubmVscyk7CisgICAgICAgIEZES21lbWNweSgKKyAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZkltYWdfRltpXSwKKyAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZkltYWdfRltpICsgMV0sCisgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogaFFtZlRyYW5zcG9zZXItPkhCRUFuYWx5c2lzY1FNRi5ub19jaGFubmVscyk7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBmb3IgKHN0cmV0Y2ggPSAyOyBzdHJldGNoIDw9IGhRbWZUcmFuc3Bvc2VyLT5tYXhTdHJldGNoOyBzdHJldGNoKyspIHsKKyAgICAgIGludCBzdGFydCA9IHNsb3RPZmZzZXQgLSB3aW5MZW5ndGhbc3RyZXRjaCAtIDJdIC8gMjsKKyAgICAgIGludCBzdG9wID0gc2xvdE9mZnNldCArIHdpbkxlbmd0aFtzdHJldGNoIC0gMl0gLyAyOworCisgICAgICBGSVhQX0RCTCBmYWN0b3IgPSBGTDJGWENPTlNUX0RCTCgxLmYgLyAzLmYpOworCisgICAgICBmb3IgKGJhbmQgPSBoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbc3RyZXRjaCAtIDJdOworICAgICAgICAgICBiYW5kIDwgaFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mW3N0cmV0Y2ggLSAxXTsgYmFuZCsrKSB7CisgICAgICAgIEZJWFBfREJMIGdhbW1hQ2VudGVyUmVhbF9tWzJdID0geyhGSVhQX0RCTCkwLCAoRklYUF9EQkwpMH0sCisgICAgICAgICAgICAgICAgIGdhbW1hQ2VudGVySW1hZ19tWzJdID0geyhGSVhQX0RCTCkwLCAoRklYUF9EQkwpMH07CisgICAgICAgIElOVCBnYW1tYUNlbnRlcl9lWzJdID0gezAsIDB9OworCisgICAgICAgIEZJWFBfREJMIGdhbW1hVmVjUmVhbF9tWzJdID0geyhGSVhQX0RCTCkwLCAoRklYUF9EQkwpMH0sCisgICAgICAgICAgICAgICAgIGdhbW1hVmVjSW1hZ19tWzJdID0geyhGSVhQX0RCTCkwLCAoRklYUF9EQkwpMH07CisgICAgICAgIElOVCBnYW1tYVZlY19lWzJdID0gezAsIDB9OworCisgICAgICAgIEZJWFBfREJMIHdpbmdhaW4gPSAoRklYUF9EQkwpMDsKKworICAgICAgICBnYW1tYUNlbnRlcl9lWzBdID0KKyAgICAgICAgICAgIFNDQUxFMkVYUCgtaFFtZlRyYW5zcG9zZXItPkhCRUFuYWx5c2lzY1FNRi5vdXRTY2FsZWZhY3Rvcik7CisgICAgICAgIGdhbW1hQ2VudGVyX2VbMV0gPQorICAgICAgICAgICAgU0NBTEUyRVhQKC1oUW1mVHJhbnNwb3Nlci0+SEJFQW5hbHlzaXNjUU1GLm91dFNjYWxlZmFjdG9yKTsKKworICAgICAgICAvKiBpbnRlcnBvbGF0aW9uIGZpbHRlcnMgZm9yIDNyZCBvcmRlciAqLworICAgICAgICBzb3VyY2ViYW5kID0gMiAqIGJhbmQgLyBzdHJldGNoIC0gcW1mT2Zmc2V0OworICAgICAgICBGREtfQVNTRVJUKHNvdXJjZWJhbmQgPj0gMCk7CisKKyAgICAgICAgLyogbWF4aW11bSBnYW1tYUNlbnRlcl9lID09IDIwICovCisgICAgICAgIGNhbGN1bGF0ZUNlbnRlckZJWFAoCisgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0Zbc2xvdE9mZnNldF1bc291cmNlYmFuZF0sCisgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZJbWFnX0Zbc2xvdE9mZnNldF1bc291cmNlYmFuZF0sCisgICAgICAgICAgICAmZ2FtbWFDZW50ZXJSZWFsX21bMF0sICZnYW1tYUNlbnRlckltYWdfbVswXSwgJmdhbW1hQ2VudGVyX2VbMF0sCisgICAgICAgICAgICBzdHJldGNoLCBzdHJldGNoIC0gMik7CisKKyAgICAgICAgaWYgKHN0cmV0Y2ggPT0gNCkgeworICAgICAgICAgIHIgPSBiYW5kIC0gMiAqIChiYW5kIC8gMik7CisgICAgICAgICAgc291cmNlYmFuZCArPSAociA9PSAwKSA/IC0xIDogMTsKKyAgICAgICAgICBwU2xvdFN0cmV0Y2ggPSBzbG90X3N0cmV0Y2g0OworICAgICAgICAgIGZhY3RvciA9IEZMMkZYQ09OU1RfREJMKDIuZiAvIDMuZik7CisgICAgICAgICAgcEZpbHQgPSBmaWx0X2R1bW15OworICAgICAgICB9IGVsc2UgaWYgKHN0cmV0Y2ggPT0gMikgeworICAgICAgICAgIHIgPSAwOworICAgICAgICAgIHNvdXJjZWJhbmQgPSAyICogYmFuZCAvIHN0cmV0Y2ggLSBxbWZPZmZzZXQ7CisgICAgICAgICAgcFNsb3RTdHJldGNoID0gc2xvdF9zdHJldGNoMjsKKyAgICAgICAgICBmYWN0b3IgPSBGTDJGWENPTlNUX0RCTCgxLmYgLyAzLmYpOworICAgICAgICAgIHBGaWx0ID0gZmlsdF9kdW1teTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByID0gMiAqIGJhbmQgLSAzICogKDIgKiBiYW5kIC8gMyk7CisgICAgICAgICAgc291cmNlYmFuZCA9IDIgKiBiYW5kIC8gc3RyZXRjaCAtIHFtZk9mZnNldDsKKyAgICAgICAgICBwU2xvdFN0cmV0Y2ggPSBzbG90X3N0cmV0Y2gzOworICAgICAgICAgIGZhY3RvciA9IEZMMkZYQ09OU1RfREJMKDEuNDE0MmYgLyAzLjBmKTsKKyAgICAgICAgICBwRmlsdCA9IGZpbHRfc3RyZXRjaDM7CisgICAgICAgIH0KKworICAgICAgICBpZiAociA9PSAyKSB7CisgICAgICAgICAgY2FsY3VsYXRlQ2VudGVyRklYUCgKKyAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmUmVhbF9GW3Nsb3RPZmZzZXRdW3NvdXJjZWJhbmQgKyAxXSwKKyAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GW3Nsb3RPZmZzZXRdW3NvdXJjZWJhbmQgKyAxXSwKKyAgICAgICAgICAgICAgJmdhbW1hQ2VudGVyUmVhbF9tWzFdLCAmZ2FtbWFDZW50ZXJJbWFnX21bMV0sICZnYW1tYUNlbnRlcl9lWzFdLAorICAgICAgICAgICAgICBzdHJldGNoLCBzdHJldGNoIC0gMik7CisKKyAgICAgICAgICBmYWN0b3IgPSBGTDJGWENPTlNUX0RCTCgxLjQxNDJmIC8gNi4wZik7CisgICAgICAgIH0KKworICAgICAgICBpZiAociA9PSAyKSB7CisgICAgICAgICAgZm9yIChrID0gc3RhcnQ7IGsgPCBzdG9wOyBrKyspIHsKKyAgICAgICAgICAgIGdhbW1hVmVjUmVhbF9tWzBdID0KKyAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0ZbcFNsb3RTdHJldGNoW2tdXVtzb3VyY2ViYW5kXTsKKyAgICAgICAgICAgIGdhbW1hVmVjUmVhbF9tWzFdID0KKyAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0ZbcFNsb3RTdHJldGNoW2tdXVtzb3VyY2ViYW5kICsgMV07CisgICAgICAgICAgICBnYW1tYVZlY0ltYWdfbVswXSA9CisgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GW3BTbG90U3RyZXRjaFtrXV1bc291cmNlYmFuZF07CisgICAgICAgICAgICBnYW1tYVZlY0ltYWdfbVsxXSA9CisgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GW3BTbG90U3RyZXRjaFtrXV1bc291cmNlYmFuZCArIDFdOworICAgICAgICAgICAgZ2FtbWFWZWNfZVswXSA9IGdhbW1hVmVjX2VbMV0gPQorICAgICAgICAgICAgICAgIFNDQUxFMkVYUCgtaFFtZlRyYW5zcG9zZXItPkhCRUFuYWx5c2lzY1FNRi5vdXRTY2FsZWZhY3Rvcik7CisKKyAgICAgICAgICAgIGlmIChwRmlsdFtrXSA9PSAxKSB7CisgICAgICAgICAgICAgIEZJWFBfREJMIHRtcFJlYWxGID0gZ2FtbWFWZWNSZWFsX21bMF0sIHRtcEltYWdGOworICAgICAgICAgICAgICBnYW1tYVZlY1JlYWxfbVswXSA9CisgICAgICAgICAgICAgICAgICAoZk11bHQoZ2FtbWFWZWNSZWFsX21bMF0sIGhpbnRSZWFsX0Zbc291cmNlYmFuZCAlIDRdWzFdKSAtCisgICAgICAgICAgICAgICAgICAgZk11bHQoZ2FtbWFWZWNJbWFnX21bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgaGludFJlYWxfRlsoc291cmNlYmFuZCArIDMpICUgNF1bMV0pKSA+PgorICAgICAgICAgICAgICAgICAgMTsgLyogc3VtIHNob3VsZCBiZSA8PSAxIGJlY2F1c2Ugb2Ygc2luL2NvcyBtdWx0aXBsaWNhdGlvbiAqLworICAgICAgICAgICAgICBnYW1tYVZlY0ltYWdfbVswXSA9CisgICAgICAgICAgICAgICAgICAoZk11bHQodG1wUmVhbEYsIGhpbnRSZWFsX0ZbKHNvdXJjZWJhbmQgKyAzKSAlIDRdWzFdKSArCisgICAgICAgICAgICAgICAgICAgZk11bHQoZ2FtbWFWZWNJbWFnX21bMF0sIGhpbnRSZWFsX0Zbc291cmNlYmFuZCAlIDRdWzFdKSkgPj4KKyAgICAgICAgICAgICAgICAgIDE7IC8qIHN1bSBzaG91bGQgYmUgPD0gMSBiZWNhdXNlIG9mIHNpbi9jb3MgbXVsdGlwbGljYXRpb24gKi8KKworICAgICAgICAgICAgICB0bXBSZWFsRiA9IGhRbWZUcmFuc3Bvc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cW1mSW5CdWZSZWFsX0ZbcFNsb3RTdHJldGNoW2tdICsgMV1bc291cmNlYmFuZF07CisgICAgICAgICAgICAgIHRtcEltYWdGID0gaFFtZlRyYW5zcG9zZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5xbWZJbkJ1ZkltYWdfRltwU2xvdFN0cmV0Y2hba10gKyAxXVtzb3VyY2ViYW5kXTsKKworICAgICAgICAgICAgICBnYW1tYVZlY1JlYWxfbVswXSArPQorICAgICAgICAgICAgICAgICAgKGZNdWx0KHRtcFJlYWxGLCBoaW50UmVhbF9GW3NvdXJjZWJhbmQgJSA0XVsxXSkgLQorICAgICAgICAgICAgICAgICAgIGZNdWx0KHRtcEltYWdGLCBoaW50UmVhbF9GWyhzb3VyY2ViYW5kICsgMSkgJSA0XVsxXSkpID4+CisgICAgICAgICAgICAgICAgICAxOyAvKiBzdW0gc2hvdWxkIGJlIDw9IDEgYmVjYXVzZSBvZiBzaW4vY29zIG11bHRpcGxpY2F0aW9uICovCisgICAgICAgICAgICAgIGdhbW1hVmVjSW1hZ19tWzBdICs9CisgICAgICAgICAgICAgICAgICAoZk11bHQodG1wUmVhbEYsIGhpbnRSZWFsX0ZbKHNvdXJjZWJhbmQgKyAxKSAlIDRdWzFdKSArCisgICAgICAgICAgICAgICAgICAgZk11bHQodG1wSW1hZ0YsIGhpbnRSZWFsX0Zbc291cmNlYmFuZCAlIDRdWzFdKSkgPj4KKyAgICAgICAgICAgICAgICAgIDE7IC8qIHN1bSBzaG91bGQgYmUgPD0gMSBiZWNhdXNlIG9mIHNpbi9jb3MgbXVsdGlwbGljYXRpb24gKi8KKyAgICAgICAgICAgICAgZ2FtbWFWZWNfZVswXSsrOworCisgICAgICAgICAgICAgIHRtcFJlYWxGID0gZ2FtbWFWZWNSZWFsX21bMV07CisKKyAgICAgICAgICAgICAgZ2FtbWFWZWNSZWFsX21bMV0gPQorICAgICAgICAgICAgICAgICAgKGZNdWx0KGdhbW1hVmVjUmVhbF9tWzFdLCBoaW50UmVhbF9GW3NvdXJjZWJhbmQgJSA0XVsyXSkgLQorICAgICAgICAgICAgICAgICAgIGZNdWx0KGdhbW1hVmVjSW1hZ19tWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRSZWFsX0ZbKHNvdXJjZWJhbmQgKyAzKSAlIDRdWzJdKSkgPj4KKyAgICAgICAgICAgICAgICAgIDE7CisgICAgICAgICAgICAgIGdhbW1hVmVjSW1hZ19tWzFdID0KKyAgICAgICAgICAgICAgICAgIChmTXVsdCh0bXBSZWFsRiwgaGludFJlYWxfRlsoc291cmNlYmFuZCArIDMpICUgNF1bMl0pICsKKyAgICAgICAgICAgICAgICAgICBmTXVsdChnYW1tYVZlY0ltYWdfbVsxXSwgaGludFJlYWxfRltzb3VyY2ViYW5kICUgNF1bMl0pKSA+PgorICAgICAgICAgICAgICAgICAgMTsKKworICAgICAgICAgICAgICB0bXBSZWFsRiA9CisgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3NlcgorICAgICAgICAgICAgICAgICAgICAgIC0+cW1mSW5CdWZSZWFsX0ZbcFNsb3RTdHJldGNoW2tdICsgMV1bc291cmNlYmFuZCArIDFdOworICAgICAgICAgICAgICB0bXBJbWFnRiA9CisgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3NlcgorICAgICAgICAgICAgICAgICAgICAgIC0+cW1mSW5CdWZJbWFnX0ZbcFNsb3RTdHJldGNoW2tdICsgMV1bc291cmNlYmFuZCArIDFdOworCisgICAgICAgICAgICAgIGdhbW1hVmVjUmVhbF9tWzFdICs9CisgICAgICAgICAgICAgICAgICAoZk11bHQodG1wUmVhbEYsIGhpbnRSZWFsX0Zbc291cmNlYmFuZCAlIDRdWzJdKSAtCisgICAgICAgICAgICAgICAgICAgZk11bHQodG1wSW1hZ0YsIGhpbnRSZWFsX0ZbKHNvdXJjZWJhbmQgKyAxKSAlIDRdWzJdKSkgPj4KKyAgICAgICAgICAgICAgICAgIDE7CisgICAgICAgICAgICAgIGdhbW1hVmVjSW1hZ19tWzFdICs9CisgICAgICAgICAgICAgICAgICAoZk11bHQodG1wUmVhbEYsIGhpbnRSZWFsX0ZbKHNvdXJjZWJhbmQgKyAxKSAlIDRdWzJdKSArCisgICAgICAgICAgICAgICAgICAgZk11bHQodG1wSW1hZ0YsIGhpbnRSZWFsX0Zbc291cmNlYmFuZCAlIDRdWzJdKSkgPj4KKyAgICAgICAgICAgICAgICAgIDE7CisgICAgICAgICAgICAgIGdhbW1hVmVjX2VbMV0rKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWRkSGlnaEJhbmRQYXJ0KGdhbW1hVmVjUmVhbF9tWzFdLCBnYW1tYVZlY0ltYWdfbVsxXSwgZ2FtbWFWZWNfZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3IsIGdhbW1hQ2VudGVyUmVhbF9tWzBdLCBnYW1tYUNlbnRlckltYWdfbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW1tYUNlbnRlcl9lWzBdLCBzdHJldGNoLCBzY2FsZV9mYWN0b3JfaGJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmUmVhbF9GW2tdW2JhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmSW1hZ19GW2tdW2JhbmRdKTsKKworICAgICAgICAgICAgYWRkSGlnaEJhbmRQYXJ0KGdhbW1hVmVjUmVhbF9tWzBdLCBnYW1tYVZlY0ltYWdfbVswXSwgZ2FtbWFWZWNfZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3IsIGdhbW1hQ2VudGVyUmVhbF9tWzFdLCBnYW1tYUNlbnRlckltYWdfbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW1tYUNlbnRlcl9lWzFdLCBzdHJldGNoLCBzY2FsZV9mYWN0b3JfaGJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmUmVhbF9GW2tdW2JhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmSW1hZ19GW2tdW2JhbmRdKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChrID0gc3RhcnQ7IGsgPCBzdG9wOyBrKyspIHsKKyAgICAgICAgICAgIGdhbW1hVmVjUmVhbF9tWzBdID0KKyAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0ZbcFNsb3RTdHJldGNoW2tdXVtzb3VyY2ViYW5kXTsKKyAgICAgICAgICAgIGdhbW1hVmVjSW1hZ19tWzBdID0KKyAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZJbWFnX0ZbcFNsb3RTdHJldGNoW2tdXVtzb3VyY2ViYW5kXTsKKyAgICAgICAgICAgIGdhbW1hVmVjX2VbMF0gPQorICAgICAgICAgICAgICAgIFNDQUxFMkVYUCgtaFFtZlRyYW5zcG9zZXItPkhCRUFuYWx5c2lzY1FNRi5vdXRTY2FsZWZhY3Rvcik7CisKKyAgICAgICAgICAgIGlmIChwRmlsdFtrXSA9PSAxKSB7CisgICAgICAgICAgICAgIEZJWFBfREJMIHRtcFJlYWxGID0gZ2FtbWFWZWNSZWFsX21bMF0sIHRtcEltYWdGOworICAgICAgICAgICAgICBnYW1tYVZlY1JlYWxfbVswXSA9CisgICAgICAgICAgICAgICAgICAoZk11bHQoZ2FtbWFWZWNSZWFsX21bMF0sIGhpbnRSZWFsX0Zbc291cmNlYmFuZCAlIDRdWzFdKSAtCisgICAgICAgICAgICAgICAgICAgZk11bHQoZ2FtbWFWZWNJbWFnX21bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgaGludFJlYWxfRlsoc291cmNlYmFuZCArIDMpICUgNF1bMV0pKSA+PgorICAgICAgICAgICAgICAgICAgMTsgLyogc3VtIHNob3VsZCBiZSA8PSAxIGJlY2F1c2Ugb2Ygc2luL2NvcyBtdWx0aXBsaWNhdGlvbiAqLworICAgICAgICAgICAgICBnYW1tYVZlY0ltYWdfbVswXSA9CisgICAgICAgICAgICAgICAgICAoZk11bHQodG1wUmVhbEYsIGhpbnRSZWFsX0ZbKHNvdXJjZWJhbmQgKyAzKSAlIDRdWzFdKSArCisgICAgICAgICAgICAgICAgICAgZk11bHQoZ2FtbWFWZWNJbWFnX21bMF0sIGhpbnRSZWFsX0Zbc291cmNlYmFuZCAlIDRdWzFdKSkgPj4KKyAgICAgICAgICAgICAgICAgIDE7IC8qIHN1bSBzaG91bGQgYmUgPD0gMSBiZWNhdXNlIG9mIHNpbi9jb3MgbXVsdGlwbGljYXRpb24gKi8KKworICAgICAgICAgICAgICB0bXBSZWFsRiA9IGhRbWZUcmFuc3Bvc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cW1mSW5CdWZSZWFsX0ZbcFNsb3RTdHJldGNoW2tdICsgMV1bc291cmNlYmFuZF07CisgICAgICAgICAgICAgIHRtcEltYWdGID0gaFFtZlRyYW5zcG9zZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5xbWZJbkJ1ZkltYWdfRltwU2xvdFN0cmV0Y2hba10gKyAxXVtzb3VyY2ViYW5kXTsKKworICAgICAgICAgICAgICBnYW1tYVZlY1JlYWxfbVswXSArPQorICAgICAgICAgICAgICAgICAgKGZNdWx0KHRtcFJlYWxGLCBoaW50UmVhbF9GW3NvdXJjZWJhbmQgJSA0XVsxXSkgLQorICAgICAgICAgICAgICAgICAgIGZNdWx0KHRtcEltYWdGLCBoaW50UmVhbF9GWyhzb3VyY2ViYW5kICsgMSkgJSA0XVsxXSkpID4+CisgICAgICAgICAgICAgICAgICAxOyAvKiBzdW0gc2hvdWxkIGJlIDw9IDEgYmVjYXVzZSBvZiBzaW4vY29zIG11bHRpcGxpY2F0aW9uICovCisgICAgICAgICAgICAgIGdhbW1hVmVjSW1hZ19tWzBdICs9CisgICAgICAgICAgICAgICAgICAoZk11bHQodG1wUmVhbEYsIGhpbnRSZWFsX0ZbKHNvdXJjZWJhbmQgKyAxKSAlIDRdWzFdKSArCisgICAgICAgICAgICAgICAgICAgZk11bHQodG1wSW1hZ0YsIGhpbnRSZWFsX0Zbc291cmNlYmFuZCAlIDRdWzFdKSkgPj4KKyAgICAgICAgICAgICAgICAgIDE7IC8qIHN1bSBzaG91bGQgYmUgPD0gMSBiZWNhdXNlIG9mIHNpbi9jb3MgbXVsdGlwbGljYXRpb24gKi8KKyAgICAgICAgICAgICAgZ2FtbWFWZWNfZVswXSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhZGRIaWdoQmFuZFBhcnQoZ2FtbWFWZWNSZWFsX21bMF0sIGdhbW1hVmVjSW1hZ19tWzBdLCBnYW1tYVZlY19lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvciwgZ2FtbWFDZW50ZXJSZWFsX21bMF0sIGdhbW1hQ2VudGVySW1hZ19tWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbW1hQ2VudGVyX2VbMF0sIHN0cmV0Y2gsIHNjYWxlX2ZhY3Rvcl9oYmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhRbWZUcmFuc3Bvc2VyLT5xbWZIQkVCdWZSZWFsX0Zba11bYmFuZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhRbWZUcmFuc3Bvc2VyLT5xbWZIQkVCdWZJbWFnX0Zba11bYmFuZF0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIHBpdGNoSW5CaW5zIGlzIGdpdmVuIHdpdGggdGhlIHJlc29sdXRpb24gb2YgYSA3NjggYmlucyBGRlQgYW5kIHdlCisgICAgICAgICAqIG5lZWQgNjQgUU1GIHVuaXRzIHNvIGZhY3RvciA3NjgvNjQgPSAxMiAqLworICAgICAgICBpZiAocGl0Y2hJbkJpbnMgPj0gcG1pbiAqICgxICsgYlNicjQxKSkgeworICAgICAgICAgIGludCB0ciwgdGkxLCB0aTIsIG1UciA9IDAsIHRzMSA9IDAsIHRzMiA9IDAsIG1WYWxfZSA9IDAsIHRlbXBfZSA9IDA7CisgICAgICAgICAgaW50IHNxbWFnMF9lID0KKyAgICAgICAgICAgICAgU0NBTEUyRVhQKC1oUW1mVHJhbnNwb3Nlci0+SEJFQW5hbHlzaXNjUU1GLm91dFNjYWxlZmFjdG9yKTsKKworICAgICAgICAgIEZJWFBfREJMIG1WYWxfRiA9IEZMMkZYQ09OU1RfREJMKDAuZiksIHNxbWFnMF9GLCBzcW1hZzFfRiwgc3FtYWcyX0YsCisgICAgICAgICAgICAgICAgICAgdGVtcF9GLCBmMV9GOyAvKiBhbGwgZXF1YWwgZXhwb25lbnQgKi8KKyAgICAgICAgICBzaWduID0gLTE7CisKKyAgICAgICAgICBzb3VyY2ViYW5kID0gMiAqIGJhbmQgLyBzdHJldGNoIC0gcW1mT2Zmc2V0OyAvKiBjb25zaXN0ZW50IHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBjb21wdXRlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJldGNoID0gMyw0LiAqLworICAgICAgICAgIEZES19BU1NFUlQoc291cmNlYmFuZCA+PSAwKTsKKworICAgICAgICAgIEZJWFBfREJMIHNxbWFnMFJfRiA9CisgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZlJlYWxfRltzbG90T2Zmc2V0XVtzb3VyY2ViYW5kXTsKKyAgICAgICAgICBGSVhQX0RCTCBzcW1hZzBJX0YgPQorICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZJbWFnX0Zbc2xvdE9mZnNldF1bc291cmNlYmFuZF07CisgICAgICAgICAgc2NhbGVVcCgmc3FtYWcwUl9GLCAmc3FtYWcwSV9GLCAmc3FtYWcwX2UpOworCisgICAgICAgICAgc3FtYWcwX0YgPSBmUG93MkRpdjIoc3FtYWcwUl9GKTsKKyAgICAgICAgICBzcW1hZzBfRiArPSBmUG93MkRpdjIoc3FtYWcwSV9GKTsKKyAgICAgICAgICBzcW1hZzBfZSA9IDIgKiBzcW1hZzBfZSArIDE7CisKKyAgICAgICAgICBmb3IgKHRyID0gMTsgdHIgPCBzdHJldGNoOyB0cisrKSB7CisgICAgICAgICAgICBpbnQgc3FtYWcxX2UgPQorICAgICAgICAgICAgICAgIFNDQUxFMkVYUCgtaFFtZlRyYW5zcG9zZXItPkhCRUFuYWx5c2lzY1FNRi5vdXRTY2FsZWZhY3Rvcik7CisgICAgICAgICAgICBpbnQgc3FtYWcyX2UgPQorICAgICAgICAgICAgICAgIFNDQUxFMkVYUCgtaFFtZlRyYW5zcG9zZXItPkhCRUFuYWx5c2lzY1FNRi5vdXRTY2FsZWZhY3Rvcik7CisKKyAgICAgICAgICAgIEZJWFBfREJMIHRtcF9iYW5kID0gYmFuZF9GW2JhbmRdOworICAgICAgICAgICAgRklYUF9EQkwgdHJfcCA9CisgICAgICAgICAgICAgICAgZk11bHQocF9GW3BpdGNoSW5CaW5zXSA+PiBiU2JyNDEsIHRyX3N0clt0ciAtIDFdKTsgLyogc2NhbGUgNyAqLworICAgICAgICAgICAgZjFfRiA9CisgICAgICAgICAgICAgICAgZk11bHQodG1wX2JhbmQgLSB0cl9wLCBzdHJldGNoZmFjW3N0cmV0Y2ggLSAyXSk7IC8qIHNjYWxlIDcgKi8KKyAgICAgICAgICAgIHRpMSA9IChJTlQpKGYxX0YgPj4gKERGUkFDVF9CSVRTIC0gMSAtIDcpKSAtIHFtZk9mZnNldDsKKyAgICAgICAgICAgIHRpMiA9IChJTlQpKCgoZjFfRikgKyAoKHBfRltwaXRjaEluQmluc10gPj4gYlNicjQxKSA+PiAyKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgIChERlJBQ1RfQklUUyAtIDEgLSA3KSkgLQorICAgICAgICAgICAgICAgICAgcW1mT2Zmc2V0OworCisgICAgICAgICAgICBpZiAodGkxID49IDAgJiYgdGkyIDwgMiAqIGhRbWZUcmFuc3Bvc2VyLT5zeW50aFNpemUpIHsKKyAgICAgICAgICAgICAgRklYUF9EQkwgc3FtYWcxUl9GID0KKyAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZlJlYWxfRltzbG90T2Zmc2V0XVt0aTFdOworICAgICAgICAgICAgICBGSVhQX0RCTCBzcW1hZzFJX0YgPQorICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GW3Nsb3RPZmZzZXRdW3RpMV07CisgICAgICAgICAgICAgIHNjYWxlVXAoJnNxbWFnMVJfRiwgJnNxbWFnMUlfRiwgJnNxbWFnMV9lKTsKKyAgICAgICAgICAgICAgc3FtYWcxX0YgPSBmUG93MkRpdjIoc3FtYWcxUl9GKTsKKyAgICAgICAgICAgICAgc3FtYWcxX0YgKz0gZlBvdzJEaXYyKHNxbWFnMUlfRik7CisgICAgICAgICAgICAgIHNxbWFnMV9lID0gMiAqIHNxbWFnMV9lICsgMTsKKworICAgICAgICAgICAgICBGSVhQX0RCTCBzcW1hZzJSX0YgPQorICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmUmVhbF9GW3Nsb3RPZmZzZXRdW3RpMl07CisgICAgICAgICAgICAgIEZJWFBfREJMIHNxbWFnMklfRiA9CisgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZJbWFnX0Zbc2xvdE9mZnNldF1bdGkyXTsKKyAgICAgICAgICAgICAgc2NhbGVVcCgmc3FtYWcyUl9GLCAmc3FtYWcySV9GLCAmc3FtYWcyX2UpOworICAgICAgICAgICAgICBzcW1hZzJfRiA9IGZQb3cyRGl2MihzcW1hZzJSX0YpOworICAgICAgICAgICAgICBzcW1hZzJfRiArPSBmUG93MkRpdjIoc3FtYWcySV9GKTsKKyAgICAgICAgICAgICAgc3FtYWcyX2UgPSAyICogc3FtYWcyX2UgKyAxOworCisgICAgICAgICAgICAgIGludCBzaGlmdDEgPSBmTWluKGZNYXgoc3FtYWcxX2UsIHNxbWFnMl9lKSAtIHNxbWFnMV9lLCAzMSk7CisgICAgICAgICAgICAgIGludCBzaGlmdDIgPSBmTWluKGZNYXgoc3FtYWcxX2UsIHNxbWFnMl9lKSAtIHNxbWFnMl9lLCAzMSk7CisKKyAgICAgICAgICAgICAgdGVtcF9GID0gZk1pbigoc3FtYWcxX0YgPj4gc2hpZnQxKSwgKHNxbWFnMl9GID4+IHNoaWZ0MikpOworICAgICAgICAgICAgICB0ZW1wX2UgPSBmTWF4KHNxbWFnMV9lLCBzcW1hZzJfZSk7CisKKyAgICAgICAgICAgICAgaW50IHNoaWZ0MyA9IGZNaW4oZk1heCh0ZW1wX2UsIG1WYWxfZSkgLSB0ZW1wX2UsIDMxKTsKKyAgICAgICAgICAgICAgaW50IHNoaWZ0NCA9IGZNaW4oZk1heCh0ZW1wX2UsIG1WYWxfZSkgLSBtVmFsX2UsIDMxKTsKKworICAgICAgICAgICAgICBpZiAoKHRlbXBfRiA+PiBzaGlmdDMpID4gKG1WYWxfRiA+PiBzaGlmdDQpKSB7CisgICAgICAgICAgICAgICAgbVZhbF9GID0gdGVtcF9GOworICAgICAgICAgICAgICAgIG1WYWxfZSA9IHRlbXBfZTsgLyogZXF1YWxzIHNxbWFnMl9lICsgc2hpZnQyICovCisgICAgICAgICAgICAgICAgbVRyID0gdHI7CisgICAgICAgICAgICAgICAgdHMxID0gdGkxOworICAgICAgICAgICAgICAgIHRzMiA9IHRpMjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGludCBzaGlmdDEgPSBmTWluKGZNYXgoc3FtYWcwX2UsIG1WYWxfZSkgLSBzcW1hZzBfZSwgMzEpOworICAgICAgICAgIGludCBzaGlmdDIgPSBmTWluKGZNYXgoc3FtYWcwX2UsIG1WYWxfZSkgLSBtVmFsX2UsIDMxKTsKKworICAgICAgICAgIGlmICgobVZhbF9GID4+IHNoaWZ0MikgPiAoc3FtYWcwX0YgPj4gc2hpZnQxKSAmJiB0czEgPj0gMCAmJgorICAgICAgICAgICAgICB0czIgPCAyICogaFFtZlRyYW5zcG9zZXItPnN5bnRoU2l6ZSkgeworICAgICAgICAgICAgSU5UIGdhbW1hT3V0X2VbMl07CisgICAgICAgICAgICBGSVhQX0RCTCBnYW1tYU91dFJlYWxfbVsyXSwgZ2FtbWFPdXRJbWFnX21bMl07CisgICAgICAgICAgICBGSVhQX0RCTCB0bXBSZWFsX20gPSAoRklYUF9EQkwpMCwgdG1wSW1hZ19tID0gKEZJWFBfREJMKTA7CisKKyAgICAgICAgICAgIGludCBUY2VudGVyLCBUdmVjOworCisgICAgICAgICAgICBUY2VudGVyID0gc3RyZXRjaCAtIG1UcjsgLyogZGVmYXVsdCBwaGFzZSBwb3dlciBwYXJhbWV0ZXJzICovCisgICAgICAgICAgICBUdmVjID0gbVRyOworICAgICAgICAgICAgc3dpdGNoIChzdHJldGNoKSAvKiAyIHRhcCBibG9jayBjcmVhdGlvbiBkZXNpZ24gZGVwZW5kcyBvbiBzdHJldGNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICB3aW5nYWluID0KKyAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoNS5mIC8gMTIuZik7IC8qIHN1bSBvZiB0YXBzIGRpdmlkZWQgYnkgdHdvICovCisKKyAgICAgICAgICAgICAgICBpZiAoaFFtZlRyYW5zcG9zZXItPmJYUHJvZHVjdHNbMF0pIHsKKyAgICAgICAgICAgICAgICAgIGdhbW1hQ2VudGVyUmVhbF9tWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0Zbc2xvdE9mZnNldF1bdHMxXTsKKyAgICAgICAgICAgICAgICAgIGdhbW1hQ2VudGVySW1hZ19tWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZJbWFnX0Zbc2xvdE9mZnNldF1bdHMxXTsKKworICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDI7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBnYW1tYVZlY1JlYWxfbVtrXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0Zbc2xvdE9mZnNldCAtIDEgKyBrXVt0czJdOworICAgICAgICAgICAgICAgICAgICBnYW1tYVZlY0ltYWdfbVtrXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZJbWFnX0Zbc2xvdE9mZnNldCAtIDEgKyBrXVt0czJdOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBnYW1tYUNlbnRlcl9lWzBdID0gU0NBTEUyRVhQKAorICAgICAgICAgICAgICAgICAgICAgIC1oUW1mVHJhbnNwb3Nlci0+SEJFQW5hbHlzaXNjUU1GLm91dFNjYWxlZmFjdG9yKTsKKyAgICAgICAgICAgICAgICAgIGdhbW1hVmVjX2VbMF0gPSBnYW1tYVZlY19lWzFdID0gU0NBTEUyRVhQKAorICAgICAgICAgICAgICAgICAgICAgIC1oUW1mVHJhbnNwb3Nlci0+SEJFQW5hbHlzaXNjUU1GLm91dFNjYWxlZmFjdG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIHdpbmdhaW4gPQorICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCg2LmYgLyAxMi5mKTsgLyogc3VtIG9mIHRhcHMgZGl2aWRlZCBieSB0d28gKi8KKyAgICAgICAgICAgICAgICBpZiAoaFFtZlRyYW5zcG9zZXItPmJYUHJvZHVjdHNbMl0pIHsKKyAgICAgICAgICAgICAgICAgIGlmIChtVHIgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBnYW1tYUNlbnRlclJlYWxfbVswXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0Zbc2xvdE9mZnNldF1bdHMxXTsKKyAgICAgICAgICAgICAgICAgICAgZ2FtbWFDZW50ZXJJbWFnX21bMF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GW3Nsb3RPZmZzZXRdW3RzMV07CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDI7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgIGdhbW1hVmVjUmVhbF9tW2tdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cW1mSW5CdWZSZWFsX0Zbc2xvdE9mZnNldCArIDIgKiAoayAtIDEpXVt0czJdOworICAgICAgICAgICAgICAgICAgICAgIGdhbW1hVmVjSW1hZ19tW2tdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cW1mSW5CdWZJbWFnX0Zbc2xvdE9mZnNldCArIDIgKiAoayAtIDEpXVt0czJdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UciA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGdhbW1hQ2VudGVyUmVhbF9tWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZlJlYWxfRltzbG90T2Zmc2V0XVt0czFdOworICAgICAgICAgICAgICAgICAgICBnYW1tYUNlbnRlckltYWdfbVswXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZJbWFnX0Zbc2xvdE9mZnNldF1bdHMxXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMjsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgZ2FtbWFWZWNSZWFsX21ba10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3NlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5xbWZJbkJ1ZlJlYWxfRltzbG90T2Zmc2V0ICsgKGsgLSAxKV1bdHMyXTsKKyAgICAgICAgICAgICAgICAgICAgICBnYW1tYVZlY0ltYWdfbVtrXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnFtZkluQnVmSW1hZ19GW3Nsb3RPZmZzZXQgKyAoayAtIDEpXVt0czJdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9IGVsc2UgLyogKG1UciA9PSAzKSAqLworICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzaWduID0gMTsKKyAgICAgICAgICAgICAgICAgICAgVGNlbnRlciA9IG1UcjsgLyogb3Bwb3NpdGUgcGhhc2UgcG93ZXIgcGFyYW1ldGVycyBhcyB0czIgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyICovCisgICAgICAgICAgICAgICAgICAgIFR2ZWMgPSBzdHJldGNoIC0gbVRyOworCisgICAgICAgICAgICAgICAgICAgIGdhbW1hQ2VudGVyUmVhbF9tWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZlJlYWxfRltzbG90T2Zmc2V0XVt0czJdOworICAgICAgICAgICAgICAgICAgICBnYW1tYUNlbnRlckltYWdfbVswXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZJbWFnX0Zbc2xvdE9mZnNldF1bdHMyXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMjsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgZ2FtbWFWZWNSZWFsX21ba10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3NlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5xbWZJbkJ1ZlJlYWxfRltzbG90T2Zmc2V0ICsgMiAqIChrIC0gMSldW3RzMV07CisgICAgICAgICAgICAgICAgICAgICAgZ2FtbWFWZWNJbWFnX21ba10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3NlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5xbWZJbkJ1ZkltYWdfRltzbG90T2Zmc2V0ICsgMiAqIChrIC0gMSldW3RzMV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgZ2FtbWFDZW50ZXJfZVswXSA9IFNDQUxFMkVYUCgKKyAgICAgICAgICAgICAgICAgICAgICAtaFFtZlRyYW5zcG9zZXItPkhCRUFuYWx5c2lzY1FNRi5vdXRTY2FsZWZhY3Rvcik7CisgICAgICAgICAgICAgICAgICBnYW1tYVZlY19lWzBdID0gZ2FtbWFWZWNfZVsxXSA9IFNDQUxFMkVYUCgKKyAgICAgICAgICAgICAgICAgICAgICAtaFFtZlRyYW5zcG9zZXItPkhCRUFuYWx5c2lzY1FNRi5vdXRTY2FsZWZhY3Rvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICB3aW5nYWluID0gRkwyRlhDT05TVF9EQkwoNS42NTY4ZiAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLmYpOyAvKiBzdW0gb2YgdGFwcyBkaXZpZGVkIGJ5IHR3byAqLworCisgICAgICAgICAgICAgICAgaWYgKGhRbWZUcmFuc3Bvc2VyLT5iWFByb2R1Y3RzWzFdKSB7CisgICAgICAgICAgICAgICAgICBGSVhQX0RCTCB0bXBSZWFsX0YsIHRtcEltYWdfRjsKKyAgICAgICAgICAgICAgICAgIGlmIChtVHIgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBnYW1tYUNlbnRlclJlYWxfbVswXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0Zbc2xvdE9mZnNldF1bdHMxXTsKKyAgICAgICAgICAgICAgICAgICAgZ2FtbWFDZW50ZXJJbWFnX21bMF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GW3Nsb3RPZmZzZXRdW3RzMV07CisgICAgICAgICAgICAgICAgICAgIGdhbW1hVmVjUmVhbF9tWzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZlJlYWxfRltzbG90T2Zmc2V0XVt0czJdOworICAgICAgICAgICAgICAgICAgICBnYW1tYVZlY0ltYWdfbVsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZJbWFnX0Zbc2xvdE9mZnNldF1bdHMyXTsKKworICAgICAgICAgICAgICAgICAgICBhZGRyc2hpZnQgPSAtMjsKKyAgICAgICAgICAgICAgICAgICAgdG1wUmVhbF9GID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5xbWZJbkJ1ZlJlYWxfRlthZGRyc2hpZnQgKyBzbG90T2Zmc2V0XVt0czJdOworICAgICAgICAgICAgICAgICAgICB0bXBJbWFnX0YgPQorICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnFtZkluQnVmSW1hZ19GW2FkZHJzaGlmdCArIHNsb3RPZmZzZXRdW3RzMl07CisKKyAgICAgICAgICAgICAgICAgICAgZ2FtbWFWZWNSZWFsX21bMF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKGZNdWx0KGZhY3RvcnNbdHMyICUgNF0sIHRtcFJlYWxfRikgLQorICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGZhY3RvcnNbKHRzMiArIDMpICUgNF0sIHRtcEltYWdfRikpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAxOworICAgICAgICAgICAgICAgICAgICBnYW1tYVZlY0ltYWdfbVswXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoZk11bHQoZmFjdG9yc1sodHMyICsgMykgJSA0XSwgdG1wUmVhbF9GKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQoZmFjdG9yc1t0czIgJSA0XSwgdG1wSW1hZ19GKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDE7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wUmVhbF9GID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5xbWZJbkJ1ZlJlYWxfRlthZGRyc2hpZnQgKyAxICsgc2xvdE9mZnNldF1bdHMyXTsKKyAgICAgICAgICAgICAgICAgICAgdG1wSW1hZ19GID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5xbWZJbkJ1ZkltYWdfRlthZGRyc2hpZnQgKyAxICsgc2xvdE9mZnNldF1bdHMyXTsKKworICAgICAgICAgICAgICAgICAgICBnYW1tYVZlY1JlYWxfbVswXSArPQorICAgICAgICAgICAgICAgICAgICAgICAgKGZNdWx0KGZhY3RvcnNbdHMyICUgNF0sIHRtcFJlYWxfRikgLQorICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGZhY3RvcnNbKHRzMiArIDEpICUgNF0sIHRtcEltYWdfRikpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAxOworICAgICAgICAgICAgICAgICAgICBnYW1tYVZlY0ltYWdfbVswXSArPQorICAgICAgICAgICAgICAgICAgICAgICAgKGZNdWx0KGZhY3RvcnNbKHRzMiArIDEpICUgNF0sIHRtcFJlYWxfRikgKworICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0KGZhY3RvcnNbdHMyICUgNF0sIHRtcEltYWdfRikpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAxOworCisgICAgICAgICAgICAgICAgICB9IGVsc2UgLyogKG1UciA9PSAyKSAqLworICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzaWduID0gMTsKKyAgICAgICAgICAgICAgICAgICAgVGNlbnRlciA9IG1UcjsgLyogb3Bwb3NpdGUgcGhhc2UgcG93ZXIgcGFyYW1ldGVycyBhcyB0czIgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyICovCisgICAgICAgICAgICAgICAgICAgIFR2ZWMgPSBzdHJldGNoIC0gbVRyOworCisgICAgICAgICAgICAgICAgICAgIGdhbW1hQ2VudGVyUmVhbF9tWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZlJlYWxfRltzbG90T2Zmc2V0XVt0czJdOworICAgICAgICAgICAgICAgICAgICBnYW1tYUNlbnRlckltYWdfbVswXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZJbWFnX0Zbc2xvdE9mZnNldF1bdHMyXTsKKyAgICAgICAgICAgICAgICAgICAgZ2FtbWFWZWNSZWFsX21bMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmUmVhbF9GW3Nsb3RPZmZzZXRdW3RzMV07CisgICAgICAgICAgICAgICAgICAgIGdhbW1hVmVjSW1hZ19tWzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZkltYWdfRltzbG90T2Zmc2V0XVt0czFdOworCisgICAgICAgICAgICAgICAgICAgIGFkZHJzaGlmdCA9IC0yOworICAgICAgICAgICAgICAgICAgICB0bXBSZWFsX0YgPQorICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnFtZkluQnVmUmVhbF9GW2FkZHJzaGlmdCArIHNsb3RPZmZzZXRdW3RzMV07CisgICAgICAgICAgICAgICAgICAgIHRtcEltYWdfRiA9CisgICAgICAgICAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3NlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cW1mSW5CdWZJbWFnX0ZbYWRkcnNoaWZ0ICsgc2xvdE9mZnNldF1bdHMxXTsKKworICAgICAgICAgICAgICAgICAgICBnYW1tYVZlY1JlYWxfbVswXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoZk11bHQoZmFjdG9yc1t0czEgJSA0XSwgdG1wUmVhbF9GKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQoZmFjdG9yc1sodHMxICsgMykgJSA0XSwgdG1wSW1hZ19GKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDE7CisgICAgICAgICAgICAgICAgICAgIGdhbW1hVmVjSW1hZ19tWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChmTXVsdChmYWN0b3JzWyh0czEgKyAzKSAlIDRdLCB0bXBSZWFsX0YpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBmTXVsdChmYWN0b3JzW3RzMSAlIDRdLCB0bXBJbWFnX0YpKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgMTsKKworICAgICAgICAgICAgICAgICAgICB0bXBSZWFsX0YgPQorICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnFtZkluQnVmUmVhbF9GW2FkZHJzaGlmdCArIDEgKyBzbG90T2Zmc2V0XVt0czFdOworICAgICAgICAgICAgICAgICAgICB0bXBJbWFnX0YgPQorICAgICAgICAgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnFtZkluQnVmSW1hZ19GW2FkZHJzaGlmdCArIDEgKyBzbG90T2Zmc2V0XVt0czFdOworCisgICAgICAgICAgICAgICAgICAgIGdhbW1hVmVjUmVhbF9tWzBdICs9CisgICAgICAgICAgICAgICAgICAgICAgICAoZk11bHQoZmFjdG9yc1t0czEgJSA0XSwgdG1wUmVhbF9GKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQoZmFjdG9yc1sodHMxICsgMSkgJSA0XSwgdG1wSW1hZ19GKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDE7CisgICAgICAgICAgICAgICAgICAgIGdhbW1hVmVjSW1hZ19tWzBdICs9CisgICAgICAgICAgICAgICAgICAgICAgICAoZk11bHQoZmFjdG9yc1sodHMxICsgMSkgJSA0XSwgdG1wUmVhbF9GKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgZk11bHQoZmFjdG9yc1t0czEgJSA0XSwgdG1wSW1hZ19GKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDE7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGdhbW1hQ2VudGVyX2VbMF0gPSBnYW1tYVZlY19lWzFdID0gU0NBTEUyRVhQKAorICAgICAgICAgICAgICAgICAgICAgIC1oUW1mVHJhbnNwb3Nlci0+SEJFQW5hbHlzaXNjUU1GLm91dFNjYWxlZmFjdG9yKTsKKyAgICAgICAgICAgICAgICAgIGdhbW1hVmVjX2VbMF0gPQorICAgICAgICAgICAgICAgICAgICAgIFNDQUxFMkVYUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLWhRbWZUcmFuc3Bvc2VyLT5IQkVBbmFseXNpc2NRTUYub3V0U2NhbGVmYWN0b3IpICsKKyAgICAgICAgICAgICAgICAgICAgICAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBGREtfQVNTRVJUKDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSAvKiBzdHJldGNoIGNhc2VzICovCisKKyAgICAgICAgICAgIC8qIHBhcmFtZXRlciBjb250cm9sbGVkIHBoYXNlIG1vZGlmaWNhdGlvbiBwYXJ0cyAqLworICAgICAgICAgICAgLyogbWF4aW11bSAqX2UgPT0gMjAgKi8KKyAgICAgICAgICAgIGNhbGN1bGF0ZUNlbnRlckZJWFAoZ2FtbWFDZW50ZXJSZWFsX21bMF0sIGdhbW1hQ2VudGVySW1hZ19tWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2FtbWFDZW50ZXJSZWFsX21bMF0sICZnYW1tYUNlbnRlckltYWdfbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdhbW1hQ2VudGVyX2VbMF0sIHN0cmV0Y2gsIFRjZW50ZXIgLSAxKTsKKyAgICAgICAgICAgIGNhbGN1bGF0ZUNlbnRlckZJWFAoZ2FtbWFWZWNSZWFsX21bMF0sIGdhbW1hVmVjSW1hZ19tWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2FtbWFWZWNSZWFsX21bMF0sICZnYW1tYVZlY0ltYWdfbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdhbW1hVmVjX2VbMF0sIHN0cmV0Y2gsIFR2ZWMgLSAxKTsKKyAgICAgICAgICAgIGNhbGN1bGF0ZUNlbnRlckZJWFAoZ2FtbWFWZWNSZWFsX21bMV0sIGdhbW1hVmVjSW1hZ19tWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2FtbWFWZWNSZWFsX21bMV0sICZnYW1tYVZlY0ltYWdfbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdhbW1hVmVjX2VbMV0sIHN0cmV0Y2gsIFR2ZWMgLSAxKTsKKworICAgICAgICAgICAgLyogICAgRmluYWwgbXVsdGlwbGljYXRpb24gb2YgcHJlcGFyZWQgcGFydHMgICovCisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMjsgaysrKSB7CisgICAgICAgICAgICAgIGdhbW1hT3V0UmVhbF9tW2tdID0KKyAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihnYW1tYVZlY1JlYWxfbVtrXSwgZ2FtbWFDZW50ZXJSZWFsX21bMF0pIC0KKyAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihnYW1tYVZlY0ltYWdfbVtrXSwgZ2FtbWFDZW50ZXJJbWFnX21bMF0pOworICAgICAgICAgICAgICBnYW1tYU91dEltYWdfbVtrXSA9CisgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoZ2FtbWFWZWNSZWFsX21ba10sIGdhbW1hQ2VudGVySW1hZ19tWzBdKSArCisgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoZ2FtbWFWZWNJbWFnX21ba10sIGdhbW1hQ2VudGVyUmVhbF9tWzBdKTsKKyAgICAgICAgICAgICAgZ2FtbWFPdXRfZVtrXSA9IGdhbW1hQ2VudGVyX2VbMF0gKyBnYW1tYVZlY19lW2tdICsgMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2NhbGVVcCgmZ2FtbWFPdXRSZWFsX21bMF0sICZnYW1tYU91dEltYWdfbVswXSwgJmdhbW1hT3V0X2VbMF0pOworICAgICAgICAgICAgc2NhbGVVcCgmZ2FtbWFPdXRSZWFsX21bMV0sICZnYW1tYU91dEltYWdfbVsxXSwgJmdhbW1hT3V0X2VbMV0pOworICAgICAgICAgICAgRkRLX0FTU0VSVChnYW1tYU91dF9lWzBdID49IDApOworICAgICAgICAgICAgRkRLX0FTU0VSVChnYW1tYU91dF9lWzBdIDwgMzIpOworCisgICAgICAgICAgICB0bXBSZWFsX20gPSBnYW1tYU91dFJlYWxfbVswXTsKKyAgICAgICAgICAgIHRtcEltYWdfbSA9IGdhbW1hT3V0SW1hZ19tWzBdOworCisgICAgICAgICAgICBJTlQgbW9kc3RyZXRjaDQgPSAoKHN0cmV0Y2ggPT0gNCkgJiYgKG1UciA9PSAyKSk7CisKKyAgICAgICAgICAgIEZJWFBfREJMIGNvc190d2lkID0gdHdpZF9tX25ld1tzdHJldGNoIC0gMiAtIG1vZHN0cmV0Y2g0XVswXTsKKyAgICAgICAgICAgIEZJWFBfREJMIHNpbl90d2lkID0gc2lnbiAqIHR3aWRfbV9uZXdbc3RyZXRjaCAtIDIgLSBtb2RzdHJldGNoNF1bMV07CisKKyAgICAgICAgICAgIGdhbW1hT3V0UmVhbF9tWzBdID0KKyAgICAgICAgICAgICAgICBmTXVsdCh0bXBSZWFsX20sIGNvc190d2lkKSAtCisgICAgICAgICAgICAgICAgZk11bHQodG1wSW1hZ19tLCBzaW5fdHdpZCk7IC8qIHN1bSBzaG91bGQgYmUgPD0gMSBiZWNhdXNlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbi9jb3MgbXVsdGlwbGljYXRpb24gKi8KKyAgICAgICAgICAgIGdhbW1hT3V0SW1hZ19tWzBdID0KKyAgICAgICAgICAgICAgICBmTXVsdCh0bXBJbWFnX20sIGNvc190d2lkKSArCisgICAgICAgICAgICAgICAgZk11bHQodG1wUmVhbF9tLCBzaW5fdHdpZCk7IC8qIHN1bSBzaG91bGQgYmUgPD0gMSBiZWNhdXNlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbi9jb3MgbXVsdGlwbGljYXRpb24gKi8KKworICAgICAgICAgICAgLyogd2luZ2FpbiAqLworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDI7IGsrKykgeworICAgICAgICAgICAgICBnYW1tYU91dFJlYWxfbVtrXSA9IChmTXVsdChnYW1tYU91dFJlYWxfbVtrXSwgd2luZ2FpbikgPDwgMSk7CisgICAgICAgICAgICAgIGdhbW1hT3V0SW1hZ19tW2tdID0gKGZNdWx0KGdhbW1hT3V0SW1hZ19tW2tdLCB3aW5nYWluKSA8PCAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ2FtbWFPdXRSZWFsX21bMV0gPj49IDE7CisgICAgICAgICAgICBnYW1tYU91dEltYWdfbVsxXSA+Pj0gMTsKKyAgICAgICAgICAgIGdhbW1hT3V0X2VbMF0gKz0gMjsKKyAgICAgICAgICAgIGdhbW1hT3V0X2VbMV0gKz0gMjsKKworICAgICAgICAgICAgLyogT0xBIGluY2x1ZGluZyB3aW5kb3cgc2NhbGluZyBieSB3aW5nYWluLzMgKi8KKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAyOyBrKyspIC8qIG5lZWQgaz0xIHRvIGNvcnJlc3BvbmQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWluTW9kSW1hZ1tzbG90T2Zmc2V0XSAtPiBvdXQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGoqMisoc2xvdE9mZnNldC1vZmZzZXQpICAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmUmVhbF9GWyhrICsgc2xvdE9mZnNldCAtIDEpXVtiYW5kXSArPQorICAgICAgICAgICAgICAgICAgZ2FtbWFPdXRSZWFsX21ba10gPj4gKHNjYWxlX2ZhY3Rvcl9oYmUgLSBnYW1tYU91dF9lW2tdKTsKKyAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkhCRUJ1ZkltYWdfRlsoayArIHNsb3RPZmZzZXQgLSAxKV1bYmFuZF0gKz0KKyAgICAgICAgICAgICAgICAgIGdhbW1hT3V0SW1hZ19tW2tdID4+IChzY2FsZV9mYWN0b3JfaGJlIC0gZ2FtbWFPdXRfZVtrXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSAvKiBtVmFsID4gcVRoclFNRiAqIHFUaHJRTUYgKiBzcW1hZzAgJiYgdHMxID4gMCAmJiB0czIgPCA2NCAqLworICAgICAgICB9ICAgLyogcCA+PSBwbWluICovCisgICAgICB9ICAgICAvKiBmb3IgYmFuZCAqLworICAgIH0gICAgICAgLyogZm9yIHN0cmV0Y2ggKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBRTUZfV0lOX0xFTiAtIDE7IGkrKykgeworICAgICAgRkRLbWVtY3B5KGhRbWZUcmFuc3Bvc2VyLT5xbWZJbkJ1ZlJlYWxfRltpXSwKKyAgICAgICAgICAgICAgICBoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZSZWFsX0ZbaSArIDFdLAorICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkgKiBoUW1mVHJhbnNwb3Nlci0+SEJFQW5hbHlzaXNjUU1GLm5vX2NoYW5uZWxzKTsKKyAgICAgIEZES21lbWNweShoUW1mVHJhbnNwb3Nlci0+cW1mSW5CdWZJbWFnX0ZbaV0sCisgICAgICAgICAgICAgICAgaFFtZlRyYW5zcG9zZXItPnFtZkluQnVmSW1hZ19GW2kgKyAxXSwKKyAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogaFFtZlRyYW5zcG9zZXItPkhCRUFuYWx5c2lzY1FNRi5ub19jaGFubmVscyk7CisgICAgfQorCisgICAgaWYgKGtlZXBTdGF0ZXNTeW5jZWRNb2RlICE9IEtFRVBfU1RBVEVTX1NZTkNFRF9OT09VVCkgeworICAgICAgaWYgKDIgKiBqID49IG9mZnNldCkgeworICAgICAgICAvKiBjb3B5IGZpcnN0IHR3byBzbG90cyBvZiBpbnRlcm5hbCBidWZmZXIgdG8gb3V0cHV0ICovCisgICAgICAgIGlmIChrZWVwU3RhdGVzU3luY2VkTW9kZSA9PSBLRUVQX1NUQVRFU19TWU5DRURfT1VURElGRikgeworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIEZES21lbWNweSgmcHBRbWZCdWZmZXJPdXRSZWFsX0ZbMiAqIGogLSBvZmZzZXQgKyBpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbMF1dLAorICAgICAgICAgICAgICAgICAgICAgICZoUW1mVHJhbnNwb3NlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5xbWZIQkVCdWZSZWFsX0ZbaV1baFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mWzBdXSwKKyAgICAgICAgICAgICAgICAgICAgICAoUU1GX1NZTlRIX0NIQU5ORUxTIC0gaFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mWzBdKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICAgICAgRkRLbWVtY3B5KCZwcFFtZkJ1ZmZlck91dEltYWdfRlsyICogaiAtIG9mZnNldCArIGldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hRbWZUcmFuc3Bvc2VyLT54T3ZlclFtZlswXV0sCisgICAgICAgICAgICAgICAgICAgICAgJmhRbWZUcmFuc3Bvc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnFtZkhCRUJ1ZkltYWdfRltpXVtoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbMF1dLAorICAgICAgICAgICAgICAgICAgICAgIChRTUZfU1lOVEhfQ0hBTk5FTFMgLSBoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbMF0pICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIEZES21lbWNweSgmcHBRbWZCdWZmZXJPdXRSZWFsX0ZbMiAqIGogKyBpICsgb3ZfbGVuXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbMF1dLAorICAgICAgICAgICAgICAgICAgICAgICZoUW1mVHJhbnNwb3NlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5xbWZIQkVCdWZSZWFsX0ZbaV1baFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mWzBdXSwKKyAgICAgICAgICAgICAgICAgICAgICAoUU1GX1NZTlRIX0NIQU5ORUxTIC0gaFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mWzBdKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICAgICAgRkRLbWVtY3B5KCZwcFFtZkJ1ZmZlck91dEltYWdfRlsyICogaiArIGkgKyBvdl9sZW5dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hRbWZUcmFuc3Bvc2VyLT54T3ZlclFtZlswXV0sCisgICAgICAgICAgICAgICAgICAgICAgJmhRbWZUcmFuc3Bvc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnFtZkhCRUJ1ZkltYWdfRltpXVtoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbMF1dLAorICAgICAgICAgICAgICAgICAgICAgIChRTUZfU1lOVEhfQ0hBTk5FTFMgLSBoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbMF0pICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogbW92ZSBzbG90cyB1cCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBIQkVfTUFYX09VVF9TTE9UUyAtIDI7IGkrKykgeworICAgICAgRkRLbWVtY3B5KAorICAgICAgICAgICZoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmUmVhbF9GW2ldW2hRbWZUcmFuc3Bvc2VyLT54T3ZlclFtZlswXV0sCisgICAgICAgICAgJmhRbWZUcmFuc3Bvc2VyLT5xbWZIQkVCdWZSZWFsX0ZbaSArIDJdW2hRbWZUcmFuc3Bvc2VyLT54T3ZlclFtZlswXV0sCisgICAgICAgICAgKFFNRl9TWU5USF9DSEFOTkVMUyAtIGhRbWZUcmFuc3Bvc2VyLT54T3ZlclFtZlswXSkgKgorICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIEZES21lbWNweSgKKyAgICAgICAgICAmaFFtZlRyYW5zcG9zZXItPnFtZkhCRUJ1ZkltYWdfRltpXVtoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbMF1dLAorICAgICAgICAgICZoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmSW1hZ19GW2kgKyAyXVtoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbMF1dLAorICAgICAgICAgIChRTUZfU1lOVEhfQ0hBTk5FTFMgLSBoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbMF0pICoKKyAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgfQorCisgICAgLyogZmluYWxseSBzZXQgbGFzdCB0d28gc2xvdCB0byB6ZXJvICovCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgRkRLbWVtc2V0KCZoUW1mVHJhbnNwb3Nlci0+cW1mSEJFQnVmUmVhbF9GW0hCRV9NQVhfT1VUX1NMT1RTIC0gMSAtIGldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaFFtZlRyYW5zcG9zZXItPnhPdmVyUW1mWzBdXSwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIChRTUZfU1lOVEhfQ0hBTk5FTFMgLSBoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbMF0pICoKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBGREttZW1zZXQoJmhRbWZUcmFuc3Bvc2VyLT5xbWZIQkVCdWZJbWFnX0ZbSEJFX01BWF9PVVRfU0xPVFMgLSAxIC0gaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoUW1mVHJhbnNwb3Nlci0+eE92ZXJRbWZbMF1dLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgKFFNRl9TWU5USF9DSEFOTkVMUyAtIGhRbWZUcmFuc3Bvc2VyLT54T3ZlclFtZlswXSkgKgorICAgICAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpKTsKKyAgICB9CisgIH0gLyogcW1mVm9jb2RlckNvbHNJbiAqLworCisgIGlmIChrZWVwU3RhdGVzU3luY2VkTW9kZSAhPSBLRUVQX1NUQVRFU19TWU5DRURfTk9PVVQpIHsKKyAgICBpZiAoa2VlcFN0YXRlc1N5bmNlZE1vZGUgPT0gS0VFUF9TVEFURVNfU1lOQ0VEX09VVERJRkYpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBvdl9sZW4gKyBMUENfT1JERVI7IGkrKykgeworICAgICAgICBmb3IgKGJhbmQgPSBoUW1mVHJhbnNwb3Nlci0+c3RhcnRCYW5kOyBiYW5kIDwgaFFtZlRyYW5zcG9zZXItPnN0b3BCYW5kOworICAgICAgICAgICAgIGJhbmQrKykgeworICAgICAgICAgIEZJWFBfREJMIHRtcFIgPSBwcFFtZkJ1ZmZlck91dFJlYWxfRltpXVtiYW5kXTsKKyAgICAgICAgICBGSVhQX0RCTCB0bXBJID0gcHBRbWZCdWZmZXJPdXRJbWFnX0ZbaV1bYmFuZF07CisKKyAgICAgICAgICBwcFFtZkJ1ZmZlck91dFJlYWxfRltpXVtiYW5kXSA9CisgICAgICAgICAgICAgIGZNdWx0KHRtcFIsIGNvc19GW2JhbmRdKSAtCisgICAgICAgICAgICAgIGZNdWx0KHRtcEksICgtY29zX0ZbNjQgLSBiYW5kIC0gMV0pKTsgLyogc3VtIHNob3VsZCBiZSA8PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSBvZiBzaW4vY29zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGljYXRpb24gKi8KKyAgICAgICAgICBwcFFtZkJ1ZmZlck91dEltYWdfRltpXVtiYW5kXSA9CisgICAgICAgICAgICAgIGZNdWx0KHRtcFIsICgtY29zX0ZbNjQgLSBiYW5kIC0gMV0pKSArCisgICAgICAgICAgICAgIGZNdWx0KHRtcEksIGNvc19GW2JhbmRdKTsgLyogc3VtIHNob3VsZCBieSA8PSAxIGJlY2F1c2Ugb2Ygc2luL2NvcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxpY2F0aW9uICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpID0gb2Zmc2V0OyBpIDwgaFFtZlRyYW5zcG9zZXItPm5vQ29sczsgaSsrKSB7CisgICAgICAgIGZvciAoYmFuZCA9IGhRbWZUcmFuc3Bvc2VyLT5zdGFydEJhbmQ7IGJhbmQgPCBoUW1mVHJhbnNwb3Nlci0+c3RvcEJhbmQ7CisgICAgICAgICAgICAgYmFuZCsrKSB7CisgICAgICAgICAgRklYUF9EQkwgdG1wUiA9IHBwUW1mQnVmZmVyT3V0UmVhbF9GW2kgKyBvdl9sZW5dW2JhbmRdOworICAgICAgICAgIEZJWFBfREJMIHRtcEkgPSBwcFFtZkJ1ZmZlck91dEltYWdfRltpICsgb3ZfbGVuXVtiYW5kXTsKKworICAgICAgICAgIHBwUW1mQnVmZmVyT3V0UmVhbF9GW2kgKyBvdl9sZW5dW2JhbmRdID0KKyAgICAgICAgICAgICAgZk11bHQodG1wUiwgY29zX0ZbYmFuZF0pIC0KKyAgICAgICAgICAgICAgZk11bHQodG1wSSwgKC1jb3NfRls2NCAtIGJhbmQgLSAxXSkpOyAvKiBzdW0gc2hvdWxkIGJlIDw9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIG9mIHNpbi9jb3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsaWNhdGlvbiAqLworICAgICAgICAgIHBwUW1mQnVmZmVyT3V0SW1hZ19GW2kgKyBvdl9sZW5dW2JhbmRdID0KKyAgICAgICAgICAgICAgZk11bHQodG1wUiwgKC1jb3NfRls2NCAtIGJhbmQgLSAxXSkpICsKKyAgICAgICAgICAgICAgZk11bHQodG1wSSwgY29zX0ZbYmFuZF0pOyAvKiBzdW0gc2hvdWxkIGJ5IDw9IDEgYmVjYXVzZSBvZiBzaW4vY29zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGljYXRpb24gKi8KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgICpzY2FsZV9oYiA9IEVYUDJTQ0FMRShzY2FsZV9mYWN0b3JfaGJlKTsKK30KKworaW50KiBHZXR4T3ZlckJhbmRRbWZUcmFuc3Bvc2VyKEhBTkRMRV9IQkVfVFJBTlNQT1NFUiBoUW1mVHJhbnNwb3NlcikgeworICBpZiAoaFFtZlRyYW5zcG9zZXIpCisgICAgcmV0dXJuIGhRbWZUcmFuc3Bvc2VyLT54T3ZlclFtZjsKKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworfQorCitpbnQgR2V0NDFTYnJRbWZUcmFuc3Bvc2VyKEhBTkRMRV9IQkVfVFJBTlNQT1NFUiBoUW1mVHJhbnNwb3NlcikgeworICBpZiAoaFFtZlRyYW5zcG9zZXIgIT0gTlVMTCkKKyAgICByZXR1cm4gaFFtZlRyYW5zcG9zZXItPmJTYnI0MTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9oYmUuaCBiL2xpYlNCUmRlYy9zcmMvaGJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmZmUxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNCUmRlYy9zcmMvaGJlLmgKQEAgLTAsMCArMSwyMDAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBIQkVfSAorI2RlZmluZSBIQkVfSAorCisjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgorCisjaWZuZGVmIFFNRl9TWU5USF9DSEFOTkVMUworI2RlZmluZSBRTUZfU1lOVEhfQ0hBTk5FTFMgKDY0KQorI2VuZGlmCisKKyNkZWZpbmUgSEJFX1FNRl9GSUxURVJfU1RBVEVfQU5BX1NJWkUgKDQwMCkKKyNkZWZpbmUgSEJFX1FNRl9GSUxURVJfU1RBVEVfU1lOX1NJWkUgKDIwMCkKKworI2lmbmRlZiBNQVhfTlVNX1BBVENIRVNfSEJFCisjZGVmaW5lIE1BWF9OVU1fUEFUQ0hFU19IQkUgKDYpCisjZW5kaWYKKyNkZWZpbmUgTUFYX1NUUkVUQ0hfSEJFICg0KQorCit0eXBlZGVmIGVudW0geworICBLRUVQX1NUQVRFU19TWU5DRURfT0ZGID0gMCwgICAgLyohPCBub3JtYWwgUU1GIHRyYW5zcG9zZXIgYmVoYXZpb3VyICovCisgIEtFRVBfU1RBVEVTX1NZTkNFRF9OT1JNQUwgPSAxLCAvKiE8IFFNRiB0cmFuc3Bvc2VyIGNhbGxlZCBmb3Igc3luY2luZyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzIHRoZSBsYXN0IDgvMTQgc2xvdHMgYXJlIGNhbGN1bGF0ZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbmV4dCBmcmFtZSBpcyBIQkUgKi8KKyAgS0VFUF9TVEFURVNfU1lOQ0VEX09VVERJRkYgPQorICAgICAgMiwgLyohPCBRTUYgdHJhbnNwb3NlciBiZWhhdmlvdXIgYXMgaW4gbm9ybWFsIGNhc2UsIGJ1dCB0aGUgY2FsY3VsYXRlZAorICAgICAgICAgICAgICBzbG90cyBhcmUgZGlyZWN0bHkgd3JpdHRlbiB0byBvdmVybGFwIGFyZWEgb2YgYnVmZmVyOyBvbmx5IHVzZWQgaW4KKyAgICAgICAgICAgICAgcmVzZXRTYnJEZWMgZnVuY3Rpb24gKi8KKyAgS0VFUF9TVEFURVNfU1lOQ0VEX05PT1VUID0KKyAgICAgIDMgLyohPCBRTUYgdHJhbnNwb3NlciBpcyBjYWxsZWQgZm9yIHN5bmNpbmcgb2Ygc3RhdGVzIG9ubHksIG5vdCBvdXRwdXQKKyAgICAgICAgICAgICBpcyBnZW5lcmF0ZWQgYXQgYWxsOyBvbmx5IHVzZWQgaW4gcmVzZXRTYnJEZWMgZnVuY3Rpb24gKi8KK30gS0VFUF9TVEFURVNfU1lOQ0VEX01PREU7CisKK3N0cnVjdCBoYmVUcmFuc3Bvc2VyIHsKKyAgaW50IHhPdmVyUW1mW01BWF9OVU1fUEFUQ0hFU19IQkVdOworCisgIGludCBtYXhTdHJldGNoOworICBpbnQgdGltZURvbWFpbldpbkxlbjsKKyAgaW50IHFtZkluQnVmU2l6ZTsKKyAgaW50IHFtZk91dEJ1ZlNpemU7CisgIGludCBub0NvbHM7CisgIGludCBub0NoYW5uZWxzOworICBpbnQgc3RhcnRCYW5kOworICBpbnQgc3RvcEJhbmQ7CisgIGludCBiU2JyNDE7CisKKyAgSU5UX1BDTSAqaW5CdWZfRjsKKyAgRklYUF9EQkwgKipxbWZJbkJ1ZlJlYWxfRjsKKyAgRklYUF9EQkwgKipxbWZJbkJ1ZkltYWdfRjsKKworICBGSVhQX0RCTCAqcW1mQnVmZmVyQ29kZWNUZW1wU2xvdF9GOworCisgIFFNRl9GSUxURVJfQkFOSyBIQkVBbmFseXNpc2NRTUY7CisgIFFNRl9GSUxURVJfQkFOSyBIQkVTeW50aGVzaXNRTUY7CisKKyAgRklYUF9EQkwgY29uc3QgKnN5bnRoZXNpc1FtZlByZU1vZENvc19GOworICBGSVhQX0RCTCBjb25zdCAqc3ludGhlc2lzUW1mUHJlTW9kU2luX0Y7CisKKyAgRklYUF9RQVMgYW5hUW1mU3RhdGVzW0hCRV9RTUZfRklMVEVSX1NUQVRFX0FOQV9TSVpFXTsKKyAgRklYUF9RU1Mgc3luUW1mU3RhdGVzW0hCRV9RTUZfRklMVEVSX1NUQVRFX1NZTl9TSVpFXTsKKworICBGSVhQX0RCTCAqKnFtZkhCRUJ1ZlJlYWxfRjsKKyAgRklYUF9EQkwgKipxbWZIQkVCdWZJbWFnX0Y7CisKKyAgaW50IGJYUHJvZHVjdHNbTUFYX1NUUkVUQ0hfSEJFXTsKKworICBpbnQga3N0YXJ0OworICBpbnQgc3ludGhTaXplOworCisgIGludCBoaWdoYmFuZF9leHBbMl07CisgIGludCB0YXJnZXRfZXhwWzJdOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgaGJlVHJhbnNwb3NlciAqSEFORExFX0hCRV9UUkFOU1BPU0VSOworCitTQlJfRVJST1IgUW1mVHJhbnNwb3NlckNyZWF0ZShIQU5ETEVfSEJFX1RSQU5TUE9TRVIgKmhRbWZUcmFuc3Bvc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZyYW1lU2l6ZSwgaW50IGJEaXNhYmxlQ3Jvc3NQcm9kdWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiU2JyNDEpOworCitTQlJfRVJST1IgUW1mVHJhbnNwb3NlclJlSW5pdChIQU5ETEVfSEJFX1RSQU5TUE9TRVIgaFFtZlRyYW5zcG9zZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqRnJlcUJhbmRUYWJsZVsyXSwgVUNIQVIgTlNmYlsyXSk7CisKK3ZvaWQgUW1mVHJhbnNwb3NlckNsb3NlKEhBTkRMRV9IQkVfVFJBTlNQT1NFUiBoUW1mVHJhbnNwb3Nlcik7CisKK3ZvaWQgUW1mVHJhbnNwb3NlckFwcGx5KEhBTkRMRV9IQkVfVFJBTlNQT1NFUiBoUW1mVHJhbnNwb3NlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcW1mQnVmZmVyQ29kZWNSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxbWZCdWZmZXJDb2RlY0ltYWcsIGludCBuQ29sc0luLAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipwcFFtZkJ1ZmZlck91dFJlYWxfRiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcHBRbWZCdWZmZXJPdXRJbWFnX0YsCisgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBscGNGaWx0ZXJTdGF0ZXNSZWFsWzIgKyAoMyAqICg0KSldWyg2NCldLAorICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgbHBjRmlsdGVyU3RhdGVzSW1hZ1syICsgKDMgKiAoNCkpXVsoNjQpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaEluQmlucywgaW50IHNjYWxlX2xiLCBpbnQgc2NhbGVfaGJlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzY2FsZV9oYiwgaW50IHRpbWVTdGVwLCBpbnQgZmlyc3RTbG90T2Zmc3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBLRUVQX1NUQVRFU19TWU5DRURfTU9ERSBrZWVwU3RhdGVzU3luY2VkTW9kZSk7CisKK2ludCAqR2V0eE92ZXJCYW5kUW1mVHJhbnNwb3NlcihIQU5ETEVfSEJFX1RSQU5TUE9TRVIgaFFtZlRyYW5zcG9zZXIpOworCitpbnQgR2V0NDFTYnJRbWZUcmFuc3Bvc2VyKEhBTkRMRV9IQkVfVFJBTlNQT1NFUiBoUW1mVHJhbnNwb3Nlcik7CisjZW5kaWYgLyogSEJFX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvaHVmZl9kZWMuY3BwIGIvbGliU0JSZGVjL3NyYy9odWZmX2RlYy5jcHAKaW5kZXggMzFkNjg2ZC4uOTBjOTU0MSAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9odWZmX2RlYy5jcHAKKysrIGIvbGliU0JSZGVjL3NyYy9odWZmX2RlYy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTEgKzkwLDE5IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgSHVmZm1hbiBEZWNvZGVyICAKKyAgXGJyaWVmICBIdWZmbWFuIERlY29kZXIKICovCiAKICNpbmNsdWRlICJodWZmX2RlYy5oIgpAQCAtMTAxLDIwICsxMjAsMTggQEAKICAgXGF1dGhvcgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50Ci1EZWNvZGVIdWZmbWFuQ1cgKEh1ZmZtYW4gaCwgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIGh1ZmZtYW4gY29kZWJvb2sgdGFibGUgKi8KLSAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzKSAvKiE8IEhhbmRsZSB0byBCaXRidWZmZXIgKi8KK2ludCBEZWNvZGVIdWZmbWFuQ1coSHVmZm1hbiBoLCAvKiE8IHBvaW50ZXIgdG8gaHVmZm1hbiBjb2RlYm9vayB0YWJsZSAqLworICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMpIC8qITwgSGFuZGxlIHRvIEJpdGJ1ZmZlciAqLwogewogICBTQ0hBUiBpbmRleCA9IDA7CiAgIGludCB2YWx1ZSwgYml0OwogCiAgIHdoaWxlIChpbmRleCA+PSAwKSB7Ci0gICAgYml0ID0gRkRLcmVhZEJpdHMgKGhCcywgMSk7CisgICAgYml0ID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKICAgICBpbmRleCA9IGhbaW5kZXhdW2JpdF07CiAgIH0KIAotICB2YWx1ZSA9IGluZGV4KzY0OyAvKiBBZGQgb2Zmc2V0ICovCi0KKyAgdmFsdWUgPSBpbmRleCArIDY0OyAvKiBBZGQgb2Zmc2V0ICovCiAKICAgcmV0dXJuIHZhbHVlOwogfQpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9odWZmX2RlYy5oIGIvbGliU0JSZGVjL3NyYy9odWZmX2RlYy5oCmluZGV4IDU0NDM2NTguLjlhYTYyYjQgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvaHVmZl9kZWMuaAorKysgYi9saWJTQlJkZWMvc3JjL2h1ZmZfZGVjLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjIgKzkwLDI4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgSHVmZm1hbiBEZWNvZGVyICAKKyAgXGJyaWVmICBIdWZmbWFuIERlY29kZXIKICovCi0jaWZuZGVmIF9fSFVGRl9ERUNfSAotI2RlZmluZSBfX0hVRkZfREVDX0gKKyNpZm5kZWYgSFVGRl9ERUNfSAorI2RlZmluZSBIVUZGX0RFQ19ICiAKICNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgogCiB0eXBlZGVmIGNvbnN0IFNDSEFSICgqSHVmZm1hbilbMl07CiAKLWludAotRGVjb2RlSHVmZm1hbkNXIChIdWZmbWFuIGgsCi0gICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYpOworaW50IERlY29kZUh1ZmZtYW5DVyhIdWZmbWFuIGgsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvbHBwX3RyYW4uY3BwIGIvbGliU0JSZGVjL3NyYy9scHBfdHJhbi5jcHAKaW5kZXggMTE3ZTczOS4uYWExZmQ1ZCAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9scHBfdHJhbi5jcHAKKysrIGIvbGliU0JSZGVjL3NyYy9scHBfdHJhbi5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTkgKzkwLDMwIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgTG93IFBvd2VyIFByb2ZpbGUgVHJhbnNwb3NlciwgIAotICBUaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgdHJhbnNwb3Nlci4gVGhlIG1haW4gZW50cnkgcG9pbnQgaXMgbHBwVHJhbnNwb3NlcigpLiBUaGUgZnVuY3Rpb24gZ2VuZXJhdGVzCi0gIGhpZ2ggZnJlcXVlbmN5IGNvbnRlbnQgYnkgY29weWluZyBkYXRhIGZyb20gdGhlIGxvdyBiYW5kIChwcm92aWRlZCBieSBjb3JlIGNvZGVjKSBpbnRvIHRoZSBoaWdoIGJhbmQuCi0gIFRoaXMgcHJvY2VzcyBpcyBhbHNvIHJlZmVycmVkIHRvIGFzICJwYXRjaGluZyIuIFRoZSBmdW5jdGlvbiBhbHNvIGltcGxlbWVudHMgc3BlY3RyYWwgd2hpdGVuaW5nIGJ5IG1lYW5zIG9mCi0gIGludmVyc2UgZmlsdGVyaW5nIGJhc2VkIG9uIExQQyBjb2VmZmljaWVudHMuCisgIFxicmllZiAgTG93IFBvd2VyIFByb2ZpbGUgVHJhbnNwb3NlcgorICBUaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgdHJhbnNwb3Nlci4gVGhlIG1haW4gZW50cnkgcG9pbnQgaXMgbHBwVHJhbnNwb3NlcigpLgorICBUaGUgZnVuY3Rpb24gZ2VuZXJhdGVzIGhpZ2ggZnJlcXVlbmN5IGNvbnRlbnQgYnkgY29weWluZyBkYXRhIGZyb20gdGhlIGxvdworICBiYW5kIChwcm92aWRlZCBieSBjb3JlIGNvZGVjKSBpbnRvIHRoZSBoaWdoIGJhbmQuIFRoaXMgcHJvY2VzcyBpcyBhbHNvCisgIHJlZmVycmVkIHRvIGFzICJwYXRjaGluZyIuIFRoZSBmdW5jdGlvbiBhbHNvIGltcGxlbWVudHMgc3BlY3RyYWwgd2hpdGVuaW5nIGJ5CisgIG1lYW5zIG9mIGludmVyc2UgZmlsdGVyaW5nIGJhc2VkIG9uIExQQyBjb2VmZmljaWVudHMuCiAKLSAgVG9nZXRoZXIgd2l0aCB0aGUgUU1GIGZpbHRlcmJhbmsgdGhlIHRyYW5zcG9zZXIgY2FuIGJlIHRlc3RlZCB1c2luZyBhIHN1cHBsaWVkIHRlc3QgcHJvZ3JhbS4gU2VlIG1haW5fYXVkaW8uY3BwIGZvciBkZXRhaWxzLgotICBUaGlzIG1vZHVsZSBkb2VzIHVzZSBmcmFjdGlvbmFsIGFyaXRobWV0aWMgYW5kIHRoZSBhY2N1cmFjeSBvZiB0aGUgY29tcHV0YXRpb25zIGhhcyBhbiBpbXBhY3Qgb24gdGhlIG92ZXJhbGwgc291bmQgcXVhbGl0eS4KLSAgVGhlIG1vZHVsZSBhbHNvIG5lZWRzIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBkaWZmZXJlbnQgc2NhbGluZyBvZiBzcGVjdHJhbCBkYXRhLgorICBUb2dldGhlciB3aXRoIHRoZSBRTUYgZmlsdGVyYmFuayB0aGUgdHJhbnNwb3NlciBjYW4gYmUgdGVzdGVkIHVzaW5nIGEgc3VwcGxpZWQKKyAgdGVzdCBwcm9ncmFtLiBTZWUgbWFpbl9hdWRpby5jcHAgZm9yIGRldGFpbHMuIFRoaXMgbW9kdWxlIGRvZXMgdXNlIGZyYWN0aW9uYWwKKyAgYXJpdGhtZXRpYyBhbmQgdGhlIGFjY3VyYWN5IG9mIHRoZSBjb21wdXRhdGlvbnMgaGFzIGFuIGltcGFjdCBvbiB0aGUgb3ZlcmFsbAorICBzb3VuZCBxdWFsaXR5LiBUaGUgbW9kdWxlIGFsc28gbmVlZHMgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIGRpZmZlcmVudAorICBzY2FsaW5nIG9mIHNwZWN0cmFsIGRhdGEuCiAKICAgXHNhIGxwcFRyYW5zcG9zZXIoKSwgbWFpbl9hdWRpby5jcHAsIHNicl9zY2FsZS5oLCBccmVmIGRvY3VtZW50YXRpb25PdmVydmlldwogKi8KQEAgLTEwNCwxNiArMTI2LDEzIEBACiAjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKICNpbmNsdWRlICJhdXRvY29ycjJuZC5oIgogCi0KKyNpbmNsdWRlICJIRmdlbl9wcmVGbGF0LmgiCiAKICNpZiBkZWZpbmVkKF9fYXJtX18pCiAjaW5jbHVkZSAiYXJtL2xwcF90cmFuX2FybS5jcHAiCiAjZW5kaWYKIAotCi0KLSNkZWZpbmUgTFBDX1NDQUxFX0ZBQ1RPUiAgMgotCisjZGVmaW5lIExQQ19TQ0FMRV9GQUNUT1IgMgogCiAvKiEKICAqCkBAIC0xMjUsMzMgKzE0NCwyOCBAQAogICogbGV2ZWwgaXMgYmVpbmcgaW5zZXJ0ZWQgdG8gYWNoaWV2ZSBhIHNtb290aCB0cmFuc2l0aW9uLgogICovCiAKLSNpZm5kZWYgRlVOQ1RJT05fbWFwSW52Zk1vZGUKLXN0YXRpYyBGSVhQX0RCTAotbWFwSW52Zk1vZGUgKElOVkZfTU9ERSBtb2RlLAotICAgICAgICAgICAgIElOVkZfTU9ERSBwcmV2TW9kZSwKLSAgICAgICAgICAgICBXSElURU5JTkdfRkFDVE9SUyB3aEZhY3RvcnMpCi17CitzdGF0aWMgRklYUF9EQkwgbWFwSW52Zk1vZGUoSU5WRl9NT0RFIG1vZGUsIElOVkZfTU9ERSBwcmV2TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSElURU5JTkdfRkFDVE9SUyB3aEZhY3RvcnMpIHsKICAgc3dpdGNoIChtb2RlKSB7Ci0gIGNhc2UgSU5WRl9MT1dfTEVWRUw6Ci0gICAgaWYocHJldk1vZGUgPT0gSU5WRl9PRkYpCi0gICAgICByZXR1cm4gd2hGYWN0b3JzLnRyYW5zaXRpb25MZXZlbDsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gd2hGYWN0b3JzLmxvd0xldmVsOworICAgIGNhc2UgSU5WRl9MT1dfTEVWRUw6CisgICAgICBpZiAocHJldk1vZGUgPT0gSU5WRl9PRkYpCisgICAgICAgIHJldHVybiB3aEZhY3RvcnMudHJhbnNpdGlvbkxldmVsOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gd2hGYWN0b3JzLmxvd0xldmVsOwogCi0gIGNhc2UgSU5WRl9NSURfTEVWRUw6Ci0gICAgcmV0dXJuIHdoRmFjdG9ycy5taWRMZXZlbDsKKyAgICBjYXNlIElOVkZfTUlEX0xFVkVMOgorICAgICAgcmV0dXJuIHdoRmFjdG9ycy5taWRMZXZlbDsKIAotICBjYXNlIElOVkZfSElHSF9MRVZFTDoKLSAgICByZXR1cm4gd2hGYWN0b3JzLmhpZ2hMZXZlbDsKKyAgICBjYXNlIElOVkZfSElHSF9MRVZFTDoKKyAgICAgIHJldHVybiB3aEZhY3RvcnMuaGlnaExldmVsOwogCi0gIGRlZmF1bHQ6Ci0gICAgaWYocHJldk1vZGUgPT0gSU5WRl9MT1dfTEVWRUwpCi0gICAgICByZXR1cm4gd2hGYWN0b3JzLnRyYW5zaXRpb25MZXZlbDsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gd2hGYWN0b3JzLm9mZjsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKHByZXZNb2RlID09IElOVkZfTE9XX0xFVkVMKQorICAgICAgICByZXR1cm4gd2hGYWN0b3JzLnRyYW5zaXRpb25MZXZlbDsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHdoRmFjdG9ycy5vZmY7CiAgIH0KIH0KLSNlbmRpZiAvKiAjaWZuZGVmIEZVTkNUSU9OX21hcEludmZNb2RlICovCiAKIC8qIQogICoKQEAgLTE2MSwxMjQgKzE3NSwxNDggQEAKICAqCiAgKi8KIAotI2lmbmRlZiBGVU5DVElPTl9pbnZlcnNlRmlsdGVyaW5nTGV2ZWxFbXBoYXNpcwotc3RhdGljIHZvaWQKLWludmVyc2VGaWx0ZXJpbmdMZXZlbEVtcGhhc2lzKEhBTkRMRV9TQlJfTFBQX1RSQU5TIGhMcHBUcmFucywvKiE8IEhhbmRsZSBvZiBscHAgdHJhbnNwb3NlciAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIG5JbnZmQmFuZHMsICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBiYW5kcyBmb3IgaW52ZXJzZSBmaWx0ZXJpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSAqc2JyX2ludmZfbW9kZSwgICAgICAvKiE8IEN1cnJlbnQgaW52ZXJzZSBmaWx0ZXJpbmcgbW9kZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSAqc2JyX2ludmZfbW9kZV9wcmV2LCAvKiE8IFByZXZpb3VzIGludmVyc2UgZmlsdGVyaW5nIG1vZGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqIGJ3VmVjdG9yICAgICAgICAgICAgLyohPCBSZXN1bHRpbmcgZmlsdGVyaW5nIGxldmVscyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgbkludmZCYW5kczsgaSsrKSB7CitzdGF0aWMgdm9pZCBpbnZlcnNlRmlsdGVyaW5nTGV2ZWxFbXBoYXNpcygKKyAgICBIQU5ETEVfU0JSX0xQUF9UUkFOUyBoTHBwVHJhbnMsIC8qITwgSGFuZGxlIG9mIGxwcCB0cmFuc3Bvc2VyICAqLworICAgIFVDSEFSIG5JbnZmQmFuZHMsICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBiYW5kcyBmb3IgaW52ZXJzZSBmaWx0ZXJpbmcgKi8KKyAgICBJTlZGX01PREUgKnNicl9pbnZmX21vZGUsICAgICAgLyohPCBDdXJyZW50IGludmVyc2UgZmlsdGVyaW5nIG1vZGVzICovCisgICAgSU5WRl9NT0RFICpzYnJfaW52Zl9tb2RlX3ByZXYsIC8qITwgUHJldmlvdXMgaW52ZXJzZSBmaWx0ZXJpbmcgbW9kZXMgKi8KKyAgICBGSVhQX0RCTCAqYndWZWN0b3IgICAgICAgICAgICAgLyohPCBSZXN1bHRpbmcgZmlsdGVyaW5nIGxldmVscyAqLworKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkludmZCYW5kczsgaSsrKSB7CiAgICAgRklYUF9EQkwgYWNjdTsKLSAgICBGSVhQX0RCTCBid1RtcCA9IG1hcEludmZNb2RlIChzYnJfaW52Zl9tb2RlW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNicl9pbnZmX21vZGVfcHJldltpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoTHBwVHJhbnMtPnBTZXR0aW5ncy0+d2hGYWN0b3JzKTsKKyAgICBGSVhQX0RCTCBid1RtcCA9IG1hcEludmZNb2RlKHNicl9pbnZmX21vZGVbaV0sIHNicl9pbnZmX21vZGVfcHJldltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhMcHBUcmFucy0+cFNldHRpbmdzLT53aEZhY3RvcnMpOwogCi0gICAgaWYoYndUbXAgPCBoTHBwVHJhbnMtPmJ3VmVjdG9yT2xkW2ldKSB7Ci0gICAgICBhY2N1ID0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzVmKSxid1RtcCkgKwotICAgICAgICAgICAgIGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjI1ZiksaExwcFRyYW5zLT5id1ZlY3Rvck9sZFtpXSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgYWNjdSA9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjkwNjI1ZiksYndUbXApICsKLSAgICAgICAgICAgICBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC4wOTM3NWYpLGhMcHBUcmFucy0+YndWZWN0b3JPbGRbaV0pOworICAgIGlmIChid1RtcCA8IGhMcHBUcmFucy0+YndWZWN0b3JPbGRbaV0pIHsKKyAgICAgIGFjY3UgPSBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC43NWYpLCBid1RtcCkgKworICAgICAgICAgICAgIGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjI1ZiksIGhMcHBUcmFucy0+YndWZWN0b3JPbGRbaV0pOworICAgIH0gZWxzZSB7CisgICAgICBhY2N1ID0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuOTA2MjVmKSwgYndUbXApICsKKyAgICAgICAgICAgICBmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMC4wOTM3NWYpLCBoTHBwVHJhbnMtPmJ3VmVjdG9yT2xkW2ldKTsKICAgICB9CiAKLSAgICBpZiAoYWNjdSA8ICBGTDJGWENPTlNUX0RCTCgwLjAxNTYyNWYpPj4xKQorICAgIGlmIChhY2N1PEZMMkZYQ09OU1RfREJMKDAuMDE1NjI1Zik+PiAxKSB7CiAgICAgICBid1ZlY3RvcltpXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgIGVsc2UKLSAgICAgIGJ3VmVjdG9yW2ldID0gZml4TWluKGFjY3U8PDEsRkwyRlhDT05TVF9EQkwoMC45OTYwOTM3NWYpKTsKKyAgICB9IGVsc2UgeworICAgICAgYndWZWN0b3JbaV0gPSBmaXhNaW4oYWNjdSA8PCAxLCBGTDJGWENPTlNUX0RCTCgwLjk5NjA5Mzc1ZikpOworICAgIH0KICAgfQogfQotI2VuZGlmIC8qICNpZm5kZWYgRlVOQ1RJT05faW52ZXJzZUZpbHRlcmluZ0xldmVsRW1waGFzaXMgKi8KIAogLyogUmVzdWx0aW5nIGF1dG9jb3JyZWxhdGlvbiBkZXRlcm1pbmFudCBleHBvbmVudCAqLwotI2RlZmluZSBBQ0RFVF9FWFAgKDIqKERGUkFDVF9CSVRTK3NiclNjYWxlRmFjdG9yLT5sYl9zY2FsZSsxMC1hYy5kZXRfc2NhbGUpKQotI2RlZmluZSBBQ19FWFAgKC1zYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUrTFBDX1NDQUxFX0ZBQ1RPUikKLSNkZWZpbmUgQUxQSEFfRVhQICgtc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlK0xQQ19TQ0FMRV9GQUNUT1IrMSkKLS8qIFJlc3VsdGluZyB0cmFuc3Bvc2VkIFFNRiB2YWx1ZXMgZXhwb25lbnQgMTYgYml0IG5vcm1hbGl6ZWQgc2FtcGxlYml0cyBhc3N1bWVkLiAqLwotI2RlZmluZSBRTUZPVVRfRVhQICgoU0FNUExFX0JJVFMtMTUpLXNiclNjYWxlRmFjdG9yLT5sYl9zY2FsZSkKKyNkZWZpbmUgQUNERVRfRVhQIFwKKyAgKDIgKiAoREZSQUNUX0JJVFMgKyBzYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUgKyAxMCAtIGFjLmRldF9zY2FsZSkpCisjZGVmaW5lIEFDX0VYUCAoLXNiclNjYWxlRmFjdG9yLT5sYl9zY2FsZSArIExQQ19TQ0FMRV9GQUNUT1IpCisjZGVmaW5lIEFMUEhBX0VYUCAoLXNiclNjYWxlRmFjdG9yLT5sYl9zY2FsZSArIExQQ19TQ0FMRV9GQUNUT1IgKyAxKQorLyogUmVzdWx0aW5nIHRyYW5zcG9zZWQgUU1GIHZhbHVlcyBleHBvbmVudCAxNiBiaXQgbm9ybWFsaXplZCBzYW1wbGViaXRzCisgKiBhc3N1bWVkLiAqLworI2RlZmluZSBRTUZPVVRfRVhQICgoU0FNUExFX0JJVFMgLSAxNSkgLSBzYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjYWxjX3FtZkJ1ZmZlclJlYWwoRklYUF9EQkwgKipxbWZCdWZmZXJSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgbG93QmFuZFJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzdGFydFNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN0b3BTYW1wbGUsIGNvbnN0IFVDSEFSIGhpQmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGR5bmFtaWNTY2FsZSwgY29uc3QgaW50IGRlc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfU0dMIGEwciwgY29uc3QgRklYUF9TR0wgYTFyKSB7CisgIEZJWFBfREJMIGFjY3UxLCBhY2N1MjsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHN0b3BTYW1wbGUgLSBzdGFydFNhbXBsZTsgaSsrKSB7CisgICAgYWNjdTEgPSBmTXVsdERpdjIoYTFyLCBsb3dCYW5kUmVhbFtpXSk7CisgICAgYWNjdTEgPSAoZk11bHREaXYyKGEwciwgbG93QmFuZFJlYWxbaSArIDFdKSArIGFjY3UxKTsKKyAgICBhY2N1MSA9IGFjY3UxID4+IGR5bmFtaWNTY2FsZTsKKworICAgIGFjY3UxIDw8PSAxOworICAgIGFjY3UyID0gKGxvd0JhbmRSZWFsW2kgKyAyXSA+PiBkZXNjYWxlKTsKKyAgICBxbWZCdWZmZXJSZWFsW2kgKyBzdGFydFNhbXBsZV1baGlCYW5kXSA9IGFjY3UxICsgYWNjdTI7CisgIH0KK30KIAogLyohCiAgKgogICogXGJyaWVmIFBlcmZvcm0gdHJhbnNwb3NpdGlvbiBieSBwYXRjaGluZyBvZiBzdWJiYW5kIHNhbXBsZXMuCi0gKiBUaGlzIGZ1bmN0aW9uIHNlcnZlcyBhcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBpbnRvIHRoZSBtb2R1bGUuIFRoZSBmdW5jdGlvbiBkZXRlcm1pbmVzIHRoZSBhcmVhcyBmb3IgdGhlCi0gKiBwYXRjaGluZyBwcm9jZXNzICh0aGVzZSBhcmUgdGhlIHNvdXJjZSByYW5nZSBhcyB3ZWxsIGFzIHRoZSB0YXJnZXQgcmFuZ2UpIGFuZCBpbXBsZW1lbnRzIHNwZWN0cmFsIHdoaXRlbmluZwotICogYnkgbWVhbnMgb2YgaW52ZXJzZSBmaWx0ZXJpbmcuIFRoZSBmdW5jdGlvbiBhdXRvQ29ycmVsYXRpb24ybmQoKSBpcyBhbiBhdXhpbGlhcnkgZnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIHRoZQotICogTFBDIGNvZWZmaWNpZW50cyBmb3IgdGhlIGZpbHRlcmluZy4gIFRoZSBhY3R1YWwgY2FsY3VsYXRpb24gb2YgdGhlIExQQyBjb2VmZmljaWVudHMgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgotICogb2YgdGhlIGZpbHRlcmluZyBhcmUgZG9uZSBhcyBwYXJ0IG9mIGxwcFRyYW5zcG9zZXIoKS4KKyAqIFRoaXMgZnVuY3Rpb24gc2VydmVzIGFzIHRoZSBtYWluIGVudHJ5IHBvaW50IGludG8gdGhlIG1vZHVsZS4gVGhlIGZ1bmN0aW9uCisgKiBkZXRlcm1pbmVzIHRoZSBhcmVhcyBmb3IgdGhlIHBhdGNoaW5nIHByb2Nlc3MgKHRoZXNlIGFyZSB0aGUgc291cmNlIHJhbmdlIGFzCisgKiB3ZWxsIGFzIHRoZSB0YXJnZXQgcmFuZ2UpIGFuZCBpbXBsZW1lbnRzIHNwZWN0cmFsIHdoaXRlbmluZyBieSBtZWFucyBvZgorICogaW52ZXJzZSBmaWx0ZXJpbmcuIFRoZSBmdW5jdGlvbiBhdXRvQ29ycmVsYXRpb24ybmQoKSBpcyBhbiBhdXhpbGlhcnkgZnVuY3Rpb24KKyAqIGZvciBjYWxjdWxhdGluZyB0aGUgTFBDIGNvZWZmaWNpZW50cyBmb3IgdGhlIGZpbHRlcmluZy4gIFRoZSBhY3R1YWwKKyAqIGNhbGN1bGF0aW9uIG9mIHRoZSBMUEMgY29lZmZpY2llbnRzIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGZpbHRlcmluZworICogYXJlIGRvbmUgYXMgcGFydCBvZiBscHBUcmFuc3Bvc2VyKCkuCiAgKgotICogTm90ZSB0aGF0IHRoZSBmaWx0ZXJpbmcgaXMgZG9uZSBvbiBhbGwgYXZhaWxhYmxlIFFNRiBzdWJzYW1wbGVzLCB3aGVyZWFzIHRoZSBwYXRjaGluZyBpcyBvbmx5IGRvbmUgb24gdGhvc2UgUU1GCi0gKiBzdWJzYW1wbGVzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBuZXh0IFFNRiBzeW50aGVzaXMuIFRoZSBmaWx0ZXJpbmcgaXMgYWxzbyBpbXBsZW1lbnRlZCBiZWZvcmUgdGhlIHBhdGNoaW5nCi0gKiBpbmNsdWRlcyBmdXJ0aGVyIGRlcGVuZGVuY2llcyBvbiBwYXJhbWV0ZXJzIGZyb20gdGhlIFNCUiBkYXRhLgorICogTm90ZSB0aGF0IHRoZSBmaWx0ZXJpbmcgaXMgZG9uZSBvbiBhbGwgYXZhaWxhYmxlIFFNRiBzdWJzYW1wbGVzLCB3aGVyZWFzIHRoZQorICogcGF0Y2hpbmcgaXMgb25seSBkb25lIG9uIHRob3NlIFFNRiBzdWJzYW1wbGVzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBuZXh0CisgKiBRTUYgc3ludGhlc2lzLiBUaGUgZmlsdGVyaW5nIGlzIGFsc28gaW1wbGVtZW50ZWQgYmVmb3JlIHRoZSBwYXRjaGluZyBpbmNsdWRlcworICogZnVydGhlciBkZXBlbmRlbmNpZXMgb24gcGFyYW1ldGVycyBmcm9tIHRoZSBTQlIgZGF0YS4KICAqCiAgKi8KIAotdm9pZCBscHBUcmFuc3Bvc2VyIChIQU5ETEVfU0JSX0xQUF9UUkFOUyBoTHBwVHJhbnMsICAgIC8qITwgSGFuZGxlIG9mIGxwcCB0cmFuc3Bvc2VyICAqLwotICAgICAgICAgICAgICAgICAgICBRTUZfU0NBTEVfRkFDVE9SICAqc2JyU2NhbGVGYWN0b3IsIC8qITwgU2NhbGluZyBmYWN0b3JzICovCi0gICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcW1mQnVmZmVyUmVhbCwgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHBvaW50ZXIgdG8gcmVhbCBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyAoc291cmNlKSAqLwordm9pZCBscHBUcmFuc3Bvc2VyKAorICAgIEhBTkRMRV9TQlJfTFBQX1RSQU5TIGhMcHBUcmFucywgICAvKiE8IEhhbmRsZSBvZiBscHAgdHJhbnNwb3NlciAgKi8KKyAgICBRTUZfU0NBTEVfRkFDVE9SICpzYnJTY2FsZUZhY3RvciwgLyohPCBTY2FsaW5nIGZhY3RvcnMgKi8KKyAgICBGSVhQX0RCTCAqKnFtZkJ1ZmZlclJlYWwsIC8qITwgUG9pbnRlciB0byBwb2ludGVyIHRvIHJlYWwgcGFydCBvZiBzdWJiYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzIChzb3VyY2UpICovCiAKLSAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmRlZ3JlZUFsaWFzLCAgICAgICAgICAgICAvKiE8IFZlY3RvciBmb3IgcmVzdWx0cyBvZiBhbGlhc2luZyBlc3RpbWF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcW1mQnVmZmVySW1hZywgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHBvaW50ZXIgdG8gaW1hZ2luYXJ5IHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzIChzb3VyY2UpICovCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB1c2VMUCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbWVTdGVwLCAgICAgICAgICAgICAgICAvKiE8IFRpbWUgc3RlcCBvZiBlbnZlbG9wZSAqLwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZmlyc3RTbG90T2ZmcywgICAgICAgICAgIC8qITwgU3RhcnQgcG9zaXRpb24gaW4gdGltZSAqLwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGFzdFNsb3RPZmZzLCAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIG92ZXJsYXAtc2xvdHMgaW50byBuZXh0IGZyYW1lICovCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuSW52ZkJhbmRzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgZm9yIGludmVyc2UgZmlsdGVyaW5nICovCi0gICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSAqc2JyX2ludmZfbW9kZSwgICAgICAgICAgLyohPCBDdXJyZW50IGludmVyc2UgZmlsdGVyaW5nIG1vZGVzICovCi0gICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSAqc2JyX2ludmZfbW9kZV9wcmV2ICAgICAgLyohPCBQcmV2aW91cyBpbnZlcnNlIGZpbHRlcmluZyBtb2RlcyAqLwotICAgICAgICAgICAgICAgICAgICApCi17Ci0gIElOVCAgICBid0luZGV4W01BWF9OVU1fUEFUQ0hFU107Ci0gIEZJWFBfREJMICBid1ZlY3RvcltNQVhfTlVNX1BBVENIRVNdOyAgICAgICAvKiE8IHBvbGUgbW92aW5nIGZhY3RvcnMgKi8KKyAgICBGSVhQX0RCTCAqZGVncmVlQWxpYXMsICAgIC8qITwgVmVjdG9yIGZvciByZXN1bHRzIG9mIGFsaWFzaW5nIGVzdGltYXRpb24gKi8KKyAgICBGSVhQX0RCTCAqKnFtZkJ1ZmZlckltYWcsIC8qITwgUG9pbnRlciB0byBwb2ludGVyIHRvIGltYWdpbmFyeSBwYXJ0IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJiYW5kIHNhbXBsZXMgKHNvdXJjZSkgKi8KKyAgICBjb25zdCBpbnQgdXNlTFAsIGNvbnN0IGludCBmUHJlV2hpdGVuaW5nLCBjb25zdCBpbnQgdl9rX21hc3RlcjAsCisgICAgY29uc3QgaW50IHRpbWVTdGVwLCAgICAgICAvKiE8IFRpbWUgc3RlcCBvZiBlbnZlbG9wZSAqLworICAgIGNvbnN0IGludCBmaXJzdFNsb3RPZmZzLCAgLyohPCBTdGFydCBwb3NpdGlvbiBpbiB0aW1lICovCisgICAgY29uc3QgaW50IGxhc3RTbG90T2ZmcywgICAvKiE8IE51bWJlciBvZiBvdmVybGFwLXNsb3RzIGludG8gbmV4dCBmcmFtZSAqLworICAgIGNvbnN0IGludCBuSW52ZkJhbmRzLCAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgZm9yIGludmVyc2UgZmlsdGVyaW5nICovCisgICAgSU5WRl9NT0RFICpzYnJfaW52Zl9tb2RlLCAvKiE8IEN1cnJlbnQgaW52ZXJzZSBmaWx0ZXJpbmcgbW9kZXMgKi8KKyAgICBJTlZGX01PREUgKnNicl9pbnZmX21vZGVfcHJldiAvKiE8IFByZXZpb3VzIGludmVyc2UgZmlsdGVyaW5nIG1vZGVzICovCispIHsKKyAgSU5UIGJ3SW5kZXhbTUFYX05VTV9QQVRDSEVTXTsKKyAgRklYUF9EQkwgYndWZWN0b3JbTUFYX05VTV9QQVRDSEVTXTsgLyohPCBwb2xlIG1vdmluZyBmYWN0b3JzICovCisgIEZJWFBfREJMIHByZVdoaXRlbmluZ0dhaW5zWyg2NCkgLyAyXTsKKyAgaW50IHByZVdoaXRlbmluZ0dhaW5zX2V4cFsoNjQpIC8gMl07CiAKLSAgaW50ICAgIGk7Ci0gIGludCAgICBsb0JhbmQsIHN0YXJ0LCBzdG9wOworICBpbnQgaTsKKyAgaW50IGxvQmFuZCwgc3RhcnQsIHN0b3A7CiAgIFRSQU5TUE9TRVJfU0VUVElOR1MgKnBTZXR0aW5ncyA9IGhMcHBUcmFucy0+cFNldHRpbmdzOwogICBQQVRDSF9QQVJBTSAqcGF0Y2hQYXJhbSA9IHBTZXR0aW5ncy0+cGF0Y2hQYXJhbTsKLSAgaW50ICAgIHBhdGNoOworICBpbnQgcGF0Y2g7CiAKLSAgRklYUF9TR0wgIGFscGhhcltMUENfT1JERVJdLCBhMHIsIGExcjsKLSAgRklYUF9TR0wgIGFscGhhaVtMUENfT1JERVJdLCBhMGk9MCwgYTFpPTA7Ci0gIEZJWFBfU0dMICBidyA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworICBGSVhQX1NHTCBhbHBoYXJbTFBDX09SREVSXSwgYTByLCBhMXI7CisgIEZJWFBfU0dMIGFscGhhaVtMUENfT1JERVJdLCBhMGkgPSAwLCBhMWkgPSAwOworICBGSVhQX1NHTCBidyA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwogCi0gIGludCAgICBhdXRvQ29yckxlbmd0aDsKKyAgaW50IGF1dG9Db3JyTGVuZ3RoOwogCi0gIEZJWFBfREJMIGsxLCBrMV9iZWxvdz0wLCBrMV9iZWxvdzI9MDsKKyAgRklYUF9EQkwgazEsIGsxX2JlbG93ID0gMCwgazFfYmVsb3cyID0gMDsKIAogICBBQ09SUl9DT0VGUyBhYzsKLSAgaW50ICAgIHN0YXJ0U2FtcGxlOwotICBpbnQgICAgc3RvcFNhbXBsZTsKLSAgaW50ICAgIHN0b3BTYW1wbGVDbGVhcjsKKyAgaW50IHN0YXJ0U2FtcGxlOworICBpbnQgc3RvcFNhbXBsZTsKKyAgaW50IHN0b3BTYW1wbGVDbGVhcjsKIAogICBpbnQgY29tTG93QmFuZFNjYWxlOwogICBpbnQgb3ZMb3dCYW5kU2hpZnQ7CiAgIGludCBsb3dCYW5kU2hpZnQ7Ci0vKiAgaW50IG92SGlnaEJhbmRTaGlmdDsqLworICAvKiAgaW50IG92SGlnaEJhbmRTaGlmdDsqLwogICBpbnQgdGFyZ2V0U3RvcEJhbmQ7CiAKLQogICBhbHBoYWlbMF0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKICAgYWxwaGFpWzFdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CiAKLQogICBzdGFydFNhbXBsZSA9IGZpcnN0U2xvdE9mZnMgKiB0aW1lU3RlcDsKLSAgc3RvcFNhbXBsZSAgPSBwU2V0dGluZ3MtPm5Db2xzICsgbGFzdFNsb3RPZmZzICogdGltZVN0ZXA7CisgIHN0b3BTYW1wbGUgPSBwU2V0dGluZ3MtPm5Db2xzICsgbGFzdFNsb3RPZmZzICogdGltZVN0ZXA7CisgIEZES19BU1NFUlQoKGxhc3RTbG90T2ZmcyAqIHRpbWVTdGVwKSA8PSBwU2V0dGluZ3MtPm92ZXJsYXApOwogCi0KLSAgaW52ZXJzZUZpbHRlcmluZ0xldmVsRW1waGFzaXMoaExwcFRyYW5zLCBuSW52ZkJhbmRzLCBzYnJfaW52Zl9tb2RlLCBzYnJfaW52Zl9tb2RlX3ByZXYsIGJ3VmVjdG9yKTsKKyAgaW52ZXJzZUZpbHRlcmluZ0xldmVsRW1waGFzaXMoaExwcFRyYW5zLCBuSW52ZkJhbmRzLCBzYnJfaW52Zl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJfaW52Zl9tb2RlX3ByZXYsIGJ3VmVjdG9yKTsKIAogICBzdG9wU2FtcGxlQ2xlYXIgPSBzdG9wU2FtcGxlOwogCiAgIGF1dG9Db3JyTGVuZ3RoID0gcFNldHRpbmdzLT5uQ29scyArIHBTZXR0aW5ncy0+b3ZlcmxhcDsKIAogICAvKiBTZXQgdXBwZXIgc3ViYmFuZHMgdG8gemVybzoKLSAgICAgVGhpcyBpcyByZXF1aXJlZCBpbiBjYXNlIHRoYXQgdGhlIHBhdGNoZXMgZG8gbm90IGNvdmVyIHRoZSBjb21wbGV0ZSBoaWdoYmFuZAotICAgICAoYmVjYXVzZSB0aGUgbGFzdCBwYXRjaCB3b3VsZCBiZSB0b28gc2hvcnQpLgotICAgICBQb3NzaWJsZSBvcHRpbWl6YXRpb246IENsZWFyaW5nIGJhbmRzIHVwIHRvIHVzYiB3b3VsZCBiZSBzdWZmaWNpZW50IGhlcmUuICovCi0gIHRhcmdldFN0b3BCYW5kID0gcGF0Y2hQYXJhbVtwU2V0dGluZ3MtPm5vT2ZQYXRjaGVzLTFdLnRhcmdldFN0YXJ0QmFuZAotICAgICAgICAgICAgICAgICArIHBhdGNoUGFyYW1bcFNldHRpbmdzLT5ub09mUGF0Y2hlcy0xXS5udW1CYW5kc0luUGF0Y2g7CisgICAgIFRoaXMgaXMgcmVxdWlyZWQgaW4gY2FzZSB0aGF0IHRoZSBwYXRjaGVzIGRvIG5vdCBjb3ZlciB0aGUgY29tcGxldGUKKyAgICAgaGlnaGJhbmQgKGJlY2F1c2UgdGhlIGxhc3QgcGF0Y2ggd291bGQgYmUgdG9vIHNob3J0KS4gUG9zc2libGUKKyAgICAgb3B0aW1pemF0aW9uOiBDbGVhcmluZyBiYW5kcyB1cCB0byB1c2Igd291bGQgYmUgc3VmZmljaWVudCBoZXJlLiAqLworICB0YXJnZXRTdG9wQmFuZCA9IHBhdGNoUGFyYW1bcFNldHRpbmdzLT5ub09mUGF0Y2hlcyAtIDFdLnRhcmdldFN0YXJ0QmFuZCArCisgICAgICAgICAgICAgICAgICAgcGF0Y2hQYXJhbVtwU2V0dGluZ3MtPm5vT2ZQYXRjaGVzIC0gMV0ubnVtQmFuZHNJblBhdGNoOwogCiAgIGludCBtZW1TaXplID0gKCg2NCkgLSB0YXJnZXRTdG9wQmFuZCkgKiBzaXplb2YoRklYUF9EQkwpOwogCkBAIC0yODcsNjcgKzMyNSw4NCBAQAogICAgICAgRkRLbWVtY2xlYXIoJnFtZkJ1ZmZlclJlYWxbaV1bdGFyZ2V0U3RvcEJhbmRdLCBtZW1TaXplKTsKICAgICAgIEZES21lbWNsZWFyKCZxbWZCdWZmZXJJbWFnW2ldW3RhcmdldFN0b3BCYW5kXSwgbWVtU2l6ZSk7CiAgICAgfQotICB9IGVsc2UKLSAgZm9yIChpID0gc3RhcnRTYW1wbGU7IGkgPCBzdG9wU2FtcGxlQ2xlYXI7IGkrKykgewotICAgIEZES21lbWNsZWFyKCZxbWZCdWZmZXJSZWFsW2ldW3RhcmdldFN0b3BCYW5kXSwgbWVtU2l6ZSk7CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gc3RhcnRTYW1wbGU7IGkgPCBzdG9wU2FtcGxlQ2xlYXI7IGkrKykgeworICAgICAgRkRLbWVtY2xlYXIoJnFtZkJ1ZmZlclJlYWxbaV1bdGFyZ2V0U3RvcEJhbmRdLCBtZW1TaXplKTsKKyAgICB9CiAgIH0KIAogICAvKiBpbml0IGJ3SW5kZXggZm9yIGVhY2ggcGF0Y2ggKi8KLSAgRkRLbWVtY2xlYXIoYndJbmRleCwgcFNldHRpbmdzLT5ub09mUGF0Y2hlcypzaXplb2YoSU5UKSk7CisgIEZES21lbWNsZWFyKGJ3SW5kZXgsIHNpemVvZihid0luZGV4KSk7CiAKICAgLyoKICAgICBDYWxjIGNvbW1vbiBsb3cgYmFuZCBzY2FsZSBmYWN0b3IKICAgKi8KLSAgY29tTG93QmFuZFNjYWxlID0gZml4TWluKHNiclNjYWxlRmFjdG9yLT5vdl9sYl9zY2FsZSxzYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUpOworICBjb21Mb3dCYW5kU2NhbGUgPQorICAgICAgZml4TWluKHNiclNjYWxlRmFjdG9yLT5vdl9sYl9zY2FsZSwgc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlKTsKIAotICBvdkxvd0JhbmRTaGlmdCA9ICBzYnJTY2FsZUZhY3Rvci0+b3ZfbGJfc2NhbGUgLSBjb21Mb3dCYW5kU2NhbGU7Ci0gIGxvd0JhbmRTaGlmdCAgID0gIHNiclNjYWxlRmFjdG9yLT5sYl9zY2FsZSAtIGNvbUxvd0JhbmRTY2FsZTsKKyAgb3ZMb3dCYW5kU2hpZnQgPSBzYnJTY2FsZUZhY3Rvci0+b3ZfbGJfc2NhbGUgLSBjb21Mb3dCYW5kU2NhbGU7CisgIGxvd0JhbmRTaGlmdCA9IHNiclNjYWxlRmFjdG9yLT5sYl9zY2FsZSAtIGNvbUxvd0JhbmRTY2FsZTsKICAgLyogIG92SGlnaEJhbmRTaGlmdCA9IGZpcnN0U2xvdE9mZnMgPT0gMCA/IG92TG93QmFuZFNoaWZ0OjA7Ki8KIAorICBpZiAoZlByZVdoaXRlbmluZykgeworICAgIHNickRlY29kZXJfY2FsY3VsYXRlR2FpblZlYygKKyAgICAgICAgcW1mQnVmZmVyUmVhbCwgcW1mQnVmZmVySW1hZywKKyAgICAgICAgREZSQUNUX0JJVFMgLSAxIC0gMTYgLQorICAgICAgICAgICAgc2JyU2NhbGVGYWN0b3ItPm92X2xiX3NjYWxlLCAvKiBjb252ZXJ0IHNjYWxlIHRvIGV4cG9uZW50ICovCisgICAgICAgIERGUkFDVF9CSVRTIC0gMSAtIDE2IC0KKyAgICAgICAgICAgIHNiclNjYWxlRmFjdG9yLT5sYl9zY2FsZSwgLyogY29udmVydCBzY2FsZSB0byBleHBvbmVudCAqLworICAgICAgICBwU2V0dGluZ3MtPm92ZXJsYXAsIHByZVdoaXRlbmluZ0dhaW5zLCBwcmVXaGl0ZW5pbmdHYWluc19leHAsCisgICAgICAgIHZfa19tYXN0ZXIwLCBzdGFydFNhbXBsZSwgc3RvcFNhbXBsZSk7CisgIH0KKwogICAvKiBvdXRlciBsb29wIG92ZXIgYmFuZHMgdG8gZG8gYW5hbHlzaXMgb25seSBvbmNlIGZvciBlYWNoIGJhbmQgKi8KIAogICBpZiAoIXVzZUxQKSB7CiAgICAgc3RhcnQgPSBwU2V0dGluZ3MtPmxiU3RhcnRQYXRjaGluZzsKICAgICBzdG9wID0gcFNldHRpbmdzLT5sYlN0b3BQYXRjaGluZzsKLSAgfSBlbHNlCi0gIHsKKyAgfSBlbHNlIHsKICAgICBzdGFydCA9IGZpeE1heCgxLCBwU2V0dGluZ3MtPmxiU3RhcnRQYXRjaGluZyAtIDIpOwogICAgIHN0b3AgPSBwYXRjaFBhcmFtWzBdLnRhcmdldFN0YXJ0QmFuZDsKICAgfQogCi0KLSAgZm9yICggbG9CYW5kID0gc3RhcnQ7IGxvQmFuZCA8ICBzdG9wOyBsb0JhbmQrKyApIHsKLQotICAgIEZJWFBfREJMICBsb3dCYW5kUmVhbFsoKCgxMDI0KS8oMzIpKSsoNikpK0xQQ19PUkRFUl07CisgIGZvciAobG9CYW5kID0gc3RhcnQ7IGxvQmFuZCA8IHN0b3A7IGxvQmFuZCsrKSB7CisgICAgRklYUF9EQkwgbG93QmFuZFJlYWxbKCgoMTAyNCkgLyAoMzIpICogKDQpIC8gMikgKyAoMyAqICg0KSkpICsgTFBDX09SREVSXTsKICAgICBGSVhQX0RCTCAqcGxvd0JhbmRSZWFsID0gbG93QmFuZFJlYWw7Ci0gICAgRklYUF9EQkwgKipwcW1mQnVmZmVyUmVhbCA9IHFtZkJ1ZmZlclJlYWw7Ci0gICAgRklYUF9EQkwgIGxvd0JhbmRJbWFnWygoKDEwMjQpLygzMikpKyg2KSkrTFBDX09SREVSXTsKKyAgICBGSVhQX0RCTCAqKnBxbWZCdWZmZXJSZWFsID0KKyAgICAgICAgcW1mQnVmZmVyUmVhbCArIGZpcnN0U2xvdE9mZnMgKiB0aW1lU3RlcCAvKiArIHBTZXR0aW5ncy0+b3ZlcmxhcCAqLzsKKyAgICBGSVhQX0RCTCBsb3dCYW5kSW1hZ1soKCgxMDI0KSAvICgzMikgKiAoNCkgLyAyKSArICgzICogKDQpKSkgKyBMUENfT1JERVJdOwogICAgIEZJWFBfREJMICpwbG93QmFuZEltYWcgPSBsb3dCYW5kSW1hZzsKLSAgICBGSVhQX0RCTCAqKnBxbWZCdWZmZXJJbWFnID0gcW1mQnVmZmVySW1hZzsKLSAgICBpbnQgcmVzZXRMUENDb2VmZnM9MDsKLSAgICBpbnQgZHluYW1pY1NjYWxlID0gREZSQUNUX0JJVFMtMS1MUENfU0NBTEVfRkFDVE9SOworICAgIEZJWFBfREJMICoqcHFtZkJ1ZmZlckltYWcgPQorICAgICAgICBxbWZCdWZmZXJJbWFnICsgZmlyc3RTbG90T2ZmcyAqIHRpbWVTdGVwIC8qICsgcFNldHRpbmdzLT5vdmVybGFwICovOworICAgIGludCByZXNldExQQ0NvZWZmcyA9IDA7CisgICAgaW50IGR5bmFtaWNTY2FsZSA9IERGUkFDVF9CSVRTIC0gMSAtIExQQ19TQ0FMRV9GQUNUT1I7CiAgICAgaW50IGFjRGV0U2NhbGUgPSAwOyAvKiBzY2FsaW5nIG9mIGF1dG9jb3JyZWxhdGlvbiBkZXRlcm1pbmFudCAqLwogCi0gICAgZm9yKGk9MDtpPExQQ19PUkRFUjtpKyspewotICAgICAgKnBsb3dCYW5kUmVhbCsrID0gaExwcFRyYW5zLT5scGNGaWx0ZXJTdGF0ZXNSZWFsW2ldW2xvQmFuZF07CisgICAgZm9yIChpID0gMDsKKyAgICAgICAgIGkgPCBMUENfT1JERVIgKyBmaXJzdFNsb3RPZmZzICogdGltZVN0ZXAgLyorcFNldHRpbmdzLT5vdmVybGFwKi87CisgICAgICAgICBpKyspIHsKKyAgICAgICpwbG93QmFuZFJlYWwrKyA9IGhMcHBUcmFucy0+bHBjRmlsdGVyU3RhdGVzUmVhbExlZ1NCUltpXVtsb0JhbmRdOwogICAgICAgaWYgKCF1c2VMUCkKLSAgICAgICAgKnBsb3dCYW5kSW1hZysrID0gaExwcFRyYW5zLT5scGNGaWx0ZXJTdGF0ZXNJbWFnW2ldW2xvQmFuZF07CisgICAgICAgICpwbG93QmFuZEltYWcrKyA9IGhMcHBUcmFucy0+bHBjRmlsdGVyU3RhdGVzSW1hZ0xlZ1NCUltpXVtsb0JhbmRdOwogICAgIH0KIAogICAgIC8qCiAgICAgICBUYWtlIG9sZCBzbG9wZSBsZW5ndGggcW1mIHNsb3Qgc291cmNlIHZhbHVlcyBvdXQgb2YgKG92ZXJsYXApcW1mIGJ1ZmZlcgogICAgICovCiAgICAgaWYgKCF1c2VMUCkgewotICAgICAgZm9yKGk9MDtpPHBTZXR0aW5ncy0+bkNvbHMrcFNldHRpbmdzLT5vdmVybGFwO2krKyl7CisgICAgICBmb3IgKGkgPSAwOworICAgICAgICAgICBpIDwgcFNldHRpbmdzLT5uQ29scyArIHBTZXR0aW5ncy0+b3ZlcmxhcCAtIGZpcnN0U2xvdE9mZnMgKiB0aW1lU3RlcDsKKyAgICAgICAgICAgaSsrKSB7CiAgICAgICAgICpwbG93QmFuZFJlYWwrKyA9ICgqcHFtZkJ1ZmZlclJlYWwrKylbbG9CYW5kXTsKICAgICAgICAgKnBsb3dCYW5kSW1hZysrID0gKCpwcW1mQnVmZmVySW1hZysrKVtsb0JhbmRdOwogICAgICAgfQotICAgIH0gZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgLyogcFNldHRpbmdzLT5vdmVybGFwIGlzIGFsd2F5cyBldmVuICovCiAgICAgICBGREtfQVNTRVJUKChwU2V0dGluZ3MtPm92ZXJsYXAgJiAxKSA9PSAwKTsKLQotICAgICAgZm9yKGk9MDtpPCgocFNldHRpbmdzLT5vdmVybGFwK3BTZXR0aW5ncy0+bkNvbHMpPj4xKTtpKyspIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAoKHBTZXR0aW5ncy0+bkNvbHMgKyBwU2V0dGluZ3MtPm92ZXJsYXAgLQorICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTbG90T2ZmcyAqIHRpbWVTdGVwKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgICAgaSsrKSB7CiAgICAgICAgICpwbG93QmFuZFJlYWwrKyA9ICgqcHFtZkJ1ZmZlclJlYWwrKylbbG9CYW5kXTsKICAgICAgICAgKnBsb3dCYW5kUmVhbCsrID0gKCpwcW1mQnVmZmVyUmVhbCsrKVtsb0JhbmRdOwogICAgICAgfQpAQCAtMzU5LDYxICs0MTQsNzcgQEAKICAgICAvKgogICAgICAgRGV0ZXJtaW5lIGR5bmFtaWMgc2NhbGluZyB2YWx1ZS4KICAgICAgKi8KLSAgICBkeW5hbWljU2NhbGUgPSBmaXhNaW4oZHluYW1pY1NjYWxlLCBnZXRTY2FsZWZhY3Rvcihsb3dCYW5kUmVhbCwgTFBDX09SREVSK3BTZXR0aW5ncy0+b3ZlcmxhcCkgKyBvdkxvd0JhbmRTaGlmdCk7Ci0gICAgZHluYW1pY1NjYWxlID0gZml4TWluKGR5bmFtaWNTY2FsZSwgZ2V0U2NhbGVmYWN0b3IoJmxvd0JhbmRSZWFsW0xQQ19PUkRFUitwU2V0dGluZ3MtPm92ZXJsYXBdLCBwU2V0dGluZ3MtPm5Db2xzKSArIGxvd0JhbmRTaGlmdCk7CisgICAgZHluYW1pY1NjYWxlID0KKyAgICAgICAgZml4TWluKGR5bmFtaWNTY2FsZSwKKyAgICAgICAgICAgICAgIGdldFNjYWxlZmFjdG9yKGxvd0JhbmRSZWFsLCBMUENfT1JERVIgKyBwU2V0dGluZ3MtPm92ZXJsYXApICsKKyAgICAgICAgICAgICAgICAgICBvdkxvd0JhbmRTaGlmdCk7CisgICAgZHluYW1pY1NjYWxlID0KKyAgICAgICAgZml4TWluKGR5bmFtaWNTY2FsZSwKKyAgICAgICAgICAgICAgIGdldFNjYWxlZmFjdG9yKCZsb3dCYW5kUmVhbFtMUENfT1JERVIgKyBwU2V0dGluZ3MtPm92ZXJsYXBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5uQ29scykgKworICAgICAgICAgICAgICAgICAgIGxvd0JhbmRTaGlmdCk7CiAgICAgaWYgKCF1c2VMUCkgewotICAgICAgZHluYW1pY1NjYWxlID0gZml4TWluKGR5bmFtaWNTY2FsZSwgZ2V0U2NhbGVmYWN0b3IobG93QmFuZEltYWcsIExQQ19PUkRFUitwU2V0dGluZ3MtPm92ZXJsYXApICsgb3ZMb3dCYW5kU2hpZnQpOwotICAgICAgZHluYW1pY1NjYWxlID0gZml4TWluKGR5bmFtaWNTY2FsZSwgZ2V0U2NhbGVmYWN0b3IoJmxvd0JhbmRJbWFnW0xQQ19PUkRFUitwU2V0dGluZ3MtPm92ZXJsYXBdLCBwU2V0dGluZ3MtPm5Db2xzKSArIGxvd0JhbmRTaGlmdCk7CisgICAgICBkeW5hbWljU2NhbGUgPQorICAgICAgICAgIGZpeE1pbihkeW5hbWljU2NhbGUsCisgICAgICAgICAgICAgICAgIGdldFNjYWxlZmFjdG9yKGxvd0JhbmRJbWFnLCBMUENfT1JERVIgKyBwU2V0dGluZ3MtPm92ZXJsYXApICsKKyAgICAgICAgICAgICAgICAgICAgIG92TG93QmFuZFNoaWZ0KTsKKyAgICAgIGR5bmFtaWNTY2FsZSA9CisgICAgICAgICAgZml4TWluKGR5bmFtaWNTY2FsZSwKKyAgICAgICAgICAgICAgICAgZ2V0U2NhbGVmYWN0b3IoJmxvd0JhbmRJbWFnW0xQQ19PUkRFUiArIHBTZXR0aW5ncy0+b3ZlcmxhcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+bkNvbHMpICsKKyAgICAgICAgICAgICAgICAgICAgIGxvd0JhbmRTaGlmdCk7CiAgICAgfQotICAgIGR5bmFtaWNTY2FsZSA9IGZpeE1heCgwLCBkeW5hbWljU2NhbGUtMSk7IC8qIG9uZSBhZGRpdGlvbmFsIGJpdCBoZWFkcm9vbSB0byBwcmV2ZW50IC0xLjAgKi8KKyAgICBkeW5hbWljU2NhbGUgPSBmaXhNYXgoCisgICAgICAgIDAsIGR5bmFtaWNTY2FsZSAtIDEpOyAvKiBvbmUgYWRkaXRpb25hbCBiaXQgaGVhZHJvb20gdG8gcHJldmVudCAtMS4wICovCiAKICAgICAvKgogICAgICAgU2NhbGUgdGVtcG9yYWwgUU1GIGJ1ZmZlci4KICAgICAgKi8KLSAgICBzY2FsZVZhbHVlcygmbG93QmFuZFJlYWxbMF0sIExQQ19PUkRFUitwU2V0dGluZ3MtPm92ZXJsYXAsIGR5bmFtaWNTY2FsZS1vdkxvd0JhbmRTaGlmdCk7Ci0gICAgc2NhbGVWYWx1ZXMoJmxvd0JhbmRSZWFsW0xQQ19PUkRFUitwU2V0dGluZ3MtPm92ZXJsYXBdLCBwU2V0dGluZ3MtPm5Db2xzLCBkeW5hbWljU2NhbGUtbG93QmFuZFNoaWZ0KTsKKyAgICBzY2FsZVZhbHVlcygmbG93QmFuZFJlYWxbMF0sIExQQ19PUkRFUiArIHBTZXR0aW5ncy0+b3ZlcmxhcCwKKyAgICAgICAgICAgICAgICBkeW5hbWljU2NhbGUgLSBvdkxvd0JhbmRTaGlmdCk7CisgICAgc2NhbGVWYWx1ZXMoJmxvd0JhbmRSZWFsW0xQQ19PUkRFUiArIHBTZXR0aW5ncy0+b3ZlcmxhcF0sIHBTZXR0aW5ncy0+bkNvbHMsCisgICAgICAgICAgICAgICAgZHluYW1pY1NjYWxlIC0gbG93QmFuZFNoaWZ0KTsKIAogICAgIGlmICghdXNlTFApIHsKLSAgICAgIHNjYWxlVmFsdWVzKCZsb3dCYW5kSW1hZ1swXSwgTFBDX09SREVSK3BTZXR0aW5ncy0+b3ZlcmxhcCwgZHluYW1pY1NjYWxlLW92TG93QmFuZFNoaWZ0KTsKLSAgICAgIHNjYWxlVmFsdWVzKCZsb3dCYW5kSW1hZ1tMUENfT1JERVIrcFNldHRpbmdzLT5vdmVybGFwXSwgcFNldHRpbmdzLT5uQ29scywgZHluYW1pY1NjYWxlLWxvd0JhbmRTaGlmdCk7CisgICAgICBzY2FsZVZhbHVlcygmbG93QmFuZEltYWdbMF0sIExQQ19PUkRFUiArIHBTZXR0aW5ncy0+b3ZlcmxhcCwKKyAgICAgICAgICAgICAgICAgIGR5bmFtaWNTY2FsZSAtIG92TG93QmFuZFNoaWZ0KTsKKyAgICAgIHNjYWxlVmFsdWVzKCZsb3dCYW5kSW1hZ1tMUENfT1JERVIgKyBwU2V0dGluZ3MtPm92ZXJsYXBdLAorICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5uQ29scywgZHluYW1pY1NjYWxlIC0gbG93QmFuZFNoaWZ0KTsKICAgICB9CiAKKyAgICBpZiAoIXVzZUxQKSB7CisgICAgICBhY0RldFNjYWxlICs9IGF1dG9Db3JyMm5kX2NwbHgoJmFjLCBsb3dCYW5kUmVhbCArIExQQ19PUkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dCYW5kSW1hZyArIExQQ19PUkRFUiwgYXV0b0NvcnJMZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICBhY0RldFNjYWxlICs9CisgICAgICAgICAgYXV0b0NvcnIybmRfcmVhbCgmYWMsIGxvd0JhbmRSZWFsICsgTFBDX09SREVSLCBhdXRvQ29yckxlbmd0aCk7CisgICAgfQogCi0gICAgICBpZiAoIXVzZUxQKSB7Ci0gICAgICAgIGFjRGV0U2NhbGUgKz0gYXV0b0NvcnIybmRfY3BseCgmYWMsIGxvd0JhbmRSZWFsK0xQQ19PUkRFUiwgbG93QmFuZEltYWcrTFBDX09SREVSLCBhdXRvQ29yckxlbmd0aCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGFjRGV0U2NhbGUgKz0gYXV0b0NvcnIybmRfcmVhbCgmYWMsIGxvd0JhbmRSZWFsK0xQQ19PUkRFUiwgYXV0b0NvcnJMZW5ndGgpOwotICAgICAgfQorICAgIC8qIEV4YW1pbmUgZHluYW1pYyBvZiBkZXRlcm1pbmFudCBpbiBhdXRvY29ycmVsYXRpb24uICovCisgICAgYWNEZXRTY2FsZSArPSAyICogKGNvbUxvd0JhbmRTY2FsZSArIGR5bmFtaWNTY2FsZSk7CisgICAgYWNEZXRTY2FsZSAqPSAyOyAgICAgICAgICAgIC8qIHR3byB0aW1lcyByZWZsZWN0aW9uIGNvZWZmaWNlbnQgc2NhbGluZyAqLworICAgIGFjRGV0U2NhbGUgKz0gYWMuZGV0X3NjYWxlOyAvKiBhYyBzY2FsaW5nIG9mIGRldGVybWluYW50ICovCiAKLSAgICAgIC8qIEV4YW1pbmUgZHluYW1pYyBvZiBkZXRlcm1pbmFudCBpbiBhdXRvY29ycmVsYXRpb24uICovCi0gICAgICBhY0RldFNjYWxlICs9IDIqKGNvbUxvd0JhbmRTY2FsZSArIGR5bmFtaWNTY2FsZSk7Ci0gICAgICBhY0RldFNjYWxlICo9IDI7ICAgICAgICAgICAgICAvKiB0d28gdGltZXMgcmVmbGVjdGlvbiBjb2VmZmljZW50IHNjYWxpbmcgKi8KLSAgICAgIGFjRGV0U2NhbGUgKz0gYWMuZGV0X3NjYWxlOyAgIC8qIGFjIHNjYWxpbmcgb2YgZGV0ZXJtaW5hbnQgKi8KLQotICAgICAgLyogSW4gY2FzZSBvZiBkZXRlcm1pbmFudCA8IDEwXi0zOCwgcmVzZXRMUENDb2VmZnM9MSBoYXMgdG8gYmUgZW5mb3JjZWQuICovCi0gICAgICBpZiAoYWNEZXRTY2FsZT4xMjYgKSB7Ci0gICAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKLSAgICAgIH0KLQorICAgIC8qIEluIGNhc2Ugb2YgZGV0ZXJtaW5hbnQgPCAxMF4tMzgsIHJlc2V0TFBDQ29lZmZzPTEgaGFzIHRvIGJlIGVuZm9yY2VkLiAqLworICAgIGlmIChhY0RldFNjYWxlID4gMTI2KSB7CisgICAgICByZXNldExQQ0NvZWZmcyA9IDE7CisgICAgfQogCiAgICAgYWxwaGFyWzFdID0gRkwyRlhDT05TVF9TR0woMC4wZik7Ci0gICAgaWYgKCF1c2VMUCkKLSAgICAgIGFscGhhaVsxXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworICAgIGlmICghdXNlTFApIGFscGhhaVsxXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwogCiAgICAgaWYgKGFjLmRldCAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgewotICAgICAgRklYUF9EQkwgdG1wLGFic1RtcCxhYnNEZXQ7CisgICAgICBGSVhQX0RCTCB0bXAsIGFic1RtcCwgYWJzRGV0OwogCiAgICAgICBhYnNEZXQgPSBmaXhwX2FicyhhYy5kZXQpOwogCiAgICAgICBpZiAoIXVzZUxQKSB7Ci0gICAgICAgIHRtcCA9ICggZk11bHREaXYyKGFjLnIwMXIsYWMucjEycikgPj4gKExQQ19TQ0FMRV9GQUNUT1ItMSkgKSAtCi0gICAgICAgICAgICAgICggKGZNdWx0RGl2MihhYy5yMDFpLGFjLnIxMmkpICsgZk11bHREaXYyKGFjLnIwMnIsYWMucjExcikpID4+IChMUENfU0NBTEVfRkFDVE9SLTEpICk7Ci0gICAgICB9IGVsc2UKLSAgICAgIHsKLSAgICAgICAgdG1wID0gKCBmTXVsdERpdjIoYWMucjAxcixhYy5yMTJyKSA+PiAoTFBDX1NDQUxFX0ZBQ1RPUi0xKSApIC0KLSAgICAgICAgICAgICAgKCBmTXVsdERpdjIoYWMucjAycixhYy5yMTFyKSA+PiAoTFBDX1NDQUxFX0ZBQ1RPUi0xKSApOworICAgICAgICB0bXAgPSAoZk11bHREaXYyKGFjLnIwMXIsIGFjLnIxMnIpID4+IChMUENfU0NBTEVfRkFDVE9SIC0gMSkpIC0KKyAgICAgICAgICAgICAgKChmTXVsdERpdjIoYWMucjAxaSwgYWMucjEyaSkgKyBmTXVsdERpdjIoYWMucjAyciwgYWMucjExcikpID4+CisgICAgICAgICAgICAgICAoTFBDX1NDQUxFX0ZBQ1RPUiAtIDEpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRtcCA9IChmTXVsdERpdjIoYWMucjAxciwgYWMucjEycikgPj4gKExQQ19TQ0FMRV9GQUNUT1IgLSAxKSkgLQorICAgICAgICAgICAgICAoZk11bHREaXYyKGFjLnIwMnIsIGFjLnIxMXIpID4+IChMUENfU0NBTEVfRkFDVE9SIC0gMSkpOwogICAgICAgfQogICAgICAgYWJzVG1wID0gZml4cF9hYnModG1wKTsKIApAQCAtNDIzLDIzICs0OTQsMjMgQEAKICAgICAgIHsKICAgICAgICAgSU5UIHNjYWxlOwogICAgICAgICBGSVhQX0RCTCByZXN1bHQgPSBmRGl2Tm9ybShhYnNUbXAsIGFic0RldCwgJnNjYWxlKTsKLSAgICAgICAgc2NhbGUgPSBzY2FsZSthYy5kZXRfc2NhbGU7CisgICAgICAgIHNjYWxlID0gc2NhbGUgKyBhYy5kZXRfc2NhbGU7CiAKLSAgICAgICAgaWYgKCAoc2NhbGUgPiAwKSAmJiAocmVzdWx0ID49IChGSVhQX0RCTClNQVhWQUxfREJMPj5zY2FsZSkgKSB7CisgICAgICAgIGlmICgoc2NhbGUgPiAwKSAmJiAocmVzdWx0ID49IChGSVhQX0RCTClNQVhWQUxfREJMID4+IHNjYWxlKSkgewogICAgICAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBhbHBoYXJbMV0gPSBGWF9EQkwyRlhfU0dMKHNjYWxlVmFsdWUocmVzdWx0LHNjYWxlKSk7Ci0gICAgICAgICAgaWYoKHRtcDxGTDJGWF9EQkwoMC4wZikpIF4gKGFjLmRldDxGTDJGWF9EQkwoMC4wZikpKSB7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYWxwaGFyWzFdID0gRlhfREJMMkZYX1NHTChzY2FsZVZhbHVlKHJlc3VsdCwgc2NhbGUpKTsKKyAgICAgICAgICBpZiAoKHRtcCA8IEZMMkZYX0RCTCgwLjBmKSkgXiAoYWMuZGV0IDwgRkwyRlhfREJMKDAuMGYpKSkgewogICAgICAgICAgICAgYWxwaGFyWzFdID0gLWFscGhhclsxXTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgaWYgKCF1c2VMUCkKLSAgICAgIHsKLSAgICAgICAgdG1wID0gICggZk11bHREaXYyKGFjLnIwMWksYWMucjEycikgPj4gKExQQ19TQ0FMRV9GQUNUT1ItMSkgKSArCi0gICAgICAgICAgICAgICAoIChmTXVsdERpdjIoYWMucjAxcixhYy5yMTJpKSAtIChGSVhQX0RCTClmTXVsdERpdjIoYWMucjAyaSxhYy5yMTFyKSkgPj4gKExQQ19TQ0FMRV9GQUNUT1ItMSkgKSA7CisgICAgICBpZiAoIXVzZUxQKSB7CisgICAgICAgIHRtcCA9IChmTXVsdERpdjIoYWMucjAxaSwgYWMucjEycikgPj4gKExQQ19TQ0FMRV9GQUNUT1IgLSAxKSkgKworICAgICAgICAgICAgICAoKGZNdWx0RGl2MihhYy5yMDFyLCBhYy5yMTJpKSAtCisgICAgICAgICAgICAgICAgKEZJWFBfREJMKWZNdWx0RGl2MihhYy5yMDJpLCBhYy5yMTFyKSkgPj4KKyAgICAgICAgICAgICAgIChMUENfU0NBTEVfRkFDVE9SIC0gMSkpOwogCiAgICAgICAgIGFic1RtcCA9IGZpeHBfYWJzKHRtcCk7CiAKQEAgLTQ0OSwxNCArNTIwLDE1IEBACiAgICAgICAgIHsKICAgICAgICAgICBJTlQgc2NhbGU7CiAgICAgICAgICAgRklYUF9EQkwgcmVzdWx0ID0gZkRpdk5vcm0oYWJzVG1wLCBhYnNEZXQsICZzY2FsZSk7Ci0gICAgICAgICAgc2NhbGUgPSBzY2FsZSthYy5kZXRfc2NhbGU7CisgICAgICAgICAgc2NhbGUgPSBzY2FsZSArIGFjLmRldF9zY2FsZTsKIAotICAgICAgICAgIGlmICggKHNjYWxlID4gMCkgJiYgKHJlc3VsdCA+PSAvKkZMMkZYQ09OU1RfREJMKDEuZikqLyAoRklYUF9EQkwpTUFYVkFMX0RCTD4+c2NhbGUpICkgeworICAgICAgICAgIGlmICgoc2NhbGUgPiAwKSAmJgorICAgICAgICAgICAgICAocmVzdWx0ID49IC8qRkwyRlhDT05TVF9EQkwoMS5mKSovIChGSVhQX0RCTClNQVhWQUxfREJMID4+CisgICAgICAgICAgICAgICBzY2FsZSkpIHsKICAgICAgICAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhbHBoYWlbMV0gPSBGWF9EQkwyRlhfU0dMKHNjYWxlVmFsdWUocmVzdWx0LHNjYWxlKSk7Ci0gICAgICAgICAgICBpZigodG1wPEZMMkZYX0RCTCgwLjBmKSkgXiAoYWMuZGV0PEZMMkZYX0RCTCgwLjBmKSkpIHsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWxwaGFpWzFdID0gRlhfREJMMkZYX1NHTChzY2FsZVZhbHVlKHJlc3VsdCwgc2NhbGUpKTsKKyAgICAgICAgICAgIGlmICgodG1wIDwgRkwyRlhfREJMKDAuMGYpKSBeIChhYy5kZXQgPCBGTDJGWF9EQkwoMC4wZikpKSB7CiAgICAgICAgICAgICAgIGFscGhhaVsxXSA9IC1hbHBoYWlbMV07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQpAQCAtNDY0LDI0ICs1MzYsMjMgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICBhbHBoYXJbMF0gPSAgRkwyRlhDT05TVF9TR0woMC4wZik7Ci0gICAgaWYgKCF1c2VMUCkKLSAgICAgIGFscGhhaVswXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworICAgIGFscGhhclswXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworICAgIGlmICghdXNlTFApIGFscGhhaVswXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwogCi0gICAgaWYgKCBhYy5yMTFyICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgewotCisgICAgaWYgKGFjLnIxMXIgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKICAgICAgIC8qIGFjLnIxMXIgaXMgYWx3YXlzID49MCAqLwotICAgICAgRklYUF9EQkwgdG1wLGFic1RtcDsKKyAgICAgIEZJWFBfREJMIHRtcCwgYWJzVG1wOwogCiAgICAgICBpZiAoIXVzZUxQKSB7Ci0gICAgICAgIHRtcCA9IChhYy5yMDFyPj4oTFBDX1NDQUxFX0ZBQ1RPUisxKSkgKwotICAgICAgICAgICAgICAoZk11bHREaXYyKGFscGhhclsxXSxhYy5yMTJyKSArIGZNdWx0RGl2MihhbHBoYWlbMV0sYWMucjEyaSkpOwotICAgICAgfSBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmKGFjLnIwMXI+PUZMMkZYQ09OU1RfREJMKDAuMGYpKQotICAgICAgICAgIHRtcCA9IChhYy5yMDFyPj4oTFBDX1NDQUxFX0ZBQ1RPUisxKSkgKyBmTXVsdERpdjIoYWxwaGFyWzFdLGFjLnIxMnIpOworICAgICAgICB0bXAgPSAoYWMucjAxciA+PiAoTFBDX1NDQUxFX0ZBQ1RPUiArIDEpKSArCisgICAgICAgICAgICAgIChmTXVsdERpdjIoYWxwaGFyWzFdLCBhYy5yMTJyKSArIGZNdWx0RGl2MihhbHBoYWlbMV0sIGFjLnIxMmkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhYy5yMDFyID49IEZMMkZYQ09OU1RfREJMKDAuMGYpKQorICAgICAgICAgIHRtcCA9IChhYy5yMDFyID4+IChMUENfU0NBTEVfRkFDVE9SICsgMSkpICsKKyAgICAgICAgICAgICAgICBmTXVsdERpdjIoYWxwaGFyWzFdLCBhYy5yMTJyKTsKICAgICAgICAgZWxzZQotICAgICAgICAgIHRtcCA9IC0oKC1hYy5yMDFyKT4+KExQQ19TQ0FMRV9GQUNUT1IrMSkpICsgZk11bHREaXYyKGFscGhhclsxXSxhYy5yMTJyKTsKKyAgICAgICAgICB0bXAgPSAtKCgtYWMucjAxcikgPj4gKExQQ19TQ0FMRV9GQUNUT1IgKyAxKSkgKworICAgICAgICAgICAgICAgIGZNdWx0RGl2MihhbHBoYXJbMV0sIGFjLnIxMnIpOwogICAgICAgfQogCiAgICAgICBhYnNUbXAgPSBmaXhwX2Ficyh0bXApOwpAQCAtNDkwLDExMSArNTYxLDEwOCBAQAogICAgICAgICBRdWljayBjaGVjazogaXMgZmlyc3QgZmlsdGVyIGNvZWZmID49IDEoNCkKICAgICAgICovCiAKLSAgICAgIGlmIChhYnNUbXAgPj0gKGFjLnIxMXI+PjEpKSB7Ci0gICAgICAgIHJlc2V0TFBDQ29lZmZzPTE7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKKyAgICAgIGlmIChhYnNUbXAgPj0gKGFjLnIxMXIgPj4gMSkpIHsKKyAgICAgICAgcmVzZXRMUENDb2VmZnMgPSAxOworICAgICAgfSBlbHNlIHsKICAgICAgICAgSU5UIHNjYWxlOwogICAgICAgICBGSVhQX0RCTCByZXN1bHQgPSBmRGl2Tm9ybShhYnNUbXAsIGZpeHBfYWJzKGFjLnIxMXIpLCAmc2NhbGUpOwotICAgICAgICBhbHBoYXJbMF0gPSAgRlhfREJMMkZYX1NHTChzY2FsZVZhbHVlKHJlc3VsdCxzY2FsZSsxKSk7CisgICAgICAgIGFscGhhclswXSA9IEZYX0RCTDJGWF9TR0woc2NhbGVWYWx1ZShyZXN1bHQsIHNjYWxlICsgMSkpOwogCi0gICAgICAgIGlmKCh0bXA+RkwyRlhfREJMKDAuMGYpKSBeIChhYy5yMTFyPEZMMkZYX0RCTCgwLjBmKSkpCisgICAgICAgIGlmICgodG1wID4gRkwyRlhfREJMKDAuMGYpKSBeIChhYy5yMTFyIDwgRkwyRlhfREJMKDAuMGYpKSkKICAgICAgICAgICBhbHBoYXJbMF0gPSAtYWxwaGFyWzBdOwogICAgICAgfQogCi0gICAgICBpZiAoIXVzZUxQKQotICAgICAgewotICAgICAgICB0bXAgPSAoYWMucjAxaT4+KExQQ19TQ0FMRV9GQUNUT1IrMSkpICsKLSAgICAgICAgICAgICAgKGZNdWx0RGl2MihhbHBoYWlbMV0sYWMucjEycikgLSBmTXVsdERpdjIoYWxwaGFyWzFdLGFjLnIxMmkpKTsKKyAgICAgIGlmICghdXNlTFApIHsKKyAgICAgICAgdG1wID0gKGFjLnIwMWkgPj4gKExQQ19TQ0FMRV9GQUNUT1IgKyAxKSkgKworICAgICAgICAgICAgICAoZk11bHREaXYyKGFscGhhaVsxXSwgYWMucjEycikgLSBmTXVsdERpdjIoYWxwaGFyWzFdLCBhYy5yMTJpKSk7CiAKICAgICAgICAgYWJzVG1wID0gZml4cF9hYnModG1wKTsKIAogICAgICAgICAvKgogICAgICAgICBRdWljayBjaGVjazogaXMgc2Vjb25kIGZpbHRlciBjb2VmZiA+PSAxKDQpCiAgICAgICAgICovCi0gICAgICAgIGlmIChhYnNUbXAgPj0gKGFjLnIxMXI+PjEpKSB7Ci0gICAgICAgICAgcmVzZXRMUENDb2VmZnM9MTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKGFic1RtcCA+PSAoYWMucjExciA+PiAxKSkgeworICAgICAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBJTlQgc2NhbGU7CiAgICAgICAgICAgRklYUF9EQkwgcmVzdWx0ID0gZkRpdk5vcm0oYWJzVG1wLCBmaXhwX2FicyhhYy5yMTFyKSwgJnNjYWxlKTsKLSAgICAgICAgICBhbHBoYWlbMF0gPSBGWF9EQkwyRlhfU0dMKHNjYWxlVmFsdWUocmVzdWx0LHNjYWxlKzEpKTsKLSAgICAgICAgICBpZigodG1wPkZMMkZYX0RCTCgwLjBmKSkgXiAoYWMucjExcjxGTDJGWF9EQkwoMC4wZikpKQorICAgICAgICAgIGFscGhhaVswXSA9IEZYX0RCTDJGWF9TR0woc2NhbGVWYWx1ZShyZXN1bHQsIHNjYWxlICsgMSkpOworICAgICAgICAgIGlmICgodG1wID4gRkwyRlhfREJMKDAuMGYpKSBeIChhYy5yMTFyIDwgRkwyRlhfREJMKDAuMGYpKSkKICAgICAgICAgICAgIGFscGhhaVswXSA9IC1hbHBoYWlbMF07CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKLQotICAgIGlmICghdXNlTFApCi0gICAgeworICAgIGlmICghdXNlTFApIHsKICAgICAgIC8qIE5vdyBjaGVjayB0aGUgcXVhZHJhdGljIGNyaXRlcmlhICovCi0gICAgICBpZiggKGZNdWx0RGl2MihhbHBoYXJbMF0sYWxwaGFyWzBdKSArIGZNdWx0RGl2MihhbHBoYWlbMF0sYWxwaGFpWzBdKSkgPj0gRkwyRlhDT05TVF9EQkwoMC41ZikgKQotICAgICAgICByZXNldExQQ0NvZWZmcz0xOwotICAgICAgaWYoIChmTXVsdERpdjIoYWxwaGFyWzFdLGFscGhhclsxXSkgKyBmTXVsdERpdjIoYWxwaGFpWzFdLGFscGhhaVsxXSkpID49IEZMMkZYQ09OU1RfREJMKDAuNWYpICkKLSAgICAgICAgcmVzZXRMUENDb2VmZnM9MTsKKyAgICAgIGlmICgoZk11bHREaXYyKGFscGhhclswXSwgYWxwaGFyWzBdKSArIGZNdWx0RGl2MihhbHBoYWlbMF0sIGFscGhhaVswXSkpID49CisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC41ZikpCisgICAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKKyAgICAgIGlmICgoZk11bHREaXYyKGFscGhhclsxXSwgYWxwaGFyWzFdKSArIGZNdWx0RGl2MihhbHBoYWlbMV0sIGFscGhhaVsxXSkpID49CisgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC41ZikpCisgICAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKICAgICB9CiAKLSAgICBpZihyZXNldExQQ0NvZWZmcyl7CisgICAgaWYgKHJlc2V0TFBDQ29lZmZzKSB7CiAgICAgICBhbHBoYXJbMF0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKICAgICAgIGFscGhhclsxXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwotICAgICAgaWYgKCF1c2VMUCkKLSAgICAgIHsKKyAgICAgIGlmICghdXNlTFApIHsKICAgICAgICAgYWxwaGFpWzBdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CiAgICAgICAgIGFscGhhaVsxXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwogICAgICAgfQogICAgIH0KIAotICAgIGlmICh1c2VMUCkKLSAgICB7Ci0KKyAgICBpZiAodXNlTFApIHsKICAgICAgIC8qIEFsaWFzaW5nIGRldGVjdGlvbiAqLwotICAgICAgaWYoYWMucjExcj09RkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgIGlmIChhYy5yMTFyID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CiAgICAgICAgIGsxID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaWYgKCBmaXhwX2FicyhhYy5yMDFyKSA+PSBmaXhwX2FicyhhYy5yMTFyKSApIHsKLSAgICAgICAgICBpZiAoIGZNdWx0RGl2MihhYy5yMDFyLGFjLnIxMXIpIDwgRkwyRlhfREJMKDAuMGYpKSB7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZml4cF9hYnMoYWMucjAxcikgPj0gZml4cF9hYnMoYWMucjExcikpIHsKKyAgICAgICAgICBpZiAoZk11bHREaXYyKGFjLnIwMXIsIGFjLnIxMXIpIDwgRkwyRlhfREJMKDAuMGYpKSB7CiAgICAgICAgICAgICBrMSA9IChGSVhQX0RCTClNQVhWQUxfREJMIC8qRkwyRlhDT05TVF9TR0woMS4wZikqLzsKLSAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAvKiBTaW5jZSB0aGlzIHZhbHVlIGlzIHNxdWFyZWQgbGF0ZXIsIGl0IG11c3Qgbm90IGV2ZXIgYmVjb21lIC0xLjBmLiAqLwotICAgICAgICAgICAgazEgPSAoRklYUF9EQkwpKE1JTlZBTF9EQkwrMSkgLypGTDJGWENPTlNUX1NHTCgtMS4wZikqLzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogU2luY2UgdGhpcyB2YWx1ZSBpcyBzcXVhcmVkIGxhdGVyLCBpdCBtdXN0IG5vdCBldmVyIGJlY29tZSAtMS4wZi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgazEgPSAoRklYUF9EQkwpKE1JTlZBTF9EQkwgKyAxKSAvKkZMMkZYQ09OU1RfU0dMKC0xLjBmKSovOwogICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBJTlQgc2NhbGU7Ci0gICAgICAgICAgRklYUF9EQkwgcmVzdWx0ID0gZkRpdk5vcm0oZml4cF9hYnMoYWMucjAxciksIGZpeHBfYWJzKGFjLnIxMXIpLCAmc2NhbGUpOwotICAgICAgICAgIGsxID0gc2NhbGVWYWx1ZShyZXN1bHQsc2NhbGUpOworICAgICAgICAgIEZJWFBfREJMIHJlc3VsdCA9CisgICAgICAgICAgICAgIGZEaXZOb3JtKGZpeHBfYWJzKGFjLnIwMXIpLCBmaXhwX2FicyhhYy5yMTFyKSwgJnNjYWxlKTsKKyAgICAgICAgICBrMSA9IHNjYWxlVmFsdWUocmVzdWx0LCBzY2FsZSk7CiAKLSAgICAgICAgICBpZighKChhYy5yMDFyPEZMMkZYX0RCTCgwLjBmKSkgXiAoYWMucjExcjxGTDJGWF9EQkwoMC4wZikpKSkgeworICAgICAgICAgIGlmICghKChhYy5yMDFyIDwgRkwyRlhfREJMKDAuMGYpKSBeIChhYy5yMTFyIDwgRkwyRlhfREJMKDAuMGYpKSkpIHsKICAgICAgICAgICAgIGsxID0gLWsxOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQotICAgICAgaWYobG9CYW5kID4gMSl7CisgICAgICBpZiAoKGxvQmFuZCA+IDEpICYmIChsb0JhbmQgPCB2X2tfbWFzdGVyMCkpIHsKICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGdhaW4gc2hvdWxkIGJlIGxvY2tlZCAqLwotICAgICAgICBGSVhQX0RCTCBkZWcgPSAvKkZMMkZYQ09OU1RfREJMKDEuMGYpKi8gKEZJWFBfREJMKU1BWFZBTF9EQkwgLSBmUG93MihrMV9iZWxvdyk7CisgICAgICAgIEZJWFBfREJMIGRlZyA9CisgICAgICAgICAgICAvKkZMMkZYQ09OU1RfREJMKDEuMGYpKi8gKEZJWFBfREJMKU1BWFZBTF9EQkwgLSBmUG93MihrMV9iZWxvdyk7CiAgICAgICAgIGRlZ3JlZUFsaWFzW2xvQmFuZF0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgICAgaWYgKCgobG9CYW5kICYgMSkgPT0gMCkgJiYgKGsxIDwgRkwyRlhDT05TVF9EQkwoMC4wZikpKXsKLSAgICAgICAgICBpZiAoazFfYmVsb3cgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeyAgICAgICAgIC8qIDItQ2ggQWxpYXNpbmcgRGV0ZWN0aW9uICovCisgICAgICAgIGlmICgoKGxvQmFuZCAmIDEpID09IDApICYmIChrMSA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSkgeworICAgICAgICAgIGlmIChrMV9iZWxvdyA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7IC8qIDItQ2ggQWxpYXNpbmcgRGV0ZWN0aW9uICovCiAgICAgICAgICAgICBkZWdyZWVBbGlhc1tsb0JhbmRdID0gKEZJWFBfREJMKU1BWFZBTF9EQkwgLypGTDJGWENPTlNUX0RCTCgxLjBmKSovOwotICAgICAgICAgICAgaWYgKCBrMV9iZWxvdzIgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsgICAgLyogMy1DaCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KLSAgICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kLTFdID0gZGVnOworICAgICAgICAgICAgaWYgKGsxX2JlbG93MiA+CisgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsgLyogMy1DaCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KKyAgICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kIC0gMV0gPSBkZWc7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKCBrMV9iZWxvdzIgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsgLyogMy1DaCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KLSAgICAgICAgICAgIGRlZ3JlZUFsaWFzW2xvQmFuZF0gICA9IGRlZzsKKyAgICAgICAgICB9IGVsc2UgaWYgKGsxX2JlbG93MiA+CisgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeyAvKiAzLUNoIEFsaWFzaW5nIERldGVjdGlvbiAqLworICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kXSA9IGRlZzsKICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCgobG9CYW5kICYgMSkgPT0gMSkgJiYgKGsxID4gRkwyRlhDT05TVF9EQkwoMC4wZikpKXsKLSAgICAgICAgICBpZiAoazFfYmVsb3cgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeyAgICAgICAgIC8qIDItQ0ggQWxpYXNpbmcgRGV0ZWN0aW9uICovCisgICAgICAgIGlmICgoKGxvQmFuZCAmIDEpID09IDEpICYmIChrMSA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSkgeworICAgICAgICAgIGlmIChrMV9iZWxvdyA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7IC8qIDItQ0ggQWxpYXNpbmcgRGV0ZWN0aW9uICovCiAgICAgICAgICAgICBkZWdyZWVBbGlhc1tsb0JhbmRdID0gKEZJWFBfREJMKU1BWFZBTF9EQkwgLypGTDJGWENPTlNUX0RCTCgxLjBmKSovOwotICAgICAgICAgICAgaWYgKCBrMV9iZWxvdzIgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsgICAgLyogMy1DSCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KLSAgICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kLTFdID0gZGVnOworICAgICAgICAgICAgaWYgKGsxX2JlbG93MiA8CisgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsgLyogMy1DSCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KKyAgICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kIC0gMV0gPSBkZWc7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKCBrMV9iZWxvdzIgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsgLyogMy1DSCBBbGlhc2luZyBEZXRlY3Rpb24gKi8KLSAgICAgICAgICAgIGRlZ3JlZUFsaWFzW2xvQmFuZF0gICA9IGRlZzsKKyAgICAgICAgICB9IGVsc2UgaWYgKGsxX2JlbG93MiA8CisgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeyAvKiAzLUNIIEFsaWFzaW5nIERldGVjdGlvbiAqLworICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kXSA9IGRlZzsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTYwNSwyNSArNjczLDI3IEBACiAKICAgICBwYXRjaCA9IDA7CiAKLSAgICB3aGlsZSAoIHBhdGNoIDwgcFNldHRpbmdzLT5ub09mUGF0Y2hlcyApIHsgLyogaW5uZXIgbG9vcCBvdmVyIGV2ZXJ5IHBhdGNoICovCisgICAgd2hpbGUgKHBhdGNoIDwgcFNldHRpbmdzLT5ub09mUGF0Y2hlcykgeyAvKiBpbm5lciBsb29wIG92ZXIgZXZlcnkgcGF0Y2ggKi8KIAogICAgICAgaW50IGhpQmFuZCA9IGxvQmFuZCArIHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldEJhbmRPZmZzOwogCi0gICAgICBpZiAoIGxvQmFuZCA8IHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0YXJ0QmFuZAotICAgICAgICAgICB8fCBsb0JhbmQgPj0gcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RvcEJhbmQKLSAgICAgICAgICAgLy98fCBoaUJhbmQgPj0gaExwcFRyYW5zLT5wU2V0dGluZ3MtPm5vQ2hhbm5lbHMKLSAgICAgICAgICAgKSB7CisgICAgICBpZiAobG9CYW5kIDwgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RhcnRCYW5kIHx8CisgICAgICAgICAgbG9CYW5kID49IHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0b3BCYW5kCisgICAgICAgICAgLy98fCBoaUJhbmQgPj0gaExwcFRyYW5zLT5wU2V0dGluZ3MtPm5vQ2hhbm5lbHMKKyAgICAgICkgewogICAgICAgICAvKiBMb3diYW5kIG5vdCBpbiBjdXJyZW50IHBhdGNoIC0gcHJvY2VlZCAqLwogICAgICAgICBwYXRjaCsrOwogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KIAotICAgICAgRkRLX0FTU0VSVCggaGlCYW5kIDwgKDY0KSApOworICAgICAgRkRLX0FTU0VSVChoaUJhbmQgPCAoNjQpKTsKIAotICAgICAgLyogYndJbmRleFtwYXRjaF0gaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIHZhbHVlIGZyb20gcHJldmlvdXMgYmFuZCBpbnNpZGUgdGhpcyBwYXRjaCAqLwotICAgICAgd2hpbGUgKGhpQmFuZCA+PSBwU2V0dGluZ3MtPmJ3Qm9yZGVyc1tid0luZGV4W3BhdGNoXV0pCisgICAgICAvKiBid0luZGV4W3BhdGNoXSBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggdmFsdWUgZnJvbSBwcmV2aW91cyBiYW5kCisgICAgICAgKiBpbnNpZGUgdGhpcyBwYXRjaCAqLworICAgICAgd2hpbGUgKGhpQmFuZCA+PSBwU2V0dGluZ3MtPmJ3Qm9yZGVyc1tid0luZGV4W3BhdGNoXV0gJiYKKyAgICAgICAgICAgICBid0luZGV4W3BhdGNoXSA8IE1BWF9OVU1fUEFUQ0hFUyAtIDEpIHsKICAgICAgICAgYndJbmRleFtwYXRjaF0rKzsKLQorICAgICAgfQogCiAgICAgICAvKgogICAgICAgICBGaWx0ZXIgU3RlcCAyOiBhZGQgdGhlIGxlZnQgc2xvcGUgd2l0aCB0aGUgY3VycmVudCBmaWx0ZXIgdG8gdGhlIGJ1ZmZlcgpAQCAtNjMxLDEyMSArNzAxLDQ5OCBAQAogICAgICAgKi8KICAgICAgIGJ3ID0gRlhfREJMMkZYX1NHTChid1ZlY3Rvcltid0luZGV4W3BhdGNoXV0pOwogCi0gICAgICBhMHIgPSBGWF9EQkwyRlhfU0dMKGZNdWx0KGJ3LGFscGhhclswXSkpOyAvKiBBcHBseSBjdXJyZW50IGJhbmR3aWR0aCBleHBhbnNpb24gZmFjdG9yICovCisgICAgICBhMHIgPSBGWF9EQkwyRlhfU0dMKAorICAgICAgICAgIGZNdWx0KGJ3LCBhbHBoYXJbMF0pKTsgLyogQXBwbHkgY3VycmVudCBiYW5kd2lkdGggZXhwYW5zaW9uIGZhY3RvciAqLwogCi0KLSAgICAgIGlmICghdXNlTFApCi0gICAgICAgIGEwaSA9IEZYX0RCTDJGWF9TR0woZk11bHQoYncsYWxwaGFpWzBdKSk7Ci0gICAgICBidyA9ICBGWF9EQkwyRlhfU0dMKGZQb3cyKGJ3KSk7Ci0gICAgICBhMXIgPSBGWF9EQkwyRlhfU0dMKGZNdWx0KGJ3LGFscGhhclsxXSkpOwotICAgICAgaWYgKCF1c2VMUCkKLSAgICAgICAgYTFpID0gRlhfREJMMkZYX1NHTChmTXVsdChidyxhbHBoYWlbMV0pKTsKLQotCisgICAgICBpZiAoIXVzZUxQKSBhMGkgPSBGWF9EQkwyRlhfU0dMKGZNdWx0KGJ3LCBhbHBoYWlbMF0pKTsKKyAgICAgIGJ3ID0gRlhfREJMMkZYX1NHTChmUG93MihidykpOworICAgICAgYTFyID0gRlhfREJMMkZYX1NHTChmTXVsdChidywgYWxwaGFyWzFdKSk7CisgICAgICBpZiAoIXVzZUxQKSBhMWkgPSBGWF9EQkwyRlhfU0dMKGZNdWx0KGJ3LCBhbHBoYWlbMV0pKTsKIAogICAgICAgLyoKICAgICAgICAgRmlsdGVyIFN0ZXAgMzogaW5zZXJ0IHRoZSBtaWRkbGUgcGFydCB3aGljaCB3b24ndCBiZSB3aW5kb3dlZAogICAgICAgKi8KLQotICAgICAgaWYgKCBidyA8PSBGTDJGWENPTlNUX1NHTCgwLjBmKSApIHsKKyAgICAgIGlmIChidyA8PSBGTDJGWENPTlNUX1NHTCgwLjBmKSkgewogICAgICAgICBpZiAoIXVzZUxQKSB7Ci0gICAgICAgICAgaW50IGRlc2NhbGUgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSwgKExQQ19TQ0FMRV9GQUNUT1IrZHluYW1pY1NjYWxlKSk7Ci0gICAgICAgICAgZm9yKGkgPSBzdGFydFNhbXBsZTsgaSA8IHN0b3BTYW1wbGU7IGkrKyApIHsKLSAgICAgICAgICAgIHFtZkJ1ZmZlclJlYWxbaV1baGlCYW5kXSA9IGxvd0JhbmRSZWFsW0xQQ19PUkRFUitpXT4+ZGVzY2FsZTsKLSAgICAgICAgICAgIHFtZkJ1ZmZlckltYWdbaV1baGlCYW5kXSA9IGxvd0JhbmRJbWFnW0xQQ19PUkRFUitpXT4+ZGVzY2FsZTsKKyAgICAgICAgICBpbnQgZGVzY2FsZSA9CisgICAgICAgICAgICAgIGZpeE1pbihERlJBQ1RfQklUUyAtIDEsIChMUENfU0NBTEVfRkFDVE9SICsgZHluYW1pY1NjYWxlKSk7CisgICAgICAgICAgZm9yIChpID0gc3RhcnRTYW1wbGU7IGkgPCBzdG9wU2FtcGxlOyBpKyspIHsKKyAgICAgICAgICAgIEZJWFBfREJMIGFjY3UxLCBhY2N1MjsKKyAgICAgICAgICAgIGFjY3UxID0gbG93QmFuZFJlYWxbTFBDX09SREVSICsgaV0gPj4gZGVzY2FsZTsKKyAgICAgICAgICAgIGFjY3UyID0gbG93QmFuZEltYWdbTFBDX09SREVSICsgaV0gPj4gZGVzY2FsZTsKKyAgICAgICAgICAgIGlmIChmUHJlV2hpdGVuaW5nKSB7CisgICAgICAgICAgICAgIGFjY3UxID0gc2NhbGVWYWx1ZVNhdHVyYXRlKAorICAgICAgICAgICAgICAgICAgZk11bHREaXYyKGFjY3UxLCBwcmVXaGl0ZW5pbmdHYWluc1tsb0JhbmRdKSwKKyAgICAgICAgICAgICAgICAgIHByZVdoaXRlbmluZ0dhaW5zX2V4cFtsb0JhbmRdICsgMSk7CisgICAgICAgICAgICAgIGFjY3UyID0gc2NhbGVWYWx1ZVNhdHVyYXRlKAorICAgICAgICAgICAgICAgICAgZk11bHREaXYyKGFjY3UyLCBwcmVXaGl0ZW5pbmdHYWluc1tsb0JhbmRdKSwKKyAgICAgICAgICAgICAgICAgIHByZVdoaXRlbmluZ0dhaW5zX2V4cFtsb0JhbmRdICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBxbWZCdWZmZXJSZWFsW2ldW2hpQmFuZF0gPSBhY2N1MTsKKyAgICAgICAgICAgIHFtZkJ1ZmZlckltYWdbaV1baGlCYW5kXSA9IGFjY3UyOwogICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgZGVzY2FsZSA9IGZpeE1pbihERlJBQ1RfQklUUy0xLCAoTFBDX1NDQUxFX0ZBQ1RPUitkeW5hbWljU2NhbGUpKTsKLSAgICAgICAgICBmb3IoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZTsgaSsrICkgewotICAgICAgICAgICAgcW1mQnVmZmVyUmVhbFtpXVtoaUJhbmRdID0gbG93QmFuZFJlYWxbTFBDX09SREVSK2ldPj5kZXNjYWxlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGludCBkZXNjYWxlID0KKyAgICAgICAgICAgICAgZml4TWluKERGUkFDVF9CSVRTIC0gMSwgKExQQ19TQ0FMRV9GQUNUT1IgKyBkeW5hbWljU2NhbGUpKTsKKyAgICAgICAgICBmb3IgKGkgPSBzdGFydFNhbXBsZTsgaSA8IHN0b3BTYW1wbGU7IGkrKykgeworICAgICAgICAgICAgcW1mQnVmZmVyUmVhbFtpXVtoaUJhbmRdID0gbG93QmFuZFJlYWxbTFBDX09SREVSICsgaV0gPj4gZGVzY2FsZTsKICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgeyAgLyogYncgPD0gMCAqLworICAgICAgfSBlbHNlIHsgLyogYncgPD0gMCAqLwogCiAgICAgICAgIGlmICghdXNlTFApIHsKLSAgICAgICAgICBpbnQgZGVzY2FsZSA9IGZpeE1pbihERlJBQ1RfQklUUy0xLCAoTFBDX1NDQUxFX0ZBQ1RPUitkeW5hbWljU2NhbGUpKTsKKyAgICAgICAgICBpbnQgZGVzY2FsZSA9CisgICAgICAgICAgICAgIGZpeE1pbihERlJBQ1RfQklUUyAtIDEsIChMUENfU0NBTEVfRkFDVE9SICsgZHluYW1pY1NjYWxlKSk7CiAjaWZkZWYgRlVOQ1RJT05fTFBQVFJBTlNQT1NFUl9mdW5jMQotICAgICAgICAgIGxwcFRyYW5zcG9zZXJfZnVuYzEobG93QmFuZFJlYWwrTFBDX09SREVSK3N0YXJ0U2FtcGxlLGxvd0JhbmRJbWFnK0xQQ19PUkRFUitzdGFydFNhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFtZkJ1ZmZlclJlYWwrc3RhcnRTYW1wbGUscW1mQnVmZmVySW1hZytzdGFydFNhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BTYW1wbGUtc3RhcnRTYW1wbGUsIChpbnQpIGhpQmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNTY2FsZSxkZXNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTByLCBhMGksIGExciwgYTFpKTsKKyAgICAgICAgICBscHBUcmFuc3Bvc2VyX2Z1bmMxKAorICAgICAgICAgICAgICBsb3dCYW5kUmVhbCArIExQQ19PUkRFUiArIHN0YXJ0U2FtcGxlLAorICAgICAgICAgICAgICBsb3dCYW5kSW1hZyArIExQQ19PUkRFUiArIHN0YXJ0U2FtcGxlLAorICAgICAgICAgICAgICBxbWZCdWZmZXJSZWFsICsgc3RhcnRTYW1wbGUsIHFtZkJ1ZmZlckltYWcgKyBzdGFydFNhbXBsZSwKKyAgICAgICAgICAgICAgc3RvcFNhbXBsZSAtIHN0YXJ0U2FtcGxlLCAoaW50KWhpQmFuZCwgZHluYW1pY1NjYWxlLCBkZXNjYWxlLCBhMHIsCisgICAgICAgICAgICAgIGEwaSwgYTFyLCBhMWksIGZQcmVXaGl0ZW5pbmcsIHByZVdoaXRlbmluZ0dhaW5zW2xvQmFuZF0sCisgICAgICAgICAgICAgIHByZVdoaXRlbmluZ0dhaW5zX2V4cFtsb0JhbmRdICsgMSk7CiAjZWxzZQotICAgICAgICAgIGZvcihpID0gc3RhcnRTYW1wbGU7IGkgPCBzdG9wU2FtcGxlOyBpKysgKSB7CisgICAgICAgICAgZm9yIChpID0gc3RhcnRTYW1wbGU7IGkgPCBzdG9wU2FtcGxlOyBpKyspIHsKICAgICAgICAgICAgIEZJWFBfREJMIGFjY3UxLCBhY2N1MjsKIAotICAgICAgICAgICAgYWNjdTEgPSAoZk11bHREaXYyKGEwcixsb3dCYW5kUmVhbFtMUENfT1JERVIraS0xXSkgLSBmTXVsdERpdjIoYTBpLGxvd0JhbmRJbWFnW0xQQ19PUkRFUitpLTFdKSArCi0gICAgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoYTFyLGxvd0JhbmRSZWFsW0xQQ19PUkRFUitpLTJdKSAtIGZNdWx0RGl2MihhMWksbG93QmFuZEltYWdbTFBDX09SREVSK2ktMl0pKT4+ZHluYW1pY1NjYWxlOwotICAgICAgICAgICAgYWNjdTIgPSAoZk11bHREaXYyKGEwaSxsb3dCYW5kUmVhbFtMUENfT1JERVIraS0xXSkgKyBmTXVsdERpdjIoYTByLGxvd0JhbmRJbWFnW0xQQ19PUkRFUitpLTFdKSArCi0gICAgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoYTFpLGxvd0JhbmRSZWFsW0xQQ19PUkRFUitpLTJdKSArIGZNdWx0RGl2MihhMXIsbG93QmFuZEltYWdbTFBDX09SREVSK2ktMl0pKT4+ZHluYW1pY1NjYWxlOworICAgICAgICAgICAgYWNjdTEgPSAoZk11bHREaXYyKGEwciwgbG93QmFuZFJlYWxbTFBDX09SREVSICsgaSAtIDFdKSAtCisgICAgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoYTBpLCBsb3dCYW5kSW1hZ1tMUENfT1JERVIgKyBpIC0gMV0pICsKKyAgICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihhMXIsIGxvd0JhbmRSZWFsW0xQQ19PUkRFUiArIGkgLSAyXSkgLQorICAgICAgICAgICAgICAgICAgICAgZk11bHREaXYyKGExaSwgbG93QmFuZEltYWdbTFBDX09SREVSICsgaSAtIDJdKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgZHluYW1pY1NjYWxlOworICAgICAgICAgICAgYWNjdTIgPSAoZk11bHREaXYyKGEwaSwgbG93QmFuZFJlYWxbTFBDX09SREVSICsgaSAtIDFdKSArCisgICAgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoYTByLCBsb3dCYW5kSW1hZ1tMUENfT1JERVIgKyBpIC0gMV0pICsKKyAgICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihhMWksIGxvd0JhbmRSZWFsW0xQQ19PUkRFUiArIGkgLSAyXSkgKworICAgICAgICAgICAgICAgICAgICAgZk11bHREaXYyKGExciwgbG93QmFuZEltYWdbTFBDX09SREVSICsgaSAtIDJdKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgZHluYW1pY1NjYWxlOwogCi0gICAgICAgICAgICBxbWZCdWZmZXJSZWFsW2ldW2hpQmFuZF0gPSAobG93QmFuZFJlYWxbTFBDX09SREVSK2ldPj5kZXNjYWxlKSArIChhY2N1MTw8MSk7Ci0gICAgICAgICAgICBxbWZCdWZmZXJJbWFnW2ldW2hpQmFuZF0gPSAobG93QmFuZEltYWdbTFBDX09SREVSK2ldPj5kZXNjYWxlKSArIChhY2N1Mjw8MSk7CisgICAgICAgICAgICBhY2N1MSA9IChsb3dCYW5kUmVhbFtMUENfT1JERVIgKyBpXSA+PiBkZXNjYWxlKSArIChhY2N1MSA8PCAxKTsKKyAgICAgICAgICAgIGFjY3UyID0gKGxvd0JhbmRJbWFnW0xQQ19PUkRFUiArIGldID4+IGRlc2NhbGUpICsgKGFjY3UyIDw8IDEpOworICAgICAgICAgICAgaWYgKGZQcmVXaGl0ZW5pbmcpIHsKKyAgICAgICAgICAgICAgYWNjdTEgPSBzY2FsZVZhbHVlU2F0dXJhdGUoCisgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoYWNjdTEsIHByZVdoaXRlbmluZ0dhaW5zW2xvQmFuZF0pLAorICAgICAgICAgICAgICAgICAgcHJlV2hpdGVuaW5nR2FpbnNfZXhwW2xvQmFuZF0gKyAxKTsKKyAgICAgICAgICAgICAgYWNjdTIgPSBzY2FsZVZhbHVlU2F0dXJhdGUoCisgICAgICAgICAgICAgICAgICBmTXVsdERpdjIoYWNjdTIsIHByZVdoaXRlbmluZ0dhaW5zW2xvQmFuZF0pLAorICAgICAgICAgICAgICAgICAgcHJlV2hpdGVuaW5nR2FpbnNfZXhwW2xvQmFuZF0gKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHFtZkJ1ZmZlclJlYWxbaV1baGlCYW5kXSA9IGFjY3UxOworICAgICAgICAgICAgcW1mQnVmZmVySW1hZ1tpXVtoaUJhbmRdID0gYWNjdTI7CiAgICAgICAgICAgfQogI2VuZGlmCi0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaW50IGRlc2NhbGUgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSwgKExQQ19TQ0FMRV9GQUNUT1IrZHluYW1pY1NjYWxlKSk7Ci0KKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBGREtfQVNTRVJUKGR5bmFtaWNTY2FsZSA+PSAwKTsKLSAgICAgICAgICBmb3IoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZTsgaSsrICkgewotICAgICAgICAgICAgRklYUF9EQkwgYWNjdTE7Ci0KLSAgICAgICAgICAgIGFjY3UxID0gKGZNdWx0RGl2MihhMHIsbG93QmFuZFJlYWxbTFBDX09SREVSK2ktMV0pICsgZk11bHREaXYyKGExcixsb3dCYW5kUmVhbFtMUENfT1JERVIraS0yXSkpPj5keW5hbWljU2NhbGU7Ci0KLSAgICAgICAgICAgIHFtZkJ1ZmZlclJlYWxbaV1baGlCYW5kXSA9IChsb3dCYW5kUmVhbFtMUENfT1JERVIraV0+PmRlc2NhbGUpICsgKGFjY3UxPDwxKTsKLSAgICAgICAgICB9CisgICAgICAgICAgY2FsY19xbWZCdWZmZXJSZWFsKAorICAgICAgICAgICAgICBxbWZCdWZmZXJSZWFsLCAmKGxvd0JhbmRSZWFsW0xQQ19PUkRFUiArIHN0YXJ0U2FtcGxlIC0gMl0pLAorICAgICAgICAgICAgICBzdGFydFNhbXBsZSwgc3RvcFNhbXBsZSwgaGlCYW5kLCBkeW5hbWljU2NhbGUsCisgICAgICAgICAgICAgIGZNaW4oREZSQUNUX0JJVFMgLSAxLCAoTFBDX1NDQUxFX0ZBQ1RPUiArIGR5bmFtaWNTY2FsZSkpLCBhMHIsCisgICAgICAgICAgICAgIGExcik7CiAgICAgICAgIH0KICAgICAgIH0gLyogYncgPD0gMCAqLwogCiAgICAgICBwYXRjaCsrOwogCi0gICAgfSAgLyogaW5uZXIgbG9vcCBvdmVyIHBhdGNoZXMgKi8KKyAgICB9IC8qIGlubmVyIGxvb3Agb3ZlciBwYXRjaGVzICovCiAKLSAgICAgLyoKKyAgICAvKgogICAgICAqIHN0b3JlIHRoZSB1bm1vZGlmaWVkIGZpbHRlciBjb2VmZmljaWVudHMgaWYgdGhlcmUgaXMKICAgICAgKiBhbiBvdmVybGFwcGluZyBlbnZlbG9wZQogICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorICB9IC8qIG91dGVyIGxvb3Agb3ZlciBiYW5kcyAobG9CYW5kKSAqLwogCi0gIH0gIC8qIG91dGVyIGxvb3Agb3ZlciBiYW5kcyAobG9CYW5kKSAqLwotCi0gIGlmICh1c2VMUCkKLSAgewotICAgIGZvciAoIGxvQmFuZCA9IHBTZXR0aW5ncy0+bGJTdGFydFBhdGNoaW5nOyBsb0JhbmQgPCAgcFNldHRpbmdzLT5sYlN0b3BQYXRjaGluZzsgbG9CYW5kKysgKSB7CisgIGlmICh1c2VMUCkgeworICAgIGZvciAobG9CYW5kID0gcFNldHRpbmdzLT5sYlN0YXJ0UGF0Y2hpbmc7CisgICAgICAgICBsb0JhbmQgPCBwU2V0dGluZ3MtPmxiU3RvcFBhdGNoaW5nOyBsb0JhbmQrKykgewogICAgICAgcGF0Y2ggPSAwOwotICAgICAgd2hpbGUgKCBwYXRjaCA8IHBTZXR0aW5ncy0+bm9PZlBhdGNoZXMgKSB7Ci0KKyAgICAgIHdoaWxlIChwYXRjaCA8IHBTZXR0aW5ncy0+bm9PZlBhdGNoZXMpIHsKICAgICAgICAgVUNIQVIgaGlCYW5kID0gbG9CYW5kICsgcGF0Y2hQYXJhbVtwYXRjaF0udGFyZ2V0QmFuZE9mZnM7CiAKLSAgICAgICAgaWYgKCBsb0JhbmQgPCBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdGFydEJhbmQKLSAgICAgICAgICB8fCBsb0JhbmQgPj0gcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RvcEJhbmQKLSAgICAgICAgICB8fCBoaUJhbmQgPj0gKDY0KSAgICAgICAgICAgICAgLyogSGlnaGJhbmQgb3V0IG9mIHJhbmdlIChiaXRlcnJvcikgKi8KLSAgICAgICAgICApIHsKLSAgICAgICAgICAvKiBMb3diYW5kIG5vdCBpbiBjdXJyZW50IHBhdGNoIG9yIGhpZ2hiYW5kIG91dCBvZiByYW5nZSAobWlnaHQgYmUgY2F1c2VkIGJ5IGJpdGVycm9ycyktIHByb2NlZWQgKi8KKyAgICAgICAgaWYgKGxvQmFuZCA8IHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0YXJ0QmFuZCB8fAorICAgICAgICAgICAgbG9CYW5kID49IHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0b3BCYW5kIHx8CisgICAgICAgICAgICBoaUJhbmQgPj0gKDY0KSAvKiBIaWdoYmFuZCBvdXQgb2YgcmFuZ2UgKGJpdGVycm9yKSAqLworICAgICAgICApIHsKKyAgICAgICAgICAvKiBMb3diYW5kIG5vdCBpbiBjdXJyZW50IHBhdGNoIG9yIGhpZ2hiYW5kIG91dCBvZiByYW5nZSAobWlnaHQgYmUKKyAgICAgICAgICAgKiBjYXVzZWQgYnkgYml0ZXJyb3JzKS0gcHJvY2VlZCAqLwogICAgICAgICAgIHBhdGNoKys7CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBpZihoaUJhbmQgIT0gcGF0Y2hQYXJhbVtwYXRjaF0udGFyZ2V0U3RhcnRCYW5kKQorICAgICAgICBpZiAoaGlCYW5kICE9IHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldFN0YXJ0QmFuZCkKICAgICAgICAgICBkZWdyZWVBbGlhc1toaUJhbmRdID0gZGVncmVlQWxpYXNbbG9CYW5kXTsKIAogICAgICAgICBwYXRjaCsrOwogICAgICAgfQotICAgIH0vKiBlbmQgIGZvciBsb29wICovCisgICAgfSAvKiBlbmQgIGZvciBsb29wICovCiAgIH0KIAotIGZvciAoaSA9IDA7IGkgPCBuSW52ZkJhbmRzOyBpKysgKSB7Ci0gICBoTHBwVHJhbnMtPmJ3VmVjdG9yT2xkW2ldID0gYndWZWN0b3JbaV07Ci0gfQorICBmb3IgKGkgPSAwOyBpIDwgbkludmZCYW5kczsgaSsrKSB7CisgICAgaExwcFRyYW5zLT5id1ZlY3Rvck9sZFtpXSA9IGJ3VmVjdG9yW2ldOworICB9CiAKICAgLyoKICAgICBzZXQgaGlnaCBiYW5kIHNjYWxlIGZhY3RvcgogICAqLwotICBzYnJTY2FsZUZhY3Rvci0+aGJfc2NhbGUgPSBjb21Mb3dCYW5kU2NhbGUtKExQQ19TQ0FMRV9GQUNUT1IpOworICBzYnJTY2FsZUZhY3Rvci0+aGJfc2NhbGUgPSBjb21Mb3dCYW5kU2NhbGUgLSAoTFBDX1NDQUxFX0ZBQ1RPUik7Cit9CiAKK3ZvaWQgbHBwVHJhbnNwb3NlckhCRSgKKyAgICBIQU5ETEVfU0JSX0xQUF9UUkFOUyBoTHBwVHJhbnMsIC8qITwgSGFuZGxlIG9mIGxwcCB0cmFuc3Bvc2VyICAqLworICAgIEhBTkRMRV9IQkVfVFJBTlNQT1NFUiBoUW1mVHJhbnNwb3NlciwKKyAgICBRTUZfU0NBTEVfRkFDVE9SICpzYnJTY2FsZUZhY3RvciwgLyohPCBTY2FsaW5nIGZhY3RvcnMgKi8KKyAgICBGSVhQX0RCTCAqKnFtZkJ1ZmZlclJlYWwsIC8qITwgUG9pbnRlciB0byBwb2ludGVyIHRvIHJlYWwgcGFydCBvZiBzdWJiYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzIChzb3VyY2UpICovCisgICAgRklYUF9EQkwgKipxbWZCdWZmZXJJbWFnLCAvKiE8IFBvaW50ZXIgdG8gcG9pbnRlciB0byBpbWFnaW5hcnkgcGFydCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViYmFuZCBzYW1wbGVzIChzb3VyY2UpICovCisgICAgY29uc3QgaW50IHRpbWVTdGVwLCAgICAgICAvKiE8IFRpbWUgc3RlcCBvZiBlbnZlbG9wZSAqLworICAgIGNvbnN0IGludCBmaXJzdFNsb3RPZmZzLCAgLyohPCBTdGFydCBwb3NpdGlvbiBpbiB0aW1lICovCisgICAgY29uc3QgaW50IGxhc3RTbG90T2ZmcywgICAvKiE8IE51bWJlciBvZiBvdmVybGFwLXNsb3RzIGludG8gbmV4dCBmcmFtZSAqLworICAgIGNvbnN0IGludCBuSW52ZkJhbmRzLCAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgZm9yIGludmVyc2UgZmlsdGVyaW5nICovCisgICAgSU5WRl9NT0RFICpzYnJfaW52Zl9tb2RlLCAvKiE8IEN1cnJlbnQgaW52ZXJzZSBmaWx0ZXJpbmcgbW9kZXMgKi8KKyAgICBJTlZGX01PREUgKnNicl9pbnZmX21vZGVfcHJldiAvKiE8IFByZXZpb3VzIGludmVyc2UgZmlsdGVyaW5nIG1vZGVzICovCispIHsKKyAgSU5UIGJ3SW5kZXg7CisgIEZJWFBfREJMIGJ3VmVjdG9yW01BWF9OVU1fUEFUQ0hFU19IQkVdOyAvKiE8IHBvbGUgbW92aW5nIGZhY3RvcnMgKi8KKworICBpbnQgaTsKKyAgaW50IGxvQmFuZCwgc3RhcnQsIHN0b3A7CisgIFRSQU5TUE9TRVJfU0VUVElOR1MgKnBTZXR0aW5ncyA9IGhMcHBUcmFucy0+cFNldHRpbmdzOworICBQQVRDSF9QQVJBTSAqcGF0Y2hQYXJhbSA9IHBTZXR0aW5ncy0+cGF0Y2hQYXJhbTsKKworICBGSVhQX1NHTCBhbHBoYXJbTFBDX09SREVSXSwgYTByLCBhMXI7CisgIEZJWFBfU0dMIGFscGhhaVtMUENfT1JERVJdLCBhMGkgPSAwLCBhMWkgPSAwOworICBGSVhQX1NHTCBidyA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworCisgIGludCBhdXRvQ29yckxlbmd0aDsKKworICBBQ09SUl9DT0VGUyBhYzsKKyAgaW50IHN0YXJ0U2FtcGxlOworICBpbnQgc3RvcFNhbXBsZTsKKyAgaW50IHN0b3BTYW1wbGVDbGVhcjsKKworICBpbnQgY29tQmFuZFNjYWxlOworICBpbnQgb3ZMb3dCYW5kU2hpZnQ7CisgIGludCBsb3dCYW5kU2hpZnQ7CisgIC8qICBpbnQgb3ZIaWdoQmFuZFNoaWZ0OyovCisgIGludCB0YXJnZXRTdG9wQmFuZDsKKworICBhbHBoYWlbMF0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKKyAgYWxwaGFpWzFdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CisKKyAgc3RhcnRTYW1wbGUgPSBmaXJzdFNsb3RPZmZzICogdGltZVN0ZXA7CisgIHN0b3BTYW1wbGUgPSBwU2V0dGluZ3MtPm5Db2xzICsgbGFzdFNsb3RPZmZzICogdGltZVN0ZXA7CisKKyAgaW52ZXJzZUZpbHRlcmluZ0xldmVsRW1waGFzaXMoaExwcFRyYW5zLCBuSW52ZkJhbmRzLCBzYnJfaW52Zl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJfaW52Zl9tb2RlX3ByZXYsIGJ3VmVjdG9yKTsKKworICBzdG9wU2FtcGxlQ2xlYXIgPSBzdG9wU2FtcGxlOworCisgIGF1dG9Db3JyTGVuZ3RoID0gcFNldHRpbmdzLT5uQ29scyArIHBTZXR0aW5ncy0+b3ZlcmxhcDsKKworICAvKiBTZXQgdXBwZXIgc3ViYmFuZHMgdG8gemVybzoKKyAgICAgVGhpcyBpcyByZXF1aXJlZCBpbiBjYXNlIHRoYXQgdGhlIHBhdGNoZXMgZG8gbm90IGNvdmVyIHRoZSBjb21wbGV0ZQorICAgICBoaWdoYmFuZCAoYmVjYXVzZSB0aGUgbGFzdCBwYXRjaCB3b3VsZCBiZSB0b28gc2hvcnQpLiBQb3NzaWJsZQorICAgICBvcHRpbWl6YXRpb246IENsZWFyaW5nIGJhbmRzIHVwIHRvIHVzYiB3b3VsZCBiZSBzdWZmaWNpZW50IGhlcmUuICovCisgIHRhcmdldFN0b3BCYW5kID0gcGF0Y2hQYXJhbVtwU2V0dGluZ3MtPm5vT2ZQYXRjaGVzIC0gMV0udGFyZ2V0U3RhcnRCYW5kICsKKyAgICAgICAgICAgICAgICAgICBwYXRjaFBhcmFtW3BTZXR0aW5ncy0+bm9PZlBhdGNoZXMgLSAxXS5udW1CYW5kc0luUGF0Y2g7CisKKyAgaW50IG1lbVNpemUgPSAoKDY0KSAtIHRhcmdldFN0b3BCYW5kKSAqIHNpemVvZihGSVhQX0RCTCk7CisKKyAgZm9yIChpID0gc3RhcnRTYW1wbGU7IGkgPCBzdG9wU2FtcGxlQ2xlYXI7IGkrKykgeworICAgIEZES21lbWNsZWFyKCZxbWZCdWZmZXJSZWFsW2ldW3RhcmdldFN0b3BCYW5kXSwgbWVtU2l6ZSk7CisgICAgRkRLbWVtY2xlYXIoJnFtZkJ1ZmZlckltYWdbaV1bdGFyZ2V0U3RvcEJhbmRdLCBtZW1TaXplKTsKKyAgfQorCisgIC8qCisgIENhbGMgY29tbW9uIGxvdyBiYW5kIHNjYWxlIGZhY3RvcgorICAqLworICBjb21CYW5kU2NhbGUgPSBzYnJTY2FsZUZhY3Rvci0+aGJfc2NhbGU7CisKKyAgb3ZMb3dCYW5kU2hpZnQgPSBzYnJTY2FsZUZhY3Rvci0+aGJfc2NhbGUgLSBjb21CYW5kU2NhbGU7CisgIGxvd0JhbmRTaGlmdCA9IHNiclNjYWxlRmFjdG9yLT5oYl9zY2FsZSAtIGNvbUJhbmRTY2FsZTsKKyAgLyogIG92SGlnaEJhbmRTaGlmdCA9IGZpcnN0U2xvdE9mZnMgPT0gMCA/IG92TG93QmFuZFNoaWZ0OjA7Ki8KKworICAvKiBvdXRlciBsb29wIG92ZXIgYmFuZHMgdG8gZG8gYW5hbHlzaXMgb25seSBvbmNlIGZvciBlYWNoIGJhbmQgKi8KKworICBzdGFydCA9IGhRbWZUcmFuc3Bvc2VyLT5zdGFydEJhbmQ7CisgIHN0b3AgPSBoUW1mVHJhbnNwb3Nlci0+c3RvcEJhbmQ7CisKKyAgZm9yIChsb0JhbmQgPSBzdGFydDsgbG9CYW5kIDwgc3RvcDsgbG9CYW5kKyspIHsKKyAgICBid0luZGV4ID0gMDsKKworICAgIEZJWFBfREJMIGxvd0JhbmRSZWFsWygoKDEwMjQpIC8gKDMyKSAqICg0KSAvIDIpICsgKDMgKiAoNCkpKSArIExQQ19PUkRFUl07CisgICAgRklYUF9EQkwgbG93QmFuZEltYWdbKCgoMTAyNCkgLyAoMzIpICogKDQpIC8gMikgKyAoMyAqICg0KSkpICsgTFBDX09SREVSXTsKKworICAgIGludCByZXNldExQQ0NvZWZmcyA9IDA7CisgICAgaW50IGR5bmFtaWNTY2FsZSA9IERGUkFDVF9CSVRTIC0gMSAtIExQQ19TQ0FMRV9GQUNUT1I7CisgICAgaW50IGFjRGV0U2NhbGUgPSAwOyAvKiBzY2FsaW5nIG9mIGF1dG9jb3JyZWxhdGlvbiBkZXRlcm1pbmFudCAqLworCisgICAgZm9yIChpID0gMDsgaSA8IExQQ19PUkRFUjsgaSsrKSB7CisgICAgICBsb3dCYW5kUmVhbFtpXSA9IGhMcHBUcmFucy0+bHBjRmlsdGVyU3RhdGVzUmVhbEhCRVtpXVtsb0JhbmRdOworICAgICAgbG93QmFuZEltYWdbaV0gPSBoTHBwVHJhbnMtPmxwY0ZpbHRlclN0YXRlc0ltYWdIQkVbaV1bbG9CYW5kXTsKKyAgICB9CisKKyAgICBmb3IgKDsgaSA8IExQQ19PUkRFUiArIGZpcnN0U2xvdE9mZnMgKiB0aW1lU3RlcDsgaSsrKSB7CisgICAgICBsb3dCYW5kUmVhbFtpXSA9IGhMcHBUcmFucy0+bHBjRmlsdGVyU3RhdGVzUmVhbEhCRVtpXVtsb0JhbmRdOworICAgICAgbG93QmFuZEltYWdbaV0gPSBoTHBwVHJhbnMtPmxwY0ZpbHRlclN0YXRlc0ltYWdIQkVbaV1bbG9CYW5kXTsKKyAgICB9CisKKyAgICAvKgorICAgIFRha2Ugb2xkIHNsb3BlIGxlbmd0aCBxbWYgc2xvdCBzb3VyY2UgdmFsdWVzIG91dCBvZiAob3ZlcmxhcClxbWYgYnVmZmVyCisgICAgKi8KKyAgICBmb3IgKGkgPSBmaXJzdFNsb3RPZmZzICogdGltZVN0ZXA7CisgICAgICAgICBpIDwgcFNldHRpbmdzLT5uQ29scyArIHBTZXR0aW5ncy0+b3ZlcmxhcDsgaSsrKSB7CisgICAgICBsb3dCYW5kUmVhbFtpICsgTFBDX09SREVSXSA9IHFtZkJ1ZmZlclJlYWxbaV1bbG9CYW5kXTsKKyAgICAgIGxvd0JhbmRJbWFnW2kgKyBMUENfT1JERVJdID0gcW1mQnVmZmVySW1hZ1tpXVtsb0JhbmRdOworICAgIH0KKworICAgIC8qIHN0b3JlIHVubW9kaWZpZWQgdmFsdWVzIHRvIGJ1ZmZlciAqLworICAgIGZvciAoaSA9IDA7IGkgPCBMUENfT1JERVIgKyBwU2V0dGluZ3MtPm92ZXJsYXA7IGkrKykgeworICAgICAgaExwcFRyYW5zLT5scGNGaWx0ZXJTdGF0ZXNSZWFsSEJFW2ldW2xvQmFuZF0gPQorICAgICAgICAgIHFtZkJ1ZmZlclJlYWxbcFNldHRpbmdzLT5uQ29scyAtIExQQ19PUkRFUiArIGldW2xvQmFuZF07CisgICAgICBoTHBwVHJhbnMtPmxwY0ZpbHRlclN0YXRlc0ltYWdIQkVbaV1bbG9CYW5kXSA9CisgICAgICAgICAgcW1mQnVmZmVySW1hZ1twU2V0dGluZ3MtPm5Db2xzIC0gTFBDX09SREVSICsgaV1bbG9CYW5kXTsKKyAgICB9CisKKyAgICAvKgorICAgIERldGVybWluZSBkeW5hbWljIHNjYWxpbmcgdmFsdWUuCisgICAgKi8KKyAgICBkeW5hbWljU2NhbGUgPQorICAgICAgICBmaXhNaW4oZHluYW1pY1NjYWxlLAorICAgICAgICAgICAgICAgZ2V0U2NhbGVmYWN0b3IobG93QmFuZFJlYWwsIExQQ19PUkRFUiArIHBTZXR0aW5ncy0+b3ZlcmxhcCkgKworICAgICAgICAgICAgICAgICAgIG92TG93QmFuZFNoaWZ0KTsKKyAgICBkeW5hbWljU2NhbGUgPQorICAgICAgICBmaXhNaW4oZHluYW1pY1NjYWxlLAorICAgICAgICAgICAgICAgZ2V0U2NhbGVmYWN0b3IoJmxvd0JhbmRSZWFsW0xQQ19PUkRFUiArIHBTZXR0aW5ncy0+b3ZlcmxhcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPm5Db2xzKSArCisgICAgICAgICAgICAgICAgICAgbG93QmFuZFNoaWZ0KTsKKyAgICBkeW5hbWljU2NhbGUgPQorICAgICAgICBmaXhNaW4oZHluYW1pY1NjYWxlLAorICAgICAgICAgICAgICAgZ2V0U2NhbGVmYWN0b3IobG93QmFuZEltYWcsIExQQ19PUkRFUiArIHBTZXR0aW5ncy0+b3ZlcmxhcCkgKworICAgICAgICAgICAgICAgICAgIG92TG93QmFuZFNoaWZ0KTsKKyAgICBkeW5hbWljU2NhbGUgPQorICAgICAgICBmaXhNaW4oZHluYW1pY1NjYWxlLAorICAgICAgICAgICAgICAgZ2V0U2NhbGVmYWN0b3IoJmxvd0JhbmRJbWFnW0xQQ19PUkRFUiArIHBTZXR0aW5ncy0+b3ZlcmxhcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPm5Db2xzKSArCisgICAgICAgICAgICAgICAgICAgbG93QmFuZFNoaWZ0KTsKKworICAgIGR5bmFtaWNTY2FsZSA9IGZpeE1heCgKKyAgICAgICAgMCwgZHluYW1pY1NjYWxlIC0gMSk7IC8qIG9uZSBhZGRpdGlvbmFsIGJpdCBoZWFkcm9vbSB0byBwcmV2ZW50IC0xLjAgKi8KKworICAgIC8qCisgICAgU2NhbGUgdGVtcG9yYWwgUU1GIGJ1ZmZlci4KKyAgICAqLworICAgIHNjYWxlVmFsdWVzKCZsb3dCYW5kUmVhbFswXSwgTFBDX09SREVSICsgcFNldHRpbmdzLT5vdmVybGFwLAorICAgICAgICAgICAgICAgIGR5bmFtaWNTY2FsZSAtIG92TG93QmFuZFNoaWZ0KTsKKyAgICBzY2FsZVZhbHVlcygmbG93QmFuZFJlYWxbTFBDX09SREVSICsgcFNldHRpbmdzLT5vdmVybGFwXSwgcFNldHRpbmdzLT5uQ29scywKKyAgICAgICAgICAgICAgICBkeW5hbWljU2NhbGUgLSBsb3dCYW5kU2hpZnQpOworICAgIHNjYWxlVmFsdWVzKCZsb3dCYW5kSW1hZ1swXSwgTFBDX09SREVSICsgcFNldHRpbmdzLT5vdmVybGFwLAorICAgICAgICAgICAgICAgIGR5bmFtaWNTY2FsZSAtIG92TG93QmFuZFNoaWZ0KTsKKyAgICBzY2FsZVZhbHVlcygmbG93QmFuZEltYWdbTFBDX09SREVSICsgcFNldHRpbmdzLT5vdmVybGFwXSwgcFNldHRpbmdzLT5uQ29scywKKyAgICAgICAgICAgICAgICBkeW5hbWljU2NhbGUgLSBsb3dCYW5kU2hpZnQpOworCisgICAgYWNEZXRTY2FsZSArPSBhdXRvQ29ycjJuZF9jcGx4KCZhYywgbG93QmFuZFJlYWwgKyBMUENfT1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd0JhbmRJbWFnICsgTFBDX09SREVSLCBhdXRvQ29yckxlbmd0aCk7CisKKyAgICAvKiBFeGFtaW5lIGR5bmFtaWMgb2YgZGV0ZXJtaW5hbnQgaW4gYXV0b2NvcnJlbGF0aW9uLiAqLworICAgIGFjRGV0U2NhbGUgKz0gMiAqIChjb21CYW5kU2NhbGUgKyBkeW5hbWljU2NhbGUpOworICAgIGFjRGV0U2NhbGUgKj0gMjsgICAgICAgICAgICAvKiB0d28gdGltZXMgcmVmbGVjdGlvbiBjb2VmZmljZW50IHNjYWxpbmcgKi8KKyAgICBhY0RldFNjYWxlICs9IGFjLmRldF9zY2FsZTsgLyogYWMgc2NhbGluZyBvZiBkZXRlcm1pbmFudCAqLworCisgICAgLyogSW4gY2FzZSBvZiBkZXRlcm1pbmFudCA8IDEwXi0zOCwgcmVzZXRMUENDb2VmZnM9MSBoYXMgdG8gYmUgZW5mb3JjZWQuICovCisgICAgaWYgKGFjRGV0U2NhbGUgPiAxMjYpIHsKKyAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKKyAgICB9CisKKyAgICBhbHBoYXJbMV0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKKyAgICBhbHBoYWlbMV0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKKworICAgIGlmIChhYy5kZXQgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgIEZJWFBfREJMIHRtcCwgYWJzVG1wLCBhYnNEZXQ7CisKKyAgICAgIGFic0RldCA9IGZpeHBfYWJzKGFjLmRldCk7CisKKyAgICAgIHRtcCA9IChmTXVsdERpdjIoYWMucjAxciwgYWMucjEycikgPj4gKExQQ19TQ0FMRV9GQUNUT1IgLSAxKSkgLQorICAgICAgICAgICAgKChmTXVsdERpdjIoYWMucjAxaSwgYWMucjEyaSkgKyBmTXVsdERpdjIoYWMucjAyciwgYWMucjExcikpID4+CisgICAgICAgICAgICAgKExQQ19TQ0FMRV9GQUNUT1IgLSAxKSk7CisgICAgICBhYnNUbXAgPSBmaXhwX2Ficyh0bXApOworCisgICAgICAvKgorICAgICAgUXVpY2sgY2hlY2s6IGlzIGZpcnN0IGZpbHRlciBjb2VmZiA+PSAxKDQpCisgICAgICAqLworICAgICAgeworICAgICAgICBJTlQgc2NhbGU7CisgICAgICAgIEZJWFBfREJMIHJlc3VsdCA9IGZEaXZOb3JtKGFic1RtcCwgYWJzRGV0LCAmc2NhbGUpOworICAgICAgICBzY2FsZSA9IHNjYWxlICsgYWMuZGV0X3NjYWxlOworCisgICAgICAgIGlmICgoc2NhbGUgPiAwKSAmJiAocmVzdWx0ID49IChGSVhQX0RCTClNQVhWQUxfREJMID4+IHNjYWxlKSkgeworICAgICAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhbHBoYXJbMV0gPSBGWF9EQkwyRlhfU0dMKHNjYWxlVmFsdWUocmVzdWx0LCBzY2FsZSkpOworICAgICAgICAgIGlmICgodG1wIDwgRkwyRlhfREJMKDAuMGYpKSBeIChhYy5kZXQgPCBGTDJGWF9EQkwoMC4wZikpKSB7CisgICAgICAgICAgICBhbHBoYXJbMV0gPSAtYWxwaGFyWzFdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0bXAgPSAoZk11bHREaXYyKGFjLnIwMWksIGFjLnIxMnIpID4+IChMUENfU0NBTEVfRkFDVE9SIC0gMSkpICsKKyAgICAgICAgICAgICgoZk11bHREaXYyKGFjLnIwMXIsIGFjLnIxMmkpIC0KKyAgICAgICAgICAgICAgKEZJWFBfREJMKWZNdWx0RGl2MihhYy5yMDJpLCBhYy5yMTFyKSkgPj4KKyAgICAgICAgICAgICAoTFBDX1NDQUxFX0ZBQ1RPUiAtIDEpKTsKKworICAgICAgYWJzVG1wID0gZml4cF9hYnModG1wKTsKKworICAgICAgLyoKKyAgICAgIFF1aWNrIGNoZWNrOiBpcyBzZWNvbmQgZmlsdGVyIGNvZWZmID49IDEoNCkKKyAgICAgICovCisgICAgICB7CisgICAgICAgIElOVCBzY2FsZTsKKyAgICAgICAgRklYUF9EQkwgcmVzdWx0ID0gZkRpdk5vcm0oYWJzVG1wLCBhYnNEZXQsICZzY2FsZSk7CisgICAgICAgIHNjYWxlID0gc2NhbGUgKyBhYy5kZXRfc2NhbGU7CisKKyAgICAgICAgaWYgKChzY2FsZSA+IDApICYmCisgICAgICAgICAgICAocmVzdWx0ID49IC8qRkwyRlhDT05TVF9EQkwoMS5mKSovIChGSVhQX0RCTClNQVhWQUxfREJMID4+IHNjYWxlKSkgeworICAgICAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhbHBoYWlbMV0gPSBGWF9EQkwyRlhfU0dMKHNjYWxlVmFsdWUocmVzdWx0LCBzY2FsZSkpOworICAgICAgICAgIGlmICgodG1wIDwgRkwyRlhfREJMKDAuMGYpKSBeIChhYy5kZXQgPCBGTDJGWF9EQkwoMC4wZikpKSB7CisgICAgICAgICAgICBhbHBoYWlbMV0gPSAtYWxwaGFpWzFdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGFscGhhclswXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworICAgIGFscGhhaVswXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworCisgICAgaWYgKGFjLnIxMXIgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKKyAgICAgIC8qIGFjLnIxMXIgaXMgYWx3YXlzID49MCAqLworICAgICAgRklYUF9EQkwgdG1wLCBhYnNUbXA7CisKKyAgICAgIHRtcCA9IChhYy5yMDFyID4+IChMUENfU0NBTEVfRkFDVE9SICsgMSkpICsKKyAgICAgICAgICAgIChmTXVsdERpdjIoYWxwaGFyWzFdLCBhYy5yMTJyKSArIGZNdWx0RGl2MihhbHBoYWlbMV0sIGFjLnIxMmkpKTsKKworICAgICAgYWJzVG1wID0gZml4cF9hYnModG1wKTsKKworICAgICAgLyoKKyAgICAgIFF1aWNrIGNoZWNrOiBpcyBmaXJzdCBmaWx0ZXIgY29lZmYgPj0gMSg0KQorICAgICAgKi8KKworICAgICAgaWYgKGFic1RtcCA+PSAoYWMucjExciA+PiAxKSkgeworICAgICAgICByZXNldExQQ0NvZWZmcyA9IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBJTlQgc2NhbGU7CisgICAgICAgIEZJWFBfREJMIHJlc3VsdCA9IGZEaXZOb3JtKGFic1RtcCwgZml4cF9hYnMoYWMucjExciksICZzY2FsZSk7CisgICAgICAgIGFscGhhclswXSA9IEZYX0RCTDJGWF9TR0woc2NhbGVWYWx1ZShyZXN1bHQsIHNjYWxlICsgMSkpOworCisgICAgICAgIGlmICgodG1wID4gRkwyRlhfREJMKDAuMGYpKSBeIChhYy5yMTFyIDwgRkwyRlhfREJMKDAuMGYpKSkKKyAgICAgICAgICBhbHBoYXJbMF0gPSAtYWxwaGFyWzBdOworICAgICAgfQorCisgICAgICB0bXAgPSAoYWMucjAxaSA+PiAoTFBDX1NDQUxFX0ZBQ1RPUiArIDEpKSArCisgICAgICAgICAgICAoZk11bHREaXYyKGFscGhhaVsxXSwgYWMucjEycikgLSBmTXVsdERpdjIoYWxwaGFyWzFdLCBhYy5yMTJpKSk7CisKKyAgICAgIGFic1RtcCA9IGZpeHBfYWJzKHRtcCk7CisKKyAgICAgIC8qCisgICAgICBRdWljayBjaGVjazogaXMgc2Vjb25kIGZpbHRlciBjb2VmZiA+PSAxKDQpCisgICAgICAqLworICAgICAgaWYgKGFic1RtcCA+PSAoYWMucjExciA+PiAxKSkgeworICAgICAgICByZXNldExQQ0NvZWZmcyA9IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBJTlQgc2NhbGU7CisgICAgICAgIEZJWFBfREJMIHJlc3VsdCA9IGZEaXZOb3JtKGFic1RtcCwgZml4cF9hYnMoYWMucjExciksICZzY2FsZSk7CisgICAgICAgIGFscGhhaVswXSA9IEZYX0RCTDJGWF9TR0woc2NhbGVWYWx1ZShyZXN1bHQsIHNjYWxlICsgMSkpOworICAgICAgICBpZiAoKHRtcCA+IEZMMkZYX0RCTCgwLjBmKSkgXiAoYWMucjExciA8IEZMMkZYX0RCTCgwLjBmKSkpIHsKKyAgICAgICAgICBhbHBoYWlbMF0gPSAtYWxwaGFpWzBdOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogTm93IGNoZWNrIHRoZSBxdWFkcmF0aWMgY3JpdGVyaWEgKi8KKyAgICBpZiAoKGZNdWx0RGl2MihhbHBoYXJbMF0sIGFscGhhclswXSkgKyBmTXVsdERpdjIoYWxwaGFpWzBdLCBhbHBoYWlbMF0pKSA+PQorICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjVmKSkgeworICAgICAgcmVzZXRMUENDb2VmZnMgPSAxOworICAgIH0KKyAgICBpZiAoKGZNdWx0RGl2MihhbHBoYXJbMV0sIGFscGhhclsxXSkgKyBmTXVsdERpdjIoYWxwaGFpWzFdLCBhbHBoYWlbMV0pKSA+PQorICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjVmKSkgeworICAgICAgcmVzZXRMUENDb2VmZnMgPSAxOworICAgIH0KKworICAgIGlmIChyZXNldExQQ0NvZWZmcykgeworICAgICAgYWxwaGFyWzBdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CisgICAgICBhbHBoYXJbMV0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKKyAgICAgIGFscGhhaVswXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOworICAgICAgYWxwaGFpWzFdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CisgICAgfQorCisgICAgd2hpbGUgKGJ3SW5kZXggPCBNQVhfTlVNX1BBVENIRVMgLSAxICYmCisgICAgICAgICAgIGxvQmFuZCA+PSBwU2V0dGluZ3MtPmJ3Qm9yZGVyc1tid0luZGV4XSkgeworICAgICAgYndJbmRleCsrOworICAgIH0KKworICAgIC8qCisgICAgRmlsdGVyIFN0ZXAgMjogYWRkIHRoZSBsZWZ0IHNsb3BlIHdpdGggdGhlIGN1cnJlbnQgZmlsdGVyIHRvIHRoZSBidWZmZXIKKyAgICBwdXJlIHNvdXJjZSB2YWx1ZXMgYXJlIGFscmVhZHkgaW4gdGhlcmUKKyAgICAqLworICAgIGJ3ID0gRlhfREJMMkZYX1NHTChid1ZlY3Rvcltid0luZGV4XSk7CisKKyAgICBhMHIgPSBGWF9EQkwyRlhfU0dMKAorICAgICAgICBmTXVsdChidywgYWxwaGFyWzBdKSk7IC8qIEFwcGx5IGN1cnJlbnQgYmFuZHdpZHRoIGV4cGFuc2lvbiBmYWN0b3IgKi8KKyAgICBhMGkgPSBGWF9EQkwyRlhfU0dMKGZNdWx0KGJ3LCBhbHBoYWlbMF0pKTsKKyAgICBidyA9IEZYX0RCTDJGWF9TR0woZlBvdzIoYncpKTsKKyAgICBhMXIgPSBGWF9EQkwyRlhfU0dMKGZNdWx0KGJ3LCBhbHBoYXJbMV0pKTsKKyAgICBhMWkgPSBGWF9EQkwyRlhfU0dMKGZNdWx0KGJ3LCBhbHBoYWlbMV0pKTsKKworICAgIC8qCisgICAgRmlsdGVyIFN0ZXAgMzogaW5zZXJ0IHRoZSBtaWRkbGUgcGFydCB3aGljaCB3b24ndCBiZSB3aW5kb3dlZAorICAgICovCisgICAgaWYgKGJ3IDw9IEZMMkZYQ09OU1RfU0dMKDAuMGYpKSB7CisgICAgICBpbnQgZGVzY2FsZSA9IGZpeE1pbihERlJBQ1RfQklUUyAtIDEsIChMUENfU0NBTEVfRkFDVE9SICsgZHluYW1pY1NjYWxlKSk7CisgICAgICBmb3IgKGkgPSBzdGFydFNhbXBsZTsgaSA8IHN0b3BTYW1wbGU7IGkrKykgeworICAgICAgICBxbWZCdWZmZXJSZWFsW2ldW2xvQmFuZF0gPSBsb3dCYW5kUmVhbFtMUENfT1JERVIgKyBpXSA+PiBkZXNjYWxlOworICAgICAgICBxbWZCdWZmZXJJbWFnW2ldW2xvQmFuZF0gPSBsb3dCYW5kSW1hZ1tMUENfT1JERVIgKyBpXSA+PiBkZXNjYWxlOworICAgICAgfQorICAgIH0gZWxzZSB7IC8qIGJ3IDw9IDAgKi8KKworICAgICAgaW50IGRlc2NhbGUgPSBmaXhNaW4oREZSQUNUX0JJVFMgLSAxLCAoTFBDX1NDQUxFX0ZBQ1RPUiArIGR5bmFtaWNTY2FsZSkpOworCisgICAgICBmb3IgKGkgPSBzdGFydFNhbXBsZTsgaSA8IHN0b3BTYW1wbGU7IGkrKykgeworICAgICAgICBGSVhQX0RCTCBhY2N1MSwgYWNjdTI7CisKKyAgICAgICAgYWNjdTEgPSAoZk11bHREaXYyKGEwciwgbG93QmFuZFJlYWxbTFBDX09SREVSICsgaSAtIDFdKSAtCisgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihhMGksIGxvd0JhbmRJbWFnW0xQQ19PUkRFUiArIGkgLSAxXSkgKworICAgICAgICAgICAgICAgICBmTXVsdERpdjIoYTFyLCBsb3dCYW5kUmVhbFtMUENfT1JERVIgKyBpIC0gMl0pIC0KKyAgICAgICAgICAgICAgICAgZk11bHREaXYyKGExaSwgbG93QmFuZEltYWdbTFBDX09SREVSICsgaSAtIDJdKSkgPj4KKyAgICAgICAgICAgICAgICBkeW5hbWljU2NhbGU7CisgICAgICAgIGFjY3UyID0gKGZNdWx0RGl2MihhMGksIGxvd0JhbmRSZWFsW0xQQ19PUkRFUiArIGkgLSAxXSkgKworICAgICAgICAgICAgICAgICBmTXVsdERpdjIoYTByLCBsb3dCYW5kSW1hZ1tMUENfT1JERVIgKyBpIC0gMV0pICsKKyAgICAgICAgICAgICAgICAgZk11bHREaXYyKGExaSwgbG93QmFuZFJlYWxbTFBDX09SREVSICsgaSAtIDJdKSArCisgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihhMXIsIGxvd0JhbmRJbWFnW0xQQ19PUkRFUiArIGkgLSAyXSkpID4+CisgICAgICAgICAgICAgICAgZHluYW1pY1NjYWxlOworCisgICAgICAgIHFtZkJ1ZmZlclJlYWxbaV1bbG9CYW5kXSA9CisgICAgICAgICAgICAobG93QmFuZFJlYWxbTFBDX09SREVSICsgaV0gPj4gZGVzY2FsZSkgKyAoYWNjdTEgPDwgMSk7CisgICAgICAgIHFtZkJ1ZmZlckltYWdbaV1bbG9CYW5kXSA9CisgICAgICAgICAgICAobG93QmFuZEltYWdbTFBDX09SREVSICsgaV0gPj4gZGVzY2FsZSkgKyAoYWNjdTIgPDwgMSk7CisgICAgICB9CisgICAgfSAvKiBidyA8PSAwICovCisKKyAgICAvKgorICAgICAqIHN0b3JlIHRoZSB1bm1vZGlmaWVkIGZpbHRlciBjb2VmZmljaWVudHMgaWYgdGhlcmUgaXMKKyAgICAgKiBhbiBvdmVybGFwcGluZyBlbnZlbG9wZQorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICB9IC8qIG91dGVyIGxvb3Agb3ZlciBiYW5kcyAobG9CYW5kKSAqLworCisgIGZvciAoaSA9IDA7IGkgPCBuSW52ZkJhbmRzOyBpKyspIHsKKyAgICBoTHBwVHJhbnMtPmJ3VmVjdG9yT2xkW2ldID0gYndWZWN0b3JbaV07CisgIH0KKworICAvKgorICBzZXQgaGlnaCBiYW5kIHNjYWxlIGZhY3RvcgorICAqLworICBzYnJTY2FsZUZhY3Rvci0+aGJfc2NhbGUgPSBjb21CYW5kU2NhbGUgLSAoTFBDX1NDQUxFX0ZBQ1RPUik7CiB9CiAKIC8qIQpAQCAtNzU1LDIxICsxMjAyLDIwIEBACiAgKgogICovCiBTQlJfRVJST1IKLWNyZWF0ZUxwcFRyYW5zcG9zZXIgKEhBTkRMRV9TQlJfTFBQX1RSQU5TIGhzLCAvKiE8IEhhbmRsZSBvZiBsb3cgcG93ZXIgdHJhbnNwb3NlciAgKi8KLSAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9TRVJfU0VUVElOR1MgKnBTZXR0aW5ncywgLyohPCBQb2ludGVyIHRvIHNldHRpbmdzICovCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgIGhpZ2hCYW5kU3RhcnRTYiwgLyohPCA/ICovCi0gICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdl9rX21hc3RlciwgICAgICAgICAvKiE8IE1hc3RlciB0YWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bU1hc3RlciwgICAgICAgLyohPCBWYWxpZCBlbnRyaWVzIGluIG1hc3RlciB0YWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHVzYiwgICAgICAgICAgICAgLyohPCBIaWdoYmFuZCBhcmVhIHN0b3Agc3ViYmFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbWVTbG90cywgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZSBzbG90cyAqLwotICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG5Db2xzLCAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgY29sdW1zIChjb2RlYyBxbWYgYmFuaykgKi8KLSAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpub2lzZUJhbmRUYWJsZSwgICAgIC8qITwgTWFwcGluZyBvZiBTQlIgbm9pc2UgYmFuZHMgdG8gUU1GIGJhbmRzICovCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgIG5vTm9pc2VCYW5kcywgICAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcyAqLwotICAgICAgICAgICAgICAgICAgICAgVUlOVCAgIGZzLCAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGUgRnJlcXVlbmN5ICovCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY2hhbiwgICAgICAgICAgICAvKiE8IENoYW5uZWwgbnVtYmVyICovCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3ZlcmxhcAotICAgICAgICAgICAgICAgICAgICAgKQoteworY3JlYXRlTHBwVHJhbnNwb3NlcigKKyAgICBIQU5ETEVfU0JSX0xQUF9UUkFOUyBocywgICAgICAgIC8qITwgSGFuZGxlIG9mIGxvdyBwb3dlciB0cmFuc3Bvc2VyICAqLworICAgIFRSQU5TUE9TRVJfU0VUVElOR1MgKnBTZXR0aW5ncywgLyohPCBQb2ludGVyIHRvIHNldHRpbmdzICovCisgICAgY29uc3QgaW50IGhpZ2hCYW5kU3RhcnRTYiwgICAgICAvKiE8ID8gKi8KKyAgICBVQ0hBUiAqdl9rX21hc3RlciwgICAgICAgICAgICAgIC8qITwgTWFzdGVyIHRhYmxlICovCisgICAgY29uc3QgaW50IG51bU1hc3RlciwgICAgICAgICAgICAvKiE8IFZhbGlkIGVudHJpZXMgaW4gbWFzdGVyIHRhYmxlICovCisgICAgY29uc3QgaW50IHVzYiwgICAgICAgICAgICAgICAgICAvKiE8IEhpZ2hiYW5kIGFyZWEgc3RvcCBzdWJiYW5kICovCisgICAgY29uc3QgaW50IHRpbWVTbG90cywgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB0aW1lIHNsb3RzICovCisgICAgY29uc3QgaW50IG5Db2xzLCAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBjb2x1bXMgKGNvZGVjIHFtZiBiYW5rKSAqLworICAgIFVDSEFSICpub2lzZUJhbmRUYWJsZSwgIC8qITwgTWFwcGluZyBvZiBTQlIgbm9pc2UgYmFuZHMgdG8gUU1GIGJhbmRzICovCisgICAgY29uc3QgaW50IG5vTm9pc2VCYW5kcywgLyohPCBOdW1iZXIgb2Ygbm9pc2UgYmFuZHMgKi8KKyAgICBVSU5UIGZzLCAgICAgICAgICAgICAgICAvKiE8IFNhbXBsZSBGcmVxdWVuY3kgKi8KKyAgICBjb25zdCBpbnQgY2hhbiwgICAgICAgICAvKiE8IENoYW5uZWwgbnVtYmVyICovCisgICAgY29uc3QgaW50IG92ZXJsYXApIHsKICAgLyogRkIgaW52ZXJzZSBmaWx0ZXJpbmcgc2V0dGluZ3MgKi8KICAgaHMtPnBTZXR0aW5ncyA9IHBTZXR0aW5nczsKIApAQCAtNzc3LDUwICsxMjIzLDQwIEBACiAgIHBTZXR0aW5ncy0+b3ZlcmxhcCA9IG92ZXJsYXA7CiAKICAgc3dpdGNoICh0aW1lU2xvdHMpIHsKKyAgICBjYXNlIDE1OgorICAgIGNhc2UgMTY6CisgICAgICBicmVhazsKIAotICBjYXNlIDE1OgotICBjYXNlIDE2OgotICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7IC8qIFVuaW1wbGVtZW50ZWQgKi8KKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7IC8qIFVuaW1wbGVtZW50ZWQgKi8KICAgfQogCi0gIGlmIChjaGFuPT0wKSB7CisgIGlmIChjaGFuID09IDApIHsKICAgICAvKiBJbml0IGNvbW1vbiBkYXRhIG9ubHkgb25jZSAqLwogICAgIGhzLT5wU2V0dGluZ3MtPm5Db2xzID0gbkNvbHM7CiAKLSAgICByZXR1cm4gcmVzZXRMcHBUcmFuc3Bvc2VyIChocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoQmFuZFN0YXJ0U2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9rX21hc3RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1NYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9pc2VCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Ob2lzZUJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcyk7CisgICAgcmV0dXJuIHJlc2V0THBwVHJhbnNwb3NlcihocywgaGlnaEJhbmRTdGFydFNiLCB2X2tfbWFzdGVyLCBudW1NYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2lzZUJhbmRUYWJsZSwgbm9Ob2lzZUJhbmRzLCB1c2IsIGZzKTsKICAgfQogICByZXR1cm4gU0JSREVDX09LOwogfQogCi0KLXN0YXRpYyBpbnQgZmluZENsb3Nlc3RFbnRyeShVQ0hBUiBnb2FsU2IsIFVDSEFSICp2X2tfbWFzdGVyLCBVQ0hBUiBudW1NYXN0ZXIsIFVDSEFSIGRpcmVjdGlvbikKLXsKK3N0YXRpYyBpbnQgZmluZENsb3Nlc3RFbnRyeShVQ0hBUiBnb2FsU2IsIFVDSEFSICp2X2tfbWFzdGVyLCBVQ0hBUiBudW1NYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgZGlyZWN0aW9uKSB7CiAgIGludCBpbmRleDsKIAotICBpZiggZ29hbFNiIDw9IHZfa19tYXN0ZXJbMF0gKQotICAgIHJldHVybiB2X2tfbWFzdGVyWzBdOworICBpZiAoZ29hbFNiIDw9IHZfa19tYXN0ZXJbMF0pIHJldHVybiB2X2tfbWFzdGVyWzBdOwogCi0gIGlmKCBnb2FsU2IgPj0gdl9rX21hc3RlcltudW1NYXN0ZXJdICkKLSAgICByZXR1cm4gdl9rX21hc3RlcltudW1NYXN0ZXJdOworICBpZiAoZ29hbFNiID49IHZfa19tYXN0ZXJbbnVtTWFzdGVyXSkgcmV0dXJuIHZfa19tYXN0ZXJbbnVtTWFzdGVyXTsKIAotICBpZihkaXJlY3Rpb24pIHsKKyAgaWYgKGRpcmVjdGlvbikgewogICAgIGluZGV4ID0gMDsKLSAgICB3aGlsZSggdl9rX21hc3RlcltpbmRleF0gPCBnb2FsU2IgKSB7CisgICAgd2hpbGUgKHZfa19tYXN0ZXJbaW5kZXhdIDwgZ29hbFNiKSB7CiAgICAgICBpbmRleCsrOwogICAgIH0KICAgfSBlbHNlIHsKICAgICBpbmRleCA9IG51bU1hc3RlcjsKLSAgICB3aGlsZSggdl9rX21hc3RlcltpbmRleF0gPiBnb2FsU2IgKSB7CisgICAgd2hpbGUgKHZfa19tYXN0ZXJbaW5kZXhdID4gZ29hbFNiKSB7CiAgICAgICBpbmRleC0tOwogICAgIH0KICAgfQpAQCAtODI4LDcgKzEyNjQsNiBAQAogICByZXR1cm4gdl9rX21hc3RlcltpbmRleF07CiB9CiAKLQogLyohCiAgKgogICogXGJyaWVmIFJlc2V0IG1lbW9yeSBmb3Igb25lIGxwcCB0cmFuc3Bvc2VyIGluc3RhbmNlCkBAIC04MzYsMTggKzEyNzEsMTggQEAKICAqIFxyZXR1cm4gU0JSREVDX09LIG9uIHN1Y2Nlc3MsIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUcgb24gZXJyb3IKICAqLwogU0JSX0VSUk9SCi1yZXNldExwcFRyYW5zcG9zZXIgKEhBTkRMRV9TQlJfTFBQX1RSQU5TIGhMcHBUcmFucywgIC8qITwgSGFuZGxlIG9mIGxwcCB0cmFuc3Bvc2VyICAqLwotICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgaGlnaEJhbmRTdGFydFNiLCAgICAgICAgICAvKiE8IEhpZ2ggYmFuZCBhcmVhOiBzdGFydCBzdWJiYW5kICovCi0gICAgICAgICAgICAgICAgICAgIFVDSEFSICp2X2tfbWFzdGVyLCAgICAgICAgICAgICAgIC8qITwgTWFzdGVyIHRhYmxlICovCi0gICAgICAgICAgICAgICAgICAgIFVDSEFSICBudW1NYXN0ZXIsICAgICAgICAgICAgICAgIC8qITwgVmFsaWQgZW50cmllcyBpbiBtYXN0ZXIgdGFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgVUNIQVIgKm5vaXNlQmFuZFRhYmxlLCAgICAgICAgICAgLyohPCBNYXBwaW5nIG9mIFNCUiBub2lzZSBiYW5kcyB0byBRTUYgYmFuZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgVUNIQVIgIG5vTm9pc2VCYW5kcywgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygbm9pc2UgYmFuZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgVUNIQVIgIHVzYiwgICAgICAgICAgICAgICAgICAgICAgLyohPCBIaWdoIGJhbmQgYXJlYTogc3RvcCBzdWJiYW5kICovCi0gICAgICAgICAgICAgICAgICAgIFVJTlQgICBmcyAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU0JSIG91dHB1dCBzYW1wbGluZyBmcmVxdWVuY3kgKi8KLSAgICAgICAgICAgICAgICAgICAgKQoteworcmVzZXRMcHBUcmFuc3Bvc2VyKAorICAgIEhBTkRMRV9TQlJfTFBQX1RSQU5TIGhMcHBUcmFucywgLyohPCBIYW5kbGUgb2YgbHBwIHRyYW5zcG9zZXIgICovCisgICAgVUNIQVIgaGlnaEJhbmRTdGFydFNiLCAgICAgICAgICAvKiE8IEhpZ2ggYmFuZCBhcmVhOiBzdGFydCBzdWJiYW5kICovCisgICAgVUNIQVIgKnZfa19tYXN0ZXIsICAgICAgICAgICAgICAvKiE8IE1hc3RlciB0YWJsZSAqLworICAgIFVDSEFSIG51bU1hc3RlciwgICAgICAgICAgICAgICAgLyohPCBWYWxpZCBlbnRyaWVzIGluIG1hc3RlciB0YWJsZSAqLworICAgIFVDSEFSICpub2lzZUJhbmRUYWJsZSwgLyohPCBNYXBwaW5nIG9mIFNCUiBub2lzZSBiYW5kcyB0byBRTUYgYmFuZHMgKi8KKyAgICBVQ0hBUiBub05vaXNlQmFuZHMsICAgIC8qITwgTnVtYmVyIG9mIG5vaXNlIGJhbmRzICovCisgICAgVUNIQVIgdXNiLCAgICAgICAgICAgICAvKiE8IEhpZ2ggYmFuZCBhcmVhOiBzdG9wIHN1YmJhbmQgKi8KKyAgICBVSU5UIGZzICAgICAgICAgICAgICAgIC8qITwgU0JSIG91dHB1dCBzYW1wbGluZyBmcmVxdWVuY3kgKi8KKykgewogICBUUkFOU1BPU0VSX1NFVFRJTkdTICpwU2V0dGluZ3MgPSBoTHBwVHJhbnMtPnBTZXR0aW5nczsKLSAgUEFUQ0hfUEFSQU0gICpwYXRjaFBhcmFtID0gcFNldHRpbmdzLT5wYXRjaFBhcmFtOworICBQQVRDSF9QQVJBTSAqcGF0Y2hQYXJhbSA9IHBTZXR0aW5ncy0+cGF0Y2hQYXJhbTsKIAogICBpbnQgaSwgcGF0Y2g7CiAgIGludCB0YXJnZXRTdG9wQmFuZDsKQEAgLTg1NSw0MyArMTI5MCw1MiBAQAogICBpbnQgcGF0Y2hEaXN0YW5jZTsKICAgaW50IG51bUJhbmRzSW5QYXRjaDsKIAotICBpbnQgbHNiID0gdl9rX21hc3RlclswXTsgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IHN1YmJhbmQgZXhwcmVzc2VkIGluICJub24tY3JpdGljYWwiIHNhbXBsaW5nIHRlcm1zKi8KLSAgaW50IHhvdmVyT2Zmc2V0ID0gaGlnaEJhbmRTdGFydFNiIC0gbHNiOyAvKiBDYWxjdWxhdGUgZGlzdGFuY2UgaW4gUU1GIGJhbmRzIGJldHdlZW4gazAgYW5kIGt4ICovCisgIGludCBsc2IgPSB2X2tfbWFzdGVyWzBdOyAvKiBTdGFydCBzdWJiYW5kIGV4cHJlc3NlZCBpbiAibm9uLWNyaXRpY2FsIiBzYW1wbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybXMqLworICBpbnQgeG92ZXJPZmZzZXQgPSBoaWdoQmFuZFN0YXJ0U2IgLQorICAgICAgICAgICAgICAgICAgICBsc2I7IC8qIENhbGN1bGF0ZSBkaXN0YW5jZSBpbiBRTUYgYmFuZHMgYmV0d2VlbiBrMCBhbmQga3ggKi8KICAgaW50IHN0YXJ0RnJlcUh6OwogCiAgIGludCBkZXNpcmVkQm9yZGVyOwogCi0gIHVzYiA9IGZpeE1pbih1c2IsIHZfa19tYXN0ZXJbbnVtTWFzdGVyXSk7IC8qIEF2b2lkIGVuZGxlc3MgbG9vcHMgKGNvbXBhcmUgd2l0aCBmbG9hdCBjb2RlKS4gKi8KKyAgdXNiID0gZml4TWluKHVzYiwgdl9rX21hc3RlcltudW1NYXN0ZXJdKTsgLyogQXZvaWQgZW5kbGVzcyBsb29wcyAoY29tcGFyZSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNvZGUpLiAqLwogCiAgIC8qCiAgICAqIFBsYXVzaWJpbGl0eSBjaGVjawogICAgKi8KIAotICBpZiAoIGxzYiAtIFNISUZUX1NUQVJUX1NCIDwgNCApIHsKKyAgaWYgKHBTZXR0aW5ncy0+bkNvbHMgPT0gNjQpIHsKKyAgICBpZiAobHNiIDwgNCkgeworICAgICAgLyogNDoxIFNCUiBSZXF1aXJlbWVudCBrMCA+PSA0IG1pc3NlZCEgKi8KKyAgICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOworICAgIH0KKyAgfSBlbHNlIGlmIChsc2IgLSBTSElGVF9TVEFSVF9TQiA8IDQpIHsKICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKICAgfQogCi0KICAgLyoKICAgICogSW5pdGlhbGl6ZSB0aGUgcGF0Y2hpbmcgcGFyYW1ldGVyCiAgICAqLwogICAvKiBJU08vSUVDIDE0NDk2LTMgKEZpZ3VyZSA0LjQ4KTogZ29hbFNiID0gcm91bmQoIDIuMDQ4ZTYgLyBmcyApICovCi0gIGRlc2lyZWRCb3JkZXIgICAgPSAoKCgyMDQ4MDAwKjIpIC8gZnMpICsgMSkgPj4gMTsKKyAgZGVzaXJlZEJvcmRlciA9ICgoKDIwNDgwMDAgKiAyKSAvIGZzKSArIDEpID4+IDE7CiAKLSAgZGVzaXJlZEJvcmRlciA9IGZpbmRDbG9zZXN0RW50cnkoZGVzaXJlZEJvcmRlciwgdl9rX21hc3RlciwgbnVtTWFzdGVyLCAxKTsgLyogQWRhcHQgcmVnaW9uIHRvIG1hc3Rlci10YWJsZSAqLworICBkZXNpcmVkQm9yZGVyID0gZmluZENsb3Nlc3RFbnRyeShkZXNpcmVkQm9yZGVyLCB2X2tfbWFzdGVyLCBudW1NYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOyAvKiBBZGFwdCByZWdpb24gdG8gbWFzdGVyLXRhYmxlICovCiAKICAgLyogRmlyc3QgcGF0Y2ggKi8KICAgc291cmNlU3RhcnRCYW5kID0gU0hJRlRfU1RBUlRfU0IgKyB4b3Zlck9mZnNldDsKICAgdGFyZ2V0U3RvcEJhbmQgPSBsc2IgKyB4b3Zlck9mZnNldDsgLyogdXBwZXJCYW5kICovCiAKLSAgLyogRXZlbiAob2RkKSBudW1iZXJlZCBjaGFubmVsIG11c3QgYmUgcGF0Y2hlZCB0byBldmVuIChvZGQpIG51bWJlcmVkIGNoYW5uZWwgKi8KKyAgLyogRXZlbiAob2RkKSBudW1iZXJlZCBjaGFubmVsIG11c3QgYmUgcGF0Y2hlZCB0byBldmVuIChvZGQpIG51bWJlcmVkIGNoYW5uZWwKKyAgICovCiAgIHBhdGNoID0gMDsKLSAgd2hpbGUodGFyZ2V0U3RvcEJhbmQgPCB1c2IpIHsKLQorICB3aGlsZSAodGFyZ2V0U3RvcEJhbmQgPCB1c2IpIHsKICAgICAvKiBUb28gbWFueSBwYXRjaGVzPwogICAgICAgIEFsbG93IE1BWF9OVU1fUEFUQ0hFUysxIHBhdGNoZXMgaGVyZS4KICAgICAgICB3ZSBuZWVkIHRvIGNoZWNrIGxhdGVyIGFnYWluLCBzaW5jZSBwYXRjaCBtaWdodCBiZSB0aGUgaGlnaGVzdCBwYXRjaAotICAgICAgIEFORCBjb250YWluIGxlc3MgdGhhbiAzIGJhbmRzID0+IGFjdHVhbCBudW1iZXIgb2YgcGF0Y2hlcyB3aWxsIGJlIHJlZHVjZWQgYnkgMS4KKyAgICAgICBBTkQgY29udGFpbiBsZXNzIHRoYW4gMyBiYW5kcyA9PiBhY3R1YWwgbnVtYmVyIG9mIHBhdGNoZXMgd2lsbCBiZSByZWR1Y2VkCisgICAgICAgYnkgMS4KICAgICAqLwogICAgIGlmIChwYXRjaCA+IE1BWF9OVU1fUEFUQ0hFUykgewogICAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CkBAIC05MDAsMjYgKzEzNDQsNDIgQEAKICAgICBwYXRjaFBhcmFtW3BhdGNoXS5ndWFyZFN0YXJ0QmFuZCA9IHRhcmdldFN0b3BCYW5kOwogICAgIHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldFN0YXJ0QmFuZCA9IHRhcmdldFN0b3BCYW5kOwogCi0gICAgbnVtQmFuZHNJblBhdGNoID0gZGVzaXJlZEJvcmRlciAtIHRhcmdldFN0b3BCYW5kOyAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIGRlc2lyZWQgcmFuZ2Ugb2YgdGhlIHBhdGNoICovCisgICAgbnVtQmFuZHNJblBhdGNoID0KKyAgICAgICAgZGVzaXJlZEJvcmRlciAtIHRhcmdldFN0b3BCYW5kOyAvKiBHZXQgdGhlIGRlc2lyZWQgcmFuZ2Ugb2YgdGhlIHBhdGNoICovCiAKLSAgICBpZiAoIG51bUJhbmRzSW5QYXRjaCA+PSBsc2IgLSBzb3VyY2VTdGFydEJhbmQgKSB7CisgICAgaWYgKG51bUJhbmRzSW5QYXRjaCA+PSBsc2IgLSBzb3VyY2VTdGFydEJhbmQpIHsKICAgICAgIC8qIERlc2lyZWQgbnVtYmVyIGJhbmRzIGFyZSBub3QgYXZhaWxhYmxlIC0+IHBhdGNoIHdob2xlIHNvdXJjZSByYW5nZSAqLwotICAgICAgcGF0Y2hEaXN0YW5jZSAgID0gdGFyZ2V0U3RvcEJhbmQgLSBzb3VyY2VTdGFydEJhbmQ7ICAgICAgICAvKiBHZXQgdGhlIHRhcmdldE9mZnNldCAqLwotICAgICAgcGF0Y2hEaXN0YW5jZSAgID0gcGF0Y2hEaXN0YW5jZSAmIH4xOyAgICAgICAgICAgICAgICAgICAgICAvKiBSb3VuZGluZyBvZmYgb2RkIG51bWJlcnMgYW5kIG1ha2UgYWxsIGV2ZW4gKi8KLSAgICAgIG51bUJhbmRzSW5QYXRjaCA9IGxzYiAtICh0YXJnZXRTdG9wQmFuZCAtIHBhdGNoRGlzdGFuY2UpOyAgLyogVXBkYXRlIG51bWJlciBvZiBiYW5kcyB0byBiZSBwYXRjaGVkICovCi0gICAgICBudW1CYW5kc0luUGF0Y2ggPSBmaW5kQ2xvc2VzdEVudHJ5KHRhcmdldFN0b3BCYW5kICsgbnVtQmFuZHNJblBhdGNoLCB2X2tfbWFzdGVyLCBudW1NYXN0ZXIsIDApIC0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFN0b3BCYW5kOyAgLyogQWRhcHQgcmVnaW9uIHRvIG1hc3Rlci10YWJsZSAqLworICAgICAgcGF0Y2hEaXN0YW5jZSA9CisgICAgICAgICAgdGFyZ2V0U3RvcEJhbmQgLSBzb3VyY2VTdGFydEJhbmQ7IC8qIEdldCB0aGUgdGFyZ2V0T2Zmc2V0ICovCisgICAgICBwYXRjaERpc3RhbmNlID0KKyAgICAgICAgICBwYXRjaERpc3RhbmNlICYgfjE7IC8qIFJvdW5kaW5nIG9mZiBvZGQgbnVtYmVycyBhbmQgbWFrZSBhbGwgZXZlbiAqLworICAgICAgbnVtQmFuZHNJblBhdGNoID0KKyAgICAgICAgICBsc2IgLSAodGFyZ2V0U3RvcEJhbmQgLQorICAgICAgICAgICAgICAgICBwYXRjaERpc3RhbmNlKTsgLyogVXBkYXRlIG51bWJlciBvZiBiYW5kcyB0byBiZSBwYXRjaGVkICovCisgICAgICBudW1CYW5kc0luUGF0Y2ggPSBmaW5kQ2xvc2VzdEVudHJ5KHRhcmdldFN0b3BCYW5kICsgbnVtQmFuZHNJblBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X2tfbWFzdGVyLCBudW1NYXN0ZXIsIDApIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFN0b3BCYW5kOyAvKiBBZGFwdCByZWdpb24gdG8gbWFzdGVyLXRhYmxlICovCiAgICAgfQogCi0gICAgLyogRGVzaXJlZCBudW1iZXIgYmFuZHMgYXJlIGF2YWlsYWJsZSAtPiBnZXQgdGhlIG1pbmltYWwgZXZlbiBwYXRjaGluZyBkaXN0YW5jZSAqLwotICAgIHBhdGNoRGlzdGFuY2UgICA9IG51bUJhbmRzSW5QYXRjaCArIHRhcmdldFN0b3BCYW5kIC0gbHNiOyAgLyogR2V0IG1pbmltYWwgZGlzdGFuY2UgKi8KLSAgICBwYXRjaERpc3RhbmNlICAgPSAocGF0Y2hEaXN0YW5jZSArIDEpICYgfjE7ICAgICAgICAgICAgICAgIC8qIFJvdW5kaW5nIHVwIG9kZCBudW1iZXJzIGFuZCBtYWtlIGFsbCBldmVuICovCisgICAgaWYgKHBTZXR0aW5ncy0+bkNvbHMgPT0gNjQpIHsKKyAgICAgIGlmIChudW1CYW5kc0luUGF0Y2ggPT0gMCAmJiBzb3VyY2VTdGFydEJhbmQgPT0gU0hJRlRfU1RBUlRfU0IpIHsKKyAgICAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CisgICAgICB9CisgICAgfQorCisgICAgLyogRGVzaXJlZCBudW1iZXIgYmFuZHMgYXJlIGF2YWlsYWJsZSAtPiBnZXQgdGhlIG1pbmltYWwgZXZlbiBwYXRjaGluZworICAgICAqIGRpc3RhbmNlICovCisgICAgcGF0Y2hEaXN0YW5jZSA9CisgICAgICAgIG51bUJhbmRzSW5QYXRjaCArIHRhcmdldFN0b3BCYW5kIC0gbHNiOyAvKiBHZXQgbWluaW1hbCBkaXN0YW5jZSAqLworICAgIHBhdGNoRGlzdGFuY2UgPSAocGF0Y2hEaXN0YW5jZSArIDEpICYKKyAgICAgICAgICAgICAgICAgICAgfjE7IC8qIFJvdW5kaW5nIHVwIG9kZCBudW1iZXJzIGFuZCBtYWtlIGFsbCBldmVuICovCiAKICAgICBpZiAobnVtQmFuZHNJblBhdGNoID4gMCkgewogICAgICAgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RhcnRCYW5kID0gdGFyZ2V0U3RvcEJhbmQgLSBwYXRjaERpc3RhbmNlOwotICAgICAgcGF0Y2hQYXJhbVtwYXRjaF0udGFyZ2V0QmFuZE9mZnMgID0gcGF0Y2hEaXN0YW5jZTsKKyAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldEJhbmRPZmZzID0gcGF0Y2hEaXN0YW5jZTsKICAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLm51bUJhbmRzSW5QYXRjaCA9IG51bUJhbmRzSW5QYXRjaDsKLSAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0b3BCYW5kICA9IHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0YXJ0QmFuZCArIG51bUJhbmRzSW5QYXRjaDsKKyAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0b3BCYW5kID0KKyAgICAgICAgICBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdGFydEJhbmQgKyBudW1CYW5kc0luUGF0Y2g7CiAKICAgICAgIHRhcmdldFN0b3BCYW5kICs9IHBhdGNoUGFyYW1bcGF0Y2hdLm51bUJhbmRzSW5QYXRjaDsKICAgICAgIHBhdGNoKys7CkBAIC05MjksMTkgKzEzODksMTkgQEAKICAgICBzb3VyY2VTdGFydEJhbmQgPSBTSElGVF9TVEFSVF9TQjsKIAogICAgIC8qIENoZWNrIGlmIHdlIGFyZSBjbG9zZSB0byBkZXNpcmVkQm9yZGVyICovCi0gICAgaWYoIGRlc2lyZWRCb3JkZXIgLSB0YXJnZXRTdG9wQmFuZCA8IDMpICAvKiBNUEVHIGRvYyAqLworICAgIGlmIChkZXNpcmVkQm9yZGVyIC0gdGFyZ2V0U3RvcEJhbmQgPCAzKSAvKiBNUEVHIGRvYyAqLwogICAgIHsKICAgICAgIGRlc2lyZWRCb3JkZXIgPSB1c2I7CiAgICAgfQotCiAgIH0KIAogICBwYXRjaC0tOwogCiAgIC8qIElmIGhpZ2hlc3QgcGF0Y2ggY29udGFpbnMgbGVzcyB0aGFuIHRocmVlIHN1YmJhbmQ6IHNraXAgaXQgKi8KLSAgaWYgKCAocGF0Y2g+MCkgJiYgKHBhdGNoUGFyYW1bcGF0Y2hdLm51bUJhbmRzSW5QYXRjaCA8IDMpICkgeworICBpZiAoKHBhdGNoID4gMCkgJiYgKHBhdGNoUGFyYW1bcGF0Y2hdLm51bUJhbmRzSW5QYXRjaCA8IDMpKSB7CiAgICAgcGF0Y2gtLTsKLSAgICB0YXJnZXRTdG9wQmFuZCA9IHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldFN0YXJ0QmFuZCArIHBhdGNoUGFyYW1bcGF0Y2hdLm51bUJhbmRzSW5QYXRjaDsKKyAgICB0YXJnZXRTdG9wQmFuZCA9CisgICAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldFN0YXJ0QmFuZCArIHBhdGNoUGFyYW1bcGF0Y2hdLm51bUJhbmRzSW5QYXRjaDsKICAgfQogCiAgIC8qIG5vdyBjaGVjayBpZiB3ZSBkb24ndCBoYXZlIG9uZSB0b28gbWFueSAqLwpAQCAtOTUzLDMxICsxNDEzLDM2IEBACiAKICAgLyogQ2hlY2sgbG93ZXN0IGFuZCBoaWdoZXN0IHNvdXJjZSBzdWJiYW5kICovCiAgIHBTZXR0aW5ncy0+bGJTdGFydFBhdGNoaW5nID0gdGFyZ2V0U3RvcEJhbmQ7Ci0gIHBTZXR0aW5ncy0+bGJTdG9wUGF0Y2hpbmcgID0gMDsKLSAgZm9yICggcGF0Y2ggPSAwOyBwYXRjaCA8IHBTZXR0aW5ncy0+bm9PZlBhdGNoZXM7IHBhdGNoKysgKSB7Ci0gICAgcFNldHRpbmdzLT5sYlN0YXJ0UGF0Y2hpbmcgPSBmaXhNaW4oIHBTZXR0aW5ncy0+bGJTdGFydFBhdGNoaW5nLCBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdGFydEJhbmQgKTsKLSAgICBwU2V0dGluZ3MtPmxiU3RvcFBhdGNoaW5nICA9IGZpeE1heCggcFNldHRpbmdzLT5sYlN0b3BQYXRjaGluZywgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RvcEJhbmQgKTsKKyAgcFNldHRpbmdzLT5sYlN0b3BQYXRjaGluZyA9IDA7CisgIGZvciAocGF0Y2ggPSAwOyBwYXRjaCA8IHBTZXR0aW5ncy0+bm9PZlBhdGNoZXM7IHBhdGNoKyspIHsKKyAgICBwU2V0dGluZ3MtPmxiU3RhcnRQYXRjaGluZyA9CisgICAgICAgIGZpeE1pbihwU2V0dGluZ3MtPmxiU3RhcnRQYXRjaGluZywgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RhcnRCYW5kKTsKKyAgICBwU2V0dGluZ3MtPmxiU3RvcFBhdGNoaW5nID0KKyAgICAgICAgZml4TWF4KHBTZXR0aW5ncy0+bGJTdG9wUGF0Y2hpbmcsIHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0b3BCYW5kKTsKICAgfQogCi0gIGZvcihpID0gMCA7IGkgPCBub05vaXNlQmFuZHM7IGkrKyl7Ci0gICAgcFNldHRpbmdzLT5id0JvcmRlcnNbaV0gPSBub2lzZUJhbmRUYWJsZVtpKzFdOworICBmb3IgKGkgPSAwOyBpIDwgbm9Ob2lzZUJhbmRzOyBpKyspIHsKKyAgICBwU2V0dGluZ3MtPmJ3Qm9yZGVyc1tpXSA9IG5vaXNlQmFuZFRhYmxlW2kgKyAxXTsKKyAgfQorICBmb3IgKDsgaSA8IE1BWF9OVU1fTk9JU0VfVkFMVUVTOyBpKyspIHsKKyAgICBwU2V0dGluZ3MtPmJ3Qm9yZGVyc1tpXSA9IDI1NTsKICAgfQogCiAgIC8qCiAgICAqIENob29zZSB3aGl0ZW5pbmcgZmFjdG9ycwogICAgKi8KIAotICBzdGFydEZyZXFIeiA9ICggKGxzYiArIHhvdmVyT2Zmc2V0KSpmcyApID4+IDc7ICAvKiBTaGlmdCBkb2VzIGEgZGl2aXNpb24gYnkgMiooNjQpICovCisgIHN0YXJ0RnJlcUh6ID0KKyAgICAgICgobHNiICsgeG92ZXJPZmZzZXQpICogZnMpID4+IDc7IC8qIFNoaWZ0IGRvZXMgYSBkaXZpc2lvbiBieSAyKig2NCkgKi8KIAotICBmb3IoIGkgPSAxOyBpIDwgTlVNX1dIRkFDVE9SX1RBQkxFX0VOVFJJRVM7IGkrKyApCi0gIHsKLSAgICBpZiggc3RhcnRGcmVxSHogPCBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzSW5kZXhbaV0pCi0gICAgICBicmVhazsKKyAgZm9yIChpID0gMTsgaSA8IE5VTV9XSEZBQ1RPUl9UQUJMRV9FTlRSSUVTOyBpKyspIHsKKyAgICBpZiAoc3RhcnRGcmVxSHogPCBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzSW5kZXhbaV0pIGJyZWFrOwogICB9CiAgIGktLTsKIAogICBwU2V0dGluZ3MtPndoRmFjdG9ycy5vZmYgPSBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzVGFibGVbaV1bMF07Ci0gIHBTZXR0aW5ncy0+d2hGYWN0b3JzLnRyYW5zaXRpb25MZXZlbCA9IEZES19zYnJEZWNvZGVyX3Nicl93aEZhY3RvcnNUYWJsZVtpXVsxXTsKKyAgcFNldHRpbmdzLT53aEZhY3RvcnMudHJhbnNpdGlvbkxldmVsID0KKyAgICAgIEZES19zYnJEZWNvZGVyX3Nicl93aEZhY3RvcnNUYWJsZVtpXVsxXTsKICAgcFNldHRpbmdzLT53aEZhY3RvcnMubG93TGV2ZWwgPSBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzVGFibGVbaV1bMl07CiAgIHBTZXR0aW5ncy0+d2hGYWN0b3JzLm1pZExldmVsID0gRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc1RhYmxlW2ldWzNdOwogICBwU2V0dGluZ3MtPndoRmFjdG9ycy5oaWdoTGV2ZWwgPSBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzVGFibGVbaV1bNF07CmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL2xwcF90cmFuLmggYi9saWJTQlJkZWMvc3JjL2xwcF90cmFuLmgKaW5kZXggMDAzYTU0Ny4uNTFiNDM5NSAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9scHBfdHJhbi5oCisrKyBiL2xpYlNCUmRlYy9zcmMvbHBwX3RyYW4uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNjQgKzkwLDE4NiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIExvdyBQb3dlciBQcm9maWxlIFRyYW5zcG9zZXIsICAKKyAgXGJyaWVmICBMb3cgUG93ZXIgUHJvZmlsZSBUcmFuc3Bvc2VyCiAqLwogCi0jaWZuZGVmIF9MUFBfVFJBTlNfSAotI2RlZmluZSBfTFBQX1RSQU5TX0gKKyNpZm5kZWYgTFBQX1RSQU5fSAorI2RlZmluZSBMUFBfVFJBTl9ICiAKICNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCisjaW5jbHVkZSAiaGJlLmgiCiAjaW5jbHVkZSAicW1mLmgiCiAKIC8qCiAgIENvbW1vbgogKi8KLSNkZWZpbmUgUU1GX09VVF9TQ0FMRSAgICAgICAgICAgIDgKKyNkZWZpbmUgUU1GX09VVF9TQ0FMRSA4CisKKy8qCisgIEZyZXF1ZW5jeSBzY2FsZXMKKyovCiAKIC8qCiAgIEVudi1BZGp1c3QKICovCi0jZGVmaW5lIE1BWF9OT0lTRV9FTlZFTE9QRVMgICAgICAyCi0jZGVmaW5lIE1BWF9OT0lTRV9DT0VGRlMgICAgICAgICA1Ci0jZGVmaW5lIE1BWF9OVU1fTk9JU0VfVkFMVUVTICAgICAoTUFYX05PSVNFX0VOVkVMT1BFUyAqIE1BWF9OT0lTRV9DT0VGRlMpCi0jZGVmaW5lIE1BWF9OVU1fTElNSVRFUlMgICAgICAgICAxMgorI2RlZmluZSBNQVhfTk9JU0VfRU5WRUxPUEVTIDIKKyNkZWZpbmUgTUFYX05PSVNFX0NPRUZGUyA1CisjZGVmaW5lIE1BWF9OVU1fTk9JU0VfVkFMVUVTIChNQVhfTk9JU0VfRU5WRUxPUEVTICogTUFYX05PSVNFX0NPRUZGUykKKyNkZWZpbmUgTUFYX05VTV9MSU1JVEVSUyAxMgogCiAvKiBTZXQgTUFYX0VOVkVMT1BFUyB0byB0aGUgbGFyZ2VzdCB2YWx1ZSBvZiBhbGwgc3VwcG9ydGVkIEJTRk9STUFUcwogICAgYnkgb3ZlcnJpZGluZyBNQVhfRU5WRUxPUEVTIGluIHRoZSBjb3JyZWN0IG9yZGVyOiAqLwotI2RlZmluZSBNQVhfRU5WRUxPUEVTX0hFQUFDICAgICAgNQotI2RlZmluZSBNQVhfRU5WRUxPUEVTICAgICAgICAgICAgTUFYX0VOVkVMT1BFU19IRUFBQworI2RlZmluZSBNQVhfRU5WRUxPUEVTX0xFR0FDWSA1CisjZGVmaW5lIE1BWF9FTlZFTE9QRVNfVVNBQyA4CisjZGVmaW5lIE1BWF9FTlZFTE9QRVMgTUFYX0VOVkVMT1BFU19VU0FDCiAKLSNkZWZpbmUgTUFYX0ZSRVFfQ09FRkZTICAgICAgICAgIDQ4Ci0jZGVmaW5lIE1BWF9GUkVRX0NPRUZGU19GUzQ0MTAwICAzNQotI2RlZmluZSBNQVhfRlJFUV9DT0VGRlNfRlM0ODAwMCAgMzIKKyNkZWZpbmUgTUFYX0ZSRVFfQ09FRkZTX0RVQUxfUkFURSA0OAorI2RlZmluZSBNQVhfRlJFUV9DT0VGRlNfUVVBRF9SQVRFIDU2CisjZGVmaW5lIE1BWF9GUkVRX0NPRUZGUyBNQVhfRlJFUV9DT0VGRlNfUVVBRF9SQVRFCiAKKyNkZWZpbmUgTUFYX0ZSRVFfQ09FRkZTX0ZTNDQxMDAgMzUKKyNkZWZpbmUgTUFYX0ZSRVFfQ09FRkZTX0ZTNDgwMDAgMzIKIAotI2RlZmluZSBNQVhfTlVNX0VOVkVMT1BFX1ZBTFVFUyAgKE1BWF9FTlZFTE9QRVMgKiBNQVhfRlJFUV9DT0VGRlMpCisjZGVmaW5lIE1BWF9OVU1fRU5WRUxPUEVfVkFMVUVTIChNQVhfRU5WRUxPUEVTICogTUFYX0ZSRVFfQ09FRkZTKQogCi0jZGVmaW5lIE1BWF9HQUlOX0VYUCAgICAgICAgICAgICAzNAorI2RlZmluZSBNQVhfR0FJTl9FWFAgMzQKIC8qIE1heGltdW0gZ2FpbiB3aWxsIGJlIHNxcnQoMC41ICogMl5NQVhfR0FJTl9FWFApCiAgICBleGFtcGxlOiAzND05OWRCICAgKi8KLSNkZWZpbmUgTUFYX0dBSU5fQ09OQ0VBTF9FWFAgICAgIDEKLS8qIE1heGltdW0gZ2FpbiB3aWxsIGJlIHNxcnQoMC41ICogMl5NQVhfR0FJTl9DT05DRUFMX0VYUCkgaW4gY29uY2VhbG1lbnQgY2FzZSAoMGRCKSAqLworI2RlZmluZSBNQVhfR0FJTl9DT05DRUFMX0VYUCAxCisvKiBNYXhpbXVtIGdhaW4gd2lsbCBiZSBzcXJ0KDAuNSAqIDJeTUFYX0dBSU5fQ09OQ0VBTF9FWFApIGluIGNvbmNlYWxtZW50IGNhc2UKKyAqICgwZEIpICovCiAKIC8qCiAgIExQUCBUcmFuc3Bvc2VyCiAqLwotI2RlZmluZSBMUENfT1JERVIgICAgICAgICAgICAgICAgMgorI2RlZmluZSBMUENfT1JERVIgMgogCi0jZGVmaW5lIE1BWF9JTlZGX0JBTkRTICAgICAgICAgICBNQVhfTk9JU0VfQ09FRkZTCisjZGVmaW5lIE1BWF9JTlZGX0JBTkRTIE1BWF9OT0lTRV9DT0VGRlMKIAotI2RlZmluZSBNQVhfTlVNX1BBVENIRVMgICAgICAgICAgNgotI2RlZmluZSBTSElGVF9TVEFSVF9TQiAgICAgICAgICAgMSAgICAgICAgICAgICAgLyohPCBsb3dlc3Qgc3ViYmFuZCBvZiBzb3VyY2UgcmFuZ2UgKi8KKyNkZWZpbmUgTUFYX05VTV9QQVRDSEVTIDYKKyNkZWZpbmUgU0hJRlRfU1RBUlRfU0IgMSAvKiE8IGxvd2VzdCBzdWJiYW5kIG9mIHNvdXJjZSByYW5nZSAqLwogCi10eXBlZGVmIGVudW0KLXsKK3R5cGVkZWYgZW51bSB7CiAgIElOVkZfT0ZGID0gMCwKICAgSU5WRl9MT1dfTEVWRUwsCiAgIElOVkZfTUlEX0xFVkVMLAogICBJTlZGX0hJR0hfTEVWRUwsCiAgIElOVkZfU1dJVENIRUQgLyogbm90IGEgcmVhbCBjaG9pY2UgYnV0IHVzZWQgaGVyZSB0byBjb250cm9sIGJlaGF2aW91ciAqLwotfQotSU5WRl9NT0RFOwotCit9IElOVkZfTU9ERTsKIAogLyoqIHBhcmFtZXRlciBzZXQgZm9yIG9uZSBzaW5nbGUgcGF0Y2ggKi8KIHR5cGVkZWYgc3RydWN0IHsKLSAgVUNIQVIgIHNvdXJjZVN0YXJ0QmFuZDsgICAvKiE8IGZpcnN0IGJhbmQgaW4gbG93YmFuZHMgd2hlcmUgdG8gdGFrZSB0aGUgc2FtcGxlcyBmcm9tICovCi0gIFVDSEFSICBzb3VyY2VTdG9wQmFuZDsgICAgLyohPCBmaXJzdCBiYW5kIGluIGxvd2JhbmRzIHdoaWNoIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcGF0Y2ggYW55bW9yZSAqLwotICBVQ0hBUiAgZ3VhcmRTdGFydEJhbmQ7ICAgIC8qITwgZmlyc3QgYmFuZCBpbiBoaWdoYmFuZHMgdG8gYmUgZmlsbGVkIHdpdGggemVyb3MgaW4gb3JkZXIgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWNlIGludGVyZmVyZW5jZXMgYmV0d2VlbiBwYXRjaGVzICovCi0gIFVDSEFSICB0YXJnZXRTdGFydEJhbmQ7ICAgLyohPCBmaXJzdCBiYW5kIGluIGhpZ2hiYW5kcyB0byBiZSBmaWxsZWQgd2l0aCB3aGl0ZW5lZCBsb3diYW5kIHNpZ25hbCAqLwotICBVQ0hBUiAgdGFyZ2V0QmFuZE9mZnM7ICAgIC8qITwgZGlmZmVyZW5jZSBiZXR3ZWVuICdzdGFydFRhcmdldEJhbmQnIGFuZCAnc3RhcnRTb3VyY2VCYW5kJyAqLwotICBVQ0hBUiAgbnVtQmFuZHNJblBhdGNoOyAgIC8qITwgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGJhbmRzIGluIHRoaXMgb25lIHBhdGNoICovCisgIFVDSEFSIHNvdXJjZVN0YXJ0QmFuZDsgLyohPCBmaXJzdCBiYW5kIGluIGxvd2JhbmRzIHdoZXJlIHRvIHRha2UgdGhlIHNhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICovCisgIFVDSEFSCisgIHNvdXJjZVN0b3BCYW5kOyAgICAgICAvKiE8IGZpcnN0IGJhbmQgaW4gbG93YmFuZHMgd2hpY2ggaXMgbm90IGluY2x1ZGVkIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2ggYW55bW9yZSAqLworICBVQ0hBUiBndWFyZFN0YXJ0QmFuZDsgLyohPCBmaXJzdCBiYW5kIGluIGhpZ2hiYW5kcyB0byBiZSBmaWxsZWQgd2l0aCB6ZXJvcyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIgdG8gcmVkdWNlIGludGVyZmVyZW5jZXMgYmV0d2VlbiBwYXRjaGVzICovCisgIFVDSEFSCisgIHRhcmdldFN0YXJ0QmFuZDsgICAgICAgLyohPCBmaXJzdCBiYW5kIGluIGhpZ2hiYW5kcyB0byBiZSBmaWxsZWQgd2l0aCB3aGl0ZW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2JhbmQgc2lnbmFsICovCisgIFVDSEFSIHRhcmdldEJhbmRPZmZzOyAgLyohPCBkaWZmZXJlbmNlIGJldHdlZW4gJ3N0YXJ0VGFyZ2V0QmFuZCcgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXJ0U291cmNlQmFuZCcgKi8KKyAgVUNIQVIgbnVtQmFuZHNJblBhdGNoOyAvKiE8IG51bWJlciBvZiBjb25zZWN1dGl2ZSBiYW5kcyBpbiB0aGlzIG9uZSBwYXRjaCAqLwogfSBQQVRDSF9QQVJBTTsKIAotCiAvKiogd2hpdGVuaW5nIGZhY3RvcnMgZm9yIGRpZmZlcmVudCBsZXZlbHMgb2Ygd2hpdGVuaW5nCiAgICAgbmVlZCB0byBiZSBpbml0aWFsaXplZCBjb3JyZXNwb25kaW5nIHRvIGNyb3Nzb3ZlciBmcmVxdWVuY3kgKi8KIHR5cGVkZWYgc3RydWN0IHsKLSAgRklYUF9EQkwgIG9mZjsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgYncgZmFjdG9yIGZvciBzaWduYWwgT0ZGICovCi0gIEZJWFBfREJMICB0cmFuc2l0aW9uTGV2ZWw7Ci0gIEZJWFBfREJMICBsb3dMZXZlbDsgICAgICAgICAgICAgICAgICAvKiE8IGJ3IGZhY3RvciBmb3Igc2lnbmFsIExPV19MRVZFTCAqLwotICBGSVhQX0RCTCAgbWlkTGV2ZWw7ICAgICAgICAgICAgICAgICAgLyohPCBidyBmYWN0b3IgZm9yIHNpZ25hbCBNSURfTEVWRUwgKi8KLSAgRklYUF9EQkwgIGhpZ2hMZXZlbDsgICAgICAgICAgICAgICAgIC8qITwgYncgZmFjdG9yIGZvciBzaWduYWwgSElHSF9MRVZFTCAqLworICBGSVhQX0RCTCBvZmY7IC8qITwgYncgZmFjdG9yIGZvciBzaWduYWwgT0ZGICovCisgIEZJWFBfREJMIHRyYW5zaXRpb25MZXZlbDsKKyAgRklYUF9EQkwgbG93TGV2ZWw7ICAvKiE8IGJ3IGZhY3RvciBmb3Igc2lnbmFsIExPV19MRVZFTCAqLworICBGSVhQX0RCTCBtaWRMZXZlbDsgIC8qITwgYncgZmFjdG9yIGZvciBzaWduYWwgTUlEX0xFVkVMICovCisgIEZJWFBfREJMIGhpZ2hMZXZlbDsgLyohPCBidyBmYWN0b3IgZm9yIHNpZ25hbCBISUdIX0xFVkVMICovCiB9IFdISVRFTklOR19GQUNUT1JTOwogCi0KLS8qISBUaGUgdHJhbnNwb3NlciBzZXR0aW5ncyBhcmUgY2FsY3VsYXRlZCBvbiBhIGhlYWRlciByZXNldCBhbmQgYXJlIHNoYXJlZCBieSBib3RoIGNoYW5uZWxzLiAqLworLyohIFRoZSB0cmFuc3Bvc2VyIHNldHRpbmdzIGFyZSBjYWxjdWxhdGVkIG9uIGEgaGVhZGVyIHJlc2V0IGFuZCBhcmUgc2hhcmVkIGJ5CisgKiBib3RoIGNoYW5uZWxzLiAqLwogdHlwZWRlZiBzdHJ1Y3QgewotICBVQ0hBUiAgbkNvbHM7ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBzdWJzYW1wbGVzIG9mIGEgY29kZWMgZnJhbWUgKi8KLSAgVUNIQVIgIG5vT2ZQYXRjaGVzOyAgICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgcGF0Y2hlcyAqLwotICBVQ0hBUiAgbGJTdGFydFBhdGNoaW5nOyAgICAgICAgICAgICAvKiE8IGZpcnN0IGJhbmQgb2YgbG93YmFuZHMgdGhhdCB3aWxsIGJlIHBhdGNoZWQgKi8KLSAgVUNIQVIgIGxiU3RvcFBhdGNoaW5nOyAgICAgICAgICAgICAgLyohPCBmaXJzdCBiYW5kIHRoYXQgd29uJ3QgYmUgcGF0Y2hlZCBhbnltb3JlKi8KLSAgVUNIQVIgIGJ3Qm9yZGVyc1tNQVhfTlVNX05PSVNFX1ZBTFVFU107IC8qITwgc3BlY3RyYWwgYmFuZHMgd2l0aCBkaWZmZXJlbnQgaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWxzICovCisgIFVDSEFSIG5Db2xzOyAgICAgICAgICAgLyohPCBudW1iZXIgc3Vic2FtcGxlcyBvZiBhIGNvZGVjIGZyYW1lICovCisgIFVDSEFSIG5vT2ZQYXRjaGVzOyAgICAgLyohPCBudW1iZXIgb2YgcGF0Y2hlcyAqLworICBVQ0hBUiBsYlN0YXJ0UGF0Y2hpbmc7IC8qITwgZmlyc3QgYmFuZCBvZiBsb3diYW5kcyB0aGF0IHdpbGwgYmUgcGF0Y2hlZCAqLworICBVQ0hBUiBsYlN0b3BQYXRjaGluZzsgIC8qITwgZmlyc3QgYmFuZCB0aGF0IHdvbid0IGJlIHBhdGNoZWQgYW55bW9yZSovCisgIFVDSEFSIGJ3Qm9yZGVyc1tNQVhfTlVNX05PSVNFX1ZBTFVFU107IC8qITwgc3BlY3RyYWwgYmFuZHMgd2l0aCBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWxzICovCiAKLSAgUEFUQ0hfUEFSQU0gICAgcGF0Y2hQYXJhbVtNQVhfTlVNX1BBVENIRVNdOyAvKiE8IG5ldyBwYXJhbWV0ZXIgc2V0IGZvciBwYXRjaGluZyAqLwotICBXSElURU5JTkdfRkFDVE9SUyB3aEZhY3RvcnM7ICAgICAgICAgICAgICAgIC8qITwgdGhlIHBvbGUgbW92aW5nIGZhY3RvcnMgZm9yIGNlcnRhaW4gd2hpdGVuaW5nIGxldmVscyBhcyBpbmRpY2F0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXRzdHJlYW0gZGVwZW5kaW5nIG9uIHRoZSBjcm9zc292ZXIgZnJlcXVlbmN5ICovCi0gIFVDSEFSICBvdmVybGFwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPdmVybGFwIHNpemUgKi8KKyAgUEFUQ0hfUEFSQU0KKyAgcGF0Y2hQYXJhbVtNQVhfTlVNX1BBVENIRVNdOyAvKiE8IG5ldyBwYXJhbWV0ZXIgc2V0IGZvciBwYXRjaGluZyAqLworICBXSElURU5JTkdfRkFDVE9SUworICB3aEZhY3RvcnM7ICAgICAvKiE8IHRoZSBwb2xlIG1vdmluZyBmYWN0b3JzIGZvciBjZXJ0YWluCisgICAgICAgICAgICAgICAgICAgIHdoaXRlbmluZyBsZXZlbHMgYXMgaW5kaWNhdGVkICAgICBpbiB0aGUgYml0c3RyZWFtCisgICAgICAgICAgICAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgY3Jvc3NvdmVyIGZyZXF1ZW5jeSAqLworICBVQ0hBUiBvdmVybGFwOyAvKiE8IE92ZXJsYXAgc2l6ZSAqLwogfSBUUkFOU1BPU0VSX1NFVFRJTkdTOwogCit0eXBlZGVmIHN0cnVjdCB7CisgIFRSQU5TUE9TRVJfU0VUVElOR1MgKnBTZXR0aW5nczsgLyohPCBDb21tb24gc2V0dGluZ3MgZm9yIGJvdGggY2hhbm5lbHMgKi8KKyAgRklYUF9EQkwKKyAgYndWZWN0b3JPbGRbTUFYX05VTV9QQVRDSEVTXTsgLyohPCBwb2xlIG1vdmluZyBmYWN0b3JzIG9mIHBhc3QgZnJhbWUgKi8KKyAgRklYUF9EQkwgbHBjRmlsdGVyU3RhdGVzUmVhbExlZ1NCUltMUENfT1JERVIgKyAoMyAqICg0KSldWygKKyAgICAgIDMyKV07IC8qITwgcG9pbnRlciBhcnJheSB0byBzYXZlIGZpbHRlciBzdGF0ZXMgKi8KIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgVFJBTlNQT1NFUl9TRVRUSU5HUyAqcFNldHRpbmdzOyAgICAgICAgICAgICAgICAvKiE8IENvbW1vbiBzZXR0aW5ncyBmb3IgYm90aCBjaGFubmVscyAqLwotICBGSVhQX0RCTCAgYndWZWN0b3JPbGRbTUFYX05VTV9QQVRDSEVTXTsgICAgICAgIC8qITwgcG9sZSBtb3ZpbmcgZmFjdG9ycyBvZiBwYXN0IGZyYW1lICovCi0gIEZJWFBfREJMICBscGNGaWx0ZXJTdGF0ZXNSZWFsW0xQQ19PUkRFUl1bKDMyKV07ICAgICAvKiE8IHBvaW50ZXIgYXJyYXkgdG8gc2F2ZSBmaWx0ZXIgc3RhdGVzICovCi0gIEZJWFBfREJMICBscGNGaWx0ZXJTdGF0ZXNJbWFnW0xQQ19PUkRFUl1bKDMyKV07ICAgICAvKiE8IHBvaW50ZXIgYXJyYXkgdG8gc2F2ZSBmaWx0ZXIgc3RhdGVzICovCi19Ci1TQlJfTFBQX1RSQU5TOworICBGSVhQX0RCTCBscGNGaWx0ZXJTdGF0ZXNJbWFnTGVnU0JSW0xQQ19PUkRFUiArICgzICogKDQpKV1bKAorICAgICAgMzIpXTsgLyohPCBwb2ludGVyIGFycmF5IHRvIHNhdmUgZmlsdGVyIHN0YXRlcyAqLworCisgIEZJWFBfREJMIGxwY0ZpbHRlclN0YXRlc1JlYWxIQkVbTFBDX09SREVSICsgKDMgKiAoNCkpXVsoCisgICAgICA2NCldOyAvKiE8IHBvaW50ZXIgYXJyYXkgdG8gc2F2ZSBmaWx0ZXIgc3RhdGVzICovCisgIEZJWFBfREJMIGxwY0ZpbHRlclN0YXRlc0ltYWdIQkVbTFBDX09SREVSICsgKDMgKiAoNCkpXVsoCisgICAgICA2NCldOyAvKiE8IHBvaW50ZXIgYXJyYXkgdG8gc2F2ZSBmaWx0ZXIgc3RhdGVzICovCit9IFNCUl9MUFBfVFJBTlM7CiAKIHR5cGVkZWYgU0JSX0xQUF9UUkFOUyAqSEFORExFX1NCUl9MUFBfVFJBTlM7CiAKK3ZvaWQgbHBwVHJhbnNwb3NlcihIQU5ETEVfU0JSX0xQUF9UUkFOUyBoTHBwVHJhbnMsCisgICAgICAgICAgICAgICAgICAgUU1GX1NDQUxFX0ZBQ1RPUiAqc2JyU2NhbGVGYWN0b3IsIEZJWFBfREJMICoqcW1mQnVmZmVyUmVhbCwKIAotdm9pZCBscHBUcmFuc3Bvc2VyIChIQU5ETEVfU0JSX0xQUF9UUkFOUyBoTHBwVHJhbnMsCi0gICAgICAgICAgICAgICAgICAgIFFNRl9TQ0FMRV9GQUNUT1IgICpzYnJTY2FsZUZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxbWZCdWZmZXJSZWFsLAorICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpkZWdyZWVBbGlhcywgRklYUF9EQkwgKipxbWZCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB1c2VMUCwgY29uc3QgaW50IGZQcmVXaGl0ZW5pbmcsCisgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHZfa19tYXN0ZXIwLCBjb25zdCBpbnQgdGltZVN0ZXAsCisgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZpcnN0U2xvdE9mZnNldCwgY29uc3QgaW50IGxhc3RTbG90T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuSW52ZkJhbmRzLCBJTlZGX01PREUgKnNicl9pbnZmX21vZGUsCisgICAgICAgICAgICAgICAgICAgSU5WRl9NT0RFICpzYnJfaW52Zl9tb2RlX3ByZXYpOwogCi0gICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpkZWdyZWVBbGlhcywKLSAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxbWZCdWZmZXJJbWFnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdXNlTFAsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0aW1lU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZpcnN0U2xvdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxhc3RTbG90T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbkludmZCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgSU5WRl9NT0RFICpzYnJfaW52Zl9tb2RlLAotICAgICAgICAgICAgICAgICAgICBJTlZGX01PREUgKnNicl9pbnZmX21vZGVfcHJldgotICAgICAgICAgICAgICAgICAgICApOwotCit2b2lkIGxwcFRyYW5zcG9zZXJIQkUoCisgICAgSEFORExFX1NCUl9MUFBfVFJBTlMgaExwcFRyYW5zLCAvKiE8IEhhbmRsZSBvZiBscHAgdHJhbnNwb3NlciAgKi8KKyAgICBIQU5ETEVfSEJFX1RSQU5TUE9TRVIgaFFtZlRyYW5zcG9zZXIsCisgICAgUU1GX1NDQUxFX0ZBQ1RPUiAqc2JyU2NhbGVGYWN0b3IsIC8qITwgU2NhbGluZyBmYWN0b3JzICovCisgICAgRklYUF9EQkwgKipxbWZCdWZmZXJSZWFsLCAvKiE8IFBvaW50ZXIgdG8gcG9pbnRlciB0byByZWFsIHBhcnQgb2Ygc3ViYmFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyAoc291cmNlKSAqLworICAgIEZJWFBfREJMICoqcW1mQnVmZmVySW1hZywgLyohPCBQb2ludGVyIHRvIHBvaW50ZXIgdG8gaW1hZ2luYXJ5IHBhcnQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmJhbmQgc2FtcGxlcyAoc291cmNlKSAqLworICAgIGNvbnN0IGludCB0aW1lU3RlcCwgICAgICAgLyohPCBUaW1lIHN0ZXAgb2YgZW52ZWxvcGUgKi8KKyAgICBjb25zdCBpbnQgZmlyc3RTbG90T2ZmcywgIC8qITwgU3RhcnQgcG9zaXRpb24gaW4gdGltZSAqLworICAgIGNvbnN0IGludCBsYXN0U2xvdE9mZnMsICAgLyohPCBOdW1iZXIgb2Ygb3ZlcmxhcC1zbG90cyBpbnRvIG5leHQgZnJhbWUgKi8KKyAgICBjb25zdCBpbnQgbkludmZCYW5kcywgICAgIC8qITwgTnVtYmVyIG9mIGJhbmRzIGZvciBpbnZlcnNlIGZpbHRlcmluZyAqLworICAgIElOVkZfTU9ERSAqc2JyX2ludmZfbW9kZSwgLyohPCBDdXJyZW50IGludmVyc2UgZmlsdGVyaW5nIG1vZGVzICovCisgICAgSU5WRl9NT0RFICpzYnJfaW52Zl9tb2RlX3ByZXYgLyohPCBQcmV2aW91cyBpbnZlcnNlIGZpbHRlcmluZyBtb2RlcyAqLworKTsKIAogU0JSX0VSUk9SCi1jcmVhdGVMcHBUcmFuc3Bvc2VyIChIQU5ETEVfU0JSX0xQUF9UUkFOUyBoTHBwVHJhbnMsCi0gICAgICAgICAgICAgICAgICAgICBUUkFOU1BPU0VSX1NFVFRJTkdTICpwU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgIGhpZ2hCYW5kU3RhcnRTYiwKLSAgICAgICAgICAgICAgICAgICAgIFVDSEFSICp2X2tfbWFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICBudW1NYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgIHVzYiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgdGltZVNsb3RzLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICBuQ29scywKLSAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpub2lzZUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgbm9Ob2lzZUJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgVUlOVCAgIGZzLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICBjaGFuLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG92ZXJsYXApOwotCitjcmVhdGVMcHBUcmFuc3Bvc2VyKEhBTkRMRV9TQlJfTFBQX1RSQU5TIGhMcHBUcmFucywKKyAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1NFUl9TRVRUSU5HUyAqcFNldHRpbmdzLCBjb25zdCBpbnQgaGlnaEJhbmRTdGFydFNiLAorICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdl9rX21hc3RlciwgY29uc3QgaW50IG51bU1hc3RlciwgY29uc3QgaW50IHVzYiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbWVTbG90cywgY29uc3QgaW50IG5Db2xzLCBVQ0hBUiAqbm9pc2VCYW5kVGFibGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBub05vaXNlQmFuZHMsIFVJTlQgZnMsIGNvbnN0IGludCBjaGFuLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3ZlcmxhcCk7CiAKIFNCUl9FUlJPUgotcmVzZXRMcHBUcmFuc3Bvc2VyIChIQU5ETEVfU0JSX0xQUF9UUkFOUyBoTHBwVHJhbnMsCi0gICAgICAgICAgICAgICAgICAgIFVDSEFSICBoaWdoQmFuZFN0YXJ0U2IsCi0gICAgICAgICAgICAgICAgICAgIFVDSEFSICp2X2tfbWFzdGVyLAotICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgbnVtTWFzdGVyLAotICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqbm9pc2VCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgIFVDSEFSICBub05vaXNlQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgIFVDSEFSICB1c2IsCi0gICAgICAgICAgICAgICAgICAgIFVJTlQgICBmcyk7CityZXNldExwcFRyYW5zcG9zZXIoSEFORExFX1NCUl9MUFBfVFJBTlMgaExwcFRyYW5zLCBVQ0hBUiBoaWdoQmFuZFN0YXJ0U2IsCisgICAgICAgICAgICAgICAgICAgVUNIQVIgKnZfa19tYXN0ZXIsIFVDSEFSIG51bU1hc3RlciwgVUNIQVIgKm5vaXNlQmFuZFRhYmxlLAorICAgICAgICAgICAgICAgICAgIFVDSEFSIG5vTm9pc2VCYW5kcywgVUNIQVIgdXNiLCBVSU5UIGZzKTsKIAotCi0KLSNlbmRpZiAvKiBfTFBQX1RSQU5TX0ggKi8KLQorI2VuZGlmIC8qIExQUF9UUkFOX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvcHNiaXRkZWMuY3BwIGIvbGliU0JSZGVjL3NyYy9wc2JpdGRlYy5jcHAKaW5kZXggMjliZGRmNy4uZjQwYTE1NiAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9wc2JpdGRlYy5jcHAKKysrIGIvbGliU0JSZGVjL3NyYy9wc2JpdGRlYy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTcgKzkwLDIzIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInBzYml0ZGVjLmgiCiAKLQogI2luY2x1ZGUgInNicl9yb20uaCIKICNpbmNsdWRlICJodWZmX2RlYy5oIgogCiAvKiBQUyBkZWMgcHJpdmF0IGZ1bmN0aW9ucyAqLwogU0JSX0VSUk9SIFJlc2V0UHNEZWMoSEFORExFX1BTX0RFQyBoX3BzX2QpOwotdm9pZCBSZXNldFBzRGVDb3IgICAoSEFORExFX1BTX0RFQyBoX3BzX2QpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCkBAIC05OCwyNCArMTE1LDI0IEBACiAgIFxyZXR1cm4gaW5kZXggb2YgaHVmZm1hbiBjb2RlYm9vayB0YWJsZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFNDSEFSCi1kZWNvZGVfaHVmZl9jdyAoSHVmZm1hbiBoLCAgICAgICAgICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gaHVmZm1hbiBjb2RlYm9vayB0YWJsZSAqLwotICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsICAgLyohPCBIYW5kbGUgdG8gQml0YnVmZmVyICovCi0gICAgICAgICAgICAgICAgaW50ICpsZW5ndGgpICAgICAgICAgICAgICAgICAgICAvKiE8IGxlbmd0aCBvZiBodWZmbWFuIGNvZGV3b3JkIChvciBOVUxMKSAqLworc3RhdGljIFNDSEFSIGRlY29kZV9odWZmX2N3KAorICAgIEh1ZmZtYW4gaCwgICAgICAgICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBodWZmbWFuIGNvZGVib29rIHRhYmxlICovCisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZiwgLyohPCBIYW5kbGUgdG8gQml0YnVmZmVyICovCisgICAgaW50ICpsZW5ndGgpICAgICAgICAgICAgICAgICAgLyohPCBsZW5ndGggb2YgaHVmZm1hbiBjb2Rld29yZCAob3IgTlVMTCkgKi8KIHsKICAgVUNIQVIgYml0ID0gMDsKICAgU0NIQVIgaW5kZXggPSAwOwogICBVQ0hBUiBiaXRDb3VudCA9IDA7CiAKICAgd2hpbGUgKGluZGV4ID49IDApIHsKLSAgICBiaXQgPSBGREtyZWFkQml0cyAoaEJpdEJ1ZiwgMSk7CisgICAgYml0ID0gRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgMSk7CiAgICAgYml0Q291bnQrKzsKICAgICBpbmRleCA9IGhbaW5kZXhdW2JpdF07CiAgIH0KICAgaWYgKGxlbmd0aCkgewogICAgICpsZW5ndGggPSBiaXRDb3VudDsKICAgfQotICByZXR1cm4oIGluZGV4KzY0ICk7IC8qIEFkZCBvZmZzZXQgKi8KKyAgcmV0dXJuIChpbmRleCArIDY0KTsgLyogQWRkIG9mZnNldCAqLwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTI2LDE0ICsxNDMsMTAgQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIFNDSEFSCi1saW1pdE1pbk1heChTQ0hBUiBpLAotICAgICAgICAgICAgU0NIQVIgbWluLAotICAgICAgICAgICAgU0NIQVIgbWF4KQotewotICBpZiAoaTxtaW4pCitzdGF0aWMgU0NIQVIgbGltaXRNaW5NYXgoU0NIQVIgaSwgU0NIQVIgbWluLCBTQ0hBUiBtYXgpIHsKKyAgaWYgKGkgPCBtaW4pCiAgICAgcmV0dXJuIG1pbjsKLSAgZWxzZSBpZiAoaT5tYXgpCisgIGVsc2UgaWYgKGkgPiBtYXgpCiAgICAgcmV0dXJuIG1heDsKICAgZWxzZQogICAgIHJldHVybiBpOwpAQCAtMTUwLDQ0ICsxNjMsMzggQEAKICAgXHJldHVybiBub25lCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotZGVsdGFEZWNvZGVBcnJheShTQ0hBUiBlbmFibGUsCi0gICAgICAgICAgICAgICAgIFNDSEFSICphSW5kZXgsICAgICAgICAgIC8qITwgSUNDL0lJRCBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgIFNDSEFSICphUHJldkZyYW1lSW5kZXgsIC8qITwgSUNDL0lJRCBwYXJhbWV0ZXJzICBvZiBwcmV2aW91cyBmcmFtZSAqLwotICAgICAgICAgICAgICAgICBTQ0hBUiBEdERmLAotICAgICAgICAgICAgICAgICBVQ0hBUiBuckVsZW1lbnRzLCAgICAgICAvKiE8IGFzIGNvbnZleWVkIGluIGJpdHN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IG91dHB1dCBhcnJheSBzaXplOiBuckVsZW1lbnRzKnN0cmlkZSAqLwotICAgICAgICAgICAgICAgICBVQ0hBUiBzdHJpZGUsICAgICAgICAgICAvKiE8IDE9ZGZsdCwgMj1oYWxmIGZyZXEuIHJlc29sdXRpb24gKi8KLSAgICAgICAgICAgICAgICAgU0NIQVIgbWluSWR4LAotICAgICAgICAgICAgICAgICBTQ0hBUiBtYXhJZHgpCi17CitzdGF0aWMgdm9pZCBkZWx0YURlY29kZUFycmF5KAorICAgIFNDSEFSIGVuYWJsZSwgU0NIQVIgKmFJbmRleCwgIC8qITwgSUNDL0lJRCBwYXJhbWV0ZXJzICovCisgICAgU0NIQVIgKmFQcmV2RnJhbWVJbmRleCwgICAgICAgLyohPCBJQ0MvSUlEIHBhcmFtZXRlcnMgIG9mIHByZXZpb3VzIGZyYW1lICovCisgICAgU0NIQVIgRHREZiwgVUNIQVIgbnJFbGVtZW50cywgLyohPCBhcyBjb252ZXllZCBpbiBiaXRzdHJlYW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IG91dHB1dCBhcnJheSBzaXplOiBuckVsZW1lbnRzKnN0cmlkZSAqLworICAgIFVDSEFSIHN0cmlkZSwgICAgICAgICAgICAgICAgIC8qITwgMT1kZmx0LCAyPWhhbGYgZnJlcS4gcmVzb2x1dGlvbiAqLworICAgIFNDSEFSIG1pbklkeCwgU0NIQVIgbWF4SWR4KSB7CiAgIGludCBpOwogCiAgIC8qIERlbHRhIGRlY29kZSAqLwotICBpZiAoIGVuYWJsZT09MSApIHsKLSAgICBpZiAoRHREZiA9PSAwKSAgeyAgIC8qIERlbHRhIGNvZGVkIGluIGZyZXEgKi8KKyAgaWYgKGVuYWJsZSA9PSAxKSB7CisgICAgaWYgKER0RGYgPT0gMCkgeyAvKiBEZWx0YSBjb2RlZCBpbiBmcmVxICovCiAgICAgICBhSW5kZXhbMF0gPSAwICsgYUluZGV4WzBdOwotICAgICAgYUluZGV4WzBdID0gbGltaXRNaW5NYXgoYUluZGV4WzBdLG1pbklkeCxtYXhJZHgpOworICAgICAgYUluZGV4WzBdID0gbGltaXRNaW5NYXgoYUluZGV4WzBdLCBtaW5JZHgsIG1heElkeCk7CiAgICAgICBmb3IgKGkgPSAxOyBpIDwgbnJFbGVtZW50czsgaSsrKSB7Ci0gICAgICAgIGFJbmRleFtpXSA9IGFJbmRleFtpLTFdICsgYUluZGV4W2ldOwotICAgICAgICBhSW5kZXhbaV0gPSBsaW1pdE1pbk1heChhSW5kZXhbaV0sbWluSWR4LG1heElkeCk7CisgICAgICAgIGFJbmRleFtpXSA9IGFJbmRleFtpIC0gMV0gKyBhSW5kZXhbaV07CisgICAgICAgIGFJbmRleFtpXSA9IGxpbWl0TWluTWF4KGFJbmRleFtpXSwgbWluSWR4LCBtYXhJZHgpOwogICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsgLyogRGVsdGEgdGltZSAqLworICAgIH0gZWxzZSB7IC8qIERlbHRhIHRpbWUgKi8KICAgICAgIGZvciAoaSA9IDA7IGkgPCBuckVsZW1lbnRzOyBpKyspIHsKLSAgICAgICAgYUluZGV4W2ldID0gYVByZXZGcmFtZUluZGV4W2kqc3RyaWRlXSArIGFJbmRleFtpXTsKLSAgICAgICAgYUluZGV4W2ldID0gbGltaXRNaW5NYXgoYUluZGV4W2ldLG1pbklkeCxtYXhJZHgpOworICAgICAgICBhSW5kZXhbaV0gPSBhUHJldkZyYW1lSW5kZXhbaSAqIHN0cmlkZV0gKyBhSW5kZXhbaV07CisgICAgICAgIGFJbmRleFtpXSA9IGxpbWl0TWluTWF4KGFJbmRleFtpXSwgbWluSWR4LCBtYXhJZHgpOwogICAgICAgfQogICAgIH0KLSAgfQotICBlbHNlIHsgLyogTm8gZGF0YSBpcyBzZW50LCBzZXQgaW5kZXggdG8gemVybyAqLworICB9IGVsc2UgeyAvKiBObyBkYXRhIGlzIHNlbnQsIHNldCBpbmRleCB0byB6ZXJvICovCiAgICAgZm9yIChpID0gMDsgaSA8IG5yRWxlbWVudHM7IGkrKykgewogICAgICAgYUluZGV4W2ldID0gMDsKICAgICB9CiAgIH0KLSAgaWYgKHN0cmlkZT09MikgewotICAgIGZvciAoaT1uckVsZW1lbnRzKnN0cmlkZS0xOyBpPjA7IGktLSkgewotICAgICAgYUluZGV4W2ldID0gYUluZGV4W2k+PjFdOworICBpZiAoc3RyaWRlID09IDIpIHsKKyAgICBmb3IgKGkgPSBuckVsZW1lbnRzICogc3RyaWRlIC0gMTsgaSA+IDA7IGktLSkgeworICAgICAgYUluZGV4W2ldID0gYUluZGV4W2kgPj4gMV07CiAgICAgfQogICB9CiB9CkBAIC0xOTksMzMgKzIwNiwzMiBAQAogICBccmV0dXJuIG5vbmUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIG1hcDM0SW5kZXhUbzIwIChTQ0hBUiAqYUluZGV4LCAvKiE8IGRlY29kZWQgSUNDL0lJRCBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgbm9CaW5zKSAgLyohPCBudW1iZXIgb2Ygc3RlcmVvIGJhbmRzICAgICAqLworc3RhdGljIHZvaWQgbWFwMzRJbmRleFRvMjAoU0NIQVIgKmFJbmRleCwgLyohPCBkZWNvZGVkIElDQy9JSUQgcGFyYW1ldGVycyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgbm9CaW5zKSAgLyohPCBudW1iZXIgb2Ygc3RlcmVvIGJhbmRzICAgICAqLwogewotICBhSW5kZXhbMF0gID0gKDIqYUluZGV4WzBdK2FJbmRleFsxXSkvMzsKLSAgYUluZGV4WzFdICA9IChhSW5kZXhbMV0rMiphSW5kZXhbMl0pLzM7Ci0gIGFJbmRleFsyXSAgPSAoMiphSW5kZXhbM10rYUluZGV4WzRdKS8zOwotICBhSW5kZXhbM10gID0gKGFJbmRleFs0XSsyKmFJbmRleFs1XSkvMzsKLSAgYUluZGV4WzRdICA9IChhSW5kZXhbNl0rYUluZGV4WzddKS8yOwotICBhSW5kZXhbNV0gID0gKGFJbmRleFs4XSthSW5kZXhbOV0pLzI7Ci0gIGFJbmRleFs2XSAgPSBhSW5kZXhbMTBdOwotICBhSW5kZXhbN10gID0gYUluZGV4WzExXTsKLSAgYUluZGV4WzhdICA9IChhSW5kZXhbMTJdK2FJbmRleFsxM10pLzI7Ci0gIGFJbmRleFs5XSAgPSAoYUluZGV4WzE0XSthSW5kZXhbMTVdKS8yOworICBhSW5kZXhbMF0gPSAoMiAqIGFJbmRleFswXSArIGFJbmRleFsxXSkgLyAzOworICBhSW5kZXhbMV0gPSAoYUluZGV4WzFdICsgMiAqIGFJbmRleFsyXSkgLyAzOworICBhSW5kZXhbMl0gPSAoMiAqIGFJbmRleFszXSArIGFJbmRleFs0XSkgLyAzOworICBhSW5kZXhbM10gPSAoYUluZGV4WzRdICsgMiAqIGFJbmRleFs1XSkgLyAzOworICBhSW5kZXhbNF0gPSAoYUluZGV4WzZdICsgYUluZGV4WzddKSAvIDI7CisgIGFJbmRleFs1XSA9IChhSW5kZXhbOF0gKyBhSW5kZXhbOV0pIC8gMjsKKyAgYUluZGV4WzZdID0gYUluZGV4WzEwXTsKKyAgYUluZGV4WzddID0gYUluZGV4WzExXTsKKyAgYUluZGV4WzhdID0gKGFJbmRleFsxMl0gKyBhSW5kZXhbMTNdKSAvIDI7CisgIGFJbmRleFs5XSA9IChhSW5kZXhbMTRdICsgYUluZGV4WzE1XSkgLyAyOwogICBhSW5kZXhbMTBdID0gYUluZGV4WzE2XTsKICAgLyogRm9yIElQRC9PUEQgaXQgc3RvcHMgaGVyZSAqLwogCi0gIGlmIChub0JpbnMgPT0gTk9fSElfUkVTX0JJTlMpCi0gIHsKKyAgaWYgKG5vQmlucyA9PSBOT19ISV9SRVNfQklOUykgewogICAgIGFJbmRleFsxMV0gPSBhSW5kZXhbMTddOwogICAgIGFJbmRleFsxMl0gPSBhSW5kZXhbMThdOwogICAgIGFJbmRleFsxM10gPSBhSW5kZXhbMTldOwotICAgIGFJbmRleFsxNF0gPSAoYUluZGV4WzIwXSthSW5kZXhbMjFdKS8yOwotICAgIGFJbmRleFsxNV0gPSAoYUluZGV4WzIyXSthSW5kZXhbMjNdKS8yOwotICAgIGFJbmRleFsxNl0gPSAoYUluZGV4WzI0XSthSW5kZXhbMjVdKS8yOwotICAgIGFJbmRleFsxN10gPSAoYUluZGV4WzI2XSthSW5kZXhbMjddKS8yOwotICAgIGFJbmRleFsxOF0gPSAoYUluZGV4WzI4XSthSW5kZXhbMjldK2FJbmRleFszMF0rYUluZGV4WzMxXSkvNDsKLSAgICBhSW5kZXhbMTldID0gKGFJbmRleFszMl0rYUluZGV4WzMzXSkvMjsKKyAgICBhSW5kZXhbMTRdID0gKGFJbmRleFsyMF0gKyBhSW5kZXhbMjFdKSAvIDI7CisgICAgYUluZGV4WzE1XSA9IChhSW5kZXhbMjJdICsgYUluZGV4WzIzXSkgLyAyOworICAgIGFJbmRleFsxNl0gPSAoYUluZGV4WzI0XSArIGFJbmRleFsyNV0pIC8gMjsKKyAgICBhSW5kZXhbMTddID0gKGFJbmRleFsyNl0gKyBhSW5kZXhbMjddKSAvIDI7CisgICAgYUluZGV4WzE4XSA9IChhSW5kZXhbMjhdICsgYUluZGV4WzI5XSArIGFJbmRleFszMF0gKyBhSW5kZXhbMzFdKSAvIDQ7CisgICAgYUluZGV4WzE5XSA9IChhSW5kZXhbMzJdICsgYUluZGV4WzMzXSkgLyAyOwogICB9CiB9CiAKQEAgLTIzNiwyNCArMjQyLDI4IEBACiAgIFxyZXR1cm4gUFMgcHJvY2Vzc2luZyBmbGFnLiBJZiBzZXQgdG8gMQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50Ci1EZWNvZGVQcyggc3RydWN0IFBTX0RFQyAqaF9wc19kLCAgICAgIC8qITwgUFMgaGFuZGxlICovCi0gICAgICAgICAgY29uc3QgVUNIQVIgICAgZnJhbWVFcnJvciApIC8qITwgRmxhZyB0ZWxsaW5nIHRoYXQgZnJhbWUgaGFkIGVycm9ycyAqLwoteworaW50IERlY29kZVBzKHN0cnVjdCBQU19ERUMgKmhfcHNfZCwgIC8qITwgUFMgaGFuZGxlICovCisgICAgICAgICAgICAgY29uc3QgVUNIQVIgZnJhbWVFcnJvciwgLyohPCBGbGFnIHRlbGxpbmcgdGhhdCBmcmFtZSBoYWQgZXJyb3JzICovCisgICAgICAgICAgICAgUFNfREVDX0NPRUZGSUNJRU5UUyAqcFNjcmF0Y2gpIHsKICAgTVBFR19QU19CU19EQVRBICpwQnNEYXRhOwogICBVQ0hBUiBnciwgZW52OwotICBpbnQgICBiUHNIZWFkZXJWYWxpZCwgYlBzRGF0YUF2YWlsOworICBpbnQgYlBzSGVhZGVyVmFsaWQsIGJQc0RhdGFBdmFpbDsKKworICAvKiBBc3NpZ24gU2NyYXRjaCAqLworICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQ29lZiA9IHBTY3JhdGNoOwogCiAgIC8qIFNob3J0Y3V0cyB0byBhdm9pZCBkZWZlcmVuY2luZyBhbmQga2VlcCB0aGUgY29kZSByZWFkYWJsZSAqLwogICBwQnNEYXRhID0gJmhfcHNfZC0+YnNEYXRhW2hfcHNfZC0+cHJvY2Vzc1Nsb3RdLm1wZWc7CiAgIGJQc0hlYWRlclZhbGlkID0gcEJzRGF0YS0+YlBzSGVhZGVyVmFsaWQ7Ci0gIGJQc0RhdGFBdmFpbCA9IChoX3BzX2QtPmJQc0RhdGFBdmFpbFtoX3BzX2QtPnByb2Nlc3NTbG90XSA9PSBwcHRfbXBlZykgPyAxIDogMDsKKyAgYlBzRGF0YUF2YWlsID0KKyAgICAgIChoX3BzX2QtPmJQc0RhdGFBdmFpbFtoX3BzX2QtPnByb2Nlc3NTbG90XSA9PSBwcHRfbXBlZykgPyAxIDogMDsKIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKiBEZWNpZGUgd2hldGhlciB0byBwcm9jZXNzIG9yIHRvIGNvbmNlYWwgUFMgZGF0YSBvciBub3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqIERlY2lkZSB3aGV0aGVyIHRvIHByb2Nlc3Mgb3IgdG8gY29uY2VhbCBQUyBkYXRhIG9yIG5vdC4gKi8KIAotICBpZiAoICggaF9wc19kLT5wc0RlY29kZWRQcnYgJiYgIWZyYW1lRXJyb3IgJiYgIWJQc0RhdGFBdmFpbCkKLSAgICB8fCAoIWhfcHNfZC0+cHNEZWNvZGVkUHJ2ICYmIChmcmFtZUVycm9yIHx8ICFiUHNEYXRhQXZhaWwgfHwgIWJQc0hlYWRlclZhbGlkKSkgKSB7CisgIGlmICgoaF9wc19kLT5wc0RlY29kZWRQcnYgJiYgIWZyYW1lRXJyb3IgJiYgIWJQc0RhdGFBdmFpbCkgfHwKKyAgICAgICghaF9wc19kLT5wc0RlY29kZWRQcnYgJiYKKyAgICAgICAoZnJhbWVFcnJvciB8fCAhYlBzRGF0YUF2YWlsIHx8ICFiUHNIZWFkZXJWYWxpZCkpKSB7CiAgICAgLyogRG9uJ3QgYXBwbHkgUFMgcHJvY2Vzc2luZy4KICAgICAgKiBEZWNsYXJlIGN1cnJlbnQgUFMgaGVhZGVyIGFuZCBiaXRzdHJlYW0gZGF0YSBpbnZhbGlkLiAqLwogICAgIHBCc0RhdGEtPmJQc0hlYWRlclZhbGlkID0gMDsKQEAgLTI2MSw4NyArMjcxLDgwIEBACiAgICAgcmV0dXJuICgwKTsKICAgfQogCi0gIGlmIChmcmFtZUVycm9yIHx8ICFiUHNIZWFkZXJWYWxpZCkKLSAgeyAvKiBubyBuZXcgUFMgZGF0YSBhdmFpbGFibGUgKGUuZy4gZnJhbWUgbG9zcykgKi8KKyAgaWYgKGZyYW1lRXJyb3IgfHwKKyAgICAgICFiUHNIZWFkZXJWYWxpZCkgeyAvKiBubyBuZXcgUFMgZGF0YSBhdmFpbGFibGUgKGUuZy4gZnJhbWUgbG9zcykgKi8KICAgICAvKiA9PiBrZWVwIGxhdGVzdCBkYXRhIGNvbnN0YW50IChpLmUuIEZJWCB3aXRoIG5vRW52PTApICovCiAgICAgcEJzRGF0YS0+bm9FbnYgPSAwOwogICB9CiAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICogRGVjb2RlIGJpdHN0cmVhbSBwYXlsb2FkIG9yIHByZXBhcmUgcGFyYW1ldGVyIGZvciBjb25jZWFsbWVudDoKLSAgKi8KLSAgZm9yIChlbnY9MDsgZW52PHBCc0RhdGEtPm5vRW52OyBlbnYrKykgeworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqIERlY29kZSBiaXRzdHJlYW0gcGF5bG9hZCBvciBwcmVwYXJlIHBhcmFtZXRlciBmb3IgY29uY2VhbG1lbnQ6CisgICAqLworICBmb3IgKGVudiA9IDA7IGVudiA8IHBCc0RhdGEtPm5vRW52OyBlbnYrKykgewogICAgIFNDSEFSICphUHJldklpZEluZGV4OwogICAgIFNDSEFSICphUHJldkljY0luZGV4OwogCi0gICAgVUNIQVIgbm9JaWRTdGVwcyA9IHBCc0RhdGEtPmJGaW5lSWlkUT9OT19JSURfU1RFUFNfRklORTpOT19JSURfU1RFUFM7CisgICAgVUNIQVIgbm9JaWRTdGVwcyA9IHBCc0RhdGEtPmJGaW5lSWlkUSA/IE5PX0lJRF9TVEVQU19GSU5FIDogTk9fSUlEX1NURVBTOwogCi0gICAgaWYgKGVudj09MCkgeworICAgIGlmIChlbnYgPT0gMCkgewogICAgICAgYVByZXZJaWRJbmRleCA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFJaWRQcmV2RnJhbWVJbmRleDsKICAgICAgIGFQcmV2SWNjSW5kZXggPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hSWNjUHJldkZyYW1lSW5kZXg7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgYVByZXZJaWRJbmRleCA9IHBCc0RhdGEtPmFhSWlkSW5kZXhbZW52LTFdOwotICAgICAgYVByZXZJY2NJbmRleCA9IHBCc0RhdGEtPmFhSWNjSW5kZXhbZW52LTFdOworICAgIH0gZWxzZSB7CisgICAgICBhUHJldklpZEluZGV4ID0gcEJzRGF0YS0+YWFJaWRJbmRleFtlbnYgLSAxXTsKKyAgICAgIGFQcmV2SWNjSW5kZXggPSBwQnNEYXRhLT5hYUljY0luZGV4W2VudiAtIDFdOwogICAgIH0KIAotICAgIGRlbHRhRGVjb2RlQXJyYXkocEJzRGF0YS0+YkVuYWJsZUlpZCwKLSAgICAgICAgICAgICAgICAgICAgIHBCc0RhdGEtPmFhSWlkSW5kZXhbZW52XSwKLSAgICAgICAgICAgICAgICAgICAgIGFQcmV2SWlkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBwQnNEYXRhLT5hYklpZER0RmxhZ1tlbnZdLAorICAgIGRlbHRhRGVjb2RlQXJyYXkocEJzRGF0YS0+YkVuYWJsZUlpZCwgcEJzRGF0YS0+YWFJaWRJbmRleFtlbnZdLAorICAgICAgICAgICAgICAgICAgICAgYVByZXZJaWRJbmRleCwgcEJzRGF0YS0+YWJJaWREdEZsYWdbZW52XSwKICAgICAgICAgICAgICAgICAgICAgIEZES19zYnJEZWNvZGVyX2FOb0lpZEJpbnNbcEJzRGF0YS0+ZnJlcVJlc0lpZF0sCi0gICAgICAgICAgICAgICAgICAgICAocEJzRGF0YS0+ZnJlcVJlc0lpZCk/MToyLAotICAgICAgICAgICAgICAgICAgICAgLW5vSWlkU3RlcHMsCi0gICAgICAgICAgICAgICAgICAgICBub0lpZFN0ZXBzKTsKKyAgICAgICAgICAgICAgICAgICAgIChwQnNEYXRhLT5mcmVxUmVzSWlkKSA/IDEgOiAyLCAtbm9JaWRTdGVwcywgbm9JaWRTdGVwcyk7CiAKLSAgICBkZWx0YURlY29kZUFycmF5KHBCc0RhdGEtPmJFbmFibGVJY2MsCi0gICAgICAgICAgICAgICAgICAgICBwQnNEYXRhLT5hYUljY0luZGV4W2Vudl0sCi0gICAgICAgICAgICAgICAgICAgICBhUHJldkljY0luZGV4LAotICAgICAgICAgICAgICAgICAgICAgcEJzRGF0YS0+YWJJY2NEdEZsYWdbZW52XSwKKyAgICBkZWx0YURlY29kZUFycmF5KHBCc0RhdGEtPmJFbmFibGVJY2MsIHBCc0RhdGEtPmFhSWNjSW5kZXhbZW52XSwKKyAgICAgICAgICAgICAgICAgICAgIGFQcmV2SWNjSW5kZXgsIHBCc0RhdGEtPmFiSWNjRHRGbGFnW2Vudl0sCiAgICAgICAgICAgICAgICAgICAgICBGREtfc2JyRGVjb2Rlcl9hTm9JY2NCaW5zW3BCc0RhdGEtPmZyZXFSZXNJY2NdLAotICAgICAgICAgICAgICAgICAgICAgKHBCc0RhdGEtPmZyZXFSZXNJY2MpPzE6MiwKLSAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICBOT19JQ0NfU1RFUFMtMSk7Ci0gIH0gICAvKiBmb3IgKGVudj0wOyBlbnY8cEJzRGF0YS0+bm9FbnY7IGVudisrKSAqLworICAgICAgICAgICAgICAgICAgICAgKHBCc0RhdGEtPmZyZXFSZXNJY2MpID8gMSA6IDIsIDAsIE5PX0lDQ19TVEVQUyAtIDEpOworICB9IC8qIGZvciAoZW52PTA7IGVudjxwQnNEYXRhLT5ub0VudjsgZW52KyspICovCiAKICAgLyogaGFuZGxpbmcgb2YgRklYIG5vRW52PTAgKi8KLSAgaWYgKHBCc0RhdGEtPm5vRW52PT0wKSB7CisgIGlmIChwQnNEYXRhLT5ub0VudiA9PSAwKSB7CiAgICAgLyogc2V0IG5vRW52PTEsIGtlZXAgbGFzdCBwYXJhbWV0ZXJzIG9yIGZvcmNlIDAgaWYgbm90IGVuYWJsZWQgKi8KICAgICBwQnNEYXRhLT5ub0VudiA9IDE7CiAKICAgICBpZiAocEJzRGF0YS0+YkVuYWJsZUlpZCkgeworICAgICAgcEJzRGF0YS0+YkZpbmVJaWRRID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYlByZXZGcmFtZUZpbmVJaWRROwogICAgICAgZm9yIChnciA9IDA7IGdyIDwgTk9fSElfUkVTX0lJRF9CSU5TOyBncisrKSB7Ci0gICAgICAgIHBCc0RhdGEtPmFhSWlkSW5kZXhbcEJzRGF0YS0+bm9FbnYtMV1bZ3JdID0KLSAgICAgICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hSWlkUHJldkZyYW1lSW5kZXhbZ3JdOworICAgICAgICBwQnNEYXRhLT5hYUlpZEluZGV4W3BCc0RhdGEtPm5vRW52IC0gMV1bZ3JdID0KKyAgICAgICAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFJaWRQcmV2RnJhbWVJbmRleFtncl07CiAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICBmb3IgKGdyID0gMDsgZ3IgPCBOT19ISV9SRVNfSUlEX0JJTlM7IGdyKyspIHsKLSAgICAgICAgcEJzRGF0YS0+YWFJaWRJbmRleFtwQnNEYXRhLT5ub0Vudi0xXVtncl0gPSAwOworICAgICAgICBwQnNEYXRhLT5hYUlpZEluZGV4W3BCc0RhdGEtPm5vRW52IC0gMV1bZ3JdID0gMDsKICAgICAgIH0KICAgICB9CiAKICAgICBpZiAocEJzRGF0YS0+YkVuYWJsZUljYykgewogICAgICAgZm9yIChnciA9IDA7IGdyIDwgTk9fSElfUkVTX0lDQ19CSU5TOyBncisrKSB7Ci0gICAgICAgIHBCc0RhdGEtPmFhSWNjSW5kZXhbcEJzRGF0YS0+bm9FbnYtMV1bZ3JdID0KLSAgICAgICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hSWNjUHJldkZyYW1lSW5kZXhbZ3JdOworICAgICAgICBwQnNEYXRhLT5hYUljY0luZGV4W3BCc0RhdGEtPm5vRW52IC0gMV1bZ3JdID0KKyAgICAgICAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFJY2NQcmV2RnJhbWVJbmRleFtncl07CiAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICBmb3IgKGdyID0gMDsgZ3IgPCBOT19ISV9SRVNfSUNDX0JJTlM7IGdyKyspIHsKLSAgICAgICAgcEJzRGF0YS0+YWFJY2NJbmRleFtwQnNEYXRhLT5ub0Vudi0xXVtncl0gPSAwOworICAgICAgICBwQnNEYXRhLT5hYUljY0luZGV4W3BCc0RhdGEtPm5vRW52IC0gMV1bZ3JdID0gMDsKICAgICAgIH0KICAgICB9CiAgIH0KIAorICAvKiBVcGRhdGUgcHJldmlvdXMgZnJhbWUgSWlkIHF1YW50aXphdGlvbiAqLworICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5iUHJldkZyYW1lRmluZUlpZFEgPSBwQnNEYXRhLT5iRmluZUlpZFE7CisKICAgLyogVXBkYXRlIHByZXZpb3VzIGZyYW1lIGluZGV4IGJ1ZmZlcnMgKi8KICAgZm9yIChnciA9IDA7IGdyIDwgTk9fSElfUkVTX0lJRF9CSU5TOyBncisrKSB7CiAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYUlpZFByZXZGcmFtZUluZGV4W2dyXSA9Ci0gICAgICBwQnNEYXRhLT5hYUlpZEluZGV4W3BCc0RhdGEtPm5vRW52LTFdW2dyXTsKKyAgICAgICAgcEJzRGF0YS0+YWFJaWRJbmRleFtwQnNEYXRhLT5ub0VudiAtIDFdW2dyXTsKICAgfQogICBmb3IgKGdyID0gMDsgZ3IgPCBOT19ISV9SRVNfSUNDX0JJTlM7IGdyKyspIHsKICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hSWNjUHJldkZyYW1lSW5kZXhbZ3JdID0KLSAgICAgIHBCc0RhdGEtPmFhSWNjSW5kZXhbcEJzRGF0YS0+bm9FbnYtMV1bZ3JdOworICAgICAgICBwQnNEYXRhLT5hYUljY0luZGV4W3BCc0RhdGEtPm5vRW52IC0gMV1bZ3JdOwogICB9CiAKICAgLyogUFMgZGF0YSBmcm9tIGJpdHN0cmVhbSAoaWYgYXZhaWwpIHdhcyBkZWNvZGVkIG5vdyAqLwpAQCAtMzUxLDE1ICszNTQsMTQgQEAKICAgaWYgKHBCc0RhdGEtPmJGcmFtZUNsYXNzID09IDApIHsKICAgICAvKiBGSVhfQk9SREVSUyBOb0Vudj0wLDEsMiw0ICovCiAgICAgcEJzRGF0YS0+YUVudlN0YXJ0U3RvcFswXSA9IDA7Ci0gICAgZm9yIChlbnY9MTsgZW52PHBCc0RhdGEtPm5vRW52OyBlbnYrKykgeworICAgIGZvciAoZW52ID0gMTsgZW52IDwgcEJzRGF0YS0+bm9FbnY7IGVudisrKSB7CiAgICAgICBwQnNEYXRhLT5hRW52U3RhcnRTdG9wW2Vudl0gPQotICAgICAgICAoZW52ICogaF9wc19kLT5ub1N1YlNhbXBsZXMpIC8gcEJzRGF0YS0+bm9FbnY7CisgICAgICAgICAgKGVudiAqIGhfcHNfZC0+bm9TdWJTYW1wbGVzKSAvIHBCc0RhdGEtPm5vRW52OwogICAgIH0KICAgICBwQnNEYXRhLT5hRW52U3RhcnRTdG9wW3BCc0RhdGEtPm5vRW52XSA9IGhfcHNfZC0+bm9TdWJTYW1wbGVzOwogICAgIC8qIDEwMjQgKDMyIHNsb3RzKSBlbnYgYm9yZGVyczogIDAsIDgsIDE2LCAyNCwgMzIgKi8KICAgICAvKiAgOTYwICgzMCBzbG90cykgZW52IGJvcmRlcnM6ICAwLCA3LCAxNSwgMjIsIDMwICovCi0gIH0KLSAgZWxzZSB7ICAgLyogaWYgKGhfcHNfZC0+YkZyYW1lQ2xhc3MgPT0gMCkgKi8KKyAgfSBlbHNlIHsgLyogaWYgKGhfcHNfZC0+YkZyYW1lQ2xhc3MgPT0gMCkgKi8KICAgICAvKiBWQVJfQk9SREVSUyBOb0Vudj0xLDIsMyw0ICovCiAgICAgcEJzRGF0YS0+YUVudlN0YXJ0U3RvcFswXSA9IDA7CiAKQEAgLTM2OCw1NSArMzcwLDU5IEBACiAgICAgaWYgKHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbcEJzRGF0YS0+bm9FbnZdIDwgaF9wc19kLT5ub1N1YlNhbXBsZXMpIHsKICAgICAgIGZvciAoZ3IgPSAwOyBnciA8IE5PX0hJX1JFU19JSURfQklOUzsgZ3IrKykgewogICAgICAgICBwQnNEYXRhLT5hYUlpZEluZGV4W3BCc0RhdGEtPm5vRW52XVtncl0gPQotICAgICAgICAgIHBCc0RhdGEtPmFhSWlkSW5kZXhbcEJzRGF0YS0+bm9FbnYtMV1bZ3JdOworICAgICAgICAgICAgcEJzRGF0YS0+YWFJaWRJbmRleFtwQnNEYXRhLT5ub0VudiAtIDFdW2dyXTsKICAgICAgIH0KICAgICAgIGZvciAoZ3IgPSAwOyBnciA8IE5PX0hJX1JFU19JQ0NfQklOUzsgZ3IrKykgewogICAgICAgICBwQnNEYXRhLT5hYUljY0luZGV4W3BCc0RhdGEtPm5vRW52XVtncl0gPQotICAgICAgICAgIHBCc0RhdGEtPmFhSWNjSW5kZXhbcEJzRGF0YS0+bm9FbnYtMV1bZ3JdOworICAgICAgICAgICAgcEJzRGF0YS0+YWFJY2NJbmRleFtwQnNEYXRhLT5ub0VudiAtIDFdW2dyXTsKICAgICAgIH0KICAgICAgIHBCc0RhdGEtPm5vRW52Kys7CiAgICAgICBwQnNEYXRhLT5hRW52U3RhcnRTdG9wW3BCc0RhdGEtPm5vRW52XSA9IGhfcHNfZC0+bm9TdWJTYW1wbGVzOwogICAgIH0KIAogICAgIC8qIGVuZm9yY2Ugc3RyaWN0bHkgbW9ub3RvbmljIGluY3JlYXNpbmcgYm9yZGVycyAqLwotICAgIGZvciAoZW52PTE7IGVudjxwQnNEYXRhLT5ub0VudjsgZW52KyspIHsKKyAgICBmb3IgKGVudiA9IDE7IGVudiA8IHBCc0RhdGEtPm5vRW52OyBlbnYrKykgewogICAgICAgVUNIQVIgdGhyOwogICAgICAgdGhyID0gKFVDSEFSKWhfcHNfZC0+bm9TdWJTYW1wbGVzIC0gKHBCc0RhdGEtPm5vRW52IC0gZW52KTsKICAgICAgIGlmIChwQnNEYXRhLT5hRW52U3RhcnRTdG9wW2Vudl0gPiB0aHIpIHsKICAgICAgICAgcEJzRGF0YS0+YUVudlN0YXJ0U3RvcFtlbnZdID0gdGhyOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHRociA9IHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbZW52LTFdKzE7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHIgPSBwQnNEYXRhLT5hRW52U3RhcnRTdG9wW2VudiAtIDFdICsgMTsKICAgICAgICAgaWYgKHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbZW52XSA8IHRocikgewogICAgICAgICAgIHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbZW52XSA9IHRocjsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgfSAgIC8qIGlmIChoX3BzX2QtPmJGcmFtZUNsYXNzID09IDApIC4uLiBlbHNlICovCisgIH0gLyogaWYgKGhfcHNfZC0+YkZyYW1lQ2xhc3MgPT0gMCkgLi4uIGVsc2UgKi8KIAogICAvKiBjb3B5IGRhdGEgcHJpb3IgdG8gcG9zc2libGUgMjA8LT4zNCBpbi1wbGFjZSBtYXBwaW5nICovCi0gIGZvciAoZW52PTA7IGVudjxwQnNEYXRhLT5ub0VudjsgZW52KyspIHsKKyAgZm9yIChlbnYgPSAwOyBlbnYgPCBwQnNEYXRhLT5ub0VudjsgZW52KyspIHsKICAgICBVQ0hBUiBpOwotICAgIGZvciAoaT0wOyBpPE5PX0hJX1JFU19JSURfQklOUzsgaSsrKSB7Ci0gICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLmFhSWlkSW5kZXhNYXBwZWRbZW52XVtpXSA9IHBCc0RhdGEtPmFhSWlkSW5kZXhbZW52XVtpXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTk9fSElfUkVTX0lJRF9CSU5TOyBpKyspIHsKKyAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBDb2VmLT5hYUlpZEluZGV4TWFwcGVkW2Vudl1baV0gPQorICAgICAgICAgIHBCc0RhdGEtPmFhSWlkSW5kZXhbZW52XVtpXTsKICAgICB9Ci0gICAgZm9yIChpPTA7IGk8Tk9fSElfUkVTX0lDQ19CSU5TOyBpKyspIHsKLSAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuYWFJY2NJbmRleE1hcHBlZFtlbnZdW2ldID0gcEJzRGF0YS0+YWFJY2NJbmRleFtlbnZdW2ldOworICAgIGZvciAoaSA9IDA7IGkgPCBOT19ISV9SRVNfSUNDX0JJTlM7IGkrKykgeworICAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucENvZWYtPmFhSWNjSW5kZXhNYXBwZWRbZW52XVtpXSA9CisgICAgICAgICAgcEJzRGF0YS0+YWFJY2NJbmRleFtlbnZdW2ldOwogICAgIH0KICAgfQogCi0KICAgLyogTVBFRyBiYXNlbGluZSBQUyAqLwotICAvKiBCYXNlbGluZSB2ZXJzaW9uIG9mIFBTIGFsd2F5cyB1c2VzIHRoZSBoeWJyaWQgZmlsdGVyIHN0cnVjdHVyZSB3aXRoIDIwIHN0ZXJlbyBiYW5kcy4gKi8KLSAgLyogSWYgSUNDL0lJRCBwYXJhbWV0ZXJzIGZvciAzNCBzdGVyZW8gYmFuZHMgYXJlIGRlY29kZWQgdGhleSBoYXZlIHRvIGJlIG1hcHBlZCB0byAyMCAgICovCi0gIC8qIHN0ZXJlbyBiYW5kcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBZGRpdGlvbmFseSB0aGUgSVBEL09QRCBwYXJhbWV0ZXJzIHdvbid0IGJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQmFzZWxpbmUgdmVyc2lvbiBvZiBQUyBhbHdheXMgdXNlcyB0aGUgaHlicmlkIGZpbHRlciBzdHJ1Y3R1cmUgd2l0aCAyMAorICAgKiBzdGVyZW8gYmFuZHMuICovCisgIC8qIElmIElDQy9JSUQgcGFyYW1ldGVycyBmb3IgMzQgc3RlcmVvIGJhbmRzIGFyZSBkZWNvZGVkIHRoZXkgaGF2ZSB0byBiZQorICAgKiBtYXBwZWQgdG8gMjAgICAqLworICAvKiBzdGVyZW8gYmFuZHMuICovCisgIC8qIEFkZGl0aW9uYWx5IHRoZSBJUEQvT1BEIHBhcmFtZXRlcnMgd29uJ3QgYmUgdXNlZC4gKi8KIAotICBmb3IgKGVudj0wOyBlbnY8cEJzRGF0YS0+bm9FbnY7IGVudisrKSB7CisgIGZvciAoZW52ID0gMDsgZW52IDwgcEJzRGF0YS0+bm9FbnY7IGVudisrKSB7CiAgICAgaWYgKHBCc0RhdGEtPmZyZXFSZXNJaWQgPT0gMikKLSAgICAgIG1hcDM0SW5kZXhUbzIwIChoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLmFhSWlkSW5kZXhNYXBwZWRbZW52XSwgTk9fSElfUkVTX0lJRF9CSU5TKTsKKyAgICAgIG1hcDM0SW5kZXhUbzIwKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBDb2VmLT5hYUlpZEluZGV4TWFwcGVkW2Vudl0sCisgICAgICAgICAgICAgICAgICAgICBOT19ISV9SRVNfSUlEX0JJTlMpOwogICAgIGlmIChwQnNEYXRhLT5mcmVxUmVzSWNjID09IDIpCi0gICAgICBtYXAzNEluZGV4VG8yMCAoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5hYUljY0luZGV4TWFwcGVkW2Vudl0sIE5PX0hJX1JFU19JQ0NfQklOUyk7CisgICAgICBtYXAzNEluZGV4VG8yMChoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQ29lZi0+YWFJY2NJbmRleE1hcHBlZFtlbnZdLAorICAgICAgICAgICAgICAgICAgICAgTk9fSElfUkVTX0lDQ19CSU5TKTsKIAogICAgIC8qIElQRC9PUEQgaXMgZGlzYWJsZWQgaW4gYmFzZWxpbmUgdmVyc2lvbiBhbmQgdGh1cyB3YXMgcmVtb3ZlZCBoZXJlICovCiAgIH0KQEAgLTQyNCw3ICs0MzAsNiBAQAogICByZXR1cm4gKDEpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiEKIApAQCAtNDMzLDYyICs0MzgsNjAgQEAKICAgXHJldHVybgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdW5zaWduZWQgaW50Ci1SZWFkUHNEYXRhIChIQU5ETEVfUFNfREVDIGhfcHNfZCwgICAgICAgICAgLyohPCBoYW5kbGUgdG8gc3RydWN0IFBTX0RFQyAqLwotICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZiwgIC8qITwgaGFuZGxlIHRvIHN0cnVjdCBCSVRfQlVGICovCi0gICAgICAgICAgICBpbnQgbkJpdHNMZWZ0ICAgICAgICAgICAgICAgICAgLyohPCBtYXggbnVtYmVyIG9mIGJpdHMgYXZhaWxhYmxlICovCi0gICAgICAgICAgICkKLXsKK3Vuc2lnbmVkIGludCBSZWFkUHNEYXRhKAorICAgIEhBTkRMRV9QU19ERUMgaF9wc19kLCAgICAgICAgIC8qITwgaGFuZGxlIHRvIHN0cnVjdCBQU19ERUMgKi8KKyAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLCAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgQklUX0JVRiAqLworICAgIGludCBuQml0c0xlZnQgICAgICAgICAgICAgICAgIC8qITwgbWF4IG51bWJlciBvZiBiaXRzIGF2YWlsYWJsZSAqLworKSB7CiAgIE1QRUdfUFNfQlNfREFUQSAqcEJzRGF0YTsKIAotICBVQ0hBUiAgICAgZ3IsIGVudjsKLSAgU0NIQVIgICAgIGR0RmxhZzsKLSAgSU5UICAgICAgIHN0YXJ0Yml0czsKLSAgSHVmZm1hbiAgIEN1cnJlbnRUYWJsZTsKLSAgU0NIQVIgICAgIGJFbmFibGVIZWFkZXI7CisgIFVDSEFSIGdyLCBlbnY7CisgIFNDSEFSIGR0RmxhZzsKKyAgSU5UIHN0YXJ0Yml0czsKKyAgSHVmZm1hbiBDdXJyZW50VGFibGU7CisgIFNDSEFSIGJFbmFibGVIZWFkZXI7CiAKLSAgaWYgKCFoX3BzX2QpCi0gICAgcmV0dXJuIDA7CisgIGlmICghaF9wc19kKSByZXR1cm4gMDsKIAogICBwQnNEYXRhID0gJmhfcHNfZC0+YnNEYXRhW2hfcHNfZC0+YnNSZWFkU2xvdF0ubXBlZzsKIAogICBpZiAoaF9wc19kLT5ic1JlYWRTbG90ICE9IGhfcHNfZC0+YnNMYXN0U2xvdCkgewogICAgIC8qIENvcHkgbGFzdCBoZWFkZXIgZGF0YSAqLwotICAgIEZES21lbWNweShwQnNEYXRhLCAmaF9wc19kLT5ic0RhdGFbaF9wc19kLT5ic0xhc3RTbG90XS5tcGVnLCBzaXplb2YoTVBFR19QU19CU19EQVRBKSk7CisgICAgRkRLbWVtY3B5KHBCc0RhdGEsICZoX3BzX2QtPmJzRGF0YVtoX3BzX2QtPmJzTGFzdFNsb3RdLm1wZWcsCisgICAgICAgICAgICAgIHNpemVvZihNUEVHX1BTX0JTX0RBVEEpKTsKICAgfQogCisgIHN0YXJ0Yml0cyA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCaXRCdWYpOwogCi0gIHN0YXJ0Yml0cyA9IChJTlQpIEZES2dldFZhbGlkQml0cyhoQml0QnVmKTsKLQotICBiRW5hYmxlSGVhZGVyID0gKFNDSEFSKSBGREtyZWFkQml0cyAoaEJpdEJ1ZiwgMSk7CisgIGJFbmFibGVIZWFkZXIgPSAoU0NIQVIpRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgMSk7CiAKICAgLyogUmVhZCBoZWFkZXIgKi8KICAgaWYgKGJFbmFibGVIZWFkZXIpIHsKICAgICBwQnNEYXRhLT5iUHNIZWFkZXJWYWxpZCA9IDE7Ci0gICAgcEJzRGF0YS0+YkVuYWJsZUlpZCA9IChVQ0hBUikgRkRLcmVhZEJpdHMgKGhCaXRCdWYsIDEpOworICAgIHBCc0RhdGEtPmJFbmFibGVJaWQgPSAoVUNIQVIpRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgMSk7CiAgICAgaWYgKHBCc0RhdGEtPmJFbmFibGVJaWQpIHsKLSAgICAgIHBCc0RhdGEtPm1vZGVJaWQgPSAoVUNIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCAzKTsKKyAgICAgIHBCc0RhdGEtPm1vZGVJaWQgPSAoVUNIQVIpRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgMyk7CiAgICAgfQogCi0gICAgcEJzRGF0YS0+YkVuYWJsZUljYyA9IChVQ0hBUikgRkRLcmVhZEJpdHMgKGhCaXRCdWYsIDEpOworICAgIHBCc0RhdGEtPmJFbmFibGVJY2MgPSAoVUNIQVIpRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgMSk7CiAgICAgaWYgKHBCc0RhdGEtPmJFbmFibGVJY2MpIHsKLSAgICAgIHBCc0RhdGEtPm1vZGVJY2MgPSAoVUNIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCAzKTsKKyAgICAgIHBCc0RhdGEtPm1vZGVJY2MgPSAoVUNIQVIpRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgMyk7CiAgICAgfQogCi0gICAgcEJzRGF0YS0+YkVuYWJsZUV4dCA9IChVQ0hBUikgRkRLcmVhZEJpdHMgKGhCaXRCdWYsIDEpOworICAgIHBCc0RhdGEtPmJFbmFibGVFeHQgPSAoVUNIQVIpRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgMSk7CiAgIH0KIAotICBwQnNEYXRhLT5iRnJhbWVDbGFzcyA9IChVQ0hBUikgRkRLcmVhZEJpdHMgKGhCaXRCdWYsIDEpOworICBwQnNEYXRhLT5iRnJhbWVDbGFzcyA9IChVQ0hBUilGREtyZWFkQml0cyhoQml0QnVmLCAxKTsKICAgaWYgKHBCc0RhdGEtPmJGcmFtZUNsYXNzID09IDApIHsKICAgICAvKiBGSVhfQk9SREVSUyBOb0Vudj0wLDEsMiw0ICovCi0gICAgcEJzRGF0YS0+bm9FbnYgPSBGREtfc2JyRGVjb2Rlcl9hRml4Tm9FbnZEZWNvZGVbKFVDSEFSKSBGREtyZWFkQml0cyAoaEJpdEJ1ZiwgMildOworICAgIHBCc0RhdGEtPm5vRW52ID0KKyAgICAgICAgRkRLX3NickRlY29kZXJfYUZpeE5vRW52RGVjb2RlWyhVQ0hBUilGREtyZWFkQml0cyhoQml0QnVmLCAyKV07CiAgICAgLyogYWxsIGFkZGl0aW9uYWwgaGFuZGxpbmcgb2YgZW52IGJvcmRlcnMgaXMgbm93IGluIERlY29kZVBzKCkgKi8KLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICAvKiBWQVJfQk9SREVSUyBOb0Vudj0xLDIsMyw0ICovCi0gICAgcEJzRGF0YS0+bm9FbnYgPSAxKyhVQ0hBUikgRkRLcmVhZEJpdHMgKGhCaXRCdWYsIDIpOwotICAgIGZvciAoZW52PTE7IGVudjxwQnNEYXRhLT5ub0VudisxOyBlbnYrKykKLSAgICAgIHBCc0RhdGEtPmFFbnZTdGFydFN0b3BbZW52XSA9ICgoVUNIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCA1KSkgKyAxOworICAgIHBCc0RhdGEtPm5vRW52ID0gMSArIChVQ0hBUilGREtyZWFkQml0cyhoQml0QnVmLCAyKTsKKyAgICBmb3IgKGVudiA9IDE7IGVudiA8IHBCc0RhdGEtPm5vRW52ICsgMTsgZW52KyspCisgICAgICBwQnNEYXRhLT5hRW52U3RhcnRTdG9wW2Vudl0gPSAoKFVDSEFSKUZES3JlYWRCaXRzKGhCaXRCdWYsIDUpKSArIDE7CiAgICAgLyogYWxsIGFkZGl0aW9uYWwgaGFuZGxpbmcgb2YgZW52IGJvcmRlcnMgaXMgbm93IGluIERlY29kZVBzKCkgKi8KICAgfQogCkBAIC00OTcsNzcgKzUwMCw3MiBAQAogICAgIC8qIG5vIHVzZWZ1bCBQUyBkYXRhIGNvdWxkIGJlIHJlYWQgZnJvbSBiaXRzdHJlYW0gKi8KICAgICBoX3BzX2QtPmJQc0RhdGFBdmFpbFtoX3BzX2QtPmJzUmVhZFNsb3RdID0gcHB0X25vbmU7CiAgICAgLyogZGlzY2FyZCBhbGwgcmVtYWluaW5nIGJpdHMgKi8KLSAgICBuQml0c0xlZnQgLT0gc3RhcnRiaXRzIC0gRkRLZ2V0VmFsaWRCaXRzKGhCaXRCdWYpOwotICAgIHdoaWxlIChuQml0c0xlZnQpIHsKKyAgICBuQml0c0xlZnQgLT0gc3RhcnRiaXRzIC0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJpdEJ1Zik7CisgICAgd2hpbGUgKG5CaXRzTGVmdCA+IDApIHsKICAgICAgIGludCBpID0gbkJpdHNMZWZ0OwotICAgICAgaWYgKGk+OCkgeworICAgICAgaWYgKGkgPiA4KSB7CiAgICAgICAgIGkgPSA4OwogICAgICAgfQotICAgICAgRkRLcmVhZEJpdHMgKGhCaXRCdWYsIGkpOworICAgICAgRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgaSk7CiAgICAgICBuQml0c0xlZnQgLT0gaTsKICAgICB9Ci0gICAgcmV0dXJuIChzdGFydGJpdHMgLSBGREtnZXRWYWxpZEJpdHMoaEJpdEJ1ZikpOworICAgIHJldHVybiAoVUlOVCkoc3RhcnRiaXRzIC0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJpdEJ1ZikpOwogICB9CiAKLSAgaWYgKHBCc0RhdGEtPm1vZGVJaWQgPiAyKXsKLSAgICBwQnNEYXRhLT5mcmVxUmVzSWlkID0gcEJzRGF0YS0+bW9kZUlpZC0zOworICBpZiAocEJzRGF0YS0+bW9kZUlpZCA+IDIpIHsKKyAgICBwQnNEYXRhLT5mcmVxUmVzSWlkID0gcEJzRGF0YS0+bW9kZUlpZCAtIDM7CiAgICAgcEJzRGF0YS0+YkZpbmVJaWRRID0gMTsKLSAgfQotICBlbHNleworICB9IGVsc2UgewogICAgIHBCc0RhdGEtPmZyZXFSZXNJaWQgPSBwQnNEYXRhLT5tb2RlSWlkOwogICAgIHBCc0RhdGEtPmJGaW5lSWlkUSA9IDA7CiAgIH0KIAotICBpZiAocEJzRGF0YS0+bW9kZUljYyA+IDIpewotICAgIHBCc0RhdGEtPmZyZXFSZXNJY2MgPSBwQnNEYXRhLT5tb2RlSWNjLTM7Ci0gIH0KLSAgZWxzZXsKKyAgaWYgKHBCc0RhdGEtPm1vZGVJY2MgPiAyKSB7CisgICAgcEJzRGF0YS0+ZnJlcVJlc0ljYyA9IHBCc0RhdGEtPm1vZGVJY2MgLSAzOworICB9IGVsc2UgewogICAgIHBCc0RhdGEtPmZyZXFSZXNJY2MgPSBwQnNEYXRhLT5tb2RlSWNjOwogICB9CiAKLQogICAvKiBFeHRyYWN0IElJRCBkYXRhICovCiAgIGlmIChwQnNEYXRhLT5iRW5hYmxlSWlkKSB7Ci0gICAgZm9yIChlbnY9MDsgZW52PHBCc0RhdGEtPm5vRW52OyBlbnYrKykgewotICAgICAgZHRGbGFnID0gKFNDSEFSKUZES3JlYWRCaXRzIChoQml0QnVmLCAxKTsKLSAgICAgIGlmICghZHRGbGFnKQotICAgICAgeworICAgIGZvciAoZW52ID0gMDsgZW52IDwgcEJzRGF0YS0+bm9FbnY7IGVudisrKSB7CisgICAgICBkdEZsYWcgPSAoU0NIQVIpRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgMSk7CisgICAgICBpZiAoIWR0RmxhZykgewogICAgICAgICBpZiAocEJzRGF0YS0+YkZpbmVJaWRRKQogICAgICAgICAgIEN1cnJlbnRUYWJsZSA9IChIdWZmbWFuKSZhQm9va1BzSWlkRmluZUZyZXFEZWNvZGU7CiAgICAgICAgIGVsc2UKICAgICAgICAgICBDdXJyZW50VGFibGUgPSAoSHVmZm1hbikmYUJvb2tQc0lpZEZyZXFEZWNvZGU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7CisgICAgICB9IGVsc2UgewogICAgICAgICBpZiAocEJzRGF0YS0+YkZpbmVJaWRRKQotICAgICAgICAgQ3VycmVudFRhYmxlID0gKEh1ZmZtYW4pJmFCb29rUHNJaWRGaW5lVGltZURlY29kZTsKKyAgICAgICAgICBDdXJyZW50VGFibGUgPSAoSHVmZm1hbikmYUJvb2tQc0lpZEZpbmVUaW1lRGVjb2RlOwogICAgICAgICBlbHNlCiAgICAgICAgICAgQ3VycmVudFRhYmxlID0gKEh1ZmZtYW4pJmFCb29rUHNJaWRUaW1lRGVjb2RlOwogICAgICAgfQogCiAgICAgICBmb3IgKGdyID0gMDsgZ3IgPCBGREtfc2JyRGVjb2Rlcl9hTm9JaWRCaW5zW3BCc0RhdGEtPmZyZXFSZXNJaWRdOyBncisrKQotICAgICAgICBwQnNEYXRhLT5hYUlpZEluZGV4W2Vudl1bZ3JdID0gZGVjb2RlX2h1ZmZfY3coQ3VycmVudFRhYmxlLGhCaXRCdWYsTlVMTCk7CisgICAgICAgIHBCc0RhdGEtPmFhSWlkSW5kZXhbZW52XVtncl0gPQorICAgICAgICAgICAgZGVjb2RlX2h1ZmZfY3coQ3VycmVudFRhYmxlLCBoQml0QnVmLCBOVUxMKTsKICAgICAgIHBCc0RhdGEtPmFiSWlkRHRGbGFnW2Vudl0gPSBkdEZsYWc7CiAgICAgfQogICB9CiAKICAgLyogRXh0cmFjdCBJQ0MgZGF0YSAqLwogICBpZiAocEJzRGF0YS0+YkVuYWJsZUljYykgewotICAgIGZvciAoZW52PTA7IGVudjxwQnNEYXRhLT5ub0VudjsgZW52KyspIHsKLSAgICAgIGR0RmxhZyA9IChTQ0hBUilGREtyZWFkQml0cyAoaEJpdEJ1ZiwgMSk7CisgICAgZm9yIChlbnYgPSAwOyBlbnYgPCBwQnNEYXRhLT5ub0VudjsgZW52KyspIHsKKyAgICAgIGR0RmxhZyA9IChTQ0hBUilGREtyZWFkQml0cyhoQml0QnVmLCAxKTsKICAgICAgIGlmICghZHRGbGFnKQogICAgICAgICBDdXJyZW50VGFibGUgPSAoSHVmZm1hbikmYUJvb2tQc0ljY0ZyZXFEZWNvZGU7CiAgICAgICBlbHNlCiAgICAgICAgIEN1cnJlbnRUYWJsZSA9IChIdWZmbWFuKSZhQm9va1BzSWNjVGltZURlY29kZTsKIAogICAgICAgZm9yIChnciA9IDA7IGdyIDwgRkRLX3NickRlY29kZXJfYU5vSWNjQmluc1twQnNEYXRhLT5mcmVxUmVzSWNjXTsgZ3IrKykKLSAgICAgICAgcEJzRGF0YS0+YWFJY2NJbmRleFtlbnZdW2dyXSA9IGRlY29kZV9odWZmX2N3KEN1cnJlbnRUYWJsZSxoQml0QnVmLE5VTEwpOworICAgICAgICBwQnNEYXRhLT5hYUljY0luZGV4W2Vudl1bZ3JdID0KKyAgICAgICAgICAgIGRlY29kZV9odWZmX2N3KEN1cnJlbnRUYWJsZSwgaEJpdEJ1ZiwgTlVMTCk7CiAgICAgICBwQnNEYXRhLT5hYkljY0R0RmxhZ1tlbnZdID0gZHRGbGFnOwogICAgIH0KICAgfQogCiAgIGlmIChwQnNEYXRhLT5iRW5hYmxlRXh0KSB7Ci0KICAgICAvKiEKICAgICBEZWNvZGVycyB0aGF0IHN1cHBvcnQgb25seSB0aGUgYmFzZWxpbmUgdmVyc2lvbiBvZiB0aGUgUFMgdG9vbCBhcmUgYWxsb3dlZAogICAgIHRvIGlnbm9yZSB0aGUgSVBEL09QRCBkYXRhLCBidXQgYWNjb3JkaW5nIGhlYWRlciBkYXRhIGhhcyB0byBiZSBwYXJzZWQuCkBAIC01NzUsMTkgKzU3MywxNCBAQAogICAgICovCiAKICAgICBpbnQgY250ID0gRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgUFNfRVhURU5TSU9OX1NJWkVfQklUUyk7Ci0gICAgaWYgKGNudCA9PSAoMTw8UFNfRVhURU5TSU9OX1NJWkVfQklUUyktMSkgeworICAgIGlmIChjbnQgPT0gKDEgPDwgUFNfRVhURU5TSU9OX1NJWkVfQklUUykgLSAxKSB7CiAgICAgICBjbnQgKz0gRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgUFNfRVhURU5TSU9OX0VTQ19DT1VOVF9CSVRTKTsKICAgICB9Ci0gICAgd2hpbGUgKGNudC0tKQotICAgICAgRkRLcmVhZEJpdHMoaEJpdEJ1ZiwgOCk7CisgICAgd2hpbGUgKGNudC0tKSBGREtyZWFkQml0cyhoQml0QnVmLCA4KTsKICAgfQogCi0KICAgLyogbmV3IFBTIGRhdGEgd2FzIHJlYWQgZnJvbSBiaXRzdHJlYW0gKi8KICAgaF9wc19kLT5iUHNEYXRhQXZhaWxbaF9wc19kLT5ic1JlYWRTbG90XSA9IHBwdF9tcGVnOwogCi0KLQotICByZXR1cm4gKHN0YXJ0Yml0cyAtIEZES2dldFZhbGlkQml0cyhoQml0QnVmKSk7CisgIHJldHVybiAoc3RhcnRiaXRzIC0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJpdEJ1ZikpOwogfQotCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3BzYml0ZGVjLmggYi9saWJTQlJkZWMvc3JjL3BzYml0ZGVjLmgKaW5kZXggYTJkNGQ2Yy4uZjBmYzQzYSAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9wc2JpdGRlYy5oCisrKyBiL2xpYlNCUmRlYy9zcmMvcHNiaXRkZWMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyNSArOTAsMjcgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWZuZGVmIF9fUFNCSVRERUNfSAotI2RlZmluZSBfX1BTQklUREVDX0gKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgUFNCSVRERUNfSAorI2RlZmluZSBQU0JJVERFQ19ICiAKICNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCiAKLQogI2luY2x1ZGUgInBzZGVjLmgiCiAKK3Vuc2lnbmVkIGludCBSZWFkUHNEYXRhKHN0cnVjdCBQU19ERUMgKmhfcHNfZCwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5CaXRzTGVmdCk7CiAKLXVuc2lnbmVkIGludAotUmVhZFBzRGF0YSAoc3RydWN0IFBTX0RFQyAgKmhfcHNfZCwKLSAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQnMsCi0gICAgICAgICAgICBpbnQgbkJpdHNMZWZ0KTsKK2ludCBEZWNvZGVQcyhzdHJ1Y3QgUFNfREVDICpoX3BzX2QsIGNvbnN0IFVDSEFSIGZyYW1lRXJyb3IsCisgICAgICAgICAgICAgUFNfREVDX0NPRUZGSUNJRU5UUyAqcENvZWYpOwogCi1pbnQKLURlY29kZVBzKHN0cnVjdCBQU19ERUMgKmhfcHNfZCwKLSAgICAgICAgIGNvbnN0IFVDSEFSICAgIGZyYW1lRXJyb3IpOwotCi0KLSNlbmRpZiAvKiBfX1BTQklUREVDX0ggKi8KKyNlbmRpZiAvKiBQU0JJVERFQ19IICovCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3BzZGVjLmNwcCBiL2xpYlNCUmRlYy9zcmMvcHNkZWMuY3BwCmluZGV4IDk2NTkxN2EuLjEzYTIxYmYgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvcHNkZWMuY3BwCisrKyBiL2xpYlNCUmRlYy9zcmMvcHNkZWMuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE5ICs5MCwyNCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIHBhcmFtZXRyaWMgc3RlcmVvIGRlY29kZXIgIAorICBcYnJpZWYgIHBhcmFtZXRyaWMgc3RlcmVvIGRlY29kZXIKICovCiAKICNpbmNsdWRlICJwc2RlYy5oIgogCi0KLQogI2luY2x1ZGUgIkZES19iaXRidWZmZXIuaCIKLSNpbmNsdWRlICJwc2RlY19oeWJyaWQuaCIKIAogI2luY2x1ZGUgInNicl9yb20uaCIKICNpbmNsdWRlICJzYnJfcmFtLmgiCkBAIC0xMDIsMzAgKzExOCwxNyBAQAogCiAjaW5jbHVkZSAiRkRLX3RyaWdGY3RzLmgiCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgIE1MUVVBTCBERUZJTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gICNkZWZpbmUgRlJBQ1RfWkVSTyBGUkFDVF9CSVRTLTEKKyNkZWZpbmUgRlJBQ1RfWkVSTyBGUkFDVF9CSVRTIC0gMQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1TQlJfRVJST1IgUmVzZXRQc0RlYyggSEFORExFX1BTX0RFQyBoX3BzX2QgKTsKLQotdm9pZCBSZXNldFBzRGVDb3IoIEhBTkRMRV9QU19ERUMgaF9wc19kICk7Ci0KK1NCUl9FUlJPUiBSZXNldFBzRGVjKEhBTkRMRV9QU19ERUMgaF9wc19kKTsKIAogLyoqKioqIEhFTFBFUlMgKioqKiovCiAKLXN0YXRpYyB2b2lkIGFzc2lnblRpbWVTbG90c1BTIChGSVhQX0RCTCAqYnVmQWRyLCBGSVhQX0RCTCAqKmJ1ZlB0ciwgY29uc3QgaW50IG51bVNsb3RzLCBjb25zdCBpbnQgbnVtQ2hhbik7Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBESVYzIEZMMkZYQ09OU1RfREJMKDEuZi8zLmYpICAgICAvKiBkaXZpc2lvbiAzLjAgKi8KLSNkZWZpbmUgRElWMV81IEZMMkZYQ09OU1RfREJMKDIuZi8zLmYpICAgLyogZGl2aXNpb24gMS41ICovCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiEKICAgXGJyaWVmICBDcmVhdGVzIG9uZSBpbnN0YW5jZSBvZiB0aGUgUFNfREVDIHN0cnVjdApAQCAtMTMzLDIwICsxMzYsMTYgQEAKICAgXHJldHVybiBFcnJvciBpbmZvCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQKLUNyZWF0ZVBzRGVjKCBIQU5ETEVfUFNfREVDICpoX1BTX0RFQywgICAvKiE8IHBvaW50ZXIgdG8gdGhlIG1vZHVsZSBzdGF0ZSAqLwotICAgICAgICAgICAgIGludCBhYWNTYW1wbGVzUGVyRnJhbWUKLSAgICAgICAgICAgKQoteworaW50IENyZWF0ZVBzRGVjKEhBTkRMRV9QU19ERUMgKmhfUFNfREVDLCAvKiE8IHBvaW50ZXIgdG8gdGhlIG1vZHVsZSBzdGF0ZSAqLworICAgICAgICAgICAgICAgIGludCBhYWNTYW1wbGVzUGVyRnJhbWUpIHsKICAgU0JSX0VSUk9SIGVycm9ySW5mbyA9IFNCUkRFQ19PSzsKLSAgSEFORExFX1BTX0RFQyAgaF9wc19kOworICBIQU5ETEVfUFNfREVDIGhfcHNfZDsKICAgaW50IGk7CiAKICAgaWYgKCpoX1BTX0RFQyA9PSBOVUxMKSB7CiAgICAgLyogR2V0IHBzIGRlYyByYW0gKi8KICAgICBoX3BzX2QgPSBHZXRSYW1fcHNfZGVjKCk7CiAgICAgaWYgKGhfcHNfZCA9PSBOVUxMKSB7Ci0gICAgICBlcnJvckluZm8gPSBTQlJERUNfTUVNX0FMTE9DX0ZBSUxFRDsKICAgICAgIGdvdG8gYmFpbDsKICAgICB9CiAgIH0gZWxzZSB7CkBAIC0xNTQsNTIgKzE1Myw2MSBAQAogICAgIGhfcHNfZCA9ICpoX1BTX0RFQzsKICAgfQogCi0gICAvKiBpbml0aWFsaXNhdGlvbiAqLworICAvKgorICAgKiBDcmVhdGUgQW5hbHlzaXMgSHlicmlkIGZpbHRlcmJhbmsuCisgICAqLworICBGREtoeWJyaWRBbmFseXNpc09wZW4oJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZEFuYWx5c2lzLAorICAgICAgICAgICAgICAgICAgICAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEh5YnJpZEFuYVN0YXRlc0xGZG14LAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBIeWJyaWRBbmFTdGF0ZXNMRmRteCksCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwKTsKKworICAvKiBpbml0aWFsaXNhdGlvbiAqLwogICBzd2l0Y2ggKGFhY1NhbXBsZXNQZXJGcmFtZSkgewotICBjYXNlIDk2MDoKLSAgICBoX3BzX2QtPm5vU3ViU2FtcGxlcyA9IDMwOyAgICAgICAgICAgICAgLyogY29sICovCi0gICAgYnJlYWs7Ci0gIGNhc2UgMTAyNDoKLSAgICBoX3BzX2QtPm5vU3ViU2FtcGxlcyA9IDMyOyAgICAgICAgICAgICAgLyogY29sICovCi0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgaF9wc19kLT5ub1N1YlNhbXBsZXMgPSAtMTsKLSAgICBicmVhazsKKyAgICBjYXNlIDk2MDoKKyAgICAgIGhfcHNfZC0+bm9TdWJTYW1wbGVzID0gMzA7IC8qIGNvbCAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDI0OgorICAgICAgaF9wc19kLT5ub1N1YlNhbXBsZXMgPSAzMjsgLyogY29sICovCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaF9wc19kLT5ub1N1YlNhbXBsZXMgPSAtMTsKKyAgICAgIGJyZWFrOwogICB9CiAKLSAgaWYgKGhfcHNfZC0+bm9TdWJTYW1wbGVzID4gIE1BWF9OVU1fQ09MCi0gICB8fCBoX3BzX2QtPm5vU3ViU2FtcGxlcyA8PSAwKQotICB7CisgIGlmIChoX3BzX2QtPm5vU3ViU2FtcGxlcyA+IE1BWF9OVU1fQ09MIHx8IGhfcHNfZC0+bm9TdWJTYW1wbGVzIDw9IDApIHsKICAgICBnb3RvIGJhaWw7CiAgIH0KLSAgaF9wc19kLT5ub0NoYW5uZWxzICAgPSBOT19RTUZfQ0hBTk5FTFM7ICAgLyogcm93ICovCisgIGhfcHNfZC0+bm9DaGFubmVscyA9IE5PX1FNRl9DSEFOTkVMUzsgLyogcm93ICovCiAKLSAgaF9wc19kLT5wc0RlY29kZWRQcnYgICA9ICAwOworICBoX3BzX2QtPnBzRGVjb2RlZFBydiA9IDA7CiAgIGhfcHNfZC0+cHJvY0ZyYW1lQmFzZWQgPSAtMTsKLSAgZm9yIChpID0gMDsgaSA8ICgxKSsxOyBpKyspIHsKLSAgICBoX3BzX2QtPmJQc0RhdGFBdmFpbFtpXSAgPSAgcHB0X25vbmU7CisgIGZvciAoaSA9IDA7IGkgPCAoMSkgKyAxOyBpKyspIHsKKyAgICBoX3BzX2QtPmJQc0RhdGFBdmFpbFtpXSA9IHBwdF9ub25lOworICB9CisgIHsKKyAgICBpbnQgZXJyb3I7CisgICAgZXJyb3IgPSBGREtkZWNvcnJlbGF0ZU9wZW4oJihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hcERlY29yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5kZWNvcnJCdWZmZXJDcGx4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyICogKCg4MjUpICsgKDM3MykpKSk7CisgICAgaWYgKGVycm9yKSBnb3RvIGJhaWw7CiAgIH0KIAotCi0gIGZvciAoaSA9IDA7IGkgPCAoMSkrMTsgaSsrKSB7CisgIGZvciAoaSA9IDA7IGkgPCAoMSkgKyAxOyBpKyspIHsKICAgICBGREttZW1jbGVhcigmaF9wc19kLT5ic0RhdGFbaV0ubXBlZywgc2l6ZW9mKE1QRUdfUFNfQlNfREFUQSkpOwogICB9CiAKLSAgZXJyb3JJbmZvID0gUmVzZXRQc0RlYyggaF9wc19kICk7CisgIGVycm9ySW5mbyA9IFJlc2V0UHNEZWMoaF9wc19kKTsKIAotICBpZiAoIGVycm9ySW5mbyAhPSBTQlJERUNfT0sgKQotICAgIGdvdG8gYmFpbDsKLQotICBSZXNldFBzRGVDb3IoIGhfcHNfZCApOworICBpZiAoZXJyb3JJbmZvICE9IFNCUkRFQ19PSykgZ290byBiYWlsOwogCiAgICpoX1BTX0RFQyA9IGhfcHNfZDsKIAotCi0KICAgcmV0dXJuIDA7CiAKIGJhaWw6Ci0gIERlbGV0ZVBzRGVjKCZoX3BzX2QpOworICBpZiAoaF9wc19kICE9IE5VTEwpIHsKKyAgICBEZWxldGVQc0RlYygmaF9wc19kKTsKKyAgfQogCiAgIHJldHVybiAtMTsKIH0gLypFTkQgQ3JlYXRlUHNEZWMgKi8KQEAgLTIxMSwxNyArMjE5LDE5IEBACiAgIFxyZXR1cm4gRXJyb3IgaW5mbwogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50Ci1EZWxldGVQc0RlYyggSEFORExFX1BTX0RFQyAqaF9QU19ERUMpICAvKiE8IHBvaW50ZXIgdG8gdGhlIG1vZHVsZSBzdGF0ZSAqLworaW50IERlbGV0ZVBzRGVjKEhBTkRMRV9QU19ERUMgKmhfUFNfREVDKSAvKiE8IHBvaW50ZXIgdG8gdGhlIG1vZHVsZSBzdGF0ZSAqLwogewogICBpZiAoKmhfUFNfREVDID09IE5VTEwpIHsKICAgICByZXR1cm4gLTE7CiAgIH0KIAorICB7CisgICAgSEFORExFX1BTX0RFQyBoX3BzX2QgPSAqaF9QU19ERUM7CisgICAgRkRLZGVjb3JyZWxhdGVDbG9zZSgmKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFwRGVjb3IpKTsKKyAgfQogCiAgIEZyZWVSYW1fcHNfZGVjKGhfUFNfREVDKTsKIAotCiAgIHJldHVybiAwOwogfSAvKkVORCBEZWxldGVQc0RlYyAqLwogCkBAIC0yMzIsODI1ICsyNDIsMTc5IEBACiAgIFxyZXR1cm4KIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVNCUl9FUlJPUiBSZXNldFBzRGVjKCBIQU5ETEVfUFNfREVDIGhfcHNfZCApICAvKiE8IHBvaW50ZXIgdG8gdGhlIG1vZHVsZSBzdGF0ZSAqLworU0JSX0VSUk9SIFJlc2V0UHNEZWMoSEFORExFX1BTX0RFQyBoX3BzX2QpIC8qITwgcG9pbnRlciB0byB0aGUgbW9kdWxlIHN0YXRlICovCiB7CiAgIFNCUl9FUlJPUiBlcnJvckluZm8gPSBTQlJERUNfT0s7CiAgIElOVCBpOwogCi0gIGNvbnN0IFVDSEFSIG5vUW1mQmFuZHNJbkh5YnJpZDIwID0gMzsKLSAgLyogY29uc3QgVUNIQVIgbm9RbWZCYW5kc0luSHlicmlkMzQgPSA1OyAqLworICAvKiBleHBsaWNpdGx5IGluaXQgc3RhdGUgdmFyaWFibGVzIHRvIHNhZmUgdmFsdWVzICh1bnRpbCBmaXJzdCBwcyBoZWFkZXIKKyAgICogYXJyaXZlcykgKi8KIAotICBjb25zdCBVQ0hBUiBhSHlicmlkUmVzb2x1dGlvbjIwW10gPSB7IEhZQlJJRF84X0NQTFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFlCUklEXzJfUkVBTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIWUJSSURfMl9SRUFMIH07CisgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmxhc3RVc2IgPSAwOwogCi0gIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmRlbGF5QnVmSW5kZXggICA9IDA7CisgIC8qCisgICAqIEluaXRpYWxpemUgQW5hbHlzaXMgSHlicmlkIGZpbHRlcmJhbmsuCisgICAqLworICBGREtoeWJyaWRBbmFseXNpc0luaXQoJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZEFuYWx5c2lzLCBUSFJFRV9UT19URU4sCisgICAgICAgICAgICAgICAgICAgICAgICBOT19RTUZfQkFORFNfSFlCUklEMjAsIE5PX1FNRl9CQU5EU19IWUJSSUQyMCwgMSk7CiAKLSAgLyogZXhwbGljaXRseSBpbml0IHN0YXRlIHZhcmlhYmxlcyB0byBzYWZlIHZhbHVlcyAodW50aWwgZmlyc3QgcHMgaGVhZGVyIGFycml2ZXMpICovCi0KLSAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcubGFzdFVzYiAgICAgICAgPSAgMDsKLQotICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5zY2FsZUZhY3RvclBzRGVsYXlCdWZmZXIgPSAtKERGUkFDVF9CSVRTLTEpOwotCi0gIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFEZWxheUJ1ZkluZGV4RGVsYXlRbWYsIChOT19RTUZfQ0hBTk5FTFMtRklSU1RfREVMQVlfU0IpKnNpemVvZihVQ0hBUikpOwotICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5ub1NhbXBsZURlbGF5ID0gZGVsYXlJbmRleFFtZlswXTsKLQotICBmb3IgKGk9MCA7IGkgPCBOT19TRVJJQUxfQUxMUEFTU19MSU5LUzsgaSsrKSB7Ci0gICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYURlbGF5UkJ1ZkluZGV4U2VyW2ldID0gMDsKKyAgLyoKKyAgICogSW5pdGlhbGl6ZSBTeW50aGVzaXMgSHlicmlkIGZpbHRlcmJhbmsuCisgICAqLworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgRkRLaHlicmlkU3ludGhlc2lzSW5pdCgmaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaHlicmlkU3ludGhlc2lzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSRUVfVE9fVEVOLCBOT19RTUZfQ0hBTk5FTFMsIE5PX1FNRl9DSEFOTkVMUyk7CisgIH0KKyAgeworICAgIElOVCBlcnJvcjsKKyAgICBlcnJvciA9IEZES2RlY29ycmVsYXRlSW5pdCgmaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYXBEZWNvciwgNzEsIERFQ09SUl9QUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVUNLRVJfQVVUT01BVElDLCAwLCAwLCAwLCAwLCAxLCAvKiBpc0xlZ2FjeVBTICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgaWYgKGVycm9yKSByZXR1cm4gU0JSREVDX05PVF9JTklUSUFMSVpFRDsKICAgfQogCi0gIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYVJlYWxEZWxheUJ1ZmZlclFtZlswXSA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhUW1mRGVsYXlCdWZSZWFsOwotCi0gIGFzc2lnblRpbWVTbG90c1BTICggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhUmVhbERlbGF5QnVmZmVyUW1mWzBdICsgKE5PX1FNRl9DSEFOTkVMUy1GSVJTVF9ERUxBWV9TQiksCi0gICAgICAgICAgICAgICAgICAgICAmaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhUmVhbERlbGF5QnVmZmVyUW1mWzFdLAotICAgICAgICAgICAgICAgICAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLm5vU2FtcGxlRGVsYXktMSwKLSAgICAgICAgICAgICAgICAgICAgICAoTk9fREVMQVlfQlVGRkVSX0JBTkRTLUZJUlNUX0RFTEFZX1NCKSk7Ci0KLSAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhSW1hZ0RlbGF5QnVmZmVyUW1mWzBdID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFRbWZEZWxheUJ1ZkltYWc7Ci0KLSAgYXNzaWduVGltZVNsb3RzUFMgKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFJbWFnRGVsYXlCdWZmZXJRbWZbMF0gKyAoTk9fUU1GX0NIQU5ORUxTLUZJUlNUX0RFTEFZX1NCKSwKLSAgICAgICAgICAgICAgICAgICAgICZoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFJbWFnRGVsYXlCdWZmZXJRbWZbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcubm9TYW1wbGVEZWxheS0xLAotICAgICAgICAgICAgICAgICAgICAgIChOT19ERUxBWV9CVUZGRVJfQkFORFMtRklSU1RfREVMQVlfU0IpKTsKLQotICAvKiBIeWJyaWQgRmlsdGVyIEJhbmsgMSBjcmVhdGlvbi4gKi8KLSAgZXJyb3JJbmZvID0gSW5pdEh5YnJpZEZpbHRlckJhbmsgKCAmaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaHlicmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3BzX2QtPm5vU3ViU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9RbWZCYW5kc0luSHlicmlkMjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFIeWJyaWRSZXNvbHV0aW9uMjAgKTsKLQotICBmb3IgKCBpID0gMDsgaSA8IE5PX0lJRF9HUk9VUFM7IGkrKyApCi0gIHsKKyAgZm9yIChpID0gMDsgaSA8IE5PX0lJRF9HUk9VUFM7IGkrKykgewogICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgxMXJQcmV2W2ldID0gRkwyRlhDT05TVF9EQkwoMC41Zik7CiAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDEyclByZXZbaV0gPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsKICAgfQogCi0gIEZES21lbWNsZWFyKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMjFyUHJldiwgc2l6ZW9mKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMjFyUHJldiApICk7Ci0gIEZES21lbWNsZWFyKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMjJyUHJldiwgc2l6ZW9mKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMjJyUHJldiApICk7CisgIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgyMXJQcmV2LAorICAgICAgICAgICAgICBzaXplb2YoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDIxclByZXYpKTsKKyAgRkRLbWVtY2xlYXIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDIyclByZXYsCisgICAgICAgICAgICAgIHNpemVvZihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMjJyUHJldikpOwogCiAgIHJldHVybiBlcnJvckluZm87CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiEKLSAgXGJyaWVmICBjbGVhciBzb21lIGJ1ZmZlcnMgdXNlZCBpbiBkZWNvcnJlbGF0aW9uIHByb2Nlc3MKLQorICBcYnJpZWYgIEZlZWQgZGVsYXlsaW5lcyB3aGVuIHBhcmFtZXRyaWMgc3RlcmVvIGlzIHN3aXRjaGVkIG9uLgogICBccmV0dXJuCi0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFJlc2V0UHNEZUNvciggSEFORExFX1BTX0RFQyBoX3BzX2QgKSAgLyohPCBwb2ludGVyIHRvIHRoZSBtb2R1bGUgc3RhdGUgKi8KLXsKLSAgSU5UIGk7Cit2b2lkIFByZXBhcmVQc1Byb2Nlc3NpbmcoSEFORExFX1BTX0RFQyBoX3BzX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICpjb25zdCBySW50QnVmZmVyTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgKmNvbnN0IGlJbnRCdWZmZXJMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZUZhY3Rvckxvd0JhbmQpIHsKKyAgaWYgKGhfcHNfZC0+cHJvY0ZyYW1lQmFzZWQgPT0KKyAgICAgIDEpIC8qIElmIHdlIGhhdmUgc3dpdGNoZWQgZnJvbSBmcmFtZSB0byBzbG90IGJhc2VkIHByb2Nlc3NpbmcgICovCisgIHsgICAgICAvKiBmaWxsIGh5YnJpZCBkZWxheSBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBpLCBqOwogCi0gIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQZWFrRGVjYXlGYXN0QmluLCBOT19NSURfUkVTX0JJTlMqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQcmV2TnJnQmluLCBOT19NSURfUkVTX0JJTlMqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQcmV2UGVha0RpZmZCaW4sIE5PX01JRF9SRVNfQklOUypzaXplb2YoRklYUF9EQkwpKTsKLSAgRkRLbWVtY2xlYXIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVBvd2VyUHJldlNjYWwsIE5PX01JRF9SRVNfQklOUypzaXplb2YoU0NIQVIpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgSFlCUklEX0ZJTFRFUl9ERUxBWTsgaSsrKSB7CisgICAgICBGSVhQX0RCTCBxbWZJbnB1dERhdGFbMl1bTk9fUU1GX0JBTkRTX0hZQlJJRDIwXTsKKyAgICAgIEZJWFBfREJMIGh5YnJpZE91dHB1dERhdGFbMl1bTk9fU1VCX1FNRl9DSEFOTkVMU107CiAKLSAgZm9yIChpPTAgOyBpIDwgRklSU1RfREVMQVlfU0IgOyBpKyspIHsKLSAgICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFSZWFsRGVsYXlSQnVmZmVyU2VyUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUypzaXplb2YoRklYUF9EQkwpKTsKLSAgICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFJbWFnRGVsYXlSQnVmZmVyU2VyUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUypzaXplb2YoRklYUF9EQkwpKTsKLSAgfQotICBmb3IgKGk9MCA7IGkgPCBOT19TVUJfUU1GX0NIQU5ORUxTIDsgaSsrKSB7Ci0gICAgRkRLbWVtY2xlYXIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhUmVhbERlbGF5UkJ1ZmZlclNlclN1YlFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgRkRLbWVtY2xlYXIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclN1YlFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gIH0KLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogc2xvdCBiYXNlZCBmdW5jaW9uIHByb3RvdHlwZXMgKi8KLQotc3RhdGljIHZvaWQgZGVDb3JyZWxhdGVTbG90QmFzZWQoIEhBTkRMRV9QU19ERUMgaF9wc19kLAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKm1IeWJyaWRSZWFsTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqbUh5YnJpZEltYWdMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICBzZl9tSHlicmlkTGVmdCwKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpySW50QnVmZmVyTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqaUludEJ1ZmZlckxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgIHNmX0ludEJ1ZmZlciwKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICptSHlicmlkUmVhbFJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICptSHlicmlkSW1hZ1JpZ2h0LAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKnJJbnRCdWZmZXJSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqaUludEJ1ZmZlclJpZ2h0ICk7Ci0KLXN0YXRpYyB2b2lkIGFwcGx5U2xvdEJhc2VkUm90YXRpb24oIEhBTkRMRV9QU19ERUMgaF9wc19kLAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKm1IeWJyaWRSZWFsTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqbUh5YnJpZEltYWdMZWZ0LAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKlFtZkxlZnRSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpRbWZMZWZ0SW1hZywKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICptSHlicmlkUmVhbFJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICptSHlicmlkSW1hZ1JpZ2h0LAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKlFtZlJpZ2h0UmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqUW1mUmlnaHRJbWFnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyohCi0gIFxicmllZiAgR2V0IHNjYWxlIGZhY3RvciBmb3IgYWxsIHBzIGRlbGF5IGJ1ZmZlci4KLQotICBccmV0dXJuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMKLWludCBnZXRTY2FsZUZhY3RvclBzU3RhdGVzQnVmZmVyKEhBTkRMRV9QU19ERUMgICBoX3BzX2QpCi17Ci0gIElOVCBpOwotICBpbnQgc2NhbGUgPSBERlJBQ1RfQklUUy0xOwotCi0gIGZvciAoaT0wOyBpPE5PX1FNRl9CQU5EU19IWUJSSUQyMDsgaSsrKSB7Ci0gICAgc2NhbGUgPSBmTWluKHNjYWxlLCBnZXRTY2FsZWZhY3RvcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oeWJyaWQubVFtZkJ1ZmZlclJlYWxTbG90W2ldLCBOT19TVUJfUU1GX0NIQU5ORUxTKSk7Ci0gICAgc2NhbGUgPSBmTWluKHNjYWxlLCBnZXRTY2FsZWZhY3RvcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oeWJyaWQubVFtZkJ1ZmZlckltYWdTbG90W2ldLCBOT19TVUJfUU1GX0NIQU5ORUxTKSk7Ci0gIH0KLQotICBmb3IgKGk9MDsgaTxOT19TQU1QTEVfREVMQVlfQUxMUEFTUzsgaSsrKSB7Ci0gICAgc2NhbGUgPSBmTWluKHNjYWxlLCBnZXRTY2FsZWZhY3RvcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYVJlYWxEZWxheUJ1ZmZlclFtZltpXSwgRklSU1RfREVMQVlfU0IpKTsKLSAgICBzY2FsZSA9IGZNaW4oc2NhbGUsIGdldFNjYWxlZmFjdG9yKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhSW1hZ0RlbGF5QnVmZmVyUW1mW2ldLCBGSVJTVF9ERUxBWV9TQikpOwotICB9Ci0KLSAgZm9yIChpPTA7IGk8Tk9fU0FNUExFX0RFTEFZX0FMTFBBU1M7IGkrKykgewotICAgIHNjYWxlID0gZk1pbihzY2FsZSwgZ2V0U2NhbGVmYWN0b3IoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFSZWFsRGVsYXlCdWZmZXJTdWJRbWZbaV0sIE5PX1NVQl9RTUZfQ0hBTk5FTFMpKTsKLSAgICBzY2FsZSA9IGZNaW4oc2NhbGUsIGdldFNjYWxlZmFjdG9yKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhSW1hZ0RlbGF5QnVmZmVyU3ViUW1mW2ldLCBOT19TVUJfUU1GX0NIQU5ORUxTKSk7Ci0gIH0KLQotICBmb3IgKGk9MDsgaTxGSVJTVF9ERUxBWV9TQjsgaSsrKSB7Ci0gICAgc2NhbGUgPSBmTWluKHNjYWxlLCBnZXRTY2FsZWZhY3RvcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFSZWFsRGVsYXlSQnVmZmVyU2VyUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUykpOwotICAgIHNjYWxlID0gZk1pbihzY2FsZSwgZ2V0U2NhbGVmYWN0b3IoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMpKTsKLSAgfQotCi0gIGZvciAoaT0wOyBpPE5PX1NVQl9RTUZfQ0hBTk5FTFM7IGkrKykgewotICAgIHNjYWxlID0gZk1pbihzY2FsZSwgZ2V0U2NhbGVmYWN0b3IoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhUmVhbERlbGF5UkJ1ZmZlclNlclN1YlFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMpKTsKLSAgICBzY2FsZSA9IGZNaW4oc2NhbGUsIGdldFNjYWxlZmFjdG9yKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYUltYWdEZWxheVJCdWZmZXJTZXJTdWJRbWZbaV0sIE5PX0RFTEFZX0xFTkdUSF9WRUNUT1JTKSk7Ci0gIH0KLQotICBmb3IgKGk9MDsgaTxNQVhfREVMQVlfQlVGRkVSX1NJWkU7IGkrKykKLSAgewotICAgIElOVCBsZW47Ci0gICAgaWYgKGk9PTApCi0gICAgICBsZW4gPSBOT19RTUZfQ0hBTk5FTFMtRklSU1RfREVMQVlfU0I7Ci0gICAgZWxzZQotICAgICAgbGVuID0gTk9fREVMQVlfQlVGRkVSX0JBTkRTLUZJUlNUX0RFTEFZX1NCOwotCi0gICAgc2NhbGUgPSBmTWluKHNjYWxlLCBnZXRTY2FsZWZhY3RvcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFSZWFsRGVsYXlCdWZmZXJRbWZbaV0sIGxlbikpOwotICAgIHNjYWxlID0gZk1pbihzY2FsZSwgZ2V0U2NhbGVmYWN0b3IoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhSW1hZ0RlbGF5QnVmZmVyUW1mW2ldLCBsZW4pKTsKLSAgfQotCi0gIHJldHVybiAoc2NhbGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyohCi0gIFxicmllZiAgUmVzY2FsZSBhbGwgcHMgZGVsYXkgYnVmZmVyLgotCi0gIFxyZXR1cm4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYwotdm9pZCBzY2FsZVBzU3RhdGVzQnVmZmVyKEhBTkRMRV9QU19ERUMgaF9wc19kLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgc2NhbGUpCi17Ci0gIElOVCBpOwotCi0gIGlmIChzY2FsZSA8IDApCi0gICAgc2NhbGUgPSBmaXhNYXgoKElOVClzY2FsZSwoSU5UKS0oREZSQUNUX0JJVFMtMSkpOwotICBlbHNlCi0gICAgc2NhbGUgPSBmaXhNaW4oKElOVClzY2FsZSwoSU5UKURGUkFDVF9CSVRTLTEpOwotCi0gIGZvciAoaT0wOyBpPE5PX1FNRl9CQU5EU19IWUJSSUQyMDsgaSsrKSB7Ci0gICAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZC5tUW1mQnVmZmVyUmVhbFNsb3RbaV0sIE5PX1NVQl9RTUZfQ0hBTk5FTFMsIHNjYWxlICk7Ci0gICAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZC5tUW1mQnVmZmVySW1hZ1Nsb3RbaV0sIE5PX1NVQl9RTUZfQ0hBTk5FTFMsIHNjYWxlICk7Ci0gIH0KLQotICBmb3IgKGk9MDsgaTxOT19TQU1QTEVfREVMQVlfQUxMUEFTUzsgaSsrKSB7Ci0gICAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhUmVhbERlbGF5QnVmZmVyUW1mW2ldLCBGSVJTVF9ERUxBWV9TQiwgc2NhbGUgKTsKLSAgICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFJbWFnRGVsYXlCdWZmZXJRbWZbaV0sIEZJUlNUX0RFTEFZX1NCLCBzY2FsZSApOwotICB9Ci0KLSAgZm9yIChpPTA7IGk8Tk9fU0FNUExFX0RFTEFZX0FMTFBBU1M7IGkrKykgewotICAgIHNjYWxlVmFsdWVzKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYVJlYWxEZWxheUJ1ZmZlclN1YlFtZltpXSwgTk9fU1VCX1FNRl9DSEFOTkVMUywgc2NhbGUgKTsKLSAgICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFJbWFnRGVsYXlCdWZmZXJTdWJRbWZbaV0sIE5PX1NVQl9RTUZfQ0hBTk5FTFMsIHNjYWxlICk7Ci0gIH0KLQotICBmb3IgKGk9MDsgaTxGSVJTVF9ERUxBWV9TQjsgaSsrKSB7Ci0gICAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYVJlYWxEZWxheVJCdWZmZXJTZXJRbWZbaV0sIE5PX0RFTEFZX0xFTkdUSF9WRUNUT1JTLCBzY2FsZSApOwotICAgIHNjYWxlVmFsdWVzKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFJbWFnRGVsYXlSQnVmZmVyU2VyUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUywgc2NhbGUgKTsKLSAgfQotCi0gIGZvciAoaT0wOyBpPE5PX1NVQl9RTUZfQ0hBTk5FTFM7IGkrKykgewotICAgIHNjYWxlVmFsdWVzKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFSZWFsRGVsYXlSQnVmZmVyU2VyU3ViUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUywgc2NhbGUgKTsKLSAgICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclN1YlFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMsIHNjYWxlICk7Ci0gIH0KLQotICBmb3IgKGk9MDsgaTxNQVhfREVMQVlfQlVGRkVSX1NJWkU7IGkrKykgewotICAgIElOVCBsZW47Ci0gICAgaWYgKGk9PTApCi0gICAgICBsZW4gPSBOT19RTUZfQ0hBTk5FTFMtRklSU1RfREVMQVlfU0I7Ci0gICAgZWxzZQotICAgICAgbGVuID0gTk9fREVMQVlfQlVGRkVSX0JBTkRTLUZJUlNUX0RFTEFZX1NCOwotCi0gICAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYVJlYWxEZWxheUJ1ZmZlclFtZltpXSwgbGVuLCBzY2FsZSApOwotICAgIHNjYWxlVmFsdWVzKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFJbWFnRGVsYXlCdWZmZXJRbWZbaV0sIGxlbiwgc2NhbGUgKTsKLSAgfQotCi0gIHNjYWxlIDw8PSAxOwotCi0gIHNjYWxlVmFsdWVzKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUGVha0RlY2F5RmFzdEJpbiwgTk9fTUlEX1JFU19CSU5TLCBzY2FsZSApOwotICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVByZXZQZWFrRGlmZkJpbiwgTk9fTUlEX1JFU19CSU5TLCBzY2FsZSApOwotICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVByZXZOcmdCaW4sIE5PX01JRF9SRVNfQklOUywgc2NhbGUgKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIQotICBcYnJpZWYgIFNjYWxlIGlucHV0IGNoYW5uZWwgdG8gdGhlIHNhbWUgc2NhbGVmYWN0b3IgYW5kIHJlc2NhbGUgaHlicmlkCi0gICAgICAgICAgZmlsdGVyYmFuayB2YWx1ZXMKLQotICBccmV0dXJuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgc2NhbEZpbHRlckJhbmtWYWx1ZXMoIEhBTkRMRV9QU19ERUMgICBoX3BzX2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICoqZml4cFFtZlJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICoqZml4cFFtZkltYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbHNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0TG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0SGlnaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICpzY2FsZUZhY3Rvckxvd0JhbmRfbGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgICAqc2NhbGVGYWN0b3JMb3dCYW5kX2hiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNjYWxlRmFjdG9ySGlnaEJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKnNjYWxlRmFjdG9ySGlnaEJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgbm9Db2xzCi0gICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICBJTlQgbWF4U2NhbDsKLQotICBJTlQgaTsKLQotICBzY2FsZUZhY3RvckhpZ2hCYW5kcyAgICAgICAgPSAgLXNjYWxlRmFjdG9ySGlnaEJhbmRzOwotICBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdExvdyAgPSAgLXNjYWxlRmFjdG9yTG93QmFuZFNwbGl0TG93OwotICBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdEhpZ2ggPSAgLXNjYWxlRmFjdG9yTG93QmFuZFNwbGl0SGlnaDsKLQotICAvKiBnZXQgbWF4IHNjYWxlIGZhY3RvciAqLwotICBtYXhTY2FsID0gZml4TWF4KHNjYWxlRmFjdG9ySGlnaEJhbmRzLGZpeE1heChzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdExvdywgc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRIaWdoICkpOwotCi0gIHsKLSAgICBpbnQgaGVhZHJvb20gID0gZ2V0U2NhbGVGYWN0b3JQc1N0YXRlc0J1ZmZlcihoX3BzX2QpOwotICAgIG1heFNjYWwgICA9IGZpeE1heChtYXhTY2FsLChJTlQpKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnNjYWxlRmFjdG9yUHNEZWxheUJ1ZmZlci1oZWFkcm9vbSkpOwotICAgIG1heFNjYWwgICs9IDE7Ci0gIH0KLQotICAvKiBzY2FsZSB3aG9sZSBsZWZ0IGNoYW5uZWwgdG8gdGhlIHNhbWUgc2NhbGUgZmFjdG9yICovCi0KLSAgLyogbG93IGJhbmQgKCBvdmVybGFwIGJ1ZmZlciApICovCi0gIGlmICggbWF4U2NhbCAhPSBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdExvdyApIHsKLSAgICBJTlQgc2NhbGUgPSBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdExvdyAtIG1heFNjYWw7Ci0gICAgZm9yICggaT0wOyBpPCg2KTsgaSsrICkgewotICAgICAgc2NhbGVWYWx1ZXMoIGZpeHBRbWZSZWFsW2ldLCBsc2IsIHNjYWxlICk7Ci0gICAgICBzY2FsZVZhbHVlcyggZml4cFFtZkltYWdbaV0sIGxzYiwgc2NhbGUgKTsKLSAgICB9Ci0gIH0KLSAgLyogbG93IGJhbmQgKCBjdXJyZW50IGZyYW1lICkgKi8KLSAgaWYgKCBtYXhTY2FsICE9IHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0SGlnaCApIHsKLSAgICBJTlQgc2NhbGUgPSBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdEhpZ2ggLSBtYXhTY2FsOwotICAgIC8qIGZvciAoIGk9KDYpOyBpPCg2KStNQVhfTlVNX0NPTDsgaSsrICkgeyAqLwotICAgIGZvciAoIGk9KDYpOyBpPCg2KStub0NvbHM7IGkrKyApIHsKLSAgICAgIHNjYWxlVmFsdWVzKCBmaXhwUW1mUmVhbFtpXSwgbHNiLCBzY2FsZSApOwotICAgICAgc2NhbGVWYWx1ZXMoIGZpeHBRbWZJbWFnW2ldLCBsc2IsIHNjYWxlICk7Ci0gICAgfQotICB9Ci0gIC8qIGhpZ2ggYmFuZCAqLwotICBpZiAoIG1heFNjYWwgIT0gc2NhbGVGYWN0b3JIaWdoQmFuZHMgKSB7Ci0gICAgSU5UIHNjYWxlID0gc2NhbGVGYWN0b3JIaWdoQmFuZHMgLSBtYXhTY2FsOwotICAgIC8qIGZvciAoIGk9MDsgaTxNQVhfTlVNX0NPTDsgaSsrICkgeyAqLwotICAgIGZvciAoIGk9MDsgaTxub0NvbHM7IGkrKyApIHsKLSAgICAgIHNjYWxlVmFsdWVzKCAmZml4cFFtZlJlYWxbaV1bbHNiXSwgKDY0KS1sc2IsIHNjYWxlICk7Ci0gICAgICBzY2FsZVZhbHVlcyggJmZpeHBRbWZJbWFnW2ldW2xzYl0sICg2NCktbHNiLCBzY2FsZSApOwotICAgIH0KLSAgfQotCi0gIGlmICggbWF4U2NhbCAhPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5zY2FsZUZhY3RvclBzRGVsYXlCdWZmZXIgKQotICAgIHNjYWxlUHNTdGF0ZXNCdWZmZXIoaF9wc19kLChoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5zY2FsZUZhY3RvclBzRGVsYXlCdWZmZXItbWF4U2NhbCkpOwotCi0gIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZC5zZl9tUW1mQnVmZmVyID0gbWF4U2NhbDsKLSAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuc2NhbGVGYWN0b3JQc0RlbGF5QnVmZmVyID0gbWF4U2NhbDsKLQotICAqc2NhbGVGYWN0b3JIaWdoQmFuZCArPSBtYXhTY2FsIC0gc2NhbGVGYWN0b3JIaWdoQmFuZHM7Ci0KLSAgaF9wc19kLT5yZXNjYWwgPSBtYXhTY2FsIC0gc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRIaWdoOwotICBoX3BzX2QtPnNmX0ludEJ1ZmZlciA9IG1heFNjYWw7Ci0KLSAgKnNjYWxlRmFjdG9yTG93QmFuZF9sYiArPSBtYXhTY2FsIC0gc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRMb3c7Ci0gICpzY2FsZUZhY3Rvckxvd0JhbmRfaGIgKz0gbWF4U2NhbCAtIHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0SGlnaDsKLX0KLQotdm9pZCByZXNjYWxGaWx0ZXJCYW5rVmFsdWVzKCBIQU5ETEVfUFNfREVDICAgaF9wc19kLCAgICAgICAgICAgICAgICAgICAgICAvKiBwYXJhbWV0cmljIHN0ZXJlbyBkZWNvZGVyIGhhbmRsZSAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqKlFtZkJ1ZmZlclJlYWwsICAgICAgICAgICAgICAgLyogcW1mIGZpbHRlcmJhbmsgdmFsdWVzICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKipRbWZCdWZmZXJJbWFnLCAgICAgICAgICAgICAgIC8qIHFtZiBmaWx0ZXJiYW5rIHZhbHVlcyAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbHNiLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYnIgc3RhcnQgc3ViYmFuZCAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgIG5vQ29scykKLXsKLSAgaW50IGk7Ci0gIC8qIHNjYWxlIGJhY2sgNiB0aW1lc2xvdHMgbG9vayBhaGVhZCBmb3IgaHlicmlkIGZpbHRlcmJhbmsgdG8gb3JpZ2luYWwgdmFsdWUgKi8KLSAgZm9yICggaT1ub0NvbHM7IGk8bm9Db2xzICsgKDYpOyBpKysgKSB7Ci0gICAgc2NhbGVWYWx1ZXMoIFFtZkJ1ZmZlclJlYWxbaV0sIGxzYiwgaF9wc19kLT5yZXNjYWwgKTsKLSAgICBzY2FsZVZhbHVlcyggUW1mQnVmZmVySW1hZ1tpXSwgbHNiLCBoX3BzX2QtPnJlc2NhbCApOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiEKLSAgXGJyaWVmICBHZW5lcmF0ZSBkZWNvcnJlbGF0ZWQgc2lkZSBjaGFubmVsIHVzaW5nIGFsbHBhc3MvZGVsYXkKLQotICBccmV0dXJuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotZGVDb3JyZWxhdGVTbG90QmFzZWQoIEhBTkRMRV9QU19ERUMgaF9wc19kLCAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byB0aGUgbW9kdWxlIHN0YXRlICovCi0KLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqbUh5YnJpZFJlYWxMZWZ0LCAgICAvKiE8IGxlZnQgKG1vbm8pIGh5YnJpZCB2YWx1ZXMgcmVhbCAqLwotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICptSHlicmlkSW1hZ0xlZnQsICAgIC8qITwgbGVmdCAobW9ubykgaHlicmlkIHZhbHVlcyBpbWFnICovCi0gICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgIHNmX21IeWJyaWRMZWZ0LCAgICAgLyohPCBzY2FsZWZhY3RvciBmb3IgbGVmdCAobW9ubykgaHlicmlkIGJhbmRzICovCi0KLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqckludEJ1ZmZlckxlZnQsICAgICAvKiE8IHJlYWwgcW1mIGJhbmRzIGxlZnQgKG1vbm8pICgzOHg2NCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqaUludEJ1ZmZlckxlZnQsICAgICAvKiE8IHJlYWwgcW1mIGJhbmRzIGxlZnQgKG1vbm8pICgzOHg2NCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgc2ZfSW50QnVmZmVyLCAgICAgICAvKiE8IHNjYWxlZmFjdG9yIGZvciBhbGwgbGVmdCBhbmQgcmlnaHQgcW1mIGJhbmRzICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICptSHlicmlkUmVhbFJpZ2h0LCAgIC8qITwgcmlnaHQgKGRlY29ycmVsYXRlZCkgaHlicmlkIHZhbHVlcyByZWFsICovCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKm1IeWJyaWRJbWFnUmlnaHQsICAgLyohPCByaWdodCAoZGVjb3JyZWxhdGVkKSBoeWJyaWQgdmFsdWVzIGltYWcgKi8KLQotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpySW50QnVmZmVyUmlnaHQsICAgIC8qITwgcmVhbCBxbWYgYmFuZHMgcmlnaHQgKGRlY29ycmVsYXRlZCkgKDM4eDY0KSAqLwotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICppSW50QnVmZmVyUmlnaHQgKSAgIC8qITwgcmVhbCBxbWYgYmFuZHMgcmlnaHQgKGRlY29ycmVsYXRlZCkgKDM4eDY0KSAqLwotewotCi0gIElOVCAgaSwgbSwgc2IsIGdyLCBiaW47Ci0KLSAgRklYUF9EQkwgcGVha0RpZmYsIG5yZywgdHJhbnNSYXRpbzsKLQotICBGSVhQX0RCTCAqUkVTVFJJQ1QgYWFMZWZ0UmVhbDsKLSAgRklYUF9EQkwgKlJFU1RSSUNUIGFhTGVmdEltYWc7Ci0KLSAgRklYUF9EQkwgKlJFU1RSSUNUIGFhUmlnaHRSZWFsOwotICBGSVhQX0RCTCAqUkVTVFJJQ1QgYWFSaWdodEltYWc7Ci0KLSAgRklYUF9EQkwgKlJFU1RSSUNUIHBSZWFsRGVsYXlCdWZmZXI7Ci0gIEZJWFBfREJMICpSRVNUUklDVCBwSW1hZ0RlbGF5QnVmZmVyOwotCi0gIENfQUxMT0NfU0NSQVRDSF9TVEFSVChhYVBvd2VyU2xvdCwgRklYUF9EQkwsIE5PX01JRF9SRVNfQklOUyk7Ci0gIENfQUxMT0NfU0NSQVRDSF9TVEFSVChhYVRyYW5zUmF0aW9TbG90LCBGSVhQX0RCTCwgTk9fTUlEX1JFU19CSU5TKTsKLQotLyohCi08cHJlPgotICAgcGFyYW1ldGVyIGluZGV4ICAgICAgIHFtZiBiYW5kcyAgICAgICAgICAgICBoeWJyaWQgYmFuZHMKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgIDAsNwotICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgIDEsNgotICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgIDIKLSAgICAgICAgIDMgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgICBIWUJSSUQgQkFORFMKLSAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICA5Ci0gICAgICAgICA1ICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgOAotICAgICAgICAgNiAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgMTAKLSAgICAgICAgIDcgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIDExCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgIDggICAgICAgICAgICAgICAgICAgMwotICAgICAgICAgOSAgICAgICAgICAgICAgICAgICA0Ci0gICAgICAgIDEwICAgICAgICAgICAgICAgICAgIDUKLSAgICAgICAgMTEgICAgICAgICAgICAgICAgICAgNgotICAgICAgICAxMiAgICAgICAgICAgICAgICAgICA3Ci0gICAgICAgIDEzICAgICAgICAgICAgICAgICAgIDgKLSAgICAgICAgMTQgICAgICAgICAgICAgICAgICAgOSwxMCAgICAgICgyICkgICAgICAgICAgICAgICAgICAgICAgUU1GIEJBTkRTCi0gICAgICAgIDE1ICAgICAgICAgICAgICAgICAgIDExIC0gMTMgICAoMyApCi0gICAgICAgIDE2ICAgICAgICAgICAgICAgICAgIDE0IC0gMTcgICAoNCApCi0gICAgICAgIDE3ICAgICAgICAgICAgICAgICAgIDE4IC0gMjIgICAoNSApCi0gICAgICAgIDE4ICAgICAgICAgICAgICAgICAgIDIzIC0gMzQgICAoMTIpCi0gICAgICAgIDE5ICAgICAgICAgICAgICAgICAgIDM1IC0gNjMgICAoMjkpCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTwvcHJlPgotKi8KLQotICAjZGVmaW5lIEZMVFJfU0NBTEUgMwotCi0gIC8qIGh5YnJpZCBiYW5kcyAocGFyYW1ldGVyIGluZGV4IDAgLSA3KSAqLwotICBhYUxlZnRSZWFsICA9IG1IeWJyaWRSZWFsTGVmdDsKLSAgYWFMZWZ0SW1hZyAgPSBtSHlicmlkSW1hZ0xlZnQ7Ci0KLSAgYWFQb3dlclNsb3RbMF0gPSAoIGZNdWx0QWRkRGl2MiggZk11bHREaXYyKGFhTGVmdFJlYWxbMF0sICBhYUxlZnRSZWFsWzBdKSwgIGFhTGVmdEltYWdbMF0sICBhYUxlZnRJbWFnWzBdICkgPj4gRkxUUl9TQ0FMRSApICsKLSAgICAgICAgICAgICAgICAgICAoIGZNdWx0QWRkRGl2MiggZk11bHREaXYyKGFhTGVmdFJlYWxbN10sICBhYUxlZnRSZWFsWzddKSwgIGFhTGVmdEltYWdbN10sICBhYUxlZnRJbWFnWzddICkgPj4gRkxUUl9TQ0FMRSApOwotCi0gIGFhUG93ZXJTbG90WzFdID0gKCBmTXVsdEFkZERpdjIoIGZNdWx0RGl2MihhYUxlZnRSZWFsWzFdLCAgYWFMZWZ0UmVhbFsxXSksICBhYUxlZnRJbWFnWzFdLCAgYWFMZWZ0SW1hZ1sxXSApID4+IEZMVFJfU0NBTEUgKSArCi0gICAgICAgICAgICAgICAgICAgKCBmTXVsdEFkZERpdjIoIGZNdWx0RGl2MihhYUxlZnRSZWFsWzZdLCAgYWFMZWZ0UmVhbFs2XSksICBhYUxlZnRJbWFnWzZdLCAgYWFMZWZ0SW1hZ1s2XSApID4+IEZMVFJfU0NBTEUgKTsKLQotICBhYVBvd2VyU2xvdFsyXSA9ICAgZk11bHRBZGREaXYyKCBmTXVsdERpdjIoYWFMZWZ0UmVhbFsyXSwgIGFhTGVmdFJlYWxbMl0pLCAgYWFMZWZ0SW1hZ1syXSwgIGFhTGVmdEltYWdbMl0gKSA+PiBGTFRSX1NDQUxFOwotICBhYVBvd2VyU2xvdFszXSA9ICAgZk11bHRBZGREaXYyKCBmTXVsdERpdjIoYWFMZWZ0UmVhbFszXSwgIGFhTGVmdFJlYWxbM10pLCAgYWFMZWZ0SW1hZ1szXSwgIGFhTGVmdEltYWdbM10gKSA+PiBGTFRSX1NDQUxFOwotCi0gIGFhUG93ZXJTbG90WzRdID0gICBmTXVsdEFkZERpdjIoIGZNdWx0RGl2MihhYUxlZnRSZWFsWzldLCAgYWFMZWZ0UmVhbFs5XSksICBhYUxlZnRJbWFnWzldLCAgYWFMZWZ0SW1hZ1s5XSApID4+IEZMVFJfU0NBTEU7Ci0gIGFhUG93ZXJTbG90WzVdID0gICBmTXVsdEFkZERpdjIoIGZNdWx0RGl2MihhYUxlZnRSZWFsWzhdLCAgYWFMZWZ0UmVhbFs4XSksICBhYUxlZnRJbWFnWzhdLCAgYWFMZWZ0SW1hZ1s4XSApID4+IEZMVFJfU0NBTEU7Ci0KLSAgYWFQb3dlclNsb3RbNl0gPSAgIGZNdWx0QWRkRGl2MiggZk11bHREaXYyKGFhTGVmdFJlYWxbMTBdLCBhYUxlZnRSZWFsWzEwXSksIGFhTGVmdEltYWdbMTBdLCBhYUxlZnRJbWFnWzEwXSApID4+IEZMVFJfU0NBTEU7Ci0gIGFhUG93ZXJTbG90WzddID0gICBmTXVsdEFkZERpdjIoIGZNdWx0RGl2MihhYUxlZnRSZWFsWzExXSwgYWFMZWZ0UmVhbFsxMV0pLCBhYUxlZnRJbWFnWzExXSwgYWFMZWZ0SW1hZ1sxMV0gKSA+PiBGTFRSX1NDQUxFOwotCi0gIC8qIHFtZiBiYW5kcyAocGFyYW1ldGVyIGluZGV4IDggLSAxOSkgKi8KLSAgZm9yICggYmluID0gODsgYmluIDwgTk9fTUlEX1JFU19CSU5TOyBiaW4rKyApIHsKLSAgICBGSVhQX0RCTCBzbG90TnJnID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKLQotICAgIGZvciAoIGkgPSBncm91cEJvcmRlcnMyMFtiaW4rMl07IGkgPCBncm91cEJvcmRlcnMyMFtiaW4rM107IGkrKyApIHsgIC8qIG1heCBsb29wczogMjkgKi8KLSAgICAgIHNsb3ROcmcgKz0gZk11bHRBZGREaXYyICggZk11bHREaXYyKHJJbnRCdWZmZXJMZWZ0W2ldLCBySW50QnVmZmVyTGVmdFtpXSksIGlJbnRCdWZmZXJMZWZ0W2ldLCBpSW50QnVmZmVyTGVmdFtpXSkgPj4gRkxUUl9TQ0FMRTsKLSAgICB9Ci0gICAgYWFQb3dlclNsb3RbYmluXSA9IHNsb3ROcmc7Ci0KLSAgfQotCi0KLSAgLyogY2FsY3VsYXRpb24gb2YgdHJhbnNpZW50IHJhdGlvICovCi0gIGZvciAoYmluPTA7IGJpbiA8IE5PX01JRF9SRVNfQklOUzsgYmluKyspIHsgICAvKiBub0JpbnMgPSAyMCAoIEJBU0VMSU5FX1BTICkgKi8KLQotICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQZWFrRGVjYXlGYXN0QmluW2Jpbl0gPSBmTXVsdCggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVBlYWtEZWNheUZhc3RCaW5bYmluXSwgUEVBS19ERUNBWV9GQUNUT1IgKTsKLQotICAgIGlmIChoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUGVha0RlY2F5RmFzdEJpbltiaW5dIDwgYWFQb3dlclNsb3RbYmluXSkgewotICAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVBlYWtEZWNheUZhc3RCaW5bYmluXSA9IGFhUG93ZXJTbG90W2Jpbl07Ci0gICAgfQotCi0gICAgLyogY2FsY3VsYXRlIFBTbW9vdGhQZWFrRGVjYXlEaWZmTnJnICovCi0gICAgcGVha0RpZmYgPSBmTXVsdEFkZCAoIChoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUHJldlBlYWtEaWZmQmluW2Jpbl0+PjEpLAotICAgICAgICAgICAgICAgICBJTlRfRklMVEVSX0NPRUZGLCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUGVha0RlY2F5RmFzdEJpbltiaW5dIC0gYWFQb3dlclNsb3RbYmluXSAtIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQcmV2UGVha0RpZmZCaW5bYmluXSk7Ci0KLSAgICAvKiBzYXZlIHBlYWtEaWZmIGZvciB0aGUgbmV4dCBmcmFtZSAqLwotICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQcmV2UGVha0RpZmZCaW5bYmluXSA9IHBlYWtEaWZmOwotCi0gICAgbnJnID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVByZXZOcmdCaW5bYmluXSArIGZNdWx0KCBJTlRfRklMVEVSX0NPRUZGLCBhYVBvd2VyU2xvdFtiaW5dIC0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVByZXZOcmdCaW5bYmluXSApOwotCi0gICAgLyogTmVnYXRpdmUgZW5lcmdpZXMgZG9uJ3QgZXhpc3QuIEJ1dCBzb21ldGltZXMgdGhleSBhcHBlYXIgZHVlIHRvIHJvdW5kaW5nLiAqLwotCi0gICAgbnJnID0gZml4TWF4KG5yZyxGTDJGWENPTlNUX0RCTCgwLmYpKTsKLQotICAgIC8qIHNhdmUgbnJnIGZvciB0aGUgbmV4dCBmcmFtZSAqLwotICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQcmV2TnJnQmluW2Jpbl0gPSBucmc7Ci0KLSAgICBucmcgPSBmTXVsdCggbnJnLCBUUkFOU0lFTlRfSU1QQUNUX0ZBQ1RPUiApOwotCi0gICAgLyogc2F2ZSB0cmFuc2llbnQgaW1wYWN0IGZhY3RvciAqLwotICAgIGlmICggcGVha0RpZmYgPD0gbnJnIHx8IHBlYWtEaWZmID09IEZMMkZYQ09OU1RfREJMKDAuMCkgKSB7Ci0gICAgICBhYVRyYW5zUmF0aW9TbG90W2Jpbl0gPSAoRklYUF9EQkwpTUFYVkFMX0RCTCAvKiBGTDJGWENPTlNUX0RCTCgxLjBmKSovOwotICAgIH0KLSAgICBlbHNlIGlmICggbnJnIDw9IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgewotICAgICAgICBhYVRyYW5zUmF0aW9TbG90W2Jpbl0gPSBGTDJGWENPTlNUX0RCTCgwLmYpOwotICAgICAgfQotICAgIGVsc2UgewotICAgICAgLyogc2NhbGUgdG8gZGVub21pbmF0b3IgKi8KLSAgICAgIElOVCBzY2FsZV9sZWZ0ID0gZml4TWF4KDAsIENudExlYWRpbmdaZXJvcyhwZWFrRGlmZikgLSAxKTsKLSAgICAgIGFhVHJhbnNSYXRpb1Nsb3RbYmluXSA9IHNjaHVyX2RpdiggbnJnPDxzY2FsZV9sZWZ0LCBwZWFrRGlmZjw8c2NhbGVfbGVmdCwgMTYpOwotICAgIH0KLSAgfSAvKiBiaW4gKi8KLQotCi0KLQotICAjZGVmaW5lIERFTEFZX0dST1VQX09GRlNFVCAgICAyMAotICAjZGVmaW5lIE5SX09GX0RFTEFZX0dST1VQUyAgICAgMgotCi0gIEZJWFBfREJMIHJUbXAsIGlUbXAsIHJUbXAwLCBpVG1wMCwgclIwLCBpUjA7Ci0KLSAgSU5UIFRlbXBEZWxheSAgICAgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5kZWxheUJ1ZkluZGV4OyAgLyogc2V0IGRlbGF5IGluZGljZXMgKi8KLQotICBwUmVhbERlbGF5QnVmZmVyID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFSZWFsRGVsYXlCdWZmZXJTdWJRbWZbVGVtcERlbGF5XTsKLSAgcEltYWdEZWxheUJ1ZmZlciA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhSW1hZ0RlbGF5QnVmZmVyU3ViUW1mW1RlbXBEZWxheV07Ci0KLSAgYWFMZWZ0UmVhbCAgPSBtSHlicmlkUmVhbExlZnQ7Ci0gIGFhTGVmdEltYWcgID0gbUh5YnJpZEltYWdMZWZ0OwotICBhYVJpZ2h0UmVhbCA9IG1IeWJyaWRSZWFsUmlnaHQ7Ci0gIGFhUmlnaHRJbWFnID0gbUh5YnJpZEltYWdSaWdodDsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiBJQ0MgZ3JvdXBzIDogIDAgLSAgOSAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIGdyID0gSUNDIGdyb3VwcyAqLwotICBmb3IgKGdyPTA7IGdyIDwgU1VCUU1GX0dST1VQUzsgZ3IrKykgewotCi0gICAgdHJhbnNSYXRpbyA9IGFhVHJhbnNSYXRpb1Nsb3RbYmluczJncm91cE1hcDIwW2dyXV07Ci0KLSAgICAvKiBzYiA9IHN1YlFNRi9RTUYgc3ViYmFuZCAqLwotICAgIHNiID0gZ3JvdXBCb3JkZXJzMjBbZ3JdOwotCi0gICAgLyogVXBkYXRlIGRlbGF5IGJ1ZmZlcnMsIHNhbXBsZSBkZWxheSBhbGxwYXNzID0gMiAqLwotICAgIHJUbXAwID0gcFJlYWxEZWxheUJ1ZmZlcltzYl07Ci0gICAgaVRtcDAgPSBwSW1hZ0RlbGF5QnVmZmVyW3NiXTsKLQotICAgIHBSZWFsRGVsYXlCdWZmZXJbc2JdID0gYWFMZWZ0UmVhbFtzYl07Ci0gICAgcEltYWdEZWxheUJ1ZmZlcltzYl0gPSBhYUxlZnRJbWFnW3NiXTsKLQotICAgIC8qIGRlbGF5IGJ5IGZyYWN0aW9uICovCi0gICAgY3BseE11bHREaXYyKCZyUjAsICZpUjAsIHJUbXAwLCBpVG1wMCwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JSZVN1YlFtZjIwW3NiXSwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JJbVN1YlFtZjIwW3NiXSk7Ci0gICAgclIwPDw9MTsKLSAgICBpUjA8PD0xOwotCi0gICAgRklYUF9EQkwgKnBBYWFSZWFsRGVsYXlSQnVmZmVyU2VyU3ViUW1mID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhUmVhbERlbGF5UkJ1ZmZlclNlclN1YlFtZltzYl07Ci0gICAgRklYUF9EQkwgKnBBYWFJbWFnRGVsYXlSQnVmZmVyU2VyU3ViUW1mID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclN1YlFtZltzYl07Ci0KLSAgICBmb3IgKG09MDsgbTxOT19TRVJJQUxfQUxMUEFTU19MSU5LUyA7IG0rKykgewotCi0gICAgICBJTlQgdG1wRGVsYXlSU2VyID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYURlbGF5UkJ1ZkluZGV4U2VyW21dOwotCi0gICAgICAvKiBnZXQgZGVsYXllZCB2YWx1ZXMgZnJvbSBhY2NvcmRpbmcgYnVmZmVyIDogbSgwKT0zOyBtKDEpPTQ7IG0oMik9NTsgKi8KLSAgICAgIHJUbXAwID0gcEFhYVJlYWxEZWxheVJCdWZmZXJTZXJTdWJRbWZbdG1wRGVsYXlSU2VyXTsKLSAgICAgIGlUbXAwID0gcEFhYUltYWdEZWxheVJCdWZmZXJTZXJTdWJRbWZbdG1wRGVsYXlSU2VyXTsKLQotICAgICAgLyogZGVsYXkgYnkgZnJhY3Rpb24gKi8KLSAgICAgIGNwbHhNdWx0RGl2MigmclRtcCwgJmlUbXAsIHJUbXAwLCBpVG1wMCwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JTZXJSZVN1YlFtZjIwW3NiXVttXSwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JTZXJJbVN1YlFtZjIwW3NiXVttXSk7Ci0KLSAgICAgIHJUbXAgPSAoclRtcCAtIGZNdWx0RGl2MihhQWxscGFzc0xpbmtEZWNheVNlclttXSwgclIwKSkgPDwgMTsKLSAgICAgIGlUbXAgPSAoaVRtcCAtIGZNdWx0RGl2MihhQWxscGFzc0xpbmtEZWNheVNlclttXSwgaVIwKSkgPDwgMTsKLQotICAgICAgcEFhYVJlYWxEZWxheVJCdWZmZXJTZXJTdWJRbWZbdG1wRGVsYXlSU2VyXSA9IHJSMCArIGZNdWx0KGFBbGxwYXNzTGlua0RlY2F5U2VyW21dLCByVG1wKTsKLSAgICAgIHBBYWFJbWFnRGVsYXlSQnVmZmVyU2VyU3ViUW1mW3RtcERlbGF5UlNlcl0gPSBpUjAgKyBmTXVsdChhQWxscGFzc0xpbmtEZWNheVNlclttXSwgaVRtcCk7Ci0KLSAgICAgIHJSMCA9IHJUbXA7Ci0gICAgICBpUjAgPSBpVG1wOwotCi0gICAgICBwQWFhUmVhbERlbGF5UkJ1ZmZlclNlclN1YlFtZiArPSBhQWxscGFzc0xpbmtEZWxheVNlclttXTsKLSAgICAgIHBBYWFJbWFnRGVsYXlSQnVmZmVyU2VyU3ViUW1mICs9IGFBbGxwYXNzTGlua0RlbGF5U2VyW21dOwotCi0gICAgfSAvKiBtICovCi0KLSAgICAvKiBkdWNrIGlmIGEgcGFzdCB0cmFuc2llbnQgaXMgZm91bmQgKi8KLSAgICBhYVJpZ2h0UmVhbFtzYl0gPSBmTXVsdCh0cmFuc1JhdGlvLCByUjApOwotICAgIGFhUmlnaHRJbWFnW3NiXSA9IGZNdWx0KHRyYW5zUmF0aW8sIGlSMCk7Ci0KLSAgfSAvKiBnciAqLwotCi0KLSAgc2NhbGVWYWx1ZXMoIG1IeWJyaWRSZWFsTGVmdCwgIE5PX1NVQl9RTUZfQ0hBTk5FTFMsIC1TQ0FMX0hFQURST09NICk7Ci0gIHNjYWxlVmFsdWVzKCBtSHlicmlkSW1hZ0xlZnQsICBOT19TVUJfUU1GX0NIQU5ORUxTLCAtU0NBTF9IRUFEUk9PTSApOwotICBzY2FsZVZhbHVlcyggbUh5YnJpZFJlYWxSaWdodCwgTk9fU1VCX1FNRl9DSEFOTkVMUywgLVNDQUxfSEVBRFJPT00gKTsKLSAgc2NhbGVWYWx1ZXMoIG1IeWJyaWRJbWFnUmlnaHQsIE5PX1NVQl9RTUZfQ0hBTk5FTFMsIC1TQ0FMX0hFQURST09NICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIGFhTGVmdFJlYWwgID0gckludEJ1ZmZlckxlZnQ7Ci0gIGFhTGVmdEltYWcgID0gaUludEJ1ZmZlckxlZnQ7Ci0gIGFhUmlnaHRSZWFsID0gckludEJ1ZmZlclJpZ2h0OwotICBhYVJpZ2h0SW1hZyA9IGlJbnRCdWZmZXJSaWdodDsKLQotICBwUmVhbERlbGF5QnVmZmVyID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFSZWFsRGVsYXlCdWZmZXJRbWZbVGVtcERlbGF5XTsKLSAgcEltYWdEZWxheUJ1ZmZlciA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhSW1hZ0RlbGF5QnVmZmVyUW1mW1RlbXBEZWxheV07Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogSUNDIGdyb3VwcyA6IDEwIC0gMTkgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIGdyID0gSUNDIGdyb3VwcyAqLwotICBmb3IgKGdyPVNVQlFNRl9HUk9VUFM7IGdyIDwgTk9fSUlEX0dST1VQUyAtIE5SX09GX0RFTEFZX0dST1VQUzsgZ3IrKykgewotCi0gICAgdHJhbnNSYXRpbyA9IGFhVHJhbnNSYXRpb1Nsb3RbYmluczJncm91cE1hcDIwW2dyXV07Ci0KLSAgICAvKiBzYiA9IHN1YlFNRi9RTUYgc3ViYmFuZCAqLwotICAgIGZvciAoc2IgPSBncm91cEJvcmRlcnMyMFtncl07IHNiIDwgZ3JvdXBCb3JkZXJzMjBbZ3IrMV07IHNiKyspIHsKLSAgICAgIEZJWFBfREJMIHJlc1IsIHJlc0k7Ci0KLSAgICAgIC8qIGRlY2F5U2NhbGVGYWN0b3IgPSAxLjBmICsgZGVjYXlfY3V0b2ZmICogREVDQVlfU0xPUEUgLSBERUNBWV9TTE9QRSAqIHNiOyBERUNBWV9TTE9QRSA9IDAuMDUgKi8KLSAgICAgIEZJWFBfREJMIGRlY2F5U2NhbGVGYWN0b3IgPSBkZWNheVNjYWxlRmFjdFRhYmxlW3NiXTsKLQotICAgICAgLyogVXBkYXRlIGRlbGF5IGJ1ZmZlcnMsIHNhbXBsZSBkZWxheSBhbGxwYXNzID0gMiAqLwotICAgICAgclRtcDAgPSBwUmVhbERlbGF5QnVmZmVyW3NiXTsKLSAgICAgIGlUbXAwID0gcEltYWdEZWxheUJ1ZmZlcltzYl07Ci0KLSAgICAgIHBSZWFsRGVsYXlCdWZmZXJbc2JdID0gYWFMZWZ0UmVhbFtzYl07Ci0gICAgICBwSW1hZ0RlbGF5QnVmZmVyW3NiXSA9IGFhTGVmdEltYWdbc2JdOwotCi0gICAgICAvKiBkZWxheSBieSBmcmFjdGlvbiAqLwotICAgICAgY3BseE11bHREaXYyKCZyUjAsICZpUjAsIHJUbXAwLCBpVG1wMCwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JSZVFtZltzYl0sIGFhRnJhY3REZWxheVBoYXNlRmFjdG9ySW1RbWZbc2JdKTsKLSAgICAgIHJSMDw8PTE7Ci0gICAgICBpUjA8PD0xOwotCi0gICAgICByZXNSID0gZk11bHQoZGVjYXlTY2FsZUZhY3RvciwgclIwKTsKLSAgICAgIHJlc0kgPSBmTXVsdChkZWNheVNjYWxlRmFjdG9yLCBpUjApOwotCi0gICAgICBGSVhQX0RCTCAqcEFhYVJlYWxEZWxheVJCdWZmZXJTZXJRbWYgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFSZWFsRGVsYXlSQnVmZmVyU2VyUW1mW3NiXTsKLSAgICAgIEZJWFBfREJMICpwQWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclFtZiA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYUltYWdEZWxheVJCdWZmZXJTZXJRbWZbc2JdOwotCi0gICAgICBmb3IgKG09MDsgbTxOT19TRVJJQUxfQUxMUEFTU19MSU5LUyA7IG0rKykgewotCi0gICAgICAgIElOVCB0bXBEZWxheVJTZXIgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hRGVsYXlSQnVmSW5kZXhTZXJbbV07Ci0KLSAgICAgICAgLyogZ2V0IGRlbGF5ZWQgdmFsdWVzIGZyb20gYWNjb3JkaW5nIGJ1ZmZlciA6IG0oMCk9MzsgbSgxKT00OyBtKDIpPTU7ICovCi0gICAgICAgIHJUbXAwID0gcEFhYVJlYWxEZWxheVJCdWZmZXJTZXJRbWZbdG1wRGVsYXlSU2VyXTsKLSAgICAgICAgaVRtcDAgPSBwQWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclFtZlt0bXBEZWxheVJTZXJdOwotCi0gICAgICAgIC8qIGRlbGF5IGJ5IGZyYWN0aW9uICovCi0gICAgICAgIGNwbHhNdWx0RGl2MigmclRtcCwgJmlUbXAsIHJUbXAwLCBpVG1wMCwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JTZXJSZVFtZltzYl1bbV0sIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yU2VySW1RbWZbc2JdW21dKTsKLQotICAgICAgICByVG1wID0gKHJUbXAgLSBmTXVsdERpdjIoYUFsbHBhc3NMaW5rRGVjYXlTZXJbbV0sIHJlc1IpKTw8MTsKLSAgICAgICAgaVRtcCA9IChpVG1wIC0gZk11bHREaXYyKGFBbGxwYXNzTGlua0RlY2F5U2VyW21dLCByZXNJKSk8PDE7Ci0KLSAgICAgICAgcmVzUiA9IGZNdWx0KGRlY2F5U2NhbGVGYWN0b3IsIHJUbXApOwotICAgICAgICByZXNJID0gZk11bHQoZGVjYXlTY2FsZUZhY3RvciwgaVRtcCk7Ci0KLSAgICAgICAgcEFhYVJlYWxEZWxheVJCdWZmZXJTZXJRbWZbdG1wRGVsYXlSU2VyXSA9IHJSMCArIGZNdWx0KGFBbGxwYXNzTGlua0RlY2F5U2VyW21dLCByZXNSKTsKLSAgICAgICAgcEFhYUltYWdEZWxheVJCdWZmZXJTZXJRbWZbdG1wRGVsYXlSU2VyXSA9IGlSMCArIGZNdWx0KGFBbGxwYXNzTGlua0RlY2F5U2VyW21dLCByZXNJKTsKLQotICAgICAgICByUjAgPSByVG1wOwotICAgICAgICBpUjAgPSBpVG1wOwotCi0gICAgICAgIHBBYWFSZWFsRGVsYXlSQnVmZmVyU2VyUW1mICs9IGFBbGxwYXNzTGlua0RlbGF5U2VyW21dOwotICAgICAgICBwQWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclFtZiArPSBhQWxscGFzc0xpbmtEZWxheVNlclttXTsKLQotICAgICAgfSAvKiBtICovCi0KLSAgICAgIC8qIGR1Y2sgaWYgYSBwYXN0IHRyYW5zaWVudCBpcyBmb3VuZCAqLwotICAgICAgYWFSaWdodFJlYWxbc2JdID0gZk11bHQodHJhbnNSYXRpbywgclIwKTsKLSAgICAgIGFhUmlnaHRJbWFnW3NiXSA9IGZNdWx0KHRyYW5zUmF0aW8sIGlSMCk7Ci0KLSAgICB9IC8qIHNiICovCi0gIH0gLyogZ3IgKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiBJQ0MgZ3JvdXBzIDogMjAsICAyMSAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogZ3IgPSBJQ0MgZ3JvdXBzICovCi0gIGZvciAoZ3I9REVMQVlfR1JPVVBfT0ZGU0VUOyBnciA8IE5PX0lJRF9HUk9VUFM7IGdyKyspIHsKLQotICAgIElOVCBzYlN0YXJ0ID0gZ3JvdXBCb3JkZXJzMjBbZ3JdOwotICAgIElOVCBzYlN0b3AgID0gZ3JvdXBCb3JkZXJzMjBbZ3IrMV07Ci0KLSAgICBVQ0hBUiAqcERlbGF5QnVmSWR4ID0gJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFEZWxheUJ1ZkluZGV4RGVsYXlRbWZbc2JTdGFydC1GSVJTVF9ERUxBWV9TQl07Ci0KLSAgICB0cmFuc1JhdGlvID0gYWFUcmFuc1JhdGlvU2xvdFtiaW5zMmdyb3VwTWFwMjBbZ3JdXTsKLQotICAgIC8qIHNiID0gc3ViUU1GL1FNRiBzdWJiYW5kICovCi0gICAgZm9yIChzYiA9IHNiU3RhcnQ7IHNiIDwgc2JTdG9wOyBzYisrKSB7Ci0KLSAgICAgIC8qIFVwZGF0ZSBkZWxheSBidWZmZXJzICovCi0gICAgICByUjAgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFSZWFsRGVsYXlCdWZmZXJRbWZbKnBEZWxheUJ1ZklkeF1bc2ItRklSU1RfREVMQVlfU0JdOwotICAgICAgaVIwID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhSW1hZ0RlbGF5QnVmZmVyUW1mWypwRGVsYXlCdWZJZHhdW3NiLUZJUlNUX0RFTEFZX1NCXTsKLQotICAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhUmVhbERlbGF5QnVmZmVyUW1mWypwRGVsYXlCdWZJZHhdW3NiLUZJUlNUX0RFTEFZX1NCXSA9IGFhTGVmdFJlYWxbc2JdOwotICAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhSW1hZ0RlbGF5QnVmZmVyUW1mWypwRGVsYXlCdWZJZHhdW3NiLUZJUlNUX0RFTEFZX1NCXSA9IGFhTGVmdEltYWdbc2JdOwotCi0gICAgICAvKiBkdWNrIGlmIGEgcGFzdCB0cmFuc2llbnQgaXMgZm91bmQgKi8KLSAgICAgIGFhUmlnaHRSZWFsW3NiXSA9IGZNdWx0KHRyYW5zUmF0aW8sIHJSMCk7Ci0gICAgICBhYVJpZ2h0SW1hZ1tzYl0gPSBmTXVsdCh0cmFuc1JhdGlvLCBpUjApOwotCi0gICAgICBpZiAoKysoKnBEZWxheUJ1ZklkeCkgPj0gZGVsYXlJbmRleFFtZltzYl0pIHsKLSAgICAgICAgKnBEZWxheUJ1ZklkeCA9IDA7Ci0gICAgICB9Ci0gICAgICBwRGVsYXlCdWZJZHgrKzsKLQotICAgIH0gLyogc2IgKi8KLSAgfSAvKiBnciAqLwotCi0KLSAgLyogVXBkYXRlIGRlbGF5IGJ1ZmZlciBpbmRleCAqLwotICBpZiAoKytoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5kZWxheUJ1ZkluZGV4ID49IE5PX1NBTVBMRV9ERUxBWV9BTExQQVNTKQotICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmRlbGF5QnVmSW5kZXggPSAwOwotCi0gIGZvciAobT0wOyBtPE5PX1NFUklBTF9BTExQQVNTX0xJTktTIDsgbSsrKSB7Ci0gICAgaWYgKCsraF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYURlbGF5UkJ1ZkluZGV4U2VyW21dID49IGFBbGxwYXNzTGlua0RlbGF5U2VyW21dKQotICAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYURlbGF5UkJ1ZkluZGV4U2VyW21dID0gMDsKLSAgfQotCi0KLSAgc2NhbGVWYWx1ZXMoICZySW50QnVmZmVyTGVmdFtOT19RTUZfQkFORFNfSFlCUklEMjBdLCAgTk9fUU1GX0NIQU5ORUxTLU5PX1FNRl9CQU5EU19IWUJSSUQyMCwgLVNDQUxfSEVBRFJPT00gKTsKLSAgc2NhbGVWYWx1ZXMoICZpSW50QnVmZmVyTGVmdFtOT19RTUZfQkFORFNfSFlCUklEMjBdLCAgTk9fUU1GX0NIQU5ORUxTLU5PX1FNRl9CQU5EU19IWUJSSUQyMCwgLVNDQUxfSEVBRFJPT00gKTsKLSAgc2NhbGVWYWx1ZXMoICZySW50QnVmZmVyUmlnaHRbTk9fUU1GX0JBTkRTX0hZQlJJRDIwXSwgTk9fUU1GX0NIQU5ORUxTLU5PX1FNRl9CQU5EU19IWUJSSUQyMCwgLVNDQUxfSEVBRFJPT00gKTsKLSAgc2NhbGVWYWx1ZXMoICZpSW50QnVmZmVyUmlnaHRbTk9fUU1GX0JBTkRTX0hZQlJJRDIwXSwgTk9fUU1GX0NIQU5ORUxTLU5PX1FNRl9CQU5EU19IWUJSSUQyMCwgLVNDQUxfSEVBRFJPT00gKTsKLQotICAvKiBmcmVlIG1lbW9yeSBvbiBzY3JhdGNoICovCi0gIENfQUxMT0NfU0NSQVRDSF9FTkQoYWFUcmFuc1JhdGlvU2xvdCwgRklYUF9EQkwsIE5PX01JRF9SRVNfQklOUyk7Ci0gIENfQUxMT0NfU0NSQVRDSF9FTkQoYWFQb3dlclNsb3QsIEZJWFBfREJMLCBOT19NSURfUkVTX0JJTlMpOwotfQotCi0KLXZvaWQgaW5pdFNsb3RCYXNlZFJvdGF0aW9uKCBIQU5ETEVfUFNfREVDIGhfcHNfZCwgLyohPCBwb2ludGVyIHRvIHRoZSBtb2R1bGUgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKLQotICBJTlQgICAgIGdyb3VwID0gMDsKLSAgSU5UICAgICBiaW4gPSAgMDsKLSAgSU5UICAgICBub0lpZFN0ZXBzOwotCi0vKiAgY29uc3QgVUNIQVIgKnBRdWFudGl6ZWRJSURzOyovCi0KLSAgRklYUF9TR0wgIGludkw7Ci0gIEZJWFBfREJMICBTY2FsZUwsIFNjYWxlUjsKLSAgRklYUF9EQkwgIEFscGhhLCBCZXRhOwotICBGSVhQX0RCTCAgaDExciwgaDEyciwgaDIxciwgaDIycjsKLQotICBjb25zdCBGSVhQX0RCTCAgKlBTY2FsZUZhY3RvcnM7Ci0KLSAgLyogT3ZlcndyaXRlIG9sZCB2YWx1ZXMgaW4gZGVsYXkgYnVmZmVycyB3aGVuIHVwcGVyIHN1YmJhbmQgaXMgaGlnaGVyIHRoYW4gaW4gbGFzdCBmcmFtZSAqLwotICBpZiAoZW52ID09IDApIHsKLQotICAgIGlmICgodXNiID4gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcubGFzdFVzYikgJiYgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcubGFzdFVzYikgewotCi0gICAgICBJTlQgaSxrLGxlbmd0aDsKLQotICAgICAgZm9yIChpPWhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmxhc3RVc2IgOyBpIDwgRklSU1RfREVMQVlfU0I7IGkrKykgewotICAgICAgICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFSZWFsRGVsYXlSQnVmZmVyU2VyUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUypzaXplb2YoRklYUF9EQkwpKTsKLSAgICAgICAgRkRLbWVtY2xlYXIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBmb3IgKGogPSAwOyBqIDwgTk9fUU1GX0JBTkRTX0hZQlJJRDIwOyBqKyspIHsKKyAgICAgICAgcW1mSW5wdXREYXRhWzBdW2pdID0KKyAgICAgICAgICAgIHNjYWxlVmFsdWUockludEJ1ZmZlckxlZnRbaV1bal0sIHNjYWxlRmFjdG9yTG93QmFuZCk7CisgICAgICAgIHFtZklucHV0RGF0YVsxXVtqXSA9CisgICAgICAgICAgICBzY2FsZVZhbHVlKGlJbnRCdWZmZXJMZWZ0W2ldW2pdLCBzY2FsZUZhY3Rvckxvd0JhbmQpOwogICAgICAgfQogCi0gICAgICBmb3IgKGs9MCA7IGs8Tk9fU0FNUExFX0RFTEFZX0FMTFBBU1M7IGsrKykgewotICAgICAgICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFSZWFsRGVsYXlCdWZmZXJRbWZba10sIEZJUlNUX0RFTEFZX1NCKnNpemVvZihGSVhQX0RCTCkpOwotICAgICAgfQotICAgICAgbGVuZ3RoID0gKHVzYi1GSVJTVF9ERUxBWV9TQikqc2l6ZW9mKEZJWFBfREJMKTsKLSAgICAgIGlmKGxlbmd0aD4wKSB7Ci0gICAgICAgIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYVJlYWxEZWxheUJ1ZmZlclFtZlswXSwgbGVuZ3RoKTsKLSAgICAgICAgRkRLbWVtY2xlYXIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhSW1hZ0RlbGF5QnVmZmVyUW1mWzBdLCBsZW5ndGgpOwotICAgICAgfQotICAgICAgbGVuZ3RoID0gKGZpeE1pbihOT19ERUxBWV9CVUZGRVJfQkFORFMsKElOVCl1c2IpLUZJUlNUX0RFTEFZX1NCKSpzaXplb2YoRklYUF9EQkwpOwotICAgICAgaWYobGVuZ3RoPjApIHsKLSAgICAgICAgZm9yIChrPTEgOyBrIDwgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcubm9TYW1wbGVEZWxheTsgaysrKSB7Ci0gICAgICAgICAgRkRLbWVtY2xlYXIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhUmVhbERlbGF5QnVmZmVyUW1mW2tdLCBsZW5ndGgpOwotICAgICAgICAgIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYUltYWdEZWxheUJ1ZmZlclFtZltrXSwgbGVuZ3RoKTsKLSAgICAgICAgfQotICAgICAgfQorICAgICAgRkRLaHlicmlkQW5hbHlzaXNBcHBseSgmaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaHlicmlkQW5hbHlzaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFtZklucHV0RGF0YVswXSwgcW1mSW5wdXREYXRhWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRPdXRwdXREYXRhWzBdLCBoeWJyaWRPdXRwdXREYXRhWzFdKTsKICAgICB9Ci0gICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcubGFzdFVzYiA9IHVzYjsKLSAgfSAvKiBlbnYgPT0gMCAqLworICAgIGhfcHNfZC0+cHJvY0ZyYW1lQmFzZWQgPSAwOyAvKiBzd2l0Y2ggdG8gc2xvdCBiYXNlZCBwcm9jZXNzaW5nLiAqLwogCi0gIGlmIChoX3BzX2QtPmJzRGF0YVtoX3BzX2QtPnByb2Nlc3NTbG90XS5tcGVnLmJGaW5lSWlkUSkKLSAgeworICB9IC8qIHByb2NGcmFtZUJhc2VkPT0xICovCit9CisKK3ZvaWQgaW5pdFNsb3RCYXNlZFJvdGF0aW9uKAorICAgIEhBTkRMRV9QU19ERUMgaF9wc19kLCAvKiE8IHBvaW50ZXIgdG8gdGhlIG1vZHVsZSBzdGF0ZSAqLworICAgIGludCBlbnYsIGludCB1c2IpIHsKKyAgSU5UIGdyb3VwID0gMDsKKyAgSU5UIGJpbiA9IDA7CisgIElOVCBub0lpZFN0ZXBzOworCisgIEZJWFBfU0dMIGludkw7CisgIEZJWFBfREJMIFNjYWxlTCwgU2NhbGVSOworICBGSVhQX0RCTCBBbHBoYSwgQmV0YTsKKyAgRklYUF9EQkwgaDExciwgaDEyciwgaDIxciwgaDIycjsKKworICBjb25zdCBGSVhQX0RCTCAqUFNjYWxlRmFjdG9yczsKKworICBpZiAoaF9wc19kLT5ic0RhdGFbaF9wc19kLT5wcm9jZXNzU2xvdF0ubXBlZy5iRmluZUlpZFEpIHsKICAgICBQU2NhbGVGYWN0b3JzID0gU2NhbGVGYWN0b3JzRmluZTsgLyogdmFsdWVzIGFyZSBzaGlmdGV0IHJpZ2h0IGJ5IG9uZSAqLwogICAgIG5vSWlkU3RlcHMgPSBOT19JSURfU1RFUFNfRklORTsKLSAgICAvKnBRdWFudGl6ZWRJSURzID0gcXVhbnRpemVkSUlEc0ZpbmU7Ki8KLSAgfQotCi0gIGVsc2UKLSAgeworICB9IGVsc2UgewogICAgIFBTY2FsZUZhY3RvcnMgPSBTY2FsZUZhY3RvcnM7IC8qIHZhbHVlcyBhcmUgc2hpZnRldCByaWdodCBieSBvbmUgKi8KICAgICBub0lpZFN0ZXBzID0gTk9fSUlEX1NURVBTOwotICAgIC8qcFF1YW50aXplZElJRHMgPSBxdWFudGl6ZWRJSURzOyovCiAgIH0KIAotCiAgIC8qIGRlcXVhbnRpemUgYW5kIGRlY29kZSAqLwotICBmb3IgKCBncm91cCA9IDA7IGdyb3VwIDwgTk9fSUlEX0dST1VQUzsgZ3JvdXArKyApIHsKLQorICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBOT19JSURfR1JPVVBTOyBncm91cCsrKSB7CiAgICAgYmluID0gYmluczJncm91cE1hcDIwW2dyb3VwXTsKIAogICAgIC8qIQogICAgIDxoMz4gdHlwZSAnQScgcm90YXRpb24gPC9oMz4KICAgICBtaXhpbmcgcHJvY2VkdXJlIFJfYSwgdXNlZCBpbiBiYXNlbGluZSB2ZXJzaW9uPGJyPgogCi0gICAgIFNjYWxlLWZhY3RvciB2ZWN0b3JzIGMxIGFuZCBjMiBhcmUgcHJlY2FsY3VsYXRlZCBpbiBpbml0UHNUYWJsZXMgKCkgYW5kIHN0b3JlZCBpbgotICAgICBzY2FsZUZhY3RvcnNbXSBhbmQgc2NhbGVGYWN0b3JzRmluZVtdID0gcFNjYWxlRmFjdG9ycyBbXS4KLSAgICAgRnJvbSB0aGUgbGluZWFyaXplZCBJSUQgcGFyYW1ldGVycyAoaW50ZW5zaXR5IGRpZmZlcmVuY2VzKSwgdHdvIHNjYWxlIGZhY3RvcnMgYXJlCisgICAgIFNjYWxlLWZhY3RvciB2ZWN0b3JzIGMxIGFuZCBjMiBhcmUgcHJlY2FsY3VsYXRlZCBpbiBpbml0UHNUYWJsZXMgKCkgYW5kCisgICAgc3RvcmVkIGluIHNjYWxlRmFjdG9yc1tdIGFuZCBzY2FsZUZhY3RvcnNGaW5lW10gPSBwU2NhbGVGYWN0b3JzIFtdLiBGcm9tIHRoZQorICAgIGxpbmVhcml6ZWQgSUlEIHBhcmFtZXRlcnMgKGludGVuc2l0eSBkaWZmZXJlbmNlcyksIHR3byBzY2FsZSBmYWN0b3JzIGFyZQogICAgICBjYWxjdWxhdGVkLiBUaGV5IGFyZSB1c2VkIHRvIG9idGFpbiB0aGUgY29lZmZpY2llbnRzIGgxMS4uLiBoMjIuCiAgICAgKi8KIAogICAgIC8qIFNjYWxlUiBhbmQgU2NhbGVMIGFyZSBzY2FsZWQgYnkgMSBzaGlmdCByaWdodCAqLwogCi0gICAgU2NhbGVSID0gUFNjYWxlRmFjdG9yc1tub0lpZFN0ZXBzICsgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5hYUlpZEluZGV4TWFwcGVkW2Vudl1bYmluXV07Ci0gICAgU2NhbGVMID0gUFNjYWxlRmFjdG9yc1tub0lpZFN0ZXBzIC0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5hYUlpZEluZGV4TWFwcGVkW2Vudl1bYmluXV07CisgICAgU2NhbGVSID0gUFNjYWxlRmFjdG9yc1tub0lpZFN0ZXBzICsgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucENvZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5hYUlpZEluZGV4TWFwcGVkW2Vudl1bYmluXV07CisgICAgU2NhbGVMID0gUFNjYWxlRmFjdG9yc1tub0lpZFN0ZXBzIC0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucENvZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5hYUlpZEluZGV4TWFwcGVkW2Vudl1bYmluXV07CiAKLSAgICBCZXRhICAgPSBmTXVsdCAoZk11bHQoIEFscGhhc1toX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLmFhSWNjSW5kZXhNYXBwZWRbZW52XVtiaW5dXSwgKCBTY2FsZVIgLSBTY2FsZUwgKSksIEZJWFBfU1FSVDA1KTsKLSAgICBBbHBoYSAgPSBBbHBoYXNbaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5hYUljY0luZGV4TWFwcGVkW2Vudl1bYmluXV0+PjE7CisgICAgQmV0YSA9IGZNdWx0KAorICAgICAgICBmTXVsdChBbHBoYXNbaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucENvZWYtPmFhSWNjSW5kZXhNYXBwZWRbZW52XVtiaW5dXSwKKyAgICAgICAgICAgICAgKFNjYWxlUiAtIFNjYWxlTCkpLAorICAgICAgICBGSVhQX1NRUlQwNSk7CisgICAgQWxwaGEgPQorICAgICAgICBBbHBoYXNbaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucENvZWYtPmFhSWNjSW5kZXhNYXBwZWRbZW52XVtiaW5dXSA+PiAxOwogCiAgICAgLyogQWxwaGEgYW5kIEJldGEgYXJlIG5vdyBib3RoIHNjYWxlZCBieSAyIHNoaWZ0cyByaWdodCAqLwogCi0gICAgLyogY2FsY3VsYXRlIHRoZSBjb2VmZmljaWVudHMgaDExLi4uIGgyMiBmcm9tIHNjYWxlLWZhY3RvcnMgYW5kIElDQyBwYXJhbWV0ZXJzICovCisgICAgLyogY2FsY3VsYXRlIHRoZSBjb2VmZmljaWVudHMgaDExLi4uIGgyMiBmcm9tIHNjYWxlLWZhY3RvcnMgYW5kIElDQworICAgICAqIHBhcmFtZXRlcnMgKi8KIAogICAgIC8qIGggdmFsdWVzIGFyZSBzY2FsZWQgYnkgMSBzaGlmdCByaWdodCAqLwogICAgIHsKICAgICAgIEZJWFBfREJMIHRyaWdEYXRhWzRdOwogCiAgICAgICBpbmxpbmVfZml4cF9jb3Nfc2luKEJldGEgKyBBbHBoYSwgQmV0YSAtIEFscGhhLCAyLCB0cmlnRGF0YSk7Ci0gICAgICBoMTFyID0gZk11bHQoIFNjYWxlTCwgdHJpZ0RhdGFbMF0pOwotICAgICAgaDEyciA9IGZNdWx0KCBTY2FsZVIsIHRyaWdEYXRhWzJdKTsKLSAgICAgIGgyMXIgPSBmTXVsdCggU2NhbGVMLCB0cmlnRGF0YVsxXSk7Ci0gICAgICBoMjJyID0gZk11bHQoIFNjYWxlUiwgdHJpZ0RhdGFbM10pOworICAgICAgaDExciA9IGZNdWx0KFNjYWxlTCwgdHJpZ0RhdGFbMF0pOworICAgICAgaDEyciA9IGZNdWx0KFNjYWxlUiwgdHJpZ0RhdGFbMl0pOworICAgICAgaDIxciA9IGZNdWx0KFNjYWxlTCwgdHJpZ0RhdGFbMV0pOworICAgICAgaDIyciA9IGZNdWx0KFNjYWxlUiwgdHJpZ0RhdGFbM10pOwogICAgIH0KICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogSW50ZXJwb2xhdGlvbiBvZiB0aGUgbWF0cmljZXMgSDExLi4uIEgyMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIEludGVycG9sYXRpb24gb2YgdGhlIG1hdHJpY2VzIEgxMS4uLiBIMjI6ICovCiAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIEgxMShrLG4pID0gSDExKGssbltlXSkgKyAobi1uW2VdKSAqIChIMTEoayxuW2UrMV0gLSBIMTEoayxuW2VdKSkgLyAobltlKzFdIC0gbltlXSkgICAgKi8KLSAgICAvKiAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogSDExKGssbikgPSBIMTEoayxuW2VdKSArIChuLW5bZV0pICogKEgxMShrLG5bZSsxXSAtIEgxMShrLG5bZV0pKSAvCisgICAgICogKG5bZSsxXSAtIG5bZV0pICAgICovCisgICAgLyogLi4uICovCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAgICAgLyogaW52TCA9IDEvKGxlbmd0aCBvZiBlbnZlbG9wZSkgKi8KLSAgICBpbnZMID0gRlhfREJMMkZYX1NHTChHZXRJbnZJbnQoaF9wc19kLT5ic0RhdGFbaF9wc19kLT5wcm9jZXNzU2xvdF0ubXBlZy5hRW52U3RhcnRTdG9wW2VudiArIDFdIC0gaF9wc19kLT5ic0RhdGFbaF9wc19kLT5wcm9jZXNzU2xvdF0ubXBlZy5hRW52U3RhcnRTdG9wW2Vudl0pKTsKKyAgICBpbnZMID0gRlhfREJMMkZYX1NHTChHZXRJbnZJbnQoCisgICAgICAgIGhfcHNfZC0+YnNEYXRhW2hfcHNfZC0+cHJvY2Vzc1Nsb3RdLm1wZWcuYUVudlN0YXJ0U3RvcFtlbnYgKyAxXSAtCisgICAgICAgIGhfcHNfZC0+YnNEYXRhW2hfcHNfZC0+cHJvY2Vzc1Nsb3RdLm1wZWcuYUVudlN0YXJ0U3RvcFtlbnZdKSk7CiAKLSAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMXJbZ3JvdXBdICA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgxMXJQcmV2W2dyb3VwXTsKLSAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMnJbZ3JvdXBdICA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgxMnJQcmV2W2dyb3VwXTsKLSAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMXJbZ3JvdXBdICA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgyMXJQcmV2W2dyb3VwXTsKLSAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMnJbZ3JvdXBdICA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgyMnJQcmV2W2dyb3VwXTsKKyAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQ29lZi0+SDExcltncm91cF0gPQorICAgICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMTFyUHJldltncm91cF07CisgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucENvZWYtPkgxMnJbZ3JvdXBdID0KKyAgICAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDEyclByZXZbZ3JvdXBdOworICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBDb2VmLT5IMjFyW2dyb3VwXSA9CisgICAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgyMXJQcmV2W2dyb3VwXTsKKyAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQ29lZi0+SDIycltncm91cF0gPQorICAgICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMjJyUHJldltncm91cF07CiAKLSAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkRlbHRhSDExcltncm91cF0gID0gZk11bHQgKCBoMTFyIC0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMTFyW2dyb3VwXSwgaW52TCApOwotICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuRGVsdGFIMTJyW2dyb3VwXSAgPSBmTXVsdCAoIGgxMnIgLSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMnJbZ3JvdXBdLCBpbnZMICk7Ci0gICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgyMXJbZ3JvdXBdICA9IGZNdWx0ICggaDIxciAtIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIxcltncm91cF0sIGludkwgKTsKLSAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkRlbHRhSDIycltncm91cF0gID0gZk11bHQgKCBoMjJyIC0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMjJyW2dyb3VwXSwgaW52TCApOworICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBDb2VmLT5EZWx0YUgxMXJbZ3JvdXBdID0KKyAgICAgICAgZk11bHQoaDExciAtIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBDb2VmLT5IMTFyW2dyb3VwXSwgaW52TCk7CisgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucENvZWYtPkRlbHRhSDEycltncm91cF0gPQorICAgICAgICBmTXVsdChoMTJyIC0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucENvZWYtPkgxMnJbZ3JvdXBdLCBpbnZMKTsKKyAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQ29lZi0+RGVsdGFIMjFyW2dyb3VwXSA9CisgICAgICAgIGZNdWx0KGgyMXIgLSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQ29lZi0+SDIxcltncm91cF0sIGludkwpOworICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBDb2VmLT5EZWx0YUgyMnJbZ3JvdXBdID0KKyAgICAgICAgZk11bHQoaDIyciAtIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBDb2VmLT5IMjJyW2dyb3VwXSwgaW52TCk7CiAKICAgICAvKiB1cGRhdGUgcHJldiBjb2VmZmljaWVudHMgZm9yIGludGVycG9sYXRpb24gaW4gbmV4dCBlbnZlbG9wZSAqLwogCkBAIC0xMDYyLDc5ICs0MjYsNjcgQEAKICAgfSAvKiBncm91cCBsb29wICovCiB9CiAKK3N0YXRpYyBjb25zdCBVQ0hBUiBncm91cFRhYmxlW05PX0lJRF9HUk9VUFMgKyAxXSA9IHsKKyAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgMTAsIDExLAorICAgIDEyLCAxMywgMTQsIDE1LCAxNiwgMTgsIDIxLCAyNSwgMzAsIDQyLCA3MX07CiAKLXN0YXRpYyB2b2lkIGFwcGx5U2xvdEJhc2VkUm90YXRpb24oIEhBTkRMRV9QU19ERUMgaF9wc19kLCAgICAgICAgLyohPCBwb2ludGVyIHRvIHRoZSBtb2R1bGUgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIGFwcGx5U2xvdEJhc2VkUm90YXRpb24oCisgICAgSEFORExFX1BTX0RFQyBoX3BzX2QsIC8qITwgcG9pbnRlciB0byB0aGUgbW9kdWxlIHN0YXRlICovCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqbUh5YnJpZFJlYWxMZWZ0LCAgLyohPCBoeWJyaWQgdmFsdWVzIHJlYWwgbGVmdCAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqbUh5YnJpZEltYWdMZWZ0LCAgLyohPCBoeWJyaWQgdmFsdWVzIGltYWcgbGVmdCAgKi8KKyAgICBGSVhQX0RCTCAqbUh5YnJpZFJlYWxMZWZ0LCAvKiE8IGh5YnJpZCB2YWx1ZXMgcmVhbCBsZWZ0ICAqLworICAgIEZJWFBfREJMICptSHlicmlkSW1hZ0xlZnQsIC8qITwgaHlicmlkIHZhbHVlcyBpbWFnIGxlZnQgICovCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqUW1mTGVmdFJlYWwsICAgICAgLyohPCByZWFsIGJhbmRzIGxlZnQgcW1mIGNoYW5uZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqUW1mTGVmdEltYWcsICAgICAgLyohPCBpbWFnIGJhbmRzIGxlZnQgcW1mIGNoYW5uZWwgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICptSHlicmlkUmVhbFJpZ2h0LCAvKiE8IGh5YnJpZCB2YWx1ZXMgcmVhbCByaWdodCAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqbUh5YnJpZEltYWdSaWdodCwgLyohPCBoeWJyaWQgdmFsdWVzIGltYWcgcmlnaHQgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqUW1mUmlnaHRSZWFsLCAgICAgLyohPCByZWFsIGJhbmRzIHJpZ2h0IHFtZiBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKlFtZlJpZ2h0SW1hZyAgICAgIC8qITwgaW1hZyBiYW5kcyByaWdodCBxbWYgY2hhbm5lbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gIElOVCAgICAgZ3JvdXA7Ci0gIElOVCAgICAgc3ViYmFuZDsKLQotICBGSVhQX0RCTCAqUkVTVFJJQ1QgSHlickxlZnRSZWFsOwotICBGSVhQX0RCTCAqUkVTVFJJQ1QgSHlickxlZnRJbWFnOwotICBGSVhQX0RCTCAqUkVTVFJJQ1QgSHliclJpZ2h0UmVhbDsKLSAgRklYUF9EQkwgKlJFU1RSSUNUIEh5YnJSaWdodEltYWc7Ci0KLSAgRklYUF9EQkwgdG1wTGVmdCwgdG1wUmlnaHQ7Ci0KKyAgICBGSVhQX0RCTCAqbUh5YnJpZFJlYWxSaWdodCwgLyohPCBoeWJyaWQgdmFsdWVzIHJlYWwgcmlnaHQgICovCisgICAgRklYUF9EQkwgKm1IeWJyaWRJbWFnUmlnaHQgIC8qITwgaHlicmlkIHZhbHVlcyBpbWFnIHJpZ2h0ICAqLworKSB7CisgIElOVCBncm91cDsKKyAgSU5UIHN1YmJhbmQ7CiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIC8qIQogICA8aDI+IE1hcHBpbmcgPC9oMj4KIAotICBUaGUgbnVtYmVyIG9mIHN0ZXJlbyBiYW5kcyB0aGF0IGlzIGFjdHVhbGx5IHVzZWQgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIGF2YWlsYmxlCi0gIHBhcmFtZXRlcnMgZm9yIElJRCBhbmQgSUNDOgotICA8cHJlPgotICAgbnIuIG9mIElJRCBwYXJhLnwgbnIuIG9mIElDQyBwYXJhLiB8IG5yLiBvZiBTdGVyZW8gYmFuZHMKKyAgVGhlIG51bWJlciBvZiBzdGVyZW8gYmFuZHMgdGhhdCBpcyBhY3R1YWxseSB1c2VkIGRlcGVuZHMgb24gdGhlIG51bWJlciBvZgorICBhdmFpbGJsZSBwYXJhbWV0ZXJzIGZvciBJSUQgYW5kIElDQzogPHByZT4gbnIuIG9mIElJRCBwYXJhLnwgbnIuIG9mIElDQyBwYXJhLgorICB8IG5yLiBvZiBTdGVyZW8gYmFuZHMKICAgIC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgMTAsMjAgICAgICAgICB8ICAgICAxMCwyMCAgICAgICAgfCAgICAgICAgMjAKICAgICAgMTAsMjAgICAgICAgICB8ICAgICAzNCAgICAgICAgICAgfCAgICAgICAgMzQKICAgICAgMzQgICAgICAgICAgICB8ICAgICAxMCwyMCAgICAgICAgfCAgICAgICAgMzQKICAgICAgMzQgICAgICAgICAgICB8ICAgICAzNCAgICAgICAgICAgfCAgICAgICAgMzQKICAgPC9wcmU+Ci0gIEluIHRoZSBjYXNlIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBmb3IgSUlTIGFuZCBJQ0MgZGlmZmVycyBmcm9tIHRoZSBudW1iZXIgb2Ygc3RlcmVvCi0gIGJhbmRzLCBhIG1hcHBpbmcgZnJvbSB0aGUgbG93ZXIgbnVtYmVyIHRvIHRoZSBoaWdoZXIgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaXMgYXBwbGllZC4KLSAgSW5kZXggbWFwcGluZyBvZiBJSUQgYW5kIElDQyBwYXJhbWV0ZXJzIGlzIGFscmVhZHkgZG9uZSBpbiBwc2JpdGRlYy5jcHAuIEZ1cnRoZXIgbWFwcGluZyBpcwotICBub3QgbmVlZGVkIGhlcmUgaW4gYmFzZWxpbmUgdmVyc2lvbi4KKyAgSW4gdGhlIGNhc2UgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGZvciBJSVMgYW5kIElDQyBkaWZmZXJzIGZyb20gdGhlIG51bWJlcgorICBvZiBzdGVyZW8gYmFuZHMsIGEgbWFwcGluZyBmcm9tIHRoZSBsb3dlciBudW1iZXIgdG8gdGhlIGhpZ2hlciBudW1iZXIgb2YKKyAgcGFyYW1ldGVycyBpcyBhcHBsaWVkLiBJbmRleCBtYXBwaW5nIG9mIElJRCBhbmQgSUNDIHBhcmFtZXRlcnMgaXMgYWxyZWFkeSBkb25lCisgIGluIHBzYml0ZGVjLmNwcC4gRnVydGhlciBtYXBwaW5nIGlzIG5vdCBuZWVkZWQgaGVyZSBpbiBiYXNlbGluZSB2ZXJzaW9uLgogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIC8qIQogICA8aDI+IE1peGluZyA8L2gyPgogCi0gIFRvIGdlbmVyYXRlIHRoZSBRTUYgc3ViYmFuZCBzaWduYWxzIGZvciB0aGUgc3ViYmFuZCBzYW1wbGVzIG4gPSBuW2VdKzEgLCwsIG5fW2UrMV0gdGhlCi0gIHBhcmFtZXRlcnMgYXQgcG9zaXRpb24gbltlXSBhbmQgbltlKzFdIGFyZSByZXF1aXJlZCBhcyB3ZWxsIGFzIHRoZSBzdWJiYW5kIGRvbWFpbiBzaWduYWxzCi0gIHNfayhuKSBhbmQgZF9rKG4pIGZvciBuID0gbltlXSsxLi4uIG5fW2UrMV0uIG5bZV0gcmVwcmVzZW50cyB0aGUgc3RhcnQgcG9zaXRpb24gZm9yCi0gIGVudmVsb3BlIGUuIFRoZSBib3JkZXIgcG9zaXRpb25zIG5bZV0gYXJlIGhhbmRsZWQgaW4gRGVjb2RlUFMoKS4KKyAgVG8gZ2VuZXJhdGUgdGhlIFFNRiBzdWJiYW5kIHNpZ25hbHMgZm9yIHRoZSBzdWJiYW5kIHNhbXBsZXMgbiA9IG5bZV0rMSAsLCwKKyAgbl9bZSsxXSB0aGUgcGFyYW1ldGVycyBhdCBwb3NpdGlvbiBuW2VdIGFuZCBuW2UrMV0gYXJlIHJlcXVpcmVkIGFzIHdlbGwgYXMgdGhlCisgIHN1YmJhbmQgZG9tYWluIHNpZ25hbHMgc19rKG4pIGFuZCBkX2sobikgZm9yIG4gPSBuW2VdKzEuLi4gbl9bZSsxXS4gbltlXQorICByZXByZXNlbnRzIHRoZSBzdGFydCBwb3NpdGlvbiBmb3IgZW52ZWxvcGUgZS4gVGhlIGJvcmRlciBwb3NpdGlvbnMgbltlXSBhcmUKKyAgaGFuZGxlZCBpbiBEZWNvZGVQUygpLgogCiAgIFRoZSBzdGVyZW8gc3ViIHN1YmJhbmQgc2lnbmFscyBhcmUgY29uc3RydWN0ZWQgYXM6CiAgIDxwcmU+CiAgIGxfayhuKSA9IEgxMShrLG4pIHNfayhuKSArIEgyMShrLG4pIGRfayhuKQogICByX2sobikgPSBIMjEoayxuKSBzX2sobikgKyBIMjIoayxuKSBkX2sobikKICAgPC9wcmU+Ci0gIEluIG9yZGVyIHRvIG9idGFpbiB0aGUgbWF0cmljZXMgSDExKGssbikuLi4gSDIyIChrLG4pLCB0aGUgdmVjdG9ycyBoMTEoYikuLi4gaDIyKGIpIG5lZWQgdG8KLSAgYmUgY2FsY3VsYXRlZCBmaXJzdCAoYjogcGFyYW1ldGVyIGluZGV4KS4gRGVwZW5kaW5nIG9uIElDQyBtb2RlIGVpdGhlciBtaXhpbmcgcHJvY2VkdXJlIFJfYQotICBvciBSX2IgaXMgdXNlZCBmb3IgdGhhdC4gRm9yIGJvdGggcHJvY2VkdXJlcywgdGhlIHBhcmFtZXRlcnMgZm9yIHBhcmFtZXRlciBwb3NpdGlvbiBuW2UrMV0KLSAgaXMgdXNlZC4KKyAgSW4gb3JkZXIgdG8gb2J0YWluIHRoZSBtYXRyaWNlcyBIMTEoayxuKS4uLiBIMjIgKGssbiksIHRoZSB2ZWN0b3JzIGgxMShiKS4uLgorICBoMjIoYikgbmVlZCB0byBiZSBjYWxjdWxhdGVkIGZpcnN0IChiOiBwYXJhbWV0ZXIgaW5kZXgpLiBEZXBlbmRpbmcgb24gSUNDIG1vZGUKKyAgZWl0aGVyIG1peGluZyBwcm9jZWR1cmUgUl9hIG9yIFJfYiBpcyB1c2VkIGZvciB0aGF0LiBGb3IgYm90aCBwcm9jZWR1cmVzLCB0aGUKKyAgcGFyYW1ldGVycyBmb3IgcGFyYW1ldGVyIHBvc2l0aW9uIG5bZSsxXSBpcyB1c2VkLgogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKiEKICAgPGgyPlBoYXNlIHBhcmFtZXRlcnMgPC9oMj4KLSAgV2l0aCBkaXNhYmxlZCBwaGFzZSBwYXJhbWV0ZXJzICh3aGljaCBpcyB0aGUgY2FzZSBpbiBiYXNlbGluZSB2ZXJzaW9uKSwgdGhlIEgtbWF0cmljZXMgYXJlCi0gIGp1c3QgY2FsY3VsYXRlZCBieToKKyAgV2l0aCBkaXNhYmxlZCBwaGFzZSBwYXJhbWV0ZXJzICh3aGljaCBpcyB0aGUgY2FzZSBpbiBiYXNlbGluZSB2ZXJzaW9uKSwgdGhlCisgIEgtbWF0cmljZXMgYXJlIGp1c3QgY2FsY3VsYXRlZCBieToKIAogICA8cHJlPgogICBIMTEoayxuW2UrMV0gPSBoMTEoYihrKSkKQEAgLTExNDYsNjkgKzQ5OCw0NCBAQAogICB0aGlzIGxvb3AgaW5jbHVkZXMgdGhlIGludGVycG9sYXRpb24gb2YgdGhlIGNvZWZmaWNpZW50cyBIeHgKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KLSAgLyogbG9vcCB0aHJ1IGFsbCBncm91cHMgLi4uICovCi0gIEh5YnJMZWZ0UmVhbCAgPSBtSHlicmlkUmVhbExlZnQ7Ci0gIEh5YnJMZWZ0SW1hZyAgPSBtSHlicmlkSW1hZ0xlZnQ7Ci0gIEh5YnJSaWdodFJlYWwgPSBtSHlicmlkUmVhbFJpZ2h0OwotICBIeWJyUmlnaHRJbWFnID0gbUh5YnJpZEltYWdSaWdodDsKLQogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKiBjb25zdHJ1Y3Qgc3RlcmVvIHN1YiBzdWJiYW5kIHNpZ25hbHMgYWNjb3JkaW5nIHRvOiAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiBsX2sobikgPSBIMTEoayxuKSBzX2sobikgKyBIMjEoayxuKSBkX2sobikgICAgICAgICAqLwogICAvKiByX2sobikgPSBIMTIoayxuKSBzX2sobikgKyBIMjIoayxuKSBkX2sobikgICAgICAgICAqLwogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICBmb3IgKCBncm91cCA9IDA7IGdyb3VwIDwgU1VCUU1GX0dST1VQUzsgZ3JvdXArKyApIHsKKyAgUFNfREVDX0NPRUZGSUNJRU5UUyAqcENvZWYgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQ29lZjsKIAotICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDExcltncm91cF0gKz0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgxMXJbZ3JvdXBdOwotICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDEycltncm91cF0gKz0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgxMnJbZ3JvdXBdOwotICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIxcltncm91cF0gKz0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgyMXJbZ3JvdXBdOwotICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIycltncm91cF0gKz0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgyMnJbZ3JvdXBdOworICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBOT19JSURfR1JPVVBTOyBncm91cCsrKSB7CisgICAgcENvZWYtPkgxMXJbZ3JvdXBdICs9IHBDb2VmLT5EZWx0YUgxMXJbZ3JvdXBdOworICAgIHBDb2VmLT5IMTJyW2dyb3VwXSArPSBwQ29lZi0+RGVsdGFIMTJyW2dyb3VwXTsKKyAgICBwQ29lZi0+SDIxcltncm91cF0gKz0gcENvZWYtPkRlbHRhSDIxcltncm91cF07CisgICAgcENvZWYtPkgyMnJbZ3JvdXBdICs9IHBDb2VmLT5EZWx0YUgyMnJbZ3JvdXBdOwogCi0gICAgc3ViYmFuZCA9IGdyb3VwQm9yZGVyczIwW2dyb3VwXTsKKyAgICBjb25zdCBpbnQgc3RhcnQgPSBncm91cFRhYmxlW2dyb3VwXTsKKyAgICBjb25zdCBpbnQgc3RvcCA9IGdyb3VwVGFibGVbZ3JvdXAgKyAxXTsKKyAgICBmb3IgKHN1YmJhbmQgPSBzdGFydDsgc3ViYmFuZCA8IHN0b3A7IHN1YmJhbmQrKykgeworICAgICAgRklYUF9EQkwgdG1wTGVmdCA9CisgICAgICAgICAgZk11bHRBZGQoZk11bHREaXYyKHBDb2VmLT5IMTFyW2dyb3VwXSwgbUh5YnJpZFJlYWxMZWZ0W3N1YmJhbmRdKSwKKyAgICAgICAgICAgICAgICAgICBwQ29lZi0+SDIxcltncm91cF0sIG1IeWJyaWRSZWFsUmlnaHRbc3ViYmFuZF0pOworICAgICAgRklYUF9EQkwgdG1wUmlnaHQgPQorICAgICAgICAgIGZNdWx0QWRkKGZNdWx0RGl2MihwQ29lZi0+SDEycltncm91cF0sIG1IeWJyaWRSZWFsTGVmdFtzdWJiYW5kXSksCisgICAgICAgICAgICAgICAgICAgcENvZWYtPkgyMnJbZ3JvdXBdLCBtSHlicmlkUmVhbFJpZ2h0W3N1YmJhbmRdKTsKKyAgICAgIG1IeWJyaWRSZWFsTGVmdFtzdWJiYW5kXSA9IHRtcExlZnQ7CisgICAgICBtSHlicmlkUmVhbFJpZ2h0W3N1YmJhbmRdID0gdG1wUmlnaHQ7CiAKLSAgICB0bXBMZWZ0ICA9IGZNdWx0QWRkRGl2MiggZk11bHREaXYyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDExcltncm91cF0sIEh5YnJMZWZ0UmVhbFtzdWJiYW5kXSksIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIxcltncm91cF0sIEh5YnJSaWdodFJlYWxbc3ViYmFuZF0pOwotICAgIHRtcFJpZ2h0ID0gZk11bHRBZGREaXYyKCBmTXVsdERpdjIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMTJyW2dyb3VwXSwgSHlickxlZnRSZWFsW3N1YmJhbmRdKSwgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMjJyW2dyb3VwXSwgSHliclJpZ2h0UmVhbFtzdWJiYW5kXSk7Ci0gICAgSHlickxlZnRSZWFsIFtzdWJiYW5kXSA9IHRtcExlZnQ8PDE7Ci0gICAgSHliclJpZ2h0UmVhbFtzdWJiYW5kXSA9IHRtcFJpZ2h0PDwxOwotCi0gICAgdG1wTGVmdCAgPSBmTXVsdEFkZCggZk11bHREaXYyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDExcltncm91cF0sIEh5YnJMZWZ0SW1hZ1tzdWJiYW5kXSksIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIxcltncm91cF0sIEh5YnJSaWdodEltYWdbc3ViYmFuZF0pOwotICAgIHRtcFJpZ2h0ID0gZk11bHRBZGQoIGZNdWx0RGl2MihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMnJbZ3JvdXBdLCBIeWJyTGVmdEltYWdbc3ViYmFuZF0pLCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMnJbZ3JvdXBdLCBIeWJyUmlnaHRJbWFnW3N1YmJhbmRdKTsKLSAgICBIeWJyTGVmdEltYWcgW3N1YmJhbmRdID0gdG1wTGVmdDsKLSAgICBIeWJyUmlnaHRJbWFnW3N1YmJhbmRdID0gdG1wUmlnaHQ7Ci0gIH0KLQotICAvKiBjb250aW51ZSBpbiB0aGUgcW1mIGJ1ZmZlcnMgKi8KLSAgSHlickxlZnRSZWFsICA9IFFtZkxlZnRSZWFsOwotICBIeWJyTGVmdEltYWcgID0gUW1mTGVmdEltYWc7Ci0gIEh5YnJSaWdodFJlYWwgPSBRbWZSaWdodFJlYWw7Ci0gIEh5YnJSaWdodEltYWcgPSBRbWZSaWdodEltYWc7Ci0KLSAgZm9yICg7IGdyb3VwIDwgTk9fSUlEX0dST1VQUzsgZ3JvdXArKyApIHsKLQotICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDExcltncm91cF0gKz0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgxMXJbZ3JvdXBdOwotICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDEycltncm91cF0gKz0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgxMnJbZ3JvdXBdOwotICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIxcltncm91cF0gKz0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgyMXJbZ3JvdXBdOwotICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIycltncm91cF0gKz0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgyMnJbZ3JvdXBdOwotCi0gICAgZm9yICggc3ViYmFuZCA9IGdyb3VwQm9yZGVyczIwW2dyb3VwXTsgc3ViYmFuZCA8IGdyb3VwQm9yZGVyczIwW2dyb3VwICsgMV07IHN1YmJhbmQrKyApCi0gICAgewotICAgICAgdG1wTGVmdCAgPSBmTXVsdEFkZCggZk11bHREaXYyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDExcltncm91cF0sIEh5YnJMZWZ0UmVhbFtzdWJiYW5kXSksIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIxcltncm91cF0sIEh5YnJSaWdodFJlYWxbc3ViYmFuZF0pOwotICAgICAgdG1wUmlnaHQgPSBmTXVsdEFkZCggZk11bHREaXYyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDEycltncm91cF0sIEh5YnJMZWZ0UmVhbFtzdWJiYW5kXSksIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIycltncm91cF0sIEh5YnJSaWdodFJlYWxbc3ViYmFuZF0pOwotICAgICAgSHlickxlZnRSZWFsIFtzdWJiYW5kXSA9IHRtcExlZnQ7Ci0gICAgICBIeWJyUmlnaHRSZWFsW3N1YmJhbmRdID0gdG1wUmlnaHQ7Ci0KLSAgICAgIHRtcExlZnQgID0gZk11bHRBZGQoIGZNdWx0RGl2MihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMXJbZ3JvdXBdLCBIeWJyTGVmdEltYWdbc3ViYmFuZF0pLCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMXJbZ3JvdXBdLCBIeWJyUmlnaHRJbWFnW3N1YmJhbmRdKTsKLSAgICAgIHRtcFJpZ2h0ID0gZk11bHRBZGQoIGZNdWx0RGl2MihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMnJbZ3JvdXBdLCBIeWJyTGVmdEltYWdbc3ViYmFuZF0pLCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMnJbZ3JvdXBdLCBIeWJyUmlnaHRJbWFnW3N1YmJhbmRdKTsKLSAgICAgIEh5YnJMZWZ0SW1hZyBbc3ViYmFuZF0gPSB0bXBMZWZ0OwotICAgICAgSHliclJpZ2h0SW1hZ1tzdWJiYW5kXSA9IHRtcFJpZ2h0OwotCisgICAgICB0bXBMZWZ0ID0KKyAgICAgICAgICBmTXVsdEFkZChmTXVsdERpdjIocENvZWYtPkgxMXJbZ3JvdXBdLCBtSHlicmlkSW1hZ0xlZnRbc3ViYmFuZF0pLAorICAgICAgICAgICAgICAgICAgIHBDb2VmLT5IMjFyW2dyb3VwXSwgbUh5YnJpZEltYWdSaWdodFtzdWJiYW5kXSk7CisgICAgICB0bXBSaWdodCA9CisgICAgICAgICAgZk11bHRBZGQoZk11bHREaXYyKHBDb2VmLT5IMTJyW2dyb3VwXSwgbUh5YnJpZEltYWdMZWZ0W3N1YmJhbmRdKSwKKyAgICAgICAgICAgICAgICAgICBwQ29lZi0+SDIycltncm91cF0sIG1IeWJyaWRJbWFnUmlnaHRbc3ViYmFuZF0pOworICAgICAgbUh5YnJpZEltYWdMZWZ0W3N1YmJhbmRdID0gdG1wTGVmdDsKKyAgICAgIG1IeWJyaWRJbWFnUmlnaHRbc3ViYmFuZF0gPSB0bXBSaWdodDsKICAgICB9IC8qIHN1YmJhbmQgKi8KICAgfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiEKICAgXGJyaWVmICBBcHBsaWVzIElJRCwgSUNDLCBJUEQgYW5kIE9QRCBwYXJhbWV0ZXJzIHRvIHRoZSBjdXJyZW50IGZyYW1lLgpAQCAtMTIxNiwxOTkgKzU0MywxNzIgQEAKICAgXHJldHVybiBub25lCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1BcHBseVBzU2xvdCggSEFORExFX1BTX0RFQyBoX3BzX2QsICAgICAgICAgLyohPCBoYW5kbGUgUFNfREVDKi8KLSAgICAgICAgICAgICBGSVhQX0RCTCAgKipySW50QnVmZmVyTGVmdCwgICAvKiE8IHJlYWwgYmFuZHMgbGVmdCBxbWYgY2hhbm5lbCAoMzh4NjQpICAqLwotICAgICAgICAgICAgIEZJWFBfREJMICAqKmlJbnRCdWZmZXJMZWZ0LCAgIC8qITwgaW1hZyBiYW5kcyBsZWZ0IHFtZiBjaGFubmVsICgzOHg2NCkgICovCi0gICAgICAgICAgICAgRklYUF9EQkwgICpySW50QnVmZmVyUmlnaHQsICAgLyohPCByZWFsIGJhbmRzIHJpZ2h0IHFtZiBjaGFubmVsICgzOHg2NCkgKi8KLSAgICAgICAgICAgICBGSVhQX0RCTCAgKmlJbnRCdWZmZXJSaWdodCAgICAvKiE8IGltYWcgYmFuZHMgcmlnaHQgcW1mIGNoYW5uZWwgKDM4eDY0KSAqLwotICAgICAgICAgICApCi17Cit2b2lkIEFwcGx5UHNTbG90KAorICAgIEhBTkRMRV9QU19ERUMgaF9wc19kLCAgICAgIC8qITwgaGFuZGxlIFBTX0RFQyovCisgICAgRklYUF9EQkwgKipySW50QnVmZmVyTGVmdCwgLyohPCByZWFsIGJhbmRzIGxlZnQgcW1mIGNoYW5uZWwgKDM4eDY0KSAgKi8KKyAgICBGSVhQX0RCTCAqKmlJbnRCdWZmZXJMZWZ0LCAvKiE8IGltYWcgYmFuZHMgbGVmdCBxbWYgY2hhbm5lbCAoMzh4NjQpICAqLworICAgIEZJWFBfREJMICpySW50QnVmZmVyUmlnaHQsIC8qITwgcmVhbCBiYW5kcyByaWdodCBxbWYgY2hhbm5lbCAoMzh4NjQpICovCisgICAgRklYUF9EQkwgKmlJbnRCdWZmZXJSaWdodCwgLyohPCBpbWFnIGJhbmRzIHJpZ2h0IHFtZiBjaGFubmVsICgzOHg2NCkgKi8KKyAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JMb3dCYW5kX25vX292LCBjb25zdCBpbnQgc2NhbGVGYWN0b3JMb3dCYW5kLAorICAgIGNvbnN0IGludCBzY2FsZUZhY3RvckhpZ2hCYW5kLCBjb25zdCBpbnQgbHNiLCBjb25zdCBpbnQgdXNiKSB7CisvKiEKK1RoZSA2NC1iYW5kIFFNRiByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9uYXVyYWwgc2lnbmFsIGdlbmVyYXRlZCBieSB0aGUgU0JSIHRvb2wKK2lzIHVzZWQgYXMgaW5wdXQgb2YgdGhlIFBTIHRvb2wuIEFmdGVyIHRoZSBQUyBwcm9jZXNzaW5nLCB0aGUgb3V0cHV0cyBvZiB0aGUKK2xlZnQgYW5kIHJpZ2h0IGh5YnJpZCBzeW50aGVzaXMgZmlsdGVyYmFua3MgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHN0ZXJlbworb3V0cHV0IHNpZ25hbC4KIAotICAvKiEKLSAgVGhlIDY0LWJhbmQgUU1GIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb25hdXJhbCBzaWduYWwgZ2VuZXJhdGVkIGJ5IHRoZSBTQlIgdG9vbAotICBpcyB1c2VkIGFzIGlucHV0IG9mIHRoZSBQUyB0b29sLiBBZnRlciB0aGUgUFMgcHJvY2Vzc2luZywgdGhlIG91dHB1dHMgb2YgdGhlIGxlZnQKLSAgYW5kIHJpZ2h0IGh5YnJpZCBzeW50aGVzaXMgZmlsdGVyYmFua3MgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHN0ZXJlbyBvdXRwdXQKLSAgc2lnbmFsLgorPHByZT4KIAotICA8cHJlPgorICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICAgLS0tLS0tLS0tLSAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0KKyAgICAgICAgICB8IEh5YnJpZCAgICAgIHwgTV9uW2ssbV0gfCAgICAgICAgICB8IExfbltrLG1dIHwgSHlicmlkICAgICAgfCBsW25dCisgbVtuXSAtLS0+fCBhbmFseXNpcyAgICB8LS0tLS0tLS0tPnwgICAgICAgICAgfC0tLS0tLS0tLT58IHN5bnRoZXNpcyAgIHwtLS0tLT4KKyAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgfCBTdGVyZW8gICB8ICAgICAgICAgICAtLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgcmVjb24tICAgfAorICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IHN0dWN0aW9uIHwKKyAgICAgICAgICAgICAgICBcfC8gICAgICAgICAgICAgICAgfCAgICAgICAgICB8CisgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgIHwgICAgICAgICAgfAorICAgICAgICAgIHwgRGUtICAgICAgICAgfCBEX25bayxtXSB8ICAgICAgICAgIHwKKyAgICAgICAgICB8IGNvcnJlbGF0aW9uIHwtLS0tLS0tLS0+fCAgICAgICAgICB8CisgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgUl9uW2ssbV0gfCBIeWJyaWQgICAgICB8IHJbbl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8LS0tLS0tLS0tPnwgc3ludGhlc2lzICAgfC0tLS0tPgorIElJRCwgSUNDIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT58ICAgICAgICAgIHwgICAgICAgICAgfCBmaWx0ZXIgYmFuayB8CisoSVBELCBPUEQpICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tICAgICAgICAgICAgLS0tLS0tLS0tLS0tLQogCi0gICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgIC0tLS0tLS0tLS0gICAgICAgICAgICAtLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICB8IEh5YnJpZCAgICAgIHwgTV9uW2ssbV0gfCAgICAgICAgICB8IExfbltrLG1dIHwgSHlicmlkICAgICAgfCBsW25dCi0gICBtW25dIC0tLT58IGFuYWx5c2lzICAgIHwtLS0tLS0tLS0+fCAgICAgICAgICB8LS0tLS0tLS0tPnwgc3ludGhlc2lzICAgfC0tLS0tPgotICAgICAgICAgICAgfCBmaWx0ZXIgYmFuayB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8IGZpbHRlciBiYW5rIHwKLSAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICB8IFN0ZXJlbyAgIHwgICAgICAgICAgIC0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IHJlY29uLSAgIHwKLSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IHN0dWN0aW9uIHwKLSAgICAgICAgICAgICAgICAgIFx8LyAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKLSAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICB8ICAgICAgICAgIHwKLSAgICAgICAgICAgIHwgRGUtICAgICAgICAgfCBEX25bayxtXSB8ICAgICAgICAgIHwKLSAgICAgICAgICAgIHwgY29ycmVsYXRpb24gfC0tLS0tLS0tLT58ICAgICAgICAgIHwKLSAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgIC0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgUl9uW2ssbV0gfCBIeWJyaWQgICAgICB8IHJbbl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwtLS0tLS0tLS0+fCBzeW50aGVzaXMgICB8LS0tLS0+Ci0gICBJSUQsIElDQyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fCAgICAgICAgICB8ICAgICAgICAgIHwgZmlsdGVyIGJhbmsgfAotICAoSVBELCBPUEQpICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tICAgICAgICAgICAgLS0tLS0tLS0tLS0tLQorbVtuXTogICAgICBRTUYgcmVwcmVzYW50YXRpb24gb2YgdGhlIG1vbm8gaW5wdXQKK01fbltrLG1dOiAgKHN1Yi0pc3ViLWJhbmQgZG9tYWluIHNpZ25hbHMgb2YgdGhlIG1vbm8gaW5wdXQKK0RfbltrLG1dOiAgZGVjb3JyZWxhdGVkIChzdWItKXN1Yi1iYW5kIGRvbWFpbiBzaWduYWxzCitMX25bayxtXTogIChzdWItKXN1Yi1iYW5kIGRvbWFpbiBzaWduYWxzIG9mIHRoZSBsZWZ0IG91dHB1dAorUl9uW2ssbV06ICAoc3ViLSlzdWItYmFuZCBkb21haW4gc2lnbmFscyBvZiB0aGUgcmlnaHQgb3V0cHV0CitsW25dLHJbbl06IGxlZnQvcmlnaHQgb3V0cHV0IHNpZ25hbHMKIAotICBtW25dOiAgICAgIFFNRiByZXByZXNhbnRhdGlvbiBvZiB0aGUgbW9ubyBpbnB1dAotICBNX25bayxtXTogIChzdWItKXN1Yi1iYW5kIGRvbWFpbiBzaWduYWxzIG9mIHRoZSBtb25vIGlucHV0Ci0gIERfbltrLG1dOiAgZGVjb3JyZWxhdGVkIChzdWItKXN1Yi1iYW5kIGRvbWFpbiBzaWduYWxzCi0gIExfbltrLG1dOiAgKHN1Yi0pc3ViLWJhbmQgZG9tYWluIHNpZ25hbHMgb2YgdGhlIGxlZnQgb3V0cHV0Ci0gIFJfbltrLG1dOiAgKHN1Yi0pc3ViLWJhbmQgZG9tYWluIHNpZ25hbHMgb2YgdGhlIHJpZ2h0IG91dHB1dAotICBsW25dLHJbbl06IGxlZnQvcmlnaHQgb3V0cHV0IHNpZ25hbHMKKzwvcHJlPgorKi8KKyNkZWZpbmUgTk9fSFlCUklEX0RBVEFfQkFORFMgKDcxKQogCi0gIDwvcHJlPgotICAqLworICBpbnQgaTsKKyAgRklYUF9EQkwgcW1mSW5wdXREYXRhWzJdW05PX1FNRl9CQU5EU19IWUJSSUQyMF07CisgIEZJWFBfREJMICpoeWJyaWREYXRhWzJdWzJdOworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocEh5YnJpZERhdGEsIEZJWFBfREJMLCA0ICogTk9fSFlCUklEX0RBVEFfQkFORFMpOwogCi0gIC8qIGdldCB0ZW1wb3JhcnkgaHlicmlkIHFtZiB2YWx1ZXMgb2Ygb25lIHRpbWVzbG90ICovCi0gIENfQUxMT0NfU0NSQVRDSF9TVEFSVChoeWJyaWRSZWFsTGVmdCwgRklYUF9EQkwsIE5PX1NVQl9RTUZfQ0hBTk5FTFMpOwotICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoaHlicmlkSW1hZ0xlZnQsIEZJWFBfREJMLCBOT19TVUJfUU1GX0NIQU5ORUxTKTsKLSAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGh5YnJpZFJlYWxSaWdodCwgRklYUF9EQkwsIE5PX1NVQl9RTUZfQ0hBTk5FTFMpOwotICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoaHlicmlkSW1hZ1JpZ2h0LCBGSVhQX0RCTCwgTk9fU1VCX1FNRl9DSEFOTkVMUyk7Ci0KLSAgU0NIQVIgc2ZfSW50QnVmZmVyICAgICA9IGhfcHNfZC0+c2ZfSW50QnVmZmVyOwotCi0gIC8qIGNsZWFyIHdvcmtidWZmZXIgKi8KLSAgRkRLbWVtY2xlYXIoaHlicmlkUmVhbExlZnQsICBOT19TVUJfUU1GX0NIQU5ORUxTKnNpemVvZihGSVhQX0RCTCkpOwotICBGREttZW1jbGVhcihoeWJyaWRJbWFnTGVmdCwgIE5PX1NVQl9RTUZfQ0hBTk5FTFMqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gIEZES21lbWNsZWFyKGh5YnJpZFJlYWxSaWdodCwgTk9fU1VCX1FNRl9DSEFOTkVMUypzaXplb2YoRklYUF9EQkwpKTsKLSAgRkRLbWVtY2xlYXIoaHlicmlkSW1hZ1JpZ2h0LCBOT19TVUJfUU1GX0NIQU5ORUxTKnNpemVvZihGSVhQX0RCTCkpOwotCisgIGh5YnJpZERhdGFbMF1bMF0gPQorICAgICAgcEh5YnJpZERhdGEgKyAwICogTk9fSFlCUklEX0RBVEFfQkFORFM7IC8qIGxlZnQgcmVhbCBoeWJyaWQgZGF0YSAqLworICBoeWJyaWREYXRhWzBdWzFdID0KKyAgICAgIHBIeWJyaWREYXRhICsgMSAqIE5PX0hZQlJJRF9EQVRBX0JBTkRTOyAvKiBsZWZ0IGltYWcgaHlicmlkIGRhdGEgKi8KKyAgaHlicmlkRGF0YVsxXVswXSA9CisgICAgICBwSHlicmlkRGF0YSArIDIgKiBOT19IWUJSSURfREFUQV9CQU5EUzsgLyogcmlnaHQgcmVhbCBoeWJyaWQgZGF0YSAqLworICBoeWJyaWREYXRhWzFdWzFdID0KKyAgICAgIHBIeWJyaWREYXRhICsgMyAqIE5PX0hZQlJJRF9EQVRBX0JBTkRTOyAvKiByaWdodCBpbWFnIGh5YnJpZCBkYXRhICovCiAKICAgLyohCiAgIEh5YnJpZCBhbmFseXNpcyBmaWx0ZXJiYW5rOgotICBUaGUgbG93ZXIgMyAoNSkgb2YgdGhlIDY0IFFNRiBzdWJiYW5kcyBhcmUgZnVydGhlciBzcGxpdCB0byBwcm92aWRlIGJldHRlciBmcmVxdWVuY3kgcmVzb2x1dGlvbi4KLSAgZm9yIFBTIHByb2Nlc3NpbmcuCi0gIEZvciB0aGUgMTAgYW5kIDIwIHN0ZXJlbyBiYW5kcyBjb25maWd1cmF0aW9uLCB0aGUgUU1GIGJhbmQgSF8wKHcpIGlzIHNwbGl0Ci0gIHVwIGludG8gOCAoc3ViLSkgc3ViLWJhbmRzIGFuZCB0aGUgUU1GIGJhbmRzIEhfMSh3KSBhbmQgSF8yKHcpIGFyZSBzcGl0IGludG8gMiAoc3ViLSkKLSAgNHRoLiAoU2VlIGZpZ3VyZXMgOC4yMCBhbmQgOC4yMiBvZiBJU08vSUVDIDE0NDk2LTM6MjAwMS9GREFNIDI6MjAwNChFKSApCisgIFRoZSBsb3dlciAzICg1KSBvZiB0aGUgNjQgUU1GIHN1YmJhbmRzIGFyZSBmdXJ0aGVyIHNwbGl0IHRvIHByb3ZpZGUgYmV0dGVyCisgIGZyZXF1ZW5jeSByZXNvbHV0aW9uLiBmb3IgUFMgcHJvY2Vzc2luZy4gRm9yIHRoZSAxMCBhbmQgMjAgc3RlcmVvIGJhbmRzCisgIGNvbmZpZ3VyYXRpb24sIHRoZSBRTUYgYmFuZCBIXzAodykgaXMgc3BsaXQgdXAgaW50byA4IChzdWItKSBzdWItYmFuZHMgYW5kIHRoZQorICBRTUYgYmFuZHMgSF8xKHcpIGFuZCBIXzIodykgYXJlIHNwaXQgaW50byAyIChzdWItKSA0dGguIChTZWUgZmlndXJlcyA4LjIwCisgIGFuZCA4LjIyIG9mIElTTy9JRUMgMTQ0OTYtMzoyMDAxL0ZEQU0gMjoyMDA0KEUpICkKICAgKi8KIAorICAvKgorICAgKiBIeWJyaWQgYW5hbHlzaXMuCisgICAqLwogCi0gIGlmIChoX3BzX2QtPnByb2NGcmFtZUJhc2VkID09IDEpICAgIC8qIElmIHdlIGhhdmUgc3dpdGNoZWQgZnJvbSBmcmFtZSB0byBzbG90IGJhc2VkIHByb2Nlc3NpbmcgICovCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGwgaHlicmlkIGRlbGF5IGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaF9wc19kLT5wcm9jRnJhbWVCYXNlZCA9IDA7Ci0KLSAgICBmaWxsSHlicmlkRGVsYXlMaW5lKCBySW50QnVmZmVyTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpSW50QnVmZmVyTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRSZWFsTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRJbWFnTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRSZWFsUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkSW1hZ1JpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZCApOworICAvKiBHZXQgcW1mIGlucHV0IGRhdGEgYW5kIGFwcGx5IGRlc2NhbGluZyAqLworICBmb3IgKGkgPSAwOyBpIDwgTk9fUU1GX0JBTkRTX0hZQlJJRDIwOyBpKyspIHsKKyAgICBxbWZJbnB1dERhdGFbMF1baV0gPSBzY2FsZVZhbHVlKHJJbnRCdWZmZXJMZWZ0W0hZQlJJRF9GSUxURVJfREVMQVldW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JMb3dCYW5kX25vX292KTsKKyAgICBxbWZJbnB1dERhdGFbMV1baV0gPSBzY2FsZVZhbHVlKGlJbnRCdWZmZXJMZWZ0W0hZQlJJRF9GSUxURVJfREVMQVldW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JMb3dCYW5kX25vX292KTsKICAgfQogCi0gIHNsb3RCYXNlZEh5YnJpZEFuYWx5c2lzICggckludEJ1ZmZlckxlZnRbSFlCUklEX0ZJTFRFUl9ERUxBWV0sIC8qIHFtZiBmaWx0ZXJiYW5rIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlJbnRCdWZmZXJMZWZ0W0hZQlJJRF9GSUxURVJfREVMQVldLCAvKiBxbWYgZmlsdGVyYmFuayB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRSZWFsTGVmdCwgICAgICAgICAgICAgICAgICAgICAgLyogaHlicmlkIGZpbHRlcmJhbmsgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkSW1hZ0xlZnQsICAgICAgICAgICAgICAgICAgICAgIC8qIGh5YnJpZCBmaWx0ZXJiYW5rIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZCk7ICAgICAgICAgIC8qIGh5YnJpZCBmaWx0ZXJiYW5rIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBMRiAtIHBhcnQgKi8KKyAgRkRLaHlicmlkQW5hbHlzaXNBcHBseSgmaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaHlicmlkQW5hbHlzaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcW1mSW5wdXREYXRhWzBdLCBxbWZJbnB1dERhdGFbMV0sIGh5YnJpZERhdGFbMF1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkRGF0YVswXVsxXSk7CiAKKyAgLyogSEYgLSBwYXJ0ICovCisgIC8qIGJhbmRzIHVwIHRvIGxzYiAqLworICBzY2FsZVZhbHVlcygmaHlicmlkRGF0YVswXVswXVtOT19TVUJfUU1GX0NIQU5ORUxTIC0gMl0sCisgICAgICAgICAgICAgICZySW50QnVmZmVyTGVmdFswXVtOT19RTUZfQkFORFNfSFlCUklEMjBdLAorICAgICAgICAgICAgICBsc2IgLSBOT19RTUZfQkFORFNfSFlCUklEMjAsIHNjYWxlRmFjdG9yTG93QmFuZCk7CisgIHNjYWxlVmFsdWVzKCZoeWJyaWREYXRhWzBdWzFdW05PX1NVQl9RTUZfQ0hBTk5FTFMgLSAyXSwKKyAgICAgICAgICAgICAgJmlJbnRCdWZmZXJMZWZ0WzBdW05PX1FNRl9CQU5EU19IWUJSSUQyMF0sCisgICAgICAgICAgICAgIGxzYiAtIE5PX1FNRl9CQU5EU19IWUJSSUQyMCwgc2NhbGVGYWN0b3JMb3dCYW5kKTsKIAotICBTQ0hBUiBoeWJyaWRTY2FsID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaHlicmlkLnNmX21RbWZCdWZmZXI7CisgIC8qIGJhbmRzIGZyb20gbHNiIHRvIHVzYiAqLworICBzY2FsZVZhbHVlcygmaHlicmlkRGF0YVswXVswXVtsc2IgKyAoTk9fU1VCX1FNRl9DSEFOTkVMUyAtIDIgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9fUU1GX0JBTkRTX0hZQlJJRDIwKV0sCisgICAgICAgICAgICAgICZySW50QnVmZmVyTGVmdFswXVtsc2JdLCB1c2IgLSBsc2IsIHNjYWxlRmFjdG9ySGlnaEJhbmQpOworICBzY2FsZVZhbHVlcygmaHlicmlkRGF0YVswXVsxXVtsc2IgKyAoTk9fU1VCX1FNRl9DSEFOTkVMUyAtIDIgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9fUU1GX0JBTkRTX0hZQlJJRDIwKV0sCisgICAgICAgICAgICAgICZpSW50QnVmZmVyTGVmdFswXVtsc2JdLCB1c2IgLSBsc2IsIHNjYWxlRmFjdG9ySGlnaEJhbmQpOwogCisgIC8qIGJhbmRzIGZyb20gdXNiIHRvIE5PX1NVQl9RTUZfQ0hBTk5FTFMgd2hpY2ggc2hvdWxkIGJlIHplcm8gZm9yIG5vbi1vdmVybGFwCisgICAgIHNsb3RzIGJ1dCBjYW4gYmUgbm9uLXplcm8gZm9yIG92ZXJsYXAgc2xvdHMgKi8KKyAgRkRLbWVtY3B5KAorICAgICAgJmh5YnJpZERhdGFbMF1bMF0KKyAgICAgICAgICAgICAgICAgW3VzYiArIChOT19TVUJfUU1GX0NIQU5ORUxTIC0gMiAtIE5PX1FNRl9CQU5EU19IWUJSSUQyMCldLAorICAgICAgJnJJbnRCdWZmZXJMZWZ0WzBdW3VzYl0sIHNpemVvZihGSVhQX0RCTCkgKiAoTk9fUU1GX0NIQU5ORUxTIC0gdXNiKSk7CisgIEZES21lbWNweSgKKyAgICAgICZoeWJyaWREYXRhWzBdWzFdCisgICAgICAgICAgICAgICAgIFt1c2IgKyAoTk9fU1VCX1FNRl9DSEFOTkVMUyAtIDIgLSBOT19RTUZfQkFORFNfSFlCUklEMjApXSwKKyAgICAgICZpSW50QnVmZmVyTGVmdFswXVt1c2JdLCBzaXplb2YoRklYUF9EQkwpICogKE5PX1FNRl9DSEFOTkVMUyAtIHVzYikpOwogCiAgIC8qIQogICBEZWNvcnJlbGF0aW9uOgotICBCeSBtZWFucyBvZiBhbGwtcGFzcyBmaWx0ZXJpbmcgYW5kIGRlbGF5aW5nLCB0aGUgKHN1Yi0pc3ViLWJhbmQgc2FtcGxlcyBzX2sobikgYXJlCi0gIGNvbnZlcnRlZCBpbnRvIGRlLWNvcnJlbGF0ZWQgKHN1Yi0pc3ViLWJhbmQgc2FtcGxlcyBkX2sobikuCisgIEJ5IG1lYW5zIG9mIGFsbC1wYXNzIGZpbHRlcmluZyBhbmQgZGVsYXlpbmcsIHRoZSAoc3ViLSlzdWItYmFuZCBzYW1wbGVzIHNfayhuKQorICBhcmUgY29udmVydGVkIGludG8gZGUtY29ycmVsYXRlZCAoc3ViLSlzdWItYmFuZCBzYW1wbGVzIGRfayhuKS4KICAgLSBrOiBmcmVxdWVuY3kgaW4gaHlicmlkIHNwZWN0cnVtCiAgIC0gbjogdGltZSBpbmRleAogICAqLwogCi0gIGRlQ29ycmVsYXRlU2xvdEJhc2VkKCBoX3BzX2QsICAgICAgICAgICAgICAvKiBwYXJhbWV0cmljIHN0ZXJlbyBkZWNvZGVyIGhhbmRsZSAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkUmVhbExlZnQsICAgICAgLyogbGVmdCBoeWJyaWQgdGltZSBzbG90ICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZEltYWdMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkU2NhbCwgICAgICAvKiBzY2FsZSBmYWN0b3Igb2YgbGVmdCBoeWJyaWQgdGltZSBzbG90ICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgckludEJ1ZmZlckxlZnRbMF0sICAgLyogbGVmdCBxbWYgdGltZSBzbG90ICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlJbnRCdWZmZXJMZWZ0WzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgc2ZfSW50QnVmZmVyLCAgICAgICAgLyogc2NhbGUgZmFjdG9yIG9mIGxlZnQgYW5kIHJpZ2h0IHFtZiB0aW1lIHNsb3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZFJlYWxSaWdodCwgICAgIC8qIHJpZ2h0IGh5YnJpZCB0aW1lIHNsb3QgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRJbWFnUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBySW50QnVmZmVyUmlnaHQsICAgICAvKiByaWdodCBxbWYgdGltZSBzbG90ICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaUludEJ1ZmZlclJpZ2h0ICk7Ci0KLQorICBGREtkZWNvcnJlbGF0ZUFwcGx5KCZoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hcERlY29yLAorICAgICAgICAgICAgICAgICAgICAgICZoeWJyaWREYXRhWzBdWzBdWzBdLCAvKiBsZWZ0IHJlYWwgaHlicmlkIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAmaHlicmlkRGF0YVswXVsxXVswXSwgLyogbGVmdCBpbWFnIGh5YnJpZCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgJmh5YnJpZERhdGFbMV1bMF1bMF0sIC8qIHJpZ2h0IHJlYWwgaHlicmlkIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAmaHlicmlkRGF0YVsxXVsxXVswXSwgLyogcmlnaHQgaW1hZyBoeWJyaWQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydEh5YkJhbmQgKi8KKyAgKTsKIAogICAvKiEKICAgU3RlcmVvIFByb2Nlc3Npbmc6Ci0gIFRoZSBzZXRzIG9mIChzdWItKXN1Yi1iYW5kIHNhbXBsZXMgc19rKG4pIGFuZCBkX2sobikgYXJlIHByb2Nlc3NlZCBhY2NvcmRpbmcgdG8KLSAgdGhlIHN0ZXJlbyBjdWVzIHdoaWNoIGFyZSBkZWZpbmVkIHBlciBzdGVyZW8gYmFuZC4KKyAgVGhlIHNldHMgb2YgKHN1Yi0pc3ViLWJhbmQgc2FtcGxlcyBzX2sobikgYW5kIGRfayhuKSBhcmUgcHJvY2Vzc2VkIGFjY29yZGluZworICB0byB0aGUgc3RlcmVvIGN1ZXMgd2hpY2ggYXJlIGRlZmluZWQgcGVyIHN0ZXJlbyBiYW5kLgogICAqLwogCi0KLSAgYXBwbHlTbG90QmFzZWRSb3RhdGlvbiggaF9wc19kLCAgICAgICAgICAgIC8qIHBhcmFtZXRyaWMgc3RlcmVvIGRlY29kZXIgaGFuZGxlICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZFJlYWxMZWZ0LCAgICAvKiBsZWZ0IGh5YnJpZCB0aW1lIHNsb3QgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRJbWFnTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgckludEJ1ZmZlckxlZnRbMF0sIC8qIGxlZnQgcW1mIHRpbWUgc2xvdCAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlJbnRCdWZmZXJMZWZ0WzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRSZWFsUmlnaHQsICAgLyogcmlnaHQgaHlicmlkIHRpbWUgc2xvdCAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkSW1hZ1JpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBySW50QnVmZmVyUmlnaHQsICAgLyogcmlnaHQgcW1mIHRpbWUgc2xvdCAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaUludEJ1ZmZlclJpZ2h0ICk7Ci0KLQotCisgIGFwcGx5U2xvdEJhc2VkUm90YXRpb24oaF9wc19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICZoeWJyaWREYXRhWzBdWzBdWzBdLCAvKiBsZWZ0IHJlYWwgaHlicmlkIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAmaHlicmlkRGF0YVswXVsxXVswXSwgLyogbGVmdCBpbWFnIGh5YnJpZCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgJmh5YnJpZERhdGFbMV1bMF1bMF0sIC8qIHJpZ2h0IHJlYWwgaHlicmlkIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAmaHlicmlkRGF0YVsxXVsxXVswXSAgLyogcmlnaHQgaW1hZyBoeWJyaWQgZGF0YSAqLworICApOwogCiAgIC8qIQogICBIeWJyaWQgc3ludGhlc2lzIGZpbHRlcmJhbms6Ci0gIFRoZSBzdGVyZW8gcHJvY2Vzc2VkIGh5YnJpZCBzdWJiYW5kIHNpZ25hbHMgbF9rKG4pIGFuZCByX2sobikgYXJlIGZlZCBpbnRvIHRoZSBoeWJyaWQgc3ludGhlc2lzCi0gIGZpbHRlcmJhbmtzIHdoaWNoIGFyZSBpZGVudGljYWwgdG8gdGhlIDY0IGNvbXBsZXggc3ludGhlc2lzIGZpbHRlcmJhbmsgb2YgdGhlIFNCUiB0b29sLiBUaGUKLSAgaW5wdXQgdG8gdGhlIGZpbHRlcmJhbmsgYXJlIHNsb3RzIG9mIDY0IFFNRiBzYW1wbGVzLiBGb3IgZWFjaCBzbG90IHRoZSBmaWx0ZXJiYW5rIG91dHB1dHMgb25lCi0gIGJsb2NrIG9mIDY0IHNhbXBsZXMgb2Ygb25lIHJlY29uc3RydWN0ZWQgc3RlcmVvIGNoYW5uZWwuIFRoZSBoeWJyaWQgc3ludGhlc2lzIGZpbHRlcmJhbmsgaXMKLSAgY29tcHV0ZWQgc2VwZXJhdGx5IGZvciB0aGUgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbC4KKyAgVGhlIHN0ZXJlbyBwcm9jZXNzZWQgaHlicmlkIHN1YmJhbmQgc2lnbmFscyBsX2sobikgYW5kIHJfayhuKSBhcmUgZmVkIGludG8gdGhlCisgIGh5YnJpZCBzeW50aGVzaXMgZmlsdGVyYmFua3Mgd2hpY2ggYXJlIGlkZW50aWNhbCB0byB0aGUgNjQgY29tcGxleCBzeW50aGVzaXMKKyAgZmlsdGVyYmFuayBvZiB0aGUgU0JSIHRvb2wuIFRoZSBpbnB1dCB0byB0aGUgZmlsdGVyYmFuayBhcmUgc2xvdHMgb2YgNjQgUU1GCisgIHNhbXBsZXMuIEZvciBlYWNoIHNsb3QgdGhlIGZpbHRlcmJhbmsgb3V0cHV0cyBvbmUgYmxvY2sgb2YgNjQgc2FtcGxlcyBvZiBvbmUKKyAgcmVjb25zdHJ1Y3RlZCBzdGVyZW8gY2hhbm5lbC4gVGhlIGh5YnJpZCBzeW50aGVzaXMgZmlsdGVyYmFuayBpcyBjb21wdXRlZAorICBzZXBlcmF0bHkgZm9yIHRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVsLgogICAqLwogCi0KLSAgLyogbGVmdCBjaGFubmVsICovCi0gIHNsb3RCYXNlZEh5YnJpZFN5bnRoZXNpcyAoIGh5YnJpZFJlYWxMZWZ0LCAgICAgICAgIC8qIG9uZSB0aW1lc2xvdCBvZiBoeWJyaWQgZmlsdGVyYmFuayB2YWx1ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkSW1hZ0xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJJbnRCdWZmZXJMZWZ0WzBdLCAgICAgIC8qIG9uZSB0aW1lc2xvdCBvZiBxbWYgZmlsdGVyYmFuayB2YWx1ZXMgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUludEJ1ZmZlckxlZnRbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZCApOyAgICAgIC8qIGh5YnJpZCBmaWx0ZXJiYW5rIGhhbmRsZSAgICAgICAgICAgICAgICAgKi8KLQotICAvKiByaWdodCBjaGFubmVsICovCi0gIHNsb3RCYXNlZEh5YnJpZFN5bnRoZXNpcyAoIGh5YnJpZFJlYWxSaWdodCwgICAgICAgIC8qIG9uZSB0aW1lc2xvdCBvZiBoeWJyaWQgZmlsdGVyYmFuayB2YWx1ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkSW1hZ1JpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBySW50QnVmZmVyUmlnaHQsICAgICAgICAvKiBvbmUgdGltZXNsb3Qgb2YgcW1mIGZpbHRlcmJhbmsgdmFsdWVzICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlJbnRCdWZmZXJSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaHlicmlkICk7ICAgICAgLyogaHlicmlkIGZpbHRlcmJhbmsgaGFuZGxlICAgICAgICAgICAgICAgICAqLwotCi0KLQotCi0KLQorICAvKgorICAgKiBIeWJyaWQgc3ludGhlc2lzLgorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgIEZES2h5YnJpZFN5bnRoZXNpc0FwcGx5KAorICAgICAgICAmaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaHlicmlkU3ludGhlc2lzW2ldLAorICAgICAgICBoeWJyaWREYXRhW2ldWzBdLCAvKiByZWFsIGh5YnJpZCBkYXRhICovCisgICAgICAgIGh5YnJpZERhdGFbaV1bMV0sIC8qIGltYWcgaHlicmlkIGRhdGEgKi8KKyAgICAgICAgKGkgPT0gMCkgPyBySW50QnVmZmVyTGVmdFswXQorICAgICAgICAgICAgICAgICA6IHJJbnRCdWZmZXJSaWdodCwgLyogb3V0cHV0IHJlYWwgcW1mIGJ1ZmZlciAqLworICAgICAgICAoaSA9PSAwKSA/IGlJbnRCdWZmZXJMZWZ0WzBdCisgICAgICAgICAgICAgICAgIDogaUludEJ1ZmZlclJpZ2h0IC8qIG91dHB1dCBpbWFnIHFtZiBidWZmZXIgKi8KKyAgICApOworICB9CiAKICAgLyogZnJlZSB0ZW1wb3JhcnkgaHlicmlkIHFtZiB2YWx1ZXMgb2Ygb25lIHRpbWVzbG90ICovCi0gIENfQUxMT0NfU0NSQVRDSF9FTkQoaHlicmlkSW1hZ1JpZ2h0LCBGSVhQX0RCTCwgTk9fU1VCX1FNRl9DSEFOTkVMUyk7Ci0gIENfQUxMT0NfU0NSQVRDSF9FTkQoaHlicmlkUmVhbFJpZ2h0LCBGSVhQX0RCTCwgTk9fU1VCX1FNRl9DSEFOTkVMUyk7Ci0gIENfQUxMT0NfU0NSQVRDSF9FTkQoaHlicmlkSW1hZ0xlZnQsIEZJWFBfREJMLCBOT19TVUJfUU1GX0NIQU5ORUxTKTsKLSAgQ19BTExPQ19TQ1JBVENIX0VORChoeWJyaWRSZWFsTGVmdCwgRklYUF9EQkwsIE5PX1NVQl9RTUZfQ0hBTk5FTFMpOworICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHBIeWJyaWREYXRhLCBGSVhQX0RCTCwgNCAqIE5PX0hZQlJJRF9EQVRBX0JBTkRTKTsKIAotfS8qIEVORCBBcHBseVBzU2xvdCAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiEKLQotICBcYnJpZWYgIGFzc2lnbnMgdGltZXNsb3RzIHRvIGFuIGFycmF5Ci0KLSAgXHJldHVybgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBhc3NpZ25UaW1lU2xvdHNQUyAoRklYUF9EQkwgKmJ1ZkFkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmJ1ZlB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtU2xvdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bUNoYW4pCi17Ci0gIEZJWFBfREJMICAqcHRyOwotICBpbnQgc2xvdDsKLSAgcHRyID0gYnVmQWRyOwotICBmb3Ioc2xvdD0wOyBzbG90IDwgbnVtU2xvdHM7IHNsb3QrKykgewotICAgYnVmUHRyIFtzbG90XSA9IHB0cjsKLSAgICBwdHIgKz0gbnVtQ2hhbjsKLSAgfQotfQotCit9IC8qIEVORCBBcHBseVBzU2xvdCAqLwpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9wc2RlYy5oIGIvbGliU0JSZGVjL3NyYy9wc2RlYy5oCmluZGV4IDNkYmM3NmQuLjZhZTE0NzMgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvcHNkZWMuaAorKysgYi9saWJTQlJkZWMvc3JjL3BzZGVjLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTggKzkwLDI3IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgU2JyIGRlY29kZXIgIAorICBcYnJpZWYgIFNiciBkZWNvZGVyCiAqLwotI2lmbmRlZiBfX1BTREVDX0gKLSNkZWZpbmUgX19QU0RFQ19ICisjaWZuZGVmIFBTREVDX0gKKyNkZWZpbmUgUFNERUNfSAogCiAjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgorI2luY2x1ZGUgIkZES19oeWJyaWQuaCIKIAotCisjaW5jbHVkZSAiRkRLX2RlY29ycmVsYXRlLmgiCiAKIC8qIFRoaXMgUFMgZGVjb2RlciBpbXBsZW1lbnRzIHRoZSBiYXNlbGluZSB2ZXJzaW9uLiBTbyBpdCBhbHdheXMgdXNlcyB0aGUgICAgICovCiAvKiBoeWJyaWQgZmlsdGVyIHN0cnVjdHVyZSBmb3IgMjAgc3RlcmVvIGJhbmRzIGFuZCBkb2VzIG5vdCBpbXBsZW1ldCBJUEQvT1BEICAqLwpAQCAtOTksMjU0ICsxMTksMjExIEBACiAvKiBpcyB1c2VkIGluIHRoZSBiaXRzdHJlYW0gZm9yIElJUy9JQ0MgdGhlIGRlY29kZWQgcGFyYW1ldGVycyBhcmUgbWFwcGVkIHRvICAqLwogLyogMjAgc3RlcmVvIGJhbmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotCiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgogCi0jaW5jbHVkZSAicHNkZWNfaHlicmlkLmgiCisjZGVmaW5lIFNDQUxfSEVBRFJPT00gKDIpCiAKLSNkZWZpbmUgU0NBTF9IRUFEUk9PTSAgICAgICAgICAgICAgICAgICAgICggMiApCisjZGVmaW5lIFBTX0VYVEVOU0lPTl9TSVpFX0JJVFMgKDQpCisjZGVmaW5lIFBTX0VYVEVOU0lPTl9FU0NfQ09VTlRfQklUUyAoOCkKIAotI2RlZmluZSBQU19FWFRFTlNJT05fU0laRV9CSVRTICAgICAgICAgICAgKCA0ICkKLSNkZWZpbmUgUFNfRVhURU5TSU9OX0VTQ19DT1VOVF9CSVRTICAgICAgICggOCApCisjZGVmaW5lIE5PX1FNRl9DSEFOTkVMUyAoNjQpCisjZGVmaW5lIE1BWF9OVU1fQ09MICgzMikKIAotI2RlZmluZSBOT19RTUZfQ0hBTk5FTFMgICAgICAgICAgICAgICAgICAgKCA2NCApCi0jZGVmaW5lIE1BWF9OVU1fQ09MICAgICAgICAgICAgICAgICAgICAgICAoIDMyICkKKyNkZWZpbmUgTk9fUU1GX0JBTkRTX0hZQlJJRDIwICgzKQorI2RlZmluZSBOT19TVUJfUU1GX0NIQU5ORUxTICgxMikKKyNkZWZpbmUgSFlCUklEX0ZJTFRFUl9ERUxBWSAoNikKIAorI2RlZmluZSBNQVhfTk9fUFNfRU5WICg0ICsgMSkgLyogKzEgbmVlZGVkIGZvciBWQVJfQk9SREVSICovCiAKLSAgI2RlZmluZSBOT19RTUZfQkFORFNfSFlCUklEMjAgICAgICAgICAgICggMyAgKQotICAjZGVmaW5lIE5PX1NVQl9RTUZfQ0hBTk5FTFMgICAgICAgICAgICAgKCAxMiApCisjZGVmaW5lIE5PX0hJX1JFU19CSU5TICgzNCkKKyNkZWZpbmUgTk9fTUlEX1JFU19CSU5TICgyMCkKKyNkZWZpbmUgTk9fTE9XX1JFU19CSU5TICgxMCkKIAotICAjZGVmaW5lIE5SR19JTlRfQ09FRkYgICAgICAgICAgICAgICAgICAgKCAwLjc1ZiApCi0gICNkZWZpbmUgSU5UX0ZJTFRFUl9DT0VGRiAgICAgICAgICAgICAgICAoRkwyRlhDT05TVF9EQkwoIDEuMGYgLSBOUkdfSU5UX0NPRUZGICkpCi0gICNkZWZpbmUgUEVBS19ERUNBWV9GQUNUT1IgICAgICAgICAgICAgICAoRkwyRlhDT05TVF9EQkwoIDAuNzY1OTI4MzM4MzY0NjQ5ZiApKQotICAjZGVmaW5lIFRSQU5TSUVOVF9JTVBBQ1RfRkFDVE9SICAgICAgICAgKEZMMkZYQ09OU1RfREJMKCAyLjAgLyAzLjAgKSkKKyNkZWZpbmUgTk9fSElfUkVTX0lJRF9CSU5TIChOT19ISV9SRVNfQklOUykKKyNkZWZpbmUgTk9fSElfUkVTX0lDQ19CSU5TIChOT19ISV9SRVNfQklOUykKIAotICAjZGVmaW5lIE5PX1NFUklBTF9BTExQQVNTX0xJTktTICAgICAgICAgKCAzICkKLSAgI2RlZmluZSBNQVhfTk9fUFNfRU5WICAgICAgICAgICAgICAgICAgICggNCArIDEgKSAgIC8qICsxIG5lZWRlZCBmb3IgVkFSX0JPUkRFUiAqLworI2RlZmluZSBOT19NSURfUkVTX0lJRF9CSU5TIChOT19NSURfUkVTX0JJTlMpCisjZGVmaW5lIE5PX01JRF9SRVNfSUNDX0JJTlMgKE5PX01JRF9SRVNfQklOUykKIAotICAjZGVmaW5lIE1BWF9ERUxBWV9CVUZGRVJfU0laRSAgICAgICAgICAgKCAxNCApCi0gICNkZWZpbmUgTk9fREVMQVlfQlVGRkVSX0JBTkRTICAgICAgICAgICAoIDM1ICkKKyNkZWZpbmUgTk9fTE9XX1JFU19JSURfQklOUyAoTk9fTE9XX1JFU19CSU5TKQorI2RlZmluZSBOT19MT1dfUkVTX0lDQ19CSU5TIChOT19MT1dfUkVTX0JJTlMpCiAKLSAgI2RlZmluZSBOT19ISV9SRVNfQklOUyAgICAgICAgICAgICAgICAgICggMzQgKQotICAjZGVmaW5lIE5PX01JRF9SRVNfQklOUyAgICAgICAgICAgICAgICAgKCAyMCApCi0gICNkZWZpbmUgTk9fTE9XX1JFU19CSU5TICAgICAgICAgICAgICAgICAoIDEwICkKKyNkZWZpbmUgU1VCUU1GX0dST1VQUyAoMTApCisjZGVmaW5lIFFNRl9HUk9VUFMgKDEyKQogCi0gICNkZWZpbmUgRklSU1RfREVMQVlfU0IgICAgICAgICAgICAgICAgICAoIDIzICkKLSAgI2RlZmluZSBOT19TQU1QTEVfREVMQVlfQUxMUEFTUyAgICAgICAgICggMiApCi0gICNkZWZpbmUgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMgICAgICAgICAoIDEyICkgICAgIC8qIGQobSk6IGQoMCk9MyArIGQoMSk9NCArIGQoMik9NSAqLworLy8jZGVmaW5lIFNVQlFNRl9HUk9VUFNfSElfUkVTICAgICAgICAgICAgKCAzMiApCisvLyNkZWZpbmUgUU1GX0dST1VQU19ISV9SRVMgICAgICAgICAgICAgICAoIDE4ICkKIAotICAjZGVmaW5lIE5PX0hJX1JFU19JSURfQklOUyAgICAgICAgICAgICAgKCBOT19ISV9SRVNfQklOUyApCi0gICNkZWZpbmUgTk9fSElfUkVTX0lDQ19CSU5TICAgICAgICAgICAgICAoIE5PX0hJX1JFU19CSU5TICkKKyNkZWZpbmUgTk9fSUlEX0dST1VQUyAoU1VCUU1GX0dST1VQUyArIFFNRl9HUk9VUFMpCisvLyNkZWZpbmUgTk9fSUlEX0dST1VQU19ISV9SRVMgICAgICAgICAgICAoIFNVQlFNRl9HUk9VUFNfSElfUkVTICsKKy8vIFFNRl9HUk9VUFNfSElfUkVTICkKIAotICAjZGVmaW5lIE5PX01JRF9SRVNfSUlEX0JJTlMgICAgICAgICAgICAgKCBOT19NSURfUkVTX0JJTlMgKQotICAjZGVmaW5lIE5PX01JRF9SRVNfSUNDX0JJTlMgICAgICAgICAgICAgKCBOT19NSURfUkVTX0JJTlMgKQorI2RlZmluZSBOT19JSURfU1RFUFMgKDcpICAgICAgIC8qIDEgLi4gKyA3ICovCisjZGVmaW5lIE5PX0lJRF9TVEVQU19GSU5FICgxNSkgLyogMSAuLiArMTUgKi8KKyNkZWZpbmUgTk9fSUNDX1NURVBTICg4KSAgICAgICAvKiAwIC4uICsgNyAqLwogCi0gICNkZWZpbmUgTk9fTE9XX1JFU19JSURfQklOUyAgICAgICAgICAgICAoIE5PX0xPV19SRVNfQklOUyApCi0gICNkZWZpbmUgTk9fTE9XX1JFU19JQ0NfQklOUyAgICAgICAgICAgICAoIE5PX0xPV19SRVNfQklOUyApCisjZGVmaW5lIE5PX0lJRF9MRVZFTFMgKDIgKiBOT19JSURfU1RFUFMgKyAxKSAgICAgICAgICAgLyogLSA3IC4uICArIDcgKi8KKyNkZWZpbmUgTk9fSUlEX0xFVkVMU19GSU5FICgyICogTk9fSUlEX1NURVBTX0ZJTkUgKyAxKSAvKiAtMTUgLi4gICsxNSAqLworI2RlZmluZSBOT19JQ0NfTEVWRUxTIChOT19JQ0NfU1RFUFMpICAgICAgICAgICAgICAgICAgIC8qICAgMCAuLiAgKyA3ICovCiAKLSAgI2RlZmluZSBTVUJRTUZfR1JPVVBTICAgICAgICAgICAgICAgICAgICggMTAgKQotICAjZGVmaW5lIFFNRl9HUk9VUFMgICAgICAgICAgICAgICAgICAgICAgKCAxMiApCisjZGVmaW5lIEZJWFBfU1FSVDA1ICgoRklYUF9EQkwpMHg1YTgyNzk4MCkgLyogMS9TUVJUMiAqLwogCi0gICNkZWZpbmUgU1VCUU1GX0dST1VQU19ISV9SRVMgICAgICAgICAgICAoIDMyICkKLSAgI2RlZmluZSBRTUZfR1JPVVBTX0hJX1JFUyAgICAgICAgICAgICAgICggMTggKQorc3RydWN0IFBTX0RFQ19DT0VGRklDSUVOVFMgeworICBGSVhQX0RCTCBIMTFyW05PX0lJRF9HUk9VUFNdOyAvKiE8IGNvZWZmaWNpZW50cyBvZiB0aGUgc3ViLXN1YmJhbmQgZ3JvdXBzICovCisgIEZJWFBfREJMIEgxMnJbTk9fSUlEX0dST1VQU107IC8qITwgY29lZmZpY2llbnRzIG9mIHRoZSBzdWItc3ViYmFuZCBncm91cHMgKi8KKyAgRklYUF9EQkwgSDIxcltOT19JSURfR1JPVVBTXTsgLyohPCBjb2VmZmljaWVudHMgb2YgdGhlIHN1Yi1zdWJiYW5kIGdyb3VwcyAqLworICBGSVhQX0RCTCBIMjJyW05PX0lJRF9HUk9VUFNdOyAvKiE8IGNvZWZmaWNpZW50cyBvZiB0aGUgc3ViLXN1YmJhbmQgZ3JvdXBzICovCiAKLSAgI2RlZmluZSBOT19JSURfR1JPVVBTICAgICAgICAgICAgICAgICAgICggU1VCUU1GX0dST1VQUyArIFFNRl9HUk9VUFMgKQotICAjZGVmaW5lIE5PX0lJRF9HUk9VUFNfSElfUkVTICAgICAgICAgICAgKCBTVUJRTUZfR1JPVVBTX0hJX1JFUyArIFFNRl9HUk9VUFNfSElfUkVTICkKKyAgRklYUF9EQkwKKyAgRGVsdGFIMTFyW05PX0lJRF9HUk9VUFNdOyAvKiE8IGNvZWZmaWNpZW50cyBvZiB0aGUgc3ViLXN1YmJhbmQgZ3JvdXBzICovCisgIEZJWFBfREJMCisgIERlbHRhSDEycltOT19JSURfR1JPVVBTXTsgLyohPCBjb2VmZmljaWVudHMgb2YgdGhlIHN1Yi1zdWJiYW5kIGdyb3VwcyAqLworICBGSVhQX0RCTAorICBEZWx0YUgyMXJbTk9fSUlEX0dST1VQU107IC8qITwgY29lZmZpY2llbnRzIG9mIHRoZSBzdWItc3ViYmFuZCBncm91cHMgKi8KKyAgRklYUF9EQkwKKyAgRGVsdGFIMjJyW05PX0lJRF9HUk9VUFNdOyAvKiE8IGNvZWZmaWNpZW50cyBvZiB0aGUgc3ViLXN1YmJhbmQgZ3JvdXBzICovCiAKLSAgI2RlZmluZSBOT19JSURfU1RFUFMgICAgICAgICAgICAgICAgICAgICggNyApICAvKiAxIC4uICsgNyAqLwotICAjZGVmaW5lIE5PX0lJRF9TVEVQU19GSU5FICAgICAgICAgICAgICAgKCAxNSApIC8qIDEgLi4gKzE1ICovCi0gICNkZWZpbmUgTk9fSUNDX1NURVBTICAgICAgICAgICAgICAgICAgICAoIDggKSAgLyogMCAuLiArIDcgKi8KKyAgU0NIQVIKKyAgYWFJaWRJbmRleE1hcHBlZFtNQVhfTk9fUFNfRU5WXQorICAgICAgICAgICAgICAgICAgW05PX0hJX1JFU19JSURfQklOU107IC8qITwgVGhlIG1hcHBlZCBJSUQgaW5kZXggZm9yIGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlcyBhbmQgYWxsIElJRCBiaW5zICovCisgIFNDSEFSCisgIGFhSWNjSW5kZXhNYXBwZWRbTUFYX05PX1BTX0VOVl0KKyAgICAgICAgICAgICAgICAgIFtOT19ISV9SRVNfSUNDX0JJTlNdOyAvKiE8IFRoZSBtYXBwZWQgSUNDIGluZGV4IGZvciBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZXMgYW5kIGFsbCBJQ0MgYmlucyAqLworfTsKIAotICAjZGVmaW5lIE5PX0lJRF9MRVZFTFMgICAgICAgICAgICAgICAgICAgKCAyICogTk9fSUlEX1NURVBTICsgMSApICAgICAgLyogLSA3IC4uICArIDcgKi8KLSAgI2RlZmluZSBOT19JSURfTEVWRUxTX0ZJTkUgICAgICAgICAgICAgICggMiAqIE5PX0lJRF9TVEVQU19GSU5FICsgMSApIC8qIC0xNSAuLiAgKzE1ICovCi0gICNkZWZpbmUgTk9fSUNDX0xFVkVMUyAgICAgICAgICAgICAgICAgICAoIE5PX0lDQ19TVEVQUyApICAgICAgICAgICAgICAvKiAgIDAgLi4gICsgNyAqLwotCi0gICNkZWZpbmUgRklYUF9TUVJUMDUgICAgICAgICAgICAgICAgICAgICAoKEZJWFBfREJMKTB4NWE4Mjc5ODApIC8qIDEvU1FSVDIgKi8KLQotICBzdHJ1Y3QgUFNfREVDX0NPRUZGSUNJRU5UUyB7Ci0KLSAgICBGSVhQX0RCTCBIMTFyW05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBjb2VmZmljaWVudHMgb2YgdGhlIHN1Yi1zdWJiYW5kIGdyb3VwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZJWFBfREJMIEgxMnJbTk9fSUlEX0dST1VQU107ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGNvZWZmaWNpZW50cyBvZiB0aGUgc3ViLXN1YmJhbmQgZ3JvdXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRklYUF9EQkwgSDIxcltOT19JSURfR1JPVVBTXTsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgY29lZmZpY2llbnRzIG9mIHRoZSBzdWItc3ViYmFuZCBncm91cHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGSVhQX0RCTCBIMjJyW05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBjb2VmZmljaWVudHMgb2YgdGhlIHN1Yi1zdWJiYW5kIGdyb3VwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgRklYUF9EQkwgRGVsdGFIMTFyW05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgIC8qITwgY29lZmZpY2llbnRzIG9mIHRoZSBzdWItc3ViYmFuZCBncm91cHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGSVhQX0RCTCBEZWx0YUgxMnJbTk9fSUlEX0dST1VQU107ICAgICAgICAgICAgICAgICAgLyohPCBjb2VmZmljaWVudHMgb2YgdGhlIHN1Yi1zdWJiYW5kIGdyb3VwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZJWFBfREJMIERlbHRhSDIxcltOT19JSURfR1JPVVBTXTsgICAgICAgICAgICAgICAgICAvKiE8IGNvZWZmaWNpZW50cyBvZiB0aGUgc3ViLXN1YmJhbmQgZ3JvdXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRklYUF9EQkwgRGVsdGFIMjJyW05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgIC8qITwgY29lZmZpY2llbnRzIG9mIHRoZSBzdWItc3ViYmFuZCBncm91cHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIFNDSEFSIGFhSWlkSW5kZXhNYXBwZWRbTUFYX05PX1BTX0VOVl1bTk9fSElfUkVTX0lJRF9CSU5TXTsgICAgICAgLyohPCBUaGUgbWFwcGVkIElJRCBpbmRleCBmb3IgYWxsIGVudmVsb3BlcyBhbmQgYWxsIElJRCBiaW5zICovCi0gICAgU0NIQVIgYWFJY2NJbmRleE1hcHBlZFtNQVhfTk9fUFNfRU5WXVtOT19ISV9SRVNfSUNDX0JJTlNdOyAgICAgICAvKiE8IFRoZSBtYXBwZWQgSUNDIGluZGV4IGZvciBhbGwgZW52ZWxvcGVzIGFuZCBhbGwgSUNDIGJpbnMgKi8KLQotICB9OwotCi0KLQotCi10eXBlZGVmIGVudW0gewotICBwcHRfbm9uZSA9IDAsCi0gIHBwdF9tcGVnID0gMSwKLSAgcHB0X2RybSAgPSAyCi19IFBTX1BBWUxPQURfVFlQRTsKLQordHlwZWRlZiBlbnVtIHsgcHB0X25vbmUgPSAwLCBwcHRfbXBlZyA9IDEsIHBwdF9kcm0gPSAyIH0gUFNfUEFZTE9BRF9UWVBFOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIFVDSEFSIGJQc0hlYWRlclZhbGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBzZXQgaWYgbmV3IGhlYWRlciBpcyBhdmFpbGFibGUgZnJvbSBiaXRzdHJlYW0gICAgICAgICAgICAgICAgICovCisgIFVDSEFSIGJQc0hlYWRlclZhbGlkOyAvKiE8IHNldCBpZiBuZXcgaGVhZGVyIGlzIGF2YWlsYWJsZSBmcm9tIGJpdHN0cmVhbSAqLwogCi0gIFVDSEFSIGJFbmFibGVJaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPbmUgYml0IGRlbm90aW5nIHRoZSBwcmVzZW5jZSBvZiBJSUQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICovCi0gIFVDSEFSIGJFbmFibGVJY2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPbmUgYml0IGRlbm90aW5nIHRoZSBwcmVzZW5jZSBvZiBJQ0MgcGFyYW1ldGVycyAgICAgICAgICAgICAgICovCi0gIFVDSEFSIGJFbmFibGVFeHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgUFMgZXh0ZW5zaW9uIGxheWVyIGlzIGVuYWJsZWQgdXNpbmcgdGhlIGVuYWJsZV9leHQgYml0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgaXQgaXMgc2V0IHRvICUxIHRoZSBJUEQgYW5kIE9QRCBwYXJhbWV0ZXJzIGFyZSBzZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgaXQgaXMgZGlzYWJsZWQsIGkuZS4gJTAsIHRoZSBleHRlbnNpb24gbGF5ZXIgaXMgc2tpcHBlZC4gICAqLworICBVQ0hBUiBiRW5hYmxlSWlkOyAvKiE8IE9uZSBiaXQgZGVub3RpbmcgdGhlIHByZXNlbmNlIG9mIElJRCBwYXJhbWV0ZXJzICovCisgIFVDSEFSIGJFbmFibGVJY2M7IC8qITwgT25lIGJpdCBkZW5vdGluZyB0aGUgcHJlc2VuY2Ugb2YgSUNDIHBhcmFtZXRlcnMgKi8KKyAgVUNIQVIgYkVuYWJsZUV4dDsgLyohPCBUaGUgUFMgZXh0ZW5zaW9uIGxheWVyIGlzIGVuYWJsZWQgdXNpbmcgdGhlIGVuYWJsZV9leHQKKyAgICAgICAgICAgICAgICAgICAgICAgYml0LiBJZiBpdCBpcyBzZXQgdG8gJTEgdGhlIElQRCBhbmQgT1BEIHBhcmFtZXRlcnMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgIHNlbnQuIElmIGl0IGlzIGRpc2FibGVkLCBpLmUuICUwLCB0aGUgZXh0ZW5zaW9uIGxheWVyIGlzCisgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWQuICAgKi8KIAotICBVQ0hBUiBtb2RlSWlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIGNvbmZpZ3VyYXRpb24gb2YgSUlEIHBhcmFtZXRlcnMgKG51bWJlciBvZiBiYW5kcyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXNhdGlvbiBncmlkLCBpaWRfcXVhbnQpIGlzIGRldGVybWluZWQgYnkgaWlkX21vZGUuICAgICAgKi8KLSAgVUNIQVIgbW9kZUljYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBjb25maWd1cmF0aW9uIG9mIEludGVyLWNoYW5uZWwgQ29oZXJlbmNlIHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudW1iZXIgb2YgYmFuZHMgYW5kIHF1YW50aXNhdGlvbiBncmlkKSBpcyBkZXRlcm1pbmVkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2NfbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFVDSEFSCisgIG1vZGVJaWQ7ICAgICAgIC8qITwgVGhlIGNvbmZpZ3VyYXRpb24gb2YgSUlEIHBhcmFtZXRlcnMgKG51bWJlciBvZiBiYW5kcyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICBxdWFudGlzYXRpb24gZ3JpZCwgaWlkX3F1YW50KSBpcyBkZXRlcm1pbmVkIGJ5IGlpZF9tb2RlLiAgICovCisgIFVDSEFSIG1vZGVJY2M7IC8qITwgVGhlIGNvbmZpZ3VyYXRpb24gb2YgSW50ZXItY2hhbm5lbCBDb2hlcmVuY2UgcGFyYW1ldGVycworICAgICAgICAgICAgICAgICAgICAgIChudW1iZXIgb2YgYmFuZHMgYW5kIHF1YW50aXNhdGlvbiBncmlkKSBpcyBkZXRlcm1pbmVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgaWNjX21vZGUuICovCiAKLSAgVUNIQVIgZnJlcVJlc0lpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDA9bG93LCAxPW1pZCBvciAyPWhpZ2ggZnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIGlpZCAgICAgICAgICAgKi8KLSAgVUNIQVIgZnJlcVJlc0ljYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDA9bG93LCAxPW1pZCBvciAyPWhpZ2ggZnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIGljYyAgICAgICAgICAgKi8KKyAgVUNIQVIgZnJlcVJlc0lpZDsgLyohPCAwPWxvdywgMT1taWQgb3IgMj1oaWdoIGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBpaWQgKi8KKyAgVUNIQVIgZnJlcVJlc0ljYzsgLyohPCAwPWxvdywgMT1taWQgb3IgMj1oaWdoIGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBpY2MgKi8KIAotICBVQ0hBUiBiRmluZUlpZFE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVXNlIGZpbmUgSWlkIHF1YW50aXNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBVQ0hBUiBiRmluZUlpZFE7IC8qITwgVXNlIGZpbmUgSWlkIHF1YW50aXNhdGlvbi4gKi8KIAotICBVQ0hBUiBiRnJhbWVDbGFzczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIGZyYW1lX2NsYXNzIGJpdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25zIG9mIHRoZSBjdXJyZW50IGZyYW1lIGFyZSB1bmlmb3JtbHkgc3BhY2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nyb3NzIHRoZSBmcmFtZSBvciB0aGV5IGFyZSBkZWZpbmVkIHVzaW5nIHRoZSBwb3NpdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlZCBieSBib3JkZXJfcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgVUNIQVIgYkZyYW1lQ2xhc3M7IC8qITwgVGhlIGZyYW1lX2NsYXNzIGJpdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbnMgb2YgdGhlIGN1cnJlbnQgZnJhbWUgYXJlIHVuaWZvcm1seSBzcGFjZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjcm9zcyB0aGUgZnJhbWUgb3IgdGhleSBhcmUgZGVmaW5lZCB1c2luZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9ucyBkZXNjcmliZWQgYnkgYm9yZGVyX3Bvc2l0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICovCiAKLSAgVUNIQVIgbm9FbnY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBudW1iZXIgb2YgZW52ZWxvcGVzIHBlciBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgVUNIQVIgYUVudlN0YXJ0U3RvcFtNQVhfTk9fUFNfRU5WKzFdOyAgICAgICAgICAgICAgICAgICAgICAvKiE8IEluIGNhc2Ugb2YgdmFyaWFibGUgcGFyYW1ldGVyIHNwYWNpbmcgdGhlIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25zIGFyZSBkZXRlcm1pbmVkIGJ5IGJvcmRlcl9wb3NpdGlvbiAgICAgICAgICAgICAgICAgICAqLworICBVQ0hBUiBub0VudjsgLyohPCBUaGUgbnVtYmVyIG9mIGVudmVsb3BlcyBwZXIgZnJhbWUgKi8KKyAgVUNIQVIgYUVudlN0YXJ0U3RvcFtNQVhfTk9fUFNfRU5WICsgMV07IC8qITwgSW4gY2FzZSBvZiB2YXJpYWJsZSBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmcgdGhlIHBhcmFtZXRlciBwb3NpdGlvbnMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmVkIGJ5IGJvcmRlcl9wb3NpdGlvbiAqLwogCi0gIFNDSEFSIGFiSWlkRHRGbGFnW01BWF9OT19QU19FTlZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEZWx0YWNvZGluZyB0aW1lL2ZyZXEgZmxhZyBmb3IgSUlELCAwID0+IGZyZXEgICAgICAgICAgICovCi0gIFNDSEFSIGFiSWNjRHRGbGFnW01BWF9OT19QU19FTlZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEZWx0YWNvZGluZyB0aW1lL2ZyZXEgZmxhZyBmb3IgSUNDLCAwID0+IGZyZXEgICAgICAgICAgICovCisgIFNDSEFSIGFiSWlkRHRGbGFnW01BWF9OT19QU19FTlZdOyAvKiE8IERlbHRhY29kaW5nIHRpbWUvZnJlcSBmbGFnIGZvciBJSUQsIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IGZyZXEgICAgICAgICAgICovCisgIFNDSEFSIGFiSWNjRHRGbGFnW01BWF9OT19QU19FTlZdOyAvKiE8IERlbHRhY29kaW5nIHRpbWUvZnJlcSBmbGFnIGZvciBJQ0MsIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IGZyZXEgICAgICAgICAgICovCiAKLSAgU0NIQVIgYWFJaWRJbmRleFtNQVhfTk9fUFNfRU5WXVtOT19ISV9SRVNfSUlEX0JJTlNdOyAgICAgICAgICAgICAvKiE8IFRoZSBJSUQgaW5kZXggZm9yIGFsbCBlbnZlbG9wZXMgYW5kIGFsbCBJSUQgYmlucyAgICAgICAgKi8KLSAgU0NIQVIgYWFJY2NJbmRleFtNQVhfTk9fUFNfRU5WXVtOT19ISV9SRVNfSUNDX0JJTlNdOyAgICAgICAgICAgICAvKiE8IFRoZSBJQ0MgaW5kZXggZm9yIGFsbCBlbnZlbG9wZXMgYW5kIGFsbCBJQ0MgYmlucyAgICAgICAgKi8KKyAgU0NIQVIKKyAgYWFJaWRJbmRleFtNQVhfTk9fUFNfRU5WXQorICAgICAgICAgICAgW05PX0hJX1JFU19JSURfQklOU107IC8qITwgVGhlIElJRCBpbmRleCBmb3IgYWxsIGVudmVsb3BlcyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgSUlEIGJpbnMgICAgICAgICovCisgIFNDSEFSCisgIGFhSWNjSW5kZXhbTUFYX05PX1BTX0VOVl0KKyAgICAgICAgICAgIFtOT19ISV9SRVNfSUNDX0JJTlNdOyAvKiE8IFRoZSBJQ0MgaW5kZXggZm9yIGFsbCBlbnZlbG9wZXMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIElDQyBiaW5zICAgICAgICAqLwogCiB9IE1QRUdfUFNfQlNfREFUQTsKIAotCi0KIHN0cnVjdCBQU19ERUMgewotCiAgIFNDSEFSIG5vU3ViU2FtcGxlczsKICAgU0NIQVIgbm9DaGFubmVsczsKIAotICBTQ0hBUiBwcm9jRnJhbWVCYXNlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSGVscGVyIHRvIGRldGVjdGVkIHN3aXRjaGluZyBmcm9tIGZyYW1lIGJhc2VkIHRvIHNsb3QgYmFzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU0NIQVIgcHJvY0ZyYW1lQmFzZWQ7IC8qITwgSGVscGVyIHRvIGRldGVjdGVkIHN3aXRjaGluZyBmcm9tIGZyYW1lIGJhc2VkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90IGJhc2VkIHByb2Nlc3NpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCi0gIFBTX1BBWUxPQURfVFlQRSBiUHNEYXRhQXZhaWxbKDEpKzFdOyAgIC8qITwgc2V0IGlmIG5ldyBkYXRhIGF2YWlsYWJsZSBmcm9tIGJpdHN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAqLwotICBVQ0hBUiBwc0RlY29kZWRQcnY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgc2V0IGlmIFBTIGhhcyBiZWVuIHByb2Nlc3NlZCBpbiB0aGUgbGFzdCBmcmFtZSAgICAgICAgICAgICAgICAqLworICBQU19QQVlMT0FEX1RZUEUKKyAgYlBzRGF0YUF2YWlsWygxKSArIDFdOyAvKiE8IHNldCBpZiBuZXcgZGF0YSBhdmFpbGFibGUgZnJvbSBiaXRzdHJlYW0gKi8KKyAgVUNIQVIgcHNEZWNvZGVkUHJ2OyAgICAvKiE8IHNldCBpZiBQUyBoYXMgYmVlbiBwcm9jZXNzZWQgaW4gdGhlIGxhc3QgZnJhbWUgKi8KIAogICAvKiBoZWxwZXJzIGZvciBmcmFtZSBkZWxheSBsaW5lICovCi0gIFVDSEFSIGJzTGFzdFNsb3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbmRleCBvZiBsYXN0IHJlYWQgc2xvdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFVDSEFSIGJzUmVhZFNsb3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbmRleCBvZiBjdXJyZW50IHJlYWQgc2xvdCBmb3IgYWRkaXRpb25hbCBkZWxheS4gICAgICAgICAgICAgICovCi0gIFVDSEFSIHByb2Nlc3NTbG90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbmRleCBvZiBjdXJyZW50IHNsb3QgZm9yIHByb2Nlc3NpbmcgKG5lZWQgZm9yIGFkZC4gZGVsYXkpLiAgICovCisgIFVDSEFSIGJzTGFzdFNsb3Q7ICAvKiE8IEluZGV4IG9mIGxhc3QgcmVhZCBzbG90LiAgKi8KKyAgVUNIQVIgYnNSZWFkU2xvdDsgIC8qITwgSW5kZXggb2YgY3VycmVudCByZWFkIHNsb3QgZm9yIGFkZGl0aW9uYWwgZGVsYXkuICAqLworICBVQ0hBUiBwcm9jZXNzU2xvdDsgLyohPCBJbmRleCBvZiBjdXJyZW50IHNsb3QgZm9yIHByb2Nlc3NpbmcgKG5lZWQgZm9yIGFkZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5KS4gICAqLwogCisgIHVuaW9uIHsgLyogQml0c3RyZWFtIGRhdGEgKi8KKyAgICBNUEVHX1BTX0JTX0RBVEEKKyAgICBtcGVnOyAvKiE8IFN0cnVjdCBjb250YWluaW5nIGFsbCBNUEVHIHNwZWNpZmljIFBTIGRhdGEgZnJvbSBiaXRzdHJlYW0uCisgICAgICAgICAgICovCisgIH0gYnNEYXRhWygxKSArIDFdOwogCi0gIElOVCAgcmVzY2FsOwotICBJTlQgIHNmX0ludEJ1ZmZlcjsKLQotICB1bmlvbiB7ICAvKiBCaXRzdHJlYW0gZGF0YSAqLwotICAgIE1QRUdfUFNfQlNfREFUQSAgbXBlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3RydWN0IGNvbnRhaW5pbmcgYWxsIE1QRUcgc3BlY2lmaWMgUFMgZGF0YSBmcm9tIGJpdHN0cmVhbS4gICAqLwotICB9IGJzRGF0YVsoMSkrMV07Ci0KLSAgc2hvdWxkQmVVbmlvbiB7ICAvKiBTdGF0aWMgZGF0YSAqLworICBzaG91bGRCZVVuaW9uIHsgLyogU3RhdGljIGRhdGEgKi8KICAgICBzdHJ1Y3QgewotICAgICAgU0NIQVIgYUlpZFByZXZGcmFtZUluZGV4W05PX0hJX1JFU19JSURfQklOU107ICAgICAgICAgIC8qITwgVGhlIElJRCBpbmRleCBmb3IgcHJldmlvdXMgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgU0NIQVIgYUljY1ByZXZGcmFtZUluZGV4W05PX0hJX1JFU19JQ0NfQklOU107ICAgICAgICAgIC8qITwgVGhlIElDQyBpbmRleCBmb3IgcHJldmlvdXMgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgU0NIQVIgYUlpZFByZXZGcmFtZUluZGV4W05PX0hJX1JFU19JSURfQklOU107IC8qITwgVGhlIElJRCBpbmRleCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyBmcmFtZSAqLworICAgICAgU0NIQVIgYUljY1ByZXZGcmFtZUluZGV4W05PX0hJX1JFU19JQ0NfQklOU107IC8qITwgVGhlIElDQyBpbmRleCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyBmcmFtZSAqLworICAgICAgVUNIQVIKKyAgICAgIGJQcmV2RnJhbWVGaW5lSWlkUTsgLyohPCBUaGUgSUlEIHF1YW50aXphdGlvbiBvZiB0aGUgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgIFVDSEFSIGxhc3RVc2I7IC8qITwgdXBwZXJtb3N0IFdNRiBkZWxheSBiYW5kIG9mIGxhc3QgZnJhbWUgICAgICAgICAgKi8KIAotICAgICAgVUNIQVIgZGVsYXlCdWZJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byB3aGVyZSB0aGUgbGF0ZXN0IHNhbXBsZSBpcyBpbiBidWZmZXIgICAgICAgICAqLwotICAgICAgVUNIQVIgbm9TYW1wbGVEZWxheTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSG93IG1hbnkgUU1GIHNhbXBsZXMgZGVsYXkgaXMgdXNlZC4gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgVUNIQVIgbGFzdFVzYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgdXBwZXJtb3N0IFdNRiBkZWxheSBiYW5kIG9mIGxhc3QgZnJhbWUgICAgICAgICAgICAgICAgICAqLworICAgICAgRklYUF9EQkwgcEh5YnJpZEFuYVN0YXRlc0xGZG14CisgICAgICAgICAgWzIgKiAxMyAqIE5PX1FNRl9CQU5EU19IWUJSSUQyMF07IC8qITwgTWVtb3J5IHVzZWQgaW4gaHlicmlkIGFuYWx5c2lzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZpbHRlciBzdGF0ZXMuICovCisgICAgICBGREtfQU5BX0hZQl9GSUxURVIgaHlicmlkQW5hbHlzaXM7CisgICAgICBGREtfU1lOX0hZQl9GSUxURVIgaHlicmlkU3ludGhlc2lzWzJdOwogCi0gICAgICBVQ0hBUiBhRGVsYXlSQnVmSW5kZXhTZXJbTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdOyAgICAgICAgICAgICAvKiE8IERlbGF5IGJ1ZmZlciBmb3IgcmV2ZXJiIGZpbHRlciAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBVQ0hBUiBhRGVsYXlCdWZJbmRleERlbGF5UW1mW05PX1FNRl9DSEFOTkVMUy1GSVJTVF9ERUxBWV9TQl07ICAvKiE8IERlbGF5IGJ1ZmZlciBmb3IgSUNDIGdyb3VwIDIwICYgMjEgICAgICAgICAgICAgICAgICAgICovCisgICAgICBERUNPUlJfREVDIGFwRGVjb3I7IC8qITwgRGVjb3JyZWxhdG9yIGluc3RhbmNlLiAqLworICAgICAgRklYUF9EQkwgZGVjb3JyQnVmZmVyQ3BseFsoMiAqICgoODI1KSArICgzNzMpKSldOwogCi0gICAgICBTQ0hBUiBzY2FsZUZhY3RvclBzRGVsYXlCdWZmZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNjYWxlIGZhY3RvciBmb3IgcHMgZGVsYXkgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBGSVhQX0RCTCBoMTFyUHJldltOT19JSURfR1JPVVBTXTsgLyohPCBwcmV2aW91cyBjYWxjdWxhdGVkIGgoeHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZpY2llbnRzICovCisgICAgICBGSVhQX0RCTCBoMTJyUHJldltOT19JSURfR1JPVVBTXTsgLyohPCBwcmV2aW91cyBjYWxjdWxhdGVkIGgoeHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZpY2llbnRzICovCisgICAgICBGSVhQX0RCTCBoMjFyUHJldltOT19JSURfR1JPVVBTXTsgLyohPCBwcmV2aW91cyBjYWxjdWxhdGVkIGgoeHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZpY2llbnRzICovCisgICAgICBGSVhQX0RCTCBoMjJyUHJldltOT19JSURfR1JPVVBTXTsgLyohPCBwcmV2aW91cyBjYWxjdWxhdGVkIGgoeHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZpY2llbnRzICovCiAKLSAgICAgIC8qIGh5YnJpZCBmaWx0ZXIgYmFuayBkZWxheSBsaW5lcyAqLwotICAgICAgRklYUF9EQkwgYWFRbWZEZWxheUJ1ZlJlYWxbKE5PX1FNRl9DSEFOTkVMUy1GSVJTVF9ERUxBWV9TQikgKyAoTUFYX0RFTEFZX0JVRkZFUl9TSVpFLTEpKihOT19ERUxBWV9CVUZGRVJfQkFORFMtRklSU1RfREVMQVlfU0IpXTsKLSAgICAgIEZJWFBfREJMIGFhUW1mRGVsYXlCdWZJbWFnWyhOT19RTUZfQ0hBTk5FTFMtRklSU1RfREVMQVlfU0IpICsgKE1BWF9ERUxBWV9CVUZGRVJfU0laRS0xKSooTk9fREVMQVlfQlVGRkVSX0JBTkRTLUZJUlNUX0RFTEFZX1NCKV07Ci0KLSAgICAgIEZJWFBfREJMICpwQWFSZWFsRGVsYXlCdWZmZXJRbWZbTUFYX0RFTEFZX0JVRkZFUl9TSVpFXTsgICAgICAgICAgLyohPCBSZWFsIHBhcnQgZGVsYXkgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBGSVhQX0RCTCAqcEFhSW1hZ0RlbGF5QnVmZmVyUW1mW01BWF9ERUxBWV9CVUZGRVJfU0laRV07ICAgICAgICAgIC8qITwgSW1hZ2luYXJ5IHBhcnQgZGVsYXkgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBGSVhQX0RCTCBhYVJlYWxEZWxheUJ1ZmZlclFtZltOT19TQU1QTEVfREVMQVlfQUxMUEFTU11bRklSU1RfREVMQVlfU0JdOyAvKiE8IFJlYWwgcGFydCBkZWxheSBidWZmZXIgICAgICovCi0gICAgICBGSVhQX0RCTCBhYUltYWdEZWxheUJ1ZmZlclFtZltOT19TQU1QTEVfREVMQVlfQUxMUEFTU11bRklSU1RfREVMQVlfU0JdOyAvKiE8IEltYWdpbmFyeSBwYXJ0IGRlbGF5IGJ1ZmZlciovCi0KLSAgICAgIEZJWFBfREJMIGFhUmVhbERlbGF5QnVmZmVyU3ViUW1mW05PX1NBTVBMRV9ERUxBWV9BTExQQVNTXVtOT19TVUJfUU1GX0NIQU5ORUxTXTsgICAgICAgICAgLyohPCBSZWFsIHBhcnQgZGVsYXkgYnVmZmVyICAgICAgICAgICovCi0gICAgICBGSVhQX0RCTCBhYUltYWdEZWxheUJ1ZmZlclN1YlFtZltOT19TQU1QTEVfREVMQVlfQUxMUEFTU11bTk9fU1VCX1FNRl9DSEFOTkVMU107ICAgICAgICAgIC8qITwgSW1hZ2luYXJ5IHBhcnQgZGVsYXkgYnVmZmVyICAgICAqLwotCi0gICAgICBGSVhQX0RCTCBhYWFSZWFsRGVsYXlSQnVmZmVyU2VyUW1mW0ZJUlNUX0RFTEFZX1NCXVtOT19ERUxBWV9MRU5HVEhfVkVDVE9SU107ICAgICAgICAgICAgIC8qITwgUmVhbCBwYXJ0IGRlbGF5IGJ1ZmZlciAgICAgICAgICAqLwotICAgICAgRklYUF9EQkwgYWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclFtZltGSVJTVF9ERUxBWV9TQl1bTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlNdOyAgICAgICAgICAgICAvKiE8IEltYWdpbmFyeSBwYXJ0IGRlbGF5IGJ1ZmZlciAgICAgKi8KLQotICAgICAgRklYUF9EQkwgYWFhUmVhbERlbGF5UkJ1ZmZlclNlclN1YlFtZltOT19TVUJfUU1GX0NIQU5ORUxTXVtOT19ERUxBWV9MRU5HVEhfVkVDVE9SU107ICAgICAvKiE8IFJlYWwgcGFydCBkZWxheSBidWZmZXIgICAgICAgICAgKi8KLSAgICAgIEZJWFBfREJMIGFhYUltYWdEZWxheVJCdWZmZXJTZXJTdWJRbWZbTk9fU1VCX1FNRl9DSEFOTkVMU11bTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlNdOyAgICAgLyohPCBJbWFnaW5hcnkgcGFydCBkZWxheSBidWZmZXIgICAgICovCi0KLSAgICAgIEhZQlJJRCBoeWJyaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGh5YnJpZCBmaWx0ZXIgYmFuayBzdHJ1Y3QgMSBvciAyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgRklYUF9EQkwgYVByZXZOcmdCaW5bTk9fTUlEX1JFU19CSU5TXTsgICAgICAgICAgICAgIC8qITwgZW5lcmd5IG9mIHByZXZpb3VzIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIEZJWFBfREJMIGFQcmV2UGVha0RpZmZCaW5bTk9fTUlEX1JFU19CSU5TXTsgICAgICAgICAvKiE8IHBlYWsgZGlmZmVyZW5jZSBvZiBwcmV2aW91cyBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBGSVhQX0RCTCBhUGVha0RlY2F5RmFzdEJpbltOT19NSURfUkVTX0JJTlNdOyAgICAgICAgLyohPCBTYXZlZCBtYXguIHBlYWsgZGVjYXkgdmFsdWUgcGVyIGJpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgU0NIQVIgYVBvd2VyUHJldlNjYWxbTk9fTUlEX1JFU19CSU5TXTsgICAgICAgICAgICAgIC8qITwgTGFzdCBwb3dlciB2YWx1ZSAoZWFjaCBiaW4pIG9mIHByZXZpb3VzIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgRklYUF9EQkwgaDExclByZXZbTk9fSUlEX0dST1VQU107ICAgICAgICAgICAgICAgICAgIC8qITwgcHJldmlvdXMgY2FsY3VsYXRlZCBoKHh5KSBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIEZJWFBfREJMIGgxMnJQcmV2W05PX0lJRF9HUk9VUFNdOyAgICAgICAgICAgICAgICAgICAvKiE8IHByZXZpb3VzIGNhbGN1bGF0ZWQgaCh4eSkgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBGSVhQX0RCTCBoMjFyUHJldltOT19JSURfR1JPVVBTXTsgICAgICAgICAgICAgICAgICAgLyohPCBwcmV2aW91cyBjYWxjdWxhdGVkIGgoeHkpIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgRklYUF9EQkwgaDIyclByZXZbTk9fSUlEX0dST1VQU107ICAgICAgICAgICAgICAgICAgIC8qITwgcHJldmlvdXMgY2FsY3VsYXRlZCBoKHh5KSBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgUFNfREVDX0NPRUZGSUNJRU5UUyAgY29lZjsgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCB0ZW1wb3JhbCBjb2VmZmljaWVudHMgKHJldXNhYmxlIHNjcmF0Y2ggbWVtb3J5KSAgICAgICAgICAgICAgICAgKi8KKyAgICAgIFBTX0RFQ19DT0VGRklDSUVOVFMKKyAgICAgICpwQ29lZjsgLyohPCB0ZW1wb3JhbCBjb2VmZmljaWVudHMgYXJlIG9uIHJldXNhYmxlIHNjcmF0Y2ggbWVtb3J5ICovCiAKICAgICB9IG1wZWc7Ci0KLSAgfSBzcGVjaWZpY1RvOwotCi0KKyAgfQorICBzcGVjaWZpY1RvOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgUFNfREVDICpIQU5ETEVfUFNfREVDOwogCi0KIGludCBDcmVhdGVQc0RlYyhIQU5ETEVfUFNfREVDICpoX1BTX0RFQywgaW50IGFhY1NhbXBsZXNQZXJGcmFtZSk7CiAKIGludCBEZWxldGVQc0RlYyhIQU5ETEVfUFNfREVDICpoX1BTX0RFQyk7CiAKLXZvaWQKLXNjYWxGaWx0ZXJCYW5rVmFsdWVzKCBIQU5ETEVfUFNfREVDICAgaF9wc19kLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBhcmFtZXRyaWMgc3RlcmVvIGRlY29kZXIgaGFuZGxlICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKipmaXhwUW1mUmVhbCwgICAgICAgICAgICAgICAgICAgLyogcW1mIGZpbHRlcmJhbmsgdmFsdWVzICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqKmZpeHBRbWZJbWFnLCAgICAgICAgICAgICAgICAgICAvKiBxbWYgZmlsdGVyYmFuayB2YWx1ZXMgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbHNiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNiciBzdGFydCBzdWJiYW5kICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdExvdywKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRIaWdoLAotICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICpzY2FsZUZhY3Rvckxvd0JhbmRfbGIsCi0gICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgICAgKnNjYWxlRmFjdG9yTG93QmFuZF9oYiwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2NhbGVGYWN0b3JIaWdoQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKnNjYWxlRmFjdG9ySGlnaEJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgIG5vQ29scyk7Cit2b2lkIFByZXBhcmVQc1Byb2Nlc3NpbmcoSEFORExFX1BTX0RFQyBoX3BzX2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICpjb25zdCBySW50QnVmZmVyTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgKmNvbnN0IGlJbnRCdWZmZXJMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZUZhY3Rvckxvd0JhbmQpOwogCi12b2lkCi1yZXNjYWxGaWx0ZXJCYW5rVmFsdWVzKCBIQU5ETEVfUFNfREVDICAgaF9wc19kLCAgICAgICAgICAgICAgICAgICAgICAvKiBwYXJhbWV0cmljIHN0ZXJlbyBkZWNvZGVyIGhhbmRsZSAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKipRbWZCdWZmZXJSZWFsLCAgICAgICAgICAgICAgIC8qIHFtZiBmaWx0ZXJiYW5rIHZhbHVlcyAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqKlFtZkJ1ZmZlckltYWcsICAgICAgICAgICAgICAgLyogcW1mIGZpbHRlcmJhbmsgdmFsdWVzICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbHNiLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYnIgc3RhcnQgc3ViYmFuZCAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICBub0NvbHMpOwordm9pZCBpbml0U2xvdEJhc2VkUm90YXRpb24oSEFORExFX1BTX0RFQyBoX3BzX2QsIGludCBlbnYsIGludCB1c2IpOwogCit2b2lkIEFwcGx5UHNTbG90KAorICAgIEhBTkRMRV9QU19ERUMgaF9wc19kLCAgICAgIC8qIHBhcmFtZXRyaWMgc3RlcmVvIGRlY29kZXIgaGFuZGxlICAgICovCisgICAgRklYUF9EQkwgKipySW50QnVmZmVyTGVmdCwgLyogcmVhbCB2YWx1ZXMgb2YgbGVmdCBxbWYgdGltZXNsb3QgICAgKi8KKyAgICBGSVhQX0RCTCAqKmlJbnRCdWZmZXJMZWZ0LCAvKiBpbWFnIHZhbHVlcyBvZiBsZWZ0IHFtZiB0aW1lc2xvdCAgICAqLworICAgIEZJWFBfREJMICpySW50QnVmZmVyUmlnaHQsIC8qIHJlYWwgdmFsdWVzIG9mIHJpZ2h0IHFtZiB0aW1lc2xvdCAgICovCisgICAgRklYUF9EQkwgKmlJbnRCdWZmZXJSaWdodCwgLyogaW1hZyB2YWx1ZXMgb2YgcmlnaHQgcW1mIHRpbWVzbG90ICAgKi8KKyAgICBjb25zdCBpbnQgc2NhbGVGYWN0b3JMb3dCYW5kX25vX292LCBjb25zdCBpbnQgc2NhbGVGYWN0b3JMb3dCYW5kLAorICAgIGNvbnN0IGludCBzY2FsZUZhY3RvckhpZ2hCYW5kLCBjb25zdCBpbnQgbHNiLCBjb25zdCBpbnQgdXNiKTsKIAotdm9pZAotaW5pdFNsb3RCYXNlZFJvdGF0aW9uKCBIQU5ETEVfUFNfREVDIGhfcHNfZCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzYik7Ci0KLXZvaWQKLUFwcGx5UHNTbG90KCBIQU5ETEVfUFNfREVDIGhfcHNfZCwgICAgICAgICAgICAvKiBwYXJhbWV0cmljIHN0ZXJlbyBkZWNvZGVyIGhhbmRsZSAgICAqLwotICAgICAgICAgICAgIEZJWFBfREJMICoqckludEJ1ZmZlckxlZnQsICAgICAgIC8qIHJlYWwgdmFsdWVzIG9mIGxlZnQgcW1mIHRpbWVzbG90ICAgICovCi0gICAgICAgICAgICAgRklYUF9EQkwgKippSW50QnVmZmVyTGVmdCwgICAgICAgLyogaW1hZyB2YWx1ZXMgb2YgbGVmdCBxbWYgdGltZXNsb3QgICAgKi8KLSAgICAgICAgICAgICBGSVhQX0RCTCAqckludEJ1ZmZlclJpZ2h0LCAgICAgICAvKiByZWFsIHZhbHVlcyBvZiByaWdodCBxbWYgdGltZXNsb3QgICAqLwotICAgICAgICAgICAgIEZJWFBfREJMICppSW50QnVmZmVyUmlnaHQpOyAgICAgIC8qIGltYWcgdmFsdWVzIG9mIHJpZ2h0IHFtZiB0aW1lc2xvdCAgICovCi0KLQotCi0jZW5kaWYgIC8qIF9fUFNERUNfSCAqLworI2VuZGlmIC8qIFBTREVDX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvcHNkZWNfZHJtLmNwcCBiL2xpYlNCUmRlYy9zcmMvcHNkZWNfZHJtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTcxZjUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0JSZGVjL3NyYy9wc2RlY19kcm0uY3BwCkBAIC0wLDAgKzEsMTA4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIHBhcmFtZXRyaWMgc3RlcmVvIGRlY29kZXIgZm9yIERpZ2l0YWwgcmFkaW8gbW9uZGlhbAorKi8KKworI2luY2x1ZGUgInBzZGVjX2RybS5oIgpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9wc2RlY19kcm0uaCBiL2xpYlNCUmRlYy9zcmMvcHNkZWNfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUyNTc1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNCUmRlYy9zcmMvcHNkZWNfZHJtLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyohCisgIFxmaWxlCisgIFxicmllZiBwYXJhbWV0cmljIHN0ZXJlbyBkZWNvZGVyIGZvciBkaWdpdGFsIHJhZGlvIG1vbmRpYWwKKyovCisKKyNpZm5kZWYgUFNERUNfRFJNX0gKKyNkZWZpbmUgUFNERUNfRFJNX0gKKworI2luY2x1ZGUgInNicmRlY29kZXIuaCIKKworI2VuZGlmIC8qIFBTREVDX0RSTV9IICovCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3BzZGVjX2h5YnJpZC5jcHAgYi9saWJTQlJkZWMvc3JjL3BzZGVjX2h5YnJpZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZDBlOTIuLjAwMDAwMDAKLS0tIGEvbGliU0JSZGVjL3NyYy9wc2RlY19oeWJyaWQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjUyICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaW5jbHVkZSAicHNkZWNfaHlicmlkLmgiCi0KLQotI2luY2x1ZGUgImZmdC5oIgotI2luY2x1ZGUgInNicl9yYW0uaCIKLQotI2luY2x1ZGUgIkZES190b29sc19yb20uaCIKLSNpbmNsdWRlICJzYnJfcm9tLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gRnVuY3Rpb25uYW1lOiAgSW5pdEh5YnJpZEZpbHRlckJhbmsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBEZXNjcmlwdGlvbjogICBJbml0IG9uZSBpbnN0YW5jZSBvZiBIQU5ETEVfSFlCUklEIHN0dWN0Ci0KLSBBcmd1bWVudHM6Ci0KLSBSZXR1cm46ICAgICAgICBub25lCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotU0JSX0VSUk9SCi1Jbml0SHlicmlkRmlsdGVyQmFuayAoIEhBTkRMRV9IWUJSSUQgaHMsICAgICAgICAgIC8qITwgSGFuZGxlIHRvIEhZQlJJRCBzdHJ1Y3QuICovCi0gICAgICAgICAgICAgICAgICAgICAgIFNDSEFSIGZyYW1lU2l6ZSwgICAgICAgICAgIC8qITwgRnJhbWVzaXplIChpbiBRbWYgc/piYmFuZCBzYW1wbGVzKS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgbm9CYW5kcywgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgUW1mIGJhbmRzIGZvciBoeWJyaWQgZmlsdGVyaW5nLiAqLwotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqcFJlc29sdXRpb24gKSAvKiE8IFJlc29sdXRpb24gaW4gUW1mIGJhbmRzIChsZW5ndGggbm9CYW5kcykuICovCi17Ci0gIFNDSEFSIGk7Ci0gIFVDSEFSIG1heE5vQ2hhbm5lbHMgPSAwOwotCi0gIGZvciAoaSA9IDA7IGkgPCBub0JhbmRzOyBpKyspIHsKLSAgICBocy0+cFJlc29sdXRpb25baV0gPSBwUmVzb2x1dGlvbltpXTsKLSAgICBpZihwUmVzb2x1dGlvbltpXSA+IG1heE5vQ2hhbm5lbHMpCi0gICAgICBtYXhOb0NoYW5uZWxzID0gcFJlc29sdXRpb25baV07Ci0gIH0KLQotICBocy0+blFtZkJhbmRzICAgICA9IG5vQmFuZHM7Ci0gIGhzLT5mcmFtZVNpemUgICAgID0gZnJhbWVTaXplOwotICBocy0+cW1mQnVmZmVyTW92ZSA9IEhZQlJJRF9GSUxURVJfTEVOR1RIIC0gMTsKLQotICBocy0+c2ZfbVFtZkJ1ZmZlciA9IDA7Ci0KLSAgcmV0dXJuIFNCUkRFQ19PSzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBGdW5jdGlvbm5hbWU6ICBkdWFsQ2hhbm5lbEZpbHRlcmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIERlc2NyaXB0aW9uOiAgIGZhc3QgMi1jaGFubmVsIHJlYWwtdmFsdWVkIGZpbHRlcmluZyB3aXRoIDYtdGFwIGRlbGF5LgotCi0gQXJndW1lbnRzOgotCi0gUmV0dXJuOiAgICAgICAgbm9uZQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiEKLTIgY2hhbm5lbCBmaWx0ZXIKLTxwcmU+Ci0gICBGaWx0ZXIgQ29lZnM6Ci0gICAwLjAsCi0gICAwLjAxODk5NDg3NTI2MDQ5LAotICAgMC4wLAotICAgLTAuMDcyOTMxMzkxNjc1MzgsCi0gICAwLjAsCi0gICAwLjMwNTk2NjMwNTQ1MTY4LAotICAgMC41LAotICAgMC4zMDU5NjYzMDU0NTE2OCwKLSAgIDAuMCwKLSAgIC0wLjA3MjkzMTM5MTY3NTM4LAotICAgMC4wLAotICAgMC4wMTg5OTQ4NzUyNjA0OSwKLSAgIDAuMAotCi0KLSAgIEZpbHRlciBkZXNpZ246Ci0gICBoW3Esbl0gPSBnW25dICogY29zKDJwaS8yICogcSAqIChuLTYpICk7ICBuID0gMC4uMTIsICBxID0gMCwxOwotCi0gICAtPiAgaFswLG5dID0gZ1tuXSAqIDE7Ci0gICAtPiAgaFsxLG5dID0gZ1tuXSAqIHBvdygtMSxuKTsKLTwvcHJlPgotKi8KLQotc3RhdGljIHZvaWQgc2xvdEJhc2VkRHVhbENoYW5uZWxGaWx0ZXJpbmcoIGNvbnN0IEZJWFBfREJMICpwUW1mUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqcFFtZkltYWcsCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAgICAqbUh5YnJpZFJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgKm1IeWJyaWRJbWFnKQotewotCi0gIEZJWFBfREJMICB0MSwgdDMsIHQ1LCB0NjsKLQotICAvKiBzeW1tZXRyaWMgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotCi0gIC8qICB5b3UgZG9uJ3QgaGF2ZSB0byBzaGlmdCB0aGUgcmVzdWx0IGFmdGVyIGZNdWx0IGJlY2F1c2Ugb2YgcDJfMTNfMjAgPD0gMC41ICovCi0gIHQxID0gZk11bHREaXYyKHAyXzEzXzIwWzFdICwgKCAocFFtZlJlYWxbMV0gPj4gMSkgKyAocFFtZlJlYWxbMTFdID4+IDEpKSk7Ci0gIHQzID0gZk11bHREaXYyKHAyXzEzXzIwWzNdICwgKCAocFFtZlJlYWxbM10gPj4gMSkgKyAocFFtZlJlYWxbIDldID4+IDEpKSk7Ci0gIHQ1ID0gZk11bHREaXYyKHAyXzEzXzIwWzVdICwgKCAocFFtZlJlYWxbNV0gPj4gMSkgKyAocFFtZlJlYWxbIDddID4+IDEpKSk7Ci0gIHQ2ID0gZk11bHREaXYyKHAyXzEzXzIwWzZdICwgICAocFFtZlJlYWxbNl0gPj4gMSkgKTsKLQotICBtSHlicmlkUmVhbFswXSA9ICh0MSArIHQzICsgdDUgKyB0NikgPDwgMjsKLSAgbUh5YnJpZFJlYWxbMV0gPSAoLSB0MSAtIHQzIC0gdDUgKyB0NikgPDwgMjsKLQotICB0MSA9IGZNdWx0RGl2MihwMl8xM18yMFsxXSAsICggKHBRbWZJbWFnWzFdID4+IDEpICsgKHBRbWZJbWFnWzExXSA+PiAxKSkpOwotICB0MyA9IGZNdWx0RGl2MihwMl8xM18yMFszXSAsICggKHBRbWZJbWFnWzNdID4+IDEpICsgKHBRbWZJbWFnWyA5XSA+PiAxKSkpOwotICB0NSA9IGZNdWx0RGl2MihwMl8xM18yMFs1XSAsICggKHBRbWZJbWFnWzVdID4+IDEpICsgKHBRbWZJbWFnWyA3XSA+PiAxKSkpOwotICB0NiA9IGZNdWx0RGl2MihwMl8xM18yMFs2XSAsICAgIHBRbWZJbWFnWzZdID4+IDEgKTsKLQotICBtSHlicmlkSW1hZ1swXSA9ICh0MSArIHQzICsgdDUgKyB0NikgPDwgMjsKLSAgbUh5YnJpZEltYWdbMV0gPSAoLSB0MSAtIHQzIC0gdDUgKyB0NikgPDwgMjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEZ1bmN0aW9ubmFtZTogIGVpZ2h0Q2hhbm5lbEZpbHRlcmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIERlc2NyaXB0aW9uOiAgIGZhc3QgOC1jaGFubmVsIGNvbXBsZXgtdmFsdWVkIGZpbHRlcmluZyB3aXRoIDYtdGFwIGRlbGF5LgotCi0gQXJndW1lbnRzOgotCi0gUmV0dXJuOiAgICAgICAgbm9uZQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyohCi0gICA4IGNoYW5uZWwgZmlsdGVyCi0KLSAgIEltcGxlbWVudGF0aW9uIHVzaW5nIGEgRkZUIG9mIGxlbmd0aCA4Ci08cHJlPgotICAgcHJvdG90eXBlIGZpbHRlciBjb2VmZmljaWVudHM6Ci0gICAwLjAwNzQ2MDgyOTQ5ODEyICAgMC4wMjI3MDQyMDk0OTgyNSAgIDAuMDQ1NDY4NjU5MzA0NzMgICAwLjA3MjY2MTEzOTI5NTkxICAgMC4wOTg4NTEwODU3NTI2NCAgIDAuMTE3OTM3MTA1NjcyMTcKLSAgIDAuMTI1Ci0gICAwLjExNzkzNzEwNTY3MjE3ICAgMC4wOTg4NTEwODU3NTI2NCAgIDAuMDcyNjYxMTM5Mjk1OTEgICAwLjA0NTQ2ODY1OTMwNDczICAgMC4wMjI3MDQyMDk0OTgyNSAgIDAuMDA3NDYwODI5NDk4MTIKLQotICAgRmlsdGVyIGRlc2lnbjoKLSAgIE4gPSAxMzsgUSA9IDg7Ci0gICBoW3Esbl0gICAgICAgPSBnW25dICogZXhwKGogKiAyICogcGkgLyBRICogKHEgKyAuNSkgKiAobiAtIDYpKTsgIG4gPSAwLi4oTi0xKSwgIHEgPSAwLi4oUS0xKTsKLQotICAgVGltZSBTaWduYWw6ICAgeFt0XTsKLSAgIEZpbHRlciBCYW5rIE91dHB1dAotICAgeVtxLHRdID0gY29udih4W3RdLGhbcSx0XSkgPSBjb252KGhbcSx0XSx4W3RdKSA9IHN1bSh4W2tdICogaFtxLCB0IC0ga10gKSA9IHN1bShoW3EsIGtdICogeFt0IC0ga10gKTsgayA9IDAuLihOLTEpOwotCi0gICB5W3EsdF0gPSAgIHhbdCAtIDEyXSpoW3EsIDEyXSAgKyAgeFt0IC0gMTFdKmhbcSwgMTFdICArICB4W3QgLSAxMF0qaFtxLCAxMF0gICsgIHhbdCAtICA5XSpoW3EsICA5XQotICAgICAgICAgICArICB4W3QgLSAgOF0qaFtxLCAgOF0gICsgIHhbdCAtICA3XSpoW3EsICA3XQotICAgICAgICAgICArICB4W3QgLSAgNl0qaFtxLCAgNl0KLSAgICAgICAgICAgKyAgeFt0IC0gIDVdKmhbcSwgIDVdICArICB4W3QgLSAgNF0qaFtxLCAgNF0KLSAgICAgICAgICAgKyAgeFt0IC0gIDNdKmhbcSwgIDNdICArICB4W3QgLSAgMl0qaFtxLCAgMl0gICsgIHhbdCAtICAxXSpoW3EsICAxXSAgKyAgeFt0IC0gIDBdKmhbcSwgIDBdOwotCi0gICBoJ1txLCBuXSA9IGhbcSwoTi0xKS1uXSA9IGdbbl0gKiBleHAoaiAqIDIgKiBwaSAvIFEgKiAocSArIC41KSAqICg2IC0gbikpOyAgbiA9IDAuLihOLTEpLCAgcSA9IDAuLihRLTEpOwotCi0gICB5W3EsdF0gPSAgIHhbdCAtIDEyXSpoJ1txLCAgMF0gICsgIHhbdCAtIDExXSpoJ1txLCAgMV0gICsgIHhbdCAtIDEwXSpoJ1txLCAgMl0gICsgIHhbdCAtICA5XSpoJ1txLCAgM10KLSAgICAgICAgICAgKyAgeFt0IC0gIDhdKmgnW3EsICA0XSAgKyAgeFt0IC0gIDddKmgnW3EsICA1XQotICAgICAgICAgICArICB4W3QgLSAgNl0qaCdbcSwgIDZdCi0gICAgICAgICAgICsgIHhbdCAtICA1XSpoJ1txLCAgN10gICsgIHhbdCAtICA0XSpoJ1txLCAgOF0KLSAgICAgICAgICAgKyAgeFt0IC0gIDNdKmgnW3EsICA5XSAgKyAgeFt0IC0gIDJdKmgnW3EsIDEwXSAgKyAgeFt0IC0gIDFdKmgnW3EsIDExXSAgKyAgeFt0IC0gIDBdKmgnW3EsIDEyXTsKLQotICAgVHJ5IHRvIHNwbGl0IG9mZiBGRlQgTW9kdWxhdGlvbiBUZXJtOgotICAgRkZUKHhbdF0sIHEpID0gc3VtKHhbdCtrXSpleHAoLWoqMipwaS9OICpxICogaykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtCi0gICBTdGVwIDE6ICBoJ1txLG5dID0gZ1tuXSAqICggZXhwKGogKiAyICogcGkgLyA4ICogLjUgKiAoNiAtIG4pKSApICogKCBleHAgKGogKiAyICogcGkgLyA4ICogcSAqICg2IC0gbikpICk7Ci0KLSAgICBoJ1txLG5dID0gZ1tuXSAqY1tuXSAqIG1bcSxuXTsgKHNlZSBhYm92ZSkKLSAgICBjW25dICAgID0gZXhwKCBqICogMiAqIHBpIC8gOCAqIC41ICogKDYgLSBuKSApOwotICAgIG1bcSxuXSAgPSBleHAoIGogKiAyICogcGkgLyA4ICogIHEgKiAoNiAtIG4pICk7Ci0KLSAgICB5W3EsdF0gPSB4W3QgLSAgMF0qZ1swXSpjWzBdKm1bcSwwXSAgKyAgeFt0IC0gIDFdKmdbMV0qY1sgMV0qbVtxLCAxXSAgKyAuLi4KLSAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgKyAgeFt0IC0gMTJdKmdbMl0qY1sxMl0qbVtxLDEyXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgIG4gICAgICAgICAgICAgICAgICAgbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXhwKC1qKjIqcGkpICAgICAgICAgICAgfCAgIG4nICAgICAgICAgICAgICAgICAgIGZmdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDAgICAgICAgZXhwKCBqICogMiAqIHBpIC8gOCAqIHEgKiA2KSAtPiAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiAyKSAgICAgfCAgIDIgICAgICAgICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDApCi0gICAgMSAgICAgICBleHAoIGogKiAyICogcGkgLyA4ICogcSAqIDUpIC0+ICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDMpICAgICB8ICAgMyAgICAgICAgIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogMSkKLSAgICAyICAgICAgIGV4cCggaiAqIDIgKiBwaSAvIDggKiBxICogNCkgLT4gIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogNCkgICAgIHwgICA0ICAgICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiAyKQotICAgIDMgICAgICAgZXhwKCBqICogMiAqIHBpIC8gOCAqIHEgKiAzKSAtPiAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiA1KSAgICAgfCAgIDUgICAgICAgICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDMpCi0gICAgNCAgICAgICBleHAoIGogKiAyICogcGkgLyA4ICogcSAqIDIpIC0+ICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDYpICAgICB8ICAgNiAgICAgICAgIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogNCkKLSAgICA1ICAgICAgIGV4cCggaiAqIDIgKiBwaSAvIDggKiBxICogMSkgLT4gIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogNykgICAgIHwgICA3ICAgICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiA1KQotICAgIDYgICAgICAgZXhwKCBqICogMiAqIHBpIC8gOCAqIHEgKiAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDAgICAgICAgICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDYpCi0gICAgNyAgICAgICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMSAgICAgICAgIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogNykKLSAgICA4ICAgICAgIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyCi0gICAgOSAgICAgICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMwotICAgIDEwICAgICAgZXhwKC1qICogMiAqIHBpIC8gOCAqIHEgKiA0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDQKLSAgICAxMSAgICAgIGV4cCgtaiAqIDIgKiBwaSAvIDggKiBxICogNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA1Ci0gICAgMTIgICAgICBleHAoLWogKiAyICogcGkgLyA4ICogcSAqIDYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgNgotCi0KLSAgICBub3cgdXNlIGZmdCBtb2R1bGF0aW9uIGNvZWZmaWNpZW50cwotICAgIG1bNl0gID0gICAgICAgPSBmZnRbMF0KLSAgICBtWzddICA9ICAgICAgID0gZmZ0WzFdCi0gICAgbVs4XSAgPSBtWyAwXSA9IGZmdFsyXQotICAgIG1bOV0gID0gbVsgMV0gPSBmZnRbM10KLSAgICBtWzEwXSA9IG1bIDJdID0gZmZ0WzRdCi0gICAgbVsxMV0gPSBtWyAzXSA9IGZmdFs1XQotICAgIG1bMTJdID0gbVsgNF0gPSBmZnRbNl0KLSAgICAgICAgICAgIG1bIDVdID0gZmZ0WzddCi0KLSAgICB5W3EsdF0gPSAoICAgICAgICAgICAgICAgICAgICAgICB4W3QtIDZdKmdbIDZdKmNbIDZdICkgKiBmZnRbcSwwXSAgKwotICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgIHhbdC0gN10qZ1sgN10qY1sgN10gKSAqIGZmdFtxLDFdICArCi0gICAgICAgICAgICAgKCB4W3QtIDBdKmdbIDBdKmNbIDBdICsgeFt0LSA4XSpnWyA4XSpjWyA4XSApICogZmZ0W3EsMl0gICsKLSAgICAgICAgICAgICAoIHhbdC0gMV0qZ1sgMV0qY1sgMV0gKyB4W3QtIDldKmdbIDldKmNbIDldICkgKiBmZnRbcSwzXSAgKwotICAgICAgICAgICAgICggeFt0LSAyXSpnWyAyXSpjWyAyXSArIHhbdC0xMF0qZ1sxMF0qY1sxMF0gKSAqIGZmdFtxLDRdICArCi0gICAgICAgICAgICAgKCB4W3QtIDNdKmdbIDNdKmNbIDNdICsgeFt0LTExXSpnWzExXSpjWzExXSApICogZmZ0W3EsNV0gICsKLSAgICAgICAgICAgICAoIHhbdC0gNF0qZ1sgNF0qY1sgNF0gKyB4W3QtMTJdKmdbMTJdKmNbMTJdICkgKiBmZnRbcSw2XSAgKwotICAgICAgICAgICAgICggeFt0LSA1XSpnWyA1XSpjWyA1XSAgICAgICAgICAgICAgICAgICAgICAgKSAqIGZmdFtxLDddOwotCi0gICAgcHJlIHR3aWRkbGUgZmFjdG9ycyBjW25dID0gZXhwKGogKiAyICogcGkgLyA4ICogLjUgKiAoNiAtIG4pKTsKLSAgICBuICAgICAgICAgICAgICAgIGNdICAgICAgICAgICB8ICBuICAgICAgICAgICAgICAgIGNbbl0gICAgICAgICB8ICBuICAgICAgICAgICAgICAgIGNbbl0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDAgICAgICAgZXhwKCBqICogNiAqIHBpIC8gOCkgIHwgIDEgICAgICAgZXhwKCBqICogNSAqIHBpIC8gOCkgIHwgIDIgICAgICAgZXhwKCBqICogNCAqIHBpIC8gOCkKLSAgICAzICAgICAgIGV4cCggaiAqIDMgKiBwaSAvIDgpICB8ICA0ICAgICAgIGV4cCggaiAqIDIgKiBwaSAvIDgpICB8ICA1ICAgICAgIGV4cCggaiAqIDEgKiBwaSAvIDgpCi0gICAgNiAgICAgICBleHAoIGogKiAwICogcGkgLyA4KSAgfCAgNyAgICAgICBleHAoLWogKiAxICogcGkgLyA4KSAgfCAgOCAgICAgICBleHAoLWogKiAyICogcGkgLyA4KQotICAgIDkgICAgICAgZXhwKC1qICogMyAqIHBpIC8gOCkgIHwgMTAgICAgICAgZXhwKC1qICogNCAqIHBpIC8gOCkgIHwgMTEgICAgICAgZXhwKC1qICogNSAqIHBpIC8gOCkKLSAgIDEyICAgICAgIGV4cCgtaiAqIDYgKiBwaSAvIDgpICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci08L3ByZT4KLSovCi0KLS8qIGRlZmluaW5nIHJvdGF0aW9uIGZhY3RvcnMgZm9yICpDaGFubmVsRmlsdGVyaW5nICovCi0KLSNkZWZpbmUgY29zMFBpICAgIEZMMkZYQ09OU1RfREJMKCAxLmYpCi0jZGVmaW5lIHNpbjBQaSAgICBGTDJGWENPTlNUX0RCTCggMC5mKQotCi0jZGVmaW5lIGNvczFQaSAgICBGTDJGWENPTlNUX0RCTCgtMS5mKQotI2RlZmluZSBzaW4xUGkgICAgRkwyRlhDT05TVF9EQkwoIDAuZikKLQotI2RlZmluZSBjb3MxUGlfMiAgRkwyRlhDT05TVF9EQkwoIDAuZikKLSNkZWZpbmUgc2luMVBpXzIgIEZMMkZYQ09OU1RfREJMKCAxLmYpCi0KLSNkZWZpbmUgY29zMVBpXzMgIEZMMkZYQ09OU1RfREJMKCAwLjVmKQotI2RlZmluZSBzaW4xUGlfMyAgRkwyRlhDT05TVF9EQkwoIDAuODY2MDI1NDAzNzg0NDRmKQotCi0jZGVmaW5lIGNvczBQaV80ICBjb3MwUGkKLSNkZWZpbmUgY29zMVBpXzQgIEZMMkZYQ09OU1RfREJMKDAuNzA3MTA2NzgxMTg2NTVmKQotI2RlZmluZSBjb3MyUGlfNCAgY29zMVBpXzIKLSNkZWZpbmUgY29zM1BpXzQgICgtY29zMVBpXzQpCi0jZGVmaW5lIGNvczRQaV80ICAoLWNvczBQaV80KQotI2RlZmluZSBjb3M1UGlfNCAgY29zM1BpXzQKLSNkZWZpbmUgY29zNlBpXzQgIGNvczJQaV80Ci0KLSNkZWZpbmUgc2luMFBpXzQgIHNpbjBQaQotI2RlZmluZSBzaW4xUGlfNCAgRkwyRlhDT05TVF9EQkwoMC43MDcxMDY3ODExODY1NWYpCi0jZGVmaW5lIHNpbjJQaV80ICBzaW4xUGlfMgotI2RlZmluZSBzaW4zUGlfNCAgc2luMVBpXzQKLSNkZWZpbmUgc2luNFBpXzQgIHNpbjBQaV80Ci0jZGVmaW5lIHNpbjVQaV80ICAoLXNpbjNQaV80KQotI2RlZmluZSBzaW42UGlfNCAgKC1zaW4yUGlfNCkKLQotI2RlZmluZSBjb3MwUGlfOCAgY29zMFBpCi0jZGVmaW5lIGNvczFQaV84ICBGTDJGWENPTlNUX0RCTCgwLjkyMzg3OTUzMjUxMTI5ZikKLSNkZWZpbmUgY29zMlBpXzggIGNvczFQaV80Ci0jZGVmaW5lIGNvczNQaV84ICBGTDJGWENPTlNUX0RCTCgwLjM4MjY4MzQzMjM2NTA5ZikKLSNkZWZpbmUgY29zNFBpXzggIGNvczJQaV80Ci0jZGVmaW5lIGNvczVQaV84ICAoLWNvczNQaV84KQotI2RlZmluZSBjb3M2UGlfOCAgKC1jb3MyUGlfOCkKLQotI2RlZmluZSBzaW4wUGlfOCAgc2luMFBpCi0jZGVmaW5lIHNpbjFQaV84ICBjb3MzUGlfOAotI2RlZmluZSBzaW4yUGlfOCAgc2luMVBpXzQKLSNkZWZpbmUgc2luM1BpXzggIGNvczFQaV84Ci0jZGVmaW5lIHNpbjRQaV84ICBzaW4yUGlfNAotI2RlZmluZSBzaW41UGlfOCAgc2luM1BpXzgKLSNkZWZpbmUgc2luNlBpXzggIHNpbjFQaV80Ci0KLSNpZiBkZWZpbmVkKEFSQ0hfUFJFRkVSX01VTFRfMzJ4MTYpCi0gICNkZWZpbmUgRklYUF9IWUIgRklYUF9TR0wKLSAgI2RlZmluZSBGSVhQX0NBU1QgRlhfREJMMkZYX1NHTAotI2Vsc2UKLSAgI2RlZmluZSBGSVhQX0hZQiBGSVhQX0RCTAotICAjZGVmaW5lIEZJWFBfQ0FTVAotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBGSVhQX0hZQiAgY3JbMTNdID0KLXsKLSAgIEZJWFBfQ0FTVChjb3M2UGlfOCksIEZJWFBfQ0FTVChjb3M1UGlfOCksIEZJWFBfQ0FTVChjb3M0UGlfOCksCi0gICBGSVhQX0NBU1QoY29zM1BpXzgpLCBGSVhQX0NBU1QoY29zMlBpXzgpLCBGSVhQX0NBU1QoY29zMVBpXzgpLAotICAgRklYUF9DQVNUKGNvczBQaV84KSwKLSAgIEZJWFBfQ0FTVChjb3MxUGlfOCksIEZJWFBfQ0FTVChjb3MyUGlfOCksIEZJWFBfQ0FTVChjb3MzUGlfOCksCi0gICBGSVhQX0NBU1QoY29zNFBpXzgpLCBGSVhQX0NBU1QoY29zNVBpXzgpLCBGSVhQX0NBU1QoY29zNlBpXzgpCi19OwotCi1zdGF0aWMgY29uc3QgRklYUF9IWUIgIGNpWzEzXSA9Ci17Ci0gICBGSVhQX0NBU1QoIHNpbjZQaV84KSwgRklYUF9DQVNUKCBzaW41UGlfOCksIEZJWFBfQ0FTVCggc2luNFBpXzgpLAotICAgRklYUF9DQVNUKCBzaW4zUGlfOCksIEZJWFBfQ0FTVCggc2luMlBpXzgpLCBGSVhQX0NBU1QoIHNpbjFQaV84KSwKLSAgIEZJWFBfQ0FTVCggc2luMFBpXzgpICwKLSAgIEZJWFBfQ0FTVCgtc2luMVBpXzgpLCBGSVhQX0NBU1QoLXNpbjJQaV84KSwgRklYUF9DQVNUKC1zaW4zUGlfOCksCi0gICBGSVhQX0NBU1QoLXNpbjRQaV84KSwgRklYUF9DQVNUKC1zaW41UGlfOCksIEZJWFBfQ0FTVCgtc2luNlBpXzgpCi19OwotCi1zdGF0aWMgdm9pZCBzbG90QmFzZWRFaWdodENoYW5uZWxGaWx0ZXJpbmcoIGNvbnN0IEZJWFBfREJMICpwUW1mUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnBRbWZJbWFnLAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqbUh5YnJpZFJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqbUh5YnJpZEltYWcpCi17Ci0KLSAgaW50IGJpbjsKLSAgRklYUF9EQkwgX2ZmdFsxMjggKyBBTElHTk1FTlRfREVGQVVMVCAtIDFdOwotICBGSVhQX0RCTCAqZmZ0ID0gKEZJWFBfREJMICopQUxJR05fUFRSKF9mZnQpOwotCi0jaWYgZGVmaW5lZChBUkNIX1BSRUZFUl9NVUxUXzMyeDE2KQotICBjb25zdCBGSVhQX1NHTCAqcCA9IHA4XzEzXzIwOyAvKiBCQVNFTElORV9QUyAqLwotI2Vsc2UKLSAgY29uc3QgRklYUF9EQkwgKnAgPSBwOF8xM18yMDsgLyogQkFTRUxJTkVfUFMgKi8KLSNlbmRpZgotCi0gIC8qIHByZSB0d2lkZGVsaW5nICovCi0KLSAgLyogICB4KihhKmIgKyBjKmQpID0gZk11bHREaXYyKHgsIGZNdWx0QWRkRGl2MihmTXVsdERpdjIoYSwgYiksIGMsIGQpKSAqLwotICAvKiAgIHgqKGEqYiAtIGMqZCkgPSBmTXVsdERpdjIoeCwgZk11bHRTdWJEaXYyKGZNdWx0RGl2MihhLCBiKSwgYywgZCkpICovCi0gIEZJWFBfREJMIGFjY3UxLCBhY2N1MiwgYWNjdTMsIGFjY3U0OwotCi0gICNkZWZpbmUgVFdJRERMRV8xKG5fMCxuXzEsbl8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgY3BseE11bHREaXYyKCZhY2N1MSwgJmFjY3UyLCBwUW1mUmVhbFtuXzBdLCBwUW1mSW1hZ1tuXzBdLCBjcltuXzBdLCBjaVtuXzBdKTsgIFwKLSAgICAgICAgIGFjY3UxID0gZk11bHREaXYyKHBbbl8wXSwgYWNjdTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBhY2N1MiA9IGZNdWx0RGl2MihwW25fMF0sIGFjY3UyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgY3BseE11bHREaXYyKCZhY2N1MywgJmFjY3U0LCBwUW1mUmVhbFtuXzFdLCBwUW1mSW1hZ1tuXzFdLCBjcltuXzFdLCBjaVtuXzFdKTsgIFwKLSAgICAgICAgIGFjY3UzID0gZk11bHREaXYyKHBbbl8xXSwgYWNjdTMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBhY2N1NCA9IGZNdWx0RGl2MihwW25fMV0sIGFjY3U0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgZmZ0W0ZJWFBfRkZUX0lEWF9SKG5fMildID0gYWNjdTEgKyBhY2N1MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIGZmdFtGSVhQX0ZGVF9JRFhfSShuXzIpXSA9IGFjY3UyICsgYWNjdTQ7Ci0KLSAgI2RlZmluZSBUV0lERExFXzAobl8wLG5fMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBjcGx4TXVsdERpdjIoJmFjY3UxLCAmYWNjdTIsIHBRbWZSZWFsW25fMF0sIHBRbWZJbWFnW25fMF0sIGNyW25fMF0sIGNpW25fMF0pOyAgXAotICAgICAgICAgZmZ0W0ZJWFBfRkZUX0lEWF9SKG5fMSldID0gZk11bHREaXYyKHBbbl8wXSwgYWNjdTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIGZmdFtGSVhQX0ZGVF9JRFhfSShuXzEpXSA9IGZNdWx0RGl2MihwW25fMF0sIGFjY3UyKTsKLQotICBUV0lERExFXzAoIDYsIDApCi0gIFRXSURETEVfMCggNywgMSkKLQotICBUV0lERExFXzEoIDAsIDgsIDIpCi0gIFRXSURETEVfMSggMSwgOSwgMykKLSAgVFdJRERMRV8xKCAyLDEwLCA0KQotICBUV0lERExFXzEoIDMsMTEsIDUpCi0gIFRXSURETEVfMSggNCwxMiwgNikKLQotICBUV0lERExFXzAoIDUsIDcpCi0KLSAgZmZ0XzggKGZmdCk7Ci0KLSAgLyogcmVzb3J0IGZmdCBkYXRhIGludG8gb3V0cHV0IGFycmF5Ki8KLSAgZm9yKGJpbj0wOyBiaW48ODtiaW4rKyApIHsKLSAgICBtSHlicmlkUmVhbFtiaW5dID0gZmZ0W0ZJWFBfRkZUX0lEWF9SKGJpbildIDw8IDQ7Ci0gICAgbUh5YnJpZEltYWdbYmluXSA9IGZmdFtGSVhQX0ZGVF9JRFhfSShiaW4pXSA8PCA0OwotICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBGdW5jdGlvbm5hbWU6ICBmaWxsSHlicmlkRGVsYXlMaW5lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gRGVzY3JpcHRpb246ICAgVGhlIGRlbGF5IGxpbmUgb2YgdGhlIGh5YnJpZCBmaWx0ZXIgaXMgZmlsbGVkIGFuZCBjb3BpZWQgZnJvbQotICAgICAgICAgICAgICAgIGxlZnQgdG8gcmlnaHQuCi0KLSBSZXR1cm46ICAgICAgICBub25lCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLWZpbGxIeWJyaWREZWxheUxpbmUoIEZJWFBfREJMICoqZml4cFFtZlJlYWwsICAgICAgICAgIC8qITwgUW1mIHJlYWwgVmFsdWVzICAgICovCi0gICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKmZpeHBRbWZJbWFnLCAgICAgICAgICAvKiE8IFFtZiBpbWFnIFZhbHVlcyAgICAqLwotICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICBmaXhwSHlicmlkTGVmdFJbMTJdLCAgLyohPCBIeWJyaWQgcmVhbCBWYWx1ZXMgbGVmdCBjaGFubmVsICAqLwotICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICBmaXhwSHlicmlkTGVmdElbMTJdLCAgLyohPCBIeWJyaWQgaW1hZyBWYWx1ZXMgbGVmdCBjaGFubmVsICAqLwotICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICBmaXhwSHlicmlkUmlnaHRSWzEyXSwgLyohPCBIeWJyaWQgcmVhbCBWYWx1ZXMgcmlnaHQgY2hhbm5lbCAqLwotICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICBmaXhwSHlicmlkUmlnaHRJWzEyXSwgLyohPCBIeWJyaWQgaW1hZyBWYWx1ZXMgcmlnaHQgY2hhbm5lbCAqLwotICAgICAgICAgICAgICAgICAgICAgSEFORExFX0hZQlJJRCBoSHlicmlkICkKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEhZQlJJRF9GSUxURVJfREVMQVk7IGkrKykgewotICAgIHNsb3RCYXNlZEh5YnJpZEFuYWx5c2lzICggZml4cFFtZlJlYWxbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhwUW1mUmVhbFtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeHBIeWJyaWRMZWZ0UiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeHBIeWJyaWRMZWZ0SSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIeWJyaWQgKTsKLSAgfQotCi0gIEZES21lbWNweShmaXhwSHlicmlkUmlnaHRSLCBmaXhwSHlicmlkTGVmdFIsIHNpemVvZihGSVhQX0RCTCkqTk9fU1VCX1FNRl9DSEFOTkVMUyk7Ci0gIEZES21lbWNweShmaXhwSHlicmlkUmlnaHRJLCBmaXhwSHlicmlkTGVmdEksIHNpemVvZihGSVhQX0RCTCkqTk9fU1VCX1FNRl9DSEFOTkVMUyk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBGdW5jdGlvbm5hbWU6ICBzbG90QmFzZWRIeWJyaWRBbmFseXNpcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIERlc2NyaXB0aW9uOiAgIFRoZSBsb3dlciBRTUYgc3ViYmFuZHMgYXJlIGZ1cnRoZXIgc3BsaXQgdG8gcHJvdmlkZSBiZXR0ZXIKLSAgICAgICAgICAgICAgICBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3IgUFMgcHJvY2Vzc2luZy4KLQotICBSZXR1cm46ICAgICAgICBub25lCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdm9pZAotc2xvdEJhc2VkSHlicmlkQW5hbHlzaXMgKCBGSVhQX0RCTCAqZml4cFFtZlJlYWwsICAgICAgLyohPCBRbWYgcmVhbCBWYWx1ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmZpeHBRbWZJbWFnLCAgICAgIC8qITwgUW1mIGltYWcgVmFsdWVzICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgIGZpeHBIeWJyaWRSZWFsWzEyXSwgICAvKiE8IEh5YnJpZCByZWFsIFZhbHVlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgZml4cEh5YnJpZEltYWdbMTJdLCAgIC8qITwgSHlicmlkIGltYWcgVmFsdWVzICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0hZQlJJRCBoSHlicmlkKQotewotICBpbnQgIGssIGJhbmQ7Ci0gIEhZQlJJRF9SRVMgaHlicmlkUmVzOwotICBpbnQgIGNoT2Zmc2V0ID0gMDsKLQotICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocFRlbXBSZWFsU2xvdCwgRklYUF9EQkwsIDQqSFlCUklEX0ZJTFRFUl9MRU5HVEgpOwotCi0gIEZJWFBfREJMICpwVGVtcEltYWdTbG90ID0gcFRlbXBSZWFsU2xvdCArIEhZQlJJRF9GSUxURVJfTEVOR1RIOwotICBGSVhQX0RCTCAqcFdvcmtSZWFsU2xvdCA9IHBUZW1wSW1hZ1Nsb3QgKyBIWUJSSURfRklMVEVSX0xFTkdUSDsKLSAgRklYUF9EQkwgKnBXb3JrSW1hZ1Nsb3QgPSBwV29ya1JlYWxTbG90ICsgSFlCUklEX0ZJTFRFUl9MRU5HVEg7Ci0KLSAgLyohCi0gIEh5YnJpZCBmaWx0ZXJpbmcgaXMgYXBwbGllZCB0byB0aGUgZmlyc3QgaEh5YnJpZC0+blFtZkJhbmRzIFFNRiBiYW5kcyAoMyB3aGVuIDEwIG9yIDIwIHN0ZXJlbyBiYW5kcwotICBhcmUgdXNlZCwgNSB3aGVuIDM0IHN0ZXJlbyBiYW5kcyBhcmUgdXNlZCkuIEZvciB0aGUgcmVtYWluaW5nIFFNRiBiYW5kcyBhIGRlbGF5IHdvdWxkIGJlIG5lY2Vzc2FyeS4KLSAgQnV0IHRoZXJlIGlzIG5vIG5lZWQgdG8gaW1wbGVtZW50IGEgZGVsYXkgYmVjYXVzZSB0aGVyZSBpcyBhIGxvb2stYWhlYWQgb2YgSFlCUklEX0ZJTFRFUl9ERUxBWSA9IDYKLSAgUU1GIHNhbXBsZXMgaW4gdGhlIGxvdy1iYW5kIGJ1ZmZlci4KLSAgKi8KLQotICBmb3IoYmFuZCA9IDA7IGJhbmQgPCBoSHlicmlkLT5uUW1mQmFuZHM7IGJhbmQrKykgewotCi0gICAgLyogIGdldCBoeWJyaWQgcmVzb2x1dGlvbiBwZXIgcW1mIGJhbmQgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgaW4gY2FzZSBvZiBiYXNlbGluZSBwcyAxMC8yMCBiYW5kIHN0ZXJlbyBtb2RlIDogICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgcW1mQmFuZFswXSA6IDggKCBIWUJSSURfOF9DUExYICkgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICBxbWZCYW5kWzFdIDogMiAoIEhZQlJJRF8yX1JFQUwgKSAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgIHFtZkJhbmRbMl0gOiAyICggSFlCUklEXzJfUkVBTCApICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgKHNwbGl0IHRoZSAzIGxvd2VyIHFtZiBiYW5kIHRvIDEyIGh5YnJpZCBiYW5kcykgICAqLwotCi0gICAgaHlicmlkUmVzID0gKEhZQlJJRF9SRVMpaEh5YnJpZC0+cFJlc29sdXRpb25bYmFuZF07Ci0KLSAgICBGREttZW1jcHkocFdvcmtSZWFsU2xvdCwgaEh5YnJpZC0+bVFtZkJ1ZmZlclJlYWxTbG90W2JhbmRdLCBoSHlicmlkLT5xbWZCdWZmZXJNb3ZlICogc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgRkRLbWVtY3B5KHBXb3JrSW1hZ1Nsb3QsIGhIeWJyaWQtPm1RbWZCdWZmZXJJbWFnU2xvdFtiYW5kXSwgaEh5YnJpZC0+cW1mQnVmZmVyTW92ZSAqIHNpemVvZihGSVhQX0RCTCkpOwotCi0gICAgcFdvcmtSZWFsU2xvdFtoSHlicmlkLT5xbWZCdWZmZXJNb3ZlXSA9IGZpeHBRbWZSZWFsW2JhbmRdOwotICAgIHBXb3JrSW1hZ1Nsb3RbaEh5YnJpZC0+cW1mQnVmZmVyTW92ZV0gPSBmaXhwUW1mSW1hZ1tiYW5kXTsKLQotICAgIEZES21lbWNweShoSHlicmlkLT5tUW1mQnVmZmVyUmVhbFNsb3RbYmFuZF0sIHBXb3JrUmVhbFNsb3QgKyAxLCBoSHlicmlkLT5xbWZCdWZmZXJNb3ZlICogc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgRkRLbWVtY3B5KGhIeWJyaWQtPm1RbWZCdWZmZXJJbWFnU2xvdFtiYW5kXSwgcFdvcmtJbWFnU2xvdCArIDEsIGhIeWJyaWQtPnFtZkJ1ZmZlck1vdmUgKiBzaXplb2YoRklYUF9EQkwpKTsKLQotICAgIGlmIChmaXhwUW1mUmVhbCkgewotCi0gICAgICAvKiBhY3R1YWwgZmlsdGVyaW5nIG9ubHkgaWYgb3V0cHV0IHNpZ25hbCByZXF1ZXN0ZWQgKi8KLSAgICAgIHN3aXRjaCggaHlicmlkUmVzICkgewotCi0gICAgICAvKiBIWUJSSURfMl9SRUFMICYgSFlCUklEXzhfQ1BMWCBhcmUgb25seSBuZWVkZnVsIGZvciBiYXNlbGluZSBwcyAqLwotICAgICAgY2FzZSBIWUJSSURfMl9SRUFMOgotCi0gICAgICAgIHNsb3RCYXNlZER1YWxDaGFubmVsRmlsdGVyaW5nKCBwV29ya1JlYWxTbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtJbWFnU2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wUmVhbFNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcEltYWdTbG90KTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgSFlCUklEXzhfQ1BMWDoKLQotICAgICAgICBzbG90QmFzZWRFaWdodENoYW5uZWxGaWx0ZXJpbmcoIHBXb3JrUmVhbFNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmtJbWFnU2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFJlYWxTbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wSW1hZ1Nsb3QpOwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgRkRLX0FTU0VSVCgwKTsKLSAgICAgIH0KLQotICAgICAgZm9yKGsgPSAwOyBrIDwgKFNDSEFSKWh5YnJpZFJlczsgaysrKSB7Ci0gICAgICAgIGZpeHBIeWJyaWRSZWFsIFtjaE9mZnNldCArIGtdID0gcFRlbXBSZWFsU2xvdFtrXTsKLSAgICAgICAgZml4cEh5YnJpZEltYWcgW2NoT2Zmc2V0ICsga10gPSBwVGVtcEltYWdTbG90W2tdOwotICAgICAgfQotICAgICAgY2hPZmZzZXQgKz0gaHlicmlkUmVzOwotICAgIH0gLyogaWYgKG1IeWJyaWRSZWFsKSAqLwotICB9Ci0KLSAgLyogZ3JvdXAgaHlicmlkIGNoYW5uZWxzIDMrNCAtPiAzIGFuZCAyKzUgLT4gMiAqLwotICBmaXhwSHlicmlkUmVhbFszXSArPSBmaXhwSHlicmlkUmVhbFs0XTsKLSAgZml4cEh5YnJpZEltYWdbM10gKz0gZml4cEh5YnJpZEltYWdbNF07Ci0gIGZpeHBIeWJyaWRSZWFsWzRdID0gKEZJWFBfREJMKTA7Ci0gIGZpeHBIeWJyaWRJbWFnWzRdID0gKEZJWFBfREJMKTA7Ci0KLSAgZml4cEh5YnJpZFJlYWxbMl0gKz0gZml4cEh5YnJpZFJlYWxbNV07Ci0gIGZpeHBIeWJyaWRJbWFnWzJdICs9IGZpeHBIeWJyaWRJbWFnWzVdOwotICBmaXhwSHlicmlkUmVhbFs1XSA9IChGSVhQX0RCTCkwOwotICBmaXhwSHlicmlkSW1hZ1s1XSA9IChGSVhQX0RCTCkwOwotCi0gIC8qIGZyZWUgbWVtb3J5IG9uIHNjcmF0Y2ggKi8KLSAgQ19BTExPQ19TQ1JBVENIX0VORChwVGVtcFJlYWxTbG90LCBGSVhQX0RCTCwgNCpIWUJSSURfRklMVEVSX0xFTkdUSCk7Ci0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEZ1bmN0aW9ubmFtZTogIHNsb3RCYXNlZEh5YnJpZFN5bnRoZXNpcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIERlc2NyaXB0aW9uOiAgVGhlIGNvZWZmaWNpZW50cyBvZmZlcmluZyBoaWdoZXIgcmVzb2x1dGlvbiBmb3IgdGhlIGxvd2VyIFFNRgotICAgICAgICAgICAgICAgY2hhbm5lbCBhcmUgc2ltcGx5IGFkZGVkIHByaW9yIHRvIHRoZSBzeW50aGVzaXMgd2l0aCB0aGUgNTQKLSAgICAgICAgICAgICAgIHN1YmJhbmRzIFFNRi4KLQotIEFyZ3VtZW50czoKLQotIFJldHVybjogICAgICAgIG5vbmUKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyohIDxwcmU+Ci0gICAgICBsLHIwKG4pIC0tLVwKLSAgICAgIGwscjEobikgLS0tLSArIC0tXAotICAgICAgbCxyMihuKSAtLS0vICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICsgLS0+IEYwKHcpCi0gICAgICBsLHIzKG4pIC0tLVwgICAgICAvCi0gICAgICBsLHI0KG4pIC0tLS0gKyAtLS8KLSAgICAgIGwscjUobikgLS0tLwotCi0KLSAgICAgIGwscjYobikgLS0tXAotICAgICAgICAgICAgICAgICAgKyAtLS0tLS0tLS0+IEYxKHcpCi0gICAgICBsLHI3KG4pIC0tLS8KLQotCi0gICAgICBsLHI4KG4pIC0tLVwKLSAgICAgICAgICAgICAgICAgICsgLS0tLS0tLS0tPiBGMih3KQotICAgICAgbCxyOShuKSAtLS0vCi0KLSAgICA8L3ByZT4KLSAgICAgIEh5YnJpZCBRTUYgc3ludGhlc2lzIGZpbHRlcmJhbmsgZm9yIHRoZSAxMCBhbmQgMjAgc3RlcmVvLWJhbmRzIGNvbmZpZ3VyYXRpb25zLiBUaGUKLSAgICAgIGNvZWZmaWNpZW50cyBvZmZlcmluZyBoaWdoZXIgcmVzb2x1dGlvbiBmb3IgdGhlIGxvd2VyIFFNRiBjaGFubmVsIGFyZSBzaW1wbHkgYWRkZWQKLSAgICAgIHByaW9yIHRvIHRoZSBzeW50aGVzaXMgd2l0aCB0aGUgNTQgc3ViYmFuZHMgUU1GLgotCi0gICAgICBbc2VlIElTTy9JRUMgMTQ0OTYtMzoyMDAxL0ZEQU0gMjoyMDA0KEUpIC0gUGFnZSA1Ml0KLSovCi0KLQotdm9pZAotc2xvdEJhc2VkSHlicmlkU3ludGhlc2lzICggRklYUF9EQkwgICpmaXhwSHlicmlkUmVhbCwgIC8qITwgSHlicmlkIHJlYWwgVmFsdWVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKmZpeHBIeWJyaWRJbWFnLCAgLyohPCBIeWJyaWQgaW1hZyBWYWx1ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqZml4cFFtZlJlYWwsICAgICAvKiE8IFFtZiByZWFsIFZhbHVlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpmaXhwUW1mSW1hZywgICAgIC8qITwgUW1mIGltYWcgVmFsdWVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfSFlCUklEIGhIeWJyaWQgKSAgICAgLyohPCBIYW5kbGUgdG8gSFlCUklEIHN0cnVjdC4gKi8KLXsKLSAgaW50ICBrLCBiYW5kOwotCi0gIEhZQlJJRF9SRVMgaHlicmlkUmVzOwotICBpbnQgIGNoT2Zmc2V0ID0gMDsKLQotICBmb3IoYmFuZCA9IDA7IGJhbmQgPCBoSHlicmlkLT5uUW1mQmFuZHM7IGJhbmQrKykgewotCi0gICAgRklYUF9EQkwgcW1mUmVhbCA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0gICAgRklYUF9EQkwgcW1mSW1hZyA9IEZMMkZYQ09OU1RfREJMKDAuZik7Ci0gICAgaHlicmlkUmVzID0gKEhZQlJJRF9SRVMpaEh5YnJpZC0+cFJlc29sdXRpb25bYmFuZF07Ci0KLSAgICBmb3IoayA9IDA7IGsgPCAoU0NIQVIpaHlicmlkUmVzOyBrKyspIHsKLSAgICAgIHFtZlJlYWwgKz0gZml4cEh5YnJpZFJlYWxbY2hPZmZzZXQgKyBrXTsKLSAgICAgIHFtZkltYWcgKz0gZml4cEh5YnJpZEltYWdbY2hPZmZzZXQgKyBrXTsKLSAgICB9Ci0KLSAgICBmaXhwUW1mUmVhbFtiYW5kXSA9IHFtZlJlYWw7Ci0gICAgZml4cFFtZkltYWdbYmFuZF0gPSBxbWZJbWFnOwotCi0gICAgY2hPZmZzZXQgKz0gaHlicmlkUmVzOwotICB9Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3BzZGVjX2h5YnJpZC5oIGIvbGliU0JSZGVjL3NyYy9wc2RlY19oeWJyaWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmOWUzZS4uMDAwMDAwMAotLS0gYS9saWJTQlJkZWMvc3JjL3BzZGVjX2h5YnJpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWZuZGVmIF9fSFlCUklEX0gKLSNkZWZpbmUgX19IWUJSSURfSAotCi0jaW5jbHVkZSAic2JyZGVjb2Rlci5oIgotCi0KLSNkZWZpbmUgSFlCUklEX0ZJTFRFUl9MRU5HVEggIDEzCi0jZGVmaW5lIEhZQlJJRF9GSUxURVJfREVMQVkgICAgNgotCi0KLSNkZWZpbmUgRkFTVF9GSUxURVIyCi0jZGVmaW5lIEZBU1RfRklMVEVSNAotI2RlZmluZSBGQVNUX0ZJTFRFUjgKLSNkZWZpbmUgRkFTVF9GSUxURVIxMgotCi0jZGVmaW5lIEZGVF9JRFhfUihhKSAgKDIqYSkKLSNkZWZpbmUgRkZUX0lEWF9JKGEpICAoMiphKzEpCi0KLSNkZWZpbmUgRklYUF9GRlRfSURYX1IoYSkgICAoYTw8MSkKLSNkZWZpbmUgRklYUF9GRlRfSURYX0koYSkgICgoYTw8MSkgKyAxKQotCi0KLXR5cGVkZWYgZW51bSB7Ci0KLSAgSFlCUklEXzJfUkVBTCAgICAgPSAyLAotICBIWUJSSURfNF9DUExYICAgICA9IDQsCi0gIEhZQlJJRF84X0NQTFggICAgID0gOCwKLSAgSFlCUklEXzEyX0NQTFggICAgPSAxMgotCi19IEhZQlJJRF9SRVM7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIFNDSEFSICAgblFtZkJhbmRzOwotICBTQ0hBUiAgIGZyYW1lU2l6ZTsKLSAgU0NIQVIgICBxbWZCdWZmZXJNb3ZlOwotCi0gIFVDSEFSICAgcFJlc29sdXRpb25bM107Ci0KLSAgRklYUF9EQkwgbVFtZkJ1ZmZlclJlYWxTbG90WzNdW0hZQlJJRF9GSUxURVJfTEVOR1RIXTsgICAvKio8IFN0b3JlcyBvbGQgUW1mIHNhbXBsZXMuICovCi0gIEZJWFBfREJMIG1RbWZCdWZmZXJJbWFnU2xvdFszXVtIWUJSSURfRklMVEVSX0xFTkdUSF07Ci0gIFNDSEFSIHNmX21RbWZCdWZmZXI7Ci0KLX0gSFlCUklEOwotCi10eXBlZGVmIEhZQlJJRCAqSEFORExFX0hZQlJJRDsKLQotdm9pZAotZmlsbEh5YnJpZERlbGF5TGluZSggRklYUF9EQkwgKipmaXhwUW1mUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqZml4cFFtZkltYWcsCi0gICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgIGZpeHBIeWJyaWRMZWZ0UlsxMl0sCi0gICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgIGZpeHBIeWJyaWRMZWZ0SVsxMl0sCi0gICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgIGZpeHBIeWJyaWRSaWdodFJbMTJdLAotICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICBmaXhwSHlicmlkUmlnaHRJWzEyXSwKLSAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9IWUJSSUQgaEh5YnJpZCApOwotCi12b2lkCi1zbG90QmFzZWRIeWJyaWRBbmFseXNpcyAoIEZJWFBfREJMICpmaXhwUW1mUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmZpeHBRbWZJbWFnLAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqZml4cEh5YnJpZFJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqZml4cEh5YnJpZEltYWcsCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0hZQlJJRCBoSHlicmlkKTsKLQotCi12b2lkCi1zbG90QmFzZWRIeWJyaWRTeW50aGVzaXMgKCBGSVhQX0RCTCAgKmZpeHBIeWJyaWRSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpmaXhwSHlicmlkSW1hZywKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpmaXhwUW1mUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqZml4cFFtZkltYWcsCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9IWUJSSUQgaEh5YnJpZCApOwotCi1TQlJfRVJST1IgSW5pdEh5YnJpZEZpbHRlckJhbmsgKCBIQU5ETEVfSFlCUklEICBoSHlicmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgZnJhbWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgbm9CYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpwUmVzb2x1dGlvbiApOwotCi0KLSNlbmRpZiAvKiBfX0hZQlJJRF9IICovCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3BzZGVjcm9tX2RybS5jcHAgYi9saWJTQlJkZWMvc3JjL3BzZGVjcm9tX2RybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAzM2E4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNCUmRlYy9zcmMvcHNkZWNyb21fZHJtLmNwcApAQCAtMCwwICsxLDEwOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmICByb20gdGFibGVzIGZvciBEcm0gcGFyYW1ldHJpYyBzdGVyZW8gZGVjb2RlcgorKi8KKworI2luY2x1ZGUgInBzZGVjX2RybS5oIgpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9wdmNfZGVjLmNwcCBiL2xpYlNCUmRlYy9zcmMvcHZjX2RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3NzEyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNCUmRlYy9zcmMvcHZjX2RlYy5jcHAKQEAgLTAsMCArMSw2ODMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIE1hdHRoaWFzIEhpbGRlbmJyYW5kCisKKyAgIERlc2NyaXB0aW9uOiBEZWNvZGUgUHJlZGljdGl2ZSBWZWN0b3IgQ29kaW5nIERhdGEKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInB2Y19kZWMuaCIKKworLyogUFZDIGludGVyYWwgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgUFZDX0RJVk1PREVfQklUUyAzCisjZGVmaW5lIFBWQ19OU01PREVfQklUUyAxCisjZGVmaW5lIFBWQ19SRVVTRVBWQ0lEX0JJVFMgMQorI2RlZmluZSBQVkNfUFZDSURfQklUUyA3CisjZGVmaW5lIFBWQ19HUklESU5GT19CSVRTIDEKKyNkZWZpbmUgUFZDX05RTUZCQU5EIDY0CisjZGVmaW5lIFBWQ19OQkxPVyAzIC8qIG1heC4gbnVtYmVyIG9mIGdyb3VwZWQgUU1GIHN1YmJhbmRzIGJlbG93IFNCUiByYW5nZSAqLworCisjZGVmaW5lIFBWQ19OVEFCMSAzCisjZGVmaW5lIFBWQ19OVEFCMiAxMjgKKyNkZWZpbmUgUFZDX0lEX05CSVQgNworCisvKiBFeHBvbmVudCBvZiBwUHZjU3RhdGljRGF0YS0+RXNnIGFuZCBwcmVkaWN0ZWRFc2cgaW4gZEIgZG9tYWluLgorICAgbWF4KEVzZykgPSAxMCpsb2cxMCgyXjE1KjJeMTUpID0gOTAuMzA7CisgICBtaW4oRXNnKSA9IDEwKmxvZzEwKDAuMSkgPSAtMTAKKyAgIG1heCBvZiBwcmVkaWN0ZWQgRXNnIHNlZW1zIHRvIGJlIGhpZ2hlciB0aGFuIDkwZEIgYnV0IDcgQml0IHNob3VsZCBiZSBlbm91Z2guCisqLworI2RlZmluZSBQVkNfRVNHX0VYUCA3CisKKyNkZWZpbmUgTE9HMTBGQUMgMC43NTI1NzQ5ODkxNTk5NTNmICAgICAvKiA9PSAxMC9sb2cyKDEwKSAqIDJeLTIgKi8KKyNkZWZpbmUgTE9HMTBGQUNfSU5WIDAuNjY0Mzg1NjE4OTc3NDcyZiAvKiA9PSBsb2cyKDEwKS8xMCAqIDJeMSAqLworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorc3RhdGljIGNvbnN0IEZJWFBfU0dMIHB2Y19TQ18xNltdID0geworICAgIEZYX0RCTDJGWENPTlNUX1NHTCgweDE0NDEzNjk1KSwgRlhfREJMMkZYQ09OU1RfU0dMKDB4MTQzNGI2Y2IpLAorICAgIEZYX0RCTDJGWENPTlNUX1NHTCgweDE0MGYyN2M3KSwgRlhfREJMMkZYQ09OU1RfU0dMKDB4MTNkMDU5MWQpLAorICAgIEZYX0RCTDJGWENPTlNUX1NHTCgweDEzNzdmNTAyKSwgRlhfREJMMkZYQ09OU1RfU0dMKDB4MTMwNTc3ZDYpLAorICAgIEZYX0RCTDJGWENPTlNUX1NHTCgweDEyNzgyMjY2KSwgRlhfREJMMkZYQ09OU1RfU0dMKDB4MTFjZWU0NTkpLAorICAgIEZYX0RCTDJGWENPTlNUX1NHTCgweDExMDgzYTJhKSwgRlhfREJMMkZYQ09OU1RfU0dMKDB4MTAyMWY1ZTkpLAorICAgIEZYX0RCTDJGWENPTlNUX1NHTCgweDBmMThlMTdjKSwgRlhfREJMMkZYQ09OU1RfU0dMKDB4MGRlODE0Y2EpLAorICAgIEZYX0RCTDJGWENPTlNUX1NHTCgweDBjODdhNTY4KSwgRlhfREJMMkZYQ09OU1RfU0dMKDB4MGFlOWIxNjcpLAorICAgIEZYX0RCTDJGWENPTlNUX1NHTCgweDA4ZjI0MjI2KSwgRlhfREJMMkZYQ09OU1RfU0dMKDB4MDY1NzVlZDUpLAorfTsKKworUkFNX0FMSUdOCitMTktfU0VDVElPTl9DT05TVERBVEEKK3N0YXRpYyBjb25zdCBGSVhQX1NHTCBwdmNfU0NfMTJbXSA9IHsKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgxYWJhNmIzZSksIEZYX0RCTDJGWENPTlNUX1NHTCgweDFhOWQxNjRlKSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgxYTQ0ZDU2ZCksIEZYX0RCTDJGWENPTlNUX1NHTCgweDE5YjBkNzQyKSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgxOGRmOTY5YSksIEZYX0RCTDJGWENPTlNUX1NHTCgweDE3Y2U5MWEwKSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgxNjc5YzNmYSksIEZYX0RCTDJGWENPTlNUX1NHTCgweDE0ZGFhYmZjKSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgxMmU2NTIyMSksIEZYX0RCTDJGWENPTlNUX1NHTCgweDEwODhkMTI1KSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgwZDk5MDdiMyksIEZYX0RCTDJGWENPTlNUX1NHTCgweDA5YTgwZTlkKSwKK307CisKK1JBTV9BTElHTgorTE5LX1NFQ1RJT05fQ09OU1REQVRBCitzdGF0aWMgY29uc3QgRklYUF9TR0wgcHZjX1NDXzRbXSA9IHsKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHg0YWQ2YWIwZiksCisgICAgRlhfREJMMkZYQ09OU1RfU0dMKDB4NDdlZjBkYmUpLAorICAgIEZYX0RCTDJGWENPTlNUX1NHTCgweDNlZWU3NDk2KSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHgyZTRiZDI5ZCksCit9OworCitSQU1fQUxJR04KK0xOS19TRUNUSU9OX0NPTlNUREFUQQorc3RhdGljIGNvbnN0IEZJWFBfU0dMIHB2Y19TQ18zW10gPSB7CisgICAgRlhfREJMMkZYQ09OU1RfU0dMKDB4NjEwZGM3NjEpLAorICAgIEZYX0RCTDJGWENPTlNUX1NHTCgweDVhNTE5YTNkKSwKKyAgICBGWF9EQkwyRlhDT05TVF9TR0woMHg0NGEwOWU2MiksCit9OworCitzdGF0aWMgY29uc3QgVUNIQVIgZ18zYV9wdmNUYWIxX21vZGUxW1BWQ19OVEFCMV1bUFZDX05CTE9XXVtQVkNfTkJISUdIX01PREUxXSA9CisgICAge3t7MHg0RiwgMHg1QiwgMHg1NywgMHg1MiwgMHg0RCwgMHg2NSwgMHg0NSwgMHg1N30sCisgICAgICB7MHhGMywgMHgwRiwgMHgxOCwgMHgyMCwgMHgxOSwgMHg0RiwgMHgzRCwgMHgyM30sCisgICAgICB7MHg3OCwgMHg1NywgMHg1NSwgMHg1MCwgMHg1MCwgMHgyMCwgMHgzNiwgMHgzN319LAorICAgICB7ezB4NEMsIDB4NUYsIDB4NTMsIDB4MzcsIDB4MUUsIDB4RkQsIDB4MTUsIDB4MEF9LAorICAgICAgezB4MDUsIDB4MEUsIDB4MjgsIDB4NDEsIDB4NDgsIDB4NkUsIDB4NTQsIDB4NUJ9LAorICAgICAgezB4NTksIDB4NDcsIDB4NDAsIDB4NDAsIDB4M0QsIDB4MzMsIDB4M0YsIDB4Mzl9fSwKKyAgICAge3sweDQ3LCAweDVGLCAweDU3LCAweDM0LCAweDNDLCAweDJFLCAweDJFLCAweDMxfSwKKyAgICAgIHsweEZBLCAweDEzLCAweDIzLCAweDRFLCAweDQ0LCAweDdDLCAweDM0LCAweDM4fSwKKyAgICAgIHsweDYzLCAweDQzLCAweDQxLCAweDNELCAweDM1LCAweDE5LCAweDNELCAweDMzfX19OworCitzdGF0aWMgY29uc3QgVUNIQVIgZ18yYV9wdmNUYWIyX21vZGUxW1BWQ19OVEFCMl1bUFZDX05CSElHSF9NT0RFMV0gPSB7CisgICAgezB4Q0IsIDB4RDEsIDB4Q0MsIDB4RDIsIDB4RTIsIDB4RUIsIDB4RTcsIDB4RTh9LAorICAgIHsweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwfSwKKyAgICB7MHg4NCwgMHg4QywgMHg4OCwgMHg4MywgMHg5MCwgMHg5MywgMHg4NiwgMHg4MH0sCisgICAgezB4RDcsIDB4RDgsIDB4QzAsIDB4QzcsIDB4Q0YsIDB4RTUsIDB4RjEsIDB4RjZ9LAorICAgIHsweEE1LCAweEE2LCAweEFBLCAweEE4LCAweEIwLCAweEIxLCAweEI4LCAweEI4fSwKKyAgICB7MHhENywgMHhDQiwgMHhDMSwgMHhDMywgMHhDNSwgMHhDOSwgMHhDOSwgMHhDRX0sCisgICAgezB4Q0EsIDB4QjUsIDB4QjgsIDB4QjMsIDB4QUMsIDB4QjYsIDB4QkIsIDB4Qjh9LAorICAgIHsweEMxLCAweEM0LCAweEMzLCAweEM1LCAweEM2LCAweENBLCAweENBLCAweENCfSwKKyAgICB7MHhFMCwgMHhFMSwgMHhEOCwgMHhDRCwgMHhDQiwgMHhDQiwgMHhDRSwgMHhDQ30sCisgICAgezB4REIsIDB4RTEsIDB4REYsIDB4REIsIDB4REMsIDB4RDksIDB4RDksIDB4RDZ9LAorICAgIHsweEUwLCAweERFLCAweERELCAweERELCAweEUwLCAweEUzLCAweEU1LCAweEU2fSwKKyAgICB7MHhDQSwgMHhEMiwgMHhDRCwgMHhDRSwgMHhENSwgMHhEQiwgMHhEOSwgMHhEQn0sCisgICAgezB4RDIsIDB4RTAsIDB4REIsIDB4RDUsIDB4REIsIDB4REUsIDB4RTMsIDB4RTF9LAorICAgIHsweEU1LCAweERCLCAweEQwLCAweEQyLCAweEQ4LCAweERELCAweERCLCAweEREfSwKKyAgICB7MHhDMCwgMHhCNSwgMHhCRiwgMHhERCwgMHhFMywgMHhEQywgMHhEQywgMHhFNH0sCisgICAgezB4REIsIDB4Q0UsIDB4QzYsIDB4Q0YsIDB4Q0YsIDB4RDEsIDB4RDMsIDB4RDR9LAorICAgIHsweEM5LCAweEQ3LCAweERBLCAweEUyLCAweEU5LCAweEU3LCAweERGLCAweERDfSwKKyAgICB7MHgwQSwgMHgwNywgMHgwQSwgMHgwOCwgMHgxOSwgMHgyNCwgMHgxRiwgMHgyMn0sCisgICAgezB4MUUsIDB4MUYsIDB4MTEsIDB4MEUsIDB4MjIsIDB4MkQsIDB4MzMsIDB4MzJ9LAorICAgIHsweEYwLCAweERBLCAweERDLCAweDE4LCAweDFGLCAweDE5LCAweDBBLCAweDFFfSwKKyAgICB7MHgwOSwgMHhGOCwgMHhFNiwgMHgwNSwgMHgxOSwgMHgxMSwgMHgwRSwgMHgwQn0sCisgICAgezB4MDksIDB4MTAsIDB4MEUsIDB4RTYsIDB4RjQsIDB4MjAsIDB4MjIsIDB4RkF9LAorICAgIHsweEYyLCAweEU1LCAweEY4LCAweDBFLCAweDE4LCAweDE1LCAweDBELCAweDEwfSwKKyAgICB7MHgxNSwgMHgxMywgMHgxNiwgMHgwQSwgMHgwRCwgMHgxRiwgMHgxRCwgMHgxQn0sCisgICAgezB4RkEsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDksIDB4MTEsIDB4MDMsIDB4MEJ9LAorICAgIHsweEZFLCAweEZBLCAweEYyLCAweEY4LCAweDBDLCAweDFFLCAweDExLCAweDEyfSwKKyAgICB7MHhGQSwgMHhGOCwgMHgwQiwgMHgxNywgMHgxRCwgMHgxNywgMHgwRSwgMHgxNn0sCisgICAgezB4MDAsIDB4RjMsIDB4RkQsIDB4MEEsIDB4MUMsIDB4MTcsIDB4RkQsIDB4MDh9LAorICAgIHsweEVBLCAweEVBLCAweDAzLCAweDEyLCAweDFFLCAweDE0LCAweDA5LCAweDA0fSwKKyAgICB7MHgwMiwgMHhGRSwgMHgwNCwgMHhGQiwgMHgwQywgMHgwRSwgMHgwNywgMHgwMn0sCisgICAgezB4RjYsIDB4MDIsIDB4MDcsIDB4MEIsIDB4MTcsIDB4MTcsIDB4MDEsIDB4RkZ9LAorICAgIHsweEY1LCAweEZCLCAweEZFLCAweDA0LCAweDEyLCAweDE0LCAweDBDLCAweDBEfSwKKyAgICB7MHgxMCwgMHgxMCwgMHgwRSwgMHgwNCwgMHgwNywgMHgxMSwgMHgwRiwgMHgxM30sCisgICAgezB4MEMsIDB4MEYsIDB4RkIsIDB4RjIsIDB4MEEsIDB4MTIsIDB4MDksIDB4MER9LAorICAgIHsweDBELCAweDFELCAweEYxLCAweEY0LCAweDJBLCAweDA2LCAweDNCLCAweDMyfSwKKyAgICB7MHhGQywgMHgwOCwgMHgwNiwgMHgwMiwgMHgwRSwgMHgxNywgMHgwOCwgMHgwRX0sCisgICAgezB4MDcsIDB4MDIsIDB4RUUsIDB4RUUsIDB4MkIsIDB4RjYsIDB4MjMsIDB4MTN9LAorICAgIHsweDA0LCAweDAyLCAweDA1LCAweDA4LCAweDBCLCAweDBFLCAweEZCLCAweEZCfSwKKyAgICB7MHgwMCwgMHgwNCwgMHgxMCwgMHgxOCwgMHgyMiwgMHgyNSwgMHgxRCwgMHgxRn0sCisgICAgezB4RkIsIDB4MEQsIDB4MDcsIDB4MDAsIDB4MEMsIDB4MEYsIDB4RkMsIDB4MDJ9LAorICAgIHsweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDA1LCAweDA3LCAweDAzLCAweDA1fSwKKyAgICB7MHgwNCwgMHgwNSwgMHgwOCwgMHgxMywgMHhGRiwgMHhFQiwgMHgwQywgMHgwNn0sCisgICAgezB4MDUsIDB4MTMsIDB4MEUsIDB4MEIsIDB4MTIsIDB4MTUsIDB4MDksIDB4MEF9LAorICAgIHsweDA5LCAweDAzLCAweDA5LCAweDA1LCAweDEyLCAweDE2LCAweDExLCAweDEyfSwKKyAgICB7MHgxNCwgMHgxQSwgMHgwNiwgMHgwMSwgMHgxMCwgMHgxMSwgMHhGRSwgMHgwMn0sCisgICAgezB4MDEsIDB4MEIsIDB4MEIsIDB4MEMsIDB4MTgsIDB4MjEsIDB4MTAsIDB4MTN9LAorICAgIHsweDEyLCAweDBELCAweDBBLCAweDEwLCAweDFDLCAweDFELCAweDBELCAweDEwfSwKKyAgICB7MHgwMywgMHgwOSwgMHgxNCwgMHgxNSwgMHgxQiwgMHgxQSwgMHgwMSwgMHhGRn0sCisgICAgezB4MDgsIDB4MTIsIDB4MTMsIDB4MEUsIDB4MTYsIDB4MUQsIDB4MTQsIDB4MUJ9LAorICAgIHsweDA3LCAweDE1LCAweDFDLCAweDFCLCAweDIwLCAweDIxLCAweDExLCAweDBFfSwKKyAgICB7MHgxMiwgMHgxOCwgMHgxOSwgMHgxNywgMHgyMCwgMHgyNSwgMHgxQSwgMHgxRX0sCisgICAgezB4MEMsIDB4MUEsIDB4MUQsIDB4MjIsIDB4MkYsIDB4MzMsIDB4MjcsIDB4Mjh9LAorICAgIHsweDBFLCAweDFBLCAweDE3LCAweDEwLCAweDBBLCAweDBFLCAweEZGLCAweDA2fSwKKyAgICB7MHgxQSwgMHgxQywgMHgxOCwgMHgxNCwgMHgxQSwgMHgxNiwgMHgwQSwgMHgwRX0sCisgICAgezB4MUUsIDB4MjcsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MkEsIDB4MjEsIDB4MjF9LAorICAgIHsweEYxLCAweDBBLCAweDE2LCAweDFDLCAweDI4LCAweDI1LCAweDE1LCAweDE5fSwKKyAgICB7MHgwOCwgMHgxMiwgMHgwOSwgMHgwOCwgMHgxNiwgMHgxNywgMHhFRiwgMHhGNn0sCisgICAgezB4MEMsIDB4MEIsIDB4MDAsIDB4RkMsIDB4MDQsIDB4MDksIDB4RkMsIDB4MDN9LAorICAgIHsweEZCLCAweEYxLCAweEY4LCAweDI2LCAweDI0LCAweDE4LCAweDFELCAweDIwfSwKKyAgICB7MHhGOSwgMHgwMSwgMHgwQywgMHgwRiwgMHgwNywgMHgwOCwgMHgwNiwgMHgwN30sCisgICAgezB4MDcsIDB4MDYsIDB4MDgsIDB4MDQsIDB4MDcsIDB4MEQsIDB4MDcsIDB4MDl9LAorICAgIHsweEZFLCAweDAxLCAweDA2LCAweDA1LCAweDEzLCAweDFCLCAweDE0LCAweDE5fSwKKyAgICB7MHgwOSwgMHgwQywgMHgwRSwgMHgwMSwgMHgwOCwgMHgwNSwgMHhGQiwgMHhGRH0sCisgICAgezB4MDcsIDB4MDYsIDB4MDMsIDB4MEEsIDB4MTYsIDB4MTIsIDB4MDQsIDB4MDd9LAorICAgIHsweDA0LCAweDAxLCAweDAwLCAweDA0LCAweDFGLCAweDIwLCAweDBFLCAweDBBfSwKKyAgICB7MHgwMywgMHhGRiwgMHhGNiwgMHhGQiwgMHgxNSwgMHgxQSwgMHgwMCwgMHgwM30sCisgICAgezB4RkMsIDB4MTgsIDB4MEIsIDB4MkQsIDB4MzUsIDB4MjMsIDB4MTIsIDB4MDl9LAorICAgIHsweDAyLCAweEZFLCAweDAxLCAweEZGLCAweDBDLCAweDExLCAweDBELCAweDBGfSwKKyAgICB7MHhGQSwgMHhFOSwgMHhEOSwgMHhGRiwgMHgwRCwgMHgwNSwgMHgwRCwgMHgxMH0sCisgICAgezB4RjEsIDB4RTAsIDB4RjAsIDB4MDEsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MTB9LAorICAgIHsweEU5LCAweEQ0LCAweEQ3LCAweDBGLCAweDE0LCAweDBCLCAweDBELCAweDE2fSwKKyAgICB7MHgwMCwgMHhGRiwgMHhFRSwgMHhFNSwgMHhGRiwgMHgwOCwgMHgwMiwgMHhGOX0sCisgICAgezB4RTAsIDB4REEsIDB4RTUsIDB4RkUsIDB4MDksIDB4MDIsIDB4RjksIDB4MDR9LAorICAgIHsweEUwLCAweEUyLCAweEY0LCAweDA5LCAweDEzLCAweDBDLCAweDBELCAweDA5fSwKKyAgICB7MHhGQywgMHgwMiwgMHgwNCwgMHhGRiwgMHgwMCwgMHhGRiwgMHhGOCwgMHhGN30sCisgICAgezB4RkUsIDB4RkIsIDB4RUQsIDB4RjIsIDB4RkUsIDB4RkUsIDB4MDgsIDB4MEN9LAorICAgIHsweEYzLCAweEVGLCAweEQwLCAweEUzLCAweDA1LCAweDExLCAweEZELCAweEZGfSwKKyAgICB7MHhGQSwgMHhFRiwgMHhFQSwgMHhGRSwgMHgwRCwgMHgwRSwgMHhGRSwgMHgwMn0sCisgICAgezB4RjcsIDB4RkIsIDB4REIsIDB4REYsIDB4MTQsIDB4REQsIDB4MDcsIDB4RkV9LAorICAgIHsweEZFLCAweDA4LCAweDAwLCAweERCLCAweEU1LCAweDFBLCAweDEzLCAweEVEfSwKKyAgICB7MHhGOSwgMHhGRSwgMHhGRiwgMHhGNCwgMHhGMywgMHgwMCwgMHgwNSwgMHgwMn0sCisgICAgezB4RUYsIDB4REUsIDB4RDgsIDB4RUIsIDB4RUEsIDB4RjUsIDB4MEUsIDB4MTl9LAorICAgIHsweEZCLCAweEZDLCAweEZBLCAweEVDLCAweEVCLCAweEVELCAweEVFLCAweEU4fSwKKyAgICB7MHhFRSwgMHhGQywgMHhGRCwgMHgwMCwgMHgwNCwgMHhGQywgMHhGMCwgMHhGNX0sCisgICAgezB4MDAsIDB4RkEsIDB4RjQsIDB4RjEsIDB4RjUsIDB4RkEsIDB4RkIsIDB4Rjl9LAorICAgIHsweEVCLCAweEYwLCAweERGLCAweEUzLCAweEVGLCAweDA3LCAweDAyLCAweDA1fSwKKyAgICB7MHhGNywgMHhGMCwgMHhFNiwgMHhFNywgMHgwNiwgMHgxNSwgMHgwNiwgMHgwQ30sCisgICAgezB4RjEsIDB4RTQsIDB4RDgsIDB4RUEsIDB4MDYsIDB4RjIsIDB4MDcsIDB4MDl9LAorICAgIHsweEZGLCAweEZFLCAweEZFLCAweEY5LCAweEZGLCAweEZGLCAweDAyLCAweEY5fSwKKyAgICB7MHhERCwgMHhGNCwgMHhGMCwgMHhGMSwgMHhGRiwgMHhGRiwgMHhFQSwgMHhGMX0sCisgICAgezB4RjAsIDB4RjEsIDB4RkQsIDB4MDMsIDB4MDMsIDB4RkUsIDB4MDAsIDB4MDV9LAorICAgIHsweEYxLCAweEY2LCAweEUwLCAweERGLCAweEY1LCAweDAxLCAweEY0LCAweEY4fSwKKyAgICB7MHgwMiwgMHgwMywgMHhFNSwgMHhEQywgMHhFNywgMHhGRCwgMHgwMiwgMHgwOH0sCisgICAgezB4RUMsIDB4RjEsIDB4RjUsIDB4RUMsIDB4RjIsIDB4RjgsIDB4RjYsIDB4RUV9LAorICAgIHsweEYzLCAweEY0LCAweEY2LCAweEY0LCAweEY1LCAweEYxLCAweEU3LCAweEVBfSwKKyAgICB7MHhGNywgMHhGMywgMHhFQywgMHhFQSwgMHhFRiwgMHhGMCwgMHhFRSwgMHhGMX0sCisgICAgezB4RUIsIDB4RjYsIDB4RkIsIDB4RkEsIDB4RUYsIDB4RjMsIDB4RjMsIDB4Rjd9LAorICAgIHsweDAxLCAweDAzLCAweEYxLCAweEY2LCAweDA1LCAweEY4LCAweEUxLCAweEVCfSwKKyAgICB7MHhGNSwgMHhGNiwgMHhGNiwgMHhGNCwgMHhGQiwgMHhGQiwgMHhGRiwgMHgwMH0sCisgICAgezB4RjgsIDB4MDEsIDB4RkIsIDB4RkEsIDB4RkYsIDB4MDMsIDB4RkUsIDB4MDR9LAorICAgIHsweDA0LCAweEZCLCAweDAzLCAweEZELCAweEY1LCAweEY3LCAweEY2LCAweEZCfSwKKyAgICB7MHgwNiwgMHgwOSwgMHhGQiwgMHhGNCwgMHhGOSwgMHhGQSwgMHhGQywgMHhGRn0sCisgICAgezB4RjUsIDB4RjYsIDB4RjEsIDB4RUUsIDB4RjUsIDB4RjgsIDB4RjUsIDB4Rjl9LAorICAgIHsweEY1LCAweEY5LCAweEZBLCAweEZDLCAweDA3LCAweDA5LCAweDAxLCAweEZCfSwKKyAgICB7MHhENywgMHhFOSwgMHhFOCwgMHhFQywgMHgwMCwgMHgwQywgMHhGRSwgMHhGMX0sCisgICAgezB4RUMsIDB4MDQsIDB4RTksIDB4REYsIDB4MDMsIDB4RTgsIDB4MDAsIDB4RkF9LAorICAgIHsweEU2LCAweEUyLCAweEZGLCAweDBBLCAweDEzLCAweDAxLCAweDAwLCAweEY3fSwKKyAgICB7MHhGMSwgMHhGQSwgMHhGNywgMHhGNSwgMHgwMSwgMHgwNiwgMHgwNSwgMHgwQX0sCisgICAgezB4RjYsIDB4RjYsIDB4RkMsIDB4RjYsIDB4RTgsIDB4MTEsIDB4RjIsIDB4RkV9LAorICAgIHsweEZFLCAweDA4LCAweDA1LCAweDEyLCAweEZELCAweEQwLCAweDBFLCAweDA3fSwKKyAgICB7MHhGMSwgMHhGRSwgMHhGNywgMHhGMiwgMHhGQiwgMHgwMiwgMHhGQSwgMHhGOH0sCisgICAgezB4RjQsIDB4RUEsIDB4RUMsIDB4RjMsIDB4RkUsIDB4MDEsIDB4RjcsIDB4RjZ9LAorICAgIHsweEZGLCAweEZBLCAweEZCLCAweEY5LCAweEZGLCAweDAxLCAweDA0LCAweDAzfSwKKyAgICB7MHgwMCwgMHhGOSwgMHhGNCwgMHhGQywgMHgwNSwgMHhGQywgMHhGNywgMHhGQn0sCisgICAgezB4RjgsIDB4RkYsIDB4RUYsIDB4RUMsIDB4RkIsIDB4MDQsIDB4RjgsIDB4MDN9LAorICAgIHsweEVCLCAweEYxLCAweEVELCAweEY0LCAweDAyLCAweDBFLCAweDBCLCAweDA0fSwKKyAgICB7MHhGNywgMHgwMSwgMHhGOCwgMHhGNCwgMHhGOCwgMHhFRiwgMHhGOCwgMHgwNH0sCisgICAgezB4RUIsIDB4RjAsIDB4RjcsIDB4RkMsIDB4MTAsIDB4MEQsIDB4RjgsIDB4Rjh9LAorICAgIHsweEU4LCAweEZFLCAweEVFLCAweEU4LCAweEVELCAweEY3LCAweEY1LCAweEY4fSwKKyAgICB7MHhFRCwgMHhFQiwgMHhFOSwgMHhFQSwgMHhGMiwgMHhGNSwgMHhGNCwgMHhGOX0sCisgICAgezB4RUEsIDB4RjIsIDB4RUYsIDB4RUUsIDB4RjksIDB4RkUsIDB4RkQsIDB4MDJ9LAorICAgIHsweEZBLCAweEZELCAweDAyLCAweDBELCAweEZBLCAweEU0LCAweDBGLCAweDAxfSwKKyAgICB7MHhGRiwgMHgwOCwgMHgwNSwgMHhGNiwgMHhGNywgMHhGQiwgMHhGMSwgMHhGMX0sCisgICAgezB4RjQsIDB4RUMsIDB4RUUsIDB4RjYsIDB4RUUsIDB4RUUsIDB4RjgsIDB4MDZ9LAorICAgIHsweEU4LCAweEZBLCAweEY4LCAweEU4LCAweEY4LCAweEU5LCAweEVFLCAweEY5fSwKKyAgICB7MHhFNSwgMHhFOSwgMHhGMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhGMywgMHhGOH0sCisgICAgezB4RjcsIDB4RkIsIDB4RkIsIDB4RjcsIDB4RjksIDB4RjksIDB4RjUsIDB4RjB9LAorICAgIHsweEZELCAweEZGLCAweEYyLCAweEVFLCAweEYyLCAweEY1LCAweEYxLCAweEYzfX07CisKK3N0YXRpYyBjb25zdCBVQ0hBUiBnXzNhX3B2Y1RhYjFfbW9kZTJbUFZDX05UQUIxXVtQVkNfTkJMT1ddW1BWQ19OQkhJR0hfTU9ERTJdID0KKyAgICB7e3sweDExLCAweDI3LCAweDBGLCAweEZELCAweDA0LCAweEZDfSwKKyAgICAgIHsweDAwLCAweEJFLCAweEUzLCAweEY0LCAweERCLCAweEYwfSwKKyAgICAgIHsweDA5LCAweDFFLCAweDE4LCAweDFBLCAweDIxLCAweDFCfX0sCisgICAgIHt7MHgxNiwgMHgyOCwgMHgyQiwgMHgyOSwgMHgyNSwgMHgzMn0sCisgICAgICB7MHhGMiwgMHhFOSwgMHhFNCwgMHhFNSwgMHhFMiwgMHhENH0sCisgICAgICB7MHgwRSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRCwgMHgwRX19LAorICAgICB7ezB4MkUsIDB4M0MsIDB4MjAsIDB4MTYsIDB4MUIsIDB4MUF9LAorICAgICAgezB4RTQsIDB4QzYsIDB4RTUsIDB4RjQsIDB4REMsIDB4REN9LAorICAgICAgezB4MEYsIDB4MUIsIDB4MTgsIDB4MTQsIDB4MUUsIDB4MUF9fX07CisKK3N0YXRpYyBjb25zdCBVQ0hBUiBnXzJhX3B2Y1RhYjJfbW9kZTJbUFZDX05UQUIyXVtQVkNfTkJISUdIX01PREUyXSA9IHsKKyAgICB7MHgyNiwgMHgyNSwgMHgxMSwgMHgwQywgMHhGQSwgMHgxNX0sIHsweDFCLCAweDE4LCAweDExLCAweDBFLCAweDBFLCAweDBFfSwKKyAgICB7MHgxMiwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMSwgMHgxMH0sIHsweDFFLCAweDI0LCAweDE5LCAweDE1LCAweDE0LCAweDEyfSwKKyAgICB7MHgyNCwgMHgxNiwgMHgxMiwgMHgxMywgMHgxNSwgMHgxQ30sIHsweEVBLCAweEVELCAweEVCLCAweEVBLCAweEVDLCAweEVCfSwKKyAgICB7MHhGQywgMHhGRCwgMHhGRCwgMHhGQywgMHhGRSwgMHhGRX0sIHsweDBGLCAweDBDLCAweDBCLCAweDBBLCAweDBCLCAweDBCfSwKKyAgICB7MHgyMiwgMHgwQiwgMHgxNiwgMHgxOCwgMHgxMywgMHgxOX0sIHsweDFDLCAweDE0LCAweDFELCAweDIwLCAweDE5LCAweDFBfSwKKyAgICB7MHgxMCwgMHgwOCwgMHgwMCwgMHhGRiwgMHgwMiwgMHgwNX0sIHsweDA2LCAweDA3LCAweDA1LCAweDAzLCAweDA1LCAweDA0fSwKKyAgICB7MHgyQSwgMHgxRiwgMHgxMiwgMHgxMiwgMHgxMSwgMHgxOH0sIHsweDE5LCAweDE5LCAweDAyLCAweDA0LCAweDAwLCAweDA0fSwKKyAgICB7MHgxOCwgMHgxNywgMHgxNywgMHgxNSwgMHgxNiwgMHgxNX0sIHsweDIxLCAweDFFLCAweDFCLCAweDE5LCAweDFDLCAweDFCfSwKKyAgICB7MHgzQywgMHgzNSwgMHgyMCwgMHgxRCwgMHgzMCwgMHgzNH0sIHsweDNBLCAweDFGLCAweDM3LCAweDM4LCAweDMzLCAweDMxfSwKKyAgICB7MHgzNywgMHgzNCwgMHgyNSwgMHgyNywgMHgzNSwgMHgzNH0sIHsweDM0LCAweDJFLCAweDMyLCAweDMxLCAweDM0LCAweDMxfSwKKyAgICB7MHgzNiwgMHgzMywgMHgyRiwgMHgyRiwgMHgzMiwgMHgyRn0sIHsweDM1LCAweDIwLCAweDJGLCAweDMyLCAweDJGLCAweDJDfSwKKyAgICB7MHgyRSwgMHgyQiwgMHgyRiwgMHgzNCwgMHgzNiwgMHgzMH0sIHsweDNGLCAweDM5LCAweDMwLCAweDI4LCAweDI5LCAweDI5fSwKKyAgICB7MHgzQywgMHgzMCwgMHgzMiwgMHgzNywgMHgzOSwgMHgzNn0sIHsweDM3LCAweDM2LCAweDMwLCAweDJCLCAweDI2LCAweDI0fSwKKyAgICB7MHg0NCwgMHgzOCwgMHgyRiwgMHgyRCwgMHgyRCwgMHgyRH0sIHsweDM4LCAweDJCLCAweDJDLCAweDJDLCAweDMwLCAweDJEfSwKKyAgICB7MHgzNywgMHgzNiwgMHgyRiwgMHgyMywgMHgyRCwgMHgzMn0sIHsweDNDLCAweDM5LCAweDI5LCAweDJFLCAweDM4LCAweDM3fSwKKyAgICB7MHgzQiwgMHgzQSwgMHgzNSwgMHgzMiwgMHgzMSwgMHgyRH0sIHsweDMyLCAweDMxLCAweDJGLCAweDJDLCAweDJELCAweDI4fSwKKyAgICB7MHgyQywgMHgzMSwgMHgzMiwgMHgzMCwgMHgzMiwgMHgyRH0sIHsweDM1LCAweDM0LCAweDM0LCAweDM0LCAweDM1LCAweDMzfSwKKyAgICB7MHgzNCwgMHgzOCwgMHgzQiwgMHgzQywgMHgzRSwgMHgzQX0sIHsweDNFLCAweDNDLCAweDNCLCAweDNBLCAweDNDLCAweDM5fSwKKyAgICB7MHgzRCwgMHg0MSwgMHg0NiwgMHg0MSwgMHgzRCwgMHgzOH0sIHsweDQ0LCAweDQxLCAweDQwLCAweDNFLCAweDNGLCAweDNBfSwKKyAgICB7MHg0NywgMHg0NywgMHg0NywgMHg0MiwgMHg0NCwgMHg0MH0sIHsweDRDLCAweDRBLCAweDRBLCAweDQ2LCAweDQ5LCAweDQ1fSwKKyAgICB7MHg1MywgMHg1MiwgMHg1MiwgMHg0QywgMHg0RSwgMHg0OX0sIHsweDQxLCAweDNELCAweDM5LCAweDJDLCAweDJFLCAweDJFfSwKKyAgICB7MHgyRCwgMHgzNywgMHgzNiwgMHgzMCwgMHgyOCwgMHgzNn0sIHsweDNCLCAweDMyLCAweDJFLCAweDJELCAweDJELCAweDI5fSwKKyAgICB7MHg0MCwgMHgzOSwgMHgzNiwgMHgzNSwgMHgzNiwgMHgzMn0sIHsweDMwLCAweDJELCAweDJELCAweDJFLCAweDMxLCAweDMwfSwKKyAgICB7MHgzOCwgMHgzRCwgMHgzQiwgMHgzNywgMHgzNSwgMHgzNH0sIHsweDQ0LCAweDNELCAweDNDLCAweDM4LCAweDM3LCAweDMzfSwKKyAgICB7MHgzQSwgMHgzNiwgMHgzNywgMHgzNywgMHgzOSwgMHgzNn0sIHsweDMyLCAweDM2LCAweDM3LCAweDMwLCAweDJFLCAweDJBfSwKKyAgICB7MHgzQywgMHgzMywgMHgzMywgMHgzMSwgMHgzMywgMHgzMH0sIHsweDMwLCAweDMxLCAweDM2LCAweDM3LCAweDM4LCAweDM0fSwKKyAgICB7MHgyNiwgMHgyNywgMHgyRSwgMHgyOSwgMHgxQywgMHgxNn0sIHsweDE0LCAweDE1LCAweDFGLCAweDE3LCAweDE1LCAweDFDfSwKKyAgICB7MHgzOCwgMHgyRCwgMHgxOCwgMHgxMywgMHgxRSwgMHgyQn0sIHsweDMwLCAweDIyLCAweDE3LCAweDFBLCAweDI2LCAweDJCfSwKKyAgICB7MHgyNCwgMHgyMCwgMHgxRiwgMHgxMCwgMHgwQywgMHgxMX0sIHsweDI3LCAweDFGLCAweDEzLCAweDE3LCAweDI0LCAweDJBfSwKKyAgICB7MHgyRiwgMHgxMywgMHgxOCwgMHgxMywgMHgyQSwgMHgzMn0sIHsweDMxLCAweDFFLCAweDFFLCAweDFFLCAweDIxLCAweDI4fSwKKyAgICB7MHgyQSwgMHgxMiwgMHgxOSwgMHgxNywgMHgxNiwgMHgyNH0sIHsweDI3LCAweDBGLCAweDE2LCAweDFELCAweDE3LCAweDFDfSwKKyAgICB7MHgyRiwgMHgyNiwgMHgyNSwgMHgyMiwgMHgyMCwgMHgyMn0sIHsweDFFLCAweDFCLCAweDFFLCAweDE4LCAweDFFLCAweDI0fSwKKyAgICB7MHgzMSwgMHgyNiwgMHgwRSwgMHgxNSwgMHgxNSwgMHgyNX0sIHsweDJELCAweDIyLCAweDFFLCAweDE0LCAweDEwLCAweDIyfSwKKyAgICB7MHgyNSwgMHgxQiwgMHgxOCwgMHgxMSwgMHgxMywgMHgxRn0sIHsweDJGLCAweDFCLCAweDEzLCAweDFCLCAweDE4LCAweDIyfSwKKyAgICB7MHgyMSwgMHgyNCwgMHgxRCwgMHgxQywgMHgxRCwgMHgxQn0sIHsweDIzLCAweDFFLCAweDI4LCAweDI5LCAweDI3LCAweDI1fSwKKyAgICB7MHgyRSwgMHgyQSwgMHgxRCwgMHgxNywgMHgyNiwgMHgyRH0sIHsweDMxLCAweDJDLCAweDFBLCAweDBFLCAweDFBLCAweDI0fSwKKyAgICB7MHgyNiwgMHgxNiwgMHgyMCwgMHgxRCwgMHgxNCwgMHgxRX0sIHsweDI5LCAweDIwLCAweDFCLCAweDFCLCAweDE3LCAweDE3fSwKKyAgICB7MHgxRCwgMHgwNiwgMHgxQSwgMHgxRSwgMHgxQiwgMHgxRH0sIHsweDJCLCAweDIzLCAweDFGLCAweDFGLCAweDFELCAweDFDfSwKKyAgICB7MHgyNywgMHgxQSwgMHgwQywgMHgwRSwgMHgwRiwgMHgxQX0sIHsweDI5LCAweDFELCAweDFFLCAweDIyLCAweDIyLCAweDI0fSwKKyAgICB7MHgyMCwgMHgyMSwgMHgxQiwgMHgxOCwgMHgxMywgMHgyMX0sIHsweDI3LCAweDBFLCAweDEwLCAweDE0LCAweDEwLCAweDFBfSwKKyAgICB7MHgyNiwgMHgyNCwgMHgyNSwgMHgyNSwgMHgyNiwgMHgyOH0sIHsweDFBLCAweDI0LCAweDI1LCAweDI5LCAweDI2LCAweDI0fSwKKyAgICB7MHgxRCwgMHgxRCwgMHgxNSwgMHgxMiwgMHgwRiwgMHgxOH0sIHsweDFFLCAweDE0LCAweDEzLCAweDEyLCAweDE0LCAweDE4fSwKKyAgICB7MHgxNiwgMHgxMywgMHgxMywgMHgxQSwgMHgxQiwgMHgxRH0sIHsweDIwLCAweDI3LCAweDIyLCAweDI0LCAweDFBLCAweDE5fSwKKyAgICB7MHgxRiwgMHgxNywgMHgxOSwgMHgxOCwgMHgxNywgMHgxOH0sIHsweDIwLCAweDFCLCAweDFDLCAweDFDLCAweDFCLCAweDFBfSwKKyAgICB7MHgyMywgMHgxOSwgMHgxRCwgMHgxRiwgMHgxRSwgMHgyMX0sIHsweDI2LCAweDFGLCAweDFELCAweDFCLCAweDE5LCAweDFBfSwKKyAgICB7MHgyMywgMHgxRSwgMHgxRiwgMHgyMCwgMHgxRiwgMHgxRX0sIHsweDI5LCAweDIwLCAweDIyLCAweDIwLCAweDIwLCAweDFGfSwKKyAgICB7MHgyNiwgMHgyMywgMHgyMSwgMHgyMiwgMHgyMywgMHgyM30sIHsweDI5LCAweDFGLCAweDI0LCAweDI1LCAweDI2LCAweDI5fSwKKyAgICB7MHgyQiwgMHgyMiwgMHgyNSwgMHgyNywgMHgyMywgMHgyMX0sIHsweDI5LCAweDIxLCAweDE5LCAweDBFLCAweDIyLCAweDJEfSwKKyAgICB7MHgzMiwgMHgyOSwgMHgxRiwgMHgxQywgMHgxQiwgMHgyMX0sIHsweDFFLCAweDFBLCAweDFFLCAweDI0LCAweDI1LCAweDI1fSwKKyAgICB7MHgyNCwgMHgxRCwgMHgyMSwgMHgyMiwgMHgyMiwgMHgyNX0sIHsweDJDLCAweDI1LCAweDIxLCAweDIyLCAweDIzLCAweDI1fSwKKyAgICB7MHgyNCwgMHgxRSwgMHgyMSwgMHgyNiwgMHgyQiwgMHgyQ30sIHsweDI4LCAweDI0LCAweDFCLCAweDFGLCAweDI4LCAweDJEfSwKKyAgICB7MHgyMywgMHgxMywgMHgxNiwgMHgyMiwgMHgyMiwgMHgyOX0sIHsweDFCLCAweDIzLCAweDFDLCAweDIwLCAweDE0LCAweDBEfSwKKyAgICB7MHgxRSwgMHgxNiwgMHgxQSwgMHgxRSwgMHgxQywgMHgxRH0sIHsweDJCLCAweDFDLCAweDFELCAweDIwLCAweDFCLCAweDFDfSwKKyAgICB7MHgxQywgMHgxQiwgMHgyMywgMHgxRiwgMHgxOSwgMHgxRX0sIHsweDIxLCAweDIzLCAweDI2LCAweDIwLCAweDIwLCAweDIyfSwKKyAgICB7MHgxRCwgMHgwQiwgMHgxOSwgMHgxRSwgMHgxMSwgMHgxOX0sIHsweDE4LCAweDE3LCAweDE2LCAweDE3LCAweDE0LCAweDE2fSwKKyAgICB7MHgxNiwgMHgxOSwgMHgxQywgMHgyMCwgMHgyMSwgMHgyMn0sIHsweDMwLCAweDFFLCAweDIyLCAweDI0LCAweDI1LCAweDI2fSwKKyAgICB7MHgxQiwgMHgxRiwgMHgxNywgMHgxRCwgMHgxRSwgMHgyMX0sIHsweDMyLCAweDJCLCAweDI3LCAweDFGLCAweDFCLCAweDFBfSwKKyAgICB7MHgyOCwgMHgyMCwgMHgxQSwgMHgxQiwgMHgxRiwgMHgyM30sIHsweDMyLCAweDIxLCAweDIwLCAweDIxLCAweDFELCAweDFGfSwKKyAgICB7MHgyMiwgMHgxOCwgMHgxMiwgMHgxNSwgMHgxQiwgMHgyMH0sIHsweDI3LCAweDI3LCAweDJBLCAweDI0LCAweDIxLCAweDIxfSwKKyAgICB7MHgxRSwgMHgwRiwgMHgwRCwgMHgxQSwgMHgxRCwgMHgyM30sIHsweDI4LCAweDI1LCAweDI3LCAweDIxLCAweDE3LCAweDI1fSwKKyAgICB7MHgyQiwgMHgyNywgMHgyMywgMHgxOSwgMHgxMywgMHgxNH0sIHsweDI1LCAweDJCLCAweDIyLCAweDIyLCAweDIwLCAweDIxfSwKKyAgICB7MHgyNywgMHgxQiwgMHgxNiwgMHgxNywgMHgwRiwgMHgxNX0sIHsweDI5LCAweDI2LCAweDIzLCAweDE1LCAweDFFLCAweDI4fSwKKyAgICB7MHgyNCwgMHgxQywgMHgxOSwgMHgxQSwgMHgxOCwgMHgxOX0sIHsweDJELCAweDE1LCAweDI3LCAweDJCLCAweDI0LCAweDIzfSwKKyAgICB7MHgyQywgMHgxMiwgMHgxRiwgMHgyMywgMHgxRiwgMHgyMH0sIHsweDI1LCAweDBGLCAweDIyLCAweDI3LCAweDFGLCAweDIxfX07CisKK3N0YXRpYyBjb25zdCBVQ0hBUiBnX2FfcHZjVGFiMV9kcF9tb2RlMVtQVkNfTlRBQjEgLSAxXSA9IHsxNywgNjh9Oworc3RhdGljIGNvbnN0IFVDSEFSIGdfYV9wdmNUYWIxX2RwX21vZGUyW1BWQ19OVEFCMSAtIDFdID0gezE2LCA1Mn07CisvKiBmcmFjdGlvbmFsIGV4cG9uZW50IHdoaWNoIGNvcnJlc3BvbmRzIHRvIFEgcmVwcmVzZW50YXRpb24gdmFsdWUgKi8KK3N0YXRpYyBjb25zdCBTQ0hBUiBnX2Ffc2NhbGluZ0NvZWZfbW9kZTFbUFZDX05CTE9XICsgMV0gPSB7CisgICAgLTEsIC0xLCAwLCA2fTsgLyogeyA4LCA4LCA3LCAxIH07IFEgc2NhbGluZyAqLworc3RhdGljIGNvbnN0IFNDSEFSIGdfYV9zY2FsaW5nQ29lZl9tb2RlMltQVkNfTkJMT1cgKyAxXSA9IHsKKyAgICAwLCAwLCAxLCA3fTsgLyogeyA3LCA3LCA2LCAwIH07IFEgc2NhbGluZyAqLworCitpbnQgcHZjSW5pdEZyYW1lKFBWQ19TVEFUSUNfREFUQSAqcFB2Y1N0YXRpY0RhdGEsCisgICAgICAgICAgICAgICAgIFBWQ19EWU5BTUlDX0RBVEEgKnBQdmNEeW5hbWljRGF0YSwgY29uc3QgVUNIQVIgcHZjTW9kZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgbnMsIGNvbnN0IGludCBSQVRFLCBjb25zdCBpbnQga3gsCisgICAgICAgICAgICAgICAgIGNvbnN0IGludCBwdmNCb3JkZXIwLCBjb25zdCBVQ0hBUiAqcFB2Y0lEKSB7CisgIGludCBsYncsIGhidywgaSwgdGVtcDsKKyAgcFB2Y0R5bmFtaWNEYXRhLT5wdmNfbW9kZSA9IHB2Y01vZGU7CisgIHBQdmNEeW5hbWljRGF0YS0+a3ggPSBreDsKKyAgcFB2Y0R5bmFtaWNEYXRhLT5SQVRFID0gUkFURTsKKworICBzd2l0Y2ggKHB2Y01vZGUpIHsKKyAgICBjYXNlIDA6CisgICAgICAvKiBsZWdhY3kgU0JSLCBub3RoaW5nIHRvIGRvICovCisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIDE6CisgICAgICBwUHZjRHluYW1pY0RhdGEtPm5iSGlnaCA9IDg7CisgICAgICBwUHZjRHluYW1pY0RhdGEtPnBQVkNUYWIxID0gKGNvbnN0IFVDSEFSICopZ18zYV9wdmNUYWIxX21vZGUxOworICAgICAgcFB2Y0R5bmFtaWNEYXRhLT5wUFZDVGFiMiA9IChjb25zdCBVQ0hBUiAqKWdfMmFfcHZjVGFiMl9tb2RlMTsKKyAgICAgIHBQdmNEeW5hbWljRGF0YS0+cFBWQ1RhYjFfZHAgPSBnX2FfcHZjVGFiMV9kcF9tb2RlMTsKKyAgICAgIHBQdmNEeW5hbWljRGF0YS0+cFNjYWxpbmdDb2VmID0gZ19hX3NjYWxpbmdDb2VmX21vZGUxOworICAgICAgaGJ3ID0gOCAvIFJBVEU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBwUHZjRHluYW1pY0RhdGEtPm5iSGlnaCA9IDY7CisgICAgICBwUHZjRHluYW1pY0RhdGEtPnBQVkNUYWIxID0gKGNvbnN0IFVDSEFSICopZ18zYV9wdmNUYWIxX21vZGUyOworICAgICAgcFB2Y0R5bmFtaWNEYXRhLT5wUFZDVGFiMiA9IChjb25zdCBVQ0hBUiAqKWdfMmFfcHZjVGFiMl9tb2RlMjsKKyAgICAgIHBQdmNEeW5hbWljRGF0YS0+cFBWQ1RhYjFfZHAgPSBnX2FfcHZjVGFiMV9kcF9tb2RlMjsKKyAgICAgIHBQdmNEeW5hbWljRGF0YS0+cFNjYWxpbmdDb2VmID0gZ19hX3NjYWxpbmdDb2VmX21vZGUyOworICAgICAgaGJ3ID0gMTIgLyBSQVRFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIGludmFsaWQgcHZjTW9kZSAqLworICAgICAgcmV0dXJuIDE7CisgIH0KKworICBwUHZjRHluYW1pY0RhdGEtPnB2Y0JvcmRlcjAgPSBwdmNCb3JkZXIwOworICBVQ0hBUiBwdmNCb3JkZXIwX2xhc3QgPSBwUHZjU3RhdGljRGF0YS0+cHZjQm9yZGVyMDsKKyAgcFB2Y1N0YXRpY0RhdGEtPnB2Y0JvcmRlcjAgPSBwdmNCb3JkZXIwOworICBwUHZjRHluYW1pY0RhdGEtPnBQdmNJRCA9IHBQdmNJRDsKKworICBwUHZjRHluYW1pY0RhdGEtPm5zID0gbnM7CisgIHN3aXRjaCAobnMpIHsKKyAgICBjYXNlIDE2OgorICAgICAgcFB2Y0R5bmFtaWNEYXRhLT5wU0Njb2VmZnMgPSBwdmNfU0NfMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyOgorICAgICAgcFB2Y0R5bmFtaWNEYXRhLT5wU0Njb2VmZnMgPSBwdmNfU0NfMTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBwUHZjRHluYW1pY0RhdGEtPnBTQ2NvZWZmcyA9IHB2Y19TQ180OworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgcFB2Y0R5bmFtaWNEYXRhLT5wU0Njb2VmZnMgPSBwdmNfU0NfMzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMTsKKyAgfQorCisgIC8qIGluIHRoZSBsb3dlciBwYXJ0IG9mIEVzZy1hcnJheSB0aGVyZSBhcmUgcHJldmlvdXMgdmFsdWVzIG9mIEVzZyAoZnJvbSBsYXN0CisgICAgIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBJbiBjYXNlIG9mIGFuIHByZXZpb3VzIGxlZ2F5LVNCUiBmcmFtZSwgb3IgaWYgdGhlcmUKKyAgICAgd2FzIGEgY2hhbmdlIGluIGNyb3NzLW92ZXIgRlEgdGhlIHZhbHVlIG9mIGZpcnN0IFBWQyBTQlIgdGltZXNsb3QgaXMKKyAgICAgcHJvcGFnYXRlZCB0byBwcmV2LXZhbHVlcyBpbiBvcmRlciB0byBoYXZlIHJlYXNvbmFibGUgdmFsdWVzIGZvcgorICAgICBzbW9vdGgtZmlsdGVyaW5nCisgICovCisgIGlmICgocFB2Y1N0YXRpY0RhdGEtPnB2Y19tb2RlX2xhc3QgPT0gMCkgfHwgKHBQdmNTdGF0aWNEYXRhLT5reF9sYXN0ICE9IGt4KSkgeworICAgIHBQdmNEeW5hbWljRGF0YS0+cGFzdEVzZ1Nsb3RzQXZhaWwgPSAwOworICB9IGVsc2UgeworICAgIHBQdmNEeW5hbWljRGF0YS0+cGFzdEVzZ1Nsb3RzQXZhaWwgPSBQVkNfTlNfTUFYIC0gcHZjQm9yZGVyMF9sYXN0OworICB9CisKKyAgbGJ3ID0gOCAvIFJBVEU7CisKKyAgdGVtcCA9IGt4OworICBmb3IgKGkgPSBQVkNfTkJMT1c7IGkgPj0gMDsgaS0tKSB7CisgICAgcFB2Y0R5bmFtaWNEYXRhLT5zZ19vZmZzZXRfbG93W2ldID0gdGVtcDsKKyAgICB0ZW1wIC09IGxidzsKKyAgfQorCisgIHRlbXAgPSAwOworICBmb3IgKGkgPSAwOyBpIDw9IHBQdmNEeW5hbWljRGF0YS0+bmJIaWdoOyBpKyspIHsKKyAgICBwUHZjRHluYW1pY0RhdGEtPnNnX29mZnNldF9oaWdoX2t4W2ldID0gdGVtcDsKKyAgICB0ZW1wICs9IGhidzsKKyAgfQorCisgIHJldHVybiAwOworfQorCisvKiBjYWxsIGlmIHB2Y01vZGUgPSAxLDIgKi8KK3ZvaWQgcHZjRGVjb2RlRnJhbWUoUFZDX1NUQVRJQ19EQVRBICpwUHZjU3RhdGljRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgUFZDX0RZTkFNSUNfREFUQSAqcFB2Y0R5bmFtaWNEYXRhLCBGSVhQX0RCTCAqKnFtZkJ1ZmZlclJlYWwsCisgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcW1mQnVmZmVySW1hZywgY29uc3QgaW50IG92ZXJsYXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBxbWZFeHBvbmVudE92ZXJsYXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBxbWZFeHBvbmVudEN1cnJlbnQpIHsKKyAgaW50IHQ7CisgIEZJWFBfREJMICpwcmVkaWN0ZWRFc2dTbG90OworICBpbnQgUkFURSA9IHBQdmNEeW5hbWljRGF0YS0+UkFURTsKKyAgaW50IHB2Y0JvcmRlcjAgPSBwUHZjRHluYW1pY0RhdGEtPnB2Y0JvcmRlcjA7CisKKyAgZm9yICh0ID0gcHZjQm9yZGVyMDsgdCA8IFBWQ19OVElNRVNMT1Q7IHQrKykgeworICAgIGludCAqcFByZWRFc2dfZXhwID0gJnBQdmNEeW5hbWljRGF0YS0+cHJlZEVzZ19leHBbdF07CisgICAgcHJlZGljdGVkRXNnU2xvdCA9IHBQdmNEeW5hbWljRGF0YS0+cHJlZEVzZ1t0XTsKKworICAgIHB2Y0RlY29kZVRpbWVTbG90KAorICAgICAgICBwUHZjU3RhdGljRGF0YSwgcFB2Y0R5bmFtaWNEYXRhLCAmcW1mQnVmZmVyUmVhbFt0ICogUkFURV0sCisgICAgICAgICZxbWZCdWZmZXJJbWFnW3QgKiBSQVRFXSwKKyAgICAgICAgKHQgKiBSQVRFIDwgb3ZlcmxhcCkgPyBxbWZFeHBvbmVudE92ZXJsYXAgOiBxbWZFeHBvbmVudEN1cnJlbnQsCisgICAgICAgIHB2Y0JvcmRlcjAsIHQsIHByZWRpY3RlZEVzZ1Nsb3QsIHBQcmVkRXNnX2V4cCk7CisgIH0KKworICByZXR1cm47Cit9CisKK3ZvaWQgcHZjRGVjb2RlVGltZVNsb3QoUFZDX1NUQVRJQ19EQVRBICpwUHZjU3RhdGljRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgUFZDX0RZTkFNSUNfREFUQSAqcFB2Y0R5bmFtaWNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnFtZlNsb3RSZWFsLCBGSVhQX0RCTCAqKnFtZlNsb3RJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcW1mRXhwb25lbnQsIGNvbnN0IGludCBwdmNCb3JkZXIwLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdGltZVNsb3ROdW1iZXIsIEZJWFBfREJMIHByZWRpY3RlZEVzZ1Nsb3RbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwcmVkaWN0ZWRFc2dfZXhwKSB7CisgIGludCBpLCBiYW5kLCBrc2csIGtzZ19zdGFydCA9IDA7CisgIGludCBSQVRFID0gcFB2Y0R5bmFtaWNEYXRhLT5SQVRFOworICBpbnQgRXNnX2luZGV4ID0gcFB2Y1N0YXRpY0RhdGEtPkVzZ19zbG90X2luZGV4OworICBjb25zdCBTQ0hBUiAqc2dfYm9yZGVycyA9IHBQdmNEeW5hbWljRGF0YS0+c2dfb2Zmc2V0X2xvdzsKKyAgRklYUF9EQkwgKnBFc2cgPSBwUHZjU3RhdGljRGF0YS0+RXNnW0VzZ19pbmRleF07CisgIEZJWFBfREJMIEVbUFZDX05CTE9XXSA9IHswfTsKKworICAvKiBTdWJiYW5kIGdyb3VwaW5nIGluIFFNRiBzdWJiYW5kcyBiZWxvdyBTQlIgcmFuZ2UgKi8KKyAgLyogV2l0aGluIG9uZSB0aW1lc2xvdCAoIGkgPSBbMC4uLihSQVRFLTEpXSBRTUYgc3Vic2FtcGxlcykgY2FsY3VsYXRlIGVuZXJneQorICAgICBFKGliLHQpIGFuZCBncm91cCB0aGVtIHRvIEVzZyhrc2csdCkuIFRoZW4gdHJhbnNmZXIgdmFsdWVzIHRvIGxvZ2FyaXRobWljYWwKKyAgICAgZG9tYWluIGFuZCBzdG9yZSB0aGVtIGZvciB0aW1lIGRvbWFpbiBzbW9vdGhpbmcuICg3LjUuNi4zIFN1YmJhbmQgZ3JvdXBpbmcKKyAgICAgaW4gUU1GIHN1YmJhbmRzIGJlbG93IFNCUiByYW5nZSkKKyAgKi8KKyAgZm9yIChrc2cgPSAwOyBzZ19ib3JkZXJzW2tzZ10gPCAwOyBrc2crKykgeworICAgIHBFc2dba3NnXSA9IEZMMkZYQ09OU1RfREJMKC0xMC4wIC8gKDEgPDwgUFZDX0VTR19FWFApKTsgLyogMTAqbG9nMTAoMC4xKSAqLworICAgIGtzZ19zdGFydCsrOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IFJBVEU7IGkrKykgeworICAgIEZJWFBfREJMICpxbWZSLCAqcW1mSTsKKyAgICBxbWZSID0gcW1mU2xvdFJlYWxbaV07CisgICAgcW1mSSA9IHFtZlNsb3RJbWFnW2ldOworICAgIGZvciAoa3NnID0ga3NnX3N0YXJ0OyBrc2cgPCBQVkNfTkJMT1c7IGtzZysrKSB7CisgICAgICBmb3IgKGJhbmQgPSBzZ19ib3JkZXJzW2tzZ107IGJhbmQgPCBzZ19ib3JkZXJzW2tzZyArIDFdOyBiYW5kKyspIHsKKyAgICAgICAgLyogVGhlIGRpdmlzaW9uIGJ5IDggPT0gKFJBVEUqbGJ3KSBpcyByZXF1aXJlZCBhbGdvcml0aG1pY2FsbHkgKi8KKyAgICAgICAgRVtrc2ddICs9IChmUG93MkRpdjIocW1mUltiYW5kXSkgKyBmUG93MkRpdjIocW1mSVtiYW5kXSkpID4+IDI7CisgICAgICB9CisgICAgfQorICB9CisgIGZvciAoa3NnID0ga3NnX3N0YXJ0OyBrc2cgPCBQVkNfTkJMT1c7IGtzZysrKSB7CisgICAgaWYgKEVba3NnXSA+IChGSVhQX0RCTCkwKSB7CisgICAgICAvKiAxMC9sb2cyKDEwKSA9IDAuNzUyNTc0OTg5MTU5OTUzICogMl4yICovCisgICAgICBpbnQgZXhwX2xvZzsKKyAgICAgIEZJWFBfREJMIG5yZyA9IENhbGNMb2cyKEVba3NnXSwgMiAqIHFtZkV4cG9uZW50LCAmZXhwX2xvZyk7CisgICAgICBucmcgPSBmTXVsdChucmcsIEZMMkZYQ09OU1RfU0dMKExPRzEwRkFDKSk7CisgICAgICBucmcgPSBzY2FsZVZhbHVlKG5yZywgZXhwX2xvZyAtIFBWQ19FU0dfRVhQICsgMik7CisgICAgICBwRXNnW2tzZ10gPSBmTWF4KG5yZywgRkwyRlhDT05TVF9EQkwoLTEwLjAgLyAoMSA8PCBQVkNfRVNHX0VYUCkpKTsKKyAgICB9IGVsc2UgeworICAgICAgcEVzZ1trc2ddID0KKyAgICAgICAgICBGTDJGWENPTlNUX0RCTCgtMTAuMCAvICgxIDw8IFBWQ19FU0dfRVhQKSk7IC8qIDEwKmxvZzEwKDAuMSkgKi8KKyAgICB9CisgIH0KKworICAvKiBUaW1lIGRvbWFpbiBzbW9vdGhpbmcgb2Ygc3ViYmFuZC1ncm91cGVkIGVuZXJneSAqLworICB7CisgICAgaW50IGlkeCA9IHBQdmNTdGF0aWNEYXRhLT5Fc2dfc2xvdF9pbmRleDsKKyAgICBGSVhQX0RCTCAqcEVzZ19maWx0OworICAgIEZJWFBfU0dMIFNDY29lZmY7CisKKyAgICBFWzBdID0gRVsxXSA9IEVbMl0gPSAoRklYUF9EQkwpMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFB2Y0R5bmFtaWNEYXRhLT5uczsgaSsrKSB7CisgICAgICBTQ2NvZWZmID0gcFB2Y0R5bmFtaWNEYXRhLT5wU0Njb2VmZnNbaV07CisgICAgICBwRXNnX2ZpbHQgPSBwUHZjU3RhdGljRGF0YS0+RXNnW2lkeF07CisgICAgICAvKiBEaXYyIGlzIGNvbXBlbnNhdGVkIGJ5IHNjYWxpbmcgb2YgY29lZmYgdGFibGUgKi8KKyAgICAgIEVbMF0gPSBmTXVsdEFkZERpdjIoRVswXSwgcEVzZ19maWx0WzBdLCBTQ2NvZWZmKTsKKyAgICAgIEVbMV0gPSBmTXVsdEFkZERpdjIoRVsxXSwgcEVzZ19maWx0WzFdLCBTQ2NvZWZmKTsKKyAgICAgIEVbMl0gPSBmTXVsdEFkZERpdjIoRVsyXSwgcEVzZ19maWx0WzJdLCBTQ2NvZWZmKTsKKyAgICAgIGlmIChpID49IHBQdmNEeW5hbWljRGF0YS0+cGFzdEVzZ1Nsb3RzQXZhaWwpIHsKKyAgICAgICAgLyogaWYgcGFzdCBFc2cgdmFsdWVzIGFyZSBub3QgYXZhaWxhYmxlIHVzZSB0aGUgb25lcyBmcm9tIHRoZSBsYXN0IHZhbGlkCisgICAgICAgICAqIHNsb3QgKi8KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoaWR4ID4gMCkgeworICAgICAgICBpZHgtLTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlkeCArPSBQVkNfTlNfTUFYIC0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBTQlIgZW52ZWxvcGUgc2NhbGVmYWN0b3IgcHJlZGljdGlvbiAqLworICB7CisgICAgaW50IEVfaGlnaF9leHBbUFZDX05CSElHSF9NQVhdOworICAgIGludCBFX2hpZ2hfZXhwX21heCA9IDA7CisgICAgaW50IHB2Y1RhYjFJRDsKKyAgICBpbnQgcHZjVGFiMklEID0gKGludClwUHZjRHluYW1pY0RhdGEtPnBQdmNJRFt0aW1lU2xvdE51bWJlcl07CisgICAgY29uc3QgVUNIQVIgKnBUYWIxLCAqcFRhYjI7CisgICAgaWYgKHB2Y1RhYjJJRCA8IHBQdmNEeW5hbWljRGF0YS0+cFBWQ1RhYjFfZHBbMF0pIHsKKyAgICAgIHB2Y1RhYjFJRCA9IDA7CisgICAgfSBlbHNlIGlmIChwdmNUYWIySUQgPCBwUHZjRHluYW1pY0RhdGEtPnBQVkNUYWIxX2RwWzFdKSB7CisgICAgICBwdmNUYWIxSUQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICBwdmNUYWIxSUQgPSAyOworICAgIH0KKyAgICBwVGFiMSA9ICYocFB2Y0R5bmFtaWNEYXRhCisgICAgICAgICAgICAgICAgICAtPnBQVkNUYWIxW3B2Y1RhYjFJRCAqIFBWQ19OQkxPVyAqIHBQdmNEeW5hbWljRGF0YS0+bmJIaWdoXSk7CisgICAgcFRhYjIgPSAmKHBQdmNEeW5hbWljRGF0YS0+cFBWQ1RhYjJbcHZjVGFiMklEICogcFB2Y0R5bmFtaWNEYXRhLT5uYkhpZ2hdKTsKKyAgICBmb3IgKGtzZyA9IDA7IGtzZyA8IHBQdmNEeW5hbWljRGF0YS0+bmJIaWdoOyBrc2crKykgeworICAgICAgRklYUF9TR0wgcHJlZENvZWZmOworICAgICAgRklYUF9EQkwgYWNjdTsKKyAgICAgIGludCBwcmVkQ29lZmZfZXhwLCBrYjsKKyAgICAgIEVfaGlnaF9leHBba3NnXSA9IDA7CisKKyAgICAgIC8qIHJlc2lkdWFsIHBhcnQgKi8KKyAgICAgIGFjY3UgPSAoKExPTkcpKFNDSEFSKSpwVGFiMisrKSA8PCAoREZSQUNUX0JJVFMgLSA4IC0gUFZDX0VTR19FWFAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHZjRHluYW1pY0RhdGEtPnBTY2FsaW5nQ29lZlszXSk7CisKKyAgICAgIC8qIGxpbmVhciBjb21iaW5hdGlvbiBvZiBsb3dlciBncm91cGVkIGVuZXJnaWVzIHBhcnQgKi8KKyAgICAgIGZvciAoa2IgPSAwOyBrYiA8IFBWQ19OQkxPVzsga2IrKykgeworICAgICAgICBwcmVkQ29lZmYgPSAoRklYUF9TR0wpKAorICAgICAgICAgICAgKFNIT1JUKShTQ0hBUilwVGFiMVtrYiAqIHBQdmNEeW5hbWljRGF0YS0+bmJIaWdoICsga3NnXSA8PCA4KTsKKyAgICAgICAgcHJlZENvZWZmX2V4cCA9IHBQdmNEeW5hbWljRGF0YS0+cFNjYWxpbmdDb2VmW2tiXSArCisgICAgICAgICAgICAgICAgICAgICAgICAxOyAvKiArMSB0byBjb21wZW5zYXRlIGZvciBEaXYyICovCisgICAgICAgIGFjY3UgKz0gZk11bHREaXYyKEVba2JdLCBwcmVkQ29lZmYpIDw8IHByZWRDb2VmZl9leHA7CisgICAgICB9CisgICAgICAvKiBjb252ZXJ0IGJhY2sgdG8gbGluZWFyIGRvbWFpbiAqLworICAgICAgYWNjdSA9IGZNdWx0KGFjY3UsIEZMMkZYQ09OU1RfU0dMKExPRzEwRkFDX0lOVikpOworICAgICAgYWNjdSA9IGYyUG93KAorICAgICAgICAgIGFjY3UsIFBWQ19FU0dfRVhQIC0gMSwKKyAgICAgICAgICAmcHJlZENvZWZmX2V4cCk7IC8qIC0xIGNvbXBlbnNhdGVzIGZvciBleHBvbmVudCBvZiBMT0cxMEZBQ19JTlYgKi8KKyAgICAgIHByZWRpY3RlZEVzZ1Nsb3Rba3NnXSA9IGFjY3U7CisgICAgICBFX2hpZ2hfZXhwW2tzZ10gPSBwcmVkQ29lZmZfZXhwOworICAgICAgaWYgKHByZWRDb2VmZl9leHAgPiBFX2hpZ2hfZXhwX21heCkgeworICAgICAgICBFX2hpZ2hfZXhwX21heCA9IHByZWRDb2VmZl9leHA7CisgICAgICB9CisgICAgfQorCisgICAgLyogcmVzY2FsZSBvdXRwdXQgdmVjdG9yIGFjY29yZGluZyB0byBsYXJnZXN0IGV4cG9uZW50ICovCisgICAgZm9yIChrc2cgPSAwOyBrc2cgPCBwUHZjRHluYW1pY0RhdGEtPm5iSGlnaDsga3NnKyspIHsKKyAgICAgIGludCBzY2FsZSA9IEVfaGlnaF9leHBba3NnXSAtIEVfaGlnaF9leHBfbWF4OworICAgICAgcHJlZGljdGVkRXNnU2xvdFtrc2ddID0gc2NhbGVWYWx1ZShwcmVkaWN0ZWRFc2dTbG90W2tzZ10sIHNjYWxlKTsKKyAgICB9CisgICAgKnByZWRpY3RlZEVzZ19leHAgPSBFX2hpZ2hfZXhwX21heDsKKyAgfQorCisgIHBQdmNTdGF0aWNEYXRhLT5Fc2dfc2xvdF9pbmRleCA9CisgICAgICAocFB2Y1N0YXRpY0RhdGEtPkVzZ19zbG90X2luZGV4ICsgMSkgJiAoUFZDX05TX01BWCAtIDEpOworICBwUHZjRHluYW1pY0RhdGEtPnBhc3RFc2dTbG90c0F2YWlsID0KKyAgICAgIGZNaW4ocFB2Y0R5bmFtaWNEYXRhLT5wYXN0RXNnU2xvdHNBdmFpbCArIDEsIFBWQ19OU19NQVggLSAxKTsKKyAgcmV0dXJuOworfQorCisvKiBjYWxsIGlmIHB2Y01vZGUgPSAwLDEsMiAqLwordm9pZCBwdmNFbmRGcmFtZShQVkNfU1RBVElDX0RBVEEgKnBQdmNTdGF0aWNEYXRhLAorICAgICAgICAgICAgICAgICBQVkNfRFlOQU1JQ19EQVRBICpwUHZjRHluYW1pY0RhdGEpIHsKKyAgcFB2Y1N0YXRpY0RhdGEtPnB2Y19tb2RlX2xhc3QgPSBwUHZjRHluYW1pY0RhdGEtPnB2Y19tb2RlOworICBwUHZjU3RhdGljRGF0YS0+a3hfbGFzdCA9IHBQdmNEeW5hbWljRGF0YS0+a3g7CisKKyAgaWYgKHBQdmNEeW5hbWljRGF0YS0+cHZjX21vZGUgPT0gMCkgcmV0dXJuOworCisgIHsKKyAgICBpbnQgdCwgbWF4ID0gLTEwMDsKKyAgICBmb3IgKHQgPSBwUHZjRHluYW1pY0RhdGEtPnB2Y0JvcmRlcjA7IHQgPCBQVkNfTlRJTUVTTE9UOyB0KyspIHsKKyAgICAgIGlmIChwUHZjRHluYW1pY0RhdGEtPnByZWRFc2dfZXhwW3RdID4gbWF4KSB7CisgICAgICAgIG1heCA9IHBQdmNEeW5hbWljRGF0YS0+cHJlZEVzZ19leHBbdF07CisgICAgICB9CisgICAgfQorICAgIHBQdmNEeW5hbWljRGF0YS0+cHJlZEVzZ19leHBNYXggPSBtYXg7CisgIH0KKyAgcmV0dXJuOworfQorCit2b2lkIGV4cGFuZFByZWRFc2coY29uc3QgUFZDX0RZTkFNSUNfREFUQSAqcFB2Y0R5bmFtaWNEYXRhLCBjb25zdCBpbnQgdGltZVNsb3QsCisgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxlbmd0aE91dHB1dFZlY3RvciwgRklYUF9EQkwgKnBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgU0NIQVIgKnBPdXRwdXRfZXhwKSB7CisgIGludCBrID0gMCwga3NnOworICBjb25zdCBGSVhQX0RCTCAqcHJlZEVzZyA9IHBQdmNEeW5hbWljRGF0YS0+cHJlZEVzZ1t0aW1lU2xvdF07CisKKyAgZm9yIChrc2cgPSAwOyBrc2cgPCBwUHZjRHluYW1pY0RhdGEtPm5iSGlnaDsga3NnKyspIHsKKyAgICBmb3IgKDsgayA8IHBQdmNEeW5hbWljRGF0YS0+c2dfb2Zmc2V0X2hpZ2hfa3hba3NnICsgMV07IGsrKykgeworICAgICAgcE91dHB1dFtrXSA9IHByZWRFc2dba3NnXTsKKyAgICAgIHBPdXRwdXRfZXhwW2tdID0gKFNDSEFSKXBQdmNEeW5hbWljRGF0YS0+cHJlZEVzZ19leHBbdGltZVNsb3RdOworICAgIH0KKyAgfQorICBrc2ctLTsKKyAgZm9yICg7IGsgPCBsZW5ndGhPdXRwdXRWZWN0b3I7IGsrKykgeworICAgIHBPdXRwdXRba10gPSBwcmVkRXNnW2tzZ107CisgICAgcE91dHB1dF9leHBba10gPSAoU0NIQVIpcFB2Y0R5bmFtaWNEYXRhLT5wcmVkRXNnX2V4cFt0aW1lU2xvdF07CisgIH0KKworICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3B2Y19kZWMuaCBiL2xpYlNCUmRlYy9zcmMvcHZjX2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YTQ2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQlJkZWMvc3JjL3B2Y19kZWMuaApAQCAtMCwwICsxLDIzOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgTWF0dGhpYXMgSGlsZGVuYnJhbmQKKworICAgRGVzY3JpcHRpb246IERlY29kZSBQcmVkaWN0aXZlIFZlY3RvciBDb2RpbmcgRGF0YQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFBWQ19ERUNfSAorI2RlZmluZSBQVkNfREVDX0gKKworI2luY2x1ZGUgImNvbW1vbl9maXguaCIKKworI2RlZmluZSBQVkNfRElWTU9ERV9CSVRTIDMKKyNkZWZpbmUgUFZDX1JFVVNFUFZDSURfQklUUyAxCisjZGVmaW5lIFBWQ19QVkNJRF9CSVRTIDcKKyNkZWZpbmUgUFZDX0dSSURJTkZPX0JJVFMgMQorCisjZGVmaW5lIE1BWF9QVkNfRU5WRUxPUEVTIDIKKyNkZWZpbmUgUFZDX05USU1FU0xPVCAxNgorI2RlZmluZSBQVkNfTkJMT1cgMyAvKiBtYXguIG51bWJlciBvZiBncm91cGVkIFFNRiBzdWJiYW5kcyBiZWxvdyBTQlIgcmFuZ2UgKi8KKworI2RlZmluZSBQVkNfTkJISUdIX01PREUxIDgKKyNkZWZpbmUgUFZDX05CSElHSF9NT0RFMiA2CisjZGVmaW5lIFBWQ19OQkhJR0hfTUFYIChQVkNfTkJISUdIX01PREUxKQorI2RlZmluZSBQVkNfTlNfTUFYIDE2CisKKy8qKiBEYXRhIGZvciBlYWNoIFBWQyBpbnN0YW5jZSB3aGljaCBuZWVkcyB0byBiZSBwZXJzaXN0ZW50IGFjY3Jvc3MgU0JSIGZyYW1lcworICovCit0eXBlZGVmIHN0cnVjdCB7CisgIFVDSEFSIGt4X2xhc3Q7ICAgICAgICAvKio8IFhvdmVyIGZyZXF1ZW5jeSBvZiBsYXN0IGZyYW1lICovCisgIFVDSEFSIHB2Y19tb2RlX2xhc3Q7ICAvKio8IFBWQyBtb2RlIG9mIGxhc3QgZnJhbWUgKi8KKyAgVUNIQVIgRXNnX3Nsb3RfaW5kZXg7IC8qKjwgUmluZyBidWZmZXIgaW5kZXggdG8gY3VycmVudCBFc2cgdGltZSBzbG90ICovCisgIFVDSEFSIHB2Y0JvcmRlcjA7ICAgICAvKio8IFN0YXJ0IFNCUiB0aW1lIHNsb3Qgb2YgUFZDIGZyYW1lICovCisgIEZJWFBfREJMIEVzZ1tQVkNfTlNfTUFYXVtQVkNfTkJMT1ddOyAvKio8IEVzZyhrc2csdCkgb2YgY3VycmVudCBhbmQgMTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzIHRpbWUgc2xvdHMgKHJpbmcgYnVmZmVyKSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nYXJpdGhtaWNhbCBkb21haW4gKi8KK30gUFZDX1NUQVRJQ19EQVRBOworCisvKiogRGF0YSBmb3IgZWFjaCBQVkMgaW5zdGFuY2Ugd2hpY2ggaXMgdmFsaWQgZHVyaW5nIG9uZSBTQlIgZnJhbWUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgVUNIQVIgcHZjX21vZGU7ICAgLyoqPCBQVkMgbW9kZSAxIG9yIDIsIDAgbWVhbnMgbGVnYWN5IFNCUiAqLworICBVQ0hBUiBwdmNCb3JkZXIwOyAvKio8IFN0YXJ0IFNCUiB0aW1lIHNsb3Qgb2YgUFZDIGZyYW1lICovCisgIFVDSEFSIGt4OyAgICAgICAgIC8qKjwgSW5kZXggb2YgdGhlIGZpcnN0IFFNRiBzdWJiYW5kIGluIHRoZSBTQlIgcmFuZ2UgKi8KKyAgVUNIQVIgUkFURTsgICAgICAgLyoqPCBOdW1iZXIgb2YgUU1GIHN1YmJhbmQgc2FtcGxlcyBwZXIgdGltZSBzbG90ICgyIG9yIDQpICovCisgIFVDSEFSIG5zOyAvKio8IE51bWJlciBvZiB0aW1lIHNsb3RzIGZvciB0aW1lLWRvbWFpbiBzbW9vdGhpbmcgb2YgRXNnKGtzZyx0KSAqLworICBjb25zdCBVQ0hBUgorICAgICAgKnBQdmNJRDsgLyoqPCBQb2ludGVyIHRvIHByZWRpY3Rpb24gY29lZmZpY2llbnQgbWF0cml4IGluZGV4IHRhYmxlICovCisgIFVDSEFSIHBhc3RFc2dTbG90c0F2YWlsOyAgIC8qKjwgTnVtYmVyIG9mIHBhc3QgRXNnKGtzZyx0KSB3aGljaCBhcmUgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzbW9vdGhpbmcgZmlsdGVyICovCisgIGNvbnN0IEZJWFBfU0dMICpwU0Njb2VmZnM7IC8qKjwgUG9pbnRlciB0byBzbW9vdGhpbmcgd2luZG93IHRhYmxlICovCisgIFNDSEFSCisgIHNnX29mZnNldF9sb3dbUFZDX05CTE9XICsgMV07IC8qKjwgT2Zmc2V0IHRhYmxlIGZvciBQVkMgZ3JvdXBpbmcgb2YgU0JSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmJhbmRzIGJlbG93IFNCUiByYW5nZSAqLworICBTQ0hBUiBzZ19vZmZzZXRfaGlnaF9reFtQVkNfTkJISUdIX01BWCArIDFdOyAvKio8IE9mZnNldCB0YWJsZSBmb3IgUFZDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwaW5nIG9mIFNCUiBzdWJiYW5kcyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlIgcmFuZ2UgKHJlbGF0aXYgdG8ga3gpICovCisgIFVDSEFSIG5iSGlnaDsgLyoqPCBOdW1iZXIgb2YgZ3JvdXBlZCBRTUYgc3ViYmFuZHMgaW4gdGhlIFNCUiByYW5nZSAqLworICBjb25zdCBTQ0hBUiAqcFNjYWxpbmdDb2VmOyAvKio8IFBvaW50ZXIgdG8gc2NhbGluZyBjb2VmZiB0YWJsZSAqLworICBjb25zdCBVQ0hBUiAqcFBWQ1RhYjE7ICAgICAvKio8IFBWQyBtb2RlIDEgdGFibGUgKi8KKyAgY29uc3QgVUNIQVIgKnBQVkNUYWIyOyAgICAgLyoqPCBQVkMgbW9kZSAyIHRhYmxlICovCisgIGNvbnN0IFVDSEFSICpwUFZDVGFiMV9kcDsgIC8qKjwgTWFwcGluZyBvZiBwdmNJRCB0byBQVkMgbW9kZSAxIHRhYmxlICovCisgIEZJWFBfREJMIHByZWRFc2dbUFZDX05USU1FU0xPVF0KKyAgICAgICAgICAgICAgICAgIFtQVkNfTkJISUdIX01BWF07IC8qKjwgUHJlZGljdGVkIEVuZXJneSBpbiBsaW5lYXIgZG9tYWluICovCisgIGludCBwcmVkRXNnX2V4cFtQVkNfTlRJTUVTTE9UXTsgICAvKio8IEV4cG9uZW50IG9mIHByZWRpY3RlZCBFbmVyZ3kgaW4gbGluZWFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW4gKi8KKyAgaW50IHByZWRFc2dfZXhwTWF4OyAgICAgICAgICAgICAgIC8qKjwgTWF4aW11bSBvZiBwcmVkRXNnX2V4cFtdICovCit9IFBWQ19EWU5BTUlDX0RBVEE7CisKKy8qKgorICogXGJyaWVmIEluaXRpYWxpemUgUFZDIGRhdGEgc3RydWN0dXJlcyBmb3IgY3VycmVudCBmcmFtZSAoY2FsbCBpZiBwdmNNb2RlID0KKyAqIDAsMSwyKQorICogXHBhcmFtW2luXSBwUHZjU3RhdGljRGF0YSBQb2ludGVyIHRvIFBWQyBwZXJzaXN0ZW50IGRhdGEKKyAqIFxwYXJhbVtvdXRdIHBQdmNEeW5hbWljRGF0YSBQb2ludGVyIHRvIFBWQyBkeW5hbWljIGRhdGEKKyAqIFxwYXJhbVtpbl0gcHZjTW9kZSBQVkMgbW9kZSAxIG9yIDIsIDAgbWVhbnMgbGVnYWN5IFNCUgorICogXHBhcmFtW2luXSBucyBOdW1iZXIgb2YgdGltZSBzbG90cyBmb3IgdGltZS1kb21haW4gc21vb3RoaW5nIG9mIEVzZyhrc2csdCkKKyAqIFxwYXJhbVtpbl0gUkFURSBOdW1iZXIgb2YgUU1GIHN1YmJhbmQgc2FtcGxlcyBwZXIgdGltZSBzbG90ICgyIG9yIDQpCisgKiBccGFyYW1baW5dIGt4IEluZGV4IG9mIHRoZSBmaXJzdCBRTUYgc3ViYmFuZCBpbiB0aGUgU0JSIHJhbmdlCisgKiBccGFyYW1baW5dIHB2Y0JvcmRlcjAgU3RhcnQgU0JSIHRpbWUgc2xvdCBvZiBQVkMgZnJhbWUKKyAqIFxwYXJhbVtpbl0gcFB2Y0lEIFBvaW50ZXIgdG8gYXJyYXkgb2YgUHZjSURzIHJlYWQgZnJvbSBiaXRzdHJlYW0KKyAqLworaW50IHB2Y0luaXRGcmFtZShQVkNfU1RBVElDX0RBVEEgKnBQdmNTdGF0aWNEYXRhLAorICAgICAgICAgICAgICAgICBQVkNfRFlOQU1JQ19EQVRBICpwUHZjRHluYW1pY0RhdGEsIGNvbnN0IFVDSEFSIHB2Y01vZGUsCisgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIG5zLCBjb25zdCBpbnQgUkFURSwgY29uc3QgaW50IGt4LAorICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcHZjQm9yZGVyMCwgY29uc3QgVUNIQVIgKnBQdmNJRCk7CisKKy8qKgorICogXGJyaWVmIFdyYXBwZXIgZnVuY3Rpb24gZm9yIHB2Y0RlY29kZVRpbWVTbG90KCkgdG8gZGVjb2RlIFBWQyBkYXRhIG9mIG9uZQorICogZnJhbWUgKGNhbGwgaWYgcHZjTW9kZSA9IDEsMikKKyAqIFxwYXJhbVtpbixvdXRdIHBQdmNTdGF0aWNEYXRhIFBvaW50ZXIgdG8gUFZDIHBlcnNpc3RlbnQgZGF0YQorICogXHBhcmFtW2luLG91dF0gcFB2Y0R5bmFtaWNEYXRhIFBvaW50ZXIgdG8gUFZDIGR5bmFtaWMgZGF0YQorICogXHBhcmFtW2luXSBxbWZCdWZmZXJSZWFsIFBvaW50ZXIgdG8gYXJyYXkgd2l0aCByZWFsIFFNRiBzdWJiYW5kcworICogXHBhcmFtW2luXSBxbWZCdWZmZXJJbWFnIFBvaW50ZXIgdG8gYXJyYXkgd2l0aCBpbWFnIFFNRiBzdWJiYW5kcworICogXHBhcmFtW2luXSBvdmVybGFwIE51bWJlciBvZiBRTUYgb3ZlcmxhcCBzbG90cworICogXHBhcmFtW2luXSBxbWZFeHBvbmVudE92ZXJsYXAgRXhwb25lbnQgb2YgcW1mQnVmZmVyIChsb3cgcGFydCkgb2Ygb3ZlcmxhcAorICogc2xvdHMKKyAqIFxwYXJhbVtpbl0gcW1mRXhwb25lbnRDdXJyZW50IEV4cG9uZW50IG9mIHFtZkJ1ZmZlciAobG93IHBhcnQpCisgKi8KK3ZvaWQgcHZjRGVjb2RlRnJhbWUoUFZDX1NUQVRJQ19EQVRBICpwUHZjU3RhdGljRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgUFZDX0RZTkFNSUNfREFUQSAqcFB2Y0R5bmFtaWNEYXRhLCBGSVhQX0RCTCAqKnFtZkJ1ZmZlclJlYWwsCisgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcW1mQnVmZmVySW1hZywgY29uc3QgaW50IG92ZXJsYXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBxbWZFeHBvbmVudE92ZXJsYXAsIGNvbnN0IGludCBxbWZFeHBvbmVudEN1cnJlbnQpOworCisvKioKKyAqIFxicmllZiBEZWNvZGUgUFZDIGRhdGEgZm9yIG9uZSBTQlIgdGltZSBzbG90IChjYWxsIGlmIHB2Y01vZGUgPSAxLDIpCisgKiBccGFyYW1baW4sb3V0XSBwUHZjU3RhdGljRGF0YSBQb2ludGVyIHRvIFBWQyBwZXJzaXN0ZW50IGRhdGEKKyAqIFxwYXJhbVtpbixvdXRdIHBQdmNEeW5hbWljRGF0YSBQb2ludGVyIHRvIFBWQyBkeW5hbWljIGRhdGEKKyAqIFxwYXJhbVtpbl0gcW1mQnVmZmVyUmVhbCBQb2ludGVyIHRvIGFycmF5IHdpdGggcmVhbCBRTUYgc3ViYmFuZHMKKyAqIFxwYXJhbVtpbl0gcW1mQnVmZmVySW1hZyBQb2ludGVyIHRvIGFycmF5IHdpdGggaW1hZyBRTUYgc3ViYmFuZHMKKyAqIFxwYXJhbVtpbl0gcW1mRXhwb25lbnQgRXhwb25lbnQgb2YgcW1mQnVmZmVyIG9mIGN1cnJlbnQgdGltZSBzbG90CisgKiBccGFyYW1baW5dIHB2Y0JvcmRlcjAgU3RhcnQgU0JSIHRpbWUgc2xvdCBvZiBQVkMgZnJhbWUKKyAqIFxwYXJhbVtpbl0gdGltZVNsb3ROdW1iZXIgTnVtYmVyIG9mIGN1cnJlbnQgU0JSIHRpbWUgc2xvdCAoMC4uMTUpCisgKiBccGFyYW1bb3V0XSBwcmVkaWN0ZWRFc2dTbG90IFByZWRpY3RlZCBFbmVyZ3kgb2YgY3VycmVudCB0aW1lIHNsb3QKKyAqIFxwYXJhbVtvdXRdIHByZWRpY3RlZEVzZ19leHAgRXhwb25lbnQgb2YgcHJlZGljdGVkIEVuZXJneSBvZiBjdXJyZW50IHRpbWUKKyAqIHNsb3QKKyAqLwordm9pZCBwdmNEZWNvZGVUaW1lU2xvdChQVkNfU1RBVElDX0RBVEEgKnBQdmNTdGF0aWNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBQVkNfRFlOQU1JQ19EQVRBICpwUHZjRHluYW1pY0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcW1mU2xvdFJlYWwsIEZJWFBfREJMICoqcW1mU2xvdEltYWcsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBxbWZFeHBvbmVudCwgY29uc3QgaW50IHB2Y0JvcmRlcjAsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0aW1lU2xvdE51bWJlciwgRklYUF9EQkwgcHJlZGljdGVkRXNnU2xvdFtdLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnByZWRpY3RlZEVzZ19leHApOworCisvKioKKyAqIFxicmllZiBGaW5pc2ggdGhlIGN1cnJlbnQgUFZDIGZyYW1lIChjYWxsIGlmIHB2Y01vZGUgPSAwLDEsMikKKyAqIFxwYXJhbVtpbixvdXRdIHBQdmNTdGF0aWNEYXRhIFBvaW50ZXIgdG8gUFZDIHBlcnNpc3RlbnQgZGF0YQorICogXHBhcmFtW2luLG91dF0gcFB2Y0R5bmFtaWNEYXRhIFBvaW50ZXIgdG8gUFZDIGR5bmFtaWMgZGF0YQorICovCit2b2lkIHB2Y0VuZEZyYW1lKFBWQ19TVEFUSUNfREFUQSAqcFB2Y1N0YXRpY0RhdGEsCisgICAgICAgICAgICAgICAgIFBWQ19EWU5BTUlDX0RBVEEgKnBQdmNEeW5hbWljRGF0YSk7CisKKy8qKgorICogXGJyaWVmIEV4cGFuZCBwcmVkaWN0ZWQgUFZDIGdyb3VwZWQgZW5lcmdpZXMgdG8gZnVsbCBRTUYgc3ViYmFuZCByZXNvbHV0aW9uCisgKiBccGFyYW1baW5dIHBQdmNEeW5hbWljRGF0YSBQb2ludGVyIHRvIFBWQyBkeW5hbWljIGRhdGEKKyAqIFxwYXJhbVtpbl0gdGltZVNsb3QgTnVtYmVyIG9mIGN1cnJlbnQgU0JSIHRpbWUgc2xvdCAoMC4uMTUpCisgKiBccGFyYW1baW5dIGxlbmd0aE91dHB1dFZlY3RvciBMZW5naHQgb2Ygb3V0cHV0IHZlY3RvcgorICogXHBhcmFtW291dF0gcE91dHB1dCBPdXRwdXQgYXJyYXkgZm9yIHByZWRpY3RlZCBlbmVyZ2llcworICogXHBhcmFtW291dF0gcE91dHB1dF9leHAgRXhwb25lbnQgb2YgcHJlZGljdGVkIGVuZXJnaWVzCisgKi8KK3ZvaWQgZXhwYW5kUHJlZEVzZyhjb25zdCBQVkNfRFlOQU1JQ19EQVRBICpwUHZjRHluYW1pY0RhdGEsIGNvbnN0IGludCB0aW1lU2xvdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGVuZ3RoT3V0cHV0VmVjdG9yLCBGSVhQX0RCTCAqcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICBTQ0hBUiAqcE91dHB1dF9leHApOworCisjZW5kaWYgLyogUFZDX0RFQ19IKi8KZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvc2JyX2NyYy5jcHAgYi9saWJTQlJkZWMvc3JjL3Nicl9jcmMuY3BwCmluZGV4IGE0OTVmMTAuLmJhMGZkMDUgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvc2JyX2NyYy5jcHAKKysrIGIvbGliU0JSZGVjL3NyYy9zYnJfY3JjLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxMSArOTAsMTkgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBDUkMgY2hlY2sgY291dGluZXMgIAorICBcYnJpZWYgIENSQyBjaGVjayBjb3V0aW5lcwogKi8KIAogI2luY2x1ZGUgInNicl9jcmMuaCIKQEAgLTkxLDE1ICsxMTAsMTMgQEAKICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAjaW5jbHVkZSAidHJhbnNjZW5kZW50LmgiCiAKLSNkZWZpbmUgTUFYQ1JDU1RFUCAgICAxNgotI2RlZmluZSBNQVhDUkNTVEVQX0xEICA0CisjZGVmaW5lIE1BWENSQ1NURVAgMTYKKyNkZWZpbmUgTUFYQ1JDU1RFUF9MRCA0CiAKIC8qIQogICBcYnJpZWYgICAgIGNyYyBjYWxjdWxhdGlvbgogKi8KLXN0YXRpYyBVTE9ORwotY2FsY0NSQyAoSEFORExFX0NSQyBoQ3JjQnVmLCBVTE9ORyBiVmFsdWUsIGludCBuQml0cykKLXsKK3N0YXRpYyBVTE9ORyBjYWxjQ1JDKEhBTkRMRV9DUkMgaENyY0J1ZiwgVUxPTkcgYlZhbHVlLCBpbnQgbkJpdHMpIHsKICAgaW50IGk7CiAgIFVMT05HIGJNYXNrID0gKDFVTCA8PCAobkJpdHMgLSAxKSk7CiAKQEAgLTEwOSw1MiArMTI2LDQ1IEBACiAKICAgICBmbGFnIF49IGZsYWcxOwogICAgIGhDcmNCdWYtPmNyY1N0YXRlIDw8PSAxOwotICAgIGlmIChmbGFnKQotICAgICAgaENyY0J1Zi0+Y3JjU3RhdGUgXj0gaENyY0J1Zi0+Y3JjUG9seTsKKyAgICBpZiAoZmxhZykgaENyY0J1Zi0+Y3JjU3RhdGUgXj0gaENyY0J1Zi0+Y3JjUG9seTsKICAgfQogCiAgIHJldHVybiAoaENyY0J1Zi0+Y3JjU3RhdGUpOwogfQogCi0KIC8qIQogICBcYnJpZWYgICAgIGNyYwogKi8KLXN0YXRpYyBpbnQKLWdldENyYyAoSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBVTE9ORyBOckJpdHMpCi17CitzdGF0aWMgaW50IGdldENyYyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIFVMT05HIE5yQml0cykgewogICBpbnQgaTsKICAgQ1JDX0JVRkZFUiBDcmNCdWY7CiAKICAgQ3JjQnVmLmNyY1N0YXRlID0gU0JSX0NSQ19TVEFSVDsKLSAgQ3JjQnVmLmNyY1BvbHkgID0gU0JSX0NSQ19QT0xZOwotICBDcmNCdWYuY3JjTWFzayAgPSBTQlJfQ1JDX01BU0s7CisgIENyY0J1Zi5jcmNQb2x5ID0gU0JSX0NSQ19QT0xZOworICBDcmNCdWYuY3JjTWFzayA9IFNCUl9DUkNfTUFTSzsKIAotICBpbnQgQ3JjU3RlcCA9IE5yQml0cz4+TUFYQ1JDU1RFUF9MRDsKKyAgaW50IENyY1N0ZXAgPSBOckJpdHMgPj4gTUFYQ1JDU1RFUF9MRDsKIAogICBpbnQgQ3JjTnJCaXRzUmVzdCA9IChOckJpdHMgLSBDcmNTdGVwICogTUFYQ1JDU1RFUCk7CiAgIFVMT05HIGJWYWx1ZTsKIAogICBmb3IgKGkgPSAwOyBpIDwgQ3JjU3RlcDsgaSsrKSB7Ci0gICAgYlZhbHVlID0gRkRLcmVhZEJpdHMgKGhCcywgTUFYQ1JDU1RFUCk7Ci0gICAgY2FsY0NSQyAoJkNyY0J1ZiwgYlZhbHVlLCBNQVhDUkNTVEVQKTsKKyAgICBiVmFsdWUgPSBGREtyZWFkQml0cyhoQnMsIE1BWENSQ1NURVApOworICAgIGNhbGNDUkMoJkNyY0J1ZiwgYlZhbHVlLCBNQVhDUkNTVEVQKTsKICAgfQogCi0gIGJWYWx1ZSA9IEZES3JlYWRCaXRzIChoQnMsIENyY05yQml0c1Jlc3QpOwotICBjYWxjQ1JDICgmQ3JjQnVmLCBiVmFsdWUsIENyY05yQml0c1Jlc3QpOworICBiVmFsdWUgPSBGREtyZWFkQml0cyhoQnMsIENyY05yQml0c1Jlc3QpOworICBjYWxjQ1JDKCZDcmNCdWYsIGJWYWx1ZSwgQ3JjTnJCaXRzUmVzdCk7CiAKICAgcmV0dXJuIChDcmNCdWYuY3JjU3RhdGUgJiBTQlJfQ1JDX1JBTkdFKTsKLQogfQogCi0KIC8qIQogICBcYnJpZWYgICBjcmMgaW50ZXJmYWNlCiAgIFxyZXR1cm4gIDE6IENSQyBPSywgMDogQ1JDIGNoZWNrIGZhaWx1cmUKICovCi1pbnQKLVNickNyY0NoZWNrIChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIC8qITwgaGFuZGxlIHRvIGJpdC1idWZmZXIgICovCi0gICAgICAgICAgICAgTE9ORyBOckJpdHMpICAgICAgICAgICAgICAvKiE8IG1heC4gQ1JDIGxlbmd0aCAgICAgICAqLworaW50IFNickNyY0NoZWNrKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywgLyohPCBoYW5kbGUgdG8gYml0LWJ1ZmZlciAgKi8KKyAgICAgICAgICAgICAgICBMT05HIE5yQml0cykgICAgICAgICAgICAgIC8qITwgbWF4LiBDUkMgbGVuZ3RoICAgICAgICovCiB7CiAgIGludCBjcmNSZXN1bHQgPSAxOwogICBVTE9ORyBOckNyY0JpdHM7CkBAIC0xNjIsMTggKzE3MiwxNyBAQAogICBMT05HIE5yQml0c0F2YWlsYWJsZTsKICAgVUxPTkcgY3JjQ2hlY2tTdW07CiAKLSAgY3JjQ2hlY2tTdW0gPSBGREtyZWFkQml0cyAoaEJzLCAxMCk7CisgIGNyY0NoZWNrU3VtID0gRkRLcmVhZEJpdHMoaEJzLCAxMCk7CiAKICAgTnJCaXRzQXZhaWxhYmxlID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7Ci0gIGlmIChOckJpdHNBdmFpbGFibGUgPD0gMCl7CisgIGlmIChOckJpdHNBdmFpbGFibGUgPD0gMCkgewogICAgIHJldHVybiAwOwogICB9CiAKLSAgTnJDcmNCaXRzID0gZml4TWluICgoSU5UKU5yQml0cywgKElOVClOckJpdHNBdmFpbGFibGUpOworICBOckNyY0JpdHMgPSBmaXhNaW4oKElOVClOckJpdHMsIChJTlQpTnJCaXRzQXZhaWxhYmxlKTsKIAotICBjcmNDaGVja1Jlc3VsdCA9IGdldENyYyAoaEJzLCBOckNyY0JpdHMpOwotICBGREtwdXNoQmFjayhoQnMsIChOckJpdHNBdmFpbGFibGUgLSBGREtnZXRWYWxpZEJpdHMoaEJzKSkgKTsKLQorICBjcmNDaGVja1Jlc3VsdCA9IGdldENyYyhoQnMsIE5yQ3JjQml0cyk7CisgIEZES3B1c2hCYWNrKGhCcywgKE5yQml0c0F2YWlsYWJsZSAtIEZES2dldFZhbGlkQml0cyhoQnMpKSk7CiAKICAgaWYgKGNyY0NoZWNrUmVzdWx0ICE9IGNyY0NoZWNrU3VtKSB7CiAgICAgY3JjUmVzdWx0ID0gMDsKZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvc2JyX2NyYy5oIGIvbGliU0JSZGVjL3NyYy9zYnJfY3JjLmgKaW5kZXggMzBiODMyOS4uOTYzMzcxNyAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9zYnJfY3JjLmgKKysrIGIvbGliU0JSZGVjL3NyYy9zYnJfY3JjLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDIyIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgQ1JDIGNoZWNraW5nIHJvdXRpbmVzICAKKyAgXGJyaWVmICBDUkMgY2hlY2tpbmcgcm91dGluZXMKICovCi0jaWZuZGVmIF9fU0JSX0NSQ19ICi0jZGVmaW5lIF9fU0JSX0NSQ19ICisjaWZuZGVmIFNCUl9DUkNfSAorI2RlZmluZSBTQlJfQ1JDX0gKIAogI2luY2x1ZGUgInNicmRlY29kZXIuaCIKIApAQCAtMTAwLDI0ICsxMTksMjAgQEAKIGNyYzg6IHheOCt4XjIreCt4KzEKICovCiAKLS8qIGRlZmF1bHQgU0JSIENSQyAqLyAgLyogRyh4KSA9IHheMTAgKyB4XjkgKyB4XjUgKyB4XjQgKyB4ICsgMSAqLwotI2RlZmluZSBTQlJfQ1JDX1BPTFkgICAgICAgICAgICAgICAgICAweDAyMzMKLSNkZWZpbmUgU0JSX0NSQ19NQVNLICAgICAgICAgICAgICAgICAgMHgwMjAwCi0jZGVmaW5lIFNCUl9DUkNfU1RBUlQgICAgICAgICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBTQlJfQ1JDX1JBTkdFICAgICAgICAgICAgICAgICAweDAzRkYKKy8qIGRlZmF1bHQgU0JSIENSQyAqLyAvKiBHKHgpID0geF4xMCArIHheOSArIHheNSArIHheNCArIHggKyAxICovCisjZGVmaW5lIFNCUl9DUkNfUE9MWSAweDAyMzMKKyNkZWZpbmUgU0JSX0NSQ19NQVNLIDB4MDIwMAorI2RlZmluZSBTQlJfQ1JDX1NUQVJUIDB4MDAwMAorI2RlZmluZSBTQlJfQ1JDX1JBTkdFIDB4MDNGRgogCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICBVU0hPUlQgY3JjU3RhdGU7CiAgIFVTSE9SVCBjcmNNYXNrOwogICBVU0hPUlQgY3JjUG9seTsKLX0KLUNSQ19CVUZGRVI7Cit9IENSQ19CVUZGRVI7CiAKIHR5cGVkZWYgQ1JDX0JVRkZFUiAqSEFORExFX0NSQzsKIAotaW50IFNickNyY0NoZWNrIChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLAotICAgICAgICAgICAgICAgICBMT05HICAgICAgICAgICAgICAgICBOckNyY0JpdHMpOwotCitpbnQgU2JyQ3JjQ2hlY2soSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZiwgTE9ORyBOckNyY0JpdHMpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvc2JyX2RlYi5jcHAgYi9saWJTQlJkZWMvc3JjL3Nicl9kZWIuY3BwCmluZGV4IDliYWZmMmUuLjEzY2QyMTEgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvc2JyX2RlYi5jcHAKKysrIGIvbGliU0JSZGVjL3NyYy9zYnJfZGViLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxMiArOTAsMTkgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBQcmludCBzZWxlY3RlZCBkZWJ1ZyBtZXNzYWdlcyAgIAorICBcYnJpZWYgIFByaW50IHNlbGVjdGVkIGRlYnVnIG1lc3NhZ2VzCiAqLwogCiAjaW5jbHVkZSAic2JyX2RlYi5oIgotCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3Nicl9kZWIuaCBiL2xpYlNCUmRlYy9zcmMvc2JyX2RlYi5oCmluZGV4IGNiOTU0YmEuLjk3ZDU3MmEgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvc2JyX2RlYi5oCisrKyBiL2xpYlNCUmRlYy9zcmMvc2JyX2RlYi5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE1ICs5MCwyMyBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIERlYnVnZ2luZyBhaWRzICAgCisgIFxicmllZiAgRGVidWdnaW5nIGFpZHMKICovCiAKLSNpZm5kZWYgX19TQlJfREVCX0gKLSNkZWZpbmUgX19TQlJfREVCX0gKKyNpZm5kZWYgU0JSX0RFQl9ICisjZGVmaW5lIFNCUl9ERUJfSAogCiAjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgogCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3Nicl9kZWMuY3BwIGIvbGliU0JSZGVjL3NyYy9zYnJfZGVjLmNwcAppbmRleCAwODY0MzQ4Li4yZTE4ZTZjIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL3Nicl9kZWMuY3BwCisrKyBiL2xpYlNCUmRlYy9zcmMvc2JyX2RlYy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTkgKzkwLDI4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgU2JyIGRlY29kZXIgIAotICBUaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgYWN0dWFsIGRlY29kZXIgaW1wbGVtZW50YXRpb24uIFRoZSBTQlIgZGF0YSAoc2lkZSBpbmZvcm1hdGlvbikgaXMgYWxyZWFkeQotICBkZWNvZGVkLiBPbmx5IHRocmVlIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQ6CisgIFxicmllZiAgU2JyIGRlY29kZXIKKyAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGFjdHVhbCBkZWNvZGVyIGltcGxlbWVudGF0aW9uLiBUaGUgU0JSIGRhdGEgKHNpZGUKKyAgaW5mb3JtYXRpb24pIGlzIGFscmVhZHkgZGVjb2RlZC4gT25seSB0aHJlZSBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkOgogCiAgIFxsaSAxLikgY3JlYXRlU2JyRGVjKCk6IE9uZSB0aW1lIGluaXRpYWxpemF0aW9uCi0gIFxsaSAyLikgcmVzZXRTYnJEZWMoKTogQ2FsbGVkIGJ5IHNicl9BcHBseSgpIHdoZW4gdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiBhbiBTQlJfSEVBREVSX0VMRU1FTlQgcmVxdWlyZXMgYSByZXNldAotICBhbmQgcmVjYWxjdWxhdGlvbiBvZiBpbXBvcnRhbnQgU0JSIHN0cnVjdHVyZXMuCi0gIFxsaSAzLikgc2JyX2RlYygpOiBUaGUgYWN0dWFsIGRlY29kZXIuIENhbGxzIHRoZSBkaWZmZXJlbnQgdG9vbHMgc3VjaCBhcyBmaWx0ZXJiYW5rcywgbHBwVHJhbnNwb3NlcigpLCBhbmQgY2FsY3VsYXRlU2JyRW52ZWxvcGUoKQotICBbdGhlIGVudmVsb3BlIGFkanVzdGVyXS4KKyAgXGxpIDIuKSByZXNldFNickRlYygpOiBDYWxsZWQgYnkgc2JyX0FwcGx5KCkgd2hlbiB0aGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGluCisgIGFuIFNCUl9IRUFERVJfRUxFTUVOVCByZXF1aXJlcyBhIHJlc2V0IGFuZCByZWNhbGN1bGF0aW9uIG9mIGltcG9ydGFudCBTQlIKKyAgc3RydWN0dXJlcy4gXGxpIDMuKSBzYnJfZGVjKCk6IFRoZSBhY3R1YWwgZGVjb2Rlci4gQ2FsbHMgdGhlIGRpZmZlcmVudCB0b29scworICBzdWNoIGFzIGZpbHRlcmJhbmtzLCBscHBUcmFuc3Bvc2VyKCksIGFuZCBjYWxjdWxhdGVTYnJFbnZlbG9wZSgpIFt0aGUgZW52ZWxvcGUKKyAgYWRqdXN0ZXJdLgogCiAgIFxzYSBzYnJfZGVjKCksIFxyZWYgZG9jdW1lbnRhdGlvbk92ZXJ2aWV3CiAqLwpAQCAtMTAyLDE3OCArMTIyLDkwIEBACiAjaW5jbHVkZSAiZW52X2V4dHIuaCIKICNpbmNsdWRlICJlbnZfY2FsYy5oIgogI2luY2x1ZGUgInNjYWxlLmgiCisjaW5jbHVkZSAiRkRLX21hdHJpeENhbGxvYy5oIgorI2luY2x1ZGUgImhiZS5oIgogCiAjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKIAogI2luY2x1ZGUgInNicmRlY19kcmMuaCIKIAorc3RhdGljIHZvaWQgY29weUhhcm1vbmljU3BlY3RydW0oaW50ICp4T3ZlclFtZiwgRklYUF9EQkwgKipxbWZSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxbWZJbWFnLCBpbnQgbm9Db2xzLCBpbnQgb3ZlcmxhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFRVBfU1RBVEVTX1NZTkNFRF9NT0RFIGtlZXBTdGF0ZXNTeW5jZWQpIHsKKyAgaW50IHBhdGNoQmFuZHM7CisgIGludCBwYXRjaCwgYmFuZCwgY29sLCB0YXJnZXQsIHNvdXJjZUJhbmRzLCBpOworICBpbnQgbnVtUGF0Y2hlcyA9IDA7CisgIGludCBzbG90T2Zmc2V0ID0gMDsKIAorICBGSVhQX0RCTCAqKnBwcW1mUmVhbCA9IHFtZlJlYWwgKyBvdmVybGFwOworICBGSVhQX0RCTCAqKnBwcW1mSW1hZyA9IHFtZkltYWcgKyBvdmVybGFwOwogCi1zdGF0aWMgdm9pZCBhc3NpZ25MY1RpbWVTbG90cyggSEFORExFX1NCUl9ERUMgaFNickRlYywgICAgICAgICAgICAgICAgICAgICAvKiE8IGhhbmRsZSB0byBEZWNvZGVyIGNoYW5uZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKipRbWZCdWZmZXJSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub0NvbHMgKQotewotICBpbnQgc2xvdCwgaTsKLSAgRklYUF9EQkwgICpwdHI7Ci0KLSAgLyogTnVtYmVyIG9mIFFNRiB0aW1lc2xvdHMgaW4gdGhlIG92ZXJsYXAgYnVmZmVyOiAqLwotICBwdHIgPSBoU2JyRGVjLT5wU2JyT3ZlcmxhcEJ1ZmZlcjsKLSAgZm9yKHNsb3Q9MDsgc2xvdDxoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXA7IHNsb3QrKykgewotICAgIFFtZkJ1ZmZlclJlYWxbc2xvdF0gPSBwdHI7IHB0ciArPSAoNjQpOworICBpZiAoa2VlcFN0YXRlc1N5bmNlZCA9PSBLRUVQX1NUQVRFU19TWU5DRURfTk9STUFMKSB7CisgICAgc2xvdE9mZnNldCA9IG5vQ29scyAtIG92ZXJsYXAgLSBMUENfT1JERVI7CiAgIH0KIAotICAvKiBBc3NpZ24gdGltZXNsb3RzIHRvIFdvcmtidWZmZXIxICovCi0gIHB0ciA9IGhTYnJEZWMtPldvcmtCdWZmZXIxOwotICBmb3IoaT0wOyBpPG5vQ29sczsgaSsrKSB7Ci0gICAgUW1mQnVmZmVyUmVhbFtzbG90XSA9IHB0cjsgcHRyICs9ICg2NCk7Ci0gICAgc2xvdCsrOwotICB9Ci19Ci0KLQotc3RhdGljIHZvaWQgYXNzaWduSHFUaW1lU2xvdHMoIEhBTkRMRV9TQlJfREVDIGhTYnJEZWMsICAgICAgICAgICAgICAgICAgICAgLyohPCBoYW5kbGUgdG8gRGVjb2RlciBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICoqUW1mQnVmZmVyUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKipRbWZCdWZmZXJJbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub0NvbHMgKQotewotICBGSVhQX0RCTCAgKnB0cjsKLSAgaW50IHNsb3Q7Ci0KLSAgLyogTnVtYmVyIG9mIFFNRiB0aW1lc2xvdHMgaW4gb25lIGhhbGYgb2YgYSBmcmFtZSAoc2l6ZSBvZiBXb3JrYnVmZmVyMSBvciAyKTogKi8KLSAgaW50IGhhbGZsZW4gPSAobm9Db2xzID4+IDEpICsgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwOwotICBpbnQgdG90Q29scyA9IG5vQ29scyArIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcDsKLQotICAvKiBOdW1iZXIgb2YgUU1GIHRpbWVzbG90cyBpbiB0aGUgb3ZlcmxhcCBidWZmZXI6ICovCi0gIHB0ciA9IGhTYnJEZWMtPnBTYnJPdmVybGFwQnVmZmVyOwotICBmb3Ioc2xvdD0wOyBzbG90PGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcDsgc2xvdCsrKSB7Ci0gICAgUW1mQnVmZmVyUmVhbFtzbG90XSA9IHB0cjsgcHRyICs9ICg2NCk7Ci0gICAgUW1mQnVmZmVySW1hZ1tzbG90XSA9IHB0cjsgcHRyICs9ICg2NCk7CisgIGlmIChrZWVwU3RhdGVzU3luY2VkID09IEtFRVBfU1RBVEVTX1NZTkNFRF9PVVRESUZGKSB7CisgICAgcHBxbWZSZWFsID0gcW1mUmVhbDsKKyAgICBwcHFtZkltYWcgPSBxbWZJbWFnOwogICB9CiAKLSAgLyogQXNzaWduIGZpcnN0IGhhbGYgb2YgdGltZXNsb3RzIHRvIFdvcmtidWZmZXIxICovCi0gIHB0ciA9IGhTYnJEZWMtPldvcmtCdWZmZXIxOwotICBmb3IoOyBzbG90PGhhbGZsZW47IHNsb3QrKykgewotICAgIFFtZkJ1ZmZlclJlYWxbc2xvdF0gPSBwdHI7IHB0ciArPSAoNjQpOwotICAgIFFtZkJ1ZmZlckltYWdbc2xvdF0gPSBwdHI7IHB0ciArPSAoNjQpOwotICB9Ci0KLSAgLyogQXNzaWduIHNlY29uZCBoYWxmIG9mIHRpbWVzbG90cyB0byBXb3JrYnVmZmVyMiAqLwotICBwdHIgPSBoU2JyRGVjLT5Xb3JrQnVmZmVyMjsKLSAgZm9yKDsgc2xvdDx0b3RDb2xzOyBzbG90KyspIHsKLSAgICBRbWZCdWZmZXJSZWFsW3Nsb3RdID0gcHRyOyBwdHIgKz0gKDY0KTsKLSAgICBRbWZCdWZmZXJJbWFnW3Nsb3RdID0gcHRyOyBwdHIgKz0gKDY0KTsKLSAgfQotfQotCi0KLXN0YXRpYyB2b2lkIGFzc2lnblRpbWVTbG90cyggSEFORExFX1NCUl9ERUMgaFNickRlYywgICAgICAgICAgICAgICAgICAgICAvKiE8IGhhbmRsZSB0byBEZWNvZGVyIGNoYW5uZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vQ29scywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZUxQICkKLXsKLSAvKiBhc3NpZ24gcW1mIHRpbWUgc2xvdHMgKi8KLSAgaFNickRlYy0+dXNlTFAgPSB1c2VMUDsKLSAgaWYgKHVzZUxQKSB7Ci0gICAgaFNickRlYy0+U3ludGhlc2lzUU1GLmZsYWdzIHw9IFFNRl9GTEFHX0xQOwotICAgIGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5mbGFncyB8PSBRTUZfRkxBR19MUDsKLSAgfSBlbHNlIHsKLSAgICBoU2JyRGVjLT5TeW50aGVzaXNRTUYuZmxhZ3MgJj0gflFNRl9GTEFHX0xQOwotICAgIGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5mbGFncyAmPSB+UU1GX0ZMQUdfTFA7Ci0gIH0KLSAgaWYgKCF1c2VMUCkKLSAgICBhc3NpZ25IcVRpbWVTbG90cyggaFNickRlYywgaFNickRlYy0+UW1mQnVmZmVyUmVhbCwgaFNickRlYy0+UW1mQnVmZmVySW1hZywgbm9Db2xzICk7Ci0gIGVsc2UKLSAgewotICAgIGFzc2lnbkxjVGltZVNsb3RzKCBoU2JyRGVjLCBoU2JyRGVjLT5RbWZCdWZmZXJSZWFsLCBub0NvbHMgKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBjaGFuZ2VRbWZUeXBlKCBIQU5ETEVfU0JSX0RFQyBoU2JyRGVjLCAgICAgICAgICAgICAgICAgICAgIC8qITwgaGFuZGxlIHRvIERlY29kZXIgY2hhbm5lbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZUxkVGltZUFsaWduICkKLXsKLSAgVUlOVCBzeW5RbWZGbGFncyA9IGhTYnJEZWMtPlN5bnRoZXNpc1FNRi5mbGFnczsKLSAgVUlOVCBhbmFRbWZGbGFncyA9IGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5mbGFnczsKLSAgaW50ICByZXNldFN5blFtZiA9IDA7Ci0gIGludCAgcmVzZXRBbmFRbWYgPSAwOwotCi0gIC8qIGFzc2lnbiBxbWYgdHlwZSAqLwotICBpZiAodXNlTGRUaW1lQWxpZ24pIHsKLSAgICBpZiAoc3luUW1mRmxhZ3MgJiBRTUZfRkxBR19DTERGQikgewotICAgICAgLyogY2hhbmdlIHRoZSB0eXBlIHRvIE1QU0xEICovCi0gICAgICBzeW5RbWZGbGFncyAmPSB+UU1GX0ZMQUdfQ0xERkI7Ci0gICAgICBzeW5RbWZGbGFncyB8PSAgUU1GX0ZMQUdfTVBTTERGQjsKLSAgICAgIHJlc2V0U3luUW1mID0gMTsKLSAgICB9Ci0gICAgaWYgKGFuYVFtZkZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpIHsKLSAgICAgIC8qIGNoYW5nZSB0aGUgdHlwZSB0byBNUFNMRCAqLwotICAgICAgYW5hUW1mRmxhZ3MgJj0gflFNRl9GTEFHX0NMREZCOwotICAgICAgYW5hUW1mRmxhZ3MgfD0gIFFNRl9GTEFHX01QU0xERkI7Ci0gICAgICByZXNldEFuYVFtZiA9IDE7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChzeW5RbWZGbGFncyAmIFFNRl9GTEFHX01QU0xERkIpIHsKLSAgICAgIC8qIGNoYW5nZSB0aGUgdHlwZSB0byBDTERGQiAqLwotICAgICAgc3luUW1mRmxhZ3MgJj0gflFNRl9GTEFHX01QU0xERkI7Ci0gICAgICBzeW5RbWZGbGFncyB8PSAgUU1GX0ZMQUdfQ0xERkI7Ci0gICAgICByZXNldFN5blFtZiA9IDE7Ci0gICAgfQotICAgIGlmIChhbmFRbWZGbGFncyAmIFFNRl9GTEFHX01QU0xERkIpIHsKLSAgICAgIC8qIGNoYW5nZSB0aGUgdHlwZSB0byBDTERGQiAqLwotICAgICAgYW5hUW1mRmxhZ3MgJj0gflFNRl9GTEFHX01QU0xERkI7Ci0gICAgICBhbmFRbWZGbGFncyB8PSAgUU1GX0ZMQUdfQ0xERkI7Ci0gICAgICByZXNldEFuYVFtZiA9IDE7CisgIGZvciAoaSA9IDE7IGkgPCBNQVhfTlVNX1BBVENIRVM7IGkrKykgeworICAgIGlmICh4T3ZlclFtZltpXSAhPSAwKSB7CisgICAgICBudW1QYXRjaGVzKys7CiAgICAgfQogICB9CiAKLSAgaWYgKHJlc2V0QW5hUW1mKSB7Ci0gICAgUU1GX0ZJTFRFUl9CQU5LIHBydkFuYVFtZjsKLSAgICBpbnQgIHFtZkVycjsKKyAgZm9yIChwYXRjaCA9IChNQVhfU1RSRVRDSF9IQkUgLSAxKTsgcGF0Y2ggPCBudW1QYXRjaGVzOyBwYXRjaCsrKSB7CisgICAgcGF0Y2hCYW5kcyA9IHhPdmVyUW1mW3BhdGNoICsgMV0gLSB4T3ZlclFtZltwYXRjaF07CisgICAgdGFyZ2V0ID0geE92ZXJRbWZbcGF0Y2hdOworICAgIHNvdXJjZUJhbmRzID0geE92ZXJRbWZbTUFYX1NUUkVUQ0hfSEJFIC0gMV0gLSB4T3ZlclFtZltNQVhfU1RSRVRDSF9IQkUgLSAyXTsKIAotICAgIC8qIFN0b3JlIGN1cnJlbnQgY29uZmlndXJhdGlvbiAqLwotICAgIEZES21lbWNweSgmcHJ2QW5hUW1mLCAmaFNickRlYy0+QW5hbHlzaXNjUU1GLCBzaXplb2YoUU1GX0ZJTFRFUl9CQU5LKSk7Ci0KLSAgICAvKiBSZXNldCBhbmFseXNpcyBRTUYgKi8KLSAgICBxbWZFcnIgPSBxbWZJbml0QW5hbHlzaXNGaWx0ZXJCYW5rICgKLSAgICAgICAgICAgJmhTYnJEZWMtPkFuYWx5c2lzY1FNRiwKLSAgICAgICAgICAgIGhTYnJEZWMtPmFuYVFtZlN0YXRlcywKLSAgICAgICAgICAgIGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5ub19jb2wsCi0gICAgICAgICAgICBoU2JyRGVjLT5BbmFseXNpc2NRTUYubHNiLAotICAgICAgICAgICAgaFNickRlYy0+QW5hbHlzaXNjUU1GLnVzYiwKLSAgICAgICAgICAgIGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5ub19jaGFubmVscywKLSAgICAgICAgICAgIGFuYVFtZkZsYWdzIHwgUU1GX0ZMQUdfS0VFUF9TVEFURVMKLSAgICAgICAgICAgICk7Ci0KLSAgICBpZiAocW1mRXJyICE9IDApIHsKLSAgICAgIC8qIFJlc3RvcmUgb2xkIGNvbmZpZ3VyYXRpb24gb2YgYW5hbHlzaXMgUU1GICovCi0gICAgICBGREttZW1jcHkoJmhTYnJEZWMtPkFuYWx5c2lzY1FNRiwgJnBydkFuYVFtZiwgc2l6ZW9mKFFNRl9GSUxURVJfQkFOSykpOwotICAgIH0KLSAgfQotCi0gIGlmIChyZXNldFN5blFtZikgewotICAgIFFNRl9GSUxURVJfQkFOSyBwcnZTeW5RbWY7Ci0gICAgaW50ICBxbWZFcnI7Ci0KLSAgICAvKiBTdG9yZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gKi8KLSAgICBGREttZW1jcHkoJnBydlN5blFtZiwgJmhTYnJEZWMtPlN5bnRoZXNpc1FNRiwgc2l6ZW9mKFFNRl9GSUxURVJfQkFOSykpOwotCi0gICAgLyogUmVzZXQgc3ludGhlc2lzIFFNRiAqLwotICAgIHFtZkVyciA9IHFtZkluaXRTeW50aGVzaXNGaWx0ZXJCYW5rICgKLSAgICAgICAgICAgJmhTYnJEZWMtPlN5bnRoZXNpc1FNRiwKLSAgICAgICAgICAgIGhTYnJEZWMtPnBTeW5RbWZTdGF0ZXMsCi0gICAgICAgICAgICBoU2JyRGVjLT5TeW50aGVzaXNRTUYubm9fY29sLAotICAgICAgICAgICAgaFNickRlYy0+U3ludGhlc2lzUU1GLmxzYiwKLSAgICAgICAgICAgIGhTYnJEZWMtPlN5bnRoZXNpc1FNRi51c2IsCi0gICAgICAgICAgICBoU2JyRGVjLT5TeW50aGVzaXNRTUYubm9fY2hhbm5lbHMsCi0gICAgICAgICAgICBzeW5RbWZGbGFncyB8IFFNRl9GTEFHX0tFRVBfU1RBVEVTCi0gICAgICAgICAgICApOwotCi0gICAgaWYgKHFtZkVyciAhPSAwKSB7Ci0gICAgICAvKiBSZXN0b3JlIG9sZCBjb25maWd1cmF0aW9uIG9mIHN5bnRoZXNpcyBRTUYgKi8KLSAgICAgIEZES21lbWNweSgmaFNickRlYy0+U3ludGhlc2lzUU1GLCAmcHJ2U3luUW1mLCBzaXplb2YoUU1GX0ZJTFRFUl9CQU5LKSk7CisgICAgd2hpbGUgKHBhdGNoQmFuZHMgPiAwKSB7CisgICAgICBpbnQgbnVtQmFuZHMgPSBzb3VyY2VCYW5kczsKKyAgICAgIGludCBzdGFydEJhbmQgPSB4T3ZlclFtZltNQVhfU1RSRVRDSF9IQkUgLSAxXSAtIDE7CisgICAgICBpZiAodGFyZ2V0ICsgbnVtQmFuZHMgPj0geE92ZXJRbWZbcGF0Y2ggKyAxXSkgeworICAgICAgICBudW1CYW5kcyA9IHhPdmVyUW1mW3BhdGNoICsgMV0gLSB0YXJnZXQ7CisgICAgICB9CisgICAgICBpZiAoKCgodGFyZ2V0ICsgbnVtQmFuZHMgLSAxKSAlIDIpICsKKyAgICAgICAgICAgKCh4T3ZlclFtZltNQVhfU1RSRVRDSF9IQkUgLSAxXSAtIDEpICUgMikpICUKKyAgICAgICAgICAyKSB7CisgICAgICAgIGlmIChudW1CYW5kcyA9PSBzb3VyY2VCYW5kcykgeworICAgICAgICAgIG51bUJhbmRzLS07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RhcnRCYW5kLS07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChrZWVwU3RhdGVzU3luY2VkID09IEtFRVBfU1RBVEVTX1NZTkNFRF9PVVRESUZGKSB7CisgICAgICAgIGZvciAoY29sID0gc2xvdE9mZnNldDsgY29sIDwgb3ZlcmxhcCArIExQQ19PUkRFUjsgY29sKyspIHsKKyAgICAgICAgICBpID0gMDsKKyAgICAgICAgICBmb3IgKGJhbmQgPSBudW1CYW5kczsgYmFuZCA+IDA7IGJhbmQtLSkgeworICAgICAgICAgICAgaWYgKCh0YXJnZXQgKyBiYW5kIC0gMSA8IDY0KSAmJgorICAgICAgICAgICAgICAgICh0YXJnZXQgKyBiYW5kIC0gMSA8IHhPdmVyUW1mW3BhdGNoICsgMV0pKSB7CisgICAgICAgICAgICAgIHBwcW1mUmVhbFtjb2xdW3RhcmdldCArIGJhbmQgLSAxXSA9IHBwcW1mUmVhbFtjb2xdW3N0YXJ0QmFuZCAtIGldOworICAgICAgICAgICAgICBwcHFtZkltYWdbY29sXVt0YXJnZXQgKyBiYW5kIC0gMV0gPSBwcHFtZkltYWdbY29sXVtzdGFydEJhbmQgLSBpXTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChjb2wgPSBzbG90T2Zmc2V0OyBjb2wgPCBub0NvbHM7IGNvbCsrKSB7CisgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgZm9yIChiYW5kID0gbnVtQmFuZHM7IGJhbmQgPiAwOyBiYW5kLS0pIHsKKyAgICAgICAgICAgIGlmICgodGFyZ2V0ICsgYmFuZCAtIDEgPCA2NCkgJiYKKyAgICAgICAgICAgICAgICAodGFyZ2V0ICsgYmFuZCAtIDEgPCB4T3ZlclFtZltwYXRjaCArIDFdKSkgeworICAgICAgICAgICAgICBwcHFtZlJlYWxbY29sXVt0YXJnZXQgKyBiYW5kIC0gMV0gPSBwcHFtZlJlYWxbY29sXVtzdGFydEJhbmQgLSBpXTsKKyAgICAgICAgICAgICAgcHBxbWZJbWFnW2NvbF1bdGFyZ2V0ICsgYmFuZCAtIDFdID0gcHBxbWZJbWFnW2NvbF1bc3RhcnRCYW5kIC0gaV07CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRhcmdldCArPSBudW1CYW5kczsKKyAgICAgIHBhdGNoQmFuZHMgLT0gbnVtQmFuZHM7CiAgICAgfQogICB9CiB9CiAKLQogLyohCiAgIFxicmllZiAgICAgIFNCUiBkZWNvZGVyIGNvcmUgZnVuY3Rpb24gZm9yIG9uZSBjaGFubmVsCiAKQEAgLTI4MywyNiArMjE1LDI2IEBACiAgIHRoZSBMUFAtVHJhbnNwb3NlciwgcHJvY2Vzc2luZyBpcyBtYWlubHkgYmFzZWQgb24gZm91ciBidWZmZXJzOgogICAjdGltZUluLCAjdGltZU91dCwgI1dvcmtCdWZmZXIyIGFuZCAjT3ZlcmxhcEJ1ZmZlci4gVGhlICNXb3JrQnVmZmVyMgogICBpcyByZXVzZWQgZm9yIGFsbCBjaGFubmVscyBhbmQgbWlnaHQgYmUgdXNlZCBieSB0aGUgY29yZSBkZWNvZGVyLCBhCi0gIHN0YXRpYyBvdmVybGFwIGJ1ZmZlciBpcyByZXF1aXJlZCBmb3IgZWFjaCBjaGFubmVsLiBEdSB0byBpbi1wbGFjZQorICBzdGF0aWMgb3ZlcmxhcCBidWZmZXIgaXMgcmVxdWlyZWQgZm9yIGVhY2ggY2hhbm5lbC4gRHVlIHRvIGluLXBsYWNlCiAgIHByb2Nlc3NpbmcsICN0aW1lSW4gYW5kICN0aW1lT3V0IHBvaW50IHRvIGlkZW50aWNhbCBsb2NhdGlvbnMuCiAKLSAgVGhlIHNwZWN0cmFsIGRhdGEgaXMgb3JnYW5pemVkIGluIHNvLWNhbGxlZCBzbG90cywgZWFjaCBzbG90Ci0gIGNvbnRhaW5pbmcgNjQgYmFuZHMgb2YgY29tcGxleCBkYXRhLiBUaGUgbnVtYmVyIG9mIHNsb3RzIHBlciBmcmFtZSBpcwotICBkZXBlbmRlbmQgb24gdGhlIGZyYW1lIHNpemUuIEZvciBtcDNQUk8sIHRoZXJlIGFyZSAxOCBzbG90cyBwZXIgZnJhbWUKKyAgVGhlIHNwZWN0cmFsIGRhdGEgaXMgb3JnYW5pemVkIGluIHNvLWNhbGxlZCBzbG90cy4gRWFjaCBzbG90CisgIGNvbnRhaW5zIDY0IGJhbmRzIG9mIGNvbXBsZXggZGF0YS4gVGhlIG51bWJlciBvZiBzbG90cyBwZXIgZnJhbWUKKyAgZGVwZW5kcyBvbiB0aGUgZnJhbWUgc2l6ZS4gRm9yIG1wM1BSTywgdGhlcmUgYXJlIDE4IHNsb3RzIHBlciBmcmFtZQogICBhbmQgNiBzbG90cyBwZXIgI092ZXJsYXBCdWZmZXIuIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gaGF2ZSB0aGUgc2xvdHMKICAgaW4gbG9jYXRlZCBjb25zZWN1dGl2ZSBhZGRyZXNzIHJhbmdlcy4KIAogICBUbyBvcHRpbWl6ZSBtZW1vcnkgdXNhZ2UgYW5kIHRvIG1pbmltaXplIHRoZSBudW1iZXIgb2YgbWVtb3J5Ci0gIGFjY2Vzc2VzLCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgaXMgb3JnYW5pemVkIGFzIGZvbGxvd3MgKFNsb3QgbnVtYmVycworICBhY2Nlc3NlcywgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IGlzIG9yZ2FuaXplZCBhcyBmb2xsb3dzIChzbG90IG51bWJlcnMKICAgYmFzZWQgb24gbXAzUFJPKToKIAotICAxLikgSW5wdXQgdGltZSBkb21haW4gc2lnbmFsIGlzIGxvY2F0ZWQgaW4gI3RpbWVJbiwgdGhlIGxhc3Qgc2xvdHMKKyAgMS4pIElucHV0IHRpbWUgZG9tYWluIHNpZ25hbCBpcyBsb2NhdGVkIGluICN0aW1lSW4uIFRoZSBsYXN0IHNsb3RzCiAgICgwLi41KSBvZiB0aGUgc3BlY3RyYWwgZGF0YSBvZiB0aGUgcHJldmlvdXMgZnJhbWUgYXJlIGxvY2F0ZWQgaW4gdGhlCiAgICNPdmVybGFwQnVmZmVyLiBJbiBhZGRpdGlvbiwgI2ZyYW1lRGF0YSBvZiB0aGUgY3VycmVudCBmcmFtZSByZXNpZGVzCiAgIGluIHRoZSB1cHBlciBwYXJ0IG9mICN0aW1lSW4uCiAKLSAgMi4pIER1cmluZyB0aGUgY3BseEFuYWx5c2lzUW1mRmlsdGVyaW5nKCksIDMyIHNhbXBsZXMgZnJvbSAjdGltZUluIGFyZSB0cmFuc2Zvcm1lZAotICBpbnRvIGEgc2xvdCBvZiB1cCB0byAzMiBjb21wbGV4IHNwZWN0cmFsIGxvdyBiYW5kIHZhbHVlcyBhdCBhCisgIDIuKSBEdXJpbmcgdGhlIGNwbHhBbmFseXNpc1FtZkZpbHRlcmluZygpLCAzMiBzYW1wbGVzIGZyb20gI3RpbWVJbiBhcmUKKyAgdHJhbnNmb3JtZWQgaW50byBhIHNsb3Qgb2YgdXAgdG8gMzIgY29tcGxleCBzcGVjdHJhbCBsb3cgYmFuZCB2YWx1ZXMgYXQgYQogICB0aW1lLiBUaGUgZmlyc3Qgc3BlY3RyYWwgc2xvdCAtLSBuci4gNiAtLSBpcyB3cml0dGVuIGF0IHNsb3QgbnVtYmVyCiAgIHplcm8gb2YgI1dvcmtCdWZmZXIyLiAjV29ya0J1ZmZlcjIgd2lsbCBiZSBjb21wbGV0ZWx5IGZpbGxlZCB3aXRoCiAgIHNwZWN0cmFsIGRhdGEuCkBAIC0zMjUsNzMgKzI1Nyw3NyBAQAogCiAqLwogCi12b2lkCi1zYnJfZGVjICggSEFORExFX1NCUl9ERUMgaFNickRlYywgICAgICAgICAgICAvKiE8IGhhbmRsZSB0byBEZWNvZGVyIGNoYW5uZWwgKi8KLSAgICAgICAgICBJTlRfUENNICp0aW1lSW4sICAgICAgICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBpbnB1dCB0aW1lIHNpZ25hbCAqLwotICAgICAgICAgIElOVF9QQ00gKnRpbWVPdXQsICAgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIG91dHB1dCB0aW1lIHNpZ25hbCAqLwotICAgICAgICAgIEhBTkRMRV9TQlJfREVDIGhTYnJEZWNSaWdodCwgICAgICAgLyohPCBoYW5kbGUgdG8gRGVjb2RlciBjaGFubmVsIHJpZ2h0ICovCi0gICAgICAgICAgSU5UX1BDTSAqdGltZU91dFJpZ2h0LCAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gb3V0cHV0IHRpbWUgc2lnbmFsICovCi0gICAgICAgICAgY29uc3QgaW50IHN0cmlkZUluLCAgICAgICAgICAgICAgICAvKiE8IFRpbWUgZGF0YSB0cmF2ZXJzYWwgc3RyaWRlSW4gKi8KLSAgICAgICAgICBjb25zdCBpbnQgc3RyaWRlT3V0LCAgICAgICAgICAgICAgIC8qITwgVGltZSBkYXRhIHRyYXZlcnNhbCBzdHJpZGVPdXQgKi8KLSAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLwotICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoRnJhbWVEYXRhLCAgLyohPCBDb250cm9sIGRhdGEgb2YgY3VycmVudCBmcmFtZSAqLwotICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhQcmV2RnJhbWVEYXRhLCAgLyohPCBTb21lIGNvbnRyb2wgZGF0YSBvZiBsYXN0IGZyYW1lICovCi0gICAgICAgICAgY29uc3QgaW50IGFwcGx5UHJvY2Vzc2luZywgICAgICAgICAvKiE8IEZsYWcgZm9yIFNCUiBvcGVyYXRpb24gKi8KLSAgICAgICAgICBIQU5ETEVfUFNfREVDIGhfcHNfZCwKLSAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzLAotICAgICAgICAgIGNvbnN0IGludCBjb2RlY0ZyYW1lU2l6ZQotICAgICAgICAgKQotewordm9pZCBzYnJfZGVjKAorICAgIEhBTkRMRV9TQlJfREVDIGhTYnJEZWMsICAgICAgICAgICAgIC8qITwgaGFuZGxlIHRvIERlY29kZXIgY2hhbm5lbCAqLworICAgIElOVF9QQ00gKnRpbWVJbiwgICAgICAgICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBpbnB1dCB0aW1lIHNpZ25hbCAqLworICAgIElOVF9QQ00gKnRpbWVPdXQsICAgICAgICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBvdXRwdXQgdGltZSBzaWduYWwgKi8KKyAgICBIQU5ETEVfU0JSX0RFQyBoU2JyRGVjUmlnaHQsICAgICAgICAvKiE8IGhhbmRsZSB0byBEZWNvZGVyIGNoYW5uZWwgcmlnaHQgKi8KKyAgICBJTlRfUENNICp0aW1lT3V0UmlnaHQsICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gb3V0cHV0IHRpbWUgc2lnbmFsICovCisgICAgY29uc3QgaW50IHN0cmlkZU91dCwgICAgICAgICAgICAgICAgLyohPCBUaW1lIGRhdGEgdHJhdmVyc2FsIHN0cmlkZU91dCAqLworICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLworICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoRnJhbWVEYXRhLCAgIC8qITwgQ29udHJvbCBkYXRhIG9mIGN1cnJlbnQgZnJhbWUgKi8KKyAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQQorICAgICAgICBoUHJldkZyYW1lRGF0YSwgICAgICAgIC8qITwgU29tZSBjb250cm9sIGRhdGEgb2YgbGFzdCBmcmFtZSAqLworICAgIGNvbnN0IGludCBhcHBseVByb2Nlc3NpbmcsIC8qITwgRmxhZyBmb3IgU0JSIG9wZXJhdGlvbiAqLworICAgIEhBTkRMRV9QU19ERUMgaF9wc19kLCBjb25zdCBVSU5UIGZsYWdzLCBjb25zdCBpbnQgY29kZWNGcmFtZVNpemUpIHsKICAgaW50IGksIHNsb3QsIHJlc2VydmU7CiAgIGludCBzYXZlTGJTY2FsZTsKLSAgaW50IG92X2xlbjsKICAgaW50IGxhc3RTbG90T2ZmczsKICAgRklYUF9EQkwgbWF4VmFsOwogCi0gIC8qIDErMS8zIGZyYW1lcyBvZiBzcGVjdHJhbCBkYXRhOiAqLwotICBGSVhQX0RCTCAqKlFtZkJ1ZmZlclJlYWwgPSBoU2JyRGVjLT5RbWZCdWZmZXJSZWFsOwotICBGSVhQX0RCTCAqKlFtZkJ1ZmZlckltYWcgPSBoU2JyRGVjLT5RbWZCdWZmZXJJbWFnOworICAvKiB0ZW1wb3JhcnkgcG9pbnRlciAvIHZhcmlhYmxlIGZvciBRTUY7CisgICAgIHJlcXVpcmVkIGFzIHdlIHdhbnQgdG8gdXNlIHRlbXBvcmFyeSBidWZmZXIKKyAgICAgY3JlYXRpbmcgb25lIGZyYW1lIGRlbGF5IGZvciBIQkUgaW4gTFAgbW9kZSAqLworICBJTlRfUENNICpwVGltZUluUW1mID0gdGltZUluOwogCi0gLyogTnVtYmVyIG9mIFFNRiB0aW1lc2xvdHMgaW4gdGhlIG92ZXJsYXAgYnVmZmVyOiAqLwotIG92X2xlbiA9IGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcDsKKyAgLyogTnVtYmVyIG9mIFFNRiB0aW1lc2xvdHMgaW4gdGhlIG92ZXJsYXAgYnVmZmVyOiAqLworICBpbnQgb3ZfbGVuID0gaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwOwogCi0gLyogTnVtYmVyIG9mIFFNRiBzbG90cyBwZXIgZnJhbWUgKi8KKyAgLyogTnVtYmVyIG9mIFFNRiBzbG90cyBwZXIgZnJhbWUgKi8KICAgaW50IG5vQ29scyA9IGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMgKiBoSGVhZGVyRGF0YS0+dGltZVN0ZXA7CiAKLSAvKiBhc3NpZ24gcW1mIHRpbWUgc2xvdHMgKi8KLSAgaWYgKCAoKGZsYWdzICYgU0JSREVDX0xPV19QT1dFUiApID8gMSA6IDApICE9ICgoaFNickRlYy0+U3ludGhlc2lzUU1GLmZsYWdzICYgUU1GX0ZMQUdfTFApID8gMSA6IDApICkgewotICAgIGFzc2lnblRpbWVTbG90cyggaFNickRlYywgaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cyAqIGhIZWFkZXJEYXRhLT50aW1lU3RlcCwgZmxhZ3MgJiBTQlJERUNfTE9XX1BPV0VSKTsKKyAgLyogY3JlYXRlIHBvaW50ZXIgYXJyYXkgZm9yIGRhdGEgdG8gdXNlIGZvciBIQkUgYW5kIGxlZ2FjeSBzYnIgKi8KKyAgRklYUF9EQkwgKnBMb3dCYW5kUmVhbFsoMyAqIDQpICsgMiAqICgoMTAyNCkgLyAoMzIpICogKDQpIC8gMildOworICBGSVhQX0RCTCAqcExvd0JhbmRJbWFnWygzICogNCkgKyAyICogKCgxMDI0KSAvICgzMikgKiAoNCkgLyAyKV07CisKKyAgLyogc2V0IHBSZWFsIHRvIHdoZXJlIFFNRiBhbmFseXNpcyB3cml0ZXMgaW4gY2FzZSBvZiBsZWdhY3kgU0JSICovCisgIEZJWFBfREJMICoqcFJlYWwgPSBwTG93QmFuZFJlYWwgKyBvdl9sZW47CisgIEZJWFBfREJMICoqcEltYWcgPSBwTG93QmFuZEltYWcgKyBvdl9sZW47CisKKyAgLyogbWFwIFFNRiBidWZmZXIgdG8gcG9pbnRlciBhcnJheSAoT3ZlcmxhcCArIEZyYW1lKSovCisgIGZvciAoaSA9IDA7IGkgPCBub0NvbHMgKyBvdl9sZW47IGkrKykgeworICAgIHBMb3dCYW5kUmVhbFtpXSA9IGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPmhRbWZTbG90c1JlYWxbaV07CisgICAgcExvd0JhbmRJbWFnW2ldID0gaFNickRlYy0+cW1mRG9tYWluSW5DaC0+aFFtZlNsb3RzSW1hZ1tpXTsKICAgfQogCi0gIGlmIChmbGFncyAmIFNCUkRFQ19FTERfR1JJRCkgewotICAgIC8qIENob29zZSB0aGUgcmlnaHQgbG93IGRlbGF5IGZpbHRlciBiYW5rICovCi0gICAgY2hhbmdlUW1mVHlwZSggaFNickRlYywgKGZsYWdzICYgU0JSREVDX0xEX01QU19RTUYpID8gMSA6IDAgKTsKKyAgaWYgKChmbGFncyAmIFNCUkRFQ19VU0FDX0hBUk1PTklDU0JSKSkgeworICAgIC8qIGluIGNhc2Ugb2YgaGFybW9uaWMgU0JSIGFuZCBubyBIQkVfTFAgbWFwIGFkZGl0aW9uYWwgYnVmZmVyIGZvcgorICAgICAgIG9uZSBtb3JlIGZyYW1lIHRvIHBvaW50ZXIgYXJyeSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBub0NvbHM7IGkrKykgeworICAgICAgcExvd0JhbmRSZWFsW2kgKyBub0NvbHMgKyBvdl9sZW5dID0gaFNickRlYy0+aFFtZkhCRVNsb3RzUmVhbFtpXTsKKyAgICAgIHBMb3dCYW5kSW1hZ1tpICsgbm9Db2xzICsgb3ZfbGVuXSA9IGhTYnJEZWMtPmhRbWZIQkVTbG90c0ltYWdbaV07CisgICAgfQogCi0gICAgLyogSWYgdGhlIExELU1QUyBRTUYgaXMgbm90IGF2YWlsYWJsZSBkZWxheSB0aGUgc2lnbmFsIGJ5ICg5Ni00OCpsZFNiclNhbXBsaW5nUmF0ZSkKLSAgICAgKiBzYW1wbGVzIGFjY29yZGluZyB0byBJU08vSUVDIDE0NDk2LTM6MjAwOS9GREFNIDI6MjAxMChFKSBjaGFwdGVyIDQuNS4yLjEzLiAqLwotICAgIGlmICggKGZsYWdzICYgU0JSREVDX0xEX01QU19RTUYpCi0gICAgICAmJiAoaFNickRlYy0+QW5hbHlzaXNjUU1GLmZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpICkKLSAgICB7Ci0gICAgICBJTlRfUENNICpwRGx5QnVmID0gaFNickRlYy0+Y29yZURlbGF5QnVmOyAgLyogRExZQlVGICovCi0gICAgICBpbnQgc21wbCwgZGVsYXkgPSA5NiA+PiAoIShmbGFncyAmIFNCUkRFQ19ET1dOU0FNUExFKSA/IDEgOiAwKTsKLSAgICAgIC8qIENyZWF0ZSBUTVBCVUYgKi8KLSAgICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQocGNtVGVtcCwgSU5UX1BDTSwgKDk2KSk7Ci0gICAgICAvKiBDb3B5IGRlbGF5IHNhbXBsZXMgZnJvbSBJTkJVRiB0byBUTVBCVUYgKi8KLSAgICAgIGZvciAoc21wbCA9IDA7IHNtcGwgPCBkZWxheTsgc21wbCArPSAxKSB7Ci0gICAgICAgIHBjbVRlbXBbc21wbF0gPSB0aW1lSW5bKGNvZGVjRnJhbWVTaXplLWRlbGF5K3NtcGwpKnN0cmlkZUluXTsKKyAgICAvKiBzaGlmdCBzY2FsZSB2YWx1ZXMgYWNjb3JkaW5nIHRvIGJ1ZmZlciAqLworICAgIGhTYnJEZWMtPnNjYWxlX292ID0gaFNickRlYy0+c2NhbGVfbGI7CisgICAgaFNickRlYy0+c2NhbGVfbGIgPSBoU2JyRGVjLT5zY2FsZV9oYmU7CisKKyAgICAvKiBzZXQgcFJlYWwgdG8gd2hlcmUgUU1GIGFuYWx5c2lzIHdyaXRlcyBpbiBjYXNlIG9mIEhCRSAqLworICAgIHBSZWFsICs9IG5vQ29sczsKKyAgICBwSW1hZyArPSBub0NvbHM7CisgICAgaWYgKGZsYWdzICYgU0JSREVDX1NLSVBfUU1GX0FOQSkgeworICAgICAgLyogc3RlcmVvQ2ZnSW5kZXgzIHdpdGggSEJFICovCisgICAgICBGREtfUW1mRG9tYWluX1FtZkRhdGEySEJFKGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPmhRbWZIQkVTbG90c1JlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPmhRbWZIQkVTbG90c0ltYWcpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBXZSBoYXZlIHRvIG1vdmUgb2xkIGhiZSBmcmFtZSBkYXRhIHRvIGxiIGFyZWEgb2YgYnVmZmVyICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbm9Db2xzOyBpKyspIHsKKyAgICAgICAgRkRLbWVtY3B5KHBMb3dCYW5kUmVhbFtvdl9sZW4gKyBpXSwgaFNickRlYy0+aFFtZkhCRVNsb3RzUmVhbFtpXSwKKyAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5udW1iZXJPZkFuYWx5c2lzQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgRkRLbWVtY3B5KHBMb3dCYW5kSW1hZ1tvdl9sZW4gKyBpXSwgaFNickRlYy0+aFFtZkhCRVNsb3RzSW1hZ1tpXSwKKyAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5udW1iZXJPZkFuYWx5c2lzQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKICAgICAgIH0KLSAgICAgIC8qIE1vdmUgaW5wdXQgc2lnbmFsIHJlbWFpbmRlciB0byB0aGUgdmVyeSBlbmQgb2YgSU5CVUYgKi8KLSAgICAgIGZvciAoc21wbCA9IChjb2RlY0ZyYW1lU2l6ZS1kZWxheS0xKSpzdHJpZGVJbjsgc21wbCA+PSAwOyBzbXBsIC09IHN0cmlkZUluKSB7Ci0gICAgICAgIHRpbWVJbltzbXBsK2RlbGF5XSA9IHRpbWVJbltzbXBsXTsKLSAgICAgIH0KLSAgICAgIC8qIENvcHkgZGVsYXllZCBzYW1wbGVzIGZyb20gbGFzdCBmcmFtZSBmcm9tIERMWUJVRiB0byB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgSU5CVUYgKi8KLSAgICAgIGZvciAoc21wbCA9IDA7IHNtcGwgPCBkZWxheTsgc21wbCArPSAxKSB7Ci0gICAgICAgIHRpbWVJbltzbXBsKnN0cmlkZUluXSA9IHBEbHlCdWZbc21wbF07Ci0gICAgICB9Ci0gICAgICAvKiBDb3B5IFRNUEJVRiB0byBETFlCVUYgKi8KLSAgICAgIEZES21lbWNweShwRGx5QnVmLCBwY21UZW1wLCBkZWxheSpzaXplb2YoSU5UX1BDTSkpOwotICAgICAgLyogRGVzdG9yeSBUTVBCVUYgKi8KLSAgICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKHBjbVRlbXAsIElOVF9QQ00sICg5NikpOwogICAgIH0KICAgfQogCkBAIC0zOTksMjM0ICszMzUsNDM3IEBACiAgICAgbG93IGJhbmQgY29kZWMgc2lnbmFsIHN1YmJhbmQgZmlsdGVyaW5nCiAgICAqLwogCi0gIHsKLSAgICBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKHFtZlRlbXAsIEZJWFBfREJMLCAyKig2NCkpOworICBpZiAoZmxhZ3MgJiBTQlJERUNfU0tJUF9RTUZfQU5BKSB7CisgICAgaWYgKCEoZmxhZ3MgJiBTQlJERUNfVVNBQ19IQVJNT05JQ1NCUikpIC8qIHN0ZXJlb0NmZ0luZGV4MyB3L28gSEJFICovCisgICAgICBGREtfUW1mRG9tYWluX1dvcmtCdWZmZXIyUHJvY0NoYW5uZWwoaFNickRlYy0+cW1mRG9tYWluSW5DaCk7CisgIH0gZWxzZSB7CisgICAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChxbWZUZW1wLCBGSVhQX0RCTCwgMiAqICg2NCkpOworICAgIHFtZkFuYWx5c2lzRmlsdGVyaW5nKCZoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5mYiwgcFJlYWwsIHBJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLCBwVGltZUluUW1mLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHFtZlRlbXApOwogCi0gICAgcW1mQW5hbHlzaXNGaWx0ZXJpbmcoICZoU2JyRGVjLT5BbmFseXNpc2NRTUYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJSZWFsICsgb3ZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUW1mQnVmZmVySW1hZyArIG92X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBxbWZUZW1wCi0gICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKHFtZlRlbXAsIEZJWFBfREJMLCAyKig2NCkpOworICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKHFtZlRlbXAsIEZJWFBfREJMLCAyICogKDY0KSk7CiAgIH0KIAogICAvKgogICAgIENsZWFyIHVwcGVyIGhhbGYgb2Ygc3BlY3RydW0KICAgKi8KLSAgeworICBpZiAoISgoZmxhZ3MgJiBTQlJERUNfVVNBQ19IQVJNT05JQ1NCUikgJiYKKyAgICAgICAgKGhGcmFtZURhdGEtPnNiclBhdGNoaW5nTW9kZSA9PSAwKSkpIHsKICAgICBpbnQgbkFuYWx5c2lzQmFuZHMgPSBoSGVhZGVyRGF0YS0+bnVtYmVyT2ZBbmFseXNpc0JhbmRzOwogCi0gICAgaWYgKCEgKGZsYWdzICYgU0JSREVDX0xPV19QT1dFUikpIHsKLSAgICAgIGZvciAoc2xvdCA9IG92X2xlbjsgc2xvdCA8IG5vQ29scytvdl9sZW47IHNsb3QrKykgewotICAgICAgICBGREttZW1jbGVhcigmUW1mQnVmZmVyUmVhbFtzbG90XVtuQW5hbHlzaXNCYW5kc10sKCg2NCktbkFuYWx5c2lzQmFuZHMpKnNpemVvZihGSVhQX0RCTCkpOwotICAgICAgICBGREttZW1jbGVhcigmUW1mQnVmZmVySW1hZ1tzbG90XVtuQW5hbHlzaXNCYW5kc10sKCg2NCktbkFuYWx5c2lzQmFuZHMpKnNpemVvZihGSVhQX0RCTCkpOworICAgIGlmICghKGZsYWdzICYgU0JSREVDX0xPV19QT1dFUikpIHsKKyAgICAgIGZvciAoc2xvdCA9IG92X2xlbjsgc2xvdCA8IG5vQ29scyArIG92X2xlbjsgc2xvdCsrKSB7CisgICAgICAgIEZES21lbWNsZWFyKCZwTG93QmFuZFJlYWxbc2xvdF1bbkFuYWx5c2lzQmFuZHNdLAorICAgICAgICAgICAgICAgICAgICAoKDY0KSAtIG5BbmFseXNpc0JhbmRzKSAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICBGREttZW1jbGVhcigmcExvd0JhbmRJbWFnW3Nsb3RdW25BbmFseXNpc0JhbmRzXSwKKyAgICAgICAgICAgICAgICAgICAgKCg2NCkgLSBuQW5hbHlzaXNCYW5kcykgKiBzaXplb2YoRklYUF9EQkwpKTsKICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICBmb3IgKHNsb3QgPSBvdl9sZW47IHNsb3QgPCBub0NvbHMrb3ZfbGVuOyBzbG90KyspIHsKLSAgICAgIEZES21lbWNsZWFyKCZRbWZCdWZmZXJSZWFsW3Nsb3RdW25BbmFseXNpc0JhbmRzXSwoKDY0KS1uQW5hbHlzaXNCYW5kcykqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoc2xvdCA9IG92X2xlbjsgc2xvdCA8IG5vQ29scyArIG92X2xlbjsgc2xvdCsrKSB7CisgICAgICAgIEZES21lbWNsZWFyKCZwTG93QmFuZFJlYWxbc2xvdF1bbkFuYWx5c2lzQmFuZHNdLAorICAgICAgICAgICAgICAgICAgICAoKDY0KSAtIG5BbmFseXNpc0JhbmRzKSAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgfQogICAgIH0KICAgfQogCi0KLQogICAvKgogICAgIFNoaWZ0IHNwZWN0cmFsIGRhdGEgbGVmdCB0byBnYWluIGFjY3VyYWN5IGluIHRyYW5zcG9zZXIgYW5kIGFkanVzdG9yCiAgICovCi0gIG1heFZhbCA9IG1heFN1YmJhbmRTYW1wbGUoIFFtZkJ1ZmZlclJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgU0JSREVDX0xPV19QT1dFUikgPyBOVUxMIDogUW1mQnVmZmVySW1hZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+QW5hbHlzaXNjUU1GLmxzYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub0NvbHMrb3ZfbGVuICk7CisgIC8qIFJhbmdlIHdhcyBpbmNyZWFzZWQgZnJvbSBsc2IgdG8gbm9fY2hhbm5lbHMgYmVjYXVzZSBpbiBzb21lIGNhc2VzIChlLmcuCisgICAgIFVTQUMgY29uZiBlU2JyXzRfUHZjLm1wNCBhbmQgc29tZSBIQkUgY2FzZXMpIGl0IGNvdWxkIGJlIG9ic2VydmVkIHRoYXQgdGhlCisgICAgIHNpZ25hbCBiZXR3ZWVuIGxzYiBhbmQgbm9fY2hhbm5lbHMgaXMgdXNlZCBmb3IgdGhlIHBhdGNoaW5nIHByb2Nlc3MuCisgICovCisgIG1heFZhbCA9IG1heFN1YmJhbmRTYW1wbGUocFJlYWwsIChmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIpID8gTlVMTCA6IHBJbWFnLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPmZiLm5vX2NoYW5uZWxzLCAwLCBub0NvbHMpOwogCi0gIHJlc2VydmUgPSBmaXhNYXgoMCxDbnRMZWFkaW5nWmVyb3MobWF4VmFsKS0xKSA7Ci0gIHJlc2VydmUgPSBmaXhNaW4ocmVzZXJ2ZSxERlJBQ1RfQklUUy0xLWhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLmxiX3NjYWxlKTsKKyAgcmVzZXJ2ZSA9IGZpeE1heCgwLCBDbnRMZWFkaW5nWmVyb3MobWF4VmFsKSAtIDEpOworICByZXNlcnZlID0gZml4TWluKHJlc2VydmUsCisgICAgICAgICAgICAgICAgICAgREZSQUNUX0JJVFMgLSAxIC0gaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5sYl9zY2FsZSk7CiAKICAgLyogSWYgYWxsIGRhdGEgaXMgemVybywgbGJfc2NhbGUgY291bGQgYmVjb21lIHRvbyBsYXJnZSAqLwotICByZXNjYWxlU3ViYmFuZFNhbXBsZXMoIFFtZkJ1ZmZlclJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgU0JSREVDX0xPV19QT1dFUikgPyBOVUxMIDogUW1mQnVmZmVySW1hZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5sc2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgb3ZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5vQ29scytvdl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZSk7CisgIHJlc2NhbGVTdWJiYW5kU2FtcGxlcyhwUmVhbCwgKGZsYWdzICYgU0JSREVDX0xPV19QT1dFUikgPyBOVUxMIDogcEltYWcsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5mYi5ub19jaGFubmVscywgMCwgbm9Db2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZSk7CiAKLSAgaFNickRlYy0+c2JyU2NhbGVGYWN0b3IubGJfc2NhbGUgKz0gcmVzZXJ2ZTsKKyAgaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5sYl9zY2FsZSArPSByZXNlcnZlOwogCisgIGlmICgoZmxhZ3MgJiBTQlJERUNfVVNBQ19IQVJNT05JQ1NCUikpIHsKKyAgICAvKiBhY3R1YWxseSB0aGlzIGlzIG91ciBoYmVfc2NhbGUgKi8KKyAgICBoU2JyRGVjLT5zY2FsZV9oYmUgPSBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLmxiX3NjYWxlOworICAgIC8qIHRoZSByZWFsIGxiX3NjYWxlIGlzIHN0b3JlZCBpbiBzY2FsZV9sYiBmcm9tIHNiciAqLworICAgIGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcubGJfc2NhbGUgPSBoU2JyRGVjLT5zY2FsZV9sYjsKKyAgfQogICAvKgogICAgIHNhdmUgbG93IGJhbmQgc2NhbGUsIHdhdmVjb2Rpbmcgb3IgcGFyYW1ldHJpYyBzdGVyZW8gbWF5IG1vZGlmeSBpdAogICAqLwotICBzYXZlTGJTY2FsZSA9IGhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLmxiX3NjYWxlOworICBzYXZlTGJTY2FsZSA9IGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcubGJfc2NhbGU7CiAKLQotICBpZiAoYXBwbHlQcm9jZXNzaW5nKQotICB7Ci0gICAgVUNIQVIgKiBib3JkZXJzID0gaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLmJvcmRlcnM7Ci0gICAgbGFzdFNsb3RPZmZzID0gIGJvcmRlcnNbaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLm5FbnZlbG9wZXNdIC0gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90czsKKyAgaWYgKGFwcGx5UHJvY2Vzc2luZykgeworICAgIFVDSEFSICpib3JkZXJzID0gaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLmJvcmRlcnM7CisgICAgbGFzdFNsb3RPZmZzID0gYm9yZGVyc1toRnJhbWVEYXRhLT5mcmFtZUluZm8ubkVudmVsb3Blc10gLQorICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHM7CiAKICAgICBGSVhQX0RCTCBkZWdyZWVBbGlhc1soNjQpXTsKKyAgICBQVkNfRFlOQU1JQ19EQVRBIHB2Y0R5bmFtaWNEYXRhOworICAgIHB2Y0luaXRGcmFtZSgKKyAgICAgICAgJmhTYnJEZWMtPlB2Y1N0YXRpY0RhdGEsICZwdmNEeW5hbWljRGF0YSwKKyAgICAgICAgKGhIZWFkZXJEYXRhLT5mcmFtZUVycm9yRmxhZyA/IDAgOiBoSGVhZGVyRGF0YS0+YnNfaW5mby5wdmNfbW9kZSksCisgICAgICAgIGhGcmFtZURhdGEtPm5zLCBoSGVhZGVyRGF0YS0+dGltZVN0ZXAsCisgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubG93U3ViYmFuZCwKKyAgICAgICAgaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLnB2Y0JvcmRlcnNbMF0sIGhGcmFtZURhdGEtPnB2Y0lEKTsKKworICAgIGlmICghaEhlYWRlckRhdGEtPmZyYW1lRXJyb3JGbGFnICYmIChoSGVhZGVyRGF0YS0+YnNfaW5mby5wdmNfbW9kZSA+IDApKSB7CisgICAgICBwdmNEZWNvZGVGcmFtZSgmaFNickRlYy0+UHZjU3RhdGljRGF0YSwgJnB2Y0R5bmFtaWNEYXRhLCBwTG93QmFuZFJlYWwsCisgICAgICAgICAgICAgICAgICAgICBwTG93QmFuZEltYWcsIG92X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgIFNDQUxFMkVYUChoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLm92X2xiX3NjYWxlKSwKKyAgICAgICAgICAgICAgICAgICAgIFNDQUxFMkVYUChoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLmxiX3NjYWxlKSk7CisgICAgfQorICAgIHB2Y0VuZEZyYW1lKCZoU2JyRGVjLT5QdmNTdGF0aWNEYXRhLCAmcHZjRHluYW1pY0RhdGEpOwogCiAgICAgLyogVGhlIHRyYW5zcG9zZXIgd2lsbCBvdmVycmlkZSBtb3N0IHZhbHVlcyBpbiBkZWdyZWVBbGlhc1tdLgotICAgICAgIFRoZSBhcnJheSBuZWVkcyB0byBiZSBjbGVhcmVkIGF0IGxlYXN0IGZyb20gbG93U3ViYmFuZCB0byBoaWdoU3ViYmFuZCBiZWZvcmUuICovCisgICAgICAgVGhlIGFycmF5IG5lZWRzIHRvIGJlIGNsZWFyZWQgYXQgbGVhc3QgZnJvbSBsb3dTdWJiYW5kIHRvIGhpZ2hTdWJiYW5kCisgICAgICAgYmVmb3JlLiAqLwogICAgIGlmIChmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIpCi0gICAgICBGREttZW1jbGVhcigmZGVncmVlQWxpYXNbaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5sb3dTdWJiYW5kXSwgKGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuaGlnaFN1YmJhbmQtaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5sb3dTdWJiYW5kKSpzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIEZES21lbWNsZWFyKCZkZWdyZWVBbGlhc1toSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmxvd1N1YmJhbmRdLAorICAgICAgICAgICAgICAgICAgKGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuaGlnaFN1YmJhbmQgLQorICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubG93U3ViYmFuZCkgKgorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkpOwogCiAgICAgLyoKLSAgICAgIEludmVyc2UgZmlsdGVyaW5nIG9mIGxvd2JhbmQgYW5kIHRyYW5zcG9zaXRpb24gaW50byB0aGUgU0JSLWZyZXF1ZW5jeSByYW5nZQorICAgICAgSW52ZXJzZSBmaWx0ZXJpbmcgb2YgbG93YmFuZCBhbmQgdHJhbnNwb3NpdGlvbiBpbnRvIHRoZSBTQlItZnJlcXVlbmN5CisgICAgICByYW5nZQogICAgICovCiAKLSAgICBscHBUcmFuc3Bvc2VyICggJmhTYnJEZWMtPkxwcFRyYW5zLAotICAgICAgICAgICAgICAgICAgICAmaFNickRlYy0+c2JyU2NhbGVGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgIFFtZkJ1ZmZlclJlYWwsCi0gICAgICAgICAgICAgICAgICAgIGRlZ3JlZUFsaWFzLCAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdXNlZCBpZiB1c2VMUCA9IDEKLSAgICAgICAgICAgICAgICAgICAgUW1mQnVmZmVySW1hZywKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiBTQlJERUNfTE9XX1BPV0VSLAotICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+dGltZVN0ZXAsCi0gICAgICAgICAgICAgICAgICAgIGJvcmRlcnNbMF0sCi0gICAgICAgICAgICAgICAgICAgIGxhc3RTbG90T2ZmcywKLSAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uSW52ZkJhbmRzLAotICAgICAgICAgICAgICAgICAgICBoRnJhbWVEYXRhLT5zYnJfaW52Zl9tb2RlLAotICAgICAgICAgICAgICAgICAgICBoUHJldkZyYW1lRGF0YS0+c2JyX2ludmZfbW9kZSApOworICAgIHsKKyAgICAgIEtFRVBfU1RBVEVTX1NZTkNFRF9NT0RFIGtlZXBTdGF0ZXNTeW5jZWRNb2RlID0KKyAgICAgICAgICAoKGZsYWdzICYgU0JSREVDX1VTQUNfSEFSTU9OSUNTQlIpICYmCisgICAgICAgICAgIChoRnJhbWVEYXRhLT5zYnJQYXRjaGluZ01vZGUgIT0gMCkpCisgICAgICAgICAgICAgID8gS0VFUF9TVEFURVNfU1lOQ0VEX05PUk1BTAorICAgICAgICAgICAgICA6IEtFRVBfU1RBVEVTX1NZTkNFRF9PRkY7CiAKKyAgICAgIGlmIChmbGFncyAmIFNCUkRFQ19VU0FDX0hBUk1PTklDU0JSKSB7CisgICAgICAgIGlmIChmbGFncyAmIFNCUkRFQ19RVUFEX1JBVEUpIHsKKyAgICAgICAgICBwUmVhbCAtPSAzMjsKKyAgICAgICAgICBwSW1hZyAtPSAzMjsKKyAgICAgICAgfQogCisgICAgICAgIGlmICgoaFNickRlYy0+c2F2ZWRTdGF0ZXMgPT0gMCkgJiYgKGhGcmFtZURhdGEtPnNiclBhdGNoaW5nTW9kZSA9PSAxKSkgeworICAgICAgICAgIC8qIGNvcHkgc2F2ZWQgc3RhdGVzIGZyb20gcHJldmlvdXMgZnJhbWUgdG8gbGVnYWN5IFNCUiBscGMgZmlsdGVyc3RhdGUKKyAgICAgICAgICAgKiBidWZmZXIgICAqLworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMUENfT1JERVIgKyBvdl9sZW47IGkrKykgeworICAgICAgICAgICAgRkRLbWVtY3B5KAorICAgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc1JlYWxMZWdTQlJbaV0sCisgICAgICAgICAgICAgICAgaFNickRlYy0+Y29kZWNRTUZCdWZmZXJSZWFsW25vQ29scyAtIExQQ19PUkRFUiAtIG92X2xlbiArIGldLAorICAgICAgICAgICAgICAgIGhTYnJEZWMtPmhIQkUtPm5vQ2hhbm5lbHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICAgIEZES21lbWNweSgKKyAgICAgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNJbWFnTGVnU0JSW2ldLAorICAgICAgICAgICAgICAgIGhTYnJEZWMtPmNvZGVjUU1GQnVmZmVySW1hZ1tub0NvbHMgLSBMUENfT1JERVIgLSBvdl9sZW4gKyBpXSwKKyAgICAgICAgICAgICAgICBoU2JyRGVjLT5oSEJFLT5ub0NoYW5uZWxzICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgICAgfQorICAgICAgICB9CiAKKyAgICAgICAgLyogc2F2aW5nIHVubW9kaWZpZWQgUU1GIHN0YXRlcyBpbiBjYXNlIHdlIGFyZSBzd2l0Y2hpbmcgZnJvbSBsZWdhY3kgU0JSCisgICAgICAgICAqIHRvIEhCRSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaFNickRlYy0+aEhCRS0+bm9Db2xzOyBpKyspIHsKKyAgICAgICAgICBGREttZW1jcHkoaFNickRlYy0+Y29kZWNRTUZCdWZmZXJSZWFsW2ldLCBwTG93QmFuZFJlYWxbb3ZfbGVuICsgaV0sCisgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPmhIQkUtPm5vQ2hhbm5lbHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICBGREttZW1jcHkoaFNickRlYy0+Y29kZWNRTUZCdWZmZXJJbWFnW2ldLCBwTG93QmFuZEltYWdbb3ZfbGVuICsgaV0sCisgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPmhIQkUtPm5vQ2hhbm5lbHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgfQogCisgICAgICAgIFFtZlRyYW5zcG9zZXJBcHBseSgKKyAgICAgICAgICAgIGhTYnJEZWMtPmhIQkUsIHBSZWFsLCBwSW1hZywgbm9Db2xzLCBwTG93QmFuZFJlYWwsIHBMb3dCYW5kSW1hZywKKyAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc1JlYWxIQkUsCisgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNJbWFnSEJFLAorICAgICAgICAgICAgaEZyYW1lRGF0YS0+c2JyUGl0Y2hJbkJpbnMsIGhTYnJEZWMtPnNjYWxlX2xiLCBoU2JyRGVjLT5zY2FsZV9oYmUsCisgICAgICAgICAgICAmaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5oYl9zY2FsZSwgaEhlYWRlckRhdGEtPnRpbWVTdGVwLAorICAgICAgICAgICAgYm9yZGVyc1swXSwgb3ZfbGVuLCBrZWVwU3RhdGVzU3luY2VkTW9kZSk7CisKKyAgICAgICAgaWYgKGZsYWdzICYgU0JSREVDX1FVQURfUkFURSkgeworICAgICAgICAgIGludCAqeE92ZXJRbWYgPSBHZXR4T3ZlckJhbmRRbWZUcmFuc3Bvc2VyKGhTYnJEZWMtPmhIQkUpOworCisgICAgICAgICAgY29weUhhcm1vbmljU3BlY3RydW0oeE92ZXJRbWYsIHBMb3dCYW5kUmVhbCwgcExvd0JhbmRJbWFnLCBub0NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZfbGVuLCBrZWVwU3RhdGVzU3luY2VkTW9kZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZsYWdzICYgU0JSREVDX1VTQUNfSEFSTU9OSUNTQlIpICYmCisgICAgICAgIChoRnJhbWVEYXRhLT5zYnJQYXRjaGluZ01vZGUgPT0gMCkpIHsKKyAgICAgIGhTYnJEZWMtPnByZXZfZnJhbWVfbFNiciA9IDA7CisgICAgICBoU2JyRGVjLT5wcmV2X2ZyYW1lX2hiZVNiciA9IDE7CisKKyAgICAgIGxwcFRyYW5zcG9zZXJIQkUoCisgICAgICAgICAgJmhTYnJEZWMtPkxwcFRyYW5zLCBoU2JyRGVjLT5oSEJFLCAmaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZywKKyAgICAgICAgICBwTG93QmFuZFJlYWwsIHBMb3dCYW5kSW1hZywgaEhlYWRlckRhdGEtPnRpbWVTdGVwLCBib3JkZXJzWzBdLAorICAgICAgICAgIGxhc3RTbG90T2ZmcywgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uSW52ZkJhbmRzLAorICAgICAgICAgIGhGcmFtZURhdGEtPnNicl9pbnZmX21vZGUsIGhQcmV2RnJhbWVEYXRhLT5zYnJfaW52Zl9tb2RlKTsKKworICAgIH0gZWxzZSB7CisgICAgICBpZiAoZmxhZ3MgJiBTQlJERUNfVVNBQ19IQVJNT05JQ1NCUikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTFBDX09SREVSICsgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwOyBpKyspIHsKKyAgICAgICAgICAvKgorICAgICAgICAgIFN0b3JlIHRoZSB1bm1vZGlmaWVkIHFtZiBTbG90cyB2YWx1ZXMgZm9yIHVwcGVyIHBhcnQgb2Ygc3BlY3RydW0KKyAgICAgICAgICAocmVxdWlyZWQgZm9yIExQQyBmaWx0ZXJpbmcpIHJlcXVpcmVkIGlmIG5leHQgZnJhbWUgaXMgYSBIQkUgZnJhbWUKKyAgICAgICAgICAqLworICAgICAgICAgIEZES21lbWNweShoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNSZWFsSEJFW2ldLAorICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5xbWZEb21haW5JbkNoCisgICAgICAgICAgICAgICAgICAgICAgICAtPmhRbWZTbG90c1JlYWxbaFNickRlYy0+aEhCRS0+bm9Db2xzIC0gTFBDX09SREVSICsgaV0sCisgICAgICAgICAgICAgICAgICAgICg2NCkgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICBGREttZW1jcHkoaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzSW1hZ0hCRVtpXSwKKyAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+cW1mRG9tYWluSW5DaAorICAgICAgICAgICAgICAgICAgICAgICAgLT5oUW1mU2xvdHNJbWFnW2hTYnJEZWMtPmhIQkUtPm5vQ29scyAtIExQQ19PUkRFUiArIGldLAorICAgICAgICAgICAgICAgICAgICAoNjQpICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHsKKyAgICAgICAgaFNickRlYy0+cHJldl9mcmFtZV9sU2JyID0gMTsKKyAgICAgICAgaFNickRlYy0+cHJldl9mcmFtZV9oYmVTYnIgPSAwOworICAgICAgfQorCisgICAgICBscHBUcmFuc3Bvc2VyKAorICAgICAgICAgICZoU2JyRGVjLT5McHBUcmFucywgJmhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcsIHBMb3dCYW5kUmVhbCwKKyAgICAgICAgICBkZWdyZWVBbGlhcywgIC8vIG9ubHkgdXNlZCBpZiB1c2VMUCA9IDEKKyAgICAgICAgICBwTG93QmFuZEltYWcsIGZsYWdzICYgU0JSREVDX0xPV19QT1dFUiwKKyAgICAgICAgICBoSGVhZGVyRGF0YS0+YnNfaW5mby5zYnJfcHJlcHJvY2Vzc2luZywKKyAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLnZfa19tYXN0ZXJbMF0sIGhIZWFkZXJEYXRhLT50aW1lU3RlcCwKKyAgICAgICAgICBib3JkZXJzWzBdLCBsYXN0U2xvdE9mZnMsIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubkludmZCYW5kcywKKyAgICAgICAgICBoRnJhbWVEYXRhLT5zYnJfaW52Zl9tb2RlLCBoUHJldkZyYW1lRGF0YS0+c2JyX2ludmZfbW9kZSk7CisgICAgfQogCiAgICAgLyoKICAgICAgIEFkanVzdCBlbnZlbG9wZSBvZiBjdXJyZW50IGZyYW1lLgogICAgICovCiAKLSAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZSAoJmhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickRlYy0+U2JyQ2FsY3VsYXRlRW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBoRnJhbWVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJJbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIsCisgICAgaWYgKChoRnJhbWVEYXRhLT5zYnJQYXRjaGluZ01vZGUgIT0KKyAgICAgICAgIGhTYnJEZWMtPlNickNhbGN1bGF0ZUVudmVsb3BlLnNiclBhdGNoaW5nTW9kZSkpIHsKKyAgICAgIFJlc2V0TGltaXRlckJhbmRzKGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubGltaXRlckJhbmRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5vTGltaXRlckJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uU2ZiWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5wYXRjaFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5ub09mUGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5ic19kYXRhLmxpbWl0ZXJCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhGcmFtZURhdGEtPnNiclBhdGNoaW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIFNCUkRFQ19VU0FDX0hBUk1PTklDU0JSKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaEZyYW1lRGF0YS0+c2JyUGF0Y2hpbmdNb2RlID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBHZXR4T3ZlckJhbmRRbWZUcmFuc3Bvc2VyKGhTYnJEZWMtPmhIQkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgR2V0NDFTYnJRbWZUcmFuc3Bvc2VyKGhTYnJEZWMtPmhIQkUpKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyZWVBbGlhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChoSGVhZGVyRGF0YS0+ZnJhbWVFcnJvckZsYWcgfHwgaFByZXZGcmFtZURhdGEtPmZyYW1lRXJyb3JGbGFnKSk7CisgICAgICBoU2JyRGVjLT5TYnJDYWxjdWxhdGVFbnZlbG9wZS5zYnJQYXRjaGluZ01vZGUgPQorICAgICAgICAgIGhGcmFtZURhdGEtPnNiclBhdGNoaW5nTW9kZTsKKyAgICB9CiAKKyAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZSgKKyAgICAgICAgJmhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcsICZoU2JyRGVjLT5TYnJDYWxjdWxhdGVFbnZlbG9wZSwKKyAgICAgICAgaEhlYWRlckRhdGEsIGhGcmFtZURhdGEsICZwdmNEeW5hbWljRGF0YSwgcExvd0JhbmRSZWFsLCBwTG93QmFuZEltYWcsCisgICAgICAgIGZsYWdzICYgU0JSREVDX0xPV19QT1dFUiwKIAorICAgICAgICBkZWdyZWVBbGlhcywgZmxhZ3MsCisgICAgICAgIChoSGVhZGVyRGF0YS0+ZnJhbWVFcnJvckZsYWcgfHwgaFByZXZGcmFtZURhdGEtPmZyYW1lRXJyb3JGbGFnKSk7CisKKyNpZiAoU0JSREVDX01BWF9IQl9GQURFX0ZSQU1FUyA+IDApCisgICAgLyogQXZvaWQgaGFyZCBvbnNldHMgb2YgaGlnaCBiYW5kICovCisgICAgaWYgKGhIZWFkZXJEYXRhLT5mcmFtZUVycm9yRmxhZykgeworICAgICAgaWYgKGhTYnJEZWMtPmhpZ2hCYW5kRmFkZUNudCA8IFNCUkRFQ19NQVhfSEJfRkFERV9GUkFNRVMpIHsKKyAgICAgICAgaFNickRlYy0+aGlnaEJhbmRGYWRlQ250ICs9IDE7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChoU2JyRGVjLT5oaWdoQmFuZEZhZGVDbnQgPgorICAgICAgICAgIDApIHsgLyogTWFuaXB1bGF0ZSBoaWdoIGJhbmQgc2NhbGUgZmFjdG9yIHRvIGdldCBhIHNtb290aCBmYWRlLWluICovCisgICAgICAgIGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcuaGJfc2NhbGUgKz0gaFNickRlYy0+aGlnaEJhbmRGYWRlQ250OworICAgICAgICBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLmhiX3NjYWxlID0KKyAgICAgICAgICAgIGZNaW4oaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5oYl9zY2FsZSwgREZSQUNUX0JJVFMgLSAxKTsKKyAgICAgICAgaFNickRlYy0+aGlnaEJhbmRGYWRlQ250IC09IDE7CisgICAgICB9CisgICAgfQorCisjZW5kaWYKICAgICAvKgogICAgICAgVXBkYXRlIGhQcmV2RnJhbWVEYXRhICh0byBiZSB1c2VkIGluIHRoZSBuZXh0IGZyYW1lKQogICAgICovCi0gICAgZm9yIChpPTA7IGk8aEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uSW52ZkJhbmRzOyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uSW52ZkJhbmRzOyBpKyspIHsKICAgICAgIGhQcmV2RnJhbWVEYXRhLT5zYnJfaW52Zl9tb2RlW2ldID0gaEZyYW1lRGF0YS0+c2JyX2ludmZfbW9kZVtpXTsKICAgICB9CiAgICAgaFByZXZGcmFtZURhdGEtPmNvdXBsaW5nID0gaEZyYW1lRGF0YS0+Y291cGxpbmc7CiAgICAgaFByZXZGcmFtZURhdGEtPnN0b3BQb3MgPSBib3JkZXJzW2hGcmFtZURhdGEtPmZyYW1lSW5mby5uRW52ZWxvcGVzXTsKICAgICBoUHJldkZyYW1lRGF0YS0+YW1wUmVzID0gaEZyYW1lRGF0YS0+YW1wUmVzb2x1dGlvbkN1cnJlbnRGcmFtZTsKLSAgfQotICBlbHNlIHsKLSAgICAvKiBSZXNldCBoYl9zY2FsZSBpZiBubyBoaWdoYmFuZCBpcyBwcmVzZW50LCBiZWNhdXNlIGhiX3NjYWxlIGlzIGNvbnNpZGVyZWQgaW4gdGhlIFFNRi1zeW50aGVzaXMgKi8KLSAgICBoU2JyRGVjLT5zYnJTY2FsZUZhY3Rvci5oYl9zY2FsZSA9IHNhdmVMYlNjYWxlOworICAgIGhQcmV2RnJhbWVEYXRhLT5wcmV2U2JyUGl0Y2hJbkJpbnMgPSBoRnJhbWVEYXRhLT5zYnJQaXRjaEluQmluczsKKyAgICAvKiBjb3VsZCBiZSBkb25lIGluIGV4dHJhY3RGcmFtZUluZm9fcHZjKCkgYnV0IGhQcmV2RnJhbWVEYXRhIGlzIG5vdAorICAgICAqIGF2YWlsYWJsZSB0aGVyZSAqLworICAgIEZES21lbWNweSgmaFByZXZGcmFtZURhdGEtPnByZXZGcmFtZUluZm8sICZoRnJhbWVEYXRhLT5mcmFtZUluZm8sCisgICAgICAgICAgICAgIHNpemVvZihGUkFNRV9JTkZPKSk7CisgIH0gZWxzZSB7CisgICAgLyogcmVzY2FsZSBmcm9tIGxzYiB0byBuQW5hbHlzaXNCYW5kcyBpbiBvcmRlciB0byBjb21wZW5zYXRlIHNjYWxpbmcgd2l0aAorICAgICAqIGhiX3NjYWxlIGluIHRoaXMgYXJlYSwgZG9uZSBieSBzeW50aGVzaXNGaWx0ZXJpbmcqLworICAgIGludCByZXNjYWxlOworICAgIGludCBsc2I7CisgICAgaW50IGxlbmd0aDsKKworICAgIC8qIFJlc2V0IGhiX3NjYWxlIGlmIG5vIGhpZ2hiYW5kIGlzIHByZXNlbnQsIGJlY2F1c2UgaGJfc2NhbGUgaXMgY29uc2lkZXJlZAorICAgICAqIGluIHRoZSBRTUYtc3ludGhlc2lzICovCisgICAgaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5oYl9zY2FsZSA9IHNhdmVMYlNjYWxlOworCisgICAgcmVzY2FsZSA9IGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcuaGJfc2NhbGUgLQorICAgICAgICAgICAgICBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLm92X2xiX3NjYWxlOworICAgIGxzYiA9IGhTYnJEZWMtPnFtZkRvbWFpbk91dENoLT5mYi5sc2I7CisgICAgbGVuZ3RoID0gKGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPmZiLm5vX2NoYW5uZWxzIC0gbHNiKTsKKworICAgIGlmICgocmVzY2FsZSA8IDApICYmIChsZW5ndGggPiAwKSkgeworICAgICAgaWYgKCEoZmxhZ3MgJiBTQlJERUNfTE9XX1BPV0VSKSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3ZfbGVuOyBpKyspIHsKKyAgICAgICAgICBzY2FsZVZhbHVlcygmcExvd0JhbmRSZWFsW2ldW2xzYl0sIGxlbmd0aCwgcmVzY2FsZSk7CisgICAgICAgICAgc2NhbGVWYWx1ZXMoJnBMb3dCYW5kSW1hZ1tpXVtsc2JdLCBsZW5ndGgsIHJlc2NhbGUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3ZfbGVuOyBpKyspIHsKKyAgICAgICAgICBzY2FsZVZhbHVlcygmcExvd0JhbmRSZWFsW2ldW2xzYl0sIGxlbmd0aCwgcmVzY2FsZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CiAgIH0KIAorICBpZiAoIShmbGFncyAmIFNCUkRFQ19VU0FDX0hBUk1PTklDU0JSKSkgeworICAgIGludCBsZW5ndGggPSBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5mYi5sc2I7CisgICAgaWYgKGZsYWdzICYgU0JSREVDX1NZTlRBWF9VU0FDKSB7CisgICAgICBsZW5ndGggPSBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5mYi5ub19jaGFubmVsczsKKyAgICB9CiAKLSAgZm9yIChpPTA7IGk8TFBDX09SREVSOyBpKyspewotICAgIC8qCi0gICAgICBTdG9yZSB0aGUgdW5tb2RpZmllZCBxbWYgU2xvdHMgdmFsdWVzIChyZXF1aXJlZCBmb3IgTFBDIGZpbHRlcmluZykKLSAgICAqLwotICAgIGlmICghIChmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIpKSB7Ci0gICAgICBGREttZW1jcHkoaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzUmVhbFtpXSwgUW1mQnVmZmVyUmVhbFtub0NvbHMtTFBDX09SREVSK2ldLCBoU2JyRGVjLT5BbmFseXNpc2NRTUYubHNiKnNpemVvZihGSVhQX0RCTCkpOwotICAgICAgRkRLbWVtY3B5KGhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc0ltYWdbaV0sIFFtZkJ1ZmZlckltYWdbbm9Db2xzLUxQQ19PUkRFUitpXSwgaFNickRlYy0+QW5hbHlzaXNjUU1GLmxzYipzaXplb2YoRklYUF9EQkwpKTsKLSAgICB9IGVsc2UKLSAgICBGREttZW1jcHkoaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzUmVhbFtpXSwgUW1mQnVmZmVyUmVhbFtub0NvbHMtTFBDX09SREVSK2ldLCBoU2JyRGVjLT5BbmFseXNpc2NRTUYubHNiKnNpemVvZihGSVhQX0RCTCkpOworICAgIC8qIGluIGNhc2Ugb2YgbGVnYWN5IHNiciBzYXZpbmcgb2YgZmlsdGVyIHN0YXRlcyBoZXJlICovCisgICAgZm9yIChpID0gMDsgaSA8IExQQ19PUkRFUiArIG92X2xlbjsgaSsrKSB7CisgICAgICAvKgorICAgICAgICBTdG9yZSB0aGUgdW5tb2RpZmllZCBxbWYgU2xvdHMgdmFsdWVzIChyZXF1aXJlZCBmb3IgTFBDIGZpbHRlcmluZykKKyAgICAgICovCisgICAgICBpZiAoIShmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIpKSB7CisgICAgICAgIEZES21lbWNweShoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNSZWFsTGVnU0JSW2ldLAorICAgICAgICAgICAgICAgICAgcExvd0JhbmRSZWFsW25vQ29scyAtIExQQ19PUkRFUiArIGldLAorICAgICAgICAgICAgICAgICAgbGVuZ3RoICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIEZES21lbWNweShoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNJbWFnTGVnU0JSW2ldLAorICAgICAgICAgICAgICAgICAgcExvd0JhbmRJbWFnW25vQ29scyAtIExQQ19PUkRFUiArIGldLAorICAgICAgICAgICAgICAgICAgbGVuZ3RoICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICB9IGVsc2UKKyAgICAgICAgRkRLbWVtY3B5KGhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc1JlYWxMZWdTQlJbaV0sCisgICAgICAgICAgICAgICAgICBwTG93QmFuZFJlYWxbbm9Db2xzIC0gTFBDX09SREVSICsgaV0sCisgICAgICAgICAgICAgICAgICBsZW5ndGggKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICB9CiAgIH0KIAogICAvKgogICAgIFN5bnRoZXNpcyBzdWJiYW5kIGZpbHRlcmluZy4KICAgKi8KIAotICBpZiAoICEgKGZsYWdzICYgU0JSREVDX1BTX0RFQ09ERUQpICkgewotCi0gICAgeworICBpZiAoIShmbGFncyAmIFNCUkRFQ19QU19ERUNPREVEKSkgeworICAgIGlmICghKGZsYWdzICYgU0JSREVDX1NLSVBfUU1GX1NZTikpIHsKICAgICAgIGludCBvdXRTY2FsZWZhY3RvciA9IDA7CiAKICAgICAgIGlmIChoX3BzX2QgIT0gTlVMTCkgewotICAgICAgICBoX3BzX2QtPnByb2NGcmFtZUJhc2VkID0gMTsgIC8qIHdlIGhlcmUgZG8gZnJhbWUgYmFzZWQgcHJvY2Vzc2luZyAqLworICAgICAgICBoX3BzX2QtPnByb2NGcmFtZUJhc2VkID0gMTsgLyogd2UgaGVyZSBkbyBmcmFtZSBiYXNlZCBwcm9jZXNzaW5nICovCiAgICAgICB9CiAKKyAgICAgIHNickRlY29kZXJfZHJjQXBwbHkoJmhTYnJEZWMtPnNickRyY0NoYW5uZWwsIHBMb3dCYW5kUmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgU0JSREVDX0xPV19QT1dFUikgPyBOVUxMIDogcExvd0JhbmRJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5xbWZEb21haW5PdXRDaC0+ZmIubm9fY29sLCAmb3V0U2NhbGVmYWN0b3IpOwogCi0gICAgICBzYnJEZWNvZGVyX2RyY0FwcGx5KCZoU2JyRGVjLT5zYnJEcmNDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUW1mQnVmZmVyUmVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIpID8gTlVMTCA6IFFtZkJ1ZmZlckltYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5TeW50aGVzaXNRTUYubm9fY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U2NhbGVmYWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotCi0KLSAgICAgIHFtZkNoYW5nZU91dFNjYWxlZmFjdG9yKCZoU2JyRGVjLT5TeW50aGVzaXNRTUYsIG91dFNjYWxlZmFjdG9yICk7CisgICAgICBxbWZDaGFuZ2VPdXRTY2FsZWZhY3RvcigmaFNickRlYy0+cW1mRG9tYWluT3V0Q2gtPmZiLCBvdXRTY2FsZWZhY3Rvcik7CiAKICAgICAgIHsKLSAgICAgICAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChxbWZUZW1wLCBGSVhQX0RCTCwgMiooNjQpKTsKKyAgICAgICAgSEFORExFX0ZSRVFfQkFORF9EQVRBIGhGcmVxID0gJmhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGE7CisgICAgICAgIGludCBzYXZlX3VzYiA9IGhTYnJEZWMtPnFtZkRvbWFpbk91dENoLT5mYi51c2I7CiAKLSAgICAgICAgcW1mU3ludGhlc2lzRmlsdGVyaW5nKCAmaFNickRlYy0+U3ludGhlc2lzUU1GLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTQlJERUNfTE9XX1BPV0VSKSA/IE5VTEwgOiBRbWZCdWZmZXJJbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRGVjLT5zYnJTY2FsZUZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFtZlRlbXApOwotCi0gICAgICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKHFtZlRlbXAsIEZJWFBfREJMLCAyKig2NCkpOworI2lmIChRTUZfTUFYX1NZTlRIRVNJU19CQU5EUyA8PSA2NCkKKyAgICAgICAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChxbWZUZW1wLCBGSVhQX0RCTCwgMiAqIFFNRl9NQVhfU1lOVEhFU0lTX0JBTkRTKTsKKyNlbHNlCisgICAgICAgIENfQUFMTE9DX1NUQUNLX1NUQVJUKHFtZlRlbXAsIEZJWFBfREJMLCAyICogUU1GX01BWF9TWU5USEVTSVNfQkFORFMpOworI2VuZGlmCisgICAgICAgIGlmIChoU2JyRGVjLT5xbWZEb21haW5PdXRDaC0+ZmIudXNiIDwgaEZyZXEtPm92X2hpZ2hTdWJiYW5kKSB7CisgICAgICAgICAgLyogd2UgbmVlZCB0byBwYXRjaCB1c2IgZm9yIHRoaXMgZnJhbWUgYXMgb3ZlcmxhcCBtYXkgY29udGFpbiBoaWdoZXIKKyAgICAgICAgICAgICBmcmVxdWVuY3kgcmFuZ2UgaWYgaGVhZGVyY2hhbmdlIG9jY3VyZWQ7IGZiLiB1c2IgaXMgYWx3YXlzIGxpbWl0ZWQKKyAgICAgICAgICAgICB0byBtYXhpbXVtIGZiLm5vX2NoYW5uZWxzOyBJbiBjYXNlIG9mIHdyb25nbHkgZGVjb2RlZCBoZWFkZXJzIGl0CisgICAgICAgICAgICAgbWlnaHQgYmUgdGhhdCBvdl9oaWdoU3ViYmFuZCBpcyBoaWdoZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHN5bnRoZXNpcworICAgICAgICAgICAgIGNoYW5uZWxzIChmYi5ub19jaGFubmVscyksIHdoaWNoIGlzIGZvcmJpZGRlbiwgdGhlcmVmb3JlIHdlIG5lZWQgdG8KKyAgICAgICAgICAgICBsaW1pdCBvdl9oaWdoU3ViYmFuZCB3aXRoIGZNaW4gZnVuY3Rpb24gdG8gYXZvaWQgbm90IGFsbG93ZWQgdXNiIGluCisgICAgICAgICAgICAgc3ludGhlc2lzIGZpbHRlcmJhbmsuICovCisgICAgICAgICAgaFNickRlYy0+cW1mRG9tYWluT3V0Q2gtPmZiLnVzYiA9CisgICAgICAgICAgICAgIGZNaW4oKFVJTlQpaEZyZXEtPm92X2hpZ2hTdWJiYW5kLAorICAgICAgICAgICAgICAgICAgIChVSU5UKWhTYnJEZWMtPnFtZkRvbWFpbk91dENoLT5mYi5ub19jaGFubmVscyk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgIHFtZlN5bnRoZXNpc0ZpbHRlcmluZygKKyAgICAgICAgICAgICAgJmhTYnJEZWMtPnFtZkRvbWFpbk91dENoLT5mYiwgcExvd0JhbmRSZWFsLAorICAgICAgICAgICAgICAoZmxhZ3MgJiBTQlJERUNfTE9XX1BPV0VSKSA/IE5VTEwgOiBwTG93QmFuZEltYWcsCisgICAgICAgICAgICAgICZoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLAorICAgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAsIHRpbWVPdXQsIHN0cmlkZU91dCwKKyAgICAgICAgICAgICAgcW1mVGVtcCk7CisgICAgICAgIH0KKyAgICAgICAgLyogcmVzdG9yZSBzYXZlZCB2YWx1ZSAqLworICAgICAgICBoU2JyRGVjLT5xbWZEb21haW5PdXRDaC0+ZmIudXNiID0gc2F2ZV91c2I7CisgICAgICAgIGhGcmVxLT5vdl9oaWdoU3ViYmFuZCA9IHNhdmVfdXNiOworI2lmIChRTUZfTUFYX1NZTlRIRVNJU19CQU5EUyA8PSA2NCkKKyAgICAgICAgQ19BQUxMT0NfU0NSQVRDSF9FTkQocW1mVGVtcCwgRklYUF9EQkwsIDIgKiBRTUZfTUFYX1NZTlRIRVNJU19CQU5EUyk7CisjZWxzZQorICAgICAgICBDX0FBTExPQ19TVEFDS19FTkQocW1mVGVtcCwgRklYUF9EQkwsIDIgKiBRTUZfTUFYX1NZTlRIRVNJU19CQU5EUyk7CisjZW5kaWYKICAgICAgIH0KLQogICAgIH0KIAogICB9IGVsc2UgeyAvKiAoZmxhZ3MgJiBTQlJERUNfUFNfREVDT0RFRCkgKi8KLSAgICBJTlQgaSwgc2RpZmYsIG91dFNjYWxlZmFjdG9yLCBzY2FsZUZhY3Rvckxvd0JhbmQsIHNjYWxlRmFjdG9ySGlnaEJhbmQ7Ci0gICAgU0NIQVIgc2NhbGVGYWN0b3JMb3dCYW5kX292LCBzY2FsZUZhY3Rvckxvd0JhbmRfbm9fb3Y7CisgICAgSU5UIHNkaWZmOworICAgIElOVCBzY2FsZUZhY3RvckhpZ2hCYW5kLCBzY2FsZUZhY3Rvckxvd0JhbmRfb3YsIHNjYWxlRmFjdG9yTG93QmFuZF9ub19vdjsKIAotICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mICAgICAgPSAmaFNickRlYy0+U3ludGhlc2lzUU1GOwotICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mUmlnaHQgPSAmaFNickRlY1JpZ2h0LT5TeW50aGVzaXNRTUY7CisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBzeW5RbWYgPSAmaFNickRlYy0+cW1mRG9tYWluT3V0Q2gtPmZiOworICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgc3luUW1mUmlnaHQgPSAmaFNickRlY1JpZ2h0LT5xbWZEb21haW5PdXRDaC0+ZmI7CiAKICAgICAvKiBhZGFwdCBzY2FsaW5nICovCi0gICAgc2RpZmYgPSBoU2JyRGVjLT5zYnJTY2FsZUZhY3Rvci5sYl9zY2FsZSAtIHJlc2VydmU7ICAgICAgICAgICAgICAgICAgLyogU2NhbGluZyBkaWZmZXJlbmNlICAgICAgICAgKi8KLSAgICBzY2FsZUZhY3RvckhpZ2hCYW5kICAgPSBzZGlmZiAtIGhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLmhiX3NjYWxlOyAgICAvKiBTY2FsZSBvZiBjdXJyZW50IGhpZ2ggYmFuZCAqLwotICAgIHNjYWxlRmFjdG9yTG93QmFuZF9vdiA9IHNkaWZmIC0gaFNickRlYy0+c2JyU2NhbGVGYWN0b3Iub3ZfbGJfc2NhbGU7IC8qIFNjYWxlIG9mIGxvdyBiYW5kIG92ZXJsYXBwaW5nIFFNRiBkYXRhICovCi0gICAgc2NhbGVGYWN0b3JMb3dCYW5kX25vX292ID0gc2RpZmYgLSBoU2JyRGVjLT5zYnJTY2FsZUZhY3Rvci5sYl9zY2FsZTsgLyogU2NhbGUgb2YgbG93IGJhbmQgY3VycmVudCBRTUYgZGF0YSAgICAgKi8KLSAgICBvdXRTY2FsZWZhY3RvciAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsIG91dHB1dCBzY2FsZSAqLworICAgIHNkaWZmID0gaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5sYl9zY2FsZSAtCisgICAgICAgICAgICByZXNlcnZlOyAvKiBTY2FsaW5nIGRpZmZlcmVuY2UgKi8KKyAgICBzY2FsZUZhY3RvckhpZ2hCYW5kID0gc2RpZmYgLSBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLmhiX3NjYWxlOworICAgIHNjYWxlRmFjdG9yTG93QmFuZF9vdiA9IHNkaWZmIC0gaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5vdl9sYl9zY2FsZTsKKyAgICBzY2FsZUZhY3Rvckxvd0JhbmRfbm9fb3YgPSBzZGlmZiAtIGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcubGJfc2NhbGU7CiAKLSAgICBpZiAoaF9wc19kLT5wcm9jRnJhbWVCYXNlZCA9PSAxKSAgICAvKiBJZiB3ZSBoYXZlIHN3aXRjaGVkIGZyb20gZnJhbWUgdG8gc2xvdCBiYXNlZCBwcm9jZXNzaW5nIGNvcHkgZmlsdGVyIHN0YXRlcyAqLwotICAgIHsgLyogcHJvY0ZyYW1lQmFzZWQgd2lsbCBiZSB1bnNldCBsYXRlciAqLworICAgIC8qIFNjYWxlIG9mIGxvdyBiYW5kIG92ZXJsYXBwaW5nIFFNRiBkYXRhICovCisgICAgc2NhbGVGYWN0b3JMb3dCYW5kX292ID0KKyAgICAgICAgZk1pbihERlJBQ1RfQklUUyAtIDEsIGZNYXgoLShERlJBQ1RfQklUUyAtIDEpLCBzY2FsZUZhY3Rvckxvd0JhbmRfb3YpKTsKKyAgICAvKiBTY2FsZSBvZiBsb3cgYmFuZCBjdXJyZW50IFFNRiBkYXRhICAgICAqLworICAgIHNjYWxlRmFjdG9yTG93QmFuZF9ub19vdiA9IGZNaW4oCisgICAgICAgIERGUkFDVF9CSVRTIC0gMSwgZk1heCgtKERGUkFDVF9CSVRTIC0gMSksIHNjYWxlRmFjdG9yTG93QmFuZF9ub19vdikpOworICAgIC8qIFNjYWxlIG9mIGN1cnJlbnQgaGlnaCBiYW5kICovCisgICAgc2NhbGVGYWN0b3JIaWdoQmFuZCA9CisgICAgICAgIGZNaW4oREZSQUNUX0JJVFMgLSAxLCBmTWF4KC0oREZSQUNUX0JJVFMgLSAxKSwgc2NhbGVGYWN0b3JIaWdoQmFuZCkpOworCisgICAgaWYgKGhfcHNfZC0+cHJvY0ZyYW1lQmFzZWQgPT0gMSkgLyogSWYgd2UgaGF2ZSBzd2l0Y2hlZCBmcm9tIGZyYW1lIHRvIHNsb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZCBwcm9jZXNzaW5nIGNvcHkgZmlsdGVyIHN0YXRlcyAqLworICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2NGcmFtZUJhc2VkIHdpbGwgYmUgdW5zZXQgbGF0ZXIgKi8KICAgICAgIC8qIGNvcHkgZmlsdGVyIHN0YXRlcyBmcm9tIGxlZnQgdG8gcmlnaHQgKi8KLSAgICAgIEZES21lbWNweShzeW5RbWZSaWdodC0+RmlsdGVyU3RhdGVzLCBzeW5RbWYtPkZpbHRlclN0YXRlcywgKCg2NDApLSg2NCkpKnNpemVvZihGSVhQX1FTUykpOworICAgICAgLyogd2FzICgoNjQwKS0oNjQpKSpzaXplb2YoRklYUF9RU1MpCisgICAgICAgICBmbGV4aWJsZSBhbW91bnQgb2Ygc3ludGhlc2lzIGJhbmRzIG5lZWRlZCBmb3IgUU1GIGJhc2VkIHJlc2FtcGxpbmcKKyAgICAgICovCisgICAgICBGREtfQVNTRVJUKGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnBHbG9iYWxDb25mLT5uQmFuZHNTeW50aGVzaXMgPD0KKyAgICAgICAgICAgICAgICAgUU1GX01BWF9TWU5USEVTSVNfQkFORFMpOworICAgICAgRkRLbWVtY3B5KHN5blFtZlJpZ2h0LT5GaWx0ZXJTdGF0ZXMsIHN5blFtZi0+RmlsdGVyU3RhdGVzLAorICAgICAgICAgICAgICAgIDkgKiBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5wR2xvYmFsQ29uZi0+bkJhbmRzU3ludGhlc2lzICoKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfUVNTKSk7CiAgICAgfQogCi0gICAgLyogc2NhbGUgQUxMIHFtZiB2YWxlcyAoIHJlYWwgYW5kIGltYWcgKSBvZiBtb25vIC8gbGVmdCBjaGFubmVsIHRvIHRoZQotICAgICAgIHNhbWUgc2NhbGUgZmFjdG9yICggb3ZfbGJfc2YsIGxiX3NmIGFuZCBocV9zZiApICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgc2NhbEZpbHRlckJhbmtWYWx1ZXMoIGhfcHNfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBhcmFtZXRyaWMgc3RlcmVvIGRlY29kZXIgaGFuZGxlICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJSZWFsLCAgICAgICAgICAgICAgICAgICAgICAvKiBxbWYgZmlsdGVyYmFuayB2YWx1ZXMgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgUW1mQnVmZmVySW1hZywgICAgICAgICAgICAgICAgICAgICAgLyogcW1mIGZpbHRlcmJhbmsgdmFsdWVzICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN5blFtZi0+bHNiLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNiciBzdGFydCBzdWJiYW5kICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5zYnJTY2FsZUZhY3Rvci5vdl9sYl9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+c2JyU2NhbGVGYWN0b3IubGJfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlRmFjdG9yTG93QmFuZF9vdiwgICAgICAgICAgICAgIC8qIGFkYXB0IHNjYWxpbmcgdmFsdWVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlRmFjdG9yTG93QmFuZF9ub19vdiwgICAgICAgICAgIC8qIGFkYXB0IHNjYWxpbmcgdmFsdWVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLmhiX3NjYWxlLCAgIC8qIGN1cnJlbnQgZnJhbWUgKCBoaWdoYmFuZCApICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlRmFjdG9ySGlnaEJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN5blFtZi0+bm9fY29sKTsKKyAgICAvKiBGZWVkIGRlbGF5bGluZXMgd2hlbiBwYXJhbWV0cmljIHN0ZXJlbyBpcyBzd2l0Y2hlZCBvbi4gKi8KKyAgICBQcmVwYXJlUHNQcm9jZXNzaW5nKGhfcHNfZCwgcExvd0JhbmRSZWFsLCBwTG93QmFuZEltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmRfb3YpOwogCiAgICAgLyogdXNlIHRoZSBzYW1lIHN5bnRoZXNlIHFtZiB2YWx1ZXMgZm9yIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgKi8KICAgICBzeW5RbWZSaWdodC0+bm9fY29sID0gc3luUW1mLT5ub19jb2w7Ci0gICAgc3luUW1mUmlnaHQtPmxzYiAgICA9IHN5blFtZi0+bHNiOwotICAgIHN5blFtZlJpZ2h0LT51c2IgICAgPSBzeW5RbWYtPnVzYjsKKyAgICBzeW5RbWZSaWdodC0+bHNiID0gc3luUW1mLT5sc2I7CisgICAgc3luUW1mUmlnaHQtPnVzYiA9IHN5blFtZi0+dXNiOwogCi0gICAgaW50IGVudj0wOwotCi0gICAgICBvdXRTY2FsZWZhY3RvciArPSAoU0NBTF9IRUFEUk9PTSsxKTsgLyogcHNEaWZmU2NhbGUhICovCisgICAgaW50IGVudiA9IDA7CiAKICAgICB7Ci0gICAgICBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKHBXb3JrQnVmZmVyLCBGSVhQX0RCTCwgMiooNjQpKTsKKyNpZiAoUU1GX01BWF9TWU5USEVTSVNfQkFORFMgPD0gNjQpCisgICAgICBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKHBXb3JrQnVmZmVyLCBGSVhQX0RCTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIFFNRl9NQVhfU1lOVEhFU0lTX0JBTkRTKTsKKyNlbHNlCisgICAgICBDX0FBTExPQ19TVEFDS19TVEFSVChwV29ya0J1ZmZlciwgRklYUF9EQkwsIDIgKiBRTUZfTUFYX1NZTlRIRVNJU19CQU5EUyk7CisjZW5kaWYKIAogICAgICAgaW50IG1heFNoaWZ0ID0gMDsKIApAQCAtNjQyLDk5ICs3ODEsODAgQEAKICAgICAgICAgfQogICAgICAgfQogCi0gICAgICAvKiBjb3B5IERSQyBkYXRhIHRvIHJpZ2h0IGNoYW5uZWwgKHdpdGggUFMgYm90aCBjaGFubmVscyB1c2UgdGhlIHNhbWUgRFJDIGdhaW5zKSAqLwotICAgICAgRkRLbWVtY3B5KCZoU2JyRGVjUmlnaHQtPnNickRyY0NoYW5uZWwsICZoU2JyRGVjLT5zYnJEcmNDaGFubmVsLCBzaXplb2YoU0JSREVDX0RSQ19DSEFOTkVMKSk7CisgICAgICAvKiBjb3B5IERSQyBkYXRhIHRvIHJpZ2h0IGNoYW5uZWwgKHdpdGggUFMgYm90aCBjaGFubmVscyB1c2UgdGhlIHNhbWUgRFJDCisgICAgICAgKiBnYWlucykgKi8KKyAgICAgIEZES21lbWNweSgmaFNickRlY1JpZ2h0LT5zYnJEcmNDaGFubmVsLCAmaFNickRlYy0+c2JyRHJjQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICBzaXplb2YoU0JSREVDX0RSQ19DSEFOTkVMKSk7CiAKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzeW5RbWYtPm5vX2NvbDsgaSsrKSB7ICAvKiAtLS0tLSBub19jb2wgbG9vcCAtLS0tLSAqLworICAgICAgZm9yIChpID0gMDsgaSA8IHN5blFtZi0+bm9fY29sOyBpKyspIHsgLyogLS0tLS0gbm9fY29sIGxvb3AgLS0tLS0gKi8KIAogICAgICAgICBJTlQgb3V0U2NhbGVmYWN0b3JSLCBvdXRTY2FsZWZhY3Rvckw7Ci0gICAgICAgIG91dFNjYWxlZmFjdG9yUiA9IG91dFNjYWxlZmFjdG9yTCA9IG91dFNjYWxlZmFjdG9yOwogCiAgICAgICAgIC8qIHFtZiB0aW1lc2xvdCBvZiByaWdodCBjaGFubmVsICovCi0gICAgICAgIEZJWFBfREJMKiByUW1mUmVhbCA9IHBXb3JrQnVmZmVyOwotICAgICAgICBGSVhQX0RCTCogclFtZkltYWcgPSBwV29ya0J1ZmZlciArIDY0OwotCisgICAgICAgIEZJWFBfREJMICpyUW1mUmVhbCA9IHBXb3JrQnVmZmVyOworICAgICAgICBGSVhQX0RCTCAqclFtZkltYWcgPSBwV29ya0J1ZmZlciArIHN5blFtZi0+bm9fY2hhbm5lbHM7CiAKICAgICAgICAgewotICAgICAgICAgIGlmICggaSA9PSBoX3BzX2QtPmJzRGF0YVtoX3BzX2QtPnByb2Nlc3NTbG90XS5tcGVnLmFFbnZTdGFydFN0b3BbZW52XSApIHsKLSAgICAgICAgICAgIGluaXRTbG90QmFzZWRSb3RhdGlvbiggaF9wc19kLCBlbnYsIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuaGlnaFN1YmJhbmQgKTsKKyAgICAgICAgICBpZiAoaSA9PQorICAgICAgICAgICAgICBoX3BzX2QtPmJzRGF0YVtoX3BzX2QtPnByb2Nlc3NTbG90XS5tcGVnLmFFbnZTdGFydFN0b3BbZW52XSkgeworICAgICAgICAgICAgaW5pdFNsb3RCYXNlZFJvdGF0aW9uKGhfcHNfZCwgZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuaGlnaFN1YmJhbmQpOwogICAgICAgICAgICAgZW52Kys7CiAgICAgICAgICAgfQogCi0gICAgICAgICAgQXBwbHlQc1Nsb3QoIGhfcHNfZCwgICAgICAgICAgICAgICAgICAgLyogcGFyYW1ldHJpYyBzdGVyZW8gZGVjb2RlciBoYW5kbGUgICovCi0gICAgICAgICAgICAgICAgICAgICAgKFFtZkJ1ZmZlclJlYWwgKyBpKSwgICAgICAgLyogb25lIHRpbWVzbG90IG9mIGxlZnQvbW9ubyBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgICAgICAgKFFtZkJ1ZmZlckltYWcgKyBpKSwgICAgICAgLyogb25lIHRpbWVzbG90IG9mIGxlZnQvbW9ubyBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgICAgICAgIHJRbWZSZWFsLCAgICAgICAgICAgICAgICAgLyogb25lIHRpbWVzbG90IG9yIHJpZ2h0IGNoYW5uZWwgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgIHJRbWZJbWFnKTsgICAgICAgICAgICAgICAgLyogb25lIHRpbWVzbG90IG9yIHJpZ2h0IGNoYW5uZWwgICAgICovCisgICAgICAgICAgQXBwbHlQc1Nsb3QoCisgICAgICAgICAgICAgIGhfcHNfZCwgICAgICAgICAgICAgLyogcGFyYW1ldHJpYyBzdGVyZW8gZGVjb2RlciBoYW5kbGUgICovCisgICAgICAgICAgICAgIChwTG93QmFuZFJlYWwgKyBpKSwgLyogb25lIHRpbWVzbG90IG9mIGxlZnQvbW9ubyBjaGFubmVsICovCisgICAgICAgICAgICAgIChwTG93QmFuZEltYWcgKyBpKSwgLyogb25lIHRpbWVzbG90IG9mIGxlZnQvbW9ubyBjaGFubmVsICovCisgICAgICAgICAgICAgIHJRbWZSZWFsLCAgICAgICAgICAgLyogb25lIHRpbWVzbG90IG9yIHJpZ2h0IGNoYW5uZWwgICAgICovCisgICAgICAgICAgICAgIHJRbWZJbWFnLCAgICAgICAgICAgLyogb25lIHRpbWVzbG90IG9yIHJpZ2h0IGNoYW5uZWwgICAgICovCisgICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZF9ub19vdiwKKyAgICAgICAgICAgICAgKGkgPCBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXApCisgICAgICAgICAgICAgICAgICA/IHNjYWxlRmFjdG9yTG93QmFuZF9vdgorICAgICAgICAgICAgICAgICAgOiBzY2FsZUZhY3Rvckxvd0JhbmRfbm9fb3YsCisgICAgICAgICAgICAgIHNjYWxlRmFjdG9ySGlnaEJhbmQsIHN5blFtZi0+bHNiLCBzeW5RbWYtPnVzYik7CisKKyAgICAgICAgICBvdXRTY2FsZWZhY3RvckwgPSBvdXRTY2FsZWZhY3RvclIgPSAxOyAvKiBwc0RpZmZTY2FsZSEgKE1QRUctUFMpICovCiAgICAgICAgIH0KIAotCi0gICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZCA9IChpPCg2KSkgPyBzY2FsZUZhY3Rvckxvd0JhbmRfb3YgOiBzY2FsZUZhY3Rvckxvd0JhbmRfbm9fb3Y7Ci0KLQotICAgICAgICBzYnJEZWNvZGVyX2RyY0FwcGx5U2xvdCAoIC8qIHJpZ2h0IGNoYW5uZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRGVjUmlnaHQtPnNickRyY0NoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgclFtZlJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgclFtZkltYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5RbWZSaWdodC0+bm9fY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNoaWZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIHNickRlY29kZXJfZHJjQXBwbHlTbG90KC8qIHJpZ2h0IGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJEZWNSaWdodC0+c2JyRHJjQ2hhbm5lbCwgclFtZlJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJRbWZJbWFnLCBpLCBzeW5RbWZSaWdodC0+bm9fY29sLCBtYXhTaGlmdCk7CiAKICAgICAgICAgb3V0U2NhbGVmYWN0b3JSICs9IG1heFNoaWZ0OwogCi0gICAgICAgIHNickRlY29kZXJfZHJjQXBwbHlTbG90ICggLyogbGVmdCBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickRlYy0+c2JyRHJjQ2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooUW1mQnVmZmVyUmVhbCArIGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihRbWZCdWZmZXJJbWFnICsgaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5RbWYtPm5vX2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaGlmdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBzYnJEZWNvZGVyX2RyY0FwcGx5U2xvdCgvKiBsZWZ0IGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJEZWMtPnNickRyY0NoYW5uZWwsICoocExvd0JhbmRSZWFsICsgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocExvd0JhbmRJbWFnICsgaSksIGksIHN5blFtZi0+bm9fY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaGlmdCk7CiAKICAgICAgICAgb3V0U2NhbGVmYWN0b3JMICs9IG1heFNoaWZ0OwogCisgICAgICAgIGlmICghKGZsYWdzICYgU0JSREVDX1NLSVBfUU1GX1NZTikpIHsKKyAgICAgICAgICBxbWZTeW50aGVzaXNGaWx0ZXJpbmdTbG90KAorICAgICAgICAgICAgICBzeW5RbWZSaWdodCwgclFtZlJlYWwsIC8qIFFNRiByZWFsIGJ1ZmZlciAqLworICAgICAgICAgICAgICByUW1mSW1hZywgICAgICAgICAgICAgIC8qIFFNRiBpbWFnIGJ1ZmZlciAqLworICAgICAgICAgICAgICBvdXRTY2FsZWZhY3RvckwsIG91dFNjYWxlZmFjdG9yTCwKKyAgICAgICAgICAgICAgdGltZU91dFJpZ2h0ICsgKGkgKiBzeW5RbWYtPm5vX2NoYW5uZWxzICogc3RyaWRlT3V0KSwgc3RyaWRlT3V0LAorICAgICAgICAgICAgICBwV29ya0J1ZmZlcik7CiAKLSAgICAgICAgLyogc2NhbGUgZmlsdGVyIHN0YXRlcyBmb3IgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCAqLwotICAgICAgICBxbWZDaGFuZ2VPdXRTY2FsZWZhY3Rvciggc3luUW1mLCBvdXRTY2FsZWZhY3RvckwgKTsKLSAgICAgICAgcW1mQ2hhbmdlT3V0U2NhbGVmYWN0b3IoIHN5blFtZlJpZ2h0LCBvdXRTY2FsZWZhY3RvclIgKTsKLQotICAgICAgICB7Ci0KLSAgICAgICAgICBxbWZTeW50aGVzaXNGaWx0ZXJpbmdTbG90KCBzeW5RbWZSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByUW1mUmVhbCwgICAgICAgICAgICAgICAgLyogUU1GIHJlYWwgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgclFtZkltYWcsICAgICAgICAgICAgICAgIC8qIFFNRiBpbWFnIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3RvckhpZ2hCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVPdXRSaWdodCsoaSpzeW5RbWYtPm5vX2NoYW5uZWxzKnN0cmlkZU91dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrQnVmZmVyKTsKLQotICAgICAgICAgIHFtZlN5bnRoZXNpc0ZpbHRlcmluZ1Nsb3QoIHN5blFtZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihRbWZCdWZmZXJSZWFsICsgaSksICAgICAgLyogUU1GIHJlYWwgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooUW1mQnVmZmVySW1hZyArIGkpLCAgICAgIC8qIFFNRiBpbWFnIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9yTG93QmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3RvckhpZ2hCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVPdXQrKGkqc3luUW1mLT5ub19jaGFubmVscypzdHJpZGVPdXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29ya0J1ZmZlcik7Ci0KKyAgICAgICAgICBxbWZTeW50aGVzaXNGaWx0ZXJpbmdTbG90KAorICAgICAgICAgICAgICBzeW5RbWYsICoocExvd0JhbmRSZWFsICsgaSksIC8qIFFNRiByZWFsIGJ1ZmZlciAqLworICAgICAgICAgICAgICAqKHBMb3dCYW5kSW1hZyArIGkpLCAgICAgICAgIC8qIFFNRiBpbWFnIGJ1ZmZlciAqLworICAgICAgICAgICAgICBvdXRTY2FsZWZhY3RvclIsIG91dFNjYWxlZmFjdG9yUiwKKyAgICAgICAgICAgICAgdGltZU91dCArIChpICogc3luUW1mLT5ub19jaGFubmVscyAqIHN0cmlkZU91dCksIHN0cmlkZU91dCwKKyAgICAgICAgICAgICAgcFdvcmtCdWZmZXIpOwogICAgICAgICB9CiAgICAgICB9IC8qIG5vX2NvbCBsb29wICBpICAqLwotCi0gICAgICAvKiBzY2FsZSBiYWNrICg2KSB0aW1lc2xvdHMgbG9vayBhaGVhZCBmb3IgaHlicmlkIGZpbHRlcmJhbmsgdG8gb3JpZ2luYWwgdmFsdWUgKi8KLSAgICAgIHJlc2NhbEZpbHRlckJhbmtWYWx1ZXMoIGhfcHNfZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFtZkJ1ZmZlclJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRbWZCdWZmZXJJbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luUW1mLT5sc2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5RbWYtPm5vX2NvbCApOwotCi0gICAgICBDX0FBTExPQ19TQ1JBVENIX0VORChwV29ya0J1ZmZlciwgRklYUF9EQkwsIDIqKDY0KSk7CisjaWYgKFFNRl9NQVhfU1lOVEhFU0lTX0JBTkRTIDw9IDY0KQorICAgICAgQ19BQUxMT0NfU0NSQVRDSF9FTkQocFdvcmtCdWZmZXIsIEZJWFBfREJMLCAyICogUU1GX01BWF9TWU5USEVTSVNfQkFORFMpOworI2Vsc2UKKyAgICAgIENfQUFMTE9DX1NUQUNLX0VORChwV29ya0J1ZmZlciwgRklYUF9EQkwsIDIgKiBRTUZfTUFYX1NZTlRIRVNJU19CQU5EUyk7CisjZW5kaWYKICAgICB9CiAgIH0KIAotICBzYnJEZWNvZGVyX2RyY1VwZGF0ZUNoYW5uZWwoICZoU2JyRGVjLT5zYnJEcmNDaGFubmVsICk7Ci0KKyAgc2JyRGVjb2Rlcl9kcmNVcGRhdGVDaGFubmVsKCZoU2JyRGVjLT5zYnJEcmNDaGFubmVsKTsKIAogICAvKgogICAgIFVwZGF0ZSBvdmVybGFwIGJ1ZmZlcgpAQCAtNzQyLDE1MSArODYyLDEyOCBAQAogICAgIHRoZSBzdG9wIGZyZXF1ZW5jeSByYWlzZXMuCiAgICovCiAKLSAgaWYgKGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcCA+IDApCi0gIHsKLSAgICBpZiAoISAoZmxhZ3MgJiBTQlJERUNfTE9XX1BPV0VSKSkgewotICAgICAgZm9yICggaT0wOyBpPGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcDsgaSsrICkgewotICAgICAgICBGREttZW1jcHkoUW1mQnVmZmVyUmVhbFtpXSwgUW1mQnVmZmVyUmVhbFtpK25vQ29sc10sICg2NCkqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgICAgIEZES21lbWNweShRbWZCdWZmZXJJbWFnW2ldLCBRbWZCdWZmZXJJbWFnW2krbm9Db2xzXSwgKDY0KSpzaXplb2YoRklYUF9EQkwpKTsKLSAgICAgIH0KLSAgICB9IGVsc2UKLSAgICAgIGZvciAoIGk9MDsgaTxoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXA7IGkrKyApIHsKLSAgICAgICAgRkRLbWVtY3B5KFFtZkJ1ZmZlclJlYWxbaV0sIFFtZkJ1ZmZlclJlYWxbaStub0NvbHNdLCAoNjQpKnNpemVvZihGSVhQX0RCTCkpOwotICAgICAgfQorICBpZiAoIShmbGFncyAmIFNCUkRFQ19TS0lQX1FNRl9TWU4pKSB7CisgICAgeworICAgICAgRkRLX1FtZkRvbWFpbl9TYXZlT3ZlcmxhcChoU2JyRGVjLT5xbWZEb21haW5JbkNoLCAwKTsKKyAgICAgIEZES19BU1NFUlQoaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5vdl9sYl9zY2FsZSA9PSBzYXZlTGJTY2FsZSk7CisgICAgfQogICB9CiAKLSAgaFNickRlYy0+c2JyU2NhbGVGYWN0b3Iub3ZfbGJfc2NhbGUgPSBzYXZlTGJTY2FsZTsKKyAgaFNickRlYy0+c2F2ZWRTdGF0ZXMgPSAwOwogCiAgIC8qIFNhdmUgY3VycmVudCBmcmFtZSBzdGF0dXMgKi8KICAgaFByZXZGcmFtZURhdGEtPmZyYW1lRXJyb3JGbGFnID0gaEhlYWRlckRhdGEtPmZyYW1lRXJyb3JGbGFnOworICBoU2JyRGVjLT5hcHBseVNiclByb2Nfb2xkID0gYXBwbHlQcm9jZXNzaW5nOwogCi19IC8vIHNicl9kZWMoKQotCit9IC8qIHNicl9kZWMoKSAqLwogCiAvKiEKICAgXGJyaWVmICAgICBDcmVhdGVzIHNiciBkZWNvZGVyIHN0cnVjdHVyZQogICBccmV0dXJuICAgIGVycm9yQ29kZSwgMCBpZiBzdWNjZXNzZnVsCiAqLwogU0JSX0VSUk9SCi1jcmVhdGVTYnJEZWMgKFNCUl9DSEFOTkVMICogaFNickNoYW5uZWwsCi0gICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLwotICAgICAgICAgICAgICBUUkFOU1BPU0VSX1NFVFRJTkdTICpwU2V0dGluZ3MsCi0gICAgICAgICAgICAgIGNvbnN0IGludCAgICAgZG93bnNhbXBsZUZhYywgICAgICAgIC8qITwgRG93bnNhbXBsaW5nIGZhY3RvciAqLwotICAgICAgICAgICAgICBjb25zdCBVSU5UICAgIHFtZkZsYWdzLCAgICAgICAgICAgICAvKiE8IGZsYWdzIC0+IDE6IEhRL0xQIHNlbGVjdG9yLCAyOiBDTERGQiAqLwotICAgICAgICAgICAgICBjb25zdCBVSU5UICAgIGZsYWdzLAotICAgICAgICAgICAgICBjb25zdCBpbnQgICAgIG92ZXJsYXAsIAotICAgICAgICAgICAgICBpbnQgICAgICAgICAgIGNoYW4pICAgICAgICAgICAgICAgICAvKiE8IENoYW5uZWwgZm9yIHdoaWNoIHRvIGFzc2lnbiBidWZmZXJzIGV0Yy4gKi8KK2NyZWF0ZVNickRlYyhTQlJfQ0hBTk5FTCAqaFNickNoYW5uZWwsCisgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCisgICAgICAgICAgICAgVFJBTlNQT1NFUl9TRVRUSU5HUyAqcFNldHRpbmdzLAorICAgICAgICAgICAgIGNvbnN0IGludCBkb3duc2FtcGxlRmFjLCAvKiE8IERvd25zYW1wbGluZyBmYWN0b3IgKi8KKyAgICAgICAgICAgICBjb25zdCBVSU5UIHFtZkZsYWdzLCAvKiE8IGZsYWdzIC0+IDE6IEhRL0xQIHNlbGVjdG9yLCAyOiBDTERGQiAqLworICAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MsIGNvbnN0IGludCBvdmVybGFwLAorICAgICAgICAgICAgIGludCBjaGFuLCAvKiE8IENoYW5uZWwgZm9yIHdoaWNoIHRvIGFzc2lnbiBidWZmZXJzIGV0Yy4gKi8KKyAgICAgICAgICAgICBpbnQgY29kZWNGcmFtZVNpemUpCiAKIHsKICAgU0JSX0VSUk9SIGVyciA9IFNCUkRFQ19PSzsKLSAgaW50IHRpbWVTbG90cyA9IGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHM7ICAgLyogTnVtYmVyIG9mIFNCUiBzbG90cyBwZXIgZnJhbWUgKi8KLSAgaW50IG5vQ29scyA9IHRpbWVTbG90cyAqIGhIZWFkZXJEYXRhLT50aW1lU3RlcDsgLyogTnVtYmVyIG9mIFFNRiBzbG90cyBwZXIgZnJhbWUgKi8KKyAgaW50IHRpbWVTbG90cyA9CisgICAgICBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzOyAvKiBOdW1iZXIgb2YgU0JSIHNsb3RzIHBlciBmcmFtZSAqLworICBpbnQgbm9Db2xzID0KKyAgICAgIHRpbWVTbG90cyAqIGhIZWFkZXJEYXRhLT50aW1lU3RlcDsgLyogTnVtYmVyIG9mIFFNRiBzbG90cyBwZXIgZnJhbWUgKi8KICAgSEFORExFX1NCUl9ERUMgaHMgPSAmKGhTYnJDaGFubmVsLT5TYnJEZWMpOwogCi0gIC8qIEluaXRpYWxpemUgc2NhbGUgZmFjdG9ycyAqLwotICBocy0+c2JyU2NhbGVGYWN0b3Iub3ZfbGJfc2NhbGUgID0gMDsKLSAgaHMtPnNiclNjYWxlRmFjdG9yLm92X2hiX3NjYWxlICA9IDA7Ci0gIGhzLT5zYnJTY2FsZUZhY3Rvci5oYl9zY2FsZSAgICAgPSAwOworI2lmIChTQlJERUNfTUFYX0hCX0ZBREVfRlJBTUVTID4gMCkKKyAgaHMtPmhpZ2hCYW5kRmFkZUNudCA9IFNCUkRFQ19NQVhfSEJfRkFERV9GUkFNRVM7CiAKKyNlbmRpZgorICBocy0+c2NhbGVfaGJlID0gMTU7CisgIGhzLT5zY2FsZV9sYiA9IDE1OworICBocy0+c2NhbGVfb3YgPSAxNTsKKworICBocy0+cHJldl9mcmFtZV9sU2JyID0gMDsKKyAgaHMtPnByZXZfZnJhbWVfaGJlU2JyID0gMDsKKworICBocy0+Y29kZWNGcmFtZVNpemUgPSBjb2RlY0ZyYW1lU2l6ZTsKIAogICAvKgogICAgIGNyZWF0ZSBlbnZlbG9wZSBjYWxjdWxhdG9yCiAgICovCi0gIGVyciA9IGNyZWF0ZVNickVudmVsb3BlQ2FsYyAoJmhzLT5TYnJDYWxjdWxhdGVFbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgZXJyID0gY3JlYXRlU2JyRW52ZWxvcGVDYWxjKCZocy0+U2JyQ2FsY3VsYXRlRW52ZWxvcGUsIGhIZWFkZXJEYXRhLCBjaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwogICBpZiAoZXJyICE9IFNCUkRFQ19PSykgewogICAgIHJldHVybiBlcnI7CiAgIH0KIAotICAvKgotICAgIGNyZWF0ZSBRTUYgZmlsdGVyIGJhbmtzCi0gICovCi0gIHsKLSAgICBpbnQgcW1mRXJyOwotICAgIC8qIEFkYXB0ZWQgUU1GIGFuYWx5c2lzIHBvc3QtdHdpZGRsZXMgZm9yIGRvd24tc2FtcGxlZCBIUSBTQlIgKi8KLSAgICBjb25zdCBVSU5UIGRvd25TYW1wbGVkRmxhZyA9IChmbGFncyAmIFNCUkRFQ19ET1dOU0FNUExFKSA/IFFNRl9GTEFHX0RPV05TQU1QTEVEIDogMDsKLQotICAgIHFtZkVyciA9IHFtZkluaXRBbmFseXNpc0ZpbHRlckJhbmsgKAotICAgICAgICAgICAgICAgICAgICAmaHMtPkFuYWx5c2lzY1FNRiwKLSAgICAgICAgICAgICAgICAgICAgIGhzLT5hbmFRbWZTdGF0ZXMsCi0gICAgICAgICAgICAgICAgICAgICBub0NvbHMsCi0gICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmxvd1N1YmJhbmQsCi0gICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmhpZ2hTdWJiYW5kLAotICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPm51bWJlck9mQW5hbHlzaXNCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgIChxbWZGbGFncyAmICh+UU1GX0ZMQUdfS0VFUF9TVEFURVMpKSB8IGRvd25TYW1wbGVkRmxhZwotICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICBpZiAocW1mRXJyICE9IDApIHsKLSAgICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwotICAgIH0KLSAgfQotICBpZiAoaHMtPnBTeW5RbWZTdGF0ZXMgPT0gTlVMTCkgewotICAgIGhzLT5wU3luUW1mU3RhdGVzID0gR2V0UmFtX3Nicl9RbWZTdGF0ZXNTeW50aGVzaXMoY2hhbik7Ci0gICAgaWYgKGhzLT5wU3luUW1mU3RhdGVzID09IE5VTEwpCi0gICAgICByZXR1cm4gU0JSREVDX01FTV9BTExPQ19GQUlMRUQ7Ci0gIH0KLQotICB7Ci0gICAgaW50IHFtZkVycjsKLQotICAgIHFtZkVyciA9IHFtZkluaXRTeW50aGVzaXNGaWx0ZXJCYW5rICgKLSAgICAgICAgICAgJmhzLT5TeW50aGVzaXNRTUYsCi0gICAgICAgICAgICBocy0+cFN5blFtZlN0YXRlcywKLSAgICAgICAgICAgIG5vQ29scywKLSAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubG93U3ViYmFuZCwKLSAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuaGlnaFN1YmJhbmQsCi0gICAgICAgICAgICAoNjQpIC8gZG93bnNhbXBsZUZhYywKLSAgICAgICAgICAgIHFtZkZsYWdzICYgKH5RTUZfRkxBR19LRUVQX1NUQVRFUykKLSAgICAgICAgICAgICk7Ci0KLSAgICBpZiAocW1mRXJyICE9IDApIHsKLSAgICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwotICAgIH0KLSAgfQotICBpbml0U2JyUHJldkZyYW1lRGF0YSAoJmhTYnJDaGFubmVsLT5wcmV2RnJhbWVEYXRhLCB0aW1lU2xvdHMpOworICBpbml0U2JyUHJldkZyYW1lRGF0YSgmaFNickNoYW5uZWwtPnByZXZGcmFtZURhdGEsIHRpbWVTbG90cyk7CiAKICAgLyoKICAgICBjcmVhdGUgdHJhbnNwb3NlcgogICAqLwotICBlcnIgPSBjcmVhdGVMcHBUcmFuc3Bvc2VyICgmaHMtPkxwcFRyYW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubG93U3ViYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS52X2tfbWFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm51bU1hc3RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHMtPlN5bnRoZXNpc1FNRi51c2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVTbG90cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHMtPkFuYWx5c2lzY1FNRi5ub19jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZU5vaXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5OZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5zYnJQcm9jU21wbFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXAgKTsKKyAgZXJyID0gY3JlYXRlTHBwVHJhbnNwb3NlcigKKyAgICAgICZocy0+THBwVHJhbnMsIHBTZXR0aW5ncywgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5sb3dTdWJiYW5kLAorICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS52X2tfbWFzdGVyLCBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm51bU1hc3RlciwKKyAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuaGlnaFN1YmJhbmQsIHRpbWVTbG90cywgbm9Db2xzLAorICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlTm9pc2UsCisgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5OZmIsIGhIZWFkZXJEYXRhLT5zYnJQcm9jU21wbFJhdGUsIGNoYW4sCisgICAgICBvdmVybGFwKTsKICAgaWYgKGVyciAhPSBTQlJERUNfT0spIHsKICAgICByZXR1cm4gZXJyOwogICB9CiAKLSAgLyogVGhlIENMREZCIGRvZXMgbm90IGhhdmUgb3ZlcmxhcCAqLwotICBpZiAoKHFtZkZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpID09IDApIHsKLSAgICBpZiAoaHMtPnBTYnJPdmVybGFwQnVmZmVyID09IE5VTEwpIHsKLSAgICAgIGhzLT5wU2JyT3ZlcmxhcEJ1ZmZlciA9IEdldFJhbV9zYnJfT3ZlcmxhcEJ1ZmZlcihjaGFuKTsKLSAgICAgIGlmIChocy0+cFNick92ZXJsYXBCdWZmZXIgPT0gTlVMTCkgIHsKLSAgICAgICAgcmV0dXJuIFNCUkRFQ19NRU1fQUxMT0NfRkFJTEVEOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBDbGVhciBvdmVybGFwIGJ1ZmZlciAqLwotICAgICAgRkRLbWVtY2xlYXIoIGhzLT5wU2JyT3ZlcmxhcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogMiAqICg2KSAqICg2NCkKLSAgICAgICAgICAgICAgICAgKTsKKyAgaWYgKGZsYWdzICYgU0JSREVDX1VTQUNfSEFSTU9OSUNTQlIpIHsKKyAgICBpbnQgbm9DaGFubmVscywgYlNicjQxID0gZmxhZ3MgJiBTQlJERUNfUVVBRF9SQVRFID8gMSA6IDA7CisKKyAgICBub0NoYW5uZWxzID0KKyAgICAgICAgUU1GX1NZTlRIX0NIQU5ORUxTIC8KKyAgICAgICAgKChiU2JyNDEgKyAxKSAqIDIpOyAvKiAzMiBmb3IgKDMyOjY0IGFuZCAyNDo2NCkgYW5kIDE2IGZvciAxNjo2NCAqLworCisgICAgLyogc2hhcmVkIG1lbW9yeSBiZXR3ZWVuIGhiZUxpZ2h0VGltZURlbGF5QnVmZmVyIGFuZCBoUW1mSEJFU2xvdHNSZWFsIGlmCisgICAgICogU0JSREVDX0hCRV9FTkFCTEUgKi8KKyAgICBoU2JyQ2hhbm5lbC0+U2JyRGVjLnRtcF9tZW1vcnkgPSAoRklYUF9EQkwgKiopZmRrQ2FsbG9jTWF0cml4MkRfYWxpZ25lZCgKKyAgICAgICAgbm9Db2xzLCBub0NoYW5uZWxzLCBzaXplb2YoRklYUF9EQkwpKTsKKyAgICBpZiAoaFNickNoYW5uZWwtPlNickRlYy50bXBfbWVtb3J5ID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBTQlJERUNfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICB9CisKKyAgICBoU2JyQ2hhbm5lbC0+U2JyRGVjLmhRbWZIQkVTbG90c1JlYWwgPSBoU2JyQ2hhbm5lbC0+U2JyRGVjLnRtcF9tZW1vcnk7CisgICAgaFNickNoYW5uZWwtPlNickRlYy5oUW1mSEJFU2xvdHNJbWFnID0KKyAgICAgICAgKEZJWFBfREJMICoqKWZka0NhbGxvY01hdHJpeDJEX2FsaWduZWQobm9Db2xzLCBub0NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpKTsKKyAgICBpZiAoaFNickNoYW5uZWwtPlNickRlYy5oUW1mSEJFU2xvdHNJbWFnID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBTQlJERUNfTUVNX0FMTE9DX0ZBSUxFRDsKKyAgICB9CisKKyAgICAvKiBidWZmZXJzIGNvbnRhaW5pbmcgdW5tb2RpZmllZCBxbWYgZGF0YTsgcmVxdWlyZWQgd2hlbiBzd2l0Y2hpbmcgZnJvbQorICAgICAqIGxlZ2FjeSBTQlIgdG8gSEJFICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIGJ1ZmZlciBjYW4gYmUgdXNlZCBhcyBMUENGaWx0ZXJzdGF0ZXMgYnVmZmVyIGJlY2F1c2UgbGVnYWN5IFNCUiBuZWVkcworICAgICAqIGV4YWN0bHkgdGhlc2UgdmFsdWVzIGZvciBMUEMgZmlsdGVyaW5nICovCisgICAgaFNickNoYW5uZWwtPlNickRlYy5jb2RlY1FNRkJ1ZmZlclJlYWwgPQorICAgICAgICAoRklYUF9EQkwgKiopZmRrQ2FsbG9jTWF0cml4MkRfYWxpZ25lZChub0NvbHMsIG5vQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkpOworICAgIGlmIChoU2JyQ2hhbm5lbC0+U2JyRGVjLmNvZGVjUU1GQnVmZmVyUmVhbCA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gU0JSREVDX01FTV9BTExPQ19GQUlMRUQ7CisgICAgfQorCisgICAgaFNickNoYW5uZWwtPlNickRlYy5jb2RlY1FNRkJ1ZmZlckltYWcgPQorICAgICAgICAoRklYUF9EQkwgKiopZmRrQ2FsbG9jTWF0cml4MkRfYWxpZ25lZChub0NvbHMsIG5vQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkpOworICAgIGlmIChoU2JyQ2hhbm5lbC0+U2JyRGVjLmNvZGVjUU1GQnVmZmVySW1hZyA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gU0JSREVDX01FTV9BTExPQ19GQUlMRUQ7CisgICAgfQorCisgICAgZXJyID0gUW1mVHJhbnNwb3NlckNyZWF0ZSgmaHMtPmhIQkUsIGNvZGVjRnJhbWVTaXplLCAwLCBiU2JyNDEpOworICAgIGlmIChlcnIgIT0gU0JSREVDX09LKSB7CisgICAgICByZXR1cm4gZXJyOwogICAgIH0KICAgfQogCi0gIC8qIENsZWFyIGlucHV0IGRlbGF5IGxpbmUgKi8KLSAgRkRLbWVtY2xlYXIoaHMtPmNvcmVEZWxheUJ1ZiwgKDk2KSpzaXplb2YoSU5UX1BDTSkpOwotCi0gIC8qIGFzc2lnbiBxbWYgdGltZSBzbG90cyAqLwotICBhc3NpZ25UaW1lU2xvdHMoICZoU2JyQ2hhbm5lbC0+U2JyRGVjLCBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzICogaEhlYWRlckRhdGEtPnRpbWVTdGVwLCBxbWZGbGFncyAmIFFNRl9GTEFHX0xQKTsKLQogICByZXR1cm4gZXJyOwogfQogCkBAIC04OTQsNjUgKzk5MSw4OCBAQAogICBcYnJpZWYgICAgIERlbGV0ZSBzYnIgZGVjb2RlciBzdHJ1Y3R1cmUKICAgXHJldHVybiAgICBlcnJvckNvZGUsIDAgaWYgc3VjY2Vzc2Z1bAogKi8KLWludAotZGVsZXRlU2JyRGVjIChTQlJfQ0hBTk5FTCAqIGhTYnJDaGFubmVsKQoteworaW50IGRlbGV0ZVNickRlYyhTQlJfQ0hBTk5FTCAqaFNickNoYW5uZWwpIHsKICAgSEFORExFX1NCUl9ERUMgaHMgPSAmaFNickNoYW5uZWwtPlNickRlYzsKIAotICBkZWxldGVTYnJFbnZlbG9wZUNhbGMgKCZocy0+U2JyQ2FsY3VsYXRlRW52ZWxvcGUpOworICBkZWxldGVTYnJFbnZlbG9wZUNhbGMoJmhzLT5TYnJDYWxjdWxhdGVFbnZlbG9wZSk7CiAKLSAgLyogZGVsZXRlIFFNRiBmaWx0ZXIgc3RhdGVzICovCi0gIGlmIChocy0+cFN5blFtZlN0YXRlcyAhPSBOVUxMKSB7Ci0gICAgRnJlZVJhbV9zYnJfUW1mU3RhdGVzU3ludGhlc2lzKCZocy0+cFN5blFtZlN0YXRlcyk7CisgIGlmIChocy0+dG1wX21lbW9yeSAhPSBOVUxMKSB7CisgICAgRkRLX0ZSRUVfTUVNT1JZXzJEX0FMSUdORUQoaHMtPnRtcF9tZW1vcnkpOwogICB9CiAKKyAgLyogbW9kaWZ5IGhlcmUgKi8KKyAgRkRLX0ZSRUVfTUVNT1JZXzJEX0FMSUdORUQoaHMtPmhRbWZIQkVTbG90c0ltYWcpOwogCi0gIGlmIChocy0+cFNick92ZXJsYXBCdWZmZXIgIT0gTlVMTCkgewotICAgIEZyZWVSYW1fc2JyX092ZXJsYXBCdWZmZXIoJmhzLT5wU2JyT3ZlcmxhcEJ1ZmZlcik7CisgIGlmIChocy0+aEhCRSAhPSBOVUxMKSBRbWZUcmFuc3Bvc2VyQ2xvc2UoaHMtPmhIQkUpOworCisgIGlmIChocy0+Y29kZWNRTUZCdWZmZXJSZWFsICE9IE5VTEwpIHsKKyAgICBGREtfRlJFRV9NRU1PUllfMkRfQUxJR05FRChocy0+Y29kZWNRTUZCdWZmZXJSZWFsKTsKKyAgfQorCisgIGlmIChocy0+Y29kZWNRTUZCdWZmZXJJbWFnICE9IE5VTEwpIHsKKyAgICBGREtfRlJFRV9NRU1PUllfMkRfQUxJR05FRChocy0+Y29kZWNRTUZCdWZmZXJJbWFnKTsKICAgfQogCiAgIHJldHVybiAwOwogfQogCi0KIC8qIQogICBcYnJpZWYgICAgIHJlc2V0cyBzYnIgZGVjb2RlciBzdHJ1Y3R1cmUKICAgXHJldHVybiAgICBlcnJvckNvZGUsIDAgaWYgc3VjY2Vzc2Z1bAogKi8KIFNCUl9FUlJPUgotcmVzZXRTYnJEZWMgKEhBTkRMRV9TQlJfREVDIGhTYnJEZWMsCi0gICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKLSAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoUHJldkZyYW1lRGF0YSwKLSAgICAgICAgICAgICBjb25zdCBpbnQgdXNlTFAsCi0gICAgICAgICAgICAgY29uc3QgaW50IGRvd25zYW1wbGVGYWMKLSAgICAgICAgICAgICApCi17CityZXNldFNickRlYyhIQU5ETEVfU0JSX0RFQyBoU2JyRGVjLCBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAorICAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaFByZXZGcmFtZURhdGEsIGNvbnN0IGludCBkb3duc2FtcGxlRmFjLAorICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncywgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhGcmFtZURhdGEpIHsKICAgU0JSX0VSUk9SIHNickVycm9yID0gU0JSREVDX09LOwotICAKLSAgaW50IG9sZF9sc2IgPSBoU2JyRGVjLT5TeW50aGVzaXNRTUYubHNiOworICBpbnQgaTsKKyAgRklYUF9EQkwgKnBMb3dCYW5kUmVhbFsxMjhdOworICBGSVhQX0RCTCAqcExvd0JhbmRJbWFnWzEyOF07CisgIGludCB1c2VMUCA9IGZsYWdzICYgU0JSREVDX0xPV19QT1dFUjsKKworICBpbnQgb2xkX2xzYiA9IGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPmZiLmxzYjsKKyAgaW50IG9sZF91c2IgPSBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5mYi51c2I7CiAgIGludCBuZXdfbHNiID0gaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5sb3dTdWJiYW5kOworICAvKiBpbnQgbmV3X3VzYiA9IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuaGlnaFN1YmJhbmQ7ICovCiAgIGludCBsLCBzdGFydEJhbmQsIHN0b3BCYW5kLCBzdGFydFNsb3QsIHNpemU7CiAKLSAgaW50IHNvdXJjZV9zY2FsZSwgdGFyZ2V0X3NjYWxlLCBkZWx0YV9zY2FsZSwgdGFyZ2V0X2xzYiwgdGFyZ2V0X3VzYiwgcmVzZXJ2ZTsKLSAgRklYUF9EQkwgbWF4VmFsOworICBGSVhQX0RCTCAqKk92ZXJsYXBCdWZmZXJSZWFsID0gaFNickRlYy0+cW1mRG9tYWluSW5DaC0+aFFtZlNsb3RzUmVhbDsKKyAgRklYUF9EQkwgKipPdmVybGFwQnVmZmVySW1hZyA9IGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPmhRbWZTbG90c0ltYWc7CiAKLSAgLyogb3ZlcmxhcEJ1ZmZlciBwb2ludCB0byBmaXJzdCAoNikgc2xvdHMgKi8KLSAgRklYUF9EQkwgICoqT3ZlcmxhcEJ1ZmZlclJlYWwgPSBoU2JyRGVjLT5RbWZCdWZmZXJSZWFsOwotICBGSVhQX0RCTCAgKipPdmVybGFwQnVmZmVySW1hZyA9IGhTYnJEZWMtPlFtZkJ1ZmZlckltYWc7CisgIC8qIGluIGNhc2UgdGhlIHByZXZpb3VzIGZyYW1lIHdhcyBub3QgYWN0aXZlIGluIHRlcm1zIG9mIFNCUiBwcm9jZXNzaW5nLCB0aGUKKyAgICAgZnVsbCBiYW5kIGZyb20gMCB0byBub19jaGFubmVscyB3YXMgcmVzY2FsZWQgYW5kIG5vdCBvdmVyd3JpdHRlbi4gVGhhdHMgd2h5CisgICAgIHRoZSBzY2FsaW5nIGZhY3RvciBsYl9zY2FsZSBjYW4gYmUgc2VlbiBhcyBhc3NpZ25lZCB0byBhbGwgYmFuZHMgZnJvbSAwIHRvCisgICAgIG5vX2NoYW5uZWxzIGluIHRoZSBwcmV2aW91cyBmcmFtZS4gVGhlIHNhbWUgc3RhdGVzIGZvciB0aGUgY3VycmVudCBmcmFtZSBpZgorICAgICB0aGUgY3VycmVudCBmcmFtZSBpcyBub3QgYWN0aXZlIGluIHRlcm1zIG9mIFNCUiBwcm9jZXNzaW5nCisgICovCisgIGludCBhcHBseVNiclByb2MgPSAoaEhlYWRlckRhdGEtPnN5bmNTdGF0ZSA9PSBTQlJfQUNUSVZFIHx8CisgICAgICAgICAgICAgICAgICAgICAgKGhIZWFkZXJEYXRhLT5mcmFtZUVycm9yRmxhZyA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5zeW5jU3RhdGUgPT0gU0JSX0hFQURFUikpOworICBpbnQgYXBwbHlTYnJQcm9jX29sZCA9IGhTYnJEZWMtPmFwcGx5U2JyUHJvY19vbGQ7CiAKLSAgLyogYXNzaWduIHFtZiB0aW1lIHNsb3RzICovCi0gIGFzc2lnblRpbWVTbG90cyggaFNickRlYywgaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cyAqIGhIZWFkZXJEYXRhLT50aW1lU3RlcCwgdXNlTFApOworICBpZiAoIWFwcGx5U2JyUHJvYykgeworICAgIG5ld19sc2IgPSAoaFNickRlYy0+cW1mRG9tYWluSW5DaC0+ZmIpLm5vX2NoYW5uZWxzOworICB9CisgIGlmICghYXBwbHlTYnJQcm9jX29sZCkgeworICAgIG9sZF9sc2IgPSAoaFNickRlYy0+cW1mRG9tYWluSW5DaC0+ZmIpLm5vX2NoYW5uZWxzOworICAgIG9sZF91c2IgPSBvbGRfbHNiOworICB9CiAKKyAgcmVzZXRTYnJFbnZlbG9wZUNhbGMoJmhTYnJEZWMtPlNickNhbGN1bGF0ZUVudmVsb3BlKTsKIAotCi0gIHJlc2V0U2JyRW52ZWxvcGVDYWxjICgmaFNickRlYy0+U2JyQ2FsY3VsYXRlRW52ZWxvcGUpOwotCi0gIGhTYnJEZWMtPlN5bnRoZXNpc1FNRi5sc2IgPSBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmxvd1N1YmJhbmQ7Ci0gIGhTYnJEZWMtPlN5bnRoZXNpc1FNRi51c2IgPSBmaXhNaW4oKElOVCloU2JyRGVjLT5TeW50aGVzaXNRTUYubm9fY2hhbm5lbHMsIChJTlQpaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5oaWdoU3ViYmFuZCk7Ci0KLSAgaFNickRlYy0+QW5hbHlzaXNjUU1GLmxzYiA9IGhTYnJEZWMtPlN5bnRoZXNpc1FNRi5sc2I7Ci0gIGhTYnJEZWMtPkFuYWx5c2lzY1FNRi51c2IgPSBoU2JyRGVjLT5TeW50aGVzaXNRTUYudXNiOwotCisgIC8qIENoYW5nZSBsc2IgYW5kIHVzYiAqLworICAvKiBTeW50aGVzaXMgKi8KKyAgRkRLX0FTU0VSVChoU2JyRGVjLT5xbWZEb21haW5PdXRDaCAhPSBOVUxMKTsKKyAgaFNickRlYy0+cW1mRG9tYWluT3V0Q2gtPmZiLmxzYiA9CisgICAgICBmaXhNaW4oKElOVCloU2JyRGVjLT5xbWZEb21haW5PdXRDaC0+ZmIubm9fY2hhbm5lbHMsCisgICAgICAgICAgICAgKElOVCloSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmxvd1N1YmJhbmQpOworICBoU2JyRGVjLT5xbWZEb21haW5PdXRDaC0+ZmIudXNiID0KKyAgICAgIGZpeE1pbigoSU5UKWhTYnJEZWMtPnFtZkRvbWFpbk91dENoLT5mYi5ub19jaGFubmVscywKKyAgICAgICAgICAgICAoSU5UKWhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuaGlnaFN1YmJhbmQpOworICAvKiBBbmFseXNpcyAqLworICBGREtfQVNTRVJUKGhTYnJEZWMtPnFtZkRvbWFpbkluQ2ggIT0gTlVMTCk7CisgIGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPmZiLmxzYiA9IGhTYnJEZWMtPnFtZkRvbWFpbk91dENoLT5mYi5sc2I7CisgIGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPmZiLnVzYiA9IGhTYnJEZWMtPnFtZkRvbWFpbk91dENoLT5mYi51c2I7CiAKICAgLyoKICAgICBUaGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9uIG9mIHNwZWN0cmFsIGRhdGEgaW4gdGhlIG92ZXJsYXAgYnVmZmVyCkBAIC05NjQsMTM1ICsxMDg0LDM5NyBAQAogICAgICAgIG11c3QgYmUgY2xlYXJlZCBiZWNhdXNlIHRoZSB3aGl0ZW5pbmcgd291bGQgYmUgYWZmZWN0ZWQKICAgKi8KICAgc3RhcnRCYW5kID0gb2xkX2xzYjsKLSAgc3RvcEJhbmQgID0gbmV3X2xzYjsKLSAgc3RhcnRTbG90ID0gaEhlYWRlckRhdGEtPnRpbWVTdGVwICogKGhQcmV2RnJhbWVEYXRhLT5zdG9wUG9zIC0gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cyk7Ci0gIHNpemUgICAgICA9IGZpeE1heCgwLHN0b3BCYW5kLXN0YXJ0QmFuZCk7CisgIHN0b3BCYW5kID0gbmV3X2xzYjsKKyAgc3RhcnRTbG90ID0gZk1heCgwLCBoSGVhZGVyRGF0YS0+dGltZVN0ZXAgKiAoaFByZXZGcmFtZURhdGEtPnN0b3BQb3MgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzKSk7CisgIHNpemUgPSBmTWF4KDAsIHN0b3BCYW5kIC0gc3RhcnRCYW5kKTsKIAotICAvKiBrZWVwIGFscmVhZHkgYWRqdXN0ZWQgZGF0YSBpbiB0aGUgeC1vdmVyLWFyZWEgKi8KLSAgaWYgKCF1c2VMUCkgewotICAgIGZvciAobD1zdGFydFNsb3Q7IGw8aFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwOyBsKyspIHsKLSAgICAgIEZES21lbWNsZWFyKCZPdmVybGFwQnVmZmVyUmVhbFtsXVtzdGFydEJhbmRdLCBzaXplKnNpemVvZihGSVhQX0RCTCkpOwotICAgICAgRkRLbWVtY2xlYXIoJk92ZXJsYXBCdWZmZXJJbWFnW2xdW3N0YXJ0QmFuZF0sIHNpemUqc2l6ZW9mKEZJWFBfREJMKSk7CisgIC8qIGluIGNhc2Ugb2YgVVNBQyB3ZSBkb24ndCB3YW50IHRvIHplcm8gb3V0IHRoZSBtZW1vcnksIGFzIHRoaXMgY2FuIGxlYWQgdG8KKyAgICAgaG9sZXMgaW4gdGhlIHNwZWN0cnVtOyBmaXggc2hhbGwgb25seSBiZSBhcHBsaWVkIGZvciBVU0FDIG5vdCBmb3IgTVBFRy00CisgICAgIFNCUiwgaW4gdGhpcyBjYXNlIHNldHRpbmcgemVybyByZW1haW5zICAgICAgICAgKi8KKyAgaWYgKCEoZmxhZ3MgJiBTQlJERUNfU1lOVEFYX1VTQUMpKSB7CisgICAgLyoga2VlcCBhbHJlYWR5IGFkanVzdGVkIGRhdGEgaW4gdGhlIHgtb3Zlci1hcmVhICovCisgICAgaWYgKCF1c2VMUCkgeworICAgICAgZm9yIChsID0gc3RhcnRTbG90OyBsIDwgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwOyBsKyspIHsKKyAgICAgICAgRkRLbWVtY2xlYXIoJk92ZXJsYXBCdWZmZXJSZWFsW2xdW3N0YXJ0QmFuZF0sIHNpemUgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgRkRLbWVtY2xlYXIoJk92ZXJsYXBCdWZmZXJJbWFnW2xdW3N0YXJ0QmFuZF0sIHNpemUgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChsID0gc3RhcnRTbG90OyBsIDwgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwOyBsKyspIHsKKyAgICAgICAgRkRLbWVtY2xlYXIoJk92ZXJsYXBCdWZmZXJSZWFsW2xdW3N0YXJ0QmFuZF0sIHNpemUgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIH0KICAgICB9Ci0gIH0gZWxzZQotICBmb3IgKGw9c3RhcnRTbG90OyBsPGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcCA7IGwrKykgewotICAgIEZES21lbWNsZWFyKCZPdmVybGFwQnVmZmVyUmVhbFtsXVtzdGFydEJhbmRdLCBzaXplKnNpemVvZihGSVhQX0RCTCkpOwotICB9CiAKLQotICAvKgorICAgIC8qCiAgICAgcmVzZXQgTFBDIGZpbHRlciBzdGF0ZXMKLSAgKi8KLSAgc3RhcnRCYW5kID0gZml4TWluKG9sZF9sc2IsbmV3X2xzYik7Ci0gIHN0b3BCYW5kICA9IGZpeE1heChvbGRfbHNiLG5ld19sc2IpOwotICBzaXplICAgICAgPSBmaXhNYXgoMCxzdG9wQmFuZC1zdGFydEJhbmQpOworICAgICovCisgICAgc3RhcnRCYW5kID0gZml4TWluKG9sZF9sc2IsIG5ld19sc2IpOworICAgIHN0b3BCYW5kID0gZml4TWF4KG9sZF9sc2IsIG5ld19sc2IpOworICAgIHNpemUgPSBmaXhNYXgoMCwgc3RvcEJhbmQgLSBzdGFydEJhbmQpOwogCi0gIEZES21lbWNsZWFyKCZoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNSZWFsWzBdW3N0YXJ0QmFuZF0sIHNpemUqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gIEZES21lbWNsZWFyKCZoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNSZWFsWzFdW3N0YXJ0QmFuZF0sIHNpemUqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gIGlmICghdXNlTFApIHsKLSAgICBGREttZW1jbGVhcigmaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzSW1hZ1swXVtzdGFydEJhbmRdLCBzaXplKnNpemVvZihGSVhQX0RCTCkpOwotICAgIEZES21lbWNsZWFyKCZoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNJbWFnWzFdW3N0YXJ0QmFuZF0sIHNpemUqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgRkRLbWVtY2xlYXIoJmhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc1JlYWxMZWdTQlJbMF1bc3RhcnRCYW5kXSwKKyAgICAgICAgICAgICAgICBzaXplICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgRkRLbWVtY2xlYXIoJmhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc1JlYWxMZWdTQlJbMV1bc3RhcnRCYW5kXSwKKyAgICAgICAgICAgICAgICBzaXplICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgaWYgKCF1c2VMUCkgeworICAgICAgRkRLbWVtY2xlYXIoJmhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc0ltYWdMZWdTQlJbMF1bc3RhcnRCYW5kXSwKKyAgICAgICAgICAgICAgICAgIHNpemUgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIEZES21lbWNsZWFyKCZoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNJbWFnTGVnU0JSWzFdW3N0YXJ0QmFuZF0sCisgICAgICAgICAgICAgICAgICBzaXplICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgfQogICB9CiAKKyAgaWYgKHN0YXJ0U2xvdCAhPSAwKSB7CisgICAgaW50IHNvdXJjZV9leHAsIHRhcmdldF9leHAsIGRlbHRhX2V4cCwgdGFyZ2V0X2xzYiwgdGFyZ2V0X3VzYiwgcmVzZXJ2ZTsKKyAgICBGSVhQX0RCTCBtYXhWYWw7CiAKLSAgLyoKLSAgICBSZXNjYWxlIGFscmVhZHkgcHJvY2Vzc2VkIHNwZWN0cmFsIGRhdGEgYmV0d2VlbiBvbGQgYW5kIG5ldyB4LW92ZXIgZnJlcXVlbmN5LgotICAgIFRoaXMgbXVzdCBiZSBkb25lIGJlY2F1c2Ugb2YgdGhlIHNlcGFyYXRlIHNjYWxlZmFjdG9ycyBmb3IgbG93YmFuZCBhbmQgaGlnaGJhbmQuCi0gICovCi0gIHN0YXJ0QmFuZCA9IGZpeE1pbihvbGRfbHNiLG5ld19sc2IpOwotICBzdG9wQmFuZCA9ICBmaXhNYXgob2xkX2xzYixuZXdfbHNiKTsKKyAgICAvKgorICAgIFJlc2NhbGUgYWxyZWFkeSBwcm9jZXNzZWQgc3BlY3RyYWwgZGF0YSBiZXR3ZWVuIG9sZCBhbmQgbmV3IHgtb3ZlcgorICAgIGZyZXF1ZW5jeS4gVGhpcyBtdXN0IGJlIGRvbmUgYmVjYXVzZSBvZiB0aGUgc2VwYXJhdGUgc2NhbGVmYWN0b3JzIGZvcgorICAgIGxvd2JhbmQgYW5kIGhpZ2hiYW5kLgorICAgICovCiAKLSAgaWYgKG5ld19sc2IgPiBvbGRfbHNiKSB7Ci0gICAgLyogVGhlIHgtb3Zlci1hcmVhIHdhcyBwYXJ0IG9mIHRoZSBoaWdoYmFuZCBiZWZvcmUgYW5kIHdpbGwgbm93IGJlbG9uZyB0byB0aGUgbG93YmFuZCAqLwotICAgIHNvdXJjZV9zY2FsZSA9IGhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLm92X2hiX3NjYWxlOwotICAgIHRhcmdldF9zY2FsZSA9IGhTYnJEZWMtPnNiclNjYWxlRmFjdG9yLm92X2xiX3NjYWxlOwotICAgIHRhcmdldF9sc2IgICA9IDA7Ci0gICAgdGFyZ2V0X3VzYiAgID0gb2xkX2xzYjsKLSAgfQotICBlbHNlIHsKLSAgICAvKiBUaGUgeC1vdmVyLWFyZWEgd2FzIHBhcnQgb2YgdGhlIGxvd2JhbmQgYmVmb3JlIGFuZCB3aWxsIG5vdyBiZWxvbmcgdG8gdGhlIGhpZ2hiYW5kICovCi0gICAgc291cmNlX3NjYWxlID0gaFNickRlYy0+c2JyU2NhbGVGYWN0b3Iub3ZfbGJfc2NhbGU7Ci0gICAgdGFyZ2V0X3NjYWxlID0gaFNickRlYy0+c2JyU2NhbGVGYWN0b3Iub3ZfaGJfc2NhbGU7Ci0gICAgLyogamRyOiBUaGUgdmFsdWVzIG9sZF9sc2IgYW5kIG9sZF91c2IgbWlnaHQgYmUgd3JvbmcgYmVjYXVzZSB0aGUgcHJldmlvdXMgZnJhbWUgbWlnaHQgaGF2ZSBiZWVuICJ1cHNhbWxpbmciLiAqLwotICAgIHRhcmdldF9sc2IgICA9IGhTYnJEZWMtPlN5bnRoZXNpc1FNRi5sc2I7Ci0gICAgdGFyZ2V0X3VzYiAgID0gaFNickRlYy0+U3ludGhlc2lzUU1GLnVzYjsKLSAgfQotCi0gIC8qIFNoaWZ0IGxlZnQgYWxsIHNhbXBsZXMgb2YgdGhlIHgtb3Zlci1hcmVhIGFzIG11Y2ggYXMgcG9zc2libGUKLSAgICAgQW4gdW5uZWNlc3NhcnkgY29hcnNlIHNjYWxlIGNvdWxkIGNhdXNlIG92X2xiX3NjYWxlIG9yIG92X2hiX3NjYWxlIHRvIGJlCi0gICAgIGFkYXB0ZWQgYW5kIHRoZSBhY2N1cmFjeSBpbiB0aGUgbmV4dCBmcmFtZSB3b3VsZCBzZXJpb3VzbHkgc3VmZmVyISAqLwotCi0gIG1heFZhbCA9IG1heFN1YmJhbmRTYW1wbGUoIE92ZXJsYXBCdWZmZXJSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlTFApID8gTlVMTCA6IE92ZXJsYXBCdWZmZXJJbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNsb3QpOwotCi0gIHJlc2VydmUgPSBDbnRMZWFkaW5nWmVyb3MobWF4VmFsKS0xOwotICByZXNlcnZlID0gZml4TWluKHJlc2VydmUsREZSQUNUX0JJVFMtMS1zb3VyY2Vfc2NhbGUpOwotCi0gIHJlc2NhbGVTdWJiYW5kU2FtcGxlcyggT3ZlcmxhcEJ1ZmZlclJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHVzZUxQKSA/IE5VTEwgOiBPdmVybGFwQnVmZmVySW1hZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RvcEJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZSk7Ci0gIHNvdXJjZV9zY2FsZSArPSByZXNlcnZlOwotCi0gIGRlbHRhX3NjYWxlID0gdGFyZ2V0X3NjYWxlIC0gc291cmNlX3NjYWxlOwotCi0gIGlmIChkZWx0YV9zY2FsZSA+IDApIHsgLyogeC1vdmVyLWFyZWEgaXMgZG9taW5hbnQgKi8KLSAgICBkZWx0YV9zY2FsZSA9IC1kZWx0YV9zY2FsZTsKLSAgICBzdGFydEJhbmQgPSB0YXJnZXRfbHNiOwotICAgIHN0b3BCYW5kID0gdGFyZ2V0X3VzYjsKKyAgICAvKiBXZSBoYXZlIGZvdXIgcmVsZXZhbnQgdHJhbnNpdGlvbnMgdG8gY292ZXI6CisgICAgMS4gb2xkX3VzYiBpcyBsb3dlciB0aGFuIG5ld19sc2I7IG9sZCBTQlIgYXJlYSBpcyBjb21wbGV0ZWx5IGJlbG93IG5ldyBTQlIKKyAgICBhcmVhLgorICAgICAgIC0+IGVudGlyZSBvbGQgYXJlYSB3YXMgaGlnaGJhbmQgYW5kIGJlbG9uZ3MgdG8gbG93YmFuZCBub3cKKyAgICAgICAgICBhbmQgaGFzIHRvIGJlIHJlc2NhbGVkLgorICAgIDIuIG9sZF9sc2IgaXMgaGlnaGVyIHRoYW4gbmV3X3VzYjsgbmV3IFNCUiBhcmVhIGlzIGNvbXBsZXRlbHkgYmVsb3cgb2xkIFNCUgorICAgIGFyZWEuCisgICAgICAgLT4gb2xkIGFyZWEgYmV0d2VlbiBuZXdfbHNiIGFuZCBvbGRfbHNiIHdhcyBsb3diYW5kIGFuZCBiZWxvbmdzIHRvCisgICAgaGlnaGJhbmQgbm93IGFuZCBoYXMgdG8gYmUgcmVzY2FsZWQgdG8gbWF0Y2ggbmV3IGhpZ2hiYW5kIHNjYWxlLgorICAgIDMuIG9sZF9sc2IgaXMgbG93ZXIgYW5kIG9sZF91c2IgaXMgaGlnaGVyIHRoYW4gbmV3X2xzYjsgb2xkIGFuZCBuZXcgU0JSCisgICAgYXJlYXMgb3ZlcmxhcC4KKyAgICAgICAtPiBvbGQgYXJlYSBiZXR3ZWVuIG9sZF9sc2IgYW5kIG5ld19sc2Igd2FzIGhpZ2hiYW5kIGFuZCBiZWxvbmdzIHRvCisgICAgbG93YmFuZCBub3cgYW5kIGhhcyB0byBiZSByZXNjYWxlZCB0byBtYXRjaCBuZXcgbG93YmFuZCBzY2FsZS4KKyAgICA0LiBuZXdfbHNiIGlzIGxvd2VyIGFuZCBuZXdfdXNiX2lzIGhpZ2hlciB0aGFuIG9sZF9sc2I7IG9sZCBhbmQgbmV3IFNCUgorICAgIGFyZWFzIG92ZXJsYXAuCisgICAgICAgLT4gb2xkIGFyZWEgYmV0d2VlbiBuZXdfbHNiIGFuZCBvbGRfdXNiIHdhcyBsb3diYW5kIGFuZCBiZWxvbmdzIHRvCisgICAgaGlnaGJhbmQgbm93IGFuZCBoYXMgdG8gYmUgcmVzY2FsZWQgdG8gbWF0Y2ggbmV3IGhpZ2hiYW5kIHNjYWxlLgorICAgICovCiAKICAgICBpZiAobmV3X2xzYiA+IG9sZF9sc2IpIHsKLSAgICAgIC8qIFRoZSBsb3diYW5kIGhhcyB0byBiZSByZXNjYWxlZCAqLwotICAgICAgaFNickRlYy0+c2JyU2NhbGVGYWN0b3Iub3ZfbGJfc2NhbGUgPSBzb3VyY2Vfc2NhbGU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgLyogVGhlIGhpZ2hiYW5kIGhhcyBiZSBiZSByZXNjYWxlZCAqLwotICAgICAgaFNickRlYy0+c2JyU2NhbGVGYWN0b3Iub3ZfaGJfc2NhbGUgPSBzb3VyY2Vfc2NhbGU7Ci0gICAgfQotICB9CisgICAgICAvKiBjYXNlIDEgYW5kIDMgKi8KKyAgICAgIHNvdXJjZV9leHAgPSBTQ0FMRTJFWFAoaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5vdl9oYl9zY2FsZSk7CisgICAgICB0YXJnZXRfZXhwID0gU0NBTEUyRVhQKGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcub3ZfbGJfc2NhbGUpOwogCi0gIEZES19BU1NFUlQoc3RhcnRCYW5kIDw9IHN0b3BCYW5kKTsKKyAgICAgIHN0YXJ0QmFuZCA9IG9sZF9sc2I7CiAKLSAgaWYgKCF1c2VMUCkgewotICAgIGZvciAobD0wOyBsPHN0YXJ0U2xvdDsgbCsrKSB7Ci0gICAgICBzY2FsZVZhbHVlcyggT3ZlcmxhcEJ1ZmZlclJlYWxbbF0gKyBzdGFydEJhbmQsIHN0b3BCYW5kLXN0YXJ0QmFuZCwgZGVsdGFfc2NhbGUgKTsKLSAgICAgIHNjYWxlVmFsdWVzKCBPdmVybGFwQnVmZmVySW1hZ1tsXSArIHN0YXJ0QmFuZCwgc3RvcEJhbmQtc3RhcnRCYW5kLCBkZWx0YV9zY2FsZSApOworICAgICAgaWYgKG5ld19sc2IgPj0gb2xkX3VzYikgeworICAgICAgICAvKiBjYXNlIDEgKi8KKyAgICAgICAgc3RvcEJhbmQgPSBvbGRfdXNiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogY2FzZSAzICovCisgICAgICAgIHN0b3BCYW5kID0gbmV3X2xzYjsKKyAgICAgIH0KKworICAgICAgdGFyZ2V0X2xzYiA9IDA7CisgICAgICB0YXJnZXRfdXNiID0gb2xkX2xzYjsKKyAgICB9IGVsc2UgeworICAgICAgLyogY2FzZSAyIGFuZCA0ICovCisgICAgICBzb3VyY2VfZXhwID0gU0NBTEUyRVhQKGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcub3ZfbGJfc2NhbGUpOworICAgICAgdGFyZ2V0X2V4cCA9IFNDQUxFMkVYUChoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLm92X2hiX3NjYWxlKTsKKworICAgICAgc3RhcnRCYW5kID0gbmV3X2xzYjsKKyAgICAgIHN0b3BCYW5kID0gb2xkX2xzYjsKKworICAgICAgdGFyZ2V0X2xzYiA9IG9sZF9sc2I7CisgICAgICB0YXJnZXRfdXNiID0gb2xkX3VzYjsKICAgICB9Ci0gIH0gZWxzZQotICBmb3IgKGw9MDsgbDxzdGFydFNsb3Q7IGwrKykgewotICAgIHNjYWxlVmFsdWVzKCBPdmVybGFwQnVmZmVyUmVhbFtsXSArIHN0YXJ0QmFuZCwgc3RvcEJhbmQtc3RhcnRCYW5kLCBkZWx0YV9zY2FsZSApOwotICB9CiAKKyAgICBtYXhWYWwgPQorICAgICAgICBtYXhTdWJiYW5kU2FtcGxlKE92ZXJsYXBCdWZmZXJSZWFsLCAodXNlTFApID8gTlVMTCA6IE92ZXJsYXBCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0QmFuZCwgc3RvcEJhbmQsIDAsIHN0YXJ0U2xvdCk7CisKKyAgICByZXNlcnZlID0gKChMT05HKW1heFZhbCAhPSAwID8gQ250TGVhZGluZ1plcm9zKG1heFZhbCkgLSAxIDogMCk7CisgICAgcmVzZXJ2ZSA9IGZpeE1pbigKKyAgICAgICAgcmVzZXJ2ZSwKKyAgICAgICAgREZSQUNUX0JJVFMgLSAxIC0KKyAgICAgICAgICAgIEVYUDJTQ0FMRSgKKyAgICAgICAgICAgICAgICBzb3VyY2VfZXhwKSk7IC8qIHdoYXQgaXMgdGhpcyBsaW5lIGZvciwgd2h5IGRvIHdlIG5lZWQgaXQ/ICovCisKKyAgICAvKiBwcm9jZXNzIG9ubHkgaWYgeC1vdmVyLWFyZWEgaXMgbm90IGRvbWluYW50IGFmdGVyIHJlc2NhbGU7CisgICAgICAgb3RoZXJ3aXNlIEknbSBub3Qgc3VyZSBpZiBhbGwgYnVmZmVycyBhcmUgc2NhbGVkIGNvcnJlY3RseTsKKyAgICAqLworICAgIGlmICh0YXJnZXRfZXhwIC0gKHNvdXJjZV9leHAgLSByZXNlcnZlKSA+PSAwKSB7CisgICAgICByZXNjYWxlU3ViYmFuZFNhbXBsZXMoT3ZlcmxhcEJ1ZmZlclJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZUxQKSA/IE5VTEwgOiBPdmVybGFwQnVmZmVySW1hZywgc3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BCYW5kLCAwLCBzdGFydFNsb3QsIHJlc2VydmUpOworICAgICAgc291cmNlX2V4cCAtPSByZXNlcnZlOworICAgIH0KKworICAgIGRlbHRhX2V4cCA9IHRhcmdldF9leHAgLSBzb3VyY2VfZXhwOworCisgICAgaWYgKGRlbHRhX2V4cCA8IDApIHsgLyogeC1vdmVyLWFyZWEgaXMgZG9taW5hbnQgKi8KKyAgICAgIHN0YXJ0QmFuZCA9IHRhcmdldF9sc2I7CisgICAgICBzdG9wQmFuZCA9IHRhcmdldF91c2I7CisgICAgICBkZWx0YV9leHAgPSAtZGVsdGFfZXhwOworCisgICAgICBpZiAobmV3X2xzYiA+IG9sZF9sc2IpIHsKKyAgICAgICAgLyogVGhlIGxvd2JhbmQgaGFzIHRvIGJlIHJlc2NhbGVkICovCisgICAgICAgIGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcub3ZfbGJfc2NhbGUgPSBFWFAyU0NBTEUoc291cmNlX2V4cCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBUaGUgaGlnaGJhbmQgaGFzIHRvIGJlIHJlc2NhbGVkICovCisgICAgICAgIGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcub3ZfaGJfc2NhbGUgPSBFWFAyU0NBTEUoc291cmNlX2V4cCk7CisgICAgICB9CisgICAgfQorCisgICAgRkRLX0FTU0VSVChzdGFydEJhbmQgPD0gc3RvcEJhbmQpOworCisgICAgaWYgKCF1c2VMUCkgeworICAgICAgZm9yIChsID0gMDsgbCA8IHN0YXJ0U2xvdDsgbCsrKSB7CisgICAgICAgIHNjYWxlVmFsdWVzKE92ZXJsYXBCdWZmZXJSZWFsW2xdICsgc3RhcnRCYW5kLCBzdG9wQmFuZCAtIHN0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgLWRlbHRhX2V4cCk7CisgICAgICAgIHNjYWxlVmFsdWVzKE92ZXJsYXBCdWZmZXJJbWFnW2xdICsgc3RhcnRCYW5kLCBzdG9wQmFuZCAtIHN0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgLWRlbHRhX2V4cCk7CisgICAgICB9CisgICAgfSBlbHNlCisgICAgICBmb3IgKGwgPSAwOyBsIDwgc3RhcnRTbG90OyBsKyspIHsKKyAgICAgICAgc2NhbGVWYWx1ZXMoT3ZlcmxhcEJ1ZmZlclJlYWxbbF0gKyBzdGFydEJhbmQsIHN0b3BCYW5kIC0gc3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgICAtZGVsdGFfZXhwKTsKKyAgICAgIH0KKyAgfSAvKiBzdGFydFNsb3QgIT0gMCAqLwogCiAgIC8qCiAgICAgSW5pdGlhbGl6ZSB0cmFuc3Bvc2VyIGFuZCBsaW1pdGVyCiAgICovCi0gIHNickVycm9yID0gcmVzZXRMcHBUcmFuc3Bvc2VyICgmaFNickRlYy0+THBwVHJhbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmxvd1N1YmJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLnZfa19tYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm51bU1hc3RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZU5vaXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uTmZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5oaWdoU3ViYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5zYnJQcm9jU21wbFJhdGUpOwotICBpZiAoc2JyRXJyb3IgIT0gU0JSREVDX09LKQotICAgIHJldHVybiBzYnJFcnJvcjsKKyAgc2JyRXJyb3IgPSByZXNldExwcFRyYW5zcG9zZXIoCisgICAgICAmaFNickRlYy0+THBwVHJhbnMsIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubG93U3ViYmFuZCwKKyAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEudl9rX21hc3RlciwgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5udW1NYXN0ZXIsCisgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVOb2lzZSwKKyAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubk5mYiwgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5oaWdoU3ViYmFuZCwKKyAgICAgIGhIZWFkZXJEYXRhLT5zYnJQcm9jU21wbFJhdGUpOworICBpZiAoc2JyRXJyb3IgIT0gU0JSREVDX09LKSByZXR1cm4gc2JyRXJyb3I7CiAKLSAgc2JyRXJyb3IgPSBSZXNldExpbWl0ZXJCYW5kcyAoIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubGltaXRlckJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5vTGltaXRlckJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uU2ZiWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5wYXRjaFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5ub09mUGF0Y2hlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5ic19kYXRhLmxpbWl0ZXJCYW5kcyk7CisgIGhTYnJEZWMtPnNhdmVkU3RhdGVzID0gMDsKIAorICBpZiAoZmxhZ3MgJiBTQlJERUNfVVNBQ19IQVJNT05JQ1NCUikgeworICAgIHNickVycm9yID0gUW1mVHJhbnNwb3NlclJlSW5pdChoU2JyRGVjLT5oSEJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEublNmYik7CisgICAgaWYgKHNickVycm9yICE9IFNCUkRFQ19PSykgcmV0dXJuIHNickVycm9yOworCisgICAgLyogY29weSBzYXZlZCBzdGF0ZXMgZnJvbSBwcmV2aW91cyBmcmFtZSB0byBsZWdhY3kgU0JSIGxwYyBmaWx0ZXJzdGF0ZQorICAgICAqIGJ1ZmZlciAgICovCisgICAgZm9yIChpID0gMDsgaSA8IExQQ19PUkRFUiArIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcDsgaSsrKSB7CisgICAgICBGREttZW1jcHkoCisgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzUmVhbExlZ1NCUltpXSwKKyAgICAgICAgICBoU2JyRGVjLT5jb2RlY1FNRkJ1ZmZlclJlYWxbaFNickRlYy0+aEhCRS0+bm9Db2xzIC0gTFBDX09SREVSIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwICsgaV0sCisgICAgICAgICAgaFNickRlYy0+aEhCRS0+bm9DaGFubmVscyAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgRkRLbWVtY3B5KAorICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc0ltYWdMZWdTQlJbaV0sCisgICAgICAgICAgaFNickRlYy0+Y29kZWNRTUZCdWZmZXJJbWFnW2hTYnJEZWMtPmhIQkUtPm5vQ29scyAtIExQQ19PUkRFUiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcCArIGldLAorICAgICAgICAgIGhTYnJEZWMtPmhIQkUtPm5vQ2hhbm5lbHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICB9CisgICAgaFNickRlYy0+c2F2ZWRTdGF0ZXMgPSAxOworCisgICAgeworICAgICAgLyogbWFwIFFNRiBidWZmZXIgdG8gcG9pbnRlciBhcnJheSAoT3ZlcmxhcCArIEZyYW1lKSovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwICsgTFBDX09SREVSOyBpKyspIHsKKyAgICAgICAgcExvd0JhbmRSZWFsW2ldID0gaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzUmVhbEhCRVtpXTsKKyAgICAgICAgcExvd0JhbmRJbWFnW2ldID0gaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzSW1hZ0hCRVtpXTsKKyAgICAgIH0KKworICAgICAgLyogbWFwIFFNRiBidWZmZXIgdG8gcG9pbnRlciBhcnJheSAoT3ZlcmxhcCArIEZyYW1lKSovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgaFNickRlYy0+aEhCRS0+bm9Db2xzOyBpKyspIHsKKyAgICAgICAgcExvd0JhbmRSZWFsW2kgKyBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAgKyBMUENfT1JERVJdID0KKyAgICAgICAgICAgIGhTYnJEZWMtPmNvZGVjUU1GQnVmZmVyUmVhbFtpXTsKKyAgICAgICAgcExvd0JhbmRJbWFnW2kgKyBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAgKyBMUENfT1JERVJdID0KKyAgICAgICAgICAgIGhTYnJEZWMtPmNvZGVjUU1GQnVmZmVySW1hZ1tpXTsKKyAgICAgIH0KKworICAgICAgaWYgKGZsYWdzICYgU0JSREVDX1FVQURfUkFURSkgeworICAgICAgICBpZiAoaEZyYW1lRGF0YS0+c2JyUGF0Y2hpbmdNb2RlID09IDApIHsKKyAgICAgICAgICBpbnQgKnhPdmVyUW1mID0gR2V0eE92ZXJCYW5kUW1mVHJhbnNwb3NlcihoU2JyRGVjLT5oSEJFKTsKKworICAgICAgICAgIC8qIGluIGNhc2Ugb2YgaGFybW9uaWMgU0JSIGFuZCBubyBIQkVfTFAgbWFwIGFkZGl0aW9uYWwgYnVmZmVyIGZvcgorICAgICAgICAgIG9uZSBtb3JlIGZyYW1lIHRvIHBvaW50ZXIgYXJyeSAqLworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoU2JyRGVjLT5oSEJFLT5ub0NvbHMgLyAyOyBpKyspIHsKKyAgICAgICAgICAgIHBMb3dCYW5kUmVhbFtpICsgaFNickRlYy0+aEhCRS0+bm9Db2xzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAgKyBMUENfT1JERVJdID0KKyAgICAgICAgICAgICAgICBoU2JyRGVjLT5oUW1mSEJFU2xvdHNSZWFsW2ldOworICAgICAgICAgICAgcExvd0JhbmRJbWFnW2kgKyBoU2JyRGVjLT5oSEJFLT5ub0NvbHMgKworICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcCArIExQQ19PUkRFUl0gPQorICAgICAgICAgICAgICAgIGhTYnJEZWMtPmhRbWZIQkVTbG90c0ltYWdbaV07CisgICAgICAgICAgfQorCisgICAgICAgICAgUW1mVHJhbnNwb3NlckFwcGx5KAorICAgICAgICAgICAgICBoU2JyRGVjLT5oSEJFLAorICAgICAgICAgICAgICBwTG93QmFuZFJlYWwgKyBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAgKworICAgICAgICAgICAgICAgICAgaFNickRlYy0+aEhCRS0+bm9Db2xzIC8gMiArIExQQ19PUkRFUiwKKyAgICAgICAgICAgICAgcExvd0JhbmRJbWFnICsgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwICsKKyAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPmhIQkUtPm5vQ29scyAvIDIgKyBMUENfT1JERVIsCisgICAgICAgICAgICAgIGhTYnJEZWMtPmhIQkUtPm5vQ29scywgcExvd0JhbmRSZWFsLCBwTG93QmFuZEltYWcsCisgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc1JlYWxIQkUsCisgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLmxwY0ZpbHRlclN0YXRlc0ltYWdIQkUsCisgICAgICAgICAgICAgIGhQcmV2RnJhbWVEYXRhLT5wcmV2U2JyUGl0Y2hJbkJpbnMsIGhTYnJEZWMtPnNjYWxlX2xiLAorICAgICAgICAgICAgICBoU2JyRGVjLT5zY2FsZV9oYmUsICZoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLmhiX3NjYWxlLAorICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+dGltZVN0ZXAsIGhGcmFtZURhdGEtPmZyYW1lSW5mby5ib3JkZXJzWzBdLAorICAgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAsIEtFRVBfU1RBVEVTX1NZTkNFRF9PVVRESUZGKTsKKworICAgICAgICAgIGNvcHlIYXJtb25pY1NwZWN0cnVtKAorICAgICAgICAgICAgICB4T3ZlclFtZiwgcExvd0JhbmRSZWFsLCBwTG93QmFuZEltYWcsIGhTYnJEZWMtPmhIQkUtPm5vQ29scywKKyAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwLCBLRUVQX1NUQVRFU19TWU5DRURfT1VURElGRik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGluIGNhc2Ugb2YgaGFybW9uaWMgU0JSIGFuZCBubyBIQkVfTFAgbWFwIGFkZGl0aW9uYWwgYnVmZmVyIGZvcgorICAgICAgICBvbmUgbW9yZSBmcmFtZSB0byBwb2ludGVyIGFycnkgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhTYnJEZWMtPmhIQkUtPm5vQ29sczsgaSsrKSB7CisgICAgICAgICAgcExvd0JhbmRSZWFsW2kgKyBoU2JyRGVjLT5oSEJFLT5ub0NvbHMgKworICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAgKyBMUENfT1JERVJdID0KKyAgICAgICAgICAgICAgaFNickRlYy0+aFFtZkhCRVNsb3RzUmVhbFtpXTsKKyAgICAgICAgICBwTG93QmFuZEltYWdbaSArIGhTYnJEZWMtPmhIQkUtPm5vQ29scyArCisgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcCArIExQQ19PUkRFUl0gPQorICAgICAgICAgICAgICBoU2JyRGVjLT5oUW1mSEJFU2xvdHNJbWFnW2ldOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhGcmFtZURhdGEtPnNiclBhdGNoaW5nTW9kZSA9PSAwKSB7CisgICAgICAgICAgUW1mVHJhbnNwb3NlckFwcGx5KAorICAgICAgICAgICAgICBoU2JyRGVjLT5oSEJFLAorICAgICAgICAgICAgICBwTG93QmFuZFJlYWwgKyBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAgKyBMUENfT1JERVIsCisgICAgICAgICAgICAgIHBMb3dCYW5kSW1hZyArIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcCArIExQQ19PUkRFUiwKKyAgICAgICAgICAgICAgaFNickRlYy0+aEhCRS0+bm9Db2xzLCBwTG93QmFuZFJlYWwsIHBMb3dCYW5kSW1hZywKKyAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzUmVhbEhCRSwKKyAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzSW1hZ0hCRSwKKyAgICAgICAgICAgICAgMCAvKiBub3QgcmVxdWlyZWQgZm9yIGtlZXBpbmcgc3RhdGVzIHVwZGF0ZWQgaW4gdGhpcyBmcmFtZSovLAorICAgICAgICAgICAgICBoU2JyRGVjLT5zY2FsZV9sYiwgaFNickRlYy0+c2NhbGVfbGIsCisgICAgICAgICAgICAgICZoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLmhiX3NjYWxlLCBoSGVhZGVyRGF0YS0+dGltZVN0ZXAsCisgICAgICAgICAgICAgIGhGcmFtZURhdGEtPmZyYW1lSW5mby5ib3JkZXJzWzBdLAorICAgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAsIEtFRVBfU1RBVEVTX1NZTkNFRF9OT09VVCk7CisgICAgICAgIH0KKworICAgICAgICBRbWZUcmFuc3Bvc2VyQXBwbHkoCisgICAgICAgICAgICBoU2JyRGVjLT5oSEJFLAorICAgICAgICAgICAgcExvd0JhbmRSZWFsICsgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwICsKKyAgICAgICAgICAgICAgICBoU2JyRGVjLT5oSEJFLT5ub0NvbHMgKyBMUENfT1JERVIsCisgICAgICAgICAgICBwTG93QmFuZEltYWcgKyBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAgKworICAgICAgICAgICAgICAgIGhTYnJEZWMtPmhIQkUtPm5vQ29scyArIExQQ19PUkRFUiwKKyAgICAgICAgICAgIGhTYnJEZWMtPmhIQkUtPm5vQ29scywgcExvd0JhbmRSZWFsLCBwTG93QmFuZEltYWcsCisgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNSZWFsSEJFLAorICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzSW1hZ0hCRSwKKyAgICAgICAgICAgIGhQcmV2RnJhbWVEYXRhLT5wcmV2U2JyUGl0Y2hJbkJpbnMsIGhTYnJEZWMtPnNjYWxlX2xiLAorICAgICAgICAgICAgaFNickRlYy0+c2NhbGVfaGJlLCAmaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5oYl9zY2FsZSwKKyAgICAgICAgICAgIGhIZWFkZXJEYXRhLT50aW1lU3RlcCwgaEZyYW1lRGF0YS0+ZnJhbWVJbmZvLmJvcmRlcnNbMF0sCisgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAsIEtFRVBfU1RBVEVTX1NZTkNFRF9PVVRESUZGKTsKKyAgICAgIH0KKworICAgICAgaWYgKGhGcmFtZURhdGEtPnNiclBhdGNoaW5nTW9kZSA9PSAwKSB7CisgICAgICAgIGZvciAoaSA9IHN0YXJ0U2xvdDsgaSA8IGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcDsgaSsrKSB7CisgICAgICAgICAgLyoKKyAgICAgICAgICBTdG9yZSB0aGUgdW5tb2RpZmllZCBxbWYgU2xvdHMgdmFsdWVzIGZvciB1cHBlciBwYXJ0IG9mIHNwZWN0cnVtCisgICAgICAgICAgKHJlcXVpcmVkIGZvciBMUEMgZmlsdGVyaW5nKSByZXF1aXJlZCBpZiBuZXh0IGZyYW1lIGlzIGEgSEJFIGZyYW1lCisgICAgICAgICAgKi8KKyAgICAgICAgICBGREttZW1jcHkoaFNickRlYy0+cW1mRG9tYWluSW5DaC0+aFFtZlNsb3RzUmVhbFtpXSwKKyAgICAgICAgICAgICAgICAgICAgaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzUmVhbEhCRVtpICsgTFBDX09SREVSXSwKKyAgICAgICAgICAgICAgICAgICAgKDY0KSAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICAgIEZES21lbWNweShoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5oUW1mU2xvdHNJbWFnW2ldLAorICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNJbWFnSEJFW2kgKyBMUENfT1JERVJdLAorICAgICAgICAgICAgICAgICAgICAoNjQpICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSBzdGFydFNsb3Q7IGkgPCBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXA7IGkrKykgeworICAgICAgICAgIC8qCisgICAgICAgICAgU3RvcmUgdGhlIHVubW9kaWZpZWQgcW1mIFNsb3RzIHZhbHVlcyBmb3IgdXBwZXIgcGFydCBvZiBzcGVjdHJ1bQorICAgICAgICAgIChyZXF1aXJlZCBmb3IgTFBDIGZpbHRlcmluZykgcmVxdWlyZWQgaWYgbmV4dCBmcmFtZSBpcyBhIEhCRSBmcmFtZQorICAgICAgICAgICovCisgICAgICAgICAgRkRLbWVtY3B5KAorICAgICAgICAgICAgICBoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5oUW1mU2xvdHNSZWFsW2ldLAorICAgICAgICAgICAgICBoU2JyRGVjLT5jb2RlY1FNRkJ1ZmZlclJlYWxbaFNickRlYy0+aEhCRS0+bm9Db2xzIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+b3ZlcmxhcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXSwKKyAgICAgICAgICAgICAgbmV3X2xzYiAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICAgIEZES21lbWNweSgKKyAgICAgICAgICAgICAgaFNickRlYy0+cW1mRG9tYWluSW5DaC0+aFFtZlNsb3RzSW1hZ1tpXSwKKyAgICAgICAgICAgICAgaFNickRlYy0+Y29kZWNRTUZCdWZmZXJJbWFnW2hTYnJEZWMtPmhIQkUtPm5vQ29scyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV0sCisgICAgICAgICAgICAgIG5ld19sc2IgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHsKKyAgICBpbnQgYWRhcHRfbGIgPSAwLCBkaWZmID0gMCwKKyAgICAgICAgbmV3X3NjYWxlID0gaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5vdl9sYl9zY2FsZTsKKworICAgIGlmICgoaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5vdl9sYl9zY2FsZSAhPQorICAgICAgICAgaFNickRlYy0+cW1mRG9tYWluSW5DaC0+c2NhbGluZy5sYl9zY2FsZSkgJiYKKyAgICAgICAgc3RhcnRTbG90ICE9IDApIHsKKyAgICAgIC8qIHdlIG5lZWQgdG8gYWRhcHQgc3BlY3RydW0gdG8gaGF2ZSBlcXVhbCBzY2FsZSBmYWN0b3IsIGFsd2F5cyBsYXJnZXIKKyAgICAgICAqIHRoYW4gemVybyAqLworICAgICAgZGlmZiA9IFNDQUxFMkVYUChoU2JyRGVjLT5xbWZEb21haW5JbkNoLT5zY2FsaW5nLm92X2xiX3NjYWxlKSAtCisgICAgICAgICAgICAgU0NBTEUyRVhQKGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcubGJfc2NhbGUpOworCisgICAgICBpZiAoZGlmZiA+IDApIHsKKyAgICAgICAgYWRhcHRfbGIgPSAxOworICAgICAgICBkaWZmID0gLWRpZmY7CisgICAgICAgIG5ld19zY2FsZSA9IGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcub3ZfbGJfc2NhbGU7CisgICAgICB9CisKKyAgICAgIHN0b3BCYW5kID0gbmV3X2xzYjsKKyAgICB9CisKKyAgICBpZiAoaEZyYW1lRGF0YS0+c2JyUGF0Y2hpbmdNb2RlID09IDEpIHsKKyAgICAgIC8qIHNjYWxlIHN0YXRlcyBmcm9tIExlZ1NCUiBmaWx0ZXJzdGF0ZXMgYnVmZmVyICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwICsgTFBDX09SREVSOyBpKyspIHsKKyAgICAgICAgc2NhbGVWYWx1ZXMoaFNickRlYy0+THBwVHJhbnMubHBjRmlsdGVyU3RhdGVzUmVhbExlZ1NCUltpXSwgbmV3X2xzYiwKKyAgICAgICAgICAgICAgICAgICAgZGlmZik7CisgICAgICAgIGlmICghdXNlTFApIHsKKyAgICAgICAgICBzY2FsZVZhbHVlcyhoU2JyRGVjLT5McHBUcmFucy5scGNGaWx0ZXJTdGF0ZXNJbWFnTGVnU0JSW2ldLCBuZXdfbHNiLAorICAgICAgICAgICAgICAgICAgICAgIGRpZmYpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChmbGFncyAmIFNCUkRFQ19TWU5UQVhfVVNBQykgeworICAgICAgICAvKiBnZXQgbWlzc2luZyBzdGF0ZXMgYmV0d2VlbiBvbGQgYW5kIG5ldyB4X292ZXIgZnJvbSBMZWdTQlIKKyAgICAgICAgICogZmlsdGVyc3RhdGVzIGJ1ZmZlciAqLworICAgICAgICAvKiBpbiBjYXNlIG9mIGxlZ2FjeSBTQlIgd2UgbGVhdmUgdGhlc2UgdmFsdWVzIHplcm9lZCBvdXQgKi8KKyAgICAgICAgZm9yIChpID0gc3RhcnRTbG90OyBpIDwgaFNickRlYy0+THBwVHJhbnMucFNldHRpbmdzLT5vdmVybGFwOyBpKyspIHsKKyAgICAgICAgICBGREttZW1jcHkoJk92ZXJsYXBCdWZmZXJSZWFsW2ldW29sZF9sc2JdLAorICAgICAgICAgICAgICAgICAgICAmaFNickRlYy0+THBwVHJhbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAubHBjRmlsdGVyU3RhdGVzUmVhbExlZ1NCUltMUENfT1JERVIgKyBpXVtvbGRfbHNiXSwKKyAgICAgICAgICAgICAgICAgICAgZk1heChuZXdfbHNiIC0gb2xkX2xzYiwgMCkgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICBpZiAoIXVzZUxQKSB7CisgICAgICAgICAgICBGREttZW1jcHkoJk92ZXJsYXBCdWZmZXJJbWFnW2ldW29sZF9sc2JdLAorICAgICAgICAgICAgICAgICAgICAgICZoU2JyRGVjLT5McHBUcmFucworICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxwY0ZpbHRlclN0YXRlc0ltYWdMZWdTQlJbTFBDX09SREVSICsgaV1bb2xkX2xzYl0sCisgICAgICAgICAgICAgICAgICAgICAgZk1heChuZXdfbHNiIC0gb2xkX2xzYiwgMCkgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKG5ld19sc2IgPiBvbGRfbHNiKSB7CisgICAgICAgIHN0b3BCYW5kID0gb2xkX2xzYjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKChhZGFwdF9sYiA9PSAxKSAmJiAoc3RvcEJhbmQgPiBzdGFydEJhbmQpKSB7CisgICAgICBmb3IgKGwgPSBzdGFydFNsb3Q7IGwgPCBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm92ZXJsYXA7IGwrKykgeworICAgICAgICBzY2FsZVZhbHVlcyhPdmVybGFwQnVmZmVyUmVhbFtsXSArIHN0YXJ0QmFuZCwgc3RvcEJhbmQgLSBzdGFydEJhbmQsCisgICAgICAgICAgICAgICAgICAgIGRpZmYpOworICAgICAgICBpZiAoIXVzZUxQKSB7CisgICAgICAgICAgc2NhbGVWYWx1ZXMoT3ZlcmxhcEJ1ZmZlckltYWdbbF0gKyBzdGFydEJhbmQsIHN0b3BCYW5kIC0gc3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgICAgIGRpZmYpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGhTYnJEZWMtPnFtZkRvbWFpbkluQ2gtPnNjYWxpbmcub3ZfbGJfc2NhbGUgPSBuZXdfc2NhbGU7CisgIH0KKworICBzYnJFcnJvciA9IFJlc2V0TGltaXRlckJhbmRzKGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubGltaXRlckJhbmRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5ub0xpbWl0ZXJCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uU2ZiWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJEZWMtPkxwcFRyYW5zLnBTZXR0aW5ncy0+cGF0Y2hQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRGVjLT5McHBUcmFucy5wU2V0dGluZ3MtPm5vT2ZQYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLT5ic19kYXRhLmxpbWl0ZXJCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRnJhbWVEYXRhLT5zYnJQYXRjaGluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0eE92ZXJCYW5kUW1mVHJhbnNwb3NlcihoU2JyRGVjLT5oSEJFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXQ0MVNiclFtZlRyYW5zcG9zZXIoaFNickRlYy0+aEhCRSkpOworCisgIGhTYnJEZWMtPlNickNhbGN1bGF0ZUVudmVsb3BlLnNiclBhdGNoaW5nTW9kZSA9IGhGcmFtZURhdGEtPnNiclBhdGNoaW5nTW9kZTsKIAogICByZXR1cm4gc2JyRXJyb3I7CiB9CmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3Nicl9kZWMuaCBiL2xpYlNCUmRlYy9zcmMvc2JyX2RlYy5oCmluZGV4IGVkZGU2MzcuLjE1NmRhMDMgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvc2JyX2RlYy5oCisrKyBiL2xpYlNCUmRlYy9zcmMvc2JyX2RlYy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE0ICs5MCwyMiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIFNiciBkZWNvZGVyICAKKyAgXGJyaWVmICBTYnIgZGVjb2RlcgogKi8KLSNpZm5kZWYgX19TQlJfREVDX0gKLSNkZWZpbmUgX19TQlJfREVDX0gKKyNpZm5kZWYgU0JSX0RFQ19ICisjZGVmaW5lIFNCUl9ERUNfSAogCiAjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgogCkBAIC05NSwxMjAgKzExNCw5MSBAQAogI2luY2x1ZGUgImVudl9jYWxjLmgiCiAjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCiAKLQogI2luY2x1ZGUgInNicmRlY19kcmMuaCIKIAotI2RlZmluZSBTQUNERUNfQUxJR05NRU5UX0ZJWAorI2luY2x1ZGUgInB2Y19kZWMuaCIKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgUU1GX0ZJTFRFUl9CQU5LICAgICBBbmFseXNpc2NRTUY7Ci0gIFFNRl9GSUxURVJfQkFOSyAgICAgU3ludGhlc2lzUU1GOworI2luY2x1ZGUgImhiZS5oIgogCi0gIFNCUl9DQUxDVUxBVEVfRU5WRUxPUEUgIFNickNhbGN1bGF0ZUVudmVsb3BlOwotICBTQlJfTFBQX1RSQU5TICAgICAgICAgICBMcHBUcmFuczsKK2VudW0gU0JSREVDX1FNRl9TS0lQIHsKKyAgcW1mU2tpcE5vdGhpbmcgPSAwLAorICBxbWZTa2lwQW5hbHlzaXMgPSAxIDw8IDAsCisgIHFtZlNraXBTeW50aGVzaXMgPSAxIDw8IDEKK307CiAKLSAgUU1GX1NDQUxFX0ZBQ1RPUiBzYnJTY2FsZUZhY3RvcjsKLSAgUU1GX1NDQUxFX0ZBQ1RPUiBzYnJTY2FsZUZhY3RvclJpZ2h0OwordHlwZWRlZiBzdHJ1Y3QgeworICBTQlJfQ0FMQ1VMQVRFX0VOVkVMT1BFIFNickNhbGN1bGF0ZUVudmVsb3BlOworICBTQlJfTFBQX1RSQU5TIExwcFRyYW5zOworICBQVkNfU1RBVElDX0RBVEEgUHZjU3RhdGljRGF0YTsKIAotICAvKiEgRGVsYXllZCBzcGVjdHJhbCBkYXRhIG5lZWRlZCBmb3IgdGhlIGR5bmFtaWMgZnJhbWluZyBvZiBTQlIuIE5vdCByZXF1aXJlZCBpbiBjYXNlIG9mIENMREZCICovCi0gIEZJWFBfREJMICogcFNick92ZXJsYXBCdWZmZXI7CisgIC8qIGRvIHNjYWxlIGhhbmRsaW5nIGluIHNiciBhbiBub3QgaW4gcW1mICovCisgIFNIT1JUIHNjYWxlX292OworICBTSE9SVCBzY2FsZV9sYjsKKyAgU0hPUlQgc2NhbGVfaGJlOwogCi0gIC8qIFJlZmVyZW5jZXMgdG8gd29ya2J1ZmZlcnMgKi8KLSAgRklYUF9EQkwgKiBXb3JrQnVmZmVyMTsKLSAgRklYUF9EQkwgKiBXb3JrQnVmZmVyMjsKKyAgU0hPUlQgcHJldl9mcmFtZV9sU2JyOworICBTSE9SVCBwcmV2X2ZyYW1lX2hiZVNicjsKIAotICAvKiBEZWxheWVkIHRpbWUgaW5wdXQgc2lnbmFsIG5lZWRlZCB0byBhbGlnbiBDTERGRCB3aXRoIExELU1QUyBRTUYuICovCi0gIElOVF9QQ00gICAgY29yZURlbGF5QnVmWyg5NildOworICBpbnQgY29kZWNGcmFtZVNpemU7CiAKLSAgLyogUU1GIGZpbHRlciBzdGF0ZXMgKi8KLSAgRklYUF9RQVMgICBhbmFRbWZTdGF0ZXNbKDMyMCldOwotICBGSVhQX1FTUyAqIHBTeW5RbWZTdGF0ZXM7CisgIEhBTkRMRV9IQkVfVFJBTlNQT1NFUiBoSEJFOwogCi0gIC8qIFJlZmVyZW5jZSBwb2ludGVyIGFycmF5cyBmb3IgUU1GIHRpbWUgc2xvdHMsCi0gICAgIG1peGVkIGFtb25nIG92ZXJsYXAgYW5kIGN1cnJlbnQgc2xvdHMuICovCi0gIEZJWFBfREJMICogUW1mQnVmZmVyUmVhbFsoKCgxMDI0KS8oMzIpKSsoNikpXTsKLSAgRklYUF9EQkwgKiBRbWZCdWZmZXJJbWFnWygoKDEwMjQpLygzMikpKyg2KSldOwotICBpbnQgdXNlTFA7CisgIEhBTkRMRV9GREtfUU1GX0RPTUFJTl9JTiBxbWZEb21haW5JbkNoOworICBIQU5ETEVfRkRLX1FNRl9ET01BSU5fT1VUIHFtZkRvbWFpbk91dENoOwogCi0gIC8qIFFNRiBkb21haW4gZXh0ZW5zaW9uIHRpbWUgc2xvdCByZWZlcmVuY2UgcG9pbnRlciBhcnJheSAqLworICBTQlJERUNfRFJDX0NIQU5ORUwgc2JyRHJjQ2hhbm5lbDsKIAotICBTQlJERUNfRFJDX0NIQU5ORUwgIHNickRyY0NoYW5uZWw7CisjaWYgKFNCUkRFQ19NQVhfSEJfRkFERV9GUkFNRVMgPiAwKQorICBJTlQgaGlnaEJhbmRGYWRlQ250OyAvKiBjb3VudGVyIGZvciBmYWRpbmcgaW4gaGlnaC1iYW5kIHNpZ25hbCBzbW9vdGhseSAqLwogCisjZW5kaWYKKyAgRklYUF9EQkwgKip0bXBfbWVtb3J5OyAvKiBzaGFyZWQgbWVtb3J5IGJldHdlZW4gaGJlTGlnaHRUaW1lRGVsYXlCdWZmZXIgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFtZkhCRVNsb3RzUmVhbCAqLworCisgIEZJWFBfREJMICoqaFFtZkhCRVNsb3RzUmVhbDsKKyAgRklYUF9EQkwgKipoUW1mSEJFU2xvdHNJbWFnOworCisgIEZJWFBfREJMICoqY29kZWNRTUZCdWZmZXJSZWFsOworICBGSVhQX0RCTCAqKmNvZGVjUU1GQnVmZmVySW1hZzsKKyAgVUNIQVIgc2F2ZWRTdGF0ZXM7CisgIGludCBhcHBseVNiclByb2Nfb2xkOwogfSBTQlJfREVDOwogCiB0eXBlZGVmIFNCUl9ERUMgKkhBTkRMRV9TQlJfREVDOwogCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIFNCUl9GUkFNRV9EQVRBICAgICAgZnJhbWVEYXRhWygxKSsxXTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgU0JSX0ZSQU1FX0RBVEEgZnJhbWVEYXRhWygxKSArIDFdOwogICBTQlJfUFJFVl9GUkFNRV9EQVRBIHByZXZGcmFtZURhdGE7CiAgIFNCUl9ERUMgU2JyRGVjOwotfQotU0JSX0NIQU5ORUw7Cit9IFNCUl9DSEFOTkVMOwogCiB0eXBlZGVmIFNCUl9DSEFOTkVMICpIQU5ETEVfU0JSX0NIQU5ORUw7CiAKLXZvaWQKLVNickRlY29kZUFuZFByb2Nlc3MgKEhBTkRMRV9TQlJfREVDIGhTYnJEZWMsCi0gICAgICAgICAgICAgICAgICAgICBJTlRfUENNICp0aW1lSW4sCi0gICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhGcmFtZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoUHJldkZyYW1lRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBhcHBseVByb2Nlc3NpbmcsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbE5yCi0gICAgICAgICAgICAgICAgICAgICAsIFVDSEFSIHVzZUxQCi0gICAgICAgICAgICAgICAgICAgICApOwotCi0KLXZvaWQKLVNickNvbnN0cnVjdFRpbWVPdXRwdXQgKEhBTkRMRV9TQlJfREVDIGhTYnJEZWMsICAgICAgICAgICAgLyohPCBoYW5kbGUgdG8gRGVjb2RlciBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICp0aW1lT3V0LCAgICAgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIG91dHB1dCB0aW1lIHNpZ25hbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhQcmV2RnJhbWVEYXRhLCAgLyohPCBTb21lIGNvbnRyb2wgZGF0YSBvZiBsYXN0IGZyYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbE5yCi0gICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiB1c2VMUAotICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotCi12b2lkCi1zYnJfZGVjIChIQU5ETEVfU0JSX0RFQyBoU2JyRGVjLCAgICAgICAgICAgIC8qITwgaGFuZGxlIHRvIERlY29kZXIgY2hhbm5lbCAqLwotICAgICAgICAgSU5UX1BDTSAqdGltZUluLCAgICAgICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gaW5wdXQgdGltZSBzaWduYWwgKi8KLSAgICAgICAgIElOVF9QQ00gKnRpbWVPdXQsICAgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIG91dHB1dCB0aW1lIHNpZ25hbCAqLwotICAgICAgICAgSEFORExFX1NCUl9ERUMgaFNickRlY1JpZ2h0LCAgICAgICAvKiE8IGhhbmRsZSB0byBEZWNvZGVyIGNoYW5uZWwgcmlnaHQgKi8KLSAgICAgICAgIElOVF9QQ00gKnRpbWVPdXRSaWdodCwgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIG91dHB1dCB0aW1lIHNpZ25hbCAqLwotICAgICAgICAgY29uc3QgaW50IHN0cmlkZUluLCAgICAgICAgICAgICAgICAvKiE8IFRpbWUgZGF0YSB0cmF2ZXJzYWwgc3RyaWRlSW4gKi8KLSAgICAgICAgIGNvbnN0IGludCBzdHJpZGVPdXQsICAgICAgICAgICAgICAgLyohPCBUaW1lIGRhdGEgdHJhdmVyc2FsIHN0cmlkZU91dCAqLwotICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KLSAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoRnJhbWVEYXRhLCAgLyohPCBDb250cm9sIGRhdGEgb2YgY3VycmVudCBmcmFtZSAqLwotICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaFByZXZGcmFtZURhdGEsICAvKiE8IFNvbWUgY29udHJvbCBkYXRhIG9mIGxhc3QgZnJhbWUgKi8KLSAgICAgICAgIGNvbnN0IGludCBhcHBseVByb2Nlc3NpbmcsICAgICAgICAgLyohPCBGbGFnIGZvciBTQlIgb3BlcmF0aW9uICovCi0gICAgICAgICBIQU5ETEVfUFNfREVDIGhfcHNfZCwKLSAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MsCi0gICAgICAgICBjb25zdCBpbnQgY29kZWNGcmFtZVNpemUKLSAgICAgICAgKTsKLQotCit2b2lkIHNicl9kZWMoCisgICAgSEFORExFX1NCUl9ERUMgaFNickRlYywgICAgICAgICAgICAgLyohPCBoYW5kbGUgdG8gRGVjb2RlciBjaGFubmVsICovCisgICAgSU5UX1BDTSAqdGltZUluLCAgICAgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIGlucHV0IHRpbWUgc2lnbmFsICovCisgICAgSU5UX1BDTSAqdGltZU91dCwgICAgICAgICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIG91dHB1dCB0aW1lIHNpZ25hbCAqLworICAgIEhBTkRMRV9TQlJfREVDIGhTYnJEZWNSaWdodCwgICAgICAgIC8qITwgaGFuZGxlIHRvIERlY29kZXIgY2hhbm5lbCByaWdodCAqLworICAgIElOVF9QQ00gKnRpbWVPdXRSaWdodCwgICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBvdXRwdXQgdGltZSBzaWduYWwgKi8KKyAgICBJTlQgc3RyaWRlT3V0LCAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWUgZGF0YSB0cmF2ZXJzYWwgc3RyaWRlT3V0ICovCisgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgLyohPCBTdGF0aWMgY29udHJvbCBkYXRhICovCisgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhGcmFtZURhdGEsICAgLyohPCBDb250cm9sIGRhdGEgb2YgY3VycmVudCBmcmFtZSAqLworICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBCisgICAgICAgIGhQcmV2RnJhbWVEYXRhLCAgICAgICAgLyohPCBTb21lIGNvbnRyb2wgZGF0YSBvZiBsYXN0IGZyYW1lICovCisgICAgY29uc3QgaW50IGFwcGx5UHJvY2Vzc2luZywgLyohPCBGbGFnIGZvciBTQlIgb3BlcmF0aW9uICovCisgICAgSEFORExFX1BTX0RFQyBoX3BzX2QsIGNvbnN0IFVJTlQgZmxhZ3MsIGNvbnN0IGludCBjb2RlY0ZyYW1lU2l6ZSk7CiAKIFNCUl9FUlJPUgotY3JlYXRlU2JyRGVjIChTQlJfQ0hBTk5FTCAqIGhTYnJDaGFubmVsLAotICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAotICAgICAgICAgICAgICBUUkFOU1BPU0VSX1NFVFRJTkdTICpwU2V0dGluZ3MsCi0gICAgICAgICAgICAgIGNvbnN0IGludCBkb3duc2FtcGxlRmFjLAotICAgICAgICAgICAgICBjb25zdCBVSU5UIHFtZkZsYWdzLAotICAgICAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzLAotICAgICAgICAgICAgICBjb25zdCBpbnQgb3ZlcmxhcCwKLSAgICAgICAgICAgICAgaW50IGNoYW4pOworY3JlYXRlU2JyRGVjKFNCUl9DSEFOTkVMICpoU2JyQ2hhbm5lbCwgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgICBUUkFOU1BPU0VSX1NFVFRJTkdTICpwU2V0dGluZ3MsIGNvbnN0IGludCBkb3duc2FtcGxlRmFjLAorICAgICAgICAgICAgIGNvbnN0IFVJTlQgcW1mRmxhZ3MsIGNvbnN0IFVJTlQgZmxhZ3MsIGNvbnN0IGludCBvdmVybGFwLCBpbnQgY2hhbiwKKyAgICAgICAgICAgICBpbnQgY29kZWNGcmFtZVNpemUpOwogCi1pbnQKLWRlbGV0ZVNickRlYyAoU0JSX0NIQU5ORUwgKiBoU2JyQ2hhbm5lbCk7CitpbnQgZGVsZXRlU2JyRGVjKFNCUl9DSEFOTkVMICpoU2JyQ2hhbm5lbCk7CiAKIFNCUl9FUlJPUgotcmVzZXRTYnJEZWMgKEhBTkRMRV9TQlJfREVDIGhTYnJEZWMsCi0gICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKLSAgICAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoUHJldkZyYW1lRGF0YSwKLSAgICAgICAgICAgICBjb25zdCBpbnQgdXNlTFAsCi0gICAgICAgICAgICAgY29uc3QgaW50IGRvd25zYW1wbGVGYWMpOworcmVzZXRTYnJEZWMoSEFORExFX1NCUl9ERUMgaFNickRlYywgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKKyAgICAgICAgICAgIEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhQcmV2RnJhbWVEYXRhLCBjb25zdCBpbnQgZG93bnNhbXBsZUZhYywKKyAgICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MsIEhBTkRMRV9TQlJfRlJBTUVfREFUQSBoRnJhbWVEYXRhKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3Nicl9yYW0uY3BwIGIvbGliU0JSZGVjL3NyYy9zYnJfcmFtLmNwcAppbmRleCBjMWMyNDk5Li44YjM1ZmQyIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL3Nicl9yYW0uY3BwCisrKyBiL2xpYlNCUmRlYy9zcmMvc2JyX3JhbS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjMgKzkwLDI3IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCiAgIFxicmllZiBNZW1vcnkgbGF5b3V0Ci0gICAKIAogICBUaGlzIG1vZHVsZSBkZWNsYXJlcyBhbGwgc3RhdGljIGFuZCBkeW5hbWljIG1lbW9yeSBzcGFjZXMKICovCiAKICNpbmNsdWRlICJzYnJfcmFtLmgiCiAKLQotCi0KLSNkZWZpbmUgV09SS0JVRkZFUjFfVEFHIDAKLSNkZWZpbmUgV09SS0JVRkZFUjJfVEFHIDEKKyNkZWZpbmUgV09SS0JVRkZFUjFfVEFHIDIKKyNkZWZpbmUgV09SS0JVRkZFUjJfVEFHIDMKIAogLyohCiAgIFxuYW1lIFN0YXRpY1NickRhdGEKQEAgLTExMSwyNCArMTI2LDE0IEBACiBDX0FMTE9DX01FTTIoUmFtX1NickRlY0VsZW1lbnQsIFNCUl9ERUNPREVSX0VMRU1FTlQsIDEsICg4KSkKIC8qISBTQlIgRGVjb2RlciBpbmRpdmlkdWFsIGNoYW5uZWwgZGF0YSAgPGJyPgogICBEaW1lbnNpb246ICg4KSAqLwotQ19BTExPQ19NRU0yKFJhbV9TYnJEZWNDaGFubmVsLCBTQlJfQ0hBTk5FTCwgMSwgKDgpKzEpCi0KLS8qISBGaWx0ZXIgc3RhdGVzIGZvciBRTUYtc3ludGhlc2lzLiAgPGJyPgotICBEaW1lbnNpb246ICMoOCkgKiAoI1FNRl9GSUxURVJfU1RBVEVfU1lOX1NJWkUtIyg2NCkpICovCi1DX0FBTExPQ19NRU0yX0woUmFtX3Nicl9RbWZTdGF0ZXNTeW50aGVzaXMsIEZJWFBfUVNTLCAoNjQwKS0oNjQpLCAoOCkrMSwgU0VDVF9EQVRBX0wxKQotCi0vKiEgRGVsYXllZCBzcGVjdHJhbCBkYXRhIG5lZWRlZCBmb3IgdGhlIGR5bmFtaWMgZnJhbWluZyBvZiBTQlIuCi0gIEZvciBtcDNQUk8sIDEvMyBvZiBhIGZyYW1lIGlzIGJ1ZmZlcmVkICgjKDYpIDYpICovCi1DX0FBTExPQ19NRU0yKFJhbV9zYnJfT3ZlcmxhcEJ1ZmZlciwgRklYUF9EQkwsIDIgKiAoNikgKiAoNjQpLCAoOCkrMSkKK0NfQUxMT0NfTUVNMihSYW1fU2JyRGVjQ2hhbm5lbCwgU0JSX0NIQU5ORUwsIDEsICg4KSArIDEpCiAKIC8qISBTdGF0aWMgRGF0YSBvZiBQUyAqLwogCi1DX0FMTE9DX01FTShSYW1fcHNfZGVjLCBQU19ERUMsIDEpCi0KK0NfQUxMT0NfTUVNKFJhbV9wc19kZWMsIHN0cnVjdCBQU19ERUMsIDEpCiAKIC8qIEB9ICovCiAKLQogLyohCiAgIFxuYW1lIER5bmFtaWNTYnJEYXRhCiAKQEAgLTEzOCwxNCArMTQzLDEyIEBACiAgIERlcGVuZGluZyBvbiB0aGUgbW9kZSBzZXQgYnkgRE9OVF9VU0VfQ09SRV9XT1JLQlVGRkVSLCB3b3JrYnVmZmVycyBhcmUKICAgZGVmaW5lZCBhZGRpdGlvbmFsbHkgdG8gdGhlIENvcmVXb3JrYnVmZmVyLgogICA8YnI+Ci0gIFRoZSBzaXplIG9mIFdvcmtCdWZmZXJzIGlzICgoMTAyNCkvKDMyKSkqKDY0KSA9IDIwNDguCisgIFRoZSBzaXplIG9mIFdvcmtCdWZmZXJzIGlzICgoMTAyNCkgLyAoMzIpICogKDQpIC8gMikqKDY0KSA9IDIwNDguCiAgIDxicj4KLSAgV29ya0J1ZmZlcjIgaXMgYSBwb2ludGVyIHRvIHRoZSBDb3JlV29ya0J1ZmZlciB3aWNoIGlzIHJldXNlZCBoZXJlIGluIHRoZSBTQlIgcGFydC4gSW4gY2FzZSBvZgotICBET05UX1VTRV9DT1JFX1dPUktCVUZGRVIsIHRoZSBDb3JlV29ya2J1ZmZlciBpcyBub3QgdXNlZCBhbmQgdGhlIGFjY29yZGluZwotICBXb3JrYnVmZmVyMiBpcyBkZWZpbmVkIGxvY2FsbHkgaW4gdGhpcyBmaWxlLgotICA8YnI+Ci0gIFdvcmtCdWZmZXIxIGlzIHJldXNlZCBpbiB0aGUgQUFDIGNvcmUgKC0+IGFhY2RlY29kZXIuY3BwLCBhYWNfcmFtLmNwcCkKLSAgPGJyPgorICBXb3JrQnVmZmVyMiBpcyBhIHBvaW50ZXIgdG8gdGhlIENvcmVXb3JrQnVmZmVyIHdpY2ggaXMgcmV1c2VkIGhlcmUgaW4gdGhlIFNCUgorICBwYXJ0LiBJbiBjYXNlIG9mIERPTlRfVVNFX0NPUkVfV09SS0JVRkZFUiwgdGhlIENvcmVXb3JrYnVmZmVyIGlzIG5vdCB1c2VkIGFuZAorICB0aGUgYWNjb3JkaW5nIFdvcmtidWZmZXIyIGlzIGRlZmluZWQgbG9jYWxseSBpbiB0aGlzIGZpbGUuIDxicj4gV29ya0J1ZmZlcjEgaXMKKyAgcmV1c2VkIGluIHRoZSBBQUMgY29yZSAoLT4gYWFjZGVjb2Rlci5jcHAsIGFhY19yYW0uY3BwKSA8YnI+CiAKICAgVXNlIG9mIFdvcmtCdWZmZXJzOgogICA8cHJlPgpAQCAtMTY5LDI2ICsxNzIsMjAgQEAKICAgICAgICAgfF9fX19fX19fX19fX19fX198ICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX19fX19fX19fX19ffAogCiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBIaWdoIFF1YWxpdHkgTW9kZSAoIUxPV19QT1dFUl9TQlJfT05MWSBhbmQgdXNlTFA9MCksIHNlZSBhc3NpZ25IcVRpbWVTbG90cygpCisgICAgICBIaWdoIFF1YWxpdHkgTW9kZSAoIUxPV19QT1dFUl9TQlJfT05MWSBhbmQgdXNlTFA9MCksIHNlZQorICBhc3NpZ25IcVRpbWVTbG90cygpCiAKICAgICAgICAgIFNMT1RCQVNFRF9QUwogCiAgICAgICAgICBXb3JrQnVmZmVyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ya0J1ZmZlcjIoPUNvcmVXb3JrYnVmZmVyKQogICAgICAgICAgX19fX19fX19fX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fX19fX19fX18KLSAgICAgICAgfCBSZWFsL0ltYWcgICAgICB8ICBpbnRlcmxlYXZlZCAgICAgICAgICAgIHwgUmVhbC9JbWFnICAgICAgfCAgaW50ZXJsZWF2ZWQKLSAgICAgICAgfF9fX19fX19fX19fX19fX198ICBmaXJzdCBoYWxmIGFjdHVhbCBjaCAgIHxfX19fX19fX19fX19fX19ffCAgc2Vjb25kIGhhbGYgYWN0dWFsIGNoCisgICAgICAgIHwgUmVhbC9JbWFnICAgICAgfCAgaW50ZXJsZWF2ZWQgICAgICAgICAgICB8IFJlYWwvSW1hZyAgICAgIHwKKyAgaW50ZXJsZWF2ZWQKKyAgICAgICAgfF9fX19fX19fX19fX19fX198ICBmaXJzdCBoYWxmIGFjdHVhbCBjaCAgIHxfX19fX19fX19fX19fX19ffCAgc2Vjb25kCisgIGhhbGYgYWN0dWFsIGNoCiAKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgPC9wcmU+CiAKICovCi0vKiBAeyAqLwotQ19BTExPQ19NRU1fT1ZFUkxBWShSYW1fU2JyRGVjV29ya0J1ZmZlcjEsIEZJWFBfREJMLCAoKDEwMjQpLygzMikpKig2NCksIFNFQ1RfREFUQV9MMSwgV09SS0JVRkZFUjFfVEFHKQotQ19BTExPQ19NRU1fT1ZFUkxBWShSYW1fU2JyRGVjV29ya0J1ZmZlcjIsIEZJWFBfREJMLCAoKDEwMjQpLygzMikpKig2NCksIFNFQ1RfREFUQV9MMiwgV09SS0JVRkZFUjJfVEFHKQotCi0vKiBAfSAqLwotCi0KLQotCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3Nicl9yYW0uaCBiL2xpYlNCUmRlYy9zcmMvc2JyX3JhbS5oCmluZGV4IDdhYjUwNDQuLmUwMGY4YjUgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvc2JyX3JhbS5oCisrKyBiL2xpYlNCUmRlYy9zcmMvc2JyX3JhbS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDY2ICs5MCw4NiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogXGZpbGUKIFxicmllZiBNZW1vcnkgbGF5b3V0Ci0gCiAqLwotI2lmbmRlZiBfU0JSX1JBTV9IXwotI2RlZmluZSBfU0JSX1JBTV9IXworI2lmbmRlZiBTQlJfUkFNX0gKKyNkZWZpbmUgU0JSX1JBTV9ICiAKICNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCiAKICNpbmNsdWRlICJlbnZfZXh0ci5oIgogI2luY2x1ZGUgInNicl9kZWMuaCIKIAorI2RlZmluZSBTQlJERUNfTUFYX0NIX1BFUl9FTEVNRU5UICgyKQogCisjZGVmaW5lIEZSQU1FX09LICgwKQorI2RlZmluZSBGUkFNRV9FUlJPUiAoMSkKKyNkZWZpbmUgRlJBTUVfRVJST1JfQUxMU0xPVFMgKDIpCiAKLSNkZWZpbmUgU0JSREVDX01BWF9DSF9QRVJfRUxFTUVOVCAgKDIpCit0eXBlZGVmIHN0cnVjdCB7CisgIFNCUl9DSEFOTkVMICpwU2JyQ2hhbm5lbFtTQlJERUNfTUFYX0NIX1BFUl9FTEVNRU5UXTsKKyAgVFJBTlNQT1NFUl9TRVRUSU5HUworICB0cmFuc3Bvc2VyU2V0dGluZ3M7IC8qIENvbW1vbiB0cmFuc3BvcnQgc2V0dGluZ3MgZm9yIGVhY2ggaW5kaXZpZHVhbAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgb2YgYW4gZWxlbWVudCAqLworICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnM7CiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIFNCUl9DSEFOTkVMICAgICAgICAgICpwU2JyQ2hhbm5lbFtTQlJERUNfTUFYX0NIX1BFUl9FTEVNRU5UXTsKLSAgVFJBTlNQT1NFUl9TRVRUSU5HUyAgIHRyYW5zcG9zZXJTZXR0aW5nczsgLyogQ29tbW9uIHRyYW5zcG9ydCBzZXR0aW5ncyBmb3IgZWFjaCBpbmRpdmlkdWFsIGNoYW5uZWwgb2YgYW4gZWxlbWVudCAqLwotICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJzOworICBNUDRfRUxFTUVOVF9JRAorICBlbGVtZW50SUQ7ICAgICAvKiBFbGVtZW50IElEIHNldCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIENhbiBiZSB1c2VkIGZvcgorICAgICAgICAgICAgICAgICAgICBjb25jZWFsbWVudCAqLworICBpbnQgbkNoYW5uZWxzOyAvKiBOdW1iZXIgb2YgZWxlbWVudHMgb3V0cHV0IGNoYW5uZWxzICg9MiBpbiBjYXNlIG9mIFBTKSAqLwogCi0gIE1QNF9FTEVNRU5UX0lEICAgICAgICBlbGVtZW50SUQ7ICAgICAgICAgIC8qIEVsZW1lbnQgSUQgc2V0IGR1cmluZyBpbml0aWFsaXphdGlvbi4gQ2FuIGJlIHVzZWQgZm9yIGNvbmNlYWxtZW50ICovCi0gIGludCAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHM7ICAgICAgICAgIC8qIE51bWJlciBvZiBlbGVtZW50cyBvdXRwdXQgY2hhbm5lbHMgKD0yIGluIGNhc2Ugb2YgUFMpICovCisgIFVDSEFSIGZyYW1lRXJyb3JGbGFnWygxKSArIDFdOyAvKiBGcmFtZSBlcnJvciBzdGF0dXMgKGZvciBldmVyeSBzbG90IGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXkgbGluZSkuIFdpbGwgYmUgY29waWVkIGludG8gaGVhZGVyIGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgZGVjb2RlRWxlbWVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5lLiAqLwogCi0gIFVDSEFSIGZyYW1lRXJyb3JGbGFnWygxKSsxXTsgIC8qIEZyYW1lIGVycm9yIHN0YXR1cyAoZm9yIGV2ZXJ5IHNsb3QgaW4gdGhlIGRlbGF5IGxpbmUpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbGwgYmUgY29waWVkIGludG8gaGVhZGVyIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiBkZWNvZGVFbGVtZW50KCkgcm91dGluZS4gKi8KLQotICBVQ0hBUiB1c2VGcmFtZVNsb3Q7ICAgICAgICAgIC8qIEluZGV4IHdoaWNoIGRlZmluZXMgd2hpY2ggc2xvdCB3aWxsIGJlIGRlY29kZWQvZmlsbGVkIG5leHQgKHVzZWQgd2l0aCBhZGRpdGlvbmFsIGRlbGF5KSAqLwotICBVQ0hBUiB1c2VIZWFkZXJTbG90WygxKSsxXTsgICAvKiBJbmRleCBhcnJheSB0aGF0IHByb3ZpZGVzIHRoZSBsaW5rIGJldHdlZW4gaGVhZGVyIGFuZCBmcmFtZSBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGltcG9ydGFudCB3aGVuIHByb2Nlc3Npbmcgd2l0aCBhZGRpdGlvbmFsIGRlbGF5KS4gKi8KKyAgVUNIQVIgdXNlRnJhbWVTbG90OyAvKiBJbmRleCB3aGljaCBkZWZpbmVzIHdoaWNoIHNsb3Qgd2lsbCBiZSBkZWNvZGVkL2ZpbGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgKHVzZWQgd2l0aCBhZGRpdGlvbmFsIGRlbGF5KSAqLworICBVQ0hBUiB1c2VIZWFkZXJTbG90WygxKSArIDFdOyAvKiBJbmRleCBhcnJheSB0aGF0IHByb3ZpZGVzIHRoZSBsaW5rIGJldHdlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyIGFuZCBmcmFtZSBkYXRhIChpbXBvcnRhbnQgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIHdpdGggYWRkaXRpb25hbCBkZWxheSkuICovCiB9IFNCUl9ERUNPREVSX0VMRU1FTlQ7CiAKK3N0cnVjdCBTQlJfREVDT0RFUl9JTlNUQU5DRSB7CisgIFNCUl9ERUNPREVSX0VMRU1FTlQgKnBTYnJFbGVtZW50Wyg4KV07CisgIFNCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJbKAorICAgICAgOCldWygxKSArIDFdOyAvKiBTYnIgaGVhZGVyIGZvciBlYWNoIGluZGl2aWR1YWwgY2hhbm5lbCBvZiBhbiBlbGVtZW50ICovCiAKLXN0cnVjdCBTQlJfREVDT0RFUl9JTlNUQU5DRQotewotICBTQlJfREVDT0RFUl9FTEVNRU5UICAqcFNickVsZW1lbnRbKDgpXTsKLSAgU0JSX0hFQURFUl9EQVRBICAgICAgIHNickhlYWRlclsoOCldWygxKSsxXTsgICAgICAvKiBTYnIgaGVhZGVyIGZvciBlYWNoIGluZGl2aWR1YWwgY2hhbm5lbCBvZiBhbiBlbGVtZW50ICovCisgIEhBTkRMRV9GREtfUU1GX0RPTUFJTiBwUW1mRG9tYWluOwogCi0gIEZJWFBfREJMICp3b3JrQnVmZmVyMTsKLSAgRklYUF9EQkwgKndvcmtCdWZmZXIyOwotCi0gIEhBTkRMRV9QU19ERUMgIGhQYXJhbWV0cmljU3RlcmVvRGVjOworICBIQU5ETEVfUFNfREVDIGhQYXJhbWV0cmljU3RlcmVvRGVjOwogCiAgIC8qIEdsb2JhbCBwYXJhbWV0ZXJzICovCiAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYzsgLyogQU9UIG9mIGNvcmUgY29kZWMgKi8KICAgaW50IG51bVNickVsZW1lbnRzOwogICBpbnQgbnVtU2JyQ2hhbm5lbHM7Ci0gIElOVCBzYW1wbGVSYXRlSW47ICAgICAgICAgICAgLyogU0JSIGRlY29kZXIgaW5wdXQgc2FtcGxpbmcgcmF0ZTsgbWlnaHQgYmUgZGlmZmVyZW50IHRoYW4gdGhlIHRyYW5zcG9zZXIgaW5wdXQgc2FtcGxpbmcgcmF0ZS4gKi8KLSAgSU5UIHNhbXBsZVJhdGVPdXQ7ICAgICAgICAgICAvKiBTYW1wbGluZyByYXRlIG9mIHRoZSBTQlIgZGVjb2RlciBvdXRwdXQgYXVkaW8gc2FtcGxlcy4gKi8KKyAgSU5UIHNhbXBsZVJhdGVJbjsgIC8qIFNCUiBkZWNvZGVyIGlucHV0IHNhbXBsaW5nIHJhdGU7IG1pZ2h0IGJlIGRpZmZlcmVudCB0aGFuCisgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdHJhbnNwb3NlciBpbnB1dCBzYW1wbGluZyByYXRlLiAqLworICBJTlQgc2FtcGxlUmF0ZU91dDsgLyogU2FtcGxpbmcgcmF0ZSBvZiB0aGUgU0JSIGRlY29kZXIgb3V0cHV0IGF1ZGlvIHNhbXBsZXMuCisgICAgICAgICAgICAgICAgICAgICAgKi8KICAgVVNIT1JUIGNvZGVjRnJhbWVTaXplOwogICBVQ0hBUiBzeW5Eb3duc2FtcGxlRmFjOwotICBVQ0hBUiBudW1EZWxheUZyYW1lczsgICAgICAgIC8qIFRoZSBjdXJyZW50IG51bWJlciBvZiBhZGRpdGlvbmFsIGRlbGF5IGZyYW1lcyB1c2VkIGZvciBwcm9jZXNzaW5nLiAqLwotICBVQ0hBUiBudW1GbHVzaGVkRnJhbWVzOyAgICAgIC8qIFRoZSB2YXJpYWJsZSBjb3VudHMgdGhlIG51bWJlciBvZiBmcmFtZXMgd2hpY2ggYXJlIGZsdXNoZWQgY29uc2VjdXRpdmVseS4gKi8KKyAgSU5UIGRvd25zY2FsZUZhY3RvcjsKKyAgVUNIQVIgbnVtRGVsYXlGcmFtZXM7IC8qIFRoZSBjdXJyZW50IG51bWJlciBvZiBhZGRpdGlvbmFsIGRlbGF5IGZyYW1lcyB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcHJvY2Vzc2luZy4gKi8KKyAgVUNIQVIgaGFybW9uaWNTQlI7CisgIFVDSEFSCisgIG51bUZsdXNoZWRGcmFtZXM7IC8qIFRoZSB2YXJpYWJsZSBjb3VudHMgdGhlIG51bWJlciBvZiBmcmFtZXMgd2hpY2ggYXJlCisgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoZWQgY29uc2VjdXRpdmVseS4gKi8KIAogICBVSU5UIGZsYWdzOwotCiB9OwogCiBIX0FMTE9DX01FTShSYW1fU2JyRGVjRWxlbWVudCwgU0JSX0RFQ09ERVJfRUxFTUVOVCkKQEAgLTE0OCwxMiArMTc5LDggQEAKIEhfQUxMT0NfTUVNKFJhbV9zYnJfUW1mU3RhdGVzU3ludGhlc2lzLCBGSVhQX1FTUykKIEhfQUxMT0NfTUVNKFJhbV9zYnJfT3ZlcmxhcEJ1ZmZlciwgRklYUF9EQkwpCiAKK0hfQUxMT0NfTUVNKFJhbV9zYnJfSEJFT3ZlcmxhcEJ1ZmZlciwgRklYUF9EQkwpCiAKIEhfQUxMT0NfTUVNKFJhbV9wc19kZWMsIFBTX0RFQykKIAotCi1IX0FMTE9DX01FTV9PVkVSTEFZKFJhbV9TYnJEZWNXb3JrQnVmZmVyMSwgRklYUF9EQkwpCi1IX0FMTE9DX01FTV9PVkVSTEFZKFJhbV9TYnJEZWNXb3JrQnVmZmVyMiwgRklYUF9EQkwpCi0KLQotI2VuZGlmIC8qIF9TQlJfUkFNX0hfICovCisjZW5kaWYgLyogU0JSX1JBTV9IICovCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3Nicl9yb20uY3BwIGIvbGliU0JSZGVjL3NyYy9zYnJfcm9tLmNwcAppbmRleCA0ZjJjYzQ4Li44YTY2ODhhIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL3Nicl9yb20uY3BwCisrKyBiL2xpYlNCUmRlYy9zcmMvc2JyX3JvbS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNDEgKzkwLDcxIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCiAgIFxicmllZiAgRGVmaW5pdGlvbiBvZiBjb25zdGFudCB0YWJsZXMKLSAgIAogCiAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIG1vc3Qgb2YgdGhlIGNvbnN0YW50IGRhdGEgdGhhdCBjYW4gYmUgc3RvcmVkIGluIFJPTS4KICovCiAKICNpbmNsdWRlICJzYnJfcm9tLmgiCiAKLQotCi0KIC8qIQogICBcbmFtZSAgIFN0YXJ0U3RvcEJhbmRzCiAgIFxicmllZiAgU3RhcnQgYW5kIHN0b3Agc3ViYmFuZHMgb2YgdGhlIGhpZ2hiYW5kLgogCiAgIGtfbyA9IHN0YXJ0TWluICsgb2Zmc2V0W2JzX3N0YXJ0X2ZyZXFdOwotICBzdGFydE1pbiA9IHszMDAwLDQwMDAsNTAwMH0gKiAoMTI4L0ZTX3NicikgLyBGU19zYnIgPCAzMktoeiwgMzJLaHogPD0gRlNfc2JyIDwgNjRLSHosIDY0S0h6IDw9IEZTX3NicgotICBUaGUgc3RvcCBzdWJiYW5kIGNhbiBhbHNvIGJlIGNhbGN1bGF0ZWQgdG8gc2F2ZSBtZW1vcnkgYnkgZGVmaW5pbmcgI0NBTENfU1RPUF9CQU5ELgorICBzdGFydE1pbiA9IHszMDAwLDQwMDAsNTAwMH0gKiAoMTI4L0ZTX3NicikgLyBGU19zYnIgPCAzMktoeiwgMzJLaHogPD0gRlNfc2JyIDwKKyAgNjRLSHosIDY0S0h6IDw9IEZTX3NiciBUaGUgc3RvcCBzdWJiYW5kIGNhbiBhbHNvIGJlIGNhbGN1bGF0ZWQgdG8gc2F2ZSBtZW1vcnkKKyAgYnkgZGVmaW5pbmcgI0NBTENfU1RPUF9CQU5ELgogKi8KIC8vQHsKLWNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzE2WzE2XSA9IHsxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMX07Ci1jb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8yMlsxNl0gPSB7MTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI2LCAyOCwgMzB9OwotY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMjRbMTZdID0gezExLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI1LCAyNywgMjksIDMyfTsKLWNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzMyWzE2XSA9IHsxMCwgMTIsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNSwgMjcsIDI5LCAzMn07Ci1jb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV80MFsxNl0gPSB7MTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyNCwgMjYsIDI4LCAzMCwgMzJ9OwotY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNDRbMTZdID0geyA4LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjEsIDIzLCAyNSwgMjgsIDMyfTsKLWNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzQ4WzE2XSA9IHsgNywgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDIwLCAyMiwgMjQsIDI3LCAzMX07Ci1jb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV82NFsxNl0gPSB7IDYsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOSwgMjEsIDIzLCAyNiwgMzB9OwotY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfODhbMTZdID0geyA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNiwgMTgsIDIwLCAyMywgMjcsIDMxfTsKLS8vQH0KKy8qIHRhYmxlcyB3ZXJlIGNyZWF0ZWQgd2l0aCAuLi9hZGRvbi9vY3RhdmUvc2JyX3N0YXJ0X2ZyZXFfdGFibGUubSAqLworY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMTZbXVsxNl0gPSB7CisgICAgezE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxfSwKKyAgICB7NCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTl9fTsKK2NvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzIyW11bMTZdID0geworICAgIHsxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjYsIDI4LCAzMH0sCisgICAgezQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxOCwgMjAsIDIyfX07Citjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8yNFtdWzE2XSA9IHsKKyAgICB7MTEsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjUsIDI3LCAyOSwgMzJ9LAorICAgIHszLCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNywgMTksIDIxLCAyNH19OworY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMzJbXVsxNl0gPSB7CisgICAgezEwLCAxMiwgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI1LCAyNywgMjksIDMyfSwKKyAgICB7MiwgNCwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTcsIDE5LCAyMSwgMjR9fTsKK2NvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzQwW11bMTZdID0geworICAgIHsxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDI0LCAyNiwgMjgsIDMwLCAzMn0sCisgICAgezUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE3LCAxOSwgMjEsIDIzLCAyNX19OworY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNDRbXVsxNl0gPSB7CisgICAgezgsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMSwgMjMsIDI1LCAyOCwgMzJ9LAorICAgIHsyLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTUsIDE3LCAxOSwgMjIsIDI2fX07Citjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV80OFtdWzE2XSA9IHsKKyAgICB7NywgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMjAsIDIyLCAyNCwgMjcsIDMxfSwKKyAgICB7MSwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTQsIDE2LCAxOCwgMjEsIDI1fX07Citjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV82NFtdWzE2XSA9IHsKKyAgICB7NiwgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOSwgMjEsIDIzLCAyNiwgMzB9LAorICAgIHsxLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxNCwgMTYsIDE4LCAyMSwgMjV9fTsKK2NvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzg4W11bMTZdID0geworICAgIHs1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE2LCAxOCwgMjAsIDIzLCAyNywgMzF9LAorICAgIHsyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDIwLCAyNCwgMjh9fTsKK2NvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzE5MlsxNl0gPSB7CisgICAgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDEyLCAxNCwgMTYsIDE5LCAyMywgMjd9OworY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMTc2WzE2XSA9IHsKKyAgICAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDIwLCAyNCwgMjh9OworY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMTI4WzE2XSA9IHsKKyAgICAxLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxNCwgMTYsIDE4LCAyMSwgMjV9OwogCisvL0B9CiAKIC8qIQogICBcbmFtZSAgIFdoaXRlbmluZwpAQCAtMTIyLDE2ICsxNjMsNyBAQAogLy9AewogLyohIEFzc2lnbm1lbnQgb2Ygd2hpdGVuaW5nIHR1bmluZyBkZXBlbmRpbmcgb24gdGhlIGNyb3Nzb3ZlciBmcmVxdWVuY3kgKi8KIGNvbnN0IFVTSE9SVCBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzSW5kZXhbTlVNX1dIRkFDVE9SX1RBQkxFX0VOVFJJRVNdID0gewotICAwLAotICA1MDAwLAotICA2MDAwLAotICA2NTAwLAotICA3MDAwLAotICA3NTAwLAotICA4MDAwLAotICA5MDAwLAotICAxMDAwMAotfTsKKyAgICAwLCA1MDAwLCA2MDAwLCA2NTAwLCA3MDAwLCA3NTAwLCA4MDAwLCA5MDAwLCAxMDAwMH07CiAKIC8qIQogICBcYnJpZWYgV2hpdGhlbmluZyBsZXZlbHMgdHVuaW5nIHRhYmxlCkBAIC0xNDIsMjMgKzE3NCwzMSBAQAogICBcbGkgIHRoZSBmaXJzdCBjb2xvdW1uIGNhbiBiZSBlbGltaW5hdGVkLgogCiAqLwotY29uc3QgRklYUF9EQkwgRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc1RhYmxlW05VTV9XSEZBQ1RPUl9UQUJMRV9FTlRSSUVTXVs2XSA9IHsKLSAgLyogT0ZGX0xFVkVMLCBUUkFOU0lUSU9OX0xFVkVMLCBMT1dfTEVWRUwsIE1JRF9MRVZFTCwgSElHSF9MRVZFTCAqLwotICB7ICBGTDJGWENPTlNUX0RCTCgwLjAwZiksIEZMMkZYQ09OU1RfREJMKDAuNmYpLCBGTDJGWENPTlNUX0RCTCgwLjc1ZiksIEZMMkZYQ09OU1RfREJMKDAuOTBmKSwgRkwyRlhDT05TVF9EQkwoMC45OGYpfSwgIC8qIDwgNTAwMCAqLwotICB7ICBGTDJGWENPTlNUX0RCTCgwLjAwZiksIEZMMkZYQ09OU1RfREJMKDAuNmYpLCBGTDJGWENPTlNUX0RCTCgwLjc1ZiksIEZMMkZYQ09OU1RfREJMKDAuOTBmKSwgRkwyRlhDT05TVF9EQkwoMC45OGYpfSwgIC8qIDUwMDAgPCA2MDAwICovCi0gIHsgIEZMMkZYQ09OU1RfREJMKDAuMDBmKSwgRkwyRlhDT05TVF9EQkwoMC42ZiksIEZMMkZYQ09OU1RfREJMKDAuNzVmKSwgRkwyRlhDT05TVF9EQkwoMC45MGYpLCBGTDJGWENPTlNUX0RCTCgwLjk4Zil9LCAgLyogNjAwMCA8IDY1MDAgKi8KLSAgeyAgRkwyRlhDT05TVF9EQkwoMC4wMGYpLCBGTDJGWENPTlNUX0RCTCgwLjZmKSwgRkwyRlhDT05TVF9EQkwoMC43NWYpLCBGTDJGWENPTlNUX0RCTCgwLjkwZiksIEZMMkZYQ09OU1RfREJMKDAuOThmKX0sICAvKiA2NTAwIDwgNzAwMCAqLwotICB7ICBGTDJGWENPTlNUX0RCTCgwLjAwZiksIEZMMkZYQ09OU1RfREJMKDAuNmYpLCBGTDJGWENPTlNUX0RCTCgwLjc1ZiksIEZMMkZYQ09OU1RfREJMKDAuOTBmKSwgRkwyRlhDT05TVF9EQkwoMC45OGYpfSwgIC8qIDcwMDAgPCA3NTAwICovCi0gIHsgIEZMMkZYQ09OU1RfREJMKDAuMDBmKSwgRkwyRlhDT05TVF9EQkwoMC42ZiksIEZMMkZYQ09OU1RfREJMKDAuNzVmKSwgRkwyRlhDT05TVF9EQkwoMC45MGYpLCBGTDJGWENPTlNUX0RCTCgwLjk4Zil9LCAgLyogNzUwMCA8IDgwMDAgKi8KLSAgeyAgRkwyRlhDT05TVF9EQkwoMC4wMGYpLCBGTDJGWENPTlNUX0RCTCgwLjZmKSwgRkwyRlhDT05TVF9EQkwoMC43NWYpLCBGTDJGWENPTlNUX0RCTCgwLjkwZiksIEZMMkZYQ09OU1RfREJMKDAuOThmKX0sICAvKiA4MDAwIDwgOTAwMCAqLwotICB7ICBGTDJGWENPTlNUX0RCTCgwLjAwZiksIEZMMkZYQ09OU1RfREJMKDAuNmYpLCBGTDJGWENPTlNUX0RCTCgwLjc1ZiksIEZMMkZYQ09OU1RfREJMKDAuOTBmKSwgRkwyRlhDT05TVF9EQkwoMC45OGYpfSwgIC8qIDkwMDAgPCAxMDAwMCAqLwotICB7ICBGTDJGWENPTlNUX0RCTCgwLjAwZiksIEZMMkZYQ09OU1RfREJMKDAuNmYpLCBGTDJGWENPTlNUX0RCTCgwLjc1ZiksIEZMMkZYQ09OU1RfREJMKDAuOTBmKSwgRkwyRlhDT05TVF9EQkwoMC45OGYpfSwgIC8qID4gMTAwMDAgKi8KK2NvbnN0IEZJWFBfREJMCisgICAgRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc1RhYmxlW05VTV9XSEZBQ1RPUl9UQUJMRV9FTlRSSUVTXVs2XSA9IHsKKyAgICAgICAgLyogT0ZGX0xFVkVMLCBUUkFOU0lUSU9OX0xFVkVMLCBMT1dfTEVWRUwsIE1JRF9MRVZFTCwgSElHSF9MRVZFTCAqLworICAgICAgICB7RkwyRlhDT05TVF9EQkwoMC4wMGYpLCBGTDJGWENPTlNUX0RCTCgwLjZmKSwgRkwyRlhDT05TVF9EQkwoMC43NWYpLAorICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC45MGYpLCBGTDJGWENPTlNUX0RCTCgwLjk4Zil9LCAvKiA8IDUwMDAgKi8KKyAgICAgICAge0ZMMkZYQ09OU1RfREJMKDAuMDBmKSwgRkwyRlhDT05TVF9EQkwoMC42ZiksIEZMMkZYQ09OU1RfREJMKDAuNzVmKSwKKyAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuOTBmKSwgRkwyRlhDT05TVF9EQkwoMC45OGYpfSwgLyogNTAwMCA8IDYwMDAgKi8KKyAgICAgICAge0ZMMkZYQ09OU1RfREJMKDAuMDBmKSwgRkwyRlhDT05TVF9EQkwoMC42ZiksIEZMMkZYQ09OU1RfREJMKDAuNzVmKSwKKyAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuOTBmKSwgRkwyRlhDT05TVF9EQkwoMC45OGYpfSwgLyogNjAwMCA8IDY1MDAgKi8KKyAgICAgICAge0ZMMkZYQ09OU1RfREJMKDAuMDBmKSwgRkwyRlhDT05TVF9EQkwoMC42ZiksIEZMMkZYQ09OU1RfREJMKDAuNzVmKSwKKyAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuOTBmKSwgRkwyRlhDT05TVF9EQkwoMC45OGYpfSwgLyogNjUwMCA8IDcwMDAgKi8KKyAgICAgICAge0ZMMkZYQ09OU1RfREJMKDAuMDBmKSwgRkwyRlhDT05TVF9EQkwoMC42ZiksIEZMMkZYQ09OU1RfREJMKDAuNzVmKSwKKyAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuOTBmKSwgRkwyRlhDT05TVF9EQkwoMC45OGYpfSwgLyogNzAwMCA8IDc1MDAgKi8KKyAgICAgICAge0ZMMkZYQ09OU1RfREJMKDAuMDBmKSwgRkwyRlhDT05TVF9EQkwoMC42ZiksIEZMMkZYQ09OU1RfREJMKDAuNzVmKSwKKyAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuOTBmKSwgRkwyRlhDT05TVF9EQkwoMC45OGYpfSwgLyogNzUwMCA8IDgwMDAgKi8KKyAgICAgICAge0ZMMkZYQ09OU1RfREJMKDAuMDBmKSwgRkwyRlhDT05TVF9EQkwoMC42ZiksIEZMMkZYQ09OU1RfREJMKDAuNzVmKSwKKyAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuOTBmKSwgRkwyRlhDT05TVF9EQkwoMC45OGYpfSwgLyogODAwMCA8IDkwMDAgKi8KKyAgICAgICAge0ZMMkZYQ09OU1RfREJMKDAuMDBmKSwgRkwyRlhDT05TVF9EQkwoMC42ZiksIEZMMkZYQ09OU1RfREJMKDAuNzVmKSwKKyAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuOTBmKSwgRkwyRlhDT05TVF9EQkwoMC45OGYpfSwgLyogOTAwMCA8IDEwMDAwICovCisgICAgICAgIHtGTDJGWENPTlNUX0RCTCgwLjAwZiksIEZMMkZYQ09OU1RfREJMKDAuNmYpLCBGTDJGWENPTlNUX0RCTCgwLjc1ZiksCisgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjkwZiksIEZMMkZYQ09OU1RfREJMKDAuOThmKX0sIC8qID4gMTAwMDAgKi8KIH07CiAKLQogLy9AfQogCi0KIC8qIQogICBcbmFtZSAgIEVudkFkagogICBcYnJpZWYgIENvbnN0YW50cyBhbmQgdGFibGVzIHVzZWQgZm9yIGVudmVsb3BlIGFkanVzdG1lbnQKQEAgLTE2Niw1NjUgKzIwNiwxMDY1IEBACiAvL0B7CiAKIC8qISBNYW50aXNzYXMgb2YgZ2FpbiBsaW1pdHMgKi8KLWNvbnN0IEZJWFBfU0dMIEZES19zYnJEZWNvZGVyX3Nicl9saW1HYWluc19tWzRdID0KLXsKLSAgRkwyRlhDT05TVF9TR0woMC41MDExOTMyMDI1ZiksICAgLyohPCAtMyBkQi4gR2FpbiBsaW1pdCB3aGVuIGxpbWl0ZXJHYWlucyBpbiBmcmFtZURhdGEgaXMgMCAqLwotICBGTDJGWENPTlNUX1NHTCgwLjVmKSwgICAgICAgICAgICAvKiE8IDAgZEIuICBHYWluIGxpbWl0IHdoZW4gbGltaXRlckdhaW5zIGluIGZyYW1lRGF0YSBpcyAxICovCi0gIEZMMkZYQ09OU1RfU0dMKDAuOTk3NjM0NjI1OGYpLCAgIC8qITwgKzMgZEIuIEdhaW4gbGltaXQgd2hlbiBsaW1pdGVyR2FpbnMgaW4gZnJhbWVEYXRhIGlzIDIgKi8KLSAgRkwyRlhDT05TVF9TR0woMC42Nzc2MjYzNTc4ZikgICAgLyohPCBJbmYuICAgR2FpbiBsaW1pdCB3aGVuIGxpbWl0ZXJHYWlucyBpbiBmcmFtZURhdGEgaXMgMyAqLworY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX2xpbUdhaW5zX21bNF0gPSB7CisgICAgRkwyRlhDT05TVF9TR0woMC41MDExOTMyMDI1ZiksIC8qITwgLTMgZEIuIEdhaW4gbGltaXQgd2hlbiBsaW1pdGVyR2FpbnMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVEYXRhIGlzIDAgKi8KKyAgICBGTDJGWENPTlNUX1NHTCgKKyAgICAgICAgMC41ZiksIC8qITwgMCBkQi4gIEdhaW4gbGltaXQgd2hlbiBsaW1pdGVyR2FpbnMgaW4gZnJhbWVEYXRhIGlzIDEgKi8KKyAgICBGTDJGWENPTlNUX1NHTCgwLjk5NzYzNDYyNThmKSwgLyohPCArMyBkQi4gR2FpbiBsaW1pdCB3aGVuIGxpbWl0ZXJHYWlucyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZURhdGEgaXMgMiAqLworICAgIEZMMkZYQ09OU1RfU0dMKDAuNjc3NjI2MzU3OGYpICAvKiE8IEluZi4gICBHYWluIGxpbWl0IHdoZW4gbGltaXRlckdhaW5zIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRGF0YSBpcyAzICovCiB9OwogCiAvKiEgRXhwb25lbnRzIG9mIGdhaW4gbGltaXRzICovCi1jb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfbGltR2FpbnNfZVs0XSA9Ci17Ci0gIDAsIDEsIDEsIDY3Ci19OworY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX2xpbUdhaW5zX2VbNF0gPSB7MCwgMSwgMSwgNjd9OwogCiAvKiEgQ29uc3RhbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgbnVtYmVyIG9mIGxpbWl0ZXIgYmFuZHMgKi8KLWNvbnN0IEZJWFBfU0dMIEZES19zYnJEZWNvZGVyX3Nicl9saW1pdGVyQmFuZHNQZXJPY3RhdmVEaXY0WzRdID0KLXsKLSAgRkwyRlhDT05TVF9TR0woMS4wZiAvIDQuMGYpLAotICBGTDJGWENPTlNUX1NHTCgxLjJmIC8gNC4wZiksCi0gIEZMMkZYQ09OU1RfU0dMKDIuMGYgLyA0LjBmKSwKLSAgRkwyRlhDT05TVF9TR0woMy4wZiAvIDQuMGYpCi19OworY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX2xpbWl0ZXJCYW5kc1Blck9jdGF2ZURpdjRbNF0gPSB7CisgICAgRkwyRlhDT05TVF9TR0woMS4wZiAvIDQuMGYpLCBGTDJGWENPTlNUX1NHTCgxLjJmIC8gNC4wZiksCisgICAgRkwyRlhDT05TVF9TR0woMi4wZiAvIDQuMGYpLCBGTDJGWENPTlNUX1NHTCgzLjBmIC8gNC4wZil9OwogCiAvKiEgQ29uc3RhbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgbnVtYmVyIG9mIGxpbWl0ZXIgYmFuZHMgKi8KLWNvbnN0IEZJWFBfREJMIEZES19zYnJEZWNvZGVyX3Nicl9saW1pdGVyQmFuZHNQZXJPY3RhdmVEaXY0X0RCTFs0XSA9Ci17Ci0gIEZMMkZYQ09OU1RfREJMKDEuMGYgLyA0LjBmKSwKLSAgRkwyRlhDT05TVF9EQkwoMS4yZiAvIDQuMGYpLAotICBGTDJGWENPTlNUX0RCTCgyLjBmIC8gNC4wZiksCi0gIEZMMkZYQ09OU1RfREJMKDMuMGYgLyA0LjBmKQotfTsKK2NvbnN0IEZJWFBfREJMIEZES19zYnJEZWNvZGVyX3Nicl9saW1pdGVyQmFuZHNQZXJPY3RhdmVEaXY0X0RCTFs0XSA9IHsKKyAgICBGTDJGWENPTlNUX0RCTCgxLjBmIC8gNC4wZiksIEZMMkZYQ09OU1RfREJMKDEuMmYgLyA0LjBmKSwKKyAgICBGTDJGWENPTlNUX0RCTCgyLjBmIC8gNC4wZiksIEZMMkZYQ09OU1RfREJMKDMuMGYgLyA0LjBmKX07CiAKLS8qISBSYXRpbyBvZiBvbGQgZ2FpbnMgYW5kIG5vaXNlIGxldmVscyBmb3IgdGhlIGZpcnN0IDQgdGltZXNsb3RzIG9mIGFuIGVudmVsb3BlICovCisvKiEgUmF0aW8gb2Ygb2xkIGdhaW5zIGFuZCBub2lzZSBsZXZlbHMgZm9yIHRoZSBmaXJzdCA0IHRpbWVzbG90cyBvZiBhbiBlbnZlbG9wZQorICovCiBjb25zdCBGSVhQX1NHTCBGREtfc2JyRGVjb2Rlcl9zYnJfc21vb3RoRmlsdGVyWzRdID0gewotICBGTDJGWENPTlNUX1NHTCgwLjY2NjY2NjY2NjY2NjY2ZiksCi0gIEZMMkZYQ09OU1RfU0dMKDAuMzY1MTYzODM0MjcwODRmKSwKLSAgRkwyRlhDT05TVF9TR0woMC4xNDY5OTQzMzUyMDgzNWYpLAotICBGTDJGWENPTlNUX1NHTCgwLjAzMTgzMDUwMDkzNzUxZikKLX07Ci0KKyAgICBGTDJGWENPTlNUX1NHTCgwLjY2NjY2NjY2NjY2NjY2ZiksIEZMMkZYQ09OU1RfU0dMKDAuMzY1MTYzODM0MjcwODRmKSwKKyAgICBGTDJGWENPTlNUX1NHTCgwLjE0Njk5NDMzNTIwODM1ZiksIEZMMkZYQ09OU1RfU0dMKDAuMDMxODMwNTAwOTM3NTFmKX07CiAKIC8qISBSZWFsIGFuZCBpbWFnaW5hcnkgcGFydCBvZiByYW5kb20gbm9pc2Ugd2hpY2ggd2lsbCBiZSBtb2R1bGF0ZWQKICAgdG8gdGhlIGRlc2lyZWQgbGV2ZWwuIEFuIGFjY3VyYWN5IG9mIDEzIGJpdHMgaXMgc3VmZmljaWVudCBmb3IgdGhlc2UKICAgcmFuZG9tIG51bWJlcnMuCiAqLwogY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW1NCUl9ORl9OT19SQU5ET01fVkFMXVsyXSA9IHsKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTk0ODE1MzI3ODI5NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC41OTQ4MzQxNzUxNjYwN2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTcxMTM0NTQzOTM5OTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNjc1Mjg1MTUyMjU2NDdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjE0MTMwMDUxNzU4NDg3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk1MDkwOTgzNTc1Njg5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC40NzAwNTQ5NjcwMTY5N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zNzM0MDU0OTcyODY0N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODA3MDUwNjM3NjkzNTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMjk2NTM2NjgyODQ0MDhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjM4OTgxNDc4ODk2OTI2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg5NTcyNjA1NzE3MDg3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4wMTA1MzA0OTg2MjAyMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC42Njk1OTA1ODAzNjE2NmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTEyNjYzNjc5NTcyOTNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTE1MjI5MzgxNDAwMzRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjU0ODQwNDIyOTEwMzA5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjc1MjIxMzY3MTc2MzAyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC40MDAwOTI1Mjg2Nzk1NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45ODkyOTQwMDMzNDQyMWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTk4Njc5NzQ3MTE4NTVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODgxNDcwNjg2NDUzNThmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk1NTMxMDc2ODA1MDQwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjkwOTA4NzU3MTU0NTkzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC40NTcyNTkzMzMxNzE0NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC41NjcxNjMyMzY0Njc2MGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzI5Mjk2NzUwMjkyNzVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTgwMDgyNzI3MjczMjRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjc1NjIyODAxMzk5MDM2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjIwOTUwMzI5OTk1NTQ5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4wNzA2OTQ0MjYwMTA1MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43ODI0Nzg5ODQ3MDcwNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNzQ0OTYyNTI5MjYwNTVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTExNjkwMDQ0NDU4MDdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk2NDQwMTgyNzAzODU2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk0NzM5OTE4Mjk2NjIyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4zMDQyNDYyOTM2OTUzOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC40OTQzODI2NzAxMjQ3OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNjY1NjUwMzM3NDY5MjVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjQ2NTI5MzU1NDI0OTFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkxNjk3MDA4MDIwNTk0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjE3NTE0MDk3MzMyMDA5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43MDc3NDkxODc2MDQyN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41MjU0ODY1MzQxNjU0M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzAwNTE0MTUzNDU1NjBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNDUzNDAwMjg4MDg3NjNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5NDk2NTEzMDU0Nzk3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkwMDcxOTA4MDY2OTczZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45ODE2NDQ5MDc5MDEyM2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43NzQ2MzE1NTUyODY5N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNTQ2NzE1ODA1NDgxODFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMDI1NzA5Mjg1MzYwMDRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjAxNjg5NjI5MDY1Mzg5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjAwMjg3NTA2NDQ1NzMyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44NjExMDM0OTUzMTk4NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC40MjU0ODU4MzcyNjQ3N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTg4OTI5ODA1ODYwMzJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODc4ODExMzIyNjc1NTZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjUxNzU2NjI3Njc4NjkxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjY2OTI2Nzg0NzEwMTM5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTYzNTAyNjQwOTY0MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC41ODEwNzczMDU3NDc2NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTk5NjkzNzA4NjIxNjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTgzNjk5ODkzNjAyNTBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjU1MjY2MjU4NjI3MTk0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjU5NDQ5MDU3NDY1NTkxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4zNDU4MTE3Nzc0MTY3M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NDg3OTQyMTA2MTg2NmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNjI2NjQyMDk1Nzc5OTlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzQ0MDI5NzA5MDY0NzFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjc3MTQ5NzAxNDA0OTczZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjMzODgzNjU4MDQyODAxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45MTU5MjI0NDI1NDQzMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wMzY4NzkwMTM3NjcxM2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzYyODU0OTIzNTc4ODdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTEzNzE4Njc5MTkxMjRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjc5Nzg4MzM3MTk1MzMxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkzMTgwOTcxMTk5ODQ5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC41NDQ3MzA4MDYxMDIwMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4xMTkxOTIwNjAzNzE4NmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODU2MzkyODE2NzEwNThmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDI0Mjk4NTQ3NjA0NTFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjkyODgyNDAyOTcxNDIzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjI3ODcxODA5MDc4NjA5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4xMTcwODM3MTA0Njc3NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45OTgwMDg0MzQ0NDk2NmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMjEzNTY3NDk4MTc0OTNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTA3MTYyOTU2MjcwMzNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjc2MTkxNjkyNTczOTA5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk5NzY4MTE4MzU2MjY1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45ODExMTA0MzEwMDg4NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NTg1NDQ1OTczNDQwN2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODU5MTMyNjk4OTU1NzJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTU3NjY1NjYxNjg4ODBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjkzMzA3MjQyMjUzNjkyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQ5NDMxNzU3Njk2NDY2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4zMDQ4NTc1NDg3OTYzMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43MDU0MDAzNDM1NzUyOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODUyODk2NTA5MjUxOTBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDY3NjYxMzE3OTEwNDRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkxMzI4MDgyNjE4MTI1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk5ODM5NTk3MzYxNzY5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4wNTg5MDE5OTkyNDE1NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC43MDc0MTgyNzgxOTQ5N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMjgzOTg2ODYxNTAxNDhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMzQ2MzM1NTU3MDIxODhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk1MjU4MTY0NTM5NjEyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjU0ODkzNDE2MDI2OTM5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43ODU2NjMyNDE2ODUwN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43NTU2ODU0MTA3OTY5MWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTU3ODk0OTU0NDc4NzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjA0MjMxOTQ2OTY5NjZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjgyNDExMTU4NzExMTk3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk2NjU0NjE4NDMyNTYyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42NTE4NTQ0NjczNTg4NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44ODczNDk5MDc3MzI4OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTM2NDM2MDMxMzQ2NjZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTk4NzA3OTA0NDIzODVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkxNDI3MTU5NTI5NjE4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk4MjkwNTA1NTQ0NDQ0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43MDM5NTY4NDAzNjg4NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41ODc5Njc5ODIyMTAzOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMDA1NjM3NzE5NjkzNjVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjE3NjgxOTY3MjcyNDRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjg5MDY1MDUxOTMxODk1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjUyNzgzMzUyNjk3NTg1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42ODY4MzcwNzcxMjc2MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44MDgwNjk0NDcxMDMzOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNzIxNjUzNDI1MTg3MThmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNjkyNTk4NTczNDk1NjRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjYyOTI4MjQ3NzMwNjY3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjEzNjI3MDM3NDA3MzM1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4yOTkzODQzNDA2NTUxNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC40NjA1MTMyOTY4MjI0NmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTE3ODE5NTg4NzkyODBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzQwMTI3MTY2ODQxODZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5Mjk4NzE3MDQzNjg4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQwODE2NjEwMDc1NjYxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC44MjM2ODI5ODYyMjc0OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43NDAzNjA0NzE5MDE3M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTg1MTI4MzMzODY4MzNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTk5NzIzMzA3MDk1OTRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk1OTE1MzY4MjQyMjU3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk5MjM3ODAwNDY2MDQwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4yMTQxMTEyNjU3Mjc5MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MzQyNDgxOTA1MjU0NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNjg4MjE0NzYxMDY4ODRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjY4OTIzMDYzMTU0NTdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkxODUxOTk3OTgyMzE3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjA5MzU4MjI4OTAxNzg1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45NjA2Mjc2OTU1OTEyN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4zNjA5OTA5NTEzMzczOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNTE2NDYxODQ5MjIyODdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzEzNzMzMzI4NzM5MTdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjYxMTMwNzIxMTM5NjY5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQ2OTUwMTQxMTc1OTE3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC40NzMzNjEyOTM3MTI5OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yNzMzMzE3ODI5NjE2MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTA5OTgzMDg3MDM1MTlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTY3MTU2NjI5MzgxMzJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQ0ODQ0Nzk5MTk0MzU3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk5MjExNTc0NjI4MzA2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC42NjYxNDg5MTA3OTA5MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NjU5MDE3NjE2OTEyMWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNzQ5MjIyMzkxMjkyMzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODk4Nzk4NTg4MjYwODdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5NTcxNTg4NTA2NDg1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjUyNzg1NTIxNDk0MzQ5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45NzQwMTA4MjQ3NzU2M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4xNjg1NTg3MDA3NTE5MGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNzI2ODM3NDc3MzM4NzlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNDgwNjA3NzQ0MzIyNTFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk1NDMyMTkzNDU3MTI4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjY4ODQ5NjAzNDA4NDQxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43Mjk2MjIwODQyNTE5MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43NjYwODQ0MzQyMDkxN2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODUzNTk0NzkyMzM1MzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODg3MzgxMjU5MDE1NzlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjgxNDEyNDMwMzM4NTM1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk3NDgwNzY4MDQ5NjM3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44NzkzMDc3MjM1Njc4NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC43NDc0ODMwNzY5MDQzNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzE1NzMzMzEwNjQ5NzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTg1NzA2MDgxNzg5MjNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjgzNTI0MzAwMDI4MjI4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjgzNzAyNTM3MDc1MTYzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC40ODA4NjA2NTYwMTQyM2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45ODg0ODUwNDkyMzUzMWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTcxMzkxMjg1NzQ3NzhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODAwOTM2MjExOTgyMzZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjUxOTkyODI1MzQ3ODk1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjgwMjQ3NjMxNDAwNTEwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4wMDg0ODU5MTE5NTMyNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43NjY3MDEyODAwMDQ4NmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzAyOTQzNzQzMDMwMzZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTUzNTk5MTA0NDU1NzdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk1ODk0NDI4MTY4MTQwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjQzMjY1NTA0MzQ0NzgzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45NzA3OTI1Mjk1MDMyMWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wOTMyNTg1NzIzODY4MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTI0MDQyOTM2NzA3OTdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODU1MDc3MDQwMjc4NTVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjY5NTA2NDY5NTAwNDUwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk4NjMzNDEyNjI1NDU5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4yNjU1OTIwMzYyMDAyNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC43MzMxNDMwNzk2NjUyNGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMjgwMzg0NDMzMzY5NDNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMTQ1Mzc5MTM2NTQ0MjdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjc0MTM4MTI0ODI1NTIzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk5MzEwMzM5ODA3NzYyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4wMTc1Mjc5NTk5NTQ0NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44MjYxNjYzNTI4NDE3OGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNTUxMjY3NzMwOTQ5MzBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTg4OTg1NDM4NjIxNTNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk3OTYwODk4ODUwOTk2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk0MDIxNDQ2NzUyODUxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTE5NjMwOTE0NjkzNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC42NzAxOTAxNzM1ODQ1NmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNjc2ODQ5MjgwODUyNjBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMTI2MzE0OTE2NDkzNzhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjA5MTQwMDM5NDY1NTAwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjIwNTM3NzMxNDUzMTA4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43MTY1ODk2NTc1MTk5NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45Nzc4ODIwMDM5MTIyNGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODEwMTQ2NDAwNzg5MjVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTM3MjI2NDgzNjI0NDNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQwNjE2OTkxNjcxMjA1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjI2NDY5MDA4NTk4NDQ5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42NzY4MDE4ODY4Mjk3MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NDUwMjA1MjMzNzY5NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODY4NDk3NzQzNDg3NDlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTgzMzM1OTg2NDc4OTlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5NTAwMzgxMjg0ODUxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjAyNjM0MTIyMDY4NTUwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC44NDMyOTE4OTM0MDY2N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4xMDQwNjk1NzQ2MjIxM2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMDkyMTU5Njg1MzE0NDZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjk1NDAwMTIxMDEyNTNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5OTU2MTczMzI3MjA2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjEyMzU4NTQyMDAxNDA0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43OTczMjc3OTQ3MzUzNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MTU4MjUyNDczNjE1OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTYzNDk5NzM2NDI0MDZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTY2NDA0NTgwNDEwMDBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjc5OTQyNzc4NDk2NTQ3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjY0MzIzOTAyODIyODU3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4xMTU2NjAzOTg1Mzg5NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4yODU4Nzg0NjI1MzcyNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMzk5MjI5NTQ1MTQ2NjJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTQxMjk2MDE2MTY5NjZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5MDg5MTk3NTY1OTg3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkyMDYyNjI1NTgxNTg3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4yODYzMTI4NTE3OTkwOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MTAzNTA0NzE0MzYwM2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODMzMDI3MjU2MDU2MDhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNjczMzA0MTA4OTIwODRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk1NDA0NDQzNDAyMDcyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQ5MTYyNzY1Mzk4NzQzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4wNjQ0OTg2MzU3OTQzNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wMzI1MDU2MDgxMzEzNWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTk1NzUwNTQ0ODYzMTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDIzODk3ODQ0Njk1MDdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjY1NTAxMTQyNzkwODQ3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjgyNTQ2MTE0NjU1NjI0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44MTI1NDQ0MTkwODg4N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC41MTYyNzIzNDY2MDYyOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTk2NDYzNjk0ODU0ODFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODQ0OTA1MzM1MjA3NTJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjAwMjg3ODQwNjAzMzQ4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjY0NzY4MjYxMTU4MTY2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC43MDE3Njk4OTQwODQ1NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yMDQ1MzAyODU3MzMyMmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTYzNjE4ODIyNzAxOTBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDA3MDY5NjcxNDA5ODlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjY4ODgzNzU4MTkyNDI2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjkxMzM4OTU4ODQwNzcyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4zNDg3NTU4NTUwMjIzOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC43MTQ3MjI5MDY5MzMwMGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTE5ODAwODEyNDMwODdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjY1MDc0NTU2NDQ5MTlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5MDA5MDQ4MzQzODgxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg1ODY4MDIxNjA0ODQ4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC42ODg2NTc5MTQ1ODM5NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41NTY2MDMxNjgwOTY3OGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTk0ODQ0MDIxMjkzNjhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjAwNTI1NTkyNTQ5MzRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk0MjE0NTExNDA4MDIzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk5Njk2NDI1MzY3NDYxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42NzQxNDYyNjc5MzU0NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC40OTU0ODIyMTE4MDA3OGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNDczMzkzNTM2ODQ2NjRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODU5MDQzMjg4MzQwNDdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjE0MzIzNjUxMzg3MzYwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk0MTQ1NTk4MjIyNDg4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4yOTI2ODI5MzU3NTY3MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wNTc1OTIyNDkyNzk1MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNDM3OTM4NjE0NTg3NTRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzg5MDQ5Njk4OTI3MjRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjM2MzQ1MTI2Mzc0NDQxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjY0ODc0NDM1MzU3MTYyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4wODc1MDYwNDY1NjgyNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NzY4Njk0NDM2MjUyN2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTY0OTUyNjc4MTI1MTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNTM5NjAzMDU5NDY1MTFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjU1NTI2OTQwNjU5OTQ3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjc4ODkxNTIzNzM0Nzc0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC43MzUzODIxNTc1MjYzMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NjQ1MjA3MjM3MzQwNGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMzA4ODk3NzM5MTk0MzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODA2NjQzODk3NzY4NjBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjAzNTc0OTk1NjI2MTk0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk3MzI1NjE2OTAwOTU5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45ODcyMDY4NDY2MDQ4OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC40ODQwOTEzMzY5MTk2MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODE2ODkyOTYyNzEyMDNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTA4Mjc3MDM2MjgyOThmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjY3ODY2ODYwMTE4MjE1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjgxMjg0NTAzODcwODU2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4xNTgwODU2OTczMjU4M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44NTI3OTU1NTAyNDM4MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODA3MjMzOTUxMTQzNzFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjQ3MTc0MTg1MTQ2MDVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQ3Nzg4NzU3MzI5MDM4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjQ2MzMzMTQ3ODM5Mjk1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45NjM2NzU1NDc2MzIwMWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4zODQ4Njc0OTMwMzI0MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTkxNDM4NzU3MTY4MThmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjQ5NDUyNzcyMzk4MDlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjgzMDgxODc2OTI1ODMzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk0NzgwODUxNDE0NzYzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC41ODc1MzE5MTkwNTM0MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wMTI5MDc3MjM4OTE2M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTU1MzgxMDgyMjA5NjBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODU1NTcwNTIwOTY1MzhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk2NDkwOTIwNDc2MjExZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjY0MDIwOTcwOTIzMTAyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45NzMyNzEwMTAyODUyMWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4xMjM3ODEyODEzMzExMGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTE0MDAzNjYwMjIxMjRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTc5NzI0NzEzNDY5MzBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5OTI1ODM3MzYzODI0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjcxMDg0ODQ3ODY0MDY3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44Njg3NTkwMzUwNzMxM2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yMDI5MTY5OTIwMzU2NGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMjYyNDAwMzQ3OTUxMjRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNjgyNjQ1NTQzNjkxMDhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjI0NjY0NDEyOTUzMzg4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg3NjQyMjczMTE1MTgzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4wMjQxNjI3NTgwNjg2OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4yNzE5MjkxNDI4ODkwNWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODIwNjg2MTk1OTA1MTVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODUwODc3ODc5OTQ0NzZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjg4NTQ3MzczNzYwNzU5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg5NjM2ODAyOTAxNDY5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4xODE3MzA3ODE1MjIyNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yNjE1MjE0NTE1NjgwMGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMDkzNTU0NzY1NTg1MzRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTQ4NDUxMjMwNDU2MDRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjU0NjY4NDE0MjI0MDkwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk1OTgwNzc0MDIwMjIxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4zNzA1MDk5MDYwNDA5MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC41OTkxMDE0MDM4MzE3MWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzAzNzM1OTQyNjI4OTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTEyMjc2NjU4MjcwODFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjM0NjAwNzg1ODc5NTk0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk5NDQxNDI2MTQ0MjAwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42ODc3NDQ4MTczMTAwOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zMDIzODgzNzk1NjI5OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMjY4NDMyOTEyNTEyMzRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODMxMTU2NjgwMDQzNjJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQ5MDcyMzM0NjEzMjQyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjQ1MzU5NzA4NzM3Nzc1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4zODk3NTk5MzA5Mzk3NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NTUxNTM1ODA5OTEyMWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTc3NTcxMjUyMjQxNTBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDUzMDU4OTQ1ODA2MDZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjE3MzI1NTUyODU5NjE2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkyNzcwNjcyMjUwNDk0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45OTk0ODAzNTAyNTc0NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41ODI4NTU0NTU2MzQyNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNjQ5NDYyNDY1Mjc0NThmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjg2NDU1MDcxMDQ5NjBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjEyMDE2OTIwNTc2NDM3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjU3MTQ3MzIyMTUzMzEyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC41ODk0NzQ1NjUxNzc1MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zNDg0NzEzMjQ1NDM4OGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNDE4MTUxNDA0NTQ0NjVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMTYyNzY0MjIzNTg4NjFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5ODg1NjUwMjA0ODg0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjExMTM2MDk1NDkwNDQ0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC41NjY0OTYxNDEyODM4NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MDQ5NDg2NjM2MTU4N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTQxMzgwMjEwMzIzMzBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMzUyODE5MTY3MzMwMThmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjc1NzI1MDc2NTM0NjQxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjUzNjUwNTQ5NjQwNTg3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4yMDU0MTk3MzY5MjYzMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NDQzNTE0NDM2OTkxOGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTk5ODAzNzEwMjMzNTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzk4MzU5MTM1NjU1OTlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjI5MDc4Mjc3NjA1Nzc1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjM1MzkzNzc3OTIxNTIwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42Mjg1ODc3MjEwMzAzMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4zODc2NTY5MzM4NzEwMmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNDM0NDA5MDQ0Njc2ODhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTg1NDYzMzA0NjMyMzJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk4Mjk4NTgzNzYyMzkwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjIxMDIxNTI0NjI1MjA5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4xOTUxMzAyOTE0NjkzNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NDIzOTgzMjI1MTg2N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTU0NzY2NjI0MDAxMDFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTgzNjQ1NTQxNzkxNDNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkzMzc5NjM1MzA0ODEwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjcwODgxOTk0NTgzNjgyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44NTIzNTQxMDU3MzMzNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4wODM0MjM0Nzk2NjQxMGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODY0MjUwOTMwMTEyNDVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNDU3OTUwMjUwMjk0NjZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjM4ODc5Nzc5MDU5MDQ1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk3Mjc0NDI5MzQ0NTkzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45MjA0NTEyNDczNTQ5NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC42MjQzMzY1MjUyNDIyMGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODkxNjI1MzIyNTE4NzhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTQ5NTA5NTU1NzA1NjNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjM2ODM0MzM2OTQ5MjUyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk2NDU4Mjk4MDIwOTc1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45Mzg5MTc2MDk4ODA0NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44OTk2ODM1Mzc0MDM4OGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTkyNjc2NTc1NjUwOTRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMDM3NTcwMzQzMTY5NThmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk0MDYzNDcxNjE0MTc2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQxMzMyMzM4NTM4OTYzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45OTc0MDIyNDExNzAxOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4xNjgzMDQ5NDk5NjM3MGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMzU4OTk0MTMxNzA1NTVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNDY2MzMyMjY2NDk2MTNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjA1MjM3MjM3Mjc0OTQ3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjI1NjQwMzYxNjAyNjYxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4zNjcwMzU4Mzk1NzQyNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zODY1MzI2NTY0MTg3NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTE2NTMxODAzNjc5MTNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMzA1ODc2Mjg3MjY1OTdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjY5MDAwODAzNDk5MzE2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjkwOTUyMTcxMzg2MTMyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4zODY1ODc1MTEzMzUyN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTUwMTU3MTIwODk4NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMjkyNTA4MTQwMjk4NTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMzc0NDQ5OTQzNDQ2MTVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjYwMTgyMjA0Njc3NjA4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg2Nzc5NjUxMDM2MTIzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45NzQxODU4ODE2MzIxN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NjQ2ODUyMzY2NjQ3NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODg0NjE1NzQwMDM5NjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTc1MDg0MDUyNzY0MTRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjA1MTk4OTMzMDU1MTYyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjIxMjY5NjYxNjY5OTY0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC41MzQ5OTYyMTk3OTcyMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NzI0MTU1MzczMTIzN2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNDk0Mjk1NjAyMjY0OTdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTgxODM4NjUyOTE5MDNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk4OTM1MTQyMzM5MTM5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjQwMjQ5MTU5MDA2OTMzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45ODA4MTM4MDA5MTEzMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43Mjg1Njg5NTUzNDA0MWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMjczMzgxNDg4MzU1MzJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTk5NTA5MjI0NDcyMDlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjA2MzEwODAyMzM4MzAyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjU0NTM5NTg3NTI5NjE4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4yMDQ2MTY3NzE5OTUzOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4xNDIwOTk3NzYyODQ4OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNjYyMjM4NDMxNDE2NDdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzI1Mjg1Nzk5NDAzMjZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjg0NzY0MzQ1NDgzNjY1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjAyMzcyMzE2ODAxMjYxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44OTAzOTg2MzQ4MzgxMWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44ODg2NjU4MTQ4NDYwMmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTU5MDMzMDg0Nzc5ODZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzY3NDQ5MjcxNzM4NzNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjczNTA0MTIzOTA5ODc5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjAzNzQ3MjAzMTczMTkyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4zMTc0NDQzNDk2NjA1NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zNjgzNDExMTg4MzY1MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMzQxMTA4Mjc1OTE2MjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDAyMTEyMjI4MDc2OTFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQ3ODAzODgzNzE0MTk5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjM5NDIzMjE5Nzg2Mjg4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45ODI5OTE5NTg3OTUxNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wMTk4OTc5MTM5MDA0N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMzA5NjMwNzMxMjk3NTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTgwNzY3MjA1OTkzMzZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5OTkyNTg4MjI5MDE4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjI2MjgxODcyMDk0Mjg5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45MzE0OTczMTA4MDc2N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45ODMxMzE2MjU3MDQ5MGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTk5MjM0NzIzMDI3NzNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODAxNDI5OTM3Njc1NTRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjI2MDI0MTY5NjMzNDE3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjc1OTk5NzU5ODU1NzUyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4zNTcxMjUxNDc0MzU2M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4xOTI5ODk2Mzc2ODU3NGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTk4OTkwODQ1MDk1MzBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzQ2NDUxNTY5OTI0OTNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjg2NTU3MTcxNTc5NDUyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjU1NTkzODY2Njk2Mjk5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4zMzQwODA0MjQzODc1MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44NjE4NTk1Mzg3NDcwOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTkwMTA3MzYzNzQ3MTZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDQ2MDIzOTc1NzY2MjNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjY2Njk0MjY5NjkxMTk1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkxNjQzNjExODEwMTQ4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC42NDAxNjc5MjA3OTQ4MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4xNTY0OTUzMDgzNjg1NmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTk1NzA1MzQ4MDQ4MzZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDU4NDQ1ODYwMzgxMTFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjYzNDMxNDY2OTQ3MzQwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjIxMDc5MTE2NDU5MjM0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4wNzcwNjg0NzAwNTkzMWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44OTU4MTQzNzEwMTMyOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTg1OTAwOTA1Nzc3MjRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODgyNDE3MjExMzM5ODFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjgwMDk5MzM1MjU0Njc4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjM2ODUxODk2NzEwODUzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC43ODM2ODEzMTM5MjY2NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC40NTUwNjk5OTgwMjU5N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMDg3MDc4MDY2NzE2OTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODA5Mzg5OTQ5MTg3NDVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjg2ODExODgzMDgwNzEyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjM5MzQ3MzA4NjU0NzA1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4zOTQ2NjUyOTc0MDM3NWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC42NjgwOTQzMjExNDQ1NmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTc4NzUzMjU2NDk2ODNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzI0Njc4NDA5Njc3NDZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk1MDM4NTYwMjg4ODY0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg5NTYzMjE5NTg3NjI1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4xNzAwNTIzOTQyNDIxMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41NDY4MzA1Mzk2MjY1OGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzY5MTA3OTIwMjY4NDhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTYyMjY2MTc1NDkyOThmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5NzQzMjgxMDE2ODQ2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQyNjk3MTU3MDM3NTY3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45NTQzNzM4MzU0OTk3M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NzAwMjMyNDEwOTk1MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTk1Nzg5MDUzNjU1NjlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNTQxMDY4MjYyNTczNTZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjI4MDU4MjU5ODI5OTkwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg1MzYxNDIwNjM0MDM2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC44NTI1NjUyNDQ3MDU3M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC42NDU2NzYwNzczNTU4OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNTA2MDg1NDAxMDUxMjhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNjU4NDYwMTU0ODAzMDBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk3MjEwNzM1MTgzMjQzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjIzMDk1MjEzMDY3NzkxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45NTQyNDA0ODIzNDQ0MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45OTI0MDE0NzA5MTIxOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTY5MjY1NzA1MjQwMjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzM3NzU2NTQ4OTY1NzRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjMwODcyMTYzMjE0NzI2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQxNTE0OTYwNTU2MTI2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4yNDUyMzgzOTU3MjYzOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC42MzIwNjYzMzM5NDgwN2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMzM4MTMyNjUwODYwMjRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMzg2NjE3Nzk0NDE4OTdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjA1ODI2ODI4NDIwMTQ2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjA2OTQwNzc0MTg4MDI5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4yMjg5ODQ2MTQ1NTA1NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NzA1NDg1MzMxNjMxNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMTg1MDk5MTUwMTk4ODFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDc1NjU3NjI4OTIwODRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjEwNDg4MjM4MDQ1MDA5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg3NzY5OTQ3NDAyMzk0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43MTg4NjU4NjE4MjAzN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC43ODAzMDk4MjQ4MDUzOGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTk3OTM4NzM3Mzg2NTRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTAwNDEzMTA0OTE0OTdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjU3NTYzMzA3NjI2MTIwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkxMDM0MzM3MzUyMDk3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4yODkwOTY0NjM4MzcxN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NjMwNzc4Mzk3MDUzNGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNDIxODg5OTgzMTI1MjBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDgxNDg2NTEyMzA0MzdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkzMzM1MDQ5NjgxMDQ3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjQzNTM3MDIzODgzNTg4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45NzA4NzM3NDQxODI2N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44NjYzNjQ0NTcxMTM2NGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMzY3MjI4NzEyODY5MjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjUyOTE2NTQxNzI5NjFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjgxMDkzMDI1NjY1Njk2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjA4Nzc4MzcwMjI5MzYzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4yNjI0MDYwMzA2MjIzN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45Mjc3NDA5NTM3OTA5OGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODM5OTY0OTc5ODQ2MDRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTU4Mzk4NDkxMzk2NDdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5OTA5NjE1NzIwMjI1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk2MDI0NjA1NzEzOTcwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC43NDY0OTQ2NDE1NTA2MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4xMjE0NDg5MzYwNjQ2MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzQ3NzQ1OTU1Njk4MDVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjY4OTgwNjIwMDg5NTlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk1NzgxNjY3NDY5NTY3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjc5MDQ3OTI3MDUyNjI4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45NTQ3MjMwODcxMzA5OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4wODU4ODc3NjAxOTU1MGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNDg3MDgzMzI3NDYyOTlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTk5OTkwNDE1Nzk0MzJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQ2MzMyMDM4MjQ3NDk3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjEwOTY0MTI2MTg1MDYzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43NjQ5NzAwNDk0MDE2MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44OTIxMDkyOTI0MjIzOGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNTczOTczODkzNjQzMzlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMzUyODk3MDMzNzM3NjBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjc1Mzc0MzE2OTc0NDk1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk2NzA1MjE0NjUxMzM1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC41OTE3NDM5NzY4NTcxNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44OTQwNTM3MDQyMjc1MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNzUwODc5MDY2OTE4OTBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjk2MTI2NzI5ODIzOTZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk4NjA3ODU3MzM2MjMwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjI1MDM0OTExNzMwMDIzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC40MDc2MTA1NjY0MDUwNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MDA0NTU3MzQ0NDY5NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNjY5MjkyNjY3NDA0NzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTg2Mjk0OTM0MDE3NDhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk3NDYzNjk1MjU3MzEwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjAwMTkwMjIzMzAxMzAxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45MDE0NTUwOTQwOTg1OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTc4MTM5MDM2NTQ0NmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODcyNTkyODkwNDgwNDNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTkyMzM1ODczNTM2NjZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjkxNTI5NDYxNDQ3NjkyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjE1Njk4NzA3NTM0MjA2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4wMzMwNTczODg0MDcwNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zNzIwNTI2Mjg1OTc2NGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMDcyMjMwNTEzNjgzMzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODg4MDUwMDE3MzM2MjZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5NDk4MDEyMTg4MzUzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk3MDk0MzU4MTEzMzg3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43NDkwNDkzOTUwMDUxOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTk4NTQ4MzY0MTUyMWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMDQ1ODUyMjg1NzQyMTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTk4MTIzMzc0NDQwODJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjg5MDU0OTU0MjU3OTkzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjMxNzkxOTEzMTg4MDY0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44Mzc4MjE0NDY1MTI1MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NzYzNzYzMjU0NzQ2NmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMzM0NTQ4MDQ5MzM4MDRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODYyMzE1MTY4MDA0MDhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5NzA3NTc5MzYyODI0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjkzMjM3OTkwMDc5NDQxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4yMjgyNzUyNzg0Mzk5NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4xODg3NDc1OTM5Nzk5N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNjcyNDgwNDYyODkxNDNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMDM2NDYyMTEzOTA1NjlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjA1MTQ2NTM4MTg3OTQ0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkyNTk5NzAwMTIwNjc5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45OTk0NzI5NTc0OTkwNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45MzYyNTIyOTcwNzkxMmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNjY5NTExMjQzOTAzNjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTg5MDU4MjU2MjM4OTNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5NjAyOTU2NTU5MTc5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjQ0NjU0NzE1NzU3Njg4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC44MjEwNDkwNTQ4MzU5MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTU0MDc0MTcyNDkyOGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTkxODY1MTA5ODg3ODJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzIwMjMwMDEzMTI5NDdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjY1Mjg0NTkyMzkyOTE4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjUyMTg2NzIzMjUzNjM3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45Mzg4NTQ0Mzc5ODE4OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43NDg5NTMxMjYxNTI1OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTY3MzUyNDg3MzgzODhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTA4OTE4MTY5Nzg2MjlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjIyMjI1OTY4ODQxMTE0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjU3MTI0MDI5NzgxMjI4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC40NDEzMjc4Mzc1MzQxNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MjY4ODg0MDY1OTI4MGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODU2OTQ5NzQyMTk1NzRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODg4NDQ1MzI3MTk4NDRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkxNzgzMDQyMDkxNzYyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjQ2MzU2ODkyMzgzOTcwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC43MjU1Njk3NDQxNTY5MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45OTg5OTU1NTc3MDc0N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTk3MTE1ODE4MzQ1MDhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTgyMTE1NjAxODA0MjZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjc3NjM4OTc2MzcxOTY2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk0MzIxODM0ODczODE5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4wNzcxNzMyNDI1MzkyNWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41ODYzODM5OTg1NjU5NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNTYwNDk4MjkxOTQxNjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODI1MjIzMDE1NjkwMzZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk4Mzk4ODkzNjM5OTg4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjM5NDY3NDQwNDIwNTY5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC40NzU0Njk0Njg0NDkzOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC42ODYxMzA0NDgzNjgxMWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNjU2NzUwODkzMTQ2MzFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMTgzMzE2MzcxMzQ4ODBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjAzMjczMzc1NDU3OTgwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjc0OTMzMTA5NTY0MTA4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4zODY4NDE0NDc4NDczOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41MTMzNzM0OTAzMDQwNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTczNDYyNjc5NDQ1NDVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTY1NDkzNjQzODQwOThmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjUzMjgyMTU2MDYxOTQyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkxNDIzMjY1MDkxMzU0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45OTgxNzMxMDczMTE3NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC42MTEzMzU3MjQ4MjE0OGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNTAyNTQ1MDA3NzI2MzVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODg4MjkzMzgxMzQyOTRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjAxOTk1ODczMjM4ODU1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg1MjIzNTE1MDk2NzY1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45OTkzMDM4MTk3MzgwNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NDU3ODg5NjI5NjY0OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODI5MDc3Njc2MDA3ODNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMDYzMjM0NDI1OTgxMjhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjU4NjYwNzA5NjY5NzI4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk2ODQwNzczODA2NTgyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4xNzU3MzczNjY2NzI2N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC40ODE2NjkyMDg1OTQ4NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODM0MzQyOTI0MDEzNDZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTMwMjM0NTA2NDY5OTdmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjA1OTQ2NDkxMzA3MDI1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjIwNTExMDQ3MDc0ODY2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC44MTUwNTQ4NDU3NDYwMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NDY4NTk0Nzg2MTM2OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNDQ5NzYzODA5NTQ4NjBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDA4OTQ1NzI2NzE1NDVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjg5NzQ2NDc0NjI1NjcxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk5ODQ2NTc4ODM4NTM3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4zOTY3NzI1NjEzMDc5MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43NDg1NDY2ODYwOTM1OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMDc1ODg5NDg1NjMwNzlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNzQwOTYyMTQwODQxNzBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjc2MzQzMTk4OTUxNDQ1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQxNzQ2NjI5NDIyNjM0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43NDQ5MDEwNDY5OTYyNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NDcyNTkxMTc0NDYxMGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNjQ4ODAxMTk3OTI3NTlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNDEzMzY2NjA4MzA1NzFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjYyMzE5NTM3NDYyNTQyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkzMDk4MzEzNTUyNTk5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC40MjIxNTgxNzU5NDgwN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4wNzcxMjc4NzM4NTIwOGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMDI3MDQ1NTQxNDE4ODVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMDU0MTc1MTgwNTM2NjZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjgwMDAxNzczNTY2ODE4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjkxNTQyMTk1MTQxMDM5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43OTM1MTgzMjM0ODgxNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zNjIwODg5Nzk4OTEzNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNjM4NzIzNTkxNTE2MzZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDgxMjgyNTI0OTM0NDRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjUyODkwNTIwOTYwMjk1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjYwMDQ4ODcyNDU1NTkyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC43NDIzODU1MjkxNDU4N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wNDQ5MTkxNTI5MTA0NGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTkwOTYxMzE0NDkyNTBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTk0NTExODI4NTQ0MDJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjgwNDEyMzI5NjQzMTA5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg4NTEzODE4MTk5NDU3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42NDYxMjYxNjEyOTczNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC43MjE5ODY3NDgwNDU0NGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMTE2NTc3NzA2NjMxOTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODM2NjI4MzM4MTUwNDFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk1MDUzMTgyNDg4MTAxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk2OTM5OTA1MTM4MDgyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC42MjIyODg3MjkyODYyMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44Mjc2NzI2Mjg0NjY2MWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMDMwMDQ0NzU3ODczMTZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTk3Mzg4OTYzMzMzODRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk3OTg3MjE0MzQxMDM0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjM2NTI2MTI5Njg2NDI1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTk4Njk4MDc0NjIwMGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zNjAyMTYxMDI5OTcxNWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODkxMTA2NDg1OTk4NzlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTc4OTQyNTAzNDMwNDRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjEwNDA3OTYwNTEwNTgyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjc3MzU3NzkzODExNjE5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45NTk2NDczNzgyMTcyOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zNTQzNTgxODI4NTUwMmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNTA4NDMyMzMxNTkxNjJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTYxMDc2OTEyNjYyMDVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjE3MDA2MzM0NjcwNjE1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjc2ODU0MDI1MzE0ODI5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4yNTg3MjY3NTA2MzM2MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTg5MzMwMzkzMzgxNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMDExMTU5OTg2ODE5MzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuOTg0OTYwMTk3NDI0NDRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjc5NTk4NzAyOTczMjYxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk3MTM4NDExMzE4ODk0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTI2NDcwODk0ODEwMWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45OTU0MjgyMjQwMjUzNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTk4Mjk2NjM3NTI4MThmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDE4NzcxMzg4MjQzMTFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjcwODAxMDE2NTQ4MTg0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjMzNjgwNjg1OTQ4MTE3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43MDQ2NzA1Nzc4NjgyNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45MzI3Mjc3NzUwMTg1N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTk4NDYwMjE5MDUyNTRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTg3MjU3NDYyNTQ0MzNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjYzMzY0OTY4NTM0NjUwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjE2NDczNTk0NDIzNzQ2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4xNjI1ODIxNzUwMDc5MmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NTkzOTEyNTQwMDgwMmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNDM2NDU1OTQzNjA2MzNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTQ4MDUwMzAxMTMyODRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk5ODQ4NDcxNzAyOTc2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk2MjQ1MTY2OTIzODA5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4xNjc5NjQ1ODk2ODk5OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45ODk4NzUxMTg5MDQ3MGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODc5NzkyMjU3NDUyMTNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzE3MjU3MjUwNDE2ODBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQ0MTgzMDk5MDIxNzg2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjkzNTY4OTc0NDk4NzYxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45MzMxMDE4MDEyNTUzMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45OTkxMzMwODA2ODI0NmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTM5NDE5MzE3ODIwMDJmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNTY0MDkzNzk2NDAzNTZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjg4NTkwMDAzMTg4Njc3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQ3NjI0NjAwNDkxMzgyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45OTk3MTQ2MzcwMzY5MWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44Mzg4OTk1NDI1MzQ2MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNzUzNzYzODU2Mzk5NzhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDA4MTQ2NDM0Mzg2MjVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjkzODg3Njg1NjE1ODc1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjExMjg0NTI4MjA0NjM2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC44NTEyNjQzNTc4MjMwOWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41MjM0OTI1MTU0MzU0N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMzk3MDE0MjE0NDYzODFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODE3Nzk2MzQxNzQzMTZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjM3MDI0NDY0MTg3NDM3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg3MDcxNjU2MjIyOTU5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4zNjAyNDgyODI0Mjg5NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4zNDY1NTczNTY0ODI4N2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTMzODg4MTI1NDkyMDlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODQ0NzY1NDEwOTY0MjlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjY1Mjk4ODA0NTUyMTE5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjE4NDM5NTc1NDUwOTIxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4xMTk2MDMxOTAwNjg0M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTg5OTM0Njc4MDE2OGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTQyOTI1NjU1NTMxNjBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODMxNjM5MDY1MTgyOTNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjc1MDgxMTQ1Mjg2OTQ4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjM1NTMzMjIzMTQyMjY1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC41NjcyMTk3OTc0ODM5NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yNDA3NjgzNjQxNDQ5OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNDY4NTc3NjY3NDYwMjlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMzAxNDAyMzM0NTcxOThmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk3MzEyMzEzOTIzNjM1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk5NTQ4MTkxNjMwMDMxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4zODI5OTk3NjU2NzAxN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45ODUxNjkwOTcxNTQyN2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNDEwMjU4MDAwMTk0NjNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDIxMTY3MzY5MzU3MzRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjA5NjM4MDYyMDA4MDQ4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjA0NDExOTg0MzgxNDU3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44NTI4MzI0OTI3NTM5N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45MTQ3NTU2MzkyMjQyMWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODg4NjY4MDg5NTgxMjRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTk3MzUyNjcwODMyMjZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjQ4MjAyNDI5NTM2OTg5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk2ODA1NjA4ODg0MTY0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4yNzU3MjU4MjQxNjU2N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41ODYzNDc1MzMzNTgzMmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNjU4ODkxMjk2NTkxNjhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTg4MzU2MzQxMzg1ODNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk4ODM4MDg2OTUzNzMyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk5OTk0MzQ5NjAwMjM2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4yMDY1MTM0OTYyMDY4OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41NDU5MzA0NDA2NjM1NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNjIxMjY0MTYzNTY5MjBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNTk4OTM2ODE3MDAzOTJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjIwMzIwMTA1NDEwNDM3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg2ODc5MTgwMzU1Mjg5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45Nzc5MDU0ODYwMDU4NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45NjI5MDgwNjk5OTI0MmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuMTExMTI1MzQ3MzUxMjZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMjE0ODQ3NjMzMTMzMDFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjQxMzY4MzM3MzE0MTgyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjI4MjE2ODM3NjgwMzY1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4yNDEzMzAzODk5Mjk2MGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC41MTI5NDM2MjYzMDIzOGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNjYzOTM0MTA2NzQ4ODVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMDgyNDk2Nzk2MjkwODFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjUzNjk3ODI5MTc4NzUyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk3NjQ5OTAzOTM2MjI4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45NzIyNDczNzg4OTM0OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4yMjA4MTMzMzU3OTgzN2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODczOTI0NzcxNDQ1NDlmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTI3OTYxNzM3NDAzNjFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjE5MDUwMzYxMDE1NzUzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjAxNjAyNjE1Mzg3MTk1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC40NjM1MzQ0MTIxMjcyNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NTI0OTA0MTUzOTAwNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMDcwNjQwOTYzMzkwMjFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTQ0Nzk4MDMyMDU4ODZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjkyNDQ0MDg1NDg0NDY2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjEwNDU3NTkwMTg3NDM2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44MzgyMjU5MzU3ODcyOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4wMTY5NTA0MzIwODg4NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNzUyMTQ2ODE4MTExNTBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTk5NTU2ODEwNDI2NjVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjQyMTAyOTk4ODI5MzM5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjk5NzIwOTQxOTk5Mzk0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC43MjA5NDc4NjIzNzY5NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4zNTAwODk2MTkzNDI1NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNzg4NDMzMTEwMTkyNTFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTI4NTEzOTg5NTgyNzFmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk3Mzk0MDI3ODk3NDQyZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjI2Njk1OTQ0MDg2NTYxZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45OTIwNjQ2MzQ3Nzk0NmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC41NzAxMDEyMDg0OTQyOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNzY3ODk2MDk0NjE3OTVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzY1MTkzNTY3MzA5NjZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjgyMDAyNDIxODM2NDA5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjczNTMwMTc5NTUzNzY3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC44MTkyNDk5MDAyNTcyNGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTY5ODQyNTI1MDU3OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMjY3MTk4NTA4NzMzNTdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjg5MDMzNjk3NzYxOTNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjQzMzExMjYwMzgwOTc1ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg1MzIxODE1OTQ3NDkwZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45OTE5NDk3OTY3MzgzNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45MTg3NjI0OTc2NjQyMmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODA2OTIwMDEyNDg0ODdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMzI2Mjc1NDA2NjMyMTRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQzMDgwMDAzNjQ5OTc2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjIxOTE5MDk1NjM2NjM4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC42NzcwOTQ5MTkzNzM1N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45NTQ3ODA3NTgyMjkwNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNTYxNTE3NzA1NjgzMTZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNzA2OTM4MTE3NDc3NzhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjEwODMxODYyODEwNzQ5ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjA4NjI4ODM3MTc0NTkyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45MTIyOTQxNzU0MDQzNmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC42NTk4NzM1MTQwODQxMGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNDg5NzI4OTM5MzIyNzRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNTYyODkyNDYzNjI2ODZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjg5MDMzNjU4Njg5Njk3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjcxNjU2NTYzOTg3MDgyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC42NTI2OTQ0NzQ3NTA5NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC42NTkxNjAwNDgzMzkzMmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNjc0Mzk0NzgxNDExMjFmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODE2ODQzODA4NDY3OTZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjQ3NzcwODMyNDE2OTczZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjE2Nzg5NTU2MjAzMDI1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45OTcxNTk3OTI2MDg3OGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45MzU2NTc4NDAwNzY0OGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuOTA4ODk1OTM2MDI1NDZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuNjIwMzQzOTcwNTQzODBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjA2NjE4NjIyNTQ4MTc3ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjIzODEyMjE3MjIxMzU5ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45OTQzMDI2NjkxOTcyOGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4xODgxMjU1NTMxNzU1M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTc2ODY0MDIzODE4NDNmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMjg2NjQ1MzQzNjY2MjBmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk0ODEzNjUwMjIxMjY4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjk3NTA2NjQwMDI3MTI4ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45NTQzNDQ5NzQ5Mjg1M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC43OTYwNzk3ODUwMTk4M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNDkxMDQ3ODMxMzcxNTBmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMzI4OTUyMTQzNTk2NjNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5ODgxMTc1MTIwNzUxZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjg4OTkzOTgzODMxMzU0ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC41MDQ0OTE2Njc2MDMwM2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC44NTk5NTA3MjQwODQzNGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNDcxNjI4OTEwNjUxMDhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTg2ODAyMDQwNDk1NjlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjYyMDgxNTgxMzYxODQwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjc1MDAwNjc2MjE4OTU2ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC40Mzg2NzAxNTI1MDgxMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45OTk5ODA2OTI0NDMyMmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTg2MzA1NjMyMzIwNzVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNTM1Nzg4OTk2MDA2NjJmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjYxNTEwMzYyMjc3Mzc0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjg5NTE1MDE5ODk5OTk3ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC4wMzg0MTUxNzYwMTg0M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC42OTg4ODgxNTY4MTE3OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMzAxMDIxNTczMDQ2NDRmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMDc2Njc4MDg5MjIyMDVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQxODgxMjg0MTgyNjgzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjAyMTg4MDk4OTIyMjgyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC44NjEzNTQ1NDk0MTIzN2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45ODk0NzQ4MDkwOTM1OWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNjcyMjY4NjEzOTM3ODhmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuMTM0OTQzODkwMTEwMTRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjcwNzM3Mzk4ODQyMDY4ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjc2NTQ3MzQ5MzI1OTkyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45NDA0NDk0NjY4Nzk2M2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC4wOTAyNjIwMTE1NzQxNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuODIzODYzNTI1MzQzMjdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDg5MjQ3Njg4MjM2NzZmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjMyMDcwNjY2Njk4NjU2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjUwMTQzNDIxOTA4NzUzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC41NzU5MzE2MzIyNDQ4N2YgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45ODk2NjQyMjkyMTUwOWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuMzYzMjYwMTg0MTk5NjVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuMDc0NDAyNDMxMjMyMjhmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5OTc5MDQ0Njc0MzUwZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjE0MTMwMjg3MzQ3NDA1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45MjM2NjAyMzMyNjkzMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC45Nzk3OTI5ODA2ODE4MGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woLTAuNDQ2MDcxNzg1MTg1OThmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuNTQyMzMyNTIwMTYzOTRmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjQ0MjI2ODAwOTMyOTU2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjcxMzI2NzU2NzQyNzUyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC4wMzY3MTkwNzE1ODMxMmYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC42MzYwNjM4OTM2NjY3NWYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuNTIxNzU0MjQ2ODIxOTVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuODUzOTY4MjY3MzU3MDVmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjk0NzAxMTM5NjkwOTU2ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKC0wLjAxODI2MzQ4MTk0MjU1ZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45ODc1OTYwNjk0NjA0OWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC44MjI4ODcxNDMwMzA3M2YgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuODc0MzQ3OTQ3NDM2MjVmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODkzOTk0OTU2NTU0MzNmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKC0wLjkzNDEyMDQxNzU4NzQ0ZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjQxMzc0MDUyMDI0MzYzZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCggMC45NjA2Mzk0MzMxNTUxMWYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCggMC45MzExNjcwOTU0MTI4MGYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTc1MzQyNTM0NTc4MzdmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woIDAuODYxNTA5MzA4MTI2ODlmIC8gOC4wKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCAwLjk5NjQyNDY2NTA0MTYzZiAvIDguMCksIEZMMkZYQ09OU1RfU0dMKCAwLjcwMTkwMDQzNDI3NTEyZiAvIDguMCkgfSwKLSAgeyBGTDJGWENPTlNUX1NHTCgtMC45NDcwNTA4OTY2NTk4NGYgLyA4LjApLCBGTDJGWENPTlNUX1NHTCgtMC4yOTU4MDA0MjgxNDMwNmYgLyA4LjApIH0sCi0gIHsgRkwyRlhDT05TVF9TR0woIDAuOTE1OTk4MDcwODczNzZmIC8gOC4wKSwgRkwyRlhDT05TVF9TR0woLTAuOTgxNDc4MzAzODU3ODFmIC8gOC4wKSB9Ci19OworICAgIHtGTDJGWENPTlNUX1NHTCgtMC45OTk0ODE1MzI3ODI5NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC41OTQ4MzQxNzUxNjYwN2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NzExMzQ1NDM5Mzk5MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC42NzUyODUxNTIyNTY0N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4xNDEzMDA1MTc1ODQ4N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45NTA5MDk4MzU3NTY4OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNDcwMDU0OTY3MDE2OTdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMzczNDA1NDk3Mjg2NDdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODA3MDUwNjM3NjkzNTFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4yOTY1MzY2ODI4NDQwOGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMzg5ODE0Nzg4OTY5MjZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44OTU3MjYwNTcxNzA4N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMDEwNTMwNDk4NjIwMjBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNjY5NTkwNTgwMzYxNjZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjkxMjY2MzY3OTU3MjkzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjExNTIyOTM4MTQwMDM0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjU0ODQwNDIyOTEwMzA5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNzUyMjEzNjcxNzYzMDJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNDAwMDkyNTI4Njc5NTVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTg5Mjk0MDAzMzQ0MjFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk5ODY3OTc0NzExODU1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjg4MTQ3MDY4NjQ1MzU4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45NTUzMTA3NjgwNTA0MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjkwOTA4NzU3MTU0NTkzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC40NTcyNTkzMzMxNzE0NGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC41NjcxNjMyMzY0Njc2MGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzI5Mjk2NzUwMjkyNzVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTgwMDgyNzI3MjczMjRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNzU2MjI4MDEzOTkwMzZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4yMDk1MDMyOTk5NTU0OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4wNzA2OTQ0MjYwMTA1MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC43ODI0Nzg5ODQ3MDcwNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC43NDQ5NjI1MjkyNjA1NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45MTE2OTAwNDQ0NTgwN2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTY0NDAxODI3MDM4NTZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTQ3Mzk5MTgyOTY2MjJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMzA0MjQ2MjkzNjk1MzlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNDk0MzgyNjcwMTI0NzlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNjY1NjUwMzM3NDY5MjVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC42NDY1MjkzNTU0MjQ5MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45MTY5NzAwODAyMDU5NGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjE3NTE0MDk3MzMyMDA5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43MDc3NDkxODc2MDQyN2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjUyNTQ4NjUzNDE2NTQzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43MDA1MTQxNTM0NTU2MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC40NTM0MDAyODgwODc2M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTk0OTY1MTMwNTQ3OTdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTAwNzE5MDgwNjY5NzNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTgxNjQ0OTA3OTAxMjNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNzc0NjMxNTU1Mjg2OTdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjU0NjcxNTgwNTQ4MTgxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjAyNTcwOTI4NTM2MDA0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4wMTY4OTYyOTA2NTM4OWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjAwMjg3NTA2NDQ1NzMyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44NjExMDM0OTUzMTk4NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjQyNTQ4NTgzNzI2NDc3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45ODg5Mjk4MDU4NjAzMmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44Nzg4MTEzMjI2NzU1NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC41MTc1NjYyNzY3ODY5MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjY2OTI2Nzg0NzEwMTM5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45OTYzNTAyNjQwOTY0MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC41ODEwNzczMDU3NDc2NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTk5NjkzNzA4NjIxNjNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45ODM2OTk4OTM2MDI1MGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC41NTI2NjI1ODYyNzE5NGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjU5NDQ5MDU3NDY1NTkxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjM0NTgxMTc3NzQxNjczZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTQ4Nzk0MjEwNjE4NjZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNjI2NjQyMDk1Nzc5OTlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNzQ0MDI5NzA5MDY0NzFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjc3MTQ5NzAxNDA0OTczZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjMzODgzNjU4MDQyODAxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45MTU5MjI0NDI1NDQzMmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjAzNjg3OTAxMzc2NzEzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43NjI4NTQ5MjM1Nzg4N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45MTM3MTg2NzkxOTEyNGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC43OTc4ODMzNzE5NTMzMWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45MzE4MDk3MTE5OTg0OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC41NDQ3MzA4MDYxMDIwMGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4xMTkxOTIwNjAzNzE4NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODU2MzkyODE2NzEwNThmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC40MjQyOTg1NDc2MDQ1MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTI4ODI0MDI5NzE0MjNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4yNzg3MTgwOTA3ODYwOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMTE3MDgzNzEwNDY3NzRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTk4MDA4NDM0NDQ5NjZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMjEzNTY3NDk4MTc0OTNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTA3MTYyOTU2MjcwMzNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjc2MTkxNjkyNTczOTA5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTk3NjgxMTgzNTYyNjVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTgxMTEwNDMxMDA4ODRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTU4NTQ0NTk3MzQ0MDdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjg1OTEzMjY5ODk1NTcyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTU3NjY1NjYxNjg4ODBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjkzMzA3MjQyMjUzNjkyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNDk0MzE3NTc2OTY0NjZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMzA0ODU3NTQ4Nzk2MzJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNzA1NDAwMzQzNTc1MjlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODUyODk2NTA5MjUxOTBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC40Njc2NjEzMTc5MTA0NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45MTMyODA4MjYxODEyNWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45OTgzOTU5NzM2MTc2OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMDU4OTAxOTk5MjQxNTRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC43MDc0MTgyNzgxOTQ5N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4yODM5ODY4NjE1MDE0OGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjM0NjMzNTU1NzAyMTg4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk1MjU4MTY0NTM5NjEyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjU0ODkzNDE2MDI2OTM5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43ODU2NjMyNDE2ODUwN2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC43NTU2ODU0MTA3OTY5MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTU3ODk0OTU0NDc4NzdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMjA0MjMxOTQ2OTY5NjZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODI0MTExNTg3MTExOTdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NjY1NDYxODQzMjU2MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjUxODU0NDY3MzU4ODVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODg3MzQ5OTA3NzMyODlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjkzNjQzNjAzMTM0NjY2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTk4NzA3OTA0NDIzODVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTE0MjcxNTk1Mjk2MThmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTgyOTA1MDU1NDQ0NDRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjcwMzk1Njg0MDM2ODg2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNTg3OTY3OTgyMjEwMzlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMDA1NjM3NzE5NjkzNjVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC42MTc2ODE5NjcyNzI0NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44OTA2NTA1MTkzMTg5NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjUyNzgzMzUyNjk3NTg1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC42ODY4MzcwNzcxMjc2MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjgwODA2OTQ0NzEwMzM5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjcyMTY1MzQyNTE4NzE4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjY5MjU5ODU3MzQ5NTY0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC42MjkyODI0NzczMDY2N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjEzNjI3MDM3NDA3MzM1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjI5OTM4NDM0MDY1NTE0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjQ2MDUxMzI5NjgyMjQ2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45MTc4MTk1ODg3OTI4MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC43NDAxMjcxNjY4NDE4NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTI5ODcxNzA0MzY4OGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjQwODE2NjEwMDc1NjYxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjgyMzY4Mjk4NjIyNzQ4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjc0MDM2MDQ3MTkwMTczZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45ODUxMjgzMzM4NjgzM2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45OTk3MjMzMDcwOTU5NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTU5MTUzNjgyNDIyNTdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTkyMzc4MDA0NjYwNDBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjIxNDExMTI2NTcyNzkwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjkzNDI0ODE5MDUyNTQ1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC42ODgyMTQ3NjEwNjg4NGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4yNjg5MjMwNjMxNTQ1N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45MTg1MTk5Nzk4MjMxN2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjA5MzU4MjI4OTAxNzg1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45NjA2Mjc2OTU1OTEyN2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjM2MDk5MDk1MTMzNzM5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjUxNjQ2MTg0OTIyMjg3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjcxMzczMzMyODczOTE3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjYxMTMwNzIxMTM5NjY5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNDY5NTAxNDExNzU5MTdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNDczMzYxMjkzNzEyOTlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMjczMzMxNzgyOTYxNjJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTA5OTgzMDg3MDM1MTlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NjcxNTY2MjkzODEzMmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC40NDg0NDc5OTE5NDM1N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk5MjExNTc0NjI4MzA2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjY2NjE0ODkxMDc5MDkyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTY1OTAxNzYxNjkxMjFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNzQ5MjIyMzkxMjkyMzdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODk4Nzk4NTg4MjYwODdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk5NTcxNTg4NTA2NDg1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNTI3ODU1MjE0OTQzNDlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTc0MDEwODI0Nzc1NjNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMTY4NTU4NzAwNzUxOTBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNzI2ODM3NDc3MzM4NzlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNDgwNjA3NzQ0MzIyNTFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTU0MzIxOTM0NTcxMjhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC42ODg0OTYwMzQwODQ0MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzI5NjIyMDg0MjUxOTFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNzY2MDg0NDM0MjA5MTdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjg1MzU5NDc5MjMzNTM3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuODg3MzgxMjU5MDE1NzlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjgxNDEyNDMwMzM4NTM1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk3NDgwNzY4MDQ5NjM3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44NzkzMDc3MjM1Njc4NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjc0NzQ4MzA3NjkwNDM2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43MTU3MzMzMTA2NDk3N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45ODU3MDYwODE3ODkyM2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44MzUyNDMwMDAyODIyOGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjgzNzAyNTM3MDc1MTYzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC40ODA4NjA2NTYwMTQyM2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45ODg0ODUwNDkyMzUzMWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NzEzOTEyODU3NDc3OGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjgwMDkzNjIxMTk4MjM2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjUxOTkyODI1MzQ3ODk1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuODAyNDc2MzE0MDA1MTBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjAwODQ4NTkxMTk1MzI1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjc2NjcwMTI4MDAwNDg2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43MDI5NDM3NDMwMzAzNmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjU1MzU5OTEwNDQ1NTc3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45NTg5NDQyODE2ODE0MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC40MzI2NTUwNDM0NDc4M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NzA3OTI1Mjk1MDMyMWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjA5MzI1ODU3MjM4NjgyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45MjQwNDI5MzY3MDc5N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjg1NTA3NzA0MDI3ODU1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC42OTUwNjQ2OTUwMDQ1MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk4NjMzNDEyNjI1NDU5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjI2NTU5MjAzNjIwMDI0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNzMzMTQzMDc5NjY1MjRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMjgwMzg0NDMzMzY5NDNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4xNDUzNzkxMzY1NDQyN2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzQxMzgxMjQ4MjU1MjNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45OTMxMDMzOTgwNzc2MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMDE3NTI3OTU5OTU0NDRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODI2MTY2MzUyODQxNzhmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjU1MTI2NzczMDk0OTMwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk4ODk4NTQzODYyMTUzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk3OTYwODk4ODUwOTk2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk0MDIxNDQ2NzUyODUxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45OTE5NjMwOTE0NjkzNmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjY3MDE5MDE3MzU4NDU2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC42NzY4NDkyODA4NTI2MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjEyNjMxNDkxNjQ5Mzc4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjA5MTQwMDM5NDY1NTAwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjIwNTM3NzMxNDUzMTA4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43MTY1ODk2NTc1MTk5NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45Nzc4ODIwMDM5MTIyNGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44MTAxNDY0MDA3ODkyNWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjUzNzIyNjQ4MzYyNDQzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjQwNjE2OTkxNjcxMjA1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjI2NDY5MDA4NTk4NDQ5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC42NzY4MDE4ODY4Mjk3MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk0NTAyMDUyMzM3Njk1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjg2ODQ5Nzc0MzQ4NzQ5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjE4MzMzNTk4NjQ3ODk5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45OTUwMDM4MTI4NDg1MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4wMjYzNDEyMjA2ODU1MGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44NDMyOTE4OTM0MDY2N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjEwNDA2OTU3NDYyMjEzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4wOTIxNTk2ODUzMTQ0NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjY5NTQwMDEyMTAxMjUzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk5OTU2MTczMzI3MjA2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjEyMzU4NTQyMDAxNDA0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43OTczMjc3OTQ3MzUzNWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45MTU4MjUyNDczNjE1OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NjM0OTk3MzY0MjQwNmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk2NjQwNDU4MDQxMDAwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43OTk0Mjc3ODQ5NjU0N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjY0MzIzOTAyODIyODU3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4xMTU2NjAzOTg1Mzg5NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjI4NTg3ODQ2MjUzNzI2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zOTkyMjk1NDUxNDY2MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk0MTI5NjAxNjE2OTY2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk5MDg5MTk3NTY1OTg3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjkyMDYyNjI1NTgxNTg3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjI4NjMxMjg1MTc5OTA5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjkxMDM1MDQ3MTQzNjAzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44MzMwMjcyNTYwNTYwOGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC42NzMzMDQxMDg5MjA4NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NTQwNDQ0MzQwMjA3MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjQ5MTYyNzY1Mzk4NzQzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4wNjQ0OTg2MzU3OTQzNGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjAzMjUwNTYwODEzMTM1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45OTU3NTA1NDQ4NjMxMWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjQyMzg5Nzg0NDY5NTA3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC42NTUwMTE0Mjc5MDg0N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjgyNTQ2MTE0NjU1NjI0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44MTI1NDQ0MTkwODg4N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC41MTYyNzIzNDY2MDYyOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTk2NDYzNjk0ODU0ODFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44NDQ5MDUzMzUyMDc1MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4wMDI4Nzg0MDYwMzM0OGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjY0NzY4MjYxMTU4MTY2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjcwMTc2OTg5NDA4NDU1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjIwNDUzMDI4NTczMzIyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk2MzYxODgyMjcwMTkwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNDA3MDY5NjcxNDA5ODlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjY4ODgzNzU4MTkyNDI2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTEzMzg5NTg4NDA3NzJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjM0ODc1NTg1NTAyMjM4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNzE0NzIyOTA2OTMzMDBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTE5ODAwODEyNDMwODdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC42NjUwNzQ1NTY0NDkxOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTkwMDkwNDgzNDM4ODFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44NTg2ODAyMTYwNDg0OGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC42ODg2NTc5MTQ1ODM5NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjU1NjYwMzE2ODA5Njc4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45OTQ4NDQwMjEyOTM2OGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4yMDA1MjU1OTI1NDkzNGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NDIxNDUxMTQwODAyM2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45OTY5NjQyNTM2NzQ2MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjc0MTQ2MjY3OTM1NDRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC40OTU0ODIyMTE4MDA3OGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNDczMzkzNTM2ODQ2NjRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODU5MDQzMjg4MzQwNDdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMTQzMjM2NTEzODczNjBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTQxNDU1OTgyMjI0ODhmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjI5MjY4MjkzNTc1NjcyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMDU3NTkyMjQ5Mjc5NTJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNDM3OTM4NjE0NTg3NTRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNzg5MDQ5Njk4OTI3MjRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjM2MzQ1MTI2Mzc0NDQxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNjQ4NzQ0MzUzNTcxNjJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjA4NzUwNjA0NjU2ODI1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTc2ODY5NDQzNjI1MjdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk2NDk1MjY3ODEyNTExZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjUzOTYwMzA1OTQ2NTExZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjU1NTI2OTQwNjU5OTQ3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNzg4OTE1MjM3MzQ3NzRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNzM1MzgyMTU3NTI2MzBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NjQ1MjA3MjM3MzQwNGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMzA4ODk3NzM5MTk0MzdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODA2NjQzODk3NzY4NjBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMDM1NzQ5OTU2MjYxOTRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTczMjU2MTY5MDA5NTlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTg3MjA2ODQ2NjA0ODhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC40ODQwOTEzMzY5MTk2MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODE2ODkyOTYyNzEyMDNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTA4Mjc3MDM2MjgyOThmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNjc4NjY4NjAxMTgyMTVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44MTI4NDUwMzg3MDg1NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMTU4MDg1Njk3MzI1ODNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44NTI3OTU1NTAyNDM4MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44MDcyMzM5NTExNDM3MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4yNDcxNzQxODUxNDYwNWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC40Nzc4ODc1NzMyOTAzOGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC40NjMzMzE0NzgzOTI5NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NjM2NzU1NDc2MzIwMWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjM4NDg2NzQ5MzAzMjQyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45OTE0Mzg3NTcxNjgxOGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4yNDk0NTI3NzIzOTgwOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44MzA4MTg3NjkyNTgzM2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45NDc4MDg1MTQxNDc2M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNTg3NTMxOTE5MDUzNDFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4wMTI5MDc3MjM4OTE2M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NTUzODEwODIyMDk2MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44NTU1NzA1MjA5NjUzOGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTY0OTA5MjA0NzYyMTFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNjQwMjA5NzA5MjMxMDJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk3MzI3MTAxMDI4NTIxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMTIzNzgxMjgxMzMxMTBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTE0MDAzNjYwMjIxMjRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41Nzk3MjQ3MTM0NjkzMGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTk5MjU4MzczNjM4MjRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC43MTA4NDg0Nzg2NDA2N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODY4NzU5MDM1MDczMTNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMjAyOTE2OTkyMDM1NjRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjI2MjQwMDM0Nzk1MTI0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjY4MjY0NTU0MzY5MTA4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4yNDY2NDQxMjk1MzM4OGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44NzY0MjI3MzExNTE4M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4wMjQxNjI3NTgwNjg2OWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjI3MTkyOTE0Mjg4OTA1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjgyMDY4NjE5NTkwNTE1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjg1MDg3Nzg3OTk0NDc2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjg4NTQ3MzczNzYwNzU5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjg5NjM2ODAyOTAxNDY5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4xODE3MzA3ODE1MjIyNmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4yNjE1MjE0NTE1NjgwMGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4wOTM1NTQ3NjU1ODUzNGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjU0ODQ1MTIzMDQ1NjA0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC41NDY2ODQxNDIyNDA5MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk1OTgwNzc0MDIwMjIxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjM3MDUwOTkwNjA0MDkxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjU5OTEwMTQwMzgzMTcxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43MDM3MzU5NDI2Mjg5MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjkxMjI3NjY1ODI3MDgxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zNDYwMDc4NTg3OTU5NGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45OTQ0MTQyNjE0NDIwMGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjg3NzQ0ODE3MzEwMDhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMzAyMzg4Mzc5NTYyOTlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjI2ODQzMjkxMjUxMjM0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuODMxMTU2NjgwMDQzNjJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNDkwNzIzMzQ2MTMyNDJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNDUzNTk3MDg3Mzc3NzVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMzg5NzU5OTMwOTM5NzVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NTUxNTM1ODA5OTEyMWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTc3NTcxMjUyMjQxNTBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4wNTMwNTg5NDU4MDYwNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMTczMjU1NTI4NTk2MTZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTI3NzA2NzIyNTA0OTRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTk5NDgwMzUwMjU3NDRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41ODI4NTU0NTU2MzQyNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjQ5NDYyNDY1Mjc0NThmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC42ODY0NTUwNzEwNDk2MGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMTIwMTY5MjA1NzY0MzdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNTcxNDczMjIxNTMzMTJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjU4OTQ3NDU2NTE3NzUxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjM0ODQ3MTMyNDU0Mzg4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC40MTgxNTE0MDQ1NDQ2NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjE2Mjc2NDIyMzU4ODYxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk5ODg1NjUwMjA0ODg0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMTExMzYwOTU0OTA0NDRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjU2NjQ5NjE0MTI4Mzg2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjkwNDk0ODY2MzYxNTg3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk0MTM4MDIxMDMyMzMwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMzUyODE5MTY3MzMwMThmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjc1NzI1MDc2NTM0NjQxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNTM2NTA1NDk2NDA1ODdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMjA1NDE5NzM2OTI2MzBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTQ0MzUxNDQzNjk5MThmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTk5ODAzNzEwMjMzNTFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC43OTgzNTkxMzU2NTU5OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4yOTA3ODI3NzYwNTc3NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjM1MzkzNzc3OTIxNTIwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC42Mjg1ODc3MjEwMzAzMGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjM4NzY1NjkzMzg3MTAyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjQzNDQwOTA0NDY3Njg4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk4NTQ2MzMwNDYzMjMyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45ODI5ODU4Mzc2MjM5MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjIxMDIxNTI0NjI1MjA5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjE5NTEzMDI5MTQ2OTM0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk0MjM5ODMyMjUxODY3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45NTQ3NjY2MjQwMDEwMWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk4MzY0NTU0MTc5MTQzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjkzMzc5NjM1MzA0ODEwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjcwODgxOTk0NTgzNjgyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44NTIzNTQxMDU3MzMzNmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4wODM0MjM0Nzk2NjQxMGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODY0MjUwOTMwMTEyNDVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNDU3OTUwMjUwMjk0NjZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMzg4Nzk3NzkwNTkwNDVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NzI3NDQyOTM0NDU5M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45MjA0NTEyNDczNTQ5NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC42MjQzMzY1MjUyNDIyMGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44OTE2MjUzMjI1MTg3OGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjU0OTUwOTU1NTcwNTYzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zNjgzNDMzNjk0OTI1MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk2NDU4Mjk4MDIwOTc1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjkzODkxNzYwOTg4MDQ1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjg5OTY4MzUzNzQwMzg4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk5MjY3NjU3NTY1MDk0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjAzNzU3MDM0MzE2OTU4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45NDA2MzQ3MTYxNDE3NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjQxMzMyMzM4NTM4OTYzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk5NzQwMjI0MTE3MDE5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjE2ODMwNDk0OTk2MzcwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zNTg5OTQxMzE3MDU1NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC40NjYzMzIyNjY0OTYxM2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4wNTIzNzIzNzI3NDk0N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4yNTY0MDM2MTYwMjY2MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4zNjcwMzU4Mzk1NzQyNGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4zODY1MzI2NTY0MTg3NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45MTY1MzE4MDM2NzkxM2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4zMDU4NzYyODcyNjU5N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC42OTAwMDgwMzQ5OTMxNmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjkwOTUyMTcxMzg2MTMyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zODY1ODc1MTEzMzUyN2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk5NTAxNTcxMjA4OTg1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4yOTI1MDgxNDAyOTg1MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjM3NDQ0OTk0MzQ0NjE1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC42MDE4MjIwNDY3NzYwOGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjg2Nzc5NjUxMDM2MTIzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45NzQxODU4ODE2MzIxN2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk2NDY4NTIzNjY2NDc1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjg4NDYxNTc0MDAzOTYzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNTc1MDg0MDUyNzY0MTRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMDUxOTg5MzMwNTUxNjJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4yMTI2OTY2MTY2OTk2NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNTM0OTk2MjE5Nzk3MjBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NzI0MTU1MzczMTIzN2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNDk0Mjk1NjAyMjY0OTdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45ODE4Mzg2NTI5MTkwM2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTg5MzUxNDIzMzkxMzlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNDAyNDkxNTkwMDY5MzNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk4MDgxMzgwMDkxMTMwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjcyODU2ODk1NTM0MDQxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4yNzMzODE0ODgzNTUzMmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk5OTUwOTIyNDQ3MjA5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjA2MzEwODAyMzM4MzAyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjU0NTM5NTg3NTI5NjE4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4yMDQ2MTY3NzE5OTUzOWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4xNDIwOTk3NzYyODQ4OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC42NjIyMzg0MzE0MTY0N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjcyNTI4NTc5OTQwMzI2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44NDc2NDM0NTQ4MzY2NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjAyMzcyMzE2ODAxMjYxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44OTAzOTg2MzQ4MzgxMWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjg4ODY2NTgxNDg0NjAyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk1OTAzMzA4NDc3OTg2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNzY3NDQ5MjcxNzM4NzNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNzM1MDQxMjM5MDk4NzlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMDM3NDcyMDMxNzMxOTJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjMxNzQ0NDM0OTY2MDU2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjM2ODM0MTExODgzNjUyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zNDExMDgyNzU5MTYyM2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjQwMjExMjIyODA3NjkxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjQ3ODAzODgzNzE0MTk5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjM5NDIzMjE5Nzg2Mjg4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk4Mjk5MTk1ODc5NTE0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMDE5ODk3OTEzOTAwNDdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjMwOTYzMDczMTI5NzUxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjE4MDc2NzIwNTk5MzM2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk5OTkyNTg4MjI5MDE4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjI2MjgxODcyMDk0Mjg5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45MzE0OTczMTA4MDc2N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45ODMxMzE2MjU3MDQ5MGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTkyMzQ3MjMwMjc3M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44MDE0Mjk5Mzc2NzU1NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMjYwMjQxNjk2MzM0MTdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNzU5OTk3NTk4NTU3NTJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjM1NzEyNTE0NzQzNTYzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMTkyOTg5NjM3Njg1NzRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk5ODk5MDg0NTA5NTMwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNzQ2NDUxNTY5OTI0OTNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODY1NTcxNzE1Nzk0NTJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41NTU5Mzg2NjY5NjI5OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4zMzQwODA0MjQzODc1MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjg2MTg1OTUzODc0NzA5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk5MDEwNzM2Mzc0NzE2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMDQ2MDIzOTc1NzY2MjNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjY2Njk0MjY5NjkxMTk1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjkxNjQzNjExODEwMTQ4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjY0MDE2NzkyMDc5NDgwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMTU2NDk1MzA4MzY4NTZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTk1NzA1MzQ4MDQ4MzZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC40NTg0NDU4NjAzODExMWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjM0MzE0NjY5NDczNDBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4yMTA3OTExNjQ1OTIzNGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMDc3MDY4NDcwMDU5MzFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODk1ODE0MzcxMDEzMjlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTg1OTAwOTA1Nzc3MjRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44ODI0MTcyMTEzMzk4MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44MDA5OTMzNTI1NDY3OGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4zNjg1MTg5NjcxMDg1M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC43ODM2ODEzMTM5MjY2NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjQ1NTA2OTk5ODAyNTk3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjA4NzA3ODA2NjcxNjkxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuODA5Mzg5OTQ5MTg3NDVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjg2ODExODgzMDgwNzEyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMzkzNDczMDg2NTQ3MDVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjM5NDY2NTI5NzQwMzc1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjY2ODA5NDMyMTE0NDU2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk3ODc1MzI1NjQ5NjgzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjcyNDY3ODQwOTY3NzQ2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45NTAzODU2MDI4ODg2NGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjg5NTYzMjE5NTg3NjI1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjE3MDA1MjM5NDI0MjEyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNTQ2ODMwNTM5NjI2NThmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjc2OTEwNzkyMDI2ODQ4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk2MjI2NjE3NTQ5Mjk4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk5NzQzMjgxMDE2ODQ2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNDI2OTcxNTcwMzc1NjdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTU0MzczODM1NDk5NzNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NzAwMjMyNDEwOTk1MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTU3ODkwNTM2NTU2OWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC41NDEwNjgyNjI1NzM1NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4yODA1ODI1OTgyOTk5MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44NTM2MTQyMDYzNDAzNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44NTI1NjUyNDQ3MDU3M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC42NDU2NzYwNzczNTU4OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNTA2MDg1NDAxMDUxMjhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNjU4NDYwMTU0ODAzMDBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk3MjEwNzM1MTgzMjQzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjIzMDk1MjEzMDY3NzkxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk1NDI0MDQ4MjM0NDQxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk5MjQwMTQ3MDkxMjE5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45NjkyNjU3MDUyNDAyM2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjczNzc1NjU0ODk2NTc0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjMwODcyMTYzMjE0NzI2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNDE1MTQ5NjA1NTYxMjZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjI0NTIzODM5NTcyNjM5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNjMyMDY2MzMzOTQ4MDdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjMzODEzMjY1MDg2MDI0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjM4NjYxNzc5NDQxODk3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4wNTgyNjgyODQyMDE0NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4wNjk0MDc3NDE4ODAyOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMjI4OTg0NjE0NTUwNTRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NzA1NDg1MzMxNjMxNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMTg1MDk5MTUwMTk4ODFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC40NzU2NTc2Mjg5MjA4NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMTA0ODgyMzgwNDUwMDlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODc3Njk5NDc0MDIzOTRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjcxODg2NTg2MTgyMDM3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNzgwMzA5ODI0ODA1MzhmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTk3OTM4NzM3Mzg2NTRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45MDA0MTMxMDQ5MTQ5N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC41NzU2MzMwNzYyNjEyMGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45MTAzNDMzNzM1MjA5N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4yODkwOTY0NjM4MzcxN2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk2MzA3NzgzOTcwNTM0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjQyMTg4OTk4MzEyNTIwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNDgxNDg2NTEyMzA0MzdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTMzMzUwNDk2ODEwNDdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNDM1MzcwMjM4ODM1ODhmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk3MDg3Mzc0NDE4MjY3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuODY2MzY0NDU3MTEzNjRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMzY3MjI4NzEyODY5MjNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC42NTI5MTY1NDE3Mjk2MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODEwOTMwMjU2NjU2OTZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4wODc3ODM3MDIyOTM2M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMjYyNDA2MDMwNjIyMzdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTI3NzQwOTUzNzkwOThmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODM5OTY0OTc5ODQ2MDRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41NTgzOTg0OTEzOTY0N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTk5MDk2MTU3MjAyMjVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTYwMjQ2MDU3MTM5NzBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNzQ2NDk0NjQxNTUwNjFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4xMjE0NDg5MzYwNjQ2MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzQ3NzQ1OTU1Njk4MDVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMjY4OTgwNjIwMDg5NTlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTU3ODE2Njc0Njk1NjdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNzkwNDc5MjcwNTI2MjhmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTU0NzIzMDg3MTMwOTlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMDg1ODg3NzYwMTk1NTBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNDg3MDgzMzI3NDYyOTlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45OTk5OTA0MTU3OTQzMmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC40NjMzMjAzODI0NzQ5N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjEwOTY0MTI2MTg1MDYzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43NjQ5NzAwNDk0MDE2MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjg5MjEwOTI5MjQyMjM4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjU3Mzk3Mzg5MzY0MzM5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMzUyODk3MDMzNzM3NjBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNzUzNzQzMTY5NzQ0OTVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NjcwNTIxNDY1MTMzNWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNTkxNzQzOTc2ODU3MTRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODk0MDUzNzA0MjI3NTJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNzUwODc5MDY2OTE4OTBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMjk2MTI2NzI5ODIzOTZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk4NjA3ODU3MzM2MjMwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMjUwMzQ5MTE3MzAwMjNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjQwNzYxMDU2NjQwNTA1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjkwMDQ1NTczNDQ0Njk1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjY2OTI5MjY2NzQwNDc3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTg2Mjk0OTM0MDE3NDhmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk3NDYzNjk1MjU3MzEwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjAwMTkwMjIzMzAxMzAxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjkwMTQ1NTA5NDA5ODU5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTk3ODEzOTAzNjU0NDZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjg3MjU5Mjg5MDQ4MDQzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTkyMzM1ODczNTM2NjZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjkxNTI5NDYxNDQ3NjkyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjE1Njk4NzA3NTM0MjA2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4wMzMwNTczODg0MDcwNWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4zNzIwNTI2Mjg1OTc2NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4wNzIyMzA1MTM2ODMzN2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44ODgwNTAwMTczMzYyNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTQ5ODAxMjE4ODM1M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk3MDk0MzU4MTEzMzg3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43NDkwNDkzOTUwMDUxOWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk5OTg1NDgzNjQxNTIxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjA0NTg1MjI4NTc0MjExZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTk4MTIzMzc0NDQwODJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjg5MDU0OTU0MjU3OTkzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjMxNzkxOTEzMTg4MDY0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44Mzc4MjE0NDY1MTI1MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk3NjM3NjMyNTQ3NDY2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjMzNDU0ODA0OTMzODA0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjg2MjMxNTE2ODAwNDA4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45OTcwNzU3OTM2MjgyNGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjkzMjM3OTkwMDc5NDQxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4yMjgyNzUyNzg0Mzk5NGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjE4ODc0NzU5Mzk3OTk3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjY3MjQ4MDQ2Mjg5MTQzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjAzNjQ2MjExMzkwNTY5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4wNTE0NjUzODE4Nzk0NGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45MjU5OTcwMDEyMDY3OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTk0NzI5NTc0OTkwNWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjkzNjI1MjI5NzA3OTEyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjY2OTUxMTI0MzkwMzYzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTg5MDU4MjU2MjM4OTNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk5NjAyOTU2NTU5MTc5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjQ0NjU0NzE1NzU3Njg4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjgyMTA0OTA1NDgzNTkwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTk1NDA3NDE3MjQ5MjhmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTkxODY1MTA5ODg3ODJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC43MjAyMzAwMTMxMjk0N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjUyODQ1OTIzOTI5MThmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41MjE4NjcyMzI1MzYzN2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45Mzg4NTQ0Mzc5ODE4OGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC43NDg5NTMxMjYxNTI1OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NjczNTI0ODczODM4OGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjkwODkxODE2OTc4NjI5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4yMjIyNTk2ODg0MTExNGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjU3MTI0MDI5NzgxMjI4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC40NDEzMjc4Mzc1MzQxNGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45MjY4ODg0MDY1OTI4MGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODU2OTQ5NzQyMTk1NzRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44ODg0NDUzMjcxOTg0NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45MTc4MzA0MjA5MTc2MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC40NjM1Njg5MjM4Mzk3MGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC43MjU1Njk3NDQxNTY5MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45OTg5OTU1NTc3MDc0N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTk3MTE1ODE4MzQ1MDhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41ODIxMTU2MDE4MDQyNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC43NzYzODk3NjM3MTk2NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk0MzIxODM0ODczODE5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjA3NzE3MzI0MjUzOTI1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNTg2MzgzOTk4NTY1OTVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjU2MDQ5ODI5MTk0MTYzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuODI1MjIzMDE1NjkwMzZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTgzOTg4OTM2Mzk5ODhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4zOTQ2NzQ0MDQyMDU2OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC40NzU0Njk0Njg0NDkzOGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjY4NjEzMDQ0ODM2ODExZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjY1Njc1MDg5MzE0NjMxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMTgzMzE2MzcxMzQ4ODBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMDMyNzMzNzU0NTc5ODBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNzQ5MzMxMDk1NjQxMDhmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjM4Njg0MTQ0Nzg0NzM4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNTEzMzczNDkwMzA0MDZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk3MzQ2MjY3OTQ0NTQ1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk2NTQ5MzY0Mzg0MDk4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC41MzI4MjE1NjA2MTk0MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45MTQyMzI2NTA5MTM1NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTgxNzMxMDczMTE3NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjYxMTMzNTcyNDgyMTQ4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC41MDI1NDUwMDc3MjYzNWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44ODgyOTMzODEzNDI5NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4wMTk5NTg3MzIzODg1NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjg1MjIzNTE1MDk2NzY1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk5OTMwMzgxOTczODA0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTQ1Nzg4OTYyOTY2NDlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODI5MDc3Njc2MDA3ODNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMDYzMjM0NDI1OTgxMjhmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjU4NjYwNzA5NjY5NzI4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTY4NDA3NzM4MDY1ODJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjE3NTczNzM2NjY3MjY3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjQ4MTY2OTIwODU5NDg1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjgzNDM0MjkyNDAxMzQ2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjEzMDIzNDUwNjQ2OTk3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjA1OTQ2NDkxMzA3MDI1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMjA1MTEwNDcwNzQ4NjZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODE1MDU0ODQ1NzQ2MDJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTQ2ODU5NDc4NjEzNjlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjQ0OTc2MzgwOTU0ODYwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNDA4OTQ1NzI2NzE1NDVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjg5NzQ2NDc0NjI1NjcxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTk4NDY1Nzg4Mzg1MzdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMzk2NzcyNTYxMzA3OTJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNzQ4NTQ2Njg2MDkzNTlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjA3NTg4OTQ4NTYzMDc5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNzQwOTYyMTQwODQxNzBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNzYzNDMxOTg5NTE0NDVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC40MTc0NjYyOTQyMjYzNGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzQ0OTAxMDQ2OTk2MjZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NDcyNTkxMTc0NDYxMGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC42NDg4MDExOTc5Mjc1OWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjQxMzM2NjYwODMwNTcxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjYyMzE5NTM3NDYyNTQyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjkzMDk4MzEzNTUyNTk5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjQyMjE1ODE3NTk0ODA3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjA3NzEyNzg3Mzg1MjA4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjAyNzA0NTU0MTQxODg1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjA1NDE3NTE4MDUzNjY2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjgwMDAxNzczNTY2ODE4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTE1NDIxOTUxNDEwMzlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjc5MzUxODMyMzQ4ODE2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjM2MjA4ODk3OTg5MTM2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjYzODcyMzU5MTUxNjM2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMDgxMjgyNTI0OTM0NDRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNTI4OTA1MjA5NjAyOTVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC42MDA0ODg3MjQ1NTU5MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC43NDIzODU1MjkxNDU4N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjA0NDkxOTE1MjkxMDQ0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk5MDk2MTMxNDQ5MjUwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjE5NDUxMTgyODU0NDAyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44MDQxMjMyOTY0MzEwOWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44ODUxMzgxODE5OTQ1N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjQ2MTI2MTYxMjk3MzZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC43MjE5ODY3NDgwNDU0NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4xMTY1Nzc3MDY2MzE5MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44MzY2MjgzMzgxNTA0MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTUwNTMxODI0ODgxMDFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTY5Mzk5MDUxMzgwODJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjYyMjI4ODcyOTI4NjIyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuODI3NjcyNjI4NDY2NjFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMDMwMDQ0NzU3ODczMTZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTk3Mzg4OTYzMzMzODRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk3OTg3MjE0MzQxMDM0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMzY1MjYxMjk2ODY0MjVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk5OTg2OTgwNzQ2MjAwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjM2MDIxNjEwMjk5NzE1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjg5MTEwNjQ4NTk5ODc5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk3ODk0MjUwMzQzMDQ0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjEwNDA3OTYwNTEwNTgyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNzczNTc3OTM4MTE2MTlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTU5NjQ3Mzc4MjE3MjhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMzU0MzU4MTgyODU1MDJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNTA4NDMyMzMxNTkxNjJmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NjEwNzY5MTI2NjIwNWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4xNzAwNjMzNDY3MDYxNWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC43Njg1NDAyNTMxNDgyOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4yNTg3MjY3NTA2MzM2MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk5ODkzMzAzOTMzODE2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4wMTExNTk5ODY4MTkzN2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk4NDk2MDE5NzQyNDQ0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC43OTU5ODcwMjk3MzI2MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk3MTM4NDExMzE4ODk0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45OTI2NDcwODk0ODEwMWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45OTU0MjgyMjQwMjUzNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTk4Mjk2NjM3NTI4MThmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4wMTg3NzEzODgyNDMxMWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzA4MDEwMTY1NDgxODRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4zMzY4MDY4NTk0ODExN2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzA0NjcwNTc3ODY4MjZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45MzI3Mjc3NzUwMTg1N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTg0NjAyMTkwNTI1NGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45ODcyNTc0NjI1NDQzM2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjMzNjQ5Njg1MzQ2NTBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMTY0NzM1OTQ0MjM3NDZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjE2MjU4MjE3NTAwNzkyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk1OTM5MTI1NDAwODAyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC40MzY0NTU5NDM2MDYzM2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45NDgwNTAzMDExMzI4NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTk4NDg0NzE3MDI5NzZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NjI0NTE2NjkyMzgwOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMTY3OTY0NTg5Njg5OThmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTg5ODc1MTE4OTA0NzBmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjg3OTc5MjI1NzQ1MjEzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjcxNzI1NzI1MDQxNjgwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjQ0MTgzMDk5MDIxNzg2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjkzNTY4OTc0NDk4NzYxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjkzMzEwMTgwMTI1NTMyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk5OTEzMzA4MDY4MjQ2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45Mzk0MTkzMTc4MjAwMmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC41NjQwOTM3OTY0MDM1NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODg1OTAwMDMxODg2NzdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC40NzYyNDYwMDQ5MTM4MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTk3MTQ2MzcwMzY5MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44Mzg4OTk1NDI1MzQ2MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzUzNzYzODU2Mzk5NzhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4wMDgxNDY0MzQzODYyNWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45Mzg4NzY4NTYxNTg3NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4xMTI4NDUyODIwNDYzNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44NTEyNjQzNTc4MjMwOWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjUyMzQ5MjUxNTQzNTQ3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjM5NzAxNDIxNDQ2MzgxZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuODE3Nzk2MzQxNzQzMTZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjM3MDI0NDY0MTg3NDM3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjg3MDcxNjU2MjIyOTU5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zNjAyNDgyODI0Mjg5NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjM0NjU1NzM1NjQ4Mjg3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45MzM4ODgxMjU0OTIwOWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44NDQ3NjU0MTA5NjQyOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjUyOTg4MDQ1NTIxMTlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMTg0Mzk1NzU0NTA5MjFmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMTE5NjAzMTkwMDY4NDNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45OTg5OTM0Njc4MDE2OGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NDI5MjU2NTU1MzE2MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjgzMTYzOTA2NTE4MjkzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjc1MDgxMTQ1Mjg2OTQ4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjM1NTMzMjIzMTQyMjY1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjU2NzIxOTc5NzQ4Mzk0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjI0MDc2ODM2NDE0NDk5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjQ2ODU3NzY2NzQ2MDI5ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjMwMTQwMjMzNDU3MTk4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk3MzEyMzEzOTIzNjM1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk5NTQ4MTkxNjMwMDMxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4zODI5OTk3NjU2NzAxN2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk4NTE2OTA5NzE1NDI3ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjQxMDI1ODAwMDE5NDYzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMDIxMTY3MzY5MzU3MzRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMDk2MzgwNjIwMDgwNDhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4wNDQxMTk4NDM4MTQ1N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODUyODMyNDkyNzUzOTdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45MTQ3NTU2MzkyMjQyMWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44ODg2NjgwODk1ODEyNGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45OTczNTI2NzA4MzIyNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNDgyMDI0Mjk1MzY5ODlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTY4MDU2MDg4ODQxNjRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuMjc1NzI1ODI0MTY1NjdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41ODYzNDc1MzMzNTgzMmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNjU4ODkxMjk2NTkxNjhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41ODgzNTYzNDEzODU4M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45ODgzODA4Njk1MzczMmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk5OTk0MzQ5NjAwMjM2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4yMDY1MTM0OTYyMDY4OWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjU0NTkzMDQ0MDY2MzU1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC42MjEyNjQxNjM1NjkyMGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC41OTg5MzY4MTcwMDM5MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4yMDMyMDEwNTQxMDQzN2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44Njg3OTE4MDM1NTI4OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTc3OTA1NDg2MDA1ODRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45NjI5MDgwNjk5OTI0MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4xMTExMjUzNDczNTEyNmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjIxNDg0NzYzMzEzMzAxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC40MTM2ODMzNzMxNDE4MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjI4MjE2ODM3NjgwMzY1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjI0MTMzMDM4OTkyOTYwZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNTEyOTQzNjI2MzAyMzhmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjY2MzkzNDEwNjc0ODg1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjA4MjQ5Njc5NjI5MDgxZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC41MzY5NzgyOTE3ODc1MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45NzY0OTkwMzkzNjIyOGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuOTcyMjQ3Mzc4ODkzNDhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4yMjA4MTMzMzU3OTgzN2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC44NzM5MjQ3NzE0NDU0OWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4xMjc5NjE3Mzc0MDM2MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4xOTA1MDM2MTAxNTc1M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjAxNjAyNjE1Mzg3MTk1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC40NjM1MzQ0MTIxMjcyNGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45NTI0OTA0MTUzOTAwNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMDcwNjQwOTYzMzkwMjFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTQ0Nzk4MDMyMDU4ODZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjkyNDQ0MDg1NDg0NDY2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjEwNDU3NTkwMTg3NDM2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44MzgyMjU5MzU3ODcyOGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4wMTY5NTA0MzIwODg4NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC43NTIxNDY4MTgxMTE1MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45OTk1NTY4MTA0MjY2NWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNDIxMDI5OTg4MjkzMzlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45OTcyMDk0MTk5OTM5NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNzIwOTQ3ODYyMzc2OTZmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMzUwMDg5NjE5MzQyNTVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNzg4NDMzMTEwMTkyNTFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41Mjg1MTM5ODk1ODI3MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NzM5NDAyNzg5NzQ0MmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4yNjY5NTk0NDA4NjU2MWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTIwNjQ2MzQ3Nzk0NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC41NzAxMDEyMDg0OTQyOWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC43Njc4OTYwOTQ2MTc5NWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC43NjUxOTM1NjczMDk2NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODIwMDI0MjE4MzY0MDlmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNzM1MzAxNzk1NTM3NjdmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuODE5MjQ5OTAwMjU3MjRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45OTY5ODQyNTI1MDU3OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMjY3MTk4NTA4NzMzNTdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC42ODkwMzM2OTc3NjE5M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNDMzMTEyNjAzODA5NzVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC44NTMyMTgxNTk0NzQ5MGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTE5NDk3OTY3MzgzNmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjkxODc2MjQ5NzY2NDIyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC44MDY5MjAwMTI0ODQ4N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4zMjYyNzU0MDY2MzIxNGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC40MzA4MDAwMzY0OTk3NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4yMTkxOTA5NTYzNjYzOGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC42NzcwOTQ5MTkzNzM1N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC45NTQ3ODA3NTgyMjkwNmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC41NjE1MTc3MDU2ODMxNmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC43MDY5MzgxMTc0Nzc3OGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC4xMDgzMTg2MjgxMDc0OWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4wODYyODgzNzE3NDU5MmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45MTIyOTQxNzU0MDQzNmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC42NTk4NzM1MTQwODQxMGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNDg5NzI4OTM5MzIyNzRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC41NjI4OTI0NjM2MjY4NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuODkwMzM2NTg2ODk2OTdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNzE2NTY1NjM5ODcwODJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNjUyNjk0NDc0NzUwOTRmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC42NTkxNjAwNDgzMzkzMmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC42NzQzOTQ3ODE0MTEyMWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44MTY4NDM4MDg0Njc5NmYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNDc3NzA4MzI0MTY5NzNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMTY3ODk1NTYyMDMwMjVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk5NzE1OTc5MjYwODc4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjkzNTY1Nzg0MDA3NjQ4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45MDg4OTU5MzYwMjU0NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjYyMDM0Mzk3MDU0MzgwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC4wNjYxODYyMjU0ODE3N2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC4yMzgxMjIxNzIyMTM1OWYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTQzMDI2NjkxOTcyOGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjE4ODEyNTU1MzE3NTUzZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk3Njg2NDAyMzgxODQzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjI4NjY0NTM0MzY2NjIwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk0ODEzNjUwMjIxMjY4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk3NTA2NjQwMDI3MTI4ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45NTQzNDQ5NzQ5Mjg1M2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC43OTYwNzk3ODUwMTk4M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuNDkxMDQ3ODMxMzcxNTBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC4zMjg5NTIxNDM1OTY2M2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45OTg4MTE3NTEyMDc1MWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjg4OTkzOTgzODMxMzU0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjUwNDQ5MTY2NzYwMzAzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjg1OTk1MDcyNDA4NDM0ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjQ3MTYyODkxMDY1MTA4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjE4NjgwMjA0MDQ5NTY5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC42MjA4MTU4MTM2MTg0MGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjc1MDAwNjc2MjE4OTU2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC40Mzg2NzAxNTI1MDgxMmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjk5OTk4MDY5MjQ0MzIyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk4NjMwNTYzMjMyMDc1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjUzNTc4ODk5NjAwNjYyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC42MTUxMDM2MjI3NzM3NGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC44OTUxNTAxOTg5OTk5N2YgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woLTAuMDM4NDE1MTc2MDE4NDNmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuNjk4ODg4MTU2ODExNzlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjMwMTAyMTU3MzA0NjQ0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjA3NjY3ODA4OTIyMjA1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjQxODgxMjg0MTgyNjgzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMDIxODgwOTg5MjIyODJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjg2MTM1NDU0OTQxMjM3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuOTg5NDc0ODA5MDkzNTlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNjcyMjY4NjEzOTM3ODhmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMTM0OTQzODkwMTEwMTRmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjcwNzM3Mzk4ODQyMDY4ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjc2NTQ3MzQ5MzI1OTkyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk0MDQ0OTQ2Njg3OTYzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMDkwMjYyMDExNTc0MTZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjgyMzg2MzUyNTM0MzI3ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMDg5MjQ3Njg4MjM2NzZmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjMyMDcwNjY2Njk4NjU2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNTAxNDM0MjE5MDg3NTNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNTc1OTMxNjMyMjQ0ODdmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuOTg5NjY0MjI5MjE1MDlmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjM2MzI2MDE4NDE5OTY1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuMDc0NDAyNDMxMjMyMjhmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTk5NzkwNDQ2NzQzNTBmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuMTQxMzAyODczNDc0MDVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjkyMzY2MDIzMzI2OTMyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk3OTc5Mjk4MDY4MTgwZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC40NDYwNzE3ODUxODU5OGYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgtMC41NDIzMzI1MjAxNjM5NGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC40NDIyNjgwMDkzMjk1NmYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjcxMzI2NzU2NzQyNzUyZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjAzNjcxOTA3MTU4MzEyZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNjM2MDYzODkzNjY2NzVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuNTIxNzU0MjQ2ODIxOTVmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woLTAuODUzOTY4MjY3MzU3MDVmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk0NzAxMTM5NjkwOTU2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjAxODI2MzQ4MTk0MjU1ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgtMC45ODc1OTYwNjk0NjA0OWYgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjgyMjg4NzE0MzAzMDczZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjg3NDM0Nzk0NzQzNjI1ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuODkzOTk0OTU2NTU0MzNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjkzNDEyMDQxNzU4NzQ0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNDEzNzQwNTIwMjQzNjNmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKDAuOTYwNjM5NDMzMTU1MTFmIC8gOC4wKSwKKyAgICAgRkwyRlhDT05TVF9TR0woMC45MzExNjcwOTU0MTI4MGYgLyA4LjApfSwKKyAgICB7RkwyRlhDT05TVF9TR0woMC45NzUzNDI1MzQ1NzgzN2YgLyA4LjApLAorICAgICBGTDJGWENPTlNUX1NHTCgwLjg2MTUwOTMwODEyNjg5ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjk5NjQyNDY2NTA0MTYzZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKDAuNzAxOTAwNDM0Mjc1MTJmIC8gOC4wKX0sCisgICAge0ZMMkZYQ09OU1RfU0dMKC0wLjk0NzA1MDg5NjY1OTg0ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjI5NTgwMDQyODE0MzA2ZiAvIDguMCl9LAorICAgIHtGTDJGWENPTlNUX1NHTCgwLjkxNTk5ODA3MDg3Mzc2ZiAvIDguMCksCisgICAgIEZMMkZYQ09OU1RfU0dMKC0wLjk4MTQ3ODMwMzg1NzgxZiAvIDguMCl9fTsKIC8vQH0KIAogLyoKQEAgLTczNCw3NiArMTI3NCw2MiBAQAogfTsKICovCiAKLQotLyogVGhlIENMREZCLTgwIGlzIG5vdCBsaW5lYXIgcGhhc2UgKHVuc3ltbWV0cmljKSwgYnV0IHRoZSBleGFjdAotICAgcGhhc2UgZGlmZmVyZW5jZSBiZXR3ZWVuIGFkamFjZW50IGJhbmRzLCBhdCBleGFjdCBwb3NpdGlvbnMKLSAgIChpbiB0aGlzIGNhc2UgZXhhY3RseSBpbiB0aGUgZnJlcXVlbmN5IGJhbmQgY2VudHJlKSwgY2FuIG9mCi0gICBjb3Vyc2UgYmUgZGV0ZXJtaW5lZCBhbnl3YXkuIFdoaWxlIHRoZSBzdGFuZGFyZCBzeW1tZXRyaWMgUU1GCi0gICBiYW5rIGhhcyBhIHBoYXNlIGRpZmZlcmVuY2Ugb2YgMC41KnBpLCB0aGUgQ0xERkItODAKLSAgIGJhbmsgaGFzIHRoZSBkaWZmZXJlbmNlIDAuMjMzNypwaS4gKi8KLWNvbnN0IEZJWFBfU0dMIGhhcm1vbmljUGhhc2VYIFsyXVs0XSA9IHsKLSAgeyBGTDJGWENPTlNUX1NHTCggNy40MjM3MzU0OTQ3NzgxNTFlLTAwMSksIEZMMkZYQ09OU1RfU0dMKC02LjY5OTg2MjAzNjE1OTQ3NWUtMDAxKSwKLSAgICBGTDJGWENPTlNUX1NHTCgtNy40MjM3MzU0OTQ3NzgxNTJlLTAwMSksIEZMMkZYQ09OU1RfU0dMKCA2LjY5OTg2MjAzNjE1OTQ3NGUtMDAxKSB9LAotICB7IEZMMkZYQ09OU1RfU0dMKCA3LjQyMzczNTQ5NDc3ODE1MWUtMDAxKSwgRkwyRlhDT05TVF9TR0woIDYuNjk5ODYyMDM2MTU5NDc2ZS0wMDEpLAotICAgIEZMMkZYQ09OU1RfU0dMKC03LjQyMzczNTQ5NDc3ODE1MWUtMDAxKSwgRkwyRlhDT05TVF9TR0woLTYuNjk5ODYyMDM2MTU5NDc2ZS0wMDEpIH0KLX07Ci0KIC8qIHRhYmxlcyBmb3IgU0JSIGFuZCBBQUMgTEQgKi8KIC8qIHRhYmxlIGZvciA4IHRpbWUgc2xvdCBpbmRleCAqLwotY29uc3QgaW50IEZES19zYnJEZWNvZGVyX2VudmVsb3BlVGFibGVfOCBbOF1bNV0gPSB7Ci0vKiB0cmFuc2llbnRJbmRleCAgbkVudiwgdHJhbklkeCwgc2hvcnRFbnYsIGJvcmRlcjEsIGJvcmRlcjIsIC4uLiAqLwotLyogYm9yZGVycyBmcm9tIGxlZnQgdG8gcmlnaHQgc2lkZTsgLTEgPSBub3QgaW4gdXNlICovCi0gICAgLypbfFQtfC0tLS0tLV0qLyAgeyAyLCAwLCAwLCAxLCAtMSB9LAotICAgIC8qW3wtVC18LS0tLS1dKi8gIHsgMiwgMCwgMCwgMiwgLTEgfSwKLSAgICAvKlstLXxULXwtLS0tXSovICB7IDMsIDEsIDEsIDIsICA0IH0sCi0gICAgLypbLS0tfFQtfC0tLV0qLyAgeyAzLCAxLCAxLCAzLCAgNSB9LAotICAgIC8qWy0tLS18VC18LS1dKi8gIHsgMywgMSwgMSwgNCwgIDYgfSwKLSAgICAvKlstLS0tLXxULS18XSovICB7IDIsIDEsIDEsIDUsIC0xIH0sCi0gICAgLypbLS0tLS0tfFQtfF0qLyAgeyAyLCAxLCAxLCA2LCAtMSB9LAotICAgIC8qWy0tLS0tLS18VHxdKi8gIHsgMiwgMSwgMSwgNywgLTEgfSwKK2NvbnN0IGludCBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzhbOF1bNV0gPSB7CisgICAgLyogdHJhbnNpZW50SW5kZXggIG5FbnYsIHRyYW5JZHgsIHNob3J0RW52LCBib3JkZXIxLCBib3JkZXIyLCAuLi4gKi8KKyAgICAvKiBib3JkZXJzIGZyb20gbGVmdCB0byByaWdodCBzaWRlOyAtMSA9IG5vdCBpbiB1c2UgKi8KKyAgICAvKlt8VC18LS0tLS0tXSovIHsyLCAwLCAwLCAxLCAtMX0sCisgICAgLypbfC1ULXwtLS0tLV0qLyB7MiwgMCwgMCwgMiwgLTF9LAorICAgIC8qWy0tfFQtfC0tLS1dKi8gezMsIDEsIDEsIDIsIDR9LAorICAgIC8qWy0tLXxULXwtLS1dKi8gezMsIDEsIDEsIDMsIDV9LAorICAgIC8qWy0tLS18VC18LS1dKi8gezMsIDEsIDEsIDQsIDZ9LAorICAgIC8qWy0tLS0tfFQtLXxdKi8gezIsIDEsIDEsIDUsIC0xfSwKKyAgICAvKlstLS0tLS18VC18XSovIHsyLCAxLCAxLCA2LCAtMX0sCisgICAgLypbLS0tLS0tLXxUfF0qLyB7MiwgMSwgMSwgNywgLTF9LAogfTsKIAogLyogdGFibGUgZm9yIDE1IHRpbWUgc2xvdCBpbmRleCAqLwotY29uc3QgaW50IEZES19zYnJEZWNvZGVyX2VudmVsb3BlVGFibGVfMTUgWzE1XVs2XSA9IHsKK2NvbnN0IGludCBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzE1WzE1XVs2XSA9IHsKICAgICAvKiB0cmFuc2llbnRJbmRleCAgbkVudiwgdHJhbklkeCwgc2hvcnRFbnYsIGJvcmRlcjEsIGJvcmRlcjIsIC4uLiAqLwogICAgIC8qIGxlbmd0aCBmcm9tIGxlZnQgdG8gcmlnaHQgc2lkZTsgLTEgPSBub3QgaW4gdXNlICovCi0gICAgLypbfFQtLS18LS0tLS0tLS0tLS0tXSovIHsgMiwgMCwgMCwgNCwgLTEsIC0xfSwKLSAgICAvKlt8LVQtLS18LS0tLS0tLS0tLS1dKi8geyAyLCAwLCAwLCA1LCAtMSwgLTF9LAotICAgIC8qW3wtLXxULS0tfC0tLS0tLS0tLV0qLyB7IDMsIDEsIDEsIDIsICA2LCAtMX0sCi0gICAgLypbfC0tLXxULS0tfC0tLS0tLS0tXSovIHsgMywgMSwgMSwgMywgIDcsIC0xfSwKLSAgICAvKlt8LS0tLXxULS0tfC0tLS0tLS1dKi8geyAzLCAxLCAxLCA0LCAgOCwgLTF9LAotICAgIC8qW3wtLS0tLXxULS0tfC0tLS0tLV0qLyB7IDMsIDEsIDEsIDUsICA5LCAtMX0sCi0gICAgLypbfC0tLS0tLXxULS0tfC0tLS0tXSovIHsgMywgMSwgMSwgNiwgMTAsIC0xfSwKLSAgICAvKlt8LS0tLS0tLXxULS0tfC0tLS1dKi8geyAzLCAxLCAxLCA3LCAxMSwgLTF9LAotICAgIC8qW3wtLS0tLS0tLXxULS0tfC0tLV0qLyB7IDMsIDEsIDEsIDgsIDEyLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLXxULS0tfC0tXSovIHsgMywgMSwgMSwgOSwgMTMsIC0xfSwKLSAgICAvKlt8LS0tLS0tLS0tLXxULS0tLXxdKi8geyAyLCAxLCAxLDEwLCAtMSwgLTF9LAotICAgIC8qW3wtLS0tLS0tLS0tLXxULS0tfF0qLyB7IDIsIDEsIDEsMTEsIC0xLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLS0tLXxULS18XSovIHsgMiwgMSwgMSwxMiwgLTEsIC0xfSwKLSAgICAvKlt8LS0tLS0tLS0tLS0tLXxULXxdKi8geyAyLCAxLCAxLDEzLCAtMSwgLTF9LAotICAgIC8qW3wtLS0tLS0tLS0tLS0tLXxUfF0qLyB7IDIsIDEsIDEsMTQsIC0xLCAtMX0sCisgICAgLypbfFQtLS18LS0tLS0tLS0tLS0tXSovIHsyLCAwLCAwLCA0LCAtMSwgLTF9LAorICAgIC8qW3wtVC0tLXwtLS0tLS0tLS0tLV0qLyB7MiwgMCwgMCwgNSwgLTEsIC0xfSwKKyAgICAvKlt8LS18VC0tLXwtLS0tLS0tLS1dKi8gezMsIDEsIDEsIDIsIDYsIC0xfSwKKyAgICAvKlt8LS0tfFQtLS18LS0tLS0tLS1dKi8gezMsIDEsIDEsIDMsIDcsIC0xfSwKKyAgICAvKlt8LS0tLXxULS0tfC0tLS0tLS1dKi8gezMsIDEsIDEsIDQsIDgsIC0xfSwKKyAgICAvKlt8LS0tLS18VC0tLXwtLS0tLS1dKi8gezMsIDEsIDEsIDUsIDksIC0xfSwKKyAgICAvKlt8LS0tLS0tfFQtLS18LS0tLS1dKi8gezMsIDEsIDEsIDYsIDEwLCAtMX0sCisgICAgLypbfC0tLS0tLS18VC0tLXwtLS0tXSovIHszLCAxLCAxLCA3LCAxMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLXxULS0tfC0tLV0qLyB7MywgMSwgMSwgOCwgMTIsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tfFQtLS18LS1dKi8gezMsIDEsIDEsIDksIDEzLCAtMX0sCisgICAgLypbfC0tLS0tLS0tLS18VC0tLS18XSovIHsyLCAxLCAxLCAxMCwgLTEsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLS18VC0tLXxdKi8gezIsIDEsIDEsIDExLCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS18VC0tfF0qLyB7MiwgMSwgMSwgMTIsIC0xLCAtMX0sCisgICAgLypbfC0tLS0tLS0tLS0tLS18VC18XSovIHsyLCAxLCAxLCAxMywgLTEsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLS0tLS18VHxdKi8gezIsIDEsIDEsIDE0LCAtMSwgLTF9LAogfTsKIAogLyogdGFibGUgZm9yIDE2IHRpbWUgc2xvdCBpbmRleCAqLwotY29uc3QgaW50IEZES19zYnJEZWNvZGVyX2VudmVsb3BlVGFibGVfMTYgWzE2XVs2XSA9IHsKK2NvbnN0IGludCBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzE2WzE2XVs2XSA9IHsKICAgICAvKiB0cmFuc2llbnRJbmRleCAgbkVudiwgdHJhbklkeCwgc2hvcnRFbnYsIGJvcmRlcjEsIGJvcmRlcjIsIC4uLiAqLwogICAgIC8qIGxlbmd0aCBmcm9tIGxlZnQgdG8gcmlnaHQgc2lkZTsgLTEgPSBub3QgaW4gdXNlICovCi0gICAgLypbfFQtLS18LS0tLS0tLS0tLS0tfF0qLyB7IDIsIDAsIDAsIDQsIC0xLCAtMX0sCi0gICAgLypbfC1ULS0tfC0tLS0tLS0tLS0tfF0qLyB7IDIsIDAsIDAsIDUsIC0xLCAtMX0sCi0gICAgLypbfC0tfFQtLS18LS0tLS0tLS0tLV0qLyB7IDMsIDEsIDEsIDIsICA2LCAtMX0sCi0gICAgLypbfC0tLXxULS0tfC0tLS0tLS0tLV0qLyB7IDMsIDEsIDEsIDMsICA3LCAtMX0sCi0gICAgLypbfC0tLS18VC0tLXwtLS0tLS0tLV0qLyB7IDMsIDEsIDEsIDQsICA4LCAtMX0sCi0gICAgLypbfC0tLS0tfFQtLS18LS0tLS0tLV0qLyB7IDMsIDEsIDEsIDUsICA5LCAtMX0sCi0gICAgLypbfC0tLS0tLXxULS0tfC0tLS0tLV0qLyB7IDMsIDEsIDEsIDYsIDEwLCAtMX0sCi0gICAgLypbfC0tLS0tLS18VC0tLXwtLS0tLV0qLyB7IDMsIDEsIDEsIDcsIDExLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tfFQtLS18LS0tLV0qLyB7IDMsIDEsIDEsIDgsIDEyLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLXxULS0tfC0tLV0qLyB7IDMsIDEsIDEsIDksIDEzLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLS18VC0tLXwtLV0qLyB7IDMsIDEsIDEsMTAsIDE0LCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLS0tfFQtLS0tfF0qLyB7IDIsIDEsIDEsMTEsIC0xLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLS0tLXxULS0tfF0qLyB7IDIsIDEsIDEsMTIsIC0xLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLS0tLS18VC0tfF0qLyB7IDIsIDEsIDEsMTMsIC0xLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLS0tLS0tfFQtfF0qLyB7IDIsIDEsIDEsMTQsIC0xLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLS0tLS0tLXxUfF0qLyB7IDIsIDEsIDEsMTUsIC0xLCAtMX0sCisgICAgLypbfFQtLS18LS0tLS0tLS0tLS0tfF0qLyB7MiwgMCwgMCwgNCwgLTEsIC0xfSwKKyAgICAvKlt8LVQtLS18LS0tLS0tLS0tLS18XSovIHsyLCAwLCAwLCA1LCAtMSwgLTF9LAorICAgIC8qW3wtLXxULS0tfC0tLS0tLS0tLS1dKi8gezMsIDEsIDEsIDIsIDYsIC0xfSwKKyAgICAvKlt8LS0tfFQtLS18LS0tLS0tLS0tXSovIHszLCAxLCAxLCAzLCA3LCAtMX0sCisgICAgLypbfC0tLS18VC0tLXwtLS0tLS0tLV0qLyB7MywgMSwgMSwgNCwgOCwgLTF9LAorICAgIC8qW3wtLS0tLXxULS0tfC0tLS0tLS1dKi8gezMsIDEsIDEsIDUsIDksIC0xfSwKKyAgICAvKlt8LS0tLS0tfFQtLS18LS0tLS0tXSovIHszLCAxLCAxLCA2LCAxMCwgLTF9LAorICAgIC8qW3wtLS0tLS0tfFQtLS18LS0tLS1dKi8gezMsIDEsIDEsIDcsIDExLCAtMX0sCisgICAgLypbfC0tLS0tLS0tfFQtLS18LS0tLV0qLyB7MywgMSwgMSwgOCwgMTIsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tfFQtLS18LS0tXSovIHszLCAxLCAxLCA5LCAxMywgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tfFQtLS18LS1dKi8gezMsIDEsIDEsIDEwLCAxNCwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLXxULS0tLXxdKi8gezIsIDEsIDEsIDExLCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS18VC0tLXxdKi8gezIsIDEsIDEsIDEyLCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS0tfFQtLXxdKi8gezIsIDEsIDEsIDEzLCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS0tLXxULXxdKi8gezIsIDEsIDEsIDE0LCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS0tLS18VHxdKi8gezIsIDEsIDEsIDE1LCAtMSwgLTF9LAogfTsKIAogLyohCkBAIC04MTIsMjIgKzEzMzgsNTMgQEAKICAgUHJlZGVmaW5lZCBlbnZlbG9wZSBwb3NpdGlvbnMgZm9yIHRoZSBGSVgtRklYIGNhc2UgKHN0YXRpYyBmcmFtaW5nKQogKi8KIC8vQHsKLWNvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8xXzE1ID0geyAwLCAxLCB7MCwgMTUsICAwLCAgMCwgIDAsIDB9LCB7MSwgMCwgMCwgMCwgMH0sIC0xLCAxLCB7MCwgMTUsICAwfSB9OwotY29uc3QgRlJBTUVfSU5GTyBGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzJfMTUgPSB7IDAsIDIsIHswLCAgOCwgMTUsICAwLCAgMCwgMH0sIHsxLCAxLCAwLCAwLCAwfSwgLTEsIDIsIHswLCAgOCwgMTV9IH07Ci1jb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvNF8xNSA9IHsgMCwgNCwgezAsICA0LCAgOCwgMTIsIDE1LCAwfSwgezEsIDEsIDEsIDEsIDB9LCAtMSwgMiwgezAsICA4LCAxNX0gfTsKK2NvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8xXzE1ID0geworICAgIDAsIDEsIHswLCAxNSwgMCwgMCwgMCwgMH0sIHsxLCAwLCAwLCAwLCAwfSwgLTEsIDEsIHswLCAxNSwgMH0sIHswLCAwLCAwfSwKKyAgICAwLCAwfTsKK2NvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8yXzE1ID0geworICAgIDAsIDIsIHswLCA4LCAxNSwgMCwgMCwgMH0sIHsxLCAxLCAwLCAwLCAwfSwgLTEsIDIsIHswLCA4LCAxNX0sIHswLCAwLCAwfSwKKyAgICAwLCAwfTsKK2NvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm80XzE1ID0geworICAgIDAsIDQsIHswLCA0LCA4LCAxMiwgMTUsIDB9LCB7MSwgMSwgMSwgMSwgMH0sIC0xLCAyLCB7MCwgOCwgMTV9LCB7MCwgMCwgMH0sCisgICAgMCwgMH07CiAjaWYgKE1BWF9FTlZFTE9QRVMgPj0gOCkKLWNvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm84XzE1ID0geyAwLCA4LCB7MCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMTV9LCB7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMX0sIC0xLCAyLCB7MCwgOCwgMTV9IH07Citjb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvOF8xNSA9IHsKKyAgICAwLAorICAgIDgsCisgICAgezAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDE1fSwKKyAgICB7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMX0sCisgICAgLTEsCisgICAgMiwKKyAgICB7MCwgOCwgMTV9LAorICAgIHswLCAwLCAwfSwKKyAgICAwLAorICAgIDB9OwogI2VuZGlmCiAKLWNvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8xXzE2ID0geyAwLCAxLCB7MCwgMTYsICAwLCAgMCwgIDAsIDB9LCB7MSwgMCwgMCwgMCwgMH0sIC0xLCAxLCB7MCwgMTYsIDB9IH07Ci1jb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMl8xNiA9IHsgMCwgMiwgezAsICA4LCAxNiwgIDAsICAwLCAwfSwgezEsIDEsIDAsIDAsIDB9LCAtMSwgMiwgezAsIDgsIDE2fSB9OwotY29uc3QgRlJBTUVfSU5GTyBGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzRfMTYgPSB7IDAsIDQsIHswLCAgNCwgIDgsIDEyLCAxNiwgMH0sIHsxLCAxLCAxLCAxLCAwfSwgLTEsIDIsIHswLCA4LCAxNn0gfTsKK2NvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8xXzE2ID0geworICAgIDAsIDEsIHswLCAxNiwgMCwgMCwgMCwgMH0sIHsxLCAwLCAwLCAwLCAwfSwgLTEsIDEsIHswLCAxNiwgMH0sIHswLCAwLCAwfSwKKyAgICAwLCAwfTsKK2NvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8yXzE2ID0geworICAgIDAsIDIsIHswLCA4LCAxNiwgMCwgMCwgMH0sIHsxLCAxLCAwLCAwLCAwfSwgLTEsIDIsIHswLCA4LCAxNn0sIHswLCAwLCAwfSwKKyAgICAwLCAwfTsKK2NvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm80XzE2ID0geworICAgIDAsIDQsIHswLCA0LCA4LCAxMiwgMTYsIDB9LCB7MSwgMSwgMSwgMSwgMH0sIC0xLCAyLCB7MCwgOCwgMTZ9LCB7MCwgMCwgMH0sCisgICAgMCwgMH07CiAKICNpZiAoTUFYX0VOVkVMT1BFUyA+PSA4KQotY29uc3QgRlJBTUVfSU5GTyBGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzhfMTYgPSB7IDAsIDgsIHswLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxNn0sIHsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfSwgLTEsIDIsIHswLCA4LCAxNn0gfTsKK2NvbnN0IEZSQU1FX0lORk8gRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm84XzE2ID0geworICAgIDAsCisgICAgOCwKKyAgICB7MCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMTZ9LAorICAgIHsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfSwKKyAgICAtMSwKKyAgICAyLAorICAgIHswLCA4LCAxNn0sCisgICAgezAsIDAsIDB9LAorICAgIDAsCisgICAgMH07CiAjZW5kaWYKIAotCiAvL0B9CiAKIC8qIQpAQCAtODY0LDQ5NCArMTQyMSwyMjUgQEAKICovCiAvL0B7CiBjb25zdCBTQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfRW52TGV2ZWwxMFRbMTIwXVsyXSA9IHsKLSAgeyAgIDEsICAgMiB9LCAgICB7IC02NCwgLTY1IH0sICAgIHsgICAzLCAgIDQgfSwgICAgeyAtNjMsIC02NiB9LAotICB7ICAgNSwgICA2IH0sICAgIHsgLTYyLCAtNjcgfSwgICAgeyAgIDcsICAgOCB9LCAgICB7IC02MSwgLTY4IH0sCi0gIHsgICA5LCAgMTAgfSwgICAgeyAtNjAsIC02OSB9LCAgICB7ICAxMSwgIDEyIH0sICAgIHsgLTU5LCAtNzAgfSwKLSAgeyAgMTMsICAxNCB9LCAgICB7IC01OCwgLTcxIH0sICAgIHsgIDE1LCAgMTYgfSwgICAgeyAtNTcsIC03MiB9LAotICB7ICAxNywgIDE4IH0sICAgIHsgLTczLCAtNTYgfSwgICAgeyAgMTksICAyMSB9LCAgICB7IC03NCwgIDIwIH0sCi0gIHsgLTU1LCAtNzUgfSwgICAgeyAgMjIsICAyNiB9LCAgICB7ICAyMywgIDI0IH0sICAgIHsgLTU0LCAtNzYgfSwKLSAgeyAtNzcsICAyNSB9LCAgICB7IC01MywgLTc4IH0sICAgIHsgIDI3LCAgMzQgfSwgICAgeyAgMjgsICAyOSB9LAotICB7IC01MiwgLTc5IH0sICAgIHsgIDMwLCAgMzEgfSwgICAgeyAtODAsIC01MSB9LCAgICB7ICAzMiwgIDMzIH0sCi0gIHsgLTgzLCAtODIgfSwgICAgeyAtODEsIC01MCB9LCAgICB7ICAzNSwgIDU3IH0sICAgIHsgIDM2LCAgNDAgfSwKLSAgeyAgMzcsICAzOCB9LCAgICB7IC04OCwgLTg0IH0sICAgIHsgLTQ4LCAgMzkgfSwgICAgeyAtOTAsIC04NSB9LAotICB7ICA0MSwgIDQ2IH0sICAgIHsgIDQyLCAgNDMgfSwgICAgeyAtNDksIC04NyB9LCAgICB7ICA0NCwgIDQ1IH0sCi0gIHsgLTg5LCAtODYgfSwgICAgey0xMjQsLTEyMyB9LCAgICB7ICA0NywgIDUwIH0sICAgIHsgIDQ4LCAgNDkgfSwKLSAgey0xMjIsLTEyMSB9LCAgICB7LTEyMCwtMTE5IH0sICAgIHsgIDUxLCAgNTQgfSwgICAgeyAgNTIsICA1MyB9LAotICB7LTExOCwtMTE3IH0sICAgIHstMTE2LC0xMTUgfSwgICAgeyAgNTUsICA1NiB9LCAgICB7LTExNCwtMTEzIH0sCi0gIHstMTEyLC0xMTEgfSwgICAgeyAgNTgsICA4OSB9LCAgICB7ICA1OSwgIDc0IH0sICAgIHsgIDYwLCAgNjcgfSwKLSAgeyAgNjEsICA2NCB9LCAgICB7ICA2MiwgIDYzIH0sICAgIHstMTEwLC0xMDkgfSwgICAgey0xMDgsLTEwNyB9LAotICB7ICA2NSwgIDY2IH0sICAgIHstMTA2LC0xMDUgfSwgICAgey0xMDQsLTEwMyB9LCAgICB7ICA2OCwgIDcxIH0sCi0gIHsgIDY5LCAgNzAgfSwgICAgey0xMDIsLTEwMSB9LCAgICB7LTEwMCwgLTk5IH0sICAgIHsgIDcyLCAgNzMgfSwKLSAgeyAtOTgsIC05NyB9LCAgICB7IC05NiwgLTk1IH0sICAgIHsgIDc1LCAgODIgfSwgICAgeyAgNzYsICA3OSB9LAotICB7ICA3NywgIDc4IH0sICAgIHsgLTk0LCAtOTMgfSwgICAgeyAtOTIsIC05MSB9LCAgICB7ICA4MCwgIDgxIH0sCi0gIHsgLTQ3LCAtNDYgfSwgICAgeyAtNDUsIC00NCB9LCAgICB7ICA4MywgIDg2IH0sICAgIHsgIDg0LCAgODUgfSwKLSAgeyAtNDMsIC00MiB9LCAgICB7IC00MSwgLTQwIH0sICAgIHsgIDg3LCAgODggfSwgICAgeyAtMzksIC0zOCB9LAotICB7IC0zNywgLTM2IH0sICAgIHsgIDkwLCAxMDUgfSwgICAgeyAgOTEsICA5OCB9LCAgICB7ICA5MiwgIDk1IH0sCi0gIHsgIDkzLCAgOTQgfSwgICAgeyAtMzUsIC0zNCB9LCAgICB7IC0zMywgLTMyIH0sICAgIHsgIDk2LCAgOTcgfSwKLSAgeyAtMzEsIC0zMCB9LCAgICB7IC0yOSwgLTI4IH0sICAgIHsgIDk5LCAxMDIgfSwgICAgeyAxMDAsIDEwMSB9LAotICB7IC0yNywgLTI2IH0sICAgIHsgLTI1LCAtMjQgfSwgICAgeyAxMDMsIDEwNCB9LCAgICB7IC0yMywgLTIyIH0sCi0gIHsgLTIxLCAtMjAgfSwgICAgeyAxMDYsIDExMyB9LCAgICB7IDEwNywgMTEwIH0sICAgIHsgMTA4LCAxMDkgfSwKLSAgeyAtMTksIC0xOCB9LCAgICB7IC0xNywgLTE2IH0sICAgIHsgMTExLCAxMTIgfSwgICAgeyAtMTUsIC0xNCB9LAotICB7IC0xMywgLTEyIH0sICAgIHsgMTE0LCAxMTcgfSwgICAgeyAxMTUsIDExNiB9LCAgICB7IC0xMSwgLTEwIH0sCi0gIHsgIC05LCAgLTggfSwgICAgeyAxMTgsIDExOSB9LCAgICB7ICAtNywgIC02IH0sICAgIHsgIC01LCAgLTQgfQotfTsKKyAgICB7MSwgMn0sICAgICAgIHstNjQsIC02NX0sICAgezMsIDR9LCAgICAgICB7LTYzLCAtNjZ9LCAgIHs1LCA2fSwKKyAgICB7LTYyLCAtNjd9LCAgIHs3LCA4fSwgICAgICAgey02MSwgLTY4fSwgICB7OSwgMTB9LCAgICAgIHstNjAsIC02OX0sCisgICAgezExLCAxMn0sICAgICB7LTU5LCAtNzB9LCAgIHsxMywgMTR9LCAgICAgey01OCwgLTcxfSwgICB7MTUsIDE2fSwKKyAgICB7LTU3LCAtNzJ9LCAgIHsxNywgMTh9LCAgICAgey03MywgLTU2fSwgICB7MTksIDIxfSwgICAgIHstNzQsIDIwfSwKKyAgICB7LTU1LCAtNzV9LCAgIHsyMiwgMjZ9LCAgICAgezIzLCAyNH0sICAgICB7LTU0LCAtNzZ9LCAgIHstNzcsIDI1fSwKKyAgICB7LTUzLCAtNzh9LCAgIHsyNywgMzR9LCAgICAgezI4LCAyOX0sICAgICB7LTUyLCAtNzl9LCAgIHszMCwgMzF9LAorICAgIHstODAsIC01MX0sICAgezMyLCAzM30sICAgICB7LTgzLCAtODJ9LCAgIHstODEsIC01MH0sICAgezM1LCA1N30sCisgICAgezM2LCA0MH0sICAgICB7MzcsIDM4fSwgICAgIHstODgsIC04NH0sICAgey00OCwgMzl9LCAgICB7LTkwLCAtODV9LAorICAgIHs0MSwgNDZ9LCAgICAgezQyLCA0M30sICAgICB7LTQ5LCAtODd9LCAgIHs0NCwgNDV9LCAgICAgey04OSwgLTg2fSwKKyAgICB7LTEyNCwgLTEyM30sIHs0NywgNTB9LCAgICAgezQ4LCA0OX0sICAgICB7LTEyMiwgLTEyMX0sIHstMTIwLCAtMTE5fSwKKyAgICB7NTEsIDU0fSwgICAgIHs1MiwgNTN9LCAgICAgey0xMTgsIC0xMTd9LCB7LTExNiwgLTExNX0sIHs1NSwgNTZ9LAorICAgIHstMTE0LCAtMTEzfSwgey0xMTIsIC0xMTF9LCB7NTgsIDg5fSwgICAgIHs1OSwgNzR9LCAgICAgezYwLCA2N30sCisgICAgezYxLCA2NH0sICAgICB7NjIsIDYzfSwgICAgIHstMTEwLCAtMTA5fSwgey0xMDgsIC0xMDd9LCB7NjUsIDY2fSwKKyAgICB7LTEwNiwgLTEwNX0sIHstMTA0LCAtMTAzfSwgezY4LCA3MX0sICAgICB7NjksIDcwfSwgICAgIHstMTAyLCAtMTAxfSwKKyAgICB7LTEwMCwgLTk5fSwgIHs3MiwgNzN9LCAgICAgey05OCwgLTk3fSwgICB7LTk2LCAtOTV9LCAgIHs3NSwgODJ9LAorICAgIHs3NiwgNzl9LCAgICAgezc3LCA3OH0sICAgICB7LTk0LCAtOTN9LCAgIHstOTIsIC05MX0sICAgezgwLCA4MX0sCisgICAgey00NywgLTQ2fSwgICB7LTQ1LCAtNDR9LCAgIHs4MywgODZ9LCAgICAgezg0LCA4NX0sICAgICB7LTQzLCAtNDJ9LAorICAgIHstNDEsIC00MH0sICAgezg3LCA4OH0sICAgICB7LTM5LCAtMzh9LCAgIHstMzcsIC0zNn0sICAgezkwLCAxMDV9LAorICAgIHs5MSwgOTh9LCAgICAgezkyLCA5NX0sICAgICB7OTMsIDk0fSwgICAgIHstMzUsIC0zNH0sICAgey0zMywgLTMyfSwKKyAgICB7OTYsIDk3fSwgICAgIHstMzEsIC0zMH0sICAgey0yOSwgLTI4fSwgICB7OTksIDEwMn0sICAgIHsxMDAsIDEwMX0sCisgICAgey0yNywgLTI2fSwgICB7LTI1LCAtMjR9LCAgIHsxMDMsIDEwNH0sICAgey0yMywgLTIyfSwgICB7LTIxLCAtMjB9LAorICAgIHsxMDYsIDExM30sICAgezEwNywgMTEwfSwgICB7MTA4LCAxMDl9LCAgIHstMTksIC0xOH0sICAgey0xNywgLTE2fSwKKyAgICB7MTExLCAxMTJ9LCAgIHstMTUsIC0xNH0sICAgey0xMywgLTEyfSwgICB7MTE0LCAxMTd9LCAgIHsxMTUsIDExNn0sCisgICAgey0xMSwgLTEwfSwgICB7LTksIC04fSwgICAgIHsxMTgsIDExOX0sICAgey03LCAtNn0sICAgICB7LTUsIC00fX07CiAKIGNvbnN0IFNDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZMZXZlbDEwRlsxMjBdWzJdID0gewotICB7ICAgMSwgICAyIH0sICAgIHsgLTY0LCAtNjUgfSwgICAgeyAgIDMsICAgNCB9LCAgICB7IC02MywgLTY2IH0sCi0gIHsgICA1LCAgIDYgfSwgICAgeyAtNjcsIC02MiB9LCAgICB7ICAgNywgICA4IH0sICAgIHsgLTY4LCAtNjEgfSwKLSAgeyAgIDksICAxMCB9LCAgICB7IC02OSwgLTYwIH0sICAgIHsgIDExLCAgMTMgfSwgICAgeyAtNzAsICAxMiB9LAotICB7IC01OSwgLTcxIH0sICAgIHsgIDE0LCAgMTYgfSwgICAgeyAtNTgsICAxNSB9LCAgICB7IC03MiwgLTU3IH0sCi0gIHsgIDE3LCAgMTkgfSwgICAgeyAtNzMsICAxOCB9LCAgICB7IC01NiwgLTc0IH0sICAgIHsgIDIwLCAgMjMgfSwKLSAgeyAgMjEsICAyMiB9LCAgICB7IC01NSwgLTc1IH0sICAgIHsgLTU0LCAtNTMgfSwgICAgeyAgMjQsICAyNyB9LAotICB7ICAyNSwgIDI2IH0sICAgIHsgLTc2LCAtNTIgfSwgICAgeyAtNzcsIC01MSB9LCAgICB7ICAyOCwgIDMxIH0sCi0gIHsgIDI5LCAgMzAgfSwgICAgeyAtNTAsIC03OCB9LCAgICB7IC03OSwgLTQ5IH0sICAgIHsgIDMyLCAgMzYgfSwKLSAgeyAgMzMsICAzNCB9LCAgICB7IC00OCwgLTQ3IH0sICAgIHsgLTgwLCAgMzUgfSwgICAgeyAtODEsIC04MiB9LAotICB7ICAzNywgIDQ3IH0sICAgIHsgIDM4LCAgNDEgfSwgICAgeyAgMzksICA0MCB9LCAgICB7IC04MywgLTQ2IH0sCi0gIHsgLTQ1LCAtODQgfSwgICAgeyAgNDIsICA0NCB9LCAgICB7IC04NSwgIDQzIH0sICAgIHsgLTQ0LCAtNDMgfSwKLSAgeyAgNDUsICA0NiB9LCAgICB7IC04OCwgLTg3IH0sICAgIHsgLTg2LCAtOTAgfSwgICAgeyAgNDgsICA2NiB9LAotICB7ICA0OSwgIDU2IH0sICAgIHsgIDUwLCAgNTMgfSwgICAgeyAgNTEsICA1MiB9LCAgICB7IC05MiwgLTQyIH0sCi0gIHsgLTQxLCAtMzkgfSwgICAgeyAgNTQsICA1NSB9LCAgICB7LTEwNSwgLTg5IH0sICAgIHsgLTM4LCAtMzcgfSwKLSAgeyAgNTcsICA2MCB9LCAgICB7ICA1OCwgIDU5IH0sICAgIHsgLTk0LCAtOTEgfSwgICAgeyAtNDAsIC0zNiB9LAotICB7ICA2MSwgIDYzIH0sICAgIHsgLTIwLCAgNjIgfSwgICAgey0xMTUsLTExMCB9LCAgICB7ICA2NCwgIDY1IH0sCi0gIHstMTA4LC0xMDcgfSwgICAgey0xMDEsIC05NyB9LCAgICB7ICA2NywgIDg5IH0sICAgIHsgIDY4LCAgNzUgfSwKLSAgeyAgNjksICA3MiB9LCAgICB7ICA3MCwgIDcxIH0sICAgIHsgLTk1LCAtOTMgfSwgICAgeyAtMzQsIC0yNyB9LAotICB7ICA3MywgIDc0IH0sICAgIHsgLTIyLCAtMTcgfSwgICAgeyAtMTYsLTEyNCB9LCAgICB7ICA3NiwgIDgyIH0sCi0gIHsgIDc3LCAgNzkgfSwgICAgey0xMjMsICA3OCB9LCAgICB7LTEyMiwtMTIxIH0sICAgIHsgIDgwLCAgODEgfSwKLSAgey0xMjAsLTExOSB9LCAgICB7LTExOCwtMTE3IH0sICAgIHsgIDgzLCAgODYgfSwgICAgeyAgODQsICA4NSB9LAotICB7LTExNiwtMTE0IH0sICAgIHstMTEzLC0xMTIgfSwgICAgeyAgODcsICA4OCB9LCAgICB7LTExMSwtMTA5IH0sCi0gIHstMTA2LC0xMDQgfSwgICAgeyAgOTAsIDEwNSB9LCAgICB7ICA5MSwgIDk4IH0sICAgIHsgIDkyLCAgOTUgfSwKLSAgeyAgOTMsICA5NCB9LCAgICB7LTEwMywtMTAyIH0sICAgIHstMTAwLCAtOTkgfSwgICAgeyAgOTYsICA5NyB9LAotICB7IC05OCwgLTk2IH0sICAgIHsgLTM1LCAtMzMgfSwgICAgeyAgOTksIDEwMiB9LCAgICB7IDEwMCwgMTAxIH0sCi0gIHsgLTMyLCAtMzEgfSwgICAgeyAtMzAsIC0yOSB9LCAgICB7IDEwMywgMTA0IH0sICAgIHsgLTI4LCAtMjYgfSwKLSAgeyAtMjUsIC0yNCB9LCAgICB7IDEwNiwgMTEzIH0sICAgIHsgMTA3LCAxMTAgfSwgICAgeyAxMDgsIDEwOSB9LAotICB7IC0yMywgLTIxIH0sICAgIHsgLTE5LCAtMTggfSwgICAgeyAxMTEsIDExMiB9LCAgICB7IC0xNSwgLTE0IH0sCi0gIHsgLTEzLCAtMTIgfSwgICAgeyAxMTQsIDExNyB9LCAgICB7IDExNSwgMTE2IH0sICAgIHsgLTExLCAtMTAgfSwKLSAgeyAgLTksICAtOCB9LCAgICB7IDExOCwgMTE5IH0sICAgIHsgIC03LCAgLTYgfSwgICAgeyAgLTUsICAtNCB9Ci19OworICAgIHsxLCAyfSwgICAgICAgey02NCwgLTY1fSwgICB7MywgNH0sICAgICAgIHstNjMsIC02Nn0sICAgezUsIDZ9LAorICAgIHstNjcsIC02Mn0sICAgezcsIDh9LCAgICAgICB7LTY4LCAtNjF9LCAgIHs5LCAxMH0sICAgICAgey02OSwgLTYwfSwKKyAgICB7MTEsIDEzfSwgICAgIHstNzAsIDEyfSwgICAgey01OSwgLTcxfSwgICB7MTQsIDE2fSwgICAgIHstNTgsIDE1fSwKKyAgICB7LTcyLCAtNTd9LCAgIHsxNywgMTl9LCAgICAgey03MywgMTh9LCAgICB7LTU2LCAtNzR9LCAgIHsyMCwgMjN9LAorICAgIHsyMSwgMjJ9LCAgICAgey01NSwgLTc1fSwgICB7LTU0LCAtNTN9LCAgIHsyNCwgMjd9LCAgICAgezI1LCAyNn0sCisgICAgey03NiwgLTUyfSwgICB7LTc3LCAtNTF9LCAgIHsyOCwgMzF9LCAgICAgezI5LCAzMH0sICAgICB7LTUwLCAtNzh9LAorICAgIHstNzksIC00OX0sICAgezMyLCAzNn0sICAgICB7MzMsIDM0fSwgICAgIHstNDgsIC00N30sICAgey04MCwgMzV9LAorICAgIHstODEsIC04Mn0sICAgezM3LCA0N30sICAgICB7MzgsIDQxfSwgICAgIHszOSwgNDB9LCAgICAgey04MywgLTQ2fSwKKyAgICB7LTQ1LCAtODR9LCAgIHs0MiwgNDR9LCAgICAgey04NSwgNDN9LCAgICB7LTQ0LCAtNDN9LCAgIHs0NSwgNDZ9LAorICAgIHstODgsIC04N30sICAgey04NiwgLTkwfSwgICB7NDgsIDY2fSwgICAgIHs0OSwgNTZ9LCAgICAgezUwLCA1M30sCisgICAgezUxLCA1Mn0sICAgICB7LTkyLCAtNDJ9LCAgIHstNDEsIC0zOX0sICAgezU0LCA1NX0sICAgICB7LTEwNSwgLTg5fSwKKyAgICB7LTM4LCAtMzd9LCAgIHs1NywgNjB9LCAgICAgezU4LCA1OX0sICAgICB7LTk0LCAtOTF9LCAgIHstNDAsIC0zNn0sCisgICAgezYxLCA2M30sICAgICB7LTIwLCA2Mn0sICAgIHstMTE1LCAtMTEwfSwgezY0LCA2NX0sICAgICB7LTEwOCwgLTEwN30sCisgICAgey0xMDEsIC05N30sICB7NjcsIDg5fSwgICAgIHs2OCwgNzV9LCAgICAgezY5LCA3Mn0sICAgICB7NzAsIDcxfSwKKyAgICB7LTk1LCAtOTN9LCAgIHstMzQsIC0yN30sICAgezczLCA3NH0sICAgICB7LTIyLCAtMTd9LCAgIHstMTYsIC0xMjR9LAorICAgIHs3NiwgODJ9LCAgICAgezc3LCA3OX0sICAgICB7LTEyMywgNzh9LCAgIHstMTIyLCAtMTIxfSwgezgwLCA4MX0sCisgICAgey0xMjAsIC0xMTl9LCB7LTExOCwgLTExN30sIHs4MywgODZ9LCAgICAgezg0LCA4NX0sICAgICB7LTExNiwgLTExNH0sCisgICAgey0xMTMsIC0xMTJ9LCB7ODcsIDg4fSwgICAgIHstMTExLCAtMTA5fSwgey0xMDYsIC0xMDR9LCB7OTAsIDEwNX0sCisgICAgezkxLCA5OH0sICAgICB7OTIsIDk1fSwgICAgIHs5MywgOTR9LCAgICAgey0xMDMsIC0xMDJ9LCB7LTEwMCwgLTk5fSwKKyAgICB7OTYsIDk3fSwgICAgIHstOTgsIC05Nn0sICAgey0zNSwgLTMzfSwgICB7OTksIDEwMn0sICAgIHsxMDAsIDEwMX0sCisgICAgey0zMiwgLTMxfSwgICB7LTMwLCAtMjl9LCAgIHsxMDMsIDEwNH0sICAgey0yOCwgLTI2fSwgICB7LTI1LCAtMjR9LAorICAgIHsxMDYsIDExM30sICAgezEwNywgMTEwfSwgICB7MTA4LCAxMDl9LCAgIHstMjMsIC0yMX0sICAgey0xOSwgLTE4fSwKKyAgICB7MTExLCAxMTJ9LCAgIHstMTUsIC0xNH0sICAgey0xMywgLTEyfSwgICB7MTE0LCAxMTd9LCAgIHsxMTUsIDExNn0sCisgICAgey0xMSwgLTEwfSwgICB7LTksIC04fSwgICAgIHsxMTgsIDExOX0sICAgey03LCAtNn0sICAgICB7LTUsIC00fX07CiAKIGNvbnN0IFNDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZCYWxhbmNlMTBUWzQ4XVsyXSA9IHsKLSAgeyAtNjQsICAgMSB9LCAgICB7IC02MywgICAyIH0sICAgIHsgLTY1LCAgIDMgfSwgICAgeyAtNjIsICAgNCB9LAotICB7IC02NiwgICA1IH0sICAgIHsgLTYxLCAgIDYgfSwgICAgeyAtNjcsICAgNyB9LCAgICB7IC02MCwgICA4IH0sCi0gIHsgLTY4LCAgIDkgfSwgICAgeyAgMTAsICAxMSB9LCAgICB7IC02OSwgLTU5IH0sICAgIHsgIDEyLCAgMTMgfSwKLSAgeyAtNzAsIC01OCB9LCAgICB7ICAxNCwgIDI4IH0sICAgIHsgIDE1LCAgMjEgfSwgICAgeyAgMTYsICAxOCB9LAotICB7IC01NywgIDE3IH0sICAgIHsgLTcxLCAtNTYgfSwgICAgeyAgMTksICAyMCB9LCAgICB7IC04OCwgLTg3IH0sCi0gIHsgLTg2LCAtODUgfSwgICAgeyAgMjIsICAyNSB9LCAgICB7ICAyMywgIDI0IH0sICAgIHsgLTg0LCAtODMgfSwKLSAgeyAtODIsIC04MSB9LCAgICB7ICAyNiwgIDI3IH0sICAgIHsgLTgwLCAtNzkgfSwgICAgeyAtNzgsIC03NyB9LAotICB7ICAyOSwgIDM2IH0sICAgIHsgIDMwLCAgMzMgfSwgICAgeyAgMzEsICAzMiB9LCAgICB7IC03NiwgLTc1IH0sCi0gIHsgLTc0LCAtNzMgfSwgICAgeyAgMzQsICAzNSB9LCAgICB7IC03MiwgLTU1IH0sICAgIHsgLTU0LCAtNTMgfSwKLSAgeyAgMzcsICA0MSB9LCAgICB7ICAzOCwgIDM5IH0sICAgIHsgLTUyLCAtNTEgfSwgICAgeyAtNTAsICA0MCB9LAotICB7IC00OSwgLTQ4IH0sICAgIHsgIDQyLCAgNDUgfSwgICAgeyAgNDMsICA0NCB9LCAgICB7IC00NywgLTQ2IH0sCi0gIHsgLTQ1LCAtNDQgfSwgICAgeyAgNDYsICA0NyB9LCAgICB7IC00MywgLTQyIH0sICAgIHsgLTQxLCAtNDAgfQotfTsKKyAgICB7LTY0LCAxfSwgICB7LTYzLCAyfSwgICB7LTY1LCAzfSwgICB7LTYyLCA0fSwgICB7LTY2LCA1fSwgICB7LTYxLCA2fSwKKyAgICB7LTY3LCA3fSwgICB7LTYwLCA4fSwgICB7LTY4LCA5fSwgICB7MTAsIDExfSwgICB7LTY5LCAtNTl9LCB7MTIsIDEzfSwKKyAgICB7LTcwLCAtNTh9LCB7MTQsIDI4fSwgICB7MTUsIDIxfSwgICB7MTYsIDE4fSwgICB7LTU3LCAxN30sICB7LTcxLCAtNTZ9LAorICAgIHsxOSwgMjB9LCAgIHstODgsIC04N30sIHstODYsIC04NX0sIHsyMiwgMjV9LCAgIHsyMywgMjR9LCAgIHstODQsIC04M30sCisgICAgey04MiwgLTgxfSwgezI2LCAyN30sICAgey04MCwgLTc5fSwgey03OCwgLTc3fSwgezI5LCAzNn0sICAgezMwLCAzM30sCisgICAgezMxLCAzMn0sICAgey03NiwgLTc1fSwgey03NCwgLTczfSwgezM0LCAzNX0sICAgey03MiwgLTU1fSwgey01NCwgLTUzfSwKKyAgICB7MzcsIDQxfSwgICB7MzgsIDM5fSwgICB7LTUyLCAtNTF9LCB7LTUwLCA0MH0sICB7LTQ5LCAtNDh9LCB7NDIsIDQ1fSwKKyAgICB7NDMsIDQ0fSwgICB7LTQ3LCAtNDZ9LCB7LTQ1LCAtNDR9LCB7NDYsIDQ3fSwgICB7LTQzLCAtNDJ9LCB7LTQxLCAtNDB9fTsKIAogY29uc3QgU0NIQVIgRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkJhbGFuY2UxMEZbNDhdWzJdID0gewotICB7IC02NCwgICAxIH0sICAgIHsgLTY1LCAgIDIgfSwgICAgeyAtNjMsICAgMyB9LCAgICB7IC02NiwgICA0IH0sCi0gIHsgLTYyLCAgIDUgfSwgICAgeyAtNjEsICAgNiB9LCAgICB7IC02NywgICA3IH0sICAgIHsgLTY4LCAgIDggfSwKLSAgeyAtNjAsICAgOSB9LCAgICB7ICAxMCwgIDExIH0sICAgIHsgLTY5LCAtNTkgfSwgICAgeyAtNzAsICAxMiB9LAotICB7IC01OCwgIDEzIH0sICAgIHsgIDE0LCAgMTcgfSwgICAgeyAtNzEsICAxNSB9LCAgICB7IC01NywgIDE2IH0sCi0gIHsgLTU2LCAtNzMgfSwgICAgeyAgMTgsICAzMiB9LCAgICB7ICAxOSwgIDI1IH0sICAgIHsgIDIwLCAgMjIgfSwKLSAgeyAtNzIsICAyMSB9LCAgICB7IC04OCwgLTg3IH0sICAgIHsgIDIzLCAgMjQgfSwgICAgeyAtODYsIC04NSB9LAotICB7IC04NCwgLTgzIH0sICAgIHsgIDI2LCAgMjkgfSwgICAgeyAgMjcsICAyOCB9LCAgICB7IC04MiwgLTgxIH0sCi0gIHsgLTgwLCAtNzkgfSwgICAgeyAgMzAsICAzMSB9LCAgICB7IC03OCwgLTc3IH0sICAgIHsgLTc2LCAtNzUgfSwKLSAgeyAgMzMsICA0MCB9LCAgICB7ICAzNCwgIDM3IH0sICAgIHsgIDM1LCAgMzYgfSwgICAgeyAtNzQsIC01NSB9LAotICB7IC01NCwgLTUzIH0sICAgIHsgIDM4LCAgMzkgfSwgICAgeyAtNTIsIC01MSB9LCAgICB7IC01MCwgLTQ5IH0sCi0gIHsgIDQxLCAgNDQgfSwgICAgeyAgNDIsICA0MyB9LCAgICB7IC00OCwgLTQ3IH0sICAgIHsgLTQ2LCAtNDUgfSwKLSAgeyAgNDUsICA0NiB9LCAgICB7IC00NCwgLTQzIH0sICAgIHsgLTQyLCAgNDcgfSwgICAgeyAtNDEsIC00MCB9Ci19OworICAgIHstNjQsIDF9LCAgIHstNjUsIDJ9LCAgIHstNjMsIDN9LCAgIHstNjYsIDR9LCAgIHstNjIsIDV9LCAgIHstNjEsIDZ9LAorICAgIHstNjcsIDd9LCAgIHstNjgsIDh9LCAgIHstNjAsIDl9LCAgIHsxMCwgMTF9LCAgIHstNjksIC01OX0sIHstNzAsIDEyfSwKKyAgICB7LTU4LCAxM30sICB7MTQsIDE3fSwgICB7LTcxLCAxNX0sICB7LTU3LCAxNn0sICB7LTU2LCAtNzN9LCB7MTgsIDMyfSwKKyAgICB7MTksIDI1fSwgICB7MjAsIDIyfSwgICB7LTcyLCAyMX0sICB7LTg4LCAtODd9LCB7MjMsIDI0fSwgICB7LTg2LCAtODV9LAorICAgIHstODQsIC04M30sIHsyNiwgMjl9LCAgIHsyNywgMjh9LCAgIHstODIsIC04MX0sIHstODAsIC03OX0sIHszMCwgMzF9LAorICAgIHstNzgsIC03N30sIHstNzYsIC03NX0sIHszMywgNDB9LCAgIHszNCwgMzd9LCAgIHszNSwgMzZ9LCAgIHstNzQsIC01NX0sCisgICAgey01NCwgLTUzfSwgezM4LCAzOX0sICAgey01MiwgLTUxfSwgey01MCwgLTQ5fSwgezQxLCA0NH0sICAgezQyLCA0M30sCisgICAgey00OCwgLTQ3fSwgey00NiwgLTQ1fSwgezQ1LCA0Nn0sICAgey00NCwgLTQzfSwgey00MiwgNDd9LCAgey00MSwgLTQwfX07CiAKIGNvbnN0IFNDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZMZXZlbDExVFs2Ml1bMl0gPSB7Ci0gIHsgLTY0LCAgIDEgfSwgICAgeyAtNjUsICAgMiB9LCAgICB7IC02MywgICAzIH0sICAgIHsgLTY2LCAgIDQgfSwKLSAgeyAtNjIsICAgNSB9LCAgICB7IC02NywgICA2IH0sICAgIHsgLTYxLCAgIDcgfSwgICAgeyAtNjgsICAgOCB9LAotICB7IC02MCwgICA5IH0sICAgIHsgIDEwLCAgMTEgfSwgICAgeyAtNjksIC01OSB9LCAgICB7ICAxMiwgIDE0IH0sCi0gIHsgLTcwLCAgMTMgfSwgICAgeyAtNzEsIC01OCB9LCAgICB7ICAxNSwgIDE4IH0sICAgIHsgIDE2LCAgMTcgfSwKLSAgeyAtNzIsIC01NyB9LCAgICB7IC03MywgLTc0IH0sICAgIHsgIDE5LCAgMjIgfSwgICAgeyAtNTYsICAyMCB9LAotICB7IC01NSwgIDIxIH0sICAgIHsgLTU0LCAtNzcgfSwgICAgeyAgMjMsICAzMSB9LCAgICB7ICAyNCwgIDI1IH0sCi0gIHsgLTc1LCAtNzYgfSwgICAgeyAgMjYsICAyNyB9LCAgICB7IC03OCwgLTUzIH0sICAgIHsgIDI4LCAgMjkgfSwKLSAgeyAtNTIsIC05NSB9LCAgICB7IC05NCwgIDMwIH0sICAgIHsgLTkzLCAtOTIgfSwgICAgeyAgMzIsICA0NyB9LAotICB7ICAzMywgIDQwIH0sICAgIHsgIDM0LCAgMzcgfSwgICAgeyAgMzUsICAzNiB9LCAgICB7IC05MSwgLTkwIH0sCi0gIHsgLTg5LCAtODggfSwgICAgeyAgMzgsICAzOSB9LCAgICB7IC04NywgLTg2IH0sICAgIHsgLTg1LCAtODQgfSwKLSAgeyAgNDEsICA0NCB9LCAgICB7ICA0MiwgIDQzIH0sICAgIHsgLTgzLCAtODIgfSwgICAgeyAtODEsIC04MCB9LAotICB7ICA0NSwgIDQ2IH0sICAgIHsgLTc5LCAtNTEgfSwgICAgeyAtNTAsIC00OSB9LCAgICB7ICA0OCwgIDU1IH0sCi0gIHsgIDQ5LCAgNTIgfSwgICAgeyAgNTAsICA1MSB9LCAgICB7IC00OCwgLTQ3IH0sICAgIHsgLTQ2LCAtNDUgfSwKLSAgeyAgNTMsICA1NCB9LCAgICB7IC00NCwgLTQzIH0sICAgIHsgLTQyLCAtNDEgfSwgICAgeyAgNTYsICA1OSB9LAotICB7ICA1NywgIDU4IH0sICAgIHsgLTQwLCAtMzkgfSwgICAgeyAtMzgsIC0zNyB9LCAgICB7ICA2MCwgIDYxIH0sCi0gIHsgLTM2LCAtMzUgfSwgICAgeyAtMzQsIC0zMyB9Ci19OworICAgIHstNjQsIDF9LCAgIHstNjUsIDJ9LCAgIHstNjMsIDN9LCAgIHstNjYsIDR9LCAgIHstNjIsIDV9LCAgIHstNjcsIDZ9LAorICAgIHstNjEsIDd9LCAgIHstNjgsIDh9LCAgIHstNjAsIDl9LCAgIHsxMCwgMTF9LCAgIHstNjksIC01OX0sIHsxMiwgMTR9LAorICAgIHstNzAsIDEzfSwgIHstNzEsIC01OH0sIHsxNSwgMTh9LCAgIHsxNiwgMTd9LCAgIHstNzIsIC01N30sIHstNzMsIC03NH0sCisgICAgezE5LCAyMn0sICAgey01NiwgMjB9LCAgey01NSwgMjF9LCAgey01NCwgLTc3fSwgezIzLCAzMX0sICAgezI0LCAyNX0sCisgICAgey03NSwgLTc2fSwgezI2LCAyN30sICAgey03OCwgLTUzfSwgezI4LCAyOX0sICAgey01MiwgLTk1fSwgey05NCwgMzB9LAorICAgIHstOTMsIC05Mn0sIHszMiwgNDd9LCAgIHszMywgNDB9LCAgIHszNCwgMzd9LCAgIHszNSwgMzZ9LCAgIHstOTEsIC05MH0sCisgICAgey04OSwgLTg4fSwgezM4LCAzOX0sICAgey04NywgLTg2fSwgey04NSwgLTg0fSwgezQxLCA0NH0sICAgezQyLCA0M30sCisgICAgey04MywgLTgyfSwgey04MSwgLTgwfSwgezQ1LCA0Nn0sICAgey03OSwgLTUxfSwgey01MCwgLTQ5fSwgezQ4LCA1NX0sCisgICAgezQ5LCA1Mn0sICAgezUwLCA1MX0sICAgey00OCwgLTQ3fSwgey00NiwgLTQ1fSwgezUzLCA1NH0sICAgey00NCwgLTQzfSwKKyAgICB7LTQyLCAtNDF9LCB7NTYsIDU5fSwgICB7NTcsIDU4fSwgICB7LTQwLCAtMzl9LCB7LTM4LCAtMzd9LCB7NjAsIDYxfSwKKyAgICB7LTM2LCAtMzV9LCB7LTM0LCAtMzN9fTsKIAogY29uc3QgU0NIQVIgRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkxldmVsMTFGWzYyXVsyXSA9IHsKLSAgeyAtNjQsICAgMSB9LCAgICB7IC02NSwgICAyIH0sICAgIHsgLTYzLCAgIDMgfSwgICAgeyAtNjYsICAgNCB9LAotICB7IC02MiwgICA1IH0sICAgIHsgLTY3LCAgIDYgfSwgICAgeyAgIDcsICAgOCB9LCAgICB7IC02MSwgLTY4IH0sCi0gIHsgICA5LCAgMTAgfSwgICAgeyAtNjAsIC02OSB9LCAgICB7ICAxMSwgIDEyIH0sICAgIHsgLTU5LCAtNzAgfSwKLSAgeyAgMTMsICAxNCB9LCAgICB7IC01OCwgLTcxIH0sICAgIHsgIDE1LCAgMTYgfSwgICAgeyAtNTcsIC03MiB9LAotICB7ICAxNywgIDE5IH0sICAgIHsgLTU2LCAgMTggfSwgICAgeyAtNTUsIC03MyB9LCAgICB7ICAyMCwgIDI0IH0sCi0gIHsgIDIxLCAgMjIgfSwgICAgeyAtNzQsIC01NCB9LCAgICB7IC01MywgIDIzIH0sICAgIHsgLTc1LCAtNzYgfSwKLSAgeyAgMjUsICAzMCB9LCAgICB7ICAyNiwgIDI3IH0sICAgIHsgLTUyLCAtNTEgfSwgICAgeyAgMjgsICAyOSB9LAotICB7IC03NywgLTc5IH0sICAgIHsgLTUwLCAtNDkgfSwgICAgeyAgMzEsICAzOSB9LCAgICB7ICAzMiwgIDM1IH0sCi0gIHsgIDMzLCAgMzQgfSwgICAgeyAtNzgsIC00NiB9LCAgICB7IC04MiwgLTg4IH0sICAgIHsgIDM2LCAgMzcgfSwKLSAgeyAtODMsIC00OCB9LCAgICB7IC00NywgIDM4IH0sICAgIHsgLTg2LCAtODUgfSwgICAgeyAgNDAsICA0NyB9LAotICB7ICA0MSwgIDQ0IH0sICAgIHsgIDQyLCAgNDMgfSwgICAgeyAtODAsIC00NCB9LCAgICB7IC00MywgLTQyIH0sCi0gIHsgIDQ1LCAgNDYgfSwgICAgeyAtMzksIC04NyB9LCAgICB7IC04NCwgLTQwIH0sICAgIHsgIDQ4LCAgNTUgfSwKLSAgeyAgNDksICA1MiB9LCAgICB7ICA1MCwgIDUxIH0sICAgIHsgLTk1LCAtOTQgfSwgICAgeyAtOTMsIC05MiB9LAotICB7ICA1MywgIDU0IH0sICAgIHsgLTkxLCAtOTAgfSwgICAgeyAtODksIC04MSB9LCAgICB7ICA1NiwgIDU5IH0sCi0gIHsgIDU3LCAgNTggfSwgICAgeyAtNDUsIC00MSB9LCAgICB7IC0zOCwgLTM3IH0sICAgIHsgIDYwLCAgNjEgfSwKLSAgeyAtMzYsIC0zNSB9LCAgICB7IC0zNCwgLTMzIH0KLX07CisgICAgey02NCwgMX0sICAgey02NSwgMn0sICAgey02MywgM30sICAgey02NiwgNH0sICAgey02MiwgNX0sICAgey02NywgNn0sCisgICAgezcsIDh9LCAgICAgey02MSwgLTY4fSwgezksIDEwfSwgICAgey02MCwgLTY5fSwgezExLCAxMn0sICAgey01OSwgLTcwfSwKKyAgICB7MTMsIDE0fSwgICB7LTU4LCAtNzF9LCB7MTUsIDE2fSwgICB7LTU3LCAtNzJ9LCB7MTcsIDE5fSwgICB7LTU2LCAxOH0sCisgICAgey01NSwgLTczfSwgezIwLCAyNH0sICAgezIxLCAyMn0sICAgey03NCwgLTU0fSwgey01MywgMjN9LCAgey03NSwgLTc2fSwKKyAgICB7MjUsIDMwfSwgICB7MjYsIDI3fSwgICB7LTUyLCAtNTF9LCB7MjgsIDI5fSwgICB7LTc3LCAtNzl9LCB7LTUwLCAtNDl9LAorICAgIHszMSwgMzl9LCAgIHszMiwgMzV9LCAgIHszMywgMzR9LCAgIHstNzgsIC00Nn0sIHstODIsIC04OH0sIHszNiwgMzd9LAorICAgIHstODMsIC00OH0sIHstNDcsIDM4fSwgIHstODYsIC04NX0sIHs0MCwgNDd9LCAgIHs0MSwgNDR9LCAgIHs0MiwgNDN9LAorICAgIHstODAsIC00NH0sIHstNDMsIC00Mn0sIHs0NSwgNDZ9LCAgIHstMzksIC04N30sIHstODQsIC00MH0sIHs0OCwgNTV9LAorICAgIHs0OSwgNTJ9LCAgIHs1MCwgNTF9LCAgIHstOTUsIC05NH0sIHstOTMsIC05Mn0sIHs1MywgNTR9LCAgIHstOTEsIC05MH0sCisgICAgey04OSwgLTgxfSwgezU2LCA1OX0sICAgezU3LCA1OH0sICAgey00NSwgLTQxfSwgey0zOCwgLTM3fSwgezYwLCA2MX0sCisgICAgey0zNiwgLTM1fSwgey0zNCwgLTMzfX07CiAKIGNvbnN0IFNDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZCYWxhbmNlMTFUWzI0XVsyXSA9IHsKLSAgeyAtNjQsICAgMSB9LCAgICB7IC02MywgICAyIH0sICAgIHsgLTY1LCAgIDMgfSwgICAgeyAtNjYsICAgNCB9LAotICB7IC02MiwgICA1IH0sICAgIHsgLTYxLCAgIDYgfSwgICAgeyAtNjcsICAgNyB9LCAgICB7IC02OCwgICA4IH0sCi0gIHsgLTYwLCAgIDkgfSwgICAgeyAgMTAsICAxNiB9LCAgICB7ICAxMSwgIDEzIH0sICAgIHsgLTY5LCAgMTIgfSwKLSAgeyAtNzYsIC03NSB9LCAgICB7ICAxNCwgIDE1IH0sICAgIHsgLTc0LCAtNzMgfSwgICAgeyAtNzIsIC03MSB9LAotICB7ICAxNywgIDIwIH0sICAgIHsgIDE4LCAgMTkgfSwgICAgeyAtNzAsIC01OSB9LCAgICB7IC01OCwgLTU3IH0sCi0gIHsgIDIxLCAgMjIgfSwgICAgeyAtNTYsIC01NSB9LCAgICB7IC01NCwgIDIzIH0sICAgIHsgLTUzLCAtNTIgfQotfTsKKyAgICB7LTY0LCAxfSwgICB7LTYzLCAyfSwgICB7LTY1LCAzfSwgICB7LTY2LCA0fSwgICB7LTYyLCA1fSwgIHstNjEsIDZ9LAorICAgIHstNjcsIDd9LCAgIHstNjgsIDh9LCAgIHstNjAsIDl9LCAgIHsxMCwgMTZ9LCAgIHsxMSwgMTN9LCAgey02OSwgMTJ9LAorICAgIHstNzYsIC03NX0sIHsxNCwgMTV9LCAgIHstNzQsIC03M30sIHstNzIsIC03MX0sIHsxNywgMjB9LCAgezE4LCAxOX0sCisgICAgey03MCwgLTU5fSwgey01OCwgLTU3fSwgezIxLCAyMn0sICAgey01NiwgLTU1fSwgey01NCwgMjN9LCB7LTUzLCAtNTJ9fTsKIAogY29uc3QgU0NIQVIgRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkJhbGFuY2UxMUZbMjRdWzJdID0gewotICB7IC02NCwgICAxIH0sICAgIHsgLTY1LCAgIDIgfSwgICAgeyAtNjMsICAgMyB9LCAgICB7IC02NiwgICA0IH0sCi0gIHsgLTYyLCAgIDUgfSwgICAgeyAtNjEsICAgNiB9LCAgICB7IC02NywgICA3IH0sICAgIHsgLTY4LCAgIDggfSwKLSAgeyAtNjAsICAgOSB9LCAgICB7ICAxMCwgIDEzIH0sICAgIHsgLTY5LCAgMTEgfSwgICAgeyAtNTksICAxMiB9LAotICB7IC01OCwgLTc2IH0sICAgIHsgIDE0LCAgMTcgfSwgICAgeyAgMTUsICAxNiB9LCAgICB7IC03NSwgLTc0IH0sCi0gIHsgLTczLCAtNzIgfSwgICAgeyAgMTgsICAyMSB9LCAgICB7ICAxOSwgIDIwIH0sICAgIHsgLTcxLCAtNzAgfSwKLSAgeyAtNTcsIC01NiB9LCAgICB7ICAyMiwgIDIzIH0sICAgIHsgLTU1LCAtNTQgfSwgICAgeyAtNTMsIC01MiB9Ci19OworICAgIHstNjQsIDF9LCAgIHstNjUsIDJ9LCAgIHstNjMsIDN9LCAgIHstNjYsIDR9LCAgIHstNjIsIDV9LCAgIHstNjEsIDZ9LAorICAgIHstNjcsIDd9LCAgIHstNjgsIDh9LCAgIHstNjAsIDl9LCAgIHsxMCwgMTN9LCAgIHstNjksIDExfSwgIHstNTksIDEyfSwKKyAgICB7LTU4LCAtNzZ9LCB7MTQsIDE3fSwgICB7MTUsIDE2fSwgICB7LTc1LCAtNzR9LCB7LTczLCAtNzJ9LCB7MTgsIDIxfSwKKyAgICB7MTksIDIwfSwgICB7LTcxLCAtNzB9LCB7LTU3LCAtNTZ9LCB7MjIsIDIzfSwgICB7LTU1LCAtNTR9LCB7LTUzLCAtNTJ9fTsKIAogY29uc3QgU0NIQVIgRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX05vaXNlTGV2ZWwxMVRbNjJdWzJdID0gewotICB7IC02NCwgICAxIH0sICAgIHsgLTYzLCAgIDIgfSwgICAgeyAtNjUsICAgMyB9LCAgICB7IC02NiwgICA0IH0sCi0gIHsgLTYyLCAgIDUgfSwgICAgeyAtNjcsICAgNiB9LCAgICB7ICAgNywgICA4IH0sICAgIHsgLTYxLCAtNjggfSwKLSAgeyAgIDksICAzMCB9LCAgICB7ICAxMCwgIDE1IH0sICAgIHsgLTYwLCAgMTEgfSwgICAgeyAtNjksICAxMiB9LAotICB7ICAxMywgIDE0IH0sICAgIHsgLTU5LCAtNTMgfSwgICAgeyAtOTUsIC05NCB9LCAgICB7ICAxNiwgIDIzIH0sCi0gIHsgIDE3LCAgMjAgfSwgICAgeyAgMTgsICAxOSB9LCAgICB7IC05MywgLTkyIH0sICAgIHsgLTkxLCAtOTAgfSwKLSAgeyAgMjEsICAyMiB9LCAgICB7IC04OSwgLTg4IH0sICAgIHsgLTg3LCAtODYgfSwgICAgeyAgMjQsICAyNyB9LAotICB7ICAyNSwgIDI2IH0sICAgIHsgLTg1LCAtODQgfSwgICAgeyAtODMsIC04MiB9LCAgICB7ICAyOCwgIDI5IH0sCi0gIHsgLTgxLCAtODAgfSwgICAgeyAtNzksIC03OCB9LCAgICB7ICAzMSwgIDQ2IH0sICAgIHsgIDMyLCAgMzkgfSwKLSAgeyAgMzMsICAzNiB9LCAgICB7ICAzNCwgIDM1IH0sICAgIHsgLTc3LCAtNzYgfSwgICAgeyAtNzUsIC03NCB9LAotICB7ICAzNywgIDM4IH0sICAgIHsgLTczLCAtNzIgfSwgICAgeyAtNzEsIC03MCB9LCAgICB7ICA0MCwgIDQzIH0sCi0gIHsgIDQxLCAgNDIgfSwgICAgeyAtNTgsIC01NyB9LCAgICB7IC01NiwgLTU1IH0sICAgIHsgIDQ0LCAgNDUgfSwKLSAgeyAtNTQsIC01MiB9LCAgICB7IC01MSwgLTUwIH0sICAgIHsgIDQ3LCAgNTQgfSwgICAgeyAgNDgsICA1MSB9LAotICB7ICA0OSwgIDUwIH0sICAgIHsgLTQ5LCAtNDggfSwgICAgeyAtNDcsIC00NiB9LCAgICB7ICA1MiwgIDUzIH0sCi0gIHsgLTQ1LCAtNDQgfSwgICAgeyAtNDMsIC00MiB9LCAgICB7ICA1NSwgIDU4IH0sICAgIHsgIDU2LCAgNTcgfSwKLSAgeyAtNDEsIC00MCB9LCAgICB7IC0zOSwgLTM4IH0sICAgIHsgIDU5LCAgNjAgfSwgICAgeyAtMzcsIC0zNiB9LAotICB7IC0zNSwgIDYxIH0sICAgIHsgLTM0LCAtMzMgfQotfTsKKyAgICB7LTY0LCAxfSwgICB7LTYzLCAyfSwgICB7LTY1LCAzfSwgICB7LTY2LCA0fSwgICB7LTYyLCA1fSwgICB7LTY3LCA2fSwKKyAgICB7NywgOH0sICAgICB7LTYxLCAtNjh9LCB7OSwgMzB9LCAgICB7MTAsIDE1fSwgICB7LTYwLCAxMX0sICB7LTY5LCAxMn0sCisgICAgezEzLCAxNH0sICAgey01OSwgLTUzfSwgey05NSwgLTk0fSwgezE2LCAyM30sICAgezE3LCAyMH0sICAgezE4LCAxOX0sCisgICAgey05MywgLTkyfSwgey05MSwgLTkwfSwgezIxLCAyMn0sICAgey04OSwgLTg4fSwgey04NywgLTg2fSwgezI0LCAyN30sCisgICAgezI1LCAyNn0sICAgey04NSwgLTg0fSwgey04MywgLTgyfSwgezI4LCAyOX0sICAgey04MSwgLTgwfSwgey03OSwgLTc4fSwKKyAgICB7MzEsIDQ2fSwgICB7MzIsIDM5fSwgICB7MzMsIDM2fSwgICB7MzQsIDM1fSwgICB7LTc3LCAtNzZ9LCB7LTc1LCAtNzR9LAorICAgIHszNywgMzh9LCAgIHstNzMsIC03Mn0sIHstNzEsIC03MH0sIHs0MCwgNDN9LCAgIHs0MSwgNDJ9LCAgIHstNTgsIC01N30sCisgICAgey01NiwgLTU1fSwgezQ0LCA0NX0sICAgey01NCwgLTUyfSwgey01MSwgLTUwfSwgezQ3LCA1NH0sICAgezQ4LCA1MX0sCisgICAgezQ5LCA1MH0sICAgey00OSwgLTQ4fSwgey00NywgLTQ2fSwgezUyLCA1M30sICAgey00NSwgLTQ0fSwgey00MywgLTQyfSwKKyAgICB7NTUsIDU4fSwgICB7NTYsIDU3fSwgICB7LTQxLCAtNDB9LCB7LTM5LCAtMzh9LCB7NTksIDYwfSwgICB7LTM3LCAtMzZ9LAorICAgIHstMzUsIDYxfSwgIHstMzQsIC0zM319OwogCiBjb25zdCBTQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfTm9pc2VCYWxhbmNlMTFUWzI0XVsyXSA9IHsKLSAgeyAtNjQsICAgMSB9LCAgICB7IC02NSwgICAyIH0sICAgIHsgLTYzLCAgIDMgfSwgICAgeyAgIDQsICAgOSB9LAotICB7IC02NiwgICA1IH0sICAgIHsgLTYyLCAgIDYgfSwgICAgeyAgIDcsICAgOCB9LCAgICB7IC03NiwgLTc1IH0sCi0gIHsgLTc0LCAtNzMgfSwgICAgeyAgMTAsICAxNyB9LCAgICB7ICAxMSwgIDE0IH0sICAgIHsgIDEyLCAgMTMgfSwKLSAgeyAtNzIsIC03MSB9LCAgICB7IC03MCwgLTY5IH0sICAgIHsgIDE1LCAgMTYgfSwgICAgeyAtNjgsIC02NyB9LAotICB7IC02MSwgLTYwIH0sICAgIHsgIDE4LCAgMjEgfSwgICAgeyAgMTksICAyMCB9LCAgICB7IC01OSwgLTU4IH0sCi0gIHsgLTU3LCAtNTYgfSwgICAgeyAgMjIsICAyMyB9LCAgICB7IC01NSwgLTU0IH0sICAgIHsgLTUzLCAtNTIgfQotfTsKKyAgICB7LTY0LCAxfSwgICB7LTY1LCAyfSwgICB7LTYzLCAzfSwgICB7NCwgOX0sICAgICB7LTY2LCA1fSwgICB7LTYyLCA2fSwKKyAgICB7NywgOH0sICAgICB7LTc2LCAtNzV9LCB7LTc0LCAtNzN9LCB7MTAsIDE3fSwgICB7MTEsIDE0fSwgICB7MTIsIDEzfSwKKyAgICB7LTcyLCAtNzF9LCB7LTcwLCAtNjl9LCB7MTUsIDE2fSwgICB7LTY4LCAtNjd9LCB7LTYxLCAtNjB9LCB7MTgsIDIxfSwKKyAgICB7MTksIDIwfSwgICB7LTU5LCAtNTh9LCB7LTU3LCAtNTZ9LCB7MjIsIDIzfSwgICB7LTU1LCAtNTR9LCB7LTUzLCAtNTJ9fTsKIC8vQH0KIAotCi0KLQogLyohCiAgIFxuYW1lICBwYXJhbWV0cmljIHN0ZXJlbwogICBcYnJpZWYgY29uc3RhbnRzIHVzZWQgYnkgdGhlIHBhcmFtZXRyaWMgc3RlcmVvIHBhcnQgb2YgdGhlIGRlY29kZXIKIAogKi8KIAotCiAvKiBjb25zdGFudHMgdXNlZCBpbiBwc2JpdGRlYy5jcHAgKi8KIAogLyogRklYX0JPUkRFUiBjYW4gaGF2ZSAwLCAxLCAyLCA0IGVudmVsb3BlcyAqLwogY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfYUZpeE5vRW52RGVjb2RlWzRdID0gezAsIDEsIDIsIDR9OwogCi0KIC8qIElJRCAmIElDQyBIdWZmbWFuIGNvZGVib29rcyAqLwogY29uc3QgU0NIQVIgYUJvb2tQc0lpZFRpbWVEZWNvZGVbMjhdWzJdID0gewotICB7IC02NCwgICAxIH0sICAgIHsgLTY1LCAgIDIgfSwgICAgeyAtNjMsICAgMyB9LCAgICB7IC02NiwgICA0IH0sCi0gIHsgLTYyLCAgIDUgfSwgICAgeyAtNjcsICAgNiB9LCAgICB7IC02MSwgICA3IH0sICAgIHsgLTY4LCAgIDggfSwKLSAgeyAtNjAsICAgOSB9LCAgICB7IC02OSwgIDEwIH0sICAgIHsgLTU5LCAgMTEgfSwgICAgeyAtNzAsICAxMiB9LAotICB7IC01OCwgIDEzIH0sICAgIHsgLTU3LCAgMTQgfSwgICAgeyAtNzEsICAxNSB9LCAgICB7ICAxNiwgIDE3IH0sCi0gIHsgLTU2LCAtNzIgfSwgICAgeyAgMTgsICAyMSB9LCAgICB7ICAxOSwgIDIwIH0sICAgIHsgLTU1LCAtNzggfSwKLSAgeyAtNzcsIC03NiB9LCAgICB7ICAyMiwgIDI1IH0sICAgIHsgIDIzLCAgMjQgfSwgICAgeyAtNzUsIC03NCB9LAotICB7IC03MywgLTU0IH0sICAgIHsgIDI2LCAgMjcgfSwgICAgeyAtNTMsIC01MiB9LCAgICB7IC01MSwgLTUwIH0KLX07CisgICAgey02NCwgMX0sICAgey02NSwgMn0sICAgey02MywgM30sICAgey02NiwgNH0sICB7LTYyLCA1fSwgICB7LTY3LCA2fSwKKyAgICB7LTYxLCA3fSwgICB7LTY4LCA4fSwgICB7LTYwLCA5fSwgICB7LTY5LCAxMH0sIHstNTksIDExfSwgIHstNzAsIDEyfSwKKyAgICB7LTU4LCAxM30sICB7LTU3LCAxNH0sICB7LTcxLCAxNX0sICB7MTYsIDE3fSwgIHstNTYsIC03Mn0sIHsxOCwgMjF9LAorICAgIHsxOSwgMjB9LCAgIHstNTUsIC03OH0sIHstNzcsIC03Nn0sIHsyMiwgMjV9LCAgezIzLCAyNH0sICAgey03NSwgLTc0fSwKKyAgICB7LTczLCAtNTR9LCB7MjYsIDI3fSwgICB7LTUzLCAtNTJ9LCB7LTUxLCAtNTB9fTsKIAogY29uc3QgU0NIQVIgYUJvb2tQc0lpZEZyZXFEZWNvZGVbMjhdWzJdID0gewotICB7IC02NCwgICAxIH0sICAgIHsgICAyLCAgIDMgfSwgICAgeyAtNjMsIC02NSB9LCAgICB7ICAgNCwgICA1IH0sCi0gIHsgLTYyLCAtNjYgfSwgICAgeyAgIDYsICAgNyB9LCAgICB7IC02MSwgLTY3IH0sICAgIHsgICA4LCAgIDkgfSwKLSAgeyAtNjgsIC02MCB9LCAgICB7IC01OSwgIDEwIH0sICAgIHsgLTY5LCAgMTEgfSwgICAgeyAtNTgsICAxMiB9LAotICB7IC03MCwgIDEzIH0sICAgIHsgLTcxLCAgMTQgfSwgICAgeyAtNTcsICAxNSB9LCAgICB7ICAxNiwgIDE3IH0sCi0gIHsgLTU2LCAtNzIgfSwgICAgeyAgMTgsICAxOSB9LCAgICB7IC01NSwgLTU0IH0sICAgIHsgIDIwLCAgMjEgfSwKLSAgeyAtNzMsIC01MyB9LCAgICB7ICAyMiwgIDI0IH0sICAgIHsgLTc0LCAgMjMgfSwgICAgeyAtNzUsIC03OCB9LAotICB7ICAyNSwgIDI2IH0sICAgIHsgLTc3LCAtNzYgfSwgICAgeyAtNTIsICAyNyB9LCAgICB7IC01MSwgLTUwIH0KLX07CisgICAgey02NCwgMX0sICAgezIsIDN9LCAgICAgey02MywgLTY1fSwgezQsIDV9LCAgICB7LTYyLCAtNjZ9LCB7NiwgN30sCisgICAgey02MSwgLTY3fSwgezgsIDl9LCAgICAgey02OCwgLTYwfSwgey01OSwgMTB9LCB7LTY5LCAxMX0sICB7LTU4LCAxMn0sCisgICAgey03MCwgMTN9LCAgey03MSwgMTR9LCAgey01NywgMTV9LCAgezE2LCAxN30sICB7LTU2LCAtNzJ9LCB7MTgsIDE5fSwKKyAgICB7LTU1LCAtNTR9LCB7MjAsIDIxfSwgICB7LTczLCAtNTN9LCB7MjIsIDI0fSwgIHstNzQsIDIzfSwgIHstNzUsIC03OH0sCisgICAgezI1LCAyNn0sICAgey03NywgLTc2fSwgey01MiwgMjd9LCAgey01MSwgLTUwfX07CiAKIGNvbnN0IFNDSEFSIGFCb29rUHNJY2NUaW1lRGVjb2RlWzE0XVsyXSA9IHsKLSAgeyAtNjQsICAgMSB9LCAgICB7IC02MywgICAyIH0sICAgIHsgLTY1LCAgIDMgfSwgICAgeyAtNjIsICAgNCB9LAotICB7IC02NiwgICA1IH0sICAgIHsgLTYxLCAgIDYgfSwgICAgeyAtNjcsICAgNyB9LCAgICB7IC02MCwgICA4IH0sCi0gIHsgLTY4LCAgIDkgfSwgICAgeyAtNTksICAxMCB9LCAgICB7IC02OSwgIDExIH0sICAgIHsgLTU4LCAgMTIgfSwKLSAgeyAtNzAsICAxMyB9LCAgICB7IC03MSwgLTU3IH0KLX07CisgICAgey02NCwgMX0sIHstNjMsIDJ9LCB7LTY1LCAzfSwgIHstNjIsIDR9LCAgey02NiwgNX0sICB7LTYxLCA2fSwgIHstNjcsIDd9LAorICAgIHstNjAsIDh9LCB7LTY4LCA5fSwgey01OSwgMTB9LCB7LTY5LCAxMX0sIHstNTgsIDEyfSwgey03MCwgMTN9LCB7LTcxLCAtNTd9fTsKIAogY29uc3QgU0NIQVIgYUJvb2tQc0ljY0ZyZXFEZWNvZGVbMTRdWzJdID0gewotICB7IC02NCwgICAxIH0sICAgIHsgLTYzLCAgIDIgfSwgICAgeyAtNjUsICAgMyB9LCAgICB7IC02MiwgICA0IH0sCi0gIHsgLTY2LCAgIDUgfSwgICAgeyAtNjEsICAgNiB9LCAgICB7IC02NywgICA3IH0sICAgIHsgLTYwLCAgIDggfSwKLSAgeyAtNTksICAgOSB9LCAgICB7IC02OCwgIDEwIH0sICAgIHsgLTU4LCAgMTEgfSwgICAgeyAtNjksICAxMiB9LAotICB7IC01NywgIDEzIH0sICAgIHsgLTcwLCAtNzEgfQotfTsKKyAgICB7LTY0LCAxfSwgey02MywgMn0sIHstNjUsIDN9LCAgey02MiwgNH0sICB7LTY2LCA1fSwgIHstNjEsIDZ9LCAgey02NywgN30sCisgICAgey02MCwgOH0sIHstNTksIDl9LCB7LTY4LCAxMH0sIHstNTgsIDExfSwgey02OSwgMTJ9LCB7LTU3LCAxM30sIHstNzAsIC03MX19OwogCiAvKiBJSUQtZmluZSBIdWZmbWFuIGNvZGVib29rcyAqLwogCiBjb25zdCBTQ0hBUiBhQm9va1BzSWlkRmluZVRpbWVEZWNvZGVbNjBdWzJdID0gewotICB7ICAgMSwgLTY0IH0sICAgIHsgLTYzLCAgIDIgfSwgICAgeyAgIDMsIC02NSB9LCAgICB7ICAgNCwgIDU5IH0sCi0gIHsgICA1LCAgIDcgfSwgICAgeyAgIDYsIC02NyB9LCAgICB7IC02OCwgLTYwIH0sICAgIHsgLTYxLCAgIDggfSwKLSAgeyAgIDksICAxMSB9LCAgICB7IC01OSwgIDEwIH0sICAgIHsgLTcwLCAtNTggfSwgICAgeyAgMTIsICA0MSB9LAotICB7ICAxMywgIDIwIH0sICAgIHsgIDE0LCAtNzEgfSwgICAgeyAtNTUsICAxNSB9LCAgICB7IC01MywgIDE2IH0sCi0gIHsgIDE3LCAtNzcgfSwgICAgeyAgMTgsICAxOSB9LCAgICB7IC04NSwgLTg0IH0sICAgIHsgLTQ2LCAtNDUgfSwKLSAgeyAtNTcsICAyMSB9LCAgICB7ICAyMiwgIDQwIH0sICAgIHsgIDIzLCAgMjkgfSwgICAgeyAtNTEsICAyNCB9LAotICB7ICAyNSwgIDI2IH0sICAgIHsgLTgzLCAtODIgfSwgICAgeyAgMjcsICAyOCB9LCAgICB7IC05MCwgLTM4IH0sCi0gIHsgLTkyLCAtOTEgfSwgICAgeyAgMzAsICAzNyB9LCAgICB7ICAzMSwgIDM0IH0sICAgIHsgIDMyLCAgMzMgfSwKLSAgeyAtMzUsIC0zNCB9LCAgICB7IC0zNywgLTM2IH0sICAgIHsgIDM1LCAgMzYgfSwgICAgeyAtOTQsIC05MyB9LAotICB7IC04OSwgLTM5IH0sICAgIHsgIDM4LCAtNzkgfSwgICAgeyAgMzksIC04MSB9LCAgICB7IC04OCwgLTQwIH0sCi0gIHsgLTc0LCAtNTQgfSwgICAgeyAgNDIsIC02OSB9LCAgICB7ICA0MywgIDQ0IH0sICAgIHsgLTcyLCAtNTYgfSwKLSAgeyAgNDUsICA1MiB9LCAgICB7ICA0NiwgIDUwIH0sICAgIHsgIDQ3LCAtNzYgfSwgICAgeyAtNDksICA0OCB9LAotICB7IC00NywgIDQ5IH0sICAgIHsgLTg3LCAtNDEgfSwgICAgeyAtNTIsICA1MSB9LCAgICB7IC03OCwgLTUwIH0sCi0gIHsgIDUzLCAtNzMgfSwgICAgeyAgNTQsIC03NSB9LCAgICB7ICA1NSwgIDU3IH0sICAgIHsgIDU2LCAtODAgfSwKLSAgeyAtODYsIC00MiB9LCAgICB7IC00OCwgIDU4IH0sICAgIHsgLTQ0LCAtNDMgfSwgICAgeyAtNjYsIC02MiB9Ci19OwotCisgICAgezEsIC02NH0sICAgey02MywgMn0sICAgezMsIC02NX0sICAgezQsIDU5fSwgICAgezUsIDd9LCAgICAgezYsIC02N30sCisgICAgey02OCwgLTYwfSwgey02MSwgOH0sICAgezksIDExfSwgICAgey01OSwgMTB9LCAgey03MCwgLTU4fSwgezEyLCA0MX0sCisgICAgezEzLCAyMH0sICAgezE0LCAtNzF9LCAgey01NSwgMTV9LCAgey01MywgMTZ9LCAgezE3LCAtNzd9LCAgezE4LCAxOX0sCisgICAgey04NSwgLTg0fSwgey00NiwgLTQ1fSwgey01NywgMjF9LCAgezIyLCA0MH0sICAgezIzLCAyOX0sICAgey01MSwgMjR9LAorICAgIHsyNSwgMjZ9LCAgIHstODMsIC04Mn0sIHsyNywgMjh9LCAgIHstOTAsIC0zOH0sIHstOTIsIC05MX0sIHszMCwgMzd9LAorICAgIHszMSwgMzR9LCAgIHszMiwgMzN9LCAgIHstMzUsIC0zNH0sIHstMzcsIC0zNn0sIHszNSwgMzZ9LCAgIHstOTQsIC05M30sCisgICAgey04OSwgLTM5fSwgezM4LCAtNzl9LCAgezM5LCAtODF9LCAgey04OCwgLTQwfSwgey03NCwgLTU0fSwgezQyLCAtNjl9LAorICAgIHs0MywgNDR9LCAgIHstNzIsIC01Nn0sIHs0NSwgNTJ9LCAgIHs0NiwgNTB9LCAgIHs0NywgLTc2fSwgIHstNDksIDQ4fSwKKyAgICB7LTQ3LCA0OX0sICB7LTg3LCAtNDF9LCB7LTUyLCA1MX0sICB7LTc4LCAtNTB9LCB7NTMsIC03M30sICB7NTQsIC03NX0sCisgICAgezU1LCA1N30sICAgezU2LCAtODB9LCAgey04NiwgLTQyfSwgey00OCwgNTh9LCAgey00NCwgLTQzfSwgey02NiwgLTYyfX07CiAKIGNvbnN0IFNDSEFSIGFCb29rUHNJaWRGaW5lRnJlcURlY29kZVs2MF1bMl0gPSB7Ci0gIHsgICAxLCAtNjQgfSwgICAgeyAgIDIsICAgNCB9LCAgICB7ICAgMywgLTY1IH0sICAgIHsgLTY2LCAtNjIgfSwKLSAgeyAtNjMsICAgNSB9LCAgICB7ICAgNiwgICA3IH0sICAgIHsgLTY3LCAtNjEgfSwgICAgeyAgIDgsICAgOSB9LAotICB7IC02OCwgLTYwIH0sICAgIHsgIDEwLCAgMTEgfSwgICAgeyAtNjksIC01OSB9LCAgICB7ICAxMiwgIDEzIH0sCi0gIHsgLTcwLCAtNTggfSwgICAgeyAgMTQsICAxOCB9LCAgICB7IC01NywgIDE1IH0sICAgIHsgIDE2LCAtNzIgfSwKLSAgeyAtNTQsICAxNyB9LCAgICB7IC03NSwgLTUzIH0sICAgIHsgIDE5LCAgMzcgfSwgICAgeyAtNTYsICAyMCB9LAotICB7ICAyMSwgLTczIH0sICAgIHsgIDIyLCAgMjkgfSwgICAgeyAgMjMsIC03NiB9LCAgICB7ICAyNCwgLTc4IH0sCi0gIHsgIDI1LCAgMjggfSwgICAgeyAgMjYsICAyNyB9LCAgICB7IC04NSwgLTQzIH0sICAgIHsgLTgzLCAtNDUgfSwKLSAgeyAtODEsIC00NyB9LCAgICB7IC01MiwgIDMwIH0sICAgIHsgLTUwLCAgMzEgfSwgICAgeyAgMzIsIC03OSB9LAotICB7ICAzMywgIDM0IH0sICAgIHsgLTgyLCAtNDYgfSwgICAgeyAgMzUsICAzNiB9LCAgICB7IC05MCwgLTg5IH0sCi0gIHsgLTkyLCAtOTEgfSwgICAgeyAgMzgsIC03MSB9LCAgICB7IC01NSwgIDM5IH0sICAgIHsgIDQwLCAtNzQgfSwKLSAgeyAgNDEsICA1MCB9LCAgICB7ICA0MiwgLTc3IH0sICAgIHsgLTQ5LCAgNDMgfSwgICAgeyAgNDQsICA0NyB9LAotICB7ICA0NSwgIDQ2IH0sICAgIHsgLTg2LCAtNDIgfSwgICAgeyAtODgsIC04NyB9LCAgICB7ICA0OCwgIDQ5IH0sCi0gIHsgLTM5LCAtMzggfSwgICAgeyAtNDEsIC00MCB9LCAgICB7IC01MSwgIDUxIH0sICAgIHsgIDUyLCAgNTkgfSwKLSAgeyAgNTMsICA1NiB9LCAgICB7ICA1NCwgIDU1IH0sICAgIHsgLTM1LCAtMzQgfSwgICAgeyAtMzcsIC0zNiB9LAotICB7ICA1NywgIDU4IH0sICAgIHsgLTk0LCAtOTMgfSwgICAgeyAtODQsIC00NCB9LCAgICB7IC04MCwgLTQ4IH0KLX07CisgICAgezEsIC02NH0sICAgezIsIDR9LCAgICAgezMsIC02NX0sICAgey02NiwgLTYyfSwgey02MywgNX0sICAgezYsIDd9LAorICAgIHstNjcsIC02MX0sIHs4LCA5fSwgICAgIHstNjgsIC02MH0sIHsxMCwgMTF9LCAgIHstNjksIC01OX0sIHsxMiwgMTN9LAorICAgIHstNzAsIC01OH0sIHsxNCwgMTh9LCAgIHstNTcsIDE1fSwgIHsxNiwgLTcyfSwgIHstNTQsIDE3fSwgIHstNzUsIC01M30sCisgICAgezE5LCAzN30sICAgey01NiwgMjB9LCAgezIxLCAtNzN9LCAgezIyLCAyOX0sICAgezIzLCAtNzZ9LCAgezI0LCAtNzh9LAorICAgIHsyNSwgMjh9LCAgIHsyNiwgMjd9LCAgIHstODUsIC00M30sIHstODMsIC00NX0sIHstODEsIC00N30sIHstNTIsIDMwfSwKKyAgICB7LTUwLCAzMX0sICB7MzIsIC03OX0sICB7MzMsIDM0fSwgICB7LTgyLCAtNDZ9LCB7MzUsIDM2fSwgICB7LTkwLCAtODl9LAorICAgIHstOTIsIC05MX0sIHszOCwgLTcxfSwgIHstNTUsIDM5fSwgIHs0MCwgLTc0fSwgIHs0MSwgNTB9LCAgIHs0MiwgLTc3fSwKKyAgICB7LTQ5LCA0M30sICB7NDQsIDQ3fSwgICB7NDUsIDQ2fSwgICB7LTg2LCAtNDJ9LCB7LTg4LCAtODd9LCB7NDgsIDQ5fSwKKyAgICB7LTM5LCAtMzh9LCB7LTQxLCAtNDB9LCB7LTUxLCA1MX0sICB7NTIsIDU5fSwgICB7NTMsIDU2fSwgICB7NTQsIDU1fSwKKyAgICB7LTM1LCAtMzR9LCB7LTM3LCAtMzZ9LCB7NTcsIDU4fSwgICB7LTk0LCAtOTN9LCB7LTg0LCAtNDR9LCB7LTgwLCAtNDh9fTsKIAogLyogY29uc3RhbnRzIHVzZWQgaW4gcHNkZWMuY3BwICovCiAKLWNvbnN0IEZJWFBfREJMIGRlY2F5U2NhbGVGYWN0VGFibGVbNjRdID0gewotCi0gRkwyRlhDT05TVF9EQkwoMS4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgxLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDEuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMS4wMDAwMDApLAotIEZMMkZYQ09OU1RfREJMKDAuOTUwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC45MDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjg1MDAwMCksIEZMMkZYQ09OU1RfREJMKDAuODAwMDAwKSwKLSBGTDJGWENPTlNUX0RCTCgwLjc1MDAwMCksIEZMMkZYQ09OU1RfREJMKDAuNzAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC42NTAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjYwMDAwMCksCi0gRkwyRlhDT05TVF9EQkwoMC41NTAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjUwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuNDUwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC40MDAwMDApLAotIEZMMkZYQ09OU1RfREJMKDAuMzUwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4zMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjI1MDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMjAwMDAwKSwKLSBGTDJGWENPTlNUX0RCTCgwLjE1MDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMTAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wNTAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksCi0gRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLAotIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwKLSBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksCi0gRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLAotIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwKLSBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksCi0gRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLAotIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwKLSBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksCi0gRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApLCBGTDJGWENPTlNUX0RCTCgwLjAwMDAwMCksIEZMMkZYQ09OU1RfREJMKDAuMDAwMDAwKSwgRkwyRlhDT05TVF9EQkwoMC4wMDAwMDApIH07Ci0KIC8qIHRoZSB2YWx1ZXMgb2YgdGhlIGZvbGxvd2luZyAzIHRhYmxlcyBhcmUgc2hpZnRldCByaWdodCBieSAxICEgKi8KIGNvbnN0IEZJWFBfREJMIFNjYWxlRmFjdG9yc1tOT19JSURfTEVWRUxTXSA9IHsKIAogICAgIDB4NWE1ZGVkMDAsIDB4NTljZDA0MDAsIDB4NThjMjk2ODAsIDB4NTY0YzJlODAsIDB4NTJhM2Q0ODAsCiAgICAgMHg0YzhiZTA4MCwgMHg0NmRmMzA4MCwgMHg0MDAwMDAwMCwgMHgzODRiYTVjMCwgMHgzMDRjMjk4MCwKLSAgICAweDI0ZTlmNjQwLCAweDFiNGEyOTQwLCAweDExYjVjMGEwLCAweDBiNGUyNTQwLCAweDA1MTRlYTkwCi19OworICAgIDB4MjRlOWY2NDAsIDB4MWI0YTI5NDAsIDB4MTFiNWMwYTAsIDB4MGI0ZTI1NDAsIDB4MDUxNGVhOTB9OwogCiBjb25zdCBGSVhQX0RCTCBTY2FsZUZhY3RvcnNGaW5lW05PX0lJRF9MRVZFTFNfRklORV0gPSB7CiAKLSAgICAweDVhODI1YzAwLCAweDVhODIxYzAwLCAweDVhODE1MTAwLCAweDVhN2VkMDAwLCAweDVhNzZlNjAwLAotICAgIDB4NWE1ZGVkMDAsIDB4NWEzOWI4ODAsIDB4NTlmMWZkMDAsIDB4NTk2NGQ2ODAsIDB4NTg1MmNhMDAsCi0gICAgMHg1NjRjMmU4MCwgMHg1NDE3NDQ4MCwgMHg1MGVhNzUwMCwgMHg0YzhiZTA4MCwgMHg0NmRmMzA4MCwKLSAgICAweDQwMDAwMDAwLCAweDM4NGJhNWMwLCAweDMwNGMyOTgwLCAweDI4OGRkMjQwLCAweDIxN2EyOTAwLAotICAgIDB4MWI0YTI5NDAsIDB4MTNjNWVjZTAsIDB4MGUyYjAwOTAsIDB4MGExNzhlZjAsIDB4MDcyYWI3OTgsCi0gICAgMHgwNTE0ZWE5MCwgMHgwMmRjNTk0NCwgMHgwMTliZjg3YywgMHgwMGU3YjE3MywgMHgwMDgyNGI4YiwKLSAgICAweDAwNDk0NTY4Ci19OworICAgIDB4NWE4MjVjMDAsIDB4NWE4MjFjMDAsIDB4NWE4MTUxMDAsIDB4NWE3ZWQwMDAsIDB4NWE3NmU2MDAsIDB4NWE1ZGVkMDAsCisgICAgMHg1YTM5Yjg4MCwgMHg1OWYxZmQwMCwgMHg1OTY0ZDY4MCwgMHg1ODUyY2EwMCwgMHg1NjRjMmU4MCwgMHg1NDE3NDQ4MCwKKyAgICAweDUwZWE3NTAwLCAweDRjOGJlMDgwLCAweDQ2ZGYzMDgwLCAweDQwMDAwMDAwLCAweDM4NGJhNWMwLCAweDMwNGMyOTgwLAorICAgIDB4Mjg4ZGQyNDAsIDB4MjE3YTI5MDAsIDB4MWI0YTI5NDAsIDB4MTNjNWVjZTAsIDB4MGUyYjAwOTAsIDB4MGExNzhlZjAsCisgICAgMHgwNzJhYjc5OCwgMHgwNTE0ZWE5MCwgMHgwMmRjNTk0NCwgMHgwMTliZjg3YywgMHgwMGU3YjE3MywgMHgwMDgyNGI4YiwKKyAgICAweDAwNDk0NTY4fTsKIGNvbnN0IEZJWFBfREJMIEFscGhhc1tOT19JQ0NfTEVWRUxTXSA9IHsKIAogICAgIDB4MDAwMDAwMDAsIDB4MGI2YjViZTAsIDB4MTI0ODVmODAsIDB4MWRhMmZhNDAsCi0gICAgMHgyNjM3ZWJjMCwgMHgzMjQzZjZjMCwgMHg0NjZiNzQ4MCwgMHg2NDg3ZWQ4MAotfTsKKyAgICAweDI2MzdlYmMwLCAweDMyNDNmNmMwLCAweDQ2NmI3NDgwLCAweDY0ODdlZDgwfTsKIAotI2lmIGRlZmluZWQoQVJDSF9QUkVGRVJfTVVMVF8zMngxNikKLSNkZWZpbmUgIEZJWFBfUFMgRklYUF9TR0wKLSNkZWZpbmUgIEZYUF9DQVNUKGEpIEZYX0RCTDJGWF9TR0woKEZJWFBfREJMKWEpCi0jZGVmaW5lICBGTDJGWENPTlNUX1BTIEZMMkZYQ09OU1RfU0dMCi0jZWxzZQotI2RlZmluZSAgRklYUF9QUyBGSVhQX0RCTAotI2RlZmluZSAgRlhQX0NBU1QoeCkgKChGSVhQX0RCTCkoeCkpCi0jZGVmaW5lICBGTDJGWENPTlNUX1BTIEZMMkZYQ09OU1RfREJMCi0jZW5kaWYKK2NvbnN0IFVDSEFSIGJpbnMyZ3JvdXBNYXAyMFtOT19JSURfR1JPVVBTXSA9IHsKKyAgICAwLCAwLCAxLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOX07CiAKLWNvbnN0IEZJWFBfUFMgYUFsbHBhc3NMaW5rRGVjYXlTZXJbTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdID0gewotRlhQX0NBU1QoMHg1MzYyNWIwMCksIEZYUF9DQVNUKDB4NDg0OGFmMDApLCBGWFBfQ0FTVCgweDNlYTk0ZDAwKSB9OworY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfYU5vSWlkQmluc1szXSA9IHsKKyAgICBOT19MT1dfUkVTX0lJRF9CSU5TLCBOT19NSURfUkVTX0lJRF9CSU5TLCBOT19ISV9SRVNfSUlEX0JJTlN9OwogCi1jb25zdCBGSVhQX1BTIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yUmVRbWZbTk9fUU1GX0NIQU5ORUxTXSA9IHsKLUZYUF9DQVNUKDB4NjhiOTIxODApLCBGWFBfQ0FTVCgweGRlMzk2OTAwKSwgRlhQX0NBU1QoMHg4MDY1MDM4MCksIEZYUF9DQVNUKDB4Y2I1MzdlNDApLCBGWFBfQ0FTVCgweDViZWI4ZjAwKSwgRlhQX0NBU1QoMHg3MmYyOTIwMCksIEZYUF9DQVNUKDB4ZjFmNDNjNTApLCBGWFBfQ0FTVCgweDgzODk2MjgwKSwKLUZYUF9DQVNUKDB4YjliOTljMDApLCBGWFBfQ0FTVCgweDRjZGE4ZjAwKSwgRlhQX0NBU1QoMHg3YTU3NmUwMCksIEZYUF9DQVNUKDB4MDYwNzk5ZTApLCBGWFBfQ0FTVCgweDg5YmU1MjgwKSwgRlhQX0NBU1QoMHhhOWRhYjYwMCksIEZYUF9DQVNUKDB4M2JlNTFiMDApLCBGWFBfQ0FTVCgweDdlYjkxOTAwKSwKLUZYUF9DQVNUKDB4MTlmNGY1NDApLCBGWFBfQ0FTVCgweDkyZGNiMzgwKSwgRlhQX0NBU1QoMHg5YzFhZDcwMCksIEZYUF9DQVNUKDB4Mjk3NjE5NDApLCBGWFBfQ0FTVCgweDdmZmJmNTAwKSwgRlhQX0NBU1QoMHgyZDNlYjE4MCksIEZYUF9DQVNUKDB4OWVhYjBhMDApLCBGWFBfQ0FTVCgweDkwZDBhYTgwKSwKLUZYUF9DQVNUKDB4MTYwMWJjYzApLCBGWFBfQ0FTVCgweDdlMTgwZTgwKSwgRlhQX0NBU1QoMHgzZjZiMzk0MCksIEZYUF9DQVNUKDB4YWNkZWViMDApLCBGWFBfQ0FTVCgweDg4NDM1YjAwKSwgRlhQX0NBU1QoMHgwMjAyYTc2OCksIEZYUF9DQVNUKDB4NzkxOTRmODApLCBGWFBfQ0FTVCgweDUwMDdmZDAwKSwKLUZYUF9DQVNUKDB4YmQxZWNmMDApLCBGWFBfQ0FTVCgweDgyYThkMTAwKSwgRlhQX0NBU1QoMHhlZGY2ZTVlMCksIEZYUF9DQVNUKDB4NzExZjM1MDApLCBGWFBfQ0FTVCgweDVlYWM0NDgwKSwgRlhQX0NBU1QoMHhjZjA0NDdjMCksIEZYUF9DQVNUKDB4ODAyNDVmODApLCBGWFBfQ0FTVCgweGRhNWNkNGMwKSwKLUZYUF9DQVNUKDB4NjY1YzA4MDApLCBGWFBfQ0FTVCgweDZhZmJjNTAwKSwgRlhQX0NBU1QoMHhlMjFlODVlMCksIEZYUF9DQVNUKDB4ODBjNWU1MDApLCBGWFBfQ0FTVCgweGM3YjAwM2MwKSwgRlhQX0NBU1QoMHg1OTEzOWY4MCksIEZYUF9DQVNUKDB4NzRhOGU0MDApLCBGWFBfQ0FTVCgweGY1ZjUxZjQwKSwKLUZYUF9DQVNUKDB4ODQ4OTY2ODApLCBGWFBfQ0FTVCgweGI2NjYyYjAwKSwgRlhQX0NBU1QoMHg0OTk5YjYwMCksIEZYUF9DQVNUKDB4N2I3NmEzMDApLCBGWFBfQ0FTVCgweDBhMGIwNjUwKSwgRlhQX0NBU1QoMHg4YjU3MmI4MCksIEZYUF9DQVNUKDB4YTZlYzQ1ODApLCBGWFBfQ0FTVCgweDM4NGZkYTgwKSwKLUZYUF9DQVNUKDB4N2YzYTFmMDApLCBGWFBfQ0FTVCgweDFkZTE5ZWMwKSwgRlhQX0NBU1QoMHg5NTA0NTAwMCksIEZYUF9DQVNUKDB4OTlhM2UxODApLCBGWFBfQ0FTVCgweDI1YTMwNzQwKSwgRlhQX0NBU1QoMHg3ZmRiOWU4MCksIEZYUF9DQVNUKDB4MzBmYmRiMDApLCBGWFBfQ0FTVCgweGExNTNkNTAwKSB9OwotCi1jb25zdCBGSVhQX1BTIGFhRnJhY3REZWxheVBoYXNlRmFjdG9ySW1RbWZbTk9fUU1GX0NIQU5ORUxTXSA9IHsKLUZYUF9DQVNUKDB4YjY2NjNhODApLCBGWFBfQ0FTVCgweDg0ODk2MjAwKSwgRlhQX0NBU1QoMHhmNWY1MGM3MCksIEZYUF9DQVNUKDB4NzRhOGRjODApLCBGWFBfQ0FTVCgweDU5MTNhZDAwKSwgRlhQX0NBU1QoMHhjN2IwMTQ4MCksIEZYUF9DQVNUKDB4ODBjNWUzMDApLCBGWFBfQ0FTVCgweGUyMWU3M2EwKSwKLUZYUF9DQVNUKDB4NmFmYmJhODApLCBGWFBfQ0FTVCgweDY2NWMxMzgwKSwgRlhQX0NBU1QoMHhkYTVjZTZjMCksIEZYUF9DQVNUKDB4ODAyNDYwODApLCBGWFBfQ0FTVCgweGNmMDQzNjQwKSwgRlhQX0NBU1QoMHg1ZWFjMzgwMCksIEZYUF9DQVNUKDB4NzExZjNlMDApLCBGWFBfQ0FTVCgweGVkZjZmOGEwKSwKLUZYUF9DQVNUKDB4ODJhOGQ1MDApLCBGWFBfQ0FTVCgweGJkMWViZTgwKSwgRlhQX0NBU1QoMHg1MDA3ZWUwMCksIEZYUF9DQVNUKDB4NzkxOTU1ODApLCBGWFBfQ0FTVCgweDAyMDJiYTQwKSwgRlhQX0NBU1QoMHg4ODQzNjE4MCksIEZYUF9DQVNUKDB4YWNkZWRjODApLCBGWFBfQ0FTVCgweDNmNmIyOGMwKSwKLUZYUF9DQVNUKDB4N2UxODExODApLCBGWFBfQ0FTVCgweDE2MDFjZjQwKSwgRlhQX0NBU1QoMHg5MGQwYjM4MCksIEZYUF9DQVNUKDB4OWVhYWZkODApLCBGWFBfQ0FTVCgweDJkM2U5ZmMwKSwgRlhQX0NBU1QoMHg3ZmZiZjU4MCksIEZYUF9DQVNUKDB4Mjk3NjJiMDApLCBGWFBfQ0FTVCgweDljMWFlMjgwKSwKLUZYUF9DQVNUKDB4OTJkY2E5ODApLCBGWFBfQ0FTVCgweDE5ZjRlMmMwKSwgRlhQX0NBU1QoMHg3ZWI5MTY4MCksIEZYUF9DQVNUKDB4M2JlNTJiODApLCBGWFBfQ0FTVCgweGE5ZGFjNDAwKSwgRlhQX0NBU1QoMHg4OWJlNGI4MCksIEZYUF9DQVNUKDB4MDYwNzg3MTApLCBGWFBfQ0FTVCgweDdhNTc2ODgwKSwKLUZYUF9DQVNUKDB4NGNkYTllMDApLCBGWFBfQ0FTVCgweGI5YjlhYzAwKSwgRlhQX0NBU1QoMHg4Mzg5NWUwMCksIEZYUF9DQVNUKDB4ZjFmNDI5OTApLCBGWFBfQ0FTVCgweDcyZjI4YTAwKSwgRlhQX0NBU1QoMHg1YmViOWMwMCksIEZYUF9DQVNUKDB4Y2I1MzhmNDApLCBGWFBfQ0FTVCgweDgwNjUwMjAwKSwKLUZYUF9DQVNUKDB4ZGUzOTU2YzApLCBGWFBfQ0FTVCgweDY4YjkxNjgwKSwgRlhQX0NBU1QoMHg2OGI5MmMwMCksIEZYUF9DQVNUKDB4ZGUzOTdiNDApLCBGWFBfQ0FTVCgweDgwNjUwNTAwKSwgRlhQX0NBU1QoMHhjYjUzNmQwMCksIEZYUF9DQVNUKDB4NWJlYjgxODApLCBGWFBfQ0FTVCgweDcyZjI5YTgwKSwKLUZYUF9DQVNUKDB4ZjFmNDRmMTApLCBGWFBfQ0FTVCgweDgzODk2NzAwKSwgRlhQX0NBU1QoMHhiOWI5OGM4MCksIEZYUF9DQVNUKDB4NGNkYTgwMDApLCBGWFBfQ0FTVCgweDdhNTc3MzgwKSwgRlhQX0NBU1QoMHgwNjA3YWNiOCksIEZYUF9DQVNUKDB4ODliZTVhMDApLCBGWFBfQ0FTVCgweGE5ZGFhODAwKSB9OwotCi1jb25zdCBGSVhQX1BTIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yUmVTdWJRbWYyMFtOT19TVUJfUU1GX0NIQU5ORUxTXSA9IHsKLUZYUF9DQVNUKDB4N2U4MDczODApLCBGWFBfQ0FTVCgweDcyYjliYjAwKSwgRlhQX0NBU1QoMHg1YzQ0ZWU4MCksIEZYUF9DQVNUKDB4M2QzOTM4YzApLCBGWFBfQ0FTVCgweDgwMDAwMDAwKSwgRlhQX0NBU1QoMHg4MDAwMDAwMCksCi1GWFBfQ0FTVCgweDcyYjliYjAwKSwgRlhQX0NBU1QoMHg3ZTgwNzM4MCksIEZYUF9DQVNUKDB4YmE5MTQ3MDApLCBGWFBfQ0FTVCgweDA1MDY3N2IwKSwgRlhQX0NBU1QoMHg4OTVjYzM4MCksIEZYUF9DQVNUKDB4ODM0ZTQ5MDApIH07Ci0KLWNvbnN0IEZJWFBfUFMgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JJbVN1YlFtZjIwW05PX1NVQl9RTUZfQ0hBTk5FTFNdID0gewotRlhQX0NBU1QoMHhlYzc5MTcyMCksIEZYUF9DQVNUKDB4YzczY2EwODApLCBGWFBfQ0FTVCgweGE3NDhlYTAwKSwgRlhQX0NBU1QoMHg4Zjk3Njk4MCksIEZYUF9DQVNUKDB4MDAwMDAwMDApLCBGWFBfQ0FTVCgweDAwMDAwMDAwKSwKLUZYUF9DQVNUKDB4MzhjMzVmODApLCBGWFBfQ0FTVCgweDEzODZlOGUwKSwgRlhQX0NBU1QoMHg5NDc3ZDAwMCksIEZYUF9DQVNUKDB4ODAxOTQzODApLCBGWFBfQ0FTVCgweGNmZjI2MTQwKSwgRlhQX0NBU1QoMHgxY2U3MGQ0MCkgfTsKLQotY29uc3QgRklYUF9QUyBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlclJlUW1mW05PX1FNRl9DSEFOTkVMU11bTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdID0gewote0ZYUF9DQVNUKDB4NjNlNTI0ODApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg2ZDczYWYwMCl9LCB7RlhQX0NBU1QoMHhjN2IwMTI4MCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweGY3YzMxY2IwKX0sIHtGWFBfQ0FTVCgweDgzODk2MjAwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4OGFlZTI3MDApfSwKLXtGWFBfQ0FTVCgweDAyMDJiMzMwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4OWJmYWI1MDApfSwge0ZYUF9DQVNUKDB4N2Q1NzJjODApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHgxODkzYjk2MCl9LCB7RlhQX0NBU1QoMHgzNGFjN2ZjMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDdhYmY3OTgwKX0sCi17RlhQX0NBU1QoMHg5OWEzZWUwMCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDU4ZWVhZDgwKX0sIHtGWFBfQ0FTVCgweDllYWIwNTgwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4ZDc3ZGFlNDApfSwge0ZYUF9DQVNUKDB4M2JlNTIxNDApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg4MTliODUwMCl9LAote0ZYUF9DQVNUKDB4N2I3NjlkODApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHhiM2ExMjI4MCl9LCB7RlhQX0NBU1QoMHhmOWY4Njg3OCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDM3YzUxOWMwKX0sIHtGWFBfQ0FTVCgweDgxZTdlZjgwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4N2ZmMTY4ODApfSwKLXtGWFBfQ0FTVCgweGNmMDQzY2MwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4M2U4YjIzNDApfSwge0ZYUF9DQVNUKDB4NjhiOTIyODApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHhiOWU0YTkwMCl9LCB7RlhQX0NBU1QoMHg1ZWFjMzk4MCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDgwYTA1MjAwKX0sCi17RlhQX0NBU1QoMHhjMDk0Y2QwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweGQwNTFkYzgwKX0sIHtGWFBfQ0FTVCgweDg1YTg5NDAwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4NTM0ODNiMDApfSwge0ZYUF9DQVNUKDB4MGEwYWY1ZTApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg3Y2IxYjY4MCl9LAote0ZYUF9DQVNUKDB4N2ViOTE5MDApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHgyMDA2ZThjMCl9LCB7RlhQX0NBU1QoMHgyZDNlYTY4MCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweGEwZWMxYzAwKX0sIHtGWFBfQ0FTVCgweDk1MDQ0MTgwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4ODgwZDIxODApfSwKLXtGWFBfQ0FTVCgweGE0MTQ3MzAwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4ZjAyODI4NzApfSwge0ZYUF9DQVNUKDB4NDJlMTNmODApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg2OTRjNGEwMCl9LCB7RlhQX0NBU1QoMHg3OTE5NTIwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweDcxMzc0NzgwKX0sCi17RlhQX0NBU1QoMHhmMWY0MzU1MCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweGZmNjU5M2VhKX0sIHtGWFBfQ0FTVCgweDgwYzVlMjgwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4OGUzOWVjMDApfSwge0ZYUF9DQVNUKDB4ZDY4OWU0ODApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHg5NzY0ODEwMCl9LAote0ZYUF9DQVNUKDB4NmQyMzUzMDApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHgxMTBhMjBjMCl9LCB7RlhQX0NBU1QoMHg1OTEzYTgwMCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDc4NWQ0ZjgwKX0sIHtGWFBfQ0FTVCgweGI5Yjk5YTAwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4NWU0NDA4ODApfSwKLXtGWFBfQ0FTVCgweDg4NDM2MTAwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4ZGVjZTcwMDApfSwge0ZYUF9DQVNUKDB4MTIwOTEzMjApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg4MzA5ZjgwMCl9LCB7RlhQX0NBU1QoMHg3ZjlhZmQwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweGFkYTMzZjAwKX0sCi17RlhQX0NBU1QoMHgyNWEzMTcwMCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDMwY2MzNjAwKX0sIHtGWFBfQ0FTVCgweDkwZDBhYjgwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4N2Y3Y2JlODApfSwge0ZYUF9DQVNUKDB4YTlkYWJmMDApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHg0NTE4MjU4MCl9LAote0ZYUF9DQVNUKDB4NDk5OWNiODApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHhjMDY4MWM4MCl9LCB7RlhQX0NBU1QoMHg3NjQxYWM4MCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDgwMTk0MzgwKX0sIHtGWFBfQ0FTVCgweGU5ZmUzMzAwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4Yzk1MTg0YzApfSwKLXtGWFBfQ0FTVCgweDgwMjQ2MDAwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4NGQ1NWQ4MDApfSwge0ZYUF9DQVNUKDB4ZGUzOTZmYzApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg3ZTMyNDAwMCl9LCB7RlhQX0NBU1QoMHg3MTFmM2YwMCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDI3NWNlNDgwKX0sCi17RlhQX0NBU1QoMHg1MzIxMTcwMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweGE2MzQzNTgwKX0sIHtGWFBfQ0FTVCgweGIzMjU2NzgwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4ODU5OTdiODApfSwge0ZYUF9DQVNUKDB4OGI1NzI2ODApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHhlODliYTY2MCl9LAote0ZYUF9DQVNUKDB4MTlmNGY3ODApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHg2NGM0ZTEwMCl9LCB7RlhQX0NBU1QoMHg3ZmZiZjU4MCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDc0OTNhMzgwKX0sIHtGWFBfQ0FTVCgweDFkZTE4MTAwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4MDcwODk3ZjApfSwKLXtGWFBfQ0FTVCgweDhkMGQ2YTgwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4OTFlZDZmMDApfSwge0ZYUF9DQVNUKDB4YWZmODEzODApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg5MzJkYjAwMCl9LCB7RlhQX0NBU1QoMHg1MDA3ZmIwMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDA5NzBmZWIwKX0sCi17RlhQX0NBU1QoMHg3MmYyOGQwMCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDc1OGQ2NTAwKX0sIHtGWFBfQ0FTVCgweGUyMWU2Y2MwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4NjM0MzZmODApfSwge0ZYUF9DQVNUKDB4ODAwNDBiMDApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHhlNjNkNzYwMCl9LAote0ZYUF9DQVNUKDB4ZTYwYjFhZTApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg4NGVhNWM4MCl9LCB7RlhQX0NBU1QoMHg3NGE4ZTEwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweGE3ZjA3NTAwKX0sIHtGWFBfQ0FTVCgweDRjZGE4OTgwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4MjlhNmQzNDApfSwKLXtGWFBfQ0FTVCgweGFjZGVkYTgwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4N2U5M2Q2MDApfSwge0ZYUF9DQVNUKDB4OGVlMGM5ODApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHg0YjY2MjY4MCl9LCB7RlhQX0NBU1QoMHgyMWM2YTI4MCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweGM3MjU4YzgwKX0sCi17RlhQX0NBU1QoMHg3ZmRiOWYwMCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDgwMDZkNTAwKX0sIHtGWFBfQ0FTVCgweDE2MDFiYTYwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4YzI4MzA5NDApfSwge0ZYUF9DQVNUKDB4ODliZTRjODApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg0NzFjZjEwMCl9LAote0ZYUF9DQVNUKDB4YjY2NjQ0MDApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg3ZjNmYjgwMCl9fTsKLQotY29uc3QgRklYUF9QUyBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlckltUW1mW05PX1FNRl9DSEFOTkVMU11bTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdID0gewote0ZYUF9DQVNUKDB4YWZmODBjODApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHhiZGEyOWUwMCl9LCB7RlhQX0NBU1QoMHg4ZDBkNmYwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweDgwNDNlZTgwKX0sIHtGWFBfQ0FTVCgweDFkZTE4YTIwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4Y2MzZTc4NDApfSwKLXtGWFBfQ0FTVCgweDdmZmJmNTAwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4NGZkZmMxODApfSwge0ZYUF9DQVNUKDB4MTlmNGVlNDApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHg3ZDllNGMwMCl9LCB7RlhQX0NBU1QoMHg4YjU3MjMwMCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDI0NGEyOTQwKX0sCi17RlhQX0NBU1QoMHhiMzI1NmYwMCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweGEzZjBhNTAwKX0sIHtGWFBfQ0FTVCgweDUzMjExZTAwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4ODY5NDQ1MDApfSwge0ZYUF9DQVNUKDB4NzExZjNhODApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHhlYmM3MjA0MCl9LAote0ZYUF9DQVNUKDB4ZGUzOTY2YzApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg2NmI4N2UwMCl9LCB7RlhQX0NBU1QoMHg4MDI0NjA4MCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweDczMzYyYzAwKX0sIHtGWFBfQ0FTVCgweGU5ZmUzYzQwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4MDNkMWQxMTApfSwKLXtGWFBfQ0FTVCgweDc2NDFiMDAwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4OTA1MjBjODApfSwge0ZYUF9DQVNUKDB4NDk5OWMzODApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHg5NGU4MGE4MCl9LCB7RlhQX0NBU1QoMHhhOWRhYjgwMCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDBjYTU3MGUwKX0sCi17RlhQX0NBU1QoMHg5MGQwYjAwMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDc2YzliYzgwKX0sIHtGWFBfQ0FTVCgweDI1YTMyMDAwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4NjEzMzg1MDApfSwge0ZYUF9DQVNUKDB4N2Y5YWZjODApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHhlMzE4ZjA2MCl9LAote0ZYUF9DQVNUKDB4MTIwOTA5YzApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg4NDEyNGUwMCl9LCB7RlhQX0NBU1QoMHg4ODQzNWQ4MCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweGFhNGQyZjgwKX0sIHtGWFBfQ0FTVCgweGI5YjlhMjAwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4MmNhZTE4MDApfSwKLXtGWFBfQ0FTVCgweDU5MTNhZTgwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4N2YwNDA2ODApfSwge0ZYUF9DQVNUKDB4NmQyMzRlMDApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHg0OGM2YTEwMCl9LCB7RlhQX0NBU1QoMHhkNjg5ZGI4MCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweGM0NDg2MGMwKX0sCi17RlhQX0NBU1QoMHg4MGM1ZTM4MCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDgwMDA1ZDAwKX0sIHtGWFBfQ0FTVCgweGYxZjQzZWIwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4YzU1YTNhMDApfSwge0ZYUF9DQVNUKDB4NzkxOTU1MDApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg0OWMzZGUwMCl9LAote0ZYUF9DQVNUKDB4NDJlMTM3MDApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg3ZWRjNWIwMCl9LCB7RlhQX0NBU1QoMHhhNDE0NmM4MCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDJiOGMyYzAwKX0sIHtGWFBfQ0FTVCgweDk1MDQ0NjgwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4YTk2OGMxMDApfSwKLXtGWFBfQ0FTVCgweDJkM2VhZjQwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4ODQ2MGZkODApfSwge0ZYUF9DQVNUKDB4N2ViOTE3ODApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHhlNDQ2MjFlMCl9LCB7RlhQX0NBU1QoMHgwYTBhZWM4MCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDYxZmI1YzAwKX0sCi17RlhQX0NBU1QoMHg4NWE4OTEwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweDc2NTU1NzgwKX0sIHtGWFBfQ0FTVCgweGMwOTRkNTAwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4MGI3MWY3OTApfSwge0ZYUF9DQVNUKDB4NWVhYzQwMDApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHg5NDQwMWE4MCl9LAote0ZYUF9DQVNUKDB4NjhiOTFkODApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHg5MGVhMzk4MCl9LCB7RlhQX0NBU1QoMHhjZjA0MzQ0MCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweDA1MDY3YTA4KX0sIHtGWFBfQ0FTVCgweDgxZTdmMTgwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4NzNiYjZkMDApfSwKLXtGWFBfQ0FTVCgweGY5Zjg3MWUwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4NjVmZjBlMDApfSwge0ZYUF9DQVNUKDB4N2I3NmEwMDApLCBGWFBfQ0FTVCgweDg5YmU1MTAwKSwgRlhQX0NBU1QoMHhlYTk2NjRjMCl9LCB7RlhQX0NBU1QoMHgzYmU1MThjMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweDg2MzNlODgwKX0sCi17RlhQX0NBU1QoMHg5ZWFhZmYwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweGE0Yzg0NTAwKX0sIHtGWFBfQ0FTVCgweDk5YTNmNDAwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4MjU3MWVhYzApfSwge0ZYUF9DQVNUKDB4MzRhYzg4NDApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHg3ZGQ4MmIwMCl9LAote0ZYUF9DQVNUKDB4N2Q1NzJhODApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHg0ZWVkODQwMCl9LCB7RlhQX0NBU1QoMHgwMjAyYTljNCksIEZYUF9DQVNUKDB4Y2YwNDNhYzApLCBGWFBfQ0FTVCgweGNiMjQ5NzAwKX0sIHtGWFBfQ0FTVCgweDgzODk2MDAwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4ODAzMTgyMDApfSwKLXtGWFBfQ0FTVCgweGM3YjAxYjAwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4YmVhYjc1ODApfSwge0ZYUF9DQVNUKDB4NjNlNTJhODApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg0MzY0YjcwMCl9LCB7RlhQX0NBU1QoMHg2M2U1MWYwMCksIEZYUF9DQVNUKDB4MzBmYmM1NDApLCBGWFBfQ0FTVCgweDdmYTZiZDAwKX0sCi17RlhQX0NBU1QoMHhjN2IwMGEwMCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDMyYTY3OTQwKX0sIHtGWFBfQ0FTVCgweDgzODk2NDAwKSwgRlhQX0NBU1QoMHg3NjQxYWYwMCksIEZYUF9DQVNUKDB4YWYyZmQyMDApfSwge0ZYUF9DQVNUKDB4MDIwMmJjOWMpLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHg4MjllNmU4MCl9LAote0ZYUF9DQVNUKDB4N2Q1NzJlODApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHhkY2RlNmI4MCl9LCB7RlhQX0NBU1QoMHgzNGFjNzcwMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweDVjZTRlMjgwKX0sIHtGWFBfQ0FTVCgweDk5YTNlODgwKSwgRlhQX0NBU1QoMHg4OWJlNTEwMCksIEZYUF9DQVNUKDB4NzkwODljMDApfSwKLXtGWFBfQ0FTVCgweDllYWIwYjgwKSwgRlhQX0NBU1QoMHgzMGZiYzU0MCksIEZYUF9DQVNUKDB4MTMwN2FlODApfSwge0ZYUF9DQVNUKDB4M2JlNTI5ODApLCBGWFBfQ0FTVCgweDMwZmJjNTQwKSwgRlhQX0NBU1QoMHg5ODkwNjg4MCl9LCB7RlhQX0NBU1QoMHg3Yjc2OWIwMCksIEZYUF9DQVNUKDB4ODliZTUxMDApLCBGWFBfQ0FTVCgweDhkNTFiMzAwKX0sCi17RlhQX0NBU1QoMHhmOWY4NWYxMCksIEZYUF9DQVNUKDB4NzY0MWFmMDApLCBGWFBfQ0FTVCgweGZkNjJlZTI0KX0sIHtGWFBfQ0FTVCgweDgxZTdlZTAwKSwgRlhQX0NBU1QoMHhjZjA0M2FjMCksIEZYUF9DQVNUKDB4NzA0Mzk2ODApfSwge0ZYUF9DQVNUKDB4Y2YwNDQ1ODApLCBGWFBfQ0FTVCgweGNmMDQzYWMwKSwgRlhQX0NBU1QoMHg2YTZkOTYwMCl9LAote0ZYUF9DQVNUKDB4NjhiOTI4MDApLCBGWFBfQ0FTVCgweDc2NDFhZjAwKSwgRlhQX0NBU1QoMHhmMjI3NWY4MCl9fTsKLQotY29uc3QgRklYUF9QUyBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlclJlU3ViUW1mMjBbTk9fU1VCX1FNRl9DSEFOTkVMU11bTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdID0gewote0ZYUF9DQVNUKDB4N2UyZGYwMDApLCBGWFBfQ0FTVCgweDdhN2QwNTgwKSwgRlhQX0NBU1QoMHg3ZWQwM2UwMCl9LCB7RlhQX0NBU1QoMHg2ZmVjOWE4MCksIEZYUF9DQVNUKDB4NTEzM2NjODApLCBGWFBfQ0FTVCgweDc1NzNkZjAwKX0sIHtGWFBfQ0FTVCgweDU1MDYzOTAwKSwgRlhQX0NBU1QoMHgwYzhiZDM2MCksIEZYUF9DQVNUKDB4NjM2YzA0MDApfSwKLXtGWFBfQ0FTVCgweDMwODRjYTAwKSwgRlhQX0NBU1QoMHhjM2E5NDU4MCksIEZYUF9DQVNUKDB4NGEwZDY3MDApfSwge0ZYUF9DQVNUKDB4ODAwMDAwMDApLCBGWFBfQ0FTVCgweDgwMDAwMDAwKSwgRlhQX0NBU1QoMHg4MDAwMDAwMCl9LCB7RlhQX0NBU1QoMHg4MDAwMDAwMCksIEZYUF9DQVNUKDB4ODAwMDAwMDApLCBGWFBfQ0FTVCgweDgwMDAwMDAwKX0sCi17RlhQX0NBU1QoMHg2ZmVjOWE4MCksIEZYUF9DQVNUKDB4NTEzM2NjODApLCBGWFBfQ0FTVCgweDc1NzNkZjAwKX0sIHtGWFBfQ0FTVCgweDdlMmRmMDAwKSwgRlhQX0NBU1QoMHg3YTdkMDU4MCksIEZYUF9DQVNUKDB4N2VkMDNlMDApfSwge0ZYUF9DQVNUKDB4YTRjODQyODApLCBGWFBfQ0FTVCgweGI4ZTMxMzAwKSwgRlhQX0NBU1QoMHhkNWFmMDE0MCl9LAote0ZYUF9DQVNUKDB4ZjBmNDg4YTApLCBGWFBfQ0FTVCgweDgyNzVhMTAwKSwgRlhQX0NBU1QoMHgxYTcyZTM2MCl9LCB7RlhQX0NBU1QoMHg4MGFhYTY4MCksIEZYUF9DQVNUKDB4NDcxY2VkMDApLCBGWFBfQ0FTVCgweDlkMmVhZDgwKX0sIHtGWFBfQ0FTVCgweDk0NzdkMTAwKSwgRlhQX0NBU1QoMHg3ZDhhNWYwMCksIEZYUF9DQVNUKDB4ODE1MWRmODApfX07Ci0KLWNvbnN0IEZJWFBfUFMgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JTZXJJbVN1YlFtZjIwW05PX1NVQl9RTUZfQ0hBTk5FTFNdW05PX1NFUklBTF9BTExQQVNTX0xJTktTXSA9IHsKLXtGWFBfQ0FTVCgweGVhN2QwOGEwKSwgRlhQX0NBU1QoMHhkYWQ3ZjNjMCksIEZYUF9DQVNUKDB4ZWU5YzlmNjApfSwge0ZYUF9DQVNUKDB4YzFlNTQxNDApLCBGWFBfQ0FTVCgweDlkMGRmZTgwKSwgRlhQX0NBU1QoMHhjZDFlNzMwMCl9LCB7RlhQX0NBU1QoMHhhMDUxYTU4MCksIEZYUF9DQVNUKDB4ODA5ZGM5ODApLCBGWFBfQ0FTVCgweGFmNjFjNDAwKX0sCi17RlhQX0NBU1QoMHg4OThkNGUwMCksIEZYUF9DQVNUKDB4OGYxZDM0MDApLCBGWFBfQ0FTVCgweDk3OTg4MjgwKX0sIHtGWFBfQ0FTVCgweDAwMDAwMDAwKSwgRlhQX0NBU1QoMHgwMDAwMDAwMCksIEZYUF9DQVNUKDB4MDAwMDAwMDApfSwge0ZYUF9DQVNUKDB4MDAwMDAwMDApLCBGWFBfQ0FTVCgweDAwMDAwMDAwKSwgRlhQX0NBU1QoMHgwMDAwMDAwMCl9LAote0ZYUF9DQVNUKDB4M2UxYWJlYzApLCBGWFBfQ0FTVCgweDYyZjIwMTgwKSwgRlhQX0NBU1QoMHgzMmUxOGQwMCl9LCB7RlhQX0NBU1QoMHgxNTgyZjc2MCksIEZYUF9DQVNUKDB4MjUyODBjNDApLCBGWFBfQ0FTVCgweDExNjM2MGEwKX0sIHtGWFBfQ0FTVCgweGE2MzQzODAwKSwgRlhQX0NBU1QoMHg2YTZkOTg4MCksIEZYUF9DQVNUKDB4ODczMjdhMDApfSwKLXtGWFBfQ0FTVCgweDgwZTMyMjAwKSwgRlhQX0NBU1QoMHhlNzA3NDdjMCksIEZYUF9DQVNUKDB4ODJjMzJiMDApfSwge0ZYUF9DQVNUKDB4ZjJmNDI0MjApLCBGWFBfQ0FTVCgweDZhNmQ5ODgwKSwgRlhQX0NBU1QoMHhhZWE0NzA4MCl9LCB7RlhQX0NBU1QoMHg0NTZlYmEwMCksIEZYUF9DQVNUKDB4ZTcwNzQ3YzApLCBGWFBfQ0FTVCgweGVkYWE4NjQwKX19OwotCi1jb25zdCBGSVhQX1BTIHA4XzEzXzIwWzEzXSA9Ci17Ci0gIEZMMkZYQ09OU1RfUFMoMC4wMDc0NjA4Mjk0OTgxMmYpLCAgRkwyRlhDT05TVF9QUygwLjAyMjcwNDIwOTQ5ODI1ZiksICBGTDJGWENPTlNUX1BTKDAuMDQ1NDY4NjU5MzA0NzNmKSwgIEZMMkZYQ09OU1RfUFMoMC4wNzI2NjExMzkyOTU5MWYpLAotICBGTDJGWENPTlNUX1BTKDAuMDk4ODUxMDg1NzUyNjRmKSwgIEZMMkZYQ09OU1RfUFMoMC4xMTc5MzcxMDU2NzIxN2YpLCAgRkwyRlhDT05TVF9QUygwLjEyNWYgICAgICAgICAgICksICBGTDJGWENPTlNUX1BTKDAuMTE3OTM3MTA1NjcyMTdmKSwKLSAgRkwyRlhDT05TVF9QUygwLjA5ODg1MTA4NTc1MjY0ZiksICBGTDJGWENPTlNUX1BTKDAuMDcyNjYxMTM5Mjk1OTFmKSwgIEZMMkZYQ09OU1RfUFMoMC4wNDU0Njg2NTkzMDQ3M2YpLCAgRkwyRlhDT05TVF9QUygwLjAyMjcwNDIwOTQ5ODI1ZiksCi0gIEZMMkZYQ09OU1RfUFMoMC4wMDc0NjA4Mjk0OTgxMmYpCi19OwotCi1jb25zdCBGSVhQX1BTIHAyXzEzXzIwWzEzXSA9Ci17Ci0gIEZMMkZYQ09OU1RfUFMoMC4wZiksIEZMMkZYQ09OU1RfUFMoIDAuMDE4OTk0ODc1MjYwNDlmKSwgIEZMMkZYQ09OU1RfUFMoMC4wZiksIEZMMkZYQ09OU1RfUFMoLTAuMDcyOTMxMzkxNjc1MzhmKSwKLSAgRkwyRlhDT05TVF9QUygwLjBmKSwgRkwyRlhDT05TVF9QUyggMC4zMDU5NjYzMDU0NTE2OGYpLCAgRkwyRlhDT05TVF9QUygwLjVmKSwgRkwyRlhDT05TVF9QUyggMC4zMDU5NjYzMDU0NTE2OGYpLAotICBGTDJGWENPTlNUX1BTKDAuMGYpLCBGTDJGWENPTlNUX1BTKC0wLjA3MjkzMTM5MTY3NTM4ZiksICBGTDJGWENPTlNUX1BTKDAuMGYpLCBGTDJGWENPTlNUX1BTKCAwLjAxODk5NDg3NTI2MDQ5ZiksCi0gIEZMMkZYQ09OU1RfUFMoMC4wZikKLX07Ci0KLQotCi1jb25zdCBVQ0hBUiBhQWxscGFzc0xpbmtEZWxheVNlcltdID0geyAgICAzLCAgICAgNCwgICAgIDV9OwotCi1jb25zdCBVQ0hBUiBkZWxheUluZGV4UW1mW05PX1FNRl9DSEFOTkVMU10gPSB7Ci0gIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAgMTQsIDE0LCAxNCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0gICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxCi19OwotCi1jb25zdCBVQ0hBUiBncm91cEJvcmRlcnMyMFtOT19JSURfR1JPVVBTICsgMV0gPQotewotICAgNiwgIDcsICAwLCAgMSwgIDIsICAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2IHN1YnFtZiBzdWJiYW5kcyAtIDB0aCBxbWYgc3ViYmFuZCAqLwotICAgOSwgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyIHN1YnFtZiBzdWJiYW5kcyAtIDFzdCBxbWYgc3ViYmFuZCAqLwotICAxMCwgMTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyIHN1YnFtZiBzdWJiYW5kcyAtIDJuZCBxbWYgc3ViYmFuZCAqLwotICAgMywgIDQsICA1LCAgNiwgIDcsICA4LAotICAgOSwgIDExLCAxNCwgMTgsIDIzLCAzNSwgNjQKLX07Ci0KLWNvbnN0IFVDSEFSIGdyb3VwQm9yZGVyczM0W05PX0lJRF9HUk9VUFNfSElfUkVTICsgMV0gPQotewotICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDEwLCAxMSwgICAvKiAxMiBzdWJxbWYgc3ViYmFuZHMgLSAwdGggcW1mIHN1YmJhbmQgKi8KLSAgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAgICAgICAgICAgICAgICAgICAgLyogIDggc3VicW1mIHN1YmJhbmRzIC0gMXN0IHFtZiBzdWJiYW5kICovCi0gIDIwLCAyMSwgMjIsIDIzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA0IHN1YnFtZiBzdWJiYW5kcyAtIDJuZCBxbWYgc3ViYmFuZCAqLwotICAyNCwgMjUsIDI2LCAyNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNCBzdWJxbWYgc3ViYmFuZHMgLSAzbmQgcW1mIHN1YmJhbmQgKi8KLSAgMjgsIDI5LCAzMCwgMzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDQgc3VicW1mIHN1YmJhbmRzIC0gNG5kIHFtZiBzdWJiYW5kICovCi0gIDMyLTI3LCAzMy0yNywgMzQtMjcsIDM1LTI3LCAzNi0yNywgMzctMjcsIDM4LTI3LAotICA0MC0yNywgNDItMjcsIDQ0LTI3LCA0Ni0yNywgNDgtMjcsIDUxLTI3LCA1NC0yNywKLSAgNTctMjcsIDYwLTI3LCA2NC0yNywgNjgtMjcsIDkxLTI3Ci19OwotCi1jb25zdCBVQ0hBUiBiaW5zMmdyb3VwTWFwMjBbTk9fSUlEX0dST1VQU10gPQotewotICAxLCAwLAotICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOQotfTsKLQotY29uc3QgVUNIQVIgcXVhbnRpemVkSUlEc1tOT19JSURfU1RFUFNdID0KLXsKLSAgICAyLCA0LCA3LCAxMCwgMTQsIDE4LCAyNQotfTsKLWNvbnN0IFVDSEFSIHF1YW50aXplZElJRHNGaW5lW05PX0lJRF9TVEVQU19GSU5FXSA9Ci17Ci0gICAgMiwgNCwgNiwgOCwgMTAsIDEzLCAxNiwgMTksIDIyLCAyNSwgMzAsIDM1LCA0MCwgNDUsIDUwCi19OwotCi1jb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9hTm9JaWRCaW5zWzNdID0ge05PX0xPV19SRVNfSUlEX0JJTlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOT19NSURfUkVTX0lJRF9CSU5TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9fSElfUkVTX0lJRF9CSU5TfTsKLQotY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfYU5vSWNjQmluc1szXSA9IHtOT19MT1dfUkVTX0lDQ19CSU5TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9fTUlEX1JFU19JQ0NfQklOUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PX0hJX1JFU19JQ0NfQklOU307Ci0KLQorY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfYU5vSWNjQmluc1szXSA9IHsKKyAgICBOT19MT1dfUkVTX0lDQ19CSU5TLCBOT19NSURfUkVTX0lDQ19CSU5TLCBOT19ISV9SRVNfSUNDX0JJTlN9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCkBAIC0xMzg1LDM5ICsxNjczLDMzIEBACiAgICAgICAgICBpbnZUYWJsZVtpXSA9IEZMMkZYX1NHTChkKTsKICAgICAgICB9CiAqLwotY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfaW52VGFibGVbSU5WX1RBQkxFX1NJWkVdID0KLXsKLSAgMHg3ZjgwLCAweDdmMDEsIDB4N2U4MywgMHg3ZTA3LCAweDdkOGIsIDB4N2QxMSwgMHg3Yzk3LCAweDdjMWUsCi0gIDB4N2JhNiwgMHg3YjJmLCAweDdhYjksIDB4N2E0NCwgMHg3OWNmLCAweDc5NWMsIDB4NzhlOSwgMHg3ODc4LAotICAweDc4MDcsIDB4Nzc5NiwgMHg3NzI3LCAweDc2YjksIDB4NzY0YiwgMHg3NWRlLCAweDc1NzIsIDB4NzUwNiwKLSAgMHg3NDljLCAweDc0MzIsIDB4NzNjOSwgMHg3MzYwLCAweDcyZjksIDB4NzI5MiwgMHg3MjJjLCAweDcxYzYsCi0gIDB4NzE2MSwgMHg3MGZkLCAweDcwOWEsIDB4NzAzNywgMHg2ZmQ1LCAweDZmNzQsIDB4NmYxMywgMHg2ZWIzLAotICAweDZlNTQsIDB4NmRmNSwgMHg2ZDk3LCAweDZkMzksIDB4NmNkYywgMHg2YzgwLCAweDZjMjQsIDB4NmJjOSwKLSAgMHg2YjZmLCAweDZiMTUsIDB4NmFiYywgMHg2YTYzLCAweDZhMGIsIDB4NjliMywgMHg2OTVjLCAweDY5MDYsCi0gIDB4NjhiMCwgMHg2ODVhLCAweDY4MDYsIDB4NjdiMSwgMHg2NzVlLCAweDY3MGEsIDB4NjZiOCwgMHg2NjY2LAotICAweDY2MTQsIDB4NjVjMywgMHg2NTcyLCAweDY1MjIsIDB4NjRkMiwgMHg2NDgzLCAweDY0MzQsIDB4NjNlNiwKLSAgMHg2Mzk5LCAweDYzNGIsIDB4NjJmZSwgMHg2MmIyLCAweDYyNjYsIDB4NjIxYiwgMHg2MWQwLCAweDYxODUsCi0gIDB4NjEzYiwgMHg2MGYyLCAweDYwYTgsIDB4NjA2MCwgMHg2MDE3LCAweDVmY2YsIDB4NWY4OCwgMHg1ZjQxLAotICAweDVlZmEsIDB4NWViNCwgMHg1ZTZlLCAweDVlMjgsIDB4NWRlMywgMHg1ZDlmLCAweDVkNWEsIDB4NWQxNywKLSAgMHg1Y2QzLCAweDVjOTAsIDB4NWM0ZCwgMHg1YzBiLCAweDViYzksIDB4NWI4NywgMHg1YjQ2LCAweDViMDUsCi0gIDB4NWFjNCwgMHg1YTg0LCAweDVhNDQsIDB4NWEwNSwgMHg1OWM2LCAweDU5ODcsIDB4NTk0OSwgMHg1OTBhLAotICAweDU4Y2QsIDB4NTg4ZiwgMHg1ODUyLCAweDU4MTUsIDB4NTdkOSwgMHg1NzlkLCAweDU3NjEsIDB4NTcyNSwKLSAgMHg1NmVhLCAweDU2YWYsIDB4NTY3NSwgMHg1NjNiLCAweDU2MDEsIDB4NTVjNywgMHg1NThlLCAweDU1NTUsCi0gIDB4NTUxYywgMHg1NGUzLCAweDU0YWIsIDB4NTQ3MywgMHg1NDNjLCAweDU0MDUsIDB4NTNjZSwgMHg1Mzk3LAotICAweDUzNjAsIDB4NTMyYSwgMHg1MmY0LCAweDUyYmYsIDB4NTI4OSwgMHg1MjU0LCAweDUyMWYsIDB4NTFlYiwKLSAgMHg1MWI3LCAweDUxODMsIDB4NTE0ZiwgMHg1MTFiLCAweDUwZTgsIDB4NTBiNSwgMHg1MDgyLCAweDUwNTAsCi0gIDB4NTAxZCwgMHg0ZmViLCAweDRmYmEsIDB4NGY4OCwgMHg0ZjU3LCAweDRmMjYsIDB4NGVmNSwgMHg0ZWM0LAotICAweDRlOTQsIDB4NGU2NCwgMHg0ZTM0LCAweDRlMDQsIDB4NGRkNSwgMHg0ZGE2LCAweDRkNzcsIDB4NGQ0OCwKLSAgMHg0ZDE5LCAweDRjZWIsIDB4NGNiZCwgMHg0YzhmLCAweDRjNjEsIDB4NGMzNCwgMHg0YzA3LCAweDRiZDksCi0gIDB4NGJhZCwgMHg0YjgwLCAweDRiNTQsIDB4NGIyNywgMHg0YWZiLCAweDRhY2YsIDB4NGFhNCwgMHg0YTc4LAotICAweDRhNGQsIDB4NGEyMiwgMHg0OWY3LCAweDQ5Y2QsIDB4NDlhMiwgMHg0OTc4LCAweDQ5NGUsIDB4NDkyNCwKLSAgMHg0OGZhLCAweDQ4ZDEsIDB4NDhhNywgMHg0ODdlLCAweDQ4NTUsIDB4NDgyZCwgMHg0ODA0LCAweDQ3ZGMsCi0gIDB4NDdiMywgMHg0NzhiLCAweDQ3NjMsIDB4NDczYywgMHg0NzE0LCAweDQ2ZWQsIDB4NDZjNSwgMHg0NjllLAotICAweDQ2NzcsIDB4NDY1MSwgMHg0NjJhLCAweDQ2MDQsIDB4NDVkZSwgMHg0NWI4LCAweDQ1OTIsIDB4NDU2YywKLSAgMHg0NTQ2LCAweDQ1MjEsIDB4NDRmYywgMHg0NGQ3LCAweDQ0YjIsIDB4NDQ4ZCwgMHg0NDY4LCAweDQ0NDQsCi0gIDB4NDQxZiwgMHg0M2ZiLCAweDQzZDcsIDB4NDNiMywgMHg0MzkwLCAweDQzNmMsIDB4NDM0OSwgMHg0MzI1LAotICAweDQzMDIsIDB4NDJkZiwgMHg0MmJjLCAweDQyOTksIDB4NDI3NywgMHg0MjU0LCAweDQyMzIsIDB4NDIxMCwKLSAgMHg0MWVlLCAweDQxY2MsIDB4NDFhYSwgMHg0MTg5LCAweDQxNjcsIDB4NDE0NiwgMHg0MTI1LCAweDQxMDQsCi0gIDB4NDBlMywgMHg0MGMyLCAweDQwYTEsIDB4NDA4MSwgMHg0MDYwLCAweDQwNDAsIDB4NDAyMCwgMHg0MDAwCi19OwotCitjb25zdCBGSVhQX1NHTCBGREtfc2JyRGVjb2Rlcl9pbnZUYWJsZVtJTlZfVEFCTEVfU0laRV0gPSB7CisgICAgMHg3ZjgwLCAweDdmMDEsIDB4N2U4MywgMHg3ZTA3LCAweDdkOGIsIDB4N2QxMSwgMHg3Yzk3LCAweDdjMWUsIDB4N2JhNiwKKyAgICAweDdiMmYsIDB4N2FiOSwgMHg3YTQ0LCAweDc5Y2YsIDB4Nzk1YywgMHg3OGU5LCAweDc4NzgsIDB4NzgwNywgMHg3Nzk2LAorICAgIDB4NzcyNywgMHg3NmI5LCAweDc2NGIsIDB4NzVkZSwgMHg3NTcyLCAweDc1MDYsIDB4NzQ5YywgMHg3NDMyLCAweDczYzksCisgICAgMHg3MzYwLCAweDcyZjksIDB4NzI5MiwgMHg3MjJjLCAweDcxYzYsIDB4NzE2MSwgMHg3MGZkLCAweDcwOWEsIDB4NzAzNywKKyAgICAweDZmZDUsIDB4NmY3NCwgMHg2ZjEzLCAweDZlYjMsIDB4NmU1NCwgMHg2ZGY1LCAweDZkOTcsIDB4NmQzOSwgMHg2Y2RjLAorICAgIDB4NmM4MCwgMHg2YzI0LCAweDZiYzksIDB4NmI2ZiwgMHg2YjE1LCAweDZhYmMsIDB4NmE2MywgMHg2YTBiLCAweDY5YjMsCisgICAgMHg2OTVjLCAweDY5MDYsIDB4NjhiMCwgMHg2ODVhLCAweDY4MDYsIDB4NjdiMSwgMHg2NzVlLCAweDY3MGEsIDB4NjZiOCwKKyAgICAweDY2NjYsIDB4NjYxNCwgMHg2NWMzLCAweDY1NzIsIDB4NjUyMiwgMHg2NGQyLCAweDY0ODMsIDB4NjQzNCwgMHg2M2U2LAorICAgIDB4NjM5OSwgMHg2MzRiLCAweDYyZmUsIDB4NjJiMiwgMHg2MjY2LCAweDYyMWIsIDB4NjFkMCwgMHg2MTg1LCAweDYxM2IsCisgICAgMHg2MGYyLCAweDYwYTgsIDB4NjA2MCwgMHg2MDE3LCAweDVmY2YsIDB4NWY4OCwgMHg1ZjQxLCAweDVlZmEsIDB4NWViNCwKKyAgICAweDVlNmUsIDB4NWUyOCwgMHg1ZGUzLCAweDVkOWYsIDB4NWQ1YSwgMHg1ZDE3LCAweDVjZDMsIDB4NWM5MCwgMHg1YzRkLAorICAgIDB4NWMwYiwgMHg1YmM5LCAweDViODcsIDB4NWI0NiwgMHg1YjA1LCAweDVhYzQsIDB4NWE4NCwgMHg1YTQ0LCAweDVhMDUsCisgICAgMHg1OWM2LCAweDU5ODcsIDB4NTk0OSwgMHg1OTBhLCAweDU4Y2QsIDB4NTg4ZiwgMHg1ODUyLCAweDU4MTUsIDB4NTdkOSwKKyAgICAweDU3OWQsIDB4NTc2MSwgMHg1NzI1LCAweDU2ZWEsIDB4NTZhZiwgMHg1Njc1LCAweDU2M2IsIDB4NTYwMSwgMHg1NWM3LAorICAgIDB4NTU4ZSwgMHg1NTU1LCAweDU1MWMsIDB4NTRlMywgMHg1NGFiLCAweDU0NzMsIDB4NTQzYywgMHg1NDA1LCAweDUzY2UsCisgICAgMHg1Mzk3LCAweDUzNjAsIDB4NTMyYSwgMHg1MmY0LCAweDUyYmYsIDB4NTI4OSwgMHg1MjU0LCAweDUyMWYsIDB4NTFlYiwKKyAgICAweDUxYjcsIDB4NTE4MywgMHg1MTRmLCAweDUxMWIsIDB4NTBlOCwgMHg1MGI1LCAweDUwODIsIDB4NTA1MCwgMHg1MDFkLAorICAgIDB4NGZlYiwgMHg0ZmJhLCAweDRmODgsIDB4NGY1NywgMHg0ZjI2LCAweDRlZjUsIDB4NGVjNCwgMHg0ZTk0LCAweDRlNjQsCisgICAgMHg0ZTM0LCAweDRlMDQsIDB4NGRkNSwgMHg0ZGE2LCAweDRkNzcsIDB4NGQ0OCwgMHg0ZDE5LCAweDRjZWIsIDB4NGNiZCwKKyAgICAweDRjOGYsIDB4NGM2MSwgMHg0YzM0LCAweDRjMDcsIDB4NGJkOSwgMHg0YmFkLCAweDRiODAsIDB4NGI1NCwgMHg0YjI3LAorICAgIDB4NGFmYiwgMHg0YWNmLCAweDRhYTQsIDB4NGE3OCwgMHg0YTRkLCAweDRhMjIsIDB4NDlmNywgMHg0OWNkLCAweDQ5YTIsCisgICAgMHg0OTc4LCAweDQ5NGUsIDB4NDkyNCwgMHg0OGZhLCAweDQ4ZDEsIDB4NDhhNywgMHg0ODdlLCAweDQ4NTUsIDB4NDgyZCwKKyAgICAweDQ4MDQsIDB4NDdkYywgMHg0N2IzLCAweDQ3OGIsIDB4NDc2MywgMHg0NzNjLCAweDQ3MTQsIDB4NDZlZCwgMHg0NmM1LAorICAgIDB4NDY5ZSwgMHg0Njc3LCAweDQ2NTEsIDB4NDYyYSwgMHg0NjA0LCAweDQ1ZGUsIDB4NDViOCwgMHg0NTkyLCAweDQ1NmMsCisgICAgMHg0NTQ2LCAweDQ1MjEsIDB4NDRmYywgMHg0NGQ3LCAweDQ0YjIsIDB4NDQ4ZCwgMHg0NDY4LCAweDQ0NDQsIDB4NDQxZiwKKyAgICAweDQzZmIsIDB4NDNkNywgMHg0M2IzLCAweDQzOTAsIDB4NDM2YywgMHg0MzQ5LCAweDQzMjUsIDB4NDMwMiwgMHg0MmRmLAorICAgIDB4NDJiYywgMHg0Mjk5LCAweDQyNzcsIDB4NDI1NCwgMHg0MjMyLCAweDQyMTAsIDB4NDFlZSwgMHg0MWNjLCAweDQxYWEsCisgICAgMHg0MTg5LCAweDQxNjcsIDB4NDE0NiwgMHg0MTI1LCAweDQxMDQsIDB4NDBlMywgMHg0MGMyLCAweDQwYTEsIDB4NDA4MSwKKyAgICAweDQwNjAsIDB4NDA0MCwgMHg0MDIwLCAweDQwMDB9OwpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9zYnJfcm9tLmggYi9saWJTQlJkZWMvc3JjL3Nicl9yb20uaAppbmRleCAxZjgwMGJjLi4wMzk3NDNjIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL3Nicl9yb20uaAorKysgYi9saWJTQlJkZWMvc3JjL3Nicl9yb20uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw2OCArOTAsODAgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKIFxmaWxlCiBcYnJpZWYgRGVjbGFyYXRpb24gb2YgY29uc3RhbnQgdGFibGVzCi0KICovCi0jaWZuZGVmIF9fcm9tX0gKLSNkZWZpbmUgX19yb21fSAorI2lmbmRlZiBTQlJfUk9NX0gKKyNkZWZpbmUgU0JSX1JPTV9ICiAKICNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCiAjaW5jbHVkZSAiZW52X2V4dHIuaCIKICNpbmNsdWRlICJxbWYuaCIKIAotI2RlZmluZSBJTlZfSU5UX1RBQkxFX1NJWkUgICAgICA0OQotI2RlZmluZSBTQlJfTkZfTk9fUkFORE9NX1ZBTCAgNTEyICAgLyohPCBTaXplIG9mIHJhbmRvbSBudW1iZXIgYXJyYXkgZm9yIG5vaXNlIGZsb29yICovCisjZGVmaW5lIElOVl9JTlRfVEFCTEVfU0laRSA0OQorI2RlZmluZSBTQlJfTkZfTk9fUkFORE9NX1ZBTCBcCisgIDUxMiAvKiE8IFNpemUgb2YgcmFuZG9tIG51bWJlciBhcnJheSBmb3Igbm9pc2UgZmxvb3IgKi8KIAogLyoKICAgRnJlcXVlbmN5IHNjYWxlcwogKi8KLWV4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8xNlsxNl07Ci1leHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMjJbMTZdOwotZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzI0WzE2XTsKLWV4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8zMlsxNl07Ci1leHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNDBbMTZdOwotZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzQ0WzE2XTsKLWV4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV80OFsxNl07Ci1leHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNjRbMTZdOwotZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzg4WzE2XTsKKworLyogaWYgZGVmaW5lZChTQlJERUNfUkFUSU9fMTZfNjRfRU5BQkxFKSAoKDQpID0gNCkgZWxzZSAoKDQpID0gMikgKi8KK2V4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8xNlsoNCkgLyAyXVsxNl07CitleHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMjJbKDQpIC8gMl1bMTZdOworZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzI0Wyg0KSAvIDJdWzE2XTsKK2V4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8zMlsoNCkgLyAyXVsxNl07CitleHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNDBbKDQpIC8gMl1bMTZdOworZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzQ0Wyg0KSAvIDJdWzE2XTsKK2V4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV80OFsoNCkgLyAyXVsxNl07CitleHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNjRbKDQpIC8gMl1bMTZdOworZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzg4Wyg0KSAvIDJdWzE2XTsKK2V4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8xOTJbMTZdOworZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzE3NlsxNl07CitleHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMTI4WzE2XTsKIAogLyoKICAgTG93LVBvd2VyLVByb2ZpbGUgVHJhbnNwb3NlcgogKi8KLSNkZWZpbmUgTlVNX1dIRkFDVE9SX1RBQkxFX0VOVFJJRVMgIDkKLWV4dGVybiBjb25zdCBVU0hPUlQgRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc0luZGV4W05VTV9XSEZBQ1RPUl9UQUJMRV9FTlRSSUVTXTsKLWV4dGVybiBjb25zdCBGSVhQX0RCTCBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzVGFibGVbTlVNX1dIRkFDVE9SX1RBQkxFX0VOVFJJRVNdWzZdOwotCi0KKyNkZWZpbmUgTlVNX1dIRkFDVE9SX1RBQkxFX0VOVFJJRVMgOQorZXh0ZXJuIGNvbnN0IFVTSE9SVAorICAgIEZES19zYnJEZWNvZGVyX3Nicl93aEZhY3RvcnNJbmRleFtOVU1fV0hGQUNUT1JfVEFCTEVfRU5UUklFU107CitleHRlcm4gY29uc3QgRklYUF9EQkwKKyAgICBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzVGFibGVbTlVNX1dIRkFDVE9SX1RBQkxFX0VOVFJJRVNdWzZdOwogCiAvKgogICBFbnZlbG9wZSBBZGp1c3RvcgogKi8KIGV4dGVybiBjb25zdCBGSVhQX1NHTCBGREtfc2JyRGVjb2Rlcl9zYnJfbGltR2FpbnNfbVs0XTsKLWV4dGVybiBjb25zdCBVQ0hBUiAgICBGREtfc2JyRGVjb2Rlcl9zYnJfbGltR2FpbnNfZVs0XTsKK2V4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfbGltR2FpbnNfZVs0XTsKK2V4dGVybiBjb25zdCBGSVhQX1NHTCBGREtfc2JyRGVjb2Rlcl9zYnJfbGltR2FpbnNQdmNfbVs0XTsKK2V4dGVybiBjb25zdCBVQ0hBUiBGREtfc2JyRGVjb2Rlcl9zYnJfbGltR2FpbnNQdmNfZVs0XTsKIGV4dGVybiBjb25zdCBGSVhQX1NHTCBGREtfc2JyRGVjb2Rlcl9zYnJfbGltaXRlckJhbmRzUGVyT2N0YXZlRGl2NFs0XTsKIGV4dGVybiBjb25zdCBGSVhQX0RCTCBGREtfc2JyRGVjb2Rlcl9zYnJfbGltaXRlckJhbmRzUGVyT2N0YXZlRGl2NF9EQkxbNF07CiBleHRlcm4gY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX3Ntb290aEZpbHRlcls0XTsKIGV4dGVybiBjb25zdCBGSVhQX1NHTCBGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbU0JSX05GX05PX1JBTkRPTV9WQUxdWzJdOwotZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIGhhcm1vbmljUGhhc2VYIFsyXVs0XTsKIAogLyoKICAgRW52ZWxvcGUgRXh0cmFjdG9yCiAqLwotZXh0ZXJuIGNvbnN0IGludCBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzggIFs4XVs1XTsKLWV4dGVybiBjb25zdCBpbnQgRkRLX3NickRlY29kZXJfZW52ZWxvcGVUYWJsZV8xNSBbMTVdWzZdOwotZXh0ZXJuIGNvbnN0IGludCBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzE2IFsxNl1bNl07Ci0KK2V4dGVybiBjb25zdCBpbnQgRkRLX3NickRlY29kZXJfZW52ZWxvcGVUYWJsZV84WzhdWzVdOworZXh0ZXJuIGNvbnN0IGludCBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzE1WzE1XVs2XTsKK2V4dGVybiBjb25zdCBpbnQgRkRLX3NickRlY29kZXJfZW52ZWxvcGVUYWJsZV8xNlsxNl1bNl07CiBleHRlcm4gY29uc3QgRlJBTUVfSU5GTyBGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzFfMTU7CiBleHRlcm4gY29uc3QgRlJBTUVfSU5GTyBGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzJfMTU7CiBleHRlcm4gY29uc3QgRlJBTUVfSU5GTyBGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzRfMTU7CiBleHRlcm4gY29uc3QgRlJBTUVfSU5GTyBGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzhfMTU7Ci0KIGV4dGVybiBjb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMV8xNjsKIGV4dGVybiBjb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMl8xNjsKIGV4dGVybiBjb25zdCBGUkFNRV9JTkZPIEZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvNF8xNjsKQEAgLTE1NywxNCArMTgwLDEwIEBACiBleHRlcm4gY29uc3QgU0NIQVIgRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX05vaXNlTGV2ZWwxMVRbNjJdWzJdOwogZXh0ZXJuIGNvbnN0IFNDSEFSIEZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19Ob2lzZUJhbGFuY2UxMVRbMjRdWzJdOwogCi0KIC8qCiAgUGFyYW1ldHJpYyBzdGVyZW8KICovCiAKLQotZXh0ZXJuIGNvbnN0IEZJWFBfREJMIGRlY2F5U2NhbGVGYWN0VGFibGVbTk9fUU1GX0NIQU5ORUxTXTsKLQogLyogRklYX0JPUkRFUiBjYW4gaGF2ZSAwLCAxLCAyLCA0IGVudmVsb3BzICovCiBleHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfYUZpeE5vRW52RGVjb2RlWzRdOwogCkBAIC0xODQsNTIgKzIwMywxNCBAQAogZXh0ZXJuIGNvbnN0IEZJWFBfREJMIFNjYWxlRmFjdG9yc0ZpbmVbTk9fSUlEX0xFVkVMU19GSU5FXTsKIGV4dGVybiBjb25zdCBGSVhQX0RCTCBBbHBoYXNbTk9fSUNDX0xFVkVMU107CiAKLSNpZiBkZWZpbmVkKEFSQ0hfUFJFRkVSX01VTFRfMzJ4MTYpCi1leHRlcm4gY29uc3QgRklYUF9TR0wgYUFsbHBhc3NMaW5rRGVjYXlTZXJbTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdOwotZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yUmVRbWZbTk9fUU1GX0NIQU5ORUxTXTsKLWV4dGVybiBjb25zdCBGSVhQX1NHTCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvckltUW1mW05PX1FNRl9DSEFOTkVMU107Ci1leHRlcm4gY29uc3QgRklYUF9TR0wgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JSZVN1YlFtZjIwW05PX1NVQl9RTUZfQ0hBTk5FTFNdOwotZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIGFhRnJhY3REZWxheVBoYXNlRmFjdG9ySW1TdWJRbWYyMFtOT19TVUJfUU1GX0NIQU5ORUxTXTsKLQotZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yU2VyUmVRbWZbTk9fUU1GX0NIQU5ORUxTXVtOT19TRVJJQUxfQUxMUEFTU19MSU5LU107Ci1leHRlcm4gY29uc3QgRklYUF9TR0wgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JTZXJJbVFtZltOT19RTUZfQ0hBTk5FTFNdW05PX1NFUklBTF9BTExQQVNTX0xJTktTXTsKLWV4dGVybiBjb25zdCBGSVhQX1NHTCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlclJlU3ViUW1mMjBbTk9fU1VCX1FNRl9DSEFOTkVMU11bTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdOwotZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yU2VySW1TdWJRbWYyMFtOT19TVUJfUU1GX0NIQU5ORUxTXVtOT19TRVJJQUxfQUxMUEFTU19MSU5LU107Ci0KLWV4dGVybiBjb25zdCBGSVhQX1NHTCBwOF8xM18yMFsxM107Ci1leHRlcm4gY29uc3QgRklYUF9TR0wgcDJfMTNfMjBbMTNdOwotCi0jZWxzZQotZXh0ZXJuIGNvbnN0IEZJWFBfREJMIGFBbGxwYXNzTGlua0RlY2F5U2VyW05PX1NFUklBTF9BTExQQVNTX0xJTktTXTsKLWV4dGVybiBjb25zdCBGSVhQX0RCTCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclJlUW1mW05PX1FNRl9DSEFOTkVMU107Ci1leHRlcm4gY29uc3QgRklYUF9EQkwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JJbVFtZltOT19RTUZfQ0hBTk5FTFNdOwotZXh0ZXJuIGNvbnN0IEZJWFBfREJMIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yUmVTdWJRbWYyMFtOT19TVUJfUU1GX0NIQU5ORUxTXTsKLWV4dGVybiBjb25zdCBGSVhQX0RCTCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvckltU3ViUW1mMjBbTk9fU1VCX1FNRl9DSEFOTkVMU107Ci0KLWV4dGVybiBjb25zdCBGSVhQX0RCTCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlclJlUW1mW05PX1FNRl9DSEFOTkVMU11bTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdOwotZXh0ZXJuIGNvbnN0IEZJWFBfREJMIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yU2VySW1RbWZbTk9fUU1GX0NIQU5ORUxTXVtOT19TRVJJQUxfQUxMUEFTU19MSU5LU107Ci1leHRlcm4gY29uc3QgRklYUF9EQkwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JTZXJSZVN1YlFtZjIwW05PX1NVQl9RTUZfQ0hBTk5FTFNdW05PX1NFUklBTF9BTExQQVNTX0xJTktTXTsKLWV4dGVybiBjb25zdCBGSVhQX0RCTCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlckltU3ViUW1mMjBbTk9fU1VCX1FNRl9DSEFOTkVMU11bTk9fU0VSSUFMX0FMTFBBU1NfTElOS1NdOwotCi1leHRlcm4gY29uc3QgRklYUF9EQkwgcDhfMTNfMjBbMTNdOwotZXh0ZXJuIGNvbnN0IEZJWFBfREJMIHAyXzEzXzIwWzEzXTsKLSNlbmRpZgotCi1leHRlcm4gY29uc3QgVUNIQVIgYUFsbHBhc3NMaW5rRGVsYXlTZXJbM107Ci1leHRlcm4gY29uc3QgVUNIQVIgZGVsYXlJbmRleFFtZltOT19RTUZfQ0hBTk5FTFNdOwotZXh0ZXJuIGNvbnN0IFVDSEFSIGdyb3VwQm9yZGVyczIwW05PX0lJRF9HUk9VUFMgKyAxXTsKLWV4dGVybiBjb25zdCBVQ0hBUiBncm91cEJvcmRlcnMzNFtOT19JSURfR1JPVVBTX0hJX1JFUyArIDFdOwogZXh0ZXJuIGNvbnN0IFVDSEFSIGJpbnMyZ3JvdXBNYXAyMFtOT19JSURfR1JPVVBTXTsKLWV4dGVybiBjb25zdCBVQ0hBUiBxdWFudGl6ZWRJSURzW05PX0lJRF9TVEVQU107Ci1leHRlcm4gY29uc3QgVUNIQVIgcXVhbnRpemVkSUlEc0ZpbmVbTk9fSUlEX1NURVBTX0ZJTkVdOwogZXh0ZXJuIGNvbnN0IFVDSEFSIEZES19zYnJEZWNvZGVyX2FOb0lpZEJpbnNbM107CiBleHRlcm4gY29uc3QgVUNIQVIgRkRLX3NickRlY29kZXJfYU5vSWNjQmluc1szXTsKIAotCiAvKiBMb29rdXAgdGFibGVzIGZvciBzb21lIGFyaXRobWV0aWMgZnVuY3Rpb25zICovCiAKICNkZWZpbmUgSU5WX1RBQkxFX0JJVFMgOAotI2RlZmluZSBJTlZfVEFCTEVfU0laRSAoMTw8SU5WX1RBQkxFX0JJVFMpCisjZGVmaW5lIElOVl9UQUJMRV9TSVpFICgxIDw8IElOVl9UQUJMRV9CSVRTKQogZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIEZES19zYnJEZWNvZGVyX2ludlRhYmxlW0lOVl9UQUJMRV9TSVpFXTsKIAotI2VuZGlmIC8vIF9fcm9tX0gKKyNlbmRpZiAgLy8gU0JSX1JPTV9ICmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3Nicl9zY2FsZS5oIGIvbGliU0JSZGVjL3NyYy9zYnJfc2NhbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZjY2Q3MS4uMDAwMDAwMAotLS0gYS9saWJTQlJkZWMvc3JjL3Nicl9zY2FsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiEKLVxmaWxlCi1cYnJpZWYgU2JyIHNjYWxpbmcgZmFjdG9ycywgIAotVG8gZGVhbCB3aXRoIHRoZSBkeW5hbWljIHJhbmdlIGluIHRoZSBkaWZmZXJlbnQgcHJvY2Vzc2luZyBzdGFnZXMsIGEKLWZpeGVkIHBvaW50IHNwZWNpZmljIGNvZGUgaGFzIHRvIHJlbHkgb24gc2NhbGluZyBmYWN0b3JzLiBBIGZsb2F0aW5nCi1wb2ludCBjb2RlIGNhcnJpZXMgYSBzY2FsaW5nIGZhY3RvciAtLSB0aGUgZXhwb25lbnQgLS0gZm9yIGVhY2ggdmFsdWUsCi1zbyBzY2FsaW5nIGlzIG5vdCBuZWNlc3NhcnkgdGhlcmUuCi0KLVRoZSBvdXRwdXQgb2YgdGhlIGNvcmUgZGVjb2RlciAobG93IGJhbmQpIGlzIHNjYWxlZCB1cCB0byBjb3ZlciBhcyBtdWNoCi1hcyBwb3NzaWJsZSBiaXRzIGZvciBlYWNoIHZhbHVlLiBBcyBoaWdoIGJhbmQgYW5kIGxvdyBiYW5kIGFyZSBwcm9jZXNzZWQKLWluIGRpZmZlcmVudCBhbGdvcml0aG0gc2VjdGlvbnMsIHRoZXkgcmVxdWlyZSB0aGVpciBvd24gc2NhbGluZwotZmFjdG9ycy4gSW4gYWRkaXRpb24sIGFueSBzdGF0aWMgYnVmZmVycywgZS5nLiBmaWx0ZXIgc3RhdGVzLCByZXF1aXJlIGEKLXNlcGFyYXRlIHNjYWxpbmcgZmFjdG9yIGFzIHdlbGwuIFRoZSBjb2RlIHRha2VzIGNhcmUgdG8gZG8gdGhlIHByb3BlcgotYWRqdXN0bWVudCwgaWYgc2NhbGluZyBmYWN0b3JzIG9mIGEgZmlsdGVyIHN0YXRlIGFuZCB0aGUgdGltZSBzaWduYWwgZGlmZmVyLgotCi1cc2EgI1FNRl9TQ0FMRV9GQUNUT1IsIFxyZWYgZG9jdW1lbnRhdGlvbk92ZXJ2aWV3Ci0qLwotCi0jaWZuZGVmIF9fU0JSX1NDQUxFX0gKLSNkZWZpbmUgX19TQlJfU0NBTEVfSAotCi0vKiEKLVx2ZXJiYXRpbQotICBzY2FsZToKLSAgICAwICAgICAgICAgICAgIGxlZnQgYWxpZ25lZCBlLmcuIHxtYXh8ID49MC41Ci0gICAgRlJBQ1RfQklUUy0xICB6ZXJvIGUuZyB8bWF4fCA9IDAKLVxlbmR2ZXJiYXRpbQotCi0gIER5bmFtaWMgc2NhbGluZyBpcyB1c2VkIHRvIGFjaGlldmUgc3VmZmljaWVudCBhY2N1cmFjeSBldmVuIHdoZW4gdGhlIHNpZ25hbAotICBlbmVyZ3kgaXMgbG93LiAgVGhlIGR5bmFtaWMgZnJhbWluZyBvZiBTQlIgcHJvZHVjZXMgYSB2YXJpYWJsZSBvdmVybGFwIGFyZWEKLSAgd2hlcmUgc2FtcGxlcyBmcm9tIHRoZSBwcmV2aW91cyBRTUYtQW5hbHlzaXMgYXJlIHN0b3JlZC4gRGVwZW5kaW5nIG9uIHRoZQotICBzdGFydCBwb3NpdGlvbiBhbmQgc3RvcCBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBTQlIgZW52ZWxvcGVzLCB0aGUgcHJvY2Vzc2luZwotICBidWZmZXIgY29uc2lzdHMgb2YgZGlmZmVyZW50bHkgc2NhbGVkIHJlZ2lvbnMgbGlrZSBpbGx1c3RyYXRlZCBpbiB0aGUgYmVsb3cKLSAgZmlndXJlLgotCi0gIFxpbWFnZSBodG1sIHNjYWxlcy5wbmcgU2NhbGUKLSovCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3NicmRlY19kcmMuY3BwIGIvbGliU0JSZGVjL3NyYy9zYnJkZWNfZHJjLmNwcAppbmRleCBhODM0YzBiLi4yZDczZjMyIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL3NicmRlY19kcmMuY3BwCisrKyBiL2xpYlNCUmRlYy9zcmMvc2JyZGVjX2RyYy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjMgKzkwLDI4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHLTQgQUFDIERlY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZGVjb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEdyaWViZWwKKwogICAgRGVzY3JpcHRpb246IER5bmFtaWMgcmFuZ2UgY29udHJvbCAoRFJDKSBkZWNvZGVyIHRvb2wgZm9yIFNCUgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAic2JyZGVjX2RyYy5oIgogCi0KLS8qIERSQyAtIE9mZnNldCB0YWJsZSBmb3IgUU1GIGludGVycG9sYXRpb24uICovCi1zdGF0aWMgY29uc3QgaW50IG9mZnNldFRhYlsyXVsxNl0gPQotewotICB7IDAsIDQsIDgsIDEyLCAxNiwgMjAsIDI0LCAyOCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LCAgLyogMTAyNCBmcmFtaW5nICovCi0gIHsgMCwgNCwgOCwgMTIsIDE2LCAxOSwgMjIsIDI2LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0gICAvKiAgOTYwIGZyYW1pbmcgKi8KKy8qIERSQyAtIE9mZnNldCB0YWJsZSBmb3IgUU1GIGludGVycG9sYXRpb24uIFNoaWZ0ZWQgYnkgb25lIGluZGV4IHBvc2l0aW9uLgorICAgVGhlIHRhYmxlIGRlZmluZXMgdGhlIChzaG9ydCkgd2luZG93IGJvcmRlcnMgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBRTUYKKyAgIHRpbWVzbG90LiBJdCBoYXMgdGhlIHNpemUgMTYgYmVjYXVzZSBpdCBpcyBhY2Nlc3NlZCB3aXRoIHRoZQorICAgZHJjSW50ZXJwb2xhdGlvblNjaGVtZSB0aGF0IGlzIHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGggNCBiaXQuICovCitzdGF0aWMgY29uc3QgVUNIQVIgd2luQm9yZGVyVG9Db2xNYXBwaW5nVGFiWzJdWzE2XSA9IHsKKyAgICAvKi0xLCAwLCAxLCAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4ICovCisgICAgezAsIDAsIDQsIDgsIDEyLCAxNiwgMjAsIDI0LCAyOCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzJ9LCAvKiAxMDI0IGZyYW1pbmcgKi8KKyAgICB7MCwgMCwgNCwgOCwgMTEsIDE1LCAxOSwgMjMsIDI2LCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLAorICAgICAzMH0gLyogIDk2MCBmcmFtaW5nICovCiB9OwogCiAvKiEKQEAgLTEwNSw5ICsxMjEsNyBAQAogCiAgIFxyZXR1cm4gbm9uZQogKi8KLXZvaWQgc2JyRGVjb2Rlcl9kcmNJbml0Q2hhbm5lbCAoCi0gICAgSEFORExFX1NCUl9EUkNfQ0hBTk5FTCAgaERyY0RhdGEgKQotewordm9pZCBzYnJEZWNvZGVyX2RyY0luaXRDaGFubmVsKEhBTkRMRV9TQlJfRFJDX0NIQU5ORUwgaERyY0RhdGEpIHsKICAgaW50IGJhbmQ7CiAKICAgaWYgKGhEcmNEYXRhID09IE5VTEwpIHsKQEAgLTEzOSw3ICsxNTMsNiBAQAogICBoRHJjRGF0YS0+ZW5hYmxlID0gMDsKIH0KIAotCiAvKiEKICAgXGJyaWVmIFN3YXAgRFJDIFFNRiBzY2FsaW5nIGZhY3RvcnMgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gYXBwbGllZC4KIApAQCAtMTQ3LDkgKzE2MCw3IEBACiAKICAgXHJldHVybiBub25lCiAqLwotdm9pZCBzYnJEZWNvZGVyX2RyY1VwZGF0ZUNoYW5uZWwgKAotICAgIEhBTkRMRV9TQlJfRFJDX0NIQU5ORUwgIGhEcmNEYXRhICkKLXsKK3ZvaWQgc2JyRGVjb2Rlcl9kcmNVcGRhdGVDaGFubmVsKEhBTkRMRV9TQlJfRFJDX0NIQU5ORUwgaERyY0RhdGEpIHsKICAgaWYgKGhEcmNEYXRhID09IE5VTEwpIHsKICAgICByZXR1cm47CiAgIH0KQEAgLTE1OCwyNCArMTY5LDIxIEBACiAgIH0KIAogICAvKiBzd2FwIHByZXZpb3VzIGRhdGEgKi8KLSAgRkRLbWVtY3B5KCBoRHJjRGF0YS0+Y3VyckZhY3RfbWFnLAotICAgICAgICAgICAgIGhEcmNEYXRhLT5uZXh0RmFjdF9tYWcsCi0gICAgICAgICAgICAgU0JSREVDX01BWF9EUkNfQkFORFMgKiBzaXplb2YoRklYUF9EQkwpICk7CisgIEZES21lbWNweShoRHJjRGF0YS0+Y3VyckZhY3RfbWFnLCBoRHJjRGF0YS0+bmV4dEZhY3RfbWFnLAorICAgICAgICAgICAgU0JSREVDX01BWF9EUkNfQkFORFMgKiBzaXplb2YoRklYUF9EQkwpKTsKIAogICBoRHJjRGF0YS0+Y3VyckZhY3RfZXhwID0gaERyY0RhdGEtPm5leHRGYWN0X2V4cDsKIAogICBoRHJjRGF0YS0+bnVtQmFuZHNDdXJyID0gaERyY0RhdGEtPm51bUJhbmRzTmV4dDsKIAotICBGREttZW1jcHkoIGhEcmNEYXRhLT5iYW5kVG9wQ3VyciwKLSAgICAgICAgICAgICBoRHJjRGF0YS0+YmFuZFRvcE5leHQsCi0gICAgICAgICAgICAgU0JSREVDX01BWF9EUkNfQkFORFMgKiBzaXplb2YoVVNIT1JUKSApOworICBGREttZW1jcHkoaERyY0RhdGEtPmJhbmRUb3BDdXJyLCBoRHJjRGF0YS0+YmFuZFRvcE5leHQsCisgICAgICAgICAgICBTQlJERUNfTUFYX0RSQ19CQU5EUyAqIHNpemVvZihVU0hPUlQpKTsKIAogICBoRHJjRGF0YS0+ZHJjSW50ZXJwb2xhdGlvblNjaGVtZUN1cnIgPSBoRHJjRGF0YS0+ZHJjSW50ZXJwb2xhdGlvblNjaGVtZU5leHQ7CiAKICAgaERyY0RhdGEtPndpblNlcXVlbmNlQ3VyciA9IGhEcmNEYXRhLT53aW5TZXF1ZW5jZU5leHQ7CiB9CiAKLQogLyohCiAgIFxicmllZiBBcHBseSBEUkMgZmFjdG9ycyBzbG90IGJhc2VkLgogCkBAIC0xODgsMjAgKzE5NiwxNSBAQAogCiAgIFxyZXR1cm4gTm9uZS4KICovCi12b2lkIHNickRlY29kZXJfZHJjQXBwbHlTbG90ICgKLSAgICBIQU5ETEVfU0JSX0RSQ19DSEFOTkVMICBoRHJjRGF0YSwKLSAgICBGSVhQX0RCTCAgICpxbWZSZWFsU2xvdCwKLSAgICBGSVhQX0RCTCAgICpxbWZJbWFnU2xvdCwKLSAgICBpbnQgIGNvbCwKLSAgICBpbnQgIG51bVFtZlN1YlNhbXBsZXMsCi0gICAgaW50ICBtYXhTaGlmdAotICApCi17Ci0gIGNvbnN0IGludCAqb2Zmc2V0Owordm9pZCBzYnJEZWNvZGVyX2RyY0FwcGx5U2xvdChIQU5ETEVfU0JSX0RSQ19DSEFOTkVMIGhEcmNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcW1mUmVhbFNsb3QsIEZJWFBfREJMICpxbWZJbWFnU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbCwgaW50IG51bVFtZlN1YlNhbXBsZXMsIGludCBtYXhTaGlmdCkgeworICBjb25zdCBVQ0hBUiAqd2luQm9yZGVyVG9Db2xNYXA7CiAKICAgaW50IGJhbmQsIGJvdHRvbU1kY3QsIHRvcE1kY3QsIGJpbiwgdXNlTFA7Ci0gIGludCBpbmR4ID0gbnVtUW1mU3ViU2FtcGxlcyAtIChudW1RbWZTdWJTYW1wbGVzID4+IDEpIC0gMTA7ICAgLyogbF9ib3JkZXIgKi8KKyAgaW50IGluZHggPSBudW1RbWZTdWJTYW1wbGVzIC0gKG51bVFtZlN1YlNhbXBsZXMgPj4gMSkgLSAxMDsgLyogbF9ib3JkZXIgKi8KICAgaW50IGZyYW1lTGVuRmxhZyA9IChudW1RbWZTdWJTYW1wbGVzID09IDMwKSA/IDEgOiAwOworICBpbnQgZnJhbWVTaXplID0gKGZyYW1lTGVuRmxhZyA9PSAxKSA/IDk2MCA6IDEwMjQ7CiAKICAgY29uc3QgRklYUF9EQkwgKmZhY3RfbWFnID0gTlVMTDsKICAgSU5UIGZhY3RfZXhwID0gMDsKQEAgLTIxOCwzMSArMjIxLDI4IEBACiAgICAgcmV0dXJuOwogICB9CiAKLSAgb2Zmc2V0ID0gb2Zmc2V0VGFiW2ZyYW1lTGVuRmxhZ107CisgIHdpbkJvcmRlclRvQ29sTWFwID0gd2luQm9yZGVyVG9Db2xNYXBwaW5nVGFiW2ZyYW1lTGVuRmxhZ107CiAKICAgdXNlTFAgPSAocW1mSW1hZ1Nsb3QgPT0gTlVMTCkgPyAxIDogMDsKIAogICBjb2wgKz0gaW5keDsKICAgYm90dG9tTWRjdCA9IDA7Ci0gIGJpbiA9IDA7CiAKICAgLyogZ2V0IHJlc3BlY3RpdmUgZGF0YSBhbmQgY2FsYyBpbnRlcnBvbGF0aW9uIGZhY3RvciAqLwotICBpZiAoY29sIDwgKG51bVFtZlN1YlNhbXBsZXM+PjEpKSB7ICAvKiBmaXJzdCBoYWxmIG9mIGN1cnJlbnQgZnJhbWUgKi8KKyAgaWYgKGNvbCA8IChudW1RbWZTdWJTYW1wbGVzID4+IDEpKSB7ICAgIC8qIGZpcnN0IGhhbGYgb2YgY3VycmVudCBmcmFtZSAqLwogICAgIGlmIChoRHJjRGF0YS0+d2luU2VxdWVuY2VDdXJyICE9IDIpIHsgLyogbG9uZyB3aW5kb3cgKi8KLSAgICAgIGludCBqID0gY29sICsgKG51bVFtZlN1YlNhbXBsZXM+PjEpOworICAgICAgaW50IGogPSBjb2wgKyAobnVtUW1mU3ViU2FtcGxlcyA+PiAxKTsKIAogICAgICAgaWYgKGhEcmNEYXRhLT5kcmNJbnRlcnBvbGF0aW9uU2NoZW1lQ3VyciA9PSAwKSB7Ci0gICAgICAgIElOVCBrID0gKGZyYW1lTGVuRmxhZykgPyAweDQ0NDQ0NDQgOiAweDQwMDAwMDA7CisgICAgICAgIElOVCBrID0gKGZyYW1lTGVuRmxhZykgPyAweDQ0NDQ0NDUgOiAweDQwMDAwMDA7CiAKICAgICAgICAgYWxwaGFWYWx1ZSA9IChGSVhQX0RCTCkoaiAqIGspOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGlmIChqID49IG9mZnNldFtoRHJjRGF0YS0+ZHJjSW50ZXJwb2xhdGlvblNjaGVtZUN1cnIgLSAxXSkgeworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGogPj0gKGludCl3aW5Cb3JkZXJUb0NvbE1hcFtoRHJjRGF0YS0+ZHJjSW50ZXJwb2xhdGlvblNjaGVtZUN1cnJdKSB7CiAgICAgICAgICAgYWxwaGFWYWx1ZSA9IChGSVhQX0RCTClNQVhWQUxfREJMOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgeyAgLyogc2hvcnQgd2luZG93cyAqLworICAgIH0gZWxzZSB7IC8qIHNob3J0IHdpbmRvd3MgKi8KICAgICAgIHNob3J0RHJjID0gMTsKICAgICB9CiAKQEAgLTI1MCwxOCArMjUwLDE2IEBACiAgICAgZmFjdF9leHAgPSBoRHJjRGF0YS0+Y3VyckZhY3RfZXhwOwogICAgIG51bUJhbmRzID0gaERyY0RhdGEtPm51bUJhbmRzQ3VycjsKICAgICBiYW5kVG9wID0gaERyY0RhdGEtPmJhbmRUb3BDdXJyOwotICB9Ci0gIGVsc2UgaWYgKGNvbCA8IG51bVFtZlN1YlNhbXBsZXMpIHsgIC8qIHNlY29uZCBoYWxmIG9mIGN1cnJlbnQgZnJhbWUgKi8KKyAgfSBlbHNlIGlmIChjb2wgPCBudW1RbWZTdWJTYW1wbGVzKSB7ICAgIC8qIHNlY29uZCBoYWxmIG9mIGN1cnJlbnQgZnJhbWUgKi8KICAgICBpZiAoaERyY0RhdGEtPndpblNlcXVlbmNlTmV4dCAhPSAyKSB7IC8qIG5leHQ6IGxvbmcgd2luZG93ICovCi0gICAgICBpbnQgaiA9IGNvbCAtIChudW1RbWZTdWJTYW1wbGVzPj4xKTsKKyAgICAgIGludCBqID0gY29sIC0gKG51bVFtZlN1YlNhbXBsZXMgPj4gMSk7CiAKICAgICAgIGlmIChoRHJjRGF0YS0+ZHJjSW50ZXJwb2xhdGlvblNjaGVtZU5leHQgPT0gMCkgewotICAgICAgICBJTlQgayA9IChmcmFtZUxlbkZsYWcpID8gMHg0NDQ0NDQ0IDogMHg0MDAwMDAwOworICAgICAgICBJTlQgayA9IChmcmFtZUxlbkZsYWcpID8gMHg0NDQ0NDQ1IDogMHg0MDAwMDAwOwogCiAgICAgICAgIGFscGhhVmFsdWUgPSAoRklYUF9EQkwpKGogKiBrKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpZiAoaiA+PSBvZmZzZXRbaERyY0RhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWVOZXh0IC0gMV0pIHsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChqID49IChpbnQpd2luQm9yZGVyVG9Db2xNYXBbaERyY0RhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWVOZXh0XSkgewogICAgICAgICAgIGFscGhhVmFsdWUgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKICAgICAgICAgfQogICAgICAgfQpAQCAtMjcwLDE3ICsyNjgsMTUgQEAKICAgICAgIGZhY3RfZXhwID0gaERyY0RhdGEtPm5leHRGYWN0X2V4cDsKICAgICAgIG51bUJhbmRzID0gaERyY0RhdGEtPm51bUJhbmRzTmV4dDsKICAgICAgIGJhbmRUb3AgPSBoRHJjRGF0YS0+YmFuZFRvcE5leHQ7Ci0gICAgfQotICAgIGVsc2UgeyAgLyogbmV4dDogc2hvcnQgd2luZG93cyAqLwotICAgICAgaWYgKGhEcmNEYXRhLT53aW5TZXF1ZW5jZUN1cnIgIT0gMikgeyAgLyogY3VycmVudDogbG9uZyB3aW5kb3cgKi8KKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dDogc2hvcnQgd2luZG93cyAqLworICAgICAgaWYgKGhEcmNEYXRhLT53aW5TZXF1ZW5jZUN1cnIgIT0gMikgeyAvKiBjdXJyZW50OiBsb25nIHdpbmRvdyAqLwogICAgICAgICBhbHBoYVZhbHVlID0gKEZJWFBfREJMKTA7CiAKICAgICAgICAgZmFjdF9tYWcgPSBoRHJjRGF0YS0+bmV4dEZhY3RfbWFnOwogICAgICAgICBmYWN0X2V4cCA9IGhEcmNEYXRhLT5uZXh0RmFjdF9leHA7CiAgICAgICAgIG51bUJhbmRzID0gaERyY0RhdGEtPm51bUJhbmRzTmV4dDsKICAgICAgICAgYmFuZFRvcCA9IGhEcmNEYXRhLT5iYW5kVG9wTmV4dDsKLSAgICAgIH0KLSAgICAgIGVsc2UgeyAgLyogY3VycmVudDogc2hvcnQgd2luZG93cyAqLworICAgICAgfSBlbHNlIHsgLyogY3VycmVudDogc2hvcnQgd2luZG93cyAqLwogICAgICAgICBzaG9ydERyYyA9IDE7CiAKICAgICAgICAgZmFjdF9tYWcgPSBoRHJjRGF0YS0+Y3VyckZhY3RfbWFnOwpAQCAtMjg5LDIzICsyODUsMjAgQEAKICAgICAgICAgYmFuZFRvcCA9IGhEcmNEYXRhLT5iYW5kVG9wQ3VycjsKICAgICAgIH0KICAgICB9Ci0gIH0KLSAgZWxzZSB7ICAvKiBmaXJzdCBoYWxmIG9mIG5leHQgZnJhbWUgKi8KKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGhhbGYgb2YgbmV4dCBmcmFtZSAqLwogICAgIGlmIChoRHJjRGF0YS0+d2luU2VxdWVuY2VOZXh0ICE9IDIpIHsgLyogbG9uZyB3aW5kb3cgKi8KLSAgICAgIGludCBqID0gY29sIC0gKG51bVFtZlN1YlNhbXBsZXM+PjEpOworICAgICAgaW50IGogPSBjb2wgLSAobnVtUW1mU3ViU2FtcGxlcyA+PiAxKTsKIAogICAgICAgaWYgKGhEcmNEYXRhLT5kcmNJbnRlcnBvbGF0aW9uU2NoZW1lTmV4dCA9PSAwKSB7Ci0gICAgICAgIElOVCBrID0gKGZyYW1lTGVuRmxhZykgPyAweDQ0NDQ0NDQgOiAweDQwMDAwMDA7CisgICAgICAgIElOVCBrID0gKGZyYW1lTGVuRmxhZykgPyAweDQ0NDQ0NDUgOiAweDQwMDAwMDA7CiAKICAgICAgICAgYWxwaGFWYWx1ZSA9IChGSVhQX0RCTCkoaiAqIGspOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGlmIChqID49IG9mZnNldFtoRHJjRGF0YS0+ZHJjSW50ZXJwb2xhdGlvblNjaGVtZU5leHQgLSAxXSkgeworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGogPj0gKGludCl3aW5Cb3JkZXJUb0NvbE1hcFtoRHJjRGF0YS0+ZHJjSW50ZXJwb2xhdGlvblNjaGVtZU5leHRdKSB7CiAgICAgICAgICAgYWxwaGFWYWx1ZSA9IChGSVhQX0RCTClNQVhWQUxfREJMOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgeyAgLyogc2hvcnQgd2luZG93cyAqLworICAgIH0gZWxzZSB7IC8qIHNob3J0IHdpbmRvd3MgKi8KICAgICAgIHNob3J0RHJjID0gMTsKICAgICB9CiAKQEAgLTMxNywzNyArMzEwLDMzIEBACiAgICAgY29sIC09IG51bVFtZlN1YlNhbXBsZXM7CiAgIH0KIAotCiAgIC8qIHByb2Nlc3MgYmFuZHMgKi8KICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IChpbnQpbnVtQmFuZHM7IGJhbmQrKykgewogICAgIGludCBib3R0b21RbWYsIHRvcFFtZjsKIAogICAgIEZJWFBfREJMIGRyY0ZhY3RfbWFnID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CiAKLSAgICB0b3BNZGN0ID0gKGJhbmRUb3BbYmFuZF0rMSkgPDwgMjsKKyAgICB0b3BNZGN0ID0gKGJhbmRUb3BbYmFuZF0gKyAxKSA8PCAyOwogCi0gICAgaWYgKCFzaG9ydERyYykgeyAgLyogbG9uZyB3aW5kb3cgKi8KKyAgICBpZiAoIXNob3J0RHJjKSB7IC8qIGxvbmcgd2luZG93ICovCiAgICAgICBpZiAoZnJhbWVMZW5GbGFnKSB7CiAgICAgICAgIC8qIDk2MCBmcmFtaW5nICovCi0gICAgICAgIGJvdHRvbU1kY3QgPSAzMCAqIChib3R0b21NZGN0IC8gMzApOwotICAgICAgICB0b3BNZGN0ICAgID0gMzAgKiAodG9wTWRjdCAvIDMwKTsKKyAgICAgICAgYm90dG9tUW1mID0gZk11bHRJZmxvb3IoKEZJWFBfREJMKTB4NDQ0NDQ0NSwgYm90dG9tTWRjdCk7CisgICAgICAgIHRvcFFtZiA9IGZNdWx0SWZsb29yKChGSVhQX0RCTCkweDQ0NDQ0NDUsIHRvcE1kY3QpOwogCi0gICAgICAgIGJvdHRvbVFtZiA9IGZNdWx0SWZsb29yKChGSVhQX0RCTCkweDQ0NDQ0NDQsIGJvdHRvbU1kY3QpOwotICAgICAgICB0b3BRbWYgICAgPSBmTXVsdElmbG9vcigoRklYUF9EQkwpMHg0NDQ0NDQ0LCB0b3BNZGN0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgeworICAgICAgICB0b3BNZGN0ID0gMzAgKiB0b3BRbWY7CisgICAgICB9IGVsc2UgewogICAgICAgICAvKiAxMDI0IGZyYW1pbmcgKi8KLSAgICAgICAgYm90dG9tTWRjdCAmPSB+MHgxZjsKLSAgICAgICAgdG9wTWRjdCAgICAmPSB+MHgxZjsKKyAgICAgICAgdG9wTWRjdCAmPSB+MHgxZjsKIAogICAgICAgICBib3R0b21RbWYgPSBib3R0b21NZGN0ID4+IDU7Ci0gICAgICAgIHRvcFFtZiAgICA9IHRvcE1kY3QgPj4gNTsKKyAgICAgICAgdG9wUW1mID0gdG9wTWRjdCA+PiA1OwogICAgICAgfQogCi0gICAgICBpZiAoYmFuZCA9PSAoKGludCludW1CYW5kcy0xKSkgeworICAgICAgaWYgKGJhbmQgPT0gKChpbnQpbnVtQmFuZHMgLSAxKSkgewogICAgICAgICB0b3BRbWYgPSAoNjQpOwogICAgICAgfQotICAgIAorCiAgICAgICBmb3IgKGJpbiA9IGJvdHRvbVFtZjsgYmluIDwgdG9wUW1mOyBiaW4rKykgewogICAgICAgICBGSVhQX0RCTCBkcmNGYWN0MV9tYWcgPSBoRHJjRGF0YS0+cHJldkZhY3RfbWFnW2Jpbl07CiAgICAgICAgIEZJWFBfREJMIGRyY0ZhY3QyX21hZyA9IGZhY3RfbWFnW2JhbmRdOwpAQCAtMzY2LDcgKzM1NSw5IEBACiAgICAgICAgIH0gZWxzZSBpZiAoYWxwaGFWYWx1ZSA9PSAoRklYUF9EQkwpTUFYVkFMX0RCTCkgewogICAgICAgICAgIGRyY0ZhY3RfbWFnID0gZHJjRmFjdDJfbWFnOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGRyY0ZhY3RfbWFnID0gZk11bHQoYWxwaGFWYWx1ZSwgZHJjRmFjdDJfbWFnKSArIGZNdWx0KCgoRklYUF9EQkwpTUFYVkFMX0RCTCAtIGFscGhhVmFsdWUpLCBkcmNGYWN0MV9tYWcpOworICAgICAgICAgIGRyY0ZhY3RfbWFnID0KKyAgICAgICAgICAgICAgZk11bHQoYWxwaGFWYWx1ZSwgZHJjRmFjdDJfbWFnKSArCisgICAgICAgICAgICAgIGZNdWx0KCgoRklYUF9EQkwpTUFYVkFMX0RCTCAtIGFscGhhVmFsdWUpLCBkcmNGYWN0MV9tYWcpOwogICAgICAgICB9CiAKICAgICAgICAgLyogYXBwbHkgc2NhbGluZyAqLwpAQCAtMzc2LDUzICszNjcsNzggQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qIHNhdmUgcHJldmlvdXMgZmFjdG9ycyAqLwotICAgICAgICBpZiAoY29sID09IChudW1RbWZTdWJTYW1wbGVzPj4xKS0xKSB7CisgICAgICAgIGlmIChjb2wgPT0gKG51bVFtZlN1YlNhbXBsZXMgPj4gMSkgLSAxKSB7CiAgICAgICAgICAgaERyY0RhdGEtPnByZXZGYWN0X21hZ1tiaW5dID0gZmFjdF9tYWdbYmFuZF07CiAgICAgICAgIH0KICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7ICAvKiBzaG9ydCB3aW5kb3dzICovCi0gICAgICBpbnQgc3RhcnRTYW1wbGUsIHN0b3BTYW1wbGU7Ci0gICAgICBGSVhQX0RCTCBpbnZGcmFtZVNpemVEaXY4ID0gKGZyYW1lTGVuRmxhZykgPyAoRklYUF9EQkwpMHgxMTExMTExIDogKEZJWFBfREJMKTB4MTAwMDAwMDsKKyAgICB9IGVsc2UgeyAvKiBzaG9ydCB3aW5kb3dzICovCisgICAgICB1bnNpZ25lZCBzdGFydFdpbklkeCwgc3RvcFdpbklkeDsKKyAgICAgIGludCBzdGFydENvbCwgc3RvcENvbDsKKyAgICAgIEZJWFBfREJMIGludkZyYW1lU2l6ZURpdjggPQorICAgICAgICAgIChmcmFtZUxlbkZsYWcpID8gKEZJWFBfREJMKTB4MTExMTExMiA6IChGSVhQX0RCTCkweDEwMDAwMDA7CisKKyAgICAgIC8qIGxpbWl0IHRvcCBhdCB0aGUgZnJhbWUgYm9yZGVycyAqLworICAgICAgaWYgKHRvcE1kY3QgPCAwKSB7CisgICAgICAgIHRvcE1kY3QgPSAwOworICAgICAgfQorICAgICAgaWYgKHRvcE1kY3QgPj0gZnJhbWVTaXplKSB7CisgICAgICAgIHRvcE1kY3QgPSBmcmFtZVNpemUgLSAxOworICAgICAgfQogCiAgICAgICBpZiAoZnJhbWVMZW5GbGFnKSB7CiAgICAgICAgIC8qICA5NjAgZnJhbWluZyAqLwotICAgICAgICBib3R0b21NZGN0ID0gMzAvOCAqIChib3R0b21NZGN0KjgvMzApOwotICAgICAgICB0b3BNZGN0ICAgID0gMzAvOCAqICh0b3BNZGN0KjgvMzApOwotICAgICAgfQotICAgICAgZWxzZSB7CisgICAgICAgIHRvcE1kY3QgPSBmTXVsdElmbG9vcigoRklYUF9EQkwpMHg3ODAwMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNdWx0SWZsb29yKChGSVhQX0RCTCkweDIyMjIyMjIzLCB0b3BNZGN0KSA8PCAyKTsKKworICAgICAgICBzdGFydFdpbklkeCA9IGZNdWx0SWZsb29yKGludkZyYW1lU2l6ZURpdjgsIGJvdHRvbU1kY3QpICsKKyAgICAgICAgICAgICAgICAgICAgICAxOyAvKiB3aW5Cb3JkZXJUb0NvbE1hcCB0YWJsZSBoYXMgb2Zmc2V0IG9mIDEgKi8KKyAgICAgICAgc3RvcFdpbklkeCA9IGZNdWx0SWNlaWwoaW52RnJhbWVTaXplRGl2OCAtIChGSVhQX0RCTCkxLCB0b3BNZGN0KSArIDE7CisgICAgICB9IGVsc2UgewogICAgICAgICAvKiAxMDI0IGZyYW1pbmcgKi8KLSAgICAgICAgYm90dG9tTWRjdCAmPSB+MHgwMzsKLSAgICAgICAgdG9wTWRjdCAgICAmPSB+MHgwMzsKKyAgICAgICAgdG9wTWRjdCAmPSB+MHgwMzsKKworICAgICAgICBzdGFydFdpbklkeCA9IGZNdWx0SWZsb29yKGludkZyYW1lU2l6ZURpdjgsIGJvdHRvbU1kY3QpICsgMTsKKyAgICAgICAgc3RvcFdpbklkeCA9IGZNdWx0SWNlaWwoaW52RnJhbWVTaXplRGl2OCwgdG9wTWRjdCkgKyAxOwogICAgICAgfQogCi0gICAgICAvKiBzdGFydFNhbXBsZSBpcyB0cnVuY2F0ZWQgdG8gdGhlIG5lYXJlc3QgY29ycmVzcG9uZGluZyBzdGFydCBzdWJzYW1wbGUgaW4KKyAgICAgIC8qIHN0YXJ0Q29sIGlzIHRydW5jYXRlZCB0byB0aGUgbmVhcmVzdCBjb3JyZXNwb25kaW5nIHN0YXJ0IHN1YnNhbXBsZSBpbgogICAgICAgICAgdGhlIFFNRiBvZiB0aGUgc2hvcnQgd2luZG93IGJvdHRvbSBpcyBwcmVzZW50IGluOiovCi0gICAgICBzdGFydFNhbXBsZSAgPSAoKGZNdWx0SWZsb29yKCBpbnZGcmFtZVNpemVEaXY4LCBib3R0b21NZGN0ICkgJiAweDcpICogbnVtUW1mU3ViU2FtcGxlcykgPj4gMzsKKyAgICAgIHN0YXJ0Q29sID0gKGludCl3aW5Cb3JkZXJUb0NvbE1hcFtzdGFydFdpbklkeF07CiAKLSAgICAgIC8qIHN0b3BTYW1wbGUgaXMgcm91bmRlZCB1cHdhcmRzIHRvIHRoZSBuZWFyZXN0IGNvcnJlc3BvbmRpbmcgc3RvcCBzdWJzYW1wbGUKKyAgICAgIC8qIHN0b3BDb2wgaXMgcm91bmRlZCB1cHdhcmRzIHRvIHRoZSBuZWFyZXN0IGNvcnJlc3BvbmRpbmcgc3RvcCBzdWJzYW1wbGUKICAgICAgICAgIGluIHRoZSBRTUYgb2YgdGhlIHNob3J0IHdpbmRvdyB0b3AgaXMgcHJlc2VudCBpbi4gKi8KLSAgICAgIHN0b3BTYW1wbGUgID0gKChmTXVsdEljZWlsKCBpbnZGcmFtZVNpemVEaXY4LCB0b3BNZGN0ICkgJiAweGYpICogbnVtUW1mU3ViU2FtcGxlcykgPj4gMzsKKyAgICAgIHN0b3BDb2wgPSAoaW50KXdpbkJvcmRlclRvQ29sTWFwW3N0b3BXaW5JZHhdOwogCi0gICAgICBib3R0b21RbWYgPSBmTXVsdElmbG9vciggaW52RnJhbWVTaXplRGl2OCwgKChib3R0b21NZGN0JShudW1RbWZTdWJTYW1wbGVzPDwyKSkgPDwgNSkgKTsKLSAgICAgIHRvcFFtZiAgICA9IGZNdWx0SWZsb29yKCBpbnZGcmFtZVNpemVEaXY4LCAoKHRvcE1kY3QlKG51bVFtZlN1YlNhbXBsZXM8PDIpKSA8PCA1KSApOworICAgICAgYm90dG9tUW1mID0gZk11bHRJZmxvb3IoaW52RnJhbWVTaXplRGl2OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYm90dG9tTWRjdCAlIChudW1RbWZTdWJTYW1wbGVzIDw8IDIpKSA8PCA1KSk7CisgICAgICB0b3BRbWYgPSBmTXVsdElmbG9vcihpbnZGcmFtZVNpemVEaXY4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0b3BNZGN0ICUgKG51bVFtZlN1YlNhbXBsZXMgPDwgMikpIDw8IDUpKTsKIAogICAgICAgLyogZXh0ZW5kIGxhc3QgYmFuZCAqLwotICAgICAgaWYgKGJhbmQgPT0gKChpbnQpbnVtQmFuZHMtMSkpIHsKKyAgICAgIGlmIChiYW5kID09ICgoaW50KW51bUJhbmRzIC0gMSkpIHsKICAgICAgICAgdG9wUW1mID0gKDY0KTsKLSAgICAgICAgc3RvcFNhbXBsZSA9IG51bVFtZlN1YlNhbXBsZXM7CisgICAgICAgIHN0b3BDb2wgPSBudW1RbWZTdWJTYW1wbGVzOworICAgICAgICBzdG9wV2luSWR4ID0gMTA7CiAgICAgICB9CiAKICAgICAgIGlmICh0b3BRbWYgPT0gMCkgeworICAgICAgICBpZiAoZnJhbWVMZW5GbGFnKSB7CisgICAgICAgICAgRklYUF9EQkwgcmVtID0gZk11bHQoaW52RnJhbWVTaXplRGl2OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKHRvcE1kY3QgPDwgKERGUkFDVF9CSVRTIC0gMTIpKSk7CisgICAgICAgICAgaWYgKChMT05HKXJlbSAmIChMT05HKTB4MUYpIHsKKyAgICAgICAgICAgIHN0b3BXaW5JZHggLT0gMTsKKyAgICAgICAgICAgIHN0b3BDb2wgPSAoaW50KXdpbkJvcmRlclRvQ29sTWFwW3N0b3BXaW5JZHhdOworICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICB0b3BRbWYgPSAoNjQpOwogICAgICAgfQogCiAgICAgICAvKiBzYXZlIHByZXZpb3VzIGZhY3RvcnMgKi8KLSAgICAgIGlmIChzdG9wU2FtcGxlID09IG51bVFtZlN1YlNhbXBsZXMpIHsKKyAgICAgIGlmIChzdG9wQ29sID09IG51bVFtZlN1YlNhbXBsZXMpIHsKICAgICAgICAgaW50IHRtcEJvdHRvbSA9IGJvdHRvbVFtZjsKIAotICAgICAgICBpZiAoKChudW1RbWZTdWJTYW1wbGVzLTEpICYgfjB4MDMpID4gc3RhcnRTYW1wbGUpIHsKLSAgICAgICAgICAgIHRtcEJvdHRvbSA9IDA7ICAgIC8qIGJhbmQgc3RhcnRzIGluIHByZXZpb3VzIHNob3J0IHdpbmRvdyAqLworICAgICAgICBpZiAoKGludCl3aW5Cb3JkZXJUb0NvbE1hcFs4XSA+IHN0YXJ0Q29sKSB7CisgICAgICAgICAgdG1wQm90dG9tID0gMDsgLyogYmFuZCBzdGFydHMgaW4gcHJldmlvdXMgc2hvcnQgd2luZG93ICovCiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKGJpbiA9IHRtcEJvdHRvbTsgYmluIDwgdG9wUW1mOyBiaW4rKykgewpAQCAtNDMxLDEyICs0NDcsMTIgQEAKICAgICAgIH0KIAogICAgICAgLyogYXBwbHkgKi8KLSAgICAgIGlmICgoY29sID49IHN0YXJ0U2FtcGxlKSAmJiAoY29sIDwgc3RvcFNhbXBsZSkpIHsKLSAgICAgICAgaWYgKChjb2wgJiB+MHgwMykgPiBzdGFydFNhbXBsZSkgewotICAgICAgICAgICAgYm90dG9tUW1mID0gMDsgICAgLyogYmFuZCBzdGFydHMgaW4gcHJldmlvdXMgc2hvcnQgd2luZG93ICovCisgICAgICBpZiAoKGNvbCA+PSBzdGFydENvbCkgJiYgKGNvbCA8IHN0b3BDb2wpKSB7CisgICAgICAgIGlmIChjb2wgPj0gKGludCl3aW5Cb3JkZXJUb0NvbE1hcFtzdGFydFdpbklkeCArIDFdKSB7CisgICAgICAgICAgYm90dG9tUW1mID0gMDsgLyogYmFuZCBzdGFydHMgaW4gcHJldmlvdXMgc2hvcnQgd2luZG93ICovCiAgICAgICAgIH0KLSAgICAgICAgaWYgKGNvbCA8ICgoc3RvcFNhbXBsZS0xKSAmIH4weDAzKSkgewotICAgICAgICAgICAgdG9wUW1mID0gKDY0KTsgICAvKiBiYW5kIGVuZHMgaW4gbmV4dCBzaG9ydCB3aW5kb3cgKi8KKyAgICAgICAgaWYgKGNvbCA8IChpbnQpd2luQm9yZGVyVG9Db2xNYXBbc3RvcFdpbklkeCAtIDFdKSB7CisgICAgICAgICAgdG9wUW1mID0gKDY0KTsgLyogYmFuZCBlbmRzIGluIG5leHQgc2hvcnQgd2luZG93ICovCiAgICAgICAgIH0KIAogICAgICAgICBkcmNGYWN0X21hZyA9IGZhY3RfbWFnW2JhbmRdOwpAQCAtNDU3LDE0ICs0NzMsMTMgQEAKICAgICB9CiAKICAgICBib3R0b21NZGN0ID0gdG9wTWRjdDsKLSAgfSAgIC8qIGVuZCBvZiBiYW5kcyBsb29wICovCisgIH0gLyogZW5kIG9mIGJhbmRzIGxvb3AgKi8KIAotICBpZiAoY29sID09IChudW1RbWZTdWJTYW1wbGVzPj4xKS0xKSB7CisgIGlmIChjb2wgPT0gKG51bVFtZlN1YlNhbXBsZXMgPj4gMSkgLSAxKSB7CiAgICAgaERyY0RhdGEtPnByZXZGYWN0X2V4cCA9IGZhY3RfZXhwOwogICB9CiB9CiAKLQogLyohCiAgIFxicmllZiBBcHBseSBEUkMgZmFjdG9ycyBmcmFtZSBiYXNlZC4KIApAQCAtNDc2LDE0ICs0OTEsOSBAQAogCiAgIFxyZXR1cm4gTm9uZS4KICovCi12b2lkIHNickRlY29kZXJfZHJjQXBwbHkgKAotICAgIEhBTkRMRV9TQlJfRFJDX0NIQU5ORUwgIGhEcmNEYXRhLAotICAgIEZJWFBfREJMICoqUW1mQnVmZmVyUmVhbCwKLSAgICBGSVhQX0RCTCAqKlFtZkJ1ZmZlckltYWcsCi0gICAgaW50ICBudW1RbWZTdWJTYW1wbGVzLAotICAgIGludCAqc2NhbGVGYWN0b3IKLSAgKQotewordm9pZCBzYnJEZWNvZGVyX2RyY0FwcGx5KEhBTkRMRV9TQlJfRFJDX0NIQU5ORUwgaERyY0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipRbWZCdWZmZXJSZWFsLCBGSVhQX0RCTCAqKlFtZkJ1ZmZlckltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bVFtZlN1YlNhbXBsZXMsIGludCAqc2NhbGVGYWN0b3IpIHsKICAgaW50IGNvbDsKICAgaW50IG1heFNoaWZ0ID0gMDsKIApAQCAtNDkxLDcgKzUwMSw4IEBACiAgICAgcmV0dXJuOwogICB9CiAgIGlmIChoRHJjRGF0YS0+ZW5hYmxlID09IDApIHsKLSAgICByZXR1cm47ICAvKiBBdm9pZCBjaGFuZ2luZyB0aGUgc2NhbGVGYWN0b3IgZXZlbiB0aG91Z2ggdGhlIHByb2Nlc3NpbmcgaXMgZGlzYWJsZWQuICovCisgICAgcmV0dXJuOyAvKiBBdm9pZCBjaGFuZ2luZyB0aGUgc2NhbGVGYWN0b3IgZXZlbiB0aG91Z2ggdGhlIHByb2Nlc3NpbmcgaXMKKyAgICAgICAgICAgICAgIGRpc2FibGVkLiAqLwogICB9CiAKICAgLyogZ2V0IG1heCBzY2FsZSBmYWN0b3IgKi8KQEAgLTUwNSwyMSArNTE2LDEzIEBACiAgICAgbWF4U2hpZnQgPSBoRHJjRGF0YS0+bmV4dEZhY3RfZXhwOwogICB9CiAKLSAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1RbWZTdWJTYW1wbGVzOyBjb2wrKykKLSAgeworICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bVFtZlN1YlNhbXBsZXM7IGNvbCsrKSB7CiAgICAgRklYUF9EQkwgKnFtZlNsb3RSZWFsID0gUW1mQnVmZmVyUmVhbFtjb2xdOwogICAgIEZJWFBfREJMICpxbWZTbG90SW1hZyA9IChRbWZCdWZmZXJJbWFnID09IE5VTEwpID8gTlVMTCA6IFFtZkJ1ZmZlckltYWdbY29sXTsKIAotICAgIHNickRlY29kZXJfZHJjQXBwbHlTbG90ICgKLSAgICAgIGhEcmNEYXRhLAotICAgICAgcW1mU2xvdFJlYWwsCi0gICAgICBxbWZTbG90SW1hZywKLSAgICAgIGNvbCwKLSAgICAgIG51bVFtZlN1YlNhbXBsZXMsCi0gICAgICBtYXhTaGlmdAotICAgICk7CisgICAgc2JyRGVjb2Rlcl9kcmNBcHBseVNsb3QoaERyY0RhdGEsIHFtZlNsb3RSZWFsLCBxbWZTbG90SW1hZywgY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVFtZlN1YlNhbXBsZXMsIG1heFNoaWZ0KTsKICAgfQogCiAgICpzY2FsZUZhY3RvciArPSBtYXhTaGlmdDsKIH0KLQpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9zYnJkZWNfZHJjLmggYi9saWJTQlJkZWMvc3JjL3NicmRlY19kcmMuaAppbmRleCA3ZWVkNTNhLi4yZWIwZTIwIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL3NicmRlY19kcmMuaAorKysgYi9saWJTQlJkZWMvc3JjL3NicmRlY19kcmMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3MyArOTAsNjAgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKTogICBDaHJpc3RpYW4gR3JpZWJlbAorCiAgICBEZXNjcmlwdGlvbjogRHluYW1pYyByYW5nZSBjb250cm9sIChEUkMpIGRlY29kZXIgdG9vbCBmb3IgU0JSCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgX1NCUkRFQ19EUkNfSF8KLSNkZWZpbmUgX1NCUkRFQ19EUkNfSF8KKyNpZm5kZWYgU0JSREVDX0RSQ19ICisjZGVmaW5lIFNCUkRFQ19EUkNfSAogCiAjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgogCisjZGVmaW5lIFNCUkRFQ19NQVhfRFJDX0NIQU5ORUxTICg4KQorI2RlZmluZSBTQlJERUNfTUFYX0RSQ19CQU5EUyAoMTYpCiAKLQotI2RlZmluZSBTQlJERUNfTUFYX0RSQ19DSEFOTkVMUyAgKDgpCi0jZGVmaW5lIFNCUkRFQ19NQVhfRFJDX0JBTkRTICAgICAoIDE2ICkKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgRklYUF9EQkwgcHJldkZhY3RfbWFnWyg2NCldOwotICBJTlQgICAgICBwcmV2RmFjdF9leHA7CisgIElOVCBwcmV2RmFjdF9leHA7CiAKICAgRklYUF9EQkwgY3VyckZhY3RfbWFnW1NCUkRFQ19NQVhfRFJDX0JBTkRTXTsKICAgRklYUF9EQkwgbmV4dEZhY3RfbWFnW1NCUkRFQ19NQVhfRFJDX0JBTkRTXTsKLSAgSU5UICAgICAgY3VyckZhY3RfZXhwOwotICBJTlQgICAgICBuZXh0RmFjdF9leHA7CisgIElOVCBjdXJyRmFjdF9leHA7CisgIElOVCBuZXh0RmFjdF9leHA7CiAKLSAgVUlOVCAgICAgbnVtQmFuZHNDdXJyOwotICBVSU5UICAgICBudW1CYW5kc05leHQ7Ci0gIFVTSE9SVCAgIGJhbmRUb3BDdXJyW1NCUkRFQ19NQVhfRFJDX0JBTkRTXTsKLSAgVVNIT1JUICAgYmFuZFRvcE5leHRbU0JSREVDX01BWF9EUkNfQkFORFNdOworICBVSU5UIG51bUJhbmRzQ3VycjsKKyAgVUlOVCBudW1CYW5kc05leHQ7CisgIFVTSE9SVCBiYW5kVG9wQ3VycltTQlJERUNfTUFYX0RSQ19CQU5EU107CisgIFVTSE9SVCBiYW5kVG9wTmV4dFtTQlJERUNfTUFYX0RSQ19CQU5EU107CiAKLSAgU0hPUlQgICAgZHJjSW50ZXJwb2xhdGlvblNjaGVtZUN1cnI7Ci0gIFNIT1JUICAgIGRyY0ludGVycG9sYXRpb25TY2hlbWVOZXh0OworICBTSE9SVCBkcmNJbnRlcnBvbGF0aW9uU2NoZW1lQ3VycjsKKyAgU0hPUlQgZHJjSW50ZXJwb2xhdGlvblNjaGVtZU5leHQ7CiAKLSAgU0hPUlQgICAgZW5hYmxlOworICBTSE9SVCBlbmFibGU7CiAKLSAgVUNIQVIgICAgd2luU2VxdWVuY2VDdXJyOwotICBVQ0hBUiAgICB3aW5TZXF1ZW5jZU5leHQ7CisgIFVDSEFSIHdpblNlcXVlbmNlQ3VycjsKKyAgVUNIQVIgd2luU2VxdWVuY2VOZXh0OwogCiB9IFNCUkRFQ19EUkNfQ0hBTk5FTDsKIAotdHlwZWRlZiBTQlJERUNfRFJDX0NIQU5ORUwgKiBIQU5ETEVfU0JSX0RSQ19DSEFOTkVMOwordHlwZWRlZiBTQlJERUNfRFJDX0NIQU5ORUwgKkhBTkRMRV9TQlJfRFJDX0NIQU5ORUw7CiAKK3ZvaWQgc2JyRGVjb2Rlcl9kcmNJbml0Q2hhbm5lbChIQU5ETEVfU0JSX0RSQ19DSEFOTkVMIGhEcmNEYXRhKTsKIAotdm9pZCBzYnJEZWNvZGVyX2RyY0luaXRDaGFubmVsICgKLSAgICBIQU5ETEVfU0JSX0RSQ19DSEFOTkVMICBoRHJjRGF0YSApOwordm9pZCBzYnJEZWNvZGVyX2RyY1VwZGF0ZUNoYW5uZWwoSEFORExFX1NCUl9EUkNfQ0hBTk5FTCBoRHJjRGF0YSk7CiAKLXZvaWQgc2JyRGVjb2Rlcl9kcmNVcGRhdGVDaGFubmVsICgKLSAgICBIQU5ETEVfU0JSX0RSQ19DSEFOTkVMICBoRHJjRGF0YSApOwordm9pZCBzYnJEZWNvZGVyX2RyY0FwcGx5U2xvdChIQU5ETEVfU0JSX0RSQ19DSEFOTkVMIGhEcmNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcW1mUmVhbFNsb3QsIEZJWFBfREJMICpxbWZJbWFnU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbCwgaW50IG51bVFtZlN1YlNhbXBsZXMsIGludCBtYXhTaGlmdCk7CiAKLXZvaWQgc2JyRGVjb2Rlcl9kcmNBcHBseVNsb3QgKAotICAgIEhBTkRMRV9TQlJfRFJDX0NIQU5ORUwgIGhEcmNEYXRhLAotICAgIEZJWFBfREJMICpxbWZSZWFsU2xvdCwKLSAgICBGSVhQX0RCTCAqcW1mSW1hZ1Nsb3QsCi0gICAgaW50ICBjb2wsCi0gICAgaW50ICBudW1RbWZTdWJTYW1wbGVzLAotICAgIGludCAgbWF4U2hpZnQgKTsKK3ZvaWQgc2JyRGVjb2Rlcl9kcmNBcHBseShIQU5ETEVfU0JSX0RSQ19DSEFOTkVMIGhEcmNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqUW1mQnVmZmVyUmVhbCwgRklYUF9EQkwgKipRbWZCdWZmZXJJbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1RbWZTdWJTYW1wbGVzLCBpbnQgKnNjYWxlRmFjdG9yKTsKIAotdm9pZCBzYnJEZWNvZGVyX2RyY0FwcGx5ICgKLSAgICBIQU5ETEVfU0JSX0RSQ19DSEFOTkVMICBoRHJjRGF0YSwKLSAgICBGSVhQX0RCTCAqKlFtZkJ1ZmZlclJlYWwsCi0gICAgRklYUF9EQkwgKipRbWZCdWZmZXJJbWFnLAotICAgIGludCAgbnVtUW1mU3ViU2FtcGxlcywKLSAgICBpbnQgKnNjYWxlRmFjdG9yICk7Ci0KLQotI2VuZGlmICAvKiBfU0JSREVDX0RSQ19IXyAqLworI2VuZGlmIC8qIFNCUkRFQ19EUkNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9zYnJkZWNfZnJlcV9zY2EuY3BwIGIvbGliU0JSZGVjL3NyYy9zYnJkZWNfZnJlcV9zY2EuY3BwCmluZGV4IDhhZGZiYjEuLjE2NWY5NGIgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvc2JyZGVjX2ZyZXFfc2NhLmNwcAorKysgYi9saWJTQlJkZWMvc3JjL3NicmRlY19mcmVxX3NjYS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTEgKzkwLDE5IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgRnJlcXVlbmN5IHNjYWxlIGNhbGN1bGF0aW9uICAKKyAgXGJyaWVmICBGcmVxdWVuY3kgc2NhbGUgY2FsY3VsYXRpb24KICovCiAKICNpbmNsdWRlICJzYnJkZWNfZnJlcV9zY2EuaCIKQEAgLTkyLDE4ICsxMTEsMTYgQEAKICNpbmNsdWRlICJzYnJfcm9tLmgiCiAjaW5jbHVkZSAiZW52X2V4dHIuaCIKIAotI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiICAgICAgLyogbmVlZCBsb2coKSBmb3IgZGVidWctY29kZSBvbmx5ICovCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIgLyogbmVlZCBsb2coKSBmb3IgZGVidWctY29kZSBvbmx5ICovCiAKLSNkZWZpbmUgTUFYX09DVEFWRSAgICAgICAgIDI5Ci0jZGVmaW5lIE1BWF9TRUNPTkRfUkVHSU9OICA1MAorI2RlZmluZSBNQVhfT0NUQVZFIDI5CisjZGVmaW5lIE1BWF9TRUNPTkRfUkVHSU9OIDUwCiAKLQotc3RhdGljIGludCAgbnVtYmVyT2ZCYW5kcyhGSVhQX1NHTCBicG9fZGl2MTYsIGludCBzdGFydCwgaW50IHN0b3AsIGludCB3YXJwRmxhZyk7Ci1zdGF0aWMgdm9pZCBDYWxjQmFuZHMoVUNIQVIgKiBkaWZmLCBVQ0hBUiBzdGFydCwgVUNIQVIgc3RvcCwgVUNIQVIgbnVtX2JhbmRzKTsKLXN0YXRpYyBTQlJfRVJST1IgbW9kaWZ5QmFuZHMoVUNIQVIgbWF4X2JhbmQsIFVDSEFSICogZGlmZiwgVUNIQVIgbGVuZ3RoKTsKLXN0YXRpYyB2b2lkIGN1bVN1bShVQ0hBUiBzdGFydF92YWx1ZSwgVUNIQVIqIGRpZmYsIFVDSEFSIGxlbmd0aCwgVUNIQVIgKnN0YXJ0X2FkcmVzcyk7Ci0KLQorc3RhdGljIGludCBudW1iZXJPZkJhbmRzKEZJWFBfU0dMIGJwb19kaXYxNiwgaW50IHN0YXJ0LCBpbnQgc3RvcCwgaW50IHdhcnBGbGFnKTsKK3N0YXRpYyB2b2lkIENhbGNCYW5kcyhVQ0hBUiAqZGlmZiwgVUNIQVIgc3RhcnQsIFVDSEFSIHN0b3AsIFVDSEFSIG51bV9iYW5kcyk7CitzdGF0aWMgU0JSX0VSUk9SIG1vZGlmeUJhbmRzKFVDSEFSIG1heF9iYW5kLCBVQ0hBUiAqZGlmZiwgVUNIQVIgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGN1bVN1bShVQ0hBUiBzdGFydF92YWx1ZSwgVUNIQVIgKmRpZmYsIFVDSEFSIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICBVQ0hBUiAqc3RhcnRfYWRyZXNzKTsKIAogLyohCiAgIFxicmllZiAgICAgUmV0cmlldmUgUU1GLWJhbmQgd2hlcmUgdGhlIFNCUiByYW5nZSBzdGFydHMKQEAgLTExMyw0MSArMTMwLDYxIEBACiAKICAgXHJldHVybiAgTnVtYmVyIG9mIHN0YXJ0IGJhbmQKICovCi1zdGF0aWMgVUNIQVIKLWdldFN0YXJ0QmFuZChVSU5UICAgZnMsICAgICAgICAgICAgICAgLyohPCBPdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5ICovCi0gICAgICAgICAgICAgVUNIQVIgIHN0YXJ0RnJlcSwgICAgICAgIC8qITwgSW5kZXggdG8gdGFibGUgb2YgcG9zc2libGUgc3RhcnQgYmFuZHMgKi8KLSAgICAgICAgICAgICBVSU5UICAgaGVhZGVyRGF0YUZsYWdzKSAgLyohPCBJbmZvIHRvIFNCUiBtb2RlICovCitzdGF0aWMgVUNIQVIgZ2V0U3RhcnRCYW5kKAorICAgIFVJTlQgZnMsICAgICAgICAgICAgICAvKiE8IE91dHB1dCBzYW1wbGluZyBmcmVxdWVuY3kgKi8KKyAgICBVQ0hBUiBzdGFydEZyZXEsICAgICAgLyohPCBJbmRleCB0byB0YWJsZSBvZiBwb3NzaWJsZSBzdGFydCBiYW5kcyAqLworICAgIFVJTlQgaGVhZGVyRGF0YUZsYWdzKSAvKiE8IEluZm8gdG8gU0JSIG1vZGUgKi8KIHsKLSAgSU5UICBiYW5kOwotICBVSU5UIGZzTWFwcGVkOworICBJTlQgYmFuZDsKKyAgVUlOVCBmc01hcHBlZCA9IGZzOworICBTQlJfUkFURSByYXRlID0gRFVBTDsKIAotICAgIGZzTWFwcGVkID0gZnM7CisgIGlmIChoZWFkZXJEYXRhRmxhZ3MgJiAoU0JSREVDX1NZTlRBWF9VU0FDIHwgU0JSREVDX1NZTlRBWF9SU1ZENTApKSB7CisgICAgaWYgKGhlYWRlckRhdGFGbGFncyAmIFNCUkRFQ19RVUFEX1JBVEUpIHsKKyAgICAgIHJhdGUgPSBRVUFEOworICAgIH0KKyAgICBmc01hcHBlZCA9IHNicmRlY19tYXBUb1N0ZFNhbXBsZVJhdGUoZnMsIDEpOworICB9CisKKyAgRkRLX0FTU0VSVCgyICogKHJhdGUgKyAxKSA8PSAoNCkpOwogCiAgIHN3aXRjaCAoZnNNYXBwZWQpIHsKKyAgICBjYXNlIDE5MjAwMDoKKyAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8xOTJbc3RhcnRGcmVxXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTc2NDAwOgorICAgICAgYmFuZCA9IEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzE3NltzdGFydEZyZXFdOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjgwMDA6CisgICAgICBiYW5kID0gRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMTI4W3N0YXJ0RnJlcV07CisgICAgICBicmVhazsKICAgICBjYXNlIDk2MDAwOgogICAgIGNhc2UgODgyMDA6Ci0gICAgICBiYW5kID0gRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfODhbc3RhcnRGcmVxXTsKKyAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV84OFtyYXRlXVtzdGFydEZyZXFdOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSA2NDAwMDoKLSAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV82NFtzdGFydEZyZXFdOworICAgICAgYmFuZCA9IEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzY0W3JhdGVdW3N0YXJ0RnJlcV07CiAgICAgICBicmVhazsKICAgICBjYXNlIDQ4MDAwOgotICAgICAgYmFuZCA9IEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzQ4W3N0YXJ0RnJlcV07CisgICAgICBiYW5kID0gRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNDhbcmF0ZV1bc3RhcnRGcmVxXTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgNDQxMDA6Ci0gICAgICBiYW5kID0gRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfNDRbc3RhcnRGcmVxXTsKKyAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV80NFtyYXRlXVtzdGFydEZyZXFdOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0MDAwMDoKKyAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV80MFtyYXRlXVtzdGFydEZyZXFdOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSAzMjAwMDoKLSAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8zMltzdGFydEZyZXFdOworICAgICAgYmFuZCA9IEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzMyW3JhdGVdW3N0YXJ0RnJlcV07CiAgICAgICBicmVhazsKICAgICBjYXNlIDI0MDAwOgotICAgICAgYmFuZCA9IEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzI0W3N0YXJ0RnJlcV07CisgICAgICBiYW5kID0gRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMjRbcmF0ZV1bc3RhcnRGcmVxXTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgMjIwNTA6Ci0gICAgICBiYW5kID0gRkRLX3NickRlY29kZXJfc2JyX3N0YXJ0X2ZyZXFfMjJbc3RhcnRGcmVxXTsKKyAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8yMltyYXRlXVtzdGFydEZyZXFdOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSAxNjAwMDoKLSAgICAgIGJhbmQgPSBGREtfc2JyRGVjb2Rlcl9zYnJfc3RhcnRfZnJlcV8xNltzdGFydEZyZXFdOworICAgICAgYmFuZCA9IEZES19zYnJEZWNvZGVyX3Nicl9zdGFydF9mcmVxXzE2W3JhdGVdW3N0YXJ0RnJlcV07CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgYmFuZCA9IDI1NTsKQEAgLTE1Niw3ICsxOTMsNiBAQAogICByZXR1cm4gYmFuZDsKIH0KIAotCiAvKiEKICAgXGJyaWVmICAgICBSZXRyaWV2ZSBRTUYtYmFuZCB3aGVyZSB0aGUgU0JSIHJhbmdlIHN0YXJ0cwogCkBAIC0xNjUsMjkgKzIwMSwzMiBAQAogCiAgIFxyZXR1cm4gIE51bWJlciBvZiBzdGFydCBiYW5kCiAqLwotc3RhdGljIFVDSEFSCi1nZXRTdG9wQmFuZChVSU5UICAgZnMsICAgICAgICAgICAgICAgLyohPCBPdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5ICovCi0gICAgICAgICAgICBVQ0hBUiAgc3RvcEZyZXEsICAgICAgICAgLyohPCBJbmRleCB0byB0YWJsZSBvZiBwb3NzaWJsZSBzdGFydCBiYW5kcyAqLwotICAgICAgICAgICAgVUlOVCAgIGhlYWRlckRhdGFGbGFncywgIC8qITwgSW5mbyB0byBTQlIgbW9kZSAqLwotICAgICAgICAgICAgVUNIQVIgIGswKSAgICAgICAgICAgICAgIC8qITwgU3RhcnQgZnJlcSBpbmRleCAqLworc3RhdGljIFVDSEFSIGdldFN0b3BCYW5kKAorICAgIFVJTlQgZnMsICAgICAgICAgICAgICAvKiE8IE91dHB1dCBzYW1wbGluZyBmcmVxdWVuY3kgKi8KKyAgICBVQ0hBUiBzdG9wRnJlcSwgICAgICAgLyohPCBJbmRleCB0byB0YWJsZSBvZiBwb3NzaWJsZSBzdGFydCBiYW5kcyAqLworICAgIFVJTlQgaGVhZGVyRGF0YUZsYWdzLCAvKiE8IEluZm8gdG8gU0JSIG1vZGUgKi8KKyAgICBVQ0hBUiBrMCkgICAgICAgICAgICAgLyohPCBTdGFydCBmcmVxIGluZGV4ICovCiB7CiAgIFVDSEFSIGsyOwogCiAgIGlmIChzdG9wRnJlcSA8IDE0KSB7Ci0gICAgSU5UICAgIHN0b3BNaW47Ci0gICAgVUNIQVIgIGRpZmZfdG90W01BWF9PQ1RBVkUgKyBNQVhfU0VDT05EX1JFR0lPTl07CisgICAgSU5UIHN0b3BNaW47CisgICAgSU5UIG51bSA9IDIgKiAoNjQpOworICAgIFVDSEFSIGRpZmZfdG90W01BWF9PQ1RBVkUgKyBNQVhfU0VDT05EX1JFR0lPTl07CiAgICAgVUNIQVIgKmRpZmYwID0gZGlmZl90b3Q7Ci0gICAgVUNIQVIgKmRpZmYxID0gZGlmZl90b3QrTUFYX09DVEFWRTsKKyAgICBVQ0hBUiAqZGlmZjEgPSBkaWZmX3RvdCArIE1BWF9PQ1RBVkU7CisKKyAgICBpZiAoaGVhZGVyRGF0YUZsYWdzICYgU0JSREVDX1FVQURfUkFURSkgeworICAgICAgbnVtID4+PSAxOworICAgIH0KIAogICAgIGlmIChmcyA8IDMyMDAwKSB7Ci0gICAgICBzdG9wTWluID0gKCgoMio2MDAwKjIqKDY0KSkgLyBmcykgKyAxKSA+PiAxOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICAgIHN0b3BNaW4gPSAoKCgyICogNjAwMCAqIG51bSkgLyBmcykgKyAxKSA+PiAxOworICAgIH0gZWxzZSB7CiAgICAgICBpZiAoZnMgPCA2NDAwMCkgewotICAgICAgICBzdG9wTWluID0gKCgoMio4MDAwKjIqKDY0KSkgLyBmcykgKyAxKSA+PiAxOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHN0b3BNaW4gPSAoKCgyKjEwMDAwKjIqKDY0KSkgLyBmcykgKyAxKSA+PiAxOworICAgICAgICBzdG9wTWluID0gKCgoMiAqIDgwMDAgKiBudW0pIC8gZnMpICsgMSkgPj4gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0b3BNaW4gPSAoKCgyICogMTAwMDAgKiBudW0pIC8gZnMpICsgMSkgPj4gMTsKICAgICAgIH0KICAgICB9CiAKQEAgLTE5Niw0NCArMjM1LDQ5IEBACiAgICAgICBiYXNlZCBvbiBhIGxvZ2FyaXRobWljIHNjYWxlLgogICAgICAgVGhlIHZlY3RvcnMgZGlmZjAgYW5kIGRpZmYxIGFyZSB1c2VkIHRlbXBvcmFyaWx5IGhlcmUuCiAgICAgKi8KLSAgICBDYWxjQmFuZHMoIGRpZmYwLCBzdG9wTWluLCA2NCwgMTMpOwotICAgIHNoZWxsc29ydCggZGlmZjAsIDEzKTsKKyAgICBDYWxjQmFuZHMoZGlmZjAsIHN0b3BNaW4sIDY0LCAxMyk7CisgICAgc2hlbGxzb3J0KGRpZmYwLCAxMyk7CiAgICAgY3VtU3VtKHN0b3BNaW4sIGRpZmYwLCAxMywgZGlmZjEpOwogICAgIGsyID0gZGlmZjFbc3RvcEZyZXFdOwotICB9Ci0gIGVsc2UgaWYgKHN0b3BGcmVxPT0xNCkKLSAgICBrMiA9IDIqazA7CisgIH0gZWxzZSBpZiAoc3RvcEZyZXEgPT0gMTQpCisgICAgazIgPSAyICogazA7CiAgIGVsc2UKLSAgICBrMiA9IDMqazA7CisgICAgazIgPSAzICogazA7CiAKICAgLyogTGltaXQgdG8gTnlxdWlzdCAqLwotICBpZiAoazIgPiAoNjQpKQotICAgIGsyID0gKDY0KTsKLQorICBpZiAoazIgPiAoNjQpKSBrMiA9ICg2NCk7CiAKICAgLyogUmFuZ2UgY2hlY2tzICovCiAgIC8qIDEgPD0gZGlmZmVyZW5jZSA8PSA0ODsgMSA8PSBmcyA8PSA5NjAwMCAqLwotICBpZiAoICgoazIgLSBrMCkgPiBNQVhfRlJFUV9DT0VGRlMpIHx8IChrMiA8PSBrMCkgKSB7Ci0gICAgcmV0dXJuIDI1NTsKKyAgeworICAgIFVDSEFSIG1heF9mcmVxX2NvZWZmcyA9IChoZWFkZXJEYXRhRmxhZ3MgJiBTQlJERUNfUVVBRF9SQVRFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE1BWF9GUkVRX0NPRUZGU19RVUFEX1JBVEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBNQVhfRlJFUV9DT0VGRlM7CisgICAgaWYgKCgoazIgLSBrMCkgPiBtYXhfZnJlcV9jb2VmZnMpIHx8IChrMiA8PSBrMCkpIHsKKyAgICAgIHJldHVybiAyNTU7CisgICAgfQogICB9CiAKLSAgaWYgKGhlYWRlckRhdGFGbGFncyAmIChTQlJERUNfU1lOVEFYX1VTQUN8U0JSREVDX1NZTlRBWF9SU1ZENTApKSB7CisgIGlmIChoZWFkZXJEYXRhRmxhZ3MgJiBTQlJERUNfUVVBRF9SQVRFKSB7CisgICAgcmV0dXJuIGsyOyAvKiBza2lwIG90aGVyIGNoZWNrczogKGsyIC0gazApIG11c3QgYmUgPD0KKyAgICAgICAgICAgICAgICAgIE1BWF9GUkVRX0NPRUZGU19RVUFEX1JBVEUgZm9yIGFsbCBmcyAqLworICB9CisgIGlmIChoZWFkZXJEYXRhRmxhZ3MgJiAoU0JSREVDX1NZTlRBWF9VU0FDIHwgU0JSREVDX1NZTlRBWF9SU1ZENTApKSB7CiAgICAgLyogMSA8PSBkaWZmZXJlbmNlIDw9IDM1OyA0MjAwMCA8PSBmcyA8PSA5NjAwMCAqLwotICAgIGlmICggKGZzID49IDQyMDAwKSAmJiAoIChrMiAtIGswKSA+IE1BWF9GUkVRX0NPRUZGU19GUzQ0MTAwICkgKSB7CisgICAgaWYgKChmcyA+PSA0MjAwMCkgJiYgKChrMiAtIGswKSA+IE1BWF9GUkVRX0NPRUZGU19GUzQ0MTAwKSkgewogICAgICAgcmV0dXJuIDI1NTsKICAgICB9CiAgICAgLyogMSA8PSBkaWZmZXJlbmNlIDw9IDMyOyA0NjAwOSA8PSBmcyA8PSA5NjAwMCAqLwotICAgIGlmICggKGZzID49IDQ2MDA5KSAmJiAoIChrMiAtIGswKSA+IE1BWF9GUkVRX0NPRUZGU19GUzQ4MDAwICkgKSB7CisgICAgaWYgKChmcyA+PSA0NjAwOSkgJiYgKChrMiAtIGswKSA+IE1BWF9GUkVRX0NPRUZGU19GUzQ4MDAwKSkgewogICAgICAgcmV0dXJuIDI1NTsKICAgICB9Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgLyogMSA8PSBkaWZmZXJlbmNlIDw9IDM1OyBmcyA9PSA0NDEwMCAqLwotICAgIGlmICggKGZzID09IDQ0MTAwKSAmJiAoIChrMiAtIGswKSA+IE1BWF9GUkVRX0NPRUZGU19GUzQ0MTAwICkgKSB7CisgICAgaWYgKChmcyA9PSA0NDEwMCkgJiYgKChrMiAtIGswKSA+IE1BWF9GUkVRX0NPRUZGU19GUzQ0MTAwKSkgewogICAgICAgcmV0dXJuIDI1NTsKICAgICB9CiAgICAgLyogMSA8PSBkaWZmZXJlbmNlIDw9IDMyOyA0ODAwMCA8PSBmcyA8PSA5NjAwMCAqLwotICAgIGlmICggKGZzID49IDQ4MDAwKSAmJiAoIChrMiAtIGswKSA+IE1BWF9GUkVRX0NPRUZGU19GUzQ4MDAwICkgKSB7CisgICAgaWYgKChmcyA+PSA0ODAwMCkgJiYgKChrMiAtIGswKSA+IE1BWF9GUkVRX0NPRUZGU19GUzQ4MDAwKSkgewogICAgICAgcmV0dXJuIDI1NTsKICAgICB9CiAgIH0KQEAgLTI0MSw3ICsyODUsNiBAQAogICByZXR1cm4gazI7CiB9CiAKLQogLyohCiAgIFxicmllZiAgICAgR2VuZXJhdGVzIG1hc3RlciBmcmVxdWVuY3kgdGFibGVzCiAKQEAgLTI1MiwyOSArMjk1LDMzIEBACiAgIFxyZXR1cm4gIGVycm9yQ29kZSwgMCBpZiBzdWNjZXNzZnVsCiAqLwogU0JSX0VSUk9SCi1zYnJkZWNVcGRhdGVGcmVxU2NhbGUoVUNIQVIgKiB2X2tfbWFzdGVyLCAgICAvKiE8IE1hc3RlciB0YWJsZSB0byBiZSBjcmVhdGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKm51bU1hc3RlciwgICAgICAvKiE8IE51bWJlciBvZiBlbnRyaWVzIGluIG1hc3RlciB0YWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICBmcywgICAgICAgICAgICAgLyohPCBTQlIgd29ya2luZyBzYW1wbGluZyByYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgLyohPCBDb250cm9sIGRhdGEgZnJvbSBiaXRzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgICBVSU5UIGZsYWdzKQotewotICBGSVhQX1NHTCBicG9fZGl2MTY7ICAgICAgICAvKiBiYW5kc19wZXJfb2N0YXZlIGRpdmlkZWQgYnkgMTYgKi8KLSAgSU5UICAgICAgZGs9MDsKK3NicmRlY1VwZGF0ZUZyZXFTY2FsZSgKKyAgICBVQ0hBUiAqdl9rX21hc3RlciwgLyohPCBNYXN0ZXIgdGFibGUgdG8gYmUgY3JlYXRlZCAqLworICAgIFVDSEFSICpudW1NYXN0ZXIsICAvKiE8IE51bWJlciBvZiBlbnRyaWVzIGluIG1hc3RlciB0YWJsZSAqLworICAgIFVJTlQgZnMsICAgICAgICAgICAvKiE8IFNCUiB3b3JraW5nIHNhbXBsaW5nIHJhdGUgKi8KKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAvKiE8IENvbnRyb2wgZGF0YSBmcm9tIGJpdHN0cmVhbSAqLworICAgIFVJTlQgZmxhZ3MpIHsKKyAgRklYUF9TR0wgYnBvX2RpdjE2OyAvKiBiYW5kc19wZXJfb2N0YXZlIGRpdmlkZWQgYnkgMTYgKi8KKyAgSU5UIGRrID0gMDsKIAogICAvKiBJbnRlcm5hbCB2YXJpYWJsZXMgKi8KLSAgVUNIQVIgIGswLCBrMiwgaTsKLSAgVUNIQVIgIG51bV9iYW5kczAgPSAwOwotICBVQ0hBUiAgbnVtX2JhbmRzMSA9IDA7Ci0gIFVDSEFSICBkaWZmX3RvdFtNQVhfT0NUQVZFICsgTUFYX1NFQ09ORF9SRUdJT05dOworICBVQ0hBUiBrMCwgazIsIGk7CisgIFVDSEFSIG51bV9iYW5kczAgPSAwOworICBVQ0hBUiBudW1fYmFuZHMxID0gMDsKKyAgVUNIQVIgZGlmZl90b3RbTUFYX09DVEFWRSArIE1BWF9TRUNPTkRfUkVHSU9OXTsKICAgVUNIQVIgKmRpZmYwID0gZGlmZl90b3Q7Ci0gIFVDSEFSICpkaWZmMSA9IGRpZmZfdG90K01BWF9PQ1RBVkU7Ci0gIElOVCAgICBrMl9hY2hpdmVkOwotICBJTlQgICAgazJfZGlmZjsKLSAgSU5UICAgIGluY3I9MDsKKyAgVUNIQVIgKmRpZmYxID0gZGlmZl90b3QgKyBNQVhfT0NUQVZFOworICBJTlQgazJfYWNoaXZlZDsKKyAgSU5UIGsyX2RpZmY7CisgIElOVCBpbmNyID0gMDsKIAogICAvKgogICAgIERldGVybWluZSBzdGFydCBiYW5kCiAgICovCisgIGlmIChmbGFncyAmIFNCUkRFQ19RVUFEX1JBVEUpIHsKKyAgICBmcyA+Pj0gMTsKKyAgfQorCiAgIGswID0gZ2V0U3RhcnRCYW5kKGZzLCBoSGVhZGVyRGF0YS0+YnNfZGF0YS5zdGFydEZyZXEsIGZsYWdzKTsKICAgaWYgKGswID09IDI1NSkgewogICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwpAQCAtMjg4LDEyNyArMzM1LDEzNCBAQAogICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogICB9CiAKLSAgaWYoaEhlYWRlckRhdGEtPmJzX2RhdGEuZnJlcVNjYWxlPjApIHsgLyogQmFyayAqLworICBpZiAoaEhlYWRlckRhdGEtPmJzX2RhdGEuZnJlcVNjYWxlID4gMCkgeyAvKiBCYXJrICovCiAgICAgSU5UIGsxOwogCi0gICAgaWYoaEhlYWRlckRhdGEtPmJzX2RhdGEuZnJlcVNjYWxlPT0xKSB7Ci0gICAgICBicG9fZGl2MTYgPSBGTDJGWENPTlNUX1NHTCgxMi4wZi8xNi4wZik7Ci0gICAgfQotICAgIGVsc2UgaWYoaEhlYWRlckRhdGEtPmJzX2RhdGEuZnJlcVNjYWxlPT0yKSB7Ci0gICAgICBicG9fZGl2MTYgPSBGTDJGWENPTlNUX1NHTCgxMC4wZi8xNi4wZik7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgYnBvX2RpdjE2ID0gIEZMMkZYQ09OU1RfU0dMKDguMGYvMTYuMGYpOworICAgIGlmIChoSGVhZGVyRGF0YS0+YnNfZGF0YS5mcmVxU2NhbGUgPT0gMSkgeworICAgICAgYnBvX2RpdjE2ID0gRkwyRlhDT05TVF9TR0woMTIuMGYgLyAxNi4wZik7CisgICAgfSBlbHNlIGlmIChoSGVhZGVyRGF0YS0+YnNfZGF0YS5mcmVxU2NhbGUgPT0gMikgeworICAgICAgYnBvX2RpdjE2ID0gRkwyRlhDT05TVF9TR0woMTAuMGYgLyAxNi4wZik7CisgICAgfSBlbHNlIHsKKyAgICAgIGJwb19kaXYxNiA9IEZMMkZYQ09OU1RfU0dMKDguMGYgLyAxNi4wZik7CiAgICAgfQogCisgICAgLyogUmVmOiBJU08vSUVDIDIzMDAzLTMsIEZpZ3VyZSAxMiAtIEZsb3djaGFydCBjYWxjdWxhdGlvbiBvZiBmTWFzdGVyIGZvcgorICAgICAqIDQ6MSBzeXN0ZW0gd2hlbiBic19mcmVxX3NjYWxlID4gMCAqLworICAgIGlmIChmbGFncyAmIFNCUkRFQ19RVUFEX1JBVEUpIHsKKyAgICAgIGlmICgoU0hPUlQpazAgPCAoU0hPUlQpKGJwb19kaXYxNiA+PiAoKEZSQUNUX0JJVFMgLSAxKSAtIDQpKSkgeworICAgICAgICBicG9fZGl2MTYgPSAoRklYUF9TR0wpKGswICYgKFVDSEFSKTB4ZmUpCisgICAgICAgICAgICAgICAgICAgIDw8ICgoRlJBQ1RfQklUUyAtIDEpIC0gNCk7IC8qIGJwb19kaXYxNiA9IGZsb29yKGswLzIpKjIgKi8KKyAgICAgIH0KKyAgICB9CiAKLSAgICBpZiggMTAwMCAqIGsyID4gMjI0NSAqIGswICkgeyAvKiBUd28gb3IgbW9yZSByZWdpb25zICovCi0gICAgICBrMSA9IDIqazA7CisgICAgaWYgKDEwMDAgKiBrMiA+IDIyNDUgKiBrMCkgeyAvKiBUd28gb3IgbW9yZSByZWdpb25zICovCisgICAgICBrMSA9IDIgKiBrMDsKIAogICAgICAgbnVtX2JhbmRzMCA9IG51bWJlck9mQmFuZHMoYnBvX2RpdjE2LCBrMCwgazEsIDApOwotICAgICAgbnVtX2JhbmRzMSA9IG51bWJlck9mQmFuZHMoYnBvX2RpdjE2LCBrMSwgazIsIGhIZWFkZXJEYXRhLT5ic19kYXRhLmFsdGVyU2NhbGUgKTsKLSAgICAgIGlmICggbnVtX2JhbmRzMCA8IDEpIHsKKyAgICAgIG51bV9iYW5kczEgPQorICAgICAgICAgIG51bWJlck9mQmFuZHMoYnBvX2RpdjE2LCBrMSwgazIsIGhIZWFkZXJEYXRhLT5ic19kYXRhLmFsdGVyU2NhbGUpOworICAgICAgaWYgKG51bV9iYW5kczAgPCAxKSB7CiAgICAgICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogICAgICAgfQotICAgICAgaWYgKCBudW1fYmFuZHMxIDwgMSApIHsKKyAgICAgIGlmIChudW1fYmFuZHMxIDwgMSkgewogICAgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKICAgICAgIH0KIAogICAgICAgQ2FsY0JhbmRzKGRpZmYwLCBrMCwgazEsIG51bV9iYW5kczApOwotICAgICAgc2hlbGxzb3J0KCBkaWZmMCwgbnVtX2JhbmRzMCk7CisgICAgICBzaGVsbHNvcnQoZGlmZjAsIG51bV9iYW5kczApOwogICAgICAgaWYgKGRpZmYwWzBdID09IDApIHsKLSNpZmRlZiBERUJVR19UT09MUwotI2VuZGlmCiAgICAgICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogICAgICAgfQogCiAgICAgICBjdW1TdW0oazAsIGRpZmYwLCBudW1fYmFuZHMwLCB2X2tfbWFzdGVyKTsKIAogICAgICAgQ2FsY0JhbmRzKGRpZmYxLCBrMSwgazIsIG51bV9iYW5kczEpOwotICAgICAgc2hlbGxzb3J0KCBkaWZmMSwgbnVtX2JhbmRzMSk7Ci0gICAgICBpZihkaWZmMFtudW1fYmFuZHMwLTFdID4gZGlmZjFbMF0pIHsKKyAgICAgIHNoZWxsc29ydChkaWZmMSwgbnVtX2JhbmRzMSk7CisgICAgICBpZiAoZGlmZjBbbnVtX2JhbmRzMCAtIDFdID4gZGlmZjFbMF0pIHsKICAgICAgICAgU0JSX0VSUk9SIGVycjsKIAotICAgICAgICBlcnIgPSBtb2RpZnlCYW5kcyhkaWZmMFtudW1fYmFuZHMwLTFdLGRpZmYxLCBudW1fYmFuZHMxKTsKLSAgICAgICAgaWYgKGVycikKLSAgICAgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgICAgICAgZXJyID0gbW9kaWZ5QmFuZHMoZGlmZjBbbnVtX2JhbmRzMCAtIDFdLCBkaWZmMSwgbnVtX2JhbmRzMSk7CisgICAgICAgIGlmIChlcnIpIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogICAgICAgfQogCiAgICAgICAvKiBBZGQgMm5kIHJlZ2lvbiAqLwogICAgICAgY3VtU3VtKGsxLCBkaWZmMSwgbnVtX2JhbmRzMSwgJnZfa19tYXN0ZXJbbnVtX2JhbmRzMF0pOwotICAgICAgKm51bU1hc3RlciA9IG51bV9iYW5kczAgKyBudW1fYmFuZHMxOyAgICAgLyogT3V0cHV0IG5yIG9mIGJhbmRzICovCisgICAgICAqbnVtTWFzdGVyID0gbnVtX2JhbmRzMCArIG51bV9iYW5kczE7IC8qIE91dHB1dCBuciBvZiBiYW5kcyAqLwogCi0gICAgfQotICAgIGVsc2UgeyAvKiBPbmx5IG9uZSByZWdpb24gKi8KLSAgICAgIGsxPWsyOworICAgIH0gZWxzZSB7IC8qIE9ubHkgb25lIHJlZ2lvbiAqLworICAgICAgazEgPSBrMjsKIAogICAgICAgbnVtX2JhbmRzMCA9IG51bWJlck9mQmFuZHMoYnBvX2RpdjE2LCBrMCwgazEsIDApOwotICAgICAgaWYgKCBudW1fYmFuZHMwIDwgMSkgeworICAgICAgaWYgKG51bV9iYW5kczAgPCAxKSB7CiAgICAgICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogICAgICAgfQogICAgICAgQ2FsY0JhbmRzKGRpZmYwLCBrMCwgazEsIG51bV9iYW5kczApOwogICAgICAgc2hlbGxzb3J0KGRpZmYwLCBudW1fYmFuZHMwKTsKICAgICAgIGlmIChkaWZmMFswXSA9PSAwKSB7Ci0jaWZkZWYgREVCVUdfVE9PTFMKLSNlbmRpZgogICAgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKICAgICAgIH0KIAogICAgICAgY3VtU3VtKGswLCBkaWZmMCwgbnVtX2JhbmRzMCwgdl9rX21hc3Rlcik7Ci0gICAgICAqbnVtTWFzdGVyID0gbnVtX2JhbmRzMDsgICAgICAgIC8qIE91dHB1dCBuciBvZiBiYW5kcyAqLwotCisgICAgICAqbnVtTWFzdGVyID0gbnVtX2JhbmRzMDsgLyogT3V0cHV0IG5yIG9mIGJhbmRzICovCiAgICAgfQotICB9Ci0gIGVsc2UgeyAvKiBMaW5lYXIgbW9kZSAqLwotICAgICBpZiAoaEhlYWRlckRhdGEtPmJzX2RhdGEuYWx0ZXJTY2FsZT09MCkgewotICAgICAgICBkayA9IDE7Ci0gICAgICAgIC8qIEZMT09SIHRvIGdldCB0byBmZXcgbnVtYmVyIG9mIGJhbmRzIChuZXh0IGxvd2VyIGV2ZW4gbnVtYmVyKSAqLwotICAgICAgICBudW1fYmFuZHMwID0gKGsyIC0gazApICYgMjU0OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZGsgPSAyOwotICAgICAgICBudW1fYmFuZHMwID0gKCAoKGsyIC0gazApID4+IDEpICsgMSApICYgMjU0OyAvKiBST1VORCB0byB0aGUgY2xvc2VzdCBmaXQgKi8KLSAgICAgIH0KKyAgfSBlbHNlIHsgLyogTGluZWFyIG1vZGUgKi8KKyAgICBpZiAoaEhlYWRlckRhdGEtPmJzX2RhdGEuYWx0ZXJTY2FsZSA9PSAwKSB7CisgICAgICBkayA9IDE7CisgICAgICAvKiBGTE9PUiB0byBnZXQgdG8gZmV3IG51bWJlciBvZiBiYW5kcyAobmV4dCBsb3dlciBldmVuIG51bWJlcikgKi8KKyAgICAgIG51bV9iYW5kczAgPSAoazIgLSBrMCkgJiAyNTQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGRrID0gMjsKKyAgICAgIG51bV9iYW5kczAgPSAoKChrMiAtIGswKSA+PiAxKSArIDEpICYgMjU0OyAvKiBST1VORCB0byB0aGUgY2xvc2VzdCBmaXQgKi8KKyAgICB9CiAKLSAgICAgIGlmIChudW1fYmFuZHMwIDwgMSkgewotICAgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKLSAgICAgICAgLyogV2UgbXVzdCByZXR1cm4gYWxyZWFkeSBoZXJlIGJlY2F1c2UgJ2knIGNhbiBiZWNvbWUgbmVnYXRpdmUgYmVsb3cuICovCi0gICAgICB9CisgICAgaWYgKG51bV9iYW5kczAgPCAxKSB7CisgICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKKyAgICAgIC8qIFdlIG11c3QgcmV0dXJuIGFscmVhZHkgaGVyZSBiZWNhdXNlICdpJyBjYW4gYmVjb21lIG5lZ2F0aXZlIGJlbG93LiAqLworICAgIH0KIAotICAgICAgazJfYWNoaXZlZCA9IGswICsgbnVtX2JhbmRzMCpkazsKLSAgICAgIGsyX2RpZmYgPSBrMiAtIGsyX2FjaGl2ZWQ7CisgICAgazJfYWNoaXZlZCA9IGswICsgbnVtX2JhbmRzMCAqIGRrOworICAgIGsyX2RpZmYgPSBrMiAtIGsyX2FjaGl2ZWQ7CiAKLSAgICAgIGZvcihpPTA7aTxudW1fYmFuZHMwO2krKykKLSAgICAgICAgZGlmZl90b3RbaV0gPSBkazsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2JhbmRzMDsgaSsrKSBkaWZmX3RvdFtpXSA9IGRrOwogCi0gICAgICAvKiBJZiBsaW5lYXIgc2NhbGUgd2Fzbid0IGFjaGlldmVkICovCi0gICAgICAvKiBhbmQgd2UgZ290IHRvbyB3aWRlIFNCUiBhcmVhICovCi0gICAgICBpZiAoazJfZGlmZiA8IDApIHsKLSAgICAgICAgICBpbmNyID0gMTsKLSAgICAgICAgICBpID0gMDsKLSAgICAgIH0KKyAgICAvKiBJZiBsaW5lYXIgc2NhbGUgd2Fzbid0IGFjaGlldmVkICovCisgICAgLyogYW5kIHdlIGdvdCB0b28gd2lkZSBTQlIgYXJlYSAqLworICAgIGlmIChrMl9kaWZmIDwgMCkgeworICAgICAgaW5jciA9IDE7CisgICAgICBpID0gMDsKKyAgICB9CiAKLSAgICAgIC8qIElmIGxpbmVhciBzY2FsZSB3YXNuJ3QgYWNoaWV2ZWQgKi8KLSAgICAgIC8qIGFuZCB3ZSBnb3QgdG9vIHNtYWxsIFNCUiBhcmVhICovCi0gICAgICBpZiAoazJfZGlmZiA+IDApIHsKLSAgICAgICAgICBpbmNyID0gLTE7Ci0gICAgICAgICAgaSA9IG51bV9iYW5kczAtMTsKLSAgICAgIH0KKyAgICAvKiBJZiBsaW5lYXIgc2NhbGUgd2Fzbid0IGFjaGlldmVkICovCisgICAgLyogYW5kIHdlIGdvdCB0b28gc21hbGwgU0JSIGFyZWEgKi8KKyAgICBpZiAoazJfZGlmZiA+IDApIHsKKyAgICAgIGluY3IgPSAtMTsKKyAgICAgIGkgPSBudW1fYmFuZHMwIC0gMTsKKyAgICB9CiAKLSAgICAgIC8qIEFkanVzdCBkaWZmIHZlY3RvciB0byBnZXQgc2VwYy4gU0JSIHJhbmdlICovCi0gICAgICB3aGlsZSAoazJfZGlmZiAhPSAwKSB7Ci0gICAgICAgIGRpZmZfdG90W2ldID0gZGlmZl90b3RbaV0gLSBpbmNyOwotICAgICAgICBpID0gaSArIGluY3I7Ci0gICAgICAgIGsyX2RpZmYgPSBrMl9kaWZmICsgaW5jcjsKLSAgICAgIH0KKyAgICAvKiBBZGp1c3QgZGlmZiB2ZWN0b3IgdG8gZ2V0IHNlcGMuIFNCUiByYW5nZSAqLworICAgIHdoaWxlIChrMl9kaWZmICE9IDApIHsKKyAgICAgIGRpZmZfdG90W2ldID0gZGlmZl90b3RbaV0gLSBpbmNyOworICAgICAgaSA9IGkgKyBpbmNyOworICAgICAgazJfZGlmZiA9IGsyX2RpZmYgKyBpbmNyOworICAgIH0KIAotICAgICAgY3VtU3VtKGswLCBkaWZmX3RvdCwgbnVtX2JhbmRzMCwgdl9rX21hc3Rlcik7LyogY3Vtc3VtICovCi0gICAgKm51bU1hc3RlciA9IG51bV9iYW5kczA7ICAvKiBPdXRwdXQgbnIgb2YgYmFuZHMgKi8KKyAgICBjdW1TdW0oazAsIGRpZmZfdG90LCBudW1fYmFuZHMwLCB2X2tfbWFzdGVyKTsgLyogY3Vtc3VtICovCisgICAgKm51bU1hc3RlciA9IG51bV9iYW5kczA7ICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBuciBvZiBiYW5kcyAqLwogICB9CiAKICAgaWYgKCpudW1NYXN0ZXIgPCAxKSB7CiAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CiAgIH0KIAorICAvKiBSZWY6IElTTy9JRUMgMjMwMDMtMyBDb3IuMywgIkluIDcuNS41LjIsIGFkZCB0byB0aGUgcmVxdWlyZW1lbnRzOiIqLworICBpZiAoZmxhZ3MgJiBTQlJERUNfUVVBRF9SQVRFKSB7CisgICAgaW50IGs7CisgICAgZm9yIChrID0gMTsgayA8ICpudW1NYXN0ZXI7IGsrKykgeworICAgICAgaWYgKCEodl9rX21hc3RlcltrXSAtIHZfa19tYXN0ZXJbayAtIDFdIDw9IGswIC0gMikpIHsKKyAgICAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CisgICAgICB9CisgICAgfQorICB9CiAKICAgLyoKICAgICBQcmludCBvdXQgdGhlIGNhbGN1bGF0ZWQgdGFibGUKQEAgLTQxNyw3ICs0NzEsNiBAQAogICByZXR1cm4gU0JSREVDX09LOwogfQogCi0KIC8qIQogICBcYnJpZWYgICAgIENhbGN1bGF0ZSBmcmVxdWVuY3kgcmF0aW8gb2Ygb25lIFNCUiBiYW5kCiAKQEAgLTQyNyw1NiArNDgwLDUyIEBACiAKICBccmV0dXJuICAgIG51bV9iYW5kLXRoIHJvb3Qgb2Yga19zdGFydC9rX3N0b3AKICovCi1zdGF0aWMgRklYUF9TR0wgY2FsY0ZhY3RvclBlckJhbmQoaW50IGtfc3RhcnQsIGludCBrX3N0b3AsIGludCBudW1fYmFuZHMpCi17Ci0vKiBTY2FsZWQgYmFuZGZhY3RvciBhbmQgc3RlcCAxIGJpdCByaWdodCB0byBhdm9pZCBvdmVyZmxvdwotICogdXNlIGRvdWJsZSBkYXRhIHR5cGUgKi8KK3N0YXRpYyBGSVhQX1NHTCBjYWxjRmFjdG9yUGVyQmFuZChpbnQga19zdGFydCwgaW50IGtfc3RvcCwgaW50IG51bV9iYW5kcykgeworICAvKiBTY2FsZWQgYmFuZGZhY3RvciBhbmQgc3RlcCAxIGJpdCByaWdodCB0byBhdm9pZCBvdmVyZmxvdworICAgKiB1c2UgZG91YmxlIGRhdGEgdHlwZSAqLwogICBGSVhQX0RCTCBiYW5kZmFjdG9yID0gRkwyRlhDT05TVF9EQkwoMC4yNWYpOyAvKiBTdGFydCB2YWx1ZSAqLwotICBGSVhQX0RCTCBzdGVwID0gRkwyRlhDT05TVF9EQkwoMC4xMjVmKTsgICAgICAvKiBJbml0aWFsIGluY3JlbWVudCBmb3IgZmFjdG9yICovCisgIEZJWFBfREJMIHN0ZXAgPSBGTDJGWENPTlNUX0RCTCgwLjEyNWYpOyAvKiBJbml0aWFsIGluY3JlbWVudCBmb3IgZmFjdG9yICovCiAKLSAgaW50ICAgIGRpcmVjdGlvbiA9IDE7CisgIGludCBkaXJlY3Rpb24gPSAxOwogCi0vKiBCZWNhdXNlIHNhdHVyYXRpb24gY2FuJ3QgYmUgZG9uZSBpbiBJTlQgSUlTLAotICogY2hhbmdlZCBzdGFydCBhbmQgc3RvcCBkYXRhIHR5cGUgZnJvbSBGSVhQX1NHTCB0byBGSVhQX0RCTCAqLwotICBGSVhQX0RCTCBzdGFydCA9IGtfc3RhcnQgPDwgKERGUkFDVF9CSVRTLTgpOwotICBGSVhQX0RCTCBzdG9wID0ga19zdG9wIDw8IChERlJBQ1RfQklUUy04KTsKKyAgLyogQmVjYXVzZSBzYXR1cmF0aW9uIGNhbid0IGJlIGRvbmUgaW4gSU5UIElJUywKKyAgICogY2hhbmdlZCBzdGFydCBhbmQgc3RvcCBkYXRhIHR5cGUgZnJvbSBGSVhQX1NHTCB0byBGSVhQX0RCTCAqLworICBGSVhQX0RCTCBzdGFydCA9IGtfc3RhcnQgPDwgKERGUkFDVF9CSVRTIC0gOCk7CisgIEZJWFBfREJMIHN0b3AgPSBrX3N0b3AgPDwgKERGUkFDVF9CSVRTIC0gOCk7CiAKICAgRklYUF9EQkwgdGVtcDsKIAotICBpbnQgICBqLCBpPTA7CisgIGludCBqLCBpID0gMDsKIAotICB3aGlsZSAoIHN0ZXAgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICB3aGlsZSAoc3RlcCA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CiAgICAgaSsrOwogICAgIHRlbXAgPSBzdG9wOwogCiAgICAgLyogQ2FsY3VsYXRlIHRlbXBebnVtX2JhbmRzOiAqLwotICAgIGZvciAoaj0wOyBqPG51bV9iYW5kczsgaisrKQotICAgICAgLy90ZW1wID0gZk11bHQodGVtcCxiYW5kZmFjdG9yKTsKLSAgICAgIHRlbXAgPSBmTXVsdERpdjIodGVtcCxiYW5kZmFjdG9yKTw8MjsKKyAgICBmb3IgKGogPSAwOyBqIDwgbnVtX2JhbmRzOyBqKyspCisgICAgICAvLyB0ZW1wID0gZk11bHQodGVtcCxiYW5kZmFjdG9yKTsKKyAgICAgIHRlbXAgPSBmTXVsdERpdjIodGVtcCwgYmFuZGZhY3RvcikgPDwgMjsKIAotICAgIGlmICh0ZW1wPHN0YXJ0KSB7IC8qIEZhY3RvciB0b28gc3Ryb25nLCBtYWtlIGl0IHdlYWtlciAqLworICAgIGlmICh0ZW1wIDwgc3RhcnQpIHsgLyogRmFjdG9yIHRvbyBzdHJvbmcsIG1ha2UgaXQgd2Vha2VyICovCiAgICAgICBpZiAoZGlyZWN0aW9uID09IDApCiAgICAgICAgIC8qIEhhbGZlbiBzdGVwLiBSaWdodCBzaGlmdCBpcyBub3QgZG9uZSBhcyBmcmFjdCBiZWNhdXNlIG90aGVyd2lzZSB0aGUKICAgICAgICAgICAgbG93ZXN0IGJpdCBjYW5ub3QgYmUgY2xlYXJlZCBkdWUgdG8gcm91bmRpbmcgKi8KICAgICAgICAgc3RlcCA9IChGSVhQX0RCTCkoKExPTkcpc3RlcCA+PiAxKTsKICAgICAgIGRpcmVjdGlvbiA9IDE7CiAgICAgICBiYW5kZmFjdG9yID0gYmFuZGZhY3RvciArIHN0ZXA7Ci0gICAgfQotICAgIGVsc2UgeyAgLyogRmFjdG9yIGlzIHRvbyB3ZWFrOiBtYWtlIGl0IHN0cm9uZ2VyICovCi0gICAgICBpZiAoZGlyZWN0aW9uID09IDEpCi0gICAgICAgIHN0ZXAgPSAoRklYUF9EQkwpKChMT05HKXN0ZXAgPj4gMSk7CisgICAgfSBlbHNlIHsgLyogRmFjdG9yIGlzIHRvbyB3ZWFrOiBtYWtlIGl0IHN0cm9uZ2VyICovCisgICAgICBpZiAoZGlyZWN0aW9uID09IDEpIHN0ZXAgPSAoRklYUF9EQkwpKChMT05HKXN0ZXAgPj4gMSk7CiAgICAgICBkaXJlY3Rpb24gPSAwOwogICAgICAgYmFuZGZhY3RvciA9IGJhbmRmYWN0b3IgLSBzdGVwOwogICAgIH0KIAotICAgIGlmIChpPjEwMCkgeworICAgIGlmIChpID4gMTAwKSB7CiAgICAgICBzdGVwID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgfQogICB9Ci0gIHJldHVybiBGWF9EQkwyRlhfU0dMKGJhbmRmYWN0b3I8PDEpOworICByZXR1cm4gRlhfREJMMkZYX1NHTChiYW5kZmFjdG9yIDw8IDEpOwogfQogCi0KIC8qIQogICBcYnJpZWYgICAgIENhbGN1bGF0ZSBudW1iZXIgb2YgU0JSIGJhbmRzIGJldHdlZW4gc3RhcnQgYW5kIHN0b3AgYmFuZAogCkBAIC00ODcsMzQgKzUzNiwzNSBAQAogCiAgIFxyZXR1cm4gICAgbnVtYmVyIG9mIGJhbmRzCiAqLwotc3RhdGljIGludAotbnVtYmVyT2ZCYW5kcyhGSVhQX1NHTCBicG9fZGl2MTYsIC8qITwgSW5wdXQ6IG51bWJlciBvZiBiYW5kcyBwZXIgb2N0YXZlIGRpdmlkZWQgYnkgMTYgKi8KLSAgICAgICAgICAgICAgaW50ICAgIHN0YXJ0LCAgICAgLyohPCBGaXJzdCBRTUYgYmFuZCBvZiBTQlIgZnJlcXVlbmN5IHJhbmdlICovCi0gICAgICAgICAgICAgIGludCAgICBzdG9wLCAgICAgIC8qITwgTGFzdCBRTUYgYmFuZCBvZiBTQlIgZnJlcXVlbmN5IHJhbmdlICsgMSAqLwotICAgICAgICAgICAgICBpbnQgICAgd2FycEZsYWcpICAvKiE8IFN0cmV0Y2hpbmcgZmxhZyAqLworc3RhdGljIGludCBudW1iZXJPZkJhbmRzKAorICAgIEZJWFBfU0dMIGJwb19kaXYxNiwgLyohPCBJbnB1dDogbnVtYmVyIG9mIGJhbmRzIHBlciBvY3RhdmUgZGl2aWRlZCBieSAxNiAqLworICAgIGludCBzdGFydCwgICAgICAgICAgLyohPCBGaXJzdCBRTUYgYmFuZCBvZiBTQlIgZnJlcXVlbmN5IHJhbmdlICovCisgICAgaW50IHN0b3AsICAgICAgICAgICAvKiE8IExhc3QgUU1GIGJhbmQgb2YgU0JSIGZyZXF1ZW5jeSByYW5nZSArIDEgKi8KKyAgICBpbnQgd2FycEZsYWcpICAgICAgIC8qITwgU3RyZXRjaGluZyBmbGFnICovCiB7CiAgIEZJWFBfU0dMIG51bV9iYW5kc19kaXYxMjg7Ci0gIGludCAgICBudW1fYmFuZHM7CisgIGludCBudW1fYmFuZHM7CiAKLSAgbnVtX2JhbmRzX2RpdjEyOCA9IEZYX0RCTDJGWF9TR0woZk11bHQoRkRLX2dldE51bU9jdGF2ZXNEaXY4KHN0YXJ0LHN0b3ApLGJwb19kaXYxNikpOworICBudW1fYmFuZHNfZGl2MTI4ID0KKyAgICAgIEZYX0RCTDJGWF9TR0woZk11bHQoRkRLX2dldE51bU9jdGF2ZXNEaXY4KHN0YXJ0LCBzdG9wKSwgYnBvX2RpdjE2KSk7CiAKICAgaWYgKHdhcnBGbGFnKSB7CiAgICAgLyogQXBwbHkgdGhlIHdhcnAgZmFjdG9yIG9mIDEuMyB0byBnZXQgd2lkZXIgYmFuZHMuICBXZSB1c2UgYSB2YWx1ZQogICAgICAgIG9mIDMyNzY4LzI1MjAwIGluc3RlYWQgb2YgdGhlIGV4YWN0IHZhbHVlIHRvIGF2b2lkIGNyaXRpY2FsIGNhc2VzCiAgICAgICAgb2Ygcm91bmRpbmcuCiAgICAgKi8KLSAgICBudW1fYmFuZHNfZGl2MTI4ID0gRlhfREJMMkZYX1NHTChmTXVsdChudW1fYmFuZHNfZGl2MTI4LCBGTDJGWENPTlNUX1NHTCgyNTIwMC4wLzMyNzY4LjApKSk7CisgICAgbnVtX2JhbmRzX2RpdjEyOCA9IEZYX0RCTDJGWF9TR0woCisgICAgICAgIGZNdWx0KG51bV9iYW5kc19kaXYxMjgsIEZMMkZYQ09OU1RfU0dMKDI1MjAwLjAgLyAzMjc2OC4wKSkpOwogICB9CiAKICAgLyogYWRkIHNjYWxlZCAxIGZvciByb3VuZGluZyB0byBldmVuIG51bWJlcnM6ICovCi0gIG51bV9iYW5kc19kaXYxMjggPSBudW1fYmFuZHNfZGl2MTI4ICsgRkwyRlhDT05TVF9TR0woIDEuMGYvMTI4LjBmICk7CisgIG51bV9iYW5kc19kaXYxMjggPSBudW1fYmFuZHNfZGl2MTI4ICsgRkwyRlhDT05TVF9TR0woMS4wZiAvIDEyOC4wZik7CiAgIC8qIHNjYWxlIGJhY2sgdG8gcmlnaHQgYWxpZ25lZCBpbnRlZ2VyIGFuZCBkb3VibGUgdGhlIHZhbHVlOiAqLwogICBudW1fYmFuZHMgPSAyICogKChMT05HKW51bV9iYW5kc19kaXYxMjggPj4gKEZSQUNUX0JJVFMgLSA3KSk7CiAKLSAgcmV0dXJuKG51bV9iYW5kcyk7CisgIHJldHVybiAobnVtX2JhbmRzKTsKIH0KIAotCiAvKiEKICAgXGJyaWVmICAgICBDYWxjdWxhdGUgd2lkdGggb2YgU0JSIGJhbmRzCiAKQEAgLTUyMiwxMSArNTcyLDEwIEBACiAgIHRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgd2lkdGggb2YgZWFjaCBTQlIgYmFuZCBpbiBRTUYgY2hhbm5lbHMuCiAgIFRoZSBiYW5kcyBnZXQgd2lkZXIgZnJvbSBzdGFydCB0byBzdG9wIChiYXJrIHNjYWxlKS4KICovCi1zdGF0aWMgdm9pZAotQ2FsY0JhbmRzKFVDSEFSICogZGlmZiwgICAgLyohPCBWZWN0b3Igb2Ygd2lkdGhzIHRvIGJlIGNhbGN1bGF0ZWQgKi8KLSAgICAgICAgICBVQ0hBUiBzdGFydCwgICAgIC8qITwgTG93ZXIgZW5kIG9mIHN1YmJhbmQgcmFuZ2UgKi8KLSAgICAgICAgICBVQ0hBUiBzdG9wLCAgICAgIC8qITwgVXBwZXIgZW5kIG9mIHN1YmJhbmQgcmFuZ2UgKi8KLSAgICAgICAgICBVQ0hBUiBudW1fYmFuZHMpIC8qITwgRGVzaXJlZCBudW1iZXIgb2YgYmFuZHMgKi8KK3N0YXRpYyB2b2lkIENhbGNCYW5kcyhVQ0hBUiAqZGlmZiwgICAgIC8qITwgVmVjdG9yIG9mIHdpZHRocyB0byBiZSBjYWxjdWxhdGVkICovCisgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgc3RhcnQsICAgICAvKiE8IExvd2VyIGVuZCBvZiBzdWJiYW5kIHJhbmdlICovCisgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgc3RvcCwgICAgICAvKiE8IFVwcGVyIGVuZCBvZiBzdWJiYW5kIHJhbmdlICovCisgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgbnVtX2JhbmRzKSAvKiE8IERlc2lyZWQgbnVtYmVyIG9mIGJhbmRzICovCiB7CiAgIGludCBpOwogICBpbnQgcHJldmlvdXM7CkBAIC01MzUsMTggKzU4NCwyMCBAQAogICBGSVhQX1NHTCBiYW5kZmFjdG9yID0gY2FsY0ZhY3RvclBlckJhbmQoc3RhcnQsIHN0b3AsIG51bV9iYW5kcyk7CiAKICAgcHJldmlvdXMgPSBzdG9wOyAvKiBTdGFydCB3aXRoIGhpZ2hlc3QgUU1GIGNoYW5uZWwgKi8KLSAgZXhhY3QgPSAoRklYUF9TR0wpKHN0b3AgPDwgKEZSQUNUX0JJVFMtOCkpOyAvKiBTaGlmdCBsZWZ0IHRvIGdhaW4gc29tZSBhY2N1cmFjeSAqLworICBleGFjdCA9IChGSVhQX1NHTCkoCisgICAgICBzdG9wIDw8IChGUkFDVF9CSVRTIC0gOCkpOyAvKiBTaGlmdCBsZWZ0IHRvIGdhaW4gc29tZSBhY2N1cmFjeSAqLwogCi0gIGZvcihpPW51bV9iYW5kcy0xOyBpPj0wOyBpLS0pIHsKKyAgZm9yIChpID0gbnVtX2JhbmRzIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAvKiBDYWxjdWxhdGUgYm9yZGVyIG9mIG5leHQgbG93ZXIgc2JyIGJhbmQgKi8KLSAgICBleGFjdCA9IEZYX0RCTDJGWF9TR0woZk11bHQoZXhhY3QsYmFuZGZhY3RvcikpOworICAgIGV4YWN0ID0gRlhfREJMMkZYX1NHTChmTXVsdChleGFjdCwgYmFuZGZhY3RvcikpOwogCiAgICAgLyogQWRkIHNjYWxlZCAwLjUgZm9yIHJvdW5kaW5nOgotICAgICAgIFdlIHVzZSBhIHZhbHVlIDEyOC8yNTYgaW5zdGVhZCBvZiAwLjUgdG8gYXZvaWQgc29tZSBjcml0aWNhbCBjYXNlcyBvZiByb3VuZGluZy4gKi8KLSAgICB0ZW1wID0gZXhhY3QgKyAgRkwyRlhDT05TVF9TR0woMTI4LjAvMzI3NjguMCk7CisgICAgICAgV2UgdXNlIGEgdmFsdWUgMTI4LzI1NiBpbnN0ZWFkIG9mIDAuNSB0byBhdm9pZCBzb21lIGNyaXRpY2FsIGNhc2VzIG9mCisgICAgICAgcm91bmRpbmcuICovCisgICAgdGVtcCA9IGV4YWN0ICsgRkwyRlhDT05TVF9TR0woMTI4LjAgLyAzMjc2OC4wKTsKIAogICAgIC8qIHNjYWxlIGJhY2sgdG8gcmlnaHQgYWxpbmdlZCBpbnRlZ2VyOiAqLwotICAgIGN1cnJlbnQgPSAoTE9ORyl0ZW1wID4+IChGUkFDVF9CSVRTLTgpOworICAgIGN1cnJlbnQgPSAoTE9ORyl0ZW1wID4+IChGUkFDVF9CSVRTIC0gOCk7CiAKICAgICAvKiBTYXZlIHdpZHRoIG9mIGJhbmQgaSAqLwogICAgIGRpZmZbaV0gPSBwcmV2aW91cyAtIGN1cnJlbnQ7CkBAIC01NTQsMjAgKzYwNSwxNyBAQAogICB9CiB9CiAKLQogLyohCiAgIFxicmllZiAgICAgQ2FsY3VsYXRlIGN1bXVsYXRlZCBzdW0gdmVjdG9yIGZyb20gZGVsdGEgdmVjdG9yCiAqLwotc3RhdGljIHZvaWQKLWN1bVN1bShVQ0hBUiBzdGFydF92YWx1ZSwgVUNIQVIqIGRpZmYsIFVDSEFSIGxlbmd0aCwgVUNIQVIgKnN0YXJ0X2FkcmVzcykKLXsKK3N0YXRpYyB2b2lkIGN1bVN1bShVQ0hBUiBzdGFydF92YWx1ZSwgVUNIQVIgKmRpZmYsIFVDSEFSIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICBVQ0hBUiAqc3RhcnRfYWRyZXNzKSB7CiAgIGludCBpOwotICBzdGFydF9hZHJlc3NbMF09c3RhcnRfdmFsdWU7Ci0gIGZvcihpPTE7IGk8PWxlbmd0aDsgaSsrKQotICAgIHN0YXJ0X2FkcmVzc1tpXSA9IHN0YXJ0X2FkcmVzc1tpLTFdICsgZGlmZltpLTFdOworICBzdGFydF9hZHJlc3NbMF0gPSBzdGFydF92YWx1ZTsKKyAgZm9yIChpID0gMTsgaSA8PSBsZW5ndGg7IGkrKykKKyAgICBzdGFydF9hZHJlc3NbaV0gPSBzdGFydF9hZHJlc3NbaSAtIDFdICsgZGlmZltpIC0gMV07CiB9CiAKLQogLyohCiAgIFxicmllZiAgICAgQWRhcHQgd2lkdGggb2YgZnJlcXVlbmN5IGJhbmRzIGluIHRoZSBzZWNvbmQgcmVnaW9uCiAKQEAgLTU3NSwxMTYgKzYyMyw5NiBAQAogICBpcyBjYWxjdWxhdGVkIHNlcGFyYXRlbHkuIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gYXZvaWQgdGhhdCB0aGUgc2Vjb25kIHJlZ2lvbgogICBzdGFydHMgd2l0aCBhIGJhbmQgc21hbGxlciB0aGFuIHRoZSBoaWdoZXN0IGJhbmQgb2YgdGhlIGZpcnN0IHJlZ2lvbi4KICovCi1zdGF0aWMgU0JSX0VSUk9SCi1tb2RpZnlCYW5kcyhVQ0hBUiBtYXhfYmFuZF9wcmV2aW91cywgVUNIQVIgKiBkaWZmLCBVQ0hBUiBsZW5ndGgpCi17CitzdGF0aWMgU0JSX0VSUk9SIG1vZGlmeUJhbmRzKFVDSEFSIG1heF9iYW5kX3ByZXZpb3VzLCBVQ0hBUiAqZGlmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgbGVuZ3RoKSB7CiAgIGludCBjaGFuZ2UgPSBtYXhfYmFuZF9wcmV2aW91cyAtIGRpZmZbMF07CiAKLSAgLyogTGltaXQgdGhlIGNoYW5nZSBzbyB0aGF0IHRoZSBsYXN0IGJhbmQgY2Fubm90IGdldCBuYXJyb3dlciB0aGFuIHRoZSBmaXJzdCBvbmUgKi8KLSAgaWYgKCBjaGFuZ2UgPiAoZGlmZltsZW5ndGgtMV0tZGlmZlswXSk+PjEgKQotICAgIGNoYW5nZSA9IChkaWZmW2xlbmd0aC0xXS1kaWZmWzBdKT4+MTsKKyAgLyogTGltaXQgdGhlIGNoYW5nZSBzbyB0aGF0IHRoZSBsYXN0IGJhbmQgY2Fubm90IGdldCBuYXJyb3dlciB0aGFuIHRoZSBmaXJzdAorICAgKiBvbmUgKi8KKyAgaWYgKGNoYW5nZSA+IChkaWZmW2xlbmd0aCAtIDFdIC0gZGlmZlswXSkgPj4gMSkKKyAgICBjaGFuZ2UgPSAoZGlmZltsZW5ndGggLSAxXSAtIGRpZmZbMF0pID4+IDE7CiAKICAgZGlmZlswXSArPSBjaGFuZ2U7Ci0gIGRpZmZbbGVuZ3RoLTFdIC09IGNoYW5nZTsKKyAgZGlmZltsZW5ndGggLSAxXSAtPSBjaGFuZ2U7CiAgIHNoZWxsc29ydChkaWZmLCBsZW5ndGgpOwogCiAgIHJldHVybiBTQlJERUNfT0s7CiB9CiAKLQogLyohCiAgIFxicmllZiAgIFVwZGF0ZSBoaWdoIHJlc29sdXRpb24gZnJlcXVlbmN5IGJhbmQgdGFibGUKICovCi1zdGF0aWMgdm9pZAotc2JyZGVjVXBkYXRlSGlSZXMoVUNIQVIgKiBoX2hpcmVzLAotICAgICAgICAgICAgICAgICAgVUNIQVIgKiBudW1faGlyZXMsCi0gICAgICAgICAgICAgICAgICBVQ0hBUiAqIHZfa19tYXN0ZXIsCi0gICAgICAgICAgICAgICAgICBVQ0hBUiBudW1fYmFuZHMsCi0gICAgICAgICAgICAgICAgICBVQ0hBUiB4b3Zlcl9iYW5kKQoteworc3RhdGljIHZvaWQgc2JyZGVjVXBkYXRlSGlSZXMoVUNIQVIgKmhfaGlyZXMsIFVDSEFSICpudW1faGlyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdl9rX21hc3RlciwgVUNIQVIgbnVtX2JhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgeG92ZXJfYmFuZCkgewogICBVQ0hBUiBpOwogCi0gICpudW1faGlyZXMgPSBudW1fYmFuZHMteG92ZXJfYmFuZDsKKyAgKm51bV9oaXJlcyA9IG51bV9iYW5kcyAtIHhvdmVyX2JhbmQ7CiAKLSAgZm9yKGk9eG92ZXJfYmFuZDsgaTw9bnVtX2JhbmRzOyBpKyspIHsKLSAgICBoX2hpcmVzW2kteG92ZXJfYmFuZF0gPSB2X2tfbWFzdGVyW2ldOworICBmb3IgKGkgPSB4b3Zlcl9iYW5kOyBpIDw9IG51bV9iYW5kczsgaSsrKSB7CisgICAgaF9oaXJlc1tpIC0geG92ZXJfYmFuZF0gPSB2X2tfbWFzdGVyW2ldOwogICB9CiB9CiAKLQogLyohCiAgIFxicmllZiAgQnVpbGQgbG93IHJlc29sdXRpb24gdGFibGUgb3V0IG9mIGhpZ2ggcmVzb2x1dGlvbiB0YWJsZQogKi8KLXN0YXRpYyB2b2lkCi1zYnJkZWNVcGRhdGVMb1JlcyhVQ0hBUiAqIGhfbG9yZXMsCi0gICAgICAgICAgICAgICAgICBVQ0hBUiAqIG51bV9sb3JlcywKLSAgICAgICAgICAgICAgICAgIFVDSEFSICogaF9oaXJlcywKLSAgICAgICAgICAgICAgICAgIFVDSEFSIG51bV9oaXJlcykKLXsKK3N0YXRpYyB2b2lkIHNicmRlY1VwZGF0ZUxvUmVzKFVDSEFSICpoX2xvcmVzLCBVQ0hBUiAqbnVtX2xvcmVzLCBVQ0hBUiAqaF9oaXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIG51bV9oaXJlcykgewogICBVQ0hBUiBpOwogCi0gIGlmKCAobnVtX2hpcmVzICYgMSkgPT0gMCkgeworICBpZiAoKG51bV9oaXJlcyAmIDEpID09IDApIHsKICAgICAvKiBJZiBldmVuIG51bWJlciBvZiBoaXJlcyBiYW5kcyAqLwogICAgICpudW1fbG9yZXMgPSBudW1faGlyZXMgPj4gMTsKICAgICAvKiBVc2UgZXZlcnkgc2Vjb25kIGxvcmVzPWhpcmVzWzAsMiw0Li4uXSAqLwotICAgIGZvcihpPTA7IGk8PSpudW1fbG9yZXM7IGkrKykKLSAgICAgIGhfbG9yZXNbaV0gPSBoX2hpcmVzW2kqMl07Ci0gIH0KLSAgZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8PSAqbnVtX2xvcmVzOyBpKyspIGhfbG9yZXNbaV0gPSBoX2hpcmVzW2kgKiAyXTsKKyAgfSBlbHNlIHsKICAgICAvKiBPZGQgbnVtYmVyIG9mIGhpcmVzLCB3aGljaCBtZWFucyB4b3ZlciBpcyBvZGQgKi8KLSAgICAqbnVtX2xvcmVzID0gKG51bV9oaXJlcysxKSA+PiAxOworICAgICpudW1fbG9yZXMgPSAobnVtX2hpcmVzICsgMSkgPj4gMTsKICAgICAvKiBVc2UgbG9yZXM9aGlyZXNbMCwxLDMsNSAuLi5dICovCiAgICAgaF9sb3Jlc1swXSA9IGhfaGlyZXNbMF07Ci0gICAgZm9yKGk9MTsgaTw9Km51bV9sb3JlczsgaSsrKSB7Ci0gICAgICBoX2xvcmVzW2ldID0gaF9oaXJlc1tpKjItMV07CisgICAgZm9yIChpID0gMTsgaSA8PSAqbnVtX2xvcmVzOyBpKyspIHsKKyAgICAgIGhfbG9yZXNbaV0gPSBoX2hpcmVzW2kgKiAyIC0gMV07CiAgICAgfQogICB9CiB9CiAKLQogLyohCi0gIFxicmllZiAgIERlcml2ZSBhIGxvdy1yZXNvbHV0aW9uIGZyZXF1ZW5jeS10YWJsZSBmcm9tIHRoZSBtYXN0ZXIgZnJlcXVlbmN5IHRhYmxlCisgIFxicmllZiAgIERlcml2ZSBhIGxvdy1yZXNvbHV0aW9uIGZyZXF1ZW5jeS10YWJsZSBmcm9tIHRoZSBtYXN0ZXIgZnJlcXVlbmN5CisgIHRhYmxlCiAqLwotdm9pZAotc2JyZGVjRG93blNhbXBsZUxvUmVzKFVDSEFSICp2X3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBudW1fcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpmcmVxQmFuZFRhYmxlUmVmLAotICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIG51bV9SZWYpCi17Cit2b2lkIHNicmRlY0Rvd25TYW1wbGVMb1JlcyhVQ0hBUiAqdl9yZXN1bHQsIFVDSEFSIG51bV9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqZnJlcUJhbmRUYWJsZVJlZiwgVUNIQVIgbnVtX1JlZikgewogICBpbnQgc3RlcDsKLSAgaW50IGksajsKLSAgaW50IG9yZ19sZW5ndGgscmVzdWx0X2xlbmd0aDsKLSAgaW50IHZfaW5kZXhbTUFYX0ZSRVFfQ09FRkZTPj4xXTsKKyAgaW50IGksIGo7CisgIGludCBvcmdfbGVuZ3RoLCByZXN1bHRfbGVuZ3RoOworICBpbnQgdl9pbmRleFtNQVhfRlJFUV9DT0VGRlMgPj4gMV07CiAKICAgLyogaW5pdCAqLwogICBvcmdfbGVuZ3RoID0gbnVtX1JlZjsKICAgcmVzdWx0X2xlbmd0aCA9IG51bV9yZXN1bHQ7CiAKLSAgdl9pbmRleFswXSA9IDA7ICAgLyogQWx3YXlzIHVzZSBsZWZ0IGJvcmRlciAqLwotICBpPTA7Ci0gIHdoaWxlKG9yZ19sZW5ndGggPiAwKSB7CisgIHZfaW5kZXhbMF0gPSAwOyAvKiBBbHdheXMgdXNlIGxlZnQgYm9yZGVyICovCisgIGkgPSAwOworICB3aGlsZSAob3JnX2xlbmd0aCA+IDApIHsKICAgICAvKiBDcmVhdGUgZG93bnNhbXBsZSB2ZWN0b3IgKi8KICAgICBpKys7CiAgICAgc3RlcCA9IG9yZ19sZW5ndGggLyByZXN1bHRfbGVuZ3RoOwogICAgIG9yZ19sZW5ndGggPSBvcmdfbGVuZ3RoIC0gc3RlcDsKICAgICByZXN1bHRfbGVuZ3RoLS07Ci0gICAgdl9pbmRleFtpXSA9IHZfaW5kZXhbaS0xXSArIHN0ZXA7CisgICAgdl9pbmRleFtpXSA9IHZfaW5kZXhbaSAtIDFdICsgc3RlcDsKICAgfQogCi0gIGZvcihqPTA7ajw9aTtqKyspIHsKKyAgZm9yIChqID0gMDsgaiA8PSBpOyBqKyspIHsKICAgICAvKiBVc2UgZG93bnNhbXBsZSB2ZWN0b3IgdG8gaW5kZXggTG9SZXNvbHV0aW9uIHZlY3RvciAqLwotICAgIHZfcmVzdWx0W2pdPWZyZXFCYW5kVGFibGVSZWZbdl9pbmRleFtqXV07CisgICAgdl9yZXN1bHRbal0gPSBmcmVxQmFuZFRhYmxlUmVmW3ZfaW5kZXhbal1dOwogICB9Ci0KIH0KIAotCiAvKiEKICAgXGJyaWVmICAgU29ydGluZyByb3V0aW5lCiAqLwotdm9pZCBzaGVsbHNvcnQoVUNIQVIgKmluLCBVQ0hBUiBuKQotewotCit2b2lkIHNoZWxsc29ydChVQ0hBUiAqaW4sIFVDSEFSIG4pIHsKICAgaW50IGksIGosIHYsIHc7CiAgIGludCBpbmMgPSAxOwogCkBAIC02OTcsMTE1ICs3MjUsMTEwIEBACiAgICAgZm9yIChpID0gaW5jOyBpIDwgbjsgaSsrKSB7CiAgICAgICB2ID0gaW5baV07CiAgICAgICBqID0gaTsKLSAgICAgIHdoaWxlICgodz1pbltqLWluY10pID4gdikgeworICAgICAgd2hpbGUgKCh3ID0gaW5baiAtIGluY10pID4gdikgewogICAgICAgICBpbltqXSA9IHc7CiAgICAgICAgIGogLT0gaW5jOwotICAgICAgICBpZiAoaiA8IGluYykKLSAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGogPCBpbmMpIGJyZWFrOwogICAgICAgfQogICAgICAgaW5bal0gPSB2OwogICAgIH0KICAgfSB3aGlsZSAoaW5jID4gMSk7Ci0KIH0KIAotCi0KIC8qIQogICBcYnJpZWYgICBSZXNldCBmcmVxdWVuY3kgYmFuZCB0YWJsZXMKICAgXHJldHVybiAgZXJyb3JDb2RlLCAwIGlmIHN1Y2Nlc3NmdWwKICovCiBTQlJfRVJST1IKLXJlc2V0RnJlcUJhbmRUYWJsZXMoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgY29uc3QgVUlOVCBmbGFncykKLXsKK3Jlc2V0RnJlcUJhbmRUYWJsZXMoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgY29uc3QgVUlOVCBmbGFncykgewogICBTQlJfRVJST1IgZXJyID0gU0JSREVDX09LOwotICBpbnQgazIsa3gsIGxzYiwgdXNiOwotICBpbnQgICAgIGludFRlbXA7Ci0gIFVDSEFSICAgIG5CYW5kc0xvLCBuQmFuZHNIaTsKKyAgaW50IGsyLCBreCwgbHNiLCB1c2I7CisgIGludCBpbnRUZW1wOworICBVQ0hBUiBuQmFuZHNMbywgbkJhbmRzSGk7CiAgIEhBTkRMRV9GUkVRX0JBTkRfREFUQSBoRnJlcSA9ICZoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhOwogCiAgIC8qIENhbGN1bGF0ZSBtYXN0ZXIgZnJlcXVlbmN5IGZ1bmN0aW9uICovCi0gIGVyciA9IHNicmRlY1VwZGF0ZUZyZXFTY2FsZShoRnJlcS0+dl9rX21hc3RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRnJlcS0+bnVtTWFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPnNiclByb2NTbXBsUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICBlcnIgPSBzYnJkZWNVcGRhdGVGcmVxU2NhbGUoaEZyZXEtPnZfa19tYXN0ZXIsICZoRnJlcS0+bnVtTWFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEtPnNiclByb2NTbXBsUmF0ZSwgaEhlYWRlckRhdGEsIGZsYWdzKTsKIAotICBpZiAoIGVyciB8fCAoaEhlYWRlckRhdGEtPmJzX2luZm8ueG92ZXJfYmFuZCA+IGhGcmVxLT5udW1NYXN0ZXIpICkgeworICBpZiAoZXJyIHx8IChoSGVhZGVyRGF0YS0+YnNfaW5mby54b3Zlcl9iYW5kID4gaEZyZXEtPm51bU1hc3RlcikpIHsKICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKICAgfQogCiAgIC8qIERlcml2ZSBIaXJlc29sdXRpb24gZnJvbSBtYXN0ZXIgZnJlcXVlbmN5IGZ1bmN0aW9uICovCi0gIHNicmRlY1VwZGF0ZUhpUmVzKGhGcmVxLT5mcmVxQmFuZFRhYmxlWzFdLCAmbkJhbmRzSGksIGhGcmVxLT52X2tfbWFzdGVyLCBoRnJlcS0+bnVtTWFzdGVyLCBoSGVhZGVyRGF0YS0+YnNfaW5mby54b3Zlcl9iYW5kICk7CisgIHNicmRlY1VwZGF0ZUhpUmVzKGhGcmVxLT5mcmVxQmFuZFRhYmxlWzFdLCAmbkJhbmRzSGksIGhGcmVxLT52X2tfbWFzdGVyLAorICAgICAgICAgICAgICAgICAgICBoRnJlcS0+bnVtTWFzdGVyLCBoSGVhZGVyRGF0YS0+YnNfaW5mby54b3Zlcl9iYW5kKTsKICAgLyogRGVyaXZlIExvcmVzb2x1dGlvbiBmcm9tIEhpcmVzb2x1dGlvbiAqLwotICBzYnJkZWNVcGRhdGVMb1JlcyhoRnJlcS0+ZnJlcUJhbmRUYWJsZVswXSwgJm5CYW5kc0xvLCBoRnJlcS0+ZnJlcUJhbmRUYWJsZVsxXSwgbkJhbmRzSGkpOwotCisgIHNicmRlY1VwZGF0ZUxvUmVzKGhGcmVxLT5mcmVxQmFuZFRhYmxlWzBdLCAmbkJhbmRzTG8sIGhGcmVxLT5mcmVxQmFuZFRhYmxlWzFdLAorICAgICAgICAgICAgICAgICAgICBuQmFuZHNIaSk7CiAKICAgaEZyZXEtPm5TZmJbMF0gPSBuQmFuZHNMbzsKICAgaEZyZXEtPm5TZmJbMV0gPSBuQmFuZHNIaTsKIAogICAvKiBDaGVjayBpbmRleCB0byBmcmVxQmFuZFRhYmxlWzBdICovCi0gIGlmICggIShuQmFuZHNMbyA+IDApIHx8IChuQmFuZHNMbyA+IChNQVhfRlJFUV9DT0VGRlM+PjEpKSApIHsKKyAgaWYgKCEobkJhbmRzTG8gPiAwKSB8fAorICAgICAgKG5CYW5kc0xvID4gKCgoaEhlYWRlckRhdGEtPm51bWJlck9mQW5hbHlzaXNCYW5kcyA9PSAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgID8gTUFYX0ZSRVFfQ09FRkZTX1FVQURfUkFURQorICAgICAgICAgICAgICAgICAgICAgICAgOiBNQVhfRlJFUV9DT0VGRlNfRFVBTF9SQVRFKSA+PgorICAgICAgICAgICAgICAgICAgIDEpKSkgewogICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogICB9CiAKICAgbHNiID0gaEZyZXEtPmZyZXFCYW5kVGFibGVbMF1bMF07CiAgIHVzYiA9IGhGcmVxLT5mcmVxQmFuZFRhYmxlWzBdW25CYW5kc0xvXTsKIAotICAvKiBBZGRpdGlvbmFsIGNoZWNrIGZvciBsc2IgKi8KLSAgaWYgKCAobHNiID4gKDMyKSkgfHwgKGxzYiA+PSB1c2IpICkgeworICAvKiBDaGVjayBmb3Igc3RhcnQgZnJlcXVlbmN5IGJvcmRlciBrX3g6CisgICAgIC0gSVNPL0lFQyAxNDQ5Ni0zIDQuNi4xOC4zLjYgUmVxdWlyZW1lbnRzCisgICAgIC0gSVNPL0lFQyAyMzAwMy0zIDcuNS41LjIgICAgTW9kaWZpY2F0aW9ucyBhbmQgYWRkaXRpb25zIHRvIHRoZSBNUEVHLTQgU0JSCisgICAgIHRvb2wKKyAgKi8KKyAgLyogTm90ZSB0aGF0IGxzYiA+IGFzIGhIZWFkZXJEYXRhLT5udW1iZXJPZkFuYWx5c2lzQmFuZHMgaXMgYSB2YWxpZCBTQlIgY29uZmlnCisgICAqIGZvciAyNCBiYW5kIFFNRiBhbmFseXNpcy4gKi8KKyAgaWYgKChsc2IgPiAoKGZsYWdzICYgU0JSREVDX1FVQURfUkFURSkgPyAxNiA6ICgzMikpKSB8fCAobHNiID49IHVzYikpIHsKICAgICByZXR1cm4gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKICAgfQogCi0KICAgLyogQ2FsY3VsYXRlIG51bWJlciBvZiBub2lzZSBiYW5kcyAqLwogCiAgIGsyID0gaEZyZXEtPmZyZXFCYW5kVGFibGVbMV1bbkJhbmRzSGldOwogICBreCA9IGhGcmVxLT5mcmVxQmFuZFRhYmxlWzFdWzBdOwogCi0gIGlmIChoSGVhZGVyRGF0YS0+YnNfZGF0YS5ub2lzZV9iYW5kcyA9PSAwKQotICB7CisgIGlmIChoSGVhZGVyRGF0YS0+YnNfZGF0YS5ub2lzZV9iYW5kcyA9PSAwKSB7CiAgICAgaEZyZXEtPm5OZmIgPSAxOwotICB9Ci0gIGVsc2UgLyogQ2FsY3VsYXRlIG5vIG9mIG5vaXNlIGJhbmRzIDEsMiBvciAzIGJhbmRzL29jdGF2ZSAqLworICB9IGVsc2UgLyogQ2FsY3VsYXRlIG5vIG9mIG5vaXNlIGJhbmRzIDEsMiBvciAzIGJhbmRzL29jdGF2ZSAqLwogICB7CiAgICAgLyogRmV0Y2ggbnVtYmVyIG9mIG9jdGF2ZXMgZGl2aWRlZCBieSAzMiAqLwotICAgIGludFRlbXAgPSAoTE9ORylGREtfZ2V0TnVtT2N0YXZlc0Rpdjgoa3gsazIpID4+IDI7CisgICAgaW50VGVtcCA9IChMT05HKUZES19nZXROdW1PY3RhdmVzRGl2OChreCwgazIpID4+IDI7CiAKICAgICAvKiBJbnRlZ2VyLU11bHRpcGxpY2F0aW9uIHdpdGggbnVtYmVyIG9mIGJhbmRzOiAqLwogICAgIGludFRlbXAgPSBpbnRUZW1wICogaEhlYWRlckRhdGEtPmJzX2RhdGEubm9pc2VfYmFuZHM7CiAKICAgICAvKiBBZGQgc2NhbGVkIDAuNSBmb3Igcm91bmRpbmc6ICovCi0gICAgaW50VGVtcCA9IGludFRlbXAgKyAoTE9ORylGTDJGWENPTlNUX1NHTCgwLjVmLzMyLjBmKTsKKyAgICBpbnRUZW1wID0gaW50VGVtcCArIChMT05HKUZMMkZYQ09OU1RfU0dMKDAuNWYgLyAzMi4wZik7CiAKICAgICAvKiBDb252ZXJ0IHRvIHJpZ2h0LWFsaWduZWQgaW50ZWdlcjogKi8KICAgICBpbnRUZW1wID0gaW50VGVtcCA+PiAoRlJBQ1RfQklUUyAtIDEgLypzaWduKi8gLSA1IC8qIHJlc2NhbGUgKi8pOwogCi0gICAgLyogQ29tcGFyZSB3aXRoIGZsb2F0IGNhbGN1bGF0aW9uICovCi0gICAgRkRLX0FTU0VSVCggaW50VGVtcCA9PSAgKGludCkoKGhIZWFkZXJEYXRhLT5ic19kYXRhLm5vaXNlX2JhbmRzICogRkRLbG9nKCAoZmxvYXQpazIva3gpIC8gKGZsb2F0KShGREtsb2coMi4wKSkpKzAuNSkgKTsKLQotICAgIGlmKCBpbnRUZW1wPT0wKQotICAgICAgaW50VGVtcD0xOworICAgIGlmIChpbnRUZW1wID09IDApIGludFRlbXAgPSAxOwogCiAgICAgaEZyZXEtPm5OZmIgPSBpbnRUZW1wOwogICB9CiAKICAgaEZyZXEtPm5JbnZmQmFuZHMgPSBoRnJlcS0+bk5mYjsKIAotICBpZiggaEZyZXEtPm5OZmIgPiBNQVhfTk9JU0VfQ09FRkZTICkgeworICBpZiAoaEZyZXEtPm5OZmIgPiBNQVhfTk9JU0VfQ09FRkZTKSB7CiAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CiAgIH0KIAogICAvKiBHZXQgbm9pc2UgYmFuZHMgKi8KLSAgc2JyZGVjRG93blNhbXBsZUxvUmVzKGhGcmVxLT5mcmVxQmFuZFRhYmxlTm9pc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBoRnJlcS0+bk5mYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGhGcmVxLT5mcmVxQmFuZFRhYmxlWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgbkJhbmRzTG8pOworICBzYnJkZWNEb3duU2FtcGxlTG9SZXMoaEZyZXEtPmZyZXFCYW5kVGFibGVOb2lzZSwgaEZyZXEtPm5OZmIsCisgICAgICAgICAgICAgICAgICAgICAgICBoRnJlcS0+ZnJlcUJhbmRUYWJsZVswXSwgbkJhbmRzTG8pOwogCisgIC8qIHNhdmUgb2xkIGhpZ2hiYW5kOyByZXF1aXJlZCBmb3Igb3ZlcmxhcCBpbiB1c2FjCisgICAgIHdoZW4gaGVhZGVyY2hhbmdlIG9jY3VycyBhdCBYVkFSIGFuZCBWQVJYIGZyYW1lOyAqLworICBoRnJlcS0+b3ZfaGlnaFN1YmJhbmQgPSBoRnJlcS0+aGlnaFN1YmJhbmQ7CiAKLQotCi0gIGhGcmVxLT5sb3dTdWJiYW5kICA9IGxzYjsKKyAgaEZyZXEtPmxvd1N1YmJhbmQgPSBsc2I7CiAgIGhGcmVxLT5oaWdoU3ViYmFuZCA9IHVzYjsKIAogICByZXR1cm4gU0JSREVDX09LOwpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9zYnJkZWNfZnJlcV9zY2EuaCBiL2xpYlNCUmRlYy9zcmMvc2JyZGVjX2ZyZXFfc2NhLmgKaW5kZXggY2ZlNGYwZS4uN2U2YjhlOCAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9zYnJkZWNfZnJlcV9zY2EuaAorKysgYi9saWJTQlJkZWMvc3JjL3NicmRlY19mcmVxX3NjYS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIyICs5MCwzMSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgICBGcmVxdWVuY3kgc2NhbGUgcHJvdG90eXBlcyAgCisgIFxicmllZiAgIEZyZXF1ZW5jeSBzY2FsZSBwcm90b3R5cGVzCiAqLwotI2lmbmRlZiBfX0ZSRVFfU0NBX0gKLSNkZWZpbmUgX19GUkVRX1NDQV9ICisjaWZuZGVmIFNCUkRFQ19GUkVRX1NDQV9ICisjZGVmaW5lIFNCUkRFQ19GUkVRX1NDQV9ICiAKICNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCiAjaW5jbHVkZSAiZW52X2V4dHIuaCIKIAotaW50Ci1zYnJkZWNVcGRhdGVGcmVxU2NhbGUoVUNIQVIgKiB2X2tfbWFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpudW1NYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoZWFkZXJEYXRhKTsKK3R5cGVkZWYgZW51bSB7IERVQUwsIFFVQUQgfSBTQlJfUkFURTsKKworU0JSX0VSUk9SCitzYnJkZWNVcGRhdGVGcmVxU2NhbGUoVUNIQVIgKnZfa19tYXN0ZXIsIFVDSEFSICpudW1NYXN0ZXIsIFVJTlQgZnMsCisgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoZWFkZXJEYXRhLCBVSU5UIGZsYWdzKTsKIAogdm9pZCBzYnJkZWNEb3duU2FtcGxlTG9SZXMoVUNIQVIgKnZfcmVzdWx0LCBVQ0hBUiBudW1fcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKmZyZXFCYW5kVGFibGVSZWYsIFVDSEFSIG51bV9SZWYpOwpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9zYnJkZWNvZGVyLmNwcCBiL2xpYlNCUmRlYy9zcmMvc2JyZGVjb2Rlci5jcHAKaW5kZXggZjlkZWQ1NC4uZTI0NTVkYSAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9zYnJkZWNvZGVyLmNwcAorKysgYi9saWJTQlJkZWMvc3JjL3NicmRlY29kZXIuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDM4ICs5MCw0OCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBkZWNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQogICBcYnJpZWYgIFNCUiBkZWNvZGVyIGZyb250ZW5kCi0gIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgZnJvbnRlbmQgdG8gdGhlIFNCUiBkZWNvZGVyLiBUaGUgZnVuY3Rpb24gb3BlblNCUigpIGlzIGNhbGxlZCBmb3IKLSAgaW5pdGlhbGl6YXRpb24uIFRoZSBmdW5jdGlvbiBzYnJEZWNvZGVyX0FwcGx5KCkgaXMgY2FsbGVkIGZvciBlYWNoIGZyYW1lLiBzYnJfQXBwbHkoKSB3aWxsIGNhbGwgdGhlCi0gIHJlcXVpcmVkIGZ1bmN0aW9ucyB0byBkZWNvZGUgdGhlIHJhdyBTQlIgZGF0YSAocHJvdmlkZWQgYnkgZW52X2V4dHIuY3BwKSwgdG8gZGVjb2RlIHRoZSBlbnZlbG9wZSBkYXRhIGFuZCBub2lzZSBmbG9vciBsZXZlbHMgW2RlY29kZVNickRhdGEoKV0sCi0gIGFuZCB0byBmaW5hbGx5IGFwcGx5IFNCUiB0byB0aGUgY3VycmVudCBmcmFtZSBbc2JyX2RlYygpXS4KKyAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBmcm9udGVuZCB0byB0aGUgU0JSIGRlY29kZXIuIFRoZSBmdW5jdGlvbiBvcGVuU0JSKCkgaXMKKyAgY2FsbGVkIGZvciBpbml0aWFsaXphdGlvbi4gVGhlIGZ1bmN0aW9uIHNickRlY29kZXJfQXBwbHkoKSBpcyBjYWxsZWQgZm9yIGVhY2gKKyAgZnJhbWUuIHNicl9BcHBseSgpIHdpbGwgY2FsbCB0aGUgcmVxdWlyZWQgZnVuY3Rpb25zIHRvIGRlY29kZSB0aGUgcmF3IFNCUiBkYXRhCisgIChwcm92aWRlZCBieSBlbnZfZXh0ci5jcHApLCB0byBkZWNvZGUgdGhlIGVudmVsb3BlIGRhdGEgYW5kIG5vaXNlIGZsb29yIGxldmVscworICBbZGVjb2RlU2JyRGF0YSgpXSwgYW5kIHRvIGZpbmFsbHkgYXBwbHkgU0JSIHRvIHRoZSBjdXJyZW50IGZyYW1lIFtzYnJfZGVjKCldLgogCiAgIFxzYSBzYnJEZWNvZGVyX0FwcGx5KCksIFxyZWYgZG9jdW1lbnRhdGlvbk92ZXJ2aWV3CiAqLwogCiAvKiEKLSAgXHBhZ2UgZG9jdW1lbnRhdGlvbk92ZXJ2aWV3IE92ZXJ2aWV3IG9mIGltcG9ydGFudCBpbmZvcm1hdGlvbiByZXNvdXJjZXMgYW5kIHNvdXJjZSBjb2RlIGRvY3VtZW50YXRpb24KKyAgXHBhZ2UgZG9jdW1lbnRhdGlvbk92ZXJ2aWV3IE92ZXJ2aWV3IG9mIGltcG9ydGFudCBpbmZvcm1hdGlvbiByZXNvdXJjZXMgYW5kCisgIHNvdXJjZSBjb2RlIGRvY3VtZW50YXRpb24KIAotICBUaGUgcHJpbWFyeSBzb3VyY2UgY29kZSBkb2N1bWVudGF0aW9uIGlzIGJhc2VkIG9uIGdlbmVyYXRlZCBhbmQgY3Jvc3MtcmVmZXJlbmNlZCBIVE1MIGZpbGVzIHVzaW5nCi0gIDxhIEhSRUY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmciPmRveHlnZW48L2E+LiBBcyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnRhdGlvbgotICB5b3UgY2FuIGZpbmQgbW9yZSBleHRlbnNpdmUgZGVzY3JpcHRpb25zIGFib3V0IGtleSBjb25jZXB0cyBhbmQgYWxnb3JpdGhtcyBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAgQXMgcGFydCBvZiB0aGlzIGRvY3VtZW50YXRpb24geW91IGNhbiBmaW5kIG1vcmUgZXh0ZW5zaXZlIGRlc2NyaXB0aW9ucyBhYm91dAorICBrZXkgY29uY2VwdHMgYW5kIGFsZ29yaXRobXMgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CiAKICAgPGgyPlByb2dyYW1taW5nPC9oMj4KIAogICBcbGkgQnVmZmVyIG1hbmFnZW1lbnQ6IHNickRlY29kZXJfQXBwbHkoKSBhbmQgc2JyX2RlYygpCi0gIFxsaSBJbnRlcm5hbCBzY2FsZSBmYWN0b3JzIHRvIG1heGltaXplIFNOUiBvbiBmaXhlZCBwb2ludCBwcm9jZXNzb3JzOiAjUU1GX1NDQUxFX0ZBQ1RPUgotICBcbGkgU3BlY2lhbCBtYW50aXNzYS1leHBvbmVudCBmb3JtYXQ6IENyZWF0ZWQgaW4gcmVxdWFudGl6ZUVudmVsb3BlRGF0YSgpIGFuZCB1c2VkIGluIGNhbGN1bGF0ZVNickVudmVsb3BlKCkKKyAgXGxpIEludGVybmFsIHNjYWxlIGZhY3RvcnMgdG8gbWF4aW1pemUgU05SIG9uIGZpeGVkIHBvaW50IHByb2Nlc3NvcnM6CisgICNRTUZfU0NBTEVfRkFDVE9SIFxsaSBTcGVjaWFsIG1hbnRpc3NhLWV4cG9uZW50IGZvcm1hdDogQ3JlYXRlZCBpbgorICByZXF1YW50aXplRW52ZWxvcGVEYXRhKCkgYW5kIHVzZWQgaW4gY2FsY3VsYXRlU2JyRW52ZWxvcGUoKQogCiAgIDxoMj5BbGdvcml0aG1pYyBkZXRhaWxzPC9oMj4KLSAgXGxpIEFib3V0IHRoZSBTQlIgZGF0YSBmb3JtYXQ6IFxyZWYgU0JSX0hFQURFUl9FTEVNRU5UIGFuZCBccmVmIFNCUl9TVEFOREFSRF9FTEVNRU5UCi0gIFxsaSBEZXRhaWxzIGFib3V0IHRoZSBiaXRzdHJlYW0gZGVjb2RlcjogZW52X2V4dHIuY3BwCi0gIFxsaSBEZXRhaWxzIGFib3V0IHRoZSBRTUYgZmlsdGVyYmFuayBhbmQgdGhlIHByb3ZpZGVkIHBvbHlwaGFzZSBpbXBsZW1lbnRhdGlvbjogcW1mX2RlYy5jcHAKLSAgXGxpIERldGFpbHMgYWJvdXQgdGhlIHRyYW5zcG9zZXI6IGxwcF90cmFuLmNwcAotICBcbGkgRGV0YWlscyBhYm91dCB0aGUgZW52ZWxvcGUgYWRqdXN0ZXI6IGVudl9jYWxjLmNwcAorICBcbGkgQWJvdXQgdGhlIFNCUiBkYXRhIGZvcm1hdDogXHJlZiBTQlJfSEVBREVSX0VMRU1FTlQgYW5kIFxyZWYKKyAgU0JSX1NUQU5EQVJEX0VMRU1FTlQgXGxpIERldGFpbHMgYWJvdXQgdGhlIGJpdHN0cmVhbSBkZWNvZGVyOiBlbnZfZXh0ci5jcHAgXGxpCisgIERldGFpbHMgYWJvdXQgdGhlIFFNRiBmaWx0ZXJiYW5rIGFuZCB0aGUgcHJvdmlkZWQgcG9seXBoYXNlIGltcGxlbWVudGF0aW9uOgorICBxbWZfZGVjLmNwcCBcbGkgRGV0YWlscyBhYm91dCB0aGUgdHJhbnNwb3NlcjogbHBwX3RyYW4uY3BwIFxsaSBEZXRhaWxzIGFib3V0CisgIHRoZSBlbnZlbG9wZSBhZGp1c3RlcjogZW52X2NhbGMuY3BwCiAKICovCiAKQEAgLTEzNCwxMSArMTU1LDEwIEBACiAKICNpbmNsdWRlICJwc2JpdGRlYy5oIgogCi0KIC8qIERlY29kZXIgbGlicmFyeSBpbmZvICovCi0jZGVmaW5lIFNCUkRFQ09ERVJfTElCX1ZMMCAyCi0jZGVmaW5lIFNCUkRFQ09ERVJfTElCX1ZMMSAyCi0jZGVmaW5lIFNCUkRFQ09ERVJfTElCX1ZMMiAxMgorI2RlZmluZSBTQlJERUNPREVSX0xJQl9WTDAgMworI2RlZmluZSBTQlJERUNPREVSX0xJQl9WTDEgMAorI2RlZmluZSBTQlJERUNPREVSX0xJQl9WTDIgMAogI2RlZmluZSBTQlJERUNPREVSX0xJQl9USVRMRSAiU0JSIERlY29kZXIiCiAjaWZkZWYgX19BTkRST0lEX18KICNkZWZpbmUgU0JSREVDT0RFUl9MSUJfQlVJTERfREFURSAiIgpAQCAtMTQ4LDIwICsxNjgsMjggQEAKICNkZWZpbmUgU0JSREVDT0RFUl9MSUJfQlVJTERfVElNRSBfX1RJTUVfXwogI2VuZGlmCiAKK3N0YXRpYyB2b2lkIHNldEZyYW1lRXJyb3JGbGFnKFNCUl9ERUNPREVSX0VMRU1FTlQgKnBTYnJFbGVtZW50LCBVQ0hBUiB2YWx1ZSkgeworICBpZiAocFNickVsZW1lbnQgIT0gTlVMTCkgeworICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgIGNhc2UgRlJBTUVfRVJST1JfQUxMU0xPVFM6CisgICAgICAgIEZES21lbXNldChwU2JyRWxlbWVudC0+ZnJhbWVFcnJvckZsYWcsIEZSQU1FX0VSUk9SLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBTYnJFbGVtZW50LT5mcmFtZUVycm9yRmxhZykpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHBTYnJFbGVtZW50LT5mcmFtZUVycm9yRmxhZ1twU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XSA9IHZhbHVlOworICAgIH0KKyAgfQorfQogCi0KLQotc3RhdGljIFVDSEFSIGdldEhlYWRlclNsb3QoIFVDSEFSIGN1cnJlbnRTbG90LCBVQ0hBUiBoZHJTbG90VXNhZ2VbKDEpKzFdICkKLXsKLSAgVUlOVCAgb2NjdXBpZWQgPSAwOwotICBpbnQgICBzOworc3RhdGljIFVDSEFSIGdldEhlYWRlclNsb3QoVUNIQVIgY3VycmVudFNsb3QsIFVDSEFSIGhkclNsb3RVc2FnZVsoMSkgKyAxXSkgeworICBVSU5UIG9jY3VwaWVkID0gMDsKKyAgaW50IHM7CiAgIFVDSEFSIHNsb3QgPSBoZHJTbG90VXNhZ2VbY3VycmVudFNsb3RdOwogCi0gIEZES19BU1NFUlQoKDEpKzEgPCAzMik7CisgIEZES19BU1NFUlQoKDEpICsgMSA8IDMyKTsKIAotICBmb3IgKHMgPSAwOyBzIDwgKDEpKzE7IHMrKykgewotICAgIGlmICggKGhkclNsb3RVc2FnZVtzXSA9PSBzbG90KQotICAgICAgJiYgKHMgIT0gc2xvdCkgKSB7CisgIGZvciAocyA9IDA7IHMgPCAoMSkgKyAxOyBzKyspIHsKKyAgICBpZiAoKGhkclNsb3RVc2FnZVtzXSA9PSBzbG90KSAmJiAocyAhPSBzbG90KSkgewogICAgICAgb2NjdXBpZWQgPSAxOwogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMTcwLDExICsxOTgsMTEgQEAKICAgaWYgKG9jY3VwaWVkKSB7CiAgICAgb2NjdXBpZWQgPSAwOwogCi0gICAgZm9yIChzID0gMDsgcyA8ICgxKSsxOyBzKyspIHsKKyAgICBmb3IgKHMgPSAwOyBzIDwgKDEpICsgMTsgcysrKSB7CiAgICAgICBvY2N1cGllZCB8PSAxIDw8IGhkclNsb3RVc2FnZVtzXTsKICAgICB9Ci0gICAgZm9yIChzID0gMDsgcyA8ICgxKSsxOyBzKyspIHsKLSAgICAgIGlmICggIShvY2N1cGllZCAmIDB4MSkgKSB7CisgICAgZm9yIChzID0gMDsgcyA8ICgxKSArIDE7IHMrKykgeworICAgICAgaWYgKCEob2NjdXBpZWQgJiAweDEpKSB7CiAgICAgICAgIHNsb3QgPSBzOwogICAgICAgICBicmVhazsKICAgICAgIH0KQEAgLTE4NSwxOCArMjEzLDE4IEBACiAgIHJldHVybiBzbG90OwogfQogCi1zdGF0aWMgdm9pZCBjb3B5U2JySGVhZGVyKCBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhEc3QsIGNvbnN0IEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaFNyYyApCi17CitzdGF0aWMgdm9pZCBjb3B5U2JySGVhZGVyKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSEFORExFX1NCUl9IRUFERVJfREFUQSBoU3JjKSB7CiAgIC8qIGNvcHkgdGhlIHdob2xlIGhlYWRlciBtZW1vcnkgKGluY2x1ZGluZyBwb2ludGVycykgKi8KLSAgRkRLbWVtY3B5KCBoRHN0LCBoU3JjLCBzaXplb2YoU0JSX0hFQURFUl9EQVRBKSApOworICBGREttZW1jcHkoaERzdCwgaFNyYywgc2l6ZW9mKFNCUl9IRUFERVJfREFUQSkpOwogCiAgIC8qIHVwZGF0ZSBwb2ludGVycyAqLwotICBoRHN0LT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZVswXSAgPSBoRHN0LT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZUxvOworICBoRHN0LT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZVswXSA9IGhEc3QtPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlTG87CiAgIGhEc3QtPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlWzFdID0gaERzdC0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVIaTsKIH0KIAotc3RhdGljIGludCBjb21wYXJlU2JySGVhZGVyKCBjb25zdCBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZHIxLCBjb25zdCBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZHIyICkKLXsKK3N0YXRpYyBpbnQgY29tcGFyZVNickhlYWRlcihjb25zdCBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhkcjIpIHsKICAgaW50IHJlc3VsdCA9IDA7CiAKICAgLyogY29tcGFyZSBiYXNpYyBkYXRhICovCkBAIC0yMDQsMjUgKzIzMiwzOCBAQAogICByZXN1bHQgfD0gKGhIZHIxLT5zdGF0dXMgIT0gaEhkcjItPnN0YXR1cykgPyAxIDogMDsKICAgcmVzdWx0IHw9IChoSGRyMS0+ZnJhbWVFcnJvckZsYWcgIT0gaEhkcjItPmZyYW1lRXJyb3JGbGFnKSA/IDEgOiAwOwogICByZXN1bHQgfD0gKGhIZHIxLT5udW1iZXJUaW1lU2xvdHMgIT0gaEhkcjItPm51bWJlclRpbWVTbG90cykgPyAxIDogMDsKLSAgcmVzdWx0IHw9IChoSGRyMS0+bnVtYmVyT2ZBbmFseXNpc0JhbmRzICE9IGhIZHIyLT5udW1iZXJPZkFuYWx5c2lzQmFuZHMpID8gMSA6IDA7CisgIHJlc3VsdCB8PQorICAgICAgKGhIZHIxLT5udW1iZXJPZkFuYWx5c2lzQmFuZHMgIT0gaEhkcjItPm51bWJlck9mQW5hbHlzaXNCYW5kcykgPyAxIDogMDsKICAgcmVzdWx0IHw9IChoSGRyMS0+dGltZVN0ZXAgIT0gaEhkcjItPnRpbWVTdGVwKSA/IDEgOiAwOwogICByZXN1bHQgfD0gKGhIZHIxLT5zYnJQcm9jU21wbFJhdGUgIT0gaEhkcjItPnNiclByb2NTbXBsUmF0ZSkgPyAxIDogMDsKIAogICAvKiBjb21wYXJlIGJpdHN0cmVhbSBkYXRhICovCi0gIHJlc3VsdCB8PSBGREttZW1jbXAoICZoSGRyMS0+YnNfZGF0YSwgJmhIZHIyLT5ic19kYXRhLCBzaXplb2YoU0JSX0hFQURFUl9EQVRBX0JTKSApOwotICByZXN1bHQgfD0gRkRLbWVtY21wKCAmaEhkcjEtPmJzX2luZm8sICZoSGRyMi0+YnNfaW5mbywgc2l6ZW9mKFNCUl9IRUFERVJfREFUQV9CU19JTkZPKSApOworICByZXN1bHQgfD0KKyAgICAgIEZES21lbWNtcCgmaEhkcjEtPmJzX2RhdGEsICZoSGRyMi0+YnNfZGF0YSwgc2l6ZW9mKFNCUl9IRUFERVJfREFUQV9CUykpOworICByZXN1bHQgfD0KKyAgICAgIEZES21lbWNtcCgmaEhkcjEtPmJzX2RmbHQsICZoSGRyMi0+YnNfZGZsdCwgc2l6ZW9mKFNCUl9IRUFERVJfREFUQV9CUykpOworICByZXN1bHQgfD0gRkRLbWVtY21wKCZoSGRyMS0+YnNfaW5mbywgJmhIZHIyLT5ic19pbmZvLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihTQlJfSEVBREVSX0RBVEFfQlNfSU5GTykpOwogCiAgIC8qIGNvbXBhcmUgZnJlcXVlbmN5IGJhbmQgZGF0YSAqLwotICByZXN1bHQgfD0gRkRLbWVtY21wKCAmaEhkcjEtPmZyZXFCYW5kRGF0YSwgJmhIZHIyLT5mcmVxQmFuZERhdGEsICg4K01BWF9OVU1fTElNSVRFUlMrMSkqc2l6ZW9mKFVDSEFSKSApOwotICByZXN1bHQgfD0gRkRLbWVtY21wKCBoSGRyMS0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVMbywgaEhkcjItPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlTG8sIChNQVhfRlJFUV9DT0VGRlMvMisxKSpzaXplb2YoVUNIQVIpICk7Ci0gIHJlc3VsdCB8PSBGREttZW1jbXAoIGhIZHIxLT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZUhpLCBoSGRyMi0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVIaSwgKE1BWF9GUkVRX0NPRUZGUysxKSpzaXplb2YoVUNIQVIpICk7Ci0gIHJlc3VsdCB8PSBGREttZW1jbXAoIGhIZHIxLT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZU5vaXNlLCBoSGRyMi0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVOb2lzZSwgKE1BWF9OT0lTRV9DT0VGRlMrMSkqc2l6ZW9mKFVDSEFSKSApOwotICByZXN1bHQgfD0gRkRLbWVtY21wKCBoSGRyMS0+ZnJlcUJhbmREYXRhLnZfa19tYXN0ZXIsIGhIZHIyLT5mcmVxQmFuZERhdGEudl9rX21hc3RlciwgKE1BWF9GUkVRX0NPRUZGUysxKSpzaXplb2YoVUNIQVIpICk7CisgIHJlc3VsdCB8PSBGREttZW1jbXAoJmhIZHIxLT5mcmVxQmFuZERhdGEsICZoSGRyMi0+ZnJlcUJhbmREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICg4ICsgTUFYX05VTV9MSU1JVEVSUyArIDEpICogc2l6ZW9mKFVDSEFSKSk7CisgIHJlc3VsdCB8PSBGREttZW1jbXAoaEhkcjEtPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlTG8sCisgICAgICAgICAgICAgICAgICAgICAgaEhkcjItPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlTG8sCisgICAgICAgICAgICAgICAgICAgICAgKE1BWF9GUkVRX0NPRUZGUyAvIDIgKyAxKSAqIHNpemVvZihVQ0hBUikpOworICByZXN1bHQgfD0gRkRLbWVtY21wKGhIZHIxLT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZUhpLAorICAgICAgICAgICAgICAgICAgICAgIGhIZHIyLT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZUhpLAorICAgICAgICAgICAgICAgICAgICAgIChNQVhfRlJFUV9DT0VGRlMgKyAxKSAqIHNpemVvZihVQ0hBUikpOworICByZXN1bHQgfD0gRkRLbWVtY21wKGhIZHIxLT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZU5vaXNlLAorICAgICAgICAgICAgICAgICAgICAgIGhIZHIyLT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZU5vaXNlLAorICAgICAgICAgICAgICAgICAgICAgIChNQVhfTk9JU0VfQ09FRkZTICsgMSkgKiBzaXplb2YoVUNIQVIpKTsKKyAgcmVzdWx0IHw9CisgICAgICBGREttZW1jbXAoaEhkcjEtPmZyZXFCYW5kRGF0YS52X2tfbWFzdGVyLCBoSGRyMi0+ZnJlcUJhbmREYXRhLnZfa19tYXN0ZXIsCisgICAgICAgICAgICAgICAgKE1BWF9GUkVRX0NPRUZGUyArIDEpICogc2l6ZW9mKFVDSEFSKSk7CiAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotCiAvKiEKICAgXGJyaWVmIFJlc2V0IFNCUiBkZWNvZGVyLgogCkBAIC0yMzEsNjAgKzI3Miw1NCBAQAogCiAgIFxyZXR1cm4gRXJyb3IgY29kZS4KICovCi1zdGF0aWMKLVNCUl9FUlJPUiBzYnJEZWNvZGVyX1Jlc2V0RWxlbWVudCAoCi0gICAgICAgIEhBTkRMRV9TQlJERUNPREVSICAgIHNlbGYsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGVJbiwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZU91dCwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbGVtZW50SUQsCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIGVsZW1lbnRJbmRleCwKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgb3ZlcmxhcAotICAgICAgICApCi17CitzdGF0aWMgU0JSX0VSUk9SIHNickRlY29kZXJfUmVzZXRFbGVtZW50KEhBTkRMRV9TQlJERUNPREVSIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVSYXRlSW4sIGludCBzYW1wbGVSYXRlT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbGVtZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBlbGVtZW50SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvdmVybGFwKSB7CiAgIFNCUl9FUlJPUiBzYnJFcnJvciA9IFNCUkRFQ19PSzsKICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoU2JySGVhZGVyOwogICBVSU5UIHFtZkZsYWdzID0gMDsKIAogICBpbnQgaSwgc3luRG93bnNhbXBsZUZhYzsKIAorICAvKiBVU0FDOiBhc3N1bWluZyB0aGVvcmV0aWNhbCBjYXNlIDgga0h6IG91dHB1dCBzYW1wbGUgcmF0ZSB3aXRoIDQ6MSBTQlIgKi8KKyAgY29uc3QgaW50IHNicl9taW5fc2FtcGxlX3JhdGVfaW4gPSBJU19VU0FDKHNlbGYtPmNvcmVDb2RlYykgPyAyMDAwIDogNjQwMDsKKwogICAvKiBDaGVjayBpbi9vdXQgc2FtcGxlcmF0ZXMgKi8KLSAgaWYgKCBzYW1wbGVSYXRlSW4gPCA2NDAwCi0gICAgfHwgc2FtcGxlUmF0ZUluID4gNDgwMDAKLSAgICAgKQotICB7CisgIGlmIChzYW1wbGVSYXRlSW4gPCBzYnJfbWluX3NhbXBsZV9yYXRlX2luIHx8IHNhbXBsZVJhdGVJbiA+ICg5NjAwMCkpIHsKICAgICBzYnJFcnJvciA9IFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CiAgICAgZ290byBiYWlsOwogICB9CiAKLSAgaWYgKCBzYW1wbGVSYXRlT3V0ID4gOTYwMDAgKQotICB7CisgIGlmIChzYW1wbGVSYXRlT3V0ID4gKDk2MDAwKSkgewogICAgIHNickVycm9yID0gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKICAgICBnb3RvIGJhaWw7CiAgIH0KIAogICAvKiBTZXQgUU1GIG1vZGUgZmxhZ3MgKi8KLSAgaWYgKHNlbGYtPmZsYWdzICYgU0JSREVDX0xPV19QT1dFUikKLSAgICBxbWZGbGFncyB8PSBRTUZfRkxBR19MUDsKKyAgaWYgKHNlbGYtPmZsYWdzICYgU0JSREVDX0xPV19QT1dFUikgcW1mRmxhZ3MgfD0gUU1GX0ZMQUdfTFA7CiAKICAgaWYgKHNlbGYtPmNvcmVDb2RlYyA9PSBBT1RfRVJfQUFDX0VMRCkgewogICAgIGlmIChzZWxmLT5mbGFncyAmIFNCUkRFQ19MRF9NUFNfUU1GKSB7Ci0gICAgICBxbWZGbGFncyB8PSAgUU1GX0ZMQUdfTVBTTERGQjsKKyAgICAgIHFtZkZsYWdzIHw9IFFNRl9GTEFHX01QU0xERkI7CiAgICAgfSBlbHNlIHsKLSAgICAgIHFtZkZsYWdzIHw9ICBRTUZfRkxBR19DTERGQjsKKyAgICAgIHFtZkZsYWdzIHw9IFFNRl9GTEFHX0NMREZCOwogICAgIH0KICAgfQogCiAgIC8qIFNldCBkb3duc2FtcGxpbmcgZmFjdG9yIGZvciBzeW50aGVzaXMgZmlsdGVyIGJhbmsgKi8KLSAgaWYgKHNhbXBsZVJhdGVPdXQgPT0gMCkKLSAgeworICBpZiAoc2FtcGxlUmF0ZU91dCA9PSAwKSB7CiAgICAgLyogbm8gc2luZ2xlIHJhdGUgbW9kZSAqLwotICAgICAgc2FtcGxlUmF0ZU91dCA9IHNhbXBsZVJhdGVJbjw8MTsgLyogSW4gY2FzZSBvZiBpbXBsaWNpdCBzaWduYWxsaW5nLCBhc3N1bWUgZHVhbCByYXRlIFNCUiAqLworICAgIHNhbXBsZVJhdGVPdXQgPQorICAgICAgICBzYW1wbGVSYXRlSW4KKyAgICAgICAgPDwgMTsgLyogSW4gY2FzZSBvZiBpbXBsaWNpdCBzaWduYWxsaW5nLCBhc3N1bWUgZHVhbCByYXRlIFNCUiAqLwogICB9CiAKLSAgaWYgKCBzYW1wbGVSYXRlSW4gPT0gc2FtcGxlUmF0ZU91dCApIHsKKyAgaWYgKHNhbXBsZVJhdGVJbiA9PSBzYW1wbGVSYXRlT3V0KSB7CiAgICAgc3luRG93bnNhbXBsZUZhYyA9IDI7Ci0gICAgc2VsZi0+ZmxhZ3MgfD0gIFNCUkRFQ19ET1dOU0FNUExFOworICAgIHNlbGYtPmZsYWdzIHw9IFNCUkRFQ19ET1dOU0FNUExFOwogICB9IGVsc2UgewogICAgIHN5bkRvd25zYW1wbGVGYWMgPSAxOwogICAgIHNlbGYtPmZsYWdzICY9IH5TQlJERUNfRE9XTlNBTVBMRTsKQEAgLTI5NCwyMCArMzI5LDIzIEBACiAgIHNlbGYtPnNhbXBsZVJhdGVPdXQgPSBzYW1wbGVSYXRlT3V0OwogCiAgIHsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAoMSkrMTsgaSsrKQotICAgIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKDEpICsgMTsgaSsrKSB7CisgICAgICBpbnQgc2V0RGZsdDsKICAgICAgIGhTYnJIZWFkZXIgPSAmKHNlbGYtPnNickhlYWRlcltlbGVtZW50SW5kZXhdW2ldKTsKKyAgICAgIHNldERmbHQgPSAoKGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9PSBTQlJfTk9UX0lOSVRJQUxJWkVEKSB8fAorICAgICAgICAgICAgICAgICAoc2VsZi0+ZmxhZ3MgJiBTQlJERUNfRk9SQ0VfUkVTRVQpKQorICAgICAgICAgICAgICAgICAgICA/IDEKKyAgICAgICAgICAgICAgICAgICAgOiAwOwogCiAgICAgICAvKiBpbml0IGEgZGVmYXVsdCBoZWFkZXIgc3VjaCB0aGF0IHdlIGNhbiBhdCBsZWFzdCBkbyB1cHNhbXBsaW5nIGxhdGVyICovCi0gICAgICBzYnJFcnJvciA9IGluaXRIZWFkZXJEYXRhKAotICAgICAgICAgICAgICBoU2JySGVhZGVyLAotICAgICAgICAgICAgICBzYW1wbGVSYXRlSW4sCi0gICAgICAgICAgICAgIHNhbXBsZVJhdGVPdXQsCi0gICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3MKLSAgICAgICAgICAgICAgKTsKKyAgICAgIHNickVycm9yID0gaW5pdEhlYWRlckRhdGEoaFNickhlYWRlciwgc2FtcGxlUmF0ZUluLCBzYW1wbGVSYXRlT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5kb3duc2NhbGVGYWN0b3IsIHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3MsIHNldERmbHQpOworCisgICAgICAvKiBTZXQgc3luY2hTdGF0ZSB0byBVUFNBTVBMSU5HIGluIGNhc2UgaXQgYWxyZWFkeSBpcyBpbml0aWFsaXplZCAqLworICAgICAgaFNickhlYWRlci0+c3luY1N0YXRlID0gaFNickhlYWRlci0+c3luY1N0YXRlID4gVVBTQU1QTElORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gVVBTQU1QTElORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaFNickhlYWRlci0+c3luY1N0YXRlOwogICAgIH0KICAgfQogCkBAIC0zMTUsMjEgKzM1MywzOCBAQAogICAgIGdvdG8gYmFpbDsKICAgfQogCisgIGlmICghc2VsZi0+cFFtZkRvbWFpbi0+Z2xvYmFsQ29uZi5xbWZEb21haW5FeHBsaWNpdENvbmZpZykgeworICAgIHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYuZmxhZ3NfcmVxdWVzdGVkIHw9IHFtZkZsYWdzOworICAgIHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYubkJhbmRzQW5hbHlzaXNfcmVxdWVzdGVkID0KKyAgICAgICAgc2VsZi0+c2JySGVhZGVyW2VsZW1lbnRJbmRleF1bMF0ubnVtYmVyT2ZBbmFseXNpc0JhbmRzOworICAgIHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYubkJhbmRzU3ludGhlc2lzX3JlcXVlc3RlZCA9CisgICAgICAgIChzeW5Eb3duc2FtcGxlRmFjID09IDEpID8gNjQgOiAzMjsgLyogbWF5IGJlIG92ZXJ3cml0dGVuIGJ5IE1QUyAqLworICAgIHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYubkJhbmRzU3ludGhlc2lzX3JlcXVlc3RlZCAvPQorICAgICAgICBzZWxmLT5kb3duc2NhbGVGYWN0b3I7CisgICAgc2VsZi0+cFFtZkRvbWFpbi0+Z2xvYmFsQ29uZi5uUW1mVGltZVNsb3RzX3JlcXVlc3RlZCA9CisgICAgICAgIHNlbGYtPnNickhlYWRlcltlbGVtZW50SW5kZXhdWzBdLm51bWJlclRpbWVTbG90cyAqCisgICAgICAgIHNlbGYtPnNickhlYWRlcltlbGVtZW50SW5kZXhdWzBdLnRpbWVTdGVwOworICAgIHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYublFtZk92VGltZVNsb3RzX3JlcXVlc3RlZCA9IG92ZXJsYXA7CisgICAgc2VsZi0+cFFtZkRvbWFpbi0+Z2xvYmFsQ29uZi5uUW1mUHJvY0JhbmRzX3JlcXVlc3RlZCA9IDY0OyAvKiBhbHdheXMgNjQgKi8KKyAgICBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5RbWZQcm9jQ2hhbm5lbHNfcmVxdWVzdGVkID0KKyAgICAgICAgMTsgLyogbWF5IGJlIG92ZXJ3cml0dGVuIGJ5IE1QUyAqLworICB9CisKICAgLyogSW5pdCBTQlIgY2hhbm5lbHMgZ29pbmcgdG8gYmUgYXNzaWduZWQgdG8gYSBTQlIgZWxlbWVudCAqLwogICB7CiAgICAgaW50IGNoOworICAgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPm5DaGFubmVsczsgY2grKykgeworICAgICAgaW50IGhlYWRlckluZGV4ID0KKyAgICAgICAgICBnZXRIZWFkZXJTbG90KHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnVzZUZyYW1lU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnVzZUhlYWRlclNsb3QpOwogCi0gICAgZm9yIChjaD0wOyBjaDxzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5uQ2hhbm5lbHM7IGNoKyspCi0gICAgewogICAgICAgLyogYW5kIGNyZWF0ZSBzYnJEZWMgKi8KLSAgICAgIHNickVycm9yID0gY3JlYXRlU2JyRGVjIChzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFtjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJIZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnRyYW5zcG9zZXJTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3luRG93bnNhbXBsZUZhYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcW1mRmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjaCApOworICAgICAgc2JyRXJyb3IgPQorICAgICAgICAgIGNyZWF0ZVNickRlYyhzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5zYnJIZWFkZXJbZWxlbWVudEluZGV4XVtoZWFkZXJJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT50cmFuc3Bvc2VyU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIHN5bkRvd25zYW1wbGVGYWMsIHFtZkZsYWdzLCBzZWxmLT5mbGFncywgb3ZlcmxhcCwgY2gsCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmNvZGVjRnJhbWVTaXplKTsKIAogICAgICAgaWYgKHNickVycm9yICE9IFNCUkRFQ19PSykgewogICAgICAgICBnb3RvIGJhaWw7CkBAIC0zMzcsMjggKzM5MiwyOSBAQAogICAgIH0KICAgfQogCi0gIC8vRkRLbWVtY2xlYXIoc2JyX092ZXJsYXBCdWZmZXIsIHNpemVvZihzYnJfT3ZlcmxhcEJ1ZmZlcikpOworICAvLyBGREttZW1jbGVhcihzYnJfT3ZlcmxhcEJ1ZmZlciwgc2l6ZW9mKHNicl9PdmVybGFwQnVmZmVyKSk7CiAKICAgaWYgKHNlbGYtPm51bVNickVsZW1lbnRzID09IDEpIHsKLSAgICBzd2l0Y2ggKCBzZWxmLT5jb3JlQ29kZWMgKSB7Ci0gICAgY2FzZSBBT1RfQUFDX0xDOgotICAgIGNhc2UgQU9UX1NCUjoKLSAgICBjYXNlIEFPVF9QUzoKLSAgICBjYXNlIEFPVF9FUl9BQUNfU0NBTDoKLSAgICBjYXNlIEFPVF9EUk1fQUFDOgotICAgICAgaWYgKENyZWF0ZVBzRGVjICggJnNlbGYtPmhQYXJhbWV0cmljU3RlcmVvRGVjLCBzYW1wbGVzUGVyRnJhbWUgKSkgewotICAgICAgICBzYnJFcnJvciA9IFNCUkRFQ19DUkVBVEVfRVJST1I7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKKyAgICBzd2l0Y2ggKHNlbGYtPmNvcmVDb2RlYykgeworICAgICAgY2FzZSBBT1RfQUFDX0xDOgorICAgICAgY2FzZSBBT1RfU0JSOgorICAgICAgY2FzZSBBT1RfUFM6CisgICAgICBjYXNlIEFPVF9FUl9BQUNfU0NBTDoKKyAgICAgIGNhc2UgQU9UX0RSTV9BQUM6CisgICAgICBjYXNlIEFPVF9EUk1fU1VSUk9VTkQ6CisgICAgICAgIGlmIChDcmVhdGVQc0RlYygmc2VsZi0+aFBhcmFtZXRyaWNTdGVyZW9EZWMsIHNhbXBsZXNQZXJGcmFtZSkpIHsKKyAgICAgICAgICBzYnJFcnJvciA9IFNCUkRFQ19DUkVBVEVfRVJST1I7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAKICAgLyogSW5pdCBmcmFtZSBkZWxheSBzbG90IGhhbmRsaW5nICovCiAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnVzZUZyYW1lU2xvdCA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCAoKDEpKzEpOyBpKyspIHsKKyAgZm9yIChpID0gMDsgaSA8ICgoMSkgKyAxKTsgaSsrKSB7CiAgICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+dXNlSGVhZGVyU2xvdFtpXSA9IGk7CiAgIH0KIApAQCAtMzY3LDExICs0MjMsMzcgQEAKICAgcmV0dXJuIHNickVycm9yOwogfQogCisvKiEKKyAgXGJyaWVmIEFzc2lnbiBRTUYgZG9tYWluIHByb3ZpZGVkIFFNRiBjaGFubmVscyB0byBTQlIgY2hhbm5lbHMuCiAKLVNCUl9FUlJPUiBzYnJEZWNvZGVyX09wZW4gKCBIQU5ETEVfU0JSREVDT0RFUiAgKiBwU2VsZiApCi17Ci0gIEhBTkRMRV9TQlJERUNPREVSICAgIHNlbGYgPSBOVUxMOworICBccmV0dXJuIHZvaWQKKyovCitzdGF0aWMgdm9pZCBzYnJEZWNvZGVyX0Fzc2lnblFtZkNoYW5uZWxzMlNickNoYW5uZWxzKEhBTkRMRV9TQlJERUNPREVSIHNlbGYpIHsKKyAgaW50IGNoLCBlbCwgYWJzQ2hfb2Zmc2V0ID0gMDsKKyAgZm9yIChlbCA9IDA7IGVsIDwgc2VsZi0+bnVtU2JyRWxlbWVudHM7IGVsKyspIHsKKyAgICBpZiAoc2VsZi0+cFNickVsZW1lbnRbZWxdICE9IE5VTEwpIHsKKyAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHNlbGYtPnBTYnJFbGVtZW50W2VsXS0+bkNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIEZES19BU1NFUlQoKChhYnNDaF9vZmZzZXQgKyBjaCkgPCAoKDgpICsgKDEpKSkgJiYKKyAgICAgICAgICAgICAgICAgICAoKGFic0NoX29mZnNldCArIGNoKSA8ICgoOCkgKyAoMSkpKSk7CisgICAgICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsXS0+cFNickNoYW5uZWxbY2hdLT5TYnJEZWMucW1mRG9tYWluSW5DaCA9CisgICAgICAgICAgICAmc2VsZi0+cFFtZkRvbWFpbi0+UW1mRG9tYWluSW5bYWJzQ2hfb2Zmc2V0ICsgY2hdOworICAgICAgICBzZWxmLT5wU2JyRWxlbWVudFtlbF0tPnBTYnJDaGFubmVsW2NoXS0+U2JyRGVjLnFtZkRvbWFpbk91dENoID0KKyAgICAgICAgICAgICZzZWxmLT5wUW1mRG9tYWluLT5RbWZEb21haW5PdXRbYWJzQ2hfb2Zmc2V0ICsgY2hdOworICAgICAgfQorICAgICAgYWJzQ2hfb2Zmc2V0ICs9IHNlbGYtPnBTYnJFbGVtZW50W2VsXS0+bkNoYW5uZWxzOworICAgIH0KKyAgfQorfQorCitTQlJfRVJST1Igc2JyRGVjb2Rlcl9PcGVuKEhBTkRMRV9TQlJERUNPREVSICpwU2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19RTUZfRE9NQUlOIHBRbWZEb21haW4pIHsKKyAgSEFORExFX1NCUkRFQ09ERVIgc2VsZiA9IE5VTEw7CiAgIFNCUl9FUlJPUiBzYnJFcnJvciA9IFNCUkRFQ19PSzsKKyAgaW50IGVsSWR4OworCisgIGlmICgocFNlbGYgPT0gTlVMTCkgfHwgKHBRbWZEb21haW4gPT0gTlVMTCkpIHsKKyAgICByZXR1cm4gU0JSREVDX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KIAogICAvKiBHZXQgbWVtb3J5IGZvciB0aGlzIGluc3RhbmNlICovCiAgIHNlbGYgPSBHZXRSYW1fU2JyRGVjb2RlcigpOwpAQCAtMzgwLDE1ICs0NjIsNyBAQAogICAgIGdvdG8gYmFpbDsKICAgfQogCi0gIHNlbGYtPndvcmtCdWZmZXIxID0gR2V0UmFtX1NickRlY1dvcmtCdWZmZXIxKCk7Ci0gIHNlbGYtPndvcmtCdWZmZXIyID0gR2V0UmFtX1NickRlY1dvcmtCdWZmZXIyKCk7Ci0KLSAgaWYgKCAgc2VsZi0+d29ya0J1ZmZlcjEgPT0gTlVMTAotICAgICB8fCBzZWxmLT53b3JrQnVmZmVyMiA9PSBOVUxMICkKLSAgewotICAgIHNickVycm9yID0gU0JSREVDX01FTV9BTExPQ19GQUlMRUQ7Ci0gICAgZ290byBiYWlsOwotICB9CisgIHNlbGYtPnBRbWZEb21haW4gPSBwUW1mRG9tYWluOwogCiAgIC8qCiAgIEFscmVhZHkgemVybyBiZWNhdXNlIG9mIGNhbGxvYwpAQCAtMzk3LDcgKzQ3MSwxNSBAQAogICBzZWxmLT5jb2RlY0ZyYW1lU2l6ZSA9IDA7CiAgICovCiAKLSAgc2VsZi0+bnVtRGVsYXlGcmFtZXMgPSAoMSk7ICAvKiBzZXQgdG8gdGhlIG1heCB2YWx1ZSBieSBkZWZhdWx0ICovCisgIHNlbGYtPm51bURlbGF5RnJhbWVzID0gKDEpOyAvKiBzZXQgdG8gdGhlIG1heCB2YWx1ZSBieSBkZWZhdWx0ICovCisKKyAgLyogSW5pdGlhbGl6ZSBoZWFkZXIgc3luYyBzdGF0ZSAqLworICBmb3IgKGVsSWR4ID0gMDsgZWxJZHggPCAoOCk7IGVsSWR4ICs9IDEpIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKDEpICsgMTsgaSArPSAxKSB7CisgICAgICBzZWxmLT5zYnJIZWFkZXJbZWxJZHhdW2ldLnN5bmNTdGF0ZSA9IFNCUl9OT1RfSU5JVElBTElaRUQ7CisgICAgfQorICB9CiAKICAgKnBTZWxmID0gc2VsZjsKIApAQCAtNDEwLDkgKzQ5Miw3IEBACiAgKiBccGFyYW0gY29yZUNvZGVjIGNvcmUgY29kZWMgYXVkaW8gb2JqZWN0IHR5cGUuCiAgKiBccmV0dXJuIDEgaWYgU0JSIGNhbiBiZSBwcm9jZXNzZWQsIDAgaWYgU0JSIGNhbm5vdCBiZSBwcm9jZXNzZWQvYXBwbGllZC4KICAqLwotc3RhdGljCi1pbnQgc2JyRGVjb2Rlcl9pc0NvcmVDb2RlY1ZhbGlkKEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYykKLXsKK3N0YXRpYyBpbnQgc2JyRGVjb2Rlcl9pc0NvcmVDb2RlY1ZhbGlkKEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYykgewogICBzd2l0Y2ggKGNvcmVDb2RlYykgewogICAgIGNhc2UgQU9UX0FBQ19MQzoKICAgICBjYXNlIEFPVF9TQlI6CkBAIC00MjAsODAgKzUwMCwxMDkgQEAKICAgICBjYXNlIEFPVF9FUl9BQUNfU0NBTDoKICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgogICAgIGNhc2UgQU9UX0RSTV9BQUM6CisgICAgY2FzZSBBT1RfRFJNX1NVUlJPVU5EOgorICAgIGNhc2UgQU9UX1VTQUM6CiAgICAgICByZXR1cm4gMTsKICAgICBkZWZhdWx0OgogICAgICAgcmV0dXJuIDA7CiAgIH0KIH0KIAotc3RhdGljCi12b2lkIHNickRlY29kZXJfRGVzdHJveUVsZW1lbnQgKAotICAgICAgICBIQU5ETEVfU0JSREVDT0RFUiAgICAgICBzZWxmLAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBlbGVtZW50SW5kZXgKLSAgICAgICAgKQoteworc3RhdGljIHZvaWQgc2JyRGVjb2Rlcl9EZXN0cm95RWxlbWVudChIQU5ETEVfU0JSREVDT0RFUiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZWxlbWVudEluZGV4KSB7CiAgIGlmIChzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdICE9IE5VTEwpIHsKICAgICBpbnQgY2g7CiAKLSAgICBmb3IgKGNoPTA7IGNoPFNCUkRFQ19NQVhfQ0hfUEVSX0VMRU1FTlQ7IGNoKyspIHsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBTQlJERUNfTUFYX0NIX1BFUl9FTEVNRU5UOyBjaCsrKSB7CiAgICAgICBpZiAoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbY2hdICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlU2JyRGVjKCBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFtjaF0gKTsKLSAgICAgICAgRnJlZVJhbV9TYnJEZWNDaGFubmVsKCAmc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbY2hdICk7CisgICAgICAgIGRlbGV0ZVNickRlYyhzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFtjaF0pOworICAgICAgICBGcmVlUmFtX1NickRlY0NoYW5uZWwoCisgICAgICAgICAgICAmc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbY2hdKTsKICAgICAgICAgc2VsZi0+bnVtU2JyQ2hhbm5lbHMgLT0gMTsKICAgICAgIH0KICAgICB9Ci0gICAgRnJlZVJhbV9TYnJEZWNFbGVtZW50KCAmc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XSApOworICAgIEZyZWVSYW1fU2JyRGVjRWxlbWVudCgmc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XSk7CiAgICAgc2VsZi0+bnVtU2JyRWxlbWVudHMgLT0gMTsKICAgfQogfQogCi0KLVNCUl9FUlJPUiBzYnJEZWNvZGVyX0luaXRFbGVtZW50ICgKLSAgICAgICAgSEFORExFX1NCUkRFQ09ERVIgICAgICAgc2VsZiwKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgc2FtcGxlUmF0ZUluLAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVSYXRlT3V0LAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKLSAgICAgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgICAgZWxlbWVudElELAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBlbGVtZW50SW5kZXgKLSAgICAgICAgKQoteworU0JSX0VSUk9SIHNickRlY29kZXJfSW5pdEVsZW1lbnQoCisgICAgSEFORExFX1NCUkRFQ09ERVIgc2VsZiwgY29uc3QgaW50IHNhbXBsZVJhdGVJbiwgY29uc3QgaW50IHNhbXBsZVJhdGVPdXQsCisgICAgY29uc3QgaW50IHNhbXBsZXNQZXJGcmFtZSwgY29uc3QgQVVESU9fT0JKRUNUX1RZUEUgY29yZUNvZGVjLAorICAgIGNvbnN0IE1QNF9FTEVNRU5UX0lEIGVsZW1lbnRJRCwgY29uc3QgaW50IGVsZW1lbnRJbmRleCwKKyAgICBjb25zdCBVQ0hBUiBoYXJtb25pY1NCUiwgY29uc3QgVUNIQVIgc3RlcmVvQ29uZmlnSW5kZXgsCisgICAgY29uc3QgVUNIQVIgY29uZmlnTW9kZSwgVUNIQVIgKmNvbmZpZ0NoYW5nZWQsIGNvbnN0IElOVCBkb3duc2NhbGVGYWN0b3IpIHsKICAgU0JSX0VSUk9SIHNickVycm9yID0gU0JSREVDX09LOwotICBpbnQgY2hDbnQ9MDsKLSAgaW50IG5TYnJFbGVtZW50c1N0YXJ0ID0gc2VsZi0+bnVtU2JyRWxlbWVudHM7CisgIGludCBjaENudCA9IDA7CisgIGludCBuU2JyRWxlbWVudHNTdGFydDsKKyAgaW50IG5TYnJDaGFubmVsc1N0YXJ0OworICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFNCUkRFQ19JTlZBTElEX0FSR1VNRU5UOworICB9CisKKyAgblNickVsZW1lbnRzU3RhcnQgPSBzZWxmLT5udW1TYnJFbGVtZW50czsKKyAgblNickNoYW5uZWxzU3RhcnQgPSBzZWxmLT5udW1TYnJDaGFubmVsczsKIAogICAvKiBDaGVjayBjb3JlIGNvZGVjIEFPVCAqLwotICBpZiAoISBzYnJEZWNvZGVyX2lzQ29yZUNvZGVjVmFsaWQoY29yZUNvZGVjKSB8fCBlbGVtZW50SW5kZXggPj0gKDgpKSB7CisgIGlmICghc2JyRGVjb2Rlcl9pc0NvcmVDb2RlY1ZhbGlkKGNvcmVDb2RlYykgfHwgZWxlbWVudEluZGV4ID49ICg4KSkgewogICAgIHNickVycm9yID0gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKICAgICBnb3RvIGJhaWw7CiAgIH0KIAotICBpZiAoIGVsZW1lbnRJRCAhPSBJRF9TQ0UgJiYgZWxlbWVudElEICE9IElEX0NQRSAmJiBlbGVtZW50SUQgIT0gSURfTEZFICkKLSAgeworICBpZiAoZWxlbWVudElEICE9IElEX1NDRSAmJiBlbGVtZW50SUQgIT0gSURfQ1BFICYmIGVsZW1lbnRJRCAhPSBJRF9MRkUpIHsKICAgICBzYnJFcnJvciA9IFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CiAgICAgZ290byBiYWlsOwogICB9CiAKLSAgaWYgKCAgc2VsZi0+c2FtcGxlUmF0ZUluID09IHNhbXBsZVJhdGVJbgotICAgICAmJiBzZWxmLT5jb2RlY0ZyYW1lU2l6ZSA9PSBzYW1wbGVzUGVyRnJhbWUKLSAgICAgJiYgc2VsZi0+Y29yZUNvZGVjID09IGNvcmVDb2RlYwotICAgICAmJiBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdICE9IE5VTEwKLSAgICAgJiYgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+ZWxlbWVudElEID09IGVsZW1lbnRJRAotICAgICAmJiAhKHNlbGYtPmZsYWdzICYgU0JSREVDX0ZPUkNFX1JFU0VUKQotICAgICApCi0gIHsKLSAgICAgLyogTm90aGluZyB0byBkbyAqLwotICAgICByZXR1cm4gU0JSREVDX09LOworICBpZiAoc2VsZi0+c2FtcGxlUmF0ZUluID09IHNhbXBsZVJhdGVJbiAmJgorICAgICAgc2VsZi0+Y29kZWNGcmFtZVNpemUgPT0gc2FtcGxlc1BlckZyYW1lICYmIHNlbGYtPmNvcmVDb2RlYyA9PSBjb3JlQ29kZWMgJiYKKyAgICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0gIT0gTlVMTCAmJgorICAgICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+ZWxlbWVudElEID09IGVsZW1lbnRJRCAmJgorICAgICAgIShzZWxmLT5mbGFncyAmIFNCUkRFQ19GT1JDRV9SRVNFVCkgJiYKKyAgICAgICgoc2FtcGxlUmF0ZU91dCA9PSAwKSA/IDEgOiAoc2VsZi0+c2FtcGxlUmF0ZU91dCA9PSBzYW1wbGVSYXRlT3V0KSkgJiYKKyAgICAgICgoaGFybW9uaWNTQlIgPT0gMikgPyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHNlbGYtPmhhcm1vbmljU0JSID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcm1vbmljU0JSKSkgLyogVGhlIHZhbHVlIDIgc2lnbmFsaXplcyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFybW9uaWNTQlIgc2hhbGwgYmUgaWdub3JlZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWcgY2hhbmdlIGRldGVjdGlvbiAqLworICApIHsKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgcmV0dXJuIFNCUkRFQ19PSzsKKyAgfSBlbHNlIHsKKyAgICBpZiAoY29uZmlnTW9kZSAmIEFDX0NNX0RFVF9DRkdfQ0hBTkdFKSB7CisgICAgICAqY29uZmlnQ2hhbmdlZCA9IDE7CisgICAgfQorICB9CisKKyAgLyogcmVhY2hpbmcgdGhpcyBwb2ludCB0aGUgU0JSLWRlY29kZXIgZ2V0cyAocmUtKWNvbmZpZ3VyZWQgKi8KKworICAvKiBUaGUgZmxhZ3MgZmllbGQgaXMgdXNlZCBmb3IgYWxsIGVsZW1lbnRzISAqLworICBzZWxmLT5mbGFncyAmPQorICAgICAgKFNCUkRFQ19GT1JDRV9SRVNFVCB8IFNCUkRFQ19GTFVTSCk7IC8qIEtlZXAgdGhlIGdsb2JhbCBmbGFncy4gVGhleSB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcmVzZXQgYWZ0ZXIgZGVjb2RpbmcuICovCisgIHNlbGYtPmZsYWdzIHw9IChkb3duc2NhbGVGYWN0b3IgPiAxKSA/IFNCUkRFQ19FTERfRE9XTlNDQUxFIDogMDsKKyAgc2VsZi0+ZmxhZ3MgfD0gKGNvcmVDb2RlYyA9PSBBT1RfRVJfQUFDX0VMRCkgPyBTQlJERUNfRUxEX0dSSUQgOiAwOworICBzZWxmLT5mbGFncyB8PSAoY29yZUNvZGVjID09IEFPVF9FUl9BQUNfU0NBTCkgPyBTQlJERUNfU1lOVEFYX1NDQUwgOiAwOworICBzZWxmLT5mbGFncyB8PQorICAgICAgKGNvcmVDb2RlYyA9PSBBT1RfRFJNX0FBQykgPyBTQlJERUNfU1lOVEFYX1NDQUwgfCBTQlJERUNfU1lOVEFYX0RSTSA6IDA7CisgIHNlbGYtPmZsYWdzIHw9IChjb3JlQ29kZWMgPT0gQU9UX0RSTV9TVVJST1VORCkKKyAgICAgICAgICAgICAgICAgICAgID8gU0JSREVDX1NZTlRBWF9TQ0FMIHwgU0JSREVDX1NZTlRBWF9EUk0KKyAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgc2VsZi0+ZmxhZ3MgfD0gKGNvcmVDb2RlYyA9PSBBT1RfVVNBQykgPyBTQlJERUNfU1lOVEFYX1VTQUMgOiAwOworICAvKiBSb2J1c3RuZXNzOiBUYWtlIGludGVnZXIgZGl2aXNpb24gcm91bmRpbmcgaW50byBjb25zaWRlcmF0aW9uLiBFLmcuIDIyMDUwCisgICAqIEh6IHdpdGggNDoxIFNCUiA9PiA1NTEyIEh6IGNvcmUgc2FtcGxpbmcgcmF0ZS4gKi8KKyAgc2VsZi0+ZmxhZ3MgfD0gKHNhbXBsZVJhdGVJbiA9PSBzYW1wbGVSYXRlT3V0IC8gNCkgPyBTQlJERUNfUVVBRF9SQVRFIDogMDsKKyAgc2VsZi0+ZmxhZ3MgfD0gKGhhcm1vbmljU0JSID09IDEpID8gU0JSREVDX1VTQUNfSEFSTU9OSUNTQlIgOiAwOworCisgIGlmIChjb25maWdNb2RlICYgQUNfQ01fREVUX0NGR19DSEFOR0UpIHsKKyAgICByZXR1cm4gU0JSREVDX09LOwogICB9CiAKICAgc2VsZi0+c2FtcGxlUmF0ZUluID0gc2FtcGxlUmF0ZUluOwogICBzZWxmLT5jb2RlY0ZyYW1lU2l6ZSA9IHNhbXBsZXNQZXJGcmFtZTsKICAgc2VsZi0+Y29yZUNvZGVjID0gY29yZUNvZGVjOwotCi0gIHNlbGYtPmZsYWdzID0gMDsKLSAgc2VsZi0+ZmxhZ3MgfD0gKGNvcmVDb2RlYyA9PSBBT1RfRVJfQUFDX0VMRCkgPyBTQlJERUNfRUxEX0dSSUQgOiAwOwotICBzZWxmLT5mbGFncyB8PSAoY29yZUNvZGVjID09IEFPVF9FUl9BQUNfU0NBTCkgPyBTQlJERUNfU1lOVEFYX1NDQUwgOiAwOwotICBzZWxmLT5mbGFncyB8PSAoY29yZUNvZGVjID09IEFPVF9EUk1fQUFDKSAgICAgPyBTQlJERUNfU1lOVEFYX1NDQUx8U0JSREVDX1NZTlRBWF9EUk0gOiAwOworICBzZWxmLT5oYXJtb25pY1NCUiA9IGhhcm1vbmljU0JSOworICBzZWxmLT5kb3duc2NhbGVGYWN0b3IgPSBkb3duc2NhbGVGYWN0b3I7CiAKICAgLyogSW5pdCBTQlIgZWxlbWVudHMgKi8KICAgewpAQCAtNTA1LDM0ICs2MTQsMzkgQEAKICAgICAgICAgc2JyRXJyb3IgPSBTQlJERUNfTUVNX0FMTE9DX0ZBSUxFRDsKICAgICAgICAgZ290byBiYWlsOwogICAgICAgfQotICAgICAgc2VsZi0+bnVtU2JyRWxlbWVudHMgKys7CisgICAgICBzZWxmLT5udW1TYnJFbGVtZW50cysrOwogICAgIH0gZWxzZSB7CiAgICAgICBzZWxmLT5udW1TYnJDaGFubmVscyAtPSBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5uQ2hhbm5lbHM7CiAgICAgfQogCi0gICAgLyogU2F2ZSBlbGVtZW50IElEIGZvciBzYW5pdHkgY2hlY2tzIGFuZCB0byBoYXZlIGEgZmFsbGJhY2sgZm9yIGNvbmNlYWxtZW50LiAqLworICAgIC8qIFNhdmUgZWxlbWVudCBJRCBmb3Igc2FuaXR5IGNoZWNrcyBhbmQgdG8gaGF2ZSBhIGZhbGxiYWNrIGZvciBjb25jZWFsbWVudC4KKyAgICAgKi8KICAgICBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5lbGVtZW50SUQgPSBlbGVtZW50SUQ7CiAKICAgICAvKiBEZXRlcm1pbmUgYW1vdW50IG9mIGNoYW5uZWxzIGZvciB0aGlzIGVsZW1lbnQgKi8KICAgICBzd2l0Y2ggKGVsZW1lbnRJRCkgewogICAgICAgY2FzZSBJRF9OT05FOgotICAgICAgY2FzZSBJRF9DUEU6IGVsQ2hhbm5lbHM9MjsKKyAgICAgIGNhc2UgSURfQ1BFOgorICAgICAgICBlbENoYW5uZWxzID0gMjsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIElEX0xGRToKLSAgICAgIGNhc2UgSURfU0NFOiBlbENoYW5uZWxzPTE7CisgICAgICBjYXNlIElEX1NDRToKKyAgICAgICAgZWxDaGFubmVscyA9IDE7CiAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDogZWxDaGFubmVscz0wOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZWxDaGFubmVscyA9IDA7CiAgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIC8qIEhhbmRsZSBjYXNlIG9mIFBhcmFtZXRyaWMgU3RlcmVvICovCi0gICAgaWYgKCBlbGVtZW50SW5kZXggPT0gMCAmJiBlbGVtZW50SUQgPT0gSURfU0NFICkgeworICAgIGlmIChlbGVtZW50SW5kZXggPT0gMCAmJiBlbGVtZW50SUQgPT0gSURfU0NFKSB7CiAgICAgICBzd2l0Y2ggKGNvcmVDb2RlYykgewogICAgICAgICBjYXNlIEFPVF9BQUNfTEM6CiAgICAgICAgIGNhc2UgQU9UX1NCUjoKICAgICAgICAgY2FzZSBBT1RfUFM6CiAgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19TQ0FMOgogICAgICAgICBjYXNlIEFPVF9EUk1fQUFDOgorICAgICAgICBjYXNlIEFPVF9EUk1fU1VSUk9VTkQ6CiAgICAgICAgICAgZWxDaGFubmVscyA9IDI7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC01NDAsNTcgKzY1NCw3NiBAQAogICAgICAgfQogICAgIH0KIAorICAgIC8qIFNhbml0eSBjaGVjayB0byBhdm9pZCBtZW1vcnkgbGVha3MgKi8KKyAgICBpZiAoZWxDaGFubmVscyA8IHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPm5DaGFubmVscykgeworICAgICAgc2VsZi0+bnVtU2JyQ2hhbm5lbHMgKz0gc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+bkNoYW5uZWxzOworICAgICAgc2JyRXJyb3IgPSBTQlJERUNfUEFSU0VfRVJST1I7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCiAgICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+bkNoYW5uZWxzID0gZWxDaGFubmVsczsKIAotICAgIGZvciAoY2g9MDsgY2g8ZWxDaGFubmVsczsgY2grKykKLSAgICB7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgZWxDaGFubmVsczsgY2grKykgewogICAgICAgaWYgKHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsW2NoXSA9PSBOVUxMKSB7Ci0gICAgICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsW2NoXSA9IEdldFJhbV9TYnJEZWNDaGFubmVsKGNoQ250KTsKKyAgICAgICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbY2hdID0KKyAgICAgICAgICAgIEdldFJhbV9TYnJEZWNDaGFubmVsKGNoQ250KTsKICAgICAgICAgaWYgKHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsW2NoXSA9PSBOVUxMKSB7CiAgICAgICAgICAgc2JyRXJyb3IgPSBTQlJERUNfTUVNX0FMTE9DX0ZBSUxFRDsKICAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIHNlbGYtPm51bVNickNoYW5uZWxzICsrOworICAgICAgc2VsZi0+bnVtU2JyQ2hhbm5lbHMrKzsKIAotICAgICAgc2JyRGVjb2Rlcl9kcmNJbml0Q2hhbm5lbCggJnNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsW2NoXS0+U2JyRGVjLnNickRyY0NoYW5uZWwgKTsKKyAgICAgIHNickRlY29kZXJfZHJjSW5pdENoYW5uZWwoJnNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnBTYnJDaGFubmVsW2NoXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+U2JyRGVjLnNickRyY0NoYW5uZWwpOwogCi0gICAgICAvKiBBZGQgcmVmZXJlbmNlIHBvaW50ZXIgdG8gd29ya2J1ZmZlcnMuICovCi0gICAgICBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFtjaF0tPlNickRlYy5Xb3JrQnVmZmVyMSA9IHNlbGYtPndvcmtCdWZmZXIxOwotICAgICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbY2hdLT5TYnJEZWMuV29ya0J1ZmZlcjIgPSBzZWxmLT53b3JrQnVmZmVyMjsKICAgICAgIGNoQ250Kys7CiAgICAgfQotICAgIGlmIChlbENoYW5uZWxzID09IDEgJiYgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbY2hdICE9IE5VTEwpIHsKLSAgICAgIGRlbGV0ZVNickRlYyggc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbY2hdICk7Ci0gICAgICBGcmVlUmFtX1NickRlY0NoYW5uZWwoICZzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFtjaF0gKTsKLSAgICB9CiAgIH0KIAorICBpZiAoIXNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYucW1mRG9tYWluRXhwbGljaXRDb25maWcpIHsKKyAgICBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5JbnB1dENoYW5uZWxzX3JlcXVlc3RlZCA9CisgICAgICAgIHNlbGYtPm51bVNickNoYW5uZWxzOworICAgIHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYubk91dHB1dENoYW5uZWxzX3JlcXVlc3RlZCA9CisgICAgICAgIGZNYXgoKElOVClzZWxmLT5udW1TYnJDaGFubmVscywKKyAgICAgICAgICAgICAoSU5UKXNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYubk91dHB1dENoYW5uZWxzX3JlcXVlc3RlZCk7CisgIH0KKworICAvKiBNYWtlIHN1cmUgZWFjaCBTQlIgY2hhbm5lbCBoYXMgb25lIFFNRiBjaGFubmVsIGFzc2lnbmVkIGV2ZW4gaWYKKyAgICogbnVtU2JyQ2hhbm5lbHMgb3IgZWxlbWVudCBzZXQtdXAgaGFzIGNoYW5nZWQuICovCisgIHNickRlY29kZXJfQXNzaWduUW1mQ2hhbm5lbHMyU2JyQ2hhbm5lbHMoc2VsZik7CisKICAgLyogY2xlYXIgZXJyb3IgZmxhZ3MgZm9yIGFsbCBkZWxheSBzbG90cyAqLwotICBGREttZW1jbGVhcihzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5mcmFtZUVycm9yRmxhZywgKCgxKSsxKSpzaXplb2YoVUNIQVIpKTsKKyAgRkRLbWVtY2xlYXIoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+ZnJhbWVFcnJvckZsYWcsCisgICAgICAgICAgICAgICgoMSkgKyAxKSAqIHNpemVvZihVQ0hBUikpOwogCi0gIC8qIEluaXRpYWxpemUgdGhpcyBpbnN0YW5jZSAqLwotICBzYnJFcnJvciA9IHNickRlY29kZXJfUmVzZXRFbGVtZW50KAotICAgICAgICAgIHNlbGYsCi0gICAgICAgICAgc2FtcGxlUmF0ZUluLAotICAgICAgICAgIHNhbXBsZVJhdGVPdXQsCi0gICAgICAgICAgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgIGVsZW1lbnRJRCwKLSAgICAgICAgICBlbGVtZW50SW5kZXgsCi0gICAgICAgICAgKGNvcmVDb2RlYyA9PSBBT1RfRVJfQUFDX0VMRCkgPyAwIDogKDYpCi0gICAgICAgICAgKTsKKyAgeworICAgIGludCBvdmVybGFwOwogCi0KKyAgICBpZiAoY29yZUNvZGVjID09IEFPVF9FUl9BQUNfRUxEKSB7CisgICAgICBvdmVybGFwID0gMDsKKyAgICB9IGVsc2UgaWYgKHNlbGYtPmZsYWdzICYgU0JSREVDX1FVQURfUkFURSkgeworICAgICAgb3ZlcmxhcCA9ICgzICogNCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG92ZXJsYXAgPSAoMyAqIDIpOworICAgIH0KKyAgICAvKiBJbml0aWFsaXplIHRoaXMgaW5zdGFuY2UgKi8KKyAgICBzYnJFcnJvciA9IHNickRlY29kZXJfUmVzZXRFbGVtZW50KHNlbGYsIHNhbXBsZVJhdGVJbiwgc2FtcGxlUmF0ZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwgZWxlbWVudElELCBlbGVtZW50SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGFwKTsKKyAgfQogCiBiYWlsOgogICBpZiAoc2JyRXJyb3IgIT0gU0JSREVDX09LKSB7Ci0gICAgaWYgKG5TYnJFbGVtZW50c1N0YXJ0IDwgc2VsZi0+bnVtU2JyRWxlbWVudHMpIHsKKyAgICBpZiAoKG5TYnJFbGVtZW50c1N0YXJ0IDwgc2VsZi0+bnVtU2JyRWxlbWVudHMpIHx8CisgICAgICAgIChuU2JyQ2hhbm5lbHNTdGFydCA8IHNlbGYtPm51bVNickNoYW5uZWxzKSkgewogICAgICAgLyogRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhpcyBlbGVtZW50ICovCi0gICAgICBzYnJEZWNvZGVyX0Rlc3Ryb3lFbGVtZW50KCBzZWxmLCBlbGVtZW50SW5kZXggKTsKLSAgICB9IGVsc2UgaWYgKCAoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XSAhPSBOVUxMKQotICAgICAgICAgICAgICYmIChlbGVtZW50SW5kZXggPCAoOCkpKQotICAgIHsgLyogU2V0IGVycm9yIGZsYWcgdG8gdHJpZ2dlciBjb25jZWFsbWVudCAqLwotICAgICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+ZnJhbWVFcnJvckZsYWdbc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+dXNlRnJhbWVTbG90XSA9IDE7CisgICAgICBzYnJEZWNvZGVyX0Rlc3Ryb3lFbGVtZW50KHNlbGYsIGVsZW1lbnRJbmRleCk7CisgICAgfSBlbHNlIGlmICgoZWxlbWVudEluZGV4IDwgKDgpKSAmJgorICAgICAgICAgICAgICAgKHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0gIT0KKyAgICAgICAgICAgICAgICBOVUxMKSkgeyAvKiBTZXQgZXJyb3IgZmxhZyB0byB0cmlnZ2VyIGNvbmNlYWxtZW50ICovCisgICAgICBzZXRGcmFtZUVycm9yRmxhZyhzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLCBGUkFNRV9FUlJPUik7CiAgICAgfQogICB9CiAKQEAgLTU5OCwyMiArNzMxLDQzIEBACiB9CiAKIC8qKgorICogXGJyaWVmIEZyZWUgY29uZmlnIGRlcGVuZGVudCBTQlIgbWVtb3J5LgorICogXHBhcmFtIHNlbGYgU0JSIGRlY29kZXIgaW5zdGFuY2UgaGFuZGxlCisgKi8KK1NCUl9FUlJPUiBzYnJEZWNvZGVyX0ZyZWVNZW0oSEFORExFX1NCUkRFQ09ERVIgKnNlbGYpIHsKKyAgaW50IGk7CisgIGludCBlbElkeDsKKworICBpZiAoc2VsZiAhPSBOVUxMICYmICpzZWxmICE9IE5VTEwpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKDgpOyBpKyspIHsKKyAgICAgIHNickRlY29kZXJfRGVzdHJveUVsZW1lbnQoKnNlbGYsIGkpOworICAgIH0KKworICAgIGZvciAoZWxJZHggPSAwOyBlbElkeCA8ICg4KTsgZWxJZHggKz0gMSkgeworICAgICAgZm9yIChpID0gMDsgaSA8ICgxKSArIDE7IGkgKz0gMSkgeworICAgICAgICAoKnNlbGYpLT5zYnJIZWFkZXJbZWxJZHhdW2ldLnN5bmNTdGF0ZSA9IFNCUl9OT1RfSU5JVElBTElaRUQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIFNCUkRFQ19PSzsKK30KKworLyoqCiAgKiBcYnJpZWYgQXBwbHkgZGVjb2RlZCBTQlIgaGVhZGVyIGZvciBvbmUgZWxlbWVudC4KICAqIFxwYXJhbSBzZWxmIFNCUiBkZWNvZGVyIGluc3RhbmNlIGhhbmRsZQogICogXHBhcmFtIGhTYnJIZWFkZXIgU0JSIGhlYWRlciBoYW5kbGUgdG8gYmUgcHJvY2Vzc2VkLgotICogXHBhcmFtIGhTYnJDaGFubmVsIHBvaW50ZXIgYXJyYXkgdG8gdGhlIFNCUiBlbGVtZW50IGNoYW5uZWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFNCUiBoZWFkZXIuCisgKiBccGFyYW0gaFNickNoYW5uZWwgcG9pbnRlciBhcnJheSB0byB0aGUgU0JSIGVsZW1lbnQgY2hhbm5lbHMgY29ycmVzcG9uZGluZyB0bworICogdGhlIFNCUiBoZWFkZXIuCiAgKiBccGFyYW0gaGVhZGVyU3RhdHVzIGhlYWRlciBzdGF0dXMgdmFsdWUgcmV0dXJuZWQgZnJvbSBTQlIgaGVhZGVyIHBhcnNlci4KLSAqIFxwYXJhbSBudW1FbGVtZW50Q2hhbm5lbHMgYW1vdW50IG9mIGNoYW5uZWxzIGZvciB0aGUgU0JSIGVsZW1lbnQgd2hvcyBoZWFkZXIgaXMgdG8gYmUgcHJvY2Vzc2VkLgorICogXHBhcmFtIG51bUVsZW1lbnRDaGFubmVscyBhbW91bnQgb2YgY2hhbm5lbHMgZm9yIHRoZSBTQlIgZWxlbWVudCB3aG9zIGhlYWRlcgorICogaXMgdG8gYmUgcHJvY2Vzc2VkLgogICovCi1zdGF0aWMKLVNCUl9FUlJPUiBzYnJEZWNvZGVyX0hlYWRlclVwZGF0ZSgKLSAgICAgICAgSEFORExFX1NCUkRFQ09ERVIgc2VsZiwKLSAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoU2JySGVhZGVyLAotICAgICAgICBTQlJfSEVBREVSX1NUQVRVUyBoZWFkZXJTdGF0dXMsCi0gICAgICAgIEhBTkRMRV9TQlJfQ0hBTk5FTCBoU2JyQ2hhbm5lbFtdLAotICAgICAgICBjb25zdCBpbnQgbnVtRWxlbWVudENoYW5uZWxzCi0gICAgICAgICkKLXsKK3N0YXRpYyBTQlJfRVJST1Igc2JyRGVjb2Rlcl9IZWFkZXJVcGRhdGUoSEFORExFX1NCUkRFQ09ERVIgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoU2JySGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfSEVBREVSX1NUQVRVUyBoZWFkZXJTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ0hBTk5FTCBoU2JyQ2hhbm5lbFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtRWxlbWVudENoYW5uZWxzKSB7CiAgIFNCUl9FUlJPUiBlcnJvclN0YXR1cyA9IFNCUkRFQ19PSzsKIAogICAvKgpAQCAtNjIyLDggKzc3NiwxNCBAQAogICBlcnJvclN0YXR1cyA9IHJlc2V0RnJlcUJhbmRUYWJsZXMoaFNickhlYWRlciwgc2VsZi0+ZmxhZ3MpOwogCiAgIGlmIChlcnJvclN0YXR1cyA9PSBTQlJERUNfT0spIHsKLSAgICBpZiAoaFNickhlYWRlci0+c3luY1N0YXRlID09IFVQU0FNUExJTkcgJiYgaGVhZGVyU3RhdHVzICE9IEhFQURFUl9SRVNFVCkKLSAgICB7CisgICAgaWYgKGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9PSBVUFNBTVBMSU5HICYmIGhlYWRlclN0YXR1cyAhPSBIRUFERVJfUkVTRVQpIHsKKyNpZiAoU0JSREVDX01BWF9IQl9GQURFX0ZSQU1FUyA+IDApCisgICAgICBpbnQgY2g7CisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBudW1FbGVtZW50Q2hhbm5lbHM7IGNoICs9IDEpIHsKKyAgICAgICAgaFNickNoYW5uZWxbY2hdLT5TYnJEZWMuaGlnaEJhbmRGYWRlQ250ID0gU0JSREVDX01BWF9IQl9GQURFX0ZSQU1FUzsKKyAgICAgIH0KKworI2VuZGlmCiAgICAgICAvKiBBcyB0aGUgZGVmYXVsdCBoZWFkZXIgd291bGQgbGltaXQgdGhlIGZyZXF1ZW5jeSByYW5nZSwKICAgICAgICAgIGxvd1N1YmJhbmQgYW5kIGhpZ2hTdWJiYW5kIG11c3QgYmUgcGF0Y2hlZC4gKi8KICAgICAgIGhTYnJIZWFkZXItPmZyZXFCYW5kRGF0YS5sb3dTdWJiYW5kID0gaFNickhlYWRlci0+bnVtYmVyT2ZBbmFseXNpc0JhbmRzOwpAQCAtNjM3LDE1NSArNzk3LDE1MyBAQAogICByZXR1cm4gZXJyb3JTdGF0dXM7CiB9CiAKLUlOVCBzYnJEZWNvZGVyX0hlYWRlciAoCi0gICAgICAgIEhBTkRMRV9TQlJERUNPREVSICAgICAgIHNlbGYsCi0gICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgIGhCcywKLSAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGVJbiwKLSAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGVPdXQsCi0gICAgICAgIGNvbnN0IElOVCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKLSAgICAgICAgY29uc3QgTVA0X0VMRU1FTlRfSUQgICAgZWxlbWVudElELAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICBlbGVtZW50SW5kZXgKLSAgICAgICAgKQoteworSU5UIHNickRlY29kZXJfSGVhZGVyKEhBTkRMRV9TQlJERUNPREVSIHNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZUluLCBjb25zdCBJTlQgc2FtcGxlUmF0ZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFVRElPX09CSkVDVF9UWVBFIGNvcmVDb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNUDRfRUxFTUVOVF9JRCBlbGVtZW50SUQsIGNvbnN0IElOVCBlbGVtZW50SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgaGFybW9uaWNTQlIsIGNvbnN0IFVDSEFSIHN0ZXJlb0NvbmZpZ0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSIGNvbmZpZ01vZGUsIFVDSEFSICpjb25maWdDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBkb3duc2NhbGVGYWN0b3IpIHsKICAgU0JSX0hFQURFUl9TVEFUVVMgaGVhZGVyU3RhdHVzOwogICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhTYnJIZWFkZXI7CiAgIFNCUl9FUlJPUiBzYnJFcnJvciA9IFNCUkRFQ19PSzsKICAgaW50IGhlYWRlckluZGV4OworICBVSU5UIGZsYWdzU2F2ZWQgPQorICAgICAgMDsgLyogZmxhZ3Mgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGluIEFDX0NNX0RFVF9DRkdfQ0hBTkdFIC0gbW9kZSBhZnRlcgorICAgICAgICAgICAgcGFyc2luZyAqLwogCi0gIGlmICggc2VsZiA9PSBOVUxMIHx8IGVsZW1lbnRJbmRleCA+ICg4KSApCi0gIHsKKyAgaWYgKHNlbGYgPT0gTlVMTCB8fCBlbGVtZW50SW5kZXggPj0gKDgpKSB7CiAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CiAgIH0KIAotICBpZiAoISBzYnJEZWNvZGVyX2lzQ29yZUNvZGVjVmFsaWQoY29yZUNvZGVjKSkgeworICBpZiAoIXNickRlY29kZXJfaXNDb3JlQ29kZWNWYWxpZChjb3JlQ29kZWMpKSB7CiAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CiAgIH0KIAorICBpZiAoY29uZmlnTW9kZSAmIEFDX0NNX0RFVF9DRkdfQ0hBTkdFKSB7CisgICAgZmxhZ3NTYXZlZCA9IHNlbGYtPmZsYWdzOyAvKiBzdG9yZSAqLworICB9CisKICAgc2JyRXJyb3IgPSBzYnJEZWNvZGVyX0luaXRFbGVtZW50KAotICAgICAgICAgIHNlbGYsCi0gICAgICAgICAgc2FtcGxlUmF0ZUluLAotICAgICAgICAgIHNhbXBsZVJhdGVPdXQsCi0gICAgICAgICAgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgIGNvcmVDb2RlYywKLSAgICAgICAgICBlbGVtZW50SUQsCi0gICAgICAgICAgZWxlbWVudEluZGV4Ci0gICAgICAgICAgKTsKKyAgICAgIHNlbGYsIHNhbXBsZVJhdGVJbiwgc2FtcGxlUmF0ZU91dCwgc2FtcGxlc1BlckZyYW1lLCBjb3JlQ29kZWMsIGVsZW1lbnRJRCwKKyAgICAgIGVsZW1lbnRJbmRleCwgaGFybW9uaWNTQlIsIHN0ZXJlb0NvbmZpZ0luZGV4LCBjb25maWdNb2RlLCBjb25maWdDaGFuZ2VkLAorICAgICAgZG93bnNjYWxlRmFjdG9yKTsKIAotICBpZiAoc2JyRXJyb3IgIT0gU0JSREVDX09LKSB7CisgIGlmICgoc2JyRXJyb3IgIT0gU0JSREVDX09LKSB8fCAoZWxlbWVudElEID09IElEX0xGRSkpIHsKICAgICBnb3RvIGJhaWw7CiAgIH0KIAotICBoZWFkZXJJbmRleCA9IGdldEhlYWRlclNsb3Qoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+dXNlRnJhbWVTbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+dXNlSGVhZGVyU2xvdCk7Ci0gIGhTYnJIZWFkZXIgPSAmKHNlbGYtPnNickhlYWRlcltlbGVtZW50SW5kZXhdW2hlYWRlckluZGV4XSk7CisgIGlmIChjb25maWdNb2RlICYgQUNfQ01fREVUX0NGR19DSEFOR0UpIHsKKyAgICBoU2JySGVhZGVyID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICBoZWFkZXJJbmRleCA9IGdldEhlYWRlclNsb3Qoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+dXNlRnJhbWVTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT51c2VIZWFkZXJTbG90KTsKIAotICBoZWFkZXJTdGF0dXMgPSBzYnJHZXRIZWFkZXJEYXRhICggaFNickhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgaFNickhlYWRlciA9ICYoc2VsZi0+c2JySGVhZGVyW2VsZW1lbnRJbmRleF1baGVhZGVySW5kZXhdKTsKKyAgfQogCisgIGhlYWRlclN0YXR1cyA9IHNickdldEhlYWRlckRhdGEoaFNickhlYWRlciwgaEJzLCBzZWxmLT5mbGFncywgMCwgY29uZmlnTW9kZSk7CiAKLSAgeworICBpZiAoY29yZUNvZGVjID09IEFPVF9VU0FDKSB7CisgICAgaWYgKGNvbmZpZ01vZGUgJiBBQ19DTV9ERVRfQ0ZHX0NIQU5HRSkgeworICAgICAgc2VsZi0+ZmxhZ3MgPSBmbGFnc1NhdmVkOyAvKiByZXN0b3JlICovCisgICAgfQorICAgIHJldHVybiBzYnJFcnJvcjsKKyAgfQorCisgIGlmIChjb25maWdNb2RlICYgQUNfQ01fQUxMT0NfTUVNKSB7CiAgICAgU0JSX0RFQ09ERVJfRUxFTUVOVCAqcFNickVsZW1lbnQ7CiAKICAgICBwU2JyRWxlbWVudCA9IHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF07CiAKICAgICAvKiBTYW5pdHkgY2hlY2sgKi8KICAgICBpZiAocFNickVsZW1lbnQgIT0gTlVMTCkgewotICAgICAgaWYgKCAoZWxlbWVudElEID09IElEX0NQRSAmJiBwU2JyRWxlbWVudC0+bkNoYW5uZWxzICE9IDIpCi0gICAgICAgIHx8IChlbGVtZW50SUQgIT0gSURfQ1BFICYmIHBTYnJFbGVtZW50LT5uQ2hhbm5lbHMgIT0gMSkgKQotICAgICAgeworICAgICAgaWYgKChlbGVtZW50SUQgPT0gSURfQ1BFICYmIHBTYnJFbGVtZW50LT5uQ2hhbm5lbHMgIT0gMikgfHwKKyAgICAgICAgICAoZWxlbWVudElEICE9IElEX0NQRSAmJiBwU2JyRWxlbWVudC0+bkNoYW5uZWxzICE9IDEpKSB7CiAgICAgICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOwogICAgICAgfQotICAgICAgaWYgKCBoZWFkZXJTdGF0dXMgPT0gSEVBREVSX1JFU0VUICkgewotCi0gICAgICAgIHNickVycm9yID0gc2JyRGVjb2Rlcl9IZWFkZXJVcGRhdGUoCi0gICAgICAgICAgICAgIHNlbGYsCi0gICAgICAgICAgICAgIGhTYnJIZWFkZXIsCi0gICAgICAgICAgICAgIGhlYWRlclN0YXR1cywKLSAgICAgICAgICAgICAgcFNickVsZW1lbnQtPnBTYnJDaGFubmVsLAotICAgICAgICAgICAgICBwU2JyRWxlbWVudC0+bkNoYW5uZWxzCi0gICAgICAgICAgICAgICk7CisgICAgICBpZiAoaGVhZGVyU3RhdHVzID09IEhFQURFUl9SRVNFVCkgeworICAgICAgICBzYnJFcnJvciA9IHNickRlY29kZXJfSGVhZGVyVXBkYXRlKHNlbGYsIGhTYnJIZWFkZXIsIGhlYWRlclN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2JyRWxlbWVudC0+cFNickNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNickVsZW1lbnQtPm5DaGFubmVscyk7CiAKICAgICAgICAgaWYgKHNickVycm9yID09IFNCUkRFQ19PSykgewogICAgICAgICAgIGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9IFNCUl9IRUFERVI7Ci0gICAgICAgICAgaFNickhlYWRlci0+c3RhdHVzICAgfD0gU0JSREVDX0hEUl9TVEFUX1VQREFURTsKKyAgICAgICAgICBoU2JySGVhZGVyLT5zdGF0dXMgfD0gU0JSREVDX0hEUl9TVEFUX1VQREFURTsKICAgICAgICAgfQogICAgICAgICAvKiBlbHNlIHsKLSAgICAgICAgICBTaW5jZSB3ZSBhbHJlYWR5IGhhdmUgb3ZlcndyaXR0ZW4gdGhlIG9sZCBTQlIgaGVhZGVyIHRoZSBvbmx5IHdheSBvdXQgaXMgVVBTQU1QTElORyEKLSAgICAgICAgICBUaGlzIHdpbGwgYmUgcHJlcGFyZWQgaW4gdGhlIG5leHQgc3RlcC4KKyAgICAgICAgICBTaW5jZSB3ZSBhbHJlYWR5IGhhdmUgb3ZlcndyaXR0ZW4gdGhlIG9sZCBTQlIgaGVhZGVyIHRoZSBvbmx5IHdheSBvdXQKKyAgICAgICAgaXMgVVBTQU1QTElORyEgVGhpcyB3aWxsIGJlIHByZXBhcmVkIGluIHRoZSBuZXh0IHN0ZXAuCiAgICAgICAgIH0gKi8KICAgICAgIH0KICAgICB9CiAgIH0KIGJhaWw6CisgIGlmIChjb25maWdNb2RlICYgQUNfQ01fREVUX0NGR19DSEFOR0UpIHsKKyAgICBzZWxmLT5mbGFncyA9IGZsYWdzU2F2ZWQ7IC8qIHJlc3RvcmUgKi8KKyAgfQogICByZXR1cm4gc2JyRXJyb3I7CiB9CiAKLQotU0JSX0VSUk9SIHNickRlY29kZXJfU2V0UGFyYW0gKEhBTkRMRV9TQlJERUNPREVSICAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQlJERUNfUEFSQU0gIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgdmFsdWUgKQoteworU0JSX0VSUk9SIHNickRlY29kZXJfU2V0UGFyYW0oSEFORExFX1NCUkRFQ09ERVIgc2VsZiwgY29uc3QgU0JSREVDX1BBUkFNIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHZhbHVlKSB7CiAgIFNCUl9FUlJPUiBlcnJvclN0YXR1cyA9IFNCUkRFQ19PSzsKIAogICAvKiBjb25maWd1cmUgdGhlIHN1YnN5c3RlbXMgKi8KLSAgc3dpdGNoIChwYXJhbSkKLSAgewotICBjYXNlIFNCUl9TWVNURU1fQklUU1RSRUFNX0RFTEFZOgotICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAoMSkpIHsKLSAgICAgIGVycm9yU3RhdHVzID0gU0JSREVDX1NFVF9QQVJBTV9GQUlMOworICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBTQlJfU1lTVEVNX0JJVFNUUkVBTV9ERUxBWToKKyAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAoMSkpIHsKKyAgICAgICAgZXJyb3JTdGF0dXMgPSBTQlJERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICBlcnJvclN0YXR1cyA9IFNCUkRFQ19OT1RfSU5JVElBTElaRUQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZWxmLT5udW1EZWxheUZyYW1lcyA9IChVQ0hBUil2YWx1ZTsKKyAgICAgIH0KICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoc2VsZiA9PSBOVUxMKSB7Ci0gICAgICBlcnJvclN0YXR1cyA9IFNCUkRFQ19OT1RfSU5JVElBTElaRUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNlbGYtPm51bURlbGF5RnJhbWVzID0gKFVDSEFSKXZhbHVlOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBTQlJfUU1GX01PREU6Ci0gICAgaWYgKHNlbGYgPT0gTlVMTCkgewotICAgICAgZXJyb3JTdGF0dXMgPSBTQlJERUNfTk9UX0lOSVRJQUxJWkVEOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAodmFsdWUgPT0gMSkgewotICAgICAgICBzZWxmLT5mbGFncyB8PSBTQlJERUNfTE9XX1BPV0VSOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc2VsZi0+ZmxhZ3MgJj0gflNCUkRFQ19MT1dfUE9XRVI7Ci0gICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIFNCUl9MRF9RTUZfVElNRV9BTElHTjoKLSAgICBpZiAoc2VsZiA9PSBOVUxMKSB7Ci0gICAgICBlcnJvclN0YXR1cyA9IFNCUkRFQ19OT1RfSU5JVElBTElaRUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICh2YWx1ZSA9PSAxKSB7Ci0gICAgICAgIHNlbGYtPmZsYWdzIHw9IFNCUkRFQ19MRF9NUFNfUU1GOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc2VsZi0+ZmxhZ3MgJj0gflNCUkRFQ19MRF9NUFNfUU1GOwotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBTQlJfRkxVU0hfREFUQToKLSAgICBpZiAodmFsdWUgIT0gMCkgeworICAgIGNhc2UgU0JSX1FNRl9NT0RFOgogICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgewogICAgICAgICBlcnJvclN0YXR1cyA9IFNCUkRFQ19OT1RfSU5JVElBTElaRUQ7CiAgICAgICB9IGVsc2UgewotICAgICAgICBzZWxmLT5mbGFncyB8PSBTQlJERUNfRkxVU0g7CisgICAgICAgIGlmICh2YWx1ZSA9PSAxKSB7CisgICAgICAgICAgc2VsZi0+ZmxhZ3MgfD0gU0JSREVDX0xPV19QT1dFUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZWxmLT5mbGFncyAmPSB+U0JSREVDX0xPV19QT1dFUjsKKyAgICAgICAgfQogICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBTQlJfQ0xFQVJfSElTVE9SWToKLSAgICBpZiAodmFsdWUgIT0gMCkgeworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQlJfTERfUU1GX1RJTUVfQUxJR046CiAgICAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CiAgICAgICAgIGVycm9yU3RhdHVzID0gU0JSREVDX05PVF9JTklUSUFMSVpFRDsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlbGYtPmZsYWdzIHw9IFNCUkRFQ19GT1JDRV9SRVNFVDsKKyAgICAgICAgaWYgKHZhbHVlID09IDEpIHsKKyAgICAgICAgICBzZWxmLT5mbGFncyB8PSBTQlJERUNfTERfTVBTX1FNRjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZWxmLT5mbGFncyAmPSB+U0JSREVDX0xEX01QU19RTUY7CisgICAgICAgIH0KICAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgU0JSX0JTX0lOVEVSUlVQVElPTjoKLSAgICB7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCUl9GTFVTSF9EQVRBOgorICAgICAgaWYgKHZhbHVlICE9IDApIHsKKyAgICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgIGVycm9yU3RhdHVzID0gU0JSREVDX05PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZWxmLT5mbGFncyB8PSBTQlJERUNfRkxVU0g7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0JSX0NMRUFSX0hJU1RPUlk6CisgICAgICBpZiAodmFsdWUgIT0gMCkgeworICAgICAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgZXJyb3JTdGF0dXMgPSBTQlJERUNfTk9UX0lOSVRJQUxJWkVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNlbGYtPmZsYWdzIHw9IFNCUkRFQ19GT1JDRV9SRVNFVDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBTQlJfQlNfSU5URVJSVVBUSU9OOiB7CiAgICAgICBpbnQgZWxlbWVudEluZGV4OwogCiAgICAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CkBAIC03OTQsMzggKzk1Miw1NSBAQAogICAgICAgfQogCiAgICAgICAvKiBMb29wIG92ZXIgU0JSIGVsZW1lbnRzICovCi0gICAgICBmb3IgKGVsZW1lbnRJbmRleCA9IDA7IGVsZW1lbnRJbmRleCA8IHNlbGYtPm51bVNickVsZW1lbnRzOyBlbGVtZW50SW5kZXgrKykgewotICAgICAgaWYgKHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0gIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoU2JySGVhZGVyOwotICAgICAgICBpbnQgaGVhZGVySW5kZXggPSBnZXRIZWFkZXJTbG90KHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnVzZUZyYW1lU2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT51c2VIZWFkZXJTbG90KTsKKyAgICAgIGZvciAoZWxlbWVudEluZGV4ID0gMDsgZWxlbWVudEluZGV4IDwgc2VsZi0+bnVtU2JyRWxlbWVudHM7CisgICAgICAgICAgIGVsZW1lbnRJbmRleCsrKSB7CisgICAgICAgIGlmIChzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdICE9IE5VTEwpIHsKKyAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhTYnJIZWFkZXI7CisgICAgICAgICAgaW50IGhlYWRlckluZGV4ID0KKyAgICAgICAgICAgICAgZ2V0SGVhZGVyU2xvdChzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT51c2VGcmFtZVNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+dXNlSGVhZGVyU2xvdCk7CiAKLSAgICAgICAgaFNickhlYWRlciA9ICYoc2VsZi0+c2JySGVhZGVyW2VsZW1lbnRJbmRleF1baGVhZGVySW5kZXhdKTsKKyAgICAgICAgICBoU2JySGVhZGVyID0gJihzZWxmLT5zYnJIZWFkZXJbZWxlbWVudEluZGV4XVtoZWFkZXJJbmRleF0pOwogCi0gICAgICAgIC8qIFNldCBzeW5jIHN0YXRlIFVQU0FNUExJTkcgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHNsb3QuCi0gICAgICAgICAgIFRoaXMgc3dpdGNoZXMgb2ZmIGJpdHN0cmVhbSBwYXJzaW5nIHVudGlsIGEgbmV3IGhlYWRlciBhcnJpdmVzLiAqLwotICAgICAgICBoU2JySGVhZGVyLT5zeW5jU3RhdGUgPSBVUFNBTVBMSU5HOwotICAgICAgICBoU2JySGVhZGVyLT5zdGF0dXMgICB8PSBTQlJERUNfSERSX1NUQVRfVVBEQVRFOwotICAgICAgfSB9Ci0gICAgfQotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIGVycm9yU3RhdHVzID0gU0JSREVDX1NFVF9QQVJBTV9GQUlMOwotICAgIGJyZWFrOwotICB9ICAvKiBzd2l0Y2gocGFyYW0pICovCisgICAgICAgICAgLyogU2V0IHN5bmMgc3RhdGUgVVBTQU1QTElORyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgc2xvdC4KKyAgICAgICAgICAgICBUaGlzIHN3aXRjaGVzIG9mZiBiaXRzdHJlYW0gcGFyc2luZyB1bnRpbCBhIG5ldyBoZWFkZXIgYXJyaXZlcy4gKi8KKyAgICAgICAgICBoU2JySGVhZGVyLT5zeW5jU3RhdGUgPSBVUFNBTVBMSU5HOworICAgICAgICAgIGhTYnJIZWFkZXItPnN0YXR1cyB8PSBTQlJERUNfSERSX1NUQVRfVVBEQVRFOworICAgICAgICB9CisgICAgICB9CisgICAgfSBicmVhazsKKworICAgIGNhc2UgU0JSX1NLSVBfUU1GOgorICAgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICBlcnJvclN0YXR1cyA9IFNCUkRFQ19OT1RfSU5JVElBTElaRUQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAodmFsdWUgPT0gMSkgeworICAgICAgICAgIHNlbGYtPmZsYWdzIHw9IFNCUkRFQ19TS0lQX1FNRl9BTkE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2VsZi0+ZmxhZ3MgJj0gflNCUkRFQ19TS0lQX1FNRl9BTkE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlID09IDIpIHsKKyAgICAgICAgICBzZWxmLT5mbGFncyB8PSBTQlJERUNfU0tJUF9RTUZfU1lOOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNlbGYtPmZsYWdzICY9IH5TQlJERUNfU0tJUF9RTUZfU1lOOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3JTdGF0dXMgPSBTQlJERUNfU0VUX1BBUkFNX0ZBSUw7CisgICAgICBicmVhazsKKyAgfSAvKiBzd2l0Y2gocGFyYW0pICovCiAKICAgcmV0dXJuIChlcnJvclN0YXR1cyk7CiB9CiAKLXN0YXRpYwotU0JSREVDX0RSQ19DSEFOTkVMICogc2JyRGVjb2Rlcl9kcmNHZXRDaGFubmVsKCBjb25zdCBIQU5ETEVfU0JSREVDT0RFUiBzZWxmLCBjb25zdCBJTlQgY2hhbm5lbCApCi17CitzdGF0aWMgU0JSREVDX0RSQ19DSEFOTkVMICpzYnJEZWNvZGVyX2RyY0dldENoYW5uZWwoCisgICAgY29uc3QgSEFORExFX1NCUkRFQ09ERVIgc2VsZiwgY29uc3QgSU5UIGNoYW5uZWwpIHsKICAgU0JSREVDX0RSQ19DSEFOTkVMICpwU2JyRHJjQ2hhbm5lbERhdGEgPSBOVUxMOwotICBpbnQgZWxlbWVudEluZGV4LCBlbENoYW5JZHg9MCwgbnVtQ2g9MDsKKyAgaW50IGVsZW1lbnRJbmRleCwgZWxDaGFuSWR4ID0gMCwgbnVtQ2ggPSAwOwogCi0gIGZvciAoZWxlbWVudEluZGV4ID0gMDsgKGVsZW1lbnRJbmRleCA8ICg4KSkgJiYgKG51bUNoIDw9IGNoYW5uZWwpOyBlbGVtZW50SW5kZXgrKykKLSAgeworICBmb3IgKGVsZW1lbnRJbmRleCA9IDA7IChlbGVtZW50SW5kZXggPCAoOCkpICYmIChudW1DaCA8PSBjaGFubmVsKTsKKyAgICAgICBlbGVtZW50SW5kZXgrKykgewogICAgIFNCUl9ERUNPREVSX0VMRU1FTlQgKnBTYnJFbGVtZW50ID0gc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XTsKICAgICBpbnQgYywgZWxDaGFubmVsczsKIApAQCAtODM0LDE4ICsxMDA5LDIxIEBACiAKICAgICAvKiBEZXRlcm1pbmUgYW1vdW50IG9mIGNoYW5uZWxzIGZvciB0aGlzIGVsZW1lbnQgKi8KICAgICBzd2l0Y2ggKHBTYnJFbGVtZW50LT5lbGVtZW50SUQpIHsKLSAgICAgIGNhc2UgSURfQ1BFOiBlbENoYW5uZWxzID0gMjsKKyAgICAgIGNhc2UgSURfQ1BFOgorICAgICAgICBlbENoYW5uZWxzID0gMjsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIElEX0xGRToKLSAgICAgIGNhc2UgSURfU0NFOiBlbENoYW5uZWxzID0gMTsKKyAgICAgIGNhc2UgSURfU0NFOgorICAgICAgICBlbENoYW5uZWxzID0gMTsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIElEX05PTkU6Ci0gICAgICBkZWZhdWx0OiBlbENoYW5uZWxzID0gMDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGVsQ2hhbm5lbHMgPSAwOwogICAgICAgICBicmVhazsKICAgICB9CiAKICAgICAvKiBMaW1pdCB3aXRoIGFjdHVhbCBhbGxvY2F0ZWQgZWxlbWVudCBjaGFubmVscyAqLwotICAgIGVsQ2hhbm5lbHMgPSBGREttaW4oZWxDaGFubmVscywgcFNickVsZW1lbnQtPm5DaGFubmVscyk7CisgICAgZWxDaGFubmVscyA9IGZNaW4oZWxDaGFubmVscywgcFNickVsZW1lbnQtPm5DaGFubmVscyk7CiAKICAgICBmb3IgKGMgPSAwOyAoYyA8IGVsQ2hhbm5lbHMpICYmIChudW1DaCA8PSBjaGFubmVsKTsgYysrKSB7CiAgICAgICBpZiAocFNickVsZW1lbnQtPnBTYnJDaGFubmVsW2VsQ2hhbklkeF0gIT0gTlVMTCkgewpAQCAtODYxLDI1ICsxMDM5LDIyIEBACiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIAotICBpZiAoIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0gIT0gTlVMTCApIHsKLSAgICBpZiAoIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsW2VsQ2hhbklkeF0gIT0gTlVMTCApCi0gICAgewotICAgICAgcFNickRyY0NoYW5uZWxEYXRhID0gJnNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsW2VsQ2hhbklkeF0tPlNickRlYy5zYnJEcmNDaGFubmVsOworICBpZiAoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XSAhPSBOVUxMKSB7CisgICAgaWYgKHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsW2VsQ2hhbklkeF0gIT0gTlVMTCkgeworICAgICAgcFNickRyY0NoYW5uZWxEYXRhID0gJnNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5wU2JyQ2hhbm5lbFtlbENoYW5JZHhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+U2JyRGVjLnNickRyY0NoYW5uZWw7CiAgICAgfQogICB9CiAKICAgcmV0dXJuIChwU2JyRHJjQ2hhbm5lbERhdGEpOwogfQogCi1TQlJfRVJST1Igc2JyRGVjb2Rlcl9kcmNGZWVkQ2hhbm5lbCAoIEhBTkRMRV9TQlJERUNPREVSICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgY2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICBudW1CYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAgICAgKnBOZXh0RmFjdF9tYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICBuZXh0RmFjdF9leHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICAgICAgICAgICAgICBkcmNJbnRlcnBvbGF0aW9uU2NoZW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgd2luU2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgICpwQmFuZFRvcCApCi17CitTQlJfRVJST1Igc2JyRGVjb2Rlcl9kcmNGZWVkQ2hhbm5lbChIQU5ETEVfU0JSREVDT0RFUiBzZWxmLCBJTlQgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIG51bUJhbmRzLCBGSVhQX0RCTCAqcE5leHRGYWN0X21hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuZXh0RmFjdF9leHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCBkcmNJbnRlcnBvbGF0aW9uU2NoZW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgd2luU2VxdWVuY2UsIFVTSE9SVCAqcEJhbmRUb3ApIHsKICAgU0JSREVDX0RSQ19DSEFOTkVMICpwU2JyRHJjQ2hhbm5lbERhdGEgPSBOVUxMOwogICBpbnQgYmFuZCwgaXNWYWxpZERhdGEgPSAwOwogCkBAIC04OTEsMTM4ICsxMDY2LDEzNiBAQAogICB9CiAKICAgLyogU2VhcmNoIGZvciBnYWluIHZhbHVlcyBkaWZmZXJlbnQgdG8gMS4wZiAqLwotICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbnVtQmFuZHM7IGJhbmQgKz0gMSkgewotICAgIGlmICggISgocE5leHRGYWN0X21hZ1tiYW5kXSA9PSBGTDJGWENPTlNUX0RCTCgwLjUpKSAgJiYgKG5leHRGYWN0X2V4cCA9PSAxKSkKLSAgICAgICYmICEoKHBOZXh0RmFjdF9tYWdbYmFuZF0gPT0gKEZJWFBfREJMKU1BWFZBTF9EQkwpICYmIChuZXh0RmFjdF9leHAgPT0gMCkpICkgeworICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgKGludCludW1CYW5kczsgYmFuZCArPSAxKSB7CisgICAgaWYgKCEoKHBOZXh0RmFjdF9tYWdbYmFuZF0gPT0gRkwyRlhDT05TVF9EQkwoMC41KSkgJiYKKyAgICAgICAgICAobmV4dEZhY3RfZXhwID09IDEpKSAmJgorICAgICAgICAhKChwTmV4dEZhY3RfbWFnW2JhbmRdID09IChGSVhQX0RCTClNQVhWQUxfREJMKSAmJgorICAgICAgICAgIChuZXh0RmFjdF9leHAgPT0gMCkpKSB7CiAgICAgICBpc1ZhbGlkRGF0YSA9IDE7CiAgICAgICBicmVhazsKICAgICB9CiAgIH0KIAogICAvKiBGaW5kIHRoZSByaWdodCBTQlIgY2hhbm5lbCAqLwotICBwU2JyRHJjQ2hhbm5lbERhdGEgPSBzYnJEZWNvZGVyX2RyY0dldENoYW5uZWwoIHNlbGYsIGNoICk7CisgIHBTYnJEcmNDaGFubmVsRGF0YSA9IHNickRlY29kZXJfZHJjR2V0Q2hhbm5lbChzZWxmLCBjaCk7CiAKLSAgaWYgKCBwU2JyRHJjQ2hhbm5lbERhdGEgIT0gTlVMTCApIHsKLSAgICBpZiAoIHBTYnJEcmNDaGFubmVsRGF0YS0+ZW5hYmxlIHx8IGlzVmFsaWREYXRhICkKLSAgeyAvKiBBY3RpdmF0ZSBwcm9jZXNzaW5nIG9ubHkgd2l0aCByZWFsIGFuZCB2YWxpZCBkYXRhICovCi0gICAgaW50IGk7CisgIGlmIChwU2JyRHJjQ2hhbm5lbERhdGEgIT0gTlVMTCkgeworICAgIGlmIChwU2JyRHJjQ2hhbm5lbERhdGEtPmVuYWJsZSB8fAorICAgICAgICBpc1ZhbGlkRGF0YSkgeyAvKiBBY3RpdmF0ZSBwcm9jZXNzaW5nIG9ubHkgd2l0aCByZWFsIGFuZCB2YWxpZCBkYXRhICovCisgICAgICBpbnQgaTsKIAotICAgIHBTYnJEcmNDaGFubmVsRGF0YS0+ZW5hYmxlICAgPSAxOwotICAgIHBTYnJEcmNDaGFubmVsRGF0YS0+bnVtQmFuZHNOZXh0ID0gbnVtQmFuZHM7CisgICAgICBwU2JyRHJjQ2hhbm5lbERhdGEtPmVuYWJsZSA9IDE7CisgICAgICBwU2JyRHJjQ2hhbm5lbERhdGEtPm51bUJhbmRzTmV4dCA9IG51bUJhbmRzOwogCi0gICAgcFNickRyY0NoYW5uZWxEYXRhLT53aW5TZXF1ZW5jZU5leHQgICAgICAgICAgICA9IHdpblNlcXVlbmNlOwotICAgIHBTYnJEcmNDaGFubmVsRGF0YS0+ZHJjSW50ZXJwb2xhdGlvblNjaGVtZU5leHQgPSBkcmNJbnRlcnBvbGF0aW9uU2NoZW1lOwotICAgIHBTYnJEcmNDaGFubmVsRGF0YS0+bmV4dEZhY3RfZXhwICAgICAgICAgICAgICAgPSBuZXh0RmFjdF9leHA7CisgICAgICBwU2JyRHJjQ2hhbm5lbERhdGEtPndpblNlcXVlbmNlTmV4dCA9IHdpblNlcXVlbmNlOworICAgICAgcFNickRyY0NoYW5uZWxEYXRhLT5kcmNJbnRlcnBvbGF0aW9uU2NoZW1lTmV4dCA9IGRyY0ludGVycG9sYXRpb25TY2hlbWU7CisgICAgICBwU2JyRHJjQ2hhbm5lbERhdGEtPm5leHRGYWN0X2V4cCA9IG5leHRGYWN0X2V4cDsKIAotICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KW51bUJhbmRzOyBpKyspIHsKLSAgICAgIHBTYnJEcmNDaGFubmVsRGF0YS0+YmFuZFRvcE5leHRbaV0gID0gcEJhbmRUb3BbaV07Ci0gICAgICBwU2JyRHJjQ2hhbm5lbERhdGEtPm5leHRGYWN0X21hZ1tpXSA9IHBOZXh0RmFjdF9tYWdbaV07CisgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCludW1CYW5kczsgaSsrKSB7CisgICAgICAgIHBTYnJEcmNDaGFubmVsRGF0YS0+YmFuZFRvcE5leHRbaV0gPSBwQmFuZFRvcFtpXTsKKyAgICAgICAgcFNickRyY0NoYW5uZWxEYXRhLT5uZXh0RmFjdF9tYWdbaV0gPSBwTmV4dEZhY3RfbWFnW2ldOworICAgICAgfQogICAgIH0KICAgfQotICB9CiAKICAgcmV0dXJuIFNCUkRFQ19PSzsKIH0KIAotCi12b2lkIHNickRlY29kZXJfZHJjRGlzYWJsZSAoIEhBTkRMRV9TQlJERUNPREVSICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgY2ggKQotewordm9pZCBzYnJEZWNvZGVyX2RyY0Rpc2FibGUoSEFORExFX1NCUkRFQ09ERVIgc2VsZiwgSU5UIGNoKSB7CiAgIFNCUkRFQ19EUkNfQ0hBTk5FTCAqcFNickRyY0NoYW5uZWxEYXRhID0gTlVMTDsKIAotICBpZiAoIChzZWxmID09IE5VTEwpCi0gICAgfHwgKGNoID4gKDgpKQotICAgIHx8IChzZWxmLT5udW1TYnJFbGVtZW50cyA9PSAwKQotICAgIHx8IChzZWxmLT5udW1TYnJDaGFubmVscyA9PSAwKSApIHsKKyAgaWYgKChzZWxmID09IE5VTEwpIHx8IChjaCA+ICg4KSkgfHwgKHNlbGYtPm51bVNickVsZW1lbnRzID09IDApIHx8CisgICAgICAoc2VsZi0+bnVtU2JyQ2hhbm5lbHMgPT0gMCkpIHsKICAgICByZXR1cm47CiAgIH0KIAogICAvKiBGaW5kIHRoZSByaWdodCBTQlIgY2hhbm5lbCAqLwotICBwU2JyRHJjQ2hhbm5lbERhdGEgPSBzYnJEZWNvZGVyX2RyY0dldENoYW5uZWwoIHNlbGYsIGNoICk7CisgIHBTYnJEcmNDaGFubmVsRGF0YSA9IHNickRlY29kZXJfZHJjR2V0Q2hhbm5lbChzZWxmLCBjaCk7CiAKLSAgaWYgKCBwU2JyRHJjQ2hhbm5lbERhdGEgIT0gTlVMTCApIHsKLSAgICBzYnJEZWNvZGVyX2RyY0luaXRDaGFubmVsKCBwU2JyRHJjQ2hhbm5lbERhdGEgKTsKKyAgaWYgKHBTYnJEcmNDaGFubmVsRGF0YSAhPSBOVUxMKSB7CisgICAgc2JyRGVjb2Rlcl9kcmNJbml0Q2hhbm5lbChwU2JyRHJjQ2hhbm5lbERhdGEpOwogICB9CiB9CiAKLQotCi1TQlJfRVJST1Igc2JyRGVjb2Rlcl9QYXJzZSgKLSAgICAgICAgSEFORExFX1NCUkRFQ09ERVIgc2VsZiwKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCcywKLSAgICAgICAgaW50ICpjb3VudCwKLSAgICAgICAgaW50ICBic1BheUxlbiwKLSAgICAgICAgaW50ICBjcmNGbGFnLAotICAgICAgICBNUDRfRUxFTUVOVF9JRCBwcmV2RWxlbWVudCwKLSAgICAgICAgaW50IGVsZW1lbnRJbmRleCwKLSAgICAgICAgaW50IGZHbG9iYWxJbmRlcGVuZGVuY3lGbGFnCi0gICAgICAgICkKLXsKLSAgU0JSX0RFQ09ERVJfRUxFTUVOVCAgICpoU2JyRWxlbWVudDsKK1NCUl9FUlJPUiBzYnJEZWNvZGVyX1BhcnNlKEhBTkRMRV9TQlJERUNPREVSIHNlbGYsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwRHJtQnNCdWZmZXIsIFVTSE9SVCBkcm1Cc0J1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmNvdW50LCBpbnQgYnNQYXlMZW4sIGludCBjcmNGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTVA0X0VMRU1FTlRfSUQgcHJldkVsZW1lbnQsIGludCBlbGVtZW50SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGFjRmxhZ3MsIFVJTlQgYWNFbEZsYWdzW10pIHsKKyAgU0JSX0RFQ09ERVJfRUxFTUVOVCAqaFNickVsZW1lbnQgPSBOVUxMOwogICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhTYnJIZWFkZXIgPSBOVUxMOwotICBIQU5ETEVfU0JSX0NIQU5ORUwgICAgKnBTYnJDaGFubmVsOworICBIQU5ETEVfU0JSX0NIQU5ORUwgKnBTYnJDaGFubmVsOwogCi0gIFNCUl9GUkFNRV9EQVRBICpoRnJhbWVEYXRhTGVmdDsKLSAgU0JSX0ZSQU1FX0RBVEEgKmhGcmFtZURhdGFSaWdodDsKKyAgU0JSX0ZSQU1FX0RBVEEgKmhGcmFtZURhdGFMZWZ0ID0gTlVMTDsKKyAgU0JSX0ZSQU1FX0RBVEEgKmhGcmFtZURhdGFSaWdodCA9IE5VTEw7CisgIFNCUl9GUkFNRV9EQVRBIGZyYW1lRGF0YUxlZnRDb3B5OworICBTQlJfRlJBTUVfREFUQSBmcmFtZURhdGFSaWdodENvcHk7CiAKICAgU0JSX0VSUk9SIGVycm9yU3RhdHVzID0gU0JSREVDX09LOwogICBTQlJfSEVBREVSX1NUQVRVUyBoZWFkZXJTdGF0dXMgPSBIRUFERVJfTk9UX1BSRVNFTlQ7CiAKLSAgSU5UICBzdGFydFBvczsKLSAgSU5UICBDUkNMZW4gPSAwOworICBJTlQgc3RhcnRQb3MgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKKyAgSU5UIENSQ0xlbiA9IDA7CiAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCc09yaWdpbmFsID0gaEJzOwotICBGREtfQ1JDSU5GTyAgY3JjSW5mbzsgICAgICAgICAvKiBzaGFsbCBiZSB1c2VkIGZvciBhbGwgb3RoZXIgQ1JDcyBpbiB0aGUgZnV0dXJlIChUQkQpICovCi0gIElOVCAgICAgICAgICBjcmNSZWcgPSAwOwotICBVU0hPUlQgICAgICAgZHJtU2JyQ3JjID0gMDsKKyAgRkRLX0JJVFNUUkVBTSBic0J3ZDsKIAotICBpbnQgIHN0ZXJlbzsKLSAgaW50ICBmRG9EZWNvZGVTYnJEYXRhID0gMTsKKyAgRkRLX0NSQ0lORk8gY3JjSW5mbzsKKyAgSU5UIGNyY1JlZyA9IDA7CisgIFVTSE9SVCBkcm1TYnJDcmMgPSAwOworICBjb25zdCBpbnQgZkdsb2JhbEluZGVwZW5kZW5jeUZsYWcgPSBhY0ZsYWdzICYgQUNfSU5ERVA7CisgIGNvbnN0IGludCBic19wdmMgPSBhY0VsRmxhZ3NbZWxlbWVudEluZGV4XSAmIEFDX0VMX1VTQUNfUFZDOworICBjb25zdCBpbnQgYnNfaW50ZXJUZXMgPSBhY0VsRmxhZ3NbZWxlbWVudEluZGV4XSAmIEFDX0VMX1VTQUNfSVRFUzsKKyAgaW50IHN0ZXJlbzsKKyAgaW50IGZEb0RlY29kZVNickRhdGEgPSAxOwogCi0gIGludCBsYXN0U2xvdCwgbGFzdEhkclNsb3QgPSAwLCB0aGlzSGRyU2xvdDsKKyAgaW50IGxhc3RTbG90LCBsYXN0SGRyU2xvdCA9IDAsIHRoaXNIZHJTbG90ID0gMDsKKworICAvKiBTQlIgc2FuaXR5IGNoZWNrcyAqLworICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgZXJyb3JTdGF0dXMgPSBTQlJERUNfTk9UX0lOSVRJQUxJWkVEOworICAgIGdvdG8gYmFpbDsKKyAgfQogCiAgIC8qIFJldmVyc2UgYml0cyBvZiBEUk0gU0JSIHBheWxvYWQgKi8KLSAgaWYgKCAoc2VsZi0+ZmxhZ3MgJiBTQlJERUNfU1lOVEFYX0RSTSkgJiYgKmNvdW50ID4gMCApCi0gIHsKLSAgICBVQ0hBUiAqYnNCdWZmZXJEcm0gPSAoVUNIQVIqKXNlbGYtPndvcmtCdWZmZXIxOwotICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCc0J3ZCA9IChIQU5ETEVfRkRLX0JJVFNUUkVBTSkgKGJzQnVmZmVyRHJtICsgKDUxMikpOworICBpZiAoKHNlbGYtPmZsYWdzICYgU0JSREVDX1NZTlRBWF9EUk0pICYmICpjb3VudCA+IDApIHsKICAgICBpbnQgZGF0YUJ5dGVzLCBkYXRhQml0czsKIAorICAgIEZES19BU1NFUlQoZHJtQnNCdWZmZXJTaXplID49ICg1MTIpKTsKICAgICBkYXRhQml0cyA9ICpjb3VudDsKIAotICAgIGlmIChkYXRhQml0cyA+ICgoNTEyKSo4KSkgeworICAgIGlmIChkYXRhQml0cyA+ICgoNTEyKSAqIDgpKSB7CiAgICAgICAvKiBkbyBub3QgZmxpcCBtb3JlIGRhdGEgdGhhbiBuZWVkZWQgKi8KLSAgICAgIGRhdGFCaXRzID0gKDUxMikqODsKKyAgICAgIGRhdGFCaXRzID0gKDUxMikgKiA4OwogICAgIH0KIAotICAgIGRhdGFCeXRlcyA9IChkYXRhQml0cys3KT4+MzsKKyAgICBkYXRhQnl0ZXMgPSAoZGF0YUJpdHMgKyA3KSA+PiAzOwogCiAgICAgaW50IGo7CiAKICAgICBpZiAoKGogPSAoaW50KUZES2dldFZhbGlkQml0cyhoQnMpKSAhPSA4KSB7Ci0gICAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChoQnMsIChqLTgpKTsKKyAgICAgIEZES3B1c2hCaURpcmVjdGlvbmFsKGhCcywgKGogLSA4KSk7CiAgICAgfQogCiAgICAgaiA9IDA7Ci0gICAgZm9yICggOyBkYXRhQnl0ZXMgPiAwOyBkYXRhQnl0ZXMtLSkKLSAgICB7CisgICAgZm9yICg7IGRhdGFCeXRlcyA+IDA7IGRhdGFCeXRlcy0tKSB7CiAgICAgICBpbnQgaTsKICAgICAgIFVDSEFSIHRtcEJ5dGU7CiAgICAgICBVQ0hBUiBidWZmZXIgPSAweDAwOwogCi0gICAgICB0bXBCeXRlID0gKFVDSEFSKSBGREtyZWFkQml0cyhoQnMsIDgpOworICAgICAgdG1wQnl0ZSA9IChVQ0hBUilGREtyZWFkQml0cyhoQnMsIDgpOwogICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICBpbnQgc2hpZnQgPSAyICogaSArIDE7Ci0gICAgICAgIGJ1ZmZlciB8PSAodG1wQnl0ZSAmICgweDA4Pj5pKSkgPDwgc2hpZnQ7Ci0gICAgICAgIGJ1ZmZlciB8PSAodG1wQnl0ZSAmICgweDEwPDxpKSkgPj4gc2hpZnQ7CisgICAgICAgIGJ1ZmZlciB8PSAodG1wQnl0ZSAmICgweDA4ID4+IGkpKSA8PCBzaGlmdDsKKyAgICAgICAgYnVmZmVyIHw9ICh0bXBCeXRlICYgKDB4MTAgPDwgaSkpID4+IHNoaWZ0OwogICAgICAgfQotICAgICAgYnNCdWZmZXJEcm1baisrXSA9IGJ1ZmZlcjsKKyAgICAgIHBEcm1Cc0J1ZmZlcltqKytdID0gYnVmZmVyOwogICAgICAgRkRLcHVzaEJhY2soaEJzLCAxNik7CiAgICAgfQogCi0gICAgRkRLaW5pdEJpdFN0cmVhbShoQnNCd2QsIGJzQnVmZmVyRHJtLCAoNTEyKSwgZGF0YUJpdHMsIEJTX1JFQURFUik7CisgICAgRkRLaW5pdEJpdFN0cmVhbSgmYnNCd2QsIHBEcm1Cc0J1ZmZlciwgKDUxMiksIGRhdGFCaXRzLCBCU19SRUFERVIpOwogCiAgICAgLyogVXNlIHJldmVyc2VkIGRhdGEgKi8KLSAgICBoQnMgPSBoQnNCd2Q7CisgICAgaEJzID0gJmJzQndkOwogICAgIGJzUGF5TGVuID0gKmNvdW50OwogICB9CiAKQEAgLTEwMzAsMTYgKzEyMDMsMTkgQEAKICAgc3RhcnRQb3MgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKIAogICAvKiBTQlIgc2FuaXR5IGNoZWNrcyAqLwotICBpZiAoIHNlbGYgPT0gTlVMTCB8fCBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdID09IE5VTEwgKSB7CisgIGlmIChzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdID09IE5VTEwpIHsKICAgICBlcnJvclN0YXR1cyA9IFNCUkRFQ19OT1RfSU5JVElBTElaRUQ7CiAgICAgZ290byBiYWlsOwotICB9IAotCisgIH0KICAgaFNickVsZW1lbnQgPSBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdOwogCi0gIGxhc3RTbG90ICAgID0gKGhTYnJFbGVtZW50LT51c2VGcmFtZVNsb3QgPiAwKSA/IGhTYnJFbGVtZW50LT51c2VGcmFtZVNsb3QtMSA6IHNlbGYtPm51bURlbGF5RnJhbWVzOwotICBsYXN0SGRyU2xvdCA9ICBoU2JyRWxlbWVudC0+dXNlSGVhZGVyU2xvdFtsYXN0U2xvdF07Ci0gIHRoaXNIZHJTbG90ID0gIGdldEhlYWRlclNsb3QoIGhTYnJFbGVtZW50LT51c2VGcmFtZVNsb3QsIGhTYnJFbGVtZW50LT51c2VIZWFkZXJTbG90ICk7ICAvKiBHZXQgYSBmcmVlIGhlYWRlciBzbG90IG5vdCB1c2VkIGJ5IGZyYW1lcyBub3QgcHJvY2Vzc2VkIHlldC4gKi8KKyAgbGFzdFNsb3QgPSAoaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdCA+IDApID8gaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdCAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2VsZi0+bnVtRGVsYXlGcmFtZXM7CisgIGxhc3RIZHJTbG90ID0gaFNickVsZW1lbnQtPnVzZUhlYWRlclNsb3RbbGFzdFNsb3RdOworICB0aGlzSGRyU2xvdCA9IGdldEhlYWRlclNsb3QoCisgICAgICBoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90LAorICAgICAgaFNickVsZW1lbnQtPnVzZUhlYWRlclNsb3QpOyAvKiBHZXQgYSBmcmVlIGhlYWRlciBzbG90IG5vdCB1c2VkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcyBub3QgcHJvY2Vzc2VkIHlldC4gKi8KIAogICAvKiBBc3NpZ24gdGhlIGZyZWUgc2xvdCB0byBzdG9yZSBhIG5ldyBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAqLwogICBoU2JySGVhZGVyID0gJnNlbGYtPnNickhlYWRlcltlbGVtZW50SW5kZXhdW3RoaXNIZHJTbG90XTsKQEAgLTEwNDcsOSArMTIyMywyMCBAQAogICBwU2JyQ2hhbm5lbCA9IGhTYnJFbGVtZW50LT5wU2JyQ2hhbm5lbDsKICAgc3RlcmVvID0gKGhTYnJFbGVtZW50LT5lbGVtZW50SUQgPT0gSURfQ1BFKSA/IDEgOiAwOwogCi0gIGhGcmFtZURhdGFMZWZ0ICA9ICZzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFswXS0+ZnJhbWVEYXRhW2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdOwotICBoRnJhbWVEYXRhUmlnaHQgPSAmc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+cFNickNoYW5uZWxbMV0tPmZyYW1lRGF0YVtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XTsKKyAgaEZyYW1lRGF0YUxlZnQgPSAmc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XQorICAgICAgICAgICAgICAgICAgICAgICAgLT5wU2JyQ2hhbm5lbFswXQorICAgICAgICAgICAgICAgICAgICAgICAgLT5mcmFtZURhdGFbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF07CisgIGlmIChzdGVyZW8pIHsKKyAgICBoRnJhbWVEYXRhUmlnaHQgPSAmc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5wU2JyQ2hhbm5lbFsxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5mcmFtZURhdGFbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF07CisgIH0KIAorICAvKiBzdG9yZSBmcmFtZURhdGE7IG5ldyBwYXJzZWQgZnJhbWVEYXRhIHBvc3NpYmx5IGNvcnJ1cHRlZCAqLworICBGREttZW1jcHkoJmZyYW1lRGF0YUxlZnRDb3B5LCBoRnJhbWVEYXRhTGVmdCwgc2l6ZW9mKFNCUl9GUkFNRV9EQVRBKSk7CisgIGlmIChzdGVyZW8pIHsKKyAgICBGREttZW1jcHkoJmZyYW1lRGF0YVJpZ2h0Q29weSwgaEZyYW1lRGF0YVJpZ2h0LCBzaXplb2YoU0JSX0ZSQU1FX0RBVEEpKTsKKyAgfQogCiAgIC8qIHJlc2V0IFBTIGZsYWc7IHdpbGwgYmUgc2V0IGFmdGVyIFBTIHdhcyBmb3VuZCAqLwogICBzZWxmLT5mbGFncyAmPSB+U0JSREVDX1BTX0RFQ09ERUQ7CkBAIC0xMDU4LDIzICsxMjQ1LDIzIEBACiAgICAgLyogR290IGEgbmV3IGhlYWRlciBmcm9tIGV4dGVybiAoZS5nLiBmcm9tIGFuIEFTQykgKi8KICAgICBoZWFkZXJTdGF0dXMgPSBIRUFERVJfT0s7CiAgICAgaFNickhlYWRlci0+c3RhdHVzICY9IH5TQlJERUNfSERSX1NUQVRfVVBEQVRFOwotICB9Ci0gIGVsc2UgaWYgKHRoaXNIZHJTbG90ICE9IGxhc3RIZHJTbG90KSB7CisgIH0gZWxzZSBpZiAodGhpc0hkclNsb3QgIT0gbGFzdEhkclNsb3QpIHsKICAgICAvKiBDb3B5IHRoZSBsYXN0IGhlYWRlciBpbnRvIHRoaXMgc2xvdCBvdGhlcndpc2UgdGhlCiAgICAgICAgaGVhZGVyIGNvbXBhcmUgd2lsbCB0cmlnZ2VyIG1vcmUgSEVBREVSX1JFU0VUcyB0aGFuIG5lZWRlZC4gKi8KLSAgICBjb3B5U2JySGVhZGVyKCBoU2JySGVhZGVyLCAmc2VsZi0+c2JySGVhZGVyW2VsZW1lbnRJbmRleF1bbGFzdEhkclNsb3RdICk7CisgICAgY29weVNickhlYWRlcihoU2JySGVhZGVyLCAmc2VsZi0+c2JySGVhZGVyW2VsZW1lbnRJbmRleF1bbGFzdEhkclNsb3RdKTsKICAgfQogCiAgIC8qCiAgICAgIENoZWNrIGlmIGJpdCBzdHJlYW0gZGF0YSBpcyB2YWxpZCBhbmQgbWF0Y2hlcyB0aGUgZWxlbWVudCBjb250ZXh0CiAgICovCi0gIGlmICggKChwcmV2RWxlbWVudCAhPSBJRF9TQ0UpICYmIChwcmV2RWxlbWVudCAhPSBJRF9DUEUpKSB8fCBwcmV2RWxlbWVudCAhPSBoU2JyRWxlbWVudC0+ZWxlbWVudElEKSB7Ci0gICAgLyogSW4gY2FzZSBvZiBMRkUgd2UgYWxzbyBsYW5kIGhlcmUsIHNpbmNlIHRoZXJlIGlzIG5vIExGRSBTQlIgZWxlbWVudCAoZG8gdXBzYW1wbGluZyBvbmx5KSAqLworICBpZiAoKChwcmV2RWxlbWVudCAhPSBJRF9TQ0UpICYmIChwcmV2RWxlbWVudCAhPSBJRF9DUEUpKSB8fAorICAgICAgcHJldkVsZW1lbnQgIT0gaFNickVsZW1lbnQtPmVsZW1lbnRJRCkgeworICAgIC8qIEluIGNhc2Ugb2YgTEZFIHdlIGFsc28gbGFuZCBoZXJlLCBzaW5jZSB0aGVyZSBpcyBubyBMRkUgU0JSIGVsZW1lbnQgKGRvCisgICAgICogdXBzYW1wbGluZyBvbmx5KSAqLwogICAgIGZEb0RlY29kZVNickRhdGEgPSAwOwogICB9CiAKLSAgaWYgKGZEb0RlY29kZVNickRhdGEpCi0gIHsKKyAgaWYgKGZEb0RlY29kZVNickRhdGEpIHsKICAgICBpZiAoKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSA8PSAwKSB7CiAgICAgICBmRG9EZWNvZGVTYnJEYXRhID0gMDsKICAgICB9CkBAIC0xMDgzLDI5ICsxMjcwLDI5IEBACiAgIC8qCiAgICAgIFNCUiBDUkMtY2hlY2sKICAgKi8KLSAgaWYgKGZEb0RlY29kZVNickRhdGEpCi0gIHsKKyAgaWYgKGZEb0RlY29kZVNickRhdGEpIHsKICAgICBpZiAoY3JjRmxhZykgewogICAgICAgc3dpdGNoIChzZWxmLT5jb3JlQ29kZWMpIHsKLSAgICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6Ci0gICAgICAgIEZES3B1c2hGb3IgKGhCcywgMTApOwotICAgICAgICAvKiBjaGVjayBzYnJjcmMgbGF0ZXI6IHdlIGRvbid0IGtub3cgdGhlIHBheWxvYWQgbGVuZ3RoIG5vdyAqLwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQU9UX0RSTV9BQUM6Ci0gICAgICAgIGRybVNickNyYyA9IChVU0hPUlQpRkRLcmVhZEJpdHMoaEJzLCA4KTsKLSAgICAgICAgLyogU2V0dXAgQ1JDIGRlY29kZXIgKi8KLSAgICAgICAgRkRLY3JjSW5pdCgmY3JjSW5mbywgMHgwMDFkLCAweEZGRkYsIDgpOwotICAgICAgICAvKiBTdGFydCBDUkMgcmVnaW9uICovCi0gICAgICAgIGNyY1JlZyA9IEZES2NyY1N0YXJ0UmVnKCZjcmNJbmZvLCBoQnMsIDApOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIENSQ0xlbiA9IGJzUGF5TGVuIC0gMTA7ICAgICAgICAgICAgICAgICAgICAgLyogY2hhbmdlOiAwID0+IGkgKi8KLSAgICAgICAgaWYgKENSQ0xlbiA8IDApIHsKLSAgICAgICAgICBmRG9EZWNvZGVTYnJEYXRhID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmRG9EZWNvZGVTYnJEYXRhID0gU2JyQ3JjQ2hlY2sgKGhCcywgQ1JDTGVuKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKKyAgICAgICAgICBGREtwdXNoRm9yKGhCcywgMTApOworICAgICAgICAgIC8qIGNoZWNrIHNicmNyYyBsYXRlcjogd2UgZG9uJ3Qga25vdyB0aGUgcGF5bG9hZCBsZW5ndGggbm93ICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQU9UX0RSTV9BQUM6CisgICAgICAgIGNhc2UgQU9UX0RSTV9TVVJST1VORDoKKyAgICAgICAgICBkcm1TYnJDcmMgPSAoVVNIT1JUKUZES3JlYWRCaXRzKGhCcywgOCk7CisgICAgICAgICAgLyogU2V0dXAgQ1JDIGRlY29kZXIgKi8KKyAgICAgICAgICBGREtjcmNJbml0KCZjcmNJbmZvLCAweDAwMWQsIDB4RkZGRiwgOCk7CisgICAgICAgICAgLyogU3RhcnQgQ1JDIHJlZ2lvbiAqLworICAgICAgICAgIGNyY1JlZyA9IEZES2NyY1N0YXJ0UmVnKCZjcmNJbmZvLCBoQnMsIDApOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIENSQ0xlbiA9IGJzUGF5TGVuIC0gMTA7IC8qIGNoYW5nZTogMCA9PiBpICovCisgICAgICAgICAgaWYgKENSQ0xlbiA8IDApIHsKKyAgICAgICAgICAgIGZEb0RlY29kZVNickRhdGEgPSAwOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmRG9EZWNvZGVTYnJEYXRhID0gU2JyQ3JjQ2hlY2soaEJzLCBDUkNMZW4pOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgIH0gLyogaWYgKGZEb0RlY29kZVNickRhdGEpICovCkBAIC0xMTEzLDMwICsxMzAwLDEwNiBAQAogICAvKgogICAgICBSZWFkIGluIHRoZSBoZWFkZXIgZGF0YSBhbmQgaXNzdWUgYSByZXNldCBpZiBjaGFuZ2Ugb2NjdXJlZAogICAqLwotICBpZiAoZkRvRGVjb2RlU2JyRGF0YSkKLSAgeworICBpZiAoZkRvRGVjb2RlU2JyRGF0YSkgewogICAgIGludCBzYnJIZWFkZXJQcmVzZW50OwogCi0gICAgeworICAgIGlmIChzZWxmLT5mbGFncyAmIChTQlJERUNfU1lOVEFYX1JTVkQ1MCB8IFNCUkRFQ19TWU5UQVhfVVNBQykpIHsKKyAgICAgIFNCUl9IRUFERVJfREFUQV9CU19JTkZPIG5ld1NickluZm87CisgICAgICBpbnQgc2JySW5mb1ByZXNlbnQ7CisKKyAgICAgIGlmIChic19pbnRlclRlcykgeworICAgICAgICBzZWxmLT5mbGFncyB8PSBTQlJERUNfVVNBQ19JVEVTOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2VsZi0+ZmxhZ3MgJj0gflNCUkRFQ19VU0FDX0lURVM7CisgICAgICB9CisKKyAgICAgIGlmIChmR2xvYmFsSW5kZXBlbmRlbmN5RmxhZykgeworICAgICAgICBzZWxmLT5mbGFncyB8PSBTQlJERUNfVVNBQ19JTkRFUDsKKyAgICAgICAgc2JySW5mb1ByZXNlbnQgPSAxOworICAgICAgICBzYnJIZWFkZXJQcmVzZW50ID0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNlbGYtPmZsYWdzICY9IH5TQlJERUNfVVNBQ19JTkRFUDsKKyAgICAgICAgc2JySW5mb1ByZXNlbnQgPSBGREtyZWFkQml0KGhCcyk7CisgICAgICAgIGlmIChzYnJJbmZvUHJlc2VudCkgeworICAgICAgICAgIHNickhlYWRlclByZXNlbnQgPSBGREtyZWFkQml0KGhCcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2JySGVhZGVyUHJlc2VudCA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHNickluZm9QcmVzZW50KSB7CisgICAgICAgIG5ld1NickluZm8uYW1wUmVzb2x1dGlvbiA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICAgICAgbmV3U2JySW5mby54b3Zlcl9iYW5kID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKKyAgICAgICAgbmV3U2JySW5mby5zYnJfcHJlcHJvY2Vzc2luZyA9IEZES3JlYWRCaXQoaEJzKTsKKyAgICAgICAgaWYgKGJzX3B2YykgeworICAgICAgICAgIG5ld1NickluZm8ucHZjX21vZGUgPSBGREtyZWFkQml0cyhoQnMsIDIpOworICAgICAgICAgIC8qIGJzX3B2Y19tb2RlOiAwIC0+IG5vIFBWQywgMSAtPiBQVkMgbW9kZSAxLCAyIC0+IFBWQyBtb2RlIDIsIDMgLT4KKyAgICAgICAgICAgKiByZXNlcnZlZCAqLworICAgICAgICAgIGlmIChuZXdTYnJJbmZvLnB2Y19tb2RlID4gMikgeworICAgICAgICAgICAgaGVhZGVyU3RhdHVzID0gSEVBREVSX0VSUk9SOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3RlcmVvICYmIG5ld1NickluZm8ucHZjX21vZGUgPiAwKSB7CisgICAgICAgICAgICAvKiBic19wdmMgaXMgYWx3YXlzIHRyYW5zbWl0dGVkIGJ1dCBwdmNfbW9kZSBpcyBzZXQgdG8gemVybyBpbiBjYXNlCisgICAgICAgICAgICAgKiBvZiBzdGVyZW8gU0JSLiBUaGUgY29uZmlnIG1pZ2h0IGJlIHdyb25nIGJ1dCB3ZSBjYW5ub3QgdGVsbCBmb3IKKyAgICAgICAgICAgICAqIHN1cmUuICovCisgICAgICAgICAgICBuZXdTYnJJbmZvLnB2Y19tb2RlID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbmV3U2JySW5mby5wdmNfbW9kZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhlYWRlclN0YXR1cyAhPSBIRUFERVJfRVJST1IpIHsKKyAgICAgICAgICBpZiAoRkRLbWVtY21wKCZoU2JySGVhZGVyLT5ic19pbmZvLCAmbmV3U2JySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihTQlJfSEVBREVSX0RBVEFfQlNfSU5GTykpKSB7CisgICAgICAgICAgICAvKiBpbiBjYXNlIG9mIGFtcFJlc29sdXRpb24gYW5kIHByZXByb2Nlc3NpbmcgY2hhbmdlIG5vIGZ1bGwgcmVzZXQKKyAgICAgICAgICAgICAqIHJlcXVpcmVkICAgICovCisgICAgICAgICAgICAvKiBIRUFERVIgcmVzZXQgd291bGQgdHJpZ2dlciBIQkUgdHJhbnNwb3NlciByZXNldCB3aGljaCBicmVha3MKKyAgICAgICAgICAgICAqIGVTYnJfM19FYWEubXA0ICovCisgICAgICAgICAgICBpZiAoKGhTYnJIZWFkZXItPmJzX2luZm8ucHZjX21vZGUgIT0gbmV3U2JySW5mby5wdmNfbW9kZSkgfHwKKyAgICAgICAgICAgICAgICAoaFNickhlYWRlci0+YnNfaW5mby54b3Zlcl9iYW5kICE9IG5ld1NickluZm8ueG92ZXJfYmFuZCkpIHsKKyAgICAgICAgICAgICAgaGVhZGVyU3RhdHVzID0gSEVBREVSX1JFU0VUOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaGVhZGVyU3RhdHVzID0gSEVBREVSX09LOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoU2JySGVhZGVyLT5ic19pbmZvID0gbmV3U2JySW5mbzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGVhZGVyU3RhdHVzID0gSEVBREVSX09LOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGhlYWRlclN0YXR1cyA9PSBIRUFERVJfRVJST1IpIHsKKyAgICAgICAgLyogQ29ycnVwdCBTQlIgaW5mbyBkYXRhLCBkbyBub3QgZGVjb2RlIGFuZCBzd2l0Y2ggdG8gVVBTQU1QTElORyAqLworICAgICAgICBoU2JySGVhZGVyLT5zeW5jU3RhdGUgPSBVUFNBTVBMSU5HOworICAgICAgICBmRG9EZWNvZGVTYnJEYXRhID0gMDsKKyAgICAgICAgc2JySGVhZGVyUHJlc2VudCA9IDA7CisgICAgICB9CisKKyAgICAgIGlmIChzYnJIZWFkZXJQcmVzZW50ICYmIGZEb0RlY29kZVNickRhdGEpIHsKKyAgICAgICAgaW50IHVzZURmbHRIZWFkZXI7CisKKyAgICAgICAgdXNlRGZsdEhlYWRlciA9IEZES3JlYWRCaXQoaEJzKTsKKworICAgICAgICBpZiAodXNlRGZsdEhlYWRlcikgeworICAgICAgICAgIHNickhlYWRlclByZXNlbnQgPSAwOworICAgICAgICAgIGlmIChGREttZW1jbXAoJmhTYnJIZWFkZXItPmJzX2RhdGEsICZoU2JySGVhZGVyLT5ic19kZmx0LAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFNCUl9IRUFERVJfREFUQV9CUykpIHx8CisgICAgICAgICAgICAgIGhTYnJIZWFkZXItPnN5bmNTdGF0ZSAhPSBTQlJfQUNUSVZFKSB7CisgICAgICAgICAgICBoU2JySGVhZGVyLT5ic19kYXRhID0gaFNickhlYWRlci0+YnNfZGZsdDsKKyAgICAgICAgICAgIGhlYWRlclN0YXR1cyA9IEhFQURFUl9SRVNFVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgewogICAgICAgc2JySGVhZGVyUHJlc2VudCA9IEZES3JlYWRCaXQoaEJzKTsKICAgICB9CiAKLSAgICBpZiAoIHNickhlYWRlclByZXNlbnQgKSB7Ci0gICAgICBoZWFkZXJTdGF0dXMgPSBzYnJHZXRIZWFkZXJEYXRhIChoU2JySGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBpZiAoc2JySGVhZGVyUHJlc2VudCkgeworICAgICAgaGVhZGVyU3RhdHVzID0gc2JyR2V0SGVhZGVyRGF0YShoU2JySGVhZGVyLCBoQnMsIHNlbGYtPmZsYWdzLCAxLCAwKTsKICAgICB9CiAKLSAgICBpZiAoaGVhZGVyU3RhdHVzID09IEhFQURFUl9SRVNFVCkKLSAgICB7CisgICAgaWYgKGhlYWRlclN0YXR1cyA9PSBIRUFERVJfUkVTRVQpIHsKICAgICAgIGVycm9yU3RhdHVzID0gc2JyRGVjb2Rlcl9IZWFkZXJVcGRhdGUoCi0gICAgICAgICAgICBzZWxmLAotICAgICAgICAgICAgaFNickhlYWRlciwKLSAgICAgICAgICAgIGhlYWRlclN0YXR1cywKLSAgICAgICAgICAgIHBTYnJDaGFubmVsLAotICAgICAgICAgICAgaFNickVsZW1lbnQtPm5DaGFubmVscyAKLSAgICAgICAgICAgICk7CisgICAgICAgICAgc2VsZiwgaFNickhlYWRlciwgaGVhZGVyU3RhdHVzLCBwU2JyQ2hhbm5lbCwgaFNickVsZW1lbnQtPm5DaGFubmVscyk7CiAKICAgICAgIGlmIChlcnJvclN0YXR1cyA9PSBTQlJERUNfT0spIHsKICAgICAgICAgaFNickhlYWRlci0+c3luY1N0YXRlID0gU0JSX0hFQURFUjsKQEAgLTExNTksMzEgKzE0MjIsMjIgQEAKICAgaWYgKChoU2JySGVhZGVyLT5zeW5jU3RhdGUgPj0gU0JSX0hFQURFUikgJiYgZkRvRGVjb2RlU2JyRGF0YSkgewogICAgIGludCBzYnJGcmFtZU9rOwogICAgIC8qIHJlYWQgdGhlIFNCUiBlbGVtZW50IGRhdGEgKi8KLSAgICBpZiAoc3RlcmVvKSB7Ci0gICAgICBzYnJGcmFtZU9rID0gc2JyR2V0Q2hhbm5lbFBhaXJFbGVtZW50KGhTYnJIZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhGcmFtZURhdGFMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRnJhbWVEYXRhUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnRyYW5zcG9zZXJTZXR0aW5ncy5vdmVybGFwKTsKKyAgICBpZiAoIXN0ZXJlbyAmJiAoc2VsZi0+aFBhcmFtZXRyaWNTdGVyZW9EZWMgIT0gTlVMTCkpIHsKKyAgICAgIC8qIHVwZGF0ZSBzbG90IGluZGV4IGZvciBQUyBiaXRzdHJlYW0gcGFyc2luZyAqLworICAgICAgc2VsZi0+aFBhcmFtZXRyaWNTdGVyZW9EZWMtPmJzTGFzdFNsb3QgPQorICAgICAgICAgIHNlbGYtPmhQYXJhbWV0cmljU3RlcmVvRGVjLT5ic1JlYWRTbG90OworICAgICAgc2VsZi0+aFBhcmFtZXRyaWNTdGVyZW9EZWMtPmJzUmVhZFNsb3QgPSBoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90OwogICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGlmIChzZWxmLT5oUGFyYW1ldHJpY1N0ZXJlb0RlYyAhPSBOVUxMKSB7Ci0gICAgICAgIC8qIHVwZGF0ZSBzbG90IGluZGV4IGZvciBQUyBiaXRzdHJlYW0gcGFyc2luZyAqLwotICAgICAgICBzZWxmLT5oUGFyYW1ldHJpY1N0ZXJlb0RlYy0+YnNMYXN0U2xvdCA9IHNlbGYtPmhQYXJhbWV0cmljU3RlcmVvRGVjLT5ic1JlYWRTbG90OwotICAgICAgICBzZWxmLT5oUGFyYW1ldHJpY1N0ZXJlb0RlYy0+YnNSZWFkU2xvdCA9IGhTYnJFbGVtZW50LT51c2VGcmFtZVNsb3Q7Ci0gICAgICB9Ci0gICAgICBzYnJGcmFtZU9rID0gc2JyR2V0U2luZ2xlQ2hhbm5lbEVsZW1lbnQoaFNickhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRnJhbWVEYXRhTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+aFBhcmFtZXRyaWNTdGVyZW9EZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XS0+dHJhbnNwb3NlclNldHRpbmdzLm92ZXJsYXApOwotICAgIH0KKyAgICBzYnJGcmFtZU9rID0gc2JyR2V0Q2hhbm5lbEVsZW1lbnQoCisgICAgICAgIGhTYnJIZWFkZXIsIGhGcmFtZURhdGFMZWZ0LCAoc3RlcmVvKSA/IGhGcmFtZURhdGFSaWdodCA6IE5VTEwsCisgICAgICAgICZwU2JyQ2hhbm5lbFswXS0+cHJldkZyYW1lRGF0YSwKKyAgICAgICAgcFNickNoYW5uZWxbMF0tPlNickRlYy5QdmNTdGF0aWNEYXRhLnB2Y19tb2RlX2xhc3QsIGhCcywKKyAgICAgICAgKHN0ZXJlbykgPyBOVUxMIDogc2VsZi0+aFBhcmFtZXRyaWNTdGVyZW9EZWMsIHNlbGYtPmZsYWdzLAorICAgICAgICBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT50cmFuc3Bvc2VyU2V0dGluZ3Mub3ZlcmxhcCk7CisKICAgICBpZiAoIXNickZyYW1lT2spIHsKICAgICAgIGZEb0RlY29kZVNickRhdGEgPSAwOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgSU5UIHZhbEJpdHM7CiAKICAgICAgIGlmIChic1BheUxlbiA+IDApIHsKQEAgLTExOTIsMjggKzE0NDYsMzIgQEAKICAgICAgICAgdmFsQml0cyA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CiAgICAgICB9CiAKLSAgICAgIGlmICggY3JjRmxhZyApIHsKKyAgICAgIGlmIChjcmNGbGFnKSB7CiAgICAgICAgIHN3aXRjaCAoc2VsZi0+Y29yZUNvZGVjKSB7Ci0gICAgICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6Ci0gICAgICAgICAgeworICAgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6IHsKICAgICAgICAgICAgIC8qIGxhdGUgY3JjIGNoZWNrIGZvciBlbGQgKi8KLSAgICAgICAgICAgIElOVCBwYXlsb2FkYml0cyA9IChJTlQpc3RhcnRQb3MgLSAoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpIC0gc3RhcnRQb3M7Ci0gICAgICAgICAgICBJTlQgY3JjTGVuICAgICAgPSBwYXlsb2FkYml0cyAtIDEwOworICAgICAgICAgICAgSU5UIHBheWxvYWRiaXRzID0KKyAgICAgICAgICAgICAgICAoSU5UKXN0YXJ0UG9zIC0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSAtIHN0YXJ0UG9zOworICAgICAgICAgICAgSU5UIGNyY0xlbiA9IHBheWxvYWRiaXRzIC0gMTA7CiAgICAgICAgICAgICBGREtwdXNoQmFjayhoQnMsIHBheWxvYWRiaXRzKTsKLSAgICAgICAgICAgIGZEb0RlY29kZVNickRhdGEgICAgICA9IFNickNyY0NoZWNrIChoQnMsIGNyY0xlbik7CisgICAgICAgICAgICBmRG9EZWNvZGVTYnJEYXRhID0gU2JyQ3JjQ2hlY2soaEJzLCBjcmNMZW4pOwogICAgICAgICAgICAgRkRLcHVzaEZvcihoQnMsIGNyY0xlbik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFPVF9EUk1fQUFDOgotICAgICAgICAgIC8qIEVuZCBDUkMgcmVnaW9uICovCi0gICAgICAgICAgRkRLY3JjRW5kUmVnKCZjcmNJbmZvLCBoQnMsIGNyY1JlZyk7Ci0gICAgICAgICAgLyogQ2hlY2sgQ1JDICovCi0gICAgICAgICAgaWYgKChGREtjcmNHZXRDUkMoJmNyY0luZm8pXjB4RkYpICE9IGRybVNickNyYykgewotICAgICAgICAgICAgZkRvRGVjb2RlU2JyRGF0YSA9IDA7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgY2FzZSBBT1RfRFJNX0FBQzoKKyAgICAgICAgICBjYXNlIEFPVF9EUk1fU1VSUk9VTkQ6CisgICAgICAgICAgICAvKiBFbmQgQ1JDIHJlZ2lvbiAqLworICAgICAgICAgICAgRkRLY3JjRW5kUmVnKCZjcmNJbmZvLCBoQnMsIGNyY1JlZyk7CisgICAgICAgICAgICAvKiBDaGVjayBDUkMgKi8KKyAgICAgICAgICAgIGlmICgoRkRLY3JjR2V0Q1JDKCZjcmNJbmZvKSBeIDB4RkYpICE9IGRybVNickNyYykgeworICAgICAgICAgICAgICBmRG9EZWNvZGVTYnJEYXRhID0gMDsKKyAgICAgICAgICAgICAgaWYgKGhlYWRlclN0YXR1cyAhPSBIRUFERVJfTk9UX1BSRVNFTlQpIHsKKyAgICAgICAgICAgICAgICBoZWFkZXJTdGF0dXMgPSBIRUFERVJfRVJST1I7CisgICAgICAgICAgICAgICAgaFNickhlYWRlci0+c3luY1N0YXRlID0gU0JSX05PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICB9CiAKQEAgLTEyMjIsMzcgKzE0ODAsNDIgQEAKICAgICAgICAgZkRvRGVjb2RlU2JyRGF0YSA9IDA7CiAgICAgICB9IGVsc2UgewogICAgICAgICBzd2l0Y2ggKHNlbGYtPmNvcmVDb2RlYykgewotICAgICAgICBjYXNlIEFPVF9TQlI6Ci0gICAgICAgIGNhc2UgQU9UX1BTOgotICAgICAgICBjYXNlIEFPVF9BQUNfTEM6Ci0gICAgICAgICAgewotICAgICAgICAgICAgLyogVGhpcyBzYW5pdHkgY2hlY2sgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggR2VuZXJhbCBBdWRpbyBiaXRzdHJlYW1zICovCisgICAgICAgICAgY2FzZSBBT1RfU0JSOgorICAgICAgICAgIGNhc2UgQU9UX1BTOgorICAgICAgICAgIGNhc2UgQU9UX0FBQ19MQzogeworICAgICAgICAgICAgLyogVGhpcyBzYW5pdHkgY2hlY2sgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggR2VuZXJhbCBBdWRpbworICAgICAgICAgICAgICogYml0c3RyZWFtcyAqLwogICAgICAgICAgICAgaW50IGFsaWduQml0cyA9IHZhbEJpdHMgJiAweDc7CiAKICAgICAgICAgICAgIGlmICh2YWxCaXRzID4gYWxpZ25CaXRzKSB7CiAgICAgICAgICAgICAgIGZEb0RlY29kZVNickRhdGEgPSAwOwogICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAvKiBObyBzYW5pdHkgY2hlY2sgYXZhaWxhYmxlICovCi0gICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogTm8gc2FuaXR5IGNoZWNrIGF2YWlsYWJsZSAqLworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0gZWxzZSB7Ci0gICAgLyogVGhlIHJldHVybmVkIGJpdCBjb3VudCB3aWxsIG5vdCBiZSB0aGUgYWN0dWFsIHBheWxvYWQgc2l6ZSBzaW5jZSB3ZSBkaWQgbm90Ci0gICAgICAgcGFyc2UgdGhlIGZyYW1lIGRhdGEuIFJldHVybiBhbiBlcnJvciBzbyB0aGF0IHRoZSBjYWxsZXIgY2FuIHJlYWN0IHJlc3BlY3RpdmVseS4gKi8KKyAgICAvKiBUaGUgcmV0dXJuZWQgYml0IGNvdW50IHdpbGwgbm90IGJlIHRoZSBhY3R1YWwgcGF5bG9hZCBzaXplIHNpbmNlIHdlIGRpZAorICAgICAgIG5vdCBwYXJzZSB0aGUgZnJhbWUgZGF0YS4gUmV0dXJuIGFuIGVycm9yIHNvIHRoYXQgdGhlIGNhbGxlciBjYW4gcmVhY3QKKyAgICAgICByZXNwZWN0aXZlbHkuICovCiAgICAgZXJyb3JTdGF0dXMgPSBTQlJERUNfUEFSU0VfRVJST1I7CiAgIH0KIAogICBpZiAoIWZEb0RlY29kZVNickRhdGEpIHsKICAgICAvKiBTZXQgZXJyb3IgZmxhZyBmb3IgdGhpcyBzbG90IHRvIHRyaWdnZXIgY29uY2VhbG1lbnQgKi8KLSAgICBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5mcmFtZUVycm9yRmxhZ1toU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XSA9IDE7CisgICAgc2V0RnJhbWVFcnJvckZsYWcoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XSwgRlJBTUVfRVJST1IpOworICAgIC8qIHJlc3RvcmUgb2xkIGZyYW1lRGF0YSBmb3IgY29uY2VhbG1lbnQgKi8KKyAgICBGREttZW1jcHkoaEZyYW1lRGF0YUxlZnQsICZmcmFtZURhdGFMZWZ0Q29weSwgc2l6ZW9mKFNCUl9GUkFNRV9EQVRBKSk7CisgICAgaWYgKHN0ZXJlbykgeworICAgICAgRkRLbWVtY3B5KGhGcmFtZURhdGFSaWdodCwgJmZyYW1lRGF0YVJpZ2h0Q29weSwgc2l6ZW9mKFNCUl9GUkFNRV9EQVRBKSk7CisgICAgfQogICAgIGVycm9yU3RhdHVzID0gU0JSREVDX1BBUlNFX0VSUk9SOwogICB9IGVsc2UgewogICAgIC8qIEV2ZXJ5dGhpbmcgc2VlbXMgdG8gYmUgb2sgc28gY2xlYXIgdGhlIGVycm9yIGZsYWcgKi8KLSAgICBzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5mcmFtZUVycm9yRmxhZ1toU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XSA9IDA7CisgICAgc2V0RnJhbWVFcnJvckZsYWcoc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XSwgRlJBTUVfT0spOwogICB9CiAKICAgaWYgKCFzdGVyZW8pIHsKQEAgLTEyNjMsMTE2ICsxNTI2LDEzOCBAQAogCiBiYWlsOgogCi0gIGlmICggc2VsZi0+ZmxhZ3MgJiBTQlJERUNfU1lOVEFYX0RSTSApCi0gIHsKLSAgICBoQnMgPSBoQnNPcmlnaW5hbDsKLSAgfQotCi0gIGlmICggKGVycm9yU3RhdHVzID09IFNCUkRFQ19PSykKLSAgICB8fCAoIChlcnJvclN0YXR1cyA9PSBTQlJERUNfUEFSU0VfRVJST1IpCi0gICAgICAmJiAoaGVhZGVyU3RhdHVzICE9IEhFQURFUl9FUlJPUikgKSApCi0gIHsKLSAgICBpbnQgdXNlT2xkSGRyID0gKCAoaGVhZGVyU3RhdHVzID09IEhFQURFUl9OT1RfUFJFU0VOVCkKLSAgICAgICAgICAgICAgICAgICB8fCAoaGVhZGVyU3RhdHVzID09IEhFQURFUl9FUlJPUikgKSA/IDEgOiAwOwotCi0gICAgaWYgKCF1c2VPbGRIZHIgJiYgKHRoaXNIZHJTbG90ICE9IGxhc3RIZHJTbG90KSkgewotICAgICAgdXNlT2xkSGRyIHw9ICggY29tcGFyZVNickhlYWRlciggaFNickhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnNickhlYWRlcltlbGVtZW50SW5kZXhdW2xhc3RIZHJTbG90XSApID09IDAgKSA/IDEgOiAwOworICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgaWYgKHNlbGYtPmZsYWdzICYgU0JSREVDX1NZTlRBWF9EUk0pIHsKKyAgICAgIGhCcyA9IGhCc09yaWdpbmFsOwogICAgIH0KIAotICAgIGlmICh1c2VPbGRIZHIgIT0gMCkgewotICAgICAgLyogVXNlIHRoZSBvbGQgaGVhZGVyIGZvciB0aGlzIGZyYW1lICovCi0gICAgICBoU2JyRWxlbWVudC0+dXNlSGVhZGVyU2xvdFtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XSA9IGxhc3RIZHJTbG90OwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBVc2UgdGhlIG5ldyBoZWFkZXIgZm9yIHRoaXMgZnJhbWUgKi8KLSAgICAgIGhTYnJFbGVtZW50LT51c2VIZWFkZXJTbG90W2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdID0gdGhpc0hkclNsb3Q7Ci0gICAgfQorICAgIGlmIChlcnJvclN0YXR1cyAhPSBTQlJERUNfTk9UX0lOSVRJQUxJWkVEKSB7CisgICAgICBpbnQgdXNlT2xkSGRyID0KKyAgICAgICAgICAoKGhlYWRlclN0YXR1cyA9PSBIRUFERVJfTk9UX1BSRVNFTlQpIHx8CisgICAgICAgICAgIChoZWFkZXJTdGF0dXMgPT0gSEVBREVSX0VSUk9SKSB8fAorICAgICAgICAgICAoaGVhZGVyU3RhdHVzID09IEhFQURFUl9SRVNFVCAmJiBlcnJvclN0YXR1cyA9PSBTQlJERUNfUEFSU0VfRVJST1IpKQorICAgICAgICAgICAgICA/IDEKKyAgICAgICAgICAgICAgOiAwOwogCi0gICAgLyogTW92ZSBmcmFtZSBwb2ludGVyIHRvIHRoZSBuZXh0IHNsb3Qgd2hpY2ggaXMgdXAgdG8gYmUgZGVjb2RlZC9hcHBsaWVkIG5leHQgKi8KLSAgICBoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90ID0gKGhTYnJFbGVtZW50LT51c2VGcmFtZVNsb3QrMSkgJSAoc2VsZi0+bnVtRGVsYXlGcmFtZXMrMSk7CisgICAgICBpZiAoIXVzZU9sZEhkciAmJiAodGhpc0hkclNsb3QgIT0gbGFzdEhkclNsb3QpICYmIChoU2JySGVhZGVyICE9IE5VTEwpKSB7CisgICAgICAgIHVzZU9sZEhkciB8PQorICAgICAgICAgICAgKGNvbXBhcmVTYnJIZWFkZXIoaFNickhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5zYnJIZWFkZXJbZWxlbWVudEluZGV4XVtsYXN0SGRyU2xvdF0pID09IDApCisgICAgICAgICAgICAgICAgPyAxCisgICAgICAgICAgICAgICAgOiAwOworICAgICAgfQorCisgICAgICBpZiAoaFNickVsZW1lbnQgIT0gTlVMTCkgeworICAgICAgICBpZiAodXNlT2xkSGRyICE9IDApIHsKKyAgICAgICAgICAvKiBVc2UgdGhlIG9sZCBoZWFkZXIgZm9yIHRoaXMgZnJhbWUgKi8KKyAgICAgICAgICBoU2JyRWxlbWVudC0+dXNlSGVhZGVyU2xvdFtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XSA9IGxhc3RIZHJTbG90OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIFVzZSB0aGUgbmV3IGhlYWRlciBmb3IgdGhpcyBmcmFtZSAqLworICAgICAgICAgIGhTYnJFbGVtZW50LT51c2VIZWFkZXJTbG90W2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdID0gdGhpc0hkclNsb3Q7CisgICAgICAgIH0KKworICAgICAgICAvKiBNb3ZlIGZyYW1lIHBvaW50ZXIgdG8gdGhlIG5leHQgc2xvdCB3aGljaCBpcyB1cCB0byBiZSBkZWNvZGVkL2FwcGxpZWQKKyAgICAgICAgICogbmV4dCAqLworICAgICAgICBoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90ID0KKyAgICAgICAgICAgIChoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90ICsgMSkgJSAoc2VsZi0+bnVtRGVsYXlGcmFtZXMgKyAxKTsKKyAgICAgIH0KKyAgICB9CiAgIH0KIAotICAqY291bnQgLT0gc3RhcnRQb3MgLSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKKyAgKmNvdW50IC09IHN0YXJ0UG9zIC0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKTsKIAogICByZXR1cm4gZXJyb3JTdGF0dXM7CiB9CiAKLQogLyoqCiAgKiBcYnJpZWYgUmVuZGVyIG9uZSBTQlIgZWxlbWVudCBpbnRvIHRpbWUgZG9tYWluIHNpZ25hbC4KICAqIFxwYXJhbSBzZWxmIFNCUiBkZWNvZGVyIGhhbmRsZQogICogXHBhcmFtIHRpbWVEYXRhIHBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlcgotICogXHBhcmFtIGludGVybGVhdmVkIGZsYWcgaW5kaWNhdGluZyBpbnRlcmxlYXZlZCBjaGFubmVsIG91dHB1dAotICogXHBhcmFtIGNoYW5uZWxNYXBwaW5nIHBvaW50ZXIgdG8gVUNIQVIgYXJyYXkgd2hlcmUgbmV4dCAyIGNoYW5uZWwgb2Zmc2V0cyBhcmUgc3RvcmVkLiAKKyAqIFxwYXJhbSBjaGFubmVsTWFwcGluZyBwb2ludGVyIHRvIFVDSEFSIGFycmF5IHdoZXJlIG5leHQgMiBjaGFubmVsIG9mZnNldHMgYXJlCisgKiBzdG9yZWQuCiAgKiBccGFyYW0gZWxlbWVudEluZGV4IGVudW1lcmF0aW5nIGluZGV4IG9mIHRoZSBTQlIgZWxlbWVudCB0byByZW5kZXIuCi0gKiBccGFyYW0gbnVtSW5DaGFubmVscyBudW1iZXIgb2YgY2hhbm5lbHMgZnJvbSBjb3JlIGNvZGVyIChyZWFkaW5nIHN0cmlkZSkuCi0gKiBccGFyYW0gbnVtT3V0Q2hhbm5lbHMgcG9pbnRlciB0byBhIGxvY2F0aW9uIHRvIHJldHVybiBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLgorICogXHBhcmFtIG51bUluQ2hhbm5lbHMgbnVtYmVyIG9mIGNoYW5uZWxzIGZyb20gY29yZSBjb2Rlci4KKyAqIFxwYXJhbSBudW1PdXRDaGFubmVscyBwb2ludGVyIHRvIGEgbG9jYXRpb24gdG8gcmV0dXJuIG51bWJlciBvZiBvdXRwdXQKKyAqIGNoYW5uZWxzLgogICogXHBhcmFtIHBzUG9zc2libGUgZmxhZyBpbmRpY2F0aW5nIGlmIFBTIGlzIHBvc3NpYmxlIG9yIG5vdC4KICAqIFxyZXR1cm4gU0JSREVDX09LIGlmIHN1Y2Nlc3NmdWxsLCBlbHNlIGVycm9yIGNvZGUKICAqLwotc3RhdGljIFNCUl9FUlJPUgotc2JyRGVjb2Rlcl9EZWNvZGVFbGVtZW50ICgKLSAgICAgICAgSEFORExFX1NCUkRFQ09ERVIgICAgc2VsZiwKLSAgICAgICAgSU5UX1BDTSAgICAgICAgICAgICAqdGltZURhdGEsCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIGludGVybGVhdmVkLAotICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICpjaGFubmVsTWFwcGluZywKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgZWxlbWVudEluZGV4LAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICBudW1JbkNoYW5uZWxzLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICpudW1PdXRDaGFubmVscywKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgcHNQb3NzaWJsZQotICAgICAgICApCi17CitzdGF0aWMgU0JSX0VSUk9SIHNickRlY29kZXJfRGVjb2RlRWxlbWVudCgKKyAgICBIQU5ETEVfU0JSREVDT0RFUiBzZWxmLCBRRE9NX1BDTSAqaW5wdXQsIElOVF9QQ00gKnRpbWVEYXRhLAorICAgIGNvbnN0IGludCB0aW1lRGF0YVNpemUsIGNvbnN0IEZES19jaGFubmVsTWFwRGVzY3IgKmNvbnN0IG1hcERlc2NyLAorICAgIGNvbnN0IGludCBtYXBJZHgsIGludCBjaGFubmVsSW5kZXgsIGNvbnN0IGludCBlbGVtZW50SW5kZXgsCisgICAgY29uc3QgaW50IG51bUluQ2hhbm5lbHMsIGludCAqbnVtT3V0Q2hhbm5lbHMsIGNvbnN0IGludCBwc1Bvc3NpYmxlKSB7CiAgIFNCUl9ERUNPREVSX0VMRU1FTlQgKmhTYnJFbGVtZW50ID0gc2VsZi0+cFNickVsZW1lbnRbZWxlbWVudEluZGV4XTsKLSAgSEFORExFX1NCUl9DSEFOTkVMICAgICpwU2JyQ2hhbm5lbCA9IHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsOwotICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhTYnJIZWFkZXIgPSAmc2VsZi0+c2JySGVhZGVyW2VsZW1lbnRJbmRleF1baFNickVsZW1lbnQtPnVzZUhlYWRlclNsb3RbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF1dOworICBIQU5ETEVfU0JSX0NIQU5ORUwgKnBTYnJDaGFubmVsID0KKyAgICAgIHNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsOworICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhTYnJIZWFkZXIgPQorICAgICAgJnNlbGYtPnNickhlYWRlcltlbGVtZW50SW5kZXhdCisgICAgICAgICAgICAgICAgICAgICAgW2hTYnJFbGVtZW50LT51c2VIZWFkZXJTbG90W2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdXTsKICAgSEFORExFX1BTX0RFQyBoX3BzX2QgPSBzZWxmLT5oUGFyYW1ldHJpY1N0ZXJlb0RlYzsKIAogICAvKiBnZXQgbWVtb3J5IGZvciBmcmFtZSBkYXRhIGZyb20gc2NyYXRjaCAqLwotICBTQlJfRlJBTUVfREFUQSAqaEZyYW1lRGF0YUxlZnQgID0gJmhTYnJFbGVtZW50LT5wU2JyQ2hhbm5lbFswXS0+ZnJhbWVEYXRhW2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdOwotICBTQlJfRlJBTUVfREFUQSAqaEZyYW1lRGF0YVJpZ2h0ID0gJmhTYnJFbGVtZW50LT5wU2JyQ2hhbm5lbFsxXS0+ZnJhbWVEYXRhW2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdOworICBTQlJfRlJBTUVfREFUQSAqaEZyYW1lRGF0YUxlZnQgPSBOVUxMOworICBTQlJfRlJBTUVfREFUQSAqaEZyYW1lRGF0YVJpZ2h0ID0gTlVMTDsKIAogICBTQlJfRVJST1IgZXJyb3JTdGF0dXMgPSBTQlJERUNfT0s7CiAKKyAgSU5UIHN0cmlkZU91dCwgb2Zmc2V0MCA9IDI1NSwgb2Zmc2V0MF9ibG9jayA9IDAsIG9mZnNldDEgPSAyNTUsCisgICAgICAgICAgICAgICAgIG9mZnNldDFfYmxvY2sgPSAwOworICBJTlQgY29kZWNGcmFtZVNpemUgPSBzZWxmLT5jb2RlY0ZyYW1lU2l6ZTsKIAotICBJTlQgIHN0cmlkZUluLCBzdHJpZGVPdXQsIG9mZnNldDAsIG9mZnNldDE7Ci0gIElOVCAgY29kZWNGcmFtZVNpemUgPSBzZWxmLT5jb2RlY0ZyYW1lU2l6ZTsKKyAgaW50IHN0ZXJlbyA9IChoU2JyRWxlbWVudC0+ZWxlbWVudElEID09IElEX0NQRSkgPyAxIDogMDsKKyAgaW50IG51bUVsZW1lbnRDaGFubmVscyA9CisgICAgICBoU2JyRWxlbWVudAorICAgICAgICAgIC0+bkNoYW5uZWxzOyAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgb2YgdGhlIGN1cnJlbnQgU0JSIGVsZW1lbnQgKi8KIAotICBpbnQgIHN0ZXJlbyA9IChoU2JyRWxlbWVudC0+ZWxlbWVudElEID09IElEX0NQRSkgPyAxIDogMDsKLSAgaW50ICBudW1FbGVtZW50Q2hhbm5lbHMgPSBoU2JyRWxlbWVudC0+bkNoYW5uZWxzOyAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgb2YgdGhlIGN1cnJlbnQgU0JSIGVsZW1lbnQgKi8KKyAgaEZyYW1lRGF0YUxlZnQgPQorICAgICAgJmhTYnJFbGVtZW50LT5wU2JyQ2hhbm5lbFswXS0+ZnJhbWVEYXRhW2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdOworICBpZiAoc3RlcmVvKSB7CisgICAgaEZyYW1lRGF0YVJpZ2h0ID0KKyAgICAgICAgJmhTYnJFbGVtZW50LT5wU2JyQ2hhbm5lbFsxXS0+ZnJhbWVEYXRhW2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdOworICB9CiAKICAgaWYgKHNlbGYtPmZsYWdzICYgU0JSREVDX0ZMVVNIKSB7Ci0gICAgaWYgKCBzZWxmLT5udW1GbHVzaGVkRnJhbWVzID4gc2VsZi0+bnVtRGVsYXlGcmFtZXMgKSB7CisgICAgaWYgKHNlbGYtPm51bUZsdXNoZWRGcmFtZXMgPiBzZWxmLT5udW1EZWxheUZyYW1lcykgewogICAgICAgaW50IGhkcklkeDsKLSAgICAgIC8qIE5vIHZhbGlkIFNCUiBwYXlsb2FkIGF2YWlsYWJsZSwgaGVuY2Ugc3dpdGNoIHRvIHVwc2FtcGxpbmcgKGluIGFsbCBoZWFkZXJzKSAqLwotICAgICAgZm9yIChoZHJJZHggPSAwOyBoZHJJZHggPCAoKDEpKzEpOyBoZHJJZHggKz0gMSkgeworICAgICAgLyogTm8gdmFsaWQgU0JSIHBheWxvYWQgYXZhaWxhYmxlLCBoZW5jZSBzd2l0Y2ggdG8gdXBzYW1wbGluZyAoaW4gYWxsCisgICAgICAgKiBoZWFkZXJzKSAqLworICAgICAgZm9yIChoZHJJZHggPSAwOyBoZHJJZHggPCAoKDEpICsgMSk7IGhkcklkeCArPSAxKSB7CiAgICAgICAgIHNlbGYtPnNickhlYWRlcltlbGVtZW50SW5kZXhdW2hkcklkeF0uc3luY1N0YXRlID0gVVBTQU1QTElORzsKICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvKiBNb3ZlIGZyYW1lIHBvaW50ZXIgdG8gdGhlIG5leHQgc2xvdCB3aGljaCBpcyB1cCB0byBiZSBkZWNvZGVkL2FwcGxpZWQgbmV4dCAqLwotICAgICAgaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdCA9IChoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90KzEpICUgKHNlbGYtPm51bURlbGF5RnJhbWVzKzEpOwotICAgICAgLyogVXBkYXRlIGhlYWRlciBhbmQgZnJhbWUgZGF0YSBwb2ludGVyIGJlY2F1c2UgdGhleSBoYXZlIGFscmVhZHkgYmVlbiBzZXQgKi8KLSAgICAgIGhTYnJIZWFkZXIgPSAmc2VsZi0+c2JySGVhZGVyW2VsZW1lbnRJbmRleF1baFNickVsZW1lbnQtPnVzZUhlYWRlclNsb3RbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF1dOwotICAgICAgaEZyYW1lRGF0YUxlZnQgID0gJmhTYnJFbGVtZW50LT5wU2JyQ2hhbm5lbFswXS0+ZnJhbWVEYXRhW2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdOwotICAgICAgaEZyYW1lRGF0YVJpZ2h0ID0gJmhTYnJFbGVtZW50LT5wU2JyQ2hhbm5lbFsxXS0+ZnJhbWVEYXRhW2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdOworICAgIH0gZWxzZSB7CisgICAgICAvKiBNb3ZlIGZyYW1lIHBvaW50ZXIgdG8gdGhlIG5leHQgc2xvdCB3aGljaCBpcyB1cCB0byBiZSBkZWNvZGVkL2FwcGxpZWQKKyAgICAgICAqIG5leHQgKi8KKyAgICAgIGhTYnJFbGVtZW50LT51c2VGcmFtZVNsb3QgPQorICAgICAgICAgIChoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90ICsgMSkgJSAoc2VsZi0+bnVtRGVsYXlGcmFtZXMgKyAxKTsKKyAgICAgIC8qIFVwZGF0ZSBoZWFkZXIgYW5kIGZyYW1lIGRhdGEgcG9pbnRlciBiZWNhdXNlIHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0CisgICAgICAgKi8KKyAgICAgIGhTYnJIZWFkZXIgPQorICAgICAgICAgICZzZWxmLT5zYnJIZWFkZXJbZWxlbWVudEluZGV4XQorICAgICAgICAgICAgICAgICAgICAgICAgICBbaFNickVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnVzZUhlYWRlclNsb3RbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF1dOworICAgICAgaEZyYW1lRGF0YUxlZnQgPQorICAgICAgICAgICZoU2JyRWxlbWVudC0+cFNickNoYW5uZWxbMF0tPmZyYW1lRGF0YVtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XTsKKyAgICAgIGlmIChzdGVyZW8pIHsKKyAgICAgICAgaEZyYW1lRGF0YVJpZ2h0ID0KKyAgICAgICAgICAgICZoU2JyRWxlbWVudC0+cFNickNoYW5uZWxbMV0tPmZyYW1lRGF0YVtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XTsKKyAgICAgIH0KICAgICB9CiAgIH0KIAogICAvKiBVcGRhdGUgdGhlIGhlYWRlciBlcnJvciBmbGFnICovCi0gIGhTYnJIZWFkZXItPmZyYW1lRXJyb3JGbGFnID0gaFNickVsZW1lbnQtPmZyYW1lRXJyb3JGbGFnW2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdOworICBoU2JySGVhZGVyLT5mcmFtZUVycm9yRmxhZyA9CisgICAgICBoU2JyRWxlbWVudC0+ZnJhbWVFcnJvckZsYWdbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF07CiAKICAgLyoKICAgICAgUHJlcGFyZSBmaWx0ZXJiYW5rIGZvciB1cHNhbXBsaW5nIGlmIG5vIHZhbGlkIGJpdCBzdHJlYW0gZGF0YSBpcyBhdmFpbGFibGUuCiAgICAqLwotICBpZiAoIGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9PSBTQlJfTk9UX0lOSVRJQUxJWkVEICkKLSAgewotICAgIGVycm9yU3RhdHVzID0gaW5pdEhlYWRlckRhdGEoCi0gICAgICAgICAgICBoU2JySGVhZGVyLAotICAgICAgICAgICAgc2VsZi0+c2FtcGxlUmF0ZUluLAotICAgICAgICAgICAgc2VsZi0+c2FtcGxlUmF0ZU91dCwKLSAgICAgICAgICAgIGNvZGVjRnJhbWVTaXplLAotICAgICAgICAgICAgc2VsZi0+ZmxhZ3MKLSAgICAgICAgICAgICk7CisgIGlmIChoU2JySGVhZGVyLT5zeW5jU3RhdGUgPT0gU0JSX05PVF9JTklUSUFMSVpFRCkgeworICAgIGVycm9yU3RhdHVzID0KKyAgICAgICAgaW5pdEhlYWRlckRhdGEoaFNickhlYWRlciwgc2VsZi0+c2FtcGxlUmF0ZUluLCBzZWxmLT5zYW1wbGVSYXRlT3V0LAorICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5kb3duc2NhbGVGYWN0b3IsIGNvZGVjRnJhbWVTaXplLCBzZWxmLT5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgMSAvKiBTRVRfREVGQVVMVF9IRFIgKi8KKyAgICAgICAgKTsKIAogICAgIGlmIChlcnJvclN0YXR1cyAhPSBTQlJERUNfT0spIHsKICAgICAgIHJldHVybiBlcnJvclN0YXR1czsKQEAgLTEzODAsMTMgKzE2NjUsOCBAQAogCiAgICAgaFNickhlYWRlci0+c3luY1N0YXRlID0gVVBTQU1QTElORzsKIAotICAgIGVycm9yU3RhdHVzID0gc2JyRGVjb2Rlcl9IZWFkZXJVcGRhdGUoCi0gICAgICAgICAgICBzZWxmLAotICAgICAgICAgICAgaFNickhlYWRlciwKLSAgICAgICAgICAgIEhFQURFUl9OT1RfUFJFU0VOVCwKLSAgICAgICAgICAgIHBTYnJDaGFubmVsLAotICAgICAgICAgICAgaFNickVsZW1lbnQtPm5DaGFubmVscwotICAgICAgICAgICAgKTsKKyAgICBlcnJvclN0YXR1cyA9IHNickRlY29kZXJfSGVhZGVyVXBkYXRlKHNlbGYsIGhTYnJIZWFkZXIsIEhFQURFUl9OT1RfUFJFU0VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYnJDaGFubmVsLCBoU2JyRWxlbWVudC0+bkNoYW5uZWxzKTsKIAogICAgIGlmIChlcnJvclN0YXR1cyAhPSBTQlJERUNfT0spIHsKICAgICAgIGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9IFNCUl9OT1RfSU5JVElBTElaRUQ7CkBAIC0xMzk3LDE3MCArMTY3NywxNjMgQEAKICAgLyogcmVzZXQgKi8KICAgaWYgKGhTYnJIZWFkZXItPnN0YXR1cyAmIFNCUkRFQ19IRFJfU1RBVF9SRVNFVCkgewogICAgIGludCBjaDsKLSAgICBmb3IgKGNoID0gMCA7IGNoIDwgbnVtRWxlbWVudENoYW5uZWxzOyBjaCsrKSB7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgbnVtRWxlbWVudENoYW5uZWxzOyBjaCsrKSB7CiAgICAgICBTQlJfRVJST1IgZXJyb3JTdGF0dXNUbXAgPSBTQlJERUNfT0s7CiAKLSAgICAgIGVycm9yU3RhdHVzVG1wID0gcmVzZXRTYnJEZWMgKAotICAgICAgICAgICAgICZwU2JyQ2hhbm5lbFtjaF0tPlNickRlYywKLSAgICAgICAgICAgICAgaFNickhlYWRlciwKLSAgICAgICAgICAgICAmcFNickNoYW5uZWxbY2hdLT5wcmV2RnJhbWVEYXRhLAotICAgICAgICAgICAgICBzZWxmLT5mbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIsCi0gICAgICAgICAgICAgIHNlbGYtPnN5bkRvd25zYW1wbGVGYWMKLSAgICAgICAgICAgICAgKTsKKyAgICAgIGVycm9yU3RhdHVzVG1wID0gcmVzZXRTYnJEZWMoCisgICAgICAgICAgJnBTYnJDaGFubmVsW2NoXS0+U2JyRGVjLCBoU2JySGVhZGVyLCAmcFNickNoYW5uZWxbY2hdLT5wcmV2RnJhbWVEYXRhLAorICAgICAgICAgIHNlbGYtPnN5bkRvd25zYW1wbGVGYWMsIHNlbGYtPmZsYWdzLCBwU2JyQ2hhbm5lbFtjaF0tPmZyYW1lRGF0YSk7CiAKICAgICAgIGlmIChlcnJvclN0YXR1c1RtcCAhPSBTQlJERUNfT0spIHsKLSAgICAgICAgZXJyb3JTdGF0dXMgPSBlcnJvclN0YXR1c1RtcDsKKyAgICAgICAgaFNickhlYWRlci0+c3luY1N0YXRlID0gVVBTQU1QTElORzsKICAgICAgIH0KICAgICB9CiAgICAgaFNickhlYWRlci0+c3RhdHVzICY9IH5TQlJERUNfSERSX1NUQVRfUkVTRVQ7CiAgIH0KIAogICAvKiBkZWNvZGluZyAqLwotICBpZiAoIChoU2JySGVhZGVyLT5zeW5jU3RhdGUgPT0gU0JSX0FDVElWRSkKLSAgICB8fCAoKGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9PSBTQlJfSEVBREVSKSAmJiAoaFNickhlYWRlci0+ZnJhbWVFcnJvckZsYWcgPT0gMCkpICkKLSAgeworICBpZiAoKGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9PSBTQlJfQUNUSVZFKSB8fAorICAgICAgKChoU2JySGVhZGVyLT5zeW5jU3RhdGUgPT0gU0JSX0hFQURFUikgJiYKKyAgICAgICAoaFNickhlYWRlci0+ZnJhbWVFcnJvckZsYWcgPT0gMCkpKSB7CiAgICAgZXJyb3JTdGF0dXMgPSBTQlJERUNfT0s7CiAKLSAgICBkZWNvZGVTYnJEYXRhIChoU2JySGVhZGVyLAotICAgICAgICAgICAgICAgICAgIGhGcmFtZURhdGFMZWZ0LAotICAgICAgICAgICAgICAgICAgJnBTYnJDaGFubmVsWzBdLT5wcmV2RnJhbWVEYXRhLAotICAgICAgICAgICAgICAgICAgIChzdGVyZW8pID8gaEZyYW1lRGF0YVJpZ2h0IDogTlVMTCwKLSAgICAgICAgICAgICAgICAgICAoc3RlcmVvKSA/ICZwU2JyQ2hhbm5lbFsxXS0+cHJldkZyYW1lRGF0YSA6IE5VTEwpOwotCisgICAgZGVjb2RlU2JyRGF0YShoU2JySGVhZGVyLCBoRnJhbWVEYXRhTGVmdCwgJnBTYnJDaGFubmVsWzBdLT5wcmV2RnJhbWVEYXRhLAorICAgICAgICAgICAgICAgICAgKHN0ZXJlbykgPyBoRnJhbWVEYXRhUmlnaHQgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgKHN0ZXJlbykgPyAmcFNickNoYW5uZWxbMV0tPnByZXZGcmFtZURhdGEgOiBOVUxMKTsKIAogICAgIC8qIE5vdyB3ZSBoYXZlIGEgZnVsbCBwYXJhbWV0ZXIgc2V0IGFuZCBjYW4gZG8gcGFyYW1ldGVyCiAgICAgICAgYmFzZWQgY29uY2VhbG1lbnQgaW5zdGVhZCBvZiBwbGFpbiB1cHNhbXBsaW5nLiAqLwogICAgIGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9IFNCUl9BQ1RJVkU7CiAgIH0KIAotICAvKiBkZWNvZGUgUFMgZGF0YSBpZiBhdmFpbGFibGUgKi8KLSAgaWYgKGhfcHNfZCAhPSBOVUxMICYmIHBzUG9zc2libGUpIHsKLSAgICBpbnQgYXBwbHlQcyA9IDE7Ci0KLSAgICAvKiBkZWZpbmUgd2hpY2ggZnJhbWUgZGVsYXkgbGluZSBzbG90IHRvIHByb2Nlc3MgKi8KLSAgICBoX3BzX2QtPnByb2Nlc3NTbG90ID0gaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdDsKLQotICAgIGFwcGx5UHMgPSBEZWNvZGVQcyhoX3BzX2QsIGhTYnJIZWFkZXItPmZyYW1lRXJyb3JGbGFnKTsKLSAgICBzZWxmLT5mbGFncyB8PSAoYXBwbHlQcykgPyBTQlJERUNfUFNfREVDT0RFRCA6IDA7CisgIGlmICh0aW1lRGF0YVNpemUgPAorICAgICAgaFNickhlYWRlci0+bnVtYmVyVGltZVNsb3RzICogaFNickhlYWRlci0+dGltZVN0ZXAgKgorICAgICAgICAgIHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYubkJhbmRzU3ludGhlc2lzICoKKyAgICAgICAgICAocHNQb3NzaWJsZSA/IGZNYXgoMiwgbnVtSW5DaGFubmVscykgOiBudW1JbkNoYW5uZWxzKSkgeworICAgIHJldHVybiBTQlJERUNfT1VUUFVUX0JVRkZFUl9UT09fU01BTEw7CiAgIH0KIAotICAvKiBTZXQgc3RyaWRlcyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyAqLwotICBpZiAoaW50ZXJsZWF2ZWQpIHsKLSAgICBzdHJpZGVJbiA9IG51bUluQ2hhbm5lbHM7Ci0gICAgaWYgKCBwc1Bvc3NpYmxlICkKKyAgeworICAgIHNlbGYtPmZsYWdzICY9IH5TQlJERUNfUFNfREVDT0RFRDsKKyAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocFBzU2NyYXRjaCwgc3RydWN0IFBTX0RFQ19DT0VGRklDSUVOVFMsIDEpCisKKyAgICAvKiBkZWNvZGUgUFMgZGF0YSBpZiBhdmFpbGFibGUgKi8KKyAgICBpZiAoaF9wc19kICE9IE5VTEwgJiYgcHNQb3NzaWJsZSAmJiAoaFNickhlYWRlci0+c3luY1N0YXRlID09IFNCUl9BQ1RJVkUpKSB7CisgICAgICBpbnQgYXBwbHlQcyA9IDE7CisKKyAgICAgIC8qIGRlZmluZSB3aGljaCBmcmFtZSBkZWxheSBsaW5lIHNsb3QgdG8gcHJvY2VzcyAqLworICAgICAgaF9wc19kLT5wcm9jZXNzU2xvdCA9IGhTYnJFbGVtZW50LT51c2VGcmFtZVNsb3Q7CisKKyAgICAgIGFwcGx5UHMgPSBEZWNvZGVQcyhoX3BzX2QsIGhTYnJIZWFkZXItPmZyYW1lRXJyb3JGbGFnLCBwUHNTY3JhdGNoKTsKKyAgICAgIHNlbGYtPmZsYWdzIHw9IChhcHBseVBzKSA/IFNCUkRFQ19QU19ERUNPREVEIDogMDsKKyAgICB9CisKKyAgICBvZmZzZXQwID0gRkRLX2NoTWFwRGVzY3JfZ2V0TWFwVmFsdWUobWFwRGVzY3IsIGNoYW5uZWxJbmRleCwgbWFwSWR4KTsKKyAgICBvZmZzZXQwX2Jsb2NrID0gb2Zmc2V0MCAqIGNvZGVjRnJhbWVTaXplOworICAgIGlmIChzdGVyZW8gfHwgcHNQb3NzaWJsZSkgeworICAgICAgLyogdGhlIHZhbHVlIG9mIG9mZnNldDEgb25seSBtYXR0ZXJzIGlmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSwgaG93ZXZlciBpZgorICAgICAgaXQgaXMgbm90IHRydWUgY2hhbm5lbEluZGV4KzEgbWF5IGV4Y2VlZCB0aGUgY2hhbm5lbCBtYXAgcmVzdXRsaW5nIGluIGFuCisgICAgICBlcnJvciwgdGhvdWdoIHRoZSB2YWx1ZSBvZiBvZmZzZXQxIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLiBUaGlzIGlzCisgICAgICBwcmV2ZW50ZWQgaGVyZS4gKi8KKyAgICAgIG9mZnNldDEgPSBGREtfY2hNYXBEZXNjcl9nZXRNYXBWYWx1ZShtYXBEZXNjciwgY2hhbm5lbEluZGV4ICsgMSwgbWFwSWR4KTsKKyAgICAgIG9mZnNldDFfYmxvY2sgPSBvZmZzZXQxICogY29kZWNGcmFtZVNpemU7CisgICAgfQorICAgIC8qIFNldCBzdHJpZGVzIGZvciByZWFkaW5nIGFuZCB3cml0aW5nICovCisgICAgaWYgKHBzUG9zc2libGUpCiAgICAgICBzdHJpZGVPdXQgPSAobnVtSW5DaGFubmVscyA8IDIpID8gMiA6IG51bUluQ2hhbm5lbHM7CiAgICAgZWxzZQogICAgICAgc3RyaWRlT3V0ID0gbnVtSW5DaGFubmVsczsKLSAgICBvZmZzZXQwID0gY2hhbm5lbE1hcHBpbmdbMF07Ci0gICAgb2Zmc2V0MSA9IGNoYW5uZWxNYXBwaW5nWzFdOwotICB9IGVsc2UgewotICAgIHN0cmlkZUluICA9IDE7Ci0gICAgc3RyaWRlT3V0ID0gMTsKLSAgICBvZmZzZXQwID0gY2hhbm5lbE1hcHBpbmdbMF0qMipjb2RlY0ZyYW1lU2l6ZTsKLSAgICBvZmZzZXQxID0gY2hhbm5lbE1hcHBpbmdbMV0qMipjb2RlY0ZyYW1lU2l6ZTsKLSAgfQogCi0gIC8qIHVzZSBzYW1lIGJ1ZmZlcnMgZm9yIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgYW5kIGFwcGx5IFBTIHBlciB0aW1lc2xvdCAqLwotICAvKiBQcm9jZXNzIGxlZnQgY2hhbm5lbCAqLwotLy9GREtwcmludGYoInNlbGYtPmNvZGVjRnJhbWVTaXplICVkXHQlZFxuIixzZWxmLT5jb2RlY0ZyYW1lU2l6ZSxzZWxmLT5zYW1wbGVSYXRlSW4pOwotICBzYnJfZGVjICgmcFNickNoYW5uZWxbMF0tPlNickRlYywKLSAgICAgICAgICAgIHRpbWVEYXRhICsgb2Zmc2V0MCwKLSAgICAgICAgICAgIHRpbWVEYXRhICsgb2Zmc2V0MCwKLSAgICAgICAgICAgJnBTYnJDaGFubmVsWzFdLT5TYnJEZWMsCi0gICAgICAgICAgICB0aW1lRGF0YSArIG9mZnNldDEsCi0gICAgICAgICAgICBzdHJpZGVJbiwKLSAgICAgICAgICAgIHN0cmlkZU91dCwKLSAgICAgICAgICAgIGhTYnJIZWFkZXIsCi0gICAgICAgICAgICBoRnJhbWVEYXRhTGVmdCwKLSAgICAgICAgICAgJnBTYnJDaGFubmVsWzBdLT5wcmV2RnJhbWVEYXRhLAotICAgICAgICAgICAgKGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9PSBTQlJfQUNUSVZFKSwKLSAgICAgICAgICAgIGhfcHNfZCwKLSAgICAgICAgICAgIHNlbGYtPmZsYWdzLAotICAgICAgICAgICAgY29kZWNGcmFtZVNpemUKLSAgICAgICAgICApOworICAgIC8qIHVzZSBzYW1lIGJ1ZmZlcnMgZm9yIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgYW5kIGFwcGx5IFBTIHBlciB0aW1lc2xvdCAqLworICAgIC8qIFByb2Nlc3MgbGVmdCBjaGFubmVsICovCisgICAgc2JyX2RlYygmcFNickNoYW5uZWxbMF0tPlNickRlYywgaW5wdXQgKyBvZmZzZXQwX2Jsb2NrLCB0aW1lRGF0YSArIG9mZnNldDAsCisgICAgICAgICAgICAoc2VsZi0+ZmxhZ3MgJiBTQlJERUNfUFNfREVDT0RFRCkgPyAmcFNickNoYW5uZWxbMV0tPlNickRlYyA6IE5VTEwsCisgICAgICAgICAgICB0aW1lRGF0YSArIG9mZnNldDEsIHN0cmlkZU91dCwgaFNickhlYWRlciwgaEZyYW1lRGF0YUxlZnQsCisgICAgICAgICAgICAmcFNickNoYW5uZWxbMF0tPnByZXZGcmFtZURhdGEsCisgICAgICAgICAgICAoaFNickhlYWRlci0+c3luY1N0YXRlID09IFNCUl9BQ1RJVkUpLCBoX3BzX2QsIHNlbGYtPmZsYWdzLAorICAgICAgICAgICAgY29kZWNGcmFtZVNpemUpOwogCi0gIGlmIChzdGVyZW8pIHsKLSAgICAvKiBQcm9jZXNzIHJpZ2h0IGNoYW5uZWwgKi8KLSAgICBzYnJfZGVjICgmcFNickNoYW5uZWxbMV0tPlNickRlYywKLSAgICAgICAgICAgICAgdGltZURhdGEgKyBvZmZzZXQxLAotICAgICAgICAgICAgICB0aW1lRGF0YSArIG9mZnNldDEsCi0gICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgIHN0cmlkZUluLAotICAgICAgICAgICAgICBzdHJpZGVPdXQsCi0gICAgICAgICAgICAgIGhTYnJIZWFkZXIsCi0gICAgICAgICAgICAgIGhGcmFtZURhdGFSaWdodCwKLSAgICAgICAgICAgICAmcFNickNoYW5uZWxbMV0tPnByZXZGcmFtZURhdGEsCi0gICAgICAgICAgICAgIChoU2JySGVhZGVyLT5zeW5jU3RhdGUgPT0gU0JSX0FDVElWRSksCi0gICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgIHNlbGYtPmZsYWdzLAotICAgICAgICAgICAgICBjb2RlY0ZyYW1lU2l6ZQotICAgICAgICAgICAgKTsKKyAgICBpZiAoc3RlcmVvKSB7CisgICAgICAvKiBQcm9jZXNzIHJpZ2h0IGNoYW5uZWwgKi8KKyAgICAgIHNicl9kZWMoJnBTYnJDaGFubmVsWzFdLT5TYnJEZWMsIGlucHV0ICsgb2Zmc2V0MV9ibG9jaywKKyAgICAgICAgICAgICAgdGltZURhdGEgKyBvZmZzZXQxLCBOVUxMLCBOVUxMLCBzdHJpZGVPdXQsIGhTYnJIZWFkZXIsCisgICAgICAgICAgICAgIGhGcmFtZURhdGFSaWdodCwgJnBTYnJDaGFubmVsWzFdLT5wcmV2RnJhbWVEYXRhLAorICAgICAgICAgICAgICAoaFNickhlYWRlci0+c3luY1N0YXRlID09IFNCUl9BQ1RJVkUpLCBOVUxMLCBzZWxmLT5mbGFncywKKyAgICAgICAgICAgICAgY29kZWNGcmFtZVNpemUpOworICAgIH0KKworICAgIENfQUxMT0NfU0NSQVRDSF9FTkQocFBzU2NyYXRjaCwgc3RydWN0IFBTX0RFQ19DT0VGRklDSUVOVFMsIDEpCiAgIH0KIAogICBpZiAoaF9wc19kICE9IE5VTEwpIHsKICAgICAvKiBzYXZlIFBTIHN0YXR1cyBmb3IgbmV4dCBydW4gKi8KLSAgICBoX3BzX2QtPnBzRGVjb2RlZFBydiA9IChzZWxmLT5mbGFncyAmIFNCUkRFQ19QU19ERUNPREVEKSA/IDEgOiAwIDsKKyAgICBoX3BzX2QtPnBzRGVjb2RlZFBydiA9IChzZWxmLT5mbGFncyAmIFNCUkRFQ19QU19ERUNPREVEKSA/IDEgOiAwOwogICB9CiAKLSAgaWYgKCBwc1Bvc3NpYmxlIAotICAgICkKLSAgeworICBpZiAocHNQb3NzaWJsZSAmJiAhKHNlbGYtPmZsYWdzICYgU0JSREVDX1NLSVBfUU1GX1NZTikpIHsKICAgICBGREtfQVNTRVJUKHN0cmlkZU91dCA+IDEpOwotICAgIGlmICggIShzZWxmLT5mbGFncyAmIFNCUkRFQ19QU19ERUNPREVEKSApIHsKLSAgICAgIC8qIEEgZGVjb2RlciB3aGljaCBpcyBhYmxlIHRvIGRlY29kZSBQUyBoYXMgdG8gcHJvZHVjZSBhIHN0ZXJlbyBvdXRwdXQgZXZlbiBpZiBubyBQUyBkYXRhIGlzIGF2YWlsYmxlLiAqLwotICAgICAgLyogU28gY29weSBsZWZ0IGNoYW5uZWwgdG8gcmlnaHQgY2hhbm5lbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpbnQgY29weUZyYW1lU2l6ZSA9IGNvZGVjRnJhbWVTaXplICogMiAvIHNlbGYtPnN5bkRvd25zYW1wbGVGYWM7Ci0gICAgICBpZiAoaW50ZXJsZWF2ZWQpIHsKLSAgICAgICAgSU5UX1BDTSAqcHRyOwotICAgICAgICBJTlQgaTsKLSAgICAgICAgRkRLX0FTU0VSVChzdHJpZGVPdXQgPT0gMik7CisgICAgaWYgKCEoc2VsZi0+ZmxhZ3MgJiBTQlJERUNfUFNfREVDT0RFRCkpIHsKKyAgICAgIC8qIEEgZGVjb2RlciB3aGljaCBpcyBhYmxlIHRvIGRlY29kZSBQUyBoYXMgdG8gcHJvZHVjZSBhIHN0ZXJlbyBvdXRwdXQKKyAgICAgICAqIGV2ZW4gaWYgbm8gUFMgZGF0YSBpcyBhdmFpbGFibGUuICovCisgICAgICAvKiBTbyBjb3B5IGxlZnQgY2hhbm5lbCB0byByaWdodCBjaGFubmVsLiAqLworICAgICAgaW50IGNvcHlGcmFtZVNpemUgPQorICAgICAgICAgIGNvZGVjRnJhbWVTaXplICogc2VsZi0+cFFtZkRvbWFpbi0+UW1mRG9tYWluT3V0LT5mYi5ub19jaGFubmVsczsKKyAgICAgIGNvcHlGcmFtZVNpemUgLz0gc2VsZi0+cFFtZkRvbWFpbi0+UW1mRG9tYWluSW4tPmZiLm5vX2NoYW5uZWxzOworICAgICAgSU5UX1BDTSAqcHRyOworICAgICAgSU5UIGk7CisgICAgICBGREtfQVNTRVJUKHN0cmlkZU91dCA9PSAyKTsKIAotICAgICAgICBwdHIgPSB0aW1lRGF0YTsKLSAgICAgICAgZm9yIChpID0gY29weUZyYW1lU2l6ZT4+MTsgaS0tOyApCi0gICAgICAgIHsKLSAgICAgICAgICBJTlRfUENNIHRtcDsgLyogVGhpcyB0ZW1wb3JhbCB2YXJpYWJsZSBpcyByZXF1aXJlZCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzIGNhbid0IGRvICpwdHIrKyA9ICpwdHIrKyBjb3JyZWN0bHkuICovCi0gICAgICAgICAgdG1wID0gKnB0cisrOyAqcHRyKysgPSB0bXA7Ci0gICAgICAgICAgdG1wID0gKnB0cisrOyAqcHRyKysgPSB0bXA7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEZES21lbWNweSggdGltZURhdGErY29weUZyYW1lU2l6ZSwgdGltZURhdGEsIGNvcHlGcmFtZVNpemUqc2l6ZW9mKElOVF9QQ00pICk7CisgICAgICBwdHIgPSB0aW1lRGF0YTsKKyAgICAgIGZvciAoaSA9IGNvcHlGcmFtZVNpemUgPj4gMTsgaS0tOykgeworICAgICAgICBJTlRfUENNIHRtcDsgLyogVGhpcyB0ZW1wb3JhbCB2YXJpYWJsZSBpcyByZXF1aXJlZCBiZWNhdXNlIHNvbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVycyBjYW4ndCBkbyAqcHRyKysgPSAqcHRyKysgY29ycmVjdGx5LiAqLworICAgICAgICB0bXAgPSAqcHRyKys7CisgICAgICAgICpwdHIrKyA9IHRtcDsKKyAgICAgICAgdG1wID0gKnB0cisrOworICAgICAgICAqcHRyKysgPSB0bXA7CiAgICAgICB9CiAgICAgfQotICAgICpudW1PdXRDaGFubmVscyA9IDI7ICAvKiBPdXRwdXQgbWluaW11bSB0d28gY2hhbm5lbHMgd2hlbiBQUyBpcyBlbmFibGVkLiAqLworICAgICpudW1PdXRDaGFubmVscyA9IDI7IC8qIE91dHB1dCBtaW5pbXVtIHR3byBjaGFubmVscyB3aGVuIFBTIGlzIGVuYWJsZWQuICovCiAgIH0KIAogICByZXR1cm4gZXJyb3JTdGF0dXM7CiB9CiAKLQotU0JSX0VSUk9SIHNickRlY29kZXJfQXBwbHkgKCBIQU5ETEVfU0JSREVDT0RFUiAgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgICAgICAqdGltZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAqbnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgICAgICAgICBjaGFubmVsTWFwcGluZ1soOCldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgICAgIGludGVybGVhdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgICAgIGNvcmVEZWNvZGVkT2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICAqcHNEZWNvZGVkICkKLXsKK1NCUl9FUlJPUiBzYnJEZWNvZGVyX0FwcGx5KEhBTkRMRV9TQlJERUNPREVSIHNlbGYsIElOVF9QQ00gKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqdGltZURhdGEsIGNvbnN0IGludCB0aW1lRGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm51bUNoYW5uZWxzLCBpbnQgKnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGREtfY2hhbm5lbE1hcERlc2NyICpjb25zdCBtYXBEZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBtYXBJZHgsIGNvbnN0IGludCBjb3JlRGVjb2RlZE9rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnBzRGVjb2RlZCkgewogICBTQlJfRVJST1IgZXJyb3JTdGF0dXMgPSBTQlJERUNfT0s7CiAKLSAgaW50ICAgcHNQb3NzaWJsZSA9IDA7Ci0gIGludCAgIHNickVsZW1lbnROdW07Ci0gIGludCAgIG51bUNvcmVDaGFubmVscyA9ICpudW1DaGFubmVsczsKLSAgaW50ICAgbnVtU2JyQ2hhbm5lbHMgID0gMDsKKyAgaW50IHBzUG9zc2libGU7CisgIGludCBzYnJFbGVtZW50TnVtOworICBpbnQgbnVtQ29yZUNoYW5uZWxzOworICBpbnQgbnVtU2JyQ2hhbm5lbHMgPSAwOworCisgIGlmICgoc2VsZiA9PSBOVUxMKSB8fCAodGltZURhdGEgPT0gTlVMTCkgfHwgKG51bUNoYW5uZWxzID09IE5VTEwpIHx8CisgICAgICAoc2FtcGxlUmF0ZSA9PSBOVUxMKSB8fCAocHNEZWNvZGVkID09IE5VTEwpIHx8CisgICAgICAhRkRLX2NoTWFwRGVzY3JfaXNWYWxpZChtYXBEZXNjcikpIHsKKyAgICByZXR1cm4gU0JSREVDX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KIAogICBwc1Bvc3NpYmxlID0gKnBzRGVjb2RlZDsKKyAgbnVtQ29yZUNoYW5uZWxzID0gKm51bUNoYW5uZWxzOworICBpZiAobnVtQ29yZUNoYW5uZWxzIDw9IDApIHsKKyAgICByZXR1cm4gU0JSREVDX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KIAogICBpZiAoc2VsZi0+bnVtU2JyRWxlbWVudHMgPCAxKSB7CiAgICAgLyogZXhpdCBpbW1lZGlhdGVseSB0byBhdm9pZCBhY2Nlc3MgdmlvbGF0aW9ucyAqLwotICAgIHJldHVybiBTQlJERUNfQ1JFQVRFX0VSUk9SOworICAgIHJldHVybiBTQlJERUNfTk9UX0lOSVRJQUxJWkVEOwogICB9CiAKICAgLyogU2FuaXR5IGNoZWNrIG9mIGFsbG9jYXRlZCBTQlIgZWxlbWVudHMuICovCi0gIGZvciAoc2JyRWxlbWVudE51bT0wOyBzYnJFbGVtZW50TnVtPHNlbGYtPm51bVNickVsZW1lbnRzOyBzYnJFbGVtZW50TnVtKyspIHsKKyAgZm9yIChzYnJFbGVtZW50TnVtID0gMDsgc2JyRWxlbWVudE51bSA8IHNlbGYtPm51bVNickVsZW1lbnRzOworICAgICAgIHNickVsZW1lbnROdW0rKykgewogICAgIGlmIChzZWxmLT5wU2JyRWxlbWVudFtzYnJFbGVtZW50TnVtXSA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gU0JSREVDX0NSRUFURV9FUlJPUjsKKyAgICAgIHJldHVybiBTQlJERUNfTk9UX0lOSVRJQUxJWkVEOwogICAgIH0KICAgfQogCkBAIC0xNTY4LDY5ICsxODQxLDY4IEBACiAgICAgcHNQb3NzaWJsZSA9IDA7CiAgIH0KIAotCi0gIC8qIEluIGNhc2Ugb2Ygbm9uLWludGVybGVhdmVkIHRpbWUgZG9tYWluIGRhdGEgYW5kIHVwc2FtcGxpbmcsIG1ha2Ugcm9vbSBmb3IgYmlnZ2VyIFNCUiBvdXRwdXQuICovCi0gIGlmIChzZWxmLT5zeW5Eb3duc2FtcGxlRmFjID09IDEgJiYgaW50ZXJsZWF2ZWQgPT0gMCkgewotICAgIGludCBjLCBvdXRwdXRGcmFtZVNpemU7Ci0KLSAgICBvdXRwdXRGcmFtZVNpemUgPQotICAgICAgICAgICAgc2VsZi0+cFNickVsZW1lbnRbMF0tPnBTYnJDaGFubmVsWzBdLT5TYnJEZWMuU3ludGhlc2lzUU1GLm5vX2NoYW5uZWxzCi0gICAgICAgICAgICAqIHNlbGYtPnBTYnJFbGVtZW50WzBdLT5wU2JyQ2hhbm5lbFswXS0+U2JyRGVjLlN5bnRoZXNpc1FNRi5ub19jb2w7Ci0KLSAgICBmb3IgKGM9bnVtQ29yZUNoYW5uZWxzLTE7IGM+MDsgYy0tKSB7Ci0gICAgICBGREttZW1tb3ZlKHRpbWVEYXRhICsgYypvdXRwdXRGcmFtZVNpemUsIHRpbWVEYXRhICsgYypzZWxmLT5jb2RlY0ZyYW1lU2l6ZSAsIHNlbGYtPmNvZGVjRnJhbWVTaXplKnNpemVvZihJTlRfUENNKSk7Ci0gICAgfQotICB9Ci0KLQotICAvKiBNYWtlIHN1cmUgdGhhdCBldmVuIGlmIG5vIFNCUiBkYXRhIHdhcyBmb3VuZC9wYXJzZWQgKnBzRGVjb2RlZCBpcyByZXR1cm5lZCAxIGlmIHBzUG9zc2libGUgd2FzIDAuICovCisgIC8qIE1ha2Ugc3VyZSB0aGF0IGV2ZW4gaWYgbm8gU0JSIGRhdGEgd2FzIGZvdW5kL3BhcnNlZCAqcHNEZWNvZGVkIGlzIHJldHVybmVkCisgICAqIDEgaWYgcHNQb3NzaWJsZSB3YXMgMC4gKi8KICAgaWYgKHBzUG9zc2libGUgPT0gMCkgewogICAgIHNlbGYtPmZsYWdzICY9IH5TQlJERUNfUFNfREVDT0RFRDsKICAgfQogCi0gIGlmICggc2VsZi0+ZmxhZ3MgJiBTQlJERUNfRkxVU0ggKSB7CisgIC8qIHJlcGxhY2VzIGNoYW5uZWwgYmFzZWQgcmVzZXQgaW5zaWRlIHNicl9kZWMoKSAqLworICBpZiAoKChzZWxmLT5mbGFncyAmIFNCUkRFQ19MT1dfUE9XRVIpID8gMSA6IDApICE9CisgICAgICAoKHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYuZmxhZ3MgJiBRTUZfRkxBR19MUCkgPyAxIDogMCkpIHsKKyAgICBpZiAoc2VsZi0+ZmxhZ3MgJiBTQlJERUNfTE9XX1BPV0VSKSB7CisgICAgICBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLmZsYWdzIHw9IFFNRl9GTEFHX0xQOworICAgICAgc2VsZi0+cFFtZkRvbWFpbi0+Z2xvYmFsQ29uZi5mbGFnc19yZXF1ZXN0ZWQgfD0gUU1GX0ZMQUdfTFA7CisgICAgfSBlbHNlIHsKKyAgICAgIHNlbGYtPnBRbWZEb21haW4tPmdsb2JhbENvbmYuZmxhZ3MgJj0gflFNRl9GTEFHX0xQOworICAgICAgc2VsZi0+cFFtZkRvbWFpbi0+Z2xvYmFsQ29uZi5mbGFnc19yZXF1ZXN0ZWQgJj0gflFNRl9GTEFHX0xQOworICAgIH0KKyAgICBpZiAoRkRLX1FtZkRvbWFpbl9Jbml0RmlsdGVyQmFuayhzZWxmLT5wUW1mRG9tYWluLCBRTUZfRkxBR19LRUVQX1NUQVRFUykpIHsKKyAgICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOworICAgIH0KKyAgfQorICBpZiAoc2VsZi0+bnVtU2JyQ2hhbm5lbHMgPiBzZWxmLT5wUW1mRG9tYWluLT5nbG9iYWxDb25mLm5JbnB1dENoYW5uZWxzKSB7CisgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CisgIH0KKworICBpZiAoc2VsZi0+ZmxhZ3MgJiBTQlJERUNfRkxVU0gpIHsKICAgICAvKiBmbHVzaGluZyBpcyBzaWduYWxpemVkLCBoZW5jZSBpbmNyZW1lbnQgdGhlIGZsdXNoIGZyYW1lIGNvdW50ZXIgKi8KICAgICBzZWxmLT5udW1GbHVzaGVkRnJhbWVzKys7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgLyogbm8gZmx1c2hpbmcgaXMgc2lnbmFsaXplZCwgaGVuY2UgcmVzZXQgdGhlIGZsdXNoIGZyYW1lIGNvdW50ZXIgKi8KICAgICBzZWxmLT5udW1GbHVzaGVkRnJhbWVzID0gMDsKICAgfQogCiAgIC8qIExvb3Agb3ZlciBTQlIgZWxlbWVudHMgKi8KLSAgZm9yIChzYnJFbGVtZW50TnVtID0gMDsgc2JyRWxlbWVudE51bTxzZWxmLT5udW1TYnJFbGVtZW50czsgc2JyRWxlbWVudE51bSsrKQotICB7CisgIGZvciAoc2JyRWxlbWVudE51bSA9IDA7IHNickVsZW1lbnROdW0gPCBzZWxmLT5udW1TYnJFbGVtZW50czsKKyAgICAgICBzYnJFbGVtZW50TnVtKyspIHsKICAgICBpbnQgbnVtRWxlbWVudENoYW47CiAKLSAgICBpZiAocHNQb3NzaWJsZSAmJiBzZWxmLT5wU2JyRWxlbWVudFtzYnJFbGVtZW50TnVtXS0+cFNickNoYW5uZWxbMV0gPT0gTlVMTCkgeworICAgIGlmIChwc1Bvc3NpYmxlICYmCisgICAgICAgIHNlbGYtPnBTYnJFbGVtZW50W3NickVsZW1lbnROdW1dLT5wU2JyQ2hhbm5lbFsxXSA9PSBOVUxMKSB7CiAgICAgICAvKiBEaXNhYmxlIFBTIGFuZCB0cnkgZGVjb2RpbmcgU0JSIG1vbm8uICovCiAgICAgICBwc1Bvc3NpYmxlID0gMDsKICAgICB9CiAKLSAgICBudW1FbGVtZW50Q2hhbiA9IChzZWxmLT5wU2JyRWxlbWVudFtzYnJFbGVtZW50TnVtXS0+ZWxlbWVudElEID09IElEX0NQRSkgPyAyIDogMTsKKyAgICBudW1FbGVtZW50Q2hhbiA9CisgICAgICAgIChzZWxmLT5wU2JyRWxlbWVudFtzYnJFbGVtZW50TnVtXS0+ZWxlbWVudElEID09IElEX0NQRSkgPyAyIDogMTsKIAogICAgIC8qIElmIGNvcmUgc2lnbmFsIGlzIGJhZCB0aGVuIGZvcmNlIHVwc2FtcGxpbmcgKi8KLSAgICBpZiAoICEgY29yZURlY29kZWRPayApIHsKLSAgICAgIHNlbGYtPnBTYnJFbGVtZW50W3NickVsZW1lbnROdW1dLT5mcmFtZUVycm9yRmxhZ1tzZWxmLT5wU2JyRWxlbWVudFtzYnJFbGVtZW50TnVtXS0+dXNlRnJhbWVTbG90XSA9IDE7CisgICAgaWYgKCFjb3JlRGVjb2RlZE9rKSB7CisgICAgICBzZXRGcmFtZUVycm9yRmxhZyhzZWxmLT5wU2JyRWxlbWVudFtzYnJFbGVtZW50TnVtXSwgRlJBTUVfRVJST1JfQUxMU0xPVFMpOwogICAgIH0KIAotICAgIGVycm9yU3RhdHVzID0gc2JyRGVjb2Rlcl9EZWNvZGVFbGVtZW50ICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybGVhdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbGVtZW50TnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ29yZUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtRWxlbWVudENoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc1Bvc3NpYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBlcnJvclN0YXR1cyA9IHNickRlY29kZXJfRGVjb2RlRWxlbWVudCgKKyAgICAgICAgc2VsZiwgaW5wdXQsIHRpbWVEYXRhLCB0aW1lRGF0YVNpemUsIG1hcERlc2NyLCBtYXBJZHgsIG51bVNickNoYW5uZWxzLAorICAgICAgICBzYnJFbGVtZW50TnVtLAorICAgICAgICBudW1Db3JlQ2hhbm5lbHMsIC8qIGlzIGNvcnJlY3QgZXZlbiBmb3IgVVNDIFNDST09MiBjYXNlICovCisgICAgICAgICZudW1FbGVtZW50Q2hhbiwgcHNQb3NzaWJsZSk7CiAKICAgICBpZiAoZXJyb3JTdGF0dXMgIT0gU0JSREVDX09LKSB7CiAgICAgICBnb3RvIGJhaWw7CiAgICAgfQogCiAgICAgbnVtU2JyQ2hhbm5lbHMgKz0gbnVtRWxlbWVudENoYW47Ci0gICAgY2hhbm5lbE1hcHBpbmcgKz0gbnVtRWxlbWVudENoYW47CiAKICAgICBpZiAobnVtU2JyQ2hhbm5lbHMgPj0gbnVtQ29yZUNoYW5uZWxzKSB7CiAgICAgICBicmVhazsKQEAgLTE2MzgsMTMgKzE5MTAsMTYgQEAKICAgfQogCiAgIC8qIFVwZGF0ZSBudW1DaGFubmVscyBhbmQgc2FtcGxlcmF0ZSAqLwotICAqbnVtQ2hhbm5lbHMgPSBudW1TYnJDaGFubmVsczsKKyAgLyogRG8gbm90IG1lc3Mgd2l0aCBvdXRwdXQgY2hhbm5lbHMgaW4gY2FzZSBvZiBVU0FDLiBudW1TYnJDaGFubmVscyAhPQorICAgKiBudW1DaGFubmVscyBmb3Igc3RlcmVvQ29uZmlnSW5kZXggPT0gMiAqLworICBpZiAoIShzZWxmLT5mbGFncyAmIFNCUkRFQ19TWU5UQVhfVVNBQykpIHsKKyAgICAqbnVtQ2hhbm5lbHMgPSBudW1TYnJDaGFubmVsczsKKyAgfQogICAqc2FtcGxlUmF0ZSA9IHNlbGYtPnNhbXBsZVJhdGVPdXQ7CiAgICpwc0RlY29kZWQgPSAoc2VsZi0+ZmxhZ3MgJiBTQlJERUNfUFNfREVDT0RFRCkgPyAxIDogMDsKIAotCi0KLSAgLyogQ2xlYXIgcmVzZXQgYW5kIGZsdXNoIGZsYWcgYmVjYXVzZSBldmVyeXRoaW5nIHNlZW1zIHRvIGJlIGRvbmUgc3VjY2Vzc2Z1bGx5LiAqLworICAvKiBDbGVhciByZXNldCBhbmQgZmx1c2ggZmxhZyBiZWNhdXNlIGV2ZXJ5dGhpbmcgc2VlbXMgdG8gYmUgZG9uZQorICAgKiBzdWNjZXNzZnVsbHkuICovCiAgIHNlbGYtPmZsYWdzICY9IH5TQlJERUNfRk9SQ0VfUkVTRVQ7CiAgIHNlbGYtPmZsYWdzICY9IH5TQlJERUNfRkxVU0g7CiAKQEAgLTE2NTMsMjcgKzE5MjgsMTcgQEAKICAgcmV0dXJuIGVycm9yU3RhdHVzOwogfQogCi0KLVNCUl9FUlJPUiBzYnJEZWNvZGVyX0Nsb3NlICggSEFORExFX1NCUkRFQ09ERVIgKnBTZWxmICkKLXsKK1NCUl9FUlJPUiBzYnJEZWNvZGVyX0Nsb3NlKEhBTkRMRV9TQlJERUNPREVSICpwU2VsZikgewogICBIQU5ETEVfU0JSREVDT0RFUiBzZWxmID0gKnBTZWxmOwogICBpbnQgaTsKIAotICBpZiAoc2VsZiAhPSBOVUxMKQotICB7CisgIGlmIChzZWxmICE9IE5VTEwpIHsKICAgICBpZiAoc2VsZi0+aFBhcmFtZXRyaWNTdGVyZW9EZWMgIT0gTlVMTCkgewotICAgICAgRGVsZXRlUHNEZWMgKCAmc2VsZi0+aFBhcmFtZXRyaWNTdGVyZW9EZWMgKTsKLSAgICB9Ci0KLSAgICBpZiAoc2VsZi0+d29ya0J1ZmZlcjEgIT0gTlVMTCkgewotICAgICAgRnJlZVJhbV9TYnJEZWNXb3JrQnVmZmVyMSgmc2VsZi0+d29ya0J1ZmZlcjEpOwotICAgIH0KLSAgICBpZiAoc2VsZi0+d29ya0J1ZmZlcjIgIT0gTlVMTCkgewotICAgICAgRnJlZVJhbV9TYnJEZWNXb3JrQnVmZmVyMigmc2VsZi0+d29ya0J1ZmZlcjIpOworICAgICAgRGVsZXRlUHNEZWMoJnNlbGYtPmhQYXJhbWV0cmljU3RlcmVvRGVjKTsKICAgICB9CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgKDgpOyBpKyspIHsKLSAgICAgIHNickRlY29kZXJfRGVzdHJveUVsZW1lbnQoIHNlbGYsIGkgKTsKKyAgICAgIHNickRlY29kZXJfRGVzdHJveUVsZW1lbnQoc2VsZiwgaSk7CiAgICAgfQogCiAgICAgRnJlZVJhbV9TYnJEZWNvZGVyKHBTZWxmKTsKQEAgLTE2ODIsOSArMTk0Nyw3IEBACiAgIHJldHVybiBTQlJERUNfT0s7CiB9CiAKLQotSU5UIHNickRlY29kZXJfR2V0TGliSW5mbyggTElCX0lORk8gKmluZm8gKQoteworSU5UIHNickRlY29kZXJfR2V0TGliSW5mbyhMSUJfSU5GTyAqaW5mbykgewogICBpbnQgaTsKIAogICBpZiAoaW5mbyA9PSBOVUxMKSB7CkBAIC0xNjkzLDYyICsxOTU2LDU1IEBACiAKICAgLyogc2VhcmNoIGZvciBuZXh0IGZyZWUgdGFiICovCiAgIGZvciAoaSA9IDA7IGkgPCBGREtfTU9EVUxFX0xBU1Q7IGkrKykgewotICAgIGlmIChpbmZvW2ldLm1vZHVsZV9pZCA9PSBGREtfTk9ORSkKLSAgICAgIGJyZWFrOworICAgIGlmIChpbmZvW2ldLm1vZHVsZV9pZCA9PSBGREtfTk9ORSkgYnJlYWs7CiAgIH0KLSAgaWYgKGkgPT0gRkRLX01PRFVMRV9MQVNUKQotICAgIHJldHVybiAtMTsKKyAgaWYgKGkgPT0gRkRLX01PRFVMRV9MQVNUKSByZXR1cm4gLTE7CiAgIGluZm8gKz0gaTsKIAogICBpbmZvLT5tb2R1bGVfaWQgPSBGREtfU0JSREVDOwotICBpbmZvLT52ZXJzaW9uID0gTElCX1ZFUlNJT04oU0JSREVDT0RFUl9MSUJfVkwwLCBTQlJERUNPREVSX0xJQl9WTDEsIFNCUkRFQ09ERVJfTElCX1ZMMik7CisgIGluZm8tPnZlcnNpb24gPQorICAgICAgTElCX1ZFUlNJT04oU0JSREVDT0RFUl9MSUJfVkwwLCBTQlJERUNPREVSX0xJQl9WTDEsIFNCUkRFQ09ERVJfTElCX1ZMMik7CiAgIExJQl9WRVJTSU9OX1NUUklORyhpbmZvKTsKLSAgaW5mby0+YnVpbGRfZGF0ZSA9IChjaGFyICopU0JSREVDT0RFUl9MSUJfQlVJTERfREFURTsKLSAgaW5mby0+YnVpbGRfdGltZSA9IChjaGFyICopU0JSREVDT0RFUl9MSUJfQlVJTERfVElNRTsKLSAgaW5mby0+dGl0bGUgICAgICA9IChjaGFyICopU0JSREVDT0RFUl9MSUJfVElUTEU7CisgIGluZm8tPmJ1aWxkX2RhdGUgPSBTQlJERUNPREVSX0xJQl9CVUlMRF9EQVRFOworICBpbmZvLT5idWlsZF90aW1lID0gU0JSREVDT0RFUl9MSUJfQlVJTERfVElNRTsKKyAgaW5mby0+dGl0bGUgPSBTQlJERUNPREVSX0xJQl9USVRMRTsKIAogICAvKiBTZXQgZmxhZ3MgKi8KLSAgaW5mby0+ZmxhZ3MgPSAwCi0gICAgfCBDQVBGX1NCUl9IUQotICAgIHwgQ0FQRl9TQlJfTFAKLSAgICB8IENBUEZfU0JSX1BTX01QRUcKLSAgICB8IENBUEZfU0JSX0RSTV9CUwotICAgIHwgQ0FQRl9TQlJfQ09OQ0VBTE1FTlQKLSAgICB8IENBUEZfU0JSX0RSQwotICAgICAgOworICBpbmZvLT5mbGFncyA9IDAgfCBDQVBGX1NCUl9IUSB8IENBUEZfU0JSX0xQIHwgQ0FQRl9TQlJfUFNfTVBFRyB8CisgICAgICAgICAgICAgICAgQ0FQRl9TQlJfRFJNX0JTIHwgQ0FQRl9TQlJfQ09OQ0VBTE1FTlQgfCBDQVBGX1NCUl9EUkMgfAorICAgICAgICAgICAgICAgIENBUEZfU0JSX0VMRF9ET1dOU0NBTEUgfCBDQVBGX1NCUl9IQkVIUTsKICAgLyogRW5kIG9mIGZsYWdzICovCiAKICAgcmV0dXJuIDA7CiB9CiAKLQotVUlOVCBzYnJEZWNvZGVyX0dldERlbGF5KCBjb25zdCBIQU5ETEVfU0JSREVDT0RFUiBzZWxmICkKLXsKK1VJTlQgc2JyRGVjb2Rlcl9HZXREZWxheShjb25zdCBIQU5ETEVfU0JSREVDT0RFUiBzZWxmKSB7CiAgIFVJTlQgb3V0cHV0RGVsYXkgPSAwOwogCi0gIGlmICggc2VsZiAhPSBOVUxMKSB7CisgIGlmIChzZWxmICE9IE5VTEwpIHsKICAgICBVSU5UIGZsYWdzID0gc2VsZi0+ZmxhZ3M7CiAKICAgICAvKiBTZWUgY2hhcHRlciAxLjYuNy4yIG9mIElTTy9JRUMgMTQ0OTYtMyBmb3IgdGhlIEdBLVNCUiBmaWd1cmVzIGJlbG93LiAqLwogCiAgICAgLyogQXJlIHdlIGluaXRpYWxpemVkPyAqLwotICAgIGlmICggKHNlbGYtPm51bVNickNoYW5uZWxzID4gMCkKLSAgICAgICYmIChzZWxmLT5udW1TYnJFbGVtZW50cyA+IDApICkKLSAgICB7CisgICAgaWYgKChzZWxmLT5udW1TYnJDaGFubmVscyA+IDApICYmIChzZWxmLT5udW1TYnJFbGVtZW50cyA+IDApKSB7CiAgICAgICAvKiBBZGQgUU1GIHN5bnRoZXNpcyBkZWxheSAqLwotICAgICAgaWYgKCAoZmxhZ3MgJiBTQlJERUNfRUxEX0dSSUQpCi0gICAgICAgICYmIElTX0xPV0RFTEFZKHNlbGYtPmNvcmVDb2RlYykgKSB7CisgICAgICBpZiAoKGZsYWdzICYgU0JSREVDX0VMRF9HUklEKSAmJiBJU19MT1dERUxBWShzZWxmLT5jb3JlQ29kZWMpKSB7CiAgICAgICAgIC8qIExvdyBkZWxheSBTQlI6ICovCi0gICAgICAgIHsKLSAgICAgICAgICBvdXRwdXREZWxheSArPSAoZmxhZ3MgJiBTQlJERUNfRE9XTlNBTVBMRSkgPyAzMiA6IDY0OyAgIC8qIFFNRiBzeW50aGVzaXMgKi8KKyAgICAgICAgaWYgKCEoZmxhZ3MgJiBTQlJERUNfU0tJUF9RTUZfU1lOKSkgeworICAgICAgICAgIG91dHB1dERlbGF5ICs9CisgICAgICAgICAgICAgIChmbGFncyAmIFNCUkRFQ19ET1dOU0FNUExFKSA/IDMyIDogNjQ7IC8qIFFNRiBzeW50aGVzaXMgKi8KICAgICAgICAgICBpZiAoZmxhZ3MgJiBTQlJERUNfTERfTVBTX1FNRikgewogICAgICAgICAgICAgb3V0cHV0RGVsYXkgKz0gMzI7CiAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICghSVNfVVNBQyhzZWxmLT5jb3JlQ29kZWMpKSB7Ci0gICAgICAgIC8qIEJ5IHRoZSBtZXRob2Qgb2YgZWxpbWluYXRpb24gdGhpcyBpcyB0aGUgR0EgKEFBQy1MQywgSEUtQUFDLCAuLi4pIGJyYW5jaDogKi8KKyAgICAgIH0gZWxzZSBpZiAoIUlTX1VTQUMoc2VsZi0+Y29yZUNvZGVjKSkgeworICAgICAgICAvKiBCeSB0aGUgbWV0aG9kIG9mIGVsaW1pbmF0aW9uIHRoaXMgaXMgdGhlIEdBIChBQUMtTEMsIEhFLUFBQywgLi4uKQorICAgICAgICAgKiBicmFuY2g6ICovCiAgICAgICAgIG91dHB1dERlbGF5ICs9IChmbGFncyAmIFNCUkRFQ19ET1dOU0FNUExFKSA/IDQ4MSA6IDk2MjsKKyAgICAgICAgaWYgKGZsYWdzICYgU0JSREVDX1NLSVBfUU1GX1NZTikgeworICAgICAgICAgIG91dHB1dERlbGF5IC09IDI1NzsgLyogUU1GIHN5bnRoZXNpcyAqLworICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3RyYW5zY2VuZGVudC5oIGIvbGliU0JSZGVjL3NyYy90cmFuc2NlbmRlbnQuaAppbmRleCBhZDg4YmM5Li4wZTgxNWMyIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL3RyYW5zY2VuZGVudC5oCisrKyBiL2xpYlNCUmRlYy9zcmMvdHJhbnNjZW5kZW50LmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTUgKzkwLDIzIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGRlY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgRkRLIEZpeGVkIFBvaW50IEFyaXRobWV0aWMgTGlicmFyeSBJbnRlcmZhY2UgIAorICBcYnJpZWYgIEZESyBGaXhlZCBQb2ludCBBcml0aG1ldGljIExpYnJhcnkgSW50ZXJmYWNlCiAqLwogCi0jaWZuZGVmIF9fVFJBTlNDRU5ERU5UX0gKLSNkZWZpbmUgX19UUkFOU0NFTkRFTlRfSAorI2lmbmRlZiBUUkFOU0NFTkRFTlRfSAorI2RlZmluZSBUUkFOU0NFTkRFTlRfSAogCiAjaW5jbHVkZSAic2JyZGVjb2Rlci5oIgogI2luY2x1ZGUgInNicl9yb20uaCIKQEAgLTEwNSwxMCArMTI0LDkgQEAKIHN0YXRpYyBpbmxpbmUgRklYUF9TR0wgRkRLX2dldE51bU9jdGF2ZXNEaXY4KElOVCBhLCAvKiE8IGxvd2VyIGJhbmQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBiKSAvKiE8IHVwcGVyIGJhbmQgKi8KIHsKLSAgcmV0dXJuICggKFNIT1JUKSgoTE9ORykoQ2FsY0xkSW50KGIpIC0gQ2FsY0xkSW50KGEpKT4+KEZSQUNUX0JJVFMtMykpICk7CisgIHJldHVybiAoKFNIT1JUKSgoTE9ORykoQ2FsY0xkSW50KGIpIC0gQ2FsY0xkSW50KGEpKSA+PiAoRlJBQ1RfQklUUyAtIDMpKSk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQogICBcYnJpZWYgICBBZGQgdHdvIHZhbHVlcyBnaXZlbiBieSBtYW50aXNzYSBhbmQgZXhwb25lbnQuCkBAIC0xMTgsMTUgKzEzNiwxNSBAQAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbmxpbmUgdm9pZCBGREtfYWRkX01hbnRFeHAoRklYUF9TR0wgYV9tLCAvKiE8IE1hbnRpc3NhIG9mIDFzdCBvcGVyYW5kIGEgKi8KLSAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICBhX2UsICAgICAgIC8qITwgRXhwb25lbnQgb2YgMXN0IG9wZXJhbmQgYSAqLwotICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgIGJfbSwgICAgICAgLyohPCBNYW50aXNzYSBvZiAybmQgb3BlcmFuZCBiICovCi0gICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgYl9lLCAgICAgICAvKiE8IEV4cG9uZW50IG9mIDJuZCBvcGVyYW5kIGIgKi8KLSAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICpwdHJTdW1fbSwgIC8qITwgTWFudGlzc2Egb2YgcmVzdWx0ICovCi0gICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqcHRyU3VtX2UpICAvKiE8IEV4cG9uZW50IG9mIHJlc3VsdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSIGFfZSwgICAgLyohPCBFeHBvbmVudCBvZiAxc3Qgb3BlcmFuZCBhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9TR0wgYl9tLCAvKiE8IE1hbnRpc3NhIG9mIDJuZCBvcGVyYW5kIGIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiBiX2UsICAgIC8qITwgRXhwb25lbnQgb2YgMm5kIG9wZXJhbmQgYiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfU0dMICpwdHJTdW1fbSwgLyohPCBNYW50aXNzYSBvZiByZXN1bHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqcHRyU3VtX2UpICAgIC8qITwgRXhwb25lbnQgb2YgcmVzdWx0ICovCiB7CiAgIEZJWFBfREJMIGFjY3U7Ci0gIGludCAgIHNoaWZ0OwotICBpbnQgICBzaGlmdEFiczsKKyAgaW50IHNoaWZ0OworICBpbnQgc2hpZnRBYnM7CiAKICAgRklYUF9EQkwgc2hpZnRlZE1hbnRpc3NhOwogICBGSVhQX0RCTCBvdGhlck1hbnRpc3NhOwpAQCAtMTM3LDM0ICsxNTUsMzUgQEAKIAogICBzaGlmdCA9IChpbnQpKGFfZSAtIGJfZSk7CiAKLSAgc2hpZnRBYnMgPSAoc2hpZnQ+MCk/IHNoaWZ0IDogLXNoaWZ0OwotICBzaGlmdEFicyA9IChzaGlmdEFicyA8IERGUkFDVF9CSVRTLTEpPyBzaGlmdEFicyA6IERGUkFDVF9CSVRTLTE7Ci0gIHNoaWZ0ZWRNYW50aXNzYSA9IChzaGlmdD4wKT8gKEZYX1NHTDJGWF9EQkwoYl9tKSA+PiBzaGlmdEFicykgOiAoRlhfU0dMMkZYX0RCTChhX20pID4+IHNoaWZ0QWJzKTsKLSAgb3RoZXJNYW50aXNzYSA9IChzaGlmdD4wKT8gRlhfU0dMMkZYX0RCTChhX20pIDogRlhfU0dMMkZYX0RCTChiX20pOwotICAqcHRyU3VtX2UgPSAoc2hpZnQ+MCk/IGFfZSA6IGJfZTsKKyAgc2hpZnRBYnMgPSAoc2hpZnQgPiAwKSA/IHNoaWZ0IDogLXNoaWZ0OworICBzaGlmdEFicyA9IChzaGlmdEFicyA8IERGUkFDVF9CSVRTIC0gMSkgPyBzaGlmdEFicyA6IERGUkFDVF9CSVRTIC0gMTsKKyAgc2hpZnRlZE1hbnRpc3NhID0gKHNoaWZ0ID4gMCkgPyAoRlhfU0dMMkZYX0RCTChiX20pID4+IHNoaWZ0QWJzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChGWF9TR0wyRlhfREJMKGFfbSkgPj4gc2hpZnRBYnMpOworICBvdGhlck1hbnRpc3NhID0gKHNoaWZ0ID4gMCkgPyBGWF9TR0wyRlhfREJMKGFfbSkgOiBGWF9TR0wyRlhfREJMKGJfbSk7CisgICpwdHJTdW1fZSA9IChzaGlmdCA+IDApID8gYV9lIDogYl9lOwogCiAgIGFjY3UgPSAoc2hpZnRlZE1hbnRpc3NhID4+IDEpICsgKG90aGVyTWFudGlzc2EgPj4gMSk7CiAgIC8qIHNoaWZ0IGJ5IDEgYml0IHRvIGF2b2lkIG92ZXJmbG93ICovCiAKLSAgaWYgKCAoYWNjdSA+PSAoRkwyRlhDT05TVF9EQkwoMC41ZikgLSAoRklYUF9EQkwpMSkpIHx8IChhY2N1IDw9IEZMMkZYQ09OU1RfREJMKC0wLjVmKSkgKQorICBpZiAoKGFjY3UgPj0gKEZMMkZYQ09OU1RfREJMKDAuNWYpIC0gKEZJWFBfREJMKTEpKSB8fAorICAgICAgKGFjY3UgPD0gRkwyRlhDT05TVF9EQkwoLTAuNWYpKSkKICAgICAqcHRyU3VtX2UgKz0gMTsKICAgZWxzZQogICAgIGFjY3UgPSAoc2hpZnRlZE1hbnRpc3NhICsgb3RoZXJNYW50aXNzYSk7CiAKICAgKnB0clN1bV9tID0gRlhfREJMMkZYX1NHTChhY2N1KTsKLQogfQogCi1pbmxpbmUgdm9pZCBGREtfYWRkX01hbnRFeHAoRklYUF9EQkwgYSwgICAvKiE8IE1hbnRpc3NhIG9mIDFzdCBvcGVyYW5kIGEgKi8KLSAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICBhX2UsICAgICAgIC8qITwgRXhwb25lbnQgb2YgMXN0IG9wZXJhbmQgYSAqLwotICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgIGIsICAgICAgICAgLyohPCBNYW50aXNzYSBvZiAybmQgb3BlcmFuZCBiICovCi0gICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgYl9lLCAgICAgICAvKiE8IEV4cG9uZW50IG9mIDJuZCBvcGVyYW5kIGIgKi8KLSAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwdHJTdW0sICAgIC8qITwgTWFudGlzc2Egb2YgcmVzdWx0ICovCi0gICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqcHRyU3VtX2UpICAvKiE8IEV4cG9uZW50IG9mIHJlc3VsdCAqLworaW5saW5lIHZvaWQgRkRLX2FkZF9NYW50RXhwKEZJWFBfREJMIGEsICAgICAgIC8qITwgTWFudGlzc2Egb2YgMXN0IG9wZXJhbmQgYSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSIGFfZSwgICAgICAgIC8qITwgRXhwb25lbnQgb2YgMXN0IG9wZXJhbmQgYSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGIsICAgICAgIC8qITwgTWFudGlzc2Egb2YgMm5kIG9wZXJhbmQgYiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSIGJfZSwgICAgICAgIC8qITwgRXhwb25lbnQgb2YgMm5kIG9wZXJhbmQgYiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwdHJTdW0sIC8qITwgTWFudGlzc2Egb2YgcmVzdWx0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgKnB0clN1bV9lKSAgLyohPCBFeHBvbmVudCBvZiByZXN1bHQgKi8KIHsKICAgRklYUF9EQkwgYWNjdTsKLSAgaW50ICAgc2hpZnQ7Ci0gIGludCAgIHNoaWZ0QWJzOworICBpbnQgc2hpZnQ7CisgIGludCBzaGlmdEFiczsKIAogICBGSVhQX0RCTCBzaGlmdGVkTWFudGlzc2E7CiAgIEZJWFBfREJMIG90aGVyTWFudGlzc2E7CkBAIC0xNzUsMjIgKzE5NCwyMiBAQAogCiAgIHNoaWZ0ID0gKGludCkoYV9lIC0gYl9lKTsKIAotICBzaGlmdEFicyA9IChzaGlmdD4wKT8gc2hpZnQgOiAtc2hpZnQ7Ci0gIHNoaWZ0QWJzID0gKHNoaWZ0QWJzIDwgREZSQUNUX0JJVFMtMSk/IHNoaWZ0QWJzIDogREZSQUNUX0JJVFMtMTsKLSAgc2hpZnRlZE1hbnRpc3NhID0gKHNoaWZ0PjApPyAoYiA+PiBzaGlmdEFicykgOiAoYSA+PiBzaGlmdEFicyk7Ci0gIG90aGVyTWFudGlzc2EgPSAoc2hpZnQ+MCk/IGEgOiBiOwotICAqcHRyU3VtX2UgPSAoc2hpZnQ+MCk/IGFfZSA6IGJfZTsKKyAgc2hpZnRBYnMgPSAoc2hpZnQgPiAwKSA/IHNoaWZ0IDogLXNoaWZ0OworICBzaGlmdEFicyA9IChzaGlmdEFicyA8IERGUkFDVF9CSVRTIC0gMSkgPyBzaGlmdEFicyA6IERGUkFDVF9CSVRTIC0gMTsKKyAgc2hpZnRlZE1hbnRpc3NhID0gKHNoaWZ0ID4gMCkgPyAoYiA+PiBzaGlmdEFicykgOiAoYSA+PiBzaGlmdEFicyk7CisgIG90aGVyTWFudGlzc2EgPSAoc2hpZnQgPiAwKSA/IGEgOiBiOworICAqcHRyU3VtX2UgPSAoc2hpZnQgPiAwKSA/IGFfZSA6IGJfZTsKIAogICBhY2N1ID0gKHNoaWZ0ZWRNYW50aXNzYSA+PiAxKSArIChvdGhlck1hbnRpc3NhID4+IDEpOwogICAvKiBzaGlmdCBieSAxIGJpdCB0byBhdm9pZCBvdmVyZmxvdyAqLwogCi0gIGlmICggKGFjY3UgPj0gKEZMMkZYQ09OU1RfREJMKDAuNWYpIC0gKEZJWFBfREJMKTEpKSB8fCAoYWNjdSA8PSBGTDJGWENPTlNUX0RCTCgtMC41ZikpICkKKyAgaWYgKChhY2N1ID49IChGTDJGWENPTlNUX0RCTCgwLjVmKSAtIChGSVhQX0RCTCkxKSkgfHwKKyAgICAgIChhY2N1IDw9IEZMMkZYQ09OU1RfREJMKC0wLjVmKSkpCiAgICAgKnB0clN1bV9lICs9IDE7CiAgIGVsc2UKICAgICBhY2N1ID0gKHNoaWZ0ZWRNYW50aXNzYSArIG90aGVyTWFudGlzc2EpOwogCiAgICpwdHJTdW0gPSBhY2N1OwotCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMDQsMTcgKzIyMywxOCBAQAogICB3aGljaCBsaW1pdHMgYWNjdXJhY3kuCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBGREtfZGl2aWRlX01hbnRFeHAoRklYUF9TR0wgYV9tLCAgICAgICAgICAgLyohPCBNYW50aXNzYSBvZiBkaXZpZGVuZCBhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICBhX2UsICAgICAgICAgIC8qITwgRXhwb25lbnQgb2YgZGl2aWRlbmQgYSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAgYl9tLCAgICAgICAgICAvKiE8IE1hbnRpc3NhIG9mIGRpdmlzb3IgYiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgYl9lLCAgICAgICAgICAvKiE8IEV4cG9uZW50IG9mIGRpdmlzb3IgYiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1NHTCAqcHRyUmVzdWx0X20sICAvKiE8IE1hbnRpc3NhIG9mIHF1b3RpZW50IGEvYiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqcHRyUmVzdWx0X2UpICAvKiE8IEV4cG9uZW50IG9mIHF1b3RpZW50IGEvYiAqLworc3RhdGljIGlubGluZSB2b2lkIEZES19kaXZpZGVfTWFudEV4cCgKKyAgICBGSVhQX1NHTCBhX20sICAgICAgICAgIC8qITwgTWFudGlzc2Egb2YgZGl2aWRlbmQgYSAqLworICAgIFNDSEFSIGFfZSwgICAgICAgICAgICAgLyohPCBFeHBvbmVudCBvZiBkaXZpZGVuZCBhICovCisgICAgRklYUF9TR0wgYl9tLCAgICAgICAgICAvKiE8IE1hbnRpc3NhIG9mIGRpdmlzb3IgYiAqLworICAgIFNDSEFSIGJfZSwgICAgICAgICAgICAgLyohPCBFeHBvbmVudCBvZiBkaXZpc29yIGIgKi8KKyAgICBGSVhQX1NHTCAqcHRyUmVzdWx0X20sIC8qITwgTWFudGlzc2Egb2YgcXVvdGllbnQgYS9iICovCisgICAgU0NIQVIgKnB0clJlc3VsdF9lKSAgICAvKiE8IEV4cG9uZW50IG9mIHF1b3RpZW50IGEvYiAqLwogCiB7CiAgIGludCBwcmVTaGlmdCwgcG9zdFNoaWZ0LCBpbmRleCwgc2hpZnQ7CiAgIEZJWFBfREJMIHJhdGlvX207Ci0gIEZJWFBfU0dMICBiSW52X20gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKKyAgRklYUF9TR0wgYkludl9tID0gRkwyRlhDT05TVF9TR0woMC4wZik7CiAKICAgcHJlU2hpZnQgPSBDbnRMZWFkaW5nWmVyb3MoRlhfU0dMMkZYX0RCTChiX20pKTsKIApAQCAtMjM2LDQxICsyNTYsNDEgQEAKICAgKi8KICAgc2hpZnQgPSAoRlJBQ1RfQklUUyAtIDIgLSBJTlZfVEFCTEVfQklUUyAtIHByZVNoaWZ0KTsKIAotICBpbmRleCA9IChzaGlmdDwwKT8gKExPTkcpYl9tIDw8ICgtc2hpZnQpIDogKExPTkcpYl9tID4+IHNoaWZ0OwotCisgIGluZGV4ID0gKHNoaWZ0IDwgMCkgPyAoTE9ORyliX20gPDwgKC1zaGlmdCkgOiAoTE9ORyliX20gPj4gc2hpZnQ7CiAKICAgLyogVGhlIGluZGV4IGhhcyBJTlZfVEFCTEVfQklUUyArMSB2YWxpZCBiaXRzIGhlcmUuIENsZWFyIHRoZSBvdGhlciBiaXRzLiAqLwotICBpbmRleCAmPSAoMSA8PCAoSU5WX1RBQkxFX0JJVFMrMSkpIC0gMTsKKyAgaW5kZXggJj0gKDEgPDwgKElOVl9UQUJMRV9CSVRTICsgMSkpIC0gMTsKIAotICAgIC8qIFJlbW92ZSBvZmZzZXQgb2YgaGFsZiBhbiBpbnRlcnZhbCAqLworICAvKiBSZW1vdmUgb2Zmc2V0IG9mIGhhbGYgYW4gaW50ZXJ2YWwgKi8KICAgaW5kZXgtLTsKIAotICAgIC8qIE5vdyB0aGUgbG93ZXN0IGJpdCBpcyBzaGlmdGVkIG91dCAqLworICAvKiBOb3cgdGhlIGxvd2VzdCBiaXQgaXMgc2hpZnRlZCBvdXQgKi8KICAgaW5kZXggPSBpbmRleCA+PiAxOwogCi0gICAgLyogRmV0Y2ggaW52ZXJzZWQgbWFudGlzc2EgZnJvbSB0YWJsZTogKi8KLSAgYkludl9tID0gKGluZGV4PDApPyBiSW52X20gOiBGREtfc2JyRGVjb2Rlcl9pbnZUYWJsZVtpbmRleF07CisgIC8qIEZldGNoIGludmVyc2VkIG1hbnRpc3NhIGZyb20gdGFibGU6ICovCisgIGJJbnZfbSA9IChpbmRleCA8IDApID8gYkludl9tIDogRkRLX3NickRlY29kZXJfaW52VGFibGVbaW5kZXhdOwogCi0gICAgLyogTXVsdGlwbHkgYSB3aXRoIHRoZSBpbnZlcnNlIG9mIGI6ICovCi0gIHJhdGlvX20gPSAoaW5kZXg8MCk/IEZYX1NHTDJGWF9EQkwoYV9tID4+IDEpIDogZk11bHREaXYyKGJJbnZfbSxhX20pOworICAvKiBNdWx0aXBseSBhIHdpdGggdGhlIGludmVyc2Ugb2YgYjogKi8KKyAgcmF0aW9fbSA9IChpbmRleCA8IDApID8gRlhfU0dMMkZYX0RCTChhX20gPj4gMSkgOiBmTXVsdERpdjIoYkludl9tLCBhX20pOwogCi0gIHBvc3RTaGlmdCA9IENudExlYWRpbmdaZXJvcyhyYXRpb19tKS0xOworICBwb3N0U2hpZnQgPSBDbnRMZWFkaW5nWmVyb3MocmF0aW9fbSkgLSAxOwogCiAgICpwdHJSZXN1bHRfbSA9IEZYX0RCTDJGWF9TR0wocmF0aW9fbSA8PCBwb3N0U2hpZnQpOwogICAqcHRyUmVzdWx0X2UgPSBhX2UgLSBiX2UgKyAxICsgcHJlU2hpZnQgLSBwb3N0U2hpZnQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBGREtfZGl2aWRlX01hbnRFeHAoRklYUF9EQkwgYV9tLCAgICAgICAgICAgLyohPCBNYW50aXNzYSBvZiBkaXZpZGVuZCBhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICBhX2UsICAgICAgICAgIC8qITwgRXhwb25lbnQgb2YgZGl2aWRlbmQgYSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgYl9tLCAgICAgICAgICAvKiE8IE1hbnRpc3NhIG9mIGRpdmlzb3IgYiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgYl9lLCAgICAgICAgICAvKiE8IEV4cG9uZW50IG9mIGRpdmlzb3IgYiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcHRyUmVzdWx0X20sICAvKiE8IE1hbnRpc3NhIG9mIHF1b3RpZW50IGEvYiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqcHRyUmVzdWx0X2UpICAvKiE8IEV4cG9uZW50IG9mIHF1b3RpZW50IGEvYiAqLworc3RhdGljIGlubGluZSB2b2lkIEZES19kaXZpZGVfTWFudEV4cCgKKyAgICBGSVhQX0RCTCBhX20sICAgICAgICAgIC8qITwgTWFudGlzc2Egb2YgZGl2aWRlbmQgYSAqLworICAgIFNDSEFSIGFfZSwgICAgICAgICAgICAgLyohPCBFeHBvbmVudCBvZiBkaXZpZGVuZCBhICovCisgICAgRklYUF9EQkwgYl9tLCAgICAgICAgICAvKiE8IE1hbnRpc3NhIG9mIGRpdmlzb3IgYiAqLworICAgIFNDSEFSIGJfZSwgICAgICAgICAgICAgLyohPCBFeHBvbmVudCBvZiBkaXZpc29yIGIgKi8KKyAgICBGSVhQX0RCTCAqcHRyUmVzdWx0X20sIC8qITwgTWFudGlzc2Egb2YgcXVvdGllbnQgYS9iICovCisgICAgU0NIQVIgKnB0clJlc3VsdF9lKSAgICAvKiE8IEV4cG9uZW50IG9mIHF1b3RpZW50IGEvYiAqLwogCiB7CiAgIGludCBwcmVTaGlmdCwgcG9zdFNoaWZ0LCBpbmRleCwgc2hpZnQ7CiAgIEZJWFBfREJMIHJhdGlvX207Ci0gIEZJWFBfU0dMICBiSW52X20gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKKyAgRklYUF9TR0wgYkludl9tID0gRkwyRlhDT05TVF9TR0woMC4wZik7CiAKICAgcHJlU2hpZnQgPSBDbnRMZWFkaW5nWmVyb3MoYl9tKTsKIApAQCAtMjkyLDI1ICszMTIsMjQgQEAKICAgKi8KICAgc2hpZnQgPSAoREZSQUNUX0JJVFMgLSAyIC0gSU5WX1RBQkxFX0JJVFMgLSBwcmVTaGlmdCk7CiAKLSAgaW5kZXggPSAoc2hpZnQ8MCk/IChMT05HKWJfbSA8PCAoLXNoaWZ0KSA6IChMT05HKWJfbSA+PiBzaGlmdDsKLQorICBpbmRleCA9IChzaGlmdCA8IDApID8gKExPTkcpYl9tIDw8ICgtc2hpZnQpIDogKExPTkcpYl9tID4+IHNoaWZ0OwogCiAgIC8qIFRoZSBpbmRleCBoYXMgSU5WX1RBQkxFX0JJVFMgKzEgdmFsaWQgYml0cyBoZXJlLiBDbGVhciB0aGUgb3RoZXIgYml0cy4gKi8KLSAgaW5kZXggJj0gKDEgPDwgKElOVl9UQUJMRV9CSVRTKzEpKSAtIDE7CisgIGluZGV4ICY9ICgxIDw8IChJTlZfVEFCTEVfQklUUyArIDEpKSAtIDE7CiAKLSAgICAvKiBSZW1vdmUgb2Zmc2V0IG9mIGhhbGYgYW4gaW50ZXJ2YWwgKi8KKyAgLyogUmVtb3ZlIG9mZnNldCBvZiBoYWxmIGFuIGludGVydmFsICovCiAgIGluZGV4LS07CiAKLSAgICAvKiBOb3cgdGhlIGxvd2VzdCBiaXQgaXMgc2hpZnRlZCBvdXQgKi8KKyAgLyogTm93IHRoZSBsb3dlc3QgYml0IGlzIHNoaWZ0ZWQgb3V0ICovCiAgIGluZGV4ID0gaW5kZXggPj4gMTsKIAotICAgIC8qIEZldGNoIGludmVyc2VkIG1hbnRpc3NhIGZyb20gdGFibGU6ICovCi0gIGJJbnZfbSA9IChpbmRleDwwKT8gYkludl9tIDogRkRLX3NickRlY29kZXJfaW52VGFibGVbaW5kZXhdOworICAvKiBGZXRjaCBpbnZlcnNlZCBtYW50aXNzYSBmcm9tIHRhYmxlOiAqLworICBiSW52X20gPSAoaW5kZXggPCAwKSA/IGJJbnZfbSA6IEZES19zYnJEZWNvZGVyX2ludlRhYmxlW2luZGV4XTsKIAotICAgIC8qIE11bHRpcGx5IGEgd2l0aCB0aGUgaW52ZXJzZSBvZiBiOiAqLwotICByYXRpb19tID0gKGluZGV4PDApPyAoYV9tID4+IDEpIDogZk11bHREaXYyKGJJbnZfbSxhX20pOworICAvKiBNdWx0aXBseSBhIHdpdGggdGhlIGludmVyc2Ugb2YgYjogKi8KKyAgcmF0aW9fbSA9IChpbmRleCA8IDApID8gKGFfbSA+PiAxKSA6IGZNdWx0RGl2MihiSW52X20sIGFfbSk7CiAKLSAgcG9zdFNoaWZ0ID0gQ250TGVhZGluZ1plcm9zKHJhdGlvX20pLTE7CisgIHBvc3RTaGlmdCA9IENudExlYWRpbmdaZXJvcyhyYXRpb19tKSAtIDE7CiAKICAgKnB0clJlc3VsdF9tID0gcmF0aW9fbSA8PCBwb3N0U2hpZnQ7CiAgICpwdHJSZXN1bHRfZSA9IGFfZSAtIGJfZSArIDEgKyBwcmVTaGlmdCAtIHBvc3RTaGlmdDsKQEAgLTMyNiwzMCArMzQ1LDI4IEBACiAgIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGUgc3F1YXJlIHJvb3QgaXMgYmFzZWQgb24gYSB0YWJsZSBsb29rdXAKICAgd2hpY2ggbGltaXRzIGFjY3VyYWN5LgogKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBGREtfc3FydF9NYW50RXhwKEZJWFBfREJMICptYW50aXNzYSwgICAgLyohPCBQb2ludGVyIHRvIG1hbnRpc3NhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqZXhwb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0hBUiAqZGVzdFNjYWxlKQoteworc3RhdGljIGlubGluZSB2b2lkIEZES19zcXJ0X01hbnRFeHAoCisgICAgRklYUF9EQkwgKm1hbnRpc3NhLCAvKiE8IFBvaW50ZXIgdG8gbWFudGlzc2EgKi8KKyAgICBTQ0hBUiAqZXhwb25lbnQsIGNvbnN0IFNDSEFSICpkZXN0U2NhbGUpIHsKICAgRklYUF9EQkwgaW5wdXRfbSA9ICptYW50aXNzYTsKLSAgaW50ICAgaW5wdXRfZSA9IChpbnQpICpleHBvbmVudDsKKyAgaW50IGlucHV0X2UgPSAoaW50KSpleHBvbmVudDsKICAgRklYUF9EQkwgcmVzdWx0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gIGludCAgICByZXN1bHRfZSA9IC1GUkFDVF9CSVRTOworICBpbnQgcmVzdWx0X2UgPSAtRlJBQ1RfQklUUzsKIAogICAvKiBDYWxsIGxvb2t1cCBzcXVhcmUgcm9vdCwgd2hpY2ggZG9lcyBpbnRlcm5hbGx5IG5vcm1hbGl6YXRpb24uICovCi0gIHJlc3VsdCAgID0gc3FydEZpeHBfbG9va3VwKGlucHV0X20sICZpbnB1dF9lKTsKKyAgcmVzdWx0ID0gc3FydEZpeHBfbG9va3VwKGlucHV0X20sICZpbnB1dF9lKTsKICAgcmVzdWx0X2UgPSBpbnB1dF9lOwogCiAgIC8qIFdyaXRlIHJlc3VsdCAqLwotICBpZiAoZXhwb25lbnQ9PWRlc3RTY2FsZSkgeworICBpZiAoZXhwb25lbnQgPT0gZGVzdFNjYWxlKSB7CiAgICAgKm1hbnRpc3NhID0gcmVzdWx0OwogICAgICpleHBvbmVudCA9IHJlc3VsdF9lOwogICB9IGVsc2UgewogICAgIGludCBzaGlmdCA9IHJlc3VsdF9lIC0gKmRlc3RTY2FsZTsKLSAgICAqbWFudGlzc2EgPSAoc2hpZnQ+PTApID8gcmVzdWx0IDw8IChJTlQpZml4TWluKERGUkFDVF9CSVRTLTEsc2hpZnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlc3VsdCA+PiAoSU5UKWZpeE1pbihERlJBQ1RfQklUUy0xLC1zaGlmdCk7CisgICAgKm1hbnRpc3NhID0gKHNoaWZ0ID49IDApID8gcmVzdWx0IDw8IChJTlQpZml4TWluKERGUkFDVF9CSVRTIC0gMSwgc2hpZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVzdWx0ID4+IChJTlQpZml4TWluKERGUkFDVF9CSVRTIC0gMSwgLXNoaWZ0KTsKICAgICAqZXhwb25lbnQgPSAqZGVzdFNjYWxlOwogICB9CiB9CiAKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvaW5jbHVkZS9zYnJfZW5jb2Rlci5oIGIvbGliU0JSZW5jL2luY2x1ZGUvc2JyX2VuY29kZXIuaAppbmRleCBhZWMwMzk4Li5kOTc5YmE2IDEwMDY0NAotLS0gYS9saWJTQlJlbmMvaW5jbHVkZS9zYnJfZW5jb2Rlci5oCisrKyBiL2xpYlNCUmVuYy9pbmNsdWRlL3Nicl9lbmNvZGVyLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTcgKzkwLDE4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKKwogICAgRGVzY3JpcHRpb246IFNCUiBlbmNvZGVyIHRvcCBsZXZlbCBwcm9jZXNzaW5nIHByb3RvdHlwZQogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIF9fU0JSX0VOQ09ERVJfSAotI2RlZmluZSBfX1NCUl9FTkNPREVSX0gKKyNpZm5kZWYgU0JSX0VOQ09ERVJfSAorI2RlZmluZSBTQlJfRU5DT0RFUl9ICiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAjaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCkBAIC05NywyMCArMTA5LDE3IEBACiAjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgogCiAvKiBjb3JlIGNvZGVyIGhlbHBlcnMgKi8KLSNkZWZpbmUgTUFYX1RSQU5TX0ZBQyAgICAgICAgIDgKKyNkZWZpbmUgTUFYX1RSQU5TX0ZBQyA4CiAjZGVmaW5lIE1BWF9DT0RFQ19GUkFNRV9SQVRJTyAyCi0jZGVmaW5lIE1BWF9QQVlMT0FEX1NJWkUgICAgMjU2CisjZGVmaW5lIE1BWF9QQVlMT0FEX1NJWkUgMjU2CiAKLXR5cGVkZWYgZW51bSBjb2RlY1R5cGUKLXsKLSAgQ09ERUNfQUFDPTAsCi0gIENPREVDX0FBQ0xEPTEsCi0gIENPREVDX1VOU1BFQ0lGSUVEPTk5Cit0eXBlZGVmIGVudW0gY29kZWNUeXBlIHsKKyAgQ09ERUNfQUFDID0gMCwKKyAgQ09ERUNfQUFDTEQgPSAxLAorICBDT0RFQ19VTlNQRUNJRklFRCA9IDk5CiB9IENPREVDX1RZUEU7CiAKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgSU5UIGJpdFJhdGU7CiAgIElOVCBuQ2hhbm5lbHM7CiAgIElOVCBzYW1wbGVGcmVxOwpAQCAtMTE4LDggKzEyNyw3IEBACiAgIElOVCBzdGFuZGFyZEJpdHJhdGU7CiB9IENPREVDX1BBUkFNOwogCi10eXBlZGVmIGVudW0KLXsKK3R5cGVkZWYgZW51bSB7CiAgIFNCUl9NT05PLAogICBTQlJfTEVGVF9SSUdIVCwKICAgU0JSX0NPVVBMSU5HLApAQCAtMTI3LDEzNiArMTM1LDE0MyBAQAogfSBTQlJfU1RFUkVPX01PREU7CiAKIC8qIGJpdHN0cmVhbSBzeW50YXggZmxhZ3MgKi8KLWVudW0KLXsKK2VudW0gewogICBTQlJfU1lOVEFYX0xPV19ERUxBWSA9IDB4MDAwMSwKLSAgU0JSX1NZTlRBWF9TQ0FMQUJMRSAgPSAweDAwMDIsCi0gIFNCUl9TWU5UQVhfQ1JDICAgICAgID0gMHgwMDA0LAotICBTQlJfU1lOVEFYX0RSTV9DUkMgICA9IDB4MDAwOAorICBTQlJfU1lOVEFYX1NDQUxBQkxFID0gMHgwMDAyLAorICBTQlJfU1lOVEFYX0NSQyA9IDB4MDAwNCwKKyAgU0JSX1NZTlRBWF9EUk1fQ1JDID0gMHgwMDA4LAorICBTQlJfU1lOVEFYX0VMRF9SRURVQ0VEX0RFTEFZID0gMHgwMDEwCiB9OwogCi10eXBlZGVmIGVudW0KLXsKLSAgRlJFUV9SRVNfTE9XID0gMCwKLSAgRlJFUV9SRVNfSElHSAotfSBGUkVRX1JFUzsKK3R5cGVkZWYgZW51bSB7IEZSRVFfUkVTX0xPVyA9IDAsIEZSRVFfUkVTX0hJR0ggfSBGUkVRX1JFUzsKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgQ09ERUNfVFlQRSAgICAgICBjb3JlQ29kZXI7ICAgICAgICAvKiE8IExDIG9yIEVMRCAqLwotICBVSU5UICAgICAgICAgICAgIGJpdHJhdGVGcm9tOyAgICAgIC8qITwgaW5jbHVzaXZlICovCi0gIFVJTlQgICAgICAgICAgICAgYml0cmF0ZVRvOyAgICAgICAgLyohPCBleGNsdXNpdmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgQ09ERUNfVFlQRSBjb3JlQ29kZXI7IC8qITwgTEMgb3IgRUxEICovCisgIFVJTlQgYml0cmF0ZUZyb207ICAgICAvKiE8IGluY2x1c2l2ZSAqLworICBVSU5UIGJpdHJhdGVUbzsgICAgICAgLyohPCBleGNsdXNpdmUgKi8KIAotICBVSU5UICAgICAgICAgICAgIHNhbXBsZVJhdGU7ICAgICAgIC8qITwgICAqLwotICBVQ0hBUiAgICAgICAgICAgIG51bUNoYW5uZWxzOyAgICAgIC8qITwgICAqLworICBVSU5UIHNhbXBsZVJhdGU7ICAgLyohPCAgICovCisgIFVDSEFSIG51bUNoYW5uZWxzOyAvKiE8ICAgKi8KIAotICBVQ0hBUiAgICAgICAgICAgIHN0YXJ0RnJlcTsgICAgICAgIC8qITwgYnNfc3RhcnRfZnJlcSAqLwotICBVQ0hBUiAgICAgICAgICAgIHN0YXJ0RnJlcVNwZWVjaDsgIC8qITwgYnNfc3RhcnRfZnJlcSBmb3Igc3BlZWNoIGNvbmZpZyBmbGFnICovCi0gIFVDSEFSICAgICAgICAgICAgc3RvcEZyZXE7ICAgICAgICAgLyohPCBic19zdG9wX2ZyZXEgKi8KLSAgVUNIQVIgICAgICAgICAgICBzdG9wRnJlcVNwZWVjaDsgICAvKiE8IGJzX3N0b3BfZnJlcSBmb3Igc3BlZWNoIGNvbmZpZyBmbGFnICovCisgIFVDSEFSIHN0YXJ0RnJlcTsgICAgICAgLyohPCBic19zdGFydF9mcmVxICovCisgIFVDSEFSIHN0YXJ0RnJlcVNwZWVjaDsgLyohPCBic19zdGFydF9mcmVxIGZvciBzcGVlY2ggY29uZmlnIGZsYWcgKi8KKyAgVUNIQVIgc3RvcEZyZXE7ICAgICAgICAvKiE8IGJzX3N0b3BfZnJlcSAqLworICBVQ0hBUiBzdG9wRnJlcVNwZWVjaDsgIC8qITwgYnNfc3RvcF9mcmVxIGZvciBzcGVlY2ggY29uZmlnIGZsYWcgKi8KIAotICBVQ0hBUiAgICAgICAgICAgIG51bU5vaXNlQmFuZHM7ICAgIC8qITwgICAqLwotICBVQ0hBUiAgICAgICAgICAgIG5vaXNlRmxvb3JPZmZzZXQ7IC8qITwgICAqLwotICBTQ0hBUiAgICAgICAgICAgIG5vaXNlTWF4TGV2ZWw7ICAgIC8qITwgICAqLwotICBTQlJfU1RFUkVPX01PREUgIHN0ZXJlb01vZGU7ICAgICAgIC8qITwgICAqLwotICBVQ0hBUiAgICAgICAgICAgIGZyZXFTY2FsZTsgICAgICAgIC8qITwgICAqLworICBVQ0hBUiBudW1Ob2lzZUJhbmRzOyAgICAgICAgLyohPCAgICovCisgIFVDSEFSIG5vaXNlRmxvb3JPZmZzZXQ7ICAgICAvKiE8ICAgKi8KKyAgU0NIQVIgbm9pc2VNYXhMZXZlbDsgICAgICAgIC8qITwgICAqLworICBTQlJfU1RFUkVPX01PREUgc3RlcmVvTW9kZTsgLyohPCAgICovCisgIFVDSEFSIGZyZXFTY2FsZTsgICAgICAgICAgICAvKiE8ICAgKi8KIH0gc2JyVHVuaW5nVGFibGVfdDsKIAotdHlwZWRlZiBzdHJ1Y3Qgc2JyQ29uZmlndXJhdGlvbgotewordHlwZWRlZiBzdHJ1Y3Qgc2JyQ29uZmlndXJhdGlvbiB7CiAgIC8qCiAgICAgIGNvcmUgY29kZXIgZGVwZW5kZW50IGNvbmZpZ3VyYXRpb25zCiAgICovCi0gIENPREVDX1BBUkFNIGNvZGVjU2V0dGluZ3M7ICAvKiE8IENvcmUgY29kZXIgc2V0dGluZ3MuIFRvIGJlIHNldCBmcm9tIGNvcmUgY29kZXIuICovCi0gIElOVCBTZW5kSGVhZGVyRGF0YVRpbWU7ICAgICAvKiE8IFNCUiBoZWFkZXIgc2VuZCB1cGRhdGUgZnJlcXVlbmN5IGluIG1zLiAqLwotICBJTlQgdXNlV2F2ZUNvZGluZzsgICAgICAgICAgLyohPCBGbGFnOiB1c2FnZSBvZiB3YXZlY29kaW5nIHRvb2wuICovCi0gIElOVCBjcmNTYnI7ICAgICAgICAgICAgICAgICAvKiE8IEZsYWc6IHVzYWdlIG9mIFNCUi1DUkMuICovCi0gIElOVCBkeW5Cd1N1cHBvcnRlZDsgICAgICAgICAvKiE8IEZsYWc6IHN1cHBvcnQgZm9yIGR5bmFtaWMgYmFuZHdpZHRoIGluIHRoaXMgY29tYmluYXRpb24uICovCi0gIElOVCBwYXJhbWV0cmljQ29kaW5nOyAgICAgICAvKiE8IEZsYWc6IHVzYWdlIG9mIHBhcmFtZXRyaWMgY29kaW5nIHRvb2wuICovCi0gIElOVCBkb3duU2FtcGxlRmFjdG9yOyAgICAgICAvKiE8IFNhbXBsaW5nIHJhdGUgcmVsYXRpb24gYmV0d2VlbiB0aGUgU0JSIGFuZCB0aGUgY29yZSBlbmNvZGVyLiAqLwotICBGUkVRX1JFUyBmcmVxX3Jlc19maXhmaXhbMl07LyohPCBGcmVxdWVuY3kgcmVzb2x1dGlvbiBvZiBlbnZlbG9wZXMgaW4gZnJhbWUgY2xhc3MgRklYRklYLCBmb3Igbm9uLXNwbGl0IGNhc2UgYW5kIHNwbGl0IGNhc2UgKi8KLSAgVUNIQVIgZlJlc1RyYW5zSXNMb3c7ICAgICAgIC8qITwgRnJlcXVlbmN5IHJlc29sdXRpb24gb2YgZW52ZWxvcGVzIGluIHRyYW5zaWVudCBmcmFtZXM6IGxvdyAoMCkgb3IgdmFyaWFibGUgKDEpICovCisgIENPREVDX1BBUkFNCisgIGNvZGVjU2V0dGluZ3M7IC8qITwgQ29yZSBjb2RlciBzZXR0aW5ncy4gVG8gYmUgc2V0IGZyb20gY29yZSBjb2Rlci4gKi8KKyAgSU5UIFNlbmRIZWFkZXJEYXRhVGltZTsgLyohPCBTQlIgaGVhZGVyIHNlbmQgdXBkYXRlIGZyZXF1ZW5jeSBpbiBtcy4gKi8KKyAgSU5UIHVzZVdhdmVDb2Rpbmc7ICAgICAgLyohPCBGbGFnOiB1c2FnZSBvZiB3YXZlY29kaW5nIHRvb2wuICovCisgIElOVCBjcmNTYnI7ICAgICAgICAgICAgIC8qITwgRmxhZzogdXNhZ2Ugb2YgU0JSLUNSQy4gKi8KKyAgSU5UIGR5bkJ3U3VwcG9ydGVkOyAgICAgLyohPCBGbGFnOiBzdXBwb3J0IGZvciBkeW5hbWljIGJhbmR3aWR0aCBpbiB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uLiAqLworICBJTlQgcGFyYW1ldHJpY0NvZGluZzsgICAvKiE8IEZsYWc6IHVzYWdlIG9mIHBhcmFtZXRyaWMgY29kaW5nIHRvb2wuICovCisgIElOVCBkb3duU2FtcGxlRmFjdG9yOyAvKiE8IFNhbXBsaW5nIHJhdGUgcmVsYXRpb24gYmV0d2VlbiB0aGUgU0JSIGFuZCB0aGUgY29yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci4gKi8KKyAgRlJFUV9SRVMgZnJlcV9yZXNfZml4Zml4WzJdOyAvKiE8IEZyZXF1ZW5jeSByZXNvbHV0aW9uIG9mIGVudmVsb3BlcyBpbiBmcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIEZJWEZJWCwgZm9yIG5vbi1zcGxpdCBjYXNlIGFuZCBzcGxpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKi8KKyAgVUNIQVIgZlJlc1RyYW5zSXNMb3c7IC8qITwgRnJlcXVlbmN5IHJlc29sdXRpb24gb2YgZW52ZWxvcGVzIGluIHRyYW5zaWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzOiBsb3cgKDApIG9yIHZhcmlhYmxlICgxKSAqLwogCiAgIC8qCiAgICAgIGNvcmUgY29kZXIgZGVwZW5kZW50IHR1bmluZyBwYXJhbWV0ZXJzCiAgICovCi0gIElOVCB0cmFuX3RocjsgICAgICAgICAgICAgLyohPCBTQlIgdHJhbnNpZW50IGRldGVjdG9yIHRocmVzaG9sZCAoKiAxMDApLiAqLwotICBJTlQgbm9pc2VGbG9vck9mZnNldDsgICAgIC8qITwgTm9pc2UgZmxvb3Igb2Zmc2V0LiAgICAgICovCi0gIFVJTlQgdXNlU3BlZWNoQ29uZmlnOyAgICAgLyohPCBGbGFnOiBhZGFwdCB0dW5pbmcgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gc3BlZWNoLiAqLwotCi0KKyAgSU5UIHRyYW5fdGhyOyAgICAgICAgIC8qITwgU0JSIHRyYW5zaWVudCBkZXRlY3RvciB0aHJlc2hvbGQgKCogMTAwKS4gKi8KKyAgSU5UIG5vaXNlRmxvb3JPZmZzZXQ7IC8qITwgTm9pc2UgZmxvb3Igb2Zmc2V0LiAgICAgICovCisgIFVJTlQgdXNlU3BlZWNoQ29uZmlnOyAvKiE8IEZsYWc6IGFkYXB0IHR1bmluZyBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBzcGVlY2guCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogICAvKgogICAgICBjb3JlIGNvZGVyIGluZGVwZW5kZW50IGNvbmZpZ3VyYXRpb25zCiAgICovCi0gIElOVCBzYnJGcmFtZVNpemU7ICAgICAgICAgICAvKiE8IFNCUiBmcmFtZSBzaXplIGluIHNhbXBsZXMuIFdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIGNvcmUgY29kZXIgc2V0dGluZ3MuICovCi0gIElOVCBzYnJfZGF0YV9leHRyYTsgICAgICAgICAvKiE8IEZsYWcgdXNhZ2Ugb2YgZGF0YSBleHRyYS4gKi8KLSAgSU5UIGFtcF9yZXM7ICAgICAgICAgICAgICAgIC8qITwgQW1wbGl0dWRlIHJlc29sdXRpb24uICovCi0gIElOVCBhbmFfbWF4X2xldmVsOyAgICAgICAgICAvKiE8IE5vaXNlIGluc2VydGlvbiBtYXhpbXVtIGxldmVsLiAqLwotICBJTlQgdHJhbl9mYzsgICAgICAgICAgICAgICAgLyohPCBUcmFuc2llbnQgZGV0ZWN0b3Igc3RhcnQgZnJlcXVlbmN5LiAqLwotICBJTlQgdHJhbl9kZXRfbW9kZTsgICAgICAgICAgLyohPCBUcmFuc2llbnQgZGV0ZWN0b3IgbW9kZS4gKi8KLSAgSU5UIHNwcmVhZDsgICAgICAgICAgICAgICAgIC8qITwgRmxhZzogdXNhZ2Ugb2YgU0JSIHNwcmVhZC4gKi8KLSAgSU5UIHN0YXQ7ICAgICAgICAgICAgICAgICAgIC8qITwgRmxhZzogdXNhZ2Ugb2Ygc3RhdGljIGZyYW1pbmcuICovCi0gIElOVCBlOyAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBlbnZlbG9wZXMgd2hlbiBzdGF0aWMgZnJhbWluZyBpcyBjaG9zZW4uICovCisgIElOVCBzYnJGcmFtZVNpemU7IC8qITwgU0JSIGZyYW1lIHNpemUgaW4gc2FtcGxlcy4gV2lsbCBiZSBjYWxjdWxhdGVkIGZyb20gY29yZQorICAgICAgICAgICAgICAgICAgICAgICBjb2RlciBzZXR0aW5ncy4gKi8KKyAgSU5UIHNicl9kYXRhX2V4dHJhOyAvKiE8IEZsYWcgdXNhZ2Ugb2YgZGF0YSBleHRyYS4gKi8KKyAgSU5UIGFtcF9yZXM7ICAgICAgICAvKiE8IEFtcGxpdHVkZSByZXNvbHV0aW9uLiAqLworICBJTlQgYW5hX21heF9sZXZlbDsgIC8qITwgTm9pc2UgaW5zZXJ0aW9uIG1heGltdW0gbGV2ZWwuICovCisgIElOVCB0cmFuX2ZjOyAgICAgICAgLyohPCBUcmFuc2llbnQgZGV0ZWN0b3Igc3RhcnQgZnJlcXVlbmN5LiAqLworICBJTlQgdHJhbl9kZXRfbW9kZTsgIC8qITwgVHJhbnNpZW50IGRldGVjdG9yIG1vZGUuICovCisgIElOVCBzcHJlYWQ7ICAgICAgICAgLyohPCBGbGFnOiB1c2FnZSBvZiBTQlIgc3ByZWFkLiAqLworICBJTlQgc3RhdDsgICAgICAgICAgIC8qITwgRmxhZzogdXNhZ2Ugb2Ygc3RhdGljIGZyYW1pbmcuICovCisgIElOVCBlOyAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZW52ZWxvcGVzIHdoZW4gc3RhdGljIGZyYW1pbmcgaXMgY2hvc2VuLiAqLwogICBTQlJfU1RFUkVPX01PREUgc3RlcmVvTW9kZTsgLyohPCBTQlIgc3RlcmVvIG1vZGUuICovCiAgIElOVCBkZWx0YVRBY3Jvc3NGcmFtZXM7ICAgICAvKiE8IEZsYWc6IGFsbG93IHRpbWUtZGVsdGEgY29kaW5nLiAqLwotICBGSVhQX0RCTCBkRl9lZGdlXzFzdEVudjsgICAgLyohPCBFeHRyYSBmcmFjdGlvbiBkZWx0YS1GIGNvZGluZyBpcyBhbGxvd2VkIHRvIGJlIG1vcmUgZXhwZW5zaXZlLiAqLwotICBGSVhQX0RCTCBkRl9lZGdlX2luY3I7ICAgICAgLyohPCBJbmNyZW1lbnQgZEZfZWRnZV8xc3RFbnYgdGhpcyBtdWNoIGlmIGRULWNvZGluZyB3YXMgdXNlZCB0aGlzIGZyYW1lLiAqLwotICBJTlQgc2JyX2ludmZfbW9kZTsgICAgICAgICAgLyohPCBJbnZlcnNlIGZpbHRlcmluZyBtb2RlLiAqLwotICBJTlQgc2JyX3hwb3NfbW9kZTsgICAgICAgICAgLyohPCBUcmFuc3Bvc2VyIG1vZGUuICovCi0gIElOVCBzYnJfeHBvc19jdHJsOyAgICAgICAgICAvKiE8IFRyYW5zcG9zZXIgY29udHJvbC4gKi8KLSAgSU5UIHNicl94cG9zX2xldmVsOyAgICAgICAgIC8qITwgVHJhbnNwb3NlciAzcmQgb3JkZXIgbGV2ZWwuICovCi0gIElOVCBzdGFydEZyZXE7ICAgICAgICAgICAgICAvKiE8IFRoZSBzdGFydCBmcmVxdWVuY3kgdGFibGUgaW5kZXguICovCi0gIElOVCBzdG9wRnJlcTsgICAgICAgICAgICAgICAvKiE8IFRoZSBzdG9wIGZyZXF1ZW5jeSB0YWJsZSBpbmRleC4gKi8KLSAgSU5UIHVzZVNhUGFuOyAgICAgICAgICAgICAgIC8qITwgRmxhZzogdXNhZ2Ugb2YgU0FQQU4gc3RlcmVvLiAqLwotICBJTlQgZHluQndFbmFibGVkOyAgICAgICAgICAgLyohPCBGbGFnOiB1c2FnZSBvZiBkeW5hbWljIGJhbmR3aWR0aC4gKi8KLSAgSU5UIGJQYXJhbWV0cmljU3RlcmVvOyAgICAgIC8qITwgRmxhZzogdXNhZ2Ugb2YgcGFyYW1ldHJpYyBzdGVyZW8gY29kaW5nIHRvb2wuICovCisgIEZJWFBfREJMIGRGX2VkZ2VfMXN0RW52OyAvKiE8IEV4dHJhIGZyYWN0aW9uIGRlbHRhLUYgY29kaW5nIGlzIGFsbG93ZWQgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUgZXhwZW5zaXZlLiAqLworICBGSVhQX0RCTCBkRl9lZGdlX2luY3I7ICAgLyohPCBJbmNyZW1lbnQgZEZfZWRnZV8xc3RFbnYgdGhpcyBtdWNoIGlmIGRULWNvZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIHVzZWQgdGhpcyBmcmFtZS4gKi8KKyAgSU5UIHNicl9pbnZmX21vZGU7ICAgICAgIC8qITwgSW52ZXJzZSBmaWx0ZXJpbmcgbW9kZS4gKi8KKyAgSU5UIHNicl94cG9zX21vZGU7ICAgICAgIC8qITwgVHJhbnNwb3NlciBtb2RlLiAqLworICBJTlQgc2JyX3hwb3NfY3RybDsgICAgICAgLyohPCBUcmFuc3Bvc2VyIGNvbnRyb2wuICovCisgIElOVCBzYnJfeHBvc19sZXZlbDsgICAgICAvKiE8IFRyYW5zcG9zZXIgM3JkIG9yZGVyIGxldmVsLiAqLworICBJTlQgc3RhcnRGcmVxOyAgICAgICAgICAgLyohPCBUaGUgc3RhcnQgZnJlcXVlbmN5IHRhYmxlIGluZGV4LiAqLworICBJTlQgc3RvcEZyZXE7ICAgICAgICAgICAgLyohPCBUaGUgc3RvcCBmcmVxdWVuY3kgdGFibGUgaW5kZXguICovCisgIElOVCB1c2VTYVBhbjsgICAgICAgICAgICAvKiE8IEZsYWc6IHVzYWdlIG9mIFNBUEFOIHN0ZXJlby4gKi8KKyAgSU5UIGR5bkJ3RW5hYmxlZDsgICAgICAgIC8qITwgRmxhZzogdXNhZ2Ugb2YgZHluYW1pYyBiYW5kd2lkdGguICovCisgIElOVCBiUGFyYW1ldHJpY1N0ZXJlbzsgICAvKiE8IEZsYWc6IHVzYWdlIG9mIHBhcmFtZXRyaWMgc3RlcmVvIGNvZGluZyB0b29sLiAqLwogCiAgIC8qCiAgICAgIGhlYWRlcl9leHRyYTEgY29uZmlndXJhdGlvbgogICAqLwotICBVQ0hBUiBmcmVxU2NhbGU7ICAgICAgICAgICAgLyohPCBGcmVxdWVuY3kgZ3JvdXBpbmcuICovCi0gIElOVCBhbHRlclNjYWxlOyAgICAgICAgICAgICAvKiE8IFNjYWxlIHJlc29sdXRpb24uICovCi0gIElOVCBzYnJfbm9pc2VfYmFuZHM7ICAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcy4gKi8KLQorICBVQ0hBUiBmcmVxU2NhbGU7ICAgICAvKiE8IEZyZXF1ZW5jeSBncm91cGluZy4gKi8KKyAgSU5UIGFsdGVyU2NhbGU7ICAgICAgLyohPCBTY2FsZSByZXNvbHV0aW9uLiAqLworICBJTlQgc2JyX25vaXNlX2JhbmRzOyAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcy4gKi8KIAogICAvKgogICAgICBoZWFkZXJfZXh0cmEyIGNvbmZpZ3VyYXRpb24KICAgKi8KLSAgSU5UIHNicl9saW1pdGVyX2JhbmRzOyAgICAgIC8qITwgTnVtYmVyIG9mIGxpbWl0ZXIgYmFuZHMuICovCi0gIElOVCBzYnJfbGltaXRlcl9nYWluczsgICAgICAvKiE8IEdhaW4gb2YgbGltaXRlci4gKi8KLSAgSU5UIHNicl9pbnRlcnBvbF9mcmVxOyAgICAgIC8qITwgRmxhZzogdXNlIGludGVycG9sYXRpb24gaW4gZnJlcS4gZGlyZWN0aW9uLiAqLwotICBJTlQgc2JyX3Ntb290aGluZ19sZW5ndGg7ICAgLyohPCBGbGFnOiBjaG9vc2UgbGVuZ3RoIDQgb3IgMCAoPW9uLCBvZmYpLiAqLworICBJTlQgc2JyX2xpbWl0ZXJfYmFuZHM7ICAgIC8qITwgTnVtYmVyIG9mIGxpbWl0ZXIgYmFuZHMuICovCisgIElOVCBzYnJfbGltaXRlcl9nYWluczsgICAgLyohPCBHYWluIG9mIGxpbWl0ZXIuICovCisgIElOVCBzYnJfaW50ZXJwb2xfZnJlcTsgICAgLyohPCBGbGFnOiB1c2UgaW50ZXJwb2xhdGlvbiBpbiBmcmVxLiBkaXJlY3Rpb24uICovCisgIElOVCBzYnJfc21vb3RoaW5nX2xlbmd0aDsgLyohPCBGbGFnOiBjaG9vc2UgbGVuZ3RoIDQgb3IgMCAoPW9uLCBvZmYpLiAqLwogICBVQ0hBUiBpbml0X2FtcF9yZXNfRkY7CiAgIEZJWFBfREJMIHRocmVzaG9sZF9BbXBSZXNfRkZfbTsKICAgU0NIQVIgdGhyZXNob2xkX0FtcFJlc19GRl9lOwotfSBzYnJDb25maWd1cmF0aW9uLCAqc2JyQ29uZmlndXJhdGlvblB0ciA7Cit9IHNickNvbmZpZ3VyYXRpb24sICpzYnJDb25maWd1cmF0aW9uUHRyOwogCi10eXBlZGVmIHN0cnVjdCBTQlJfQ09ORklHX0RBVEEKLXsKLSAgVUlOVCBzYnJTeW50YXhGbGFnczsgICAgICAgICAgICAgICAgICAvKio8IFNCUiBzeW50YXggZmxhZ3MgZGVyaXZlZCBmcm9tIEFPVC4gKi8KLSAgSU5UIG5DaGFubmVsczsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscy4gICovCit0eXBlZGVmIHN0cnVjdCBTQlJfQ09ORklHX0RBVEEgeworICBVSU5UIHNiclN5bnRheEZsYWdzOyAvKio8IFNCUiBzeW50YXggZmxhZ3MgZGVyaXZlZCBmcm9tIEFPVC4gKi8KKyAgSU5UIG5DaGFubmVsczsgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMuICAqLwogCi0gIElOVCBuU2ZiWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgU0JSIHNjYWxlZmFjdG9yIGJhbmRzIGZvciBMT19SRVMgYW5kIEhJX1JFUyAoPykgKi8KLSAgSU5UIG51bV9NYXN0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2X2tfbWFzdGVyLiAqLwotICBJTlQgc2FtcGxlRnJlcTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU0JSIHNhbXBsaW5nIGZyZXF1ZW5jeS4gKi8KKyAgSU5UIG5TZmJbMl07IC8qKjwgTnVtYmVyIG9mIFNCUiBzY2FsZWZhY3RvciBiYW5kcyBmb3IgTE9fUkVTIGFuZCBISV9SRVMgKD8pICovCisgIElOVCBudW1fTWFzdGVyOyAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2X2tfbWFzdGVyLiAqLworICBJTlQgc2FtcGxlRnJlcTsgLyoqPCBTQlIgc2FtcGxpbmcgZnJlcXVlbmN5LiAqLwogICBJTlQgZnJhbWVTaXplOwotICBJTlQgeE92ZXJGcmVxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIFNCUiBzdGFydCBmcmVxdWVuY3kuICovCi0gIElOVCBkeW5YT3ZlckZyZXE7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBVc2VkIGNyb3Nzb3ZlciBmcmVxdWVuY3kgd2hlbiBkeW5hbWljIGJhbmR3aWR0aCBpcyBlbmFibGVkLiAqLwotICBJTlQgbm9RbWZCYW5kczsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFFNRiBmcmVxdWVuY3kgYmFuZHMuICovCi0gIElOVCBub1FtZlNsb3RzOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgUU1GIHNsb3RzLiAqLworICBJTlQgeE92ZXJGcmVxOyAgICAvKio8IFRoZSBTQlIgc3RhcnQgZnJlcXVlbmN5LiAqLworICBJTlQgZHluWE92ZXJGcmVxOyAvKio8IFVzZWQgY3Jvc3NvdmVyIGZyZXF1ZW5jeSB3aGVuIGR5bmFtaWMgYmFuZHdpZHRoIGlzCisgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQuICovCiAKLSAgVUNIQVIgKmZyZXFCYW5kVGFibGVbMl07ICAgICAgICAgICAgICAvKio8IEZyZXF1ZW5jeSB0YWJsZSBmb3IgbG93IGFuZCBoaXJlcywgb25seSBNQVhfRlJFUV9DT0VGRlMvMiArMSBjb2VmZnMgYWN0dWFsbHkgbmVlZGVkIGZvciBsb3dyZXMuICovCi0gIFVDSEFSICp2X2tfbWFzdGVyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXN0ZXIgQmFuZFRhYmxlIHdoZXJlIGZyZXFCYW5kVGFibGUgaXMgZGVyaXZlZCBmcm9tLiAqLworICBJTlQgbm9RbWZCYW5kczsgLyoqPCBOdW1iZXIgb2YgUU1GIGZyZXF1ZW5jeSBiYW5kcy4gKi8KKyAgSU5UIG5vUW1mU2xvdHM7IC8qKjwgTnVtYmVyIG9mIFFNRiBzbG90cy4gKi8KIAorICBVQ0hBUiAqZnJlcUJhbmRUYWJsZVsyXTsgLyoqPCBGcmVxdWVuY3kgdGFibGUgZm9yIGxvdyBhbmQgaGlyZXMsIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9GUkVRX0NPRUZGUy8yICsxIGNvZWZmcyBhY3R1YWxseSBuZWVkZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dyZXMuICovCisgIFVDSEFSCisgICp2X2tfbWFzdGVyOyAvKio8IE1hc3RlciBCYW5kVGFibGUgd2hlcmUgZnJlcUJhbmRUYWJsZSBpcyBkZXJpdmVkIGZyb20uICovCiAKICAgU0JSX1NURVJFT19NT0RFIHN0ZXJlb01vZGU7Ci0gIElOVCBub0VudkNoYW5uZWxzOyAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW52ZWxvcGUgY2hhbm5lbHMuICovCisgIElOVCBub0VudkNoYW5uZWxzOyAvKio8IE51bWJlciBvZiBlbnZlbG9wZSBjaGFubmVscy4gKi8KIAotICBJTlQgdXNlV2F2ZUNvZGluZzsgICAgICAgICAgICAgICAgICAgIC8qKjwgRmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0byB1c2Ugd2F2ZSBjb2RpbmcgYXQgYWxsLiAgICAgICovCi0gIElOVCB1c2VQYXJhbWV0cmljQ29kaW5nOyAgICAgICAgICAgICAgLyoqPCBGbGFnIGluZGljYXRlcyB3aGV0aGVyIHRvIHVzZSBwYXJhIGNvZGluZyBhdCBhbGwuICAgICAgKi8KLSAgSU5UIHhwb3NDdHJsU3dpdGNoOyAgICAgICAgICAgICAgICAgICAvKio8IEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gc3dpdGNoIHhwb3MgY3RybCBvbiB0aGUgZmx5LiAqLwotICBJTlQgc3dpdGNoVHJhbnNwb3NlcnM7ICAgICAgICAgICAgICAgIC8qKjwgRmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0byBzd2l0Y2ggeHBvcyBvbiB0aGUgZmx5IC4gICAgICovCisgIElOVCB1c2VXYXZlQ29kaW5nOyAvKio8IEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gdXNlIHdhdmUgY29kaW5nIGF0IGFsbC4gKi8KKyAgSU5UIHVzZVBhcmFtZXRyaWNDb2Rpbmc7IC8qKjwgRmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0byB1c2UgcGFyYSBjb2RpbmcgYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbC4gICAgICAqLworICBJTlQgeHBvc0N0cmxTd2l0Y2g7ICAgIC8qKjwgRmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0byBzd2l0Y2ggeHBvcyBjdHJsIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZseS4gKi8KKyAgSU5UIHN3aXRjaFRyYW5zcG9zZXJzOyAvKio8IEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gc3dpdGNoIHhwb3Mgb24gdGhlIGZseSAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIFVDSEFSIGluaXRBbXBSZXNGRjsKICAgRklYUF9EQkwgdGhyZXNob2xkQW1wUmVzRkZfbTsKICAgU0NIQVIgdGhyZXNob2xkQW1wUmVzRkZfZTsKQEAgLTI2Nyw2ICsyODIsOCBAQAogICBJTlQgYml0UmF0ZTsKICAgaW50IGluc3RhbmNlVGFnOwogICBVQ0hBUiBmUGFyYW1ldHJpY1N0ZXJlbzsKKyAgVUNIQVIgZkR1YWxNb25vOyAvKio8IFRoaXMgZmxhZ3MgYWxsb3dzIHRvIGRpc2FibGUgY291cGxpbmcgaW4gc2JyIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICBwYWlyIGVsZW1lbnQgKi8KICAgVUNIQVIgbkNoYW5uZWxzSW5FbDsKICAgVUNIQVIgQ2hhbm5lbEluZGV4WzJdOwogfSBTQlJfRUxFTUVOVF9JTkZPOwpAQCAtMjc4LDE5ICsyOTUsMTUgQEAKIHR5cGVkZWYgc3RydWN0IFNCUl9FTkNPREVSICpIQU5ETEVfU0JSX0VOQ09ERVI7CiAKIC8qKgotICogXGJyaWVmICBHZXQgdGhlIG1heCByZXF1aXJlZCBpbnB1dCBidWZmZXIgc2l6ZSBpbmNsdWRpbmcgZGVsYXkgYmFsYW5jaW5nIHNwYWNlCi0gKiAgICAgICAgIGZvciBOIGF1ZGlvIGNoYW5uZWxzLgorICogXGJyaWVmICBHZXQgdGhlIG1heCByZXF1aXJlZCBpbnB1dCBidWZmZXIgc2l6ZSBpbmNsdWRpbmcgZGVsYXkgYmFsYW5jaW5nCisgKiBzcGFjZSBmb3IgTiBhdWRpbyBjaGFubmVscy4KICAqIFxwYXJhbSBub0NoYW5uZWxzICBOdW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMuCiAgKiBccmV0dXJuICAgICAgICAgICAgTWF4IHJlcXVpcmVkIGlucHV0IGJ1ZmZlciBzaXplIGluIGJ5dGVzLgogICovCiBJTlQgc2JyRW5jb2Rlcl9HZXRJbkJ1ZmZlclNpemUoaW50IG5vQ2hhbm5lbHMpOwogCi1JTlQgc2JyRW5jb2Rlcl9PcGVuKAotICAgICAgICBIQU5ETEVfU0JSX0VOQ09ERVIgICpwaFNickVuY29kZXIsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgIG5FbGVtZW50cywKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICBzdXBwb3J0UFMKLSAgICAgICAgKTsKK0lOVCBzYnJFbmNvZGVyX09wZW4oSEFORExFX1NCUl9FTkNPREVSICpwaFNickVuY29kZXIsIElOVCBuRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgIElOVCBuQ2hhbm5lbHMsIElOVCBzdXBwb3J0UFMpOwogCiAvKioKICAqIFxicmllZiAgICAgICAgICAgICAgICAgR2V0IGNsb3Nlc3Qgd29ya2luZyBiaXRyYXRlIHRvIHNwZWNpZmllZCBkZXNpcmVkCkBAIC0zMDEsOCArMzE0LDggQEAKICAqIFxwYXJhbSBhb3QgICAgICAgICAgICAgVGhlIGN1cnJlbnQgQXVkaW8gT2JqZWN0IFR5cGUKICAqIFxyZXR1cm4gICAgICAgICAgICAgICAgQ2xvc2VzdCB3b3JraW5nIGJpdCByYXRlIHRvIGJpdFJhdGUgdmFsdWUKICAqLwotVUlOVCBzYnJFbmNvZGVyX0xpbWl0Qml0UmF0ZShVSU5UIGJpdFJhdGUsIFVJTlQgbnVtQ2hhbm5lbHMsIFVJTlQgY29yZVNhbXBsZVJhdGUsIEFVRElPX09CSkVDVF9UWVBFIGFvdCk7Ci0KK1VJTlQgc2JyRW5jb2Rlcl9MaW1pdEJpdFJhdGUoVUlOVCBiaXRSYXRlLCBVSU5UIG51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGNvcmVTYW1wbGVSYXRlLCBBVURJT19PQkpFQ1RfVFlQRSBhb3QpOwogCiAvKioKICAqIFxicmllZiAgICAgICAgICAgICAgICBDaGVjayB3aGV0aGVyIGRvd25zYW1wbGVkIFNCUiBzaW5nbGUgcmF0ZSBpcyBwb3NzaWJsZQpAQCAtMzE2LDUwICszMjksNTEgQEAKIC8qKgogICogXGJyaWVmICAgICAgICAgICAgICAgICAgSW5pdGlhbGl6ZSBTQlIgRW5jb2RlciBpbnN0YW5jZS4KICAqIFxwYXJhbSBwaFNickVuY29kZXIgICAgIFBvaW50ZXIgdG8gYSBTQlIgRW5jb2RlciBpbnN0YW5jZS4KLSAqIFxwYXJhbSBlbEluZm8gICAgICAgICAgIFN0cnVjdHVyZSB0aGF0IGRlc2NyaWJlcyB0aGUgZWxlbWVudC9jaGFubmVsIGFycmFuZ2VtZW50LgorICogXHBhcmFtIGVsSW5mbyAgICAgICAgICAgU3RydWN0dXJlIHRoYXQgZGVzY3JpYmVzIHRoZSBlbGVtZW50L2NoYW5uZWwKKyAqIGFycmFuZ2VtZW50LgogICogXHBhcmFtIG5vRWxlbWVudHMgICAgICAgQW1vdW50IG9mIGVsZW1lbnRzIGRlc2NyaWJlZCBpbiBlbEluZm8uCiAgKiBccGFyYW0gaW5wdXRCdWZmZXIgICAgICBQb2ludGVyIHRvIHRoZSBlbmNvZGVyIGF1ZGlvIGJ1ZmZlcgorICogXHBhcmFtIGlucHV0QnVmZmVyQnVmU2l6ZSAgICBCdWZmZXIgb2Zmc2V0IG9mIG9uZSBjaGFubmVsIChmcmFtZVNpemUgKyBkZWxheSkKICAqIFxwYXJhbSBiYW5kd2lkdGggICAgICAgIFJldHVybnMgdGhlIGNvcmUgYXVkaW8gZW5jb2RlciBiYW5kd2lkdGggKG91dHB1dCkKLSAqIFxwYXJhbSBidWZmZXJPZmZzZXQgICAgIFJldHVybnMgdGhlIG9mZnNldCBmb3IgdGhlIGF1ZGlvIGlucHV0IGRhdGEgaW4gb3JkZXIgdG8gZG8gZGVsYXkgYmFsYW5jaW5nLgotICogXHBhcmFtIG51bUNoYW5uZWxzICAgICAgSW5wdXQ6IEVuY29kZXIgaW5wdXQgY2hhbm5lbHMuIG91dHB1dDogY29yZSBlbmNvZGVyIGNoYW5uZWxzLgotICogXHBhcmFtIHNhbXBsZVJhdGUgICAgICAgSW5wdXQ6IEVuY29kZXIgc2FtcGxlcmF0ZS4gb3V0cHV0IGNvcmUgZW5jb2RlciBzYW1wbGVyYXRlLgotICogXHBhcmFtIGRvd25TYW1wbGVGYWN0b3IgSW5wdXQ6IFJlbGF0aW9uIGJldHdlZW4gU0JSIGFuZCBjb3JlIGNvZGVyIHNhbXBsaW5nIHJhdGU7Ci0gKiBccGFyYW0gZnJhbWVMZW5ndGggICAgICBJbnB1dDogRW5jb2RlciBmcmFtZUxlbmd0aC4gb3V0cHV0IGNvcmUgZW5jb2RlciBmcmFtZUxlbmd0aC4KLSAqIFxwYXJhbSBhb3QgICAgICAgICAgICAgIElucHV0OiBEZXNpcmVkIEFPVC4gb3V0cHV0IEFPVCB0byBiZSB1c2VkIGFmdGVyIHBhcmFtZXRlciBjaGVja2luZy4KLSAqIFxwYXJhbSBkZWxheSAgICAgICAgICAgIElucHV0OiBjb3JlIGVuY29kZXIgZGVsYXkuIE91dHB1dDogdG90YWwgZGVsYXkgYmVjYXVzZSBvZiBTQlIuCisgKiBccGFyYW0gYnVmZmVyT2Zmc2V0ICAgICBSZXR1cm5zIHRoZSBvZmZzZXQgZm9yIHRoZSBhdWRpbyBpbnB1dCBkYXRhIGluIG9yZGVyCisgKiB0byBkbyBkZWxheSBiYWxhbmNpbmcuCisgKiBccGFyYW0gbnVtQ2hhbm5lbHMgICAgICBJbnB1dDogRW5jb2RlciBpbnB1dCBjaGFubmVscy4gb3V0cHV0OiBjb3JlIGVuY29kZXIKKyAqIGNoYW5uZWxzLgorICogXHBhcmFtIHNhbXBsZVJhdGUgICAgICAgSW5wdXQ6IEVuY29kZXIgc2FtcGxlcmF0ZS4gb3V0cHV0IGNvcmUgZW5jb2RlcgorICogc2FtcGxlcmF0ZS4KKyAqIFxwYXJhbSBkb3duU2FtcGxlRmFjdG9yIElucHV0OiBSZWxhdGlvbiBiZXR3ZWVuIFNCUiBhbmQgY29yZSBjb2RlciBzYW1wbGluZworICogcmF0ZTsKKyAqIFxwYXJhbSBmcmFtZUxlbmd0aCAgICAgIElucHV0OiBFbmNvZGVyIGZyYW1lTGVuZ3RoLiBvdXRwdXQgY29yZSBlbmNvZGVyCisgKiBmcmFtZUxlbmd0aC4KKyAqIFxwYXJhbSBhb3QgICAgICAgICAgICAgIElucHV0OiBBT1QuLgorICogXHBhcmFtIGRlbGF5ICAgICAgICAgICAgSW5wdXQ6IGNvcmUgZW5jb2RlciBkZWxheS4gT3V0cHV0OiB0b3RhbCBkZWxheQorICogYmVjYXVzZSBvZiBTQlIuCiAgKiBccGFyYW0gdHJhbnNmb3JtRmFjdG9yICBUaGUgY29yZSBlbmNvZGVyIHRyYW5zZm9ybSBmYWN0b3IgKGJsb2Nrc3dpdGNoaW5nKS4KICAqIFxwYXJhbSBoZWFkZXJQZXJpb2QgICAgIFJlcGV0aXRpb24gcmF0ZSBvZiB0aGUgU0JSIGhlYWRlcjoKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoLTEpIG1lYW5zIGludGVybiBjb25maWd1cmF0aW9uLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAtICgxLTEwKSBjb3JyZXNwb25kcyB0byBoZWFkZXIgcmVwZXRpdGlvbiByYXRlIGluIGZyYW1lcy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoMS0xMCkgY29ycmVzcG9uZHMgdG8gaGVhZGVyIHJlcGV0aXRpb24gcmF0ZSBpbgorICogZnJhbWVzLgogICogXHJldHVybiAgICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBhbmQgbm9uLXplcm8gaWYgZmFpbGVkLgogICovCi1JTlQgc2JyRW5jb2Rlcl9Jbml0KAotICAgICAgICBIQU5ETEVfU0JSX0VOQ09ERVIgICBoU2JyRW5jb2RlciwKLSAgICAgICAgU0JSX0VMRU1FTlRfSU5GTyAgICAgZWxJbmZvWyg4KV0sCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgIG5vRWxlbWVudHMsCi0gICAgICAgIElOVF9QQ00gICAgICAgICAgICAgKmlucHV0QnVmZmVyLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpjb3JlQmFuZHdpZHRoLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICppbnB1dEJ1ZmZlck9mZnNldCwKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqbnVtQ2hhbm5lbHMsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgKnNhbXBsZVJhdGUsCi0gICAgICAgIFVJTlQgICAgICAgICAgICAgICAgKmRvd25TYW1wbGVGYWN0b3IsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgKmZyYW1lTGVuZ3RoLAotICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSAgICBhb3QsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgKmRlbGF5LAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1GYWN0b3IsCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIGhlYWRlclBlcmlvZCwKLSAgICAgICAgVUxPTkcgICAgICAgICAgICAgICAgc3RhdGVzSW5pdEZsYWcKLSAgICAgICAgKTsKK0lOVCBzYnJFbmNvZGVyX0luaXQoSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICBTQlJfRUxFTUVOVF9JTkZPIGVsSW5mb1soOCldLCBpbnQgbm9FbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqaW5wdXRCdWZmZXIsIFVJTlQgaW5wdXRCdWZmZXJCdWZTaXplLAorICAgICAgICAgICAgICAgICAgICBJTlQgKmNvcmVCYW5kd2lkdGgsIElOVCAqaW5wdXRCdWZmZXJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIElOVCAqbnVtQ2hhbm5lbHMsIGNvbnN0IFVJTlQgc3ludGF4RmxhZ3MsIElOVCAqc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgVUlOVCAqZG93blNhbXBsZUZhY3RvciwgSU5UICpmcmFtZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgYW90LCBpbnQgKmRlbGF5LCBpbnQgdHJhbnNmb3JtRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaGVhZGVyUGVyaW9kLCBVTE9ORyBzdGF0ZXNJbml0RmxhZyk7CiAKIC8qKgotICogXGJyaWVmICAgICAgICAgICAgIERvIGRlbGF5IGxpbmUgYnVmZmVycyBob3VzZWtlZXBpbmcuIFRvIGJlIGNhbGxlZCBhZnRlciBlYWNoIGVuY29kZWQgYXVkaW8gZnJhbWUuCisgKiBcYnJpZWYgICAgICAgICAgICAgRG8gZGVsYXkgbGluZSBidWZmZXJzIGhvdXNla2VlcGluZy4gVG8gYmUgY2FsbGVkIGFmdGVyCisgKiBlYWNoIGVuY29kZWQgYXVkaW8gZnJhbWUuCiAgKiBccGFyYW0gaEVudkVuYyAgICAgU0JSIEVuY29kZXIgaGFuZGxlLgogICogXHBhcmFtIHRpbWVCdWZmZXIgIFBvaW50ZXIgdG8gdGhlIGVuY29kZXIgYXVkaW8gYnVmZmVyLgorICogXHBhcmFtIHRpbWVCdWZmZXJCdWZTSXplIGJ1ZmZlciBzaXplIGZvciBvbmUgY2hhbm5lbAogICogXHJldHVybiAgICAgICAgICAgIDAgb24gc3VjY2VzcywgYW5kIG5vbi16ZXJvIGlmIGZhaWxlZC4KICAqLwotSU5UIHNickVuY29kZXJfVXBkYXRlQnVmZmVycyhIQU5ETEVfU0JSX0VOQ09ERVIgaEVudkVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqdGltZUJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CitJTlQgc2JyRW5jb2Rlcl9VcGRhdGVCdWZmZXJzKEhBTkRMRV9TQlJfRU5DT0RFUiBoRW52RW5jLCBJTlRfUENNICp0aW1lQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHRpbWVCdWZmZXJCdWZTSXplKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICAgICAgICAgICBDbG9zZSBTQlIgZW5jb2RlciBpbnN0YW5jZS4KQEAgLTM3MSwzMSArMzg1LDYzIEBACiAvKioKICAqIFxicmllZiAgICAgICAgICAgICAgIEVuY29kZSBTQlIgZGF0YSBvZiBvbmUgY29tcGxldGUgYXVkaW8gZnJhbWUuCiAgKiBccGFyYW0gaEVudkVuY29kZXIgICBIYW5kbGUgb2YgU0JSIGVuY29kZXIgaW5zdGFuY2UuCi0gKiBccGFyYW0gc2FtcGxlcyAgICAgICBUaW1lIHNhbXBsZXMsIGFsd2F5cyBpbnRlcmxlYXZlZC4KLSAqIFxwYXJhbSB0aW1lSW5TdHJpZGUgIENoYW5uZWwgc3RyaWRlIGZhY3RvciBvZiBzYW1wbGVzIGJ1ZmZlci4KKyAqIFxwYXJhbSBzYW1wbGVzICAgICAgIFRpbWUgc2FtcGxlcywgbm90IGludGVybGVhdmVkLgorICogXHBhcmFtIHRpbWVJblN0cmlkZSAgQ2hhbm5lbCBvZmZzZXQgb2Ygc2FtcGxlcyBidWZmZXIuCiAgKiBccGFyYW0gc2JyRGF0YUJpdHMgICBTaXplIG9mIFNCUiBwYXlsb2FkIGluIGJpdHMuCiAgKiBccGFyYW0gc2JyRGF0YSAgICAgICBTQlIgcGF5bG9hZC4KICAqIFxyZXR1cm4gICAgICAgICAgICAgIDAgb24gc3VjY2VzcywgYW5kIG5vbi16ZXJvIGlmIGZhaWxlZC4KICAqLwotSU5UIHNickVuY29kZXJfRW5jb2RlRnJhbWUoSEFORExFX1NCUl9FTkNPREVSICBoRW52RW5jb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgICAgICAqc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICBzYnJEYXRhQml0c1soOCldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICBzYnJEYXRhWyg4KV1bTUFYX1BBWUxPQURfU0laRV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKK0lOVCBzYnJFbmNvZGVyX0VuY29kZUZyYW1lKEhBTkRMRV9TQlJfRU5DT0RFUiBoRW52RW5jb2RlciwgSU5UX1BDTSAqc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc2FtcGxlc0J1ZlNpemUsIFVJTlQgc2JyRGF0YUJpdHNbKDgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIHNickRhdGFbKDgpXVtNQVhfUEFZTE9BRF9TSVpFXSk7CiAKIC8qKgogICogXGJyaWVmICAgICAgICAgICAgICAgV3JpdGUgU0JSIGhlYWRlcnMgb2Ygb25lIFNCUiBlbGVtZW50LgogICogXHBhcmFtIHNickVuY29kZXIgICAgSGFuZGxlIG9mIHRoZSBTQlIgZW5jb2RlciBpbnN0YW5jZS4KICAqIFxwYXJhbSBoQnMgICAgICAgICAgIEhhbmRsZSBvZiBiaXQgc3RyZWFtIGhhbmRsZSB0byB3cml0ZSBTQlIgaGVhZGVyIHRvLgogICogXHBhcmFtIGVsZW1lbnRfaW5kZXggSW5kZXggb2YgdGhlIFNCUiBlbGVtZW50IHdoaWNoIGhlYWRlciBzaG91bGQgYmUgd3JpdHRlbi4KLSAqIFxwYXJhbSBmU2VuZEhlYWRlcnMgIEZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBTQlIgZW5jb2RlciBzaG91bGQgc2VuZCBtb3JlIGhlYWRlcnMgaW4gdGhlIFNCUiBwYXlsb2FkIG9yIG5vdC4KKyAqIFxwYXJhbSBmU2VuZEhlYWRlcnMgIEZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBTQlIgZW5jb2RlciBzaG91bGQgc2VuZCBtb3JlCisgKiBoZWFkZXJzIGluIHRoZSBTQlIgcGF5bG9hZCBvciBub3QuCiAgKiBccmV0dXJuICAgICAgICAgICAgICB2b2lkCiAgKi8KLXZvaWQgc2JyRW5jb2Rlcl9HZXRIZWFkZXIoSEFORExFX1NCUl9FTkNPREVSICAgc2JyRW5jb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICBlbGVtZW50X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBmU2VuZEhlYWRlcnMpOwordm9pZCBzYnJFbmNvZGVyX0dldEhlYWRlcihIQU5ETEVfU0JSX0VOQ09ERVIgc2JyRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCBJTlQgZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZTZW5kSGVhZGVycyk7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgICAgICBSZXF1ZXN0IHRvIHdyaXRlIFNCUiBoZWFkZXIuCisgKiBccGFyYW0gaFNickVuY29kZXIgIFNCUiBlbmNvZGVyIGhhbmRsZS4KKyAqIFxyZXR1cm4gICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBhbmQgbm9uLXplcm8gaWYgZmFpbGVkLgorICovCitJTlQgc2JyRW5jb2Rlcl9TZW5kSGVhZGVyKEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2Rlcik7CisKKy8qKgorICogXGJyaWVmICAgICAgICAgICAgICBSZXF1ZXN0IGlmIGxhc3Qgc2JyIHBheWxvYWQgY29udGFpbnMgYW4gU0JSIGhlYWRlci4KKyAqIFxwYXJhbSBoU2JyRW5jb2RlciAgU0JSIGVuY29kZXIgaGFuZGxlLgorICogXHJldHVybiAgICAgICAgICAgICAxIGNvbnRhaW5zIHNiciBoZWFkZXIsIDAgd2l0aG91dCBzYnIgaGVhZGVyLgorICovCitJTlQgc2JyRW5jb2Rlcl9Db250YWluc0hlYWRlcihIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIpOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAgICAgU0JSIGhlYWRlciBkZWxheSBpbiBmcmFtZXMuCisgKiBccGFyYW0gaFNickVuY29kZXIgIFNCUiBlbmNvZGVyIGhhbmRsZS4KKyAqIFxyZXR1cm4gICAgICAgICAgICAgRGVsYXkgaW4gZnJhbWVzLCAtMSBvbiBmYWlsdXJlLgorICovCitJTlQgc2JyRW5jb2Rlcl9HZXRIZWFkZXJEZWxheShIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIpOworCisvKioKKyAqIFxicmllZiAgICAgICAgICAgICAgQml0c3RyZW0gZGVsYXkgaW4gU0JSIGZyYW1lcy4KKyAqIFxwYXJhbSBoU2JyRW5jb2RlciAgU0JSIGVuY29kZXIgaGFuZGxlLgorICogXHJldHVybiAgICAgICAgICAgICBEZWxheSBpbiBmcmFtZXMsIC0xIG9uIGZhaWx1cmUuCisgKi8KK0lOVCBzYnJFbmNvZGVyX0dldEJzRGVsYXkoSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyKTsKKworLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgIFByZXBhcmUgU0JSIHBheWxvYWQgZm9yIFNBUC4KKyAqIFxwYXJhbSBoU2JyRW5jb2RlciAgU0JSIGVuY29kZXIgaGFuZGxlLgorICogXHJldHVybiAgICAgICAgICAgICAwIG9uIHN1Y2Nlc3MsIGFuZCBub24temVybyBpZiBmYWlsZWQuCisgKi8KK0lOVCBzYnJFbmNvZGVyX1NBUFByZXBhcmUoSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyKTsKIAogLyoqCiAgKiBcYnJpZWYgICAgICAgICAgICAgIFNCUiBlbmNvZGVyIGJpdHJhdGUgZXN0aW1hdGlvbi4KQEAgLTQwNCw3ICs0NTAsNiBAQAogICovCiBJTlQgc2JyRW5jb2Rlcl9HZXRFc3RpbWF0ZUJpdHJhdGUoSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyKTsKIAotCiAvKioKICAqIFxicmllZiAgICAgICAgICAgICAgRGVsYXkgYmV0d2VlbiBpbnB1dCBkYXRhIGFuZCBkb3duc2FtcGxlZCBvdXRwdXQgZGF0YS4KICAqIFxwYXJhbSBoU2JyRW5jb2RlciAgU0JSIGVuY29kZXIgaGFuZGxlLgpAQCAtNDEzLDggKzQ1OCwxNiBAQAogSU5UIHNickVuY29kZXJfR2V0SW5wdXREYXRhRGVsYXkoSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyKTsKIAogLyoqCisgKiBcYnJpZWYgICAgICAgICAgICAgIERlbGF5IGNhdXNlZCBieSB0aGUgU0JSIGRlY29kZXIuCisgKiBccGFyYW0gaFNickVuY29kZXIgIFNCUiBlbmNvZGVyIGhhbmRsZS4KKyAqIFxyZXR1cm4gICAgICAgICAgICAgRGVsYXkuCisgKi8KK0lOVCBzYnJFbmNvZGVyX0dldFNickRlY0RlbGF5KEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2Rlcik7CisKKy8qKgogICogXGJyaWVmICAgICAgIEdldCBkZWNvZGVyIGxpYnJhcnkgdmVyc2lvbiBpbmZvLgotICogXHBhcmFtIGluZm8gIFBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIExJQl9JTkZPIHN0cnVjdCwgd2hlcmUgbGlicmFyeSBpbmZvIGlzIHdyaXR0ZW4gdG8uCisgKiBccGFyYW0gaW5mbyAgUG9pbnRlciB0byBhbiBhbGxvY2F0ZWQgTElCX0lORk8gc3RydWN0LCB3aGVyZSBsaWJyYXJ5IGluZm8gaXMKKyAqIHdyaXR0ZW4gdG8uCiAgKiBccmV0dXJuICAgICAgMCBvbiBzdWNlc3MuCiAgKi8KIElOVCBzYnJFbmNvZGVyX0dldExpYkluZm8oTElCX0lORk8gKmluZm8pOwpAQCAtNDI0LDcgKzQ3Nyw3IEBACiB2b2lkIHNiclByaW50Uk9NKHZvaWQpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKLSAgICAgICAgfQorfQogI2VuZGlmCiAKICNlbmRpZiAvKiBpZm5kZWYgX19TQlJfTUFJTl9IICovCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL2JpdF9zYnIuY3BwIGIvbGliU0JSZW5jL3NyYy9iaXRfc2JyLmNwcAppbmRleCA5MjAwZTAxLi41YTY1ZTk4IDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL2JpdF9zYnIuY3BwCisrKyBiL2xpYlNCUmVuYy9zcmMvYml0X3Nici5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDIxIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgU0JSIGJpdCB3cml0aW5nIHJvdXRpbmVzICAKKyAgXGJyaWVmICBTQlIgYml0IHdyaXRpbmcgcm91dGluZXMgJFJldmlzaW9uOiA5MzMwMCAkCiAqLwogCi0KICNpbmNsdWRlICJiaXRfc2JyLmgiCiAKICNpbmNsdWRlICJjb2RlX2Vudi5oIgpAQCAtOTUsNzEgKzExMyw1NCBAQAogCiAjaW5jbHVkZSAicHNfbWFpbi5oIgogCi10eXBlZGVmIGVudW0gewotICBTQlJfSURfU0NFID0gMSwKLSAgU0JSX0lEX0NQRQotfSBTQlJfRUxFTUVOVF9UWVBFOwordHlwZWRlZiBlbnVtIHsgU0JSX0lEX1NDRSA9IDEsIFNCUl9JRF9DUEUgfSBTQlJfRUxFTUVOVF9UWVBFOwogCitzdGF0aWMgSU5UIGVuY29kZVNickRhdGEoSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGFSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBIGNtb25EYXRhLCBTQlJfRUxFTUVOVF9UWVBFIHNickVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNvdXBsaW5nLCBVSU5UIHNiclN5bnRheEZsYWdzKTsKIAotc3RhdGljIElOVCBlbmNvZGVTYnJEYXRhIChIQU5ETEVfU0JSX0VOVl9EQVRBICAgICAgIHNickVudkRhdGFMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VOVl9EQVRBICAgICAgIHNickVudkRhdGFSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICBoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBICAgICAgICBjbW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0VMRU1FTlRfVFlQRSAgICAgICAgICBzYnJFbGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgIGNvdXBsaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKTsKK3N0YXRpYyBJTlQgZW5jb2RlU2JySGVhZGVyKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgc2JySGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgc2JyQml0c3RyZWFtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSBjbW9uRGF0YSk7CiAKLXN0YXRpYyBJTlQgZW5jb2RlU2JySGVhZGVyIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBICAgICBzYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgIHNickJpdHN0cmVhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBICAgICAgICAgY21vbkRhdGEpOworc3RhdGljIElOVCBlbmNvZGVTYnJIZWFkZXJEYXRhKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgc2JySGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKTsKIAorc3RhdGljIElOVCBlbmNvZGVTYnJTaW5nbGVDaGFubmVsRWxlbWVudCgKKyAgICBIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCisgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvLCBjb25zdCBVSU5UIHNiclN5bnRheEZsYWdzKTsKIAotc3RhdGljIElOVCBlbmNvZGVTYnJIZWFkZXJEYXRhIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIHNickhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJpdFN0cmVhbSk7CitzdGF0aWMgSU5UIGVuY29kZVNickNoYW5uZWxQYWlyRWxlbWVudCgKKyAgICBIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGFMZWZ0LCBIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGFSaWdodCwKKyAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8sIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sCisgICAgY29uc3QgSU5UIGNvdXBsaW5nLCBjb25zdCBVSU5UIHNiclN5bnRheEZsYWdzKTsKIAotc3RhdGljIElOVCBlbmNvZGVTYnJTaW5nbGVDaGFubmVsRWxlbWVudCAoSEFORExFX1NCUl9FTlZfREFUQSAgICAgIHNickVudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICAgaEJpdFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFVJTlQgIHNiclN5bnRheEZsYWdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworc3RhdGljIElOVCBlbmNvZGVTYnJHcmlkKEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKTsKIAorc3RhdGljIGludCBlbmNvZGVMb3dEZWxheVNickdyaWQoSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0cmFuc21pdEZyZXFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBzYnJTeW50YXhGbGFncyk7CiAKK3N0YXRpYyBJTlQgZW5jb2RlU2JyRHRkZihIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSk7CiAKLXN0YXRpYyBJTlQgZW5jb2RlU2JyQ2hhbm5lbFBhaXJFbGVtZW50IChIQU5ETEVfU0JSX0VOVl9EQVRBICAgICAgc2JyRW52RGF0YUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTlZfREFUQSAgICAgIHNickVudkRhdGFSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgIGNvdXBsaW5nKTsKK3N0YXRpYyBJTlQgd3JpdGVOb2lzZUxldmVsRGF0YShIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgSU5UIGNvdXBsaW5nKTsKIAorc3RhdGljIElOVCB3cml0ZUVudmVsb3BlRGF0YShIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIElOVCBjb3VwbGluZyk7CiAKLXN0YXRpYyBJTlQgZW5jb2RlU2JyR3JpZCAoSEFORExFX1NCUl9FTlZfREFUQSAgIHNickVudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0U3RyZWFtKTsKK3N0YXRpYyBJTlQgd3JpdGVTeW50aGV0aWNDb2RpbmdEYXRhKEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pOwogCi1zdGF0aWMgaW50IGVuY29kZUxvd0RlbGF5U2JyR3JpZCAoIEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zbWl0RnJlcXMpOworc3RhdGljIElOVCBlbmNvZGVFeHRlbmRlZERhdGEoSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSk7CiAKLXN0YXRpYyBJTlQgZW5jb2RlU2JyRHRkZiAoSEFORExFX1NCUl9FTlZfREFUQSAgIHNickVudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0U3RyZWFtKTsKLQotc3RhdGljIElOVCB3cml0ZU5vaXNlTGV2ZWxEYXRhIChIQU5ETEVfU0JSX0VOVl9EQVRBICAgc2JyRW52RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICBjb3VwbGluZyk7Ci0KLXN0YXRpYyBJTlQgd3JpdGVFbnZlbG9wZURhdGEgKEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgc2JyRW52RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgY291cGxpbmcpOwotCi1zdGF0aWMgSU5UIHdyaXRlU3ludGhldGljQ29kaW5nRGF0YSAoSEFORExFX1NCUl9FTlZfREFUQSAgc2JyRW52RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKTsKLQotCi1zdGF0aWMgSU5UIGVuY29kZUV4dGVuZGVkRGF0YSAoSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgICBoQml0U3RyZWFtKTsKLQotCi0KLXN0YXRpYyBJTlQgZ2V0U2JyRXh0ZW5kZWREYXRhU2l6ZSAoSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICBoUGFyYW1ldHJpY1N0ZXJlbyk7CitzdGF0aWMgSU5UIGdldFNickV4dGVuZGVkRGF0YVNpemUoSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKQEAgLTE3MCw0MCArMTcxLDI2IEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUlOVAotRkRLc2JyRW5jX1dyaXRlRW52U2luZ2xlQ2hhbm5lbEVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIHNickhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgICAgICAgIHNickJpdHN0cmVhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VOVl9EQVRBICAgICAgICAgICAgICBzYnJFbnZEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBICAgICAgICAgICAgICAgY21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCitJTlQgRkRLc2JyRW5jX1dyaXRlRW52U2luZ2xlQ2hhbm5lbEVsZW1lbnQoCisgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAorICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBIHNickJpdHN0cmVhbURhdGEsIEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwKKyAgICBIQU5ETEVfQ09NTU9OX0RBVEEgY21vbkRhdGEsIFVJTlQgc2JyU3ludGF4RmxhZ3MpCiAKIHsKICAgSU5UIHBheWxvYWRCaXRzID0gMDsKIAotICBjbW9uRGF0YS0+c2JySGRyQml0cyAgPSAwOworICBjbW9uRGF0YS0+c2JySGRyQml0cyA9IDA7CiAgIGNtb25EYXRhLT5zYnJEYXRhQml0cyA9IDA7CiAKICAgLyogd3JpdGUgcHVyZSBzYnIgZGF0YSAqLwogICBpZiAoc2JyRW52RGF0YSAhPSBOVUxMKSB7Ci0KICAgICAvKiB3cml0ZSBoZWFkZXIgKi8KLSAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJIZWFkZXIgKHNickhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21vbkRhdGEpOwotCisgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JySGVhZGVyKHNickhlYWRlckRhdGEsIHNickJpdHN0cmVhbURhdGEsIGNtb25EYXRhKTsKIAogICAgIC8qIHdyaXRlIGRhdGEgKi8KLSAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJEYXRhIChzYnJFbnZEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0lEX1NDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKTsKLQorICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickRhdGEoc2JyRW52RGF0YSwgTlVMTCwgaFBhcmFtZXRyaWNTdGVyZW8sIGNtb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0lEX1NDRSwgMCwgc2JyU3ludGF4RmxhZ3MpOwogICB9CiAgIHJldHVybiBwYXlsb2FkQml0czsKIH0KQEAgLTIxNyw4MyArMjA0LDY1IEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUlOVAotRkRLc2JyRW5jX1dyaXRlRW52Q2hhbm5lbFBhaXJFbGVtZW50IChIQU5ETEVfU0JSX0hFQURFUl9EQVRBICAgICBzYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gICBoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSAgc2JyQml0c3RyZWFtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTlZfREFUQSAgICAgICAgc2JyRW52RGF0YUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICAgIHNickVudkRhdGFSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBICAgICAgICAgY21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKQorSU5UIEZES3NickVuY19Xcml0ZUVudkNoYW5uZWxQYWlyRWxlbWVudCgKKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIHNickhlYWRlckRhdGEsCisgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvLAorICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgc2JyQml0c3RyZWFtRGF0YSwKKyAgICBIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGFMZWZ0LCBIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGFSaWdodCwKKyAgICBIQU5ETEVfQ09NTU9OX0RBVEEgY21vbkRhdGEsIFVJTlQgc2JyU3ludGF4RmxhZ3MpCiAKIHsKICAgSU5UIHBheWxvYWRCaXRzID0gMDsKLSAgY21vbkRhdGEtPnNickhkckJpdHMgID0gMDsKKyAgY21vbkRhdGEtPnNickhkckJpdHMgPSAwOwogICBjbW9uRGF0YS0+c2JyRGF0YUJpdHMgPSAwOwogCiAgIC8qIHdyaXRlIHB1cmUgc2JyIGRhdGEgKi8KICAgaWYgKChzYnJFbnZEYXRhTGVmdCAhPSBOVUxMKSAmJiAoc2JyRW52RGF0YVJpZ2h0ICE9IE5VTEwpKSB7Ci0KICAgICAvKiB3cml0ZSBoZWFkZXIgKi8KLSAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJIZWFkZXIgKHNickhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21vbkRhdGEpOworICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickhlYWRlcihzYnJIZWFkZXJEYXRhLCBzYnJCaXRzdHJlYW1EYXRhLCBjbW9uRGF0YSk7CiAKICAgICAvKiB3cml0ZSBkYXRhICovCi0gICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRGF0YSAoc2JyRW52RGF0YUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9JRF9DUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyU3ludGF4RmxhZ3MpOwotCisgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRGF0YShzYnJFbnZEYXRhTGVmdCwgc2JyRW52RGF0YVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8sIGNtb25EYXRhLCBTQlJfSURfQ1BFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcsIHNiclN5bnRheEZsYWdzKTsKICAgfQogICByZXR1cm4gcGF5bG9hZEJpdHM7CiB9CiAKLUlOVAotRkRLc2JyRW5jX0NvdW50U2JyQ2hhbm5lbFBhaXJFbGVtZW50IChIQU5ETEVfU0JSX0hFQURFUl9EQVRBICAgICBzYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gICBoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSAgc2JyQml0c3RyZWFtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTlZfREFUQSAgICAgICAgc2JyRW52RGF0YUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgICAgICAgIHNickVudkRhdGFSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBICAgICAgICAgY21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKQoteworSU5UIEZES3NickVuY19Db3VudFNickNoYW5uZWxQYWlyRWxlbWVudCgKKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIHNickhlYWRlckRhdGEsCisgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvLAorICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgc2JyQml0c3RyZWFtRGF0YSwKKyAgICBIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGFMZWZ0LCBIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGFSaWdodCwKKyAgICBIQU5ETEVfQ09NTU9OX0RBVEEgY21vbkRhdGEsIFVJTlQgc2JyU3ludGF4RmxhZ3MpIHsKICAgSU5UIHBheWxvYWRCaXRzOwogICBJTlQgYml0UG9zID0gRkRLZ2V0VmFsaWRCaXRzKCZjbW9uRGF0YS0+c2JyQml0YnVmKTsKIAotICBwYXlsb2FkQml0cyA9IEZES3NickVuY19Xcml0ZUVudkNoYW5uZWxQYWlyRWxlbWVudChzYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKTsKKyAgcGF5bG9hZEJpdHMgPSBGREtzYnJFbmNfV3JpdGVFbnZDaGFubmVsUGFpckVsZW1lbnQoCisgICAgICBzYnJIZWFkZXJEYXRhLCBoUGFyYW1ldHJpY1N0ZXJlbywgc2JyQml0c3RyZWFtRGF0YSwgc2JyRW52RGF0YUxlZnQsCisgICAgICBzYnJFbnZEYXRhUmlnaHQsIGNtb25EYXRhLCBzYnJTeW50YXhGbGFncyk7CiAKLSAgRkRLcHVzaEJhY2soJmNtb25EYXRhLT5zYnJCaXRidWYsIChGREtnZXRWYWxpZEJpdHMoJmNtb25EYXRhLT5zYnJCaXRidWYpIC0gYml0UG9zKSApOworICBGREtwdXNoQmFjaygmY21vbkRhdGEtPnNickJpdGJ1ZiwKKyAgICAgICAgICAgICAgKEZES2dldFZhbGlkQml0cygmY21vbkRhdGEtPnNickJpdGJ1ZikgLSBiaXRQb3MpKTsKIAogICByZXR1cm4gcGF5bG9hZEJpdHM7CiB9CiAKK3ZvaWQgc2JyRW5jb2Rlcl9HZXRIZWFkZXIoU0JSX0VOQ09ERVIgKnNickVuY29kZXIsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGVsZW1lbnRfaW5kZXgsIGludCBmU2VuZEhlYWRlcnMpIHsKKyAgZW5jb2RlU2JySGVhZGVyRGF0YSgmc2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbGVtZW50X2luZGV4XS0+c2JySGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBoQnMpOwogCi12b2lkIHNickVuY29kZXJfR2V0SGVhZGVyKFNCUl9FTkNPREVSICAgKnNickVuY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgZWxlbWVudF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgZlNlbmRIZWFkZXJzKQotewotICBlbmNvZGVTYnJIZWFkZXJEYXRhICgmc2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbGVtZW50X2luZGV4XS0+c2JySGVhZGVyRGF0YSwgaEJzKTsKLSAgICAKICAgaWYgKGZTZW5kSGVhZGVycyA9PSAwKSB7CiAgICAgLyogUHJldmVudCBoZWFkZXIgYmVpbmcgZW1iZWRkZWQgaW50byB0aGUgU0JSIHBheWxvYWQuICovCi0gICAgc2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbGVtZW50X2luZGV4XS0+c2JyQml0c3RyZWFtRGF0YS5OclNlbmRIZWFkZXJEYXRhID0gLTE7CisgICAgc2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbGVtZW50X2luZGV4XS0+c2JyQml0c3RyZWFtRGF0YS5OclNlbmRIZWFkZXJEYXRhID0KKyAgICAgICAgLTE7CiAgICAgc2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbGVtZW50X2luZGV4XS0+c2JyQml0c3RyZWFtRGF0YS5IZWFkZXJBY3RpdmUgPSAwOwotICAgIHNickVuY29kZXItPnNickVsZW1lbnRbZWxlbWVudF9pbmRleF0tPnNickJpdHN0cmVhbURhdGEuQ291bnRTZW5kSGVhZGVyRGF0YSA9IC0xOworICAgIHNickVuY29kZXItPnNickVsZW1lbnRbZWxlbWVudF9pbmRleF0KKyAgICAgICAgLT5zYnJCaXRzdHJlYW1EYXRhLkNvdW50U2VuZEhlYWRlckRhdGEgPSAtMTsKICAgfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgZnVuY3Rpb25uYW1lOiBlbmNvZGVTYnJIZWFkZXIKQEAgLTMwMywyMCArMjcyLDE2IEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQKLWVuY29kZVNickhlYWRlciAoSEFORExFX1NCUl9IRUFERVJfREFUQSAgICAgc2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSAgc2JyQml0c3RyZWFtRGF0YSwKLSAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBICAgICAgICAgY21vbkRhdGEpCi17CitzdGF0aWMgSU5UIGVuY29kZVNickhlYWRlcihIQU5ETEVfU0JSX0hFQURFUl9EQVRBIHNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0JJVFNUUkVBTV9EQVRBIHNickJpdHN0cmVhbURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQ09NTU9OX0RBVEEgY21vbkRhdGEpIHsKICAgSU5UIHBheWxvYWRCaXRzID0gMDsKIAogICBpZiAoc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKSB7Ci0gICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzICgmY21vbkRhdGEtPnNickJpdGJ1ZiwgMSwgMSk7Ci0gICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JySGVhZGVyRGF0YSAoc2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY21vbkRhdGEtPnNickJpdGJ1Zik7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzICgmY21vbkRhdGEtPnNickJpdGJ1ZiwgMCwgMSk7CisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKCZjbW9uRGF0YS0+c2JyQml0YnVmLCAxLCAxKTsKKyAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJIZWFkZXJEYXRhKHNickhlYWRlckRhdGEsICZjbW9uRGF0YS0+c2JyQml0YnVmKTsKKyAgfSBlbHNlIHsKKyAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoJmNtb25EYXRhLT5zYnJCaXRidWYsIDAsIDEpOwogICB9CiAKICAgY21vbkRhdGEtPnNickhkckJpdHMgPSBwYXlsb2FkQml0czsKQEAgLTMyNCw4ICsyODksNiBAQAogICByZXR1cm4gcGF5bG9hZEJpdHM7CiB9CiAKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogZW5jb2RlU2JySGVhZGVyRGF0YQpAQCAtMzM2LDU3ICsyOTksNTQgQEAKICAgICBvdXRwdXQ6CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVAotZW5jb2RlU2JySGVhZGVyRGF0YSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKK3N0YXRpYyBJTlQgZW5jb2RlU2JySGVhZGVyRGF0YShIQU5ETEVfU0JSX0hFQURFUl9EQVRBIHNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKIAogewogICBJTlQgcGF5bG9hZEJpdHMgPSAwOwogICBpZiAoc2JySGVhZGVyRGF0YSAhPSBOVUxMKSB7Ci0gICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5zYnJfYW1wX3JlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9BTVBfUkVTX0JJVFMpOwotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX3N0YXJ0X2ZyZXF1ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9TVEFSVF9GUkVRX0JJVFMpOwotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX3N0b3BfZnJlcXVlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX1NUT1BfRlJFUV9CSVRTKTsKLSAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPnNicl94b3Zlcl9iYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX1hPVkVSX0JBTkRfQklUUyk7CisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPnNicl9hbXBfcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfQU1QX1JFU19CSVRTKTsKKyAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX3N0YXJ0X2ZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX1NUQVJUX0ZSRVFfQklUUyk7CisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPnNicl9zdG9wX2ZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX1NUT1BfRlJFUV9CSVRTKTsKKyAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX3hvdmVyX2JhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9YT1ZFUl9CQU5EX0JJVFMpOwogCi0gICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX1JFU0VSVkVEX0JJVFMpOworICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAwLCBTSV9TQlJfUkVTRVJWRURfQklUUyk7CiAKLSAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPmhlYWRlcl9leHRyYV8xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0hFQURFUl9FWFRSQV8xX0JJVFMpOwotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+aGVhZGVyX2V4dHJhXzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfSEVBREVSX0VYVFJBXzJfQklUUyk7Ci0KKyAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+aGVhZGVyX2V4dHJhXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9IRUFERVJfRVhUUkFfMV9CSVRTKTsKKyAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+aGVhZGVyX2V4dHJhXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9IRUFERVJfRVhUUkFfMl9CSVRTKTsKIAogICAgIGlmIChzYnJIZWFkZXJEYXRhLT5oZWFkZXJfZXh0cmFfMSkgewotICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5mcmVxU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9GUkVRX1NDQUxFX0JJVFMpOwotICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5hbHRlclNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfQUxURVJfU0NBTEVfQklUUyk7Ci0gICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPnNicl9ub2lzZV9iYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX05PSVNFX0JBTkRTX0JJVFMpOworICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPmZyZXFTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfRlJFUV9TQ0FMRV9CSVRTKTsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5hbHRlclNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9BTFRFUl9TQ0FMRV9CSVRTKTsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5zYnJfbm9pc2VfYmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX05PSVNFX0JBTkRTX0JJVFMpOwogICAgIH0gLyogc2JySGVhZGVyRGF0YS0+aGVhZGVyX2V4dHJhXzEgKi8KIAogICAgIGlmIChzYnJIZWFkZXJEYXRhLT5oZWFkZXJfZXh0cmFfMikgewotICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5zYnJfbGltaXRlcl9iYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0xJTUlURVJfQkFORFNfQklUUyk7Ci0gICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickhlYWRlckRhdGEtPnNicl9saW1pdGVyX2dhaW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfTElNSVRFUl9HQUlOU19CSVRTKTsKLSAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX2ludGVycG9sX2ZyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX1NCUl9JTlRFUlBPTF9GUkVRX0JJVFMpOwotICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5zYnJfc21vb3RoaW5nX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX1NNT09USElOR19MRU5HVEhfQklUUyk7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX2xpbWl0ZXJfYmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0xJTUlURVJfQkFORFNfQklUUyk7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX2xpbWl0ZXJfZ2FpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0xJTUlURVJfR0FJTlNfQklUUyk7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JySGVhZGVyRGF0YS0+c2JyX2ludGVycG9sX2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0lOVEVSUE9MX0ZSRVFfQklUUyk7CisgICAgICBwYXlsb2FkQml0cyArPQorICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJIZWFkZXJEYXRhLT5zYnJfc21vb3RoaW5nX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX1NNT09USElOR19MRU5HVEhfQklUUyk7CiAKICAgICB9IC8qIHNickhlYWRlckRhdGEtPmhlYWRlcl9leHRyYV8yICovCi0gIH0gLyogc2JySGVhZGVyRGF0YSAhPSBOVUxMICovCisgIH0gICAvKiBzYnJIZWFkZXJEYXRhICE9IE5VTEwgKi8KIAogICByZXR1cm4gcGF5bG9hZEJpdHM7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IGVuY29kZVNickRhdGEKQEAgLTM5NiwyNyArMzU2LDI3IEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQKLWVuY29kZVNickRhdGEgKEhBTkRMRV9TQlJfRU5WX0RBVEEgICBzYnJFbnZEYXRhTGVmdCwKLSAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgICBzYnJFbnZEYXRhUmlnaHQsCi0gICAgICAgICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gICBoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSAgICBjbW9uRGF0YSwKLSAgICAgICAgICAgICAgIFNCUl9FTEVNRU5UX1RZUEUgICAgICBzYnJFbGVtLAotICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgIGNvdXBsaW5nLAotICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKQoteworc3RhdGljIElOVCBlbmNvZGVTYnJEYXRhKEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvLAorICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSBjbW9uRGF0YSwgU0JSX0VMRU1FTlRfVFlQRSBzYnJFbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjb3VwbGluZywgVUlOVCBzYnJTeW50YXhGbGFncykgewogICBJTlQgcGF5bG9hZEJpdHMgPSAwOwogCiAgIHN3aXRjaCAoc2JyRWxlbSkgewotICBjYXNlIFNCUl9JRF9TQ0U6Ci0gICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyU2luZ2xlQ2hhbm5lbEVsZW1lbnQgKHNickVudkRhdGFMZWZ0LCAmY21vbkRhdGEtPnNickJpdGJ1ZiwgaFBhcmFtZXRyaWNTdGVyZW8sIHNiclN5bnRheEZsYWdzKTsKLSAgICBicmVhazsKLSAgY2FzZSBTQlJfSURfQ1BFOgotICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickNoYW5uZWxQYWlyRWxlbWVudCAoc2JyRW52RGF0YUxlZnQsIHNickVudkRhdGFSaWdodCwgaFBhcmFtZXRyaWNTdGVyZW8sICZjbW9uRGF0YS0+c2JyQml0YnVmLCBjb3VwbGluZyk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgLyogd2UgbmV2ZXIgc2hvdWxkIGFwcGx5IFNCUiB0byBhbnkgb3RoZXIgZWxlbWVudCB0eXBlICovCi0gICAgRkRLX0FTU0VSVCAoMCk7CisgICAgY2FzZSBTQlJfSURfU0NFOgorICAgICAgcGF5bG9hZEJpdHMgKz0KKyAgICAgICAgICBlbmNvZGVTYnJTaW5nbGVDaGFubmVsRWxlbWVudChzYnJFbnZEYXRhTGVmdCwgJmNtb25EYXRhLT5zYnJCaXRidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8sIHNiclN5bnRheEZsYWdzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0JSX0lEX0NQRToKKyAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickNoYW5uZWxQYWlyRWxlbWVudCgKKyAgICAgICAgICBzYnJFbnZEYXRhTGVmdCwgc2JyRW52RGF0YVJpZ2h0LCBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICAgICAgICAmY21vbkRhdGEtPnNickJpdGJ1ZiwgY291cGxpbmcsIHNiclN5bnRheEZsYWdzKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiB3ZSBuZXZlciBzaG91bGQgYXBwbHkgU0JSIHRvIGFueSBvdGhlciBlbGVtZW50IHR5cGUgKi8KKyAgICAgIEZES19BU1NFUlQoMCk7CiAgIH0KIAogICBjbW9uRGF0YS0+c2JyRGF0YUJpdHMgPSBwYXlsb2FkQml0czsKQEAgLTQyNCwxMyArMzg0LDEwIEBACiAgIHJldHVybiBwYXlsb2FkQml0czsKIH0KIAotI2RlZmluZSBNT0RFX0ZSRVFfVEFOUyAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBNT0RFX05PX0ZSRVFfVFJBTiAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBMRF9UUkFOU01JU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgTU9ERV9GUkVRX1RBTlMKLXN0YXRpYyBpbnQgZW5jb2RlRnJlcXMgKGludCBtb2RlKSB7Ci0gICAgcmV0dXJuICgobW9kZSAmIE1PREVfRlJFUV9UQU5TKSA/IDEgOiAwKTsKLX0KLQorI2RlZmluZSBNT0RFX0ZSRVFfVEFOUyAxCisjZGVmaW5lIE1PREVfTk9fRlJFUV9UUkFOIDAKKyNkZWZpbmUgTERfVFJBTlNNSVNTSU9OIE1PREVfRlJFUV9UQU5TCitzdGF0aWMgaW50IGVuY29kZUZyZXFzKGludCBtb2RlKSB7IHJldHVybiAoKG1vZGUgJiBNT0RFX0ZSRVFfVEFOUykgPyAxIDogMCk7IH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKQEAgLTQ0MSw1MSArMzk4LDQ3IEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQKLWVuY29kZVNiclNpbmdsZUNoYW5uZWxFbGVtZW50IChIQU5ETEVfU0JSX0VOVl9EQVRBICAgc2JyRW52RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsVUlOVCAgc2JyU3ludGF4RmxhZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CitzdGF0aWMgSU5UIGVuY29kZVNiclNpbmdsZUNoYW5uZWxFbGVtZW50KAorICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8sIGNvbnN0IFVJTlQgc2JyU3ludGF4RmxhZ3MpIHsKICAgSU5UIGksIHBheWxvYWRCaXRzID0gMDsKIAotICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIDAsIFNJX1NCUl9EQVRBX0VYVFJBX0JJVFMpOyAvKiBubyByZXNlcnZlZCBiaXRzICovCisgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0RBVEFfRVhUUkFfQklUUyk7IC8qIG5vIHJlc2VydmVkIGJpdHMgKi8KIAogICBpZiAoc2JyRW52RGF0YS0+bGRHcmlkKSB7Ci0gICAgICBpZiAoIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MgIT0gRklYRklYb25seSApIHsKLSAgICAgICAgLyogZW5jb2RlIG5vcm1hbCBTYnJHcmlkICovCi0gICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQgKHNickVudkRhdGEsIGhCaXRTdHJlYW0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogdXNlIEZJWEZJWG9ubHkgZnJhbWUgR3JpZCAqLwotICAgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVMb3dEZWxheVNickdyaWQgKCBzYnJFbnZEYXRhLCBoQml0U3RyZWFtLCBlbmNvZGVGcmVxcyhMRF9UUkFOU01JU1NJT04pKTsKLSAgICAgIH0KLSAgfQotICBlbHNlCi0gIHsKLSAgICBpZiAoc2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX1NDQUxBQkxFKSB7Ci0gICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIDEsIFNJX1NCUl9DT1VQTElOR19CSVRTKTsKKyAgICBpZiAoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+ZnJhbWVDbGFzcyAhPSBGSVhGSVhvbmx5KSB7CisgICAgICAvKiBlbmNvZGUgbm9ybWFsIFNickdyaWQgKi8KKyAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQoc2JyRW52RGF0YSwgaEJpdFN0cmVhbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHVzZSBGSVhGSVhvbmx5IGZyYW1lIEdyaWQgKi8KKyAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZUxvd0RlbGF5U2JyR3JpZCgKKyAgICAgICAgICBzYnJFbnZEYXRhLCBoQml0U3RyZWFtLCBlbmNvZGVGcmVxcyhMRF9UUkFOU01JU1NJT04pLCBzYnJTeW50YXhGbGFncyk7CiAgICAgfQotICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQgKHNickVudkRhdGEsIGhCaXRTdHJlYW0pOworICB9IGVsc2UgeworICAgIGlmIChzYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfU0NBTEFCTEUpIHsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCAxLCBTSV9TQlJfQ09VUExJTkdfQklUUyk7CisgICAgfQorICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQoc2JyRW52RGF0YSwgaEJpdFN0cmVhbSk7CiAgIH0KIAotICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJEdGRmIChzYnJFbnZEYXRhLCBoQml0U3RyZWFtKTsKKyAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRHRkZihzYnJFbnZEYXRhLCBoQml0U3RyZWFtKTsKIAogICBmb3IgKGkgPSAwOyBpIDwgc2JyRW52RGF0YS0+bm9PZm5vaXNlYmFuZHM7IGkrKykgewotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+c2JyX2ludmZfbW9kZV92ZWNbaV0sIFNJX1NCUl9JTlZGX01PREVfQklUUyk7CisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPnNicl9pbnZmX21vZGVfdmVjW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfSU5WRl9NT0RFX0JJVFMpOwogICB9CiAKLSAgcGF5bG9hZEJpdHMgKz0gd3JpdGVFbnZlbG9wZURhdGEgKHNickVudkRhdGEsIGhCaXRTdHJlYW0sIDApOwotICBwYXlsb2FkQml0cyArPSB3cml0ZU5vaXNlTGV2ZWxEYXRhIChzYnJFbnZEYXRhLCBoQml0U3RyZWFtLCAwKTsKKyAgcGF5bG9hZEJpdHMgKz0gd3JpdGVFbnZlbG9wZURhdGEoc2JyRW52RGF0YSwgaEJpdFN0cmVhbSwgMCk7CisgIHBheWxvYWRCaXRzICs9IHdyaXRlTm9pc2VMZXZlbERhdGEoc2JyRW52RGF0YSwgaEJpdFN0cmVhbSwgMCk7CiAKLSAgcGF5bG9hZEJpdHMgKz0gd3JpdGVTeW50aGV0aWNDb2RpbmdEYXRhIChzYnJFbnZEYXRhLGhCaXRTdHJlYW0pOworICBwYXlsb2FkQml0cyArPSB3cml0ZVN5bnRoZXRpY0NvZGluZ0RhdGEoc2JyRW52RGF0YSwgaEJpdFN0cmVhbSk7CiAKICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlRXh0ZW5kZWREYXRhKGhQYXJhbWV0cmljU3RlcmVvLCBoQml0U3RyZWFtKTsKIAogICByZXR1cm4gcGF5bG9hZEJpdHM7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IGVuY29kZVNickNoYW5uZWxQYWlyRWxlbWVudApAQCAtNDk1LDk3ICs0NDgsMTA0IEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQKLWVuY29kZVNickNoYW5uZWxQYWlyRWxlbWVudCAoSEFORExFX1NCUl9FTlZfREFUQSAgIHNickVudkRhdGFMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VOVl9EQVRBICAgc2JyRW52RGF0YVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gICBoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICBjb3VwbGluZykKLXsKK3N0YXRpYyBJTlQgZW5jb2RlU2JyQ2hhbm5lbFBhaXJFbGVtZW50KAorICAgIEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YUxlZnQsIEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YVJpZ2h0LAorICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKKyAgICBjb25zdCBJTlQgY291cGxpbmcsIGNvbnN0IFVJTlQgc2JyU3ludGF4RmxhZ3MpIHsKICAgSU5UIHBheWxvYWRCaXRzID0gMDsKICAgSU5UIGkgPSAwOwogCi0gIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgMCwgU0lfU0JSX0RBVEFfRVhUUkFfQklUUyk7IC8qIG5vIHJlc2VydmVkIGJpdHMgKi8KKyAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfREFUQV9FWFRSQV9CSVRTKTsgLyogbm8gcmVzZXJ2ZWQgYml0cyAqLwogCi0gIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgY291cGxpbmcsIFNJX1NCUl9DT1VQTElOR19CSVRTKTsKKyAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIGNvdXBsaW5nLCBTSV9TQlJfQ09VUExJTkdfQklUUyk7CiAKICAgaWYgKGNvdXBsaW5nKSB7CiAgICAgaWYgKHNickVudkRhdGFMZWZ0LT5sZEdyaWQpIHsKLSAgICAgICAgICBpZiAoIHNickVudkRhdGFMZWZ0LT5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzICE9IEZJWEZJWG9ubHkgKSB7Ci0gICAgICAgICAgICAvKiBub3JtYWwgU2JyR3JpZCAqLwotICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyR3JpZCAoc2JyRW52RGF0YUxlZnQsIGhCaXRTdHJlYW0pOworICAgICAgaWYgKHNickVudkRhdGFMZWZ0LT5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzICE9IEZJWEZJWG9ubHkpIHsKKyAgICAgICAgLyogbm9ybWFsIFNickdyaWQgKi8KKyAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyR3JpZChzYnJFbnZEYXRhTGVmdCwgaEJpdFN0cmVhbSk7CiAKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAvKiBGSVhGSVhvbmx5IGZyYW1lIEdyaWQgKi8KLSAgICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlTG93RGVsYXlTYnJHcmlkICggc2JyRW52RGF0YUxlZnQsIGhCaXRTdHJlYW0sIGVuY29kZUZyZXFzKExEX1RSQU5TTUlTU0lPTikpOwotICAgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEZJWEZJWG9ubHkgZnJhbWUgR3JpZCAqLworICAgICAgICBwYXlsb2FkQml0cyArPQorICAgICAgICAgICAgZW5jb2RlTG93RGVsYXlTYnJHcmlkKHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZyZXFzKExEX1RSQU5TTUlTU0lPTiksIHNiclN5bnRheEZsYWdzKTsKKyAgICAgIH0KICAgICB9IGVsc2UKLSAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyR3JpZCAoc2JyRW52RGF0YUxlZnQsIGhCaXRTdHJlYW0pOworICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyR3JpZChzYnJFbnZEYXRhTGVmdCwgaEJpdFN0cmVhbSk7CiAKLSAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJEdGRmIChzYnJFbnZEYXRhTGVmdCwgaEJpdFN0cmVhbSk7Ci0gICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRHRkZiAoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtKTsKKyAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJEdGRmKHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtKTsKKyAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJEdGRmKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgc2JyRW52RGF0YUxlZnQtPm5vT2Zub2lzZWJhbmRzOyBpKyspIHsKLSAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YUxlZnQtPnNicl9pbnZmX21vZGVfdmVjW2ldLCBTSV9TQlJfSU5WRl9NT0RFX0JJVFMpOworICAgICAgcGF5bG9hZEJpdHMgKz0KKyAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JyRW52RGF0YUxlZnQtPnNicl9pbnZmX21vZGVfdmVjW2ldLAorICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfSU5WRl9NT0RFX0JJVFMpOwogICAgIH0KIAotICAgIHBheWxvYWRCaXRzICs9IHdyaXRlRW52ZWxvcGVEYXRhICAoc2JyRW52RGF0YUxlZnQsICBoQml0U3RyZWFtLDEpOwotICAgIHBheWxvYWRCaXRzICs9IHdyaXRlTm9pc2VMZXZlbERhdGEgKHNickVudkRhdGFMZWZ0LCAgaEJpdFN0cmVhbSwxKTsKLSAgICBwYXlsb2FkQml0cyArPSB3cml0ZUVudmVsb3BlRGF0YSAgKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSwxKTsKLSAgICBwYXlsb2FkQml0cyArPSB3cml0ZU5vaXNlTGV2ZWxEYXRhIChzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0sMSk7CisgICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVFbnZlbG9wZURhdGEoc2JyRW52RGF0YUxlZnQsIGhCaXRTdHJlYW0sIDEpOworICAgIHBheWxvYWRCaXRzICs9IHdyaXRlTm9pc2VMZXZlbERhdGEoc2JyRW52RGF0YUxlZnQsIGhCaXRTdHJlYW0sIDEpOworICAgIHBheWxvYWRCaXRzICs9IHdyaXRlRW52ZWxvcGVEYXRhKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSwgMSk7CisgICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVOb2lzZUxldmVsRGF0YShzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0sIDEpOwogCi0gICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVTeW50aGV0aWNDb2RpbmdEYXRhIChzYnJFbnZEYXRhTGVmdCxoQml0U3RyZWFtKTsKLSAgICBwYXlsb2FkQml0cyArPSB3cml0ZVN5bnRoZXRpY0NvZGluZ0RhdGEgKHNickVudkRhdGFSaWdodCxoQml0U3RyZWFtKTsKKyAgICBwYXlsb2FkQml0cyArPSB3cml0ZVN5bnRoZXRpY0NvZGluZ0RhdGEoc2JyRW52RGF0YUxlZnQsIGhCaXRTdHJlYW0pOworICAgIHBheWxvYWRCaXRzICs9IHdyaXRlU3ludGhldGljQ29kaW5nRGF0YShzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0pOwogCiAgIH0gZWxzZSB7IC8qIG5vIGNvdXBsaW5nICovCiAgICAgRkRLX0FTU0VSVChzYnJFbnZEYXRhTGVmdC0+bGRHcmlkID09IHNickVudkRhdGFSaWdodC0+bGRHcmlkKTsKIAogICAgIGlmIChzYnJFbnZEYXRhTGVmdC0+bGRHcmlkIHx8IHNickVudkRhdGFSaWdodC0+bGRHcmlkKSB7Ci0gICAgLyogc2JyRW52RGF0YUxlZnQgKGxlZnQgY2hhbm5lbCkgKi8KLSAgICAgIGlmICggc2JyRW52RGF0YUxlZnQtPmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MgIT0gRklYRklYb25seSkgeworICAgICAgLyogc2JyRW52RGF0YUxlZnQgKGxlZnQgY2hhbm5lbCkgKi8KKyAgICAgIGlmIChzYnJFbnZEYXRhTGVmdC0+aFNickJTR3JpZC0+ZnJhbWVDbGFzcyAhPSBGSVhGSVhvbmx5KSB7CiAgICAgICAgIC8qIG5vIEZJWEZJWG9ubHkgRnJhbWUgc28gd2UgZG9udCBuZWVkIGVuY29kZUxvd0RlbGF5U2JyR3JpZCAqLwogICAgICAgICAvKiBub3JtYWwgU2JyR3JpZCAqLwotICAgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJHcmlkIChzYnJFbnZEYXRhTGVmdCwgIGhCaXRTdHJlYW0pOworICAgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJHcmlkKHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtKTsKIAogICAgICAgfSBlbHNlIHsKICAgICAgICAgLyogRklYRklYb25seSBmcmFtZSBHcmlkICovCi0gICAgICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlTG93RGVsYXlTYnJHcmlkICggc2JyRW52RGF0YUxlZnQsIGhCaXRTdHJlYW0sIGVuY29kZUZyZXFzKExEX1RSQU5TTUlTU0lPTikpOworICAgICAgICBwYXlsb2FkQml0cyArPQorICAgICAgICAgICAgZW5jb2RlTG93RGVsYXlTYnJHcmlkKHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZyZXFzKExEX1RSQU5TTUlTU0lPTiksIHNiclN5bnRheEZsYWdzKTsKICAgICAgIH0KIAogICAgICAgLyogc2JyRW52RGF0YVJpZ2h0IChyaWdodCBjaGFubmVsKSAqLwotICAgICAgaWYgKCBzYnJFbnZEYXRhUmlnaHQtPmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MgIT0gRklYRklYb25seSkgeworICAgICAgaWYgKHNickVudkRhdGFSaWdodC0+aFNickJTR3JpZC0+ZnJhbWVDbGFzcyAhPSBGSVhGSVhvbmx5KSB7CiAgICAgICAgIC8qIG5vIEZJWEZJWG9ubHkgRnJhbWUgc28gd2UgZG9udCBuZWVkIGVuY29kZUxvd0RlbGF5U2JyR3JpZCAqLwogICAgICAgICAvKiBub3JtYWwgU2JyR3JpZCAqLwotICAgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJHcmlkIChzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0pOworICAgICAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJHcmlkKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSk7CiAKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIEZJWEZJWG9ubHkgZnJhbWUgR3JpZCAqLwotICAgICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZUxvd0RlbGF5U2JyR3JpZCAoIHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSwgZW5jb2RlRnJlcXMoTERfVFJBTlNNSVNTSU9OKSk7CisgICAgICAgIHBheWxvYWRCaXRzICs9CisgICAgICAgICAgICBlbmNvZGVMb3dEZWxheVNickdyaWQoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZyZXFzKExEX1RSQU5TTUlTU0lPTiksIHNiclN5bnRheEZsYWdzKTsKICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQgKHNickVudkRhdGFMZWZ0LCAgaEJpdFN0cmVhbSk7Ci0gICAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQgKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickdyaWQoc2JyRW52RGF0YUxlZnQsIGhCaXRTdHJlYW0pOworICAgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyR3JpZChzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0pOwogICAgIH0KLSAgICBwYXlsb2FkQml0cyArPSBlbmNvZGVTYnJEdGRmIChzYnJFbnZEYXRhTGVmdCwgIGhCaXRTdHJlYW0pOwotICAgIHBheWxvYWRCaXRzICs9IGVuY29kZVNickR0ZGYgKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSk7CisgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRHRkZihzYnJFbnZEYXRhTGVmdCwgaEJpdFN0cmVhbSk7CisgICAgcGF5bG9hZEJpdHMgKz0gZW5jb2RlU2JyRHRkZihzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0pOwogCiAgICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGFMZWZ0LT5ub09mbm9pc2ViYW5kczsgaSsrKSB7Ci0gICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGFMZWZ0LT5zYnJfaW52Zl9tb2RlX3ZlY1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0lOVkZfTU9ERV9CSVRTKTsKKyAgICAgIHBheWxvYWRCaXRzICs9CisgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickVudkRhdGFMZWZ0LT5zYnJfaW52Zl9tb2RlX3ZlY1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0lOVkZfTU9ERV9CSVRTKTsKICAgICB9CiAgICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGFSaWdodC0+bm9PZm5vaXNlYmFuZHM7IGkrKykgewotICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhUmlnaHQtPnNicl9pbnZmX21vZGVfdmVjW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSV9TQlJfSU5WRl9NT0RFX0JJVFMpOworICAgICAgcGF5bG9hZEJpdHMgKz0KKyAgICAgICAgICBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JyRW52RGF0YVJpZ2h0LT5zYnJfaW52Zl9tb2RlX3ZlY1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0lOVkZfTU9ERV9CSVRTKTsKICAgICB9CiAKLSAgICBwYXlsb2FkQml0cyArPSB3cml0ZUVudmVsb3BlRGF0YSAgKHNickVudkRhdGFMZWZ0LCAgaEJpdFN0cmVhbSwwKTsKLSAgICBwYXlsb2FkQml0cyArPSB3cml0ZUVudmVsb3BlRGF0YSAgKHNickVudkRhdGFSaWdodCwgaEJpdFN0cmVhbSwwKTsKLSAgICBwYXlsb2FkQml0cyArPSB3cml0ZU5vaXNlTGV2ZWxEYXRhIChzYnJFbnZEYXRhTGVmdCwgIGhCaXRTdHJlYW0sMCk7Ci0gICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVOb2lzZUxldmVsRGF0YSAoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtLDApOworICAgIHBheWxvYWRCaXRzICs9IHdyaXRlRW52ZWxvcGVEYXRhKHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtLCAwKTsKKyAgICBwYXlsb2FkQml0cyArPSB3cml0ZUVudmVsb3BlRGF0YShzYnJFbnZEYXRhUmlnaHQsIGhCaXRTdHJlYW0sIDApOworICAgIHBheWxvYWRCaXRzICs9IHdyaXRlTm9pc2VMZXZlbERhdGEoc2JyRW52RGF0YUxlZnQsIGhCaXRTdHJlYW0sIDApOworICAgIHBheWxvYWRCaXRzICs9IHdyaXRlTm9pc2VMZXZlbERhdGEoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtLCAwKTsKIAotICAgIHBheWxvYWRCaXRzICs9IHdyaXRlU3ludGhldGljQ29kaW5nRGF0YSAoc2JyRW52RGF0YUxlZnQsaEJpdFN0cmVhbSk7Ci0gICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVTeW50aGV0aWNDb2RpbmdEYXRhIChzYnJFbnZEYXRhUmlnaHQsaEJpdFN0cmVhbSk7CisgICAgcGF5bG9hZEJpdHMgKz0gd3JpdGVTeW50aGV0aWNDb2RpbmdEYXRhKHNickVudkRhdGFMZWZ0LCBoQml0U3RyZWFtKTsKKyAgICBwYXlsb2FkQml0cyArPSB3cml0ZVN5bnRoZXRpY0NvZGluZ0RhdGEoc2JyRW52RGF0YVJpZ2h0LCBoQml0U3RyZWFtKTsKIAogICB9IC8qIGNvdXBsaW5nICovCiAKQEAgLTU5NCwxNCArNTU0LDEzIEBACiAgIHJldHVybiBwYXlsb2FkQml0czsKIH0KIAotc3RhdGljIElOVCBjZWlsX2xuMihJTlQgeCkKLXsKLSAgSU5UIHRtcD0tMTsKLSAgd2hpbGUoKDE8PCsrdG1wKSA8IHgpOwotICByZXR1cm4odG1wKTsKK3N0YXRpYyBJTlQgY2VpbF9sbjIoSU5UIHgpIHsKKyAgSU5UIHRtcCA9IC0xOworICB3aGlsZSAoKDEgPDwgKyt0bXApIDwgeCkKKyAgICA7CisgIHJldHVybiAodG1wKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogZW5jb2RlU2JyR3JpZApAQCAtNjEyLDkxICs1NzEsOTUgQEAKICAgICBvdXRwdXQ6CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVAotZW5jb2RlU2JyR3JpZCAoSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQoteworc3RhdGljIElOVCBlbmNvZGVTYnJHcmlkKEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKSB7CiAgIElOVCBwYXlsb2FkQml0cyA9IDA7CiAgIElOVCBpLCB0ZW1wOwogICBJTlQgYnVmZmVyRnJhbWVTdGFydCA9IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJ1ZmZlckZyYW1lU3RhcnQ7Ci0gIElOVCBudW1iZXJUaW1lU2xvdHMgID0gc2JyRW52RGF0YS0+aFNickJTR3JpZC0+bnVtYmVyVGltZVNsb3RzOworICBJTlQgbnVtYmVyVGltZVNsb3RzID0gc2JyRW52RGF0YS0+aFNickJTR3JpZC0+bnVtYmVyVGltZVNsb3RzOwogCiAgIGlmIChzYnJFbnZEYXRhLT5sZEdyaWQpCi0gICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+ZnJhbWVDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9DTEFfQklUU19MRCk7CisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9DTEFfQklUU19MRCk7CiAgIGVsc2UKLSAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0NMQV9CSVRTKTsKKyAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+ZnJhbWVDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0NMQV9CSVRTKTsKIAogICBzd2l0Y2ggKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MpIHsKLSAgY2FzZSBGSVhGSVhvbmx5OgotICAgIEZES19BU1NFUlQoMCAvKiBGYXRhbCBlcnJvciBpbiBlbmNvZGVTYnJHcmlkISAqLyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRklYRklYOgotICAgIHRlbXAgPSBjZWlsX2xuMihzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fZW52KTsKLSAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHRlbXAsIFNCUl9FTlZfQklUUyk7Ci0gICAgaWYgKChzYnJFbnZEYXRhLT5sZEdyaWQpICYmIChzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fZW52PT0xKSkKLSAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5jdXJyZW50QW1wUmVzRkYsIFNJX1NCUl9BTVBfUkVTX0JJVFMpOwotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+dl9mWzBdLCBTQlJfUkVTX0JJVFMpOworICAgIGNhc2UgRklYRklYb25seToKKyAgICAgIEZES19BU1NFUlQoMCAvKiBGYXRhbCBlcnJvciBpbiBlbmNvZGVTYnJHcmlkISAqLyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZJWEZJWDoKKyAgICAgIHRlbXAgPSBjZWlsX2xuMihzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fZW52KTsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCB0ZW1wLCBTQlJfRU5WX0JJVFMpOworICAgICAgaWYgKChzYnJFbnZEYXRhLT5sZEdyaWQpICYmIChzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fZW52ID09IDEpKQorICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+Y3VycmVudEFtcFJlc0ZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0FNUF9SRVNfQklUUyk7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+dl9mWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9SRVNfQklUUyk7CiAKLSAgICBicmVhazsKKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgRklYVkFSOgotICBjYXNlIFZBUkZJWDoKLSAgICBpZiAoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+ZnJhbWVDbGFzcyA9PSBGSVhWQVIpCi0gICAgICB0ZW1wID0gc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfYWJzX2JvcmQgLSAoYnVmZmVyRnJhbWVTdGFydCArIG51bWJlclRpbWVTbG90cyk7Ci0gICAgZWxzZQotICAgICAgdGVtcCA9IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX2Fic19ib3JkIC0gYnVmZmVyRnJhbWVTdGFydDsKKyAgICBjYXNlIEZJWFZBUjoKKyAgICBjYXNlIFZBUkZJWDoKKyAgICAgIGlmIChzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzID09IEZJWFZBUikKKyAgICAgICAgdGVtcCA9IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX2Fic19ib3JkIC0KKyAgICAgICAgICAgICAgIChidWZmZXJGcmFtZVN0YXJ0ICsgbnVtYmVyVGltZVNsb3RzKTsKKyAgICAgIGVsc2UKKyAgICAgICAgdGVtcCA9IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX2Fic19ib3JkIC0gYnVmZmVyRnJhbWVTdGFydDsKIAotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgdGVtcCwgU0JSX0FCU19CSVRTKTsKLSAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPm4sIFNCUl9OVU1fQklUUyk7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgdGVtcCwgU0JSX0FCU19CSVRTKTsKKyAgICAgIHBheWxvYWRCaXRzICs9CisgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPm4sIFNCUl9OVU1fQklUUyk7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+bjsgaSsrKSB7Ci0gICAgICB0ZW1wID0gKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX3JlbF9ib3JkW2ldIC0gMikgPj4gMTsKLSAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgdGVtcCwgU0JSX1JFTF9CSVRTKTsKLSAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+bjsgaSsrKSB7CisgICAgICAgIHRlbXAgPSAoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfcmVsX2JvcmRbaV0gLSAyKSA+PiAxOworICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgdGVtcCwgU0JSX1JFTF9CSVRTKTsKKyAgICAgIH0KIAotICAgIHRlbXAgPSBjZWlsX2xuMihzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5uICsgMik7Ci0gICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5wLCB0ZW1wKTsKKyAgICAgIHRlbXAgPSBjZWlsX2xuMihzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5uICsgMik7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+cCwgdGVtcCk7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+biArIDE7IGkrKykgewotICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT52X2ZbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9SRVNfQklUUyk7Ci0gICAgfQotICAgIGJyZWFrOworICAgICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPm4gKyAxOyBpKyspIHsKKyAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPnZfZltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9SRVNfQklUUyk7CisgICAgICB9CisgICAgICBicmVhazsKIAotICBjYXNlIFZBUlZBUjoKLSAgICB0ZW1wID0gc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfYWJzX2JvcmRfMCAtIGJ1ZmZlckZyYW1lU3RhcnQ7Ci0gICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCB0ZW1wLCBTQlJfQUJTX0JJVFMpOwotICAgIHRlbXAgPSBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19hYnNfYm9yZF8xIC0gKGJ1ZmZlckZyYW1lU3RhcnQgKyBudW1iZXJUaW1lU2xvdHMpOwotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgdGVtcCwgU0JSX0FCU19CSVRTKTsKKyAgICBjYXNlIFZBUlZBUjoKKyAgICAgIHRlbXAgPSBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19hYnNfYm9yZF8wIC0gYnVmZmVyRnJhbWVTdGFydDsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCB0ZW1wLCBTQlJfQUJTX0JJVFMpOworICAgICAgdGVtcCA9IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX2Fic19ib3JkXzEgLQorICAgICAgICAgICAgIChidWZmZXJGcmFtZVN0YXJ0ICsgbnVtYmVyVGltZVNsb3RzKTsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCB0ZW1wLCBTQlJfQUJTX0JJVFMpOwogCi0gICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fcmVsXzAsIFNCUl9OVU1fQklUUyk7Ci0gICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fcmVsXzEsIFNCUl9OVU1fQklUUyk7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoCisgICAgICAgICAgaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8wLCBTQlJfTlVNX0JJVFMpOworICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKAorICAgICAgICAgIGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9yZWxfMSwgU0JSX05VTV9CSVRTKTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fcmVsXzA7IGkrKykgewotICAgICAgdGVtcCA9IChzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19yZWxfYm9yZF8wW2ldIC0gMikgPj4gMTsKLSAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgdGVtcCwgU0JSX1JFTF9CSVRTKTsKLSAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8wOyBpKyspIHsKKyAgICAgICAgdGVtcCA9IChzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19yZWxfYm9yZF8wW2ldIC0gMikgPj4gMTsKKyAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHRlbXAsIFNCUl9SRUxfQklUUyk7CisgICAgICB9CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8xOyBpKyspIHsKLSAgICAgIHRlbXAgPSAoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfcmVsX2JvcmRfMVtpXSAtIDIpID4+IDE7Ci0gICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHRlbXAsIFNCUl9SRUxfQklUUyk7Ci0gICAgfQorICAgICAgZm9yIChpID0gMDsgaSA8IHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9yZWxfMTsgaSsrKSB7CisgICAgICAgIHRlbXAgPSAoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfcmVsX2JvcmRfMVtpXSAtIDIpID4+IDE7CisgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCB0ZW1wLCBTQlJfUkVMX0JJVFMpOworICAgICAgfQogCi0gICAgdGVtcCA9IGNlaWxfbG4yKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9yZWxfMCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9yZWxfMSArIDIpOwotICAgIHBheWxvYWRCaXRzICs9ICBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPnAsIHRlbXApOworICAgICAgdGVtcCA9IGNlaWxfbG4yKHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9yZWxfMCArCisgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8xICsgMik7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+cCwgdGVtcCk7CiAKLSAgICB0ZW1wID0gc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8wICsKLSAgICAgICAgICAgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfbnVtX3JlbF8xICsgMTsKKyAgICAgIHRlbXAgPSBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fcmVsXzAgKworICAgICAgICAgICAgIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX251bV9yZWxfMSArIDE7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgdGVtcDsgaSsrKSB7Ci0gICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPnZfZkxSW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfUkVTX0JJVFMpOwotICAgIH0KLSAgICBicmVhazsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB0ZW1wOyBpKyspIHsKKyAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKAorICAgICAgICAgICAgaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+dl9mTFJbaV0sIFNCUl9SRVNfQklUUyk7CisgICAgICB9CisgICAgICBicmVhazsKICAgfQogCiAgIHJldHVybiBwYXlsb2FkQml0czsKQEAgLTcxNSwxMiArNjc4LDEwIEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQKLWVuY29kZUxvd0RlbGF5U2JyR3JpZCAoICBIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNtaXRGcmVxcwotICAgICAgICAgICAgICAgICAgICAgICApCi17CitzdGF0aWMgaW50IGVuY29kZUxvd0RlbGF5U2JyR3JpZChIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRyYW5zbWl0RnJlcXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIHNiclN5bnRheEZsYWdzKSB7CiAgIGludCBwYXlsb2FkQml0cyA9IDA7CiAgIGludCBpOwogCkBAIC03MjgsMjEgKzY4OSwyNSBAQAogICAvKiB3cml0ZSBmcmFtZUNsYXNzIFsxIGJpdF0gZm9yIEZJWEZJWG9ubHkgR3JpZCAqLwogICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMSwgU0JSX0NMQV9CSVRTX0xEKTsKIAotICAvKiBhYnNvbHV0ZSBCb3JkZXJzIGFyZSBmaXg6IDAsWCxYLFgsblRpbWVTbG90czsgc28gd2UgZG9udCBoYXZlIHRvIHRyYW5zbWl0IHRoZW0gKi8KKyAgLyogYWJzb2x1dGUgQm9yZGVycyBhcmUgZml4OiAwLFgsWCxYLG5UaW1lU2xvdHM7IHNvIHdlIGRvbnQgaGF2ZSB0byB0cmFuc21pdAorICAgKiB0aGVtICovCiAgIC8qIG9ubHkgdHJhbnNtaXQgdGhlIHRyYW5zaWVudCBwb3NpdGlvbiEgKi8KICAgLyogd2l0aCB0aGlzIGluZm8gKGIxKSB3ZSBjYW4gcmVjb25zdHJ1Y3QgdGhlIEZyYW1lIG9uIERlY29kZXIgc2lkZSA6ICovCiAgIC8qIGJvcmRlclswXSA9IDA7IGJvcmRlclsxXSA9IGIxOyBib3JkZXJbMl09YjErMjsgYm9yZGVyWzNdID0gbnJUaW1lU2xvdHMgKi8KIAogICAvKiB1c2UgMyBvciA0Yml0cyBmb3IgdHJhbnNpZW50IGJvcmRlciAoYm9yZGVyKSAqLwogICBpZiAoc2JyRW52RGF0YS0+aFNickJTR3JpZC0+bnVtYmVyVGltZVNsb3RzID09IDgpCi0gICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzICggaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+YnNfYWJzX2JvcmQsIDMpOworICAgIHBheWxvYWRCaXRzICs9CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19hYnNfYm9yZCwgMyk7CiAgIGVsc2UKLSAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKCBoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19hYnNfYm9yZCwgNCk7CisgICAgcGF5bG9hZEJpdHMgKz0KKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPmJzX2Fic19ib3JkLCA0KTsKIAogICBpZiAodHJhbnNtaXRGcmVxcykgewogICAgIC8qIHdyaXRlIEZyZXFSZXMgZ3JpZCAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBzYnJFbnZEYXRhLT5oU2JyQlNHcmlkLT5ic19udW1fZW52OyBpKyspIHsKLSAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aFNickJTR3JpZC0+dl9mW2ldLCBTQlJfUkVTX0JJVFMpOworICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmhTYnJCU0dyaWQtPnZfZltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfUkVTX0JJVFMpOwogICAgIH0KICAgfQogCkBAIC03NTIsMzAgKzcxNywyOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IGVuY29kZVNickR0ZGYKLSAgICBkZXNjcmlwdGlvbjogIHdyaXRlcyBiaXRzIHRoYXQgZGVzY3JpYmVzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGVudmVsb3BlcyBvZiBhIGZyYW1lCi0gICAgcmV0dXJuczogICAgICBudW1iZXIgb2YgYml0cyB3cml0dGVuCi0gICAgaW5wdXQ6Ci0gICAgb3V0cHV0OgorICAgIGRlc2NyaXB0aW9uOiAgd3JpdGVzIGJpdHMgdGhhdCBkZXNjcmliZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgZW52ZWxvcGVzIG9mIGEKK2ZyYW1lIHJldHVybnM6ICAgICAgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbiBpbnB1dDogb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQKLWVuY29kZVNickR0ZGYgKEhBTkRMRV9TQlJfRU5WX0RBVEEgc2JyRW52RGF0YSwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKLXsKK3N0YXRpYyBJTlQgZW5jb2RlU2JyRHRkZihIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkgewogICBJTlQgaSwgcGF5bG9hZEJpdHMgPSAwLCBub09mTm9pc2VFbnZlbG9wZXM7CiAKICAgbm9PZk5vaXNlRW52ZWxvcGVzID0gc2JyRW52RGF0YS0+bm9PZkVudmVsb3BlcyA+IDEgPyAyIDogMTsKIAogICBmb3IgKGkgPSAwOyBpIDwgc2JyRW52RGF0YS0+bm9PZkVudmVsb3BlczsgKytpKSB7Ci0gICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5kb21haW5fdmVjW2ldLCBTQlJfRElSX0JJVFMpOworICAgIHBheWxvYWRCaXRzICs9CisgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5kb21haW5fdmVjW2ldLCBTQlJfRElSX0JJVFMpOwogICB9CiAgIGZvciAoaSA9IDA7IGkgPCBub09mTm9pc2VFbnZlbG9wZXM7ICsraSkgewotICAgIHBheWxvYWRCaXRzICs9ICBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmRvbWFpbl92ZWNfbm9pc2VbaV0sIFNCUl9ESVJfQklUUyk7CisgICAgcGF5bG9hZEJpdHMgKz0KKyAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmRvbWFpbl92ZWNfbm9pc2VbaV0sIFNCUl9ESVJfQklUUyk7CiAgIH0KIAogICByZXR1cm4gcGF5bG9hZEJpdHM7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IHdyaXRlTm9pc2VMZXZlbERhdGEKQEAgLTc4NSw4NyArNzQ4LDEwMSBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UCi13cml0ZU5vaXNlTGV2ZWxEYXRhIChIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIElOVCBjb3VwbGluZykKLXsKK3N0YXRpYyBJTlQgd3JpdGVOb2lzZUxldmVsRGF0YShIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSwgSU5UIGNvdXBsaW5nKSB7CiAgIElOVCBqLCBpLCBwYXlsb2FkQml0cyA9IDA7CiAgIElOVCBuTm9pc2VFbnZlbG9wZXMgPSBzYnJFbnZEYXRhLT5ub09mRW52ZWxvcGVzID4gMSA/IDIgOiAxOwogCiAgIGZvciAoaSA9IDA7IGkgPCBuTm9pc2VFbnZlbG9wZXM7IGkrKykgewogICAgIHN3aXRjaCAoc2JyRW52RGF0YS0+ZG9tYWluX3ZlY19ub2lzZVtpXSkgewotICAgIGNhc2UgRlJFUToKLSAgICAgIGlmIChjb3VwbGluZyAmJiBzYnJFbnZEYXRhLT5iYWxhbmNlKSB7Ci0gICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2kgKiBzYnJFbnZEYXRhLT5ub09mbm9pc2ViYW5kc10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X25vaXNlX2JpdHNfYmFsYW5jZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tpICogc2JyRW52RGF0YS0+bm9PZm5vaXNlYmFuZHNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9ub2lzZV9iaXRzKTsKLSAgICAgIH0KLQotICAgICAgZm9yIChqID0gMSArIGkgKiBzYnJFbnZEYXRhLT5ub09mbm9pc2ViYW5kczsgaiA8IChzYnJFbnZEYXRhLT5ub09mbm9pc2ViYW5kcyAqICgxICsgaSkpOyBqKyspIHsKLSAgICAgICAgaWYgKGNvdXBsaW5nKSB7Ci0gICAgICAgICAgaWYgKHNickVudkRhdGEtPmJhbGFuY2UpIHsKLSAgICAgICAgICAgIC8qIGNvdXBsaW5nICYmIGJhbGFuY2UgKi8KLSAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlRnJlcUNbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTExXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlRnJlcUxbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTExXSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIGNvdXBsaW5nICYmICFiYWxhbmNlICovCi0gICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxGcmVxQ1tzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVYxMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxGcmVxTFtzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVYxMV0pOwotICAgICAgICAgIH0KKyAgICAgIGNhc2UgRlJFUToKKyAgICAgICAgaWYgKGNvdXBsaW5nICYmIHNickVudkRhdGEtPmJhbGFuY2UpIHsKKyAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoCisgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgIHNickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbaSAqIHNickVudkRhdGEtPm5vT2Zub2lzZWJhbmRzXSwKKyAgICAgICAgICAgICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X25vaXNlX2JpdHNfYmFsYW5jZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLyogIWNvdXBsaW5nICovCi0gICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VGcmVxQ1tzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVjExXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlRnJlcUxbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVYxMV0pOworICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cygKKyAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tpICogc2JyRW52RGF0YS0+bm9PZm5vaXNlYmFuZHNdLAorICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfbm9pc2VfYml0cyk7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBUSU1FOgotICAgICAgZm9yIChqID0gaSAqIHNickVudkRhdGEtPm5vT2Zub2lzZWJhbmRzOyBqIDwgKHNickVudkRhdGEtPm5vT2Zub2lzZWJhbmRzICogKDEgKyBpKSk7IGorKykgewotICAgICAgICBpZiAoY291cGxpbmcpIHsKLSAgICAgICAgICBpZiAoc2JyRW52RGF0YS0+YmFsYW5jZSkgewotICAgICAgICAgICAgLyogY291cGxpbmcgJiYgYmFsYW5jZSAqLwotICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUJhbGFuY2VUaW1lQ1tzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUJhbGFuY2VUaW1lTFtzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTFdKTsKKyAgICAgICAgZm9yIChqID0gMSArIGkgKiBzYnJFbnZEYXRhLT5ub09mbm9pc2ViYW5kczsKKyAgICAgICAgICAgICBqIDwgKHNickVudkRhdGEtPm5vT2Zub2lzZWJhbmRzICogKDEgKyBpKSk7IGorKykgeworICAgICAgICAgIGlmIChjb3VwbGluZykgeworICAgICAgICAgICAgaWYgKHNickVudkRhdGEtPmJhbGFuY2UpIHsKKyAgICAgICAgICAgICAgLyogY291cGxpbmcgJiYgYmFsYW5jZSAqLworICAgICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlQmFsYW5jZUZyZXFDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlRnJlcUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLyogY291cGxpbmcgJiYgIWJhbGFuY2UgKi8KKyAgICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKAorICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxGcmVxQworICAgICAgICAgICAgICAgICAgICAgIFtzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsgQ09ERV9CT09LX1NDRl9MQVYxMV0sCisgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUxldmVsRnJlcUwKKyAgICAgICAgICAgICAgICAgICAgICBbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArIENPREVfQk9PS19TQ0ZfTEFWMTFdKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogY291cGxpbmcgJiYgIWJhbGFuY2UgKi8KLSAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbFRpbWVDW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVjExXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbFRpbWVMW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVjExXSk7CisgICAgICAgICAgICAvKiAhY291cGxpbmcgKi8KKyAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cygKKyAgICAgICAgICAgICAgICBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgIHNickVudkRhdGEKKyAgICAgICAgICAgICAgICAgICAgLT5odWZmdGFibGVOb2lzZUZyZXFDW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVYxMV0sCisgICAgICAgICAgICAgICAgc2JyRW52RGF0YQorICAgICAgICAgICAgICAgICAgICAtPmh1ZmZ0YWJsZU5vaXNlRnJlcUxbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFX0JPT0tfU0NGX0xBVjExXSk7CiAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8qICFjb3VwbGluZyAqLwotICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxUaW1lQ1tzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWMTFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbFRpbWVMW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVYxMV0pOwogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVElNRToKKyAgICAgICAgZm9yIChqID0gaSAqIHNickVudkRhdGEtPm5vT2Zub2lzZWJhbmRzOworICAgICAgICAgICAgIGogPCAoc2JyRW52RGF0YS0+bm9PZm5vaXNlYmFuZHMgKiAoMSArIGkpKTsgaisrKSB7CisgICAgICAgICAgaWYgKGNvdXBsaW5nKSB7CisgICAgICAgICAgICBpZiAoc2JyRW52RGF0YS0+YmFsYW5jZSkgeworICAgICAgICAgICAgICAvKiBjb3VwbGluZyAmJiBiYWxhbmNlICovCisgICAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlVGltZUMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUJhbGFuY2VUaW1lTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTExXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvKiBjb3VwbGluZyAmJiAhYmFsYW5jZSAqLworICAgICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoCisgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbFRpbWVDCisgICAgICAgICAgICAgICAgICAgICAgW3NickVudkRhdGEtPnNicl9ub2lzZV9sZXZlbHNbal0gKyBDT0RFX0JPT0tfU0NGX0xBVjExXSwKKyAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxUaW1lTAorICAgICAgICAgICAgICAgICAgICAgIFtzYnJFbnZEYXRhLT5zYnJfbm9pc2VfbGV2ZWxzW2pdICsgQ09ERV9CT09LX1NDRl9MQVYxMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiAhY291cGxpbmcgKi8KKyAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cygKKyAgICAgICAgICAgICAgICBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgIHNickVudkRhdGEKKyAgICAgICAgICAgICAgICAgICAgLT5odWZmdGFibGVOb2lzZUxldmVsVGltZUNbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWMTFdLAorICAgICAgICAgICAgICAgIHNickVudkRhdGEKKyAgICAgICAgICAgICAgICAgICAgLT5odWZmdGFibGVOb2lzZUxldmVsVGltZUxbc2JyRW52RGF0YS0+c2JyX25vaXNlX2xldmVsc1tqXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREVfQk9PS19TQ0ZfTEFWMTFdKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAgIHJldHVybiBwYXlsb2FkQml0czsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIGZ1bmN0aW9ubmFtZTogd3JpdGVFbnZlbG9wZURhdGEKQEAgLTg3NSw2NCArODUyLDg1IEBACiAgICAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQKLXdyaXRlRW52ZWxvcGVEYXRhIChIQU5ETEVfU0JSX0VOVl9EQVRBIHNickVudkRhdGEsIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIElOVCBjb3VwbGluZykKLXsKK3N0YXRpYyBJTlQgd3JpdGVFbnZlbG9wZURhdGEoSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBJTlQgY291cGxpbmcpIHsKICAgSU5UIHBheWxvYWRCaXRzID0gMCwgaiwgaSwgZGVsdGE7CiAKLSAgZm9yIChqID0gMDsgaiA8IHNickVudkRhdGEtPm5vT2ZFbnZlbG9wZXM7IGorKykgeyAvKiBsb29wIG92ZXIgYWxsIGVudmVsb3BlcyAqLworICBmb3IgKGogPSAwOyBqIDwgc2JyRW52RGF0YS0+bm9PZkVudmVsb3BlczsKKyAgICAgICBqKyspIHsgLyogbG9vcCBvdmVyIGFsbCBlbnZlbG9wZXMgKi8KICAgICBpZiAoc2JyRW52RGF0YS0+ZG9tYWluX3ZlY1tqXSA9PSBGUkVRKSB7CiAgICAgICBpZiAoY291cGxpbmcgJiYgc2JyRW52RGF0YS0+YmFsYW5jZSkgewotICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmllbnZlbG9wZVtqXVswXSwgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X2Vudl9iaXRzX2JhbGFuY2UpOworICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+aWVudmVsb3BlW2pdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X2Vudl9iaXRzX2JhbGFuY2UpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5pZW52ZWxvcGVbal1bMF0sIHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9lbnZfYml0cyk7CisgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5pZW52ZWxvcGVbal1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfZW52X2JpdHMpOwogICAgICAgfQogICAgIH0KIAotICAgIGZvciAoaSA9IDEgLSBzYnJFbnZEYXRhLT5kb21haW5fdmVjW2pdOyBpIDwgc2JyRW52RGF0YS0+bm9TY2ZCYW5kc1tqXTsgaSsrKSB7CisgICAgZm9yIChpID0gMSAtIHNickVudkRhdGEtPmRvbWFpbl92ZWNbal07IGkgPCBzYnJFbnZEYXRhLT5ub1NjZkJhbmRzW2pdOworICAgICAgICAgaSsrKSB7CiAgICAgICBkZWx0YSA9IHNickVudkRhdGEtPmllbnZlbG9wZVtqXVtpXTsKICAgICAgIGlmIChjb3VwbGluZyAmJiBzYnJFbnZEYXRhLT5iYWxhbmNlKSB7Ci0gICAgICAgIEZES19BU1NFUlQgKGZpeHBfYWJzIChkZWx0YSkgPD0gc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlKTsKKyAgICAgICAgRkRLX0FTU0VSVChmaXhwX2FicyhkZWx0YSkgPD0gc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEZES19BU1NFUlQgKGZpeHBfYWJzIChkZWx0YSkgPD0gc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXYpOworICAgICAgICBGREtfQVNTRVJUKGZpeHBfYWJzKGRlbHRhKSA8PSBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdik7CiAgICAgICB9CiAgICAgICBpZiAoY291cGxpbmcpIHsKICAgICAgICAgaWYgKHNickVudkRhdGEtPmJhbGFuY2UpIHsKICAgICAgICAgICBpZiAoc2JyRW52RGF0YS0+ZG9tYWluX3ZlY1tqXSkgewogICAgICAgICAgICAgLyogY291cGxpbmcgJiYgYmFsYW5jZSAmJiBUSU1FICovCi0gICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VUaW1lQ1tkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VUaW1lTFtkZWx0YSArIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZV0pOworICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKAorICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgc2JyRW52RGF0YQorICAgICAgICAgICAgICAgICAgICAtPmh1ZmZ0YWJsZUJhbGFuY2VUaW1lQ1tkZWx0YSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZV0sCisgICAgICAgICAgICAgICAgc2JyRW52RGF0YQorICAgICAgICAgICAgICAgICAgICAtPmh1ZmZ0YWJsZUJhbGFuY2VUaW1lTFtkZWx0YSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2QmFsYW5jZV0pOwogICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBjb3VwbGluZyAmJiBiYWxhbmNlICYmIEZSRVEgKi8KLSAgICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlQmFsYW5jZUZyZXFDW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlQmFsYW5jZUZyZXFMW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlXSk7CisgICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoCisgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICBzYnJFbnZEYXRhCisgICAgICAgICAgICAgICAgICAgIC0+aHVmZnRhYmxlQmFsYW5jZUZyZXFDW2RlbHRhICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlXSwKKyAgICAgICAgICAgICAgICBzYnJFbnZEYXRhCisgICAgICAgICAgICAgICAgICAgIC0+aHVmZnRhYmxlQmFsYW5jZUZyZXFMW2RlbHRhICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlXSk7CiAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIGlmIChzYnJFbnZEYXRhLT5kb21haW5fdmVjW2pdKSB7CiAgICAgICAgICAgICAvKiBjb3VwbGluZyAmJiAhYmFsYW5jZSAmJiBUSU1FICovCi0gICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsVGltZUNbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsVGltZUxbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdl0pOworICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKAorICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgc2JyRW52RGF0YQorICAgICAgICAgICAgICAgICAgICAtPmh1ZmZ0YWJsZUxldmVsVGltZUNbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdl0sCisgICAgICAgICAgICAgICAgc2JyRW52RGF0YQorICAgICAgICAgICAgICAgICAgICAtPmh1ZmZ0YWJsZUxldmVsVGltZUxbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdl0pOwogICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBjb3VwbGluZyAmJiAhYmFsYW5jZSAmJiBGUkVRICovCi0gICAgICAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsRnJlcUNbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsRnJlcUxbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdl0pOworICAgICAgICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKAorICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgc2JyRW52RGF0YQorICAgICAgICAgICAgICAgICAgICAtPmh1ZmZ0YWJsZUxldmVsRnJlcUNbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdl0sCisgICAgICAgICAgICAgICAgc2JyRW52RGF0YQorICAgICAgICAgICAgICAgICAgICAtPmh1ZmZ0YWJsZUxldmVsRnJlcUxbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdl0pOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKHNickVudkRhdGEtPmRvbWFpbl92ZWNbal0pIHsKICAgICAgICAgICAvKiAhY291cGxpbmcgJiYgVElNRSAqLwotICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZVRpbWVDW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlVGltZUxbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdl0pOworICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cygKKyAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlVGltZUNbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdl0sCisgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZVRpbWVMW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAvKiAhY291cGxpbmcgJiYgRlJFUSAqLwotICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFDW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlRnJlcUxbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdl0pOworICAgICAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cygKKyAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlRnJlcUNbZGVsdGEgKyBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdl0sCisgICAgICAgICAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFMW2RlbHRhICsgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZdKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTk0MCw3ICs5MzgsNiBAQAogICByZXR1cm4gcGF5bG9hZEJpdHM7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IGVuY29kZUV4dGVuZGVkRGF0YQpAQCAtOTUwLDQ5ICs5NDcsNTEgQEAKICAgICBvdXRwdXQ6CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVCBlbmNvZGVFeHRlbmRlZERhdGEgKEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKLXsKK3N0YXRpYyBJTlQgZW5jb2RlRXh0ZW5kZWREYXRhKEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0pIHsKICAgSU5UIGV4dERhdGFTaXplOwogICBJTlQgcGF5bG9hZEJpdHMgPSAwOwogCiAgIGV4dERhdGFTaXplID0gZ2V0U2JyRXh0ZW5kZWREYXRhU2l6ZShoUGFyYW1ldHJpY1N0ZXJlbyk7CiAKLQogICBpZiAoZXh0RGF0YVNpemUgIT0gMCkgewotICAgIElOVCBtYXhFeHRTaXplID0gKDE8PFNJX1NCUl9FWFRFTlNJT05fU0laRV9CSVRTKSAtIDE7CisgICAgSU5UIG1heEV4dFNpemUgPSAoMSA8PCBTSV9TQlJfRVhURU5TSU9OX1NJWkVfQklUUykgLSAxOwogICAgIElOVCB3cml0dGVuTm9CaXRzID0gMDsgLyogbmVlZGVkIHRvIGJ5dGUgYWxpZ24gdGhlIGV4dGVuZGVkIGRhdGEgKi8KIAotICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgMSwgU0lfU0JSX0VYVEVOREVEX0RBVEFfQklUUyk7CisgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIDEsIFNJX1NCUl9FWFRFTkRFRF9EQVRBX0JJVFMpOwogICAgIEZES19BU1NFUlQoZXh0RGF0YVNpemUgPD0gU0JSX0VYVEVOREVEX0RBVEFfTUFYX0NOVCk7CiAKICAgICBpZiAoZXh0RGF0YVNpemUgPCBtYXhFeHRTaXplKSB7Ci0gICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIGV4dERhdGFTaXplLCBTSV9TQlJfRVhURU5TSU9OX1NJWkVfQklUUyk7CisgICAgICBwYXlsb2FkQml0cyArPQorICAgICAgICAgIEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBleHREYXRhU2l6ZSwgU0lfU0JSX0VYVEVOU0lPTl9TSVpFX0JJVFMpOwogICAgIH0gZWxzZSB7Ci0gICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIG1heEV4dFNpemUsIFNJX1NCUl9FWFRFTlNJT05fU0laRV9CSVRTKTsKLSAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyAoaEJpdFN0cmVhbSwgZXh0RGF0YVNpemUgLSBtYXhFeHRTaXplLCBTSV9TQlJfRVhURU5TSU9OX0VTQ19DT1VOVF9CSVRTKTsKKyAgICAgIHBheWxvYWRCaXRzICs9CisgICAgICAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIG1heEV4dFNpemUsIFNJX1NCUl9FWFRFTlNJT05fU0laRV9CSVRTKTsKKyAgICAgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBleHREYXRhU2l6ZSAtIG1heEV4dFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0VYVEVOU0lPTl9FU0NfQ09VTlRfQklUUyk7CiAgICAgfQogCiAgICAgLyogcGFyYW1ldHJpYyBjb2Rpbmcgc2lnbmFsbGVkIGhlcmU/ICovCi0gICAgaWYoaFBhcmFtZXRyaWNTdGVyZW8pewotICAgICAgd3JpdHRlbk5vQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIEVYVEVOU0lPTl9JRF9QU19DT0RJTkcsIFNJX1NCUl9FWFRFTlNJT05fSURfQklUUyk7Ci0gICAgICB3cml0dGVuTm9CaXRzICs9IEZES3NickVuY19QU0VuY19Xcml0ZVBTRGF0YShoUGFyYW1ldHJpY1N0ZXJlbywgaEJpdFN0cmVhbSk7CisgICAgaWYgKGhQYXJhbWV0cmljU3RlcmVvKSB7CisgICAgICB3cml0dGVuTm9CaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBFWFRFTlNJT05fSURfUFNfQ09ESU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfU0JSX0VYVEVOU0lPTl9JRF9CSVRTKTsKKyAgICAgIHdyaXR0ZW5Ob0JpdHMgKz0KKyAgICAgICAgICBGREtzYnJFbmNfUFNFbmNfV3JpdGVQU0RhdGEoaFBhcmFtZXRyaWNTdGVyZW8sIGhCaXRTdHJlYW0pOwogICAgIH0KIAogICAgIHBheWxvYWRCaXRzICs9IHdyaXR0ZW5Ob0JpdHM7CiAKICAgICAvKiBieXRlIGFsaWdubWVudCAqLwotICAgIHdyaXR0ZW5Ob0JpdHMgPSB3cml0dGVuTm9CaXRzJTg7Ci0gICAgaWYod3JpdHRlbk5vQml0cykKKyAgICB3cml0dGVuTm9CaXRzID0gd3JpdHRlbk5vQml0cyAlIDg7CisgICAgaWYgKHdyaXR0ZW5Ob0JpdHMpCiAgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgKDggLSB3cml0dGVuTm9CaXRzKSk7CiAgIH0gZWxzZSB7Ci0gICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCAwLCBTSV9TQlJfRVhURU5ERURfREFUQV9CSVRTKTsKKyAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgU0lfU0JSX0VYVEVOREVEX0RBVEFfQklUUyk7CiAgIH0KIAogICByZXR1cm4gcGF5bG9hZEJpdHM7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBmdW5jdGlvbm5hbWU6IHdyaXRlU3ludGhldGljQ29kaW5nRGF0YQpAQCAtMTAwMiwxOCArMTAwMSwxOCBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UIHdyaXRlU3ludGhldGljQ29kaW5nRGF0YSAoSEFORExFX1NCUl9FTlZfREFUQSAgc2JyRW52RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtKQorc3RhdGljIElOVCB3cml0ZVN5bnRoZXRpY0NvZGluZ0RhdGEoSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdFN0cmVhbSkKIAogewogICBJTlQgaTsKICAgSU5UIHBheWxvYWRCaXRzID0gMDsKIAotICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMgKGhCaXRTdHJlYW0sIHNickVudkRhdGEtPmFkZEhhcm1vbmljRmxhZywgMSk7CisgIHBheWxvYWRCaXRzICs9IEZES3dyaXRlQml0cyhoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5hZGRIYXJtb25pY0ZsYWcsIDEpOwogCiAgIGlmIChzYnJFbnZEYXRhLT5hZGRIYXJtb25pY0ZsYWcpIHsKICAgICBmb3IgKGkgPSAwOyBpIDwgc2JyRW52RGF0YS0+bm9IYXJtb25pY3M7IGkrKykgewotICAgICAgcGF5bG9hZEJpdHMgKz0gRkRLd3JpdGVCaXRzIChoQml0U3RyZWFtLCBzYnJFbnZEYXRhLT5hZGRIYXJtb25pY1tpXSwgMSk7CisgICAgICBwYXlsb2FkQml0cyArPSBGREt3cml0ZUJpdHMoaEJpdFN0cmVhbSwgc2JyRW52RGF0YS0+YWRkSGFybW9uaWNbaV0sIDEpOwogICAgIH0KICAgfQogCkBAIC0xMDMxLDkgKzEwMzAsNyBAQAogICAgIG91dHB1dDoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UCi1nZXRTYnJFeHRlbmRlZERhdGFTaXplIChIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gIGhQYXJhbWV0cmljU3RlcmVvKQoteworc3RhdGljIElOVCBnZXRTYnJFeHRlbmRlZERhdGFTaXplKEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbykgewogICBJTlQgZXh0RGF0YUJpdHMgPSAwOwogCiAgIC8qIGFkZCB5b3VyIG5ldyBleHRlbmRlZCBkYXRhIGNvdW50aW5nIG1ldGhvZHMgaGVyZSAqLwpAQCAtMTA0MiwxNiArMTAzOSwxMSBAQAogICAgIG5vIGV4dGVuZGVkIGRhdGEKICAgKi8KIAotICBpZihoUGFyYW1ldHJpY1N0ZXJlbyl7CisgIGlmIChoUGFyYW1ldHJpY1N0ZXJlbykgewogICAgIC8qIFBTIGV4dGVuZGVkIGRhdGEgKi8KICAgICBleHREYXRhQml0cyArPSBTSV9TQlJfRVhURU5TSU9OX0lEX0JJVFM7CiAgICAgZXh0RGF0YUJpdHMgKz0gRkRLc2JyRW5jX1BTRW5jX1dyaXRlUFNEYXRhKGhQYXJhbWV0cmljU3RlcmVvLCBOVUxMKTsKICAgfQogCi0gIHJldHVybiAoZXh0RGF0YUJpdHMrNykgPj4gMzsKKyAgcmV0dXJuIChleHREYXRhQml0cyArIDcpID4+IDM7CiB9Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9iaXRfc2JyLmggYi9saWJTQlJlbmMvc3JjL2JpdF9zYnIuaAppbmRleCBkZTRhYzg5Li5lOTBmNTJjIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL2JpdF9zYnIuaAorKysgYi9saWJTQlJlbmMvc3JjL2JpdF9zYnIuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMjIgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBTQlIgYml0IHdyaXRpbmcgIAorICBcYnJpZWYgIFNCUiBiaXQgd3JpdGluZyAkUmV2aXNpb246IDkyNzkwICQKICovCi0jaWZuZGVmIF9fQklUX1NCUl9ICi0jZGVmaW5lIF9fQklUX1NCUl9ICisjaWZuZGVmIEJJVF9TQlJfSAorI2RlZmluZSBCSVRfU0JSX0gKIAogI2luY2x1ZGUgInNicl9kZWYuaCIKICNpbmNsdWRlICJjbW9uZGF0YS5oIgpAQCAtOTQsMjAgKzExMywyMiBAQAogCiBzdHJ1Y3QgU0JSX0VOVl9EQVRBOwogCi1zdHJ1Y3QgU0JSX0JJVFNUUkVBTV9EQVRBCi17CitzdHJ1Y3QgU0JSX0JJVFNUUkVBTV9EQVRBIHsKICAgSU5UIFRvdGFsQml0czsKICAgSU5UIFBheWxvYWRCaXRzOwogICBJTlQgRmlsbEJpdHM7CiAgIElOVCBIZWFkZXJBY3RpdmU7Ci0gIElOVCBOclNlbmRIZWFkZXJEYXRhOyAgICAgICAgICAgIC8qKjwgaW5wdXQgZnJvbSBjb21tYW5kbGluZSAqLwotICBJTlQgQ291bnRTZW5kSGVhZGVyRGF0YTsgICAgICAgICAvKio8IG1vZHVsbyBjb3VudC4gSWYgPCAwIHRoZW4gbm8gY291bnRpbmcgaXMgZG9uZSAobm8gU0JSIGhlYWRlcnMpICovCisgIElOVCBIZWFkZXJBY3RpdmVEZWxheTsgLyoqPCBzYnIgcGF5bG9hZCBhbmQgaXRzIGhlYWRlciBpcyBkZWxheWVkIGRlcGVuZGluZyBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIgY29uZmlndXJhdGlvbiovCisgIElOVCBOclNlbmRIZWFkZXJEYXRhOyAgLyoqPCBpbnB1dCBmcm9tIGNvbW1hbmRsaW5lICovCisgIElOVCBDb3VudFNlbmRIZWFkZXJEYXRhOyAvKio8IG1vZHVsbyBjb3VudC4gSWYgPCAwIHRoZW4gbm8gY291bnRpbmcgaXMgZG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vIFNCUiBoZWFkZXJzKSAqLworICBJTlQgcmlnaHRCb3JkZXJGSVg7ICAgICAgLyoqPCBmb3JjZSBWQVJGSVggb3IgRklYRklYIGZyYW1lcyAqLwogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgU0JSX0JJVFNUUkVBTV9EQVRBICAqSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQTsKK3R5cGVkZWYgc3RydWN0IFNCUl9CSVRTVFJFQU1fREFUQSAqSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQTsKIAotc3RydWN0IFNCUl9IRUFERVJfREFUQQoteworc3RydWN0IFNCUl9IRUFERVJfREFUQSB7CiAgIEFNUF9SRVMgc2JyX2FtcF9yZXM7CiAgIElOVCBzYnJfc3RhcnRfZnJlcXVlbmN5OwogICBJTlQgc2JyX3N0b3BfZnJlcXVlbmN5OwpAQCAtMTMzLDEzICsxNTQsMTAgQEAKICAgLyoKICAgICBlbGVtZW50IG9mIHNpbmdsZWNoYW5uZWxlbGVtZW50CiAgICovCi0KIH07CiB0eXBlZGVmIHN0cnVjdCBTQlJfSEVBREVSX0RBVEEgKkhBTkRMRV9TQlJfSEVBREVSX0RBVEE7CiAKLXN0cnVjdCBTQlJfRU5WX0RBVEEKLXsKLQorc3RydWN0IFNCUl9FTlZfREFUQSB7CiAgIElOVCBzYnJfeHBvc19jdHJsOwogICBGUkVRX1JFUyBmcmVxX3Jlc19maXhmaXhbMl07CiAgIFVDSEFSIGZSZXNUcmFuc0lzTG93OwpAQCAtMTY3LDcgKzE4NSw2IEBACiAgIGNvbnN0IFVDSEFSICpodWZmdGFibGVMZXZlbEZyZXFMOwogICBjb25zdCBVQ0hBUiAqaHVmZnRhYmxlQmFsYW5jZUZyZXFMOwogCi0KICAgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZU5vaXNlVGltZUw7CiAgIGNvbnN0IElOVCAqaHVmZnRhYmxlTm9pc2VUaW1lQzsKICAgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZU5vaXNlRnJlcUw7CkBAIC0xODgsNyArMjA1LDYgQEAKICAgSU5UIGFkZEhhcm1vbmljRmxhZzsKICAgVUNIQVIgYWRkSGFybW9uaWNbTUFYX0ZSRVFfQ09FRkZTXTsKIAotCiAgIC8qIGNhbGN1bGF0ZWQgaGVscGVyIHZhcnMgKi8KICAgSU5UIHNpX3Nicl9zdGFydF9lbnZfYml0c19iYWxhbmNlOwogICBJTlQgc2lfc2JyX3N0YXJ0X2Vudl9iaXRzOwpAQCAtMjA1LDcgKzIyMSwxMCBAQAogICBJTlQgYmFsYW5jZTsKICAgQU1QX1JFUyBpbml0X3Nicl9hbXBfcmVzOwogICBBTVBfUkVTIGN1cnJlbnRBbXBSZXNGRjsKLSAgRklYUF9EQkwgdG9uX0hGW1NCUl9HTE9CQUxfVE9OQUxJVFlfVkFMVUVTXTsgLyogdG9uYWxpdHkgaXMgc2NhbGVkIGJ5IDJeMTkvMC41MjQyODhmIChmcmFjdCBwYXJ0IG9mIFJFTEFYQVRJT04pICovCisgIEZJWFBfREJMCisgIHRvbl9IRltTQlJfR0xPQkFMX1RPTkFMSVRZX1ZBTFVFU107IC8qIHRvbmFsaXR5IGlzIHNjYWxlZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXjE5LzAuNTI0Mjg4ZiAoZnJhY3QgcGFydCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUxBWEFUSU9OKSAqLwogICBGSVhQX0RCTCBnbG9iYWxfdG9uYWxpdHk7CiAKICAgLyogZXh0ZW5kZWQgZGF0YSAqLwpAQCAtMjE4LDQxICsyMzcsMzEgQEAKIH07CiB0eXBlZGVmIHN0cnVjdCBTQlJfRU5WX0RBVEEgKkhBTkRMRV9TQlJfRU5WX0RBVEE7CiAKK0lOVCBGREtzYnJFbmNfV3JpdGVFbnZTaW5nbGVDaGFubmVsRWxlbWVudCgKKyAgICBzdHJ1Y3QgU0JSX0hFQURFUl9EQVRBICpzYnJIZWFkZXJEYXRhLAorICAgIHN0cnVjdCBUX1BBUkFNRVRSSUNfU1RFUkVPICpoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICBzdHJ1Y3QgU0JSX0JJVFNUUkVBTV9EQVRBICpzYnJCaXRzdHJlYW1EYXRhLAorICAgIHN0cnVjdCBTQlJfRU5WX0RBVEEgKnNickVudkRhdGEsIHN0cnVjdCBDT01NT05fREFUQSAqY21vbkRhdGEsCisgICAgVUlOVCBzYnJTeW50YXhGbGFncyk7CiAKK0lOVCBGREtzYnJFbmNfV3JpdGVFbnZDaGFubmVsUGFpckVsZW1lbnQoCisgICAgc3RydWN0IFNCUl9IRUFERVJfREFUQSAqc2JySGVhZGVyRGF0YSwKKyAgICBzdHJ1Y3QgVF9QQVJBTUVUUklDX1NURVJFTyAqaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgc3RydWN0IFNCUl9CSVRTVFJFQU1fREFUQSAqc2JyQml0c3RyZWFtRGF0YSwKKyAgICBzdHJ1Y3QgU0JSX0VOVl9EQVRBICpzYnJFbnZEYXRhTGVmdCwgc3RydWN0IFNCUl9FTlZfREFUQSAqc2JyRW52RGF0YVJpZ2h0LAorICAgIHN0cnVjdCBDT01NT05fREFUQSAqY21vbkRhdGEsIFVJTlQgc2JyU3ludGF4RmxhZ3MpOwogCi1JTlQgRkRLc2JyRW5jX1dyaXRlRW52U2luZ2xlQ2hhbm5lbEVsZW1lbnQoc3RydWN0IFNCUl9IRUFERVJfREFUQSAgICAqc2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBUX1BBUkFNRVRSSUNfU1RFUkVPICpoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBTQlJfQklUU1RSRUFNX0RBVEEgKnNickJpdHN0cmVhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgU0JSX0VOVl9EQVRBICAgICAgICpzYnJFbnZEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENPTU1PTl9EQVRBICAgICAgICAqY21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncyk7Ci0KLQotSU5UIEZES3NickVuY19Xcml0ZUVudkNoYW5uZWxQYWlyRWxlbWVudChzdHJ1Y3QgU0JSX0hFQURFUl9EQVRBICAgICpzYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBUX1BBUkFNRVRSSUNfU1RFUkVPICpoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgU0JSX0JJVFNUUkVBTV9EQVRBICpzYnJCaXRzdHJlYW1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBTQlJfRU5WX0RBVEEgICAgICAgKnNickVudkRhdGFMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBTQlJfRU5WX0RBVEEgICAgICAgKnNickVudkRhdGFSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ09NTU9OX0RBVEEgICAgICAgICpjbW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncyk7Ci0KLQotCi1JTlQgRkRLc2JyRW5jX0NvdW50U2JyQ2hhbm5lbFBhaXJFbGVtZW50IChzdHJ1Y3QgU0JSX0hFQURFUl9EQVRBICAgICAqc2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRfUEFSQU1FVFJJQ19TVEVSRU8gKmhQYXJhbWV0cmljU3RlcmVvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgU0JSX0JJVFNUUkVBTV9EQVRBICAqc2JyQml0c3RyZWFtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFNCUl9FTlZfREFUQSAgICAgICAgKnNickVudkRhdGFMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgU0JSX0VOVl9EQVRBICAgICAgICAqc2JyRW52RGF0YVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ09NTU9OX0RBVEEgICAgICAgICAqY21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICBzYnJTeW50YXhGbGFncyk7Ci0KLQorSU5UIEZES3NickVuY19Db3VudFNickNoYW5uZWxQYWlyRWxlbWVudCgKKyAgICBzdHJ1Y3QgU0JSX0hFQURFUl9EQVRBICpzYnJIZWFkZXJEYXRhLAorICAgIHN0cnVjdCBUX1BBUkFNRVRSSUNfU1RFUkVPICpoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICBzdHJ1Y3QgU0JSX0JJVFNUUkVBTV9EQVRBICpzYnJCaXRzdHJlYW1EYXRhLAorICAgIHN0cnVjdCBTQlJfRU5WX0RBVEEgKnNickVudkRhdGFMZWZ0LCBzdHJ1Y3QgU0JSX0VOVl9EQVRBICpzYnJFbnZEYXRhUmlnaHQsCisgICAgc3RydWN0IENPTU1PTl9EQVRBICpjbW9uRGF0YSwgVUlOVCBzYnJTeW50YXhGbGFncyk7CiAKIC8qIGRlYnVnZ2luZyBhbmQgdHVuaW5nIGZ1bmN0aW9ucyAqLwogCiAvKiNkZWZpbmUgU0JSX0VOVl9TVEFUSVNUSUNTICovCiAKLQogLyojZGVmaW5lIFNCUl9QQVlMT0FEX01PTklUT1IqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvY21vbmRhdGEuaCBiL2xpYlNCUmVuYy9zcmMvY21vbmRhdGEuaAppbmRleCAzMmU2OTkzLi4wNzc5YjRkIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL2Ntb25kYXRhLmgKKysrIGIvbGliU0JSZW5jL3NyYy9jbW9uZGF0YS5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDMyICs5MCwzOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIENvcmUgQ29kZXIncyBhbmQgU0JSJ3Mgc2hhcmVkIGRhdGEgc3RydWN0dXJlIGRlZmluaXRpb24gIAorICBcYnJpZWYgIENvcmUgQ29kZXIncyBhbmQgU0JSJ3Mgc2hhcmVkIGRhdGEgc3RydWN0dXJlIGRlZmluaXRpb24gJFJldmlzaW9uOgorICA5Mjc5MCAkCiAqLwotI2lmbmRlZiBfX1NCUl9DTU9OREFUQV9ICi0jZGVmaW5lIF9fU0JSX0NNT05EQVRBX0gKKyNpZm5kZWYgQ01PTkRBVEFfSAorI2RlZmluZSBDTU9OREFUQV9ICiAKICNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiAKLQogc3RydWN0IENPTU1PTl9EQVRBIHsKLSAgSU5UICAgICAgICAgICAgICAgICAgIHNickhkckJpdHM7ICAgICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIFNCUiBoZWFkZXIgYml0cyAqLwotICBJTlQgICAgICAgICAgICAgICAgICAgc2JyRGF0YUJpdHM7ICAgICAgICAgICAgLyoqPCBudW1iZXIgb2YgU0JSIGRhdGEgYml0cyAqLwotICBJTlQgICAgICAgICAgICAgICAgICAgc2JyRmlsbEJpdHM7ICAgICAgICAgICAgLyoqPCBudW1iZXIgb2YgU0JSIGZpbGwgYml0cyAqLwotICBGREtfQklUU1RSRUFNICAgICAgICAgc2JyQml0YnVmOyAgICAgICAgICAgICAgLyoqPCB0aGUgU0JSIGRhdGEgYml0YnVmZmVyICovCi0gIEZES19CSVRTVFJFQU0gICAgICAgICB0bXBXcml0ZUJpdGJ1ZjsgICAgICAgICAvKio8IGhlbHBlciB2YXIgZm9yIHdyaXRpbmcgaGVhZGVyKi8KLSAgSU5UICAgICAgICAgICAgICAgICAgIHhPdmVyRnJlcTsgICAgICAgICAgICAgIC8qKjwgdGhlIFNCUiBjcm9zc292ZXIgZnJlcXVlbmN5ICovCi0gIElOVCAgICAgICAgICAgICAgICAgICBkeW5Cd0VuYWJsZWQ7ICAgICAgICAgICAvKio8IGluZGljYXRlcyBpZiBkeW5hbWljIGJhbmR3aWR0aCBpcyBlbmFibGVkICovCi0gIElOVCAgICAgICAgICAgICAgICAgICBzYnJOdW1DaGFubmVsczsgICAgICAgICAvKio8IG51bWJlciBvZiBjaGFubmVscyAobWVhbmluZyBtb25vIG9yIHN0ZXJlbykgKi8KLSAgSU5UICAgICAgICAgICAgICAgICAgIGR5blhPdmVyRnJlcUVuYzsgICAgICAgIC8qKjwgZW5jb2RlciBkeW5hbWljIGNyb3Nzb3ZlciBmcmVxdWVuY3kgKi8KKyAgSU5UIHNickhkckJpdHM7ICAgICAgICAgICAgICAgLyoqPCBudW1iZXIgb2YgU0JSIGhlYWRlciBiaXRzICovCisgIElOVCBzYnJEYXRhQml0czsgICAgICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIFNCUiBkYXRhIGJpdHMgKi8KKyAgSU5UIHNickZpbGxCaXRzOyAgICAgICAgICAgICAgLyoqPCBudW1iZXIgb2YgU0JSIGZpbGwgYml0cyAqLworICBGREtfQklUU1RSRUFNIHNickJpdGJ1ZjsgICAgICAvKio8IHRoZSBTQlIgZGF0YSBiaXRidWZmZXIgKi8KKyAgRkRLX0JJVFNUUkVBTSB0bXBXcml0ZUJpdGJ1ZjsgLyoqPCBoZWxwZXIgdmFyIGZvciB3cml0aW5nIGhlYWRlciovCisgIElOVCB4T3ZlckZyZXE7ICAgICAgICAgICAgICAgIC8qKjwgdGhlIFNCUiBjcm9zc292ZXIgZnJlcXVlbmN5ICovCisgIElOVCBkeW5Cd0VuYWJsZWQ7ICAgIC8qKjwgaW5kaWNhdGVzIGlmIGR5bmFtaWMgYmFuZHdpZHRoIGlzIGVuYWJsZWQgKi8KKyAgSU5UIHNick51bUNoYW5uZWxzOyAgLyoqPCBudW1iZXIgb2YgY2hhbm5lbHMgKG1lYW5pbmcgbW9ubyBvciBzdGVyZW8pICovCisgIElOVCBkeW5YT3ZlckZyZXFFbmM7IC8qKjwgZW5jb2RlciBkeW5hbWljIGNyb3Nzb3ZlciBmcmVxdWVuY3kgKi8KIH07CiAKIHR5cGVkZWYgc3RydWN0IENPTU1PTl9EQVRBICpIQU5ETEVfQ09NTU9OX0RBVEE7CiAKLQotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvY29kZV9lbnYuY3BwIGIvbGliU0JSZW5jL3NyYy9jb2RlX2Vudi5jcHAKaW5kZXggZTFhMjhkNS4uZmIwZjZhNCAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9jb2RlX2Vudi5jcHAKKysrIGIvbGliU0JSZW5jL3NyYy9jb2RlX2Vudi5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTAgKzkwLDE4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImNvZGVfZW52LmgiCi0jaW5jbHVkZSAic2JyX3JvbS5oIgorI2luY2x1ZGUgInNicmVuY19yb20uaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKQEAgLTkzLDEwMCArMTEyLDk4IEBACiAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUlOVAotRkRLc2JyRW5jX0luaXRTYnJIdWZmbWFuVGFibGVzIChIQU5ETEVfU0JSX0VOVl9EQVRBICAgICAgIHNickVudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DT0RFX0VOVkVMT1BFICBoZW52LAotICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ09ERV9FTlZFTE9QRSAgaG5vaXNlLAotICAgICAgICAgICAgICAgICAgICAgIEFNUF9SRVMgICAgICAgICAgICAgICAgICAgYW1wX3JlcykKLXsKLSAgaWYgKCAoIWhlbnYpICB8fCAgKCFobm9pc2UpICB8fCAoIXNickVudkRhdGEpICkKLSAgICByZXR1cm4gKDEpOyAvKiBub3QgaW5pdC4gKi8KK0lOVCBGREtzYnJFbmNfSW5pdFNickh1ZmZtYW5UYWJsZXMoSEFORExFX1NCUl9FTlZfREFUQSBzYnJFbnZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0NPREVfRU5WRUxPUEUgaGVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DT0RFX0VOVkVMT1BFIGhub2lzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1QX1JFUyBhbXBfcmVzKSB7CisgIGlmICgoIWhlbnYpIHx8ICghaG5vaXNlKSB8fCAoIXNickVudkRhdGEpKSByZXR1cm4gKDEpOyAvKiBub3QgaW5pdC4gKi8KIAogICBzYnJFbnZEYXRhLT5pbml0X3Nicl9hbXBfcmVzID0gYW1wX3JlczsKIAogICBzd2l0Y2ggKGFtcF9yZXMpIHsKLSAgY2FzZSAgU0JSX0FNUF9SRVNfM18wOgotICAgIC8qZW52ZWxvcGUgZGF0YSovCisgICAgY2FzZSBTQlJfQU1QX1JFU18zXzA6CisgICAgICAvKmVudmVsb3BlIGRhdGEqLwogCi0gICAgLypMZXZlbC9QYW4gLSBjb2RpbmcgKi8KLSAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbFRpbWVDICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMVQ7Ci0gICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxUaW1lTCAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFUOwotICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VUaW1lQyA9IGJvb2tTYnJFbnZCYWxhbmNlQzExVDsKLSAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlVGltZUwgPSBib29rU2JyRW52QmFsYW5jZUwxMVQ7CisgICAgICAvKkxldmVsL1BhbiAtIGNvZGluZyAqLworICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxUaW1lQyA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzExVDsKKyAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsVGltZUwgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMVQ7CisgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlVGltZUMgPSBib29rU2JyRW52QmFsYW5jZUMxMVQ7CisgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlVGltZUwgPSBib29rU2JyRW52QmFsYW5jZUwxMVQ7CiAKLSAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbEZyZXFDICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMUY7Ci0gICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxGcmVxTCAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFGOwotICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxQyA9IGJvb2tTYnJFbnZCYWxhbmNlQzExRjsKLSAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlRnJlcUwgPSBib29rU2JyRW52QmFsYW5jZUwxMUY7CisgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbEZyZXFDID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFGOworICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxGcmVxTCA9IHZfSHVmZl9lbnZlbG9wZUxldmVsTDExRjsKKyAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxQyA9IGJvb2tTYnJFbnZCYWxhbmNlQzExRjsKKyAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxTCA9IGJvb2tTYnJFbnZCYWxhbmNlTDExRjsKIAotICAgIC8qUmlnaHQvTGVmdCAtIGNvZGluZyAqLwotICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZVRpbWVDICAgICAgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzExVDsKLSAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVUaW1lTCAgICAgICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMVQ7Ci0gICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlRnJlcUMgICAgICAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFGOwotICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFMICAgICAgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsTDExRjsKKyAgICAgIC8qUmlnaHQvTGVmdCAtIGNvZGluZyAqLworICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlVGltZUMgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMVQ7CisgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVUaW1lTCA9IHZfSHVmZl9lbnZlbG9wZUxldmVsTDExVDsKKyAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFDID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFGOworICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlRnJlcUwgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMUY7CiAKLSAgICBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdkJhbGFuY2UgID0gQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTExOwotICAgIHNickVudkRhdGEtPmNvZGVCb29rU2NmTGF2ICAgICAgICAgPSBDT0RFX0JPT0tfU0NGX0xBVjExOworICAgICAgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlID0gQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTExOworICAgICAgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXYgPSBDT0RFX0JPT0tfU0NGX0xBVjExOwogCi0gICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X2Vudl9iaXRzICAgICAgICAgICA9IFNJX1NCUl9TVEFSVF9FTlZfQklUU19BTVBfUkVTXzNfMDsKLSAgICBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfZW52X2JpdHNfYmFsYW5jZSAgID0gU0lfU0JSX1NUQVJUX0VOVl9CSVRTX0JBTEFOQ0VfQU1QX1JFU18zXzA7Ci0gICAgYnJlYWs7CisgICAgICBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfZW52X2JpdHMgPSBTSV9TQlJfU1RBUlRfRU5WX0JJVFNfQU1QX1JFU18zXzA7CisgICAgICBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfZW52X2JpdHNfYmFsYW5jZSA9CisgICAgICAgICAgU0lfU0JSX1NUQVJUX0VOVl9CSVRTX0JBTEFOQ0VfQU1QX1JFU18zXzA7CisgICAgICBicmVhazsKIAotICBjYXNlIFNCUl9BTVBfUkVTXzFfNToKLSAgIC8qZW52ZWxvcGUgZGF0YSovCisgICAgY2FzZSBTQlJfQU1QX1JFU18xXzU6CisgICAgICAvKmVudmVsb3BlIGRhdGEqLwogCi0gICAgLypMZXZlbC9QYW4gLSBjb2RpbmcgKi8KLSAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbFRpbWVDICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMFQ7Ci0gICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxUaW1lTCAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTBUOwotICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VUaW1lQyA9IGJvb2tTYnJFbnZCYWxhbmNlQzEwVDsKLSAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlVGltZUwgPSBib29rU2JyRW52QmFsYW5jZUwxMFQ7CisgICAgICAvKkxldmVsL1BhbiAtIGNvZGluZyAqLworICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxUaW1lQyA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzEwVDsKKyAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUxldmVsVGltZUwgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMFQ7CisgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlVGltZUMgPSBib29rU2JyRW52QmFsYW5jZUMxMFQ7CisgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlVGltZUwgPSBib29rU2JyRW52QmFsYW5jZUwxMFQ7CiAKLSAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbEZyZXFDICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMEY7Ci0gICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxGcmVxTCAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTBGOwotICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxQyA9IGJvb2tTYnJFbnZCYWxhbmNlQzEwRjsKLSAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVCYWxhbmNlRnJlcUwgPSBib29rU2JyRW52QmFsYW5jZUwxMEY7CisgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVMZXZlbEZyZXFDID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTBGOworICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTGV2ZWxGcmVxTCA9IHZfSHVmZl9lbnZlbG9wZUxldmVsTDEwRjsKKyAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxQyA9IGJvb2tTYnJFbnZCYWxhbmNlQzEwRjsKKyAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUJhbGFuY2VGcmVxTCA9IGJvb2tTYnJFbnZCYWxhbmNlTDEwRjsKIAotICAgIC8qUmlnaHQvTGVmdCAtIGNvZGluZyAqLwotICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZVRpbWVDICAgICAgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzEwVDsKLSAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVUaW1lTCAgICAgICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMFQ7Ci0gICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlRnJlcUMgICAgICAgID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTBGOwotICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFMICAgICAgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsTDEwRjsKKyAgICAgIC8qUmlnaHQvTGVmdCAtIGNvZGluZyAqLworICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlVGltZUMgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMFQ7CisgICAgICBzYnJFbnZEYXRhLT5odWZmdGFibGVUaW1lTCA9IHZfSHVmZl9lbnZlbG9wZUxldmVsTDEwVDsKKyAgICAgIHNickVudkRhdGEtPmh1ZmZ0YWJsZUZyZXFDID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTBGOworICAgICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlRnJlcUwgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMEY7CiAKLSAgICBzYnJFbnZEYXRhLT5jb2RlQm9va1NjZkxhdkJhbGFuY2UgPSBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTA7Ci0gICAgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXYgPSBDT0RFX0JPT0tfU0NGX0xBVjEwOworICAgICAgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlID0gQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTEwOworICAgICAgc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXYgPSBDT0RFX0JPT0tfU0NGX0xBVjEwOwogCi0gICAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X2Vudl9iaXRzICAgICAgICAgICA9IFNJX1NCUl9TVEFSVF9FTlZfQklUU19BTVBfUkVTXzFfNTsKLSAgICBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfZW52X2JpdHNfYmFsYW5jZSAgID0gU0lfU0JSX1NUQVJUX0VOVl9CSVRTX0JBTEFOQ0VfQU1QX1JFU18xXzU7Ci0gICAgYnJlYWs7CisgICAgICBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfZW52X2JpdHMgPSBTSV9TQlJfU1RBUlRfRU5WX0JJVFNfQU1QX1JFU18xXzU7CisgICAgICBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfZW52X2JpdHNfYmFsYW5jZSA9CisgICAgICAgICAgU0lfU0JSX1NUQVJUX0VOVl9CSVRTX0JBTEFOQ0VfQU1QX1JFU18xXzU7CisgICAgICBicmVhazsKIAotICBkZWZhdWx0OgotICAgIHJldHVybiAoMSk7IC8qIHVuZGVmaW5lZCBhbXBfcmVzIG1vZGUgKi8KKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICgxKTsgLyogdW5kZWZpbmVkIGFtcF9yZXMgbW9kZSAqLwogICB9CiAKICAgLyogdGhlc2UgYXJlIGNvbW1vbiB0byBib3RoIGFtcF9yZXMgdmFsdWVzICovCiAgIC8qTm9pc2UgZGF0YSovCiAKICAgLypMZXZlbC9QYW4gLSBjb2RpbmcgKi8KLSAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbFRpbWVDICAgPSB2X0h1ZmZfTm9pc2VMZXZlbEMxMVQ7Ci0gIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxUaW1lTCAgID0gdl9IdWZmX05vaXNlTGV2ZWxMMTFUOworICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUxldmVsVGltZUMgPSB2X0h1ZmZfTm9pc2VMZXZlbEMxMVQ7CisgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxUaW1lTCA9IHZfSHVmZl9Ob2lzZUxldmVsTDExVDsKICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlVGltZUMgPSBib29rU2JyTm9pc2VCYWxhbmNlQzExVDsKICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlVGltZUwgPSBib29rU2JyTm9pc2VCYWxhbmNlTDExVDsKIAotICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUxldmVsRnJlcUMgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzExRjsKLSAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbEZyZXFMICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMUY7CisgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlTGV2ZWxGcmVxQyA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzExRjsKKyAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VMZXZlbEZyZXFMID0gdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFGOwogICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUJhbGFuY2VGcmVxQyA9IGJvb2tTYnJFbnZCYWxhbmNlQzExRjsKICAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlRnJlcUwgPSBib29rU2JyRW52QmFsYW5jZUwxMUY7CiAKLQogICAvKlJpZ2h0L0xlZnQgLSBjb2RpbmcgKi8KLSAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VUaW1lQyAgICAgICAgPSB2X0h1ZmZfTm9pc2VMZXZlbEMxMVQ7Ci0gIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlVGltZUwgICAgICAgID0gdl9IdWZmX05vaXNlTGV2ZWxMMTFUOwotICBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUZyZXFDICAgICAgICA9IHZfSHVmZl9lbnZlbG9wZUxldmVsQzExRjsKLSAgc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VGcmVxTCAgICAgICAgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMUY7CisgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlVGltZUMgPSB2X0h1ZmZfTm9pc2VMZXZlbEMxMVQ7CisgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlVGltZUwgPSB2X0h1ZmZfTm9pc2VMZXZlbEwxMVQ7CisgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlRnJlcUMgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMUY7CisgIHNickVudkRhdGEtPmh1ZmZ0YWJsZU5vaXNlRnJlcUwgPSB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMUY7CiAKLSAgc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X25vaXNlX2JpdHMgICAgICAgICA9IFNJX1NCUl9TVEFSVF9OT0lTRV9CSVRTX0FNUF9SRVNfM18wOwotICBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfbm9pc2VfYml0c19iYWxhbmNlID0gU0lfU0JSX1NUQVJUX05PSVNFX0JJVFNfQkFMQU5DRV9BTVBfUkVTXzNfMDsKLQorICBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfbm9pc2VfYml0cyA9IFNJX1NCUl9TVEFSVF9OT0lTRV9CSVRTX0FNUF9SRVNfM18wOworICBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfbm9pc2VfYml0c19iYWxhbmNlID0KKyAgICAgIFNJX1NCUl9TVEFSVF9OT0lTRV9CSVRTX0JBTEFOQ0VfQU1QX1JFU18zXzA7CiAKICAgLyogaW5pdCBlbnZlbG9wZSB0YWJsZXMgYW5kIGNvZGVib29rcyAqLwogICBoZW52LT5jb2RlQm9va1NjZkxhdkJhbGFuY2VUaW1lID0gc2JyRW52RGF0YS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlOwpAQCAtMjA5LDcgKzIyNiw2IEBACiAgIGhlbnYtPnN0YXJ0X2JpdHMgPSBzYnJFbnZEYXRhLT5zaV9zYnJfc3RhcnRfZW52X2JpdHM7CiAgIGhlbnYtPnN0YXJ0X2JpdHNfYmFsYW5jZSA9IHNickVudkRhdGEtPnNpX3Nicl9zdGFydF9lbnZfYml0c19iYWxhbmNlOwogCi0KICAgLyogaW5pdCBub2lzZSB0YWJsZXMgYW5kIGNvZGVib29rcyAqLwogCiAgIGhub2lzZS0+Y29kZUJvb2tTY2ZMYXZCYWxhbmNlVGltZSA9IENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMTsKQEAgLTIyNiwxNCArMjQyLDE0IEBACiAgIGhub2lzZS0+aHVmZnRhYmxlQmFsYW5jZUZyZXFMID0gc2JyRW52RGF0YS0+aHVmZnRhYmxlTm9pc2VCYWxhbmNlRnJlcUw7CiAgIGhub2lzZS0+aHVmZnRhYmxlRnJlcUwgPSBzYnJFbnZEYXRhLT5odWZmdGFibGVOb2lzZUZyZXFMOwogCi0KICAgaG5vaXNlLT5zdGFydF9iaXRzID0gc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X25vaXNlX2JpdHM7CiAgIGhub2lzZS0+c3RhcnRfYml0c19iYWxhbmNlID0gc2JyRW52RGF0YS0+c2lfc2JyX3N0YXJ0X25vaXNlX2JpdHNfYmFsYW5jZTsKIAotICAvKiBObyBkZWx0YSBjb2RpbmcgaW4gdGltZSBmcm9tIHRoZSBwcmV2aW91cyBmcmFtZSBkdWUgdG8gMS41ZEIgRkl4LUZJWCBydWxlICovCisgIC8qIE5vIGRlbHRhIGNvZGluZyBpbiB0aW1lIGZyb20gdGhlIHByZXZpb3VzIGZyYW1lIGR1ZSB0byAxLjVkQiBGSXgtRklYIHJ1bGUKKyAgICovCiAgIGhlbnYtPnVwRGF0ZSA9IDA7CiAgIGhub2lzZS0+dXBEYXRlID0gMDsKLSAgcmV0dXJuICAoMCk7CisgIHJldHVybiAoMCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNDgsMzMgKzI2NCwyNCBAQAogIFJldHVybjogICAgICAgIElOVAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVCBpbmRleExvdzJIaWdoKElOVCBvZmZzZXQsIElOVCBpbmRleCwgRlJFUV9SRVMgcmVzKQotewotCi0gIGlmKHJlcyA9PSBGUkVRX1JFU19MT1cpCi0gIHsKLSAgICBpZiAob2Zmc2V0ID49IDApCi0gICAgewotICAgICAgICBpZiAoaW5kZXggPCBvZmZzZXQpCi0gICAgICAgICAgcmV0dXJuKGluZGV4KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHJldHVybigyKmluZGV4IC0gb2Zmc2V0KTsKK3N0YXRpYyBJTlQgaW5kZXhMb3cySGlnaChJTlQgb2Zmc2V0LCBJTlQgaW5kZXgsIEZSRVFfUkVTIHJlcykgeworICBpZiAocmVzID09IEZSRVFfUkVTX0xPVykgeworICAgIGlmIChvZmZzZXQgPj0gMCkgeworICAgICAgaWYgKGluZGV4IDwgb2Zmc2V0KQorICAgICAgICByZXR1cm4gKGluZGV4KTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICgyICogaW5kZXggLSBvZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICBvZmZzZXQgPSAtb2Zmc2V0OworICAgICAgaWYgKGluZGV4IDwgb2Zmc2V0KQorICAgICAgICByZXR1cm4gKDIgKiBpbmRleCArIGluZGV4KTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICgyICogaW5kZXggKyBvZmZzZXQpOwogICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0OwotICAgICAgICBpZiAoaW5kZXggPCBvZmZzZXQpCi0gICAgICAgICAgcmV0dXJuKDIqaW5kZXgraW5kZXgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcmV0dXJuKDIqaW5kZXggKyBvZmZzZXQpOwotICAgIH0KLSAgfQotICBlbHNlCi0gICAgcmV0dXJuKGluZGV4KTsKKyAgfSBlbHNlCisgICAgcmV0dXJuIChpbmRleCk7CiB9CiAKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEZ1bmN0aW9ubmFtZTogIG1hcExvd1Jlc0VuZXJneVZhbAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI4Niw0MyArMjkzLDMxIEBACiAgUmV0dXJuOiAgICAgICAgbm9uZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgbWFwTG93UmVzRW5lcmd5VmFsKFNDSEFSIGN1cnJWYWwsIFNDSEFSKiBwcmV2RGF0YSwgSU5UIG9mZnNldCwgSU5UIGluZGV4LCBGUkVRX1JFUyByZXMpCi17Ci0KLSAgaWYocmVzID09IEZSRVFfUkVTX0xPVykKLSAgewotICAgIGlmIChvZmZzZXQgPj0gMCkKLSAgICB7Ci0gICAgICAgIGlmKGluZGV4IDwgb2Zmc2V0KQotICAgICAgICAgICAgcHJldkRhdGFbaW5kZXhdID0gY3VyclZhbDsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmV2RGF0YVsyKmluZGV4IC0gb2Zmc2V0XSA9IGN1cnJWYWw7Ci0gICAgICAgICAgICBwcmV2RGF0YVsyKmluZGV4KzEgLSBvZmZzZXRdID0gY3VyclZhbDsKLSAgICAgICAgfQorc3RhdGljIHZvaWQgbWFwTG93UmVzRW5lcmd5VmFsKFNDSEFSIGN1cnJWYWwsIFNDSEFSICpwcmV2RGF0YSwgSU5UIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgaW5kZXgsIEZSRVFfUkVTIHJlcykgeworICBpZiAocmVzID09IEZSRVFfUkVTX0xPVykgeworICAgIGlmIChvZmZzZXQgPj0gMCkgeworICAgICAgaWYgKGluZGV4IDwgb2Zmc2V0KQorICAgICAgICBwcmV2RGF0YVtpbmRleF0gPSBjdXJyVmFsOworICAgICAgZWxzZSB7CisgICAgICAgIHByZXZEYXRhWzIgKiBpbmRleCAtIG9mZnNldF0gPSBjdXJyVmFsOworICAgICAgICBwcmV2RGF0YVsyICogaW5kZXggKyAxIC0gb2Zmc2V0XSA9IGN1cnJWYWw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG9mZnNldCA9IC1vZmZzZXQ7CisgICAgICBpZiAoaW5kZXggPCBvZmZzZXQpIHsKKyAgICAgICAgcHJldkRhdGFbMyAqIGluZGV4XSA9IGN1cnJWYWw7CisgICAgICAgIHByZXZEYXRhWzMgKiBpbmRleCArIDFdID0gY3VyclZhbDsKKyAgICAgICAgcHJldkRhdGFbMyAqIGluZGV4ICsgMl0gPSBjdXJyVmFsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJldkRhdGFbMiAqIGluZGV4ICsgb2Zmc2V0XSA9IGN1cnJWYWw7CisgICAgICAgIHByZXZEYXRhWzIgKiBpbmRleCArIDEgKyBvZmZzZXRdID0gY3VyclZhbDsKKyAgICAgIH0KICAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKLSAgICAgICAgaWYgKGluZGV4IDwgb2Zmc2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmV2RGF0YVszKmluZGV4XSA9IGN1cnJWYWw7Ci0gICAgICAgICAgICBwcmV2RGF0YVszKmluZGV4KzFdID0gY3VyclZhbDsKLSAgICAgICAgICAgIHByZXZEYXRhWzMqaW5kZXgrMl0gPSBjdXJyVmFsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHJldkRhdGFbMippbmRleCArIG9mZnNldF0gPSBjdXJyVmFsOwotICAgICAgICAgICAgcHJldkRhdGFbMippbmRleCArIDEgKyBvZmZzZXRdID0gY3VyclZhbDsKLSAgICAgICAgfQotICAgIH0KLSAgfQotICBlbHNlCisgIH0gZWxzZQogICAgIHByZXZEYXRhW2luZGV4XSA9IGN1cnJWYWw7CiB9CiAKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEZ1bmN0aW9ubmFtZTogIGNvbXB1dGVCaXRzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzM4LDM2ICszMzMsMzEgQEAKICBSZXR1cm46ICAgICAgICBJTlQKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQKLWNvbXB1dGVCaXRzIChTQ0hBUiAqZGVsdGEsCi0gICAgICAgICAgICAgSU5UIGNvZGVCb29rU2NmTGF2TGV2ZWwsCi0gICAgICAgICAgICAgSU5UIGNvZGVCb29rU2NmTGF2QmFsYW5jZSwKLSAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqIGh1ZmZ0YWJsZUxldmVsLAotICAgICAgICAgICAgIGNvbnN0IFVDSEFSICogaHVmZnRhYmxlQmFsYW5jZSwgSU5UIGNvdXBsaW5nLCBJTlQgY2hhbm5lbCkKLXsKK3N0YXRpYyBJTlQgY29tcHV0ZUJpdHMoU0NIQVIgKmRlbHRhLCBJTlQgY29kZUJvb2tTY2ZMYXZMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNvZGVCb29rU2NmTGF2QmFsYW5jZSwgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqaHVmZnRhYmxlQmFsYW5jZSwgSU5UIGNvdXBsaW5nLAorICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2hhbm5lbCkgewogICBJTlQgaW5kZXg7CiAgIElOVCBkZWx0YV9iaXRzID0gMDsKIAogICBpZiAoY291cGxpbmcpIHsKLSAgICBpZiAoY2hhbm5lbCA9PSAxKQotICAgICAgewotICAgICAgICBpZiAoKmRlbHRhIDwgMCkKLSAgICAgICAgICBpbmRleCA9IGZpeE1heCgqZGVsdGEsIC1jb2RlQm9va1NjZkxhdkJhbGFuY2UpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgaW5kZXggPSBmaXhNaW4oKmRlbHRhLCAgY29kZUJvb2tTY2ZMYXZCYWxhbmNlKTsKKyAgICBpZiAoY2hhbm5lbCA9PSAxKSB7CisgICAgICBpZiAoKmRlbHRhIDwgMCkKKyAgICAgICAgaW5kZXggPSBmaXhNYXgoKmRlbHRhLCAtY29kZUJvb2tTY2ZMYXZCYWxhbmNlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgaW5kZXggPSBmaXhNaW4oKmRlbHRhLCBjb2RlQm9va1NjZkxhdkJhbGFuY2UpOwogCi0gICAgICAgIGlmIChpbmRleCAhPSAqZGVsdGEpIHsKLSAgICAgICAgICAqZGVsdGEgPSBpbmRleDsKLSAgICAgICAgICByZXR1cm4gKDEwMDAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRlbHRhX2JpdHMgPSBodWZmdGFibGVCYWxhbmNlW2luZGV4ICsgY29kZUJvb2tTY2ZMYXZCYWxhbmNlXTsKKyAgICAgIGlmIChpbmRleCAhPSAqZGVsdGEpIHsKKyAgICAgICAgKmRlbHRhID0gaW5kZXg7CisgICAgICAgIHJldHVybiAoMTAwMDApOwogICAgICAgfQotICAgIGVsc2UgeworCisgICAgICBkZWx0YV9iaXRzID0gaHVmZnRhYmxlQmFsYW5jZVtpbmRleCArIGNvZGVCb29rU2NmTGF2QmFsYW5jZV07CisgICAgfSBlbHNlIHsKICAgICAgIGlmICgqZGVsdGEgPCAwKQogICAgICAgICBpbmRleCA9IGZpeE1heCgqZGVsdGEsIC1jb2RlQm9va1NjZkxhdkxldmVsKTsKICAgICAgIGVsc2UKLSAgICAgICAgaW5kZXggPSBmaXhNaW4oKmRlbHRhLCAgY29kZUJvb2tTY2ZMYXZMZXZlbCk7CisgICAgICAgIGluZGV4ID0gZml4TWluKCpkZWx0YSwgY29kZUJvb2tTY2ZMYXZMZXZlbCk7CiAKICAgICAgIGlmIChpbmRleCAhPSAqZGVsdGEpIHsKICAgICAgICAgKmRlbHRhID0gaW5kZXg7CkBAIC0zNzUsMTIgKzM2NSwxMSBAQAogICAgICAgfQogICAgICAgZGVsdGFfYml0cyA9IGh1ZmZ0YWJsZUxldmVsW2luZGV4ICsgY29kZUJvb2tTY2ZMYXZMZXZlbF07CiAgICAgfQotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIGlmICgqZGVsdGEgPCAwKQogICAgICAgaW5kZXggPSBmaXhNYXgoKmRlbHRhLCAtY29kZUJvb2tTY2ZMYXZMZXZlbCk7CiAgICAgZWxzZQotICAgICAgaW5kZXggPSBmaXhNaW4oKmRlbHRhLCAgY29kZUJvb2tTY2ZMYXZMZXZlbCk7CisgICAgICBpbmRleCA9IGZpeE1pbigqZGVsdGEsIGNvZGVCb29rU2NmTGF2TGV2ZWwpOwogCiAgICAgaWYgKGluZGV4ICE9ICpkZWx0YSkgewogICAgICAgKmRlbHRhID0gaW5kZXg7CkBAIC0zOTIsOSArMzgxLDYgQEAKICAgcmV0dXJuIChkZWx0YV9iaXRzKTsKIH0KIAotCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfY29kZUVudmVsb3BlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDE0LDE4ICs0MDAsMTIgQEAKICAgICAgICAgICAgICAgICAqZGlyZWN0aW9uVmVjIGlzIG1vZGlmaWVkCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1GREtzYnJFbmNfY29kZUVudmVsb3BlKFNDSEFSICAgICAgICAgICAgICpzZmJfbnJnLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGUkVRX1JFUyAgICAqZnJlcV9yZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIFNCUl9DT0RFX0VOVkVMT1BFICpoX3NickNvZGVFbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgKmRpcmVjdGlvblZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgIGNvdXBsaW5nLAotICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgbkVudmVsb3BlcywKLSAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgIGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICBoZWFkZXJBY3RpdmUpCi17Cit2b2lkIEZES3NickVuY19jb2RlRW52ZWxvcGUoU0NIQVIgKnNmYl9ucmcsIGNvbnN0IEZSRVFfUkVTICpmcmVxX3JlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfQ09ERV9FTlZFTE9QRSAqaF9zYnJDb2RlRW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpkaXJlY3Rpb25WZWMsIElOVCBjb3VwbGluZywgSU5UIG5FbnZlbG9wZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNoYW5uZWwsIElOVCBoZWFkZXJBY3RpdmUpIHsKICAgSU5UIGksIG5vX29mX2JhbmRzLCBiYW5kOwotICBGSVhQX0RCTCB0bXAxLHRtcDIsdG1wMyxkRl9lZGdlXzFzdEVudjsKKyAgRklYUF9EQkwgdG1wMSwgdG1wMiwgdG1wMywgZEZfZWRnZV8xc3RFbnY7CiAgIFNDSEFSICpwdHJfbnJnOwogCiAgIElOVCBjb2RlQm9va1NjZkxhdkxldmVsVGltZTsKQEAgLTQ0Nyw5ICs0MjcsMTAgQEAKICAgU0NIQVIgZGVsdGFfVFtNQVhfRlJFUV9DT0VGRlNdOwogICBTQ0hBUiBsYXN0X25yZywgY3Vycl9ucmc7CiAKLSAgdG1wMSA9IEZMMkZYQ09OU1RfREJMKDAuNWYpID4+IChERlJBQ1RfQklUUy0xNi0xKTsKLSAgdG1wMiA9IGhfc2JyQ29kZUVudmVsb3BlLT5kRl9lZGdlXzFzdEVudiA+PiAoREZSQUNUX0JJVFMtMTYpOwotICB0bXAzID0gKEZJWFBfREJMKSgoKElOVCkoTE9ORyloX3NickNvZGVFbnZlbG9wZS0+ZEZfZWRnZV9pbmNyKmhfc2JyQ29kZUVudmVsb3BlLT5kRl9lZGdlX2luY3JfZmFjKSA+PiAoREZSQUNUX0JJVFMtMTYpKTsKKyAgdG1wMSA9IEZMMkZYQ09OU1RfREJMKDAuNWYpID4+IChERlJBQ1RfQklUUyAtIDE2IC0gMSk7CisgIHRtcDIgPSBoX3NickNvZGVFbnZlbG9wZS0+ZEZfZWRnZV8xc3RFbnYgPj4gKERGUkFDVF9CSVRTIC0gMTYpOworICB0bXAzID0gKEZJWFBfREJMKWZNdWx0KGhfc2JyQ29kZUVudmVsb3BlLT5kRl9lZGdlX2luY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgKChGSVhQX0RCTCloX3NickNvZGVFbnZlbG9wZS0+ZEZfZWRnZV9pbmNyX2ZhYykgPDwgMTUpOwogCiAgIGRGX2VkZ2VfMXN0RW52ID0gdG1wMSArIHRtcDIgKyB0bXAzOwogCkBAIC00NjIsOCArNDQzLDcgQEAKICAgICBodWZmdGFibGVCYWxhbmNlVGltZUwgPSBoX3NickNvZGVFbnZlbG9wZS0+aHVmZnRhYmxlQmFsYW5jZVRpbWVMOwogICAgIGh1ZmZ0YWJsZUxldmVsRnJlcUwgPSBoX3NickNvZGVFbnZlbG9wZS0+aHVmZnRhYmxlTGV2ZWxGcmVxTDsKICAgICBodWZmdGFibGVCYWxhbmNlRnJlcUwgPSBoX3NickNvZGVFbnZlbG9wZS0+aHVmZnRhYmxlQmFsYW5jZUZyZXFMOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIGNvZGVCb29rU2NmTGF2TGV2ZWxUaW1lID0gaF9zYnJDb2RlRW52ZWxvcGUtPmNvZGVCb29rU2NmTGF2VGltZTsKICAgICBjb2RlQm9va1NjZkxhdkxldmVsRnJlcSA9IGhfc2JyQ29kZUVudmVsb3BlLT5jb2RlQm9va1NjZkxhdkZyZXE7CiAgICAgY29kZUJvb2tTY2ZMYXZCYWxhbmNlVGltZSA9IGhfc2JyQ29kZUVudmVsb3BlLT5jb2RlQm9va1NjZkxhdlRpbWU7CkBAIC00NzQsMjggKzQ1NCwyMyBAQAogICAgIGh1ZmZ0YWJsZUJhbGFuY2VGcmVxTCA9IGhfc2JyQ29kZUVudmVsb3BlLT5odWZmdGFibGVGcmVxTDsKICAgfQogCi0gIGlmKGNvdXBsaW5nID09IDEgJiYgY2hhbm5lbCA9PSAxKQotICAgIGVudkRhdGFUYWJsZUNvbXBGYWN0b3IgPSAxOyAgICAgICAvKnNob3VsZCBiZSBvbmUgd2hlbiB0aGUgbmV3IGh1ZmZtYW4tdGFibGVzIGFyZSByZWFkeSovCisgIGlmIChjb3VwbGluZyA9PSAxICYmIGNoYW5uZWwgPT0gMSkKKyAgICBlbnZEYXRhVGFibGVDb21wRmFjdG9yID0KKyAgICAgICAgMTsgLypzaG91bGQgYmUgb25lIHdoZW4gdGhlIG5ldyBodWZmbWFuLXRhYmxlcyBhcmUgcmVhZHkqLwogICBlbHNlCiAgICAgZW52RGF0YVRhYmxlQ29tcEZhY3RvciA9IDA7CiAKLQotICBpZiAoaF9zYnJDb2RlRW52ZWxvcGUtPmRlbHRhVEFjcm9zc0ZyYW1lcyA9PSAwKQotICAgIGhfc2JyQ29kZUVudmVsb3BlLT51cERhdGUgPSAwOworICBpZiAoaF9zYnJDb2RlRW52ZWxvcGUtPmRlbHRhVEFjcm9zc0ZyYW1lcyA9PSAwKSBoX3NickNvZGVFbnZlbG9wZS0+dXBEYXRlID0gMDsKIAogICAvKiBubyBkZWx0YSBjb2RpbmcgaW4gdGltZSBpbiBjYXNlIG9mIGEgaGVhZGVyICovCi0gIGlmIChoZWFkZXJBY3RpdmUpCi0gICAgaF9zYnJDb2RlRW52ZWxvcGUtPnVwRGF0ZSA9IDA7CisgIGlmIChoZWFkZXJBY3RpdmUpIGhfc2JyQ29kZUVudmVsb3BlLT51cERhdGUgPSAwOwogCi0KLSAgZm9yIChpID0gMDsgaSA8IG5FbnZlbG9wZXM7IGkrKykKLSAgeworICBmb3IgKGkgPSAwOyBpIDwgbkVudmVsb3BlczsgaSsrKSB7CiAgICAgaWYgKGZyZXFfcmVzW2ldID09IEZSRVFfUkVTX0hJR0gpCiAgICAgICBub19vZl9iYW5kcyA9IGhfc2JyQ29kZUVudmVsb3BlLT5uU2ZiW0ZSRVFfUkVTX0hJR0hdOwogICAgIGVsc2UKICAgICAgIG5vX29mX2JhbmRzID0gaF9zYnJDb2RlRW52ZWxvcGUtPm5TZmJbRlJFUV9SRVNfTE9XXTsKIAotCiAgICAgcHRyX25yZyA9IHNmYl9ucmc7CiAgICAgY3Vycl9ucmcgPSAqcHRyX25yZzsKIApAQCAtNTA2LDEwNyArNDgxLDk2IEBACiAgICAgZWxzZQogICAgICAgZGVsdGFfRl9iaXRzID0gaF9zYnJDb2RlRW52ZWxvcGUtPnN0YXJ0X2JpdHM7CiAKKyAgICBpZiAoaF9zYnJDb2RlRW52ZWxvcGUtPnVwRGF0ZSAhPSAwKSB7CisgICAgICBkZWx0YV9UWzBdID0gKGN1cnJfbnJnIC0gaF9zYnJDb2RlRW52ZWxvcGUtPnNmYl9ucmdfcHJldlswXSkgPj4KKyAgICAgICAgICAgICAgICAgICBlbnZEYXRhVGFibGVDb21wRmFjdG9yOwogCi0gICAgaWYoaF9zYnJDb2RlRW52ZWxvcGUtPnVwRGF0ZSAhPSAwKQotICAgIHsKLSAgICAgIGRlbHRhX1RbMF0gPSAoY3Vycl9ucmcgLSBoX3NickNvZGVFbnZlbG9wZS0+c2ZiX25yZ19wcmV2WzBdKSA+PiBlbnZEYXRhVGFibGVDb21wRmFjdG9yOwotCi0gICAgICBkZWx0YV9UX2JpdHMgPSBjb21wdXRlQml0cyAoJmRlbHRhX1RbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUJvb2tTY2ZMYXZMZXZlbFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUJvb2tTY2ZMYXZCYWxhbmNlVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWZmdGFibGVMZXZlbFRpbWVMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZ0YWJsZUJhbGFuY2VUaW1lTCwgY291cGxpbmcsIGNoYW5uZWwpOworICAgICAgZGVsdGFfVF9iaXRzID0gY29tcHV0ZUJpdHMoJmRlbHRhX1RbMF0sIGNvZGVCb29rU2NmTGF2TGV2ZWxUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUJvb2tTY2ZMYXZCYWxhbmNlVGltZSwgaHVmZnRhYmxlTGV2ZWxUaW1lTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZ0YWJsZUJhbGFuY2VUaW1lTCwgY291cGxpbmcsIGNoYW5uZWwpOwogICAgIH0KIAotCi0gICAgbWFwTG93UmVzRW5lcmd5VmFsKGN1cnJfbnJnLCBoX3NickNvZGVFbnZlbG9wZS0+c2ZiX25yZ19wcmV2LCBvZmZzZXQsIDAsIGZyZXFfcmVzW2ldKTsKKyAgICBtYXBMb3dSZXNFbmVyZ3lWYWwoY3Vycl9ucmcsIGhfc2JyQ29kZUVudmVsb3BlLT5zZmJfbnJnX3ByZXYsIG9mZnNldCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgZnJlcV9yZXNbaV0pOwogCiAgICAgLyogZW5zdXJlIHRoYXQgbnJnIGRpZmZlcmVuY2UgaXMgbm90IGhpZ2hlciB0aGFuIGNvZGVCb29rU2NmTGF2WFhYRnJlcSAqLwotICAgIGlmICggY291cGxpbmcgJiYgY2hhbm5lbCA9PSAxICkgeworICAgIGlmIChjb3VwbGluZyAmJiBjaGFubmVsID09IDEpIHsKICAgICAgIGZvciAoYmFuZCA9IG5vX29mX2JhbmRzIC0gMTsgYmFuZCA+IDA7IGJhbmQtLSkgewotICAgICAgICBpZiAoIHB0cl9ucmdbYmFuZF0gLSBwdHJfbnJnW2JhbmQtMV0gPiBjb2RlQm9va1NjZkxhdkJhbGFuY2VGcmVxICkgewotICAgICAgICAgIHB0cl9ucmdbYmFuZC0xXSA9IHB0cl9ucmdbYmFuZF0gLSBjb2RlQm9va1NjZkxhdkJhbGFuY2VGcmVxOworICAgICAgICBpZiAocHRyX25yZ1tiYW5kXSAtIHB0cl9ucmdbYmFuZCAtIDFdID4gY29kZUJvb2tTY2ZMYXZCYWxhbmNlRnJlcSkgeworICAgICAgICAgIHB0cl9ucmdbYmFuZCAtIDFdID0gcHRyX25yZ1tiYW5kXSAtIGNvZGVCb29rU2NmTGF2QmFsYW5jZUZyZXE7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIGZvciAoYmFuZCA9IDE7IGJhbmQgPCBub19vZl9iYW5kczsgYmFuZCsrKSB7Ci0gICAgICAgIGlmICggcHRyX25yZ1tiYW5kLTFdIC0gcHRyX25yZ1tiYW5kXSA+IGNvZGVCb29rU2NmTGF2QmFsYW5jZUZyZXEgKSB7Ci0gICAgICAgICAgcHRyX25yZ1tiYW5kXSA9IHB0cl9ucmdbYmFuZC0xXSAtIGNvZGVCb29rU2NmTGF2QmFsYW5jZUZyZXE7CisgICAgICAgIGlmIChwdHJfbnJnW2JhbmQgLSAxXSAtIHB0cl9ucmdbYmFuZF0gPiBjb2RlQm9va1NjZkxhdkJhbGFuY2VGcmVxKSB7CisgICAgICAgICAgcHRyX25yZ1tiYW5kXSA9IHB0cl9ucmdbYmFuZCAtIDFdIC0gY29kZUJvb2tTY2ZMYXZCYWxhbmNlRnJlcTsKICAgICAgICAgfQogICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgZm9yIChiYW5kID0gbm9fb2ZfYmFuZHMgLSAxOyBiYW5kID4gMDsgYmFuZC0tKSB7Ci0gICAgICAgIGlmICggcHRyX25yZ1tiYW5kXSAtIHB0cl9ucmdbYmFuZC0xXSA+IGNvZGVCb29rU2NmTGF2TGV2ZWxGcmVxICkgewotICAgICAgICAgIHB0cl9ucmdbYmFuZC0xXSA9IHB0cl9ucmdbYmFuZF0gLSBjb2RlQm9va1NjZkxhdkxldmVsRnJlcTsKKyAgICAgICAgaWYgKHB0cl9ucmdbYmFuZF0gLSBwdHJfbnJnW2JhbmQgLSAxXSA+IGNvZGVCb29rU2NmTGF2TGV2ZWxGcmVxKSB7CisgICAgICAgICAgcHRyX25yZ1tiYW5kIC0gMV0gPSBwdHJfbnJnW2JhbmRdIC0gY29kZUJvb2tTY2ZMYXZMZXZlbEZyZXE7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIGZvciAoYmFuZCA9IDE7IGJhbmQgPCBub19vZl9iYW5kczsgYmFuZCsrKSB7Ci0gICAgICAgIGlmICggcHRyX25yZ1tiYW5kLTFdIC0gcHRyX25yZ1tiYW5kXSA+IGNvZGVCb29rU2NmTGF2TGV2ZWxGcmVxICkgewotICAgICAgICAgIHB0cl9ucmdbYmFuZF0gPSBwdHJfbnJnW2JhbmQtMV0gLSBjb2RlQm9va1NjZkxhdkxldmVsRnJlcTsKKyAgICAgICAgaWYgKHB0cl9ucmdbYmFuZCAtIDFdIC0gcHRyX25yZ1tiYW5kXSA+IGNvZGVCb29rU2NmTGF2TGV2ZWxGcmVxKSB7CisgICAgICAgICAgcHRyX25yZ1tiYW5kXSA9IHB0cl9ucmdbYmFuZCAtIDFdIC0gY29kZUJvb2tTY2ZMYXZMZXZlbEZyZXE7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qIENvZGluZyBsb29wKi8KLSAgICBmb3IgKGJhbmQgPSAxOyBiYW5kIDwgbm9fb2ZfYmFuZHM7IGJhbmQrKykKLSAgICB7CisgICAgZm9yIChiYW5kID0gMTsgYmFuZCA8IG5vX29mX2JhbmRzOyBiYW5kKyspIHsKICAgICAgIGxhc3RfbnJnID0gKCpwdHJfbnJnKTsKICAgICAgIHB0cl9ucmcrKzsKICAgICAgIGN1cnJfbnJnID0gKCpwdHJfbnJnKTsKIAogICAgICAgZGVsdGFfRltiYW5kXSA9IChjdXJyX25yZyAtIGxhc3RfbnJnKSA+PiBlbnZEYXRhVGFibGVDb21wRmFjdG9yOwogCi0gICAgICBkZWx0YV9GX2JpdHMgKz0gY29tcHV0ZUJpdHMgKCZkZWx0YV9GW2JhbmRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlQm9va1NjZkxhdkxldmVsRnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUJvb2tTY2ZMYXZCYWxhbmNlRnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVmZnRhYmxlTGV2ZWxGcmVxTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVmZnRhYmxlQmFsYW5jZUZyZXFMLCBjb3VwbGluZywgY2hhbm5lbCk7CisgICAgICBkZWx0YV9GX2JpdHMgKz0gY29tcHV0ZUJpdHMoCisgICAgICAgICAgJmRlbHRhX0ZbYmFuZF0sIGNvZGVCb29rU2NmTGF2TGV2ZWxGcmVxLCBjb2RlQm9va1NjZkxhdkJhbGFuY2VGcmVxLAorICAgICAgICAgIGh1ZmZ0YWJsZUxldmVsRnJlcUwsIGh1ZmZ0YWJsZUJhbGFuY2VGcmVxTCwgY291cGxpbmcsIGNoYW5uZWwpOwogCi0gICAgICBpZihoX3NickNvZGVFbnZlbG9wZS0+dXBEYXRlICE9IDApCi0gICAgICB7Ci0gICAgICAgIGRlbHRhX1RbYmFuZF0gPSBjdXJyX25yZyAtIGhfc2JyQ29kZUVudmVsb3BlLT5zZmJfbnJnX3ByZXZbaW5kZXhMb3cySGlnaChvZmZzZXQsIGJhbmQsIGZyZXFfcmVzW2ldKV07CisgICAgICBpZiAoaF9zYnJDb2RlRW52ZWxvcGUtPnVwRGF0ZSAhPSAwKSB7CisgICAgICAgIGRlbHRhX1RbYmFuZF0gPQorICAgICAgICAgICAgY3Vycl9ucmcgLQorICAgICAgICAgICAgaF9zYnJDb2RlRW52ZWxvcGUKKyAgICAgICAgICAgICAgICAtPnNmYl9ucmdfcHJldltpbmRleExvdzJIaWdoKG9mZnNldCwgYmFuZCwgZnJlcV9yZXNbaV0pXTsKICAgICAgICAgZGVsdGFfVFtiYW5kXSA9IGRlbHRhX1RbYmFuZF0gPj4gZW52RGF0YVRhYmxlQ29tcEZhY3RvcjsKICAgICAgIH0KIAotICAgICAgbWFwTG93UmVzRW5lcmd5VmFsKGN1cnJfbnJnLCBoX3NickNvZGVFbnZlbG9wZS0+c2ZiX25yZ19wcmV2LCBvZmZzZXQsIGJhbmQsIGZyZXFfcmVzW2ldKTsKKyAgICAgIG1hcExvd1Jlc0VuZXJneVZhbChjdXJyX25yZywgaF9zYnJDb2RlRW52ZWxvcGUtPnNmYl9ucmdfcHJldiwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQsIGZyZXFfcmVzW2ldKTsKIAotICAgICAgaWYoaF9zYnJDb2RlRW52ZWxvcGUtPnVwRGF0ZSAhPSAwKQotICAgICAgewotICAgICAgICBkZWx0YV9UX2JpdHMgKz0gY29tcHV0ZUJpdHMgKCZkZWx0YV9UW2JhbmRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVCb29rU2NmTGF2TGV2ZWxUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVCb29rU2NmTGF2QmFsYW5jZVRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVmZnRhYmxlTGV2ZWxUaW1lTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWZmdGFibGVCYWxhbmNlVGltZUwsIGNvdXBsaW5nLCBjaGFubmVsKTsKKyAgICAgIGlmIChoX3NickNvZGVFbnZlbG9wZS0+dXBEYXRlICE9IDApIHsKKyAgICAgICAgZGVsdGFfVF9iaXRzICs9IGNvbXB1dGVCaXRzKAorICAgICAgICAgICAgJmRlbHRhX1RbYmFuZF0sIGNvZGVCb29rU2NmTGF2TGV2ZWxUaW1lLCBjb2RlQm9va1NjZkxhdkJhbGFuY2VUaW1lLAorICAgICAgICAgICAgaHVmZnRhYmxlTGV2ZWxUaW1lTCwgaHVmZnRhYmxlQmFsYW5jZVRpbWVMLCBjb3VwbGluZywgY2hhbm5lbCk7CiAgICAgICB9CiAgICAgfQogCiAgICAgLyogUmVwbGFjZSBzZmJfbnJnIHdpdGggZGVsdGFjb2RlZCBzYW1wbGVzIGFuZCBzZXQgZmxhZyAqLwogICAgIGlmIChpID09IDApIHsKICAgICAgIElOVCB0bXBfYml0czsKLSAgICAgIHRtcF9iaXRzID0gKCgoZGVsdGFfVF9iaXRzICogZEZfZWRnZV8xc3RFbnYpID4+IChERlJBQ1RfQklUUy0xOCkpICsgKEZJWFBfREJMKTEpID4+IDE7CisgICAgICB0bXBfYml0cyA9ICgoKGRlbHRhX1RfYml0cyAqIGRGX2VkZ2VfMXN0RW52KSA+PiAoREZSQUNUX0JJVFMgLSAxOCkpICsKKyAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkxKSA+PgorICAgICAgICAgICAgICAgICAxOwogICAgICAgdXNlX2RUID0gKGhfc2JyQ29kZUVudmVsb3BlLT51cERhdGUgIT0gMCAmJiAoZGVsdGFfRl9iaXRzID4gdG1wX2JpdHMpKTsKLSAgICB9Ci0gICAgZWxzZQorICAgIH0gZWxzZQogICAgICAgdXNlX2RUID0gKGRlbHRhX1RfYml0cyA8IGRlbHRhX0ZfYml0cyAmJiBoX3NickNvZGVFbnZlbG9wZS0+dXBEYXRlICE9IDApOwogCi0gICAgaWYgKHVzZV9kVCkKLSAgICB7CisgICAgaWYgKHVzZV9kVCkgewogICAgICAgZGlyZWN0aW9uVmVjW2ldID0gVElNRTsKLSAgICAgIEZES21lbWNweSAoc2ZiX25yZywgZGVsdGFfVCwgbm9fb2ZfYmFuZHMgKiBzaXplb2YgKFNDSEFSKSk7Ci0gICAgfQotICAgIGVsc2UgeworICAgICAgRkRLbWVtY3B5KHNmYl9ucmcsIGRlbHRhX1QsIG5vX29mX2JhbmRzICogc2l6ZW9mKFNDSEFSKSk7CisgICAgfSBlbHNlIHsKICAgICAgIGhfc2JyQ29kZUVudmVsb3BlLT51cERhdGUgPSAwOwogICAgICAgZGlyZWN0aW9uVmVjW2ldID0gRlJFUTsKLSAgICAgIEZES21lbWNweSAoc2ZiX25yZywgZGVsdGFfRiwgbm9fb2ZfYmFuZHMgKiBzaXplb2YgKFNDSEFSKSk7CisgICAgICBGREttZW1jcHkoc2ZiX25yZywgZGVsdGFfRiwgbm9fb2ZfYmFuZHMgKiBzaXplb2YoU0NIQVIpKTsKICAgICB9CiAgICAgc2ZiX25yZyArPSBub19vZl9iYW5kczsKICAgICBoX3NickNvZGVFbnZlbG9wZS0+dXBEYXRlID0gMTsKICAgfQotCiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfSW5pdFNickNvZGVFbnZlbG9wZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTYxOCwxNSArNTgyLDExIEBACiAgUmV0dXJuOgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UCi1GREtzYnJFbmNfSW5pdFNickNvZGVFbnZlbG9wZSAoSEFORExFX1NCUl9DT0RFX0VOVkVMT1BFICBoX3NickNvZGVFbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgSU5UICpuU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICBJTlQgZGVsdGFUQWNyb3NzRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBkRl9lZGdlXzFzdEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgZEZfZWRnZV9pbmNyKQotewotCi0gIEZES21lbWNsZWFyKGhfc2JyQ29kZUVudmVsb3BlLHNpemVvZihTQlJfQ09ERV9FTlZFTE9QRSkpOworSU5UIEZES3NickVuY19Jbml0U2JyQ29kZUVudmVsb3BlKEhBTkRMRV9TQlJfQ09ERV9FTlZFTE9QRSBoX3NickNvZGVFbnZlbG9wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm5TZmIsIElOVCBkZWx0YVRBY3Jvc3NGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgZEZfZWRnZV8xc3RFbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgZEZfZWRnZV9pbmNyKSB7CisgIEZES21lbWNsZWFyKGhfc2JyQ29kZUVudmVsb3BlLCBzaXplb2YoU0JSX0NPREVfRU5WRUxPUEUpKTsKIAogICBoX3NickNvZGVFbnZlbG9wZS0+ZGVsdGFUQWNyb3NzRnJhbWVzID0gZGVsdGFUQWNyb3NzRnJhbWVzOwogICBoX3NickNvZGVFbnZlbG9wZS0+ZEZfZWRnZV8xc3RFbnYgPSBkRl9lZGdlXzFzdEVudjsKQEAgLTYzNSw3ICs1OTUsOCBAQAogICBoX3NickNvZGVFbnZlbG9wZS0+dXBEYXRlID0gMDsKICAgaF9zYnJDb2RlRW52ZWxvcGUtPm5TZmJbRlJFUV9SRVNfTE9XXSA9IG5TZmJbRlJFUV9SRVNfTE9XXTsKICAgaF9zYnJDb2RlRW52ZWxvcGUtPm5TZmJbRlJFUV9SRVNfSElHSF0gPSBuU2ZiW0ZSRVFfUkVTX0hJR0hdOwotICBoX3NickNvZGVFbnZlbG9wZS0+b2Zmc2V0ID0gMipoX3NickNvZGVFbnZlbG9wZS0+blNmYltGUkVRX1JFU19MT1ddIC0gaF9zYnJDb2RlRW52ZWxvcGUtPm5TZmJbRlJFUV9SRVNfSElHSF07CisgIGhfc2JyQ29kZUVudmVsb3BlLT5vZmZzZXQgPSAyICogaF9zYnJDb2RlRW52ZWxvcGUtPm5TZmJbRlJFUV9SRVNfTE9XXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3NickNvZGVFbnZlbG9wZS0+blNmYltGUkVRX1JFU19ISUdIXTsKIAogICByZXR1cm4gKDApOwogfQpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9jb2RlX2Vudi5oIGIvbGliU0JSZW5jL3NyYy9jb2RlX2Vudi5oCmluZGV4IDUwYTM2NWUuLjY3M2E3ODMgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvY29kZV9lbnYuaAorKysgYi9saWJTQlJlbmMvc3JjL2NvZGVfZW52LmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjIgKzkwLDI5IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgRFBDTSBFbnZlbG9wZSBjb2RpbmcgIAorICBcYnJpZWYgIERQQ00gRW52ZWxvcGUgY29kaW5nICRSZXZpc2lvbjogOTI3OTAgJAogKi8KIAotI2lmbmRlZiBfX0NPREVfRU5WX0gKLSNkZWZpbmUgX19DT0RFX0VOVl9ICisjaWZuZGVmIENPREVfRU5WX0gKKyNkZWZpbmUgQ09ERV9FTlZfSAogCiAjaW5jbHVkZSAic2JyX2RlZi5oIgogI2luY2x1ZGUgImJpdF9zYnIuaCIKICNpbmNsdWRlICJmcmFtX2dlbi5oIgogCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICBJTlQgb2Zmc2V0OwogICBJTlQgdXBEYXRlOwogICBJTlQgblNmYlsyXTsKQEAgLTEwNCw3ICsxMjIsNiBAQAogICBGSVhQX0RCTCBkRl9lZGdlX2luY3I7CiAgIElOVCBkRl9lZGdlX2luY3JfZmFjOwogCi0KICAgSU5UIGNvZGVCb29rU2NmTGF2VGltZTsKICAgSU5UIGNvZGVCb29rU2NmTGF2RnJlcTsKIApAQCAtMTE2LDcgKzEzMyw2IEBACiAgIElOVCBzdGFydF9iaXRzOwogICBJTlQgc3RhcnRfYml0c19iYWxhbmNlOwogCi0KICAgY29uc3QgVUNIQVIgKmh1ZmZ0YWJsZVRpbWVMOwogICBjb25zdCBVQ0hBUiAqaHVmZnRhYmxlRnJlcUw7CiAKQEAgLTEyNCwzMCArMTQwLDIyIEBACiAgIGNvbnN0IFVDSEFSICpodWZmdGFibGVCYWxhbmNlVGltZUw7CiAgIGNvbnN0IFVDSEFSICpodWZmdGFibGVMZXZlbEZyZXFMOwogICBjb25zdCBVQ0hBUiAqaHVmZnRhYmxlQmFsYW5jZUZyZXFMOwotfQotU0JSX0NPREVfRU5WRUxPUEU7Cit9IFNCUl9DT0RFX0VOVkVMT1BFOwogdHlwZWRlZiBTQlJfQ09ERV9FTlZFTE9QRSAqSEFORExFX1NCUl9DT0RFX0VOVkVMT1BFOwogCit2b2lkIEZES3NickVuY19jb2RlRW52ZWxvcGUoU0NIQVIgKnNmYl9ucmcsIGNvbnN0IEZSRVFfUkVTICpmcmVxX3JlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfQ09ERV9FTlZFTE9QRSAqaF9zYnJDb2RlRW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpkaXJlY3Rpb25WZWMsIElOVCBjb3VwbGluZywgSU5UIG5FbnZlbG9wZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNoYW5uZWwsIElOVCBoZWFkZXJBY3RpdmUpOwogCitJTlQgRkRLc2JyRW5jX0luaXRTYnJDb2RlRW52ZWxvcGUoSEFORExFX1NCUl9DT0RFX0VOVkVMT1BFIGhfc2JyQ29kZUVudmVsb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqblNmYiwgSU5UIGRlbHRhVEFjcm9zc0ZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBkRl9lZGdlXzFzdEVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBkRl9lZGdlX2luY3IpOwogCi12b2lkCi1GREtzYnJFbmNfY29kZUVudmVsb3BlIChTQ0hBUiAqc2ZiX25yZywKLSAgICAgICAgICAgICAgY29uc3QgRlJFUV9SRVMgKmZyZXFfcmVzLAotICAgICAgICAgICAgICBTQlJfQ09ERV9FTlZFTE9QRSAqIGhfc2JyQ29kZUVudmVsb3BlLAotICAgICAgICAgICAgICBJTlQgKmRpcmVjdGlvblZlYywgSU5UIGNvdXBsaW5nLCBJTlQgbkVudmVsb3BlcywgSU5UIGNoYW5uZWwsCi0gICAgICAgICAgICAgIElOVCBoZWFkZXJBY3RpdmUpOwotCi1JTlQKLUZES3NickVuY19Jbml0U2JyQ29kZUVudmVsb3BlIChIQU5ETEVfU0JSX0NPREVfRU5WRUxPUEUgaF9zYnJDb2RlRW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCAqblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgSU5UIGRlbHRhVEFjcm9zc0ZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgZEZfZWRnZV8xc3RFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGRGX2VkZ2VfaW5jcik7Ci0KLUlOVAotRkRLc2JyRW5jX0luaXRTYnJIdWZmbWFuVGFibGVzIChzdHJ1Y3QgU0JSX0VOVl9EQVRBKiAgICAgIHNickVudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DT0RFX0VOVkVMT1BFICBoZW52LAotICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ09ERV9FTlZFTE9QRSAgaG5vaXNlLAotICAgICAgICAgICAgICAgICAgICAgIEFNUF9SRVMgICAgICAgICAgICAgICAgICAgYW1wX3Jlcyk7CitJTlQgRkRLc2JyRW5jX0luaXRTYnJIdWZmbWFuVGFibGVzKHN0cnVjdCBTQlJfRU5WX0RBVEEgKnNickVudkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQ09ERV9FTlZFTE9QRSBoZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0NPREVfRU5WRUxPUEUgaG5vaXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVBfUkVTIGFtcF9yZXMpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvZW52X2JpdC5jcHAgYi9saWJTQlJlbmMvc3JjL2Vudl9iaXQuY3BwCmluZGV4IGVhMzExODMuLjQxODEyYWMgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvZW52X2JpdC5jcHAKKysrIGIvbGliU0JSZW5jL3NyYy9lbnZfYml0LmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQpAQCAtODksMTMgKzEwOCwxMiBAQAogI2luY2x1ZGUgImVudl9iaXQuaCIKICNpbmNsdWRlICJjbW9uZGF0YS5oIgogCi0KICNpZm5kZWYgbWluCi0jZGVmaW5lIG1pbihhLGIpICggYSA8IGIgPyBhOmIpCisjZGVmaW5lIG1pbihhLCBiKSAoYSA8IGIgPyBhIDogYikKICNlbmRpZgogCiAjaWZuZGVmIG1heAotI2RlZmluZSBtYXgoYSxiKSAoIGEgPiBiID8gYTpiKQorI2RlZmluZSBtYXgoYSwgYikgKGEgPiBiID8gYSA6IGIpCiAjZW5kaWYKIAogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogY3JjQWR2YW5jZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTA3LDI3ICsxMjUsMjIgQEAKICAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgY3JjIHJlZ2lzdGVyCiAgKgogICovCi1zdGF0aWMgdm9pZCBjcmNBZHZhbmNlKFVTSE9SVCBjcmNQb2x5LAotICAgICAgICAgICAgICAgICAgICAgICBVU0hPUlQgY3JjTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgVVNIT1JUICpjcmMsCi0gICAgICAgICAgICAgICAgICAgICAgIFVMT05HICAgYlZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgIGJCaXRzCi0gICAgICAgICAgICAgICAgICAgICAgKQoteworc3RhdGljIHZvaWQgY3JjQWR2YW5jZShVU0hPUlQgY3JjUG9seSwgVVNIT1JUIGNyY01hc2ssIFVTSE9SVCAqY3JjLAorICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyBiVmFsdWUsIElOVCBiQml0cykgewogICBJTlQgaTsKICAgVVNIT1JUIGZsYWc7CiAKLSAgZm9yIChpPWJCaXRzLTE7IGk+PTA7IGktLSkgewotICAgIGZsYWcgPSAoKCpjcmMpICYgY3JjTWFzaykgPyAoMSkgOiAoMCkgOwotICAgIGZsYWcgXj0gKGJWYWx1ZSAmICgxPDxpKSkgPyAoMSkgOiAoMCkgOworICBmb3IgKGkgPSBiQml0cyAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgZmxhZyA9ICgoKmNyYykgJiBjcmNNYXNrKSA/ICgxKSA6ICgwKTsKKyAgICBmbGFnIF49IChiVmFsdWUgJiAoMSA8PCBpKSkgPyAoMSkgOiAoMCk7CiAKLSAgICAoKmNyYyk8PD0xOwotICAgIGlmKGZsYWcpICgqY3JjKSBePSBjcmNQb2x5OworICAgICgqY3JjKSA8PD0gMTsKKyAgICBpZiAoZmxhZykgKCpjcmMpIF49IGNyY1BvbHk7CiAgIH0KIH0KIAotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBGREtzYnJFbmNfSW5pdFNickJpdHN0cmVhbSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRkRLc2JyRW5jX0luaXRTYnJCaXRzdHJlYW0KKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioKICAqIEBmbgogICogQGJyaWVmICAgIEluaXR0aWFsaXNhdGlvbiBvZiBzYnIgYml0c3RyZWFtLCB3cml0ZSBvZiBkdW1teSBoZWFkZXIgYW5kIENSQwpAQCAtMTM3LDM2ICsxNTAsMzUgQEAKICAqCiAgKi8KIAotSU5UICBGREtzYnJFbmNfSW5pdFNickJpdHN0cmVhbShIQU5ETEVfQ09NTU9OX0RBVEEgIGhDbW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICptZW1vcnlCYXNlLCAgICAgIC8qITwgUG9pbnRlciB0byBiaXRzdHJlYW0gYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgbWVtb3J5U2l6ZSwgICAgICAvKiE8IExlbmd0aCBvZiBiaXRzdHJlYW0gYnVmZmVyIGluIGJ5dGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQ1JDSU5GTyAgaENyY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgc2JyU3ludGF4RmxhZ3MpICAvKiE8IFNCUiBzeW50YXggZmxhZ3MgKi8KK0lOVCBGREtzYnJFbmNfSW5pdFNickJpdHN0cmVhbSgKKyAgICBIQU5ETEVfQ09NTU9OX0RBVEEgaENtb25EYXRhLAorICAgIFVDSEFSICptZW1vcnlCYXNlLCAvKiE8IFBvaW50ZXIgdG8gYml0c3RyZWFtIGJ1ZmZlciAqLworICAgIElOVCBtZW1vcnlTaXplLCAgICAvKiE8IExlbmd0aCBvZiBiaXRzdHJlYW0gYnVmZmVyIGluIGJ5dGVzICovCisgICAgSEFORExFX0ZES19DUkNJTkZPIGhDcmNJbmZvLCBVSU5UIHNiclN5bnRheEZsYWdzKSAvKiE8IFNCUiBzeW50YXggZmxhZ3MgKi8KIHsKICAgSU5UIGNyY1JlZ2lvbiA9IDA7CiAKICAgLyogcmVzZXQgYml0IGJ1ZmZlciAqLwogICBGREtyZXNldEJpdGJ1ZmZlcigmaENtb25EYXRhLT5zYnJCaXRidWYsIEJTX1dSSVRFUik7CiAKLSAgRkRLaW5pdEJpdFN0cmVhbSgmaENtb25EYXRhLT50bXBXcml0ZUJpdGJ1ZiwgbWVtb3J5QmFzZSwKLSAgICAgICAgICAgICAgICAgICBtZW1vcnlTaXplLCAwLCBCU19XUklURVIpOworICBGREtpbml0Qml0U3RyZWFtKCZoQ21vbkRhdGEtPnRtcFdyaXRlQml0YnVmLCBtZW1vcnlCYXNlLCBtZW1vcnlTaXplLCAwLAorICAgICAgICAgICAgICAgICAgIEJTX1dSSVRFUik7CiAKICAgaWYgKHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9DUkMpIHsKLSAgICBpZiAoc2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0RSTV9DUkMpCi0gICAgeyAvKiBJbml0IGFuZCBzdGFydCBDUkMgcmVnaW9uICovCi0gICAgICBGREt3cml0ZUJpdHMgKCZoQ21vbkRhdGEtPnNickJpdGJ1ZiwgMHgwLCBTSV9TQlJfRFJNX0NSQ19CSVRTKTsKLSAgICAgIEZES2NyY0luaXQoIGhDcmNJbmZvLCAweDAwMWQsIDB4RkZGRiwgU0lfU0JSX0RSTV9DUkNfQklUUyApOwotICAgICAgY3JjUmVnaW9uID0gRkRLY3JjU3RhcnRSZWcoIGhDcmNJbmZvLCAmaENtb25EYXRhLT5zYnJCaXRidWYsIDAgKTsKKyAgICBpZiAoc2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0RSTV9DUkMpIHsgLyogSW5pdCBhbmQgc3RhcnQgQ1JDIHJlZ2lvbiAqLworICAgICAgRkRLd3JpdGVCaXRzKCZoQ21vbkRhdGEtPnNickJpdGJ1ZiwgMHgwLCBTSV9TQlJfRFJNX0NSQ19CSVRTKTsKKyAgICAgIEZES2NyY0luaXQoaENyY0luZm8sIDB4MDAxZCwgMHhGRkZGLCBTSV9TQlJfRFJNX0NSQ19CSVRTKTsKKyAgICAgIGNyY1JlZ2lvbiA9IEZES2NyY1N0YXJ0UmVnKGhDcmNJbmZvLCAmaENtb25EYXRhLT5zYnJCaXRidWYsIDApOwogICAgIH0gZWxzZSB7Ci0gICAgICBGREt3cml0ZUJpdHMgKCZoQ21vbkRhdGEtPnNickJpdGJ1ZiwgMHgwLCBTSV9TQlJfQ1JDX0JJVFMpOworICAgICAgRkRLd3JpdGVCaXRzKCZoQ21vbkRhdGEtPnNickJpdGJ1ZiwgMHgwLCBTSV9TQlJfQ1JDX0JJVFMpOwogICAgIH0KICAgfQogCiAgIHJldHVybiAoY3JjUmVnaW9uKTsKIH0KIAotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKiBGREtzYnJFbmNfQXNzZW1ibGVTYnJCaXRzdHJlYW0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqIEZES3NickVuY19Bc3NlbWJsZVNickJpdHN0cmVhbQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKgogICogQGZuCiAgKiBAYnJpZWYgICAgRm9ybWF0cyB0aGUgU0JSIHBheWxvYWQKQEAgLTE3Niw0OCArMTg4LDQzIEBACiAgKgogICovCiAKLXZvaWQKLUZES3NickVuY19Bc3NlbWJsZVNickJpdHN0cmVhbSggSEFORExFX0NPTU1PTl9EQVRBICBoQ21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQ1JDSU5GTyAgaENyY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgY3JjUmVnaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKQotewotICBVU0hPUlQgY3JjUmVnID0gIFNCUl9DUkNJTklUOwotICBJTlQgbnVtQ3JjQml0cyxpOwordm9pZCBGREtzYnJFbmNfQXNzZW1ibGVTYnJCaXRzdHJlYW0oSEFORExFX0NPTU1PTl9EQVRBIGhDbW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQ1JDSU5GTyBoQ3JjSW5mbywgSU5UIGNyY1JlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc2JyU3ludGF4RmxhZ3MpIHsKKyAgVVNIT1JUIGNyY1JlZyA9IFNCUl9DUkNJTklUOworICBJTlQgbnVtQ3JjQml0cywgaTsKIAogICAvKiBjaGVjayBpZiBTQlIgaXMgcHJlc2VudCAqLwotICBpZiAoIGhDbW9uRGF0YT09TlVMTCApCi0gICAgcmV0dXJuOworICBpZiAoaENtb25EYXRhID09IE5VTEwpIHJldHVybjsKIAogICBoQ21vbkRhdGEtPnNickZpbGxCaXRzID0gMDsgLyogRmlsbCBiaXRzIGFyZSB3cml0dGVuIG9ubHkgZm9yIEdBIHN0cmVhbXMgKi8KIAotICBpZiAoIHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9EUk1fQ1JDICkKLSAgeworICBpZiAoc2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0RSTV9DUkMpIHsKICAgICAvKgogICAgICAqIENhbGN1bGF0ZSBhbmQgd3JpdGUgRFJNIENSQwogICAgICAqLwotICAgIEZES2NyY0VuZFJlZyggaENyY0luZm8sICZoQ21vbkRhdGEtPnNickJpdGJ1ZiwgY3JjUmVnaW9uICk7Ci0gICAgRkRLd3JpdGVCaXRzKCAmaENtb25EYXRhLT50bXBXcml0ZUJpdGJ1ZiwgRkRLY3JjR2V0Q1JDKGhDcmNJbmZvKV4weEZGLCBTSV9TQlJfRFJNX0NSQ19CSVRTICk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgaWYgKCAhKHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpICkKLSAgICB7Ci0gICAgICAvKiBEbyBhbGlnbm1lbnQgaGVyZSwgYmVjYXVzZSBpdHMgZGVmaW5lZCBhcyBwYXJ0IG9mIHRoZSBzYnJfZXh0ZW5zaW9uX2RhdGEgKi8KKyAgICBGREtjcmNFbmRSZWcoaENyY0luZm8sICZoQ21vbkRhdGEtPnNickJpdGJ1ZiwgY3JjUmVnaW9uKTsKKyAgICBGREt3cml0ZUJpdHMoJmhDbW9uRGF0YS0+dG1wV3JpdGVCaXRidWYsIEZES2NyY0dldENSQyhoQ3JjSW5mbykgXiAweEZGLAorICAgICAgICAgICAgICAgICBTSV9TQlJfRFJNX0NSQ19CSVRTKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIShzYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKSkgeworICAgICAgLyogRG8gYWxpZ25tZW50IGhlcmUsIGJlY2F1c2UgaXRzIGRlZmluZWQgYXMgcGFydCBvZiB0aGUKKyAgICAgICAqIHNicl9leHRlbnNpb25fZGF0YSAqLwogICAgICAgaW50IHNickxvYWQgPSBoQ21vbkRhdGEtPnNickhkckJpdHMgKyBoQ21vbkRhdGEtPnNickRhdGFCaXRzOwogCi0gICAgICBpZiAoIHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9DUkMgKSB7CisgICAgICBpZiAoc2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0NSQykgewogICAgICAgICBzYnJMb2FkICs9IFNJX1NCUl9DUkNfQklUUzsKICAgICAgIH0KIAotICAgICAgc2JyTG9hZCArPSA0OyAgICAgICAgIC8qIERvIGJ5dGUgQWxpZ24gd2l0aCA0IGJpdCBvZmZzZXQuIElTTy9JRUMgMTQ0OTYtMzoyMDA1KEUpIHBhZ2UgMzkuICovCisgICAgICBzYnJMb2FkICs9IDQ7IC8qIERvIGJ5dGUgQWxpZ24gd2l0aCA0IGJpdCBvZmZzZXQuIElTTy9JRUMgMTQ0OTYtMzoyMDA1KEUpCisgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgMzkuICovCiAKICAgICAgIGhDbW9uRGF0YS0+c2JyRmlsbEJpdHMgPSAoOCAtIChzYnJMb2FkICUgOCkpICUgODsKIAogICAgICAgLyoKICAgICAgICAgYXBwZW5kIGZpbGwgYml0cwogICAgICAgKi8KLSAgICAgIEZES3dyaXRlQml0cygmaENtb25EYXRhLT5zYnJCaXRidWYsIDAsICBoQ21vbkRhdGEtPnNickZpbGxCaXRzICk7CisgICAgICBGREt3cml0ZUJpdHMoJmhDbW9uRGF0YS0+c2JyQml0YnVmLCAwLCBoQ21vbkRhdGEtPnNickZpbGxCaXRzKTsKIAogICAgICAgRkRLX0FTU0VSVChGREtnZXRWYWxpZEJpdHMoJmhDbW9uRGF0YS0+c2JyQml0YnVmKSAlIDggPT0gNCk7CiAgICAgfQpAQCAtMjI1LDI2ICsyMzIsMjYgQEAKICAgICAvKgogICAgICAgY2FsY3VsYXRlIGNyYwogICAgICovCi0gICAgaWYgKCBzYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfQ1JDICkgewotICAgICAgRkRLX0JJVFNUUkVBTSAgdG1wQ1JDQnVmID0gaENtb25EYXRhLT5zYnJCaXRidWY7Ci0gICAgICBGREtyZXNldEJpdGJ1ZmZlciggJnRtcENSQ0J1ZiwgQlNfUkVBREVSICk7CisgICAgaWYgKHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9DUkMpIHsKKyAgICAgIEZES19CSVRTVFJFQU0gdG1wQ1JDQnVmID0gaENtb25EYXRhLT5zYnJCaXRidWY7CisgICAgICBGREtyZXNldEJpdGJ1ZmZlcigmdG1wQ1JDQnVmLCBCU19SRUFERVIpOwogCi0gICAgICBudW1DcmNCaXRzID0gaENtb25EYXRhLT5zYnJIZHJCaXRzICsgaENtb25EYXRhLT5zYnJEYXRhQml0cyArIGhDbW9uRGF0YS0+c2JyRmlsbEJpdHM7CisgICAgICBudW1DcmNCaXRzID0gaENtb25EYXRhLT5zYnJIZHJCaXRzICsgaENtb25EYXRhLT5zYnJEYXRhQml0cyArCisgICAgICAgICAgICAgICAgICAgaENtb25EYXRhLT5zYnJGaWxsQml0czsKIAotICAgICAgZm9yKGk9MDtpPG51bUNyY0JpdHM7aSsrKXsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1DcmNCaXRzOyBpKyspIHsKICAgICAgICAgSU5UIGJpdDsKLSAgICAgICAgYml0ID0gRkRLcmVhZEJpdHMoJnRtcENSQ0J1ZiwxKTsKLSAgICAgICAgY3JjQWR2YW5jZShTQlJfQ1JDX1BPTFksU0JSX0NSQ19NQVNLLCZjcmNSZWcsYml0LDEpOworICAgICAgICBiaXQgPSBGREtyZWFkQml0cygmdG1wQ1JDQnVmLCAxKTsKKyAgICAgICAgY3JjQWR2YW5jZShTQlJfQ1JDX1BPTFksIFNCUl9DUkNfTUFTSywgJmNyY1JlZywgYml0LCAxKTsKICAgICAgIH0KICAgICAgIGNyY1JlZyAmPSAoU0JSX0NSQ19SQU5HRSk7CiAKICAgICAgIC8qCiAgICAgICAgKiBXcml0ZSBDUkMgZGF0YS4KICAgICAgICAqLwotICAgICAgRkRLd3JpdGVCaXRzICgmaENtb25EYXRhLT50bXBXcml0ZUJpdGJ1ZiwgY3JjUmVnLCBTSV9TQlJfQ1JDX0JJVFMpOworICAgICAgRkRLd3JpdGVCaXRzKCZoQ21vbkRhdGEtPnRtcFdyaXRlQml0YnVmLCBjcmNSZWcsIFNJX1NCUl9DUkNfQklUUyk7CiAgICAgfQogICB9CiAKICAgRkRLc3luY0NhY2hlKCZoQ21vbkRhdGEtPnRtcFdyaXRlQml0YnVmKTsKIH0KLQpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9lbnZfYml0LmggYi9saWJTQlJlbmMvc3JjL2Vudl9iaXQuaAppbmRleCAwMzhhMzJhLi5iOTE4MDJjIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL2Vudl9iaXQuaAorKysgYi9saWJTQlJlbmMvc3JjL2Vudl9iaXQuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw0OCArOTAsNDYgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKICAgXGJyaWVmICBSZW1haW5pbmcgU0JSIEJpdCBXcml0aW5nIFJvdXRpbmVzCiAqLwogCi0jaWZuZGVmIEJJVF9FTlZfSAotI2RlZmluZSBCSVRfRU5WX0gKKyNpZm5kZWYgRU5WX0JJVF9ICisjZGVmaW5lIEVOVl9CSVRfSAogCiAjaW5jbHVkZSAic2JyX2VuY29kZXIuaCIKICNpbmNsdWRlICJGREtfY3JjLmgiCiAKIC8qIEcoeCkgPSB4XjEwICsgeF45ICsgeF41ICsgeF40ICsgeCArIDEgKi8KLSNkZWZpbmUgU0JSX0NSQ19QT0xZICAgICAoMHgwMjMzKQotI2RlZmluZSBTQlJfQ1JDX01BU0sgICAgICgweDAyMDApCi0jZGVmaW5lIFNCUl9DUkNfUkFOR0UgICAgKDB4MDNGRikKLSNkZWZpbmUgU0JSX0NSQ19NQVhSRUdTICAgICAxCi0jZGVmaW5lIFNCUl9DUkNJTklUICAgICAgKDB4MCkKKyNkZWZpbmUgU0JSX0NSQ19QT0xZICgweDAyMzMpCisjZGVmaW5lIFNCUl9DUkNfTUFTSyAoMHgwMjAwKQorI2RlZmluZSBTQlJfQ1JDX1JBTkdFICgweDAzRkYpCisjZGVmaW5lIFNCUl9DUkNfTUFYUkVHUyAxCisjZGVmaW5lIFNCUl9DUkNJTklUICgweDApCiAKLQotI2RlZmluZSBTSV9TQlJfQ1JDX0VOQUJMRV9CSVRTICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBTSV9TQlJfQ1JDX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAxMAotI2RlZmluZSBTSV9TQlJfRFJNX0NSQ19CSVRTICAgICAgICAgICAgICAgICAgICAgOAotCisjZGVmaW5lIFNJX1NCUl9DUkNfRU5BQkxFX0JJVFMgMAorI2RlZmluZSBTSV9TQlJfQ1JDX0JJVFMgMTAKKyNkZWZpbmUgU0lfU0JSX0RSTV9DUkNfQklUUyA4CiAKIHN0cnVjdCBDT01NT05fREFUQTsKIAotSU5UIEZES3NickVuY19Jbml0U2JyQml0c3RyZWFtKHN0cnVjdCBDT01NT05fREFUQSAgKmhDbW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICptZW1vcnlCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgIG1lbW9yeVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19DUkNJTkZPICAgaENyY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgc2JyU3ludGF4RmxhZ3MpOworSU5UIEZES3NickVuY19Jbml0U2JyQml0c3RyZWFtKHN0cnVjdCBDT01NT05fREFUQSAqaENtb25EYXRhLCBVQ0hBUiAqbWVtb3J5QmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWVtb3J5U2l6ZSwgSEFORExFX0ZES19DUkNJTkZPIGhDcmNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc2JyU3ludGF4RmxhZ3MpOwogCi12b2lkCi1GREtzYnJFbmNfQXNzZW1ibGVTYnJCaXRzdHJlYW0gKHN0cnVjdCBDT01NT05fREFUQSAgKmhDbW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19DUkNJTkZPICAgaENyY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgIGNyY1JlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgc2JyU3ludGF4RmxhZ3MpOwordm9pZCBGREtzYnJFbmNfQXNzZW1ibGVTYnJCaXRzdHJlYW0oc3RydWN0IENPTU1PTl9EQVRBICpoQ21vbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0NSQ0lORk8gaENyY0luZm8sIElOVCBjcmNSZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHNiclN5bnRheEZsYWdzKTsKIAotCi0KLQotCi0jZW5kaWYgLyogI2lmbmRlZiBCSVRfRU5WX0ggKi8KKyNlbmRpZiAvKiAjaWZuZGVmIEVOVl9CSVRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9lbnZfZXN0LmNwcCBiL2xpYlNCUmVuYy9zcmMvZW52X2VzdC5jcHAKaW5kZXggNGZjZGE1MS4uMGViODQyNSAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9lbnZfZXN0LmNwcAorKysgYi9saWJTQlJlbmMvc3JjL2Vudl9lc3QuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDcgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImVudl9lc3QuaCIKICNpbmNsdWRlICJ0cmFuX2RldC5oIgpAQCAtODksMjAgKzEwOCwxOCBAQAogI2luY2x1ZGUgImZyYW1fZ2VuLmgiCiAjaW5jbHVkZSAiYml0X3Nici5oIgogI2luY2x1ZGUgImNtb25kYXRhLmgiCi0jaW5jbHVkZSAic2JyX3JhbS5oIgotCisjaW5jbHVkZSAic2JyZW5jX3JhbS5oIgogCiAjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKIAogI2RlZmluZSBRVUFOVF9FUlJPUl9USFJFUyAyMDAKICNkZWZpbmUgWV9OUkdfU0NBTEUgNSAvKiBub0NvbHMgPSAzMiAtPiBzaGlmdCg1KSAqLworI2RlZmluZSBNQVhfTlJHX1NMT1RTX0xEIDE2CiAKLQotc3RhdGljIGNvbnN0IFVDSEFSIHBhblRhYmxlWzJdWzEwXSA9IHsgeyAwLCAyLCA0LCA2LCA4LDEyLDE2LDIwLDI0fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMCwgMiwgNCwgOCwxMiwgMCwgMCwgMCwgMCB9IH07CitzdGF0aWMgY29uc3QgVUNIQVIgcGFuVGFibGVbMl1bMTBdID0ge3swLCAyLCA0LCA2LCA4LCAxMiwgMTYsIDIwLCAyNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAyLCA0LCA4LCAxMiwgMCwgMCwgMCwgMH19Owogc3RhdGljIGNvbnN0IFVDSEFSIG1heEluZGV4WzJdID0gezksIDV9OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfR2V0VG9uYWxpdHkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEyNCw2NCArMTQxLDY0IEBACiAgICAgICAgICAgICAgIHNjYWxlZCBieSAyXihSRUxBWEFUSU9OX1NISUZUKzIpKlJFTEFYQVRJT05fRlJBQ1QKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBGSVhQX0RCTCBGREtzYnJFbmNfR2V0VG9uYWxpdHkoCi0gICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAqcXVvdGFNYXRyaXgsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgbm9Fc3RQZXJGcmFtZSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICBzdGFydEluZGV4LAotICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgKkVuZXJnaWVzLAotICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICAgIHN0YXJ0QmFuZCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICBzdG9wQmFuZCwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICBudW1iZXJDb2xzCi0gICAgICAgICkKLXsKK3N0YXRpYyBGSVhQX0RCTCBGREtzYnJFbmNfR2V0VG9uYWxpdHkoY29uc3QgRklYUF9EQkwgKmNvbnN0ICpxdW90YU1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5vRXN0UGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzdGFydEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgKkVuZXJnaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBzdGFydEJhbmQsIGNvbnN0IElOVCBzdG9wQmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG51bWJlckNvbHMpIHsKICAgVUNIQVIgYiwgZSwgazsKLSAgSU5UICAgICAgbm9fZW5NYXhCYW5kW1NCUl9NQVhfRU5FUkdZX1ZBTFVFU10gPSB7IC0xLCAtMSwgLTEsIC0xLCAtMSB9OwotICBGSVhQX0RCTCBlbmVyZ3lNYXhbU0JSX01BWF9FTkVSR1lfVkFMVUVTXSA9IHsgRkwyRlhDT05TVF9EQkwoMC4wZiksIEZMMkZYQ09OU1RfREJMKDAuMGYpLCBGTDJGWENPTlNUX0RCTCgwLjBmKSwgRkwyRlhDT05TVF9EQkwoMC4wZiksIEZMMkZYQ09OU1RfREJMKDAuMGYpIH07CisgIElOVCBub19lbk1heEJhbmRbU0JSX01BWF9FTkVSR1lfVkFMVUVTXSA9IHstMSwgLTEsIC0xLCAtMSwgLTF9OworICBGSVhQX0RCTCBlbmVyZ3lNYXhbU0JSX01BWF9FTkVSR1lfVkFMVUVTXSA9IHsKKyAgICAgIEZMMkZYQ09OU1RfREJMKDAuMGYpLCBGTDJGWENPTlNUX0RCTCgwLjBmKSwgRkwyRlhDT05TVF9EQkwoMC4wZiksCisgICAgICBGTDJGWENPTlNUX0RCTCgwLjBmKSwgRkwyRlhDT05TVF9EQkwoMC4wZil9OwogICBGSVhQX0RCTCBlbmVyZ3lNYXhNaW4gPSBNQVhWQUxfREJMOyAvKiBtaW4uIGVuZXJneSBpbiBlbmVyZ3lNYXggYXJyYXkgKi8KLSAgVUNIQVIgICAgcG9zRW5lcmd5TWF4TWluID0gMDsgICAgICAgLyogbWluLiBlbmVyZ3kgaW4gZW5lcmd5TWF4IGFycmF5IHBvc2l0aW9uICovCi0gIEZJWFBfREJMIHRvbmFsaXR5QmFuZFtTQlJfTUFYX0VORVJHWV9WQUxVRVNdID0geyBGTDJGWENPTlNUX0RCTCgwLjBmKSwgRkwyRlhDT05TVF9EQkwoMC4wZiksIEZMMkZYQ09OU1RfREJMKDAuMGYpLCBGTDJGWENPTlNUX0RCTCgwLjBmKSwgRkwyRlhDT05TVF9EQkwoMC4wZikgfTsKKyAgVUNIQVIgcG9zRW5lcmd5TWF4TWluID0gMDsgLyogbWluLiBlbmVyZ3kgaW4gZW5lcmd5TWF4IGFycmF5IHBvc2l0aW9uICovCisgIEZJWFBfREJMIHRvbmFsaXR5QmFuZFtTQlJfTUFYX0VORVJHWV9WQUxVRVNdID0geworICAgICAgRkwyRlhDT05TVF9EQkwoMC4wZiksIEZMMkZYQ09OU1RfREJMKDAuMGYpLCBGTDJGWENPTlNUX0RCTCgwLjBmKSwKKyAgICAgIEZMMkZYQ09OU1RfREJMKDAuMGYpLCBGTDJGWENPTlNUX0RCTCgwLjBmKX07CiAgIEZJWFBfREJMIGdsb2JhbFRvbmFsaXR5ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gIEZJWFBfREJMIGVuZXJneUJhbmRbUU1GX0NIQU5ORUxTXTsKLSAgSU5UICAgICAgbWF4TkVuZXJneVZhbHVlczsgLyogbWF4LiBudW1iZXIgb2YgbWF4LiBlbmVyZ3kgdmFsdWVzICovCisgIEZJWFBfREJMIGVuZXJneUJhbmRbNjRdOworICBJTlQgbWF4TkVuZXJneVZhbHVlczsgLyogbWF4LiBudW1iZXIgb2YgbWF4LiBlbmVyZ3kgdmFsdWVzICovCiAKICAgLyoqKiBTdW0gdXAgZW5lcmdpZXMgZm9yIGVhY2ggYmFuZCAqKiovCi0gIEZES19BU1NFUlQobnVtYmVyQ29scz09MTV8fG51bWJlckNvbHM9PTE2KTsKKyAgRkRLX0FTU0VSVChudW1iZXJDb2xzID09IDE1IHx8IG51bWJlckNvbHMgPT0gMTYpOwogICAvKiBudW1iZXJDb2xzIGlzIGFsd2F5cyAxNSBvciAxNiBmb3IgRUxELiBJbiBjYXNlIG9mIDE2IGJhbmRzLCB0aGUKICAgICAgIGVuZXJneUJhbmRzIGFyZSBpbml0aWFsaXplZCB3aXRoIHRoZSBbMTVddGggY29sdW1uLgogICAgICAgVGhlIHJlc3Qgb2YgdGhlIGNvbHVtbiBlbmVyZ2llcyBhcmUgYWRkZWQgaW4gdGhlIG5leHQgc3RlcC4gICAqLwotICBpZiAobnVtYmVyQ29scz09MTUpIHsKLSAgICBmb3IgKGI9c3RhcnRCYW5kOyBiPHN0b3BCYW5kOyBiKyspIHsKLSAgICAgIGVuZXJneUJhbmRbYl09RkwyRlhDT05TVF9EQkwoMC4wZik7CisgIGlmIChudW1iZXJDb2xzID09IDE1KSB7CisgICAgZm9yIChiID0gc3RhcnRCYW5kOyBiIDwgc3RvcEJhbmQ7IGIrKykgeworICAgICAgZW5lcmd5QmFuZFtiXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBmb3IgKGI9c3RhcnRCYW5kOyBiPHN0b3BCYW5kOyBiKyspIHsKLSAgICAgIGVuZXJneUJhbmRbYl09RW5lcmdpZXNbMTVdW2JdPj40OworICAgIGZvciAoYiA9IHN0YXJ0QmFuZDsgYiA8IHN0b3BCYW5kOyBiKyspIHsKKyAgICAgIGVuZXJneUJhbmRbYl0gPSBFbmVyZ2llc1sxNV1bYl0gPj4gNDsKICAgICB9CiAgIH0KIAotICBmb3IgKGs9MDsgazwxNTsgaysrKSB7Ci0gICAgZm9yIChiPXN0YXJ0QmFuZDsgYjxzdG9wQmFuZDsgYisrKSB7Ci0gICAgICBlbmVyZ3lCYW5kW2JdICs9IEVuZXJnaWVzW2tdW2JdPj40OworICBmb3IgKGsgPSAwOyBrIDwgMTU7IGsrKykgeworICAgIGZvciAoYiA9IHN0YXJ0QmFuZDsgYiA8IHN0b3BCYW5kOyBiKyspIHsKKyAgICAgIGVuZXJneUJhbmRbYl0gKz0gRW5lcmdpZXNba11bYl0gPj4gNDsKICAgICB9CiAgIH0KIAogICAvKioqIERldGVybWluZSA1IGhpZ2hlc3QgYmFuZC1lbmVyZ2llcyAqKiovCi0gIG1heE5FbmVyZ3lWYWx1ZXMgPSBmTWluKFNCUl9NQVhfRU5FUkdZX1ZBTFVFUywgc3RvcEJhbmQtc3RhcnRCYW5kKTsKKyAgbWF4TkVuZXJneVZhbHVlcyA9IGZNaW4oU0JSX01BWF9FTkVSR1lfVkFMVUVTLCBzdG9wQmFuZCAtIHN0YXJ0QmFuZCk7CiAKICAgLyogR2V0IG1pbi4gdmFsdWUgaW4gZW5lcmd5TWF4IGFycmF5ICovCiAgIGVuZXJneU1heE1pbiA9IGVuZXJneU1heFswXSA9IGVuZXJneUJhbmRbc3RhcnRCYW5kXTsKICAgbm9fZW5NYXhCYW5kWzBdID0gc3RhcnRCYW5kOwogICBwb3NFbmVyZ3lNYXhNaW4gPSAwOwotICBmb3IgKGs9MTsgazxtYXhORW5lcmd5VmFsdWVzOyBrKyspIHsKLSAgICBlbmVyZ3lNYXhba10gPSBlbmVyZ3lCYW5kW3N0YXJ0QmFuZCtrXTsKLSAgICBub19lbk1heEJhbmRba10gPSBzdGFydEJhbmQrazsKKyAgZm9yIChrID0gMTsgayA8IG1heE5FbmVyZ3lWYWx1ZXM7IGsrKykgeworICAgIGVuZXJneU1heFtrXSA9IGVuZXJneUJhbmRbc3RhcnRCYW5kICsga107CisgICAgbm9fZW5NYXhCYW5kW2tdID0gc3RhcnRCYW5kICsgazsKICAgICBpZiAoZW5lcmd5TWF4TWluID4gZW5lcmd5TWF4W2tdKSB7CiAgICAgICBlbmVyZ3lNYXhNaW4gPSBlbmVyZ3lNYXhba107CiAgICAgICBwb3NFbmVyZ3lNYXhNaW4gPSBrOwogICAgIH0KICAgfQogCi0gIGZvciAoYj1zdGFydEJhbmQrbWF4TkVuZXJneVZhbHVlczsgYjxzdG9wQmFuZDsgYisrKSB7CisgIGZvciAoYiA9IHN0YXJ0QmFuZCArIG1heE5FbmVyZ3lWYWx1ZXM7IGIgPCBzdG9wQmFuZDsgYisrKSB7CiAgICAgaWYgKGVuZXJneUJhbmRbYl0gPiBlbmVyZ3lNYXhNaW4pIHsKICAgICAgIGVuZXJneU1heFtwb3NFbmVyZ3lNYXhNaW5dID0gZW5lcmd5QmFuZFtiXTsKICAgICAgIG5vX2VuTWF4QmFuZFtwb3NFbmVyZ3lNYXhNaW5dID0gYjsKQEAgLTE4OSw3ICsyMDYsNyBAQAogICAgICAgLyogQWdhaW4sIGdldCBtaW4uIHZhbHVlIGluIGVuZXJneU1heCBhcnJheSAqLwogICAgICAgZW5lcmd5TWF4TWluID0gZW5lcmd5TWF4WzBdOwogICAgICAgcG9zRW5lcmd5TWF4TWluID0gMDsKLSAgICAgIGZvciAoaz0xOyBrPG1heE5FbmVyZ3lWYWx1ZXM7IGsrKykgeworICAgICAgZm9yIChrID0gMTsgayA8IG1heE5FbmVyZ3lWYWx1ZXM7IGsrKykgewogICAgICAgICBpZiAoZW5lcmd5TWF4TWluID4gZW5lcmd5TWF4W2tdKSB7CiAgICAgICAgICAgZW5lcmd5TWF4TWluID0gZW5lcmd5TWF4W2tdOwogICAgICAgICAgIHBvc0VuZXJneU1heE1pbiA9IGs7CkBAIC0yMDAsMTIgKzIxNywxMyBAQAogICAvKioqIEVuZCBkZXRlcm1pbmUgNSBoaWdoZXN0IGJhbmQtZW5lcmdpZXMgKioqLwogCiAgIC8qIEdldCB0b25hbGl0eSB2YWx1ZXMgZm9yIDUgaGlnaGVzdCBlbmVyZ2llcyAqLwotICBmb3IgKGU9MDsgZTxtYXhORW5lcmd5VmFsdWVzOyBlKyspIHsKLSAgICB0b25hbGl0eUJhbmRbZV09RkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgZm9yIChrPTA7IGs8bm9Fc3RQZXJGcmFtZTsgaysrKSB7CisgIGZvciAoZSA9IDA7IGUgPCBtYXhORW5lcmd5VmFsdWVzOyBlKyspIHsKKyAgICB0b25hbGl0eUJhbmRbZV0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICBmb3IgKGsgPSAwOyBrIDwgbm9Fc3RQZXJGcmFtZTsgaysrKSB7CiAgICAgICB0b25hbGl0eUJhbmRbZV0gKz0gcXVvdGFNYXRyaXhbc3RhcnRJbmRleCArIGtdW25vX2VuTWF4QmFuZFtlXV0gPj4gMTsKICAgICB9Ci0gICAgZ2xvYmFsVG9uYWxpdHkgKz0gdG9uYWxpdHlCYW5kW2VdID4+IDI7IC8qIGhlYWRyb29tIG9mIDIrMSAobWF4LiA1IGFkZGl0aW9ucykgKi8KKyAgICBnbG9iYWxUb25hbGl0eSArPQorICAgICAgICB0b25hbGl0eUJhbmRbZV0gPj4gMjsgLyogaGVhZHJvb20gb2YgMisxIChtYXguIDUgYWRkaXRpb25zKSAqLwogICB9CiAKICAgcmV0dXJuIGdsb2JhbFRvbmFsaXR5OwpAQCAtMjIxLDM0ICsyMzksMzYgQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIExOS19TRUNUSU9OX0NPREVfTDEKLXN0YXRpYyB2b2lkCi1GREtzYnJFbmNfZ2V0RW5lcmd5RnJvbUNwbHhRbWZEYXRhKEZJWFBfREJMICoqUkVTVFJJQ1QgZW5lcmd5VmFsdWVzLC8qITwgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqUkVTVFJJQ1QgcmVhbFZhbHVlcywgIC8qITwgdGhlIHJlYWwgcGFydCBvZiB0aGUgUU1GIHN1YnNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipSRVNUUklDVCBpbWFnVmFsdWVzLCAgLyohPCB0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgdGhlIFFNRiBzdWJzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIG51bWJlckJhbmRzLCAgICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIFFNRiBiYW5kcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBudW1iZXJDb2xzLCAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBRTUYgc3Vic2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAqcW1mU2NhbGUsICAgICAgICAgICAgICAgICAvKiE8IHNjbGVmYWN0b3Igb2YgUU1GIHN1YnNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgKmVuZXJneVNjYWxlKSAgICAgICAgICAgICAgLyohPCBzY2FsZWZhY3RvciBvZiBlbmVyZ2llcyAqLworc3RhdGljIHZvaWQgRkRLc2JyRW5jX2dldEVuZXJneUZyb21DcGx4UW1mRGF0YSgKKyAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIGVuZXJneVZhbHVlcywgLyohPCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gKi8KKyAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIHJlYWxWYWx1ZXMsIC8qITwgdGhlIHJlYWwgcGFydCBvZiB0aGUgUU1GIHN1YnNhbXBsZXMgKi8KKyAgICBGSVhQX0RCTCAqKlJFU1RSSUNUCisgICAgICAgIGltYWdWYWx1ZXMsICAgLyohPCB0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgdGhlIFFNRiBzdWJzYW1wbGVzICovCisgICAgSU5UIG51bWJlckJhbmRzLCAgLyohPCBudW1iZXIgb2YgUU1GIGJhbmRzICovCisgICAgSU5UIG51bWJlckNvbHMsICAgLyohPCBudW1iZXIgb2YgUU1GIHN1YnNhbXBsZXMgKi8KKyAgICBJTlQgKnFtZlNjYWxlLCAgICAvKiE8IHNjbGVmYWN0b3Igb2YgUU1GIHN1YnNhbXBsZXMgKi8KKyAgICBJTlQgKmVuZXJneVNjYWxlKSAvKiE8IHNjYWxlZmFjdG9yIG9mIGVuZXJnaWVzICovCiB7CiAgIGludCBqLCBrOwogICBpbnQgc2NhbGU7CiAgIEZJWFBfREJMIG1heF92YWwgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKIAogICAvKiBHZXQgU2NyYXRjaCBidWZmZXIgKi8KLSAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHRtcE5yZywgRklYUF9EQkwsIFFNRl9DSEFOTkVMUypRTUZfTUFYX1RJTUVfU0xPVFMvMik7CisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVCh0bXBOcmcsIEZJWFBfREJMLCAzMiAqIDY0IC8gMikKIAogICAvKiBHZXQgbWF4IHBvc3NpYmxlIHNjYWxpbmcgb2YgUU1GIGRhdGEgKi8KICAgc2NhbGUgPSBERlJBQ1RfQklUUzsKLSAgZm9yIChrPTA7IGs8bnVtYmVyQ29sczsgaysrKSB7Ci0gICAgc2NhbGUgPSBmaXhNaW4oc2NhbGUsIGZpeE1pbihnZXRTY2FsZWZhY3RvcihyZWFsVmFsdWVzW2tdLCBudW1iZXJCYW5kcyksIGdldFNjYWxlZmFjdG9yKGltYWdWYWx1ZXNba10sIG51bWJlckJhbmRzKSkpOworICBmb3IgKGsgPSAwOyBrIDwgbnVtYmVyQ29sczsgaysrKSB7CisgICAgc2NhbGUgPSBmaXhNaW4oc2NhbGUsIGZpeE1pbihnZXRTY2FsZWZhY3RvcihyZWFsVmFsdWVzW2tdLCBudW1iZXJCYW5kcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTY2FsZWZhY3RvcihpbWFnVmFsdWVzW2tdLCBudW1iZXJCYW5kcykpKTsKICAgfQogCiAgIC8qIFR3ZWFrIHNjYWxpbmcgc3RhYmlsaXR5IGZvciB6ZXJvIHNpZ25hbCB0byBub24temVybyBzaWduYWwgdHJhbnNpdGlvbnMgKi8KLSAgaWYgKHNjYWxlID49IERGUkFDVF9CSVRTLTEpIHsKLSAgICBzY2FsZSA9IChGUkFDVF9CSVRTLTEtKnFtZlNjYWxlKTsKKyAgaWYgKHNjYWxlID49IERGUkFDVF9CSVRTIC0gMSkgeworICAgIHNjYWxlID0gKEZSQUNUX0JJVFMgLSAxIC0gKnFtZlNjYWxlKTsKICAgfQotICAvKiBwcmV2ZW50IHNjYWxpbmcgb2YgUUZNIHZhbHVlcyB0byAtMS5mICovCi0gIHNjYWxlID0gZml4TWF4KDAsc2NhbGUtMSk7CisgIC8qIHByZXZlbnQgc2NhbGluZyBvZiBRTUYgdmFsdWVzIHRvIC0xLmYgKi8KKyAgc2NhbGUgPSBmaXhNYXgoMCwgc2NhbGUgLSAxKTsKIAogICAvKiBVcGRhdGUgUU1GIHNjYWxlICovCiAgICpxbWZTY2FsZSArPSBzY2FsZTsKQEAgLTI1OSwyMiArMjc5LDIzIEBACiAgICAqLwogICB7CiAgICAgRklYUF9EQkwgKm5yZ1ZhbHVlcyA9IHRtcE5yZzsKLSAgICBmb3IgKGs9MDsgazxudW1iZXJDb2xzOyBrKz0yKQotICAgIHsKKyAgICBmb3IgKGsgPSAwOyBrIDwgbnVtYmVyQ29sczsgayArPSAyKSB7CiAgICAgICAvKiBMb2FkIGJhbmQgdmVjdG9yIGFkZHJlc3NlcyBvZiAyIGNvbnNlY3V0aXZlIHRpbWVzbG90cyAqLwogICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHIwID0gcmVhbFZhbHVlc1trXTsKICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBpMCA9IGltYWdWYWx1ZXNba107Ci0gICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcjEgPSByZWFsVmFsdWVzW2srMV07Ci0gICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgaTEgPSBpbWFnVmFsdWVzW2srMV07Ci0gICAgICBmb3IgKGo9MDsgajxudW1iZXJCYW5kczsgaisrKQotICAgICAgewotICAgICAgICBGSVhQX0RCTCAgZW5lcmd5OwotICAgICAgICBGSVhQX0RCTCAgdHIwLHRyMSx0aTAsdGkxOworICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHIxID0gcmVhbFZhbHVlc1trICsgMV07CisgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgaTEgPSBpbWFnVmFsdWVzW2sgKyAxXTsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBudW1iZXJCYW5kczsgaisrKSB7CisgICAgICAgIEZJWFBfREJMIGVuZXJneTsKKyAgICAgICAgRklYUF9EQkwgdHIwLCB0cjEsIHRpMCwgdGkxOwogCiAgICAgICAgIC8qIFJlYWQgUU1GIHZhbHVlcyBvZiAyIHRpbWVzbG90cyAqLwotICAgICAgICB0cjAgPSByMFtqXTsgdHIxID0gcjFbal07IHRpMCA9IGkwW2pdOyB0aTEgPSBpMVtqXTsKKyAgICAgICAgdHIwID0gcjBbal07CisgICAgICAgIHRyMSA9IHIxW2pdOworICAgICAgICB0aTAgPSBpMFtqXTsKKyAgICAgICAgdGkxID0gaTFbal07CiAKLSAgICAgICAgLyogU2NhbGUgUU1GIFZhbHVlcyBhbmQgQ2FsYyBFbmVyZ3kgb2YgYm90aCB0aW1lc2xvdHMgKi8KKyAgICAgICAgLyogU2NhbGUgUU1GIFZhbHVlcyBhbmQgQ2FsYyBFbmVyZ3kgYXZlcmFnZSBvZiBib3RoIHRpbWVzbG90cyAqLwogICAgICAgICB0cjAgPDw9IHNjYWxlOwogICAgICAgICB0aTAgPDw9IHNjYWxlOwogICAgICAgICBlbmVyZ3kgPSBmUG93MkFkZERpdjIoZlBvdzJEaXYyKHRyMCksIHRpMCkgPj4gMTsKQEAgLTI4OCwxOCArMzA5LDIzIEBACiAgICAgICAgIG1heF92YWwgPSBmaXhNYXgobWF4X3ZhbCwgZW5lcmd5KTsKIAogICAgICAgICAvKiBXcml0ZSBiYWNrIHNjYWxlZCBRTUYgdmFsdWVzICovCi0gICAgICAgIHIwW2pdID0gdHIwOyByMVtqXSA9IHRyMTsgaTBbal0gPSB0aTA7IGkxW2pdID0gdGkxOworICAgICAgICByMFtqXSA9IHRyMDsKKyAgICAgICAgcjFbal0gPSB0cjE7CisgICAgICAgIGkwW2pdID0gdGkwOworICAgICAgICBpMVtqXSA9IHRpMTsKICAgICAgIH0KICAgICB9CiAgIH0KICAgLyogZW5lcmd5U2NhbGU6IHNjYWxlZmFjdG9yIGVuZXJnaWVzIG9mIGN1cnJlbnQgZnJhbWUgKi8KLSAgKmVuZXJneVNjYWxlID0gMiooKnFtZlNjYWxlKS0xOyAgICAgICAvKiBpZiBxbWZTY2FsZSA+IDA6IG5yIG9mIHJpZ2h0IHNoaWZ0cyBvdGhlcndpc2UgbnIgb2YgbGVmdCBzaGlmdHMgKi8KKyAgKmVuZXJneVNjYWxlID0KKyAgICAgIDIgKiAoKnFtZlNjYWxlKSAtCisgICAgICAxOyAvKiBpZiBxbWZTY2FsZSA+IDA6IG5yIG9mIHJpZ2h0IHNoaWZ0cyBvdGhlcndpc2UgbnIgb2YgbGVmdCBzaGlmdHMgKi8KIAogICAvKiBTY2FsZSB0aW1lc2xvdCBwYWlyIGVuZXJnaWVzIGFuZCB3cml0ZSB0byBvdXRwdXQgYnVmZmVyICovCiAgIHNjYWxlID0gQ291bnRMZWFkaW5nQml0cyhtYXhfdmFsKTsKICAgewotICAJRklYUF9EQkwgKm5yZ1ZhbHVlcyA9IHRtcE5yZzsKLSAgICBmb3IgKGs9MDsgazxudW1iZXJDb2xzPj4xOyBrKyspIHsKKyAgICBGSVhQX0RCTCAqbnJnVmFsdWVzID0gdG1wTnJnOworICAgIGZvciAoayA9IDA7IGs8bnVtYmVyQ29scz4+IDE7IGsrKykgewogICAgICAgc2NhbGVWYWx1ZXMoZW5lcmd5VmFsdWVzW2tdLCBucmdWYWx1ZXMsIG51bWJlckJhbmRzLCBzY2FsZSk7CiAgICAgICBucmdWYWx1ZXMgKz0gbnVtYmVyQmFuZHM7CiAgICAgfQpAQCAtMzA3LDQxICszMzMsNDMgQEAKICAgfQogCiAgIC8qIEZyZWUgU2NyYXRjaCBidWZmZXIgKi8KLSAgQ19BTExPQ19TQ1JBVENIX0VORCh0bXBOcmcsIEZJWFBfREJMLCBRTUZfQ0hBTk5FTFMqUU1GX01BWF9USU1FX1NMT1RTLzIpOworICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHRtcE5yZywgRklYUF9EQkwsIDMyICogNjQgLyAyKQogfQogCiBMTktfU0VDVElPTl9DT0RFX0wxCi1zdGF0aWMgdm9pZAotRkRLc2JyRW5jX2dldEVuZXJneUZyb21DcGx4UW1mRGF0YUZ1bGwoRklYUF9EQkwgKipSRVNUUklDVCBlbmVyZ3lWYWx1ZXMsLyohPCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqUkVTVFJJQ1QgcmVhbFZhbHVlcywgIC8qITwgdGhlIHJlYWwgcGFydCBvZiB0aGUgUU1GIHN1YnNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqUkVTVFJJQ1QgaW1hZ1ZhbHVlcywgIC8qITwgdGhlIGltYWdpbmFyeSBwYXJ0IG9mIHRoZSBRTUYgc3Vic2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgbnVtYmVyQmFuZHMsICAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgUU1GIGJhbmRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBudW1iZXJDb2xzLCAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBRTUYgc3Vic2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgKnFtZlNjYWxlLCAgICAgICAgICAgICAgICAgLyohPCBzY2xlZmFjdG9yIG9mIFFNRiBzdWJzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAqZW5lcmd5U2NhbGUpICAgICAgICAgICAgICAvKiE8IHNjYWxlZmFjdG9yIG9mIGVuZXJnaWVzICovCitzdGF0aWMgdm9pZCBGREtzYnJFbmNfZ2V0RW5lcmd5RnJvbUNwbHhRbWZEYXRhRnVsbCgKKyAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIGVuZXJneVZhbHVlcywgLyohPCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gKi8KKyAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIHJlYWxWYWx1ZXMsIC8qITwgdGhlIHJlYWwgcGFydCBvZiB0aGUgUU1GIHN1YnNhbXBsZXMgKi8KKyAgICBGSVhQX0RCTCAqKlJFU1RSSUNUCisgICAgICAgIGltYWdWYWx1ZXMsICAgLyohPCB0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgdGhlIFFNRiBzdWJzYW1wbGVzICovCisgICAgaW50IG51bWJlckJhbmRzLCAgLyohPCBudW1iZXIgb2YgUU1GIGJhbmRzICovCisgICAgaW50IG51bWJlckNvbHMsICAgLyohPCBudW1iZXIgb2YgUU1GIHN1YnNhbXBsZXMgKi8KKyAgICBpbnQgKnFtZlNjYWxlLCAgICAvKiE8IHNjYWxlZmFjdG9yIG9mIFFNRiBzdWJzYW1wbGVzICovCisgICAgaW50ICplbmVyZ3lTY2FsZSkgLyohPCBzY2FsZWZhY3RvciBvZiBlbmVyZ2llcyAqLwogewogICBpbnQgaiwgazsKICAgaW50IHNjYWxlOwogICBGSVhQX0RCTCBtYXhfdmFsID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKICAgLyogR2V0IFNjcmF0Y2ggYnVmZmVyICovCi0gIENfQUxMT0NfU0NSQVRDSF9TVEFSVCh0bXBOcmcsIEZJWFBfREJMLCBRTUZfTUFYX1RJTUVfU0xPVFMqUU1GX0NIQU5ORUxTLzIpOworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQodG1wTnJnLCBGSVhQX0RCTCwgTUFYX05SR19TTE9UU19MRCAqIDY0KQogCi0gIEZES19BU1NFUlQobnVtYmVyQmFuZHMgPD0gUU1GX0NIQU5ORUxTKTsKLSAgRkRLX0FTU0VSVChudW1iZXJDb2xzIDw9IFFNRl9NQVhfVElNRV9TTE9UUy8yKTsKKyAgRkRLX0FTU0VSVChudW1iZXJDb2xzIDw9IE1BWF9OUkdfU0xPVFNfTEQpOworICBGREtfQVNTRVJUKG51bWJlckJhbmRzIDw9IDY0KTsKIAogICAvKiBHZXQgbWF4IHBvc3NpYmxlIHNjYWxpbmcgb2YgUU1GIGRhdGEgKi8KICAgc2NhbGUgPSBERlJBQ1RfQklUUzsKLSAgZm9yIChrPTA7IGs8bnVtYmVyQ29sczsgaysrKSB7Ci0gICAgc2NhbGUgPSBmaXhNaW4oc2NhbGUsIGZpeE1pbihnZXRTY2FsZWZhY3RvcihyZWFsVmFsdWVzW2tdLCBudW1iZXJCYW5kcyksIGdldFNjYWxlZmFjdG9yKGltYWdWYWx1ZXNba10sIG51bWJlckJhbmRzKSkpOworICBmb3IgKGsgPSAwOyBrIDwgbnVtYmVyQ29sczsgaysrKSB7CisgICAgc2NhbGUgPSBmaXhNaW4oc2NhbGUsIGZpeE1pbihnZXRTY2FsZWZhY3RvcihyZWFsVmFsdWVzW2tdLCBudW1iZXJCYW5kcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTY2FsZWZhY3RvcihpbWFnVmFsdWVzW2tdLCBudW1iZXJCYW5kcykpKTsKICAgfQogCiAgIC8qIFR3ZWFrIHNjYWxpbmcgc3RhYmlsaXR5IGZvciB6ZXJvIHNpZ25hbCB0byBub24temVybyBzaWduYWwgdHJhbnNpdGlvbnMgKi8KLSAgaWYgKHNjYWxlID49IERGUkFDVF9CSVRTLTEpIHsKLSAgICBzY2FsZSA9IChGUkFDVF9CSVRTLTEtKnFtZlNjYWxlKTsKKyAgaWYgKHNjYWxlID49IERGUkFDVF9CSVRTIC0gMSkgeworICAgIHNjYWxlID0gKEZSQUNUX0JJVFMgLSAxIC0gKnFtZlNjYWxlKTsKICAgfQogICAvKiBwcmV2ZW50IHNjYWxpbmcgb2YgUUZNIHZhbHVlcyB0byAtMS5mICovCi0gIHNjYWxlID0gZml4TWF4KDAsc2NhbGUtMSk7CisgIHNjYWxlID0gZml4TWF4KDAsIHNjYWxlIC0gMSk7CiAKICAgLyogVXBkYXRlIFFNRiBzY2FsZSAqLwogICAqcW1mU2NhbGUgKz0gc2NhbGU7CkBAIC0zNTIsMjAgKzM4MCwxOSBAQAogICAgKi8KICAgewogICAgIEZJWFBfREJMICpucmdWYWx1ZXMgPSB0bXBOcmc7Ci0gICAgZm9yIChrPTA7IGs8bnVtYmVyQ29sczsgaysrKQotICAgIHsKLSAgICAgIC8qIExvYWQgYmFuZCB2ZWN0b3IgYWRkcmVzc2VzIG9mIDIgY29uc2VjdXRpdmUgdGltZXNsb3RzICovCisgICAgZm9yIChrID0gMDsgayA8IG51bWJlckNvbHM7IGsrKykgeworICAgICAgLyogTG9hZCBiYW5kIHZlY3RvciBhZGRyZXNzZXMgb2YgMSB0aW1lc2xvdCAqLwogICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHIwID0gcmVhbFZhbHVlc1trXTsKICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBpMCA9IGltYWdWYWx1ZXNba107Ci0gICAgICBmb3IgKGo9MDsgajxudW1iZXJCYW5kczsgaisrKQotICAgICAgewotICAgICAgICBGSVhQX0RCTCAgZW5lcmd5OwotICAgICAgICBGSVhQX0RCTCAgdHIwLHRpMDsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBudW1iZXJCYW5kczsgaisrKSB7CisgICAgICAgIEZJWFBfREJMIGVuZXJneTsKKyAgICAgICAgRklYUF9EQkwgdHIwLCB0aTA7CiAKLSAgICAgICAgLyogUmVhZCBRTUYgdmFsdWVzIG9mIDIgdGltZXNsb3RzICovCi0gICAgICAgIHRyMCA9IHIwW2pdOyB0aTAgPSBpMFtqXTsKKyAgICAgICAgLyogUmVhZCBRTUYgdmFsdWVzIG9mIDEgdGltZXNsb3QgKi8KKyAgICAgICAgdHIwID0gcjBbal07CisgICAgICAgIHRpMCA9IGkwW2pdOwogCi0gICAgICAgIC8qIFNjYWxlIFFNRiBWYWx1ZXMgYW5kIENhbGMgRW5lcmd5IG9mIGJvdGggdGltZXNsb3RzICovCisgICAgICAgIC8qIFNjYWxlIFFNRiBWYWx1ZXMgYW5kIENhbGMgRW5lcmd5ICovCiAgICAgICAgIHRyMCA8PD0gc2NhbGU7CiAgICAgICAgIHRpMCA8PD0gc2NhbGU7CiAgICAgICAgIGVuZXJneSA9IGZQb3cyQWRkRGl2MihmUG93MkRpdjIodHIwKSwgdGkwKTsKQEAgLTM3NCwxOCArNDAxLDIxIEBACiAgICAgICAgIG1heF92YWwgPSBmaXhNYXgobWF4X3ZhbCwgZW5lcmd5KTsKIAogICAgICAgICAvKiBXcml0ZSBiYWNrIHNjYWxlZCBRTUYgdmFsdWVzICovCi0gICAgICAgIHIwW2pdID0gdHIwOyBpMFtqXSA9IHRpMDsKKyAgICAgICAgcjBbal0gPSB0cjA7CisgICAgICAgIGkwW2pdID0gdGkwOwogICAgICAgfQogICAgIH0KICAgfQogICAvKiBlbmVyZ3lTY2FsZTogc2NhbGVmYWN0b3IgZW5lcmdpZXMgb2YgY3VycmVudCBmcmFtZSAqLwotICAqZW5lcmd5U2NhbGUgPSAyKigqcW1mU2NhbGUpLTE7ICAgICAgIC8qIGlmIHFtZlNjYWxlID4gMDogbnIgb2YgcmlnaHQgc2hpZnRzIG90aGVyd2lzZSBuciBvZiBsZWZ0IHNoaWZ0cyAqLworICAqZW5lcmd5U2NhbGUgPQorICAgICAgMiAqICgqcW1mU2NhbGUpIC0KKyAgICAgIDE7IC8qIGlmIHFtZlNjYWxlID4gMDogbnIgb2YgcmlnaHQgc2hpZnRzIG90aGVyd2lzZSBuciBvZiBsZWZ0IHNoaWZ0cyAqLwogCiAgIC8qIFNjYWxlIHRpbWVzbG90IHBhaXIgZW5lcmdpZXMgYW5kIHdyaXRlIHRvIG91dHB1dCBidWZmZXIgKi8KICAgc2NhbGUgPSBDb3VudExlYWRpbmdCaXRzKG1heF92YWwpOwogICB7Ci0gIAlGSVhQX0RCTCAqbnJnVmFsdWVzID0gdG1wTnJnOwotICAgIGZvciAoaz0wOyBrPG51bWJlckNvbHM7IGsrKykgeworICAgIEZJWFBfREJMICpucmdWYWx1ZXMgPSB0bXBOcmc7CisgICAgZm9yIChrID0gMDsgayA8IG51bWJlckNvbHM7IGsrKykgewogICAgICAgc2NhbGVWYWx1ZXMoZW5lcmd5VmFsdWVzW2tdLCBucmdWYWx1ZXMsIG51bWJlckJhbmRzLCBzY2FsZSk7CiAgICAgICBucmdWYWx1ZXMgKz0gbnVtYmVyQmFuZHM7CiAgICAgfQpAQCAtMzkzLDcgKzQyMyw3IEBACiAgIH0KIAogICAvKiBGcmVlIFNjcmF0Y2ggYnVmZmVyICovCi0gIENfQUxMT0NfU0NSQVRDSF9FTkQodG1wTnJnLCBGSVhQX0RCTCwgUU1GX01BWF9USU1FX1NMT1RTKlFNRl9DSEFOTkVMUy8yKTsKKyAgQ19BTExPQ19TQ1JBVENIX0VORCh0bXBOcmcsIEZJWFBfREJMLCBNQVhfTlJHX1NMT1RTX0xEICogNjQpCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MDQsMTIgKzQzNCwxMCBAQAogICBccmV0dXJuIHRoZSBxdWFudGl6ZWQgcGFuIHZhbHVlCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UCi1tYXBQYW5vcmFtYShJTlQgbnJnVmFsLCAgICAgLyohIGludGVnZXIgdmFsdWUgb2YgdGhlIGVuZXJneSAqLwotICAgICAgICAgICAgSU5UIGFtcFJlcywgICAgIC8qISBhbXBsaXR1ZGUgcmVzb2x1dGlvbiBbMS41LzNkQl0gKi8KLSAgICAgICAgICAgIElOVCAqcXVhbnRFcnJvciAvKiEgcXVhbnRpemF0aW9uIGVycm9yIG9mIGVuZXJneSB2YWwqLwotICAgICAgICAgICApCi17CitzdGF0aWMgSU5UIG1hcFBhbm9yYW1hKElOVCBucmdWYWwsICAgICAvKiEgaW50ZWdlciB2YWx1ZSBvZiB0aGUgZW5lcmd5ICovCisgICAgICAgICAgICAgICAgICAgICAgIElOVCBhbXBSZXMsICAgICAvKiEgYW1wbGl0dWRlIHJlc29sdXRpb24gWzEuNS8zZEJdICovCisgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcXVhbnRFcnJvciAvKiEgcXVhbnRpemF0aW9uIGVycm9yIG9mIGVuZXJneSB2YWwqLworKSB7CiAgIGludCBpOwogICBJTlQgbWluX3ZhbCwgdmFsOwogICBVQ0hBUiBwYW5JbmRleDsKQEAgLTQyMiw3ICs0NTAsNyBAQAogICBtaW5fdmFsID0gRkRLX0lOVF9NQVg7CiAgIHBhbkluZGV4ID0gMDsKICAgZm9yIChpID0gMDsgaSA8IG1heEluZGV4W2FtcFJlc107IGkrKykgewotICAgIHZhbCA9IGZpeHBfYWJzICgobnJnVmFsIC0gKElOVClwYW5UYWJsZVthbXBSZXNdW2ldKSk7CisgICAgdmFsID0gZml4cF9hYnMoKG5yZ1ZhbCAtIChJTlQpcGFuVGFibGVbYW1wUmVzXVtpXSkpOwogCiAgICAgaWYgKHZhbCA8IG1pbl92YWwpIHsKICAgICAgIG1pbl92YWwgPSB2YWw7CkBAIC00MzAsMTIgKzQ1OCwxMiBAQAogICAgIH0KICAgfQogCi0gICpxdWFudEVycm9yPW1pbl92YWw7CisgICpxdWFudEVycm9yID0gbWluX3ZhbDsKIAotICByZXR1cm4gcGFuVGFibGVbYW1wUmVzXVttYXhJbmRleFthbXBSZXNdLTFdICsgc2lnbiAqIHBhblRhYmxlW2FtcFJlc11bcGFuSW5kZXhdOworICByZXR1cm4gcGFuVGFibGVbYW1wUmVzXVttYXhJbmRleFthbXBSZXNdIC0gMV0gKworICAgICAgICAgc2lnbiAqIHBhblRhYmxlW2FtcFJlc11bcGFuSW5kZXhdOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiEKIApAQCAtNDQ0LDM0ICs0NzIsMzcgQEAKICAgXHJldHVybiB2b2lkCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihTQ0hBUiAgICAqUkVTVFJJQ1QgaU5vaXNlTGV2ZWxzLCAvKiEgcXVhbnRpemVkIG5vaXNlIGxldmVscyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgTm9pc2VMZXZlbHMsICAvKiEgdGhlIG5vaXNlIGxldmVscyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgIGNvdXBsaW5nICAgICAgICAgICAgICAgLyohIHRoZSBjb3VwbGluZyBmbGFnICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoteworc3RhdGljIHZvaWQgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbigKKyAgICBTQ0hBUiAqUkVTVFJJQ1QgaU5vaXNlTGV2ZWxzLCAvKiEgcXVhbnRpemVkIG5vaXNlIGxldmVscyAqLworICAgIEZJWFBfREJMICpSRVNUUklDVAorICAgICAgICBOb2lzZUxldmVscywgLyohIHRoZSBub2lzZSBsZXZlbHMuIEV4cG9uZW50ID0gTERfREFUQV9TSElGVCAgKi8KKyAgICBJTlQgY291cGxpbmcgICAgIC8qISB0aGUgY291cGxpbmcgZmxhZyAqLworKSB7CiAgIElOVCBpOwogICBJTlQgdG1wLCBkdW1teTsKIAogICAvKiBRdWFudGlzYXRpb24sIHNpbWlsYXIgdG8gc2ZiIHF1YW50Li4uICovCiAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX05PSVNFX1ZBTFVFUzsgaSsrKSB7Ci0gICAgLyogdG1wID0gTm9pc2VMZXZlbHNbaV0gPiAoUEZMT0FUKTMwLjBmID8gMzA6IChJTlQpIChOb2lzZUxldmVsc1tpXSArIChQRkxPQVQpMC41KTsgKi8KLSAgICAvKiAzMD4+NiA9IDAuNDY4NzUgKi8KKyAgICAvKiB0bXAgPSBOb2lzZUxldmVsc1tpXSA+IChQRkxPQVQpMzAuMGYgPyAzMDogKElOVCkgKE5vaXNlTGV2ZWxzW2ldICsKKyAgICAgKiAoUEZMT0FUKTAuNSk7ICovCisgICAgLyogMzA+PkxEX0RBVEFfU0hJRlQgPSAwLjQ2ODc1ICovCiAgICAgaWYgKChGSVhQX0RCTClOb2lzZUxldmVsc1tpXSA+IEZMMkZYQ09OU1RfREJMKDAuNDY4NzVmKSkgewogICAgICAgdG1wID0gMzA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgLyogdG1wID0gKElOVCkoKEZJWFBfREJMKU5vaXNlTGV2ZWxzW2ldICsgKEZMMkZYQ09OU1RfREJMKDAuNWYpPj4oKi8gLyogRlJBQ1RfQklUUysgKi8gLyogNi0xKSkpOyovCi0gICAgICAvKiB0bXAgPSB0bXAgPj4gKERGUkFDVF9CSVRTLTEtNik7ICovIC8qIGNvbnZlcnNpb24gdG8gaW50ZWdlciBoYXBwZW5zIGhlcmUgKi8KLSAgICAgIC8qIHJvdW5kaW5nIGlzIGRvbmUgYnkgc2hpZnRpbmcgb25lIGJpdCBsZXNzIHRoYW4gbmVjZXNzYXJ5IHRvIHRoZSByaWdodCwgYWRkaW5nICcxJyBhbmQgdGhlbiBzaGlmdGluZyB0aGUgZmluYWwgYml0ICovCi0gICAgICB0bXAgPSAoKCgoSU5UKU5vaXNlTGV2ZWxzW2ldKT4+KERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCkpICk7IC8qIGNvbnZlcnNpb24gdG8gaW50ZWdlciAqLwotCQkJIGlmICh0bXAgIT0gMCkKLQkJCSAgIHRtcCArPSAxOworICAgIH0gZWxzZSB7CisgICAgICAvKiB0bXAgPSAoSU5UKSgoRklYUF9EQkwpTm9pc2VMZXZlbHNbaV0gKyAoRkwyRlhDT05TVF9EQkwoMC41Zik+PigqLworICAgICAgLyogRlJBQ1RfQklUUysgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2LTEpKSk7Ki8KKyAgICAgIC8qIHRtcCA9IHRtcCA+PiAoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZUKTsgKi8gLyogY29udmVyc2lvbiB0byBpbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcHBlbnMgaGVyZSAqLworICAgICAgLyogcm91bmRpbmcgaXMgZG9uZSBieSBzaGlmdGluZyBvbmUgYml0IGxlc3MgdGhhbiBuZWNlc3NhcnkgdG8gdGhlIHJpZ2h0LAorICAgICAgICogYWRkaW5nICcxJyBhbmQgdGhlbiBzaGlmdGluZyB0aGUgZmluYWwgYml0ICovCisgICAgICB0bXAgPSAoKCgoSU5UKU5vaXNlTGV2ZWxzW2ldKSA+PgorICAgICAgICAgICAgICAoREZSQUNUX0JJVFMgLSAxIC0gTERfREFUQV9TSElGVCkpKTsgLyogY29udmVyc2lvbiB0byBpbnRlZ2VyICovCisgICAgICBpZiAodG1wICE9IDApIHRtcCArPSAxOwogICAgIH0KIAogICAgIGlmIChjb3VwbGluZykgewogICAgICAgdG1wID0gdG1wIDwgLTMwID8gLTMwIDogdG1wOwotICAgICAgdG1wID0gbWFwUGFub3JhbWEgKHRtcCwxLCZkdW1teSk7CisgICAgICB0bXAgPSBtYXBQYW5vcmFtYSh0bXAsIDEsICZkdW1teSk7CiAgICAgfQogICAgIGlOb2lzZUxldmVsc1tpXSA9IHRtcDsKICAgfQpAQCAtNDg1LDYwICs1MTYsNzYgQEAKICAgXHJldHVybiB2b2lkCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotY291cGxlTm9pc2VGbG9vcihGSVhQX0RCTCAqUkVTVFJJQ1Qgbm9pc2VfbGV2ZWxfbGVmdCwgLyohIG5vaXNlIGxldmVsIGxlZnQgIChtb2RpZmllZCkqLwotICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgbm9pc2VfbGV2ZWxfcmlnaHQgLyohIG5vaXNlIGxldmVsIHJpZ2h0IChtb2RpZmllZCkqLwotICAgICAgICAgICAgICAgICkKLXsKLSAgRklYUF9EQkwgY21wVmFsTGVmdCxjbXBWYWxSaWdodDsKK3N0YXRpYyB2b2lkIGNvdXBsZU5vaXNlRmxvb3IoCisgICAgRklYUF9EQkwgKlJFU1RSSUNUIG5vaXNlX2xldmVsX2xlZnQsIC8qISBub2lzZSBsZXZlbCBsZWZ0ICAobW9kaWZpZWQpKi8KKyAgICBGSVhQX0RCTCAqUkVTVFJJQ1Qgbm9pc2VfbGV2ZWxfcmlnaHQgLyohIG5vaXNlIGxldmVsIHJpZ2h0IChtb2RpZmllZCkqLworKSB7CisgIEZJWFBfREJMIGNtcFZhbExlZnQsIGNtcFZhbFJpZ2h0OwogICBJTlQgaTsKLSAgRklYUF9EQkwgdGVtcDEsdGVtcDI7CisgIEZJWFBfREJMIHRlbXAxLCB0ZW1wMjsKIAogICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVM7IGkrKykgewotCiAgICAgLyogQ2FsY3VsYXRpb24gb2YgdGhlIHBvd2VyIGZ1bmN0aW9uIHVzaW5nIGxkNjQ6CiAgICAgICAgeiAgPSB4Xnk7CiAgICAgICAgeicgPSBDYWxjTGQ2NCh6KSA9IHkqQ2FsY0xkNjQoeCkvNjQ7CiAgICAgICAgeiAgPSBDYWxjSW52TGQ2NCh6Jyk7CiAgICAgKi8KLSAgICBjbXBWYWxMZWZ0ICA9IE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIG5vaXNlX2xldmVsX2xlZnRbaV07CisgICAgY21wVmFsTGVmdCA9IE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIG5vaXNlX2xldmVsX2xlZnRbaV07CiAgICAgY21wVmFsUmlnaHQgPSBOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSBub2lzZV9sZXZlbF9yaWdodFtpXTsKIAogICAgIGlmIChjbXBWYWxSaWdodCA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CiAgICAgICB0ZW1wMSA9IENhbGNJbnZMZERhdGEoTk9JU0VfRkxPT1JfT0ZGU0VUXzY0IC0gbm9pc2VfbGV2ZWxfcmlnaHRbaV0pOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgdGVtcDEgPSBDYWxjSW52TGREYXRhKE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIG5vaXNlX2xldmVsX3JpZ2h0W2ldKTsKLSAgICAgIHRlbXAxID0gdGVtcDEgPDwgKERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVC0xKTsgIC8qIElOVCB0byBmcmFjdCBjb252ZXJzaW9uIG9mIHJlc3VsdCwgaWYgaW5wdXQgb2YgQ2FsY0ludkxkRGF0YSBpcyBwb3NpdGl2ICovCisgICAgICB0ZW1wMSA9IHRlbXAxIDw8IChERlJBQ1RfQklUUyAtIDEgLSBMRF9EQVRBX1NISUZUIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIDEpOyAvKiBJTlQgdG8gZnJhY3QgY29udmVyc2lvbiBvZiByZXN1bHQsIGlmIGlucHV0IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsY0ludkxkRGF0YSBpcyBwb3NpdGl2ICovCiAgICAgfQogCiAgICAgaWYgKGNtcFZhbExlZnQgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgewogICAgICAgdGVtcDIgPSBDYWxjSW52TGREYXRhKE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIG5vaXNlX2xldmVsX2xlZnRbaV0pOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgdGVtcDIgPSBDYWxjSW52TGREYXRhKE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIG5vaXNlX2xldmVsX2xlZnRbaV0pOwotICAgICAgdGVtcDIgPSB0ZW1wMiA8PCAoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZULTEpOyAgLyogSU5UIHRvIGZyYWN0IGNvbnZlcnNpb24gb2YgcmVzdWx0LCBpZiBpbnB1dCBvZiBDYWxjSW52TGREYXRhIGlzIHBvc2l0aXYgKi8KKyAgICAgIHRlbXAyID0gdGVtcDIgPDwgKERGUkFDVF9CSVRTIC0gMSAtIExEX0RBVEFfU0hJRlQgLQorICAgICAgICAgICAgICAgICAgICAgICAgMSk7IC8qIElOVCB0byBmcmFjdCBjb252ZXJzaW9uIG9mIHJlc3VsdCwgaWYgaW5wdXQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxjSW52TGREYXRhIGlzIHBvc2l0aXYgKi8KICAgICB9CiAKLQotICAgIGlmICgoY21wVmFsTGVmdCA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAmJiAoY21wVmFsUmlnaHQgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkpIHsKLSAgICAgIG5vaXNlX2xldmVsX2xlZnRbaV0gID0gTk9JU0VfRkxPT1JfT0ZGU0VUXzY0IC0gKENhbGNMZERhdGEoKCh0ZW1wMT4+MSkgKyAodGVtcDI+PjEpKSkpOyAvKiBubyBzY2FsaW5nIG5lZWRlZCEgYm90aCB2YWx1ZXMgYXJlIGRmcmFjdCAqLworICAgIGlmICgoY21wVmFsTGVmdCA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAmJgorICAgICAgICAoY21wVmFsUmlnaHQgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkpIHsKKyAgICAgIG5vaXNlX2xldmVsX2xlZnRbaV0gPQorICAgICAgICAgIE5PSVNFX0ZMT09SX09GRlNFVF82NCAtCisgICAgICAgICAgKENhbGNMZERhdGEoCisgICAgICAgICAgICAgICgodGVtcDEgPj4gMSkgKworICAgICAgICAgICAgICAgKHRlbXAyID4+IDEpKSkpOyAvKiBubyBzY2FsaW5nIG5lZWRlZCEgYm90aCB2YWx1ZXMgYXJlIGRmcmFjdCAqLwogICAgICAgbm9pc2VfbGV2ZWxfcmlnaHRbaV0gPSBDYWxjTGREYXRhKHRlbXAyKSAtIENhbGNMZERhdGEodGVtcDEpOwogICAgIH0KIAotICAgIGlmICgoY21wVmFsTGVmdCA+PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgJiYgKGNtcFZhbFJpZ2h0ID49IEZMMkZYQ09OU1RfREJMKDAuMGYpKSkgewotICAgICAgbm9pc2VfbGV2ZWxfbGVmdFtpXSAgPSBOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSAoQ2FsY0xkRGF0YSgoKHRlbXAxPj4xKSArICh0ZW1wMj4+MSkpKSArIEZMMkZYQ09OU1RfREJMKDAuMTA5Mzc1ZikpOyAvKiBzY2FsZWQgd2l0aCA3LzY0ICovCisgICAgaWYgKChjbXBWYWxMZWZ0ID49IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAmJgorICAgICAgICAoY21wVmFsUmlnaHQgPj0gRkwyRlhDT05TVF9EQkwoMC4wZikpKSB7CisgICAgICBub2lzZV9sZXZlbF9sZWZ0W2ldID0gTk9JU0VfRkxPT1JfT0ZGU0VUXzY0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ2FsY0xkRGF0YSgoKHRlbXAxID4+IDEpICsgKHRlbXAyID4+IDEpKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjEwOTM3NWYpKTsgLyogc2NhbGVkIHdpdGggNy82NCAqLwogICAgICAgbm9pc2VfbGV2ZWxfcmlnaHRbaV0gPSBDYWxjTGREYXRhKHRlbXAyKSAtIENhbGNMZERhdGEodGVtcDEpOwogICAgIH0KIAotICAgIGlmICgoY21wVmFsTGVmdCA+PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgJiYgKGNtcFZhbFJpZ2h0IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpKSB7Ci0gICAgICBub2lzZV9sZXZlbF9sZWZ0W2ldICA9IE5PSVNFX0ZMT09SX09GRlNFVF82NCAtIChDYWxjTGREYXRhKCgodGVtcDE+Pig3KzEpKSArICh0ZW1wMj4+MSkpKSArIEZMMkZYQ09OU1RfREJMKDAuMTA5Mzc1ZikpOyAvKiBzY2FsZWQgd2l0aCA3LzY0ICovCi0gICAgICBub2lzZV9sZXZlbF9yaWdodFtpXSA9IChDYWxjTGREYXRhKHRlbXAyKSArIEZMMkZYQ09OU1RfREJMKDAuMTA5Mzc1ZikpIC0gQ2FsY0xkRGF0YSh0ZW1wMSk7CisgICAgaWYgKChjbXBWYWxMZWZ0ID49IEZMMkZYQ09OU1RfREJMKDAuMGYpKSAmJgorICAgICAgICAoY21wVmFsUmlnaHQgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkpIHsKKyAgICAgIG5vaXNlX2xldmVsX2xlZnRbaV0gPSBOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDYWxjTGREYXRhKCgodGVtcDEgPj4gKDcgKyAxKSkgKyAodGVtcDIgPj4gMSkpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMTA5Mzc1ZikpOyAvKiBzY2FsZWQgd2l0aCA3LzY0ICovCisgICAgICBub2lzZV9sZXZlbF9yaWdodFtpXSA9CisgICAgICAgICAgKENhbGNMZERhdGEodGVtcDIpICsgRkwyRlhDT05TVF9EQkwoMC4xMDkzNzVmKSkgLSBDYWxjTGREYXRhKHRlbXAxKTsKICAgICB9CiAKLSAgICBpZiAoKGNtcFZhbExlZnQgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgJiYgKGNtcFZhbFJpZ2h0ID49IEZMMkZYQ09OU1RfREJMKDAuMGYpKSkgewotICAgICAgbm9pc2VfbGV2ZWxfbGVmdFtpXSAgPSBOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSAoQ2FsY0xkRGF0YSgoKHRlbXAxPj4xKSArICh0ZW1wMj4+KDcrMSkpKSkgKyBGTDJGWENPTlNUX0RCTCgwLjEwOTM3NWYpKTsgLyogc2NhbGVkIHdpdGggNy82NCAqLwotICAgICAgbm9pc2VfbGV2ZWxfcmlnaHRbaV0gPSBDYWxjTGREYXRhKHRlbXAyKSAtIChDYWxjTGREYXRhKHRlbXAxKSArIEZMMkZYQ09OU1RfREJMKDAuMTA5Mzc1ZikpOyAvKiBzY2FsZWQgd2l0aCA3LzY0ICovCisgICAgaWYgKChjbXBWYWxMZWZ0IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpICYmCisgICAgICAgIChjbXBWYWxSaWdodCA+PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkpIHsKKyAgICAgIG5vaXNlX2xldmVsX2xlZnRbaV0gPSBOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDYWxjTGREYXRhKCgodGVtcDEgPj4gMSkgKyAodGVtcDIgPj4gKDcgKyAxKSkpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMTA5Mzc1ZikpOyAvKiBzY2FsZWQgd2l0aCA3LzY0ICovCisgICAgICBub2lzZV9sZXZlbF9yaWdodFtpXSA9IENhbGNMZERhdGEodGVtcDIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENhbGNMZERhdGEodGVtcDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMTA5Mzc1ZikpOyAvKiBzY2FsZWQgd2l0aCA3LzY0ICovCiAgICAgfQogICB9CiB9CkBAIC01NDYsMjIgKzU5MywyMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQogCi0gIFxicmllZiAgQ2FsY3VsYXRpb24gb2YgZW5lcmd5IHN0YXJ0aW5nIGluIGxvd2VyIGJhbmQgKGxpKSB1cCB0byB1cHBlciBiYW5kICh1aSkKLSAgICAgICAgICBvdmVyIHNsb3RzIChzdGFydF9wb3MpIHRvIChzdG9wX3BvcykKKyAgXGJyaWVmICBDYWxjdWxhdGlvbiBvZiBlbmVyZ3kgc3RhcnRpbmcgaW4gbG93ZXIgYmFuZCAobGkpIHVwIHRvIHVwcGVyIGJhbmQKKyh1aSkgb3ZlciBzbG90cyAoc3RhcnRfcG9zKSB0byAoc3RvcF9wb3MpCiAKICAgXHJldHVybiB2b2lkCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgRklYUF9EQkwKLWdldEVudlNmYkVuZXJneShJTlQgbGksICAgICAgICAgICAgICAvKiEgbG93ZXIgYmFuZCAqLwotICAgICAgICAgICAgICAgIElOVCB1aSwgICAgICAgICAgICAgIC8qISB1cHBlciBiYW5kICovCi0gICAgICAgICAgICAgICAgSU5UIHN0YXJ0X3BvcywgICAgICAgLyohIHN0YXJ0IHNsb3QgKi8KLSAgICAgICAgICAgICAgICBJTlQgc3RvcF9wb3MsICAgICAgICAvKiEgc3RvcCBzbG90ICovCi0gICAgICAgICAgICAgICAgSU5UIGJvcmRlcl9wb3MsICAgICAgLyohIHNsb3RzIHNjYWxpbmcgYm9yZGVyICovCi0gICAgICAgICAgICAgICAgRklYUF9EQkwgKipZQnVmZmVyLCAgLyohIHNmYiBlbmVyZ3kgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgSU5UIFlCdWZmZXJTelNoaWZ0LCAgLyohIEVuZXJneSBidWZmZXIgaW5kZXggc2NhbGUgKi8KLSAgICAgICAgICAgICAgICBJTlQgc2NhbGVOcmcwLCAgICAgICAvKiEgc2NhbGluZyBvZiBsb3dlciBzbG90cyAqLwotICAgICAgICAgICAgICAgIElOVCBzY2FsZU5yZzEpICAgICAgIC8qISBzY2FsaW5nIG9mIHVwcGVyIHNsb3RzICovCisKK3N0YXRpYyBGSVhQX0RCTCBnZXRFbnZTZmJFbmVyZ3koCisgICAgSU5UIGxpLCAgICAgICAgICAgICAvKiEgbG93ZXIgYmFuZCAqLworICAgIElOVCB1aSwgICAgICAgICAgICAgLyohIHVwcGVyIGJhbmQgKi8KKyAgICBJTlQgc3RhcnRfcG9zLCAgICAgIC8qISBzdGFydCBzbG90ICovCisgICAgSU5UIHN0b3BfcG9zLCAgICAgICAvKiEgc3RvcCBzbG90ICovCisgICAgSU5UIGJvcmRlcl9wb3MsICAgICAvKiEgc2xvdHMgc2NhbGluZyBib3JkZXIgKi8KKyAgICBGSVhQX0RCTCAqKllCdWZmZXIsIC8qISBzZmIgZW5lcmd5IGJ1ZmZlciAqLworICAgIElOVCBZQnVmZmVyU3pTaGlmdCwgLyohIEVuZXJneSBidWZmZXIgaW5kZXggc2NhbGUgKi8KKyAgICBJTlQgc2NhbGVOcmcwLCAgICAgIC8qISBzY2FsaW5nIG9mIGxvd2VyIHNsb3RzICovCisgICAgSU5UIHNjYWxlTnJnMSkgICAgICAvKiEgc2NhbGluZyBvZiB1cHBlciBzbG90cyAqLwogewogICAvKiB1c2UgZHluYW1pYyBzY2FsaW5nIGZvciBvdXRlciBlbmVyZ3kgbG9vcDsKICAgICAgZW5lcmdpZXMgYXJlIGNyaXRpY2FsIGFuZCBldmVyeSBiaXQgaXMgaW1wb3J0YW50ICovCkBAIC01NjksMzAgKzYxNywzMyBAQAogCiAgIEZJWFBfREJMIG5yZ1N1bSwgbnJnMSwgbnJnMiwgYWNjdTEsIGFjY3UyOwogICBJTlQgZHluU2NhbGUsIGR5blNjYWxlMSwgZHluU2NhbGUyOwotICBpZih1aS1saT09MCkgZHluU2NhbGUgPSBERlJBQ1RfQklUUy0xOworICBpZiAodWkgLSBsaSA9PSAwKQorICAgIGR5blNjYWxlID0gREZSQUNUX0JJVFMgLSAxOwogICBlbHNlCi0gIGR5blNjYWxlID0gQ2FsY0xkSW50KHVpLWxpKT4+KERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVCk7CisgICAgZHluU2NhbGUgPSBDYWxjTGRJbnQodWkgLSBsaSkgPj4gKERGUkFDVF9CSVRTIC0gMSAtIExEX0RBVEFfU0hJRlQpOwogCi0gIHNjMCA9IGZpeE1pbihzY2FsZU5yZzAsWV9OUkdfU0NBTEUpOyBzYzEgPSBmaXhNaW4oc2NhbGVOcmcxLFlfTlJHX1NDQUxFKTsKKyAgc2MwID0gZml4TWluKHNjYWxlTnJnMCwgWV9OUkdfU0NBTEUpOworICBzYzEgPSBmaXhNaW4oc2NhbGVOcmcxLCBZX05SR19TQ0FMRSk7CiAgIC8qIGR5blNjYWxlezEsMn0gaXMgc2V0IHN1Y2ggdGhhdCB0aGUgcmlnaHQgc2hpZnQgYmVsb3cgaXMgcG9zaXRpdmUgKi8KLSAgZHluU2NhbGUxID0gZml4TWluKChzY2FsZU5yZzAtc2MwKSxkeW5TY2FsZSk7Ci0gIGR5blNjYWxlMiA9IGZpeE1pbigoc2NhbGVOcmcxLXNjMSksZHluU2NhbGUpOworICBkeW5TY2FsZTEgPSBmaXhNaW4oKHNjYWxlTnJnMCAtIHNjMCksIGR5blNjYWxlKTsKKyAgZHluU2NhbGUyID0gZml4TWluKChzY2FsZU5yZzEgLSBzYzEpLCBkeW5TY2FsZSk7CiAgIG5yZ1N1bSA9IGFjY3UxID0gYWNjdTIgPSAoRklYUF9EQkwpMDsKIAogICBmb3IgKGsgPSBsaTsgayA8IHVpOyBrKyspIHsKICAgICBucmcxID0gbnJnMiA9IChGSVhQX0RCTCkwOwogICAgIGZvciAobCA9IHN0YXJ0X3BvczsgbCA8IGJvcmRlcl9wb3M7IGwrKykgewotICAgICAgbnJnMSArPSBZQnVmZmVyW2w+PllCdWZmZXJTelNoaWZ0XVtrXSA+PiBzYzA7CisgICAgICBucmcxICs9IFlCdWZmZXJbbCA+PiBZQnVmZmVyU3pTaGlmdF1ba10gPj4gc2MwOwogICAgIH0KICAgICBmb3IgKDsgbCA8IHN0b3BfcG9zOyBsKyspIHsKLSAgICAgIG5yZzIgKz0gWUJ1ZmZlcltsPj5ZQnVmZmVyU3pTaGlmdF1ba10gPj4gc2MxOworICAgICAgbnJnMiArPSBZQnVmZmVyW2wgPj4gWUJ1ZmZlclN6U2hpZnRdW2tdID4+IHNjMTsKICAgICB9Ci0gICAgYWNjdTEgKz0gKG5yZzE+PmR5blNjYWxlMSk7Ci0gICAgYWNjdTIgKz0gKG5yZzI+PmR5blNjYWxlMik7CisgICAgYWNjdTEgKz0gKG5yZzEgPj4gZHluU2NhbGUxKTsKKyAgICBhY2N1MiArPSAobnJnMiA+PiBkeW5TY2FsZTIpOwogICB9CiAgIC8qIFRoaXMgc2hpZnQgZmFjdG9yIGlzIGFsd2F5cyBwb3NpdGl2ZS4gU2VlIGNvbW1lbnQgYWJvdmUuICovCi0gIG5yZ1N1bSArPSAoIGFjY3UxID4+IGZpeE1pbigoc2NhbGVOcmcwLXNjMC1keW5TY2FsZTEpLChERlJBQ1RfQklUUy0xKSkgKQotICAgICAgICAgICsgICggYWNjdTIgPj4gZml4TWluKChzY2FsZU5yZzEtc2MxLWR5blNjYWxlMiksKERGUkFDVF9CSVRTLTEpKSApOworICBucmdTdW0gKz0KKyAgICAgIChhY2N1MSA+PiBmaXhNaW4oKHNjYWxlTnJnMCAtIHNjMCAtIGR5blNjYWxlMSksIChERlJBQ1RfQklUUyAtIDEpKSkgKworICAgICAgKGFjY3UyID4+IGZpeE1pbigoc2NhbGVOcmcxIC0gc2MxIC0gZHluU2NhbGUyKSwgKERGUkFDVF9CSVRTIC0gMSkpKTsKIAogICByZXR1cm4gbnJnU3VtOwogfQpAQCAtNjA1LDI3ICs2NTYsMzAgQEAKICAgXHJldHVybiB2b2lkCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgRklYUF9EQkwKLW1oTG93ZXJpbmdFbmVyZ3koRklYUF9EQkwgbnJnLCBJTlQgTSkKLXsKK3N0YXRpYyBGSVhQX0RCTCBtaExvd2VyaW5nRW5lcmd5KEZJWFBfREJMIG5yZywgSU5UIE0pIHsKICAgLyoKLSAgICAgQ29tcGVuc2F0aW5nIGZvciB0aGUgZmFjdCB0aGF0IHdlIGluIHRoZSBkZWNvZGVyIG1hcCB0aGUgImF2ZXJhZ2UgZW5lcmd5IHRvIGV2ZXJ5IFFNRgotICAgICBiYW5kLCBhbmQgdXNlIHRoaXMgd2hlbiB3ZSBjYWxjdWxhdGUgdGhlIGJvb3N0LWZhY3Rvci4gU2luY2UgdGhlIG1hcHBlZCBlbmVyZ3kgaXNuJ3QKLSAgICAgdGhlIGF2ZXJhZ2UgZW5lcmd5IGJ1dCB0aGUgbWF4aW11bSBlbmVyZ3kgaW4gY2FzZSBvZiBtaXNzaW5nIGhhcm1vbmljIGNyZWF0aW9uLCB3ZSB3aWxsCi0gICAgIGluIHRoZSBib29zdCBmdW5jdGlvbiBjYWxjdWxhdGUgdGhhdCB0b28gbXVjaCBsaW1pdGluZyBoYXMgYmVlbiBhcHBsaWVkIGFuZCBoZW5jZSB3ZSB3aWxsCi0gICAgIGJvb3N0IHRoZSBzaWduYWwgYWx0aG91Z2ggaXQgaXNuJ3QgY2FsbGVkIGZvci4gSGVuY2Ugd2UgbmVlZCB0byBjb21wZW5zYXRlIGZvciB0aGlzIGJ5Ci0gICAgIGxvd2VyaW5nIHRoZSB0cmFuc21pdHRlZCBlbmVyZ3kgdmFsdWVzIGZvciB0aGUgc2luZXMgc28gdGhleSB3aWxsIGdldCB0aGUgY29ycmVjdCBsZXZlbAorICAgICBDb21wZW5zYXRpbmcgZm9yIHRoZSBmYWN0IHRoYXQgd2UgaW4gdGhlIGRlY29kZXIgbWFwIHRoZSAiYXZlcmFnZSBlbmVyZ3kgdG8KKyAgICAgZXZlcnkgUU1GIGJhbmQsIGFuZCB1c2UgdGhpcyB3aGVuIHdlIGNhbGN1bGF0ZSB0aGUgYm9vc3QtZmFjdG9yLiBTaW5jZSB0aGUKKyAgICAgbWFwcGVkIGVuZXJneSBpc24ndCB0aGUgYXZlcmFnZSBlbmVyZ3kgYnV0IHRoZSBtYXhpbXVtIGVuZXJneSBpbiBjYXNlIG9mCisgICAgIG1pc3NpbmcgaGFybW9uaWMgY3JlYXRpb24sIHdlIHdpbGwgaW4gdGhlIGJvb3N0IGZ1bmN0aW9uIGNhbGN1bGF0ZSB0aGF0IHRvbworICAgICBtdWNoIGxpbWl0aW5nIGhhcyBiZWVuIGFwcGxpZWQgYW5kIGhlbmNlIHdlIHdpbGwgYm9vc3QgdGhlIHNpZ25hbCBhbHRob3VnaAorICAgICBpdCBpc24ndCBjYWxsZWQgZm9yLiBIZW5jZSB3ZSBuZWVkIHRvIGNvbXBlbnNhdGUgZm9yIHRoaXMgYnkgbG93ZXJpbmcgdGhlCisgICAgIHRyYW5zbWl0dGVkIGVuZXJneSB2YWx1ZXMgZm9yIHRoZSBzaW5lcyBzbyB0aGV5IHdpbGwgZ2V0IHRoZSBjb3JyZWN0IGxldmVsCiAgICAgIGFmdGVyIHRoZSBib29zdCBpcyBhcHBsaWVkLgogICAqLwotICBpZihNID4gMil7CisgIGlmIChNID4gMikgewogICAgIElOVCB0bXBTY2FsZTsKICAgICB0bXBTY2FsZSA9IENvdW50TGVhZGluZ0JpdHMobnJnKTsKICAgICBucmcgPDw9IHRtcFNjYWxlOwotICAgIG5yZyA9IGZNdWx0KG5yZywgRkwyRlhDT05TVF9EQkwoMC4zOTgxMDcyNjdmKSk7IC8qIFRoZSBtYXhpbXVtIGJvb3N0IGlzIDEuNTg0ODkzLCBzbyB0aGUgbWF4aW11bSBhdHRlbnVhdGlvbiBzaG91bGQgYmUgc3F1YXJlKDEvMS41ODQ4OTMpID0gMC4zOTgxMDcyNjcgKi8KKyAgICBucmcgPSBmTXVsdChucmcsIEZMMkZYQ09OU1RfREJMKDAuMzk4MTA3MjY3ZikpOyAvKiBUaGUgbWF4aW11bSBib29zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIDEuNTg0ODkzLCBzbyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtIGF0dGVudWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3F1YXJlKDEvMS41ODQ4OTMpID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM5ODEwNzI2NyAqLwogICAgIG5yZyA+Pj0gdG1wU2NhbGU7Ci0gIH0KLSAgZWxzZXsKLSAgICBpZihNID4gMSl7CisgIH0gZWxzZSB7CisgICAgaWYgKE0gPiAxKSB7CiAgICAgICBucmcgPj49IDE7CiAgICAgfQogICB9CkBAIC02NDEsMjIgKzY5NSwxNyBAQAogICBccmV0dXJuIHZvaWQKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBGSVhQX0RCTCBubWhMb3dlcmluZ0VuZXJneSgKLSAgICAgICAgRklYUF9EQkwgbnJnLAotICAgICAgICBjb25zdCBGSVhQX0RCTCBucmdTdW0sCi0gICAgICAgIGNvbnN0IElOVCBucmdTdW1fc2NhbGUsCi0gICAgICAgIGNvbnN0IElOVCBNCi0gICAgICAgICkKLXsKLSAgaWYgKG5yZz5GTDJGWENPTlNUX0RCTCgwKSkgewotICAgIGludCBzYz0wOworc3RhdGljIEZJWFBfREJMIG5taExvd2VyaW5nRW5lcmd5KEZJWFBfREJMIG5yZywgY29uc3QgRklYUF9EQkwgbnJnU3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBucmdTdW1fc2NhbGUsIGNvbnN0IElOVCBNKSB7CisgIGlmIChucmcgPiBGTDJGWENPTlNUX0RCTCgwKSkgeworICAgIGludCBzYyA9IDA7CiAgICAgLyogZ2FpbiA9IG5yZ1N1bSAvIChucmcqKE0rMSkpICovCi0gICAgRklYUF9EQkwgZ2FpbiA9IGZNdWx0KGZEaXZOb3JtKG5yZ1N1bSwgbnJnLCAmc2MpLCBHZXRJbnZJbnQoTSsxKSk7CisgICAgRklYUF9EQkwgZ2FpbiA9IGZNdWx0KGZEaXZOb3JtKG5yZ1N1bSwgbnJnLCAmc2MpLCBHZXRJbnZJbnQoTSArIDEpKTsKICAgICBzYyArPSBucmdTdW1fc2NhbGU7CiAKICAgICAvKiByZWR1Y2UgbnJnIGlmIGdhaW4gc21hbGxlciAxLmYgKi8KLSAgICBpZiAoICEoKHNjPj0wKSAmJiAoIGdhaW4gPiAoKEZJWFBfREJMKU1BWFZBTF9EQkw+PnNjKSApKSApIHsKLSAgICAgIG5yZyA9IGZNdWx0KHNjYWxlVmFsdWUoZ2FpbixzYyksIG5yZyk7CisgICAgaWYgKCEoKHNjID49IDApICYmIChnYWluID4gKChGSVhQX0RCTClNQVhWQUxfREJMID4+IHNjKSkpKSB7CisgICAgICBucmcgPSBmTXVsdChzY2FsZVZhbHVlKGdhaW4sIHNjKSwgbnJnKTsKICAgICB9CiAgIH0KICAgcmV0dXJuIG5yZzsKQEAgLTY3MSw5MSArNzIwLDkyIEBACiAgIFxyZXR1cm4gdm9pZAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWNhbGN1bGF0ZVNickVudmVsb3BlIChGSVhQX0RCTCAqKlJFU1RSSUNUIFlCdWZmZXJMZWZ0LCAgLyohIGVuZXJneSBidWZmZXIgbGVmdCAqLwotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqUkVTVFJJQ1QgWUJ1ZmZlclJpZ2h0LCAvKiEgZW5lcmd5IGJ1ZmZlciByaWdodCAqLwotICAgICAgICAgICAgICAgICAgICAgIGludCAqUkVTVFJJQ1QgWUJ1ZmZlclNjYWxlTGVmdCwgICAvKiEgc2NhbGUgZW5lcmd5IGJ1ZmZlciBsZWZ0ICovCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICpSRVNUUklDVCBZQnVmZmVyU2NhbGVSaWdodCwgIC8qISBzY2FsZSBlbmVyZ3kgYnVmZmVyIHJpZ2h0ICovCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0JSX0ZSQU1FX0lORk8gKmZyYW1lX2luZm8sIC8qISBmcmFtZSBpbmZvIHZlY3RvciAqLwotICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICpSRVNUUklDVCBzZmJfbnJnTGVmdCwgICAgICAvKiEgc2ZiIGVuZXJneSBidWZmZXIgbGVmdCAqLwotICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICpSRVNUUklDVCBzZmJfbnJnUmlnaHQsICAgICAvKiEgc2ZiIGVuZXJneSBidWZmZXIgcmlnaHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0NPTkZJR19EQVRBIGhfY29uLCAgICAgLyohIGhhbmRsZSB0byBjb25maWcgZGF0YSAgICovCi0gICAgICAgICAgICAgICAgICAgICAgSEFORExFX0VOVl9DSEFOTkVMIGhfc2JyLCAgICAgICAgIC8qISBlbnZlbG9wZSBjaGFubmVsIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgIFNCUl9TVEVSRU9fTU9ERSBzdGVyZW9Nb2RlLCAgICAgICAvKiEgc3RlcmVvIGNvZGluZyBtb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgSU5UKiBtYXhRdWFudEVycm9yLCAgICAgICAgICAgICAgIC8qISBtYXhpbXVtIHF1YW50aXphdGlvbiBlcnJvciwgZm9yIHBhbm9yYW1hLiAqLwotICAgICAgICAgICAgICAgICAgICAgIGludCBZQnVmZmVyU3pTaGlmdCkgICAgICAgICAgICAgICAvKiEgRW5lcmd5IGJ1ZmZlciBpbmRleCBzY2FsZSAqLworc3RhdGljIHZvaWQgY2FsY3VsYXRlU2JyRW52ZWxvcGUoCisgICAgRklYUF9EQkwgKipSRVNUUklDVCBZQnVmZmVyTGVmdCwgIC8qISBlbmVyZ3kgYnVmZmVyIGxlZnQgKi8KKyAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIFlCdWZmZXJSaWdodCwgLyohIGVuZXJneSBidWZmZXIgcmlnaHQgKi8KKyAgICBpbnQgKlJFU1RSSUNUIFlCdWZmZXJTY2FsZUxlZnQsICAgLyohIHNjYWxlIGVuZXJneSBidWZmZXIgbGVmdCAqLworICAgIGludCAqUkVTVFJJQ1QgWUJ1ZmZlclNjYWxlUmlnaHQsICAvKiEgc2NhbGUgZW5lcmd5IGJ1ZmZlciByaWdodCAqLworICAgIGNvbnN0IFNCUl9GUkFNRV9JTkZPICpmcmFtZV9pbmZvLCAvKiEgZnJhbWUgaW5mbyB2ZWN0b3IgKi8KKyAgICBTQ0hBUiAqUkVTVFJJQ1Qgc2ZiX25yZ0xlZnQsICAgICAgLyohIHNmYiBlbmVyZ3kgYnVmZmVyIGxlZnQgKi8KKyAgICBTQ0hBUiAqUkVTVFJJQ1Qgc2ZiX25yZ1JpZ2h0LCAgICAgLyohIHNmYiBlbmVyZ3kgYnVmZmVyIHJpZ2h0ICovCisgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSBoX2NvbiwgICAgIC8qISBoYW5kbGUgdG8gY29uZmlnIGRhdGEgICAqLworICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCBoX3NiciwgICAgICAgICAvKiEgZW52ZWxvcGUgY2hhbm5lbCBoYW5kbGUgKi8KKyAgICBTQlJfU1RFUkVPX01PREUgc3RlcmVvTW9kZSwgICAgICAgLyohIHN0ZXJlbyBjb2RpbmcgbW9kZSAqLworICAgIElOVCAqbWF4UXVhbnRFcnJvciwgLyohIG1heGltdW0gcXVhbnRpemF0aW9uIGVycm9yLCBmb3IgcGFub3JhbWEuICovCisgICAgaW50IFlCdWZmZXJTelNoaWZ0KSAvKiEgRW5lcmd5IGJ1ZmZlciBpbmRleCBzY2FsZSAqLwogCiB7Ci0gIGludCBpLCBqLCBtID0gMDsKKyAgaW50IGVudiwgaiwgbSA9IDA7CiAgIElOVCBub19vZl9iYW5kcywgc3RhcnRfcG9zLCBzdG9wX3BvcywgbGksIHVpOwogICBGUkVRX1JFUyBmcmVxX3JlczsKIAogICBJTlQgY2EgPSAyIC0gaF9zYnItPmVuY0VudkRhdGEuaW5pdF9zYnJfYW1wX3JlczsKICAgSU5UIG9uZUJpdExlc3MgPSAwOwogICBpZiAoY2EgPT0gMikKLSAgICBvbmVCaXRMZXNzID0gMTsgLyogTERfREFUQV9TSElGVCA9PiBsZDY0IHNjYWxpbmc7IG9uZSBiaXQgbGVzcyBmb3Igcm91bmRpbmcgKi8KKyAgICBvbmVCaXRMZXNzID0KKyAgICAgICAgMTsgLyogTERfREFUQV9TSElGVCA9PiBsZDY0IHNjYWxpbmc7IG9uZSBiaXQgbGVzcyBmb3Igcm91bmRpbmcgKi8KIAogICBJTlQgcXVhbnRFcnJvcjsKICAgSU5UIG5FbnZlbG9wZXMgPSBmcmFtZV9pbmZvLT5uRW52ZWxvcGVzOwogICBJTlQgc2hvcnRfZW52ID0gZnJhbWVfaW5mby0+c2hvcnRFbnYgLSAxOwogICBJTlQgdGltZVN0ZXAgPSBoX3Nici0+c2JyRXh0cmFjdEVudmVsb3BlLnRpbWVfc3RlcDsKLSAgSU5UIGNvbW1vblNjYWxlLHNjYWxlTGVmdDAsc2NhbGVMZWZ0MTsKLSAgSU5UIHNjYWxlUmlnaHQwPTAsc2NhbGVSaWdodDE9MDsKKyAgSU5UIGNvbW1vblNjYWxlLCBzY2FsZUxlZnQwLCBzY2FsZUxlZnQxOworICBJTlQgc2NhbGVSaWdodDAgPSAwLCBzY2FsZVJpZ2h0MSA9IDA7CiAKLSAgY29tbW9uU2NhbGUgPSBmaXhNaW4oWUJ1ZmZlclNjYWxlTGVmdFswXSxZQnVmZmVyU2NhbGVMZWZ0WzFdKTsKKyAgY29tbW9uU2NhbGUgPSBmaXhNaW4oWUJ1ZmZlclNjYWxlTGVmdFswXSwgWUJ1ZmZlclNjYWxlTGVmdFsxXSk7CiAKICAgaWYgKHN0ZXJlb01vZGUgPT0gU0JSX0NPVVBMSU5HKSB7Ci0gICAgY29tbW9uU2NhbGUgPSBmaXhNaW4oY29tbW9uU2NhbGUsWUJ1ZmZlclNjYWxlUmlnaHRbMF0pOwotICAgIGNvbW1vblNjYWxlID0gZml4TWluKGNvbW1vblNjYWxlLFlCdWZmZXJTY2FsZVJpZ2h0WzFdKTsKKyAgICBjb21tb25TY2FsZSA9IGZpeE1pbihjb21tb25TY2FsZSwgWUJ1ZmZlclNjYWxlUmlnaHRbMF0pOworICAgIGNvbW1vblNjYWxlID0gZml4TWluKGNvbW1vblNjYWxlLCBZQnVmZmVyU2NhbGVSaWdodFsxXSk7CiAgIH0KIAogICBjb21tb25TY2FsZSA9IGNvbW1vblNjYWxlIC0gNzsKIAogICBzY2FsZUxlZnQwID0gWUJ1ZmZlclNjYWxlTGVmdFswXSAtIGNvbW1vblNjYWxlOwotICBzY2FsZUxlZnQxID0gWUJ1ZmZlclNjYWxlTGVmdFsxXSAtIGNvbW1vblNjYWxlIDsKLSAgRkRLX0FTU0VSVCAoKHNjYWxlTGVmdDAgPj0gMCkgJiYgKHNjYWxlTGVmdDEgPj0gMCkpOworICBzY2FsZUxlZnQxID0gWUJ1ZmZlclNjYWxlTGVmdFsxXSAtIGNvbW1vblNjYWxlOworICBGREtfQVNTRVJUKChzY2FsZUxlZnQwID49IDApICYmIChzY2FsZUxlZnQxID49IDApKTsKIAogICBpZiAoc3RlcmVvTW9kZSA9PSBTQlJfQ09VUExJTkcpIHsKICAgICBzY2FsZVJpZ2h0MCA9IFlCdWZmZXJTY2FsZVJpZ2h0WzBdIC0gY29tbW9uU2NhbGU7CiAgICAgc2NhbGVSaWdodDEgPSBZQnVmZmVyU2NhbGVSaWdodFsxXSAtIGNvbW1vblNjYWxlOwotICAgIEZES19BU1NFUlQgKChzY2FsZVJpZ2h0MCA+PSAwKSAmJiAoc2NhbGVSaWdodDEgPj0gMCkpOworICAgIEZES19BU1NFUlQoKHNjYWxlUmlnaHQwID49IDApICYmIChzY2FsZVJpZ2h0MSA+PSAwKSk7CiAgICAgKm1heFF1YW50RXJyb3IgPSAwOwogICB9CiAKLSAgZm9yIChpID0gMDsgaSA8IG5FbnZlbG9wZXM7IGkrKykgewotCi0gICAgRklYUF9EQkwgcE5yZ0xlZnRbUU1GX01BWF9USU1FX1NMT1RTXTsKLSAgICBGSVhQX0RCTCBwTnJnUmlnaHRbUU1GX01BWF9USU1FX1NMT1RTXTsKKyAgZm9yIChlbnYgPSAwOyBlbnYgPCBuRW52ZWxvcGVzOyBlbnYrKykgeworICAgIEZJWFBfREJMIHBOcmdMZWZ0WzMyXTsKKyAgICBGSVhQX0RCTCBwTnJnUmlnaHRbMzJdOwogICAgIGludCBlbnZOcmdfc2NhbGU7Ci0gICAgRklYUF9EQkwgZW52TnJnTGVmdCAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICBGSVhQX0RCTCBlbnZOcmdMZWZ0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgRklYUF9EQkwgZW52TnJnUmlnaHQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICBpbnQgICAgICBtaXNzaW5nSGFybW9uaWNbUU1GX01BWF9USU1FX1NMT1RTXTsKLSAgICBpbnQgICAgICBjb3VudFtRTUZfTUFYX1RJTUVfU0xPVFNdOworICAgIGludCBtaXNzaW5nSGFybW9uaWNbMzJdOworICAgIGludCBjb3VudFszMl07CiAKLSAgICBzdGFydF9wb3MgPSB0aW1lU3RlcCAqIGZyYW1lX2luZm8tPmJvcmRlcnNbaV07Ci0gICAgc3RvcF9wb3MgPSB0aW1lU3RlcCAqIGZyYW1lX2luZm8tPmJvcmRlcnNbaSArIDFdOwotICAgIGZyZXFfcmVzID0gZnJhbWVfaW5mby0+ZnJlcVJlc1tpXTsKKyAgICBzdGFydF9wb3MgPSB0aW1lU3RlcCAqIGZyYW1lX2luZm8tPmJvcmRlcnNbZW52XTsKKyAgICBzdG9wX3BvcyA9IHRpbWVTdGVwICogZnJhbWVfaW5mby0+Ym9yZGVyc1tlbnYgKyAxXTsKKyAgICBmcmVxX3JlcyA9IGZyYW1lX2luZm8tPmZyZXFSZXNbZW52XTsKICAgICBub19vZl9iYW5kcyA9IGhfY29uLT5uU2ZiW2ZyZXFfcmVzXTsKLSAgICBlbnZOcmdfc2NhbGUgPSBERlJBQ1RfQklUUy1mTm9ybXooKEZJWFBfREJMKW5vX29mX2JhbmRzKTsKLQotICAgIGlmIChpID09IHNob3J0X2VudikgewotICAgICAgc3RvcF9wb3MgLT0gZml4TWF4KDIsIHRpbWVTdGVwKTsgIC8qIGNvbnNpZGVyIGF0IGxlYXN0IDIgUU1GIHNsb3RzIGxlc3MgZm9yIHNob3J0IGVudmVsb3BlcyAoZW52ZWxvcGVzIGp1c3QgYmVmb3JlIHRyYW5zaWVudHMpICovCisgICAgZW52TnJnX3NjYWxlID0gREZSQUNUX0JJVFMgLSBmTm9ybXooKEZJWFBfREJMKW5vX29mX2JhbmRzKTsKKyAgICBpZiAoZW52ID09IHNob3J0X2VudikgeworICAgICAgaiA9IGZNYXgoMiwgdGltZVN0ZXApOyAvKiBjb25zaWRlciBhdCBsZWFzdCAyIFFNRiBzbG90cyBsZXNzIGZvciBzaG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZXMgKGVudmVsb3BlcyBqdXN0IGJlZm9yZSB0cmFuc2llbnRzKSAqLworICAgICAgaWYgKChzdG9wX3BvcyAtIHN0YXJ0X3BvcyAtIGopID4gMCkgeworICAgICAgICBzdG9wX3BvcyA9IHN0b3BfcG9zIC0gajsKKyAgICAgIH0KICAgICB9Ci0KICAgICBmb3IgKGogPSAwOyBqIDwgbm9fb2ZfYmFuZHM7IGorKykgewotICAgICAgRklYUF9EQkwgbnJnTGVmdCAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICAgIEZJWFBfREJMIG5yZ0xlZnQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgIEZJWFBfREJMIG5yZ1JpZ2h0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKICAgICAgIGxpID0gaF9jb24tPmZyZXFCYW5kVGFibGVbZnJlcV9yZXNdW2pdOwogICAgICAgdWkgPSBoX2Nvbi0+ZnJlcUJhbmRUYWJsZVtmcmVxX3Jlc11baiArIDFdOwogCi0gICAgICBpZihmcmVxX3JlcyA9PSBGUkVRX1JFU19ISUdIKXsKLSAgICAgICAgaWYoaiA9PSAwICYmIHVpLWxpID4gMSl7CisgICAgICBpZiAoZnJlcV9yZXMgPT0gRlJFUV9SRVNfSElHSCkgeworICAgICAgICBpZiAoaiA9PSAwICYmIHVpIC0gbGkgPiAxKSB7CiAgICAgICAgICAgbGkrKzsKICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZXsKLSAgICAgICAgaWYoaiA9PSAwICYmIHVpLWxpID4gMil7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoaiA9PSAwICYmIHVpIC0gbGkgPiAyKSB7CiAgICAgICAgICAgbGkrKzsKICAgICAgICAgfQogICAgICAgfQpAQCAtNzY2LDI1ICs4MTYsMjYgQEAKICAgICAgICovCiAgICAgICBtaXNzaW5nSGFybW9uaWNbal0gPSAwOwogCi0gICAgICBpZihoX3Nici0+ZW5jRW52RGF0YS5hZGRIYXJtb25pY0ZsYWcpewotCi0gICAgICAgIGlmKGZyZXFfcmVzID09IEZSRVFfUkVTX0hJR0gpewotICAgICAgICAgIGlmKGhfc2JyLT5lbmNFbnZEYXRhLmFkZEhhcm1vbmljW2pdKXsgICAgLypBIG1pc3Npbmcgc2luZSBpbiB0aGUgY3VycmVudCBiYW5kKi8KKyAgICAgIGlmIChoX3Nici0+ZW5jRW52RGF0YS5hZGRIYXJtb25pY0ZsYWcpIHsKKyAgICAgICAgaWYgKGZyZXFfcmVzID09IEZSRVFfUkVTX0hJR0gpIHsKKyAgICAgICAgICBpZiAoaF9zYnItPmVuY0VudkRhdGEKKyAgICAgICAgICAgICAgICAgIC5hZGRIYXJtb25pY1tqXSkgeyAvKkEgbWlzc2luZyBzaW5lIGluIHRoZSBjdXJyZW50IGJhbmQqLwogICAgICAgICAgICAgbWlzc2luZ0hhcm1vbmljW2pdID0gMTsKICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZXsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBJTlQgaTsKICAgICAgICAgICBJTlQgc3RhcnRCYW5kSGlnaCA9IDA7CiAgICAgICAgICAgSU5UIHN0b3BCYW5kSGlnaCA9IDA7CiAKLSAgICAgICAgICB3aGlsZShoX2Nvbi0+ZnJlcUJhbmRUYWJsZVtGUkVRX1JFU19ISUdIXVtzdGFydEJhbmRIaWdoXSA8IGhfY29uLT5mcmVxQmFuZFRhYmxlW0ZSRVFfUkVTX0xPV11bal0pCisgICAgICAgICAgd2hpbGUgKGhfY29uLT5mcmVxQmFuZFRhYmxlW0ZSRVFfUkVTX0hJR0hdW3N0YXJ0QmFuZEhpZ2hdIDwKKyAgICAgICAgICAgICAgICAgaF9jb24tPmZyZXFCYW5kVGFibGVbRlJFUV9SRVNfTE9XXVtqXSkKICAgICAgICAgICAgIHN0YXJ0QmFuZEhpZ2grKzsKLSAgICAgICAgICB3aGlsZShoX2Nvbi0+ZnJlcUJhbmRUYWJsZVtGUkVRX1JFU19ISUdIXVtzdG9wQmFuZEhpZ2hdIDwgaF9jb24tPmZyZXFCYW5kVGFibGVbRlJFUV9SRVNfTE9XXVtqICsgMV0pCisgICAgICAgICAgd2hpbGUgKGhfY29uLT5mcmVxQmFuZFRhYmxlW0ZSRVFfUkVTX0hJR0hdW3N0b3BCYW5kSGlnaF0gPAorICAgICAgICAgICAgICAgICBoX2Nvbi0+ZnJlcUJhbmRUYWJsZVtGUkVRX1JFU19MT1ddW2ogKyAxXSkKICAgICAgICAgICAgIHN0b3BCYW5kSGlnaCsrOwogCi0gICAgICAgICAgZm9yKGkgPSBzdGFydEJhbmRIaWdoOyBpPHN0b3BCYW5kSGlnaDsgaSsrKXsKLSAgICAgICAgICAgIGlmKGhfc2JyLT5lbmNFbnZEYXRhLmFkZEhhcm1vbmljW2ldKXsKKyAgICAgICAgICBmb3IgKGkgPSBzdGFydEJhbmRIaWdoOyBpIDwgc3RvcEJhbmRIaWdoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChoX3Nici0+ZW5jRW52RGF0YS5hZGRIYXJtb25pY1tpXSkgewogICAgICAgICAgICAgICBtaXNzaW5nSGFybW9uaWNbal0gPSAxOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KQEAgLTc5MiwxMDUgKzg0Myw4MiBAQAogICAgICAgfQogCiAgICAgICAvKgotICAgICAgICBJZiBhIHNpbmUgaXMgbWlzc2luZyBpbiBhIHNjYWxlZmFjdG9yYmFuZCwgd2l0aCBtb3JlIHRoYW4gb25lIHFtZiBjaGFubmVsCi0gICAgICAgIHVzZSB0aGUgbnJnIGZyb20gdGhlIGNoYW5uZWwgd2l0aCB0aGUgbGFyZ2VzdCBucmcgcmF0aGVyIHRoYW4gdGhlIG1lYW4uCi0gICAgICAgIENvbXBlbnNhdGUgZm9yIHRoZSBib29zdCBjYWxjdWxhdGlvbiBpbiB0aGUgZGVjZG9kZXIuCisgICAgICAgIElmIGEgc2luZSBpcyBtaXNzaW5nIGluIGEgc2NhbGVmYWN0b3JiYW5kLCB3aXRoIG1vcmUgdGhhbiBvbmUgcW1mCisgICAgICAgIGNoYW5uZWwgdXNlIHRoZSBucmcgZnJvbSB0aGUgY2hhbm5lbCB3aXRoIHRoZSBsYXJnZXN0IG5yZyByYXRoZXIgdGhhbgorICAgICAgICB0aGUgbWVhbi4gQ29tcGVuc2F0ZSBmb3IgdGhlIGJvb3N0IGNhbGN1bGF0aW9uIGluIHRoZSBkZWNkb2Rlci4KICAgICAgICovCi0gICAgICBpbnQgYm9yZGVyX3BvcyA9IGZpeE1pbihzdG9wX3BvcywgaF9zYnItPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyV3JpdGVPZmZzZXQ8PFlCdWZmZXJTelNoaWZ0KTsKKyAgICAgIGludCBib3JkZXJfcG9zID0KKyAgICAgICAgICBmaXhNaW4oc3RvcF9wb3MsIGhfc2JyLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlcldyaXRlT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgWUJ1ZmZlclN6U2hpZnQpOwogCi0gICAgICBpZihtaXNzaW5nSGFybW9uaWNbal0pewotCisgICAgICBpZiAobWlzc2luZ0hhcm1vbmljW2pdKSB7CiAgICAgICAgIGludCBrOwogICAgICAgICBjb3VudFtqXSA9IHN0b3BfcG9zIC0gc3RhcnRfcG9zOwogICAgICAgICBucmdMZWZ0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKICAgICAgICAgZm9yIChrID0gbGk7IGsgPCB1aTsgaysrKSB7CiAgICAgICAgICAgRklYUF9EQkwgdG1wTnJnOwotICAgICAgICAgIHRtcE5yZyA9IGdldEVudlNmYkVuZXJneShrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcl9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyU3pTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVMZWZ0MCwKKyAgICAgICAgICB0bXBOcmcgPSBnZXRFbnZTZmJFbmVyZ3koaywgayArIDEsIHN0YXJ0X3Bvcywgc3RvcF9wb3MsIGJvcmRlcl9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJMZWZ0LCBZQnVmZmVyU3pTaGlmdCwgc2NhbGVMZWZ0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVMZWZ0MSk7CiAKICAgICAgICAgICBucmdMZWZ0ID0gZml4TWF4KG5yZ0xlZnQsIHRtcE5yZyk7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBFbmVyZ3kgbG93ZXJpbmcgY29tcGVuc2F0aW9uICovCi0gICAgICAgIG5yZ0xlZnQgPSBtaExvd2VyaW5nRW5lcmd5KG5yZ0xlZnQsIHVpLWxpKTsKKyAgICAgICAgbnJnTGVmdCA9IG1oTG93ZXJpbmdFbmVyZ3kobnJnTGVmdCwgdWkgLSBsaSk7CiAKICAgICAgICAgaWYgKHN0ZXJlb01vZGUgPT0gU0JSX0NPVVBMSU5HKSB7Ci0KICAgICAgICAgICBucmdSaWdodCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogCiAgICAgICAgICAgZm9yIChrID0gbGk7IGsgPCB1aTsgaysrKSB7CiAgICAgICAgICAgICBGSVhQX0RCTCB0bXBOcmc7Ci0gICAgICAgICAgICB0bXBOcmcgPSBnZXRFbnZTZmJFbmVyZ3koaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcl9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlclJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJTelNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlUmlnaHQwLAorICAgICAgICAgICAgdG1wTnJnID0gZ2V0RW52U2ZiRW5lcmd5KGssIGsgKyAxLCBzdGFydF9wb3MsIHN0b3BfcG9zLCBib3JkZXJfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJSaWdodCwgWUJ1ZmZlclN6U2hpZnQsIHNjYWxlUmlnaHQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlUmlnaHQxKTsKIAogICAgICAgICAgICAgbnJnUmlnaHQgPSBmaXhNYXgobnJnUmlnaHQsIHRtcE5yZyk7CiAgICAgICAgICAgfQogCiAgICAgICAgICAgLyogRW5lcmd5IGxvd2VyaW5nIGNvbXBlbnNhdGlvbiAqLwotICAgICAgICAgIG5yZ1JpZ2h0ID0gbWhMb3dlcmluZ0VuZXJneShucmdSaWdodCwgdWktbGkpOworICAgICAgICAgIG5yZ1JpZ2h0ID0gbWhMb3dlcmluZ0VuZXJneShucmdSaWdodCwgdWkgLSBsaSk7CiAgICAgICAgIH0KICAgICAgIH0gLyogZW5kIG1pc3NpbmdIYXJtb25pYyAqLwotICAgICAgZWxzZXsKKyAgICAgIGVsc2UgewogICAgICAgICBjb3VudFtqXSA9IChzdG9wX3BvcyAtIHN0YXJ0X3BvcykgKiAodWkgLSBsaSk7CiAKLSAgICAgICAgbnJnTGVmdCA9IGdldEVudlNmYkVuZXJneShsaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyU3pTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUxlZnQwLAorICAgICAgICBucmdMZWZ0ID0gZ2V0RW52U2ZiRW5lcmd5KGxpLCB1aSwgc3RhcnRfcG9zLCBzdG9wX3BvcywgYm9yZGVyX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyTGVmdCwgWUJ1ZmZlclN6U2hpZnQsIHNjYWxlTGVmdDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVMZWZ0MSk7CiAKICAgICAgICAgaWYgKHN0ZXJlb01vZGUgPT0gU0JSX0NPVVBMSU5HKSB7Ci0gICAgICAgICAgbnJnUmlnaHQgPSBnZXRFbnZTZmJFbmVyZ3kobGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcl9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlclJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJTelNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlUmlnaHQwLAorICAgICAgICAgIG5yZ1JpZ2h0ID0gZ2V0RW52U2ZiRW5lcmd5KGxpLCB1aSwgc3RhcnRfcG9zLCBzdG9wX3BvcywgYm9yZGVyX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyUmlnaHQsIFlCdWZmZXJTelNoaWZ0LCBzY2FsZVJpZ2h0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVJpZ2h0MSk7CiAgICAgICAgIH0KICAgICAgIH0gLyogIW1pc3NpbmdIYXJtb25pYyAqLwogCiAgICAgICAvKiBzYXZlIGVuZXJnaWVzICovCi0gICAgICBwTnJnTGVmdFtqXSAgPSBucmdMZWZ0OworICAgICAgcE5yZ0xlZnRbal0gPSBucmdMZWZ0OwogICAgICAgcE5yZ1JpZ2h0W2pdID0gbnJnUmlnaHQ7Ci0gICAgICBlbnZOcmdMZWZ0ICArPSAobnJnTGVmdD4+ZW52TnJnX3NjYWxlKTsKLSAgICAgIGVudk5yZ1JpZ2h0ICs9IChucmdSaWdodD4+ZW52TnJnX3NjYWxlKTsKKyAgICAgIGVudk5yZ0xlZnQgKz0gKG5yZ0xlZnQgPj4gZW52TnJnX3NjYWxlKTsKKyAgICAgIGVudk5yZ1JpZ2h0ICs9IChucmdSaWdodCA+PiBlbnZOcmdfc2NhbGUpOwogICAgIH0gLyogaiAqLwogCiAgICAgZm9yIChqID0gMDsgaiA8IG5vX29mX2JhbmRzOyBqKyspIHsKLQogICAgICAgRklYUF9EQkwgbnJnTGVmdDIgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICAgIEZJWFBfREJMIG5yZ0xlZnQgID0gcE5yZ0xlZnRbal07CisgICAgICBGSVhQX0RCTCBucmdMZWZ0ID0gcE5yZ0xlZnRbal07CiAgICAgICBGSVhQX0RCTCBucmdSaWdodCA9IHBOcmdSaWdodFtqXTsKIAogICAgICAgLyogTm9uZSBtaXNzaW5nIGhhcm1vbmljIEVuZXJneSBsb3dlcmluZyBjb21wZW5zYXRpb24gKi8KLSAgICAgIGlmKCFtaXNzaW5nSGFybW9uaWNbal0gJiYgaF9zYnItPmZMZXZlbFByb3RlY3QpIHsKKyAgICAgIGlmICghbWlzc2luZ0hhcm1vbmljW2pdICYmIGhfc2JyLT5mTGV2ZWxQcm90ZWN0KSB7CiAgICAgICAgIC8qIGluIGNhc2Ugb2YgbWlzc2luZyBlbmVyZ3kgaW4gYmFzZSBiYW5kLAogICAgICAgICAgICByZWR1Y2UgcmVmZXJlbmNlIGVuZXJneSB0byBwcmV2ZW50IG92ZXJmbG93cyBpbiBkZWNvZGVyIG91dHB1dCAqLwotICAgICAgICBucmdMZWZ0ID0gbm1oTG93ZXJpbmdFbmVyZ3kobnJnTGVmdCwgZW52TnJnTGVmdCwgZW52TnJnX3NjYWxlLCBub19vZl9iYW5kcyk7CisgICAgICAgIG5yZ0xlZnQgPQorICAgICAgICAgICAgbm1oTG93ZXJpbmdFbmVyZ3kobnJnTGVmdCwgZW52TnJnTGVmdCwgZW52TnJnX3NjYWxlLCBub19vZl9iYW5kcyk7CiAgICAgICAgIGlmIChzdGVyZW9Nb2RlID09IFNCUl9DT1VQTElORykgewotICAgICAgICAgIG5yZ1JpZ2h0ID0gbm1oTG93ZXJpbmdFbmVyZ3kobnJnUmlnaHQsIGVudk5yZ1JpZ2h0LCBlbnZOcmdfc2NhbGUsIG5vX29mX2JhbmRzKTsKKyAgICAgICAgICBucmdSaWdodCA9IG5taExvd2VyaW5nRW5lcmd5KG5yZ1JpZ2h0LCBlbnZOcmdSaWdodCwgZW52TnJnX3NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9fb2ZfYmFuZHMpOwogICAgICAgICB9CiAgICAgICB9CiAKQEAgLTkwMCwzMSArOTI4LDM0IEBACiAgICAgICAgIG5yZ0xlZnQgPSAobnJnUmlnaHQgKyBucmdMZWZ0KSA+PiAxOwogICAgICAgfQogCi0gICAgICAvKiBucmdMZWZ0ID0gZjIwX2xvZzIobnJnTGVmdCAvIChQRkxPQVQpKGNvdW50ICogaF9zYnItPnNiclFtZi5ub19jaGFubmVscykpKyhQRkxPQVQpNDQ7ICovCisgICAgICAvKiBucmdMZWZ0ID0gZjIwX2xvZzIobnJnTGVmdCAvIChQRkxPQVQpKGNvdW50ICogNjQpKSsoUEZMT0FUKTQ0OyAqLwogICAgICAgLyogSWYgbnJnTGVmdCA9PSAwIHRoZW4gdGhlIExvZyBjYWxjdWxhdGlvbnMgYmVsb3cgZG8gZmFpbC4gKi8KLSAgICAgIGlmIChucmdMZWZ0ID4gRkwyRlhDT05TVF9EQkwoMC4wZikpCi0gICAgICB7Ci0gICAgICAgIEZJWFBfREJMIHRtcDAsdG1wMSx0bXAyLHRtcDM7CisgICAgICBpZiAobnJnTGVmdCA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICAgIEZJWFBfREJMIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CiAgICAgICAgIElOVCB0bXBTY2FsZTsKIAogICAgICAgICB0bXBTY2FsZSA9IENvdW50TGVhZGluZ0JpdHMobnJnTGVmdCk7CiAgICAgICAgIG5yZ0xlZnQgPSBucmdMZWZ0IDw8IHRtcFNjYWxlOwogCi0gICAgICAgIHRtcDAgPSBDYWxjTGREYXRhKG5yZ0xlZnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZWQgYnkgMS82NCAqLwotICAgICAgICB0bXAxID0gKChGSVhQX0RCTCkgKGNvbW1vblNjYWxlK3RtcFNjYWxlKSkgPDwgKERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVC0xKTsgICAgLyogc2NhbGVkIGJ5IDEvNjQgKi8KLSAgICAgICAgdG1wMiA9ICgoRklYUF9EQkwpKGNvdW50W2pdKmhfY29uLT5ub1FtZkJhbmRzKSkgPDwgKERGUkFDVF9CSVRTLTEtMTQtMSk7Ci0gICAgICAgIHRtcDIgPSBDYWxjTGREYXRhKHRtcDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZWQgYnkgMS82NCAqLwotICAgICAgICB0bXAzID0gRkwyRlhDT05TVF9EQkwoMC42ODc1Zi0wLjIxODc1Zi0wLjAxNTYyNWYpPj4xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGVkIGJ5IDEvNjQgKi8KKyAgICAgICAgdG1wMCA9IENhbGNMZERhdGEobnJnTGVmdCk7IC8qIHNjYWxlZCBieSAxLzY0ICovCisgICAgICAgIHRtcDEgPSAoKEZJWFBfREJMKShjb21tb25TY2FsZSArIHRtcFNjYWxlKSkKKyAgICAgICAgICAgICAgIDw8IChERlJBQ1RfQklUUyAtIDEgLSBMRF9EQVRBX1NISUZUIC0gMSk7IC8qIHNjYWxlZCBieSAxLzY0ICovCisgICAgICAgIHRtcDIgPSAoKEZJWFBfREJMKShjb3VudFtqXSAqIDY0KSkgPDwgKERGUkFDVF9CSVRTIC0gMSAtIDE0IC0gMSk7CisgICAgICAgIHRtcDIgPSBDYWxjTGREYXRhKHRtcDIpOyAvKiBzY2FsZWQgYnkgMS82NCAqLworICAgICAgICB0bXAzID0gRkwyRlhDT05TVF9EQkwoMC42ODc1ZiAtIDAuMjE4NzVmIC0gMC4wMTU2MjVmKSA+PgorICAgICAgICAgICAgICAgMTsgLyogc2NhbGVkIGJ5IDEvNjQgKi8KIAotICAgICAgICBucmdMZWZ0ID0gKCh0bXAwLXRtcDIpPj4xKSArICh0bXAzIC0gdG1wMSk7CisgICAgICAgIG5yZ0xlZnQgPSAoKHRtcDAgLSB0bXAyKSA+PiAxKSArICh0bXAzIC0gdG1wMSk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBucmdMZWZ0ID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOwogICAgICAgfQogCiAgICAgICAvKiBsZDY0IHRvIGludGVnZXIgY29udmVyc2lvbiAqLwotICAgICAgbnJnTGVmdCA9IGZpeE1pbihmaXhNYXgobnJnTGVmdCxGTDJGWENPTlNUX0RCTCgwLjBmKSksKEZMMkZYQ09OU1RfREJMKDAuNWYpPj5vbmVCaXRMZXNzKSk7Ci0gICAgICBucmdMZWZ0ID0gKEZJWFBfREJMKShMT05HKW5yZ0xlZnQgPj4gKERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVC0xLW9uZUJpdExlc3MtMSk7Ci0gICAgICBzZmJfbnJnTGVmdFttXSA9ICgoSU5UKW5yZ0xlZnQrMSk+PjE7IC8qIHJvdW5kaW5nICovCisgICAgICBucmdMZWZ0ID0gZml4TWluKGZpeE1heChucmdMZWZ0LCBGTDJGWENPTlNUX0RCTCgwLjBmKSksCisgICAgICAgICAgICAgICAgICAgICAgIChGTDJGWENPTlNUX0RCTCgwLjVmKSA+PiBvbmVCaXRMZXNzKSk7CisgICAgICBucmdMZWZ0ID0gKEZJWFBfREJMKShMT05HKW5yZ0xlZnQgPj4KKyAgICAgICAgICAgICAgICAoREZSQUNUX0JJVFMgLSAxIC0gTERfREFUQV9TSElGVCAtIDEgLSBvbmVCaXRMZXNzIC0gMSk7CisgICAgICBzZmJfbnJnTGVmdFttXSA9ICgoSU5UKW5yZ0xlZnQgKyAxKSA+PiAxOyAvKiByb3VuZGluZyAqLwogCiAgICAgICBpZiAoc3RlcmVvTW9kZSA9PSBTQlJfQ09VUExJTkcpIHsKICAgICAgICAgRklYUF9EQkwgc2NhbGVGcmFjdDsKQEAgLTkzNiwxNCArOTY3LDIwIEBACiAgICAgICAgIHNjMCA9IENvdW50TGVhZGluZ0JpdHMobnJnTGVmdDIpOwogICAgICAgICBzYzEgPSBDb3VudExlYWRpbmdCaXRzKG5yZ1JpZ2h0KTsKIAotICAgICAgICBzY2FsZUZyYWN0ID0gKChGSVhQX0RCTCkoc2MwLXNjMSkpIDw8IChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQpOyAvKiBzY2FsZSB2YWx1ZSBpbiBsZDY0IHJlcHJlc2VudGF0aW9uICovCi0gICAgICAgIG5yZ1JpZ2h0ID0gQ2FsY0xkRGF0YShucmdMZWZ0Mjw8c2MwKSAtIENhbGNMZERhdGEobnJnUmlnaHQ8PHNjMSkgLSBzY2FsZUZyYWN0OworICAgICAgICBzY2FsZUZyYWN0ID0KKyAgICAgICAgICAgICgoRklYUF9EQkwpKHNjMCAtIHNjMSkpCisgICAgICAgICAgICA8PCAoREZSQUNUX0JJVFMgLSAxIC0KKyAgICAgICAgICAgICAgICBMRF9EQVRBX1NISUZUKTsgLyogc2NhbGUgdmFsdWUgaW4gbGQ2NCByZXByZXNlbnRhdGlvbiAqLworICAgICAgICBucmdSaWdodCA9IENhbGNMZERhdGEobnJnTGVmdDIgPDwgc2MwKSAtIENhbGNMZERhdGEobnJnUmlnaHQgPDwgc2MxKSAtCisgICAgICAgICAgICAgICAgICAgc2NhbGVGcmFjdDsKIAogICAgICAgICAvKiBsZDY0IHRvIGludGVnZXIgY29udmVyc2lvbiAqLwotICAgICAgICBucmdSaWdodCA9IChGSVhQX0RCTCkoTE9ORykobnJnUmlnaHQpID4+IChERlJBQ1RfQklUUy0xLUxEX0RBVEFfU0hJRlQtMS1vbmVCaXRMZXNzKTsKLSAgICAgICAgbnJnUmlnaHQgID0gKG5yZ1JpZ2h0KyhGSVhQX0RCTCkxKT4+MTsgLyogcm91bmRpbmcgKi8KKyAgICAgICAgbnJnUmlnaHQgPSAoRklYUF9EQkwpKExPTkcpKG5yZ1JpZ2h0KSA+PgorICAgICAgICAgICAgICAgICAgIChERlJBQ1RfQklUUyAtIDEgLSBMRF9EQVRBX1NISUZUIC0gMSAtIG9uZUJpdExlc3MpOworICAgICAgICBucmdSaWdodCA9IChucmdSaWdodCArIChGSVhQX0RCTCkxKSA+PiAxOyAvKiByb3VuZGluZyAqLwogCi0gICAgICAgIHNmYl9ucmdSaWdodFttXSA9IG1hcFBhbm9yYW1hIChucmdSaWdodCxoX3Nici0+ZW5jRW52RGF0YS5pbml0X3Nicl9hbXBfcmVzLCZxdWFudEVycm9yKTsKKyAgICAgICAgc2ZiX25yZ1JpZ2h0W21dID0gbWFwUGFub3JhbWEoCisgICAgICAgICAgICBucmdSaWdodCwgaF9zYnItPmVuY0VudkRhdGEuaW5pdF9zYnJfYW1wX3JlcywgJnF1YW50RXJyb3IpOwogCiAgICAgICAgICptYXhRdWFudEVycm9yID0gZml4TWF4KHF1YW50RXJyb3IsICptYXhRdWFudEVycm9yKTsKICAgICAgIH0KQEAgLTk1MSwyMSArOTg4LDI1IEBACiAgICAgICBtKys7CiAgICAgfSAvKiBqICovCiAKLSAgICAgLyogRG8gZW5lcmd5IGNvbXBlbnNhdGlvbiBmb3Igc2luZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0d28KLSAgICAgICAgIFFNRi1iYW5kcyBpbiB0aGUgb3JpZ2luYWwsIGJ1dCB3aWxsIG9ubHkgb2NjdXIgaW4gb25lIGJhbmQgaW4KLSAgICAgICAgIHRoZSBkZWNvZGVyIGR1ZSB0byB0aGUgc3ludGhldGljIHNpbmUgY29kaW5nLiovCisgICAgLyogRG8gZW5lcmd5IGNvbXBlbnNhdGlvbiBmb3Igc2luZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0d28KKyAgICAgICAgUU1GLWJhbmRzIGluIHRoZSBvcmlnaW5hbCwgYnV0IHdpbGwgb25seSBvY2N1ciBpbiBvbmUgYmFuZCBpbgorICAgICAgICB0aGUgZGVjb2RlciBkdWUgdG8gdGhlIHN5bnRoZXRpYyBzaW5lIGNvZGluZy4qLwogICAgIGlmIChoX2Nvbi0+dXNlUGFyYW1ldHJpY0NvZGluZykgewotICAgICAgbS09bm9fb2ZfYmFuZHM7CisgICAgICBtIC09IG5vX29mX2JhbmRzOwogICAgICAgZm9yIChqID0gMDsgaiA8IG5vX29mX2JhbmRzOyBqKyspIHsKLSAgICAgICAgaWYgKGZyZXFfcmVzPT1GUkVRX1JFU19ISUdIICYmIGhfc2JyLT5zYnJFeHRyYWN0RW52ZWxvcGUuZW52ZWxvcGVDb21wZW5zYXRpb25bal0pewotICAgICAgICAgIHNmYl9ucmdMZWZ0W21dIC09IChjYSAqIGZpeHBfYWJzKChJTlQpaF9zYnItPnNickV4dHJhY3RFbnZlbG9wZS5lbnZlbG9wZUNvbXBlbnNhdGlvbltqXSkpOworICAgICAgICBpZiAoZnJlcV9yZXMgPT0gRlJFUV9SRVNfSElHSCAmJgorICAgICAgICAgICAgaF9zYnItPnNickV4dHJhY3RFbnZlbG9wZS5lbnZlbG9wZUNvbXBlbnNhdGlvbltqXSkgeworICAgICAgICAgIHNmYl9ucmdMZWZ0W21dIC09CisgICAgICAgICAgICAgIChjYSAqCisgICAgICAgICAgICAgICBmaXhwX2FicygKKyAgICAgICAgICAgICAgICAgICAoSU5UKWhfc2JyLT5zYnJFeHRyYWN0RW52ZWxvcGUuZW52ZWxvcGVDb21wZW5zYXRpb25bal0pKTsKICAgICAgICAgfQogICAgICAgICBzZmJfbnJnTGVmdFttXSA9IGZpeE1heCgwLCBzZmJfbnJnTGVmdFttXSk7CiAgICAgICAgIG0rKzsKICAgICAgIH0KICAgICB9IC8qIHVzZVBhcmFtZXRyaWNDb2RpbmcgKi8KIAotICB9IC8qIGkqLworICB9IC8qIGVudiBsb29wICovCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05ODQsOTYgKzEwMjUsNzMgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIExOS19TRUNUSU9OX0NPREVfTDEKLXZvaWQKLUZES3NickVuY19leHRyYWN0U2JyRW52ZWxvcGUxICgKLSAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSBoX2NvbiwgLyohIGhhbmRsZSB0byBjb25maWcgZGF0YSAgICovCi0gICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgc2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSBzYnJCaXRzdHJlYW1EYXRhLAotICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgaEVudkNoYW4sCi0gICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSBoQ21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFNCUl9FTlZfVEVNUF9EQVRBICAgKmVEYXRhLAotICAgICAgICAgICAgICAgICAgICBTQlJfRlJBTUVfVEVNUF9EQVRBICpmRGF0YQotICAgICAgICAgICAgICAgICAgICkKLXsKLQordm9pZCBGREtzYnJFbmNfZXh0cmFjdFNickVudmVsb3BlMSgKKyAgICBIQU5ETEVfU0JSX0NPTkZJR19EQVRBIGhfY29uLCAvKiEgaGFuZGxlIHRvIGNvbmZpZyBkYXRhICAgKi8KKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIHNickhlYWRlckRhdGEsCisgICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSBzYnJCaXRzdHJlYW1EYXRhLCBIQU5ETEVfRU5WX0NIQU5ORUwgaEVudkNoYW4sCisgICAgSEFORExFX0NPTU1PTl9EQVRBIGhDbW9uRGF0YSwgU0JSX0VOVl9URU1QX0RBVEEgKmVEYXRhLAorICAgIFNCUl9GUkFNRV9URU1QX0RBVEEgKmZEYXRhKSB7CiAgIEhBTkRMRV9TQlJfRVhUUkFDVF9FTlZFTE9QRSBzYnJFeHRyRW52ID0gJmhFbnZDaGFuLT5zYnJFeHRyYWN0RW52ZWxvcGU7CiAKICAgaWYgKHNickV4dHJFbnYtPllCdWZmZXJTelNoaWZ0ID09IDApCi0gICAgRkRLc2JyRW5jX2dldEVuZXJneUZyb21DcGx4UW1mRGF0YUZ1bGwoJnNickV4dHJFbnYtPllCdWZmZXJbc2JyRXh0ckVudi0+WUJ1ZmZlcldyaXRlT2Zmc2V0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5yQnVmZmVyICsgc2JyRXh0ckVudi0+ckJ1ZmZlclJlYWRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+aUJ1ZmZlciArIHNickV4dHJFbnYtPnJCdWZmZXJSZWFkT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLT5ub1FtZkJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPm5vX2NvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudkNoYW4tPnFtZlNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNickV4dHJFbnYtPllCdWZmZXJTY2FsZVsxXSk7CisgICAgRkRLc2JyRW5jX2dldEVuZXJneUZyb21DcGx4UW1mRGF0YUZ1bGwoCisgICAgICAgICZzYnJFeHRyRW52LT5ZQnVmZmVyW3NickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldF0sCisgICAgICAgIHNickV4dHJFbnYtPnJCdWZmZXIgKyBzYnJFeHRyRW52LT5yQnVmZmVyUmVhZE9mZnNldCwKKyAgICAgICAgc2JyRXh0ckVudi0+aUJ1ZmZlciArIHNickV4dHJFbnYtPnJCdWZmZXJSZWFkT2Zmc2V0LCBoX2Nvbi0+bm9RbWZCYW5kcywKKyAgICAgICAgc2JyRXh0ckVudi0+bm9fY29scywgJmhFbnZDaGFuLT5xbWZTY2FsZSwgJnNickV4dHJFbnYtPllCdWZmZXJTY2FsZVsxXSk7CiAgIGVsc2UKLSAgICBGREtzYnJFbmNfZ2V0RW5lcmd5RnJvbUNwbHhRbWZEYXRhKCZzYnJFeHRyRW52LT5ZQnVmZmVyW3NickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5yQnVmZmVyICsgc2JyRXh0ckVudi0+ckJ1ZmZlclJlYWRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5pQnVmZmVyICsgc2JyRXh0ckVudi0+ckJ1ZmZlclJlYWRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2Nvbi0+bm9RbWZCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPm5vX2NvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52Q2hhbi0+cW1mU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYnJFeHRyRW52LT5ZQnVmZmVyU2NhbGVbMV0pOworICAgIEZES3NickVuY19nZXRFbmVyZ3lGcm9tQ3BseFFtZkRhdGEoCisgICAgICAgICZzYnJFeHRyRW52LT5ZQnVmZmVyW3NickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldF0sCisgICAgICAgIHNickV4dHJFbnYtPnJCdWZmZXIgKyBzYnJFeHRyRW52LT5yQnVmZmVyUmVhZE9mZnNldCwKKyAgICAgICAgc2JyRXh0ckVudi0+aUJ1ZmZlciArIHNickV4dHJFbnYtPnJCdWZmZXJSZWFkT2Zmc2V0LCBoX2Nvbi0+bm9RbWZCYW5kcywKKyAgICAgICAgc2JyRXh0ckVudi0+bm9fY29scywgJmhFbnZDaGFuLT5xbWZTY2FsZSwgJnNickV4dHJFbnYtPllCdWZmZXJTY2FsZVsxXSk7CiAKLQorICAvKiBFbmVyZ2llIHZhbHVlcyA9CisgICAqIHNickV4dHJFbnYtPllCdWZmZXJbc2JyRXh0ckVudi0+WUJ1ZmZlcldyaXRlT2Zmc2V0XVt4XS5mbG9hdFZhbCAqCisgICAqICgxPDwyKjctc2JyRXh0ckVudi0+WUJ1ZmZlclNjYWxlWzFdKSAqLwogCiAgIC8qCiAgICAgUHJlY2FsY3VsYXRpb24gb2YgVG9uYWxpdHkgUXVvdGFzICBDT0VGRiBUcmFuc2Zvcm0gT0sKICAgKi8KLSAgRkRLc2JyRW5jX0NhbGN1bGF0ZVRvbmFsaXR5UXVvdGFzKCZoRW52Q2hhbi0+VG9uQ29yciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5yQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPmlCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPmZyZXFCYW5kVGFibGVbSEldW2hfY29uLT5uU2ZiW0hJXV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudkNoYW4tPnFtZlNjYWxlKTsKKyAgRkRLc2JyRW5jX0NhbGN1bGF0ZVRvbmFsaXR5UXVvdGFzKAorICAgICAgJmhFbnZDaGFuLT5Ub25Db3JyLCBzYnJFeHRyRW52LT5yQnVmZmVyLCBzYnJFeHRyRW52LT5pQnVmZmVyLAorICAgICAgaF9jb24tPmZyZXFCYW5kVGFibGVbSEldW2hfY29uLT5uU2ZiW0hJXV0sIGhFbnZDaGFuLT5xbWZTY2FsZSk7CiAKLQotICBpZihoX2Nvbi0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgewotICAgIEZJWFBfREJMIHRvbmFsaXR5ID0gRkRLc2JyRW5jX0dldFRvbmFsaXR5ICgKLSAgICAgICAgICBoRW52Q2hhbi0+VG9uQ29yci5xdW90YU1hdHJpeCwKLSAgICAgICAgICBoRW52Q2hhbi0+VG9uQ29yci5udW1iZXJPZkVzdGltYXRlc1BlckZyYW1lLAotICAgICAgICAgIGhFbnZDaGFuLT5Ub25Db3JyLnN0YXJ0SW5kZXhNYXRyaXgsCi0gICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlciArIHNickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldCwKLSAgICAgICAgICBoX2Nvbi0+ZnJlcUJhbmRUYWJsZVtISV1bMF0rMSwKLSAgICAgICAgICBoX2Nvbi0+bm9RbWZCYW5kcywKLSAgICAgICAgICBzYnJFeHRyRW52LT5ub19jb2xzCi0gICAgICAgICk7CisgIGlmIChoX2Nvbi0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgeworICAgIEZJWFBfREJMIHRvbmFsaXR5ID0gRkRLc2JyRW5jX0dldFRvbmFsaXR5KAorICAgICAgICBoRW52Q2hhbi0+VG9uQ29yci5xdW90YU1hdHJpeCwKKyAgICAgICAgaEVudkNoYW4tPlRvbkNvcnIubnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSwKKyAgICAgICAgaEVudkNoYW4tPlRvbkNvcnIuc3RhcnRJbmRleE1hdHJpeCwKKyAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlciArIHNickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldCwKKyAgICAgICAgaF9jb24tPmZyZXFCYW5kVGFibGVbSEldWzBdICsgMSwgaF9jb24tPm5vUW1mQmFuZHMsCisgICAgICAgIHNickV4dHJFbnYtPm5vX2NvbHMpOwogCiAgICAgaEVudkNoYW4tPmVuY0VudkRhdGEudG9uX0hGWzFdID0gaEVudkNoYW4tPmVuY0VudkRhdGEudG9uX0hGWzBdOwogICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLnRvbl9IRlswXSA9IHRvbmFsaXR5OwogCiAgICAgLyogdG9uYWxpdHkgaXMgc2NhbGVkIGJ5IDJeMTkvMC41MjQyODhmIChmcmFjdCBwYXJ0IG9mIFJFTEFYQVRJT04pICovCi0gICAgaEVudkNoYW4tPmVuY0VudkRhdGEuZ2xvYmFsX3RvbmFsaXR5ID0gKGhFbnZDaGFuLT5lbmNFbnZEYXRhLnRvbl9IRlswXT4+MSkgKyAoaEVudkNoYW4tPmVuY0VudkRhdGEudG9uX0hGWzFdPj4xKTsKKyAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5nbG9iYWxfdG9uYWxpdHkgPQorICAgICAgICAoaEVudkNoYW4tPmVuY0VudkRhdGEudG9uX0hGWzBdID4+IDEpICsKKyAgICAgICAgKGhFbnZDaGFuLT5lbmNFbnZEYXRhLnRvbl9IRlsxXSA+PiAxKTsKICAgfQogCi0KLQogICAvKgogICAgIFRyYW5zaWVudCBkZXRlY3Rpb24gQ09FRkYgVHJhbnNmb3JtIE9LCiAgICovCi0gIGlmKGhfY29uLT5zYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKQotICB7Ci0gICAgRkRLc2JyRW5jX2Zhc3RUcmFuc2llbnREZXRlY3QoCi0gICAgICAgICAgICAmaEVudkNoYW4tPnNickZhc3RUcmFuc2llbnREZXRlY3RvciwKLSAgICAgICAgICAgICBzYnJFeHRyRW52LT5ZQnVmZmVyLAotICAgICAgICAgICAgIHNickV4dHJFbnYtPllCdWZmZXJTY2FsZSwKLSAgICAgICAgICAgICBzYnJFeHRyRW52LT5ZQnVmZmVyV3JpdGVPZmZzZXQsCi0gICAgICAgICAgICAgZURhdGEtPnRyYW5zaWVudF9pbmZvCi0gICAgICAgICAgICAgKTsKIAorICBpZiAoaF9jb24tPnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpIHsKKyAgICBGREtzYnJFbmNfZmFzdFRyYW5zaWVudERldGVjdCgmaEVudkNoYW4tPnNickZhc3RUcmFuc2llbnREZXRlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ZQnVmZmVyLCBzYnJFeHRyRW52LT5ZQnVmZmVyU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlcldyaXRlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhLT50cmFuc2llbnRfaW5mbyk7CisKKyAgfSBlbHNlIHsKKyAgICBGREtzYnJFbmNfdHJhbnNpZW50RGV0ZWN0KAorICAgICAgICAmaEVudkNoYW4tPnNiclRyYW5zaWVudERldGVjdG9yLCBzYnJFeHRyRW52LT5ZQnVmZmVyLAorICAgICAgICBzYnJFeHRyRW52LT5ZQnVmZmVyU2NhbGUsIGVEYXRhLT50cmFuc2llbnRfaW5mbywKKyAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlcldyaXRlT2Zmc2V0LCBzYnJFeHRyRW52LT5ZQnVmZmVyU3pTaGlmdCwKKyAgICAgICAgc2JyRXh0ckVudi0+dGltZV9zdGVwLCBoRW52Q2hhbi0+U2JyRW52RnJhbWUuZnJhbWVNaWRkbGVTbG90KTsKICAgfQotICBlbHNlCi0gIHsKLSAgRkRLc2JyRW5jX3RyYW5zaWVudERldGVjdCgmaEVudkNoYW4tPnNiclRyYW5zaWVudERldGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ZQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ZQnVmZmVyU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhLT50cmFuc2llbnRfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlcldyaXRlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ZQnVmZmVyU3pTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+dGltZV9zdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52Q2hhbi0+U2JyRW52RnJhbWUuZnJhbWVNaWRkbGVTbG90KTsKLSAgfQotCi0KIAogICAvKgogICAgIEdlbmVyYXRlIGZsYWdzIGZvciAyIGVudiBpbiBhIEZJWEZJWC1mcmFtZS4KQEAgLTEwODMsMTkgKzExMDEsMTIgQEAKICAgLyoKICAgICBmcmFtZSBTcGxpdHRlciBDT0VGRiBUcmFuc2Zvcm0gT0sKICAgKi8KLSAgRkRLc2JyRW5jX2ZyYW1lU3BsaXR0ZXIoc2JyRXh0ckVudi0+WUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlclNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52Q2hhbi0+c2JyVHJhbnNpZW50RGV0ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLT5mcmVxQmFuZFRhYmxlWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YS0+dHJhbnNpZW50X2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlclN6U2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLT5uU2ZiWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT50aW1lX3N0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPm5vX2NvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnZDaGFuLT5lbmNFbnZEYXRhLmdsb2JhbF90b25hbGl0eSk7Ci0KLQorICBGREtzYnJFbmNfZnJhbWVTcGxpdHRlcigKKyAgICAgIHNickV4dHJFbnYtPllCdWZmZXIsIHNickV4dHJFbnYtPllCdWZmZXJTY2FsZSwKKyAgICAgICZoRW52Q2hhbi0+c2JyVHJhbnNpZW50RGV0ZWN0b3IsIGhfY29uLT5mcmVxQmFuZFRhYmxlWzFdLAorICAgICAgZURhdGEtPnRyYW5zaWVudF9pbmZvLCBzYnJFeHRyRW52LT5ZQnVmZmVyV3JpdGVPZmZzZXQsCisgICAgICBzYnJFeHRyRW52LT5ZQnVmZmVyU3pTaGlmdCwgaF9jb24tPm5TZmJbMV0sIHNickV4dHJFbnYtPnRpbWVfc3RlcCwKKyAgICAgIHNickV4dHJFbnYtPm5vX2NvbHMsICZoRW52Q2hhbi0+ZW5jRW52RGF0YS5nbG9iYWxfdG9uYWxpdHkpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTEyOCw1MyArMTEzOSw0NSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogTE5LX1NFQ1RJT05fQ09ERV9MMQotdm9pZAotRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZTIgKAotICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0NPTkZJR19EQVRBIGhfY29uLCAvKiEgaGFuZGxlIHRvIGNvbmZpZyBkYXRhICAgKi8KLSAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gICAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgc2JyQml0c3RyZWFtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgSEFORExFX0VOVl9DSEFOTkVMICAgaF9lbnZDaGFuMCwKLSAgICAgICAgICAgICAgICAgICAgSEFORExFX0VOVl9DSEFOTkVMICAgaF9lbnZDaGFuMSwKLSAgICAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBICAgaENtb25EYXRhLAotICAgICAgICAgICAgICAgICAgICBTQlJfRU5WX1RFTVBfREFUQSAgICplRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU0JSX0ZSQU1FX1RFTVBfREFUQSAqZkRhdGEsCi0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGNsZWFyT3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgKQotewordm9pZCBGREtzYnJFbmNfZXh0cmFjdFNickVudmVsb3BlMigKKyAgICBIQU5ETEVfU0JSX0NPTkZJR19EQVRBIGhfY29uLCAvKiEgaGFuZGxlIHRvIGNvbmZpZyBkYXRhICAgKi8KKyAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIHNickhlYWRlckRhdGEsCisgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvLAorICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgc2JyQml0c3RyZWFtRGF0YSwgSEFORExFX0VOVl9DSEFOTkVMIGhfZW52Q2hhbjAsCisgICAgSEFORExFX0VOVl9DSEFOTkVMIGhfZW52Q2hhbjEsIEhBTkRMRV9DT01NT05fREFUQSBoQ21vbkRhdGEsCisgICAgU0JSX0VOVl9URU1QX0RBVEEgKmVEYXRhLCBTQlJfRlJBTUVfVEVNUF9EQVRBICpmRGF0YSwgaW50IGNsZWFyT3V0cHV0KSB7CiAgIEhBTkRMRV9FTlZfQ0hBTk5FTCBoX2VudkNoYW5bTUFYX05VTV9DSEFOTkVMU10gPSB7aF9lbnZDaGFuMCwgaF9lbnZDaGFuMX07CiAgIGludCBjaCwgaSwgaiwgYywgWVN6U2hpZnQgPSBoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU3pTaGlmdDsKIAogICBTQlJfU1RFUkVPX01PREUgc3RlcmVvTW9kZSA9IGhfY29uLT5zdGVyZW9Nb2RlOwogICBpbnQgbkNoYW5uZWxzID0gaF9jb24tPm5DaGFubmVsczsKICAgY29uc3QgaW50ICp2X3R1bmluZzsKLSAgc3RhdGljIGNvbnN0IGludCB2X3R1bmluZ0hFQUFDWzZdID0geyAwLCAyLCA0LCAwLCAwLCAwIH07CisgIHN0YXRpYyBjb25zdCBpbnQgdl90dW5pbmdIRUFBQ1s2XSA9IHswLCAyLCA0LCAwLCAwLCAwfTsKIAotICBzdGF0aWMgY29uc3QgaW50IHZfdHVuaW5nRUxEWzZdID0geyAwLCAyLCAzLCAwLCAwLCAwIH07CisgIHN0YXRpYyBjb25zdCBpbnQgdl90dW5pbmdFTERbNl0gPSB7MCwgMiwgMywgMCwgMCwgMH07CiAKICAgaWYgKGhfY29uLT5zYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKQogICAgIHZfdHVuaW5nID0gdl90dW5pbmdFTEQ7CiAgIGVsc2UKICAgICB2X3R1bmluZyA9IHZfdHVuaW5nSEVBQUM7CiAKLQogICAvKgogICAgIFNlbGVjdCBzdGVyZW8gbW9kZS4KICAgKi8KICAgaWYgKHN0ZXJlb01vZGUgPT0gU0JSX0NPVVBMSU5HKSB7CiAgICAgaWYgKGVEYXRhWzBdLnRyYW5zaWVudF9pbmZvWzFdICYmIGVEYXRhWzFdLnRyYW5zaWVudF9pbmZvWzFdKSB7Ci0gICAgICBlRGF0YVswXS50cmFuc2llbnRfaW5mb1swXSA9IGZpeE1pbihlRGF0YVsxXS50cmFuc2llbnRfaW5mb1swXSwgZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF0pOworICAgICAgZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF0gPQorICAgICAgICAgIGZpeE1pbihlRGF0YVsxXS50cmFuc2llbnRfaW5mb1swXSwgZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF0pOwogICAgICAgZURhdGFbMV0udHJhbnNpZW50X2luZm9bMF0gPSBlRGF0YVswXS50cmFuc2llbnRfaW5mb1swXTsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIGlmIChlRGF0YVswXS50cmFuc2llbnRfaW5mb1sxXSAmJiAhZURhdGFbMV0udHJhbnNpZW50X2luZm9bMV0pIHsKICAgICAgICAgZURhdGFbMV0udHJhbnNpZW50X2luZm9bMF0gPSBlRGF0YVswXS50cmFuc2llbnRfaW5mb1swXTsKLSAgICAgIH0KLSAgICAgIGVsc2UgeworICAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCFlRGF0YVswXS50cmFuc2llbnRfaW5mb1sxXSAmJiBlRGF0YVsxXS50cmFuc2llbnRfaW5mb1sxXSkKICAgICAgICAgICBlRGF0YVswXS50cmFuc2llbnRfaW5mb1swXSA9IGVEYXRhWzFdLnRyYW5zaWVudF9pbmZvWzBdOwogICAgICAgICBlbHNlIHsKLSAgICAgICAgICBlRGF0YVswXS50cmFuc2llbnRfaW5mb1swXSA9IGZpeE1heChlRGF0YVsxXS50cmFuc2llbnRfaW5mb1swXSwgZURhdGFbMF0udHJhbnNpZW50X2luZm9bMF0pOworICAgICAgICAgIGVEYXRhWzBdLnRyYW5zaWVudF9pbmZvWzBdID0KKyAgICAgICAgICAgICAgZml4TWF4KGVEYXRhWzFdLnRyYW5zaWVudF9pbmZvWzBdLCBlRGF0YVswXS50cmFuc2llbnRfaW5mb1swXSk7CiAgICAgICAgICAgZURhdGFbMV0udHJhbnNpZW50X2luZm9bMF0gPSBlRGF0YVswXS50cmFuc2llbnRfaW5mb1swXTsKICAgICAgICAgfQogICAgICAgfQpAQCAtMTE4NCwxODMgKzExODcsMTcxIEBACiAgIC8qCiAgICAgRGV0ZXJtaW5lIHRpbWUvZnJlcXVlbmN5IGRpdmlzaW9uIG9mIGN1cnJlbnQgZ3JhbnVsZQogICAqLwotICBlRGF0YVswXS5mcmFtZV9pbmZvID0gRkRLc2JyRW5jX2ZyYW1lSW5mb0dlbmVyYXRvcigmaF9lbnZDaGFuWzBdLT5TYnJFbnZGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMF0udHJhbnNpZW50X2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLnByZV90cmFuc2llbnRfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmxkR3JpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl90dW5pbmcpOworICBlRGF0YVswXS5mcmFtZV9pbmZvID0gRkRLc2JyRW5jX2ZyYW1lSW5mb0dlbmVyYXRvcigKKyAgICAgICZoX2VudkNoYW5bMF0tPlNickVudkZyYW1lLCBlRGF0YVswXS50cmFuc2llbnRfaW5mbywKKyAgICAgIHNickJpdHN0cmVhbURhdGEtPnJpZ2h0Qm9yZGVyRklYLAorICAgICAgaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUucHJlX3RyYW5zaWVudF9pbmZvLAorICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmxkR3JpZCwgdl90dW5pbmcpOwogCiAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5oU2JyQlNHcmlkID0gJmhfZW52Q2hhblswXS0+U2JyRW52RnJhbWUuU2JyR3JpZDsKIAogICAvKiBBQUMgTEQgcGF0Y2ggZm9yIHRyYW5zaWVudCBwcmVkaWN0aW9uICovCiAgIGlmIChoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEubGRHcmlkICYmIGVEYXRhWzBdLnRyYW5zaWVudF9pbmZvWzJdKSB7Ci0gICAgLyogaWYgbmV4dCBmcmFtZSB3aWxsIHN0YXJ0IHdpdGggdHJhbnNpZW50LCBzZXQgc2hvcnRFbnYgdG8gbnVtRW52ZWxvcGVzKHNob3J0ZW5kIEVudmVsb3BlID0gc2hvcnRFbnYtMSkqLwotICAgIGhfZW52Q2hhblswXS0+U2JyRW52RnJhbWUuU2JyRnJhbWVJbmZvLnNob3J0RW52ID0gaF9lbnZDaGFuWzBdLT5TYnJFbnZGcmFtZS5TYnJGcmFtZUluZm8ubkVudmVsb3BlczsKKyAgICAvKiBpZiBuZXh0IGZyYW1lIHdpbGwgc3RhcnQgd2l0aCB0cmFuc2llbnQsIHNldCBzaG9ydEVudiB0bworICAgICAqIG51bUVudmVsb3BlcyhzaG9ydGVuZCBFbnZlbG9wZSA9IHNob3J0RW52LTEpKi8KKyAgICBoX2VudkNoYW5bMF0tPlNickVudkZyYW1lLlNickZyYW1lSW5mby5zaG9ydEVudiA9CisgICAgICAgIGhfZW52Q2hhblswXS0+U2JyRW52RnJhbWUuU2JyRnJhbWVJbmZvLm5FbnZlbG9wZXM7CiAgIH0KIAotCiAgIHN3aXRjaCAoc3RlcmVvTW9kZSkgewotICBjYXNlIFNCUl9MRUZUX1JJR0hUOgotICBjYXNlIFNCUl9TV0lUQ0hfTFJDOgotICAgIGVEYXRhWzFdLmZyYW1lX2luZm8gPSBGREtzYnJFbmNfZnJhbWVJbmZvR2VuZXJhdG9yKCZoX2VudkNoYW5bMV0tPlNickVudkZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzFdLnRyYW5zaWVudF9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+c2JyRXh0cmFjdEVudmVsb3BlLnByZV90cmFuc2llbnRfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEubGRHcmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfdHVuaW5nKTsKKyAgICBjYXNlIFNCUl9MRUZUX1JJR0hUOgorICAgIGNhc2UgU0JSX1NXSVRDSF9MUkM6CisgICAgICBlRGF0YVsxXS5mcmFtZV9pbmZvID0gRkRLc2JyRW5jX2ZyYW1lSW5mb0dlbmVyYXRvcigKKyAgICAgICAgICAmaF9lbnZDaGFuWzFdLT5TYnJFbnZGcmFtZSwgZURhdGFbMV0udHJhbnNpZW50X2luZm8sCisgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+cmlnaHRCb3JkZXJGSVgsCisgICAgICAgICAgaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUucHJlX3RyYW5zaWVudF9pbmZvLAorICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5sZEdyaWQsIHZfdHVuaW5nKTsKIAotICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5oU2JyQlNHcmlkID0gJmhfZW52Q2hhblsxXS0+U2JyRW52RnJhbWUuU2JyR3JpZDsKKyAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5oU2JyQlNHcmlkID0gJmhfZW52Q2hhblsxXS0+U2JyRW52RnJhbWUuU2JyR3JpZDsKIAotICAgIGlmIChoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEubGRHcmlkICYmIGVEYXRhWzFdLnRyYW5zaWVudF9pbmZvWzJdKSB7Ci0gICAgICAvKiBpZiBuZXh0IGZyYW1lIHdpbGwgc3RhcnQgd2l0aCB0cmFuc2llbnQsIHNldCBzaG9ydEVudiB0byBudW1FbnZlbG9wZXMoc2hvcnRlbmQgRW52ZWxvcGUgPSBzaG9ydEVudi0xKSovCi0gICAgICBoX2VudkNoYW5bMV0tPlNickVudkZyYW1lLlNickZyYW1lSW5mby5zaG9ydEVudiA9IGhfZW52Q2hhblsxXS0+U2JyRW52RnJhbWUuU2JyRnJhbWVJbmZvLm5FbnZlbG9wZXM7Ci0gICAgfQotCi0gICAgLyogY29tcGFyZSBsZWZ0IGFuZCByaWdodCBmcmFtZV9pbmZvcyAqLwotICAgIGlmIChlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzICE9IGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMpIHsKLSAgICAgIHN0ZXJlb01vZGUgPSBTQlJfTEVGVF9SSUdIVDsKLSAgICB9IGVsc2UgewotICAgICAgZm9yIChpID0gMDsgaSA8IGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgKyAxOyBpKyspIHsKLSAgICAgICAgaWYgKGVEYXRhWzBdLmZyYW1lX2luZm8tPmJvcmRlcnNbaV0gIT0gZURhdGFbMV0uZnJhbWVfaW5mby0+Ym9yZGVyc1tpXSkgewotICAgICAgICAgIHN0ZXJlb01vZGUgPSBTQlJfTEVGVF9SSUdIVDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgICAgaWYgKGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5sZEdyaWQgJiYgZURhdGFbMV0udHJhbnNpZW50X2luZm9bMl0pIHsKKyAgICAgICAgLyogaWYgbmV4dCBmcmFtZSB3aWxsIHN0YXJ0IHdpdGggdHJhbnNpZW50LCBzZXQgc2hvcnRFbnYgdG8KKyAgICAgICAgICogbnVtRW52ZWxvcGVzKHNob3J0ZW5kIEVudmVsb3BlID0gc2hvcnRFbnYtMSkqLworICAgICAgICBoX2VudkNoYW5bMV0tPlNickVudkZyYW1lLlNickZyYW1lSW5mby5zaG9ydEVudiA9CisgICAgICAgICAgICBoX2VudkNoYW5bMV0tPlNickVudkZyYW1lLlNickZyYW1lSW5mby5uRW52ZWxvcGVzOwogICAgICAgfQotICAgICAgZm9yIChpID0gMDsgaSA8IGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXM7IGkrKykgewotICAgICAgICBpZiAoZURhdGFbMF0uZnJhbWVfaW5mby0+ZnJlcVJlc1tpXSAhPSBlRGF0YVsxXS5mcmFtZV9pbmZvLT5mcmVxUmVzW2ldKSB7Ci0gICAgICAgICAgc3RlcmVvTW9kZSA9IFNCUl9MRUZUX1JJR0hUOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZURhdGFbMF0uZnJhbWVfaW5mby0+c2hvcnRFbnYgIT0gZURhdGFbMV0uZnJhbWVfaW5mby0+c2hvcnRFbnYpIHsKKworICAgICAgLyogY29tcGFyZSBsZWZ0IGFuZCByaWdodCBmcmFtZV9pbmZvcyAqLworICAgICAgaWYgKGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgIT0gZURhdGFbMV0uZnJhbWVfaW5mby0+bkVudmVsb3BlcykgewogICAgICAgICBzdGVyZW9Nb2RlID0gU0JSX0xFRlRfUklHSFQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyArIDE7IGkrKykgeworICAgICAgICAgIGlmIChlRGF0YVswXS5mcmFtZV9pbmZvLT5ib3JkZXJzW2ldICE9CisgICAgICAgICAgICAgIGVEYXRhWzFdLmZyYW1lX2luZm8tPmJvcmRlcnNbaV0pIHsKKyAgICAgICAgICAgIHN0ZXJlb01vZGUgPSBTQlJfTEVGVF9SSUdIVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlczsgaSsrKSB7CisgICAgICAgICAgaWYgKGVEYXRhWzBdLmZyYW1lX2luZm8tPmZyZXFSZXNbaV0gIT0KKyAgICAgICAgICAgICAgZURhdGFbMV0uZnJhbWVfaW5mby0+ZnJlcVJlc1tpXSkgeworICAgICAgICAgICAgc3RlcmVvTW9kZSA9IFNCUl9MRUZUX1JJR0hUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChlRGF0YVswXS5mcmFtZV9pbmZvLT5zaG9ydEVudiAhPSBlRGF0YVsxXS5mcmFtZV9pbmZvLT5zaG9ydEVudikgeworICAgICAgICAgIHN0ZXJlb01vZGUgPSBTQlJfTEVGVF9SSUdIVDsKKyAgICAgICAgfQogICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBTQlJfQ09VUExJTkc6Ci0gICAgZURhdGFbMV0uZnJhbWVfaW5mbyA9IGVEYXRhWzBdLmZyYW1lX2luZm87Ci0gICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmhTYnJCU0dyaWQgPSAmaF9lbnZDaGFuWzBdLT5TYnJFbnZGcmFtZS5TYnJHcmlkOwotICAgIGJyZWFrOwotICBjYXNlIFNCUl9NT05POgotICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBGREtfQVNTRVJUICgwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0JSX0NPVVBMSU5HOgorICAgICAgZURhdGFbMV0uZnJhbWVfaW5mbyA9IGVEYXRhWzBdLmZyYW1lX2luZm87CisgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuaFNickJTR3JpZCA9ICZoX2VudkNoYW5bMF0tPlNickVudkZyYW1lLlNickdyaWQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCUl9NT05POgorICAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEZES19BU1NFUlQoMCk7CiAgIH0KIAotCi0gIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVscztjaCsrKQotICB7CisgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgewogICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCBoRW52Q2hhbiA9IGhfZW52Q2hhbltjaF07CiAgICAgSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFIHNickV4dHJFbnYgPSAmaEVudkNoYW4tPnNickV4dHJhY3RFbnZlbG9wZTsKICAgICBTQlJfRU5WX1RFTVBfREFUQSAqZWQgPSAmZURhdGFbY2hdOwogCi0KICAgICAvKgogICAgICAgIFNlbmQgdHJhbnNpZW50IGluZm8gdG8gYml0c3RyZWFtIGFuZCBzdG9yZSBmb3IgbmV4dCBjYWxsCiAgICAgKi8KLSAgICBzYnJFeHRyRW52LT5wcmVfdHJhbnNpZW50X2luZm9bMF0gPSBlZC0+dHJhbnNpZW50X2luZm9bMF07LyogdHJhbl9wb3MgKi8KLSAgICBzYnJFeHRyRW52LT5wcmVfdHJhbnNpZW50X2luZm9bMV0gPSBlZC0+dHJhbnNpZW50X2luZm9bMV07LyogdHJhbl9mbGFnICovCi0gICAgaEVudkNoYW4tPmVuY0VudkRhdGEubm9PZkVudmVsb3BlcyA9IGVkLT5uRW52ZWxvcGVzID0gZWQtPmZyYW1lX2luZm8tPm5FbnZlbG9wZXM7ICAgICAvKiBudW1iZXIgb2YgZW52ZWxvcGVzIG9mIGN1cnJlbnQgZnJhbWUgKi8KKyAgICBzYnJFeHRyRW52LT5wcmVfdHJhbnNpZW50X2luZm9bMF0gPSBlZC0+dHJhbnNpZW50X2luZm9bMF07IC8qIHRyYW5fcG9zICovCisgICAgc2JyRXh0ckVudi0+cHJlX3RyYW5zaWVudF9pbmZvWzFdID0gZWQtPnRyYW5zaWVudF9pbmZvWzFdOyAvKiB0cmFuX2ZsYWcgKi8KKyAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5ub09mRW52ZWxvcGVzID0gZWQtPm5FbnZlbG9wZXMgPQorICAgICAgICBlZC0+ZnJhbWVfaW5mby0+bkVudmVsb3BlczsgLyogbnVtYmVyIG9mIGVudmVsb3BlcyBvZiBjdXJyZW50IGZyYW1lICovCiAKICAgICAvKgotICAgICAgQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZnJhbWUgaXMgZGl2aWRlZCBpbnRvIG9uZSBlbnZlbG9wZSBvbmx5LiBJZiBzbywgc2V0IHRoZSBhbXBsaXR1ZGUKLSAgICAgIHJlc29sdXRpb24gdG8gMS41IGRCLCBvdGhlcndpc2UgbWF5IHNldCBiYWNrIHRvIGNob3NlbiB2YWx1ZQorICAgICAgQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZnJhbWUgaXMgZGl2aWRlZCBpbnRvIG9uZSBlbnZlbG9wZSBvbmx5LiBJZiBzbywgc2V0CisgICAgICB0aGUgYW1wbGl0dWRlIHJlc29sdXRpb24gdG8gMS41IGRCLCBvdGhlcndpc2UgbWF5IHNldCBiYWNrIHRvIGNob3NlbiB2YWx1ZQogICAgICovCi0gICBpZiggKCBoRW52Q2hhbi0+ZW5jRW52RGF0YS5oU2JyQlNHcmlkLT5mcmFtZUNsYXNzID09IEZJWEZJWCApCi0gICAgICAgICYmICggZWQtPm5FbnZlbG9wZXMgPT0gMSApICkKLSAgIHsKKyAgICBpZiAoKGhFbnZDaGFuLT5lbmNFbnZEYXRhLmhTYnJCU0dyaWQtPmZyYW1lQ2xhc3MgPT0gRklYRklYKSAmJgorICAgICAgICAoZWQtPm5FbnZlbG9wZXMgPT0gMSkpIHsKKyAgICAgIGlmIChoX2Nvbi0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgeworICAgICAgICAvKiBOb3RlOiBnbG9iYWxfdG9uYWxpeV9mbG9hdF92YWx1ZSA9PQorICAgICAgICAgICAoKGZsb2F0KWhFbnZDaGFuLT5lbmNFbnZEYXRhLmdsb2JhbF90b25hbGl0eS8oKElOVDY0KSgxKTw8KDMxLSgxOSsyKSkpLzAuNTI0Mjg4KigyLjAvMy4wKSkpOworICAgICAgICAgICAgICAgICB0aHJlc2hvbGRfZmxvYXRfdmFsdWUgPT0KKyAgICAgICAgICAgKChmbG9hdCloX2Nvbi0+dGhyZXNob2xkQW1wUmVzRkZfbS8oKElOVDY0KSgxKTw8KDMxLShoX2Nvbi0+dGhyZXNob2xkQW1wUmVzRkZfZSkpKS8wLjUyNDI4OCooMi4wLzMuMCkpKTsKKyAgICAgICAgICovCisgICAgICAgIC8qIGRlY2lzaW9uIG9mIFNCUl9BTVBfUkVTICovCisgICAgICAgIGlmIChmSXNMZXNzVGhhbigvKiBnbG9iYWxfdG9uYWxpdHkgPiB0aHJlc2hvbGQgPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPnRocmVzaG9sZEFtcFJlc0ZGX20sIGhfY29uLT50aHJlc2hvbGRBbXBSZXNGRl9lLAorICAgICAgICAgICAgICAgICAgICAgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuZ2xvYmFsX3RvbmFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgUkVMQVhBVElPTl9TSElGVCArIDIpKSB7CisgICAgICAgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuY3VycmVudEFtcFJlc0ZGID0gU0JSX0FNUF9SRVNfMV81OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmN1cnJlbnRBbXBSZXNGRiA9IFNCUl9BTVBfUkVTXzNfMDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlCisgICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmN1cnJlbnRBbXBSZXNGRiA9IFNCUl9BTVBfUkVTXzFfNTsKIAotICAgICBpZiAoaF9jb24tPnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpCi0gICAgIHsKLSAgICAgICAvKiBOb3RlOiBnbG9iYWxfdG9uYWxpeV9mbG9hdF92YWx1ZSA9PSAoKGZsb2F0KWhFbnZDaGFuLT5lbmNFbnZEYXRhLmdsb2JhbF90b25hbGl0eS8oKElOVDY0KSgxKTw8KDMxLSgxOSsyKSkpLzAuNTI0Mjg4KigyLjAvMy4wKSkpOwotICAgICAgICAgICAgICAgIHRocmVzaG9sZF9mbG9hdF92YWx1ZSA9PSAoKGZsb2F0KWhfY29uLT50aHJlc2hvbGRBbXBSZXNGRl9tLygoSU5UNjQpKDEpPDwoMzEtKGhfY29uLT50aHJlc2hvbGRBbXBSZXNGRl9lKSkpLzAuNTI0Mjg4KigyLjAvMy4wKSkpOyAqLwotICAgICAgIC8qIGRlY2lzaW9uIG9mIFNCUl9BTVBfUkVTICovCi0gICAgICAgaWYgKGZJc0xlc3NUaGFuKCAvKiBnbG9iYWxfdG9uYWxpdHkgPiB0aHJlc2hvbGQgPyAqLwotICAgICAgICAgICAgIGhfY29uLT50aHJlc2hvbGRBbXBSZXNGRl9tLCBoX2Nvbi0+dGhyZXNob2xkQW1wUmVzRkZfZSwKLSAgICAgICAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5nbG9iYWxfdG9uYWxpdHksIFJFTEFYQVRJT05fU0hJRlQrMiApCi0gICAgICAgICAgKQotICAgICAgIHsKLSAgICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmN1cnJlbnRBbXBSZXNGRiA9IFNCUl9BTVBfUkVTXzFfNTsKLSAgICAgICB9Ci0gICAgICAgZWxzZSB7Ci0gICAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5jdXJyZW50QW1wUmVzRkYgPSBTQlJfQU1QX1JFU18zXzA7Ci0gICAgICAgfQotICAgICB9IGVsc2UgewotICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmN1cnJlbnRBbXBSZXNGRiA9IFNCUl9BTVBfUkVTXzFfNTsKLSAgICAgfQotCi0gICAgICBpZiAoIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmN1cnJlbnRBbXBSZXNGRiAhPSBoRW52Q2hhbi0+ZW5jRW52RGF0YS5pbml0X3Nicl9hbXBfcmVzKSB7Ci0KLSAgICAgICAgRkRLc2JyRW5jX0luaXRTYnJIdWZmbWFuVGFibGVzKCZoRW52Q2hhbi0+ZW5jRW52RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52Q2hhbi0+c2JyQ29kZUVudmVsb3BlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnZDaGFuLT5zYnJDb2RlTm9pc2VGbG9vciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmN1cnJlbnRBbXBSZXNGRik7CisgICAgICBpZiAoaEVudkNoYW4tPmVuY0VudkRhdGEuY3VycmVudEFtcFJlc0ZGICE9CisgICAgICAgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuaW5pdF9zYnJfYW1wX3JlcykgeworICAgICAgICBGREtzYnJFbmNfSW5pdFNickh1ZmZtYW5UYWJsZXMoCisgICAgICAgICAgICAmaEVudkNoYW4tPmVuY0VudkRhdGEsICZoRW52Q2hhbi0+c2JyQ29kZUVudmVsb3BlLAorICAgICAgICAgICAgJmhFbnZDaGFuLT5zYnJDb2RlTm9pc2VGbG9vciwgaEVudkNoYW4tPmVuY0VudkRhdGEuY3VycmVudEFtcFJlc0ZGKTsKICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBpZihzYnJIZWFkZXJEYXRhLT5zYnJfYW1wX3JlcyAhPSBoRW52Q2hhbi0+ZW5jRW52RGF0YS5pbml0X3Nicl9hbXBfcmVzICkgewotCi0gICAgICAgIEZES3NickVuY19Jbml0U2JySHVmZm1hblRhYmxlcygmaEVudkNoYW4tPmVuY0VudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudkNoYW4tPnNickNvZGVFbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52Q2hhbi0+c2JyQ29kZU5vaXNlRmxvb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5zYnJfYW1wX3Jlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChzYnJIZWFkZXJEYXRhLT5zYnJfYW1wX3JlcyAhPSBoRW52Q2hhbi0+ZW5jRW52RGF0YS5pbml0X3Nicl9hbXBfcmVzKSB7CisgICAgICAgIEZES3NickVuY19Jbml0U2JySHVmZm1hblRhYmxlcygKKyAgICAgICAgICAgICZoRW52Q2hhbi0+ZW5jRW52RGF0YSwgJmhFbnZDaGFuLT5zYnJDb2RlRW52ZWxvcGUsCisgICAgICAgICAgICAmaEVudkNoYW4tPnNickNvZGVOb2lzZUZsb29yLCBzYnJIZWFkZXJEYXRhLT5zYnJfYW1wX3Jlcyk7CiAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKCFjbGVhck91dHB1dCkgewotCiAgICAgICAvKgotICAgICAgICBUb25hbGl0eSBjb3JyZWN0aW9uIHBhcmFtZXRlciBleHRyYWN0aW9uIChpbnZlcnNlIGZpbHRlcmluZyBsZXZlbCwgbm9pc2UgZmxvb3IgYWRkaXRpb25hbCBzaW5lcykuCisgICAgICAgIFRvbmFsaXR5IGNvcnJlY3Rpb24gcGFyYW1ldGVyIGV4dHJhY3Rpb24gKGludmVyc2UgZmlsdGVyaW5nIGxldmVsLCBub2lzZQorICAgICAgICBmbG9vciBhZGRpdGlvbmFsIHNpbmVzKS4KICAgICAgICovCi0gICAgICBGREtzYnJFbmNfVG9uQ29yclBhcmFtRXh0cigmaEVudkNoYW4tPlRvbkNvcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuc2JyX2ludmZfbW9kZV92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWQtPm5vaXNlRmxvb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudkNoYW4tPmVuY0VudkRhdGEuYWRkSGFybW9uaWNGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmFkZEhhcm1vbmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPmVudmVsb3BlQ29tcGVuc2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkLT5mcmFtZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkLT50cmFuc2llbnRfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2Nvbi0+ZnJlcUJhbmRUYWJsZVtISV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPm5TZmJbSEldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLnNicl94cG9zX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPnNiclN5bnRheEZsYWdzKTsKLQorICAgICAgRkRLc2JyRW5jX1RvbkNvcnJQYXJhbUV4dHIoCisgICAgICAgICAgJmhFbnZDaGFuLT5Ub25Db3JyLCBoRW52Q2hhbi0+ZW5jRW52RGF0YS5zYnJfaW52Zl9tb2RlX3ZlYywKKyAgICAgICAgICBlZC0+bm9pc2VGbG9vciwgJmhFbnZDaGFuLT5lbmNFbnZEYXRhLmFkZEhhcm1vbmljRmxhZywKKyAgICAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5hZGRIYXJtb25pYywgc2JyRXh0ckVudi0+ZW52ZWxvcGVDb21wZW5zYXRpb24sCisgICAgICAgICAgZWQtPmZyYW1lX2luZm8sIGVkLT50cmFuc2llbnRfaW5mbywgaF9jb24tPmZyZXFCYW5kVGFibGVbSEldLAorICAgICAgICAgIGhfY29uLT5uU2ZiW0hJXSwgaEVudkNoYW4tPmVuY0VudkRhdGEuc2JyX3hwb3NfbW9kZSwKKyAgICAgICAgICBoX2Nvbi0+c2JyU3ludGF4RmxhZ3MpOwogICAgIH0KIAogICAgIC8qIExvdyBlbmVyZ3kgaW4gbG93IGJhbmQgZml4ICovCi0gICAgaWYgKCBoRW52Q2hhbi0+c2JyVHJhbnNpZW50RGV0ZWN0b3IucHJldkxvd0JhbmRFbmVyZ3kgPCBoRW52Q2hhbi0+c2JyVHJhbnNpZW50RGV0ZWN0b3IucHJldkhpZ2hCYW5kRW5lcmd5Ci0gICAgICAmJiBoRW52Q2hhbi0+c2JyVHJhbnNpZW50RGV0ZWN0b3IucHJldkhpZ2hCYW5kRW5lcmd5ID4gRkwyRlhfREJMKDAuMDMpCi0gICAgICAvKiBUaGUgZml4IG5lZWRzIHRoZSBub24tZmFzdCB0cmFuc2llbnQgZGV0ZWN0b3IgcnVubmluZy4KLSAgICAgICAgIEl0IHNldHMgcHJldkxvd0JhbmRFbmVyZ3kgYW5kIHByZXZIaWdoQmFuZEVuZXJneS4gICAgICAqLwotICAgICAgJiYgIShoX2Nvbi0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkKLSAgICAgICkKLSAgICB7Ci0gICAgICBpbnQgaTsKLQorICAgIGlmIChoRW52Q2hhbi0+c2JyVHJhbnNpZW50RGV0ZWN0b3IucHJldkxvd0JhbmRFbmVyZ3kgPAorICAgICAgICAgICAgaEVudkNoYW4tPnNiclRyYW5zaWVudERldGVjdG9yLnByZXZIaWdoQmFuZEVuZXJneSAmJgorICAgICAgICBoRW52Q2hhbi0+c2JyVHJhbnNpZW50RGV0ZWN0b3IucHJldkhpZ2hCYW5kRW5lcmd5ID4gRkwyRlhfREJMKDAuMDMpCisgICAgICAgIC8qIFRoZSBmaXggbmVlZHMgdGhlIG5vbi1mYXN0IHRyYW5zaWVudCBkZXRlY3RvciBydW5uaW5nLgorICAgICAgICAgICBJdCBzZXRzIHByZXZMb3dCYW5kRW5lcmd5IGFuZCBwcmV2SGlnaEJhbmRFbmVyZ3kuICAgICAgKi8KKyAgICAgICAgJiYgIShoX2Nvbi0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkpIHsKICAgICAgIGhFbnZDaGFuLT5mTGV2ZWxQcm90ZWN0ID0gMTsKIAotICAgICAgZm9yIChpPTA7IGk8TUFYX05VTV9OT0lTRV9WQUxVRVM7IGkrKykKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX05PSVNFX1ZBTFVFUzsgaSsrKQogICAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5zYnJfaW52Zl9tb2RlX3ZlY1tpXSA9IElOVkZfSElHSF9MRVZFTDsKICAgICB9IGVsc2UgewogICAgICAgaEVudkNoYW4tPmZMZXZlbFByb3RlY3QgPSAwOwogICAgIH0KIAotICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLnNicl9pbnZmX21vZGUgPSBoRW52Q2hhbi0+ZW5jRW52RGF0YS5zYnJfaW52Zl9tb2RlX3ZlY1swXTsKKyAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5zYnJfaW52Zl9tb2RlID0KKyAgICAgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuc2JyX2ludmZfbW9kZV92ZWNbMF07CiAKLSAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5ub09mbm9pc2ViYW5kcyA9IGhFbnZDaGFuLT5Ub25Db3JyLnNick5vaXNlRmxvb3JFc3RpbWF0ZS5ub05vaXNlQmFuZHM7Ci0KKyAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5ub09mbm9pc2ViYW5kcyA9CisgICAgICAgIGhFbnZDaGFuLT5Ub25Db3JyLnNick5vaXNlRmxvb3JFc3RpbWF0ZS5ub05vaXNlQmFuZHM7CiAKICAgfSAvKiBjaCAqLwogCi0KLQotICAgLyoKLSAgICAgIFNhdmUgbnVtYmVyIG9mIHNjZiBiYW5kcyBwZXIgZW52ZWxvcGUKLSAgICAqLwotICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7Y2grKykgewotICAgIGZvciAoaSA9IDA7IGkgPCBlRGF0YVtjaF0ubkVudmVsb3BlczsgaSsrKXsKKyAgLyoKKyAgICAgU2F2ZSBudW1iZXIgb2Ygc2NmIGJhbmRzIHBlciBlbnZlbG9wZQorICAgKi8KKyAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGVEYXRhW2NoXS5uRW52ZWxvcGVzOyBpKyspIHsKICAgICAgIGhfZW52Q2hhbltjaF0tPmVuY0VudkRhdGEubm9TY2ZCYW5kc1tpXSA9Ci0gICAgICAoZURhdGFbY2hdLmZyYW1lX2luZm8tPmZyZXFSZXNbaV0gPT0gRlJFUV9SRVNfSElHSCA/IGhfY29uLT5uU2ZiW0ZSRVFfUkVTX0hJR0hdIDogaF9jb24tPm5TZmJbRlJFUV9SRVNfTE9XXSk7CisgICAgICAgICAgKGVEYXRhW2NoXS5mcmFtZV9pbmZvLT5mcmVxUmVzW2ldID09IEZSRVFfUkVTX0hJR0gKKyAgICAgICAgICAgICAgID8gaF9jb24tPm5TZmJbRlJFUV9SRVNfSElHSF0KKyAgICAgICAgICAgICAgIDogaF9jb24tPm5TZmJbRlJFUV9SRVNfTE9XXSk7CiAgICAgfQogICB9CiAKQEAgLTEzNjgsMTY1ICsxMzU5LDE2OSBAQAogICAgIEV4dHJhY3QgZW52ZWxvcGUgb2YgY3VycmVudCBmcmFtZS4KICAgKi8KICAgc3dpdGNoIChzdGVyZW9Nb2RlKSB7Ci0gIGNhc2UgU0JSX01PTk86Ci0gICAgIGNhbGN1bGF0ZVNickVudmVsb3BlIChoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU2NhbGUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzBdLmZyYW1lX2luZm8sIGVEYXRhWzBdLnNmYl9ucmcsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLCBoX2VudkNoYW5bMF0sIFNCUl9NT05PLCBOVUxMLCBZU3pTaGlmdCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgU0JSX0xFRlRfUklHSFQ6Ci0gICAgY2FsY3VsYXRlU2JyRW52ZWxvcGUgKGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXIsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMF0uZnJhbWVfaW5mbywgZURhdGFbMF0uc2ZiX25yZywgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24sIGhfZW52Q2hhblswXSwgU0JSX01PTk8sIE5VTEwsIFlTelNoaWZ0KTsKLSAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZSAoaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlciwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVsxXS5mcmFtZV9pbmZvLGVEYXRhWzFdLnNmYl9ucmcsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLCBoX2VudkNoYW5bMV0sIFNCUl9NT05PLCBOVUxMLCBZU3pTaGlmdCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgU0JSX0NPVVBMSU5HOgotICAgIGNhbGN1bGF0ZVNickVudmVsb3BlIChoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyLCBoX2VudkNoYW5bMV0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU2NhbGUsIGhfZW52Q2hhblsxXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMF0uZnJhbWVfaW5mbywgZURhdGFbMF0uc2ZiX25yZywgZURhdGFbMV0uc2ZiX25yZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24sIGhfZW52Q2hhblswXSwgU0JSX0NPVVBMSU5HLCAmZkRhdGEtPm1heFF1YW50RXJyb3IsIFlTelNoaWZ0KTsKLSAgICBicmVhazsKLSAgY2FzZSBTQlJfU1dJVENIX0xSQzoKLSAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZSAoaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlciwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLCBlRGF0YVswXS5zZmJfbnJnLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICBoX2NvbiwgaF9lbnZDaGFuWzBdLCBTQlJfTU9OTywgTlVMTCwgWVN6U2hpZnQpOwotICAgIGNhbGN1bGF0ZVNickVudmVsb3BlIChoX2VudkNoYW5bMV0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU2NhbGUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzFdLmZyYW1lX2luZm8sIGVEYXRhWzFdLnNmYl9ucmcsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLCBoX2VudkNoYW5bMV0sIFNCUl9NT05PLE5VTEwsIFlTelNoaWZ0KTsKLSAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZSAoaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlciwgaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLCBoX2VudkNoYW5bMV0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzBdLmZyYW1lX2luZm8sIGVEYXRhWzBdLnNmYl9ucmdfY291cGxpbmcsIGVEYXRhWzFdLnNmYl9ucmdfY291cGxpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLCBoX2VudkNoYW5bMF0sIFNCUl9DT1VQTElORywgJmZEYXRhLT5tYXhRdWFudEVycm9yLCBZU3pTaGlmdCk7Ci0gICAgYnJlYWs7CisgICAgY2FzZSBTQlJfTU9OTzoKKyAgICAgIGNhbGN1bGF0ZVNickVudmVsb3BlKGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXIsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU2NhbGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLCBlRGF0YVswXS5zZmJfbnJnLCBOVUxMLCBoX2NvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXSwgU0JSX01PTk8sIE5VTEwsIFlTelNoaWZ0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0JSX0xFRlRfUklHSFQ6CisgICAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZShoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMF0uZnJhbWVfaW5mbywgZURhdGFbMF0uc2ZiX25yZywgTlVMTCwgaF9jb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0sIFNCUl9NT05PLCBOVUxMLCBZU3pTaGlmdCk7CisgICAgICBjYWxjdWxhdGVTYnJFbnZlbG9wZShoX2VudkNoYW5bMV0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMV0uZnJhbWVfaW5mbywgZURhdGFbMV0uc2ZiX25yZywgTlVMTCwgaF9jb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0sIFNCUl9NT05PLCBOVUxMLCBZU3pTaGlmdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCUl9DT1VQTElORzoKKyAgICAgIGNhbGN1bGF0ZVNickVudmVsb3BlKGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMF0uZnJhbWVfaW5mbywgZURhdGFbMF0uc2ZiX25yZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzFdLnNmYl9ucmcsIGhfY29uLCBoX2VudkNoYW5bMF0sIFNCUl9DT1VQTElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZmRGF0YS0+bWF4UXVhbnRFcnJvciwgWVN6U2hpZnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQlJfU1dJVENIX0xSQzoKKyAgICAgIGNhbGN1bGF0ZVNickVudmVsb3BlKGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXIsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU2NhbGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLCBlRGF0YVswXS5zZmJfbnJnLCBOVUxMLCBoX2NvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXSwgU0JSX01PTk8sIE5VTEwsIFlTelNoaWZ0KTsKKyAgICAgIGNhbGN1bGF0ZVNickVudmVsb3BlKGhfZW52Q2hhblsxXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXIsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU2NhbGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVsxXS5mcmFtZV9pbmZvLCBlRGF0YVsxXS5zZmJfbnJnLCBOVUxMLCBoX2NvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXSwgU0JSX01PTk8sIE5VTEwsIFlTelNoaWZ0KTsKKyAgICAgIGNhbGN1bGF0ZVNickVudmVsb3BlKGhfZW52Q2hhblswXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMF0uZnJhbWVfaW5mbywgZURhdGFbMF0uc2ZiX25yZ19jb3VwbGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzFdLnNmYl9ucmdfY291cGxpbmcsIGhfY29uLCBoX2VudkNoYW5bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfQ09VUExJTkcsICZmRGF0YS0+bWF4UXVhbnRFcnJvciwgWVN6U2hpZnQpOworICAgICAgYnJlYWs7CiAgIH0KIAotCi0KICAgLyoKICAgICBOb2lzZSBmbG9vciBxdWFudGlzYXRpb24gYW5kIGNvZGluZy4KICAgKi8KIAogICBzd2l0Y2ggKHN0ZXJlb01vZGUpIHsKLSAgY2FzZSBTQlJfTU9OTzoKLSAgICBzYnJOb2lzZUZsb29yTGV2ZWxzUXVhbnRpc2F0aW9uKGVEYXRhWzBdLm5vaXNlX2xldmVsLCBlRGF0YVswXS5ub2lzZUZsb29yLCAwKTsKKyAgICBjYXNlIFNCUl9NT05POgorICAgICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVswXS5ub2lzZV9sZXZlbCwgZURhdGFbMF0ubm9pc2VGbG9vciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CiAKLSAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlKGVEYXRhWzBdLm5vaXNlX2xldmVsLCBmRGF0YS0+cmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+c2JyQ29kZU5vaXNlRmxvb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlY19ub2lzZSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzID4gMSA/IDIgOiAxKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CisgICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlKGVEYXRhWzBdLm5vaXNlX2xldmVsLCBmRGF0YS0+cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5zYnJDb2RlTm9pc2VGbG9vciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzID4gMSA/IDIgOiAxKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKIAotICAgIGJyZWFrOwotICBjYXNlIFNCUl9MRUZUX1JJR0hUOgotICAgIHNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oZURhdGFbMF0ubm9pc2VfbGV2ZWwsZURhdGFbMF0ubm9pc2VGbG9vciwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCUl9MRUZUX1JJR0hUOgorICAgICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVswXS5ub2lzZV9sZXZlbCwgZURhdGFbMF0ubm9pc2VGbG9vciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CiAKLSAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVswXS5ub2lzZV9sZXZlbCwgZkRhdGEtPnJlcywKLSAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVOb2lzZUZsb29yLAotICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsIDAsCi0gICAgICAgICAgICAgICAgICAoZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDAsCi0gICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZShlRGF0YVswXS5ub2lzZV9sZXZlbCwgZkRhdGEtPnJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+c2JyQ29kZU5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CiAKLSAgICBzYnJOb2lzZUZsb29yTGV2ZWxzUXVhbnRpc2F0aW9uKGVEYXRhWzFdLm5vaXNlX2xldmVsLGVEYXRhWzFdLm5vaXNlRmxvb3IsIDApOworICAgICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVsxXS5ub2lzZV9sZXZlbCwgZURhdGFbMV0ubm9pc2VGbG9vciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CiAKLSAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVsxXS5ub2lzZV9sZXZlbCwgZkRhdGEtPnJlcywKLSAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMV0tPnNickNvZGVOb2lzZUZsb29yLAotICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsIDAsCi0gICAgICAgICAgICAgICAgICAoZURhdGFbMV0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDAsCi0gICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZShlRGF0YVsxXS5ub2lzZV9sZXZlbCwgZkRhdGEtPnJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZU5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZURhdGFbMV0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CiAKLSAgICBicmVhazsKKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgU0JSX0NPVVBMSU5HOgotICAgIGNvdXBsZU5vaXNlRmxvb3IoZURhdGFbMF0ubm9pc2VGbG9vcixlRGF0YVsxXS5ub2lzZUZsb29yKTsKKyAgICBjYXNlIFNCUl9DT1VQTElORzoKKyAgICAgIGNvdXBsZU5vaXNlRmxvb3IoZURhdGFbMF0ubm9pc2VGbG9vciwgZURhdGFbMV0ubm9pc2VGbG9vcik7CiAKLSAgICBzYnJOb2lzZUZsb29yTGV2ZWxzUXVhbnRpc2F0aW9uKGVEYXRhWzBdLm5vaXNlX2xldmVsLGVEYXRhWzBdLm5vaXNlRmxvb3IsIDApOworICAgICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVswXS5ub2lzZV9sZXZlbCwgZURhdGFbMF0ubm9pc2VGbG9vciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CiAKLSAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVswXS5ub2lzZV9sZXZlbCwgZkRhdGEtPnJlcywKLSAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVOb2lzZUZsb29yLAotICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsIDEsCi0gICAgICAgICAgICAgICAgICAoZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDAsCi0gICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZShlRGF0YVswXS5ub2lzZV9sZXZlbCwgZkRhdGEtPnJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+c2JyQ29kZU5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CiAKLSAgICBzYnJOb2lzZUZsb29yTGV2ZWxzUXVhbnRpc2F0aW9uKGVEYXRhWzFdLm5vaXNlX2xldmVsLGVEYXRhWzFdLm5vaXNlRmxvb3IsIDEpOworICAgICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVsxXS5ub2lzZV9sZXZlbCwgZURhdGFbMV0ubm9pc2VGbG9vciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAKLSAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVsxXS5ub2lzZV9sZXZlbCwgZkRhdGEtPnJlcywKLSAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMV0tPnNickNvZGVOb2lzZUZsb29yLAotICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsIDEsCi0gICAgICAgICAgICAgICAgICAoZURhdGFbMV0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDEsCi0gICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZShlRGF0YVsxXS5ub2lzZV9sZXZlbCwgZkRhdGEtPnJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZU5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZURhdGFbMV0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CiAKLSAgICBicmVhazsKLSAgY2FzZSBTQlJfU1dJVENIX0xSQzoKLSAgICBzYnJOb2lzZUZsb29yTGV2ZWxzUXVhbnRpc2F0aW9uKGVEYXRhWzBdLm5vaXNlX2xldmVsLGVEYXRhWzBdLm5vaXNlRmxvb3IsIDApOwotICAgIHNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oZURhdGFbMV0ubm9pc2VfbGV2ZWwsZURhdGFbMV0ubm9pc2VGbG9vciwgMCk7Ci0gICAgY291cGxlTm9pc2VGbG9vcihlRGF0YVswXS5ub2lzZUZsb29yLGVEYXRhWzFdLm5vaXNlRmxvb3IpOwotICAgIHNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oZURhdGFbMF0ubm9pc2VfbGV2ZWxfY291cGxpbmcsZURhdGFbMF0ubm9pc2VGbG9vciwgMCk7Ci0gICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVsxXS5ub2lzZV9sZXZlbF9jb3VwbGluZyxlRGF0YVsxXS5ub2lzZUZsb29yLCAxKTsKLSAgICBicmVhazsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0JSX1NXSVRDSF9MUkM6CisgICAgICBzYnJOb2lzZUZsb29yTGV2ZWxzUXVhbnRpc2F0aW9uKGVEYXRhWzBdLm5vaXNlX2xldmVsLCBlRGF0YVswXS5ub2lzZUZsb29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgIHNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oZURhdGFbMV0ubm9pc2VfbGV2ZWwsIGVEYXRhWzFdLm5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgY291cGxlTm9pc2VGbG9vcihlRGF0YVswXS5ub2lzZUZsb29yLCBlRGF0YVsxXS5ub2lzZUZsb29yKTsKKyAgICAgIHNick5vaXNlRmxvb3JMZXZlbHNRdWFudGlzYXRpb24oZURhdGFbMF0ubm9pc2VfbGV2ZWxfY291cGxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhWzBdLm5vaXNlRmxvb3IsIDApOworICAgICAgc2JyTm9pc2VGbG9vckxldmVsc1F1YW50aXNhdGlvbihlRGF0YVsxXS5ub2lzZV9sZXZlbF9jb3VwbGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZURhdGFbMV0ubm9pc2VGbG9vciwgMSk7CisgICAgICBicmVhazsKICAgfQogCi0KLQogICAvKgogICAgIEVuY29kZSBlbnZlbG9wZSBvZiBjdXJyZW50IGZyYW1lLgogICAqLwogICBzd2l0Y2ggKHN0ZXJlb01vZGUpIHsKLSAgY2FzZSBTQlJfTU9OTzoKLSAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZyA9IDA7Ci0gICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAwOwotICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUgKGVEYXRhWzBdLnNmYl9ucmcsIGVEYXRhWzBdLmZyYW1lX2luZm8tPmZyZXFSZXMsCi0gICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5zYnJDb2RlRW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywKLSAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nLAotICAgICAgICAgICAgICAgICAgZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcywgMCwKLSAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgU0JSX0xFRlRfUklHSFQ6Ci0gICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcgPSAwOworICAgIGNhc2UgU0JSX01PTk86CisgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZyA9IDA7CisgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuYmFsYW5jZSA9IDA7CisgICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlKAorICAgICAgICAgIGVEYXRhWzBdLnNmYl9ucmcsIGVEYXRhWzBdLmZyYW1lX2luZm8tPmZyZXFSZXMsCisgICAgICAgICAgJmhfZW52Q2hhblswXS0+c2JyQ29kZUVudmVsb3BlLCBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywKKyAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZywgZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcywgMCwKKyAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQlJfTEVGVF9SSUdIVDoKKyAgICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nID0gMDsKIAotICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5iYWxhbmNlID0gMDsKLSAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuYmFsYW5jZSA9IDA7CisgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuYmFsYW5jZSA9IDA7CisgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuYmFsYW5jZSA9IDA7CiAKKyAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUoCisgICAgICAgICAgZURhdGFbMF0uc2ZiX25yZywgZURhdGFbMF0uZnJhbWVfaW5mby0+ZnJlcVJlcywKKyAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5zYnJDb2RlRW52ZWxvcGUsIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLAorICAgICAgICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nLCBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAwLAorICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CisgICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlKAorICAgICAgICAgIGVEYXRhWzFdLnNmYl9ucmcsIGVEYXRhWzFdLmZyYW1lX2luZm8tPmZyZXFSZXMsCisgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZUVudmVsb3BlLCBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywKKyAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZywgZURhdGFbMV0uZnJhbWVfaW5mby0+bkVudmVsb3BlcywgMCwKKyAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQlJfQ09VUExJTkc6CisgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZyA9IDE7CisgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuYmFsYW5jZSA9IDA7CisgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuYmFsYW5jZSA9IDE7CiAKLSAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVswXS5zZmJfbnJnLCBlRGF0YVswXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAotICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+c2JyQ29kZUVudmVsb3BlLAotICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWMsCi0gICAgICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZywKLSAgICAgICAgICAgICAgICAgIGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMsIDAsCi0gICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwotICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUgKGVEYXRhWzFdLnNmYl9ucmcsIGVEYXRhWzFdLmZyYW1lX2luZm8tPmZyZXFSZXMsCi0gICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzFdLT5zYnJDb2RlRW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywKLSAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nLAotICAgICAgICAgICAgICAgICAgZURhdGFbMV0uZnJhbWVfaW5mby0+bkVudmVsb3BlcywgMCwKLSAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgU0JSX0NPVVBMSU5HOgotICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nID0gMTsKLSAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuYmFsYW5jZSA9IDA7Ci0gICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAxOwotCi0gICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZSAoZURhdGFbMF0uc2ZiX25yZywgZURhdGFbMF0uZnJhbWVfaW5mby0+ZnJlcVJlcywKLSAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVFbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLAotICAgICAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcsCi0gICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAwLAotICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKLSAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVsxXS5zZmJfbnJnLCBlRGF0YVsxXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAotICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZUVudmVsb3BlLAotICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWMsCi0gICAgICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZywKLSAgICAgICAgICAgICAgICAgIGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMsIDEsCi0gICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwotICAgIGJyZWFrOwotICBjYXNlIFNCUl9TV0lUQ0hfTFJDOgotICAgIHsKKyAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUoCisgICAgICAgICAgZURhdGFbMF0uc2ZiX25yZywgZURhdGFbMF0uZnJhbWVfaW5mby0+ZnJlcVJlcywKKyAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5zYnJDb2RlRW52ZWxvcGUsIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLAorICAgICAgICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nLCBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAwLAorICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CisgICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlKAorICAgICAgICAgIGVEYXRhWzFdLnNmYl9ucmcsIGVEYXRhWzFdLmZyYW1lX2luZm8tPmZyZXFSZXMsCisgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZUVudmVsb3BlLCBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywKKyAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZywgZURhdGFbMV0uZnJhbWVfaW5mby0+bkVudmVsb3BlcywgMSwKKyAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQlJfU1dJVENIX0xSQzogewogICAgICAgSU5UIHBheWxvYWRiaXRzTFI7CiAgICAgICBJTlQgcGF5bG9hZGJpdHNDT1VQTElORzsKIApAQCAtMTU0MSwxNSArMTUzNiwxOCBAQAogICAgICAgSU5UIHRlbXBGbGFnTGVmdCA9IDA7CiAKICAgICAgIC8qCi0gICAgICAgICBTdG9yZSBwcmV2aW91cyB2YWx1ZXMsIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gInVuZG8iIHdoYXQgaXMgYmVpbmcgZG9uZS4KKyAgICAgICAgIFN0b3JlIHByZXZpb3VzIHZhbHVlcywgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byAidW5kbyIgd2hhdCBpcyBiZWluZworICAgICAgICAgZG9uZS4KICAgICAgICovCiAKLSAgICAgIGZvcihjaCA9IDA7IGNoIDwgbkNoYW5uZWxzO2NoKyspewotICAgICAgICBGREttZW1jcHkgKHNmYk5yZ1ByZXZUZW1wW2NoXSwgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZUVudmVsb3BlLnNmYl9ucmdfcHJldiwKLSAgICAgICAgICAgICAgTUFYX0ZSRVFfQ09FRkZTICogc2l6ZW9mIChTQ0hBUikpOworICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIEZES21lbWNweShzZmJOcmdQcmV2VGVtcFtjaF0sCisgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUuc2ZiX25yZ19wcmV2LAorICAgICAgICAgICAgICAgICAgTUFYX0ZSRVFfQ09FRkZTICogc2l6ZW9mKFNDSEFSKSk7CiAKLSAgICAgICAgRkRLbWVtY3B5IChub2lzZVByZXZUZW1wW2NoXSwgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3Iuc2ZiX25yZ19wcmV2LAotICAgICAgICAgICAgICBNQVhfTlVNX05PSVNFX0NPRUZGUyAqIHNpemVvZiAoU0NIQVIpKTsKKyAgICAgICAgRkRLbWVtY3B5KG5vaXNlUHJldlRlbXBbY2hdLAorICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3Iuc2ZiX25yZ19wcmV2LAorICAgICAgICAgICAgICAgICAgTUFYX05VTV9OT0lTRV9DT0VGRlMgKiBzaXplb2YoU0NIQVIpKTsKIAogICAgICAgICB1cERhdGVOcmdUZW1wW2NoXSA9IGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS51cERhdGU7CiAgICAgICAgIHVwRGF0ZU5vaXNlVGVtcFtjaF0gPSBoX2VudkNoYW5bY2hdLT5zYnJDb2RlTm9pc2VGbG9vci51cERhdGU7CkBAIC0xNTU4LDI0NyArMTU1NiwyMzMgQEAKICAgICAgICAgICBmb3JiaWQgdGltZSBjb2RpbmcgaW4gdGhlIGZpcnN0IGVudmVsb3BlIGluIGNhc2Ugb2YgYSBkaWZmZXJlbnQKICAgICAgICAgICBwcmV2aW91cyBzdGVyZW9tb2RlCiAgICAgICAgICovCi0gICAgICAgIGlmKHNickhlYWRlckRhdGEtPnByZXZfY291cGxpbmcpeworICAgICAgICBpZiAoc2JySGVhZGVyRGF0YS0+cHJldl9jb3VwbGluZykgewogICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS51cERhdGUgPSAwOwogICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnVwRGF0ZSA9IDA7CiAgICAgICAgIH0KICAgICAgIH0gLyogY2ggKi8KIAotCiAgICAgICAvKgogICAgICAgICAgQ29kZSBvcmRpbmFyeSBMZWZ0L1JpZ2h0IHN0ZXJlbwogICAgICAgKi8KLSAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUgKGVEYXRhWzBdLnNmYl9ucmcsIGVEYXRhWzBdLmZyYW1lX2luZm8tPmZyZXFSZXMsCi0gICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVFbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWMsIDAsCi0gICAgICAgICAgICAgICAgICAgIGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMsIDAsCi0gICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7Ci0gICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVsxXS5zZmJfbnJnLCBlRGF0YVsxXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAotICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzFdLT5zYnJDb2RlRW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLCAwLAotICAgICAgICAgICAgICAgICAgICBlRGF0YVsxXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAwLAotICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZShlRGF0YVswXS5zZmJfbnJnLCBlRGF0YVswXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5zYnJDb2RlRW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOworICAgICAgRkRLc2JyRW5jX2NvZGVFbnZlbG9wZShlRGF0YVsxXS5zZmJfbnJnLCBlRGF0YVsxXS5mcmFtZV9pbmZvLT5mcmVxUmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzFdLT5zYnJDb2RlRW52ZWxvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YVsxXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwogCiAgICAgICBjID0gMDsKICAgICAgIGZvciAoaSA9IDA7IGkgPCBlRGF0YVswXS5uRW52ZWxvcGVzOyBpKyspIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5ub1NjZkJhbmRzW2ldOyBqKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmllbnZlbG9wZVtpXVtqXSA9IGVEYXRhWzBdLnNmYl9ucmdbY107Ci0gICAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuaWVudmVsb3BlW2ldW2pdID0gZURhdGFbMV0uc2ZiX25yZ1tjXTsKLSAgICAgICAgICAgIGMrKzsKLSAgICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEubm9TY2ZCYW5kc1tpXTsgaisrKSB7CisgICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmllbnZlbG9wZVtpXVtqXSA9IGVEYXRhWzBdLnNmYl9ucmdbY107CisgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmllbnZlbG9wZVtpXVtqXSA9IGVEYXRhWzFdLnNmYl9ucmdbY107CisgICAgICAgICAgYysrOworICAgICAgICB9CiAgICAgICB9CiAKLQotCi0gICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVswXS5ub2lzZV9sZXZlbCwgZkRhdGEtPnJlcywKLSAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+c2JyQ29kZU5vaXNlRmxvb3IsCi0gICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAwLAotICAgICAgICAgICAgICAgICAgICAoZURhdGFbMF0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDAsCi0gICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7Ci0KKyAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUoZURhdGFbMF0ubm9pc2VfbGV2ZWwsIGZEYXRhLT5yZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVOb2lzZUZsb29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlY19ub2lzZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgPiAxID8gMiA6IDEpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwogCiAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVM7IGkrKykKICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLnNicl9ub2lzZV9sZXZlbHNbaV0gPSBlRGF0YVswXS5ub2lzZV9sZXZlbFtpXTsKIAotCi0gICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlIChlRGF0YVsxXS5ub2lzZV9sZXZlbCwgZkRhdGEtPnJlcywKLSAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+c2JyQ29kZU5vaXNlRmxvb3IsCi0gICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjX25vaXNlLCAwLAotICAgICAgICAgICAgICAgICAgICAoZURhdGFbMV0uZnJhbWVfaW5mby0+bkVudmVsb3BlcyA+IDEgPyAyIDogMSksIDAsCi0gICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CisgICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlKGVEYXRhWzFdLm5vaXNlX2xldmVsLCBmRGF0YS0+cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzFdLT5zYnJDb2RlTm9pc2VGbG9vciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlRGF0YVsxXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzID4gMSA/IDIgOiAxKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKIAogICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fTk9JU0VfVkFMVUVTOyBpKyspCiAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5zYnJfbm9pc2VfbGV2ZWxzW2ldID0gZURhdGFbMV0ubm9pc2VfbGV2ZWxbaV07CiAKLQogICAgICAgc2JySGVhZGVyRGF0YS0+Y291cGxpbmcgPSAwOwogICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAwOwogICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAwOwogCi0gICAgICBwYXlsb2FkYml0c0xSID0gRkRLc2JyRW5jX0NvdW50U2JyQ2hhbm5lbFBhaXJFbGVtZW50IChzYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+ZW5jRW52RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaENtb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2Nvbi0+c2JyU3ludGF4RmxhZ3MpOworICAgICAgcGF5bG9hZGJpdHNMUiA9IEZES3NickVuY19Db3VudFNickNoYW5uZWxQYWlyRWxlbWVudCgKKyAgICAgICAgICBzYnJIZWFkZXJEYXRhLCBoUGFyYW1ldHJpY1N0ZXJlbywgc2JyQml0c3RyZWFtRGF0YSwKKyAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLCAmaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLCBoQ21vbkRhdGEsCisgICAgICAgICAgaF9jb24tPnNiclN5bnRheEZsYWdzKTsKIAogICAgICAgLyoKICAgICAgICAgc3dhcCBzYXZlZCBzdG9yZWQgd2l0aCBjdXJyZW50IHZhbHVlcwogICAgICAgKi8KLSAgICAgIGZvcihjaCA9IDA7IGNoIDwgbkNoYW5uZWxzO2NoKyspewotICAgICAgICBJTlQgICBpdG1wOwotICAgICAgICBmb3IoaT0wO2k8TUFYX0ZSRVFfQ09FRkZTO2krKyl7CisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgSU5UIGl0bXA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfRlJFUV9DT0VGRlM7IGkrKykgewogICAgICAgICAgIC8qCiAgICAgICAgICAgICBzd2FwIHNmYiBlbmVyZ2llcwogICAgICAgICAgICovCi0gICAgICAgICAgaXRtcCA9ICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUuc2ZiX25yZ19wcmV2W2ldOwotICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS5zZmJfbnJnX3ByZXZbaV09c2ZiTnJnUHJldlRlbXBbY2hdW2ldOwotICAgICAgICAgIHNmYk5yZ1ByZXZUZW1wW2NoXVtpXT1pdG1wOworICAgICAgICAgIGl0bXAgPSBoX2VudkNoYW5bY2hdLT5zYnJDb2RlRW52ZWxvcGUuc2ZiX25yZ19wcmV2W2ldOworICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS5zZmJfbnJnX3ByZXZbaV0gPQorICAgICAgICAgICAgICBzZmJOcmdQcmV2VGVtcFtjaF1baV07CisgICAgICAgICAgc2ZiTnJnUHJldlRlbXBbY2hdW2ldID0gaXRtcDsKICAgICAgICAgfQotICAgICAgICBmb3IoaT0wO2k8TUFYX05VTV9OT0lTRV9DT0VGRlM7aSsrKXsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fTk9JU0VfQ09FRkZTOyBpKyspIHsKICAgICAgICAgICAvKgogICAgICAgICAgICAgc3dhcCBub2lzZSBlbmVyZ2llcwogICAgICAgICAgICovCi0gICAgICAgICAgaXRtcCA9ICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlTm9pc2VGbG9vci5zZmJfbnJnX3ByZXZbaV07Ci0gICAgICAgICAgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3Iuc2ZiX25yZ19wcmV2W2ldPW5vaXNlUHJldlRlbXBbY2hdW2ldOwotICAgICAgICAgIG5vaXNlUHJldlRlbXBbY2hdW2ldPWl0bXA7Ci0gICAgICAgfQorICAgICAgICAgIGl0bXAgPSBoX2VudkNoYW5bY2hdLT5zYnJDb2RlTm9pc2VGbG9vci5zZmJfbnJnX3ByZXZbaV07CisgICAgICAgICAgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3Iuc2ZiX25yZ19wcmV2W2ldID0KKyAgICAgICAgICAgICAgbm9pc2VQcmV2VGVtcFtjaF1baV07CisgICAgICAgICAgbm9pc2VQcmV2VGVtcFtjaF1baV0gPSBpdG1wOworICAgICAgICB9CiAgICAgICAgIC8qIHN3YXAgdXBkYXRlIGZsYWdzICovCi0gICAgICAgIGl0bXAgID0gaF9lbnZDaGFuW2NoXS0+c2JyQ29kZUVudmVsb3BlLnVwRGF0ZTsKLSAgICAgICAgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZUVudmVsb3BlLnVwRGF0ZT11cERhdGVOcmdUZW1wW2NoXTsKKyAgICAgICAgaXRtcCA9IGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS51cERhdGU7CisgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS51cERhdGUgPSB1cERhdGVOcmdUZW1wW2NoXTsKICAgICAgICAgdXBEYXRlTnJnVGVtcFtjaF0gPSBpdG1wOwogCi0gICAgICAgIGl0bXAgPSAgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3IudXBEYXRlOwotICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlTm9pc2VGbG9vci51cERhdGU9dXBEYXRlTm9pc2VUZW1wW2NoXTsKLSAgICAgICAgdXBEYXRlTm9pc2VUZW1wW2NoXT1pdG1wOworICAgICAgICBpdG1wID0gaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3IudXBEYXRlOworICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlTm9pc2VGbG9vci51cERhdGUgPSB1cERhdGVOb2lzZVRlbXBbY2hdOworICAgICAgICB1cERhdGVOb2lzZVRlbXBbY2hdID0gaXRtcDsKIAogICAgICAgICAvKgogICAgICAgICAgICAgc2F2ZSBkb21haW4gdmVjcwogICAgICAgICAqLwotICAgICAgICBGREttZW1jcHkoZG9tYWluVmVjVGVtcFtjaF0saF9lbnZDaGFuW2NoXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLHNpemVvZihJTlQpKk1BWF9FTlZFTE9QRVMpOwotICAgICAgICBGREttZW1jcHkoZG9tYWluVmVjTm9pc2VUZW1wW2NoXSxoX2VudkNoYW5bY2hdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2Usc2l6ZW9mKElOVCkqTUFYX0VOVkVMT1BFUyk7CisgICAgICAgIEZES21lbWNweShkb21haW5WZWNUZW1wW2NoXSwgaF9lbnZDaGFuW2NoXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKElOVCkgKiBNQVhfRU5WRUxPUEVTKTsKKyAgICAgICAgRkRLbWVtY3B5KGRvbWFpblZlY05vaXNlVGVtcFtjaF0sCisgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bY2hdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsCisgICAgICAgICAgICAgICAgICBzaXplb2YoSU5UKSAqIE1BWF9FTlZFTE9QRVMpOwogCiAgICAgICAgIC8qCiAgICAgICAgICAgZm9yYmlkIHRpbWUgY29kaW5nIGluIHRoZSBmaXJzdCBlbnZlbG9wZSBpbiBjYXNlIG9mIGEgZGlmZmVyZW50CiAgICAgICAgICAgcHJldmlvdXMgc3RlcmVvbW9kZQogICAgICAgICAqLwogCi0gICAgICAgIGlmKCFzYnJIZWFkZXJEYXRhLT5wcmV2X2NvdXBsaW5nKXsKKyAgICAgICAgaWYgKCFzYnJIZWFkZXJEYXRhLT5wcmV2X2NvdXBsaW5nKSB7CiAgICAgICAgICAgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZUVudmVsb3BlLnVwRGF0ZSA9IDA7CiAgICAgICAgICAgaF9lbnZDaGFuW2NoXS0+c2JyQ29kZU5vaXNlRmxvb3IudXBEYXRlID0gMDsKICAgICAgICAgfQogICAgICAgfSAvKiBjaCAqLwogCi0KICAgICAgIC8qCiAgICAgICAgICBDb3VwbGluZwogICAgICAgICovCiAKLSAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUgKGVEYXRhWzBdLnNmYl9ucmdfY291cGxpbmcsIGVEYXRhWzBdLmZyYW1lX2luZm8tPmZyZXFSZXMsCi0gICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPnNickNvZGVFbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWMsIDEsCi0gICAgICAgICAgICAgICAgICAgIGVEYXRhWzBdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMsIDAsCi0gICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CisgICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlKAorICAgICAgICAgIGVEYXRhWzBdLnNmYl9ucmdfY291cGxpbmcsIGVEYXRhWzBdLmZyYW1lX2luZm8tPmZyZXFSZXMsCisgICAgICAgICAgJmhfZW52Q2hhblswXS0+c2JyQ29kZUVudmVsb3BlLCBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywKKyAgICAgICAgICAxLCBlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzLCAwLAorICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CiAKLSAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUgKGVEYXRhWzFdLnNmYl9ucmdfY291cGxpbmcsIGVEYXRhWzFdLmZyYW1lX2luZm8tPmZyZXFSZXMsCi0gICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMV0tPnNickNvZGVFbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWMsIDEsCi0gICAgICAgICAgICAgICAgICAgIGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMsIDEsCi0gICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7Ci0KKyAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUoCisgICAgICAgICAgZURhdGFbMV0uc2ZiX25yZ19jb3VwbGluZywgZURhdGFbMV0uZnJhbWVfaW5mby0+ZnJlcVJlcywKKyAgICAgICAgICAmaF9lbnZDaGFuWzFdLT5zYnJDb2RlRW52ZWxvcGUsIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5kb21haW5fdmVjLAorICAgICAgICAgIDEsIGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMsIDEsCisgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKIAogICAgICAgYyA9IDA7CiAgICAgICBmb3IgKGkgPSAwOyBpIDwgZURhdGFbMF0ubkVudmVsb3BlczsgaSsrKSB7CiAgICAgICAgIGZvciAoaiA9IDA7IGogPCBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEubm9TY2ZCYW5kc1tpXTsgaisrKSB7Ci0gICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmllbnZlbG9wZVtpXVtqXSA9IGVEYXRhWzBdLnNmYl9ucmdfY291cGxpbmdbY107Ci0gICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmllbnZlbG9wZVtpXVtqXSA9IGVEYXRhWzFdLnNmYl9ucmdfY291cGxpbmdbY107CisgICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmllbnZlbG9wZVtpXVtqXSA9CisgICAgICAgICAgICAgIGVEYXRhWzBdLnNmYl9ucmdfY291cGxpbmdbY107CisgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmllbnZlbG9wZVtpXVtqXSA9CisgICAgICAgICAgICAgIGVEYXRhWzFdLnNmYl9ucmdfY291cGxpbmdbY107CiAgICAgICAgICAgYysrOwogICAgICAgICB9CiAgICAgICB9CiAKLSAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUgKGVEYXRhWzBdLm5vaXNlX2xldmVsX2NvdXBsaW5nLCBmRGF0YS0+cmVzLAotICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5zYnJDb2RlTm9pc2VGbG9vciwKLSAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsIDEsCi0gICAgICAgICAgICAgICAgICAgIChlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzID4gMSA/IDIgOiAxKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSk7CisgICAgICBGREtzYnJFbmNfY29kZUVudmVsb3BlKGVEYXRhWzBdLm5vaXNlX2xldmVsX2NvdXBsaW5nLCBmRGF0YS0+cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzBdLT5zYnJDb2RlTm9pc2VGbG9vciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlRGF0YVswXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzID4gMSA/IDIgOiAxKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKIAogICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fTk9JU0VfVkFMVUVTOyBpKyspCi0gICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5zYnJfbm9pc2VfbGV2ZWxzW2ldID0gZURhdGFbMF0ubm9pc2VfbGV2ZWxfY291cGxpbmdbaV07CisgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5zYnJfbm9pc2VfbGV2ZWxzW2ldID0KKyAgICAgICAgICAgIGVEYXRhWzBdLm5vaXNlX2xldmVsX2NvdXBsaW5nW2ldOwogCi0KLSAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUgKGVEYXRhWzFdLm5vaXNlX2xldmVsX2NvdXBsaW5nLCBmRGF0YS0+cmVzLAotICAgICAgICAgICAgICAgICAgICAmaF9lbnZDaGFuWzFdLT5zYnJDb2RlTm9pc2VGbG9vciwKLSAgICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNfbm9pc2UsIDEsCi0gICAgICAgICAgICAgICAgICAgIChlRGF0YVsxXS5mcmFtZV9pbmZvLT5uRW52ZWxvcGVzID4gMSA/IDIgOiAxKSwgMSwKLSAgICAgICAgICAgICAgICAgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlKTsKKyAgICAgIEZES3NickVuY19jb2RlRW52ZWxvcGUoZURhdGFbMV0ubm9pc2VfbGV2ZWxfY291cGxpbmcsIGZEYXRhLT5yZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMV0tPnNickNvZGVOb2lzZUZsb29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuZG9tYWluX3ZlY19ub2lzZSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVEYXRhWzFdLmZyYW1lX2luZm8tPm5FbnZlbG9wZXMgPiAxID8gMiA6IDEpLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUpOwogCiAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVM7IGkrKykKLSAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLnNicl9ub2lzZV9sZXZlbHNbaV0gPSBlRGF0YVsxXS5ub2lzZV9sZXZlbF9jb3VwbGluZ1tpXTsKKyAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLnNicl9ub2lzZV9sZXZlbHNbaV0gPQorICAgICAgICAgICAgZURhdGFbMV0ubm9pc2VfbGV2ZWxfY291cGxpbmdbaV07CiAKICAgICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nID0gMTsKIAotICAgICAgaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmJhbGFuY2UgID0gMDsKLSAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5iYWxhbmNlICA9IDE7CisgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuYmFsYW5jZSA9IDA7CisgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuYmFsYW5jZSA9IDE7CiAKLSAgICAgIHRlbXBGbGFnTGVmdCAgPSBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuYWRkSGFybW9uaWNGbGFnOworICAgICAgdGVtcEZsYWdMZWZ0ID0gaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmFkZEhhcm1vbmljRmxhZzsKICAgICAgIHRlbXBGbGFnUmlnaHQgPSBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuYWRkSGFybW9uaWNGbGFnOwogCi0gICAgICBwYXlsb2FkYml0c0NPVVBMSU5HID0KLSAgICAgICAgRkRLc2JyRW5jX0NvdW50U2JyQ2hhbm5lbFBhaXJFbGVtZW50IChzYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+ZW5jRW52RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQ21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2Nvbi0+c2JyU3ludGF4RmxhZ3MpOwotCisgICAgICBwYXlsb2FkYml0c0NPVVBMSU5HID0gRkRLc2JyRW5jX0NvdW50U2JyQ2hhbm5lbFBhaXJFbGVtZW50KAorICAgICAgICAgIHNickhlYWRlckRhdGEsIGhQYXJhbWV0cmljU3RlcmVvLCBzYnJCaXRzdHJlYW1EYXRhLAorICAgICAgICAgICZoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEsICZoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEsIGhDbW9uRGF0YSwKKyAgICAgICAgICBoX2Nvbi0+c2JyU3ludGF4RmxhZ3MpOwogCiAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuYWRkSGFybW9uaWNGbGFnID0gdGVtcEZsYWdMZWZ0OwogICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmFkZEhhcm1vbmljRmxhZyA9IHRlbXBGbGFnUmlnaHQ7CiAKICAgICAgIGlmIChwYXlsb2FkYml0c0NPVVBMSU5HIDwgcGF5bG9hZGJpdHNMUikgewotCi0gICAgICAgICAgLyoKLSAgICAgICAgICAgIGNvcHkgY29kZWQgY291cGxpbmcgZW52ZWxvcGUgYW5kIG5vaXNlIGRhdGEgdG8gbC9yCi0gICAgICAgICAgKi8KLSAgICAgICAgICBmb3IoY2ggPSAwOyBjaCA8IG5DaGFubmVscztjaCsrKXsKLSAgICAgICAgICAgIFNCUl9FTlZfVEVNUF9EQVRBICplZCA9ICZlRGF0YVtjaF07Ci0gICAgICAgICAgICBGREttZW1jcHkgKGVkLT5zZmJfbnJnLCBlZC0+c2ZiX25yZ19jb3VwbGluZywKLSAgICAgICAgICAgICAgICAgIE1BWF9OVU1fRU5WRUxPUEVfVkFMVUVTICogc2l6ZW9mIChTQ0hBUikpOwotICAgICAgICAgICAgRkRLbWVtY3B5IChlZC0+bm9pc2VfbGV2ZWwsIGVkLT5ub2lzZV9sZXZlbF9jb3VwbGluZywKLSAgICAgICAgICAgICAgICAgIE1BWF9OVU1fTk9JU0VfVkFMVUVTICogc2l6ZW9mIChTQ0hBUikpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nID0gMTsKLSAgICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuYmFsYW5jZSAgPSAwOwotICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5iYWxhbmNlICA9IDE7Ci0gICAgICB9Ci0gICAgICBlbHNlewotICAgICAgICAgIC8qCi0gICAgICAgICAgICByZXN0b3JlIHNhdmVkIGwvciBpdGVtcwotICAgICAgICAgICovCi0gICAgICAgICAgZm9yKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7Y2grKyl7Ci0KLSAgICAgICAgICAgIEZES21lbWNweSAoaF9lbnZDaGFuW2NoXS0+c2JyQ29kZUVudmVsb3BlLnNmYl9ucmdfcHJldiwKLSAgICAgICAgICAgICAgICAgICAgc2ZiTnJnUHJldlRlbXBbY2hdLCBNQVhfRlJFUV9DT0VGRlMgKiBzaXplb2YgKFNDSEFSKSk7Ci0KLSAgICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS51cERhdGUgPSB1cERhdGVOcmdUZW1wW2NoXTsKLQotICAgICAgICAgICAgRkRLbWVtY3B5IChoX2VudkNoYW5bY2hdLT5zYnJDb2RlTm9pc2VGbG9vci5zZmJfbnJnX3ByZXYsCi0gICAgICAgICAgICAgICAgICAgIG5vaXNlUHJldlRlbXBbY2hdLCBNQVhfTlVNX05PSVNFX0NPRUZGUyAqIHNpemVvZiAoU0NIQVIpKTsKLQotICAgICAgICAgICAgRkRLbWVtY3B5IChoX2VudkNoYW5bY2hdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWMsZG9tYWluVmVjVGVtcFtjaF0sc2l6ZW9mKElOVCkqTUFYX0VOVkVMT1BFUyk7Ci0gICAgICAgICAgICBGREttZW1jcHkgKGhfZW52Q2hhbltjaF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlY19ub2lzZSxkb21haW5WZWNOb2lzZVRlbXBbY2hdLHNpemVvZihJTlQpKk1BWF9FTlZFTE9QRVMpOwotCi0gICAgICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJDb2RlTm9pc2VGbG9vci51cERhdGUgPSB1cERhdGVOb2lzZVRlbXBbY2hdOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHNickhlYWRlckRhdGEtPmNvdXBsaW5nID0gMDsKLSAgICAgICAgICBoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEuYmFsYW5jZSAgPSAwOwotICAgICAgICAgIGhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YS5iYWxhbmNlICA9IDA7CisgICAgICAgIC8qCisgICAgICAgICAgY29weSBjb2RlZCBjb3VwbGluZyBlbnZlbG9wZSBhbmQgbm9pc2UgZGF0YSB0byBsL3IKKyAgICAgICAgKi8KKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgU0JSX0VOVl9URU1QX0RBVEEgKmVkID0gJmVEYXRhW2NoXTsKKyAgICAgICAgICBGREttZW1jcHkoZWQtPnNmYl9ucmcsIGVkLT5zZmJfbnJnX2NvdXBsaW5nLAorICAgICAgICAgICAgICAgICAgICBNQVhfTlVNX0VOVkVMT1BFX1ZBTFVFUyAqIHNpemVvZihTQ0hBUikpOworICAgICAgICAgIEZES21lbWNweShlZC0+bm9pc2VfbGV2ZWwsIGVkLT5ub2lzZV9sZXZlbF9jb3VwbGluZywKKyAgICAgICAgICAgICAgICAgICAgTUFYX05VTV9OT0lTRV9WQUxVRVMgKiBzaXplb2YoU0NIQVIpKTsKICAgICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgfSAvKiBzd2l0Y2ggKi8KIAorICAgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZyA9IDE7CisgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5iYWxhbmNlID0gMDsKKyAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyoKKyAgICAgICAgICByZXN0b3JlIHNhdmVkIGwvciBpdGVtcworICAgICAgICAqLworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICBGREttZW1jcHkoaF9lbnZDaGFuW2NoXS0+c2JyQ29kZUVudmVsb3BlLnNmYl9ucmdfcHJldiwKKyAgICAgICAgICAgICAgICAgICAgc2ZiTnJnUHJldlRlbXBbY2hdLCBNQVhfRlJFUV9DT0VGRlMgKiBzaXplb2YoU0NIQVIpKTsKKworICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVFbnZlbG9wZS51cERhdGUgPSB1cERhdGVOcmdUZW1wW2NoXTsKKworICAgICAgICAgIEZES21lbWNweShoX2VudkNoYW5bY2hdLT5zYnJDb2RlTm9pc2VGbG9vci5zZmJfbnJnX3ByZXYsCisgICAgICAgICAgICAgICAgICAgIG5vaXNlUHJldlRlbXBbY2hdLCBNQVhfTlVNX05PSVNFX0NPRUZGUyAqIHNpemVvZihTQ0hBUikpOworCisgICAgICAgICAgRkRLbWVtY3B5KGhfZW52Q2hhbltjaF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlYywgZG9tYWluVmVjVGVtcFtjaF0sCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihJTlQpICogTUFYX0VOVkVMT1BFUyk7CisgICAgICAgICAgRkRLbWVtY3B5KGhfZW52Q2hhbltjaF0tPmVuY0VudkRhdGEuZG9tYWluX3ZlY19ub2lzZSwKKyAgICAgICAgICAgICAgICAgICAgZG9tYWluVmVjTm9pc2VUZW1wW2NoXSwgc2l6ZW9mKElOVCkgKiBNQVhfRU5WRUxPUEVTKTsKKworICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickNvZGVOb2lzZUZsb29yLnVwRGF0ZSA9IHVwRGF0ZU5vaXNlVGVtcFtjaF07CisgICAgICAgIH0KKworICAgICAgICBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZyA9IDA7CisgICAgICAgIGhfZW52Q2hhblswXS0+ZW5jRW52RGF0YS5iYWxhbmNlID0gMDsKKyAgICAgICAgaF9lbnZDaGFuWzFdLT5lbmNFbnZEYXRhLmJhbGFuY2UgPSAwOworICAgICAgfQorICAgIH0gYnJlYWs7CisgIH0gLyogc3dpdGNoICovCiAKICAgLyogdGVsbCB0aGUgZW52ZWxvcGUgZW5jb2RlcnMgaG93IGxvbmcgaXQgaGFzIGJlZW4sIHNpbmNlIHdlIGxhc3Qgc2VudAogICAgICBhIGZyYW1lIHN0YXJ0aW5nIHdpdGggYSBkRi1jb2RlZCBlbnZlbG9wZSAqLwotICBpZiAoc3RlcmVvTW9kZSA9PSBTQlJfTU9OTyApIHsKKyAgaWYgKHN0ZXJlb01vZGUgPT0gU0JSX01PTk8pIHsKICAgICBpZiAoaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNbMF0gPT0gVElNRSkKICAgICAgIGhfZW52Q2hhblswXS0+c2JyQ29kZUVudmVsb3BlLmRGX2VkZ2VfaW5jcl9mYWMrKzsKICAgICBlbHNlCiAgICAgICBoX2VudkNoYW5bMF0tPnNickNvZGVFbnZlbG9wZS5kRl9lZGdlX2luY3JfZmFjID0gMDsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBpZiAoaF9lbnZDaGFuWzBdLT5lbmNFbnZEYXRhLmRvbWFpbl92ZWNbMF0gPT0gVElNRSB8fAogICAgICAgICBoX2VudkNoYW5bMV0tPmVuY0VudkRhdGEuZG9tYWluX3ZlY1swXSA9PSBUSU1FKSB7CiAgICAgICBoX2VudkNoYW5bMF0tPnNickNvZGVFbnZlbG9wZS5kRl9lZGdlX2luY3JfZmFjKys7CiAgICAgICBoX2VudkNoYW5bMV0tPnNickNvZGVFbnZlbG9wZS5kRl9lZGdlX2luY3JfZmFjKys7Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICBoX2VudkNoYW5bMF0tPnNickNvZGVFbnZlbG9wZS5kRl9lZGdlX2luY3JfZmFjID0gMDsKICAgICAgIGhfZW52Q2hhblsxXS0+c2JyQ29kZUVudmVsb3BlLmRGX2VkZ2VfaW5jcl9mYWMgPSAwOwogICAgIH0KQEAgLTE4MDcsNyArMTc5MSw3IEBACiAgIC8qCiAgICAgU2VuZCB0aGUgZW5jb2RlZCBkYXRhIHRvIHRoZSBiaXRzdHJlYW0KICAgKi8KLSAgZm9yKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7Y2grKyl7CisgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgewogICAgIFNCUl9FTlZfVEVNUF9EQVRBICplZCA9ICZlRGF0YVtjaF07CiAgICAgYyA9IDA7CiAgICAgZm9yIChpID0gMDsgaSA8IGVkLT5uRW52ZWxvcGVzOyBpKyspIHsKQEAgLTE4MTcsNDUgKzE4MDEsMzggQEAKICAgICAgICAgYysrOwogICAgICAgfQogICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVM7IGkrKyl7CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fTk9JU0VfVkFMVUVTOyBpKyspIHsKICAgICAgIGhfZW52Q2hhbltjaF0tPmVuY0VudkRhdGEuc2JyX25vaXNlX2xldmVsc1tpXSA9IGVkLT5ub2lzZV9sZXZlbFtpXTsKICAgICB9Ci0gIH0vKiBjaCAqLwotCisgIH0gLyogY2ggKi8KIAogICAvKgogICAgIFdyaXRlIGJpdHN0cmVhbQogICAqLwogICBpZiAobkNoYW5uZWxzID09IDIpIHsKLSAgICBGREtzYnJFbmNfV3JpdGVFbnZDaGFubmVsUGFpckVsZW1lbnQoc2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX2VudkNoYW5bMF0tPmVuY0VudkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQ21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPnNiclN5bnRheEZsYWdzKTsKLSAgfQotICBlbHNlIHsKLSAgICBGREtzYnJFbmNfV3JpdGVFbnZTaW5nbGVDaGFubmVsRWxlbWVudChzYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJCaXRzdHJlYW1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfZW52Q2hhblswXS0+ZW5jRW52RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhDbW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfY29uLT5zYnJTeW50YXhGbGFncyk7CisgICAgRkRLc2JyRW5jX1dyaXRlRW52Q2hhbm5lbFBhaXJFbGVtZW50KAorICAgICAgICBzYnJIZWFkZXJEYXRhLCBoUGFyYW1ldHJpY1N0ZXJlbywgc2JyQml0c3RyZWFtRGF0YSwKKyAgICAgICAgJmhfZW52Q2hhblswXS0+ZW5jRW52RGF0YSwgJmhfZW52Q2hhblsxXS0+ZW5jRW52RGF0YSwgaENtb25EYXRhLAorICAgICAgICBoX2Nvbi0+c2JyU3ludGF4RmxhZ3MpOworICB9IGVsc2UgeworICAgIEZES3NickVuY19Xcml0ZUVudlNpbmdsZUNoYW5uZWxFbGVtZW50KAorICAgICAgICBzYnJIZWFkZXJEYXRhLCBoUGFyYW1ldHJpY1N0ZXJlbywgc2JyQml0c3RyZWFtRGF0YSwKKyAgICAgICAgJmhfZW52Q2hhblswXS0+ZW5jRW52RGF0YSwgaENtb25EYXRhLCBoX2Nvbi0+c2JyU3ludGF4RmxhZ3MpOwogICB9CiAKICAgLyoKICAgICogVXBkYXRlIGJ1ZmZlcnMuCiAgICAqLwotICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykKLSAgewotICAgICAgaW50IFlCdWZmZXJMZW5ndGggPSBoX2VudkNoYW5bY2hdLT5zYnJFeHRyYWN0RW52ZWxvcGUubm9fY29scyA+PiBoX2VudkNoYW5bY2hdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclN6U2hpZnQ7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgaF9lbnZDaGFuW2NoXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJXcml0ZU9mZnNldDsgaSsrKSB7Ci0gICAgICAgICBGREttZW1jcHkoaF9lbnZDaGFuW2NoXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJbaV0sCi0gICAgICAgICAgICAgICAgICAgaF9lbnZDaGFuW2NoXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJbaSArIFlCdWZmZXJMZW5ndGhdLAotICAgICAgICAgICAgICAgICAgIHNpemVvZihGSVhQX0RCTCkqUU1GX0NIQU5ORUxTKTsKLSAgICAgIH0KLSAgICAgIGhfZW52Q2hhbltjaF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyU2NhbGVbMF0gPSBoX2VudkNoYW5bY2hdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlWzFdOworICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBpbnQgWUJ1ZmZlckxlbmd0aCA9IGhfZW52Q2hhbltjaF0tPnNickV4dHJhY3RFbnZlbG9wZS5ub19jb2xzID4+CisgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW5bY2hdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclN6U2hpZnQ7CisgICAgZm9yIChpID0gMDsgaSA8IGhfZW52Q2hhbltjaF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyV3JpdGVPZmZzZXQ7IGkrKykgeworICAgICAgRkRLbWVtY3B5KGhfZW52Q2hhbltjaF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyW2ldLAorICAgICAgICAgICAgICAgIGhfZW52Q2hhbltjaF0tPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyW2kgKyBZQnVmZmVyTGVuZ3RoXSwKKyAgICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogNjQpOworICAgIH0KKyAgICBoX2VudkNoYW5bY2hdLT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclNjYWxlWzBdID0KKyAgICAgICAgaF9lbnZDaGFuW2NoXS0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTY2FsZVsxXTsKICAgfQogCiAgIHNickhlYWRlckRhdGEtPnByZXZfY291cGxpbmcgPSBzYnJIZWFkZXJEYXRhLT5jb3VwbGluZzsKQEAgLTE4NjksNDAgKzE4NDYsNDMgQEAKICAgXHJldHVybiBlcnJvciBzdGF0dXMKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUlOVAotRkRLc2JyRW5jX0NyZWF0ZUV4dHJhY3RTYnJFbnZlbG9wZSAoSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFICBoU2JyQ3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNoYW5uZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLElOVCBjaEluRWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFVDSEFSKiBkeW5hbWljX1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKK0lOVCBGREtzYnJFbmNfQ3JlYXRlRXh0cmFjdFNickVudmVsb3BlKEhBTkRMRV9TQlJfRVhUUkFDVF9FTlZFTE9QRSBoU2JyQ3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNoYW5uZWwsIElOVCBjaEluRWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqZHluYW1pY19SQU0pIHsKICAgSU5UIGk7Ci0gIEZJWFBfREJMKiBZQnVmZmVyID0gR2V0UmFtX1Nicl9lbnZZQnVmZmVyKGNoYW5uZWwpOworICBGSVhQX0RCTCAqckJ1ZmZlciwgKmlCdWZmZXI7CisgIElOVCBuOworICBGSVhQX0RCTCAqWUJ1ZmZlckR5bjsKIAotICBGREttZW1jbGVhcihoU2JyQ3V0LHNpemVvZihTQlJfRVhUUkFDVF9FTlZFTE9QRSkpOwotICBoU2JyQ3V0LT5wX1lCdWZmZXIgPSBZQnVmZmVyOworICBGREttZW1jbGVhcihoU2JyQ3V0LCBzaXplb2YoU0JSX0VYVFJBQ1RfRU5WRUxPUEUpKTsKIAotCi0gIGZvciAoaSA9IDA7IGkgPCAoUU1GX01BWF9USU1FX1NMT1RTPj4xKTsgaSsrKSB7Ci0gICAgaFNickN1dC0+WUJ1ZmZlcltpXSA9IFlCdWZmZXIgKyAoaSpRTUZfQ0hBTk5FTFMpOwotICB9Ci0gIEZJWFBfREJMICpZQnVmZmVyRHluID0gR2V0UmFtX1Nicl9lbnZZQnVmZmVyKGNoSW5FbCwgZHluYW1pY19SQU0pOwotICBJTlQgbj0wOwotICBmb3IgKDsgaSA8IFFNRl9NQVhfVElNRV9TTE9UUzsgaSsrLG4rKykgewotICAgIGhTYnJDdXQtPllCdWZmZXJbaV0gPSBZQnVmZmVyRHluICsgKG4qUU1GX0NIQU5ORUxTKTsKKyAgaWYgKE5VTEwgPT0gKGhTYnJDdXQtPnBfWUJ1ZmZlciA9IEdldFJhbV9TYnJfZW52WUJ1ZmZlcihjaGFubmVsKSkpIHsKKyAgICBnb3RvIGJhaWw7CiAgIH0KIAotICBGSVhQX0RCTCogckJ1ZmZlciA9IEdldFJhbV9TYnJfZW52UkJ1ZmZlcigwLCBkeW5hbWljX1JBTSk7Ci0gIEZJWFBfREJMKiBpQnVmZmVyID0gR2V0UmFtX1Nicl9lbnZJQnVmZmVyKDAsIGR5bmFtaWNfUkFNKTsKKyAgZm9yIChpID0gMDsgaSA8ICgzMiA+PiAxKTsgaSsrKSB7CisgICAgaFNickN1dC0+WUJ1ZmZlcltpXSA9IGhTYnJDdXQtPnBfWUJ1ZmZlciArIChpICogNjQpOworICB9CisgIFlCdWZmZXJEeW4gPSBHZXRSYW1fU2JyX2VudllCdWZmZXIoY2hJbkVsLCBkeW5hbWljX1JBTSk7CisgIGZvciAobiA9IDA7IGkgPCAzMjsgaSsrLCBuKyspIHsKKyAgICBoU2JyQ3V0LT5ZQnVmZmVyW2ldID0gWUJ1ZmZlckR5biArIChuICogNjQpOworICB9CiAKLSAgZm9yIChpID0gMDsgaSA8IFFNRl9NQVhfVElNRV9TTE9UUzsgaSsrKSB7Ci0gICAgaFNickN1dC0+ckJ1ZmZlcltpXSA9IHJCdWZmZXIgKyAoaSpRTUZfQ0hBTk5FTFMpOwotICAgIGhTYnJDdXQtPmlCdWZmZXJbaV0gPSBpQnVmZmVyICsgKGkqUU1GX0NIQU5ORUxTKTsKKyAgckJ1ZmZlciA9IEdldFJhbV9TYnJfZW52UkJ1ZmZlcigwLCBkeW5hbWljX1JBTSk7CisgIGlCdWZmZXIgPSBHZXRSYW1fU2JyX2VudklCdWZmZXIoMCwgZHluYW1pY19SQU0pOworCisgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgaFNickN1dC0+ckJ1ZmZlcltpXSA9IHJCdWZmZXIgKyAoaSAqIDY0KTsKKyAgICBoU2JyQ3V0LT5pQnVmZmVyW2ldID0gaUJ1ZmZlciArIChpICogNjQpOwogICB9CiAKICAgcmV0dXJuIDA7Ci19CiAKK2JhaWw6CisgIEZES3NickVuY19kZWxldGVFeHRyYWN0U2JyRW52ZWxvcGUoaFNickN1dCk7CisKKyAgcmV0dXJuIC0xOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCkBAIC0xOTEyLDM2ICsxODkyLDIyIEBACiAgIFxyZXR1cm4gZXJyb3Igc3RhdHVzCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQKLUZES3NickVuY19Jbml0RXh0cmFjdFNickVudmVsb3BlIChIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgIGhTYnJDdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vX2NvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vX3Jvd3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lX3Nsb3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lX3N0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5fb2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HIHN0YXRlc0luaXRGbGFnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsaW50IGNoSW5FbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFVDSEFSKiBkeW5hbWljX1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFVJTlQgc2JyU3ludGF4RmxhZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17CitJTlQgRkRLc2JyRW5jX0luaXRFeHRyYWN0U2JyRW52ZWxvcGUoSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFIGhTYnJDdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vX2NvbHMsIGludCBub19yb3dzLCBpbnQgc3RhcnRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVfc2xvdHMsIGludCB0aW1lX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5fb2ZmLCBVTE9ORyBzdGF0ZXNJbml0RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hJbkVsLCBVQ0hBUiAqZHluYW1pY19SQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzYnJTeW50YXhGbGFncykgewogICBpbnQgWUJ1ZmZlckxlbmd0aCwgckJ1ZmZlckxlbmd0aDsKICAgaW50IGk7CiAKICAgaWYgKHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpIHsKICAgICBpbnQgb2ZmID0gVFJBTlNJRU5UX09GRlNFVF9MRDsKLSNpZm5kZWYgRlVMTF9ERUxBWQotICAgIGhTYnJDdXQtPllCdWZmZXJXcml0ZU9mZnNldCA9IChub19jb2xzPj4xKStvZmYqdGltZV9zdGVwOwotI2Vsc2UKLSAgICBoU2JyQ3V0LT5ZQnVmZmVyV3JpdGVPZmZzZXQgPSBub19jb2xzK29mZip0aW1lX3N0ZXA7Ci0jZW5kaWYKLSAgfSBlbHNlCi0gIHsKLSAgICBoU2JyQ3V0LT5ZQnVmZmVyV3JpdGVPZmZzZXQgPSB0cmFuX29mZip0aW1lX3N0ZXA7CisgICAgaFNickN1dC0+WUJ1ZmZlcldyaXRlT2Zmc2V0ID0gKG5vX2NvbHMgPj4gMSkgKyBvZmYgKiB0aW1lX3N0ZXA7CisgIH0gZWxzZSB7CisgICAgaFNickN1dC0+WUJ1ZmZlcldyaXRlT2Zmc2V0ID0gdHJhbl9vZmYgKiB0aW1lX3N0ZXA7CiAgIH0KLSAgaFNickN1dC0+ckJ1ZmZlclJlYWRPZmZzZXQgID0gMDsKLQorICBoU2JyQ3V0LT5yQnVmZmVyUmVhZE9mZnNldCA9IDA7CiAKICAgWUJ1ZmZlckxlbmd0aCA9IGhTYnJDdXQtPllCdWZmZXJXcml0ZU9mZnNldCArIG5vX2NvbHM7CiAgIHJCdWZmZXJMZW5ndGggPSBub19jb2xzOwpAQCAtMTk0OSw3ICsxOTE1LDYgQEAKICAgaFNickN1dC0+cHJlX3RyYW5zaWVudF9pbmZvWzBdID0gMDsKICAgaFNickN1dC0+cHJlX3RyYW5zaWVudF9pbmZvWzFdID0gMDsKIAotCiAgIGhTYnJDdXQtPm5vX2NvbHMgPSBub19jb2xzOwogICBoU2JyQ3V0LT5ub19yb3dzID0gbm9fcm93czsKICAgaFNickN1dC0+c3RhcnRfaW5kZXggPSBzdGFydF9pbmRleDsKQEAgLTE5NTcsNyArMTkyMiw3IEBACiAgIGhTYnJDdXQtPnRpbWVfc2xvdHMgPSB0aW1lX3Nsb3RzOwogICBoU2JyQ3V0LT50aW1lX3N0ZXAgPSB0aW1lX3N0ZXA7CiAKLSAgRkRLX0FTU0VSVChub19yb3dzICAgICAgICA8PSAgIFFNRl9DSEFOTkVMUyk7CisgIEZES19BU1NFUlQobm9fcm93cyA8PSA2NCk7CiAKICAgLyogVXNlIGhhbGYgdGhlIEVuZXJneSB2YWx1ZXMgaWYgdGltZSBzdGVwIGlzIDIgb3IgZ3JlYXRlciAqLwogICBpZiAodGltZV9zdGVwID49IDIpCkBAIC0xOTY1LDQwICsxOTMwLDM3IEBACiAgIGVsc2UKICAgICBoU2JyQ3V0LT5ZQnVmZmVyU3pTaGlmdCA9IDA7CiAKLSAgWUJ1ZmZlckxlbmd0aCAgICAgICAgICAgICAgID4+PSBoU2JyQ3V0LT5ZQnVmZmVyU3pTaGlmdDsKKyAgWUJ1ZmZlckxlbmd0aCA+Pj0gaFNickN1dC0+WUJ1ZmZlclN6U2hpZnQ7CiAgIGhTYnJDdXQtPllCdWZmZXJXcml0ZU9mZnNldCA+Pj0gaFNickN1dC0+WUJ1ZmZlclN6U2hpZnQ7CiAKLSAgRkRLX0FTU0VSVChZQnVmZmVyTGVuZ3RoPD1RTUZfTUFYX1RJTUVfU0xPVFMpOworICBGREtfQVNTRVJUKFlCdWZmZXJMZW5ndGggPD0gMzIpOwogCiAgIEZJWFBfREJMICpZQnVmZmVyRHluID0gR2V0UmFtX1Nicl9lbnZZQnVmZmVyKGNoSW5FbCwgZHluYW1pY19SQU0pOwotICBJTlQgbj0wOwotICBmb3IgKGk9KFFNRl9NQVhfVElNRV9TTE9UUz4+MSk7IGkgPCBRTUZfTUFYX1RJTUVfU0xPVFM7IGkrKyxuKyspIHsKLSAgICBoU2JyQ3V0LT5ZQnVmZmVyW2ldID0gWUJ1ZmZlckR5biArIChuKlFNRl9DSEFOTkVMUyk7CisgIElOVCBuID0gMDsKKyAgZm9yIChpID0gKDMyID4+IDEpOyBpIDwgMzI7IGkrKywgbisrKSB7CisgICAgaFNickN1dC0+WUJ1ZmZlcltpXSA9IFlCdWZmZXJEeW4gKyAobiAqIDY0KTsKICAgfQogCi0gIGlmKHN0YXRlc0luaXRGbGFnKSB7Ci0gICAgZm9yIChpPTA7IGk8WUJ1ZmZlckxlbmd0aDsgaSsrKSB7Ci0gICAgICBGREttZW1jbGVhciggaFNickN1dC0+WUJ1ZmZlcltpXSxRTUZfQ0hBTk5FTFMqc2l6ZW9mKEZJWFBfREJMKSk7CisgIGlmIChzdGF0ZXNJbml0RmxhZykgeworICAgIGZvciAoaSA9IDA7IGkgPCBZQnVmZmVyTGVuZ3RoOyBpKyspIHsKKyAgICAgIEZES21lbWNsZWFyKGhTYnJDdXQtPllCdWZmZXJbaV0sIDY0ICogc2l6ZW9mKEZJWFBfREJMKSk7CiAgICAgfQogICB9CiAKICAgZm9yIChpID0gMDsgaSA8IHJCdWZmZXJMZW5ndGg7IGkrKykgewotICAgIEZES21lbWNsZWFyKCBoU2JyQ3V0LT5yQnVmZmVyW2ldLFFNRl9DSEFOTkVMUypzaXplb2YoRklYUF9EQkwpKTsKLSAgICBGREttZW1jbGVhciggaFNickN1dC0+aUJ1ZmZlcltpXSxRTUZfQ0hBTk5FTFMqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgRkRLbWVtY2xlYXIoaFNickN1dC0+ckJ1ZmZlcltpXSwgNjQgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICBGREttZW1jbGVhcihoU2JyQ3V0LT5pQnVmZmVyW2ldLCA2NCAqIHNpemVvZihGSVhQX0RCTCkpOwogICB9CiAKLSAgRkRLbWVtY2xlYXIgKGhTYnJDdXQtPmVudmVsb3BlQ29tcGVuc2F0aW9uLHNpemVvZihVQ0hBUikqTUFYX0ZSRVFfQ09FRkZTKTsKKyAgRkRLbWVtY2xlYXIoaFNickN1dC0+ZW52ZWxvcGVDb21wZW5zYXRpb24sIHNpemVvZihVQ0hBUikgKiBNQVhfRlJFUV9DT0VGRlMpOwogCi0gIGlmKHN0YXRlc0luaXRGbGFnKSB7Ci0gICAgaFNickN1dC0+WUJ1ZmZlclNjYWxlWzBdID0gaFNickN1dC0+WUJ1ZmZlclNjYWxlWzFdID0gRlJBQ1RfQklUUy0xOworICBpZiAoc3RhdGVzSW5pdEZsYWcpIHsKKyAgICBoU2JyQ3V0LT5ZQnVmZmVyU2NhbGVbMF0gPSBoU2JyQ3V0LT5ZQnVmZmVyU2NhbGVbMV0gPSBGUkFDVF9CSVRTIC0gMTsKICAgfQogCiAgIHJldHVybiAoMCk7CiB9CiAKLQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiEKIApAQCAtMjAwOCwyMyArMTk3MCwxNiBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1GREtzYnJFbmNfZGVsZXRlRXh0cmFjdFNickVudmVsb3BlIChIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgaFNickN1dCkKLXsKLQordm9pZCBGREtzYnJFbmNfZGVsZXRlRXh0cmFjdFNickVudmVsb3BlKEhBTkRMRV9TQlJfRVhUUkFDVF9FTlZFTE9QRSBoU2JyQ3V0KSB7CiAgIGlmIChoU2JyQ3V0KSB7CiAgICAgRnJlZVJhbV9TYnJfZW52WUJ1ZmZlcigmaFNickN1dC0+cF9ZQnVmZmVyKTsKICAgfQogfQogCi1JTlQKLUZES3NickVuY19HZXRFbnZFc3REZWxheShIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgaFNicikKLXsKLSAgcmV0dXJuIGhTYnItPm5vX3Jvd3MqKChoU2JyLT5ZQnVmZmVyV3JpdGVPZmZzZXQpKjIgICAgIC8qIG11bHQgMiBiZWNhdXNlIG5yZydzIGFyZSBncm91cGVkIGhhbGYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC0gaFNici0+ckJ1ZmZlclJlYWRPZmZzZXQgKTsgICAgICAgLyogaW4gcmVmZXJlbmNlIGhvbGQgaGFsZiBzcGVjIGFuZCBjYWxjIG5yZydzIG9uIG92ZXJsYXBwZWQgc3BlYyAqLwotCitJTlQgRkRLc2JyRW5jX0dldEVudkVzdERlbGF5KEhBTkRMRV9TQlJfRVhUUkFDVF9FTlZFTE9QRSBoU2JyKSB7CisgIHJldHVybiBoU2JyLT5ub19yb3dzICoKKyAgICAgICAgICgoaFNici0+WUJ1ZmZlcldyaXRlT2Zmc2V0KSAqCisgICAgICAgICAgICAgIDIgLyogbXVsdCAyIGJlY2F1c2UgbnJnJ3MgYXJlIGdyb3VwZWQgaGFsZiAqLworICAgICAgICAgIC0gaFNici0+ckJ1ZmZlclJlYWRPZmZzZXQpOyAvKiBpbiByZWZlcmVuY2UgaG9sZCBoYWxmIHNwZWMgYW5kIGNhbGMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJnJ3Mgb24gb3ZlcmxhcHBlZCBzcGVjICovCiB9Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvZW52X2VzdC5oIGIvbGliU0JSZW5jL3NyYy9lbnZfZXN0LmgKaW5kZXggZTE3YTk3NC4uMDA2ZjU1YiAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9lbnZfZXN0LmgKKysrIGIvbGliU0JSZW5jL3NyYy9lbnZfZXN0LmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTQgKzkwLDIyIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgRW52ZWxvcGUgZXN0aW1hdGlvbiBzdHJ1Y3RzIGFuZCBwcm90b3R5cGVzICAKKyAgXGJyaWVmICBFbnZlbG9wZSBlc3RpbWF0aW9uIHN0cnVjdHMgYW5kIHByb3RvdHlwZXMgJFJldmlzaW9uOiA5Mjc5MCAkCiAqLwotI2lmbmRlZiBfX0VOVl9FU1RfSAotI2RlZmluZSBfX0VOVl9FU1RfSAorI2lmbmRlZiBFTlZfRVNUX0gKKyNkZWZpbmUgRU5WX0VTVF9ICiAKICNpbmNsdWRlICJzYnJfZGVmLmgiCiAjaW5jbHVkZSAic2JyX2VuY29kZXIuaCIgLyogU0JSIGVjb25maWcgc3RydWN0cyAqLwpAQCAtOTcsMjAgKzExNiwxOCBAQAogI2luY2x1ZGUgImNvZGVfZW52LmgiCiAjaW5jbHVkZSAidG9uX2NvcnIuaCIKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgRklYUF9EQkwgICpyQnVmZmVyW1FNRl9NQVhfVElNRV9TTE9UU107Ci0gIEZJWFBfREJMICAqaUJ1ZmZlcltRTUZfTUFYX1RJTUVfU0xPVFNdOwordHlwZWRlZiBzdHJ1Y3QgeworICBGSVhQX0RCTCAqckJ1ZmZlclszMl07CisgIEZJWFBfREJMICppQnVmZmVyWzMyXTsKIAotICBGSVhQX0RCTCAgKnBfWUJ1ZmZlcjsKKyAgRklYUF9EQkwgKnBfWUJ1ZmZlcjsKIAotICBGSVhQX0RCTCAgKllCdWZmZXJbUU1GX01BWF9USU1FX1NMT1RTXTsKLSAgaW50ICAgICAgICBZQnVmZmVyU2NhbGVbMl07CisgIEZJWFBfREJMICpZQnVmZmVyWzMyXTsKKyAgaW50IFlCdWZmZXJTY2FsZVsyXTsKIAogICBVQ0hBUiBlbnZlbG9wZUNvbXBlbnNhdGlvbltNQVhfRlJFUV9DT0VGRlNdOwogICBVQ0hBUiBwcmVfdHJhbnNpZW50X2luZm9bMl07CiAKLQogICBpbnQgWUJ1ZmZlcldyaXRlT2Zmc2V0OwogICBpbnQgWUJ1ZmZlclN6U2hpZnQ7CiAgIGludCByQnVmZmVyUmVhZE9mZnNldDsKQEAgLTEyMSwyMSArMTM4LDE4IEBACiAKICAgaW50IHRpbWVfc2xvdHM7CiAgIGludCB0aW1lX3N0ZXA7Ci19Ci1TQlJfRVhUUkFDVF9FTlZFTE9QRTsKK30gU0JSX0VYVFJBQ1RfRU5WRUxPUEU7CiB0eXBlZGVmIFNCUl9FWFRSQUNUX0VOVkVMT1BFICpIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEU7CiAKLXN0cnVjdCBFTlZfQ0hBTk5FTAoteworc3RydWN0IEVOVl9DSEFOTkVMIHsKICAgRkFTVF9UUkFOX0RFVEVDVE9SIHNickZhc3RUcmFuc2llbnREZXRlY3RvcjsKICAgU0JSX1RSQU5TSUVOVF9ERVRFQ1RPUiBzYnJUcmFuc2llbnREZXRlY3RvcjsKICAgU0JSX0NPREVfRU5WRUxPUEUgc2JyQ29kZUVudmVsb3BlOwogICBTQlJfQ09ERV9FTlZFTE9QRSBzYnJDb2RlTm9pc2VGbG9vcjsKICAgU0JSX0VYVFJBQ1RfRU5WRUxPUEUgc2JyRXh0cmFjdEVudmVsb3BlOwogCi0KICAgU0JSX0VOVkVMT1BFX0ZSQU1FIFNickVudkZyYW1lOwotICBTQlJfVE9OX0NPUlJfRVNUICAgVG9uQ29ycjsKKyAgU0JSX1RPTl9DT1JSX0VTVCBUb25Db3JyOwogCiAgIHN0cnVjdCBTQlJfRU5WX0RBVEEgZW5jRW52RGF0YTsKIApAQCAtMTQ2LDgwICsxNjAsNjQgQEAKIAogLyoqKioqKioqKioqKiAgRnVuY3Rpb24gRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKi8KIAotSU5UCi1GREtzYnJFbmNfQ3JlYXRlRXh0cmFjdFNickVudmVsb3BlIChIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgIGhTYnJDdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2hhbm5lbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsSU5UIGNoSW5FbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsVUNIQVIqIGR5bmFtaWNfUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgKTsKK0lOVCBGREtzYnJFbmNfQ3JlYXRlRXh0cmFjdFNickVudmVsb3BlKEhBTkRMRV9TQlJfRVhUUkFDVF9FTlZFTE9QRSBoU2JyQ3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNoYW5uZWwsIElOVCBjaEluRWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqZHluYW1pY19SQU0pOwogCitJTlQgRkRLc2JyRW5jX0luaXRFeHRyYWN0U2JyRW52ZWxvcGUoSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFIGhTYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vX2NvbHMsIGludCBub19yb3dzLCBpbnQgc3RhcnRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVfc2xvdHMsIGludCB0aW1lX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5fb2ZmLCBVTE9ORyBzdGF0ZXNJbml0RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hJbkVsLCBVQ0hBUiAqZHluYW1pY19SQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzYnJTeW50YXhGbGFncyk7CiAKLUlOVAotRkRLc2JyRW5jX0luaXRFeHRyYWN0U2JyRW52ZWxvcGUgKAotICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgaFNiciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vX2NvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub19yb3dzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lX3Nsb3RzLCBpbnQgdGltZV9zdGVwLCBpbnQgdHJhbl9vZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HIHN0YXRlc0luaXRGbGFnCi0gICAgICAgICAgICAgICAgICAgICAgICAgLGludCBjaEluRWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAsVUNIQVIqIGR5bmFtaWNfUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgLFVJTlQgc2JyU3ludGF4RmxhZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICApOwotCi12b2lkIEZES3NickVuY19kZWxldGVFeHRyYWN0U2JyRW52ZWxvcGUgKEhBTkRMRV9TQlJfRVhUUkFDVF9FTlZFTE9QRSBoU2JyQ3V0KTsKK3ZvaWQgRkRLc2JyRW5jX2RlbGV0ZUV4dHJhY3RTYnJFbnZlbG9wZShIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgaFNickN1dCk7CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBGUkVRX1JFUyByZXNbTUFYX05VTV9OT0lTRV9WQUxVRVNdOwotICAgIGludCBtYXhRdWFudEVycm9yOworICBGUkVRX1JFUyByZXNbTUFYX05VTV9OT0lTRV9WQUxVRVNdOworICBpbnQgbWF4UXVhbnRFcnJvcjsKIAogfSBTQlJfRlJBTUVfVEVNUF9EQVRBOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgY29uc3QgU0JSX0ZSQU1FX0lORk8gKmZyYW1lX2luZm87Ci0gICAgRklYUF9EQkwgbm9pc2VGbG9vcltNQVhfTlVNX05PSVNFX1ZBTFVFU107Ci0gICAgU0NIQVIgc2ZiX25yZ19jb3VwbGluZ1tNQVhfTlVNX0VOVkVMT1BFX1ZBTFVFU107IC8qIG9ubHkgdXNlZCBpZiBzdGVyZW9tb2RlID0gU1dJVENIX0xfUl9DICovCi0gICAgU0NIQVIgc2ZiX25yZ1tNQVhfTlVNX0VOVkVMT1BFX1ZBTFVFU107Ci0gICAgU0NIQVIgbm9pc2VfbGV2ZWxfY291cGxpbmdbTUFYX05VTV9OT0lTRV9WQUxVRVNdOyAvKiBvbmx5IHVzZWQgaWYgc3RlcmVvbW9kZSA9IFNXSVRDSF9MX1JfQyAqLwotICAgIFNDSEFSIG5vaXNlX2xldmVsW01BWF9OVU1fTk9JU0VfVkFMVUVTXTsKLSAgICBVQ0hBUiB0cmFuc2llbnRfaW5mb1szXTsKLSAgICBVQ0hBUiBuRW52ZWxvcGVzOworICBjb25zdCBTQlJfRlJBTUVfSU5GTyAqZnJhbWVfaW5mbzsKKyAgRklYUF9EQkwgbm9pc2VGbG9vcltNQVhfTlVNX05PSVNFX1ZBTFVFU107CisgIFNDSEFSIHNmYl9ucmdfY291cGxpbmcKKyAgICAgIFtNQVhfTlVNX0VOVkVMT1BFX1ZBTFVFU107IC8qIG9ubHkgdXNlZCBpZiBzdGVyZW9tb2RlID0gU1dJVENIX0xfUl9DICovCisgIFNDSEFSIHNmYl9ucmdbTUFYX05VTV9FTlZFTE9QRV9WQUxVRVNdOworICBTQ0hBUiBub2lzZV9sZXZlbF9jb3VwbGluZworICAgICAgW01BWF9OVU1fTk9JU0VfVkFMVUVTXTsgLyogb25seSB1c2VkIGlmIHN0ZXJlb21vZGUgPSBTV0lUQ0hfTF9SX0MgKi8KKyAgU0NIQVIgbm9pc2VfbGV2ZWxbTUFYX05VTV9OT0lTRV9WQUxVRVNdOworICBVQ0hBUiB0cmFuc2llbnRfaW5mb1szXTsKKyAgVUNIQVIgbkVudmVsb3BlczsKIH0gU0JSX0VOVl9URU1QX0RBVEE7CiAKIC8qCi0gKiBFeHRyYWN0IGZlYXR1cmVzIGZyb20gUU1GIGRhdGEuIEFmdGVyd2FyZHMsIHRoZSBRTUYgZGF0YSBpcyBub3QgcmVxdWlyZWQgYW55bW9yZS4KKyAqIEV4dHJhY3QgZmVhdHVyZXMgZnJvbSBRTUYgZGF0YS4gQWZ0ZXJ3YXJkcywgdGhlIFFNRiBkYXRhIGlzIG5vdCByZXF1aXJlZAorICogYW55bW9yZS4KICAqLwotdm9pZAotRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZTEoCi0gICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSAgICBoX2NvbiwKLSAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBICAgIHNickhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSBzYnJCaXRzdHJlYW1EYXRhLAotICAgICAgICAgICAgICAgICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCAgICAgICAgaF9lbnZDaGFuLAotICAgICAgICAgICAgICAgICAgIEhBTkRMRV9DT01NT05fREFUQSAgICAgICAgY21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgU0JSX0VOVl9URU1QX0RBVEEgICAqZURhdGEsCi0gICAgICAgICAgICAgICAgICAgU0JSX0ZSQU1FX1RFTVBfREFUQSAqZkRhdGEKLSAgICAgICAgICAgICAgICAgICAgKTsKLQordm9pZCBGREtzYnJFbmNfZXh0cmFjdFNickVudmVsb3BlMShIQU5ETEVfU0JSX0NPTkZJR19EQVRBIGhfY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIHNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgc2JyQml0c3RyZWFtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0VOVl9DSEFOTkVMIGhfZW52Q2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBIGNtb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfRU5WX1RFTVBfREFUQSAqZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9GUkFNRV9URU1QX0RBVEEgKmZEYXRhKTsKIAogLyoKICAqIFByb2Nlc3MgdGhlIHByZXZpb3VzbHkgZmVhdHVyZXMgZXh0cmFjdGVkIGJ5IEZES3NickVuY19leHRyYWN0U2JyRW52ZWxvcGUxCiAgKiBhbmQgY3JlYXRlL2VuY29kZSBTQlIgZW52ZWxvcGVzLgogICovCi12b2lkCi1GREtzYnJFbmNfZXh0cmFjdFNickVudmVsb3BlMigKLSAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0NPTkZJR19EQVRBICAgICBoX2NvbiwKLSAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBICAgICBzYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgIGhQYXJhbWV0cmljU3RlcmVvLAotICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfQklUU1RSRUFNX0RBVEEgIHNickJpdHN0cmVhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgSEFORExFX0VOVl9DSEFOTkVMICAgICAgICAgc2JyRW52Q2hhbm5lbDAsCi0gICAgICAgICAgICAgICAgICAgSEFORExFX0VOVl9DSEFOTkVMICAgICAgICAgc2JyRW52Q2hhbm5lbDEsCi0gICAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBICAgICAgICAgY21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgU0JSX0VOVl9URU1QX0RBVEEgICAgICAgICAqZURhdGEsCi0gICAgICAgICAgICAgICAgICAgU0JSX0ZSQU1FX1RFTVBfREFUQSAgICAgICAqZkRhdGEsCi0gICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJPdXRwdXQKLSAgICAgICAgICAgICAgICAgICApOwordm9pZCBGREtzYnJFbmNfZXh0cmFjdFNickVudmVsb3BlMihIQU5ETEVfU0JSX0NPTkZJR19EQVRBIGhfY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIHNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSBzYnJCaXRzdHJlYW1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgc2JyRW52Q2hhbm5lbDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCBzYnJFbnZDaGFubmVsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0NPTU1PTl9EQVRBIGNtb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfRU5WX1RFTVBfREFUQSAqZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9GUkFNRV9URU1QX0RBVEEgKmZEYXRhLCBpbnQgY2xlYXJPdXRwdXQpOwogCi1JTlQKLUZES3NickVuY19HZXRFbnZFc3REZWxheShIQU5ETEVfU0JSX0VYVFJBQ1RfRU5WRUxPUEUgaFNicik7CitJTlQgRkRLc2JyRW5jX0dldEVudkVzdERlbGF5KEhBTkRMRV9TQlJfRVhUUkFDVF9FTlZFTE9QRSBoU2JyKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL2ZyYW1fZ2VuLmNwcCBiL2xpYlNCUmVuYy9zcmMvZnJhbV9nZW4uY3BwCmluZGV4IDlhMzUxMTEuLjdlZDZlNzkgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvZnJhbV9nZW4uY3BwCisrKyBiL2xpYlNCUmVuYy9zcmMvZnJhbV9nZW4uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDI3MiArOTAsMjM1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImZyYW1fZ2VuLmgiCiAjaW5jbHVkZSAic2JyX21pc2MuaCIKIAogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAKLXN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8xXzIwNDggPSB7Ci0gICAgICAgICAgICAxLAotICAgICAgICAgICAgeyAwLCAxNn0sCi0gICAgICAgICAgICB7RlJFUV9SRVNfSElHSH0sCi0gICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAxLAotICAgICAgICAgICAgIHswLCAxNn0gfTsKK3N0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8xXzIwNDggPSB7MSwgezAsIDE2fSwge0ZSRVFfUkVTX0hJR0h9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAgICAgICB7MCwgMTZ9fTsKIAogc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzJfMjA0OCA9IHsKLSAgICAgICAgICAgIDIsCi0gICAgICAgICAgICB7IDAsICA4LCAxNn0sCi0gICAgICAgICAgICB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgMiwKLSAgICAgICAgICAgIHsgMCwgIDgsIDE2fSB9OworICAgIDIsIHswLCA4LCAxNn0sIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwgMCwgMiwgezAsIDgsIDE2fX07CiAKIHN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm80XzIwNDggPSB7Ci0gICAgICAgICAgICA0LAotICAgICAgICAgICAgeyAwLCAgNCwgIDgsIDEyLCAxNn0sCi0gICAgICAgICAgICB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgMiwKLSAgICAgICAgICAgIHsgMCwgIDgsIDE2fSB9OworICAgIDQsCisgICAgezAsIDQsIDgsIDEyLCAxNn0sCisgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAorICAgIDAsCisgICAgMiwKKyAgICB7MCwgOCwgMTZ9fTsKIAotc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzFfMjMwNCA9IHsKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7IDAsIDE4fSwKLSAgICAgICAgICAgIHtGUkVRX1JFU19ISUdIfSwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgeyAwLCAxOH0gfTsKK3N0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8xXzIzMDQgPSB7MSwgezAsIDE4fSwge0ZSRVFfUkVTX0hJR0h9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAgICAgICB7MCwgMTh9fTsKIAogc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzJfMjMwNCA9IHsKLSAgICAgICAgICAgIDIsCi0gICAgICAgICAgICB7IDAsICA5LCAxOH0sCi0gICAgICAgICAgICB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgMiwKLSAgICAgICAgICAgIHsgMCwgIDksIDE4fSB9OworICAgIDIsIHswLCA5LCAxOH0sIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwgMCwgMiwgezAsIDksIDE4fX07CiAKIHN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm80XzIzMDQgPSB7Ci0gICAgICAgICAgICA0LAotICAgICAgICAgICAgeyAwLCAgNSwgIDksIDE0LCAxOH0sCi0gICAgICAgICAgICB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgMiwKLSAgICAgICAgICAgIHsgMCwgIDksIDE4fSB9OworICAgIDQsCisgICAgezAsIDUsIDksIDE0LCAxOH0sCisgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAorICAgIDAsCisgICAgMiwKKyAgICB7MCwgOSwgMTh9fTsKIAotc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzFfMTkyMCA9IHsKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7IDAsIDE1fSwKLSAgICAgICAgICAgIHtGUkVRX1JFU19ISUdIfSwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgeyAwLCAxNX0gfTsKK3N0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8xXzE5MjAgPSB7MSwgezAsIDE1fSwge0ZSRVFfUkVTX0hJR0h9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAgICAgICB7MCwgMTV9fTsKIAogc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzJfMTkyMCA9IHsKLSAgICAgICAgICAgIDIsCi0gICAgICAgICAgICB7IDAsICA4LCAxNX0sCi0gICAgICAgICAgICB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgMiwKLSAgICAgICAgICAgIHsgMCwgIDgsIDE1fSB9OworICAgIDIsIHswLCA4LCAxNX0sIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwgMCwgMiwgezAsIDgsIDE1fX07CiAKIHN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm80XzE5MjAgPSB7Ci0gICAgICAgICAgICA0LAotICAgICAgICAgICAgeyAwLCAgNCwgIDgsIDEyLCAxNX0sCi0gICAgICAgICAgICB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgMiwKLSAgICAgICAgICAgIHsgMCwgIDgsIDE1fSB9OworICAgIDQsCisgICAgezAsIDQsIDgsIDEyLCAxNX0sCisgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAorICAgIDAsCisgICAgMiwKKyAgICB7MCwgOCwgMTV9fTsKIAotc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzFfMTE1MiA9IHsKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7IDAsICA5fSwKLSAgICAgICAgICAgIHtGUkVRX1JFU19ISUdIfSwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgeyAwLCAgOX0gfTsKK3N0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8xXzExNTIgPSB7MSwgezAsIDl9LCB7RlJFUV9SRVNfSElHSH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsICAgICAgezAsIDl9fTsKIAogc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzJfMTE1MiA9IHsKLSAgICAgICAgICAgIDIsCi0gICAgICAgICAgICB7IDAsICA1LCAgOX0sCi0gICAgICAgICAgICB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgMiwKLSAgICAgICAgICAgIHsgMCwgIDUsICA5fSB9OworICAgIDIsIHswLCA1LCA5fSwge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LCAwLCAyLCB7MCwgNSwgOX19OwogCiBzdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvNF8xMTUyID0gewotICAgICAgICAgICAgNCwKLSAgICAgICAgICAgIHsgMCwgIDIsICA1LAotICAgICAgICAgICAgICA3LCAgOX0sCi0gICAgICAgICAgICB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgMiwKLSAgICAgICAgICAgIHsgMCwgIDUsICA5fSB9OwotCisgICAgNCwKKyAgICB7MCwgMiwgNSwgNywgOX0sCisgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAorICAgIDAsCisgICAgMiwKKyAgICB7MCwgNSwgOX19OwogCiAvKiBBQUNMRCBmcmFtZSBpbmZvICovCi1zdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvMV81MTJMRCA9IHsKLSAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgIHswLCA4fSwKLSAgICAgICAgICAgICAgICAgICB7RlJFUV9SRVNfSElHSH0sCi0gICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgIHswLCA4fX07CitzdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvMV81MTJMRCA9IHsxLCB7MCwgOH0sIHtGUkVRX1JFU19ISUdIfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsICAgICAgezAsIDh9fTsKIAogc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzJfNTEyTEQgPSB7Ci0gICAgICAgICAgICAgICAgICAgMiwKLSAgICAgICAgICAgICAgICAgICB7MCwgNCwgOH0sCi0gICAgICAgICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAotICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgMiwKLSAgICAgICAgICAgICAgICAgICB7MCwgNCwgOH19OworICAgIDIsIHswLCA0LCA4fSwge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LCAwLCAyLCB7MCwgNCwgOH19OwogCiBzdGF0aWMgY29uc3QgU0JSX0ZSQU1FX0lORk8gZnJhbWVJbmZvNF81MTJMRCA9IHsKLSAgICAgICAgICAgICAgICAgICA0LAotICAgICAgICAgICAgICAgICAgIHswLCAyLCA0LCA2LCA4fSwKLSAgICAgICAgICAgICAgICAgICB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sCi0gICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAyLAotICAgICAgICAgICAgICAgICAgIHswLCA0LCA4fX07CisgICAgNCwKKyAgICB7MCwgMiwgNCwgNiwgOH0sCisgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAorICAgIDAsCisgICAgMiwKKyAgICB7MCwgNCwgOH19OwogCi1zdGF0aWMgaW50Ci1jYWxjRmlsbExlbmd0aE1heCAoaW50IHRyYW5Qb3MsICAgICAgICAgIC8qITwgaW5wdXQgOiB0cmFuc2llbnQgcG9zaXRpb24gKHJlZjogdHJhbiBkZXQpICovCi0gICAgICAgICAgICAgICAgICAgaW50IG51bWJlclRpbWVTbG90cyAgIC8qITwgaW5wdXQgOiBudW1iZXIgb2YgdGltZXNsb3RzICovCi0gICAgICAgICAgICAgICAgICAgKTsKK3N0YXRpYyBpbnQgY2FsY0ZpbGxMZW5ndGhNYXgoCisgICAgaW50IHRyYW5Qb3MsICAgICAgICAvKiE8IGlucHV0IDogdHJhbnNpZW50IHBvc2l0aW9uIChyZWY6IHRyYW4gZGV0KSAqLworICAgIGludCBudW1iZXJUaW1lU2xvdHMgLyohPCBpbnB1dCA6IG51bWJlciBvZiB0aW1lc2xvdHMgKi8KKyk7CiAKLXN0YXRpYyB2b2lkCi1maWxsRnJhbWVUcmFuIChjb25zdCBpbnQgKnZfdHVuaW5nU2VnbSwgICAgICAvKiE8IHR1bmluZzogZGVzaXJlZCBzZWdtZW50IGxlbmd0aHMgKi8KLSAgICAgICAgICAgICAgIGNvbnN0IGludCAqdl90dW5pbmdGcmVxLCAgICAgIC8qITwgdHVuaW5nOiBkZXNpcmVkIGZyZXF1ZW5jeSByZXNvbHV0aW9ucyAqLwotICAgICAgICAgICAgICAgaW50IHRyYW4sICAgICAgICAgICAgICAgICAgICAgLyohPCBpbnB1dCA6IHBvc2l0aW9uIG9mIHRyYW5zaWVudCAqLwotICAgICAgICAgICAgICAgaW50ICp2X2JvcmQsICAgICAgICAgICAgICAgICAgLyohPCBtZW1OZXc6IGJvcmRlcnMgKi8KLSAgICAgICAgICAgICAgIGludCAqbGVuZ3RoX3ZfYm9yZCwgICAgICAgICAgIC8qITwgbWVtTmV3OiAjIGJvcmRlcnMgKi8KLSAgICAgICAgICAgICAgIGludCAqdl9mcmVxLCAgICAgICAgICAgICAgICAgIC8qITwgbWVtTmV3OiBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgKi8KLSAgICAgICAgICAgICAgIGludCAqbGVuZ3RoX3ZfZnJlcSwgICAgICAgICAgIC8qITwgbWVtTmV3OiAjIGZyZXF1ZW5jeSByZXNvbHV0aW9ucyAqLwotICAgICAgICAgICAgICAgaW50ICpibWluLCAgICAgICAgICAgICAgICAgICAgLyohPCBobHBOZXc6IGZpcnN0IG1hbmRhdG9yeSBib3JkZXIgKi8KLSAgICAgICAgICAgICAgIGludCAqYm1heCAgICAgICAgICAgICAgICAgICAgIC8qITwgaGxwTmV3OiBsYXN0ICBtYW5kYXRvcnkgYm9yZGVyICovCi0gICAgICAgICAgICAgICApOworc3RhdGljIHZvaWQgZmlsbEZyYW1lVHJhbigKKyAgICBjb25zdCBpbnQgKnZfdHVuaW5nU2VnbSwgLyohPCB0dW5pbmc6IGRlc2lyZWQgc2VnbWVudCBsZW5ndGhzICovCisgICAgY29uc3QgaW50ICp2X3R1bmluZ0ZyZXEsIC8qITwgdHVuaW5nOiBkZXNpcmVkIGZyZXF1ZW5jeSByZXNvbHV0aW9ucyAqLworICAgIGludCB0cmFuLCAgICAgICAgICAgICAgICAvKiE8IGlucHV0IDogcG9zaXRpb24gb2YgdHJhbnNpZW50ICovCisgICAgaW50ICp2X2JvcmQsICAgICAgICAgICAgIC8qITwgbWVtTmV3OiBib3JkZXJzICovCisgICAgaW50ICpsZW5ndGhfdl9ib3JkLCAgICAgIC8qITwgbWVtTmV3OiAjIGJvcmRlcnMgKi8KKyAgICBpbnQgKnZfZnJlcSwgICAgICAgICAgICAgLyohPCBtZW1OZXc6IGZyZXF1ZW5jeSByZXNvbHV0aW9ucyAqLworICAgIGludCAqbGVuZ3RoX3ZfZnJlcSwgICAgICAvKiE8IG1lbU5ldzogIyBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgKi8KKyAgICBpbnQgKmJtaW4sICAgICAgICAgICAgICAgLyohPCBobHBOZXc6IGZpcnN0IG1hbmRhdG9yeSBib3JkZXIgKi8KKyAgICBpbnQgKmJtYXggICAgICAgICAgICAgICAgLyohPCBobHBOZXc6IGxhc3QgIG1hbmRhdG9yeSBib3JkZXIgKi8KKyk7CiAKLXN0YXRpYyB2b2lkIGZpbGxGcmFtZVByZSAoSU5UIGRtYXgsIElOVCAqdl9ib3JkLCBJTlQgKmxlbmd0aF92X2JvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqdl9mcmVxLCBJTlQgKmxlbmd0aF92X2ZyZXEsIElOVCBibWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgcmVzdCk7CitzdGF0aWMgdm9pZCBmaWxsRnJhbWVQcmUoSU5UIGRtYXgsIElOVCAqdl9ib3JkLCBJTlQgKmxlbmd0aF92X2JvcmQsIElOVCAqdl9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfZnJlcSwgSU5UIGJtaW4sIElOVCByZXN0KTsKIAotc3RhdGljIHZvaWQgZmlsbEZyYW1lUG9zdCAoSU5UICpwYXJ0cywgSU5UICpkLCBJTlQgZG1heCwgSU5UICp2X2JvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2JvcmQsIElOVCAqdl9mcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9mcmVxLCBJTlQgYm1heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBidWZmZXJGcmFtZVN0YXJ0LCBJTlQgbnVtYmVyVGltZVNsb3RzLCBJTlQgZm1heCk7CitzdGF0aWMgdm9pZCBmaWxsRnJhbWVQb3N0KElOVCAqcGFydHMsIElOVCAqZCwgSU5UIGRtYXgsIElOVCAqdl9ib3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2JvcmQsIElOVCAqdl9mcmVxLCBJTlQgKmxlbmd0aF92X2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBibWF4LCBJTlQgYnVmZmVyRnJhbWVTdGFydCwgSU5UIG51bWJlclRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGZtYXgpOwogCi1zdGF0aWMgdm9pZCBmaWxsRnJhbWVJbnRlciAoSU5UICpuTCwgY29uc3QgaW50ICp2X3R1bmluZ1NlZ20sIElOVCAqdl9ib3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UIGJtaW4sIElOVCAqdl9mcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfZnJlcSwgSU5UICp2X2JvcmRGb2xsb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkRm9sbG93LCBJTlQgKnZfZnJlcUZvbGxvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2ZyZXFGb2xsb3csIElOVCBpX2ZpbGxGb2xsb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGRtaW4sIElOVCBkbWF4LCBJTlQgbnVtYmVyVGltZVNsb3RzKTsKK3N0YXRpYyB2b2lkIGZpbGxGcmFtZUludGVyKElOVCAqbkwsIGNvbnN0IGludCAqdl90dW5pbmdTZWdtLCBJTlQgKnZfYm9yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UIGJtaW4sIElOVCAqdl9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9mcmVxLCBJTlQgKnZfYm9yZEZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdywgSU5UICp2X2ZyZXFGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2ZyZXFGb2xsb3csIElOVCBpX2ZpbGxGb2xsb3csIElOVCBkbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGRtYXgsIElOVCBudW1iZXJUaW1lU2xvdHMpOwogCi1zdGF0aWMgdm9pZCBjYWxjRnJhbWVDbGFzcyAoRlJBTUVfQ0xBU1MgKmZyYW1lQ2xhc3MsIEZSQU1FX0NMQVNTICpmcmFtZUNsYXNzT2xkLCBJTlQgdHJhbkZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpzcHJlYWRGbGFnKTsKK3N0YXRpYyB2b2lkIGNhbGNGcmFtZUNsYXNzKEZSQU1FX0NMQVNTICpmcmFtZUNsYXNzLCBGUkFNRV9DTEFTUyAqZnJhbWVDbGFzc09sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0cmFuRmxhZywgSU5UICpzcHJlYWRGbGFnKTsKIAotc3RhdGljIHZvaWQgc3BlY2lhbENhc2UgKElOVCAqc3ByZWFkRmxhZywgSU5UIGFsbG93U3ByZWFkLCBJTlQgKnZfYm9yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2JvcmQsIElOVCAqdl9mcmVxLCBJTlQgKmxlbmd0aF92X2ZyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwYXJ0cywgSU5UIGQpOworc3RhdGljIHZvaWQgc3BlY2lhbENhc2UoSU5UICpzcHJlYWRGbGFnLCBJTlQgYWxsb3dTcHJlYWQsIElOVCAqdl9ib3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgKnZfZnJlcSwgSU5UICpsZW5ndGhfdl9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwYXJ0cywgSU5UIGQpOwogCi1zdGF0aWMgdm9pZCBjYWxjQ21vbkJvcmRlciAoSU5UICppX2Ntb24sIElOVCAqaV90cmFuLCBJTlQgKnZfYm9yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2JvcmQsIElOVCB0cmFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBidWZmZXJGcmFtZVN0YXJ0LCBJTlQgbnVtYmVyVGltZVNsb3RzKTsKK3N0YXRpYyB2b2lkIGNhbGNDbW9uQm9yZGVyKElOVCAqaV9jbW9uLCBJTlQgKmlfdHJhbiwgSU5UICp2X2JvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2JvcmQsIElOVCB0cmFuLCBJTlQgYnVmZmVyRnJhbWVTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1iZXJUaW1lU2xvdHMpOwogCi1zdGF0aWMgdm9pZCBrZWVwRm9yRm9sbG93VXAgKElOVCAqdl9ib3JkRm9sbG93LCBJTlQgKmxlbmd0aF92X2JvcmRGb2xsb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqdl9mcmVxRm9sbG93LCBJTlQgKmxlbmd0aF92X2ZyZXFGb2xsb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqaV90cmFuRm9sbG93LCBJTlQgKmlfZmlsbEZvbGxvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICp2X2JvcmQsIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBpX2Ntb24sIElOVCBpX3RyYW4sIElOVCBwYXJ0cywgSU5UIG51bWJlclRpbWVTbG90cyk7CitzdGF0aWMgdm9pZCBrZWVwRm9yRm9sbG93VXAoSU5UICp2X2JvcmRGb2xsb3csIElOVCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnZfZnJlcUZvbGxvdywgSU5UICpsZW5ndGhfdl9mcmVxRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqaV90cmFuRm9sbG93LCBJTlQgKmlfZmlsbEZvbGxvdywgSU5UICp2X2JvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgKnZfZnJlcSwgSU5UIGlfY21vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgaV90cmFuLCBJTlQgcGFydHMsIElOVCBudW1iZXJUaW1lU2xvdHMpOwogCi1zdGF0aWMgdm9pZCBjYWxjQ3RybFNpZ25hbCAoSEFORExFX1NCUl9HUklEIGhTYnJHcmlkLCBGUkFNRV9DTEFTUyBmcmFtZUNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqdl9ib3JkLCBJTlQgbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGxlbmd0aF92X2ZyZXEsIElOVCBpX2Ntb24sIElOVCBpX3RyYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNwcmVhZEZsYWcsIElOVCBuTCk7CitzdGF0aWMgdm9pZCBjYWxjQ3RybFNpZ25hbChIQU5ETEVfU0JSX0dSSUQgaFNickdyaWQsIEZSQU1FX0NMQVNTIGZyYW1lQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnZfYm9yZCwgSU5UIGxlbmd0aF92X2JvcmQsIElOVCAqdl9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGxlbmd0aF92X2ZyZXEsIElOVCBpX2Ntb24sIElOVCBpX3RyYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3ByZWFkRmxhZywgSU5UIG5MKTsKIAotc3RhdGljIHZvaWQgY3RybFNpZ25hbDJGcmFtZUluZm8gKEhBTkRMRV9TQlJfR1JJRCBoU2JyR3JpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0lORk8gaEZyYW1lSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkVRX1JFUyAqZnJlcV9yZXNfZml4Zml4KTsKLQorc3RhdGljIHZvaWQgY3RybFNpZ25hbDJGcmFtZUluZm8oSEFORExFX1NCUl9HUklEIGhTYnJHcmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9JTkZPIGhGcmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkVRX1JFUyAqZnJlcV9yZXNfZml4Zml4KTsKIAogLyogdGFibGUgZm9yIDggdGltZSBzbG90IGluZGV4ICovCi1zdGF0aWMgY29uc3QgaW50IGVudmVsb3BlVGFibGVfOCBbOF1bNV0gPSB7Ci0vKiB0cmFuc2llbnRJbmRleCAgbkVudiwgdHJhbklkeCwgc2hvcnRFbnYsIGJvcmRlcjEsIGJvcmRlcjIsIC4uLiAqLwotLyogYm9yZGVycyBmcm9tIGxlZnQgdG8gcmlnaHQgc2lkZTsgLTEgPSBub3QgaW4gdXNlICovCi0gICAgLypbfFQtfC0tLS0tLV0qLyAgeyAyLCAwLCAwLCAxLCAtMSB9LAotICAgIC8qW3wtVC18LS0tLS1dKi8gIHsgMiwgMCwgMCwgMiwgLTEgfSwKLSAgICAvKlstLXxULXwtLS0tXSovICB7IDMsIDEsIDEsIDIsICA0IH0sCi0gICAgLypbLS0tfFQtfC0tLV0qLyAgeyAzLCAxLCAxLCAzLCAgNSB9LAotICAgIC8qWy0tLS18VC18LS1dKi8gIHsgMywgMSwgMSwgNCwgIDYgfSwKLSAgICAvKlstLS0tLXxULS18XSovICB7IDIsIDEsIDEsIDUsIC0xIH0sCi0gICAgLypbLS0tLS0tfFQtfF0qLyAgeyAyLCAxLCAxLCA2LCAtMSB9LAotICAgIC8qWy0tLS0tLS18VHxdKi8gIHsgMiwgMSwgMSwgNywgLTEgfSwKK3N0YXRpYyBjb25zdCBpbnQgZW52ZWxvcGVUYWJsZV84WzhdWzVdID0geworICAgIC8qIHRyYW5zaWVudEluZGV4ICBuRW52LCB0cmFuSWR4LCBzaG9ydEVudiwgYm9yZGVyMSwgYm9yZGVyMiwgLi4uICovCisgICAgLyogYm9yZGVycyBmcm9tIGxlZnQgdG8gcmlnaHQgc2lkZTsgLTEgPSBub3QgaW4gdXNlICovCisgICAgLypbfFQtfC0tLS0tLV0qLyB7MiwgMCwgMCwgMSwgLTF9LAorICAgIC8qW3wtVC18LS0tLS1dKi8gezIsIDAsIDAsIDIsIC0xfSwKKyAgICAvKlstLXxULXwtLS0tXSovIHszLCAxLCAxLCAyLCA0fSwKKyAgICAvKlstLS18VC18LS0tXSovIHszLCAxLCAxLCAzLCA1fSwKKyAgICAvKlstLS0tfFQtfC0tXSovIHszLCAxLCAxLCA0LCA2fSwKKyAgICAvKlstLS0tLXxULS18XSovIHsyLCAxLCAxLCA1LCAtMX0sCisgICAgLypbLS0tLS0tfFQtfF0qLyB7MiwgMSwgMSwgNiwgLTF9LAorICAgIC8qWy0tLS0tLS18VHxdKi8gezIsIDEsIDEsIDcsIC0xfSwKIH07CiAKIC8qIHRhYmxlIGZvciAxNiB0aW1lIHNsb3QgaW5kZXggKi8KLXN0YXRpYyBjb25zdCBpbnQgZW52ZWxvcGVUYWJsZV8xNiBbMTZdWzZdID0geworc3RhdGljIGNvbnN0IGludCBlbnZlbG9wZVRhYmxlXzE2WzE2XVs2XSA9IHsKICAgICAvKiB0cmFuc2llbnRJbmRleCAgbkVudiwgdHJhbklkeCwgc2hvcnRFbnYsIGJvcmRlcjEsIGJvcmRlcjIsIC4uLiAqLwogICAgIC8qIGxlbmd0aCBmcm9tIGxlZnQgdG8gcmlnaHQgc2lkZTsgLTEgPSBub3QgaW4gdXNlICovCi0gICAgLypbfFQtLS18LS0tLS0tLS0tLS0tfF0qLyB7IDIsIDAsIDAsIDQsIC0xLCAtMX0sCi0gICAgLypbfC1ULS0tfC0tLS0tLS0tLS0tfF0qLyB7IDIsIDAsIDAsIDUsIC0xLCAtMX0sCi0gICAgLypbfC0tfFQtLS18LS0tLS0tLS0tLV0qLyB7IDMsIDEsIDEsIDIsICA2LCAtMX0sCi0gICAgLypbfC0tLXxULS0tfC0tLS0tLS0tLV0qLyB7IDMsIDEsIDEsIDMsICA3LCAtMX0sCi0gICAgLypbfC0tLS18VC0tLXwtLS0tLS0tLV0qLyB7IDMsIDEsIDEsIDQsICA4LCAtMX0sCi0gICAgLypbfC0tLS0tfFQtLS18LS0tLS0tLV0qLyB7IDMsIDEsIDEsIDUsICA5LCAtMX0sCi0gICAgLypbfC0tLS0tLXxULS0tfC0tLS0tLV0qLyB7IDMsIDEsIDEsIDYsIDEwLCAtMX0sCi0gICAgLypbfC0tLS0tLS18VC0tLXwtLS0tLV0qLyB7IDMsIDEsIDEsIDcsIDExLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tfFQtLS18LS0tLV0qLyB7IDMsIDEsIDEsIDgsIDEyLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLXxULS0tfC0tLV0qLyB7IDMsIDEsIDEsIDksIDEzLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLS18VC0tLXwtLV0qLyB7IDMsIDEsIDEsMTAsIDE0LCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLS0tfFQtLS0tfF0qLyB7IDIsIDEsIDEsMTEsIC0xLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLS0tLXxULS0tfF0qLyB7IDIsIDEsIDEsMTIsIC0xLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLS0tLS18VC0tfF0qLyB7IDIsIDEsIDEsMTMsIC0xLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLS0tLS0tfFQtfF0qLyB7IDIsIDEsIDEsMTQsIC0xLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLS0tLS0tLXxUfF0qLyB7IDIsIDEsIDEsMTUsIC0xLCAtMX0sCisgICAgLypbfFQtLS18LS0tLS0tLS0tLS0tfF0qLyB7MiwgMCwgMCwgNCwgLTEsIC0xfSwKKyAgICAvKlt8LVQtLS18LS0tLS0tLS0tLS18XSovIHsyLCAwLCAwLCA1LCAtMSwgLTF9LAorICAgIC8qW3wtLXxULS0tfC0tLS0tLS0tLS1dKi8gezMsIDEsIDEsIDIsIDYsIC0xfSwKKyAgICAvKlt8LS0tfFQtLS18LS0tLS0tLS0tXSovIHszLCAxLCAxLCAzLCA3LCAtMX0sCisgICAgLypbfC0tLS18VC0tLXwtLS0tLS0tLV0qLyB7MywgMSwgMSwgNCwgOCwgLTF9LAorICAgIC8qW3wtLS0tLXxULS0tfC0tLS0tLS1dKi8gezMsIDEsIDEsIDUsIDksIC0xfSwKKyAgICAvKlt8LS0tLS0tfFQtLS18LS0tLS0tXSovIHszLCAxLCAxLCA2LCAxMCwgLTF9LAorICAgIC8qW3wtLS0tLS0tfFQtLS18LS0tLS1dKi8gezMsIDEsIDEsIDcsIDExLCAtMX0sCisgICAgLypbfC0tLS0tLS0tfFQtLS18LS0tLV0qLyB7MywgMSwgMSwgOCwgMTIsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tfFQtLS18LS0tXSovIHszLCAxLCAxLCA5LCAxMywgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tfFQtLS18LS1dKi8gezMsIDEsIDEsIDEwLCAxNCwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLXxULS0tLXxdKi8gezIsIDEsIDEsIDExLCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS18VC0tLXxdKi8gezIsIDEsIDEsIDEyLCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS0tfFQtLXxdKi8gezIsIDEsIDEsIDEzLCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS0tLXxULXxdKi8gezIsIDEsIDEsIDE0LCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS0tLS18VHxdKi8gezIsIDEsIDEsIDE1LCAtMSwgLTF9LAogfTsKIAogLyogdGFibGUgZm9yIDE1IHRpbWUgc2xvdCBpbmRleCAqLwotc3RhdGljIGNvbnN0IGludCBlbnZlbG9wZVRhYmxlXzE1IFsxNV1bNl0gPSB7CitzdGF0aWMgY29uc3QgaW50IGVudmVsb3BlVGFibGVfMTVbMTVdWzZdID0gewogICAgIC8qIHRyYW5zaWVudEluZGV4ICBuRW52LCB0cmFuSWR4LCBzaG9ydEVudiwgYm9yZGVyMSwgYm9yZGVyMiwgLi4uICovCiAgICAgLyogbGVuZ3RoIGZyb20gbGVmdCB0byByaWdodCBzaWRlOyAtMSA9IG5vdCBpbiB1c2UgKi8KLSAgICAvKlt8VC0tLXwtLS0tLS0tLS0tLS1dKi8geyAyLCAwLCAwLCA0LCAtMSwgLTF9LAotICAgIC8qW3wtVC0tLXwtLS0tLS0tLS0tLV0qLyB7IDIsIDAsIDAsIDUsIC0xLCAtMX0sCi0gICAgLypbfC0tfFQtLS18LS0tLS0tLS0tXSovIHsgMywgMSwgMSwgMiwgIDYsIC0xfSwKLSAgICAvKlt8LS0tfFQtLS18LS0tLS0tLS1dKi8geyAzLCAxLCAxLCAzLCAgNywgLTF9LAotICAgIC8qW3wtLS0tfFQtLS18LS0tLS0tLV0qLyB7IDMsIDEsIDEsIDQsICA4LCAtMX0sCi0gICAgLypbfC0tLS0tfFQtLS18LS0tLS0tXSovIHsgMywgMSwgMSwgNSwgIDksIC0xfSwKLSAgICAvKlt8LS0tLS0tfFQtLS18LS0tLS1dKi8geyAzLCAxLCAxLCA2LCAxMCwgLTF9LAotICAgIC8qW3wtLS0tLS0tfFQtLS18LS0tLV0qLyB7IDMsIDEsIDEsIDcsIDExLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tfFQtLS18LS0tXSovIHsgMywgMSwgMSwgOCwgMTIsIC0xfSwKLSAgICAvKlt8LS0tLS0tLS0tfFQtLS18LS1dKi8geyAzLCAxLCAxLCA5LCAxMywgLTF9LAotICAgIC8qW3wtLS0tLS0tLS0tfFQtLS0tfF0qLyB7IDIsIDEsIDEsMTAsIC0xLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLS0tfFQtLS18XSovIHsgMiwgMSwgMSwxMSwgLTEsIC0xfSwKLSAgICAvKlt8LS0tLS0tLS0tLS0tfFQtLXxdKi8geyAyLCAxLCAxLDEyLCAtMSwgLTF9LAotICAgIC8qW3wtLS0tLS0tLS0tLS0tfFQtfF0qLyB7IDIsIDEsIDEsMTMsIC0xLCAtMX0sCi0gICAgLypbfC0tLS0tLS0tLS0tLS0tfFR8XSovIHsgMiwgMSwgMSwxNCwgLTEsIC0xfSwKKyAgICAvKlt8VC0tLXwtLS0tLS0tLS0tLS1dKi8gezIsIDAsIDAsIDQsIC0xLCAtMX0sCisgICAgLypbfC1ULS0tfC0tLS0tLS0tLS0tXSovIHsyLCAwLCAwLCA1LCAtMSwgLTF9LAorICAgIC8qW3wtLXxULS0tfC0tLS0tLS0tLV0qLyB7MywgMSwgMSwgMiwgNiwgLTF9LAorICAgIC8qW3wtLS18VC0tLXwtLS0tLS0tLV0qLyB7MywgMSwgMSwgMywgNywgLTF9LAorICAgIC8qW3wtLS0tfFQtLS18LS0tLS0tLV0qLyB7MywgMSwgMSwgNCwgOCwgLTF9LAorICAgIC8qW3wtLS0tLXxULS0tfC0tLS0tLV0qLyB7MywgMSwgMSwgNSwgOSwgLTF9LAorICAgIC8qW3wtLS0tLS18VC0tLXwtLS0tLV0qLyB7MywgMSwgMSwgNiwgMTAsIC0xfSwKKyAgICAvKlt8LS0tLS0tLXxULS0tfC0tLS1dKi8gezMsIDEsIDEsIDcsIDExLCAtMX0sCisgICAgLypbfC0tLS0tLS0tfFQtLS18LS0tXSovIHszLCAxLCAxLCA4LCAxMiwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS18VC0tLXwtLV0qLyB7MywgMSwgMSwgOSwgMTMsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLXxULS0tLXxdKi8gezIsIDEsIDEsIDEwLCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLXxULS0tfF0qLyB7MiwgMSwgMSwgMTEsIC0xLCAtMX0sCisgICAgLypbfC0tLS0tLS0tLS0tLXxULS18XSovIHsyLCAxLCAxLCAxMiwgLTEsIC0xfSwKKyAgICAvKlt8LS0tLS0tLS0tLS0tLXxULXxdKi8gezIsIDEsIDEsIDEzLCAtMSwgLTF9LAorICAgIC8qW3wtLS0tLS0tLS0tLS0tLXxUfF0qLyB7MiwgMSwgMSwgMTQsIC0xLCAtMX0sCiB9OwogCiBzdGF0aWMgY29uc3QgaW50IG1pbkZyYW1lVHJhbkRpc3RhbmNlID0gNDsKIAotc3RhdGljIGNvbnN0IEZSRVFfUkVTIGZyZXFSZXNfdGFibGVfOFtdID0ge0ZSRVFfUkVTX0xPVywgRlJFUV9SRVNfTE9XLCBGUkVRX1JFU19MT1csIEZSRVFfUkVTX0xPVywgRlJFUV9SRVNfTE9XLAotICBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfTsKK3N0YXRpYyBjb25zdCBGUkVRX1JFUyBmcmVxUmVzX3RhYmxlXzhbXSA9IHsKKyAgICBGUkVRX1JFU19MT1csICBGUkVRX1JFU19MT1csICBGUkVRX1JFU19MT1csICBGUkVRX1JFU19MT1csIEZSRVFfUkVTX0xPVywKKyAgICBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfTsKIAogc3RhdGljIGNvbnN0IEZSRVFfUkVTIGZyZXFSZXNfdGFibGVfMTZbMTZdID0gewogICAgIC8qIHNpemUgb2YgZW52ZWxvcGUgKi8KLS8qIDAtNCAqLyAgICBGUkVRX1JFU19MT1csIEZSRVFfUkVTX0xPVywgRlJFUV9SRVNfTE9XLCBGUkVRX1JFU19MT1csIEZSRVFfUkVTX0xPVywKLS8qIDUtOSAqLyAgICBGUkVRX1JFU19MT1csIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsCi0vKiAxMC0xNiAqLyAgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwKLSAgICAgICAgICAgICBGUkVRX1JFU19ISUdIIH07CisgICAgLyogMC00ICovIEZSRVFfUkVTX0xPVywKKyAgICBGUkVRX1JFU19MT1csCisgICAgRlJFUV9SRVNfTE9XLAorICAgIEZSRVFfUkVTX0xPVywKKyAgICBGUkVRX1JFU19MT1csCisgICAgLyogNS05ICovIEZSRVFfUkVTX0xPVywKKyAgICBGUkVRX1JFU19ISUdILAorICAgIEZSRVFfUkVTX0hJR0gsCisgICAgRlJFUV9SRVNfSElHSCwKKyAgICBGUkVRX1JFU19ISUdILAorICAgIC8qIDEwLTE2ICovIEZSRVFfUkVTX0hJR0gsCisgICAgRlJFUV9SRVNfSElHSCwKKyAgICBGUkVRX1JFU19ISUdILAorICAgIEZSRVFfUkVTX0hJR0gsCisgICAgRlJFUV9SRVNfSElHSCwKKyAgICBGUkVRX1JFU19ISUdIfTsKIAotc3RhdGljIHZvaWQgZ2VuZXJhdGVGaXhGaXhPbmx5ICggSEFORExFX1NCUl9GUkFNRV9JTkZPIGhTYnJGcmFtZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0dSSUQgaFNickdyaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhblBvc0ludGVybmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlclRpbWVTbG90cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGZSZXNUcmFuc0lzTG93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotCitzdGF0aWMgdm9pZCBnZW5lcmF0ZUZpeEZpeE9ubHkoSEFORExFX1NCUl9GUkFNRV9JTkZPIGhTYnJGcmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9HUklEIGhTYnJHcmlkLCBpbnQgdHJhblBvc0ludGVybmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJUaW1lU2xvdHMsIFVDSEFSIGZSZXNUcmFuc0lzTG93KTsKIAogLyohCiAgIEZ1bmN0aW9ubmFtZTogRkRLc2JyRW5jX2ZyYW1lSW5mb0dlbmVyYXRvcgpAQCAtMzUzLDIwICszMjcsMTkgQEAKIAogICBBcmd1bWVudHM6ICAgIGhTYnJFbnZGcmFtZSAgICAgICAgICAtIHBvaW50ZXIgdG8gc2JyIGVudmVsb3BlIGhhbmRsZQogICAgICAgICAgICAgICAgIHZfcHJlX3RyYW5zaWVudF9pbmZvICAtIHBvaW50ZXIgdG8gdHJhbnNpZW50IGluZm8gdmVjdG9yCi0gICAgICAgICAgICAgICAgdl90cmFuc2llbnRfaW5mbyAgICAgIC0gcG9pbnRlciB0byBwcmV2aW91cyB0cmFuc2llbnQgaW5mbyB2ZWN0b3IKLSAgICAgICAgICAgICAgICB2X3R1bmluZyAgICAgICAgICAgICAgLSBwb2ludGVyIHRvIHR1bmluZyB2ZWN0b3IKKyAgICAgICAgICAgICAgICB2X3RyYW5zaWVudF9pbmZvICAgICAgLSBwb2ludGVyIHRvIHByZXZpb3VzIHRyYW5zaWVudCBpbmZvCit2ZWN0b3Igdl90dW5pbmcgICAgICAgICAgICAgIC0gcG9pbnRlciB0byB0dW5pbmcgdmVjdG9yCiAKICBSZXR1cm46ICAgICAgZnJhbWVfaW5mbyAgICAgICAgLSBwb2ludGVyIHRvIFNCUl9GUkFNRV9JTkZPIHN0cnVjdAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogSEFORExFX1NCUl9GUkFNRV9JTkZPCi1GREtzYnJFbmNfZnJhbWVJbmZvR2VuZXJhdG9yIChIQU5ETEVfU0JSX0VOVkVMT1BFX0ZSQU1FIGhTYnJFbnZGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnZfdHJhbnNpZW50X2luZm8sCi0gICAgICAgICAgICAgICAgICAgIFVDSEFSICp2X3RyYW5zaWVudF9pbmZvX3ByZSwKLSAgICAgICAgICAgICAgICAgICAgaW50IGxkR3JpZCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICp2X3R1bmluZykKLXsKLSAgSU5UIG51bUVudiwgdHJhblBvc0ludGVybmFsPTAsIGJtaW49MCwgYm1heD0wLCBwYXJ0cywgZCwgaV9jbW9uPTAsIGlfdHJhbj0wLCBuTDsKK0ZES3NickVuY19mcmFtZUluZm9HZW5lcmF0b3IoSEFORExFX1NCUl9FTlZFTE9QRV9GUkFNRSBoU2JyRW52RnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICp2X3RyYW5zaWVudF9pbmZvLCBjb25zdCBJTlQgcmlnaHRCb3JkZXJGSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICp2X3RyYW5zaWVudF9pbmZvX3ByZSwgaW50IGxkR3JpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICp2X3R1bmluZykgeworICBJTlQgbnVtRW52LCB0cmFuUG9zSW50ZXJuYWwgPSAwLCBibWluID0gMCwgYm1heCA9IDAsIHBhcnRzLCBkLCBpX2Ntb24gPSAwLAorICAgICAgICAgICAgICBpX3RyYW4gPSAwLCBuTDsKICAgSU5UIGZtYXggPSAwOwogCiAgIElOVCAqdl9ib3JkID0gaFNickVudkZyYW1lLT52X2JvcmQ7CkBAIC0zNzQsNyArMzQ3LDYgQEAKICAgSU5UICp2X2JvcmRGb2xsb3cgPSBoU2JyRW52RnJhbWUtPnZfYm9yZEZvbGxvdzsKICAgSU5UICp2X2ZyZXFGb2xsb3cgPSBoU2JyRW52RnJhbWUtPnZfZnJlcUZvbGxvdzsKIAotCiAgIElOVCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyA9ICZoU2JyRW52RnJhbWUtPmxlbmd0aF92X2JvcmRGb2xsb3c7CiAgIElOVCAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyA9ICZoU2JyRW52RnJhbWUtPmxlbmd0aF92X2ZyZXFGb2xsb3c7CiAgIElOVCAqbGVuZ3RoX3ZfYm9yZCA9ICZoU2JyRW52RnJhbWUtPmxlbmd0aF92X2JvcmQ7CkBAIC0zODUsNyArMzU3LDYgQEAKICAgRlJBTUVfQ0xBU1MgKmZyYW1lQ2xhc3NPbGQgPSAmaFNickVudkZyYW1lLT5mcmFtZUNsYXNzT2xkOwogICBGUkFNRV9DTEFTUyBmcmFtZUNsYXNzID0gRklYRklYOwogCi0KICAgSU5UIGFsbG93U3ByZWFkID0gaFNickVudkZyYW1lLT5hbGxvd1NwcmVhZDsKICAgSU5UIG51bUVudlN0YXRpYyA9IGhTYnJFbnZGcmFtZS0+bnVtRW52U3RhdGljOwogICBJTlQgc3RhdGljRnJhbWluZyA9IGhTYnJFbnZGcmFtZS0+c3RhdGljRnJhbWluZzsKQEAgLTQwNSwxMCArMzc2LDEyIEBACiAgIGhTYnJFbnZGcmFtZS0+dl90dW5pbmdTZWdtID0gdl90dW5pbmdTZWdtOwogCiAgIGlmIChsZEdyaWQpIHsKLSAgICAvKiBpbiBjYXNlIHRoZXJlIHdhcyBhIHRyYW5zaWVudCBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIHByZXZpb3VzIGZyYW1lLCBzdGFydCB3aXRoIGEgdHJhbnNpZW50IGVudmVsb3BlICovCi0gICAgaWYgKCAhdHJhbkZsYWcgJiYgdl90cmFuc2llbnRfaW5mb19wcmVbMV0gJiYgKG51bWJlclRpbWVTbG90cyAtIHZfdHJhbnNpZW50X2luZm9fcHJlWzBdIDwgbWluRnJhbWVUcmFuRGlzdGFuY2UpICl7CisgICAgLyogaW4gY2FzZSB0aGVyZSB3YXMgYSB0cmFuc2llbnQgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBwcmV2aW91cyBmcmFtZSwKKyAgICAgKiBzdGFydCB3aXRoIGEgdHJhbnNpZW50IGVudmVsb3BlICovCisgICAgaWYgKCF0cmFuRmxhZyAmJiB2X3RyYW5zaWVudF9pbmZvX3ByZVsxXSAmJgorICAgICAgICAobnVtYmVyVGltZVNsb3RzIC0gdl90cmFuc2llbnRfaW5mb19wcmVbMF0gPCBtaW5GcmFtZVRyYW5EaXN0YW5jZSkpIHsKICAgICAgIHRyYW5GbGFnID0gMTsKLSAgICAgIHRyYW5Qb3MgID0gMDsKKyAgICAgIHRyYW5Qb3MgPSAwOwogICAgIH0KICAgfQogCkBAIC00NjMsMjAgKzQzNiwyMyBAQAogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICAgICBmcmFtZUNsYXNzID0gRklYRklYOwotICAgIG51bUVudiA9IG51bUVudlN0YXRpYzsgICAgICAvKiB7MSwyLDQsOH0gKi8KLSAgICAqZnJhbWVDbGFzc09sZCA9IEZJWEZJWDsgICAgLyogZm9yIGNoYW5nZSB0byBkeW4gKi8KKyAgICBudW1FbnYgPSBudW1FbnZTdGF0aWM7ICAgLyogezEsMiw0LDh9ICovCisgICAgKmZyYW1lQ2xhc3NPbGQgPSBGSVhGSVg7IC8qIGZvciBjaGFuZ2UgdG8gZHluICovCiAgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmJzX251bV9lbnYgPSBudW1FbnY7CiAgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmZyYW1lQ2xhc3MgPSBmcmFtZUNsYXNzOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgIENhbGN1bGF0ZSBmcmFtZSBjbGFzcyB0byB1c2UKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGNhbGNGcmFtZUNsYXNzICgmZnJhbWVDbGFzcywgZnJhbWVDbGFzc09sZCwgdHJhbkZsYWcsIHNwcmVhZEZsYWcpOworICAgIGlmIChyaWdodEJvcmRlckZJWCkgeworICAgICAgdHJhbkZsYWcgPSAwOworICAgICAgKnNwcmVhZEZsYWcgPSAwOworICAgIH0KKyAgICBjYWxjRnJhbWVDbGFzcygmZnJhbWVDbGFzcywgZnJhbWVDbGFzc09sZCwgdHJhbkZsYWcsIHNwcmVhZEZsYWcpOwogCiAgICAgLyogcGF0Y2ggZm9yIG5ldyBmcmFtZSBjbGFzcyBGSVhGSVhvbmx5IGZvciBBQUMgTEQgKi8KICAgICBpZiAodHJhbkZsYWcgJiYgbGRHcmlkKSB7Ci0gICAgICBmcmFtZUNsYXNzICAgICA9IEZJWEZJWG9ubHk7CisgICAgICBmcmFtZUNsYXNzID0gRklYRklYb25seTsKICAgICAgICpmcmFtZUNsYXNzT2xkID0gRklYRklYOwogICAgIH0KIApAQCAtNDk3LDIzOCArNDczLDIyNiBAQAogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgIERlc2lnbiBmcmFtZSAob3IgZm9sbG93LXVwIG9sZCBkZXNpZ24pCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpZiAodHJhbkZsYWcpIHsgICAgICAgICAgICAgLyogQWx3YXlzIGZvciBGaXhWYXIsIG9mdGVuIGJ1dCBub3QgYWx3YXlzIGZvciBWYXJWYXIgKi8KKyAgICBpZiAodHJhbkZsYWcpIHsKKyAgICAgIC8qIEFsd2F5cyBmb3IgRml4VmFyLCBvZnRlbiBidXQgbm90IGFsd2F5cyBmb3IgVmFyVmFyICovCisKICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgRGVzaWduIHBhcnQgb2YgVC9GLWdyaWQgYXJvdW5kIHRoZSBuZXcgdHJhbnNpZW50CiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0gICAgICB0cmFuUG9zSW50ZXJuYWwgPSBmcmFtZU1pZGRsZVNsb3QgKyB0cmFuUG9zICsgYnVmZmVyRnJhbWVTdGFydCA7ICAgICAgLyogRkggMDAtMDYtMjYgKi8KKyAgICAgIHRyYW5Qb3NJbnRlcm5hbCA9CisgICAgICAgICAgZnJhbWVNaWRkbGVTbG90ICsgdHJhblBvcyArIGJ1ZmZlckZyYW1lU3RhcnQ7IC8qIEZIIDAwLTA2LTI2ICovCiAgICAgICAvKgogICAgICAgICBhZGQgbWFuZGF0b3J5IGJvcmRlcnMgYXJvdW5kIHRyYW5zaWVudAogICAgICAgKi8KIAotICAgICAgZmlsbEZyYW1lVHJhbiAoIHZfdHVuaW5nU2VnbSwKLSAgICAgICAgICAgICAgICAgICAgICB2X3R1bmluZ0ZyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgdHJhblBvc0ludGVybmFsLAotICAgICAgICAgICAgICAgICAgICAgIHZfYm9yZCwKLSAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdl9ib3JkLAotICAgICAgICAgICAgICAgICAgICAgIHZfZnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdl9mcmVxLAotICAgICAgICAgICAgICAgICAgICAgJmJtaW4sCi0gICAgICAgICAgICAgICAgICAgICAmYm1heCApOworICAgICAgZmlsbEZyYW1lVHJhbih2X3R1bmluZ1NlZ20sIHZfdHVuaW5nRnJlcSwgdHJhblBvc0ludGVybmFsLCB2X2JvcmQsCisgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2JvcmQsIHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgJmJtaW4sICZibWF4KTsKIAogICAgICAgLyogbWFrZSBzdXJlIHdlIHN0YXkgd2l0aGluIHRoZSBtYXhpbXVtIFNCUiBmcmFtZSBvdmVybGFwICovCiAgICAgICBmbWF4ID0gY2FsY0ZpbGxMZW5ndGhNYXgodHJhblBvcywgbnVtYmVyVGltZVNsb3RzKTsKICAgICB9CiAKICAgICBzd2l0Y2ggKGZyYW1lQ2xhc3MpIHsKKyAgICAgIGNhc2UgRklYRklYb25seToKKyAgICAgICAgRkRLX0FTU0VSVChsZEdyaWQpOworICAgICAgICB0cmFuUG9zSW50ZXJuYWwgPSB0cmFuUG9zOworICAgICAgICBnZW5lcmF0ZUZpeEZpeE9ubHkoJihoU2JyRW52RnJhbWUtPlNickZyYW1lSW5mbyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGhTYnJFbnZGcmFtZS0+U2JyR3JpZCksIHRyYW5Qb3NJbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlclRpbWVTbG90cywgaFNickVudkZyYW1lLT5mUmVzVHJhbnNJc0xvdyk7CiAKLSAgICBjYXNlIEZJWEZJWG9ubHk6Ci0gICAgICBGREtfQVNTRVJUKGxkR3JpZCk7Ci0gICAgICB0cmFuUG9zSW50ZXJuYWwgPSB0cmFuUG9zOwotICAgICAgZ2VuZXJhdGVGaXhGaXhPbmx5ICggJihoU2JyRW52RnJhbWUtPlNickZyYW1lSW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmKGhTYnJFbnZGcmFtZS0+U2JyR3JpZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuUG9zSW50ZXJuYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJUaW1lU2xvdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW52RnJhbWUtPmZSZXNUcmFuc0lzTG93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICByZXR1cm4gJihoU2JyRW52RnJhbWUtPlNickZyYW1lSW5mbyk7CiAKLSAgICAgIHJldHVybiAmKGhTYnJFbnZGcmFtZS0+U2JyRnJhbWVJbmZvKTsKLQotICAgIGNhc2UgRklYVkFSOgotCi0gICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICBEZXNpZ24gcmVtYWluaW5nIHBhcnRzIG9mIFQvRi1ncmlkIChhc3N1bWluZyBuZXh0IGZyYW1lIGlzIFZhckZpeCkKLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgRmlsbCByZWdpb24gYmVmb3JlIG5ldyB0cmFuc2llbnQ6Ci0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgZmlsbEZyYW1lUHJlIChkbWF4LCB2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwKLSAgICAgICAgICAgICAgICAgICAgYm1pbiwgYm1pbiAtIGJ1ZmZlckZyYW1lU3RhcnQpOyAgICAgLyogRkggMDAtMDYtMjYgKi8KLQotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBGaWxsIHJlZ2lvbiBhZnRlciBuZXcgdHJhbnNpZW50OgotICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgIGZpbGxGcmFtZVBvc3QgKCZwYXJ0cywgJmQsIGRtYXgsIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLAotICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcSwgYm1heCwgYnVmZmVyRnJhbWVTdGFydCwgbnVtYmVyVGltZVNsb3RzLCBmbWF4KTsKLQotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBUYWtlIGNhcmUgb2Ygc3BlY2lhbCBjYXNlOgotICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgIGlmIChwYXJ0cyA9PSAxICYmIGQgPCBkbWluKSAgICAgICAvKiBubyBmaWxsLCBzaG9ydCBsYXN0IGVudmVsb3BlICovCi0gICAgICAgIHNwZWNpYWxDYXNlIChzcHJlYWRGbGFnLCBhbGxvd1NwcmVhZCwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLAotICAgICAgICAgICAgICAgICAgICAgdl9mcmVxLCBsZW5ndGhfdl9mcmVxLCAmcGFydHMsIGQpOwotCi0gICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIENhbGN1bGF0ZSBjb21tb24gYm9yZGVyIChzcGxpdC1wb2ludCkKLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICBjYWxjQ21vbkJvcmRlciAoJmlfY21vbiwgJmlfdHJhbiwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB0cmFuUG9zSW50ZXJuYWwsCi0gICAgICAgICAgICAgICAgICAgICAgYnVmZmVyRnJhbWVTdGFydCwgbnVtYmVyVGltZVNsb3RzKTsgICAgICAgLyogRkggMDAtMDYtMjYgKi8KLQotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBFeHRyYWN0IGRhdGEgZm9yIHByb3BlciBmb2xsb3ctdXAgaW4gbmV4dCBmcmFtZQotICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgIGtlZXBGb3JGb2xsb3dVcCAodl9ib3JkRm9sbG93LCBsZW5ndGhfdl9ib3JkRm9sbG93LCB2X2ZyZXFGb2xsb3csCi0gICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXFGb2xsb3csIGlfdHJhbkZvbGxvdywgaV9maWxsRm9sbG93LAotICAgICAgICAgICAgICAgICAgICAgICB2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfZnJlcSwgaV9jbW9uLCBpX3RyYW4sIHBhcnRzLCBudW1iZXJUaW1lU2xvdHMpOyAgLyogRkggMDAtMDYtMjYgKi8KLQotICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBDYWxjdWxhdGUgY29udHJvbCBzaWduYWwKLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICBjYWxjQ3RybFNpZ25hbCAoJmhTYnJFbnZGcmFtZS0+U2JyR3JpZCwgZnJhbWVDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICB2X2JvcmQsICpsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsICpsZW5ndGhfdl9mcmVxLAotICAgICAgICAgICAgICAgICAgICAgIGlfY21vbiwgaV90cmFuLCAqc3ByZWFkRmxhZywgREMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBWQVJGSVg6Ci0gICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIEZvbGxvdy11cCBvbGQgdHJhbnNpZW50IC0gY2FsY3VsYXRlIGNvbnRyb2wgc2lnbmFsCi0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgY2FsY0N0cmxTaWduYWwgKCZoU2JyRW52RnJhbWUtPlNickdyaWQsIGZyYW1lQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgdl9ib3JkRm9sbG93LCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdywgdl9mcmVxRm9sbG93LAotICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93LCBEQywgKmlfdHJhbkZvbGxvdywKLSAgICAgICAgICAgICAgICAgICAgICAqc3ByZWFkRmxhZywgREMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBWQVJWQVI6Ci0gICAgICBpZiAoKnNwcmVhZEZsYWcpIHsgICAgICAgIC8qIHNwcmVhZCBhY3Jvc3MgdGhyZWUgZnJhbWVzICovCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICBGb2xsb3ctdXAgb2xkIHRyYW5zaWVudCAtIGNhbGN1bGF0ZSBjb250cm9sIHNpZ25hbAotICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICBjYWxjQ3RybFNpZ25hbCAoJmhTYnJFbnZGcmFtZS0+U2JyR3JpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ2xhc3MsIHZfYm9yZEZvbGxvdywgKmxlbmd0aF92X2JvcmRGb2xsb3csCi0gICAgICAgICAgICAgICAgICAgICAgICB2X2ZyZXFGb2xsb3csICpsZW5ndGhfdl9mcmVxRm9sbG93LCBEQywKLSAgICAgICAgICAgICAgICAgICAgICAgICppX3RyYW5Gb2xsb3csICpzcHJlYWRGbGFnLCBEQyk7Ci0KLSAgICAgICAgKnNwcmVhZEZsYWcgPSAwOworICAgICAgY2FzZSBGSVhWQVI6CiAKICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgIEV4dHJhY3QgZGF0YSBmb3IgcHJvcGVyIGZvbGxvdy11cCBpbiBuZXh0IGZyYW1lCisgICAgICAgICAgIERlc2lnbiByZW1haW5pbmcgcGFydHMgb2YgVC9GLWdyaWQgKGFzc3VtaW5nIG5leHQgZnJhbWUgaXMgVmFyRml4KQogICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICB2X2JvcmRGb2xsb3dbMF0gPSBoU2JyRW52RnJhbWUtPlNickdyaWQuYnNfYWJzX2JvcmRfMSAtIG51bWJlclRpbWVTbG90czsgLyogRkggMDAtMDYtMjYgKi8KLSAgICAgICAgdl9mcmVxRm9sbG93WzBdID0gMTsKLSAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cgPSAxOwotICAgICAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyA9IDE7Ci0KLSAgICAgICAgKmlfdHJhbkZvbGxvdyA9IC1EQzsKLSAgICAgICAgKmlfZmlsbEZvbGxvdyA9IC1EQzsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgRGVzaWduIHJlbWFpbmluZyBwYXJ0cyBvZiBUL0YtZ3JpZCAoYXNzdW1pbmcgbmV4dCBmcmFtZSBpcyBWYXJGaXgpCi0gICAgICAgICAgYWRhcHQgb3IgZmlsbCByZWdpb24gYmVmb3JlIG5ldyB0cmFuc2llbnQ6Ci0gICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIGZpbGxGcmFtZUludGVyICgmbkwsIHZfdHVuaW5nU2VnbSwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCBibWluLAotICAgICAgICAgICAgICAgICAgICAgICAgdl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X2JvcmRGb2xsb3csCi0gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdl9ib3JkRm9sbG93LCB2X2ZyZXFGb2xsb3csCi0gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdl9mcmVxRm9sbG93LCAqaV9maWxsRm9sbG93LCBkbWluLCBkbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyVGltZVNsb3RzKTsKIAogICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgRmlsbCBhZnRlciB0cmFuc2llbnQ6CisgICAgICAgICAgRmlsbCByZWdpb24gYmVmb3JlIG5ldyB0cmFuc2llbnQ6CiAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIGZpbGxGcmFtZVBvc3QgKCZwYXJ0cywgJmQsIGRtYXgsIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLAotICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdl9mcmVxLCBibWF4LCBidWZmZXJGcmFtZVN0YXJ0LCBudW1iZXJUaW1lU2xvdHMsIGZtYXgpOworICAgICAgICBmaWxsRnJhbWVQcmUoZG1heCwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIGJtaW4sCisgICAgICAgICAgICAgICAgICAgICBibWluIC0gYnVmZmVyRnJhbWVTdGFydCk7IC8qIEZIIDAwLTA2LTI2ICovCisKKyAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgIEZpbGwgcmVnaW9uIGFmdGVyIG5ldyB0cmFuc2llbnQ6CisgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgIGZpbGxGcmFtZVBvc3QoJnBhcnRzLCAmZCwgZG1heCwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcSwgYm1heCwgYnVmZmVyRnJhbWVTdGFydCwgbnVtYmVyVGltZVNsb3RzLAorICAgICAgICAgICAgICAgICAgICAgIGZtYXgpOwogCiAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICBUYWtlIGNhcmUgb2Ygc3BlY2lhbCBjYXNlOgogICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICBpZiAocGFydHMgPT0gMSAmJiBkIDwgZG1pbikgICAgIC8qJSBubyBmaWxsLCBzaG9ydCBsYXN0IGVudmVsb3BlICovCi0gICAgICAgICAgc3BlY2lhbENhc2UgKHNwcmVhZEZsYWcsIGFsbG93U3ByZWFkLCB2X2JvcmQsIGxlbmd0aF92X2JvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgIHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgJnBhcnRzLCBkKTsKKyAgICAgICAgaWYgKHBhcnRzID09IDEgJiYgZCA8IGRtaW4pIC8qIG5vIGZpbGwsIHNob3J0IGxhc3QgZW52ZWxvcGUgKi8KKyAgICAgICAgICBzcGVjaWFsQ2FzZShzcHJlYWRGbGFnLCBhbGxvd1NwcmVhZCwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcSwgJnBhcnRzLCBkKTsKIAogICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgQ2FsY3VsYXRlIGNvbW1vbiBib3JkZXIgKHNwbGl0LXBvaW50KQogICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICBjYWxjQ21vbkJvcmRlciAoJmlfY21vbiwgJmlfdHJhbiwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB0cmFuUG9zSW50ZXJuYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJGcmFtZVN0YXJ0LCBudW1iZXJUaW1lU2xvdHMpOworICAgICAgICBjYWxjQ21vbkJvcmRlcigmaV9jbW9uLCAmaV90cmFuLCB2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHRyYW5Qb3NJbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyRnJhbWVTdGFydCwgbnVtYmVyVGltZVNsb3RzKTsgLyogRkggMDAtMDYtMjYgKi8KIAogICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgRXh0cmFjdCBkYXRhIGZvciBwcm9wZXIgZm9sbG93LXVwIGluIG5leHQgZnJhbWUKICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAga2VlcEZvckZvbGxvd1VwICh2X2JvcmRGb2xsb3csIGxlbmd0aF92X2JvcmRGb2xsb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgdl9mcmVxRm9sbG93LCBsZW5ndGhfdl9mcmVxRm9sbG93LAotICAgICAgICAgICAgICAgICAgICAgICAgIGlfdHJhbkZvbGxvdywgaV9maWxsRm9sbG93LCB2X2JvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLCBpX2Ntb24sIGlfdHJhbiwgcGFydHMsIG51bWJlclRpbWVTbG90cyk7CisgICAgICAgIGtlZXBGb3JGb2xsb3dVcCh2X2JvcmRGb2xsb3csIGxlbmd0aF92X2JvcmRGb2xsb3csIHZfZnJlcUZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXFGb2xsb3csIGlfdHJhbkZvbGxvdywgaV9maWxsRm9sbG93LCB2X2JvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsIGlfY21vbiwgaV90cmFuLCBwYXJ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlclRpbWVTbG90cyk7IC8qIEZIIDAwLTA2LTI2ICovCiAKICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgIENhbGN1bGF0ZSBjb250cm9sIHNpZ25hbAogICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICBjYWxjQ3RybFNpZ25hbCAoJmhTYnJFbnZGcmFtZS0+U2JyR3JpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ2xhc3MsIHZfYm9yZCwgKmxlbmd0aF92X2JvcmQsIHZfZnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfdl9mcmVxLCBpX2Ntb24sIGlfdHJhbiwgMCwgbkwpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGSVhGSVg6Ci0gICAgICBpZiAodHJhblBvcyA9PSAwKQotICAgICAgICBudW1FbnYgPSAxOwotICAgICAgZWxzZQotICAgICAgICBudW1FbnYgPSAyOworICAgICAgICBjYWxjQ3RybFNpZ25hbCgmaFNickVudkZyYW1lLT5TYnJHcmlkLCBmcmFtZUNsYXNzLCB2X2JvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsICpsZW5ndGhfdl9mcmVxLCBpX2Ntb24sIGlfdHJhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgKnNwcmVhZEZsYWcsIERDKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFZBUkZJWDoKKyAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgIEZvbGxvdy11cCBvbGQgdHJhbnNpZW50IC0gY2FsY3VsYXRlIGNvbnRyb2wgc2lnbmFsCisgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgIGNhbGNDdHJsU2lnbmFsKCZoU2JyRW52RnJhbWUtPlNickdyaWQsIGZyYW1lQ2xhc3MsIHZfYm9yZEZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3csIHZfZnJlcUZvbGxvdywgKmxlbmd0aF92X2ZyZXFGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgIERDLCAqaV90cmFuRm9sbG93LCAqc3ByZWFkRmxhZywgREMpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVkFSVkFSOgorICAgICAgICBpZiAoKnNwcmVhZEZsYWcpIHsgLyogc3ByZWFkIGFjcm9zcyB0aHJlZSBmcmFtZXMgKi8KKyAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBGb2xsb3ctdXAgb2xkIHRyYW5zaWVudCAtIGNhbGN1bGF0ZSBjb250cm9sIHNpZ25hbAorICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgICAgY2FsY0N0cmxTaWduYWwoJmhTYnJFbnZGcmFtZS0+U2JyR3JpZCwgZnJhbWVDbGFzcywgdl9ib3JkRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93LCB2X2ZyZXFGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2ZyZXFGb2xsb3csIERDLCAqaV90cmFuRm9sbG93LCAqc3ByZWFkRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQyk7CiAKLSAgICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5ic19udW1fZW52ID0gbnVtRW52OwotICAgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmZyYW1lQ2xhc3MgPSBmcmFtZUNsYXNzOworICAgICAgICAgICpzcHJlYWRGbGFnID0gMDsKIAotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgRXh0cmFjdCBkYXRhIGZvciBwcm9wZXIgZm9sbG93LXVwIGluIG5leHQgZnJhbWUKKyAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgICAgIHZfYm9yZEZvbGxvd1swXSA9IGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5ic19hYnNfYm9yZF8xIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJUaW1lU2xvdHM7IC8qIEZIIDAwLTA2LTI2ICovCisgICAgICAgICAgdl9mcmVxRm9sbG93WzBdID0gMTsKKyAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyA9IDE7CisgICAgICAgICAgKmxlbmd0aF92X2ZyZXFGb2xsb3cgPSAxOworCisgICAgICAgICAgKmlfdHJhbkZvbGxvdyA9IC1EQzsKKyAgICAgICAgICAqaV9maWxsRm9sbG93ID0gLURDOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIERlc2lnbiByZW1haW5pbmcgcGFydHMgb2YgVC9GLWdyaWQgKGFzc3VtaW5nIG5leHQgZnJhbWUgaXMgVmFyRml4KQorICAgICAgICAgICAgYWRhcHQgb3IgZmlsbCByZWdpb24gYmVmb3JlIG5ldyB0cmFuc2llbnQ6CisgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgICBmaWxsRnJhbWVJbnRlcigmbkwsIHZfdHVuaW5nU2VnbSwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCBibWluLCB2X2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcSwgdl9ib3JkRm9sbG93LCBsZW5ndGhfdl9ib3JkRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZfZnJlcUZvbGxvdywgbGVuZ3RoX3ZfZnJlcUZvbGxvdywgKmlfZmlsbEZvbGxvdywgZG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkbWF4LCBudW1iZXJUaW1lU2xvdHMpOworCisgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgRmlsbCBhZnRlciB0cmFuc2llbnQ6CisgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgICBmaWxsRnJhbWVQb3N0KCZwYXJ0cywgJmQsIGRtYXgsIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcSwgYm1heCwgYnVmZmVyRnJhbWVTdGFydCwgbnVtYmVyVGltZVNsb3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgZm1heCk7CisKKyAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBUYWtlIGNhcmUgb2Ygc3BlY2lhbCBjYXNlOgorICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgICAgaWYgKHBhcnRzID09IDEgJiYgZCA8IGRtaW4pIC8qJSBubyBmaWxsLCBzaG9ydCBsYXN0IGVudmVsb3BlICovCisgICAgICAgICAgICBzcGVjaWFsQ2FzZShzcHJlYWRGbGFnLCBhbGxvd1NwcmVhZCwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdl9mcmVxLCAmcGFydHMsIGQpOworCisgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQ2FsY3VsYXRlIGNvbW1vbiBib3JkZXIgKHNwbGl0LXBvaW50KQorICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgICAgY2FsY0Ntb25Cb3JkZXIoJmlfY21vbiwgJmlfdHJhbiwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5Qb3NJbnRlcm5hbCwgYnVmZmVyRnJhbWVTdGFydCwgbnVtYmVyVGltZVNsb3RzKTsKKworICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEV4dHJhY3QgZGF0YSBmb3IgcHJvcGVyIGZvbGxvdy11cCBpbiBuZXh0IGZyYW1lCisgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgICBrZWVwRm9yRm9sbG93VXAodl9ib3JkRm9sbG93LCBsZW5ndGhfdl9ib3JkRm9sbG93LCB2X2ZyZXFGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXFGb2xsb3csIGlfdHJhbkZvbGxvdywgaV9maWxsRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfZnJlcSwgaV9jbW9uLCBpX3RyYW4sIHBhcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJUaW1lU2xvdHMpOworCisgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQ2FsY3VsYXRlIGNvbnRyb2wgc2lnbmFsCisgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgICBjYWxjQ3RybFNpZ25hbCgmaFNickVudkZyYW1lLT5TYnJHcmlkLCBmcmFtZUNsYXNzLCB2X2JvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmQsIHZfZnJlcSwgKmxlbmd0aF92X2ZyZXEsIGlfY21vbiwgaV90cmFuLAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsIG5MKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRklYRklYOgorICAgICAgICBpZiAodHJhblBvcyA9PSAwKQorICAgICAgICAgIG51bUVudiA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBudW1FbnYgPSAyOworCisgICAgICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5ic19udW1fZW52ID0gbnVtRW52OworICAgICAgICBoU2JyRW52RnJhbWUtPlNickdyaWQuZnJhbWVDbGFzcyA9IGZyYW1lQ2xhc3M7CisKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBGREtfQVNTRVJUKDApOwogICAgIH0KICAgfQogCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIENvbnZlcnQgY29udHJvbCBzaWduYWwgdG8gZnJhbWUgaW5mbyBzdHJ1Y3QKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgY3RybFNpZ25hbDJGcmFtZUluZm8gKCZoU2JyRW52RnJhbWUtPlNickdyaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmaFNickVudkZyYW1lLT5TYnJGcmFtZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaFNickVudkZyYW1lLT5mcmVxX3Jlc19maXhmaXgpOworICBjdHJsU2lnbmFsMkZyYW1lSW5mbygmaFNickVudkZyYW1lLT5TYnJHcmlkLCAmaFNickVudkZyYW1lLT5TYnJGcmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbnZGcmFtZS0+ZnJlcV9yZXNfZml4Zml4KTsKIAogICByZXR1cm4gJmhTYnJFbnZGcmFtZS0+U2JyRnJhbWVJbmZvOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiEKLSAgXGJyaWVmICAgIEduZXJhdGVzIGZyYW1lIGluZm8gZm9yIEZJWEZJWG9ubHkgZnJhbWUgY2xhc3MgdXNlZCBmb3IgbG93IGRlbGF5IHZlcnNpb24KKyAgXGJyaWVmICAgIEduZXJhdGVzIGZyYW1lIGluZm8gZm9yIEZJWEZJWG9ubHkgZnJhbWUgY2xhc3MgdXNlZCBmb3IgbG93IGRlbGF5CisgdmVyc2lvbgogCiAgIFxyZXR1cm4gICBub3RoaW5nCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGdlbmVyYXRlRml4Rml4T25seSAoIEhBTkRMRV9TQlJfRlJBTUVfSU5GTyBoU2JyRnJhbWVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9HUklEIGhTYnJHcmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5Qb3NJbnRlcm5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJUaW1lU2xvdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBmUmVzVHJhbnNJc0xvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgaW50IG5FbnYsIGksIGs9MCwgdHJhbklkeDsKK3N0YXRpYyB2b2lkIGdlbmVyYXRlRml4Rml4T25seShIQU5ETEVfU0JSX0ZSQU1FX0lORk8gaFNickZyYW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0dSSUQgaFNickdyaWQsIGludCB0cmFuUG9zSW50ZXJuYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlclRpbWVTbG90cywgVUNIQVIgZlJlc1RyYW5zSXNMb3cpIHsKKyAgaW50IG5FbnYsIGksIGsgPSAwLCB0cmFuSWR4OwogICBjb25zdCBpbnQgKnBUYWJsZSA9IE5VTEw7CiAgIGNvbnN0IEZSRVFfUkVTICpmcmVxUmVzVGFibGUgPSBOVUxMOwogCiAgIHN3aXRjaCAobnVtYmVyVGltZVNsb3RzKSB7Ci0gICAgICBjYXNlIDg6Ci0gICAgICAgICAgcFRhYmxlID0gZW52ZWxvcGVUYWJsZV84W3RyYW5Qb3NJbnRlcm5hbF07Ci0gICAgICAgICAgZnJlcVJlc1RhYmxlID0gZnJlcVJlc190YWJsZV84OwotICAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxNToKLSAgICAgICAgICBwVGFibGUgPSBlbnZlbG9wZVRhYmxlXzE1W3RyYW5Qb3NJbnRlcm5hbF07Ci0gICAgICAgICAgZnJlcVJlc1RhYmxlID0gZnJlcVJlc190YWJsZV8xNjsKLSAgICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgcFRhYmxlID0gZW52ZWxvcGVUYWJsZV8xNlt0cmFuUG9zSW50ZXJuYWxdOwotICAgICAgICAgIGZyZXFSZXNUYWJsZSA9IGZyZXFSZXNfdGFibGVfMTY7Ci0gICAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OiB7CisgICAgICBwVGFibGUgPSBlbnZlbG9wZVRhYmxlXzhbdHJhblBvc0ludGVybmFsXTsKKyAgICB9CisgICAgICBmcmVxUmVzVGFibGUgPSBmcmVxUmVzX3RhYmxlXzg7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE1OgorICAgICAgcFRhYmxlID0gZW52ZWxvcGVUYWJsZV8xNVt0cmFuUG9zSW50ZXJuYWxdOworICAgICAgZnJlcVJlc1RhYmxlID0gZnJlcVJlc190YWJsZV8xNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICBwVGFibGUgPSBlbnZlbG9wZVRhYmxlXzE2W3RyYW5Qb3NJbnRlcm5hbF07CisgICAgICBmcmVxUmVzVGFibGUgPSBmcmVxUmVzX3RhYmxlXzE2OworICAgICAgYnJlYWs7CiAgIH0KIAogICAvKiBsb29rIG51bWJlciBvZiBlbnZvbHBlcyBpbiB0YWJsZSAqLwogICBuRW52ID0gcFRhYmxlWzBdOwogICAvKiBsb29rIHVwIGVudm9scGUgZGlzdHJpYnV0aW9uIGluIHRhYmxlICovCi0gIGZvciAoaT0xOyBpPG5FbnY7IGkrKykKLSAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2ldID0gcFRhYmxlW2krMl07CisgIGZvciAoaSA9IDE7IGkgPCBuRW52OyBpKyspIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaV0gPSBwVGFibGVbaSArIDJdOwogCiAgIC8qIG9wZW4gYW5kIGNsb3NlIGZyYW1lIGJvcmRlciAqLwotICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzWzBdICAgID0gMDsKKyAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1swXSA9IDA7CiAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbbkVudl0gPSBudW1iZXJUaW1lU2xvdHM7CiAKICAgLyogYWRqdXN0IHNlZ21lbnQtZnJlcXVlbmN5LXJlc29sdXRpb24gYWNjb3JkaW5nIHRvIHRoZSBzZWdtZW50LWxlbmd0aCAqLwotICBmb3IgKGk9MDsgaTxuRW52OyBpKyspewotICAgIGsgPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2krMV0gLSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2ldOworICBmb3IgKGkgPSAwOyBpIDwgbkVudjsgaSsrKSB7CisgICAgayA9IGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaSArIDFdIC0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1tpXTsKICAgICBpZiAoIWZSZXNUcmFuc0lzTG93KQogICAgICAgaFNickZyYW1lSW5mby0+ZnJlcVJlc1tpXSA9IGZyZXFSZXNUYWJsZVtrXTsKICAgICBlbHNlCkBAIC03MzgsMjQgKzcwMiwyMiBAQAogICB9CiAKICAgaFNickZyYW1lSW5mby0+bkVudmVsb3BlcyA9IG5FbnY7Ci0gIGhTYnJGcmFtZUluZm8tPnNob3J0RW52ICAgPSBwVGFibGVbMl07CisgIGhTYnJGcmFtZUluZm8tPnNob3J0RW52ID0gcFRhYmxlWzJdOwogICAvKiB0cmFuc2llbnQgaWR4ICovCiAgIHRyYW5JZHggPSBwVGFibGVbMV07CiAKICAgLyogYWRkIG5vaXNlIGZsb29ycyAqLwogICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMF0gPSAwOwotICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW3RyYW5JZHg/dHJhbklkeDoxXTsKKyAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0KKyAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbdHJhbklkeCA/IHRyYW5JZHggOiAxXTsKICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzJdID0gbnVtYmVyVGltZVNsb3RzOwogICBoU2JyRnJhbWVJbmZvLT5uTm9pc2VFbnZlbG9wZXMgPSAyOwogCiAgIGhTYnJHcmlkLT5mcmFtZUNsYXNzID0gRklYRklYb25seTsKICAgaFNickdyaWQtPmJzX2Fic19ib3JkID0gdHJhblBvc0ludGVybmFsOwogICBoU2JyR3JpZC0+YnNfbnVtX2VudiA9IG5FbnY7Ci0KIH0KIAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgRnVuY3Rpb25uYW1lOiAgRkRLc2JyRW5jX2luaXRGcmFtZUluZm9HZW5lcmF0b3IKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC03NzAsMjEgKzczMiwxNCBAQAogIFJldHVybjogICAgICBub25lCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1GREtzYnJFbmNfaW5pdEZyYW1lSW5mb0dlbmVyYXRvciAoCi0gICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WRUxPUEVfRlJBTUUgaFNickVudkZyYW1lLAotICAgICAgICAgICAgICBJTlQgICAgICAgYWxsb3dTcHJlYWQsCi0gICAgICAgICAgICAgIElOVCAgICAgICBudW1FbnZTdGF0aWMsCi0gICAgICAgICAgICAgIElOVCAgICAgICBzdGF0aWNGcmFtaW5nLAotICAgICAgICAgICAgICBJTlQgICAgICAgdGltZVNsb3RzLAotICAgICAgICBjb25zdCBGUkVRX1JFUyogZnJlcV9yZXNfZml4Zml4Ci0gICAgICAgICAgICAgLFVDSEFSICAgICBmUmVzVHJhbnNJc0xvdywKLSAgICAgICAgICAgICAgSU5UICAgICAgIGxkR3JpZAotICAgICAgICApCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZIIDAwLTA2LTI2ICovCit2b2lkIEZES3NickVuY19pbml0RnJhbWVJbmZvR2VuZXJhdG9yKEhBTkRMRV9TQlJfRU5WRUxPUEVfRlJBTUUgaFNickVudkZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYWxsb3dTcHJlYWQsIElOVCBudW1FbnZTdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdGF0aWNGcmFtaW5nLCBJTlQgdGltZVNsb3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGUkVRX1JFUyAqZnJlcV9yZXNfZml4Zml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBmUmVzVHJhbnNJc0xvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGxkR3JpZCkgeyAvKiBGSCAwMC0wNi0yNiAqLwogCi0gIEZES21lbWNsZWFyKGhTYnJFbnZGcmFtZSxzaXplb2YoU0JSX0VOVkVMT1BFX0ZSQU1FICkpOwotCisgIEZES21lbWNsZWFyKGhTYnJFbnZGcmFtZSwgc2l6ZW9mKFNCUl9FTlZFTE9QRV9GUkFNRSkpOwogCiAgIC8qIEluaXRpYWxpc2F0aW9uICovCiAgIGhTYnJFbnZGcmFtZS0+ZnJhbWVDbGFzc09sZCA9IEZJWEZJWDsKQEAgLTc5NSw3ICs3NTAsNyBAQAogICBoU2JyRW52RnJhbWUtPnN0YXRpY0ZyYW1pbmcgPSBzdGF0aWNGcmFtaW5nOwogICBoU2JyRW52RnJhbWUtPmZyZXFfcmVzX2ZpeGZpeFswXSA9IGZyZXFfcmVzX2ZpeGZpeFswXTsKICAgaFNickVudkZyYW1lLT5mcmVxX3Jlc19maXhmaXhbMV0gPSBmcmVxX3Jlc19maXhmaXhbMV07Ci0gIGhTYnJFbnZGcmFtZS0+ZlJlc1RyYW5zSXNMb3cgICAgID0gZlJlc1RyYW5zSXNMb3c7CisgIGhTYnJFbnZGcmFtZS0+ZlJlc1RyYW5zSXNMb3cgPSBmUmVzVHJhbnNJc0xvdzsKIAogICBoU2JyRW52RnJhbWUtPmxlbmd0aF92X2JvcmQgPSAwOwogICBoU2JyRW52RnJhbWUtPmxlbmd0aF92X2JvcmRGb2xsb3cgPSAwOwpAQCAtODEwLDQzICs3NjUsNDEgQEAKIAogICBpZiAobGRHcmlkKSB7CiAgICAgLypjYXNlIENPREVDX0FBQ0xEOiovCi0gICAgICBoU2JyRW52RnJhbWUtPmRtaW4gPSAyOwotICAgICAgaFNickVudkZyYW1lLT5kbWF4ID0gMTY7Ci0gICAgICBoU2JyRW52RnJhbWUtPmZyYW1lTWlkZGxlU2xvdCA9IEZSQU1FX01JRERMRV9TTE9UXzUxMkxEOwotICAgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmJ1ZmZlckZyYW1lU3RhcnQgPSAwOworICAgIGhTYnJFbnZGcmFtZS0+ZG1pbiA9IDI7CisgICAgaFNickVudkZyYW1lLT5kbWF4ID0gMTY7CisgICAgaFNickVudkZyYW1lLT5mcmFtZU1pZGRsZVNsb3QgPSBGUkFNRV9NSURETEVfU0xPVF81MTJMRDsKKyAgICBoU2JyRW52RnJhbWUtPlNickdyaWQuYnVmZmVyRnJhbWVTdGFydCA9IDA7CiAgIH0gZWxzZQotICBzd2l0Y2godGltZVNsb3RzKXsKLSAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzE5MjA6Ci0gICAgICBoU2JyRW52RnJhbWUtPmRtaW4gPSA0OwotICAgICAgaFNickVudkZyYW1lLT5kbWF4ID0gMTI7Ci0gICAgICBoU2JyRW52RnJhbWUtPlNickdyaWQuYnVmZmVyRnJhbWVTdGFydCA9IDA7Ci0gICAgICBoU2JyRW52RnJhbWUtPmZyYW1lTWlkZGxlU2xvdCA9IEZSQU1FX01JRERMRV9TTE9UXzE5MjA7Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OgotICAgICAgaFNickVudkZyYW1lLT5kbWluID0gNDsKLSAgICAgIGhTYnJFbnZGcmFtZS0+ZG1heCA9IDEyOwotICAgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmJ1ZmZlckZyYW1lU3RhcnQgPSAwOwotICAgICAgaFNickVudkZyYW1lLT5mcmFtZU1pZGRsZVNsb3QgPSBGUkFNRV9NSURETEVfU0xPVF8yMDQ4OwotICAgIGJyZWFrOwotICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTE1MjoKLSAgICAgIGhTYnJFbnZGcmFtZS0+ZG1pbiA9IDI7Ci0gICAgICBoU2JyRW52RnJhbWUtPmRtYXggPSA4OwotICAgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmJ1ZmZlckZyYW1lU3RhcnQgPSAwOwotICAgICAgaFNickVudkZyYW1lLT5mcmFtZU1pZGRsZVNsb3QgPSBGUkFNRV9NSURETEVfU0xPVF8xMTUyOwotICAgIGJyZWFrOwotICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNDoKLSAgICAgIGhTYnJFbnZGcmFtZS0+ZG1pbiA9IDQ7Ci0gICAgICBoU2JyRW52RnJhbWUtPmRtYXggPSAxNTsKLSAgICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5idWZmZXJGcmFtZVN0YXJ0ID0gMDsKLSAgICAgIGhTYnJFbnZGcmFtZS0+ZnJhbWVNaWRkbGVTbG90ID0gRlJBTUVfTUlERExFX1NMT1RfMjMwNDsKLSAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgRkRLX0FTU0VSVCgwKTsKLSAgfQotCisgICAgc3dpdGNoICh0aW1lU2xvdHMpIHsKKyAgICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDoKKyAgICAgICAgaFNickVudkZyYW1lLT5kbWluID0gNDsKKyAgICAgICAgaFNickVudkZyYW1lLT5kbWF4ID0gMTI7CisgICAgICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5idWZmZXJGcmFtZVN0YXJ0ID0gMDsKKyAgICAgICAgaFNickVudkZyYW1lLT5mcmFtZU1pZGRsZVNsb3QgPSBGUkFNRV9NSURETEVfU0xPVF8xOTIwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjA0ODoKKyAgICAgICAgaFNickVudkZyYW1lLT5kbWluID0gNDsKKyAgICAgICAgaFNickVudkZyYW1lLT5kbWF4ID0gMTI7CisgICAgICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5idWZmZXJGcmFtZVN0YXJ0ID0gMDsKKyAgICAgICAgaFNickVudkZyYW1lLT5mcmFtZU1pZGRsZVNsb3QgPSBGUkFNRV9NSURETEVfU0xPVF8yMDQ4OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTE1MjoKKyAgICAgICAgaFNickVudkZyYW1lLT5kbWluID0gMjsKKyAgICAgICAgaFNickVudkZyYW1lLT5kbWF4ID0gODsKKyAgICAgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmJ1ZmZlckZyYW1lU3RhcnQgPSAwOworICAgICAgICBoU2JyRW52RnJhbWUtPmZyYW1lTWlkZGxlU2xvdCA9IEZSQU1FX01JRERMRV9TTE9UXzExNTI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMzA0OgorICAgICAgICBoU2JyRW52RnJhbWUtPmRtaW4gPSA0OworICAgICAgICBoU2JyRW52RnJhbWUtPmRtYXggPSAxNTsKKyAgICAgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmJ1ZmZlckZyYW1lU3RhcnQgPSAwOworICAgICAgICBoU2JyRW52RnJhbWUtPmZyYW1lTWlkZGxlU2xvdCA9IEZSQU1FX01JRERMRV9TTE9UXzIzMDQ7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICB9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBmaWxsRnJhbWVUcmFuCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODcwLDE4ICs4MjMsMTcgQEAKICBSZXR1cm46ICAgICAgbm9uZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWZpbGxGcmFtZVRyYW4gKGNvbnN0IGludCAqdl90dW5pbmdTZWdtLCAgICAgIC8qITwgdHVuaW5nOiBkZXNpcmVkIHNlZ21lbnQgbGVuZ3RocyAqLwotICAgICAgICAgICAgICAgY29uc3QgaW50ICp2X3R1bmluZ0ZyZXEsICAgICAgLyohPCB0dW5pbmc6IGRlc2lyZWQgZnJlcXVlbmN5IHJlc29sdXRpb25zICovCi0gICAgICAgICAgICAgICBpbnQgdHJhbiwgICAgICAgICAgICAgICAgICAgICAvKiE8IGlucHV0IDogcG9zaXRpb24gb2YgdHJhbnNpZW50ICovCi0gICAgICAgICAgICAgICBpbnQgKnZfYm9yZCwgICAgICAgICAgICAgICAgICAvKiE8IG1lbU5ldzogYm9yZGVycyAqLwotICAgICAgICAgICAgICAgaW50ICpsZW5ndGhfdl9ib3JkLCAgICAgICAgICAgLyohPCBtZW1OZXc6ICMgYm9yZGVycyAqLwotICAgICAgICAgICAgICAgaW50ICp2X2ZyZXEsICAgICAgICAgICAgICAgICAgLyohPCBtZW1OZXc6IGZyZXF1ZW5jeSByZXNvbHV0aW9ucyAqLwotICAgICAgICAgICAgICAgaW50ICpsZW5ndGhfdl9mcmVxLCAgICAgICAgICAgLyohPCBtZW1OZXc6ICMgZnJlcXVlbmN5IHJlc29sdXRpb25zICovCi0gICAgICAgICAgICAgICBpbnQgKmJtaW4sICAgICAgICAgICAgICAgICAgICAvKiE8IGhscE5ldzogZmlyc3QgbWFuZGF0b3J5IGJvcmRlciAqLwotICAgICAgICAgICAgICAgaW50ICpibWF4ICAgICAgICAgICAgICAgICAgICAgLyohPCBobHBOZXc6IGxhc3QgIG1hbmRhdG9yeSBib3JkZXIgKi8KLSAgICAgICAgICAgICAgICkKLXsKK3N0YXRpYyB2b2lkIGZpbGxGcmFtZVRyYW4oCisgICAgY29uc3QgaW50ICp2X3R1bmluZ1NlZ20sIC8qITwgdHVuaW5nOiBkZXNpcmVkIHNlZ21lbnQgbGVuZ3RocyAqLworICAgIGNvbnN0IGludCAqdl90dW5pbmdGcmVxLCAvKiE8IHR1bmluZzogZGVzaXJlZCBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgKi8KKyAgICBpbnQgdHJhbiwgICAgICAgICAgICAgICAgLyohPCBpbnB1dCA6IHBvc2l0aW9uIG9mIHRyYW5zaWVudCAqLworICAgIGludCAqdl9ib3JkLCAgICAgICAgICAgICAvKiE8IG1lbU5ldzogYm9yZGVycyAqLworICAgIGludCAqbGVuZ3RoX3ZfYm9yZCwgICAgICAvKiE8IG1lbU5ldzogIyBib3JkZXJzICovCisgICAgaW50ICp2X2ZyZXEsICAgICAgICAgICAgIC8qITwgbWVtTmV3OiBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgKi8KKyAgICBpbnQgKmxlbmd0aF92X2ZyZXEsICAgICAgLyohPCBtZW1OZXc6ICMgZnJlcXVlbmN5IHJlc29sdXRpb25zICovCisgICAgaW50ICpibWluLCAgICAgICAgICAgICAgIC8qITwgaGxwTmV3OiBmaXJzdCBtYW5kYXRvcnkgYm9yZGVyICovCisgICAgaW50ICpibWF4ICAgICAgICAgICAgICAgIC8qITwgaGxwTmV3OiBsYXN0ICBtYW5kYXRvcnkgYm9yZGVyICovCispIHsKICAgaW50IGJvcmQsIGk7CiAKICAgKmxlbmd0aF92X2JvcmQgPSAwOwpAQCAtODkwLDI1ICs4NDIsMjUgQEAKICAgLyogYWRkIGF0dGFjayBlbnYgbGVhZGluZyBib3JkZXIgKG9wdGlvbmFsKSAqLwogICBpZiAodl90dW5pbmdTZWdtWzBdKSB7CiAgICAgLyogdl9ib3JkID0gWyhCYSldIHN0YXJ0IG9mIGF0dGFjayBlbnYgKi8KLSAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgKHRyYW4gLSB2X3R1bmluZ1NlZ21bMF0pKTsKKyAgICBGREtzYnJFbmNfQWRkUmlnaHQodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCAodHJhbiAtIHZfdHVuaW5nU2VnbVswXSkpOwogCiAgICAgLyogdl9mcmVxID0gWyhGYSldIHJlcyBvZiBhdHRhY2sgZW52ICovCi0gICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfdHVuaW5nRnJlcVswXSk7CisgICAgRkRLc2JyRW5jX0FkZFJpZ2h0KHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl90dW5pbmdGcmVxWzBdKTsKICAgfQogCiAgIC8qIGFkZCBhdHRhY2sgZW52IHRyYWlsaW5nIGJvcmRlci9maXJzdCBkZWNheSBlbnYgbGVhZGluZyBib3JkZXIgKi8KICAgYm9yZCA9IHRyYW47Ci0gIEZES3NickVuY19BZGRSaWdodCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB0cmFuKTsgICAvKiB2X2JvcmQgPSBbKEJhKSxCZDFdICovCisgIEZES3NickVuY19BZGRSaWdodCh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHRyYW4pOyAvKiB2X2JvcmQgPSBbKEJhKSxCZDFdICovCiAKICAgLyogYWRkIGZpcnN0IGRlY2F5IGVudiB0cmFpbGluZyBib3JkZXIvMjpuZCBkZWNheSBlbnYgbGVhZGluZyBib3JkZXIgKi8KICAgaWYgKHZfdHVuaW5nU2VnbVsxXSkgewogICAgIGJvcmQgKz0gdl90dW5pbmdTZWdtWzFdOwogCiAgICAgLyogdl9ib3JkID0gWyhCYSksQmQxLEJkMl0gKi8KLSAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgYm9yZCk7CisgICAgRkRLc2JyRW5jX0FkZFJpZ2h0KHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgYm9yZCk7CiAKICAgICAvKiB2X2ZyZXEgPSBbKEZhKSxGZDFdICovCi0gICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfdHVuaW5nRnJlcVsxXSk7CisgICAgRkRLc2JyRW5jX0FkZFJpZ2h0KHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl90dW5pbmdGcmVxWzFdKTsKICAgfQogCiAgIC8qIGFkZCAyOm5kIGRlY2F5IGVudiB0cmFpbGluZyBib3JkZXIgKG9wdGlvbmFsKSAqLwpAQCAtOTE2LDMxICs4NjgsMjUgQEAKICAgICBib3JkICs9IHZfdHVuaW5nU2VnbVsyXTsKIAogICAgIC8qIHZfYm9yZCA9IFsoQmEpLEJkMSwgQmQyLChCZDMpXSAqLwotICAgIEZES3NickVuY19BZGRSaWdodCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCBib3JkKTsKKyAgICBGREtzYnJFbmNfQWRkUmlnaHQodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCBib3JkKTsKIAogICAgIC8qIHZfZnJlcSA9IFsoRmEpLEZkMSwoRmQyKV0gKi8KLSAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl90dW5pbmdGcmVxWzJdKTsKKyAgICBGREtzYnJFbmNfQWRkUmlnaHQodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X3R1bmluZ0ZyZXFbMl0pOwogICB9CiAKICAgLyogIHZfZnJlcSA9IFsoRmEpLEZkMSwoRmQyKSwxXSAqLwotICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgMSk7Ci0KKyAgRkRLc2JyRW5jX0FkZFJpZ2h0KHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgMSk7CiAKICAgLyogIGNhbGMgbWluIGFuZCBtYXggdmFsdWVzIG9mIG1hbmRhdG9yeSBib3JkZXJzICovCiAgICpibWluID0gdl9ib3JkWzBdOwogICBmb3IgKGkgPSAwOyBpIDwgKmxlbmd0aF92X2JvcmQ7IGkrKykKLSAgICBpZiAodl9ib3JkW2ldIDwgKmJtaW4pCi0gICAgICAqYm1pbiA9IHZfYm9yZFtpXTsKKyAgICBpZiAodl9ib3JkW2ldIDwgKmJtaW4pICpibWluID0gdl9ib3JkW2ldOwogCiAgICpibWF4ID0gdl9ib3JkWzBdOwogICBmb3IgKGkgPSAwOyBpIDwgKmxlbmd0aF92X2JvcmQ7IGkrKykKLSAgICBpZiAodl9ib3JkW2ldID4gKmJtYXgpCi0gICAgICAqYm1heCA9IHZfYm9yZFtpXTsKLQorICAgIGlmICh2X2JvcmRbaV0gPiAqYm1heCkgKmJtYXggPSB2X2JvcmRbaV07CiB9CiAKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEZ1bmN0aW9ubmFtZTogIGZpbGxGcmFtZVByZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTk2MSwxMiArOTA3LDggQEAKICBSZXR1cm46ICAgICAgbm9uZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWZpbGxGcmFtZVByZSAoSU5UIGRtYXgsCi0gICAgICAgICAgICAgIElOVCAqdl9ib3JkLCBJTlQgKmxlbmd0aF92X2JvcmQsCi0gICAgICAgICAgICAgIElOVCAqdl9mcmVxLCBJTlQgKmxlbmd0aF92X2ZyZXEsCi0gICAgICAgICAgICAgIElOVCBibWluLCBJTlQgcmVzdCkKLXsKK3N0YXRpYyB2b2lkIGZpbGxGcmFtZVByZShJTlQgZG1heCwgSU5UICp2X2JvcmQsIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9mcmVxLCBJTlQgYm1pbiwgSU5UIHJlc3QpIHsKICAgLyoKICAgICBpbnB1dCBzdGF0ZToKICAgICB2X2JvcmQgPSBbKEJhKSxCZDEsIEJkMiAsKEJkMyldCkBAIC05OTAsOCArOTMyLDggQEAKICAgICBwYXJ0cysrOwogCiAgICAgc2VnbSA9IHJlc3QgLyBwYXJ0czsKLSAgICBTID0gKHNlZ20gLSAyKT4+MTsKLSAgICBzID0gZml4TWluICg4LCAyICogUyArIDIpOworICAgIFMgPSAoc2VnbSAtIDIpID4+IDE7CisgICAgcyA9IGZpeE1pbig4LCAyICogUyArIDIpOwogICAgIGQgPSByZXN0IC0gKHBhcnRzIC0gMSkgKiBzOwogICB9CiAKQEAgLTEwMDUsMTAgKzk0NywxMCBAQAogICAgIGJvcmQgPSBib3JkIC0gczsKIAogICAgIC8qIHZfYm9yZCA9IFsuLi4sKEJmKSwoQmEpLEJkMSwgQmQyICwoQmQzKV0gKi8KLSAgICBGREtzYnJFbmNfQWRkTGVmdCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCBib3JkKTsKKyAgICBGREtzYnJFbmNfQWRkTGVmdCh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIGJvcmQpOwogCiAgICAgLyogdl9mcmVxID0gWy4uLiwoMSApLChGYSksRmQxLChGZDIpLCAxICAgXSAqLwotICAgIEZES3NickVuY19BZGRMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIDEpOworICAgIEZES3NickVuY19BZGRMZWZ0KHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgMSk7CiAgIH0KIH0KIApAQCAtMTAyMiwzOSArOTY0LDM3IEBACiAgIFxyZXR1cm4gdm9pZAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAotY2FsY0ZpbGxMZW5ndGhNYXggKGludCB0cmFuUG9zLCAgICAgICAgICAvKiE8IGlucHV0IDogdHJhbnNpZW50IHBvc2l0aW9uIChyZWY6IHRyYW4gZGV0KSAqLwotICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJUaW1lU2xvdHMgICAvKiE8IGlucHV0IDogbnVtYmVyIG9mIHRpbWVzbG90cyAqLwotICAgICAgICAgICAgICAgICAgICkKLXsKK3N0YXRpYyBpbnQgY2FsY0ZpbGxMZW5ndGhNYXgoCisgICAgaW50IHRyYW5Qb3MsICAgICAgICAvKiE8IGlucHV0IDogdHJhbnNpZW50IHBvc2l0aW9uIChyZWY6IHRyYW4gZGV0KSAqLworICAgIGludCBudW1iZXJUaW1lU2xvdHMgLyohPCBpbnB1dCA6IG51bWJlciBvZiB0aW1lc2xvdHMgKi8KKykgewogICBpbnQgZm1heDsKIAogICAvKgogICAgIGNhbGN1bGF0ZSB0cmFuc2llbnQgcG9zaXRpb24gd2l0aGluIGVudmVsb3BlIGJ1ZmZlcgogICAqLwotICBzd2l0Y2ggKG51bWJlclRpbWVTbG90cykKLSAgeworICBzd2l0Y2ggKG51bWJlclRpbWVTbG90cykgewogICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjA0ODoKLSAgICAgICAgaWYgKHRyYW5Qb3MgPCA0KQotICAgICAgICAgIGZtYXggPSA2OwotICAgICAgICBlbHNlIGlmICh0cmFuUG9zID09IDQgfHwgdHJhblBvcyA9PSA1KQotICAgICAgICAgIGZtYXggPSA0OwotICAgICAgICBlbHNlCi0gICAgICAgICAgZm1heCA9IDg7Ci0gICAgICAgIGJyZWFrOworICAgICAgaWYgKHRyYW5Qb3MgPCA0KQorICAgICAgICBmbWF4ID0gNjsKKyAgICAgIGVsc2UgaWYgKHRyYW5Qb3MgPT0gNCB8fCB0cmFuUG9zID09IDUpCisgICAgICAgIGZtYXggPSA0OworICAgICAgZWxzZQorICAgICAgICBmbWF4ID0gODsKKyAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xOTIwOgotICAgICAgICBpZiAodHJhblBvcyA8IDQpCi0gICAgICAgICAgZm1heCA9IDU7Ci0gICAgICAgIGVsc2UgaWYgKHRyYW5Qb3MgPT0gNCB8fCB0cmFuUG9zID09IDUpCi0gICAgICAgICAgZm1heCA9IDM7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBmbWF4ID0gNzsKLSAgICAgICAgYnJlYWs7CisgICAgICBpZiAodHJhblBvcyA8IDQpCisgICAgICAgIGZtYXggPSA1OworICAgICAgZWxzZSBpZiAodHJhblBvcyA9PSA0IHx8IHRyYW5Qb3MgPT0gNSkKKyAgICAgICAgZm1heCA9IDM7CisgICAgICBlbHNlCisgICAgICAgIGZtYXggPSA3OworICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgotICAgICAgICBmbWF4ID0gODsKLSAgICAgICAgYnJlYWs7CisgICAgICBmbWF4ID0gODsKKyAgICAgIGJyZWFrOwogICB9CiAKICAgcmV0dXJuIGZtYXg7CkBAIC0xMDgzLDExICsxMDIzLDEwIEBACiAgUmV0dXJuOiAgICAgIG5vbmUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1maWxsRnJhbWVQb3N0IChJTlQgKnBhcnRzLCBJTlQgKmQsIElOVCBkbWF4LCBJTlQgKnZfYm9yZCwgSU5UICpsZW5ndGhfdl9ib3JkLAotICAgICAgICAgICAgICAgSU5UICp2X2ZyZXEsIElOVCAqbGVuZ3RoX3ZfZnJlcSwgSU5UIGJtYXgsCi0gICAgICAgICAgICAgICBJTlQgYnVmZmVyRnJhbWVTdGFydCwgSU5UIG51bWJlclRpbWVTbG90cywgSU5UIGZtYXgpCi17CitzdGF0aWMgdm9pZCBmaWxsRnJhbWVQb3N0KElOVCAqcGFydHMsIElOVCAqZCwgSU5UIGRtYXgsIElOVCAqdl9ib3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2JvcmQsIElOVCAqdl9mcmVxLCBJTlQgKmxlbmd0aF92X2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBibWF4LCBJTlQgYnVmZmVyRnJhbWVTdGFydCwgSU5UIG51bWJlclRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGZtYXgpIHsKICAgSU5UIGosIHJlc3QsIHNlZ20sIFMsIHMgPSAwLCBib3JkOwogCiAgIC8qCkBAIC0xMTAwLDcgKzEwMzksNyBAQAogICAqZCA9IHJlc3Q7CiAKICAgaWYgKCpkID4gMCkgewotICAgICpwYXJ0cyA9IDE7ICAgICAgICAgICAvKiBzdGFydCB3aXRoIG9uZSBlbnZlbG9wZSAqLworICAgICpwYXJ0cyA9IDE7IC8qIHN0YXJ0IHdpdGggb25lIGVudmVsb3BlICovCiAKICAgICAvKiBjYWxjICMgb2YgYWRkaXRpb25hbCBlbnZlbG9wZXMgYW5kIGNvcnJlc3BvbmRpbmcgbGVuZ3RocyAqLwogCkBAIC0xMTA4LDggKzEwNDcsOCBAQAogICAgICAgKnBhcnRzID0gKnBhcnRzICsgMTsKIAogICAgICAgc2VnbSA9IHJlc3QgLyAoKnBhcnRzKTsKLSAgICAgIFMgPSAoc2VnbSAtIDIpPj4xOwotICAgICAgcyA9IGZpeE1pbiAoZm1heCwgMiAqIFMgKyAyKTsKKyAgICAgIFMgPSAoc2VnbSAtIDIpID4+IDE7CisgICAgICBzID0gZml4TWluKGZtYXgsIDIgKiBTICsgMik7CiAgICAgICAqZCA9IHJlc3QgLSAoKnBhcnRzIC0gMSkgKiBzOwogICAgIH0KIApAQCAtMTEyMCwyNSArMTA1OSwyMSBAQAogICAgICAgYm9yZCArPSBzOwogCiAgICAgICAvKiB2X2JvcmQgPSAgWy4uLiwoQmYpLChCYSksQmQxLCBCZDIgLChCZDMpLChCZildICovCi0gICAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgYm9yZCk7CisgICAgICBGREtzYnJFbmNfQWRkUmlnaHQodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCBib3JkKTsKIAogICAgICAgLyogdl9mcmVxID0gIFsuLi4sKDEgKSwoRmEpLEZkMSwoRmQyKSwgMSAgICwgMSEgLDFdICovCi0gICAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgMSk7CisgICAgICBGREtzYnJFbmNfQWRkUmlnaHQodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCAxKTsKICAgICB9Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgKnBhcnRzID0gMTsKIAogICAgIC8qIHJlbW92ZSBsYXN0IGVsZW1lbnQgZnJvbSB2X2JvcmQgYW5kIHZfZnJlcSAqLwogCiAgICAgKmxlbmd0aF92X2JvcmQgPSAqbGVuZ3RoX3ZfYm9yZCAtIDE7CiAgICAgKmxlbmd0aF92X2ZyZXEgPSAqbGVuZ3RoX3ZfZnJlcSAtIDE7Ci0KICAgfQogfQogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBmaWxsRnJhbWVJbnRlcgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTExNjMsMTcgKzEwOTgsMTUgQEAKICBSZXR1cm46ICAgICAgbm9uZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWZpbGxGcmFtZUludGVyIChJTlQgKm5MLCBjb25zdCBpbnQgKnZfdHVuaW5nU2VnbSwgSU5UICp2X2JvcmQsIElOVCAqbGVuZ3RoX3ZfYm9yZCwKLSAgICAgICAgICAgICAgICBJTlQgYm1pbiwgSU5UICp2X2ZyZXEsIElOVCAqbGVuZ3RoX3ZfZnJlcSwgSU5UICp2X2JvcmRGb2xsb3csCi0gICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkRm9sbG93LCBJTlQgKnZfZnJlcUZvbGxvdywKLSAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2ZyZXFGb2xsb3csIElOVCBpX2ZpbGxGb2xsb3csIElOVCBkbWluLAotICAgICAgICAgICAgICAgIElOVCBkbWF4LCBJTlQgbnVtYmVyVGltZVNsb3RzKQoteworc3RhdGljIHZvaWQgZmlsbEZyYW1lSW50ZXIoSU5UICpuTCwgY29uc3QgaW50ICp2X3R1bmluZ1NlZ20sIElOVCAqdl9ib3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgYm1pbiwgSU5UICp2X2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2ZyZXEsIElOVCAqdl9ib3JkRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkRm9sbG93LCBJTlQgKnZfZnJlcUZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfZnJlcUZvbGxvdywgSU5UIGlfZmlsbEZvbGxvdywgSU5UIGRtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZG1heCwgSU5UIG51bWJlclRpbWVTbG90cykgewogICBJTlQgbWlkZGxlLCBiX25ldywgbnVtQm9yZEZvbGxvdywgYm9yZE1heEZvbGxvdywgaTsKIAogICBpZiAobnVtYmVyVGltZVNsb3RzICE9IE5VTUJFUl9USU1FX1NMT1RTXzExNTIpIHsKLQogICAgIC8qICUgcmVtb3ZlIGZpbGwgYm9yZGVyczogKi8KICAgICBpZiAoaV9maWxsRm9sbG93ID49IDEpIHsKICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93ID0gaV9maWxsRm9sbG93OwpAQCAtMTE5Nyw2NSArMTEzMCw2MSBAQAogCiAgICAgYl9uZXcgPSAqbGVuZ3RoX3ZfYm9yZDsKIAotCiAgICAgaWYgKG1pZGRsZSA8PSBkbWF4KSB7Ci0gICAgICBpZiAobWlkZGxlID49IGRtaW4pIHsgICAgICAgLyogY29uY2F0ZW5hdGUgKi8KLSAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyk7Ci0gICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywgKmxlbmd0aF92X2ZyZXFGb2xsb3cpOworICAgICAgaWYgKG1pZGRsZSA+PSBkbWluKSB7IC8qIGNvbmNhdGVuYXRlICovCisgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0KHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyk7CisgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0KHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CiAgICAgICB9CiAKICAgICAgIGVsc2UgewotICAgICAgICBpZiAodl90dW5pbmdTZWdtWzBdICE9IDApIHsgICAgICAgLyogcmVtb3ZlIG9uZSBuZXcgYm9yZGVyIGFuZCBjb25jYXRlbmF0ZSAqLworICAgICAgICBpZiAodl90dW5pbmdTZWdtWzBdICE9IDApIHsgLyogcmVtb3ZlIG9uZSBuZXcgYm9yZGVyIGFuZCBjb25jYXRlbmF0ZSAqLwogICAgICAgICAgICpsZW5ndGhfdl9ib3JkID0gYl9uZXcgLSAxOwotICAgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKLSAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cpOworICAgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0KHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93KTsKIAogICAgICAgICAgICpsZW5ndGhfdl9mcmVxID0gYl9uZXcgLSAxOwotICAgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEgKyAxLCBsZW5ndGhfdl9mcmVxLCB2X2ZyZXFGb2xsb3csCi0gICAgICAgICAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBpZiAoKmxlbmd0aF92X2JvcmRGb2xsb3cgPiAxKSB7IC8qIHJlbW92ZSBvbmUgb2xkIGJvcmRlciBhbmQgY29uY2F0ZW5hdGUgKi8KLSAgICAgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKLSAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyAtIDEpOwotICAgICAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LAotICAgICAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93IC0gMSk7CisgICAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQodl9mcmVxICsgMSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoKmxlbmd0aF92X2JvcmRGb2xsb3cgPgorICAgICAgICAgICAgICAxKSB7IC8qIHJlbW92ZSBvbmUgb2xkIGJvcmRlciBhbmQgY29uY2F0ZW5hdGUgKi8KKyAgICAgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0KHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cgLSAxKTsKKyAgICAgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0KHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cgLSAxKTsKIAogICAgICAgICAgICAgKm5MID0gKm5MIC0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgLyogcmVtb3ZlIG5ldyAidHJhbnNpZW50IiBib3JkZXIgYW5kIGNvbmNhdGVuYXRlICovCisgICAgICAgICAgfSBlbHNlIHsgLyogcmVtb3ZlIG5ldyAidHJhbnNpZW50IiBib3JkZXIgYW5kIGNvbmNhdGVuYXRlICovCiAKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoX3ZfYm9yZCAtIDE7IGkrKykKLSAgICAgICAgICAgICAgdl9ib3JkW2ldID0gdl9ib3JkW2kgKyAxXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoX3ZfYm9yZCAtIDE7IGkrKykgdl9ib3JkW2ldID0gdl9ib3JkW2kgKyAxXTsKIAotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8ICpsZW5ndGhfdl9mcmVxIC0gMTsgaSsrKQotICAgICAgICAgICAgICB2X2ZyZXFbaV0gPSB2X2ZyZXFbaSArIDFdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8ICpsZW5ndGhfdl9mcmVxIC0gMTsgaSsrKSB2X2ZyZXFbaV0gPSB2X2ZyZXFbaSArIDFdOwogCiAgICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZCA9IGJfbmV3IC0gMTsKICAgICAgICAgICAgICpsZW5ndGhfdl9mcmVxID0gYl9uZXcgLSAxOwogCi0gICAgICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csCi0gICAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cpOwotICAgICAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LAotICAgICAgICAgICAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93KTsKKyAgICAgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0KHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cpOworICAgICAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X2ZyZXFGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pZGRsZSA+IGRtYXggKi8KKyAgICB9IGVsc2UgeyAvKiBtaWRkbGUgPiBkbWF4ICovCiAKLSAgICAgIGZpbGxGcmFtZVByZSAoZG1heCwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIGJtaW4sCi0gICAgICAgICAgbWlkZGxlKTsKLSAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywgKmxlbmd0aF92X2JvcmRGb2xsb3cpOwotICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LCAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CisgICAgICBmaWxsRnJhbWVQcmUoZG1heCwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIGJtaW4sCisgICAgICAgICAgICAgICAgICAgbWlkZGxlKTsKKyAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0KHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cpOworICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X2ZyZXFGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CiAgICAgfQogCisgIH0gZWxzZSB7IC8qIG51bWJlclRpbWVTbG90cz09TlVNQkVSX1RJTUVfU0xPVFNfMTE1MiAqLwogCi0gIH0KLSAgZWxzZSB7IC8qIG51bWJlclRpbWVTbG90cz09TlVNQkVSX1RJTUVfU0xPVFNfMTE1MiAqLwotCi0gICAgSU5UIGwsbTsKLQorICAgIElOVCBsLCBtOwogCiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgIHJlbW92ZSBmaWxsIGJvcmRlcnMKQEAgLTEyNzcsMTcgKzEyMDYsMTUgQEAKIAogICAgIC8qIGludGVydmFsczoKICAgICAgICBpKSAgICAgICAgICAgICBtaWRkbGUgPCAgMCAgICAgOiBvdmVybGFwLCBtdXN0IHJlbW92ZSBib3JkZXJzCi0gICAgICAgaWkpICAgICAgIDAgPD0gbWlkZGxlIDwgIGRtaW4gIDogbm8gb3ZlcmxhcCBidXQgdG9vIHRpZ2h0LCBtdXN0IHJlbW92ZSBib3JkZXJzCi0gICAgICAgaWlpKSAgIGRtaW4gPD0gbWlkZGxlIDw9IGRtYXggIDogb2ssIGp1c3QgY29uY2F0ZW5hdGUKLSAgICAgICBpdikgICAgZG1heCA8PSBtaWRkbGUgICAgICAgICAgOiB0b28gd2lkZSwgbXVzdCBhZGQgYm9yZGVycworICAgICAgIGlpKSAgICAgICAwIDw9IG1pZGRsZSA8ICBkbWluICA6IG5vIG92ZXJsYXAgYnV0IHRvbyB0aWdodCwgbXVzdCByZW1vdmUKKyAgICAgICBib3JkZXJzIGlpaSkgICBkbWluIDw9IG1pZGRsZSA8PSBkbWF4ICA6IG9rLCBqdXN0IGNvbmNhdGVuYXRlIGl2KSAgICBkbWF4CisgICAgICAgPD0gbWlkZGxlICAgICAgICAgIDogdG9vIHdpZGUsIG11c3QgYWRkIGJvcmRlcnMKICAgICAgKi8KIAogICAgIC8qIGZpcnN0IHJlbW92ZSBvbGQgbm9uLWZpbGwtYm9yZGVycy4uLiAqLwogICAgIHdoaWxlIChtaWRkbGUgPCAwKSB7Ci0KICAgICAgIC8qIC4uLmJ1dCBkb24ndCByZW1vdmUgYWxsIG9mIHRoZW0gKi8KLSAgICAgIGlmIChudW1Cb3JkRm9sbG93ID09IDEpCi0gICAgICAgIGJyZWFrOworICAgICAgaWYgKG51bUJvcmRGb2xsb3cgPT0gMSkgYnJlYWs7CiAKICAgICAgIG51bUJvcmRGb2xsb3ctLTsKICAgICAgIGJvcmRNYXhGb2xsb3cgPSB2X2JvcmRGb2xsb3dbbnVtQm9yZEZvbGxvdyAtIDFdOwpAQCAtMTI5NSwxMiArMTIyMiw5IEBACiAgICAgfQogCiAgICAgLyogaWYgdGhpcyBpc24ndCBlbm91Z2gsIHJlbW92ZSBuZXcgbm9uLWZpbGwgYm9yZGVycyAqLwotICAgIGlmIChtaWRkbGUgPCAwKQotICAgIHsKLSAgICAgIGZvciAobCA9IDAsIG0gPSAwIDsgbCA8ICpsZW5ndGhfdl9ib3JkIDsgbCsrKQotICAgICAgewotICAgICAgICBpZih2X2JvcmRbbF0+IGJvcmRNYXhGb2xsb3cpCi0gICAgICAgIHsKKyAgICBpZiAobWlkZGxlIDwgMCkgeworICAgICAgZm9yIChsID0gMCwgbSA9IDA7IGwgPCAqbGVuZ3RoX3ZfYm9yZDsgbCsrKSB7CisgICAgICAgIGlmICh2X2JvcmRbbF0gPiBib3JkTWF4Rm9sbG93KSB7CiAgICAgICAgICAgdl9ib3JkW21dID0gdl9ib3JkW2xdOwogICAgICAgICAgIHZfZnJlcVttXSA9IHZfZnJlcVtsXTsKICAgICAgICAgICBtKys7CkBAIC0xMzExLDcgKzEyMzUsNiBAQAogICAgICAgKmxlbmd0aF92X2ZyZXEgPSBsOwogCiAgICAgICBibWluID0gdl9ib3JkWzBdOwotCiAgICAgfQogCiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEzMzEsNjkgKzEyNTQsNjIgQEAKICAgICAvKiBub3cgbWlkZGxlIHNob3VsZCBiZSA+PSAwICovCiAgICAgbWlkZGxlID0gYm1pbiAtIGJvcmRNYXhGb2xsb3c7CiAKLSAgICBpZiAobWlkZGxlIDw9IGRtaW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaWkpICovCisgICAgaWYgKG1pZGRsZSA8PSBkbWluKSAvKiAoaWkpICovCiAgICAgewogICAgICAgYl9uZXcgPSAqbGVuZ3RoX3ZfYm9yZDsKIAotICAgICAgaWYgKHZfdHVuaW5nU2VnbVswXSAhPSAwKQotICAgICAgeworICAgICAgaWYgKHZfdHVuaW5nU2VnbVswXSAhPSAwKSB7CiAgICAgICAgIC8qIHJlbW92ZSBuZXcgImx1eHVyeSIgYm9yZGVyIGFuZCBjb25jYXRlbmF0ZSAqLwogICAgICAgICAqbGVuZ3RoX3ZfYm9yZCA9IGJfbmV3IC0gMTsKLSAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LAotICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cpOworICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cpOwogCiAgICAgICAgICpsZW5ndGhfdl9mcmVxID0gYl9uZXcgLSAxOwotICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9mcmVxICsgMSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LAotICAgICAgICAgICAgKmxlbmd0aF92X2ZyZXFGb2xsb3cpOworICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCh2X2ZyZXEgKyAxLCBsZW5ndGhfdl9mcmVxLCB2X2ZyZXFGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93KTsKIAotICAgICAgfQotICAgICAgZWxzZSBpZiAoKmxlbmd0aF92X2JvcmRGb2xsb3cgPiAxKQotICAgICAgeworICAgICAgfSBlbHNlIGlmICgqbGVuZ3RoX3ZfYm9yZEZvbGxvdyA+IDEpIHsKICAgICAgICAgLyogcmVtb3ZlIG9sZCBib3JkZXIgYW5kIGNvbmNhdGVuYXRlICovCi0gICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKLSAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93IC0gMSk7Ci0gICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywKLSAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93IC0gMSk7CisgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0KHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyAtIDEpOworICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cgLSAxKTsKIAogICAgICAgICAqbkwgPSAqbkwgLSAxOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeworICAgICAgfSBlbHNlIHsKICAgICAgICAgLyogcmVtb3ZlIG5ldyBib3JkZXIgYW5kIGNvbmNhdGVuYXRlICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoX3ZfYm9yZCAtIDE7IGkrKykKLSAgICAgICAgICB2X2JvcmRbaV0gPSB2X2JvcmRbaSArIDFdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKmxlbmd0aF92X2JvcmQgLSAxOyBpKyspIHZfYm9yZFtpXSA9IHZfYm9yZFtpICsgMV07CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8ICpsZW5ndGhfdl9mcmVxIC0gMTsgaSsrKQotICAgICAgICAgIHZfZnJlcVtpXSA9IHZfZnJlcVtpICsgMV07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoX3ZfZnJlcSAtIDE7IGkrKykgdl9mcmVxW2ldID0gdl9mcmVxW2kgKyAxXTsKIAogICAgICAgICAqbGVuZ3RoX3ZfYm9yZCA9IGJfbmV3IC0gMTsKICAgICAgICAgKmxlbmd0aF92X2ZyZXEgPSBiX25ldyAtIDE7CiAKLSAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LAotICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cpOwotICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X2ZyZXFGb2xsb3csCi0gICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CisgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0KHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyk7CisgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0KHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CiAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKChtaWRkbGUgPj0gZG1pbikgJiYgKG1pZGRsZSA8PSBkbWF4KSkgICAgICAvKiAoaWlpKSAqLworICAgIH0gZWxzZSBpZiAoKG1pZGRsZSA+PSBkbWluKSAmJiAobWlkZGxlIDw9IGRtYXgpKSAvKiAoaWlpKSAqLwogICAgIHsKICAgICAgIC8qIGNvbmNhdGVuYXRlICovCi0gICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csICpsZW5ndGhfdl9ib3JkRm9sbG93KTsKLSAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywgKmxlbmd0aF92X2ZyZXFGb2xsb3cpOworICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyk7CisgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93KTsKIAotICAgIH0KLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGl2KSAqLworICAgIH0gZWxzZSAvKiAoaXYpICovCiAgICAgewotICAgICAgZmlsbEZyYW1lUHJlIChkbWF4LCB2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgYm1pbiwKLSAgICAgICAgICBtaWRkbGUpOwotICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyk7Ci0gICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X2ZyZXFGb2xsb3csICpsZW5ndGhfdl9mcmVxRm9sbG93KTsKKyAgICAgIGZpbGxGcmFtZVByZShkbWF4LCB2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgYm1pbiwKKyAgICAgICAgICAgICAgICAgICBtaWRkbGUpOworICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyk7CisgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93KTsKICAgICB9CiAgIH0KIH0KIAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgRnVuY3Rpb25uYW1lOiAgY2FsY0ZyYW1lQ2xhc3MKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNDA1LDQyICsxMzIxLDQ5IEBACiAgUmV0dXJuOiAgICAgIG5vbmUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1jYWxjRnJhbWVDbGFzcyAoRlJBTUVfQ0xBU1MgKmZyYW1lQ2xhc3MsIEZSQU1FX0NMQVNTICpmcmFtZUNsYXNzT2xkLCBJTlQgdHJhbkZsYWcsCi0gICAgICAgICAgICAgICAgSU5UICpzcHJlYWRGbGFnKQotewotCitzdGF0aWMgdm9pZCBjYWxjRnJhbWVDbGFzcyhGUkFNRV9DTEFTUyAqZnJhbWVDbGFzcywgRlJBTUVfQ0xBU1MgKmZyYW1lQ2xhc3NPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdHJhbkZsYWcsIElOVCAqc3ByZWFkRmxhZykgewogICBzd2l0Y2ggKCpmcmFtZUNsYXNzT2xkKSB7Ci0gIGNhc2UgRklYRklYb25seToKLSAgY2FzZSBGSVhGSVg6Ci0gICAgaWYgKHRyYW5GbGFnKSAgKmZyYW1lQ2xhc3MgPSBGSVhWQVI7Ci0gICAgZWxzZSAgICAgICAgICAgKmZyYW1lQ2xhc3MgPSBGSVhGSVg7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRklYVkFSOgotICAgIGlmICh0cmFuRmxhZykgeyAqZnJhbWVDbGFzcyA9IFZBUlZBUjsgKnNwcmVhZEZsYWcgPSAwOyB9Ci0gICAgZWxzZSB7Ci0gICAgICBpZiAoKnNwcmVhZEZsYWcpICAqZnJhbWVDbGFzcyA9IFZBUlZBUjsKLSAgICAgIGVsc2UgICAgICAgICAgICAgICpmcmFtZUNsYXNzID0gVkFSRklYOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBWQVJGSVg6Ci0gICAgaWYgKHRyYW5GbGFnKSAgKmZyYW1lQ2xhc3MgPSBGSVhWQVI7Ci0gICAgZWxzZSAgICAgICAgICAgKmZyYW1lQ2xhc3MgPSBGSVhGSVg7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVkFSVkFSOgotICAgIGlmICh0cmFuRmxhZykgeyAqZnJhbWVDbGFzcyA9IFZBUlZBUjsgKnNwcmVhZEZsYWcgPSAwOyB9Ci0gICAgZWxzZSB7Ci0gICAgICBpZiAoKnNwcmVhZEZsYWcpICAqZnJhbWVDbGFzcyA9IFZBUlZBUjsKLSAgICAgIGVsc2UgICAgICAgICAgICAgICpmcmFtZUNsYXNzID0gVkFSRklYOwotICAgIH0KLSAgICBicmVhazsKKyAgICBjYXNlIEZJWEZJWG9ubHk6CisgICAgY2FzZSBGSVhGSVg6CisgICAgICBpZiAodHJhbkZsYWcpCisgICAgICAgICpmcmFtZUNsYXNzID0gRklYVkFSOworICAgICAgZWxzZQorICAgICAgICAqZnJhbWVDbGFzcyA9IEZJWEZJWDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRklYVkFSOgorICAgICAgaWYgKHRyYW5GbGFnKSB7CisgICAgICAgICpmcmFtZUNsYXNzID0gVkFSVkFSOworICAgICAgICAqc3ByZWFkRmxhZyA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoKnNwcmVhZEZsYWcpCisgICAgICAgICAgKmZyYW1lQ2xhc3MgPSBWQVJWQVI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAqZnJhbWVDbGFzcyA9IFZBUkZJWDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgVkFSRklYOgorICAgICAgaWYgKHRyYW5GbGFnKQorICAgICAgICAqZnJhbWVDbGFzcyA9IEZJWFZBUjsKKyAgICAgIGVsc2UKKyAgICAgICAgKmZyYW1lQ2xhc3MgPSBGSVhGSVg7CisgICAgICBicmVhazsKKyAgICBjYXNlIFZBUlZBUjoKKyAgICAgIGlmICh0cmFuRmxhZykgeworICAgICAgICAqZnJhbWVDbGFzcyA9IFZBUlZBUjsKKyAgICAgICAgKnNwcmVhZEZsYWcgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCpzcHJlYWRGbGFnKQorICAgICAgICAgICpmcmFtZUNsYXNzID0gVkFSVkFSOworICAgICAgICBlbHNlCisgICAgICAgICAgKmZyYW1lQ2xhc3MgPSBWQVJGSVg7CisgICAgICB9CisgICAgICBicmVhazsKICAgfTsKIAogICAqZnJhbWVDbGFzc09sZCA9ICpmcmFtZUNsYXNzOwogfQogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBzcGVjaWFsQ2FzZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE0NTksMjggKzEzODIsMjQgQEAKICBSZXR1cm46ICAgICAgbm9uZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLXNwZWNpYWxDYXNlIChJTlQgKnNwcmVhZEZsYWcsIElOVCBhbGxvd1NwcmVhZCwgSU5UICp2X2JvcmQsCi0gICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgKnZfZnJlcSwgSU5UICpsZW5ndGhfdl9mcmVxLCBJTlQgKnBhcnRzLAotICAgICAgICAgICAgIElOVCBkKQoteworc3RhdGljIHZvaWQgc3BlY2lhbENhc2UoSU5UICpzcHJlYWRGbGFnLCBJTlQgYWxsb3dTcHJlYWQsIElOVCAqdl9ib3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgKnZfZnJlcSwgSU5UICpsZW5ndGhfdl9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwYXJ0cywgSU5UIGQpIHsKICAgSU5UIEw7CiAKICAgTCA9ICpsZW5ndGhfdl9ib3JkOwogCi0gIGlmIChhbGxvd1NwcmVhZCkgeyAgICAgICAgICAgIC8qIGFkZCBvbmUgInN0ZXAgOCIgKi8KKyAgaWYgKGFsbG93U3ByZWFkKSB7IC8qIGFkZCBvbmUgInN0ZXAgOCIgKi8KICAgICAqc3ByZWFkRmxhZyA9IDE7Ci0gICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZFtMIC0gMV0gKyA4KTsKLSAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgMSk7CisgICAgRkRLc2JyRW5jX0FkZFJpZ2h0KHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkW0wgLSAxXSArIDgpOworICAgIEZES3NickVuY19BZGRSaWdodCh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIDEpOwogICAgICgqcGFydHMpKys7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaWYgKGQgPT0gMSkgeyAgICAgICAgICAgICAgIC8qICBzdHJldGNoIG9uZSBzbG90ICovCisgIH0gZWxzZSB7CisgICAgaWYgKGQgPT0gMSkgeyAvKiAgc3RyZXRjaCBvbmUgc2xvdCAqLwogICAgICAgKmxlbmd0aF92X2JvcmQgPSBMIC0gMTsKICAgICAgICpsZW5ndGhfdl9mcmVxID0gTCAtIDE7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgaWYgKCh2X2JvcmRbTCAtIDFdIC0gdl9ib3JkW0wgLSAyXSkgPiAyKSB7ICAgICAgICAvKiBjb21wcmVzcyBvbmUgcXVhbnQgc3RlcCAqLworICAgIH0gZWxzZSB7CisgICAgICBpZiAoKHZfYm9yZFtMIC0gMV0gLSB2X2JvcmRbTCAtIDJdKSA+IDIpIHsgLyogY29tcHJlc3Mgb25lIHF1YW50IHN0ZXAgKi8KICAgICAgICAgdl9ib3JkW0wgLSAxXSA9IHZfYm9yZFtMIC0gMV0gLSAyOwogICAgICAgICB2X2ZyZXFbKmxlbmd0aF92X2ZyZXEgLSAxXSA9IDA7IC8qIHVzZSBsb3cgcmVzIGZvciBzaG9ydCBzZWdtZW50ICovCiAgICAgICB9CkBAIC0xNDg4LDggKzE0MDcsNiBAQAogICB9CiB9CiAKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEZ1bmN0aW9ubmFtZTogIGNhbGNDbW9uQm9yZGVyCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTUwNSwxNCArMTQyMiwxMyBAQAogIFJldHVybjogICAgICBub25lCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotY2FsY0Ntb25Cb3JkZXIgKElOVCAqaV9jbW9uLCBJTlQgKmlfdHJhbiwgSU5UICp2X2JvcmQsIElOVCAqbGVuZ3RoX3ZfYm9yZCwKLSAgICAgICAgICAgICAgICBJTlQgdHJhbiwgSU5UIGJ1ZmZlckZyYW1lU3RhcnQsIElOVCBudW1iZXJUaW1lU2xvdHMpCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZIIDAwLTA2LTI2ICovCitzdGF0aWMgdm9pZCBjYWxjQ21vbkJvcmRlcihJTlQgKmlfY21vbiwgSU5UICppX3RyYW4sIElOVCAqdl9ib3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgdHJhbiwgSU5UIGJ1ZmZlckZyYW1lU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtYmVyVGltZVNsb3RzKSB7IC8qIEZIIDAwLTA2LTI2ICovCiAgIElOVCBpOwogCiAgIGZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoX3ZfYm9yZDsgaSsrKQotICAgIGlmICh2X2JvcmRbaV0gPj0gYnVmZmVyRnJhbWVTdGFydCArIG51bWJlclRpbWVTbG90cykgeyAgICAgIC8qIEZIIDAwLTA2LTI2ICovCisgICAgaWYgKHZfYm9yZFtpXSA+PSBidWZmZXJGcmFtZVN0YXJ0ICsgbnVtYmVyVGltZVNsb3RzKSB7IC8qIEZIIDAwLTA2LTI2ICovCiAgICAgICAqaV9jbW9uID0gaTsKICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTE1MjIsOCArMTQzOCw3IEBACiAgICAgaWYgKHZfYm9yZFtpXSA+PSB0cmFuKSB7CiAgICAgICAqaV90cmFuID0gaTsKICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBlbHNlCisgICAgfSBlbHNlCiAgICAgICAqaV90cmFuID0gRU1QVFk7CiB9CiAKQEAgLTE1NDksMTMgKzE0NjQsMTIgQEAKICBSZXR1cm46ICAgICAgbm9uZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWtlZXBGb3JGb2xsb3dVcCAoSU5UICp2X2JvcmRGb2xsb3csIElOVCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdywKLSAgICAgICAgICAgICAgICAgSU5UICp2X2ZyZXFGb2xsb3csIElOVCAqbGVuZ3RoX3ZfZnJlcUZvbGxvdywKLSAgICAgICAgICAgICAgICAgSU5UICppX3RyYW5Gb2xsb3csIElOVCAqaV9maWxsRm9sbG93LCBJTlQgKnZfYm9yZCwKLSAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgKnZfZnJlcSwgSU5UIGlfY21vbiwgSU5UIGlfdHJhbiwKLSAgICAgICAgICAgICAgICAgSU5UIHBhcnRzLCBJTlQgbnVtYmVyVGltZVNsb3RzKQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGSCAwMC0wNi0yNiAqLworc3RhdGljIHZvaWQga2VlcEZvckZvbGxvd1VwKElOVCAqdl9ib3JkRm9sbG93LCBJTlQgKmxlbmd0aF92X2JvcmRGb2xsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICp2X2ZyZXFGb2xsb3csIElOVCAqbGVuZ3RoX3ZfZnJlcUZvbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmlfdHJhbkZvbGxvdywgSU5UICppX2ZpbGxGb2xsb3csIElOVCAqdl9ib3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsIElOVCBpX2Ntb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGlfdHJhbiwgSU5UIHBhcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1iZXJUaW1lU2xvdHMpIHsgLyogRkggMDAtMDYtMjYgKi8KICAgSU5UIEwsIGksIGo7CiAKICAgTCA9ICpsZW5ndGhfdl9ib3JkOwpAQCAtMTU2NCw3ICsxNDc4LDcgQEAKICAgKCpsZW5ndGhfdl9mcmVxRm9sbG93KSA9IDA7CiAKICAgZm9yIChqID0gMCwgaSA9IGlfY21vbjsgaSA8IEw7IGkrKywgaisrKSB7Ci0gICAgdl9ib3JkRm9sbG93W2pdID0gdl9ib3JkW2ldIC0gbnVtYmVyVGltZVNsb3RzOyAgICAgIC8qIEZIIDAwLTA2LTI2ICovCisgICAgdl9ib3JkRm9sbG93W2pdID0gdl9ib3JkW2ldIC0gbnVtYmVyVGltZVNsb3RzOyAvKiBGSCAwMC0wNi0yNiAqLwogICAgIHZfZnJlcUZvbGxvd1tqXSA9IHZfZnJlcVtpXTsKICAgICAoKmxlbmd0aF92X2JvcmRGb2xsb3cpKys7CiAgICAgKCpsZW5ndGhfdl9mcmVxRm9sbG93KSsrOwpAQCAtMTU3NCw3ICsxNDg4LDYgQEAKICAgZWxzZQogICAgICppX3RyYW5Gb2xsb3cgPSBFTVBUWTsKICAgKmlfZmlsbEZvbGxvdyA9IEwgLSAocGFydHMgLSAxKSAtIGlfY21vbjsKLQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTU5NywxNCArMTUxMCwxMCBAQAogIFJldHVybjogICAgICBub25lCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotY2FsY0N0cmxTaWduYWwgKEhBTkRMRV9TQlJfR1JJRCBoU2JyR3JpZCwKLSAgICAgICAgICAgICAgICBGUkFNRV9DTEFTUyBmcmFtZUNsYXNzLCBJTlQgKnZfYm9yZCwgSU5UIGxlbmd0aF92X2JvcmQsIElOVCAqdl9mcmVxLAotICAgICAgICAgICAgICAgIElOVCBsZW5ndGhfdl9mcmVxLCBJTlQgaV9jbW9uLCBJTlQgaV90cmFuLCBJTlQgc3ByZWFkRmxhZywKLSAgICAgICAgICAgICAgICBJTlQgbkwpCi17Ci0KLQorc3RhdGljIHZvaWQgY2FsY0N0cmxTaWduYWwoSEFORExFX1NCUl9HUklEIGhTYnJHcmlkLCBGUkFNRV9DTEFTUyBmcmFtZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICp2X2JvcmQsIElOVCBsZW5ndGhfdl9ib3JkLCBJTlQgKnZfZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBsZW5ndGhfdl9mcmVxLCBJTlQgaV9jbW9uLCBJTlQgaV90cmFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNwcmVhZEZsYWcsIElOVCBuTCkgewogICBJTlQgaSwgciwgYSwgbiwgcCwgYiwgYUwsIGFSLCBudG90LCBubWF4LCBuUjsKIAogICBJTlQgKnZfZiA9IGhTYnJHcmlkLT52X2Y7CkBAIC0xNjE4LDE2NCArMTUyNywxNTIgQEAKICAgSU5UIGxlbmd0aF92X3JMID0gMDsKIAogICBzd2l0Y2ggKGZyYW1lQ2xhc3MpIHsKLSAgY2FzZSBGSVhWQVI6Ci0gICAgLyogYWJzb2x1dGUgYm9yZGVyOiAqLworICAgIGNhc2UgRklYVkFSOgorICAgICAgLyogYWJzb2x1dGUgYm9yZGVyOiAqLwogCi0gICAgYSA9IHZfYm9yZFtpX2Ntb25dOwotCi0gICAgLyogcmVsYXRpdmUgYm9yZGVyczogKi8KLSAgICBsZW5ndGhfdl9yID0gMDsKLSAgICBpID0gaV9jbW9uOwotCi0gICAgd2hpbGUgKGkgPj0gMSkgewotICAgICAgciA9IHZfYm9yZFtpXSAtIHZfYm9yZFtpIC0gMV07Ci0gICAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfciwgJmxlbmd0aF92X3IsIHIpOwotICAgICAgaS0tOwotICAgIH0KLQotCi0gICAgLyogIG51bWJlciBvZiByZWxhdGl2ZSBib3JkZXJzOiAqLwotICAgIG4gPSBsZW5ndGhfdl9yOwotCi0KLSAgICAvKiBmcmVxIHJlczogKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgaV9jbW9uOyBpKyspCi0gICAgICB2X2ZbaV0gPSB2X2ZyZXFbaV9jbW9uIC0gMSAtIGldOwotICAgIHZfZltpX2Ntb25dID0gMTsKLQotICAgIC8qIHBvaW50ZXI6ICovCi0gICAgcCA9IChpX2Ntb24gPj0gaV90cmFuICYmIGlfdHJhbiAhPSBFTVBUWSkgPyAoaV9jbW9uIC0gaV90cmFuICsgMSkgOiAoMCkgOwotCi0gICAgaFNickdyaWQtPmZyYW1lQ2xhc3MgPSBmcmFtZUNsYXNzOwotICAgIGhTYnJHcmlkLT5ic19hYnNfYm9yZCA9IGE7Ci0gICAgaFNickdyaWQtPm4gPSBuOwotICAgIGhTYnJHcmlkLT5wID0gcDsKLQotICAgIGJyZWFrOwotICBjYXNlIFZBUkZJWDoKLSAgICAvKiBhYnNvbHV0ZSBib3JkZXI6ICovCi0gICAgYSA9IHZfYm9yZFswXTsKLQotICAgIC8qIHJlbGF0aXZlIGJvcmRlcnM6ICovCi0gICAgbGVuZ3RoX3ZfciA9IDA7Ci0KLSAgICBmb3IgKGkgPSAxOyBpIDwgbGVuZ3RoX3ZfYm9yZDsgaSsrKSB7Ci0gICAgICByID0gdl9ib3JkW2ldIC0gdl9ib3JkW2kgLSAxXTsKLSAgICAgIEZES3NickVuY19BZGRSaWdodCAodl9yLCAmbGVuZ3RoX3Zfciwgcik7Ci0gICAgfQotCi0gICAgLyogbnVtYmVyIG9mIHJlbGF0aXZlIGJvcmRlcnM6ICovCi0gICAgbiA9IGxlbmd0aF92X3I7Ci0KLSAgICAvKiBmcmVxIHJlczogKi8KLSAgICBGREttZW1jcHkgKHZfZiwgdl9mcmVxLCBsZW5ndGhfdl9mcmVxICogc2l6ZW9mIChJTlQpKTsKLQotCi0gICAgLyogcG9pbnRlcjogKi8KLSAgICBwID0gKGlfdHJhbiA+PSAwICYmIGlfdHJhbiAhPSBFTVBUWSkgPyAoaV90cmFuICsgMSkgOiAoMCkgOwotCi0gICAgaFNickdyaWQtPmZyYW1lQ2xhc3MgPSBmcmFtZUNsYXNzOwotICAgIGhTYnJHcmlkLT5ic19hYnNfYm9yZCA9IGE7Ci0gICAgaFNickdyaWQtPm4gPSBuOwotICAgIGhTYnJHcmlkLT5wID0gcDsKLQotICAgIGJyZWFrOwotICBjYXNlIFZBUlZBUjoKLSAgICBpZiAoc3ByZWFkRmxhZykgewotICAgICAgLyogYWJzb2x1dGUgYm9yZGVyczogKi8KLSAgICAgIGIgPSBsZW5ndGhfdl9ib3JkOwotCi0gICAgICBhTCA9IHZfYm9yZFswXTsKLSAgICAgIGFSID0gdl9ib3JkW2IgLSAxXTsKLQotCi0gICAgICAvKiBudW1iZXIgb2YgcmVsYXRpdmUgYm9yZGVyczogICAgKi8KLSAgICAgIG50b3QgPSBiIC0gMjsKLQotICAgICAgbm1heCA9IDI7ICAgICAgICAgICAgICAgICAvKiBuOiB7MCwxLDJ9ICovCi0gICAgICBpZiAobnRvdCA+IG5tYXgpIHsKLSAgICAgICAgbkwgPSBubWF4OwotICAgICAgICBuUiA9IG50b3QgLSBubWF4OwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIG5MID0gbnRvdDsKLSAgICAgICAgblIgPSAwOwotICAgICAgfQorICAgICAgYSA9IHZfYm9yZFtpX2Ntb25dOwogCiAgICAgICAvKiByZWxhdGl2ZSBib3JkZXJzOiAqLwotICAgICAgbGVuZ3RoX3ZfckwgPSAwOwotICAgICAgZm9yIChpID0gMTsgaSA8PSBuTDsgaSsrKSB7Ci0gICAgICAgIHIgPSB2X2JvcmRbaV0gLSB2X2JvcmRbaSAtIDFdOwotICAgICAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfckwsICZsZW5ndGhfdl9yTCwgcik7Ci0gICAgICB9CisgICAgICBsZW5ndGhfdl9yID0gMDsKKyAgICAgIGkgPSBpX2Ntb247CiAKLSAgICAgIGxlbmd0aF92X3JSID0gMDsKLSAgICAgIGkgPSBiIC0gMTsKLSAgICAgIHdoaWxlIChpID49IGIgLSBuUikgeworICAgICAgd2hpbGUgKGkgPj0gMSkgewogICAgICAgICByID0gdl9ib3JkW2ldIC0gdl9ib3JkW2kgLSAxXTsKLSAgICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X3JSLCAmbGVuZ3RoX3ZfclIsIHIpOworICAgICAgICBGREtzYnJFbmNfQWRkUmlnaHQodl9yLCAmbGVuZ3RoX3Zfciwgcik7CiAgICAgICAgIGktLTsKICAgICAgIH0KIAotICAgICAgLyogcG9pbnRlciAob25seSBvbmUgZHVlIHRvIGNvbnN0cmFpbnQgaW4gZnJhbWUgaW5mbyk6ICovCi0gICAgICBwID0gKGlfdHJhbiA+IDAgJiYgaV90cmFuICE9IEVNUFRZKSA/IChiIC0gaV90cmFuKSA6ICgwKSA7CisgICAgICAvKiAgbnVtYmVyIG9mIHJlbGF0aXZlIGJvcmRlcnM6ICovCisgICAgICBuID0gbGVuZ3RoX3ZfcjsKIAogICAgICAgLyogZnJlcSByZXM6ICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgaV9jbW9uOyBpKyspIHZfZltpXSA9IHZfZnJlcVtpX2Ntb24gLSAxIC0gaV07CisgICAgICB2X2ZbaV9jbW9uXSA9IDE7CiAKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBiIC0gMTsgaSsrKQotICAgICAgICB2X2ZMUltpXSA9IHZfZnJlcVtpXTsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgICAvKiBwb2ludGVyOiAqLworICAgICAgcCA9IChpX2Ntb24gPj0gaV90cmFuICYmIGlfdHJhbiAhPSBFTVBUWSkgPyAoaV9jbW9uIC0gaV90cmFuICsgMSkgOiAoMCk7CiAKLSAgICAgIGxlbmd0aF92X2JvcmQgPSBpX2Ntb24gKyAxOwotICAgICAgbGVuZ3RoX3ZfZnJlcSA9IGlfY21vbiArIDE7CisgICAgICBoU2JyR3JpZC0+ZnJhbWVDbGFzcyA9IGZyYW1lQ2xhc3M7CisgICAgICBoU2JyR3JpZC0+YnNfYWJzX2JvcmQgPSBhOworICAgICAgaFNickdyaWQtPm4gPSBuOworICAgICAgaFNickdyaWQtPnAgPSBwOwogCi0KLSAgICAgIC8qIGFic29sdXRlIGJvcmRlcnM6ICovCi0gICAgICBiID0gbGVuZ3RoX3ZfYm9yZDsKLQotICAgICAgYUwgPSB2X2JvcmRbMF07Ci0gICAgICBhUiA9IHZfYm9yZFtiIC0gMV07Ci0KLSAgICAgIC8qIG51bWJlciBvZiByZWxhdGl2ZSBib3JkZXJzOiAgICovCi0gICAgICBudG90ID0gYiAtIDI7Ci0gICAgICBuUiA9IG50b3QgLSBuTDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVkFSRklYOgorICAgICAgLyogYWJzb2x1dGUgYm9yZGVyOiAqLworICAgICAgYSA9IHZfYm9yZFswXTsKIAogICAgICAgLyogcmVsYXRpdmUgYm9yZGVyczogKi8KLSAgICAgIGxlbmd0aF92X3JMID0gMDsKLSAgICAgIGZvciAoaSA9IDE7IGkgPD0gbkw7IGkrKykgeworICAgICAgbGVuZ3RoX3ZfciA9IDA7CisKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBsZW5ndGhfdl9ib3JkOyBpKyspIHsKICAgICAgICAgciA9IHZfYm9yZFtpXSAtIHZfYm9yZFtpIC0gMV07Ci0gICAgICAgIEZES3NickVuY19BZGRSaWdodCAodl9yTCwgJmxlbmd0aF92X3JMLCByKTsKKyAgICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0KHZfciwgJmxlbmd0aF92X3IsIHIpOwogICAgICAgfQogCi0gICAgICBsZW5ndGhfdl9yUiA9IDA7Ci0gICAgICBpID0gYiAtIDE7Ci0gICAgICB3aGlsZSAoaSA+PSBiIC0gblIpIHsKLSAgICAgICAgciA9IHZfYm9yZFtpXSAtIHZfYm9yZFtpIC0gMV07Ci0gICAgICAgIEZES3NickVuY19BZGRSaWdodCAodl9yUiwgJmxlbmd0aF92X3JSLCByKTsKLSAgICAgICAgaS0tOwotICAgICAgfQotCi0gICAgICAvKiBwb2ludGVyIChvbmx5IG9uZSBkdWUgdG8gY29uc3RyYWludCBpbiBmcmFtZSBpbmZvKTogKi8KLSAgICAgIHAgPSAoaV9jbW9uID49IGlfdHJhbiAmJiBpX3RyYW4gIT0gRU1QVFkpID8gKGlfY21vbiAtIGlfdHJhbiArIDEpIDogKDApIDsKKyAgICAgIC8qIG51bWJlciBvZiByZWxhdGl2ZSBib3JkZXJzOiAqLworICAgICAgbiA9IGxlbmd0aF92X3I7CiAKICAgICAgIC8qIGZyZXEgcmVzOiAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IGIgLSAxOyBpKyspCi0gICAgICAgIHZfZkxSW2ldID0gdl9mcmVxW2ldOwotICAgIH0KKyAgICAgIEZES21lbWNweSh2X2YsIHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSAqIHNpemVvZihJTlQpKTsKIAotICAgIGhTYnJHcmlkLT5mcmFtZUNsYXNzID0gZnJhbWVDbGFzczsKLSAgICBoU2JyR3JpZC0+YnNfYWJzX2JvcmRfMCA9IGFMOwotICAgIGhTYnJHcmlkLT5ic19hYnNfYm9yZF8xID0gYVI7Ci0gICAgaFNickdyaWQtPmJzX251bV9yZWxfMCA9IG5MOwotICAgIGhTYnJHcmlkLT5ic19udW1fcmVsXzEgPSBuUjsKLSAgICBoU2JyR3JpZC0+cCA9IHA7CisgICAgICAvKiBwb2ludGVyOiAqLworICAgICAgcCA9IChpX3RyYW4gPj0gMCAmJiBpX3RyYW4gIT0gRU1QVFkpID8gKGlfdHJhbiArIDEpIDogKDApOwogCi0gICAgYnJlYWs7CisgICAgICBoU2JyR3JpZC0+ZnJhbWVDbGFzcyA9IGZyYW1lQ2xhc3M7CisgICAgICBoU2JyR3JpZC0+YnNfYWJzX2JvcmQgPSBhOworICAgICAgaFNickdyaWQtPm4gPSBuOworICAgICAgaFNickdyaWQtPnAgPSBwOwogCi0gIGRlZmF1bHQ6Ci0gICAgLyogZG8gbm90aGluZyAqLwotICAgIGJyZWFrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWQVJWQVI6CisgICAgICBpZiAoc3ByZWFkRmxhZykgeworICAgICAgICAvKiBhYnNvbHV0ZSBib3JkZXJzOiAqLworICAgICAgICBiID0gbGVuZ3RoX3ZfYm9yZDsKKworICAgICAgICBhTCA9IHZfYm9yZFswXTsKKyAgICAgICAgYVIgPSB2X2JvcmRbYiAtIDFdOworCisgICAgICAgIC8qIG51bWJlciBvZiByZWxhdGl2ZSBib3JkZXJzOiAgICAqLworICAgICAgICBudG90ID0gYiAtIDI7CisKKyAgICAgICAgbm1heCA9IDI7IC8qIG46IHswLDEsMn0gKi8KKyAgICAgICAgaWYgKG50b3QgPiBubWF4KSB7CisgICAgICAgICAgbkwgPSBubWF4OworICAgICAgICAgIG5SID0gbnRvdCAtIG5tYXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbkwgPSBudG90OworICAgICAgICAgIG5SID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHJlbGF0aXZlIGJvcmRlcnM6ICovCisgICAgICAgIGxlbmd0aF92X3JMID0gMDsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8PSBuTDsgaSsrKSB7CisgICAgICAgICAgciA9IHZfYm9yZFtpXSAtIHZfYm9yZFtpIC0gMV07CisgICAgICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0KHZfckwsICZsZW5ndGhfdl9yTCwgcik7CisgICAgICAgIH0KKworICAgICAgICBsZW5ndGhfdl9yUiA9IDA7CisgICAgICAgIGkgPSBiIC0gMTsKKyAgICAgICAgd2hpbGUgKGkgPj0gYiAtIG5SKSB7CisgICAgICAgICAgciA9IHZfYm9yZFtpXSAtIHZfYm9yZFtpIC0gMV07CisgICAgICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0KHZfclIsICZsZW5ndGhfdl9yUiwgcik7CisgICAgICAgICAgaS0tOworICAgICAgICB9CisKKyAgICAgICAgLyogcG9pbnRlciAob25seSBvbmUgZHVlIHRvIGNvbnN0cmFpbnQgaW4gZnJhbWUgaW5mbyk6ICovCisgICAgICAgIHAgPSAoaV90cmFuID4gMCAmJiBpX3RyYW4gIT0gRU1QVFkpID8gKGIgLSBpX3RyYW4pIDogKDApOworCisgICAgICAgIC8qIGZyZXEgcmVzOiAqLworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiIC0gMTsgaSsrKSB2X2ZMUltpXSA9IHZfZnJlcVtpXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxlbmd0aF92X2JvcmQgPSBpX2Ntb24gKyAxOworCisgICAgICAgIC8qIGFic29sdXRlIGJvcmRlcnM6ICovCisgICAgICAgIGIgPSBsZW5ndGhfdl9ib3JkOworCisgICAgICAgIGFMID0gdl9ib3JkWzBdOworICAgICAgICBhUiA9IHZfYm9yZFtiIC0gMV07CisKKyAgICAgICAgLyogbnVtYmVyIG9mIHJlbGF0aXZlIGJvcmRlcnM6ICAgKi8KKyAgICAgICAgbnRvdCA9IGIgLSAyOworICAgICAgICBuUiA9IG50b3QgLSBuTDsKKworICAgICAgICAvKiByZWxhdGl2ZSBib3JkZXJzOiAqLworICAgICAgICBsZW5ndGhfdl9yTCA9IDA7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbkw7IGkrKykgeworICAgICAgICAgIHIgPSB2X2JvcmRbaV0gLSB2X2JvcmRbaSAtIDFdOworICAgICAgICAgIEZES3NickVuY19BZGRSaWdodCh2X3JMLCAmbGVuZ3RoX3ZfckwsIHIpOworICAgICAgICB9CisKKyAgICAgICAgbGVuZ3RoX3ZfclIgPSAwOworICAgICAgICBpID0gYiAtIDE7CisgICAgICAgIHdoaWxlIChpID49IGIgLSBuUikgeworICAgICAgICAgIHIgPSB2X2JvcmRbaV0gLSB2X2JvcmRbaSAtIDFdOworICAgICAgICAgIEZES3NickVuY19BZGRSaWdodCh2X3JSLCAmbGVuZ3RoX3ZfclIsIHIpOworICAgICAgICAgIGktLTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHBvaW50ZXIgKG9ubHkgb25lIGR1ZSB0byBjb25zdHJhaW50IGluIGZyYW1lIGluZm8pOiAqLworICAgICAgICBwID0gKGlfY21vbiA+PSBpX3RyYW4gJiYgaV90cmFuICE9IEVNUFRZKSA/IChpX2Ntb24gLSBpX3RyYW4gKyAxKSA6ICgwKTsKKworICAgICAgICAvKiBmcmVxIHJlczogKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGIgLSAxOyBpKyspIHZfZkxSW2ldID0gdl9mcmVxW2ldOworICAgICAgfQorCisgICAgICBoU2JyR3JpZC0+ZnJhbWVDbGFzcyA9IGZyYW1lQ2xhc3M7CisgICAgICBoU2JyR3JpZC0+YnNfYWJzX2JvcmRfMCA9IGFMOworICAgICAgaFNickdyaWQtPmJzX2Fic19ib3JkXzEgPSBhUjsKKyAgICAgIGhTYnJHcmlkLT5ic19udW1fcmVsXzAgPSBuTDsKKyAgICAgIGhTYnJHcmlkLT5ic19udW1fcmVsXzEgPSBuUjsKKyAgICAgIGhTYnJHcmlkLT5wID0gcDsKKworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgLyogZG8gbm90aGluZyAqLworICAgICAgYnJlYWs7CiAgIH0KIH0KIApAQCAtMTc5NSw3OSArMTY5Miw3NyBAQAogIFdyaXR0ZW46ICAgICBBbmRyZWFzIFNjaG5laWRlcgogIFJldmlzZWQ6CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWNyZWF0ZURlZkZyYW1lSW5mbyhIQU5ETEVfU0JSX0ZSQU1FX0lORk8gaFNickZyYW1lSW5mbywgSU5UIG5FbnYsIElOVCBuVGltZVNsb3RzKQoteworc3RhdGljIHZvaWQgY3JlYXRlRGVmRnJhbWVJbmZvKEhBTkRMRV9TQlJfRlJBTUVfSU5GTyBoU2JyRnJhbWVJbmZvLCBJTlQgbkVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblRpbWVTbG90cykgewogICBzd2l0Y2ggKG5FbnYpIHsKLSAgY2FzZSAxOgotICAgIHN3aXRjaCAoblRpbWVTbG90cykgewotICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDoKLSAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzFfMTkyMCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOworICAgIGNhc2UgMToKKyAgICAgIHN3aXRjaCAoblRpbWVTbG90cykgeworICAgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzE5MjA6CisgICAgICAgICAgRkRLbWVtY3B5KGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8xXzE5MjAsIHNpemVvZihTQlJfRlJBTUVfSU5GTykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIwNDg6CisgICAgICAgICAgRkRLbWVtY3B5KGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8xXzIwNDgsIHNpemVvZihTQlJfRlJBTUVfSU5GTykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzExNTI6CisgICAgICAgICAgRkRLbWVtY3B5KGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8xXzExNTIsIHNpemVvZihTQlJfRlJBTUVfSU5GTykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIzMDQ6CisgICAgICAgICAgRkRLbWVtY3B5KGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8xXzIzMDQsIHNpemVvZihTQlJfRlJBTUVfSU5GTykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzUxMkxEOgorICAgICAgICAgIEZES21lbWNweShoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMV81MTJMRCwgc2l6ZW9mKFNCUl9GUkFNRV9JTkZPKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgIH0KICAgICAgIGJyZWFrOwotICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjA0ODoKLSAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzFfMjA0OCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOworICAgIGNhc2UgMjoKKyAgICAgIHN3aXRjaCAoblRpbWVTbG90cykgeworICAgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzE5MjA6CisgICAgICAgICAgRkRLbWVtY3B5KGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8yXzE5MjAsIHNpemVvZihTQlJfRlJBTUVfSU5GTykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIwNDg6CisgICAgICAgICAgRkRLbWVtY3B5KGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8yXzIwNDgsIHNpemVvZihTQlJfRlJBTUVfSU5GTykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzExNTI6CisgICAgICAgICAgRkRLbWVtY3B5KGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8yXzExNTIsIHNpemVvZihTQlJfRlJBTUVfSU5GTykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIzMDQ6CisgICAgICAgICAgRkRLbWVtY3B5KGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8yXzIzMDQsIHNpemVvZihTQlJfRlJBTUVfSU5GTykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzUxMkxEOgorICAgICAgICAgIEZES21lbWNweShoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMl81MTJMRCwgc2l6ZW9mKFNCUl9GUkFNRV9JTkZPKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgIH0KICAgICAgIGJyZWFrOwotICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTE1MjoKLSAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzFfMTE1Miwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMzA0OgotICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMV8yMzA0LCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzUxMkxEOgotICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMV81MTJMRCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOworICAgIGNhc2UgNDoKKyAgICAgIHN3aXRjaCAoblRpbWVTbG90cykgeworICAgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzE5MjA6CisgICAgICAgICAgRkRLbWVtY3B5KGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm80XzE5MjAsIHNpemVvZihTQlJfRlJBTUVfSU5GTykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIwNDg6CisgICAgICAgICAgRkRLbWVtY3B5KGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm80XzIwNDgsIHNpemVvZihTQlJfRlJBTUVfSU5GTykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzExNTI6CisgICAgICAgICAgRkRLbWVtY3B5KGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm80XzExNTIsIHNpemVvZihTQlJfRlJBTUVfSU5GTykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIzMDQ6CisgICAgICAgICAgRkRLbWVtY3B5KGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm80XzIzMDQsIHNpemVvZihTQlJfRlJBTUVfSU5GTykpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzUxMkxEOgorICAgICAgICAgIEZES21lbWNweShoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvNF81MTJMRCwgc2l6ZW9mKFNCUl9GUkFNRV9JTkZPKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgRkRLX0FTU0VSVCgwKTsKKyAgICAgIH0KICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICBGREtfQVNTRVJUKDApOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSAyOgotICAgIHN3aXRjaCAoblRpbWVTbG90cykgewotICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDoKLSAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzJfMTkyMCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OgotICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMl8yMDQ4LCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzExNTI6Ci0gICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8yXzExNTIsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNDoKLSAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzJfMjMwNCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU181MTJMRDoKLSAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzJfNTEyTEQsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBGREtfQVNTRVJUKDApOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSA0OgotICAgIHN3aXRjaCAoblRpbWVTbG90cykgewotICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDoKLSAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzRfMTkyMCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OgotICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvNF8yMDQ4LCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzExNTI6Ci0gICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm80XzExNTIsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNDoKLSAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzRfMjMwNCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU181MTJMRDoKLSAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzRfNTEyTEQsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBGREtfQVNTRVJUKDApOwotICAgIH0KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBGREtfQVNTRVJUKDApOwogICB9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBjdHJsU2lnbmFsMkZyYW1lSW5mbwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE4ODYsMTcxICsxNzgxLDE3NyBAQAogIFJldHVybjogICAgICB2b2lkOyBoU2JyRnJhbWVJbmZvIGNvbnRhaW5zIHRoZSB1cGRhdGVkIEZSQU1FX0lORk8gc3RydWN0CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotY3RybFNpZ25hbDJGcmFtZUluZm8gKAotICAgICAgICBIQU5ETEVfU0JSX0dSSUQgICAgICAgIGhTYnJHcmlkLCAgICAgICAvKiBpbnB1dCA6IHRoZSBncmlkIGhhbmRsZSAgICAgICAqLwotICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0lORk8gIGhTYnJGcmFtZUluZm8sICAvKiBvdXRwdXQ6IHRoZSBmcmFtZSBpbmZvIGhhbmRsZSAqLwotICAgICAgICBGUkVRX1JFUyAgICAgICAgICAgICAgKmZyZXFfcmVzX2ZpeGZpeCAvKiBpbi9vdXQ6IGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBGSVhGSVggZnJhbWVzICovCi0gICAgICAgICkKLXsKK3N0YXRpYyB2b2lkIGN0cmxTaWduYWwyRnJhbWVJbmZvKAorICAgIEhBTkRMRV9TQlJfR1JJRCBoU2JyR3JpZCwgICAgICAgICAgICAvKiBpbnB1dCA6IHRoZSBncmlkIGhhbmRsZSAgICAgICAqLworICAgIEhBTkRMRV9TQlJfRlJBTUVfSU5GTyBoU2JyRnJhbWVJbmZvLCAvKiBvdXRwdXQ6IHRoZSBmcmFtZSBpbmZvIGhhbmRsZSAqLworICAgIEZSRVFfUkVTCisgICAgICAgICpmcmVxX3Jlc19maXhmaXggLyogaW4vb3V0OiBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3IgRklYRklYIGZyYW1lcyAqLworKSB7CiAgIElOVCBmcmFtZVNwbGl0ID0gMDsKICAgSU5UIG5FbnYgPSAwLCBib3JkZXIgPSAwLCBpLCBrLCBwIC8qPyovOwogICBJTlQgKnZfciA9IGhTYnJHcmlkLT5ic19yZWxfYm9yZDsKICAgSU5UICp2X2YgPSBoU2JyR3JpZC0+dl9mOwogCiAgIEZSQU1FX0NMQVNTIGZyYW1lQ2xhc3MgPSBoU2JyR3JpZC0+ZnJhbWVDbGFzczsKLSAgSU5UIGJ1ZmZlckZyYW1lU3RhcnQgICA9IGhTYnJHcmlkLT5idWZmZXJGcmFtZVN0YXJ0OwotICBJTlQgbnVtYmVyVGltZVNsb3RzICAgID0gaFNickdyaWQtPm51bWJlclRpbWVTbG90czsKKyAgSU5UIGJ1ZmZlckZyYW1lU3RhcnQgPSBoU2JyR3JpZC0+YnVmZmVyRnJhbWVTdGFydDsKKyAgSU5UIG51bWJlclRpbWVTbG90cyA9IGhTYnJHcmlkLT5udW1iZXJUaW1lU2xvdHM7CiAKICAgc3dpdGNoIChmcmFtZUNsYXNzKSB7Ci0gIGNhc2UgRklYRklYOgotICAgIGNyZWF0ZURlZkZyYW1lSW5mbyhoU2JyRnJhbWVJbmZvLCBoU2JyR3JpZC0+YnNfbnVtX2VudiwgbnVtYmVyVGltZVNsb3RzKTsKKyAgICBjYXNlIEZJWEZJWDoKKyAgICAgIGNyZWF0ZURlZkZyYW1lSW5mbyhoU2JyRnJhbWVJbmZvLCBoU2JyR3JpZC0+YnNfbnVtX2VudiwgbnVtYmVyVGltZVNsb3RzKTsKIAotICAgIGZyYW1lU3BsaXQgPSAoaFNickZyYW1lSW5mby0+bkVudmVsb3BlcyA+IDEpOwotICAgIGZvciAoaSA9IDA7IGkgPCBoU2JyRnJhbWVJbmZvLT5uRW52ZWxvcGVzOyBpKyspIHsKLSAgICAgIGhTYnJHcmlkLT52X2ZbaV0gPSBoU2JyRnJhbWVJbmZvLT5mcmVxUmVzW2ldID0gZnJlcV9yZXNfZml4Zml4W2ZyYW1lU3BsaXRdOwotICAgIH0KLSAgICBicmVhazsKKyAgICAgIGZyYW1lU3BsaXQgPSAoaFNickZyYW1lSW5mby0+bkVudmVsb3BlcyA+IDEpOworICAgICAgZm9yIChpID0gMDsgaSA8IGhTYnJGcmFtZUluZm8tPm5FbnZlbG9wZXM7IGkrKykgeworICAgICAgICBoU2JyR3JpZC0+dl9mW2ldID0gaFNickZyYW1lSW5mby0+ZnJlcVJlc1tpXSA9CisgICAgICAgICAgICBmcmVxX3Jlc19maXhmaXhbZnJhbWVTcGxpdF07CisgICAgICB9CisgICAgICBicmVhazsKIAotICBjYXNlIEZJWFZBUjoKLSAgY2FzZSBWQVJGSVg6Ci0gICAgbkVudiA9IGhTYnJHcmlkLT5uICsgMTsgICAgICAvKiByZWFkIG4gW1NCUl9OVU1fQklUUyBiaXRzXSAqLyAvKj8gc25kKi8KLSAgICBGREtfQVNTRVJUKG5FbnYgPD0gTUFYX0VOVkVMT1BFU19GSVhWQVJfVkFSRklYKTsKKyAgICBjYXNlIEZJWFZBUjoKKyAgICBjYXNlIFZBUkZJWDoKKyAgICAgIG5FbnYgPSBoU2JyR3JpZC0+biArIDE7IC8qIHJlYWQgbiBbU0JSX05VTV9CSVRTIGJpdHNdICovIC8qPyBzbmQqLworICAgICAgRkRLX0FTU0VSVChuRW52IDw9IE1BWF9FTlZFTE9QRVNfRklYVkFSX1ZBUkZJWCk7CiAKLSAgICBoU2JyRnJhbWVJbmZvLT5uRW52ZWxvcGVzID0gbkVudjsKKyAgICAgIGhTYnJGcmFtZUluZm8tPm5FbnZlbG9wZXMgPSBuRW52OwogCi0gICAgYm9yZGVyID0gaFNickdyaWQtPmJzX2Fic19ib3JkOyAvKiByZWFkIHRoZSBhYnNvbHV0ZSBib3JkZXIgKi8KKyAgICAgIGJvcmRlciA9IGhTYnJHcmlkLT5ic19hYnNfYm9yZDsgLyogcmVhZCB0aGUgYWJzb2x1dGUgYm9yZGVyICovCiAKLSAgICBpZiAobkVudiA9PSAxKQotICAgICAgaFNickZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMTsKLSAgICBlbHNlCi0gICAgICBoU2JyRnJhbWVJbmZvLT5uTm9pc2VFbnZlbG9wZXMgPSAyOworICAgICAgaWYgKG5FbnYgPT0gMSkKKyAgICAgICAgaFNickZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMTsKKyAgICAgIGVsc2UKKyAgICAgICAgaFNickZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMjsKIAotICAgIGJyZWFrOworICAgICAgYnJlYWs7CiAKLSAgZGVmYXVsdDoKLSAgICAvKiBkbyBub3RoaW5nICovCi0gICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgIGJyZWFrOwogICB9CiAKICAgc3dpdGNoIChmcmFtZUNsYXNzKSB7Ci0gIGNhc2UgRklYVkFSOgotICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbMF0gPSBidWZmZXJGcmFtZVN0YXJ0OyAvKiBzdGFydC1wb3NpdGlvbiBvZiAxc3QgZW52ZWxvcGUgKi8KKyAgICBjYXNlIEZJWFZBUjoKKyAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbMF0gPQorICAgICAgICAgIGJ1ZmZlckZyYW1lU3RhcnQ7IC8qIHN0YXJ0LXBvc2l0aW9uIG9mIDFzdCBlbnZlbG9wZSAqLwogCi0gICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52XSA9IGJvcmRlcjsKKyAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbbkVudl0gPSBib3JkZXI7CiAKLSAgICBmb3IgKGsgPSAwLCBpID0gbkVudiAtIDE7IGsgPCBuRW52IC0gMTsgaysrLCBpLS0pIHsKLSAgICAgIGJvcmRlciAtPSB2X3Jba107Ci0gICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2ldID0gYm9yZGVyOwotICAgIH0KKyAgICAgIGZvciAoayA9IDAsIGkgPSBuRW52IC0gMTsgayA8IG5FbnYgLSAxOyBrKyssIGktLSkgeworICAgICAgICBib3JkZXIgLT0gdl9yW2tdOworICAgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2ldID0gYm9yZGVyOworICAgICAgfQogCi0gICAgLyogbWFrZSBlaXRoZXIgZW52ZWxvcGUgbnIuIG5FbnYgKyAxIC0gcCBzaG9ydDsgb3IgZG9uJ3Qgc2hvcnRlbiBpZiBwID09IDAgKi8KLSAgICBwID0gaFNickdyaWQtPnA7Ci0gICAgaWYgKHAgPT0gMCkgewotICAgICAgaFNickZyYW1lSW5mby0+c2hvcnRFbnYgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiA9IG5FbnYgKyAxIC0gcDsKLSAgICB9CisgICAgICAvKiBtYWtlIGVpdGhlciBlbnZlbG9wZSBuci4gbkVudiArIDEgLSBwIHNob3J0OyBvciBkb24ndCBzaG9ydGVuIGlmIHAgPT0gMAorICAgICAgICovCisgICAgICBwID0gaFNickdyaWQtPnA7CisgICAgICBpZiAocCA9PSAwKSB7CisgICAgICAgIGhTYnJGcmFtZUluZm8tPnNob3J0RW52ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhTYnJGcmFtZUluZm8tPnNob3J0RW52ID0gbkVudiArIDEgLSBwOworICAgICAgfQogCi0gICAgZm9yIChrID0gMCwgaSA9IG5FbnYgLSAxOyBrIDwgbkVudjsgaysrLCBpLS0pIHsKLSAgICAgIGhTYnJGcmFtZUluZm8tPmZyZXFSZXNbaV0gPSAoRlJFUV9SRVMpdl9mW2tdOwotICAgIH0KKyAgICAgIGZvciAoayA9IDAsIGkgPSBuRW52IC0gMTsgayA8IG5FbnY7IGsrKywgaS0tKSB7CisgICAgICAgIGhTYnJGcmFtZUluZm8tPmZyZXFSZXNbaV0gPSAoRlJFUV9SRVMpdl9mW2tdOworICAgICAgfQogCi0gICAgLyogaWYgZWl0aGVyIHRoZXJlIGlzIG5vIHNob3J0IGVudmVsb3BlIG9yIHRoZSBsYXN0IGVudmVsb3BlIGlzIHNob3J0Li4uICovCi0gICAgaWYgKHAgPT0gMCB8fCBwID09IDEpIHsKLSAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbbkVudiAtIDFdOwotICAgIH0gZWxzZSB7Ci0gICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2hTYnJGcmFtZUluZm8tPnNob3J0RW52XTsKLSAgICB9Ci0KLSAgICBicmVhazsKLQotICBjYXNlIFZBUkZJWDoKLSAgICAvKiBpbiB0aGlzIGNhc2UgJ2JvcmRlcicgaW5kaWNhdGVzIHRoZSBzdGFydCBvZiB0aGUgMXN0IGVudmVsb3BlICovCi0gICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1swXSA9IGJvcmRlcjsKLQotICAgIGZvciAoayA9IDA7IGsgPCBuRW52IC0gMTsgaysrKSB7Ci0gICAgICBib3JkZXIgKz0gdl9yW2tdOwotICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1trICsgMV0gPSBib3JkZXI7Ci0gICAgfQotCi0gICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52XSA9IGJ1ZmZlckZyYW1lU3RhcnQgKyBudW1iZXJUaW1lU2xvdHM7Ci0KLSAgICBwID0gaFNickdyaWQtPnA7Ci0gICAgaWYgKHAgPT0gMCB8fCBwID09IDEpIHsKLSAgICAgIGhTYnJGcmFtZUluZm8tPnNob3J0RW52ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgaFNickZyYW1lSW5mby0+c2hvcnRFbnYgPSBwIC0gMTsKLSAgICB9Ci0KLSAgICBmb3IgKGsgPSAwOyBrIDwgbkVudjsgaysrKSB7Ci0gICAgICBoU2JyRnJhbWVJbmZvLT5mcmVxUmVzW2tdID0gKEZSRVFfUkVTKXZfZltrXTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHApIHsKLSAgICBjYXNlIDA6Ci0gICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzWzFdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52IC0gMV07Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1toU2JyRnJhbWVJbmZvLT5zaG9ydEVudl07Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBWQVJWQVI6Ci0gICAgbkVudiA9IGhTYnJHcmlkLT5ic19udW1fcmVsXzAgKyBoU2JyR3JpZC0+YnNfbnVtX3JlbF8xICsgMTsKLSAgICBGREtfQVNTRVJUKG5FbnYgPD0gTUFYX0VOVkVMT1BFU19WQVJWQVIpOyAvKiBqdXN0IHRvIGJlIHN1cmUgKi8KLSAgICBoU2JyRnJhbWVJbmZvLT5uRW52ZWxvcGVzID0gbkVudjsKLQotICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbMF0gPSBib3JkZXIgPSBoU2JyR3JpZC0+YnNfYWJzX2JvcmRfMDsKLQotICAgIGZvciAoayA9IDAsIGkgPSAxOyBrIDwgaFNickdyaWQtPmJzX251bV9yZWxfMDsgaysrLCBpKyspIHsKLSAgICAgIGJvcmRlciArPSBoU2JyR3JpZC0+YnNfcmVsX2JvcmRfMFtrXTsKLSAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaV0gPSBib3JkZXI7Ci0gICAgfQotCi0gICAgYm9yZGVyID0gaFNickdyaWQtPmJzX2Fic19ib3JkXzE7Ci0gICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52XSA9IGJvcmRlcjsKLQotICAgIGZvciAoayA9IDAsIGkgPSBuRW52IC0gMTsgayA8IGhTYnJHcmlkLT5ic19udW1fcmVsXzE7IGsrKywgaS0tKSB7Ci0gICAgICBib3JkZXIgLT0gaFNickdyaWQtPmJzX3JlbF9ib3JkXzFba107Ci0gICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2ldID0gYm9yZGVyOwotICAgIH0KLQotICAgIHAgPSBoU2JyR3JpZC0+cDsKLSAgICBpZiAocCA9PSAwKSB7Ci0gICAgICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGhTYnJGcmFtZUluZm8tPnNob3J0RW52ID0gbkVudiArIDEgLSBwOwotICAgIH0KLQotICAgIGZvciAoayA9IDA7IGsgPCBuRW52OyBrKyspIHsKLSAgICAgIGhTYnJGcmFtZUluZm8tPmZyZXFSZXNba10gPSAoRlJFUV9SRVMpaFNickdyaWQtPnZfZkxSW2tdOwotICAgIH0KLQotICAgIGlmIChuRW52ID09IDEpIHsKLSAgICAgIGhTYnJGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3BlcyA9IDE7Ci0gICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMF0gPSBoU2JyR3JpZC0+YnNfYWJzX2JvcmRfMDsKLSAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IGhTYnJHcmlkLT5ic19hYnNfYm9yZF8xOwotICAgIH0gZWxzZSB7Ci0gICAgICBoU2JyRnJhbWVJbmZvLT5uTm9pc2VFbnZlbG9wZXMgPSAyOwotICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzBdID0gaFNickdyaWQtPmJzX2Fic19ib3JkXzA7Ci0KKyAgICAgIC8qIGlmIGVpdGhlciB0aGVyZSBpcyBubyBzaG9ydCBlbnZlbG9wZSBvciB0aGUgbGFzdCBlbnZlbG9wZSBpcyBzaG9ydC4uLgorICAgICAgICovCiAgICAgICBpZiAocCA9PSAwIHx8IHAgPT0gMSkgewogICAgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnYgLSAxXTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaFNickZyYW1lSW5mby0+c2hvcnRFbnZdOworICAgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPQorICAgICAgICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1toU2JyRnJhbWVJbmZvLT5zaG9ydEVudl07CiAgICAgICB9Ci0gICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMl0gPSBoU2JyR3JpZC0+YnNfYWJzX2JvcmRfMTsKLSAgICB9Ci0gICAgYnJlYWs7CiAKLSAgZGVmYXVsdDoKLSAgICAvKiBkbyBub3RoaW5nICovCi0gICAgYnJlYWs7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVkFSRklYOgorICAgICAgLyogaW4gdGhpcyBjYXNlICdib3JkZXInIGluZGljYXRlcyB0aGUgc3RhcnQgb2YgdGhlIDFzdCBlbnZlbG9wZSAqLworICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1swXSA9IGJvcmRlcjsKKworICAgICAgZm9yIChrID0gMDsgayA8IG5FbnYgLSAxOyBrKyspIHsKKyAgICAgICAgYm9yZGVyICs9IHZfcltrXTsKKyAgICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1trICsgMV0gPSBib3JkZXI7CisgICAgICB9CisKKyAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbbkVudl0gPSBidWZmZXJGcmFtZVN0YXJ0ICsgbnVtYmVyVGltZVNsb3RzOworCisgICAgICBwID0gaFNickdyaWQtPnA7CisgICAgICBpZiAocCA9PSAwIHx8IHAgPT0gMSkgeworICAgICAgICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiA9IHAgLSAxOworICAgICAgfQorCisgICAgICBmb3IgKGsgPSAwOyBrIDwgbkVudjsgaysrKSB7CisgICAgICAgIGhTYnJGcmFtZUluZm8tPmZyZXFSZXNba10gPSAoRlJFUV9SRVMpdl9mW2tdOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKHApIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbMV07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnYgLSAxXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPQorICAgICAgICAgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2hTYnJGcmFtZUluZm8tPnNob3J0RW52XTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBWQVJWQVI6CisgICAgICBuRW52ID0gaFNickdyaWQtPmJzX251bV9yZWxfMCArIGhTYnJHcmlkLT5ic19udW1fcmVsXzEgKyAxOworICAgICAgRkRLX0FTU0VSVChuRW52IDw9IE1BWF9FTlZFTE9QRVNfVkFSVkFSKTsgLyoganVzdCB0byBiZSBzdXJlICovCisgICAgICBoU2JyRnJhbWVJbmZvLT5uRW52ZWxvcGVzID0gbkVudjsKKworICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1swXSA9IGJvcmRlciA9IGhTYnJHcmlkLT5ic19hYnNfYm9yZF8wOworCisgICAgICBmb3IgKGsgPSAwLCBpID0gMTsgayA8IGhTYnJHcmlkLT5ic19udW1fcmVsXzA7IGsrKywgaSsrKSB7CisgICAgICAgIGJvcmRlciArPSBoU2JyR3JpZC0+YnNfcmVsX2JvcmRfMFtrXTsKKyAgICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tpXSA9IGJvcmRlcjsKKyAgICAgIH0KKworICAgICAgYm9yZGVyID0gaFNickdyaWQtPmJzX2Fic19ib3JkXzE7CisgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnZdID0gYm9yZGVyOworCisgICAgICBmb3IgKGsgPSAwLCBpID0gbkVudiAtIDE7IGsgPCBoU2JyR3JpZC0+YnNfbnVtX3JlbF8xOyBrKyssIGktLSkgeworICAgICAgICBib3JkZXIgLT0gaFNickdyaWQtPmJzX3JlbF9ib3JkXzFba107CisgICAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaV0gPSBib3JkZXI7CisgICAgICB9CisKKyAgICAgIHAgPSBoU2JyR3JpZC0+cDsKKyAgICAgIGlmIChwID09IDApIHsKKyAgICAgICAgaFNickZyYW1lSW5mby0+c2hvcnRFbnYgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaFNickZyYW1lSW5mby0+c2hvcnRFbnYgPSBuRW52ICsgMSAtIHA7CisgICAgICB9CisKKyAgICAgIGZvciAoayA9IDA7IGsgPCBuRW52OyBrKyspIHsKKyAgICAgICAgaFNickZyYW1lSW5mby0+ZnJlcVJlc1trXSA9IChGUkVRX1JFUyloU2JyR3JpZC0+dl9mTFJba107CisgICAgICB9CisKKyAgICAgIGlmIChuRW52ID09IDEpIHsKKyAgICAgICAgaFNickZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMTsKKyAgICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzBdID0gaFNickdyaWQtPmJzX2Fic19ib3JkXzA7CisgICAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IGhTYnJHcmlkLT5ic19hYnNfYm9yZF8xOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaFNickZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMjsKKyAgICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzBdID0gaFNickdyaWQtPmJzX2Fic19ib3JkXzA7CisKKyAgICAgICAgaWYgKHAgPT0gMCB8fCBwID09IDEpIHsKKyAgICAgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnYgLSAxXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPQorICAgICAgICAgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2hTYnJGcmFtZUluZm8tPnNob3J0RW52XTsKKyAgICAgICAgfQorICAgICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMl0gPSBoU2JyR3JpZC0+YnNfYWJzX2JvcmRfMTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgIGJyZWFrOwogICB9CiAKICAgaWYgKGZyYW1lQ2xhc3MgPT0gVkFSRklYIHx8IGZyYW1lQ2xhc3MgPT0gRklYVkFSKSB7CkBAIC0yMDYyLDQgKzE5NjMsMyBAQAogICAgIH0KICAgfQogfQotCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL2ZyYW1fZ2VuLmggYi9saWJTQlJlbmMvc3JjL2ZyYW1fZ2VuLmgKaW5kZXggMDA0NzNkNC4uMGM1ZWRjMyAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9mcmFtX2dlbi5oCisrKyBiL2xpYlNCUmVuYy9zcmMvZnJhbV9nZW4uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw1MCArOTAsNjQgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBGcmFtaW5nIGdlbmVyYXRvciBwcm90b3R5cGVzIGFuZCBzdHJ1Y3RzICAKKyAgXGJyaWVmICBGcmFtaW5nIGdlbmVyYXRvciBwcm90b3R5cGVzIGFuZCBzdHJ1Y3RzICRSZXZpc2lvbjogOTI3OTAgJAogKi8KLSNpZm5kZWYgX0ZSQU1fR0VOX0gKLSNkZWZpbmUgX0ZSQU1fR0VOX0gKKyNpZm5kZWYgRlJBTV9HRU5fSAorI2RlZmluZSBGUkFNX0dFTl9ICiAKICNpbmNsdWRlICJzYnJfZGVmLmgiIC8qIGZvciBNQVhfRU5WRUxPUEVTIGFuZCBNQVhfTk9JU0VfRU5WRUxPUEVTIGluIHN0cnVjdCBGUkFNRV9JTkZPIGFuZCBDT0RFQ19UWVBFICovCiAjaW5jbHVkZSAic2JyX2VuY29kZXIuaCIgLyogZm9yIEZSRVFfUkVTICovCiAKLSNkZWZpbmUgTUFYX0VOVkVMT1BFU19WQVJWQVIgTUFYX0VOVkVMT1BFUyAvKiE8IHdvcnN0IGNhc2UgbnVtYmVyIG9mIGVudmVsb3BlcyBpbiBhIFZBUlZBUiBmcmFtZSAqLwotI2RlZmluZSBNQVhfRU5WRUxPUEVTX0ZJWFZBUl9WQVJGSVggNCAvKiE8IHdvcnN0IGNhc2UgbnVtYmVyIG9mIGVudmVsb3BlcyBpbiBWQVJGSVggYW5kIEZJWFZBUiBmcmFtZXMgKi8KLSNkZWZpbmUgTUFYX05VTV9SRUwgMyAvKiE8IG1heGltdW0gbnVtYmVyIG9mIHJlbGF0aXZlIGJvcmRlcnMgaW4gYW55IFZBUiBmcmFtZSAqLworI2RlZmluZSBNQVhfRU5WRUxPUEVTX1ZBUlZBUiBcCisgIE1BWF9FTlZFTE9QRVMgLyohPCB3b3JzdCBjYXNlIG51bWJlciBvZiBlbnZlbG9wZXMgaW4gYSBWQVJWQVIgZnJhbWUgKi8KKyNkZWZpbmUgTUFYX0VOVkVMT1BFU19GSVhWQVJfVkFSRklYIFwKKyAgNCAvKiE8IHdvcnN0IGNhc2UgbnVtYmVyIG9mIGVudmVsb3BlcyBpbiBWQVJGSVggYW5kIEZJWFZBUiBmcmFtZXMgKi8KKyNkZWZpbmUgTUFYX05VTV9SRUwgXAorICAzIC8qITwgbWF4aW11bSBudW1iZXIgb2YgcmVsYXRpdmUgYm9yZGVycyBpbiBhbnkgVkFSIGZyYW1lICovCiAKIC8qIFNCUiBmcmFtZSBjbGFzcyBkZWZpbml0aW9ucyAqLwogdHlwZWRlZiBlbnVtIHsKLSAgRklYRklYID0gMCwgLyohPCBic19mcmFtZV9jbGFzczogbGVhZGluZyBhbmQgdHJhaWxpbmcgZnJhbWUgYm9yZGVycyBhcmUgZml4ZWQgKi8KLSAgRklYVkFSLCAgICAgLyohPCBic19mcmFtZV9jbGFzczogbGVhZGluZyBmcmFtZSBib3JkZXIgaXMgZml4ZWQsIHRyYWlsaW5nIGZyYW1lIGJvcmRlciBpcyB2YXJpYWJsZSAqLwotICBWQVJGSVgsICAgICAvKiE8IGJzX2ZyYW1lX2NsYXNzOiBsZWFkaW5nIGZyYW1lIGJvcmRlciBpcyB2YXJpYWJsZSwgdHJhaWxpbmcgZnJhbWUgYm9yZGVyIGlzIGZpeGVkICovCi0gIFZBUlZBUiAgICAgIC8qITwgYnNfZnJhbWVfY2xhc3M6IGxlYWRpbmcgYW5kIHRyYWlsaW5nIGZyYW1lIGJvcmRlcnMgYXJlIHZhcmlhYmxlICovCi0gICxGSVhGSVhvbmx5ICAvKiE8IGJzX2ZyYW1lX2NsYXNzOiBsZWFkaW5nIGJvcmRlciBmaXhlZCAoMCksIHRyYWlsaW5nIGJvcmRlciBmaXhlZCAobnJUaW1lU2xvdHMpIGFuZCBlbmNhc2VkIGJvcmRlcnMgYXJlIGR5bmFtaWNhbGx5IGRlcml2ZWQgZnJvbSB0aGUgdHJhblBvcyAqLwotfUZSQU1FX0NMQVNTOwotCisgIEZJWEZJWCA9CisgICAgICAwLCAgLyohPCBic19mcmFtZV9jbGFzczogbGVhZGluZyBhbmQgdHJhaWxpbmcgZnJhbWUgYm9yZGVycyBhcmUgZml4ZWQgKi8KKyAgRklYVkFSLCAvKiE8IGJzX2ZyYW1lX2NsYXNzOiBsZWFkaW5nIGZyYW1lIGJvcmRlciBpcyBmaXhlZCwgdHJhaWxpbmcgZnJhbWUKKyAgICAgICAgICAgICBib3JkZXIgaXMgdmFyaWFibGUgKi8KKyAgVkFSRklYLCAvKiE8IGJzX2ZyYW1lX2NsYXNzOiBsZWFkaW5nIGZyYW1lIGJvcmRlciBpcyB2YXJpYWJsZSwgdHJhaWxpbmcgZnJhbWUKKyAgICAgICAgICAgICBib3JkZXIgaXMgZml4ZWQgKi8KKyAgVkFSVkFSIC8qITwgYnNfZnJhbWVfY2xhc3M6IGxlYWRpbmcgYW5kIHRyYWlsaW5nIGZyYW1lIGJvcmRlcnMgYXJlIHZhcmlhYmxlICovCisgICwKKyAgRklYRklYb25seSAvKiE8IGJzX2ZyYW1lX2NsYXNzOiBsZWFkaW5nIGJvcmRlciBmaXhlZCAoMCksIHRyYWlsaW5nIGJvcmRlcgorICAgICAgICAgICAgICAgIGZpeGVkIChuclRpbWVTbG90cykgYW5kIGVuY2FzZWQgYm9yZGVycyBhcmUgZHluYW1pY2FsbHkgZGVyaXZlZAorICAgICAgICAgICAgICAgIGZyb20gdGhlIHRyYW5Qb3MgKi8KK30gRlJBTUVfQ0xBU1M7CiAKIC8qIGhlbHBlciBjb25zdGFudHMgKi8KLSNkZWZpbmUgREMgICAgICA0NzExICAgICAgICAvKiE8IGhlbHBlciBjb25zdGFudDogZG9uJ3QgY2FyZSAqLwotI2RlZmluZSBFTVBUWSAgICgtOTkpICAgICAgIC8qITwgaGVscGVyIGNvbnN0YW50OiBlbXB0eSAqLwotCisjZGVmaW5lIERDIDQ3MTEgICAgIC8qITwgaGVscGVyIGNvbnN0YW50OiBkb24ndCBjYXJlICovCisjZGVmaW5lIEVNUFRZICgtOTkpIC8qITwgaGVscGVyIGNvbnN0YW50OiBlbXB0eSAqLwogCiAvKiBzeXN0ZW0gY29uc3RhbnRzOiBBQUMrU0JSLCBEUk0gRnJhbWUtTGVuZ3RoICovCi0jZGVmaW5lIEZSQU1FX01JRERMRV9TTE9UXzE5MjAgIDQKLSNkZWZpbmUgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMCAgMTUKKyNkZWZpbmUgRlJBTUVfTUlERExFX1NMT1RfMTkyMCA0CisjZGVmaW5lIE5VTUJFUl9USU1FX1NMT1RTXzE5MjAgMTUKIAotI2RlZmluZSBMRF9QUkVUUkFOX09GRiAgICAgICAgICAgMwotI2RlZmluZSBGUkFNRV9NSURETEVfU0xPVF81MTJMRCAgNAotI2RlZmluZSBOVU1CRVJfVElNRV9TTE9UU181MTJMRCAgOAotI2RlZmluZSBUUkFOU0lFTlRfT0ZGU0VUX0xEICAgICAgMAotCi0KKyNkZWZpbmUgTERfUFJFVFJBTl9PRkYgMworI2RlZmluZSBGUkFNRV9NSURETEVfU0xPVF81MTJMRCA0CisjZGVmaW5lIE5VTUJFUl9USU1FX1NMT1RTXzUxMkxEIDgKKyNkZWZpbmUgVFJBTlNJRU5UX09GRlNFVF9MRCAwCiAKIC8qCi1zeXN0ZW0gY29uc3RhbnRzOiBBQUMrU0JSIG9yIGFhY1BSTyAoaHlicmlkIGZvcm1hdCksIFN0YW5kYXJkIEZyYW1lLUxlbmd0aCwgTXVsdGktUmF0ZQorc3lzdGVtIGNvbnN0YW50czogQUFDK1NCUiBvciBhYWNQUk8gKGh5YnJpZCBmb3JtYXQpLCBTdGFuZGFyZCBGcmFtZS1MZW5ndGgsCitNdWx0aS1SYXRlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE51bWJlciBvZiBzbG90cyAobnVtYmVyVGltZVNsb3RzKTogMTYgIChOVU1CRVJfVElNRV9TTE9UU18yMDQ4KQogRGV0ZWN0b3Itb2Zmc2V0IChmcmFtZU1pZGRsZVNsb3QpOiAgNApAQCAtMTQxLDEyICsxNjYsMTEgQEAKIAogfC18LXwtfC18LXwtfC18LUItfC18LXwtfC18LXwtfC18LXwtfC18LXwtfC18LXwtQi18LXwtfC18LXwtfC18LXwtfC18LXwtfC18LXwtfC18CiAKLWZyYW1lLWdlbmVyYXRvcjowICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAyNCAgICAgICAgICAgICAgMzIKLWFuYWx5c2lzLWJ1ZmZlcjo4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0ICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgNDAKK2ZyYW1lLWdlbmVyYXRvcjowICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAyNCAzMgorYW5hbHlzaXMtYnVmZmVyOjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQgICAgICAgICAgICAgIDMyIDQwCiAqLwotI2RlZmluZSBGUkFNRV9NSURETEVfU0xPVF8yMDQ4ICA0Ci0jZGVmaW5lIE5VTUJFUl9USU1FX1NMT1RTXzIwNDggIDE2Ci0KKyNkZWZpbmUgRlJBTUVfTUlERExFX1NMT1RfMjA0OCA0CisjZGVmaW5lIE5VTUJFUl9USU1FX1NMT1RTXzIwNDggMTYKIAogLyoKIHN5c3RlbSBjb25zdGFudHM6IG1wM1BSTywgTXVsdGktUmF0ZSAmIFNpbmdsZS1SYXRlCkBAIC0xNzEsMTQgKzE5NSwxMiBAQAogZnJhbWUtZ2VuZXJhdG9yOiAwICAgICAgICAgICAgICAgICA5ICAgICAgIDEzICAgICAgICAxOAogYW5hbHlzaXMtYnVmZmVyOiA0LjUgICAgICAgICAgICAgICAxMy41ICAgICAgICAgICAgICAyMi41CiAqLwotI2RlZmluZSBGUkFNRV9NSURETEVfU0xPVF8xMTUyICA0Ci0jZGVmaW5lIE5VTUJFUl9USU1FX1NMT1RTXzExNTIgIDkKLQorI2RlZmluZSBGUkFNRV9NSURETEVfU0xPVF8xMTUyIDQKKyNkZWZpbmUgTlVNQkVSX1RJTUVfU0xPVFNfMTE1MiA5CiAKIC8qIHN5c3RlbSBjb25zdGFudHM6IExheWVyMitTQlIgKi8KLSNkZWZpbmUgRlJBTUVfTUlERExFX1NMT1RfMjMwNCAgOAotI2RlZmluZSBOVU1CRVJfVElNRV9TTE9UU18yMzA0ICAxOAotCisjZGVmaW5lIEZSQU1FX01JRERMRV9TTE9UXzIzMDQgOAorI2RlZmluZSBOVU1CRVJfVElNRV9TTE9UU18yMzA0IDE4CiAKIC8qIQogICBcc3RydWN0IFNCUl9HUklECkBAIC0xODcsMTIzICsyMDksMTM1IEBACiAgIFRoZSB2YXJpYWJsZXMgaG9sZCB0aGUgc2lnbmFscyAoZS5nLiBsZW5ndGhzIGFuZCBudW1iZXJzKSBpbiAiY2xlYXIgdGV4dCIKICovCiAKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgIC8qIHN5c3RlbSBjb25zdGFudHMgKi8KLSAgSU5UIGJ1ZmZlckZyYW1lU3RhcnQ7ICAgICAvKiE8IGZyYW1lIGdlbmVyYXRvciB2cyBhbmFseXNpcyBidWZmZXIgdGltZSBhbGlnbm1lbnQgKGN1cnJlbnRseSBzZXQgdG8gMCwgb2Zmc2V0IGFkZGVkIGVsc2V3aGVyZSkgKi8KLSAgSU5UIG51bWJlclRpbWVTbG90czsgICAgICAvKiE8IG51bWJlciBvZiBTQlIgdGltZXNsb3RzIHBlciBmcmFtZSAqLworICBJTlQgYnVmZmVyRnJhbWVTdGFydDsgLyohPCBmcmFtZSBnZW5lcmF0b3IgdnMgYW5hbHlzaXMgYnVmZmVyIHRpbWUgYWxpZ25tZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudGx5IHNldCB0byAwLCBvZmZzZXQgYWRkZWQgZWxzZXdoZXJlKSAqLworICBJTlQgbnVtYmVyVGltZVNsb3RzOyAgLyohPCBudW1iZXIgb2YgU0JSIHRpbWVzbG90cyBwZXIgZnJhbWUgKi8KIAogICAvKiB3aWxsIGJlIGFkanVzdGVkIGZvciBldmVyeSBmcmFtZSAqLwotICBGUkFNRV9DTEFTUyBmcmFtZUNsYXNzOyAgIC8qITwgU0JSIGZyYW1lIGNsYXNzICAqLwotICBJTlQgYnNfbnVtX2VudjsgICAgICAgICAgIC8qITwgYnNfbnVtX2VudiwgbnVtYmVyIG9mIGVudmVsb3BlcyBmb3IgRklYRklYICovCi0gIElOVCBic19hYnNfYm9yZDsgICAgICAgICAgLyohPCBic19hYnNfYm9yZCwgYWJzb2x1dGUgYm9yZGVyIGZvciBWQVJGSVggYW5kIEZJWFZBUiAqLwotICBJTlQgbjsgICAgICAgICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIHJlbGF0aXZlIGJvcmRlcnMgZm9yIFZBUkZJWCBhbmQgRklYVkFSICAgKi8KLSAgSU5UIHA7ICAgICAgICAgICAgICAgICAgICAvKiE8IHBvaW50ZXItdG8tdHJhbnNpZW50LWJvcmRlciAgKi8KLSAgSU5UIGJzX3JlbF9ib3JkW01BWF9OVU1fUkVMXTsgICAgICAgICAvKiE8IGJzX3JlbF9ib3JkLCByZWxhdGl2ZSBib3JkZXJzIGZvciBhbGwgVkFSICovCi0gIElOVCB2X2ZbTUFYX0VOVkVMT1BFU19GSVhWQVJfVkFSRklYXTsgLyohPCBlbnZlbG9wZSBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgZm9yIEZJWFZBUiBhbmQgVkFSRklYICAqLworICBGUkFNRV9DTEFTUyBmcmFtZUNsYXNzOyAvKiE8IFNCUiBmcmFtZSBjbGFzcyAgKi8KKyAgSU5UIGJzX251bV9lbnY7ICAgICAgICAgLyohPCBic19udW1fZW52LCBudW1iZXIgb2YgZW52ZWxvcGVzIGZvciBGSVhGSVggKi8KKyAgSU5UIGJzX2Fic19ib3JkOyAvKiE8IGJzX2Fic19ib3JkLCBhYnNvbHV0ZSBib3JkZXIgZm9yIFZBUkZJWCBhbmQgRklYVkFSICovCisgIElOVCBuOyAgICAgICAgICAgLyohPCBudW1iZXIgb2YgcmVsYXRpdmUgYm9yZGVycyBmb3IgVkFSRklYIGFuZCBGSVhWQVIgICAqLworICBJTlQgcDsgICAgICAgICAgIC8qITwgcG9pbnRlci10by10cmFuc2llbnQtYm9yZGVyICAqLworICBJTlQgYnNfcmVsX2JvcmRbTUFYX05VTV9SRUxdOyAvKiE8IGJzX3JlbF9ib3JkLCByZWxhdGl2ZSBib3JkZXJzIGZvciBhbGwgVkFSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBJTlQgdl9mW01BWF9FTlZFTE9QRVNfRklYVkFSX1ZBUkZJWF07IC8qITwgZW52ZWxvcGUgZnJlcXVlbmN5IHJlc29sdXRpb25zIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFZBUiBhbmQgVkFSRklYICAqLwogCi0gIElOVCBic19hYnNfYm9yZF8wOyAgICAgICAgLyohPCBic19hYnNfYm9yZF8wLCBsZWFkaW5nIGFic29sdXRlIGJvcmRlciBmb3IgVkFSVkFSICovCi0gIElOVCBic19hYnNfYm9yZF8xOyAgICAgICAgLyohPCBic19hYnNfYm9yZF8xLCB0cmFpbGluZyBhYnNvbHV0ZSBib3JkZXIgZm9yIFZBUlZBUiAqLwotICBJTlQgYnNfbnVtX3JlbF8wOyAgICAgICAgIC8qITwgYnNfbnVtX3JlbF8wLCBudW1iZXIgb2YgcmVsYXRpdmUgYm9yZGVycyBhc3NvY2lhdGVkIHdpdGggbGVhZGluZyBhYnNvbHV0ZSBib3JkZXIgZm9yIFZBUlZBUiAqLwotICBJTlQgYnNfbnVtX3JlbF8xOyAgICAgICAgIC8qITwgYnNfbnVtX3JlbF8xLCBudW1iZXIgb2YgcmVsYXRpdmUgYm9yZGVycyBhc3NvY2lhdGVkIHdpdGggdHJhaWxpbmcgYWJzb2x1dGUgYm9yZGVyIGZvciBWQVJWQVIgKi8KLSAgSU5UIGJzX3JlbF9ib3JkXzBbTUFYX05VTV9SRUxdOyAgICAgICAvKiE8IGJzX3JlbF9ib3JkXzAsIHJlbGF0aXZlIGJvcmRlcnMgYXNzb2NpYXRlZCB3aXRoIGxlYWRpbmcgYWJzb2x1dGUgYm9yZGVyIGZvciBWQVJWQVIgKi8KLSAgSU5UIGJzX3JlbF9ib3JkXzFbTUFYX05VTV9SRUxdOyAgICAgICAvKiE8IGJzX3JlbF9ib3JkXzEsIHJlbGF0aXZlIGJvcmRlcnMgYXNzb2NpYXRlZCB3aXRoIHRyYWlsaW5nIGFic29sdXRlIGJvcmRlciBmb3IgVkFSVkFSICovCi0gIElOVCB2X2ZMUltNQVhfRU5WRUxPUEVTX1ZBUlZBUl07ICAgICAgLyohPCBlbnZlbG9wZSBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgZm9yIFZBUlZBUiAgKi8KKyAgSU5UIGJzX2Fic19ib3JkXzA7IC8qITwgYnNfYWJzX2JvcmRfMCwgbGVhZGluZyBhYnNvbHV0ZSBib3JkZXIgZm9yIFZBUlZBUiAqLworICBJTlQgYnNfYWJzX2JvcmRfMTsgLyohPCBic19hYnNfYm9yZF8xLCB0cmFpbGluZyBhYnNvbHV0ZSBib3JkZXIgZm9yIFZBUlZBUiAqLworICBJTlQgYnNfbnVtX3JlbF8wOyAgLyohPCBic19udW1fcmVsXzAsIG51bWJlciBvZiByZWxhdGl2ZSBib3JkZXJzIGFzc29jaWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggbGVhZGluZyBhYnNvbHV0ZSBib3JkZXIgZm9yIFZBUlZBUiAqLworICBJTlQgYnNfbnVtX3JlbF8xOyAgLyohPCBic19udW1fcmVsXzEsIG51bWJlciBvZiByZWxhdGl2ZSBib3JkZXJzIGFzc29jaWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdHJhaWxpbmcgYWJzb2x1dGUgYm9yZGVyIGZvciBWQVJWQVIgKi8KKyAgSU5UIGJzX3JlbF9ib3JkXzBbTUFYX05VTV9SRUxdOyAgLyohPCBic19yZWxfYm9yZF8wLCByZWxhdGl2ZSBib3JkZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCAgbGVhZGluZyBhYnNvbHV0ZSBib3JkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICBWQVJWQVIgKi8KKyAgSU5UIGJzX3JlbF9ib3JkXzFbTUFYX05VTV9SRUxdOyAgLyohPCBic19yZWxfYm9yZF8xLCByZWxhdGl2ZSBib3JkZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0cmFpbGluZyBhYnNvbHV0ZSBib3JkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIFZBUlZBUiAqLworICBJTlQgdl9mTFJbTUFYX0VOVkVMT1BFU19WQVJWQVJdOyAvKiE8IGVudmVsb3BlIGZyZXF1ZW5jeSByZXNvbHV0aW9ucyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSVkFSICAqLwogCi19Ci1TQlJfR1JJRDsKK30gU0JSX0dSSUQ7CiB0eXBlZGVmIFNCUl9HUklEICpIQU5ETEVfU0JSX0dSSUQ7CiAKLQotCiAvKiEKICAgXHN0cnVjdCBTQlJfRlJBTUVfSU5GTwogICBcYnJpZWYgIHRpbWUvZnJlcXVlbmN5IGdyaWQgZGVzY3JpcHRpb24gZm9yIG9uZSBmcmFtZQogKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIElOVCBuRW52ZWxvcGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBlbnZlbG9wZXMgKi8KLSAgSU5UIGJvcmRlcnNbTUFYX0VOVkVMT1BFUysxXTsgICAgICAgICAgIC8qITwgZW52ZWxvcGUgYm9yZGVycyBpbiBTQlIgdGltZXNsb3RzICovCi0gIEZSRVFfUkVTIGZyZXFSZXNbTUFYX0VOVkVMT1BFU107ICAgICAgICAvKiE8IGZyZXF1ZW5jeSByZXNvbHV0aW9uIG9mIGVhY2ggZW52ZWxvcGUgKi8KLSAgSU5UIHNob3J0RW52OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIGFuIGVudmVsb3BlIHRvIGJlIHNob3J0ZW5lZCAoc3RhcnRpbmcgYXQgMSkgb3IgMCBmb3Igbm8gc2hvcnRlbmVkIGVudmVsb3BlICovCi0gIElOVCBuTm9pc2VFbnZlbG9wZXM7ICAgICAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBub2lzZSBmbG9vcnMgKi8KLSAgSU5UIGJvcmRlcnNOb2lzZVtNQVhfTk9JU0VfRU5WRUxPUEVTKzFdOy8qITwgbm9pc2UgZmxvb3IgYm9yZGVycyBpbiBTQlIgdGltZXNsb3RzICovCi19Ci1TQlJfRlJBTUVfSU5GTzsKLS8qIFdBUk5JTkc6IFdoZW4gcmVhcnJhbmdpbmcgdGhlIGVsZW1lbnRzIG9mIHRoaXMgc3RydWN0IGtlZXAgaW4gbWluZCB0aGF0IHRoZSBzdGF0aWMKLSAqIGluaXRpYWxpemF0aW9ucyBpbiB0aGUgY29ycmVzcG9uZGluZyBDLWZpbGUgaGF2ZSB0byBiZSByZWFycmFuZ2VkIGFzIHdlbGwhCi0gKiBzbmQgMjAwMi8wMS8yMwordHlwZWRlZiBzdHJ1Y3QgeworICBJTlQgbkVudmVsb3BlczsgICAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBlbnZlbG9wZXMgKi8KKyAgSU5UIGJvcmRlcnNbTUFYX0VOVkVMT1BFUyArIDFdOyAgLyohPCBlbnZlbG9wZSBib3JkZXJzIGluIFNCUiB0aW1lc2xvdHMgKi8KKyAgRlJFUV9SRVMgZnJlcVJlc1tNQVhfRU5WRUxPUEVTXTsgLyohPCBmcmVxdWVuY3kgcmVzb2x1dGlvbiBvZiBlYWNoIGVudmVsb3BlICovCisgIElOVCBzaG9ydEVudjsgLyohPCBudW1iZXIgb2YgYW4gZW52ZWxvcGUgdG8gYmUgc2hvcnRlbmVkIChzdGFydGluZyBhdCAxKSBvciAwCisgICAgICAgICAgICAgICAgICAgZm9yIG5vIHNob3J0ZW5lZCBlbnZlbG9wZSAqLworICBJTlQgbk5vaXNlRW52ZWxvcGVzOyAvKiE8IG51bWJlciBvZiBub2lzZSBmbG9vcnMgKi8KKyAgSU5UIGJvcmRlcnNOb2lzZVtNQVhfTk9JU0VfRU5WRUxPUEVTICsKKyAgICAgICAgICAgICAgICAgICAxXTsgLyohPCBub2lzZSBmbG9vciBib3JkZXJzIGluIFNCUiB0aW1lc2xvdHMgKi8KK30gU0JSX0ZSQU1FX0lORk87CisvKiBXQVJOSU5HOiBXaGVuIHJlYXJyYW5naW5nIHRoZSBlbGVtZW50cyBvZiB0aGlzIHN0cnVjdCBrZWVwIGluIG1pbmQgdGhhdCB0aGUKKyAqIHN0YXRpYyBpbml0aWFsaXphdGlvbnMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgQy1maWxlIGhhdmUgdG8gYmUgcmVhcnJhbmdlZCBhcworICogd2VsbCEgc25kIDIwMDIvMDEvMjMKICAqLwogdHlwZWRlZiBTQlJfRlJBTUVfSU5GTyAqSEFORExFX1NCUl9GUkFNRV9JTkZPOwogCi0KIC8qIQogICBcc3RydWN0IFNCUl9FTlZFTE9QRV9GUkFNRQogICBcYnJpZWYgIGZyYW1lIGdlbmVyYXRvciBtYWluIHN0cnVjdAogCi0gIENvbnRhaW5zIHR1bmluZyBwYXJhbWV0ZXJzLCB0aW1lL2ZyZXF1ZW5jeSBncmlkIGRlc2NyaXB0aW9uLCBzYnJfZ3JpZCgpIGJpdHN0cmVhbSBlbGVtZW50cywgYW5kIGdlbmVyYXRvciBpbnRlcm5hbCBzaWduYWxzCisgIENvbnRhaW5zIHR1bmluZyBwYXJhbWV0ZXJzLCB0aW1lL2ZyZXF1ZW5jeSBncmlkIGRlc2NyaXB0aW9uLCBzYnJfZ3JpZCgpCisgIGJpdHN0cmVhbSBlbGVtZW50cywgYW5kIGdlbmVyYXRvciBpbnRlcm5hbCBzaWduYWxzCiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgLyogc3lzdGVtIGNvbnN0YW50cyAqLwotICBJTlQgZnJhbWVNaWRkbGVTbG90OyAgICAgIC8qITwgdHJhbnNpZW50IGRldGVjdG9yIG9mZnNldCBpbiBTQlIgdGltZXNsb3RzICovCisgIElOVCBmcmFtZU1pZGRsZVNsb3Q7IC8qITwgdHJhbnNpZW50IGRldGVjdG9yIG9mZnNldCBpbiBTQlIgdGltZXNsb3RzICovCiAKICAgLyogYmFzaWMgdHVuaW5nIHBhcmFtZXRlcnMgKi8KLSAgSU5UIHN0YXRpY0ZyYW1pbmc7ICAgICAgICAgICAvKiE8IDE6IHJ1biBzdGF0aWMgZnJhbWluZyBpbiB0aW1lLCBpLmUuIGV4Y2x1c2l2ZSB1c2Ugb2YgYnNfZnJhbWVfY2xhc3MgPSBGSVhGSVggKi8KLSAgSU5UIG51bUVudlN0YXRpYzsgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBlbnZlbG9wZXMgcGVyIGZyYW1lIGZvciBzdGF0aWMgZnJhbWluZyAqLwotICBGUkVRX1JFUyBmcmVxX3Jlc19maXhmaXhbMl07IC8qITwgZW52ZWxvcGUgZnJlcXVlbmN5IHJlc29sdXRpb24gdG8gdXNlIGZvciBic19mcmFtZV9jbGFzcyA9IEZJWEZJWDsgc2luZ2xlIGVudiBhbmQgc3BsaXQgKi8KLSAgVUNIQVIgZlJlc1RyYW5zSXNMb3c7ICAgICAgICAvKiE8IGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciB0cmFuc2llbnQgZnJhbWVzIC0gYWx3YXlzIGxvdyAoMCkgb3IgYWNjb3JkaW5nIHRvIHRhYmxlICgxKSAqLworICBJTlQgc3RhdGljRnJhbWluZzsgLyohPCAxOiBydW4gc3RhdGljIGZyYW1pbmcgaW4gdGltZSwgaS5lLiBleGNsdXNpdmUgdXNlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICBic19mcmFtZV9jbGFzcyA9IEZJWEZJWCAqLworICBJTlQgbnVtRW52U3RhdGljOyAgLyohPCBudW1iZXIgb2YgZW52ZWxvcGVzIHBlciBmcmFtZSBmb3Igc3RhdGljIGZyYW1pbmcgKi8KKyAgRlJFUV9SRVMKKyAgZnJlcV9yZXNfZml4Zml4WzJdOyAvKiE8IGVudmVsb3BlIGZyZXF1ZW5jeSByZXNvbHV0aW9uIHRvIHVzZSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICBic19mcmFtZV9jbGFzcyA9IEZJWEZJWDsgc2luZ2xlIGVudiBhbmQgc3BsaXQgKi8KKyAgVUNIQVIKKyAgZlJlc1RyYW5zSXNMb3c7IC8qITwgZnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIHRyYW5zaWVudCBmcmFtZXMgLSBhbHdheXMKKyAgICAgICAgICAgICAgICAgICAgIGxvdyAoMCkgb3IgYWNjb3JkaW5nIHRvIHRhYmxlICgxKSAqLwogCiAgIC8qIGV4cGVydCB0dW5pbmcgcGFyYW1ldGVycyAqLwotICBjb25zdCBpbnQgKnZfdHVuaW5nU2VnbTsgIC8qITwgc2VnbWVudCBsZW5ndGhzIHRvIHVzZSBhcm91bmQgdHJhbnNpZW50ICovCi0gIGNvbnN0IGludCAqdl90dW5pbmdGcmVxOyAgLyohPCBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgdG8gdXNlIGFyb3VuZCB0cmFuc2llbnQgKi8KLSAgSU5UIGRtaW47ICAgICAgICAgICAgICAgICAvKiE8IG1pbmltdW0gbGVuZ3RoIG9mIGRlcGVuZGVudCBzZWdtZW50cyAqLwotICBJTlQgZG1heDsgICAgICAgICAgICAgICAgIC8qITwgbWF4aW11bSBsZW5ndGggb2YgZGVwZW5kZW50IHNlZ21lbnRzICovCi0gIElOVCBhbGxvd1NwcmVhZDsgICAgICAgICAgLyohPCAxOiBhbGxvdyBpc29sYXRlZCB0cmFuc2llbnQgdG8gaW5mbHVlbmNlIGdyaWQgb2YgMyBjb25zZWN1dGl2ZSBmcmFtZXMgKi8KKyAgY29uc3QgaW50ICp2X3R1bmluZ1NlZ207IC8qITwgc2VnbWVudCBsZW5ndGhzIHRvIHVzZSBhcm91bmQgdHJhbnNpZW50ICovCisgIGNvbnN0IGludCAqdl90dW5pbmdGcmVxOyAvKiE8IGZyZXF1ZW5jeSByZXNvbHV0aW9ucyB0byB1c2UgYXJvdW5kIHRyYW5zaWVudCAqLworICBJTlQgZG1pbjsgICAgICAgICAgICAgICAgLyohPCBtaW5pbXVtIGxlbmd0aCBvZiBkZXBlbmRlbnQgc2VnbWVudHMgKi8KKyAgSU5UIGRtYXg7ICAgICAgICAgICAgICAgIC8qITwgbWF4aW11bSBsZW5ndGggb2YgZGVwZW5kZW50IHNlZ21lbnRzICovCisgIElOVCBhbGxvd1NwcmVhZDsgLyohPCAxOiBhbGxvdyBpc29sYXRlZCB0cmFuc2llbnQgdG8gaW5mbHVlbmNlIGdyaWQgb2YgMworICAgICAgICAgICAgICAgICAgICAgIGNvbnNlY3V0aXZlIGZyYW1lcyAqLwogCiAgIC8qIGludGVybmFsbHkgdXNlZCBzaWduYWxzICovCi0gIEZSQU1FX0NMQVNTIGZyYW1lQ2xhc3NPbGQ7ICAgICAgICAgICAgICAgIC8qITwgZnJhbWUgY2xhc3MgdXNlZCBmb3IgcHJldmlvdXMgZnJhbWUgKi8KLSAgSU5UIHNwcmVhZEZsYWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAxOiB1c2UgVkFSVkFSIGluc3RlYWQgb2YgVkFSRklYIHRvIGZvbGxvdyB1cCBvbGQgdHJhbnNpZW50ICovCisgIEZSQU1FX0NMQVNTIGZyYW1lQ2xhc3NPbGQ7IC8qITwgZnJhbWUgY2xhc3MgdXNlZCBmb3IgcHJldmlvdXMgZnJhbWUgKi8KKyAgSU5UIHNwcmVhZEZsYWc7IC8qITwgMTogdXNlIFZBUlZBUiBpbnN0ZWFkIG9mIFZBUkZJWCB0byBmb2xsb3cgdXAgb2xkCisgICAgICAgICAgICAgICAgICAgICB0cmFuc2llbnQgKi8KIAotICBJTlQgdl9ib3JkWzIgKiBNQVhfRU5WRUxPUEVTX1ZBUlZBUiArIDFdOyAvKiE8IGJvcmRlcnMgZm9yIGN1cnJlbnQgZnJhbWUgYW5kIHByZWxpbWluYXJ5IGJvcmRlcnMgZm9yIG5leHQgZnJhbWUgKGZpeGVkIGJvcmRlcnMgZXhjbHVkZWQpICovCi0gIElOVCBsZW5ndGhfdl9ib3JkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgaGVscGVyIHZhcmlhYmxlOiBsZW5ndGggb2Ygdl9ib3JkICovCi0gIElOVCB2X2ZyZXFbMiAqIE1BWF9FTlZFTE9QRVNfVkFSVkFSICsgMV07IC8qITwgZnJlcXVlbmN5IHJlc29sdXRpb25zIGZvciBjdXJyZW50IGZyYW1lIGFuZCBwcmVsaW1pbmFyeSByZXNvbHV0aW9ucyBmb3IgbmV4dCBmcmFtZSAqLwotICBJTlQgbGVuZ3RoX3ZfZnJlcTsgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGhlbHBlciB2YXJpYWJsZTogbGVuZ3RoIG9mIHZfZnJlcSAqLworICBJTlQgdl9ib3JkWzIgKiBNQVhfRU5WRUxPUEVTX1ZBUlZBUiArIDFdOyAvKiE8IGJvcmRlcnMgZm9yIGN1cnJlbnQgZnJhbWUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxpbWluYXJ5IGJvcmRlcnMgZm9yIG5leHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgKGZpeGVkIGJvcmRlcnMgZXhjbHVkZWQpICovCisgIElOVCBsZW5ndGhfdl9ib3JkOyAvKiE8IGhlbHBlciB2YXJpYWJsZTogbGVuZ3RoIG9mIHZfYm9yZCAqLworICBJTlQgdl9mcmVxWzIgKiBNQVhfRU5WRUxPUEVTX1ZBUlZBUiArIDFdOyAvKiE8IGZyZXF1ZW5jeSByZXNvbHV0aW9ucyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBmcmFtZSBhbmQgcHJlbGltaW5hcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbnMgZm9yIG5leHQgZnJhbWUgKi8KKyAgSU5UIGxlbmd0aF92X2ZyZXE7IC8qITwgaGVscGVyIHZhcmlhYmxlOiBsZW5ndGggb2Ygdl9mcmVxICovCiAKLSAgSU5UIHZfYm9yZEZvbGxvd1tNQVhfRU5WRUxPUEVTX1ZBUlZBUl07ICAgLyohPCBwcmVsaW1pbmFyeSBib3JkZXJzIGZvciBjdXJyZW50IGZyYW1lIChjYWxjdWxhdGVkIGR1cmluZyBwcmV2aW91cyBmcmFtZSkgKi8KLSAgSU5UIGxlbmd0aF92X2JvcmRGb2xsb3c7ICAgICAgICAgICAgICAgICAgLyohPCBoZWxwZXIgdmFyaWFibGU6IGxlbmd0aCBvZiB2X2JvcmRGb2xsb3cgKi8KLSAgSU5UIGlfdHJhbkZvbGxvdzsgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBwb2ludHMgdG8gdHJhbnNpZW50IGJvcmRlciBpbiB2X2JvcmRGb2xsb3cgKG1heSBiZSBuZWdhdGl2ZSwgc2VlIGtlZXBGb3JGb2xsb3dVcCgpKSAqLwotICBJTlQgaV9maWxsRm9sbG93OyAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHBvaW50cyB0byBmaXJzdCBmaWxsIGJvcmRlciBpbiB2X2JvcmRGb2xsb3cgKi8KLSAgSU5UIHZfZnJlcUZvbGxvd1tNQVhfRU5WRUxPUEVTX1ZBUlZBUl07ICAgLyohPCBwcmVsaW1pbmFyeSBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgZm9yIGN1cnJlbnQgZnJhbWUgKGNhbGN1bGF0ZWQgZHVyaW5nIHByZXZpb3VzIGZyYW1lKSAqLwotICBJTlQgbGVuZ3RoX3ZfZnJlcUZvbGxvdzsgICAgICAgICAgICAgICAgICAvKiE8IGhlbHBlciB2YXJpYWJsZTogbGVuZ3RoIG9mIHZfZnJlcUZvbGxvdyAqLwotCisgIElOVCB2X2JvcmRGb2xsb3dbTUFYX0VOVkVMT1BFU19WQVJWQVJdOyAvKiE8IHByZWxpbWluYXJ5IGJvcmRlcnMgZm9yIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIChjYWxjdWxhdGVkIGR1cmluZyBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUpICovCisgIElOVCBsZW5ndGhfdl9ib3JkRm9sbG93OyAvKiE8IGhlbHBlciB2YXJpYWJsZTogbGVuZ3RoIG9mIHZfYm9yZEZvbGxvdyAqLworICBJTlQgaV90cmFuRm9sbG93OyAvKiE8IHBvaW50cyB0byB0cmFuc2llbnQgYm9yZGVyIGluIHZfYm9yZEZvbGxvdyAobWF5IGJlCisgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlLCBzZWUga2VlcEZvckZvbGxvd1VwKCkpICovCisgIElOVCBpX2ZpbGxGb2xsb3c7IC8qITwgcG9pbnRzIHRvIGZpcnN0IGZpbGwgYm9yZGVyIGluIHZfYm9yZEZvbGxvdyAqLworICBJTlQgdl9mcmVxRm9sbG93W01BWF9FTlZFTE9QRVNfVkFSVkFSXTsgLyohPCBwcmVsaW1pbmFyeSBmcmVxdWVuY3kgcmVzb2x1dGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjdXJyZW50IGZyYW1lIChjYWxjdWxhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJpbmcgcHJldmlvdXMgZnJhbWUpICovCisgIElOVCBsZW5ndGhfdl9mcmVxRm9sbG93OyAvKiE8IGhlbHBlciB2YXJpYWJsZTogbGVuZ3RoIG9mIHZfZnJlcUZvbGxvdyAqLwogCiAgIC8qIGV4dGVybmFsbHkgbmVlZGVkIHNpZ25hbHMgKi8KLSAgU0JSX0dSSUQgICAgICAgICBTYnJHcmlkOyAgICAgICAgIC8qITwgc2JyX2dyaWQoKSBzaWduYWxzIHRvIGJlIGNvbnZlcnRlZCB0byBiaXRzdHJlYW0gZWxlbWVudHMgKi8KLSAgU0JSX0ZSQU1FX0lORk8gICBTYnJGcmFtZUluZm87ICAgIC8qITwgdGltZS9mcmVxdWVuY3kgZ3JpZCBkZXNjcmlwdGlvbiBmb3Igb25lIGZyYW1lICovCi19Ci1TQlJfRU5WRUxPUEVfRlJBTUU7CisgIFNCUl9HUklECisgIFNickdyaWQ7IC8qITwgc2JyX2dyaWQoKSBzaWduYWxzIHRvIGJlIGNvbnZlcnRlZCB0byBiaXRzdHJlYW0gZWxlbWVudHMgKi8KKyAgU0JSX0ZSQU1FX0lORk8KKyAgU2JyRnJhbWVJbmZvOyAvKiE8IHRpbWUvZnJlcXVlbmN5IGdyaWQgZGVzY3JpcHRpb24gZm9yIG9uZSBmcmFtZSAqLworfSBTQlJfRU5WRUxPUEVfRlJBTUU7CiB0eXBlZGVmIFNCUl9FTlZFTE9QRV9GUkFNRSAqSEFORExFX1NCUl9FTlZFTE9QRV9GUkFNRTsKIAotCi0KLXZvaWQKLUZES3NickVuY19pbml0RnJhbWVJbmZvR2VuZXJhdG9yICgKLSAgICAgICAgICAgICAgSEFORExFX1NCUl9FTlZFTE9QRV9GUkFNRSBoU2JyRW52RnJhbWUsCi0gICAgICAgICAgICAgIElOVCAgICAgICBhbGxvd1NwcmVhZCwKLSAgICAgICAgICAgICAgSU5UICAgICAgIG51bUVudlN0YXRpYywKLSAgICAgICAgICAgICAgSU5UICAgICAgIHN0YXRpY0ZyYW1pbmcsCi0gICAgICAgICAgICAgIElOVCAgICAgICB0aW1lU2xvdHMsCi0gICAgICAgIGNvbnN0IEZSRVFfUkVTKiBmcmVxX3Jlc19maXhmaXgKLSAgICAgICAgICAgICAsVUNIQVIgICAgIGZSZXNUcmFuc0lzTG93LAotICAgICAgICAgICAgICBJTlQgICAgICAgbGRHcmlkCi0gICAgICAgICk7Cit2b2lkIEZES3NickVuY19pbml0RnJhbWVJbmZvR2VuZXJhdG9yKEhBTkRMRV9TQlJfRU5WRUxPUEVfRlJBTUUgaFNickVudkZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYWxsb3dTcHJlYWQsIElOVCBudW1FbnZTdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdGF0aWNGcmFtaW5nLCBJTlQgdGltZVNsb3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGUkVRX1JFUyAqZnJlcV9yZXNfZml4Zml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBmUmVzVHJhbnNJc0xvdywgSU5UIGxkR3JpZCk7CiAKIEhBTkRMRV9TQlJfRlJBTUVfSU5GTwotRkRLc2JyRW5jX2ZyYW1lSW5mb0dlbmVyYXRvciAoSEFORExFX1NCUl9FTlZFTE9QRV9GUkFNRSBoU2JyRW52RnJhbWUsCi0gICAgICAgICAgICAgICAgICAgIFVDSEFSICp2X3RyYW5zaWVudF9pbmZvLAotICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdl90cmFuc2llbnRfaW5mb19wcmUsCi0gICAgICAgICAgICAgICAgICAgIGludCBsZEdyaWQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqdl90dW5pbmcpOworRkRLc2JyRW5jX2ZyYW1lSW5mb0dlbmVyYXRvcihIQU5ETEVfU0JSX0VOVkVMT1BFX0ZSQU1FIGhTYnJFbnZGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnZfdHJhbnNpZW50X2luZm8sIGNvbnN0IElOVCByaWdodEJvcmRlckZJWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnZfdHJhbnNpZW50X2luZm9fcHJlLCBpbnQgbGRHcmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKnZfdHVuaW5nKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL2ludmZfZXN0LmNwcCBiL2xpYlNCUmVuYy9zcmMvaW52Zl9lc3QuY3BwCmluZGV4IDMyZGY2ZDkuLjUzYjQ3YWMgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvaW52Zl9lc3QuY3BwCisrKyBiL2xpYlNCUmVuYy9zcmMvaW52Zl9lc3QuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDcgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImludmZfZXN0LmgiCiAjaW5jbHVkZSAic2JyX21pc2MuaCIKQEAgLTg3LDQ2ICsxMDYsNjYgQEAKICNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgogCiAjZGVmaW5lIE1BWF9OVU1fUkVHSU9OUyAxMAotI2RlZmluZSBTQ0FMRV9GQUNfUVVPICAgNTEyLjBmCi0jZGVmaW5lIFNDQUxFX0ZBQ19OUkcgICAyNTYuMGYKKyNkZWZpbmUgU0NBTEVfRkFDX1FVTyA1MTIuMGYKKyNkZWZpbmUgU0NBTEVfRkFDX05SRyAyNTYuMGYKIAogI2lmbmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsYikgKCBhIDwgYiA/IGE6YikKKyNkZWZpbmUgbWluKGEsIGIpIChhIDwgYiA/IGEgOiBiKQogI2VuZGlmCiAKICNpZm5kZWYgbWF4Ci0jZGVmaW5lIG1heChhLGIpICggYSA+IGIgPyBhOmIpCisjZGVmaW5lIG1heChhLCBiKSAoYSA+IGIgPyBhIDogYikKICNlbmRpZgogCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgcXVhbnRTdGVwc1Nicls0XSAgPSAgeyAweDAwNDAwMDAwLCAweDAyODAwMDAwLCAweDAzODAwMDAwLCAweDA0YzAwMDAwIH0gOyAgICAvKiB0YWJsZSBzY2FsZWQgd2l0aCBTQ0FMRV9GQUNfUVVPICovCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgcXVhbnRTdGVwc09yaWdbNF0gPSAgeyAweDAwMDAwMDAwLCAweDAwYzAwMDAwLCAweDAxYzAwMDAwLCAweDAyODAwMDAwIH0gOyAgICAvKiB0YWJsZSBzY2FsZWQgd2l0aCBTQ0FMRV9GQUNfUVVPICovCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgbnJnQm9yZGVyc1s0XSAgICAgPSAgeyAweDBjODAwMDAwLCAweDBmMDAwMDAwLCAweDExODAwMDAwLCAweDE0MDAwMDAwIH0gOyAgICAvKiB0YWJsZSBzY2FsZWQgd2l0aCBTQ0FMRV9GQUNfTlJHICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgcXVhbnRTdGVwc1Nicls0XSA9IHsKKyAgICAweDAwNDAwMDAwLCAweDAyODAwMDAwLCAweDAzODAwMDAwLAorICAgIDB4MDRjMDAwMDB9OyAvKiB0YWJsZSBzY2FsZWQgd2l0aCBTQ0FMRV9GQUNfUVVPICovCitzdGF0aWMgY29uc3QgRklYUF9EQkwgcXVhbnRTdGVwc09yaWdbNF0gPSB7CisgICAgMHgwMDAwMDAwMCwgMHgwMGMwMDAwMCwgMHgwMWMwMDAwMCwKKyAgICAweDAyODAwMDAwfTsgLyogdGFibGUgc2NhbGVkIHdpdGggU0NBTEVfRkFDX1FVTyAqLworc3RhdGljIGNvbnN0IEZJWFBfREJMIG5yZ0JvcmRlcnNbNF0gPSB7CisgICAgMHgwYzgwMDAwMCwgMHgwZjAwMDAwMCwgMHgxMTgwMDAwMCwKKyAgICAweDE0MDAwMDAwfTsgLyogdGFibGUgc2NhbGVkIHdpdGggU0NBTEVfRkFDX05SRyAqLwogCiBzdGF0aWMgY29uc3QgREVURUNUT1JfUEFSQU1FVEVSUyBkZXRlY3RvclBhcmFtc0FBQyA9IHsKICAgICBxdWFudFN0ZXBzU2JyLAogICAgIHF1YW50U3RlcHNPcmlnLAogICAgIG5yZ0JvcmRlcnMsCi0gICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYm9yZGVycyBTQlIuICovCi0gICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYm9yZGVycyBvcmlnLiAqLwotICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJvcmRlcnMgTnJnLiAqLwotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHNwYWNlLiAqLwotICAgICAge0lOVkZfTUlEX0xFVkVMLCAgIElOVkZfTE9XX0xFVkVMLCAgSU5WRl9PRkYsICAgICAgICBJTlZGX09GRiwgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KLSAgICAgIHtJTlZGX01JRF9MRVZFTCwgICBJTlZGX0xPV19MRVZFTCwgIElOVkZfT0ZGLCAgICAgICAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCi0gICAgICB7SU5WRl9ISUdIX0xFVkVMLCAgSU5WRl9NSURfTEVWRUwsICBJTlZGX0xPV19MRVZFTCwgIElOVkZfT0ZGLCBJTlZGX09GRn0sIC8qIHJlZ2lvblNiciAqLwotICAgICAge0lOVkZfSElHSF9MRVZFTCwgIElOVkZfSElHSF9MRVZFTCwgSU5WRl9NSURfTEVWRUwsICBJTlZGX09GRiwgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KLSAgICAgIHtJTlZGX0hJR0hfTEVWRUwsICBJTlZGX0hJR0hfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSAgLyogICAgfCAgICAgICovCi0gICAgfSwvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZWdpb25PcmlnIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gc3BhY2UgdHJhbnNpZW50LiAqLwotICAgICAge0lOVkZfTE9XX0xFVkVMLCAgIElOVkZfTE9XX0xFVkVMLCAgSU5WRl9MT1dfTEVWRUwsICBJTlZGX09GRiwgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KLSAgICAgIHtJTlZGX0xPV19MRVZFTCwgICBJTlZGX0xPV19MRVZFTCwgIElOVkZfTE9XX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCi0gICAgICB7SU5WRl9ISUdIX0xFVkVMLCAgSU5WRl9NSURfTEVWRUwsICBJTlZGX01JRF9MRVZFTCwgIElOVkZfT0ZGLCBJTlZGX09GRn0sIC8qIHJlZ2lvblNiciAqLwotICAgICAge0lOVkZfSElHSF9MRVZFTCwgIElOVkZfSElHSF9MRVZFTCwgSU5WRl9NSURfTEVWRUwsICBJTlZGX09GRiwgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KLSAgICAgIHtJTlZGX0hJR0hfTEVWRUwsICBJTlZGX0hJR0hfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSAgLyogICAgfCAgICAgICovCi0gICAgfSwvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZWdpb25PcmlnIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgey00LCAtMywgLTIsIC0xLCAwfSAvKiBSZWR1Y3Rpb24gZmFjdG9yIG9mIHRoZSBpbnZlcnNlIGZpbHRlcmluZyBmb3IgbG93IGVuZXJnaWVzLiovCisgICAgNCwgLyogTnVtYmVyIG9mIGJvcmRlcnMgU0JSLiAqLworICAgIDQsIC8qIE51bWJlciBvZiBib3JkZXJzIG9yaWcuICovCisgICAgNCwgLyogTnVtYmVyIG9mIGJvcmRlcnMgTnJnLiAqLworICAgIHsKKyAgICAgICAgLyogUmVnaW9uIHNwYWNlLiAqLworICAgICAgICB7SU5WRl9NSURfTEVWRUwsIElOVkZfTE9XX0xFVkVMLCBJTlZGX09GRiwgSU5WRl9PRkYsCisgICAgICAgICBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLworICAgICAgICB7SU5WRl9NSURfTEVWRUwsIElOVkZfTE9XX0xFVkVMLCBJTlZGX09GRiwgSU5WRl9PRkYsCisgICAgICAgICBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLworICAgICAgICB7SU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgSU5WRl9MT1dfTEVWRUwsIElOVkZfT0ZGLAorICAgICAgICAgSU5WRl9PRkZ9LCAvKiByZWdpb25TYnIgKi8KKyAgICAgICAge0lOVkZfSElHSF9MRVZFTCwgSU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgSU5WRl9PRkYsCisgICAgICAgICBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLworICAgICAgICB7SU5WRl9ISUdIX0xFVkVMLCBJTlZGX0hJR0hfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCBJTlZGX09GRiwKKyAgICAgICAgIElOVkZfT0ZGfSAvKiAgICB8ICAgICAgKi8KKyAgICB9LCAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZWdpb25PcmlnIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgeworICAgICAgICAvKiBSZWdpb24gc3BhY2UgdHJhbnNpZW50LiAqLworICAgICAgICB7SU5WRl9MT1dfTEVWRUwsIElOVkZfTE9XX0xFVkVMLCBJTlZGX0xPV19MRVZFTCwgSU5WRl9PRkYsCisgICAgICAgICBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLworICAgICAgICB7SU5WRl9MT1dfTEVWRUwsIElOVkZfTE9XX0xFVkVMLCBJTlZGX0xPV19MRVZFTCwgSU5WRl9PRkYsCisgICAgICAgICBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLworICAgICAgICB7SU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgSU5WRl9NSURfTEVWRUwsIElOVkZfT0ZGLAorICAgICAgICAgSU5WRl9PRkZ9LCAvKiByZWdpb25TYnIgKi8KKyAgICAgICAge0lOVkZfSElHSF9MRVZFTCwgSU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgSU5WRl9PRkYsCisgICAgICAgICBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLworICAgICAgICB7SU5WRl9ISUdIX0xFVkVMLCBJTlZGX0hJR0hfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCBJTlZGX09GRiwKKyAgICAgICAgIElOVkZfT0ZGfSAvKiAgICB8ICAgICAgKi8KKyAgICB9LCAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZWdpb25PcmlnIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgey00LCAtMywgLTIsIC0xLAorICAgICAwfSAvKiBSZWR1Y3Rpb24gZmFjdG9yIG9mIHRoZSBpbnZlcnNlIGZpbHRlcmluZyBmb3IgbG93IGVuZXJnaWVzLiovCiB9OwogCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgaHlzdGVyZXNpcyA9IDB4MDA0MDAwMDAgOyAvKiBEZWx0YSB2YWx1ZSBmb3IgaHlzdGVyZXNpcy4gc2NhbGVkIHdpdGggU0NBTEVfRkFDX1FVTyAqLworc3RhdGljIGNvbnN0IEZJWFBfREJMIGh5c3RlcmVzaXMgPQorICAgIDB4MDA0MDAwMDA7IC8qIERlbHRhIHZhbHVlIGZvciBoeXN0ZXJlc2lzLiBzY2FsZWQgd2l0aCBTQ0FMRV9GQUNfUVVPICovCiAKIC8qCiAgKiBBQUMrU0JSIFBBUkFNRVRFUlMgZm9yIFNwZWVjaApAQCAtMTM1LDI0ICsxNzQsMzcgQEAKICAgICBxdWFudFN0ZXBzU2JyLAogICAgIHF1YW50U3RlcHNPcmlnLAogICAgIG5yZ0JvcmRlcnMsCi0gICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYm9yZGVycyBTQlIuICovCi0gICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYm9yZGVycyBvcmlnLiAqLwotICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJvcmRlcnMgTnJnLiAqLwotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHNwYWNlLiAqLwotICAgICAge0lOVkZfTUlEX0xFVkVMLCAgIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9MT1dfTEVWRUwsICBJTlZGX09GRiwgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KLSAgICAgIHtJTlZGX01JRF9MRVZFTCwgICBJTlZGX01JRF9MRVZFTCwgIElOVkZfTE9XX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCi0gICAgICB7SU5WRl9ISUdIX0xFVkVMLCAgSU5WRl9NSURfTEVWRUwsICBJTlZGX01JRF9MRVZFTCwgIElOVkZfT0ZGLCBJTlZGX09GRn0sIC8qIHJlZ2lvblNiciAqLwotICAgICAge0lOVkZfSElHSF9MRVZFTCwgIElOVkZfSElHSF9MRVZFTCwgSU5WRl9NSURfTEVWRUwsICBJTlZGX09GRiwgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KLSAgICAgIHtJTlZGX0hJR0hfTEVWRUwsICBJTlZGX0hJR0hfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSAgLyogICAgfCAgICAgICovCi0gICAgfSwvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZWdpb25PcmlnIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gc3BhY2UgdHJhbnNpZW50LiAqLwotICAgICAge0lOVkZfTUlEX0xFVkVMLCAgIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9MT1dfTEVWRUwsICBJTlZGX09GRiwgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KLSAgICAgIHtJTlZGX01JRF9MRVZFTCwgICBJTlZGX01JRF9MRVZFTCwgIElOVkZfTE9XX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSwgLyogICAgfCAgICAgICovCi0gICAgICB7SU5WRl9ISUdIX0xFVkVMLCAgSU5WRl9NSURfTEVWRUwsICBJTlZGX01JRF9MRVZFTCwgIElOVkZfT0ZGLCBJTlZGX09GRn0sIC8qIHJlZ2lvblNiciAqLwotICAgICAge0lOVkZfSElHSF9MRVZFTCwgIElOVkZfSElHSF9MRVZFTCwgSU5WRl9NSURfTEVWRUwsICBJTlZGX09GRiwgSU5WRl9PRkZ9LCAvKiAgICB8ICAgICAgKi8KLSAgICAgIHtJTlZGX0hJR0hfTEVWRUwsICBJTlZGX0hJR0hfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCAgSU5WRl9PRkYsIElOVkZfT0ZGfSAgLyogICAgfCAgICAgICovCi0gICAgfSwvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZWdpb25PcmlnIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgey00LCAtMywgLTIsIC0xLCAwfSAvKiBSZWR1Y3Rpb24gZmFjdG9yIG9mIHRoZSBpbnZlcnNlIGZpbHRlcmluZyBmb3IgbG93IGVuZXJnaWVzLiovCisgICAgNCwgLyogTnVtYmVyIG9mIGJvcmRlcnMgU0JSLiAqLworICAgIDQsIC8qIE51bWJlciBvZiBib3JkZXJzIG9yaWcuICovCisgICAgNCwgLyogTnVtYmVyIG9mIGJvcmRlcnMgTnJnLiAqLworICAgIHsKKyAgICAgICAgLyogUmVnaW9uIHNwYWNlLiAqLworICAgICAgICB7SU5WRl9NSURfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCBJTlZGX0xPV19MRVZFTCwgSU5WRl9PRkYsCisgICAgICAgICBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLworICAgICAgICB7SU5WRl9NSURfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCBJTlZGX0xPV19MRVZFTCwgSU5WRl9PRkYsCisgICAgICAgICBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLworICAgICAgICB7SU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgSU5WRl9NSURfTEVWRUwsIElOVkZfT0ZGLAorICAgICAgICAgSU5WRl9PRkZ9LCAvKiByZWdpb25TYnIgKi8KKyAgICAgICAge0lOVkZfSElHSF9MRVZFTCwgSU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgSU5WRl9PRkYsCisgICAgICAgICBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLworICAgICAgICB7SU5WRl9ISUdIX0xFVkVMLCBJTlZGX0hJR0hfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCBJTlZGX09GRiwKKyAgICAgICAgIElOVkZfT0ZGfSAvKiAgICB8ICAgICAgKi8KKyAgICB9LCAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZWdpb25PcmlnIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgeworICAgICAgICAvKiBSZWdpb24gc3BhY2UgdHJhbnNpZW50LiAqLworICAgICAgICB7SU5WRl9NSURfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCBJTlZGX0xPV19MRVZFTCwgSU5WRl9PRkYsCisgICAgICAgICBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLworICAgICAgICB7SU5WRl9NSURfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCBJTlZGX0xPV19MRVZFTCwgSU5WRl9PRkYsCisgICAgICAgICBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLworICAgICAgICB7SU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgSU5WRl9NSURfTEVWRUwsIElOVkZfT0ZGLAorICAgICAgICAgSU5WRl9PRkZ9LCAvKiByZWdpb25TYnIgKi8KKyAgICAgICAge0lOVkZfSElHSF9MRVZFTCwgSU5WRl9ISUdIX0xFVkVMLCBJTlZGX01JRF9MRVZFTCwgSU5WRl9PRkYsCisgICAgICAgICBJTlZGX09GRn0sIC8qICAgIHwgICAgICAqLworICAgICAgICB7SU5WRl9ISUdIX0xFVkVMLCBJTlZGX0hJR0hfTEVWRUwsIElOVkZfTUlEX0xFVkVMLCBJTlZGX09GRiwKKyAgICAgICAgIElOVkZfT0ZGfSAvKiAgICB8ICAgICAgKi8KKyAgICB9LCAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZWdpb25PcmlnIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgey00LCAtMywgLTIsIC0xLAorICAgICAwfSAvKiBSZWR1Y3Rpb24gZmFjdG9yIG9mIHRoZSBpbnZlcnNlIGZpbHRlcmluZyBmb3IgbG93IGVuZXJnaWVzLiovCiB9OwogCiAvKgpAQCAtMTYwLDIwICsyMTIsMTkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKiovCiB0eXBlZGVmIGNvbnN0IEZJWFBfREJMIEZJUl9GSUxURVJbNV07CiAKLXN0YXRpYyBjb25zdCBGSVJfRklMVEVSIGZpcl8wID0geyAweDdmZmZmZmZmLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gOwotc3RhdGljIGNvbnN0IEZJUl9GSUxURVIgZmlyXzEgPSB7IDB4MmFhYWFhODAsIDB4NTU1NTU0ZmYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSA7Ci1zdGF0aWMgY29uc3QgRklSX0ZJTFRFUiBmaXJfMiA9IHsgMHgxMDAwMDAwMCwgMHgzMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9IDsKLXN0YXRpYyBjb25zdCBGSVJfRklMVEVSIGZpcl8zID0geyAweDA3N2Y4MGU4LCAweDE5OTk5OWEwLCAweDJiYjNiMjQwLCAweDMzMzMzMzQwLCAweDAwMDAwMDAwIH0gOwotc3RhdGljIGNvbnN0IEZJUl9GSUxURVIgZmlyXzQgPSB7IDB4MDQxMzA1OTgsIDB4MGViZGIwMDAsIDB4MWJlY2ZhNjAsIDB4MjY5N2E0YzAsIDB4MmFhYWFhODAgfSA7CitzdGF0aWMgY29uc3QgRklSX0ZJTFRFUiBmaXJfMCA9IHsweDdmZmZmZmZmLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMH07CitzdGF0aWMgY29uc3QgRklSX0ZJTFRFUiBmaXJfMSA9IHsweDJhYWFhYTgwLCAweDU1NTU1NGZmLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMH07CitzdGF0aWMgY29uc3QgRklSX0ZJTFRFUiBmaXJfMiA9IHsweDEwMDAwMDAwLCAweDMwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMH07CitzdGF0aWMgY29uc3QgRklSX0ZJTFRFUiBmaXJfMyA9IHsweDA3N2Y4MGU4LCAweDE5OTk5OWEwLCAweDJiYjNiMjQwLCAweDMzMzMzMzQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMH07CitzdGF0aWMgY29uc3QgRklSX0ZJTFRFUiBmaXJfNCA9IHsweDA0MTMwNTk4LCAweDBlYmRiMDAwLCAweDFiZWNmYTYwLCAweDI2OTdhNGMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyYWFhYWE4MH07CiAKLQotc3RhdGljIGNvbnN0IEZJUl9GSUxURVIgKmNvbnN0IGZpcl90YWJsZVs1XSA9IHsKLSAgJmZpcl8wLAotICAmZmlyXzEsCi0gICZmaXJfMiwKLSAgJmZpcl8zLAotICAmZmlyXzQKLX07CitzdGF0aWMgY29uc3QgRklSX0ZJTFRFUiAqY29uc3QgZmlyX3RhYmxlWzVdID0geyZmaXJfMCwgJmZpcl8xLCAmZmlyXzIsICZmaXJfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcl80fTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCkBAIC0xODQsOTggKzIzNSwxMTEgQEAKIAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1jYWxjdWxhdGVEZXRlY3RvclZhbHVlcyhGSVhQX0RCTCAqKnF1b3RhTWF0cml4T3JpZywgICAgICAgLyohPCBNYXRyaXggaG9sZGluZyB0aGUgdG9uYWxpdHkgdmFsdWVzIG9mIHRoZSBvcmlnaW5hbC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICppbmRleFZlY3RvciwgICAgICAgICAgICAvKiE8IEluZGV4IHZlY3RvciB0byBvYnRhaW4gdGhlIHBhdGNoZWQgZGF0YS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpucmdWZWN0b3IsICAgICAgICAgICAgICAvKiE8IEVuZXJneSB2ZWN0b3IuICovCi0gICAgICAgICAgICAgICAgICAgICAgICBERVRFQ1RPUl9WQUxVRVMgKmRldGVjdG9yVmFsdWVzLCAgLyohPCBwb2ludGVyIHRvIERFVEVDVE9SX1ZBTFVFUyBzdHJ1Y3QuICovCi0gICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhcnRDaGFubmVsLCAgICAgICAgICAgICAgICAgLyohPCBTdGFydCBjaGFubmVsLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0b3BDaGFubmVsLCAgICAgICAgICAgICAgICAgIC8qITwgU3RvcCBjaGFubmVsLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXJ0SW5kZXgsICAgICAgICAgICAgICAgICAgIC8qITwgU3RhcnQgaW5kZXguICovCi0gICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RvcEluZGV4LCAgICAgICAgICAgICAgICAgICAgLyohPCBTdG9wIGluZGV4LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bWJlck9mU3Ryb25nZXN0ICAgICAgICAgICAgIC8qITwgVGhlIG51bWJlciBvZiBzb3J0ZWQgdG9uYWwgY29tcG9uZW50cyB0byBiZSBjb25zaWRlcmVkLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICBJTlQgaSx0ZW1wLCBqOworc3RhdGljIHZvaWQgY2FsY3VsYXRlRGV0ZWN0b3JWYWx1ZXMoCisgICAgRklYUF9EQkwgKipxdW90YU1hdHJpeE9yaWcsIC8qITwgTWF0cml4IGhvbGRpbmcgdGhlIHRvbmFsaXR5IHZhbHVlcyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWwuICovCisgICAgU0NIQVIgKmluZGV4VmVjdG9yLCAgICAgICAgIC8qITwgSW5kZXggdmVjdG9yIHRvIG9idGFpbiB0aGUgcGF0Y2hlZCBkYXRhLiAqLworICAgIEZJWFBfREJMICpucmdWZWN0b3IsICAgICAgICAvKiE8IEVuZXJneSB2ZWN0b3IuICovCisgICAgREVURUNUT1JfVkFMVUVTICpkZXRlY3RvclZhbHVlcywgLyohPCBwb2ludGVyIHRvIERFVEVDVE9SX1ZBTFVFUyBzdHJ1Y3QuICovCisgICAgSU5UIHN0YXJ0Q2hhbm5lbCwgICAgICAgICAgICAgICAgLyohPCBTdGFydCBjaGFubmVsLiAqLworICAgIElOVCBzdG9wQ2hhbm5lbCwgICAgICAgICAgICAgICAgIC8qITwgU3RvcCBjaGFubmVsLiAqLworICAgIElOVCBzdGFydEluZGV4LCAgICAgICAgICAgICAgICAgIC8qITwgU3RhcnQgaW5kZXguICovCisgICAgSU5UIHN0b3BJbmRleCwgICAgICAgICAgICAgICAgICAgLyohPCBTdG9wIGluZGV4LiAqLworICAgIElOVCBudW1iZXJPZlN0cm9uZ2VzdCAvKiE8IFRoZSBudW1iZXIgb2Ygc29ydGVkIHRvbmFsIGNvbXBvbmVudHMgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2lkZXJlZC4gKi8KKykgeworICBJTlQgaSwgdGVtcCwgajsKIAotICBjb25zdCBGSVhQX0RCTCogZmlsdGVyID0gKmZpcl90YWJsZVtJTlZGX1NNT09USElOR19MRU5HVEhdOworICBjb25zdCBGSVhQX0RCTCAqZmlsdGVyID0gKmZpcl90YWJsZVtJTlZGX1NNT09USElOR19MRU5HVEhdOwogICBGSVhQX0RCTCBvcmlnUXVvdGFNZWFuU3Ryb25nZXN0LCBzYnJRdW90YU1lYW5TdHJvbmdlc3Q7CiAgIEZJWFBfREJMIG9yaWdRdW90YSwgc2JyUXVvdGE7CiAgIEZJWFBfREJMIGludkluZGV4LCBpbnZDaGFubmVsLCBpbnZUZW1wOwogICBGSVhQX0RCTCBxdW90YVZlY09yaWdbNjRdLCBxdW90YVZlY1Nicls2NF07CiAKLSAgRkRLbWVtY2xlYXIocXVvdGFWZWNPcmlnLDY0KnNpemVvZihGSVhQX0RCTCkpOwotICBGREttZW1jbGVhcihxdW90YVZlY1Niciw2NCpzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY2xlYXIocXVvdGFWZWNPcmlnLCA2NCAqIHNpemVvZihGSVhQX0RCTCkpOworICBGREttZW1jbGVhcihxdW90YVZlY1NiciwgNjQgKiBzaXplb2YoRklYUF9EQkwpKTsKIAotICBpbnZJbmRleCA9IEdldEludkludChzdG9wSW5kZXgtc3RhcnRJbmRleCk7Ci0gIGludkNoYW5uZWwgPSBHZXRJbnZJbnQoc3RvcENoYW5uZWwtc3RhcnRDaGFubmVsKTsKKyAgaW52SW5kZXggPSBHZXRJbnZJbnQoc3RvcEluZGV4IC0gc3RhcnRJbmRleCk7CisgIGludkNoYW5uZWwgPSBHZXRJbnZJbnQoc3RvcENoYW5uZWwgLSBzdGFydENoYW5uZWwpOwogCiAgIC8qCi0gICBDYWxjdWxhdGUgdGhlIG1lYW4gdmFsdWUsIG92ZXIgdGhlIGN1cnJlbnQgdGltZSBzZWdtZW50LCBmb3IgdGhlIG9yaWdpbmFsLCB0aGUgSEZSCi0gICBhbmQgdGhlIGRpZmZlcmVuY2UsIG92ZXIgYWxsIGNoYW5uZWxzIGluIHRoZSBjdXJyZW50IGZyZXF1ZW5jeSByYW5nZS4KKyAgIENhbGN1bGF0ZSB0aGUgbWVhbiB2YWx1ZSwgb3ZlciB0aGUgY3VycmVudCB0aW1lIHNlZ21lbnQsIGZvciB0aGUgb3JpZ2luYWwsCisgICB0aGUgSEZSIGFuZCB0aGUgZGlmZmVyZW5jZSwgb3ZlciBhbGwgY2hhbm5lbHMgaW4gdGhlIGN1cnJlbnQgZnJlcXVlbmN5IHJhbmdlLgogICAgTk9URTogdGhlIGF2ZXJhZ2luZyBpcyBkb25lIG9uIHRoZSB2YWx1ZXMgcXVvdGEvKDEgLSBxdW90YSArIFJFTEFYQVRJT04pLgogICAgKi8KIAogICAvKiBUaGUgb3JpZ2luYWwsIHRoZSBzYnIgc2lnbmFsIGFuZCB0aGUgdG90YWwgZW5lcmd5ICovCiAgIGRldGVjdG9yVmFsdWVzLT5hdmdOcmcgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgZm9yKGo9c3RhcnRJbmRleDsgajxzdG9wSW5kZXg7IGorKykgewotICAgIGZvcihpPXN0YXJ0Q2hhbm5lbDsgaTxzdG9wQ2hhbm5lbDsgaSsrKSB7CisgIGZvciAoaiA9IHN0YXJ0SW5kZXg7IGogPCBzdG9wSW5kZXg7IGorKykgeworICAgIGZvciAoaSA9IHN0YXJ0Q2hhbm5lbDsgaSA8IHN0b3BDaGFubmVsOyBpKyspIHsKICAgICAgIHF1b3RhVmVjT3JpZ1tpXSArPSBmTXVsdChxdW90YU1hdHJpeE9yaWdbal1baV0sIGludkluZGV4KTsKIAotICAgICAgaWYoaW5kZXhWZWN0b3JbaV0gIT0gLTEpCisgICAgICBpZiAoaW5kZXhWZWN0b3JbaV0gIT0gLTEpCiAgICAgICAgIHF1b3RhVmVjU2JyW2ldICs9IGZNdWx0KHF1b3RhTWF0cml4T3JpZ1tqXVtpbmRleFZlY3RvcltpXV0sIGludkluZGV4KTsKICAgICB9CiAgICAgZGV0ZWN0b3JWYWx1ZXMtPmF2Z05yZyArPSBmTXVsdChucmdWZWN0b3Jbal0sIGludkluZGV4KTsKICAgfQogCiAgIC8qCi0gICBDYWxjdWxhdGUgdGhlIG1lYW4gdmFsdWUsIG92ZXIgdGhlIGN1cnJlbnQgZnJlcXVlbmN5IHJhbmdlLCBmb3IgdGhlIG9yaWdpbmFsLCB0aGUgSEZSCi0gICBhbmQgdGhlIGRpZmZlcmVuY2UuIEFsc28gY2FsY3VsYXRlIHRoZSBzYW1lIG1lYW4gdmFsdWVzIGZvciB0aGUgdGhyZWUgdmVjdG9ycywgYnV0IG9ubHkKLSAgIGluY2x1ZGVpbmcgdGhlIHggc3Ryb25nZXN0IGNvcG1wb25lbnRzLgorICAgQ2FsY3VsYXRlIHRoZSBtZWFuIHZhbHVlLCBvdmVyIHRoZSBjdXJyZW50IGZyZXF1ZW5jeSByYW5nZSwgZm9yIHRoZSBvcmlnaW5hbCwKKyAgIHRoZSBIRlIgYW5kIHRoZSBkaWZmZXJlbmNlLiBBbHNvIGNhbGN1bGF0ZSB0aGUgc2FtZSBtZWFuIHZhbHVlcyBmb3IgdGhlIHRocmVlCisgICB2ZWN0b3JzLCBidXQgb25seSBpbmNsdWRlaW5nIHRoZSB4IHN0cm9uZ2VzdCBjb3BtcG9uZW50cy4KICAgICovCiAKICAgb3JpZ1F1b3RhID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gIHNiclF1b3RhICA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICBmb3IoaT1zdGFydENoYW5uZWw7IGk8c3RvcENoYW5uZWw7IGkrKykgeworICBzYnJRdW90YSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICBmb3IgKGkgPSBzdGFydENoYW5uZWw7IGkgPCBzdG9wQ2hhbm5lbDsgaSsrKSB7CiAgICAgb3JpZ1F1b3RhICs9IGZNdWx0RGl2MihxdW90YVZlY09yaWdbaV0sIGludkNoYW5uZWwpOwotICAgIHNiclF1b3RhICArPSBmTXVsdERpdjIocXVvdGFWZWNTYnJbaV0sIGludkNoYW5uZWwpOworICAgIHNiclF1b3RhICs9IGZNdWx0RGl2MihxdW90YVZlY1NicltpXSwgaW52Q2hhbm5lbCk7CiAgIH0KIAogICAvKgogICAgQ2FsY3VsYXRlIHRoZSBtZWFuIHZhbHVlIGZvciB0aGUgeCBzdHJvbmdlc3QgY29tcG9uZW50cwogICAqLwotICBGREtzYnJFbmNfU2hlbGxzb3J0X2ZyYWN0KHF1b3RhVmVjT3JpZytzdGFydENoYW5uZWwsc3RvcENoYW5uZWwtc3RhcnRDaGFubmVsKTsKLSAgRkRLc2JyRW5jX1NoZWxsc29ydF9mcmFjdChxdW90YVZlY1NicitzdGFydENoYW5uZWwsc3RvcENoYW5uZWwtc3RhcnRDaGFubmVsKTsKKyAgRkRLc2JyRW5jX1NoZWxsc29ydF9mcmFjdChxdW90YVZlY09yaWcgKyBzdGFydENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcENoYW5uZWwgLSBzdGFydENoYW5uZWwpOworICBGREtzYnJFbmNfU2hlbGxzb3J0X2ZyYWN0KHF1b3RhVmVjU2JyICsgc3RhcnRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BDaGFubmVsIC0gc3RhcnRDaGFubmVsKTsKIAogICBvcmlnUXVvdGFNZWFuU3Ryb25nZXN0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gIHNiclF1b3RhTWVhblN0cm9uZ2VzdCAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgc2JyUXVvdGFNZWFuU3Ryb25nZXN0ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKICAgdGVtcCA9IG1pbihzdG9wQ2hhbm5lbCAtIHN0YXJ0Q2hhbm5lbCwgbnVtYmVyT2ZTdHJvbmdlc3QpOwogICBpbnZUZW1wID0gR2V0SW52SW50KHRlbXApOwogCi0gIGZvcihpPTA7IGk8dGVtcDsgaSsrKSB7Ci0gICAgb3JpZ1F1b3RhTWVhblN0cm9uZ2VzdCArPSBmTXVsdERpdjIocXVvdGFWZWNPcmlnW2kgKyBzdG9wQ2hhbm5lbCAtIHRlbXBdLCBpbnZUZW1wKTsKLSAgICBzYnJRdW90YU1lYW5TdHJvbmdlc3QgICs9IGZNdWx0RGl2MihxdW90YVZlY1NicltpICsgc3RvcENoYW5uZWwgLSB0ZW1wXSwgaW52VGVtcCk7CisgIGZvciAoaSA9IDA7IGkgPCB0ZW1wOyBpKyspIHsKKyAgICBvcmlnUXVvdGFNZWFuU3Ryb25nZXN0ICs9CisgICAgICAgIGZNdWx0RGl2MihxdW90YVZlY09yaWdbaSArIHN0b3BDaGFubmVsIC0gdGVtcF0sIGludlRlbXApOworICAgIHNiclF1b3RhTWVhblN0cm9uZ2VzdCArPQorICAgICAgICBmTXVsdERpdjIocXVvdGFWZWNTYnJbaSArIHN0b3BDaGFubmVsIC0gdGVtcF0sIGludlRlbXApOwogICB9CiAKICAgLyoKICAgIFRoZSB2YWx1ZSBmb3IgdGhlIHN0cm9uZ2VzdCBjb21wb25lbnQKICAgKi8KICAgZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1heCA9IHF1b3RhVmVjT3JpZ1tzdG9wQ2hhbm5lbCAtIDFdOwotICBkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNYXggID0gcXVvdGFWZWNTYnJbc3RvcENoYW5uZWwgLSAxXTsKKyAgZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWF4ID0gcXVvdGFWZWNTYnJbc3RvcENoYW5uZWwgLSAxXTsKIAogICAvKgogICAgQnVmZmVyIHZhbHVlcwogICAqLwotICBGREttZW1tb3ZlKGRldGVjdG9yVmFsdWVzLT5vcmlnUXVvdGFNZWFuLCBkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhbiArIDEsIElOVkZfU01PT1RISU5HX0xFTkdUSCpzaXplb2YoRklYUF9EQkwpKTsKLSAgRkRLbWVtbW92ZShkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuLCBkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuICsgMSwgSU5WRl9TTU9PVEhJTkdfTEVOR1RIKnNpemVvZihGSVhQX0RCTCkpOwotICBGREttZW1tb3ZlKGRldGVjdG9yVmFsdWVzLT5vcmlnUXVvdGFNZWFuU3Ryb25nZXN0LCBkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhblN0cm9uZ2VzdCArIDEsIElOVkZfU01PT1RISU5HX0xFTkdUSCpzaXplb2YoRklYUF9EQkwpKTsKLSAgRkRLbWVtbW92ZShkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuU3Ryb25nZXN0LCBkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuU3Ryb25nZXN0ICsgMSwgSU5WRl9TTU9PVEhJTkdfTEVOR1RIKnNpemVvZihGSVhQX0RCTCkpOworICBGREttZW1tb3ZlKGRldGVjdG9yVmFsdWVzLT5vcmlnUXVvdGFNZWFuLCBkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhbiArIDEsCisgICAgICAgICAgICAgSU5WRl9TTU9PVEhJTkdfTEVOR1RIICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbW1vdmUoZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhbiwgZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhbiArIDEsCisgICAgICAgICAgICAgSU5WRl9TTU9PVEhJTkdfTEVOR1RIICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbW1vdmUoZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW5TdHJvbmdlc3QsCisgICAgICAgICAgICAgZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW5TdHJvbmdlc3QgKyAxLAorICAgICAgICAgICAgIElOVkZfU01PT1RISU5HX0xFTkdUSCAqIHNpemVvZihGSVhQX0RCTCkpOworICBGREttZW1tb3ZlKGRldGVjdG9yVmFsdWVzLT5zYnJRdW90YU1lYW5TdHJvbmdlc3QsCisgICAgICAgICAgICAgZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhblN0cm9uZ2VzdCArIDEsCisgICAgICAgICAgICAgSU5WRl9TTU9PVEhJTkdfTEVOR1RIICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKLSAgZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW5bSU5WRl9TTU9PVEhJTkdfTEVOR1RIXSAgICAgICAgICA9IG9yaWdRdW90YTw8MTsKLSAgZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhbltJTlZGX1NNT09USElOR19MRU5HVEhdICAgICAgICAgICA9IHNiclF1b3RhPDwxOwotICBkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhblN0cm9uZ2VzdFtJTlZGX1NNT09USElOR19MRU5HVEhdID0gb3JpZ1F1b3RhTWVhblN0cm9uZ2VzdDw8MTsKLSAgZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhblN0cm9uZ2VzdFtJTlZGX1NNT09USElOR19MRU5HVEhdICA9IHNiclF1b3RhTWVhblN0cm9uZ2VzdDw8MTsKKyAgZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW5bSU5WRl9TTU9PVEhJTkdfTEVOR1RIXSA9IG9yaWdRdW90YSA8PCAxOworICBkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuW0lOVkZfU01PT1RISU5HX0xFTkdUSF0gPSBzYnJRdW90YSA8PCAxOworICBkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhblN0cm9uZ2VzdFtJTlZGX1NNT09USElOR19MRU5HVEhdID0KKyAgICAgIG9yaWdRdW90YU1lYW5TdHJvbmdlc3QgPDwgMTsKKyAgZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhblN0cm9uZ2VzdFtJTlZGX1NNT09USElOR19MRU5HVEhdID0KKyAgICAgIHNiclF1b3RhTWVhblN0cm9uZ2VzdCA8PCAxOwogCiAgIC8qCiAgICBGaWx0ZXIgdmFsdWVzCkBAIC0yODUsMTEgKzM0OSwxNSBAQAogICBkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhblN0cm9uZ2VzdEZpbHQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhblN0cm9uZ2VzdEZpbHQgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKIAotICBmb3IoaT0wO2k8SU5WRl9TTU9PVEhJTkdfTEVOR1RIKzE7aSsrKSB7Ci0gICAgZGV0ZWN0b3JWYWx1ZXMtPm9yaWdRdW90YU1lYW5GaWx0ICs9IGZNdWx0KGRldGVjdG9yVmFsdWVzLT5vcmlnUXVvdGFNZWFuW2ldLCBmaWx0ZXJbaV0pOwotICAgIGRldGVjdG9yVmFsdWVzLT5zYnJRdW90YU1lYW5GaWx0ICArPSBmTXVsdChkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuW2ldLCBmaWx0ZXJbaV0pOwotICAgIGRldGVjdG9yVmFsdWVzLT5vcmlnUXVvdGFNZWFuU3Ryb25nZXN0RmlsdCArPSBmTXVsdChkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhblN0cm9uZ2VzdFtpXSwgZmlsdGVyW2ldKTsKLSAgICBkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuU3Ryb25nZXN0RmlsdCAgKz0gZk11bHQoZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhblN0cm9uZ2VzdFtpXSwgZmlsdGVyW2ldKTsKKyAgZm9yIChpID0gMDsgaSA8IElOVkZfU01PT1RISU5HX0xFTkdUSCArIDE7IGkrKykgeworICAgIGRldGVjdG9yVmFsdWVzLT5vcmlnUXVvdGFNZWFuRmlsdCArPQorICAgICAgICBmTXVsdChkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhbltpXSwgZmlsdGVyW2ldKTsKKyAgICBkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuRmlsdCArPQorICAgICAgICBmTXVsdChkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuW2ldLCBmaWx0ZXJbaV0pOworICAgIGRldGVjdG9yVmFsdWVzLT5vcmlnUXVvdGFNZWFuU3Ryb25nZXN0RmlsdCArPQorICAgICAgICBmTXVsdChkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhblN0cm9uZ2VzdFtpXSwgZmlsdGVyW2ldKTsKKyAgICBkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuU3Ryb25nZXN0RmlsdCArPQorICAgICAgICBmTXVsdChkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuU3Ryb25nZXN0W2ldLCBmaWx0ZXJbaV0pOwogICB9CiB9CiAKQEAgLTMwMywyOSArMzcxLDI4IEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgSU5UCi1maW5kUmVnaW9uKEZJWFBfREJMIGN1cnJWYWwsICAgICAgICAvKiE8IFRoZSBjdXJyZW50IHZhbHVlLiAqLwotICAgICAgICAgICBjb25zdCBGSVhQX0RCTCAqYm9yZGVycywgLyohPCBUaGUgYm9yZGVyIG9mIHRoZSByZWdpb25zLiAqLwotICAgICAgICAgICBjb25zdCBJTlQgbnVtQm9yZGVycyAgICAgLyohPCBUaGUgbnVtYmVyIG9mIGJvcmRlcnMuICovCi0gICAgICAgICAgICkKLXsKK3N0YXRpYyBJTlQgZmluZFJlZ2lvbigKKyAgICBGSVhQX0RCTCBjdXJyVmFsLCAgICAgICAgLyohPCBUaGUgY3VycmVudCB2YWx1ZS4gKi8KKyAgICBjb25zdCBGSVhQX0RCTCAqYm9yZGVycywgLyohPCBUaGUgYm9yZGVyIG9mIHRoZSByZWdpb25zLiAqLworICAgIGNvbnN0IElOVCBudW1Cb3JkZXJzICAgICAvKiE8IFRoZSBudW1iZXIgb2YgYm9yZGVycy4gKi8KKykgewogICBJTlQgaTsKIAotICBpZihjdXJyVmFsIDwgYm9yZGVyc1swXSl7CisgIGlmIChjdXJyVmFsIDwgYm9yZGVyc1swXSkgewogICAgIHJldHVybiAwOwogICB9CiAKLSAgZm9yKGkgPSAxOyBpIDwgbnVtQm9yZGVyczsgaSsrKXsKLSAgICBpZiggY3VyclZhbCA+PSBib3JkZXJzW2ktMV0gJiYgY3VyclZhbCA8IGJvcmRlcnNbaV0peworICBmb3IgKGkgPSAxOyBpIDwgbnVtQm9yZGVyczsgaSsrKSB7CisgICAgaWYgKGN1cnJWYWwgPj0gYm9yZGVyc1tpIC0gMV0gJiYgY3VyclZhbCA8IGJvcmRlcnNbaV0pIHsKICAgICAgIHJldHVybiBpOwogICAgIH0KICAgfQogCi0gIGlmKGN1cnJWYWwgPj0gYm9yZGVyc1tudW1Cb3JkZXJzLTFdKXsKKyAgaWYgKGN1cnJWYWwgPj0gYm9yZGVyc1tudW1Cb3JkZXJzIC0gMV0pIHsKICAgICByZXR1cm4gbnVtQm9yZGVyczsKICAgfQogCi0gIHJldHVybiAwOyAgLyogV2UgbmV2ZXIgZ2V0IGhlcmUsIGl0J3MganVzdCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4qLworICByZXR1cm4gMDsgLyogV2UgbmV2ZXIgZ2V0IGhlcmUsIGl0J3MganVzdCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4qLwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMzcsMjUgKzQwNCwyMiBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVkZfTU9ERQotZGVjaXNpb25BbGdvcml0aG0oY29uc3QgREVURUNUT1JfUEFSQU1FVEVSUyAqZGV0ZWN0b3JQYXJhbXMsICAgICAvKiE8IFN0cnVjdCB3aXRoIHRoZSBkZXRlY3RvciBwYXJhbWV0ZXJzLiAqLwotICAgICAgICAgICAgICAgICAgREVURUNUT1JfVkFMVUVTICpkZXRlY3RvclZhbHVlcywgICAgICAgICAgICAgICAvKiE8IFN0cnVjdCB3aXRoIHRoZSBkZXRlY3RvciB2YWx1ZXMuICovCi0gICAgICAgICAgICAgICAgICBJTlQgdHJhbnNpZW50RmxhZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRmxhZyBpbmRpY2F0aW5nIGlmIHRoZXJlIGlzIGEgdHJhbnNpZW50IHByZXNlbnQuKi8KLSAgICAgICAgICAgICAgICAgIElOVCogcHJldlJlZ2lvblNiciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgcHJldmlvdXMgcmVnaW9uIGluIHdoaWNoIHRoZSBTYnIgdmFsdWUgd2FzLiAqLwotICAgICAgICAgICAgICAgICAgSU5UKiBwcmV2UmVnaW9uT3JpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBwcmV2aW91cyByZWdpb24gaW4gd2hpY2ggdGhlIE9yaWcgdmFsdWUgd2FzLiAqLwotICAgICAgICAgICAgICAgICAgKQoteworc3RhdGljIElOVkZfTU9ERSBkZWNpc2lvbkFsZ29yaXRobSgKKyAgICBjb25zdCBERVRFQ1RPUl9QQVJBTUVURVJTCisgICAgICAgICpkZXRlY3RvclBhcmFtcywgLyohPCBTdHJ1Y3Qgd2l0aCB0aGUgZGV0ZWN0b3IgcGFyYW1ldGVycy4gKi8KKyAgICBERVRFQ1RPUl9WQUxVRVMgKmRldGVjdG9yVmFsdWVzLCAvKiE8IFN0cnVjdCB3aXRoIHRoZSBkZXRlY3RvciB2YWx1ZXMuICovCisgICAgSU5UIHRyYW5zaWVudEZsYWcsICAvKiE8IEZsYWcgaW5kaWNhdGluZyBpZiB0aGVyZSBpcyBhIHRyYW5zaWVudCBwcmVzZW50LiovCisgICAgSU5UICpwcmV2UmVnaW9uU2JyLCAvKiE8IFRoZSBwcmV2aW91cyByZWdpb24gaW4gd2hpY2ggdGhlIFNiciB2YWx1ZSB3YXMuICovCisgICAgSU5UICpwcmV2UmVnaW9uT3JpZyAvKiE8IFRoZSBwcmV2aW91cyByZWdpb24gaW4gd2hpY2ggdGhlIE9yaWcgdmFsdWUgd2FzLiAqLworKSB7CiAgIElOVCBpbnZGaWx0TGV2ZWwsIHJlZ2lvblNiciwgcmVnaW9uT3JpZywgcmVnaW9uTnJnOwogCiAgIC8qCiAgICBDdXJyZW50IHRocmVzaG9sZHMuCiAgICAqLwotICBjb25zdCBGSVhQX0RCTCAqcXVhbnRTdGVwc1NiciAgPSBkZXRlY3RvclBhcmFtcy0+cXVhbnRTdGVwc1NicjsKLSAgY29uc3QgRklYUF9EQkwgKnF1YW50U3RlcHNPcmlnID0gZGV0ZWN0b3JQYXJhbXMtPnF1YW50U3RlcHNPcmlnOwotICBjb25zdCBGSVhQX0RCTCAqbnJnQm9yZGVycyAgICAgPSBkZXRlY3RvclBhcmFtcy0+bnJnQm9yZGVyczsKLSAgY29uc3QgSU5UIG51bVJlZ2lvbnNTYnIgICAgID0gZGV0ZWN0b3JQYXJhbXMtPm51bVJlZ2lvbnNTYnI7Ci0gIGNvbnN0IElOVCBudW1SZWdpb25zT3JpZyAgICA9IGRldGVjdG9yUGFyYW1zLT5udW1SZWdpb25zT3JpZzsKLSAgY29uc3QgSU5UIG51bVJlZ2lvbnNOcmcgICAgID0gZGV0ZWN0b3JQYXJhbXMtPm51bVJlZ2lvbnNOcmc7CisgIGNvbnN0IElOVCBudW1SZWdpb25zU2JyID0gZGV0ZWN0b3JQYXJhbXMtPm51bVJlZ2lvbnNTYnI7CisgIGNvbnN0IElOVCBudW1SZWdpb25zT3JpZyA9IGRldGVjdG9yUGFyYW1zLT5udW1SZWdpb25zT3JpZzsKKyAgY29uc3QgSU5UIG51bVJlZ2lvbnNOcmcgPSBkZXRlY3RvclBhcmFtcy0+bnVtUmVnaW9uc05yZzsKIAogICBGSVhQX0RCTCBxdWFudFN0ZXBzU2JyVG1wW01BWF9OVU1fUkVHSU9OU107CiAgIEZJWFBfREJMIHF1YW50U3RlcHNPcmlnVG1wW01BWF9OVU1fUkVHSU9OU107CkBAIC0zNjcsNDAgKzQzMSw2NSBAQAogICBGSVhQX0RCTCBzYnJRdW90YU1lYW5GaWx0OwogICBGSVhQX0RCTCBucmc7CiAKLSAgLyogMC4zNzUgPSAzLjAgLyA4LjA7IDAuMzExNDMwNzU4ODkgPSBsb2cyKFJFTEFYQVRJT04pLzY0LjA7IDAuNjI1ID0gbG9nKDE2KS82NC4wOyAwLjY4NzUgPSA0NC82NC4wICovCi0gIG9yaWdRdW90YU1lYW5GaWx0ID0gKGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgyLmYqMC4zNzVmKSwgKEZJWFBfREJMKShDYWxjTGREYXRhKG1heChkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhbkZpbHQsKEZJWFBfREJMKTEpKSArIEZMMkZYQ09OU1RfREJMKDAuMzExNDMwNzU4ODlmKSkpKSA8PCAwOyAgLyogc2NhbGVkIGJ5IDEvMl45ICovCi0gIHNiclF1b3RhTWVhbkZpbHQgID0gKGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgyLmYqMC4zNzVmKSwgKEZJWFBfREJMKShDYWxjTGREYXRhKG1heChkZXRlY3RvclZhbHVlcy0+c2JyUXVvdGFNZWFuRmlsdCwoRklYUF9EQkwpMSkpICsgRkwyRlhDT05TVF9EQkwoMC4zMTE0MzA3NTg4OWYpKSkpIDw8IDA7ICAgLyogc2NhbGVkIGJ5IDEvMl45ICovCi0gIC8qIElmIGVuZXJneSBpcyB6ZXJvIHRoZW4gd2Ugd2lsbCBnZXQgZGlmZmVyZW50IHJlc3VsdHMgZm9yIGRpZmZlcmVudCB3b3JkIGxlbmd0aHMuICovCi0gIG5yZyAgICAgICAgICAgICAgID0gKGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgyLmYqMC4zNzVmKSwgKEZJWFBfREJMKShDYWxjTGREYXRhKGRldGVjdG9yVmFsdWVzLT5hdmdOcmcrKEZJWFBfREJMKTEpICsgRkwyRlhDT05TVF9EQkwoMC4wNjI1ZikgKyBGTDJGWENPTlNUX0RCTCgwLjY4NzVmKSkpKSA8PCAwOyAgICAgLyogc2NhbGVkIGJ5IDEvMl44OyAyXjQ0IC0+IHFtZiBlbmVyZ3kgc2NhbGUgKi8KKyAgLyogMC4zNzUgPSAzLjAgLyA4LjA7IDAuMzExNDMwNzU4ODkgPSBsb2cyKFJFTEFYQVRJT04pLzY0LjA7IDAuNjI1ID0KKyAgICogbG9nKDE2KS82NC4wOyAwLjY4NzUgPSA0NC82NC4wICovCisgIG9yaWdRdW90YU1lYW5GaWx0ID0KKyAgICAgIChmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMi5mICogMC4zNzVmKSwKKyAgICAgICAgICAgICAgICAgKEZJWFBfREJMKShDYWxjTGREYXRhKG1heChkZXRlY3RvclZhbHVlcy0+b3JpZ1F1b3RhTWVhbkZpbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKTEpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4zMTE0MzA3NTg4OWYpKSkpCisgICAgICA8PCAwOyAvKiBzY2FsZWQgYnkgMS8yXjkgKi8KKyAgc2JyUXVvdGFNZWFuRmlsdCA9CisgICAgICAoZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDIuZiAqIDAuMzc1ZiksCisgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoQ2FsY0xkRGF0YShtYXgoZGV0ZWN0b3JWYWx1ZXMtPnNiclF1b3RhTWVhbkZpbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKTEpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4zMTE0MzA3NTg4OWYpKSkpCisgICAgICA8PCAwOyAvKiBzY2FsZWQgYnkgMS8yXjkgKi8KKyAgLyogSWYgZW5lcmd5IGlzIHplcm8gdGhlbiB3ZSB3aWxsIGdldCBkaWZmZXJlbnQgcmVzdWx0cyBmb3IgZGlmZmVyZW50IHdvcmQKKyAgICogbGVuZ3Rocy4gKi8KKyAgbnJnID0KKyAgICAgIChmTXVsdERpdjIoRkwyRlhDT05TVF9EQkwoMi5mICogMC4zNzVmKSwKKyAgICAgICAgICAgICAgICAgKEZJWFBfREJMKShDYWxjTGREYXRhKGRldGVjdG9yVmFsdWVzLT5hdmdOcmcgKyAoRklYUF9EQkwpMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMDYyNWYpICsgRkwyRlhDT05TVF9EQkwoMC42ODc1ZikpKSkKKyAgICAgIDw8IDA7IC8qIHNjYWxlZCBieSAxLzJeODsgMl40NCAtPiBxbWYgZW5lcmd5IHNjYWxlICovCiAKLSAgRkRLbWVtY3B5KHF1YW50U3RlcHNTYnJUbXAscXVhbnRTdGVwc1NicixudW1SZWdpb25zU2JyKnNpemVvZihGSVhQX0RCTCkpOwotICBGREttZW1jcHkocXVhbnRTdGVwc09yaWdUbXAscXVhbnRTdGVwc09yaWcsbnVtUmVnaW9uc09yaWcqc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNweShxdWFudFN0ZXBzU2JyVG1wLCBkZXRlY3RvclBhcmFtcy0+cXVhbnRTdGVwc1NiciwKKyAgICAgICAgICAgIG51bVJlZ2lvbnNTYnIgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY3B5KHF1YW50U3RlcHNPcmlnVG1wLCBkZXRlY3RvclBhcmFtcy0+cXVhbnRTdGVwc09yaWcsCisgICAgICAgICAgICBudW1SZWdpb25zT3JpZyAqIHNpemVvZihGSVhQX0RCTCkpOwogCi0gIGlmKCpwcmV2UmVnaW9uU2JyIDwgbnVtUmVnaW9uc1NicikKLSAgICBxdWFudFN0ZXBzU2JyVG1wWypwcmV2UmVnaW9uU2JyXSA9IHF1YW50U3RlcHNTYnJbKnByZXZSZWdpb25TYnJdICsgaHlzdGVyZXNpczsKLSAgaWYoKnByZXZSZWdpb25TYnIgPiAwKQotICAgIHF1YW50U3RlcHNTYnJUbXBbKnByZXZSZWdpb25TYnIgLSAxXSA9IHF1YW50U3RlcHNTYnJbKnByZXZSZWdpb25TYnIgLSAxXSAtIGh5c3RlcmVzaXM7CisgIGlmICgqcHJldlJlZ2lvblNiciA8IG51bVJlZ2lvbnNTYnIpCisgICAgcXVhbnRTdGVwc1NiclRtcFsqcHJldlJlZ2lvblNicl0gPQorICAgICAgICBkZXRlY3RvclBhcmFtcy0+cXVhbnRTdGVwc1NiclsqcHJldlJlZ2lvblNicl0gKyBoeXN0ZXJlc2lzOworICBpZiAoKnByZXZSZWdpb25TYnIgPiAwKQorICAgIHF1YW50U3RlcHNTYnJUbXBbKnByZXZSZWdpb25TYnIgLSAxXSA9CisgICAgICAgIGRldGVjdG9yUGFyYW1zLT5xdWFudFN0ZXBzU2JyWypwcmV2UmVnaW9uU2JyIC0gMV0gLSBoeXN0ZXJlc2lzOwogCi0gIGlmKCpwcmV2UmVnaW9uT3JpZyA8IG51bVJlZ2lvbnNPcmlnKQotICAgIHF1YW50U3RlcHNPcmlnVG1wWypwcmV2UmVnaW9uT3JpZ10gPSBxdWFudFN0ZXBzT3JpZ1sqcHJldlJlZ2lvbk9yaWddICsgaHlzdGVyZXNpczsKLSAgaWYoKnByZXZSZWdpb25PcmlnID4gMCkKLSAgICBxdWFudFN0ZXBzT3JpZ1RtcFsqcHJldlJlZ2lvbk9yaWcgLSAxXSA9IHF1YW50U3RlcHNPcmlnWypwcmV2UmVnaW9uT3JpZyAtIDFdIC0gaHlzdGVyZXNpczsKKyAgaWYgKCpwcmV2UmVnaW9uT3JpZyA8IG51bVJlZ2lvbnNPcmlnKQorICAgIHF1YW50U3RlcHNPcmlnVG1wWypwcmV2UmVnaW9uT3JpZ10gPQorICAgICAgICBkZXRlY3RvclBhcmFtcy0+cXVhbnRTdGVwc09yaWdbKnByZXZSZWdpb25PcmlnXSArIGh5c3RlcmVzaXM7CisgIGlmICgqcHJldlJlZ2lvbk9yaWcgPiAwKQorICAgIHF1YW50U3RlcHNPcmlnVG1wWypwcmV2UmVnaW9uT3JpZyAtIDFdID0KKyAgICAgICAgZGV0ZWN0b3JQYXJhbXMtPnF1YW50U3RlcHNPcmlnWypwcmV2UmVnaW9uT3JpZyAtIDFdIC0gaHlzdGVyZXNpczsKIAotICByZWdpb25TYnIgID0gZmluZFJlZ2lvbihzYnJRdW90YU1lYW5GaWx0LCBxdWFudFN0ZXBzU2JyVG1wLCBudW1SZWdpb25zU2JyKTsKKyAgcmVnaW9uU2JyID0gZmluZFJlZ2lvbihzYnJRdW90YU1lYW5GaWx0LCBxdWFudFN0ZXBzU2JyVG1wLCBudW1SZWdpb25zU2JyKTsKICAgcmVnaW9uT3JpZyA9IGZpbmRSZWdpb24ob3JpZ1F1b3RhTWVhbkZpbHQsIHF1YW50U3RlcHNPcmlnVG1wLCBudW1SZWdpb25zT3JpZyk7Ci0gIHJlZ2lvbk5yZyAgPSBmaW5kUmVnaW9uKG5yZyxucmdCb3JkZXJzLG51bVJlZ2lvbnNOcmcpOworICByZWdpb25OcmcgPSBmaW5kUmVnaW9uKG5yZywgZGV0ZWN0b3JQYXJhbXMtPm5yZ0JvcmRlcnMsIG51bVJlZ2lvbnNOcmcpOwogCiAgICpwcmV2UmVnaW9uU2JyID0gcmVnaW9uU2JyOwogICAqcHJldlJlZ2lvbk9yaWcgPSByZWdpb25PcmlnOwogCiAgIC8qIFVzZSBkaWZmZXJlbnQgc2V0dGluZ3MgaWYgYSB0cmFuc2llbnQgaXMgcHJlc2VudCovCi0gIGludkZpbHRMZXZlbCA9ICh0cmFuc2llbnRGbGFnID09IDEpID8gZGV0ZWN0b3JQYXJhbXMtPnJlZ2lvblNwYWNlVHJhbnNpZW50W3JlZ2lvblNicl1bcmVnaW9uT3JpZ10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXRlY3RvclBhcmFtcy0+cmVnaW9uU3BhY2VbcmVnaW9uU2JyXVtyZWdpb25PcmlnXTsKKyAgaW52RmlsdExldmVsID0KKyAgICAgICh0cmFuc2llbnRGbGFnID09IDEpCisgICAgICAgICAgPyBkZXRlY3RvclBhcmFtcy0+cmVnaW9uU3BhY2VUcmFuc2llbnRbcmVnaW9uU2JyXVtyZWdpb25PcmlnXQorICAgICAgICAgIDogZGV0ZWN0b3JQYXJhbXMtPnJlZ2lvblNwYWNlW3JlZ2lvblNicl1bcmVnaW9uT3JpZ107CiAKICAgLyogQ29tcGVuc2F0ZSBmb3IgbG93IGVuZXJneS4qLwotICBpbnZGaWx0TGV2ZWwgPSBtYXgoaW52RmlsdExldmVsICsgZGV0ZWN0b3JQYXJhbXMtPkVuZXJneUNvbXBGYWN0b3JbcmVnaW9uTnJnXSwwKTsKKyAgaW52RmlsdExldmVsID0KKyAgICAgIG1heChpbnZGaWx0TGV2ZWwgKyBkZXRlY3RvclBhcmFtcy0+RW5lcmd5Q29tcEZhY3RvcltyZWdpb25OcmddLCAwKTsKIAotICByZXR1cm4gKElOVkZfTU9ERSkgKGludkZpbHRMZXZlbCk7CisgIHJldHVybiAoSU5WRl9NT0RFKShpbnZGaWx0TGV2ZWwpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MTYsNDcgKzUwNSwzOSBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotRkRLc2JyRW5jX3FtZkludmVyc2VGaWx0ZXJpbmdEZXRlY3RvcihIQU5ETEVfU0JSX0lOVl9GSUxUX0VTVCBoSW52RmlsdCwgIC8qITwgSGFuZGxlIHRvIHRoZSBTQlJfSU5WX0ZJTFRfRVNUIHN0cnVjdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnF1b3RhTWF0cml4LCAgICAgICAgICAgIC8qITwgVGhlIG1hdHJpeCBob2xkaW5nIHRoZSB0b25hbGl0eSB2YWx1ZXMgb2YgdGhlIG9yaWdpbmFsLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpucmdWZWN0b3IsICAgICAgICAgICAgICAgLyohPCBUaGUgZW5lcmd5IHZlY3Rvci4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqaW5kZXhWZWN0b3IsICAgICAgICAgICAgIC8qITwgSW5kZXggdmVjdG9yIHRvIG9idGFpbiB0aGUgcGF0Y2hlZCBkYXRhLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdGFydEluZGV4LCAgICAgICAgICAgICAgICAgICAgLyohPCBTdGFydCBpbmRleC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RvcEluZGV4LCAgICAgICAgICAgICAgICAgICAgIC8qITwgU3RvcCBpbmRleC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdHJhbnNpZW50RmxhZywgICAgICAgICAgICAgICAgIC8qITwgRmxhZyBpbmRpY2F0aW5nIGlmIGEgdHJhbnNpZW50IGlzIHByZXNlbnQgb3Igbm90LiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WRl9NT0RFKiBpbmZWZWMgICAgICAgICAgICAgICAgICAvKiE8IFZlY3RvciBob2xkaW5nIHRoZSBpbnZlcnNlIGZpbHRlcmluZyBsZXZlbHMuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewordm9pZCBGREtzYnJFbmNfcW1mSW52ZXJzZUZpbHRlcmluZ0RldGVjdG9yKAorICAgIEhBTkRMRV9TQlJfSU5WX0ZJTFRfRVNUCisgICAgICAgIGhJbnZGaWx0LCAgICAgICAgICAgLyohPCBIYW5kbGUgdG8gdGhlIFNCUl9JTlZfRklMVF9FU1Qgc3RydWN0LiAqLworICAgIEZJWFBfREJMICoqcXVvdGFNYXRyaXgsIC8qITwgVGhlIG1hdHJpeCBob2xkaW5nIHRoZSB0b25hbGl0eSB2YWx1ZXMgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWwuICovCisgICAgRklYUF9EQkwgKm5yZ1ZlY3RvciwgICAgLyohPCBUaGUgZW5lcmd5IHZlY3Rvci4gKi8KKyAgICBTQ0hBUiAqaW5kZXhWZWN0b3IsICAgICAvKiE8IEluZGV4IHZlY3RvciB0byBvYnRhaW4gdGhlIHBhdGNoZWQgZGF0YS4gKi8KKyAgICBJTlQgc3RhcnRJbmRleCwgICAgICAgICAvKiE8IFN0YXJ0IGluZGV4LiAqLworICAgIElOVCBzdG9wSW5kZXgsICAgICAgICAgIC8qITwgU3RvcCBpbmRleC4gKi8KKyAgICBJTlQgdHJhbnNpZW50RmxhZywgLyohPCBGbGFnIGluZGljYXRpbmcgaWYgYSB0cmFuc2llbnQgaXMgcHJlc2VudCBvciBub3QuKi8KKyAgICBJTlZGX01PREUgKmluZlZlYyAgLyohPCBWZWN0b3IgaG9sZGluZyB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWxzLiAqLworKSB7CiAgIElOVCBiYW5kOwogCiAgIC8qCiAgICAqIERvIHRoZSBpbnZlcnNlIGZpbHRlcmluZyBsZXZlbCBlc3RpbWF0aW9uLgogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIGZvcihiYW5kID0gMCA7IGJhbmQgPCBoSW52RmlsdC0+bm9EZXRlY3RvckJhbmRzOyBiYW5kKyspeworICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgaEludkZpbHQtPm5vRGV0ZWN0b3JCYW5kczsgYmFuZCsrKSB7CiAgICAgSU5UIHN0YXJ0Q2hhbm5lbCA9IGhJbnZGaWx0LT5mcmVxQmFuZFRhYmxlSW52RmlsdFtiYW5kXTsKLSAgICBJTlQgc3RvcENoYW5uZWwgID0gaEludkZpbHQtPmZyZXFCYW5kVGFibGVJbnZGaWx0W2JhbmQrMV07CisgICAgSU5UIHN0b3BDaGFubmVsID0gaEludkZpbHQtPmZyZXFCYW5kVGFibGVJbnZGaWx0W2JhbmQgKyAxXTsKIAorICAgIGNhbGN1bGF0ZURldGVjdG9yVmFsdWVzKHF1b3RhTWF0cml4LCBpbmRleFZlY3RvciwgbnJnVmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoSW52RmlsdC0+ZGV0ZWN0b3JWYWx1ZXNbYmFuZF0sIHN0YXJ0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wQ2hhbm5lbCwgc3RhcnRJbmRleCwgc3RvcEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhJbnZGaWx0LT5udW1iZXJPZlN0cm9uZ2VzdCk7CiAKLSAgICBjYWxjdWxhdGVEZXRlY3RvclZhbHVlcyggcXVvdGFNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4VmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucmdWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhJbnZGaWx0LT5kZXRlY3RvclZhbHVlc1tiYW5kXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wQ2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSW52RmlsdC0+bnVtYmVyT2ZTdHJvbmdlc3QpOwotCi0gICAgaW5mVmVjW2JhbmRdPSBkZWNpc2lvbkFsZ29yaXRobSggaEludkZpbHQtPmRldGVjdG9yUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhJbnZGaWx0LT5kZXRlY3RvclZhbHVlc1tiYW5kXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2llbnRGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhJbnZGaWx0LT5wcmV2UmVnaW9uU2JyW2JhbmRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhJbnZGaWx0LT5wcmV2UmVnaW9uT3JpZ1tiYW5kXSk7CisgICAgaW5mVmVjW2JhbmRdID0gZGVjaXNpb25BbGdvcml0aG0oCisgICAgICAgIGhJbnZGaWx0LT5kZXRlY3RvclBhcmFtcywgJmhJbnZGaWx0LT5kZXRlY3RvclZhbHVlc1tiYW5kXSwKKyAgICAgICAgdHJhbnNpZW50RmxhZywgJmhJbnZGaWx0LT5wcmV2UmVnaW9uU2JyW2JhbmRdLAorICAgICAgICAmaEludkZpbHQtPnByZXZSZWdpb25PcmlnW2JhbmRdKTsKICAgfQotCiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAgIFxicmllZiAgICAgSW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWwgZXN0aW1hdG9yLgpAQCAtNDY2LDQzICs1NDcsNDMgQEAKIAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUlOVAotRkRLc2JyRW5jX2luaXRJbnZGaWx0RGV0ZWN0b3IgKEhBTkRMRV9TQlJfSU5WX0ZJTFRfRVNUIGhJbnZGaWx0LCAgIC8qITwgUG9pbnRlciB0byBhIGhhbmRsZSB0byB0aGUgU0JSX0lOVl9GSUxUX0VTVCBzdHJ1Y3QuICovCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCogZnJlcUJhbmRUYWJsZURldGVjdG9yLCAgICAgICAgICAvKiE8IEZyZXF1ZW5jeSBiYW5kIHRhYmxlIGZvciB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcuICovCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1EZXRlY3RvckJhbmRzLCAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBpbnZlcnNlIGZpbHRlcmluZyBiYW5kcy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgVUlOVCB1c2VTcGVlY2hDb25maWcgICAgICAgICAvKiE8IEZsYWc6IGFkYXB0IHR1bmluZyBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBzcGVlY2gqLwotICAgICAgICAgICAgICAgICAgICAgICApCi17CitJTlQgRkRLc2JyRW5jX2luaXRJbnZGaWx0RGV0ZWN0b3IoCisgICAgSEFORExFX1NCUl9JTlZfRklMVF9FU1QKKyAgICAgICAgaEludkZpbHQsIC8qITwgUG9pbnRlciB0byBhIGhhbmRsZSB0byB0aGUgU0JSX0lOVl9GSUxUX0VTVCBzdHJ1Y3QuICovCisgICAgSU5UICpmcmVxQmFuZFRhYmxlRGV0ZWN0b3IsIC8qITwgRnJlcXVlbmN5IGJhbmQgdGFibGUgZm9yIHRoZSBpbnZlcnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmluZy4gKi8KKyAgICBJTlQgbnVtRGV0ZWN0b3JCYW5kcywgICAgICAgLyohPCBOdW1iZXIgb2YgaW52ZXJzZSBmaWx0ZXJpbmcgYmFuZHMuICovCisgICAgVUlOVAorICAgICAgICB1c2VTcGVlY2hDb25maWcgLyohPCBGbGFnOiBhZGFwdCB0dW5pbmcgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gc3BlZWNoKi8KKykgewogICBJTlQgaTsKIAotICBGREttZW1jbGVhciggaEludkZpbHQsc2l6ZW9mKFNCUl9JTlZfRklMVF9FU1QpKTsKKyAgRkRLbWVtY2xlYXIoaEludkZpbHQsIHNpemVvZihTQlJfSU5WX0ZJTFRfRVNUKSk7CiAKLSAgaEludkZpbHQtPmRldGVjdG9yUGFyYW1zID0gKHVzZVNwZWVjaENvbmZpZykgPyAmZGV0ZWN0b3JQYXJhbXNBQUNTcGVlY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmZGV0ZWN0b3JQYXJhbXNBQUMgOworICBoSW52RmlsdC0+ZGV0ZWN0b3JQYXJhbXMgPQorICAgICAgKHVzZVNwZWVjaENvbmZpZykgPyAmZGV0ZWN0b3JQYXJhbXNBQUNTcGVlY2ggOiAmZGV0ZWN0b3JQYXJhbXNBQUM7CiAKICAgaEludkZpbHQtPm5vRGV0ZWN0b3JCYW5kc01heCA9IG51bURldGVjdG9yQmFuZHM7CiAKICAgLyoKICAgICAgTWVtb3J5IGluaXRpYWxpc2F0aW9uCiAgICovCi0gIGZvcihpPTA7aTxoSW52RmlsdC0+bm9EZXRlY3RvckJhbmRzTWF4O2krKyl7CisgIGZvciAoaSA9IDA7IGkgPCBoSW52RmlsdC0+bm9EZXRlY3RvckJhbmRzTWF4OyBpKyspIHsKICAgICBGREttZW1jbGVhcigmaEludkZpbHQtPmRldGVjdG9yVmFsdWVzW2ldLCBzaXplb2YoREVURUNUT1JfVkFMVUVTKSk7Ci0gICAgaEludkZpbHQtPnByZXZJbnZmTW9kZVtpXSAgID0gSU5WRl9PRkY7CisgICAgaEludkZpbHQtPnByZXZJbnZmTW9kZVtpXSA9IElOVkZfT0ZGOwogICAgIGhJbnZGaWx0LT5wcmV2UmVnaW9uT3JpZ1tpXSA9IDA7Ci0gICAgaEludkZpbHQtPnByZXZSZWdpb25TYnJbaV0gID0gMDsKKyAgICBoSW52RmlsdC0+cHJldlJlZ2lvblNicltpXSA9IDA7CiAgIH0KIAogICAvKgogICBSZXNldCB0aGUgaW52ZXJzZSBmbHRlcmluZyBkZXRlY3Rvci4KICAgKi8KLSAgRkRLc2JyRW5jX3Jlc2V0SW52RmlsdERldGVjdG9yKGhJbnZGaWx0LAotICAgICAgICAgICAgICAgICAgICAgICBmcmVxQmFuZFRhYmxlRGV0ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgIGhJbnZGaWx0LT5ub0RldGVjdG9yQmFuZHNNYXgpOworICBGREtzYnJFbmNfcmVzZXRJbnZGaWx0RGV0ZWN0b3IoaEludkZpbHQsIGZyZXFCYW5kVGFibGVEZXRlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhJbnZGaWx0LT5ub0RldGVjdG9yQmFuZHNNYXgpOwogCiAgIHJldHVybiAoMCk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAgIFxicmllZiAgICAgcmVzZXRzIHNiciBpbnZlcnNlIGZpbHRlcmluZyBzdHJ1Y3R1cmUuCkBAIC01MTMsMTcgKzU5NCwxNyBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UCi1GREtzYnJFbmNfcmVzZXRJbnZGaWx0RGV0ZWN0b3IoSEFORExFX1NCUl9JTlZfRklMVF9FU1QgaEludkZpbHQsIC8qITwgSGFuZGxlIHRvIHRoZSBTQlJfSU5WX0ZJTFRfRVNUIHN0cnVjdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgIElOVCogZnJlcUJhbmRUYWJsZURldGVjdG9yLCAgICAgICAvKiE8IEZyZXF1ZW5jeSBiYW5kIHRhYmxlIGZvciB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcuICovCi0gICAgICAgICAgICAgICAgICAgICBJTlQgbnVtRGV0ZWN0b3JCYW5kcykgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgaW52ZXJzZSBmaWx0ZXJpbmcgYmFuZHMuICovCitJTlQgRkRLc2JyRW5jX3Jlc2V0SW52RmlsdERldGVjdG9yKAorICAgIEhBTkRMRV9TQlJfSU5WX0ZJTFRfRVNUCisgICAgICAgIGhJbnZGaWx0LCAgICAgICAgICAgICAgIC8qITwgSGFuZGxlIHRvIHRoZSBTQlJfSU5WX0ZJTFRfRVNUIHN0cnVjdC4gKi8KKyAgICBJTlQgKmZyZXFCYW5kVGFibGVEZXRlY3RvciwgLyohPCBGcmVxdWVuY3kgYmFuZCB0YWJsZSBmb3IgdGhlIGludmVyc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyaW5nLiAqLworICAgIElOVCBudW1EZXRlY3RvckJhbmRzKSAgICAgICAvKiE8IE51bWJlciBvZiBpbnZlcnNlIGZpbHRlcmluZyBiYW5kcy4gKi8KIHsKLQotICBoSW52RmlsdC0+bnVtYmVyT2ZTdHJvbmdlc3QgICAgID0gMTsKLSAgRkRLbWVtY3B5KGhJbnZGaWx0LT5mcmVxQmFuZFRhYmxlSW52RmlsdCxmcmVxQmFuZFRhYmxlRGV0ZWN0b3IsKG51bURldGVjdG9yQmFuZHMrMSkqc2l6ZW9mKElOVCkpOworICBoSW52RmlsdC0+bnVtYmVyT2ZTdHJvbmdlc3QgPSAxOworICBGREttZW1jcHkoaEludkZpbHQtPmZyZXFCYW5kVGFibGVJbnZGaWx0LCBmcmVxQmFuZFRhYmxlRGV0ZWN0b3IsCisgICAgICAgICAgICAobnVtRGV0ZWN0b3JCYW5kcyArIDEpICogc2l6ZW9mKElOVCkpOwogICBoSW52RmlsdC0+bm9EZXRlY3RvckJhbmRzID0gbnVtRGV0ZWN0b3JCYW5kczsKIAogICByZXR1cm4gKDApOwogfQotCi0KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvaW52Zl9lc3QuaCBiL2xpYlNCUmVuYy9zcmMvaW52Zl9lc3QuaAppbmRleCAyYmQyYTc4Li4zYWI2NzI2IDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL2ludmZfZXN0LmgKKysrIGIvbGliU0JSZW5jL3NyYy9pbnZmX2VzdC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDQwICs5MCw0NiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIEludmVyc2UgRmlsdGVyaW5nIGRldGVjdGlvbiBwcm90b3R5cGVzICAKKyAgXGJyaWVmICBJbnZlcnNlIEZpbHRlcmluZyBkZXRlY3Rpb24gcHJvdG90eXBlcyAkUmV2aXNpb246IDkyNzkwICQKICovCi0jaWZuZGVmIF9JTlZfRklMVF9ERVRfSAotI2RlZmluZSBfSU5WX0ZJTFRfREVUX0gKKyNpZm5kZWYgSU5WRl9FU1RfSAorI2RlZmluZSBJTlZGX0VTVF9ICiAKICNpbmNsdWRlICJzYnJfZW5jb2Rlci5oIgogI2luY2x1ZGUgInNicl9kZWYuaCIKIAogI2RlZmluZSBJTlZGX1NNT09USElOR19MRU5HVEggMgogCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICBjb25zdCBGSVhQX0RCTCAqcXVhbnRTdGVwc1NicjsKICAgY29uc3QgRklYUF9EQkwgKnF1YW50U3RlcHNPcmlnOwogICBjb25zdCBGSVhQX0RCTCAqbnJnQm9yZGVyczsKLSAgSU5UICAgbnVtUmVnaW9uc1NicjsKLSAgSU5UICAgbnVtUmVnaW9uc09yaWc7Ci0gIElOVCAgIG51bVJlZ2lvbnNOcmc7CisgIElOVCBudW1SZWdpb25zU2JyOworICBJTlQgbnVtUmVnaW9uc09yaWc7CisgIElOVCBudW1SZWdpb25zTnJnOwogICBJTlZGX01PREUgcmVnaW9uU3BhY2VbNV1bNV07CiAgIElOVkZfTU9ERSByZWdpb25TcGFjZVRyYW5zaWVudFs1XVs1XTsKICAgSU5UIEVuZXJneUNvbXBGYWN0b3JbNV07CiAKLX1ERVRFQ1RPUl9QQVJBTUVURVJTOworfSBERVRFQ1RPUl9QQVJBTUVURVJTOwogCi10eXBlZGVmIHN0cnVjdAotewotICBGSVhQX0RCTCAgb3JpZ1F1b3RhTWVhbltJTlZGX1NNT09USElOR19MRU5HVEgrMV07Ci0gIEZJWFBfREJMICBzYnJRdW90YU1lYW5bSU5WRl9TTU9PVEhJTkdfTEVOR1RIKzFdOwotICBGSVhQX0RCTCAgb3JpZ1F1b3RhTWVhblN0cm9uZ2VzdFtJTlZGX1NNT09USElOR19MRU5HVEgrMV07Ci0gIEZJWFBfREJMICBzYnJRdW90YU1lYW5TdHJvbmdlc3RbSU5WRl9TTU9PVEhJTkdfTEVOR1RIKzFdOwordHlwZWRlZiBzdHJ1Y3QgeworICBGSVhQX0RCTCBvcmlnUXVvdGFNZWFuW0lOVkZfU01PT1RISU5HX0xFTkdUSCArIDFdOworICBGSVhQX0RCTCBzYnJRdW90YU1lYW5bSU5WRl9TTU9PVEhJTkdfTEVOR1RIICsgMV07CisgIEZJWFBfREJMIG9yaWdRdW90YU1lYW5TdHJvbmdlc3RbSU5WRl9TTU9PVEhJTkdfTEVOR1RIICsgMV07CisgIEZJWFBfREJMIHNiclF1b3RhTWVhblN0cm9uZ2VzdFtJTlZGX1NNT09USElOR19MRU5HVEggKyAxXTsKIAogICBGSVhQX0RCTCBvcmlnUXVvdGFNZWFuRmlsdDsKICAgRklYUF9EQkwgc2JyUXVvdGFNZWFuRmlsdDsKQEAgLTEyMywxMiArMTQwLDkgQEAKICAgRklYUF9EQkwgc2JyUXVvdGFNYXg7CiAKICAgRklYUF9EQkwgYXZnTnJnOwotfURFVEVDVE9SX1ZBTFVFUzsKK30gREVURUNUT1JfVkFMVUVTOwogCi0KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgSU5UIG51bWJlck9mU3Ryb25nZXN0OwogCiAgIElOVCBwcmV2UmVnaW9uU2JyW01BWF9OVU1fTk9JU0VfVkFMVUVTXTsKQEAgLTE0NSwzMSArMTU5LDIzIEBACiAKICAgRklYUF9EQkwgbnJnQXZnOwogICBGSVhQX0RCTCB3bVFtZltNQVhfTlVNX05PSVNFX1ZBTFVFU107Ci19Ci1TQlJfSU5WX0ZJTFRfRVNUOworfSBTQlJfSU5WX0ZJTFRfRVNUOwogCiB0eXBlZGVmIFNCUl9JTlZfRklMVF9FU1QgKkhBTkRMRV9TQlJfSU5WX0ZJTFRfRVNUOwogCi12b2lkCi1GREtzYnJFbmNfcW1mSW52ZXJzZUZpbHRlcmluZ0RldGVjdG9yKEhBTkRMRV9TQlJfSU5WX0ZJTFRfRVNUIGhJbnZGaWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqIHF1b3RhTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpucmdWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKmluZGV4VmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdGFydEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdG9wSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRyYW5zaWVudEZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WRl9NT0RFKiBpbmZWZWMpOwordm9pZCBGREtzYnJFbmNfcW1mSW52ZXJzZUZpbHRlcmluZ0RldGVjdG9yKEhBTkRMRV9TQlJfSU5WX0ZJTFRfRVNUIGhJbnZGaWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcXVvdGFNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm5yZ1ZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAqaW5kZXhWZWN0b3IsIElOVCBzdGFydEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdG9wSW5kZXgsIElOVCB0cmFuc2llbnRGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSAqaW5mVmVjKTsKIAotSU5UCi1GREtzYnJFbmNfaW5pdEludkZpbHREZXRlY3RvciAoSEFORExFX1NCUl9JTlZfRklMVF9FU1QgaEludkZpbHQsCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCogZnJlcUJhbmRUYWJsZURldGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtRGV0ZWN0b3JCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgVUlOVCB1c2VTcGVlY2hDb25maWcpOworSU5UIEZES3NickVuY19pbml0SW52RmlsdERldGVjdG9yKEhBTkRMRV9TQlJfSU5WX0ZJTFRfRVNUIGhJbnZGaWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqZnJlcUJhbmRUYWJsZURldGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1EZXRlY3RvckJhbmRzLCBVSU5UIHVzZVNwZWVjaENvbmZpZyk7CiAKLUlOVAotRkRLc2JyRW5jX3Jlc2V0SW52RmlsdERldGVjdG9yKEhBTkRMRV9TQlJfSU5WX0ZJTFRfRVNUIGhJbnZGaWx0LAotICAgICAgICAgICAgICAgICAgICAgSU5UKiBmcmVxQmFuZFRhYmxlRGV0ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICBJTlQgbnVtRGV0ZWN0b3JCYW5kcyk7CitJTlQgRkRLc2JyRW5jX3Jlc2V0SW52RmlsdERldGVjdG9yKEhBTkRMRV9TQlJfSU5WX0ZJTFRfRVNUIGhJbnZGaWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmZyZXFCYW5kVGFibGVEZXRlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bURldGVjdG9yQmFuZHMpOwogCiAjZW5kaWYgLyogX1FNRl9JTlZfRklMVF9IICovCi0KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvbWhfZGV0LmNwcCBiL2xpYlNCUmVuYy9zcmMvbWhfZGV0LmNwcAppbmRleCBiYzgwYTE1Li4yZjNiMzg2IDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL21oX2RldC5jcHAKKysrIGIvbGliU0JSZW5jL3NyYy9taF9kZXQuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDYxICs5MCw3OCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJtaF9kZXQuaCIKIAotI2luY2x1ZGUgInNicl9yYW0uaCIKKyNpbmNsdWRlICJzYnJlbmNfcmFtLmgiCiAjaW5jbHVkZSAic2JyX21pc2MuaCIKIAotCiAjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKIAotI2RlZmluZSBTRk1fU0hJRlQgMiAgICAgLyogQXR0ZW50aW9uOiBTRk1fU0NBTEUgZGVwZW5kcyBvbiBTRk1fU0hJRlQgKi8KLSNkZWZpbmUgU0ZNX1NDQUxFIChNQVhWQUxfREJMID4+IFNGTV9TSElGVCkgICAvKiAxLjAgPj4gU0ZNX1NISUZUICovCi0KKyNkZWZpbmUgU0ZNX1NISUZUIDIgLyogQXR0ZW50aW9uOiBTRk1fU0NBTEUgZGVwZW5kcyBvbiBTRk1fU0hJRlQgKi8KKyNkZWZpbmUgU0ZNX1NDQUxFIChNQVhWQUxfREJMID4+IFNGTV9TSElGVCkgLyogMS4wID4+IFNGTV9TSElGVCAqLwogCiAvKiE8IERldGVjdG9yIFBhcmFtZXRlcnMgZm9yIEFBQyBjb3JlIGNvZGVjLiAqLwogc3RhdGljIGNvbnN0IERFVEVDVE9SX1BBUkFNRVRFUlNfTUggcGFyYW1zQWFjID0gewotOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGRlbHRhVGltZSAqLwotewotRkwyRlhDT05TVF9EQkwoMjAuMGYqUkVMQVhBVElPTl9GTE9BVCksICAgICAgICAvKiE8IHRocmVzSG9sZERpZmYgKi8KLUZMMkZYQ09OU1RfREJMKDEuMjZmKlJFTEFYQVRJT05fRkxPQVQpLCAgICAgICAgLyohPCB0aHJlc0hvbGREaWZmR3VpZGUgKi8KLUZMMkZYQ09OU1RfREJMKDE1LjBmKlJFTEFYQVRJT05fRkxPQVQpLCAgICAgICAgLyohPCB0aHJlc0hvbGRUb25lICovCi1GTDJGWENPTlNUX0RCTCgoMS4wZi8xNS4wZikqUkVMQVhBVElPTl9GTE9BVCksIC8qITwgaW52VGhyZXNIb2xkVG9uZSAqLwotRkwyRlhDT05TVF9EQkwoMS4yNmYqUkVMQVhBVElPTl9GTE9BVCksICAgICAgICAvKiE8IHRocmVzSG9sZFRvbmVHdWlkZSAqLwotRkwyRlhDT05TVF9EQkwoMC4zZik+PlNGTV9TSElGVCwgICAgICAgICAgICAgICAvKiE8IHNmbVRocmVzU2JyICovCi1GTDJGWENPTlNUX0RCTCgwLjFmKT4+U0ZNX1NISUZULCAgICAgICAgICAgICAgIC8qITwgc2ZtVGhyZXNPcmlnICovCi1GTDJGWENPTlNUX0RCTCgwLjNmKSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZGVjYXlHdWlkZU9yaWcgKi8KLUZMMkZYQ09OU1RfREJMKDAuNWYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBkZWNheUd1aWRlRGlmZiAqLwotRkwyRlhDT05TVF9EQkwoLTAuMDAwMTEyOTkzMjY5KSwgIC8qIExENjQoRkwyRlhDT05TVF9EQkwoMC45OTVmKSkgKi8gLyohPCBkZXJpdlRocmVzTWF4TEQ2NCAqLwotRkwyRlhDT05TVF9EQkwoLTAuMDAwMTEyOTkzMjY5KSwgIC8qIExENjQoRkwyRlhDT05TVF9EQkwoMC45OTVmKSkgKi8gLyohPCBkZXJpdlRocmVzQmVsb3dMRDY0ICovCi1GTDJGWENPTlNUX0RCTCgtMC4wMDUwMzAxMjY0ODNmKSAvKiBMRDY0KEZMMkZYQ09OU1RfREJMKDAuOGYpKSAqLyAgICAvKiE8IGRlcml2VGhyZXNBYm92ZUxENjQgKi8KLX0sCi01MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgbWF4Q29tcCAqLworICAgIDksIC8qITwgZGVsdGFUaW1lICovCisgICAgeworICAgICAgICBGTDJGWENPTlNUX0RCTCgyMC4wZiAqIFJFTEFYQVRJT05fRkxPQVQpLCAvKiE8IHRocmVzSG9sZERpZmYgKi8KKyAgICAgICAgRkwyRlhDT05TVF9EQkwoMS4yNmYgKiBSRUxBWEFUSU9OX0ZMT0FUKSwgLyohPCB0aHJlc0hvbGREaWZmR3VpZGUgKi8KKyAgICAgICAgRkwyRlhDT05TVF9EQkwoMTUuMGYgKiBSRUxBWEFUSU9OX0ZMT0FUKSwgLyohPCB0aHJlc0hvbGRUb25lICovCisgICAgICAgIEZMMkZYQ09OU1RfREJMKCgxLjBmIC8gMTUuMGYpICoKKyAgICAgICAgICAgICAgICAgICAgICAgUkVMQVhBVElPTl9GTE9BVCksICAgICAgICAgLyohPCBpbnZUaHJlc0hvbGRUb25lICovCisgICAgICAgIEZMMkZYQ09OU1RfREJMKDEuMjZmICogUkVMQVhBVElPTl9GTE9BVCksIC8qITwgdGhyZXNIb2xkVG9uZUd1aWRlICovCisgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuM2YpID4+IFNGTV9TSElGVCwgICAgICAgIC8qITwgc2ZtVGhyZXNTYnIgKi8KKyAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4xZikgPj4gU0ZNX1NISUZULCAgICAgICAgLyohPCBzZm1UaHJlc09yaWcgKi8KKyAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4zZiksICAgICAgICAgICAgICAgICAgICAgLyohPCBkZWNheUd1aWRlT3JpZyAqLworICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjVmKSwgICAgICAgICAgICAgICAgICAgICAvKiE8IGRlY2F5R3VpZGVEaWZmICovCisgICAgICAgIEZMMkZYQ09OU1RfREJMKC0wLjAwMDExMjk5MzI2OSksCisgICAgICAgIC8qIExENjQoRkwyRlhDT05TVF9EQkwoMC45OTVmKSkgKi8gLyohPCBkZXJpdlRocmVzTWF4TEQ2NCAqLworICAgICAgICBGTDJGWENPTlNUX0RCTCgtMC4wMDAxMTI5OTMyNjkpLAorICAgICAgICAvKiBMRDY0KEZMMkZYQ09OU1RfREJMKDAuOTk1ZikpICovIC8qITwgZGVyaXZUaHJlc0JlbG93TEQ2NCAqLworICAgICAgICBGTDJGWENPTlNUX0RCTCgKKyAgICAgICAgICAgIC0wLjAwNTAzMDEyNjQ4M2YpIC8qIExENjQoRkwyRlhDT05TVF9EQkwoMC44ZikpICovIC8qITwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcml2VGhyZXNBYm92ZUxENjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIH0sCisgICAgNTAgLyohPCBtYXhDb21wICovCiB9OwogCiAvKiE8IERldGVjdG9yIFBhcmFtZXRlcnMgZm9yIEFBQyBMRCBjb3JlIGNvZGVjLiAqLwogc3RhdGljIGNvbnN0IERFVEVDVE9SX1BBUkFNRVRFUlNfTUggcGFyYW1zQWFjTGQgPSB7Ci0xNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGVsdGEgdGltZS4gKi8KLXsKLUZMMkZYQ09OU1RfREJMKDI1LjBmKlJFTEFYQVRJT05fRkxPQVQpLCAgICAgICAgLyohPCB0aHJlc0hvbGREaWZmICovCi1GTDJGWENPTlNUX0RCTCgxLjI2ZipSRUxBWEFUSU9OX0ZMT0FUKSwgICAgICAgIC8qITwgdHJlc0hvbGREaWZmR3VpZGUgKi8KLUZMMkZYQ09OU1RfREJMKDE1LjBmKlJFTEFYQVRJT05fRkxPQVQpLCAgICAgICAgLyohPCB0aHJlc0hvbGRUb25lICovCi1GTDJGWENPTlNUX0RCTCgoMS4wZi8xNS4wZikqUkVMQVhBVElPTl9GTE9BVCksIC8qITwgaW52VGhyZXNIb2xkVG9uZSAqLwotRkwyRlhDT05TVF9EQkwoMS4yNmYqUkVMQVhBVElPTl9GTE9BVCksICAgICAgICAvKiE8IHRocmVzSG9sZFRvbmVHdWlkZSAqLwotRkwyRlhDT05TVF9EQkwoMC4zZik+PlNGTV9TSElGVCwgICAgICAgICAgICAgICAvKiE8IHNmbVRocmVzU2JyICovCi1GTDJGWENPTlNUX0RCTCgwLjFmKT4+U0ZNX1NISUZULCAgICAgICAgICAgICAgIC8qITwgc2ZtVGhyZXNPcmlnICovCi1GTDJGWENPTlNUX0RCTCgwLjNmKSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZGVjYXlHdWlkZU9yaWcgKi8KLUZMMkZYQ09OU1RfREJMKDAuMmYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBkZWNheUd1aWRlRGlmZiAqLwotRkwyRlhDT05TVF9EQkwoLTAuMDAwMTEyOTkzMjY5KSwgIC8qIExENjQoRkwyRlhDT05TVF9EQkwoMC45OTVmKSkgKi8gIC8qITwgZGVyaXZUaHJlc01heExENjQgKi8KLUZMMkZYQ09OU1RfREJMKC0wLjAwMDExMjk5MzI2OSksICAvKiBMRDY0KEZMMkZYQ09OU1RfREJMKDAuOTk1ZikpICovICAvKiE8IGRlcml2VGhyZXNCZWxvd0xENjQgKi8KLUZMMkZYQ09OU1RfREJMKC0wLjAwNTAzMDEyNjQ4M2YpIC8qIExENjQoRkwyRlhDT05TVF9EQkwoMC44ZikpICovICAgICAvKiE8IGRlcml2VGhyZXNBYm92ZUxENjQgKi8KLX0sCi01MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgbWF4Q29tcCAqLworICAgIDE2LCAvKiE8IERlbHRhIHRpbWUuICovCisgICAgeworICAgICAgICBGTDJGWENPTlNUX0RCTCgyNS4wZiAqIFJFTEFYQVRJT05fRkxPQVQpLCAvKiE8IHRocmVzSG9sZERpZmYgKi8KKyAgICAgICAgRkwyRlhDT05TVF9EQkwoMS4yNmYgKiBSRUxBWEFUSU9OX0ZMT0FUKSwgLyohPCB0cmVzSG9sZERpZmZHdWlkZSAqLworICAgICAgICBGTDJGWENPTlNUX0RCTCgxNS4wZiAqIFJFTEFYQVRJT05fRkxPQVQpLCAvKiE8IHRocmVzSG9sZFRvbmUgKi8KKyAgICAgICAgRkwyRlhDT05TVF9EQkwoKDEuMGYgLyAxNS4wZikgKgorICAgICAgICAgICAgICAgICAgICAgICBSRUxBWEFUSU9OX0ZMT0FUKSwgICAgICAgICAvKiE8IGludlRocmVzSG9sZFRvbmUgKi8KKyAgICAgICAgRkwyRlhDT05TVF9EQkwoMS4yNmYgKiBSRUxBWEFUSU9OX0ZMT0FUKSwgLyohPCB0aHJlc0hvbGRUb25lR3VpZGUgKi8KKyAgICAgICAgRkwyRlhDT05TVF9EQkwoMC4zZikgPj4gU0ZNX1NISUZULCAgICAgICAgLyohPCBzZm1UaHJlc1NiciAqLworICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjFmKSA+PiBTRk1fU0hJRlQsICAgICAgICAvKiE8IHNmbVRocmVzT3JpZyAqLworICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjNmKSwgICAgICAgICAgICAgICAgICAgICAvKiE8IGRlY2F5R3VpZGVPcmlnICovCisgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMmYpLCAgICAgICAgICAgICAgICAgICAgIC8qITwgZGVjYXlHdWlkZURpZmYgKi8KKyAgICAgICAgRkwyRlhDT05TVF9EQkwoLTAuMDAwMTEyOTkzMjY5KSwKKyAgICAgICAgLyogTEQ2NChGTDJGWENPTlNUX0RCTCgwLjk5NWYpKSAqLyAvKiE8IGRlcml2VGhyZXNNYXhMRDY0ICovCisgICAgICAgIEZMMkZYQ09OU1RfREJMKC0wLjAwMDExMjk5MzI2OSksCisgICAgICAgIC8qIExENjQoRkwyRlhDT05TVF9EQkwoMC45OTVmKSkgKi8gLyohPCBkZXJpdlRocmVzQmVsb3dMRDY0ICovCisgICAgICAgIEZMMkZYQ09OU1RfREJMKAorICAgICAgICAgICAgLTAuMDA1MDMwMTI2NDgzZikgLyogTEQ2NChGTDJGWENPTlNUX0RCTCgwLjhmKSkgKi8gLyohPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyaXZUaHJlc0Fib3ZlTEQ2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgfSwKKyAgICA1MCAvKiE8IG1heENvbXAgKi8KIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAgIFxicmllZiAgICAgQ2FsY3VsYXRlcyB0aGUgZGlmZmVyZW5jZSBpbiB0b25hbGl0eSBiZXR3ZWVuIG9yaWdpbmFsIGFuZCBTQlIKQEAgLTE0NSwzOSArMTczLDM2IEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBkaWZmKEZJWFBfREJMICpSRVNUUklDVCBwVG9uYWxpdHlPcmlnLAotICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcERpZmZNYXBwZWQyU2NmYiwKLSAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKlJFU1RSSUNUIHBGcmVxQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgICBJTlQgICAgICAgblNjZmIsCi0gICAgICAgICAgICAgICAgIFNDSEFSICAgICppbmRleFZlY3RvcikKLXsKK3N0YXRpYyB2b2lkIGRpZmYoRklYUF9EQkwgKlJFU1RSSUNUIHBUb25hbGl0eU9yaWcsIEZJWFBfREJMICpwRGlmZk1hcHBlZDJTY2ZiLAorICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqUkVTVFJJQ1QgcEZyZXFCYW5kVGFibGUsIElOVCBuU2NmYiwKKyAgICAgICAgICAgICAgICAgU0NIQVIgKmluZGV4VmVjdG9yKSB7CiAgIFVDSEFSIGksIGxsLCBsdSwgazsKICAgRklYUF9EQkwgbWF4VmFsT3JpZywgbWF4VmFsU2JyLCB0bXA7CiAgIElOVCBzY2FsZTsKIAotICBmb3IoaT0wOyBpIDwgblNjZmI7IGkrKyl7CisgIGZvciAoaSA9IDA7IGkgPCBuU2NmYjsgaSsrKSB7CiAgICAgbGwgPSBwRnJlcUJhbmRUYWJsZVtpXTsKLSAgICBsdSA9IHBGcmVxQmFuZFRhYmxlW2krMV07CisgICAgbHUgPSBwRnJlcUJhbmRUYWJsZVtpICsgMV07CiAKICAgICBtYXhWYWxPcmlnID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgbWF4VmFsU2JyID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKLSAgICBmb3Ioaz1sbDtrPGx1O2srKyl7CisgICAgZm9yIChrID0gbGw7IGsgPCBsdTsgaysrKSB7CiAgICAgICBtYXhWYWxPcmlnID0gZml4TWF4KG1heFZhbE9yaWcsIHBUb25hbGl0eU9yaWdba10pOwogICAgICAgbWF4VmFsU2JyID0gZml4TWF4KG1heFZhbFNiciwgcFRvbmFsaXR5T3JpZ1tpbmRleFZlY3RvcltrXV0pOwogICAgIH0KIAogICAgIGlmICgobWF4VmFsU2JyID49IFJFTEFYQVRJT04pKSB7Ci0gICAgICAgIHRtcCA9IGZEaXZOb3JtKG1heFZhbE9yaWcsIG1heFZhbFNiciwgJnNjYWxlKTsKLSAgICAgICAgcERpZmZNYXBwZWQyU2NmYltpXSA9IHNjYWxlVmFsdWUoZk11bHQodG1wLFJFTEFYQVRJT05fRlJBQ1QpLCBmaXhNYXgoLShERlJBQ1RfQklUUy0xKSwoc2NhbGUtUkVMQVhBVElPTl9TSElGVCkpKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHBEaWZmTWFwcGVkMlNjZmJbaV0gPSBtYXhWYWxPcmlnOworICAgICAgdG1wID0gZkRpdk5vcm0obWF4VmFsT3JpZywgbWF4VmFsU2JyLCAmc2NhbGUpOworICAgICAgcERpZmZNYXBwZWQyU2NmYltpXSA9CisgICAgICAgICAgc2NhbGVWYWx1ZShmTXVsdCh0bXAsIFJFTEFYQVRJT05fRlJBQ1QpLAorICAgICAgICAgICAgICAgICAgICAgZml4TWF4KC0oREZSQUNUX0JJVFMgLSAxKSwgKHNjYWxlIC0gUkVMQVhBVElPTl9TSElGVCkpKTsKKyAgICB9IGVsc2UgeworICAgICAgcERpZmZNYXBwZWQyU2NmYltpXSA9IG1heFZhbE9yaWc7CiAgICAgfQogICB9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAgIFxicmllZiAgICAgQ2FsY3VsYXRlcyBhIGZsYXRuZXNzIG1lYXN1cmUgb2YgdGhlIHRvbmFsaXR5IG1lYXN1cmVzLgpAQCAtMTk5LDg3ICsyMjQsODEgQEAKIAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNhbGN1bGF0ZUZsYXRuZXNzTWVhc3VyZShGSVhQX0RCTCAqcFF1b3RhQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICppbmRleFZlY3RvciwKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZUZsYXRuZXNzTWVhc3VyZShGSVhQX0RCTCAqcFF1b3RhQnVmZmVyLCBTQ0hBUiAqaW5kZXhWZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBTZm1PcmlnVmVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwU2ZtU2JyVmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpwRnJlcUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgblNmYikKLXsKLSAgSU5UIGksajsKLSAgRklYUF9EQkwgaW52QmFuZHMsdG1wMSx0bXAyOwotICBJTlQgc2hpZnRGYWMwLHNoaWZ0RmFjU3VtMDsKLSAgSU5UIHNoaWZ0RmFjMSxzaGlmdEZhY1N1bTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKnBGcmVxQmFuZFRhYmxlLCBJTlQgblNmYikgeworICBJTlQgaSwgajsKKyAgRklYUF9EQkwgaW52QmFuZHMsIHRtcDEsIHRtcDI7CisgIElOVCBzaGlmdEZhYzAsIHNoaWZ0RmFjU3VtMDsKKyAgSU5UIHNoaWZ0RmFjMSwgc2hpZnRGYWNTdW0xOwogICBGSVhQX0RCTCBhY2N1OwogCi0gIGZvcihpPTA7aTxuU2ZiO2krKykKLSAgeworICBmb3IgKGkgPSAwOyBpIDwgblNmYjsgaSsrKSB7CiAgICAgSU5UIGxsID0gcEZyZXFCYW5kVGFibGVbaV07Ci0gICAgSU5UIGx1ID0gcEZyZXFCYW5kVGFibGVbaSsxXTsKLSAgICBwU2ZtT3JpZ1ZlY1tpXSA9IChGSVhQX0RCTCkoTUFYVkFMX0RCTD4+Mik7Ci0gICAgcFNmbVNiclZlY1tpXSAgPSAoRklYUF9EQkwpKE1BWFZBTF9EQkw+PjIpOworICAgIElOVCBsdSA9IHBGcmVxQmFuZFRhYmxlW2kgKyAxXTsKKyAgICBwU2ZtT3JpZ1ZlY1tpXSA9IChGSVhQX0RCTCkoTUFYVkFMX0RCTCA+PiAyKTsKKyAgICBwU2ZtU2JyVmVjW2ldID0gKEZJWFBfREJMKShNQVhWQUxfREJMID4+IDIpOwogCi0gICAgaWYobHUgLSBsbCA+IDEpewotICAgICAgRklYUF9EQkwgYW1PcmlnLGFtVHJhbnNwLGdtT3JpZyxnbVRyYW5zcCxzZm1PcmlnLHNmbVRyYW5zcDsKLSAgICAgIGludkJhbmRzID0gR2V0SW52SW50KGx1LWxsKTsKKyAgICBpZiAobHUgLSBsbCA+IDEpIHsKKyAgICAgIEZJWFBfREJMIGFtT3JpZywgYW1UcmFuc3AsIGdtT3JpZywgZ21UcmFuc3AsIHNmbU9yaWcsIHNmbVRyYW5zcDsKKyAgICAgIGludkJhbmRzID0gR2V0SW52SW50KGx1IC0gbGwpOwogICAgICAgc2hpZnRGYWNTdW0wID0gMDsKICAgICAgIHNoaWZ0RmFjU3VtMSA9IDA7CiAgICAgICBhbU9yaWcgPSBhbVRyYW5zcCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgZ21PcmlnID0gZ21UcmFuc3AgPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKIAotICAgICAgZm9yKGo9IGxsOyBqPGx1OyBqKyspIHsKLSAgICAgICAgc2ZtT3JpZyAgID0gcFF1b3RhQnVmZmVyW2pdOworICAgICAgZm9yIChqID0gbGw7IGogPCBsdTsgaisrKSB7CisgICAgICAgIHNmbU9yaWcgPSBwUXVvdGFCdWZmZXJbal07CiAgICAgICAgIHNmbVRyYW5zcCA9IHBRdW90YUJ1ZmZlcltpbmRleFZlY3RvcltqXV07CiAKLSAgICAgICAgYW1PcmlnICAgKz0gZk11bHQoc2ZtT3JpZywgaW52QmFuZHMpOworICAgICAgICBhbU9yaWcgKz0gZk11bHQoc2ZtT3JpZywgaW52QmFuZHMpOwogICAgICAgICBhbVRyYW5zcCArPSBmTXVsdChzZm1UcmFuc3AsIGludkJhbmRzKTsKIAogICAgICAgICBzaGlmdEZhYzAgPSBDb3VudExlYWRpbmdCaXRzKHNmbU9yaWcpOwogICAgICAgICBzaGlmdEZhYzEgPSBDb3VudExlYWRpbmdCaXRzKHNmbVRyYW5zcCk7CiAKLSAgICAgICAgZ21PcmlnICAgPSBmTXVsdChnbU9yaWcsIHNmbU9yaWc8PHNoaWZ0RmFjMCk7Ci0gICAgICAgIGdtVHJhbnNwID0gZk11bHQoZ21UcmFuc3AsIHNmbVRyYW5zcDw8c2hpZnRGYWMxKTsKKyAgICAgICAgZ21PcmlnID0gZk11bHQoZ21PcmlnLCBzZm1PcmlnIDw8IHNoaWZ0RmFjMCk7CisgICAgICAgIGdtVHJhbnNwID0gZk11bHQoZ21UcmFuc3AsIHNmbVRyYW5zcCA8PCBzaGlmdEZhYzEpOwogCiAgICAgICAgIHNoaWZ0RmFjU3VtMCArPSBzaGlmdEZhYzA7CiAgICAgICAgIHNoaWZ0RmFjU3VtMSArPSBzaGlmdEZhYzE7CiAgICAgICB9CiAKICAgICAgIGlmIChnbU9yaWcgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgewotCi0gICAgICAgIHRtcDEgPSBDYWxjTGREYXRhKGdtT3JpZyk7ICAgICAgLyogQ2FsY0xkNjQoeCkvNjQgKi8KLSAgICAgICAgdG1wMSA9IGZNdWx0KGludkJhbmRzLCB0bXAxKTsgICAvKiB5KkNhbGNMZDY0KHgpLzY0ICovCisgICAgICAgIHRtcDEgPSBDYWxjTGREYXRhKGdtT3JpZyk7ICAgIC8qIENhbGNMZDY0KHgpLzY0ICovCisgICAgICAgIHRtcDEgPSBmTXVsdChpbnZCYW5kcywgdG1wMSk7IC8qIHkqQ2FsY0xkNjQoeCkvNjQgKi8KIAogICAgICAgICAvKiB5KmsvNjQgKi8KLSAgICAgICAgYWNjdSA9IChGSVhQX0RCTCktc2hpZnRGYWNTdW0wIDw8IChERlJBQ1RfQklUUy0xLTgpOwotICAgICAgICB0bXAyID0gZk11bHREaXYyKGludkJhbmRzLCBhY2N1KSA8PCAoMisxKTsKKyAgICAgICAgYWNjdSA9IChGSVhQX0RCTCktc2hpZnRGYWNTdW0wIDw8IChERlJBQ1RfQklUUyAtIDEgLSA4KTsKKyAgICAgICAgdG1wMiA9IGZNdWx0RGl2MihpbnZCYW5kcywgYWNjdSkgPDwgKDIgKyAxKTsKIAotICAgICAgICB0bXAyID0gdG1wMSArIHRtcDI7ICAgICAgICAgICAgIC8qIHkqQ2FsY0xkNjQoeCkvNjQgKyB5KmsvNjQgKi8KLSAgICAgICAgZ21PcmlnID0gQ2FsY0ludkxkRGF0YSh0bXAyKTsgICAvKiBDYWxjSW52TGQ2NCh6Jyk7ICovCi0gICAgICB9Ci0gICAgICBlbHNlIHsKKyAgICAgICAgdG1wMiA9IHRtcDEgKyB0bXAyOyAgICAgICAgICAgLyogeSpDYWxjTGQ2NCh4KS82NCArIHkqay82NCAqLworICAgICAgICBnbU9yaWcgPSBDYWxjSW52TGREYXRhKHRtcDIpOyAvKiBDYWxjSW52TGQ2NCh6Jyk7ICovCisgICAgICB9IGVsc2UgewogICAgICAgICBnbU9yaWcgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgIH0KIAogICAgICAgaWYgKGdtVHJhbnNwID4gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKLQotICAgICAgICB0bXAxID0gQ2FsY0xkRGF0YShnbVRyYW5zcCk7ICAgIC8qIENhbGNMZDY0KHgpLzY0ICovCi0gICAgICAgIHRtcDEgPSBmTXVsdChpbnZCYW5kcywgdG1wMSk7ICAgLyogeSpDYWxjTGQ2NCh4KS82NCAqLworICAgICAgICB0bXAxID0gQ2FsY0xkRGF0YShnbVRyYW5zcCk7ICAvKiBDYWxjTGQ2NCh4KS82NCAqLworICAgICAgICB0bXAxID0gZk11bHQoaW52QmFuZHMsIHRtcDEpOyAvKiB5KkNhbGNMZDY0KHgpLzY0ICovCiAKICAgICAgICAgLyogeSprLzY0ICovCi0gICAgICAgIGFjY3UgPSAoRklYUF9EQkwpLXNoaWZ0RmFjU3VtMSA8PCAoREZSQUNUX0JJVFMtMS04KTsKLSAgICAgICAgdG1wMiA9IGZNdWx0RGl2MihpbnZCYW5kcywgYWNjdSkgPDwgKDIrMSk7CisgICAgICAgIGFjY3UgPSAoRklYUF9EQkwpLXNoaWZ0RmFjU3VtMSA8PCAoREZSQUNUX0JJVFMgLSAxIC0gOCk7CisgICAgICAgIHRtcDIgPSBmTXVsdERpdjIoaW52QmFuZHMsIGFjY3UpIDw8ICgyICsgMSk7CiAKICAgICAgICAgdG1wMiA9IHRtcDEgKyB0bXAyOyAgICAgICAgICAgICAvKiB5KkNhbGNMZDY0KHgpLzY0ICsgeSprLzY0ICovCiAgICAgICAgIGdtVHJhbnNwID0gQ2FsY0ludkxkRGF0YSh0bXAyKTsgLyogQ2FsY0ludkxkNjQoeicpOyAqLwotICAgICAgfQotICAgICAgZWxzZSB7CisgICAgICB9IGVsc2UgewogICAgICAgICBnbVRyYW5zcCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgfQotICAgICAgaWYgKCBhbU9yaWcgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikgKQotICAgICAgICBwU2ZtT3JpZ1ZlY1tpXSA9IEZES3NickVuY19MU0lfZGl2aWRlX3NjYWxlX2ZyYWN0KGdtT3JpZyxhbU9yaWcsU0ZNX1NDQUxFKTsKKyAgICAgIGlmIChhbU9yaWcgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpCisgICAgICAgIHBTZm1PcmlnVmVjW2ldID0KKyAgICAgICAgICAgIEZES3NickVuY19MU0lfZGl2aWRlX3NjYWxlX2ZyYWN0KGdtT3JpZywgYW1PcmlnLCBTRk1fU0NBTEUpOwogCi0gICAgICBpZiAoIGFtVHJhbnNwICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpICkKLSAgICAgICAgcFNmbVNiclZlY1tpXSA9IEZES3NickVuY19MU0lfZGl2aWRlX3NjYWxlX2ZyYWN0KGdtVHJhbnNwLGFtVHJhbnNwLFNGTV9TQ0FMRSk7CisgICAgICBpZiAoYW1UcmFuc3AgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpCisgICAgICAgIHBTZm1TYnJWZWNbaV0gPQorICAgICAgICAgICAgRkRLc2JyRW5jX0xTSV9kaXZpZGVfc2NhbGVfZnJhY3QoZ21UcmFuc3AsIGFtVHJhbnNwLCBTRk1fU0NBTEUpOwogICAgIH0KICAgfQogfQpAQCAtMjkzLDM5ICszMTIsMjYgQEAKIAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNhbGN1bGF0ZURldGVjdG9ySW5wdXQoRklYUF9EQkwgKipSRVNUUklDVCBwUXVvdGFCdWZmZXIsICAvKiE8IFBvaW50ZXIgdG8gdG9uYWxpdHkgbWF0cml4LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgKlJFU1RSSUNUIGluZGV4VmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIHRvbmFsaXR5RGlmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipSRVNUUklDVCBwU2ZtT3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipSRVNUUklDVCBwU2ZtU2JyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBub0VzdFBlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbW92ZSkKLXsKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZURldGVjdG9ySW5wdXQoCisgICAgRklYUF9EQkwgKipSRVNUUklDVCBwUXVvdGFCdWZmZXIsIC8qITwgUG9pbnRlciB0byB0b25hbGl0eSBtYXRyaXguICovCisgICAgU0NIQVIgKlJFU1RSSUNUIGluZGV4VmVjdG9yLCBGSVhQX0RCTCAqKlJFU1RSSUNUIHRvbmFsaXR5RGlmZiwKKyAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIHBTZm1PcmlnLCBGSVhQX0RCTCAqKlJFU1RSSUNUIHBTZm1TYnIsCisgICAgY29uc3QgVUNIQVIgKmZyZXFCYW5kVGFibGUsIElOVCBuU2ZiLCBJTlQgbm9Fc3RQZXJGcmFtZSwgSU5UIG1vdmUpIHsKICAgSU5UIGVzdDsKIAogICAvKgogICBOZXcgZXN0aW1hdGUuCiAgICovCi0gIGZvciAoZXN0PTA7IGVzdCA8IG5vRXN0UGVyRnJhbWU7IGVzdCsrKSB7CisgIGZvciAoZXN0ID0gMDsgZXN0IDwgbm9Fc3RQZXJGcmFtZTsgZXN0KyspIHsKKyAgICBkaWZmKHBRdW90YUJ1ZmZlcltlc3QgKyBtb3ZlXSwgdG9uYWxpdHlEaWZmW2VzdCArIG1vdmVdLCBmcmVxQmFuZFRhYmxlLAorICAgICAgICAgblNmYiwgaW5kZXhWZWN0b3IpOwogCi0gICAgZGlmZihwUXVvdGFCdWZmZXJbZXN0K21vdmVdLAotICAgICAgICAgdG9uYWxpdHlEaWZmW2VzdCttb3ZlXSwKLSAgICAgICAgIGZyZXFCYW5kVGFibGUsCi0gICAgICAgICBuU2ZiLAotICAgICAgICAgaW5kZXhWZWN0b3IpOwotCi0gICAgY2FsY3VsYXRlRmxhdG5lc3NNZWFzdXJlKHBRdW90YUJ1ZmZlcltlc3QrIG1vdmVdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmbU9yaWdbZXN0ICsgbW92ZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZm1TYnJbZXN0ICsgbW92ZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXFCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZmIpOworICAgIGNhbGN1bGF0ZUZsYXRuZXNzTWVhc3VyZShwUXVvdGFCdWZmZXJbZXN0ICsgbW92ZV0sIGluZGV4VmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZtT3JpZ1tlc3QgKyBtb3ZlXSwgcFNmbVNicltlc3QgKyBtb3ZlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcUJhbmRUYWJsZSwgblNmYik7CiAgIH0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiEKICAgXGJyaWVmICAgICBDaGVja3MgdGhhdCB0aGUgZGV0ZWN0aW9uIGlzIG5vdCBkdWUgdG8gYSBMUCBmaWx0ZXIKQEAgLTM0MCw5NyArMzQ2LDk3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCByZW1vdmVMb3dQYXNzRGV0ZWN0aW9uKFVDSEFSICpSRVNUUklDVCBwQWRkSGFybVNmYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKipSRVNUUklDVCBwRGV0ZWN0aW9uVmVjdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdGFydCwgSU5UIHN0b3AsIElOVCBuU2ZiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqUkVTVFJJQ1QgcEZyZXFCYW5kVGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwTnJnVmVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJFU19IT0xEUyBtaFRocmVzaCkKIAogewotICBJTlQgaSxlc3Q7CisgIElOVCBpLCBlc3Q7CiAgIElOVCBtYXhEZXJpdlBvcyA9IHBGcmVxQmFuZFRhYmxlW25TZmJdOwogICBJTlQgbnVtQmFuZHMgPSBwRnJlcUJhbmRUYWJsZVtuU2ZiXTsKLSAgRklYUF9EQkwgbnJnTG93LG5yZ0hpZ2g7Ci0gIEZJWFBfREJMIG5yZ0xENjQsbnJnTG93TEQ2NCxucmdIaWdoTEQ2NCxucmdEaWZmTEQ2NDsKLSAgRklYUF9EQkwgdmFsTEQ2NCxtYXhWYWxMRDY0LG1heFZhbEFib3ZlTEQ2NDsKKyAgRklYUF9EQkwgbnJnTG93LCBucmdIaWdoOworICBGSVhQX0RCTCBucmdMRDY0LCBucmdMb3dMRDY0LCBucmdIaWdoTEQ2NCwgbnJnRGlmZkxENjQ7CisgIEZJWFBfREJMIHZhbExENjQsIG1heFZhbExENjQsIG1heFZhbEFib3ZlTEQ2NDsKICAgSU5UIGJMUHNpZ25hbCA9IDA7CiAKICAgbWF4VmFsTEQ2NCA9IEZMMkZYQ09OU1RfREJMKC0xLjBmKTsKLSAgZm9yKGkgPSBudW1CYW5kcyAtIDEgLSAyOyBpID4gcEZyZXFCYW5kVGFibGVbMF07aS0tKXsKLSAgICBucmdMb3cgID0gcE5yZ1ZlY3RvcltpXTsKKyAgZm9yIChpID0gbnVtQmFuZHMgLSAxIC0gMjsgaSA+IHBGcmVxQmFuZFRhYmxlWzBdOyBpLS0pIHsKKyAgICBucmdMb3cgPSBwTnJnVmVjdG9yW2ldOwogICAgIG5yZ0hpZ2ggPSBwTnJnVmVjdG9yW2kgKyAyXTsKIAotICAgIGlmKG5yZ0xvdyAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSAmJiBucmdMb3cgPiBucmdIaWdoKXsKLSAgICAgIG5yZ0xvd0xENjQgPSBDYWxjTGREYXRhKG5yZ0xvdz4+MSk7Ci0gICAgICBucmdEaWZmTEQ2NCA9IENhbGNMZERhdGEoKG5yZ0xvdz4+MSktKG5yZ0hpZ2g+PjEpKTsKLSAgICAgIHZhbExENjQgPSBucmdEaWZmTEQ2NC1ucmdMb3dMRDY0OwotICAgICAgaWYodmFsTEQ2NCA+IG1heFZhbExENjQpeworICAgIGlmIChucmdMb3cgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikgJiYgbnJnTG93ID4gbnJnSGlnaCkgeworICAgICAgbnJnTG93TEQ2NCA9IENhbGNMZERhdGEobnJnTG93ID4+IDEpOworICAgICAgbnJnRGlmZkxENjQgPSBDYWxjTGREYXRhKChucmdMb3cgPj4gMSkgLSAobnJnSGlnaCA+PiAxKSk7CisgICAgICB2YWxMRDY0ID0gbnJnRGlmZkxENjQgLSBucmdMb3dMRDY0OworICAgICAgaWYgKHZhbExENjQgPiBtYXhWYWxMRDY0KSB7CiAgICAgICAgIG1heERlcml2UG9zID0gaTsKICAgICAgICAgbWF4VmFsTEQ2NCA9IHZhbExENjQ7CiAgICAgICB9Ci0gICAgICBpZihtYXhWYWxMRDY0ID4gbWhUaHJlc2guZGVyaXZUaHJlc01heExENjQpIHsKKyAgICAgIGlmIChtYXhWYWxMRDY0ID4gbWhUaHJlc2guZGVyaXZUaHJlc01heExENjQpIHsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgLyogRmluZCB0aGUgbGFyZ2VzdCAiZ3JhZGllbnQiIGFib3ZlLiAoc2hvdWxkIGJlIHJlbGF0aXZlbHkgZmxhdCwgaGVuY2Ugd2UgZXhwZWN0IGEgbG93IHZhbHVlCi0gICAgIGlmIHRoZSBzaWduYWwgaXMgTFAuKi8KKyAgLyogRmluZCB0aGUgbGFyZ2VzdCAiZ3JhZGllbnQiIGFib3ZlLiAoc2hvdWxkIGJlIHJlbGF0aXZlbHkgZmxhdCwgaGVuY2Ugd2UKKyAgICAgZXhwZWN0IGEgbG93IHZhbHVlIGlmIHRoZSBzaWduYWwgaXMgTFAuKi8KICAgbWF4VmFsQWJvdmVMRDY0ID0gRkwyRlhDT05TVF9EQkwoLTEuMGYpOwotICBmb3IoaSA9IG51bUJhbmRzIC0gMSAtIDI7IGkgPiBtYXhEZXJpdlBvcyArIDI7aS0tKXsKLSAgICBucmdMb3cgID0gcE5yZ1ZlY3RvcltpXTsKKyAgZm9yIChpID0gbnVtQmFuZHMgLSAxIC0gMjsgaSA+IG1heERlcml2UG9zICsgMjsgaS0tKSB7CisgICAgbnJnTG93ID0gcE5yZ1ZlY3RvcltpXTsKICAgICBucmdIaWdoID0gcE5yZ1ZlY3RvcltpICsgMl07CiAKLSAgICBpZihucmdMb3cgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikgJiYgbnJnTG93ID4gbnJnSGlnaCl7Ci0JCSAgIG5yZ0xvd0xENjQgPSBDYWxjTGREYXRhKG5yZ0xvdz4+MSk7Ci0JCSAgIG5yZ0RpZmZMRDY0ID0gQ2FsY0xkRGF0YSgobnJnTG93Pj4xKS0obnJnSGlnaD4+MSkpOwotCQkJIHZhbExENjQgPSBucmdEaWZmTEQ2NC1ucmdMb3dMRDY0OwotICAgICAgaWYodmFsTEQ2NCA+IG1heFZhbEFib3ZlTEQ2NCl7CisgICAgaWYgKG5yZ0xvdyAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSAmJiBucmdMb3cgPiBucmdIaWdoKSB7CisgICAgICBucmdMb3dMRDY0ID0gQ2FsY0xkRGF0YShucmdMb3cgPj4gMSk7CisgICAgICBucmdEaWZmTEQ2NCA9IENhbGNMZERhdGEoKG5yZ0xvdyA+PiAxKSAtIChucmdIaWdoID4+IDEpKTsKKyAgICAgIHZhbExENjQgPSBucmdEaWZmTEQ2NCAtIG5yZ0xvd0xENjQ7CisgICAgICBpZiAodmFsTEQ2NCA+IG1heFZhbEFib3ZlTEQ2NCkgewogICAgICAgICBtYXhWYWxBYm92ZUxENjQgPSB2YWxMRDY0OwogICAgICAgfQotICAgIH0KLQkJIGVsc2UgewotICAgICAgaWYobnJnSGlnaCAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSAmJiBucmdIaWdoID4gbnJnTG93KXsKLQkJICAgICBucmdIaWdoTEQ2NCA9IENhbGNMZERhdGEobnJnSGlnaD4+MSk7Ci0JCSAgICAgbnJnRGlmZkxENjQgPSBDYWxjTGREYXRhKChucmdIaWdoPj4xKS0obnJnTG93Pj4xKSk7Ci0JCQkgICB2YWxMRDY0ID0gbnJnRGlmZkxENjQtbnJnSGlnaExENjQ7Ci0gICAgICAgIGlmKHZhbExENjQgPiBtYXhWYWxBYm92ZUxENjQpeworICAgIH0gZWxzZSB7CisgICAgICBpZiAobnJnSGlnaCAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSAmJiBucmdIaWdoID4gbnJnTG93KSB7CisgICAgICAgIG5yZ0hpZ2hMRDY0ID0gQ2FsY0xkRGF0YShucmdIaWdoID4+IDEpOworICAgICAgICBucmdEaWZmTEQ2NCA9IENhbGNMZERhdGEoKG5yZ0hpZ2ggPj4gMSkgLSAobnJnTG93ID4+IDEpKTsKKyAgICAgICAgdmFsTEQ2NCA9IG5yZ0RpZmZMRDY0IC0gbnJnSGlnaExENjQ7CisgICAgICAgIGlmICh2YWxMRDY0ID4gbWF4VmFsQWJvdmVMRDY0KSB7CiAgICAgICAgICAgbWF4VmFsQWJvdmVMRDY0ID0gdmFsTEQ2NDsKICAgICAgICAgfQogICAgICAgfQotCQkgfQorICAgIH0KICAgfQogCi0gIGlmKG1heFZhbExENjQgPiBtaFRocmVzaC5kZXJpdlRocmVzTWF4TEQ2NCAmJiBtYXhWYWxBYm92ZUxENjQgPCBtaFRocmVzaC5kZXJpdlRocmVzQWJvdmVMRDY0KXsKKyAgaWYgKG1heFZhbExENjQgPiBtaFRocmVzaC5kZXJpdlRocmVzTWF4TEQ2NCAmJgorICAgICAgbWF4VmFsQWJvdmVMRDY0IDwgbWhUaHJlc2guZGVyaXZUaHJlc0Fib3ZlTEQ2NCkgewogICAgIGJMUHNpZ25hbCA9IDE7CiAKLSAgICBmb3IoaSA9IG1heERlcml2UG9zIC0gMTsgaSA+IG1heERlcml2UG9zIC0gNSAmJiBpID49IDAgOyBpLS0pewotICAgICAgaWYocE5yZ1ZlY3RvcltpXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSAmJiBwTnJnVmVjdG9yW2ldID4gcE5yZ1ZlY3RvclttYXhEZXJpdlBvcyArIDJdKXsKLQkJICAgICBucmdEaWZmTEQ2NCA9IENhbGNMZERhdGEoKHBOcmdWZWN0b3JbaV0+PjEpLShwTnJnVmVjdG9yW21heERlcml2UG9zICsgMl0+PjEpKTsKLQkJCQkgbnJnTEQ2NCA9IENhbGNMZERhdGEocE5yZ1ZlY3RvcltpXT4+MSk7Ci0gIAkJCSB2YWxMRDY0ID0gbnJnRGlmZkxENjQtbnJnTEQ2NDsKLSAgICAgICAgaWYodmFsTEQ2NCA8IG1oVGhyZXNoLmRlcml2VGhyZXNCZWxvd0xENjQpIHsKKyAgICBmb3IgKGkgPSBtYXhEZXJpdlBvcyAtIDE7IGkgPiBtYXhEZXJpdlBvcyAtIDUgJiYgaSA+PSAwOyBpLS0pIHsKKyAgICAgIGlmIChwTnJnVmVjdG9yW2ldICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpICYmCisgICAgICAgICAgcE5yZ1ZlY3RvcltpXSA+IHBOcmdWZWN0b3JbbWF4RGVyaXZQb3MgKyAyXSkgeworICAgICAgICBucmdEaWZmTEQ2NCA9IENhbGNMZERhdGEoKHBOcmdWZWN0b3JbaV0gPj4gMSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBOcmdWZWN0b3JbbWF4RGVyaXZQb3MgKyAyXSA+PiAxKSk7CisgICAgICAgIG5yZ0xENjQgPSBDYWxjTGREYXRhKHBOcmdWZWN0b3JbaV0gPj4gMSk7CisgICAgICAgIHZhbExENjQgPSBucmdEaWZmTEQ2NCAtIG5yZ0xENjQ7CisgICAgICAgIGlmICh2YWxMRDY0IDwgbWhUaHJlc2guZGVyaXZUaHJlc0JlbG93TEQ2NCkgewogICAgICAgICAgIGJMUHNpZ25hbCA9IDA7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2V7CisgICAgICB9IGVsc2UgewogICAgICAgICBiTFBzaWduYWwgPSAwOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgIH0KIAotICBpZihiTFBzaWduYWwpewotICAgIGZvcihpPTA7aTxuU2ZiO2krKyl7Ci0gICAgICBpZihtYXhEZXJpdlBvcyA+PSBwRnJlcUJhbmRUYWJsZVtpXSAmJiBtYXhEZXJpdlBvcyA8IHBGcmVxQmFuZFRhYmxlW2krMV0pCisgIGlmIChiTFBzaWduYWwpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgblNmYjsgaSsrKSB7CisgICAgICBpZiAobWF4RGVyaXZQb3MgPj0gcEZyZXFCYW5kVGFibGVbaV0gJiYKKyAgICAgICAgICBtYXhEZXJpdlBvcyA8IHBGcmVxQmFuZFRhYmxlW2kgKyAxXSkKICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgaWYocEFkZEhhcm1TZmJbaV0peworICAgIGlmIChwQWRkSGFybVNmYltpXSkgewogICAgICAgcEFkZEhhcm1TZmJbaV0gPSAwOwotICAgICAgZm9yKGVzdCA9IHN0YXJ0OyBlc3QgPCBzdG9wIDsgZXN0KyspeworICAgICAgZm9yIChlc3QgPSBzdGFydDsgZXN0IDwgc3RvcDsgZXN0KyspIHsKICAgICAgICAgcERldGVjdGlvblZlY3RvcnNbZXN0XVtpXSA9IDA7CiAgICAgICB9CiAgICAgfQpAQCAtNDQ3LDQ0ICs0NTMsMzcgQEAKIAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQgaXNEZXRlY3Rpb25PZk5ld1RvbmVBbGxvd2VkKGNvbnN0IFNCUl9GUkFNRV9JTkZPICpwRnJhbWVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpwRGV0ZWN0aW9uU3RhcnRQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9Fc3RQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBwcmV2VHJhbnNpZW50RnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgcHJldlRyYW5zaWVudFBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBwcmV2VHJhbnNpZW50RmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0cmFuc2llbnRQb3NPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdHJhbnNpZW50RmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0cmFuc2llbnRQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZGVsdGFUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoX3Nick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvcikKLXsKK3N0YXRpYyBJTlQgaXNEZXRlY3Rpb25PZk5ld1RvbmVBbGxvd2VkKAorICAgIGNvbnN0IFNCUl9GUkFNRV9JTkZPICpwRnJhbWVJbmZvLCBJTlQgKnBEZXRlY3Rpb25TdGFydFBvcywKKyAgICBJTlQgbm9Fc3RQZXJGcmFtZSwgSU5UIHByZXZUcmFuc2llbnRGcmFtZSwgSU5UIHByZXZUcmFuc2llbnRQb3MsCisgICAgSU5UIHByZXZUcmFuc2llbnRGbGFnLCBJTlQgdHJhbnNpZW50UG9zT2Zmc2V0LCBJTlQgdHJhbnNpZW50RmxhZywKKyAgICBJTlQgdHJhbnNpZW50UG9zLCBJTlQgZGVsdGFUaW1lLAorICAgIEhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgaF9zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IpIHsKICAgSU5UIHRyYW5zaWVudEZyYW1lLCBuZXdEZXRlY3Rpb25BbGxvd2VkOwogCi0KICAgLyogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBmcmFtZSB3aGVyZSBhIHRyYW5zaWVudCBzdGFydHMuLi4KICAgICogSWYgdGhlIHRyYW5zaWVudCBmbGFnIHdhcyBzZXQgdGhlIHByZXZpb3VzIGZyYW1lIGJ1dCBub3QgdGhlCiAgICAqIHRyYW5zaWVudCBmcmFtZSBmbGFnLCB0aGUgdHJhbnNpZW50IGZyYW1lIGZsYWcgaXMgc2V0IGluIHRoZSBjdXJyZW50IGZyYW1lLgogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIHRyYW5zaWVudEZyYW1lID0gMDsKLSAgaWYodHJhbnNpZW50RmxhZyl7Ci0gICAgaWYodHJhbnNpZW50UG9zICsgdHJhbnNpZW50UG9zT2Zmc2V0IDwgcEZyYW1lSW5mby0+Ym9yZGVyc1twRnJhbWVJbmZvLT5uRW52ZWxvcGVzXSkKKyAgaWYgKHRyYW5zaWVudEZsYWcpIHsKKyAgICBpZiAodHJhbnNpZW50UG9zICsgdHJhbnNpZW50UG9zT2Zmc2V0IDwKKyAgICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc1twRnJhbWVJbmZvLT5uRW52ZWxvcGVzXSkgewogICAgICAgdHJhbnNpZW50RnJhbWUgPSAxOwotICAgICAgaWYobm9Fc3RQZXJGcmFtZSA+IDEpewotICAgICAgICBpZih0cmFuc2llbnRQb3MgKyB0cmFuc2llbnRQb3NPZmZzZXQgPiBoX3Nick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+dGltZVNsb3RzID4+IDEpeworICAgICAgaWYgKG5vRXN0UGVyRnJhbWUgPiAxKSB7CisgICAgICAgIGlmICh0cmFuc2llbnRQb3MgKyB0cmFuc2llbnRQb3NPZmZzZXQgPgorICAgICAgICAgICAgaF9zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPnRpbWVTbG90cyA+PiAxKSB7CiAgICAgICAgICAgKnBEZXRlY3Rpb25TdGFydFBvcyA9IG5vRXN0UGVyRnJhbWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZXsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAqcERldGVjdGlvblN0YXJ0UG9zID0gbm9Fc3RQZXJGcmFtZSA+PiAxOwogICAgICAgICB9CiAKLSAgICAgIH0KLSAgICAgIGVsc2V7CisgICAgICB9IGVsc2UgewogICAgICAgICAqcERldGVjdGlvblN0YXJ0UG9zID0gbm9Fc3RQZXJGcmFtZTsKICAgICAgIH0KLSAgfQotICBlbHNlewotICAgIGlmKHByZXZUcmFuc2llbnRGbGFnICYmICFwcmV2VHJhbnNpZW50RnJhbWUpeworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAocHJldlRyYW5zaWVudEZsYWcgJiYgIXByZXZUcmFuc2llbnRGcmFtZSkgewogICAgICAgdHJhbnNpZW50RnJhbWUgPSAxOwogICAgICAgKnBEZXRlY3Rpb25TdGFydFBvcyA9IDA7CiAgICAgfQpAQCAtNDk3LDI1ICs0OTYsMjUgQEAKICAgICogdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGZyYW1lLgogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgbmV3RGV0ZWN0aW9uQWxsb3dlZCA9IDA7Ci0gIGlmKHRyYW5zaWVudEZyYW1lKXsKKyAgaWYgKHRyYW5zaWVudEZyYW1lKSB7CiAgICAgbmV3RGV0ZWN0aW9uQWxsb3dlZCA9IDE7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaWYocHJldlRyYW5zaWVudEZyYW1lICYmCi0gICAgICAgZml4cF9hYnMocEZyYW1lSW5mby0+Ym9yZGVyc1swXSAtIChwcmV2VHJhbnNpZW50UG9zICsgdHJhbnNpZW50UG9zT2Zmc2V0IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+dGltZVNsb3RzKSkgPCBkZWx0YVRpbWUpCisgIH0gZWxzZSB7CisgICAgaWYgKHByZXZUcmFuc2llbnRGcmFtZSAmJgorICAgICAgICBmaXhwX2FicyhwRnJhbWVJbmZvLT5ib3JkZXJzWzBdIC0KKyAgICAgICAgICAgICAgICAgKHByZXZUcmFuc2llbnRQb3MgKyB0cmFuc2llbnRQb3NPZmZzZXQgLQorICAgICAgICAgICAgICAgICAgaF9zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPnRpbWVTbG90cykpIDwgZGVsdGFUaW1lKSB7CiAgICAgICBuZXdEZXRlY3Rpb25BbGxvd2VkID0gMTsKICAgICAgICpwRGV0ZWN0aW9uU3RhcnRQb3MgPSAwOworICAgIH0KICAgfQogCi0gIGhfc2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5wcmV2aW91c1RyYW5zaWVudEZsYWcgID0gdHJhbnNpZW50RmxhZzsKKyAgaF9zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPnByZXZpb3VzVHJhbnNpZW50RmxhZyA9IHRyYW5zaWVudEZsYWc7CiAgIGhfc2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5wcmV2aW91c1RyYW5zaWVudEZyYW1lID0gdHJhbnNpZW50RnJhbWU7Ci0gIGhfc2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5wcmV2aW91c1RyYW5zaWVudFBvcyAgID0gdHJhbnNpZW50UG9zOworICBoX3Nick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+cHJldmlvdXNUcmFuc2llbnRQb3MgPSB0cmFuc2llbnRQb3M7CiAKICAgcmV0dXJuIChuZXdEZXRlY3Rpb25BbGxvd2VkKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiEKICAgXGJyaWVmICAgICBDbGVhbnMgdXAgdGhlIGRldGVjdGlvbiBhZnRlciBhIHRyYW5zaWVudC4KQEAgLTUyNSw1MSArNTI0LDQxIEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB0cmFuc2llbnRDbGVhblVwKEZJWFBfREJMICoqcXVvdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqKmRldGVjdGlvblZlY3RvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwQWRkSGFybVNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnBQcmV2QWRkSGFybVNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICoqIHNpZ25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpwRnJlcUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5ld0RldGVjdGlvbkFsbG93ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwTnJnVmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJFU19IT0xEUyBtaFRocmVzaCkKLXsKLSAgSU5UIGksaixsaSwgdWksZXN0Oworc3RhdGljIHZvaWQgdHJhbnNpZW50Q2xlYW5VcChGSVhQX0RCTCAqKnF1b3RhQnVmZmVyLCBJTlQgblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKipkZXRlY3Rpb25WZWN0b3JzLCBVQ0hBUiAqcEFkZEhhcm1TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwUHJldkFkZEhhcm1TZmIsIElOVCAqKnNpZ25CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpwRnJlcUJhbmRUYWJsZSwgSU5UIHN0YXJ0LCBJTlQgc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5ld0RldGVjdGlvbkFsbG93ZWQsIEZJWFBfREJMICpwTnJnVmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJFU19IT0xEUyBtaFRocmVzaCkgeworICBJTlQgaSwgaiwgZXN0OwogCi0gIGZvcihlc3Q9c3RhcnQ7IGVzdCA8IHN0b3A7IGVzdCsrKSB7Ci0gICAgZm9yKGk9MDsgaTxuU2ZiOyBpKyspIHsKKyAgZm9yIChlc3QgPSBzdGFydDsgZXN0IDwgc3RvcDsgZXN0KyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgblNmYjsgaSsrKSB7CiAgICAgICBwQWRkSGFybVNmYltpXSA9IHBBZGRIYXJtU2ZiW2ldIHx8IGRldGVjdGlvblZlY3RvcnNbZXN0XVtpXTsKICAgICB9CiAgIH0KIAotICBpZihuZXdEZXRlY3Rpb25BbGxvd2VkID09IDEpeworICBpZiAobmV3RGV0ZWN0aW9uQWxsb3dlZCA9PSAxKSB7CiAgICAgLyoKICAgICAgKiBDaGVjayBmb3IgZHVwbGljYXRpb24gb2Ygc2luZXMgbG9jYXRlZAogICAgICAqIG9uIHRoZSBib3JkZXIgb2YgdHdvIHNjZi1iYW5kcy4KICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBmb3IoaT0wO2k8blNmYi0xO2krKykgewotICAgICAgbGkgPSBwRnJlcUJhbmRUYWJsZVtpXTsKLSAgICAgIHVpID0gcEZyZXFCYW5kVGFibGVbaSsxXTsKLQorICAgIGZvciAoaSA9IDA7IGkgPCBuU2ZiIC0gMTsgaSsrKSB7CiAgICAgICAvKiBkZXRlY3Rpb24gaW4gYWRqYWNlbnQgY2hhbm5lbHMuKi8KLSAgICAgIGlmKHBBZGRIYXJtU2ZiW2ldICYmIHBBZGRIYXJtU2ZiW2krMV0pIHsKKyAgICAgIGlmIChwQWRkSGFybVNmYltpXSAmJiBwQWRkSGFybVNmYltpICsgMV0pIHsKICAgICAgICAgRklYUF9EQkwgbWF4VmFsMSwgbWF4VmFsMjsKICAgICAgICAgSU5UIG1heFBvczEsIG1heFBvczIsIG1heFBvc1RpbWUxLCBtYXhQb3NUaW1lMjsKIAotICAgICAgICBsaSA9IHBGcmVxQmFuZFRhYmxlW2ldOwotICAgICAgICB1aSA9IHBGcmVxQmFuZFRhYmxlW2krMV07CisgICAgICAgIElOVCBsaSA9IHBGcmVxQmFuZFRhYmxlW2ldOworICAgICAgICBJTlQgdWkgPSBwRnJlcUJhbmRUYWJsZVtpICsgMV07CiAKICAgICAgICAgLyogRmluZCBtYXhpbXVtIHRvbmFsaXR5IGluIHRoZSB0aGUgdHdvIHNjZiBiYW5kcy4qLwogICAgICAgICBtYXhQb3NUaW1lMSA9IHN0YXJ0OwogICAgICAgICBtYXhQb3MxID0gbGk7CiAgICAgICAgIG1heFZhbDEgPSBxdW90YUJ1ZmZlcltzdGFydF1bbGldOwotICAgICAgICBmb3IoZXN0ID0gc3RhcnQ7IGVzdCA8IHN0b3A7IGVzdCsrKXsKLSAgICAgICAgICBmb3IoaiA9IGxpOyBqPHVpOyBqKyspewotICAgICAgICAgICAgaWYocXVvdGFCdWZmZXJbZXN0XVtqXSA+IG1heFZhbDEpeworICAgICAgICBmb3IgKGVzdCA9IHN0YXJ0OyBlc3QgPCBzdG9wOyBlc3QrKykgeworICAgICAgICAgIGZvciAoaiA9IGxpOyBqIDwgdWk7IGorKykgeworICAgICAgICAgICAgaWYgKHF1b3RhQnVmZmVyW2VzdF1bal0gPiBtYXhWYWwxKSB7CiAgICAgICAgICAgICAgIG1heFZhbDEgPSBxdW90YUJ1ZmZlcltlc3RdW2pdOwogICAgICAgICAgICAgICBtYXhQb3MxID0gajsKICAgICAgICAgICAgICAgbWF4UG9zVGltZTEgPSBlc3Q7CkBAIC01NzcsMTYgKzU2NiwxNiBAQAogICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGxpID0gcEZyZXFCYW5kVGFibGVbaSsxXTsKLSAgICAgICAgdWkgPSBwRnJlcUJhbmRUYWJsZVtpKzJdOworICAgICAgICBsaSA9IHBGcmVxQmFuZFRhYmxlW2kgKyAxXTsKKyAgICAgICAgdWkgPSBwRnJlcUJhbmRUYWJsZVtpICsgMl07CiAKICAgICAgICAgLyogRmluZCBtYXhpbXVtIHRvbmFsaXR5IGluIHRoZSB0aGUgdHdvIHNjZiBiYW5kcy4qLwogICAgICAgICBtYXhQb3NUaW1lMiA9IHN0YXJ0OwogICAgICAgICBtYXhQb3MyID0gbGk7CiAgICAgICAgIG1heFZhbDIgPSBxdW90YUJ1ZmZlcltzdGFydF1bbGldOwotICAgICAgICBmb3IoZXN0ID0gc3RhcnQ7IGVzdCA8IHN0b3A7IGVzdCsrKXsKLSAgICAgICAgICBmb3IoaiA9IGxpOyBqPHVpOyBqKyspewotICAgICAgICAgICAgaWYocXVvdGFCdWZmZXJbZXN0XVtqXSA+IG1heFZhbDIpeworICAgICAgICBmb3IgKGVzdCA9IHN0YXJ0OyBlc3QgPCBzdG9wOyBlc3QrKykgeworICAgICAgICAgIGZvciAoaiA9IGxpOyBqIDwgdWk7IGorKykgeworICAgICAgICAgICAgaWYgKHF1b3RhQnVmZmVyW2VzdF1bal0gPiBtYXhWYWwyKSB7CiAgICAgICAgICAgICAgIG1heFZhbDIgPSBxdW90YUJ1ZmZlcltlc3RdW2pdOwogICAgICAgICAgICAgICBtYXhQb3MyID0gajsKICAgICAgICAgICAgICAgbWF4UG9zVGltZTIgPSBlc3Q7CkBAIC01OTYsNDAgKzU4NSwzOSBAQAogCiAgICAgICAgIC8qIElmIHRoZSBtYXhpbXVtIHZhbHVlcyBhcmUgaW4gYWRqYWNlbnQgUU1GLWNoYW5uZWxzLCB3ZSBuZWVkIHRvIHJlbW92ZQogICAgICAgICAgICB0aGUgbG93ZXN0IG9mIHRoZSB0d28uKi8KLSAgICAgICAgaWYobWF4UG9zMi1tYXhQb3MxIDwgMil7Ci0KLSAgICAgICAgICBpZihwUHJldkFkZEhhcm1TZmJbaV0gPT0gMSAmJiBwUHJldkFkZEhhcm1TZmJbaSsxXSA9PSAwKXsKKyAgICAgICAgaWYgKG1heFBvczIgLSBtYXhQb3MxIDwgMikgeworICAgICAgICAgIGlmIChwUHJldkFkZEhhcm1TZmJbaV0gPT0gMSAmJiBwUHJldkFkZEhhcm1TZmJbaSArIDFdID09IDApIHsKICAgICAgICAgICAgIC8qIEtlZXAgdGhlIGxvd2VyLCByZW1vdmUgdGhlIHVwcGVyLiovCi0gICAgICAgICAgICBwQWRkSGFybVNmYltpKzFdID0gMDsKLSAgICAgICAgICAgIGZvcihlc3Q9c3RhcnQ7IGVzdDxzdG9wOyBlc3QrKyl7Ci0gICAgICAgICAgICAgIGRldGVjdGlvblZlY3RvcnNbZXN0XVtpKzFdID0gMDsKKyAgICAgICAgICAgIHBBZGRIYXJtU2ZiW2kgKyAxXSA9IDA7CisgICAgICAgICAgICBmb3IgKGVzdCA9IHN0YXJ0OyBlc3QgPCBzdG9wOyBlc3QrKykgeworICAgICAgICAgICAgICBkZXRlY3Rpb25WZWN0b3JzW2VzdF1baSArIDFdID0gMDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgIGlmKHBQcmV2QWRkSGFybVNmYltpXSA9PSAwICYmIHBQcmV2QWRkSGFybVNmYltpKzFdID09IDEpeworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocFByZXZBZGRIYXJtU2ZiW2ldID09IDAgJiYgcFByZXZBZGRIYXJtU2ZiW2kgKyAxXSA9PSAxKSB7CiAgICAgICAgICAgICAgIC8qIEtlZXAgdGhlIHVwcGVyLCByZW1vdmUgdGhlIGxvd2VyLiovCiAgICAgICAgICAgICAgIHBBZGRIYXJtU2ZiW2ldID0gMDsKLSAgICAgICAgICAgICAgZm9yKGVzdD1zdGFydDsgZXN0PHN0b3A7IGVzdCsrKXsKKyAgICAgICAgICAgICAgZm9yIChlc3QgPSBzdGFydDsgZXN0IDwgc3RvcDsgZXN0KyspIHsKICAgICAgICAgICAgICAgICBkZXRlY3Rpb25WZWN0b3JzW2VzdF1baV0gPSAwOwogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgIC8qIElmIHRoZSBtYXhpbXVtIHZhbHVlcyBhcmUgaW4gYWRqYWNlbnQgUU1GLWNoYW5uZWxzLCBhbmQgaWYgdGhlIHNpZ25zIGluZGljYXRlIHRoYXQgaXQgaXMgdGhlIHNhbWUgc2luZSwKLSAgICAgICAgICAgICAgICB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgbG93ZXN0IG9mIHRoZSB0d28uKi8KLSAgICAgICAgICAgICAgaWYobWF4VmFsMSA+IG1heFZhbDIpewotICAgICAgICAgICAgICAgIGlmKHNpZ25CdWZmZXJbbWF4UG9zVGltZTFdW21heFBvczJdIDwgMCAmJiBzaWduQnVmZmVyW21heFBvc1RpbWUxXVttYXhQb3MxXSA+IDApeworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLyogSWYgdGhlIG1heGltdW0gdmFsdWVzIGFyZSBpbiBhZGphY2VudCBRTUYtY2hhbm5lbHMsIGFuZCBpZiB0aGUKKyAgICAgICAgICAgICAgICAgc2lnbnMgaW5kaWNhdGUgdGhhdCBpdCBpcyB0aGUgc2FtZSBzaW5lLCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUKKyAgICAgICAgICAgICAgICAgbG93ZXN0IG9mIHRoZSB0d28uKi8KKyAgICAgICAgICAgICAgaWYgKG1heFZhbDEgPiBtYXhWYWwyKSB7CisgICAgICAgICAgICAgICAgaWYgKHNpZ25CdWZmZXJbbWF4UG9zVGltZTFdW21heFBvczJdIDwgMCAmJgorICAgICAgICAgICAgICAgICAgICBzaWduQnVmZmVyW21heFBvc1RpbWUxXVttYXhQb3MxXSA+IDApIHsKICAgICAgICAgICAgICAgICAgIC8qIEtlZXAgdGhlIGxvd2VyLCByZW1vdmUgdGhlIHVwcGVyLiovCi0gICAgICAgICAgICAgICAgICBwQWRkSGFybVNmYltpKzFdID0gMDsKLSAgICAgICAgICAgICAgICAgIGZvcihlc3Q9c3RhcnQ7IGVzdDxzdG9wOyBlc3QrKyl7Ci0gICAgICAgICAgICAgICAgICAgIGRldGVjdGlvblZlY3RvcnNbZXN0XVtpKzFdID0gMDsKKyAgICAgICAgICAgICAgICAgIHBBZGRIYXJtU2ZiW2kgKyAxXSA9IDA7CisgICAgICAgICAgICAgICAgICBmb3IgKGVzdCA9IHN0YXJ0OyBlc3QgPCBzdG9wOyBlc3QrKykgeworICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb25WZWN0b3JzW2VzdF1baSArIDFdID0gMDsKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICBpZihzaWduQnVmZmVyW21heFBvc1RpbWUyXVttYXhQb3MyXSA8IDAgJiYgc2lnbkJ1ZmZlclttYXhQb3NUaW1lMl1bbWF4UG9zMV0gPiAwKXsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoc2lnbkJ1ZmZlclttYXhQb3NUaW1lMl1bbWF4UG9zMl0gPCAwICYmCisgICAgICAgICAgICAgICAgICAgIHNpZ25CdWZmZXJbbWF4UG9zVGltZTJdW21heFBvczFdID4gMCkgewogICAgICAgICAgICAgICAgICAgLyogS2VlcCB0aGUgdXBwZXIsIHJlbW92ZSB0aGUgbG93ZXIuKi8KICAgICAgICAgICAgICAgICAgIHBBZGRIYXJtU2ZiW2ldID0gMDsKLSAgICAgICAgICAgICAgICAgIGZvcihlc3Q9c3RhcnQ7IGVzdDxzdG9wOyBlc3QrKyl7CisgICAgICAgICAgICAgICAgICBmb3IgKGVzdCA9IHN0YXJ0OyBlc3QgPCBzdG9wOyBlc3QrKykgewogICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb25WZWN0b3JzW2VzdF1baV0gPSAwOwogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTY0MSwyOCArNjI5LDE5IEBACiAgICAgfQogCiAgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGRldGVjdGlvbiBpcyBub3QgdGhlIGN1dC1vZmYgb2YgYSBsb3cgcGFzcyBmaWx0ZXIuICovCi0gICAgcmVtb3ZlTG93UGFzc0RldGVjdGlvbihwQWRkSGFybVNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdGlvblZlY3RvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZyZXFCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwTnJnVmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWhUaHJlc2gpOwotICB9Ci0gIGVsc2UgewotICAgLyoKLSAgICAqIElmIGEgbWlzc2luZyBoYXJtb25pYyB3YXNuJ3QgbWlzc2luZyB0aGUgcHJldmlvdXMgZnJhbWUKLSAgICAqIHRoZSB0cmFuc2llbnQtZmxhZyBuZWVkcyB0byBiZSBzZXQgaW4gb3JkZXIgdG8gYmUgYWxsb3dlZCB0byBkZXRlY3QgaXQuCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBmb3IoaT0wO2k8blNmYjtpKyspewotICAgICAgaWYocEFkZEhhcm1TZmJbaV0gLSBwUHJldkFkZEhhcm1TZmJbaV0gPiAwKQotICAgICAgICBwQWRkSGFybVNmYltpXSA9IDA7CisgICAgcmVtb3ZlTG93UGFzc0RldGVjdGlvbihwQWRkSGFybVNmYiwgZGV0ZWN0aW9uVmVjdG9ycywgc3RhcnQsIHN0b3AsIG5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnJlcUJhbmRUYWJsZSwgcE5yZ1ZlY3RvciwgbWhUaHJlc2gpOworICB9IGVsc2UgeworICAgIC8qCisgICAgICogSWYgYSBtaXNzaW5nIGhhcm1vbmljIHdhc24ndCBtaXNzaW5nIHRoZSBwcmV2aW91cyBmcmFtZQorICAgICAqIHRoZSB0cmFuc2llbnQtZmxhZyBuZWVkcyB0byBiZSBzZXQgaW4gb3JkZXIgdG8gYmUgYWxsb3dlZCB0byBkZXRlY3QgaXQuCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgZm9yIChpID0gMDsgaSA8IG5TZmI7IGkrKykgeworICAgICAgaWYgKHBBZGRIYXJtU2ZiW2ldIC0gcFByZXZBZGRIYXJtU2ZiW2ldID4gMCkgcEFkZEhhcm1TZmJbaV0gPSAwOwogICAgIH0KICAgfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQogICBcYnJpZWYgICAgIERldGVjdGlvbiBmb3Igb25lIHRvbmFsaXR5IGVzdGltYXRlLgpAQCAtNjg5LDQyICs2NjgsMzUgQEAKIAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGRldGVjdGlvbihGSVhQX0RCTCAqcXVvdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBEaWZmVmVjU2NmYiwKLSAgICAgICAgICAgICAgICAgICAgICBJTlQgblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcEhhcm1WZWMsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKnBGcmVxQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZm1PcmlnLAotICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZm1TYnIsCi0gICAgICAgICAgICAgICAgICAgICAgR1VJREVfVkVDVE9SUyBndWlkZVZlY3RvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgR1VJREVfVkVDVE9SUyBuZXdHdWlkZVZlY3RvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgVEhSRVNfSE9MRFMgbWhUaHJlc2gpCi17Ci0KLSAgSU5UIGksaixsbCwgbHU7Ci0gIEZJWFBfREJMIHRocmVzVGVtcCx0aHJlc09yaWc7CitzdGF0aWMgdm9pZCBkZXRlY3Rpb24oRklYUF9EQkwgKnF1b3RhQnVmZmVyLCBGSVhQX0RCTCAqcERpZmZWZWNTY2ZiLCBJTlQgblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqcEhhcm1WZWMsIGNvbnN0IFVDSEFSICpwRnJlcUJhbmRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZtT3JpZywgRklYUF9EQkwgKnNmbVNiciwKKyAgICAgICAgICAgICAgICAgICAgICBHVUlERV9WRUNUT1JTIGd1aWRlVmVjdG9ycywgR1VJREVfVkVDVE9SUyBuZXdHdWlkZVZlY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgVEhSRVNfSE9MRFMgbWhUaHJlc2gpIHsKKyAgSU5UIGksIGosIGxsLCBsdTsKKyAgRklYUF9EQkwgdGhyZXNUZW1wLCB0aHJlc09yaWc7CiAKICAgLyoKICAgICogRG8gZGV0ZWN0aW9uIG9uIHRoZSBkaWZmZXJlbmNlIHZlY3RvciwgaS5lLiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCiAgICAqIHRoZSBvcmlnaW5hbCBhbmQgdGhlIHRyYW5zcG9zZWQuCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIGZvcihpPTA7aTxuU2ZiO2krKyl7Ci0KKyAgZm9yIChpID0gMDsgaSA8IG5TZmI7IGkrKykgewogICAgIHRocmVzVGVtcCA9IChndWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JEaWZmW2ldICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKQotICAgICAgICAgICAgICAgICAgPyBmTWF4KGZNdWx0KG1oVGhyZXNoLmRlY2F5R3VpZGVEaWZmLGd1aWRlVmVjdG9ycy5ndWlkZVZlY3RvckRpZmZbaV0pLCBtaFRocmVzaC50aHJlc0hvbGREaWZmR3VpZGUpCi0gICAgICAgICAgICAgICAgICA6IG1oVGhyZXNoLnRocmVzSG9sZERpZmY7CisgICAgICAgICAgICAgICAgICAgID8gZk1heChmTXVsdChtaFRocmVzaC5kZWNheUd1aWRlRGlmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlVmVjdG9ycy5ndWlkZVZlY3RvckRpZmZbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWhUaHJlc2gudGhyZXNIb2xkRGlmZkd1aWRlKQorICAgICAgICAgICAgICAgICAgICA6IG1oVGhyZXNoLnRocmVzSG9sZERpZmY7CiAKICAgICB0aHJlc1RlbXAgPSBmTWluKHRocmVzVGVtcCwgbWhUaHJlc2gudGhyZXNIb2xkRGlmZik7CiAKLSAgICBpZihwRGlmZlZlY1NjZmJbaV0gPiB0aHJlc1RlbXApeworICAgIGlmIChwRGlmZlZlY1NjZmJbaV0gPiB0aHJlc1RlbXApIHsKICAgICAgIHBIYXJtVmVjW2ldID0gMTsKICAgICAgIG5ld0d1aWRlVmVjdG9ycy5ndWlkZVZlY3RvckRpZmZbaV0gPSBwRGlmZlZlY1NjZmJbaV07Ci0gICAgfQotICAgIGVsc2V7CisgICAgfSBlbHNlIHsKICAgICAgIC8qIElmIHRoZSBndWlkZSB3YXNuJ3QgemVybywgYnV0IHRoZSBjdXJyZW50IGxldmVsIGlzIHRvIGxvdywKICAgICAgICAgIHN0YXJ0IHRyYWNraW5nIHRoZSBkZWNheSBvbiB0aGUgdG9uZSBpbiB0aGUgb3JpZ2luYWwgcmF0aGVyCiAgICAgICAgICB0aGFuIHRoZSBkaWZmZXJlbmNlLiovCi0gICAgICBpZihndWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JEaWZmW2ldICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKXsKKyAgICAgIGlmIChndWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JEaWZmW2ldICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CiAgICAgICAgIGd1aWRlVmVjdG9ycy5ndWlkZVZlY3Rvck9yaWdbaV0gPSBtaFRocmVzaC50aHJlc0hvbGRUb25lR3VpZGU7CiAgICAgICB9CiAgICAgfQpAQCAtNzM2LDE2ICs3MDgsMTggQEAKICAgICogbXVsdGlwbGUgdG9uZXMgaW4gdGhlIHNiciBzaWduYWwuCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gIGZvcihpPTA7aTxuU2ZiO2krKyl7CisgIGZvciAoaSA9IDA7IGkgPCBuU2ZiOyBpKyspIHsKICAgICBsbCA9IHBGcmVxQmFuZFRhYmxlW2ldOwotICAgIGx1ID0gcEZyZXFCYW5kVGFibGVbaSsxXTsKKyAgICBsdSA9IHBGcmVxQmFuZFRhYmxlW2kgKyAxXTsKIAotICAgIHRocmVzT3JpZyA9IGZpeE1heChmTXVsdChndWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JPcmlnW2ldLCBtaFRocmVzaC5kZWNheUd1aWRlT3JpZyksIG1oVGhyZXNoLnRocmVzSG9sZFRvbmVHdWlkZSk7CisgICAgdGhyZXNPcmlnID0KKyAgICAgICAgZml4TWF4KGZNdWx0KGd1aWRlVmVjdG9ycy5ndWlkZVZlY3Rvck9yaWdbaV0sIG1oVGhyZXNoLmRlY2F5R3VpZGVPcmlnKSwKKyAgICAgICAgICAgICAgIG1oVGhyZXNoLnRocmVzSG9sZFRvbmVHdWlkZSk7CiAgICAgdGhyZXNPcmlnID0gZml4TWluKHRocmVzT3JpZywgbWhUaHJlc2gudGhyZXNIb2xkVG9uZSk7CiAKLSAgICBpZihndWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JPcmlnW2ldICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKXsKLSAgICAgIGZvcihqPSBsbDtqPGx1O2orKyl7Ci0gICAgICAgIGlmKHF1b3RhQnVmZmVyW2pdID4gdGhyZXNPcmlnKXsKKyAgICBpZiAoZ3VpZGVWZWN0b3JzLmd1aWRlVmVjdG9yT3JpZ1tpXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgZm9yIChqID0gbGw7IGogPCBsdTsgaisrKSB7CisgICAgICAgIGlmIChxdW90YUJ1ZmZlcltqXSA+IHRocmVzT3JpZykgewogICAgICAgICAgIHBIYXJtVmVjW2ldID0gMTsKICAgICAgICAgICBuZXdHdWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JPcmlnW2ldID0gcXVvdGFCdWZmZXJbal07CiAgICAgICAgIH0KQEAgLTc1OSwzMyArNzMzLDM2IEBACiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICB0aHJlc09yaWcgPSBtaFRocmVzaC50aHJlc0hvbGRUb25lOwogCi0gIGZvcihpPTA7aTxuU2ZiO2krKyl7CisgIGZvciAoaSA9IDA7IGkgPCBuU2ZiOyBpKyspIHsKICAgICBsbCA9IHBGcmVxQmFuZFRhYmxlW2ldOwotICAgIGx1ID0gcEZyZXFCYW5kVGFibGVbaSsxXTsKKyAgICBsdSA9IHBGcmVxQmFuZFRhYmxlW2kgKyAxXTsKIAotICAgIGlmKHBIYXJtVmVjW2ldID09IDApewotICAgICAgaWYobHUgLWxsID4gMSl7Ci0gICAgICAgIGZvcihqPSBsbDtqPGx1O2orKyl7Ci0gICAgICAgICAgaWYocXVvdGFCdWZmZXJbal0gPiB0aHJlc09yaWcgJiYgKHNmbVNicltpXSA+IG1oVGhyZXNoLnNmbVRocmVzU2JyICYmIHNmbU9yaWdbaV0gPCBtaFRocmVzaC5zZm1UaHJlc09yaWcpKXsKKyAgICBpZiAocEhhcm1WZWNbaV0gPT0gMCkgeworICAgICAgaWYgKGx1IC0gbGwgPiAxKSB7CisgICAgICAgIGZvciAoaiA9IGxsOyBqIDwgbHU7IGorKykgeworICAgICAgICAgIGlmIChxdW90YUJ1ZmZlcltqXSA+IHRocmVzT3JpZyAmJgorICAgICAgICAgICAgICAoc2ZtU2JyW2ldID4gbWhUaHJlc2guc2ZtVGhyZXNTYnIgJiYKKyAgICAgICAgICAgICAgIHNmbU9yaWdbaV0gPCBtaFRocmVzaC5zZm1UaHJlc09yaWcpKSB7CiAgICAgICAgICAgICBwSGFybVZlY1tpXSA9IDE7CiAgICAgICAgICAgICBuZXdHdWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JPcmlnW2ldID0gcXVvdGFCdWZmZXJbal07CiAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlewotICAgICAgICBpZihpIDwgblNmYiAtMSl7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoaSA8IG5TZmIgLSAxKSB7CiAgICAgICAgICAgbGwgPSBwRnJlcUJhbmRUYWJsZVtpXTsKIAotICAgICAgICAgIGlmKGk+MCl7Ci0gICAgICAgICAgICBpZihxdW90YUJ1ZmZlcltsbF0gPiBtaFRocmVzaC50aHJlc0hvbGRUb25lICYmIChwRGlmZlZlY1NjZmJbaSsxXSA8IG1oVGhyZXNoLmludlRocmVzSG9sZFRvbmUgfHwgcERpZmZWZWNTY2ZiW2ktMV0gPCBtaFRocmVzaC5pbnZUaHJlc0hvbGRUb25lKSl7Ci0gICAgICAgICAgICAgICAgcEhhcm1WZWNbaV0gPSAxOwotICAgICAgICAgICAgICAgIG5ld0d1aWRlVmVjdG9ycy5ndWlkZVZlY3Rvck9yaWdbaV0gPSBxdW90YUJ1ZmZlcltsbF07CisgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICBpZiAocXVvdGFCdWZmZXJbbGxdID4gbWhUaHJlc2gudGhyZXNIb2xkVG9uZSAmJgorICAgICAgICAgICAgICAgIChwRGlmZlZlY1NjZmJbaSArIDFdIDwgbWhUaHJlc2guaW52VGhyZXNIb2xkVG9uZSB8fAorICAgICAgICAgICAgICAgICBwRGlmZlZlY1NjZmJbaSAtIDFdIDwgbWhUaHJlc2guaW52VGhyZXNIb2xkVG9uZSkpIHsKKyAgICAgICAgICAgICAgcEhhcm1WZWNbaV0gPSAxOworICAgICAgICAgICAgICBuZXdHdWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JPcmlnW2ldID0gcXVvdGFCdWZmZXJbbGxdOwogICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlewotICAgICAgICAgICAgaWYocXVvdGFCdWZmZXJbbGxdID4gbWhUaHJlc2gudGhyZXNIb2xkVG9uZSAmJiBwRGlmZlZlY1NjZmJbaSsxXSA8IG1oVGhyZXNoLmludlRocmVzSG9sZFRvbmUpewotICAgICAgICAgICAgICAgIHBIYXJtVmVjW2ldID0gMTsKLSAgICAgICAgICAgICAgICBuZXdHdWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JPcmlnW2ldID0gcXVvdGFCdWZmZXJbbGxdOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocXVvdGFCdWZmZXJbbGxdID4gbWhUaHJlc2gudGhyZXNIb2xkVG9uZSAmJgorICAgICAgICAgICAgICAgIHBEaWZmVmVjU2NmYltpICsgMV0gPCBtaFRocmVzaC5pbnZUaHJlc0hvbGRUb25lKSB7CisgICAgICAgICAgICAgIHBIYXJtVmVjW2ldID0gMTsKKyAgICAgICAgICAgICAgbmV3R3VpZGVWZWN0b3JzLmd1aWRlVmVjdG9yT3JpZ1tpXSA9IHF1b3RhQnVmZmVyW2xsXTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTc5NCw3ICs3NzEsNiBAQAogICB9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAgIFxicmllZiAgICAgRG8gZGV0ZWN0aW9uIGZvciBldmVyeSB0b25hbGl0eSBlc3RpbWF0ZSwgdXNpbmcgZm9yd2FyZCBwcmVkaWN0aW9uLgpAQCAtODA0LDE0OSArNzgwLDExNiBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZGV0ZWN0aW9uV2l0aFByZWRpY3Rpb24oRklYUF9EQkwgKipxdW90YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqcERpZmZWZWNTY2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICoqIHNpZ25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSKiBwRnJlcUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqc2ZtT3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqc2ZtU2JyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKipkZXRlY3Rpb25WZWN0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnBQcmV2QWRkSGFybVNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdVSURFX1ZFQ1RPUlMgKmd1aWRlVmVjdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBub0VzdFBlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGRldGVjdGlvblN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRvdE5vRXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5ld0RldGVjdGlvbkFsbG93ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnBBZGRIYXJtRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwQWRkSGFybVNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwTnJnVmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREVURUNUT1JfUEFSQU1FVEVSU19NSCAqbWhQYXJhbXMpCi17Ci0gIElOVCBlc3QgPSAwLGk7CitzdGF0aWMgdm9pZCBkZXRlY3Rpb25XaXRoUHJlZGljdGlvbigKKyAgICBGSVhQX0RCTCAqKnF1b3RhQnVmZmVyLCBGSVhQX0RCTCAqKnBEaWZmVmVjU2NmYiwgSU5UICoqc2lnbkJ1ZmZlciwgSU5UIG5TZmIsCisgICAgY29uc3QgVUNIQVIgKnBGcmVxQmFuZFRhYmxlLCBGSVhQX0RCTCAqKnNmbU9yaWcsIEZJWFBfREJMICoqc2ZtU2JyLAorICAgIFVDSEFSICoqZGV0ZWN0aW9uVmVjdG9ycywgVUNIQVIgKnBQcmV2QWRkSGFybVNmYiwKKyAgICBHVUlERV9WRUNUT1JTICpndWlkZVZlY3RvcnMsIElOVCBub0VzdFBlckZyYW1lLCBJTlQgZGV0ZWN0aW9uU3RhcnQsCisgICAgSU5UIHRvdE5vRXN0LCBJTlQgbmV3RGV0ZWN0aW9uQWxsb3dlZCwgSU5UICpwQWRkSGFybUZsYWcsCisgICAgVUNIQVIgKnBBZGRIYXJtU2ZiLCBGSVhQX0RCTCAqcE5yZ1ZlY3RvciwKKyAgICBjb25zdCBERVRFQ1RPUl9QQVJBTUVURVJTX01IICptaFBhcmFtcykgeworICBJTlQgZXN0ID0gMCwgaTsKICAgSU5UIHN0YXJ0OwogCi0gIEZES21lbWNsZWFyKHBBZGRIYXJtU2ZiLG5TZmIqc2l6ZW9mKFVDSEFSKSk7CisgIEZES21lbWNsZWFyKHBBZGRIYXJtU2ZiLCBuU2ZiICogc2l6ZW9mKFVDSEFSKSk7CiAKLSAgaWYobmV3RGV0ZWN0aW9uQWxsb3dlZCl7Ci0KLSAgICAvKiBTaW5jZSB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgdHJhbnNpZW50IHJlZ2lvbiBmb3IgZGV0ZWN0aW9uIChzaW5jZSB0aGUgdG9uYWxpdHkgdmFsdWVzCi0gICAgICAgdGVuZCB0byBiZSBhIGJpdCB1bnJlbGlhYmxlIGZvciB0aGlzIHJlZ2lvbikgdGhlIGd1aWRlLXZhbHVlcyBhcmUgY29waWVkIHRvIHRoZSBjdXJyZW50Ci0gICAgICAgc3RhcnRpbmcgcG9pbnQuICovCi0gICAgaWYodG90Tm9Fc3QgPiAxKXsKLSAgICAgIHN0YXJ0ID0gZGV0ZWN0aW9uU3RhcnQrMTsKKyAgaWYgKG5ld0RldGVjdGlvbkFsbG93ZWQpIHsKKyAgICAvKiBTaW5jZSB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgdHJhbnNpZW50IHJlZ2lvbiBmb3IgZGV0ZWN0aW9uIChzaW5jZSB0aGUKKyAgICAgICB0b25hbGl0eSB2YWx1ZXMgdGVuZCB0byBiZSBhIGJpdCB1bnJlbGlhYmxlIGZvciB0aGlzIHJlZ2lvbikgdGhlCisgICAgICAgZ3VpZGUtdmFsdWVzIGFyZSBjb3BpZWQgdG8gdGhlIGN1cnJlbnQgc3RhcnRpbmcgcG9pbnQuICovCisgICAgaWYgKHRvdE5vRXN0ID4gMSkgeworICAgICAgc3RhcnQgPSBkZXRlY3Rpb25TdGFydCArIDE7CiAKICAgICAgIGlmIChzdGFydCAhPSAwKSB7Ci0gICAgICAgIEZES21lbWNweShndWlkZVZlY3RvcnNbc3RhcnRdLmd1aWRlVmVjdG9yRGlmZixndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEaWZmLG5TZmIqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgICAgIEZES21lbWNweShndWlkZVZlY3RvcnNbc3RhcnRdLmd1aWRlVmVjdG9yT3JpZyxndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JPcmlnLG5TZmIqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgICAgIEZES21lbWNsZWFyKGd1aWRlVmVjdG9yc1tzdGFydC0xXS5ndWlkZVZlY3RvckRldGVjdGVkLG5TZmIqc2l6ZW9mKFVDSEFSKSk7CisgICAgICAgIEZES21lbWNweShndWlkZVZlY3RvcnNbc3RhcnRdLmd1aWRlVmVjdG9yRGlmZiwKKyAgICAgICAgICAgICAgICAgIGd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3RvckRpZmYsIG5TZmIgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgRkRLbWVtY3B5KGd1aWRlVmVjdG9yc1tzdGFydF0uZ3VpZGVWZWN0b3JPcmlnLAorICAgICAgICAgICAgICAgICAgZ3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yT3JpZywgblNmYiAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICBGREttZW1jbGVhcihndWlkZVZlY3RvcnNbc3RhcnQgLSAxXS5ndWlkZVZlY3RvckRldGVjdGVkLAorICAgICAgICAgICAgICAgICAgICBuU2ZiICogc2l6ZW9mKFVDSEFSKSk7CiAgICAgICB9Ci0gICAgfQotICAgIGVsc2V7CisgICAgfSBlbHNlIHsKICAgICAgIHN0YXJ0ID0gMDsKICAgICB9Ci0gIH0KLSAgZWxzZXsKKyAgfSBlbHNlIHsKICAgICBzdGFydCA9IDA7CiAgIH0KIAotCi0gIGZvcihlc3QgPSBzdGFydDsgZXN0IDwgdG90Tm9Fc3Q7IGVzdCsrKXsKLQorICBmb3IgKGVzdCA9IHN0YXJ0OyBlc3QgPCB0b3ROb0VzdDsgZXN0KyspIHsKICAgICAvKgotICAgICogRG8gZGV0ZWN0aW9uIG9uIHRoZSBjdXJyZW50IGZyYW1lIHVzaW5nCi0gICAgKiBndWlkZS1pbmZvIGZyb20gdGhlIHByZXZpb3VzLgotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYoZXN0ID4gMCl7Ci0gICAgICBGREttZW1jcHkoZ3VpZGVWZWN0b3JzW2VzdF0uZ3VpZGVWZWN0b3JEZXRlY3RlZCxkZXRlY3Rpb25WZWN0b3JzW2VzdC0xXSxuU2ZiKnNpemVvZihVQ0hBUikpOworICAgICAqIERvIGRldGVjdGlvbiBvbiB0aGUgY3VycmVudCBmcmFtZSB1c2luZworICAgICAqIGd1aWRlLWluZm8gZnJvbSB0aGUgcHJldmlvdXMuCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKGVzdCA+IDApIHsKKyAgICAgIEZES21lbWNweShndWlkZVZlY3RvcnNbZXN0XS5ndWlkZVZlY3RvckRldGVjdGVkLAorICAgICAgICAgICAgICAgIGRldGVjdGlvblZlY3RvcnNbZXN0IC0gMV0sIG5TZmIgKiBzaXplb2YoVUNIQVIpKTsKICAgICB9CiAKLSAgICBGREttZW1jbGVhcihkZXRlY3Rpb25WZWN0b3JzW2VzdF0sIG5TZmIqc2l6ZW9mKFVDSEFSKSk7CisgICAgRkRLbWVtY2xlYXIoZGV0ZWN0aW9uVmVjdG9yc1tlc3RdLCBuU2ZiICogc2l6ZW9mKFVDSEFSKSk7CiAKLSAgICBpZihlc3QgPCB0b3ROb0VzdC0xKXsKLSAgICAgIEZES21lbWNsZWFyKGd1aWRlVmVjdG9yc1tlc3QrMV0uZ3VpZGVWZWN0b3JEaWZmLG5TZmIqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgICBGREttZW1jbGVhcihndWlkZVZlY3RvcnNbZXN0KzFdLmd1aWRlVmVjdG9yT3JpZyxuU2ZiKnNpemVvZihGSVhQX0RCTCkpOwotICAgICAgRkRLbWVtY2xlYXIoZ3VpZGVWZWN0b3JzW2VzdCsxXS5ndWlkZVZlY3RvckRldGVjdGVkLG5TZmIqc2l6ZW9mKFVDSEFSKSk7CisgICAgaWYgKGVzdCA8IHRvdE5vRXN0IC0gMSkgeworICAgICAgRkRLbWVtY2xlYXIoZ3VpZGVWZWN0b3JzW2VzdCArIDFdLmd1aWRlVmVjdG9yRGlmZiwKKyAgICAgICAgICAgICAgICAgIG5TZmIgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgIEZES21lbWNsZWFyKGd1aWRlVmVjdG9yc1tlc3QgKyAxXS5ndWlkZVZlY3Rvck9yaWcsCisgICAgICAgICAgICAgICAgICBuU2ZiICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBGREttZW1jbGVhcihndWlkZVZlY3RvcnNbZXN0ICsgMV0uZ3VpZGVWZWN0b3JEZXRlY3RlZCwKKyAgICAgICAgICAgICAgICAgIG5TZmIgKiBzaXplb2YoVUNIQVIpKTsKIAotICAgICAgZGV0ZWN0aW9uKHF1b3RhQnVmZmVyW2VzdF0sCi0gICAgICAgICAgICAgICAgcERpZmZWZWNTY2ZiW2VzdF0sCi0gICAgICAgICAgICAgICAgblNmYiwKLSAgICAgICAgICAgICAgICBkZXRlY3Rpb25WZWN0b3JzW2VzdF0sCi0gICAgICAgICAgICAgICAgcEZyZXFCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgc2ZtT3JpZ1tlc3RdLAotICAgICAgICAgICAgICAgIHNmbVNicltlc3RdLAotICAgICAgICAgICAgICAgIGd1aWRlVmVjdG9yc1tlc3RdLAotICAgICAgICAgICAgICAgIGd1aWRlVmVjdG9yc1tlc3QrMV0sCisgICAgICBkZXRlY3Rpb24ocXVvdGFCdWZmZXJbZXN0XSwgcERpZmZWZWNTY2ZiW2VzdF0sIG5TZmIsCisgICAgICAgICAgICAgICAgZGV0ZWN0aW9uVmVjdG9yc1tlc3RdLCBwRnJlcUJhbmRUYWJsZSwgc2ZtT3JpZ1tlc3RdLAorICAgICAgICAgICAgICAgIHNmbVNicltlc3RdLCBndWlkZVZlY3RvcnNbZXN0XSwgZ3VpZGVWZWN0b3JzW2VzdCArIDFdLAogICAgICAgICAgICAgICAgIG1oUGFyYW1zLT50aHJlc0hvbGRzKTsKLSAgICB9Ci0gICAgZWxzZXsKLSAgICAgIEZES21lbWNsZWFyKGd1aWRlVmVjdG9yc1tlc3RdLmd1aWRlVmVjdG9yRGlmZixuU2ZiKnNpemVvZihGSVhQX0RCTCkpOwotICAgICAgRkRLbWVtY2xlYXIoZ3VpZGVWZWN0b3JzW2VzdF0uZ3VpZGVWZWN0b3JPcmlnLG5TZmIqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gICAgICBGREttZW1jbGVhcihndWlkZVZlY3RvcnNbZXN0XS5ndWlkZVZlY3RvckRldGVjdGVkLG5TZmIqc2l6ZW9mKFVDSEFSKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZES21lbWNsZWFyKGd1aWRlVmVjdG9yc1tlc3RdLmd1aWRlVmVjdG9yRGlmZiwgblNmYiAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgRkRLbWVtY2xlYXIoZ3VpZGVWZWN0b3JzW2VzdF0uZ3VpZGVWZWN0b3JPcmlnLCBuU2ZiICogc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBGREttZW1jbGVhcihndWlkZVZlY3RvcnNbZXN0XS5ndWlkZVZlY3RvckRldGVjdGVkLCBuU2ZiICogc2l6ZW9mKFVDSEFSKSk7CiAKLSAgICAgIGRldGVjdGlvbihxdW90YUJ1ZmZlcltlc3RdLAotICAgICAgICAgICAgICAgIHBEaWZmVmVjU2NmYltlc3RdLAotICAgICAgICAgICAgICAgIG5TZmIsCi0gICAgICAgICAgICAgICAgZGV0ZWN0aW9uVmVjdG9yc1tlc3RdLAotICAgICAgICAgICAgICAgIHBGcmVxQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgIHNmbU9yaWdbZXN0XSwKLSAgICAgICAgICAgICAgICBzZm1TYnJbZXN0XSwKLSAgICAgICAgICAgICAgICBndWlkZVZlY3RvcnNbZXN0XSwKLSAgICAgICAgICAgICAgICBndWlkZVZlY3RvcnNbZXN0XSwKKyAgICAgIGRldGVjdGlvbihxdW90YUJ1ZmZlcltlc3RdLCBwRGlmZlZlY1NjZmJbZXN0XSwgblNmYiwKKyAgICAgICAgICAgICAgICBkZXRlY3Rpb25WZWN0b3JzW2VzdF0sIHBGcmVxQmFuZFRhYmxlLCBzZm1PcmlnW2VzdF0sCisgICAgICAgICAgICAgICAgc2ZtU2JyW2VzdF0sIGd1aWRlVmVjdG9yc1tlc3RdLCBndWlkZVZlY3RvcnNbZXN0XSwKICAgICAgICAgICAgICAgICBtaFBhcmFtcy0+dGhyZXNIb2xkcyk7CiAgICAgfQogICB9CiAKLQogICAvKiBDbGVhbiB1cCB0aGUgZGV0ZWN0aW9uLiovCi0gIHRyYW5zaWVudENsZWFuVXAocXVvdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgblNmYiwKLSAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb25WZWN0b3JzLAotICAgICAgICAgICAgICAgICAgIHBBZGRIYXJtU2ZiLAotICAgICAgICAgICAgICAgICAgIHBQcmV2QWRkSGFybVNmYiwKLSAgICAgICAgICAgICAgICAgICBzaWduQnVmZmVyLAotICAgICAgICAgICAgICAgICAgIHBGcmVxQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgICAgIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgIHRvdE5vRXN0LAotICAgICAgICAgICAgICAgICAgIG5ld0RldGVjdGlvbkFsbG93ZWQsCi0gICAgICAgICAgICAgICAgICAgcE5yZ1ZlY3RvciwKLSAgICAgICAgICAgICAgICAgICBtaFBhcmFtcy0+dGhyZXNIb2xkcyk7Ci0KKyAgdHJhbnNpZW50Q2xlYW5VcChxdW90YUJ1ZmZlciwgblNmYiwgZGV0ZWN0aW9uVmVjdG9ycywgcEFkZEhhcm1TZmIsCisgICAgICAgICAgICAgICAgICAgcFByZXZBZGRIYXJtU2ZiLCBzaWduQnVmZmVyLCBwRnJlcUJhbmRUYWJsZSwgc3RhcnQsIHRvdE5vRXN0LAorICAgICAgICAgICAgICAgICAgIG5ld0RldGVjdGlvbkFsbG93ZWQsIHBOcmdWZWN0b3IsIG1oUGFyYW1zLT50aHJlc0hvbGRzKTsKIAogICAvKiBTZXQgZmxhZy4uLiAqLwogICAqcEFkZEhhcm1GbGFnID0gMDsKLSAgZm9yKGk9MDsgaTxuU2ZiOyBpKyspewotICAgIGlmKHBBZGRIYXJtU2ZiW2ldKXsKKyAgZm9yIChpID0gMDsgaSA8IG5TZmI7IGkrKykgeworICAgIGlmIChwQWRkSGFybVNmYltpXSkgewogICAgICAgKnBBZGRIYXJtRmxhZyA9IDE7CiAgICAgICBicmVhazsKICAgICB9CiAgIH0KIAotICBGREttZW1jcHkocFByZXZBZGRIYXJtU2ZiLCBwQWRkSGFybVNmYiwgblNmYipzaXplb2YoVUNIQVIpKTsKLSAgRkRLbWVtY3B5KGd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3RvckRldGVjdGVkLHBBZGRIYXJtU2ZiLG5TZmIqc2l6ZW9mKElOVCkpOworICBGREttZW1jcHkocFByZXZBZGRIYXJtU2ZiLCBwQWRkSGFybVNmYiwgblNmYiAqIHNpemVvZihVQ0hBUikpOworICBGREttZW1jcHkoZ3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGV0ZWN0ZWQsIHBBZGRIYXJtU2ZiLAorICAgICAgICAgICAgblNmYiAqIHNpemVvZihJTlQpKTsKIAotICBmb3IoaT0wOyBpPG5TZmIgOyBpKyspewotCisgIGZvciAoaSA9IDA7IGkgPCBuU2ZiOyBpKyspIHsKICAgICBndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEaWZmW2ldID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgZ3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yT3JpZ1tpXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogCi0gICAgaWYocEFkZEhhcm1TZmJbaV0gPT0gMSl7Ci0gICAgICAvKiBJZiB3ZSBoYWQgYSBkZXRlY3Rpb24gdXNlIHRoZSBndWlkZS12YWx1ZSBpbiB0aGUgbmV4dCBmcmFtZSBmcm9tIHRoZSBsYXN0IGVzdGltYXRlIHdlcmUgdGhlIGRldGVjdGlvbgotICAgICAgd2FzIGRvbmUuKi8KLSAgICAgIGZvcihlc3Q9c3RhcnQ7IGVzdCA8IHRvdE5vRXN0OyBlc3QrKyl7Ci0gICAgICAgIGlmKGd1aWRlVmVjdG9yc1tlc3RdLmd1aWRlVmVjdG9yRGlmZltpXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSl7Ci0gICAgICAgICAgZ3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGlmZltpXSA9IGd1aWRlVmVjdG9yc1tlc3RdLmd1aWRlVmVjdG9yRGlmZltpXTsKKyAgICBpZiAocEFkZEhhcm1TZmJbaV0gPT0gMSkgeworICAgICAgLyogSWYgd2UgaGFkIGEgZGV0ZWN0aW9uIHVzZSB0aGUgZ3VpZGUtdmFsdWUgaW4gdGhlIG5leHQgZnJhbWUgZnJvbSB0aGUKKyAgICAgIGxhc3QgZXN0aW1hdGUgd2VyZSB0aGUgZGV0ZWN0aW9uIHdhcyBkb25lLiovCisgICAgICBmb3IgKGVzdCA9IHN0YXJ0OyBlc3QgPCB0b3ROb0VzdDsgZXN0KyspIHsKKyAgICAgICAgaWYgKGd1aWRlVmVjdG9yc1tlc3RdLmd1aWRlVmVjdG9yRGlmZltpXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeworICAgICAgICAgIGd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3RvckRpZmZbaV0gPQorICAgICAgICAgICAgICBndWlkZVZlY3RvcnNbZXN0XS5ndWlkZVZlY3RvckRpZmZbaV07CiAgICAgICAgIH0KLSAgICAgICAgaWYoZ3VpZGVWZWN0b3JzW2VzdF0uZ3VpZGVWZWN0b3JPcmlnW2ldICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKXsKLSAgICAgICAgICBndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JPcmlnW2ldID0gZ3VpZGVWZWN0b3JzW2VzdF0uZ3VpZGVWZWN0b3JPcmlnW2ldOworICAgICAgICBpZiAoZ3VpZGVWZWN0b3JzW2VzdF0uZ3VpZGVWZWN0b3JPcmlnW2ldICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CisgICAgICAgICAgZ3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yT3JpZ1tpXSA9CisgICAgICAgICAgICAgIGd1aWRlVmVjdG9yc1tlc3RdLmd1aWRlVmVjdG9yT3JpZ1tpXTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQotCiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAgIFxicmllZiAgICAgQ2FsY3VsYXRlcyBhIGNvbXBlbnNhdGlvbiB2ZWN0b3IgZm9yIHRoZSBlbmVyZ3kgZGF0YS4KQEAgLTk2MywzOCArOTA2LDMwIEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjYWxjdWxhdGVDb21wVmVjdG9yKFVDSEFSICpwQWRkSGFybVNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipwVG9uYWxpdHlNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqKiBwU2lnbk1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnBFbnZDb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKmZyZXFCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0b3ROb0VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG1heENvbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpwUHJldkVudkNvbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuZXdEZXRlY3Rpb25BbGxvd2VkKQotewotCi0gIElOVCBzY2ZCYW5kLGVzdCxsLGxsLGx1LG1heFBvc0YsbWF4UG9zVDsKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZUNvbXBWZWN0b3IoVUNIQVIgKnBBZGRIYXJtU2ZiLCBGSVhQX0RCTCAqKnBUb25hbGl0eU1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICoqcFNpZ25NYXRyaXgsIFVDSEFSICpwRW52Q29tcCwgSU5UIG5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpmcmVxQmFuZFRhYmxlLCBJTlQgdG90Tm9Fc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBtYXhDb21wLCBVQ0hBUiAqcFByZXZFbnZDb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbmV3RGV0ZWN0aW9uQWxsb3dlZCkgeworICBJTlQgc2NmQmFuZCwgZXN0LCBsLCBsbCwgbHUsIG1heFBvc0YsIG1heFBvc1Q7CiAgIEZJWFBfREJMIG1heFZhbDsKICAgSU5UIGNvbXBWYWx1ZTsKICAgRklYUF9EQkwgdG1wOwogCi0gIEZES21lbWNsZWFyKHBFbnZDb21wLG5TZmIqc2l6ZW9mKFVDSEFSKSk7CisgIEZES21lbWNsZWFyKHBFbnZDb21wLCBuU2ZiICogc2l6ZW9mKFVDSEFSKSk7CiAKLSAgZm9yKHNjZkJhbmQ9MDsgc2NmQmFuZCA8IG5TZmI7IHNjZkJhbmQrKyl7Ci0KLSAgICBpZihwQWRkSGFybVNmYltzY2ZCYW5kXSl7IC8qIEEgbWlzc2luZyBzaW5lIHdhcyBkZXRlY3RlZCAqLworICBmb3IgKHNjZkJhbmQgPSAwOyBzY2ZCYW5kIDwgblNmYjsgc2NmQmFuZCsrKSB7CisgICAgaWYgKHBBZGRIYXJtU2ZiW3NjZkJhbmRdKSB7IC8qIEEgbWlzc2luZyBzaW5lIHdhcyBkZXRlY3RlZCAqLwogICAgICAgbGwgPSBmcmVxQmFuZFRhYmxlW3NjZkJhbmRdOwotICAgICAgbHUgPSBmcmVxQmFuZFRhYmxlW3NjZkJhbmQrMV07CisgICAgICBsdSA9IGZyZXFCYW5kVGFibGVbc2NmQmFuZCArIDFdOwogCi0gICAgICBtYXhQb3NGID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBmaW5kIHRoZSBtYXhpbXVtKi8KKyAgICAgIG1heFBvc0YgPSAwOyAvKiBGaXJzdCBmaW5kIHRoZSBtYXhpbXVtKi8KICAgICAgIG1heFBvc1QgPSAwOwogICAgICAgbWF4VmFsID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKLSAgICAgIGZvcihlc3Q9MDtlc3Q8dG90Tm9Fc3Q7ZXN0KyspewotICAgICAgICBmb3IobD1sbDsgbDxsdTsgbCsrKXsKLSAgICAgICAgICBpZihwVG9uYWxpdHlNYXRyaXhbZXN0XVtsXSA+IG1heFZhbCl7CisgICAgICBmb3IgKGVzdCA9IDA7IGVzdCA8IHRvdE5vRXN0OyBlc3QrKykgeworICAgICAgICBmb3IgKGwgPSBsbDsgbCA8IGx1OyBsKyspIHsKKyAgICAgICAgICBpZiAocFRvbmFsaXR5TWF0cml4W2VzdF1bbF0gPiBtYXhWYWwpIHsKICAgICAgICAgICAgIG1heFZhbCA9IHBUb25hbGl0eU1hdHJpeFtlc3RdW2xdOwogICAgICAgICAgICAgbWF4UG9zRiA9IGw7CiAgICAgICAgICAgICBtYXhQb3NUID0gZXN0OwpAQCAtMTAxMCw1NyArOTQ1LDYzIEBACiAgICAgICAgKiBpbiB0aGUgU0JSIGRhdGEsIHdoaWNoIHdpbGwgY2F1c2UgcHJvYmxlbXMgaW4gdGhlIGRlY29kZXIsIHdoZW4gd2UKICAgICAgICAqIGFkZCBhIHNpbmUgdG8ganVzdCBvbmUgb2YgdGhlIGNoYW5uZWxzLgogICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIGlmKG1heFBvc0YgPT0gbGwgJiYgc2NmQmFuZCl7Ci0gICAgICAgIGlmKCFwQWRkSGFybVNmYltzY2ZCYW5kIC0gMV0pIHsgICAgIC8qIE5vIGRldGVjdGlvbiBiZWxvdyovCi0gICAgICAgICAgaWYgKHBTaWduTWF0cml4W21heFBvc1RdW21heFBvc0YgLSAxXSA+IDAgJiYgcFNpZ25NYXRyaXhbbWF4UG9zVF1bbWF4UG9zRl0gPCAwKSB7Ci0gICAgICAgICAgICAvKiBUaGUgY29tcCB2YWx1ZSBpcyBjYWx1bGF0ZWQgYXMgdGhlIHRvbmFsbGl0eSB2YWx1ZSwgaS5lIHdlIHdhbnQgdG8KLSAgICAgICAgICAgICAgIHJlZHVjZSB0aGUgZW52ZWxvcGUgZGF0YSBmb3IgdGhpcyBjaGFubmVsIHdpdGggYXMgbXVjaCBhcyB0aGUgdG9uYWxpdHkKLSAgICAgICAgICAgICAgIHRoYXQgaXMgc3ByZWFkIGZyb20gdGhlIGNoYW5uZWwgYWJvdmUuIChsZDY0KFJFTEFYQVRJT04pID0gMC4zMTE0MzA3NTg4OSkgKi8KLSAgICAgICAgICAgIHRtcCA9IGZpeHBfYWJzKChGSVhQX0RCTClDYWxjTGREYXRhKHBUb25hbGl0eU1hdHJpeFttYXhQb3NUXVttYXhQb3NGIC0gMV0pICsgUkVMQVhBVElPTl9MRDY0KTsKLSAgICAgICAgICAgIHRtcCA9ICh0bXAgPj4gKERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVC0xKSkgKyAoRklYUF9EQkwpMTsgIC8qIHNoaWZ0IG9uZSBiaXQgbGVzcyBmb3Igcm91bmRpbmcgKi8KKyAgICAgIGlmIChtYXhQb3NGID09IGxsICYmIHNjZkJhbmQpIHsKKyAgICAgICAgaWYgKCFwQWRkSGFybVNmYltzY2ZCYW5kIC0gMV0pIHsgLyogTm8gZGV0ZWN0aW9uIGJlbG93Ki8KKyAgICAgICAgICBpZiAocFNpZ25NYXRyaXhbbWF4UG9zVF1bbWF4UG9zRiAtIDFdID4gMCAmJgorICAgICAgICAgICAgICBwU2lnbk1hdHJpeFttYXhQb3NUXVttYXhQb3NGXSA8IDApIHsKKyAgICAgICAgICAgIC8qIFRoZSBjb21wIHZhbHVlIGlzIGNhbHVsYXRlZCBhcyB0aGUgdG9uYWxsaXR5IHZhbHVlLCBpLmUgd2Ugd2FudAorICAgICAgICAgICAgICAgdG8gcmVkdWNlIHRoZSBlbnZlbG9wZSBkYXRhIGZvciB0aGlzIGNoYW5uZWwgd2l0aCBhcyBtdWNoIGFzIHRoZQorICAgICAgICAgICAgICAgdG9uYWxpdHkgdGhhdCBpcyBzcHJlYWQgZnJvbSB0aGUgY2hhbm5lbCBhYm92ZS4gKGxkNjQoUkVMQVhBVElPTikKKyAgICAgICAgICAgICAgID0gMC4zMTE0MzA3NTg4OSkgKi8KKyAgICAgICAgICAgIHRtcCA9IGZpeHBfYWJzKAorICAgICAgICAgICAgICAgIChGSVhQX0RCTClDYWxjTGREYXRhKHBUb25hbGl0eU1hdHJpeFttYXhQb3NUXVttYXhQb3NGIC0gMV0pICsKKyAgICAgICAgICAgICAgICBSRUxBWEFUSU9OX0xENjQpOworICAgICAgICAgICAgdG1wID0gKHRtcCA+PiAoREZSQUNUX0JJVFMgLSAxIC0gTERfREFUQV9TSElGVCAtIDEpKSArCisgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpMTsgLyogc2hpZnQgb25lIGJpdCBsZXNzIGZvciByb3VuZGluZyAqLwogICAgICAgICAgICAgY29tcFZhbHVlID0gKChJTlQpKExPTkcpdG1wKSA+PiAxOwogCi0JCQkJCQkgICAgICAvKiBsaW1pdCB0aGUgY29tcC12YWx1ZSovCi0gICAgICAgICAgICBpZiAoY29tcFZhbHVlID4gbWF4Q29tcCkKLSAgICAgICAgICAgICAgY29tcFZhbHVlID0gbWF4Q29tcDsKKyAgICAgICAgICAgIC8qIGxpbWl0IHRoZSBjb21wLXZhbHVlKi8KKyAgICAgICAgICAgIGlmIChjb21wVmFsdWUgPiBtYXhDb21wKSBjb21wVmFsdWUgPSBtYXhDb21wOwogCi0gICAgICAgICAgICBwRW52Q29tcFtzY2ZCYW5kLTFdID0gY29tcFZhbHVlOwotCQkJCQkgICAgIH0KLQkJCQkgICAgfQorICAgICAgICAgICAgcEVudkNvbXBbc2NmQmFuZCAtIDFdID0gY29tcFZhbHVlOworICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgfQogCiAgICAgICAvKgogICAgICAgICogU2FtZSBhcyBhYm92ZSwgYnV0IGZvciB0aGUgdXBwZXIgZW5kIG9mIHRoZSBzY2FsZWZhY3Rvci1iYW5kLgogICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIGlmKG1heFBvc0YgPT0gbHUtMSAmJiBzY2ZCYW5kKzEgPCBuU2ZiKXsgICAgICAgIC8qIFVwcGVyIGJvcmRlciovCi0gICAgICAgIGlmKCFwQWRkSGFybVNmYltzY2ZCYW5kICsgMV0pIHsKLSAgICAgICAgICBpZiAocFNpZ25NYXRyaXhbbWF4UG9zVF1bbWF4UG9zRl0gPiAwICYmIHBTaWduTWF0cml4W21heFBvc1RdW21heFBvc0YgKyAxXSA8IDApIHsKLSAgICAgICAgICAgIHRtcCA9IGZpeHBfYWJzKChGSVhQX0RCTClDYWxjTGREYXRhKHBUb25hbGl0eU1hdHJpeFttYXhQb3NUXVttYXhQb3NGICsgMV0pICsgUkVMQVhBVElPTl9MRDY0KTsKLSAgICAgICAgICAgIHRtcCA9ICh0bXAgPj4gKERGUkFDVF9CSVRTLTEtTERfREFUQV9TSElGVC0xKSkgKyAoRklYUF9EQkwpMTsgIC8qIHNoaWZ0IG9uZSBiaXQgbGVzcyBmb3Igcm91bmRpbmcgKi8KKyAgICAgIGlmIChtYXhQb3NGID09IGx1IC0gMSAmJiBzY2ZCYW5kICsgMSA8IG5TZmIpIHsgLyogVXBwZXIgYm9yZGVyKi8KKyAgICAgICAgaWYgKCFwQWRkSGFybVNmYltzY2ZCYW5kICsgMV0pIHsKKyAgICAgICAgICBpZiAocFNpZ25NYXRyaXhbbWF4UG9zVF1bbWF4UG9zRl0gPiAwICYmCisgICAgICAgICAgICAgIHBTaWduTWF0cml4W21heFBvc1RdW21heFBvc0YgKyAxXSA8IDApIHsKKyAgICAgICAgICAgIHRtcCA9IGZpeHBfYWJzKAorICAgICAgICAgICAgICAgIChGSVhQX0RCTClDYWxjTGREYXRhKHBUb25hbGl0eU1hdHJpeFttYXhQb3NUXVttYXhQb3NGICsgMV0pICsKKyAgICAgICAgICAgICAgICBSRUxBWEFUSU9OX0xENjQpOworICAgICAgICAgICAgdG1wID0gKHRtcCA+PiAoREZSQUNUX0JJVFMgLSAxIC0gTERfREFUQV9TSElGVCAtIDEpKSArCisgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpMTsgLyogc2hpZnQgb25lIGJpdCBsZXNzIGZvciByb3VuZGluZyAqLwogICAgICAgICAgICAgY29tcFZhbHVlID0gKChJTlQpKExPTkcpdG1wKSA+PiAxOwogCi0gICAgICAgICAgICBpZiAoY29tcFZhbHVlID4gbWF4Q29tcCkKLSAgICAgICAgICAgICAgY29tcFZhbHVlID0gbWF4Q29tcDsKKyAgICAgICAgICAgIGlmIChjb21wVmFsdWUgPiBtYXhDb21wKSBjb21wVmFsdWUgPSBtYXhDb21wOwogCi0gICAgICAgICAgICBwRW52Q29tcFtzY2ZCYW5kKzFdID0gY29tcFZhbHVlOwotCQkJCQkgfQotCQkJCSB9CisgICAgICAgICAgICBwRW52Q29tcFtzY2ZCYW5kICsgMV0gPSBjb21wVmFsdWU7CisgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICB9Ci0JCSB9Ci0JIH0KKyAgICB9CisgIH0KIAotICBpZihuZXdEZXRlY3Rpb25BbGxvd2VkID09IDApewotICAgIGZvcihzY2ZCYW5kPTA7c2NmQmFuZDxuU2ZiO3NjZkJhbmQrKyl7Ci0gICAgICBpZihwRW52Q29tcFtzY2ZCYW5kXSAhPSAwICYmIHBQcmV2RW52Q29tcFtzY2ZCYW5kXSA9PSAwKQorICBpZiAobmV3RGV0ZWN0aW9uQWxsb3dlZCA9PSAwKSB7CisgICAgZm9yIChzY2ZCYW5kID0gMDsgc2NmQmFuZCA8IG5TZmI7IHNjZkJhbmQrKykgeworICAgICAgaWYgKHBFbnZDb21wW3NjZkJhbmRdICE9IDAgJiYgcFByZXZFbnZDb21wW3NjZkJhbmRdID09IDApCiAgICAgICAgIHBFbnZDb21wW3NjZkJhbmRdID0gMDsKICAgICB9CiAgIH0KIAogICAvKiByZW1lbWJlciB0aGUgdmFsdWUgZm9yIHRoZSBuZXh0IGZyYW1lLiovCi0gIEZES21lbWNweShwUHJldkVudkNvbXAscEVudkNvbXAsblNmYipzaXplb2YoVUNIQVIpKTsKKyAgRkRLbWVtY3B5KHBQcmV2RW52Q29tcCwgcEVudkNvbXAsIG5TZmIgKiBzaXplb2YoVUNIQVIpKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiEKICAgXGJyaWVmICAgICBEZXRlY3RzIHdoZXJlIHN0cm9uZyB0b25hbCBjb21wb25lbnRzIHdpbGwgYmUgbWlzc2luZyBhZnRlcgpAQCAtMTA3MSwzNCArMTAxMiwyNiBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotRkRLc2JyRW5jX1Nick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvclFtZihIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhfc2JyTUhEZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiogcFF1b3RhQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqKiBwU2lnbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiogaW5kZXhWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0JSX0ZSQU1FX0lORk8gKnBGcmFtZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIqIHBUcmFuSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQqIHBBZGRIYXJtb25pY3NGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSKiBwQWRkSGFybW9uaWNzU2NhbGVGYWN0b3JCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiogZnJlcUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiogZW52ZWxvcGVDb21wZW5zYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnBOcmdWZWN0b3IpCi17Cit2b2lkIEZES3NickVuY19TYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3JRbWYoCisgICAgSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoX3Nick1IRGV0LCBGSVhQX0RCTCAqKnBRdW90YUJ1ZmZlciwKKyAgICBJTlQgKipwU2lnbkJ1ZmZlciwgU0NIQVIgKmluZGV4VmVjdG9yLCBjb25zdCBTQlJfRlJBTUVfSU5GTyAqcEZyYW1lSW5mbywKKyAgICBjb25zdCBVQ0hBUiAqcFRyYW5JbmZvLCBJTlQgKnBBZGRIYXJtb25pY3NGbGFnLAorICAgIFVDSEFSICpwQWRkSGFybW9uaWNzU2NhbGVGYWN0b3JCYW5kcywgY29uc3QgVUNIQVIgKmZyZXFCYW5kVGFibGUsIElOVCBuU2ZiLAorICAgIFVDSEFSICplbnZlbG9wZUNvbXBlbnNhdGlvbiwgRklYUF9EQkwgKnBOcmdWZWN0b3IpIHsKICAgSU5UIHRyYW5zaWVudEZsYWcgPSBwVHJhbkluZm9bMV07Ci0gIElOVCB0cmFuc2llbnRQb3MgID0gcFRyYW5JbmZvWzBdOworICBJTlQgdHJhbnNpZW50UG9zID0gcFRyYW5JbmZvWzBdOwogICBJTlQgbmV3RGV0ZWN0aW9uQWxsb3dlZDsKICAgSU5UIHRyYW5zaWVudERldFN0YXJ0ID0gMDsKIAotICBVQ0hBUiAqKiBkZXRlY3Rpb25WZWN0b3JzICA9IGhfc2JyTUhEZXQtPmRldGVjdGlvblZlY3RvcnM7Ci0gIElOVCBtb3ZlICAgICAgICAgICAgICAgID0gaF9zYnJNSERldC0+bW92ZTsKLSAgSU5UIG5vRXN0UGVyRnJhbWUgICAgICAgPSBoX3Nick1IRGV0LT5ub0VzdFBlckZyYW1lOwotICBJTlQgdG90Tm9Fc3QgICAgICAgICAgICA9IGhfc2JyTUhEZXQtPnRvdE5vRXN0OwotICBJTlQgcHJldlRyYW5zaWVudEZsYWcgICA9IGhfc2JyTUhEZXQtPnByZXZpb3VzVHJhbnNpZW50RmxhZzsKLSAgSU5UIHByZXZUcmFuc2llbnRGcmFtZSAgPSBoX3Nick1IRGV0LT5wcmV2aW91c1RyYW5zaWVudEZyYW1lOwotICBJTlQgdHJhbnNpZW50UG9zT2Zmc2V0ICA9IGhfc2JyTUhEZXQtPnRyYW5zaWVudFBvc09mZnNldDsKLSAgSU5UIHByZXZUcmFuc2llbnRQb3MgICAgPSBoX3Nick1IRGV0LT5wcmV2aW91c1RyYW5zaWVudFBvczsKLSAgR1VJREVfVkVDVE9SUyogZ3VpZGVWZWN0b3JzID0gaF9zYnJNSERldC0+Z3VpZGVWZWN0b3JzOworICBVQ0hBUiAqKmRldGVjdGlvblZlY3RvcnMgPSBoX3Nick1IRGV0LT5kZXRlY3Rpb25WZWN0b3JzOworICBJTlQgbW92ZSA9IGhfc2JyTUhEZXQtPm1vdmU7CisgIElOVCBub0VzdFBlckZyYW1lID0gaF9zYnJNSERldC0+bm9Fc3RQZXJGcmFtZTsKKyAgSU5UIHRvdE5vRXN0ID0gaF9zYnJNSERldC0+dG90Tm9Fc3Q7CisgIElOVCBwcmV2VHJhbnNpZW50RmxhZyA9IGhfc2JyTUhEZXQtPnByZXZpb3VzVHJhbnNpZW50RmxhZzsKKyAgSU5UIHByZXZUcmFuc2llbnRGcmFtZSA9IGhfc2JyTUhEZXQtPnByZXZpb3VzVHJhbnNpZW50RnJhbWU7CisgIElOVCB0cmFuc2llbnRQb3NPZmZzZXQgPSBoX3Nick1IRGV0LT50cmFuc2llbnRQb3NPZmZzZXQ7CisgIElOVCBwcmV2VHJhbnNpZW50UG9zID0gaF9zYnJNSERldC0+cHJldmlvdXNUcmFuc2llbnRQb3M7CisgIEdVSURFX1ZFQ1RPUlMgKmd1aWRlVmVjdG9ycyA9IGhfc2JyTUhEZXQtPmd1aWRlVmVjdG9yczsKICAgSU5UIGRlbHRhVGltZSA9IGhfc2JyTUhEZXQtPm1oUGFyYW1zLT5kZWx0YVRpbWU7CiAgIElOVCBtYXhDb21wID0gaF9zYnJNSERldC0+bWhQYXJhbXMtPm1heENvbXA7CiAKQEAgLTExMDcsOTYgKzEwNDAsNzAgQEAKICAgLyoKICAgQnVmZmVyIHZhbHVlcy4KICAgKi8KLSAgRkRLX0FTU0VSVChtb3ZlPD0oTUFYX05PX09GX0VTVElNQVRFUz4+MSkpOwotICBGREtfQVNTRVJUKG5vRXN0UGVyRnJhbWU8PShNQVhfTk9fT0ZfRVNUSU1BVEVTPj4xKSk7CisgIEZES19BU1NFUlQobW92ZSA8PSAoTUFYX05PX09GX0VTVElNQVRFUyA+PiAxKSk7CisgIEZES19BU1NFUlQobm9Fc3RQZXJGcmFtZSA8PSAoTUFYX05PX09GX0VTVElNQVRFUyA+PiAxKSk7CiAKICAgRklYUF9EQkwgKnNmbVNicltNQVhfTk9fT0ZfRVNUSU1BVEVTXTsKICAgRklYUF9EQkwgKnNmbU9yaWdbTUFYX05PX09GX0VTVElNQVRFU107CiAgIEZJWFBfREJMICp0b25hbGl0eURpZmZbTUFYX05PX09GX0VTVElNQVRFU107CiAKLSAgZm9yIChlc3Q9MDsgZXN0IDwgTUFYX05PX09GX0VTVElNQVRFUy8yOyBlc3QrKykgewotICAgIHNmbVNicltlc3RdICAgICAgID0gaF9zYnJNSERldC0+c2ZtU2JyW2VzdF07Ci0gICAgc2ZtT3JpZ1tlc3RdICAgICAgPSBoX3Nick1IRGV0LT5zZm1PcmlnW2VzdF07CisgIGZvciAoZXN0ID0gMDsgZXN0IDwgTUFYX05PX09GX0VTVElNQVRFUyAvIDI7IGVzdCsrKSB7CisgICAgc2ZtU2JyW2VzdF0gPSBoX3Nick1IRGV0LT5zZm1TYnJbZXN0XTsKKyAgICBzZm1PcmlnW2VzdF0gPSBoX3Nick1IRGV0LT5zZm1PcmlnW2VzdF07CiAgICAgdG9uYWxpdHlEaWZmW2VzdF0gPSBoX3Nick1IRGV0LT50b25hbGl0eURpZmZbZXN0XTsKICAgfQogCi0gIENfQUxMT0NfU0NSQVRDSF9TVEFSVChzY3JhdGNoX21lbSwgRklYUF9EQkwsICgzKk1BWF9OT19PRl9FU1RJTUFURVMvMipNQVhfRlJFUV9DT0VGRlMpKTsKLSAgRklYUF9EQkwgKnNjcmF0Y2ggPSBzY3JhdGNoX21lbTsKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKF9zY3JhdGNoLCBGSVhQX0RCTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDMgKiBNQVhfTk9fT0ZfRVNUSU1BVEVTIC8gMiAqIE1BWF9GUkVRX0NPRUZGUykKKyAgRklYUF9EQkwgKnNjcmF0Y2ggPSBfc2NyYXRjaDsKICAgZm9yICg7IGVzdCA8IE1BWF9OT19PRl9FU1RJTUFURVM7IGVzdCsrKSB7Ci0gICAgc2ZtU2JyW2VzdF0gICAgICAgPSBzY3JhdGNoOyBzY3JhdGNoKz1NQVhfRlJFUV9DT0VGRlM7Ci0gICAgc2ZtT3JpZ1tlc3RdICAgICAgPSBzY3JhdGNoOyBzY3JhdGNoKz1NQVhfRlJFUV9DT0VGRlM7Ci0gICAgdG9uYWxpdHlEaWZmW2VzdF0gPSBzY3JhdGNoOyBzY3JhdGNoKz1NQVhfRlJFUV9DT0VGRlM7CisgICAgc2ZtU2JyW2VzdF0gPSBzY3JhdGNoOworICAgIHNjcmF0Y2ggKz0gTUFYX0ZSRVFfQ09FRkZTOworICAgIHNmbU9yaWdbZXN0XSA9IHNjcmF0Y2g7CisgICAgc2NyYXRjaCArPSBNQVhfRlJFUV9DT0VGRlM7CisgICAgdG9uYWxpdHlEaWZmW2VzdF0gPSBzY3JhdGNoOworICAgIHNjcmF0Y2ggKz0gTUFYX0ZSRVFfQ09FRkZTOwogICB9CiAKKyAgLyogRGV0ZXJtaW5lIGlmIHdlJ3JlIGFsbG93ZWQgdG8gZGV0ZWN0ICJtaXNzaW5nIGhhcm1vbmljcyIgdGhhdCB3YXNuJ3QKKyAgICAgZGV0ZWN0ZWQgYmVmb3JlLiBJbiBvcmRlciB0byBiZSBhbGxvd2VkIHRvIGRvIG5ldyBkZXRlY3Rpb24sIHRoZXJlIG11c3QgYmUKKyAgICAgYSB0cmFuc2llbnQgaW4gdGhlIGN1cnJlbnQgZnJhbWUsIG9yIGEgdHJhbnNpZW50IGluIHRoZSBwcmV2aW91cyBmcmFtZQorICAgICBzdWZmaWNpZW50bHkgY2xvc2UgdG8gdGhlIGN1cnJlbnQgZnJhbWUuICovCisgIG5ld0RldGVjdGlvbkFsbG93ZWQgPSBpc0RldGVjdGlvbk9mTmV3VG9uZUFsbG93ZWQoCisgICAgICBwRnJhbWVJbmZvLCAmdHJhbnNpZW50RGV0U3RhcnQsIG5vRXN0UGVyRnJhbWUsIHByZXZUcmFuc2llbnRGcmFtZSwKKyAgICAgIHByZXZUcmFuc2llbnRQb3MsIHByZXZUcmFuc2llbnRGbGFnLCB0cmFuc2llbnRQb3NPZmZzZXQsIHRyYW5zaWVudEZsYWcsCisgICAgICB0cmFuc2llbnRQb3MsIGRlbHRhVGltZSwgaF9zYnJNSERldCk7CiAKLQotICAvKiBEZXRlcm1pbmUgaWYgd2UncmUgYWxsb3dlZCB0byBkZXRlY3QgIm1pc3NpbmcgaGFybW9uaWNzIiB0aGF0IHdhc24ndCBkZXRlY3RlZCBiZWZvcmUuCi0gICAgIEluIG9yZGVyIHRvIGJlIGFsbG93ZWQgdG8gZG8gbmV3IGRldGVjdGlvbiwgdGhlcmUgbXVzdCBiZSBhIHRyYW5zaWVudCBpbiB0aGUgY3VycmVudAotICAgICBmcmFtZSwgb3IgYSB0cmFuc2llbnQgaW4gdGhlIHByZXZpb3VzIGZyYW1lIHN1ZmZpY2llbnRseSBjbG9zZSB0byB0aGUgY3VycmVudCBmcmFtZS4gKi8KLSAgbmV3RGV0ZWN0aW9uQWxsb3dlZCA9IGlzRGV0ZWN0aW9uT2ZOZXdUb25lQWxsb3dlZChwRnJhbWVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2llbnREZXRTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub0VzdFBlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZUcmFuc2llbnRGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2VHJhbnNpZW50UG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZUcmFuc2llbnRGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaWVudFBvc09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2llbnRGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaWVudFBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJNSERldCk7Ci0KLSAgLyogQ2FsdWxhdGUgdGhlIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgdXNlZCBzdWJzZXF1ZW50bHkgZm9yIHRoZSBhY3R1YWwgZGV0ZWN0aW9uICovCi0gIGNhbGN1bGF0ZURldGVjdG9ySW5wdXQocFF1b3RhQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4VmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRvbmFsaXR5RGlmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZm1PcmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNmbVNiciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbm9Fc3RQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlKTsKKyAgLyogQ2FsdWxhdGUgdGhlIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgdXNlZCBzdWJzZXF1ZW50bHkgZm9yIHRoZSBhY3R1YWwKKyAgICogZGV0ZWN0aW9uICovCisgIGNhbGN1bGF0ZURldGVjdG9ySW5wdXQocFF1b3RhQnVmZmVyLCBpbmRleFZlY3RvciwgdG9uYWxpdHlEaWZmLCBzZm1PcmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNmbVNiciwgZnJlcUJhbmRUYWJsZSwgblNmYiwgbm9Fc3RQZXJGcmFtZSwgbW92ZSk7CiAKICAgLyogRG8gdGhlIGFjdHVhbCBkZXRlY3Rpb24gdXNpbmcgaW5mb3JtYXRpb24gZnJvbSBwcmV2aW91cyBkZXRlY3Rpb25zICovCi0gIGRldGVjdGlvbldpdGhQcmVkaWN0aW9uKHBRdW90YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdG9uYWxpdHlEaWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwU2lnbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZtT3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZtU2JyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb25WZWN0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nick1IRGV0LT5ndWlkZVNjZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlVmVjdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Fc3RQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpZW50RGV0U3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRvdE5vRXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEZXRlY3Rpb25BbGxvd2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRkSGFybW9uaWNzRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkZEhhcm1vbmljc1NjYWxlRmFjdG9yQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyTUhEZXQtPm1oUGFyYW1zKTsKKyAgZGV0ZWN0aW9uV2l0aFByZWRpY3Rpb24ocFF1b3RhQnVmZmVyLCB0b25hbGl0eURpZmYsIHBTaWduQnVmZmVyLCBuU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxQmFuZFRhYmxlLCBzZm1PcmlnLCBzZm1TYnIsIGRldGVjdGlvblZlY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyTUhEZXQtPmd1aWRlU2NmYiwgZ3VpZGVWZWN0b3JzLCBub0VzdFBlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2llbnREZXRTdGFydCwgdG90Tm9Fc3QsIG5ld0RldGVjdGlvbkFsbG93ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGRIYXJtb25pY3NGbGFnLCBwQWRkSGFybW9uaWNzU2NhbGVGYWN0b3JCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcE5yZ1ZlY3RvciwgaF9zYnJNSERldC0+bWhQYXJhbXMpOwogCiAgIC8qIENhbGN1bGF0ZSB0aGUgY29tcCB2ZWN0b3IsIHNvIHRoYXQgdGhlIGVuZXJneSBjYW4gYmUKICAgICAgY29tcGVuc2F0ZWQgZm9yIGEgc2luZSBiZXR3ZWVuIHR3byBRTUYtYmFuZHMuICovCi0gIGNhbGN1bGF0ZUNvbXBWZWN0b3IocEFkZEhhcm1vbmljc1NjYWxlRmFjdG9yQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgcFF1b3RhQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgIHBTaWduQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlQ29tcGVuc2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgIG5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgZnJlcUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICB0b3ROb0VzdCwKLSAgICAgICAgICAgICAgICAgICAgICBtYXhDb21wLAotICAgICAgICAgICAgICAgICAgICAgIGhfc2JyTUhEZXQtPnByZXZFbnZlbG9wZUNvbXBlbnNhdGlvbiwKKyAgY2FsY3VsYXRlQ29tcFZlY3RvcihwQWRkSGFybW9uaWNzU2NhbGVGYWN0b3JCYW5kcywgcFF1b3RhQnVmZmVyLCBwU2lnbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZUNvbXBlbnNhdGlvbiwgblNmYiwgZnJlcUJhbmRUYWJsZSwgdG90Tm9Fc3QsCisgICAgICAgICAgICAgICAgICAgICAgbWF4Q29tcCwgaF9zYnJNSERldC0+cHJldkVudmVsb3BlQ29tcGVuc2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgIG5ld0RldGVjdGlvbkFsbG93ZWQpOwogCi0gIGZvciAoZXN0PTA7IGVzdCA8IG1vdmU7IGVzdCsrKSB7Ci0gICAgRkRLbWVtY3B5KHRvbmFsaXR5RGlmZltlc3RdLCB0b25hbGl0eURpZmZbZXN0ICsgbm9Fc3RQZXJGcmFtZV0sIHNpemVvZihGSVhQX0RCTCkqTUFYX0ZSRVFfQ09FRkZTKTsKLSAgICBGREttZW1jcHkoc2ZtT3JpZ1tlc3RdLCBzZm1PcmlnW2VzdCArIG5vRXN0UGVyRnJhbWVdLCBzaXplb2YoRklYUF9EQkwpKk1BWF9GUkVRX0NPRUZGUyk7Ci0gICAgRkRLbWVtY3B5KHNmbVNicltlc3RdLCBzZm1TYnJbZXN0ICsgbm9Fc3RQZXJGcmFtZV0sIHNpemVvZihGSVhQX0RCTCkqTUFYX0ZSRVFfQ09FRkZTKTsKKyAgZm9yIChlc3QgPSAwOyBlc3QgPCBtb3ZlOyBlc3QrKykgeworICAgIEZES21lbWNweSh0b25hbGl0eURpZmZbZXN0XSwgdG9uYWxpdHlEaWZmW2VzdCArIG5vRXN0UGVyRnJhbWVdLAorICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogTUFYX0ZSRVFfQ09FRkZTKTsKKyAgICBGREttZW1jcHkoc2ZtT3JpZ1tlc3RdLCBzZm1PcmlnW2VzdCArIG5vRXN0UGVyRnJhbWVdLAorICAgICAgICAgICAgICBzaXplb2YoRklYUF9EQkwpICogTUFYX0ZSRVFfQ09FRkZTKTsKKyAgICBGREttZW1jcHkoc2ZtU2JyW2VzdF0sIHNmbVNicltlc3QgKyBub0VzdFBlckZyYW1lXSwKKyAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIE1BWF9GUkVRX0NPRUZGUyk7CiAgIH0KLSAgQ19BTExPQ19TQ1JBVENIX0VORChzY3JhdGNoLCBGSVhQX0RCTCwgKDMqTUFYX05PX09GX0VTVElNQVRFUy8yKk1BWF9GUkVRX0NPRUZGUykpOwotCi0KKyAgQ19BTExPQ19TQ1JBVENIX0VORChfc2NyYXRjaCwgRklYUF9EQkwsCisgICAgICAgICAgICAgICAgICAgICAgMyAqIE1BWF9OT19PRl9FU1RJTUFURVMgLyAyICogTUFYX0ZSRVFfQ09FRkZTKQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMjA4LDM0ICsxMTE1LDQ4IEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQKLUZES3NickVuY19DcmVhdGVTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhTYnJNSERldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNoYW4pCi17CitJTlQgRkRLc2JyRW5jX0NyZWF0ZVNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvcigKKyAgICBIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhTYnJNSERldCwgSU5UIGNoYW4pIHsKICAgSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBocyA9IGhTYnJNSERldDsKICAgSU5UIGk7CiAKLSAgVUNIQVIqIGRldGVjdGlvblZlY3RvcnMgICAgPSBHZXRSYW1fU2JyX2RldGVjdGlvblZlY3RvcnMoY2hhbik7Ci0gIFVDSEFSKiBndWlkZVZlY3RvckRldGVjdGVkID0gR2V0UmFtX1Nicl9ndWlkZVZlY3RvckRldGVjdGVkKGNoYW4pOwotICBGSVhQX0RCTCogZ3VpZGVWZWN0b3JEaWZmICA9IEdldFJhbV9TYnJfZ3VpZGVWZWN0b3JEaWZmKGNoYW4pOwotICBGSVhQX0RCTCogZ3VpZGVWZWN0b3JPcmlnICA9IEdldFJhbV9TYnJfZ3VpZGVWZWN0b3JPcmlnKGNoYW4pOworICBVQ0hBUiAqZGV0ZWN0aW9uVmVjdG9ycyA9IEdldFJhbV9TYnJfZGV0ZWN0aW9uVmVjdG9ycyhjaGFuKTsKKyAgVUNIQVIgKmd1aWRlVmVjdG9yRGV0ZWN0ZWQgPSBHZXRSYW1fU2JyX2d1aWRlVmVjdG9yRGV0ZWN0ZWQoY2hhbik7CisgIEZJWFBfREJMICpndWlkZVZlY3RvckRpZmYgPSBHZXRSYW1fU2JyX2d1aWRlVmVjdG9yRGlmZihjaGFuKTsKKyAgRklYUF9EQkwgKmd1aWRlVmVjdG9yT3JpZyA9IEdldFJhbV9TYnJfZ3VpZGVWZWN0b3JPcmlnKGNoYW4pOwogCi0gIEZES21lbWNsZWFyIChocyxzaXplb2YoU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SKSk7CisgIEZES21lbWNsZWFyKGhzLCBzaXplb2YoU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SKSk7CiAKICAgaHMtPnByZXZFbnZlbG9wZUNvbXBlbnNhdGlvbiA9IEdldFJhbV9TYnJfcHJldkVudmVsb3BlQ29tcGVuc2F0aW9uKGNoYW4pOwotICBocy0+Z3VpZGVTY2ZiICAgICAgICAgICAgICAgID0gR2V0UmFtX1Nicl9ndWlkZVNjZmIoY2hhbik7CisgIGhzLT5ndWlkZVNjZmIgPSBHZXRSYW1fU2JyX2d1aWRlU2NmYihjaGFuKTsKIAotICBmb3IoaT0wOyBpPE1BWF9OT19PRl9FU1RJTUFURVM7IGkrKykgewotICAgIGhzLT5ndWlkZVZlY3RvcnNbaV0uZ3VpZGVWZWN0b3JEaWZmID0gZ3VpZGVWZWN0b3JEaWZmICsgKGkqTUFYX0ZSRVFfQ09FRkZTKTsKLSAgICBocy0+Z3VpZGVWZWN0b3JzW2ldLmd1aWRlVmVjdG9yT3JpZyA9IGd1aWRlVmVjdG9yT3JpZyArIChpKk1BWF9GUkVRX0NPRUZGUyk7Ci0gICAgaHMtPmRldGVjdGlvblZlY3RvcnNbaV0gPSBkZXRlY3Rpb25WZWN0b3JzICsgKGkqTUFYX0ZSRVFfQ09FRkZTKTsKLSAgICBocy0+Z3VpZGVWZWN0b3JzW2ldLmd1aWRlVmVjdG9yRGV0ZWN0ZWQgPSBndWlkZVZlY3RvckRldGVjdGVkICsgKGkqTUFYX0ZSRVFfQ09FRkZTKTsKKyAgaWYgKChOVUxMID09IGRldGVjdGlvblZlY3RvcnMpIHx8IChOVUxMID09IGd1aWRlVmVjdG9yRGV0ZWN0ZWQpIHx8CisgICAgICAoTlVMTCA9PSBndWlkZVZlY3RvckRpZmYpIHx8IChOVUxMID09IGd1aWRlVmVjdG9yT3JpZykgfHwKKyAgICAgIChOVUxMID09IGhzLT5wcmV2RW52ZWxvcGVDb21wZW5zYXRpb24pIHx8IChOVUxMID09IGhzLT5ndWlkZVNjZmIpKSB7CisgICAgZ290byBiYWlsOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9OT19PRl9FU1RJTUFURVM7IGkrKykgeworICAgIGhzLT5ndWlkZVZlY3RvcnNbaV0uZ3VpZGVWZWN0b3JEaWZmID0KKyAgICAgICAgZ3VpZGVWZWN0b3JEaWZmICsgKGkgKiBNQVhfRlJFUV9DT0VGRlMpOworICAgIGhzLT5ndWlkZVZlY3RvcnNbaV0uZ3VpZGVWZWN0b3JPcmlnID0KKyAgICAgICAgZ3VpZGVWZWN0b3JPcmlnICsgKGkgKiBNQVhfRlJFUV9DT0VGRlMpOworICAgIGhzLT5kZXRlY3Rpb25WZWN0b3JzW2ldID0gZGV0ZWN0aW9uVmVjdG9ycyArIChpICogTUFYX0ZSRVFfQ09FRkZTKTsKKyAgICBocy0+Z3VpZGVWZWN0b3JzW2ldLmd1aWRlVmVjdG9yRGV0ZWN0ZWQgPQorICAgICAgICBndWlkZVZlY3RvckRldGVjdGVkICsgKGkgKiBNQVhfRlJFUV9DT0VGRlMpOwogICB9CiAKICAgcmV0dXJuIDA7Ci19CiAKK2JhaWw6CisgIGhzLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEaWZmID0gZ3VpZGVWZWN0b3JEaWZmOworICBocy0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yT3JpZyA9IGd1aWRlVmVjdG9yT3JpZzsKKyAgaHMtPmRldGVjdGlvblZlY3RvcnNbMF0gPSBkZXRlY3Rpb25WZWN0b3JzOworICBocy0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGV0ZWN0ZWQgPSBndWlkZVZlY3RvckRldGVjdGVkOworCisgIEZES3NickVuY19EZWxldGVTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IoaHMpOworICByZXR1cm4gLTE7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQpAQCAtMTI0Niw1NCArMTE2Nyw0MyBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UCi1GREtzYnJFbmNfSW5pdFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvciAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgaFNick1IRGV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlRnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGZyYW1lU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBxbWZOb0NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdG90Tm9Fc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBtb3ZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9Fc3RQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzYnJTeW50YXhGbGFncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKK0lOVCBGREtzYnJFbmNfSW5pdFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvcigKKyAgICBIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhTYnJNSERldCwgSU5UIHNhbXBsZUZyZXEsCisgICAgSU5UIGZyYW1lU2l6ZSwgSU5UIG5TZmIsIElOVCBxbWZOb0NoYW5uZWxzLCBJTlQgdG90Tm9Fc3QsIElOVCBtb3ZlLAorICAgIElOVCBub0VzdFBlckZyYW1lLCBVSU5UIHNiclN5bnRheEZsYWdzKSB7CiAgIEhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgaHMgPSBoU2JyTUhEZXQ7CiAgIGludCBpOwogCiAgIEZES19BU1NFUlQodG90Tm9Fc3QgPD0gTUFYX05PX09GX0VTVElNQVRFUyk7CiAKLSAgaWYgKHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpCi0gIHsKLSAgICBzd2l0Y2goZnJhbWVTaXplKXsKLSAgICBjYXNlIDEwMjQ6Ci0gICAgY2FzZSA1MTI6CisgIGlmIChzYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKSB7CisgICAgc3dpdGNoIChmcmFtZVNpemUpIHsKKyAgICAgIGNhc2UgMTAyNDoKKyAgICAgIGNhc2UgNTEyOgogICAgICAgICBocy0+dHJhbnNpZW50UG9zT2Zmc2V0ID0gRlJBTUVfTUlERExFX1NMT1RfNTEyTEQ7Ci0gICAgICAgIGhzLT50aW1lU2xvdHMgICAgICAgICAgPSAxNjsKKyAgICAgICAgaHMtPnRpbWVTbG90cyA9IDE2OwogICAgICAgICBicmVhazsKLSAgICBjYXNlIDk2MDoKLSAgICBjYXNlIDQ4MDoKKyAgICAgIGNhc2UgOTYwOgorICAgICAgY2FzZSA0ODA6CiAgICAgICAgIGhzLT50cmFuc2llbnRQb3NPZmZzZXQgPSBGUkFNRV9NSURETEVfU0xPVF81MTJMRDsKLSAgICAgICAgaHMtPnRpbWVTbG90cyAgICAgICAgICA9IDE1OworICAgICAgICBocy0+dGltZVNsb3RzID0gMTU7CiAgICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6CisgICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICB9IGVsc2UKLSAgewotICAgIHN3aXRjaChmcmFtZVNpemUpewotICAgIGNhc2UgMjA0ODoKLSAgICBjYXNlIDEwMjQ6CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChmcmFtZVNpemUpIHsKKyAgICAgIGNhc2UgMjA0ODoKKyAgICAgIGNhc2UgMTAyNDoKICAgICAgICAgaHMtPnRyYW5zaWVudFBvc09mZnNldCA9IEZSQU1FX01JRERMRV9TTE9UXzIwNDg7Ci0gICAgICAgIGhzLT50aW1lU2xvdHMgICAgICAgICAgPSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OworICAgICAgICBocy0+dGltZVNsb3RzID0gTlVNQkVSX1RJTUVfU0xPVFNfMjA0ODsKICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOTIwOgotICAgIGNhc2UgOTYwOgorICAgICAgY2FzZSAxOTIwOgorICAgICAgY2FzZSA5NjA6CiAgICAgICAgIGhzLT50cmFuc2llbnRQb3NPZmZzZXQgPSBGUkFNRV9NSURETEVfU0xPVF8xOTIwOwotICAgICAgICBocy0+dGltZVNsb3RzICAgICAgICAgID0gTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDsKKyAgICAgICAgaHMtPnRpbWVTbG90cyA9IE5VTUJFUl9USU1FX1NMT1RTXzE5MjA7CiAgICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6CisgICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICB9CkBAIC0xMzAxLDcgKzEyMTEsNyBAQAogICBpZiAoc2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgewogICAgIGhzLT5taFBhcmFtcyA9ICZwYXJhbXNBYWNMZDsKICAgfSBlbHNlCi0gIGhzLT5taFBhcmFtcyA9ICZwYXJhbXNBYWM7CisgICAgaHMtPm1oUGFyYW1zID0gJnBhcmFtc0FhYzsKIAogICBocy0+cW1mTm9DaGFubmVscyA9IHFtZk5vQ2hhbm5lbHM7CiAgIGhzLT5zYW1wbGVGcmVxID0gc2FtcGxlRnJlcTsKQEAgLTEzMTEsMjIgKzEyMjEsMjUgQEAKICAgaHMtPm1vdmUgPSBtb3ZlOwogICBocy0+bm9Fc3RQZXJGcmFtZSA9IG5vRXN0UGVyRnJhbWU7CiAKLSAgZm9yKGk9MDsgaTx0b3ROb0VzdDsgaSsrKSB7Ci0gICAgRkRLbWVtY2xlYXIgKGhzLT5ndWlkZVZlY3RvcnNbaV0uZ3VpZGVWZWN0b3JEaWZmLHNpemVvZihGSVhQX0RCTCkqTUFYX0ZSRVFfQ09FRkZTKTsKLSAgICBGREttZW1jbGVhciAoaHMtPmd1aWRlVmVjdG9yc1tpXS5ndWlkZVZlY3Rvck9yaWcsc2l6ZW9mKEZJWFBfREJMKSpNQVhfRlJFUV9DT0VGRlMpOwotICAgIEZES21lbWNsZWFyIChocy0+ZGV0ZWN0aW9uVmVjdG9yc1tpXSxzaXplb2YoVUNIQVIpKk1BWF9GUkVRX0NPRUZGUyk7Ci0gICAgRkRLbWVtY2xlYXIgKGhzLT5ndWlkZVZlY3RvcnNbaV0uZ3VpZGVWZWN0b3JEZXRlY3RlZCxzaXplb2YoVUNIQVIpKk1BWF9GUkVRX0NPRUZGUyk7CisgIGZvciAoaSA9IDA7IGkgPCB0b3ROb0VzdDsgaSsrKSB7CisgICAgRkRLbWVtY2xlYXIoaHMtPmd1aWRlVmVjdG9yc1tpXS5ndWlkZVZlY3RvckRpZmYsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIE1BWF9GUkVRX0NPRUZGUyk7CisgICAgRkRLbWVtY2xlYXIoaHMtPmd1aWRlVmVjdG9yc1tpXS5ndWlkZVZlY3Rvck9yaWcsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIE1BWF9GUkVRX0NPRUZGUyk7CisgICAgRkRLbWVtY2xlYXIoaHMtPmRldGVjdGlvblZlY3RvcnNbaV0sIHNpemVvZihVQ0hBUikgKiBNQVhfRlJFUV9DT0VGRlMpOworICAgIEZES21lbWNsZWFyKGhzLT5ndWlkZVZlY3RvcnNbaV0uZ3VpZGVWZWN0b3JEZXRlY3RlZCwKKyAgICAgICAgICAgICAgICBzaXplb2YoVUNIQVIpICogTUFYX0ZSRVFfQ09FRkZTKTsKICAgfQogCi0gIC8vZm9yKGk9MDsgaTx0b3ROb0VzdC8yOyBpKyspIHsKLSAgZm9yKGk9MDsgaTxNQVhfTk9fT0ZfRVNUSU1BVEVTLzI7IGkrKykgewotICAgIEZES21lbWNsZWFyIChocy0+dG9uYWxpdHlEaWZmW2ldLHNpemVvZihGSVhQX0RCTCkqTUFYX0ZSRVFfQ09FRkZTKTsKLSAgICBGREttZW1jbGVhciAoaHMtPnNmbU9yaWdbaV0sc2l6ZW9mKEZJWFBfREJMKSpNQVhfRlJFUV9DT0VGRlMpOwotICAgIEZES21lbWNsZWFyIChocy0+c2ZtU2JyW2ldLHNpemVvZihGSVhQX0RCTCkqTUFYX0ZSRVFfQ09FRkZTKTsKKyAgLy8gZm9yKGk9MDsgaTx0b3ROb0VzdC8yOyBpKyspIHsKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9OT19PRl9FU1RJTUFURVMgLyAyOyBpKyspIHsKKyAgICBGREttZW1jbGVhcihocy0+dG9uYWxpdHlEaWZmW2ldLCBzaXplb2YoRklYUF9EQkwpICogTUFYX0ZSRVFfQ09FRkZTKTsKKyAgICBGREttZW1jbGVhcihocy0+c2ZtT3JpZ1tpXSwgc2l6ZW9mKEZJWFBfREJMKSAqIE1BWF9GUkVRX0NPRUZGUyk7CisgICAgRkRLbWVtY2xlYXIoaHMtPnNmbVNicltpXSwgc2l6ZW9mKEZJWFBfREJMKSAqIE1BWF9GUkVRX0NPRUZGUyk7CiAgIH0KIAotICBGREttZW1jbGVhciAoIGhzLT5wcmV2RW52ZWxvcGVDb21wZW5zYXRpb24sIHNpemVvZihVQ0hBUikqTUFYX0ZSRVFfQ09FRkZTKTsKLSAgRkRLbWVtY2xlYXIgKCBocy0+Z3VpZGVTY2ZiLCBzaXplb2YoVUNIQVIpKk1BWF9GUkVRX0NPRUZGUyk7CisgIEZES21lbWNsZWFyKGhzLT5wcmV2RW52ZWxvcGVDb21wZW5zYXRpb24sIHNpemVvZihVQ0hBUikgKiBNQVhfRlJFUV9DT0VGRlMpOworICBGREttZW1jbGVhcihocy0+Z3VpZGVTY2ZiLCBzaXplb2YoVUNIQVIpICogTUFYX0ZSRVFfQ09FRkZTKTsKIAogICBocy0+cHJldmlvdXNUcmFuc2llbnRGbGFnID0gMDsKICAgaHMtPnByZXZpb3VzVHJhbnNpZW50RnJhbWUgPSAwOwpAQCAtMTM0NCw5ICsxMjU3LDggQEAKIAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLUZES3NickVuY19EZWxldGVTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IoSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoU2JyTUhEZXQpCi17Cit2b2lkIEZES3NickVuY19EZWxldGVTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IoCisgICAgSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoU2JyTUhEZXQpIHsKICAgaWYgKGhTYnJNSERldCkgewogICAgIEhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgaHMgPSBoU2JyTUhEZXQ7CiAKQEAgLTEzNTYsNyArMTI2OCw2IEBACiAgICAgRnJlZVJhbV9TYnJfZ3VpZGVWZWN0b3JPcmlnKCZocy0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yT3JpZyk7CiAgICAgRnJlZVJhbV9TYnJfcHJldkVudmVsb3BlQ29tcGVuc2F0aW9uKCZocy0+cHJldkVudmVsb3BlQ29tcGVuc2F0aW9uKTsKICAgICBGcmVlUmFtX1Nicl9ndWlkZVNjZmIoJmhzLT5ndWlkZVNjZmIpOwotCiAgIH0KIH0KIApAQCAtMTM2OSwxMCArMTI4MCw5IEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQKLUZES3NickVuY19SZXNldFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvciAoSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU2ZiKQoteworSU5UIEZES3NickVuY19SZXNldFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvcigKKyAgICBIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IsCisgICAgSU5UIG5TZmIpIHsKICAgaW50IGk7CiAgIEZJWFBfREJMIHRlbXBHdWlkZVtNQVhfRlJFUV9DT0VGRlNdOwogICBVQ0hBUiB0ZW1wR3VpZGVJbnRbTUFYX0ZSRVFfQ09FRkZTXTsKQEAgLTEzODEsOTEgKzEyOTEsMTA2IEBACiAgIG5TZmJQcmV2ID0gaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+blNmYjsKICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+blNmYiA9IG5TZmI7CiAKLSAgRkRLbWVtY3B5KCB0ZW1wR3VpZGVJbnQsIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlU2NmYiwgblNmYlByZXYgKiBzaXplb2YoVUNIQVIpICk7CisgIEZES21lbWNweSh0ZW1wR3VpZGVJbnQsIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlU2NmYiwKKyAgICAgICAgICAgIG5TZmJQcmV2ICogc2l6ZW9mKFVDSEFSKSk7CiAKLSAgaWYgKCBuU2ZiID4gblNmYlByZXYgKSB7Ci0gICAgZm9yICggaSA9IDA7IGkgPCAoblNmYiAtIG5TZmJQcmV2KTsgaSsrICkgeworICBpZiAoblNmYiA+IG5TZmJQcmV2KSB7CisgICAgZm9yIChpID0gMDsgaSA8IChuU2ZiIC0gblNmYlByZXYpOyBpKyspIHsKICAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlU2NmYltpXSA9IDA7CiAgICAgfQogCi0gICAgZm9yICggaSA9IDA7IGkgPCBuU2ZiUHJldjsgaSsrICkgewotICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVTY2ZiW2kgKyAoblNmYiAtIG5TZmJQcmV2KV0gPSB0ZW1wR3VpZGVJbnRbaV07CisgICAgZm9yIChpID0gMDsgaSA8IG5TZmJQcmV2OyBpKyspIHsKKyAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlU2NmYltpICsgKG5TZmIgLSBuU2ZiUHJldildID0KKyAgICAgICAgICB0ZW1wR3VpZGVJbnRbaV07CiAgICAgfQotICB9Ci0gIGVsc2UgewotICAgIGZvciAoIGkgPSAwOyBpIDwgblNmYjsgaSsrICkgewotICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVTY2ZiW2ldID0gdGVtcEd1aWRlSW50W2kgKyAoblNmYlByZXYtblNmYildOworICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCBuU2ZiOyBpKyspIHsKKyAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlU2NmYltpXSA9CisgICAgICAgICAgdGVtcEd1aWRlSW50W2kgKyAoblNmYlByZXYgLSBuU2ZiKV07CiAgICAgfQogICB9CiAKLSAgRkRLbWVtY3B5ICggdGVtcEd1aWRlLCBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEaWZmLCBuU2ZiUHJldiAqIHNpemVvZihGSVhQX0RCTCkgKTsKKyAgRkRLbWVtY3B5KHRlbXBHdWlkZSwKKyAgICAgICAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3RvckRpZmYsCisgICAgICAgICAgICBuU2ZiUHJldiAqIHNpemVvZihGSVhQX0RCTCkpOwogCi0gIGlmIChuU2ZiID4gblNmYlByZXYgKSB7Ci0gICAgZm9yICggaSA9IDA7IGkgPCAoblNmYiAtIG5TZmJQcmV2KTsgaSsrICkgewotICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGlmZltpXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICBpZiAoblNmYiA+IG5TZmJQcmV2KSB7CisgICAgZm9yIChpID0gMDsgaSA8IChuU2ZiIC0gblNmYlByZXYpOyBpKyspIHsKKyAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3RvckRpZmZbaV0gPQorICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgIH0KIAotICAgIGZvciAoIGkgPSAwOyBpIDwgblNmYlByZXY7IGkrKyApIHsKLSAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3RvckRpZmZbaSArIChuU2ZiIC0gblNmYlByZXYpXSA9IHRlbXBHdWlkZVtpXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgblNmYlByZXY7IGkrKykgeworICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdCisgICAgICAgICAgLmd1aWRlVmVjdG9yRGlmZltpICsgKG5TZmIgLSBuU2ZiUHJldildID0gdGVtcEd1aWRlW2ldOwogICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBmb3IgKCBpID0gMDsgaSA8IG5TZmI7IGkrKyAgKSB7Ci0gICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEaWZmW2ldID0gdGVtcEd1aWRlW2kgKyAoblNmYlByZXYtblNmYildOworICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCBuU2ZiOyBpKyspIHsKKyAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3RvckRpZmZbaV0gPQorICAgICAgICAgIHRlbXBHdWlkZVtpICsgKG5TZmJQcmV2IC0gblNmYildOwogICAgIH0KICAgfQogCi0gIEZES21lbWNweSAoIHRlbXBHdWlkZSwgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yT3JpZywgblNmYlByZXYgKiBzaXplb2YoRklYUF9EQkwpICk7CisgIEZES21lbWNweSh0ZW1wR3VpZGUsCisgICAgICAgICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JPcmlnLAorICAgICAgICAgICAgblNmYlByZXYgKiBzaXplb2YoRklYUF9EQkwpKTsKIAotICBpZiAoIG5TZmIgPiBuU2ZiUHJldiApIHsKLSAgICBmb3IgKCBpID0gMDsgaTwgKG5TZmIgLSBuU2ZiUHJldik7IGkrKyApIHsKLSAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3Rvck9yaWdbaV0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgaWYgKG5TZmIgPiBuU2ZiUHJldikgeworICAgIGZvciAoaSA9IDA7IGkgPCAoblNmYiAtIG5TZmJQcmV2KTsgaSsrKSB7CisgICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JPcmlnW2ldID0KKyAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICB9CiAKLSAgICBmb3IgKCBpID0gMDsgaSA8IG5TZmJQcmV2OyBpKysgKSB7Ci0gICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JPcmlnW2kgKyAoblNmYiAtIG5TZmJQcmV2KV0gPSB0ZW1wR3VpZGVbaV07CisgICAgZm9yIChpID0gMDsgaSA8IG5TZmJQcmV2OyBpKyspIHsKKyAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlVmVjdG9yc1swXQorICAgICAgICAgIC5ndWlkZVZlY3Rvck9yaWdbaSArIChuU2ZiIC0gblNmYlByZXYpXSA9IHRlbXBHdWlkZVtpXTsKICAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZm9yICggaSA9IDA7IGkgPCBuU2ZiOyBpKysgKSB7Ci0gICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JPcmlnW2ldID0gdGVtcEd1aWRlW2kgKyAoblNmYlByZXYtblNmYildOworICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCBuU2ZiOyBpKyspIHsKKyAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPmd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3Rvck9yaWdbaV0gPQorICAgICAgICAgIHRlbXBHdWlkZVtpICsgKG5TZmJQcmV2IC0gblNmYildOwogICAgIH0KICAgfQogCi0gIEZES21lbWNweSAoIHRlbXBHdWlkZUludCwgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGV0ZWN0ZWQsIG5TZmJQcmV2ICogc2l6ZW9mKFVDSEFSKSApOworICBGREttZW1jcHkodGVtcEd1aWRlSW50LAorICAgICAgICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGV0ZWN0ZWQsCisgICAgICAgICAgICBuU2ZiUHJldiAqIHNpemVvZihVQ0hBUikpOwogCi0gIGlmICggblNmYiA+IG5TZmJQcmV2ICkgewotICAgIGZvciAoIGkgPSAwOyBpIDwgKG5TZmIgLSBuU2ZiUHJldik7IGkrKyApIHsKKyAgaWYgKG5TZmIgPiBuU2ZiUHJldikgeworICAgIGZvciAoaSA9IDA7IGkgPCAoblNmYiAtIG5TZmJQcmV2KTsgaSsrKSB7CiAgICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEZXRlY3RlZFtpXSA9IDA7CiAgICAgfQogCi0gICAgZm9yICggaSA9IDA7IGkgPCBuU2ZiUHJldjsgaSsrICkgewotICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdLmd1aWRlVmVjdG9yRGV0ZWN0ZWRbaSArIChuU2ZiIC0gblNmYlByZXYpXSA9IHRlbXBHdWlkZUludFtpXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgblNmYlByZXY7IGkrKykgeworICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+Z3VpZGVWZWN0b3JzWzBdCisgICAgICAgICAgLmd1aWRlVmVjdG9yRGV0ZWN0ZWRbaSArIChuU2ZiIC0gblNmYlByZXYpXSA9IHRlbXBHdWlkZUludFtpXTsKICAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZm9yICggaSA9IDA7IGkgPCBuU2ZiOyBpKysgKSB7Ci0gICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEZXRlY3RlZFtpXSA9IHRlbXBHdWlkZUludFtpICsgKG5TZmJQcmV2LW5TZmIpXTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgblNmYjsgaSsrKSB7CisgICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5ndWlkZVZlY3RvcnNbMF0uZ3VpZGVWZWN0b3JEZXRlY3RlZFtpXSA9CisgICAgICAgICAgdGVtcEd1aWRlSW50W2kgKyAoblNmYlByZXYgLSBuU2ZiKV07CiAgICAgfQogICB9CiAKLSAgRkRLbWVtY3B5ICggdGVtcEd1aWRlSW50LCBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5wcmV2RW52ZWxvcGVDb21wZW5zYXRpb24sIG5TZmJQcmV2ICogc2l6ZW9mKFVDSEFSKSApOworICBGREttZW1jcHkodGVtcEd1aWRlSW50LAorICAgICAgICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+cHJldkVudmVsb3BlQ29tcGVuc2F0aW9uLAorICAgICAgICAgICAgblNmYlByZXYgKiBzaXplb2YoVUNIQVIpKTsKIAotICBpZiAoIG5TZmIgPiBuU2ZiUHJldiApIHsKLSAgICBmb3IgKCBpID0gMDsgaSA8IChuU2ZiIC0gblNmYlByZXYpOyBpKysgKSB7CisgIGlmIChuU2ZiID4gblNmYlByZXYpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKG5TZmIgLSBuU2ZiUHJldik7IGkrKykgewogICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+cHJldkVudmVsb3BlQ29tcGVuc2F0aW9uW2ldID0gMDsKICAgICB9CiAKLSAgICBmb3IgKCBpID0gMDsgaSA8IG5TZmJQcmV2OyBpKysgKSB7Ci0gICAgICBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLT5wcmV2RW52ZWxvcGVDb21wZW5zYXRpb25baSArIChuU2ZiIC0gblNmYlByZXYpXSA9IHRlbXBHdWlkZUludFtpXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgblNmYlByZXY7IGkrKykgeworICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvcgorICAgICAgICAgIC0+cHJldkVudmVsb3BlQ29tcGVuc2F0aW9uW2kgKyAoblNmYiAtIG5TZmJQcmV2KV0gPSB0ZW1wR3VpZGVJbnRbaV07CiAgICAgfQotICB9Ci0gIGVsc2UgewotICAgIGZvciAoIGkgPSAwOyBpIDwgblNmYjsgaSsrICkgewotICAgICAgaFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvci0+cHJldkVudmVsb3BlQ29tcGVuc2F0aW9uW2ldID0gdGVtcEd1aWRlSW50W2kgKyAoblNmYlByZXYtblNmYildOworICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCBuU2ZiOyBpKyspIHsKKyAgICAgIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3ItPnByZXZFbnZlbG9wZUNvbXBlbnNhdGlvbltpXSA9CisgICAgICAgICAgdGVtcEd1aWRlSW50W2kgKyAoblNmYlByZXYgLSBuU2ZiKV07CiAgICAgfQogICB9CiAKICAgcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvbWhfZGV0LmggYi9saWJTQlJlbmMvc3JjL21oX2RldC5oCmluZGV4IDc0YzJhOTkuLjg5ZDgxYjUgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvbWhfZGV0LmgKKysrIGIvbGliU0JSZW5jL3NyYy9taF9kZXQuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw1MyArOTAsNjcgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBtaXNzaW5nIGhhcm1vbmljcyBkZXRlY3Rpb24gaGVhZGVyIGZpbGUgIAorICBcYnJpZWYgIG1pc3NpbmcgaGFybW9uaWNzIGRldGVjdGlvbiBoZWFkZXIgZmlsZSAkUmV2aXNpb246IDkyNzkwICQKICovCiAKLSNpZm5kZWYgX19NSF9ERVRFQ1RfSAotI2RlZmluZSBfX01IX0RFVEVDVF9ICisjaWZuZGVmIE1IX0RFVF9ICisjZGVmaW5lIE1IX0RFVF9ICiAKICNpbmNsdWRlICJzYnJfZW5jb2Rlci5oIgogI2luY2x1ZGUgImZyYW1fZ2VuLmgiCiAKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgIEZJWFBfREJMIHRocmVzSG9sZERpZmY7ICAgICAgLyohPCB0aHJlc2hvbGQgZm9yIHRvbmFsaXR5IGRpZmZlcmVuY2UgKi8KLSAgRklYUF9EQkwgdGhyZXNIb2xkRGlmZkd1aWRlOyAvKiE8IHRocmVzaG9sZCBmb3IgdG9uYWxpdHkgZGlmZmVyZW5jZSBmb3IgdGhlIGd1aWRlICovCisgIEZJWFBfREJMIHRocmVzSG9sZERpZmZHdWlkZTsgLyohPCB0aHJlc2hvbGQgZm9yIHRvbmFsaXR5IGRpZmZlcmVuY2UgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlICovCiAgIEZJWFBfREJMIHRocmVzSG9sZFRvbmU7ICAgICAgLyohPCB0aHJlc2hvbGQgZm9yIHRvbmFsaXR5IGZvciBhIHNpbmUgKi8KICAgRklYUF9EQkwgaW52VGhyZXNIb2xkVG9uZTsKLSAgRklYUF9EQkwgdGhyZXNIb2xkVG9uZUd1aWRlOyAvKiE8IHRocmVzaG9sZCBmb3IgdG9uYWxpdHkgZm9yIGEgc2luZSBmb3IgdGhlIGd1aWRlICovCi0gIEZJWFBfREJMIHNmbVRocmVzU2JyOyAgICAgICAgLyohPCB0b25hbGl0eSBmbGF0bmVzcyBtZWFzdXJlIHRocmVzaG9sZCBmb3IgdGhlIFNCUiBzaWduYWwuKi8KLSAgRklYUF9EQkwgc2ZtVGhyZXNPcmlnOyAgICAgICAvKiE8IHRvbmFsaXR5IGZsYXRuZXNzIG1lYXN1cmUgdGhyZXNob2xkIGZvciB0aGUgb3JpZ2luYWwgc2lnbmFsLiovCi0gIEZJWFBfREJMIGRlY2F5R3VpZGVPcmlnOyAgICAgLyohPCBkZWNheSB2YWx1ZSBvZiB0aGUgdG9uYWxpdHkgdmFsdWUgb2YgdGhlIGd1aWRlIGZvciB0aGUgdG9uZS4gKi8KLSAgRklYUF9EQkwgZGVjYXlHdWlkZURpZmY7ICAgICAvKiE8IGRlY2F5IHZhbHVlIG9mIHRoZSB0b25hbGl0eSB2YWx1ZSBvZiB0aGUgZ3VpZGUgZm9yIHRoZSB0b25hbGl0eSBkaWZmZXJlbmNlLiAqLwotICBGSVhQX0RCTCBkZXJpdlRocmVzTWF4TEQ2NDsgICAgICAvKiE8IHRocmVzaG9sZCBmb3IgZGV0ZWN0aW5nIExQIGNoYXJhY3RlciBpbiBhIHNpZ25hbC4gKi8KLSAgRklYUF9EQkwgZGVyaXZUaHJlc0JlbG93TEQ2NDsgICAgLyohPCB0aHJlc2hvbGQgZm9yIGRldGVjdGluZyBMUCBjaGFyYWN0ZXIgaW4gYSBzaWduYWwuICovCi0gIEZJWFBfREJMIGRlcml2VGhyZXNBYm92ZUxENjQ7ICAgIC8qITwgdGhyZXNob2xkIGZvciBkZXRlY3RpbmcgTFAgY2hhcmFjdGVyIGluIGEgc2lnbmFsLiAqLwotfVRIUkVTX0hPTERTOworICBGSVhQX0RCTCB0aHJlc0hvbGRUb25lR3VpZGU7IC8qITwgdGhyZXNob2xkIGZvciB0b25hbGl0eSBmb3IgYSBzaW5lIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSAqLworICBGSVhQX0RCTCBzZm1UaHJlc1NicjsgICAgLyohPCB0b25hbGl0eSBmbGF0bmVzcyBtZWFzdXJlIHRocmVzaG9sZCBmb3IgdGhlIFNCUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsLiovCisgIEZJWFBfREJMIHNmbVRocmVzT3JpZzsgICAvKiE8IHRvbmFsaXR5IGZsYXRuZXNzIG1lYXN1cmUgdGhyZXNob2xkIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsIHNpZ25hbC4qLworICBGSVhQX0RCTCBkZWNheUd1aWRlT3JpZzsgLyohPCBkZWNheSB2YWx1ZSBvZiB0aGUgdG9uYWxpdHkgdmFsdWUgb2YgdGhlIGd1aWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHRvbmUuICovCisgIEZJWFBfREJMIGRlY2F5R3VpZGVEaWZmOyAvKiE8IGRlY2F5IHZhbHVlIG9mIHRoZSB0b25hbGl0eSB2YWx1ZSBvZiB0aGUgZ3VpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgdG9uYWxpdHkgZGlmZmVyZW5jZS4gKi8KKyAgRklYUF9EQkwgZGVyaXZUaHJlc01heExENjQ7ICAgLyohPCB0aHJlc2hvbGQgZm9yIGRldGVjdGluZyBMUCBjaGFyYWN0ZXIgaW4gYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWwuICovCisgIEZJWFBfREJMIGRlcml2VGhyZXNCZWxvd0xENjQ7IC8qITwgdGhyZXNob2xkIGZvciBkZXRlY3RpbmcgTFAgY2hhcmFjdGVyIGluIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsLiAqLworICBGSVhQX0RCTCBkZXJpdlRocmVzQWJvdmVMRDY0OyAvKiE8IHRocmVzaG9sZCBmb3IgZGV0ZWN0aW5nIExQIGNoYXJhY3RlciBpbiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbC4gKi8KK30gVEhSRVNfSE9MRFM7CiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIElOVCBkZWx0YVRpbWU7ICAgICAgICAgICAgLyohPCBtYXhpbXVtIGFsbG93ZWQgdHJhbnNpZW50IGRpc3RhbmNlIChmcm9tIGZyYW1lIGJvcmRlciBpbiBudW1iZXIgb2YgcW1mIHN1YmJhbmQgc2FtcGxlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGEgZnJhbWUgdG8gYmUgY29uc2lkZXJlZCBhIHRyYW5zaWVudCBmcmFtZS4qLwotICBUSFJFU19IT0xEUyB0aHJlc0hvbGRzOyAgIC8qITwgdGhlIHRocmVzaG9sZHMgdXNlZCBmb3IgZGV0ZWN0aW9uLiAqLwotICBJTlQgbWF4Q29tcDsgICAgICAgICAgICAgIC8qITwgbWF4aW11bSBhbGxsb3dlZCBjb21wZW5zYXRpb24gZmFjdG9yIGZvciB0aGUgZW52ZWxvcGUgZGF0YS4gKi8KLX1ERVRFQ1RPUl9QQVJBTUVURVJTX01IOwordHlwZWRlZiBzdHJ1Y3QgeworICBJTlQgZGVsdGFUaW1lOyAvKiE8IG1heGltdW0gYWxsb3dlZCB0cmFuc2llbnQgZGlzdGFuY2UgKGZyb20gZnJhbWUgYm9yZGVyIGluCisgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBxbWYgc3ViYmFuZCBzYW1wbGUpIGZvciBhIGZyYW1lIHRvIGJlIGNvbnNpZGVyZWQgYQorICAgICAgICAgICAgICAgICAgICB0cmFuc2llbnQgZnJhbWUuKi8KKyAgVEhSRVNfSE9MRFMgdGhyZXNIb2xkczsgLyohPCB0aGUgdGhyZXNob2xkcyB1c2VkIGZvciBkZXRlY3Rpb24uICovCisgIElOVCBtYXhDb21wOyAvKiE8IG1heGltdW0gYWxsbG93ZWQgY29tcGVuc2F0aW9uIGZhY3RvciBmb3IgdGhlIGVudmVsb3BlIGRhdGEuCisgICAgICAgICAgICAgICAgKi8KK30gREVURUNUT1JfUEFSQU1FVEVSU19NSDsKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgRklYUF9EQkwgKmd1aWRlVmVjdG9yRGlmZjsKICAgRklYUF9EQkwgKmd1aWRlVmVjdG9yT3JpZzsKLSAgVUNIQVIqIGd1aWRlVmVjdG9yRGV0ZWN0ZWQ7Ci19R1VJREVfVkVDVE9SUzsKKyAgVUNIQVIgKmd1aWRlVmVjdG9yRGV0ZWN0ZWQ7Cit9IEdVSURFX1ZFQ1RPUlM7CiAKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgSU5UIHFtZk5vQ2hhbm5lbHM7CiAgIElOVCBuU2ZiOwogICBJTlQgc2FtcGxlRnJlcTsKQEAgLTE0NCw1MyArMTY5LDM2IEBACiAgIFVDSEFSICpndWlkZVNjZmI7CiAgIFVDSEFSICpwcmV2RW52ZWxvcGVDb21wZW5zYXRpb247CiAgIFVDSEFSICpkZXRlY3Rpb25WZWN0b3JzW01BWF9OT19PRl9FU1RJTUFURVNdOwotICBGSVhQX0RCTCB0b25hbGl0eURpZmZbTUFYX05PX09GX0VTVElNQVRFUy8yXVtNQVhfRlJFUV9DT0VGRlNdOwotICBGSVhQX0RCTCBzZm1PcmlnW01BWF9OT19PRl9FU1RJTUFURVMvMl1bTUFYX0ZSRVFfQ09FRkZTXTsKLSAgRklYUF9EQkwgc2ZtU2JyW01BWF9OT19PRl9FU1RJTUFURVMvMl1bTUFYX0ZSRVFfQ09FRkZTXTsKKyAgRklYUF9EQkwgdG9uYWxpdHlEaWZmW01BWF9OT19PRl9FU1RJTUFURVMgLyAyXVtNQVhfRlJFUV9DT0VGRlNdOworICBGSVhQX0RCTCBzZm1PcmlnW01BWF9OT19PRl9FU1RJTUFURVMgLyAyXVtNQVhfRlJFUV9DT0VGRlNdOworICBGSVhQX0RCTCBzZm1TYnJbTUFYX05PX09GX0VTVElNQVRFUyAvIDJdW01BWF9GUkVRX0NPRUZGU107CiAgIGNvbnN0IERFVEVDVE9SX1BBUkFNRVRFUlNfTUggKm1oUGFyYW1zOwogICBHVUlERV9WRUNUT1JTIGd1aWRlVmVjdG9yc1tNQVhfTk9fT0ZfRVNUSU1BVEVTXTsKLX0KLVNCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUjsKK30gU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SOwogCiB0eXBlZGVmIFNCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiAqSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUjsKIAotdm9pZAotRkRLc2JyRW5jX1Nick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvclFtZihIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhfc2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqIHBRdW90YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKiogcFNpZ25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgKmluZGV4VmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNCUl9GUkFNRV9JTkZPICpwRnJhbWVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSKiBwVHJhbkluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UKiBwQWRkSGFybW9uaWNzRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiogcEFkZEhhcm1vbmljc1NjYWxlRmFjdG9yQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIqIGZyZXFCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKiBlbnZlbG9wZUNvbXBlbnNhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcE5yZ1ZlY3Rvcik7Cit2b2lkIEZES3NickVuY19TYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3JRbWYoCisgICAgSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoX3Nick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvciwKKyAgICBGSVhQX0RCTCAqKnBRdW90YUJ1ZmZlciwgSU5UICoqcFNpZ25CdWZmZXIsIFNDSEFSICppbmRleFZlY3RvciwKKyAgICBjb25zdCBTQlJfRlJBTUVfSU5GTyAqcEZyYW1lSW5mbywgY29uc3QgVUNIQVIgKnBUcmFuSW5mbywKKyAgICBJTlQgKnBBZGRIYXJtb25pY3NGbGFnLCBVQ0hBUiAqcEFkZEhhcm1vbmljc1NjYWxlRmFjdG9yQmFuZHMsCisgICAgY29uc3QgVUNIQVIgKmZyZXFCYW5kVGFibGUsIElOVCBuU2ZiLCBVQ0hBUiAqZW52ZWxvcGVDb21wZW5zYXRpb24sCisgICAgRklYUF9EQkwgKnBOcmdWZWN0b3IpOwogCi1JTlQKLUZES3NickVuY19DcmVhdGVTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhTYnJNSERldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNoYW4pOworSU5UIEZES3NickVuY19DcmVhdGVTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IoCisgICAgSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoU2JyTUhEZXQsIElOVCBjaGFuKTsKIAotSU5UCi1GREtzYnJFbmNfSW5pdFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhfc2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVGcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBmcmFtZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHFtZk5vQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRvdE5vRXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBtb3ZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBub0VzdFBlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc2JyU3ludGF4RmxhZ3MpOworSU5UIEZES3NickVuY19Jbml0U2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yKAorICAgIEhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgaF9zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IsCisgICAgSU5UIHNhbXBsZUZyZXEsIElOVCBmcmFtZVNpemUsIElOVCBuU2ZiLCBJTlQgcW1mTm9DaGFubmVscywgSU5UIHRvdE5vRXN0LAorICAgIElOVCBtb3ZlLCBJTlQgbm9Fc3RQZXJGcmFtZSwgVUlOVCBzYnJTeW50YXhGbGFncyk7CiAKLXZvaWQKLUZES3NickVuY19EZWxldGVTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IgKEhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgaF9zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IpOwordm9pZCBGREtzYnJFbmNfRGVsZXRlU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yKAorICAgIEhBTkRMRV9TQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IgaF9zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IpOwogCi0KLUlOVAotRkRLc2JyRW5jX1Jlc2V0U2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yIChIQU5ETEVfU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIGhTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU2ZiKTsKK0lOVCBGREtzYnJFbmNfUmVzZXRTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IoCisgICAgSEFORExFX1NCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBoU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLAorICAgIElOVCBuU2ZiKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL25mX2VzdC5jcHAgYi9saWJTQlJlbmMvc3JjL25mX2VzdC5jcHAKaW5kZXggYTRjNTU3NC4uMjkwZWMzNSAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9uZl9lc3QuY3BwCisrKyBiL2xpYlNCUmVuYy9zcmMvbmZfZXN0LmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw3ICs5MCwxNSBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJuZl9lc3QuaCIKIApAQCAtODgsMjMgKzEwNywyMiBAQAogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAKIC8qIHNtb290aEZpbHRlcls0XSAgPSB7MC4wNTg1Nzg2NDM3NjI2OWYsIDAuMmYsIDAuMzQxNDIxMzU2MjM3MzFmLCAwLjRmfTsgKi8KLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBzbW9vdGhGaWx0ZXJbNF0gID0geyAweDA3N2Y4MTNkLCAweDE5OTk5OTk1LCAweDJiYjNiMWY1LCAweDMzMzMzMzM1IH07CitzdGF0aWMgY29uc3QgRklYUF9EQkwgc21vb3RoRmlsdGVyWzRdID0gezB4MDc3ZjgxM2QsIDB4MTk5OTk5OTUsIDB4MmJiM2IxZjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzMzMzMzMzV9OwogCiAvKiBzdGF0aWMgY29uc3QgSU5UIHNtb290aEZpbHRlckxlbmd0aCA9IDQ7ICovCiAKLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBRdWFudE9mZnNldCA9IChJTlQpMHhmYzAwMDAwMDsgIC8qIGxkNjQoMC4yNSkgKi8KK3N0YXRpYyBjb25zdCBGSVhQX0RCTCBRdWFudE9mZnNldCA9IChJTlQpMHhmYzAwMDAwMDsgLyogbGQ2NCgwLjI1KSAqLwogCiAjaWZuZGVmIG1pbgotI2RlZmluZSBtaW4oYSxiKSAoIGEgPCBiID8gYTpiKQorI2RlZmluZSBtaW4oYSwgYikgKGEgPCBiID8gYSA6IGIpCiAjZW5kaWYKIAogI2lmbmRlZiBtYXgKLSNkZWZpbmUgbWF4KGEsYikgKCBhID4gYiA/IGE6YikKKyNkZWZpbmUgbWF4KGEsIGIpIChhID4gYiA/IGEgOiBiKQogI2VuZGlmCiAKLSNkZWZpbmUgTk9JU0VfRkxPT1JfT0ZGU0VUX1NDQUxJTkcgICg0KQotCi0KKyNkZWZpbmUgTk9JU0VfRkxPT1JfT0ZGU0VUX1NDQUxJTkcgKDQpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQpAQCAtMTE2LDM4ICsxMzQsNDUgQEAKIAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1zbW9vdGhpbmdPZk5vaXNlTGV2ZWxzKEZJWFBfREJMICpOb2lzZUxldmVscywgICAgICAgIC8qITwgcG9pbnRlciB0byBub2lzZS1mbG9vciBsZXZlbHMuKi8KLSAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5FbnZlbG9wZXMsICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygbm9pc2UgZmxvb3IgZW52ZWxvcGVzLiovCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCBub05vaXNlQmFuZHMsICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIG5vaXNlIGJhbmRzIGZvciBldmVyeSBub2lzZSBmbG9vciBlbnZlbG9wZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgcHJldk5vaXNlTGV2ZWxzW05GX1NNT09USElOR19MRU5HVEhdW01BWF9OVU1fTk9JU0VfVkFMVUVTXSwvKiE8IFByZXZpb3VzIG5vaXNlIGZsb29yIGVudmVsb3Blcy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKnNtb290aEZpbHRlciwgLyohPCBmaWx0ZXIgdXNlZCBmb3Igc21vb3RoaW5nIHRoZSBub2lzZSBmbG9vciBsZXZlbHMuICovCi0gICAgICAgICAgICAgICAgICAgICAgIElOVCB0cmFuc2llbnRGbGFnKSAgICAgICAgICAgIC8qITwgZmxhZyBpbmRpY2F0aW5nIGlmIGEgdHJhbnNpZW50IGlzIHByZXNlbnQqLworc3RhdGljIHZvaWQgc21vb3RoaW5nT2ZOb2lzZUxldmVscygKKyAgICBGSVhQX0RCTCAqTm9pc2VMZXZlbHMsIC8qITwgcG9pbnRlciB0byBub2lzZS1mbG9vciBsZXZlbHMuKi8KKyAgICBJTlQgbkVudmVsb3BlcywgICAgICAgIC8qITwgTnVtYmVyIG9mIG5vaXNlIGZsb29yIGVudmVsb3Blcy4qLworICAgIElOVCBub05vaXNlQmFuZHMsIC8qITwgTnVtYmVyIG9mIG5vaXNlIGJhbmRzIGZvciBldmVyeSBub2lzZSBmbG9vciBlbnZlbG9wZS4KKyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBGSVhQX0RCTCBwcmV2Tm9pc2VMZXZlbHNbTkZfU01PT1RISU5HX0xFTkdUSF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTUFYX05VTV9OT0lTRV9WQUxVRVNdLCAvKiE8IFByZXZpb3VzIG5vaXNlIGZsb29yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGVzLiAqLworICAgIGNvbnN0IEZJWFBfREJMICoKKyAgICAgICAgcFNtb290aEZpbHRlciwgLyohPCBmaWx0ZXIgdXNlZCBmb3Igc21vb3RoaW5nIHRoZSBub2lzZSBmbG9vciBsZXZlbHMuICovCisgICAgSU5UIHRyYW5zaWVudEZsYWcpIC8qITwgZmxhZyBpbmRpY2F0aW5nIGlmIGEgdHJhbnNpZW50IGlzIHByZXNlbnQqLwogCiB7Ci0gIElOVCBpLGJhbmQsZW52OworICBJTlQgaSwgYmFuZCwgZW52OwogICBGSVhQX0RCTCBhY2N1OwogCi0gIGZvcihlbnYgPSAwOyBlbnYgPCBuRW52ZWxvcGVzOyBlbnYrKyl7Ci0gICAgaWYodHJhbnNpZW50RmxhZyl7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgTkZfU01PT1RISU5HX0xFTkdUSDsgaSsrKXsKLSAgICAgICAgRkRLbWVtY3B5KHByZXZOb2lzZUxldmVsc1tpXSxOb2lzZUxldmVscytlbnYqbm9Ob2lzZUJhbmRzLG5vTm9pc2VCYW5kcypzaXplb2YoRklYUF9EQkwpKTsKKyAgZm9yIChlbnYgPSAwOyBlbnYgPCBuRW52ZWxvcGVzOyBlbnYrKykgeworICAgIGlmICh0cmFuc2llbnRGbGFnKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTkZfU01PT1RISU5HX0xFTkdUSDsgaSsrKSB7CisgICAgICAgIEZES21lbWNweShwcmV2Tm9pc2VMZXZlbHNbaV0sIE5vaXNlTGV2ZWxzICsgZW52ICogbm9Ob2lzZUJhbmRzLAorICAgICAgICAgICAgICAgICAgbm9Ob2lzZUJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CiAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgZm9yIChpID0gMTsgaSA8IE5GX1NNT09USElOR19MRU5HVEg7IGkrKyl7Ci0gICAgICAgIEZES21lbWNweShwcmV2Tm9pc2VMZXZlbHNbaSAtIDFdLHByZXZOb2lzZUxldmVsc1tpXSxub05vaXNlQmFuZHMqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBORl9TTU9PVEhJTkdfTEVOR1RIOyBpKyspIHsKKyAgICAgICAgRkRLbWVtY3B5KHByZXZOb2lzZUxldmVsc1tpIC0gMV0sIHByZXZOb2lzZUxldmVsc1tpXSwKKyAgICAgICAgICAgICAgICAgIG5vTm9pc2VCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOwogICAgICAgfQotICAgICAgRkRLbWVtY3B5KHByZXZOb2lzZUxldmVsc1tORl9TTU9PVEhJTkdfTEVOR1RIIC0gMV0sTm9pc2VMZXZlbHMrZW52Km5vTm9pc2VCYW5kcyxub05vaXNlQmFuZHMqc2l6ZW9mKEZJWFBfREJMKSk7CisgICAgICBGREttZW1jcHkocHJldk5vaXNlTGV2ZWxzW05GX1NNT09USElOR19MRU5HVEggLSAxXSwKKyAgICAgICAgICAgICAgICBOb2lzZUxldmVscyArIGVudiAqIG5vTm9pc2VCYW5kcywKKyAgICAgICAgICAgICAgICBub05vaXNlQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKICAgICB9CiAKLSAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbm9Ob2lzZUJhbmRzOyBiYW5kKyspeworICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBub05vaXNlQmFuZHM7IGJhbmQrKykgewogICAgICAgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgZm9yIChpID0gMDsgaSA8IE5GX1NNT09USElOR19MRU5HVEg7IGkrKyl7Ci0gICAgICAgIGFjY3UgKz0gZk11bHREaXYyKHNtb290aEZpbHRlcltpXSwgcHJldk5vaXNlTGV2ZWxzW2ldW2JhbmRdKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBORl9TTU9PVEhJTkdfTEVOR1RIOyBpKyspIHsKKyAgICAgICAgYWNjdSArPSBmTXVsdERpdjIocFNtb290aEZpbHRlcltpXSwgcHJldk5vaXNlTGV2ZWxzW2ldW2JhbmRdKTsKICAgICAgIH0KLSAgICAgIEZES19BU1NFUlQoIChiYW5kICsgZW52Km5vTm9pc2VCYW5kcykgPCBNQVhfTlVNX05PSVNFX1ZBTFVFUyk7Ci0gICAgICBOb2lzZUxldmVsc1tiYW5kKyBlbnYqbm9Ob2lzZUJhbmRzXSA9IGFjY3U8PDE7CisgICAgICBGREtfQVNTRVJUKChiYW5kICsgZW52ICogbm9Ob2lzZUJhbmRzKSA8IE1BWF9OVU1fTk9JU0VfVkFMVUVTKTsKKyAgICAgIE5vaXNlTGV2ZWxzW2JhbmQgKyBlbnYgKiBub05vaXNlQmFuZHNdID0gYWNjdSA8PCAxOwogICAgIH0KICAgfQogfQpAQCAtMTYyLDkyICsxODcsMTAwIEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotcW1mQmFzZWROb2lzZUZsb29yRGV0ZWN0aW9uKEZJWFBfREJMICpub2lzZUxldmVsLCAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHZlY3RvciB0byBzdG9yZSB0aGUgbm9pc2UgbGV2ZWxzIGluLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiogcXVvdGFNYXRyaXhPcmlnLCAgICAgICAvKiE8IE1hdHJpeCBob2xkaW5nIHRoZSBxdW90YSB2YWx1ZXMgb2YgdGhlIG9yaWdpbmFsLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICppbmRleFZlY3RvciwgICAgICAgICAgICAgICAgLyohPCBJbmRleCB2ZWN0b3IgdG8gb2J0YWluIHRoZSBwYXRjaGVkIGRhdGEuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXJ0SW5kZXgsICAgICAgICAgICAgICAgICAgICAvKiE8IFN0YXJ0IGluZGV4LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdG9wSW5kZXgsICAgICAgICAgICAgICAgICAgICAgLyohPCBTdG9wIGluZGV4LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdGFydENoYW5uZWwsICAgICAgICAgICAgICAgICAgLyohPCBTdGFydCBjaGFubmVsIG9mIHRoZSBjdXJyZW50IG5vaXNlIGZsb29yIGJhbmQuKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RvcENoYW5uZWwsICAgICAgICAgICAgICAgICAgIC8qITwgU3RvcCBjaGFubmVsIG9mIHRoZSBjdXJyZW50IG5vaXNlIGZsb29yIGJhbmQuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgYW5hX21heF9sZXZlbCwgICAgICAgICAgICAvKiE8IE1heGltdW0gbGV2ZWwgb2YgdGhlIGFkYXB0aXZlIG5vaXNlLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgbm9pc2VGbG9vck9mZnNldCwgICAgICAgICAvKiE8IE5vaXNlIGZsb29yIG9mZnNldC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWlzc2luZ0hhcm1vbmljRmxhZywgICAgICAgICAgIC8qITwgRmxhZyBpbmRpY2F0aW5nIGlmIGEgc3Ryb25nIHRvbmFsIGNvbXBvbmVudCBpcyBtaXNzaW5nLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgd2VpZ2h0RmFjLCAgICAgICAgICAgICAgICAvKiE8IFdlaWdodGVuaW5nIGZhY3RvciBmb3IgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBvcmlnIGFuZCBzYnIuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WRl9NT0RFIGRpZmZUaHJlcywgICAgICAgICAgICAgICAvKiE8IFRocmVzaG9sZCB2YWx1ZSB0byBjb250cm9sIHRoZSBpbnZlcnNlIGZpbHRlcmluZyBkZWNpc2lvbi4qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSBpbnZlcnNlRmlsdGVyaW5nTGV2ZWwpICAgLyohPCBJbnZlcnNlIGZpbHRlcmluZyBsZXZlbCBvZiB0aGUgY3VycmVudCBiYW5kLiovCitzdGF0aWMgdm9pZCBxbWZCYXNlZE5vaXNlRmxvb3JEZXRlY3Rpb24oCisgICAgRklYUF9EQkwgKm5vaXNlTGV2ZWwsICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHZlY3RvciB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlIHRoZSBub2lzZSBsZXZlbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi4qLworICAgIEZJWFBfREJMICoqcXVvdGFNYXRyaXhPcmlnLCAgICAgIC8qITwgTWF0cml4IGhvbGRpbmcgdGhlIHF1b3RhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIG9mIHRoZSBvcmlnaW5hbC4gKi8KKyAgICBTQ0hBUiAqaW5kZXhWZWN0b3IsICAgICAgICAgICAgICAvKiE8IEluZGV4IHZlY3RvciB0byBvYnRhaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hlZCBkYXRhLiAqLworICAgIElOVCBzdGFydEluZGV4LCAgICAgICAgICAgICAgICAgIC8qITwgU3RhcnQgaW5kZXguICovCisgICAgSU5UIHN0b3BJbmRleCwgICAgICAgICAgICAgICAgICAgLyohPCBTdG9wIGluZGV4LiAqLworICAgIElOVCBzdGFydENoYW5uZWwsICAgICAgICAgICAgICAgIC8qITwgU3RhcnQgY2hhbm5lbCBvZiB0aGUgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vaXNlIGZsb29yIGJhbmQuKi8KKyAgICBJTlQgc3RvcENoYW5uZWwsICAgICAgICAgICAgICAgICAvKiE8IFN0b3AgY2hhbm5lbCBvZiB0aGUgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vaXNlIGZsb29yIGJhbmQuICovCisgICAgRklYUF9EQkwgYW5hX21heF9sZXZlbCwgICAgICAgICAgLyohPCBNYXhpbXVtIGxldmVsIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0aXZlIG5vaXNlLiovCisgICAgRklYUF9EQkwgbm9pc2VGbG9vck9mZnNldCwgICAgICAgLyohPCBOb2lzZSBmbG9vciBvZmZzZXQuICovCisgICAgSU5UIG1pc3NpbmdIYXJtb25pY0ZsYWcsICAgICAgICAgLyohPCBGbGFnIGluZGljYXRpbmcgaWYgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9uZyB0b25hbCBjb21wb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBtaXNzaW5nLiovCisgICAgRklYUF9EQkwgd2VpZ2h0RmFjLCAgICAgICAgICAgICAgLyohPCBXZWlnaHRlbmluZyBmYWN0b3IgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2UgYmV0d2VlbiBvcmlnIGFuZCBzYnIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgSU5WRl9NT0RFIGRpZmZUaHJlcywgICAgICAgICAgICAgLyohPCBUaHJlc2hvbGQgdmFsdWUgdG8gY29udHJvbCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlIGZpbHRlcmluZyBkZWNpc2lvbi4qLworICAgIElOVkZfTU9ERSBpbnZlcnNlRmlsdGVyaW5nTGV2ZWwpIC8qITwgSW52ZXJzZSBmaWx0ZXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCBvZiB0aGUgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQuKi8KIHsKICAgSU5UIHNjYWxlLCBsLCBrOwotICBGSVhQX0RCTCBtZWFuT3JpZz1GTDJGWENPTlNUX0RCTCgwLjBmKSwgbWVhblNicj1GTDJGWENPTlNUX0RCTCgwLjBmKSwgZGlmZjsKLSAgRklYUF9EQkwgaW52SW5kZXggPSBHZXRJbnZJbnQoc3RvcEluZGV4LXN0YXJ0SW5kZXgpOwotICBGSVhQX0RCTCBpbnZDaGFubmVsID0gR2V0SW52SW50KHN0b3BDaGFubmVsLXN0YXJ0Q2hhbm5lbCk7CisgIEZJWFBfREJMIG1lYW5PcmlnID0gRkwyRlhDT05TVF9EQkwoMC4wZiksIG1lYW5TYnIgPSBGTDJGWENPTlNUX0RCTCgwLjBmKSwKKyAgICAgICAgICAgZGlmZjsKKyAgRklYUF9EQkwgaW52SW5kZXggPSBHZXRJbnZJbnQoc3RvcEluZGV4IC0gc3RhcnRJbmRleCk7CisgIEZJWFBfREJMIGludkNoYW5uZWwgPSBHZXRJbnZJbnQoc3RvcENoYW5uZWwgLSBzdGFydENoYW5uZWwpOwogICBGSVhQX0RCTCBhY2N1OwogCi0gICAvKgotICAgQ2FsY3VsYXRlIHRoZSBtZWFuIHZhbHVlLCBvdmVyIHRoZSBjdXJyZW50IHRpbWUgc2VnbWVudCwgZm9yIHRoZSBvcmlnaW5hbCwgdGhlIEhGUgotICAgYW5kIHRoZSBkaWZmZXJlbmNlLCBvdmVyIGFsbCBjaGFubmVscyBpbiB0aGUgY3VycmVudCBmcmVxdWVuY3kgcmFuZ2UuCi0gICAqLworICAvKgorICBDYWxjdWxhdGUgdGhlIG1lYW4gdmFsdWUsIG92ZXIgdGhlIGN1cnJlbnQgdGltZSBzZWdtZW50LCBmb3IgdGhlIG9yaWdpbmFsLCB0aGUKKyAgSEZSIGFuZCB0aGUgZGlmZmVyZW5jZSwgb3ZlciBhbGwgY2hhbm5lbHMgaW4gdGhlIGN1cnJlbnQgZnJlcXVlbmN5IHJhbmdlLgorICAqLwogCi0gIGlmKG1pc3NpbmdIYXJtb25pY0ZsYWcgPT0gMSl7Ci0gICAgZm9yKGwgPSBzdGFydENoYW5uZWw7IGwgPCBzdG9wQ2hhbm5lbDtsKyspeworICBpZiAobWlzc2luZ0hhcm1vbmljRmxhZyA9PSAxKSB7CisgICAgZm9yIChsID0gc3RhcnRDaGFubmVsOyBsIDwgc3RvcENoYW5uZWw7IGwrKykgewogICAgICAgLyogdG9uYWxpdHlPcmlnICovCiAgICAgICBhY2N1ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICBmb3IoayA9IHN0YXJ0SW5kZXggOyBrIDwgc3RvcEluZGV4OyBrKyspeworICAgICAgZm9yIChrID0gc3RhcnRJbmRleDsgayA8IHN0b3BJbmRleDsgaysrKSB7CiAgICAgICAgIGFjY3UgKz0gZk11bHREaXYyKHF1b3RhTWF0cml4T3JpZ1trXVtsXSwgaW52SW5kZXgpOwogICAgICAgfQotICAgICAgbWVhbk9yaWcgPSBmaXhNYXgobWVhbk9yaWcsKGFjY3U8PDEpKTsKKyAgICAgIG1lYW5PcmlnID0gZml4TWF4KG1lYW5PcmlnLCAoYWNjdSA8PCAxKSk7CiAKICAgICAgIC8qIHRvbmFsaXR5U2JyICovCiAgICAgICBhY2N1ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICBmb3IoayA9IHN0YXJ0SW5kZXggOyBrIDwgc3RvcEluZGV4OyBrKyspeworICAgICAgZm9yIChrID0gc3RhcnRJbmRleDsgayA8IHN0b3BJbmRleDsgaysrKSB7CiAgICAgICAgIGFjY3UgKz0gZk11bHREaXYyKHF1b3RhTWF0cml4T3JpZ1trXVtpbmRleFZlY3RvcltsXV0sIGludkluZGV4KTsKICAgICAgIH0KLSAgICAgIG1lYW5TYnIgID0gZml4TWF4KG1lYW5TYnIsKGFjY3U8PDEpKTsKLQorICAgICAgbWVhblNiciA9IGZpeE1heChtZWFuU2JyLCAoYWNjdSA8PCAxKSk7CiAgICAgfQotICB9Ci0gIGVsc2V7Ci0gICAgZm9yKGwgPSBzdGFydENoYW5uZWw7IGwgPCBzdG9wQ2hhbm5lbDtsKyspeworICB9IGVsc2UgeworICAgIGZvciAobCA9IHN0YXJ0Q2hhbm5lbDsgbCA8IHN0b3BDaGFubmVsOyBsKyspIHsKICAgICAgIC8qIHRvbmFsaXR5T3JpZyAqLwogICAgICAgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICAgICAgZm9yKGsgPSBzdGFydEluZGV4IDsgayA8IHN0b3BJbmRleDsgaysrKXsKKyAgICAgIGZvciAoayA9IHN0YXJ0SW5kZXg7IGsgPCBzdG9wSW5kZXg7IGsrKykgewogICAgICAgICBhY2N1ICs9IGZNdWx0RGl2MihxdW90YU1hdHJpeE9yaWdba11bbF0sIGludkluZGV4KTsKICAgICAgIH0KLSAgICAgIG1lYW5PcmlnICs9IGZNdWx0KChhY2N1PDwxKSwgaW52Q2hhbm5lbCk7CisgICAgICBtZWFuT3JpZyArPSBmTXVsdCgoYWNjdSA8PCAxKSwgaW52Q2hhbm5lbCk7CiAKICAgICAgIC8qIHRvbmFsaXR5U2JyICovCiAgICAgICBhY2N1ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgICBmb3IoayA9IHN0YXJ0SW5kZXggOyBrIDwgc3RvcEluZGV4OyBrKyspeworICAgICAgZm9yIChrID0gc3RhcnRJbmRleDsgayA8IHN0b3BJbmRleDsgaysrKSB7CiAgICAgICAgIGFjY3UgKz0gZk11bHREaXYyKHF1b3RhTWF0cml4T3JpZ1trXVtpbmRleFZlY3RvcltsXV0sIGludkluZGV4KTsKICAgICAgIH0KLSAgICAgIG1lYW5TYnIgICs9IGZNdWx0KChhY2N1PDwxKSwgaW52Q2hhbm5lbCk7CisgICAgICBtZWFuU2JyICs9IGZNdWx0KChhY2N1IDw8IDEpLCBpbnZDaGFubmVsKTsKICAgICB9CiAgIH0KIAogICAvKiBTbWFsbCBmaXggdG8gYXZvaWQgbm9pc2UgZHVyaW5nIHNpbGVudCBwYXNzYWdlcy4qLwotICBpZiggbWVhbk9yaWcgPD0gRkwyRlhDT05TVF9EQkwoMC4wMDA5NzY1NjJmKlJFTEFYQVRJT05fRkxPQVQpICYmCi0gICAgICBtZWFuU2JyIDw9IEZMMkZYQ09OU1RfREJMKDAuMDAwOTc2NTYyZipSRUxBWEFUSU9OX0ZMT0FUKSApCi0gIHsKLSAgICBtZWFuT3JpZyA9IEZMMkZYQ09OU1RfREJMKDEwMS41OTM2NjczZipSRUxBWEFUSU9OX0ZMT0FUKTsKLSAgICBtZWFuU2JyICA9IEZMMkZYQ09OU1RfREJMKDEwMS41OTM2NjczZipSRUxBWEFUSU9OX0ZMT0FUKTsKKyAgaWYgKG1lYW5PcmlnIDw9IEZMMkZYQ09OU1RfREJMKDAuMDAwOTc2NTYyZiAqIFJFTEFYQVRJT05fRkxPQVQpICYmCisgICAgICBtZWFuU2JyIDw9IEZMMkZYQ09OU1RfREJMKDAuMDAwOTc2NTYyZiAqIFJFTEFYQVRJT05fRkxPQVQpKSB7CisgICAgbWVhbk9yaWcgPSBGTDJGWENPTlNUX0RCTCgxMDEuNTkzNjY3M2YgKiBSRUxBWEFUSU9OX0ZMT0FUKTsKKyAgICBtZWFuU2JyID0gRkwyRlhDT05TVF9EQkwoMTAxLjU5MzY2NzNmICogUkVMQVhBVElPTl9GTE9BVCk7CiAgIH0KIAotICBtZWFuT3JpZyA9IGZpeE1heChtZWFuT3JpZyxSRUxBWEFUSU9OKTsKLSAgbWVhblNiciAgPSBmaXhNYXgobWVhblNicixSRUxBWEFUSU9OKTsKKyAgbWVhbk9yaWcgPSBmaXhNYXgobWVhbk9yaWcsIFJFTEFYQVRJT04pOworICBtZWFuU2JyID0gZml4TWF4KG1lYW5TYnIsIFJFTEFYQVRJT04pOwogCi0gIGlmIChtaXNzaW5nSGFybW9uaWNGbGFnID09IDEgfHwKLSAgICAgIGludmVyc2VGaWx0ZXJpbmdMZXZlbCA9PSBJTlZGX01JRF9MRVZFTCB8fAorICBpZiAobWlzc2luZ0hhcm1vbmljRmxhZyA9PSAxIHx8IGludmVyc2VGaWx0ZXJpbmdMZXZlbCA9PSBJTlZGX01JRF9MRVZFTCB8fAogICAgICAgaW52ZXJzZUZpbHRlcmluZ0xldmVsID09IElOVkZfTE9XX0xFVkVMIHx8Ci0gICAgICBpbnZlcnNlRmlsdGVyaW5nTGV2ZWwgPT0gSU5WRl9PRkYgfHwKLSAgICAgIGludmVyc2VGaWx0ZXJpbmdMZXZlbCA8PSBkaWZmVGhyZXMpCi0gIHsKKyAgICAgIGludmVyc2VGaWx0ZXJpbmdMZXZlbCA9PSBJTlZGX09GRiB8fCBpbnZlcnNlRmlsdGVyaW5nTGV2ZWwgPD0gZGlmZlRocmVzKSB7CiAgICAgZGlmZiA9IFJFTEFYQVRJT047Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgYWNjdSA9IGZEaXZOb3JtKG1lYW5TYnIsIG1lYW5PcmlnLCAmc2NhbGUpOwogCi0gICAgZGlmZiA9IGZpeE1heCggUkVMQVhBVElPTiwKLSAgICAgICAgICAgICAgICAgICBmTXVsdChSRUxBWEFUSU9OX0ZSQUNULGZNdWx0KHdlaWdodEZhYyxhY2N1KSkgPj4oIFJFTEFYQVRJT05fU0hJRlQtc2NhbGUgKSApIDsKKyAgICBkaWZmID0gZml4TWF4KFJFTEFYQVRJT04sIGZNdWx0KFJFTEFYQVRJT05fRlJBQ1QsIGZNdWx0KHdlaWdodEZhYywgYWNjdSkpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJFTEFYQVRJT05fU0hJRlQgLSBzY2FsZSkpOwogICB9CiAKICAgLyoKQEAgLTI1OCwyNCArMjkxLDI3IEBACiAgIGFjY3UgPSBmRGl2Tm9ybShkaWZmLCBtZWFuT3JpZywgJnNjYWxlKTsKICAgc2NhbGUgLT0gMjsKIAotICBpZiAoIChzY2FsZT4wKSAmJiAoYWNjdSA+ICgoRklYUF9EQkwpTUFYVkFMX0RCTCk+PnNjYWxlKSApIHsKKyAgaWYgKChzY2FsZSA+IDApICYmIChhY2N1ID4gKChGSVhQX0RCTClNQVhWQUxfREJMKSA+PiBzY2FsZSkpIHsKICAgICAqbm9pc2VMZXZlbCA9IChGSVhQX0RCTClNQVhWQUxfREJMOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgICpub2lzZUxldmVsID0gc2NhbGVWYWx1ZShhY2N1LCBzY2FsZSk7CiAgIH0KIAogICAvKgogICAgKiBBZGQgYSBub2lzZSBmbG9vciBvZmZzZXQgdG8gY29tcGVuc2F0ZSBmb3IgYmlhcyBpbiB0aGUgZGV0ZWN0b3IKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICBpZighbWlzc2luZ0hhcm1vbmljRmxhZykgewotICAgICpub2lzZUxldmVsID0gZml4TWluKGZNdWx0KCpub2lzZUxldmVsLCBub2lzZUZsb29yT2Zmc2V0KSwgKEZJWFBfREJMKU1BWFZBTF9EQkw+Pk5PSVNFX0ZMT09SX09GRlNFVF9TQ0FMSU5HKSA8PCBOT0lTRV9GTE9PUl9PRkZTRVRfU0NBTElORzsKKyAgaWYgKCFtaXNzaW5nSGFybW9uaWNGbGFnKSB7CisgICAgKm5vaXNlTGV2ZWwgPSBmaXhNaW4oZk11bHQoKm5vaXNlTGV2ZWwsIG5vaXNlRmxvb3JPZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTClNQVhWQUxfREJMID4+IE5PSVNFX0ZMT09SX09GRlNFVF9TQ0FMSU5HKQorICAgICAgICAgICAgICAgICAgPDwgTk9JU0VfRkxPT1JfT0ZGU0VUX1NDQUxJTkc7CiAgIH0KIAogICAvKgogICAgKiBjaGVjayB0byBzZWUgdGhhdCB3ZSBkb24ndCBleGNlZWQgdGhlIG1heGltdW0gYWxsb3dlZCBsZXZlbAogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICpub2lzZUxldmVsID0gZml4TWluKCpub2lzZUxldmVsLCBhbmFfbWF4X2xldmVsKTsgICAgIC8qIGFuYV9tYXhfbGV2ZWwgaXMgc2NhbGVkIHdpdGggZmFjdG9yIDAuMjUgKi8KKyAgKm5vaXNlTGV2ZWwgPQorICAgICAgZml4TWluKCpub2lzZUxldmVsLAorICAgICAgICAgICAgIGFuYV9tYXhfbGV2ZWwpOyAvKiBhbmFfbWF4X2xldmVsIGlzIHNjYWxlZCB3aXRoIGZhY3RvciAwLjI1ICovCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI5MCw4NSArMzI2LDc4IEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1GREtzYnJFbmNfc2JyTm9pc2VGbG9vckVzdGltYXRlUW1mKEhBTkRMRV9TQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUsIC8qITwgSGFuZGxlIHRvIFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBzdHJ1Y3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQlJfRlJBTUVfSU5GTyAqZnJhbWVfaW5mbywgICAvKiE8IFRpbWUgZnJlcXVlbmN5IGdyaWQgb2YgdGhlIGN1cnJlbnQgZnJhbWUuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm5vaXNlTGV2ZWxzLCAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHZlY3RvciB0byBzdG9yZSB0aGUgbm9pc2UgbGV2ZWxzIGluLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxdW90YU1hdHJpeE9yaWcsICAgICAgICAgLyohPCBNYXRyaXggaG9sZGluZyB0aGUgcXVvdGEgdmFsdWVzIG9mIHRoZSBvcmlnaW5hbC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqaW5kZXhWZWN0b3IsICAgICAgICAgICAgICAvKiE8IEluZGV4IHZlY3RvciB0byBvYnRhaW4gdGhlIHBhdGNoZWQgZGF0YS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWlzc2luZ0hhcm1vbmljc0ZsYWcsICAgICAgICAgICAvKiE8IEZsYWcgaW5kaWNhdGluZyBpZiBhIHN0cm9uZyB0b25hbCBjb21wb25lbnQgd2lsbCBiZSBtaXNzaW5nLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdGFydEluZGV4LCAgICAgICAgICAgICAgICAgICAgIC8qITwgU3RhcnQgaW5kZXguICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBudW1iZXJPZkVzdGltYXRlc1BlckZyYW1lLCAgICAgLyohPCBUaGUgbnVtYmVyIG9mIHRvbmFsaXR5IGVzdGltYXRlcyBwZXIgZnJhbWUuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zaWVudEZyYW1lLCAgICAgICAgICAgICAgICAgLyohPCBBIGZsYWcgaW5kaWNhdGluZyBpZiBhIHRyYW5zaWVudCBpcyBwcmVzZW50LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSogcEludkZpbHRMZXZlbHMsICAgICAgICAgIC8qITwgUG9pbnRlciB0byB0aGUgdmVjdG9yIGhvbGRpbmcgdGhlIGludmVyc2UgZmlsdGVyaW5nIGxldmVscy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHNiclN5bnRheEZsYWdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgKQordm9pZCBGREtzYnJFbmNfc2JyTm9pc2VGbG9vckVzdGltYXRlUW1mKAorICAgIEhBTkRMRV9TQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUKKyAgICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUsIC8qITwgSGFuZGxlIHRvIFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGNvbnN0IFNCUl9GUkFNRV9JTkZPCisgICAgICAgICpmcmFtZV9pbmZvLCAvKiE8IFRpbWUgZnJlcXVlbmN5IGdyaWQgb2YgdGhlIGN1cnJlbnQgZnJhbWUuICovCisgICAgRklYUF9EQkwKKyAgICAgICAgKm5vaXNlTGV2ZWxzLCAvKiE8IFBvaW50ZXIgdG8gdmVjdG9yIHRvIHN0b3JlIHRoZSBub2lzZSBsZXZlbHMgaW4uKi8KKyAgICBGSVhQX0RCTCAqKnF1b3RhTWF0cml4T3JpZywgLyohPCBNYXRyaXggaG9sZGluZyB0aGUgcXVvdGEgdmFsdWVzIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbC4gKi8KKyAgICBTQ0hBUiAqaW5kZXhWZWN0b3IsICAgICAgICAgLyohPCBJbmRleCB2ZWN0b3IgdG8gb2J0YWluIHRoZSBwYXRjaGVkIGRhdGEuICovCisgICAgSU5UIG1pc3NpbmdIYXJtb25pY3NGbGFnLCAgIC8qITwgRmxhZyBpbmRpY2F0aW5nIGlmIGEgc3Ryb25nIHRvbmFsIGNvbXBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIG1pc3NpbmcuICovCisgICAgSU5UIHN0YXJ0SW5kZXgsICAgICAgICAgICAgIC8qITwgU3RhcnQgaW5kZXguICovCisgICAgVUlOVCBudW1iZXJPZkVzdGltYXRlc1BlckZyYW1lLCAvKiE8IFRoZSBudW1iZXIgb2YgdG9uYWxpdHkgZXN0aW1hdGVzIHBlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuICovCisgICAgaW50IHRyYW5zaWVudEZyYW1lLCAvKiE8IEEgZmxhZyBpbmRpY2F0aW5nIGlmIGEgdHJhbnNpZW50IGlzIHByZXNlbnQuICovCisgICAgSU5WRl9NT0RFICpwSW52RmlsdExldmVscywgLyohPCBQb2ludGVyIHRvIHRoZSB2ZWN0b3IgaG9sZGluZyB0aGUgaW52ZXJzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmluZyBsZXZlbHMuICovCisgICAgVUlOVCBzYnJTeW50YXhGbGFncykKIAogewotCiAgIElOVCBuTm9pc2VFbnZlbG9wZXMsIHN0YXJ0UG9zWzJdLCBzdG9wUG9zWzJdLCBlbnYsIGJhbmQ7CiAKLSAgSU5UIG5vTm9pc2VCYW5kcyAgICAgID0gaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPm5vTm9pc2VCYW5kczsKLSAgSU5UICpmcmVxQmFuZFRhYmxlICAgID0gaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPmZyZXFCYW5kVGFibGVRbWY7CisgIElOVCBub05vaXNlQmFuZHMgPSBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+bm9Ob2lzZUJhbmRzOworICBJTlQgKmZyZXFCYW5kVGFibGUgPSBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+ZnJlcUJhbmRUYWJsZVFtZjsKIAogICBuTm9pc2VFbnZlbG9wZXMgPSBmcmFtZV9pbmZvLT5uTm9pc2VFbnZlbG9wZXM7CiAKLSAgaWYgKHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpIHsKLSAgICBuTm9pc2VFbnZlbG9wZXMgPSAxOwotICAgIHN0YXJ0UG9zWzBdID0gc3RhcnRJbmRleDsKLSAgICBzdG9wUG9zWzBdICA9IHN0YXJ0SW5kZXggKyBtaW4obnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSwyKTsKLSAgfSBlbHNlCi0gIGlmKG5Ob2lzZUVudmVsb3BlcyA9PSAxKXsKLSAgICBzdGFydFBvc1swXSA9IHN0YXJ0SW5kZXg7Ci0gICAgc3RvcFBvc1swXSAgPSBzdGFydEluZGV4ICsgMjsKLSAgfQotICBlbHNlewotICAgIHN0YXJ0UG9zWzBdID0gc3RhcnRJbmRleDsKLSAgICBzdG9wUG9zWzBdICA9IHN0YXJ0SW5kZXggKyAxOworICBzdGFydFBvc1swXSA9IHN0YXJ0SW5kZXg7CisKKyAgaWYgKG5Ob2lzZUVudmVsb3BlcyA9PSAxKSB7CisgICAgc3RvcFBvc1swXSA9IHN0YXJ0SW5kZXggKyBtaW4obnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSwgMik7CisgIH0gZWxzZSB7CisgICAgc3RvcFBvc1swXSA9IHN0YXJ0SW5kZXggKyAxOwogICAgIHN0YXJ0UG9zWzFdID0gc3RhcnRJbmRleCArIDE7Ci0gICAgc3RvcFBvc1sxXSAgPSBzdGFydEluZGV4ICsgMjsKKyAgICBzdG9wUG9zWzFdID0gc3RhcnRJbmRleCArIG1pbihudW1iZXJPZkVzdGltYXRlc1BlckZyYW1lLCAyKTsKICAgfQogCiAgIC8qCiAgICAqIEVzdGltYXRlIHRoZSBub2lzZSBmbG9vci4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICBmb3IoZW52ID0gMDsgZW52IDwgbk5vaXNlRW52ZWxvcGVzOyBlbnYrKyl7Ci0gICAgZm9yKGJhbmQgPSAwOyBiYW5kIDwgbm9Ob2lzZUJhbmRzOyBiYW5kKyspewotICAgICAgRkRLX0FTU0VSVCggKGJhbmQgKyBlbnYqbm9Ob2lzZUJhbmRzKSA8IE1BWF9OVU1fTk9JU0VfVkFMVUVTKTsKLSAgICAgIHFtZkJhc2VkTm9pc2VGbG9vckRldGVjdGlvbigmbm9pc2VMZXZlbHNbYmFuZCArIGVudipub05vaXNlQmFuZHNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RhTWF0cml4T3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvc1tlbnZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BQb3NbZW52XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxQmFuZFRhYmxlW2JhbmRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXFCYW5kVGFibGVbYmFuZCsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+YW5hX21heF9sZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+bm9pc2VGbG9vck9mZnNldFtiYW5kXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nSGFybW9uaWNzRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+d2VpZ2h0RmFjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5kaWZmVGhyZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEludkZpbHRMZXZlbHNbYmFuZF0pOworICBmb3IgKGVudiA9IDA7IGVudiA8IG5Ob2lzZUVudmVsb3BlczsgZW52KyspIHsKKyAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbm9Ob2lzZUJhbmRzOyBiYW5kKyspIHsKKyAgICAgIEZES19BU1NFUlQoKGJhbmQgKyBlbnYgKiBub05vaXNlQmFuZHMpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVMpOworICAgICAgcW1mQmFzZWROb2lzZUZsb29yRGV0ZWN0aW9uKAorICAgICAgICAgICZub2lzZUxldmVsc1tiYW5kICsgZW52ICogbm9Ob2lzZUJhbmRzXSwgcXVvdGFNYXRyaXhPcmlnLCBpbmRleFZlY3RvciwKKyAgICAgICAgICBzdGFydFBvc1tlbnZdLCBzdG9wUG9zW2Vudl0sIGZyZXFCYW5kVGFibGVbYmFuZF0sCisgICAgICAgICAgZnJlcUJhbmRUYWJsZVtiYW5kICsgMV0sIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5hbmFfbWF4X2xldmVsLAorICAgICAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5ub2lzZUZsb29yT2Zmc2V0W2JhbmRdLCBtaXNzaW5nSGFybW9uaWNzRmxhZywKKyAgICAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+d2VpZ2h0RmFjLAorICAgICAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5kaWZmVGhyZXMsIHBJbnZGaWx0TGV2ZWxzW2JhbmRdKTsKICAgICB9CiAgIH0KIAotCiAgIC8qCiAgICAqIFNtb290aGluZyBvZiB0aGUgdmFsdWVzLgogICAgKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIHNtb290aGluZ09mTm9pc2VMZXZlbHMobm9pc2VMZXZlbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbk5vaXNlRW52ZWxvcGVzLAorICBzbW9vdGhpbmdPZk5vaXNlTGV2ZWxzKG5vaXNlTGV2ZWxzLCBuTm9pc2VFbnZlbG9wZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPm5vTm9pc2VCYW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+cHJldk5vaXNlTGV2ZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5zbW9vdGhGaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpZW50RnJhbWUpOwotCisgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPnNtb290aEZpbHRlciwgdHJhbnNpZW50RnJhbWUpOwogCiAgIC8qIHF1YW50aXNhdGlvbiovCi0gIGZvcihlbnYgPSAwOyBlbnYgPCBuTm9pc2VFbnZlbG9wZXM7IGVudisrKXsKLSAgICBmb3IoYmFuZCA9IDA7IGJhbmQgPCBub05vaXNlQmFuZHM7IGJhbmQrKyl7Ci0gICAgICBGREtfQVNTRVJUKCAoYmFuZCArIGVudipub05vaXNlQmFuZHMpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVMpOwotICAgICAgbm9pc2VMZXZlbHNbYmFuZCArIGVudipub05vaXNlQmFuZHNdID0KLSAgICAgICAgIChGSVhQX0RCTClOT0lTRV9GTE9PUl9PRkZTRVRfNjQgLSAoRklYUF9EQkwpQ2FsY0xkRGF0YShub2lzZUxldmVsc1tiYW5kICsgZW52Km5vTm9pc2VCYW5kc10rKEZJWFBfREJMKTEpICsgUXVhbnRPZmZzZXQ7CisgIGZvciAoZW52ID0gMDsgZW52IDwgbk5vaXNlRW52ZWxvcGVzOyBlbnYrKykgeworICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBub05vaXNlQmFuZHM7IGJhbmQrKykgeworICAgICAgRkRLX0FTU0VSVCgoYmFuZCArIGVudiAqIG5vTm9pc2VCYW5kcykgPCBNQVhfTlVNX05PSVNFX1ZBTFVFUyk7CisgICAgICBub2lzZUxldmVsc1tiYW5kICsgZW52ICogbm9Ob2lzZUJhbmRzXSA9CisgICAgICAgICAgKEZJWFBfREJMKU5PSVNFX0ZMT09SX09GRlNFVF82NCAtCisgICAgICAgICAgKEZJWFBfREJMKUNhbGNMZERhdGEobm9pc2VMZXZlbHNbYmFuZCArIGVudiAqIG5vTm9pc2VCYW5kc10gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkxKSArCisgICAgICAgICAgUXVhbnRPZmZzZXQ7CiAgICAgfQogICB9CiB9CkBAIC0zODIsMzkgKzQxMSwzOSBAQAogCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVAotZG93blNhbXBsZUxvUmVzKElOVCAqdl9yZXN1bHQsICAgICAgICAgICAgICAvKiE8ICAgICovCi0gICAgICAgICAgICAgICAgSU5UIG51bV9yZXN1bHQsICAgICAgICAgICAgIC8qITwgICAgKi8KLSAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqZnJlcUJhbmRUYWJsZVJlZiwvKiE8ICAgICovCi0gICAgICAgICAgICAgICAgSU5UIG51bV9SZWYpICAgICAgICAgICAgICAgIC8qITwgICAgKi8KK3N0YXRpYyBJTlQgZG93blNhbXBsZUxvUmVzKElOVCAqdl9yZXN1bHQsICAgICAgICAgICAgICAgICAvKiE8ICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtX3Jlc3VsdCwgICAgICAgICAgICAgICAgLyohPCAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKmZyZXFCYW5kVGFibGVSZWYsIC8qITwgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1fUmVmKSAgICAgICAgICAgICAgICAgICAvKiE8ICAgICovCiB7CiAgIElOVCBzdGVwOwotICBJTlQgaSxqOwotICBJTlQgb3JnX2xlbmd0aCxyZXN1bHRfbGVuZ3RoOwotICBJTlQgdl9pbmRleFtNQVhfRlJFUV9DT0VGRlMvMl07CisgIElOVCBpLCBqOworICBJTlQgb3JnX2xlbmd0aCwgcmVzdWx0X2xlbmd0aDsKKyAgSU5UIHZfaW5kZXhbTUFYX0ZSRVFfQ09FRkZTIC8gMl07CiAKICAgLyogaW5pdCAqLwotICBvcmdfbGVuZ3RoPW51bV9SZWY7Ci0gIHJlc3VsdF9sZW5ndGg9bnVtX3Jlc3VsdDsKKyAgb3JnX2xlbmd0aCA9IG51bV9SZWY7CisgIHJlc3VsdF9sZW5ndGggPSBudW1fcmVzdWx0OwogCi0gIHZfaW5kZXhbMF09MDsJLyogQWx3YXlzIHVzZSBsZWZ0IGJvcmRlciAqLwotICBpPTA7Ci0gIHdoaWxlKG9yZ19sZW5ndGggPiAwKQkvKiBDcmVhdGUgZG93bnNhbXBsZSB2ZWN0b3IgKi8KLSAgICB7Ci0gICAgICBpKys7Ci0gICAgICBzdGVwPW9yZ19sZW5ndGgvcmVzdWx0X2xlbmd0aDsgLyogZmxvb3I7ICovCi0gICAgICBvcmdfbGVuZ3RoPW9yZ19sZW5ndGggLSBzdGVwOwotICAgICAgcmVzdWx0X2xlbmd0aC0tOwotICAgICAgdl9pbmRleFtpXT12X2luZGV4W2ktMV0rc3RlcDsKLSAgICB9CisgIHZfaW5kZXhbMF0gPSAwOyAvKiBBbHdheXMgdXNlIGxlZnQgYm9yZGVyICovCisgIGkgPSAwOworICB3aGlsZSAob3JnX2xlbmd0aCA+IDApIC8qIENyZWF0ZSBkb3duc2FtcGxlIHZlY3RvciAqLworICB7CisgICAgaSsrOworICAgIHN0ZXAgPSBvcmdfbGVuZ3RoIC8gcmVzdWx0X2xlbmd0aDsgLyogZmxvb3I7ICovCisgICAgb3JnX2xlbmd0aCA9IG9yZ19sZW5ndGggLSBzdGVwOworICAgIHJlc3VsdF9sZW5ndGgtLTsKKyAgICB2X2luZGV4W2ldID0gdl9pbmRleFtpIC0gMV0gKyBzdGVwOworICB9CiAKLSAgaWYoaSAhPSBudW1fcmVzdWx0ICkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotICAgIHJldHVybiAoMSk7LyogZXJyb3IgZG93bnNhbXBsaW5nICovCisgIGlmIChpICE9IG51bV9yZXN1bHQpIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KKyAgICByZXR1cm4gKDEpOyAgICAgICAgLyogZXJyb3IgZG93bnNhbXBsaW5nICovCiAKLSAgZm9yKGo9MDtqPD1pO2orKykJLyogVXNlIGRvd25zYW1wbGUgdmVjdG9yIHRvIGluZGV4IExvUmVzb2x1dGlvbiB2ZWN0b3IuICovCi0gICAgewotICAgICAgdl9yZXN1bHRbal09ZnJlcUJhbmRUYWJsZVJlZlt2X2luZGV4W2pdXTsKLSAgICB9CisgIGZvciAoaiA9IDA7IGogPD0gaTsKKyAgICAgICBqKyspIC8qIFVzZSBkb3duc2FtcGxlIHZlY3RvciB0byBpbmRleCBMb1Jlc29sdXRpb24gdmVjdG9yLiAqLworICB7CisgICAgdl9yZXN1bHRbal0gPSBmcmVxQmFuZFRhYmxlUmVmW3ZfaW5kZXhbal1dOworICB9CiAKICAgcmV0dXJuICgwKTsKIH0KQEAgLTQyOCw0OCArNDU3LDQ4IEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQKLUZES3NickVuY19Jbml0U2JyTm9pc2VGbG9vckVzdGltYXRlIChIQU5ETEVfU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZSwgICAvKiE8IEhhbmRsZSB0byBTQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgc3RydWN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBhbmFfbWF4X2xldmVsLCAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYXhpbXVtIGxldmVsIG9mIHRoZSBhZGFwdGl2ZSBub2lzZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgKmZyZXFCYW5kVGFibGUsICAgICAgLyohPCBGcmVxdWFueSBiYW5kIHRhYmxlLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblNmYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGZyZXF1ZW5jeSBiYW5kcy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5vaXNlQmFuZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcyBwZXIgb2N0YXZlLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9pc2VGbG9vck9mZnNldCwgICAgICAgICAgICAgICAgICAgIC8qITwgTm9pc2UgZmxvb3Igb2Zmc2V0LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdGltZVNsb3RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWUgc2xvdHMgaW4gYSBmcmFtZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCB1c2VTcGVlY2hDb25maWcgICAgICAgICAgICAgLyohPCBGbGFnOiBhZGFwdCB0dW5pbmcgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gc3BlZWNoICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoteworSU5UIEZES3NickVuY19Jbml0U2JyTm9pc2VGbG9vckVzdGltYXRlKAorICAgIEhBTkRMRV9TQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUKKyAgICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUsIC8qITwgSGFuZGxlIHRvIFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIElOVCBhbmFfbWF4X2xldmVsLCAgICAgICAgICAgLyohPCBNYXhpbXVtIGxldmVsIG9mIHRoZSBhZGFwdGl2ZSBub2lzZS4gKi8KKyAgICBjb25zdCBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgIC8qITwgRnJlcXVlbmN5IGJhbmQgdGFibGUuICovCisgICAgSU5UIG5TZmIsICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBmcmVxdWVuY3kgYmFuZHMuICovCisgICAgSU5UIG5vaXNlQmFuZHMsICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcyBwZXIgb2N0YXZlLiAqLworICAgIElOVCBub2lzZUZsb29yT2Zmc2V0LCAgICAgICAgLyohPCBOb2lzZSBmbG9vciBvZmZzZXQuICovCisgICAgSU5UIHRpbWVTbG90cywgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB0aW1lIHNsb3RzIGluIGEgZnJhbWUuICovCisgICAgVUlOVCB1c2VTcGVlY2hDb25maWcgLyohPCBGbGFnOiBhZGFwdCB0dW5pbmcgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gc3BlZWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICovCispIHsKICAgSU5UIGksIHFleHAsIHF0bXA7CiAgIEZJWFBfREJMIHRtcCwgZXhwOwogCi0gIEZES21lbWNsZWFyKGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLHNpemVvZihTQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUpKTsKKyAgRkRLbWVtY2xlYXIoaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUsIHNpemVvZihTQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUpKTsKIAogICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+c21vb3RoRmlsdGVyID0gc21vb3RoRmlsdGVyOwogICBpZiAodXNlU3BlZWNoQ29uZmlnKSB7CiAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPndlaWdodEZhYyA9IChGSVhQX0RCTClNQVhWQUxfREJMOwogICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5kaWZmVGhyZXMgPSBJTlZGX0xPV19MRVZFTDsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+d2VpZ2h0RmFjID0gRkwyRlhDT05TVF9EQkwoMC4yNWYpOwogICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5kaWZmVGhyZXMgPSBJTlZGX01JRF9MRVZFTDsKICAgfQogCi0gIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT50aW1lU2xvdHMgICAgID0gdGltZVNsb3RzOwotICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+bm9pc2VCYW5kcyAgICA9IG5vaXNlQmFuZHM7CisgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT50aW1lU2xvdHMgPSB0aW1lU2xvdHM7CisgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5ub2lzZUJhbmRzID0gbm9pc2VCYW5kczsKIAogICAvKiBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+YW5hX21heF9sZXZlbCBpcyBzY2FsZWQgYnkgMC4yNSAgKi8KLSAgc3dpdGNoKGFuYV9tYXhfbGV2ZWwpCi0gIHsKLSAgY2FzZSA2OgorICBzd2l0Y2ggKGFuYV9tYXhfbGV2ZWwpIHsKKyAgICBjYXNlIDY6CiAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+YW5hX21heF9sZXZlbCA9IChGSVhQX0RCTClNQVhWQUxfREJMOwogICAgICAgYnJlYWs7Ci0gIGNhc2UgMzoKKyAgICBjYXNlIDM6CiAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+YW5hX21heF9sZXZlbCA9IEZMMkZYQ09OU1RfREJMKDAuNSk7CiAgICAgICBicmVhazsKLSAgY2FzZSAtMzoKKyAgICBjYXNlIC0zOgogICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPmFuYV9tYXhfbGV2ZWwgPSBGTDJGWENPTlNUX0RCTCgwLjEyNSk7CiAgICAgICBicmVhazsKLSAgZGVmYXVsdDoKKyAgICBkZWZhdWx0OgogICAgICAgLyogU2hvdWxkIG5vdCBlbnRlciBoZXJlICovCiAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+YW5hX21heF9sZXZlbCA9IChGSVhQX0RCTClNQVhWQUxfREJMOwogICAgICAgYnJlYWs7CkBAIC00NzgsMjYgKzUwNywyNiBAQAogICAvKgogICAgIGNhbGN1bGF0ZSBudW1iZXIgb2Ygbm9pc2UgYmFuZHMgYW5kIGFsbG9jYXRlCiAgICovCi0gIGlmKEZES3NickVuY19yZXNldFNick5vaXNlRmxvb3JFc3RpbWF0ZShoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZSxmcmVxQmFuZFRhYmxlLG5TZmIpKQotICAgIHJldHVybigxKTsKKyAgaWYgKEZES3NickVuY19yZXNldFNick5vaXNlRmxvb3JFc3RpbWF0ZShoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxQmFuZFRhYmxlLCBuU2ZiKSkKKyAgICByZXR1cm4gKDEpOwogCi0gIGlmKG5vaXNlRmxvb3JPZmZzZXQgPT0gMCkgewotICAgIHRtcCA9ICgoRklYUF9EQkwpTUFYVkFMX0RCTCk+Pk5PSVNFX0ZMT09SX09GRlNFVF9TQ0FMSU5HOwotICB9Ci0gIGVsc2UgeworICBpZiAobm9pc2VGbG9vck9mZnNldCA9PSAwKSB7CisgICAgdG1wID0gKChGSVhQX0RCTClNQVhWQUxfREJMKSA+PiBOT0lTRV9GTE9PUl9PRkZTRVRfU0NBTElORzsKKyAgfSBlbHNlIHsKICAgICAvKiBub2lzZUZsb29yT2Zmc2V0IGhhcyB0byBiZSBzbWFsbGVyIHRoYW4gMTIsIGJlY2F1c2UKICAgICAgICB0aGUgcmVzdWx0IG9mIHRoZSBjYWxjdWxhdGlvbiBiZWxvdyBtdXN0IGJlIHNtYWxsZXIgdGhhbiAxOgogICAgICAgICgyXihub2lzZUZsb29yT2Zmc2V0LzMpKSoyXjQ8MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZES19BU1NFUlQobm9pc2VGbG9vck9mZnNldDwxMik7CisgICAgRkRLX0FTU0VSVChub2lzZUZsb29yT2Zmc2V0IDwgMTIpOwogCiAgICAgLyogQXNzdW1lcyB0aGUgbm9pc2UgZmxvb3Igb2Zmc2V0IGluIHR1bmluZyB0YWJsZSBhcmUgaW4gcTMxICAgICovCiAgICAgLyogQ2hhbmdlIHRoZSBxZm9ybWF0IGhlcmUgd2hlbiBub24temVybyB2YWx1ZXMgd291bGQgYmUgZmlsbGVkICovCiAgICAgZXhwID0gZkRpdk5vcm0oKEZJWFBfREJMKW5vaXNlRmxvb3JPZmZzZXQsIDMsICZxZXhwKTsKLSAgICB0bXAgPSBmUG93KDIsIERGUkFDVF9CSVRTLTEsIGV4cCwgcWV4cCwgJnF0bXApOwotICAgIHRtcCA9IHNjYWxlVmFsdWUodG1wLCBxdG1wLU5PSVNFX0ZMT09SX09GRlNFVF9TQ0FMSU5HKTsKKyAgICB0bXAgPSBmUG93KDIsIERGUkFDVF9CSVRTIC0gMSwgZXhwLCBxZXhwLCAmcXRtcCk7CisgICAgdG1wID0gc2NhbGVWYWx1ZSh0bXAsIHF0bXAgLSBOT0lTRV9GTE9PUl9PRkZTRVRfU0NBTElORyk7CiAgIH0KIAotICBmb3IoaT0wO2k8aF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPm5vTm9pc2VCYW5kcztpKyspIHsKKyAgZm9yIChpID0gMDsgaSA8IGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5ub05vaXNlQmFuZHM7IGkrKykgewogICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5ub2lzZUZsb29yT2Zmc2V0W2ldID0gdG1wOwogICB9CiAKQEAgLTUxNCw1MiArNTQzLDUwIEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQKLUZES3NickVuY19yZXNldFNick5vaXNlRmxvb3JFc3RpbWF0ZSAoSEFORExFX1NCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZSwgLyohPCBIYW5kbGUgdG8gU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIHN0cnVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpmcmVxQmFuZFRhYmxlLCAgICAgICAgICAgICAvKiE8IEZyZXF1YW55IGJhbmQgdGFibGUuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBiYW5kcyBpbiB0aGUgZnJlcXVlbmN5IGJhbmQgdGFibGUuICovCi17Ci0gICAgSU5UIGsyLGt4OworSU5UIEZES3NickVuY19yZXNldFNick5vaXNlRmxvb3JFc3RpbWF0ZSgKKyAgICBIQU5ETEVfU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFCisgICAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLCAvKiE8IEhhbmRsZSB0byBTQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBjb25zdCBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgIC8qITwgRnJlcXVlbmN5IGJhbmQgdGFibGUuICovCisgICAgSU5UIG5TZmIgLyohPCBOdW1iZXIgb2YgYmFuZHMgaW4gdGhlIGZyZXF1ZW5jeSBiYW5kIHRhYmxlLiAqLworKSB7CisgIElOVCBrMiwga3g7CiAKKyAgLyoKKyAgICogQ2FsY3VsYXRlIG51bWJlciBvZiBub2lzZSBiYW5kcworICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGsyID0gZnJlcUJhbmRUYWJsZVtuU2ZiXTsKKyAga3ggPSBmcmVxQmFuZFRhYmxlWzBdOworICBpZiAoaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPm5vaXNlQmFuZHMgPT0gMCkgeworICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5ub05vaXNlQmFuZHMgPSAxOworICB9IGVsc2UgewogICAgIC8qCi0gICAgKiBDYWxjdWxhdGUgbnVtYmVyIG9mIG5vaXNlIGJhbmRzCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgazI9ZnJlcUJhbmRUYWJsZVtuU2ZiXTsKLSAgICBreD1mcmVxQmFuZFRhYmxlWzBdOwotICAgIGlmKGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5ub2lzZUJhbmRzID09IDApewotICAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+bm9Ob2lzZUJhbmRzID0gMTsKLSAgICB9Ci0gICAgZWxzZXsKLSAgICAgICAgLyoKLSAgICAgICAgKiBDYWxjdWxhdGUgbnVtYmVyIG9mIG5vaXNlIGJhbmRzIDEsMiBvciAzIGJhbmRzL29jdGF2ZQotICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgRklYUF9EQkwgdG1wLCByYXRpbywgbGcyOwotICAgICAgICBJTlQgcmF0aW9fZSwgcWxnMiwgbk5vaXNlQmFuZHM7CisgICAgICogQ2FsY3VsYXRlIG51bWJlciBvZiBub2lzZSBiYW5kcyAxLDIgb3IgMyBiYW5kcy9vY3RhdmUKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgRklYUF9EQkwgdG1wLCByYXRpbywgbGcyOworICAgIElOVCByYXRpb19lLCBxbGcyLCBuTm9pc2VCYW5kczsKIAotICAgICAgICByYXRpbyA9IGZEaXZOb3JtKGsyLCBreCwgJnJhdGlvX2UpOwotICAgICAgICBsZzIgPSBmTG9nMihyYXRpbywgcmF0aW9fZSwgJnFsZzIpOwotICAgICAgICB0bXAgPSBmTXVsdCgoRklYUF9EQkwpKGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5ub2lzZUJhbmRzPDwyNCksIGxnMik7Ci0gICAgICAgIHRtcCA9IHNjYWxlVmFsdWUodG1wLCBxbGcyLTIzKTsKKyAgICByYXRpbyA9IGZEaXZOb3JtKGsyLCBreCwgJnJhdGlvX2UpOworICAgIGxnMiA9IGZMb2cyKHJhdGlvLCByYXRpb19lLCAmcWxnMik7CisgICAgdG1wID0gZk11bHQoKEZJWFBfREJMKShoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+bm9pc2VCYW5kcyA8PCAyNCksIGxnMik7CisgICAgdG1wID0gc2NhbGVWYWx1ZSh0bXAsIHFsZzIgLSAyMyk7CiAKLSAgICAgICAgbk5vaXNlQmFuZHMgPSAoSU5UKSgodG1wICsgKEZJWFBfREJMKTEpID4+IDEpOworICAgIG5Ob2lzZUJhbmRzID0gKElOVCkoKHRtcCArIChGSVhQX0RCTCkxKSA+PiAxKTsKIAotCi0gICAgICAgIGlmIChuTm9pc2VCYW5kcyA+IE1BWF9OVU1fTk9JU0VfQ09FRkZTICkgewotICAgICAgICAgIG5Ob2lzZUJhbmRzID0gTUFYX05VTV9OT0lTRV9DT0VGRlM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbk5vaXNlQmFuZHMgPT0gMCApIHsKLSAgICAgICAgICBuTm9pc2VCYW5kcyA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+bm9Ob2lzZUJhbmRzID0gbk5vaXNlQmFuZHM7Ci0KKyAgICBpZiAobk5vaXNlQmFuZHMgPiBNQVhfTlVNX05PSVNFX0NPRUZGUykgeworICAgICAgbk5vaXNlQmFuZHMgPSBNQVhfTlVNX05PSVNFX0NPRUZGUzsKICAgICB9CiAKKyAgICBpZiAobk5vaXNlQmFuZHMgPT0gMCkgeworICAgICAgbk5vaXNlQmFuZHMgPSAxOworICAgIH0KIAotICAgIHJldHVybihkb3duU2FtcGxlTG9SZXMoaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUtPmZyZXFCYW5kVGFibGVRbWYsCi0gICAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5ub05vaXNlQmFuZHMsCi0gICAgICAgIGZyZXFCYW5kVGFibGUsblNmYikpOworICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5ub05vaXNlQmFuZHMgPSBuTm9pc2VCYW5kczsKKyAgfQorCisgIHJldHVybiAoZG93blNhbXBsZUxvUmVzKGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLT5mcmVxQmFuZFRhYmxlUW1mLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZS0+bm9Ob2lzZUJhbmRzLCBmcmVxQmFuZFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuU2ZiKSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTU3MiwxMCArNTk5LDExIEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1GREtzYnJFbmNfZGVsZXRlU2JyTm9pc2VGbG9vckVzdGltYXRlIChIQU5ETEVfU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlKSAgLyohPCBIYW5kbGUgdG8gU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIHN0cnVjdCAqLwordm9pZCBGREtzYnJFbmNfZGVsZXRlU2JyTm9pc2VGbG9vckVzdGltYXRlKAorICAgIEhBTkRMRV9TQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUKKyAgICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUpIC8qITwgSGFuZGxlIHRvIFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogewotCiAgIGlmIChoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZSkgewogICAgIC8qCiAgICAgICBub3RoaW5nIHRvIGRvCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL25mX2VzdC5oIGIvbGliU0JSZW5jL3NyYy9uZl9lc3QuaAppbmRleCBmMjZmNzRmLi5jMmYxNmU5IDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL25mX2VzdC5oCisrKyBiL2xpYlNCUmVuYy9zcmMvbmZfZXN0LmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNjkgKzkwLDk2IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgTm9pc2UgZmxvb3IgZXN0aW1hdGlvbiBzdHJ1Y3RzIGFuZCBwcm90b3R5cGVzICAKKyAgXGJyaWVmICBOb2lzZSBmbG9vciBlc3RpbWF0aW9uIHN0cnVjdHMgYW5kIHByb3RvdHlwZXMgJFJldmlzaW9uOiA5Mjc5MCAkCiAqLwogCi0jaWZuZGVmIF9fTkZfRVNUX0gKLSNkZWZpbmUgX19ORl9FU1RfSAorI2lmbmRlZiBORl9FU1RfSAorI2RlZmluZSBORl9FU1RfSAogCiAjaW5jbHVkZSAic2JyX2VuY29kZXIuaCIKICNpbmNsdWRlICJmcmFtX2dlbi5oIgogCi0jZGVmaW5lIE5GX1NNT09USElOR19MRU5HVEggNCAgICAgICAgICAgICAgICAgICAvKiE8IFNtb290aGluZyBsZW5ndGggb2YgdGhlIG5vaXNlIGZsb29ycy4gKi8KKyNkZWZpbmUgTkZfU01PT1RISU5HX0xFTkdUSCA0IC8qITwgU21vb3RoaW5nIGxlbmd0aCBvZiB0aGUgbm9pc2UgZmxvb3JzLiAqLwogCi10eXBlZGVmIHN0cnVjdAotewotICBGSVhQX0RCTCBwcmV2Tm9pc2VMZXZlbHNbTkZfU01PT1RISU5HX0xFTkdUSF1bTUFYX05VTV9OT0lTRV9WQUxVRVNdOyAvKiE8IFRoZSBwcmV2aW91cyBub2lzZSBsZXZlbHMuICovCi0gIEZJWFBfREJMIG5vaXNlRmxvb3JPZmZzZXRbTUFYX05VTV9OT0lTRV9WQUxVRVNdOyAgIC8qITwgTm9pc2UgZmxvb3Igb2Zmc2V0LCBzY2FsZWQgd2l0aCBOT0lTRV9GTE9PUl9PRkZTRVRfU0NBTElORyAqLwotICBjb25zdCBGSVhQX0RCTCAqc21vb3RoRmlsdGVyOyAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNtb290aGluZyBmaWx0ZXIgdG8gdXNlLiAqLwotICBGSVhQX0RCTCBhbmFfbWF4X2xldmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1heCBsZXZlbCBhbGxvd2VkLiAgICovCi0gIEZJWFBfREJMIHdlaWdodEZhYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV2VpZ2h0ZW5pbmcgZmFjdG9yIGZvciB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9yaWcgYW5kIHNici4gKi8KLSAgSU5UIGZyZXFCYW5kVGFibGVRbWZbTUFYX05VTV9OT0lTRV9WQUxVRVMgKyAxXTsgLyohPCBGcmVxdW5jeSBiYW5kIHRhYmxlIGZvciB0aGUgbm9pc2UgZmxvb3IgYmFuZHMuKi8KLSAgSU5UIG5vTm9pc2VCYW5kczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygbm9pc2ViYW5kcy4gKi8KLSAgSU5UIG5vaXNlQmFuZHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOb2lzZUJhbmRzIHN3aXRjaCA0IGJpdC4qLwotICBJTlQgdGltZVNsb3RzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB0aW1lc2xvdHMgaW4gYSBmcmFtZS4gKi8KLSAgSU5WRl9NT0RFIGRpZmZUaHJlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaHJlc2hvbGQgdmFsdWUgdG8gY29udHJvbCB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcgZGVjaXNpb24gKi8KLX0KLVNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgRklYUF9EQkwKKyAgcHJldk5vaXNlTGV2ZWxzW05GX1NNT09USElOR19MRU5HVEhdCisgICAgICAgICAgICAgICAgIFtNQVhfTlVNX05PSVNFX1ZBTFVFU107IC8qITwgVGhlIHByZXZpb3VzIG5vaXNlIGxldmVscy4gKi8KKyAgRklYUF9EQkwgbm9pc2VGbG9vck9mZnNldAorICAgICAgW01BWF9OVU1fTk9JU0VfVkFMVUVTXTsgICAvKiE8IE5vaXNlIGZsb29yIG9mZnNldCwgc2NhbGVkIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9JU0VfRkxPT1JfT0ZGU0VUX1NDQUxJTkcgKi8KKyAgY29uc3QgRklYUF9EQkwgKnNtb290aEZpbHRlcjsgLyohPCBTbW9vdGhpbmcgZmlsdGVyIHRvIHVzZS4gKi8KKyAgRklYUF9EQkwgYW5hX21heF9sZXZlbDsgICAgICAgLyohPCBNYXggbGV2ZWwgYWxsb3dlZC4gICAqLworICBGSVhQX0RCTCB3ZWlnaHRGYWM7IC8qITwgV2VpZ2h0ZW5pbmcgZmFjdG9yIGZvciB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9yaWcKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgc2JyLiAqLworICBJTlQgZnJlcUJhbmRUYWJsZVFtZltNQVhfTlVNX05PSVNFX1ZBTFVFUyArCisgICAgICAgICAgICAgICAgICAgICAgIDFdOyAvKiE8IEZyZXF1bmN5IGJhbmQgdGFibGUgZm9yIHRoZSBub2lzZSBmbG9vciBiYW5kcy4qLworICBJTlQgbm9Ob2lzZUJhbmRzOyAgICAgICAgLyohPCBOdW1iZXIgb2Ygbm9pc2ViYW5kcy4gKi8KKyAgSU5UIG5vaXNlQmFuZHM7ICAgICAgICAgIC8qITwgTm9pc2VCYW5kcyBzd2l0Y2ggNCBiaXQuKi8KKyAgSU5UIHRpbWVTbG90czsgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWVzbG90cyBpbiBhIGZyYW1lLiAqLworICBJTlZGX01PREUgZGlmZlRocmVzOyAgICAgLyohPCBUaHJlc2hvbGQgdmFsdWUgdG8gY29udHJvbCB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2lzaW9uICovCit9IFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURTsKIAogdHlwZWRlZiBTQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgKkhBTkRMRV9TQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEU7CiAKLXZvaWQKLUZES3NickVuY19zYnJOb2lzZUZsb29yRXN0aW1hdGVRbWYoSEFORExFX1NCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZSwgLyohPCBIYW5kbGUgdG8gU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIHN0cnVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNCUl9GUkFNRV9JTkZPICpmcmFtZV9pbmZvLCAgIC8qITwgVGltZSBmcmVxdWVuY3kgZ3JpZCBvZiB0aGUgY3VycmVudCBmcmFtZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbm9pc2VMZXZlbHMsICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gdmVjdG9yIHRvIHN0b3JlIHRoZSBub2lzZSBsZXZlbHMgaW4uKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnF1b3RhTWF0cml4T3JpZywgICAgICAgICAvKiE8IE1hdHJpeCBob2xkaW5nIHRoZSBxdW90YSB2YWx1ZXMgb2YgdGhlIG9yaWdpbmFsLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSKiBpbmRleFZlY3RvciwgICAgICAgICAgICAgICAgIC8qITwgSW5kZXggdmVjdG9yIHRvIG9idGFpbiB0aGUgcGF0Y2hlZCBkYXRhLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBtaXNzaW5nSGFybW9uaWNzRmxhZywgICAgICAgICAgIC8qITwgRmxhZyBpbmRpY2F0aW5nIGlmIGEgc3Ryb25nIHRvbmFsIGNvbXBvbmVudCB3aWxsIGJlIG1pc3NpbmcuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXJ0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgLyohPCBTdGFydCBpbmRleC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIG51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUsICAgICAvKiE8IFRoZSBudW1iZXIgb2YgdG9uYWxpdHkgZXN0aW1hdGVzIHBlciBmcmFtZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdHJhbnNpZW50RnJhbWUsICAgICAgICAgICAgICAgICAvKiE8IEEgZmxhZyBpbmRpY2F0aW5nIGlmIGEgdHJhbnNpZW50IGlzIHByZXNlbnQuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5WRl9NT0RFKiBwSW52RmlsdExldmVscywgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHRoZSB2ZWN0b3IgaG9sZGluZyB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWxzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc2JyU3ludGF4RmxhZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICApOwordm9pZCBGREtzYnJFbmNfc2JyTm9pc2VGbG9vckVzdGltYXRlUW1mKAorICAgIEhBTkRMRV9TQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUKKyAgICAgICAgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUsIC8qITwgSGFuZGxlIHRvIFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGNvbnN0IFNCUl9GUkFNRV9JTkZPCisgICAgICAgICpmcmFtZV9pbmZvLCAvKiE8IFRpbWUgZnJlcXVlbmN5IGdyaWQgb2YgdGhlIGN1cnJlbnQgZnJhbWUuICovCisgICAgRklYUF9EQkwKKyAgICAgICAgKm5vaXNlTGV2ZWxzLCAvKiE8IFBvaW50ZXIgdG8gdmVjdG9yIHRvIHN0b3JlIHRoZSBub2lzZSBsZXZlbHMgaW4uKi8KKyAgICBGSVhQX0RCTCAqKnF1b3RhTWF0cml4T3JpZywgLyohPCBNYXRyaXggaG9sZGluZyB0aGUgcXVvdGEgdmFsdWVzIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbC4gKi8KKyAgICBTQ0hBUiAqaW5kZXhWZWN0b3IsICAgICAgICAgLyohPCBJbmRleCB2ZWN0b3IgdG8gb2J0YWluIHRoZSBwYXRjaGVkIGRhdGEuICovCisgICAgSU5UIG1pc3NpbmdIYXJtb25pY3NGbGFnLCAgIC8qITwgRmxhZyBpbmRpY2F0aW5nIGlmIGEgc3Ryb25nIHRvbmFsIGNvbXBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIG1pc3NpbmcuICovCisgICAgSU5UIHN0YXJ0SW5kZXgsICAgICAgICAgICAgIC8qITwgU3RhcnQgaW5kZXguICovCisgICAgVUlOVCBudW1iZXJPZkVzdGltYXRlc1BlckZyYW1lLCAvKiE8IFRoZSBudW1iZXIgb2YgdG9uYWxpdHkgZXN0aW1hdGVzIHBlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuICovCisgICAgSU5UIHRyYW5zaWVudEZyYW1lLCAvKiE8IEEgZmxhZyBpbmRpY2F0aW5nIGlmIGEgdHJhbnNpZW50IGlzIHByZXNlbnQuICovCisgICAgSU5WRl9NT0RFICpwSW52RmlsdExldmVscywgLyohPCBQb2ludGVyIHRvIHRoZSB2ZWN0b3IgaG9sZGluZyB0aGUgaW52ZXJzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmluZyBsZXZlbHMuICovCisgICAgVUlOVCBzYnJTeW50YXhGbGFncyk7CiAKLUlOVAotRkRLc2JyRW5jX0luaXRTYnJOb2lzZUZsb29yRXN0aW1hdGUgKEhBTkRMRV9TQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLCAgIC8qITwgSGFuZGxlIHRvIFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBzdHJ1Y3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGFuYV9tYXhfbGV2ZWwsICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1heGltdW0gbGV2ZWwgb2YgdGhlIGFkYXB0aXZlIG5vaXNlLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgICAgICAvKiE8IEZyZXF1YW55IGJhbmQgdGFibGUuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuU2ZiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZnJlcXVlbmN5IGJhbmRzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9pc2VCYW5kcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIG5vaXNlIGJhbmRzIHBlciBvY3RhdmUuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBub2lzZUZsb29yT2Zmc2V0LCAgICAgICAgICAgICAgICAgICAgLyohPCBOb2lzZSBmbG9vciBvZmZzZXQuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0aW1lU2xvdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZSBzbG90cyBpbiBhIGZyYW1lLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHVzZVNwZWVjaENvbmZpZyAgICAgICAgICAgICAvKiE8IEZsYWc6IGFkYXB0IHR1bmluZyBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBzcGVlY2ggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKK0lOVCBGREtzYnJFbmNfSW5pdFNick5vaXNlRmxvb3JFc3RpbWF0ZSgKKyAgICBIQU5ETEVfU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFCisgICAgICAgIGhfc2JyTm9pc2VGbG9vckVzdGltYXRlLCAvKiE8IEhhbmRsZSB0byBTQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBJTlQgYW5hX21heF9sZXZlbCwgICAgICAgICAgIC8qITwgTWF4aW11bSBsZXZlbCBvZiB0aGUgYWRhcHRpdmUgbm9pc2UuICovCisgICAgY29uc3QgVUNIQVIgKmZyZXFCYW5kVGFibGUsICAvKiE8IEZyZXF1YW55IGJhbmQgdGFibGUuICovCisgICAgSU5UIG5TZmIsICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBmcmVxdWVuY3kgYmFuZHMuICovCisgICAgSU5UIG5vaXNlQmFuZHMsICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcyBwZXIgb2N0YXZlLiAqLworICAgIElOVCBub2lzZUZsb29yT2Zmc2V0LCAgICAgICAgLyohPCBOb2lzZSBmbG9vciBvZmZzZXQuICovCisgICAgSU5UIHRpbWVTbG90cywgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB0aW1lIHNsb3RzIGluIGEgZnJhbWUuICovCisgICAgVUlOVCB1c2VTcGVlY2hDb25maWcgLyohPCBGbGFnOiBhZGFwdCB0dW5pbmcgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gc3BlZWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICovCispOwogCi1JTlQKLUZES3NickVuY19yZXNldFNick5vaXNlRmxvb3JFc3RpbWF0ZSAoSEFORExFX1NCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZSwgLyohPCBIYW5kbGUgdG8gU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIHN0cnVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDSEFSICpmcmVxQmFuZFRhYmxlLCAgIC8qITwgRnJlcXVhbnkgYmFuZCB0YWJsZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblNmYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGJhbmRzIGluIHRoZSBmcmVxdWVuY3kgYmFuZCB0YWJsZS4gKi8KK0lOVCBGREtzYnJFbmNfcmVzZXRTYnJOb2lzZUZsb29yRXN0aW1hdGUoCisgICAgSEFORExFX1NCUl9OT0lTRV9GTE9PUl9FU1RJTUFURQorICAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZSwgLyohPCBIYW5kbGUgdG8gU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgY29uc3QgVUNIQVIgKmZyZXFCYW5kVGFibGUsICAvKiE8IEZyZXF1YW55IGJhbmQgdGFibGUuICovCisgICAgSU5UIG5TZmIpOyAvKiE8IE51bWJlciBvZiBiYW5kcyBpbiB0aGUgZnJlcXVlbmN5IGJhbmQgdGFibGUuICovCiAKLXZvaWQKLUZES3NickVuY19kZWxldGVTYnJOb2lzZUZsb29yRXN0aW1hdGUgKEhBTkRMRV9TQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgaF9zYnJOb2lzZUZsb29yRXN0aW1hdGUpOyAvKiE8IEhhbmRsZSB0byBTQlJfTk9JU0VfRkxPT1JfRVNUSU1BVEUgc3RydWN0ICovCit2b2lkIEZES3NickVuY19kZWxldGVTYnJOb2lzZUZsb29yRXN0aW1hdGUoCisgICAgSEFORExFX1NCUl9OT0lTRV9GTE9PUl9FU1RJTUFURQorICAgICAgICBoX3Nick5vaXNlRmxvb3JFc3RpbWF0ZSk7IC8qITwgSGFuZGxlIHRvIFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURSBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3BzX2JpdGVuYy5jcHAgYi9saWJTQlJlbmMvc3JjL3BzX2JpdGVuYy5jcHAKaW5kZXggNDIwZWExNS4uZTMwYWYyYSAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9wc19iaXRlbmMuY3BwCisrKyBiL2xpYlNCUmVuYy9zcmMvcHNfYml0ZW5jLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwzNyArOTAsMzUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUcgQXVkaW8gRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTi4gUmV0dGVsYmFjaAotICAgY29udGVudHMvZGVzY3JpcHRpb246IFBhcmFtZXRyaWMgU3RlcmVvIGJpdHN0cmVhbSBlbmNvZGVyCisgICBBdXRob3Iocyk6ICAgTi4gUmV0dGVsYmFjaAogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogUGFyYW1ldHJpYyBTdGVyZW8gYml0c3RyZWFtIGVuY29kZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInBzX2JpdGVuYy5oIgogCiAjaW5jbHVkZSAicHNfbWFpbi5oIgogCi0KLSNpbmNsdWRlICJwc19jb25zdC5oIgotI2luY2x1ZGUgInBzX2JpdGVuYy5oIgotCi1zdGF0aWMKLWlubGluZSBVQ0hBUiBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRTdHJlYW0sIFVJTlQgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG51bWJlck9mQml0cykKLXsKK3N0YXRpYyBpbmxpbmUgVUNIQVIgRkRLc2JyRW5jX1dyaXRlQml0c19wcyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBudW1iZXJPZkJpdHMpIHsKICAgLyogaEJpdFN0cmVhbSA9PSBOVUxMIGhhcHBlbnMgaGVyZSBpbnRlbnRpb25hbGx5ICovCi0gIGlmKGhCaXRTdHJlYW0hPU5VTEwpeworICBpZiAoaEJpdFN0cmVhbSAhPSBOVUxMKSB7CiAgICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHZhbHVlLCBudW1iZXJPZkJpdHMpOwogICB9CiAgIHJldHVybiBudW1iZXJPZkJpdHM7CiB9CiAKLSNkZWZpbmUgU0lfU0JSX0VYVEVOU0lPTl9TSVpFX0JJVFMgICAgICAgICAgICAgIDQKLSNkZWZpbmUgU0lfU0JSX0VYVEVOU0lPTl9FU0NfQ09VTlRfQklUUyAgICAgICAgIDgKLSNkZWZpbmUgU0lfU0JSX0VYVEVOU0lPTl9JRF9CSVRTICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgRVhURU5TSU9OX0lEX1BTX0NPRElORyAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgUFNfRVhUX0lEX1YwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU0lfU0JSX0VYVEVOU0lPTl9TSVpFX0JJVFMgNAorI2RlZmluZSBTSV9TQlJfRVhURU5TSU9OX0VTQ19DT1VOVF9CSVRTIDgKKyNkZWZpbmUgU0lfU0JSX0VYVEVOU0lPTl9JRF9CSVRTIDIKKyNkZWZpbmUgRVhURU5TSU9OX0lEX1BTX0NPRElORyAyCisjZGVmaW5lIFBTX0VYVF9JRF9WMCAwCiAKIHN0YXRpYyBjb25zdCBJTlQgaWlkRGVsdGFDb2Fyc2VfT2Zmc2V0ID0gMTQ7CiBzdGF0aWMgY29uc3QgSU5UIGlpZERlbHRhQ29hcnNlX01heFZhbCA9IDI4OwpAQCAtMTE3LDQ5OSArMTI2LDQyNSBAQAogc3RhdGljIGNvbnN0IElOVCBpaWREZWx0YUZpbmVfTWF4VmFsID0gNjA7CiAKIC8qIFBTIFN0ZXJlbyBIdWZmbWFudGFibGU6IGlpZERlbHRhRnJlcUNvYXJzZSAqLwotc3RhdGljIGNvbnN0IFVJTlQgaWlkRGVsdGFGcmVxQ29hcnNlX0xlbmd0aFtdID0KLXsKLSAgMTcsICAgIDE3LCAgICAxNywgICAgMTcsICAgIDE2LCAgMTUsICAgIDEzLCAgICAxMCwgICAgIDksICAgICA3LAotICAgNiwgICAgIDUsICAgICA0LCAgICAgMywgICAgIDEsICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDYsCi0gICA4LCAgICAxMSwgICAgMTMsICAgIDE0LCAgICAxNCwgIDE1LCAgICAxNywgICAgMTgsICAgIDE4Ci19Owotc3RhdGljIGNvbnN0IFVJTlQgaWlkRGVsdGFGcmVxQ29hcnNlX0NvZGVbXSAgPQotewotICAweDAwMDFmZmZiLCAgMHgwMDAxZmZmYywgIDB4MDAwMWZmZmQsICAweDAwMDFmZmZhLCAgMHgwMDAwZmZmYywgIDB4MDAwMDdmZmMsICAweDAwMDAxZmZkLCAgMHgwMDAwMDNmZSwgIDB4MDAwMDAxZmUsICAweDAwMDAwMDdlLAotICAweDAwMDAwMDNjLCAgMHgwMDAwMDAxZCwgIDB4MDAwMDAwMGQsICAweDAwMDAwMDA1LCAgMDAwMDAwMDAwMCwgIDB4MDAwMDAwMDQsICAweDAwMDAwMDBjLCAgMHgwMDAwMDAxYywgIDB4MDAwMDAwM2QsICAweDAwMDAwMDNlLAotICAweDAwMDAwMGZlLCAgMHgwMDAwMDdmZSwgIDB4MDAwMDFmZmMsICAweDAwMDAzZmZjLCAgMHgwMDAwM2ZmZCwgIDB4MDAwMDdmZmQsICAweDAwMDFmZmZlLCAgMHgwMDAzZmZmZSwgIDB4MDAwM2ZmZmYKLX07CitzdGF0aWMgY29uc3QgVUlOVCBpaWREZWx0YUZyZXFDb2Fyc2VfTGVuZ3RoW10gPSB7CisgICAgMTcsIDE3LCAxNywgMTcsIDE2LCAxNSwgMTMsIDEwLCA5LCAgNywgIDYsICA1LCAgNCwgIDMsIDEsCisgICAgMywgIDQsICA1LCAgNiwgIDYsICA4LCAgMTEsIDEzLCAxNCwgMTQsIDE1LCAxNywgMTgsIDE4fTsKK3N0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhRnJlcUNvYXJzZV9Db2RlW10gPSB7CisgICAgMHgwMDAxZmZmYiwgMHgwMDAxZmZmYywgMHgwMDAxZmZmZCwgMHgwMDAxZmZmYSwgMHgwMDAwZmZmYywgMHgwMDAwN2ZmYywKKyAgICAweDAwMDAxZmZkLCAweDAwMDAwM2ZlLCAweDAwMDAwMWZlLCAweDAwMDAwMDdlLCAweDAwMDAwMDNjLCAweDAwMDAwMDFkLAorICAgIDB4MDAwMDAwMGQsIDB4MDAwMDAwMDUsIDAwMDAwMDAwMDAsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMGMsIDB4MDAwMDAwMWMsCisgICAgMHgwMDAwMDAzZCwgMHgwMDAwMDAzZSwgMHgwMDAwMDBmZSwgMHgwMDAwMDdmZSwgMHgwMDAwMWZmYywgMHgwMDAwM2ZmYywKKyAgICAweDAwMDAzZmZkLCAweDAwMDA3ZmZkLCAweDAwMDFmZmZlLCAweDAwMDNmZmZlLCAweDAwMDNmZmZmfTsKIAogLyogUFMgU3RlcmVvIEh1ZmZtYW50YWJsZTogaWlkRGVsdGFGcmVxRmluZSAqLwotc3RhdGljIGNvbnN0IFVJTlQgaWlkRGVsdGFGcmVxRmluZV9MZW5ndGhbXSA9Ci17Ci0gIDE4LCAgICAxOCwgICAgMTgsICAgIDE4LCAgICAxOCwgIDE4LCAgICAxOCwgICAgMTgsICAgIDE4LCAgICAxNywKLSAgMTgsICAgIDE3LCAgICAxNywgICAgMTYsICAgIDE2LCAgMTUsICAgIDE0LCAgICAxNCwgICAgMTMsICAgIDEyLAotICAxMiwgICAgMTEsICAgIDEwLCAgICAxMCwgICAgIDgsICAgNywgICAgIDYsICAgICA1LCAgICAgNCwgICAgIDMsCi0gICAxLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwKLSAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE0LCAgMTUsICAgIDE2LCAgICAxNiwgICAgMTcsICAgIDE3LAotICAxOCwgICAgMTcsICAgIDE4LCAgICAxOCwgICAgMTgsICAxOCwgICAgMTgsICAgIDE4LCAgICAxOCwgICAgMTgsCi0gIDE4Ci19Owotc3RhdGljIGNvbnN0IFVJTlQgaWlkRGVsdGFGcmVxRmluZV9Db2RlW10gPQotewotICAweDAwMDFmZWI0LCAgMHgwMDAxZmViNSwgIDB4MDAwMWZkNzYsICAweDAwMDFmZDc3LCAgMHgwMDAxZmQ3NCwgIDB4MDAwMWZkNzUsICAweDAwMDFmZThhLCAgMHgwMDAxZmU4YiwgIDB4MDAwMWZlODgsICAweDAwMDBmZTgwLAotICAweDAwMDFmZWI2LCAgMHgwMDAwZmU4MiwgIDB4MDAwMGZlYjgsICAweDAwMDA3ZjQyLCAgMHgwMDAwN2ZhZSwgIDB4MDAwMDNmYWYsICAweDAwMDAxZmQxLCAgMHgwMDAwMWZlOSwgIDB4MDAwMDBmZTksICAweDAwMDAwN2VhLAotICAweDAwMDAwN2ZiLCAgMHgwMDAwMDNmYiwgIDB4MDAwMDAxZmIsICAweDAwMDAwMWZmLCAgMHgwMDAwMDA3YywgIDB4MDAwMDAwM2MsICAweDAwMDAwMDFjLCAgMHgwMDAwMDAwYywgIDAwMDAwMDAwMDAsICAweDAwMDAwMDAxLAotICAweDAwMDAwMDAxLCAgMHgwMDAwMDAwMiwgIDB4MDAwMDAwMDEsICAweDAwMDAwMDBkLCAgMHgwMDAwMDAxZCwgIDB4MDAwMDAwM2QsICAweDAwMDAwMDdkLCAgMHgwMDAwMDBmYywgIDB4MDAwMDAxZmMsICAweDAwMDAwM2ZjLAotICAweDAwMDAwM2Y0LCAgMHgwMDAwMDdlYiwgIDB4MDAwMDBmZWEsICAweDAwMDAxZmVhLCAgMHgwMDAwMWZkNiwgIDB4MDAwMDNmZDAsICAweDAwMDA3ZmFmLCAgMHgwMDAwN2Y0MywgIDB4MDAwMGZlYjksICAweDAwMDBmZTgzLAotICAweDAwMDFmZWI3LCAgMHgwMDAwZmU4MSwgIDB4MDAwMWZlODksICAweDAwMDFmZThlLCAgMHgwMDAxZmU4ZiwgIDB4MDAwMWZlOGMsICAweDAwMDFmZThkLCAgMHgwMDAxZmViMiwgIDB4MDAwMWZlYjMsICAweDAwMDFmZWIwLAotICAweDAwMDFmZWIxCi19Oworc3RhdGljIGNvbnN0IFVJTlQgaWlkRGVsdGFGcmVxRmluZV9MZW5ndGhbXSA9IHsKKyAgICAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxNywgMTgsIDE3LCAxNywgMTYsIDE2LCAxNSwKKyAgICAxNCwgMTQsIDEzLCAxMiwgMTIsIDExLCAxMCwgMTAsIDgsICA3LCAgNiwgIDUsICA0LCAgMywgIDEsICAzLAorICAgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDEwLCAxMSwgMTEsIDEyLCAxMywgMTQsIDE0LCAxNSwgMTYsIDE2LAorICAgIDE3LCAxNywgMTgsIDE3LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4fTsKK3N0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhRnJlcUZpbmVfQ29kZVtdID0geworICAgIDB4MDAwMWZlYjQsIDB4MDAwMWZlYjUsIDB4MDAwMWZkNzYsIDB4MDAwMWZkNzcsIDB4MDAwMWZkNzQsIDB4MDAwMWZkNzUsCisgICAgMHgwMDAxZmU4YSwgMHgwMDAxZmU4YiwgMHgwMDAxZmU4OCwgMHgwMDAwZmU4MCwgMHgwMDAxZmViNiwgMHgwMDAwZmU4MiwKKyAgICAweDAwMDBmZWI4LCAweDAwMDA3ZjQyLCAweDAwMDA3ZmFlLCAweDAwMDAzZmFmLCAweDAwMDAxZmQxLCAweDAwMDAxZmU5LAorICAgIDB4MDAwMDBmZTksIDB4MDAwMDA3ZWEsIDB4MDAwMDA3ZmIsIDB4MDAwMDAzZmIsIDB4MDAwMDAxZmIsIDB4MDAwMDAxZmYsCisgICAgMHgwMDAwMDA3YywgMHgwMDAwMDAzYywgMHgwMDAwMDAxYywgMHgwMDAwMDAwYywgMDAwMDAwMDAwMCwgMHgwMDAwMDAwMSwKKyAgICAweDAwMDAwMDAxLCAweDAwMDAwMDAyLCAweDAwMDAwMDAxLCAweDAwMDAwMDBkLCAweDAwMDAwMDFkLCAweDAwMDAwMDNkLAorICAgIDB4MDAwMDAwN2QsIDB4MDAwMDAwZmMsIDB4MDAwMDAxZmMsIDB4MDAwMDAzZmMsIDB4MDAwMDAzZjQsIDB4MDAwMDA3ZWIsCisgICAgMHgwMDAwMGZlYSwgMHgwMDAwMWZlYSwgMHgwMDAwMWZkNiwgMHgwMDAwM2ZkMCwgMHgwMDAwN2ZhZiwgMHgwMDAwN2Y0MywKKyAgICAweDAwMDBmZWI5LCAweDAwMDBmZTgzLCAweDAwMDFmZWI3LCAweDAwMDBmZTgxLCAweDAwMDFmZTg5LCAweDAwMDFmZThlLAorICAgIDB4MDAwMWZlOGYsIDB4MDAwMWZlOGMsIDB4MDAwMWZlOGQsIDB4MDAwMWZlYjIsIDB4MDAwMWZlYjMsIDB4MDAwMWZlYjAsCisgICAgMHgwMDAxZmViMX07CiAKIC8qIFBTIFN0ZXJlbyBIdWZmbWFudGFibGU6IGlpZERlbHRhVGltZUNvYXJzZSAqLwotc3RhdGljIGNvbnN0IFVJTlQgaWlkRGVsdGFUaW1lQ29hcnNlX0xlbmd0aFtdID0KLXsKLSAgMTksICAgIDE5LCAgICAxOSwgICAgMjAsICAgIDIwLCAgMjAsICAgIDE3LCAgICAxNSwgICAgMTIsICAgIDEwLAotICAgOCwgICAgIDYsICAgICA0LCAgICAgMiwgICAgIDEsICAgMywgICAgIDUsICAgICA3LCAgICAgOSwgICAgMTEsCi0gIDEzLCAgICAxNCwgICAgMTcsICAgIDE5LCAgICAyMCwgIDIwLCAgICAyMCwgICAgMjAsICAgIDIwCi19Owotc3RhdGljIGNvbnN0IFVJTlQgaWlkRGVsdGFUaW1lQ29hcnNlX0NvZGVbXSA9Ci17Ci0gIDB4MDAwN2ZmZjksICAweDAwMDdmZmZhLCAgMHgwMDA3ZmZmYiwgIDB4MDAwZmZmZjgsICAweDAwMGZmZmY5LCAgMHgwMDBmZmZmYSwgIDB4MDAwMWZmZmQsICAweDAwMDA3ZmZlLCAgMHgwMDAwMGZmZSwgIDB4MDAwMDAzZmUsCi0gIDB4MDAwMDAwZmUsICAweDAwMDAwMDNlLCAgMHgwMDAwMDAwZSwgIDB4MDAwMDAwMDIsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwNiwgIDB4MDAwMDAwMWUsICAweDAwMDAwMDdlLCAgMHgwMDAwMDFmZSwgIDB4MDAwMDA3ZmUsCi0gIDB4MDAwMDFmZmUsICAweDAwMDAzZmZlLCAgMHgwMDAxZmZmYywgIDB4MDAwN2ZmZjgsICAweDAwMGZmZmZiLCAgMHgwMDBmZmZmYywgIDB4MDAwZmZmZmQsICAweDAwMGZmZmZlLCAgMHgwMDBmZmZmZgotfTsKK3N0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhVGltZUNvYXJzZV9MZW5ndGhbXSA9IHsKKyAgICAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAxNywgMTUsIDEyLCAxMCwgOCwgIDYsICA0LCAgMiwgMSwKKyAgICAzLCAgNSwgIDcsICA5LCAgMTEsIDEzLCAxNCwgMTcsIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjB9Oworc3RhdGljIGNvbnN0IFVJTlQgaWlkRGVsdGFUaW1lQ29hcnNlX0NvZGVbXSA9IHsKKyAgICAweDAwMDdmZmY5LCAweDAwMDdmZmZhLCAweDAwMDdmZmZiLCAweDAwMGZmZmY4LCAweDAwMGZmZmY5LCAweDAwMGZmZmZhLAorICAgIDB4MDAwMWZmZmQsIDB4MDAwMDdmZmUsIDB4MDAwMDBmZmUsIDB4MDAwMDAzZmUsIDB4MDAwMDAwZmUsIDB4MDAwMDAwM2UsCisgICAgMHgwMDAwMDAwZSwgMHgwMDAwMDAwMiwgMDAwMDAwMDAwMCwgMHgwMDAwMDAwNiwgMHgwMDAwMDAxZSwgMHgwMDAwMDA3ZSwKKyAgICAweDAwMDAwMWZlLCAweDAwMDAwN2ZlLCAweDAwMDAxZmZlLCAweDAwMDAzZmZlLCAweDAwMDFmZmZjLCAweDAwMDdmZmY4LAorICAgIDB4MDAwZmZmZmIsIDB4MDAwZmZmZmMsIDB4MDAwZmZmZmQsIDB4MDAwZmZmZmUsIDB4MDAwZmZmZmZ9OwogCiAvKiBQUyBTdGVyZW8gSHVmZm1hbnRhYmxlOiBpaWREZWx0YVRpbWVGaW5lICovCi1zdGF0aWMgY29uc3QgVUlOVCBpaWREZWx0YVRpbWVGaW5lX0xlbmd0aFtdID0KLXsKLSAgMTYsICAgIDE2LCAgICAxNiwgICAgMTYsICAgIDE2LCAgMTYsICAgIDE2LCAgICAxNiwgICAgMTYsICAgIDE1LAotICAxNSwgICAgMTUsICAgIDE1LCAgICAxNSwgICAgMTUsICAxNCwgICAgMTQsICAgIDEzLCAgICAxMywgICAgMTMsCi0gIDEyLCAgICAxMiwgICAgMTEsICAgIDEwLCAgICAgOSwgICA5LCAgICAgNywgICAgIDYsICAgICA1LCAgICAgMywKLSAgIDEsICAgICAyLCAgICAgNSwgICAgIDYsICAgICA3LCAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDExLAotICAxMiwgICAgMTIsICAgIDEzLCAgICAxMywgICAgMTQsICAxNCwgICAgMTUsICAgIDE1LCAgICAxNSwgICAgMTUsCi0gIDE2LCAgICAxNiwgICAgMTYsICAgIDE2LCAgICAxNiwgIDE2LCAgICAxNiwgICAgMTYsICAgIDE2LCAgICAxNiwKLSAgMTYKLX07Ci1zdGF0aWMgY29uc3QgVUlOVCBpaWREZWx0YVRpbWVGaW5lX0NvZGVbXSA9Ci17Ci0gIDB4MDAwMDRlZDQsICAweDAwMDA0ZWQ1LCAgMHgwMDAwNGVjZSwgIDB4MDAwMDRlY2YsICAweDAwMDA0ZWNjLCAgMHgwMDAwNGVkNiwgIDB4MDAwMDRlZDgsICAweDAwMDA0ZjQ2LCAgMHgwMDAwNGY2MCwgIDB4MDAwMDI3MTgsCi0gIDB4MDAwMDI3MTksICAweDAwMDAyNzY0LCAgMHgwMDAwMjc2NSwgIDB4MDAwMDI3NmQsICAweDAwMDAyN2IxLCAgMHgwMDAwMTNiNywgIDB4MDAwMDEzZDYsICAweDAwMDAwOWM3LCAgMHgwMDAwMDllOSwgIDB4MDAwMDA5ZWQsCi0gIDB4MDAwMDA0ZWUsICAweDAwMDAwNGY3LCAgMHgwMDAwMDI3OCwgIDB4MDAwMDAxMzksICAweDAwMDAwMDlhLCAgMHgwMDAwMDA5ZiwgIDB4MDAwMDAwMjAsICAweDAwMDAwMDExLCAgMHgwMDAwMDAwYSwgIDB4MDAwMDAwMDMsCi0gIDB4MDAwMDAwMDEsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwYiwgIDB4MDAwMDAwMTIsICAweDAwMDAwMDIxLCAgMHgwMDAwMDA0YywgIDB4MDAwMDAwOWIsICAweDAwMDAwMTNhLCAgMHgwMDAwMDI3OSwgIDB4MDAwMDAyNzAsCi0gIDB4MDAwMDA0ZWYsICAweDAwMDAwNGUyLCAgMHgwMDAwMDllYSwgIDB4MDAwMDA5ZDgsICAweDAwMDAxM2Q3LCAgMHgwMDAwMTNkMCwgIDB4MDAwMDI3YjIsICAweDAwMDAyN2EyLCAgMHgwMDAwMjcxYSwgIDB4MDAwMDI3MWIsCi0gIDB4MDAwMDRmNjYsICAweDAwMDA0ZjY3LCAgMHgwMDAwNGY2MSwgIDB4MDAwMDRmNDcsICAweDAwMDA0ZWQ5LCAgMHgwMDAwNGVkNywgIDB4MDAwMDRlY2QsICAweDAwMDA0ZWQyLCAgMHgwMDAwNGVkMywgIDB4MDAwMDRlZDAsCi0gIDB4MDAwMDRlZDEKLX07CitzdGF0aWMgY29uc3QgVUlOVCBpaWREZWx0YVRpbWVGaW5lX0xlbmd0aFtdID0geworICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE0LAorICAgIDE0LCAxMywgMTMsIDEzLCAxMiwgMTIsIDExLCAxMCwgOSwgIDksICA3LCAgNiwgIDUsICAzLCAgMSwgIDIsCisgICAgNSwgIDYsICA3LCAgOCwgIDksICAxMCwgMTEsIDExLCAxMiwgMTIsIDEzLCAxMywgMTQsIDE0LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTZ9Oworc3RhdGljIGNvbnN0IFVJTlQgaWlkRGVsdGFUaW1lRmluZV9Db2RlW10gPSB7CisgICAgMHgwMDAwNGVkNCwgMHgwMDAwNGVkNSwgMHgwMDAwNGVjZSwgMHgwMDAwNGVjZiwgMHgwMDAwNGVjYywgMHgwMDAwNGVkNiwKKyAgICAweDAwMDA0ZWQ4LCAweDAwMDA0ZjQ2LCAweDAwMDA0ZjYwLCAweDAwMDAyNzE4LCAweDAwMDAyNzE5LCAweDAwMDAyNzY0LAorICAgIDB4MDAwMDI3NjUsIDB4MDAwMDI3NmQsIDB4MDAwMDI3YjEsIDB4MDAwMDEzYjcsIDB4MDAwMDEzZDYsIDB4MDAwMDA5YzcsCisgICAgMHgwMDAwMDllOSwgMHgwMDAwMDllZCwgMHgwMDAwMDRlZSwgMHgwMDAwMDRmNywgMHgwMDAwMDI3OCwgMHgwMDAwMDEzOSwKKyAgICAweDAwMDAwMDlhLCAweDAwMDAwMDlmLCAweDAwMDAwMDIwLCAweDAwMDAwMDExLCAweDAwMDAwMDBhLCAweDAwMDAwMDAzLAorICAgIDB4MDAwMDAwMDEsIDAwMDAwMDAwMDAsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMTIsIDB4MDAwMDAwMjEsIDB4MDAwMDAwNGMsCisgICAgMHgwMDAwMDA5YiwgMHgwMDAwMDEzYSwgMHgwMDAwMDI3OSwgMHgwMDAwMDI3MCwgMHgwMDAwMDRlZiwgMHgwMDAwMDRlMiwKKyAgICAweDAwMDAwOWVhLCAweDAwMDAwOWQ4LCAweDAwMDAxM2Q3LCAweDAwMDAxM2QwLCAweDAwMDAyN2IyLCAweDAwMDAyN2EyLAorICAgIDB4MDAwMDI3MWEsIDB4MDAwMDI3MWIsIDB4MDAwMDRmNjYsIDB4MDAwMDRmNjcsIDB4MDAwMDRmNjEsIDB4MDAwMDRmNDcsCisgICAgMHgwMDAwNGVkOSwgMHgwMDAwNGVkNywgMHgwMDAwNGVjZCwgMHgwMDAwNGVkMiwgMHgwMDAwNGVkMywgMHgwMDAwNGVkMCwKKyAgICAweDAwMDA0ZWQxfTsKIAotc3RhdGljIGNvbnN0IElOVCBpY2NEZWx0YV9PZmZzZXQgPSAgNzsKK3N0YXRpYyBjb25zdCBJTlQgaWNjRGVsdGFfT2Zmc2V0ID0gNzsKIHN0YXRpYyBjb25zdCBJTlQgaWNjRGVsdGFfTWF4VmFsID0gMTQ7CiAvKiBQUyBTdGVyZW8gSHVmZm1hbnRhYmxlOiBpY2NEZWx0YUZyZXEgKi8KLXN0YXRpYyBjb25zdCBVSU5UIGljY0RlbHRhRnJlcV9MZW5ndGhbXSA9Ci17Ci0gIDE0LCAgICAxNCwgICAgMTIsICAgIDEwLCAgICAgNywgICA1LCAgICAgMywgICAgIDEsICAgICAyLCAgICAgNCwKLSAgIDYsICAgICA4LCAgICAgOSwgICAgMTEsICAgIDEzCi19Owotc3RhdGljIGNvbnN0IFVJTlQgaWNjRGVsdGFGcmVxX0NvZGVbXSA9Ci17Ci0gIDB4MDAwMDNmZmYsICAweDAwMDAzZmZlLCAgMHgwMDAwMGZmZSwgIDB4MDAwMDAzZmUsICAweDAwMDAwMDdlLCAgMHgwMDAwMDAxZSwgIDB4MDAwMDAwMDYsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwMiwgIDB4MDAwMDAwMGUsCi0gIDB4MDAwMDAwM2UsICAweDAwMDAwMGZlLCAgMHgwMDAwMDFmZSwgIDB4MDAwMDA3ZmUsICAweDAwMDAxZmZlCi19Oworc3RhdGljIGNvbnN0IFVJTlQgaWNjRGVsdGFGcmVxX0xlbmd0aFtdID0gezE0LCAxNCwgMTIsIDEwLCA3LCA1LCAgMywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAgNCwgIDYsICA4LCAgOSwgMTEsIDEzfTsKK3N0YXRpYyBjb25zdCBVSU5UIGljY0RlbHRhRnJlcV9Db2RlW10gPSB7CisgICAgMHgwMDAwM2ZmZiwgMHgwMDAwM2ZmZSwgMHgwMDAwMGZmZSwgMHgwMDAwMDNmZSwgMHgwMDAwMDA3ZSwKKyAgICAweDAwMDAwMDFlLCAweDAwMDAwMDA2LCAwMDAwMDAwMDAwLCAweDAwMDAwMDAyLCAweDAwMDAwMDBlLAorICAgIDB4MDAwMDAwM2UsIDB4MDAwMDAwZmUsIDB4MDAwMDAxZmUsIDB4MDAwMDA3ZmUsIDB4MDAwMDFmZmV9OwogCiAvKiBQUyBTdGVyZW8gSHVmZm1hbnRhYmxlOiBpY2NEZWx0YVRpbWUgKi8KLXN0YXRpYyBjb25zdCBVSU5UIGljY0RlbHRhVGltZV9MZW5ndGhbXSA9Ci17Ci0gIDE0LCAgICAxMywgICAgMTEsICAgICA5LCAgICAgNywgICA1LCAgICAgMywgICAgIDEsICAgICAyLCAgICAgNCwKLSAgIDYsICAgICA4LCAgICAxMCwgICAgMTIsICAgIDE0Ci19Owotc3RhdGljIGNvbnN0IFVJTlQgaWNjRGVsdGFUaW1lX0NvZGVbXSA9Ci17Ci0gIDB4MDAwMDNmZmUsICAweDAwMDAxZmZlLCAgMHgwMDAwMDdmZSwgIDB4MDAwMDAxZmUsICAweDAwMDAwMDdlLCAgMHgwMDAwMDAxZSwgIDB4MDAwMDAwMDYsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwMiwgIDB4MDAwMDAwMGUsCi0gIDB4MDAwMDAwM2UsICAweDAwMDAwMGZlLCAgMHgwMDAwMDNmZSwgIDB4MDAwMDBmZmUsICAweDAwMDAzZmZmCi19OwotCi0KK3N0YXRpYyBjb25zdCBVSU5UIGljY0RlbHRhVGltZV9MZW5ndGhbXSA9IHsxNCwgMTMsIDExLCA5LCA3LCAgNSwgIDMsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgIDQsICA2LCAgOCwgMTAsIDEyLCAxNH07CitzdGF0aWMgY29uc3QgVUlOVCBpY2NEZWx0YVRpbWVfQ29kZVtdID0geworICAgIDB4MDAwMDNmZmUsIDB4MDAwMDFmZmUsIDB4MDAwMDA3ZmUsIDB4MDAwMDAxZmUsIDB4MDAwMDAwN2UsCisgICAgMHgwMDAwMDAxZSwgMHgwMDAwMDAwNiwgMDAwMDAwMDAwMCwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwZSwKKyAgICAweDAwMDAwMDNlLCAweDAwMDAwMGZlLCAweDAwMDAwM2ZlLCAweDAwMDAwZmZlLCAweDAwMDAzZmZmfTsKIAogc3RhdGljIGNvbnN0IElOVCBpcGREZWx0YV9PZmZzZXQgPSAwOwogc3RhdGljIGNvbnN0IElOVCBpcGREZWx0YV9NYXhWYWwgPSA3OwogLyogUFMgU3RlcmVvIEh1ZmZtYW50YWJsZTogaXBkRGVsdGFGcmVxICovCi1zdGF0aWMgY29uc3QgVUlOVCBpcGREZWx0YUZyZXFfTGVuZ3RoW10gPQotewotICAgMSwgICAgIDMsICAgICA0LCAgICAgNCwgICAgIDQsICAgNCwgICAgIDQsICAgICA0Ci19Owotc3RhdGljIGNvbnN0IFVJTlQgaXBkRGVsdGFGcmVxX0NvZGVbXSA9Ci17Ci0gIDB4MDAwMDAwMDEsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwNiwgIDB4MDAwMDAwMDQsICAweDAwMDAwMDAyLCAgMHgwMDAwMDAwMywgIDB4MDAwMDAwMDUsICAweDAwMDAwMDA3Ci19Oworc3RhdGljIGNvbnN0IFVJTlQgaXBkRGVsdGFGcmVxX0xlbmd0aFtdID0gezEsIDMsIDQsIDQsIDQsIDQsIDQsIDR9Oworc3RhdGljIGNvbnN0IFVJTlQgaXBkRGVsdGFGcmVxX0NvZGVbXSA9IHsweDAwMDAwMDAxLCAwMDAwMDAwMDAwLCAweDAwMDAwMDA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0LCAweDAwMDAwMDAyLCAweDAwMDAwMDAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA1LCAweDAwMDAwMDA3fTsKIAogLyogUFMgU3RlcmVvIEh1ZmZtYW50YWJsZTogaXBkRGVsdGFUaW1lICovCi1zdGF0aWMgY29uc3QgVUlOVCBpcGREZWx0YVRpbWVfTGVuZ3RoW10gPQotewotICAgMSwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDUsICAgNCwgICAgIDQsICAgICAzCi19Owotc3RhdGljIGNvbnN0IFVJTlQgaXBkRGVsdGFUaW1lX0NvZGVbXSA9Ci17Ci0gIDB4MDAwMDAwMDEsICAweDAwMDAwMDAyLCAgMHgwMDAwMDAwMiwgIDB4MDAwMDAwMDMsICAweDAwMDAwMDAyLCAgMDAwMDAwMDAwMCwgIDB4MDAwMDAwMDMsICAweDAwMDAwMDAzCi19OwotCitzdGF0aWMgY29uc3QgVUlOVCBpcGREZWx0YVRpbWVfTGVuZ3RoW10gPSB7MSwgMywgNCwgNSwgNSwgNCwgNCwgM307CitzdGF0aWMgY29uc3QgVUlOVCBpcGREZWx0YVRpbWVfQ29kZVtdID0gezB4MDAwMDAwMDEsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDIsIDAwMDAwMDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDN9OwogCiBzdGF0aWMgY29uc3QgSU5UIG9wZERlbHRhX09mZnNldCA9IDA7CiBzdGF0aWMgY29uc3QgSU5UIG9wZERlbHRhX01heFZhbCA9IDc7CiAvKiBQUyBTdGVyZW8gSHVmZm1hbnRhYmxlOiBvcGREZWx0YUZyZXEgKi8KLXN0YXRpYyBjb25zdCBVSU5UIG9wZERlbHRhRnJlcV9MZW5ndGhbXSA9Ci17Ci0gICAxLCAgICAgMywgICAgIDQsICAgICA0LCAgICAgNSwgICA1LCAgICAgNCwgICAgIDMKLX07Ci1zdGF0aWMgY29uc3QgVUlOVCBvcGREZWx0YUZyZXFfQ29kZVtdID0KLXsKLSAgMHgwMDAwMDAwMSwgIDB4MDAwMDAwMDEsICAweDAwMDAwMDA2LCAgMHgwMDAwMDAwNCwgIDB4MDAwMDAwMGYsICAweDAwMDAwMDBlLCAgMHgwMDAwMDAwNSwgIDAwMDAwMDAwMDAsCitzdGF0aWMgY29uc3QgVUlOVCBvcGREZWx0YUZyZXFfTGVuZ3RoW10gPSB7MSwgMywgNCwgNCwgNSwgNSwgNCwgM307CitzdGF0aWMgY29uc3QgVUlOVCBvcGREZWx0YUZyZXFfQ29kZVtdID0geworICAgIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMDQsCisgICAgMHgwMDAwMDAwZiwgMHgwMDAwMDAwZSwgMHgwMDAwMDAwNSwgMDAwMDAwMDAwMCwKIH07CiAKIC8qIFBTIFN0ZXJlbyBIdWZmbWFudGFibGU6IG9wZERlbHRhVGltZSAqLwotc3RhdGljIGNvbnN0IFVJTlQgb3BkRGVsdGFUaW1lX0xlbmd0aFtdID0KLXsKLSAgIDEsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA1LCAgIDQsICAgICA0LCAgICAgMwotfTsKLXN0YXRpYyBjb25zdCBVSU5UIG9wZERlbHRhVGltZV9Db2RlW10gPQotewotICAweDAwMDAwMDAxLCAgMHgwMDAwMDAwMiwgIDB4MDAwMDAwMDEsICAweDAwMDAwMDA3LCAgMHgwMDAwMDAwNiwgIDAwMDAwMDAwMDAsICAweDAwMDAwMDAyLCAgMHgwMDAwMDAwMwotfTsKK3N0YXRpYyBjb25zdCBVSU5UIG9wZERlbHRhVGltZV9MZW5ndGhbXSA9IHsxLCAzLCA0LCA1LCA1LCA0LCA0LCAzfTsKK3N0YXRpYyBjb25zdCBVSU5UIG9wZERlbHRhVGltZV9Db2RlW10gPSB7MHgwMDAwMDAwMSwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNywgMHgwMDAwMDAwNiwgMDAwMDAwMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMiwgMHgwMDAwMDAwM307CiAKLXN0YXRpYyBJTlQgZ2V0Tm9CYW5kcyhjb25zdCBJTlQgbW9kZSkKLXsKK3N0YXRpYyBJTlQgZ2V0Tm9CYW5kcyhjb25zdCBJTlQgbW9kZSkgewogICBJTlQgbm9CYW5kcyA9IDA7CiAKICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgY2FzZSAwOiBjYXNlIDM6IC8qIGNvYXJzZSAqLworICAgIGNhc2UgMDoKKyAgICBjYXNlIDM6IC8qIGNvYXJzZSAqLwogICAgICAgbm9CYW5kcyA9IFBTX0JBTkRTX0NPQVJTRTsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTogY2FzZSA0OiAvKiBtaWQgKi8KKyAgICBjYXNlIDE6CisgICAgY2FzZSA0OiAvKiBtaWQgKi8KICAgICAgIG5vQmFuZHMgPSBQU19CQU5EU19NSUQ7CiAgICAgICBicmVhazsKLSAgICBjYXNlIDI6IGNhc2UgNTogLyogZmluZSBub3Qgc3VwcG9ydGVkICovCi0gICAgZGVmYXVsdDogICAgICAgIC8qIGNvYXJzZSBhcyBkZWZhdWx0ICovCisgICAgY2FzZSAyOgorICAgIGNhc2UgNTogIC8qIGZpbmUgbm90IHN1cHBvcnRlZCAqLworICAgIGRlZmF1bHQ6IC8qIGNvYXJzZSBhcyBkZWZhdWx0ICovCiAgICAgICBub0JhbmRzID0gUFNfQkFORFNfQ09BUlNFOwogICB9CiAKICAgcmV0dXJuIG5vQmFuZHM7CiB9CiAKLXN0YXRpYyBJTlQgZ2V0SUlEUmVzKElOVCBpaWRNb2RlKQotewotICBpZihpaWRNb2RlPDMpCitzdGF0aWMgSU5UIGdldElJRFJlcyhJTlQgaWlkTW9kZSkgeworICBpZiAoaWlkTW9kZSA8IDMpCiAgICAgcmV0dXJuIFBTX0lJRF9SRVNfQ09BUlNFOwogICBlbHNlCiAgICAgcmV0dXJuIFBTX0lJRF9SRVNfRklORTsKIH0KIAotc3RhdGljIElOVAotZW5jb2RlRGVsdGFGcmVxKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsCi0gICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICp2YWwsCi0gICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICBuQmFuZHMsCi0gICAgICAgICAgICAgICAgY29uc3QgVUlOVCAqY29kZVRhYmxlLAotICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgKmxlbmd0aFRhYmxlLAotICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgdGFibGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICBtYXhWYWwsCi0gICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICplcnJvcikKLXsKK3N0YXRpYyBJTlQgZW5jb2RlRGVsdGFGcmVxKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsIGNvbnN0IElOVCAqdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5CYW5kcywgY29uc3QgVUlOVCAqY29kZVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAqbGVuZ3RoVGFibGUsIGNvbnN0IElOVCB0YWJsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBtYXhWYWwsIElOVCAqZXJyb3IpIHsKICAgSU5UIGJpdENudCA9IDA7CiAgIElOVCBsYXN0VmFsID0gMDsKICAgSU5UIGJhbmQ7CiAKLSAgZm9yKGJhbmQ9MDtiYW5kPG5CYW5kcztiYW5kKyspIHsKKyAgZm9yIChiYW5kID0gMDsgYmFuZCA8IG5CYW5kczsgYmFuZCsrKSB7CiAgICAgSU5UIGRlbHRhID0gKHZhbFtiYW5kXSAtIGxhc3RWYWwpICsgdGFibGVPZmZzZXQ7CiAgICAgbGFzdFZhbCA9IHZhbFtiYW5kXTsKLSAgICBpZiggKGRlbHRhPm1heFZhbCkgfHwgKGRlbHRhPDApICkgeworICAgIGlmICgoZGVsdGEgPiBtYXhWYWwpIHx8IChkZWx0YSA8IDApKSB7CiAgICAgICAqZXJyb3IgPSAxOwotICAgICAgZGVsdGEgPSBkZWx0YT4wP21heFZhbDowOworICAgICAgZGVsdGEgPSBkZWx0YSA+IDAgPyBtYXhWYWwgOiAwOwogICAgIH0KLSAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCBjb2RlVGFibGVbZGVsdGFdLCBsZW5ndGhUYWJsZVtkZWx0YV0pOworICAgIGJpdENudCArPQorICAgICAgICBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIGNvZGVUYWJsZVtkZWx0YV0sIGxlbmd0aFRhYmxlW2RlbHRhXSk7CiAgIH0KIAogICByZXR1cm4gYml0Q250OwogfQogCi1zdGF0aWMgSU5UCi1lbmNvZGVEZWx0YVRpbWUoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgKnZhbCwKLSAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgKnZhbExhc3QsCi0gICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICBuQmFuZHMsCi0gICAgICAgICAgICAgICAgY29uc3QgVUlOVCAqY29kZVRhYmxlLAotICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgKmxlbmd0aFRhYmxlLAotICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgdGFibGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICBtYXhWYWwsCi0gICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICplcnJvcikKLXsKK3N0YXRpYyBJTlQgZW5jb2RlRGVsdGFUaW1lKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsIGNvbnN0IElOVCAqdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICp2YWxMYXN0LCBjb25zdCBJTlQgbkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAqY29kZVRhYmxlLCBjb25zdCBVSU5UICpsZW5ndGhUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCB0YWJsZU9mZnNldCwgY29uc3QgSU5UIG1heFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqZXJyb3IpIHsKICAgSU5UIGJpdENudCA9IDA7CiAgIElOVCBiYW5kOwogCi0gIGZvcihiYW5kPTA7YmFuZDxuQmFuZHM7YmFuZCsrKSB7CisgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBuQmFuZHM7IGJhbmQrKykgewogICAgIElOVCBkZWx0YSA9ICh2YWxbYmFuZF0gLSB2YWxMYXN0W2JhbmRdKSArIHRhYmxlT2Zmc2V0OwotICAgIGlmKCAoZGVsdGE+bWF4VmFsKSB8fCAoZGVsdGE8MCkgKSB7CisgICAgaWYgKChkZWx0YSA+IG1heFZhbCkgfHwgKGRlbHRhIDwgMCkpIHsKICAgICAgICplcnJvciA9IDE7Ci0gICAgICBkZWx0YSA9IGRlbHRhPjA/bWF4VmFsOjA7CisgICAgICBkZWx0YSA9IGRlbHRhID4gMCA/IG1heFZhbCA6IDA7CiAgICAgfQotICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIGNvZGVUYWJsZVtkZWx0YV0sIGxlbmd0aFRhYmxlW2RlbHRhXSk7CisgICAgYml0Q250ICs9CisgICAgICAgIEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgY29kZVRhYmxlW2RlbHRhXSwgbGVuZ3RoVGFibGVbZGVsdGFdKTsKICAgfQogCiAgIHJldHVybiBiaXRDbnQ7CiB9CiAKLUlOVCBGREtzYnJFbmNfRW5jb2RlSWlkKEhBTkRMRV9GREtfQklUU1RSRUFNICAgICBoQml0QnVmLAotICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAqaWlkVmFsLAotICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAqaWlkVmFsTGFzdCwKLSAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgIG5CYW5kcywKLSAgICAgICAgICAgICAgY29uc3QgUFNfSUlEX1JFU09MVVRJT04gIHJlcywKLSAgICAgICAgICAgICAgY29uc3QgUFNfREVMVEEgICAgICAgICAgIG1vZGUsCi0gICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICplcnJvcikKLXsKK0lOVCBGREtzYnJFbmNfRW5jb2RlSWlkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsIGNvbnN0IElOVCAqaWlkVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICppaWRWYWxMYXN0LCBjb25zdCBJTlQgbkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNfSUlEX1JFU09MVVRJT04gcmVzLCBjb25zdCBQU19ERUxUQSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UICplcnJvcikgewogICBjb25zdCBVSU5UICpjb2RlVGFibGU7CiAgIGNvbnN0IFVJTlQgKmxlbmd0aFRhYmxlOwogICBJTlQgYml0Q250ID0gMDsKIAogICBiaXRDbnQgPSAwOwogCi0gIHN3aXRjaChtb2RlKSB7Ci0gIGNhc2UgUFNfREVMVEFfRlJFUToKLSAgICBzd2l0Y2gocmVzKSB7Ci0gICAgY2FzZSBQU19JSURfUkVTX0NPQVJTRToKLSAgICAgIGNvZGVUYWJsZSAgID0gaWlkRGVsdGFGcmVxQ29hcnNlX0NvZGU7Ci0gICAgICBsZW5ndGhUYWJsZSA9IGlpZERlbHRhRnJlcUNvYXJzZV9MZW5ndGg7Ci0gICAgICBiaXRDbnQgKz0gZW5jb2RlRGVsdGFGcmVxKGhCaXRCdWYsIGlpZFZhbCwgbkJhbmRzLCBjb2RlVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFRhYmxlLCBpaWREZWx0YUNvYXJzZV9PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpZERlbHRhQ29hcnNlX01heFZhbCwgZXJyb3IpOwotICAgIGJyZWFrOwotICAgIGNhc2UgUFNfSUlEX1JFU19GSU5FOgotICAgICAgY29kZVRhYmxlICAgPSBpaWREZWx0YUZyZXFGaW5lX0NvZGU7Ci0gICAgICBsZW5ndGhUYWJsZSA9IGlpZERlbHRhRnJlcUZpbmVfTGVuZ3RoOwotICAgICAgYml0Q250ICs9IGVuY29kZURlbHRhRnJlcShoQml0QnVmLCBpaWRWYWwsIG5CYW5kcywgY29kZVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaWlkRGVsdGFGaW5lX09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkRGVsdGFGaW5lX01heFZhbCwgZXJyb3IpOwotICAgIGJyZWFrOworICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIFBTX0RFTFRBX0ZSRVE6CisgICAgICBzd2l0Y2ggKHJlcykgeworICAgICAgICBjYXNlIFBTX0lJRF9SRVNfQ09BUlNFOgorICAgICAgICAgIGNvZGVUYWJsZSA9IGlpZERlbHRhRnJlcUNvYXJzZV9Db2RlOworICAgICAgICAgIGxlbmd0aFRhYmxlID0gaWlkRGVsdGFGcmVxQ29hcnNlX0xlbmd0aDsKKyAgICAgICAgICBiaXRDbnQgKz0gZW5jb2RlRGVsdGFGcmVxKGhCaXRCdWYsIGlpZFZhbCwgbkJhbmRzLCBjb2RlVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaWlkRGVsdGFDb2Fyc2VfT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkRGVsdGFDb2Fyc2VfTWF4VmFsLCBlcnJvcik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUFNfSUlEX1JFU19GSU5FOgorICAgICAgICAgIGNvZGVUYWJsZSA9IGlpZERlbHRhRnJlcUZpbmVfQ29kZTsKKyAgICAgICAgICBsZW5ndGhUYWJsZSA9IGlpZERlbHRhRnJlcUZpbmVfTGVuZ3RoOworICAgICAgICAgIGJpdENudCArPQorICAgICAgICAgICAgICBlbmNvZGVEZWx0YUZyZXEoaEJpdEJ1ZiwgaWlkVmFsLCBuQmFuZHMsIGNvZGVUYWJsZSwgbGVuZ3RoVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaWREZWx0YUZpbmVfT2Zmc2V0LCBpaWREZWx0YUZpbmVfTWF4VmFsLCBlcnJvcik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgKmVycm9yID0gMTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQU19ERUxUQV9USU1FOgorICAgICAgc3dpdGNoIChyZXMpIHsKKyAgICAgICAgY2FzZSBQU19JSURfUkVTX0NPQVJTRToKKyAgICAgICAgICBjb2RlVGFibGUgPSBpaWREZWx0YVRpbWVDb2Fyc2VfQ29kZTsKKyAgICAgICAgICBsZW5ndGhUYWJsZSA9IGlpZERlbHRhVGltZUNvYXJzZV9MZW5ndGg7CisgICAgICAgICAgYml0Q250ICs9IGVuY29kZURlbHRhVGltZSgKKyAgICAgICAgICAgICAgaEJpdEJ1ZiwgaWlkVmFsLCBpaWRWYWxMYXN0LCBuQmFuZHMsIGNvZGVUYWJsZSwgbGVuZ3RoVGFibGUsCisgICAgICAgICAgICAgIGlpZERlbHRhQ29hcnNlX09mZnNldCwgaWlkRGVsdGFDb2Fyc2VfTWF4VmFsLCBlcnJvcik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUFNfSUlEX1JFU19GSU5FOgorICAgICAgICAgIGNvZGVUYWJsZSA9IGlpZERlbHRhVGltZUZpbmVfQ29kZTsKKyAgICAgICAgICBsZW5ndGhUYWJsZSA9IGlpZERlbHRhVGltZUZpbmVfTGVuZ3RoOworICAgICAgICAgIGJpdENudCArPSBlbmNvZGVEZWx0YVRpbWUoaEJpdEJ1ZiwgaWlkVmFsLCBpaWRWYWxMYXN0LCBuQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlVGFibGUsIGxlbmd0aFRhYmxlLCBpaWREZWx0YUZpbmVfT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkRGVsdGFGaW5lX01heFZhbCwgZXJyb3IpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICplcnJvciA9IDE7CisgICAgICB9CisgICAgICBicmVhazsKKwogICAgIGRlZmF1bHQ6CiAgICAgICAqZXJyb3IgPSAxOwotICAgIH0KLSAgICBicmVhazsKKyAgfQogCi0gIGNhc2UgUFNfREVMVEFfVElNRToKLSAgICBzd2l0Y2gocmVzKSB7Ci0gICAgY2FzZSBQU19JSURfUkVTX0NPQVJTRToKLSAgICAgIGNvZGVUYWJsZSAgID0gaWlkRGVsdGFUaW1lQ29hcnNlX0NvZGU7Ci0gICAgICBsZW5ndGhUYWJsZSA9IGlpZERlbHRhVGltZUNvYXJzZV9MZW5ndGg7Ci0gICAgICBiaXRDbnQgKz0gZW5jb2RlRGVsdGFUaW1lKGhCaXRCdWYsIGlpZFZhbCwgaWlkVmFsTGFzdCwgbkJhbmRzLCBjb2RlVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFRhYmxlLCBpaWREZWx0YUNvYXJzZV9PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpZERlbHRhQ29hcnNlX01heFZhbCwgZXJyb3IpOwotICAgIGJyZWFrOwotICAgIGNhc2UgUFNfSUlEX1JFU19GSU5FOgotICAgICAgY29kZVRhYmxlICAgPSBpaWREZWx0YVRpbWVGaW5lX0NvZGU7Ci0gICAgICBsZW5ndGhUYWJsZSA9IGlpZERlbHRhVGltZUZpbmVfTGVuZ3RoOwotICAgICAgYml0Q250ICs9IGVuY29kZURlbHRhVGltZShoQml0QnVmLCBpaWRWYWwsIGlpZFZhbExhc3QsIG5CYW5kcywgY29kZVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaWlkRGVsdGFGaW5lX09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkRGVsdGFGaW5lX01heFZhbCwgZXJyb3IpOwotICAgIGJyZWFrOworICByZXR1cm4gYml0Q250OworfQorCitJTlQgRkRLc2JyRW5jX0VuY29kZUljYyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLCBjb25zdCBJTlQgKmljY1ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqaWNjVmFsTGFzdCwgY29uc3QgSU5UIG5CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTX0RFTFRBIG1vZGUsIElOVCAqZXJyb3IpIHsKKyAgY29uc3QgVUlOVCAqY29kZVRhYmxlOworICBjb25zdCBVSU5UICpsZW5ndGhUYWJsZTsKKyAgSU5UIGJpdENudCA9IDA7CisKKyAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBQU19ERUxUQV9GUkVROgorICAgICAgY29kZVRhYmxlID0gaWNjRGVsdGFGcmVxX0NvZGU7CisgICAgICBsZW5ndGhUYWJsZSA9IGljY0RlbHRhRnJlcV9MZW5ndGg7CisgICAgICBiaXRDbnQgKz0gZW5jb2RlRGVsdGFGcmVxKGhCaXRCdWYsIGljY1ZhbCwgbkJhbmRzLCBjb2RlVGFibGUsIGxlbmd0aFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2NEZWx0YV9PZmZzZXQsIGljY0RlbHRhX01heFZhbCwgZXJyb3IpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBTX0RFTFRBX1RJTUU6CisgICAgICBjb2RlVGFibGUgPSBpY2NEZWx0YVRpbWVfQ29kZTsKKyAgICAgIGxlbmd0aFRhYmxlID0gaWNjRGVsdGFUaW1lX0xlbmd0aDsKKworICAgICAgYml0Q250ICs9CisgICAgICAgICAgZW5jb2RlRGVsdGFUaW1lKGhCaXRCdWYsIGljY1ZhbCwgaWNjVmFsTGFzdCwgbkJhbmRzLCBjb2RlVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFRhYmxlLCBpY2NEZWx0YV9PZmZzZXQsIGljY0RlbHRhX01heFZhbCwgZXJyb3IpOworICAgICAgYnJlYWs7CisKICAgICBkZWZhdWx0OgogICAgICAgKmVycm9yID0gMTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICAqZXJyb3IgPSAxOwogICB9CiAKICAgcmV0dXJuIGJpdENudDsKIH0KIAotCi1JTlQgRkRLc2JyRW5jX0VuY29kZUljYyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLAotICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqaWNjVmFsLAotICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqaWNjVmFsTGFzdCwKLSAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5CYW5kcywKLSAgICAgICAgICAgICAgY29uc3QgUFNfREVMVEEgIG1vZGUsCi0gICAgICAgICAgICAgIElOVCAgICAgICAgICAgICplcnJvcikKLXsKK0lOVCBGREtzYnJFbmNfRW5jb2RlSXBkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsIGNvbnN0IElOVCAqaXBkVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICppcGRWYWxMYXN0LCBjb25zdCBJTlQgbkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNfREVMVEEgbW9kZSwgSU5UICplcnJvcikgewogICBjb25zdCBVSU5UICpjb2RlVGFibGU7CiAgIGNvbnN0IFVJTlQgKmxlbmd0aFRhYmxlOwogICBJTlQgYml0Q250ID0gMDsKIAotICBzd2l0Y2gobW9kZSkgewotICBjYXNlIFBTX0RFTFRBX0ZSRVE6Ci0gICAgY29kZVRhYmxlICAgPSBpY2NEZWx0YUZyZXFfQ29kZTsKLSAgICBsZW5ndGhUYWJsZSA9IGljY0RlbHRhRnJlcV9MZW5ndGg7Ci0gICAgYml0Q250ICs9IGVuY29kZURlbHRhRnJlcShoQml0QnVmLCBpY2NWYWwsIG5CYW5kcywgY29kZVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoVGFibGUsIGljY0RlbHRhX09mZnNldCwgaWNjRGVsdGFfTWF4VmFsLCBlcnJvcik7Ci0gICAgYnJlYWs7CisgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgUFNfREVMVEFfRlJFUToKKyAgICAgIGNvZGVUYWJsZSA9IGlwZERlbHRhRnJlcV9Db2RlOworICAgICAgbGVuZ3RoVGFibGUgPSBpcGREZWx0YUZyZXFfTGVuZ3RoOworICAgICAgYml0Q250ICs9IGVuY29kZURlbHRhRnJlcShoQml0QnVmLCBpcGRWYWwsIG5CYW5kcywgY29kZVRhYmxlLCBsZW5ndGhUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBkRGVsdGFfT2Zmc2V0LCBpcGREZWx0YV9NYXhWYWwsIGVycm9yKTsKKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgUFNfREVMVEFfVElNRToKLSAgICBjb2RlVGFibGUgICA9IGljY0RlbHRhVGltZV9Db2RlOwotICAgIGxlbmd0aFRhYmxlID0gaWNjRGVsdGFUaW1lX0xlbmd0aDsKKyAgICBjYXNlIFBTX0RFTFRBX1RJTUU6CisgICAgICBjb2RlVGFibGUgPSBpcGREZWx0YVRpbWVfQ29kZTsKKyAgICAgIGxlbmd0aFRhYmxlID0gaXBkRGVsdGFUaW1lX0xlbmd0aDsKIAotICAgIGJpdENudCArPSBlbmNvZGVEZWx0YVRpbWUoaEJpdEJ1ZiwgaWNjVmFsLCBpY2NWYWxMYXN0LCBuQmFuZHMsIGNvZGVUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFRhYmxlLCBpY2NEZWx0YV9PZmZzZXQsIGljY0RlbHRhX01heFZhbCwgZXJyb3IpOwotICAgIGJyZWFrOworICAgICAgYml0Q250ICs9CisgICAgICAgICAgZW5jb2RlRGVsdGFUaW1lKGhCaXRCdWYsIGlwZFZhbCwgaXBkVmFsTGFzdCwgbkJhbmRzLCBjb2RlVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFRhYmxlLCBpcGREZWx0YV9PZmZzZXQsIGlwZERlbHRhX01heFZhbCwgZXJyb3IpOworICAgICAgYnJlYWs7CiAKLSAgZGVmYXVsdDoKLSAgICAqZXJyb3IgPSAxOworICAgIGRlZmF1bHQ6CisgICAgICAqZXJyb3IgPSAxOwogICB9CiAKICAgcmV0dXJuIGJpdENudDsKIH0KIAotSU5UIEZES3NickVuY19FbmNvZGVJcGQoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgKmlwZFZhbCwKLSAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgKmlwZFZhbExhc3QsCi0gICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBuQmFuZHMsCi0gICAgICAgICAgICAgIGNvbnN0IFBTX0RFTFRBICBtb2RlLAotICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAqZXJyb3IpCi17CitJTlQgRkRLc2JyRW5jX0VuY29kZU9wZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLCBjb25zdCBJTlQgKm9wZFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAqb3BkVmFsTGFzdCwgY29uc3QgSU5UIG5CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTX0RFTFRBIG1vZGUsIElOVCAqZXJyb3IpIHsKICAgY29uc3QgVUlOVCAqY29kZVRhYmxlOwogICBjb25zdCBVSU5UICpsZW5ndGhUYWJsZTsKICAgSU5UIGJpdENudCA9IDA7CiAKLSAgc3dpdGNoKG1vZGUpIHsKLSAgY2FzZSBQU19ERUxUQV9GUkVROgotICAgIGNvZGVUYWJsZSAgID0gaXBkRGVsdGFGcmVxX0NvZGU7Ci0gICAgbGVuZ3RoVGFibGUgPSBpcGREZWx0YUZyZXFfTGVuZ3RoOwotICAgIGJpdENudCArPSBlbmNvZGVEZWx0YUZyZXEoaEJpdEJ1ZiwgaXBkVmFsLCBuQmFuZHMsIGNvZGVUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFRhYmxlLCBpcGREZWx0YV9PZmZzZXQsIGlwZERlbHRhX01heFZhbCwgZXJyb3IpOwotICAgIGJyZWFrOworICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIFBTX0RFTFRBX0ZSRVE6CisgICAgICBjb2RlVGFibGUgPSBvcGREZWx0YUZyZXFfQ29kZTsKKyAgICAgIGxlbmd0aFRhYmxlID0gb3BkRGVsdGFGcmVxX0xlbmd0aDsKKyAgICAgIGJpdENudCArPSBlbmNvZGVEZWx0YUZyZXEoaEJpdEJ1Ziwgb3BkVmFsLCBuQmFuZHMsIGNvZGVUYWJsZSwgbGVuZ3RoVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZERlbHRhX09mZnNldCwgb3BkRGVsdGFfTWF4VmFsLCBlcnJvcik7CisgICAgICBicmVhazsKIAotICBjYXNlIFBTX0RFTFRBX1RJTUU6Ci0gICAgY29kZVRhYmxlICAgPSBpcGREZWx0YVRpbWVfQ29kZTsKLSAgICBsZW5ndGhUYWJsZSA9IGlwZERlbHRhVGltZV9MZW5ndGg7CisgICAgY2FzZSBQU19ERUxUQV9USU1FOgorICAgICAgY29kZVRhYmxlID0gb3BkRGVsdGFUaW1lX0NvZGU7CisgICAgICBsZW5ndGhUYWJsZSA9IG9wZERlbHRhVGltZV9MZW5ndGg7CiAKLSAgICBiaXRDbnQgKz0gZW5jb2RlRGVsdGFUaW1lKGhCaXRCdWYsIGlwZFZhbCwgaXBkVmFsTGFzdCwgbkJhbmRzLCBjb2RlVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaXBkRGVsdGFfT2Zmc2V0LCBpcGREZWx0YV9NYXhWYWwsIGVycm9yKTsKLSAgICBicmVhazsKKyAgICAgIGJpdENudCArPQorICAgICAgICAgIGVuY29kZURlbHRhVGltZShoQml0QnVmLCBvcGRWYWwsIG9wZFZhbExhc3QsIG5CYW5kcywgY29kZVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgb3BkRGVsdGFfT2Zmc2V0LCBvcGREZWx0YV9NYXhWYWwsIGVycm9yKTsKKyAgICAgIGJyZWFrOwogCi0gIGRlZmF1bHQ6Ci0gICAgKmVycm9yID0gMTsKKyAgICBkZWZhdWx0OgorICAgICAgKmVycm9yID0gMTsKICAgfQogCiAgIHJldHVybiBiaXRDbnQ7CiB9CiAKLUlOVCBGREtzYnJFbmNfRW5jb2RlT3BkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsCi0gICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICpvcGRWYWwsCi0gICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICpvcGRWYWxMYXN0LAotICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbkJhbmRzLAotICAgICAgICAgICAgICBjb25zdCBQU19ERUxUQSAgbW9kZSwKLSAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKmVycm9yKQotewotICBjb25zdCBVSU5UICpjb2RlVGFibGU7Ci0gIGNvbnN0IFVJTlQgKmxlbmd0aFRhYmxlOworc3RhdGljIElOVCBlbmNvZGVJcGRPcGQoSEFORExFX1BTX09VVCBwc091dCwgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZikgewogICBJTlQgYml0Q250ID0gMDsKLQotICBzd2l0Y2gobW9kZSkgewotICBjYXNlIFBTX0RFTFRBX0ZSRVE6Ci0gICAgY29kZVRhYmxlICAgPSBvcGREZWx0YUZyZXFfQ29kZTsKLSAgICBsZW5ndGhUYWJsZSA9IG9wZERlbHRhRnJlcV9MZW5ndGg7Ci0gICAgYml0Q250ICs9IGVuY29kZURlbHRhRnJlcShoQml0QnVmLCBvcGRWYWwsIG5CYW5kcywgY29kZVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoVGFibGUsIG9wZERlbHRhX09mZnNldCwgb3BkRGVsdGFfTWF4VmFsLCBlcnJvcik7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBQU19ERUxUQV9USU1FOgotICAgIGNvZGVUYWJsZSAgID0gb3BkRGVsdGFUaW1lX0NvZGU7Ci0gICAgbGVuZ3RoVGFibGUgPSBvcGREZWx0YVRpbWVfTGVuZ3RoOwotCi0gICAgYml0Q250ICs9IGVuY29kZURlbHRhVGltZShoQml0QnVmLCBvcGRWYWwsIG9wZFZhbExhc3QsIG5CYW5kcywgY29kZVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoVGFibGUsIG9wZERlbHRhX09mZnNldCwgb3BkRGVsdGFfTWF4VmFsLCBlcnJvcik7Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICAqZXJyb3IgPSAxOwotICB9Ci0KLSAgcmV0dXJuIGJpdENudDsKLX0KLQotc3RhdGljIElOVCBlbmNvZGVJcGRPcGQoSEFORExFX1BTX09VVCAgICAgICAgcHNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmICkKLXsKLSAgSU5UIGJpdENudCA9IDA7Ci0gIElOVCBlcnJvciAgPSAwOworICBJTlQgZXJyb3IgPSAwOwogICBJTlQgZW52OwogCiAgIEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgcHNPdXQtPmVuYWJsZUlwZE9wZCwgMSk7CiAKLSAgaWYocHNPdXQtPmVuYWJsZUlwZE9wZD09MSkgeworICBpZiAocHNPdXQtPmVuYWJsZUlwZE9wZCA9PSAxKSB7CiAgICAgSU5UICppcGRMYXN0ID0gcHNPdXQtPmlwZExhc3Q7CiAgICAgSU5UICpvcGRMYXN0ID0gcHNPdXQtPm9wZExhc3Q7CiAKLSAgICBmb3IoZW52PTA7IGVudjxwc091dC0+bkVudmVsb3BlczsgZW52KyspIHsKLSAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+ZGVsdGFJUERbZW52XSwgMSk7Ci0gICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX0VuY29kZUlwZCggaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzT3V0LT5pcGRbZW52XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwZExhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROb0JhbmRzKHBzT3V0LT5paWRNb2RlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzT3V0LT5kZWx0YUlQRFtlbnZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKKyAgICBmb3IgKGVudiA9IDA7IGVudiA8IHBzT3V0LT5uRW52ZWxvcGVzOyBlbnYrKykgeworICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgcHNPdXQtPmRlbHRhSVBEW2Vudl0sIDEpOworICAgICAgYml0Q250ICs9IEZES3NickVuY19FbmNvZGVJcGQoaEJpdEJ1ZiwgcHNPdXQtPmlwZFtlbnZdLCBpcGRMYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Tm9CYW5kcyhwc091dC0+aWlkTW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc091dC0+ZGVsdGFJUERbZW52XSwgJmVycm9yKTsKIAotICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoIGhCaXRCdWYsIHBzT3V0LT5kZWx0YU9QRFtlbnZdLCAxKTsKLSAgICAgIGJpdENudCArPSBGREtzYnJFbmNfRW5jb2RlT3BkKCBoQml0QnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNPdXQtPm9wZFtlbnZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BkTGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5vQmFuZHMocHNPdXQtPmlpZE1vZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNPdXQtPmRlbHRhT1BEW2Vudl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKTsKKyAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIHBzT3V0LT5kZWx0YU9QRFtlbnZdLCAxKTsKKyAgICAgIGJpdENudCArPSBGREtzYnJFbmNfRW5jb2RlT3BkKGhCaXRCdWYsIHBzT3V0LT5vcGRbZW52XSwgb3BkTGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5vQmFuZHMocHNPdXQtPmlpZE1vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNPdXQtPmRlbHRhT1BEW2Vudl0sICZlcnJvcik7CiAgICAgfQogICAgIC8qIHJlc2VydmVkIGJpdCAqLwotICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCAwLCAxKTsKKyAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCAwLCAxKTsKICAgfQogCi0KICAgcmV0dXJuIGJpdENudDsKIH0KIAotc3RhdGljIElOVCBnZXRFbnZJZHgoY29uc3QgSU5UIG5FbnZlbG9wZXMsIGNvbnN0IElOVCBmcmFtZUNsYXNzKQoteworc3RhdGljIElOVCBnZXRFbnZJZHgoY29uc3QgSU5UIG5FbnZlbG9wZXMsIGNvbnN0IElOVCBmcmFtZUNsYXNzKSB7CiAgIElOVCBlbnZJZHggPSAwOwogCi0gIHN3aXRjaChuRW52ZWxvcGVzKSB7Ci0gIGNhc2UgMDoKLSAgICBlbnZJZHggPSAwOwotICAgIGJyZWFrOwotCi0gIGNhc2UgMToKLSAgICBpZiAoZnJhbWVDbGFzcz09MCkKLSAgICAgIGVudklkeCA9IDE7Ci0gICAgZWxzZQorICBzd2l0Y2ggKG5FbnZlbG9wZXMpIHsKKyAgICBjYXNlIDA6CiAgICAgICBlbnZJZHggPSAwOwotICAgIGJyZWFrOworICAgICAgYnJlYWs7CiAKLSAgY2FzZSAyOgotICAgIGlmIChmcmFtZUNsYXNzPT0wKQorICAgIGNhc2UgMToKKyAgICAgIGlmIChmcmFtZUNsYXNzID09IDApCisgICAgICAgIGVudklkeCA9IDE7CisgICAgICBlbHNlCisgICAgICAgIGVudklkeCA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMjoKKyAgICAgIGlmIChmcmFtZUNsYXNzID09IDApCisgICAgICAgIGVudklkeCA9IDI7CisgICAgICBlbHNlCisgICAgICAgIGVudklkeCA9IDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMzoKICAgICAgIGVudklkeCA9IDI7Ci0gICAgZWxzZQotICAgICAgZW52SWR4ID0gMTsKLSAgICBicmVhazsKKyAgICAgIGJyZWFrOwogCi0gIGNhc2UgMzoKLSAgICBlbnZJZHggPSAyOwotICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIGVudklkeCA9IDM7CisgICAgICBicmVhazsKIAotICBjYXNlIDQ6Ci0gICAgZW52SWR4ID0gMzsKLSAgICBicmVhazsKLQotICBkZWZhdWx0OgotICAgIC8qIHVuc3VwcG9ydGVkIG51bWJlciBvZiBlbnZlbG9wZXMgKi8KLSAgICBlbnZJZHggPSAwOworICAgIGRlZmF1bHQ6CisgICAgICAvKiB1bnN1cHBvcnRlZCBudW1iZXIgb2YgZW52ZWxvcGVzICovCisgICAgICBlbnZJZHggPSAwOwogICB9CiAKICAgcmV0dXJuIGVudklkeDsKIH0KIAotCi1zdGF0aWMgSU5UIGVuY29kZVBTRXh0ZW5zaW9uKGNvbnN0IEhBTkRMRV9QU19PVVQgICBwc091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCaXRCdWYgKQoteworc3RhdGljIElOVCBlbmNvZGVQU0V4dGVuc2lvbihjb25zdCBIQU5ETEVfUFNfT1VUIHBzT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmKSB7CiAgIElOVCBiaXRDbnQgPSAwOwogCi0gIGlmKHBzT3V0LT5lbmFibGVJcGRPcGQ9PTEpIHsKKyAgaWYgKHBzT3V0LT5lbmFibGVJcGRPcGQgPT0gMSkgewogICAgIElOVCBpcGRPcGRCaXRzID0gMDsKLSAgICBJTlQgZXh0U2l6ZSA9ICgyICsgZW5jb2RlSXBkT3BkKHBzT3V0LE5VTEwpKzcpPj4zOworICAgIElOVCBleHRTaXplID0gKDIgKyBlbmNvZGVJcGRPcGQocHNPdXQsIE5VTEwpICsgNykgPj4gMzsKIAotICAgIGlmKGV4dFNpemU8MTUpIHsKLSAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsICBleHRTaXplLCA0KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCAgICAgICAgICAxNSAsIDQpOwotICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgKGV4dFNpemUtMTUpLCA4KTsKKyAgICBpZiAoZXh0U2l6ZSA8IDE1KSB7CisgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCBleHRTaXplLCA0KTsKKyAgICB9IGVsc2UgeworICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgMTUsIDQpOworICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgKGV4dFNpemUgLSAxNSksIDgpOwogICAgIH0KIAogICAgIC8qIHdyaXRlIGlwZCBvcGQgZGF0YSAqLwogICAgIGlwZE9wZEJpdHMgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCBQU19FWFRfSURfVjAsIDIpOwotICAgIGlwZE9wZEJpdHMgKz0gZW5jb2RlSXBkT3BkKHBzT3V0LCBoQml0QnVmICk7CisgICAgaXBkT3BkQml0cyArPSBlbmNvZGVJcGRPcGQocHNPdXQsIGhCaXRCdWYpOwogCiAgICAgLyogYnl0ZSBhbGlnbiB0aGUgaXBkIG9wZCBkYXRhICAqLwotICAgIGlmKGlwZE9wZEJpdHMlOCkKLSAgICAgIGlwZE9wZEJpdHMgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCAwLCAoOC0oaXBkT3BkQml0cyU4KSkgKTsKKyAgICBpZiAoaXBkT3BkQml0cyAlIDgpCisgICAgICBpcGRPcGRCaXRzICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgMCwgKDggLSAoaXBkT3BkQml0cyAlIDgpKSk7CiAKICAgICBiaXRDbnQgKz0gaXBkT3BkQml0czsKICAgfQpAQCAtNjE3LDc3ICs1NTIsNjkgQEAKICAgcmV0dXJuIChiaXRDbnQpOwogfQogCi1JTlQgRkRLc2JyRW5jX1dyaXRlUFNCaXRzdHJlYW0oY29uc3QgSEFORExFX1BTX09VVCAgIHBzT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0QnVmICkKLXsKK0lOVCBGREtzYnJFbmNfV3JpdGVQU0JpdHN0cmVhbShjb25zdCBIQU5ETEVfUFNfT1VUIHBzT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYpIHsKICAgSU5UIHBzRXh0RW5hYmxlID0gMDsKICAgSU5UIGJpdENudCA9IDA7CiAgIElOVCBlcnJvciA9IDA7CiAgIElOVCBlbnY7CiAKLSAgaWYocHNPdXQgIT0gTlVMTCl7Ci0KKyAgaWYgKHBzT3V0ICE9IE5VTEwpIHsKICAgICAvKiBQUyBIRUFERVIgKi8KLSAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNPdXQtPmVuYWJsZVBTSGVhZGVyLCAxKTsKKyAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCBwc091dC0+ZW5hYmxlUFNIZWFkZXIsIDEpOwogCi0gICAgaWYocHNPdXQtPmVuYWJsZVBTSGVhZGVyKSB7Ci0KLSAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+ZW5hYmxlSUlELCAxKTsKLSAgICAgIGlmKHBzT3V0LT5lbmFibGVJSUQpIHsKLSAgICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoIGhCaXRCdWYsIHBzT3V0LT5paWRNb2RlLCAzKTsKKyAgICBpZiAocHNPdXQtPmVuYWJsZVBTSGVhZGVyKSB7CisgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCBwc091dC0+ZW5hYmxlSUlELCAxKTsKKyAgICAgIGlmIChwc091dC0+ZW5hYmxlSUlEKSB7CisgICAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIHBzT3V0LT5paWRNb2RlLCAzKTsKICAgICAgIH0KLSAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+ZW5hYmxlSUNDLCAxKTsKLSAgICAgIGlmKHBzT3V0LT5lbmFibGVJQ0MpIHsKLSAgICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoIGhCaXRCdWYsIHBzT3V0LT5pY2NNb2RlLCAzKTsKKyAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIHBzT3V0LT5lbmFibGVJQ0MsIDEpOworICAgICAgaWYgKHBzT3V0LT5lbmFibGVJQ0MpIHsKKyAgICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgcHNPdXQtPmljY01vZGUsIDMpOwogICAgICAgfQotICAgICAgaWYocHNPdXQtPmVuYWJsZUlwZE9wZCkgeworICAgICAgaWYgKHBzT3V0LT5lbmFibGVJcGRPcGQpIHsKICAgICAgICAgcHNFeHRFbmFibGUgPSAxOwogICAgICAgfQotICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoIGhCaXRCdWYsIHBzRXh0RW5hYmxlLCAxKTsKKyAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIHBzRXh0RW5hYmxlLCAxKTsKICAgICB9CiAKICAgICAvKiBGcmFtZSBjbGFzcywgbnVtYmVyIG9mIGVudmVsb3BlcyAqLwotICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+ZnJhbWVDbGFzcywgMSk7Ci0gICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoIGhCaXRCdWYsIGdldEVudklkeChwc091dC0+bkVudmVsb3BlcywgcHNPdXQtPmZyYW1lQ2xhc3MpLCAyKTsKKyAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCBwc091dC0+ZnJhbWVDbGFzcywgMSk7CisgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoCisgICAgICAgIGhCaXRCdWYsIGdldEVudklkeChwc091dC0+bkVudmVsb3BlcywgcHNPdXQtPmZyYW1lQ2xhc3MpLCAyKTsKIAotICAgIGlmKHBzT3V0LT5mcmFtZUNsYXNzPT0xKSB7Ci0gICAgICBmb3IoZW52PTA7IGVudjxwc091dC0+bkVudmVsb3BlczsgZW52KyspIHsKLSAgICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoIGhCaXRCdWYsIHBzT3V0LT5mcmFtZUJvcmRlcltlbnZdLCA1KTsKKyAgICBpZiAocHNPdXQtPmZyYW1lQ2xhc3MgPT0gMSkgeworICAgICAgZm9yIChlbnYgPSAwOyBlbnYgPCBwc091dC0+bkVudmVsb3BlczsgZW52KyspIHsKKyAgICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgcHNPdXQtPmZyYW1lQm9yZGVyW2Vudl0sIDUpOwogICAgICAgfQogICAgIH0KIAotICAgIGlmKHBzT3V0LT5lbmFibGVJSUQ9PTEpIHsKKyAgICBpZiAocHNPdXQtPmVuYWJsZUlJRCA9PSAxKSB7CiAgICAgICBJTlQgKmlpZExhc3QgPSBwc091dC0+aWlkTGFzdDsKLSAgICAgIGZvcihlbnY9MDsgZW52PHBzT3V0LT5uRW52ZWxvcGVzOyBlbnYrKykgewotICAgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNPdXQtPmRlbHRhSUlEW2Vudl0sIDEpOwotICAgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX0VuY29kZUlpZCggaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNPdXQtPmlpZFtlbnZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaWRMYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROb0JhbmRzKHBzT3V0LT5paWRNb2RlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBTX0lJRF9SRVNPTFVUSU9OKWdldElJRFJlcyhwc091dC0+aWlkTW9kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzT3V0LT5kZWx0YUlJRFtlbnZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKTsKKyAgICAgIGZvciAoZW52ID0gMDsgZW52IDwgcHNPdXQtPm5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIHBzT3V0LT5kZWx0YUlJRFtlbnZdLCAxKTsKKyAgICAgICAgYml0Q250ICs9IEZES3NickVuY19FbmNvZGVJaWQoCisgICAgICAgICAgICBoQml0QnVmLCBwc091dC0+aWlkW2Vudl0sIGlpZExhc3QsIGdldE5vQmFuZHMocHNPdXQtPmlpZE1vZGUpLAorICAgICAgICAgICAgKFBTX0lJRF9SRVNPTFVUSU9OKWdldElJRFJlcyhwc091dC0+aWlkTW9kZSksIHBzT3V0LT5kZWx0YUlJRFtlbnZdLAorICAgICAgICAgICAgJmVycm9yKTsKIAogICAgICAgICBpaWRMYXN0ID0gcHNPdXQtPmlpZFtlbnZdOwogICAgICAgfQogICAgIH0KIAotICAgIGlmKHBzT3V0LT5lbmFibGVJQ0M9PTEpIHsKKyAgICBpZiAocHNPdXQtPmVuYWJsZUlDQyA9PSAxKSB7CiAgICAgICBJTlQgKmljY0xhc3QgPSBwc091dC0+aWNjTGFzdDsKLSAgICAgIGZvcihlbnY9MDsgZW52PHBzT3V0LT5uRW52ZWxvcGVzOyBlbnYrKykgewotICAgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNPdXQtPmRlbHRhSUNDW2Vudl0sIDEpOwotICAgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX0VuY29kZUljYyggaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNPdXQtPmljY1tlbnZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY2NMYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROb0JhbmRzKHBzT3V0LT5pY2NNb2RlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNPdXQtPmRlbHRhSUNDW2Vudl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CisgICAgICBmb3IgKGVudiA9IDA7IGVudiA8IHBzT3V0LT5uRW52ZWxvcGVzOyBlbnYrKykgeworICAgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCBwc091dC0+ZGVsdGFJQ0NbZW52XSwgMSk7CisgICAgICAgIGJpdENudCArPSBGREtzYnJFbmNfRW5jb2RlSWNjKGhCaXRCdWYsIHBzT3V0LT5pY2NbZW52XSwgaWNjTGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Tm9CYW5kcyhwc091dC0+aWNjTW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzT3V0LT5kZWx0YUlDQ1tlbnZdLCAmZXJyb3IpOwogCiAgICAgICAgIGljY0xhc3QgPSBwc091dC0+aWNjW2Vudl07CiAgICAgICB9CiAgICAgfQogCi0gICAgaWYocHNFeHRFbmFibGUhPTApIHsKKyAgICBpZiAocHNFeHRFbmFibGUgIT0gMCkgewogICAgICAgYml0Q250ICs9IGVuY29kZVBTRXh0ZW5zaW9uKHBzT3V0LCBoQml0QnVmKTsKICAgICB9CiAKQEAgLTY5NSw0ICs2MjIsMyBAQAogCiAgIHJldHVybiBiaXRDbnQ7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvcHNfYml0ZW5jLmggYi9saWJTQlJlbmMvc3JjL3BzX2JpdGVuYy5oCmluZGV4IGU5OGZlNTguLjFkMzgzZTMgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvcHNfYml0ZW5jLmgKKysrIGIvbGliU0JSZW5jL3NyYy9wc19iaXRlbmMuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNCArOTAsMTUgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUcgQXVkaW8gRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIGF1dGhvcjogICAgICAgTi4gUmV0dGVsYmFjaAotICAgY29udGVudHMvZGVzY3JpcHRpb246IFBhcmFtZXRyaWMgU3RlcmVvIGJpdHN0cmVhbSBlbmNvZGVyCisgICBBdXRob3Iocyk6ICAgTi4gUmV0dGVsYmFjaAogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogUGFyYW1ldHJpYyBTdGVyZW8gYml0c3RyZWFtIGVuY29kZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInBzX21haW4uaCIKICNpbmNsdWRlICJwc19jb25zdC5oIgpAQCAtOTYsODIgKzEwOCw2NiBAQAogI2RlZmluZSBQU19CSVRFTkNfSAogCiB0eXBlZGVmIHN0cnVjdCBUX1BTX09VVCB7CisgIElOVCBlbmFibGVQU0hlYWRlcjsKKyAgSU5UIGVuYWJsZUlJRDsKKyAgSU5UIGlpZE1vZGU7CisgIElOVCBlbmFibGVJQ0M7CisgIElOVCBpY2NNb2RlOworICBJTlQgZW5hYmxlSXBkT3BkOwogCi0gIElOVCAgICAgICAgIGVuYWJsZVBTSGVhZGVyOwotICBJTlQgICAgICAgICBlbmFibGVJSUQ7Ci0gIElOVCAgICAgICAgIGlpZE1vZGU7Ci0gIElOVCAgICAgICAgIGVuYWJsZUlDQzsKLSAgSU5UICAgICAgICAgaWNjTW9kZTsKLSAgSU5UICAgICAgICAgZW5hYmxlSXBkT3BkOwotCi0gIElOVCAgICAgICAgIGZyYW1lQ2xhc3M7Ci0gIElOVCAgICAgICAgIG5FbnZlbG9wZXM7CisgIElOVCBmcmFtZUNsYXNzOworICBJTlQgbkVudmVsb3BlczsKICAgLyogRU5WIGRhdGEgKi8KLSAgSU5UICAgICAgICAgZnJhbWVCb3JkZXJbUFNfTUFYX0VOVkVMT1BFU107CisgIElOVCBmcmFtZUJvcmRlcltQU19NQVhfRU5WRUxPUEVTXTsKIAogICAvKiBpaWQgZGF0YSAgKi8KLSAgUFNfREVMVEEgICAgZGVsdGFJSURbUFNfTUFYX0VOVkVMT1BFU107Ci0gIElOVCAgICAgICAgIGlpZFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOwotICBJTlQgICAgICAgICBpaWRMYXN0W1BTX01BWF9CQU5EU107CisgIFBTX0RFTFRBIGRlbHRhSUlEW1BTX01BWF9FTlZFTE9QRVNdOworICBJTlQgaWlkW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU107CisgIElOVCBpaWRMYXN0W1BTX01BWF9CQU5EU107CiAKICAgLyogaWNjIGRhdGEgICovCi0gIFBTX0RFTFRBICAgIGRlbHRhSUNDW1BTX01BWF9FTlZFTE9QRVNdOwotICBJTlQgICAgICAgICBpY2NbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXTsKLSAgSU5UICAgICAgICAgaWNjTGFzdFtQU19NQVhfQkFORFNdOworICBQU19ERUxUQSBkZWx0YUlDQ1tQU19NQVhfRU5WRUxPUEVTXTsKKyAgSU5UIGljY1tQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOworICBJTlQgaWNjTGFzdFtQU19NQVhfQkFORFNdOwogCiAgIC8qIGlwZCBkYXRhICAqLwotICBQU19ERUxUQSAgICBkZWx0YUlQRFtQU19NQVhfRU5WRUxPUEVTXTsKLSAgSU5UICAgICAgICAgaXBkW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU107Ci0gIElOVCAgICAgICAgIGlwZExhc3RbUFNfTUFYX0JBTkRTXTsKKyAgUFNfREVMVEEgZGVsdGFJUERbUFNfTUFYX0VOVkVMT1BFU107CisgIElOVCBpcGRbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXTsKKyAgSU5UIGlwZExhc3RbUFNfTUFYX0JBTkRTXTsKIAogICAvKiBvcGQgZGF0YSAgKi8KLSAgUFNfREVMVEEgICAgZGVsdGFPUERbUFNfTUFYX0VOVkVMT1BFU107Ci0gIElOVCAgICAgICAgIG9wZFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOwotICBJTlQgICAgICAgICBvcGRMYXN0W1BTX01BWF9CQU5EU107CisgIFBTX0RFTFRBIGRlbHRhT1BEW1BTX01BWF9FTlZFTE9QRVNdOworICBJTlQgb3BkW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU107CisgIElOVCBvcGRMYXN0W1BTX01BWF9CQU5EU107CiAKIH0gUFNfT1VULCAqSEFORExFX1BTX09VVDsKIAotCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCiAKLUlOVCBGREtzYnJFbmNfRW5jb2RlSWlkKEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0QnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgKmlpZFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICppaWRWYWxMYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5CYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTX0lJRF9SRVNPTFVUSU9OIHJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTX0RFTFRBICBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKmVycm9yKTsKK0lOVCBGREtzYnJFbmNfRW5jb2RlSWlkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsIGNvbnN0IElOVCAqaWlkVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICppaWRWYWxMYXN0LCBjb25zdCBJTlQgbkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNfSUlEX1JFU09MVVRJT04gcmVzLCBjb25zdCBQU19ERUxUQSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UICplcnJvcik7CiAKLUlOVCBGREtzYnJFbmNfRW5jb2RlSWNjKEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0QnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgKmljY1ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICppY2NWYWxMYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5CYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTX0RFTFRBICBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKmVycm9yKTsKK0lOVCBGREtzYnJFbmNfRW5jb2RlSWNjKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsIGNvbnN0IElOVCAqaWNjVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICppY2NWYWxMYXN0LCBjb25zdCBJTlQgbkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNfREVMVEEgbW9kZSwgSU5UICplcnJvcik7CiAKLUlOVCBGREtzYnJFbmNfRW5jb2RlSXBkKEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0QnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgKmlwZFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICppcGRWYWxMYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5CYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTX0RFTFRBICBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKmVycm9yKTsKK0lOVCBGREtzYnJFbmNfRW5jb2RlSXBkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsIGNvbnN0IElOVCAqaXBkVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICppcGRWYWxMYXN0LCBjb25zdCBJTlQgbkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNfREVMVEEgbW9kZSwgSU5UICplcnJvcik7CiAKLUlOVCBGREtzYnJFbmNfRW5jb2RlT3BkKEhBTkRMRV9GREtfQklUU1RSRUFNICBoQml0QnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgKm9wZFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICpvcGRWYWxMYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5CYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTX0RFTFRBICBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKmVycm9yKTsKK0lOVCBGREtzYnJFbmNfRW5jb2RlT3BkKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsIGNvbnN0IElOVCAqb3BkVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICpvcGRWYWxMYXN0LCBjb25zdCBJTlQgbkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNfREVMVEEgbW9kZSwgSU5UICplcnJvcik7CiAKLUlOVCBGREtzYnJFbmNfV3JpdGVQU0JpdHN0cmVhbShjb25zdCBIQU5ETEVfUFNfT1VUICAgcHNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCaXRCdWYpOwotCitJTlQgRkRLc2JyRW5jX1dyaXRlUFNCaXRzdHJlYW0oY29uc3QgSEFORExFX1BTX09VVCBwc091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KIAotCi0jZW5kaWYgIC8qICNpZm5kZWYgUFNfQklURU5DX0ggKi8KKyNlbmRpZiAvKiBkZWZpbmVkKFBTRU5DX0VOQUJMRSkgKi8KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvcHNfY29uc3QuaCBiL2xpYlNCUmVuYy9zcmMvcHNfY29uc3QuaAppbmRleCA2MzNkMjEwLi5iOWEzM2Y5IDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL3BzX2NvbnN0LmgKKysrIGIvbGliU0JSZW5jL3NyYy9wc19jb25zdC5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDU2ICs5MCw0NiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRyBBdWRpbyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBOLiBSZXR0ZWxiYWNoCi0gICBjb250ZW50cy9kZXNjcmlwdGlvbjogUGFyYW1ldHJpYyBTdGVyZW8gY29uc3RhbnRzCisgICBBdXRob3Iocyk6ICAgTi4gUmV0dGVsYmFjaAogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogUGFyYW1ldHJpYyBTdGVyZW8gY29uc3RhbnRzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgUFNfQ09OU1RfSAogI2RlZmluZSBQU19DT05TVF9ICiAKLSNkZWZpbmUgTUFYX1BTX0NIQU5ORUxTICAgICAgICAgICggIDIgKQotI2RlZmluZSBIWUJSSURfTUFYX1FNRl9CQU5EUyAgICAgKCAgMyApCi0jZGVmaW5lIEhZQlJJRF9GSUxURVJfTEVOR1RIICAgICAoIDEzICkKLSNkZWZpbmUgSFlCUklEX0ZJTFRFUl9ERUxBWSAgICAgICggKEhZQlJJRF9GSUxURVJfTEVOR1RILTEpLzIgKQorI2RlZmluZSBNQVhfUFNfQ0hBTk5FTFMgKDIpCisjZGVmaW5lIEhZQlJJRF9NQVhfUU1GX0JBTkRTICgzKQorI2RlZmluZSBIWUJSSURfRklMVEVSX0xFTkdUSCAoMTMpCisjZGVmaW5lIEhZQlJJRF9GSUxURVJfREVMQVkgKChIWUJSSURfRklMVEVSX0xFTkdUSCAtIDEpIC8gMikKIAotI2RlZmluZSAgSFlCUklEX0ZSQU1FU0laRSAgICAgICAgKCBRTUZfTUFYX1RJTUVfU0xPVFMgKQotI2RlZmluZSAgSFlCUklEX1JFQURfT0ZGU0VUICAgICAgKCAxMCApCisjZGVmaW5lIEhZQlJJRF9GUkFNRVNJWkUgKDMyKQorI2RlZmluZSBIWUJSSURfUkVBRF9PRkZTRVQgKDEwKQogCi0jZGVmaW5lIE1BWF9IWUJSSURfQkFORFMgICAgICAgICAoIChRTUZfQ0hBTk5FTFMtSFlCUklEX01BWF9RTUZfQkFORFMrMTApICkKLQorI2RlZmluZSBNQVhfSFlCUklEX0JBTkRTICgoNjQgLSBIWUJSSURfTUFYX1FNRl9CQU5EUyArIDEwKSkKIAogdHlwZWRlZiBlbnVtIHsKLSAgUFNfUkVTX0NPQVJTRSAgPSAwLAotICBQU19SRVNfTUlEICAgICA9IDEsCi0gIFBTX1JFU19GSU5FICAgID0gMgorICBQU19SRVNfQ09BUlNFID0gMCwKKyAgUFNfUkVTX01JRCA9IDEsCisgIFBTX1JFU19GSU5FID0gMgogfSBQU19SRVNPTFVUSU9OOwogCiB0eXBlZGVmIGVudW0gewotICBQU19CQU5EU19DT0FSU0UgID0gMTAsCi0gIFBTX0JBTkRTX01JRCAgICAgPSAyMCwKLSAgUFNfTUFYX0JBTkRTICAgICA9IFBTX0JBTkRTX01JRAorICBQU19CQU5EU19DT0FSU0UgPSAxMCwKKyAgUFNfQkFORFNfTUlEID0gMjAsCisgIFBTX01BWF9CQU5EUyA9IFBTX0JBTkRTX01JRAogfSBQU19CQU5EUzsKIAotdHlwZWRlZiBlbnVtIHsKLSAgUFNfSUlEX1JFU19DT0FSU0U9MCwKLSAgUFNfSUlEX1JFU19GSU5FCi19IFBTX0lJRF9SRVNPTFVUSU9OOwordHlwZWRlZiBlbnVtIHsgUFNfSUlEX1JFU19DT0FSU0UgPSAwLCBQU19JSURfUkVTX0ZJTkUgfSBQU19JSURfUkVTT0xVVElPTjsKIAotdHlwZWRlZiBlbnVtIHsKLSAgUFNfSUNDX1JPVF9BPTAsCi0gIFBTX0lDQ19ST1RfQgotfSBQU19JQ0NfUk9UQVRJT05fTU9ERTsKK3R5cGVkZWYgZW51bSB7IFBTX0lDQ19ST1RfQSA9IDAsIFBTX0lDQ19ST1RfQiB9IFBTX0lDQ19ST1RBVElPTl9NT0RFOwogCi10eXBlZGVmIGVudW0gewotICBQU19ERUxUQV9GUkVRLAotICBQU19ERUxUQV9USU1FCi19IFBTX0RFTFRBOwotCit0eXBlZGVmIGVudW0geyBQU19ERUxUQV9GUkVRLCBQU19ERUxUQV9USU1FIH0gUFNfREVMVEE7CiAKIHR5cGVkZWYgZW51bSB7CiAgIFBTX01BWF9FTlZFTE9QRVMgPSA0CkBAIC0xMzYsMTMgKzEzNywxNCBAQAogfSBQU19DT05TVFM7CiAKIHR5cGVkZWYgZW51bSB7Ci0gICAgUFNFTkNfT0sgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwLCAgIC8qITwgTm8gZXJyb3IgaGFwcGVuZWQuIEFsbCBmaW5lLiAqLwotICAgIFBTRU5DX0lOVkFMSURfSEFORExFICAgICAgICA9IDB4MDAyMCwgICAvKiE8IEhhbmRsZSBwYXNzZWQgdG8gZnVuY3Rpb24gY2FsbCB3YXMgaW52YWxpZC4gKi8KLSAgICBQU0VOQ19NRU1PUllfRVJST1IgICAgICAgICAgPSAweDAwMjEsICAgLyohPCBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuICovCi0gICAgUFNFTkNfSU5JVF9FUlJPUiAgICAgICAgICAgID0gMHgwMDQwLCAgIC8qITwgR2VuZXJhbCBpbml0aWFsaXphdGlvbiBlcnJvci4gKi8KLSAgICBQU0VOQ19FTkNPREVfRVJST1IgICAgICAgICAgPSAweDAwNjAgICAgLyohPCBUaGUgZW5jb2RpbmcgcHJvY2VzcyB3YXMgaW50ZXJydXB0ZWQgYnkgYW4gdW5leHBlY3RlZCBlcnJvci4gKi8KKyAgUFNFTkNfT0sgPSAweDAwMDAsIC8qITwgTm8gZXJyb3IgaGFwcGVuZWQuIEFsbCBmaW5lLiAqLworICBQU0VOQ19JTlZBTElEX0hBTkRMRSA9CisgICAgICAweDAwMjAsIC8qITwgSGFuZGxlIHBhc3NlZCB0byBmdW5jdGlvbiBjYWxsIHdhcyBpbnZhbGlkLiAqLworICBQU0VOQ19NRU1PUllfRVJST1IgPSAweDAwMjEsIC8qITwgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiAqLworICBQU0VOQ19JTklUX0VSUk9SID0gMHgwMDQwLCAgIC8qITwgR2VuZXJhbCBpbml0aWFsaXphdGlvbiBlcnJvci4gKi8KKyAgUFNFTkNfRU5DT0RFX0VSUk9SID0gMHgwMDYwICAvKiE8IFRoZSBlbmNvZGluZyBwcm9jZXNzIHdhcyBpbnRlcnJ1cHRlZCBieSBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWQgZXJyb3IuICovCiAKIH0gRkRLX1BTRU5DX0VSUk9SOwogCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9wc19lbmNvZGUuY3BwIGIvbGliU0JSZW5jL3NyYy9wc19lbmNvZGUuY3BwCmluZGV4IGZlYzM5ZTguLjg4ZDMxMzEgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvcHNfZW5jb2RlLmNwcAorKysgYi9saWJTQlJlbmMvc3JjL3BzX2VuY29kZS5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTIxICs5MCwxMDkgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUcgQXVkaW8gRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gICBJbml0aWFsIEF1dGhvcnM6ICAgICAgTS4gTmV1ZW5kb3JmLCBOLiBSZXR0ZWxiYWNoLCBNLiBNdWx0cnVzCi0gICBDb250ZW50cy9EZXNjcmlwdGlvbjogUFMgcGFyYW1ldGVyIGV4dHJhY3Rpb24sIGVuY29kaW5nCisgICBBdXRob3Iocyk6ICAgTS4gTmV1ZW5kb3JmLCBOLiBSZXR0ZWxiYWNoLCBNLiBNdWx0cnVzCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOiBQUyBwYXJhbWV0ZXIgZXh0cmFjdGlvbiwgZW5jb2RpbmcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgUFMgcGFyYW1ldGVyIGV4dHJhY3Rpb24sIGVuY29kaW5nIGZ1bmN0aW9ucyAgCisgIFxicmllZiAgUFMgcGFyYW1ldGVyIGV4dHJhY3Rpb24sIGVuY29kaW5nIGZ1bmN0aW9ucyAkUmV2aXNpb246IDk2NDQxICQKICovCiAKICNpbmNsdWRlICJwc19tYWluLmgiCi0KLQotI2luY2x1ZGUgInNicl9yYW0uaCIKICNpbmNsdWRlICJwc19lbmNvZGUuaCIKLQogI2luY2x1ZGUgInFtZi5oIgotCi0jaW5jbHVkZSAicHNfY29uc3QuaCIKICNpbmNsdWRlICJzYnJfbWlzYy5oIgorI2luY2x1ZGUgInNicmVuY19yYW0uaCIKIAogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAKLWlubGluZSB2b2lkIEZES3NickVuY19hZGRGSVhQX0RCTChjb25zdCBGSVhQX0RCTCAqWCwgY29uc3QgRklYUF9EQkwgKlksIEZJWFBfREJMICpaLCBJTlQgbikKLXsKLSAgZm9yIChJTlQgaT0wOyBpPG47IGkrKykKLSAgICBaW2ldID0gKFhbaV0+PjEpICsgKFlbaV0+PjEpOworaW5saW5lIHZvaWQgRkRLc2JyRW5jX2FkZEZJWFBfREJMKGNvbnN0IEZJWFBfREJMICpYLCBjb25zdCBGSVhQX0RCTCAqWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqWiwgSU5UIG4pIHsKKyAgZm9yIChJTlQgaSA9IDA7IGkgPCBuOyBpKyspIFpbaV0gPSAoWFtpXSA+PiAxKSArIChZW2ldID4+IDEpOwogfQogCi0jZGVmaW5lIExPRzEwXzJfMTAgICAgICAgICAgICAgMy4wMTAyOTk5NTY2NGYgLyogMTAuMGYqbG9nMTAoMi5mKSAqLworI2RlZmluZSBMT0cxMF8yXzEwIDMuMDEwMjk5OTU2NjRmIC8qIDEwLjBmKmxvZzEwKDIuZikgKi8KIAotc3RhdGljIGNvbnN0IElOVCBpaWRHcm91cEJvcmRlcnNMb1Jlc1tRTUZfR1JPVVBTX0xPX1JFUyArIFNVQlFNRl9HUk9VUFNfTE9fUkVTICsgMV0gPQotewotICAwLCAxLCAyLCAzLCA0LCA1LCAgICAvKiA2IHN1YnFtZiBzdWJiYW5kcyAtIDB0aCBxbWYgc3ViYmFuZCAqLwotICA2LCA3LCAgICAgICAgICAgICAgICAvKiAyIHN1YnFtZiBzdWJiYW5kcyAtIDFzdCBxbWYgc3ViYmFuZCAqLwotICA4LCA5LCAgICAgICAgICAgICAgICAvKiAyIHN1YnFtZiBzdWJiYW5kcyAtIDJuZCBxbWYgc3ViYmFuZCAqLwotICAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTgsIDIxLCAyNSwgMzAsIDQyLCA3MQotfTsKK3N0YXRpYyBjb25zdCBJTlQKKyAgICBpaWRHcm91cEJvcmRlcnNMb1Jlc1tRTUZfR1JPVVBTX0xPX1JFUyArIFNVQlFNRl9HUk9VUFNfTE9fUkVTICsgMV0gPSB7CisgICAgICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgLyogNiBzdWJxbWYgc3ViYmFuZHMgLSAwdGggcW1mIHN1YmJhbmQgKi8KKyAgICAgICAgNiwgIDcsICAgICAgICAgICAgICAgICAvKiAyIHN1YnFtZiBzdWJiYW5kcyAtIDFzdCBxbWYgc3ViYmFuZCAqLworICAgICAgICA4LCAgOSwgICAgICAgICAgICAgICAgIC8qIDIgc3VicW1mIHN1YmJhbmRzIC0gMm5kIHFtZiBzdWJiYW5kICovCisgICAgICAgIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxOCwgMjEsIDI1LCAzMCwgNDIsIDcxfTsKIAotc3RhdGljIGNvbnN0IFVDSEFSIGlpZEdyb3VwV2lkdGhMZExvUmVzW1FNRl9HUk9VUFNfTE9fUkVTICsgU1VCUU1GX0dST1VQU19MT19SRVNdID0KLXsKLSAgMCwgMCwgMCwgMCwgMCwgMCwKLSAgMCwgMCwKLSAgMCwgMCwKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMiwgMiwgMywgNCwgNQotfTsKLQorc3RhdGljIGNvbnN0IFVDSEFSCisgICAgaWlkR3JvdXBXaWR0aExkTG9SZXNbUU1GX0dST1VQU19MT19SRVMgKyBTVUJRTUZfR1JPVVBTX0xPX1JFU10gPSB7CisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDIsIDIsIDMsIDQsIDV9OwogCiBzdGF0aWMgY29uc3QgSU5UIHN1YmJhbmQycGFyYW1ldGVyMjBbUU1GX0dST1VQU19MT19SRVMgKyBTVUJRTUZfR1JPVVBTX0xPX1JFU10gPQotewotICAxLCAwLCAwLCAxLCAyLCAzLCAgIC8qIDYgc3VicW1mIHN1YmJhbmRzIC0gMHRoIHFtZiBzdWJiYW5kICovCi0gIDQsIDUsICAgICAgICAgICAgICAgLyogMiBzdWJxbWYgc3ViYmFuZHMgLSAxc3QgcW1mIHN1YmJhbmQgKi8KLSAgNiwgNywgICAgICAgICAgICAgICAvKiAyIHN1YnFtZiBzdWJiYW5kcyAtIDJuZCBxbWYgc3ViYmFuZCAqLwotICA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOQotfTsKLQorICAgIHsxLCAwLCAwLCAgMSwgIDIsICAzLCAvKiA2IHN1YnFtZiBzdWJiYW5kcyAtIDB0aCBxbWYgc3ViYmFuZCAqLworICAgICA0LCA1LCAgICAgICAgICAgICAgICAvKiAyIHN1YnFtZiBzdWJiYW5kcyAtIDFzdCBxbWYgc3ViYmFuZCAqLworICAgICA2LCA3LCAgICAgICAgICAgICAgICAvKiAyIHN1YnFtZiBzdWJiYW5kcyAtIDJuZCBxbWYgc3ViYmFuZCAqLworICAgICA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOX07CiAKIHR5cGVkZWYgZW51bSB7CiAgIE1BWF9USU1FX0RJRkZfRlJBTUVTID0gMjAsCi0gIE1BWF9QU19OT0hFQURFUl9DTlQgID0gMTAsCi0gIE1BWF9OT0VOVl9DTlQgICAgICAgID0gMTAsCisgIE1BWF9QU19OT0hFQURFUl9DTlQgPSAxMCwKKyAgTUFYX05PRU5WX0NOVCA9IDEwLAogICBET19OT1RfVVNFX1RISVNfTU9ERSA9IDB4N0ZGRkZGCiB9IF9fUFNfQ09OU1RBTlRTOwogCi0KLQogc3RhdGljIGNvbnN0IEZJWFBfREJMIGlpZFF1YW50X2Z4WzE1XSA9IHsKLSAgKEZJWFBfREJMKTB4Y2UwMDAwMDAsIChGSVhQX0RCTCkweGRjMDAwMDAwLCAoRklYUF9EQkwpMHhlNDAwMDAwMCwgKEZJWFBfREJMKTB4ZWMwMDAwMDAsIChGSVhQX0RCTCkweGYyMDAwMDAwLCAoRklYUF9EQkwpMHhmODAwMDAwMCwgKEZJWFBfREJMKTB4ZmMwMDAwMDAsIChGSVhQX0RCTCkweDAwMDAwMDAwLAotICAoRklYUF9EQkwpMHgwNDAwMDAwMCwgKEZJWFBfREJMKTB4MDgwMDAwMDAsIChGSVhQX0RCTCkweDBlMDAwMDAwLCAoRklYUF9EQkwpMHgxNDAwMDAwMCwgKEZJWFBfREJMKTB4MWMwMDAwMDAsIChGSVhQX0RCTCkweDI0MDAwMDAwLCAoRklYUF9EQkwpMHgzMjAwMDAwMAotfTsKKyAgICAoRklYUF9EQkwpMHhjZTAwMDAwMCwgKEZJWFBfREJMKTB4ZGMwMDAwMDAsIChGSVhQX0RCTCkweGU0MDAwMDAwLAorICAgIChGSVhQX0RCTCkweGVjMDAwMDAwLCAoRklYUF9EQkwpMHhmMjAwMDAwMCwgKEZJWFBfREJMKTB4ZjgwMDAwMDAsCisgICAgKEZJWFBfREJMKTB4ZmMwMDAwMDAsIChGSVhQX0RCTCkweDAwMDAwMDAwLCAoRklYUF9EQkwpMHgwNDAwMDAwMCwKKyAgICAoRklYUF9EQkwpMHgwODAwMDAwMCwgKEZJWFBfREJMKTB4MGUwMDAwMDAsIChGSVhQX0RCTCkweDE0MDAwMDAwLAorICAgIChGSVhQX0RCTCkweDFjMDAwMDAwLCAoRklYUF9EQkwpMHgyNDAwMDAwMCwgKEZJWFBfREJMKTB4MzIwMDAwMDB9OwogCiBzdGF0aWMgY29uc3QgRklYUF9EQkwgaWlkUXVhbnRGaW5lX2Z4WzMxXSA9IHsKLSAgKEZJWFBfREJMKTB4OWMwMDAwMDEsIChGSVhQX0RCTCkweGE2MDAwMDAxLCAoRklYUF9EQkwpMHhiMDAwMDAwMSwgKEZJWFBfREJMKTB4YmEwMDAwMDEsIChGSVhQX0RCTCkweGM0MDAwMDAwLCAoRklYUF9EQkwpMHhjZTAwMDAwMCwgKEZJWFBfREJMKTB4ZDQwMDAwMDAsIChGSVhQX0RCTCkweGRhMDAwMDAwLAotICAoRklYUF9EQkwpMHhlMDAwMDAwMCwgKEZJWFBfREJMKTB4ZTYwMDAwMDAsIChGSVhQX0RCTCkweGVjMDAwMDAwLCAoRklYUF9EQkwpMHhmMDAwMDAwMCwgKEZJWFBfREJMKTB4ZjQwMDAwMDAsIChGSVhQX0RCTCkweGY4MDAwMDAwLCAoRklYUF9EQkwpMHhmYzAwMDAwMCwgKEZJWFBfREJMKTB4MDAwMDAwMDAsCi0gIChGSVhQX0RCTCkweDA0MDAwMDAwLCAoRklYUF9EQkwpMHgwODAwMDAwMCwgKEZJWFBfREJMKTB4MGMwMDAwMDAsIChGSVhQX0RCTCkweDEwMDAwMDAwLCAoRklYUF9EQkwpMHgxNDAwMDAwMCwgKEZJWFBfREJMKTB4MWEwMDAwMDAsIChGSVhQX0RCTCkweDIwMDAwMDAwLCAoRklYUF9EQkwpMHgyNjAwMDAwMCwKLSAgKEZJWFBfREJMKTB4MmMwMDAwMDAsIChGSVhQX0RCTCkweDMyMDAwMDAwLCAoRklYUF9EQkwpMHgzYzAwMDAwMCwgKEZJWFBfREJMKTB4NDVmZmZmZmYsIChGSVhQX0RCTCkweDRmZmZmZmZmLCAoRklYUF9EQkwpMHg1OWZmZmZmZiwgKEZJWFBfREJMKTB4NjNmZmZmZmYKLX07Ci0KLQorICAgIChGSVhQX0RCTCkweDljMDAwMDAxLCAoRklYUF9EQkwpMHhhNjAwMDAwMSwgKEZJWFBfREJMKTB4YjAwMDAwMDEsCisgICAgKEZJWFBfREJMKTB4YmEwMDAwMDEsIChGSVhQX0RCTCkweGM0MDAwMDAwLCAoRklYUF9EQkwpMHhjZTAwMDAwMCwKKyAgICAoRklYUF9EQkwpMHhkNDAwMDAwMCwgKEZJWFBfREJMKTB4ZGEwMDAwMDAsIChGSVhQX0RCTCkweGUwMDAwMDAwLAorICAgIChGSVhQX0RCTCkweGU2MDAwMDAwLCAoRklYUF9EQkwpMHhlYzAwMDAwMCwgKEZJWFBfREJMKTB4ZjAwMDAwMDAsCisgICAgKEZJWFBfREJMKTB4ZjQwMDAwMDAsIChGSVhQX0RCTCkweGY4MDAwMDAwLCAoRklYUF9EQkwpMHhmYzAwMDAwMCwKKyAgICAoRklYUF9EQkwpMHgwMDAwMDAwMCwgKEZJWFBfREJMKTB4MDQwMDAwMDAsIChGSVhQX0RCTCkweDA4MDAwMDAwLAorICAgIChGSVhQX0RCTCkweDBjMDAwMDAwLCAoRklYUF9EQkwpMHgxMDAwMDAwMCwgKEZJWFBfREJMKTB4MTQwMDAwMDAsCisgICAgKEZJWFBfREJMKTB4MWEwMDAwMDAsIChGSVhQX0RCTCkweDIwMDAwMDAwLCAoRklYUF9EQkwpMHgyNjAwMDAwMCwKKyAgICAoRklYUF9EQkwpMHgyYzAwMDAwMCwgKEZJWFBfREJMKTB4MzIwMDAwMDAsIChGSVhQX0RCTCkweDNjMDAwMDAwLAorICAgIChGSVhQX0RCTCkweDQ1ZmZmZmZmLCAoRklYUF9EQkwpMHg0ZmZmZmZmZiwgKEZJWFBfREJMKTB4NTlmZmZmZmYsCisgICAgKEZJWFBfREJMKTB4NjNmZmZmZmZ9OwogCiBzdGF0aWMgY29uc3QgRklYUF9EQkwgaWNjUXVhbnRbOF0gPSB7Ci0gIChGSVhQX0RCTCkweDdmZmZmZmZmLCAoRklYUF9EQkwpMHg3N2VmOWQ3ZiwgKEZJWFBfREJMKTB4NmJhYmM5N2YsIChGSVhQX0RCTCkweDRjZWFmMjdmLCAoRklYUF9EQkwpMHgyZjBlZDNjMCwgKEZJWFBfREJMKTB4MDAwMDAwMDAsIChGSVhQX0RCTCkweGI0OWJhNjAxLCAoRklYUF9EQkwpMHg4MDAwMDAwMAotfTsKKyAgICAoRklYUF9EQkwpMHg3ZmZmZmZmZiwgKEZJWFBfREJMKTB4NzdlZjlkN2YsIChGSVhQX0RCTCkweDZiYWJjOTdmLAorICAgIChGSVhQX0RCTCkweDRjZWFmMjdmLCAoRklYUF9EQkwpMHgyZjBlZDNjMCwgKEZJWFBfREJMKTB4MDAwMDAwMDAsCisgICAgKEZJWFBfREJMKTB4YjQ5YmE2MDEsIChGSVhQX0RCTCkweDgwMDAwMDAwfTsKIAotc3RhdGljIEZES19QU0VOQ19FUlJPUiBJbml0UFNEYXRhKAotICAgICAgICBIQU5ETEVfUFNfREFUQSAgICAgICAgICAgIGhQc0RhdGEKLSAgICAgICAgKQoteworc3RhdGljIEZES19QU0VOQ19FUlJPUiBJbml0UFNEYXRhKEhBTkRMRV9QU19EQVRBIGhQc0RhdGEpIHsKICAgRkRLX1BTRU5DX0VSUk9SIGVycm9yID0gUFNFTkNfT0s7CiAKLSAgaWYoaFBzRGF0YSA9PSBOVUxMKSB7CisgIGlmIChoUHNEYXRhID09IE5VTEwpIHsKICAgICBlcnJvciA9IFBTRU5DX0lOVkFMSURfSEFORExFOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIGludCBpLCBlbnY7Ci0gICAgRkRLbWVtY2xlYXIoaFBzRGF0YSxzaXplb2YoUFNfREFUQSkpOworICAgIEZES21lbWNsZWFyKGhQc0RhdGEsIHNpemVvZihQU19EQVRBKSk7CiAKLSAgICBmb3IgKGk9MDsgaTxQU19NQVhfQkFORFM7IGkrKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBQU19NQVhfQkFORFM7IGkrKykgewogICAgICAgaFBzRGF0YS0+aWlkSWR4TGFzdFtpXSA9IDA7CiAgICAgICBoUHNEYXRhLT5pY2NJZHhMYXN0W2ldID0gMDsKICAgICB9CiAKLSAgICBoUHNEYXRhLT5paWRFbmFibGUgICAgPSBoUHNEYXRhLT5paWRFbmFibGVMYXN0ID0gMDsKLSAgICBoUHNEYXRhLT5pY2NFbmFibGUgICAgPSBoUHNEYXRhLT5pY2NFbmFibGVMYXN0ID0gMDsKKyAgICBoUHNEYXRhLT5paWRFbmFibGUgPSBoUHNEYXRhLT5paWRFbmFibGVMYXN0ID0gMDsKKyAgICBoUHNEYXRhLT5pY2NFbmFibGUgPSBoUHNEYXRhLT5pY2NFbmFibGVMYXN0ID0gMDsKICAgICBoUHNEYXRhLT5paWRRdWFudE1vZGUgPSBoUHNEYXRhLT5paWRRdWFudE1vZGVMYXN0ID0gUFNfSUlEX1JFU19DT0FSU0U7CiAgICAgaFBzRGF0YS0+aWNjUXVhbnRNb2RlID0gaFBzRGF0YS0+aWNjUXVhbnRNb2RlTGFzdCA9IFBTX0lDQ19ST1RfQTsKIAotICAgIGZvcihlbnY9MDsgZW52PFBTX01BWF9FTlZFTE9QRVM7IGVudisrKSB7CisgICAgZm9yIChlbnYgPSAwOyBlbnYgPCBQU19NQVhfRU5WRUxPUEVTOyBlbnYrKykgewogICAgICAgaFBzRGF0YS0+aWNjRGlmZk1vZGVbZW52XSA9IFBTX0RFTFRBX0ZSRVE7CiAgICAgICBoUHNEYXRhLT5pY2NEaWZmTW9kZVtlbnZdID0gUFNfREVMVEFfRlJFUTsKIAotICAgICAgZm9yIChpPTA7IGk8UFNfTUFYX0JBTkRTOyBpKyspIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBQU19NQVhfQkFORFM7IGkrKykgewogICAgICAgICBoUHNEYXRhLT5paWRJZHhbZW52XVtpXSA9IDA7CiAgICAgICAgIGhQc0RhdGEtPmljY0lkeFtlbnZdW2ldID0gMDsKICAgICAgIH0KQEAgLTIwMSw5NCArMjAwLDg0IEBACiAKICAgICBoUHNEYXRhLT5uRW52ZWxvcGVzTGFzdCA9IDA7CiAKLSAgICBoUHNEYXRhLT5oZWFkZXJDbnQgID0gTUFYX1BTX05PSEVBREVSX0NOVDsKKyAgICBoUHNEYXRhLT5oZWFkZXJDbnQgPSBNQVhfUFNfTk9IRUFERVJfQ05UOwogICAgIGhQc0RhdGEtPmlpZFRpbWVDbnQgPSBNQVhfVElNRV9ESUZGX0ZSQU1FUzsKICAgICBoUHNEYXRhLT5pY2NUaW1lQ250ID0gTUFYX1RJTUVfRElGRl9GUkFNRVM7Ci0gICAgaFBzRGF0YS0+bm9FbnZDbnQgICA9IE1BWF9OT0VOVl9DTlQ7CisgICAgaFBzRGF0YS0+bm9FbnZDbnQgPSBNQVhfTk9FTlZfQ05UOwogICB9CiAKICAgcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgRklYUF9EQkwgcXVhbnRpemVDb2VmKCBjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbkJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIHF1YW50VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgaWR4T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5RdWFudFN0ZXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKlJFU1RSSUNUIHF1YW50T3V0KQoteworc3RhdGljIEZJWFBfREJMIHF1YW50aXplQ29lZihjb25zdCBGSVhQX0RCTCAqUkVTVFJJQ1QgaW5wdXQsIGNvbnN0IElOVCBuQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBxdWFudFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgaWR4T2Zmc2V0LCBjb25zdCBJTlQgblF1YW50U3RlcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqUkVTVFJJQ1QgcXVhbnRPdXQpIHsKICAgSU5UIGlkeCwgYmFuZDsKICAgRklYUF9EQkwgcXVhbnRFcnIgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwogCi0gIGZvciAoYmFuZD0wOyBiYW5kPG5CYW5kcztiYW5kKyspIHsKLSAgICBmb3IoaWR4PTA7IGlkeDxuUXVhbnRTdGVwcy0xOyBpZHgrKyl7Ci0gICAgICBpZiggZml4cF9hYnMoKGlucHV0W2JhbmRdPj4xKS0ocXVhbnRUYWJsZVtpZHgrMV0+PjEpKSA+Ci0gICAgICAgICAgZml4cF9hYnMoKGlucHV0W2JhbmRdPj4xKS0ocXVhbnRUYWJsZVtpZHhdPj4xKSkgKQotICAgICAgeworICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgbkJhbmRzOyBiYW5kKyspIHsKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5RdWFudFN0ZXBzIC0gMTsgaWR4KyspIHsKKyAgICAgIGlmIChmaXhwX2FicygoaW5wdXRbYmFuZF0gPj4gMSkgLSAocXVhbnRUYWJsZVtpZHggKyAxXSA+PiAxKSkgPgorICAgICAgICAgIGZpeHBfYWJzKChpbnB1dFtiYW5kXSA+PiAxKSAtIChxdWFudFRhYmxlW2lkeF0gPj4gMSkpKSB7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KLSAgICBxdWFudEVyciAgICAgICs9IChmaXhwX2FicyhpbnB1dFtiYW5kXS1xdWFudFRhYmxlW2lkeF0pPj5QU19RVUFOVF9TQ0FMRSk7ICAgLyogZG9uJ3Qgc2NhbGUgYmVmb3JlIHN1YnRyYWN0aW9uOyBkaWZmIHNtYWxsZXIgKDY0LTI1KS82NCAqLworICAgIHF1YW50RXJyICs9IChmaXhwX2FicyhpbnB1dFtiYW5kXSAtIHF1YW50VGFibGVbaWR4XSkgPj4KKyAgICAgICAgICAgICAgICAgUFNfUVVBTlRfU0NBTEUpOyAvKiBkb24ndCBzY2FsZSBiZWZvcmUgc3VidHJhY3Rpb247IGRpZmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbGVyICg2NC0yNSkvNjQgKi8KICAgICBxdWFudE91dFtiYW5kXSA9IGlkeCAtIGlkeE9mZnNldDsKICAgfQogCiAgIHJldHVybiBxdWFudEVycjsKIH0KIAotc3RhdGljIElOVCBnZXRJQ0NNb2RlKGNvbnN0IElOVCBuQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIHJvdFR5cGUpCi17CitzdGF0aWMgSU5UIGdldElDQ01vZGUoY29uc3QgSU5UIG5CYW5kcywgY29uc3QgSU5UIHJvdFR5cGUpIHsKICAgSU5UIG1vZGUgPSAwOwogCi0gIHN3aXRjaChuQmFuZHMpIHsKLSAgY2FzZSBQU19CQU5EU19DT0FSU0U6Ci0gICAgbW9kZSA9IFBTX1JFU19DT0FSU0U7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgUFNfQkFORFNfTUlEOgotICAgIG1vZGUgPSBQU19SRVNfTUlEOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIG1vZGUgPSAwOworICBzd2l0Y2ggKG5CYW5kcykgeworICAgIGNhc2UgUFNfQkFORFNfQ09BUlNFOgorICAgICAgbW9kZSA9IFBTX1JFU19DT0FSU0U7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTX0JBTkRTX01JRDoKKyAgICAgIG1vZGUgPSBQU19SRVNfTUlEOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG1vZGUgPSAwOwogICB9Ci0gIGlmKHJvdFR5cGU9PVBTX0lDQ19ST1RfQil7CisgIGlmIChyb3RUeXBlID09IFBTX0lDQ19ST1RfQikgewogICAgIG1vZGUgKz0gMzsKICAgfQogCiAgIHJldHVybiBtb2RlOwogfQogCi0KLXN0YXRpYyBJTlQgZ2V0SUlETW9kZShjb25zdCBJTlQgbkJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpaWRSZXMpCi17CitzdGF0aWMgSU5UIGdldElJRE1vZGUoY29uc3QgSU5UIG5CYW5kcywgY29uc3QgSU5UIGlpZFJlcykgewogICBJTlQgbW9kZSA9IDA7CiAKLSAgc3dpdGNoKG5CYW5kcykgewotICBjYXNlIFBTX0JBTkRTX0NPQVJTRToKLSAgICBtb2RlID0gUFNfUkVTX0NPQVJTRTsKLSAgICBicmVhazsKLSAgY2FzZSBQU19CQU5EU19NSUQ6Ci0gICAgbW9kZSA9IFBTX1JFU19NSUQ7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgbW9kZSA9IDA7Ci0gICAgYnJlYWs7CisgIHN3aXRjaCAobkJhbmRzKSB7CisgICAgY2FzZSBQU19CQU5EU19DT0FSU0U6CisgICAgICBtb2RlID0gUFNfUkVTX0NPQVJTRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNfQkFORFNfTUlEOgorICAgICAgbW9kZSA9IFBTX1JFU19NSUQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbW9kZSA9IDA7CisgICAgICBicmVhazsKICAgfQogCi0gIGlmKGlpZFJlcyA9PSBQU19JSURfUkVTX0ZJTkUpeworICBpZiAoaWlkUmVzID09IFBTX0lJRF9SRVNfRklORSkgewogICAgIG1vZGUgKz0gMzsKICAgfQogCiAgIHJldHVybiBtb2RlOwogfQogCi0KIHN0YXRpYyBJTlQgZW52ZWxvcGVSZWR1Y2libGUoRklYUF9EQkwgaWlkW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGljY1tQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgcHNCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5FbnZlbG9wZXMpCi17Ci0gICNkZWZpbmUgVEhSRVNIX1NDQUxFICAgICA3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBwc0JhbmRzLCBJTlQgbkVudmVsb3BlcykgeworI2RlZmluZSBUSFJFU0hfU0NBTEUgNwogCiAgIElOVCByZWR1Y2libGUgPSAxOyAvKiB0cnVlICovCiAgIElOVCBlID0gMCwgYiA9IDA7CkBAIC0yOTksMzEgKzI4OCwzNiBAQAogICBGSVhQX0RCTCBpaWRNZWFuRXJyb3IsIGljY01lYW5FcnJvcjsKIAogICAvKiBzcXVhcmUgdmFsdWVzIHRvIHByZXZlbnQgc3FydCwKLSAgICAgbXVsdGlwbHkgYmFuZHMgdG8gcHJldmVudCBkaXZpc2lvbjsgYmFuZHMgc2hpZnRlZCBERlJBQ1RfQklUUyBpbnN0ZWFkIChERlJBQ1RfQklUUy0xKSBiZWNhdXNlIGZNdWx0RGl2MiB1c2VkKi8KLSAgaWlkRXJyVGhyZXNob2xkID0gZk11bHREaXYyICggRkwyRlhDT05TVF9EQkwoNi41Zio2LjVmLyhJSURfU0NBTEVfRlQqSUlEX1NDQUxFX0ZUKSksIChGSVhQX0RCTCkocHNCYW5kczw8KChERlJBQ1RfQklUUyktVEhSRVNIX1NDQUxFKSkgKTsKLSAgaWNjRXJyVGhyZXNob2xkID0gZk11bHREaXYyICggRkwyRlhDT05TVF9EQkwoMC43NWYqMC43NWYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkocHNCYW5kczw8KChERlJBQ1RfQklUUyktVEhSRVNIX1NDQUxFKSkgKTsKKyAgICAgbXVsdGlwbHkgYmFuZHMgdG8gcHJldmVudCBkaXZpc2lvbjsgYmFuZHMgc2hpZnRlZCBERlJBQ1RfQklUUyBpbnN0ZWFkCisgICAgIChERlJBQ1RfQklUUy0xKSBiZWNhdXNlIGZNdWx0RGl2MiB1c2VkKi8KKyAgaWlkRXJyVGhyZXNob2xkID0KKyAgICAgIGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCg2LjVmICogNi41ZiAvIChJSURfU0NBTEVfRlQgKiBJSURfU0NBTEVfRlQpKSwKKyAgICAgICAgICAgICAgICAoRklYUF9EQkwpKHBzQmFuZHMgPDwgKChERlJBQ1RfQklUUyktVEhSRVNIX1NDQUxFKSkpOworICBpY2NFcnJUaHJlc2hvbGQgPQorICAgICAgZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKDAuNzVmICogMC43NWYpLAorICAgICAgICAgICAgICAgIChGSVhQX0RCTCkocHNCYW5kcyA8PCAoKERGUkFDVF9CSVRTKS1USFJFU0hfU0NBTEUpKSk7CiAKICAgaWYgKG5FbnZlbG9wZXMgPD0gMSkgewogICAgIHJlZHVjaWJsZSA9IDA7CiAgIH0gZWxzZSB7Ci0KICAgICAvKiBtZWFuIGVycm9yIGNyaXRlcmlvbiAqLwotICAgIGZvciAoZT0wOyAoZSA8IG5FbnZlbG9wZXMvMikgJiYgKHJlZHVjaWJsZSE9MCApIDsgZSsrKSB7CisgICAgZm9yIChlID0gMDsgKGUgPCBuRW52ZWxvcGVzIC8gMikgJiYgKHJlZHVjaWJsZSAhPSAwKTsgZSsrKSB7CiAgICAgICBpaWRNZWFuRXJyb3IgPSBpY2NNZWFuRXJyb3IgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwotICAgICAgZm9yKGI9MDsgYjxwc0JhbmRzOyBiKyspIHsKLSAgICAgICAgZElpZCA9IChpaWRbMiplXVtiXT4+MSkgLSAoaWlkWzIqZSsxXVtiXT4+MSk7ICAgLyogc2NhbGUgMSBiaXQ7IHNxdWFyZWQgLT4gMiBiaXQgKi8KLSAgICAgICAgZEljYyA9IChpY2NbMiplXVtiXT4+MSkgLSAoaWNjWzIqZSsxXVtiXT4+MSk7Ci0gICAgICAgIGlpZE1lYW5FcnJvciArPSBmUG93MkRpdjIoZElpZCk+Pig1LTEpOyAgICAvKiArIChiYW5kcz0yMCkgc2NhbGUgPSA1ICovCi0gICAgICAgIGljY01lYW5FcnJvciArPSBmUG93MkRpdjIoZEljYyk+Pig1LTEpOwotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtLT4gc2NhbGluZyA9IDcgYml0ID0gVEhSRVNIX1NDQUxFICEhICovCisgICAgICBmb3IgKGIgPSAwOyBiIDwgcHNCYW5kczsgYisrKSB7CisgICAgICAgIGRJaWQgPSAoaWlkWzIgKiBlXVtiXSA+PiAxKSAtCisgICAgICAgICAgICAgICAoaWlkWzIgKiBlICsgMV1bYl0gPj4gMSk7IC8qIHNjYWxlIDEgYml0OyBzcXVhcmVkIC0+IDIgYml0ICovCisgICAgICAgIGRJY2MgPSAoaWNjWzIgKiBlXVtiXSA+PiAxKSAtIChpY2NbMiAqIGUgKyAxXVtiXSA+PiAxKTsKKyAgICAgICAgaWlkTWVhbkVycm9yICs9IGZQb3cyRGl2MihkSWlkKSA+PiAoNSAtIDEpOyAvKiArIChiYW5kcz0yMCkgc2NhbGUgPSA1ICovCisgICAgICAgIGljY01lYW5FcnJvciArPSBmUG93MkRpdjIoZEljYykgPj4gKDUgLSAxKTsKKyAgICAgIH0gLyogLS0+IHNjYWxpbmcgPSA3IGJpdCA9IFRIUkVTSF9TQ0FMRSAhISAqLwogCiAgICAgICAvKiBpbnN0ZWFkIHNxcnQgdmFsdWVzIGFyZSBzcXVhcmVkIQogICAgICAgICAgaW5zdGVhZCBvZiBkaXZpc2lvbiwgbXVsdGlwbHkgdGhyZXNob2xkIHdpdGggcHNCYW5kcwogICAgICAgICAgc2NhbGluZyBuZWNlc3NhcnkhISAqLwogCiAgICAgICAvKiBxdWl0IGFzIHNvb24gYXMgdGhyZXNob2xkIGlzIHJlYWNoZWQgKi8KLSAgICAgIGlmICggKGlpZE1lYW5FcnJvciA+IChpaWRFcnJUaHJlc2hvbGQpKSB8fAotICAgICAgICAgICAoaWNjTWVhbkVycm9yID4gKGljY0VyclRocmVzaG9sZCkpICkgeworICAgICAgaWYgKChpaWRNZWFuRXJyb3IgPiAoaWlkRXJyVGhyZXNob2xkKSkgfHwKKyAgICAgICAgICAoaWNjTWVhbkVycm9yID4gKGljY0VyclRocmVzaG9sZCkpKSB7CiAgICAgICAgIHJlZHVjaWJsZSA9IDA7CiAgICAgICB9CiAgICAgfQpAQCAtMzMyLDMwNSArMzI2LDMxNCBAQAogICByZXR1cm4gcmVkdWNpYmxlOwogfQogCi0KLXN0YXRpYyB2b2lkIHByb2Nlc3NJaWREYXRhKFBTX0RBVEEgICAgICAgKnBzRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgIGlpZFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgcHNCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgIG5FbnZlbG9wZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX0RCTCBxdWFudEVycm9yVGhyZXNob2xkKQotewotICBJTlQgaWlkSWR4RmluZSAgW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU107CitzdGF0aWMgdm9pZCBwcm9jZXNzSWlkRGF0YShQU19EQVRBICpwc0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBpaWRbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBwc0JhbmRzLCBjb25zdCBJTlQgbkVudmVsb3BlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfREJMIHF1YW50RXJyb3JUaHJlc2hvbGQpIHsKKyAgSU5UIGlpZElkeEZpbmVbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXTsKICAgSU5UIGlpZElkeENvYXJzZVtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOwogCiAgIEZJWFBfREJMIGVycklJRCA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgIEZJWFBfREJMIGVycklJREZpbmUgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwotICBJTlQgICBiaXRzSWlkRnJlcSA9IDA7Ci0gIElOVCAgIGJpdHNJaWRUaW1lID0gMDsKLSAgSU5UICAgYml0c0ZpbmVUb3QgPSAwOwotICBJTlQgICBiaXRzQ29hcnNlVG90ID0gMDsKLSAgSU5UICAgZXJyb3IgPSAwOwotICBJTlQgICBlbnYsIGJhbmQ7Ci0gIElOVCAgIGRpZmZNb2RlW1BTX01BWF9FTlZFTE9QRVNdLCBkaWZmTW9kZUZpbmVbUFNfTUFYX0VOVkVMT1BFU107CisgIElOVCBiaXRzSWlkRnJlcSA9IDA7CisgIElOVCBiaXRzSWlkVGltZSA9IDA7CisgIElOVCBiaXRzRmluZVRvdCA9IDA7CisgIElOVCBiaXRzQ29hcnNlVG90ID0gMDsKKyAgSU5UIGVycm9yID0gMDsKKyAgSU5UIGVudiwgYmFuZDsKKyAgSU5UIGRpZmZNb2RlW1BTX01BWF9FTlZFTE9QRVNdLCBkaWZmTW9kZUZpbmVbUFNfTUFYX0VOVkVMT1BFU107CiAgIElOVCBsb3VkbkRpZmYgPSAwOwogICBJTlQgaWlkVHJhbnNtaXQgPSAwOwogCi0gIGJpdHNJaWRGcmVxID0gYml0c0lpZFRpbWUgPSAwOwotCiAgIC8qIFF1YW50aXplIElJRCBjb2VmZmljaWVudHMgKi8KLSAgZm9yKGVudj0wO2VudjxuRW52ZWxvcGVzOyBlbnYrKykgewotICAgIGVycklJRCAgICAgKz0gcXVhbnRpemVDb2VmKGlpZFtlbnZdLCBwc0JhbmRzLCBpaWRRdWFudF9meCwgICAgICA3LCAxNSwgaWlkSWR4Q29hcnNlW2Vudl0pOwotICAgIGVycklJREZpbmUgKz0gcXVhbnRpemVDb2VmKGlpZFtlbnZdLCBwc0JhbmRzLCBpaWRRdWFudEZpbmVfZngsIDE1LCAzMSwgaWlkSWR4RmluZVtlbnZdKTsKKyAgZm9yIChlbnYgPSAwOyBlbnYgPCBuRW52ZWxvcGVzOyBlbnYrKykgeworICAgIGVycklJRCArPQorICAgICAgICBxdWFudGl6ZUNvZWYoaWlkW2Vudl0sIHBzQmFuZHMsIGlpZFF1YW50X2Z4LCA3LCAxNSwgaWlkSWR4Q29hcnNlW2Vudl0pOworICAgIGVycklJREZpbmUgKz0gcXVhbnRpemVDb2VmKGlpZFtlbnZdLCBwc0JhbmRzLCBpaWRRdWFudEZpbmVfZngsIDE1LCAzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaWRJZHhGaW5lW2Vudl0pOwogICB9CiAKICAgLyogbm9ybWFsaXplIGVycm9yIHRvIG51bWJlciBvZiBlbnZlbG9wZXMsIHBzIGJhbmRzCiAgICAgIGVycklJRCAvPSBwc0JhbmRzKm5FbnZlbG9wZXM7CiAgICAgIGVycklJREZpbmUgLz0gcHNCYW5kcypuRW52ZWxvcGVzOyAqLwogCi0KICAgLyogQ2hlY2sgaWYgSUlEIGNvZWZmaWNpZW50cyBzaG91bGQgYmUgdXNlZCBpbiB0aGlzIGZyYW1lICovCiAgIHBzRGF0YS0+aWlkRW5hYmxlID0gMDsKLSAgZm9yKGVudj0wO2VudjxuRW52ZWxvcGVzOyBlbnYrKykgewotICAgIGZvcihiYW5kPTA7YmFuZDxwc0JhbmRzO2JhbmQrKykgewotICAgICAgbG91ZG5EaWZmICAgKz0gZml4cF9hYnMoaWlkSWR4Q29hcnNlW2Vudl1bYmFuZF0pOwotICAgICAgaWlkVHJhbnNtaXQgKys7CisgIGZvciAoZW52ID0gMDsgZW52IDwgbkVudmVsb3BlczsgZW52KyspIHsKKyAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgcHNCYW5kczsgYmFuZCsrKSB7CisgICAgICBsb3VkbkRpZmYgKz0gZml4cF9hYnMoaWlkSWR4Q29hcnNlW2Vudl1bYmFuZF0pOworICAgICAgaWlkVHJhbnNtaXQrKzsKICAgICB9CiAgIH0KIAotICBpZihsb3VkbkRpZmYgPiBmTXVsdEkoRkwyRlhDT05TVF9EQkwoMC43ZiksaWlkVHJhbnNtaXQpKXsgICAgLyogMC43ZiBlbXBpcmljIHZhbHVlICovCisgIGlmIChsb3VkbkRpZmYgPgorICAgICAgZk11bHRJKEZMMkZYQ09OU1RfREJMKDAuN2YpLCBpaWRUcmFuc21pdCkpIHsgLyogMC43ZiBlbXBpcmljIHZhbHVlICovCiAgICAgcHNEYXRhLT5paWRFbmFibGUgPSAxOwogICB9CiAKICAgLyogaWYgaWlkIG5vdCBhY3RpdmUgLT4gUkVTRVQgZGF0YSAqLwotICBpZihwc0RhdGEtPmlpZEVuYWJsZT09MCkgeworICBpZiAocHNEYXRhLT5paWRFbmFibGUgPT0gMCkgewogICAgIHBzRGF0YS0+aWlkVGltZUNudCA9IE1BWF9USU1FX0RJRkZfRlJBTUVTOwotICAgIGZvcihlbnY9MDtlbnY8bkVudmVsb3BlczsgZW52KyspIHsKKyAgICBmb3IgKGVudiA9IDA7IGVudiA8IG5FbnZlbG9wZXM7IGVudisrKSB7CiAgICAgICBwc0RhdGEtPmlpZERpZmZNb2RlW2Vudl0gPSBQU19ERUxUQV9GUkVROwotICAgICAgRkRLbWVtY2xlYXIocHNEYXRhLT5paWRJZHhbZW52XSwgc2l6ZW9mKElOVCkqcHNCYW5kcyk7CisgICAgICBGREttZW1jbGVhcihwc0RhdGEtPmlpZElkeFtlbnZdLCBzaXplb2YoSU5UKSAqIHBzQmFuZHMpOwogICAgIH0KICAgICByZXR1cm47CiAgIH0KIAogICAvKiBjb3VudCBDT0FSU0UgcXVhbnRpemF0aW9uIGJpdHMgZm9yIGZpcnN0IGVudmVsb3BlKi8KLSAgYml0c0lpZEZyZXEgPSBGREtzYnJFbmNfRW5jb2RlSWlkKE5VTEwsIGlpZElkeENvYXJzZVswXSwgTlVMTCwgcHNCYW5kcywgUFNfSUlEX1JFU19DT0FSU0UsIFBTX0RFTFRBX0ZSRVEsICZlcnJvcik7CisgIGJpdHNJaWRGcmVxID0gRkRLc2JyRW5jX0VuY29kZUlpZChOVUxMLCBpaWRJZHhDb2Fyc2VbMF0sIE5VTEwsIHBzQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU19JSURfUkVTX0NPQVJTRSwgUFNfREVMVEFfRlJFUSwgJmVycm9yKTsKIAotICBpZiggKHBzRGF0YS0+aWlkVGltZUNudD49TUFYX1RJTUVfRElGRl9GUkFNRVMpIHx8IChwc0RhdGEtPmlpZFF1YW50TW9kZUxhc3Q9PVBTX0lJRF9SRVNfRklORSkgKSB7Ci0gICAgYml0c0lpZFRpbWUgICAgID0gRE9fTk9UX1VTRV9USElTX01PREU7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgYml0c0lpZFRpbWUgICAgID0gRkRLc2JyRW5jX0VuY29kZUlpZChOVUxMLCBpaWRJZHhDb2Fyc2VbMF0sIHBzRGF0YS0+aWlkSWR4TGFzdCwgcHNCYW5kcywgUFNfSUlEX1JFU19DT0FSU0UsIFBTX0RFTFRBX1RJTUUsICZlcnJvcik7CisgIGlmICgocHNEYXRhLT5paWRUaW1lQ250ID49IE1BWF9USU1FX0RJRkZfRlJBTUVTKSB8fAorICAgICAgKHBzRGF0YS0+aWlkUXVhbnRNb2RlTGFzdCA9PSBQU19JSURfUkVTX0ZJTkUpKSB7CisgICAgYml0c0lpZFRpbWUgPSBET19OT1RfVVNFX1RISVNfTU9ERTsKKyAgfSBlbHNlIHsKKyAgICBiaXRzSWlkVGltZSA9CisgICAgICAgIEZES3NickVuY19FbmNvZGVJaWQoTlVMTCwgaWlkSWR4Q29hcnNlWzBdLCBwc0RhdGEtPmlpZElkeExhc3QsIHBzQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfSUlEX1JFU19DT0FSU0UsIFBTX0RFTFRBX1RJTUUsICZlcnJvcik7CiAgIH0KIAogICAvKiBkZWNpc2lvbiBERUxUQV9GUkVRIHZzIERFTFRBX1RJTUUgKi8KLSAgaWYoYml0c0lpZFRpbWU+Yml0c0lpZEZyZXEpIHsKLSAgICBkaWZmTW9kZVswXSAgID0gUFNfREVMVEFfRlJFUTsKKyAgaWYgKGJpdHNJaWRUaW1lID4gYml0c0lpZEZyZXEpIHsKKyAgICBkaWZmTW9kZVswXSA9IFBTX0RFTFRBX0ZSRVE7CiAgICAgYml0c0NvYXJzZVRvdCA9IGJpdHNJaWRGcmVxOwotICB9Ci0gIGVsc2UgewotICAgIGRpZmZNb2RlWzBdICAgPSBQU19ERUxUQV9USU1FOworICB9IGVsc2UgeworICAgIGRpZmZNb2RlWzBdID0gUFNfREVMVEFfVElNRTsKICAgICBiaXRzQ29hcnNlVG90ID0gYml0c0lpZFRpbWU7CiAgIH0KIAogICAvKiBjb3VudCBDT0FSU0UgcXVhbnRpemF0aW9uIGJpdHMgZm9yIGZvbGxvd2luZyBlbnZlbG9wZXMqLwotICBmb3IoZW52PTE7ZW52PG5FbnZlbG9wZXM7IGVudisrKSB7Ci0gICAgYml0c0lpZEZyZXEgID0gRkRLc2JyRW5jX0VuY29kZUlpZChOVUxMLCBpaWRJZHhDb2Fyc2VbZW52XSwgTlVMTCwgICAgICAgICAgICAgICAgcHNCYW5kcywgUFNfSUlEX1JFU19DT0FSU0UsIFBTX0RFTFRBX0ZSRVEsICZlcnJvcik7Ci0gICAgYml0c0lpZFRpbWUgID0gRkRLc2JyRW5jX0VuY29kZUlpZChOVUxMLCBpaWRJZHhDb2Fyc2VbZW52XSwgaWlkSWR4Q29hcnNlW2Vudi0xXSwgcHNCYW5kcywgUFNfSUlEX1JFU19DT0FSU0UsIFBTX0RFTFRBX1RJTUUsICZlcnJvcik7CisgIGZvciAoZW52ID0gMTsgZW52IDwgbkVudmVsb3BlczsgZW52KyspIHsKKyAgICBiaXRzSWlkRnJlcSA9IEZES3NickVuY19FbmNvZGVJaWQoTlVMTCwgaWlkSWR4Q29hcnNlW2Vudl0sIE5VTEwsIHBzQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTX0lJRF9SRVNfQ09BUlNFLCBQU19ERUxUQV9GUkVRLCAmZXJyb3IpOworICAgIGJpdHNJaWRUaW1lID0KKyAgICAgICAgRkRLc2JyRW5jX0VuY29kZUlpZChOVUxMLCBpaWRJZHhDb2Fyc2VbZW52XSwgaWlkSWR4Q29hcnNlW2VudiAtIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQmFuZHMsIFBTX0lJRF9SRVNfQ09BUlNFLCBQU19ERUxUQV9USU1FLCAmZXJyb3IpOwogCiAgICAgLyogZGVjaXNpb24gREVMVEFfRlJFUSB2cyBERUxUQV9USU1FICovCi0gICAgaWYoYml0c0lpZFRpbWU+Yml0c0lpZEZyZXEpIHsKLSAgICAgIGRpZmZNb2RlW2Vudl0gID0gUFNfREVMVEFfRlJFUTsKKyAgICBpZiAoYml0c0lpZFRpbWUgPiBiaXRzSWlkRnJlcSkgeworICAgICAgZGlmZk1vZGVbZW52XSA9IFBTX0RFTFRBX0ZSRVE7CiAgICAgICBiaXRzQ29hcnNlVG90ICs9IGJpdHNJaWRGcmVxOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGRpZmZNb2RlW2Vudl0gID0gUFNfREVMVEFfVElNRTsKKyAgICB9IGVsc2UgeworICAgICAgZGlmZk1vZGVbZW52XSA9IFBTX0RFTFRBX1RJTUU7CiAgICAgICBiaXRzQ29hcnNlVG90ICs9IGJpdHNJaWRUaW1lOwogICAgIH0KICAgfQogCi0KICAgLyogY291bnQgRklORSBxdWFudGl6YXRpb24gYml0cyBmb3IgZmlyc3QgZW52ZWxvcGUqLwotICBiaXRzSWlkRnJlcSA9IEZES3NickVuY19FbmNvZGVJaWQoTlVMTCwgaWlkSWR4RmluZVswXSwgICBOVUxMLCBwc0JhbmRzLCBQU19JSURfUkVTX0ZJTkUsICAgUFNfREVMVEFfRlJFUSwgJmVycm9yKTsKKyAgYml0c0lpZEZyZXEgPSBGREtzYnJFbmNfRW5jb2RlSWlkKE5VTEwsIGlpZElkeEZpbmVbMF0sIE5VTEwsIHBzQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU19JSURfUkVTX0ZJTkUsIFBTX0RFTFRBX0ZSRVEsICZlcnJvcik7CiAKLSAgaWYoIChwc0RhdGEtPmlpZFRpbWVDbnQ+PU1BWF9USU1FX0RJRkZfRlJBTUVTKSB8fCAocHNEYXRhLT5paWRRdWFudE1vZGVMYXN0PT1QU19JSURfUkVTX0NPQVJTRSkgKSB7CisgIGlmICgocHNEYXRhLT5paWRUaW1lQ250ID49IE1BWF9USU1FX0RJRkZfRlJBTUVTKSB8fAorICAgICAgKHBzRGF0YS0+aWlkUXVhbnRNb2RlTGFzdCA9PSBQU19JSURfUkVTX0NPQVJTRSkpIHsKICAgICBiaXRzSWlkVGltZSA9IERPX05PVF9VU0VfVEhJU19NT0RFOwotICB9Ci0gIGVsc2UgewotICAgIGJpdHNJaWRUaW1lID0gRkRLc2JyRW5jX0VuY29kZUlpZChOVUxMLCBpaWRJZHhGaW5lWzBdLCAgcHNEYXRhLT5paWRJZHhMYXN0LCBwc0JhbmRzLCBQU19JSURfUkVTX0ZJTkUsIFBTX0RFTFRBX1RJTUUsICZlcnJvcik7CisgIH0gZWxzZSB7CisgICAgYml0c0lpZFRpbWUgPQorICAgICAgICBGREtzYnJFbmNfRW5jb2RlSWlkKE5VTEwsIGlpZElkeEZpbmVbMF0sIHBzRGF0YS0+aWlkSWR4TGFzdCwgcHNCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU19JSURfUkVTX0ZJTkUsIFBTX0RFTFRBX1RJTUUsICZlcnJvcik7CiAgIH0KIAogICAvKiBkZWNpc2lvbiBERUxUQV9GUkVRIHZzIERFTFRBX1RJTUUgKi8KLSAgaWYoYml0c0lpZFRpbWU+Yml0c0lpZEZyZXEpIHsKLSAgICBkaWZmTW9kZUZpbmVbMF0gICA9IFBTX0RFTFRBX0ZSRVE7Ci0gICAgYml0c0ZpbmVUb3QgICAgICAgPSBiaXRzSWlkRnJlcTsKLSAgfQotICBlbHNlIHsKLSAgICBkaWZmTW9kZUZpbmVbMF0gICA9IFBTX0RFTFRBX1RJTUU7Ci0gICAgYml0c0ZpbmVUb3QgICAgICAgPSBiaXRzSWlkVGltZTsKKyAgaWYgKGJpdHNJaWRUaW1lID4gYml0c0lpZEZyZXEpIHsKKyAgICBkaWZmTW9kZUZpbmVbMF0gPSBQU19ERUxUQV9GUkVROworICAgIGJpdHNGaW5lVG90ID0gYml0c0lpZEZyZXE7CisgIH0gZWxzZSB7CisgICAgZGlmZk1vZGVGaW5lWzBdID0gUFNfREVMVEFfVElNRTsKKyAgICBiaXRzRmluZVRvdCA9IGJpdHNJaWRUaW1lOwogICB9CiAKICAgLyogY291bnQgRklORSBxdWFudGl6YXRpb24gYml0cyBmb3IgZm9sbG93aW5nIGVudmVsb3BlcyovCi0gIGZvcihlbnY9MTtlbnY8bkVudmVsb3BlczsgZW52KyspIHsKLSAgICBiaXRzSWlkRnJlcSA9IEZES3NickVuY19FbmNvZGVJaWQoTlVMTCwgaWlkSWR4RmluZVtlbnZdLCAgIE5VTEwsICAgICAgICAgICAgICBwc0JhbmRzLCBQU19JSURfUkVTX0ZJTkUsIFBTX0RFTFRBX0ZSRVEsICZlcnJvcik7Ci0gICAgYml0c0lpZFRpbWUgPSBGREtzYnJFbmNfRW5jb2RlSWlkKE5VTEwsIGlpZElkeEZpbmVbZW52XSwgICBpaWRJZHhGaW5lW2Vudi0xXSwgcHNCYW5kcywgUFNfSUlEX1JFU19GSU5FLCBQU19ERUxUQV9USU1FLCAmZXJyb3IpOworICBmb3IgKGVudiA9IDE7IGVudiA8IG5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgYml0c0lpZEZyZXEgPSBGREtzYnJFbmNfRW5jb2RlSWlkKE5VTEwsIGlpZElkeEZpbmVbZW52XSwgTlVMTCwgcHNCYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfSUlEX1JFU19GSU5FLCBQU19ERUxUQV9GUkVRLCAmZXJyb3IpOworICAgIGJpdHNJaWRUaW1lID0KKyAgICAgICAgRkRLc2JyRW5jX0VuY29kZUlpZChOVUxMLCBpaWRJZHhGaW5lW2Vudl0sIGlpZElkeEZpbmVbZW52IC0gMV0sIHBzQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfSUlEX1JFU19GSU5FLCBQU19ERUxUQV9USU1FLCAmZXJyb3IpOwogCiAgICAgLyogZGVjaXNpb24gREVMVEFfRlJFUSB2cyBERUxUQV9USU1FICovCi0gICAgaWYoYml0c0lpZFRpbWU+Yml0c0lpZEZyZXEpIHsKLSAgICAgIGRpZmZNb2RlRmluZVtlbnZdICA9IFBTX0RFTFRBX0ZSRVE7CisgICAgaWYgKGJpdHNJaWRUaW1lID4gYml0c0lpZEZyZXEpIHsKKyAgICAgIGRpZmZNb2RlRmluZVtlbnZdID0gUFNfREVMVEFfRlJFUTsKICAgICAgIGJpdHNGaW5lVG90ICs9IGJpdHNJaWRGcmVxOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGRpZmZNb2RlRmluZVtlbnZdICA9IFBTX0RFTFRBX1RJTUU7Ci0gICAgICBiaXRzRmluZVRvdCAgICAgICArPSBiaXRzSWlkVGltZTsKKyAgICB9IGVsc2UgeworICAgICAgZGlmZk1vZGVGaW5lW2Vudl0gPSBQU19ERUxUQV9USU1FOworICAgICAgYml0c0ZpbmVUb3QgKz0gYml0c0lpZFRpbWU7CiAgICAgfQogICB9CiAKLSAgaWYoYml0c0ZpbmVUb3QgPT0gYml0c0NvYXJzZVRvdCl7Ci0gICAgLyogaWYgc2FtZSBudW1iZXIgb2YgYml0cyBpcyBuZWVkZWQsIHVzZSB0aGUgcXVhbnRpemF0aW9uIHdpdGggbG93ZXIgZXJyb3IgKi8KLSAgICBpZihlcnJJSURGaW5lIDwgZXJySUlEKXsKKyAgaWYgKGJpdHNGaW5lVG90ID09IGJpdHNDb2Fyc2VUb3QpIHsKKyAgICAvKiBpZiBzYW1lIG51bWJlciBvZiBiaXRzIGlzIG5lZWRlZCwgdXNlIHRoZSBxdWFudGl6YXRpb24gd2l0aCBsb3dlciBlcnJvcgorICAgICAqLworICAgIGlmIChlcnJJSURGaW5lIDwgZXJySUlEKSB7CiAgICAgICBiaXRzQ29hcnNlVG90ID0gRE9fTk9UX1VTRV9USElTX01PREU7CiAgICAgfSBlbHNlIHsKICAgICAgIGJpdHNGaW5lVG90ID0gRE9fTk9UX1VTRV9USElTX01PREU7CiAgICAgfQogICB9IGVsc2UgewotICAgIC8qIGNvbnN0IEZJWFBfREJMIG1pblRocmVzaG9sZCA9IEZMMkZYQ09OU1RfREJMKDAuMmYvKElJRF9TQ0FMRV9GVCpQU19RVUFOVF9TQ0FMRV9GVCkqKHBzQmFuZHMqbkVudmVsb3BlcykpOyAqLwotICAgIGNvbnN0IEZJWFBfREJMIG1pblRocmVzaG9sZCA9IChGSVhQX0RCTCkoKExPTkcpMHgwMDAxOTk5OSAqIChwc0JhbmRzKm5FbnZlbG9wZXMpKTsKKyAgICAvKiBjb25zdCBGSVhQX0RCTCBtaW5UaHJlc2hvbGQgPQorICAgICAqIEZMMkZYQ09OU1RfREJMKDAuMmYvKElJRF9TQ0FMRV9GVCpQU19RVUFOVF9TQ0FMRV9GVCkqKHBzQmFuZHMqbkVudmVsb3BlcykpOworICAgICAqLworICAgIGNvbnN0IEZJWFBfREJMIG1pblRocmVzaG9sZCA9CisgICAgICAgIChGSVhQX0RCTCkoKExPTkcpMHgwMDAxOTk5OSAqIChwc0JhbmRzICogbkVudmVsb3BlcykpOwogCiAgICAgLyogZGVjaXNpb24gUkVTX0ZJTkUgdnMgUkVTX0NPQVJTRSAgICAgICAgICAgICAgICAgKi8KICAgICAvKiB0ZXN0IGlmIGVycklJREZpbmUqcXVhbnRFcnJvclRocmVzaG9sZCA8IGVycklJRCAqLwogICAgIC8qIHNoaWZ0VmFsIDIgY29tZXMgZnJvbSBzY2FsaW5nIG9mIHF1YW50RXJyb3JUaHJlc2hvbGQgKi8KLSAgICBpZihmaXhNYXgoKChlcnJJSURGaW5lPj4xKSsobWluVGhyZXNob2xkPj4xKSk+PjEsIGZNdWx0KHF1YW50RXJyb3JUaHJlc2hvbGQsZXJySUlERmluZSkpIDwgKGVycklJRD4+MikgKSB7CisgICAgaWYgKGZpeE1heCgoKGVycklJREZpbmUgPj4gMSkgKyAobWluVGhyZXNob2xkID4+IDEpKSA+PiAxLAorICAgICAgICAgICAgICAgZk11bHQocXVhbnRFcnJvclRocmVzaG9sZCwgZXJySUlERmluZSkpIDwgKGVycklJRCA+PiAyKSkgewogICAgICAgYml0c0NvYXJzZVRvdCA9IERPX05PVF9VU0VfVEhJU19NT0RFOwotICAgIH0KLSAgICBlbHNlIGlmKGZpeE1heCgoKGVycklJRD4+MSkrKG1pblRocmVzaG9sZD4+MSkpPj4xLCBmTXVsdChxdWFudEVycm9yVGhyZXNob2xkLGVycklJRCkpIDwgKGVycklJREZpbmU+PjIpICkgeworICAgIH0gZWxzZSBpZiAoZml4TWF4KCgoZXJySUlEID4+IDEpICsgKG1pblRocmVzaG9sZCA+PiAxKSkgPj4gMSwKKyAgICAgICAgICAgICAgICAgICAgICBmTXVsdChxdWFudEVycm9yVGhyZXNob2xkLCBlcnJJSUQpKSA8IChlcnJJSURGaW5lID4+IDIpKSB7CiAgICAgICBiaXRzRmluZVRvdCA9IERPX05PVF9VU0VfVEhJU19NT0RFOwogICAgIH0KICAgfQogCiAgIC8qIGRlY2lzaW9uIFJFU19GSU5FIHZzIFJFU19DT0FSU0UgKi8KLSAgaWYoYml0c0ZpbmVUb3Q8Yml0c0NvYXJzZVRvdCkgeworICBpZiAoYml0c0ZpbmVUb3QgPCBiaXRzQ29hcnNlVG90KSB7CiAgICAgcHNEYXRhLT5paWRRdWFudE1vZGUgPSBQU19JSURfUkVTX0ZJTkU7Ci0gICAgZm9yKGVudj0wO2VudjxuRW52ZWxvcGVzOyBlbnYrKykgeworICAgIGZvciAoZW52ID0gMDsgZW52IDwgbkVudmVsb3BlczsgZW52KyspIHsKICAgICAgIHBzRGF0YS0+aWlkRGlmZk1vZGVbZW52XSA9IGRpZmZNb2RlRmluZVtlbnZdOwotICAgICAgRkRLbWVtY3B5KHBzRGF0YS0+aWlkSWR4W2Vudl0sIGlpZElkeEZpbmVbZW52XSwgcHNCYW5kcypzaXplb2YoSU5UKSk7CisgICAgICBGREttZW1jcHkocHNEYXRhLT5paWRJZHhbZW52XSwgaWlkSWR4RmluZVtlbnZdLCBwc0JhbmRzICogc2l6ZW9mKElOVCkpOwogICAgIH0KLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBwc0RhdGEtPmlpZFF1YW50TW9kZSA9IFBTX0lJRF9SRVNfQ09BUlNFOwotICAgIGZvcihlbnY9MDtlbnY8bkVudmVsb3BlczsgZW52KyspIHsKKyAgICBmb3IgKGVudiA9IDA7IGVudiA8IG5FbnZlbG9wZXM7IGVudisrKSB7CiAgICAgICBwc0RhdGEtPmlpZERpZmZNb2RlW2Vudl0gPSBkaWZmTW9kZVtlbnZdOwotICAgICAgRkRLbWVtY3B5KHBzRGF0YS0+aWlkSWR4W2Vudl0sIGlpZElkeENvYXJzZVtlbnZdLCBwc0JhbmRzKnNpemVvZihJTlQpKTsKKyAgICAgIEZES21lbWNweShwc0RhdGEtPmlpZElkeFtlbnZdLCBpaWRJZHhDb2Fyc2VbZW52XSwgcHNCYW5kcyAqIHNpemVvZihJTlQpKTsKICAgICB9CiAgIH0KIAogICAvKiBDb3VudCBERUxUQV9USU1FIGVuY29kaW5nIHN0cmVha3MgKi8KLSAgZm9yKGVudj0wO2VudjxuRW52ZWxvcGVzOyBlbnYrKykgewotICAgIGlmKHBzRGF0YS0+aWlkRGlmZk1vZGVbZW52XT09UFNfREVMVEFfVElNRSkKKyAgZm9yIChlbnYgPSAwOyBlbnYgPCBuRW52ZWxvcGVzOyBlbnYrKykgeworICAgIGlmIChwc0RhdGEtPmlpZERpZmZNb2RlW2Vudl0gPT0gUFNfREVMVEFfVElNRSkKICAgICAgIHBzRGF0YS0+aWlkVGltZUNudCsrOwogICAgIGVsc2UKLSAgICAgIHBzRGF0YS0+aWlkVGltZUNudD0wOworICAgICAgcHNEYXRhLT5paWRUaW1lQ250ID0gMDsKICAgfQogfQogCi0KLXN0YXRpYyBJTlQgc2ltaWxhcklpZChQU19EQVRBICAgKnBzRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgIHBzQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICBuRW52ZWxvcGVzKQoteworc3RhdGljIElOVCBzaW1pbGFySWlkKFBTX0RBVEEgKnBzRGF0YSwgY29uc3QgSU5UIHBzQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5FbnZlbG9wZXMpIHsKICAgY29uc3QgSU5UIGRpZmZUaHIgPSAocHNEYXRhLT5paWRRdWFudE1vZGUgPT0gUFNfSUlEX1JFU19DT0FSU0UpID8gMiA6IDM7Ci0gIGNvbnN0IElOVCBzdW1EaWZmVGhyID0gZGlmZlRociAqIHBzQmFuZHMvNDsKKyAgY29uc3QgSU5UIHN1bURpZmZUaHIgPSBkaWZmVGhyICogcHNCYW5kcyAvIDQ7CiAgIElOVCBzaW1pbGFyID0gMDsKLSAgSU5UIGRpZmYgICAgPSAwOworICBJTlQgZGlmZiA9IDA7CiAgIElOVCBzdW1EaWZmID0gMDsKICAgSU5UIGVudiA9IDA7Ci0gIElOVCBiICAgPSAwOwotICBpZiAoKG5FbnZlbG9wZXMgPT0gcHNEYXRhLT5uRW52ZWxvcGVzTGFzdCkgJiYgKG5FbnZlbG9wZXM9PTEpKSB7CisgIElOVCBiID0gMDsKKyAgaWYgKChuRW52ZWxvcGVzID09IHBzRGF0YS0+bkVudmVsb3Blc0xhc3QpICYmIChuRW52ZWxvcGVzID09IDEpKSB7CiAgICAgc2ltaWxhciA9IDE7Ci0gICAgZm9yIChlbnY9MDsgZW52PG5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgZm9yIChlbnYgPSAwOyBlbnYgPCBuRW52ZWxvcGVzOyBlbnYrKykgewogICAgICAgc3VtRGlmZiA9IDA7CiAgICAgICBiID0gMDsKICAgICAgIGRvIHsKICAgICAgICAgZGlmZiA9IGZpeHBfYWJzKHBzRGF0YS0+aWlkSWR4W2Vudl1bYl0gLSBwc0RhdGEtPmlpZElkeExhc3RbYl0pOwogICAgICAgICBzdW1EaWZmICs9IGRpZmY7Ci0gICAgICAgIGlmICggKGRpZmYgPiBkaWZmVGhyKSAvKiBtb3JlIHRoYW4geCBxdWFudGl6YXRpb24gc3RlcHMgaW4gYW55IGJhbmQgKi8KLSAgICAgICAgICAgICB8fCAoc3VtRGlmZiA+IHN1bURpZmZUaHIpICkgeyAgLyogbW9yZSB0aGFuIHggcXVhbnRpc2F0aW9ucyBzdGVwcyBvdmVyYWxsIGRpZmZlcmVuY2UgKi8KKyAgICAgICAgaWYgKChkaWZmID4gZGlmZlRocikgLyogbW9yZSB0aGFuIHggcXVhbnRpemF0aW9uIHN0ZXBzIGluIGFueSBiYW5kICovCisgICAgICAgICAgICB8fCAoc3VtRGlmZiA+IHN1bURpZmZUaHIpKSB7IC8qIG1vcmUgdGhhbiB4IHF1YW50aXNhdGlvbnMgc3RlcHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmFsbCBkaWZmZXJlbmNlICovCiAgICAgICAgICAgc2ltaWxhciA9IDA7CiAgICAgICAgIH0KICAgICAgICAgYisrOwotICAgICAgfSB3aGlsZSAoKGI8cHNCYW5kcykgJiYgKHNpbWlsYXI+MCkpOworICAgICAgfSB3aGlsZSAoKGIgPCBwc0JhbmRzKSAmJiAoc2ltaWxhciA+IDApKTsKICAgICB9CiAgIH0gLyogbkVudmVsb3Blcz09MSAgKi8KIAogICByZXR1cm4gc2ltaWxhcjsKIH0KIAotCi1zdGF0aWMgSU5UIHNpbWlsYXJJY2MoUFNfREFUQSAqcHNEYXRhLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICBwc0JhbmRzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICBuRW52ZWxvcGVzKQoteworc3RhdGljIElOVCBzaW1pbGFySWNjKFBTX0RBVEEgKnBzRGF0YSwgY29uc3QgSU5UIHBzQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5FbnZlbG9wZXMpIHsKICAgY29uc3QgSU5UIGRpZmZUaHIgPSAyOwotICBjb25zdCBJTlQgc3VtRGlmZlRociA9IGRpZmZUaHIgKiBwc0JhbmRzLzQ7CisgIGNvbnN0IElOVCBzdW1EaWZmVGhyID0gZGlmZlRociAqIHBzQmFuZHMgLyA0OwogICBJTlQgc2ltaWxhciA9IDA7Ci0gIElOVCBkaWZmICAgID0gMDsKKyAgSU5UIGRpZmYgPSAwOwogICBJTlQgc3VtRGlmZiA9IDA7CiAgIElOVCBlbnYgPSAwOwotICBJTlQgYiAgID0gMDsKLSAgaWYgKChuRW52ZWxvcGVzID09IHBzRGF0YS0+bkVudmVsb3Blc0xhc3QpICYmIChuRW52ZWxvcGVzPT0xKSkgeworICBJTlQgYiA9IDA7CisgIGlmICgobkVudmVsb3BlcyA9PSBwc0RhdGEtPm5FbnZlbG9wZXNMYXN0KSAmJiAobkVudmVsb3BlcyA9PSAxKSkgewogICAgIHNpbWlsYXIgPSAxOwotICAgIGZvciAoZW52PTA7IGVudjxuRW52ZWxvcGVzOyBlbnYrKykgeworICAgIGZvciAoZW52ID0gMDsgZW52IDwgbkVudmVsb3BlczsgZW52KyspIHsKICAgICAgIHN1bURpZmYgPSAwOwogICAgICAgYiA9IDA7CiAgICAgICBkbyB7CiAgICAgICAgIGRpZmYgPSBmaXhwX2Ficyhwc0RhdGEtPmljY0lkeFtlbnZdW2JdIC0gcHNEYXRhLT5pY2NJZHhMYXN0W2JdKTsKICAgICAgICAgc3VtRGlmZiArPSBkaWZmOwotICAgICAgICBpZiAoIChkaWZmID4gZGlmZlRocikgLyogbW9yZSB0aGFuIHggcXVhbnRpc2F0aW9uIHN0ZXAgaW4gYW55IGJhbmQgKi8KLSAgICAgICAgICAgICB8fCAoc3VtRGlmZiA+IHN1bURpZmZUaHIpICkgeyAgLyogbW9yZSB0aGFuIHggcXVhbnRpc2F0aW9ucyBzdGVwcyBvdmVyYWxsIGRpZmZlcmVuY2UgKi8KKyAgICAgICAgaWYgKChkaWZmID4gZGlmZlRocikgLyogbW9yZSB0aGFuIHggcXVhbnRpc2F0aW9uIHN0ZXAgaW4gYW55IGJhbmQgKi8KKyAgICAgICAgICAgIHx8IChzdW1EaWZmID4gc3VtRGlmZlRocikpIHsgLyogbW9yZSB0aGFuIHggcXVhbnRpc2F0aW9ucyBzdGVwcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyYWxsIGRpZmZlcmVuY2UgKi8KICAgICAgICAgICBzaW1pbGFyID0gMDsKICAgICAgICAgfQogICAgICAgICBiKys7Ci0gICAgICB9IHdoaWxlICgoYjxwc0JhbmRzKSAmJiAoc2ltaWxhcj4wKSk7CisgICAgICB9IHdoaWxlICgoYiA8IHBzQmFuZHMpICYmIChzaW1pbGFyID4gMCkpOwogICAgIH0KICAgfSAvKiBuRW52ZWxvcGVzPT0xICAqLwogCiAgIHJldHVybiBzaW1pbGFyOwogfQogCi1zdGF0aWMgdm9pZCBwcm9jZXNzSWNjRGF0YShQU19EQVRBICAgKnBzRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgaWNjW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU10sIC8qIGNvbnN0IGlucHV0IHZhbHVlczogdW5hYmxlIHRvIGRlY2xhcmUgYXMgY29uc3QsIHNpbmNlIGl0IGRvZXMgbm90IHBvSU5UIHRvIGNvbnN0IG1lbW9yeSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICBwc0JhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICBuRW52ZWxvcGVzKQoteworc3RhdGljIHZvaWQgcHJvY2Vzc0ljY0RhdGEoCisgICAgUFNfREFUQSAqcHNEYXRhLAorICAgIEZJWFBfREJMIGljY1tQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdLCAvKiBjb25zdCBpbnB1dCB2YWx1ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBkZWNsYXJlIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0LCBzaW5jZSBpdCBkb2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBwb0lOVCB0byBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgKi8KKyAgICBjb25zdCBJTlQgcHNCYW5kcywgY29uc3QgSU5UIG5FbnZlbG9wZXMpIHsKICAgRklYUF9EQkwgZXJySUNDID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKLSAgSU5UICAgZW52LCBiYW5kOwotICBJTlQgICBiaXRzSWNjRnJlcSwgYml0c0ljY1RpbWU7Ci0gIElOVCAgIGVycm9yID0gMDsKLSAgSU5UICAgaW5Db2hlcmVuY2U9MCwgaWNjVHJhbnNtaXQ9MDsKLSAgSU5UICAqaWNjSWR4TGFzdDsKKyAgSU5UIGVudiwgYmFuZDsKKyAgSU5UIGJpdHNJY2NGcmVxLCBiaXRzSWNjVGltZTsKKyAgSU5UIGVycm9yID0gMDsKKyAgSU5UIGluQ29oZXJlbmNlID0gMCwgaWNjVHJhbnNtaXQgPSAwOworICBJTlQgKmljY0lkeExhc3Q7CiAKICAgaWNjSWR4TGFzdCA9IHBzRGF0YS0+aWNjSWR4TGFzdDsKIAogICAvKiBRdWFudGl6ZSBJQ0MgY29lZmZpY2llbnRzICovCi0gIGZvcihlbnY9MDtlbnY8bkVudmVsb3BlczsgZW52KyspIHsKLSAgICBlcnJJQ0MgKz0gcXVhbnRpemVDb2VmKGljY1tlbnZdLCBwc0JhbmRzLCBpY2NRdWFudCwgMCwgOCwgcHNEYXRhLT5pY2NJZHhbZW52XSk7CisgIGZvciAoZW52ID0gMDsgZW52IDwgbkVudmVsb3BlczsgZW52KyspIHsKKyAgICBlcnJJQ0MgKz0KKyAgICAgICAgcXVhbnRpemVDb2VmKGljY1tlbnZdLCBwc0JhbmRzLCBpY2NRdWFudCwgMCwgOCwgcHNEYXRhLT5pY2NJZHhbZW52XSk7CiAgIH0KIAogICAvKiBDaGVjayBpZiBJQ0MgY29lZmZpY2llbnRzIHNob3VsZCBiZSB1c2VkICovCiAgIHBzRGF0YS0+aWNjRW5hYmxlID0gMDsKLSAgZm9yKGVudj0wO2VudjxuRW52ZWxvcGVzOyBlbnYrKykgewotICAgIGZvcihiYW5kPTA7YmFuZDxwc0JhbmRzO2JhbmQrKykgeworICBmb3IgKGVudiA9IDA7IGVudiA8IG5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IHBzQmFuZHM7IGJhbmQrKykgewogICAgICAgaW5Db2hlcmVuY2UgKz0gcHNEYXRhLT5pY2NJZHhbZW52XVtiYW5kXTsKLSAgICAgIGljY1RyYW5zbWl0ICsrOworICAgICAgaWNjVHJhbnNtaXQrKzsKICAgICB9CiAgIH0KLSAgaWYoaW5Db2hlcmVuY2UgPiBmTXVsdEkoRkwyRlhDT05TVF9EQkwoMC41ZiksaWNjVHJhbnNtaXQpKXsgICAvKiAwLjVmIGVtcGlyaWMgdmFsdWUgKi8KKyAgaWYgKGluQ29oZXJlbmNlID4KKyAgICAgIGZNdWx0SShGTDJGWENPTlNUX0RCTCgwLjVmKSwgaWNjVHJhbnNtaXQpKSB7IC8qIDAuNWYgZW1waXJpYyB2YWx1ZSAqLwogICAgIHBzRGF0YS0+aWNjRW5hYmxlID0gMTsKICAgfQogCi0gIGlmKHBzRGF0YS0+aWNjRW5hYmxlPT0wKSB7CisgIGlmIChwc0RhdGEtPmljY0VuYWJsZSA9PSAwKSB7CiAgICAgcHNEYXRhLT5pY2NUaW1lQ250ID0gTUFYX1RJTUVfRElGRl9GUkFNRVM7Ci0gICAgZm9yKGVudj0wO2VudjxuRW52ZWxvcGVzOyBlbnYrKykgeworICAgIGZvciAoZW52ID0gMDsgZW52IDwgbkVudmVsb3BlczsgZW52KyspIHsKICAgICAgIHBzRGF0YS0+aWNjRGlmZk1vZGVbZW52XSA9IFBTX0RFTFRBX0ZSRVE7Ci0gICAgICBGREttZW1jbGVhcihwc0RhdGEtPmljY0lkeFtlbnZdLCBzaXplb2YoSU5UKSpwc0JhbmRzKTsKKyAgICAgIEZES21lbWNsZWFyKHBzRGF0YS0+aWNjSWR4W2Vudl0sIHNpemVvZihJTlQpICogcHNCYW5kcyk7CiAgICAgfQogICAgIHJldHVybjsKICAgfQogCi0gIGZvcihlbnY9MDtlbnY8bkVudmVsb3BlczsgZW52KyspIHsKLSAgICBiaXRzSWNjRnJlcSAgPSBGREtzYnJFbmNfRW5jb2RlSWNjKE5VTEwsIHBzRGF0YS0+aWNjSWR4W2Vudl0sICAgTlVMTCwgICAgICAgcHNCYW5kcywgUFNfREVMVEFfRlJFUSwgJmVycm9yKTsKKyAgZm9yIChlbnYgPSAwOyBlbnYgPCBuRW52ZWxvcGVzOyBlbnYrKykgeworICAgIGJpdHNJY2NGcmVxID0gRkRLc2JyRW5jX0VuY29kZUljYyhOVUxMLCBwc0RhdGEtPmljY0lkeFtlbnZdLCBOVUxMLCBwc0JhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU19ERUxUQV9GUkVRLCAmZXJyb3IpOwogCi0gICAgaWYocHNEYXRhLT5pY2NUaW1lQ250PE1BWF9USU1FX0RJRkZfRlJBTUVTKSB7Ci0gICAgICBiaXRzSWNjVGltZSAgPSBGREtzYnJFbmNfRW5jb2RlSWNjKE5VTEwsIHBzRGF0YS0+aWNjSWR4W2Vudl0sIGljY0lkeExhc3QsIHBzQmFuZHMsIFBTX0RFTFRBX1RJTUUsICZlcnJvcik7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgYml0c0ljY1RpbWUgID0gRE9fTk9UX1VTRV9USElTX01PREU7CisgICAgaWYgKHBzRGF0YS0+aWNjVGltZUNudCA8IE1BWF9USU1FX0RJRkZfRlJBTUVTKSB7CisgICAgICBiaXRzSWNjVGltZSA9IEZES3NickVuY19FbmNvZGVJY2MoTlVMTCwgcHNEYXRhLT5pY2NJZHhbZW52XSwgaWNjSWR4TGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0JhbmRzLCBQU19ERUxUQV9USU1FLCAmZXJyb3IpOworICAgIH0gZWxzZSB7CisgICAgICBiaXRzSWNjVGltZSA9IERPX05PVF9VU0VfVEhJU19NT0RFOwogICAgIH0KIAotICAgIGlmKGJpdHNJY2NGcmVxPmJpdHNJY2NUaW1lKSB7CisgICAgaWYgKGJpdHNJY2NGcmVxID4gYml0c0ljY1RpbWUpIHsKICAgICAgIHBzRGF0YS0+aWNjRGlmZk1vZGVbZW52XSA9IFBTX0RFTFRBX1RJTUU7CiAgICAgICBwc0RhdGEtPmljY1RpbWVDbnQrKzsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIHBzRGF0YS0+aWNjRGlmZk1vZGVbZW52XSA9IFBTX0RFTFRBX0ZSRVE7Ci0gICAgICBwc0RhdGEtPmljY1RpbWVDbnQ9MDsKKyAgICAgIHBzRGF0YS0+aWNjVGltZUNudCA9IDA7CiAgICAgfQogICAgIGljY0lkeExhc3QgPSBwc0RhdGEtPmljY0lkeFtlbnZdOwogICB9CkBAIC02MzksMTYzICs2NDIsMTQ4IEBACiBzdGF0aWMgdm9pZCBjYWxjdWxhdGVJSUQoRklYUF9EQkwgbGRQd3JMW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgbGRQd3JSW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgaWlkW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgbkVudmVsb3BlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBwc0JhbmRzKQotewotICBJTlQgaT0wOwotICBJTlQgZW52PTA7Ci0gIGZvcihlbnY9MDsgZW52PG5FbnZlbG9wZXM7ZW52KyspIHsKLSAgICBmb3IgKGk9MDsgaTxwc0JhbmRzOyBpKyspIHsKLQorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBuRW52ZWxvcGVzLCBJTlQgcHNCYW5kcykgeworICBJTlQgaSA9IDA7CisgIElOVCBlbnYgPSAwOworICBmb3IgKGVudiA9IDA7IGVudiA8IG5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHBzQmFuZHM7IGkrKykgewogICAgICAgLyogaWlkW2Vudl1baV0gPSAxMC4wZiooZmxvYXQpbG9nMTAocHdyTFtlbnZdW2ldL3B3clJbZW52XVtpXSk7Ci0gICAgICAqLwotICAgICAgRklYUF9EQkwgSUlEID0gZk11bHREaXYyKCBGTDJGWENPTlNUX0RCTChMT0cxMF8yXzEwL0lJRF9TQ0FMRV9GVCksIChsZFB3ckxbZW52XVtpXS1sZFB3clJbZW52XVtpXSkgKTsKKyAgICAgICAqLworICAgICAgRklYUF9EQkwgSUlEID0gZk11bHREaXYyKEZMMkZYQ09OU1RfREJMKExPRzEwXzJfMTAgLyBJSURfU0NBTEVfRlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZFB3ckxbZW52XVtpXSAtIGxkUHdyUltlbnZdW2ldKSk7CiAKLSAgICAgIElJRCA9IGZpeE1pbiggSUlELCAoRklYUF9EQkwpKE1BWFZBTF9EQkw+PihMRF9EQVRBX1NISUZUKzEpKSApOwotICAgICAgSUlEID0gZml4TWF4KCBJSUQsIChGSVhQX0RCTCkoTUlOVkFMX0RCTD4+KExEX0RBVEFfU0hJRlQrMSkpICk7Ci0gICAgICBpaWRbZW52XVtpXSA9IElJRCA8PCAoTERfREFUQV9TSElGVCsxKTsKKyAgICAgIElJRCA9IGZpeE1pbihJSUQsIChGSVhQX0RCTCkoTUFYVkFMX0RCTCA+PiAoTERfREFUQV9TSElGVCArIDEpKSk7CisgICAgICBJSUQgPSBmaXhNYXgoSUlELCAoRklYUF9EQkwpKE1JTlZBTF9EQkwgPj4gKExEX0RBVEFfU0hJRlQgKyAxKSkpOworICAgICAgaWlkW2Vudl1baV0gPSBJSUQgPDwgKExEX0RBVEFfU0hJRlQgKyAxKTsKICAgICB9CiAgIH0KIH0KIAotc3RhdGljIHZvaWQgY2FsY3VsYXRlSUNDKEZJWFBfREJMIGxkUHdyTFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGxkUHdyUltQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdLAorc3RhdGljIHZvaWQgY2FsY3VsYXRlSUNDKEZJWFBfREJMIHB3ckxbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBwd3JSW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgcHdyQ3JbUFNfTUFYX0VOVkVMT1BFU11bUFNfTUFYX0JBTkRTXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBwd3JDaVtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdLAogICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIGljY1tQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIG5FbnZlbG9wZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgcHNCYW5kcykKLXsKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbkVudmVsb3BlcywgSU5UIHBzQmFuZHMpIHsKICAgSU5UIGkgPSAwOwogICBJTlQgZW52ID0gMDsKICAgSU5UIGJvcmRlciA9IHBzQmFuZHM7CiAKICAgc3dpdGNoIChwc0JhbmRzKSB7Ci0gIGNhc2UgUFNfQkFORFNfQ09BUlNFOgotICAgIGJvcmRlciA9IDU7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgUFNfQkFORFNfTUlEOgotICAgIGJvcmRlciA9IDExOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIGJyZWFrOworICAgIGNhc2UgUFNfQkFORFNfQ09BUlNFOgorICAgICAgYm9yZGVyID0gNTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNfQkFORFNfTUlEOgorICAgICAgYm9yZGVyID0gMTE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CiAgIH0KIAotICBmb3IoZW52PTA7IGVudjxuRW52ZWxvcGVzO2VudisrKSB7Ci0gICAgZm9yIChpPTA7IGk8Ym9yZGVyOyBpKyspIHsKLQotICAgICAgLyogaWNjW2Vudl1baV0gPSBtaW4oIHB3ckNyW2Vudl1baV0gLyAoZmxvYXQpIHNxcnQocHdyTFtlbnZdW2ldICogcHdyUltlbnZdW2ldKSAsIDEuZik7Ci0gICAgICAqLwotICAgICAgRklYUF9EQkwgSUNDLCBpbnZOcmcgPSBDYWxjSW52TGREYXRhICggLSgobGRQd3JMW2Vudl1baV0+PjEpICsgKGxkUHdyUltlbnZdW2ldPj4xKSArIChGSVhQX0RCTCkxKSApOwotICAgICAgSU5UICAgICAgc2NhbGUsIGludlNjYWxlID0gQ291bnRMZWFkaW5nQml0cyhpbnZOcmcpOwotCi0gICAgICBzY2FsZSA9IChERlJBQ1RfQklUUy0xKSAtIGludlNjYWxlOwotICAgICAgSUNDID0gZk11bHQocHdyQ3JbZW52XVtpXSwgaW52TnJnPDxpbnZTY2FsZSkgOwotICAgICAgaWNjW2Vudl1baV0gPSBTQVRVUkFURV9MRUZUX1NISUZUKElDQywgc2NhbGUsIERGUkFDVF9CSVRTKTsKKyAgZm9yIChlbnYgPSAwOyBlbnYgPCBuRW52ZWxvcGVzOyBlbnYrKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBib3JkZXI7IGkrKykgeworICAgICAgLyogaWNjW2Vudl1baV0gPSBtaW4oIHB3ckNyW2Vudl1baV0gLyAoZmxvYXQpIHNxcnQocHdyTFtlbnZdW2ldICoKKyAgICAgICAqIHB3clJbZW52XVtpXSkgLCAxLmYpOworICAgICAgICovCisgICAgICBpbnQgc2NhbGU7CisgICAgICBGSVhQX0RCTCBpbnZOcmcgPSBpbnZTcXJ0Tm9ybTIoCisgICAgICAgICAgZk1heChmTXVsdChwd3JMW2Vudl1baV0sIHB3clJbZW52XVtpXSksIChGSVhQX0RCTCkxKSwgJnNjYWxlKTsKKyAgICAgIGljY1tlbnZdW2ldID0KKyAgICAgICAgICBTQVRVUkFURV9MRUZUX1NISUZUKGZNdWx0KHB3ckNyW2Vudl1baV0sIGludk5yZyksIHNjYWxlLCBERlJBQ1RfQklUUyk7CiAgICAgfQogCi0gICAgZm9yICg7IGk8cHNCYW5kczsgaSsrKSB7Ci0gICAgICBJTlQgc2MxLCBzYzI7Ci0gICAgICBGSVhQX0RCTCBjTnJnUiwgY05yZ0ksIElDQzsKKyAgICBmb3IgKDsgaSA8IHBzQmFuZHM7IGkrKykgeworICAgICAgaW50IGRlbm9tX2U7CisgICAgICBGSVhQX0RCTCBkZW5vbV9tID0gZk11bHROb3JtKHB3ckxbZW52XVtpXSwgcHdyUltlbnZdW2ldLCAmZGVub21fZSk7CiAKLSAgICAgIHNjMSA9IENvdW50TGVhZGluZ0JpdHMoIGZpeE1heChmaXhwX2Ficyhwd3JDcltlbnZdW2ldKSxmaXhwX2Ficyhwd3JDaVtlbnZdW2ldKSkgKSA7Ci0gICAgICBjTnJnUiA9IGZQb3cyRGl2MigocHdyQ3JbZW52XVtpXTw8c2MxKSk7ICAgICAgIC8qIHNxdWFyZWQgbnJnJ3MgZXhwZWN0IGV4cGxpY2l0IHNjYWxpbmcgKi8KLSAgICAgIGNOcmdJID0gZlBvdzJEaXYyKChwd3JDaVtlbnZdW2ldPDxzYzEpKTsKKyAgICAgIGlmIChkZW5vbV9tID09IChGSVhQX0RCTCkwKSB7CisgICAgICAgIGljY1tlbnZdW2ldID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgbnVtX2UsIHJlc3VsdF9lOworICAgICAgICBGSVhQX0RCTCBudW1fbSwgcmVzdWx0X207CiAKLSAgICAgIElDQyA9IENhbGNJbnZMZERhdGEoIChDYWxjTGREYXRhKChjTnJnUiArIGNOcmdJKT4+MSk+PjEpIC0gKEZJWFBfREJMKSgoc2MxLTEpPDwoREZSQUNUX0JJVFMtMS1MRF9EQVRBX1NISUZUKSkgKTsKKyAgICAgICAgbnVtX2UgPSBDb3VudExlYWRpbmdCaXRzKAorICAgICAgICAgICAgZml4TWF4KGZpeHBfYWJzKHB3ckNyW2Vudl1baV0pLCBmaXhwX2Ficyhwd3JDaVtlbnZdW2ldKSkpOworICAgICAgICBudW1fbSA9IGZQb3cyRGl2MigocHdyQ3JbZW52XVtpXSA8PCBudW1fZSkpICsKKyAgICAgICAgICAgICAgICBmUG93MkRpdjIoKHB3ckNpW2Vudl1baV0gPDwgbnVtX2UpKTsKIAotICAgICAgRklYUF9EQkwgaW52TnJnID0gQ2FsY0ludkxkRGF0YSAoIC0oKGxkUHdyTFtlbnZdW2ldPj4xKSArIChsZFB3clJbZW52XVtpXT4+MSkgKyAoRklYUF9EQkwpMSkgKTsKLSAgICAgIHNjMSA9IENvdW50TGVhZGluZ0JpdHMoaW52TnJnKTsKLSAgICAgIGludk5yZyA8PD0gc2MxOwotCi0gICAgICBzYzIgPSBDb3VudExlYWRpbmdCaXRzKElDQyk7Ci0gICAgICBJQ0MgPSBmTXVsdChJQ0M8PHNjMixpbnZOcmcpOwotCi0gICAgICBzYzEgPSAoIChERlJBQ1RfQklUUy0xKSAtIHNjMSAtIHNjMiApOwotICAgICAgaWYgKHNjMSA8IDApIHsKLSAgICAgICAgICBJQ0MgPj49IC1zYzE7CisgICAgICAgIHJlc3VsdF9tID0gZkRpdk5vcm0obnVtX20sIGRlbm9tX20sICZyZXN1bHRfZSk7CisgICAgICAgIHJlc3VsdF9lICs9ICgtMiAqIG51bV9lICsgMSkgLSBkZW5vbV9lOworICAgICAgICBpY2NbZW52XVtpXSA9IHNjYWxlVmFsdWVTYXR1cmF0ZShzcXJ0Rml4cChyZXN1bHRfbSA+PiAocmVzdWx0X2UgJiAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHRfZSArIChyZXN1bHRfZSAmIDEpKSA+PiAxKTsKICAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAgIGlmIChJQ0MgPj0gKChGSVhQX0RCTClNQVhWQUxfREJMPj5zYzEpICkKLSAgICAgICAgICAgICAgSUNDID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBJQ0MgPDw9IHNjMTsKLSAgICAgIH0KLQotICAgICAgaWNjW2Vudl1baV0gPSBJQ0M7CiAgICAgfQogICB9CiB9CiAKLXZvaWQgRkRLc2JyRW5jX2luaXRQc0JhbmROcmdTY2FsZShIQU5ETEVfUFNfRU5DT0RFIGhQc0VuY29kZSkKLXsKK3ZvaWQgRkRLc2JyRW5jX2luaXRQc0JhbmROcmdTY2FsZShIQU5ETEVfUFNfRU5DT0RFIGhQc0VuY29kZSkgewogICBJTlQgZ3JvdXAsIGJpbjsKLSAgSU5UIG5JaWRHcm91cHMgICA9IGhQc0VuY29kZS0+blFtZklpZEdyb3VwcyArIGhQc0VuY29kZS0+blN1YlFtZklpZEdyb3VwczsKKyAgSU5UIG5JaWRHcm91cHMgPSBoUHNFbmNvZGUtPm5RbWZJaWRHcm91cHMgKyBoUHNFbmNvZGUtPm5TdWJRbWZJaWRHcm91cHM7CiAKLSAgRkRLbWVtY2xlYXIoaFBzRW5jb2RlLT5wc0JhbmROcmdTY2FsZSwgUFNfTUFYX0JBTkRTKnNpemVvZihTQ0hBUikpOworICBGREttZW1jbGVhcihoUHNFbmNvZGUtPnBzQmFuZE5yZ1NjYWxlLCBQU19NQVhfQkFORFMgKiBzaXplb2YoU0NIQVIpKTsKIAotICBmb3IgKGdyb3VwPTA7IGdyb3VwIDwgbklpZEdyb3VwczsgZ3JvdXArKykgeworICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBuSWlkR3JvdXBzOyBncm91cCsrKSB7CiAgICAgLyogVHJhbnNsYXRlIGdyb3VwIHRvIGJpbiAqLwogICAgIGJpbiA9IGhQc0VuY29kZS0+c3ViYmFuZDJwYXJhbWV0ZXJJbmRleFtncm91cF07CiAKICAgICAvKiBUcmFuc2xhdGUgZnJvbSAyMCBiaW5zIHRvIDEwIGJpbnMgKi8KICAgICBpZiAoaFBzRW5jb2RlLT5wc0VuY01vZGUgPT0gUFNfQkFORFNfQ09BUlNFKSB7Ci0gICAgICBiaW4gPSBiaW4+PjE7CisgICAgICBiaW4gPSBiaW4gPj4gMTsKICAgICB9CiAKLSAgICBoUHNFbmNvZGUtPnBzQmFuZE5yZ1NjYWxlW2Jpbl0gPSAoaFBzRW5jb2RlLT5wc0JhbmROcmdTY2FsZVtiaW5dPT0wKQotICAgICAgICAgICAgICAgICAgICAgICAgICA/IChoUHNFbmNvZGUtPmlpZEdyb3VwV2lkdGhMZFtncm91cF0gKyA1KQotICAgICAgICAgICAgICAgICAgICAgICAgICA6IChmaXhNYXgoaFBzRW5jb2RlLT5paWRHcm91cFdpZHRoTGRbZ3JvdXBdLGhQc0VuY29kZS0+cHNCYW5kTnJnU2NhbGVbYmluXSkgKyAxKSA7Ci0KKyAgICBoUHNFbmNvZGUtPnBzQmFuZE5yZ1NjYWxlW2Jpbl0gPQorICAgICAgICAoaFBzRW5jb2RlLT5wc0JhbmROcmdTY2FsZVtiaW5dID09IDApCisgICAgICAgICAgICA/IChoUHNFbmNvZGUtPmlpZEdyb3VwV2lkdGhMZFtncm91cF0gKyA1KQorICAgICAgICAgICAgOiAoZml4TWF4KGhQc0VuY29kZS0+aWlkR3JvdXBXaWR0aExkW2dyb3VwXSwKKyAgICAgICAgICAgICAgICAgICAgICBoUHNFbmNvZGUtPnBzQmFuZE5yZ1NjYWxlW2Jpbl0pICsKKyAgICAgICAgICAgICAgIDEpOwogICB9CiB9CiAKLUZES19QU0VOQ19FUlJPUiBGREtzYnJFbmNfQ3JlYXRlUFNFbmNvZGUoCi0gICAgICAgIEhBTkRMRV9QU19FTkNPREUgICAgICAgICAqcGhQc0VuY29kZQotICAgICAgICApCi17CitGREtfUFNFTkNfRVJST1IgRkRLc2JyRW5jX0NyZWF0ZVBTRW5jb2RlKEhBTkRMRV9QU19FTkNPREUgKnBoUHNFbmNvZGUpIHsKICAgRkRLX1BTRU5DX0VSUk9SIGVycm9yID0gUFNFTkNfT0s7CiAKLSAgaWYgKHBoUHNFbmNvZGU9PU5VTEwpIHsKKyAgaWYgKHBoUHNFbmNvZGUgPT0gTlVMTCkgewogICAgIGVycm9yID0gUFNFTkNfSU5WQUxJRF9IQU5ETEU7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgSEFORExFX1BTX0VOQ09ERSBoUHNFbmNvZGUgPSBOVUxMOwotICAgIGlmIChOVUxMPT0oaFBzRW5jb2RlID0gR2V0UmFtX1BzRW5jb2RlKCkpKSB7CisgICAgaWYgKE5VTEwgPT0gKGhQc0VuY29kZSA9IEdldFJhbV9Qc0VuY29kZSgpKSkgewogICAgICAgZXJyb3IgPSBQU0VOQ19NRU1PUllfRVJST1I7CiAgICAgICBnb3RvIGJhaWw7CiAgICAgfQotICAgIEZES21lbWNsZWFyKGhQc0VuY29kZSxzaXplb2YoUFNfRU5DT0RFKSk7CisgICAgRkRLbWVtY2xlYXIoaFBzRW5jb2RlLCBzaXplb2YoUFNfRU5DT0RFKSk7CiAgICAgKnBoUHNFbmNvZGUgPSBoUHNFbmNvZGU7IC8qIHJldHVybiBhbGxvY2F0ZWQgaGFuZGxlICovCiAgIH0KIGJhaWw6CiAgIHJldHVybiBlcnJvcjsKIH0KIAotRkRLX1BTRU5DX0VSUk9SIEZES3NickVuY19Jbml0UFNFbmNvZGUoCi0gICAgICAgIEhBTkRMRV9QU19FTkNPREUgICAgICAgICAgaFBzRW5jb2RlLAotICAgICAgICBjb25zdCBQU19CQU5EUyAgICAgICAgICAgIHBzRW5jTW9kZSwKLSAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICBpaWRRdWFudEVycm9yVGhyZXNob2xkCi0gICAgICAgICkKLXsKK0ZES19QU0VOQ19FUlJPUiBGREtzYnJFbmNfSW5pdFBTRW5jb2RlKEhBTkRMRV9QU19FTkNPREUgaFBzRW5jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNfQkFORFMgcHNFbmNNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgaWlkUXVhbnRFcnJvclRocmVzaG9sZCkgewogICBGREtfUFNFTkNfRVJST1IgZXJyb3IgPSBQU0VOQ19PSzsKIAotICBpZiAoTlVMTD09aFBzRW5jb2RlKSB7CisgIGlmIChOVUxMID09IGhQc0VuY29kZSkgewogICAgIGVycm9yID0gUFNFTkNfSU5WQUxJRF9IQU5ETEU7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgaWYgKFBTRU5DX09LICE9IChJbml0UFNEYXRhKCZoUHNFbmNvZGUtPnBzRGF0YSkpKSB7CiAgICAgICBnb3RvIGJhaWw7CiAgICAgfQogCi0gICAgc3dpdGNoKHBzRW5jTW9kZSl7CisgICAgc3dpdGNoIChwc0VuY01vZGUpIHsKICAgICAgIGNhc2UgUFNfQkFORFNfQ09BUlNFOgogICAgICAgY2FzZSBQU19CQU5EU19NSUQ6Ci0gICAgICAgIGhQc0VuY29kZS0+blFtZklpZEdyb3VwcyAgICA9IFFNRl9HUk9VUFNfTE9fUkVTOworICAgICAgICBoUHNFbmNvZGUtPm5RbWZJaWRHcm91cHMgPSBRTUZfR1JPVVBTX0xPX1JFUzsKICAgICAgICAgaFBzRW5jb2RlLT5uU3ViUW1mSWlkR3JvdXBzID0gU1VCUU1GX0dST1VQU19MT19SRVM7Ci0gICAgICAgIEZES21lbWNweShoUHNFbmNvZGUtPmlpZEdyb3VwQm9yZGVycywgICAgICAgIGlpZEdyb3VwQm9yZGVyc0xvUmVzLCAoaFBzRW5jb2RlLT5uUW1mSWlkR3JvdXBzICsgaFBzRW5jb2RlLT5uU3ViUW1mSWlkR3JvdXBzICsgMSkqc2l6ZW9mKElOVCkpOwotICAgICAgICBGREttZW1jcHkoaFBzRW5jb2RlLT5zdWJiYW5kMnBhcmFtZXRlckluZGV4LCBzdWJiYW5kMnBhcmFtZXRlcjIwLCAgKGhQc0VuY29kZS0+blFtZklpZEdyb3VwcyArIGhQc0VuY29kZS0+blN1YlFtZklpZEdyb3VwcykgICAgKnNpemVvZihJTlQpKTsKLSAgICAgICAgRkRLbWVtY3B5KGhQc0VuY29kZS0+aWlkR3JvdXBXaWR0aExkLCAgICAgICAgaWlkR3JvdXBXaWR0aExkTG9SZXMsIChoUHNFbmNvZGUtPm5RbWZJaWRHcm91cHMgKyBoUHNFbmNvZGUtPm5TdWJRbWZJaWRHcm91cHMpICAgICpzaXplb2YoVUNIQVIpKTsKKyAgICAgICAgRkRLbWVtY3B5KGhQc0VuY29kZS0+aWlkR3JvdXBCb3JkZXJzLCBpaWRHcm91cEJvcmRlcnNMb1JlcywKKyAgICAgICAgICAgICAgICAgIChoUHNFbmNvZGUtPm5RbWZJaWRHcm91cHMgKyBoUHNFbmNvZGUtPm5TdWJRbWZJaWRHcm91cHMgKyAxKSAqCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKElOVCkpOworICAgICAgICBGREttZW1jcHkoaFBzRW5jb2RlLT5zdWJiYW5kMnBhcmFtZXRlckluZGV4LCBzdWJiYW5kMnBhcmFtZXRlcjIwLAorICAgICAgICAgICAgICAgICAgKGhQc0VuY29kZS0+blFtZklpZEdyb3VwcyArIGhQc0VuY29kZS0+blN1YlFtZklpZEdyb3VwcykgKgorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihJTlQpKTsKKyAgICAgICAgRkRLbWVtY3B5KGhQc0VuY29kZS0+aWlkR3JvdXBXaWR0aExkLCBpaWRHcm91cFdpZHRoTGRMb1JlcywKKyAgICAgICAgICAgICAgICAgIChoUHNFbmNvZGUtPm5RbWZJaWRHcm91cHMgKyBoUHNFbmNvZGUtPm5TdWJRbWZJaWRHcm91cHMpICoKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVUNIQVIpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICBkZWZhdWx0OgogICAgICAgICBlcnJvciA9IFBTRU5DX0lOSVRfRVJST1I7CkBAIC04MTAsMTQgKzc5OCwxMCBAQAogICByZXR1cm4gZXJyb3I7CiB9CiAKLQotRkRLX1BTRU5DX0VSUk9SIEZES3NickVuY19EZXN0cm95UFNFbmNvZGUoCi0gICAgICAgIEhBTkRMRV9QU19FTkNPREUgICAgICAgICAqcGhQc0VuY29kZQotICAgICAgICApCi17CitGREtfUFNFTkNfRVJST1IgRkRLc2JyRW5jX0Rlc3Ryb3lQU0VuY29kZShIQU5ETEVfUFNfRU5DT0RFICpwaFBzRW5jb2RlKSB7CiAgIEZES19QU0VOQ19FUlJPUiBlcnJvciA9IFBTRU5DX09LOwogCi0gIGlmIChOVUxMICE9cGhQc0VuY29kZSkgeworICBpZiAoTlVMTCAhPSBwaFBzRW5jb2RlKSB7CiAgICAgRnJlZVJhbV9Qc0VuY29kZShwaFBzRW5jb2RlKTsKICAgfQogCkBAIC04MzQsNDkgKzgxOCw0MyBAQAogCiB9IFBTX1BXUl9EQVRBOwogCi0KIEZES19QU0VOQ19FUlJPUiBGREtzYnJFbmNfUFNFbmNvZGUoCi0gICAgICAgIEhBTkRMRV9QU19FTkNPREUgICAgICAgICAgaFBzRW5jb2RlLAotICAgICAgICBIQU5ETEVfUFNfT1VUICAgICAgICAgICAgIGhQc091dCwKLSAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICpkeW5CYW5kU2NhbGUsCi0gICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgbWF4RW52ZWxvcGVzLAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgKmh5YnJpZERhdGFbSFlCUklEX0ZSQU1FU0laRV1bTUFYX1BTX0NIQU5ORUxTXVsyXSwKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBmcmFtZVNpemUsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgc2VuZEhlYWRlcgotICAgICAgICApCi17CisgICAgSEFORExFX1BTX0VOQ09ERSBoUHNFbmNvZGUsIEhBTkRMRV9QU19PVVQgaFBzT3V0LCBVQ0hBUiAqZHluQmFuZFNjYWxlLAorICAgIFVJTlQgbWF4RW52ZWxvcGVzLAorICAgIEZJWFBfREJMICpoeWJyaWREYXRhW0hZQlJJRF9GUkFNRVNJWkVdW01BWF9QU19DSEFOTkVMU11bMl0sCisgICAgY29uc3QgSU5UIGZyYW1lU2l6ZSwgY29uc3QgSU5UIHNlbmRIZWFkZXIpIHsKICAgRkRLX1BTRU5DX0VSUk9SIGVycm9yID0gUFNFTkNfT0s7CiAKICAgSEFORExFX1BTX0RBVEEgaFBzRGF0YSA9ICZoUHNFbmNvZGUtPnBzRGF0YTsKLSAgRklYUF9EQkwgaWlkIFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOwotICBGSVhQX0RCTCBpY2MgW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU107Ci0gIGludCBlbnZCb3JkZXJbUFNfTUFYX0VOVkVMT1BFUysxXTsKKyAgRklYUF9EQkwgaWlkW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU107CisgIEZJWFBfREJMIGljY1tQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOworICBpbnQgZW52Qm9yZGVyW1BTX01BWF9FTlZFTE9QRVMgKyAxXTsKIAogICBpbnQgZ3JvdXAsIGJpbiwgY29sLCBzdWJiYW5kLCBiYW5kOwogICBpbnQgaSA9IDA7CiAKICAgaW50IGVudiA9IDA7Ci0gIGludCBwc0JhbmRzICAgICAgPSAoaW50KSBoUHNFbmNvZGUtPnBzRW5jTW9kZTsKLSAgaW50IG5JaWRHcm91cHMgICA9IGhQc0VuY29kZS0+blFtZklpZEdyb3VwcyArIGhQc0VuY29kZS0+blN1YlFtZklpZEdyb3VwczsKLSAgaW50IG5FbnZlbG9wZXMgICA9IGZpeE1pbihtYXhFbnZlbG9wZXMsIChVSU5UKVBTX01BWF9FTlZFTE9QRVMpOworICBpbnQgcHNCYW5kcyA9IChpbnQpaFBzRW5jb2RlLT5wc0VuY01vZGU7CisgIGludCBuSWlkR3JvdXBzID0gaFBzRW5jb2RlLT5uUW1mSWlkR3JvdXBzICsgaFBzRW5jb2RlLT5uU3ViUW1mSWlkR3JvdXBzOworICBpbnQgbkVudmVsb3BlcyA9IGZpeE1pbihtYXhFbnZlbG9wZXMsIChVSU5UKVBTX01BWF9FTlZFTE9QRVMpOwogCi0gIENfQUxMT0NfU0NSQVRDSF9TVEFSVChwd3JEYXRhLCBQU19QV1JfREFUQSwgMSk7CisgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChwd3JEYXRhLCBQU19QV1JfREFUQSwgMSkKIAotICBmb3IoZW52PTA7IGVudjxuRW52ZWxvcGVzKzE7ZW52KyspIHsKLSAgICBlbnZCb3JkZXJbZW52XSA9IGZNdWx0SShHZXRJbnZJbnQobkVudmVsb3BlcyksZnJhbWVTaXplKmVudik7CisgIGZvciAoZW52ID0gMDsgZW52IDwgbkVudmVsb3BlcyArIDE7IGVudisrKSB7CisgICAgZW52Qm9yZGVyW2Vudl0gPSBmTXVsdEkoR2V0SW52SW50KG5FbnZlbG9wZXMpLCBmcmFtZVNpemUgKiBlbnYpOwogICB9CiAKLSAgZm9yKGVudj0wOyBlbnY8bkVudmVsb3BlcztlbnYrKykgewotCisgIGZvciAoZW52ID0gMDsgZW52IDwgbkVudmVsb3BlczsgZW52KyspIHsKICAgICAvKiBjbGVhciBlbmVyZ3kgYXJyYXkgKi8KLSAgICBmb3IgKGJhbmQ9MDsgYmFuZDxwc0JhbmRzOyBiYW5kKyspIHsKLSAgICAgIHB3ckRhdGEtPnB3ckxbZW52XVtiYW5kXSA9IHB3ckRhdGEtPnB3clJbZW52XVtiYW5kXSA9IHB3ckRhdGEtPnB3ckNyW2Vudl1bYmFuZF0gPSBwd3JEYXRhLT5wd3JDaVtlbnZdW2JhbmRdID0gRklYUF9EQkwoMSk7CisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IHBzQmFuZHM7IGJhbmQrKykgeworICAgICAgcHdyRGF0YS0+cHdyTFtlbnZdW2JhbmRdID0gcHdyRGF0YS0+cHdyUltlbnZdW2JhbmRdID0KKyAgICAgICAgICBwd3JEYXRhLT5wd3JDcltlbnZdW2JhbmRdID0gcHdyRGF0YS0+cHdyQ2lbZW52XVtiYW5kXSA9IEZJWFBfREJMKDEpOwogICAgIH0KIAogICAgIC8qKioqIGNhbGN1bGF0ZSBlbmVyZ2llcyBhbmQgY29ycmVsYXRpb24gKioqKi8KIAogICAgIC8qIHN0YXJ0IHdpdGggaHlicmlkIGRhdGEgKi8KLSAgICBmb3IgKGdyb3VwPTA7IGdyb3VwIDwgbklpZEdyb3VwczsgZ3JvdXArKykgeworICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IG5JaWRHcm91cHM7IGdyb3VwKyspIHsKICAgICAgIC8qIFRyYW5zbGF0ZSBncm91cCB0byBiaW4gKi8KICAgICAgIGJpbiA9IGhQc0VuY29kZS0+c3ViYmFuZDJwYXJhbWV0ZXJJbmRleFtncm91cF07CiAKQEAgLTg5NCwyMiArODcyLDI2IEBACiAgICAgICBGSVhQX0RCTCBwd3JDaV9lbnZfYmluID0gcHdyRGF0YS0+cHdyQ2lbZW52XVtiaW5dOwogCiAgICAgICBpbnQgc2NhbGUgPSAoaW50KWR5bkJhbmRTY2FsZVtiaW5dOwotICAgICAgZm9yIChjb2w9ZW52Qm9yZGVyW2Vudl07IGNvbDxlbnZCb3JkZXJbZW52KzFdOyBjb2wrKykgewotICAgICAgICBmb3IgKHN1YmJhbmQgPSBoUHNFbmNvZGUtPmlpZEdyb3VwQm9yZGVyc1tncm91cF07IHN1YmJhbmQgPCBoUHNFbmNvZGUtPmlpZEdyb3VwQm9yZGVyc1tncm91cCsxXTsgc3ViYmFuZCsrKSB7Ci0gICAgICAgICAgRklYUF9RTUYgbF9yZWFsID0gKGh5YnJpZERhdGFbY29sXVswXVswXVtzdWJiYW5kXSkgPDwgc2NhbGU7Ci0gICAgICAgICAgRklYUF9RTUYgbF9pbWFnID0gKGh5YnJpZERhdGFbY29sXVswXVsxXVtzdWJiYW5kXSkgPDwgc2NhbGU7Ci0gICAgICAgICAgRklYUF9RTUYgcl9yZWFsID0gKGh5YnJpZERhdGFbY29sXVsxXVswXVtzdWJiYW5kXSkgPDwgc2NhbGU7Ci0gICAgICAgICAgRklYUF9RTUYgcl9pbWFnID0gKGh5YnJpZERhdGFbY29sXVsxXVsxXVtzdWJiYW5kXSkgPDwgc2NhbGU7CisgICAgICBmb3IgKGNvbCA9IGVudkJvcmRlcltlbnZdOyBjb2wgPCBlbnZCb3JkZXJbZW52ICsgMV07IGNvbCsrKSB7CisgICAgICAgIGZvciAoc3ViYmFuZCA9IGhQc0VuY29kZS0+aWlkR3JvdXBCb3JkZXJzW2dyb3VwXTsKKyAgICAgICAgICAgICBzdWJiYW5kIDwgaFBzRW5jb2RlLT5paWRHcm91cEJvcmRlcnNbZ3JvdXAgKyAxXTsgc3ViYmFuZCsrKSB7CisgICAgICAgICAgRklYUF9EQkwgbF9yZWFsID0gKGh5YnJpZERhdGFbY29sXVswXVswXVtzdWJiYW5kXSkgPDwgc2NhbGU7CisgICAgICAgICAgRklYUF9EQkwgbF9pbWFnID0gKGh5YnJpZERhdGFbY29sXVswXVsxXVtzdWJiYW5kXSkgPDwgc2NhbGU7CisgICAgICAgICAgRklYUF9EQkwgcl9yZWFsID0gKGh5YnJpZERhdGFbY29sXVsxXVswXVtzdWJiYW5kXSkgPDwgc2NhbGU7CisgICAgICAgICAgRklYUF9EQkwgcl9pbWFnID0gKGh5YnJpZERhdGFbY29sXVsxXVsxXVtzdWJiYW5kXSkgPDwgc2NhbGU7CiAKLSAgICAgICAgICBwd3JMX2Vudl9iaW4gICs9IChmUG93MkRpdjIobF9yZWFsKSArIGZQb3cyRGl2MihsX2ltYWcpKSA+PiBiU2NhbGU7Ci0gICAgICAgICAgcHdyUl9lbnZfYmluICArPSAoZlBvdzJEaXYyKHJfcmVhbCkgKyBmUG93MkRpdjIocl9pbWFnKSkgPj4gYlNjYWxlOwotICAgICAgICAgIHB3ckNyX2Vudl9iaW4gKz0gKGZNdWx0RGl2MihsX3JlYWwsIHJfcmVhbCkgKyBmTXVsdERpdjIobF9pbWFnLCByX2ltYWcpKSA+PiBiU2NhbGU7Ci0gICAgICAgICAgcHdyQ2lfZW52X2JpbiArPSAoZk11bHREaXYyKHJfcmVhbCwgbF9pbWFnKSAtIGZNdWx0RGl2MihsX3JlYWwsIHJfaW1hZykpID4+IGJTY2FsZTsKKyAgICAgICAgICBwd3JMX2Vudl9iaW4gKz0gKGZQb3cyRGl2MihsX3JlYWwpICsgZlBvdzJEaXYyKGxfaW1hZykpID4+IGJTY2FsZTsKKyAgICAgICAgICBwd3JSX2Vudl9iaW4gKz0gKGZQb3cyRGl2MihyX3JlYWwpICsgZlBvdzJEaXYyKHJfaW1hZykpID4+IGJTY2FsZTsKKyAgICAgICAgICBwd3JDcl9lbnZfYmluICs9CisgICAgICAgICAgICAgIChmTXVsdERpdjIobF9yZWFsLCByX3JlYWwpICsgZk11bHREaXYyKGxfaW1hZywgcl9pbWFnKSkgPj4gYlNjYWxlOworICAgICAgICAgIHB3ckNpX2Vudl9iaW4gKz0KKyAgICAgICAgICAgICAgKGZNdWx0RGl2MihyX3JlYWwsIGxfaW1hZykgLSBmTXVsdERpdjIobF9yZWFsLCByX2ltYWcpKSA+PiBiU2NhbGU7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIC8qIGFzc3VyZSwgbnJnJ3Mgb2YgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBhcmUgbm90IG5lZ2F0aXZlOyBuZWNlc3Nhcnkgb24gMTYgYml0IG11bHRpcGx5IHVuaXRzICovCi0gICAgICBwd3JEYXRhLT5wd3JMW2Vudl1bYmluXSA9IGZpeE1heCgoRklYUF9EQkwpMCxwd3JMX2Vudl9iaW4pOwotICAgICAgcHdyRGF0YS0+cHdyUltlbnZdW2Jpbl0gPSBmaXhNYXgoKEZJWFBfREJMKTAscHdyUl9lbnZfYmluKTsKKyAgICAgIC8qIGFzc3VyZSwgbnJnJ3Mgb2YgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBhcmUgbm90IG5lZ2F0aXZlOyBuZWNlc3Nhcnkgb24KKyAgICAgICAqIDE2IGJpdCBtdWx0aXBseSB1bml0cyAqLworICAgICAgcHdyRGF0YS0+cHdyTFtlbnZdW2Jpbl0gPSBmaXhNYXgoKEZJWFBfREJMKTAsIHB3ckxfZW52X2Jpbik7CisgICAgICBwd3JEYXRhLT5wd3JSW2Vudl1bYmluXSA9IGZpeE1heCgoRklYUF9EQkwpMCwgcHdyUl9lbnZfYmluKTsKIAogICAgICAgcHdyRGF0YS0+cHdyQ3JbZW52XVtiaW5dID0gcHdyQ3JfZW52X2JpbjsKICAgICAgIHB3ckRhdGEtPnB3ckNpW2Vudl1bYmluXSA9IHB3ckNpX2Vudl9iaW47CkBAIC05MjQsMTI2ICs5MDYsMTIyIEBACiAKICAgLyogY2FsY3VsYXRlIGlpZCBhbmQgaWNjICovCiAgIGNhbGN1bGF0ZUlJRChwd3JEYXRhLT5sZFB3ckwsIHB3ckRhdGEtPmxkUHdyUiwgaWlkLCBuRW52ZWxvcGVzLCBwc0JhbmRzKTsKLSAgY2FsY3VsYXRlSUNDKHB3ckRhdGEtPmxkUHdyTCwgcHdyRGF0YS0+bGRQd3JSLCBwd3JEYXRhLT5wd3JDciwgcHdyRGF0YS0+cHdyQ2ksIGljYywgbkVudmVsb3BlcywgcHNCYW5kcyk7CisgIGNhbGN1bGF0ZUlDQyhwd3JEYXRhLT5wd3JMLCBwd3JEYXRhLT5wd3JSLCBwd3JEYXRhLT5wd3JDciwgcHdyRGF0YS0+cHdyQ2ksCisgICAgICAgICAgICAgICBpY2MsIG5FbnZlbG9wZXMsIHBzQmFuZHMpOwogCiAgIC8qKiogRW52ZWxvcGUgUmVkdWN0aW9uICoqKi8KLSAgd2hpbGUgKGVudmVsb3BlUmVkdWNpYmxlKGlpZCxpY2MscHNCYW5kcyxuRW52ZWxvcGVzKSkgewotICAgIGludCBlPTA7CisgIHdoaWxlIChlbnZlbG9wZVJlZHVjaWJsZShpaWQsIGljYywgcHNCYW5kcywgbkVudmVsb3BlcykpIHsKKyAgICBpbnQgZSA9IDA7CiAgICAgLyogc3VtIGVuZXJnaWVzIG9mIHR3byBuZWlnaGJvcmluZyBlbnZlbG9wZXMgKi8KICAgICBuRW52ZWxvcGVzID4+PSAxOwotICAgIGZvciAoZT0wOyBlPG5FbnZlbG9wZXM7IGUrKykgewotICAgICAgRkRLc2JyRW5jX2FkZEZJWFBfREJMKHB3ckRhdGEtPnB3ckxbMiplXSwgcHdyRGF0YS0+cHdyTFsyKmUrMV0sIHB3ckRhdGEtPnB3ckxbZV0sIHBzQmFuZHMpOwotICAgICAgRkRLc2JyRW5jX2FkZEZJWFBfREJMKHB3ckRhdGEtPnB3clJbMiplXSwgcHdyRGF0YS0+cHdyUlsyKmUrMV0sIHB3ckRhdGEtPnB3clJbZV0sIHBzQmFuZHMpOwotICAgICAgRkRLc2JyRW5jX2FkZEZJWFBfREJMKHB3ckRhdGEtPnB3ckNyWzIqZV0scHdyRGF0YS0+cHdyQ3JbMiplKzFdLHB3ckRhdGEtPnB3ckNyW2VdLHBzQmFuZHMpOwotICAgICAgRkRLc2JyRW5jX2FkZEZJWFBfREJMKHB3ckRhdGEtPnB3ckNpWzIqZV0scHdyRGF0YS0+cHdyQ2lbMiplKzFdLHB3ckRhdGEtPnB3ckNpW2VdLHBzQmFuZHMpOworICAgIGZvciAoZSA9IDA7IGUgPCBuRW52ZWxvcGVzOyBlKyspIHsKKyAgICAgIEZES3NickVuY19hZGRGSVhQX0RCTChwd3JEYXRhLT5wd3JMWzIgKiBlXSwgcHdyRGF0YS0+cHdyTFsyICogZSArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3ckRhdGEtPnB3ckxbZV0sIHBzQmFuZHMpOworICAgICAgRkRLc2JyRW5jX2FkZEZJWFBfREJMKHB3ckRhdGEtPnB3clJbMiAqIGVdLCBwd3JEYXRhLT5wd3JSWzIgKiBlICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdyRGF0YS0+cHdyUltlXSwgcHNCYW5kcyk7CisgICAgICBGREtzYnJFbmNfYWRkRklYUF9EQkwocHdyRGF0YS0+cHdyQ3JbMiAqIGVdLCBwd3JEYXRhLT5wd3JDclsyICogZSArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3ckRhdGEtPnB3ckNyW2VdLCBwc0JhbmRzKTsKKyAgICAgIEZES3NickVuY19hZGRGSVhQX0RCTChwd3JEYXRhLT5wd3JDaVsyICogZV0sIHB3ckRhdGEtPnB3ckNpWzIgKiBlICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdyRGF0YS0+cHdyQ2lbZV0sIHBzQmFuZHMpOwogCiAgICAgICAvKiBjYWxjIGxvZ2FyaXRobWljIGVuZXJneSAqLwogICAgICAgTGREYXRhVmVjdG9yKHB3ckRhdGEtPnB3ckxbZV0sIHB3ckRhdGEtPmxkUHdyTFtlXSwgcHNCYW5kcyk7CiAgICAgICBMZERhdGFWZWN0b3IocHdyRGF0YS0+cHdyUltlXSwgcHdyRGF0YS0+bGRQd3JSW2VdLCBwc0JhbmRzKTsKIAogICAgICAgLyogcmVkdWNlIG51bWJlciBvZiBlbnZlbG9wZXMgYW5kIGFkanVzdCBib3JkZXJzICovCi0gICAgICBlbnZCb3JkZXJbZV0gPSBlbnZCb3JkZXJbMiplXTsKKyAgICAgIGVudkJvcmRlcltlXSA9IGVudkJvcmRlclsyICogZV07CiAgICAgfQotICAgIGVudkJvcmRlcltuRW52ZWxvcGVzXSA9IGVudkJvcmRlclsyKm5FbnZlbG9wZXNdOworICAgIGVudkJvcmRlcltuRW52ZWxvcGVzXSA9IGVudkJvcmRlclsyICogbkVudmVsb3Blc107CiAKICAgICAvKiByZS1jYWxjdWxhdGUgaWlkIGFuZCBpY2MgKi8KICAgICBjYWxjdWxhdGVJSUQocHdyRGF0YS0+bGRQd3JMLCBwd3JEYXRhLT5sZFB3clIsIGlpZCwgbkVudmVsb3BlcywgcHNCYW5kcyk7Ci0gICAgY2FsY3VsYXRlSUNDKHB3ckRhdGEtPmxkUHdyTCwgcHdyRGF0YS0+bGRQd3JSLCBwd3JEYXRhLT5wd3JDciwgcHdyRGF0YS0+cHdyQ2ksIGljYywgbkVudmVsb3BlcywgcHNCYW5kcyk7CisgICAgY2FsY3VsYXRlSUNDKHB3ckRhdGEtPnB3ckwsIHB3ckRhdGEtPnB3clIsIHB3ckRhdGEtPnB3ckNyLCBwd3JEYXRhLT5wd3JDaSwKKyAgICAgICAgICAgICAgICAgaWNjLCBuRW52ZWxvcGVzLCBwc0JhbmRzKTsKICAgfQogCi0KICAgLyogICovCi0gIGlmKHNlbmRIZWFkZXIpIHsKLSAgICBoUHNEYXRhLT5oZWFkZXJDbnQgID0gTUFYX1BTX05PSEVBREVSX0NOVDsKKyAgaWYgKHNlbmRIZWFkZXIpIHsKKyAgICBoUHNEYXRhLT5oZWFkZXJDbnQgPSBNQVhfUFNfTk9IRUFERVJfQ05UOwogICAgIGhQc0RhdGEtPmlpZFRpbWVDbnQgPSBNQVhfVElNRV9ESUZGX0ZSQU1FUzsKICAgICBoUHNEYXRhLT5pY2NUaW1lQ250ID0gTUFYX1RJTUVfRElGRl9GUkFNRVM7Ci0gICAgaFBzRGF0YS0+bm9FbnZDbnQgICA9IE1BWF9OT0VOVl9DTlQ7CisgICAgaFBzRGF0YS0+bm9FbnZDbnQgPSBNQVhfTk9FTlZfQ05UOwogICB9CiAKICAgLyoqKiBQYXJhbWV0ZXIgcHJvY2Vzc2luZywgcXVhbnRpc2F0aW9uIGV0YyAqKiovCi0gIHByb2Nlc3NJaWREYXRhKGhQc0RhdGEsIGlpZCwgcHNCYW5kcywgbkVudmVsb3BlcywgaFBzRW5jb2RlLT5paWRRdWFudEVycm9yVGhyZXNob2xkKTsKKyAgcHJvY2Vzc0lpZERhdGEoaFBzRGF0YSwgaWlkLCBwc0JhbmRzLCBuRW52ZWxvcGVzLAorICAgICAgICAgICAgICAgICBoUHNFbmNvZGUtPmlpZFF1YW50RXJyb3JUaHJlc2hvbGQpOwogICBwcm9jZXNzSWNjRGF0YShoUHNEYXRhLCBpY2MsIHBzQmFuZHMsIG5FbnZlbG9wZXMpOwogCi0KICAgLyoqKiBJbml0aWFsaXplIG91dHB1dCBzdHJ1Y3QgKioqLwogCiAgIC8qIFBTIEhlYWRlciBvbi9vZmYgPyAqLwotICBpZiggKGhQc0RhdGEtPmhlYWRlckNudDxNQVhfUFNfTk9IRUFERVJfQ05UKQotICAgICAgICYmICggKGhQc0RhdGEtPmlpZFF1YW50TW9kZSA9PSBoUHNEYXRhLT5paWRRdWFudE1vZGVMYXN0KSAmJiAoaFBzRGF0YS0+aWNjUXVhbnRNb2RlID09IGhQc0RhdGEtPmljY1F1YW50TW9kZUxhc3QpICkKLSAgICAgICAmJiAoIChoUHNEYXRhLT5paWRFbmFibGUgICAgPT0gaFBzRGF0YS0+aWlkRW5hYmxlTGFzdCkgICAgJiYgKGhQc0RhdGEtPmljY0VuYWJsZSAgICA9PSBoUHNEYXRhLT5pY2NFbmFibGVMYXN0KSAgKSApIHsKKyAgaWYgKChoUHNEYXRhLT5oZWFkZXJDbnQgPCBNQVhfUFNfTk9IRUFERVJfQ05UKSAmJgorICAgICAgKChoUHNEYXRhLT5paWRRdWFudE1vZGUgPT0gaFBzRGF0YS0+aWlkUXVhbnRNb2RlTGFzdCkgJiYKKyAgICAgICAoaFBzRGF0YS0+aWNjUXVhbnRNb2RlID09IGhQc0RhdGEtPmljY1F1YW50TW9kZUxhc3QpKSAmJgorICAgICAgKChoUHNEYXRhLT5paWRFbmFibGUgPT0gaFBzRGF0YS0+aWlkRW5hYmxlTGFzdCkgJiYKKyAgICAgICAoaFBzRGF0YS0+aWNjRW5hYmxlID09IGhQc0RhdGEtPmljY0VuYWJsZUxhc3QpKSkgewogICAgIGhQc091dC0+ZW5hYmxlUFNIZWFkZXIgPSAwOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIGhQc091dC0+ZW5hYmxlUFNIZWFkZXIgPSAxOwogICAgIGhQc0RhdGEtPmhlYWRlckNudCA9IDA7CiAgIH0KIAogICAvKiBuRW52ZWxvcGVzID0gMCA/ICovCi0gIGlmICggKGhQc0RhdGEtPm5vRW52Q250IDwgTUFYX05PRU5WX0NOVCkKLSAgICAgICAmJiAoc2ltaWxhcklpZChoUHNEYXRhLCBwc0JhbmRzLCBuRW52ZWxvcGVzKSkKLSAgICAgICAmJiAoc2ltaWxhckljYyhoUHNEYXRhLCBwc0JhbmRzLCBuRW52ZWxvcGVzKSkgKSB7CisgIGlmICgoaFBzRGF0YS0+bm9FbnZDbnQgPCBNQVhfTk9FTlZfQ05UKSAmJgorICAgICAgKHNpbWlsYXJJaWQoaFBzRGF0YSwgcHNCYW5kcywgbkVudmVsb3BlcykpICYmCisgICAgICAoc2ltaWxhckljYyhoUHNEYXRhLCBwc0JhbmRzLCBuRW52ZWxvcGVzKSkpIHsKICAgICBoUHNPdXQtPm5FbnZlbG9wZXMgPSBuRW52ZWxvcGVzID0gMDsKICAgICBoUHNEYXRhLT5ub0VudkNudCsrOwogICB9IGVsc2UgewogICAgIGhQc0RhdGEtPm5vRW52Q250ID0gMDsKICAgfQogCisgIGlmIChuRW52ZWxvcGVzID4gMCkgeworICAgIGhQc091dC0+ZW5hYmxlSUlEID0gaFBzRGF0YS0+aWlkRW5hYmxlOworICAgIGhQc091dC0+aWlkTW9kZSA9IGdldElJRE1vZGUocHNCYW5kcywgaFBzRGF0YS0+aWlkUXVhbnRNb2RlKTsKIAotICBpZiAobkVudmVsb3Blcz4wKSB7CisgICAgaFBzT3V0LT5lbmFibGVJQ0MgPSBoUHNEYXRhLT5pY2NFbmFibGU7CisgICAgaFBzT3V0LT5pY2NNb2RlID0gZ2V0SUNDTW9kZShwc0JhbmRzLCBoUHNEYXRhLT5pY2NRdWFudE1vZGUpOwogCi0gICAgaFBzT3V0LT5lbmFibGVJSUQgICAgICA9IGhQc0RhdGEtPmlpZEVuYWJsZTsKLSAgICBoUHNPdXQtPmlpZE1vZGUgICAgICAgID0gZ2V0SUlETW9kZShwc0JhbmRzLCBoUHNEYXRhLT5paWRRdWFudE1vZGUpOworICAgIGhQc091dC0+ZW5hYmxlSXBkT3BkID0gMDsKKyAgICBoUHNPdXQtPmZyYW1lQ2xhc3MgPSAwOworICAgIGhQc091dC0+bkVudmVsb3BlcyA9IG5FbnZlbG9wZXM7CiAKLSAgICBoUHNPdXQtPmVuYWJsZUlDQyAgICAgID0gaFBzRGF0YS0+aWNjRW5hYmxlOwotICAgIGhQc091dC0+aWNjTW9kZSAgICAgICAgPSBnZXRJQ0NNb2RlKHBzQmFuZHMsIGhQc0RhdGEtPmljY1F1YW50TW9kZSk7Ci0KLSAgICBoUHNPdXQtPmVuYWJsZUlwZE9wZCAgPSAwOwotICAgIGhQc091dC0+ZnJhbWVDbGFzcyAgICA9IDA7Ci0gICAgaFBzT3V0LT5uRW52ZWxvcGVzICAgID0gbkVudmVsb3BlczsKLQotICAgIGZvcihlbnY9MDsgZW52PG5FbnZlbG9wZXM7IGVudisrKSB7Ci0gICAgICBoUHNPdXQtPmZyYW1lQm9yZGVyW2Vudl0gPSBlbnZCb3JkZXJbZW52KzFdOwotICAgIH0KLQotICAgIGZvcihlbnY9MDsgZW52PGhQc091dC0+bkVudmVsb3BlczsgZW52KyspIHsKKyAgICBmb3IgKGVudiA9IDA7IGVudiA8IG5FbnZlbG9wZXM7IGVudisrKSB7CisgICAgICBoUHNPdXQtPmZyYW1lQm9yZGVyW2Vudl0gPSBlbnZCb3JkZXJbZW52ICsgMV07CiAgICAgICBoUHNPdXQtPmRlbHRhSUlEW2Vudl0gPSAoUFNfREVMVEEpaFBzRGF0YS0+aWlkRGlmZk1vZGVbZW52XTsKLQotICAgICAgZm9yKGJhbmQ9MDsgYmFuZDxwc0JhbmRzOyBiYW5kKyspIHsKLSAgICAgICAgaFBzT3V0LT5paWRbZW52XVtiYW5kXSA9IGhQc0RhdGEtPmlpZElkeFtlbnZdW2JhbmRdOwotICAgICAgfQotICAgIH0KLQotICAgIGZvcihlbnY9MDsgZW52PGhQc091dC0+bkVudmVsb3BlczsgZW52KyspIHsKICAgICAgIGhQc091dC0+ZGVsdGFJQ0NbZW52XSA9IChQU19ERUxUQSloUHNEYXRhLT5pY2NEaWZmTW9kZVtlbnZdOwotICAgICAgZm9yKGJhbmQ9MDsgYmFuZDxwc0JhbmRzOyBiYW5kKyspIHsKKyAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBwc0JhbmRzOyBiYW5kKyspIHsKKyAgICAgICAgaFBzT3V0LT5paWRbZW52XVtiYW5kXSA9IGhQc0RhdGEtPmlpZElkeFtlbnZdW2JhbmRdOwogICAgICAgICBoUHNPdXQtPmljY1tlbnZdW2JhbmRdID0gaFBzRGF0YS0+aWNjSWR4W2Vudl1bYmFuZF07CiAgICAgICB9CiAgICAgfQogCiAgICAgLyogSVBEIE9QRCBub3Qgc3VwcG9ydGVkIHJpZ2h0IG5vdyAqLwotICAgIEZES21lbWNsZWFyKGhQc091dC0+aXBkLCBQU19NQVhfRU5WRUxPUEVTKlBTX01BWF9CQU5EUypzaXplb2YoUFNfREVMVEEpKTsKLSAgICBmb3IoZW52PTA7IGVudjxQU19NQVhfRU5WRUxPUEVTOyBlbnYrKykgeworICAgIEZES21lbWNsZWFyKGhQc091dC0+aXBkLAorICAgICAgICAgICAgICAgIFBTX01BWF9FTlZFTE9QRVMgKiBQU19NQVhfQkFORFMgKiBzaXplb2YoUFNfREVMVEEpKTsKKyAgICBmb3IgKGVudiA9IDA7IGVudiA8IFBTX01BWF9FTlZFTE9QRVM7IGVudisrKSB7CiAgICAgICBoUHNPdXQtPmRlbHRhSVBEW2Vudl0gPSBQU19ERUxUQV9GUkVROwogICAgICAgaFBzT3V0LT5kZWx0YU9QRFtlbnZdID0gUFNfREVMVEFfRlJFUTsKICAgICB9CiAKLSAgICBGREttZW1jbGVhcihoUHNPdXQtPmlwZExhc3QsIFBTX01BWF9CQU5EUypzaXplb2YoSU5UKSk7Ci0gICAgRkRLbWVtY2xlYXIoaFBzT3V0LT5vcGRMYXN0LCBQU19NQVhfQkFORFMqc2l6ZW9mKElOVCkpOworICAgIEZES21lbWNsZWFyKGhQc091dC0+aXBkTGFzdCwgUFNfTUFYX0JBTkRTICogc2l6ZW9mKElOVCkpOworICAgIEZES21lbWNsZWFyKGhQc091dC0+b3BkTGFzdCwgUFNfTUFYX0JBTkRTICogc2l6ZW9mKElOVCkpOwogCi0gICAgZm9yKGJhbmQ9MDsgYmFuZDxQU19NQVhfQkFORFM7IGJhbmQrKykgeworICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBQU19NQVhfQkFORFM7IGJhbmQrKykgewogICAgICAgaFBzT3V0LT5paWRMYXN0W2JhbmRdID0gaFBzRGF0YS0+aWlkSWR4TGFzdFtiYW5kXTsKICAgICAgIGhQc091dC0+aWNjTGFzdFtiYW5kXSA9IGhQc0RhdGEtPmljY0lkeExhc3RbYmFuZF07CiAgICAgfQogCiAgICAgLyogc2F2ZSBpaWRzIGFuZCBpY2NzIGZvciBkaWZmZXJlbnRpYWwgdGltZSBjb2RpbmcgaW4gdGhlIG5leHQgZnJhbWUgKi8KLSAgICBoUHNEYXRhLT5uRW52ZWxvcGVzTGFzdCAgID0gbkVudmVsb3BlczsKLSAgICBoUHNEYXRhLT5paWRFbmFibGVMYXN0ICAgID0gaFBzRGF0YS0+aWlkRW5hYmxlOwotICAgIGhQc0RhdGEtPmljY0VuYWJsZUxhc3QgICAgPSBoUHNEYXRhLT5pY2NFbmFibGU7CisgICAgaFBzRGF0YS0+bkVudmVsb3Blc0xhc3QgPSBuRW52ZWxvcGVzOworICAgIGhQc0RhdGEtPmlpZEVuYWJsZUxhc3QgPSBoUHNEYXRhLT5paWRFbmFibGU7CisgICAgaFBzRGF0YS0+aWNjRW5hYmxlTGFzdCA9IGhQc0RhdGEtPmljY0VuYWJsZTsKICAgICBoUHNEYXRhLT5paWRRdWFudE1vZGVMYXN0ID0gaFBzRGF0YS0+aWlkUXVhbnRNb2RlOwogICAgIGhQc0RhdGEtPmljY1F1YW50TW9kZUxhc3QgPSBoUHNEYXRhLT5pY2NRdWFudE1vZGU7Ci0gICAgZm9yIChpPTA7IGk8cHNCYW5kczsgaSsrKSB7Ci0gICAgICBoUHNEYXRhLT5paWRJZHhMYXN0W2ldID0gaFBzRGF0YS0+aWlkSWR4W25FbnZlbG9wZXMtMV1baV07Ci0gICAgICBoUHNEYXRhLT5pY2NJZHhMYXN0W2ldID0gaFBzRGF0YS0+aWNjSWR4W25FbnZlbG9wZXMtMV1baV07CisgICAgZm9yIChpID0gMDsgaSA8IHBzQmFuZHM7IGkrKykgeworICAgICAgaFBzRGF0YS0+aWlkSWR4TGFzdFtpXSA9IGhQc0RhdGEtPmlpZElkeFtuRW52ZWxvcGVzIC0gMV1baV07CisgICAgICBoUHNEYXRhLT5pY2NJZHhMYXN0W2ldID0gaFBzRGF0YS0+aWNjSWR4W25FbnZlbG9wZXMgLSAxXVtpXTsKICAgICB9CiAgIH0gLyogRW52ZWxvcGUgPiAwICovCiAKQEAgLTEwNTEsNCArMTAyOSwzIEBACiAKICAgcmV0dXJuIGVycm9yOwogfQotCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3BzX2VuY29kZS5oIGIvbGliU0JSZW5jL3NyYy9wc19lbmNvZGUuaAppbmRleCBmNzI4ZDQ3Li40MjM3YTAwIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL3BzX2VuY29kZS5oCisrKyBiL2xpYlNCUmVuYy9zcmMvcHNfZW5jb2RlLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNTcgKzkwLDU3IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEVHIEF1ZGlvIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotICAgSW5pdGlhbCBhdXRob3I6ICAgICAgIE0uIE5ldWVuZG9yZiwgTi4gUmV0dGVsYmFjaCwgTS4gTXVsdHJ1cwotICAgY29udGVudHMvZGVzY3JpcHRpb246IFBTIFBhcmFtZXRlciBleHRyYWN0aW9uLCBlbmNvZGluZworICAgQXV0aG9yKHMpOiAgIE0uIE5ldWVuZG9yZiwgTi4gUmV0dGVsYmFjaCwgTS4gTXVsdHJ1cwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogUFMgUGFyYW1ldGVyIGV4dHJhY3Rpb24sIGVuY29kaW5nCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIFBTIHBhcmFtZXRlciBleHRyYWN0aW9uLCBlbmNvZGluZyBmdW5jdGlvbnMgIAorICBcYnJpZWYgIFBTIHBhcmFtZXRlciBleHRyYWN0aW9uLCBlbmNvZGluZyBmdW5jdGlvbnMgJFJldmlzaW9uOiA5Mjc5MCAkCiAqLwogCi0jaWZuZGVmIF9fSU5DTFVERURfUFNfRU5DT0RFX0gKLSNkZWZpbmUgX19JTkNMVURFRF9QU19FTkNPREVfSAorI2lmbmRlZiBQU19FTkNPREVfSAorI2RlZmluZSBQU19FTkNPREVfSAogCiAjaW5jbHVkZSAicHNfY29uc3QuaCIKICNpbmNsdWRlICJwc19iaXRlbmMuaCIKIAorI2RlZmluZSBJSURfU0NBTEVfRlQgKDY0LmYpIC8qIG1heFZhbCBpbiBRdWFudCB0YWIgaXMgKy8tIDUwICovCisjZGVmaW5lIElJRF9TQ0FMRSA2ICAgICAgICAgLyogbWF4VmFsIGluIFF1YW50IHRhYiBpcyArLy0gNTAgKi8KKyNkZWZpbmUgSUlEX01BWFZBTCAoMSA8PCBJSURfU0NBTEUpCiAKLSNkZWZpbmUgSUlEX1NDQUxFX0ZUICAgICAgKDY0LmYpICAgIC8qIG1heFZhbCBpbiBRdWFudCB0YWIgaXMgKy8tIDUwICovCi0jZGVmaW5lIElJRF9TQ0FMRSAgICAgICAgIDYgICAgICAgICAvKiBtYXhWYWwgaW4gUXVhbnQgdGFiIGlzICsvLSA1MCAqLwotI2RlZmluZSBJSURfTUFYVkFMICAgICAgICAoMTw8SUlEX1NDQUxFKQorI2RlZmluZSBQU19RVUFOVF9TQ0FMRV9GVCBcCisgICg2NC5mKSAvKiBlcnJvciBzbWFsbGVyICg2NC0yNSkvNjQgKiAyMCBiYW5kcyAqIDQgZW52IC0+IFF1YW50U2NhbGUgNjQgKi8KKyNkZWZpbmUgUFNfUVVBTlRfU0NBTEUgXAorICA2IC8qIGVycm9yIHNtYWxsZXIgKDY0LTI1KS82NCAqIDIwIGJhbmRzICogNCBlbnYgLT4gUXVhbnRTY2FsZSA2IGJpdCAqLwogCi0jZGVmaW5lIFBTX1FVQU5UX1NDQUxFX0ZUICg2NC5mKSAgICAgLyogZXJyb3Igc21hbGxlciAoNjQtMjUpLzY0ICogMjAgYmFuZHMgKiA0IGVudiAtPiBRdWFudFNjYWxlIDY0ICovCi0jZGVmaW5lIFBTX1FVQU5UX1NDQUxFICAgIDYgICAgICAgICAgLyogZXJyb3Igc21hbGxlciAoNjQtMjUpLzY0ICogMjAgYmFuZHMgKiA0IGVudiAtPiBRdWFudFNjYWxlIDYgYml0ICovCi0KLQotI2RlZmluZSBRTUZfR1JPVVBTX0xPX1JFUyAgICAgIDEyCi0jZGVmaW5lIFNVQlFNRl9HUk9VUFNfTE9fUkVTICAgMTAKLSNkZWZpbmUgUU1GX0dST1VQU19ISV9SRVMgICAgICAxOAotI2RlZmluZSBTVUJRTUZfR1JPVVBTX0hJX1JFUyAgIDMwCi0KKyNkZWZpbmUgUU1GX0dST1VQU19MT19SRVMgMTIKKyNkZWZpbmUgU1VCUU1GX0dST1VQU19MT19SRVMgMTAKKyNkZWZpbmUgUU1GX0dST1VQU19ISV9SRVMgMTgKKyNkZWZpbmUgU1VCUU1GX0dST1VQU19ISV9SRVMgMzAKIAogdHlwZWRlZiBzdHJ1Y3QgVF9QU19EQVRBIHsKLQogICBJTlQgaWlkRW5hYmxlOwogICBJTlQgaWlkRW5hYmxlTGFzdDsKICAgSU5UIGlpZFF1YW50TW9kZTsKICAgSU5UIGlpZFF1YW50TW9kZUxhc3Q7CiAgIElOVCBpaWREaWZmTW9kZVtQU19NQVhfRU5WRUxPUEVTXTsKLSAgSU5UIGlpZElkeCAgICAgW1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU107Ci0gIElOVCBpaWRJZHhMYXN0IFtQU19NQVhfQkFORFNdOworICBJTlQgaWlkSWR4W1BTX01BWF9FTlZFTE9QRVNdW1BTX01BWF9CQU5EU107CisgIElOVCBpaWRJZHhMYXN0W1BTX01BWF9CQU5EU107CiAKICAgSU5UIGljY0VuYWJsZTsKICAgSU5UIGljY0VuYWJsZUxhc3Q7CiAgIElOVCBpY2NRdWFudE1vZGU7CiAgIElOVCBpY2NRdWFudE1vZGVMYXN0OwogICBJTlQgaWNjRGlmZk1vZGVbUFNfTUFYX0VOVkVMT1BFU107Ci0gIElOVCBpY2NJZHggICAgIFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOwotICBJTlQgaWNjSWR4TGFzdCBbUFNfTUFYX0JBTkRTXTsKKyAgSU5UIGljY0lkeFtQU19NQVhfRU5WRUxPUEVTXVtQU19NQVhfQkFORFNdOworICBJTlQgaWNjSWR4TGFzdFtQU19NQVhfQkFORFNdOwogCiAgIElOVCBuRW52ZWxvcGVzTGFzdDsKIApAQCAtMTQwLDQ4ICsxNTEsMzUgQEAKIAogfSBQU19EQVRBLCAqSEFORExFX1BTX0RBVEE7CiAKK3R5cGVkZWYgc3RydWN0IFRfUFNfRU5DT0RFIHsKKyAgUFNfREFUQSBwc0RhdGE7CiAKLXR5cGVkZWYgc3RydWN0IFRfUFNfRU5DT0RFeworICBQU19CQU5EUyBwc0VuY01vZGU7CisgIElOVCBuUW1mSWlkR3JvdXBzOworICBJTlQgblN1YlFtZklpZEdyb3VwczsKKyAgSU5UIGlpZEdyb3VwQm9yZGVyc1tRTUZfR1JPVVBTX0hJX1JFUyArIFNVQlFNRl9HUk9VUFNfSElfUkVTICsgMV07CisgIElOVCBzdWJiYW5kMnBhcmFtZXRlckluZGV4W1FNRl9HUk9VUFNfSElfUkVTICsgU1VCUU1GX0dST1VQU19ISV9SRVNdOworICBVQ0hBUiBpaWRHcm91cFdpZHRoTGRbUU1GX0dST1VQU19ISV9SRVMgKyBTVUJRTUZfR1JPVVBTX0hJX1JFU107CisgIEZJWFBfREJMIGlpZFF1YW50RXJyb3JUaHJlc2hvbGQ7CiAKLSAgUFNfREFUQSAgICAgICAgIHBzRGF0YTsKLQotICBQU19CQU5EUyAgICAgICAgcHNFbmNNb2RlOwotICBJTlQgICAgICAgICAgICAgblFtZklpZEdyb3VwczsKLSAgSU5UICAgICAgICAgICAgIG5TdWJRbWZJaWRHcm91cHM7Ci0gIElOVCAgICAgICAgICAgICBpaWRHcm91cEJvcmRlcnNbUU1GX0dST1VQU19ISV9SRVMgKyBTVUJRTUZfR1JPVVBTX0hJX1JFUyArIDFdOwotICBJTlQgICAgICAgICAgICAgc3ViYmFuZDJwYXJhbWV0ZXJJbmRleFtRTUZfR1JPVVBTX0hJX1JFUyArIFNVQlFNRl9HUk9VUFNfSElfUkVTXTsKLSAgVUNIQVIgICAgICAgICAgIGlpZEdyb3VwV2lkdGhMZFtRTUZfR1JPVVBTX0hJX1JFUyArIFNVQlFNRl9HUk9VUFNfSElfUkVTXTsKLSAgRklYUF9EQkwgICAgICAgIGlpZFF1YW50RXJyb3JUaHJlc2hvbGQ7Ci0KLSAgVUNIQVIgICAgICAgICAgIHBzQmFuZE5yZ1NjYWxlIFtQU19NQVhfQkFORFNdOworICBVQ0hBUiBwc0JhbmROcmdTY2FsZVtQU19NQVhfQkFORFNdOwogCiB9IFBTX0VOQ09ERTsKIAotCiB0eXBlZGVmIHN0cnVjdCBUX1BTX0VOQ09ERSAqSEFORExFX1BTX0VOQ09ERTsKIAotRkRLX1BTRU5DX0VSUk9SIEZES3NickVuY19DcmVhdGVQU0VuY29kZSgKLSAgICAgICAgSEFORExFX1BTX0VOQ09ERSAgICAgICAgICpwaFBzRW5jb2RlCi0gICAgICAgICk7CitGREtfUFNFTkNfRVJST1IgRkRLc2JyRW5jX0NyZWF0ZVBTRW5jb2RlKEhBTkRMRV9QU19FTkNPREUgKnBoUHNFbmNvZGUpOwogCi1GREtfUFNFTkNfRVJST1IgRkRLc2JyRW5jX0luaXRQU0VuY29kZSgKLSAgICAgICAgSEFORExFX1BTX0VOQ09ERSAgICAgICAgICBoUHNFbmNvZGUsCi0gICAgICAgIGNvbnN0IFBTX0JBTkRTICAgICAgICAgICAgcHNFbmNNb2RlLAotICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAgICAgICAgIGlpZFF1YW50RXJyb3JUaHJlc2hvbGQKLSAgICAgICAgKTsKK0ZES19QU0VOQ19FUlJPUiBGREtzYnJFbmNfSW5pdFBTRW5jb2RlKEhBTkRMRV9QU19FTkNPREUgaFBzRW5jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNfQkFORFMgcHNFbmNNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgaWlkUXVhbnRFcnJvclRocmVzaG9sZCk7CiAKLUZES19QU0VOQ19FUlJPUiBGREtzYnJFbmNfRGVzdHJveVBTRW5jb2RlKAotICAgICAgICBIQU5ETEVfUFNfRU5DT0RFICAgICAgICAgKnBoUHNFbmNvZGUKLSAgICAgICAgKTsKK0ZES19QU0VOQ19FUlJPUiBGREtzYnJFbmNfRGVzdHJveVBTRW5jb2RlKEhBTkRMRV9QU19FTkNPREUgKnBoUHNFbmNvZGUpOwogCiBGREtfUFNFTkNfRVJST1IgRkRLc2JyRW5jX1BTRW5jb2RlKAotICAgICAgICBIQU5ETEVfUFNfRU5DT0RFICAgICAgICAgIGhQc0VuY29kZSwKLSAgICAgICAgSEFORExFX1BTX09VVCAgICAgICAgICAgICBoUHNPdXQsCi0gICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAqZHluQmFuZFNjYWxlLAotICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgIG1heEVudmVsb3BlcywKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICpoeWJyaWREYXRhW0hZQlJJRF9GUkFNRVNJWkVdW01BWF9QU19DSEFOTkVMU11bMl0sCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgZnJhbWVTaXplLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIHNlbmRIZWFkZXIKLSAgICAgICAgKTsKKyAgICBIQU5ETEVfUFNfRU5DT0RFIGhQc0VuY29kZSwgSEFORExFX1BTX09VVCBoUHNPdXQsIFVDSEFSICpkeW5CYW5kU2NhbGUsCisgICAgVUlOVCBtYXhFbnZlbG9wZXMsCisgICAgRklYUF9EQkwgKmh5YnJpZERhdGFbSFlCUklEX0ZSQU1FU0laRV1bTUFYX1BTX0NIQU5ORUxTXVsyXSwKKyAgICBjb25zdCBJTlQgZnJhbWVTaXplLCBjb25zdCBJTlQgc2VuZEhlYWRlcik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9wc19tYWluLmNwcCBiL2xpYlNCUmVuYy9zcmMvcHNfbWFpbi5jcHAKaW5kZXggYWIxODNlMi4uNGQ3YTdhNSAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9wc19tYWluLmNwcAorKysgYi9saWJTQlJlbmMvc3JjL3BzX21haW4uY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDkyICs5MCw4MiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRyBBdWRpbyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgQXV0aG9yczogICAgICBNLiBNdWx0cnVzCi0gICBDb250ZW50cy9EZXNjcmlwdGlvbjogUFMgV3JhcHBlciwgRG93bm1peAorICAgQXV0aG9yKHMpOiAgIE0uIE11bHRydXMKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246IFBTIFdyYXBwZXIsIERvd25taXgKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInBzX21haW4uaCIKIAotCiAvKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwc19jb25zdC5oIgogI2luY2x1ZGUgInBzX2JpdGVuYy5oIgotCi0jaW5jbHVkZSAic2JyX3JhbS5oIgorI2luY2x1ZGUgInNicmVuY19yYW0uaCIKIAogLyotLS0tLS0tLS0tLS0tLS0gZnVuY3Rpb24gZGVjbGFyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyB2b2lkIHBzRmluZEJlc3RTY2FsaW5nKAotICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gIGhQYXJhbWV0cmljU3RlcmVvLAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgKmh5YnJpZERhdGFbSFlCUklEX0ZSQU1FU0laRV1bTUFYX1BTX0NIQU5ORUxTXVsyXSwKLSAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICpkeW5CYW5kU2NhbGUsCi0gICAgICAgIEZJWFBfUU1GICAgICAgICAgICAgICAgICAqbWF4QmFuZFZhbHVlLAotICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgKmRteFNjYWxlCi0gICAgICAgICk7CisgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvLAorICAgIEZJWFBfREJMICpoeWJyaWREYXRhW0hZQlJJRF9GUkFNRVNJWkVdW01BWF9QU19DSEFOTkVMU11bMl0sCisgICAgVUNIQVIgKmR5bkJhbmRTY2FsZSwgRklYUF9EQkwgKm1heEJhbmRWYWx1ZSwgU0NIQVIgKmRteFNjYWxlKTsKIAogLyotLS0tLS0tLS0tLS0tIGZ1bmN0aW9uIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0qLwotRkRLX1BTRU5DX0VSUk9SIFBTRW5jX0NyZWF0ZSgKLSAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICpwaFBhcmFtZXRyaWNTdGVyZW8KLSAgICAgICAgKQoteworRkRLX1BTRU5DX0VSUk9SIFBTRW5jX0NyZWF0ZShIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gKnBoUGFyYW1ldHJpY1N0ZXJlbykgewogICBGREtfUFNFTkNfRVJST1IgZXJyb3IgPSBQU0VOQ19PSzsKKyAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvID0gTlVMTDsKIAotICBpZiAocGhQYXJhbWV0cmljU3RlcmVvPT1OVUxMKSB7CisgIGlmIChwaFBhcmFtZXRyaWNTdGVyZW8gPT0gTlVMTCkgewogICAgIGVycm9yID0gUFNFTkNfSU5WQUxJRF9IQU5ETEU7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgaW50IGk7Ci0gICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvID0gTlVMTDsKIAotICAgIGlmIChOVUxMPT0oaFBhcmFtZXRyaWNTdGVyZW8gPSBHZXRSYW1fUGFyYW1TdGVyZW8oKSkpIHsKKyAgICBpZiAoTlVMTCA9PSAoaFBhcmFtZXRyaWNTdGVyZW8gPSBHZXRSYW1fUGFyYW1TdGVyZW8oKSkpIHsKICAgICAgIGVycm9yID0gUFNFTkNfTUVNT1JZX0VSUk9SOwogICAgICAgZ290byBiYWlsOwogICAgIH0KICAgICBGREttZW1jbGVhcihoUGFyYW1ldHJpY1N0ZXJlbywgc2l6ZW9mKFBBUkFNRVRSSUNfU1RFUkVPKSk7CiAKLSAgICBpZiAoUFNFTkNfT0sgIT0gKGVycm9yID0gRkRLc2JyRW5jX0NyZWF0ZVBTRW5jb2RlKCZoUGFyYW1ldHJpY1N0ZXJlby0+aFBzRW5jb2RlKSkpIHsKKyAgICBpZiAoUFNFTkNfT0sgIT0KKyAgICAgICAgKGVycm9yID0gRkRLc2JyRW5jX0NyZWF0ZVBTRW5jb2RlKCZoUGFyYW1ldHJpY1N0ZXJlby0+aFBzRW5jb2RlKSkpIHsKKyAgICAgIGVycm9yID0gUFNFTkNfTUVNT1JZX0VSUk9SOwogICAgICAgZ290byBiYWlsOwogICAgIH0KIAotICAgIGZvciAoaT0wOyBpPE1BWF9QU19DSEFOTkVMUzsgaSsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9QU19DSEFOTkVMUzsgaSsrKSB7CiAgICAgICBpZiAoRkRLaHlicmlkQW5hbHlzaXNPcGVuKAotICAgICAgICAgICAgJmhQYXJhbWV0cmljU3RlcmVvLT5mZGtIeWJBbmFGaWx0ZXJbaV0sCi0gICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPl9fc3RhdGljSHliQW5hU3RhdGVzTEZbaV0sCi0gICAgICAgICAgICAgc2l6ZW9mKGhQYXJhbWV0cmljU3RlcmVvLT5fX3N0YXRpY0h5YkFuYVN0YXRlc0xGW2ldKSwKLSAgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+X19zdGF0aWNIeWJBbmFTdGF0ZXNIRltpXSwKLSAgICAgICAgICAgICBzaXplb2YoaFBhcmFtZXRyaWNTdGVyZW8tPl9fc3RhdGljSHliQW5hU3RhdGVzSEZbaV0pCi0gICAgICAgICAgICAgKSAhPTAgKQotICAgICAgeworICAgICAgICAgICAgICAmaFBhcmFtZXRyaWNTdGVyZW8tPmZka0h5YkFuYUZpbHRlcltpXSwKKyAgICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPl9fc3RhdGljSHliQW5hU3RhdGVzTEZbaV0sCisgICAgICAgICAgICAgIHNpemVvZihoUGFyYW1ldHJpY1N0ZXJlby0+X19zdGF0aWNIeWJBbmFTdGF0ZXNMRltpXSksCisgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5fX3N0YXRpY0h5YkFuYVN0YXRlc0hGW2ldLAorICAgICAgICAgICAgICBzaXplb2YoaFBhcmFtZXRyaWNTdGVyZW8tPl9fc3RhdGljSHliQW5hU3RhdGVzSEZbaV0pKSAhPSAwKSB7CiAgICAgICAgIGVycm9yID0gUFNFTkNfTUVNT1JZX0VSUk9SOwogICAgICAgICBnb3RvIGJhaWw7CiAgICAgICB9CiAgICAgfQorICB9CiAKK2JhaWw6CisgIGlmIChwaFBhcmFtZXRyaWNTdGVyZW8gIT0gTlVMTCkgewogICAgICpwaFBhcmFtZXRyaWNTdGVyZW8gPSBoUGFyYW1ldHJpY1N0ZXJlbzsgLyogcmV0dXJuIGFsbG9jYXRlZCBoYW5kbGUgKi8KICAgfQotYmFpbDoKKworICBpZiAoZXJyb3IgIT0gUFNFTkNfT0spIHsKKyAgICBQU0VuY19EZXN0cm95KHBoUGFyYW1ldHJpY1N0ZXJlbyk7CisgIH0KICAgcmV0dXJuIGVycm9yOwogfQogCi1GREtfUFNFTkNfRVJST1IgUFNFbmNfSW5pdCgKLSAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICBoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgY29uc3QgSEFORExFX1BTRU5DX0NPTkZJRyBoUHNFbmNDb25maWcsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgbm9RbWZTbG90cywKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICBub1FtZkJhbmRzCi0gICAgICAgLFVDSEFSICAgICAgICAgICAgICAgICAgICAqZHluYW1pY19SQU0KLSAgICAgICAgKQoteworRkRLX1BTRU5DX0VSUk9SIFBTRW5jX0luaXQoSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSEFORExFX1BTRU5DX0NPTkZJRyBoUHNFbmNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9RbWZTbG90cywgSU5UIG5vUW1mQmFuZHMsIFVDSEFSICpkeW5hbWljX1JBTSkgewogICBGREtfUFNFTkNfRVJST1IgZXJyb3IgPSBQU0VOQ19PSzsKIAotICBpZiAoIChOVUxMPT1oUGFyYW1ldHJpY1N0ZXJlbykgfHwgKE5VTEw9PWhQc0VuY0NvbmZpZykgKSB7CisgIGlmICgoTlVMTCA9PSBoUGFyYW1ldHJpY1N0ZXJlbykgfHwgKE5VTEwgPT0gaFBzRW5jQ29uZmlnKSkgewogICAgIGVycm9yID0gUFNFTkNfSU5WQUxJRF9IQU5ETEU7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgaW50IGNoLCBpOwogCiAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPmluaXRQUyA9IDE7CkBAIC0xNzIsODIgKzE3Myw4MyBAQAogICAgIGhQYXJhbWV0cmljU3RlcmVvLT5ub1FtZkJhbmRzID0gbm9RbWZCYW5kczsKIAogICAgIC8qIGNsZWFyIGRlbGF5IGxpbmVzICovCi0gICAgRkRLbWVtY2xlYXIoaFBhcmFtZXRyaWNTdGVyZW8tPnFtZkRlbGF5TGluZXMsIHNpemVvZihoUGFyYW1ldHJpY1N0ZXJlby0+cW1mRGVsYXlMaW5lcykpOworICAgIEZES21lbWNsZWFyKGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheUxpbmVzLAorICAgICAgICAgICAgICAgIHNpemVvZihoUGFyYW1ldHJpY1N0ZXJlby0+cW1mRGVsYXlMaW5lcykpOwogCi0gICAgaFBhcmFtZXRyaWNTdGVyZW8tPnFtZkRlbGF5U2NhbGUgPSBGUkFDVF9CSVRTLTE7CisgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnFtZkRlbGF5U2NhbGUgPSBGUkFDVF9CSVRTIC0gMTsKIAogICAgIC8qIGNyZWF0ZSBjb25maWd1cmF0aW9uIGZvciBoeWJyaWQgZmlsdGVyIGJhbmsgKi8KLSAgICBmb3IgKGNoPTA7IGNoPE1BWF9QU19DSEFOTkVMUzsgY2grKykgewotICAgICAgRkRLaHlicmlkQW5hbHlzaXNJbml0KAotICAgICAgICAgICAgJmhQYXJhbWV0cmljU3RlcmVvLT5mZGtIeWJBbmFGaWx0ZXJbY2hdLAotICAgICAgICAgICAgIFRIUkVFX1RPX1RFTiwKLSAgICAgICAgICAgICBRTUZfQ0hBTk5FTFMsCi0gICAgICAgICAgICAgUU1GX0NIQU5ORUxTLAotICAgICAgICAgICAgIDEKLSAgICAgICAgICAgICApOworICAgIGZvciAoY2ggPSAwOyBjaCA8IE1BWF9QU19DSEFOTkVMUzsgY2grKykgeworICAgICAgRkRLaHlicmlkQW5hbHlzaXNJbml0KCZoUGFyYW1ldHJpY1N0ZXJlby0+ZmRrSHliQW5hRmlsdGVyW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJFRV9UT19URU4sIDY0LCA2NCwgMSk7CiAgICAgfSAvKiBjaCAqLwogCi0gICAgRkRLaHlicmlkU3ludGhlc2lzSW5pdCgKLSAgICAgICAgICAmaFBhcmFtZXRyaWNTdGVyZW8tPmZka0h5YlN5bkZpbHRlciwKLSAgICAgICAgICAgVEhSRUVfVE9fVEVOLAotICAgICAgICAgICBRTUZfQ0hBTk5FTFMsCi0gICAgICAgICAgIFFNRl9DSEFOTkVMUwotICAgICAgICAgICApOworICAgIEZES2h5YnJpZFN5bnRoZXNpc0luaXQoJmhQYXJhbWV0cmljU3RlcmVvLT5mZGtIeWJTeW5GaWx0ZXIsIFRIUkVFX1RPX1RFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LCA2NCk7CiAKICAgICAvKiBkZXRlcm1pbmUgYXZlcmFnZSBkZWxheSAqLwotICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wc0RlbGF5ID0gKEhZQlJJRF9GSUxURVJfREVMQVkqaFBhcmFtZXRyaWNTdGVyZW8tPm5vUW1mQmFuZHMpOworICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wc0RlbGF5ID0KKyAgICAgICAgKEhZQlJJRF9GSUxURVJfREVMQVkgKiBoUGFyYW1ldHJpY1N0ZXJlby0+bm9RbWZCYW5kcyk7CiAKLSAgICBpZiAoIChoUHNFbmNDb25maWctPm1heEVudmVsb3BlcyA8IFBTRU5DX05FTlZfMSkgfHwgKGhQc0VuY0NvbmZpZy0+bWF4RW52ZWxvcGVzID4gUFNFTkNfTkVOVl9NQVgpICkgeworICAgIGlmICgoaFBzRW5jQ29uZmlnLT5tYXhFbnZlbG9wZXMgPCBQU0VOQ19ORU5WXzEpIHx8CisgICAgICAgIChoUHNFbmNDb25maWctPm1heEVudmVsb3BlcyA+IFBTRU5DX05FTlZfTUFYKSkgewogICAgICAgaFBzRW5jQ29uZmlnLT5tYXhFbnZlbG9wZXMgPSBQU0VOQ19ORU5WX0RFRkFVTFQ7CiAgICAgfQogICAgIGhQYXJhbWV0cmljU3RlcmVvLT5tYXhFbnZlbG9wZXMgPSBoUHNFbmNDb25maWctPm1heEVudmVsb3BlczsKIAotICAgIGlmIChQU0VOQ19PSyAhPSAoZXJyb3IgPSBGREtzYnJFbmNfSW5pdFBTRW5jb2RlKGhQYXJhbWV0cmljU3RlcmVvLT5oUHNFbmNvZGUsIChQU19CQU5EUykgaFBzRW5jQ29uZmlnLT5uU3RlcmVvQmFuZHMsIGhQc0VuY0NvbmZpZy0+aWlkUXVhbnRFcnJvclRocmVzaG9sZCkpKXsKKyAgICBpZiAoUFNFTkNfT0sgIT0KKyAgICAgICAgKGVycm9yID0gRkRLc2JyRW5jX0luaXRQU0VuY29kZSgKKyAgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+aFBzRW5jb2RlLCAoUFNfQkFORFMpaFBzRW5jQ29uZmlnLT5uU3RlcmVvQmFuZHMsCisgICAgICAgICAgICAgaFBzRW5jQ29uZmlnLT5paWRRdWFudEVycm9yVGhyZXNob2xkKSkpIHsKICAgICAgIGdvdG8gYmFpbDsKICAgICB9CiAKLSAgICBmb3IgKGNoID0gMDsgY2g8TUFYX1BTX0NIQU5ORUxTOyBjaCArKykgewotICAgICAgRklYUF9EQkwgKnBEeW5SZWFsID0gR2V0UmFtX1Nicl9lbnZSQnVmZmVyIChjaCwgZHluYW1pY19SQU0pOwotICAgICAgRklYUF9EQkwgKnBEeW5JbWFnID0gR2V0UmFtX1Nicl9lbnZJQnVmZmVyIChjaCwgZHluYW1pY19SQU0pOworICAgIGZvciAoY2ggPSAwOyBjaCA8IE1BWF9QU19DSEFOTkVMUzsgY2grKykgeworICAgICAgRklYUF9EQkwgKnBEeW5SZWFsID0gR2V0UmFtX1Nicl9lbnZSQnVmZmVyKGNoLCBkeW5hbWljX1JBTSk7CisgICAgICBGSVhQX0RCTCAqcER5bkltYWcgPSBHZXRSYW1fU2JyX2VudklCdWZmZXIoY2gsIGR5bmFtaWNfUkFNKTsKIAotICAgICAgZm9yIChpPTA7IGk8SFlCUklEX0ZSQU1FU0laRTsgaSsrKSB7Ci0gICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtpK0hZQlJJRF9SRUFEX09GRlNFVF1bY2hdWzBdID0gJnBEeW5SZWFsW2kqTUFYX0hZQlJJRF9CQU5EU107Ci0gICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtpK0hZQlJJRF9SRUFEX09GRlNFVF1bY2hdWzFdID0gJnBEeW5JbWFnW2kqTUFYX0hZQlJJRF9CQU5EU107OworICAgICAgZm9yIChpID0gMDsgaSA8IEhZQlJJRF9GUkFNRVNJWkU7IGkrKykgeworICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbaSArIEhZQlJJRF9SRUFEX09GRlNFVF1bY2hdWzBdID0KKyAgICAgICAgICAgICZwRHluUmVhbFtpICogTUFYX0hZQlJJRF9CQU5EU107CisgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtpICsgSFlCUklEX1JFQURfT0ZGU0VUXVtjaF1bMV0gPQorICAgICAgICAgICAgJnBEeW5JbWFnW2kgKiBNQVhfSFlCUklEX0JBTkRTXTsKKyAgICAgICAgOwogICAgICAgfQogCi0gICAgICBmb3IgKGk9MDsgaTxIWUJSSURfUkVBRF9PRkZTRVQ7IGkrKykgewotICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbaV1bY2hdWzBdID0gaFBhcmFtZXRyaWNTdGVyZW8tPl9fc3RhdGljSHlicmlkRGF0YVtpXVtjaF1bMF07Ci0gICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtpXVtjaF1bMV0gPSBoUGFyYW1ldHJpY1N0ZXJlby0+X19zdGF0aWNIeWJyaWREYXRhW2ldW2NoXVsxXTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBIWUJSSURfUkVBRF9PRkZTRVQ7IGkrKykgeworICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbaV1bY2hdWzBdID0KKyAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5fX3N0YXRpY0h5YnJpZERhdGFbaV1bY2hdWzBdOworICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbaV1bY2hdWzFdID0KKyAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5fX3N0YXRpY0h5YnJpZERhdGFbaV1bY2hdWzFdOwogICAgICAgfQogICAgIH0gLyogY2ggKi8KIAogICAgIC8qIGNsZWFyIHN0YXRpYyBoeWJyaWQgYnVmZmVyICovCi0gICAgRkRLbWVtY2xlYXIoaFBhcmFtZXRyaWNTdGVyZW8tPl9fc3RhdGljSHlicmlkRGF0YSwgc2l6ZW9mKGhQYXJhbWV0cmljU3RlcmVvLT5fX3N0YXRpY0h5YnJpZERhdGEpKTsKKyAgICBGREttZW1jbGVhcihoUGFyYW1ldHJpY1N0ZXJlby0+X19zdGF0aWNIeWJyaWREYXRhLAorICAgICAgICAgICAgICAgIHNpemVvZihoUGFyYW1ldHJpY1N0ZXJlby0+X19zdGF0aWNIeWJyaWREYXRhKSk7CiAKICAgICAvKiBjbGVhciBicyBidWZmZXIgKi8KICAgICBGREttZW1jbGVhcihoUGFyYW1ldHJpY1N0ZXJlby0+cHNPdXQsIHNpemVvZihoUGFyYW1ldHJpY1N0ZXJlby0+cHNPdXQpKTsKIAotICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wc091dFswXS5lbmFibGVQU0hlYWRlciA9IDE7IC8qIHdyaXRlIHBzIGhlYWRlciBpbiBmaXJzdCBmcmFtZSAqLworICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wc091dFswXS5lbmFibGVQU0hlYWRlciA9CisgICAgICAgIDE7IC8qIHdyaXRlIHBzIGhlYWRlciBpbiBmaXJzdCBmcmFtZSAqLwogCiAgICAgLyogY2xlYXIgc2NhbGluZyBidWZmZXIgKi8KLSAgICBGREttZW1jbGVhcihoUGFyYW1ldHJpY1N0ZXJlby0+ZHluQmFuZFNjYWxlLCBzaXplb2YoVUNIQVIpKlBTX01BWF9CQU5EUyk7Ci0gICAgRkRLbWVtY2xlYXIoaFBhcmFtZXRyaWNTdGVyZW8tPm1heEJhbmRWYWx1ZSwgc2l6ZW9mKEZJWFBfUU1GKSpQU19NQVhfQkFORFMpOworICAgIEZES21lbWNsZWFyKGhQYXJhbWV0cmljU3RlcmVvLT5keW5CYW5kU2NhbGUsIHNpemVvZihVQ0hBUikgKiBQU19NQVhfQkFORFMpOworICAgIEZES21lbWNsZWFyKGhQYXJhbWV0cmljU3RlcmVvLT5tYXhCYW5kVmFsdWUsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZJWFBfREJMKSAqIFBTX01BWF9CQU5EUyk7CiAKICAgfSAvKiB2YWxpZCBoYW5kbGUgKi8KIGJhaWw6CiAgIHJldHVybiBlcnJvcjsKIH0KIAotCi1GREtfUFNFTkNfRVJST1IgUFNFbmNfRGVzdHJveSgKLSAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICpwaFBhcmFtZXRyaWNTdGVyZW8KLSAgICAgICAgKQoteworRkRLX1BTRU5DX0VSUk9SIFBTRW5jX0Rlc3Ryb3koSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICpwaFBhcmFtZXRyaWNTdGVyZW8pIHsKICAgRkRLX1BTRU5DX0VSUk9SIGVycm9yID0gUFNFTkNfT0s7CiAKLSAgaWYgKE5VTEwhPXBoUGFyYW1ldHJpY1N0ZXJlbykgeworICBpZiAoTlVMTCAhPSBwaFBhcmFtZXRyaWNTdGVyZW8pIHsKICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8gPSAqcGhQYXJhbWV0cmljU3RlcmVvOwotICAgIGlmKGhQYXJhbWV0cmljU3RlcmVvICE9IE5VTEwpeworICAgIGlmIChoUGFyYW1ldHJpY1N0ZXJlbyAhPSBOVUxMKSB7CiAgICAgICBGREtzYnJFbmNfRGVzdHJveVBTRW5jb2RlKCZoUGFyYW1ldHJpY1N0ZXJlby0+aFBzRW5jb2RlKTsKICAgICAgIEZyZWVSYW1fUGFyYW1TdGVyZW8ocGhQYXJhbWV0cmljU3RlcmVvKTsKICAgICB9CkBAIC0yNTcsMzIgKzI1OSwyNCBAQAogfQogCiBzdGF0aWMgRkRLX1BTRU5DX0VSUk9SIEV4dHJhY3RQU1BhcmFtZXRlcnMoCi0gICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgc2VuZEhlYWRlciwKLSAgICAgICAgRklYUF9EQkwgICAgICAgICAgICAgICAgICpoeWJyaWREYXRhW0hZQlJJRF9GUkFNRVNJWkVdW01BWF9QU19DSEFOTkVMU11bMl0KLSAgICAgICAgKQoteworICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywgY29uc3QgaW50IHNlbmRIZWFkZXIsCisgICAgRklYUF9EQkwgKmh5YnJpZERhdGFbSFlCUklEX0ZSQU1FU0laRV1bTUFYX1BTX0NIQU5ORUxTXVsyXSkgewogICBGREtfUFNFTkNfRVJST1IgZXJyb3IgPSBQU0VOQ19PSzsKIAogICBpZiAoaFBhcmFtZXRyaWNTdGVyZW8gPT0gTlVMTCkgewogICAgIGVycm9yID0gUFNFTkNfSU5WQUxJRF9IQU5ETEU7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgLyogY2FsbCBwcyBlbmNvZGUgZnVuY3Rpb24gKi8KLSAgICBpZiAoaFBhcmFtZXRyaWNTdGVyZW8tPmluaXRQUyl7CisgICAgaWYgKGhQYXJhbWV0cmljU3RlcmVvLT5pbml0UFMpIHsKICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wc091dFsxXSA9IGhQYXJhbWV0cmljU3RlcmVvLT5wc091dFswXTsKICAgICB9CiAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBzT3V0WzBdID0gaFBhcmFtZXRyaWNTdGVyZW8tPnBzT3V0WzFdOwogCi0gICAgaWYgKFBTRU5DX09LICE9IChlcnJvciA9IEZES3NickVuY19QU0VuY29kZSgKLSAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5oUHNFbmNvZGUsCi0gICAgICAgICAgICZoUGFyYW1ldHJpY1N0ZXJlby0+cHNPdXRbMV0sCi0gICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+ZHluQmFuZFNjYWxlLAotICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPm1heEVudmVsb3BlcywKLSAgICAgICAgICAgIGh5YnJpZERhdGEsCi0gICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+bm9RbWZTbG90cywKLSAgICAgICAgICAgIHNlbmRIZWFkZXIpKSkKLSAgICB7CisgICAgaWYgKFBTRU5DX09LICE9CisgICAgICAgIChlcnJvciA9IEZES3NickVuY19QU0VuY29kZSgKKyAgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+aFBzRW5jb2RlLCAmaFBhcmFtZXRyaWNTdGVyZW8tPnBzT3V0WzFdLAorICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5keW5CYW5kU2NhbGUsIGhQYXJhbWV0cmljU3RlcmVvLT5tYXhFbnZlbG9wZXMsCisgICAgICAgICAgICAgaHlicmlkRGF0YSwgaFBhcmFtZXRyaWNTdGVyZW8tPm5vUW1mU2xvdHMsIHNlbmRIZWFkZXIpKSkgewogICAgICAgZ290byBiYWlsOwogICAgIH0KIApAQCAtMjk1LDIwOSArMjg5LDIwMSBAQAogICByZXR1cm4gZXJyb3I7CiB9CiAKLQogc3RhdGljIEZES19QU0VOQ19FUlJPUiBEb3dubWl4UFNRbWZEYXRhKAotICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyAgICBzYnJTeW50aFFtZiwKLSAgICAgICBGSVhQX1FNRiAgICAgICAqKlJFU1RSSUNUIG1peFJlYWxRbWZEYXRhLAotICAgICAgIEZJWFBfUU1GICAgICAgICoqUkVTVFJJQ1QgbWl4SW1hZ1FtZkRhdGEsCi0gICAgICAgSU5UX1BDTSAgICAgICAgICAgICAgICAgICpkb3duc2FtcGxlZE91dFNpZ25hbCwKLSAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgKmh5YnJpZERhdGFbSFlCUklEX0ZSQU1FU0laRV1bTUFYX1BTX0NIQU5ORUxTXVsyXSwKLSAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIG5vUW1mU2xvdHMsCi0gICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICBwc1FtZlNjYWxlW01BWF9QU19DSEFOTkVMU10sCi0gICAgICAgU0NIQVIgICAgICAgICAgICAgICAgICAgICpxbWZTY2FsZQotICAgICAgICkKLXsKKyAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBzYnJTeW50aFFtZiwgRklYUF9EQkwgKipSRVNUUklDVCBtaXhSZWFsUW1mRGF0YSwKKyAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIG1peEltYWdRbWZEYXRhLCBJTlRfUENNICpkb3duc2FtcGxlZE91dFNpZ25hbCwKKyAgICBjb25zdCBVSU5UIGRvd25zYW1wbGVkT3V0U2lnbmFsQnVmU2l6ZSwKKyAgICBGSVhQX0RCTCAqaHlicmlkRGF0YVtIWUJSSURfRlJBTUVTSVpFXVtNQVhfUFNfQ0hBTk5FTFNdWzJdLAorICAgIGNvbnN0IElOVCBub1FtZlNsb3RzLCBjb25zdCBJTlQgcHNRbWZTY2FsZVtNQVhfUFNfQ0hBTk5FTFNdLAorICAgIFNDSEFSICpxbWZTY2FsZSkgewogICBGREtfUFNFTkNfRVJST1IgZXJyb3IgPSBQU0VOQ19PSzsKIAotICBpZihoUGFyYW1ldHJpY1N0ZXJlbyA9PSBOVUxMKXsKKyAgaWYgKGhQYXJhbWV0cmljU3RlcmVvID09IE5VTEwpIHsKICAgICBlcnJvciA9IFBTRU5DX0lOVkFMSURfSEFORExFOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIGludCBuLCBrOwotICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQocFdvcmtCdWZmZXIsIEZJWFBfUU1GLCAyKlFNRl9DSEFOTkVMUykKKyAgICBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKHBXb3JrQnVmZmVyLCBGSVhQX0RCTCwgMiAqIDY0KQogCiAgICAgLyogZGVmaW5lIHNjYWxpbmdzICovCi0gICAgaW50IGR5blFtZlNjYWxlID0gZml4TWF4KDAsIGhQYXJhbWV0cmljU3RlcmVvLT5kbXhTY2FsZS0xKTsgLyogc2NhbGUgb25lIGJpdCBtb3JlIGZvciBhZGRpdGlvbiBvZiBsZWZ0IGFuZCByaWdodCAqLworICAgIGludCBkeW5RbWZTY2FsZSA9IGZpeE1heCgKKyAgICAgICAgMCwgaFBhcmFtZXRyaWNTdGVyZW8tPmRteFNjYWxlIC0KKyAgICAgICAgICAgICAgIDEpOyAvKiBzY2FsZSBvbmUgYml0IG1vcmUgZm9yIGFkZGl0aW9uIG9mIGxlZnQgYW5kIHJpZ2h0ICovCiAgICAgaW50IGRvd25taXhTY2FsZSA9IHBzUW1mU2NhbGVbMF0gLSBkeW5RbWZTY2FsZTsKICAgICBjb25zdCBGSVhQX0RCTCBtYXhTdGVyZW9TY2FsZUZhY3RvciA9IE1BWFZBTF9EQkw7IC8qIDIuZi8yLmYgKi8KIAotICAgIGZvciAobiA9IDA7IG48bm9RbWZTbG90czsgbisrKSB7Ci0KKyAgICBmb3IgKG4gPSAwOyBuIDwgbm9RbWZTbG90czsgbisrKSB7CiAgICAgICBGSVhQX0RCTCB0bXBIeWJyaWRbMl1bTUFYX0hZQlJJRF9CQU5EU107CiAKLSAgICAgIGZvcihrID0gMDsgazw3MTsgaysrKXsKLSAgICAgICAgICBpbnQgZHluU2NhbGUsIHNjOyAvKiBzY2FsaW5nICovCi0gICAgICAgICAgRklYUF9RTUYgdG1wTGVmdFJlYWwsIHRtcFJpZ2h0UmVhbCwgdG1wTGVmdEltYWcsIHRtcFJpZ2h0SW1hZzsKLSAgICAgICAgICBGSVhQX0RCTCB0bXBTY2FsZUZhY3Rvciwgc3RlcmVvU2NhbGVGYWN0b3I7CisgICAgICBmb3IgKGsgPSAwOyBrIDwgNzE7IGsrKykgeworICAgICAgICBpbnQgZHluU2NhbGUsIHNjOyAvKiBzY2FsaW5nICovCisgICAgICAgIEZJWFBfREJMIHRtcExlZnRSZWFsLCB0bXBSaWdodFJlYWwsIHRtcExlZnRJbWFnLCB0bXBSaWdodEltYWc7CisgICAgICAgIEZJWFBfREJMIHRtcFNjYWxlRmFjdG9yLCBzdGVyZW9TY2FsZUZhY3RvcjsKIAotICAgICAgICAgIHRtcExlZnRSZWFsICA9IGh5YnJpZERhdGFbbl1bMF1bMF1ba107Ci0gICAgICAgICAgdG1wTGVmdEltYWcgID0gaHlicmlkRGF0YVtuXVswXVsxXVtrXTsKLSAgICAgICAgICB0bXBSaWdodFJlYWwgPSBoeWJyaWREYXRhW25dWzFdWzBdW2tdOwotICAgICAgICAgIHRtcFJpZ2h0SW1hZyA9IGh5YnJpZERhdGFbbl1bMV1bMV1ba107CisgICAgICAgIHRtcExlZnRSZWFsID0gaHlicmlkRGF0YVtuXVswXVswXVtrXTsKKyAgICAgICAgdG1wTGVmdEltYWcgPSBoeWJyaWREYXRhW25dWzBdWzFdW2tdOworICAgICAgICB0bXBSaWdodFJlYWwgPSBoeWJyaWREYXRhW25dWzFdWzBdW2tdOworICAgICAgICB0bXBSaWdodEltYWcgPSBoeWJyaWREYXRhW25dWzFdWzFdW2tdOwogCi0gICAgICAgICAgc2MgPSBmaXhNYXgoMCxDbnRMZWFkaW5nWmVyb3MoIGZpeE1heChmaXhNYXgoZml4cF9hYnModG1wTGVmdFJlYWwpLGZpeHBfYWJzKHRtcExlZnRJbWFnKSksZml4TWF4KGZpeHBfYWJzKHRtcFJpZ2h0UmVhbCksZml4cF9hYnModG1wUmlnaHRJbWFnKSkpICktMik7CisgICAgICAgIHNjID0gZml4TWF4KAorICAgICAgICAgICAgMCwgQ250TGVhZGluZ1plcm9zKGZpeE1heCgKKyAgICAgICAgICAgICAgICAgICBmaXhNYXgoZml4cF9hYnModG1wTGVmdFJlYWwpLCBmaXhwX2Ficyh0bXBMZWZ0SW1hZykpLAorICAgICAgICAgICAgICAgICAgIGZpeE1heChmaXhwX2Ficyh0bXBSaWdodFJlYWwpLCBmaXhwX2Ficyh0bXBSaWdodEltYWcpKSkpIC0KKyAgICAgICAgICAgICAgICAgICAyKTsKIAotICAgICAgICAgIHRtcExlZnRSZWFsICA8PD0gc2M7IHRtcExlZnRJbWFnICA8PD0gc2M7Ci0gICAgICAgICAgdG1wUmlnaHRSZWFsIDw8PSBzYzsgdG1wUmlnaHRJbWFnIDw8PSBzYzsKLSAgICAgICAgICBkeW5TY2FsZSA9IGZpeE1pbihzYy1keW5RbWZTY2FsZSxERlJBQ1RfQklUUy0xKTsKKyAgICAgICAgdG1wTGVmdFJlYWwgPDw9IHNjOworICAgICAgICB0bXBMZWZ0SW1hZyA8PD0gc2M7CisgICAgICAgIHRtcFJpZ2h0UmVhbCA8PD0gc2M7CisgICAgICAgIHRtcFJpZ2h0SW1hZyA8PD0gc2M7CisgICAgICAgIGR5blNjYWxlID0gZml4TWluKHNjIC0gZHluUW1mU2NhbGUsIERGUkFDVF9CSVRTIC0gMSk7CiAKLSAgICAgICAgICAvKiBjYWxjIHN0ZXJlbyBzY2FsZSBmYWN0b3IgdG8gYXZvaWQgbG9zcyBvZiBlbmVyZ3kgaW4gYmFuZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBzdGVyZW8gc2NhbGUgZmFjdG9yID0gbWluKDIuMGYsIHNxcnQoIChhYnMobChrLCBuKV4yICsgYWJzKHIoaywgbileMiApKSkvKDAuNWYqYWJzKGwoaywgbikgKyByKGssIG4pKSkgKSkgKi8KLSAgICAgICAgICBzdGVyZW9TY2FsZUZhY3RvciA9IGZQb3cyRGl2Mih0bXBMZWZ0UmVhbCkgICsgZlBvdzJEaXYyKHRtcExlZnRJbWFnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZlBvdzJEaXYyKHRtcFJpZ2h0UmVhbCkgKyBmUG93MkRpdjIodG1wUmlnaHRJbWFnKSA7CisgICAgICAgIC8qIGNhbGMgc3RlcmVvIHNjYWxlIGZhY3RvciB0byBhdm9pZCBsb3NzIG9mIGVuZXJneSBpbiBiYW5kcyAqLworICAgICAgICAvKiBzdGVyZW8gc2NhbGUgZmFjdG9yID0gbWluKDIuMGYsIHNxcnQoIChhYnMobChrLCBuKV4yICsgYWJzKHIoaywgbileMgorICAgICAgICAgKiApKSkvKDAuNWYqYWJzKGwoaywgbikgKyByKGssIG4pKSkgKSkgKi8KKyAgICAgICAgc3RlcmVvU2NhbGVGYWN0b3IgPSBmUG93MkRpdjIodG1wTGVmdFJlYWwpICsgZlBvdzJEaXYyKHRtcExlZnRJbWFnKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlBvdzJEaXYyKHRtcFJpZ2h0UmVhbCkgKyBmUG93MkRpdjIodG1wUmlnaHRJbWFnKTsKIAotICAgICAgICAgIC8qIG1pZ2h0IGJlIHRoYXQgdG1wU2NhbGVGYWN0b3IgYmVjb21lcyBuZWdhdGl2ZSwgc28gZmFicyguKSAqLwotICAgICAgICAgIHRtcFNjYWxlRmFjdG9yICAgID0gZml4cF9hYnMoc3RlcmVvU2NhbGVGYWN0b3IgKyBmTXVsdCh0bXBMZWZ0UmVhbCx0bXBSaWdodFJlYWwpICsgZk11bHQodG1wTGVmdEltYWcsdG1wUmlnaHRJbWFnKSk7CisgICAgICAgIC8qIG1pZ2h0IGJlIHRoYXQgdG1wU2NhbGVGYWN0b3IgYmVjb21lcyBuZWdhdGl2ZSwgc28gZmFicyguKSAqLworICAgICAgICB0bXBTY2FsZUZhY3RvciA9CisgICAgICAgICAgICBmaXhwX2FicyhzdGVyZW9TY2FsZUZhY3RvciArIGZNdWx0KHRtcExlZnRSZWFsLCB0bXBSaWdodFJlYWwpICsKKyAgICAgICAgICAgICAgICAgICAgIGZNdWx0KHRtcExlZnRJbWFnLCB0bXBSaWdodEltYWcpKTsKIAotICAgICAgICAgIC8qIG1pbigyLjBmLCBzcXJ0KHN0ZXJlb1NjYWxlRmFjdG9yLygwLjVmKnRtcFNjYWxlRmFjdG9yKSkpICAqLwotICAgICAgICAgIGlmICggKHN0ZXJlb1NjYWxlRmFjdG9yPj4xKSA8IGZNdWx0KG1heFN0ZXJlb1NjYWxlRmFjdG9yLHRtcFNjYWxlRmFjdG9yKSApIHsKKyAgICAgICAgLyogbWluKDIuMGYsIHNxcnQoc3RlcmVvU2NhbGVGYWN0b3IvKDAuNWYqdG1wU2NhbGVGYWN0b3IpKSkgICovCisgICAgICAgIGlmICgoc3RlcmVvU2NhbGVGYWN0b3IgPj4gMSkgPAorICAgICAgICAgICAgZk11bHQobWF4U3RlcmVvU2NhbGVGYWN0b3IsIHRtcFNjYWxlRmFjdG9yKSkgeworICAgICAgICAgIGludCBzY19udW0gPSBDb3VudExlYWRpbmdCaXRzKHN0ZXJlb1NjYWxlRmFjdG9yKTsKKyAgICAgICAgICBpbnQgc2NfZGVudW0gPSBDb3VudExlYWRpbmdCaXRzKHRtcFNjYWxlRmFjdG9yKTsKKyAgICAgICAgICBzYyA9IC0oc2NfbnVtIC0gc2NfZGVudW0pOwogCi0gICAgICAgICAgICAgIGludCBzY19udW0gICA9IENvdW50TGVhZGluZ0JpdHMoc3RlcmVvU2NhbGVGYWN0b3IpIDsKLSAgICAgICAgICAgICAgaW50IHNjX2RlbnVtID0gQ291bnRMZWFkaW5nQml0cyh0bXBTY2FsZUZhY3RvcikgOwotICAgICAgICAgICAgICBzYyAgICAgICA9IC0oc2NfbnVtLXNjX2RlbnVtKTsKKyAgICAgICAgICB0bXBTY2FsZUZhY3RvciA9IHNjaHVyX2Rpdigoc3RlcmVvU2NhbGVGYWN0b3IgPDwgKHNjX251bSkpID4+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wU2NhbGVGYWN0b3IgPDwgc2NfZGVudW0sIDE2KTsKIAotICAgICAgICAgICAgICB0bXBTY2FsZUZhY3RvciA9IHNjaHVyX2Rpdigoc3RlcmVvU2NhbGVGYWN0b3I8PChzY19udW0pKT4+MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcFNjYWxlRmFjdG9yPDxzY19kZW51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2KSA7Ci0KLSAgICAgICAgICAgICAgLyogcHJldmVudCBvZGQgc2NhbGluZyBmb3IgbmV4dCBzcXJ0IGNhbGN1bGF0aW9uICovCi0gICAgICAgICAgICAgIGlmIChzYyYweDEpIHsKLSAgICAgICAgICAgICAgICBzYysrOwotICAgICAgICAgICAgICAgIHRtcFNjYWxlRmFjdG9yPj49MTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBzdGVyZW9TY2FsZUZhY3RvciA9IHNxcnRGaXhwKHRtcFNjYWxlRmFjdG9yKTsKLSAgICAgICAgICAgICAgc3RlcmVvU2NhbGVGYWN0b3IgPDw9IChzYz4+MSk7CisgICAgICAgICAgLyogcHJldmVudCBvZGQgc2NhbGluZyBmb3IgbmV4dCBzcXJ0IGNhbGN1bGF0aW9uICovCisgICAgICAgICAgaWYgKHNjICYgMHgxKSB7CisgICAgICAgICAgICBzYysrOworICAgICAgICAgICAgdG1wU2NhbGVGYWN0b3IgPj49IDE7CiAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICBzdGVyZW9TY2FsZUZhY3RvciA9IG1heFN0ZXJlb1NjYWxlRmFjdG9yOwotICAgICAgICAgIH0KKyAgICAgICAgICBzdGVyZW9TY2FsZUZhY3RvciA9IHNxcnRGaXhwKHRtcFNjYWxlRmFjdG9yKTsKKyAgICAgICAgICBzdGVyZW9TY2FsZUZhY3RvciA8PD0gKHNjID4+IDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0ZXJlb1NjYWxlRmFjdG9yID0gbWF4U3RlcmVvU2NhbGVGYWN0b3I7CisgICAgICAgIH0KIAotICAgICAgICAgIC8qIHdyaXRlIGRhdGEgdG8gaHlicmlkIG91dHB1dCAqLwotICAgICAgICAgIHRtcEh5YnJpZFswXVtrXSA9IGZNdWx0RGl2MihzdGVyZW9TY2FsZUZhY3RvciwgKEZJWFBfUU1GKSh0bXBMZWZ0UmVhbCArIHRtcFJpZ2h0UmVhbCkpPj5keW5TY2FsZTsKLSAgICAgICAgICB0bXBIeWJyaWRbMV1ba10gPSBmTXVsdERpdjIoc3RlcmVvU2NhbGVGYWN0b3IsIChGSVhQX1FNRikodG1wTGVmdEltYWcgKyB0bXBSaWdodEltYWcpKT4+ZHluU2NhbGU7CisgICAgICAgIC8qIHdyaXRlIGRhdGEgdG8gaHlicmlkIG91dHB1dCAqLworICAgICAgICB0bXBIeWJyaWRbMF1ba10gPSBmTXVsdERpdjIoc3RlcmVvU2NhbGVGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKHRtcExlZnRSZWFsICsgdG1wUmlnaHRSZWFsKSkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHluU2NhbGU7CisgICAgICAgIHRtcEh5YnJpZFsxXVtrXSA9IGZNdWx0RGl2MihzdGVyZW9TY2FsZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkodG1wTGVmdEltYWcgKyB0bXBSaWdodEltYWcpKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5TY2FsZTsKIAogICAgICAgfSAvKiBoeWJyaWQgYmFuZHMgLSBrICovCiAKLSAgICAgIEZES2h5YnJpZFN5bnRoZXNpc0FwcGx5KAotICAgICAgICAgICAgJmhQYXJhbWV0cmljU3RlcmVvLT5mZGtIeWJTeW5GaWx0ZXIsCi0gICAgICAgICAgICAgdG1wSHlicmlkWzBdLAotICAgICAgICAgICAgIHRtcEh5YnJpZFsxXSwKLSAgICAgICAgICAgICBtaXhSZWFsUW1mRGF0YVtuXSwKLSAgICAgICAgICAgICBtaXhJbWFnUW1mRGF0YVtuXSk7CisgICAgICBGREtoeWJyaWRTeW50aGVzaXNBcHBseSgmaFBhcmFtZXRyaWNTdGVyZW8tPmZka0h5YlN5bkZpbHRlciwgdG1wSHlicmlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wSHlicmlkWzFdLCBtaXhSZWFsUW1mRGF0YVtuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peEltYWdRbWZEYXRhW25dKTsKIAogICAgICAgcW1mU3ludGhlc2lzRmlsdGVyaW5nU2xvdCgKLSAgICAgICAgICAgIHNiclN5bnRoUW1mLAotICAgICAgICAgICAgbWl4UmVhbFFtZkRhdGFbbl0sCi0gICAgICAgICAgICBtaXhJbWFnUW1mRGF0YVtuXSwKLSAgICAgICAgICAgIGRvd25taXhTY2FsZS03LAotICAgICAgICAgICAgZG93bm1peFNjYWxlLTcsCi0gICAgICAgICAgICBkb3duc2FtcGxlZE91dFNpZ25hbCsobipzYnJTeW50aFFtZi0+bm9fY2hhbm5lbHMpLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHBXb3JrQnVmZmVyKTsKKyAgICAgICAgICBzYnJTeW50aFFtZiwgbWl4UmVhbFFtZkRhdGFbbl0sIG1peEltYWdRbWZEYXRhW25dLCBkb3dubWl4U2NhbGUgLSA3LAorICAgICAgICAgIGRvd25taXhTY2FsZSAtIDcsCisgICAgICAgICAgZG93bnNhbXBsZWRPdXRTaWduYWwgKyAobiAqIHNiclN5bnRoUW1mLT5ub19jaGFubmVscyksIDEsCisgICAgICAgICAgcFdvcmtCdWZmZXIpOwogCiAgICAgfSAvKiBzbG90cyAqLwogCiAgICAgKnFtZlNjYWxlID0gLWRvd25taXhTY2FsZSArIDc7CiAKLSAgICBDX0FBTExPQ19TQ1JBVENIX0VORChwV29ya0J1ZmZlciwgRklYUF9RTUYsIDIqUU1GX0NIQU5ORUxTKQorICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKHBXb3JrQnVmZmVyLCBGSVhQX0RCTCwgMiAqIDY0KQogCi0gIHsKLSAgICBjb25zdCBJTlQgbm9RbWZTbG90czIgPSBoUGFyYW1ldHJpY1N0ZXJlby0+bm9RbWZTbG90cz4+MTsKLSAgICBjb25zdCBpbnQgbm9RbWZCYW5kcyAgPSBoUGFyYW1ldHJpY1N0ZXJlby0+bm9RbWZCYW5kczsKKyAgICB7CisgICAgICBjb25zdCBJTlQgbm9RbWZTbG90czIgPSBoUGFyYW1ldHJpY1N0ZXJlby0+bm9RbWZTbG90cyA+PiAxOworICAgICAgY29uc3QgaW50IG5vUW1mQmFuZHMgPSBoUGFyYW1ldHJpY1N0ZXJlby0+bm9RbWZCYW5kczsKIAotICAgIElOVCBzY2FsZSwgaSwgaiwgc2xvdE9mZnNldDsKKyAgICAgIElOVCBzY2FsZSwgaSwgaiwgc2xvdE9mZnNldDsKIAotICAgIEZJWFBfUU1GIHRtcFsyXVtRTUZfQ0hBTk5FTFNdOworICAgICAgRklYUF9EQkwgdG1wWzJdWzY0XTsKIAotICAgIGZvciAoaT0wOyBpPG5vUW1mU2xvdHMyOyBpKyspIHsKLSAgICAgIEZES21lbWNweSh0bXBbMF0sIGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheUxpbmVzWzBdW2ldLCBub1FtZkJhbmRzKnNpemVvZihGSVhQX1FNRikpOwotICAgICAgRkRLbWVtY3B5KHRtcFsxXSwgaFBhcmFtZXRyaWNTdGVyZW8tPnFtZkRlbGF5TGluZXNbMV1baV0sIG5vUW1mQmFuZHMqc2l6ZW9mKEZJWFBfUU1GKSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbm9RbWZTbG90czI7IGkrKykgeworICAgICAgICBGREttZW1jcHkodG1wWzBdLCBoUGFyYW1ldHJpY1N0ZXJlby0+cW1mRGVsYXlMaW5lc1swXVtpXSwKKyAgICAgICAgICAgICAgICAgIG5vUW1mQmFuZHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICAgICAgRkRLbWVtY3B5KHRtcFsxXSwgaFBhcmFtZXRyaWNTdGVyZW8tPnFtZkRlbGF5TGluZXNbMV1baV0sCisgICAgICAgICAgICAgICAgICBub1FtZkJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKLSAgICAgIEZES21lbWNweShoUGFyYW1ldHJpY1N0ZXJlby0+cW1mRGVsYXlMaW5lc1swXVtpXSwgbWl4UmVhbFFtZkRhdGFbaStub1FtZlNsb3RzMl0sIG5vUW1mQmFuZHMqc2l6ZW9mKEZJWFBfUU1GKSk7Ci0gICAgICBGREttZW1jcHkoaFBhcmFtZXRyaWNTdGVyZW8tPnFtZkRlbGF5TGluZXNbMV1baV0sIG1peEltYWdRbWZEYXRhW2krbm9RbWZTbG90czJdLCBub1FtZkJhbmRzKnNpemVvZihGSVhQX1FNRikpOworICAgICAgICBGREttZW1jcHkoaFBhcmFtZXRyaWNTdGVyZW8tPnFtZkRlbGF5TGluZXNbMF1baV0sCisgICAgICAgICAgICAgICAgICBtaXhSZWFsUW1mRGF0YVtpICsgbm9RbWZTbG90czJdLAorICAgICAgICAgICAgICAgICAgbm9RbWZCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICBGREttZW1jcHkoaFBhcmFtZXRyaWNTdGVyZW8tPnFtZkRlbGF5TGluZXNbMV1baV0sCisgICAgICAgICAgICAgICAgICBtaXhJbWFnUW1mRGF0YVtpICsgbm9RbWZTbG90czJdLAorICAgICAgICAgICAgICAgICAgbm9RbWZCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOwogCi0gICAgICBGREttZW1jcHkobWl4UmVhbFFtZkRhdGFbaStub1FtZlNsb3RzMl0sIG1peFJlYWxRbWZEYXRhW2ldLCBub1FtZkJhbmRzKnNpemVvZihGSVhQX1FNRikpOwotICAgICAgRkRLbWVtY3B5KG1peEltYWdRbWZEYXRhW2krbm9RbWZTbG90czJdLCBtaXhJbWFnUW1mRGF0YVtpXSwgbm9RbWZCYW5kcypzaXplb2YoRklYUF9RTUYpKTsKKyAgICAgICAgRkRLbWVtY3B5KG1peFJlYWxRbWZEYXRhW2kgKyBub1FtZlNsb3RzMl0sIG1peFJlYWxRbWZEYXRhW2ldLAorICAgICAgICAgICAgICAgICAgbm9RbWZCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICBGREttZW1jcHkobWl4SW1hZ1FtZkRhdGFbaSArIG5vUW1mU2xvdHMyXSwgbWl4SW1hZ1FtZkRhdGFbaV0sCisgICAgICAgICAgICAgICAgICBub1FtZkJhbmRzICogc2l6ZW9mKEZJWFBfREJMKSk7CiAKLSAgICAgIEZES21lbWNweShtaXhSZWFsUW1mRGF0YVtpXSwgdG1wWzBdLCBub1FtZkJhbmRzKnNpemVvZihGSVhQX1FNRikpOwotICAgICAgRkRLbWVtY3B5KG1peEltYWdRbWZEYXRhW2ldLCB0bXBbMV0sIG5vUW1mQmFuZHMqc2l6ZW9mKEZJWFBfUU1GKSk7Ci0gICAgfQotCi0gICAgaWYgKGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheVNjYWxlID4gKnFtZlNjYWxlKSB7Ci0gICAgICBzY2FsZSA9IGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheVNjYWxlIC0gKnFtZlNjYWxlOwotICAgICAgc2xvdE9mZnNldCA9IDA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgc2NhbGUgPSAqcW1mU2NhbGUgLSBoUGFyYW1ldHJpY1N0ZXJlby0+cW1mRGVsYXlTY2FsZTsKLSAgICAgIHNsb3RPZmZzZXQgPSBub1FtZlNsb3RzMjsKLSAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaTxub1FtZlNsb3RzMjsgaSsrKSB7Ci0gICAgICBmb3IgKGo9MDsgajxub1FtZkJhbmRzOyBqKyspIHsKLSAgICAgICAgbWl4UmVhbFFtZkRhdGFbaStzbG90T2Zmc2V0XVtqXSA+Pj0gc2NhbGU7Ci0gICAgICAgIG1peEltYWdRbWZEYXRhW2krc2xvdE9mZnNldF1bal0gPj49IHNjYWxlOworICAgICAgICBGREttZW1jcHkobWl4UmVhbFFtZkRhdGFbaV0sIHRtcFswXSwgbm9RbWZCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOworICAgICAgICBGREttZW1jcHkobWl4SW1hZ1FtZkRhdGFbaV0sIHRtcFsxXSwgbm9RbWZCYW5kcyAqIHNpemVvZihGSVhQX0RCTCkpOwogICAgICAgfQotICAgIH0KIAotICAgIHNjYWxlID0gKnFtZlNjYWxlOwotICAgICpxbWZTY2FsZSA9IEZES21pbigqcW1mU2NhbGUsIGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheVNjYWxlKTsKLSAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cW1mRGVsYXlTY2FsZSA9IHNjYWxlOwotICB9CisgICAgICBpZiAoaFBhcmFtZXRyaWNTdGVyZW8tPnFtZkRlbGF5U2NhbGUgPiAqcW1mU2NhbGUpIHsKKyAgICAgICAgc2NhbGUgPSBoUGFyYW1ldHJpY1N0ZXJlby0+cW1mRGVsYXlTY2FsZSAtICpxbWZTY2FsZTsKKyAgICAgICAgc2xvdE9mZnNldCA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBzY2FsZSA9ICpxbWZTY2FsZSAtIGhQYXJhbWV0cmljU3RlcmVvLT5xbWZEZWxheVNjYWxlOworICAgICAgICBzbG90T2Zmc2V0ID0gbm9RbWZTbG90czI7CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBub1FtZlNsb3RzMjsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBub1FtZkJhbmRzOyBqKyspIHsKKyAgICAgICAgICBtaXhSZWFsUW1mRGF0YVtpICsgc2xvdE9mZnNldF1bal0gPj49IHNjYWxlOworICAgICAgICAgIG1peEltYWdRbWZEYXRhW2kgKyBzbG90T2Zmc2V0XVtqXSA+Pj0gc2NhbGU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc2NhbGUgPSAqcW1mU2NhbGU7CisgICAgICAqcW1mU2NhbGUgPSBmTWluKCpxbWZTY2FsZSwgaFBhcmFtZXRyaWNTdGVyZW8tPnFtZkRlbGF5U2NhbGUpOworICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnFtZkRlbGF5U2NhbGUgPSBzY2FsZTsKKyAgICB9CiAKICAgfSAvKiB2YWxpZCBoYW5kbGUgKi8KIAogICByZXR1cm4gZXJyb3I7CiB9CiAKLQotSU5UIEZES3NickVuY19QU0VuY19Xcml0ZVBTRGF0YSgKLSAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICBoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgICBoQml0c3RyZWFtCi0gICAgICAgICkKLXsKLSAgcmV0dXJuICggKGhQYXJhbWV0cmljU3RlcmVvIT1OVUxMKSA/IEZES3NickVuY19Xcml0ZVBTQml0c3RyZWFtKCZoUGFyYW1ldHJpY1N0ZXJlby0+cHNPdXRbMF0sIGhCaXRzdHJlYW0pIDogMCApOworSU5UIEZES3NickVuY19QU0VuY19Xcml0ZVBTRGF0YShIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gaFBhcmFtZXRyaWNTdGVyZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRzdHJlYW0pIHsKKyAgcmV0dXJuICgKKyAgICAgIChoUGFyYW1ldHJpY1N0ZXJlbyAhPSBOVUxMKQorICAgICAgICAgID8gRkRLc2JyRW5jX1dyaXRlUFNCaXRzdHJlYW0oJmhQYXJhbWV0cmljU3RlcmVvLT5wc091dFswXSwgaEJpdHN0cmVhbSkKKyAgICAgICAgICA6IDApOwogfQogCi0KIEZES19QU0VOQ19FUlJPUiBGREtzYnJFbmNfUFNFbmNfUGFyYW1ldHJpY1N0ZXJlb1Byb2Nlc3NpbmcoCi0gICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgIElOVF9QQ00gICAgICAgICAgICAgICAgICAqc2FtcGxlc1syXSwKLSAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICB0aW1lSW5TdHJpZGUsCi0gICAgICAgIFFNRl9GSUxURVJfQkFOSyAgICAgICAgICoqaFFtZkFuYWx5c2lzLAotICAgICAgICBGSVhQX1FNRiAqKlJFU1RSSUNUICAgICAgIGRvd25taXhlZFJlYWxRbWZEYXRhLAotICAgICAgICBGSVhQX1FNRiAqKlJFU1RSSUNUICAgICAgIGRvd25taXhlZEltYWdRbWZEYXRhLAotICAgICAgICBJTlRfUENNICAgICAgICAgICAgICAgICAgKmRvd25zYW1wbGVkT3V0U2lnbmFsLAotICAgICAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LICAgIHNiclN5bnRoUW1mLAotICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgKnFtZlNjYWxlLAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgIHNlbmRIZWFkZXIKLSAgICAgICAgKQoteworICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywgSU5UX1BDTSAqc2FtcGxlc1syXSwKKyAgICBVSU5UIHNhbXBsZXNCdWZTaXplLCBRTUZfRklMVEVSX0JBTksgKipoUW1mQW5hbHlzaXMsCisgICAgRklYUF9EQkwgKipSRVNUUklDVCBkb3dubWl4ZWRSZWFsUW1mRGF0YSwKKyAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIGRvd25taXhlZEltYWdRbWZEYXRhLCBJTlRfUENNICpkb3duc2FtcGxlZE91dFNpZ25hbCwKKyAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIHNiclN5bnRoUW1mLCBTQ0hBUiAqcW1mU2NhbGUsIGNvbnN0IGludCBzZW5kSGVhZGVyKSB7CiAgIEZES19QU0VOQ19FUlJPUiBlcnJvciA9IFBTRU5DX09LOwogICBJTlQgcHNRbWZTY2FsZVtNQVhfUFNfQ0hBTk5FTFNdID0gezB9OwogICBpbnQgcHNDaCwgaTsKLSAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChwV29ya0J1ZmZlciwgRklYUF9RTUYsIDQqUU1GX0NIQU5ORUxTKQorICBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKHBXb3JrQnVmZmVyLCBGSVhQX0RCTCwgNCAqIDY0KQogCi0gIGZvciAocHNDaCA9IDA7IHBzQ2g8TUFYX1BTX0NIQU5ORUxTOyBwc0NoICsrKSB7Ci0KKyAgZm9yIChwc0NoID0gMDsgcHNDaCA8IE1BWF9QU19DSEFOTkVMUzsgcHNDaCsrKSB7CiAgICAgZm9yIChpID0gMDsgaSA8IGhRbWZBbmFseXNpc1twc0NoXS0+bm9fY29sOyBpKyspIHsKLQogICAgICAgcW1mQW5hbHlzaXNGaWx0ZXJpbmdTbG90KAotICAgICAgICAgIGhRbWZBbmFseXNpc1twc0NoXSwKLSAgICAgICAgICZwV29ya0J1ZmZlclsyKlFNRl9DSEFOTkVMU10sIC8qIHFtZlJlYWxbUU1GX0NIQU5ORUxTXSAqLwotICAgICAgICAgJnBXb3JrQnVmZmVyWzMqUU1GX0NIQU5ORUxTXSwgLyogcW1mSW1hZ1tRTUZfQ0hBTk5FTFNdICovCi0gICAgICAgICAgc2FtcGxlc1twc0NoXStpKihoUW1mQW5hbHlzaXNbcHNDaF0tPm5vX2NoYW5uZWxzKnRpbWVJblN0cmlkZSksCi0gICAgICAgICAgdGltZUluU3RyaWRlLAotICAgICAgICAgJnBXb3JrQnVmZmVyWzAqUU1GX0NIQU5ORUxTXSAgLyogcW1mIHdvcmtidWZmZXIgMipRTUZfQ0hBTk5FTFMgKi8KLSAgICAgICAgICApOworICAgICAgICAgIGhRbWZBbmFseXNpc1twc0NoXSwgJnBXb3JrQnVmZmVyWzIgKiA2NF0sIC8qIHFtZlJlYWxbNjRdICovCisgICAgICAgICAgJnBXb3JrQnVmZmVyWzMgKiA2NF0sICAgICAgICAgICAgICAgICAgICAgLyogcW1mSW1hZ1s2NF0gKi8KKyAgICAgICAgICBzYW1wbGVzW3BzQ2hdICsgaSAqIGhRbWZBbmFseXNpc1twc0NoXS0+bm9fY2hhbm5lbHMsIDEsCisgICAgICAgICAgJnBXb3JrQnVmZmVyWzAgKiA2NF0gLyogcW1mIHdvcmtidWZmZXIgMio2NCAqLworICAgICAgKTsKIAogICAgICAgRkRLaHlicmlkQW5hbHlzaXNBcHBseSgKLSAgICAgICAgICZoUGFyYW1ldHJpY1N0ZXJlby0+ZmRrSHliQW5hRmlsdGVyW3BzQ2hdLAotICAgICAgICAgJnBXb3JrQnVmZmVyWzIqUU1GX0NIQU5ORUxTXSwgIC8qIHFtZlJlYWxbUU1GX0NIQU5ORUxTXSAqLwotICAgICAgICAgJnBXb3JrQnVmZmVyWzMqUU1GX0NIQU5ORUxTXSwgIC8qIHFtZkltYWdbUU1GX0NIQU5ORUxTXSAqLwotICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtpK0hZQlJJRF9SRUFEX09GRlNFVF1bcHNDaF1bMF0sCi0gICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2krSFlCUklEX1JFQURfT0ZGU0VUXVtwc0NoXVsxXQotICAgICAgICAgICk7CisgICAgICAgICAgJmhQYXJhbWV0cmljU3RlcmVvLT5mZGtIeWJBbmFGaWx0ZXJbcHNDaF0sCisgICAgICAgICAgJnBXb3JrQnVmZmVyWzIgKiA2NF0sIC8qIHFtZlJlYWxbNjRdICovCisgICAgICAgICAgJnBXb3JrQnVmZmVyWzMgKiA2NF0sIC8qIHFtZkltYWdbNjRdICovCisgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2kgKyBIWUJSSURfUkVBRF9PRkZTRVRdW3BzQ2hdWzBdLAorICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtpICsgSFlCUklEX1JFQURfT0ZGU0VUXVtwc0NoXVsxXSk7CiAKICAgICB9IC8qIG5vX2NvbCBsb29wICBpICAqLwogCkBAIC01MDUsMzEgKzQ5MSw0OCBAQAogCiAgIH0gLyogZm9yIHBzQ2ggKi8KIAotICBDX0FBTExPQ19TQ1JBVENIX0VORChwV29ya0J1ZmZlciwgRklYUF9RTUYsIDQqUU1GX0NIQU5ORUxTKQorICBDX0FBTExPQ19TQ1JBVENIX0VORChwV29ya0J1ZmZlciwgRklYUF9EQkwsIDQgKiA2NCkKIAogICAvKiBmaW5kIGJlc3Qgc2NhbGluZyBpbiBuZXcgUU1GIGFuZCBIeWJyaWQgZGF0YSAqLwotICBwc0ZpbmRCZXN0U2NhbGluZyggaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgICAgICAgICAgICAgICZoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbSFlCUklEX1JFQURfT0ZGU0VUXSwKLSAgICAgICAgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5keW5CYW5kU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+bWF4QmFuZFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAmaFBhcmFtZXRyaWNTdGVyZW8tPmRteFNjYWxlICkgOwotCisgIHBzRmluZEJlc3RTY2FsaW5nKAorICAgICAgaFBhcmFtZXRyaWNTdGVyZW8sICZoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbSFlCUklEX1JFQURfT0ZGU0VUXSwKKyAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5keW5CYW5kU2NhbGUsIGhQYXJhbWV0cmljU3RlcmVvLT5tYXhCYW5kVmFsdWUsCisgICAgICAmaFBhcmFtZXRyaWNTdGVyZW8tPmRteFNjYWxlKTsKIAogICAvKiBleHRyYWN0IHRoZSBwcyBwYXJhbWV0ZXJzICovCi0gIGlmKFBTRU5DX09LICE9IChlcnJvciA9IEV4dHJhY3RQU1BhcmFtZXRlcnMoaFBhcmFtZXRyaWNTdGVyZW8sIHNlbmRIZWFkZXIsICZoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbMF0pKSl7CisgIGlmIChQU0VOQ19PSyAhPQorICAgICAgKGVycm9yID0gRXh0cmFjdFBTUGFyYW1ldGVycyhoUGFyYW1ldHJpY1N0ZXJlbywgc2VuZEhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVswXSkpKSB7CiAgICAgZ290byBiYWlsOwogICB9CiAKICAgLyogc2F2ZSBoeWJyaWQgZGF0ZSBmb3IgbmV4dCBmcmFtZSAqLwotICBmb3IgKGk9MDsgaTxIWUJSSURfUkVBRF9PRkZTRVQ7IGkrKykgewotICAgIEZES21lbWNweShoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbaV1bMF1bMF0sIGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtIWUJSSURfRlJBTUVTSVpFK2ldWzBdWzBdLCBNQVhfSFlCUklEX0JBTkRTKnNpemVvZihGSVhQX0RCTCkpOyAvKiBsZWZ0LCByZWFsICovCi0gICAgRkRLbWVtY3B5KGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtpXVswXVsxXSwgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW0hZQlJJRF9GUkFNRVNJWkUraV1bMF1bMV0sIE1BWF9IWUJSSURfQkFORFMqc2l6ZW9mKEZJWFBfREJMKSk7IC8qIGxlZnQsIGltYWcgKi8KLSAgICBGREttZW1jcHkoaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2ldWzFdWzBdLCBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbSFlCUklEX0ZSQU1FU0laRStpXVsxXVswXSwgTUFYX0hZQlJJRF9CQU5EUypzaXplb2YoRklYUF9EQkwpKTsgLyogcmlnaHQsIHJlYWwgKi8KLSAgICBGREttZW1jcHkoaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2ldWzFdWzFdLCBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbSFlCUklEX0ZSQU1FU0laRStpXVsxXVsxXSwgTUFYX0hZQlJJRF9CQU5EUypzaXplb2YoRklYUF9EQkwpKTsgLyogcmlnaHQsIGltYWcgKi8KKyAgZm9yIChpID0gMDsgaSA8IEhZQlJJRF9SRUFEX09GRlNFVDsgaSsrKSB7CisgICAgRkRLbWVtY3B5KAorICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbaV1bMF1bMF0sCisgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtoUGFyYW1ldHJpY1N0ZXJlby0+bm9RbWZTbG90cyArIGldWzBdWzBdLAorICAgICAgICBNQVhfSFlCUklEX0JBTkRTICogc2l6ZW9mKEZJWFBfREJMKSk7IC8qIGxlZnQsIHJlYWwgKi8KKyAgICBGREttZW1jcHkoCisgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5wSHlicmlkRGF0YVtpXVswXVsxXSwKKyAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2hQYXJhbWV0cmljU3RlcmVvLT5ub1FtZlNsb3RzICsgaV1bMF1bMV0sCisgICAgICAgIE1BWF9IWUJSSURfQkFORFMgKiBzaXplb2YoRklYUF9EQkwpKTsgLyogbGVmdCwgaW1hZyAqLworICAgIEZES21lbWNweSgKKyAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2ldWzFdWzBdLAorICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbaFBhcmFtZXRyaWNTdGVyZW8tPm5vUW1mU2xvdHMgKyBpXVsxXVswXSwKKyAgICAgICAgTUFYX0hZQlJJRF9CQU5EUyAqIHNpemVvZihGSVhQX0RCTCkpOyAvKiByaWdodCwgcmVhbCAqLworICAgIEZES21lbWNweSgKKyAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW2ldWzFdWzFdLAorICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbaFBhcmFtZXRyaWNTdGVyZW8tPm5vUW1mU2xvdHMgKyBpXVsxXVsxXSwKKyAgICAgICAgTUFYX0hZQlJJRF9CQU5EUyAqIHNpemVvZihGSVhQX0RCTCkpOyAvKiByaWdodCwgaW1hZyAqLwogICB9CiAKICAgLyogZG93bm1peCBhbmQgaHlicmlkIHN5bnRoZXNpcyAqLwotICBpZiAoUFNFTkNfT0sgIT0gKGVycm9yID0gRG93bm1peFBTUW1mRGF0YShoUGFyYW1ldHJpY1N0ZXJlbywgc2JyU3ludGhRbWYsIGRvd25taXhlZFJlYWxRbWZEYXRhLCBkb3dubWl4ZWRJbWFnUW1mRGF0YSwgZG93bnNhbXBsZWRPdXRTaWduYWwsICZoUGFyYW1ldHJpY1N0ZXJlby0+cEh5YnJpZERhdGFbSFlCUklEX1JFQURfT0ZGU0VUXSwgaFBhcmFtZXRyaWNTdGVyZW8tPm5vUW1mU2xvdHMsIHBzUW1mU2NhbGUsIHFtZlNjYWxlKSkpIHsKKyAgaWYgKFBTRU5DX09LICE9CisgICAgICAoZXJyb3IgPSBEb3dubWl4UFNRbWZEYXRhKAorICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlbywgc2JyU3ludGhRbWYsIGRvd25taXhlZFJlYWxRbWZEYXRhLAorICAgICAgICAgICBkb3dubWl4ZWRJbWFnUW1mRGF0YSwgZG93bnNhbXBsZWRPdXRTaWduYWwsIHNhbXBsZXNCdWZTaXplLAorICAgICAgICAgICAmaFBhcmFtZXRyaWNTdGVyZW8tPnBIeWJyaWREYXRhW0hZQlJJRF9SRUFEX09GRlNFVF0sCisgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvLT5ub1FtZlNsb3RzLCBwc1FtZlNjYWxlLCBxbWZTY2FsZSkpKSB7CiAgICAgZ290byBiYWlsOwogICB9CiAKQEAgLTUzOSwyOCArNTQyLDI0IEBACiB9CiAKIHN0YXRpYyB2b2lkIHBzRmluZEJlc3RTY2FsaW5nKAotICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gIGhQYXJhbWV0cmljU3RlcmVvLAotICAgICAgICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgKmh5YnJpZERhdGFbSFlCUklEX0ZSQU1FU0laRV1bTUFYX1BTX0NIQU5ORUxTXVsyXSwKLSAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICpkeW5CYW5kU2NhbGUsCi0gICAgICAgIEZJWFBfUU1GICAgICAgICAgICAgICAgICAqbWF4QmFuZFZhbHVlLAotICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgKmRteFNjYWxlCi0gICAgICAgICkKLXsKLSAgSEFORExFX1BTX0VOQ09ERSBoUHNFbmNvZGUgICAgICA9ICBoUGFyYW1ldHJpY1N0ZXJlby0+aFBzRW5jb2RlOworICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICBGSVhQX0RCTCAqaHlicmlkRGF0YVtIWUJSSURfRlJBTUVTSVpFXVtNQVhfUFNfQ0hBTk5FTFNdWzJdLAorICAgIFVDSEFSICpkeW5CYW5kU2NhbGUsIEZJWFBfREJMICptYXhCYW5kVmFsdWUsIFNDSEFSICpkbXhTY2FsZSkgeworICBIQU5ETEVfUFNfRU5DT0RFIGhQc0VuY29kZSA9IGhQYXJhbWV0cmljU3RlcmVvLT5oUHNFbmNvZGU7CiAKICAgSU5UIGdyb3VwLCBiaW4sIGNvbCwgYmFuZDsKLSAgY29uc3QgSU5UIGZyYW1lU2l6ZSAgPSBoUGFyYW1ldHJpY1N0ZXJlby0+bm9RbWZTbG90czsKLSAgY29uc3QgSU5UIHBzQmFuZHMgICAgPSAoSU5UKSBoUHNFbmNvZGUtPnBzRW5jTW9kZTsKKyAgY29uc3QgSU5UIGZyYW1lU2l6ZSA9IGhQYXJhbWV0cmljU3RlcmVvLT5ub1FtZlNsb3RzOworICBjb25zdCBJTlQgcHNCYW5kcyA9IChJTlQpaFBzRW5jb2RlLT5wc0VuY01vZGU7CiAgIGNvbnN0IElOVCBuSWlkR3JvdXBzID0gaFBzRW5jb2RlLT5uUW1mSWlkR3JvdXBzICsgaFBzRW5jb2RlLT5uU3ViUW1mSWlkR3JvdXBzOwogCiAgIC8qIGdyb3VwIHdpc2Ugc2NhbGluZyAqLwotICBGSVhQX1FNRiBtYXhWYWwgWzJdW1BTX01BWF9CQU5EU107Ci0gIEZJWFBfUU1GIG1heFZhbHVlID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgRklYUF9EQkwgbWF4VmFsWzJdW1BTX01BWF9CQU5EU107CisgIEZJWFBfREJMIG1heFZhbHVlID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKIAogICBGREttZW1jbGVhcihtYXhWYWwsIHNpemVvZihtYXhWYWwpKTsKIAogICAvKiBzdGFydCB3aXRoIGh5YnJpZCBkYXRhICovCi0gIGZvciAoZ3JvdXA9MDsgZ3JvdXAgPCBuSWlkR3JvdXBzOyBncm91cCsrKSB7CisgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IG5JaWRHcm91cHM7IGdyb3VwKyspIHsKICAgICAvKiBUcmFuc2xhdGUgZ3JvdXAgdG8gYmluICovCiAgICAgYmluID0gaFBzRW5jb2RlLT5zdWJiYW5kMnBhcmFtZXRlckluZGV4W2dyb3VwXTsKIApAQCAtNTcwLDQ5ICs1NjksMzggQEAKICAgICB9CiAKICAgICAvKiBRTUYgZG93bm1peCBzY2FsaW5nICovCi0gICAgewotICAgICAgRklYUF9RTUYgdG1wID0gbWF4VmFsWzBdW2Jpbl07Ci0gICAgICBpbnQgaTsKLSAgICAgIGZvciAoY29sPTA7IGNvbDxmcmFtZVNpemUtSFlCUklEX1JFQURfT0ZGU0VUOyBjb2wrKykgewotICAgICAgICBmb3IgKGkgPSBoUHNFbmNvZGUtPmlpZEdyb3VwQm9yZGVyc1tncm91cF07IGkgPCBoUHNFbmNvZGUtPmlpZEdyb3VwQm9yZGVyc1tncm91cCsxXTsgaSsrKSB7Ci0gICAgICAgICAgdG1wID0gZml4TWF4KHRtcCwgKEZJWFBfUU1GKWZpeHBfYWJzKGh5YnJpZERhdGFbY29sXVswXVswXVtpXSkpOwotICAgICAgICAgIHRtcCA9IGZpeE1heCh0bXAsIChGSVhQX1FNRilmaXhwX2FicyhoeWJyaWREYXRhW2NvbF1bMF1bMV1baV0pKTsKLSAgICAgICAgICB0bXAgPSBmaXhNYXgodG1wLCAoRklYUF9RTUYpZml4cF9hYnMoaHlicmlkRGF0YVtjb2xdWzFdWzBdW2ldKSk7Ci0gICAgICAgICAgdG1wID0gZml4TWF4KHRtcCwgKEZJWFBfUU1GKWZpeHBfYWJzKGh5YnJpZERhdGFbY29sXVsxXVsxXVtpXSkpOwotICAgICAgICB9CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBmcmFtZVNpemU7IGNvbCsrKSB7CisgICAgICBpbnQgaSwgc2VjdGlvbiA9IChjb2wgPCBmcmFtZVNpemUgLSBIWUJSSURfUkVBRF9PRkZTRVQpID8gMCA6IDE7CisgICAgICBGSVhQX0RCTCB0bXAgPSBtYXhWYWxbc2VjdGlvbl1bYmluXTsKKyAgICAgIGZvciAoaSA9IGhQc0VuY29kZS0+aWlkR3JvdXBCb3JkZXJzW2dyb3VwXTsKKyAgICAgICAgICAgaSA8IGhQc0VuY29kZS0+aWlkR3JvdXBCb3JkZXJzW2dyb3VwICsgMV07IGkrKykgeworICAgICAgICB0bXAgPSBmaXhNYXgodG1wLCAoRklYUF9EQkwpZml4cF9hYnMoaHlicmlkRGF0YVtjb2xdWzBdWzBdW2ldKSk7CisgICAgICAgIHRtcCA9IGZpeE1heCh0bXAsIChGSVhQX0RCTClmaXhwX2FicyhoeWJyaWREYXRhW2NvbF1bMF1bMV1baV0pKTsKKyAgICAgICAgdG1wID0gZml4TWF4KHRtcCwgKEZJWFBfREJMKWZpeHBfYWJzKGh5YnJpZERhdGFbY29sXVsxXVswXVtpXSkpOworICAgICAgICB0bXAgPSBmaXhNYXgodG1wLCAoRklYUF9EQkwpZml4cF9hYnMoaHlicmlkRGF0YVtjb2xdWzFdWzFdW2ldKSk7CiAgICAgICB9Ci0gICAgICBtYXhWYWxbMF1bYmluXSA9IHRtcDsKLQotICAgICAgdG1wID0gbWF4VmFsWzFdW2Jpbl07Ci0gICAgICBmb3IgKGNvbD1mcmFtZVNpemUtSFlCUklEX1JFQURfT0ZGU0VUOyBjb2w8ZnJhbWVTaXplOyBjb2wrKykgewotICAgICAgICBmb3IgKGkgPSBoUHNFbmNvZGUtPmlpZEdyb3VwQm9yZGVyc1tncm91cF07IGkgPCBoUHNFbmNvZGUtPmlpZEdyb3VwQm9yZGVyc1tncm91cCsxXTsgaSsrKSB7Ci0gICAgICAgICAgdG1wID0gZml4TWF4KHRtcCwgKEZJWFBfUU1GKWZpeHBfYWJzKGh5YnJpZERhdGFbY29sXVswXVswXVtpXSkpOwotICAgICAgICAgIHRtcCA9IGZpeE1heCh0bXAsIChGSVhQX1FNRilmaXhwX2FicyhoeWJyaWREYXRhW2NvbF1bMF1bMV1baV0pKTsKLSAgICAgICAgICB0bXAgPSBmaXhNYXgodG1wLCAoRklYUF9RTUYpZml4cF9hYnMoaHlicmlkRGF0YVtjb2xdWzFdWzBdW2ldKSk7Ci0gICAgICAgICAgdG1wID0gZml4TWF4KHRtcCwgKEZJWFBfUU1GKWZpeHBfYWJzKGh5YnJpZERhdGFbY29sXVsxXVsxXVtpXSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBtYXhWYWxbMV1bYmluXSA9IHRtcDsKKyAgICAgIG1heFZhbFtzZWN0aW9uXVtiaW5dID0gdG1wOwogICAgIH0KICAgfSAvKiBuSWlkR3JvdXBzICovCiAKICAgLyogY29udmVydCBtYXhTcGVjIHRvIG1heFNjYWxpbmcsIGZpbmQgc2NhbGluZyBzcGFjZSAqLwotICBmb3IgKGJhbmQ9MDsgYmFuZDxwc0JhbmRzOyBiYW5kKyspIHsKKyAgZm9yIChiYW5kID0gMDsgYmFuZCA8IHBzQmFuZHM7IGJhbmQrKykgewogI2lmbmRlZiBNVUxUXzE2eDE2Ci0gICAgZHluQmFuZFNjYWxlW2JhbmRdID0gQ291bnRMZWFkaW5nQml0cyhmaXhNYXgobWF4VmFsWzBdW2JhbmRdLG1heEJhbmRWYWx1ZVtiYW5kXSkpOworICAgIGR5bkJhbmRTY2FsZVtiYW5kXSA9CisgICAgICAgIENvdW50TGVhZGluZ0JpdHMoZml4TWF4KG1heFZhbFswXVtiYW5kXSwgbWF4QmFuZFZhbHVlW2JhbmRdKSk7CiAjZWxzZQotICAgIGR5bkJhbmRTY2FsZVtiYW5kXSA9IGZpeE1heCgwLENvdW50TGVhZGluZ0JpdHMoZml4TWF4KG1heFZhbFswXVtiYW5kXSxtYXhCYW5kVmFsdWVbYmFuZF0pKS1GUkFDVF9CSVRTKTsKKyAgICBkeW5CYW5kU2NhbGVbYmFuZF0gPSBmaXhNYXgoCisgICAgICAgIDAsIENvdW50TGVhZGluZ0JpdHMoZml4TWF4KG1heFZhbFswXVtiYW5kXSwgbWF4QmFuZFZhbHVlW2JhbmRdKSkgLQorICAgICAgICAgICAgICAgRlJBQ1RfQklUUyk7CiAjZW5kaWYKLSAgICBtYXhWYWx1ZSA9IGZpeE1heChtYXhWYWx1ZSxmaXhNYXgobWF4VmFsWzBdW2JhbmRdLG1heFZhbFsxXVtiYW5kXSkpOworICAgIG1heFZhbHVlID0gZml4TWF4KG1heFZhbHVlLCBmaXhNYXgobWF4VmFsWzBdW2JhbmRdLCBtYXhWYWxbMV1bYmFuZF0pKTsKICAgICBtYXhCYW5kVmFsdWVbYmFuZF0gPSBmaXhNYXgobWF4VmFsWzBdW2JhbmRdLCBtYXhWYWxbMV1bYmFuZF0pOwogICB9CiAKLSAgLyogY2FsY3VsYXRlIG1heGltYWwgc2NhbGluZyBmb3IgUU1GIGRvd25taXggKi8KKyAgICAvKiBjYWxjdWxhdGUgbWF4aW1hbCBzY2FsaW5nIGZvciBRTUYgZG93bm1peCAqLwogI2lmbmRlZiBNVUxUXzE2eDE2CiAgICpkbXhTY2FsZSA9IGZpeE1pbihERlJBQ1RfQklUUywgQ291bnRMZWFkaW5nQml0cyhtYXhWYWx1ZSkpOwogI2Vsc2UKLSAgKmRteFNjYWxlID0gZml4TWF4KDAsZml4TWluKEZSQUNUX0JJVFMsIENvdW50TGVhZGluZ0JpdHMoRlhfUU1GMkZYX0RCTChtYXhWYWx1ZSkpKSk7CisgICpkbXhTY2FsZSA9IGZpeE1heCgwLCBmaXhNaW4oRlJBQ1RfQklUUywgQ291bnRMZWFkaW5nQml0cygobWF4VmFsdWUpKSkpOwogI2VuZGlmCi0KIH0KLQpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9wc19tYWluLmggYi9saWJTQlJlbmMvc3JjL3BzX21haW4uaAppbmRleCAyMWIzMmZmLi44OGIyOTkzIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL3BzX21haW4uaAorKysgYi9saWJTQlJlbmMvc3JjL3BzX21haW4uaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxMTMgKzkwLDExNiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTVBFRyBBdWRpbyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEluaXRpYWwgQXV0aG9yczogICAgICBNYXJrdXMgTXVsdHJ1cwotICAgQ29udGVudHMvRGVzY3JpcHRpb246IFBTIFdyYXBwZXIsIERvd25taXggaGVhZGVyIGZpbGUKKyAgIEF1dGhvcihzKTogICBNYXJrdXMgTXVsdHJ1cwogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjogUFMgV3JhcHBlciwgRG93bm1peCBoZWFkZXIgZmlsZQogCi0jaWZuZGVmIF9fSU5DTFVERURfUFNfTUFJTl9ICi0jZGVmaW5lIF9fSU5DTFVERURfUFNfTUFJTl9ICisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFBTX01BSU5fSAorI2RlZmluZSBQU19NQUlOX0gKIAogLyogSW5jbHVkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAjaW5jbHVkZSAic2JyX2RlZi5oIgogI2luY2x1ZGUgInFtZi5oIgogI2luY2x1ZGUgInBzX2VuY29kZS5oIgogI2luY2x1ZGUgIkZES19iaXRzdHJlYW0uaCIKICNpbmNsdWRlICJGREtfaHlicmlkLmgiCiAKLQogLyogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdHlwZWRlZiBlbnVtIHsKICAgUFNFTkNfU1RFUkVPX0JBTkRTX0lOVkFMSUQgPSAwLAotICBQU0VOQ19TVEVSRU9fQkFORFNfMTAgICAgICA9IDEwLAotICBQU0VOQ19TVEVSRU9fQkFORFNfMjAgICAgICA9IDIwCisgIFBTRU5DX1NURVJFT19CQU5EU18xMCA9IDEwLAorICBQU0VOQ19TVEVSRU9fQkFORFNfMjAgPSAyMAogCiB9IFBTRU5DX1NURVJFT19CQU5EU19DT05GSUc7CiAKIHR5cGVkZWYgZW51bSB7Ci0gIFBTRU5DX05FTlZfMSAgICAgICAgICAgICAgID0gMSwKLSAgUFNFTkNfTkVOVl8yICAgICAgICAgICAgICAgPSAyLAotICBQU0VOQ19ORU5WXzQgICAgICAgICAgICAgICA9IDQsCi0gIFBTRU5DX05FTlZfREVGQVVMVCAgICAgICAgID0gUFNFTkNfTkVOVl8yLAotICBQU0VOQ19ORU5WX01BWCAgICAgICAgICAgICA9IFBTRU5DX05FTlZfNAorICBQU0VOQ19ORU5WXzEgPSAxLAorICBQU0VOQ19ORU5WXzIgPSAyLAorICBQU0VOQ19ORU5WXzQgPSA0LAorICBQU0VOQ19ORU5WX0RFRkFVTFQgPSBQU0VOQ19ORU5WXzIsCisgIFBTRU5DX05FTlZfTUFYID0gUFNFTkNfTkVOVl80CiAKIH0gUFNFTkNfTkVOVl9DT05GSUc7CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJhdGVGcm9tOyAgIC8qIGluY2x1c2l2ZSAqLwotICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgYml0cmF0ZVRvOyAgICAgLyogZXhjbHVzaXZlICovCi0gIFBTRU5DX1NURVJFT19CQU5EU19DT05GSUcgICBuU3RlcmVvQmFuZHM7Ci0gIFBTRU5DX05FTlZfQ09ORklHICAgICAgICAgICBuRW52ZWxvcGVzOwotICBMT05HICAgICAgICAgICAgICAgICAgICAgICAgaWlkUXVhbnRFcnJvclRocmVzaG9sZDsgIC8qIHF1YW50aXphdGlvbiB0aHJlc2hvbGQgdG8gc3dpdGNoIGJldHdlZW4gY29hcnNlIGFuZCBmaW5lIGlpZCBxdWFudGl6YXRpb24gKi8KKyAgVUlOVCBiaXRyYXRlRnJvbTsgLyogaW5jbHVzaXZlICovCisgIFVJTlQgYml0cmF0ZVRvOyAgIC8qIGV4Y2x1c2l2ZSAqLworICBQU0VOQ19TVEVSRU9fQkFORFNfQ09ORklHIG5TdGVyZW9CYW5kczsKKyAgUFNFTkNfTkVOVl9DT05GSUcgbkVudmVsb3BlczsKKyAgTE9ORyBpaWRRdWFudEVycm9yVGhyZXNob2xkOyAvKiBxdWFudGl6YXRpb24gdGhyZXNob2xkIHRvIHN3aXRjaCBiZXR3ZWVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29hcnNlIGFuZCBmaW5lIGlpZCBxdWFudGl6YXRpb24gKi8KIAogfSBwc1R1bmluZ1RhYmxlX3Q7CiAKIC8qIEZ1bmN0aW9uIC8gQ2xhc3MgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgVF9QQVJBTUVUUklDX1NURVJFTyB7Ci0gIEhBTkRMRV9QU19FTkNPREUgICAgICAgICAgICBoUHNFbmNvZGU7Ci0gIFBTX09VVCAgICAgICAgICAgICAgICAgICAgICBwc091dFsyXTsKKyAgSEFORExFX1BTX0VOQ09ERSBoUHNFbmNvZGU7CisgIFBTX09VVCBwc091dFsyXTsKIAotICBGSVhQX0RCTCAgICAgICAgICAgICAgICAgICAgX19zdGF0aWNIeWJyaWREYXRhW0hZQlJJRF9SRUFEX09GRlNFVF1bTUFYX1BTX0NIQU5ORUxTXVsyXVtNQVhfSFlCUklEX0JBTkRTXTsKLSAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAgKnBIeWJyaWREYXRhW0hZQlJJRF9SRUFEX09GRlNFVCtIWUJSSURfRlJBTUVTSVpFXVtNQVhfUFNfQ0hBTk5FTFNdWzJdOworICBGSVhQX0RCTCBfX3N0YXRpY0h5YnJpZERhdGFbSFlCUklEX1JFQURfT0ZGU0VUXVtNQVhfUFNfQ0hBTk5FTFNdWzJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtNQVhfSFlCUklEX0JBTkRTXTsKKyAgRklYUF9EQkwKKyAgKnBIeWJyaWREYXRhW0hZQlJJRF9SRUFEX09GRlNFVCArIEhZQlJJRF9GUkFNRVNJWkVdW01BWF9QU19DSEFOTkVMU11bMl07CiAKLSAgRklYUF9RTUYgICAgICAgICAgICAgICAgICAgIHFtZkRlbGF5TGluZXNbMl1bUU1GX01BWF9USU1FX1NMT1RTPj4xXVtRTUZfQ0hBTk5FTFNdOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcW1mRGVsYXlTY2FsZTsKKyAgRklYUF9EQkwgcW1mRGVsYXlMaW5lc1syXVszMiA+PiAxXVs2NF07CisgIGludCBxbWZEZWxheVNjYWxlOwogCi0gIElOVCAgICAgICAgICAgICAgICAgICAgICAgICBwc0RlbGF5OwotICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgbWF4RW52ZWxvcGVzOwotICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgZHluQmFuZFNjYWxlW1BTX01BWF9CQU5EU107Ci0gIEZJWFBfREJMICAgICAgICAgICAgICAgICAgICBtYXhCYW5kVmFsdWVbUFNfTUFYX0JBTkRTXTsKLSAgU0NIQVIgICAgICAgICAgICAgICAgICAgICAgIGRteFNjYWxlOwotICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFBTOwotICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgbm9RbWZTbG90czsKLSAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgIG5vUW1mQmFuZHM7CisgIElOVCBwc0RlbGF5OworICBVSU5UIG1heEVudmVsb3BlczsKKyAgVUNIQVIgZHluQmFuZFNjYWxlW1BTX01BWF9CQU5EU107CisgIEZJWFBfREJMIG1heEJhbmRWYWx1ZVtQU19NQVhfQkFORFNdOworICBTQ0hBUiBkbXhTY2FsZTsKKyAgSU5UIGluaXRQUzsKKyAgSU5UIG5vUW1mU2xvdHM7CisgIElOVCBub1FtZkJhbmRzOwogCi0gIEZJWFBfREJMICAgICAgICAgICAgICAgICAgICBfX3N0YXRpY0h5YkFuYVN0YXRlc0xGW01BWF9QU19DSEFOTkVMU11bMipIWUJSSURfRklMVEVSX0xFTkdUSCpIWUJSSURfTUFYX1FNRl9CQU5EU107Ci0gIEZJWFBfREJMICAgICAgICAgICAgICAgICAgICBfX3N0YXRpY0h5YkFuYVN0YXRlc0hGW01BWF9QU19DSEFOTkVMU11bMipIWUJSSURfRklMVEVSX0RFTEFZKihRTUZfQ0hBTk5FTFMtSFlCUklEX01BWF9RTUZfQkFORFMpXTsKLSAgRkRLX0FOQV9IWUJfRklMVEVSICAgICAgICAgIGZka0h5YkFuYUZpbHRlcltNQVhfUFNfQ0hBTk5FTFNdOwotICBGREtfU1lOX0hZQl9GSUxURVIgICAgICAgICAgZmRrSHliU3luRmlsdGVyOworICBGSVhQX0RCTCBfX3N0YXRpY0h5YkFuYVN0YXRlc0xGW01BWF9QU19DSEFOTkVMU11bMiAqIEhZQlJJRF9GSUxURVJfTEVOR1RIICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhZQlJJRF9NQVhfUU1GX0JBTkRTXTsKKyAgRklYUF9EQkwgX19zdGF0aWNIeWJBbmFTdGF0ZXNIRltNQVhfUFNfQ0hBTk5FTFNdWzIgKiBIWUJSSURfRklMVEVSX0RFTEFZICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg2NCAtIEhZQlJJRF9NQVhfUU1GX0JBTkRTKV07CisgIEZES19BTkFfSFlCX0ZJTFRFUiBmZGtIeWJBbmFGaWx0ZXJbTUFYX1BTX0NIQU5ORUxTXTsKKyAgRkRLX1NZTl9IWUJfRklMVEVSIGZka0h5YlN5bkZpbHRlcjsKIAogfSBQQVJBTUVUUklDX1NURVJFTzsKIAotCiB0eXBlZGVmIHN0cnVjdCBUX1BTRU5DX0NPTkZJRyB7Ci0gIElOVCAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemU7Ci0gIElOVCAgICAgICAgICAgICAgICAgICAgICAgICBxbWZGaWx0ZXJNb2RlOwotICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgc2JyUHNEZWxheTsKLSAgUFNFTkNfU1RFUkVPX0JBTkRTX0NPTkZJRyAgIG5TdGVyZW9CYW5kczsKLSAgUFNFTkNfTkVOVl9DT05GSUcgICAgICAgICAgIG1heEVudmVsb3BlczsKLSAgRklYUF9EQkwgICAgICAgICAgICAgICAgICAgIGlpZFF1YW50RXJyb3JUaHJlc2hvbGQ7CisgIElOVCBmcmFtZVNpemU7CisgIElOVCBxbWZGaWx0ZXJNb2RlOworICBJTlQgc2JyUHNEZWxheTsKKyAgUFNFTkNfU1RFUkVPX0JBTkRTX0NPTkZJRyBuU3RlcmVvQmFuZHM7CisgIFBTRU5DX05FTlZfQ09ORklHIG1heEVudmVsb3BlczsKKyAgRklYUF9EQkwgaWlkUXVhbnRFcnJvclRocmVzaG9sZDsKIAogfSBQU0VOQ19DT05GSUcsICpIQU5ETEVfUFNFTkNfQ09ORklHOwogCiB0eXBlZGVmIHN0cnVjdCBUX1BBUkFNRVRSSUNfU1RFUkVPICpIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU87CiAKLQogLyoqCiAgKiBcYnJpZWYgIENyZWF0ZSBhIHBhcmFtZXRyaWMgc3RlcmVvIGVuY29kZXIgaW5zdGFuY2UuCiAgKgotICogXHBhcmFtIHBoUGFyYW1ldHJpY1N0ZXJlbyAgICBBIHBvaW50ZXIgdG8gYSBwYXJhbWV0cmljIHN0ZXJlbyBoYW5kbGUgdG8gYmUgYWxsb2NhdGVkLiBJbml0aWFsaXplZCBvbiByZXR1cm4uCisgKiBccGFyYW0gcGhQYXJhbWV0cmljU3RlcmVvICAgIEEgcG9pbnRlciB0byBhIHBhcmFtZXRyaWMgc3RlcmVvIGhhbmRsZSB0byBiZQorICogYWxsb2NhdGVkLiBJbml0aWFsaXplZCBvbiByZXR1cm4uCiAgKgogICogXHJldHVybgogICogICAgICAgICAgLSBQU0VOQ19PSywgb24gc3VjY2VzLgogICogICAgICAgICAgLSBQU0VOQ19JTlZBTElEX0hBTkRMRSwgUFNFTkNfTUVNT1JZX0VSUk9SLCBvbiBmYWlsdXJlLgogICovCi1GREtfUFNFTkNfRVJST1IgUFNFbmNfQ3JlYXRlKAotICAgICAgICBIQU5ETEVfUEFSQU1FVFJJQ19TVEVSRU8gKnBoUGFyYW1ldHJpY1N0ZXJlbwotICAgICAgICApOwotCitGREtfUFNFTkNfRVJST1IgUFNFbmNfQ3JlYXRlKEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAqcGhQYXJhbWV0cmljU3RlcmVvKTsKIAogLyoqCiAgKiBcYnJpZWYgIEluaXRpYWxpemUgYSBwYXJhbWV0cmljIHN0ZXJlbyBlbmNvZGVyIGluc3RhbmNlLgogICoKICAqIFxwYXJhbSBoUGFyYW1ldHJpY1N0ZXJlbyAgICAgTWV0YSBEYXRhIGhhbmRsZS4KLSAqIFxwYXJhbSBoUHNFbmNDb25maWcgICAgICAgICAgRmlsbGVkIHBhcmFtZXRyaWMgc3RlcmVvIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlLgorICogXHBhcmFtIGhQc0VuY0NvbmZpZyAgICAgICAgICBGaWxsZWQgcGFyYW1ldHJpYyBzdGVyZW8gY29uZmlndXJhdGlvbgorICogc3RydWN0dXJlLgogICogXHBhcmFtIG5vUW1mU2xvdHMgICAgICAgICAgICBOdW1iZXIgb2Ygc2xvdHMgd2l0aGluIG9uZSBhdWRpbyBmcmFtZS4KICAqIFxwYXJhbSBub1FtZkJhbmRzICAgICAgICAgICAgTnVtYmVyIG9mIFFNRiBiYW5kcy4KICAqIFxwYXJhbSBkeW5hbWljX1JBTSAgICAgICAgICAgUG9pbnRlciB0byBwcmVhbGxvY2F0ZWQgd29ya2J1ZmZlci4KQEAgLTE5NCwzMCArMjA4LDIzIEBACiAgKiAgICAgICAgICAtIFBTRU5DX09LLCBvbiBzdWNjZXMuCiAgKiAgICAgICAgICAtIFBTRU5DX0lOVkFMSURfSEFORExFLCBQU0VOQ19JTklUX0VSUk9SLCBvbiBmYWlsdXJlLgogICovCi1GREtfUFNFTkNfRVJST1IgUFNFbmNfSW5pdCgKLSAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICBoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgY29uc3QgSEFORExFX1BTRU5DX0NPTkZJRyBoUHNFbmNDb25maWcsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgbm9RbWZTbG90cywKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICBub1FtZkJhbmRzCi0gICAgICAgLFVDSEFSICAgICAgICAgICAgICAgICAgICAqZHluYW1pY19SQU0KLSAgICAgICAgKTsKLQorRkRLX1BTRU5DX0VSUk9SIFBTRW5jX0luaXQoSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPIGhQYXJhbWV0cmljU3RlcmVvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSEFORExFX1BTRU5DX0NPTkZJRyBoUHNFbmNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9RbWZTbG90cywgSU5UIG5vUW1mQmFuZHMsIFVDSEFSICpkeW5hbWljX1JBTSk7CiAKIC8qKgogICogXGJyaWVmICBEZXN0cm95IHBhcmFtZXRyaWMgc3RlcmVvIGVuY29kZXIgaW5zdGFuY2UuCiAgKgogICogRGVhbGxvY2F0ZSBpbnN0YW5jZSBhbmQgZnJlZSB3aG9sZSBtZW1vcnkuCiAgKgotICogXHBhcmFtIHBoUGFyYW1ldHJpY1N0ZXJlbyAgICBQb2ludGVyIHRvIHRoZSBwYXJhbWV0cmljIHN0ZXJlbyBoYW5kbGUgdG8gYmUgZGVhbGxvY2F0ZWQuCisgKiBccGFyYW0gcGhQYXJhbWV0cmljU3RlcmVvICAgIFBvaW50ZXIgdG8gdGhlIHBhcmFtZXRyaWMgc3RlcmVvIGhhbmRsZSB0byBiZQorICogZGVhbGxvY2F0ZWQuCiAgKgogICogXHJldHVybgogICogICAgICAgICAgLSBQU0VOQ19PSywgb24gc3VjY2VzLgogICogICAgICAgICAgLSBQU0VOQ19JTlZBTElEX0hBTkRMRSwgb24gZmFpbHVyZS4KICAqLwotRkRLX1BTRU5DX0VSUk9SIFBTRW5jX0Rlc3Ryb3koCi0gICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAqcGhQYXJhbWV0cmljU3RlcmVvCi0gICAgICAgICk7Ci0KK0ZES19QU0VOQ19FUlJPUiBQU0VuY19EZXN0cm95KEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAqcGhQYXJhbWV0cmljU3RlcmVvKTsKIAogLyoqCiAgKiBcYnJpZWYgIEFwcGx5IHBhcmFtZXRyaWMgc3RlcmVvIHByb2Nlc3NpbmcuCkBAIC0yMjgsNyArMjM1LDggQEAKICAqIFxwYXJhbSBoUW1mQW5hbHlzaXMsICAgICAgICAgUG9pbnRlciB0byBRTUYgYW5hbHlzaXMgZmlsdGVyYmFua3MuCiAgKiBccGFyYW0gZG93bm1peGVkUmVhbFFtZkRhdGEgIFBvaW50ZXIgdG8gcmVhbCBRTUYgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gdG8uCiAgKiBccGFyYW0gZG93bm1peGVkSW1hZ1FtZkRhdGEgIFBvaW50ZXIgdG8gaW1hZyBRTUYgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gdG8uCi0gKiBccGFyYW0gZG93bnNhbXBsZWRPdXRTaWduYWwgIFBvaW50ZXIgdG8gYnVmZmVyIHdoZXJlIHRvIHdyaXRlIGRvd25taXhlZCB0aW1lc2lnbmFsLgorICogXHBhcmFtIGRvd25zYW1wbGVkT3V0U2lnbmFsICBQb2ludGVyIHRvIGJ1ZmZlciB3aGVyZSB0byB3cml0ZSBkb3dubWl4ZWQKKyAqIHRpbWVzaWduYWwuCiAgKiBccGFyYW0gc2JyU3ludGhRbWYgICAgICAgICAgIFBvaW50ZXIgdG8gUU1GIHN5bnRoZXNpcyBmaWx0ZXJiYW5rLgogICogXHBhcmFtIHFtZlNjYWxlICAgICAgICAgICAgICBSZXR1cm4gc2NhbGluZyBmYWN0b3Igb2YgdGhlIHFtZiBkYXRhLgogICogXHBhcmFtIHNlbmRIZWFkZXIgICAgICAgICAgICBTaWduYWwgd2hldGhlciB0byB3cml0ZSBoZWFkZXIgZGF0YS4KQEAgLTIzOCwxOCArMjQ2LDExIEBACiAgKiAgICAgICAgICAtIFBTRU5DX0lOVkFMSURfSEFORExFLCBQU0VOQ19FTkNPREVfRVJST1IsIG9uIGZhaWx1cmUuCiAgKi8KIEZES19QU0VOQ19FUlJPUiBGREtzYnJFbmNfUFNFbmNfUGFyYW1ldHJpY1N0ZXJlb1Byb2Nlc3NpbmcoCi0gICAgICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgIElOVF9QQ00gICAgICAgICAgICAgICAgICAqc2FtcGxlc1syXSwKLSAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICB0aW1lSW5TdHJpZGUsCi0gICAgICAgIFFNRl9GSUxURVJfQkFOSyAgICAgICAgICoqaFFtZkFuYWx5c2lzLAotICAgICAgICBGSVhQX1FNRiAqKlJFU1RSSUNUICAgICAgIGRvd25taXhlZFJlYWxRbWZEYXRhLAotICAgICAgICBGSVhQX1FNRiAqKlJFU1RSSUNUICAgICAgIGRvd25taXhlZEltYWdRbWZEYXRhLAotICAgICAgICBJTlRfUENNICAgICAgICAgICAgICAgICAgKmRvd25zYW1wbGVkT3V0U2lnbmFsLAotICAgICAgICBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LICAgIHNiclN5bnRoUW1mLAotICAgICAgICBTQ0hBUiAgICAgICAgICAgICAgICAgICAgKnFtZlNjYWxlLAotICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgIHNlbmRIZWFkZXIKLSAgICAgICAgKTsKLQorICAgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywgSU5UX1BDTSAqc2FtcGxlc1syXSwKKyAgICBVSU5UIHRpbWVJblN0cmlkZSwgUU1GX0ZJTFRFUl9CQU5LICoqaFFtZkFuYWx5c2lzLAorICAgIEZJWFBfREJMICoqUkVTVFJJQ1QgZG93bm1peGVkUmVhbFFtZkRhdGEsCisgICAgRklYUF9EQkwgKipSRVNUUklDVCBkb3dubWl4ZWRJbWFnUW1mRGF0YSwgSU5UX1BDTSAqZG93bnNhbXBsZWRPdXRTaWduYWwsCisgICAgSEFORExFX1FNRl9GSUxURVJfQkFOSyBzYnJTeW50aFFtZiwgU0NIQVIgKnFtZlNjYWxlLCBjb25zdCBpbnQgc2VuZEhlYWRlcik7CiAKIC8qKgogICogXGJyaWVmICBXcml0ZSBwYXJhbWV0cmljIHN0ZXJlbyBiaXRzdHJlYW0uCkBAIC0yNjMsOSArMjY0LDcgQEAKICAqIFxyZXR1cm4KICAqICAgICAgICAgIC0gbnVtYmVyIG9mIHdyaXR0ZW4gYml0cy4KICAqLwotSU5UIEZES3NickVuY19QU0VuY19Xcml0ZVBTRGF0YSgKLSAgICAgICAgSEFORExFX1BBUkFNRVRSSUNfU1RFUkVPICBoUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgICBoQml0c3RyZWFtCi0gICAgICAgICk7CitJTlQgRkRLc2JyRW5jX1BTRW5jX1dyaXRlUFNEYXRhKEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdHN0cmVhbSk7CiAKLSNlbmRpZiAvKiBfX0lOQ0xVREVEX1BTX01BSU5fSCAqLworI2VuZGlmIC8qIFBTX01BSU5fSCAqLwpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9yZXNhbXBsZXIuY3BwIGIvbGliU0JSZW5jL3NyYy9yZXNhbXBsZXIuY3BwCmluZGV4IDRhZGIyNDMuLmIxNzgxYTcgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvcmVzYW1wbGVyLmNwcAorKysgYi9saWJTQlJlbmMvc3JjL3Jlc2FtcGxlci5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTEgKzkwLDE5IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgRkRLIHJlc2FtcGxlciB0b29sIGJveDogCisgIFxicmllZiAgRkRLIHJlc2FtcGxlciB0b29sIGJveDokUmV2aXNpb246IDkxNjU1ICQKICAgXGF1dGhvciBNLiBXZXJuZXIKICovCiAKQEAgLTkxLDcgKzExMCw2IEBACiAKICNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgIEJJUVVBRCBGaWx0ZXIgU3BlY2lmaWNhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEwMSw5MiArMTE5LDkzIEBACiAjZGVmaW5lIEExIDIKICNkZWZpbmUgQTIgMwogCi0jZGVmaW5lIEJRQyh4KSBGTDJGWENPTlNUX1NHTCh4LzIpCi0KKyNkZWZpbmUgQlFDKHgpIEZMMkZYQ09OU1RfU0dMKHggLyAyKQogCiBzdHJ1Y3QgRklMVEVSX1BBUkFNIHsKLSAgY29uc3QgRklYUF9TR0wgKmNvZWZmYTsgICAgLyohIFNPUyBtYXRyaXggT25lIHJvdy9zZWN0aW9uLiBTY2FsZWQgdXNpbmcgQlFDKCkuIE9yZGVyIG9mIGNvZWZmaWNpZW50czogQjEsQjIsQTEsQTIuIEIwPUEwPTEuMCAqLwotICBGSVhQX0RCTCBnOyAgICAgICAgICAgICAgICAvKiEgb3ZlcmFsbCBnYWluICovCi0gIGludCBXYzsgICAgICAgICAgICAgICAgICAgIC8qISBub3JtYWxpemVkIHBhc3NiYW5kIGJhbmR3aWR0aCBhdCBpbnB1dCBzYW1wbGVyYXRlICogMTAwMCAqLwotICBpbnQgbm9Db2VmZnM7ICAgICAgICAgICAgICAvKiEgbnVtYmVyIG9mIGZpbHRlciBjb2VmZnMgKi8KLSAgaW50IGRlbGF5OyAgICAgICAgICAgICAgICAgLyohIGRlbGF5IGluIHNhbXBsZXMgYXQgaW5wdXQgc2FtcGxlcmF0ZSAqLworICBjb25zdCBGSVhQX1NHTCAqY29lZmZhOyAvKiEgU09TIG1hdHJpeCBPbmUgcm93L3NlY3Rpb24uIFNjYWxlZCB1c2luZyBCUUMoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JkZXIgb2YgY29lZmZpY2llbnRzOiBCMSxCMixBMSxBMi4gQjA9QTA9MS4wICovCisgIEZJWFBfREJMIGc7ICAgICAgICAgICAgIC8qISBvdmVyYWxsIGdhaW4gKi8KKyAgaW50IFdjOyAgICAgICAvKiEgbm9ybWFsaXplZCBwYXNzYmFuZCBiYW5kd2lkdGggYXQgaW5wdXQgc2FtcGxlcmF0ZSAqIDEwMDAgKi8KKyAgaW50IG5vQ29lZmZzOyAvKiEgbnVtYmVyIG9mIGZpbHRlciBjb2VmZnMgKi8KKyAgaW50IGRlbGF5OyAgICAvKiEgZGVsYXkgaW4gc2FtcGxlcyBhdCBpbnB1dCBzYW1wbGVyYXRlICovCiB9OwogCiAjZGVmaW5lIEJJUVVBRF9DT0VGU1RFUCA0CiAKIC8qKgogICpcYnJpZWYgTG93IFBhc3MKLSBXYyA9IDAsNSwgb3JkZXIgMzAsIFN0b3AgQmFuZCAtOTZkQi4gV2MgY3JpdGVyaWEgaXMgImFsbW9zdCAwZEIgcGFzc2JhbmQiLCBub3QgdGhlIHVzdWFsIC0zZGIgZ2FpbiBwb2ludC4KLSBbYixhXT1jaGVieTIoMzAsOTYsMC41MDUpCi0gW3NvcyxnXT10ZjJzb3MoYixhKQorIFdjID0gMCw1LCBvcmRlciAzMCwgU3RvcCBCYW5kIC05NmRCLiBXYyBjcml0ZXJpYSBpcyAiYWxtb3N0IDBkQiBwYXNzYmFuZCIsIG5vdAorIHRoZSB1c3VhbCAtM2RiIGdhaW4gcG9pbnQuIFtiLGFdPWNoZWJ5MigzMCw5NiwwLjUwNSkgW3NvcyxnXT10ZjJzb3MoYixhKQogIGJhbmR3aWR0aCAwLjQ4CiAgKi8KIHN0YXRpYyBjb25zdCBGSVhQX1NHTCBzb3M0OFtdID0gewotIEJRQygxLjk4OTQxMDc1NjgxOTM4KSwgICBCUUMoMC45OTk5OTk5OTY4OTA4MTEpLCBCUUMoMC44NjMyNjQ1MjcyMDE5NjMpLCAgICAgQlFDKCAwLjE4OTU1Mzc5OTk2MDY2MyksCi0gQlFDKDEuOTA3MzM4MDQ4MjI0NDUpLCAgIEJRQygxLjAwMDAwMDAxNzM2MTg5KSwgIEJRQygwLjgzNjMyMTU3NTg0MTY5MSksICAgICBCUUMoIDAuMjAzNTA1ODA5MjY2NTY0KSwKLSBCUUMoMS43NTYxNjY2NTQ5NTMyNSksICAgQlFDKDAuOTk5OTk5OTQ2MDc5NzIxKSwgQlFDKDAuNzg0Njk5MjI1MTIxNTg4KSwgICAgIEJRQyggMC4yMzA0NzEyNjU1MDY5ODYpLAotIEJRQygxLjU1NzI3NzQ1NTEyNzI2KSwgICBCUUMoMS4wMDAwMDAxMTczNzgxNSksICBCUUMoMC43MTI1MTU0MjM1ODgzNTEpLCAgICAgQlFDKCAwLjI2ODc1MjcyMzkwMDQ5OCksCi0gQlFDKDEuMzM0MDc1OTE5NDM2NDMpLCAgIEJRQygwLjk5OTk5OTc5NTk1MzIyOCksIEJRQygwLjYyNTA1OTExNzMzMDk4OSksICAgICBCUUMoIDAuMzE2MTk0Njg1Mjg4OTY1KSwKLSBCUUMoMS4xMDY4OTg5ODQxMjQ1OCksICAgQlFDKDEuMDAwMDAwMzUwNTcxMTQpLCAgQlFDKDAuNTI4MDM1MTQzNjYzOTgpLCAgICAgIEJRQyggMC4zNzA1MTc4NDMyMjQ2NjkpLAotIEJRQygwLjg5MDYwMzcxMDc4NDU0KSwgICBCUUMoMC45OTk5OTkzNDM5NjI4MjIpLCBCUUMoMC40MjY5MjA0NjIxNjUyNTcpLCAgICAgQlFDKCAwLjQyOTYwODIwMDIwNzc0NiksCi0gQlFDKDAuNjk0NDM4MjYxMjA5NDMzKSwgIEJRQyggMS4wMDAwMDA4NjI5NzkyKSwgIEJRQygwLjMyNjUzMDY5OTU2MTcxNiksICAgICBCUUMoIDAuNDkxNzE0NDUwNjU0MTc0KSwKLSBCUUMoMC41MjMyMzc4MDA5MzUzMjIpLCAgQlFDKDEuMDAwMDAxMDEzNDk3ODIpLCAgQlFDKDAuMjMwODI5NTU2Mjc0ODUxKSwgICAgIEJRQyggMC41NTU1NTkwMzQ4NDMyODEpLAotIEJRQygwLjM3ODYzMTE2NTkyOTU2MyksICBCUUMoMC45OTk5ODk4NjQ4MjY2NSksICBCUUMoMC4xNDI5MDY0MjIwMzYwOTUpLCAgICAgQlFDKCAwLjYyMDMzODg3NDQ0MjQxMSksCi0gQlFDKDAuMjYwNzg2OTExMzA4NDM3KSwgIEJRQygxLjAwMDAzMjYxNDYwMTc4KSwgIEJRQygwLjA2NTEwMDg1NzYyNTY1MDUpLCAgICBCUUMoIDAuNjg1NzU5OTIzOTI2MjYyKSwKLSBCUUMoMC4xNjg0MDk0MjkxODgwOTgpLCAgQlFDKDAuOTk5OTMzMDQ5Njk1ODI4KSwgQlFDKC0wLjAwMDc5MDA2Nzc4OTk3NTU2MiksIEJRQyggMC43NTE5MDU4OTY2MDIzMjUpLAotIEJRQygwLjEwMDcyNDUzMzgxODYyOCksICBCUUMoMS4wMDAwOTQ3MjY2OTg3MiksICBCUUMoLTAuMDUzMzc3MjgzMDI1NzA0MSksICAgQlFDKCAwLjgxOTMwNzQ0Mzg0NTI1KSwKLSBCUUMoMC4wNTYxNDM0MzU3ODY3MzYzKSwgQlFDKDAuOTk5OTExNjM2MzA0Mjc2KSwgQlFDKC0wLjA5MTM1NTAyOTkyMzY0MDUpLCAgIEJRQyggMC44ODg4MzYyNTg3NTkxNSksCi0gQlFDKDAuMDM0MTY4MDY3ODY2MjA1NyksIEJRQygxLjAwMDAzNjY3NTA4Njc2KSwgIEJRQygtMC4xMTM0MDUxODU1MzY2OTcpLCAgICBCUUMoIDAuOTYxNzU2NjM4MjY4NDQ2KQotfTsKKyAgICBCUUMoMS45ODk0MTA3NTY4MTkzOCksICAgICAgQlFDKDAuOTk5OTk5OTk2ODkwODExKSwKKyAgICBCUUMoMC44NjMyNjQ1MjcyMDE5NjMpLCAgICAgQlFDKDAuMTg5NTUzNzk5OTYwNjYzKSwKKyAgICBCUUMoMS45MDczMzgwNDgyMjQ0NSksICAgICAgQlFDKDEuMDAwMDAwMDE3MzYxODkpLAorICAgIEJRQygwLjgzNjMyMTU3NTg0MTY5MSksICAgICBCUUMoMC4yMDM1MDU4MDkyNjY1NjQpLAorICAgIEJRQygxLjc1NjE2NjY1NDk1MzI1KSwgICAgICBCUUMoMC45OTk5OTk5NDYwNzk3MjEpLAorICAgIEJRQygwLjc4NDY5OTIyNTEyMTU4OCksICAgICBCUUMoMC4yMzA0NzEyNjU1MDY5ODYpLAorICAgIEJRQygxLjU1NzI3NzQ1NTEyNzI2KSwgICAgICBCUUMoMS4wMDAwMDAxMTczNzgxNSksCisgICAgQlFDKDAuNzEyNTE1NDIzNTg4MzUxKSwgICAgIEJRQygwLjI2ODc1MjcyMzkwMDQ5OCksCisgICAgQlFDKDEuMzM0MDc1OTE5NDM2NDMpLCAgICAgIEJRQygwLjk5OTk5OTc5NTk1MzIyOCksCisgICAgQlFDKDAuNjI1MDU5MTE3MzMwOTg5KSwgICAgIEJRQygwLjMxNjE5NDY4NTI4ODk2NSksCisgICAgQlFDKDEuMTA2ODk4OTg0MTI0NTgpLCAgICAgIEJRQygxLjAwMDAwMDM1MDU3MTE0KSwKKyAgICBCUUMoMC41MjgwMzUxNDM2NjM5OCksICAgICAgQlFDKDAuMzcwNTE3ODQzMjI0NjY5KSwKKyAgICBCUUMoMC44OTA2MDM3MTA3ODQ1NCksICAgICAgQlFDKDAuOTk5OTk5MzQzOTYyODIyKSwKKyAgICBCUUMoMC40MjY5MjA0NjIxNjUyNTcpLCAgICAgQlFDKDAuNDI5NjA4MjAwMjA3NzQ2KSwKKyAgICBCUUMoMC42OTQ0MzgyNjEyMDk0MzMpLCAgICAgQlFDKDEuMDAwMDAwODYyOTc5MiksCisgICAgQlFDKDAuMzI2NTMwNjk5NTYxNzE2KSwgICAgIEJRQygwLjQ5MTcxNDQ1MDY1NDE3NCksCisgICAgQlFDKDAuNTIzMjM3ODAwOTM1MzIyKSwgICAgIEJRQygxLjAwMDAwMTAxMzQ5NzgyKSwKKyAgICBCUUMoMC4yMzA4Mjk1NTYyNzQ4NTEpLCAgICAgQlFDKDAuNTU1NTU5MDM0ODQzMjgxKSwKKyAgICBCUUMoMC4zNzg2MzExNjU5Mjk1NjMpLCAgICAgQlFDKDAuOTk5OTg5ODY0ODI2NjUpLAorICAgIEJRQygwLjE0MjkwNjQyMjAzNjA5NSksICAgICBCUUMoMC42MjAzMzg4NzQ0NDI0MTEpLAorICAgIEJRQygwLjI2MDc4NjkxMTMwODQzNyksICAgICBCUUMoMS4wMDAwMzI2MTQ2MDE3OCksCisgICAgQlFDKDAuMDY1MTAwODU3NjI1NjUwNSksICAgIEJRQygwLjY4NTc1OTkyMzkyNjI2MiksCisgICAgQlFDKDAuMTY4NDA5NDI5MTg4MDk4KSwgICAgIEJRQygwLjk5OTkzMzA0OTY5NTgyOCksCisgICAgQlFDKC0wLjAwMDc5MDA2Nzc4OTk3NTU2MiksIEJRQygwLjc1MTkwNTg5NjYwMjMyNSksCisgICAgQlFDKDAuMTAwNzI0NTMzODE4NjI4KSwgICAgIEJRQygxLjAwMDA5NDcyNjY5ODcyKSwKKyAgICBCUUMoLTAuMDUzMzc3MjgzMDI1NzA0MSksICAgQlFDKDAuODE5MzA3NDQzODQ1MjUpLAorICAgIEJRQygwLjA1NjE0MzQzNTc4NjczNjMpLCAgICBCUUMoMC45OTk5MTE2MzYzMDQyNzYpLAorICAgIEJRQygtMC4wOTEzNTUwMjk5MjM2NDA1KSwgICBCUUMoMC44ODg4MzYyNTg3NTkxNSksCisgICAgQlFDKDAuMDM0MTY4MDY3ODY2MjA1NyksICAgIEJRQygxLjAwMDAzNjY3NTA4Njc2KSwKKyAgICBCUUMoLTAuMTEzNDA1MTg1NTM2Njk3KSwgICAgQlFDKDAuOTYxNzU2NjM4MjY4NDQ2KX07CiAKLSNpZmRlZiBSU19CSVFVQURfU0NBVFRFUkdBSU4KLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBnNDggPSBGTDJGWENPTlNUX0RCTCgwLjY3NDM2NTMyMDYxMTYxOTkyNjgyNDA0NDgwNzE3NjcxIC0gMC4wMDEpOwotI2Vsc2UKLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBnNDggPSBGTDJGWENPTlNUX0RCTCgwLjAwMjcxMjg2NjUzMDA0NykgLSAoRklYUF9EQkwpMHg4MDAwOwotI2VuZGlmCitzdGF0aWMgY29uc3QgRklYUF9EQkwgZzQ4ID0KKyAgICBGTDJGWENPTlNUX0RCTCgwLjAwMjcxMjg2NjUzMDA0NykgLSAoRklYUF9EQkwpMHg4MDAwOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IEZJTFRFUl9QQVJBTSBwYXJhbV9zZXQ0OCA9IHsKLSAgc29zNDgsCi0gIGc0OCwKLSAgNDgwLAotICAxNSwKLSAgNCAvKiBMRiAyICovCisgICAgc29zNDgsIGc0OCwgNDgwLCAxNSwgNCAvKiBMRiAyICovCiB9OwogCiAvKioKICAqXGJyaWVmIExvdyBQYXNzCi0gV2MgPSAwLDUsIG9yZGVyIDI0LCBTdG9wIEJhbmQgLTk2ZEIuIFdjIGNyaXRlcmlhIGlzICJhbG1vc3QgMGRCIHBhc3NiYW5kIiwgbm90IHRoZSB1c3VhbCAtM2RiIGdhaW4gcG9pbnQuCi0gW2IsYV09Y2hlYnkyKDI0LDk2LDAuNSkKLSBbc29zLGddPXRmMnNvcyhiLGEpCisgV2MgPSAwLDUsIG9yZGVyIDI0LCBTdG9wIEJhbmQgLTk2ZEIuIFdjIGNyaXRlcmlhIGlzICJhbG1vc3QgMGRCIHBhc3NiYW5kIiwgbm90CisgdGhlIHVzdWFsIC0zZGIgZ2FpbiBwb2ludC4gW2IsYV09Y2hlYnkyKDI0LDk2LDAuNSkgW3NvcyxnXT10ZjJzb3MoYixhKQogIGJhbmR3aWR0aCAwLjQ1CiAgKi8KIHN0YXRpYyBjb25zdCBGSVhQX1NHTCBzb3M0NVtdID0gewotICBCUUMoMS45ODI5NjI2MDE0NDQpLCAgICAgQlFDKDEuMDAwMDAwMDAwMDc1MDQpLCAgQlFDKDAuNjQ2MTEzMzAzNzM3ODM2KSwgICBCUUMoIDAuMTA4NTExNDk5Nzk5ODEpLAotICBCUUMoMS44NTMzNDA5NDI4MTExMSksICAgQlFDKDAuOTk5OTk5OTk5Njc3MTkyKSwgQlFDKDAuNjEyMDczMjIwMTAyMDA2KSwgICBCUUMoIDAuMTMwMDIyMTQxNjk4MDQ0KSwKLSAgQlFDKDEuNjI1NDEwNTE0MTU0MjUpLCAgIEJRQygxLjAwMDAwMDAwMDgwMzk4KSwgIEJRQygwLjU0Nzg3OTcwMjg1NTk1OSksICAgQlFDKCAwLjE3MTE2NTgyNTEzMzE5MiksCi0gIEJRQygxLjM0NTU0NjU2OTIzMjQ3KSwgICBCUUMoMC45OTk5OTk5OTgwMTY5KSwgICBCUUMoMC40NjAzNzM5MTQ1MDg0OTEpLCAgIEJRQyggMC4yMjg2Nzc0NjMzNzYzNTQpLAotICBCUUMoMS4wNTY1NjU2ODUwMzExNiksICAgQlFDKDEuMDAwMDAwMDA1NjkzNjMpLCAgQlFDKDAuMzU3ODkxODk0MDM4Mjg3KSwgICBCUUMoIDAuMjk4Njc2ODQzOTEyMTg1KSwKLSAgQlFDKDAuNzg3OTY3NTg3ODc3MzEyKSwgIEJRQygwLjk5OTk5OTk4NDQxNTAxNyksIEJRQygwLjI0ODgyNjg5MzIxMTg3NyksICAgQlFDKCAwLjM3NzQ0MTgwMzUxMjk3OCksCi0gIEJRQygwLjU1NTQ4MDk3MTEyMDQ5NyksICBCUUMoMS4wMDAwMDAwMzU4MzMwNyksICBCUUMoMC4xNDA2MTQyNjMzNDUzMTUpLCAgIEJRQyggMC40NjE5NzkzMDIyMTM2NzkpLAotICBCUUMoMC4zNjQ5ODYyMDcwNzA5NjQpLCAgQlFDKDAuOTk5OTk5OTMyMDg0MzAzKSwgQlFDKDAuMDM5MjY2OTQ0NjA3NDUxNiksICBCUUMoIDAuNTUwMzM0NTExODA4MjUpLAotICBCUUMoMC4yMTY4MjcyNjc2MzE1NTgpLCAgQlFDKDEuMDAwMDAwMTA1MzQ2ODIpLCAgQlFDKC0wLjA1MDYyMzIyMjg4NjUxMDMpLCBCUUMoIDAuNjQxNjkxNTgxNTYwOTQ2KSwKLSAgQlFDKDAuMTA4OTUxNjcyMjc3MTE5KSwgIEJRQygwLjk5OTk5OTg3MTE2NzUxNiksIEJRQygtMC4xMjU1ODQ4NDAxODMyMjUpLCAgQlFDKCAwLjczNjM2Nzc0ODc3MTgwMyksCi0gIEJRQygwLjAzODc5ODg2MDcyMjkwMzUpLCBCUUMoMS4wMDAwMDAxMTIwNTU3NCksICBCUUMoLTAuMTgyODE0ODQ5MDk3OTc0KSwgIEJRQyggMC44MzU4MDIxMDg3MTQ5NjQpLAotICBCUUMoMC4wMDQyODY2MTc1ODA5MjI1KSwgQlFDKDAuOTk5OTk5OTU0ODMwODEzKSwgQlFDKC0wLjIxOTY1NzQwNjE3MTUxKSwgICBCUUMoIDAuOTQyNjIzMDQ3NzgyMzYzKQotfTsKKyAgICBCUUMoMS45ODI5NjI2MDE0NDQpLCAgICAgQlFDKDEuMDAwMDAwMDAwMDc1MDQpLCAgICBCUUMoMC42NDYxMTMzMDM3Mzc4MzYpLAorICAgIEJRQygwLjEwODUxMTQ5OTc5OTgxKSwgICBCUUMoMS44NTMzNDA5NDI4MTExMSksICAgIEJRQygwLjk5OTk5OTk5OTY3NzE5MiksCisgICAgQlFDKDAuNjEyMDczMjIwMTAyMDA2KSwgIEJRQygwLjEzMDAyMjE0MTY5ODA0NCksICAgQlFDKDEuNjI1NDEwNTE0MTU0MjUpLAorICAgIEJRQygxLjAwMDAwMDAwMDgwMzk4KSwgICBCUUMoMC41NDc4Nzk3MDI4NTU5NTkpLCAgIEJRQygwLjE3MTE2NTgyNTEzMzE5MiksCisgICAgQlFDKDEuMzQ1NTQ2NTY5MjMyNDcpLCAgIEJRQygwLjk5OTk5OTk5ODAxNjkpLCAgICAgQlFDKDAuNDYwMzczOTE0NTA4NDkxKSwKKyAgICBCUUMoMC4yMjg2Nzc0NjMzNzYzNTQpLCAgQlFDKDEuMDU2NTY1Njg1MDMxMTYpLCAgICBCUUMoMS4wMDAwMDAwMDU2OTM2MyksCisgICAgQlFDKDAuMzU3ODkxODk0MDM4Mjg3KSwgIEJRQygwLjI5ODY3Njg0MzkxMjE4NSksICAgQlFDKDAuNzg3OTY3NTg3ODc3MzEyKSwKKyAgICBCUUMoMC45OTk5OTk5ODQ0MTUwMTcpLCAgQlFDKDAuMjQ4ODI2ODkzMjExODc3KSwgICBCUUMoMC4zNzc0NDE4MDM1MTI5NzgpLAorICAgIEJRQygwLjU1NTQ4MDk3MTEyMDQ5NyksICBCUUMoMS4wMDAwMDAwMzU4MzMwNyksICAgIEJRQygwLjE0MDYxNDI2MzM0NTMxNSksCisgICAgQlFDKDAuNDYxOTc5MzAyMjEzNjc5KSwgIEJRQygwLjM2NDk4NjIwNzA3MDk2NCksICAgQlFDKDAuOTk5OTk5OTMyMDg0MzAzKSwKKyAgICBCUUMoMC4wMzkyNjY5NDQ2MDc0NTE2KSwgQlFDKDAuNTUwMzM0NTExODA4MjUpLCAgICBCUUMoMC4yMTY4MjcyNjc2MzE1NTgpLAorICAgIEJRQygxLjAwMDAwMDEwNTM0NjgyKSwgICBCUUMoLTAuMDUwNjIzMjIyODg2NTEwMyksIEJRQygwLjY0MTY5MTU4MTU2MDk0NiksCisgICAgQlFDKDAuMTA4OTUxNjcyMjc3MTE5KSwgIEJRQygwLjk5OTk5OTg3MTE2NzUxNiksICAgQlFDKC0wLjEyNTU4NDg0MDE4MzIyNSksCisgICAgQlFDKDAuNzM2MzY3NzQ4NzcxODAzKSwgIEJRQygwLjAzODc5ODg2MDcyMjkwMzUpLCAgQlFDKDEuMDAwMDAwMTEyMDU1NzQpLAorICAgIEJRQygtMC4xODI4MTQ4NDkwOTc5NzQpLCBCUUMoMC44MzU4MDIxMDg3MTQ5NjQpLCAgIEJRQygwLjAwNDI4NjYxNzU4MDkyMjUpLAorICAgIEJRQygwLjk5OTk5OTk1NDgzMDgxMyksICBCUUMoLTAuMjE5NjU3NDA2MTcxNTEpLCAgIEJRQygwLjk0MjYyMzA0Nzc4MjM2Myl9OwogCi0jaWZkZWYgUlNfQklRVUFEX1NDQVRURVJHQUlOCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgZzQ1ID0gRkwyRlhDT05TVF9EQkwoMC42MDU0NzQyODg5MTM0MTMxOTA1MTE0MjYyOTcwNjcyMyAtIDAuMDAxKTsKLSNlbHNlCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgZzQ1ID0gRkwyRlhDT05TVF9EQkwoMC4wMDI0Mjc0Mzk4MDkwOTUyNCkgLSAoRklYUF9EQkwpMHg4MDAwOwotI2VuZGlmCitzdGF0aWMgY29uc3QgRklYUF9EQkwgZzQ1ID0KKyAgICBGTDJGWENPTlNUX0RCTCgwLjAwMjQyNzQzOTgwOTA5NTI0KSAtIChGSVhQX0RCTCkweDgwMDA7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgRklMVEVSX1BBUkFNIHBhcmFtX3NldDQ1ID0gewotICBzb3M0NSwKLSAgZzQ1LAotICA0NTAsCi0gIDEyLAotICA0IC8qIExGIDIgKi8KKyAgICBzb3M0NSwgZzQ1LCA0NTAsIDEyLCA0IC8qIExGIDIgKi8KIH07CiAKIC8qCkBAIC0xOTcsMzAgKzIxNiwyMyBAQAogIGJhbmR3aWR0aCA9IDAuNDEKICAqLwogCi1zdGF0aWMgY29uc3QgRklYUF9TR0wgc29zNDFbXSA9Ci17Ci0gIEJRQygxLjk2MTkzNjI1MjkyKSwgICAgICAgQlFDKDAuOTk5OTk5OTk5OTk5OTY0KSwgQlFDKDAuMTY5MjY2MTc4Nzg2Nzg5KSwgICBCUUMoMC4wMTI4ODIzMzAwNDc1OTA3KSwKLSAgQlFDKDEuNjg5MTM0Mzc2NjIwOTIpLCAgICBCUUMoMS4wMDAwMDAwMDAwMDA1MyksICBCUUMoMC4xMjQ3NTE1MDMyMDY1NTIpLCAgIEJRQygwLjA1Mzc0NzIyNzM5NTA5ODkpLAotICBCUUMoMS4yNzI3NDY5MjM2NjAxNyksICAgIEJRQygwLjk5OTk5OTk5OTk5NTY3NCksIEJRQygwLjA0MzMxMDg2MjUxNzgzNTcpLCAgQlFDKDAuMTMxMDE1NzUzMjM2MzE3KSwKLSAgQlFDKDAuODUyMTQxNzUwODgzOTUpLCAgICBCUUMoMS4wMDAwMDAwMDAwMTgxMyksICBCUUMoLTAuMDYyNTY1ODE1MjU1MDQwOCksIEJRQygwLjIzNzc2Mzc3ODk5MzgwNiksCi0gIEJRQygwLjUwMzg0MTU3OTkzOTAwOSksICAgQlFDKDAuOTk5OTk5OTk5OTUzMjIzKSwgQlFDKC0wLjE3OTE3NjEyODcyMjg2NSksICBCUUMoMC4zNjc0NzUyMzY0MjQ0NzQpLAotICBCUUMoMC4yNDk5OTA3MTE5ODYxNjIpLCAgIEJRQygxLjAwMDAwMDAwMDA3OTUyKSwgIEJRQygtMC4yOTQ0MjUxNjU4MjQ2NzYpLCAgQlFDKDAuNTE2NTk0ODU3MTcwMjEyKSwKLSAgQlFDKDAuMDg3OTcxNjY4NjgwMjg2KSwgICBCUUMoMC45OTk5OTk5OTk5MTU1MjgpLCBCUUMoLTAuMzk4OTU2NTY2Nzc3OTI4KSwgIEJRQygwLjY4NjQxNzc2NzgwMTEyMyksCi0gIEJRQygwLjAwOTY1MzczMzI1MzUwMjk0KSwgQlFDKDEuMDAwMDAwMDAwMDM3NDQpLCAgQlFDKC0wLjQ4NTc5MTczNzY0ODE3KSwgICBCUUMoMC44ODQ5MzE1MzQyMzkwNjgpCi19Oworc3RhdGljIGNvbnN0IEZJWFBfU0dMIHNvczQxW10gPSB7CisgICAgQlFDKDEuOTYxOTM2MjUyOTIpLCAgICAgIEJRQygwLjk5OTk5OTk5OTk5OTk2NCksICAgQlFDKDAuMTY5MjY2MTc4Nzg2Nzg5KSwKKyAgICBCUUMoMC4wMTI4ODIzMzAwNDc1OTA3KSwgQlFDKDEuNjg5MTM0Mzc2NjIwOTIpLCAgICBCUUMoMS4wMDAwMDAwMDAwMDA1MyksCisgICAgQlFDKDAuMTI0NzUxNTAzMjA2NTUyKSwgIEJRQygwLjA1Mzc0NzIyNzM5NTA5ODkpLCAgQlFDKDEuMjcyNzQ2OTIzNjYwMTcpLAorICAgIEJRQygwLjk5OTk5OTk5OTk5NTY3NCksICBCUUMoMC4wNDMzMTA4NjI1MTc4MzU3KSwgIEJRQygwLjEzMTAxNTc1MzIzNjMxNyksCisgICAgQlFDKDAuODUyMTQxNzUwODgzOTUpLCAgIEJRQygxLjAwMDAwMDAwMDAxODEzKSwgICAgQlFDKC0wLjA2MjU2NTgxNTI1NTA0MDgpLAorICAgIEJRQygwLjIzNzc2Mzc3ODk5MzgwNiksICBCUUMoMC41MDM4NDE1Nzk5MzkwMDkpLCAgIEJRQygwLjk5OTk5OTk5OTk1MzIyMyksCisgICAgQlFDKC0wLjE3OTE3NjEyODcyMjg2NSksIEJRQygwLjM2NzQ3NTIzNjQyNDQ3NCksICAgQlFDKDAuMjQ5OTkwNzExOTg2MTYyKSwKKyAgICBCUUMoMS4wMDAwMDAwMDAwNzk1MiksICAgQlFDKC0wLjI5NDQyNTE2NTgyNDY3NiksICBCUUMoMC41MTY1OTQ4NTcxNzAyMTIpLAorICAgIEJRQygwLjA4Nzk3MTY2ODY4MDI4NiksICBCUUMoMC45OTk5OTk5OTk5MTU1MjgpLCAgIEJRQygtMC4zOTg5NTY1NjY3Nzc5MjgpLAorICAgIEJRQygwLjY4NjQxNzc2NzgwMTEyMyksICBCUUMoMC4wMDk2NTM3MzMyNTM1MDI5NCksIEJRQygxLjAwMDAwMDAwMDAzNzQ0KSwKKyAgICBCUUMoLTAuNDg1NzkxNzM3NjQ4MTcpLCAgQlFDKDAuODg0OTMxNTM0MjM5MDY4KX07CiAKLSNpZmRlZiBSU19CSVFVQURfU0NBVFRFUkdBSU4KLXN0YXRpYyBjb25zdCBGSVhQX0RCTCBnNDEgPSBGTDJGWENPTlNUX0RCTCgwLjQ0NTc4NTE0NDc2NDc2Njc5NzUwODExMjIyMTIzNTY5KTsKLSNlbHNlCiBzdGF0aWMgY29uc3QgRklYUF9EQkwgZzQxID0gRkwyRlhDT05TVF9EQkwoMC4wMDE1NTk1Njk1MTE2OTI0OCk7Ci0jZW5kaWYKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBGSUxURVJfUEFSQU0gcGFyYW1fc2V0NDEgPSB7Ci0gIHNvczQxLAotICBnNDEsCi0gIDQxMCwKLSAgOCwKLSAgNSAvKiBMRiAzICovCisgICAgc29zNDEsIGc0MSwgNDEwLCA4LCA1IC8qIExGIDMgKi8KIH07CiAKIC8qCkBAIC0yMjksMjkgKzI0MSwxOSBAQAogIFtiLGFdPWNoZWJ5MigxMiw5NiwwLjUpOwogIFtzb3MsZ109dGYyc29zKGIsYSkKICovCi1zdGF0aWMgY29uc3QgRklYUF9TR0wgc29zMzVbXSA9Ci17Ci0gIEJRQygxLjkzMjk5MzI1MjM1NzYyKSwgICBCUUMoMC45OTk5OTk5OTk5OTk5ODUpLCBCUUMoLTAuMTQwNzMzMTg3MjQ2NTk2KSwgQlFDKDAuMDEyNDEzOTQ5NzgzNjA2MiksCi0gIEJRQygxLjQ4OTA0MTY3NjQxMDkpLCAgICBCUUMoMS4wMDAwMDAwMDAwMDAxMSksICBCUUMoLTAuMTk4MjE1NDAyNTg4NTA0KSwgQlFDKDAuMDc0NjczMDYxNjU4NDEzOCksCi0gIEJRQygwLjkxODQ1MDE2MTMwOTc5NSksICBCUUMoMC45OTk5OTk5OTk5OTk2MTkpLCBCUUMoLTAuMzAxMzM5MTI3OTE5NDEpLCAgQlFDKDAuMTkyMjc2NDY4ODM5NTI5KSwKLSAgQlFDKDAuNDU0ODc3MDI0MjQ2ODE4KSwgIEJRQygxLjAwMDAwMDAwMDAwMDg2KSwgIEJRQygtMC40MzIzMzczMjg4MDk4MTUpLCBCUUMoMC4zNTY4NTI5MzM2NDI4MTUpLAotICBCUUMoMC4xNTgwMTcxNDcxMTg1MDcpLCAgQlFDKDAuOTk5OTk5OTk5OTk4ODc2KSwgQlFDKC0wLjU3NDgxNzQ5NDI0OTc3NyksIEJRQygwLjU2NjM4MDQzNjk3MDgzMyksCi0gIEJRQygwLjAxNzE4MzQ2NDk0Nzg3NDkpLCBCUUMoMS4wMDAwMDAwMDAwMDA1NSksICBCUUMoLTAuNzE4NTgxMTc4MDQxMTY1KSwgQlFDKDAuODMzNjc0ODQ0ODc4ODkpCi19Oworc3RhdGljIGNvbnN0IEZJWFBfU0dMIHNvczM1W10gPSB7CisgICAgQlFDKDEuOTMyOTkzMjUyMzU3NjIpLCAgIEJRQygwLjk5OTk5OTk5OTk5OTk4NSksICBCUUMoLTAuMTQwNzMzMTg3MjQ2NTk2KSwKKyAgICBCUUMoMC4wMTI0MTM5NDk3ODM2MDYyKSwgQlFDKDEuNDg5MDQxNjc2NDEwOSksICAgIEJRQygxLjAwMDAwMDAwMDAwMDExKSwKKyAgICBCUUMoLTAuMTk4MjE1NDAyNTg4NTA0KSwgQlFDKDAuMDc0NjczMDYxNjU4NDEzOCksIEJRQygwLjkxODQ1MDE2MTMwOTc5NSksCisgICAgQlFDKDAuOTk5OTk5OTk5OTk5NjE5KSwgIEJRQygtMC4zMDEzMzkxMjc5MTk0MSksICBCUUMoMC4xOTIyNzY0Njg4Mzk1MjkpLAorICAgIEJRQygwLjQ1NDg3NzAyNDI0NjgxOCksICBCUUMoMS4wMDAwMDAwMDAwMDA4NiksICAgQlFDKC0wLjQzMjMzNzMyODgwOTgxNSksCisgICAgQlFDKDAuMzU2ODUyOTMzNjQyODE1KSwgIEJRQygwLjE1ODAxNzE0NzExODUwNyksICBCUUMoMC45OTk5OTk5OTk5OTg4NzYpLAorICAgIEJRQygtMC41NzQ4MTc0OTQyNDk3NzcpLCBCUUMoMC41NjYzODA0MzY5NzA4MzMpLCAgQlFDKDAuMDE3MTgzNDY0OTQ3ODc0OSksCisgICAgQlFDKDEuMDAwMDAwMDAwMDAwNTUpLCAgIEJRQygtMC43MTg1ODExNzgwNDExNjUpLCBCUUMoMC44MzM2NzQ4NDQ4Nzg4OSl9OwogCi0jaWZkZWYgUlNfQklRVUFEX1NDQVRURVJHQUlOCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgZzM1ID0gRkwyRlhDT05TVF9EQkwoMC4zNDI5MDg1MzU3NDk3Mzg5ODY5NDUyMTI2NzYwNjc5Mik7Ci0jZWxzZQogc3RhdGljIGNvbnN0IEZJWFBfREJMIGczNSA9IEZMMkZYQ09OU1RfREJMKDAuMDAxNjI1ODA5OTQxMjUxMzEpOwotI2VuZGlmCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgRklMVEVSX1BBUkFNIHBhcmFtX3NldDM1ID0gewotICBzb3MzNSwKLSAgZzM1LAotICAzNTAsCi0gIDYsCi0gIDQKLX07CitzdGF0aWMgY29uc3Qgc3RydWN0IEZJTFRFUl9QQVJBTSBwYXJhbV9zZXQzNSA9IHtzb3MzNSwgZzM1LCAzNTAsIDYsIDR9OwogCiAvKgogICMgQ3JlYXRlZCBieSBPY3RhdmUgMi4xLjczLCBNb24gT2N0IDEzIDE4OjE1OjM4IDIwMDggQ0VTVApAQCAtMjU5LDY2ICsyNjEsNTMgQEAKICBbYixhXT1jaGVieTIoOCw5NiwwLjUpOwogIFtzb3MsZ109dGYyc29zKGIsYSkKICovCi1zdGF0aWMgY29uc3QgRklYUF9TR0wgc29zMjVbXSA9Ci17Ci0gIEJRQygxLjg1MzM0MDk0MzAxMjI1KSwgICBCUUMoMS4wKSwgICAgICAgICAgICAgICBCUUMoLTAuNzAyMTI3MjE0MjEyNjYzKSwgQlFDKDAuMTMyNDUyNDAzOTk4NzY3KSwKLSAgQlFDKDEuMDU2NTY1NjgyMTY3KSwgICAgIEJRQygwLjk5OTk5OTk5OTk5OTk5NyksIEJRQygtMC43ODk1MDM2Njc4ODA3ODUpLCBCUUMoMC4yMzYzMjg2OTM1NjkxMjgpLAotICBCUUMoMC4zNjQ5ODYzMDc0NTU0ODkpLCAgQlFDKDAuOTk5OTk5OTk5OTk5OTk2KSwgQlFDKC0wLjk1NTE5MTE4OTg0MzM3NSksIEJRQygwLjQ0Mjk2NjQ1NzkzNjM3OSksCi0gIEJRQygwLjAzODc5ODU3NTE2NDIxMjUpLCBCUUMoMS4wKSwgICAgICAgICAgICAgICBCUUMoLTEuMTk4MTc3ODYwODgwODQpLCAgQlFDKDAuNzcwNDkzODk1NDU2MzI4KQotfTsKK3N0YXRpYyBjb25zdCBGSVhQX1NHTCBzb3MyNVtdID0geworICAgIEJRQygxLjg1MzM0MDk0MzAxMjI1KSwgICBCUUMoMS4wKSwKKyAgICBCUUMoLTAuNzAyMTI3MjE0MjEyNjYzKSwgQlFDKDAuMTMyNDUyNDAzOTk4NzY3KSwKKyAgICBCUUMoMS4wNTY1NjU2ODIxNjcpLCAgICAgQlFDKDAuOTk5OTk5OTk5OTk5OTk3KSwKKyAgICBCUUMoLTAuNzg5NTAzNjY3ODgwNzg1KSwgQlFDKDAuMjM2MzI4NjkzNTY5MTI4KSwKKyAgICBCUUMoMC4zNjQ5ODYzMDc0NTU0ODkpLCAgQlFDKDAuOTk5OTk5OTk5OTk5OTk2KSwKKyAgICBCUUMoLTAuOTU1MTkxMTg5ODQzMzc1KSwgQlFDKDAuNDQyOTY2NDU3OTM2Mzc5KSwKKyAgICBCUUMoMC4wMzg3OTg1NzUxNjQyMTI1KSwgQlFDKDEuMCksCisgICAgQlFDKC0xLjE5ODE3Nzg2MDg4MDg0KSwgIEJRQygwLjc3MDQ5Mzg5NTQ1NjMyOCl9OwogCi0jaWZkZWYgUlNfQklRVUFEX1NDQVRURVJHQUlOCi1zdGF0aWMgY29uc3QgRklYUF9EQkwgZzI1ID0gRkwyRlhDT05TVF9EQkwoMC4xNzUzMzkxNzQwODkzNjM0Njk2MDA4MDI1OTk1MDQ3MSk7Ci0jZWxzZQogc3RhdGljIGNvbnN0IEZJWFBfREJMIGcyNSA9IEZMMkZYQ09OU1RfREJMKDAuMDAwOTQ1MTgyODM1Mjk0NTU5KTsKLSNlbmRpZgogCi1zdGF0aWMgY29uc3Qgc3RydWN0IEZJTFRFUl9QQVJBTSBwYXJhbV9zZXQyNSA9IHsKLSAgc29zMjUsCi0gIGcyNSwKLSAgMjUwLAotICA0LAotICA1Ci19Oworc3RhdGljIGNvbnN0IHN0cnVjdCBGSUxURVJfUEFSQU0gcGFyYW1fc2V0MjUgPSB7c29zMjUsIGcyNSwgMjUwLCA0LCA1fTsKIAogLyogTXVzdCBiZSBzb3J0ZWQgaW4gZGVzY2VuZGluZyBvcmRlciAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBGSUxURVJfUEFSQU0gKmNvbnN0IGZpbHRlcl9wYXJhbVNldFtdID0gewotICAmcGFyYW1fc2V0NDgsCi0gICZwYXJhbV9zZXQ0NSwKLSAgJnBhcmFtX3NldDQxLAotICAmcGFyYW1fc2V0MzUsCi0gICZwYXJhbV9zZXQyNQotfTsKLQorICAgICZwYXJhbV9zZXQ0OCwgJnBhcmFtX3NldDQ1LCAmcGFyYW1fc2V0NDEsICZwYXJhbV9zZXQzNSwgJnBhcmFtX3NldDI1fTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgUmVzYW1wbGVyIEZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KIC8qIQogICBcYnJpZWYgICBSZXNldCBkb3duc2FtcGxlciBpbnN0YW5jZSBhbmQgY2xlYXIgZGVsYXkgbGluZXMKIAogICBccmV0dXJuICBzdWNjZXNzIG9mIG9wZXJhdGlvbgogKi8KIAotSU5UIEZES2FhY0VuY19Jbml0RG93bnNhbXBsZXIoRE9XTlNBTVBMRVIgKkRvd25TYW1wbGVyLCAvKiE8IHBvaW50ZXIgdG8gZG93bnNhbXBsZXIgaW5zdGFuY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBXYywgICAgICAgICAgICAgICAgICAgLyohPCBub3JtYWxpemVkIGN1dG9mZiBmcmVxICogMTAwMCogICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmF0aW8pICAgICAgICAgICAgICAgIC8qITwgZG93bnNhbXBsZXIgcmF0aW8gKG9ubHkgMiBzdXBwb3J0ZWQgYXQgdGhlIG1vbW1lbnQpICovCitJTlQgRkRLYWFjRW5jX0luaXREb3duc2FtcGxlcigKKyAgICBET1dOU0FNUExFUiAqRG93blNhbXBsZXIsIC8qITwgcG9pbnRlciB0byBkb3duc2FtcGxlciBpbnN0YW5jZSAqLworICAgIGludCBXYywgICAgICAgICAgICAgICAgICAgLyohPCBub3JtYWxpemVkIGN1dG9mZiBmcmVxICogMTAwMCogICovCisgICAgaW50IHJhdGlvKSAgICAgICAgICAgICAgICAvKiE8IGRvd25zYW1wbGVyIHJhdGlvICovCiAKIHsKICAgVUlOVCBpOwotICBjb25zdCBzdHJ1Y3QgRklMVEVSX1BBUkFNICpjdXJyZW50U2V0PU5VTEw7CisgIGNvbnN0IHN0cnVjdCBGSUxURVJfUEFSQU0gKmN1cnJlbnRTZXQgPSBOVUxMOwogCi0gIEZES19BU1NFUlQocmF0aW8gPT0gMik7Ci0gIEZES21lbWNsZWFyKERvd25TYW1wbGVyLT5kb3duRmlsdGVyLnN0YXRlcywgc2l6ZW9mKERvd25TYW1wbGVyLT5kb3duRmlsdGVyLnN0YXRlcykpOwotICBEb3duU2FtcGxlci0+ZG93bkZpbHRlci5wdHIgICA9ICAgMDsKKyAgRkRLbWVtY2xlYXIoRG93blNhbXBsZXItPmRvd25GaWx0ZXIuc3RhdGVzLAorICAgICAgICAgICAgICBzaXplb2YoRG93blNhbXBsZXItPmRvd25GaWx0ZXIuc3RhdGVzKSk7CisgIERvd25TYW1wbGVyLT5kb3duRmlsdGVyLnB0ciA9IDA7CiAKICAgLyoKICAgICBmaW5kIGFwcGxpY2FibGUgcGFyYW1ldGVyIHNldAogICAqLwogICBjdXJyZW50U2V0ID0gZmlsdGVyX3BhcmFtU2V0WzBdOwotICBmb3IoaT0xO2k8c2l6ZW9mKGZpbHRlcl9wYXJhbVNldCkvc2l6ZW9mKHN0cnVjdCBGSUxURVJfUEFSQU0gKik7aSsrKXsKKyAgZm9yIChpID0gMTsgaSA8IHNpemVvZihmaWx0ZXJfcGFyYW1TZXQpIC8gc2l6ZW9mKHN0cnVjdCBGSUxURVJfUEFSQU0gKik7CisgICAgICAgaSsrKSB7CiAgICAgaWYgKGZpbHRlcl9wYXJhbVNldFtpXS0+V2MgPD0gV2MpIHsKICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTMyNywyMCArMzE2LDE4IEBACiAKICAgRG93blNhbXBsZXItPmRvd25GaWx0ZXIuY29lZmZhID0gY3VycmVudFNldC0+Y29lZmZhOwogCi0KICAgRG93blNhbXBsZXItPmRvd25GaWx0ZXIuZ2FpbiA9IGN1cnJlbnRTZXQtPmc7Ci0gIEZES19BU1NFUlQoY3VycmVudFNldC0+bm9Db2VmZnMgPD0gTUFYTlJfU0VDVElPTlMqMik7CisgIEZES19BU1NFUlQoY3VycmVudFNldC0+bm9Db2VmZnMgPD0gTUFYTlJfU0VDVElPTlMgKiAyKTsKIAogICBEb3duU2FtcGxlci0+ZG93bkZpbHRlci5ub0NvZWZmcyA9IGN1cnJlbnRTZXQtPm5vQ29lZmZzOwogICBEb3duU2FtcGxlci0+ZGVsYXkgPSBjdXJyZW50U2V0LT5kZWxheTsKICAgRG93blNhbXBsZXItPmRvd25GaWx0ZXIuV2MgPSBjdXJyZW50U2V0LT5XYzsKIAotICBEb3duU2FtcGxlci0+cmF0aW8gPSAgIHJhdGlvOwotICBEb3duU2FtcGxlci0+cGVuZGluZyA9IHJhdGlvLTE7Ci0gIHJldHVybigxKTsKKyAgRG93blNhbXBsZXItPnJhdGlvID0gcmF0aW87CisgIERvd25TYW1wbGVyLT5wZW5kaW5nID0gcmF0aW8gLSAxOworICByZXR1cm4gKDEpOwogfQogCi0KIC8qIQogICBcYnJpZWYgICBmYXN0ZXIgc2ltcGxlIGZvbGRpbmcgb3BlcmF0aW9uCiAgICAgICAgICAgIEZpbHRlcjoKQEAgLTM1MSw2NCArMzM4LDU0IEBACiAgIFxyZXR1cm4gIGZpbHRlcmVkIHZhbHVlCiAqLwogCi1zdGF0aWMgaW5saW5lIElOVF9QQ00gQWR2YW5jZUZpbHRlcihMUF9GSUxURVIgKmRvd25GaWx0ZXIsICAvKiE8IHBvaW50ZXIgdG8gaWlyIGZpbHRlciBpbnN0YW5jZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICpwSW5wdXQsICAgICAgICAgIC8qITwgaW5wdXQgb2YgZmlsdGVyICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvd25SYXRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5TdHJpZGUpCi17CitzdGF0aWMgaW5saW5lIElOVF9QQ00gQWR2YW5jZUZpbHRlcigKKyAgICBMUF9GSUxURVIgKmRvd25GaWx0ZXIsIC8qITwgcG9pbnRlciB0byBpaXIgZmlsdGVyIGluc3RhbmNlICovCisgICAgSU5UX1BDTSAqcElucHV0LCAgICAgICAvKiE8IGlucHV0IG9mIGZpbHRlciAgICAgICAgICAgICAgICAqLworICAgIGludCBkb3duUmF0aW8pIHsKICAgSU5UX1BDTSBvdXRwdXQ7CiAgIGludCBpLCBuOwogCi0KLSNpZmRlZiBSU19CSVFVQURfU0NBVFRFUkdBSU4KLSNkZWZpbmUgQklRVUFEX1NDQUxFIDMKLSNlbHNlCiAjZGVmaW5lIEJJUVVBRF9TQ0FMRSAxMgotI2VuZGlmCiAKICAgRklYUF9EQkwgeSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICBGSVhQX0RCTCBpbnB1dDsKIAotICBmb3IgKG49MDsgbjxkb3duUmF0aW87IG4rKykKLSAgewotICAgIEZJWFBfQlFTICgqc3RhdGVzKVsyXSA9IGRvd25GaWx0ZXItPnN0YXRlczsKKyAgZm9yIChuID0gMDsgbiA8IGRvd25SYXRpbzsgbisrKSB7CisgICAgRklYUF9CUVMoKnN0YXRlcylbMl0gPSBkb3duRmlsdGVyLT5zdGF0ZXM7CiAgICAgY29uc3QgRklYUF9TR0wgKmNvZWZmID0gZG93bkZpbHRlci0+Y29lZmZhOwotICAgIGludCBzMSxzMjsKKyAgICBpbnQgczEsIHMyOwogCiAgICAgczEgPSBkb3duRmlsdGVyLT5wdHI7CiAgICAgczIgPSBzMSBeIDE7CiAKICNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCi0gICAgaW5wdXQgPSAgKChGSVhQX0RCTClwSW5wdXRbbippblN0cmlkZV0pIDw8IChERlJBQ1RfQklUUy1TQU1QTEVfQklUUy1CSVFVQURfU0NBTEUpOworICAgIGlucHV0ID0gKChGSVhQX0RCTClwSW5wdXRbbl0pIDw8IChERlJBQ1RfQklUUyAtIFNBTVBMRV9CSVRTIC0gQklRVUFEX1NDQUxFKTsKICNlbGlmIChTQU1QTEVfQklUUyA9PSAzMikKLSAgICBpbnB1dCA9ICBwSW5wdXRbbippblN0cmlkZV0gPj4gQklRVUFEX1NDQUxFOworICAgIGlucHV0ID0gcElucHV0W25dID4+IEJJUVVBRF9TQ0FMRTsKICNlbHNlCiAjZXJyb3IgTk9UIElNUExFTUVOVEVECiAjZW5kaWYKIAotI2lmbmRlZiBSU19CSVFVQURfU0NBVFRFUkdBSU4gLyogTWVyZ2VkIERpcmVjdCBmb3JtIEkgKi8KLQogICAgIEZJWFBfQlFTIHN0YXRlMSwgc3RhdGUyLCBzdGF0ZTFiLCBzdGF0ZTJiOwogCiAgICAgc3RhdGUxID0gc3RhdGVzWzBdW3MxXTsKICAgICBzdGF0ZTIgPSBzdGF0ZXNbMF1bczJdOwogCiAgICAgLyogTG9vcCBvdmVyIHNlY3Rpb25zICovCi0gICAgZm9yIChpPTA7IGk8ZG93bkZpbHRlci0+bm9Db2VmZnM7IGkrKykKLSAgICB7CisgICAgZm9yIChpID0gMDsgaSA8IGRvd25GaWx0ZXItPm5vQ29lZmZzOyBpKyspIHsKICAgICAgIEZJWFBfREJMIHN0YXRlMDsKIAogICAgICAgLyogTG9hZCBtZXJnZWQgc3RhdGVzIChmcm9tIG5leHQgc2VjdGlvbikgKi8KLSAgICAgIHN0YXRlMWIgPSBzdGF0ZXNbaSsxXVtzMV07Ci0gICAgICBzdGF0ZTJiID0gc3RhdGVzW2krMV1bczJdOworICAgICAgc3RhdGUxYiA9IHN0YXRlc1tpICsgMV1bczFdOworICAgICAgc3RhdGUyYiA9IHN0YXRlc1tpICsgMV1bczJdOwogCi0gICAgICBzdGF0ZTAgPSBpbnB1dCAgKyBmTXVsdChzdGF0ZTEsIGNvZWZmW0IxXSkgKyBmTXVsdChzdGF0ZTIsIGNvZWZmW0IyXSk7Ci0gICAgICB5ICAgICAgPSBzdGF0ZTAgLSBmTXVsdChzdGF0ZTFiLCBjb2VmZltBMV0pIC0gZk11bHQoc3RhdGUyYiwgY29lZmZbQTJdKTsKKyAgICAgIHN0YXRlMCA9IGlucHV0ICsgZk11bHQoc3RhdGUxLCBjb2VmZltCMV0pICsgZk11bHQoc3RhdGUyLCBjb2VmZltCMl0pOworICAgICAgeSA9IHN0YXRlMCAtIGZNdWx0KHN0YXRlMWIsIGNvZWZmW0ExXSkgLSBmTXVsdChzdGF0ZTJiLCBjb2VmZltBMl0pOwogCiAgICAgICAvKiBTdG9yZSBuZXcgZmVlZCBmb3J3YXJkIG1lcmdlIHN0YXRlICovCi0gICAgICBzdGF0ZXNbaSsxXVtzMl0gPSB5PDwxOworICAgICAgc3RhdGVzW2kgKyAxXVtzMl0gPSB5IDw8IDE7CiAgICAgICAvKiBTdG9yZSBuZXcgZmVlZCBiYWNrd2FyZCBzdGF0ZSAqLwotICAgICAgc3RhdGVzW2ldW3MyXSA9IGlucHV0PDwxOworICAgICAgc3RhdGVzW2ldW3MyXSA9IGlucHV0IDw8IDE7CiAKICAgICAgIC8qIEZlZWRiYWNrIG91dHB1dCB0byBuZXh0IHNlY3Rpb24uICovCiAgICAgICBpbnB1dCA9IHk7CkBAIC00MjUsNTcgKzQwMiwyMCBAQAogICAvKiBBcHBseSBnbG9iYWwgZ2FpbiAqLwogICB5ID0gZk11bHQoeSwgZG93bkZpbHRlci0+Z2Fpbik7CiAKLSNlbHNlIC8qIERpcmVjdCBmb3JtIElJICovCi0KLSAgICAvKiBMb29wIG92ZXIgc2VjdGlvbnMgKi8KLSAgICBmb3IgKGk9MDsgaTxkb3duRmlsdGVyLT5ub0NvZWZmczsgaSsrKQotICAgIHsKLSAgICAgIEZJWFBfQlFTIHN0YXRlMSwgc3RhdGUyOwotICAgICAgRklYUF9EQkwgc3RhdGUwOwotCi0gICAgICAvKiBMb2FkIHN0YXRlcyAqLwotICAgICAgc3RhdGUxID0gc3RhdGVzW2ldW3MxXTsKLSAgICAgIHN0YXRlMiA9IHN0YXRlc1tpXVtzMl07Ci0KLSAgICAgIHN0YXRlMCA9IGlucHV0ICAtIGZNdWx0KHN0YXRlMSwgY29lZmZbQTFdKSAtIGZNdWx0KHN0YXRlMiwgY29lZmZbQTJdKTsKLSAgICAgIHkgPSBzdGF0ZTAgICAgICArIGZNdWx0KHN0YXRlMSwgY29lZmZbQjFdKSArIGZNdWx0KHN0YXRlMiwgY29lZmZbQjJdKTsKLSAgICAgIC8qIEFwcGx5IHNjYXR0ZXJlZCBnYWluICovCi0gICAgICB5ID0gZk11bHQoeSwgZG93bkZpbHRlci0+Z2Fpbik7Ci0KLSAgICAgIC8qIFN0b3JlIG5ldyBzdGF0ZSBpbiBub3JtYWxpemVkIGZvcm0gKi8KLSNpZmRlZiBSU19CSVFVQURfU1RBVEVTMTYKLSAgICAgIC8qIERvIG5vdCBzYXR1cmF0ZSBhbnkgc3RhdGUgdmFsdWUgISBUaGUgcmVzdWx0IHdvdWxkIGJlIHVuYWNjZXB0YWJsZS4gUm91bmRpbmcgbWFrZXMgU05SIGFyb3VuZCAxMGRCIGJldHRlci4gKi8KLSAgICAgIHN0YXRlc1tpXVtzMl0gPSAoRklYUF9CUVMpKExPTkcpKChzdGF0ZTAgKyAoRklYUF9EQkwpKDE8PChERlJBQ1RfQklUUy1GUkFDVF9CSVRTLTIpKSkgPj4gKERGUkFDVF9CSVRTLUZSQUNUX0JJVFMtMSkpOwotI2Vsc2UKLSAgICAgIHN0YXRlc1tpXVtzMl0gPSBzdGF0ZTA8PDE7Ci0jZW5kaWYKLQotICAgICAgLyogRmVlZGJhY2sgb3V0cHV0IHRvIG5leHQgc2VjdGlvbi4gKi8KLSAgICAgIGlucHV0PXk7Ci0KLSAgICAgIC8qIFN0ZXAgdG8gbmV4dCBjb2VmIHNldCAqLwotICAgICAgY29lZmYgKz0gQklRVUFEX0NPRUZTVEVQOwotICAgIH0KLSAgICBkb3duRmlsdGVyLT5wdHIgXj0gMTsKLSAgfQotCi0jZW5kaWYKLQogICAvKiBBcHBseSBmaW5hbCBnYWluL3NjYWxpbmcgdG8gb3V0cHV0ICovCiAjaWYgKFNBTVBMRV9CSVRTID09IDE2KQotICBvdXRwdXQgPSAoSU5UX1BDTSkgU0FUVVJBVEVfUklHSFRfU0hJRlQoeSsoRklYUF9EQkwpKDE8PChERlJBQ1RfQklUUy1TQU1QTEVfQklUUy1CSVFVQURfU0NBTEUtMSkpLCBERlJBQ1RfQklUUy1TQU1QTEVfQklUUy1CSVFVQURfU0NBTEUsIFNBTVBMRV9CSVRTKTsKLSAgLy9vdXRwdXQgPSAoSU5UX1BDTSkgU0FUVVJBVEVfUklHSFRfU0hJRlQoeSwgREZSQUNUX0JJVFMtU0FNUExFX0JJVFMtQklRVUFEX1NDQUxFLCBTQU1QTEVfQklUUyk7CisgIG91dHB1dCA9IChJTlRfUENNKVNBVFVSQVRFX1JJR0hUX1NISUZUKAorICAgICAgeSArIChGSVhQX0RCTCkoMSA8PCAoREZSQUNUX0JJVFMgLSBTQU1QTEVfQklUUyAtIEJJUVVBRF9TQ0FMRSAtIDEpKSwKKyAgICAgIERGUkFDVF9CSVRTIC0gU0FNUExFX0JJVFMgLSBCSVFVQURfU0NBTEUsIFNBTVBMRV9CSVRTKTsKKyAgLy8gb3V0cHV0ID0gKElOVF9QQ00pIFNBVFVSQVRFX1JJR0hUX1NISUZUKHksCisgIC8vIERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTLUJJUVVBRF9TQ0FMRSwgU0FNUExFX0JJVFMpOwogI2Vsc2UKICAgb3V0cHV0ID0gU0FUVVJBVEVfTEVGVF9TSElGVCh5LCBCSVFVQURfU0NBTEUsIFNBTVBMRV9CSVRTKTsKICNlbmRpZgogCi0KICAgcmV0dXJuIG91dHB1dDsKIH0KIAotCi0KLQogLyohCiAgIFxicmllZiAgIEZES2FhY0VuY19Eb3duc2FtcGxlIG51bUluU2FtcGxlcyBvZiB0eXBlIElOVF9QQ00KICAgICAgICAgICAgUmV0dXJucyBudW1iZXIgb2Ygb3V0cHV0IHNhbXBsZXMgaW4gbnVtT3V0U2FtcGxlcwpAQCAtNDgzLDI1ICs0MjMsMjIgQEAKICAgXHJldHVybiAgc3VjY2VzcyBvZiBvcGVyYXRpb24KICovCiAKLUlOVCBGREthYWNFbmNfRG93bnNhbXBsZShET1dOU0FNUExFUiAqRG93blNhbXBsZXIsICAvKiE8IHBvaW50ZXIgdG8gZG93bnNhbXBsZXIgaW5zdGFuY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICppblNhbXBsZXMsICAgICAgICAvKiE8IHBvaW50ZXIgdG8gaW5wdXQgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1JblNhbXBsZXMsICAgICAgICAgIC8qITwgbnVtYmVyICBvZiBpbnB1dCBzYW1wbGVzICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBpblN0cmlkZSwgICAgICAgICAgICAgIC8qITwgaW5jcmVtZW50IG9mIGlucHV0IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICpvdXRTYW1wbGVzLCAgICAgICAvKiE8IHBvaW50ZXIgdG8gb3V0cHV0IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKm51bU91dFNhbXBsZXMsICAgICAgICAvKiE8IHBvaW50ZXIgdHAgbnVtYmVyIG9mIG91dHB1dCBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG91dFN0cmlkZSAgICAgICAgICAgICAgLyohPCBpbmNyZW1lbnQgb2Ygb3V0cHV0IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgSU5UIGk7Ci0gICAgKm51bU91dFNhbXBsZXM9MDsKK0lOVCBGREthYWNFbmNfRG93bnNhbXBsZSgKKyAgICBET1dOU0FNUExFUiAqRG93blNhbXBsZXIsIC8qITwgcG9pbnRlciB0byBkb3duc2FtcGxlciBpbnN0YW5jZSAqLworICAgIElOVF9QQ00gKmluU2FtcGxlcywgICAgICAgLyohPCBwb2ludGVyIHRvIGlucHV0IHNhbXBsZXMgKi8KKyAgICBJTlQgbnVtSW5TYW1wbGVzLCAgICAgICAgIC8qITwgbnVtYmVyICBvZiBpbnB1dCBzYW1wbGVzICAqLworICAgIElOVF9QQ00gKm91dFNhbXBsZXMsICAgICAgLyohPCBwb2ludGVyIHRvIG91dHB1dCBzYW1wbGVzICovCisgICAgSU5UICpudW1PdXRTYW1wbGVzICAgICAgICAvKiE8IHBvaW50ZXIgdHAgbnVtYmVyIG9mIG91dHB1dCBzYW1wbGVzICovCispIHsKKyAgSU5UIGk7CisgICpudW1PdXRTYW1wbGVzID0gMDsKIAotICAgIGZvcihpPTA7IGk8bnVtSW5TYW1wbGVzOyBpKz1Eb3duU2FtcGxlci0+cmF0aW8pCi0gICAgewotICAgICAgKm91dFNhbXBsZXMgPSBBZHZhbmNlRmlsdGVyKCYoRG93blNhbXBsZXItPmRvd25GaWx0ZXIpLCAmaW5TYW1wbGVzW2kqaW5TdHJpZGVdLCBEb3duU2FtcGxlci0+cmF0aW8sIGluU3RyaWRlKTsKLSAgICAgIG91dFNhbXBsZXMgKz0gb3V0U3RyaWRlOwotICAgIH0KLSAgICAqbnVtT3V0U2FtcGxlcyA9IG51bUluU2FtcGxlcy9Eb3duU2FtcGxlci0+cmF0aW87CisgIGZvciAoaSA9IDA7IGkgPCBudW1JblNhbXBsZXM7IGkgKz0gRG93blNhbXBsZXItPnJhdGlvKSB7CisgICAgKm91dFNhbXBsZXMgPSBBZHZhbmNlRmlsdGVyKCYoRG93blNhbXBsZXItPmRvd25GaWx0ZXIpLCAmaW5TYW1wbGVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3duU2FtcGxlci0+cmF0aW8pOworICAgIG91dFNhbXBsZXMrKzsKKyAgfQorICAqbnVtT3V0U2FtcGxlcyA9IG51bUluU2FtcGxlcyAvIERvd25TYW1wbGVyLT5yYXRpbzsKIAotICAgIHJldHVybiAwOworICByZXR1cm4gMDsKIH0KLQpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9yZXNhbXBsZXIuaCBiL2xpYlNCUmVuYy9zcmMvcmVzYW1wbGVyLmgKaW5kZXggMDE5Mjk3MC4uN2FhMWNhZSAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9yZXNhbXBsZXIuaAorKysgYi9saWJTQlJlbmMvc3JjL3Jlc2FtcGxlci5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDczICs5MCw3MCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZm5kZWYgX19SRVNBTVBMRVJfSAotI2RlZmluZSBfX1JFU0FNUExFUl9ICisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFJFU0FNUExFUl9ICisjZGVmaW5lIFJFU0FNUExFUl9ICiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBGaXhlZCBQb2ludCBSZXNhbXBsZXIgVG9vbCBCb3ggIAorICBcYnJpZWYgIEZpeGVkIFBvaW50IFJlc2FtcGxlciBUb29sIEJveCAkUmV2aXNpb246IDkyNzkwICQKICovCiAKICNpbmNsdWRlICJjb21tb25fZml4LmgiCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgQklRVUFEIEZpbHRlciBTdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIE1BWE5SX1NFQ1RJT05TICAoMTUpCisjZGVmaW5lIE1BWE5SX1NFQ1RJT05TICgxNSkKIAotI2lmZGVmIFJTX0JJUVVBRF9TVEFURVMxNgotdHlwZWRlZiBGSVhQX1NHTCBGSVhQX0JRUzsKLSNlbHNlCiB0eXBlZGVmIEZJWFBfREJMIEZJWFBfQlFTOwotI2VuZGlmCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIEZJWFBfQlFTIHN0YXRlc1tNQVhOUl9TRUNUSU9OUysxXVsyXTsgICAvKiEgc3RhdGUgYnVmZmVyICovCi0gIGNvbnN0IEZJWFBfU0dMICpjb2VmZmE7ICAgICAgICAgICAgICAgLyohIHBvaW50ZXIgdG8gZmlsdGVyIGNvZWZmcyAqLwotICBGSVhQX0RCTCBnYWluOyAgICAgICAgICAgICAgICAgICAgICAgIC8qISBvdmVyYWxsIGdhaW4gZmFjdG9yICovCi0gIGludCBXYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohIG5vcm1hbGl6ZWQgY3V0b2ZmIGZyZXEgKiAxMDAwICovCi0gIGludCBub0NvZWZmczsgICAgICAgICAgICAgICAgICAgICAgICAgLyohIG51bWJlciBvZiBmaWx0ZXIgY29lZmZzIHNldHMgKi8KLSAgaW50IHB0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiEgaW5kZXggdG8gcmluYnVmZmVycyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBGSVhQX0JRUyBzdGF0ZXNbTUFYTlJfU0VDVElPTlMgKyAxXVsyXTsgLyohIHN0YXRlIGJ1ZmZlciAqLworICBjb25zdCBGSVhQX1NHTCAqY29lZmZhOyAgICAgICAgICAgICAgICAgLyohIHBvaW50ZXIgdG8gZmlsdGVyIGNvZWZmcyAqLworICBGSVhQX0RCTCBnYWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyohIG92ZXJhbGwgZ2FpbiBmYWN0b3IgKi8KKyAgaW50IFdjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qISBub3JtYWxpemVkIGN1dG9mZiBmcmVxICogMTAwMCAqLworICBpbnQgbm9Db2VmZnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohIG51bWJlciBvZiBmaWx0ZXIgY29lZmZzIHNldHMgKi8KKyAgaW50IHB0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qISBpbmRleCB0byByaW5idWZmZXJzICovCiB9IExQX0ZJTFRFUjsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgIERvd25zYW1wbGVyIFN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIExQX0ZJTFRFUiBkb3duRmlsdGVyOyAgICAgICAgICAgLyohIGZpbHRlciBpbnN0YW5jZSAqLwotICBpbnQgcmF0aW87ICAgICAgICAgICAgICAgICAgICAgIC8qISBkb3duc2FtcGxpbmcgcmF0aW9uICovCi0gIGludCBkZWxheTsgICAgICAgICAgICAgICAgICAgICAgLyohIGRvd25zYW1wbGluZyBkZWxheSAoc291cmNlIGZzKSAgICovCi0gIGludCBwZW5kaW5nOyAgICAgICAgICAgICAgICAgICAgLyohIG51bWJlciBvZiBwZW5kaW5nIG91dHB1dCBzYW1wbGVzICovCit0eXBlZGVmIHN0cnVjdCB7CisgIExQX0ZJTFRFUiBkb3duRmlsdGVyOyAvKiEgZmlsdGVyIGluc3RhbmNlICovCisgIGludCByYXRpbzsgICAgICAgICAgICAvKiEgZG93bnNhbXBsaW5nIHJhdGlvbiAqLworICBpbnQgZGVsYXk7ICAgICAgICAgICAgLyohIGRvd25zYW1wbGluZyBkZWxheSAoc291cmNlIGZzKSAgICovCisgIGludCBwZW5kaW5nOyAgICAgICAgICAvKiEgbnVtYmVyIG9mIHBlbmRpbmcgb3V0cHV0IHNhbXBsZXMgKi8KIH0gRE9XTlNBTVBMRVI7CiAKLQogLyoqCiAgKiBcYnJpZWYgSW5pdGlhbGl6ZWQgYSBnaXZlbiBkb3duc2FtcGxlciBzdHJ1Y3R1cmUuCiAgKi8KLUlOVCBGREthYWNFbmNfSW5pdERvd25zYW1wbGVyKERPV05TQU1QTEVSICpEb3duU2FtcGxlciwgLyohPCBwb2ludGVyIHRvIGRvd25zYW1wbGVyIGluc3RhbmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgV2MsICAgICAgICAgICAgICAgICAgIC8qITwgbm9ybWFsaXplZCBjdXRvZmYgZnJlcSAqIDEwMDAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCByYXRpbyk7ICAgICAgICAgICAgICAgLyohPCBkb3duc2FtcGxlciByYXRpbyAqLworSU5UIEZES2FhY0VuY19Jbml0RG93bnNhbXBsZXIoCisgICAgRE9XTlNBTVBMRVIgKkRvd25TYW1wbGVyLCAvKiE8IHBvaW50ZXIgdG8gZG93bnNhbXBsZXIgaW5zdGFuY2UgKi8KKyAgICBJTlQgV2MsICAgICAgICAgICAgICAgICAgIC8qITwgbm9ybWFsaXplZCBjdXRvZmYgZnJlcSAqIDEwMDAgKi8KKyAgICBJTlQgcmF0aW8pOyAgICAgICAgICAgICAgIC8qITwgZG93bnNhbXBsZXIgcmF0aW8gKi8KIAogLyoqCi0gKiBcYnJpZWYgRG93bnNhbXBsZSBhIHNldCBvZiBhdWRpbyBzYW1wbGVzLiBudW1JblNhbXBsZXMgbXVzdCBiZSBhdCBsZWFzdCBlcXVhbCB0byB0aGUKLSAqICAgICAgICBkb3duc2FtcGxlciByYXRpby4KKyAqIFxicmllZiBEb3duc2FtcGxlIGEgc2V0IG9mIGF1ZGlvIHNhbXBsZXMuIG51bUluU2FtcGxlcyBtdXN0IGJlIGF0IGxlYXN0IGVxdWFsCisgKiB0byB0aGUgZG93bnNhbXBsZXIgcmF0aW8uCiAgKi8KLUlOVCBGREthYWNFbmNfRG93bnNhbXBsZShET1dOU0FNUExFUiAqRG93blNhbXBsZXIsICAvKiE8IHBvaW50ZXIgdG8gZG93bnNhbXBsZXIgaW5zdGFuY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICppblNhbXBsZXMsICAgICAgICAvKiE8IHBvaW50ZXIgdG8gaW5wdXQgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1JblNhbXBsZXMsICAgICAgICAgIC8qITwgbnVtYmVyICBvZiBpbnB1dCBzYW1wbGVzICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBpblN0cmlkZSwgICAgICAgICAgICAgIC8qITwgaW5jcmVtZW50IG9mIGlucHV0IHNhbXBsZXMgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKm91dFNhbXBsZXMsICAgICAgIC8qITwgcG9pbnRlciB0byBvdXRwdXQgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbnVtT3V0U2FtcGxlcywgICAgICAgIC8qITwgcG9pbnRlciB0cCBudW1iZXIgb2Ygb3V0cHV0IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgb3V0c3RyaWRlKTsgICAgICAgICAgICAvKiE8IGluY3JlbWVudCBvZiBvdXRwdXQgc2FtcGxlcyAqLworSU5UIEZES2FhY0VuY19Eb3duc2FtcGxlKAorICAgIERPV05TQU1QTEVSICpEb3duU2FtcGxlciwgLyohPCBwb2ludGVyIHRvIGRvd25zYW1wbGVyIGluc3RhbmNlICovCisgICAgSU5UX1BDTSAqaW5TYW1wbGVzLCAgICAgICAvKiE8IHBvaW50ZXIgdG8gaW5wdXQgc2FtcGxlcyAqLworICAgIElOVCBudW1JblNhbXBsZXMsICAgICAgICAgLyohPCBudW1iZXIgIG9mIGlucHV0IHNhbXBsZXMgICovCisgICAgSU5UX1BDTSAqb3V0U2FtcGxlcywgICAgICAvKiE8IHBvaW50ZXIgdG8gb3V0cHV0IHNhbXBsZXMgKi8KKyAgICBJTlQgKm51bU91dFNhbXBsZXMpOyAgICAgIC8qITwgcG9pbnRlciB0cCBudW1iZXIgb2Ygb3V0cHV0IHNhbXBsZXMgKi8KIAotCi0KLSNlbmRpZiAvKiBfX1JFU0FNUExFUl9IICovCisjZW5kaWYgLyogUkVTQU1QTEVSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvc2JyLmggYi9saWJTQlJlbmMvc3JjL3Nici5oCmluZGV4IGM3NGFkMmEuLjM0MWRjYWIgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvc2JyLmgKKysrIGIvbGliU0JSZW5jL3NyYy9zYnIuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxNSArOTAsMjMgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBNYWluIFNCUiBzdHJ1Y3RzIGRlZmluaXRpb25zICAKKyAgXGJyaWVmICBNYWluIFNCUiBzdHJ1Y3RzIGRlZmluaXRpb25zICRSZXZpc2lvbjogOTI3OTAgJAogKi8KIAotI2lmbmRlZiBfX1NCUl9ICi0jZGVmaW5lIF9fU0JSX0gKKyNpZm5kZWYgU0JSX0gKKyNkZWZpbmUgU0JSX0gKIAogI2luY2x1ZGUgImZyYW1fZ2VuLmgiCiAjaW5jbHVkZSAiYml0X3Nici5oIgpAQCAtMTAxLDY2ICsxMjAsNzUgQEAKIAogI2luY2x1ZGUgInRvbl9jb3JyLmgiCiAKLQogLyogU0JSIGJpdHN0cmVhbSBkZWxheSAqLwotICAjZGVmaW5lIERFTEFZX0ZSQU1FUyAyCisjZGVmaW5lIE1BWF9ERUxBWV9GUkFNRVMgMgogCisvKiBzYnIgZW5jb2RlciBkb3duc2FtcGxpbmcgdHlwZSAqLwordHlwZWRlZiBlbnVtIHsgU0JSRU5DX0RTX05PTkUsIFNCUkVOQ19EU19USU1FLCBTQlJFTkNfRFNfUU1GIH0gU0JSRU5DX0RTX1RZUEU7CiAKIHR5cGVkZWYgc3RydWN0IFNCUl9DSEFOTkVMIHsKLSAgICBzdHJ1Y3QgRU5WX0NIQU5ORUwgICAgICAgIGhFbnZDaGFubmVsOwotICAgIC8vSU5UX1BDTSAgICAgICAgICAgICAgICAgICpwRFNPdXRCdWZmZXI7ICAgICAgICAgICAgLyoqPCBQb2ludGVyIHRvIGRvd25zYW1wbGVkIGF1ZGlvIG91dHB1dCBvZiBTQlIgZW5jb2RlciAqLwotICAgIERPV05TQU1QTEVSICAgICAgICAgICAgICAgZG93blNhbXBsZXI7CisgIHN0cnVjdCBFTlZfQ0hBTk5FTCBoRW52Q2hhbm5lbDsKKyAgLy8gSU5UX1BDTSAgICAgICAgICAgICAgICAgICpwRFNPdXRCdWZmZXI7ICAgICAgICAgICAgLyoqPCBQb2ludGVyIHRvCisgIC8vIGRvd25zYW1wbGVkIGF1ZGlvIG91dHB1dCBvZiBTQlIgZW5jb2RlciAqLworICBET1dOU0FNUExFUiBkb3duU2FtcGxlcjsKIAogfSBTQlJfQ0hBTk5FTDsKIHR5cGVkZWYgU0JSX0NIQU5ORUwqIEhBTkRMRV9TQlJfQ0hBTk5FTDsKIAogdHlwZWRlZiBzdHJ1Y3QgU0JSX0VMRU1FTlQgewotICAgIEhBTkRMRV9TQlJfQ0hBTk5FTCAgICAgICAgc2JyQ2hhbm5lbFsyXTsKLSAgICBRTUZfRklMVEVSX0JBTksgICAgICAgICAgKmhRbWZBbmFseXNpc1syXTsKLSAgICBTQlJfQ09ORklHX0RBVEEgICAgICAgICAgIHNickNvbmZpZ0RhdGE7Ci0gICAgU0JSX0hFQURFUl9EQVRBICAgICAgICAgICBzYnJIZWFkZXJEYXRhOwotICAgIFNCUl9CSVRTVFJFQU1fREFUQSAgICAgICAgc2JyQml0c3RyZWFtRGF0YTsKLSAgICBDT01NT05fREFUQSAgICAgICAgICAgICAgIENtb25EYXRhOwotICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgZHluWE92ZXJGcmVxRGVsYXlbNV07ICAgIC8qKjwgdG8gZGVsYXkgYSBmcmFtZSAoSSBkb24ndCBsaWtlIGl0IHRoYXQgbXVjaCB0aGF0IHdheSAtIGhyYykgKi8KLSAgICBTQlJfRUxFTUVOVF9JTkZPICAgICAgICAgIGVsSW5mbzsKKyAgSEFORExFX1NCUl9DSEFOTkVMIHNickNoYW5uZWxbMl07CisgIFFNRl9GSUxURVJfQkFOSyogaFFtZkFuYWx5c2lzWzJdOworICBTQlJfQ09ORklHX0RBVEEgc2JyQ29uZmlnRGF0YTsKKyAgU0JSX0hFQURFUl9EQVRBIHNickhlYWRlckRhdGE7CisgIFNCUl9CSVRTVFJFQU1fREFUQSBzYnJCaXRzdHJlYW1EYXRhOworICBDT01NT05fREFUQSBDbW9uRGF0YTsKKyAgSU5UIGR5blhPdmVyRnJlcURlbGF5WzVdOyAvKio8IHRvIGRlbGF5IGEgZnJhbWUgKEkgZG9uJ3QgbGlrZSBpdCB0aGF0IG11Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdheSAtIGhyYykgKi8KKyAgU0JSX0VMRU1FTlRfSU5GTyBlbEluZm87CiAKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgIHBheWxvYWREZWxheUxpbmVbMStERUxBWV9GUkFNRVNdW01BWF9QQVlMT0FEX1NJWkVdOwotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZERlbGF5TGluZVNpemVbMStERUxBWV9GUkFNRVNdOyAgICAgICAgICAgICAgICAgLyogU2l6ZXMgaW4gYml0cyAqLworICBVQ0hBUiBwYXlsb2FkRGVsYXlMaW5lWzEgKyBNQVhfREVMQVlfRlJBTUVTXVtNQVhfUEFZTE9BRF9TSVpFXTsKKyAgVUlOVCBwYXlsb2FkRGVsYXlMaW5lU2l6ZVsxICsgTUFYX0RFTEFZX0ZSQU1FU107IC8qIFNpemVzIGluIGJpdHMgKi8KIAogfSBTQlJfRUxFTUVOVCwgKkhBTkRMRV9TQlJfRUxFTUVOVDsKIAotdHlwZWRlZiBzdHJ1Y3QgU0JSX0VOQ09ERVIKLXsKLSAgSEFORExFX1NCUl9FTEVNRU5UICAgc2JyRWxlbWVudFsoOCldOwotICBIQU5ETEVfU0JSX0NIQU5ORUwgICBwU2JyQ2hhbm5lbFsoOCldOwotICBRTUZfRklMVEVSX0JBTksgICAgICBRbWZBbmFseXNpc1soOCldOwotICBET1dOU0FNUExFUiAgICAgICAgICBsZmVEb3duU2FtcGxlcjsKLSAgaW50ICAgICAgICAgICAgICAgICAgbGZlQ2hJZHg7ICAgICAgICAgICAgICAgICAvKiAtMSBkZWZhdWx0IGZvciBubyBsZmUsIGVsc2UgYXNzaWduIGNoYW5uZWwgaW5kZXggKi8KLSAgaW50ICAgICAgICAgICAgICAgICAgbm9FbGVtZW50czsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZWxlbWVudHMgKi8KLSAgaW50ICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzOyAgICAgICAgICAgICAgICAvKiBUb3RhbCBjaGFubmVsIGNvdW50IGFjcm9zcyBhbGwgZWxlbWVudHMuICovCi0gIGludCAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZTsgICAgICAgICAgICAgICAgLyogU0JSIGZyYW1lbGVuZ3RoLiAqLwotICBpbnQgICAgICAgICAgICAgICAgICBidWZmZXJPZmZzZXQ7ICAgICAgICAgICAgIC8qIE9mZnNldCBmb3IgU0JSIHBhcmFtZXRlciBleHRyYWN0aW9uIGluIHRpbWUgZG9tYWluIGlucHV0IGJ1ZmZlci4gKi8KLSAgaW50ICAgICAgICAgICAgICAgICAgZG93bnNhbXBsZWRPZmZzZXQ7ICAgICAgICAvKiBPZmZzZXQgb2YgZG93bnNhbXBsZWQvbWl4ZWQgb3V0cHV0IGZvciBjb3JlIGVuY29kZXIuICovCi0gIGludCAgICAgICAgICAgICAgICAgIGRvd25taXhTaXplOyAgICAgICAgICAgICAgLyogU2l6ZSBpbiBzYW1wbGVzIG9mIGRvd25zYW1wbGVkL21peGVkIG91dHB1dCBmb3IgY29yZSBlbmNvZGVyLiAqLwotICBJTlQgICAgICAgICAgICAgICAgICBkb3duU2FtcGxlRmFjdG9yOyAgICAgICAgIC8qIFNhbXBsaW5nIHJhdGUgcmVsYXRpb24gYmV0d2VlbiB0aGUgU0JSIGFuZCB0aGUgY29yZSBlbmNvZGVyLiAqLwotICBpbnQgICAgICAgICAgICAgICAgICBmVGltZURvbWFpbkRvd25zYW1wbGluZzsgIC8qIEZsYWcgc2lnbmFsbGluZyB0aW1lIGRvbWFpbiBkb3duc2FtcGxpbmcgaW5zdGVhZCBvZiBRTUYgZG93bnNhbXBsaW5nLiAqLwotICBpbnQgICAgICAgICAgICAgICAgICBuQml0c3RyRGVsYXk7ICAgICAgICAgICAgIC8qIEFtb3VudCBvZiBTQlIgZnJhbWVzIHRvIGJlIGRlbGF5ZWQgaW4gYml0c3RyZWFtIGRvbWFpbi4gKi8KLSAgSU5UICAgICAgICAgICAgICAgICAgZXN0aW1hdGVCaXRyYXRlOyAgICAgICAgICAvKiBlc3RpbWF0ZSBiaXRyYXRlIG9mIFNCUiBlbmNvZGVyICovCi0gIElOVCAgICAgICAgICAgICAgICAgIGlucHV0RGF0YURlbGF5OyAgICAgICAgICAgLyogZGVsYXkgY2F1c2VkIGJ5IGRvd25zYW1wbGVyLCBpbi9vdXQgYnVmZmVyIGF0IHNickVuY29kZXJfRW5jb2RlRnJhbWUgKi8KK3R5cGVkZWYgc3RydWN0IFNCUl9FTkNPREVSIHsKKyAgSEFORExFX1NCUl9FTEVNRU5UIHNickVsZW1lbnRbKDgpXTsKKyAgSEFORExFX1NCUl9DSEFOTkVMIHBTYnJDaGFubmVsWyg4KV07CisgIFFNRl9GSUxURVJfQkFOSyBRbWZBbmFseXNpc1soOCldOworICBET1dOU0FNUExFUiBsZmVEb3duU2FtcGxlcjsKKyAgaW50IGxmZUNoSWR4OyAgICAgLyogLTEgZGVmYXVsdCBmb3Igbm8gbGZlLCBlbHNlIGFzc2lnbiBjaGFubmVsIGluZGV4LiAqLworICBpbnQgbm9FbGVtZW50czsgICAvKiBOdW1iZXIgb2YgZWxlbWVudHMuICovCisgIGludCBuQ2hhbm5lbHM7ICAgIC8qIFRvdGFsIGNoYW5uZWwgY291bnQgYWNyb3NzIGFsbCBlbGVtZW50cy4gKi8KKyAgaW50IGZyYW1lU2l6ZTsgICAgLyogU0JSIGZyYW1lbGVuZ3RoLiAqLworICBpbnQgYnVmZmVyT2Zmc2V0OyAvKiBPZmZzZXQgZm9yIFNCUiBwYXJhbWV0ZXIgZXh0cmFjdGlvbiBpbiB0aW1lIGRvbWFpbiBpbnB1dAorICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuICovCisgIGludCBkb3duc2FtcGxlZE9mZnNldDsgLyogT2Zmc2V0IG9mIGRvd25zYW1wbGVkL21peGVkIG91dHB1dCBmb3IgY29yZSBlbmNvZGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgZG93bm1peFNpemU7ICAgICAgIC8qIFNpemUgaW4gc2FtcGxlcyBvZiBkb3duc2FtcGxlZC9taXhlZCBvdXRwdXQgZm9yIGNvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLiAqLworICBJTlQgZG93blNhbXBsZUZhY3RvcjsgIC8qIFNhbXBsaW5nIHJhdGUgcmVsYXRpb24gYmV0d2VlbiB0aGUgU0JSIGFuZCB0aGUgY29yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIuICovCisgIFNCUkVOQ19EU19UWVBFCisgIGRvd25zYW1wbGluZ01ldGhvZDsgLyogTWV0aG9kIG9mIGRvd25zbWFwbGluZywgdGltZS1kb21haW4sIFFNRiBvciBub25lLgorICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgbkJpdHN0ckRlbGF5OyAgIC8qIEFtb3VudCBvZiBTQlIgZnJhbWVzIHRvIGJlIGRlbGF5ZWQgaW4gYml0c3RyZWFtIGRvbWFpbi4KKyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IHNickRlY0RlbGF5OyAgICAvKiBTQlIgZGVjb2RlciBkZWxheSBpbiBzYW1wbGVzICovCisgIElOVCBlc3RpbWF0ZUJpdHJhdGU7IC8qIEVzdGltYXRlIGJpdHJhdGUgb2YgU0JSIGVuY29kZXIuICovCisgIElOVCBpbnB1dERhdGFEZWxheTsgIC8qIERlbGF5IGNhdXNlZCBieSBkb3duc2FtcGxlciwgaW4vb3V0IGJ1ZmZlciBhdAorICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbmNvZGVyX0VuY29kZUZyYW1lLiAqLwogCiAgIFVDSEFSKiBkeW5hbWljUmFtOwogICBVQ0hBUiogcFNCUmR5bmFtaWNfUkFNOwogCi0gIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyAgaFBhcmFtZXRyaWNTdGVyZW87Ci0gIFFNRl9GSUxURVJfQkFOSyAgICAgICAgICAgcW1mU3ludGhlc2lzUFM7CisgIEhBTkRMRV9QQVJBTUVUUklDX1NURVJFTyBoUGFyYW1ldHJpY1N0ZXJlbzsKKyAgUU1GX0ZJTFRFUl9CQU5LIHFtZlN5bnRoZXNpc1BTOwogCiAgIC8qIHBhcmFtZXRlcnMgZGVzY3JpYmluZyBhbGxvY2F0aW9uIHZvbHVtZSBvZiBwcmVzZW50IGluc3RhbmNlICovCi0gIElOVCAgICAgICAgICAgICAgICAgIG1heEVsZW1lbnRzOwotICBJTlQgICAgICAgICAgICAgICAgICBtYXhDaGFubmVsczsKLSAgSU5UICAgICAgICAgICAgICAgICAgc3VwcG9ydFBTOwotCisgIElOVCBtYXhFbGVtZW50czsKKyAgSU5UIG1heENoYW5uZWxzOworICBJTlQgc3VwcG9ydFBTOwogCiB9IFNCUl9FTkNPREVSOwogCi0KLSNlbmRpZiAvKiBfX1NCUl9IICovCisjZW5kaWYgLyogU0JSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvc2JyX2RlZi5oIGIvbGliU0JSZW5jL3NyYy9zYnJfZGVmLmgKaW5kZXggODVhYzU4Ny4uNTNlYmE3MSAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9zYnJfZGVmLmgKKysrIGIvbGliU0JSZW5jL3NyYy9zYnJfZGVmLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMjEgKzkwLDI4IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgU0JSIG1haW4gZGVmaW5pdGlvbnMgIAorICBcYnJpZWYgIFNCUiBtYWluIGRlZmluaXRpb25zICRSZXZpc2lvbjogOTI3OTAgJAogKi8KLSNpZm5kZWYgX19TQlJfREVGX0gKLSNkZWZpbmUgX19TQlJfREVGX0gKKyNpZm5kZWYgU0JSX0RFRl9ICisjZGVmaW5lIFNCUl9ERUZfSAogCiAjaW5jbHVkZSAiY29tbW9uX2ZpeC5oIgogCiAjZGVmaW5lIG5vRXJyb3IgMAogI2RlZmluZSBIQU5ETEVfRVJST1JfSU5GTyBJTlQKLSNkZWZpbmUgRVJST1IoYSxiKSAxCi0jZGVmaW5lIGhhbmRCYWNrCisjZGVmaW5lIEVSUk9SKGEsIGIpIDEKIAogLyogI2RlZmluZSBTQlJfRU5WX1NUQVRJU1RJQ1NfQklUUkFURSAqLwogI3VuZGVmIFNCUl9FTlZfU1RBVElTVElDU19CSVRSQVRFCkBAIC0xMDQsMTcyICsxMjIsMTU1IEBACiAvKiAjZGVmaW5lIFNCUl9QQVlMT0FEX01PTklUT1IgKi8KICN1bmRlZiBTQlJfUEFZTE9BRF9NT05JVE9SCiAKLSNkZWZpbmUgU1dBUChhLGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXByPWEsIGE9YiwgYj10ZW1wcgotI2RlZmluZSBUUlVFICAxCisjZGVmaW5lIFNXQVAoYSwgYikgdGVtcHIgPSBhLCBhID0gYiwgYiA9IHRlbXByCisjZGVmaW5lIFRSVUUgMQogI2RlZmluZSBGQUxTRSAwCiAKLQogLyogQ29uc3RhbnRzICovCi0jZGVmaW5lIEVQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxZS0xMgotI2RlZmluZSBMT0cyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC42OTMxNDcxODA1NmYgIC8qIG5hdHVyYWwgbG9nYXJpdGhtIG9mIDIgKi8KLSNkZWZpbmUgSUxPRzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDQyNjk1MDQxZiAgICAvKiAxL0xPRzIgKi8KLSNkZWZpbmUgUkVMQVhBVElPTl9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICgxZS02ZikKLSNkZWZpbmUgUkVMQVhBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGTDJGWENPTlNUX0RCTChSRUxBWEFUSU9OX0ZMT0FUKSkKLSNkZWZpbmUgUkVMQVhBVElPTl9GUkFDVCAgICAgICAgICAgICAgICAgICAgICAgIChGTDJGWENPTlNUX0RCTCgwLjUyNDI4OGYpKSAgICAgLyogMC41MjQyODhmIGlzIGZyYWN0aW9uYWwgcGFydCBvZiBSRUxBWEFUSU9OICovCi0jZGVmaW5lIFJFTEFYQVRJT05fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAoMTkpCi0jZGVmaW5lIFJFTEFYQVRJT05fTEQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAoRkwyRlhDT05TVF9EQkwoMC4zMTE0MzA3NTg4OWYpKS8qIChsZDY0KFJFTEFYQVRJT04pICovCisjZGVmaW5lIEVQUyAxZS0xMgorI2RlZmluZSBMT0cyIDAuNjkzMTQ3MTgwNTZmIC8qIG5hdHVyYWwgbG9nYXJpdGhtIG9mIDIgKi8KKyNkZWZpbmUgSUxPRzIgMS40NDI2OTUwNDFmICAvKiAxL0xPRzIgKi8KKyNkZWZpbmUgUkVMQVhBVElPTl9GTE9BVCAoMWUtNmYpCisjZGVmaW5lIFJFTEFYQVRJT04gKEZMMkZYQ09OU1RfREJMKFJFTEFYQVRJT05fRkxPQVQpKQorI2RlZmluZSBSRUxBWEFUSU9OX0ZSQUNUIFwKKyAgKEZMMkZYQ09OU1RfREJMKDAuNTI0Mjg4ZikpIC8qIDAuNTI0Mjg4ZiBpcyBmcmFjdGlvbmFsIHBhcnQgb2YgUkVMQVhBVElPTiAqLworI2RlZmluZSBSRUxBWEFUSU9OX1NISUZUICgxOSkKKyNkZWZpbmUgUkVMQVhBVElPTl9MRDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoRkwyRlhDT05TVF9EQkwoMC4zMTE0MzA3NTg4OWYpKSAvKiAobGQ2NChSRUxBWEFUSU9OKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCiAvKioqKioqKioqKioqICBEZWZpbml0aW9ucyAqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFNCUl9DT01QX01PREVfREVMVEEgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFNCUl9DT01QX01PREVfQ1RTICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNCUl9NQVhfRU5FUkdZX1ZBTFVFUyAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIFNCUl9HTE9CQUxfVE9OQUxJVFlfVkFMVUVTICAgICAgICAgICAgICAyCisjZGVmaW5lIFNCUl9DT01QX01PREVfREVMVEEgMAorI2RlZmluZSBTQlJfQ09NUF9NT0RFX0NUUyAxCisjZGVmaW5lIFNCUl9NQVhfRU5FUkdZX1ZBTFVFUyA1CisjZGVmaW5lIFNCUl9HTE9CQUxfVE9OQUxJVFlfVkFMVUVTIDIKIAotI2RlZmluZSBNQVhfTlVNX0NIQU5ORUxTICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfTlVNX0NIQU5ORUxTIDIKIAotI2RlZmluZSBNQVhfTk9JU0VfRU5WRUxPUEVTICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBNQVhfTlVNX05PSVNFX0NPRUZGUyAgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBNQVhfTlVNX05PSVNFX1ZBTFVFUyAgICAgICAgICAgICAgICAgICAgKE1BWF9OVU1fTk9JU0VfQ09FRkZTKk1BWF9OT0lTRV9FTlZFTE9QRVMpCisjZGVmaW5lIE1BWF9OT0lTRV9FTlZFTE9QRVMgMgorI2RlZmluZSBNQVhfTlVNX05PSVNFX0NPRUZGUyA1CisjZGVmaW5lIE1BWF9OVU1fTk9JU0VfVkFMVUVTIChNQVhfTlVNX05PSVNFX0NPRUZGUyAqIE1BWF9OT0lTRV9FTlZFTE9QRVMpCiAKLSNkZWZpbmUgTUFYX05VTV9FTlZFTE9QRV9WQUxVRVMgICAgICAgICAgICAgICAgIChNQVhfRU5WRUxPUEVTICogTUFYX0ZSRVFfQ09FRkZTKQotI2RlZmluZSBNQVhfRU5WRUxPUEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBNQVhfRlJFUV9DT0VGRlMgICAgICAgICAgICAgICAgICAgICAgICAgNDgKKyNkZWZpbmUgTUFYX05VTV9FTlZFTE9QRV9WQUxVRVMgKE1BWF9FTlZFTE9QRVMgKiBNQVhfRlJFUV9DT0VGRlMpCisjZGVmaW5lIE1BWF9FTlZFTE9QRVMgNQorI2RlZmluZSBNQVhfRlJFUV9DT0VGRlMgNDgKIAotI2RlZmluZSBNQVhfRlJFUV9DT0VGRlNfRlM0NDEwMCAgICAgICAgICAgICAgICAgMzUKLSNkZWZpbmUgTUFYX0ZSRVFfQ09FRkZTX0ZTNDgwMDAgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIE1BWF9GUkVRX0NPRUZGU19GUzQ0MTAwIDM1CisjZGVmaW5lIE1BWF9GUkVRX0NPRUZGU19GUzQ4MDAwIDMyCiAKKyNkZWZpbmUgTk9fT0ZfRVNUSU1BVEVTX0xDIDQKKyNkZWZpbmUgTk9fT0ZfRVNUSU1BVEVTX0xEIDMKKyNkZWZpbmUgTUFYX05PX09GX0VTVElNQVRFUyA0CiAKLSNkZWZpbmUgUU1GX0NIQU5ORUxTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0Ci0jZGVmaW5lIFFNRl9GSUxURVJfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgIDY0MAotI2RlZmluZSBRTUZfTUFYX1RJTUVfU0xPVFMgICAgICAgICAgICAgICAgICAgICAgMzIKLSNkZWZpbmUgTk9fT0ZfRVNUSU1BVEVTX0xDICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgTk9fT0ZfRVNUSU1BVEVTX0xEICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgTUFYX05PX09GX0VTVElNQVRFUyAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTk9JU0VfRkxPT1JfT0ZGU0VUIDYKKyNkZWZpbmUgTk9JU0VfRkxPT1JfT0ZGU0VUXzY0IChGTDJGWENPTlNUX0RCTCgwLjA5Mzc1ZikpCiAKKyNkZWZpbmUgTE9XX1JFUyAwCisjZGVmaW5lIEhJR0hfUkVTIDEKIAotI2RlZmluZSBOT0lTRV9GTE9PUl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBOT0lTRV9GTE9PUl9PRkZTRVRfNjQgICAgICAgICAgICAgICAgICAgKEZMMkZYQ09OU1RfREJMKDAuMDkzNzVmKSkKKyNkZWZpbmUgTE8gMAorI2RlZmluZSBISSAxCiAKLSNkZWZpbmUgTE9XX1JFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgSElHSF9SRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTEVOR1RIX1NCUl9GUkFNRV9JTkZPIDM1IC8qIDE5ICovCiAKLSNkZWZpbmUgTE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgSEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0JSX05TRkJfTE9XX1JFUyA5ICAgLyogIDggKi8KKyNkZWZpbmUgU0JSX05TRkJfSElHSF9SRVMgMTggLyogMTYgKi8KIAotI2RlZmluZSBMRU5HVEhfU0JSX0ZSQU1FX0lORk8gICAgICAgICAgICAgICAgICAgMzUgICAgICAvKiAxOSAqLworI2RlZmluZSBTQlJfWFBPU19DVFJMX0RFRkFVTFQgMgogCi0jZGVmaW5lIFNCUl9OU0ZCX0xPV19SRVMgICAgICAgICAgICAgICAgICAgICAgICA5ICAgICAgIC8qICA4ICovCi0jZGVmaW5lIFNCUl9OU0ZCX0hJR0hfUkVTICAgICAgICAgICAgICAgICAgICAgICAxOCAgICAgIC8qIDE2ICovCisjZGVmaW5lIFNCUl9GUkVRX1NDQUxFX0RFRkFVTFQgMgorI2RlZmluZSBTQlJfQUxURVJfU0NBTEVfREVGQVVMVCAxCisjZGVmaW5lIFNCUl9OT0lTRV9CQU5EU19ERUZBVUxUIDIKIAotCi0jZGVmaW5lIFNCUl9YUE9TX0NUUkxfREVGQVVMVCAgICAgICAgICAgICAgICAgICAyCi0KLSNkZWZpbmUgU0JSX0ZSRVFfU0NBTEVfREVGQVVMVCAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgU0JSX0FMVEVSX1NDQUxFX0RFRkFVTFQgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU0JSX05PSVNFX0JBTkRTX0RFRkFVTFQgICAgICAgICAgICAgICAgIDIKLQotI2RlZmluZSBTQlJfTElNSVRFUl9CQU5EU19ERUZBVUxUICAgICAgICAgICAgICAgMgotI2RlZmluZSBTQlJfTElNSVRFUl9HQUlOU19ERUZBVUxUICAgICAgICAgICAgICAgMgotI2RlZmluZSBTQlJfTElNSVRFUl9HQUlOU19JTkZJTklURSAgICAgICAgICAgICAgMwotI2RlZmluZSBTQlJfSU5URVJQT0xfRlJFUV9ERUZBVUxUICAgICAgICAgICAgICAgMQotI2RlZmluZSBTQlJfU01PT1RISU5HX0xFTkdUSF9ERUZBVUxUICAgICAgICAgICAgMAotCisjZGVmaW5lIFNCUl9MSU1JVEVSX0JBTkRTX0RFRkFVTFQgMgorI2RlZmluZSBTQlJfTElNSVRFUl9HQUlOU19ERUZBVUxUIDIKKyNkZWZpbmUgU0JSX0xJTUlURVJfR0FJTlNfSU5GSU5JVEUgMworI2RlZmluZSBTQlJfSU5URVJQT0xfRlJFUV9ERUZBVUxUIDEKKyNkZWZpbmUgU0JSX1NNT09USElOR19MRU5HVEhfREVGQVVMVCAwCiAKIC8qIHNicl9oZWFkZXIgKi8KLSNkZWZpbmUgU0lfU0JSX0FNUF9SRVNfQklUUyAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU0lfU0JSX0NPVVBMSU5HX0JJVFMgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU0lfU0JSX1NUQVJUX0ZSRVFfQklUUyAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgU0lfU0JSX1NUT1BfRlJFUV9CSVRTICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgU0lfU0JSX1hPVkVSX0JBTkRfQklUUyAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgU0lfU0JSX1JFU0VSVkVEX0JJVFMgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgU0lfU0JSX0RBVEFfRVhUUkFfQklUUyAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU0lfU0JSX0hFQURFUl9FWFRSQV8xX0JJVFMgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU0lfU0JSX0hFQURFUl9FWFRSQV8yX0JJVFMgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0lfU0JSX0FNUF9SRVNfQklUUyAxCisjZGVmaW5lIFNJX1NCUl9DT1VQTElOR19CSVRTIDEKKyNkZWZpbmUgU0lfU0JSX1NUQVJUX0ZSRVFfQklUUyA0CisjZGVmaW5lIFNJX1NCUl9TVE9QX0ZSRVFfQklUUyA0CisjZGVmaW5lIFNJX1NCUl9YT1ZFUl9CQU5EX0JJVFMgMworI2RlZmluZSBTSV9TQlJfUkVTRVJWRURfQklUUyAyCisjZGVmaW5lIFNJX1NCUl9EQVRBX0VYVFJBX0JJVFMgMQorI2RlZmluZSBTSV9TQlJfSEVBREVSX0VYVFJBXzFfQklUUyAxCisjZGVmaW5lIFNJX1NCUl9IRUFERVJfRVhUUkFfMl9CSVRTIDEKIAogLyogc2JyX2hlYWRlciBleHRyYSAxICovCi0jZGVmaW5lIFNJX1NCUl9GUkVRX1NDQUxFX0JJVFMgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFNJX1NCUl9BTFRFUl9TQ0FMRV9CSVRTICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNJX1NCUl9OT0lTRV9CQU5EU19CSVRTICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFNJX1NCUl9GUkVRX1NDQUxFX0JJVFMgMgorI2RlZmluZSBTSV9TQlJfQUxURVJfU0NBTEVfQklUUyAxCisjZGVmaW5lIFNJX1NCUl9OT0lTRV9CQU5EU19CSVRTIDIKIAogLyogc2JyX2hlYWRlciBleHRyYSAyICovCi0jZGVmaW5lIFNJX1NCUl9MSU1JVEVSX0JBTkRTX0JJVFMgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFNJX1NCUl9MSU1JVEVSX0dBSU5TX0JJVFMgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFNJX1NCUl9JTlRFUlBPTF9GUkVRX0JJVFMgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNJX1NCUl9TTU9PVEhJTkdfTEVOR1RIX0JJVFMgICAgICAgICAgICAxCisjZGVmaW5lIFNJX1NCUl9MSU1JVEVSX0JBTkRTX0JJVFMgMgorI2RlZmluZSBTSV9TQlJfTElNSVRFUl9HQUlOU19CSVRTIDIKKyNkZWZpbmUgU0lfU0JSX0lOVEVSUE9MX0ZSRVFfQklUUyAxCisjZGVmaW5lIFNJX1NCUl9TTU9PVEhJTkdfTEVOR1RIX0JJVFMgMQogCiAvKiBzYnJfZ3JpZCAqLwotI2RlZmluZSBTQlJfQ0xBX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgIC8qITwgc2l6ZSBvZiBic19mcmFtZV9jbGFzcyAqLwotI2RlZmluZSBTQlJfQ0xBX0JJVFNfTEQgICAgICAgICAgICAgICAgICAgICAgICAgMSAgIC8qITwgc2l6ZSBvZiBic19mcmFtZV9jbGFzcyAqLwotI2RlZmluZSBTQlJfRU5WX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgIC8qITwgc2l6ZSBvZiBic19udW1fZW52X3JhdyAqLwotI2RlZmluZSBTQlJfQUJTX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgIC8qITwgc2l6ZSBvZiBic19hYnNfYm9yZF9yYXcgZm9yIEhFLUFBQyAqLwotI2RlZmluZSBTQlJfTlVNX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgIC8qITwgc2l6ZSBvZiBic19udW1fcmVsICovCi0jZGVmaW5lIFNCUl9SRUxfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgLyohPCBzaXplIG9mIGJzX3JlbF9ib3JkX3JhdyAqLwotI2RlZmluZSBTQlJfUkVTX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgIC8qITwgc2l6ZSBvZiBic19mcmVxX3Jlc19mbGFnICovCi0jZGVmaW5lIFNCUl9ESVJfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgLyohPCBzaXplIG9mIGJzX2RmX2ZsYWcgKi8KLQorI2RlZmluZSBTQlJfQ0xBX0JJVFMgMiAgICAvKiE8IHNpemUgb2YgYnNfZnJhbWVfY2xhc3MgKi8KKyNkZWZpbmUgU0JSX0NMQV9CSVRTX0xEIDEgLyohPCBzaXplIG9mIGJzX2ZyYW1lX2NsYXNzICovCisjZGVmaW5lIFNCUl9FTlZfQklUUyAyICAgIC8qITwgc2l6ZSBvZiBic19udW1fZW52X3JhdyAqLworI2RlZmluZSBTQlJfQUJTX0JJVFMgMiAgICAvKiE8IHNpemUgb2YgYnNfYWJzX2JvcmRfcmF3IGZvciBIRS1BQUMgKi8KKyNkZWZpbmUgU0JSX05VTV9CSVRTIDIgICAgLyohPCBzaXplIG9mIGJzX251bV9yZWwgKi8KKyNkZWZpbmUgU0JSX1JFTF9CSVRTIDIgICAgLyohPCBzaXplIG9mIGJzX3JlbF9ib3JkX3JhdyAqLworI2RlZmluZSBTQlJfUkVTX0JJVFMgMSAgICAvKiE8IHNpemUgb2YgYnNfZnJlcV9yZXNfZmxhZyAqLworI2RlZmluZSBTQlJfRElSX0JJVFMgMSAgICAvKiE8IHNpemUgb2YgYnNfZGZfZmxhZyAqLwogCiAvKiBzYnJfZGF0YSAqLwotI2RlZmluZSBTSV9TQlJfSU5WRl9NT0RFX0JJVFMgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBTSV9TQlJfSU5WRl9NT0RFX0JJVFMgMgogCi0KLSNkZWZpbmUgU0lfU0JSX1NUQVJUX0VOVl9CSVRTX0FNUF9SRVNfM18wICAgICAgICAgICA2Ci0jZGVmaW5lIFNJX1NCUl9TVEFSVF9FTlZfQklUU19CQUxBTkNFX0FNUF9SRVNfM18wICAgNQotI2RlZmluZSBTSV9TQlJfU1RBUlRfTk9JU0VfQklUU19BTVBfUkVTXzNfMCAgICAgICAgIDUKKyNkZWZpbmUgU0lfU0JSX1NUQVJUX0VOVl9CSVRTX0FNUF9SRVNfM18wIDYKKyNkZWZpbmUgU0lfU0JSX1NUQVJUX0VOVl9CSVRTX0JBTEFOQ0VfQU1QX1JFU18zXzAgNQorI2RlZmluZSBTSV9TQlJfU1RBUlRfTk9JU0VfQklUU19BTVBfUkVTXzNfMCA1CiAjZGVmaW5lIFNJX1NCUl9TVEFSVF9OT0lTRV9CSVRTX0JBTEFOQ0VfQU1QX1JFU18zXzAgNQogCi0jZGVmaW5lIFNJX1NCUl9TVEFSVF9FTlZfQklUU19BTVBfUkVTXzFfNSAgICAgICAgICAgNwotI2RlZmluZSBTSV9TQlJfU1RBUlRfRU5WX0JJVFNfQkFMQU5DRV9BTVBfUkVTXzFfNSAgIDYKKyNkZWZpbmUgU0lfU0JSX1NUQVJUX0VOVl9CSVRTX0FNUF9SRVNfMV81IDcKKyNkZWZpbmUgU0lfU0JSX1NUQVJUX0VOVl9CSVRTX0JBTEFOQ0VfQU1QX1JFU18xXzUgNgogCisjZGVmaW5lIFNJX1NCUl9FWFRFTkRFRF9EQVRBX0JJVFMgMQorI2RlZmluZSBTSV9TQlJfRVhURU5TSU9OX1NJWkVfQklUUyA0CisjZGVmaW5lIFNJX1NCUl9FWFRFTlNJT05fRVNDX0NPVU5UX0JJVFMgOAorI2RlZmluZSBTSV9TQlJfRVhURU5TSU9OX0lEX0JJVFMgMgogCi0jZGVmaW5lIFNJX1NCUl9FWFRFTkRFRF9EQVRBX0JJVFMgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNJX1NCUl9FWFRFTlNJT05fU0laRV9CSVRTICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFNJX1NCUl9FWFRFTlNJT05fRVNDX0NPVU5UX0JJVFMgICAgICAgICA4Ci0jZGVmaW5lIFNJX1NCUl9FWFRFTlNJT05fSURfQklUUyAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFNCUl9FWFRFTkRFRF9EQVRBX01BWF9DTlQgKDE1ICsgMjU1KQogCi0jZGVmaW5lIFNCUl9FWFRFTkRFRF9EQVRBX01BWF9DTlQgICAgICAgICAgICAgICAoMTUrMjU1KQotCi0jZGVmaW5lIEVYVEVOU0lPTl9JRF9QU19DT0RJTkcgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEVYVEVOU0lPTl9JRF9QU19DT0RJTkcgMgogCiAvKiBFbnZlbG9wZSBjb2RpbmcgY29uc3RhbnRzICovCi0jZGVmaW5lIEZSRVEgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBUSU1FICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRlJFUSAwCisjZGVmaW5lIFRJTUUgMQogCiAvKiBxbWYgZGF0YSBzY2FsaW5nICovCi0jZGVmaW5lIFFNRl9TQ0FMRV9PRkZTRVQgICAgICAgICAgNworI2RlZmluZSBRTUZfU0NBTEVfT0ZGU0VUIDcKIAogLyogaHVmZm1hbiB0YWJsZXMgKi8KLSNkZWZpbmUgQ09ERV9CT09LX1NDRl9MQVYwMCAgICAgICAgIDYwCi0jZGVmaW5lIENPREVfQk9PS19TQ0ZfTEFWMDEgICAgICAgICAzMQotI2RlZmluZSBDT0RFX0JPT0tfU0NGX0xBVjEwICAgICAgICAgNjAKLSNkZWZpbmUgQ09ERV9CT09LX1NDRl9MQVYxMSAgICAgICAgIDMxCisjZGVmaW5lIENPREVfQk9PS19TQ0ZfTEFWMDAgNjAKKyNkZWZpbmUgQ09ERV9CT09LX1NDRl9MQVYwMSAzMQorI2RlZmluZSBDT0RFX0JPT0tfU0NGX0xBVjEwIDYwCisjZGVmaW5lIENPREVfQk9PS19TQ0ZfTEFWMTEgMzEKICNkZWZpbmUgQ09ERV9CT09LX1NDRl9MQVZfQkFMQU5DRTExIDEyCiAjZGVmaW5lIENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMCAyNAogCi10eXBlZGVmIGVudW0KLXsKLSAgU0JSX0FNUF9SRVNfMV81PTAsCi0gIFNCUl9BTVBfUkVTXzNfMAotfQotQU1QX1JFUzsKK3R5cGVkZWYgZW51bSB7IFNCUl9BTVBfUkVTXzFfNSA9IDAsIFNCUl9BTVBfUkVTXzNfMCB9IEFNUF9SRVM7CiAKLXR5cGVkZWYgZW51bQotewordHlwZWRlZiBlbnVtIHsKICAgWFBPU19NRENULAogICBYUE9TX01EQ1RfQ1JPU1MsCiAgIFhQT1NfTEMsCiAgIFhQT1NfUkVTRVJWRUQsCiAgIFhQT1NfU1dJVENIRUQgLyogbm90IGEgcmVhbCBjaG9pY2UgYnV0IHVzZWQgaGVyZSB0byBjb250cm9sIGJlaGF2aW91ciAqLwotfQotWFBPU19NT0RFOworfSBYUE9TX01PREU7CiAKLXR5cGVkZWYgZW51bQotewordHlwZWRlZiBlbnVtIHsKICAgSU5WRl9PRkYgPSAwLAogICBJTlZGX0xPV19MRVZFTCwKICAgSU5WRl9NSURfTEVWRUwsCiAgIElOVkZfSElHSF9MRVZFTCwKICAgSU5WRl9TV0lUQ0hFRCAvKiBub3QgYSByZWFsIGNob2ljZSBidXQgdXNlZCBoZXJlIHRvIGNvbnRyb2wgYmVoYXZpb3VyICovCi19Ci1JTlZGX01PREU7Cit9IElOVkZfTU9ERTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3Nicl9lbmNvZGVyLmNwcCBiL2xpYlNCUmVuYy9zcmMvc2JyX2VuY29kZXIuY3BwCmluZGV4IDcxYWFiNzguLmRmOWU5OTYgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvc2JyX2VuY29kZXIuY3BwCisrKyBiL2xpYlNCUmVuYy9zcmMvc2JyX2VuY29kZXIuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDE5ICs5MCwyMCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBUb29scyAgKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEF1dGhvcihzKTogQW5kcmVhcyBFaHJldCwgVG9iaWFzIENoYWx1cGthCisgICBBdXRob3Iocyk6ICAgQW5kcmVhcyBFaHJldCwgVG9iaWFzIENoYWx1cGthCisKICAgIERlc2NyaXB0aW9uOiBTQlIgZW5jb2RlciB0b3AgbGV2ZWwgcHJvY2Vzc2luZy4KIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInNicl9lbmNvZGVyLmgiCiAKLSNpbmNsdWRlICJzYnJfcmFtLmgiCi0jaW5jbHVkZSAic2JyX3JvbS5oIgorI2luY2x1ZGUgInNicmVuY19yYW0uaCIKKyNpbmNsdWRlICJzYnJlbmNfcm9tLmgiCiAjaW5jbHVkZSAic2JyZW5jX2ZyZXFfc2NhLmgiCiAjaW5jbHVkZSAiZW52X2JpdC5oIgogI2luY2x1ZGUgImNtb25kYXRhLmgiCkBAIC0xMDEsMTEgKzExMyw5IEBACiAKICNpbmNsdWRlICJwc19tYWluLmgiCiAKLSNkZWZpbmUgU0JSRU5DT0RFUl9MSUJfVkwwIDMKLSNkZWZpbmUgU0JSRU5DT0RFUl9MSUJfVkwxIDMKLSNkZWZpbmUgU0JSRU5DT0RFUl9MSUJfVkwyIDEyCi0KLQorI2RlZmluZSBTQlJFTkNPREVSX0xJQl9WTDAgNAorI2RlZmluZSBTQlJFTkNPREVSX0xJQl9WTDEgMAorI2RlZmluZSBTQlJFTkNPREVSX0xJQl9WTDIgMAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKQEAgLTExOSwzNCArMTI5LDgzIEBACiAgICAgICAgICAgIChjb3JlMnNiciBkZWxheSAgICAgKSAgICAgICAgICBkcyAgICAgKHJlYWQsIGNvcmUgYW5kIGRzIGFyZWEpCiAqLwogCi0jZGVmaW5lIFNGQihkd25zbXApICAgICAgICAoMzIgPDwgKGR3bnNtcC0xKSkgICAgIC8qIFNCUiBGcmVxdWVuY3kgYmFuZHM6IDY0IGZvciBkdWFsLXJhdGUsIDMyIGZvciBzaW5nbGUtcmF0ZSAqLwotI2RlZmluZSBTVFMoZmwpICAgICAgICAgICAgKCgoZmwpPT0xMDI0KT8zMjozMCkgICAvKiBTQlIgVGltZSBTbG90czogMzIgZm9yIGNvcmUgZnJhbWUgbGVuZ3RoIDEwMjQsIDMwIGZvciBjb3JlIGZyYW1lIGxlbmd0aCA5NjAgKi8KKyNkZWZpbmUgU0ZCKGR3bnNtcCkgXAorICAoMzIgPDwgKGR3bnNtcCAtICBcCisgICAgICAgICAgMSkpIC8qIFNCUiBGcmVxdWVuY3kgYmFuZHM6IDY0IGZvciBkdWFsLXJhdGUsIDMyIGZvciBzaW5nbGUtcmF0ZSAqLworI2RlZmluZSBTVFMoZmwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKGZsKSA9PSAxMDI0KSA/IDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIDogMzApIC8qIFNCUiBUaW1lIFNsb3RzOiAzMiBmb3IgY29yZSBmcmFtZSBsZW5ndGggMTAyNCwgMzAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGNvcmUgZnJhbWUgbGVuZ3RoIDk2MCAqLwogCi0jZGVmaW5lIERFTEFZX1FNRl9BTkEoZHduc21wKSAoKDMyMDw8KChkd25zbXApLTEpKSAtICgzMjw8KChkd25zbXApLTEpKSkgLyogRnVsbCBiYW5kd2lkdGggKi8KLSNkZWZpbmUgREVMQVlfSFlCX0FOQSAgICAgICAgICgxMCo2NCkgICAgICAgLyogKyAwLjUgKi8gICAgICAgICAgICAgIC8qICAqLwotI2RlZmluZSBERUxBWV9IWUJfU1lOICAgICAgICAgKDYqNjQgLSAzMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICovCi0jZGVmaW5lIERFTEFZX1FNRl9QT1NUUFJPQyhkd25zbXApICgzMiooZHduc21wKSkgICAgICAgICAgICAgICAgICAgICAvKiBRTUYgcG9zdHByb2Nlc3NpbmcgZGVsYXkgKi8KLSNkZWZpbmUgREVMQVlfREVDX1FNRihkd25zbXApICg2ICogU0ZCKGR3bnNtcCkgKSAgICAgICAgICAgICAgICAgICAgIC8qIERlY29kZXIgUU1GIG92ZXJsYXAgKi8KLSNkZWZpbmUgREVMQVlfUU1GX1NZTiAgICAgICAgICgyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5PX1BPTFkvMj0yLjUsIHJvdW5kZWQgZG93biB0byAyICovCi0jZGVmaW5lIERFTEFZX1FNRl9EUyAgICAgICAgICAoMzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRTUYgc3ludGhlc2lzIGZvciBkb3duc2FtcGxlZCB0aW1lIHNpZ25hbCAqLworI2RlZmluZSBERUxBWV9RTUZfQU5BKGR3bnNtcCkgXAorICAoKDMyMCA8PCAoKGR3bnNtcCktMSkpIC0gKDMyIDw8ICgoZHduc21wKS0xKSkpIC8qIEZ1bGwgYmFuZHdpZHRoICovCisjZGVmaW5lIERFTEFZX0hZQl9BTkEgKDEwICogNjQpIC8qICsgMC41ICovICAgICAgLyogICovCisjZGVmaW5lIERFTEFZX0hZQl9TWU4gKDYgKiA2NCAtIDMyKSAgICAgICAgICAgICAgLyogICovCisjZGVmaW5lIERFTEFZX1FNRl9QT1NUUFJPQyhkd25zbXApIFwKKyAgKDMyICogKGR3bnNtcCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFFNRiBwb3N0cHJvY2Vzc2luZyBkZWxheSAqLworI2RlZmluZSBERUxBWV9ERUNfUU1GKGR3bnNtcCkgKDYgKiBTRkIoZHduc21wKSkgLyogRGVjb2RlciBRTUYgb3ZlcmxhcCAqLworI2RlZmluZSBERUxBWV9RTUZfU1lOKGR3bnNtcCkgXAorICAoMSA8PCAoZHduc21wIC0gICAgICAgICAgICAgXAorICAgICAgICAgMSkpIC8qIFFNRl9OT19QT0xZLzI9Mi41LCByb3VuZGVkIGRvd24gdG8gMiwgaGFsZiBmb3Igc2luZ2xlLXJhdGUgKi8KKyNkZWZpbmUgREVMQVlfUU1GX0RTICgzMikgLyogUU1GIHN5bnRoZXNpcyBmb3IgZG93bnNhbXBsZWQgdGltZSBzaWduYWwgKi8KIAogLyogRGVsYXkgaW4gUU1GIHBhdGhzICovCi0jZGVmaW5lIERFTEFZX1NCUihmbCxkd25zbXApICAgICAoREVMQVlfUU1GX0FOQShkd25zbXApICsgKFNGQihkd25zbXApKlNUUyhmbCkgLSAxKSArIERFTEFZX1FNRl9TWU4pCi0jZGVmaW5lIERFTEFZX1BTKGZsLGR3bnNtcCkgICAgICAoREVMQVlfUU1GX0FOQShkd25zbXApICsgREVMQVlfSFlCX0FOQSArIERFTEFZX0RFQ19RTUYoZHduc21wKSArIChTRkIoZHduc21wKSpTVFMoZmwpLTEpICsgREVMQVlfSFlCX1NZTiArIERFTEFZX1FNRl9TWU4pCi0jZGVmaW5lIERFTEFZX0VMRFNCUihmbCxkd25zbXApICAoICggKChmbCkvMikqKGR3bnNtcCkgKSAtIDEgKyBERUxBWV9RTUZfUE9TVFBST0MoZHduc21wKSApCisjZGVmaW5lIERFTEFZX1NCUihmbCwgZHduc21wKSBcCisgIChERUxBWV9RTUZfQU5BKGR3bnNtcCkgKyAoU0ZCKGR3bnNtcCkgKiBTVFMoZmwpIC0gMSkgKyBERUxBWV9RTUZfU1lOKGR3bnNtcCkpCisjZGVmaW5lIERFTEFZX1BTKGZsLCBkd25zbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoREVMQVlfUU1GX0FOQShkd25zbXApICsgREVMQVlfSFlCX0FOQSArIERFTEFZX0RFQ19RTUYoZHduc21wKSArIFwKKyAgIChTRkIoZHduc21wKSAqIFNUUyhmbCkgLSAxKSArIERFTEFZX0hZQl9TWU4gKyBERUxBWV9RTUZfU1lOKGR3bnNtcCkpCisjZGVmaW5lIERFTEFZX0VMRFNCUihmbCwgZHduc21wKSBcCisgICgoKChmbCkgLyAyKSAqIChkd25zbXApKSAtIDEgKyBERUxBWV9RTUZfUE9TVFBST0MoZHduc21wKSkKKyNkZWZpbmUgREVMQVlfRUxEdjJTQlIoZmwsIGR3bnNtcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoZmwpIC8gMikgKiAoZHduc21wKSkgLSAxICsgODAgKiAoZHduc21wKSkgLyogODAgaXMgdGhlIGRlbGF5IGNhdXNlZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgc3VtIG9mIHRoZSBDTEQgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYWx5c2lzIGFuZCB0aGUgTVBTTEQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGhlc2lzIGZpbHRlcmJhbmsgKi8KIAotLyogRGVsYXkgZGlmZmVyZW5jZXMgZm9yIFNCUiBhbmQgU0JSK1BTICovCi0jZGVmaW5lIE1BWF9EU19GSUxURVJfREVMQVkgKDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBhZGRpdGlvbmFsIG1heCBkb3duc2FtcGxlciBmaWx0ZXIgZGVsYXkgKHNvdXJjZSBmcykgKi8KLSNkZWZpbmUgREVMQVlfQUFDMlNCUihmbCxkd25zbXApICgoREVMQVlfUU1GX0FOQShkd25zbXApICsgREVMQVlfREVDX1FNRihkd25zbXApICsgREVMQVlfUU1GX1NZTikgLSBERUxBWV9TQlIoKGZsKSwoZHduc21wKSkpCi0jZGVmaW5lIERFTEFZX0VMRDJTQlIoZmwsZHduc21wKSAoKERFTEFZX1FNRl9QT1NUUFJPQyhkd25zbXApKSAtIERFTEFZX0VMRFNCUihmbCxkd25zbXApKQotI2RlZmluZSBERUxBWV9BQUMyUFMoZmwsZHduc21wKSAoKERFTEFZX1FNRl9BTkEoZHduc21wKSArIERFTEFZX1FNRl9EUyArIC8qKERFTEFZX0FBQyhmbCkqMikgKyAqLyBERUxBWV9RTUZfQU5BKGR3bnNtcCkgKyBERUxBWV9ERUNfUU1GKGR3bnNtcCkgKyBERUxBWV9IWUJfU1lOICsgREVMQVlfUU1GX1NZTikgLSBERUxBWV9QUyhmbCxkd25zbXApKSAvKiAyMDQ4IC0gNDYzKjIgKi8KKy8qIERlbGF5IGluIGNvcmUgcGF0aCAoY29yZSBhbmQgZG93bnNhbXBsZXIgbm90IHRha2VuIGludG8gYWNjb3VudCkgKi8KKyNkZWZpbmUgREVMQVlfQ09SRVBBVEhfU0JSKGZsLCBkd25zbXApIFwKKyAgKChERUxBWV9RTUZfQU5BKGR3bnNtcCkgKyBERUxBWV9ERUNfUU1GKGR3bnNtcCkgKyBERUxBWV9RTUZfU1lOKGR3bnNtcCkpKQorI2RlZmluZSBERUxBWV9DT1JFUEFUSF9FTERTQlIoZmwsIGR3bnNtcCkgKChERUxBWV9RTUZfUE9TVFBST0MoZHduc21wKSkpCisjZGVmaW5lIERFTEFZX0NPUkVQQVRIX0VMRHYyU0JSKGZsLCBkd25zbXApICgxMjggKiAoZHduc21wKSkgLyogNCBzbG90cyAqLworI2RlZmluZSBERUxBWV9DT1JFUEFUSF9QUyhmbCwgZHduc21wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoREVMQVlfUU1GX0FOQShkd25zbXApICsgREVMQVlfUU1GX0RTICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKihERUxBWV9BQUMoZmwpKjIpICsgKi8gREVMQVlfUU1GX0FOQShkd25zbXApICsgREVMQVlfREVDX1FNRihkd25zbXApICsgXAorICAgIERFTEFZX0hZQl9TWU4gKyBERUxBWV9RTUZfU1lOKGR3bnNtcCkpKSAvKiAyMDQ4IC0gNDYzKjIgKi8KIAotLyogQXNzdW1wdGlvbjogVGhlIHNhbXBsZSBkZWxheSByZXN1bHRpbmcgb2Ygb2YgREVMQVlfQUFDMlBTIGlzIGFsd2F5cyBzbWFsbGVyIHRoYW4gdGhlIHNhbXBsZSBkZWxheSBpbXBsaWVkIGJ5IERFTEFZX0FBQzJTQlIgKi8KLSNkZWZpbmUgTUFYX1NBTVBMRV9ERUxBWSAgICAgICAoREVMQVlfQUFDMlNCUigxMDI0LDIpICsgTUFYX0RTX0ZJTFRFUl9ERUxBWSkgLyogbWF4aW11bSBkZWxheTogZnJhbWUgbGVuZ3RoIG9mIDEwMjQgYW5kIGR1YWwtcmF0ZSBzYnIgKi8KKy8qIERlbGF5IGRpZmZlcmVuY2VzIGJldHdlZW4gU0JSLSBhbmQgZG93bnNhbXBsZWQgcGF0aCBmb3IgU0JSIGFuZCBTQlIrUFMgKi8KKyNkZWZpbmUgREVMQVlfQUFDMlNCUihmbCwgZHduc21wKSBcCisgICgoREVMQVlfQ09SRVBBVEhfU0JSKGZsLCBkd25zbXApKSAtIERFTEFZX1NCUigoZmwpLCAoZHduc21wKSkpCisjZGVmaW5lIERFTEFZX0VMRDJTQlIoZmwsIGR3bnNtcCkgXAorICAoKERFTEFZX0NPUkVQQVRIX0VMRFNCUihmbCwgZHduc21wKSkgLSBERUxBWV9FTERTQlIoZmwsIGR3bnNtcCkpCisjZGVmaW5lIERFTEFZX0FBQzJQUyhmbCwgZHduc21wKSBcCisgICgoREVMQVlfQ09SRVBBVEhfUFMoZmwsIGR3bnNtcCkpIC0gREVMQVlfUFMoZmwsIGR3bnNtcCkpIC8qIDIwNDggLSA0NjMqMiAqLworCisvKiBBc3N1bXB0aW9uOiBUaGUgc2FtcGxlIGRlbGF5IHJlc3VsdGluZyBvZiBvZiBERUxBWV9BQUMyUFMgaXMgYWx3YXlzIHNtYWxsZXIKKyAqIHRoYW4gdGhlIHNhbXBsZSBkZWxheSBpbXBsaWVkIGJ5IERFTEFZX0FBQzJTQlIgKi8KKyNkZWZpbmUgTUFYX0RTX0ZJTFRFUl9ERUxBWSBcCisgICg1KSAvKiB0aGUgYWRkaXRpb25hbCBtYXggZG93bnNhbXBsZXIgZmlsdGVyIGRlbGF5IChzb3VyY2UgZnMpICovCisjZGVmaW5lIE1BWF9TQU1QTEVfREVMQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoREVMQVlfQUFDMlNCUigxMDI0LCAyKSArIE1BWF9EU19GSUxURVJfREVMQVkpIC8qIG1heGltdW0gZGVsYXk6IGZyYW1lIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggb2YgMTAyNCBhbmQgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVhbC1yYXRlIHNiciAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KKy8qKioqKioqKioqKioqKiogRGVsYXkgcGFyYW1ldGVycyBmb3Igc2JyRW5jb2Rlcl9Jbml0X2RlbGF5KCkgKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBkc0RlbGF5OyAgICAgICAgLyogdGhlIGRlbGF5IG9mIHRoZSAodGltZS1kb21haW4pIGRvd25zYW1wbGVyIGl0c2VsZiAqLworICBpbnQgZGVsYXk7ICAgICAgICAgIC8qIG92ZXJhbGwgZGVsYXkgLyBzYW1wbGVzICAqLworICBpbnQgc2JyRGVjRGVsYXk7ICAgIC8qIFNCUiBkZWNvZGVyJ3MgZGVsYXkgKi8KKyAgaW50IGNvcmVQYXRoT2Zmc2V0OyAvKiBjb3JlIHBhdGggb2Zmc2V0IC8gc2FtcGxlczsgYWRkZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFbmNvZGVyX0luaXRfZGVsYXkoKSAqLworICBpbnQgc2JyUGF0aE9mZnNldDsgIC8qIFNCUiBwYXRoIG9mZnNldCAvIHNhbXBsZXM7IGFkZGVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRW5jb2Rlcl9Jbml0X2RlbGF5KCkgKi8KKyAgaW50IGJpdHN0ckRlbGF5OyAvKiBiaXRzdHJlYW0gZGVsYXkgLyBmcmFtZXM7IGFkZGVkIGJ5IHNickVuY29kZXJfSW5pdF9kZWxheSgpCisgICAgICAgICAgICAgICAgICAgICovCisgIGludCBkZWxheUlucHV0MkNvcmU7IC8qIGRlbGF5IG9mIHRoZSBpbnB1dCB0byB0aGUgY29yZSAvIHNhbXBsZXMgKi8KK30gREVMQVlfUEFSQU07CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjZGVmaW5lIElOVkFMSURfVEFCTEVfSURYIC0xCiAKQEAgLTE2MCw0NCArMjE5LDM4IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIERJU1RBTkNFX0NFSUxfVkFMVUUgNTAwMDAwMAotc3RhdGljIElOVAotZ2V0U2JyVHVuaW5nVGFibGVJbmRleChVSU5UIGJpdHJhdGUsICAgIC8qISB0aGUgdG90YWwgYml0cmF0ZSBpbiBiaXRzL3NlYyAqLwotICAgICAgICAgICAgICAgICAgICAgICBVSU5UIG51bUNoYW5uZWxzLC8qISB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGZvciB0aGUgY29yZSBjb2RlciAqLwotICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHNhbXBsZVJhdGUsICAvKiEgdGhlIHNhbXBsaW5nIHJhdGUgb2YgdGhlIGNvcmUgY29kZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgY29yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAqcEJpdFJhdGVDbG9zZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgaW50IGksIGJpdFJhdGVDbG9zZXN0TG93ZXJJbmRleD0tMSwgYml0UmF0ZUNsb3Nlc3RVcHBlckluZGV4PS0xLCBmb3VuZCA9IDA7Ci0gIFVJTlQgYml0UmF0ZUNsb3Nlc3RVcHBlciA9IDAsIGJpdFJhdGVDbG9zZXN0TG93ZXI9RElTVEFOQ0VfQ0VJTF9WQUxVRTsKK3N0YXRpYyBJTlQgZ2V0U2JyVHVuaW5nVGFibGVJbmRleCgKKyAgICBVSU5UIGJpdHJhdGUsICAgICAvKiEgdGhlIHRvdGFsIGJpdHJhdGUgaW4gYml0cy9zZWMgKi8KKyAgICBVSU5UIG51bUNoYW5uZWxzLCAvKiEgdGhlIG51bWJlciBvZiBjaGFubmVscyBmb3IgdGhlIGNvcmUgY29kZXIgKi8KKyAgICBVSU5UIHNhbXBsZVJhdGUsICAvKiEgdGhlIHNhbXBsaW5nIHJhdGUgb2YgdGhlIGNvcmUgY29kZXIgKi8KKyAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlLCBVSU5UICpwQml0UmF0ZUNsb3Nlc3QpIHsKKyAgaW50IGksIGJpdFJhdGVDbG9zZXN0TG93ZXJJbmRleCA9IC0xLCBiaXRSYXRlQ2xvc2VzdFVwcGVySW5kZXggPSAtMSwKKyAgICAgICAgIGZvdW5kID0gMDsKKyAgVUlOVCBiaXRSYXRlQ2xvc2VzdFVwcGVyID0gMCwgYml0UmF0ZUNsb3Nlc3RMb3dlciA9IERJU1RBTkNFX0NFSUxfVkFMVUU7CiAKLSAgI2RlZmluZSBpc0ZvclRoaXNDb3JlKGkpIFwKLSAgICAoICggc2JyVHVuaW5nVGFibGVbaV0uY29yZUNvZGVyID09IENPREVDX0FBQ0xEICYmIGNvcmUgPT0gQU9UX0VSX0FBQ19FTEQgKSB8fCBcCi0gICAgICAoIHNiclR1bmluZ1RhYmxlW2ldLmNvcmVDb2RlciA9PSBDT0RFQ19BQUMgICAmJiBjb3JlICE9IEFPVF9FUl9BQUNfRUxEICkgKQorI2RlZmluZSBpc0ZvclRoaXNDb3JlKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoc2JyVHVuaW5nVGFibGVbaV0uY29yZUNvZGVyID09IENPREVDX0FBQ0xEICYmIGNvcmUgPT0gQU9UX0VSX0FBQ19FTEQpIHx8IFwKKyAgIChzYnJUdW5pbmdUYWJsZVtpXS5jb3JlQ29kZXIgPT0gQ09ERUNfQUFDICYmIGNvcmUgIT0gQU9UX0VSX0FBQ19FTEQpKQogCi0gIGZvciAoaT0wOyBpIDwgc2JyVHVuaW5nVGFibGVTaXplIDsgaSsrKSB7Ci0gICAgaWYgKCBpc0ZvclRoaXNDb3JlKGkpICkgLyogdHVuaW5nIHRhYmxlIGlzIGZvciB0aGlzIGNvcmUgY29kZWMgKi8KKyAgZm9yIChpID0gMDsgaSA8IHNiclR1bmluZ1RhYmxlU2l6ZTsgaSsrKSB7CisgICAgaWYgKGlzRm9yVGhpc0NvcmUoaSkpIC8qIHR1bmluZyB0YWJsZSBpcyBmb3IgdGhpcyBjb3JlIGNvZGVjICovCiAgICAgewotICAgICAgaWYgKCBudW1DaGFubmVscyA9PSBzYnJUdW5pbmdUYWJsZSBbaV0ubnVtQ2hhbm5lbHMKLSAgICAgICAgJiYgc2FtcGxlUmF0ZSA9PSBzYnJUdW5pbmdUYWJsZSBbaV0uc2FtcGxlUmF0ZSApCi0gICAgICB7CisgICAgICBpZiAobnVtQ2hhbm5lbHMgPT0gc2JyVHVuaW5nVGFibGVbaV0ubnVtQ2hhbm5lbHMgJiYKKyAgICAgICAgICBzYW1wbGVSYXRlID09IHNiclR1bmluZ1RhYmxlW2ldLnNhbXBsZVJhdGUpIHsKICAgICAgICAgZm91bmQgPSAxOwotICAgICAgICBpZiAoKGJpdHJhdGUgPj0gc2JyVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVGcm9tKSAmJgotICAgICAgICAgICAgKGJpdHJhdGUgPCBzYnJUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZVRvKSkgewotICAgICAgICAgICAgICBiaXRSYXRlQ2xvc2VzdExvd2VyID0gYml0cmF0ZTsKLSAgICAgICAgICAgICAgYml0UmF0ZUNsb3Nlc3RVcHBlciA9IGJpdHJhdGU7Ci0gICAgICAgICAgICAgIC8vRkRLcHJpbnRmKCJlbnRyeSAlZFxuIiwgaSk7Ci0gICAgICAgICAgcmV0dXJuIGkgOworICAgICAgICBpZiAoKGJpdHJhdGUgPj0gc2JyVHVuaW5nVGFibGVbaV0uYml0cmF0ZUZyb20pICYmCisgICAgICAgICAgICAoYml0cmF0ZSA8IHNiclR1bmluZ1RhYmxlW2ldLmJpdHJhdGVUbykpIHsKKyAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoIHNiclR1bmluZ1RhYmxlIFtpXS5iaXRyYXRlRnJvbSA+IGJpdHJhdGUgKSB7Ci0gICAgICAgICAgICBpZiAoc2JyVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVGcm9tIDwgYml0UmF0ZUNsb3Nlc3RMb3dlcikgewotICAgICAgICAgICAgICBiaXRSYXRlQ2xvc2VzdExvd2VyID0gc2JyVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVGcm9tOworICAgICAgICAgIGlmIChzYnJUdW5pbmdUYWJsZVtpXS5iaXRyYXRlRnJvbSA+IGJpdHJhdGUpIHsKKyAgICAgICAgICAgIGlmIChzYnJUdW5pbmdUYWJsZVtpXS5iaXRyYXRlRnJvbSA8IGJpdFJhdGVDbG9zZXN0TG93ZXIpIHsKKyAgICAgICAgICAgICAgYml0UmF0ZUNsb3Nlc3RMb3dlciA9IHNiclR1bmluZ1RhYmxlW2ldLmJpdHJhdGVGcm9tOwogICAgICAgICAgICAgICBiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXggPSBpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoIHNiclR1bmluZ1RhYmxlIFtpXS5iaXRyYXRlVG8gPD0gYml0cmF0ZSApIHsKLSAgICAgICAgICAgIGlmIChzYnJUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZVRvID4gYml0UmF0ZUNsb3Nlc3RVcHBlcikgewotICAgICAgICAgICAgICBiaXRSYXRlQ2xvc2VzdFVwcGVyID0gc2JyVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVUby0xOworICAgICAgICAgIGlmIChzYnJUdW5pbmdUYWJsZVtpXS5iaXRyYXRlVG8gPD0gYml0cmF0ZSkgeworICAgICAgICAgICAgaWYgKHNiclR1bmluZ1RhYmxlW2ldLmJpdHJhdGVUbyA+IGJpdFJhdGVDbG9zZXN0VXBwZXIpIHsKKyAgICAgICAgICAgICAgYml0UmF0ZUNsb3Nlc3RVcHBlciA9IHNiclR1bmluZ1RhYmxlW2ldLmJpdHJhdGVUbyAtIDE7CiAgICAgICAgICAgICAgIGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleCA9IGk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQpAQCAtMjA2LDIwICsyNTksMjUgQEAKICAgICB9CiAgIH0KIAotICBpZiAocEJpdFJhdGVDbG9zZXN0ICE9IE5VTEwpCi0gIHsKLSAgICAvKiBJZiB0aGVyZSB3YXMgYXQgbGVhc3Qgb25lIG1hdGNoaW5nIHR1bmluZyBlbnRyeSBmb3VuZCB0aGVuIHBpY2sgdGhlIGxlYXN0IGRpc3RhbmNlIGJpdCByYXRlICovCi0gICAgaWYgKGZvdW5kKQotICAgIHsKLSAgICAgIGludCBkaXN0YW5jZVVwcGVyPURJU1RBTkNFX0NFSUxfVkFMVUUsIGRpc3RhbmNlTG93ZXI9RElTVEFOQ0VfQ0VJTF9WQUxVRTsKKyAgaWYgKGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleCA+PSAwKSB7CisgICAgcmV0dXJuIGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleDsKKyAgfQorCisgIGlmIChwQml0UmF0ZUNsb3Nlc3QgIT0gTlVMTCkgeworICAgIC8qIElmIHRoZXJlIHdhcyBhdCBsZWFzdCBvbmUgbWF0Y2hpbmcgdHVuaW5nIGVudHJ5IHBpY2sgdGhlIGxlYXN0IGRpc3RhbmNlCisgICAgICogYml0IHJhdGUgKi8KKyAgICBpZiAoZm91bmQpIHsKKyAgICAgIGludCBkaXN0YW5jZVVwcGVyID0gRElTVEFOQ0VfQ0VJTF9WQUxVRSwKKyAgICAgICAgICBkaXN0YW5jZUxvd2VyID0gRElTVEFOQ0VfQ0VJTF9WQUxVRTsKICAgICAgIGlmIChiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXggPj0gMCkgewotICAgICAgICBkaXN0YW5jZUxvd2VyID0gc2JyVHVuaW5nVGFibGUgW2JpdFJhdGVDbG9zZXN0TG93ZXJJbmRleF0uYml0cmF0ZUZyb20gLSBiaXRyYXRlOworICAgICAgICBkaXN0YW5jZUxvd2VyID0KKyAgICAgICAgICAgIHNiclR1bmluZ1RhYmxlW2JpdFJhdGVDbG9zZXN0TG93ZXJJbmRleF0uYml0cmF0ZUZyb20gLSBiaXRyYXRlOwogICAgICAgfQogICAgICAgaWYgKGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleCA+PSAwKSB7Ci0gICAgICAgIGRpc3RhbmNlVXBwZXIgPSBiaXRyYXRlIC0gc2JyVHVuaW5nVGFibGUgW2JpdFJhdGVDbG9zZXN0VXBwZXJJbmRleF0uYml0cmF0ZVRvOworICAgICAgICBkaXN0YW5jZVVwcGVyID0KKyAgICAgICAgICAgIGJpdHJhdGUgLSBzYnJUdW5pbmdUYWJsZVtiaXRSYXRlQ2xvc2VzdFVwcGVySW5kZXhdLmJpdHJhdGVUbzsKICAgICAgIH0KLSAgICAgIGlmICggZGlzdGFuY2VVcHBlciA8IGRpc3RhbmNlTG93ZXIgKQotICAgICAgeworICAgICAgaWYgKGRpc3RhbmNlVXBwZXIgPCBkaXN0YW5jZUxvd2VyKSB7CiAgICAgICAgICpwQml0UmF0ZUNsb3Nlc3QgPSBiaXRSYXRlQ2xvc2VzdFVwcGVyOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgKnBCaXRSYXRlQ2xvc2VzdCA9IGJpdFJhdGVDbG9zZXN0TG93ZXI7CkBAIC0yNDEsNDQgKzI5OSw0NyBAQAogICBccmV0dXJuIEluZGV4IHRvIHRoZSBhcHByb3ByaWF0ZSB0YWJsZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVAotZ2V0UHNUdW5pbmdUYWJsZUluZGV4KFVJTlQgYml0cmF0ZSwgVUlOVCAqcEJpdFJhdGVDbG9zZXN0KXsKK3N0YXRpYyBJTlQgZ2V0UHNUdW5pbmdUYWJsZUluZGV4KFVJTlQgYml0cmF0ZSwgVUlOVCAqcEJpdFJhdGVDbG9zZXN0KSB7CisgIElOVCBpLCBwYXJhbVNldHMgPSBzaXplb2YocHNUdW5pbmdUYWJsZSkgLyBzaXplb2YocHNUdW5pbmdUYWJsZVswXSk7CisgIGludCBiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXggPSAtMSwgYml0UmF0ZUNsb3Nlc3RVcHBlckluZGV4ID0gLTE7CisgIFVJTlQgYml0UmF0ZUNsb3Nlc3RVcHBlciA9IDAsIGJpdFJhdGVDbG9zZXN0TG93ZXIgPSBESVNUQU5DRV9DRUlMX1ZBTFVFOwogCi0gIElOVCBpLCBwYXJhbVNldHMgPSBzaXplb2YgKHBzVHVuaW5nVGFibGUpIC8gc2l6ZW9mIChwc1R1bmluZ1RhYmxlIFswXSk7Ci0gIGludCBiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXg9LTEsIGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleD0tMTsKLSAgVUlOVCBiaXRSYXRlQ2xvc2VzdFVwcGVyID0gMCwgYml0UmF0ZUNsb3Nlc3RMb3dlcj1ESVNUQU5DRV9DRUlMX1ZBTFVFOwotCi0gIGZvciAoaSA9IDAgOyBpIDwgcGFyYW1TZXRzIDsgaSsrKSAgewotICAgIGlmICgoYml0cmF0ZSA+PSBwc1R1bmluZ1RhYmxlIFtpXS5iaXRyYXRlRnJvbSkgJiYKLSAgICAgICAgKGJpdHJhdGUgPCBwc1R1bmluZ1RhYmxlIFtpXS5iaXRyYXRlVG8pKSB7Ci0gICAgICByZXR1cm4gaSA7CisgIGZvciAoaSA9IDA7IGkgPCBwYXJhbVNldHM7IGkrKykgeworICAgIGlmICgoYml0cmF0ZSA+PSBwc1R1bmluZ1RhYmxlW2ldLmJpdHJhdGVGcm9tKSAmJgorICAgICAgICAoYml0cmF0ZSA8IHBzVHVuaW5nVGFibGVbaV0uYml0cmF0ZVRvKSkgeworICAgICAgcmV0dXJuIGk7CiAgICAgfSBlbHNlIHsKLSAgICAgIGlmICggcHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZUZyb20gPiBiaXRyYXRlICkgewotICAgICAgICBpZiAocHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZUZyb20gPCBiaXRSYXRlQ2xvc2VzdExvd2VyKSB7Ci0gICAgICAgICAgYml0UmF0ZUNsb3Nlc3RMb3dlciA9IHBzVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVGcm9tOworICAgICAgaWYgKHBzVHVuaW5nVGFibGVbaV0uYml0cmF0ZUZyb20gPiBiaXRyYXRlKSB7CisgICAgICAgIGlmIChwc1R1bmluZ1RhYmxlW2ldLmJpdHJhdGVGcm9tIDwgYml0UmF0ZUNsb3Nlc3RMb3dlcikgeworICAgICAgICAgIGJpdFJhdGVDbG9zZXN0TG93ZXIgPSBwc1R1bmluZ1RhYmxlW2ldLmJpdHJhdGVGcm9tOwogICAgICAgICAgIGJpdFJhdGVDbG9zZXN0TG93ZXJJbmRleCA9IGk7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGlmICggcHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZVRvIDw9IGJpdHJhdGUgKSB7Ci0gICAgICAgIGlmIChwc1R1bmluZ1RhYmxlIFtpXS5iaXRyYXRlVG8gPiBiaXRSYXRlQ2xvc2VzdFVwcGVyKSB7Ci0gICAgICAgICAgYml0UmF0ZUNsb3Nlc3RVcHBlciA9IHBzVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVUby0xOworICAgICAgaWYgKHBzVHVuaW5nVGFibGVbaV0uYml0cmF0ZVRvIDw9IGJpdHJhdGUpIHsKKyAgICAgICAgaWYgKHBzVHVuaW5nVGFibGVbaV0uYml0cmF0ZVRvID4gYml0UmF0ZUNsb3Nlc3RVcHBlcikgeworICAgICAgICAgIGJpdFJhdGVDbG9zZXN0VXBwZXIgPSBwc1R1bmluZ1RhYmxlW2ldLmJpdHJhdGVUbyAtIDE7CiAgICAgICAgICAgYml0UmF0ZUNsb3Nlc3RVcHBlckluZGV4ID0gaTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogCi0gIGlmIChwQml0UmF0ZUNsb3Nlc3QgIT0gTlVMTCkKLSAgewotICAgIGludCBkaXN0YW5jZVVwcGVyPURJU1RBTkNFX0NFSUxfVkFMVUUsIGRpc3RhbmNlTG93ZXI9RElTVEFOQ0VfQ0VJTF9WQUxVRTsKKyAgaWYgKGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleCA+PSAwKSB7CisgICAgcmV0dXJuIGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleDsKKyAgfQorCisgIGlmIChwQml0UmF0ZUNsb3Nlc3QgIT0gTlVMTCkgeworICAgIGludCBkaXN0YW5jZVVwcGVyID0gRElTVEFOQ0VfQ0VJTF9WQUxVRSwKKyAgICAgICAgZGlzdGFuY2VMb3dlciA9IERJU1RBTkNFX0NFSUxfVkFMVUU7CiAgICAgaWYgKGJpdFJhdGVDbG9zZXN0TG93ZXJJbmRleCA+PSAwKSB7Ci0gICAgICBkaXN0YW5jZUxvd2VyID0gc2JyVHVuaW5nVGFibGUgW2JpdFJhdGVDbG9zZXN0TG93ZXJJbmRleF0uYml0cmF0ZUZyb20gLSBiaXRyYXRlOworICAgICAgZGlzdGFuY2VMb3dlciA9CisgICAgICAgICAgc2JyVHVuaW5nVGFibGVbYml0UmF0ZUNsb3Nlc3RMb3dlckluZGV4XS5iaXRyYXRlRnJvbSAtIGJpdHJhdGU7CiAgICAgfQogICAgIGlmIChiaXRSYXRlQ2xvc2VzdFVwcGVySW5kZXggPj0gMCkgewotICAgICAgZGlzdGFuY2VVcHBlciA9IGJpdHJhdGUgLSBzYnJUdW5pbmdUYWJsZSBbYml0UmF0ZUNsb3Nlc3RVcHBlckluZGV4XS5iaXRyYXRlVG87CisgICAgICBkaXN0YW5jZVVwcGVyID0KKyAgICAgICAgICBiaXRyYXRlIC0gc2JyVHVuaW5nVGFibGVbYml0UmF0ZUNsb3Nlc3RVcHBlckluZGV4XS5iaXRyYXRlVG87CiAgICAgfQotICAgIGlmICggZGlzdGFuY2VVcHBlciA8IGRpc3RhbmNlTG93ZXIgKQotICAgIHsKKyAgICBpZiAoZGlzdGFuY2VVcHBlciA8IGRpc3RhbmNlTG93ZXIpIHsKICAgICAgICpwQml0UmF0ZUNsb3Nlc3QgPSBiaXRSYXRlQ2xvc2VzdFVwcGVyOwogICAgIH0gZWxzZSB7CiAgICAgICAqcEJpdFJhdGVDbG9zZXN0ID0gYml0UmF0ZUNsb3Nlc3RMb3dlcjsKQEAgLTMwMCw0MSArMzYxLDI5IEBACiAgIFxpbmdyb3VwIFNickVuY0NmZwogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVAotRkRLc2JyRW5jX0dldERvd25zYW1wbGVkU3RvcEZyZXEgKAotICAgICAgICBjb25zdCBJTlQgc2FtcGxlUmF0ZUNvcmUsCi0gICAgICAgIGNvbnN0IElOVCBzdGFydEZyZXEsCi0gICAgICAgICAgICAgIElOVCBzdG9wRnJlcSwKLSAgICAgICAgY29uc3QgSU5UIGRvd25TYW1wbGVGYWN0b3IKLSAgICAgICAgKQoteworc3RhdGljIElOVCBGREtzYnJFbmNfR2V0RG93bnNhbXBsZWRTdG9wRnJlcShjb25zdCBJTlQgc2FtcGxlUmF0ZUNvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzdGFydEZyZXEsIElOVCBzdG9wRnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGRvd25TYW1wbGVGYWN0b3IpIHsKICAgSU5UIG1heFN0b3BGcmVxUmF3ID0gc2FtcGxlUmF0ZUNvcmUgLyAyOwogICBJTlQgc3RhcnRCYW5kLCBzdG9wQmFuZDsKICAgSEFORExFX0VSUk9SX0lORk8gZXJyOwogCi0gIHdoaWxlIChzdG9wRnJlcSA+IDAgJiYgRkRLc2JyRW5jX2dldFNiclN0b3BGcmVxUkFXKHN0b3BGcmVxLCBzYW1wbGVSYXRlQ29yZSkgPiBtYXhTdG9wRnJlcVJhdykgeworICB3aGlsZSAoc3RvcEZyZXEgPiAwICYmIEZES3NickVuY19nZXRTYnJTdG9wRnJlcVJBVyhzdG9wRnJlcSwgc2FtcGxlUmF0ZUNvcmUpID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U3RvcEZyZXFSYXcpIHsKICAgICBzdG9wRnJlcS0tOwogICB9CiAKLSAgaWYgKEZES3NickVuY19nZXRTYnJTdG9wRnJlcVJBVyggc3RvcEZyZXEsIHNhbXBsZVJhdGVDb3JlKSA+IG1heFN0b3BGcmVxUmF3KQorICBpZiAoRkRLc2JyRW5jX2dldFNiclN0b3BGcmVxUkFXKHN0b3BGcmVxLCBzYW1wbGVSYXRlQ29yZSkgPiBtYXhTdG9wRnJlcVJhdykKICAgICByZXR1cm4gLTE7CiAKLSAgZXJyID0gRkRLc2JyRW5jX0ZpbmRTdGFydEFuZFN0b3BCYW5kICgKLSAgICAgICAgICAgICAgICBzYW1wbGVSYXRlQ29yZTw8KGRvd25TYW1wbGVGYWN0b3ItMSksCi0gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZUNvcmUsCi0gICAgICAgICAgICAgICAgMzI8PChkb3duU2FtcGxlRmFjdG9yLTEpLAotICAgICAgICAgICAgICAgIHN0YXJ0RnJlcSwKLSAgICAgICAgICAgICAgICBzdG9wRnJlcSwKLSAgICAgICAgICAgICAgICZzdGFydEJhbmQsCi0gICAgICAgICAgICAgICAmc3RvcEJhbmQKLSAgICAgICAgICAgICAgICApOwotICBpZiAoZXJyKQotICAgIHJldHVybiAtMTsKKyAgZXJyID0gRkRLc2JyRW5jX0ZpbmRTdGFydEFuZFN0b3BCYW5kKAorICAgICAgc2FtcGxlUmF0ZUNvcmUgPDwgKGRvd25TYW1wbGVGYWN0b3IgLSAxKSwgc2FtcGxlUmF0ZUNvcmUsCisgICAgICAzMiA8PCAoZG93blNhbXBsZUZhY3RvciAtIDEpLCBzdGFydEZyZXEsIHN0b3BGcmVxLCAmc3RhcnRCYW5kLCAmc3RvcEJhbmQpOworICBpZiAoZXJyKSByZXR1cm4gLTE7CiAKICAgcmV0dXJuIHN0b3BGcmVxOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiEKIApAQCAtMzQ1LDIyICszOTQsMTggQEAKICAgXHJldHVybiBhIGZsYWcgaW5kaWNhdGluZyBzdWNjZXNzOiB5ZXMgKDEpIG9yIG5vICgwKQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFVJTlQKLUZES3NickVuY19Jc1NiclNldHRpbmdBdmFpbCAoCi0gICAgICAgIFVJTlQgYml0cmF0ZSwgICAgICAgICAgIC8qISB0aGUgdG90YWwgYml0cmF0ZSBpbiBiaXRzL3NlYyAqLwotICAgICAgICBVSU5UIHZick1vZGUsICAgICAgICAgICAvKiEgdGhlIHZiciBwYXJhbXRlciwgMCBtZWFucyBjb25zdGFudCBiaXRyYXRlICovCi0gICAgICAgIFVJTlQgbnVtT3V0cHV0Q2hhbm5lbHMsIC8qISB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGZvciB0aGUgY29yZSBjb2RlciAqLwotICAgICAgICBVSU5UIHNhbXBsZVJhdGVJbnB1dCwgICAvKiEgdGhlIGlucHV0IHNhbXBsZSByYXRlIFtpbiBIel0gKi8KLSAgICAgICAgVUlOVCBzYW1wbGVSYXRlQ29yZSwgICAgLyohIHRoZSBjb3JlJ3Mgc2FtcGxpbmcgcmF0ZSAqLwotICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlCi0gICAgICAgICkKLXsKK3N0YXRpYyBVSU5UIEZES3NickVuY19Jc1NiclNldHRpbmdBdmFpbCgKKyAgICBVSU5UIGJpdHJhdGUsICAgICAgICAgICAvKiEgdGhlIHRvdGFsIGJpdHJhdGUgaW4gYml0cy9zZWMgKi8KKyAgICBVSU5UIHZick1vZGUsICAgICAgICAgICAvKiEgdGhlIHZiciBwYXJhbXRlciwgMCBtZWFucyBjb25zdGFudCBiaXRyYXRlICovCisgICAgVUlOVCBudW1PdXRwdXRDaGFubmVscywgLyohIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgZm9yIHRoZSBjb3JlIGNvZGVyICovCisgICAgVUlOVCBzYW1wbGVSYXRlSW5wdXQsICAgLyohIHRoZSBpbnB1dCBzYW1wbGUgcmF0ZSBbaW4gSHpdICovCisgICAgVUlOVCBzYW1wbGVSYXRlQ29yZSwgICAgLyohIHRoZSBjb3JlJ3Mgc2FtcGxpbmcgcmF0ZSAqLworICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmUpIHsKICAgSU5UIGlkeCA9IElOVkFMSURfVEFCTEVfSURYOwogCi0gIGlmIChzYW1wbGVSYXRlSW5wdXQgPCAxNjAwMCkKLSAgICByZXR1cm4gMDsKKyAgaWYgKHNhbXBsZVJhdGVJbnB1dCA8IDE2MDAwKSByZXR1cm4gMDsKIAotICBpZiAoYml0cmF0ZT09MCkgeworICBpZiAoYml0cmF0ZSA9PSAwKSB7CiAgICAgLyogbWFwIHZiciBxdWFsaXR5IHRvIGJpdHJhdGUgKi8KICAgICBpZiAodmJyTW9kZSA8IDMwKQogICAgICAgYml0cmF0ZSA9IDI0MDAwOwpAQCAtMzc1LDEyICs0MjAsMTIgQEAKICAgICBiaXRyYXRlICo9IG51bU91dHB1dENoYW5uZWxzOwogICB9CiAKLSAgaWR4ID0gZ2V0U2JyVHVuaW5nVGFibGVJbmRleChiaXRyYXRlLCBudW1PdXRwdXRDaGFubmVscywgc2FtcGxlUmF0ZUNvcmUsIGNvcmUsIE5VTEwpOworICBpZHggPSBnZXRTYnJUdW5pbmdUYWJsZUluZGV4KGJpdHJhdGUsIG51bU91dHB1dENoYW5uZWxzLCBzYW1wbGVSYXRlQ29yZSwgY29yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKIAogICByZXR1cm4gKGlkeCA9PSBJTlZBTElEX1RBQkxFX0lEWCA/IDAgOiAxKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAKQEAgLTM5MCw0NiArNDM1LDQ2IEBACiAgIFxyZXR1cm4gQSBmbGFnIGluZGljYXRpbmcgc3VjY2VzczogeWVzICgxKSBvciBubyAoMCkKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBVSU5UCi1GREtzYnJFbmNfQWRqdXN0U2JyU2V0dGluZ3MgKGNvbnN0IHNickNvbmZpZ3VyYXRpb25QdHIgY29uZmlnLCAvKiEgb3V0cHV0LCBtb2RpZmllZCAqLwotICAgICAgICAgICAgICAgICAgIFVJTlQgYml0UmF0ZSwgICAgICAgICAgICAgLyohIHRoZSB0b3RhbCBiaXRyYXRlIGluIGJpdHMvc2VjICovCi0gICAgICAgICAgICAgICAgICAgVUlOVCBudW1DaGFubmVscywgICAgICAgICAvKiEgdGhlIGNvcmUgY29kZXIgbnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgICAgICAgICAgICAgICAgVUlOVCBzYW1wbGVSYXRlQ29yZSwgICAgICAvKiEgdGhlIGNvcmUgY29kZXIgc2FtcGxpbmcgcmF0ZSBpbiBIeiAqLwotICAgICAgICAgICAgICAgICAgIFVJTlQgc2FtcGxlUmF0ZVNiciwgICAgICAgLyohIHRoZSBzYnIgY29kZXIgc2FtcGxpbmcgcmF0ZSBpbiBIeiAqLwotICAgICAgICAgICAgICAgICAgIFVJTlQgdHJhbnNGYWMsICAgICAgICAgICAgLyohIHRoZSBzaG9ydCBibG9jayB0byBsb25nIGJsb2NrIHJhdGlvICovCi0gICAgICAgICAgICAgICAgICAgVUlOVCBzdGFuZGFyZEJpdHJhdGUsICAgICAvKiEgdGhlIHN0YW5kYXJkIGJpdHJhdGUgcGVyIGNoYW5uZWwgaW4gYml0cy9zZWMgKi8KLSAgICAgICAgICAgICAgICAgICBVSU5UIHZick1vZGUsICAgICAgICAgICAgIC8qISB0aGUgdmJyIHBhcmFtdGVyLCAwIHBvb3IgcXVhbGl0eSAuLiAxMDAgaGlnaCBxdWFsaXR5Ki8KLSAgICAgICAgICAgICAgICAgICBVSU5UIHVzZVNwZWVjaENvbmZpZywgICAgIC8qITwgYWRhcHQgdHVuaW5nIHBhcmFtZXRlcnMgZm9yIHNwZWVjaCA/ICovCi0gICAgICAgICAgICAgICAgICAgVUlOVCBsY3NNb2RlLCAgICAgICAgICAgICAvKiEgdGhlIGxvdyBjb21wbGV4aXR5IHN0ZXJlbyBtb2RlICovCi0gICAgICAgICAgICAgICAgICAgVUlOVCBiUGFyYW1ldHJpY1N0ZXJlbywgICAvKiE8IHVzZSBwYXJhbWV0cmljIHN0ZXJlbyAqLwotICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmUpICAgLyogQ29yZSBhdWRpbyBjb2RlYyBvYmplY3QgdHlwZSAqLworc3RhdGljIFVJTlQgRkRLc2JyRW5jX0FkanVzdFNiclNldHRpbmdzKAorICAgIGNvbnN0IHNickNvbmZpZ3VyYXRpb25QdHIgY29uZmlnLCAvKiEgb3V0cHV0LCBtb2RpZmllZCAqLworICAgIFVJTlQgYml0UmF0ZSwgICAgICAgICAgICAgICAgICAgICAvKiEgdGhlIHRvdGFsIGJpdHJhdGUgaW4gYml0cy9zZWMgKi8KKyAgICBVSU5UIG51bUNoYW5uZWxzLCAgICAgICAgICAgICAgICAgLyohIHRoZSBjb3JlIGNvZGVyIG51bWJlciBvZiBjaGFubmVscyAqLworICAgIFVJTlQgc2FtcGxlUmF0ZUNvcmUsICAgICAgICAgICAgICAvKiEgdGhlIGNvcmUgY29kZXIgc2FtcGxpbmcgcmF0ZSBpbiBIeiAqLworICAgIFVJTlQgc2FtcGxlUmF0ZVNiciwgICAgICAgICAgICAgICAvKiEgdGhlIHNiciBjb2RlciBzYW1wbGluZyByYXRlIGluIEh6ICovCisgICAgVUlOVCB0cmFuc0ZhYywgICAgICAgICAgICAgICAgICAgIC8qISB0aGUgc2hvcnQgYmxvY2sgdG8gbG9uZyBibG9jayByYXRpbyAqLworICAgIFVJTlQgc3RhbmRhcmRCaXRyYXRlLCAvKiEgdGhlIHN0YW5kYXJkIGJpdHJhdGUgcGVyIGNoYW5uZWwgaW4gYml0cy9zZWMgKi8KKyAgICBVSU5UIHZick1vZGUsIC8qISB0aGUgdmJyIHBhcmFtdGVyLCAwIHBvb3IgcXVhbGl0eSAuLiAxMDAgaGlnaCBxdWFsaXR5Ki8KKyAgICBVSU5UIHVzZVNwZWVjaENvbmZpZywgICAvKiE8IGFkYXB0IHR1bmluZyBwYXJhbWV0ZXJzIGZvciBzcGVlY2ggPyAqLworICAgIFVJTlQgbGNzTW9kZSwgICAgICAgICAgIC8qISB0aGUgbG93IGNvbXBsZXhpdHkgc3RlcmVvIG1vZGUgKi8KKyAgICBVSU5UIGJQYXJhbWV0cmljU3RlcmVvLCAvKiE8IHVzZSBwYXJhbWV0cmljIHN0ZXJlbyAqLworICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmUpIC8qIENvcmUgYXVkaW8gY29kZWMgb2JqZWN0IHR5cGUgKi8KIHsKICAgSU5UIGlkeCA9IElOVkFMSURfVEFCTEVfSURYOwogICAvKiBzZXQgdGhlIGNvcmUgY29kZWMgc2V0dGluZ3MgKi8KLSAgY29uZmlnLT5jb2RlY1NldHRpbmdzLmJpdFJhdGUgICAgICAgICA9IGJpdFJhdGU7Ci0gIGNvbmZpZy0+Y29kZWNTZXR0aW5ncy5uQ2hhbm5lbHMgICAgICAgPSBudW1DaGFubmVsczsKLSAgY29uZmlnLT5jb2RlY1NldHRpbmdzLnNhbXBsZUZyZXEgICAgICA9IHNhbXBsZVJhdGVDb3JlOwotICBjb25maWctPmNvZGVjU2V0dGluZ3MudHJhbnNGYWMgICAgICAgID0gdHJhbnNGYWM7CisgIGNvbmZpZy0+Y29kZWNTZXR0aW5ncy5iaXRSYXRlID0gYml0UmF0ZTsKKyAgY29uZmlnLT5jb2RlY1NldHRpbmdzLm5DaGFubmVscyA9IG51bUNoYW5uZWxzOworICBjb25maWctPmNvZGVjU2V0dGluZ3Muc2FtcGxlRnJlcSA9IHNhbXBsZVJhdGVDb3JlOworICBjb25maWctPmNvZGVjU2V0dGluZ3MudHJhbnNGYWMgPSB0cmFuc0ZhYzsKICAgY29uZmlnLT5jb2RlY1NldHRpbmdzLnN0YW5kYXJkQml0cmF0ZSA9IHN0YW5kYXJkQml0cmF0ZTsKIAogICBpZiAoYml0UmF0ZSA8IDI4MDAwKSB7CiAgICAgY29uZmlnLT50aHJlc2hvbGRfQW1wUmVzX0ZGX20gPSAoRklYUF9EQkwpTUFYVkFMX0RCTDsKICAgICBjb25maWctPnRocmVzaG9sZF9BbXBSZXNfRkZfZSA9IDc7Ci0gIH0KLSAgZWxzZSBpZiAoYml0UmF0ZSA+PSAyODAwMCAmJiBiaXRSYXRlIDw9IDQ4MDAwKSB7CisgIH0gZWxzZSBpZiAoYml0UmF0ZSA+PSAyODAwMCAmJiBiaXRSYXRlIDw9IDQ4MDAwKSB7CiAgICAgLyogVGhlIGZsb2F0IHRocmVzaG9sZCBpcyA3NQotICAgICAgIDAuNTI0Mjg4ZiBpcyBmcmFjdGlvbmFsIHBhcnQgb2YgUkVMQVhBVElPTiwgdGhlIHF1b3RhTWF0cml4IGFuZCB0aGVyZWZvcmUgdG9uYWxpdHkgYXJlIHNjYWxlZCBieSB0aGlzCi0gICAgICAgMi8zIGlzIGJlY2F1c2UgdGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIGRpdmlkZXMgdGhlIHRvbmFsaXR5IHZhbHVlcyBieSAzLCBoZXJlIGl0J3MgZGl2aWRlZCBieSAyCi0gICAgICAgMTI4IGNvbXBlbnNhdGVzIHRoZSBuZWNlc3Nhcnkgc2hpZnRmYWN0b3Igb2YgNyAqLwotICAgIGNvbmZpZy0+dGhyZXNob2xkX0FtcFJlc19GRl9tID0gRkwyRlhDT05TVF9EQkwoNzUuMGYqMC41MjQyODhmLygyLjBmLzMuMGYpLzEyOC4wZik7CisgICAgICAgMC41MjQyODhmIGlzIGZyYWN0aW9uYWwgcGFydCBvZiBSRUxBWEFUSU9OLCB0aGUgcXVvdGFNYXRyaXggYW5kIHRoZXJlZm9yZQorICAgICAgIHRvbmFsaXR5IGFyZSBzY2FsZWQgYnkgdGhpcyAyLzMgaXMgYmVjYXVzZSB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICBkaXZpZGVzIHRoZSB0b25hbGl0eSB2YWx1ZXMgYnkgMywgaGVyZSBpdCdzIGRpdmlkZWQgYnkgMiAxMjggY29tcGVuc2F0ZXMKKyAgICAgICB0aGUgbmVjZXNzYXJ5IHNoaWZ0ZmFjdG9yIG9mIDcgKi8KKyAgICBjb25maWctPnRocmVzaG9sZF9BbXBSZXNfRkZfbSA9CisgICAgICAgIEZMMkZYQ09OU1RfREJMKDc1LjBmICogMC41MjQyODhmIC8gKDIuMGYgLyAzLjBmKSAvIDEyOC4wZik7CiAgICAgY29uZmlnLT50aHJlc2hvbGRfQW1wUmVzX0ZGX2UgPSA3OwotICB9Ci0gIGVsc2UgaWYgKGJpdFJhdGUgPiA0ODAwMCkgeworICB9IGVsc2UgaWYgKGJpdFJhdGUgPiA0ODAwMCkgewogICAgIGNvbmZpZy0+dGhyZXNob2xkX0FtcFJlc19GRl9tID0gRkwyRlhDT05TVF9EQkwoMCk7CiAgICAgY29uZmlnLT50aHJlc2hvbGRfQW1wUmVzX0ZGX2UgPSAwOwogICB9CiAKLSAgaWYgKGJpdFJhdGU9PTApIHsKKyAgaWYgKGJpdFJhdGUgPT0gMCkgewogICAgIC8qIG1hcCB2YnIgcXVhbGl0eSB0byBiaXRyYXRlICovCiAgICAgaWYgKHZick1vZGUgPCAzMCkKICAgICAgIGJpdFJhdGUgPSAyNDAwMDsKQEAgLTQ0MywzMSArNDg4LDI5IEBACiAgICAgICBiaXRSYXRlID0gNDgwMDA7CiAgICAgYml0UmF0ZSAqPSBudW1DaGFubmVsczsKICAgICAvKiBmaXggdG8gZW5hYmxlIG1vbm8gdmJyTW9kZTw0MCBAIDQ0LjEgb2YgNDhrSHogKi8KLSAgICBpZiAobnVtQ2hhbm5lbHM9PTEpIHsKLSAgICAgIGlmIChzYW1wbGVSYXRlU2JyPT00NDEwMCB8fCBzYW1wbGVSYXRlU2JyPT00ODAwMCkgewotICAgICAgICBpZiAodmJyTW9kZTw0MCkgYml0UmF0ZSA9IDMyMDAwOworICAgIGlmIChudW1DaGFubmVscyA9PSAxKSB7CisgICAgICBpZiAoc2FtcGxlUmF0ZVNiciA9PSA0NDEwMCB8fCBzYW1wbGVSYXRlU2JyID09IDQ4MDAwKSB7CisgICAgICAgIGlmICh2YnJNb2RlIDwgNDApIGJpdFJhdGUgPSAzMjAwMDsKICAgICAgIH0KICAgICB9CiAgIH0KIAotICBpZHggPSBnZXRTYnJUdW5pbmdUYWJsZUluZGV4KGJpdFJhdGUsbnVtQ2hhbm5lbHMsc2FtcGxlUmF0ZUNvcmUsIGNvcmUsIE5VTEwpOworICBpZHggPQorICAgICAgZ2V0U2JyVHVuaW5nVGFibGVJbmRleChiaXRSYXRlLCBudW1DaGFubmVscywgc2FtcGxlUmF0ZUNvcmUsIGNvcmUsIE5VTEwpOwogCiAgIGlmIChpZHggIT0gSU5WQUxJRF9UQUJMRV9JRFgpIHsKLSAgICBjb25maWctPnN0YXJ0RnJlcSAgICAgICA9IHNiclR1bmluZ1RhYmxlW2lkeF0uc3RhcnRGcmVxIDsKLSAgICBjb25maWctPnN0b3BGcmVxICAgICAgICA9IHNiclR1bmluZ1RhYmxlW2lkeF0uc3RvcEZyZXEgOworICAgIGNvbmZpZy0+c3RhcnRGcmVxID0gc2JyVHVuaW5nVGFibGVbaWR4XS5zdGFydEZyZXE7CisgICAgY29uZmlnLT5zdG9wRnJlcSA9IHNiclR1bmluZ1RhYmxlW2lkeF0uc3RvcEZyZXE7CiAgICAgaWYgKHVzZVNwZWVjaENvbmZpZykgewotICAgICAgY29uZmlnLT5zdGFydEZyZXEgICAgID0gc2JyVHVuaW5nVGFibGVbaWR4XS5zdGFydEZyZXFTcGVlY2g7Ci0gICAgICBjb25maWctPnN0b3BGcmVxICAgICAgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLnN0b3BGcmVxU3BlZWNoOworICAgICAgY29uZmlnLT5zdGFydEZyZXEgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLnN0YXJ0RnJlcVNwZWVjaDsKKyAgICAgIGNvbmZpZy0+c3RvcEZyZXEgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLnN0b3BGcmVxU3BlZWNoOwogICAgIH0KIAogICAgIC8qIEFkYXB0IHN0b3AgZnJlcXVlbmN5IGluIGNhc2Ugb2YgZG93bnNhbXBsZWQgU0JSIC0gb25seSAzMiBiYW5kcyB0aGVuICovCiAgICAgaWYgKDEgPT0gY29uZmlnLT5kb3duU2FtcGxlRmFjdG9yKSB7CiAgICAgICBJTlQgZHNTdG9wRnJlcSA9IEZES3NickVuY19HZXREb3duc2FtcGxlZFN0b3BGcmVxKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGVDb3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+c3RhcnRGcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+c3RvcEZyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5kb3duU2FtcGxlRmFjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICBzYW1wbGVSYXRlQ29yZSwgY29uZmlnLT5zdGFydEZyZXEsIGNvbmZpZy0+c3RvcEZyZXEsCisgICAgICAgICAgY29uZmlnLT5kb3duU2FtcGxlRmFjdG9yKTsKICAgICAgIGlmIChkc1N0b3BGcmVxIDwgMCkgewogICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KQEAgLTQ3NSw1MiArNTE4LDY4IEBACiAgICAgICBjb25maWctPnN0b3BGcmVxID0gZHNTdG9wRnJlcTsKICAgICB9CiAKLSAgICBjb25maWctPnNicl9ub2lzZV9iYW5kcyA9IHNiclR1bmluZ1RhYmxlW2lkeF0ubnVtTm9pc2VCYW5kcyA7Ci0gICAgaWYgKGNvcmUgPT0gQU9UX0VSX0FBQ19FTEQpCi0gICAgICBjb25maWctPmluaXRfYW1wX3Jlc19GRiA9IFNCUl9BTVBfUkVTXzFfNTsKLSAgICBjb25maWctPm5vaXNlRmxvb3JPZmZzZXQ9IHNiclR1bmluZ1RhYmxlW2lkeF0ubm9pc2VGbG9vck9mZnNldDsKKyAgICBjb25maWctPnNicl9ub2lzZV9iYW5kcyA9IHNiclR1bmluZ1RhYmxlW2lkeF0ubnVtTm9pc2VCYW5kczsKKyAgICBpZiAoY29yZSA9PSBBT1RfRVJfQUFDX0VMRCkgY29uZmlnLT5pbml0X2FtcF9yZXNfRkYgPSBTQlJfQU1QX1JFU18xXzU7CisgICAgY29uZmlnLT5ub2lzZUZsb29yT2Zmc2V0ID0gc2JyVHVuaW5nVGFibGVbaWR4XS5ub2lzZUZsb29yT2Zmc2V0OwogCi0gICAgY29uZmlnLT5hbmFfbWF4X2xldmVsICAgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLm5vaXNlTWF4TGV2ZWwgOwotICAgIGNvbmZpZy0+c3RlcmVvTW9kZSAgICAgID0gc2JyVHVuaW5nVGFibGVbaWR4XS5zdGVyZW9Nb2RlIDsKLSAgICBjb25maWctPmZyZXFTY2FsZSAgICAgICA9IHNiclR1bmluZ1RhYmxlW2lkeF0uZnJlcVNjYWxlIDsKKyAgICBjb25maWctPmFuYV9tYXhfbGV2ZWwgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLm5vaXNlTWF4TGV2ZWw7CisgICAgY29uZmlnLT5zdGVyZW9Nb2RlID0gc2JyVHVuaW5nVGFibGVbaWR4XS5zdGVyZW9Nb2RlOworICAgIGNvbmZpZy0+ZnJlcVNjYWxlID0gc2JyVHVuaW5nVGFibGVbaWR4XS5mcmVxU2NhbGU7CiAKICAgICBpZiAobnVtQ2hhbm5lbHMgPT0gMSkgewogICAgICAgLyogc3RlcmVvIGNhc2UgKi8KICAgICAgIHN3aXRjaCAoY29yZSkgewogICAgICAgICBjYXNlIEFPVF9BQUNfTEM6Ci0gICAgICAgICAgaWYgKGJpdFJhdGUgPD0gKHVzZVNwZWVjaENvbmZpZz8yNDAwMFU6MjAwMDBVKSkgewotICAgICAgICAgICAgY29uZmlnLT5mcmVxX3Jlc19maXhmaXhbMF0gPSBGUkVRX1JFU19MT1c7IC8qIHNldCBsb3cgZnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIG5vbi1zcGxpdCBmcmFtZXMgKi8KLSAgICAgICAgICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzFdID0gRlJFUV9SRVNfTE9XOyAvKiBzZXQgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBzcGxpdCBmcmFtZXMgKi8KKyAgICAgICAgICBpZiAoYml0UmF0ZSA8PSAodXNlU3BlZWNoQ29uZmlnID8gMjQwMDBVIDogMjAwMDBVKSkgeworICAgICAgICAgICAgY29uZmlnLT5mcmVxX3Jlc19maXhmaXhbMF0gPSBGUkVRX1JFU19MT1c7IC8qIHNldCBsb3cgZnJlcXVlbmN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24tc3BsaXQgZnJhbWVzICovCisgICAgICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFsxXSA9IEZSRVFfUkVTX0xPVzsgLyogc2V0IGxvdyBmcmVxdWVuY3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uIGZvciBzcGxpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcyAqLwogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKICAgICAgICAgICBpZiAoYml0UmF0ZSA8IDM2MDAwKQotICAgICAgICAgICAgY29uZmlnLT5mcmVxX3Jlc19maXhmaXhbMV0gPSBGUkVRX1JFU19MT1c7IC8qIHNldCBsb3cgZnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIHNwbGl0IGZyYW1lcyAqLworICAgICAgICAgICAgY29uZmlnLT5mcmVxX3Jlc19maXhmaXhbMV0gPSBGUkVRX1JFU19MT1c7IC8qIHNldCBsb3cgZnJlcXVlbmN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiBmb3Igc3BsaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXMgKi8KICAgICAgICAgICBpZiAoYml0UmF0ZSA8IDI2MDAwKSB7Ci0gICAgICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFswXSA9IEZSRVFfUkVTX0xPVzsgLyogc2V0IGxvdyBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3Igbm9uLXNwbGl0IGZyYW1lcyAqLwotICAgICAgICAgICAgY29uZmlnLT5mUmVzVHJhbnNJc0xvdyA9IDE7ICAgICAgICAgICAgICAgIC8qIGZvciB0cmFuc2llbnQgZnJhbWVzLCBzZXQgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uICovCisgICAgICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFswXSA9IEZSRVFfUkVTX0xPVzsgLyogc2V0IGxvdyBmcmVxdWVuY3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1zcGxpdCBmcmFtZXMgKi8KKyAgICAgICAgICAgIGNvbmZpZy0+ZlJlc1RyYW5zSXNMb3cgPQorICAgICAgICAgICAgICAgIDE7IC8qIGZvciB0cmFuc2llbnQgZnJhbWVzLCBzZXQgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uICovCiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgLyogc3RlcmVvIGNhc2UgKi8KICAgICAgIHN3aXRjaCAoY29yZSkgewogICAgICAgICBjYXNlIEFPVF9BQUNfTEM6CiAgICAgICAgICAgaWYgKGJpdFJhdGUgPD0gMjgwMDApIHsKLSAgICAgICAgICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzBdID0gRlJFUV9SRVNfTE9XOyAvKiBzZXQgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBub24tc3BsaXQgZnJhbWVzICovCi0gICAgICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFsxXSA9IEZSRVFfUkVTX0xPVzsgLyogc2V0IGxvdyBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3Igc3BsaXQgZnJhbWVzICovCisgICAgICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFswXSA9IEZSRVFfUkVTX0xPVzsgLyogc2V0IGxvdyBmcmVxdWVuY3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1zcGxpdCBmcmFtZXMgKi8KKyAgICAgICAgICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzFdID0gRlJFUV9SRVNfTE9XOyAvKiBzZXQgbG93IGZyZXF1ZW5jeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gZm9yIHNwbGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzICovCiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgogICAgICAgICAgIGlmIChiaXRSYXRlIDwgNzIwMDApIHsKLSAgICAgICAgICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzFdID0gRlJFUV9SRVNfTE9XOyAvKiBzZXQgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBzcGxpdCBmcmFtZXMgKi8KKyAgICAgICAgICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzFdID0gRlJFUV9SRVNfTE9XOyAvKiBzZXQgbG93IGZyZXF1ZW5jeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gZm9yIHNwbGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzICovCiAgICAgICAgICAgfQogICAgICAgICAgIGlmIChiaXRSYXRlIDwgNTIwMDApIHsKLSAgICAgICAgICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzBdID0gRlJFUV9SRVNfTE9XOyAvKiBzZXQgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBub24tc3BsaXQgZnJhbWVzICovCi0gICAgICAgICAgICBjb25maWctPmZSZXNUcmFuc0lzTG93ID0gMTsgICAgICAgICAgICAgICAgLyogZm9yIHRyYW5zaWVudCBmcmFtZXMsIHNldCBsb3cgZnJlcXVlbmN5IHJlc29sdXRpb24gKi8KKyAgICAgICAgICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzBdID0gRlJFUV9SRVNfTE9XOyAvKiBzZXQgbG93IGZyZXF1ZW5jeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLXNwbGl0IGZyYW1lcyAqLworICAgICAgICAgICAgY29uZmlnLT5mUmVzVHJhbnNJc0xvdyA9CisgICAgICAgICAgICAgICAgMTsgLyogZm9yIHRyYW5zaWVudCBmcmFtZXMsIHNldCBsb3cgZnJlcXVlbmN5IHJlc29sdXRpb24gKi8KICAgICAgICAgICB9CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC01MzUsMjQgKzU5NCwyMiBAQAogICAgICAgfQogICAgIH0KIAotICAgIC8qIGFkanVzdCB1c2FnZSBvZiBwYXJhbWV0cmljIGNvZGluZyBkZXBlbmRlbnQgb24gYml0cmF0ZSBhbmQgc3BlZWNoIGNvbmZpZyBmbGFnICovCi0gICAgaWYgKHVzZVNwZWVjaENvbmZpZykKLSAgICAgIGNvbmZpZy0+cGFyYW1ldHJpY0NvZGluZyAgPSAwOworICAgIC8qIGFkanVzdCB1c2FnZSBvZiBwYXJhbWV0cmljIGNvZGluZyBkZXBlbmRlbnQgb24gYml0cmF0ZSBhbmQgc3BlZWNoIGNvbmZpZworICAgICAqIGZsYWcgKi8KKyAgICBpZiAodXNlU3BlZWNoQ29uZmlnKSBjb25maWctPnBhcmFtZXRyaWNDb2RpbmcgPSAwOwogCiAgICAgaWYgKGNvcmUgPT0gQU9UX0VSX0FBQ19FTEQpIHsKLSAgICAgIGlmIChiaXRSYXRlIDwgMjgwMDApCi0gICAgICAgIGNvbmZpZy0+aW5pdF9hbXBfcmVzX0ZGID0gU0JSX0FNUF9SRVNfM18wOworICAgICAgaWYgKGJpdFJhdGUgPCAyODAwMCkgY29uZmlnLT5pbml0X2FtcF9yZXNfRkYgPSBTQlJfQU1QX1JFU18zXzA7CiAgICAgICBjb25maWctPlNlbmRIZWFkZXJEYXRhVGltZSA9IC0xOwogICAgIH0KIAogICAgIGlmIChudW1DaGFubmVscyA9PSAxKSB7CiAgICAgICBpZiAoYml0UmF0ZSA8IDE2MDAwKSB7Ci0gICAgICAgIGNvbmZpZy0+cGFyYW1ldHJpY0NvZGluZyAgPSAwOworICAgICAgICBjb25maWctPnBhcmFtZXRyaWNDb2RpbmcgPSAwOwogICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgaWYgKGJpdFJhdGUgPCAyMDAwMCkgewotICAgICAgICBjb25maWctPnBhcmFtZXRyaWNDb2RpbmcgID0gMDsKKyAgICAgICAgY29uZmlnLT5wYXJhbWV0cmljQ29kaW5nID0gMDsKICAgICAgIH0KICAgICB9CiAKQEAgLTU2MSwxNyArNjE4LDE2IEBACiAgICAgLyogUFMgc2V0dGluZ3MgKi8KICAgICBjb25maWctPmJQYXJhbWV0cmljU3RlcmVvID0gYlBhcmFtZXRyaWNTdGVyZW87CiAKLSAgICByZXR1cm4gMSA7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgcmV0dXJuIDAgOworICAgIHJldHVybiAxOworICB9IGVsc2UgeworICAgIHJldHVybiAwOwogICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgZnVuY3Rpb25uYW1lOiBGREtzYnJFbmNfSW5pdGlhbGl6ZVNickRlZmF1bHRzCi0gZGVzY3JpcHRpb246ICBpbml0aWFsaXplcyB0aGUgU0JSIGNvbmZpZnVyYXRpb24KKyBkZXNjcmlwdGlvbjogIGluaXRpYWxpemVzIHRoZSBTQlIgY29uZmlndXJhdGlvbgogIHJldHVybnM6ICAgICAgZXJyb3Igc3RhdHVzCiAgaW5wdXQ6ICAgICAgICAtIGNvcmUgY29kZWMgdHlwZSwKICAgICAgICAgICAgICAgIC0gZmFjdG9yIG9mIFNCUiB0byBjb3JlIGZyYW1lIGxlbmd0aCwKQEAgLTU3OSw3NyArNjM1LDc0IEBACiAgb3V0cHV0OiAgICAgICBpbml0aWFsaXplZCBTQlIgY29uZmlndXJhdGlvbgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBVSU5UCi1GREtzYnJFbmNfSW5pdGlhbGl6ZVNickRlZmF1bHRzIChzYnJDb25maWd1cmF0aW9uUHRyIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgZG93blNhbXBsZUZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgY29kZWNHcmFudWxlTGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxjb25zdCBJTlQgICAgICAgICAgIGlzTG93RGVsYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICBpZiAoIChkb3duU2FtcGxlRmFjdG9yIDwgMSB8fCBkb3duU2FtcGxlRmFjdG9yID4gMikgfHwKLSAgICAgICAgIChjb2RlY0dyYW51bGVMZW4qZG93blNhbXBsZUZhY3RvciA+IFFNRl9DSEFOTkVMUypRTUZfTUFYX1RJTUVfU0xPVFMpICkKLSAgICAgICByZXR1cm4oMCk7IC8qIGVycm9yICovCitzdGF0aWMgVUlOVCBGREtzYnJFbmNfSW5pdGlhbGl6ZVNickRlZmF1bHRzKHNickNvbmZpZ3VyYXRpb25QdHIgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZG93blNhbXBsZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBjb2RlY0dyYW51bGVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBpc0xvd0RlbGF5KSB7CisgIGlmICgoZG93blNhbXBsZUZhY3RvciA8IDEgfHwgZG93blNhbXBsZUZhY3RvciA+IDIpIHx8CisgICAgICAoY29kZWNHcmFudWxlTGVuICogZG93blNhbXBsZUZhY3RvciA+IDY0ICogMzIpKQorICAgIHJldHVybiAoMCk7IC8qIGVycm9yICovCiAKLSAgICBjb25maWctPlNlbmRIZWFkZXJEYXRhVGltZSAgICAgPSAxMDAwOwotICAgIGNvbmZpZy0+dXNlV2F2ZUNvZGluZyAgICAgICAgICA9IDA7Ci0gICAgY29uZmlnLT5jcmNTYnIgICAgICAgICAgICAgICAgID0gMDsKLSAgICBjb25maWctPmR5bkJ3U3VwcG9ydGVkICAgICAgICAgPSAxOwotICAgIGlmIChpc0xvd0RlbGF5KQotICAgICAgY29uZmlnLT50cmFuX3RociAgICAgICAgICAgICA9IDYwMDA7Ci0gICAgZWxzZQotICAgICAgY29uZmlnLT50cmFuX3RociAgICAgICAgICAgICA9IDEzMDAwOworICBjb25maWctPlNlbmRIZWFkZXJEYXRhVGltZSA9IDEwMDA7CisgIGNvbmZpZy0+dXNlV2F2ZUNvZGluZyA9IDA7CisgIGNvbmZpZy0+Y3JjU2JyID0gMDsKKyAgY29uZmlnLT5keW5Cd1N1cHBvcnRlZCA9IDE7CisgIGlmIChpc0xvd0RlbGF5KQorICAgIGNvbmZpZy0+dHJhbl90aHIgPSA2MDAwOworICBlbHNlCisgICAgY29uZmlnLT50cmFuX3RociA9IDEzMDAwOwogCi0gICAgY29uZmlnLT5wYXJhbWV0cmljQ29kaW5nICAgICAgID0gMTsKKyAgY29uZmlnLT5wYXJhbWV0cmljQ29kaW5nID0gMTsKIAotICAgIGNvbmZpZy0+c2JyRnJhbWVTaXplICAgICAgICAgICA9IGNvZGVjR3JhbnVsZUxlbiAqIGRvd25TYW1wbGVGYWN0b3I7Ci0gICAgY29uZmlnLT5kb3duU2FtcGxlRmFjdG9yICAgICAgID0gZG93blNhbXBsZUZhY3RvcjsKKyAgY29uZmlnLT5zYnJGcmFtZVNpemUgPSBjb2RlY0dyYW51bGVMZW4gKiBkb3duU2FtcGxlRmFjdG9yOworICBjb25maWctPmRvd25TYW1wbGVGYWN0b3IgPSBkb3duU2FtcGxlRmFjdG9yOwogCi0gICAgLyogc2JyIGRlZmF1bHQgcGFyYW1ldGVycyAqLwotICAgIGNvbmZpZy0+c2JyX2RhdGFfZXh0cmEgICAgICAgICA9IDA7Ci0gICAgY29uZmlnLT5hbXBfcmVzICAgICAgICAgICAgICAgID0gU0JSX0FNUF9SRVNfM18wIDsKLSAgICBjb25maWctPnRyYW5fZmMgICAgICAgICAgICAgICAgPSAwIDsKLSAgICBjb25maWctPnRyYW5fZGV0X21vZGUgICAgICAgICAgPSAxIDsKLSAgICBjb25maWctPnNwcmVhZCAgICAgICAgICAgICAgICAgPSAxIDsKLSAgICBjb25maWctPnN0YXQgICAgICAgICAgICAgICAgICAgPSAwIDsKLSAgICBjb25maWctPmUgICAgICAgICAgICAgICAgICAgICAgPSAxIDsKLSAgICBjb25maWctPmRlbHRhVEFjcm9zc0ZyYW1lcyAgICAgPSAxIDsKLSAgICBjb25maWctPmRGX2VkZ2VfMXN0RW52ICAgICAgICAgPSBGTDJGWENPTlNUX0RCTCgwLjNmKSA7Ci0gICAgY29uZmlnLT5kRl9lZGdlX2luY3IgICAgICAgICAgID0gRkwyRlhDT05TVF9EQkwoMC4zZikgOworICAvKiBzYnIgZGVmYXVsdCBwYXJhbWV0ZXJzICovCisgIGNvbmZpZy0+c2JyX2RhdGFfZXh0cmEgPSAwOworICBjb25maWctPmFtcF9yZXMgPSBTQlJfQU1QX1JFU18zXzA7CisgIGNvbmZpZy0+dHJhbl9mYyA9IDA7CisgIGNvbmZpZy0+dHJhbl9kZXRfbW9kZSA9IDE7CisgIGNvbmZpZy0+c3ByZWFkID0gMTsKKyAgY29uZmlnLT5zdGF0ID0gMDsKKyAgY29uZmlnLT5lID0gMTsKKyAgY29uZmlnLT5kZWx0YVRBY3Jvc3NGcmFtZXMgPSAxOworICBjb25maWctPmRGX2VkZ2VfMXN0RW52ID0gRkwyRlhDT05TVF9EQkwoMC4zZik7CisgIGNvbmZpZy0+ZEZfZWRnZV9pbmNyID0gRkwyRlhDT05TVF9EQkwoMC4zZik7CiAKLSAgICBjb25maWctPnNicl9pbnZmX21vZGUgICA9IElOVkZfU1dJVENIRUQ7Ci0gICAgY29uZmlnLT5zYnJfeHBvc19tb2RlICAgPSBYUE9TX0xDOwotICAgIGNvbmZpZy0+c2JyX3hwb3NfY3RybCAgID0gU0JSX1hQT1NfQ1RSTF9ERUZBVUxUOwotICAgIGNvbmZpZy0+c2JyX3hwb3NfbGV2ZWwgID0gMDsKLSAgICBjb25maWctPnVzZVNhUGFuICAgICAgICA9IDA7Ci0gICAgY29uZmlnLT5keW5Cd0VuYWJsZWQgICAgPSAwOworICBjb25maWctPnNicl9pbnZmX21vZGUgPSBJTlZGX1NXSVRDSEVEOworICBjb25maWctPnNicl94cG9zX21vZGUgPSBYUE9TX0xDOworICBjb25maWctPnNicl94cG9zX2N0cmwgPSBTQlJfWFBPU19DVFJMX0RFRkFVTFQ7CisgIGNvbmZpZy0+c2JyX3hwb3NfbGV2ZWwgPSAwOworICBjb25maWctPnVzZVNhUGFuID0gMDsKKyAgY29uZmlnLT5keW5Cd0VuYWJsZWQgPSAwOwogCisgIC8qIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgb3ZlcndyaXR0ZW4gYnkgdGhlCisgICAgIEZES3NickVuY19BZGp1c3RTYnJTZXR0aW5ncygpIGZ1bmN0aW9uIHNpbmNlIHRoZXkgYXJlIGluY2x1ZGVkIGluIHRoZQorICAgICB0dW5pbmcgdGFibGUgKi8KKyAgY29uZmlnLT5zdGVyZW9Nb2RlID0gU0JSX1NXSVRDSF9MUkM7CisgIGNvbmZpZy0+YW5hX21heF9sZXZlbCA9IDY7CisgIGNvbmZpZy0+bm9pc2VGbG9vck9mZnNldCA9IDA7CisgIGNvbmZpZy0+c3RhcnRGcmVxID0gNTsgLyogIDUuOSByZXNwZWN0aXZlbHkgIDYuMCBrSHogYXQgZnMgPSA0NC4xLzQ4IGtIeiAqLworICBjb25maWctPnN0b3BGcmVxID0gOTsgIC8qIDE2LjIgcmVzcGVjdGl2ZWx5IDE2Ljgga0h6IGF0IGZzID0gNDQuMS80OCBrSHogKi8KKyAgY29uZmlnLT5mcmVxX3Jlc19maXhmaXhbMF0gPSBGUkVRX1JFU19ISUdIOyAvKiBub24tc3BsaXQgY2FzZSAqLworICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFsxXSA9IEZSRVFfUkVTX0hJR0g7IC8qIHNwbGl0IGNhc2UgKi8KKyAgY29uZmlnLT5mUmVzVHJhbnNJc0xvdyA9IDA7IC8qIGZvciB0cmFuc2llbnQgZnJhbWVzLCBzZXQgdmFyaWFibGUgZnJlcXVlbmN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uIGFjY29yZGluZyB0byBmcmVxUmVzVGFibGUgKi8KIAotICAgIC8qIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgb3ZlcndyaXR0ZW4gYnkgdGhlIEZES3NickVuY19BZGp1c3RTYnJTZXR0aW5ncygpIGZ1bmN0aW9uIHNpbmNlCi0gICAgICAgdGhleSBhcmUgaW5jbHVkZWQgaW4gdGhlIHR1bmluZyB0YWJsZSAqLwotICAgIGNvbmZpZy0+c3RlcmVvTW9kZSAgICAgICAgICAgICA9IFNCUl9TV0lUQ0hfTFJDOwotICAgIGNvbmZpZy0+YW5hX21heF9sZXZlbCAgICAgICAgICA9IDY7Ci0gICAgY29uZmlnLT5ub2lzZUZsb29yT2Zmc2V0ICAgICAgID0gMDsKLSAgICBjb25maWctPnN0YXJ0RnJlcSAgICAgICAgICAgICAgPSA1OyAvKiAgNS45IHJlc3BlY3RpdmVseSAgNi4wIGtIeiBhdCBmcyA9IDQ0LjEvNDgga0h6ICovCi0gICAgY29uZmlnLT5zdG9wRnJlcSAgICAgICAgICAgICAgID0gOTsgLyogMTYuMiByZXNwZWN0aXZlbHkgMTYuOCBrSHogYXQgZnMgPSA0NC4xLzQ4IGtIeiAqLwotICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzBdICAgICA9IEZSRVFfUkVTX0hJR0g7ICAvKiBub24tc3BsaXQgY2FzZSAqLwotICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzFdICAgICA9IEZSRVFfUkVTX0hJR0g7ICAvKiBzcGxpdCBjYXNlICovCi0gICAgY29uZmlnLT5mUmVzVHJhbnNJc0xvdyA9IDA7ICAvKiBmb3IgdHJhbnNpZW50IGZyYW1lcywgc2V0IHZhcmlhYmxlIGZyZXF1ZW5jeSByZXNvbHV0aW9uIGFjY29yZGluZyB0byBmcmVxUmVzVGFibGUgKi8KKyAgLyogaGVhZGVyX2V4dHJhXzEgKi8KKyAgY29uZmlnLT5mcmVxU2NhbGUgPSBTQlJfRlJFUV9TQ0FMRV9ERUZBVUxUOworICBjb25maWctPmFsdGVyU2NhbGUgPSBTQlJfQUxURVJfU0NBTEVfREVGQVVMVDsKKyAgY29uZmlnLT5zYnJfbm9pc2VfYmFuZHMgPSBTQlJfTk9JU0VfQkFORFNfREVGQVVMVDsKIAotICAgIC8qIGhlYWRlcl9leHRyYV8xICovCi0gICAgY29uZmlnLT5mcmVxU2NhbGUgICAgICAgPSBTQlJfRlJFUV9TQ0FMRV9ERUZBVUxUOwotICAgIGNvbmZpZy0+YWx0ZXJTY2FsZSAgICAgID0gU0JSX0FMVEVSX1NDQUxFX0RFRkFVTFQ7Ci0gICAgY29uZmlnLT5zYnJfbm9pc2VfYmFuZHMgPSBTQlJfTk9JU0VfQkFORFNfREVGQVVMVDsKKyAgLyogaGVhZGVyX2V4dHJhXzIgKi8KKyAgY29uZmlnLT5zYnJfbGltaXRlcl9iYW5kcyA9IFNCUl9MSU1JVEVSX0JBTkRTX0RFRkFVTFQ7CisgIGNvbmZpZy0+c2JyX2xpbWl0ZXJfZ2FpbnMgPSBTQlJfTElNSVRFUl9HQUlOU19ERUZBVUxUOworICBjb25maWctPnNicl9pbnRlcnBvbF9mcmVxID0gU0JSX0lOVEVSUE9MX0ZSRVFfREVGQVVMVDsKKyAgY29uZmlnLT5zYnJfc21vb3RoaW5nX2xlbmd0aCA9IFNCUl9TTU9PVEhJTkdfTEVOR1RIX0RFRkFVTFQ7CiAKLSAgICAvKiBoZWFkZXJfZXh0cmFfMiAqLwotICAgIGNvbmZpZy0+c2JyX2xpbWl0ZXJfYmFuZHMgICAgPSBTQlJfTElNSVRFUl9CQU5EU19ERUZBVUxUOwotICAgIGNvbmZpZy0+c2JyX2xpbWl0ZXJfZ2FpbnMgICAgPSBTQlJfTElNSVRFUl9HQUlOU19ERUZBVUxUOwotICAgIGNvbmZpZy0+c2JyX2ludGVycG9sX2ZyZXEgICAgPSBTQlJfSU5URVJQT0xfRlJFUV9ERUZBVUxUOwotICAgIGNvbmZpZy0+c2JyX3Ntb290aGluZ19sZW5ndGggPSBTQlJfU01PT1RISU5HX0xFTkdUSF9ERUZBVUxUOwotCi0gICAgcmV0dXJuIDE7CisgIHJldHVybiAxOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgZnVuY3Rpb25uYW1lOiBEZWxldGVFbnZDaGFubmVsCkBAIC02NTksMTkgKzcxMiwxNCBAQAogIG91dHB1dDogICAgICAgcmVsZWFzZWQgaGFuZGxlCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWRlbGV0ZUVudkNoYW5uZWwgKEhBTkRMRV9FTlZfQ0hBTk5FTCBoRW52Q3V0KQoteworc3RhdGljIHZvaWQgZGVsZXRlRW52Q2hhbm5lbChIQU5ETEVfRU5WX0NIQU5ORUwgaEVudkN1dCkgewogICBpZiAoaEVudkN1dCkgewotCiAgICAgRkRLc2JyRW5jX0RlbGV0ZVRvbkNvcnJQYXJhbUV4dHIoJmhFbnZDdXQtPlRvbkNvcnIpOwogCi0gICAgRkRLc2JyRW5jX2RlbGV0ZUV4dHJhY3RTYnJFbnZlbG9wZSAoJmhFbnZDdXQtPnNickV4dHJhY3RFbnZlbG9wZSk7CisgICAgRkRLc2JyRW5jX2RlbGV0ZUV4dHJhY3RTYnJFbnZlbG9wZSgmaEVudkN1dC0+c2JyRXh0cmFjdEVudmVsb3BlKTsKICAgfQotCiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICBmdW5jdGlvbm5hbWU6IHNickVuY29kZXJfQ2hhbm5lbENsb3NlCkBAIC02ODEsMTIgKzcyOSw5IEBACiAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1zYnJFbmNvZGVyX0NoYW5uZWxDbG9zZShIQU5ETEVfU0JSX0NIQU5ORUwgaFNickNoYW5uZWwpCi17Ci0gIGlmIChoU2JyQ2hhbm5lbCAhPSBOVUxMKQotICB7Ci0gICAgZGVsZXRlRW52Q2hhbm5lbCAoJmhTYnJDaGFubmVsLT5oRW52Q2hhbm5lbCk7CitzdGF0aWMgdm9pZCBzYnJFbmNvZGVyX0NoYW5uZWxDbG9zZShIQU5ETEVfU0JSX0NIQU5ORUwgaFNickNoYW5uZWwpIHsKKyAgaWYgKGhTYnJDaGFubmVsICE9IE5VTEwpIHsKKyAgICBkZWxldGVFbnZDaGFubmVsKCZoU2JyQ2hhbm5lbC0+aEVudkNoYW5uZWwpOwogICB9CiB9CiAKQEAgLTY5OSw2NyArNzQ0LDYwIEBACiAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1zYnJFbmNvZGVyX0VsZW1lbnRDbG9zZShIQU5ETEVfU0JSX0VMRU1FTlQgKnBoU2JyRWxlbWVudCkKLXsKK3N0YXRpYyB2b2lkIHNickVuY29kZXJfRWxlbWVudENsb3NlKEhBTkRMRV9TQlJfRUxFTUVOVCAqcGhTYnJFbGVtZW50KSB7CiAgIEhBTkRMRV9TQlJfRUxFTUVOVCBoU2JyRWxlbWVudCA9ICpwaFNickVsZW1lbnQ7CiAKLSAgaWYgKGhTYnJFbGVtZW50IT1OVUxMKSB7CisgIGlmIChoU2JyRWxlbWVudCAhPSBOVUxMKSB7CiAgICAgaWYgKGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnZfa19tYXN0ZXIpCiAgICAgICBGcmVlUmFtX1Nicl92X2tfbWFzdGVyKCZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS52X2tfbWFzdGVyKTsKICAgICBpZiAoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtMT10pCi0gICAgICBGcmVlUmFtX1Nicl9mcmVxQmFuZFRhYmxlTE8oJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmZyZXFCYW5kVGFibGVbTE9dKTsKKyAgICAgIEZyZWVSYW1fU2JyX2ZyZXFCYW5kVGFibGVMTygKKyAgICAgICAgICAmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtMT10pOwogICAgIGlmIChoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmVxQmFuZFRhYmxlW0hJXSkKLSAgICAgIEZyZWVSYW1fU2JyX2ZyZXFCYW5kVGFibGVISSgmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtISV0pOworICAgICAgRnJlZVJhbV9TYnJfZnJlcUJhbmRUYWJsZUhJKAorICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmVxQmFuZFRhYmxlW0hJXSk7CiAKICAgICBGcmVlUmFtX1NickVsZW1lbnQocGhTYnJFbGVtZW50KTsKICAgfQotICByZXR1cm4gOwotCisgIHJldHVybjsKIH0KIAotCi12b2lkIHNickVuY29kZXJfQ2xvc2UgKEhBTkRMRV9TQlJfRU5DT0RFUiAqcGhTYnJFbmNvZGVyKQotewordm9pZCBzYnJFbmNvZGVyX0Nsb3NlKEhBTkRMRV9TQlJfRU5DT0RFUiAqcGhTYnJFbmNvZGVyKSB7CiAgIEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2RlciA9ICpwaFNickVuY29kZXI7CiAKLSAgaWYgKGhTYnJFbmNvZGVyICE9IE5VTEwpCi0gIHsKKyAgaWYgKGhTYnJFbmNvZGVyICE9IE5VTEwpIHsKICAgICBpbnQgZWwsIGNoOwogCi0gICAgZm9yIChlbD0wOyBlbDwoOCk7IGVsKyspCi0gICAgewotICAgICAgaWYgKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXSE9TlVMTCkgeworICAgIGZvciAoZWwgPSAwOyBlbCA8ICg4KTsgZWwrKykgeworICAgICAgaWYgKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXSAhPSBOVUxMKSB7CiAgICAgICAgIHNickVuY29kZXJfRWxlbWVudENsb3NlKCZoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0pOwogICAgICAgfQogICAgIH0KIAogICAgIC8qIENsb3NlIHNiciBDaGFubmVscyAqLwotICAgIGZvciAoY2g9MDsgY2g8KDgpOyBjaCsrKQotICAgIHsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCAoOCk7IGNoKyspIHsKICAgICAgIGlmIChoU2JyRW5jb2Rlci0+cFNickNoYW5uZWxbY2hdKSB7CiAgICAgICAgIHNickVuY29kZXJfQ2hhbm5lbENsb3NlKGhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFtjaF0pOwogICAgICAgICBGcmVlUmFtX1NickNoYW5uZWwoJmhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFtjaF0pOwogICAgICAgfQogCiAgICAgICBpZiAoaFNickVuY29kZXItPlFtZkFuYWx5c2lzW2NoXS5GaWx0ZXJTdGF0ZXMpCi0gICAgICAgIEZyZWVSYW1fU2JyX1FtZlN0YXRlc0FuYWx5c2lzKChGSVhQX1FBUyoqKSZoU2JyRW5jb2Rlci0+UW1mQW5hbHlzaXNbY2hdLkZpbHRlclN0YXRlcyk7Ci0KLQorICAgICAgICBGcmVlUmFtX1Nicl9RbWZTdGF0ZXNBbmFseXNpcygKKyAgICAgICAgICAgIChGSVhQX1FBUyAqKikmaFNickVuY29kZXItPlFtZkFuYWx5c2lzW2NoXS5GaWx0ZXJTdGF0ZXMpOwogICAgIH0KIAogICAgIGlmIChoU2JyRW5jb2Rlci0+aFBhcmFtZXRyaWNTdGVyZW8pCiAgICAgICBQU0VuY19EZXN0cm95KCZoU2JyRW5jb2Rlci0+aFBhcmFtZXRyaWNTdGVyZW8pOwogICAgIGlmIChoU2JyRW5jb2Rlci0+cW1mU3ludGhlc2lzUFMuRmlsdGVyU3RhdGVzKQotICAgICAgRnJlZVJhbV9Qc1FtZlN0YXRlc1N5bnRoZXNpcygoRklYUF9EQkwqKikmaFNickVuY29kZXItPnFtZlN5bnRoZXNpc1BTLkZpbHRlclN0YXRlcyk7CisgICAgICBGcmVlUmFtX1BzUW1mU3RhdGVzU3ludGhlc2lzKAorICAgICAgICAgIChGSVhQX0RCTCAqKikmaFNickVuY29kZXItPnFtZlN5bnRoZXNpc1BTLkZpbHRlclN0YXRlcyk7CiAKICAgICAvKiBSZWxlYXNlIE92ZXJsYXkgKi8KLSAgICBGcmVlUmFtX1NickR5bmFtaWNfUkFNKChGSVhQX0RCTCoqKSZoU2JyRW5jb2Rlci0+cFNCUmR5bmFtaWNfUkFNKTsKLQorICAgIGlmIChoU2JyRW5jb2Rlci0+cFNCUmR5bmFtaWNfUkFNKQorICAgICAgRnJlZVJhbV9TYnJEeW5hbWljX1JBTSgoRklYUF9EQkwgKiopJmhTYnJFbmNvZGVyLT5wU0JSZHluYW1pY19SQU0pOwogCiAgICAgRnJlZVJhbV9TYnJFbmNvZGVyKHBoU2JyRW5jb2Rlcik7CiAgIH0KLQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTc3MSw2NyArODA5LDQ0IEBACiAgb3V0cHV0OiAgICAgICBlcnJvciBpbmZvCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVCB1cGRhdGVGcmVxQmFuZFRhYmxlKAotICAgICAgICBIQU5ETEVfU0JSX0NPTkZJR19EQVRBICBzYnJDb25maWdEYXRhLAotICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBICBzYnJIZWFkZXJEYXRhLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICBkb3duU2FtcGxlRmFjdG9yCi0gICAgICAgICkKLXsKK3N0YXRpYyBJTlQgdXBkYXRlRnJlcUJhbmRUYWJsZShIQU5ETEVfU0JSX0NPTkZJR19EQVRBIHNickNvbmZpZ0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBkb3duU2FtcGxlRmFjdG9yKSB7CiAgIElOVCBrMCwgazI7CiAKLSAgaWYoIEZES3NickVuY19GaW5kU3RhcnRBbmRTdG9wQmFuZCAoCi0gICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEsCi0gICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEgPj4gKGRvd25TYW1wbGVGYWN0b3ItMSksCi0gICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm5vUW1mQmFuZHMsCi0gICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPnNicl9zdGFydF9mcmVxdWVuY3ksCi0gICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPnNicl9zdG9wX2ZyZXF1ZW5jeSwKLSAgICAgICAgICAgICAmazAsCi0gICAgICAgICAgICAgJmsyCi0gICAgICAgICAgICAgICkKLSAgICApCi0gICAgcmV0dXJuKDEpOworICBpZiAoRkRLc2JyRW5jX0ZpbmRTdGFydEFuZFN0b3BCYW5kKAorICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEsCisgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+c2FtcGxlRnJlcSA+PiAoZG93blNhbXBsZUZhY3RvciAtIDEpLAorICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm5vUW1mQmFuZHMsIHNickhlYWRlckRhdGEtPnNicl9zdGFydF9mcmVxdWVuY3ksCisgICAgICAgICAgc2JySGVhZGVyRGF0YS0+c2JyX3N0b3BfZnJlcXVlbmN5LCAmazAsICZrMikpCisgICAgcmV0dXJuICgxKTsKIAorICBpZiAoRkRLc2JyRW5jX1VwZGF0ZUZyZXFTY2FsZSgKKyAgICAgICAgICBzYnJDb25maWdEYXRhLT52X2tfbWFzdGVyLCAmc2JyQ29uZmlnRGF0YS0+bnVtX01hc3RlciwgazAsIGsyLAorICAgICAgICAgIHNickhlYWRlckRhdGEtPmZyZXFTY2FsZSwgc2JySGVhZGVyRGF0YS0+YWx0ZXJTY2FsZSkpCisgICAgcmV0dXJuICgxKTsKIAotICBpZiggRkRLc2JyRW5jX1VwZGF0ZUZyZXFTY2FsZSgKLSAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+dl9rX21hc3RlciwKLSAgICAgICAgICAgICAmc2JyQ29uZmlnRGF0YS0+bnVtX01hc3RlciwKLSAgICAgICAgICAgICAgazAsCi0gICAgICAgICAgICAgIGsyLAotICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5mcmVxU2NhbGUsCi0gICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPmFsdGVyU2NhbGUKLSAgICAgICAgICAgICAgKQotICAgICkKLSAgICByZXR1cm4oMSk7CisgIHNickhlYWRlckRhdGEtPnNicl94b3Zlcl9iYW5kID0gMDsKIAotCi0gIHNickhlYWRlckRhdGEtPnNicl94b3Zlcl9iYW5kPTA7Ci0KLQotICBpZiggRkRLc2JyRW5jX1VwZGF0ZUhpUmVzKAotICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5mcmVxQmFuZFRhYmxlW0hJXSwKLSAgICAgICAgICAgICAgJnNickNvbmZpZ0RhdGEtPm5TZmJbSEldLAotICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT52X2tfbWFzdGVyLAotICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5udW1fTWFzdGVyLAotICAgICAgICAgICAgICAmc2JySGVhZGVyRGF0YS0+c2JyX3hvdmVyX2JhbmQKLSAgICAgICAgICAgICAgKQotICAgICkKLSAgICByZXR1cm4oMSk7Ci0KKyAgaWYgKEZES3NickVuY19VcGRhdGVIaVJlcyhzYnJDb25maWdEYXRhLT5mcmVxQmFuZFRhYmxlW0hJXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2JyQ29uZmlnRGF0YS0+blNmYltISV0sIHNickNvbmZpZ0RhdGEtPnZfa19tYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bnVtX01hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2JySGVhZGVyRGF0YS0+c2JyX3hvdmVyX2JhbmQpKQorICAgIHJldHVybiAoMSk7CiAKICAgRkRLc2JyRW5jX1VwZGF0ZUxvUmVzKAotICAgICAgICAgIHNickNvbmZpZ0RhdGEtPmZyZXFCYW5kVGFibGVbTE9dLAotICAgICAgICAgICZzYnJDb25maWdEYXRhLT5uU2ZiW0xPXSwKLSAgICAgICAgICBzYnJDb25maWdEYXRhLT5mcmVxQmFuZFRhYmxlW0hJXSwKLSAgICAgICAgICBzYnJDb25maWdEYXRhLT5uU2ZiW0hJXQotICAgICAgICAgICk7CisgICAgICBzYnJDb25maWdEYXRhLT5mcmVxQmFuZFRhYmxlW0xPXSwgJnNickNvbmZpZ0RhdGEtPm5TZmJbTE9dLAorICAgICAgc2JyQ29uZmlnRGF0YS0+ZnJlcUJhbmRUYWJsZVtISV0sIHNickNvbmZpZ0RhdGEtPm5TZmJbSEldKTsKIAotCi0gIHNickNvbmZpZ0RhdGEtPnhPdmVyRnJlcSA9IChzYnJDb25maWdEYXRhLT5mcmVxQmFuZFRhYmxlW0xPV19SRVNdWzBdICogc2JyQ29uZmlnRGF0YS0+c2FtcGxlRnJlcSAvIHNickNvbmZpZ0RhdGEtPm5vUW1mQmFuZHMrMSk+PjE7CisgIHNickNvbmZpZ0RhdGEtPnhPdmVyRnJlcSA9CisgICAgICAoc2JyQ29uZmlnRGF0YS0+ZnJlcUJhbmRUYWJsZVtMT1dfUkVTXVswXSAqIHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEgLworICAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzICsKKyAgICAgICAxKSA+PgorICAgICAgMTsKIAogICByZXR1cm4gKDApOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgZnVuY3Rpb25uYW1lOiByZXNldEVudkNoYW5uZWwKQEAgLTg0MSwyNyArODU2LDI2IEBACiAgb3V0cHV0OiAgICAgICBoRW52CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVCByZXNldEVudkNoYW5uZWwgKEhBTkRMRV9TQlJfQ09ORklHX0RBVEEgIHNickNvbmZpZ0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSAgc2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgICAgICBoRW52KQotewotICAvKiBub3RlICEhISBoRW52LT5lbmNFbnZEYXRhLm5vT2Zub2lzZWJhbmRzIHdpbGwgYmUgdXBkYXRlZCBsYXRlciBpbiBmdW5jdGlvbiBGREtzYnJFbmNfZXh0cmFjdFNickVudmVsb3BlICEhISovCi0gIGhFbnYtPlRvbkNvcnIuc2JyTm9pc2VGbG9vckVzdGltYXRlLm5vaXNlQmFuZHMgPSAgc2JySGVhZGVyRGF0YS0+c2JyX25vaXNlX2JhbmRzOworc3RhdGljIElOVCByZXNldEVudkNoYW5uZWwoSEFORExFX1NCUl9DT05GSUdfREFUQSBzYnJDb25maWdEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0VOVl9DSEFOTkVMIGhFbnYpIHsKKyAgLyogbm90ZSAhISEgaEVudi0+ZW5jRW52RGF0YS5ub09mbm9pc2ViYW5kcyB3aWxsIGJlIHVwZGF0ZWQgbGF0ZXIgaW4gZnVuY3Rpb24KKyAgICogRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZSAhISEqLworICBoRW52LT5Ub25Db3JyLnNick5vaXNlRmxvb3JFc3RpbWF0ZS5ub2lzZUJhbmRzID0KKyAgICAgIHNickhlYWRlckRhdGEtPnNicl9ub2lzZV9iYW5kczsKIAorICBpZiAoRkRLc2JyRW5jX1Jlc2V0VG9uQ29yclBhcmFtRXh0cigKKyAgICAgICAgICAmaEVudi0+VG9uQ29yciwgc2JyQ29uZmlnRGF0YS0+eHBvc0N0cmxTd2l0Y2gsCisgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+ZnJlcUJhbmRUYWJsZVtISV1bMF0sIHNickNvbmZpZ0RhdGEtPnZfa19tYXN0ZXIsCisgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bnVtX01hc3Rlciwgc2JyQ29uZmlnRGF0YS0+c2FtcGxlRnJlcSwKKyAgICAgICAgICBzYnJDb25maWdEYXRhLT5mcmVxQmFuZFRhYmxlLCBzYnJDb25maWdEYXRhLT5uU2ZiLAorICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm5vUW1mQmFuZHMpKQorICAgIHJldHVybiAoMSk7CiAKLSAgaWYoRkRLc2JyRW5jX1Jlc2V0VG9uQ29yclBhcmFtRXh0cigmaEVudi0+VG9uQ29yciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnhwb3NDdHJsU3dpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+ZnJlcUJhbmRUYWJsZVtISV1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT52X2tfbWFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bnVtX01hc3RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5mcmVxQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+blNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm5vUW1mQmFuZHMpKQotICAgIHJldHVybigxKTsKLQotICBoRW52LT5zYnJDb2RlTm9pc2VGbG9vci5uU2ZiW0xPXSA9IGhFbnYtPlRvbkNvcnIuc2JyTm9pc2VGbG9vckVzdGltYXRlLm5vTm9pc2VCYW5kczsKLSAgaEVudi0+c2JyQ29kZU5vaXNlRmxvb3IublNmYltISV0gPSBoRW52LT5Ub25Db3JyLnNick5vaXNlRmxvb3JFc3RpbWF0ZS5ub05vaXNlQmFuZHM7CisgIGhFbnYtPnNickNvZGVOb2lzZUZsb29yLm5TZmJbTE9dID0KKyAgICAgIGhFbnYtPlRvbkNvcnIuc2JyTm9pc2VGbG9vckVzdGltYXRlLm5vTm9pc2VCYW5kczsKKyAgaEVudi0+c2JyQ29kZU5vaXNlRmxvb3IublNmYltISV0gPQorICAgICAgaEVudi0+VG9uQ29yci5zYnJOb2lzZUZsb29yRXN0aW1hdGUubm9Ob2lzZUJhbmRzOwogCiAgIGhFbnYtPnNickNvZGVFbnZlbG9wZS5uU2ZiW0xPXSA9IHNickNvbmZpZ0RhdGEtPm5TZmJbTE9dOwogICBoRW52LT5zYnJDb2RlRW52ZWxvcGUublNmYltISV0gPSBzYnJDb25maWdEYXRhLT5uU2ZiW0hJXTsKQEAgLTg3NCwxNiArODg4LDE3IEBACiAgIHJldHVybiAoMCk7CiB9CiAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBGREtzYnJFbmNfU2JyR2V0WE92ZXJGcmVxICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBGREtzYnJFbmNfU2JyR2V0WE92ZXJGcmVxCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioKICAqIEBmbgogICogQGJyaWVmICAgICAgIGNhbGN1bGF0ZXMgdGhlIGNsb3Nlc3QgcG9zc2libGUgY3Jvc3NvdmVyIGZyZXF1ZW5jeQogICogQHJldHVybiAgICAgIHRoZSBjcm9zc292ZXIgZnJlcXVlbmN5IFNCUiBhY2NlcHRzCiAgKgogICovCi1zdGF0aWMgSU5UCi1GREtzYnJFbmNfU2JyR2V0WE92ZXJGcmVxKEhBTkRMRV9TQlJfRUxFTUVOVCAgaEVudiwgICAgICAgIC8qITwgaGFuZGxlIHRvIFNCUiBlbmNvZGVyIGluc3RhbmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgeG92ZXJGcmVxKSAgIC8qITwgZnJvbSBjb3JlIGNvZGVyIHN1Z2dlc3RlZCBjcm9zc292ZXIgZnJlcXVlbmN5ICovCitzdGF0aWMgSU5UIEZES3NickVuY19TYnJHZXRYT3ZlckZyZXEoCisgICAgSEFORExFX1NCUl9FTEVNRU5UIGhFbnYsIC8qITwgaGFuZGxlIHRvIFNCUiBlbmNvZGVyIGluc3RhbmNlICovCisgICAgSU5UIHhvdmVyRnJlcSkgLyohPCBmcm9tIGNvcmUgY29kZXIgc3VnZ2VzdGVkIGNyb3Nzb3ZlciBmcmVxdWVuY3kgKi8KIHsKICAgSU5UIGJhbmQ7CiAgIElOVCBsYXN0RGlmZiwgbmV3RGlmZjsKQEAgLTg5MiwxMyArOTA3LDE1IEBACiAgIFVDSEFSICpSRVNUUklDVCBwVktNYXN0ZXIgPSBoRW52LT5zYnJDb25maWdEYXRhLnZfa19tYXN0ZXI7CiAKICAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgYSBtYXRjaGluZyBjdXRvZmYgZnJlcXVlbmN5IGluIHRoZSBtYXN0ZXIgdGFibGUgKi8KLSAgY3V0b2ZmU2IgPSAoNCp4b3ZlckZyZXEgKiBoRW52LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMgLyBoRW52LT5zYnJDb25maWdEYXRhLnNhbXBsZUZyZXEgKyAxKT4+MTsKKyAgY3V0b2ZmU2IgPSAoNCAqIHhvdmVyRnJlcSAqIGhFbnYtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcyAvCisgICAgICAgICAgICAgICAgICBoRW52LT5zYnJDb25maWdEYXRhLnNhbXBsZUZyZXEgKworICAgICAgICAgICAgICAxKSA+PgorICAgICAgICAgICAgIDE7CiAgIGxhc3REaWZmID0gY3V0b2ZmU2I7CiAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBoRW52LT5zYnJDb25maWdEYXRhLm51bV9NYXN0ZXI7IGJhbmQrKykgewotCiAgICAgbmV3RGlmZiA9IGZpeHBfYWJzKChJTlQpcFZLTWFzdGVyW2JhbmRdIC0gY3V0b2ZmU2IpOwogCi0gICAgaWYobmV3RGlmZiA+PSBsYXN0RGlmZikgeworICAgIGlmIChuZXdEaWZmID49IGxhc3REaWZmKSB7CiAgICAgICBiYW5kLS07CiAgICAgICBicmVhazsKICAgICB9CkBAIC05MDYsNyArOTIzLDEwIEBACiAgICAgbGFzdERpZmYgPSBuZXdEaWZmOwogICB9CiAKLSAgcmV0dXJuICgocFZLTWFzdGVyW2JhbmRdICogaEVudi0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxL2hFbnYtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcysxKT4+MSk7CisgIHJldHVybiAoKHBWS01hc3RlcltiYW5kXSAqIGhFbnYtPnNickNvbmZpZ0RhdGEuc2FtcGxlRnJlcSAvCisgICAgICAgICAgICAgICBoRW52LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMgKworICAgICAgICAgICAxKSA+PgorICAgICAgICAgIDEpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTkxOCwzMiArOTM4LDI3IEBACiAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUlOVAotRkRLc2JyRW5jX0VudkVuY29kZUZyYW1lKEhBTkRMRV9TQlJfRU5DT0RFUiAgIGhFbnZFbmNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGlFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgICAgICAgKnNhbXBsZXMsICAgICAgICAgICAgICAgICAvKiE8IHRpbWUgc2FtcGxlcywgYWx3YXlzIGludGVybGVhdmVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLCAgICAgICAgICAgIC8qITwgdGltZSBidWZmZXIgY2hhbm5lbCBpbnRlcmxlYXZpbmcgc3RyaWRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAqc2JyRGF0YUJpdHMsICAgICAgICAgICAgIC8qITwgU2l6ZSBvZiBTQlIgcGF5bG9hZCAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICpzYnJEYXRhLCAgICAgICAgICAgICAgICAgLyohPCBTQlIgcGF5bG9hZCAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBjbGVhck91dHB1dCAgICAgICAgICAgICAgLyohPCBEbyBub3QgY29uc2lkZXIgYW55IGlucHV0IHNpZ25hbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKQoteworSU5UIEZES3NickVuY19FbnZFbmNvZGVGcmFtZSgKKyAgICBIQU5ETEVfU0JSX0VOQ09ERVIgaEVudkVuY29kZXIsIGludCBpRWxlbWVudCwKKyAgICBJTlRfUENNICpzYW1wbGVzLCAgICAvKiE8IHRpbWUgc2FtcGxlcywgYWx3YXlzIGRlaW50ZXJsZWF2ZWQgKi8KKyAgICBVSU5UIHNhbXBsZXNCdWZTaXplLCAvKiE8IHRpbWUgYnVmZmVyIGNoYW5uZWwgc3RyaWRlICovCisgICAgVUlOVCAqc2JyRGF0YUJpdHMsICAgLyohPCBTaXplIG9mIFNCUiBwYXlsb2FkICAqLworICAgIFVDSEFSICpzYnJEYXRhLCAgICAgIC8qITwgU0JSIHBheWxvYWQgICovCisgICAgaW50IGNsZWFyT3V0cHV0ICAgICAgLyohPCBEbyBub3QgY29uc2lkZXIgYW55IGlucHV0IHNpZ25hbCAqLworKSB7CiAgIEhBTkRMRV9TQlJfRUxFTUVOVCBoU2JyRWxlbWVudCA9IE5VTEw7Ci0gIEZES19DUkNJTkZPICBjcmNJbmZvOwotICBJTlQgICAgY3JjUmVnOwotICBJTlQgICAgY2g7Ci0gIElOVCAgICBiYW5kOwotICBJTlQgICAgY3V0b2ZmU2I7Ci0gIElOVCAgICBuZXdYT3ZlcjsKKyAgRkRLX0NSQ0lORk8gY3JjSW5mbzsKKyAgSU5UIGNyY1JlZzsKKyAgSU5UIGNoOworICBJTlQgYmFuZDsKKyAgSU5UIGN1dG9mZlNiOworICBJTlQgbmV3WE92ZXI7CiAKLSAgaWYgKGhFbnZFbmNvZGVyID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOworICBpZiAoaEVudkVuY29kZXIgPT0gTlVMTCkgcmV0dXJuIC0xOwogCiAgIGhTYnJFbGVtZW50ID0gaEVudkVuY29kZXItPnNickVsZW1lbnRbaUVsZW1lbnRdOwogCi0gIGlmIChoU2JyRWxlbWVudCA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQorICBpZiAoaFNickVsZW1lbnQgPT0gTlVMTCkgcmV0dXJuIC0xOwogCiAgIC8qIGhlYWRlciBiaXRzdHJlYW0gaGFuZGxpbmcgKi8KICAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSBzYnJCaXRzdHJlYW1EYXRhID0gJmhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhOwpAQCAtOTUxLDMzICs5NjYsMzMgQEAKICAgSU5UIHBzSGVhZGVyQWN0aXZlID0gMDsKICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlID0gMDsKIAotICAvKiBBbnRpY2lwYXRlIFBTIGhlYWRlciBiZWNhdXNlIG9mIGludGVybmFsIFBTIGJpdHN0cmVhbSBkZWxheSBpbiBvcmRlciB0byBiZSBpbiBzeW5jIHdpdGggU0JSIGhlYWRlci4gKi8KLSAgaWYgKCBzYnJCaXRzdHJlYW1EYXRhLT5Db3VudFNlbmRIZWFkZXJEYXRhPT0oc2JyQml0c3RyZWFtRGF0YS0+TnJTZW5kSGVhZGVyRGF0YS0xKSApCi0gIHsKLSAgICAgIHBzSGVhZGVyQWN0aXZlID0gMTsKKyAgLyogQW50aWNpcGF0ZSBQUyBoZWFkZXIgYmVjYXVzZSBvZiBpbnRlcm5hbCBQUyBiaXRzdHJlYW0gZGVsYXkgaW4gb3JkZXIgdG8gYmUKKyAgICogaW4gc3luYyB3aXRoIFNCUiBoZWFkZXIuICovCisgIGlmIChzYnJCaXRzdHJlYW1EYXRhLT5Db3VudFNlbmRIZWFkZXJEYXRhID09CisgICAgICAoc2JyQml0c3RyZWFtRGF0YS0+TnJTZW5kSGVhZGVyRGF0YSAtIDEpKSB7CisgICAgcHNIZWFkZXJBY3RpdmUgPSAxOwogICB9CiAKICAgLyogU2lnbmFsIFNCUiBoZWFkZXIgdG8gYmUgd3JpdHRlbiBpbnRvIGJpdHN0cmVhbSAqLwotICBpZiAoIHNickJpdHN0cmVhbURhdGEtPkNvdW50U2VuZEhlYWRlckRhdGE9PTAgICkKLSAgewotICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUgPSAxOworICBpZiAoc2JyQml0c3RyZWFtRGF0YS0+Q291bnRTZW5kSGVhZGVyRGF0YSA9PSAwKSB7CisgICAgc2JyQml0c3RyZWFtRGF0YS0+SGVhZGVyQWN0aXZlID0gMTsKICAgfQogCiAgIC8qIEluY3JlbWVudCBoZWFkZXIgaW50ZXJ2YWwgY291bnRlciAqLwogICBpZiAoc2JyQml0c3RyZWFtRGF0YS0+TnJTZW5kSGVhZGVyRGF0YSA9PSAwKSB7CiAgICAgc2JyQml0c3RyZWFtRGF0YS0+Q291bnRTZW5kSGVhZGVyRGF0YSA9IDE7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgaWYgKHNickJpdHN0cmVhbURhdGEtPkNvdW50U2VuZEhlYWRlckRhdGEgPj0gMCkgewogICAgICAgc2JyQml0c3RyZWFtRGF0YS0+Q291bnRTZW5kSGVhZGVyRGF0YSsrOwotICAgICAgc2JyQml0c3RyZWFtRGF0YS0+Q291bnRTZW5kSGVhZGVyRGF0YSAlPSBzYnJCaXRzdHJlYW1EYXRhLT5OclNlbmRIZWFkZXJEYXRhOworICAgICAgc2JyQml0c3RyZWFtRGF0YS0+Q291bnRTZW5kSGVhZGVyRGF0YSAlPQorICAgICAgICAgIHNickJpdHN0cmVhbURhdGEtPk5yU2VuZEhlYWRlckRhdGE7CiAgICAgfQogICB9CiAKLSAgaWYgKGhTYnJFbGVtZW50LT5DbW9uRGF0YS5keW5Cd0VuYWJsZWQgKSB7CisgIGlmIChoU2JyRWxlbWVudC0+Q21vbkRhdGEuZHluQndFbmFibGVkKSB7CiAgICAgSU5UIGk7Ci0gICAgZm9yICggaSA9IDQ7IGkgPiAwOyBpLS0gKQotICAgICAgaFNickVsZW1lbnQtPmR5blhPdmVyRnJlcURlbGF5W2ldID0gaFNickVsZW1lbnQtPmR5blhPdmVyRnJlcURlbGF5W2ktMV07CisgICAgZm9yIChpID0gNDsgaSA+IDA7IGktLSkKKyAgICAgIGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVtpXSA9IGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVtpIC0gMV07CiAKICAgICBoU2JyRWxlbWVudC0+ZHluWE92ZXJGcmVxRGVsYXlbMF0gPSBoU2JyRWxlbWVudC0+Q21vbkRhdGEuZHluWE92ZXJGcmVxRW5jOwogICAgIGlmIChoU2JyRWxlbWVudC0+ZHluWE92ZXJGcmVxRGVsYXlbMV0gPiBoU2JyRWxlbWVudC0+ZHluWE92ZXJGcmVxRGVsYXlbMl0pCkBAIC05ODYsNDEgKzEwMDEsMzggQEAKICAgICAgIG5ld1hPdmVyID0gaFNickVsZW1lbnQtPmR5blhPdmVyRnJlcURlbGF5WzFdOwogCiAgICAgLyogaGFzIHRoZSBjcm9zc292ZXIgZnJlcXVlbmN5IGNoYW5nZWQ/ICovCi0gICAgaWYgKCBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5keW5YT3ZlckZyZXEgIT0gbmV3WE92ZXIgKSB7Ci0KKyAgICBpZiAoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZHluWE92ZXJGcmVxICE9IG5ld1hPdmVyKSB7CiAgICAgICAvKiBnZXQgY29ycmVzcG9uZGluZyBtYXN0ZXIgYmFuZCAqLwotICAgICAgY3V0b2ZmU2IgPSAoKDQqIG5ld1hPdmVyICogaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcwotICAgICAgICAgICAgICAgICAgLyBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxKSsxKT4+MTsKKyAgICAgIGN1dG9mZlNiID0gKCg0ICogbmV3WE92ZXIgKiBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzIC8KKyAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxKSArCisgICAgICAgICAgICAgICAgICAxKSA+PgorICAgICAgICAgICAgICAgICAxOwogCi0gICAgICBmb3IgKCBiYW5kID0gMDsgYmFuZCA8IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm51bV9NYXN0ZXI7IGJhbmQrKyApIHsKLSAgICAgICAgaWYgKCBjdXRvZmZTYiA9PSBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS52X2tfbWFzdGVyW2JhbmRdICkKLSAgICAgICAgICBicmVhazsKKyAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5udW1fTWFzdGVyOyBiYW5kKyspIHsKKyAgICAgICAgaWYgKGN1dG9mZlNiID09IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnZfa19tYXN0ZXJbYmFuZF0pIGJyZWFrOwogICAgICAgfQotICAgICAgRkRLX0FTU0VSVCggYmFuZCA8IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm51bV9NYXN0ZXIgKTsKKyAgICAgIEZES19BU1NFUlQoYmFuZCA8IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm51bV9NYXN0ZXIpOwogCiAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5keW5YT3ZlckZyZXEgPSBuZXdYT3ZlcjsKICAgICAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl94b3Zlcl9iYW5kID0gYmFuZDsKLSAgICAgIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLkhlYWRlckFjdGl2ZT0xOworICAgICAgaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuSGVhZGVyQWN0aXZlID0gMTsKICAgICAgIHBzSGVhZGVyQWN0aXZlID0gMTsgLyogcHMgaGVhZGVyIGlzIG9uZSBmcmFtZSBkZWxheWVkICovCiAKICAgICAgIC8qCiAgICAgICAgIHVwZGF0ZSB2a19tYXN0ZXIgdGFibGUKICAgICAgICovCi0gICAgICBpZih1cGRhdGVGcmVxQmFuZFRhYmxlKCZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52RW5jb2Rlci0+ZG93blNhbXBsZUZhY3RvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQotICAgICAgICByZXR1cm4oMSk7Ci0KKyAgICAgIGlmICh1cGRhdGVGcmVxQmFuZFRhYmxlKCZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZFbmNvZGVyLT5kb3duU2FtcGxlRmFjdG9yKSkKKyAgICAgICAgcmV0dXJuICgxKTsKIAogICAgICAgLyogcmVzZXQgU0JSIGNoYW5uZWxzICovCiAgICAgICBJTlQgbkVudkNoID0gaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzOwotICAgICAgZm9yICggY2ggPSAwOyBjaCA8IG5FbnZDaDsgY2grKyApIHsKLSAgICAgICAgaWYocmVzZXRFbnZDaGFubmVsICgmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEsCisgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuRW52Q2g7IGNoKyspIHsKKyAgICAgICAgaWYgKHJlc2V0RW52Q2hhbm5lbCgmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JyQ2hhbm5lbFtjaF0tPmhFbnZDaGFubmVsKSkKLSAgICAgICAgICByZXR1cm4oMSk7Ci0KKyAgICAgICAgICByZXR1cm4gKDEpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMTAyOCwxMSArMTA0MCwxMSBAQAogICAvKgogICAgIGFsbG9jYXRlIHNwYWNlIGZvciBkdW1teSBoZWFkZXIgYW5kIGNyYwogICAqLwotICBjcmNSZWcgPSBGREtzYnJFbmNfSW5pdFNickJpdHN0cmVhbSgmaFNickVsZW1lbnQtPkNtb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVbaEVudkVuY29kZXItPm5CaXRzdHJEZWxheV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUEFZTE9BRF9TSVpFKnNpemVvZihVQ0hBUiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2JyU3ludGF4RmxhZ3MpOworICBjcmNSZWcgPSBGREtzYnJFbmNfSW5pdFNickJpdHN0cmVhbSgKKyAgICAgICZoU2JyRWxlbWVudC0+Q21vbkRhdGEsCisgICAgICBoU2JyRWxlbWVudC0+cGF5bG9hZERlbGF5TGluZVtoRW52RW5jb2Rlci0+bkJpdHN0ckRlbGF5XSwKKyAgICAgIE1BWF9QQVlMT0FEX1NJWkUgKiBzaXplb2YoVUNIQVIpLCAmY3JjSW5mbywKKyAgICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzKTsKIAogICAvKiBUZW1wb3JhbCBFbnZlbG9wZSBEYXRhICovCiAgIFNCUl9GUkFNRV9URU1QX0RBVEEgX2ZEYXRhOwpAQCAtMTA0Nyw2MSArMTA1OSw0NyBAQAogICAgIEZES21lbWNsZWFyKCZlRGF0YVsxXSwgc2l6ZW9mKFNCUl9FTlZfVEVNUF9EQVRBKSk7CiAgICAgRkRLbWVtY2xlYXIoZkRhdGEsIHNpemVvZihTQlJfRlJBTUVfVEVNUF9EQVRBKSk7CiAKLSAgICBmb3IoaT0wOyBpPE1BWF9OVU1fTk9JU0VfVkFMVUVTOyBpKyspCi0gICAgICBmRGF0YS0+cmVzW2ldID0gRlJFUV9SRVNfSElHSDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9OT0lTRV9WQUxVRVM7IGkrKykgZkRhdGEtPnJlc1tpXSA9IEZSRVFfUkVTX0hJR0g7CiAgIH0KIAotCi0gIGlmICghY2xlYXJPdXRwdXQpCi0gIHsKKyAgaWYgKCFjbGVhck91dHB1dCkgewogICAgIC8qCiAgICAgICogVHJhbnNmb3JtIGF1ZGlvIGRhdGEgaW50byBRTUYgZG9tYWluCiAgICAgICovCi0gICAgZm9yKGNoID0gMDsgY2ggPCBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHM7IGNoKyspCi0gICAgeworICAgIGZvciAoY2ggPSAwOyBjaCA8IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5DaGFubmVsczsgY2grKykgewogICAgICAgSEFORExFX0VOVl9DSEFOTkVMIGhfZW52Q2hhbiA9ICZoU2JyRWxlbWVudC0+c2JyQ2hhbm5lbFtjaF0tPmhFbnZDaGFubmVsOwogICAgICAgSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFIHNickV4dHJFbnYgPSAmaF9lbnZDaGFuLT5zYnJFeHRyYWN0RW52ZWxvcGU7CiAKLSAgICAgIGlmKGhTYnJFbGVtZW50LT5lbEluZm8uZlBhcmFtZXRyaWNTdGVyZW8gPT0gMCkKLSAgICAgIHsKKyAgICAgIGlmIChoU2JyRWxlbWVudC0+ZWxJbmZvLmZQYXJhbWV0cmljU3RlcmVvID09IDApIHsKICAgICAgICAgUU1GX1NDQUxFX0ZBQ1RPUiB0bXBTY2FsZTsKICAgICAgICAgRklYUF9EQkwgKipwUW1mUmVhbCwgKipwUW1mSW1hZzsKLSAgICAgICAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChxbWZXb3JrQnVmZmVyLCBGSVhQX0RCTCwgUU1GX0NIQU5ORUxTKjIpCi0KKyAgICAgICAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChxbWZXb3JrQnVmZmVyLCBGSVhQX0RCTCwgNjQgKiAyKQogCiAgICAgICAgIC8qIE9idGFpbiBwb2ludGVycyB0byBRTUYgYnVmZmVycy4gKi8KICAgICAgICAgcFFtZlJlYWwgPSBzYnJFeHRyRW52LT5yQnVmZmVyOwogICAgICAgICBwUW1mSW1hZyA9IHNickV4dHJFbnYtPmlCdWZmZXI7CiAKLSAgICAgICAgcW1mQW5hbHlzaXNGaWx0ZXJpbmcoIGhTYnJFbGVtZW50LT5oUW1mQW5hbHlzaXNbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBRbWZJbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRWxlbWVudC0+ZWxJbmZvLkNoYW5uZWxJbmRleFtjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFtZldvcmtCdWZmZXIgKTsKKyAgICAgICAgcW1mQW5hbHlzaXNGaWx0ZXJpbmcoCisgICAgICAgICAgICBoU2JyRWxlbWVudC0+aFFtZkFuYWx5c2lzW2NoXSwgcFFtZlJlYWwsIHBRbWZJbWFnLCAmdG1wU2NhbGUsCisgICAgICAgICAgICBzYW1wbGVzICsgaFNickVsZW1lbnQtPmVsSW5mby5DaGFubmVsSW5kZXhbY2hdICogc2FtcGxlc0J1ZlNpemUsIDAsCisgICAgICAgICAgICAxLCBxbWZXb3JrQnVmZmVyKTsKIAogICAgICAgICBoX2VudkNoYW4tPnFtZlNjYWxlID0gdG1wU2NhbGUubGJfc2NhbGUgKyA3OwogCi0KLSAgICAgICAgQ19BQUxMT0NfU0NSQVRDSF9FTkQocW1mV29ya0J1ZmZlciwgRklYUF9EQkwsIFFNRl9DSEFOTkVMUyoyKQorICAgICAgICBDX0FBTExPQ19TQ1JBVENIX0VORChxbWZXb3JrQnVmZmVyLCBGSVhQX0RCTCwgNjQgKiAyKQogCiAgICAgICB9IC8qIGZQYXJhbWV0cmljU3RlcmVvID09IDAgKi8KIAotCiAgICAgICAvKgogICAgICAgICBQYXJhbWV0cmljIFN0ZXJlbyBwcm9jZXNzaW5nCiAgICAgICAqLwotICAgICAgaWYgKGhTYnJFbGVtZW50LT5lbEluZm8uZlBhcmFtZXRyaWNTdGVyZW8pCi0gICAgICB7CisgICAgICBpZiAoaFNickVsZW1lbnQtPmVsSW5mby5mUGFyYW1ldHJpY1N0ZXJlbykgewogICAgICAgICBJTlQgZXJyb3IgPSBub0Vycm9yOwogCi0KICAgICAgICAgLyogTGltaXQgUGFyYW1ldHJpYyBTdGVyZW8gdG8gb25lIGluc3RhbmNlICovCiAgICAgICAgIEZES19BU1NFUlQoY2ggPT0gMCk7CiAKLQotICAgICAgICBpZihlcnJvciA9PSBub0Vycm9yKXsKKyAgICAgICAgaWYgKGVycm9yID09IG5vRXJyb3IpIHsKICAgICAgICAgICAvKiBwYXJhbWV0cmljIHN0ZXJlbyBwcm9jZXNzaW5nOgogICAgICAgICAgICAgIC0gaW5wdXQ6CiAgICAgICAgICAgICAgICBvIGxlZnQgYW5kIHJpZ2h0IHRpbWUgZG9tYWluIHNhbXBsZXMKQEAgLTExMTEsMjggKzExMDksMjIgQEAKICAgICAgICAgICAgICAgIG8gcHMgcGFyYW1ldGVyIGV4dHJhY3Rpb24KICAgICAgICAgICAgICAgIG8gZG93bm1peCArIGh5YnJpZCBzeW50aGVzaXMKICAgICAgICAgICAgICAtIG91dHB1dDoKLSAgICAgICAgICAgICAgIG8gZG93bm1peGVkIHFtZiBkYXRhIGlzIHdyaXR0ZW4gdG8gc2JyRXh0ckVudi0+ckJ1ZmZlciBhbmQgc2JyRXh0ckVudi0+aUJ1ZmZlcgorICAgICAgICAgICAgICAgbyBkb3dubWl4ZWQgcW1mIGRhdGEgaXMgd3JpdHRlbiB0byBzYnJFeHRyRW52LT5yQnVmZmVyIGFuZAorICAgICAgICAgICAgIHNickV4dHJFbnYtPmlCdWZmZXIKICAgICAgICAgICAqLwogICAgICAgICAgIFNDSEFSIHFtZlNjYWxlOwotICAgICAgICAgIElOVF9QQ00qIHBTYW1wbGVzWzJdID0ge3NhbXBsZXMgKyBoU2JyRWxlbWVudC0+ZWxJbmZvLkNoYW5uZWxJbmRleFswXSxzYW1wbGVzICsgaFNickVsZW1lbnQtPmVsSW5mby5DaGFubmVsSW5kZXhbMV19OwotICAgICAgICAgIGVycm9yID0gRkRLc2JyRW5jX1BTRW5jX1BhcmFtZXRyaWNTdGVyZW9Qcm9jZXNzaW5nKCBoRW52RW5jb2Rlci0+aFBhcmFtZXRyaWNTdGVyZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lSW5TdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbGVtZW50LT5oUW1mQW5hbHlzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPnJCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPmlCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRWxlbWVudC0+ZWxJbmZvLkNoYW5uZWxJbmRleFtjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnZFbmNvZGVyLT5xbWZTeW50aGVzaXNQUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcW1mU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzSGVhZGVyQWN0aXZlICk7Ci0gICAgICAgICAgaWYgKG5vRXJyb3IgIT0gZXJyb3IpCi0gICAgICAgICAgewotICAgICAgICAgICAgZXJyb3IgPSBoYW5kQmFjayhlcnJvcik7Ci0gICAgICAgICAgfQorICAgICAgICAgIElOVF9QQ00gKnBTYW1wbGVzWzJdID0geworICAgICAgICAgICAgICBzYW1wbGVzICsgaFNickVsZW1lbnQtPmVsSW5mby5DaGFubmVsSW5kZXhbMF0gKiBzYW1wbGVzQnVmU2l6ZSwKKyAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbGVtZW50LT5lbEluZm8uQ2hhbm5lbEluZGV4WzFdICogc2FtcGxlc0J1ZlNpemV9OworICAgICAgICAgIGVycm9yID0gRkRLc2JyRW5jX1BTRW5jX1BhcmFtZXRyaWNTdGVyZW9Qcm9jZXNzaW5nKAorICAgICAgICAgICAgICBoRW52RW5jb2Rlci0+aFBhcmFtZXRyaWNTdGVyZW8sIHBTYW1wbGVzLCBzYW1wbGVzQnVmU2l6ZSwKKyAgICAgICAgICAgICAgaFNickVsZW1lbnQtPmhRbWZBbmFseXNpcywgc2JyRXh0ckVudi0+ckJ1ZmZlciwKKyAgICAgICAgICAgICAgc2JyRXh0ckVudi0+aUJ1ZmZlciwKKyAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbGVtZW50LT5lbEluZm8uQ2hhbm5lbEluZGV4W2NoXSAqIHNhbXBsZXNCdWZTaXplLAorICAgICAgICAgICAgICAmaEVudkVuY29kZXItPnFtZlN5bnRoZXNpc1BTLCAmcW1mU2NhbGUsIHBzSGVhZGVyQWN0aXZlKTsKICAgICAgICAgICBoX2VudkNoYW4tPnFtZlNjYWxlID0gKGludClxbWZTY2FsZTsKICAgICAgICAgfQogCi0KICAgICAgIH0gLyogaWYgKGhFbnZFbmNvZGVyLT5oUGFyYW1ldHJpY1N0ZXJlbykgKi8KIAogICAgICAgLyoKQEAgLTExNDAsODQgKzExMzIsMTUwIEBACiAgICAgICAgICBFeHRyYWN0IEVudmVsb3BlIHJlbGV2YW50IHRoaW5ncyBmcm9tIFFNRiBkYXRhCiAKICAgICAgICovCi0gICAgICBGREtzYnJFbmNfZXh0cmFjdFNickVudmVsb3BlMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5DbW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVEYXRhW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZEYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZTEoJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLCBoX2VudkNoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPkNtb25EYXRhLCAmZURhdGFbY2hdLCBmRGF0YSk7CiAKICAgICB9IC8qIGhFbnZFbmNvZGVyLT5zYnJDb25maWdEYXRhLm5DaGFubmVscyAqLwotIH0KKyAgfQogCiAgIC8qCi0gICAgIFByb2Nlc3MgRW52ZWxvcGUgcmVsZXZhbnQgdGhpbmdzIGFuZCBjYWxjdWxhdGUgZW52ZWxvcGUgZGF0YSBhbmQgd3JpdGUgcGF5bG9hZAorICAgICBQcm9jZXNzIEVudmVsb3BlIHJlbGV2YW50IHRoaW5ncyBhbmQgY2FsY3VsYXRlIGVudmVsb3BlIGRhdGEgYW5kIHdyaXRlCisgICAgIHBheWxvYWQKICAgKi8KICAgRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZTIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaFNickVsZW1lbnQtPmVsSW5mby5mUGFyYW1ldHJpY1N0ZXJlbykgPyBoRW52RW5jb2Rlci0+aFBhcmFtZXRyaWNTdGVyZW8gOiBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JyQ2hhbm5lbFswXS0+aEVudkNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JyQ2hhbm5lbFsxXS0+aEVudkNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+Q21vbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJPdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLCAmaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEsCisgICAgICAoaFNickVsZW1lbnQtPmVsSW5mby5mUGFyYW1ldHJpY1N0ZXJlbykgPyBoRW52RW5jb2Rlci0+aFBhcmFtZXRyaWNTdGVyZW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEwsCisgICAgICAmaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEsICZoU2JyRWxlbWVudC0+c2JyQ2hhbm5lbFswXS0+aEVudkNoYW5uZWwsCisgICAgICAoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc3RlcmVvTW9kZSAhPSBTQlJfTU9OTykKKyAgICAgICAgICA/ICZoU2JyRWxlbWVudC0+c2JyQ2hhbm5lbFsxXS0+aEVudkNoYW5uZWwKKyAgICAgICAgICA6IE5VTEwsCisgICAgICAmaFNickVsZW1lbnQtPkNtb25EYXRhLCBlRGF0YSwgZkRhdGEsIGNsZWFyT3V0cHV0KTsKKworICBoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5yaWdodEJvcmRlckZJWCA9IDA7CiAKICAgLyoKICAgICBmb3JtYXQgcGF5bG9hZCwgY2FsY3VsYXRlIGNyYwogICAqLwotICBGREtzYnJFbmNfQXNzZW1ibGVTYnJCaXRzdHJlYW0oJmhTYnJFbGVtZW50LT5DbW9uRGF0YSwgJmNyY0luZm8sIGNyY1JlZywgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2JyU3ludGF4RmxhZ3MpOworICBGREtzYnJFbmNfQXNzZW1ibGVTYnJCaXRzdHJlYW0oJmhTYnJFbGVtZW50LT5DbW9uRGF0YSwgJmNyY0luZm8sIGNyY1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzKTsKIAogICAvKgogICAgIHNhdmUgbmV3IHBheWxvYWQsIHNldCB0byB6ZXJvIGxlbmd0aCBpZiBncmVhdGVyIHRoYW4gTUFYX1BBWUxPQURfU0laRQogICAqLwotICBoU2JyRWxlbWVudC0+cGF5bG9hZERlbGF5TGluZVNpemVbaEVudkVuY29kZXItPm5CaXRzdHJEZWxheV0gPSBGREtnZXRWYWxpZEJpdHMoJmhTYnJFbGVtZW50LT5DbW9uRGF0YS5zYnJCaXRidWYpOworICBoU2JyRWxlbWVudC0+cGF5bG9hZERlbGF5TGluZVNpemVbaEVudkVuY29kZXItPm5CaXRzdHJEZWxheV0gPQorICAgICAgRkRLZ2V0VmFsaWRCaXRzKCZoU2JyRWxlbWVudC0+Q21vbkRhdGEuc2JyQml0YnVmKTsKIAotICBpZihoU2JyRWxlbWVudC0+cGF5bG9hZERlbGF5TGluZVNpemVbaEVudkVuY29kZXItPm5CaXRzdHJEZWxheV0gPiAoTUFYX1BBWUxPQURfU0laRTw8MykpCi0gICAgaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVTaXplW2hFbnZFbmNvZGVyLT5uQml0c3RyRGVsYXldPTA7CisgIGlmIChoU2JyRWxlbWVudC0+cGF5bG9hZERlbGF5TGluZVNpemVbaEVudkVuY29kZXItPm5CaXRzdHJEZWxheV0gPgorICAgICAgKE1BWF9QQVlMT0FEX1NJWkUgPDwgMykpCisgICAgaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVTaXplW2hFbnZFbmNvZGVyLT5uQml0c3RyRGVsYXldID0gMDsKIAogICAvKiBXaGlsZSBmaWxsaW5nIHRoZSBEZWxheSBsaW5lcywgc2JyRGF0YSBpcyBOVUxMICovCiAgIGlmIChzYnJEYXRhKSB7CiAgICAgKnNickRhdGFCaXRzID0gaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVTaXplWzBdOwotICAgIEZES21lbWNweShzYnJEYXRhLCBoU2JyRWxlbWVudC0+cGF5bG9hZERlbGF5TGluZVswXSwgKGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVswXSs3KT4+Myk7Ci0KLQorICAgIEZES21lbWNweShzYnJEYXRhLCBoU2JyRWxlbWVudC0+cGF5bG9hZERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgKGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVswXSArIDcpID4+IDMpOwogICB9CiAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgaWYgKGhFbnZFbmNvZGVyLT5mVGltZURvbWFpbkRvd25zYW1wbGluZykKLSAgewotICAgIGludCBjaDsKLSAgICBpbnQgbkNoYW5uZWxzID0gaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzOwotCi0gICAgZm9yIChjaD0wOyBjaCA8IG5DaGFubmVsczsgY2grKykKLSAgICB7Ci0gICAgICBJTlQgbk91dFNhbXBsZXM7Ci0KLSAgICAgIEZES2FhY0VuY19Eb3duc2FtcGxlKCZoU2JyRWxlbWVudC0+c2JyQ2hhbm5lbFtjaF0tPmRvd25TYW1wbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRWxlbWVudC0+ZWxJbmZvLkNoYW5uZWxJbmRleFtjaF0gKyBoRW52RW5jb2Rlci0+YnVmZmVyT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmZyYW1lU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lSW5TdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbGVtZW50LT5lbEluZm8uQ2hhbm5lbEluZGV4W2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZuT3V0U2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52RW5jb2Rlci0+bkNoYW5uZWxzKTsKKyAgLyogZGVsYXkgaGVhZGVyIGFjdGl2ZSBmbGFnICovCisgIGlmIChoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5IZWFkZXJBY3RpdmUgPT0gMSkgeworICAgIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLkhlYWRlckFjdGl2ZURlbGF5ID0KKyAgICAgICAgMSArIGhFbnZFbmNvZGVyLT5uQml0c3RyRGVsYXk7CisgIH0gZWxzZSB7CisgICAgaWYgKGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLkhlYWRlckFjdGl2ZURlbGF5ID4gMCkgeworICAgICAgaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuSGVhZGVyQWN0aXZlRGVsYXktLTsKICAgICB9Ci0gIH0gLyogZG93bnNhbXBsZSAqLwotCisgIH0KIAogICByZXR1cm4gKDApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAorIGZ1bmN0aW9ubmFtZTogRkRLc2JyRW5jX0Rvd25zYW1wbGUKKyBkZXNjcmlwdGlvbjogcGVyZm9ybXMgZG93bnNhbXBsaW5nIGFuZCBkZWxheSBjb21wZW5zYXRpb24gb2YgdGhlIGNvcmUgcGF0aAorIHJldHVybnM6CisgaW5wdXQ6Cisgb3V0cHV0OgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVCBGREtzYnJFbmNfRG93bnNhbXBsZSgKKyAgICBIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIsCisgICAgSU5UX1BDTSAqc2FtcGxlcywgICAgLyohPCB0aW1lIHNhbXBsZXMsIGFsd2F5cyBkZWludGVybGVhdmVkICovCisgICAgVUlOVCBzYW1wbGVzQnVmU2l6ZSwgLyohPCB0aW1lIGJ1ZmZlciBzaXplIHBlciBjaGFubmVsICovCisgICAgVUlOVCBudW1DaGFubmVscywgICAgLyohPCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICBVSU5UICpzYnJEYXRhQml0cywgICAvKiE8IFNpemUgb2YgU0JSIHBheWxvYWQgICovCisgICAgVUNIQVIgKnNickRhdGEsICAgICAgLyohPCBTQlIgcGF5bG9hZCAgKi8KKyAgICBpbnQgY2xlYXJPdXRwdXQgICAgICAvKiE8IERvIG5vdCBjb25zaWRlciBhbnkgaW5wdXQgc2lnbmFsICovCispIHsKKyAgSEFORExFX1NCUl9FTEVNRU5UIGhTYnJFbGVtZW50ID0gTlVMTDsKKyAgSU5UIG5PdXRTYW1wbGVzOworICBpbnQgZWw7CisgIGlmIChoU2JyRW5jb2Rlci0+ZG93blNhbXBsZUZhY3RvciA+IDEpIHsKKyAgICAvKiBEbyBkb3duc2FtcGxpbmcgKi8KKworICAgIC8qIExvb3Agb3ZlciBlbGVtZW50cyAoTEZFIGlzIGhhbmRsZWQgbGF0ZXIpICovCisgICAgZm9yIChlbCA9IDA7IGVsIDwgaFNickVuY29kZXItPm5vRWxlbWVudHM7IGVsKyspIHsKKyAgICAgIGhTYnJFbGVtZW50ID0gaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdOworICAgICAgaWYgKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChoU2JyRW5jb2Rlci0+ZG93bnNhbXBsaW5nTWV0aG9kID09IFNCUkVOQ19EU19USU1FKSB7CisgICAgICAgICAgaW50IGNoOworICAgICAgICAgIGludCBuQ2hhbm5lbHMgPSBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHM7CisKKyAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIEZES2FhY0VuY19Eb3duc2FtcGxlKAorICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JyQ2hhbm5lbFtjaF0tPmRvd25TYW1wbGVyLAorICAgICAgICAgICAgICAgIHNhbXBsZXMgKworICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+ZWxJbmZvLkNoYW5uZWxJbmRleFtjaF0gKiBzYW1wbGVzQnVmU2l6ZSArCisgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5idWZmZXJPZmZzZXQgLyBudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmFtZVNpemUsCisgICAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbGVtZW50LT5lbEluZm8uQ2hhbm5lbEluZGV4W2NoXSAqIHNhbXBsZXNCdWZTaXplLAorICAgICAgICAgICAgICAgICZuT3V0U2FtcGxlcyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogSGFuZGxlIExGRSAoaWYgZXhpc3RpbmcpICovCisgICAgaWYgKGhTYnJFbmNvZGVyLT5sZmVDaElkeCAhPSAtMSkgeyAvKiBsZmUgZG93bnNhbXBsZXIgKi8KKyAgICAgIEZES2FhY0VuY19Eb3duc2FtcGxlKCZoU2JyRW5jb2Rlci0+bGZlRG93blNhbXBsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzICsgaFNickVuY29kZXItPmxmZUNoSWR4ICogc2FtcGxlc0J1ZlNpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5idWZmZXJPZmZzZXQgLyBudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5mcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzICsgaFNickVuY29kZXItPmxmZUNoSWR4ICogc2FtcGxlc0J1ZlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmbk91dFNhbXBsZXMpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBObyBkb3duc2FtcGxpbmcuIFN0aWxsLCBzb21lIGJ1ZmZlciBzaGlmdGluZyBmb3IgY29ycmVjdCBkZWxheSAqLworICAgIGludCBzYW1wbGVzMkNvcHkgPSBoU2JyRW5jb2Rlci0+ZnJhbWVTaXplOworICAgIGlmIChoU2JyRW5jb2Rlci0+YnVmZmVyT2Zmc2V0IC8gKGludCludW1DaGFubmVscyA8IHNhbXBsZXMyQ29weSkgeworICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCAoaW50KW51bUNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgLyogRG8gbWVtbW92ZSB3aGlsZSB0YWtpbmcgY2FyZSBvZiBvdmVybGFwcGluZyBtZW1vcnkgYXJlYXMuIChtZW1jcHkKKyAgICAgICAgICAgZG9lcyBub3QgbmVjZXNzYXJpbHkgdGFrZSBjYXJlKSBEaXN0aW5ndWlzaCBiZXR3ZWVuIG9ldmVybGFwcGluZyBhbmQKKyAgICAgICAgICAgbm9uIG92ZXJsYXBwaW5nIHZlcnNpb24gZHVlIHRvIHJlYXNvbnMgb2YgY29tcGxleGl0eS4gKi8KKyAgICAgICAgRkRLbWVtbW92ZShzYW1wbGVzICsgYyAqIHNhbXBsZXNCdWZTaXplLAorICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBjICogc2FtcGxlc0J1ZlNpemUgKworICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+YnVmZmVyT2Zmc2V0IC8gbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgc2FtcGxlczJDb3B5ICogc2l6ZW9mKElOVF9QQ00pKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCAoaW50KW51bUNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgLyogU2ltcGxlIG1lbWNweSBzaW5jZSB0aGUgbWVtb3J5IGFyZWFzIGFyZSBub3Qgb3ZlcmxhcHBpbmcgKi8KKyAgICAgICAgRkRLbWVtY3B5KHNhbXBsZXMgKyBjICogc2FtcGxlc0J1ZlNpemUsCisgICAgICAgICAgICAgICAgICBzYW1wbGVzICsgYyAqIHNhbXBsZXNCdWZTaXplICsKKyAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+YnVmZmVyT2Zmc2V0IC8gbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICBzYW1wbGVzMkNvcHkgKiBzaXplb2YoSU5UX1BDTSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwogIGZ1bmN0aW9ubmFtZTogY3JlYXRlRW52Q2hhbm5lbAogIGRlc2NyaXB0aW9uOiAgaW5pdGlhbGl6ZXMgcGFyYW1ldGVycyBhbmQgYWxsb2NhdGVzIG1lbW9yeQogIHJldHVybnM6ICAgICAgZXJyb3Igc3RhdHVzCkBAIC0xMjI2LDI3ICsxMjg0LDE3IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgSU5UCi1jcmVhdGVFbnZDaGFubmVsIChIQU5ETEVfRU5WX0NIQU5ORUwgICAgIGhFbnYsCi0gICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwKLSAgICAgICAgICAgICAgICAgLFVDSEFSKiAgICAgICAgICAgICAgICAgZHluYW1pY19SQU0KLSAgICAgICAgICAgICAgICAgKQotewotICBGREttZW1jbGVhcihoRW52LHNpemVvZiAoc3RydWN0IEVOVl9DSEFOTkVMKSk7CitzdGF0aWMgSU5UIGNyZWF0ZUVudkNoYW5uZWwoSEFORExFX0VOVl9DSEFOTkVMIGhFbnYsIElOVCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpkeW5hbWljX1JBTSkgeworICBGREttZW1jbGVhcihoRW52LCBzaXplb2Yoc3RydWN0IEVOVl9DSEFOTkVMKSk7CiAKLSAgaWYgKCBGREtzYnJFbmNfQ3JlYXRlVG9uQ29yclBhcmFtRXh0cigmaEVudi0+VG9uQ29yciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCkgKQotICB7Ci0gICAgcmV0dXJuKDEpOworICBpZiAoRkRLc2JyRW5jX0NyZWF0ZVRvbkNvcnJQYXJhbUV4dHIoJmhFbnYtPlRvbkNvcnIsIGNoYW5uZWwpKSB7CisgICAgcmV0dXJuICgxKTsKICAgfQogCi0gIGlmICggRkRLc2JyRW5jX0NyZWF0ZUV4dHJhY3RTYnJFbnZlbG9wZSAoJmhFbnYtPnNickV4dHJhY3RFbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsLypjaGFuKi8wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsZHluYW1pY19SQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKQotICB7Ci0gICAgcmV0dXJuKDEpOworICBpZiAoRkRLc2JyRW5jX0NyZWF0ZUV4dHJhY3RTYnJFbnZlbG9wZSgmaEVudi0+c2JyRXh0cmFjdEVudmVsb3BlLCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNoYW4qLyAwLCBkeW5hbWljX1JBTSkpIHsKKyAgICByZXR1cm4gKDEpOwogICB9CiAKICAgcmV0dXJuIDA7CkBAIC0xMjYxLDIxICsxMzA5LDE2IEBACiAgb3V0cHV0OgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQKLWluaXRFbnZDaGFubmVsICggIEhBTkRMRV9TQlJfQ09ORklHX0RBVEEgc2JyQ29uZmlnRGF0YSwKLSAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgc2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCAgICAgaEVudiwKLSAgICAgICAgICAgICAgICAgIHNickNvbmZpZ3VyYXRpb25QdHIgICAgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgVUxPTkcgICAgICAgICAgICAgICAgICBzdGF0ZXNJbml0RmxhZwotICAgICAgICAgICAgICAgICAsSU5UICAgICAgICAgICAgICAgICAgICBjaGFuSW5FbAotICAgICAgICAgICAgICAgICAsVUNIQVIqICAgICAgICAgICAgICAgICBkeW5hbWljX1JBTQotICAgICAgICAgICAgICAgICApCi17Ci0gIGludCBmcmFtZVNoaWZ0LCB0cmFuX29mZj0wOworc3RhdGljIElOVCBpbml0RW52Q2hhbm5lbChIQU5ETEVfU0JSX0NPTkZJR19EQVRBIHNickNvbmZpZ0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgc2JySGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0VOVl9DSEFOTkVMIGhFbnYsIHNickNvbmZpZ3VyYXRpb25QdHIgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyBzdGF0ZXNJbml0RmxhZywgSU5UIGNoYW5JbkVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqZHluYW1pY19SQU0pIHsKKyAgaW50IGZyYW1lU2hpZnQsIHRyYW5fb2ZmID0gMDsKICAgSU5UIGU7CiAgIElOVCB0cmFuX2ZjOwogICBJTlQgdGltZVNsb3RzLCB0aW1lU3RlcCwgc3RhcnRJbmRleDsKLSAgSU5UIG5vaXNlQmFuZHNbMl0gPSB7IDMsIDMgfTsKKyAgSU5UIG5vaXNlQmFuZHNbMl0gPSB7MywgM307CiAKICAgZSA9IDEgPDwgcGFyYW1zLT5lOwogCkBAIC0xMjgzLDExICsxMzI2LDEyIEBACiAKICAgaEVudi0+ZW5jRW52RGF0YS5mcmVxX3Jlc19maXhmaXhbMF0gPSBwYXJhbXMtPmZyZXFfcmVzX2ZpeGZpeFswXTsKICAgaEVudi0+ZW5jRW52RGF0YS5mcmVxX3Jlc19maXhmaXhbMV0gPSBwYXJhbXMtPmZyZXFfcmVzX2ZpeGZpeFsxXTsKLSAgaEVudi0+ZW5jRW52RGF0YS5mUmVzVHJhbnNJc0xvdyAgICAgPSBwYXJhbXMtPmZSZXNUcmFuc0lzTG93OworICBoRW52LT5lbmNFbnZEYXRhLmZSZXNUcmFuc0lzTG93ID0gcGFyYW1zLT5mUmVzVHJhbnNJc0xvdzsKIAogICBoRW52LT5mTGV2ZWxQcm90ZWN0ID0gMDsKIAotICBoRW52LT5lbmNFbnZEYXRhLmxkR3JpZCA9IChzYnJDb25maWdEYXRhLT5zYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKSA/IDEgOiAwOworICBoRW52LT5lbmNFbnZEYXRhLmxkR3JpZCA9CisgICAgICAoc2JyQ29uZmlnRGF0YS0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgPyAxIDogMDsKIAogICBoRW52LT5lbmNFbnZEYXRhLnNicl94cG9zX21vZGUgPSAoWFBPU19NT0RFKXBhcmFtcy0+c2JyX3hwb3NfbW9kZTsKIApAQCAtMTI5OCwxOSArMTM0MiwxNiBAQAogICAgICovCiAgICAgc2JyQ29uZmlnRGF0YS0+c3dpdGNoVHJhbnNwb3NlcnMgPSBUUlVFOwogICAgIGhFbnYtPmVuY0VudkRhdGEuc2JyX3hwb3NfbW9kZSA9IFhQT1NfTURDVDsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBzYnJDb25maWdEYXRhLT5zd2l0Y2hUcmFuc3Bvc2VycyA9IEZBTFNFOwogICB9CiAKICAgaEVudi0+ZW5jRW52RGF0YS5zYnJfeHBvc19jdHJsID0gcGFyYW1zLT5zYnJfeHBvc19jdHJsOwogCi0KICAgLyogZXh0ZW5kZWQgZGF0YSAqLwotICBpZihwYXJhbXMtPnBhcmFtZXRyaWNDb2RpbmcpIHsKKyAgaWYgKHBhcmFtcy0+cGFyYW1ldHJpY0NvZGluZykgewogICAgIGhFbnYtPmVuY0VudkRhdGEuZXh0ZW5kZWRfZGF0YSA9IDE7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgaEVudi0+ZW5jRW52RGF0YS5leHRlbmRlZF9kYXRhID0gMDsKICAgfQogCkBAIC0xMzE5LDQwICsxMzYwLDM3IEBACiAgIHN0YXJ0SW5kZXggPSBRTUZfRklMVEVSX1BST1RPVFlQRV9TSVpFIC0gc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kczsKIAogICBzd2l0Y2ggKHBhcmFtcy0+c2JyRnJhbWVTaXplKSB7Ci0gIGNhc2UgMjMwNDoKLSAgICB0aW1lU2xvdHMgPSAxODsKLSAgICBicmVhazsKLSAgY2FzZSAyMDQ4OgotICBjYXNlIDEwMjQ6Ci0gIGNhc2UgNTEyOgotICAgIHRpbWVTbG90cyA9IDE2OwotICAgIGJyZWFrOwotICBjYXNlIDE5MjA6Ci0gIGNhc2UgOTYwOgotICBjYXNlIDQ4MDoKLSAgICB0aW1lU2xvdHMgPSAxNTsKLSAgICBicmVhazsKLSAgY2FzZSAxMTUyOgotICAgIHRpbWVTbG90cyA9IDk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuICgxKTsgLyogSWxsZWdhbCBmcmFtZSBzaXplICovCisgICAgY2FzZSAyMzA0OgorICAgICAgdGltZVNsb3RzID0gMTg7CisgICAgICBicmVhazsKKyAgICBjYXNlIDIwNDg6CisgICAgY2FzZSAxMDI0OgorICAgIGNhc2UgNTEyOgorICAgICAgdGltZVNsb3RzID0gMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE5MjA6CisgICAgY2FzZSA5NjA6CisgICAgY2FzZSA0ODA6CisgICAgICB0aW1lU2xvdHMgPSAxNTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTE1MjoKKyAgICAgIHRpbWVTbG90cyA9IDk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICgxKTsgLyogSWxsZWdhbCBmcmFtZSBzaXplICovCiAgIH0KIAogICB0aW1lU3RlcCA9IHNickNvbmZpZ0RhdGEtPm5vUW1mU2xvdHMgLyB0aW1lU2xvdHM7CiAKLSAgaWYgKCBGREtzYnJFbmNfSW5pdFRvbkNvcnJQYXJhbUV4dHIocGFyYW1zLT5zYnJGcmFtZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnYtPlRvbkNvcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVTbG90cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5zYnJfeHBvc19jdHJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmFuYV9tYXhfbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPnNicl9ub2lzZV9iYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5ub2lzZUZsb29yT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnVzZVNwZWVjaENvbmZpZykgKQotICAgIHJldHVybigxKTsKKyAgaWYgKEZES3NickVuY19Jbml0VG9uQ29yclBhcmFtRXh0cigKKyAgICAgICAgICBwYXJhbXMtPnNickZyYW1lU2l6ZSwgJmhFbnYtPlRvbkNvcnIsIHNickNvbmZpZ0RhdGEsIHRpbWVTbG90cywKKyAgICAgICAgICBwYXJhbXMtPnNicl94cG9zX2N0cmwsIHBhcmFtcy0+YW5hX21heF9sZXZlbCwKKyAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5zYnJfbm9pc2VfYmFuZHMsIHBhcmFtcy0+bm9pc2VGbG9vck9mZnNldCwKKyAgICAgICAgICBwYXJhbXMtPnVzZVNwZWVjaENvbmZpZykpCisgICAgcmV0dXJuICgxKTsKIAotICBoRW52LT5lbmNFbnZEYXRhLm5vT2Zub2lzZWJhbmRzID0gaEVudi0+VG9uQ29yci5zYnJOb2lzZUZsb29yRXN0aW1hdGUubm9Ob2lzZUJhbmRzOworICBoRW52LT5lbmNFbnZEYXRhLm5vT2Zub2lzZWJhbmRzID0KKyAgICAgIGhFbnYtPlRvbkNvcnIuc2JyTm9pc2VGbG9vckVzdGltYXRlLm5vTm9pc2VCYW5kczsKIAogICBub2lzZUJhbmRzWzBdID0gaEVudi0+ZW5jRW52RGF0YS5ub09mbm9pc2ViYW5kczsKICAgbm9pc2VCYW5kc1sxXSA9IGhFbnYtPmVuY0VudkRhdGEubm9PZm5vaXNlYmFuZHM7CkBAIC0xMzYyLDEwNiArMTQwMCw5MCBAQAogICBpZiAoaEVudi0+ZW5jRW52RGF0YS5zYnJfaW52Zl9tb2RlID09IElOVkZfU1dJVENIRUQpIHsKICAgICBoRW52LT5lbmNFbnZEYXRhLnNicl9pbnZmX21vZGUgPSBJTlZGX01JRF9MRVZFTDsKICAgICBoRW52LT5Ub25Db3JyLnN3aXRjaEludmVyc2VGaWx0ID0gVFJVRTsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBoRW52LT5Ub25Db3JyLnN3aXRjaEludmVyc2VGaWx0ID0gRkFMU0U7CiAgIH0KIAotCi0gIHRyYW5fZmMgID0gcGFyYW1zLT50cmFuX2ZjOworICB0cmFuX2ZjID0gcGFyYW1zLT50cmFuX2ZjOwogCiAgIGlmICh0cmFuX2ZjID09IDApIHsKLSAgICB0cmFuX2ZjID0gZml4TWluICg1MDAwLCBGREtzYnJFbmNfZ2V0U2JyU3RhcnRGcmVxUkFXIChzYnJIZWFkZXJEYXRhLT5zYnJfc3RhcnRfZnJlcXVlbmN5LHBhcmFtcy0+Y29kZWNTZXR0aW5ncy5zYW1wbGVGcmVxKSk7CisgICAgdHJhbl9mYyA9IGZpeE1pbigKKyAgICAgICAgNTAwMCwgRkRLc2JyRW5jX2dldFNiclN0YXJ0RnJlcVJBVyhzYnJIZWFkZXJEYXRhLT5zYnJfc3RhcnRfZnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+Y29kZWNTZXR0aW5ncy5zYW1wbGVGcmVxKSk7CiAgIH0KIAotICB0cmFuX2ZjID0gKHRyYW5fZmMqNCpzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzL3NickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEgKyAxKT4+MTsKKyAgdHJhbl9mYyA9CisgICAgICAodHJhbl9mYyAqIDQgKiBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzIC8gc2JyQ29uZmlnRGF0YS0+c2FtcGxlRnJlcSArCisgICAgICAgMSkgPj4KKyAgICAgIDE7CiAKICAgaWYgKHNickNvbmZpZ0RhdGEtPnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpIHsKICAgICBmcmFtZVNoaWZ0ID0gTERfUFJFVFJBTl9PRkY7Ci0gICAgdHJhbl9vZmYgPSBMRF9QUkVUUkFOX09GRiArIEZSQU1FX01JRERMRV9TTE9UXzUxMkxEKnRpbWVTdGVwOwotICB9IGVsc2UKLSAgeworICAgIHRyYW5fb2ZmID0gTERfUFJFVFJBTl9PRkYgKyBGUkFNRV9NSURETEVfU0xPVF81MTJMRCAqIHRpbWVTdGVwOworICB9IGVsc2UgewogICAgIGZyYW1lU2hpZnQgPSAwOwogICAgIHN3aXRjaCAodGltZVNsb3RzKSB7CiAgICAgICAvKiBUaGUgZmFjdG9yIG9mIDIgaXMgYnkgZGVmaW5pdGlvbi4gKi8KLSAgICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjA0ODogdHJhbl9vZmYgPSA4ICsgRlJBTUVfTUlERExFX1NMT1RfMjA0OCAqIHRpbWVTdGVwOyBicmVhazsKLSAgICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDogdHJhbl9vZmYgPSA3ICsgRlJBTUVfTUlERExFX1NMT1RfMTkyMCAqIHRpbWVTdGVwOyBicmVhazsKLSAgICAgIGRlZmF1bHQ6IHJldHVybiAxOworICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OgorICAgICAgICB0cmFuX29mZiA9IDggKyBGUkFNRV9NSURETEVfU0xPVF8yMDQ4ICogdGltZVN0ZXA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xOTIwOgorICAgICAgICB0cmFuX29mZiA9IDcgKyBGUkFNRV9NSURETEVfU0xPVF8xOTIwICogdGltZVN0ZXA7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogICB9Ci0gIGlmICggRkRLc2JyRW5jX0luaXRFeHRyYWN0U2JyRW52ZWxvcGUgKCZoRW52LT5zYnJFeHRyYWN0RW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZTbG90cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzLCBzdGFydEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVTbG90cywgdGltZVN0ZXAsIHRyYW5fb2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc0luaXRGbGFnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsY2hhbkluRWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxkeW5hbWljX1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHNickNvbmZpZ0RhdGEtPnNiclN5bnRheEZsYWdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSApCi0gICAgcmV0dXJuKDEpOworICBpZiAoRkRLc2JyRW5jX0luaXRFeHRyYWN0U2JyRW52ZWxvcGUoCisgICAgICAgICAgJmhFbnYtPnNickV4dHJhY3RFbnZlbG9wZSwgc2JyQ29uZmlnRGF0YS0+bm9RbWZTbG90cywKKyAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzLCBzdGFydEluZGV4LCB0aW1lU2xvdHMsIHRpbWVTdGVwLCB0cmFuX29mZiwKKyAgICAgICAgICBzdGF0ZXNJbml0RmxhZywgY2hhbkluRWwsIGR5bmFtaWNfUkFNLCBzYnJDb25maWdEYXRhLT5zYnJTeW50YXhGbGFncykpCisgICAgcmV0dXJuICgxKTsKIAotICBpZihGREtzYnJFbmNfSW5pdFNickNvZGVFbnZlbG9wZSAoJmhFbnYtPnNickNvZGVFbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5uU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+ZGVsdGFUQWNyb3NzRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+ZEZfZWRnZV8xc3RFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5kRl9lZGdlX2luY3IpKQotICAgIHJldHVybigxKTsKKyAgaWYgKEZES3NickVuY19Jbml0U2JyQ29kZUVudmVsb3BlKCZoRW52LT5zYnJDb2RlRW52ZWxvcGUsIHNickNvbmZpZ0RhdGEtPm5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmRlbHRhVEFjcm9zc0ZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+ZEZfZWRnZV8xc3RFbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmRGX2VkZ2VfaW5jcikpCisgICAgcmV0dXJuICgxKTsKIAotICBpZihGREtzYnJFbmNfSW5pdFNickNvZGVFbnZlbG9wZSAoJmhFbnYtPnNickNvZGVOb2lzZUZsb29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vaXNlQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5kZWx0YVRBY3Jvc3NGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwKSkKLSAgICByZXR1cm4oMSk7CisgIGlmIChGREtzYnJFbmNfSW5pdFNickNvZGVFbnZlbG9wZSgmaEVudi0+c2JyQ29kZU5vaXNlRmxvb3IsIG5vaXNlQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmRlbHRhVEFjcm9zc0ZyYW1lcywgMCwgMCkpCisgICAgcmV0dXJuICgxKTsKIAogICBzYnJDb25maWdEYXRhLT5pbml0QW1wUmVzRkYgPSBwYXJhbXMtPmluaXRfYW1wX3Jlc19GRjsKIAotICBpZihGREtzYnJFbmNfSW5pdFNickh1ZmZtYW5UYWJsZXMgKCZoRW52LT5lbmNFbnZEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnYtPnNickNvZGVFbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52LT5zYnJDb2RlTm9pc2VGbG9vciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPnNicl9hbXBfcmVzKSkKLSAgIHJldHVybigxKTsKKyAgaWYgKEZES3NickVuY19Jbml0U2JySHVmZm1hblRhYmxlcygmaEVudi0+ZW5jRW52RGF0YSwgJmhFbnYtPnNickNvZGVFbnZlbG9wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudi0+c2JyQ29kZU5vaXNlRmxvb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+c2JyX2FtcF9yZXMpKQorICAgIHJldHVybiAoMSk7CiAKLSAgRkRLc2JyRW5jX2luaXRGcmFtZUluZm9HZW5lcmF0b3IgKCZoRW52LT5TYnJFbnZGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnNwcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+c3RhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU2xvdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudi0+ZW5jRW52RGF0YS5mcmVxX3Jlc19maXhmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudi0+ZW5jRW52RGF0YS5mUmVzVHJhbnNJc0xvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52LT5lbmNFbnZEYXRhLmxkR3JpZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgIEZES3NickVuY19pbml0RnJhbWVJbmZvR2VuZXJhdG9yKAorICAgICAgJmhFbnYtPlNickVudkZyYW1lLCBwYXJhbXMtPnNwcmVhZCwgZSwgcGFyYW1zLT5zdGF0LCB0aW1lU2xvdHMsCisgICAgICBoRW52LT5lbmNFbnZEYXRhLmZyZXFfcmVzX2ZpeGZpeCwgaEVudi0+ZW5jRW52RGF0YS5mUmVzVHJhbnNJc0xvdywKKyAgICAgIGhFbnYtPmVuY0VudkRhdGEubGRHcmlkKTsKIAotICBpZihzYnJDb25maWdEYXRhLT5zYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKQorICBpZiAoc2JyQ29uZmlnRGF0YS0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkKKwogICB7Ci0gICAgSU5UIGJhbmR3aWR0aF9xbWZfc2xvdCA9IChzYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxPj4xKSAvIChzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzKTsKLSAgICBpZihGREtzYnJFbmNfSW5pdFNickZhc3RUcmFuc2llbnREZXRlY3RvcigKLSAgICAgICAgICAgICAgJmhFbnYtPnNickZhc3RUcmFuc2llbnREZXRlY3RvciwKLSAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm5vUW1mU2xvdHMsCi0gICAgICAgICAgICAgICBiYW5kd2lkdGhfcW1mX3Nsb3QsCi0gICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzLAotICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+ZnJlcUJhbmRUYWJsZVswXVswXQotICAgICAgICAgICAgICAgKSkKLSAgICAgIHJldHVybigxKTsKKyAgICBJTlQgYmFuZHdpZHRoX3FtZl9zbG90ID0KKyAgICAgICAgKHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEgPj4gMSkgLyAoc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcyk7CisgICAgaWYgKEZES3NickVuY19Jbml0U2JyRmFzdFRyYW5zaWVudERldGVjdG9yKAorICAgICAgICAgICAgJmhFbnYtPnNickZhc3RUcmFuc2llbnREZXRlY3Rvciwgc2JyQ29uZmlnRGF0YS0+bm9RbWZTbG90cywKKyAgICAgICAgICAgIGJhbmR3aWR0aF9xbWZfc2xvdCwgc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcywKKyAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPmZyZXFCYW5kVGFibGVbMF1bMF0pKQorICAgICAgcmV0dXJuICgxKTsKICAgfQogCiAgIC8qIFRoZSB0cmFuc2llbnQgZGV0ZWN0b3IgaGFzIHRvIGJlIGluaXRpYWxpemVkIGFsc28gaWYgdGhlIGZhc3QgdHJhbnNpZW50CiAgICAgIGRldGVjdG9yIHdhcyBhY3RpdmUsIGJlY2F1c2UgdGhlIHZhbHVlcyBmcm9tIHRoZSB0cmFuc2llbnQgZGV0ZWN0b3IKICAgICAgc3RydWN0dXJlIGFyZSB1c2VkLiAqLwotICBpZihGREtzYnJFbmNfSW5pdFNiclRyYW5zaWVudERldGVjdG9yICgmaEVudi0+c2JyVHJhbnNpZW50RGV0ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5zYnJTeW50YXhGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPmZyYW1lU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuX2ZjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZTbG90cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm5vUW1mQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52LT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlcldyaXRlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudi0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTelNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5fb2ZmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQotICByZXR1cm4oMSk7Ci0KKyAgaWYgKEZES3NickVuY19Jbml0U2JyVHJhbnNpZW50RGV0ZWN0b3IoCisgICAgICAgICAgJmhFbnYtPnNiclRyYW5zaWVudERldGVjdG9yLCBzYnJDb25maWdEYXRhLT5zYnJTeW50YXhGbGFncywKKyAgICAgICAgICBzYnJDb25maWdEYXRhLT5mcmFtZVNpemUsIHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEsIHBhcmFtcywgdHJhbl9mYywKKyAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZlNsb3RzLCBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzLAorICAgICAgICAgIGhFbnYtPnNickV4dHJhY3RFbnZlbG9wZS5ZQnVmZmVyV3JpdGVPZmZzZXQsCisgICAgICAgICAgaEVudi0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTelNoaWZ0LCBmcmFtZVNoaWZ0LCB0cmFuX29mZikpCisgICAgcmV0dXJuICgxKTsKIAogICBzYnJDb25maWdEYXRhLT54cG9zQ3RybFN3aXRjaCA9IHBhcmFtcy0+c2JyX3hwb3NfY3RybDsKIApAQCAtMTQ3MSw4MyArMTQ5Myw4MCBAQAogICByZXR1cm4gKDApOwogfQogCi1JTlQgc2JyRW5jb2Rlcl9PcGVuKAotICAgICAgICBIQU5ETEVfU0JSX0VOQ09ERVIgICpwaFNickVuY29kZXIsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgIG5FbGVtZW50cywKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICBzdXBwb3J0UFMKLSAgICAgICAgKQoteworSU5UIHNickVuY29kZXJfT3BlbihIQU5ETEVfU0JSX0VOQ09ERVIgKnBoU2JyRW5jb2RlciwgSU5UIG5FbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgSU5UIG5DaGFubmVscywgSU5UIHN1cHBvcnRQUykgewogICBJTlQgaTsKICAgSU5UIGVycm9yU3RhdHVzID0gMTsKICAgSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyID0gTlVMTDsKIAotICBpZiAocGhTYnJFbmNvZGVyPT1OVUxMCi0gICAgICkKLSAgeworICBpZiAocGhTYnJFbmNvZGVyID09IE5VTEwpIHsKICAgICBnb3RvIGJhaWw7CiAgIH0KIAogICBoU2JyRW5jb2RlciA9IEdldFJhbV9TYnJFbmNvZGVyKCk7Ci0gIGlmIChoU2JyRW5jb2Rlcj09TlVMTCkgeworICBpZiAoaFNickVuY29kZXIgPT0gTlVMTCkgewogICAgIGdvdG8gYmFpbDsKICAgfQogICBGREttZW1jbGVhcihoU2JyRW5jb2Rlciwgc2l6ZW9mKFNCUl9FTkNPREVSKSk7CiAKLSAgICAgIGhTYnJFbmNvZGVyLT5wU0JSZHluYW1pY19SQU0gPSAoVUNIQVIqKUdldFJhbV9TYnJEeW5hbWljX1JBTSgpOwotICAgICAgaFNickVuY29kZXItPmR5bmFtaWNSYW0gPSBoU2JyRW5jb2Rlci0+cFNCUmR5bmFtaWNfUkFNOworICBpZiAoTlVMTCA9PQorICAgICAgKGhTYnJFbmNvZGVyLT5wU0JSZHluYW1pY19SQU0gPSAoVUNIQVIgKilHZXRSYW1fU2JyRHluYW1pY19SQU0oKSkpIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAgaFNickVuY29kZXItPmR5bmFtaWNSYW0gPSBoU2JyRW5jb2Rlci0+cFNCUmR5bmFtaWNfUkFNOwogCi0gIGZvciAoaT0wOyBpPG5FbGVtZW50czsgaSsrKSB7CisgIC8qIENyZWF0ZSBTQlIgZWxlbWVudHMgKi8KKyAgZm9yIChpID0gMDsgaSA8IG5FbGVtZW50czsgaSsrKSB7CiAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbaV0gPSBHZXRSYW1fU2JyRWxlbWVudChpKTsKLSAgICBpZiAoaFNickVuY29kZXItPnNickVsZW1lbnRbaV09PU5VTEwpIHsKLSAgICAgICAgZ290byBiYWlsOworICAgIGlmIChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXSA9PSBOVUxMKSB7CisgICAgICBnb3RvIGJhaWw7CiAgICAgfQogICAgIEZES21lbWNsZWFyKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldLCBzaXplb2YoU0JSX0VMRU1FTlQpKTsKLSAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXS0+c2JyQ29uZmlnRGF0YS5mcmVxQmFuZFRhYmxlW0xPXSA9ICBHZXRSYW1fU2JyX2ZyZXFCYW5kVGFibGVMTyhpKTsKLSAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXS0+c2JyQ29uZmlnRGF0YS5mcmVxQmFuZFRhYmxlW0hJXSA9ICBHZXRSYW1fU2JyX2ZyZXFCYW5kVGFibGVISShpKTsKLSAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXS0+c2JyQ29uZmlnRGF0YS52X2tfbWFzdGVyICAgICAgICA9ICBHZXRSYW1fU2JyX3Zfa19tYXN0ZXIoaSk7Ci0gICAgaWYgKCAoaFNickVuY29kZXItPnNickVsZW1lbnRbaV0tPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtMT109PU5VTEwpIHx8Ci0gICAgICAgICAoaFNickVuY29kZXItPnNickVsZW1lbnRbaV0tPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtISV09PU5VTEwpIHx8Ci0gICAgICAgICAoaFNickVuY29kZXItPnNickVsZW1lbnRbaV0tPnNickNvbmZpZ0RhdGEudl9rX21hc3Rlcj09TlVMTCkgKQotICAgIHsKLSAgICAgICAgZ290byBiYWlsOworICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldLT5zYnJDb25maWdEYXRhLmZyZXFCYW5kVGFibGVbTE9dID0KKyAgICAgICAgR2V0UmFtX1Nicl9mcmVxQmFuZFRhYmxlTE8oaSk7CisgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbaV0tPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtISV0gPQorICAgICAgICBHZXRSYW1fU2JyX2ZyZXFCYW5kVGFibGVISShpKTsKKyAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXS0+c2JyQ29uZmlnRGF0YS52X2tfbWFzdGVyID0KKyAgICAgICAgR2V0UmFtX1Nicl92X2tfbWFzdGVyKGkpOworICAgIGlmICgoaFNickVuY29kZXItPnNickVsZW1lbnRbaV0tPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtMT10gPT0gTlVMTCkgfHwKKyAgICAgICAgKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldLT5zYnJDb25maWdEYXRhLmZyZXFCYW5kVGFibGVbSEldID09IE5VTEwpIHx8CisgICAgICAgIChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXS0+c2JyQ29uZmlnRGF0YS52X2tfbWFzdGVyID09IE5VTEwpKSB7CisgICAgICBnb3RvIGJhaWw7CiAgICAgfQogICB9CiAKLSAgZm9yIChpPTA7IGk8bkNoYW5uZWxzOyBpKyspIHsKKyAgLyogQ3JlYXRlIFNCUiBjaGFubmVscyAqLworICBmb3IgKGkgPSAwOyBpIDwgbkNoYW5uZWxzOyBpKyspIHsKICAgICBoU2JyRW5jb2Rlci0+cFNickNoYW5uZWxbaV0gPSBHZXRSYW1fU2JyQ2hhbm5lbChpKTsKLSAgICBpZiAoaFNickVuY29kZXItPnBTYnJDaGFubmVsW2ldPT1OVUxMKSB7Ci0gICAgICAgIGdvdG8gYmFpbDsKKyAgICBpZiAoaFNickVuY29kZXItPnBTYnJDaGFubmVsW2ldID09IE5VTEwpIHsKKyAgICAgIGdvdG8gYmFpbDsKICAgICB9CiAKLSAgICBpZiAoIGNyZWF0ZUVudkNoYW5uZWwoJmhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFtpXS0+aEVudkNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICxoU2JyRW5jb2Rlci0+ZHluYW1pY1JhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKSApCi0gICAgewotICAgICAgICBnb3RvIGJhaWw7CisgICAgaWYgKGNyZWF0ZUVudkNoYW5uZWwoJmhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFtpXS0+aEVudkNoYW5uZWwsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPmR5bmFtaWNSYW0pKSB7CisgICAgICBnb3RvIGJhaWw7CiAgICAgfQotCiAgIH0KIAotICBmb3IgKGk9MDsgaTxmaXhNYXgobkNoYW5uZWxzLChzdXBwb3J0UFMpPzI6MCk7IGkrKykgeworICAvKiBDcmVhdGUgUU1GIFN0YXRlcyAqLworICBmb3IgKGkgPSAwOyBpIDwgZml4TWF4KG5DaGFubmVscywgKHN1cHBvcnRQUykgPyAyIDogMCk7IGkrKykgewogICAgIGhTYnJFbmNvZGVyLT5RbWZBbmFseXNpc1tpXS5GaWx0ZXJTdGF0ZXMgPSBHZXRSYW1fU2JyX1FtZlN0YXRlc0FuYWx5c2lzKGkpOwotICAgIGlmIChoU2JyRW5jb2Rlci0+UW1mQW5hbHlzaXNbaV0uRmlsdGVyU3RhdGVzPT1OVUxMKSB7Ci0gICAgICAgIGdvdG8gYmFpbDsKKyAgICBpZiAoaFNickVuY29kZXItPlFtZkFuYWx5c2lzW2ldLkZpbHRlclN0YXRlcyA9PSBOVUxMKSB7CisgICAgICBnb3RvIGJhaWw7CiAgICAgfQogICB9CiAKKyAgLyogQ3JlYXRlIFBhcmFtZXRyaWMgU3RlcmVvIGhhbmRsZSAqLwogICBpZiAoc3VwcG9ydFBTKSB7Ci0gICAgaWYgKFBTRW5jX0NyZWF0ZSgmaFNickVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvKSkKLSAgICB7CisgICAgaWYgKFBTRW5jX0NyZWF0ZSgmaFNickVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvKSkgewogICAgICAgZ290byBiYWlsOwogICAgIH0KIAogICAgIGhTYnJFbmNvZGVyLT5xbWZTeW50aGVzaXNQUy5GaWx0ZXJTdGF0ZXMgPSBHZXRSYW1fUHNRbWZTdGF0ZXNTeW50aGVzaXMoKTsKLSAgICBpZiAoaFNickVuY29kZXItPnFtZlN5bnRoZXNpc1BTLkZpbHRlclN0YXRlcz09TlVMTCkgeworICAgIGlmIChoU2JyRW5jb2Rlci0+cW1mU3ludGhlc2lzUFMuRmlsdGVyU3RhdGVzID09IE5VTEwpIHsKICAgICAgIGdvdG8gYmFpbDsKICAgICB9Ci0gIH0gIC8qIHN1cHBvcnRQUyAqLworICB9IC8qIHN1cHBvcnRQUyAqLwogCiAgICpwaFNickVuY29kZXIgPSBoU2JyRW5jb2RlcjsKIApAQCAtMTU2MCw1NiArMTU3OSw3NCBAQAogICByZXR1cm4gZXJyb3JTdGF0dXM7CiB9CiAKLXN0YXRpYwotSU5UIEZES3NickVuY19SZWFsbG9jYXRlKAotICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VOQ09ERVIgICBoU2JyRW5jb2RlciwKLSAgICAgICAgICAgICAgICAgICAgU0JSX0VMRU1FTlRfSU5GTyAgICAgZWxJbmZvWyg4KV0sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgIG5vRWxlbWVudHMpCi17CitzdGF0aWMgSU5UIEZES3NickVuY19SZWFsbG9jYXRlKEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0VMRU1FTlRfSU5GTyBlbEluZm9bKDgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5vRWxlbWVudHMpIHsKICAgSU5UIHRvdGFsQ2ggPSAwOwogICBJTlQgdG90YWxRbWYgPSAwOwogICBJTlQgY29yZUVsOwotICBJTlQgZWw9LTE7CisgIElOVCBlbCA9IC0xOwogCiAgIGhTYnJFbmNvZGVyLT5sZmVDaElkeCA9IC0xOyAvKiBkZWZhdWx0IHZhbHVlLCB1bnRpbCBsZmUgZm91bmQgKi8KIAotICBmb3IgKGNvcmVFbD0wOyBjb3JlRWw8bm9FbGVtZW50czsgY29yZUVsKyspCi0gIHsKKyAgZm9yIChjb3JlRWwgPSAwOyBjb3JlRWwgPCBub0VsZW1lbnRzOyBjb3JlRWwrKykgewogICAgIC8qIFNCUiBvbmx5IGhhbmRsZXMgU0NFIGFuZCBDUEUncyAqLwogICAgIGlmIChlbEluZm9bY29yZUVsXS5lbFR5cGUgPT0gSURfU0NFIHx8IGVsSW5mb1tjb3JlRWxdLmVsVHlwZSA9PSBJRF9DUEUpIHsKICAgICAgIGVsKys7CiAgICAgfSBlbHNlIHsKICAgICAgIGlmIChlbEluZm9bY29yZUVsXS5lbFR5cGUgPT0gSURfTEZFKSB7Ci0gICAgICAgICAgaFNickVuY29kZXItPmxmZUNoSWR4ID0gZWxJbmZvW2NvcmVFbF0uQ2hhbm5lbEluZGV4WzBdOworICAgICAgICBoU2JyRW5jb2Rlci0+bGZlQ2hJZHggPSBlbEluZm9bY29yZUVsXS5DaGFubmVsSW5kZXhbMF07CiAgICAgICB9CiAgICAgICBjb250aW51ZTsKICAgICB9CiAKLSAgICBTQlJfRUxFTUVOVF9JTkZPICAgICpwZWxJbmZvID0gJmVsSW5mb1tjb3JlRWxdOwotICAgIEhBTkRMRV9TQlJfRUxFTUVOVCAgaFNickVsZW1lbnQgPSBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF07CisgICAgU0JSX0VMRU1FTlRfSU5GTyAqcGVsSW5mbyA9ICZlbEluZm9bY29yZUVsXTsKKyAgICBIQU5ETEVfU0JSX0VMRU1FTlQgaFNickVsZW1lbnQgPSBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF07CiAKICAgICBpbnQgY2g7Ci0gICAgZm9yICggY2ggPSAwOyBjaCA8IHBlbEluZm8tPm5DaGFubmVsc0luRWw7IGNoKysgKSB7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgcGVsSW5mby0+bkNoYW5uZWxzSW5FbDsgY2grKykgewogICAgICAgaFNickVsZW1lbnQtPnNickNoYW5uZWxbY2hdID0gaFNickVuY29kZXItPnBTYnJDaGFubmVsW3RvdGFsQ2hdOwogICAgICAgdG90YWxDaCsrOwogICAgIH0KICAgICAvKiBhbmFseXNpcyBRTUYgKi8KLSAgICBmb3IgKCBjaCA9IDA7IGNoIDwgKChwZWxJbmZvLT5mUGFyYW1ldHJpY1N0ZXJlbyk/MjpwZWxJbmZvLT5uQ2hhbm5lbHNJbkVsKTsgY2grKyApIHsKKyAgICBmb3IgKGNoID0gMDsKKyAgICAgICAgIGNoIDwgKChwZWxJbmZvLT5mUGFyYW1ldHJpY1N0ZXJlbykgPyAyIDogcGVsSW5mby0+bkNoYW5uZWxzSW5FbCk7CisgICAgICAgICBjaCsrKSB7CiAgICAgICBoU2JyRWxlbWVudC0+ZWxJbmZvLkNoYW5uZWxJbmRleFtjaF0gPSBwZWxJbmZvLT5DaGFubmVsSW5kZXhbY2hdOwogICAgICAgaFNickVsZW1lbnQtPmhRbWZBbmFseXNpc1tjaF0gPSAmaFNickVuY29kZXItPlFtZkFuYWx5c2lzW3RvdGFsUW1mKytdOwogICAgIH0KIAogICAgIC8qIENvcHkgRWxlbWVudCBpbmZvICovCi0gICAgaFNickVsZW1lbnQtPmVsSW5mby5lbFR5cGUgICAgICAgICAgICA9IHBlbEluZm8tPmVsVHlwZTsKLSAgICBoU2JyRWxlbWVudC0+ZWxJbmZvLmluc3RhbmNlVGFnICAgICAgID0gcGVsSW5mby0+aW5zdGFuY2VUYWc7Ci0gICAgaFNickVsZW1lbnQtPmVsSW5mby5uQ2hhbm5lbHNJbkVsICAgICA9IHBlbEluZm8tPm5DaGFubmVsc0luRWw7CisgICAgaFNickVsZW1lbnQtPmVsSW5mby5lbFR5cGUgPSBwZWxJbmZvLT5lbFR5cGU7CisgICAgaFNickVsZW1lbnQtPmVsSW5mby5pbnN0YW5jZVRhZyA9IHBlbEluZm8tPmluc3RhbmNlVGFnOworICAgIGhTYnJFbGVtZW50LT5lbEluZm8ubkNoYW5uZWxzSW5FbCA9IHBlbEluZm8tPm5DaGFubmVsc0luRWw7CiAgICAgaFNickVsZW1lbnQtPmVsSW5mby5mUGFyYW1ldHJpY1N0ZXJlbyA9IHBlbEluZm8tPmZQYXJhbWV0cmljU3RlcmVvOworICAgIGhTYnJFbGVtZW50LT5lbEluZm8uZkR1YWxNb25vID0gcGVsSW5mby0+ZkR1YWxNb25vOwogICB9IC8qIGNvcmVFbCAqLwogCiAgIHJldHVybiAwOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAorIGZ1bmN0aW9ubmFtZTogRkRLc2JyRW5jX2JzQnVmSW5pdAorIGRlc2NyaXB0aW9uOiAgaW5pdGlhbGl6ZXMgYml0c3RyZWFtIGJ1ZmZlcgorIHJldHVybnM6ICAgICAgaW5pdGlhbGl6ZWQgYml0c3RyZWFtIGJ1ZmZlciBpbiBlbnYgZW5jb2RlcgorIGlucHV0OgorIG91dHB1dDogICAgICAgaEVudgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQgRkRLc2JyRW5jX2JzQnVmSW5pdChIQU5ETEVfU0JSX0VMRU1FTlQgaFNickVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5CaXRzdHJEZWxheSkgeworICBVQ0hBUiAqYml0c3RyZWFtQnVmZmVyOworCisgIC8qIGluaXRpYWxpemUgdGhlIGJpdHN0cmVhbSBidWZmZXIgKi8KKyAgYml0c3RyZWFtQnVmZmVyID0gaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVbbkJpdHN0ckRlbGF5XTsKKyAgRkRLaW5pdEJpdFN0cmVhbSgmaFNickVsZW1lbnQtPkNtb25EYXRhLnNickJpdGJ1ZiwgYml0c3RyZWFtQnVmZmVyLAorICAgICAgICAgICAgICAgICAgIE1BWF9QQVlMT0FEX1NJWkUgKiBzaXplb2YoVUNIQVIpLCAwLCBCU19XUklURVIpOworCisgIHJldHVybiAoMCk7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCkBAIC0xNjIwLDExMyArMTY1NywxMDkgQEAKICBvdXRwdXQ6ICAgICAgIGhFbnYKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMKLUlOVCBGREtzYnJFbmNfRW52SW5pdCAoCi0gICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRUxFTUVOVCAgIGhTYnJFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWd1cmF0aW9uUHRyIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgKmNvcmVCYW5kV2l0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgYW90LAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbkJpdHN0ckRlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbkVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBoZWFkZXJQZXJpb2QsCi0gICAgICAgICAgICAgICAgICAgICAgIFVMT05HICAgICBzdGF0ZXNJbml0RmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGZUaW1lRG9tYWluRG93bnNhbXBsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgLFVDSEFSICAgICpkeW5hbWljX1JBTQotICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgVUNIQVIgICAgKmJpdHN0cmVhbUJ1ZmZlcjsKK3N0YXRpYyBJTlQgRkRLc2JyRW5jX0VudkluaXQoSEFORExFX1NCUl9FTEVNRU5UIGhTYnJFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWd1cmF0aW9uUHRyIHBhcmFtcywgSU5UICpjb3JlQmFuZFdpdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGFvdCwgaW50IG5FbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaGVhZGVyUGVyaW9kLCBVTE9ORyBzdGF0ZXNJbml0RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0JSRU5DX0RTX1RZUEUgZG93bnNhbXBsaW5nTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqZHluYW1pY19SQU0pIHsKICAgaW50IGNoLCBpOwogCi0gIGlmICgocGFyYW1zLT5jb2RlY1NldHRpbmdzLm5DaGFubmVscyA8IDEpIHx8IChwYXJhbXMtPmNvZGVjU2V0dGluZ3MubkNoYW5uZWxzID4gTUFYX05VTV9DSEFOTkVMUykpewotICAgIHJldHVybigxKTsKKyAgaWYgKChwYXJhbXMtPmNvZGVjU2V0dGluZ3MubkNoYW5uZWxzIDwgMSkgfHwKKyAgICAgIChwYXJhbXMtPmNvZGVjU2V0dGluZ3MubkNoYW5uZWxzID4gTUFYX05VTV9DSEFOTkVMUykpIHsKKyAgICByZXR1cm4gKDEpOwogICB9CiAKLSAgLyogaW5pdGlhbGl6ZSB0aGUgZW5jb2RlciBoYW5kbGUgIGFuZCBzdHJ1Y3RzKi8KLSAgYml0c3RyZWFtQnVmZmVyID0gaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVbbkJpdHN0ckRlbGF5XTsKLQogICAvKiBpbml0IGFuZCBzZXQgc3ludGF4IGZsYWdzICovCiAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzID0gMDsKIAogICBzd2l0Y2ggKGFvdCkgewotICBjYXNlIEFPVF9FUl9BQUNfRUxEOgotICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzIHw9IFNCUl9TWU5UQVhfTE9XX0RFTEFZOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIGJyZWFrOworICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6CisgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYnJTeW50YXhGbGFncyB8PSBTQlJfU1lOVEFYX0xPV19ERUxBWTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKICAgfQogICBpZiAocGFyYW1zLT5jcmNTYnIpIHsKICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYnJTeW50YXhGbGFncyB8PSBTQlJfU1lOVEFYX0NSQzsKICAgfQogCi0gIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMgPSBRTUZfQ0hBTk5FTFM+PigyLXBhcmFtcy0+ZG93blNhbXBsZUZhY3Rvcik7Ci0gIHN3aXRjaCAoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcykKLSAgewotICAgIGNhc2UgNjQ6IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mU2xvdHMgPSBwYXJhbXMtPnNickZyYW1lU2l6ZT4+NjsKLSAgICAgICAgICAgICBicmVhazsKLSAgICBjYXNlIDMyOiBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZlNsb3RzID0gcGFyYW1zLT5zYnJGcmFtZVNpemU+PjU7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDogaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZTbG90cyA9IHBhcmFtcy0+c2JyRnJhbWVTaXplPj42OwotICAgICAgICAgICAgIHJldHVybigyKTsKKyAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcyA9IDY0ID4+ICgyIC0gcGFyYW1zLT5kb3duU2FtcGxlRmFjdG9yKTsKKyAgc3dpdGNoIChoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzKSB7CisgICAgY2FzZSA2NDoKKyAgICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mU2xvdHMgPSBwYXJhbXMtPnNickZyYW1lU2l6ZSA+PiA2OworICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjoKKyAgICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mU2xvdHMgPSBwYXJhbXMtPnNickZyYW1lU2l6ZSA+PiA1OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mU2xvdHMgPSBwYXJhbXMtPnNickZyYW1lU2l6ZSA+PiA2OworICAgICAgcmV0dXJuICgyKTsKICAgfQogCi0gIEZES2luaXRCaXRTdHJlYW0oJmhTYnJFbGVtZW50LT5DbW9uRGF0YS5zYnJCaXRidWYsIGJpdHN0cmVhbUJ1ZmZlciwgTUFYX1BBWUxPQURfU0laRSpzaXplb2YoVUNIQVIpLCAwLCBCU19XUklURVIpOwotCiAgIC8qCiAgICAgbm93IGluaXRpYWxpemUgc2JyQ29uZmlnRGF0YSwgc2JySGVhZGVyRGF0YSBhbmQgc2JyQml0c3RyZWFtRGF0YSwKICAgKi8KICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzID0gcGFyYW1zLT5jb2RlY1NldHRpbmdzLm5DaGFubmVsczsKIAotICBpZihwYXJhbXMtPmNvZGVjU2V0dGluZ3MubkNoYW5uZWxzID09IDIpCi0gICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnN0ZXJlb01vZGUgPSBwYXJhbXMtPnN0ZXJlb01vZGU7Ci0gIGVsc2UKLSAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc3RlcmVvTW9kZSA9IFNCUl9NT05POworICBpZiAocGFyYW1zLT5jb2RlY1NldHRpbmdzLm5DaGFubmVscyA9PSAyKSB7CisgICAgaWYgKChoU2JyRWxlbWVudC0+ZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpICYmCisgICAgICAgICgoaFNickVsZW1lbnQtPmVsSW5mby5mRHVhbE1vbm8gPT0gMSkpKSB7CisgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zdGVyZW9Nb2RlID0gU0JSX0xFRlRfUklHSFQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnN0ZXJlb01vZGUgPSBwYXJhbXMtPnN0ZXJlb01vZGU7CisgICAgfQorICB9IGVsc2UgeworICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnN0ZXJlb01vZGUgPSBTQlJfTU9OTzsKKyAgfQogCi0gIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmZyYW1lU2l6ZSAgID0gcGFyYW1zLT5zYnJGcmFtZVNpemU7CisgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmZyYW1lU2l6ZSA9IHBhcmFtcy0+c2JyRnJhbWVTaXplOwogCi0gIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNhbXBsZUZyZXEgPSBwYXJhbXMtPmRvd25TYW1wbGVGYWN0b3IgKiBwYXJhbXMtPmNvZGVjU2V0dGluZ3Muc2FtcGxlRnJlcTsKKyAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2FtcGxlRnJlcSA9CisgICAgICBwYXJhbXMtPmRvd25TYW1wbGVGYWN0b3IgKiBwYXJhbXMtPmNvZGVjU2V0dGluZ3Muc2FtcGxlRnJlcTsKIAogICBoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5Db3VudFNlbmRIZWFkZXJEYXRhID0gMDsKLSAgaWYgKHBhcmFtcy0+U2VuZEhlYWRlckRhdGFUaW1lID4gMCApIHsKLQotICAgIGlmIChoZWFkZXJQZXJpb2Q9PS0xKSB7Ci0KLSAgICAgIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLk5yU2VuZEhlYWRlckRhdGEgPSAoSU5UKShwYXJhbXMtPlNlbmRIZWFkZXJEYXRhVGltZSAqIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNhbXBsZUZyZXEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoMTAwMCAqIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmZyYW1lU2l6ZSkpOwotICAgICAgaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuTnJTZW5kSGVhZGVyRGF0YSA9IGZpeE1heChoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5OclNlbmRIZWFkZXJEYXRhLDEpOwotICAgIH0KLSAgICBlbHNlIHsKKyAgaWYgKHBhcmFtcy0+U2VuZEhlYWRlckRhdGFUaW1lID4gMCkgeworICAgIGlmIChoZWFkZXJQZXJpb2QgPT0gLTEpIHsKKyAgICAgIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLk5yU2VuZEhlYWRlckRhdGEgPSAoSU5UKSgKKyAgICAgICAgICBwYXJhbXMtPlNlbmRIZWFkZXJEYXRhVGltZSAqIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNhbXBsZUZyZXEgLworICAgICAgICAgICgxMDAwICogaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJhbWVTaXplKSk7CisgICAgICBoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5OclNlbmRIZWFkZXJEYXRhID0KKyAgICAgICAgICBmaXhNYXgoaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuTnJTZW5kSGVhZGVyRGF0YSwgMSk7CisgICAgfSBlbHNlIHsKICAgICAgIC8qIGFzc3VyZSBoZWFkZXIgcGVyaW9kIGF0IGxlYXN0IG9uY2UgcGVyIHNlY29uZCAqLwotICAgICAgaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuTnJTZW5kSGVhZGVyRGF0YSA9IGZpeE1pbihmaXhNYXgoaGVhZGVyUGVyaW9kLDEpLChoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxL2hTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmZyYW1lU2l6ZSkpOworICAgICAgaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuTnJTZW5kSGVhZGVyRGF0YSA9IGZpeE1pbigKKyAgICAgICAgICBmaXhNYXgoaGVhZGVyUGVyaW9kLCAxKSwgKGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNhbXBsZUZyZXEgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJhbWVTaXplKSk7CiAgICAgfQotICB9Ci0gIGVsc2UgewotICAgaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuTnJTZW5kSGVhZGVyRGF0YSA9IDA7CisgIH0gZWxzZSB7CisgICAgaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuTnJTZW5kSGVhZGVyRGF0YSA9IDA7CiAgIH0KIAogICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfZGF0YV9leHRyYSA9IHBhcmFtcy0+c2JyX2RhdGFfZXh0cmE7CiAgIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLkhlYWRlckFjdGl2ZSA9IDA7CisgIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLnJpZ2h0Qm9yZGVyRklYID0gMDsKICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX3N0YXJ0X2ZyZXF1ZW5jeSA9IHBhcmFtcy0+c3RhcnRGcmVxOwotICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfc3RvcF9mcmVxdWVuY3kgID0gcGFyYW1zLT5zdG9wRnJlcTsKKyAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX3N0b3BfZnJlcXVlbmN5ID0gcGFyYW1zLT5zdG9wRnJlcTsKICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX3hvdmVyX2JhbmQgPSAwOwogICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfbGNfc3RlcmVvX21vZGUgPSAwOwogCiAgIC8qIGRhdGFfZXh0cmEgKi8KLSAgaWYgKHBhcmFtcy0+c2JyX3hwb3NfY3RybCE9IFNCUl9YUE9TX0NUUkxfREVGQVVMVCkKLSAgICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX2RhdGFfZXh0cmEgPSAxOworICBpZiAocGFyYW1zLT5zYnJfeHBvc19jdHJsICE9IFNCUl9YUE9TX0NUUkxfREVGQVVMVCkKKyAgICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfZGF0YV9leHRyYSA9IDE7CiAKICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX2FtcF9yZXMgPSAoQU1QX1JFUylwYXJhbXMtPmFtcF9yZXM7CiAKICAgLyogaGVhZGVyX2V4dHJhXzEgKi8KLSAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuZnJlcVNjYWxlICA9IHBhcmFtcy0+ZnJlcVNjYWxlOworICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5mcmVxU2NhbGUgPSBwYXJhbXMtPmZyZXFTY2FsZTsKICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuYWx0ZXJTY2FsZSA9IHBhcmFtcy0+YWx0ZXJTY2FsZTsKICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX25vaXNlX2JhbmRzID0gcGFyYW1zLT5zYnJfbm9pc2VfYmFuZHM7CiAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLmhlYWRlcl9leHRyYV8xID0gMDsKIAogICBpZiAoKHBhcmFtcy0+ZnJlcVNjYWxlICE9IFNCUl9GUkVRX1NDQUxFX0RFRkFVTFQpIHx8CiAgICAgICAocGFyYW1zLT5hbHRlclNjYWxlICE9IFNCUl9BTFRFUl9TQ0FMRV9ERUZBVUxUKSB8fAotICAgICAgKHBhcmFtcy0+c2JyX25vaXNlX2JhbmRzICE9IFNCUl9OT0lTRV9CQU5EU19ERUZBVUxUKSkKLSAgewotICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuaGVhZGVyX2V4dHJhXzEgPSAxOworICAgICAgKHBhcmFtcy0+c2JyX25vaXNlX2JhbmRzICE9IFNCUl9OT0lTRV9CQU5EU19ERUZBVUxUKSkgeworICAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLmhlYWRlcl9leHRyYV8xID0gMTsKICAgfQogCiAgIC8qIGhlYWRlcl9leHRyYV8yICovCkBAIC0xNzM0LDk1ICsxNzY3LDkyIEBACiAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9saW1pdGVyX2dhaW5zID0gcGFyYW1zLT5zYnJfbGltaXRlcl9nYWluczsKIAogICBpZiAoKGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNhbXBsZUZyZXEgPiA0ODAwMCkgJiYKLSAgICAgIChoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfc3RhcnRfZnJlcXVlbmN5ID49IDkpKQotICB7CisgICAgICAoaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX3N0YXJ0X2ZyZXF1ZW5jeSA+PSA5KSkgewogICAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9saW1pdGVyX2dhaW5zID0gU0JSX0xJTUlURVJfR0FJTlNfSU5GSU5JVEU7CiAgIH0KIAogICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfaW50ZXJwb2xfZnJlcSA9IHBhcmFtcy0+c2JyX2ludGVycG9sX2ZyZXE7Ci0gIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9zbW9vdGhpbmdfbGVuZ3RoID0gcGFyYW1zLT5zYnJfc21vb3RoaW5nX2xlbmd0aDsKKyAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX3Ntb290aGluZ19sZW5ndGggPQorICAgICAgcGFyYW1zLT5zYnJfc21vb3RoaW5nX2xlbmd0aDsKICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuaGVhZGVyX2V4dHJhXzIgPSAwOwogCiAgIGlmICgocGFyYW1zLT5zYnJfbGltaXRlcl9iYW5kcyAhPSBTQlJfTElNSVRFUl9CQU5EU19ERUZBVUxUKSB8fAogICAgICAgKHBhcmFtcy0+c2JyX2xpbWl0ZXJfZ2FpbnMgIT0gU0JSX0xJTUlURVJfR0FJTlNfREVGQVVMVCkgfHwKICAgICAgIChwYXJhbXMtPnNicl9pbnRlcnBvbF9mcmVxICE9IFNCUl9JTlRFUlBPTF9GUkVRX0RFRkFVTFQpIHx8Ci0gICAgICAocGFyYW1zLT5zYnJfc21vb3RoaW5nX2xlbmd0aCAhPSBTQlJfU01PT1RISU5HX0xFTkdUSF9ERUZBVUxUKSkKLSAgewotICAgICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5oZWFkZXJfZXh0cmFfMiA9IDE7CisgICAgICAocGFyYW1zLT5zYnJfc21vb3RoaW5nX2xlbmd0aCAhPSBTQlJfU01PT1RISU5HX0xFTkdUSF9ERUZBVUxUKSkgeworICAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLmhlYWRlcl9leHRyYV8yID0gMTsKICAgfQogCi0gICAvKiBvdGhlciBzd2l0Y2hlcyAqLwotICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS51c2VXYXZlQ29kaW5nICAgICAgICAgICAgID0gcGFyYW1zLT51c2VXYXZlQ29kaW5nOwotICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS51c2VQYXJhbWV0cmljQ29kaW5nICAgICAgID0gcGFyYW1zLT5wYXJhbWV0cmljQ29kaW5nOwotICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS50aHJlc2hvbGRBbXBSZXNGRl9tICAgICAgID0gcGFyYW1zLT50aHJlc2hvbGRfQW1wUmVzX0ZGX207Ci0gIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnRocmVzaG9sZEFtcFJlc0ZGX2UgICAgICAgPSBwYXJhbXMtPnRocmVzaG9sZF9BbXBSZXNfRkZfZTsKKyAgLyogb3RoZXIgc3dpdGNoZXMgKi8KKyAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEudXNlV2F2ZUNvZGluZyA9IHBhcmFtcy0+dXNlV2F2ZUNvZGluZzsKKyAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEudXNlUGFyYW1ldHJpY0NvZGluZyA9IHBhcmFtcy0+cGFyYW1ldHJpY0NvZGluZzsKKyAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEudGhyZXNob2xkQW1wUmVzRkZfbSA9CisgICAgICBwYXJhbXMtPnRocmVzaG9sZF9BbXBSZXNfRkZfbTsKKyAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEudGhyZXNob2xkQW1wUmVzRkZfZSA9CisgICAgICBwYXJhbXMtPnRocmVzaG9sZF9BbXBSZXNfRkZfZTsKIAogICAvKiBpbml0IGZyZXEgYmFuZCB0YWJsZSAqLwotICBpZih1cGRhdGVGcmVxQmFuZFRhYmxlKCZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5kb3duU2FtcGxlRmFjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgKSkKLSAgewotICAgIHJldHVybigxKTsKKyAgaWYgKHVwZGF0ZUZyZXFCYW5kVGFibGUoJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+ZG93blNhbXBsZUZhY3RvcikpIHsKKyAgICByZXR1cm4gKDEpOwogICB9CiAKICAgLyogbm93IGNyZWF0ZSBlbnZlbG9wZSBleHQgYW5kIFFNRiBmb3IgZWFjaCBhdmFpbGFibGUgY2hhbm5lbCAqLwotICBmb3IgKCBjaCA9IDA7IGNoIDwgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzOyBjaCsrICkgewotCi0gICAgIGlmICggaW5pdEVudkNoYW5uZWwoJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickNoYW5uZWxbY2hdLT5oRW52Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXNJbml0RmxhZwotICAgICAgICAgICAgICAgICAgICAgICAgLGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAsZHluYW1pY19SQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICApICkKLSAgICAgewotICAgICAgIHJldHVybigxKTsKLSAgICAgfQotCisgIGZvciAoY2ggPSAwOyBjaCA8IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5DaGFubmVsczsgY2grKykgeworICAgIGlmIChpbml0RW52Q2hhbm5lbCgmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEsICZoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJDaGFubmVsW2NoXS0+aEVudkNoYW5uZWwsIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzSW5pdEZsYWcsIGNoLCBkeW5hbWljX1JBTSkpIHsKKyAgICAgIHJldHVybiAoMSk7CisgICAgfQogCiAgIH0gLyogbkNoYW5uZWxzICovCiAKICAgLyogcmVzZXQgYW5kIGludGlhbGl6ZSBhbmFseXNpcyBxbWYgKi8KLSAgZm9yICggY2ggPSAwOyBjaCA8ICgoaFNickVsZW1lbnQtPmVsSW5mby5mUGFyYW1ldHJpY1N0ZXJlbyk/MjpoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHMpOyBjaCsrICkKLSAgeworICBmb3IgKGNoID0gMDsgY2ggPCAoKGhTYnJFbGVtZW50LT5lbEluZm8uZlBhcmFtZXRyaWNTdGVyZW8pCisgICAgICAgICAgICAgICAgICAgICAgICAgPyAyCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHMpOworICAgICAgIGNoKyspIHsKICAgICBpbnQgZXJyOwotICAgIFVJTlQgcW1mRmxhZ3MgPSAoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgPyBRTUZfRkxBR19DTERGQiA6IDA7CisgICAgVUlOVCBxbWZGbGFncyA9CisgICAgICAgIChoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKQorICAgICAgICAgICAgPyBRTUZfRkxBR19DTERGQgorICAgICAgICAgICAgOiAwOwogICAgIGlmIChzdGF0ZXNJbml0RmxhZykKICAgICAgIHFtZkZsYWdzICY9IH5RTUZfRkxBR19LRUVQX1NUQVRFUzsKICAgICBlbHNlCi0gICAgICBxbWZGbGFncyB8PSAgUU1GX0ZMQUdfS0VFUF9TVEFURVM7CisgICAgICBxbWZGbGFncyB8PSBRTUZfRkxBR19LRUVQX1NUQVRFUzsKIAotICAgIGVyciA9IHFtZkluaXRBbmFseXNpc0ZpbHRlckJhbmsoIGhTYnJFbGVtZW50LT5oUW1mQW5hbHlzaXNbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1FBUyopaFNickVsZW1lbnQtPmhRbWZBbmFseXNpc1tjaF0tPkZpbHRlclN0YXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZlNsb3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFtZkZsYWdzICk7Ci0gICAgaWYgKDAhPWVycikgeworICAgIGVyciA9IHFtZkluaXRBbmFseXNpc0ZpbHRlckJhbmsoCisgICAgICAgIGhTYnJFbGVtZW50LT5oUW1mQW5hbHlzaXNbY2hdLAorICAgICAgICAoRklYUF9RQVMgKiloU2JyRWxlbWVudC0+aFFtZkFuYWx5c2lzW2NoXS0+RmlsdGVyU3RhdGVzLAorICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZlNsb3RzLAorICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzLAorICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzLAorICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzLCBxbWZGbGFncyk7CisgICAgaWYgKDAgIT0gZXJyKSB7CiAgICAgICByZXR1cm4gZXJyOwogICAgIH0KICAgfQogCiAgIC8qICAqLwogICBoU2JyRWxlbWVudC0+Q21vbkRhdGEueE92ZXJGcmVxID0gaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEueE92ZXJGcmVxOwotICBoU2JyRWxlbWVudC0+Q21vbkRhdGEuZHluQndFbmFibGVkID0gKHBhcmFtcy0+ZHluQndTdXBwb3J0ZWQgJiYgcGFyYW1zLT5keW5Cd0VuYWJsZWQpOwotICBoU2JyRWxlbWVudC0+Q21vbkRhdGEuZHluWE92ZXJGcmVxRW5jID0gRkRLc2JyRW5jX1NickdldFhPdmVyRnJlcSggaFNickVsZW1lbnQsIGhTYnJFbGVtZW50LT5DbW9uRGF0YS54T3ZlckZyZXEpOwotICBmb3IgKCBpID0gMDsgaSA8IDU7IGkrKyApCi0gICAgICBoU2JyRWxlbWVudC0+ZHluWE92ZXJGcmVxRGVsYXlbaV0gPSBoU2JyRWxlbWVudC0+Q21vbkRhdGEuZHluWE92ZXJGcmVxRW5jOwotICBoU2JyRWxlbWVudC0+Q21vbkRhdGEuc2JyTnVtQ2hhbm5lbHMgID0gaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzOworICBoU2JyRWxlbWVudC0+Q21vbkRhdGEuZHluQndFbmFibGVkID0KKyAgICAgIChwYXJhbXMtPmR5bkJ3U3VwcG9ydGVkICYmIHBhcmFtcy0+ZHluQndFbmFibGVkKTsKKyAgaFNickVsZW1lbnQtPkNtb25EYXRhLmR5blhPdmVyRnJlcUVuYyA9CisgICAgICBGREtzYnJFbmNfU2JyR2V0WE92ZXJGcmVxKGhTYnJFbGVtZW50LCBoU2JyRWxlbWVudC0+Q21vbkRhdGEueE92ZXJGcmVxKTsKKyAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICBoU2JyRWxlbWVudC0+ZHluWE92ZXJGcmVxRGVsYXlbaV0gPSBoU2JyRWxlbWVudC0+Q21vbkRhdGEuZHluWE92ZXJGcmVxRW5jOworICBoU2JyRWxlbWVudC0+Q21vbkRhdGEuc2JyTnVtQ2hhbm5lbHMgPSBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHM7CiAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmR5blhPdmVyRnJlcSA9IGhTYnJFbGVtZW50LT5DbW9uRGF0YS54T3ZlckZyZXE7CiAKICAgLyogVXBkYXRlIEJhbmR3aXRoIHRvIGJlIHBhc3NlZCB0byB0aGUgY29yZSBlbmNvZGVyICovCiAgICpjb3JlQmFuZFdpdGggPSBoU2JyRWxlbWVudC0+Q21vbkRhdGEueE92ZXJGcmVxOwogCi0gIHJldHVybigwKTsKLSB9CisgIHJldHVybiAoMCk7Cit9CiAKLUlOVCBzYnJFbmNvZGVyX0dldEluQnVmZmVyU2l6ZShpbnQgbm9DaGFubmVscykKLXsKK0lOVCBzYnJFbmNvZGVyX0dldEluQnVmZmVyU2l6ZShpbnQgbm9DaGFubmVscykgewogICBJTlQgdGVtcDsKIAogICB0ZW1wID0gKDIwNDgpOwpAQCAtMTgzNSw1MyArMTg2NSw0MiBAQAogLyoKICAqIEVuY29kZSBEdW1teSBTQlIgcGF5bG9hZCBmcmFtZXMgdG8gZmlsbCB0aGUgZGVsYXkgbGluZXMuCiAgKi8KLXN0YXRpYwotSU5UIEZES3NickVuY19EZWxheUNvbXBlbnNhdGlvbiAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTkNPREVSIGhFbnZFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqdGltZUJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgIGludCBuLCBlbDsKK3N0YXRpYyBJTlQgRkRLc2JyRW5jX0RlbGF5Q29tcGVuc2F0aW9uKEhBTkRMRV9TQlJfRU5DT0RFUiBoRW52RW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqdGltZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgdGltZUJ1ZmZlckJ1ZlNpemUpIHsKKyAgaW50IG4sIGVsOwogCi0gICAgZm9yIChuPWhFbnZFbmMtPm5CaXRzdHJEZWxheTsgbj4wOyBuLS0pCi0gICAgewotICAgICAgZm9yIChlbD0wOyBlbDxoRW52RW5jLT5ub0VsZW1lbnRzOyBlbCsrKQotICAgICAgewotICAgICAgICBpZiAoRkRLc2JyRW5jX0VudkVuY29kZUZyYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZFbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUJ1ZmZlciArIGhFbnZFbmMtPmRvd25zYW1wbGVkT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZFbmMtPnNickVsZW1lbnRbZWxdLT5zYnJDb25maWdEYXRhLm5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBzYnJFbmNvZGVyX1VwZGF0ZUJ1ZmZlcnMoaEVudkVuYywgdGltZUJ1ZmZlcik7CisgIGZvciAobiA9IGhFbnZFbmMtPm5CaXRzdHJEZWxheTsgbiA+IDA7IG4tLSkgeworICAgIGZvciAoZWwgPSAwOyBlbCA8IGhFbnZFbmMtPm5vRWxlbWVudHM7IGVsKyspIHsKKyAgICAgIGlmIChGREtzYnJFbmNfRW52RW5jb2RlRnJhbWUoCisgICAgICAgICAgICAgIGhFbnZFbmMsIGVsLAorICAgICAgICAgICAgICB0aW1lQnVmZmVyICsgaEVudkVuYy0+ZG93bnNhbXBsZWRPZmZzZXQgLyBoRW52RW5jLT5uQ2hhbm5lbHMsCisgICAgICAgICAgICAgIHRpbWVCdWZmZXJCdWZTaXplLCBOVUxMLCBOVUxMLCAxKSkKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLQkgIHJldHVybiAwOworICAgIHNickVuY29kZXJfVXBkYXRlQnVmZmVycyhoRW52RW5jLCB0aW1lQnVmZmVyLCB0aW1lQnVmZmVyQnVmU2l6ZSk7CisgIH0KKyAgcmV0dXJuIDA7CiB9CiAKLVVJTlQgc2JyRW5jb2Rlcl9MaW1pdEJpdFJhdGUoVUlOVCBiaXRSYXRlLCBVSU5UIG51bUNoYW5uZWxzLCBVSU5UIGNvcmVTYW1wbGVSYXRlLCBBVURJT19PQkpFQ1RfVFlQRSBhb3QpCi17Ci0gIFVJTlQgbmV3Qml0UmF0ZTsKK1VJTlQgc2JyRW5jb2Rlcl9MaW1pdEJpdFJhdGUoVUlOVCBiaXRSYXRlLCBVSU5UIG51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGNvcmVTYW1wbGVSYXRlLCBBVURJT19PQkpFQ1RfVFlQRSBhb3QpIHsKKyAgVUlOVCBuZXdCaXRSYXRlID0gYml0UmF0ZTsKICAgSU5UIGluZGV4OwogCiAgIEZES19BU1NFUlQobnVtQ2hhbm5lbHMgPiAwICYmIG51bUNoYW5uZWxzIDw9IDIpOwogICBpZiAoYW90ID09IEFPVF9QUykgewotICAgIGlmIChudW1DaGFubmVscyA9PSAyKSB7CisgICAgaWYgKG51bUNoYW5uZWxzID09IDEpIHsKICAgICAgIGluZGV4ID0gZ2V0UHNUdW5pbmdUYWJsZUluZGV4KGJpdFJhdGUsICZuZXdCaXRSYXRlKTsKICAgICAgIGlmIChpbmRleCA9PSBJTlZBTElEX1RBQkxFX0lEWCkgewogICAgICAgICBiaXRSYXRlID0gbmV3Qml0UmF0ZTsKICAgICAgIH0KLSAgICAgIC8qIFNldCBudW1DaGFubmVscyB0byAxIGJlY2F1c2UgZm9yIFBTIHdlIG5lZWQgYSBTQlIgU0NFIChtb25vKSBlbGVtZW50LiAqLwotICAgICAgbnVtQ2hhbm5lbHMgPSAxOwogICAgIH0gZWxzZSB7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgIH0KLSAgaW5kZXggPSBnZXRTYnJUdW5pbmdUYWJsZUluZGV4KGJpdFJhdGUsIG51bUNoYW5uZWxzLCBjb3JlU2FtcGxlUmF0ZSwgYW90LCAmbmV3Qml0UmF0ZSk7CisgIGluZGV4ID0gZ2V0U2JyVHVuaW5nVGFibGVJbmRleChiaXRSYXRlLCBudW1DaGFubmVscywgY29yZVNhbXBsZVJhdGUsIGFvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdCaXRSYXRlKTsKICAgaWYgKGluZGV4ICE9IElOVkFMSURfVEFCTEVfSURYKSB7CiAgICAgbmV3Qml0UmF0ZSA9IGJpdFJhdGU7CiAgIH0KQEAgLTE4ODksNTIzICsxOTA4LDY0MCBAQAogICByZXR1cm4gbmV3Qml0UmF0ZTsKIH0KIAotVUlOVCBzYnJFbmNvZGVyX0lzU2luZ2xlUmF0ZVBvc3NpYmxlKEFVRElPX09CSkVDVF9UWVBFIGFvdCkKLXsKLSAgVUlOVCBpc1Bvc3NpYmxlPShBT1RfUFM9PWFvdCk/MDoxOworVUlOVCBzYnJFbmNvZGVyX0lzU2luZ2xlUmF0ZVBvc3NpYmxlKEFVRElPX09CSkVDVF9UWVBFIGFvdCkgeworICBVSU5UIGlzUG9zc2libGUgPSAoQU9UX1BTID09IGFvdCkgPyAwIDogMTsKICAgcmV0dXJuIGlzUG9zc2libGU7CiB9CiAKLUlOVCBzYnJFbmNvZGVyX0luaXQoCi0gICAgICAgIEhBTkRMRV9TQlJfRU5DT0RFUiAgIGhTYnJFbmNvZGVyLAotICAgICAgICBTQlJfRUxFTUVOVF9JTkZPICAgICBlbEluZm9bKDgpXSwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgbm9FbGVtZW50cywKLSAgICAgICAgSU5UX1BDTSAgICAgICAgICAgICAqaW5wdXRCdWZmZXIsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgKmNvcmVCYW5kd2lkdGgsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgKmlucHV0QnVmZmVyT2Zmc2V0LAotICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpudW1DaGFubmVscywKLSAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqY29yZVNhbXBsZVJhdGUsCi0gICAgICAgIFVJTlQgICAgICAgICAgICAgICAgKmRvd25TYW1wbGVGYWN0b3IsCi0gICAgICAgIElOVCAgICAgICAgICAgICAgICAgKmZyYW1lTGVuZ3RoLAotICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSAgICBhb3QsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgKmRlbGF5LAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1GYWN0b3IsCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIGhlYWRlclBlcmlvZCwKLSAgICAgICAgVUxPTkcgICAgICAgICAgICAgICAgc3RhdGVzSW5pdEZsYWcKLSAgICAgICAgKQotewotICAgIEhBTkRMRV9FUlJPUl9JTkZPIGVycm9ySW5mbyA9IG5vRXJyb3I7Ci0gICAgc2JyQ29uZmlndXJhdGlvbiBzYnJDb25maWdbKDgpXTsKLSAgICBJTlQgZXJyb3IgPSAwOwotICAgIElOVCBsb3dlc3RCYW5kd2lkdGg7Ci0gICAgLyogU2F2ZSBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgSU5UIGlucHV0U2FtcGxlUmF0ZSA9ICpjb3JlU2FtcGxlUmF0ZTsKLSAgICBpbnQgY29yZUZyYW1lTGVuZ3RoID0gKmZyYW1lTGVuZ3RoOwotICAgIGludCBpbnB1dEJhbmRXaWR0aCA9ICpjb3JlQmFuZHdpZHRoOwotICAgIGludCBpbnB1dENoYW5uZWxzID0gKm51bUNoYW5uZWxzOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLypmdW5jdGlvbm5hbWU6IHNickVuY29kZXJfSW5pdF9kZWxheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLypkZXNjcmlwdGlvbjogIERldGVybWluZSBEZWxheSBiYWxhbmNpbmcgYW5kIG5ldyBlbmNvZGVyIGRlbGF5ICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLypyZXR1cm5zOiAgICAgIC0gZXJyb3Igc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyppbnB1dDogICAgICAgIC0gZnJhbWUgbGVuZ3RoIG9mIHRoZSBjb3JlIChpLmUuIGUuZy4gQUFDKSAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIC0gZG93bnNhbXBsZSBmYWN0b3IgKDEgZm9yIGRvd25zYW1wbGVkLCAyIGZvciBkdWFsLXJhdGUgU0JSKSAqLworLyogICAgICAgICAgICAgIC0gbG93IGRlbGF5IHByZXNlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIC0gcHMgcHJlc2VuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIC0gZG93bnNhbXBsaW5nIG1ldGhvZDogUU1GLSwgdGltZSBkb21haW4gb3Igbm8gZG93bnNhbXBsaW5nICAqLworLyogICAgICAgICAgICAgIC0gdmFyaW91cyBkZWxheSB2YWx1ZXMgKHNlZSBERUxBWV9QQVJBTSBzdHJ1Y3QgZGVzY3JpcHRpb24pICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLypFeGFtcGxlOiBEZWxheSBiYWxhbmNpbmcgZm9yIGEgSEUtQUFDdjEgZW5jb2RlciAodGltZS1kb21haW4gZG93bnNhbXBsaW5nKSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgKy0tLS0tLS0tKyAgICAgICAgICAgICstLS0tLS0tLSsgKy0tLS0tLS0tKyArLS0tLS0tLS0rICstLS0tLS0tLSsgICAgICAqLworLyogICAgfGNvcmUgICAgfCAgICAgICAgICAgIHxkcyAyOjEgIHwgfEFBQyAgICAgfCB8UU1GICAgICB8IHxRTUYgICAgIHwgICAgICAqLworLyogICstK3BhdGggICAgKy0tLS0tLS0tLS0tLSsgICAgICAgICstK2NvcmUgICAgKy0rYW5hbHlzaXMrLStvdmVybGFwICstKyAgICAqLworLyogIHwgfG9mZnNldCAgfCAgICAgICAgICAgIHwgICAgICAgIHwgfCAgICAgICAgfCB8MzIgYmFuZHN8IHwgICAgICAgIHwgfCAgICAqLworLyogIHwgKy0tLS0tLS0tKyAgICAgICAgICAgICstLS0tLS0tLSsgKy0tLS0tLS0tKyArLS0tLS0tLS0rICstLS0tLS0tLSsgfCAgICAqLworLyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlIHBhdGggICAgICAgICAgICAgICAgICAgICstLS0tLS0tKysgICAqLworLyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxRTUYgICAgIHwgICAqLworLyotPisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICtzeW50aC4gICstPiAqLworLyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHw2NCBiYW5kc3wgICAqLworLyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKysgICAqLworLyogIHwgKy0tLS0tLS0tKyArLS0tLS0tLS0rICstLS0tLS0tLSsgKy0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgfCAgICAqLworLyogIHwgfFNCUiBwYXRofCB8UU1GICAgICB8IHxzdWJiYW5kIHwgfGJzIGRlbGF5fCAgICAgICAgICAgICAgICAgICAgICAgfCAgICAqLworLyogICstK29mZnNldCAgKy0rYW5hbHlzaXMrLStzYW1wbGUgICstKyhmdWxsICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAqLworLyogICAgfCAgICAgICAgfCB8NjQgYmFuZHN8IHxidWZmZXIgIHwgfCBmcmFtZXMpfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgKy0tLS0tLS0tKyArLS0tLS0tLS0rICstLS0tLS0tLSsgKy0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlIgcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIElOVCBzYnJFbmNvZGVyX0luaXRfZGVsYXkoCisgICAgY29uc3QgaW50IGNvcmVGcmFtZUxlbmd0aCwgICAgICAgICAgICAgICAvKiBpbnB1dCAqLworICAgIGNvbnN0IGludCBudW1DaGFubmVscywgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgKi8KKyAgICBjb25zdCBpbnQgZG93blNhbXBsZUZhY3RvciwgICAgICAgICAgICAgIC8qIGlucHV0ICovCisgICAgY29uc3QgaW50IGxvd0RlbGF5LCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCAqLworICAgIGNvbnN0IGludCB1c2VQcywgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgKi8KKyAgICBjb25zdCBpbnQgaXMyMTIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0ICovCisgICAgY29uc3QgU0JSRU5DX0RTX1RZUEUgZG93bnNhbXBsaW5nTWV0aG9kLCAvKiBpbnB1dCAqLworICAgIERFTEFZX1BBUkFNICpoRGVsYXlQYXJhbSAgICAgICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0ICovCispIHsKKyAgaW50IGRlbGF5Q29yZVBhdGggPSAwOyAgIC8qIGRlbGF5IGluIGNvcmUgcGF0aCAqLworICBpbnQgZGVsYXlTYnJQYXRoID0gMDsgICAgLyogZGVsYXkgZGlmZmVyZW5jZSBpbiBRTUYgYWthIFNCUiBwYXRoICovCisgIGludCBkZWxheUlucHV0MkNvcmUgPSAwOyAvKiBkZWxheSBmcm9tIHRoZSBpbnB1dCB0byB0aGUgY29yZSAqLworICBpbnQgZGVsYXlTYnJEZWMgPSAwOyAgICAgLyogZGVsYXkgb2YgdGhlIGRlY29kZXIncyBTQlIgbW9kdWxlICovCiAKLSAgICBpbnQgZG93bnNhbXBsZWRPZmZzZXQgPSAwOwotICAgIGludCBzYnJPZmZzZXQgPSAwOwotICAgIGludCBkb3duc2FtcGxlckRlbGF5ID0gMDsKLSAgICBpbnQgdGltZURvbWFpbkRvd25zYW1wbGUgPSAwOwotICAgIGludCBuQml0c3RyRGVsYXkgPSAwOwotICAgIGludCBoaWdoZXN0U2JyU3RhcnRGcmVxLCBoaWdoZXN0U2JyU3RvcEZyZXE7Ci0gICAgaW50IGxvd0RlbGF5ID0gMDsKLSAgICBpbnQgdXNlUHMgPSAwOworICBpbnQgZGVsYXlDb3JlID0gaERlbGF5UGFyYW0tPmRlbGF5OyAvKiBkZWxheSBvZiB0aGUgY29yZSAqLwogCi0gICAgLyogY2hlY2sgd2hldGhlciBTQlIgc2V0dGluZyBpcyBhdmFpbGFibGUgZm9yIHRoZSBjdXJyZW50IGVuY29kZXIgY29uZmlndXJhdGlvbiAoYml0cmF0ZSwgc2FtcGxlcmF0ZSkgKi8KLSAgICBpZiAoIXNickVuY29kZXJfSXNTaW5nbGVSYXRlUG9zc2libGUoYW90KSkgewotICAgICAgKmRvd25TYW1wbGVGYWN0b3IgPSAyOworICAvKiBBZGRlZCBkZWxheSBieSB0aGUgU0JSIGRlbGF5IGluaXRpYWxpemF0aW9uICovCisgIGludCBjb3JlUGF0aE9mZnNldCA9IDA7IC8qIGNvcmUgcGF0aCAqLworICBpbnQgc2JyUGF0aE9mZnNldCA9IDA7ICAvKiBzYnIgcGF0aCAqLworICBpbnQgYml0c3RyZWFtRGVsYXkgPSAwOyAvKiBzYnIgcGF0aCwgZnJhbWV3aXNlICovCisKKyAgaW50IGZsQ29yZSA9IGNvcmVGcmFtZUxlbmd0aDsgLyogY29yZSBmcmFtZSBsZW5ndGggKi8KKworICBpbnQgcmV0dXJuVmFsdWUgPSAwOyAvKiByZXR1cm4gdmFsdWUgLSAwIG1lYW5zOiBubyBlcnJvciAqLworCisgIC8qIDEpIENhbGN1bGF0ZSBhY3R1YWwgZGVsYXkgIGZvciBjb3JlIGFuZCBTQlIgcGF0aCAqLworICBpZiAoaXMyMTIpIHsKKyAgICBkZWxheUNvcmVQYXRoID0gREVMQVlfQ09SRVBBVEhfRUxEdjJTQlIoZmxDb3JlLCBkb3duU2FtcGxlRmFjdG9yKTsKKyAgICBkZWxheVNiclBhdGggPSBERUxBWV9FTER2MlNCUihmbENvcmUsIGRvd25TYW1wbGVGYWN0b3IpOworICAgIGRlbGF5U2JyRGVjID0gKChmbENvcmUpIC8gMikgKiAoZG93blNhbXBsZUZhY3Rvcik7CisgIH0gZWxzZSBpZiAobG93RGVsYXkpIHsKKyAgICBkZWxheUNvcmVQYXRoID0gREVMQVlfQ09SRVBBVEhfRUxEU0JSKGZsQ29yZSwgZG93blNhbXBsZUZhY3Rvcik7CisgICAgZGVsYXlTYnJQYXRoID0gREVMQVlfRUxEU0JSKGZsQ29yZSwgZG93blNhbXBsZUZhY3Rvcik7CisgICAgZGVsYXlTYnJEZWMgPSBERUxBWV9RTUZfUE9TVFBST0MoZG93blNhbXBsZUZhY3Rvcik7CisgIH0gZWxzZSBpZiAodXNlUHMpIHsKKyAgICBkZWxheUNvcmVQYXRoID0gREVMQVlfQ09SRVBBVEhfUFMoZmxDb3JlLCBkb3duU2FtcGxlRmFjdG9yKTsKKyAgICBkZWxheVNiclBhdGggPSBERUxBWV9QUyhmbENvcmUsIGRvd25TYW1wbGVGYWN0b3IpOworICAgIGRlbGF5U2JyRGVjID0gREVMQVlfQ09SRVBBVEhfU0JSKGZsQ29yZSwgZG93blNhbXBsZUZhY3Rvcik7CisgIH0gZWxzZSB7CisgICAgZGVsYXlDb3JlUGF0aCA9IERFTEFZX0NPUkVQQVRIX1NCUihmbENvcmUsIGRvd25TYW1wbGVGYWN0b3IpOworICAgIGRlbGF5U2JyUGF0aCA9IERFTEFZX1NCUihmbENvcmUsIGRvd25TYW1wbGVGYWN0b3IpOworICAgIGRlbGF5U2JyRGVjID0gREVMQVlfQ09SRVBBVEhfU0JSKGZsQ29yZSwgZG93blNhbXBsZUZhY3Rvcik7CisgIH0KKyAgZGVsYXlDb3JlUGF0aCArPSBkZWxheUNvcmUgKiBkb3duU2FtcGxlRmFjdG9yOworICBkZWxheUNvcmVQYXRoICs9CisgICAgICAoZG93bnNhbXBsaW5nTWV0aG9kID09IFNCUkVOQ19EU19USU1FKSA/IGhEZWxheVBhcmFtLT5kc0RlbGF5IDogMDsKKworICAvKiAyKSBNYW5hZ2UgY291cGxpbmcgb2YgcGF0aHMgKi8KKyAgaWYgKGRvd25zYW1wbGluZ01ldGhvZCA9PSBTQlJFTkNfRFNfUU1GICYmIGRlbGF5Q29yZVBhdGggPiBkZWxheVNiclBhdGgpIHsKKyAgICAvKiBJbiBjYXNlIG9mIFFNRiBkb3duc2FtcGxpbmcsIGJvdGggcGF0aHMgYXJlIGNvdXBsZWQsIGkuZS4gdGhlIFNCUiBwYXRoCisgICAgICAgb2Zmc2V0IHdvdWxkIGJlIGFkZGVkIHRvIGJvdGggdGhlIFNCUiBwYXRoIGFuZCB0byB0aGUgY29yZSBwYXRoCisgICAgICAgYXMgd2VsbCwgdGh1cyBtYWtpbmcgaXQgaW1wb3NzaWJsZSB0byBhY2hpZXZlIGRlbGF5IGJhbGFuY2luZy4KKyAgICAgICBUbyBvdmVyY29tZSB0aGF0IHByb2JsZW0sIGEgZnJhbWV3aXNlIGRlbGF5IGlzIGFkZGVkIHRvIHRoZSBTQlIgcGF0aAorICAgICAgIGZpcnN0LCB1bnRpbCB0aGUgb3ZlcmFsbCBkZWxheSBvZiB0aGUgY29yZSBwYXRoIGlzIHNob3J0ZXIgdGhhbgorICAgICAgIHRoZSBkZWxheSBvZiB0aGUgU0JSIHBhdGguIFdoZW4gdGhpcyBpcyBhY2hpZXZlZCwgdGhlIG1pc3NpbmcgZGVsYXkKKyAgICAgICBkaWZmZXJlbmNlIGNhbiBiZSBhZGRlZCBhcyBkb3duc2FtcGxlZCBvZmZzZXQgdG8gdGhlIGNvcmUgcGF0aC4KKyAgICAqLworICAgIHdoaWxlIChkZWxheUNvcmVQYXRoID4gZGVsYXlTYnJQYXRoKSB7CisgICAgICAvKiBBZGQgb25lIGZyYW1lIGRlbGF5IHRvIFNCUiBwYXRoICovCisgICAgICBkZWxheVNiclBhdGggKz0gZmxDb3JlICogZG93blNhbXBsZUZhY3RvcjsKKyAgICAgIGJpdHN0cmVhbURlbGF5ICs9IDE7CiAgICAgfQorICB9CiAKLQotCi0gICAgaWYgKCBhb3Q9PUFPVF9QUyApIHsKLSAgICAgICAgdXNlUHMgPSAxOworICAvKiAzKSBDYWxjdWxhdGUgbmVjZXNzYXJ5IGFkZGl0aW9uYWwgZGVsYXkgdG8gYmFsYW5jZSB0aGUgcGF0aHMgKi8KKyAgaWYgKGRlbGF5Q29yZVBhdGggPiBkZWxheVNiclBhdGgpIHsKKyAgICAvKiBEZWxheSBRTUYgaW5wdXQgKi8KKyAgICB3aGlsZSAoZGVsYXlDb3JlUGF0aCA+IGRlbGF5U2JyUGF0aCArIChpbnQpZmxDb3JlICogKGludClkb3duU2FtcGxlRmFjdG9yKSB7CisgICAgICAvKiBEbyBiaXRzdHJlYW0gZnJhbWUtd2lzZSBkZWxheSBiYWxhbmNpbmcgaWYgdGhlcmUgYXJlCisgICAgICAgICBtb3JlIHRoYW4gU0JSIGZyYW1lbGVuZ3RoIHNhbXBsZXMgZGVsYXkgZGlmZmVyZW5jZSAqLworICAgICAgZGVsYXlTYnJQYXRoICs9IGZsQ29yZSAqIGRvd25TYW1wbGVGYWN0b3I7CisgICAgICBiaXRzdHJlYW1EZWxheSArPSAxOwogICAgIH0KLSAgICBpZiAoIGFvdD09QU9UX0VSX0FBQ19FTEQgKSB7Ci0gICAgICAgIGxvd0RlbGF5ID0gMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIGFvdD09QU9UX0VSX0FBQ19MRCApIHsKLSAgICAgICAgZXJyb3IgPSAxOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgfQorICAgIC8qIE11bHRpcGx5IGlucHV0IG9mZnNldCBieSBpbnB1dCBjaGFubmVscyAqLworICAgIGNvcmVQYXRoT2Zmc2V0ID0gMDsKKyAgICBzYnJQYXRoT2Zmc2V0ID0gKGRlbGF5Q29yZVBhdGggLSBkZWxheVNiclBhdGgpICogbnVtQ2hhbm5lbHM7CisgIH0gZWxzZSB7CisgICAgLyogRGVsYXkgQUFDIGRhdGEgKi8KKyAgICAvKiBNdWx0aXBseSBkb3duc2FtcGxlZCBvZmZzZXQgYnkgQUFDIGNvcmUgY2hhbm5lbHMuIERpdmlkZSBieSAyIGJlY2F1c2Ugb2YKKyAgICAgICBoYWxmIHNhbXBsZXJhdGUgb2YgZG93bnNhbXBsZWQgZGF0YS4gKi8KKyAgICBjb3JlUGF0aE9mZnNldCA9ICgoZGVsYXlTYnJQYXRoIC0gZGVsYXlDb3JlUGF0aCkgKiBudW1DaGFubmVscykgPj4KKyAgICAgICAgICAgICAgICAgICAgIChkb3duU2FtcGxlRmFjdG9yIC0gMSk7CisgICAgc2JyUGF0aE9mZnNldCA9IDA7CisgIH0KIAotICAgIC8qIFBhcmFtZXRyaWMgU3RlcmVvICovCi0gICAgaWYgKCB1c2VQcyApIHsKLSAgICAgIGlmICggKm51bUNoYW5uZWxzID09IDIgJiYgbm9FbGVtZW50cyA9PSAxKSB7Ci0gICAgICAgIC8qIE92ZXJyaWRlIEVsZW1lbnQgdHlwZSBpbiBjYXNlIG9mIFBhcmFtZXRyaWMgc3RlcmVvICovCi0gICAgICAgIGVsSW5mb1swXS5lbFR5cGUgPSBJRF9TQ0U7Ci0gICAgICAgIGVsSW5mb1swXS5mUGFyYW1ldHJpY1N0ZXJlbyA9IDE7Ci0gICAgICAgIGVsSW5mb1swXS5uQ2hhbm5lbHNJbkVsID0gMTsKLSAgICAgICAgLyogY29yZSBlbmNvZGVyIGdldHMgZG93bm1peGVkIG1vbm8gc2lnbmFsICovCi0gICAgICAgICpudW1DaGFubmVscyAgPSAxOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZXJyb3IgPSAxOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICB9Ci0gICAgfSAvKiB1c2VQcyAqLworICAvKiA0KSBDYWxjdWxhdGUgZGVsYXkgZnJvbSBpbnB1dCB0byBjb3JlICovCisgIGlmICh1c2VQcykgeworICAgIGRlbGF5SW5wdXQyQ29yZSA9CisgICAgICAgIChERUxBWV9RTUZfQU5BKGRvd25TYW1wbGVGYWN0b3IpICsgREVMQVlfUU1GX0RTICsgREVMQVlfSFlCX1NZTikgKworICAgICAgICAoZG93blNhbXBsZUZhY3RvciAqIGNvcmVQYXRoT2Zmc2V0KSArIDE7CisgIH0gZWxzZSBpZiAoZG93bnNhbXBsaW5nTWV0aG9kID09IFNCUkVOQ19EU19USU1FKSB7CisgICAgZGVsYXlJbnB1dDJDb3JlID0gY29yZVBhdGhPZmZzZXQgKyBoRGVsYXlQYXJhbS0+ZHNEZWxheTsKKyAgfSBlbHNlIHsKKyAgICBkZWxheUlucHV0MkNvcmUgPSBjb3JlUGF0aE9mZnNldDsKKyAgfQogCi0gICAgLyogc2V0IHRoZSBjb3JlJ3Mgc2FtcGxlIHJhdGUgKi8KLSAgICBzd2l0Y2ggKCpkb3duU2FtcGxlRmFjdG9yKSB7CisgIC8qIDYpIFNldCBvdXRwdXQgcGFyYW1ldGVycyAqLworICBoRGVsYXlQYXJhbS0+ZGVsYXkgPSBGREttYXgoZGVsYXlDb3JlUGF0aCwgZGVsYXlTYnJQYXRoKTsgLyogb3ZlcmFsbCBkZWxheSAqLworICBoRGVsYXlQYXJhbS0+c2JyRGVjRGVsYXkgPSBkZWxheVNickRlYzsgICAgICAgICAvKiBTQlIgZGVjb2RlciBkZWxheSAqLworICBoRGVsYXlQYXJhbS0+ZGVsYXlJbnB1dDJDb3JlID0gZGVsYXlJbnB1dDJDb3JlOyAvKiBkZWxheSBpbnB1dCAtIGNvcmUgKi8KKyAgaERlbGF5UGFyYW0tPmJpdHN0ckRlbGF5ID0gYml0c3RyZWFtRGVsYXk7ICAgIC8qIGJpdHN0cmVhbSBkZWxheSwgaW4gZnJhbWVzICovCisgIGhEZWxheVBhcmFtLT5jb3JlUGF0aE9mZnNldCA9IGNvcmVQYXRoT2Zmc2V0OyAvKiBvZmZzZXQgYWRkZWQgdG8gY29yZSBwYXRoICovCisgIGhEZWxheVBhcmFtLT5zYnJQYXRoT2Zmc2V0ID0gc2JyUGF0aE9mZnNldDsgICAvKiBvZmZzZXQgYWRkZWQgdG8gU0JSIHBhdGggKi8KKworICByZXR1cm4gcmV0dXJuVmFsdWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgZnVuY3Rpb25uYW1lOiBzYnJFbmNvZGVyX0luaXQKKyBkZXNjcmlwdGlvbjogIGluaXRpYWxpemVzIHRoZSBTQlIgZW5jb2RlcgorIHJldHVybnM6ICAgICAgZXJyb3Igc3RhdHVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UIHNickVuY29kZXJfSW5pdChIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgIFNCUl9FTEVNRU5UX0lORk8gZWxJbmZvWyg4KV0sIGludCBub0VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICBJTlRfUENNICppbnB1dEJ1ZmZlciwgVUlOVCBpbnB1dEJ1ZmZlckJ1ZlNpemUsCisgICAgICAgICAgICAgICAgICAgIElOVCAqY29yZUJhbmR3aWR0aCwgSU5UICppbnB1dEJ1ZmZlck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgSU5UICpudW1DaGFubmVscywgY29uc3QgVUlOVCBzeW50YXhGbGFncywKKyAgICAgICAgICAgICAgICAgICAgSU5UICpjb3JlU2FtcGxlUmF0ZSwgVUlOVCAqZG93blNhbXBsZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgSU5UICpmcmFtZUxlbmd0aCwgQVVESU9fT0JKRUNUX1RZUEUgYW90LCBpbnQgKmRlbGF5LAorICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNmb3JtRmFjdG9yLCBjb25zdCBpbnQgaGVhZGVyUGVyaW9kLAorICAgICAgICAgICAgICAgICAgICBVTE9ORyBzdGF0ZXNJbml0RmxhZykgeworICBIQU5ETEVfRVJST1JfSU5GTyBlcnJvckluZm8gPSBub0Vycm9yOworICBzYnJDb25maWd1cmF0aW9uIHNickNvbmZpZ1soOCldOworICBJTlQgZXJyb3IgPSAwOworICBJTlQgbG93ZXN0QmFuZHdpZHRoOworICAvKiBTYXZlIGlucHV0IHBhcmFtZXRlcnMgKi8KKyAgSU5UIGlucHV0U2FtcGxlUmF0ZSA9ICpjb3JlU2FtcGxlUmF0ZTsKKyAgaW50IGNvcmVGcmFtZUxlbmd0aCA9ICpmcmFtZUxlbmd0aDsKKyAgaW50IGlucHV0QmFuZFdpZHRoID0gKmNvcmVCYW5kd2lkdGg7CisgIGludCBpbnB1dENoYW5uZWxzID0gKm51bUNoYW5uZWxzOworCisgIFNCUkVOQ19EU19UWVBFIGRvd25zYW1wbGluZ01ldGhvZCA9IFNCUkVOQ19EU19OT05FOworICBpbnQgaGlnaGVzdFNiclN0YXJ0RnJlcSwgaGlnaGVzdFNiclN0b3BGcmVxOworICBpbnQgbG93RGVsYXkgPSAwOworICBpbnQgdXNlUHMgPSAwOworICBpbnQgaXMyMTIgPSAwOworCisgIERFTEFZX1BBUkFNIGRlbGF5UGFyYW07CisKKyAgLyogY2hlY2sgd2hldGhlciBTQlIgc2V0dGluZyBpcyBhdmFpbGFibGUgZm9yIHRoZSBjdXJyZW50IGVuY29kZXIKKyAgICogY29uZmlndXJhdGlvbiAoYml0cmF0ZSwgc2FtcGxlcmF0ZSkgKi8KKyAgaWYgKCFzYnJFbmNvZGVyX0lzU2luZ2xlUmF0ZVBvc3NpYmxlKGFvdCkpIHsKKyAgICAqZG93blNhbXBsZUZhY3RvciA9IDI7CisgIH0KKworICBpZiAoYW90ID09IEFPVF9QUykgeworICAgIHVzZVBzID0gMTsKKyAgfQorICBpZiAoYW90ID09IEFPVF9FUl9BQUNfRUxEKSB7CisgICAgbG93RGVsYXkgPSAxOworICB9IGVsc2UgaWYgKGFvdCA9PSBBT1RfRVJfQUFDX0xEKSB7CisgICAgZXJyb3IgPSAxOworICAgIGdvdG8gYmFpbDsKKyAgfQorCisgIC8qIFBhcmFtZXRyaWMgU3RlcmVvICovCisgIGlmICh1c2VQcykgeworICAgIGlmICgqbnVtQ2hhbm5lbHMgPT0gMiAmJiBub0VsZW1lbnRzID09IDEpIHsKKyAgICAgIC8qIE92ZXJyaWRlIEVsZW1lbnQgdHlwZSBpbiBjYXNlIG9mIFBhcmFtZXRyaWMgc3RlcmVvICovCisgICAgICBlbEluZm9bMF0uZWxUeXBlID0gSURfU0NFOworICAgICAgZWxJbmZvWzBdLmZQYXJhbWV0cmljU3RlcmVvID0gMTsKKyAgICAgIGVsSW5mb1swXS5uQ2hhbm5lbHNJbkVsID0gMTsKKyAgICAgIC8qIGNvcmUgZW5jb2RlciBnZXRzIGRvd25taXhlZCBtb25vIHNpZ25hbCAqLworICAgICAgKm51bUNoYW5uZWxzID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgZXJyb3IgPSAxOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfSAvKiB1c2VQcyAqLworCisgIC8qIHNldCB0aGUgY29yZSdzIHNhbXBsZSByYXRlICovCisgIHN3aXRjaCAoKmRvd25TYW1wbGVGYWN0b3IpIHsKICAgICBjYXNlIDE6CiAgICAgICAqY29yZVNhbXBsZVJhdGUgPSBpbnB1dFNhbXBsZVJhdGU7CisgICAgICBkb3duc2FtcGxpbmdNZXRob2QgPSBTQlJFTkNfRFNfTk9ORTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgMjoKLSAgICAgICpjb3JlU2FtcGxlUmF0ZSA9IGlucHV0U2FtcGxlUmF0ZT4+MTsKKyAgICAgICpjb3JlU2FtcGxlUmF0ZSA9IGlucHV0U2FtcGxlUmF0ZSA+PiAxOworICAgICAgZG93bnNhbXBsaW5nTWV0aG9kID0gdXNlUHMgPyBTQlJFTkNfRFNfUU1GIDogU0JSRU5DX0RTX1RJTUU7CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgKmNvcmVTYW1wbGVSYXRlID0gaW5wdXRTYW1wbGVSYXRlPj4xOworICAgICAgKmNvcmVTYW1wbGVSYXRlID0gaW5wdXRTYW1wbGVSYXRlID4+IDE7CiAgICAgICByZXR1cm4gMDsgLyogcmV0dXJuIGVycm9yICovCisgIH0KKworICAvKiBjaGVjayB3aGV0aGVyIFNCUiBzZXR0aW5nIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGN1cnJlbnQgZW5jb2RlcgorICAgKiBjb25maWd1cmF0aW9uIChiaXRyYXRlLCBjb3JlU2FtcGxlUmF0ZSkgKi8KKyAgeworICAgIGludCBlbCwgY29yZUVsOworCisgICAgLyogQ2hlY2sgaWYgZXZlcnkgZWxlbWVudCBjb25maWcgaXMgZmVhc2libGUgKi8KKyAgICBmb3IgKGNvcmVFbCA9IDA7IGNvcmVFbCA8IG5vRWxlbWVudHM7IGNvcmVFbCsrKSB7CisgICAgICAvKiBTQlIgb25seSBoYW5kbGVzIFNDRSBhbmQgQ1BFJ3MgKi8KKyAgICAgIGlmIChlbEluZm9bY29yZUVsXS5lbFR5cGUgIT0gSURfU0NFICYmIGVsSW5mb1tjb3JlRWxdLmVsVHlwZSAhPSBJRF9DUEUpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAvKiBjaGVjayBpZiBkZXNpcmVkIGNvbmZpZ3VyYXRpb24gaXMgYXZhaWxhYmxlICovCisgICAgICBpZiAoIUZES3NickVuY19Jc1NiclNldHRpbmdBdmFpbChlbEluZm9bY29yZUVsXS5iaXRSYXRlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxJbmZvW2NvcmVFbF0ubkNoYW5uZWxzSW5FbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U2FtcGxlUmF0ZSwgKmNvcmVTYW1wbGVSYXRlLCBhb3QpKSB7CisgICAgICAgIGVycm9yID0gMTsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQogICAgIH0KIAotICAgIC8qIGNoZWNrIHdoZXRoZXIgU0JSIHNldHRpbmcgaXMgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gKGJpdHJhdGUsIGNvcmVTYW1wbGVSYXRlKSAqLwotICAgIHsKLSAgICAgIGludCBkZWxheURpZmYgPSAwOwotICAgICAgaW50IGVsLCBjb3JlRWw7CisgICAgaFNickVuY29kZXItPm5DaGFubmVscyA9ICpudW1DaGFubmVsczsKKyAgICBoU2JyRW5jb2Rlci0+ZnJhbWVTaXplID0gY29yZUZyYW1lTGVuZ3RoICogKmRvd25TYW1wbGVGYWN0b3I7CisgICAgaFNickVuY29kZXItPmRvd25zYW1wbGluZ01ldGhvZCA9IGRvd25zYW1wbGluZ01ldGhvZDsKKyAgICBoU2JyRW5jb2Rlci0+ZG93blNhbXBsZUZhY3RvciA9ICpkb3duU2FtcGxlRmFjdG9yOworICAgIGhTYnJFbmNvZGVyLT5lc3RpbWF0ZUJpdHJhdGUgPSAwOworICAgIGhTYnJFbmNvZGVyLT5pbnB1dERhdGFEZWxheSA9IDA7CisgICAgaXMyMTIgPSAoKGFvdCA9PSBBT1RfRVJfQUFDX0VMRCkgJiYgKHN5bnRheEZsYWdzICYgQUNfTERfTVBTKSkgPyAxIDogMDsKIAotICAgICAgLyogQ2hlY2sgaWYgZXZlcnkgZWxlbWVudCBjb25maWcgaXMgZmVhc2libGUgKi8KLSAgICAgIGZvciAoY29yZUVsPTA7IGNvcmVFbDxub0VsZW1lbnRzOyBjb3JlRWwrKykKLSAgICAgIHsKLSAgICAgICAgLyogU0JSIG9ubHkgaGFuZGxlcyBTQ0UgYW5kIENQRSdzICovCi0gICAgICAgIGlmIChlbEluZm9bY29yZUVsXS5lbFR5cGUgIT0gSURfU0NFICYmIGVsSW5mb1tjb3JlRWxdLmVsVHlwZSAhPSBJRF9DUEUpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvKiBjaGVjayBpZiBkZXNpcmVkIGNvbmZpZ3VyYXRpb24gaXMgYXZhaWxhYmxlICovCi0gICAgICAgIGlmICggIUZES3NickVuY19Jc1NiclNldHRpbmdBdmFpbCAoZWxJbmZvW2NvcmVFbF0uYml0UmF0ZSwgMCwgZWxJbmZvW2NvcmVFbF0ubkNoYW5uZWxzSW5FbCwgaW5wdXRTYW1wbGVSYXRlLCAqY29yZVNhbXBsZVJhdGUsIGFvdCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnJvciA9IDE7Ci0gICAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgIH0KLSAgICAgIH0KKyAgICAvKiBPcGVuIFNCUiBlbGVtZW50cyAqLworICAgIGVsID0gLTE7CisgICAgaGlnaGVzdFNiclN0YXJ0RnJlcSA9IGhpZ2hlc3RTYnJTdG9wRnJlcSA9IDA7CisgICAgbG93ZXN0QmFuZHdpZHRoID0gOTk5OTk7CiAKLSAgICAgIC8qIERldGVybWluZSBEZWxheSBiYWxhbmNpbmcgYW5kIG5ldyBlbmNvZGVyIGRlbGF5ICovCi0gICAgICBpZiAobG93RGVsYXkpIHsKLSAgICAgICAgewotICAgICAgICBkZWxheURpZmYgPSAoKmRlbGF5ICogKmRvd25TYW1wbGVGYWN0b3IpICsgREVMQVlfRUxEMlNCUihjb3JlRnJhbWVMZW5ndGgsKmRvd25TYW1wbGVGYWN0b3IpOwotICAgICAgICAqZGVsYXkgPSBERUxBWV9FTERTQlIoY29yZUZyYW1lTGVuZ3RoLCpkb3duU2FtcGxlRmFjdG9yKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAodXNlUHMpIHsKLSAgICAgICAgZGVsYXlEaWZmID0gKCpkZWxheSAqICpkb3duU2FtcGxlRmFjdG9yKSArIERFTEFZX0FBQzJQUyhjb3JlRnJhbWVMZW5ndGgsKmRvd25TYW1wbGVGYWN0b3IpOwotICAgICAgICAqZGVsYXkgPSBERUxBWV9QUyhjb3JlRnJhbWVMZW5ndGgsKmRvd25TYW1wbGVGYWN0b3IpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGRlbGF5RGlmZiA9IERFTEFZX0FBQzJTQlIoY29yZUZyYW1lTGVuZ3RoLCpkb3duU2FtcGxlRmFjdG9yKTsKLSAgICAgICAgZGVsYXlEaWZmICs9ICgqZGVsYXkgKiAqZG93blNhbXBsZUZhY3Rvcik7Ci0gICAgICAgICpkZWxheSA9IERFTEFZX1NCUihjb3JlRnJhbWVMZW5ndGgsKmRvd25TYW1wbGVGYWN0b3IpOwotICAgICAgfQotCi0gICAgICBpZiAoIXVzZVBzKSB7Ci0gICAgICAgICAgdGltZURvbWFpbkRvd25zYW1wbGUgPSAqZG93blNhbXBsZUZhY3Rvci0xOyAgLyogYWN0aXZhdGUgdGltZSBkb21haW4gZG93bnNhbXBsZXIgd2hlbiBkb3duU2FtcGxlRmFjdG9yIGlzICE9IDEgKi8KLSAgICAgIH0KLQotCi0gICAgICAvKiBUYWtlIGNhcmUgYWJvdXQgZG93bnNhbXBsZWQgZGF0YSBib3VuZCB0byB0aGUgU0JSIHBhdGggKi8KLSAgICAgIGlmICghdGltZURvbWFpbkRvd25zYW1wbGUgJiYgZGVsYXlEaWZmID4gMCkgewotICAgICAgICAvKgotICAgICAgICAgKiBXZSBtdXN0IHR3ZWFrIHRoZSBiYWxhbmNpbmcgaW50byBhIHNpdHVhdGlvbiB3aGVyZSB0aGUgZG93bnNhbXBsZWQgcGF0aAotICAgICAgICAgKiBpcyB0aGUgb25lIHRvIGJlIGRlbGF5ZWQsIGJlY2F1c2UgZGVsYXlpbmcgdGhlIFFNRiBkb21haW4gaW5wdXQsIGFsc28gZGVsYXlzCi0gICAgICAgICAqIHRoZSBkb3duc2FtcGxlZCBhdWRpbywgY291bnRlcmFjdGluZyB0byB0aGUgcHVycG9zZSBvZiBkZWxheSBiYWxhbmNpbmcuCi0gICAgICAgICAqLwotICAgICAgICB3aGlsZSAoIGRlbGF5RGlmZiA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogRW5jb2RlciBkZWxheSBpbmNyZWFzZXMgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICAqZGVsYXkgKz0gY29yZUZyYW1lTGVuZ3RoICogKmRvd25TYW1wbGVGYWN0b3I7Ci0gICAgICAgICAgICAvKiBBZGQgb25lIGZyYW1lIGRlbGF5IHRvIFNCUiBwYXRoICovCi0gICAgICAgICAgICBkZWxheURpZmYgLT0gY29yZUZyYW1lTGVuZ3RoICogKmRvd25TYW1wbGVGYWN0b3I7Ci0gICAgICAgICAgfQotICAgICAgICAgIG5CaXRzdHJEZWxheSArPSAxOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UKLSAgICAgIHsKLSAgICAgICAgKmRlbGF5ICs9IGZpeHBfYWJzKGRlbGF5RGlmZik7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkZWxheURpZmYgPCAwKSB7Ci0gICAgICAgIC8qIERlbGF5IEFBQyBkYXRhICovCi0gICAgICAgIGRlbGF5RGlmZiA9IC1kZWxheURpZmY7Ci0gICAgICAgIC8qIE11bHRpcGx5IGRvd25zYW1wbGVkIG9mZnNldCBieSBBQUMgY29yZSBjaGFubmVscy4gRGl2aWRlIGJ5IDIgYmVjYXVzZSBvZiBoYWxmIHNhbXBsZXJhdGUgb2YgZG93bnNhbXBsZWQgZGF0YS4gKi8KLSAgICAgICAgRkRLX0FTU0VSVCgqZG93blNhbXBsZUZhY3Rvcj4wICYmICpkb3duU2FtcGxlRmFjdG9yPD0yKTsKLSAgICAgICAgZG93bnNhbXBsZWRPZmZzZXQgPSAoZGVsYXlEaWZmKigqbnVtQ2hhbm5lbHMpKT4+KCpkb3duU2FtcGxlRmFjdG9yLTEpOwotICAgICAgICBzYnJPZmZzZXQgPSAwOworICAgIC8qIExvb3AgdGhyb3VnaCBlYWNoIGNvcmUgZW5jb2RlciBlbGVtZW50IGFuZCBnZXQgYSBtYXRjaGluZyBTQlIgZWxlbWVudAorICAgICAqIGNvbmZpZyAqLworICAgIGZvciAoY29yZUVsID0gMDsgY29yZUVsIDwgbm9FbGVtZW50czsgY29yZUVsKyspIHsKKyAgICAgIC8qIFNCUiBvbmx5IGhhbmRsZXMgU0NFIGFuZCBDUEUncyAqLworICAgICAgaWYgKGVsSW5mb1tjb3JlRWxdLmVsVHlwZSA9PSBJRF9TQ0UgfHwgZWxJbmZvW2NvcmVFbF0uZWxUeXBlID09IElEX0NQRSkgeworICAgICAgICBlbCsrOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogRGVsYXkgU0JSIGlucHV0ICovCi0gICAgICAgIGlmICggZGVsYXlEaWZmID4gKGludCljb3JlRnJhbWVMZW5ndGggKiAoaW50KSpkb3duU2FtcGxlRmFjdG9yICkKLSAgICAgICAgewotICAgICAgICAgIC8qIERvIGJpdHN0cmVhbSBmcmFtZS13aXNlIGRlbGF5IGJhbGFuY2luZyBpZiB3ZSBoYXZlIG1vcmUgdGhhbiBTQlIgZnJhbWVsZW5ndGggc2FtcGxlcyBkZWxheSBkaWZmZXJlbmNlICovCi0gICAgICAgICAgZGVsYXlEaWZmIC09IGNvcmVGcmFtZUxlbmd0aCAqICpkb3duU2FtcGxlRmFjdG9yOwotICAgICAgICAgIG5CaXRzdHJEZWxheSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgLyogTXVsdGlwbHkgaW5wdXQgb2Zmc2V0IGJ5IGlucHV0IGNoYW5uZWxzICovCi0gICAgICAgIHNick9mZnNldCA9IGRlbGF5RGlmZiooKm51bUNoYW5uZWxzKTsKLSAgICAgICAgZG93bnNhbXBsZWRPZmZzZXQgPSAwOwotICAgICAgfQotICAgICAgaFNickVuY29kZXItPm5CaXRzdHJEZWxheSAgICAgICAgICAgID0gbkJpdHN0ckRlbGF5OwotICAgICAgaFNickVuY29kZXItPm5DaGFubmVscyAgICAgICAgICAgICAgID0gKm51bUNoYW5uZWxzOwotICAgICAgaFNickVuY29kZXItPmZyYW1lU2l6ZSAgICAgICAgICAgICAgID0gY29yZUZyYW1lTGVuZ3RoICogKmRvd25TYW1wbGVGYWN0b3I7Ci0gICAgICBoU2JyRW5jb2Rlci0+ZlRpbWVEb21haW5Eb3duc2FtcGxpbmcgPSB0aW1lRG9tYWluRG93bnNhbXBsZTsKLSAgICAgIGhTYnJFbmNvZGVyLT5kb3duU2FtcGxlRmFjdG9yICAgICAgICA9ICpkb3duU2FtcGxlRmFjdG9yOwotICAgICAgaFNickVuY29kZXItPmVzdGltYXRlQml0cmF0ZSAgICAgICAgID0gMDsKLSAgICAgIGhTYnJFbmNvZGVyLT5pbnB1dERhdGFEZWxheSAgICAgICAgICA9IDA7Ci0KLQotICAgICAgLyogT3BlbiBTQlIgZWxlbWVudHMgKi8KLSAgICAgIGVsID0gLTE7Ci0gICAgICBoaWdoZXN0U2JyU3RhcnRGcmVxID0gaGlnaGVzdFNiclN0b3BGcmVxID0gMDsKLSAgICAgIGxvd2VzdEJhbmR3aWR0aCA9IDk5OTk5OwotCi0gICAgICAvKiBMb29wIHRocm91Z2ggZWFjaCBjb3JlIGVuY29kZXIgZWxlbWVudCBhbmQgZ2V0IGEgbWF0Y2hpbmcgU0JSIGVsZW1lbnQgY29uZmlnICovCi0gICAgICBmb3IgKGNvcmVFbD0wOyBjb3JlRWw8bm9FbGVtZW50czsgY29yZUVsKyspCi0gICAgICB7Ci0gICAgICAgIC8qIFNCUiBvbmx5IGhhbmRsZXMgU0NFIGFuZCBDUEUncyAqLwotICAgICAgICBpZiAoZWxJbmZvW2NvcmVFbF0uZWxUeXBlID09IElEX1NDRSB8fCBlbEluZm9bY29yZUVsXS5lbFR5cGUgPT0gSURfQ1BFKSB7Ci0gICAgICAgICAgZWwrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFNldCBwYXJhbWV0cmljIFN0ZXJlbyBGbGFnLiAqLwotICAgICAgICBpZiAodXNlUHMpIHsKLSAgICAgICAgICBlbEluZm9bY29yZUVsXS5mUGFyYW1ldHJpY1N0ZXJlbyA9IDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZWxJbmZvW2NvcmVFbF0uZlBhcmFtZXRyaWNTdGVyZW8gPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogSW5pdCBzYnJDb25maWcgc3RydWN0dXJlCi0gICAgICAgICAqLwotICAgICAgICBpZiAoICEgRkRLc2JyRW5jX0luaXRpYWxpemVTYnJEZWZhdWx0cyAoICZzYnJDb25maWdbZWxdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkb3duU2FtcGxlRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlRnJhbWVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX0xPV0RFTEFZKGFvdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IDE7Ci0gICAgICAgICAgZ290byBiYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogTW9kaWZ5IHNickNvbmZpZyBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIEVsZW1lbnQgcGFyYW1ldGVycwotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCAhIEZES3NickVuY19BZGp1c3RTYnJTZXR0aW5ncyAoJnNickNvbmZpZ1tlbF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbEluZm9bY29yZUVsXS5iaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxJbmZvW2NvcmVFbF0ubkNoYW5uZWxzSW5FbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvcmVTYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgIC8qIHVzZVNwZWVjaENvbmZpZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgIC8qIGxjc01vZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVBzLCAvKiBiUGFyYW1ldHJpY1N0ZXJlbyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90KSApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IDE7Ci0gICAgICAgICAgZ290byBiYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogRmluZCBjb21tb24gZnJlcXVlbmN5IGJvcmRlciBmb3IgYWxsIFNCUiBlbGVtZW50cyAqLwotICAgICAgICBoaWdoZXN0U2JyU3RhcnRGcmVxID0gZml4TWF4KGhpZ2hlc3RTYnJTdGFydEZyZXEsIHNickNvbmZpZ1tlbF0uc3RhcnRGcmVxKTsKLSAgICAgICAgaGlnaGVzdFNiclN0b3BGcmVxID0gZml4TWF4KGhpZ2hlc3RTYnJTdG9wRnJlcSwgc2JyQ29uZmlnW2VsXS5zdG9wRnJlcSk7Ci0KLSAgICAgIH0gLyogZmlyc3QgZWxlbWVudCBsb29wICovCi0KLSAgICAgIC8qIFNldCBlbGVtZW50IGNvdW50IChjYW4gYmUgbGVzcyB0aGFuIGNvcmUgZW5jb2RlciBlbGVtZW50IGNvdW50KSAqLwotICAgICAgaFNickVuY29kZXItPm5vRWxlbWVudHMgPSBlbCsxOwotCi0gICAgICBGREtzYnJFbmNfUmVhbGxvY2F0ZShoU2JyRW5jb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vRWxlbWVudHMpOwotCi0gICAgICBmb3IgKGVsPTA7IGVsPGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzOyBlbCsrKSB7Ci0KLSAgICAgICAgaW50IGJhbmR3aWR0aCA9ICpjb3JlQmFuZHdpZHRoOwotCi0gICAgICAgIC8qIFVzZSBsb3dlc3QgY29tbW9uIGJhbmR3aWR0aCAqLwotICAgICAgICBzYnJDb25maWdbZWxdLnN0YXJ0RnJlcSA9IGhpZ2hlc3RTYnJTdGFydEZyZXE7Ci0gICAgICAgIHNickNvbmZpZ1tlbF0uc3RvcEZyZXEgPSBoaWdoZXN0U2JyU3RvcEZyZXE7Ci0KLSAgICAgICAgLyogaW5pdGlhbGl6ZSBTQlIgZWxlbWVudCwgYW5kIGdldCBjb3JlIGJhbmR3aWR0aCAqLwotICAgICAgICBlcnJvciA9IEZES3NickVuY19FbnZJbml0KGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2JyQ29uZmlnW2VsXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFuZHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5CaXRzdHJEZWxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclBlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzSW5pdEZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5mVGltZURvbWFpbkRvd25zYW1wbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxoU2JyRW5jb2Rlci0+ZHluYW1pY1JhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgaWYgKGVycm9yICE9IDApIHsKLSAgICAgICAgICBlcnJvciA9IDI7Ci0gICAgICAgICAgZ290byBiYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogR2V0IGxvd2VzdCBjb3JlIGVuY29kZXIgYmFuZHdpZHRoIHRvIGJlIHJldHVybmVkIGxhdGVyLiAqLwotICAgICAgICBsb3dlc3RCYW5kd2lkdGggPSBmaXhNaW4obG93ZXN0QmFuZHdpZHRoLCBiYW5kd2lkdGgpOwotCi0gICAgICB9IC8qIHNlY29uZCBlbGVtZW50IGxvb3AgKi8KLQotICAgICAgLyogSW5pdGlhbGl6ZSBhIGRvd25zYW1wbGVyIGZvciBlYWNoIGNoYW5uZWwgaW4gZWFjaCBTQlIgZWxlbWVudCAqLwotICAgICAgaWYgKGhTYnJFbmNvZGVyLT5mVGltZURvbWFpbkRvd25zYW1wbGluZykKLSAgICAgIHsKLSAgICAgICAgZm9yIChlbD0wOyBlbDxoU2JyRW5jb2Rlci0+bm9FbGVtZW50czsgZWwrKykKLSAgICAgICAgewotICAgICAgICAgIEhBTkRMRV9TQlJfRUxFTUVOVCBoU2JyRWwgPSBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF07Ci0gICAgICAgICAgSU5UIFdjLCBjaDsKLQotICAgICAgICAgIC8qIENhbGN1bGF0ZWQgcmVxdWlyZWQgbm9ybWFsaXplZCBjdXRvZmYgZnJlcXVlbmN5IChXYyA9IDEuMCAtPiBsb3dlc3RCYW5kd2lkdGggPSBpbnB1dFNhbXBsZVJhdGUvMikgKi8KLSAgICAgICAgICBXYyA9ICgyKmxvd2VzdEJhbmR3aWR0aCkqMTAwMCAvIGlucHV0U2FtcGxlUmF0ZTsKLQotICAgICAgICAgIGZvciAoY2g9MDsgY2g8aFNickVsLT5lbEluZm8ubkNoYW5uZWxzSW5FbDsgY2grKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGREthYWNFbmNfSW5pdERvd25zYW1wbGVyICgmaFNickVsLT5zYnJDaGFubmVsW2NoXS0+ZG93blNhbXBsZXIsIFdjLCAqZG93blNhbXBsZUZhY3Rvcik7Ci0gICAgICAgICAgICBGREtfQVNTRVJUIChoU2JyRWwtPnNickNoYW5uZWxbY2hdLT5kb3duU2FtcGxlci5kZWxheSA8PU1BWF9EU19GSUxURVJfREVMQVkpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGRvd25zYW1wbGVyRGVsYXkgPSBoU2JyRWwtPnNickNoYW5uZWxbMF0tPmRvd25TYW1wbGVyLmRlbGF5OwotICAgICAgICB9IC8qIHRoaXJkIGVsZW1lbnQgbG9vcCAqLwotCi0gICAgICAgIC8qIGxmZSAqLwotICAgICAgICBGREthYWNFbmNfSW5pdERvd25zYW1wbGVyICgmaFNickVuY29kZXItPmxmZURvd25TYW1wbGVyLCAwLCAqZG93blNhbXBsZUZhY3Rvcik7Ci0KLSAgICAgICAgLyogQWRkIHRoZSByZXNhbXBsZXIgYWRkaXRpb25hbCBkZWxheSB0byBnZXQgdGhlIGZpbmFsIGRlbGF5IGFuZCBidWZmZXIgb2Zmc2V0IHZhbHVlcy4gKi8KLSAgICAgICAgaWYgKHNick9mZnNldCA+IDAgfHwgZG93bnNhbXBsZWRPZmZzZXQgPD0gKChkb3duc2FtcGxlckRlbGF5ICogKCpudW1DaGFubmVscykpPj4oKmRvd25TYW1wbGVGYWN0b3ItMSkpKSB7Ci0gICAgICAgICAgc2JyT2Zmc2V0ICs9IChkb3duc2FtcGxlckRlbGF5IC0gZG93bnNhbXBsZWRPZmZzZXQpICogKCpudW1DaGFubmVscykgOwotICAgICAgICAgICpkZWxheSArPSBkb3duc2FtcGxlckRlbGF5IC0gZG93bnNhbXBsZWRPZmZzZXQ7Ci0gICAgICAgICAgZG93bnNhbXBsZWRPZmZzZXQgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGRvd25zYW1wbGVkT2Zmc2V0IC09IChkb3duc2FtcGxlckRlbGF5ICogKCpudW1DaGFubmVscykpPj4oKmRvd25TYW1wbGVGYWN0b3ItMSk7Ci0gICAgICAgICAgc2JyT2Zmc2V0ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGhTYnJFbmNvZGVyLT5pbnB1dERhdGFEZWxheSA9IGRvd25zYW1wbGVyRGVsYXk7CisgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogCi0gICAgICAvKiBBc3NpZ24gY29yZSBlbmNvZGVyIEJhbmR3aWR0aCAqLwotICAgICAgKmNvcmVCYW5kd2lkdGggPSBsb3dlc3RCYW5kd2lkdGg7CisgICAgICAvKiBTZXQgcGFyYW1ldHJpYyBTdGVyZW8gRmxhZy4gKi8KKyAgICAgIGlmICh1c2VQcykgeworICAgICAgICBlbEluZm9bY29yZUVsXS5mUGFyYW1ldHJpY1N0ZXJlbyA9IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbEluZm9bY29yZUVsXS5mUGFyYW1ldHJpY1N0ZXJlbyA9IDA7CisgICAgICB9CiAKLSAgICAgIC8qIEVzdGltYXRlIHNiciBiaXRyYXRlLCAyLjUga0JpdC9zIHBlciBzYnIgY2hhbm5lbCAqLwotICAgICAgaFNickVuY29kZXItPmVzdGltYXRlQml0cmF0ZSArPSAyNTAwICogKCpudW1DaGFubmVscyk7CisgICAgICAvKgorICAgICAgICogSW5pdCBzYnJDb25maWcgc3RydWN0dXJlCisgICAgICAgKi8KKyAgICAgIGlmICghRkRLc2JyRW5jX0luaXRpYWxpemVTYnJEZWZhdWx0cygmc2JyQ29uZmlnW2VsXSwgKmRvd25TYW1wbGVGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZUZyYW1lTGVuZ3RoLCBJU19MT1dERUxBWShhb3QpKSkgeworICAgICAgICBlcnJvciA9IDE7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KIAotICAgICAgLyogaW5pdGlhbGl6ZSBwYXJhbWV0cmljIHN0ZXJlbyAqLwotICAgICAgaWYgKHVzZVBzKQotICAgICAgewotICAgICAgICBQU0VOQ19DT05GSUcgcHNFbmNDb25maWc7Ci0gICAgICAgIEZES19BU1NFUlQoaFNickVuY29kZXItPm5vRWxlbWVudHMgPT0gMSk7Ci0gICAgICAgIElOVCBwc1R1bmluZ1RhYmxlSWR4ID0gZ2V0UHNUdW5pbmdUYWJsZUluZGV4KGVsSW5mb1swXS5iaXRSYXRlLCBOVUxMKTsKKyAgICAgIC8qCisgICAgICAgKiBNb2RpZnkgc2JyQ29uZmlnIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8gRWxlbWVudCBwYXJhbWV0ZXJzCisgICAgICAgKi8KKyAgICAgIGlmICghRkRLc2JyRW5jX0FkanVzdFNiclNldHRpbmdzKAorICAgICAgICAgICAgICAmc2JyQ29uZmlnW2VsXSwgZWxJbmZvW2NvcmVFbF0uYml0UmF0ZSwKKyAgICAgICAgICAgICAgZWxJbmZvW2NvcmVFbF0ubkNoYW5uZWxzSW5FbCwgKmNvcmVTYW1wbGVSYXRlLCBpbnB1dFNhbXBsZVJhdGUsCisgICAgICAgICAgICAgIHRyYW5zZm9ybUZhY3RvciwgMjQwMDAsIDAsIDAsIC8qIHVzZVNwZWVjaENvbmZpZyAqLworICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsY3NNb2RlICovCisgICAgICAgICAgICAgIHVzZVBzLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJQYXJhbWV0cmljU3RlcmVvICovCisgICAgICAgICAgICAgIGFvdCkpIHsKKyAgICAgICAgZXJyb3IgPSAxOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CiAKLSAgICAgICAgcHNFbmNDb25maWcuZnJhbWVTaXplICAgICAgICAgICA9IGNvcmVGcmFtZUxlbmd0aDsgLy9zYnJDb25maWcuc2JyRnJhbWVTaXplOwotICAgICAgICBwc0VuY0NvbmZpZy5xbWZGaWx0ZXJNb2RlICAgICAgID0gMDsKLSAgICAgICAgcHNFbmNDb25maWcuc2JyUHNEZWxheSAgICAgICAgICA9IDA7CisgICAgICAvKiBGaW5kIGNvbW1vbiBmcmVxdWVuY3kgYm9yZGVyIGZvciBhbGwgU0JSIGVsZW1lbnRzICovCisgICAgICBoaWdoZXN0U2JyU3RhcnRGcmVxID0KKyAgICAgICAgICBmaXhNYXgoaGlnaGVzdFNiclN0YXJ0RnJlcSwgc2JyQ29uZmlnW2VsXS5zdGFydEZyZXEpOworICAgICAgaGlnaGVzdFNiclN0b3BGcmVxID0gZml4TWF4KGhpZ2hlc3RTYnJTdG9wRnJlcSwgc2JyQ29uZmlnW2VsXS5zdG9wRnJlcSk7CiAKLSAgICAgICAgLyogdHVuaW5nIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgaWYgKHBzVHVuaW5nVGFibGVJZHggICE9IElOVkFMSURfVEFCTEVfSURYKSB7Ci0gICAgICAgICAgcHNFbmNDb25maWcublN0ZXJlb0JhbmRzICAgICAgICAgICA9IHBzVHVuaW5nVGFibGVbcHNUdW5pbmdUYWJsZUlkeF0ublN0ZXJlb0JhbmRzOwotICAgICAgICAgIHBzRW5jQ29uZmlnLm1heEVudmVsb3BlcyAgICAgICAgICAgPSBwc1R1bmluZ1RhYmxlW3BzVHVuaW5nVGFibGVJZHhdLm5FbnZlbG9wZXM7Ci0gICAgICAgICAgcHNFbmNDb25maWcuaWlkUXVhbnRFcnJvclRocmVzaG9sZCA9IChGSVhQX0RCTClwc1R1bmluZ1RhYmxlW3BzVHVuaW5nVGFibGVJZHhdLmlpZFF1YW50RXJyb3JUaHJlc2hvbGQ7CisgICAgfSAvKiBmaXJzdCBlbGVtZW50IGxvb3AgKi8KIAotICAgICAgICAgIC8qIGNhbGN1bGF0aW9uIGlzIG5vdCBxdWl0ZSBsaW5lYXIsIGluY3JlYXNlZCBudW1iZXIgb2YgZW52ZWxvcGVzIGNhdXNlcyBtb3JlIGJpdHMgKi8KLSAgICAgICAgICAvKiBhc3N1bWUgYXZnLiA1MCBiaXRzIHBlciBmcmFtZSBmb3IgMTAgc3RlcmVvIGJhbmRzIC8gMSBlbnZlbG9wZSBjb25maWd1cmF0aW9uICovCi0gICAgICAgICAgaFNickVuY29kZXItPmVzdGltYXRlQml0cmF0ZSArPSAoICgoKCpjb3JlU2FtcGxlUmF0ZSkgKiA1ICogcHNFbmNDb25maWcublN0ZXJlb0JhbmRzICogcHNFbmNDb25maWcubWF4RW52ZWxvcGVzKSAvIGhTYnJFbmNvZGVyLT5mcmFtZVNpemUpKTsKKyAgICAvKiBTZXQgZWxlbWVudCBjb3VudCAoY2FuIGJlIGxlc3MgdGhhbiBjb3JlIGVuY29kZXIgZWxlbWVudCBjb3VudCkgKi8KKyAgICBoU2JyRW5jb2Rlci0+bm9FbGVtZW50cyA9IGVsICsgMTsKIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGVycm9yID0gRVJST1IoQ0RJLCAiSW52YWxpZCBwcyB0dW5pbmcgdGFibGUgaW5kZXguIik7Ci0gICAgICAgICAgZ290byBiYWlsOworICAgIEZES3NickVuY19SZWFsbG9jYXRlKGhTYnJFbmNvZGVyLCBlbEluZm8sIG5vRWxlbWVudHMpOworCisgICAgZm9yIChlbCA9IDA7IGVsIDwgaFNickVuY29kZXItPm5vRWxlbWVudHM7IGVsKyspIHsKKyAgICAgIGludCBiYW5kd2lkdGggPSAqY29yZUJhbmR3aWR0aDsKKworICAgICAgLyogVXNlIGxvd2VzdCBjb21tb24gYmFuZHdpZHRoICovCisgICAgICBzYnJDb25maWdbZWxdLnN0YXJ0RnJlcSA9IGhpZ2hlc3RTYnJTdGFydEZyZXE7CisgICAgICBzYnJDb25maWdbZWxdLnN0b3BGcmVxID0gaGlnaGVzdFNiclN0b3BGcmVxOworCisgICAgICAvKiBpbml0aWFsaXplIFNCUiBlbGVtZW50LCBhbmQgZ2V0IGNvcmUgYmFuZHdpZHRoICovCisgICAgICBlcnJvciA9IEZES3NickVuY19FbnZJbml0KGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXSwgJnNickNvbmZpZ1tlbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYW5kd2lkdGgsIGFvdCwgZWwsIGhlYWRlclBlcmlvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzSW5pdEZsYWcsIGhTYnJFbmNvZGVyLT5kb3duc2FtcGxpbmdNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5keW5hbWljUmFtKTsKKworICAgICAgaWYgKGVycm9yICE9IDApIHsKKyAgICAgICAgZXJyb3IgPSAyOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisKKyAgICAgIC8qIEdldCBsb3dlc3QgY29yZSBlbmNvZGVyIGJhbmR3aWR0aCB0byBiZSByZXR1cm5lZCBsYXRlci4gKi8KKyAgICAgIGxvd2VzdEJhbmR3aWR0aCA9IGZpeE1pbihsb3dlc3RCYW5kd2lkdGgsIGJhbmR3aWR0aCk7CisKKyAgICB9IC8qIHNlY29uZCBlbGVtZW50IGxvb3AgKi8KKworICAgIC8qIEluaXRpYWxpemUgYSBkb3duc2FtcGxlciBmb3IgZWFjaCBjaGFubmVsIGluIGVhY2ggU0JSIGVsZW1lbnQgKi8KKyAgICBpZiAoaFNickVuY29kZXItPmRvd25zYW1wbGluZ01ldGhvZCA9PSBTQlJFTkNfRFNfVElNRSkgeworICAgICAgZm9yIChlbCA9IDA7IGVsIDwgaFNickVuY29kZXItPm5vRWxlbWVudHM7IGVsKyspIHsKKyAgICAgICAgSEFORExFX1NCUl9FTEVNRU5UIGhTYnJFbCA9IGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXTsKKyAgICAgICAgSU5UIFdjLCBjaDsKKworICAgICAgICBXYyA9IDUwMDsgLyogQ3V0b2ZmIGZyZXF1ZW5jeSB3aXRoIGZ1bGwgYmFuZHdpZHRoICovCisKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgaFNickVsLT5lbEluZm8ubkNoYW5uZWxzSW5FbDsgY2grKykgeworICAgICAgICAgIEZES2FhY0VuY19Jbml0RG93bnNhbXBsZXIoJmhTYnJFbC0+c2JyQ2hhbm5lbFtjaF0tPmRvd25TYW1wbGVyLCBXYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkb3duU2FtcGxlRmFjdG9yKTsKKyAgICAgICAgICBGREtfQVNTRVJUKGhTYnJFbC0+c2JyQ2hhbm5lbFtjaF0tPmRvd25TYW1wbGVyLmRlbGF5IDw9CisgICAgICAgICAgICAgICAgICAgICBNQVhfRFNfRklMVEVSX0RFTEFZKTsKICAgICAgICAgfQorICAgICAgfSAvKiB0aGlyZCBlbGVtZW50IGxvb3AgKi8KIAotICAgICAgICBxbWZJbml0U3ludGhlc2lzRmlsdGVyQmFuaygmaFNickVuY29kZXItPnFtZlN5bnRoZXNpc1BTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKiloU2JyRW5jb2Rlci0+cW1mU3ludGhlc2lzUFMuRmlsdGVyU3RhdGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNvbmZpZ0RhdGEubm9RbWZTbG90cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50WzBdLT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHM+PjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzPj4xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcz4+MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0ZXNJbml0RmxhZykgPyAwIDogUU1GX0ZMQUdfS0VFUF9TVEFURVMpOwotCi0gICAgICAgIGlmKGVycm9ySW5mbyA9PSBub0Vycm9yKXsKLSAgICAgICAgICAvKiB1cGRhdGUgZGVsYXkgKi8KLSAgICAgICAgICBwc0VuY0NvbmZpZy5zYnJQc0RlbGF5ID0gRkRLc2JyRW5jX0dldEVudkVzdERlbGF5KCZoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+c2JyQ2hhbm5lbFswXS0+aEVudkNoYW5uZWwuc2JyRXh0cmFjdEVudmVsb3BlKTsKLQotICAgICAgICAgIGlmKG5vRXJyb3IgIT0gKGVycm9ySW5mbyA9IFBTRW5jX0luaXQoIGhTYnJFbmNvZGVyLT5oUGFyYW1ldHJpY1N0ZXJlbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc0VuY0NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+c2JyQ29uZmlnRGF0YS5ub1FtZlNsb3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50WzBdLT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxoU2JyRW5jb2Rlci0+ZHluYW1pY1JhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVycm9ySW5mbyA9IGhhbmRCYWNrKGVycm9ySW5mbyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogUU1GIGFuYWx5c2lzICsgSHlicmlkIGFuYWx5c2lzICsgSHlicmlkIHN5bnRoZXNpcyArIFFNRiBzeW50aGVzaXMgKyBkb3duc2FtcGxlZCBpbnB1dCBidWZmZXIgZGVsYXkgKi8KLSAgICAgICAgaFNickVuY29kZXItPmlucHV0RGF0YURlbGF5ID0gKDY0KjEwLzIpICsgKDYqNjQpICsgICgwKSArICg2NCoxMC8yLTY0KzEpICsgKCgqZG93blNhbXBsZUZhY3RvcikqZG93bnNhbXBsZWRPZmZzZXQpOwotICAgICAgfQotCi0gICAgICBoU2JyRW5jb2Rlci0+ZG93bnNhbXBsZWRPZmZzZXQgPSBkb3duc2FtcGxlZE9mZnNldDsKLSAgICAgIHsKLSAgICAgICAgaFNickVuY29kZXItPmRvd25taXhTaXplID0gY29yZUZyYW1lTGVuZ3RoKigqbnVtQ2hhbm5lbHMpOwotICAgICAgfQotCi0gICAgICBoU2JyRW5jb2Rlci0+YnVmZmVyT2Zmc2V0ID0gc2JyT2Zmc2V0OwotICAgICAgLyogRGVsYXkgQ29tcGVuc2F0aW9uOiBmaWxsIGJpdHN0cmVhbSBkZWxheSBidWZmZXIgd2l0aCB6ZXJvIGlucHV0IHNpZ25hbCAqLwotICAgICAgaWYgKCBoU2JyRW5jb2Rlci0+bkJpdHN0ckRlbGF5ID4gMCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gRkRLc2JyRW5jX0RlbGF5Q29tcGVuc2F0aW9uIChoU2JyRW5jb2RlciwgaW5wdXRCdWZmZXIpOwotICAgICAgICBpZiAoZXJyb3IgIT0gMCkKLSAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFNldCBPdXRwdXQgZnJhbWUgbGVuZ3RoICovCi0gICAgICAqZnJhbWVMZW5ndGggPSBjb3JlRnJhbWVMZW5ndGggKiAqZG93blNhbXBsZUZhY3RvcjsKLSAgICAgIC8qIElucHV0IGJ1ZmZlciBvZmZzZXQgKi8KLSAgICAgICppbnB1dEJ1ZmZlck9mZnNldCA9IGZpeE1heChzYnJPZmZzZXQsIGRvd25zYW1wbGVkT2Zmc2V0KTsKLQotCisgICAgICAvKiBsZmUgKi8KKyAgICAgIEZES2FhY0VuY19Jbml0RG93bnNhbXBsZXIoJmhTYnJFbmNvZGVyLT5sZmVEb3duU2FtcGxlciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRvd25TYW1wbGVGYWN0b3IpOwogICAgIH0KIAotICAgIHJldHVybiBlcnJvcjsKKyAgICAvKiBHZXQgZGVsYXkgaW5mb3JtYXRpb24gKi8KKyAgICBkZWxheVBhcmFtLmRzRGVsYXkgPQorICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+c2JyQ2hhbm5lbFswXS0+ZG93blNhbXBsZXIuZGVsYXk7CisgICAgZGVsYXlQYXJhbS5kZWxheSA9ICpkZWxheTsKKworICAgIGVycm9yID0gc2JyRW5jb2Rlcl9Jbml0X2RlbGF5KGNvcmVGcmFtZUxlbmd0aCwgKm51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkb3duU2FtcGxlRmFjdG9yLCBsb3dEZWxheSwgdXNlUHMsIGlzMjEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25zYW1wbGluZ01ldGhvZCwgJmRlbGF5UGFyYW0pOworCisgICAgaWYgKGVycm9yICE9IDApIHsKKyAgICAgIGVycm9yID0gMzsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBoU2JyRW5jb2Rlci0+bkJpdHN0ckRlbGF5ID0gZGVsYXlQYXJhbS5iaXRzdHJEZWxheTsKKyAgICBoU2JyRW5jb2Rlci0+c2JyRGVjRGVsYXkgPSBkZWxheVBhcmFtLnNickRlY0RlbGF5OworICAgIGhTYnJFbmNvZGVyLT5pbnB1dERhdGFEZWxheSA9IGRlbGF5UGFyYW0uZGVsYXlJbnB1dDJDb3JlOworCisgICAgLyogQXNzaWduIGNvcmUgZW5jb2RlciBCYW5kd2lkdGggKi8KKyAgICAqY29yZUJhbmR3aWR0aCA9IGxvd2VzdEJhbmR3aWR0aDsKKworICAgIC8qIEVzdGltYXRlIHNiciBiaXRyYXRlLCAyLjUga0JpdC9zIHBlciBzYnIgY2hhbm5lbCAqLworICAgIGhTYnJFbmNvZGVyLT5lc3RpbWF0ZUJpdHJhdGUgKz0gMjUwMCAqICgqbnVtQ2hhbm5lbHMpOworCisgICAgLyogSW5pdGlhbGl6ZSBiaXRzdHJlYW0gYnVmZmVyIGZvciBlYWNoIGVsZW1lbnQgKi8KKyAgICBmb3IgKGVsID0gMDsgZWwgPCBoU2JyRW5jb2Rlci0+bm9FbGVtZW50czsgZWwrKykgeworICAgICAgRkRLc2JyRW5jX2JzQnVmSW5pdChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0sIGRlbGF5UGFyYW0uYml0c3RyRGVsYXkpOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgcGFyYW1ldHJpYyBzdGVyZW8gKi8KKyAgICBpZiAodXNlUHMpIHsKKyAgICAgIFBTRU5DX0NPTkZJRyBwc0VuY0NvbmZpZzsKKyAgICAgIEZES19BU1NFUlQoaFNickVuY29kZXItPm5vRWxlbWVudHMgPT0gMSk7CisgICAgICBJTlQgcHNUdW5pbmdUYWJsZUlkeCA9IGdldFBzVHVuaW5nVGFibGVJbmRleChlbEluZm9bMF0uYml0UmF0ZSwgTlVMTCk7CisKKyAgICAgIHBzRW5jQ29uZmlnLmZyYW1lU2l6ZSA9IGNvcmVGcmFtZUxlbmd0aDsgIC8vIHNickNvbmZpZy5zYnJGcmFtZVNpemU7CisgICAgICBwc0VuY0NvbmZpZy5xbWZGaWx0ZXJNb2RlID0gMDsKKyAgICAgIHBzRW5jQ29uZmlnLnNiclBzRGVsYXkgPSAwOworCisgICAgICAvKiB0dW5pbmcgcGFyYW1ldGVycyAqLworICAgICAgaWYgKHBzVHVuaW5nVGFibGVJZHggIT0gSU5WQUxJRF9UQUJMRV9JRFgpIHsKKyAgICAgICAgcHNFbmNDb25maWcublN0ZXJlb0JhbmRzID0gcHNUdW5pbmdUYWJsZVtwc1R1bmluZ1RhYmxlSWR4XS5uU3RlcmVvQmFuZHM7CisgICAgICAgIHBzRW5jQ29uZmlnLm1heEVudmVsb3BlcyA9IHBzVHVuaW5nVGFibGVbcHNUdW5pbmdUYWJsZUlkeF0ubkVudmVsb3BlczsKKyAgICAgICAgcHNFbmNDb25maWcuaWlkUXVhbnRFcnJvclRocmVzaG9sZCA9CisgICAgICAgICAgICAoRklYUF9EQkwpcHNUdW5pbmdUYWJsZVtwc1R1bmluZ1RhYmxlSWR4XS5paWRRdWFudEVycm9yVGhyZXNob2xkOworCisgICAgICAgIC8qIGNhbGN1bGF0aW9uIGlzIG5vdCBxdWl0ZSBsaW5lYXIsIGluY3JlYXNlZCBudW1iZXIgb2YgZW52ZWxvcGVzIGNhdXNlcworICAgICAgICAgKiBtb3JlIGJpdHMgKi8KKyAgICAgICAgLyogYXNzdW1lIGF2Zy4gNTAgYml0cyBwZXIgZnJhbWUgZm9yIDEwIHN0ZXJlbyBiYW5kcyAvIDEgZW52ZWxvcGUKKyAgICAgICAgICogY29uZmlndXJhdGlvbiAqLworICAgICAgICBoU2JyRW5jb2Rlci0+ZXN0aW1hdGVCaXRyYXRlICs9CisgICAgICAgICAgICAoKCgoKmNvcmVTYW1wbGVSYXRlKSAqIDUgKiBwc0VuY0NvbmZpZy5uU3RlcmVvQmFuZHMgKgorICAgICAgICAgICAgICAgcHNFbmNDb25maWcubWF4RW52ZWxvcGVzKSAvCisgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5mcmFtZVNpemUpKTsKKworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyb3IgPSBFUlJPUihDREksICJJbnZhbGlkIHBzIHR1bmluZyB0YWJsZSBpbmRleC4iKTsKKyAgICAgICAgZ290byBiYWlsOworICAgICAgfQorCisgICAgICBxbWZJbml0U3ludGhlc2lzRmlsdGVyQmFuaygKKyAgICAgICAgICAmaFNickVuY29kZXItPnFtZlN5bnRoZXNpc1BTLAorICAgICAgICAgIChGSVhQX0RCTCAqKWhTYnJFbmNvZGVyLT5xbWZTeW50aGVzaXNQUy5GaWx0ZXJTdGF0ZXMsCisgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNvbmZpZ0RhdGEubm9RbWZTbG90cywKKyAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzID4+IDEsCisgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcyA+PiAxLAorICAgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50WzBdLT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMgPj4gMSwKKyAgICAgICAgICAoc3RhdGVzSW5pdEZsYWcpID8gMCA6IFFNRl9GTEFHX0tFRVBfU1RBVEVTKTsKKworICAgICAgaWYgKGVycm9ySW5mbyA9PSBub0Vycm9yKSB7CisgICAgICAgIC8qIHVwZGF0ZSBkZWxheSAqLworICAgICAgICBwc0VuY0NvbmZpZy5zYnJQc0RlbGF5ID0KKyAgICAgICAgICAgIEZES3NickVuY19HZXRFbnZFc3REZWxheSgmaFNickVuY29kZXItPnNickVsZW1lbnRbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+c2JyQ2hhbm5lbFswXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5oRW52Q2hhbm5lbC5zYnJFeHRyYWN0RW52ZWxvcGUpOworCisgICAgICAgIGVycm9ySW5mbyA9CisgICAgICAgICAgICBQU0VuY19Jbml0KGhTYnJFbmNvZGVyLT5oUGFyYW1ldHJpY1N0ZXJlbywgJnBzRW5jQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+c2JyQ29uZmlnRGF0YS5ub1FtZlNsb3RzLAorICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+ZHluYW1pY1JhbSk7CisgICAgICB9CisgICAgfQorCisgICAgaFNickVuY29kZXItPmRvd25zYW1wbGVkT2Zmc2V0ID0gZGVsYXlQYXJhbS5jb3JlUGF0aE9mZnNldDsKKyAgICBoU2JyRW5jb2Rlci0+YnVmZmVyT2Zmc2V0ID0gZGVsYXlQYXJhbS5zYnJQYXRoT2Zmc2V0OworICAgICpkZWxheSA9IGRlbGF5UGFyYW0uZGVsYXk7CisKKyAgICB7IGhTYnJFbmNvZGVyLT5kb3dubWl4U2l6ZSA9IGNvcmVGcmFtZUxlbmd0aCAqICgqbnVtQ2hhbm5lbHMpOyB9CisKKyAgICAvKiBEZWxheSBDb21wZW5zYXRpb246IGZpbGwgYml0c3RyZWFtIGRlbGF5IGJ1ZmZlciB3aXRoIHplcm8gaW5wdXQgc2lnbmFsICovCisgICAgaWYgKGhTYnJFbmNvZGVyLT5uQml0c3RyRGVsYXkgPiAwKSB7CisgICAgICBlcnJvciA9IEZES3NickVuY19EZWxheUNvbXBlbnNhdGlvbihoU2JyRW5jb2RlciwgaW5wdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlckJ1ZlNpemUpOworICAgICAgaWYgKGVycm9yICE9IDApIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBTZXQgT3V0cHV0IGZyYW1lIGxlbmd0aCAqLworICAgICpmcmFtZUxlbmd0aCA9IGNvcmVGcmFtZUxlbmd0aCAqICpkb3duU2FtcGxlRmFjdG9yOworICAgIC8qIElucHV0IGJ1ZmZlciBvZmZzZXQgKi8KKyAgICAqaW5wdXRCdWZmZXJPZmZzZXQgPQorICAgICAgICBmaXhNYXgoZGVsYXlQYXJhbS5zYnJQYXRoT2Zmc2V0LCBkZWxheVBhcmFtLmNvcmVQYXRoT2Zmc2V0KTsKKyAgfQorCisgIHJldHVybiBlcnJvcjsKIAogYmFpbDoKLSAgICAvKiBSZXN0b3JlIGlucHV0IHNldHRpbmdzICovCi0gICAgKmNvcmVTYW1wbGVSYXRlID0gaW5wdXRTYW1wbGVSYXRlOwotICAgICpmcmFtZUxlbmd0aCA9IGNvcmVGcmFtZUxlbmd0aDsKLSAgICAqbnVtQ2hhbm5lbHMgPSBpbnB1dENoYW5uZWxzOwotICAgICpjb3JlQmFuZHdpZHRoID0gaW5wdXRCYW5kV2lkdGg7CisgIC8qIFJlc3RvcmUgaW5wdXQgc2V0dGluZ3MgKi8KKyAgKmNvcmVTYW1wbGVSYXRlID0gaW5wdXRTYW1wbGVSYXRlOworICAqZnJhbWVMZW5ndGggPSBjb3JlRnJhbWVMZW5ndGg7CisgICpudW1DaGFubmVscyA9IGlucHV0Q2hhbm5lbHM7CisgICpjb3JlQmFuZHdpZHRoID0gaW5wdXRCYW5kV2lkdGg7CiAKLSAgICByZXR1cm4gZXJyb3I7Ci0gfQorICByZXR1cm4gZXJyb3I7Cit9CiAKLQotSU5UCi1zYnJFbmNvZGVyX0VuY29kZUZyYW1lKCAgSEFORExFX1NCUl9FTkNPREVSICAgaFNickVuY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgICAgICAgICAgICAqc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICB0aW1lSW5TdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgc2JyRGF0YUJpdHNbKDgpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICBzYnJEYXRhWyg4KV1bTUFYX1BBWUxPQURfU0laRV0KLSAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKK0lOVCBzYnJFbmNvZGVyX0VuY29kZUZyYW1lKEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2RlciwgSU5UX1BDTSAqc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc2FtcGxlc0J1ZlNpemUsIFVJTlQgc2JyRGF0YUJpdHNbKDgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIHNickRhdGFbKDgpXVtNQVhfUEFZTE9BRF9TSVpFXSkgewogICBJTlQgZXJyb3I7CiAgIGludCBlbDsKIAotICBmb3IgKGVsPTA7IGVsPGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzOyBlbCsrKQotICB7Ci0gICAgaWYgKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXSAhPSBOVUxMKQotICAgIHsKKyAgZm9yIChlbCA9IDA7IGVsIDwgaFNickVuY29kZXItPm5vRWxlbWVudHM7IGVsKyspIHsKKyAgICBpZiAoaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdICE9IE5VTEwpIHsKICAgICAgIGVycm9yID0gRkRLc2JyRW5jX0VudkVuY29kZUZyYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRW5jb2Rlci0+ZG93bnNhbXBsZWRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNickRhdGFCaXRzW2VsXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJEYXRhW2VsXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgaWYgKGVycm9yKQotICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgICAgaFNickVuY29kZXIsIGVsLAorICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRW5jb2Rlci0+ZG93bnNhbXBsZWRPZmZzZXQgLyBoU2JyRW5jb2Rlci0+bkNoYW5uZWxzLAorICAgICAgICAgIHNhbXBsZXNCdWZTaXplLCAmc2JyRGF0YUJpdHNbZWxdLCBzYnJEYXRhW2VsXSwgMCk7CisgICAgICBpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKICAgICB9CiAgIH0KIAotICBpZiAoICggaFNickVuY29kZXItPmxmZUNoSWR4IT0tMSkgJiYgKGhTYnJFbmNvZGVyLT5kb3duU2FtcGxlRmFjdG9yID4gMSkgKQotICB7ICAgLyogbGZlIGRvd25zYW1wbGVyICovCi0gICAgICBJTlQgbk91dFNhbXBsZXM7Ci0KLSAgICAgIEZES2FhY0VuY19Eb3duc2FtcGxlKCZoU2JyRW5jb2Rlci0+bGZlRG93blNhbXBsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCArIGhTYnJFbmNvZGVyLT5idWZmZXJPZmZzZXQgKyBoU2JyRW5jb2Rlci0+bGZlQ2hJZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPmZyYW1lU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lSW5TdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCArIGhTYnJFbmNvZGVyLT5sZmVDaElkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZuT3V0U2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+bkNoYW5uZWxzKTsKLQotCi0gIH0KKyAgZXJyb3IgPSBGREtzYnJFbmNfRG93bnNhbXBsZSgKKyAgICAgIGhTYnJFbmNvZGVyLAorICAgICAgc2FtcGxlcyArIGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCAvIGhTYnJFbmNvZGVyLT5uQ2hhbm5lbHMsCisgICAgICBzYW1wbGVzQnVmU2l6ZSwgaFNickVuY29kZXItPm5DaGFubmVscywgJnNickRhdGFCaXRzW2VsXSwgc2JyRGF0YVtlbF0sIDApOworICBpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKIAogICByZXR1cm4gMDsKIH0KIAorSU5UIHNickVuY29kZXJfVXBkYXRlQnVmZmVycyhIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKnRpbWVCdWZmZXIsIFVJTlQgdGltZUJ1ZmZlckJ1ZlNpemUpIHsKKyAgaWYgKGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCA+IDApIHsKKyAgICBpbnQgYzsKKyAgICBpbnQgbmQgPSBoU2JyRW5jb2Rlci0+ZG93bm1peFNpemUgLyBoU2JyRW5jb2Rlci0+bkNoYW5uZWxzOwogCi1JTlQgc2JyRW5jb2Rlcl9VcGRhdGVCdWZmZXJzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICp0aW1lQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotIHsKLSAgICBpZiAoIGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCA+IDAgKSB7CisgICAgZm9yIChjID0gMDsgYyA8IGhTYnJFbmNvZGVyLT5uQ2hhbm5lbHM7IGMrKykgewogICAgICAgLyogTW92ZSBkZWxheWVkIGRvd25zYW1wbGVkIGRhdGEgKi8KLSAgICAgIEZES21lbWNweSAoIHRpbWVCdWZmZXIsCi0gICAgICAgICAgICAgICAgICB0aW1lQnVmZmVyICsgaFNickVuY29kZXItPmRvd25taXhTaXplLAotICAgICAgICAgICAgICAgICAgc2l6ZW9mKElOVF9QQ00pICogKGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCkgKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogTW92ZSBkZWxheWVkIGlucHV0IGRhdGEgKi8KLSAgICAgIEZES21lbWNweSAoIHRpbWVCdWZmZXIsCi0gICAgICAgIHRpbWVCdWZmZXIgKyBoU2JyRW5jb2Rlci0+bkNoYW5uZWxzICogaFNickVuY29kZXItPmZyYW1lU2l6ZSwKLSAgICAgICAgICAgICAgICAgIHNpemVvZihJTlRfUENNKSAqIGhTYnJFbmNvZGVyLT5idWZmZXJPZmZzZXQgKTsKKyAgICAgIEZES21lbWNweSh0aW1lQnVmZmVyICsgdGltZUJ1ZmZlckJ1ZlNpemUgKiBjLAorICAgICAgICAgICAgICAgIHRpbWVCdWZmZXIgKyB0aW1lQnVmZmVyQnVmU2l6ZSAqIGMgKyBuZCwKKyAgICAgICAgICAgICAgICBzaXplb2YoSU5UX1BDTSkgKgorICAgICAgICAgICAgICAgICAgICAoaFNickVuY29kZXItPmRvd25zYW1wbGVkT2Zmc2V0IC8gaFNickVuY29kZXItPm5DaGFubmVscykpOwogICAgIH0KLSAgICBpZiAoIGhTYnJFbmNvZGVyLT5uQml0c3RyRGVsYXkgPiAwICApCi0gICAgewotICAgICAgaW50IGVsOworICB9IGVsc2UgeworICAgIGludCBjOwogCi0gICAgICBmb3IgKGVsPTA7IGVsPGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzOyBlbCsrKQotICAgICAgewotICAgICAgICBGREttZW1tb3ZlICggaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdLT5wYXlsb2FkRGVsYXlMaW5lWzBdLAotICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdLT5wYXlsb2FkRGVsYXlMaW5lWzFdLAotICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFVDSEFSKSAqIChoU2JyRW5jb2Rlci0+bkJpdHN0ckRlbGF5Kk1BWF9QQVlMT0FEX1NJWkUpICk7CisgICAgZm9yIChjID0gMDsgYyA8IGhTYnJFbmNvZGVyLT5uQ2hhbm5lbHM7IGMrKykgeworICAgICAgLyogTW92ZSBkZWxheWVkIGlucHV0IGRhdGEgKi8KKyAgICAgIEZES21lbWNweSgKKyAgICAgICAgICB0aW1lQnVmZmVyICsgdGltZUJ1ZmZlckJ1ZlNpemUgKiBjLAorICAgICAgICAgIHRpbWVCdWZmZXIgKyB0aW1lQnVmZmVyQnVmU2l6ZSAqIGMgKyBoU2JyRW5jb2Rlci0+ZnJhbWVTaXplLAorICAgICAgICAgIHNpemVvZihJTlRfUENNKSAqIGhTYnJFbmNvZGVyLT5idWZmZXJPZmZzZXQgLyBoU2JyRW5jb2Rlci0+bkNoYW5uZWxzKTsKKyAgICB9CisgIH0KKyAgaWYgKGhTYnJFbmNvZGVyLT5uQml0c3RyRGVsYXkgPiAwKSB7CisgICAgaW50IGVsOwogCi0gICAgICAgIEZES21lbW1vdmUoICZoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0tPnBheWxvYWREZWxheUxpbmVTaXplWzBdLAotICAgICAgICAgICAgICAgICAgICAmaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdLT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFVJTlQpICogKGhTYnJFbmNvZGVyLT5uQml0c3RyRGVsYXkpICk7CisgICAgZm9yIChlbCA9IDA7IGVsIDwgaFNickVuY29kZXItPm5vRWxlbWVudHM7IGVsKyspIHsKKyAgICAgIEZES21lbW1vdmUoCisgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdLT5wYXlsb2FkRGVsYXlMaW5lWzBdLAorICAgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXS0+cGF5bG9hZERlbGF5TGluZVsxXSwKKyAgICAgICAgICBzaXplb2YoVUNIQVIpICogKGhTYnJFbmNvZGVyLT5uQml0c3RyRGVsYXkgKiBNQVhfUEFZTE9BRF9TSVpFKSk7CisKKyAgICAgIEZES21lbW1vdmUoJmhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXS0+cGF5bG9hZERlbGF5TGluZVNpemVbMF0sCisgICAgICAgICAgICAgICAgICZoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0tPnBheWxvYWREZWxheUxpbmVTaXplWzFdLAorICAgICAgICAgICAgICAgICBzaXplb2YoVUlOVCkgKiAoaFNickVuY29kZXItPm5CaXRzdHJEZWxheSkpOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworSU5UIHNickVuY29kZXJfU2VuZEhlYWRlcihIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIpIHsKKyAgSU5UIGVycm9yID0gLTE7CisgIGlmIChoU2JyRW5jb2RlcikgeworICAgIGludCBlbDsKKyAgICBmb3IgKGVsID0gMDsgZWwgPCBoU2JyRW5jb2Rlci0+bm9FbGVtZW50czsgZWwrKykgeworICAgICAgaWYgKChoU2JyRW5jb2Rlci0+bm9FbGVtZW50cyA9PSAxKSAmJgorICAgICAgICAgIChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+ZWxJbmZvLmZQYXJhbWV0cmljU3RlcmVvID09IDEpKSB7CisgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXS0+c2JyQml0c3RyZWFtRGF0YS5Db3VudFNlbmRIZWFkZXJEYXRhID0KKyAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXS0+c2JyQml0c3RyZWFtRGF0YS5OclNlbmRIZWFkZXJEYXRhIC0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXS0+c2JyQml0c3RyZWFtRGF0YS5Db3VudFNlbmRIZWFkZXJEYXRhID0gMDsKICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gfQorICAgIGVycm9yID0gMDsKKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CiAKK0lOVCBzYnJFbmNvZGVyX0NvbnRhaW5zSGVhZGVyKEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2RlcikgeworICBJTlQgc2JySGVhZGVyID0gMTsKKyAgaWYgKGhTYnJFbmNvZGVyKSB7CisgICAgaW50IGVsOworICAgIGZvciAoZWwgPSAwOyBlbCA8IGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzOyBlbCsrKSB7CisgICAgICBzYnJIZWFkZXIgJj0KKyAgICAgICAgICAoaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdLT5zYnJCaXRzdHJlYW1EYXRhLkhlYWRlckFjdGl2ZURlbGF5ID09IDEpCisgICAgICAgICAgICAgID8gMQorICAgICAgICAgICAgICA6IDA7CisgICAgfQorICB9CisgIHJldHVybiBzYnJIZWFkZXI7Cit9CiAKLUlOVCBzYnJFbmNvZGVyX0dldEVzdGltYXRlQml0cmF0ZShIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIpCi17CitJTlQgc2JyRW5jb2Rlcl9HZXRIZWFkZXJEZWxheShIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIpIHsKKyAgSU5UIGRlbGF5ID0gLTE7CisKKyAgaWYgKGhTYnJFbmNvZGVyKSB7CisgICAgaWYgKChoU2JyRW5jb2Rlci0+bm9FbGVtZW50cyA9PSAxKSAmJgorICAgICAgICAoaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPmVsSW5mby5mUGFyYW1ldHJpY1N0ZXJlbyA9PSAxKSkgeworICAgICAgZGVsYXkgPSBoU2JyRW5jb2Rlci0+bkJpdHN0ckRlbGF5ICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgZGVsYXkgPSBoU2JyRW5jb2Rlci0+bkJpdHN0ckRlbGF5OworICAgIH0KKyAgfQorICByZXR1cm4gZGVsYXk7Cit9CitJTlQgc2JyRW5jb2Rlcl9HZXRCc0RlbGF5KEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2RlcikgeworICBJTlQgZGVsYXkgPSAtMTsKKworICBpZiAoaFNickVuY29kZXIpIHsKKyAgICBkZWxheSA9IGhTYnJFbmNvZGVyLT5uQml0c3RyRGVsYXk7CisgIH0KKyAgcmV0dXJuIGRlbGF5OworfQorCitJTlQgc2JyRW5jb2Rlcl9TQVBQcmVwYXJlKEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2RlcikgeworICBJTlQgZXJyb3IgPSAtMTsKKyAgaWYgKGhTYnJFbmNvZGVyKSB7CisgICAgaW50IGVsOworICAgIGZvciAoZWwgPSAwOyBlbCA8IGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzOyBlbCsrKSB7CisgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0tPnNickJpdHN0cmVhbURhdGEucmlnaHRCb3JkZXJGSVggPSAxOworICAgIH0KKyAgICBlcnJvciA9IDA7CisgIH0KKyAgcmV0dXJuIGVycm9yOworfQorCitJTlQgc2JyRW5jb2Rlcl9HZXRFc3RpbWF0ZUJpdHJhdGUoSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyKSB7CiAgIElOVCBlc3RpbWF0ZUJpdHJhdGUgPSAwOwogCi0gIGlmKGhTYnJFbmNvZGVyKSB7CisgIGlmIChoU2JyRW5jb2RlcikgewogICAgIGVzdGltYXRlQml0cmF0ZSArPSBoU2JyRW5jb2Rlci0+ZXN0aW1hdGVCaXRyYXRlOwogICB9CiAKICAgcmV0dXJuIGVzdGltYXRlQml0cmF0ZTsKIH0KIAotSU5UIHNickVuY29kZXJfR2V0SW5wdXREYXRhRGVsYXkoSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyKQoteworSU5UIHNickVuY29kZXJfR2V0SW5wdXREYXRhRGVsYXkoSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyKSB7CiAgIElOVCBkZWxheSA9IC0xOwogCi0gIGlmKGhTYnJFbmNvZGVyKSB7CisgIGlmIChoU2JyRW5jb2RlcikgewogICAgIGRlbGF5ID0gaFNickVuY29kZXItPmlucHV0RGF0YURlbGF5OwogICB9CiAgIHJldHVybiBkZWxheTsKIH0KIAorSU5UIHNickVuY29kZXJfR2V0U2JyRGVjRGVsYXkoSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyKSB7CisgIElOVCBkZWxheSA9IC0xOwogCi1JTlQgc2JyRW5jb2Rlcl9HZXRMaWJJbmZvKCBMSUJfSU5GTyAqaW5mbyApCi17CisgIGlmIChoU2JyRW5jb2RlcikgeworICAgIGRlbGF5ID0gaFNickVuY29kZXItPnNickRlY0RlbGF5OworICB9CisgIHJldHVybiBkZWxheTsKK30KKworSU5UIHNickVuY29kZXJfR2V0TGliSW5mbyhMSUJfSU5GTyAqaW5mbykgewogICBpbnQgaTsKIAogICBpZiAoaW5mbyA9PSBOVUxMKSB7CkBAIC0yNDIxLDcgKzI1NTcsOCBAQAogICBpbmZvICs9IGk7CiAKICAgaW5mby0+bW9kdWxlX2lkID0gRkRLX1NCUkVOQzsKLSAgaW5mby0+dmVyc2lvbiA9IExJQl9WRVJTSU9OKFNCUkVOQ09ERVJfTElCX1ZMMCwgU0JSRU5DT0RFUl9MSUJfVkwxLCBTQlJFTkNPREVSX0xJQl9WTDIpOworICBpbmZvLT52ZXJzaW9uID0KKyAgICAgIExJQl9WRVJTSU9OKFNCUkVOQ09ERVJfTElCX1ZMMCwgU0JSRU5DT0RFUl9MSUJfVkwxLCBTQlJFTkNPREVSX0xJQl9WTDIpOwogICBMSUJfVkVSU0lPTl9TVFJJTkcoaW5mbyk7CiAjaWZkZWYgX19BTkRST0lEX18KICAgaW5mby0+YnVpbGRfZGF0ZSA9ICIiOwpAQCAtMjQzMywxMCArMjU3MCw3IEBACiAgIGluZm8tPnRpdGxlID0gIlNCUiBFbmNvZGVyIjsKIAogICAvKiBTZXQgZmxhZ3MgKi8KLSAgaW5mby0+ZmxhZ3MgPSAwCi0gICAgfCBDQVBGX1NCUl9IUQotICAgIHwgQ0FQRl9TQlJfUFNfTVBFRwotICAgIDsKKyAgaW5mby0+ZmxhZ3MgPSAwIHwgQ0FQRl9TQlJfSFEgfCBDQVBGX1NCUl9QU19NUEVHOwogICAvKiBFbmQgb2YgZmxhZ3MgKi8KIAogICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvc2JyX21pc2MuY3BwIGIvbGliU0JSZW5jL3NyYy9zYnJfbWlzYy5jcHAKaW5kZXggYzY3M2I4MS4uODNkN2UzNiAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9zYnJfbWlzYy5jcHAKKysrIGIvbGliU0JSZW5jL3NyYy9zYnJfbWlzYy5jcHAKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTcgKzkwLDIzIEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCi0gIFxicmllZiAgU2JyIG1pc2NlbGxhbmVvdXMgaGVscGVyIGZ1bmN0aW9ucyAgCisgIFxicmllZiAgU2JyIG1pc2NlbGxhbmVvdXMgaGVscGVyIGZ1bmN0aW9ucyAkUmV2aXNpb246IDM2NzUwICQKICovCiAjaW5jbHVkZSAic2JyX21pc2MuaCIKIAotCi12b2lkIEZES3NickVuY19TaGVsbHNvcnRfZnJhY3QgKEZJWFBfREJMICppbiwgSU5UIG4pCi17Cit2b2lkIEZES3NickVuY19TaGVsbHNvcnRfZnJhY3QoRklYUF9EQkwgKmluLCBJTlQgbikgewogICBGSVhQX0RCTCB2OwogICBJTlQgaSwgajsKICAgSU5UIGluYyA9IDE7CkBAIC0xMDEsMjQgKzExOCwyMCBAQAogICBkbyB7CiAgICAgaW5jID0gaW5jIC8gMzsKICAgICBmb3IgKGkgPSBpbmMgKyAxOyBpIDw9IG47IGkrKykgewotICAgICAgdiA9IGluW2ktMV07CisgICAgICB2ID0gaW5baSAtIDFdOwogICAgICAgaiA9IGk7Ci0gICAgICB3aGlsZSAoaW5bai1pbmMtMV0gPiB2KSB7Ci0gICAgICAgIGluW2otMV0gPSBpbltqLWluYy0xXTsKKyAgICAgIHdoaWxlIChpbltqIC0gaW5jIC0gMV0gPiB2KSB7CisgICAgICAgIGluW2ogLSAxXSA9IGluW2ogLSBpbmMgLSAxXTsKICAgICAgICAgaiAtPSBpbmM7Ci0gICAgICAgIGlmIChqIDw9IGluYykKLSAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGogPD0gaW5jKSBicmVhazsKICAgICAgIH0KLSAgICAgIGluW2otMV0gPSB2OworICAgICAgaW5baiAtIDFdID0gdjsKICAgICB9CiAgIH0gd2hpbGUgKGluYyA+IDEpOwotCiB9CiAKIC8qIFNvcnRpbmcgcm91dGluZSAqLwotdm9pZCBGREtzYnJFbmNfU2hlbGxzb3J0X2ludCAoSU5UICppbiwgSU5UIG4pCi17Ci0KK3ZvaWQgRkRLc2JyRW5jX1NoZWxsc29ydF9pbnQoSU5UICppbiwgSU5UIG4pIHsKICAgSU5UIGksIGosIHY7CiAgIElOVCBpbmMgPSAxOwogCkBAIC0xMjksMjIgKzE0MiwxOCBAQAogICBkbyB7CiAgICAgaW5jID0gaW5jIC8gMzsKICAgICBmb3IgKGkgPSBpbmMgKyAxOyBpIDw9IG47IGkrKykgewotICAgICAgdiA9IGluW2ktMV07CisgICAgICB2ID0gaW5baSAtIDFdOwogICAgICAgaiA9IGk7Ci0gICAgICB3aGlsZSAoaW5bai1pbmMtMV0gPiB2KSB7Ci0gICAgICAgIGluW2otMV0gPSBpbltqLWluYy0xXTsKKyAgICAgIHdoaWxlIChpbltqIC0gaW5jIC0gMV0gPiB2KSB7CisgICAgICAgIGluW2ogLSAxXSA9IGluW2ogLSBpbmMgLSAxXTsKICAgICAgICAgaiAtPSBpbmM7Ci0gICAgICAgIGlmIChqIDw9IGluYykKLSAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGogPD0gaW5jKSBicmVhazsKICAgICAgIH0KLSAgICAgIGluW2otMV0gPSB2OworICAgICAgaW5baiAtIDFdID0gdjsKICAgICB9CiAgIH0gd2hpbGUgKGluYyA+IDEpOwotCiB9CiAKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEZ1bmN0aW9ubmFtZTogIEZES3NickVuY19BZGRWZWNMZWZ0CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTU2LDE2ICsxNjUsMTMgQEAKICBSZXR1cm46ICAgICAgbm9uZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotRkRLc2JyRW5jX0FkZFZlY0xlZnQgKElOVCAqZHN0LCBJTlQgKmxlbmd0aF9kc3QsIElOVCAqc3JjLCBJTlQgbGVuZ3RoX3NyYykKLXsKK3ZvaWQgRkRLc2JyRW5jX0FkZFZlY0xlZnQoSU5UICpkc3QsIElOVCAqbGVuZ3RoX2RzdCwgSU5UICpzcmMsIElOVCBsZW5ndGhfc3JjKSB7CiAgIElOVCBpOwogCiAgIGZvciAoaSA9IGxlbmd0aF9zcmMgLSAxOyBpID49IDA7IGktLSkKLSAgICBGREtzYnJFbmNfQWRkTGVmdCAoZHN0LCBsZW5ndGhfZHN0LCBzcmNbaV0pOworICAgIEZES3NickVuY19BZGRMZWZ0KGRzdCwgbGVuZ3RoX2RzdCwgc3JjW2ldKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEZ1bmN0aW9ubmFtZTogIEZES3NickVuY19BZGRMZWZ0CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTc3LDE4ICsxODMsMTQgQEAKICBSZXR1cm46ICAgICAgbm9uZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotRkRLc2JyRW5jX0FkZExlZnQgKElOVCAqdmVjdG9yLCBJTlQgKmxlbmd0aF92ZWN0b3IsIElOVCB2YWx1ZSkKLXsKK3ZvaWQgRkRLc2JyRW5jX0FkZExlZnQoSU5UICp2ZWN0b3IsIElOVCAqbGVuZ3RoX3ZlY3RvciwgSU5UIHZhbHVlKSB7CiAgIElOVCBpOwogCi0gIGZvciAoaSA9ICpsZW5ndGhfdmVjdG9yOyBpID4gMDsgaS0tKQotICAgIHZlY3RvcltpXSA9IHZlY3RvcltpIC0gMV07CisgIGZvciAoaSA9ICpsZW5ndGhfdmVjdG9yOyBpID4gMDsgaS0tKSB2ZWN0b3JbaV0gPSB2ZWN0b3JbaSAtIDFdOwogICB2ZWN0b3JbMF0gPSB2YWx1ZTsKICAgKCpsZW5ndGhfdmVjdG9yKSsrOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgRnVuY3Rpb25uYW1lOiAgRkRLc2JyRW5jX0FkZFJpZ2h0CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjAwLDE1ICsyMDIsMTEgQEAKICBSZXR1cm46ICAgICAgbm9uZQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotRkRLc2JyRW5jX0FkZFJpZ2h0IChJTlQgKnZlY3RvciwgSU5UICpsZW5ndGhfdmVjdG9yLCBJTlQgdmFsdWUpCi17Cit2b2lkIEZES3NickVuY19BZGRSaWdodChJTlQgKnZlY3RvciwgSU5UICpsZW5ndGhfdmVjdG9yLCBJTlQgdmFsdWUpIHsKICAgdmVjdG9yWypsZW5ndGhfdmVjdG9yXSA9IHZhbHVlOwogICAoKmxlbmd0aF92ZWN0b3IpKys7CiB9CiAKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEZ1bmN0aW9ubmFtZTogIEZES3NickVuY19BZGRWZWNSaWdodAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIyMCwxNSArMjE4LDEyIEBACiAgUmV0dXJuOiAgICAgIG5vbmUKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLUZES3NickVuY19BZGRWZWNSaWdodCAoSU5UICpkc3QsIElOVCAqbGVuZ3RoX2RzdCwgSU5UICpzcmMsIElOVCBsZW5ndGhfc3JjKQotewordm9pZCBGREtzYnJFbmNfQWRkVmVjUmlnaHQoSU5UICpkc3QsIElOVCAqbGVuZ3RoX2RzdCwgSU5UICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbGVuZ3RoX3NyYykgewogICBJTlQgaTsKLSAgZm9yIChpID0gMDsgaSA8IGxlbmd0aF9zcmM7IGkrKykKLSAgICBGREtzYnJFbmNfQWRkUmlnaHQgKGRzdCwgbGVuZ3RoX2RzdCwgc3JjW2ldKTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbmd0aF9zcmM7IGkrKykgRkRLc2JyRW5jX0FkZFJpZ2h0KGRzdCwgbGVuZ3RoX2RzdCwgc3JjW2ldKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBmdW5jdGlvbm5hbWU6IEZES3NickVuY19MU0lfZGl2aWRlX3NjYWxlX2ZyYWN0CkBAIC0yMzgsMzUgKzIzMywzMyBAQAogICByZXR1cm46ICAgICAgIG51bSpzY2FsZS9kZW5vbQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUZJWFBfREJMIEZES3NickVuY19MU0lfZGl2aWRlX3NjYWxlX2ZyYWN0KEZJWFBfREJMIG51bSwgRklYUF9EQkwgZGVub20sIEZJWFBfREJMIHNjYWxlKQoteworRklYUF9EQkwgRkRLc2JyRW5jX0xTSV9kaXZpZGVfc2NhbGVfZnJhY3QoRklYUF9EQkwgbnVtLCBGSVhQX0RCTCBkZW5vbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMIHNjYWxlKSB7CiAgIEZJWFBfREJMIHRtcCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICBpZiAobnVtICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7Ci0KICAgICBJTlQgc2hpZnRDb21tb247Ci0gICAgSU5UIHNoaWZ0TnVtICAgPSBDb3VudExlYWRpbmdCaXRzKG51bSk7CisgICAgSU5UIHNoaWZ0TnVtID0gQ291bnRMZWFkaW5nQml0cyhudW0pOwogICAgIElOVCBzaGlmdERlbm9tID0gQ291bnRMZWFkaW5nQml0cyhkZW5vbSk7CiAgICAgSU5UIHNoaWZ0U2NhbGUgPSBDb3VudExlYWRpbmdCaXRzKHNjYWxlKTsKIAotICAgIG51bSAgID0gbnVtICAgPDwgc2hpZnROdW07CisgICAgbnVtID0gbnVtIDw8IHNoaWZ0TnVtOwogICAgIHNjYWxlID0gc2NhbGUgPDwgc2hpZnRTY2FsZTsKIAotICAgIHRtcCA9IGZNdWx0RGl2MihudW0sc2NhbGUpOworICAgIHRtcCA9IGZNdWx0RGl2MihudW0sIHNjYWxlKTsKIAotICAgIGlmICggZGVub20gPiAodG1wID4+IGZpeE1pbihzaGlmdE51bStzaGlmdFNjYWxlLTEsKERGUkFDVF9CSVRTLTEpKSkgKSB7CisgICAgaWYgKGRlbm9tID4gKHRtcCA+PiBmaXhNaW4oc2hpZnROdW0gKyBzaGlmdFNjYWxlIC0gMSwgKERGUkFDVF9CSVRTIC0gMSkpKSkgewogICAgICAgZGVub20gPSBkZW5vbSA8PCBzaGlmdERlbm9tOwotICAgICAgdG1wID0gc2NodXJfZGl2KHRtcCxkZW5vbSwxNSk7Ci0gICAgICBzaGlmdENvbW1vbiA9IGZpeE1pbigoc2hpZnROdW0tc2hpZnREZW5vbStzaGlmdFNjYWxlLTEpLChERlJBQ1RfQklUUy0xKSk7CisgICAgICB0bXAgPSBzY2h1cl9kaXYodG1wLCBkZW5vbSwgMTUpOworICAgICAgc2hpZnRDb21tb24gPQorICAgICAgICAgIGZpeE1pbigoc2hpZnROdW0gLSBzaGlmdERlbm9tICsgc2hpZnRTY2FsZSAtIDEpLCAoREZSQUNUX0JJVFMgLSAxKSk7CiAgICAgICBpZiAoc2hpZnRDb21tb24gPCAwKQogICAgICAgICB0bXAgPDw9IC1zaGlmdENvbW1vbjsKICAgICAgIGVsc2UKLSAgICAgICAgdG1wID4+PSAgc2hpZnRDb21tb247Ci0gICAgfQotICAgIGVsc2UgeworICAgICAgICB0bXAgPj49IHNoaWZ0Q29tbW9uOworICAgIH0gZWxzZSB7CiAgICAgICB0bXAgPSAvKkZMMkZYQ09OU1RfREJMKDEuMCkqLyAoRklYUF9EQkwpTUFYVkFMX0RCTDsKICAgICB9CiAgIH0KIAogICByZXR1cm4gKHRtcCk7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvc2JyX21pc2MuaCBiL2xpYlNCUmVuYy9zcmMvc2JyX21pc2MuaAppbmRleCBmNDcxOTc0Li5mYWQ4NTNmIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL3Nicl9taXNjLmgKKysrIGIvbGliU0JSZW5jL3NyYy9zYnJfbWlzYy5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDI4ICs5MCwzOCBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIQogICBcZmlsZQotICBcYnJpZWYgIFNiciBtaXNjZWxsYW5lb3VzIGhlbHBlciBmdW5jdGlvbnMgcHJvdG90eXBlcyAgCisgIFxicmllZiAgU2JyIG1pc2NlbGxhbmVvdXMgaGVscGVyIGZ1bmN0aW9ucyBwcm90b3R5cGVzICRSZXZpc2lvbjogOTI3OTAgJAogICBcYXV0aG9yCiAqLwogCi0jaWZuZGVmIF9TQlJfTUlTQ19ICi0jZGVmaW5lIF9TQlJfTUlTQ19ICisjaWZuZGVmIFNCUl9NSVNDX0gKKyNkZWZpbmUgU0JSX01JU0NfSAogCiAjaW5jbHVkZSAic2JyX2VuY29kZXIuaCIKIAogLyogU29ydGluZyByb3V0aW5lcyAqLwotdm9pZCBGREtzYnJFbmNfU2hlbGxzb3J0X2ZyYWN0IChGSVhQX0RCTCAqaW4sIElOVCBuKTsKLXZvaWQgRkRLc2JyRW5jX1NoZWxsc29ydF9pbnQgICAoSU5UICppbiwgSU5UIG4pOwordm9pZCBGREtzYnJFbmNfU2hlbGxzb3J0X2ZyYWN0KEZJWFBfREJMICppbiwgSU5UIG4pOwordm9pZCBGREtzYnJFbmNfU2hlbGxzb3J0X2ludChJTlQgKmluLCBJTlQgbik7CiAKLXZvaWQgRkRLc2JyRW5jX0FkZExlZnQgKElOVCAqdmVjdG9yLCBJTlQgKmxlbmd0aF92ZWN0b3IsIElOVCB2YWx1ZSk7Ci12b2lkIEZES3NickVuY19BZGRSaWdodCAoSU5UICp2ZWN0b3IsIElOVCAqbGVuZ3RoX3ZlY3RvciwgSU5UIHZhbHVlKTsKLXZvaWQgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKElOVCAqZHN0LCBJTlQgKmxlbmd0aF9kc3QsIElOVCAqc3JjLCBJTlQgbGVuZ3RoX3NyYyk7Ci12b2lkIEZES3NickVuY19BZGRWZWNSaWdodCAoSU5UICpkc3QsIElOVCAqbGVuZ3RoX3ZlY3Rvcl9kc3QsIElOVCAqc3JjLCBJTlQgbGVuZ3RoX3NyYyk7Cit2b2lkIEZES3NickVuY19BZGRMZWZ0KElOVCAqdmVjdG9yLCBJTlQgKmxlbmd0aF92ZWN0b3IsIElOVCB2YWx1ZSk7Cit2b2lkIEZES3NickVuY19BZGRSaWdodChJTlQgKnZlY3RvciwgSU5UICpsZW5ndGhfdmVjdG9yLCBJTlQgdmFsdWUpOwordm9pZCBGREtzYnJFbmNfQWRkVmVjTGVmdChJTlQgKmRzdCwgSU5UICpsZW5ndGhfZHN0LCBJTlQgKnNyYywgSU5UIGxlbmd0aF9zcmMpOwordm9pZCBGREtzYnJFbmNfQWRkVmVjUmlnaHQoSU5UICpkc3QsIElOVCAqbGVuZ3RoX3ZlY3Rvcl9kc3QsIElOVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGxlbmd0aF9zcmMpOwogCi1GSVhQX0RCTCBGREtzYnJFbmNfTFNJX2RpdmlkZV9zY2FsZV9mcmFjdChGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbm9tLCBGSVhQX0RCTCBzY2FsZSk7CitGSVhQX0RCTCBGREtzYnJFbmNfTFNJX2RpdmlkZV9zY2FsZV9mcmFjdChGSVhQX0RCTCBudW0sIEZJWFBfREJMIGRlbm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgc2NhbGUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvc2JyX3JhbS5jcHAgYi9saWJTQlJlbmMvc3JjL3Nicl9yYW0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTZjMzdmLi4wMDAwMDAwCi0tLSBhL2xpYlNCUmVuYy9zcmMvc2JyX3JhbS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIQotICBcZmlsZQotICBcYnJpZWYgTWVtb3J5IGxheW91dAotICAgCi0KLSAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgYWxsIHN0YXRpYyBhbmQgZHluYW1pYyBtZW1vcnkgc3BhY2VzCi0qLwotI2luY2x1ZGUgInNicl9yYW0uaCIKLQotI2luY2x1ZGUgInNici5oIgotI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCi0KLUNfQUxMT0NfTUVNIChSYW1fU2JyRHluYW1pY19SQU0sIEZJWFBfREJMLCAoKFNCUl9FTkNfRFlOX1JBTV9TSVpFKS9zaXplb2YoRklYUF9EQkwpKSkKLQotLyohCi0gIFxuYW1lIFN0YXRpY1NickRhdGEKLQotICBTdGF0aWMgbWVtb3J5IGFyZWFzLCBtdXN0IG5vdCBiZSBvdmVyd3JpdHRlbiBpbiBvdGhlciBzZWN0aW9ucyBvZiB0aGUgZW5jb2RlcgotKi8KLS8qIEB7ICovCi0KLS8qISBzdGF0aWMgc2JyIGVuY29kZXIgaW5zdGFuY2UgZm9yIG9uZSBlbmNvZGVyICgyIGNoYW5uZWxzKQotICBhbGwgbWFqb3Igc3RhdGljIGFuZCBkeW5hbWljIG1lbW9yeSBhcmVhcyBhcmUgbG9jYXRlZAotICBpbiBtb2R1bGUgc2JyX3JhbSBhbmQgc2JyIHJvbQotKi8KLUNfQUxMT0NfTUVNIChSYW1fU2JyRW5jb2RlciwgU0JSX0VOQ09ERVIsIDEpCi1DX0FMTE9DX01FTTIoUmFtX1NickNoYW5uZWwsIFNCUl9DSEFOTkVMLCAxLCAoOCkpCi1DX0FMTE9DX01FTTIoUmFtX1NickVsZW1lbnQsIFNCUl9FTEVNRU5ULCAxLCAoOCkpCi0KLS8qISBGaWx0ZXIgc3RhdGVzIGZvciBRTUYtYW5hbHlzaXMuIDxicj4KLSAgRGltZW5zaW9uOiAjTUFYTlJTQlJDSEFOTkVMUyAqICNTQlJfUU1GX0ZJTFRFUl9MRU5HVEgKLSovCi1DX0FBTExPQ19NRU0yX0wgKFJhbV9TYnJfUW1mU3RhdGVzQW5hbHlzaXMsIEZJWFBfUUFTLCBRTUZfRklMVEVSX0xFTkdUSCwgKDgpLCBTRUNUX0RBVEFfTDEpCi0KLQotLyohIE1hdHJpeCBob2xkaW5nIHRoZSBxdW90YSB2YWx1ZXMgZm9yIGFsbCBlc3RpbWF0ZXMsIGFsbCBjaGFubmVscwotICBEaW1lbnNpb24gI01BWE5SU0JSQ0hBTk5FTFMgKiArI1NCUl9RTUZfQ0hBTk5FTFMqICNNQVhfTk9fT0ZfRVNUSU1BVEVTCi0qLwotQ19BTExPQ19NRU0yX0wgKFJhbV9TYnJfcXVvdGFNYXRyaXgsIEZJWFBfREJMLCAoTUFYX05PX09GX0VTVElNQVRFUypRTUZfQ0hBTk5FTFMpLCAoOCksIFNFQ1RfREFUQV9MMSkKLQotLyohIE1hdHJpeCBob2xkaW5nIHRoZSBzaWduIHZhbHVlcyBmb3IgYWxsIGVzdGltYXRlcywgYWxsIGNoYW5uZWxzCi0gIERpbWVuc2lvbiAjTUFYTlJTQlJDSEFOTkVMUyAqICsjU0JSX1FNRl9DSEFOTkVMUyogI01BWF9OT19PRl9FU1RJTUFURVMKLSovCi1DX0FMTE9DX01FTTIgKFJhbV9TYnJfc2lnbk1hdHJpeCwgSU5ULCAoTUFYX05PX09GX0VTVElNQVRFUypRTUZfQ0hBTk5FTFMpLCAoOCkpCi0KLS8qISBGcmVxdWVuY3kgYmFuZCB0YWJsZSAobG93IHJlcykgPGJyPgotICBEaW1lbnNpb24gI01BWF9GUkVRX0NPRUZGUy8yKzEKLSovCi1DX0FMTE9DX01FTTIgKFJhbV9TYnJfZnJlcUJhbmRUYWJsZUxPLCBVQ0hBUiwgKE1BWF9GUkVRX0NPRUZGUy8yKzEpLCAoOCkpCi0KLS8qISBGcmVxdWVuY3kgYmFuZCB0YWJsZSAoaGlnaCByZXMpIDxicj4KLSAgRGltZW5zaW9uICNNQVhfRlJFUV9DT0VGRlMgKzEKLSovCi1DX0FMTE9DX01FTTIgKFJhbV9TYnJfZnJlcUJhbmRUYWJsZUhJLCBVQ0hBUiwgKE1BWF9GUkVRX0NPRUZGUysxKSwgKDgpKQotCi0vKiEgdmsgbWF0c2VyIHRhYmxlIDxicj4KLSAgRGltZW5zaW9uICNNQVhfRlJFUV9DT0VGRlMgKzEKLSovCi1DX0FMTE9DX01FTTIgKFJhbV9TYnJfdl9rX21hc3RlciwgVUNIQVIsIChNQVhfRlJFUV9DT0VGRlMrMSksICg4KSkKLQotCi0vKgotICBNaXNzaW5nIGhhcm1vbmljcyBkZXRlY3Rpb24KLSovCi0KLS8qISBzYnJfZGV0ZWN0aW9uVmVjdG9ycyA8YnI+Ci0gIERpbWVuc2lvbiAjTUFYX05VTV9DSEFOTkVMUyojTUFYX05PX09GX0VTVElNQVRFUyojTUFYX0ZSRVFfQ09FRkZTXQotKi8KLUNfQUxMT0NfTUVNMiAoUmFtX1Nicl9kZXRlY3Rpb25WZWN0b3JzLCBVQ0hBUiwgKE1BWF9OT19PRl9FU1RJTUFURVMqTUFYX0ZSRVFfQ09FRkZTKSwgKDgpKQotCi0vKiEgc2JyX3ByZXZDb21wVmVjWyA8YnI+Ci0gIERpbWVuc2lvbiAjTUFYX05VTV9DSEFOTkVMUyojTUFYX0ZSRVFfQ09FRkZTXQotKi8KLUNfQUxMT0NfTUVNMiAoUmFtX1Nicl9wcmV2RW52ZWxvcGVDb21wZW5zYXRpb24sIFVDSEFSLCBNQVhfRlJFUV9DT0VGRlMsICg4KSkKLS8qISBzYnJfZ3VpZGVTY2ZiWyA8YnI+Ci0gIERpbWVuc2lvbiAjTUFYX05VTV9DSEFOTkVMUyojTUFYX0ZSRVFfQ09FRkZTXQotKi8KLUNfQUxMT0NfTUVNMiAoUmFtX1Nicl9ndWlkZVNjZmIsIFVDSEFSLCBNQVhfRlJFUV9DT0VGRlMsICg4KSkKLQotLyohIHNicl9ndWlkZVZlY3RvckRldGVjdGVkIDxicj4KLSAgRGltZW5zaW9uICNNQVhfTlVNX0NIQU5ORUxTKiNNQVhfTk9fT0ZfRVNUSU1BVEVTKiNNQVhfRlJFUV9DT0VGRlNdCi0qLwotQ19BTExPQ19NRU0yIChSYW1fU2JyX2d1aWRlVmVjdG9yRGV0ZWN0ZWQsIFVDSEFSLCAoTUFYX05PX09GX0VTVElNQVRFUypNQVhfRlJFUV9DT0VGRlMpLCAoOCkpCi1DX0FMTE9DX01FTTIgKFJhbV9TYnJfZ3VpZGVWZWN0b3JEaWZmLCBGSVhQX0RCTCwgKE1BWF9OT19PRl9FU1RJTUFURVMqTUFYX0ZSRVFfQ09FRkZTKSwgKDgpKQotQ19BTExPQ19NRU0yIChSYW1fU2JyX2d1aWRlVmVjdG9yT3JpZywgRklYUF9EQkwsIChNQVhfTk9fT0ZfRVNUSU1BVEVTKk1BWF9GUkVRX0NPRUZGUyksICg4KSkKLQotLyoKLSAgU3RhdGljIFBhcmFtZXRyaWMgU3RlcmVvIG1lbW9yeQotKi8KLUNfQUFMTE9DX01FTV9MKFJhbV9Qc1FtZlN0YXRlc1N5bnRoZXNpcywgRklYUF9EQkwsIFFNRl9GSUxURVJfTEVOR1RILzIsIFNFQ1RfREFUQV9MMSkKLQotQ19BTExPQ19NRU1fTCAoUmFtX1BzRW5jb2RlLCAgICBQU19FTkNPREUsIDEsIFNFQ1RfREFUQV9MMSkKLUNfQUxMT0NfTUVNICAgKFJhbV9QYXJhbVN0ZXJlbywgUEFSQU1FVFJJQ19TVEVSRU8sIDEpCi0KLQotCi0vKiBAfSAqLwotCi0KLS8qIQotICBcbmFtZSBEeW5hbWljU2JyRGF0YQotCi0gIER5bmFtaWMgbWVtb3J5IGFyZWFzLCBtaWdodCBiZSByZXVzZWQgaW4gb3RoZXIgYWxnb3JpdGhtIHNlY3Rpb25zLAotICBlLmcuIHRoZSBjb3JlIGVuY29kZXIuCi0qLwotLyogQHsgKi8KLQotICAvKiEgRW5lcmd5IGJ1ZmZlciBmb3IgZW52ZWxvcGUgZXh0cmFjdGlvbiA8YnI+Ci0gICAgRGltZW5zaW9uICNNQVhOUlNCUkNIQU5ORUxTICogKyNTQlJfUU1GX1NMT1RTICogICNTQlJfUU1GX0NIQU5ORUxTCi0gICovCi0gIENfQUxMT0NfTUVNMiAoUmFtX1Nicl9lbnZZQnVmZmVyLCBGSVhQX0RCTCwgKFFNRl9NQVhfVElNRV9TTE9UUy8yICogUU1GX0NIQU5ORUxTKSwgKDgpKQotCi0gIEZJWFBfREJMKiBHZXRSYW1fU2JyX2VudllCdWZmZXIgKGludCBuLCBVQ0hBUiogZHluYW1pY19SQU0pIHsKLSAgICBGREtfQVNTRVJUKGR5bmFtaWNfUkFNIT0wKTsKLSAgICByZXR1cm4gKChGSVhQX0RCTCopIChkeW5hbWljX1JBTSArIE9GRlNFVF9OUkcgKyAobipZXzJfQlVGX0JZVEUpICkpOwotICB9Ci0KLSAgLyoKLSAgICogUU1GIGRhdGEKLSAgICovCi0gIC8qIFRoZSBTQlIgZW5jb2RlciB1c2VzIGEgc2luZ2xlIGNoYW5uZWwgb3ZlcmxhcHBpbmcgYnVmZmVyIHNldCAoYWx3YXlzIG49MCksIGJ1dCBQUyBkb2VzIG5vdC4gKi8KLSAgRklYUF9EQkwqIEdldFJhbV9TYnJfZW52UkJ1ZmZlciAoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSkgewotICAgIEZES19BU1NFUlQoZHluYW1pY19SQU0hPTApOwotICAgIHJldHVybiAoKEZJWFBfREJMKikgKGR5bmFtaWNfUkFNICsgT0ZGU0VUX1FNRiArIChuKihFTlZfUl9CVUZGX0JZVEUrRU5WX0lfQlVGRl9CWVRFKSkgKSk7Ci0gIH0KLSAgRklYUF9EQkwqIEdldFJhbV9TYnJfZW52SUJ1ZmZlciAoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSkgewotICAgIEZES19BU1NFUlQoZHluYW1pY19SQU0hPTApOwotICAgIHJldHVybiAoKEZJWFBfREJMKikgKGR5bmFtaWNfUkFNICsgT0ZGU0VUX1FNRiArIChFTlZfUl9CVUZGX0JZVEUpICsgKG4qKEVOVl9SX0JVRkZfQllURStFTlZfSV9CVUZGX0JZVEUpKSkpOwotICB9Ci0KLQotCi0KLS8qIEB9ICovCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9zYnJfcmFtLmggYi9saWJTQlJlbmMvc3JjL3Nicl9yYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UzZDBjOC4uMDAwMDAwMAotLS0gYS9saWJTQlJlbmMvc3JjL3Nicl9yYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyohCi1cZmlsZQotXGJyaWVmIE1lbW9yeSBsYXlvdXQKLSAKLSovCi0jaWZuZGVmIF9fU0JSX1JBTV9ICi0jZGVmaW5lIF9fU0JSX1JBTV9ICi0KLSNpbmNsdWRlICJzYnJfZGVmLmgiCi0jaW5jbHVkZSAiZW52X2VzdC5oIgotI2luY2x1ZGUgInNicl9lbmNvZGVyLmgiCi0jaW5jbHVkZSAic2JyLmgiCi0KLQotCi0jaW5jbHVkZSAicHNfbWFpbi5oIgotI2luY2x1ZGUgInBzX2VuY29kZS5oIgotCi0KLSNkZWZpbmUgRU5WX1RSQU5TSUVOVFNfQllURSAgKCAoc2l6ZW9mKEZJWFBfREJMKSooTUFYX05VTV9DSEFOTkVMUyozKlFNRl9NQVhfVElNRV9TTE9UUykpICkKLQotICAjZGVmaW5lIEVOVl9SX0JVRkZfQllURSAgICAgICggKHNpemVvZihGSVhQX0RCTCkqKChRTUZfTUFYX1RJTUVfU0xPVFMpICogTUFYX0hZQlJJRF9CQU5EUykpICkKLSAgI2RlZmluZSBFTlZfSV9CVUZGX0JZVEUgICAgICAoIChzaXplb2YoRklYUF9EQkwpKigoUU1GX01BWF9USU1FX1NMT1RTKSAqIE1BWF9IWUJSSURfQkFORFMpKSApCi0gICNkZWZpbmUgWV9CVUZfQ0hfQllURSAgICAgICAgKCAoMipzaXplb2YoRklYUF9EQkwpKigoUU1GX01BWF9USU1FX1NMT1RTKSAqIE1BWF9IWUJSSURfQkFORFMpKSApCi0KLQotI2RlZmluZSBFTlZfUl9CVUZfUFNfQllURSAgICAoIChzaXplb2YoRklYUF9EQkwpKlFNRl9NQVhfVElNRV9TTE9UUyAqIFFNRl9DSEFOTkVMUyAvIDIpICkKLSNkZWZpbmUgRU5WX0lfQlVGX1BTX0JZVEUgICAgKCAoc2l6ZW9mKEZJWFBfREJMKSpRTUZfTUFYX1RJTUVfU0xPVFMgKiBRTUZfQ0hBTk5FTFMgLyAyKSApCi0KLSNkZWZpbmUgVE9OX0JVRl9DSF9CWVRFICAgICAgKCAoc2l6ZW9mKEZJWFBfREJMKSooTUFYX05PX09GX0VTVElNQVRFUypNQVhfRlJFUV9DT0VGRlMpKSApCi0KLSNkZWZpbmUgWV8yX0JVRl9CWVRFICAgICAgICAgKCBZX0JVRl9DSF9CWVRFPj4xICkKLQotCi0vKiBXb3JrYnVmZmVyIFJBTSAtIEFsbG9jYXRpb24gKi8KLS8qCi0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwotIHwgICAgICAgIE9GRlNFVF9RTUYgICAgICAgfCAgICAgICAgT0ZGU0VUX05SRyAgICAgIHwKLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIDAuNSAqICAgICAgICAgIHwKLSB8ICAgICBzYnJfZW52UkJ1ZmZlciAgICAgIHwgc2JyX2VudllCdWZmZXJfc2l6ZSAgICB8Ci0gfCAgICAgc2JyX2VudklCdWZmZXIgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgfAotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotKi8KLSAgI2RlZmluZSBCVUZfTlJHX1NJWkUgICAoIChNQVhfTlVNX0NIQU5ORUxTICogWV8yX0JVRl9CWVRFKSApCi0gICNkZWZpbmUgQlVGX1FNRl9TSVpFICAoRU5WX1JfQlVGRl9CWVRFICsgRU5WX0lfQlVGRl9CWVRFKQotCi0gIC8qIFNpemUgb2YgdGhlIHNoYXJlYWJsZSBtZW1vcnkgcmVnaW9uIHRoYW4gY2FuIGJlIHJldXNlZCAqLwotICAjZGVmaW5lIFNCUl9FTkNfRFlOX1JBTV9TSVpFICAoIEJVRl9RTUZfU0laRSArIEJVRl9OUkdfU0laRSApCi0KLSAgI2RlZmluZSBPRkZTRVRfUU1GICAgICAgICAgKCAwICkKLSAgI2RlZmluZSBPRkZTRVRfTlJHICAgICAgICAgKCBPRkZTRVRfUU1GICsgQlVGX1FNRl9TSVpFICkKLQotCi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotICBIX0FMTE9DX01FTShSYW1fU2JyRHluYW1pY19SQU0sIEZJWFBfREJMKQotCi0gIEhfQUxMT0NfTUVNKFJhbV9TYnJFbmNvZGVyLCBTQlJfRU5DT0RFUikKLSAgSF9BTExPQ19NRU0oUmFtX1NickNoYW5uZWwsIFNCUl9DSEFOTkVMKQotICBIX0FMTE9DX01FTShSYW1fU2JyRWxlbWVudCwgU0JSX0VMRU1FTlQpCi0KLSAgSF9BTExPQ19NRU0oUmFtX1Nicl9xdW90YU1hdHJpeCwgRklYUF9EQkwpCi0gIEhfQUxMT0NfTUVNKFJhbV9TYnJfc2lnbk1hdHJpeCwgSU5UKQotCi0gIEhfQUxMT0NfTUVNKFJhbV9TYnJfUW1mU3RhdGVzQW5hbHlzaXMsIEZJWFBfUUFTKQotCi0gIEhfQUxMT0NfTUVNKFJhbV9TYnJfZnJlcUJhbmRUYWJsZUxPLCBVQ0hBUikKLSAgSF9BTExPQ19NRU0oUmFtX1Nicl9mcmVxQmFuZFRhYmxlSEksIFVDSEFSKQotICBIX0FMTE9DX01FTShSYW1fU2JyX3Zfa19tYXN0ZXIsIFVDSEFSKQotCi0gIEhfQUxMT0NfTUVNKFJhbV9TYnJfZGV0ZWN0aW9uVmVjdG9ycywgVUNIQVIpCi0gIEhfQUxMT0NfTUVNKFJhbV9TYnJfcHJldkVudmVsb3BlQ29tcGVuc2F0aW9uLCBVQ0hBUikKLSAgSF9BTExPQ19NRU0oUmFtX1Nicl9ndWlkZVNjZmIsIFVDSEFSKQotICBIX0FMTE9DX01FTShSYW1fU2JyX2d1aWRlVmVjdG9yRGV0ZWN0ZWQsIFVDSEFSKQotCi0gIC8qIER5bmFtaWMgTWVtb3J5IEFsbG9jYXRpb24gKi8KLQotICBIX0FMTE9DX01FTShSYW1fU2JyX2VudllCdWZmZXIsIEZJWFBfREJMKQotICBGSVhQX0RCTCogR2V0UmFtX1Nicl9lbnZZQnVmZmVyIChpbnQgbiwgVUNIQVIqIGR5bmFtaWNfUkFNKTsKLSAgRklYUF9EQkwqIEdldFJhbV9TYnJfZW52UkJ1ZmZlciAoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSk7Ci0gIEZJWFBfREJMKiBHZXRSYW1fU2JyX2VudklCdWZmZXIgKGludCBuLCBVQ0hBUiogZHluYW1pY19SQU0pOwotCi0gIEhfQUxMT0NfTUVNKFJhbV9TYnJfZ3VpZGVWZWN0b3JEaWZmLCBGSVhQX0RCTCkKLSAgSF9BTExPQ19NRU0oUmFtX1Nicl9ndWlkZVZlY3Rvck9yaWcsIEZJWFBfREJMKQotCi0KLSAgSF9BTExPQ19NRU0oUmFtX1BzUW1mU3RhdGVzU3ludGhlc2lzLCBGSVhQX0RCTCkKLQotICBIX0FMTE9DX01FTShSYW1fUHNFbmNvZGUsIFBTX0VOQ09ERSkKLQotICBGSVhQX0RCTCogRkRLc2JyRW5jX1NsaWNlUmFtX1BzUnFtZiAoRklYUF9EQkwqIHJRbWZEYXRhLCBVQ0hBUiogZHluYW1pY19SQU0sIGludCBuLCBpbnQgaSwgaW50IHFtZlNsb3RzKTsKLSAgRklYUF9EQkwqIEZES3NickVuY19TbGljZVJhbV9Qc0lxbWYgKEZJWFBfREJMKiBpUW1mRGF0YSwgVUNIQVIqIGR5bmFtaWNfUkFNLCBpbnQgbiwgaW50IGksIGludCBxbWZTbG90cyk7Ci0KLSAgSF9BTExPQ19NRU0oUmFtX1BhcmFtU3RlcmVvLCBQQVJBTUVUUklDX1NURVJFTykKLQotCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3Nicl9yb20uY3BwIGIvbGliU0JSZW5jL3NyYy9zYnJfcm9tLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E1MTY2OC4uMDAwMDAwMAotLS0gYS9saWJTQlJlbmMvc3JjL3Nicl9yb20uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzk1ICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiEKLSAgXGZpbGUKLSAgXGJyaWVmICBEZWZpbml0aW9uIG9mIGNvbnN0YW50IHRhYmxlcwotICAgCi0KLSAgVGhpcyBtb2R1bGUgY29udGFpbnMgbW9zdCBvZiB0aGUgY29uc3RhbnQgZGF0YSB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gUk9NLgotKi8KLQotI2luY2x1ZGUgInNicl9yb20uaCIKLSNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgotCi0vL0B7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBUYWJsZSBPdmVydmlldzoKLQotIG8gZW52ZWxvcGUgbGV2ZWwsICAgMS41IGRCOgotICAgIDFhKSAgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTBUWzEyMV0KLSAgICAxYikgIHZfSHVmZl9lbnZlbG9wZUxldmVsTDEwVFsxMjFdCi0gICAgMmEpICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMEZbMTIxXQotICAgIDJiKSAgdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTBGWzEyMV0KLQotIG8gZW52ZWxvcGUgYmFsYW5jZSwgMS41IGRCOgotICAgIDNhKSAgYm9va1NickVudkJhbGFuY2VDMTBUWzQ5XQotICAgIDNiKSAgYm9va1NickVudkJhbGFuY2VMMTBUWzQ5XQotICAgIDRhKSAgYm9va1NickVudkJhbGFuY2VDMTBGWzQ5XQotICAgIDRiKSAgYm9va1NickVudkJhbGFuY2VMMTBGWzQ5XQotCi0gbyBlbnZlbG9wZSBsZXZlbCwgICAzLjAgZEI6Ci0gICAgNWEpICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMVRbNjNdCi0gICAgNWIpICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMVRbNjNdCi0gICAgNmEpICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMUZbNjNdCi0gICAgNmIpICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMUZbNjNdCi0KLSBvIGVudmVsb3BlIGJhbGFuY2UsIDMuMCBkQjoKLSAgICA3YSkgIGJvb2tTYnJFbnZCYWxhbmNlQzExVFsyNV0KLSAgICA3YikgIGJvb2tTYnJFbnZCYWxhbmNlTDExVFsyNV0KLSAgICA4YSkgIGJvb2tTYnJFbnZCYWxhbmNlQzExRlsyNV0KLSAgICA4YikgIGJvb2tTYnJFbnZCYWxhbmNlTDExRlsyNV0KLQotIG8gbm9pc2UgbGV2ZWwsICAgICAgMy4wIGRCOgotICAgIDlhKSAgdl9IdWZmX05vaXNlTGV2ZWxDMTFUWzYzXQotICAgIDliKSAgdl9IdWZmX05vaXNlTGV2ZWxMMTFUWzYzXQotICAgIC0gKSAodl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFGWzYzXSBpcyB1c2VkIGZvciBmcmVxIGRpcikKLSAgICAtICkgKHZfSHVmZl9lbnZlbG9wZUxldmVsTDExRls2M10gaXMgdXNlZCBmb3IgZnJlcSBkaXIpCi0KLSBvIG5vaXNlIGJhbGFuY2UsICAgIDMuMCBkQjoKLSAgIDEwYSkgIGJvb2tTYnJOb2lzZUJhbGFuY2VDMTFUWzI1XQotICAgMTBiKSAgYm9va1Nick5vaXNlQmFsYW5jZUwxMVRbMjVdCi0gICAgLSApIChib29rU2JyRW52QmFsYW5jZUMxMUZbMjVdIGlzIHVzZWQgZm9yIGZyZXEgZGlyKQotICAgIC0gKSAoYm9va1NickVudkJhbGFuY2VMMTFGWzI1XSBpcyB1c2VkIGZvciBmcmVxIGRpcikKLQotCi0gICgxLjUgZEIgaXMgbmV2ZXIgdXNlZCBmb3Igbm9pc2UpCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogdGFibGUgICAgICAgOiBlbnZlbG9wZSBsZXZlbCwgMS41IGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiB0aGVvciByYW5nZSA6IFstNTgsNThdLCBDT0RFX0JPT0tfU0NGX0xBViAgID0gNTggICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGltcGxlbSByYW5nZTogWy02MCw2MF0sIENPREVfQk9PS19TQ0ZfTEFWMTAgPSA2MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogcmF3IHN0YXRzICAgOiBlbnZlbG9wZUxldmVsXzAwICh5ZXMsIHdyb25nIHN1ZmZpeCBpbiBuYW1lKSAgS0sgMDEtMDMtMDkgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogZGlyZWN0aW9uOiB0aW1lCi0gICBjb250ZW50cyA6IGNvZGV3b3JkcwotICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDMkZJWC5tL2VudmVsb3BlTGV2ZWxfMDBUX2NGLm1hdC92X25DaGV4X2NGCi0gICBidWlsdCBieSA6IEZIIDAxLTA3LTA1ICovCi0KLWNvbnN0IElOVCB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMFRbMTIxXSA9Ci17Ci0gIDB4MDAwM0ZGRDYsIDB4MDAwM0ZGRDcsIDB4MDAwM0ZGRDgsIDB4MDAwM0ZGRDksIDB4MDAwM0ZGREEsIDB4MDAwM0ZGREIsIDB4MDAwN0ZGQjgsIDB4MDAwN0ZGQjksCi0gIDB4MDAwN0ZGQkEsIDB4MDAwN0ZGQkIsIDB4MDAwN0ZGQkMsIDB4MDAwN0ZGQkQsIDB4MDAwN0ZGQkUsIDB4MDAwN0ZGQkYsIDB4MDAwN0ZGQzAsIDB4MDAwN0ZGQzEsCi0gIDB4MDAwN0ZGQzIsIDB4MDAwN0ZGQzMsIDB4MDAwN0ZGQzQsIDB4MDAwN0ZGQzUsIDB4MDAwN0ZGQzYsIDB4MDAwN0ZGQzcsIDB4MDAwN0ZGQzgsIDB4MDAwN0ZGQzksCi0gIDB4MDAwN0ZGQ0EsIDB4MDAwN0ZGQ0IsIDB4MDAwN0ZGQ0MsIDB4MDAwN0ZGQ0QsIDB4MDAwN0ZGQ0UsIDB4MDAwN0ZGQ0YsIDB4MDAwN0ZGRDAsIDB4MDAwN0ZGRDEsCi0gIDB4MDAwN0ZGRDIsIDB4MDAwN0ZGRDMsIDB4MDAwMUZGRTYsIDB4MDAwM0ZGRDQsIDB4MDAwMEZGRjAsIDB4MDAwMUZGRTksIDB4MDAwM0ZGRDUsIDB4MDAwMUZGRTcsCi0gIDB4MDAwMEZGRjEsIDB4MDAwMEZGRUMsIDB4MDAwMEZGRUQsIDB4MDAwMEZGRUUsIDB4MDAwMDdGRjQsIDB4MDAwMDNGRjksIDB4MDAwMDNGRjcsIDB4MDAwMDFGRkEsCi0gIDB4MDAwMDFGRjksIDB4MDAwMDBGRkIsIDB4MDAwMDA3RkMsIDB4MDAwMDAzRkMsIDB4MDAwMDAxRkQsIDB4MDAwMDAwRkQsIDB4MDAwMDAwN0QsIDB4MDAwMDAwM0QsCi0gIDB4MDAwMDAwMUQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMDUsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMEMsIDB4MDAwMDAwMUMsCi0gIDB4MDAwMDAwM0MsIDB4MDAwMDAwN0MsIDB4MDAwMDAwRkMsIDB4MDAwMDAxRkMsIDB4MDAwMDAzRkQsIDB4MDAwMDBGRkEsIDB4MDAwMDFGRjgsIDB4MDAwMDNGRjYsCi0gIDB4MDAwMDNGRjgsIDB4MDAwMDdGRjUsIDB4MDAwMEZGRUYsIDB4MDAwMUZGRTgsIDB4MDAwMEZGRjIsIDB4MDAwN0ZGRDQsIDB4MDAwN0ZGRDUsIDB4MDAwN0ZGRDYsCi0gIDB4MDAwN0ZGRDcsIDB4MDAwN0ZGRDgsIDB4MDAwN0ZGRDksIDB4MDAwN0ZGREEsIDB4MDAwN0ZGREIsIDB4MDAwN0ZGREMsIDB4MDAwN0ZGREQsIDB4MDAwN0ZGREUsCi0gIDB4MDAwN0ZGREYsIDB4MDAwN0ZGRTAsIDB4MDAwN0ZGRTEsIDB4MDAwN0ZGRTIsIDB4MDAwN0ZGRTMsIDB4MDAwN0ZGRTQsIDB4MDAwN0ZGRTUsIDB4MDAwN0ZGRTYsCi0gIDB4MDAwN0ZGRTcsIDB4MDAwN0ZGRTgsIDB4MDAwN0ZGRTksIDB4MDAwN0ZGRUEsIDB4MDAwN0ZGRUIsIDB4MDAwN0ZGRUMsIDB4MDAwN0ZGRUQsIDB4MDAwN0ZGRUUsCi0gIDB4MDAwN0ZGRUYsIDB4MDAwN0ZGRjAsIDB4MDAwN0ZGRjEsIDB4MDAwN0ZGRjIsIDB4MDAwN0ZGRjMsIDB4MDAwN0ZGRjQsIDB4MDAwN0ZGRjUsIDB4MDAwN0ZGRjYsCi0gIDB4MDAwN0ZGRjcsIDB4MDAwN0ZGRjgsIDB4MDAwN0ZGRjksIDB4MDAwN0ZGRkEsIDB4MDAwN0ZGRkIsIDB4MDAwN0ZGRkMsIDB4MDAwN0ZGRkQsIDB4MDAwN0ZGRkUsCi0gIDB4MDAwN0ZGRkYKLX07Ci0KLQotLyogZGlyZWN0aW9uOiB0aW1lCi0gICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKLSAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQzJGSVgubS9lbnZlbG9wZUxldmVsXzAwVF9jRi5tYXQvdl9uTGhleF9jRgotICAgYnVpbHQgYnkgOiBGSCAwMS0wNy0wNSAqLwotCi1jb25zdCBVQ0hBUiB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMFRbMTIxXSA9Ci17Ci0gIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsCi0gIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsCi0gIDB4MTMsIDB4MTMsIDB4MTEsIDB4MTIsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTEsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MEYsIDB4MEUsIDB4MEUsIDB4MEQsCi0gIDB4MEQsIDB4MEMsIDB4MEIsIDB4MEEsIDB4MDksIDB4MDgsIDB4MDcsIDB4MDYsIDB4MDUsIDB4MDQsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsCi0gIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEUsIDB4MEYsIDB4MTAsIDB4MTEsIDB4MTAsIDB4MTMsIDB4MTMsIDB4MTMsCi0gIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsCi0gIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsCi0gIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMKLX07Ci0KLQotLyogZGlyZWN0aW9uOiBmcmVxCi0gICBjb250ZW50cyA6IGNvZGV3b3JkcwotICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDMkZJWC5tL2VudmVsb3BlTGV2ZWxfMDBGX2NGLm1hdC92X25DaGV4X2NGCi0gICBidWlsdCBieSA6IEZIIDAxLTA3LTA1ICovCi0KLWNvbnN0IElOVCB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMEZbMTIxXSA9Ci17Ci0gIDB4MDAwN0ZGRTcsIDB4MDAwN0ZGRTgsIDB4MDAwRkZGRDIsIDB4MDAwRkZGRDMsIDB4MDAwRkZGRDQsIDB4MDAwRkZGRDUsIDB4MDAwRkZGRDYsIDB4MDAwRkZGRDcsCi0gIDB4MDAwRkZGRDgsIDB4MDAwN0ZGREEsIDB4MDAwRkZGRDksIDB4MDAwRkZGREEsIDB4MDAwRkZGREIsIDB4MDAwRkZGREMsIDB4MDAwN0ZGREIsIDB4MDAwRkZGREQsCi0gIDB4MDAwN0ZGREMsIDB4MDAwN0ZGREQsIDB4MDAwRkZGREUsIDB4MDAwM0ZGRTQsIDB4MDAwRkZGREYsIDB4MDAwRkZGRTAsIDB4MDAwRkZGRTEsIDB4MDAwN0ZGREUsCi0gIDB4MDAwRkZGRTIsIDB4MDAwRkZGRTMsIDB4MDAwRkZGRTQsIDB4MDAwN0ZGREYsIDB4MDAwRkZGRTUsIDB4MDAwN0ZGRTAsIDB4MDAwM0ZGRTgsIDB4MDAwN0ZGRTEsCi0gIDB4MDAwM0ZGRTAsIDB4MDAwM0ZGRTksIDB4MDAwMUZGRUYsIDB4MDAwM0ZGRTUsIDB4MDAwMUZGRUMsIDB4MDAwMUZGRUQsIDB4MDAwMUZGRUUsIDB4MDAwMEZGRjQsCi0gIDB4MDAwMEZGRjMsIDB4MDAwMEZGRjAsIDB4MDAwMDdGRjcsIDB4MDAwMDdGRjYsIDB4MDAwMDNGRkEsIDB4MDAwMDFGRkEsIDB4MDAwMDFGRjksIDB4MDAwMDBGRkEsCi0gIDB4MDAwMDBGRjgsIDB4MDAwMDA3RjksIDB4MDAwMDAzRkIsIDB4MDAwMDAxRkMsIDB4MDAwMDAxRkEsIDB4MDAwMDAwRkIsIDB4MDAwMDAwN0MsIDB4MDAwMDAwM0MsCi0gIDB4MDAwMDAwMUMsIDB4MDAwMDAwMEMsIDB4MDAwMDAwMDUsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMUQsCi0gIDB4MDAwMDAwM0QsIDB4MDAwMDAwRkEsIDB4MDAwMDAwRkMsIDB4MDAwMDAxRkIsIDB4MDAwMDAzRkEsIDB4MDAwMDA3RjgsIDB4MDAwMDA3RkEsIDB4MDAwMDA3RkIsCi0gIDB4MDAwMDBGRjksIDB4MDAwMDBGRkIsIDB4MDAwMDFGRjgsIDB4MDAwMDFGRkIsIDB4MDAwMDNGRjgsIDB4MDAwMDNGRjksIDB4MDAwMEZGRjEsIDB4MDAwMEZGRjIsCi0gIDB4MDAwMUZGRUEsIDB4MDAwMUZGRUIsIDB4MDAwM0ZGRTEsIDB4MDAwM0ZGRTIsIDB4MDAwM0ZGRUEsIDB4MDAwM0ZGRTMsIDB4MDAwM0ZGRTYsIDB4MDAwM0ZGRTcsCi0gIDB4MDAwM0ZGRUIsIDB4MDAwRkZGRTYsIDB4MDAwN0ZGRTIsIDB4MDAwRkZGRTcsIDB4MDAwRkZGRTgsIDB4MDAwRkZGRTksIDB4MDAwRkZGRUEsIDB4MDAwRkZGRUIsCi0gIDB4MDAwRkZGRUMsIDB4MDAwN0ZGRTMsIDB4MDAwRkZGRUQsIDB4MDAwRkZGRUUsIDB4MDAwRkZGRUYsIDB4MDAwRkZGRjAsIDB4MDAwN0ZGRTQsIDB4MDAwRkZGRjEsCi0gIDB4MDAwM0ZGRUMsIDB4MDAwRkZGRjIsIDB4MDAwRkZGRjMsIDB4MDAwN0ZGRTUsIDB4MDAwN0ZGRTYsIDB4MDAwRkZGRjQsIDB4MDAwRkZGRjUsIDB4MDAwRkZGRjYsCi0gIDB4MDAwRkZGRjcsIDB4MDAwRkZGRjgsIDB4MDAwRkZGRjksIDB4MDAwRkZGRkEsIDB4MDAwRkZGRkIsIDB4MDAwRkZGRkMsIDB4MDAwRkZGRkQsIDB4MDAwRkZGRkUsCi0gIDB4MDAwRkZGRkYKLX07Ci0KLQotLyogZGlyZWN0aW9uOiBmcmVxCi0gICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKLSAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQzJGSVgubS9lbnZlbG9wZUxldmVsXzAwRl9jRi5tYXQvdl9uTGhleF9jRgotICAgYnVpbHQgYnkgOiBGSCAwMS0wNy0wNSAqLwotCi1jb25zdCBVQ0hBUiB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMEZbMTIxXSA9Ci17Ci0gIDB4MTMsIDB4MTMsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTMsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTMsIDB4MTQsCi0gIDB4MTMsIDB4MTMsIDB4MTQsIDB4MTIsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTMsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTMsIDB4MTQsIDB4MTMsIDB4MTIsIDB4MTMsCi0gIDB4MTIsIDB4MTIsIDB4MTEsIDB4MTIsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MEYsIDB4MEYsIDB4MEUsIDB4MEQsIDB4MEQsIDB4MEMsCi0gIDB4MEMsIDB4MEIsIDB4MEEsIDB4MDksIDB4MDksIDB4MDgsIDB4MDcsIDB4MDYsIDB4MDUsIDB4MDQsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsCi0gIDB4MDYsIDB4MDgsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEIsIDB4MEIsIDB4MEMsIDB4MEMsIDB4MEQsIDB4MEQsIDB4MEUsIDB4MEUsIDB4MTAsIDB4MTAsCi0gIDB4MTEsIDB4MTEsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTQsIDB4MTMsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsCi0gIDB4MTQsIDB4MTMsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTMsIDB4MTQsIDB4MTIsIDB4MTQsIDB4MTQsIDB4MTMsIDB4MTMsIDB4MTQsIDB4MTQsIDB4MTQsCi0gIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQKLX07Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiB0YWJsZSAgICAgICA6IGVudmVsb3BlIGJhbGFuY2UsIDEuNSBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIHRoZW9yIHJhbmdlIDogWy00OCw0OF0sIENPREVfQk9PS19TQ0ZfTEFWID0gNDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogaW1wbGVtIHJhbmdlOiBzYW1lIGJ1dCBtYXBwZWQgdG8gWy0yNCwyNF0sIENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMCA9IDI0ICovCi0vKiByYXcgc3RhdHMgICA6IGVudmVsb3BlUGFuXzAwICh5ZXMsIHdyb25nIHN1ZmZpeCBpbiBuYW1lKSAgS0sgMDEtMDMtMDkgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBkaXJlY3Rpb246IHRpbWUKLSAgIGNvbnRlbnRzIDogY29kZXdvcmRzCi0gICByYXcgdGFibGU6IEh1ZmZDb2RlM0MubS9lbnZlbG9wZVBhbl8wMFQubWF0L3ZfbkJoZXgKLSAgIGJ1aWx0IGJ5IDogRkggMDEtMDUtMTUgKi8KLQotY29uc3QgSU5UIGJvb2tTYnJFbnZCYWxhbmNlQzEwVFs0OV0gPQotewotICAweDAwMDBGRkU0LCAweDAwMDBGRkU1LCAweDAwMDBGRkU2LCAweDAwMDBGRkU3LCAweDAwMDBGRkU4LCAweDAwMDBGRkU5LCAweDAwMDBGRkVBLCAweDAwMDBGRkVCLAotICAweDAwMDBGRkVDLCAweDAwMDBGRkVELCAweDAwMDBGRkVFLCAweDAwMDBGRkVGLCAweDAwMDBGRkYwLCAweDAwMDBGRkYxLCAweDAwMDBGRkYyLCAweDAwMDBGRkYzLAotICAweDAwMDBGRkY0LCAweDAwMDBGRkUyLCAweDAwMDAwRkZDLCAweDAwMDAwN0ZDLCAweDAwMDAwMUZFLCAweDAwMDAwMDdFLCAweDAwMDAwMDFFLCAweDAwMDAwMDA2LAotICAweDAwMDAwMDAwLCAweDAwMDAwMDAyLCAweDAwMDAwMDBFLCAweDAwMDAwMDNFLCAweDAwMDAwMEZFLCAweDAwMDAwN0ZELCAweDAwMDAwRkZELCAweDAwMDA3RkYwLAotICAweDAwMDBGRkUzLCAweDAwMDBGRkY1LCAweDAwMDBGRkY2LCAweDAwMDBGRkY3LCAweDAwMDBGRkY4LCAweDAwMDBGRkY5LCAweDAwMDBGRkZBLCAweDAwMDFGRkY2LAotICAweDAwMDFGRkY3LCAweDAwMDFGRkY4LCAweDAwMDFGRkY5LCAweDAwMDFGRkZBLCAweDAwMDFGRkZCLCAweDAwMDFGRkZDLCAweDAwMDFGRkZELCAweDAwMDFGRkZFLAotICAweDAwMDFGRkZGCi19OwotCi0KLS8qIGRpcmVjdGlvbjogdGltZQotICAgY29udGVudHMgOiBjb2Rld29yZCBsZW5ndGhzCi0gICByYXcgdGFibGU6IEh1ZmZDb2RlM0MubS9lbnZlbG9wZVBhbl8wMFQubWF0L3ZfbkxoZXgKLSAgIGJ1aWx0IGJ5IDogRkggMDEtMDUtMTUgKi8KLQotY29uc3QgVUNIQVIgYm9va1NickVudkJhbGFuY2VMMTBUWzQ5XSA9Ci17Ci0gIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCi0gIDB4MTAsIDB4MTAsIDB4MEMsIDB4MEIsIDB4MDksIDB4MDcsIDB4MDUsIDB4MDMsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDYsIDB4MDgsIDB4MEIsIDB4MEMsIDB4MEYsCi0gIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsCi0gIDB4MTEKLX07Ci0KLQotLyogZGlyZWN0aW9uOiBmcmVxCi0gICBjb250ZW50cyA6IGNvZGV3b3JkcwotICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDLm0vZW52ZWxvcGVQYW5fMDBGLm1hdC92X25CaGV4Ci0gICBidWlsdCBieSA6IEZIIDAxLTA1LTE1ICovCi0KLWNvbnN0IElOVCBib29rU2JyRW52QmFsYW5jZUMxMEZbNDldID0KLXsKLSAgMHgwMDAzRkZFMiwgMHgwMDAzRkZFMywgMHgwMDAzRkZFNCwgMHgwMDAzRkZFNSwgMHgwMDAzRkZFNiwgMHgwMDAzRkZFNywgMHgwMDAzRkZFOCwgMHgwMDAzRkZFOSwKLSAgMHgwMDAzRkZFQSwgMHgwMDAzRkZFQiwgMHgwMDAzRkZFQywgMHgwMDAzRkZFRCwgMHgwMDAzRkZFRSwgMHgwMDAzRkZFRiwgMHgwMDAzRkZGMCwgMHgwMDAwRkZGNywKLSAgMHgwMDAxRkZGMCwgMHgwMDAwM0ZGQywgMHgwMDAwMDdGRSwgMHgwMDAwMDdGQywgMHgwMDAwMDBGRSwgMHgwMDAwMDA3RSwgMHgwMDAwMDAwRSwgMHgwMDAwMDAwMiwKLSAgMHgwMDAwMDAwMCwgMHgwMDAwMDAwNiwgMHgwMDAwMDAxRSwgMHgwMDAwMDAzRSwgMHgwMDAwMDFGRSwgMHgwMDAwMDdGRCwgMHgwMDAwMEZGRSwgMHgwMDAwN0ZGQSwKLSAgMHgwMDAwRkZGNiwgMHgwMDAzRkZGMSwgMHgwMDAzRkZGMiwgMHgwMDAzRkZGMywgMHgwMDAzRkZGNCwgMHgwMDAzRkZGNSwgMHgwMDAzRkZGNiwgMHgwMDAzRkZGNywKLSAgMHgwMDAzRkZGOCwgMHgwMDAzRkZGOSwgMHgwMDAzRkZGQSwgMHgwMDAzRkZGQiwgMHgwMDAzRkZGQywgMHgwMDAzRkZGRCwgMHgwMDAzRkZGRSwgMHgwMDA3RkZGRSwKLSAgMHgwMDA3RkZGRgotfTsKLQotCi0vKiBkaXJlY3Rpb246IGZyZXEKLSAgIGNvbnRlbnRzIDogY29kZXdvcmQgbGVuZ3RocwotICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDLm0vZW52ZWxvcGVQYW5fMDBGLm1hdC92X25MaGV4Ci0gICBidWlsdCBieSA6IEZIIDAxLTA1LTE1ICovCi0KLWNvbnN0IFVDSEFSIGJvb2tTYnJFbnZCYWxhbmNlTDEwRls0OV0gPQotewotICAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEwLAotICAweDExLCAweDBFLCAweDBCLCAweDBCLCAweDA4LCAweDA3LCAweDA0LCAweDAyLCAweDAxLCAweDAzLCAweDA1LCAweDA2LCAweDA5LCAweDBCLCAweDBDLCAweDBGLAotICAweDEwLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEzLAotICAweDEzCi19OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogdGFibGUgICAgICAgOiBlbnZlbG9wZSBsZXZlbCwgMy4wIGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiB0aGVvciByYW5nZSA6IFstMjksMjldLCBDT0RFX0JPT0tfU0NGX0xBViAgID0gMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGltcGxlbSByYW5nZTogWy0zMSwzMV0sIENPREVfQk9PS19TQ0ZfTEFWMTEgPSAzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogcmF3IHN0YXRzICAgOiBlbnZlbG9wZUxldmVsXzExICBLSyAwMC0wMi0wMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogZGlyZWN0aW9uOiB0aW1lCi0gICBjb250ZW50cyA6IGNvZGV3b3JkcwotICAgcmF3IHRhYmxlOiBIdWZmQ29kZTIubQotICAgYnVpbHQgYnkgOiBGSCAwMC0wMi0wNCAqLwotCi1jb25zdCBJTlQgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFUWzYzXSA9IHsKLSAgMHgwMDAzRkZFRCwgMHgwMDAzRkZFRSwgMHgwMDA3RkZERSwgMHgwMDA3RkZERiwgMHgwMDA3RkZFMCwgMHgwMDA3RkZFMSwgMHgwMDA3RkZFMiwgMHgwMDA3RkZFMywKLSAgMHgwMDA3RkZFNCwgMHgwMDA3RkZFNSwgMHgwMDA3RkZFNiwgMHgwMDA3RkZFNywgMHgwMDA3RkZFOCwgMHgwMDA3RkZFOSwgMHgwMDA3RkZFQSwgMHgwMDA3RkZFQiwKLSAgMHgwMDA3RkZFQywgMHgwMDAxRkZGNCwgMHgwMDAwRkZGNywgMHgwMDAwRkZGOSwgMHgwMDAwRkZGOCwgMHgwMDAwM0ZGQiwgMHgwMDAwM0ZGQSwgMHgwMDAwM0ZGOCwKLSAgMHgwMDAwMUZGQSwgMHgwMDAwMEZGQywgMHgwMDAwMDdGQywgMHgwMDAwMDBGRSwgMHgwMDAwMDAzRSwgMHgwMDAwMDAwRSwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAwNiwgMHgwMDAwMDAxRSwgMHgwMDAwMDA3RSwgMHgwMDAwMDFGRSwgMHgwMDAwMDdGRCwgMHgwMDAwMUZGQiwgMHgwMDAwM0ZGOSwgMHgwMDAwM0ZGQywKLSAgMHgwMDAwN0ZGQSwgMHgwMDAwRkZGNiwgMHgwMDAxRkZGNSwgMHgwMDAzRkZFQywgMHgwMDA3RkZFRCwgMHgwMDA3RkZFRSwgMHgwMDA3RkZFRiwgMHgwMDA3RkZGMCwKLSAgMHgwMDA3RkZGMSwgMHgwMDA3RkZGMiwgMHgwMDA3RkZGMywgMHgwMDA3RkZGNCwgMHgwMDA3RkZGNSwgMHgwMDA3RkZGNiwgMHgwMDA3RkZGNywgMHgwMDA3RkZGOCwKLSAgMHgwMDA3RkZGOSwgMHgwMDA3RkZGQSwgMHgwMDA3RkZGQiwgMHgwMDA3RkZGQywgMHgwMDA3RkZGRCwgMHgwMDA3RkZGRSwgMHgwMDA3RkZGRgotfTsKLQotCi0vKiBkaXJlY3Rpb246IHRpbWUKLSAgIGNvbnRlbnRzIDogY29kZXdvcmQgbGVuZ3RocwotICAgcmF3IHRhYmxlOiBIdWZmQ29kZTIubQotICAgYnVpbHQgYnkgOiBGSCAwMC0wMi0wNCAqLwotCi1jb25zdCBVQ0hBUiB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMVRbNjNdID0gewotICAweDEyLCAweDEyLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAotICAweDEzLCAweDExLCAweDEwLCAweDEwLCAweDEwLCAweDBFLCAweDBFLCAweDBFLCAweDBELCAweDBDLCAweDBCLCAweDA4LCAweDA2LCAweDA0LCAweDAyLCAweDAxLAotICAweDAzLCAweDA1LCAweDA3LCAweDA5LCAweDBCLCAweDBELCAweDBFLCAweDBFLCAweDBGLCAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAotICAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzCi19OwotCi0KLS8qIGRpcmVjdGlvbjogZnJlcQotICAgY29udGVudHMgOiBjb2Rld29yZHMKLSAgIHJhdyB0YWJsZTogSHVmZkNvZGUyLm0KLSAgIGJ1aWx0IGJ5IDogRkggMDAtMDItMDQgKi8KLQotY29uc3QgSU5UIHZfSHVmZl9lbnZlbG9wZUxldmVsQzExRls2M10gPSB7Ci0gIDB4MDAwRkZGRjAsIDB4MDAwRkZGRjEsIDB4MDAwRkZGRjIsIDB4MDAwRkZGRjMsIDB4MDAwRkZGRjQsIDB4MDAwRkZGRjUsIDB4MDAwRkZGRjYsIDB4MDAwM0ZGRjMsCi0gIDB4MDAwN0ZGRjUsIDB4MDAwN0ZGRUUsIDB4MDAwN0ZGRUYsIDB4MDAwN0ZGRjYsIDB4MDAwM0ZGRjQsIDB4MDAwM0ZGRjIsIDB4MDAwRkZGRjcsIDB4MDAwN0ZGRjAsCi0gIDB4MDAwMUZGRjUsIDB4MDAwM0ZGRjAsIDB4MDAwMUZGRjQsIDB4MDAwMEZGRjcsIDB4MDAwMEZGRjYsIDB4MDAwMDdGRjgsIDB4MDAwMDNGRkIsIDB4MDAwMDBGRkQsCi0gIDB4MDAwMDA3RkQsIDB4MDAwMDAzRkQsIDB4MDAwMDAxRkQsIDB4MDAwMDAwRkQsIDB4MDAwMDAwM0UsIDB4MDAwMDAwMEUsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMDYsIDB4MDAwMDAwMUUsIDB4MDAwMDAwRkMsIDB4MDAwMDAxRkMsIDB4MDAwMDAzRkMsIDB4MDAwMDA3RkMsIDB4MDAwMDBGRkMsIDB4MDAwMDFGRkMsCi0gIDB4MDAwMDNGRkEsIDB4MDAwMDdGRjksIDB4MDAwMDdGRkEsIDB4MDAwMEZGRjgsIDB4MDAwMEZGRjksIDB4MDAwMUZGRjYsIDB4MDAwMUZGRjcsIDB4MDAwM0ZGRjUsCi0gIDB4MDAwM0ZGRjYsIDB4MDAwM0ZGRjEsIDB4MDAwRkZGRjgsIDB4MDAwN0ZGRjEsIDB4MDAwN0ZGRjIsIDB4MDAwN0ZGRjMsIDB4MDAwRkZGRjksIDB4MDAwN0ZGRjcsCi0gIDB4MDAwN0ZGRjQsIDB4MDAwRkZGRkEsIDB4MDAwRkZGRkIsIDB4MDAwRkZGRkMsIDB4MDAwRkZGRkQsIDB4MDAwRkZGRkUsIDB4MDAwRkZGRkYKLX07Ci0KLQotLyogZGlyZWN0aW9uOiBmcmVxCi0gICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKLSAgIHJhdyB0YWJsZTogSHVmZkNvZGUyLm0KLSAgIGJ1aWx0IGJ5IDogRkggMDAtMDItMDQgKi8KLQotY29uc3QgVUNIQVIgdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFGWzYzXSA9IHsKLSAgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxMiwgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMiwgMHgxMiwgMHgxNCwgMHgxMywKLSAgMHgxMSwgMHgxMiwgMHgxMSwgMHgxMCwgMHgxMCwgMHgwRiwgMHgwRSwgMHgwQywgMHgwQiwgMHgwQSwgMHgwOSwgMHgwOCwgMHgwNiwgMHgwNCwgMHgwMiwgMHgwMSwKLSAgMHgwMywgMHgwNSwgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwgMHgwRiwgMHgxMCwgMHgxMCwgMHgxMSwgMHgxMSwgMHgxMiwKLSAgMHgxMiwgMHgxMiwgMHgxNCwgMHgxMywgMHgxMywgMHgxMywgMHgxNCwgMHgxMywgMHgxMywgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNAotfTsKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogdGFibGUgICAgICAgOiBlbnZlbG9wZSBiYWxhbmNlLCAzLjAgZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiB0aGVvciByYW5nZSA6IFstMjQsMjRdLCBDT0RFX0JPT0tfU0NGX0xBViA9IDI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGltcGxlbSByYW5nZTogc2FtZSBidXQgbWFwcGVkIHRvIFstMTIsMTJdLCBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTEgPSAxMiAqLwotLyogcmF3IHN0YXRzICAgOiBlbnZlbG9wZUJhbGFuY2VfMTEgIEtLIDAwLTAyLTAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogZGlyZWN0aW9uOiB0aW1lCi0gICBjb250ZW50cyA6IGNvZGV3b3JkcwotICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDLm0vZW52ZWxvcGVCYWxhbmNlXzExVC5tYXQvdl9uQmhleAotICAgYnVpbHQgYnkgOiBGSCAwMS0wNS0xNSAqLwotCi1jb25zdCBJTlQgYm9va1NickVudkJhbGFuY2VDMTFUWzI1XSA9Ci17Ci0gIDB4MDAwMDFGRjIsIDB4MDAwMDFGRjMsIDB4MDAwMDFGRjQsIDB4MDAwMDFGRjUsIDB4MDAwMDFGRjYsIDB4MDAwMDFGRjcsIDB4MDAwMDFGRjgsIDB4MDAwMDBGRjgsCi0gIDB4MDAwMDAwRkUsIDB4MDAwMDAwN0UsIDB4MDAwMDAwMEUsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMUUsIDB4MDAwMDAwM0UsCi0gIDB4MDAwMDAxRkUsIDB4MDAwMDFGRjksIDB4MDAwMDFGRkEsIDB4MDAwMDFGRkIsIDB4MDAwMDFGRkMsIDB4MDAwMDFGRkQsIDB4MDAwMDFGRkUsIDB4MDAwMDNGRkUsCi0gIDB4MDAwMDNGRkYKLX07Ci0KLQotLyogZGlyZWN0aW9uOiB0aW1lCi0gICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKLSAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQy5tL2VudmVsb3BlQmFsYW5jZV8xMVQubWF0L3ZfbkxoZXgKLSAgIGJ1aWx0IGJ5IDogRkggMDEtMDUtMTUgKi8KLQotY29uc3QgVUNIQVIgYm9va1NickVudkJhbGFuY2VMMTFUWzI1XSA9Ci17Ci0gIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEMsIDB4MDgsIDB4MDcsIDB4MDQsIDB4MDMsIDB4MDEsIDB4MDIsIDB4MDUsIDB4MDYsCi0gIDB4MDksIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEUsIDB4MEUKLX07Ci0KLQotLyogZGlyZWN0aW9uOiBmcmVxCi0gICBjb250ZW50cyA6IGNvZGV3b3JkcwotICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDLm0vZW52ZWxvcGVCYWxhbmNlXzExRi5tYXQvdl9uQmhleAotICAgYnVpbHQgYnkgOiBGSCAwMS0wNS0xNSAqLwotCi1jb25zdCBJTlQgYm9va1NickVudkJhbGFuY2VDMTFGWzI1XSA9Ci17Ci0gIDB4MDAwMDFGRjcsIDB4MDAwMDFGRjgsIDB4MDAwMDFGRjksIDB4MDAwMDFGRkEsIDB4MDAwMDFGRkIsIDB4MDAwMDNGRjgsIDB4MDAwMDNGRjksIDB4MDAwMDA3RkMsCi0gIDB4MDAwMDAwRkUsIDB4MDAwMDAwN0UsIDB4MDAwMDAwMEUsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMUUsIDB4MDAwMDAwM0UsCi0gIDB4MDAwMDAxRkUsIDB4MDAwMDBGRkEsIDB4MDAwMDFGRjYsIDB4MDAwMDNGRkEsIDB4MDAwMDNGRkIsIDB4MDAwMDNGRkMsIDB4MDAwMDNGRkQsIDB4MDAwMDNGRkUsCi0gIDB4MDAwMDNGRkYKLX07Ci0KLQotLyogZGlyZWN0aW9uOiBmcmVxCi0gICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKLSAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQy5tL2VudmVsb3BlQmFsYW5jZV8xMUYubWF0L3ZfbkxoZXgKLSAgIGJ1aWx0IGJ5IDogRkggMDEtMDUtMTUgKi8KLQotY29uc3QgVUNIQVIgYm9va1NickVudkJhbGFuY2VMMTFGWzI1XSA9Ci17Ci0gIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEUsIDB4MEUsIDB4MEIsIDB4MDgsIDB4MDcsIDB4MDQsIDB4MDIsIDB4MDEsIDB4MDMsIDB4MDUsIDB4MDYsCi0gIDB4MDksIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEUsIDB4MEUsIDB4MEUsIDB4MEUsIDB4MEUKLX07Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiB0YWJsZSAgICAgICA6IG5vaXNlIGxldmVsLCAzLjAgZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIHRoZW9yIHJhbmdlIDogWy0yOSwyOV0sIENPREVfQk9PS19TQ0ZfTEFWICAgPSAyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogaW1wbGVtIHJhbmdlOiBbLTMxLDMxXSwgQ09ERV9CT09LX1NDRl9MQVYxMSA9IDMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiByYXcgc3RhdHMgICA6IG5vaXNlTGV2ZWxfMTEgIEtLIDAwLTAyLTAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBkaXJlY3Rpb246IHRpbWUKLSAgIGNvbnRlbnRzIDogY29kZXdvcmRzCi0gICByYXcgdGFibGU6IEh1ZmZDb2RlMi5tCi0gICBidWlsdCBieSA6IEZIIDAwLTAyLTA0ICovCi0KLWNvbnN0IElOVCB2X0h1ZmZfTm9pc2VMZXZlbEMxMVRbNjNdID0gewotICAweDAwMDAxRkNFLCAweDAwMDAxRkNGLCAweDAwMDAxRkQwLCAweDAwMDAxRkQxLCAweDAwMDAxRkQyLCAweDAwMDAxRkQzLCAweDAwMDAxRkQ0LCAweDAwMDAxRkQ1LAotICAweDAwMDAxRkQ2LCAweDAwMDAxRkQ3LCAweDAwMDAxRkQ4LCAweDAwMDAxRkQ5LCAweDAwMDAxRkRBLCAweDAwMDAxRkRCLCAweDAwMDAxRkRDLCAweDAwMDAxRkRELAotICAweDAwMDAxRkRFLCAweDAwMDAxRkRGLCAweDAwMDAxRkUwLCAweDAwMDAxRkUxLCAweDAwMDAxRkUyLCAweDAwMDAxRkUzLCAweDAwMDAxRkU0LCAweDAwMDAxRkU1LAotICAweDAwMDAxRkU2LCAweDAwMDAxRkU3LCAweDAwMDAwN0YyLCAweDAwMDAwMEZELCAweDAwMDAwMDNFLCAweDAwMDAwMDBFLCAweDAwMDAwMDA2LCAweDAwMDAwMDAwLAotICAweDAwMDAwMDAyLCAweDAwMDAwMDFFLCAweDAwMDAwMEZDLCAweDAwMDAwM0Y4LCAweDAwMDAxRkNDLCAweDAwMDAxRkU4LCAweDAwMDAxRkU5LCAweDAwMDAxRkVBLAotICAweDAwMDAxRkVCLCAweDAwMDAxRkVDLCAweDAwMDAxRkNELCAweDAwMDAxRkVELCAweDAwMDAxRkVFLCAweDAwMDAxRkVGLCAweDAwMDAxRkYwLCAweDAwMDAxRkYxLAotICAweDAwMDAxRkYyLCAweDAwMDAxRkYzLCAweDAwMDAxRkY0LCAweDAwMDAxRkY1LCAweDAwMDAxRkY2LCAweDAwMDAxRkY3LCAweDAwMDAxRkY4LCAweDAwMDAxRkY5LAotICAweDAwMDAxRkZBLCAweDAwMDAxRkZCLCAweDAwMDAxRkZDLCAweDAwMDAxRkZELCAweDAwMDAxRkZFLCAweDAwMDAzRkZFLCAweDAwMDAzRkZGCi19OwotCi0KLS8qIGRpcmVjdGlvbjogdGltZQotICAgY29udGVudHMgOiBjb2Rld29yZCBsZW5ndGhzCi0gICByYXcgdGFibGU6IEh1ZmZDb2RlMi5tCi0gICBidWlsdCBieSA6IEZIIDAwLTAyLTA0ICovCi0KLWNvbnN0IFVDSEFSIHZfSHVmZl9Ob2lzZUxldmVsTDExVFs2M10gPSB7Ci0gIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsCi0gIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsCi0gIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsCi0gIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEIsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDEsCi0gIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDUsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMEEsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsCi0gIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsCi0gIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsCi0gIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEUsIDB4MDAwMDAwMEUKLX07Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiB0YWJsZSAgICAgICA6IG5vaXNlIGJhbGFuY2UsIDMuMCBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIHRoZW9yIHJhbmdlIDogWy0yNCwyNF0sIENPREVfQk9PS19TQ0ZfTEFWID0gMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogaW1wbGVtIHJhbmdlOiBzYW1lIGJ1dCBtYXBwZWQgdG8gWy0xMiwxMl0sIENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMSA9IDEyICovCi0vKiByYXcgc3RhdHMgICA6IG5vaXNlQmFsYW5jZV8xMSAgS0sgMDAtMDItMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBkaXJlY3Rpb246IHRpbWUKLSAgIGNvbnRlbnRzIDogY29kZXdvcmRzCi0gICByYXcgdGFibGU6IEh1ZmZDb2RlM0MubS9ub2lzZUJhbGFuY2VfMTEubWF0L3ZfbkJoZXgKLSAgIGJ1aWx0IGJ5IDogRkggMDEtMDUtMTUgKi8KLQotY29uc3QgSU5UIGJvb2tTYnJOb2lzZUJhbGFuY2VDMTFUWzI1XSA9Ci17Ci0gIDB4MDAwMDAwRUMsIDB4MDAwMDAwRUQsIDB4MDAwMDAwRUUsIDB4MDAwMDAwRUYsIDB4MDAwMDAwRjAsIDB4MDAwMDAwRjEsIDB4MDAwMDAwRjIsIDB4MDAwMDAwRjMsCi0gIDB4MDAwMDAwRjQsIDB4MDAwMDAwRjUsIDB4MDAwMDAwMUMsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDYsIDB4MDAwMDAwM0EsIDB4MDAwMDAwRjYsCi0gIDB4MDAwMDAwRjcsIDB4MDAwMDAwRjgsIDB4MDAwMDAwRjksIDB4MDAwMDAwRkEsIDB4MDAwMDAwRkIsIDB4MDAwMDAwRkMsIDB4MDAwMDAwRkQsIDB4MDAwMDAwRkUsCi0gIDB4MDAwMDAwRkYKLX07Ci0KLQotLyogZGlyZWN0aW9uOiB0aW1lCi0gICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKLSAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQy5tL25vaXNlQmFsYW5jZV8xMS5tYXQvdl9uTGhleAotICAgYnVpbHQgYnkgOiBGSCAwMS0wNS0xNSAqLwotCi1jb25zdCBVQ0hBUiBib29rU2JyTm9pc2VCYWxhbmNlTDExVFsyNV0gPQotewotICAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA1LCAweDAyLCAweDAxLCAweDAzLCAweDA2LCAweDA4LAotICAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4Ci19OwotCi0vKgotICAgdHVuaW5nVGFibGUKLSovCi1jb25zdCBzYnJUdW5pbmdUYWJsZV90IHNiclR1bmluZ1RhYmxlW10gPQotewotICAvKiBTb21lIG9mIHRoZSBsb3cgYml0cmF0ZXMgYXJlIGNvbW1lbnRlZCBvdXQgaGVyZSwgdGhpcyBpcyBiZWNhdXNlIHRoZQotICAgICBlbmNvZGVyIGNvdWxkIGxvc2UgZnJhbWVzIGF0IHRob3NlIGJpdHJhdGVzIGFuZCB0aHJvdyBhbiBlcnJvciBiZWNhdXNlCi0gICAgIGl0IGhhcyBpbnN1ZmZpY2llbnQgYml0cyB0byBlbmNvZGUgZm9yIHNvbWUgdGVzdCBpdGVtcy4KLSAgKi8KLQotICAvKioqIEhFLUFBQyBzZWN0aW9uICoqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBzZixzZnNwLHNmLHNmc3Asbm5iLG5mbyxzYW1sLFNNLEZTKi8KLQotICAvKioqIG1vbm8gKioqLwotCi0gIC8qIDgvMTYga0h6IGR1YWwgcmF0ZSAqLwotICB7IENPREVDX0FBQywgICA4MDAwLCAxMDAwMCwgICA4MDAwLCAxLCAgNywgNiwgMTEsMTAsIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sCi0gIHsgQ09ERUNfQUFDLCAgMTAwMDAsIDEyMDAwLCAgIDgwMDAsIDEsIDExLCA3LCAxMywxMiwgMSwgMCwgNiwgU0JSX01PTk8sIDMgfSwKLSAgeyBDT0RFQ19BQUMsICAxMjAwMCwgMTYwMDEsICAgODAwMCwgMSwgMTQsMTAsIDEzLDEzLCAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LAotICB7IENPREVDX0FBQywgIDE2MDAwLCAyNDAwMCwgICA4MDAwLCAxLCAxNCwxMCwgMTQsMTQsIDIsIDAsIDMsIFNCUl9NT05PLCAyIH0sIC8qIHBsYWNlYm8gKi8KLSAgeyBDT0RFQ19BQUMsICAyNDAwMCwgMzIwMDAsICAgODAwMCwgMSwgMTQsMTAsIDE0LDE0LCAyLCAwLCAzLCBTQlJfTU9OTywgMiB9LCAvKiBwbGFjZWJvICovCi0gIHsgQ09ERUNfQUFDLCAgMzIwMDAsIDQ4MDAxLCAgIDgwMDAsIDEsIDE0LDExLCAxNSwxNSwgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogcGxhY2VibyAqLyAvKiBiaXRyYXRlcyBoaWdoZXIgdGhhbiA0ODAwMCBub3Qgc3VwcG9ydGVkIGJ5IEFBQyBjb3JlICovCi0KLSAgLyogMTEvMjIga0h6IGR1YWwgcmF0ZSAqLwotICB7IENPREVDX0FBQywgICA4MDAwLCAxMDAwMCwgIDExMDI1LCAxLCAgNSwgNCwgIDYsIDYsIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sCi0gIHsgQ09ERUNfQUFDLCAgMTAwMDAsIDEyMDAwLCAgMTEwMjUsIDEsICA4LCA1LCAxMiwgOSwgMSwgMCwgNiwgU0JSX01PTk8sIDMgfSwKLSAgeyBDT0RFQ19BQUMsICAxMjAwMCwgMTYwMDAsICAxMTAyNSwgMSwgMTIsIDgsIDEzLCA4LCAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LAotICB7IENPREVDX0FBQywgIDE2MDAwLCAyMDAwMCwgIDExMDI1LCAxLCAxMiwgOCwgMTMsIDgsIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIGF0IHN1Y2ggImhpZ2giIGJpdHJhdGVzIGl0J3MgYmV0dGVyIHRvIHVwc2FtcGxlIHRoZSBpbnB1dCAqLwotICB7IENPREVDX0FBQywgIDIwMDAwLCAyNDAwMSwgIDExMDI1LCAxLCAxMywgOSwgMTMsIDgsIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIHNpZ25hbCBieSBhIGZhY3RvciBvZiAyIGJlZm9yZSBzZW5kaW5nIGl0IGludG8gdGhlIGVuY29kZXIgKi8KLSAgeyBDT0RFQ19BQUMsICAyNDAwMCwgMzIwMDAsICAxMTAyNSwgMSwgMTQsMTAsIDE0LCA5LCAyLCAwLCAzLCBTQlJfTU9OTywgMiB9LCAvKiBwbGFjZWJvICovCi0gIHsgQ09ERUNfQUFDLCAgMzIwMDAsIDQ4MDAwLCAgMTEwMjUsIDEsIDE1LDExLCAxNSwxMCwgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogcGxhY2VibyAqLwotICB7IENPREVDX0FBQywgIDQ4MDAwLCA2NDAwMSwgIDExMDI1LCAxLCAxNSwxMSwgMTUsMTAsIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIHBsYWNlYm8gKi8KLQotICAvKiAxMi8yNCBrSHogZHVhbCByYXRlICovCi0gIHsgQ09ERUNfQUFDLCAgIDgwMDAsIDEwMDAwLCAgMTIwMDAsIDEsICA0LCAzLCAgNiwgNiwgMSwgMCwgNiwgU0JSX01PTk8sIDMgfSwgLyogbm9taW5hbDogIDgga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgMTAwMDAsIDEyMDAwLCAgMTIwMDAsIDEsICA3LCA0LCAxMSwgOCwgMSwgMCwgNiwgU0JSX01PTk8sIDMgfSwgLyogbm9taW5hbDogMTAga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgMTIwMDAsIDE2MDAwLCAgMTIwMDAsIDEsIDExLCA3LCAxMiwgOCwgMSwgMCwgNiwgU0JSX01PTk8sIDMgfSwgLyogbm9taW5hbDogMTIga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgMTYwMDAsIDIwMDAwLCAgMTIwMDAsIDEsIDExLCA3LCAxMiwgOCwgMSwgMCwgNiwgU0JSX01PTk8sIDMgfSwgLyogbm9taW5hbDogMTYga2JpdC9zICovIC8qIGF0IHN1Y2ggImhpZ2giIGJpdHJhdGVzIGl0J3MgYmV0dGVyIHRvIHVwc2FtcGxlIHRoZSBpbnB1dCAqLwotICB7IENPREVDX0FBQywgIDIwMDAwLCAyNDAwMSwgIDEyMDAwLCAxLCAxMiwgOCwgMTIsIDgsIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDIwIGtiaXQvcyAqLyAvKiBzaWduYWwgYnkgYSBmYWN0b3Igb2YgMiBiZWZvcmUgc2VuZGluZyBpdCBpbnRvIHRoZSBlbmNvZGVyICovCi0gIHsgQ09ERUNfQUFDLCAgMjQwMDAsIDMyMDAwLCAgMTIwMDAsIDEsIDEzLCA5LCAxMywgOSwgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogcGxhY2VibyAqLwotICB7IENPREVDX0FBQywgIDMyMDAwLCA0ODAwMCwgIDEyMDAwLCAxLCAxNCwxMCwgMTQsMTAsIDIsIDAsIDMsIFNCUl9NT05PLCAyIH0sIC8qIHBsYWNlYm8gKi8KLSAgeyBDT0RFQ19BQUMsICA0ODAwMCwgNjQwMDEsICAxMjAwMCwgMSwgMTQsMTEsIDE1LDExLCAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBwbGFjZWJvICovCi0KLSAgLyogMTYvMzIga0h6IGR1YWwgcmF0ZSAqLwotICB7IENPREVDX0FBQywgICA4MDAwLCAxMDAwMCwgIDE2MDAwLCAxLCAgMSwgMSwgMCwgMCwgIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6ICA4IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDEwMDAwLCAxMjAwMCwgIDE2MDAwLCAxLCAgMiwgMSwgNiwgMCwgIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDEwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDEyMDAwLCAxNjAwMCwgIDE2MDAwLCAxLCAgNCwgMiwgNiwgMCwgIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDEyIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDE2MDAwLCAxODAwMCwgIDE2MDAwLCAxLCAgNCwgMiwgOCwgMywgIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDE2IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDE4MDAwLCAyMjAwMCwgIDE2MDAwLCAxLCAgNiwgNSwxMSwgNywgIDIsIDAsIDYsIFNCUl9NT05PLCAyIH0sIC8qIG5vbWluYWw6IDIwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDIyMDAwLCAyODAwMCwgIDE2MDAwLCAxLCAxMCwgOSwxMiwgOCwgIDIsIDAsIDYsIFNCUl9NT05PLCAyIH0sIC8qIG5vbWluYWw6IDI0IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDI4MDAwLCAzNjAwMCwgIDE2MDAwLCAxLCAxMiwxMiwxMywxMywgIDIsIDAsIDMsIFNCUl9NT05PLCAyIH0sIC8qIG5vbWluYWw6IDMyIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDM2MDAwLCA0NDAwMCwgIDE2MDAwLCAxLCAxNCwxNCwxMywxMywgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDQ0MDAwLCA2NDAwMSwgIDE2MDAwLCAxLCAxNCwxNCwxMywxMywgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDQ4IGtiaXQvcyAqLwotCi0gIC8qIDIyLjA1LzQ0LjEga0h6IGR1YWwgcmF0ZSAqLwotICAvKiB7IENPREVDX0FBQywgICA4MDAwLCAxMTM2OSwgIDIyMDUwLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sICovIC8qIG5vbWluYWw6ICA4IGtiaXQvcyAqLyAgIC8qIGVuY29kZXIgY2FuIG5vdCB3b3JrIHN0YWJsZSBhdCB0aGlzIGV4dHJlbWVseSBsb3cgYml0cmF0ZSAqLwotICB7IENPREVDX0FBQywgIDExMzY5LCAxNjAwMCwgIDIyMDUwLCAxLCAgMywgMSwgNCwgNCwgIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDEyIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDE2MDAwLCAxODAwMCwgIDIyMDUwLCAxLCAgMywgMSwgNSwgNCwgIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDE2IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDE4MDAwLCAyMjAwMCwgIDIyMDUwLCAxLCAgNCwgNCwgOCwgNSwgIDIsIDAsIDYsIFNCUl9NT05PLCAyIH0sIC8qIG5vbWluYWw6IDIwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDIyMDAwLCAyODAwMCwgIDIyMDUwLCAxLCAgNywgNiwgOCwgNiwgIDIsIDAsIDYsIFNCUl9NT05PLCAyIH0sIC8qIG5vbWluYWw6IDI0IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDI4MDAwLCAzNjAwMCwgIDIyMDUwLCAxLCAxMCwxMCwgOSwgOSwgIDIsIDAsIDMsIFNCUl9NT05PLCAyIH0sIC8qIG5vbWluYWw6IDMyIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDM2MDAwLCA0NDAwMCwgIDIyMDUwLCAxLCAxMSwxMSwxMCwxMCwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDQ0MDAwLCA2NDAwMSwgIDIyMDUwLCAxLCAxMywxMywxMiwxMiwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDQ4IGtiaXQvcyAqLwotCi0gIC8qIDI0LzQ4IGtIeiBkdWFsIHJhdGUgKi8KLSAgLyogeyBDT0RFQ19BQUMsICAgODAwMCwgMTIwMDAsICAyNDAwMCwgMSwgIDEsIDEsIDEsIDEsICAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LCAqLyAvKiBub21pbmFsOiAgOCBrYml0L3MgKi8gICAvKiBlbmNvZGVyIGNhbiBub3Qgd29yayBzdGFibGUgYXQgdGhpcyBleHRyZW1lbHkgbG93IGJpdHJhdGUgKi8KLSAgeyBDT0RFQ19BQUMsICAxMjAwMCwgMTYwMDAsICAyNDAwMCwgMSwgIDMsIDEsIDQsIDQsICAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LCAvKiBub21pbmFsOiAxMiBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAxNjAwMCwgMTgwMDAsICAyNDAwMCwgMSwgIDMsIDEsIDUsIDQsICAxLCAwLCA2LCBTQlJfTU9OTywgMyB9LCAvKiBub21pbmFsOiAxNiBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAxODAwMCwgMjIwMDAsICAyNDAwMCwgMSwgIDQsIDMsIDgsIDUsICAyLCAwLCA2LCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAyMCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAyMjAwMCwgMjgwMDAsICAyNDAwMCwgMSwgIDcsIDYsIDgsIDYsICAyLCAwLCA2LCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAyNCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAyODAwMCwgMzYwMDAsICAyNDAwMCwgMSwgMTAsMTAsIDksIDksICAyLCAwLCAzLCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAzMiBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAzNjAwMCwgNDQwMDAsICAyNDAwMCwgMSwgMTEsMTEsMTAsMTAsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA0MCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA0NDAwMCwgNjQwMDEsICAyNDAwMCwgMSwgMTMsMTMsMTEsMTEsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA0OCBrYml0L3MgKi8KLQotICAvKiAzMi82NCBrSHogZHVhbCByYXRlICovICAvKiBwbGFjZWJvIHNldHRpbmdzICovCi0gIHsgQ09ERUNfQUFDLCAgIDI0MDAwLCAzNjAwMCwgMzIwMDAsIDEsICA0LCA0LCA0LCA0LCAgMiwgMCwgMywgU0JSX01PTk8sIDMgfSwgLyogbG93ZXN0IHJhbmdlICAqLwotICB7IENPREVDX0FBQywgICAzNjAwMCwgNjAwMDAsIDMyMDAwLCAxLCAgNywgNywgNiwgNiwgIDIsIDAsIDMsIFNCUl9NT05PLCAyIH0sIC8qIGxvd2VzdCByYW5nZSAqLwotICB7IENPREVDX0FBQywgICA2MDAwMCwgNzIwMDAsIDMyMDAwLCAxLCAgOSwgOSwgOCwgOCwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIGxvdyByYW5nZSAqLwotICB7IENPREVDX0FBQywgICA3MjAwMCwxMDAwMDAsIDMyMDAwLCAxLCAxMSwxMSwxMCwxMCwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIFNCUiBzd2VldCBzcG90ICovCi0gIHsgQ09ERUNfQUFDLCAgMTAwMDAwLDE2MDAwMSwgMzIwMDAsIDEsIDEzLDEzLDExLDExLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogYmFja3dhcmRzIGNvbXBhdGlibGUgKi8KLQotICAvKiA0NC4xLzg4LjIga0h6IGR1YWwgcmF0ZSAqLyAgLyogcGxhY2VibyBzZXR0aW5ncyAqLwotICB7IENPREVDX0FBQywgICAyNDAwMCwgMzYwMDAsIDQ0MTAwLCAxLCAgNCwgNCwgNCwgNCwgIDIsIDAsIDMsIFNCUl9NT05PLCAzIH0sIC8qIGxvd2VzdCByYW5nZSAobXVsdGljaGFubmVsIHJlYXIpICovCi0gIHsgQ09ERUNfQUFDLCAgIDM2MDAwLCA2MDAwMCwgNDQxMDAsIDEsICA3LCA3LCA2LCA2LCAgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogbG93ZXN0IHJhbmdlIChtdWx0aWNoYW5uZWwgcmVhcikgKi8KLSAgeyBDT0RFQ19BQUMsICAgNjAwMDAsIDcyMDAwLCA0NDEwMCwgMSwgIDksIDksIDgsIDgsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBsb3cgcmFuZ2UgKi8KLSAgeyBDT0RFQ19BQUMsICAgNzIwMDAsMTAwMDAwLCA0NDEwMCwgMSwgMTEsMTEsMTAsMTAsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBTQlIgc3dlZXQgc3BvdCAqLwotICB7IENPREVDX0FBQywgIDEwMDAwMCwxNjAwMDEsIDQ0MTAwLCAxLCAxMywxMywxMSwxMSwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIGJhY2t3YXJkcyBjb21wYXRpYmxlICovCi0KLSAgLyogNDgvOTYga0h6IGR1YWwgcmF0ZSAqLyAgLyogbm90IHlldCBmaW5hbGx5IHR1bmVkICovCi0gIHsgQ09ERUNfQUFDLCAgIDMyMDAwLCAzNjAwMCwgNDgwMDAsIDEsICA0LCA0LCA5LCA5LCAgMiwgMCwgMywgU0JSX01PTk8sIDMgfSwgLyogbG93ZXN0IHJhbmdlIChtdWx0aWNoYW5uZWwgcmVhcikgKi8KLSAgeyBDT0RFQ19BQUMsICAgMzYwMDAsIDYwMDAwLCA0ODAwMCwgMSwgIDcsIDcsMTAsMTAsICAyLCAwLCAzLCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiA0MCAqLwotICB7IENPREVDX0FBQywgICA2MDAwMCwgNzIwMDAsIDQ4MDAwLCAxLCAgOSwgOSwxMCwxMCwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDY0ICovCi0gIHsgQ09ERUNfQUFDLCAgIDcyMDAwLDEwMDAwMCwgNDgwMDAsIDEsIDExLDExLDExLDExLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbm9taW5hbDogODAgKi8KLSAgeyBDT0RFQ19BQUMsICAxMDAwMDAsMTYwMDAxLCA0ODAwMCwgMSwgMTMsMTMsMTEsMTEsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiAxMjggKi8KLQotICAvKioqIHN0ZXJlbyAqKiovCi0gIC8qIDA4LzE2IGtIeiBkdWFsIHJhdGUgKi8KLSAgeyBDT0RFQ19BQUMsICAxNjAwMCwgMjQwMDAsICAgODAwMCwgMiwgIDYsIDYsICA5LCA3LCAxLCAwLC0zLCBTQlJfU1dJVENIX0xSQywgMyB9LCAvKiBub21pbmFsOiAyMCBrYml0L3MgKi8gLyogcGxhY2VibyAqLwotICB7IENPREVDX0FBQywgIDI0MDAwLCAyODAwMCwgICA4MDAwLCAyLCAgOSwgOSwgMTEsIDksIDEsIDAsLTMsIFNCUl9TV0lUQ0hfTFJDLCAzIH0sIC8qIG5vbWluYWw6IDI0IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDI4MDAwLCAzNjAwMCwgICA4MDAwLCAyLCAxMSwgOSwgMTEsIDksIDIsIDAsLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDMyIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDM2MDAwLCA0NDAwMCwgICA4MDAwLCAyLCAxMywxMSwgMTMsMTEsIDIsIDAsLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDQ0MDAwLCA1MjAwMCwgICA4MDAwLCAyLCAxNCwxMiwgMTMsMTIsIDIsIDAsLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDQ4IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDUyMDAwLCA2MDAwMCwgICA4MDAwLCAyLCAxNCwxNCwgMTMsMTMsIDMsIDAsLTMsIFNCUl9TV0lUQ0hfTFJDLCAxIH0sIC8qIG5vbWluYWw6IDU2IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDYwMDAwLCA3NjAwMCwgICA4MDAwLCAyLCAxNCwxNCwgMTMsMTMsIDMsIDAsLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDY0IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDc2MDAwLDEyODAwMSwgICA4MDAwLCAyLCAxNCwxNCwgMTMsMTMsIDMsIDAsLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDgwIGtiaXQvcyAqLwotCi0gIC8qIDExLzIyIGtIeiBkdWFsIHJhdGUgKi8KLSAgeyBDT0RFQ19BQUMsICAxNjAwMCwgMjQwMDAsICAxMTAyNSwgMiwgIDcsIDUsIDksIDcsICAxLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDMgfSwgLyogbm9taW5hbDogMjAga2JpdC9zICovIC8qIHBsYWNlYm8gKi8KLSAgeyBDT0RFQ19BQUMsICAyNDAwMCwgMjgwMDAsICAxMTAyNSwgMiwgMTAsIDgsMTAsIDgsICAxLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDMgfSwgLyogbm9taW5hbDogMjQga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgMjgwMDAsIDM2MDAwLCAgMTEwMjUsIDIsIDEyLCA4LDEyLCA4LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDMyIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDM2MDAwLCA0NDAwMCwgIDExMDI1LCAyLCAxMywgOSwxMywgOSwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0MCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA0NDAwMCwgNTIwMDAsICAxMTAyNSwgMiwgMTQsMTEsMTMsMTEsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogNDgga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgNTIwMDAsIDYwMDAwLCAgMTEwMjUsIDIsIDE1LDE1LDEzLDEzLCAgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAxIH0sIC8qIG5vbWluYWw6IDU2IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDYwMDAwLCA3NjAwMCwgIDExMDI1LCAyLCAxNSwxNSwxMywxMywgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA2NCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA3NjAwMCwxMjgwMDEsICAxMTAyNSwgMiwgMTUsMTUsMTMsMTMsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogODAga2JpdC9zICovCi0KLSAgLyogMTIvMjQga0h6IGR1YWwgcmF0ZSAqLwotICB7IENPREVDX0FBQywgIDE2MDAwLCAyNDAwMCwgIDEyMDAwLCAyLCAgNiwgNCwgOSwgNywgIDEsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMyB9LCAvKiBub21pbmFsOiAyMCBrYml0L3MgKi8gLyogcGxhY2VibyAqLwotICB7IENPREVDX0FBQywgIDI0MDAwLCAyODAwMCwgIDEyMDAwLCAyLCAgOSwgNywxMCwgOCwgIDEsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMyB9LCAvKiBub21pbmFsOiAyNCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAyODAwMCwgMzYwMDAsICAxMjAwMCwgMiwgMTEsIDcsMTIsIDgsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogMzIga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgMzYwMDAsIDQ0MDAwLCAgMTIwMDAsIDIsIDEyLCA5LDEyLCA5LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDQ0MDAwLCA1MjAwMCwgIDEyMDAwLCAyLCAxMywxMiwxMywxMiwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0OCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA1MjAwMCwgNjAwMDAsICAxMjAwMCwgMiwgMTQsMTQsMTMsMTMsICAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDEgfSwgLyogbm9taW5hbDogNTYga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgNjAwMDAsIDc2MDAwLCAgMTIwMDAsIDIsIDE0LDE0LDEzLDEzLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDY0IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDc2MDAwLDEyODAwMSwgIDEyMDAwLCAyLCAxNCwxNCwxMywxMywgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA4MCBrYml0L3MgKi8KLQotICAvKiAxNi8zMiBrSHogZHVhbCByYXRlICovCi0gIHsgQ09ERUNfQUFDLCAgMTYwMDAsIDI0MDAwLCAgMTYwMDAsIDIsICA0LCAyLCAxLCAwLCAgMSwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAzIH0sIC8qIG5vbWluYWw6IDIwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDI0MDAwLCAyODAwMCwgIDE2MDAwLCAyLCAgOCwgNywxMCwgOCwgIDEsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMyB9LCAvKiBub21pbmFsOiAyNCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAyODAwMCwgMzYwMDAsICAxNjAwMCwgMiwgMTAsIDksMTIsMTEsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogMzIga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgMzYwMDAsIDQ0MDAwLCAgMTYwMDAsIDIsIDEzLDEzLDEzLDEzLCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDQ0MDAwLCA1MjAwMCwgIDE2MDAwLCAyLCAxNCwxNCwxMywxMywgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0OCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA1MjAwMCwgNjAwMDAsICAxNjAwMCwgMiwgMTQsMTQsMTMsMTMsICAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDEgfSwgLyogbm9taW5hbDogNTYga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgNjAwMDAsIDc2MDAwLCAgMTYwMDAsIDIsIDE0LDE0LDEzLDEzLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDY0IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDc2MDAwLDEyODAwMSwgIDE2MDAwLCAyLCAxNCwxNCwxMywxMywgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA4MCBrYml0L3MgKi8KLQotICAvKiAyMi4wNS80NC4xIGtIeiBkdWFsIHJhdGUgKi8KLSAgeyBDT0RFQ19BQUMsICAxNjAwMCwgMjQwMDAsICAyMjA1MCwgMiwgIDIsIDEsIDEsIDAsICAxLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDMgfSwgLyogbm9taW5hbDogMjAga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgMjQwMDAsIDI4MDAwLCAgMjIwNTAsIDIsICA1LCA0LCA2LCA1LCAgMSwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAzIH0sIC8qIG5vbWluYWw6IDI0IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDI4MDAwLCAzMjAwMCwgIDIyMDUwLCAyLCAgNSwgNCwgOCwgNywgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiAyOCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAzMjAwMCwgMzYwMDAsICAyMjA1MCwgMiwgIDcsIDYsIDgsIDcsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogMzIga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgMzYwMDAsIDQ0MDAwLCAgMjIwNTAsIDIsIDEwLDEwLCA5LCA5LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDQ0MDAwLCA1MjAwMCwgIDIyMDUwLCAyLCAxMiwxMiwgOSwgOSwgIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0OCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA1MjAwMCwgNjAwMDAsICAyMjA1MCwgMiwgMTMsMTMsMTAsMTAsICAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDEgfSwgLyogbm9taW5hbDogNTYga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgNjAwMDAsIDc2MDAwLCAgMjIwNTAsIDIsIDE0LDE0LDEyLDEyLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDY0IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDc2MDAwLDEyODAwMSwgIDIyMDUwLCAyLCAxNCwxNCwxMiwxMiwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA4MCBrYml0L3MgKi8KLQotICAvKiAyNC80OCBrSHogZHVhbCByYXRlICovCi0gIHsgQ09ERUNfQUFDLCAgMTYwMDAsIDI0MDAwLCAgMjQwMDAsIDIsICAyLCAxLCAxLCAwLCAgMSwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAzIH0sIC8qIG5vbWluYWw6IDIwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDI0MDAwLCAyODAwMCwgIDI0MDAwLCAyLCAgNSwgNSwgNiwgNiwgIDEsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMyB9LCAvKiBub21pbmFsOiAyNCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICAyODAwMCwgMzYwMDAsICAyNDAwMCwgMiwgIDcsIDYsIDgsIDcsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogMzIga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgMzYwMDAsIDQ0MDAwLCAgMjQwMDAsIDIsIDEwLDEwLCA5LCA5LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDQ0MDAwLCA1MjAwMCwgIDI0MDAwLCAyLCAxMiwxMiwgOSwgOSwgIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0OCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUMsICA1MjAwMCwgNjAwMDAsICAyNDAwMCwgMiwgMTMsMTMsMTAsMTAsICAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDEgfSwgLyogbm9taW5hbDogNTYga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDLCAgNjAwMDAsIDc2MDAwLCAgMjQwMDAsIDIsIDE0LDE0LDEyLDEyLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDY0IGtiaXQvcyAqLwotICB7IENPREVDX0FBQywgIDc2MDAwLDEyODAwMSwgIDI0MDAwLCAyLCAxNCwxNCwxMiwxMiwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA4MCBrYml0L3MgKi8KLQotICAvKiAzMi82NCBrSHogZHVhbCByYXRlICovICAvKiBwbGFjZWJvIHNldHRpbmdzICovCi0gIHsgQ09ERUNfQUFDLCAgIDMyMDAwLCA2MDAwMCwgMzIwMDAsIDIsICA0LCA0LCA0LCA0LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAzIH0sIC8qIGxvd2VzdCByYW5nZSAobXVsdGljaGFubmVsIHJlYXIpICovCi0gIHsgQ09ERUNfQUFDLCAgIDYwMDAwLCA4MDAwMCwgMzIwMDAsIDIsICA3LCA3LCA2LCA2LCAgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIGxvd2VzdCByYW5nZSAobXVsdGljaGFubmVsIHJlYXIpICovCi0gIHsgQ09ERUNfQUFDLCAgIDgwMDAwLDExMjAwMCwgMzIwMDAsIDIsICA5LCA5LCA4LCA4LCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIGxvdyByYW5nZSAqLwotICB7IENPREVDX0FBQywgIDExMjAwMCwxNDQwMDAsIDMyMDAwLCAyLCAxMSwxMSwxMCwxMCwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBTQlIgc3dlZXQgc3BvdCAqLwotICB7IENPREVDX0FBQywgIDE0NDAwMCwyNTYwMDEsIDMyMDAwLCAyLCAxMywxMywxMSwxMSwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBiYWNrd2FyZHMgY29tcGF0aWJsZSAqLwotCi0gIC8qIDQ0LjEvODguMiBrSHogZHVhbCByYXRlICovICAvKiBwbGFjZWJvIHNldHRpbmdzICovCi0gIHsgQ09ERUNfQUFDLCAgIDMyMDAwLCA2MDAwMCwgNDQxMDAsIDIsICA0LCA0LCA0LCA0LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAzIH0sIC8qIGxvd2VzdCByYW5nZSAobXVsdGljaGFubmVsIHJlYXIpICovCi0gIHsgQ09ERUNfQUFDLCAgIDYwMDAwLCA4MDAwMCwgNDQxMDAsIDIsICA3LCA3LCA2LCA2LCAgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIGxvd2VzdCByYW5nZSAobXVsdGljaGFubmVsIHJlYXIpICovCi0gIHsgQ09ERUNfQUFDLCAgIDgwMDAwLDExMjAwMCwgNDQxMDAsIDIsICA5LCA5LCA4LCA4LCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIGxvdyByYW5nZSAqLwotICB7IENPREVDX0FBQywgIDExMjAwMCwxNDQwMDAsIDQ0MTAwLCAyLCAxMSwxMSwxMCwxMCwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBTQlIgc3dlZXQgc3BvdCAqLwotICB7IENPREVDX0FBQywgIDE0NDAwMCwyNTYwMDEsIDQ0MTAwLCAyLCAxMywxMywxMSwxMSwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBiYWNrd2FyZHMgY29tcGF0aWJsZSAqLwotCi0gIC8qIDQ4Lzk2IGtIeiBkdWFsIHJhdGUgKi8gIC8qIG5vdCB5ZXQgZmluYWxseSB0dW5lZCAqLwotICB7IENPREVDX0FBQywgICAzNjAwMCwgNjAwMDAsIDQ4MDAwLCAyLCAgNCwgNCwgOSwgOSwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMyB9LCAvKiBsb3dlc3QgcmFuZ2UgKG11bHRpY2hhbm5lbCByZWFyKSAqLwotICB7IENPREVDX0FBQywgICA2MDAwMCwgODAwMDAsIDQ4MDAwLCAyLCAgNywgNywgOSwgOSwgIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA2NCAqLwotICB7IENPREVDX0FBQywgICA4MDAwMCwxMTIwMDAsIDQ4MDAwLCAyLCAgOSwgOSwxMCwxMCwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiA5NiAqLwotICB7IENPREVDX0FBQywgIDExMjAwMCwxNDQwMDAsIDQ4MDAwLCAyLCAxMSwxMSwxMSwxMSwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBub21pbmFsOiAxMjggKi8KLSAgeyBDT0RFQ19BQUMsICAxNDQwMDAsMjU2MDAxLCA0ODAwMCwgMiwgMTMsMTMsMTEsMTEsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogMTkyICovCi0KLQotICAvKiogQUFDIExPVyBERUxBWSBTRUNUSU9OICoqLwotCi0gIC8qIDI0IGtIeiBkdWFsIHJhdGUgLSAxMmtIeiBzaW5nbGVyYXRlIGlzIG5vdCBhbGxvd2VkIChkZWFjdGl2YXRlZCBpbiBGREtzYnJFbmNfSXNTYnJTZXR0aW5nQXZhaWwoKSkgKi8KLSAgeyBDT0RFQ19BQUNMRCwgICA4MDAwLCAzMjAwMCwgIDEyMDAwLCAxLCAgMSwgMSwgMCwgMCwgIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6ICA4IGtiaXQvcyAqLwotCi0gIC8qKiogbW9ubyAqKiovCi0gIC8qIDE2LzMyIGtIeiBkdWFsIHJhdGUgbm90IHlldCB0dW5lZCAtPmFsYiBjb3BpZWQgZnJvbSBub24gTEQgdGFibGVzKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDE2MDAwLCAxODAwMCwgIDE2MDAwLCAxLCAgNCwgNSwgOSwgNywgIDEsIDAsIDYsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDE2IGtiaXQvcyB3cnI6IHR1bmVkICovCi0gIHsgQ09ERUNfQUFDTEQsICAxODAwMCwgMjIwMDAsICAxNjAwMCwgMSwgIDcsIDcsMTIsMTIsICAxLCA2LCA5LCBTQlJfTU9OTywgMyB9LCAvKiBub21pbmFsOiAyMCBrYml0L3Mgd3JyOiB0dW5lZCAqLwotICB7IENPREVDX0FBQ0xELCAgMjIwMDAsIDI4MDAwLCAgMTYwMDAsIDEsICA2LCA2LCA5LCA5LCAgMiwgMywgNiwgU0JSX01PTk8sIDMgfSwgLyogbm9taW5hbDogMjQga2JpdC9zIHdycjogdHVuZWQgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDI4MDAwLCAzNjAwMCwgIDE2MDAwLCAxLCAgOCwgOCwxMiwgNywgIDIsIDksMTIsIFNCUl9NT05PLCAzIH0sIC8qIGpncjogc3BlY2lhbCAqLyAvKiB3cnI6IHR1bmVkICovCi0gIHsgQ09ERUNfQUFDTEQsICAzNjAwMCwgNDQwMDAsICAxNjAwMCwgMSwgMTAsMTQsMTIsMTMsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA0MCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDQ0MDAwLCA2NDAwMSwgIDE2MDAwLCAxLCAxMSwxNCwxMywxMywgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDQ4IGtiaXQvcyAqLwotCi0gIC8qIDIyLjA1LzQ0LjEga0h6IGR1YWwgcmF0ZSAqLwotICB7IENPREVDX0FBQ0xELCAgMTgwMDAsIDIyMDAwLCAgMjIwNTAsIDEsICA0LCA0LCA1LCA1LCAgMiwgMCwgNiwgU0JSX01PTk8sIDMgfSwgLyogbm9taW5hbDogMjAga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDTEQsICAyMjAwMCwgMjgwMDAsICAyMjA1MCwgMSwgIDUsIDUsIDYsIDYsICAyLCAwLCA2LCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAyNCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDI4MDAwLCAzNjAwMCwgIDIyMDUwLCAxLCAgNywgOCwgOCwgOCwgIDIsIDAsIDMsIFNCUl9NT05PLCAyIH0sIC8qIG5vbWluYWw6IDMyIGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgMzYwMDAsIDQ0MDAwLCAgMjIwNTAsIDEsICA5LCA5LCA5LCA5LCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbm9taW5hbDogNDAga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDTEQsICA0NDAwMCwgNTIwMDAsICAyMjA1MCwgMSwgMTIsMTEsMTEsMTEsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA0OCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDUyMDAwLCA2NDAwMSwgIDIyMDUwLCAxLCAxMywxMSwxMSwxMCwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDU2IGtiaXQvcyAqLwotCi0gIC8qIDI0LzQ4IGtIeiBkdWFsIHJhdGUgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDIwMDAwLCAyMjAwMCwgIDI0MDAwLCAxLCAgMywgNCwgOCwgOCwgIDIsIDAsIDYsIFNCUl9NT05PLCAyIH0sIC8qIG5vbWluYWw6IDIwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgMjIwMDAsIDI4MDAwLCAgMjQwMDAsIDEsICAzLCA4LCA4LCA3LCAgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogbm9taW5hbDogMjQga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDTEQsICAyODAwMCwgMzYwMDAsICAyNDAwMCwgMSwgIDQsIDgsIDgsIDcsICAyLCAwLCAzLCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAzMiBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDM2MDAwLCA1NjAwMCwgIDI0MDAwLCAxLCAgOCwgOSwgOSwgOCwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgNTYwMDAsIDY0MDAxLCAgMjQwMDAsIDEsIDEzLDExLDExLDEwLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbm9taW5hbDogNjQga2JpdC9zICovCi0KLSAgLyogMzIvNjQga0h6IGR1YWwgcmF0ZSAqLyAgLyogcGxhY2VibyBzZXR0aW5ncyAqLyAgLypqZ3I6IG5ldywgY29weSBmcm9tIENPREVDX0FBQyAqLwotICB7IENPREVDX0FBQ0xELCAgMjQwMDAsIDM2MDAwLCAgMzIwMDAsIDEsICA0LCA0LCA0LCA0LCAgMiwgMCwgMywgU0JSX01PTk8sIDMgfSwgLyogbG93ZXN0IHJhbmdlICAqLwotICB7IENPREVDX0FBQ0xELCAgMzYwMDAsIDYwMDAwLCAgMzIwMDAsIDEsICA3LCA3LCA2LCA2LCAgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogbG93ZXN0IHJhbmdlICovCi0gIHsgQ09ERUNfQUFDTEQsICA2MDAwMCwgNzIwMDAsICAzMjAwMCwgMSwgIDksIDksIDgsIDgsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBsb3cgcmFuZ2UgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDcyMDAwLDEwMDAwMCwgIDMyMDAwLCAxLCAxMSwxMSwxMCwxMCwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIFNCUiBzd2VldCBzcG90ICovCi0gIHsgQ09ERUNfQUFDTEQsIDEwMDAwMCwxNjAwMDEsICAzMjAwMCwgMSwgMTMsMTMsMTEsMTEsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBiYWNrd2FyZHMgY29tcGF0aWJsZSAqLwotCi0gIC8qIDQ0Lzg4IGtIeiBkdWFsIHJhdGUgKi8gIC8qIG5vdCB5ZXQgZmluYWxseSB0dW5lZCAqLwotICB7IENPREVDX0FBQ0xELCAgMzYwMDAsIDYwMDAwLCAgNDQxMDAsIDEsICA4LCA3LCA2LCA5LCAgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogbm9taW5hbDogNDAgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDYwMDAwLCA3MjAwMCwgIDQ0MTAwLCAxLCAgOSwgOSwxMCwxMCwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDY0ICovCi0gIHsgQ09ERUNfQUFDTEQsICA3MjAwMCwxMDAwMDAsICA0NDEwMCwgMSwgMTEsMTEsMTEsMTEsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA4MCAqLwotICB7IENPREVDX0FBQ0xELCAxMDAwMDAsMTYwMDAxLCAgNDQxMDAsIDEsIDEzLDEzLDExLDExLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbm9taW5hbDogMTI4ICovCi0KLSAgLyogNDgvOTYga0h6IGR1YWwgcmF0ZSAqLyAgLyogMzIgYW5kIDQwa2JwcyBsaW5lIHR1bmVkIGZvciBkdWFsLXJhdGUgU0JSICovCi0gIHsgQ09ERUNfQUFDTEQsICAzNjAwMCwgNjAwMDAsICA0ODAwMCwgMSwgIDQsIDcsIDQsIDQsICAyLCAwLCAzLCBTQlJfTU9OTywgMyB9LCAvKiBub21pbmFsOiA0MCAqLwotICB7IENPREVDX0FBQ0xELCAgNjAwMDAsIDcyMDAwLCAgNDgwMDAsIDEsICA5LCA5LDEwLDEwLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbm9taW5hbDogNjQgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDcyMDAwLDEwMDAwMCwgIDQ4MDAwLCAxLCAxMSwxMSwxMSwxMSwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDgwICovCi0gIHsgQ09ERUNfQUFDTEQsIDEwMDAwMCwxNjAwMDEsICA0ODAwMCwgMSwgMTMsMTMsMTEsMTEsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiAxMjggKi8KLQotICAvKioqIHN0ZXJlbyAqKiovCi0gIC8qIDE2LzMyIGtIeiBkdWFsIHJhdGUgbm90IHlldCB0dW5lZCAtPmFsYiBjb3BpZWQgZnJvbSBub24gTEQgdGFibGVzKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDMyMDAwLCAzNjAwMCwgIDE2MDAwLCAyLCAxMCwgOSwxMiwxMSwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiAzMiBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDM2MDAwLCA0NDAwMCwgIDE2MDAwLCAyLCAxMywxMywxMywxMywgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA0MCBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDQ0MDAwLCA1MjAwMCwgIDE2MDAwLCAyLCAxMCwgOSwxMSwgOSwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiB0dW5lMTIgbm9taW5hbDogNDgga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDTEQsICA1MjAwMCwgNjAwMDAsICAxNjAwMCwgMiwgMTQsMTQsMTMsMTMsICAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDEgfSwgLyogbm9taW5hbDogNTYga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDTEQsICA2MDAwMCwgNzYwMDAsICAxNjAwMCwgMiwgMTQsMTQsMTMsMTMsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogNjQga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDTEQsICA3NjAwMCwxMjgwMDEsICAxNjAwMCwgMiwgMTQsMTQsMTMsMTMsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogODAga2JpdC9zICovCi0KLSAgLyogMjIuMDUvNDQuMSBrSHogZHVhbCByYXRlICovCi0gIHsgQ09ERUNfQUFDTEQsICAzMjAwMCwgMzYwMDAsICAyMjA1MCwgMiwgIDUsIDQsIDcsIDYsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogMzIga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDTEQsICAzNjAwMCwgNDQwMDAsICAyMjA1MCwgMiwgIDUsIDgsIDgsIDgsICAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogNDAga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDTEQsICA0NDAwMCwgNTIwMDAsICAyMjA1MCwgMiwgIDcsMTAsIDgsIDgsICAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDIgfSwgLyogbm9taW5hbDogNDgga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDTEQsICA1MjAwMCwgNjAwMDAsICAyMjA1MCwgMiwgIDksMTEsIDksIDksICAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsIDEgfSwgLyogbm9taW5hbDogNTYga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDTEQsICA2MDAwMCwgNzYwMDAsICAyMjA1MCwgMiwgMTAsMTIsMTAsMTEsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogNjQga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDTEQsICA3NjAwMCwgODIwMDAsICAyMjA1MCwgMiwgMTIsMTIsMTEsMTEsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogODAga2JpdC9zICovCi0gIHsgQ09ERUNfQUFDTEQsICA4MjAwMCwxMjgwMDEsICAyMjA1MCwgMiwgMTMsMTIsMTEsMTEsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogODAga2JpdC9zICovCi0KLSAgLyogMjQvNDgga0h6IGR1YWwgcmF0ZSAqLwotICB7IENPREVDX0FBQ0xELCAgMzIwMDAsIDM2MDAwLCAgMjQwMDAsIDIsICA1LCA0LCA3LCA2LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDMyIGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgMzYwMDAsIDQ0MDAwLCAgMjQwMDAsIDIsICA0LCA4LCA4LCA4LCAgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgNDQwMDAsIDUyMDAwLCAgMjQwMDAsIDIsICA2LDEwLCA4LCA4LCAgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIG5vbWluYWw6IDQ4IGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgNTIwMDAsIDYwMDAwLCAgMjQwMDAsIDIsICA5LDExLCA5LCA5LCAgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAxIH0sIC8qIG5vbWluYWw6IDU2IGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgNjAwMDAsIDc2MDAwLCAgMjQwMDAsIDIsIDExLDEyLDEwLDExLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDY0IGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgNzYwMDAsIDg4MDAwLCAgMjQwMDAsIDIsIDEyLDEzLDExLDExLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDgwIGtiaXQvcyAqLwotICB7IENPREVDX0FBQ0xELCAgODgwMDAsMTI4MDAxLCAgMjQwMDAsIDIsIDEzLDEzLDExLDExLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDkyIGtiaXQvcyAqLwotCi0gIC8qIDMyLzY0IGtIeiBkdWFsIHJhdGUgKi8gIC8qIHBsYWNlYm8gc2V0dGluZ3MgKi8gLypqZ3I6IG5ldywgY29weSBmcm9tIENPREVDX0FBQyAqLwotICB7IENPREVDX0FBQ0xELCAgNjAwMDAsIDgwMDAwLCAgMzIwMDAsIDIsICA3LCA3LCA2LCA2LCAgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAyIH0sIC8qIGxvd2VzdCByYW5nZSAobXVsdGljaGFubmVsIHJlYXIpICovCi0gIHsgQ09ERUNfQUFDTEQsICA4MDAwMCwxMTIwMDAsICAzMjAwMCwgMiwgIDksIDksIDgsIDgsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbG93IHJhbmdlICovCi0gIHsgQ09ERUNfQUFDTEQsIDExMjAwMCwxNDQwMDAsICAzMjAwMCwgMiwgMTEsMTEsMTAsMTAsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogU0JSIHN3ZWV0IHNwb3QgKi8KLSAgeyBDT0RFQ19BQUNMRCwgMTQ0MDAwLDI1NjAwMSwgIDMyMDAwLCAyLCAxMywxMywxMSwxMSwgIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwgMSB9LCAvKiBiYWNrd2FyZHMgY29tcGF0aWJsZSAqLwotCi0gIC8qIDQ0LjEvODguMiBrSHogZHVhbCByYXRlICovICAvKiBwbGFjZWJvIHNldHRpbmdzICovIC8qd3JyOiBuZXcsIGNvcHkgZnJvbSBDT0RFQ19BQUMgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDYwMDAwLCA4MDAwMCwgIDQ0MTAwLCAyLCAgNywgNywgNiwgNiwgIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBsb3dlc3QgcmFuZ2UgKG11bHRpY2hhbm5lbCByZWFyKSAqLwotICB7IENPREVDX0FBQ0xELCAgODAwMDAsMTEyMDAwLCAgNDQxMDAsIDIsIDEwLDEwLCA4LCA4LCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIGhsbSAxMS0wOC0yOSAqLwotICB7IENPREVDX0FBQ0xELCAxMTIwMDAsMTQ0MDAwLCAgNDQxMDAsIDIsIDEyLDEyLDEwLDEwLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIGhsbSAxMS0wOC0yOSAqLwotICB7IENPREVDX0FBQ0xELCAxNDQwMDAsMjU2MDAxLCAgNDQxMDAsIDIsIDEzLDEzLDExLDExLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIGJhY2t3YXJkcyBjb21wYXRpYmxlICovCi0KLSAgLyogNDgvOTYga0h6IGR1YWwgcmF0ZSAqLyAgLyogbm90IHlldCBmaW5hbGx5IHR1bmVkICovIC8qd3JyOiBuZXcsIGNvcHkgZnJvbSBDT0RFQ19BQUMgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDYwMDAwLCA4MDAwMCwgIDQ4MDAwLCAyLCAgNywgNywxMCwxMCwgIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywgMiB9LCAvKiBub21pbmFsOiA2NCAqLwotICB7IENPREVDX0FBQ0xELCAgODAwMDAsMTEyMDAwLCAgNDgwMDAsIDIsICA5LCA5LDEwLDEwLCAgMywgMCwgLTMsIFNCUl9MRUZUX1JJR0hULCAxIH0sIC8qIG5vbWluYWw6IDk2ICovCi0gIHsgQ09ERUNfQUFDTEQsIDExMjAwMCwxNDQwMDAsICA0ODAwMCwgMiwgMTEsMTEsMTEsMTEsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogbm9taW5hbDogMTI4ICovCi0gIHsgQ09ERUNfQUFDTEQsIDE0NDAwMCwxNzYwMDAsICA0ODAwMCwgMiwgMTIsMTIsMTEsMTEsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogaGxtIDA5LTEwLTE5ICovCi0gIHsgQ09ERUNfQUFDTEQsIDE3NjAwMCwyNTYwMDEsICA0ODAwMCwgMiwgMTMsMTMsMTEsMTEsICAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsIDEgfSwgLyogaGxtIDA5LTEwLTE5ICovCi0KLX07Ci0KLWNvbnN0IGludCBzYnJUdW5pbmdUYWJsZVNpemUgPSBzaXplb2Yoc2JyVHVuaW5nVGFibGUpL3NpemVvZihzYnJUdW5pbmdUYWJsZVswXSk7Ci0KLWNvbnN0IHBzVHVuaW5nVGFibGVfdCBwc1R1bmluZ1RhYmxlWzRdID0KLXsKLSAgeyAgODAwMCwgIDIyMDAwLCBQU0VOQ19TVEVSRU9fQkFORFNfMTAsIFBTRU5DX05FTlZfMSwgRkwyRlhDT05TVF9EQkwoMy4wZi80LjBmKSB9LAotICB7IDIyMDAwLCAgMjgwMDAsIFBTRU5DX1NURVJFT19CQU5EU18yMCwgUFNFTkNfTkVOVl8xLCBGTDJGWENPTlNUX0RCTCgyLjBmLzQuMGYpIH0sCi0gIHsgMjgwMDAsICAzNjAwMCwgUFNFTkNfU1RFUkVPX0JBTkRTXzIwLCBQU0VOQ19ORU5WXzIsIEZMMkZYQ09OU1RfREJMKDEuNWYvNC4wZikgfSwKLSAgeyAzNjAwMCwgMTYwMDAxLCBQU0VOQ19TVEVSRU9fQkFORFNfMjAsIFBTRU5DX05FTlZfNCwgRkwyRlhDT05TVF9EQkwoMS4xZi80LjBmKSB9LAotfTsKLQotCi0vL0B9Ci0KLQotCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3Nicl9yb20uaCBiL2xpYlNCUmVuYy9zcmMvc2JyX3JvbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE5MjRlLi4wMDAwMDAwCi0tLSBhL2xpYlNCUmVuYy9zcmMvc2JyX3JvbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiEKLVxmaWxlCi1cYnJpZWYgRGVjbGFyYXRpb24gb2YgY29uc3RhbnQgdGFibGVzCi0gCi0qLwotI2lmbmRlZiBfX1NCUl9ST01fSAotI2RlZmluZSBfX1NCUl9ST01fSAotCi0jaW5jbHVkZSAic2JyX2RlZi5oIgotI2luY2x1ZGUgInNicl9lbmNvZGVyLmgiCi0KLSNpbmNsdWRlICJwc19tYWluLmgiCi0KLS8qCi0gIGh1ZmZtYW4gdGFibGVzCi0qLwotZXh0ZXJuIGNvbnN0IElOVCAgICAgICAgICAgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTBUWzEyMV07Ci1leHRlcm4gY29uc3QgVUNIQVIgICAgICAgICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMFRbMTIxXTsKLWV4dGVybiBjb25zdCBJTlQgICAgICAgICAgIHZfSHVmZl9lbnZlbG9wZUxldmVsQzEwRlsxMjFdOwotZXh0ZXJuIGNvbnN0IFVDSEFSICAgICAgICAgdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTBGWzEyMV07Ci1leHRlcm4gY29uc3QgSU5UICAgICAgICAgICBib29rU2JyRW52QmFsYW5jZUMxMFRbNDldOwotZXh0ZXJuIGNvbnN0IFVDSEFSICAgICAgICAgYm9va1NickVudkJhbGFuY2VMMTBUWzQ5XTsKLWV4dGVybiBjb25zdCBJTlQgICAgICAgICAgIGJvb2tTYnJFbnZCYWxhbmNlQzEwRls0OV07Ci1leHRlcm4gY29uc3QgVUNIQVIgICAgICAgICBib29rU2JyRW52QmFsYW5jZUwxMEZbNDldOwotZXh0ZXJuIGNvbnN0IElOVCAgICAgICAgICAgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFUWzYzXTsKLWV4dGVybiBjb25zdCBVQ0hBUiAgICAgICAgIHZfSHVmZl9lbnZlbG9wZUxldmVsTDExVFs2M107Ci1leHRlcm4gY29uc3QgSU5UICAgICAgICAgICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMUZbNjNdOwotZXh0ZXJuIGNvbnN0IFVDSEFSICAgICAgICAgdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFGWzYzXTsKLWV4dGVybiBjb25zdCBJTlQgICAgICAgICAgIGJvb2tTYnJFbnZCYWxhbmNlQzExVFsyNV07Ci1leHRlcm4gY29uc3QgVUNIQVIgICAgICAgICBib29rU2JyRW52QmFsYW5jZUwxMVRbMjVdOwotZXh0ZXJuIGNvbnN0IElOVCAgICAgICAgICAgYm9va1NickVudkJhbGFuY2VDMTFGWzI1XTsKLWV4dGVybiBjb25zdCBVQ0hBUiAgICAgICAgIGJvb2tTYnJFbnZCYWxhbmNlTDExRlsyNV07Ci1leHRlcm4gY29uc3QgSU5UICAgICAgICAgICB2X0h1ZmZfTm9pc2VMZXZlbEMxMVRbNjNdOwotZXh0ZXJuIGNvbnN0IFVDSEFSICAgICAgICAgdl9IdWZmX05vaXNlTGV2ZWxMMTFUWzYzXTsKLWV4dGVybiBjb25zdCBJTlQgICAgICAgICAgIGJvb2tTYnJOb2lzZUJhbGFuY2VDMTFUWzI1XTsKLWV4dGVybiBjb25zdCBVQ0hBUiAgICAgICAgIGJvb2tTYnJOb2lzZUJhbGFuY2VMMTFUWzI1XTsKLQotZXh0ZXJuIGNvbnN0IHNiclR1bmluZ1RhYmxlX3Qgc2JyVHVuaW5nVGFibGVbXTsKLWV4dGVybiBjb25zdCBpbnQgc2JyVHVuaW5nVGFibGVTaXplOwotCi1leHRlcm4gY29uc3QgcHNUdW5pbmdUYWJsZV90IHBzVHVuaW5nVGFibGVbNF07Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3NicmVuY19mcmVxX3NjYS5jcHAgYi9saWJTQlJlbmMvc3JjL3NicmVuY19mcmVxX3NjYS5jcHAKaW5kZXggMzBiYzVjYS4uYzg2ZTA0NyAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9zYnJlbmNfZnJlcV9zY2EuY3BwCisrKyBiL2xpYlNCUmVuYy9zcmMvc2JyZW5jX2ZyZXFfc2NhLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxMiArOTAsMTkgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBmcmVxdWVuY3kgc2NhbGUgIAotICBcYXV0aG9yIFRvYmlhcyBDaGFsdXBrYQorICBcYnJpZWYgIGZyZXF1ZW5jeSBzY2FsZSAkUmV2aXNpb246IDk1MjI1ICQKICovCiAKICNpbmNsdWRlICJzYnJlbmNfZnJlcV9zY2EuaCIKQEAgLTk4LDEyICsxMTYsMTAgQEAKIC8qIFN0b3BGcmVxICovCiBzdGF0aWMgSU5UIGdldFN0b3BGcmVxKElOVCBmc0NvcmUsIGNvbnN0IElOVCBzdG9wX2ZyZXEpOwogCi1zdGF0aWMgSU5UICBudW1iZXJPZkJhbmRzKElOVCBiX3BfbywgSU5UIHN0YXJ0LCBJTlQgc3RvcCwgRklYUF9EQkwgd2FycF9mYWN0b3IpOwotc3RhdGljIHZvaWQgQ2FsY0JhbmRzKElOVCAqIGRpZmYsIElOVCBzdGFydCAsIElOVCBzdG9wICwgSU5UIG51bV9iYW5kcyk7Ci1zdGF0aWMgSU5UICBtb2RpZnlCYW5kcyhJTlQgbWF4X2JhbmQsIElOVCAqIGRpZmYsIElOVCBsZW5ndGgpOwotc3RhdGljIHZvaWQgY3VtU3VtKElOVCBzdGFydF92YWx1ZSwgSU5UKiBkaWZmLCBJTlQgbGVuZ3RoLCBVQ0hBUiAgKnN0YXJ0X2FkcmVzcyk7Ci0KLQorc3RhdGljIElOVCBudW1iZXJPZkJhbmRzKElOVCBiX3BfbywgSU5UIHN0YXJ0LCBJTlQgc3RvcCwgRklYUF9EQkwgd2FycF9mYWN0b3IpOworc3RhdGljIHZvaWQgQ2FsY0JhbmRzKElOVCAqZGlmZiwgSU5UIHN0YXJ0LCBJTlQgc3RvcCwgSU5UIG51bV9iYW5kcyk7CitzdGF0aWMgSU5UIG1vZGlmeUJhbmRzKElOVCBtYXhfYmFuZCwgSU5UICpkaWZmLCBJTlQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGN1bVN1bShJTlQgc3RhcnRfdmFsdWUsIElOVCAqZGlmZiwgSU5UIGxlbmd0aCwgVUNIQVIgKnN0YXJ0X2FkcmVzcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgRnVuY3Rpb25uYW1lOiAgRkRLc2JyRW5jX2dldFNiclN0YXJ0RnJlcVJBVwpAQCAtMTE1LDI0ICsxMzEsMjIgQEAKICBSZXR1cm46CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotSU5UCi1GREtzYnJFbmNfZ2V0U2JyU3RhcnRGcmVxUkFXIChJTlQgc3RhcnRGcmVxLCBJTlQgZnNDb3JlKQoteworSU5UIEZES3NickVuY19nZXRTYnJTdGFydEZyZXFSQVcoSU5UIHN0YXJ0RnJlcSwgSU5UIGZzQ29yZSkgewogICBJTlQgcmVzdWx0OwogCi0gIGlmICggc3RhcnRGcmVxIDwgMCB8fCBzdGFydEZyZXEgPiAxNSkgeworICBpZiAoc3RhcnRGcmVxIDwgMCB8fCBzdGFydEZyZXEgPiAxNSkgewogICAgIHJldHVybiAtMTsKICAgfQogICAvKiBVcGRhdGUgc3RhcnRGcmVxIHN0cnVjdCAqLwogICByZXN1bHQgPSBnZXRTdGFydEZyZXEoZnNDb3JlLCBzdGFydEZyZXEpOwogCi0gIHJlc3VsdCA9IChyZXN1bHQqKGZzQ29yZT4+NSkrMSk+PjE7IC8qIChyZXN1bHQqZnNTQlIvUU1GYmFuZHMrMSk+PjE7ICovCisgIHJlc3VsdCA9CisgICAgICAocmVzdWx0ICogKGZzQ29yZSA+PiA1KSArIDEpID4+IDE7IC8qIChyZXN1bHQqZnNTQlIvUU1GYmFuZHMrMSk+PjE7ICovCiAKICAgcmV0dXJuIChyZXN1bHQpOwogCiB9IC8qIEVuZCBGREtzYnJFbmNfZ2V0U2JyU3RhcnRGcmVxUkFXICovCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBnZXRTYnJTdG9wRnJlcQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE0MiwyMSArMTU2LDE5IEBACiAKICBSZXR1cm46CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUlOVCBGREtzYnJFbmNfZ2V0U2JyU3RvcEZyZXFSQVcgIChJTlQgc3RvcEZyZXEsIElOVCBmc0NvcmUpCi17CitJTlQgRkRLc2JyRW5jX2dldFNiclN0b3BGcmVxUkFXKElOVCBzdG9wRnJlcSwgSU5UIGZzQ29yZSkgewogICBJTlQgcmVzdWx0OwogCi0gIGlmICggc3RvcEZyZXEgPCAwIHx8IHN0b3BGcmVxID4gMTMpCi0gICAgcmV0dXJuIC0xOworICBpZiAoc3RvcEZyZXEgPCAwIHx8IHN0b3BGcmVxID4gMTMpIHJldHVybiAtMTsKIAogICAvKiBVcHBkYXRlIHN0b3BGcmVxIHN0cnVjdCAqLwogICByZXN1bHQgPSBnZXRTdG9wRnJlcShmc0NvcmUsIHN0b3BGcmVxKTsKLSAgcmVzdWx0ID0gKHJlc3VsdCooZnNDb3JlPj41KSsxKT4+MTsgLyogKHJlc3VsdCpmc1NCUi9RTUZiYW5kcysxKT4+MTsgKi8KKyAgcmVzdWx0ID0KKyAgICAgIChyZXN1bHQgKiAoZnNDb3JlID4+IDUpICsgMSkgPj4gMTsgLyogKHJlc3VsdCpmc1NCUi9RTUZiYW5kcysxKT4+MTsgKi8KIAogICByZXR1cm4gKHJlc3VsdCk7CiB9IC8qIEVuZCBnZXRTYnJTdG9wRnJlcSAqLwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgRnVuY3Rpb25uYW1lOiAgZ2V0U3RhcnRGcmVxCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTY3LDgyICsxNzksODAgQEAKIAogIFJldHVybjoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIElOVAotZ2V0U3RhcnRGcmVxKElOVCBmc0NvcmUsIGNvbnN0IElOVCBzdGFydF9mcmVxKQoteworc3RhdGljIElOVCBnZXRTdGFydEZyZXEoSU5UIGZzQ29yZSwgY29uc3QgSU5UIHN0YXJ0X2ZyZXEpIHsKICAgSU5UIGswX21pbjsKIAotICBzd2l0Y2goZnNDb3JlKXsKLSAgY2FzZSAgODAwMDogazBfbWluID0gMjQ7IC8qICgzMDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLwotICAgIGJyZWFrOwotICBjYXNlIDExMDI1OiBrMF9taW4gPSAxNzsgLyogKDMwMDAgKiBuUW1mQ2hhbm5lbHMgLyBmc1NCUiApICsgMC41ICovCi0gICAgYnJlYWs7Ci0gIGNhc2UgMTIwMDA6IGswX21pbiA9IDE2OyAvKiAoMzAwMCAqIG5RbWZDaGFubmVscyAvIGZzU0JSICkgKyAwLjUgKi8KLSAgICBicmVhazsKLSAgY2FzZSAxNjAwMDogazBfbWluID0gMTY7IC8qICg0MDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLwotICAgIGJyZWFrOwotICBjYXNlIDIyMDUwOiBrMF9taW4gPSAxMjsgLyogKDQwMDAgKiBuUW1mQ2hhbm5lbHMgLyBmc1NCUiApICsgMC41ICovCi0gICAgYnJlYWs7Ci0gIGNhc2UgMjQwMDA6IGswX21pbiA9IDExOyAvKiAoNDAwMCAqIG5RbWZDaGFubmVscyAvIGZzU0JSICkgKyAwLjUgKi8KLSAgICBicmVhazsKLSAgY2FzZSAzMjAwMDogazBfbWluID0gMTA7IC8qICg1MDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLwotICAgIGJyZWFrOwotICBjYXNlIDQ0MTAwOiBrMF9taW4gPSA3OyAgLyogKDUwMDAgKiBuUW1mQ2hhbm5lbHMgLyBmc1NCUiApICsgMC41ICovCi0gICAgYnJlYWs7Ci0gIGNhc2UgNDgwMDA6IGswX21pbiA9IDc7ICAvKiAoNTAwMCAqIG5RbWZDaGFubmVscyAvIGZzU0JSICkgKyAwLjUgKi8KLSAgICBicmVhazsKLSAgY2FzZSA5NjAwMDogazBfbWluID0gMzsgIC8qICg1MDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIGswX21pbj0xMTsgLyogaWxsZWdhbCBmcyAqLworICBzd2l0Y2ggKGZzQ29yZSkgeworICAgIGNhc2UgODAwMDoKKyAgICAgIGswX21pbiA9IDI0OyAvKiAoMzAwMCAqIG5RbWZDaGFubmVscyAvIGZzU0JSICkgKyAwLjUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTEwMjU6CisgICAgICBrMF9taW4gPSAxNzsgLyogKDMwMDAgKiBuUW1mQ2hhbm5lbHMgLyBmc1NCUiApICsgMC41ICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDEyMDAwOgorICAgICAgazBfbWluID0gMTY7IC8qICgzMDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjAwMDoKKyAgICAgIGswX21pbiA9IDE2OyAvKiAoNDAwMCAqIG5RbWZDaGFubmVscyAvIGZzU0JSICkgKyAwLjUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjIwNTA6CisgICAgICBrMF9taW4gPSAxMjsgLyogKDQwMDAgKiBuUW1mQ2hhbm5lbHMgLyBmc1NCUiApICsgMC41ICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDI0MDAwOgorICAgICAgazBfbWluID0gMTE7IC8qICg0MDAwICogblFtZkNoYW5uZWxzIC8gZnNTQlIgKSArIDAuNSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjAwMDoKKyAgICAgIGswX21pbiA9IDEwOyAvKiAoNTAwMCAqIG5RbWZDaGFubmVscyAvIGZzU0JSICkgKyAwLjUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDQxMDA6CisgICAgICBrMF9taW4gPSA3OyAvKiAoNTAwMCAqIG5RbWZDaGFubmVscyAvIGZzU0JSICkgKyAwLjUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDgwMDA6CisgICAgICBrMF9taW4gPSA3OyAvKiAoNTAwMCAqIG5RbWZDaGFubmVscyAvIGZzU0JSICkgKyAwLjUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgOTYwMDA6CisgICAgICBrMF9taW4gPSAzOyAvKiAoNTAwMCAqIG5RbWZDaGFubmVscyAvIGZzU0JSICkgKyAwLjUgKi8KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBrMF9taW4gPSAxMTsgLyogaWxsZWdhbCBmcyAqLwogICB9CiAKLQogICBzd2l0Y2ggKGZzQ29yZSkgewotCi0gIGNhc2UgIDgwMDA6Ci0gICAgewotICAgICAgSU5UIHZfb2Zmc2V0W109IHstOCwgLTcsIC02LCAtNSwgLTQsIC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDd9OworICAgIGNhc2UgODAwMDogeworICAgICAgSU5UIHZfb2Zmc2V0W10gPSB7LTgsIC03LCAtNiwgLTUsIC00LCAtMywgLTIsIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3fTsKICAgICAgIHJldHVybiAoazBfbWluICsgdl9vZmZzZXRbc3RhcnRfZnJlcV0pOwogICAgIH0KLSAgY2FzZSAxMTAyNToKLSAgICB7Ci0gICAgICBJTlQgdl9vZmZzZXRbXT0gey01LCAtNCwgLTMsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOSwgMTEsIDEzfTsKKyAgICBjYXNlIDExMDI1OiB7CisgICAgICBJTlQgdl9vZmZzZXRbXSA9IHstNSwgLTQsIC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDksIDExLCAxM307CiAgICAgICByZXR1cm4gKGswX21pbiArIHZfb2Zmc2V0W3N0YXJ0X2ZyZXFdKTsKICAgICB9Ci0gIGNhc2UgMTIwMDA6Ci0gICAgewotICAgICAgSU5UIHZfb2Zmc2V0W109IHstNSwgLTMsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOSwgMTEsIDEzLCAxNn07CisgICAgY2FzZSAxMjAwMDogeworICAgICAgSU5UIHZfb2Zmc2V0W10gPSB7LTUsIC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDksIDExLCAxMywgMTZ9OwogICAgICAgcmV0dXJuIChrMF9taW4gKyB2X29mZnNldFtzdGFydF9mcmVxXSk7CiAgICAgfQotICBjYXNlIDE2MDAwOgotICAgIHsKLSAgICAgIElOVCB2X29mZnNldFtdPSB7LTYsIC00LCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDksIDExLCAxMywgMTZ9OworICAgIGNhc2UgMTYwMDA6IHsKKyAgICAgIElOVCB2X29mZnNldFtdID0gey02LCAtNCwgLTIsIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA5LCAxMSwgMTMsIDE2fTsKICAgICAgIHJldHVybiAoazBfbWluICsgdl9vZmZzZXRbc3RhcnRfZnJlcV0pOwogICAgIH0KLSAgY2FzZSAyMjA1MDoKLSAgY2FzZSAyNDAwMDoKLSAgY2FzZSAzMjAwMDoKLSAgICB7Ci0gICAgICBJTlQgdl9vZmZzZXRbXT0gey00LCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDksIDExLCAxMywgMTYsIDIwfTsKKyAgICBjYXNlIDIyMDUwOgorICAgIGNhc2UgMjQwMDA6CisgICAgY2FzZSAzMjAwMDogeworICAgICAgSU5UIHZfb2Zmc2V0W10gPSB7LTQsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOSwgMTEsIDEzLCAxNiwgMjB9OwogICAgICAgcmV0dXJuIChrMF9taW4gKyB2X29mZnNldFtzdGFydF9mcmVxXSk7CiAgICAgfQotICBjYXNlIDQ0MTAwOgotICBjYXNlIDQ4MDAwOgotICBjYXNlIDk2MDAwOgotICAgIHsKLSAgICAgIElOVCB2X29mZnNldFtdPSB7LTIsIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA5LCAxMSwgMTMsIDE2LCAyMCwgMjR9OworICAgIGNhc2UgNDQxMDA6CisgICAgY2FzZSA0ODAwMDoKKyAgICBjYXNlIDk2MDAwOiB7CisgICAgICBJTlQgdl9vZmZzZXRbXSA9IHstMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDksIDExLCAxMywgMTYsIDIwLCAyNH07CiAgICAgICByZXR1cm4gKGswX21pbiArIHZfb2Zmc2V0W3N0YXJ0X2ZyZXFdKTsKICAgICB9Ci0gIGRlZmF1bHQ6Ci0gICAgewotICAgICAgSU5UIHZfb2Zmc2V0W109IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA5LCAxMSwgMTMsIDE2LCAyMCwgMjQsIDI4LCAzM307CisgICAgZGVmYXVsdDogeworICAgICAgSU5UIHZfb2Zmc2V0W10gPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOSwgMTEsIDEzLCAxNiwgMjAsIDI0LCAyOCwgMzN9OwogICAgICAgcmV0dXJuIChrMF9taW4gKyB2X29mZnNldFtzdGFydF9mcmVxXSk7CiAgICAgfQogICB9CiB9IC8qIEVuZCBnZXRTdGFydEZyZXEgKi8KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEZ1bmN0aW9ubmFtZTogIGdldFN0b3BGcmVxCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjUyLDc4ICsyNjIsOTMgQEAKIAogIFJldHVybjoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIHN0YXRpYyBJTlQKLWdldFN0b3BGcmVxKElOVCBmc0NvcmUsIGNvbnN0IElOVCBzdG9wX2ZyZXEpCi17Ci0gIElOVCByZXN1bHQsaTsKK3N0YXRpYyBJTlQgZ2V0U3RvcEZyZXEoSU5UIGZzQ29yZSwgY29uc3QgSU5UIHN0b3BfZnJlcSkgeworICBJTlQgcmVzdWx0LCBpOwogICBJTlQgazFfbWluOwogICBJTlQgdl9kc3RvcFsxM107CiAKICAgSU5UICp2X3N0b3BfZnJlcSA9IE5VTEw7Ci0gIElOVCB2X3N0b3BfZnJlcV8xNlsxNF0gPSB7NDgsNDksNTAsNTEsNTIsNTQsNTUsNTYsNTcsNTksNjAsNjEsNjMsNjR9OwotICBJTlQgdl9zdG9wX2ZyZXFfMjJbMTRdID0gezM1LDM3LDM4LDQwLDQyLDQ0LDQ2LDQ4LDUxLDUzLDU2LDU4LDYxLDY0fTsKLSAgSU5UIHZfc3RvcF9mcmVxXzI0WzE0XSA9IHszMiwzNCwzNiwzOCw0MCw0Miw0NCw0Niw0OSw1Miw1NSw1OCw2MSw2NH07Ci0gIElOVCB2X3N0b3BfZnJlcV8zMlsxNF0gPSB7MzIsMzQsMzYsMzgsNDAsNDIsNDQsNDYsNDksNTIsNTUsNTgsNjEsNjR9OwotICBJTlQgdl9zdG9wX2ZyZXFfNDRbMTRdID0gezIzLDI1LDI3LDI5LDMyLDM0LDM3LDQwLDQzLDQ3LDUxLDU1LDU5LDY0fTsKLSAgSU5UIHZfc3RvcF9mcmVxXzQ4WzE0XSA9IHsyMSwyMywyNSwyNywzMCwzMiwzNSwzOCw0Miw0NSw0OSw1NCw1OSw2NH07Ci0gIElOVCB2X3N0b3BfZnJlcV82NFsxNF0gPSB7MjAsMjIsMjQsMjYsMjksMzEsMzQsMzcsNDEsNDUsNDksNTQsNTksNjR9OwotICBJTlQgdl9zdG9wX2ZyZXFfODhbMTRdID0gezE1LDE3LDE5LDIxLDIzLDI2LDI5LDMzLDM3LDQxLDQ2LDUxLDU3LDY0fTsKLSAgSU5UIHZfc3RvcF9mcmVxXzk2WzE0XSA9IHsxMywxNSwxNywxOSwyMSwyNCwyNywzMSwzNSwzOSw0NCw1MCw1Nyw2NH07Ci0gIElOVCB2X3N0b3BfZnJlcV8xOTJbMTRdID0gezcsIDgsMTAsMTIsMTQsMTYsMTksMjMsMjcsMzIsMzgsNDYsNTQsNjR9OworICBJTlQgdl9zdG9wX2ZyZXFfMTZbMTRdID0gezQ4LCA0OSwgNTAsIDUxLCA1MiwgNTQsIDU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2LCA1NywgNTksIDYwLCA2MSwgNjMsIDY0fTsKKyAgSU5UIHZfc3RvcF9mcmVxXzIyWzE0XSA9IHszNSwgMzcsIDM4LCA0MCwgNDIsIDQ0LCA0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwgNTEsIDUzLCA1NiwgNTgsIDYxLCA2NH07CisgIElOVCB2X3N0b3BfZnJlcV8yNFsxNF0gPSB7MzIsIDM0LCAzNiwgMzgsIDQwLCA0MiwgNDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDYsIDQ5LCA1MiwgNTUsIDU4LCA2MSwgNjR9OworICBJTlQgdl9zdG9wX2ZyZXFfMzJbMTRdID0gezMyLCAzNCwgMzYsIDM4LCA0MCwgNDIsIDQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2LCA0OSwgNTIsIDU1LCA1OCwgNjEsIDY0fTsKKyAgSU5UIHZfc3RvcF9mcmVxXzQ0WzE0XSA9IHsyMywgMjUsIDI3LCAyOSwgMzIsIDM0LCAzNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwgNDMsIDQ3LCA1MSwgNTUsIDU5LCA2NH07CisgIElOVCB2X3N0b3BfZnJlcV80OFsxNF0gPSB7MjEsIDIzLCAyNSwgMjcsIDMwLCAzMiwgMzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgsIDQyLCA0NSwgNDksIDU0LCA1OSwgNjR9OworICBJTlQgdl9zdG9wX2ZyZXFfNjRbMTRdID0gezIwLCAyMiwgMjQsIDI2LCAyOSwgMzEsIDM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3LCA0MSwgNDUsIDQ5LCA1NCwgNTksIDY0fTsKKyAgSU5UIHZfc3RvcF9mcmVxXzg4WzE0XSA9IHsxNSwgMTcsIDE5LCAyMSwgMjMsIDI2LCAyOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMywgMzcsIDQxLCA0NiwgNTEsIDU3LCA2NH07CisgIElOVCB2X3N0b3BfZnJlcV85NlsxNF0gPSB7MTMsIDE1LCAxNywgMTksIDIxLCAyNCwgMjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEsIDM1LCAzOSwgNDQsIDUwLCA1NywgNjR9OworICBJTlQgdl9zdG9wX2ZyZXFfMTkyWzE0XSA9IHs3LCAgOCwgIDEwLCAxMiwgMTQsIDE2LCAxOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjMsIDI3LCAzMiwgMzgsIDQ2LCA1NCwgNjR9OwogCi0gIHN3aXRjaChmc0NvcmUpewotICBjYXNlICA4MDAwOiBrMV9taW4gPSA0ODsKLSAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzE2OwotICAgIGJyZWFrOwotICBjYXNlIDExMDI1OiBrMV9taW4gPSAzNTsKLSAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzIyOwotICAgIGJyZWFrOwotICBjYXNlIDEyMDAwOiBrMV9taW4gPSAzMjsKLSAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzI0OwotICAgIGJyZWFrOwotICBjYXNlIDE2MDAwOiBrMV9taW4gPSAzMjsKLSAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzMyOwotICAgIGJyZWFrOwotICBjYXNlIDIyMDUwOiBrMV9taW4gPSAyMzsKLSAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzQ0OwotICAgIGJyZWFrOwotICBjYXNlIDI0MDAwOiBrMV9taW4gPSAyMTsKLSAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzQ4OwotICAgIGJyZWFrOwotICBjYXNlIDMyMDAwOiBrMV9taW4gPSAyMDsKLSAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzY0OwotICAgIGJyZWFrOwotICBjYXNlIDQ0MTAwOiBrMV9taW4gPSAxNTsKLSAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzg4OwotICAgIGJyZWFrOwotICBjYXNlIDQ4MDAwOiBrMV9taW4gPSAxMzsKLSAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzk2OwotICAgIGJyZWFrOwotICBjYXNlIDk2MDAwOiBrMV9taW4gPSAgNzsKLSAgICAgICAgICAgICAgdl9zdG9wX2ZyZXEgPXZfc3RvcF9mcmVxXzE5MjsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBrMV9taW4gPSAyMTsgLyogaWxsZWdhbCBmcyAgKi8KKyAgc3dpdGNoIChmc0NvcmUpIHsKKyAgICBjYXNlIDgwMDA6CisgICAgICBrMV9taW4gPSA0ODsKKyAgICAgIHZfc3RvcF9mcmVxID0gdl9zdG9wX2ZyZXFfMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDExMDI1OgorICAgICAgazFfbWluID0gMzU7CisgICAgICB2X3N0b3BfZnJlcSA9IHZfc3RvcF9mcmVxXzIyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjAwMDoKKyAgICAgIGsxX21pbiA9IDMyOworICAgICAgdl9zdG9wX2ZyZXEgPSB2X3N0b3BfZnJlcV8yNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTYwMDA6CisgICAgICBrMV9taW4gPSAzMjsKKyAgICAgIHZfc3RvcF9mcmVxID0gdl9zdG9wX2ZyZXFfMzI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDIyMDUwOgorICAgICAgazFfbWluID0gMjM7CisgICAgICB2X3N0b3BfZnJlcSA9IHZfc3RvcF9mcmVxXzQ0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDAwMDoKKyAgICAgIGsxX21pbiA9IDIxOworICAgICAgdl9zdG9wX2ZyZXEgPSB2X3N0b3BfZnJlcV80ODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzIwMDA6CisgICAgICBrMV9taW4gPSAyMDsKKyAgICAgIHZfc3RvcF9mcmVxID0gdl9zdG9wX2ZyZXFfNjQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ0MTAwOgorICAgICAgazFfbWluID0gMTU7CisgICAgICB2X3N0b3BfZnJlcSA9IHZfc3RvcF9mcmVxXzg4OworICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODAwMDoKKyAgICAgIGsxX21pbiA9IDEzOworICAgICAgdl9zdG9wX2ZyZXEgPSB2X3N0b3BfZnJlcV85NjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOTYwMDA6CisgICAgICBrMV9taW4gPSA3OworICAgICAgdl9zdG9wX2ZyZXEgPSB2X3N0b3BfZnJlcV8xOTI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgazFfbWluID0gMjE7IC8qIGlsbGVnYWwgZnMgICovCiAgIH0KIAotICAvKiBpZiBubyB2YWxpZCBjb3JlIHNhbXBsaW5ncmF0ZSBpcyB1c2VkIHRoaXMgbG9vcCBwcm9kdWNlcwotICAgICBhIHNlZ2ZhdWx0LCBiZWNhdXNlIHZfc3RvcF9mcmVxIGlzIG5vdCBpbml0aWFsaXplZCAqLwogICAvKiBFbnN1cmUgaW5jcmVhc2luZyBiYW5kd2lkdGggKi8KLSAgZm9yKGkgPSAwOyBpIDw9IDEyOyBpKyspIHsKLSAgICB2X2RzdG9wW2ldID0gdl9zdG9wX2ZyZXFbaSsxXSAtIHZfc3RvcF9mcmVxW2ldOworICBmb3IgKGkgPSAwOyBpIDw9IDEyOyBpKyspIHsKKyAgICB2X2RzdG9wW2ldID0gdl9zdG9wX2ZyZXFbaSArIDFdIC0gdl9zdG9wX2ZyZXFbaV07CiAgIH0KIAogICBGREtzYnJFbmNfU2hlbGxzb3J0X2ludCh2X2RzdG9wLCAxMyk7IC8qIFNvcnQgYmFuZHdpZHRoIGNoYW5nZXMgKi8KIAogICByZXN1bHQgPSBrMV9taW47Ci0gIGZvcihpID0gMDsgaSA8IHN0b3BfZnJlcTsgaSsrKSB7CisgIGZvciAoaSA9IDA7IGkgPCBzdG9wX2ZyZXE7IGkrKykgewogICAgIHJlc3VsdCA9IHJlc3VsdCArIHZfZHN0b3BbaV07CiAgIH0KIAotICByZXR1cm4ocmVzdWx0KTsKKyAgcmV0dXJuIChyZXN1bHQpOwogCi19LyogRW5kIGdldFN0b3BGcmVxICovCi0KK30gLyogRW5kIGdldFN0b3BGcmVxICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgRnVuY3Rpb25uYW1lOiAgRkRLc2JyRW5jX0ZpbmRTdGFydEFuZFN0b3BCYW5kCkBAIC0zNDEsMzEgKzM2NiwyMyBAQAogCiAgUmV0dXJuOiAgICAgICBFcnJvciBjb2RlICgwIGlzIE9LKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQKLUZES3NickVuY19GaW5kU3RhcnRBbmRTdG9wQmFuZCgKLSAgICAgICAgY29uc3QgSU5UIHNyU2JyLAotICAgICAgICBjb25zdCBJTlQgc3JDb3JlLAotICAgICAgICBjb25zdCBJTlQgbm9DaGFubmVscywKLSAgICAgICAgY29uc3QgSU5UIHN0YXJ0RnJlcSwKLSAgICAgICAgY29uc3QgSU5UIHN0b3BGcmVxLAotICAgICAgICBJTlQgKmswLAotICAgICAgICBJTlQgKmsyCi0gICAgICAgICkKLXsKLQorSU5UIEZES3NickVuY19GaW5kU3RhcnRBbmRTdG9wQmFuZChjb25zdCBJTlQgc3JTYnIsIGNvbnN0IElOVCBzckNvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBub0NoYW5uZWxzLCBjb25zdCBJTlQgc3RhcnRGcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgc3RvcEZyZXEsIElOVCAqazAsIElOVCAqazIpIHsKICAgLyogVXBkYXRlIHN0YXJ0RnJlcSBzdHJ1Y3QgKi8KICAgKmswID0gZ2V0U3RhcnRGcmVxKHNyQ29yZSwgc3RhcnRGcmVxKTsKIAogICAvKiBUZXN0IGlmIHN0YXJ0IGZyZXEgaXMgb3V0c2lkZSBjb3JlY29kZXIgcmFuZ2UgKi8KLSAgaWYoIHNyU2JyKm5vQ2hhbm5lbHMgPCAqazAgKiBzckNvcmUgKSB7Ci0gICAgcmV0dXJuICgxKTsgLyogcmFpc2UgdGhlIGNyb3NzLW92ZXIgZnJlcXVlbmN5IGFuZC9vciBsb3dlciB0aGUgbnVtYmVyCi0gICAgICAgICAgICAgICAgICAgb2YgdGFyZ2V0IGJhbmRzIHBlciBvY3RhdmUgKG9yIGxvd2VyIHRoZSBzYW1wbGluZyBmcmVxdWVuY3kpICovCisgIGlmIChzclNiciAqIG5vQ2hhbm5lbHMgPCAqazAgKiBzckNvcmUpIHsKKyAgICByZXR1cm4gKAorICAgICAgICAxKTsgLyogcmFpc2UgdGhlIGNyb3NzLW92ZXIgZnJlcXVlbmN5IGFuZC9vciBsb3dlciB0aGUgbnVtYmVyCisgICAgICAgICAgICAgICBvZiB0YXJnZXQgYmFuZHMgcGVyIG9jdGF2ZSAob3IgbG93ZXIgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSkgKi8KICAgfQogCiAgIC8qVXBkYXRlIHN0b3BGcmVxIHN0cnVjdCAqLwotICBpZiAoIHN0b3BGcmVxIDwgMTQgKSB7CisgIGlmIChzdG9wRnJlcSA8IDE0KSB7CiAgICAgKmsyID0gZ2V0U3RvcEZyZXEoc3JDb3JlLCBzdG9wRnJlcSk7Ci0gIH0gZWxzZSBpZiggc3RvcEZyZXEgPT0gMTQgKSB7CisgIH0gZWxzZSBpZiAoc3RvcEZyZXEgPT0gMTQpIHsKICAgICAqazIgPSAyICogKmswOwogICB9IGVsc2UgewogICAgICprMiA9IDMgKiAqazA7CkBAIC0zNzYsMjMgKzM5MywyMSBAQAogICAgICprMiA9IG5vQ2hhbm5lbHM7CiAgIH0KIAotCi0KICAgLyogVGVzdCBmb3IgaW52YWxpZCAgazAgazIgY29tYmluYXRpb25zICovCi0gIGlmICggKHNyQ29yZSA9PSAyMjA1MCkgJiYgKCAoKmsyIC0gKmswKSA+IE1BWF9GUkVRX0NPRUZGU19GUzQ0MTAwICkgKQotICAgIHJldHVybiAoMSk7IC8qIE51bWJlciBvZiBiYW5kcyBleGNlZWRzIHZhbGlkIHJhbmdlIG9mIE1BWF9GUkVRX0NPRUZGUyBmb3IgZnM9NDQuMWtIeiAqLworICBpZiAoKHNyQ29yZSA9PSAyMjA1MCkgJiYgKCgqazIgLSAqazApID4gTUFYX0ZSRVFfQ09FRkZTX0ZTNDQxMDApKQorICAgIHJldHVybiAoMSk7IC8qIE51bWJlciBvZiBiYW5kcyBleGNlZWRzIHZhbGlkIHJhbmdlIG9mIE1BWF9GUkVRX0NPRUZGUyBmb3IKKyAgICAgICAgICAgICAgICAgICBmcz00NC4xa0h6ICovCiAKLSAgaWYgKCAoc3JDb3JlID49IDI0MDAwKSAmJiAoICgqazIgLSAqazApID4gTUFYX0ZSRVFfQ09FRkZTX0ZTNDgwMDAgKSApCi0gICAgcmV0dXJuICgxKTsgLyogTnVtYmVyIG9mIGJhbmRzIGV4Y2VlZHMgdmFsaWQgcmFuZ2Ugb2YgTUFYX0ZSRVFfQ09FRkZTIGZvciBmcz49NDhrSHogKi8KKyAgaWYgKChzckNvcmUgPj0gMjQwMDApICYmICgoKmsyIC0gKmswKSA+IE1BWF9GUkVRX0NPRUZGU19GUzQ4MDAwKSkKKyAgICByZXR1cm4gKDEpOyAvKiBOdW1iZXIgb2YgYmFuZHMgZXhjZWVkcyB2YWxpZCByYW5nZSBvZiBNQVhfRlJFUV9DT0VGRlMgZm9yCisgICAgICAgICAgICAgICAgICAgZnM+PTQ4a0h6ICovCiAKICAgaWYgKCgqazIgLSAqazApID4gTUFYX0ZSRVFfQ09FRkZTKQotICAgIHJldHVybiAoMSk7LypOdW1iZXIgb2YgYmFuZHMgZXhjZWVkcyB2YWxpZCByYW5nZSBvZiBNQVhfRlJFUV9DT0VGRlMgKi8KKyAgICByZXR1cm4gKDEpOyAvKk51bWJlciBvZiBiYW5kcyBleGNlZWRzIHZhbGlkIHJhbmdlIG9mIE1BWF9GUkVRX0NPRUZGUyAqLwogCi0gIGlmICgoKmsyIC0gKmswKSA8IDApCi0gICAgcmV0dXJuICgxKTsvKiBOdW1iZXIgb2YgYmFuZHMgaXMgbmVnYXRpdmUgKi8KKyAgaWYgKCgqazIgLSAqazApIDwgMCkgcmV0dXJuICgxKTsgLyogTnVtYmVyIG9mIGJhbmRzIGlzIG5lZ2F0aXZlICovCiAKLQotICByZXR1cm4oMCk7CisgIHJldHVybiAoMCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00MDQsMjA3ICs0MTksMTg4IEBACiAKICBSZXR1cm46CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUlOVAotRkRLc2JyRW5jX1VwZGF0ZUZyZXFTY2FsZSgKLSAgICAgICAgVUNIQVIgICAgICp2X2tfbWFzdGVyLAotICAgICAgICBJTlQgICAgICAgKmhfbnVtX2JhbmRzLAotICAgICAgICBjb25zdCBJTlQgIGswLAotICAgICAgICBjb25zdCBJTlQgIGsyLAotICAgICAgICBjb25zdCBJTlQgIGZyZXFTY2FsZSwKLSAgICAgICAgY29uc3QgSU5UICBhbHRlclNjYWxlCi0gICAgICAgICkKK0lOVCBGREtzYnJFbmNfVXBkYXRlRnJlcVNjYWxlKFVDSEFSICp2X2tfbWFzdGVyLCBJTlQgKmhfbnVtX2JhbmRzLCBjb25zdCBJTlQgazAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgazIsIGNvbnN0IElOVCBmcmVxU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYWx0ZXJTY2FsZSkKIAogewotCi0gIElOVCAgICAgYl9wX28gPSAwOyAgICAgICAgLyogYmFuZHNfcGVyX29jdGF2ZSAqLworICBJTlQgYl9wX28gPSAwOyAvKiBiYW5kc19wZXJfb2N0YXZlICovCiAgIEZJWFBfREJMIHdhcnAgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgSU5UICAgICBkayA9IDA7CisgIElOVCBkayA9IDA7CiAKICAgLyogSW50ZXJuYWwgdmFyaWFibGVzICovCi0gIElOVCAgICAgazEgPSAwLCBpOwotICBJTlQgICAgIG51bV9iYW5kczA7Ci0gIElOVCAgICAgbnVtX2JhbmRzMTsKLSAgSU5UICAgICBkaWZmX3RvdFtNQVhfT0NUQVZFICsgTUFYX1NFQ09ORF9SRUdJT05dOwotICBJTlQgICAgICpkaWZmMCA9IGRpZmZfdG90OwotICBJTlQgICAgICpkaWZmMSA9IGRpZmZfdG90K01BWF9PQ1RBVkU7Ci0gIElOVCAgICAgazJfYWNoaXZlZDsKLSAgSU5UICAgICBrMl9kaWZmOwotICBJTlQgICAgIGluY3IgPSAwOworICBJTlQgazEgPSAwLCBpOworICBJTlQgbnVtX2JhbmRzMDsKKyAgSU5UIG51bV9iYW5kczE7CisgIElOVCBkaWZmX3RvdFtNQVhfT0NUQVZFICsgTUFYX1NFQ09ORF9SRUdJT05dOworICBJTlQgKmRpZmYwID0gZGlmZl90b3Q7CisgIElOVCAqZGlmZjEgPSBkaWZmX3RvdCArIE1BWF9PQ1RBVkU7CisgIElOVCBrMl9hY2hpdmVkOworICBJTlQgazJfZGlmZjsKKyAgSU5UIGluY3IgPSAwOwogCiAgIC8qIEluaXQgKi8KLSAgaWYgKGZyZXFTY2FsZT09MSkgIGJfcF9vID0gMTI7Ci0gIGlmIChmcmVxU2NhbGU9PTIpICBiX3BfbyA9IDEwOwotICBpZiAoZnJlcVNjYWxlPT0zKSAgYl9wX28gPSA4OworICBpZiAoZnJlcVNjYWxlID09IDEpIGJfcF9vID0gMTI7CisgIGlmIChmcmVxU2NhbGUgPT0gMikgYl9wX28gPSAxMDsKKyAgaWYgKGZyZXFTY2FsZSA9PSAzKSBiX3BfbyA9IDg7CiAKKyAgaWYgKGZyZXFTY2FsZSA+IDApIC8qQmFyayovCisgIHsKKyAgICBpZiAoYWx0ZXJTY2FsZSA9PSAwKQorICAgICAgd2FycCA9IEZMMkZYQ09OU1RfREJMKDAuNWYpOyAvKiAxLjAvKDEuMCoyLjApICovCisgICAgZWxzZQorICAgICAgd2FycCA9IEZMMkZYQ09OU1RfREJMKDEuMGYgLyAyLjZmKTsgLyogMS4wLygxLjMqMi4wKTsgKi8KIAotICBpZihmcmVxU2NhbGUgPiAwKSAvKkJhcmsqLworICAgIGlmICg0ICogazIgPj0gOSAqIGswKSAvKnR3byBvciBtb3JlIHJlZ2lvbnMgKGhvdyBtYW55IHRpbWVzIHRoZSBiYXNpcyBiYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGNvcGllZCkqLwogICAgIHsKLSAgICAgIGlmKGFsdGVyU2NhbGU9PTApCi0gICAgICAgIHdhcnAgPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsgICAgICAgIC8qIDEuMC8oMS4wKjIuMCkgKi8KLSAgICAgIGVsc2UKLSAgICAgICAgd2FycCA9IEZMMkZYQ09OU1RfREJMKDEuMGYvMi42Zik7ICAgLyogMS4wLygxLjMqMi4wKTsgKi8KKyAgICAgIGsxID0gMiAqIGswOwogCisgICAgICBudW1fYmFuZHMwID0gbnVtYmVyT2ZCYW5kcyhiX3BfbywgazAsIGsxLCBGTDJGWENPTlNUX0RCTCgwLjVmKSk7CisgICAgICBudW1fYmFuZHMxID0gbnVtYmVyT2ZCYW5kcyhiX3BfbywgazEsIGsyLCB3YXJwKTsKIAotICAgICAgaWYoNCprMiA+PSA5KmswKSAgLyp0d28gb3IgbW9yZSByZWdpb25zIChob3cgbWFueSB0aW1lcyB0aGUgYmFzaXMgYmFuZCBpcyBjb3BpZWQpKi8KLSAgICAgICAgewotICAgICAgICAgIGsxPTIqazA7CisgICAgICBDYWxjQmFuZHMoZGlmZjAsIGswLCBrMSwgbnVtX2JhbmRzMCk7ICAgICAgIC8qQ2FsY0JhbmRzMSA9PiBkaWZmMCAqLworICAgICAgRkRLc2JyRW5jX1NoZWxsc29ydF9pbnQoZGlmZjAsIG51bV9iYW5kczApOyAvKlNvcnRCYW5kcyBzb3J0IGRpZmYwICovCiAKLSAgICAgICAgICBudW1fYmFuZHMwPW51bWJlck9mQmFuZHMoYl9wX28sIGswLCBrMSwgRkwyRlhDT05TVF9EQkwoMC41ZikpOwotICAgICAgICAgIG51bV9iYW5kczE9bnVtYmVyT2ZCYW5kcyhiX3BfbywgazEsIGsyLCB3YXJwKTsKKyAgICAgIGlmIChkaWZmMFswXSA9PSAwKSAvKiB0b28gd2lkZSBGQiBiYW5kcyBmb3IgdGFyZ2V0IHR1bmluZyAqLworICAgICAgeworICAgICAgICByZXR1cm4gKDEpOyAvKiByYWlzZSB0aGUgY3Jvc3Mtb3ZlciBmcmVxdWVuY3kgYW5kL29yIGxvd2VyIHRoZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgb2YgdGFyZ2V0IGJhbmRzIHBlciBvY3RhdmUgKG9yIGxvd2VyIHRoZSBzYW1wbGluZworICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgKi8KKyAgICAgIH0KIAotICAgICAgICAgIENhbGNCYW5kcyhkaWZmMCwgazAsIGsxLCBudW1fYmFuZHMwKTsvKkNhbGNCYW5kczEgPT4gZGlmZjAgKi8KLSAgICAgICAgICBGREtzYnJFbmNfU2hlbGxzb3J0X2ludCggZGlmZjAsIG51bV9iYW5kczApOy8qU29ydEJhbmRzIHNvcnQgZGlmZjAgKi8KKyAgICAgIGN1bVN1bShrMCwgZGlmZjAsIG51bV9iYW5kczAsIHZfa19tYXN0ZXIpOyAvKiBjdW1zdW0gKi8KIAotICAgICAgICAgIGlmIChkaWZmMFswXSA9PSAwKSAvKiB0b28gd2lkZSBGQiBiYW5kcyBmb3IgdGFyZ2V0IHR1bmluZyAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoMSk7LyogcmFpc2UgdGhlIGNyb3NzLW92ZXIgZnJlcXVlbmN5IGFuZC9vciBsb3dlciB0aGUgbnVtYmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRhcmdldCBiYW5kcyBwZXIgb2N0YXZlIChvciBsb3dlciB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5ICovCi0gICAgICAgICAgfQorICAgICAgQ2FsY0JhbmRzKGRpZmYxLCBrMSwgazIsIG51bV9iYW5kczEpOyAgICAgICAvKiBDYWxjQmFuZHMyID0+IGRpZmYxICovCisgICAgICBGREtzYnJFbmNfU2hlbGxzb3J0X2ludChkaWZmMSwgbnVtX2JhbmRzMSk7IC8qIFNvcnRCYW5kcyBzb3J0IGRpZmYxICovCisgICAgICBpZiAoZGlmZjBbbnVtX2JhbmRzMCAtIDFdID4gZGlmZjFbMF0pICAgICAgIC8qIG1heCgxKSA+IG1pbigyKSAqLworICAgICAgeworICAgICAgICBpZiAobW9kaWZ5QmFuZHMoZGlmZjBbbnVtX2JhbmRzMCAtIDFdLCBkaWZmMSwgbnVtX2JhbmRzMSkpIHJldHVybiAoMSk7CisgICAgICB9CiAKLSAgICAgICAgICBjdW1TdW0oazAsIGRpZmYwLCBudW1fYmFuZHMwLCB2X2tfbWFzdGVyKTsgLyogY3Vtc3VtICovCisgICAgICAvKiBBZGQgMiduZCByZWdpb24gKi8KKyAgICAgIGN1bVN1bShrMSwgZGlmZjEsIG51bV9iYW5kczEsICZ2X2tfbWFzdGVyW251bV9iYW5kczBdKTsKKyAgICAgICpoX251bV9iYW5kcyA9IG51bV9iYW5kczAgKyBudW1fYmFuZHMxOyAvKiBPdXRwdXQgbnIgb2YgYmFuZHMgKi8KIAotICAgICAgICAgIENhbGNCYW5kcyhkaWZmMSwgazEsIGsyLCBudW1fYmFuZHMxKTsgICAgIC8qIENhbGNCYW5kczIgPT4gZGlmZjEgKi8KLSAgICAgICAgICBGREtzYnJFbmNfU2hlbGxzb3J0X2ludCggZGlmZjEsIG51bV9iYW5kczEpOyAgICAgICAgICAgIC8qIFNvcnRCYW5kcyBzb3J0IGRpZmYxICovCi0gICAgICAgICAgaWYoZGlmZjBbbnVtX2JhbmRzMC0xXSA+IGRpZmYxWzBdKSAgICAgICAgLyogbWF4KDEpID4gbWluKDIpICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmKG1vZGlmeUJhbmRzKGRpZmYwW251bV9iYW5kczAtMV0sZGlmZjEsIG51bV9iYW5kczEpKQotICAgICAgICAgICAgICAgIHJldHVybigxKTsKLSAgICAgICAgICAgIH0KKyAgICB9IGVsc2UgLyogb25lIHJlZ2lvbiAqLworICAgIHsKKyAgICAgIGsxID0gazI7CiAKLSAgICAgICAgICAvKiBBZGQgMiduZCByZWdpb24gKi8KLSAgICAgICAgICBjdW1TdW0oazEsIGRpZmYxLCBudW1fYmFuZHMxLCAmdl9rX21hc3RlcltudW1fYmFuZHMwXSk7Ci0gICAgICAgICAgKmhfbnVtX2JhbmRzPW51bV9iYW5kczArbnVtX2JhbmRzMTsgICAgIC8qIE91dHB1dCBuciBvZiBiYW5kcyAqLworICAgICAgbnVtX2JhbmRzMCA9IG51bWJlck9mQmFuZHMoYl9wX28sIGswLCBrMSwgRkwyRlhDT05TVF9EQkwoMC41ZikpOworICAgICAgQ2FsY0JhbmRzKGRpZmYwLCBrMCwgazEsIG51bV9iYW5kczApOyAgICAgICAvKiBDYWxjQmFuZHMxID0+IGRpZmYwICovCisgICAgICBGREtzYnJFbmNfU2hlbGxzb3J0X2ludChkaWZmMCwgbnVtX2JhbmRzMCk7IC8qIFNvcnRCYW5kcyBzb3J0IGRpZmYwICovCiAKLSAgICAgICAgfQotICAgICAgZWxzZSAvKiBvbmUgcmVnaW9uICovCi0gICAgICAgIHsKLSAgICAgICAgICBrMT1rMjsKKyAgICAgIGlmIChkaWZmMFswXSA9PSAwKSAvKiB0b28gd2lkZSBGQiBiYW5kcyBmb3IgdGFyZ2V0IHR1bmluZyAqLworICAgICAgeworICAgICAgICByZXR1cm4gKDEpOyAvKiByYWlzZSB0aGUgY3Jvc3Mtb3ZlciBmcmVxdWVuY3kgYW5kL29yIGxvd2VyIHRoZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgb2YgdGFyZ2V0IGJhbmRzIHBlciBvY3RhdmUgKG9yIGxvd2VyIHRoZSBzYW1wbGluZworICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgKi8KKyAgICAgIH0KIAotICAgICAgICAgIG51bV9iYW5kczA9bnVtYmVyT2ZCYW5kcyhiX3BfbywgazAsIGsxLCBGTDJGWENPTlNUX0RCTCgwLjVmKSk7Ci0gICAgICAgICAgQ2FsY0JhbmRzKGRpZmYwLCBrMCwgazEsIG51bV9iYW5kczApOy8qIENhbGNCYW5kczEgPT4gZGlmZjAgKi8KLSAgICAgICAgICBGREtzYnJFbmNfU2hlbGxzb3J0X2ludCggZGlmZjAsIG51bV9iYW5kczApOyAgICAgICAvKiBTb3J0QmFuZHMgc29ydCBkaWZmMCAqLwotCi0gICAgICAgICAgaWYgKGRpZmYwWzBdID09IDApIC8qIHRvbyB3aWRlIEZCIGJhbmRzIGZvciB0YXJnZXQgdHVuaW5nICovCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICgxKTsgLyogcmFpc2UgdGhlIGNyb3NzLW92ZXIgZnJlcXVlbmN5IGFuZC9vciBsb3dlciB0aGUgbnVtYmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0YXJnZXQgYmFuZHMgcGVyIG9jdGF2ZSAob3IgbG93ZXIgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICAgICAgICAgIH0KLQotICAgICAgICAgIGN1bVN1bShrMCwgZGlmZjAsIG51bV9iYW5kczAsIHZfa19tYXN0ZXIpOy8qIGN1bXN1bSAqLwotICAgICAgICAgICpoX251bV9iYW5kcz1udW1fYmFuZHMwOyAgICAgICAgLyogT3V0cHV0IG5yIG9mIGJhbmRzICovCi0KLSAgICAgICAgfQorICAgICAgY3VtU3VtKGswLCBkaWZmMCwgbnVtX2JhbmRzMCwgdl9rX21hc3Rlcik7IC8qIGN1bXN1bSAqLworICAgICAgKmhfbnVtX2JhbmRzID0gbnVtX2JhbmRzMDsgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBuciBvZiBiYW5kcyAqLwogICAgIH0KLSAgZWxzZSAvKiBMaW5lYXIgbW9kZSAqLwotICAgIHsKLSAgICAgIGlmIChhbHRlclNjYWxlPT0wKSB7Ci0gICAgICAgIGRrID0gMTsKLSAgICAgICAgbnVtX2JhbmRzMCA9IDIgKiAoKGsyIC0gazApLzIpOyAgICAgICAgIC8qIEZMT09SIHRvIGdldCB0byBmZXcgbnVtYmVyIG9mIGJhbmRzKi8KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGRrID0gMjsKLSAgICAgICAgbnVtX2JhbmRzMCA9IDIgKiAoKChrMiAtIGswKS9kayArMSkvMik7IC8qIFJPVU5EIHRvIGdldCBjbG9zZXN0IGZpdCAqLwotICAgICAgfQotCi0gICAgICBrMl9hY2hpdmVkID0gazAgKyBudW1fYmFuZHMwKmRrOwotICAgICAgazJfZGlmZiA9IGsyIC0gazJfYWNoaXZlZDsKLQotICAgICAgZm9yKGk9MDtpPG51bV9iYW5kczA7aSsrKQotICAgICAgICBkaWZmX3RvdFtpXSA9IGRrOwotCi0gICAgICAvKiBJZiBsaW5lYXIgc2NhbGUgd2Fzbid0IGFjaGl2ZWQgKi8KLSAgICAgIC8qIGFuZCB3ZSBnb3Qgd2lkZSBTQlIgYXJlICovCi0gICAgICBpZiAoazJfZGlmZiA8IDApIHsKLSAgICAgICAgICBpbmNyID0gMTsKLSAgICAgICAgICBpID0gMDsKLSAgICAgIH0KLQotICAgICAgLyogSWYgbGluZWFyIHNjYWxlIHdhc24ndCBhY2hpdmVkICovCi0gICAgICAvKiBhbmQgd2UgZ290IHNtYWxsIFNCUiBhcmUgKi8KLSAgICAgIGlmIChrMl9kaWZmID4gMCkgewotICAgICAgICAgIGluY3IgPSAtMTsKLSAgICAgICAgICBpID0gbnVtX2JhbmRzMC0xOwotICAgICAgfQotCi0gICAgICAvKiBBZGp1c3QgZGlmZiB2ZWN0b3IgdG8gZ2V0IHNlcGMuIFNCUiByYW5nZSAqLwotICAgICAgd2hpbGUgKGsyX2RpZmYgIT0gMCkgewotICAgICAgICBkaWZmX3RvdFtpXSA9IGRpZmZfdG90W2ldIC0gaW5jcjsKLSAgICAgICAgaSA9IGkgKyBpbmNyOwotICAgICAgICBrMl9kaWZmID0gazJfZGlmZiArIGluY3I7Ci0gICAgICB9Ci0KLSAgICAgIGN1bVN1bShrMCwgZGlmZl90b3QsIG51bV9iYW5kczAsIHZfa19tYXN0ZXIpOy8qIGN1bXN1bSAqLwotICAgICAgKmhfbnVtX2JhbmRzPW51bV9iYW5kczA7ICAgICAgICAvKiBPdXRwdXQgbnIgb2YgYmFuZHMgKi8KLQorICB9IGVsc2UgLyogTGluZWFyIG1vZGUgKi8KKyAgeworICAgIGlmIChhbHRlclNjYWxlID09IDApIHsKKyAgICAgIGRrID0gMTsKKyAgICAgIG51bV9iYW5kczAgPSAyICogKChrMiAtIGswKSAvIDIpOyAvKiBGTE9PUiB0byBnZXQgdG8gZmV3IG51bWJlciBvZiBiYW5kcyovCisgICAgfSBlbHNlIHsKKyAgICAgIGRrID0gMjsKKyAgICAgIG51bV9iYW5kczAgPQorICAgICAgICAgIDIgKiAoKChrMiAtIGswKSAvIGRrICsgMSkgLyAyKTsgLyogUk9VTkQgdG8gZ2V0IGNsb3Nlc3QgZml0ICovCiAgICAgfQogCi0gIGlmICgqaF9udW1fYmFuZHMgPCAxKQotICAgIHJldHVybigxKTsgLypUbyBzbWFsbCBzYnIgYXJlYSAqLworICAgIGsyX2FjaGl2ZWQgPSBrMCArIG51bV9iYW5kczAgKiBkazsKKyAgICBrMl9kaWZmID0gazIgLSBrMl9hY2hpdmVkOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9iYW5kczA7IGkrKykgZGlmZl90b3RbaV0gPSBkazsKKworICAgIC8qIElmIGxpbmVhciBzY2FsZSB3YXNuJ3QgYWNoaXZlZCAqLworICAgIC8qIGFuZCB3ZSBnb3Qgd2lkZSBTQlIgYXJlICovCisgICAgaWYgKGsyX2RpZmYgPCAwKSB7CisgICAgICBpbmNyID0gMTsKKyAgICAgIGkgPSAwOworICAgIH0KKworICAgIC8qIElmIGxpbmVhciBzY2FsZSB3YXNuJ3QgYWNoaXZlZCAqLworICAgIC8qIGFuZCB3ZSBnb3Qgc21hbGwgU0JSIGFyZSAqLworICAgIGlmIChrMl9kaWZmID4gMCkgeworICAgICAgaW5jciA9IC0xOworICAgICAgaSA9IG51bV9iYW5kczAgLSAxOworICAgIH0KKworICAgIC8qIEFkanVzdCBkaWZmIHZlY3RvciB0byBnZXQgc2VwYy4gU0JSIHJhbmdlICovCisgICAgd2hpbGUgKGsyX2RpZmYgIT0gMCkgeworICAgICAgZGlmZl90b3RbaV0gPSBkaWZmX3RvdFtpXSAtIGluY3I7CisgICAgICBpID0gaSArIGluY3I7CisgICAgICBrMl9kaWZmID0gazJfZGlmZiArIGluY3I7CisgICAgfQorCisgICAgY3VtU3VtKGswLCBkaWZmX3RvdCwgbnVtX2JhbmRzMCwgdl9rX21hc3Rlcik7IC8qIGN1bXN1bSAqLworICAgICpoX251bV9iYW5kcyA9IG51bV9iYW5kczA7ICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgbnIgb2YgYmFuZHMgKi8KKyAgfQorCisgIGlmICgqaF9udW1fYmFuZHMgPCAxKSByZXR1cm4gKDEpOyAvKlRvIHNtYWxsIHNiciBhcmVhICovCiAKICAgcmV0dXJuICgwKTsKLX0vKiBFbmQgRkRLc2JyRW5jX1VwZGF0ZUZyZXFTY2FsZSAqLworfSAvKiBFbmQgRkRLc2JyRW5jX1VwZGF0ZUZyZXFTY2FsZSAqLwogCi1zdGF0aWMgSU5UCi1udW1iZXJPZkJhbmRzKElOVCBiX3BfbywgSU5UIHN0YXJ0LCBJTlQgc3RvcCwgRklYUF9EQkwgd2FycF9mYWN0b3IpCi17Ci0gIElOVCByZXN1bHQ9MDsKLSAgLyogcmVzdWx0ID0gMiogKElOVCkgKCAoZG91YmxlKWJfcF9vICogKGRvdWJsZSkoRkRLbG9nKChkb3VibGUpc3RvcC8oZG91YmxlKXN0YXJ0KS9GREtsb2coKGRvdWJsZSkyKSkgKiAoZG91YmxlKUZYX0RCTDJGTCh3YXJwX2ZhY3RvcikgKyAwLjUpOyAqLwotICByZXN1bHQgPSAoICggYl9wX28gKiBmTXVsdCggKENhbGNMZEludChzdG9wKSAtIENhbGNMZEludChzdGFydCkpLCAgd2FycF9mYWN0b3IpICsgKEZMMkZYX0RCTCgwLjVmKT4+TERfREFUQV9TSElGVCkKLSAgICAgICAgICAgICAgICkgPj4gKChERlJBQ1RfQklUUy0xKS1MRF9EQVRBX1NISUZUKSApIDw8IDE7IC8qIGRvIG5vdCBvcHRpbWl6ZSBhbnltb3JlIChyb3VuZGluZyEhKSAqLworc3RhdGljIElOVCBudW1iZXJPZkJhbmRzKElOVCBiX3BfbywgSU5UIHN0YXJ0LCBJTlQgc3RvcCwgRklYUF9EQkwgd2FycF9mYWN0b3IpIHsKKyAgSU5UIHJlc3VsdCA9IDA7CisgIC8qIHJlc3VsdCA9IDIqIChJTlQpICggKGRvdWJsZSliX3BfbyAqCisgICAqIChkb3VibGUpKEZES2xvZygoZG91YmxlKXN0b3AvKGRvdWJsZSlzdGFydCkvRkRLbG9nKChkb3VibGUpMikpICoKKyAgICogKGRvdWJsZSlGWF9EQkwyRkwod2FycF9mYWN0b3IpICsgMC41KTsgKi8KKyAgcmVzdWx0ID0gKChiX3BfbyAqIGZNdWx0KChDYWxjTGRJbnQoc3RvcCkgLSBDYWxjTGRJbnQoc3RhcnQpKSwgd2FycF9mYWN0b3IpICsKKyAgICAgICAgICAgICAoRkwyRlhfREJMKDAuNWYpID4+IExEX0RBVEFfU0hJRlQpKSA+PgorICAgICAgICAgICAgKChERlJBQ1RfQklUUyAtIDEpIC0gTERfREFUQV9TSElGVCkpCisgICAgICAgICAgIDw8IDE7IC8qIGRvIG5vdCBvcHRpbWl6ZSBhbnltb3JlIChyb3VuZGluZyEhKSAqLwogCi0gIHJldHVybihyZXN1bHQpOworICByZXR1cm4gKHJlc3VsdCk7CiB9CiAKK3N0YXRpYyB2b2lkIENhbGNCYW5kcyhJTlQgKmRpZmYsIElOVCBzdGFydCwgSU5UIHN0b3AsIElOVCBudW1fYmFuZHMpIHsKKyAgSU5UIGksIHFiLCBxZSwgcXRtcDsKKyAgSU5UIHByZXZpb3VzOworICBJTlQgY3VycmVudDsKKyAgRklYUF9EQkwgYmFzZSwgZXhwLCB0bXA7CiAKLXN0YXRpYyB2b2lkCi1DYWxjQmFuZHMoSU5UICogZGlmZiwgSU5UIHN0YXJ0ICwgSU5UIHN0b3AgLCBJTlQgbnVtX2JhbmRzKQotewotICAgIElOVCBpLCBxYiwgcWUsIHF0bXA7Ci0gICAgSU5UIHByZXZpb3VzOwotICAgIElOVCBjdXJyZW50OwotICAgIEZJWFBfREJMIGJhc2UsIGV4cCwgdG1wOworICBwcmV2aW91cyA9IHN0YXJ0OworICBmb3IgKGkgPSAxOyBpIDw9IG51bV9iYW5kczsgaSsrKSB7CisgICAgYmFzZSA9IGZEaXZOb3JtKChGSVhQX0RCTClzdG9wLCAoRklYUF9EQkwpc3RhcnQsICZxYik7CisgICAgZXhwID0gZkRpdk5vcm0oKEZJWFBfREJMKWksIChGSVhQX0RCTCludW1fYmFuZHMsICZxZSk7CisgICAgdG1wID0gZlBvdyhiYXNlLCBxYiwgZXhwLCBxZSwgJnF0bXApOworICAgIHRtcCA9IGZNdWx0KHRtcCwgKEZJWFBfREJMKShzdGFydCA8PCAyNCkpOworICAgIGN1cnJlbnQgPSAoSU5UKXNjYWxlVmFsdWUodG1wLCBxdG1wIC0gMjMpOworICAgIGN1cnJlbnQgPSAoY3VycmVudCArIDEpID4+IDE7IC8qIHJvdW5kaW5nKi8KKyAgICBkaWZmW2kgLSAxXSA9IGN1cnJlbnQgLSBwcmV2aW91czsKKyAgICBwcmV2aW91cyA9IGN1cnJlbnQ7CisgIH0KIAotICAgIHByZXZpb3VzPXN0YXJ0OwotICAgIGZvcihpPTE7IGk8PSBudW1fYmFuZHM7IGkrKykKLSAgICB7Ci0gICAgICAgIGJhc2UgPSBmRGl2Tm9ybSgoRklYUF9EQkwpc3RvcCwgKEZJWFBfREJMKXN0YXJ0LCAmcWIpOwotICAgICAgICBleHAgPSBmRGl2Tm9ybSgoRklYUF9EQkwpaSwgKEZJWFBfREJMKW51bV9iYW5kcywgJnFlKTsKLSAgICAgICAgdG1wID0gZlBvdyhiYXNlLCBxYiwgZXhwLCBxZSwgJnF0bXApOwotICAgICAgICB0bXAgPSBmTXVsdCh0bXAsIChGSVhQX0RCTCkoc3RhcnQ8PDI0KSk7Ci0gICAgICAgIGN1cnJlbnQgICA9IChJTlQpc2NhbGVWYWx1ZSh0bXAsIHF0bXAtMjMpOwotICAgICAgICBjdXJyZW50ICAgPSAoY3VycmVudCsxKSA+PiAxOyAvKiByb3VuZGluZyovCi0gICAgICAgIGRpZmZbaS0xXSA9IGN1cnJlbnQtcHJldmlvdXM7Ci0gICAgICAgIHByZXZpb3VzICA9IGN1cnJlbnQ7Ci0gICAgfQorfSAvKiBFbmQgQ2FsY0JhbmRzICovCiAKLX0vKiBFbmQgQ2FsY0JhbmRzICovCi0KLQotc3RhdGljIHZvaWQKLWN1bVN1bShJTlQgc3RhcnRfdmFsdWUsIElOVCogZGlmZiwgSU5UIGxlbmd0aCwgIFVDSEFSICpzdGFydF9hZHJlc3MpCi17CitzdGF0aWMgdm9pZCBjdW1TdW0oSU5UIHN0YXJ0X3ZhbHVlLCBJTlQgKmRpZmYsIElOVCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgVUNIQVIgKnN0YXJ0X2FkcmVzcykgewogICBJTlQgaTsKLSAgc3RhcnRfYWRyZXNzWzBdPXN0YXJ0X3ZhbHVlOwotICBmb3IoaT0xO2k8PWxlbmd0aDtpKyspCi0gICAgc3RhcnRfYWRyZXNzW2ldPXN0YXJ0X2FkcmVzc1tpLTFdK2RpZmZbaS0xXTsKKyAgc3RhcnRfYWRyZXNzWzBdID0gc3RhcnRfdmFsdWU7CisgIGZvciAoaSA9IDE7IGkgPD0gbGVuZ3RoOyBpKyspCisgICAgc3RhcnRfYWRyZXNzW2ldID0gc3RhcnRfYWRyZXNzW2kgLSAxXSArIGRpZmZbaSAtIDFdOwogfSAvKiBFbmQgY3VtU3VtICovCiAKK3N0YXRpYyBJTlQgbW9kaWZ5QmFuZHMoSU5UIG1heF9iYW5kX3ByZXZpb3VzLCBJTlQgKmRpZmYsIElOVCBsZW5ndGgpIHsKKyAgSU5UIGNoYW5nZSA9IG1heF9iYW5kX3ByZXZpb3VzIC0gZGlmZlswXTsKIAotc3RhdGljIElOVAotbW9kaWZ5QmFuZHMoSU5UIG1heF9iYW5kX3ByZXZpb3VzLCBJTlQgKiBkaWZmLCBJTlQgbGVuZ3RoKQotewotICBJTlQgY2hhbmdlPW1heF9iYW5kX3ByZXZpb3VzLWRpZmZbMF07Ci0KLSAgLyogTGltaXQgdGhlIGNoYW5nZSBzbyB0aGF0IHRoZSBsYXN0IGJhbmQgY2Fubm90IGdldCBuYXJyb3dlciB0aGFuIHRoZSBmaXJzdCBvbmUgKi8KLSAgaWYgKCBjaGFuZ2UgPiAoZGlmZltsZW5ndGgtMV0gLSBkaWZmWzBdKSAvIDIgKQotICAgIGNoYW5nZSA9IChkaWZmW2xlbmd0aC0xXSAtIGRpZmZbMF0pIC8gMjsKKyAgLyogTGltaXQgdGhlIGNoYW5nZSBzbyB0aGF0IHRoZSBsYXN0IGJhbmQgY2Fubm90IGdldCBuYXJyb3dlciB0aGFuIHRoZSBmaXJzdAorICAgKiBvbmUgKi8KKyAgaWYgKGNoYW5nZSA+IChkaWZmW2xlbmd0aCAtIDFdIC0gZGlmZlswXSkgLyAyKQorICAgIGNoYW5nZSA9IChkaWZmW2xlbmd0aCAtIDFdIC0gZGlmZlswXSkgLyAyOwogCiAgIGRpZmZbMF0gKz0gY2hhbmdlOwotICBkaWZmW2xlbmd0aC0xXSAtPSBjaGFuZ2U7CisgIGRpZmZbbGVuZ3RoIC0gMV0gLT0gY2hhbmdlOwogICBGREtzYnJFbmNfU2hlbGxzb3J0X2ludChkaWZmLCBsZW5ndGgpOwogCi0gIHJldHVybigwKTsKLX0vKiBFbmQgbW9kaWZ5QmFuZHMgKi8KLQorICByZXR1cm4gKDApOworfSAvKiBFbmQgbW9kaWZ5QmFuZHMgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfVXBkYXRlSGlSZXMKQEAgLTYxNiw0MyArNjEyLDM0IEBACiAKICBSZXR1cm46CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUlOVAotRkRLc2JyRW5jX1VwZGF0ZUhpUmVzKAotICAgICAgICBVQ0hBUiAgICpoX2hpcmVzLAotICAgICAgICBJTlQgICAgICpudW1faGlyZXMsCi0gICAgICAgIFVDSEFSICAgKnZfa19tYXN0ZXIsCi0gICAgICAgIElOVCAgICAgIG51bV9tYXN0ZXIsCi0gICAgICAgIElOVCAgICAgKnhvdmVyX2JhbmQKLSAgICAgICAgKQoteworSU5UIEZES3NickVuY19VcGRhdGVIaVJlcyhVQ0hBUiAqaF9oaXJlcywgSU5UICpudW1faGlyZXMsIFVDSEFSICp2X2tfbWFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtX21hc3RlciwgSU5UICp4b3Zlcl9iYW5kKSB7CiAgIElOVCBpOwotICBJTlQgbWF4MSxtYXgyOworICBJTlQgbWF4MSwgbWF4MjsKIAotICBpZiggKHZfa19tYXN0ZXJbKnhvdmVyX2JhbmRdID4gMzIgKSB8fCAvKiB2X2tfbWFzdGVyWyp4b3Zlcl9iYW5kXSA+IG5vUU1GQ2hhbm5lbHMoZHVhbFJhdGUpL2RpdmlkZXIgKi8KLSAgICAgICggKnhvdmVyX2JhbmQgPiBudW1fbWFzdGVyICkgKSAgewotICAgICAgLyogeG92ZXJfYmFuZCBlcnJvciwgdG9vIGJpZyBmb3IgdGhpcyBzdGFydEZyZXEuIFdpbGwgYmUgY2xpcHBlZCAqLworICBpZiAoKHZfa19tYXN0ZXJbKnhvdmVyX2JhbmRdID4KKyAgICAgICAzMikgfHwgLyogdl9rX21hc3RlclsqeG92ZXJfYmFuZF0gPiBub1FNRkNoYW5uZWxzKGR1YWxSYXRlKS9kaXZpZGVyICovCisgICAgICAoKnhvdmVyX2JhbmQgPiBudW1fbWFzdGVyKSkgeworICAgIC8qIHhvdmVyX2JhbmQgZXJyb3IsIHRvbyBiaWcgZm9yIHRoaXMgc3RhcnRGcmVxLiBXaWxsIGJlIGNsaXBwZWQgKi8KIAogICAgIC8qIENhbGN1bGF0ZSBtYXhpbXVtIHZhbHVlIGZvciB4b3Zlcl9iYW5kICovCi0gICAgbWF4MT0wOwotICAgIG1heDI9bnVtX21hc3RlcjsKLSAgICB3aGlsZSggKHZfa19tYXN0ZXJbbWF4MSsxXSA8IDMyICkgJiYgLyogbm9RTUZDaGFubmVscyhkdWFsUmF0ZSkvZGl2aWRlciAqLwotICAgICAgICAgICAoIChtYXgxKzEpIDwgbWF4MikgKQotICAgICAgewotICAgICAgICBtYXgxKys7Ci0gICAgICB9CisgICAgbWF4MSA9IDA7CisgICAgbWF4MiA9IG51bV9tYXN0ZXI7CisgICAgd2hpbGUgKCh2X2tfbWFzdGVyW21heDEgKyAxXSA8IDMyKSAmJiAvKiBub1FNRkNoYW5uZWxzKGR1YWxSYXRlKS9kaXZpZGVyICovCisgICAgICAgICAgICgobWF4MSArIDEpIDwgbWF4MikpIHsKKyAgICAgIG1heDErKzsKKyAgICB9CiAKLSAgICAqeG92ZXJfYmFuZD1tYXgxOworICAgICp4b3Zlcl9iYW5kID0gbWF4MTsKICAgfQogCiAgICpudW1faGlyZXMgPSBudW1fbWFzdGVyIC0gKnhvdmVyX2JhbmQ7Ci0gIGZvcihpID0gKnhvdmVyX2JhbmQ7IGkgPD0gbnVtX21hc3RlcjsgaSsrKQotICAgIHsKLSAgICAgIGhfaGlyZXNbaSAtICp4b3Zlcl9iYW5kXSA9IHZfa19tYXN0ZXJbaV07Ci0gICAgfQorICBmb3IgKGkgPSAqeG92ZXJfYmFuZDsgaSA8PSBudW1fbWFzdGVyOyBpKyspIHsKKyAgICBoX2hpcmVzW2kgLSAqeG92ZXJfYmFuZF0gPSB2X2tfbWFzdGVyW2ldOworICB9CiAKICAgcmV0dXJuICgwKTsKLX0vKiBFbmQgRkRLc2JyRW5jX1VwZGF0ZUhpUmVzICovCi0KK30gLyogRW5kIEZES3NickVuY19VcGRhdGVIaVJlcyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEZ1bmN0aW9ubmFtZTogIEZES3NickVuY19VcGRhdGVMb1JlcwpAQCAtNjYzLDI5ICs2NTAsMjUgQEAKIAogIFJldHVybjoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotRkRLc2JyRW5jX1VwZGF0ZUxvUmVzKFVDSEFSICogaF9sb3JlcywgSU5UICpudW1fbG9yZXMsIFVDSEFSICogaF9oaXJlcywgSU5UIG51bV9oaXJlcykKLXsKK3ZvaWQgRkRLc2JyRW5jX1VwZGF0ZUxvUmVzKFVDSEFSICpoX2xvcmVzLCBJTlQgKm51bV9sb3JlcywgVUNIQVIgKmhfaGlyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtX2hpcmVzKSB7CiAgIElOVCBpOwogCi0gIGlmKG51bV9oaXJlcyUyID09IDApIC8qIGlmIGV2ZW4gbnVtYmVyIG9mIGhpcmVzIGJhbmRzICovCi0gICAgewotICAgICAgKm51bV9sb3Jlcz1udW1faGlyZXMvMjsKLSAgICAgIC8qIFVzZSBldmVyeSBzZWNvbmQgbG9yZXM9aGlyZXNbMCwyLDQuLi5dICovCi0gICAgICBmb3IoaT0wO2k8PSpudW1fbG9yZXM7aSsrKQotICAgICAgICBoX2xvcmVzW2ldPWhfaGlyZXNbaSoyXTsKKyAgaWYgKG51bV9oaXJlcyAlIDIgPT0gMCkgLyogaWYgZXZlbiBudW1iZXIgb2YgaGlyZXMgYmFuZHMgKi8KKyAgeworICAgICpudW1fbG9yZXMgPSBudW1faGlyZXMgLyAyOworICAgIC8qIFVzZSBldmVyeSBzZWNvbmQgbG9yZXM9aGlyZXNbMCwyLDQuLi5dICovCisgICAgZm9yIChpID0gMDsgaSA8PSAqbnVtX2xvcmVzOyBpKyspIGhfbG9yZXNbaV0gPSBoX2hpcmVzW2kgKiAyXTsKIAorICB9IGVsc2UgLyogb2RkIG51bWJlciBvZiBoaXJlcyB3aGljaCBtZWFucyB4b3ZlciBpcyBvZGQgKi8KKyAgeworICAgICpudW1fbG9yZXMgPSAobnVtX2hpcmVzICsgMSkgLyAyOworCisgICAgLyogVXNlIGxvcmVzPWhpcmVzWzAsMSwzLDUgLi4uXSAqLworICAgIGhfbG9yZXNbMF0gPSBoX2hpcmVzWzBdOworICAgIGZvciAoaSA9IDE7IGkgPD0gKm51bV9sb3JlczsgaSsrKSB7CisgICAgICBoX2xvcmVzW2ldID0gaF9oaXJlc1tpICogMiAtIDFdOwogICAgIH0KLSAgZWxzZSAgICAgICAgICAgIC8qIG9kZCBudW1iZXIgb2YgaGlyZXMgd2hpY2ggbWVhbnMgeG92ZXIgaXMgb2RkICovCi0gICAgewotICAgICAgKm51bV9sb3Jlcz0obnVtX2hpcmVzKzEpLzI7CisgIH0KIAotICAgICAgLyogVXNlIGxvcmVzPWhpcmVzWzAsMSwzLDUgLi4uXSAqLwotICAgICAgaF9sb3Jlc1swXT1oX2hpcmVzWzBdOwotICAgICAgZm9yKGk9MTtpPD0qbnVtX2xvcmVzO2krKykKLSAgICAgICAgewotICAgICAgICAgIGhfbG9yZXNbaV09aF9oaXJlc1tpKjItMV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0vKiBFbmQgRkRLc2JyRW5jX1VwZGF0ZUxvUmVzICovCit9IC8qIEVuZCBGREtzYnJFbmNfVXBkYXRlTG9SZXMgKi8KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvc2JyZW5jX2ZyZXFfc2NhLmggYi9saWJTQlJlbmMvc3JjL3NicmVuY19mcmVxX3NjYS5oCmluZGV4IDZmMmJiODQuLjliOGQzNjAgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvc2JyZW5jX2ZyZXFfc2NhLmgKKysrIGIvbGliU0JSZW5jL3NyYy9zYnJlbmNfZnJlcV9zY2EuaApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSw1OSArOTAsNDMgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBmcmVxdWVuY3kgc2NhbGUgcHJvdG90eXBlcyAgCisgIFxicmllZiAgZnJlcXVlbmN5IHNjYWxlIHByb3RvdHlwZXMgJFJldmlzaW9uOiA5Mjc5MCAkCiAqLwotI2lmbmRlZiBfX0ZSRVFfU0NBMl9ICi0jZGVmaW5lIF9fRlJFUV9TQ0EyX0gKKyNpZm5kZWYgU0JSRU5DX0ZSRVFfU0NBX0gKKyNkZWZpbmUgU0JSRU5DX0ZSRVFfU0NBX0gKIAogI2luY2x1ZGUgInNicl9lbmNvZGVyLmgiCiAjaW5jbHVkZSAic2JyX2RlZi5oIgogCi0jZGVmaW5lIE1BWF9PQ1RBVkUgICAgICAgIDI5CisjZGVmaW5lIE1BWF9PQ1RBVkUgMjkKICNkZWZpbmUgTUFYX1NFQ09ORF9SRUdJT04gNTAKIAorSU5UIEZES3NickVuY19VcGRhdGVGcmVxU2NhbGUoVUNIQVIgKnZfa19tYXN0ZXIsIElOVCAqaF9udW1fYmFuZHMsIGNvbnN0IElOVCBrMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBrMiwgY29uc3QgSU5UIGZyZXFfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgYWx0ZXJfc2NhbGUpOwogCi1JTlQKLUZES3NickVuY19VcGRhdGVGcmVxU2NhbGUoCi0gICAgICAgIFVDSEFSICp2X2tfbWFzdGVyLAotICAgICAgICBJTlQgICAqaF9udW1fYmFuZHMsCi0gICAgICAgIGNvbnN0ICBJTlQgazAsCi0gICAgICAgIGNvbnN0ICBJTlQgazIsCi0gICAgICAgIGNvbnN0ICBJTlQgZnJlcV9zY2FsZSwKLSAgICAgICAgY29uc3QgIElOVCBhbHRlcl9zY2FsZQotICAgICAgICApOworSU5UIEZES3NickVuY19VcGRhdGVIaVJlcyhVQ0hBUiAqaF9oaXJlcywgSU5UICpudW1faGlyZXMsIFVDSEFSICp2X2tfbWFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtX21hc3RlciwgSU5UICp4b3Zlcl9iYW5kKTsKIAotSU5UCi1GREtzYnJFbmNfVXBkYXRlSGlSZXMoCi0gICAgICAgIFVDSEFSICpoX2hpcmVzLAotICAgICAgICBJTlQgICAqbnVtX2hpcmVzLAotICAgICAgICBVQ0hBUiAqdl9rX21hc3RlciwKLSAgICAgICAgSU5UICAgIG51bV9tYXN0ZXIsCi0gICAgICAgIElOVCAgICp4b3Zlcl9iYW5kCi0gICAgICAgICk7Cit2b2lkIEZES3NickVuY19VcGRhdGVMb1JlcyhVQ0hBUiAqdl9sb3JlcywgSU5UICpudW1fbG9yZXMsIFVDSEFSICp2X2hpcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bV9oaXJlcyk7CiAKLXZvaWQgIEZES3NickVuY19VcGRhdGVMb1JlcygKLSAgICAgICAgVUNIQVIgKnZfbG9yZXMsCi0gICAgICAgIElOVCAgICpudW1fbG9yZXMsCi0gICAgICAgIFVDSEFSICp2X2hpcmVzLAotICAgICAgICBJTlQgICAgbnVtX2hpcmVzCi0gICAgICAgICk7CitJTlQgRkRLc2JyRW5jX0ZpbmRTdGFydEFuZFN0b3BCYW5kKGNvbnN0IElOVCBzclNiciwgY29uc3QgSU5UIHNyQ29yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIG5vQ2hhbm5lbHMsIGNvbnN0IElOVCBzdGFydEZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBzdG9wX2ZyZXEsIElOVCAqazAsIElOVCAqazIpOwogCi1JTlQKLUZES3NickVuY19GaW5kU3RhcnRBbmRTdG9wQmFuZCgKLSAgICAgICAgY29uc3QgSU5UIHNyU2JyLAotICAgICAgICBjb25zdCBJTlQgc3JDb3JlLAotICAgICAgICBjb25zdCBJTlQgbm9DaGFubmVscywKLSAgICAgICAgY29uc3QgSU5UIHN0YXJ0RnJlcSwKLSAgICAgICAgY29uc3QgSU5UIHN0b3BfZnJlcSwKLSAgICAgICAgSU5UICprMCwKLSAgICAgICAgSU5UICprMgotICAgICAgICApOwotCi1JTlQgRkRLc2JyRW5jX2dldFNiclN0YXJ0RnJlcVJBVyAoSU5UIHN0YXJ0RnJlcSwgSU5UIGZzQ29yZSk7Ci1JTlQgRkRLc2JyRW5jX2dldFNiclN0b3BGcmVxUkFXICAoSU5UIHN0b3BGcmVxLCBJTlQgZnNDb3JlKTsKK0lOVCBGREtzYnJFbmNfZ2V0U2JyU3RhcnRGcmVxUkFXKElOVCBzdGFydEZyZXEsIElOVCBmc0NvcmUpOworSU5UIEZES3NickVuY19nZXRTYnJTdG9wRnJlcVJBVyhJTlQgc3RvcEZyZXEsIElOVCBmc0NvcmUpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3NicmVuY19yYW0uY3BwIGIvbGliU0JSZW5jL3NyYy9zYnJlbmNfcmFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjMwZmEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliU0JSZW5jL3NyYy9zYnJlbmNfcmFtLmNwcApAQCAtMCwwICsxLDI0OSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiEKKyAgXGZpbGUKKyAgXGJyaWVmIE1lbW9yeSBsYXlvdXQKKyAgJFJldmlzaW9uOiA5Mjg2NCAkCisKKyAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgYWxsIHN0YXRpYyBhbmQgZHluYW1pYyBtZW1vcnkgc3BhY2VzCisqLworI2luY2x1ZGUgInNicmVuY19yYW0uaCIKKworI2luY2x1ZGUgInNici5oIgorI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCisKK0NfQUFMTE9DX01FTShSYW1fU2JyRHluYW1pY19SQU0sIEZJWFBfREJMLAorICAgICAgICAgICAgICgoU0JSX0VOQ19EWU5fUkFNX1NJWkUpIC8gc2l6ZW9mKEZJWFBfREJMKSkpCisKKy8qIQorICBcbmFtZSBTdGF0aWNTYnJEYXRhCisKKyAgU3RhdGljIG1lbW9yeSBhcmVhcywgbXVzdCBub3QgYmUgb3ZlcndyaXR0ZW4gaW4gb3RoZXIgc2VjdGlvbnMgb2YgdGhlIGVuY29kZXIKKyovCisvKiBAeyAqLworCisvKiEgc3RhdGljIHNiciBlbmNvZGVyIGluc3RhbmNlIGZvciBvbmUgZW5jb2RlciAoMiBjaGFubmVscykKKyAgYWxsIG1ham9yIHN0YXRpYyBhbmQgZHluYW1pYyBtZW1vcnkgYXJlYXMgYXJlIGxvY2F0ZWQKKyAgaW4gbW9kdWxlIHNicl9yYW0gYW5kIHNiciByb20KKyovCitDX0FMTE9DX01FTShSYW1fU2JyRW5jb2RlciwgU0JSX0VOQ09ERVIsIDEpCitDX0FMTE9DX01FTTIoUmFtX1NickNoYW5uZWwsIFNCUl9DSEFOTkVMLCAxLCAoOCkpCitDX0FMTE9DX01FTTIoUmFtX1NickVsZW1lbnQsIFNCUl9FTEVNRU5ULCAxLCAoOCkpCisKKy8qISBGaWx0ZXIgc3RhdGVzIGZvciBRTUYtYW5hbHlzaXMuIDxicj4KKyAgRGltZW5zaW9uOiAjTUFYTlJTQlJDSEFOTkVMUyAqICNTQlJfUU1GX0ZJTFRFUl9MRU5HVEgKKyovCitDX0FBTExPQ19NRU0yX0woUmFtX1Nicl9RbWZTdGF0ZXNBbmFseXNpcywgRklYUF9RQVMsIDY0MCwgKDgpLCBTRUNUX0RBVEFfTDEpCisKKy8qISBNYXRyaXggaG9sZGluZyB0aGUgcXVvdGEgdmFsdWVzIGZvciBhbGwgZXN0aW1hdGVzLCBhbGwgY2hhbm5lbHMKKyAgRGltZW5zaW9uICNNQVhOUlNCUkNIQU5ORUxTICogKyNTQlJfUU1GX0NIQU5ORUxTKiAjTUFYX05PX09GX0VTVElNQVRFUworKi8KK0NfQUxMT0NfTUVNMl9MKFJhbV9TYnJfcXVvdGFNYXRyaXgsIEZJWFBfREJMLCAoTUFYX05PX09GX0VTVElNQVRFUyAqIDY0KSwgKDgpLAorICAgICAgICAgICAgICAgU0VDVF9EQVRBX0wxKQorCisvKiEgTWF0cml4IGhvbGRpbmcgdGhlIHNpZ24gdmFsdWVzIGZvciBhbGwgZXN0aW1hdGVzLCBhbGwgY2hhbm5lbHMKKyAgRGltZW5zaW9uICNNQVhOUlNCUkNIQU5ORUxTICogKyNTQlJfUU1GX0NIQU5ORUxTKiAjTUFYX05PX09GX0VTVElNQVRFUworKi8KK0NfQUxMT0NfTUVNMihSYW1fU2JyX3NpZ25NYXRyaXgsIElOVCwgKE1BWF9OT19PRl9FU1RJTUFURVMgKiA2NCksICg4KSkKKworLyohIEZyZXF1ZW5jeSBiYW5kIHRhYmxlIChsb3cgcmVzKSA8YnI+CisgIERpbWVuc2lvbiAjTUFYX0ZSRVFfQ09FRkZTLzIrMQorKi8KK0NfQUxMT0NfTUVNMihSYW1fU2JyX2ZyZXFCYW5kVGFibGVMTywgVUNIQVIsIChNQVhfRlJFUV9DT0VGRlMgLyAyICsgMSksICg4KSkKKworLyohIEZyZXF1ZW5jeSBiYW5kIHRhYmxlIChoaWdoIHJlcykgPGJyPgorICBEaW1lbnNpb24gI01BWF9GUkVRX0NPRUZGUyArMQorKi8KK0NfQUxMT0NfTUVNMihSYW1fU2JyX2ZyZXFCYW5kVGFibGVISSwgVUNIQVIsIChNQVhfRlJFUV9DT0VGRlMgKyAxKSwgKDgpKQorCisvKiEgdmsgbWF0c2VyIHRhYmxlIDxicj4KKyAgRGltZW5zaW9uICNNQVhfRlJFUV9DT0VGRlMgKzEKKyovCitDX0FMTE9DX01FTTIoUmFtX1Nicl92X2tfbWFzdGVyLCBVQ0hBUiwgKE1BWF9GUkVRX0NPRUZGUyArIDEpLCAoOCkpCisKKy8qCisgIE1pc3NpbmcgaGFybW9uaWNzIGRldGVjdGlvbgorKi8KKworLyohIHNicl9kZXRlY3Rpb25WZWN0b3JzIDxicj4KKyAgRGltZW5zaW9uICNNQVhfTlVNX0NIQU5ORUxTKiNNQVhfTk9fT0ZfRVNUSU1BVEVTKiNNQVhfRlJFUV9DT0VGRlNdCisqLworQ19BTExPQ19NRU0yKFJhbV9TYnJfZGV0ZWN0aW9uVmVjdG9ycywgVUNIQVIsCisgICAgICAgICAgICAgKE1BWF9OT19PRl9FU1RJTUFURVMgKiBNQVhfRlJFUV9DT0VGRlMpLCAoOCkpCisKKy8qISBzYnJfcHJldkNvbXBWZWNbIDxicj4KKyAgRGltZW5zaW9uICNNQVhfTlVNX0NIQU5ORUxTKiNNQVhfRlJFUV9DT0VGRlNdCisqLworQ19BTExPQ19NRU0yKFJhbV9TYnJfcHJldkVudmVsb3BlQ29tcGVuc2F0aW9uLCBVQ0hBUiwgTUFYX0ZSRVFfQ09FRkZTLCAoOCkpCisvKiEgc2JyX2d1aWRlU2NmYlsgPGJyPgorICBEaW1lbnNpb24gI01BWF9OVU1fQ0hBTk5FTFMqI01BWF9GUkVRX0NPRUZGU10KKyovCitDX0FMTE9DX01FTTIoUmFtX1Nicl9ndWlkZVNjZmIsIFVDSEFSLCBNQVhfRlJFUV9DT0VGRlMsICg4KSkKKworLyohIHNicl9ndWlkZVZlY3RvckRldGVjdGVkIDxicj4KKyAgRGltZW5zaW9uICNNQVhfTlVNX0NIQU5ORUxTKiNNQVhfTk9fT0ZfRVNUSU1BVEVTKiNNQVhfRlJFUV9DT0VGRlNdCisqLworQ19BTExPQ19NRU0yKFJhbV9TYnJfZ3VpZGVWZWN0b3JEZXRlY3RlZCwgVUNIQVIsCisgICAgICAgICAgICAgKE1BWF9OT19PRl9FU1RJTUFURVMgKiBNQVhfRlJFUV9DT0VGRlMpLCAoOCkpCitDX0FMTE9DX01FTTIoUmFtX1Nicl9ndWlkZVZlY3RvckRpZmYsIEZJWFBfREJMLAorICAgICAgICAgICAgIChNQVhfTk9fT0ZfRVNUSU1BVEVTICogTUFYX0ZSRVFfQ09FRkZTKSwgKDgpKQorQ19BTExPQ19NRU0yKFJhbV9TYnJfZ3VpZGVWZWN0b3JPcmlnLCBGSVhQX0RCTCwKKyAgICAgICAgICAgICAoTUFYX05PX09GX0VTVElNQVRFUyAqIE1BWF9GUkVRX0NPRUZGUyksICg4KSkKKworLyoKKyAgU3RhdGljIFBhcmFtZXRyaWMgU3RlcmVvIG1lbW9yeQorKi8KK0NfQUFMTE9DX01FTV9MKFJhbV9Qc1FtZlN0YXRlc1N5bnRoZXNpcywgRklYUF9EQkwsIDY0MCAvIDIsIFNFQ1RfREFUQV9MMSkKKworQ19BTExPQ19NRU1fTChSYW1fUHNFbmNvZGUsIFBTX0VOQ09ERSwgMSwgU0VDVF9EQVRBX0wxKQorQ19BTExPQ19NRU0oUmFtX1BhcmFtU3RlcmVvLCBQQVJBTUVUUklDX1NURVJFTywgMSkKKworLyogQH0gKi8KKworLyohCisgIFxuYW1lIER5bmFtaWNTYnJEYXRhCisKKyAgRHluYW1pYyBtZW1vcnkgYXJlYXMsIG1pZ2h0IGJlIHJldXNlZCBpbiBvdGhlciBhbGdvcml0aG0gc2VjdGlvbnMsCisgIGUuZy4gdGhlIGNvcmUgZW5jb2Rlci4KKyovCisvKiBAeyAqLworCisvKiEgRW5lcmd5IGJ1ZmZlciBmb3IgZW52ZWxvcGUgZXh0cmFjdGlvbiA8YnI+CisgIERpbWVuc2lvbiAjTUFYTlJTQlJDSEFOTkVMUyAqICsjU0JSX1FNRl9TTE9UUyAqICAjU0JSX1FNRl9DSEFOTkVMUworKi8KK0NfQUxMT0NfTUVNMihSYW1fU2JyX2VudllCdWZmZXIsIEZJWFBfREJMLCAoMzIgLyAyICogNjQpLCAoOCkpCisKK0ZJWFBfREJMKiBHZXRSYW1fU2JyX2VudllCdWZmZXIoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSkgeworICBGREtfQVNTRVJUKGR5bmFtaWNfUkFNICE9IDApOworICAvKiBUaGUgcmVpbnRlcnByZXRfY2FzdCBpcyB1c2VkIHRvIHN1cHByZXNzIGEgY29tcGlsZXIgd2FybmluZy4gV2Uga25vdyB0aGF0CisgICAqIChkeW5hbWljX1JBTSArIE9GRlNFVF9OUkcgKyAobipZXzJfQlVGX0JZVEUpKSBpcyBzdWZmaWNpZW50bHkgYWxpZ25lZCwgc28KKyAgICogdGhlIGNhc3QgaXMgc2FmZSAqLworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGSVhQX0RCTCo+KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oZHluYW1pY19SQU0gKyBPRkZTRVRfTlJHICsgKG4gKiBZXzJfQlVGX0JZVEUpKSk7Cit9CisKKy8qCisgKiBRTUYgZGF0YQorICovCisvKiBUaGUgU0JSIGVuY29kZXIgdXNlcyBhIHNpbmdsZSBjaGFubmVsIG92ZXJsYXBwaW5nIGJ1ZmZlciBzZXQgKGFsd2F5cyBuPTApLAorICogYnV0IFBTIGRvZXMgbm90LiAqLworRklYUF9EQkwqIEdldFJhbV9TYnJfZW52UkJ1ZmZlcihpbnQgbiwgVUNIQVIqIGR5bmFtaWNfUkFNKSB7CisgIEZES19BU1NFUlQoZHluYW1pY19SQU0gIT0gMCk7CisgIC8qIFRoZSByZWludGVycHJldF9jYXN0IGlzIHVzZWQgdG8gc3VwcHJlc3MgYSBjb21waWxlciB3YXJuaW5nLiBXZSBrbm93IHRoYXQKKyAgICogKGR5bmFtaWNfUkFNICsgT0ZGU0VUX1FNRiArIChuKihFTlZfUl9CVUZGX0JZVEUrRU5WX0lfQlVGRl9CWVRFKSkpIGlzCisgICAqIHN1ZmZpY2llbnRseSBhbGlnbmVkLCBzbyB0aGUgY2FzdCBpcyBzYWZlICovCisgIHJldHVybiByZWludGVycHJldF9jYXN0PEZJWFBfREJMKj4ocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oCisgICAgICBkeW5hbWljX1JBTSArIE9GRlNFVF9RTUYgKyAobiAqIChFTlZfUl9CVUZGX0JZVEUgKyBFTlZfSV9CVUZGX0JZVEUpKSkpOworfQorRklYUF9EQkwqIEdldFJhbV9TYnJfZW52SUJ1ZmZlcihpbnQgbiwgVUNIQVIqIGR5bmFtaWNfUkFNKSB7CisgIEZES19BU1NFUlQoZHluYW1pY19SQU0gIT0gMCk7CisgIC8qIFRoZSByZWludGVycHJldF9jYXN0IGlzIHVzZWQgdG8gc3VwcHJlc3MgYSBjb21waWxlciB3YXJuaW5nLiBXZSBrbm93IHRoYXQKKyAgICogKGR5bmFtaWNfUkFNICsgT0ZGU0VUX1FNRiArIChFTlZfUl9CVUZGX0JZVEUpICsKKyAgICogKG4qKEVOVl9SX0JVRkZfQllURStFTlZfSV9CVUZGX0JZVEUpKSkgaXMgc3VmZmljaWVudGx5IGFsaWduZWQsIHNvIHRoZSBjYXN0CisgICAqIGlzIHNhZmUgKi8KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RklYUF9EQkwqPigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGR5bmFtaWNfUkFNICsgT0ZGU0VUX1FNRiArIChFTlZfUl9CVUZGX0JZVEUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuICogKEVOVl9SX0JVRkZfQllURSArIEVOVl9JX0JVRkZfQllURSkpKSk7Cit9CisKKy8qIEB9ICovCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3NicmVuY19yYW0uaCBiL2xpYlNCUmVuYy9zcmMvc2JyZW5jX3JhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMjMzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQlJlbmMvc3JjL3NicmVuY19yYW0uaApAQCAtMCwwICsxLDE5OSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCisKK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KKworUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgorCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCisKK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorCis0LiAgICBESVNDTEFJTUVSCisKK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiEKK1xmaWxlCitcYnJpZWYgTWVtb3J5IGxheW91dAorJFJldmlzaW9uOiA5Mjc5MCAkCisqLworI2lmbmRlZiBTQlJFTkNfUkFNX0gKKyNkZWZpbmUgU0JSRU5DX1JBTV9ICisKKyNpbmNsdWRlICJzYnJfZGVmLmgiCisjaW5jbHVkZSAiZW52X2VzdC5oIgorI2luY2x1ZGUgInNicl9lbmNvZGVyLmgiCisjaW5jbHVkZSAic2JyLmgiCisKKyNpbmNsdWRlICJwc19tYWluLmgiCisjaW5jbHVkZSAicHNfZW5jb2RlLmgiCisKKyNkZWZpbmUgRU5WX1RSQU5TSUVOVFNfQllURSAoKHNpemVvZihGSVhQX0RCTCkgKiAoTUFYX05VTV9DSEFOTkVMUyAqIDMgKiAzMikpKQorCisjZGVmaW5lIEVOVl9SX0JVRkZfQllURSAoKHNpemVvZihGSVhQX0RCTCkgKiAoKDMyKSAqIE1BWF9IWUJSSURfQkFORFMpKSkKKyNkZWZpbmUgRU5WX0lfQlVGRl9CWVRFICgoc2l6ZW9mKEZJWFBfREJMKSAqICgoMzIpICogTUFYX0hZQlJJRF9CQU5EUykpKQorI2RlZmluZSBZX0JVRl9DSF9CWVRFIFwKKyAgKCgyICogc2l6ZW9mKEZJWFBfREJMKSAqICgoKDMyKSAtICgzMiAvIDIpKSAqIE1BWF9IWUJSSURfQkFORFMpKSkKKworI2RlZmluZSBFTlZfUl9CVUZfUFNfQllURSAoKHNpemVvZihGSVhQX0RCTCkgKiAzMiAqIDY0IC8gMikpCisjZGVmaW5lIEVOVl9JX0JVRl9QU19CWVRFICgoc2l6ZW9mKEZJWFBfREJMKSAqIDMyICogNjQgLyAyKSkKKworI2RlZmluZSBUT05fQlVGX0NIX0JZVEUgXAorICAoKHNpemVvZihGSVhQX0RCTCkgKiAoTUFYX05PX09GX0VTVElNQVRFUyAqIE1BWF9GUkVRX0NPRUZGUykpKQorCisjZGVmaW5lIFlfMl9CVUZfQllURSAoWV9CVUZfQ0hfQllURSkKKworLyogV29ya2J1ZmZlciBSQU0gLSBBbGxvY2F0aW9uICovCisvKgorICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyB8ICAgICAgICBPRkZTRVRfUU1GICAgICAgIHwgICAgICAgIE9GRlNFVF9OUkcgICAgICB8CisgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAwLjUgKiAgICAgICAgICB8CisgfCAgICAgc2JyX2VudlJCdWZmZXIgICAgICB8IHNicl9lbnZZQnVmZmVyX3NpemUgICAgfAorIHwgICAgIHNicl9lbnZJQnVmZmVyICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyovCisjZGVmaW5lIEJVRl9OUkdfU0laRSAoKE1BWF9OVU1fQ0hBTk5FTFMgKiBZXzJfQlVGX0JZVEUpKQorI2RlZmluZSBCVUZfUU1GX1NJWkUgKEVOVl9SX0JVRkZfQllURSArIEVOVl9JX0JVRkZfQllURSkKKworLyogU2l6ZSBvZiB0aGUgc2hhcmVhYmxlIG1lbW9yeSByZWdpb24gdGhhbiBjYW4gYmUgcmV1c2VkICovCisjZGVmaW5lIFNCUl9FTkNfRFlOX1JBTV9TSVpFIChCVUZfUU1GX1NJWkUgKyBCVUZfTlJHX1NJWkUpCisKKyNkZWZpbmUgT0ZGU0VUX1FNRiAoMCkKKyNkZWZpbmUgT0ZGU0VUX05SRyAoT0ZGU0VUX1FNRiArIEJVRl9RTUZfU0laRSkKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK0hfQUxMT0NfTUVNKFJhbV9TYnJEeW5hbWljX1JBTSwgRklYUF9EQkwpCisKK0hfQUxMT0NfTUVNKFJhbV9TYnJFbmNvZGVyLCBTQlJfRU5DT0RFUikKK0hfQUxMT0NfTUVNKFJhbV9TYnJDaGFubmVsLCBTQlJfQ0hBTk5FTCkKK0hfQUxMT0NfTUVNKFJhbV9TYnJFbGVtZW50LCBTQlJfRUxFTUVOVCkKKworSF9BTExPQ19NRU0oUmFtX1Nicl9xdW90YU1hdHJpeCwgRklYUF9EQkwpCitIX0FMTE9DX01FTShSYW1fU2JyX3NpZ25NYXRyaXgsIElOVCkKKworSF9BTExPQ19NRU0oUmFtX1Nicl9RbWZTdGF0ZXNBbmFseXNpcywgRklYUF9RQVMpCisKK0hfQUxMT0NfTUVNKFJhbV9TYnJfZnJlcUJhbmRUYWJsZUxPLCBVQ0hBUikKK0hfQUxMT0NfTUVNKFJhbV9TYnJfZnJlcUJhbmRUYWJsZUhJLCBVQ0hBUikKK0hfQUxMT0NfTUVNKFJhbV9TYnJfdl9rX21hc3RlciwgVUNIQVIpCisKK0hfQUxMT0NfTUVNKFJhbV9TYnJfZGV0ZWN0aW9uVmVjdG9ycywgVUNIQVIpCitIX0FMTE9DX01FTShSYW1fU2JyX3ByZXZFbnZlbG9wZUNvbXBlbnNhdGlvbiwgVUNIQVIpCitIX0FMTE9DX01FTShSYW1fU2JyX2d1aWRlU2NmYiwgVUNIQVIpCitIX0FMTE9DX01FTShSYW1fU2JyX2d1aWRlVmVjdG9yRGV0ZWN0ZWQsIFVDSEFSKQorCisvKiBEeW5hbWljIE1lbW9yeSBBbGxvY2F0aW9uICovCisKK0hfQUxMT0NfTUVNKFJhbV9TYnJfZW52WUJ1ZmZlciwgRklYUF9EQkwpCitGSVhQX0RCTCogR2V0UmFtX1Nicl9lbnZZQnVmZmVyKGludCBuLCBVQ0hBUiogZHluYW1pY19SQU0pOworRklYUF9EQkwqIEdldFJhbV9TYnJfZW52UkJ1ZmZlcihpbnQgbiwgVUNIQVIqIGR5bmFtaWNfUkFNKTsKK0ZJWFBfREJMKiBHZXRSYW1fU2JyX2VudklCdWZmZXIoaW50IG4sIFVDSEFSKiBkeW5hbWljX1JBTSk7CisKK0hfQUxMT0NfTUVNKFJhbV9TYnJfZ3VpZGVWZWN0b3JEaWZmLCBGSVhQX0RCTCkKK0hfQUxMT0NfTUVNKFJhbV9TYnJfZ3VpZGVWZWN0b3JPcmlnLCBGSVhQX0RCTCkKKworSF9BTExPQ19NRU0oUmFtX1BzUW1mU3RhdGVzU3ludGhlc2lzLCBGSVhQX0RCTCkKKworSF9BTExPQ19NRU0oUmFtX1BzRW5jb2RlLCBQU19FTkNPREUpCisKK0ZJWFBfREJMKiBGREtzYnJFbmNfU2xpY2VSYW1fUHNScW1mKEZJWFBfREJMKiByUW1mRGF0YSwgVUNIQVIqIGR5bmFtaWNfUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGludCBpLCBpbnQgcW1mU2xvdHMpOworRklYUF9EQkwqIEZES3NickVuY19TbGljZVJhbV9Qc0lxbWYoRklYUF9EQkwqIGlRbWZEYXRhLCBVQ0hBUiogZHluYW1pY19SQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgaW50IGksIGludCBxbWZTbG90cyk7CisKK0hfQUxMT0NfTUVNKFJhbV9QYXJhbVN0ZXJlbywgUEFSQU1FVFJJQ19TVEVSRU8pCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvc2JyZW5jX3JvbS5jcHAgYi9saWJTQlJlbmMvc3JjL3NicmVuY19yb20uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczN2FmYWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJTQlJlbmMvc3JjL3NicmVuY19yb20uY3BwCkBAIC0wLDAgKzEsOTEwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBUb2JpYXMgQ2hhbHVwa2EKKworICAgRGVzY3JpcHRpb246IERlZmluaXRpb24gb2YgY29uc3RhbnQgdGFibGVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIQorICBcZmlsZQorICBcYnJpZWYgIERlZmluaXRpb24gb2YgY29uc3RhbnQgdGFibGVzCisgICRSZXZpc2lvbjogOTU0MDQgJAorCisgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIG1vc3Qgb2YgdGhlIGNvbnN0YW50IGRhdGEgdGhhdCBjYW4gYmUgc3RvcmVkIGluIFJPTS4KKyovCisKKyNpbmNsdWRlICJzYnJlbmNfcm9tLmgiCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKworLy9AeworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgVGFibGUgT3ZlcnZpZXc6CisKKyBvIGVudmVsb3BlIGxldmVsLCAgIDEuNSBkQjoKKyAgICAxYSkgIHZfSHVmZl9lbnZlbG9wZUxldmVsQzEwVFsxMjFdCisgICAgMWIpICB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMFRbMTIxXQorICAgIDJhKSAgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTBGWzEyMV0KKyAgICAyYikgIHZfSHVmZl9lbnZlbG9wZUxldmVsTDEwRlsxMjFdCisKKyBvIGVudmVsb3BlIGJhbGFuY2UsIDEuNSBkQjoKKyAgICAzYSkgIGJvb2tTYnJFbnZCYWxhbmNlQzEwVFs0OV0KKyAgICAzYikgIGJvb2tTYnJFbnZCYWxhbmNlTDEwVFs0OV0KKyAgICA0YSkgIGJvb2tTYnJFbnZCYWxhbmNlQzEwRls0OV0KKyAgICA0YikgIGJvb2tTYnJFbnZCYWxhbmNlTDEwRls0OV0KKworIG8gZW52ZWxvcGUgbGV2ZWwsICAgMy4wIGRCOgorICAgIDVhKSAgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFUWzYzXQorICAgIDViKSAgdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFUWzYzXQorICAgIDZhKSAgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFGWzYzXQorICAgIDZiKSAgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFGWzYzXQorCisgbyBlbnZlbG9wZSBiYWxhbmNlLCAzLjAgZEI6CisgICAgN2EpICBib29rU2JyRW52QmFsYW5jZUMxMVRbMjVdCisgICAgN2IpICBib29rU2JyRW52QmFsYW5jZUwxMVRbMjVdCisgICAgOGEpICBib29rU2JyRW52QmFsYW5jZUMxMUZbMjVdCisgICAgOGIpICBib29rU2JyRW52QmFsYW5jZUwxMUZbMjVdCisKKyBvIG5vaXNlIGxldmVsLCAgICAgIDMuMCBkQjoKKyAgICA5YSkgIHZfSHVmZl9Ob2lzZUxldmVsQzExVFs2M10KKyAgICA5YikgIHZfSHVmZl9Ob2lzZUxldmVsTDExVFs2M10KKyAgICAtICkgKHZfSHVmZl9lbnZlbG9wZUxldmVsQzExRls2M10gaXMgdXNlZCBmb3IgZnJlcSBkaXIpCisgICAgLSApICh2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMUZbNjNdIGlzIHVzZWQgZm9yIGZyZXEgZGlyKQorCisgbyBub2lzZSBiYWxhbmNlLCAgICAzLjAgZEI6CisgICAxMGEpICBib29rU2JyTm9pc2VCYWxhbmNlQzExVFsyNV0KKyAgIDEwYikgIGJvb2tTYnJOb2lzZUJhbGFuY2VMMTFUWzI1XQorICAgIC0gKSAoYm9va1NickVudkJhbGFuY2VDMTFGWzI1XSBpcyB1c2VkIGZvciBmcmVxIGRpcikKKyAgICAtICkgKGJvb2tTYnJFbnZCYWxhbmNlTDExRlsyNV0gaXMgdXNlZCBmb3IgZnJlcSBkaXIpCisKKworICAoMS41IGRCIGlzIG5ldmVyIHVzZWQgZm9yIG5vaXNlKQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB0YWJsZSAgICAgICA6IGVudmVsb3BlIGxldmVsLCAxLjUgZEIgKi8KKy8qIHRoZW9yIHJhbmdlIDogWy01OCw1OF0sIENPREVfQk9PS19TQ0ZfTEFWICAgPSA1OCAqLworLyogaW1wbGVtIHJhbmdlOiBbLTYwLDYwXSwgQ09ERV9CT09LX1NDRl9MQVYxMCA9IDYwICovCisvKiByYXcgc3RhdHMgICA6IGVudmVsb3BlTGV2ZWxfMDAgKHllcywgd3Jvbmcgc3VmZml4IGluIG5hbWUpICBLSyAwMS0wMy0wOSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGRpcmVjdGlvbjogdGltZQorICAgY29udGVudHMgOiBjb2Rld29yZHMKKyAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQzJGSVgubS9lbnZlbG9wZUxldmVsXzAwVF9jRi5tYXQvdl9uQ2hleF9jRgorICAgYnVpbHQgYnkgOiBGSCAwMS0wNy0wNSAqLworCitjb25zdCBJTlQgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTBUWzEyMV0gPSB7CisgICAgMHgwMDAzRkZENiwgMHgwMDAzRkZENywgMHgwMDAzRkZEOCwgMHgwMDAzRkZEOSwgMHgwMDAzRkZEQSwgMHgwMDAzRkZEQiwKKyAgICAweDAwMDdGRkI4LCAweDAwMDdGRkI5LCAweDAwMDdGRkJBLCAweDAwMDdGRkJCLCAweDAwMDdGRkJDLCAweDAwMDdGRkJELAorICAgIDB4MDAwN0ZGQkUsIDB4MDAwN0ZGQkYsIDB4MDAwN0ZGQzAsIDB4MDAwN0ZGQzEsIDB4MDAwN0ZGQzIsIDB4MDAwN0ZGQzMsCisgICAgMHgwMDA3RkZDNCwgMHgwMDA3RkZDNSwgMHgwMDA3RkZDNiwgMHgwMDA3RkZDNywgMHgwMDA3RkZDOCwgMHgwMDA3RkZDOSwKKyAgICAweDAwMDdGRkNBLCAweDAwMDdGRkNCLCAweDAwMDdGRkNDLCAweDAwMDdGRkNELCAweDAwMDdGRkNFLCAweDAwMDdGRkNGLAorICAgIDB4MDAwN0ZGRDAsIDB4MDAwN0ZGRDEsIDB4MDAwN0ZGRDIsIDB4MDAwN0ZGRDMsIDB4MDAwMUZGRTYsIDB4MDAwM0ZGRDQsCisgICAgMHgwMDAwRkZGMCwgMHgwMDAxRkZFOSwgMHgwMDAzRkZENSwgMHgwMDAxRkZFNywgMHgwMDAwRkZGMSwgMHgwMDAwRkZFQywKKyAgICAweDAwMDBGRkVELCAweDAwMDBGRkVFLCAweDAwMDA3RkY0LCAweDAwMDAzRkY5LCAweDAwMDAzRkY3LCAweDAwMDAxRkZBLAorICAgIDB4MDAwMDFGRjksIDB4MDAwMDBGRkIsIDB4MDAwMDA3RkMsIDB4MDAwMDAzRkMsIDB4MDAwMDAxRkQsIDB4MDAwMDAwRkQsCisgICAgMHgwMDAwMDA3RCwgMHgwMDAwMDAzRCwgMHgwMDAwMDAxRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwNSwgMHgwMDAwMDAwMSwKKyAgICAweDAwMDAwMDAwLCAweDAwMDAwMDA0LCAweDAwMDAwMDBDLCAweDAwMDAwMDFDLCAweDAwMDAwMDNDLCAweDAwMDAwMDdDLAorICAgIDB4MDAwMDAwRkMsIDB4MDAwMDAxRkMsIDB4MDAwMDAzRkQsIDB4MDAwMDBGRkEsIDB4MDAwMDFGRjgsIDB4MDAwMDNGRjYsCisgICAgMHgwMDAwM0ZGOCwgMHgwMDAwN0ZGNSwgMHgwMDAwRkZFRiwgMHgwMDAxRkZFOCwgMHgwMDAwRkZGMiwgMHgwMDA3RkZENCwKKyAgICAweDAwMDdGRkQ1LCAweDAwMDdGRkQ2LCAweDAwMDdGRkQ3LCAweDAwMDdGRkQ4LCAweDAwMDdGRkQ5LCAweDAwMDdGRkRBLAorICAgIDB4MDAwN0ZGREIsIDB4MDAwN0ZGREMsIDB4MDAwN0ZGREQsIDB4MDAwN0ZGREUsIDB4MDAwN0ZGREYsIDB4MDAwN0ZGRTAsCisgICAgMHgwMDA3RkZFMSwgMHgwMDA3RkZFMiwgMHgwMDA3RkZFMywgMHgwMDA3RkZFNCwgMHgwMDA3RkZFNSwgMHgwMDA3RkZFNiwKKyAgICAweDAwMDdGRkU3LCAweDAwMDdGRkU4LCAweDAwMDdGRkU5LCAweDAwMDdGRkVBLCAweDAwMDdGRkVCLCAweDAwMDdGRkVDLAorICAgIDB4MDAwN0ZGRUQsIDB4MDAwN0ZGRUUsIDB4MDAwN0ZGRUYsIDB4MDAwN0ZGRjAsIDB4MDAwN0ZGRjEsIDB4MDAwN0ZGRjIsCisgICAgMHgwMDA3RkZGMywgMHgwMDA3RkZGNCwgMHgwMDA3RkZGNSwgMHgwMDA3RkZGNiwgMHgwMDA3RkZGNywgMHgwMDA3RkZGOCwKKyAgICAweDAwMDdGRkY5LCAweDAwMDdGRkZBLCAweDAwMDdGRkZCLCAweDAwMDdGRkZDLCAweDAwMDdGRkZELCAweDAwMDdGRkZFLAorICAgIDB4MDAwN0ZGRkZ9OworCisvKiBkaXJlY3Rpb246IHRpbWUKKyAgIGNvbnRlbnRzIDogY29kZXdvcmQgbGVuZ3RocworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDMkZJWC5tL2VudmVsb3BlTGV2ZWxfMDBUX2NGLm1hdC92X25MaGV4X2NGCisgICBidWlsdCBieSA6IEZIIDAxLTA3LTA1ICovCisKK2NvbnN0IFVDSEFSIHZfSHVmZl9lbnZlbG9wZUxldmVsTDEwVFsxMjFdID0geworICAgIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsCisgICAgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywKKyAgICAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAorICAgIDB4MTMsIDB4MTEsIDB4MTIsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTEsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisgICAgMHgwRiwgMHgwRSwgMHgwRSwgMHgwRCwgMHgwRCwgMHgwQywgMHgwQiwgMHgwQSwgMHgwOSwgMHgwOCwgMHgwNywKKyAgICAweDA2LCAweDA1LCAweDA0LCAweDAzLCAweDAyLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorICAgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEUsIDB4MEYsIDB4MTAsIDB4MTEsIDB4MTAsCisgICAgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywKKyAgICAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAorICAgIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsCisgICAgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxM307CisKKy8qIGRpcmVjdGlvbjogZnJlcQorICAgY29udGVudHMgOiBjb2Rld29yZHMKKyAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQzJGSVgubS9lbnZlbG9wZUxldmVsXzAwRl9jRi5tYXQvdl9uQ2hleF9jRgorICAgYnVpbHQgYnkgOiBGSCAwMS0wNy0wNSAqLworCitjb25zdCBJTlQgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTBGWzEyMV0gPSB7CisgICAgMHgwMDA3RkZFNywgMHgwMDA3RkZFOCwgMHgwMDBGRkZEMiwgMHgwMDBGRkZEMywgMHgwMDBGRkZENCwgMHgwMDBGRkZENSwKKyAgICAweDAwMEZGRkQ2LCAweDAwMEZGRkQ3LCAweDAwMEZGRkQ4LCAweDAwMDdGRkRBLCAweDAwMEZGRkQ5LCAweDAwMEZGRkRBLAorICAgIDB4MDAwRkZGREIsIDB4MDAwRkZGREMsIDB4MDAwN0ZGREIsIDB4MDAwRkZGREQsIDB4MDAwN0ZGREMsIDB4MDAwN0ZGREQsCisgICAgMHgwMDBGRkZERSwgMHgwMDAzRkZFNCwgMHgwMDBGRkZERiwgMHgwMDBGRkZFMCwgMHgwMDBGRkZFMSwgMHgwMDA3RkZERSwKKyAgICAweDAwMEZGRkUyLCAweDAwMEZGRkUzLCAweDAwMEZGRkU0LCAweDAwMDdGRkRGLCAweDAwMEZGRkU1LCAweDAwMDdGRkUwLAorICAgIDB4MDAwM0ZGRTgsIDB4MDAwN0ZGRTEsIDB4MDAwM0ZGRTAsIDB4MDAwM0ZGRTksIDB4MDAwMUZGRUYsIDB4MDAwM0ZGRTUsCisgICAgMHgwMDAxRkZFQywgMHgwMDAxRkZFRCwgMHgwMDAxRkZFRSwgMHgwMDAwRkZGNCwgMHgwMDAwRkZGMywgMHgwMDAwRkZGMCwKKyAgICAweDAwMDA3RkY3LCAweDAwMDA3RkY2LCAweDAwMDAzRkZBLCAweDAwMDAxRkZBLCAweDAwMDAxRkY5LCAweDAwMDAwRkZBLAorICAgIDB4MDAwMDBGRjgsIDB4MDAwMDA3RjksIDB4MDAwMDAzRkIsIDB4MDAwMDAxRkMsIDB4MDAwMDAxRkEsIDB4MDAwMDAwRkIsCisgICAgMHgwMDAwMDA3QywgMHgwMDAwMDAzQywgMHgwMDAwMDAxQywgMHgwMDAwMDAwQywgMHgwMDAwMDAwNSwgMHgwMDAwMDAwMSwKKyAgICAweDAwMDAwMDAwLCAweDAwMDAwMDA0LCAweDAwMDAwMDBELCAweDAwMDAwMDFELCAweDAwMDAwMDNELCAweDAwMDAwMEZBLAorICAgIDB4MDAwMDAwRkMsIDB4MDAwMDAxRkIsIDB4MDAwMDAzRkEsIDB4MDAwMDA3RjgsIDB4MDAwMDA3RkEsIDB4MDAwMDA3RkIsCisgICAgMHgwMDAwMEZGOSwgMHgwMDAwMEZGQiwgMHgwMDAwMUZGOCwgMHgwMDAwMUZGQiwgMHgwMDAwM0ZGOCwgMHgwMDAwM0ZGOSwKKyAgICAweDAwMDBGRkYxLCAweDAwMDBGRkYyLCAweDAwMDFGRkVBLCAweDAwMDFGRkVCLCAweDAwMDNGRkUxLCAweDAwMDNGRkUyLAorICAgIDB4MDAwM0ZGRUEsIDB4MDAwM0ZGRTMsIDB4MDAwM0ZGRTYsIDB4MDAwM0ZGRTcsIDB4MDAwM0ZGRUIsIDB4MDAwRkZGRTYsCisgICAgMHgwMDA3RkZFMiwgMHgwMDBGRkZFNywgMHgwMDBGRkZFOCwgMHgwMDBGRkZFOSwgMHgwMDBGRkZFQSwgMHgwMDBGRkZFQiwKKyAgICAweDAwMEZGRkVDLCAweDAwMDdGRkUzLCAweDAwMEZGRkVELCAweDAwMEZGRkVFLCAweDAwMEZGRkVGLCAweDAwMEZGRkYwLAorICAgIDB4MDAwN0ZGRTQsIDB4MDAwRkZGRjEsIDB4MDAwM0ZGRUMsIDB4MDAwRkZGRjIsIDB4MDAwRkZGRjMsIDB4MDAwN0ZGRTUsCisgICAgMHgwMDA3RkZFNiwgMHgwMDBGRkZGNCwgMHgwMDBGRkZGNSwgMHgwMDBGRkZGNiwgMHgwMDBGRkZGNywgMHgwMDBGRkZGOCwKKyAgICAweDAwMEZGRkY5LCAweDAwMEZGRkZBLCAweDAwMEZGRkZCLCAweDAwMEZGRkZDLCAweDAwMEZGRkZELCAweDAwMEZGRkZFLAorICAgIDB4MDAwRkZGRkZ9OworCisvKiBkaXJlY3Rpb246IGZyZXEKKyAgIGNvbnRlbnRzIDogY29kZXdvcmQgbGVuZ3RocworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDMkZJWC5tL2VudmVsb3BlTGV2ZWxfMDBGX2NGLm1hdC92X25MaGV4X2NGCisgICBidWlsdCBieSA6IEZIIDAxLTA3LTA1ICovCisKK2NvbnN0IFVDSEFSIHZfSHVmZl9lbnZlbG9wZUxldmVsTDEwRlsxMjFdID0geworICAgIDB4MTMsIDB4MTMsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTMsIDB4MTQsCisgICAgMHgxNCwgMHgxNCwgMHgxNCwgMHgxMywgMHgxNCwgMHgxMywgMHgxMywgMHgxNCwgMHgxMiwgMHgxNCwgMHgxNCwKKyAgICAweDE0LCAweDEzLCAweDE0LCAweDE0LCAweDE0LCAweDEzLCAweDE0LCAweDEzLCAweDEyLCAweDEzLCAweDEyLAorICAgIDB4MTIsIDB4MTEsIDB4MTIsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MEYsIDB4MEYsCisgICAgMHgwRSwgMHgwRCwgMHgwRCwgMHgwQywgMHgwQywgMHgwQiwgMHgwQSwgMHgwOSwgMHgwOSwgMHgwOCwgMHgwNywKKyAgICAweDA2LCAweDA1LCAweDA0LCAweDAzLCAweDAyLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA4LAorICAgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEIsIDB4MEIsIDB4MEMsIDB4MEMsIDB4MEQsIDB4MEQsIDB4MEUsCisgICAgMHgwRSwgMHgxMCwgMHgxMCwgMHgxMSwgMHgxMSwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwKKyAgICAweDEyLCAweDE0LCAweDEzLCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDEzLCAweDE0LAorICAgIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTMsIDB4MTQsIDB4MTIsIDB4MTQsIDB4MTQsIDB4MTMsIDB4MTMsIDB4MTQsCisgICAgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogdGFibGUgICAgICAgOiBlbnZlbG9wZSBiYWxhbmNlLCAxLjUgZEIgKi8KKy8qIHRoZW9yIHJhbmdlIDogWy00OCw0OF0sIENPREVfQk9PS19TQ0ZfTEFWID0gNDggKi8KKy8qIGltcGxlbSByYW5nZTogc2FtZSBidXQgbWFwcGVkIHRvIFstMjQsMjRdLCBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTAgPSAyNAorICovCisvKiByYXcgc3RhdHMgICA6IGVudmVsb3BlUGFuXzAwICh5ZXMsIHdyb25nIHN1ZmZpeCBpbiBuYW1lKSAgS0sgMDEtMDMtMDkgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkaXJlY3Rpb246IHRpbWUKKyAgIGNvbnRlbnRzIDogY29kZXdvcmRzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlM0MubS9lbnZlbG9wZVBhbl8wMFQubWF0L3ZfbkJoZXgKKyAgIGJ1aWx0IGJ5IDogRkggMDEtMDUtMTUgKi8KKworY29uc3QgSU5UIGJvb2tTYnJFbnZCYWxhbmNlQzEwVFs0OV0gPSB7CisgICAgMHgwMDAwRkZFNCwgMHgwMDAwRkZFNSwgMHgwMDAwRkZFNiwgMHgwMDAwRkZFNywgMHgwMDAwRkZFOCwgMHgwMDAwRkZFOSwKKyAgICAweDAwMDBGRkVBLCAweDAwMDBGRkVCLCAweDAwMDBGRkVDLCAweDAwMDBGRkVELCAweDAwMDBGRkVFLCAweDAwMDBGRkVGLAorICAgIDB4MDAwMEZGRjAsIDB4MDAwMEZGRjEsIDB4MDAwMEZGRjIsIDB4MDAwMEZGRjMsIDB4MDAwMEZGRjQsIDB4MDAwMEZGRTIsCisgICAgMHgwMDAwMEZGQywgMHgwMDAwMDdGQywgMHgwMDAwMDFGRSwgMHgwMDAwMDA3RSwgMHgwMDAwMDAxRSwgMHgwMDAwMDAwNiwKKyAgICAweDAwMDAwMDAwLCAweDAwMDAwMDAyLCAweDAwMDAwMDBFLCAweDAwMDAwMDNFLCAweDAwMDAwMEZFLCAweDAwMDAwN0ZELAorICAgIDB4MDAwMDBGRkQsIDB4MDAwMDdGRjAsIDB4MDAwMEZGRTMsIDB4MDAwMEZGRjUsIDB4MDAwMEZGRjYsIDB4MDAwMEZGRjcsCisgICAgMHgwMDAwRkZGOCwgMHgwMDAwRkZGOSwgMHgwMDAwRkZGQSwgMHgwMDAxRkZGNiwgMHgwMDAxRkZGNywgMHgwMDAxRkZGOCwKKyAgICAweDAwMDFGRkY5LCAweDAwMDFGRkZBLCAweDAwMDFGRkZCLCAweDAwMDFGRkZDLCAweDAwMDFGRkZELCAweDAwMDFGRkZFLAorICAgIDB4MDAwMUZGRkZ9OworCisvKiBkaXJlY3Rpb246IHRpbWUKKyAgIGNvbnRlbnRzIDogY29kZXdvcmQgbGVuZ3RocworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDLm0vZW52ZWxvcGVQYW5fMDBULm1hdC92X25MaGV4CisgICBidWlsdCBieSA6IEZIIDAxLTA1LTE1ICovCisKK2NvbnN0IFVDSEFSIGJvb2tTYnJFbnZCYWxhbmNlTDEwVFs0OV0gPSB7CisgICAgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKyAgICAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDBDLCAweDBCLAorICAgIDB4MDksIDB4MDcsIDB4MDUsIDB4MDMsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDYsIDB4MDgsIDB4MEIsCisgICAgMHgwQywgMHgwRiwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMSwKKyAgICAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExfTsKKworLyogZGlyZWN0aW9uOiBmcmVxCisgICBjb250ZW50cyA6IGNvZGV3b3JkcworICAgcmF3IHRhYmxlOiBIdWZmQ29kZTNDLm0vZW52ZWxvcGVQYW5fMDBGLm1hdC92X25CaGV4CisgICBidWlsdCBieSA6IEZIIDAxLTA1LTE1ICovCisKK2NvbnN0IElOVCBib29rU2JyRW52QmFsYW5jZUMxMEZbNDldID0geworICAgIDB4MDAwM0ZGRTIsIDB4MDAwM0ZGRTMsIDB4MDAwM0ZGRTQsIDB4MDAwM0ZGRTUsIDB4MDAwM0ZGRTYsIDB4MDAwM0ZGRTcsCisgICAgMHgwMDAzRkZFOCwgMHgwMDAzRkZFOSwgMHgwMDAzRkZFQSwgMHgwMDAzRkZFQiwgMHgwMDAzRkZFQywgMHgwMDAzRkZFRCwKKyAgICAweDAwMDNGRkVFLCAweDAwMDNGRkVGLCAweDAwMDNGRkYwLCAweDAwMDBGRkY3LCAweDAwMDFGRkYwLCAweDAwMDAzRkZDLAorICAgIDB4MDAwMDA3RkUsIDB4MDAwMDA3RkMsIDB4MDAwMDAwRkUsIDB4MDAwMDAwN0UsIDB4MDAwMDAwMEUsIDB4MDAwMDAwMDIsCisgICAgMHgwMDAwMDAwMCwgMHgwMDAwMDAwNiwgMHgwMDAwMDAxRSwgMHgwMDAwMDAzRSwgMHgwMDAwMDFGRSwgMHgwMDAwMDdGRCwKKyAgICAweDAwMDAwRkZFLCAweDAwMDA3RkZBLCAweDAwMDBGRkY2LCAweDAwMDNGRkYxLCAweDAwMDNGRkYyLCAweDAwMDNGRkYzLAorICAgIDB4MDAwM0ZGRjQsIDB4MDAwM0ZGRjUsIDB4MDAwM0ZGRjYsIDB4MDAwM0ZGRjcsIDB4MDAwM0ZGRjgsIDB4MDAwM0ZGRjksCisgICAgMHgwMDAzRkZGQSwgMHgwMDAzRkZGQiwgMHgwMDAzRkZGQywgMHgwMDAzRkZGRCwgMHgwMDAzRkZGRSwgMHgwMDA3RkZGRSwKKyAgICAweDAwMDdGRkZGfTsKKworLyogZGlyZWN0aW9uOiBmcmVxCisgICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKKyAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQy5tL2VudmVsb3BlUGFuXzAwRi5tYXQvdl9uTGhleAorICAgYnVpbHQgYnkgOiBGSCAwMS0wNS0xNSAqLworCitjb25zdCBVQ0hBUiBib29rU2JyRW52QmFsYW5jZUwxMEZbNDldID0geworICAgIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsCisgICAgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMCwgMHgxMSwgMHgwRSwgMHgwQiwgMHgwQiwKKyAgICAweDA4LCAweDA3LCAweDA0LCAweDAyLCAweDAxLCAweDAzLCAweDA1LCAweDA2LCAweDA5LCAweDBCLAorICAgIDB4MEMsIDB4MEYsIDB4MTAsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsCisgICAgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMiwgMHgxMywgMHgxM307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogdGFibGUgICAgICAgOiBlbnZlbG9wZSBsZXZlbCwgMy4wIGRCICovCisvKiB0aGVvciByYW5nZSA6IFstMjksMjldLCBDT0RFX0JPT0tfU0NGX0xBViAgID0gMjkgKi8KKy8qIGltcGxlbSByYW5nZTogWy0zMSwzMV0sIENPREVfQk9PS19TQ0ZfTEFWMTEgPSAzMSAqLworLyogcmF3IHN0YXRzICAgOiBlbnZlbG9wZUxldmVsXzExICBLSyAwMC0wMi0wMyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGRpcmVjdGlvbjogdGltZQorICAgY29udGVudHMgOiBjb2Rld29yZHMKKyAgIHJhdyB0YWJsZTogSHVmZkNvZGUyLm0KKyAgIGJ1aWx0IGJ5IDogRkggMDAtMDItMDQgKi8KKworY29uc3QgSU5UIHZfSHVmZl9lbnZlbG9wZUxldmVsQzExVFs2M10gPSB7CisgICAgMHgwMDAzRkZFRCwgMHgwMDAzRkZFRSwgMHgwMDA3RkZERSwgMHgwMDA3RkZERiwgMHgwMDA3RkZFMCwgMHgwMDA3RkZFMSwKKyAgICAweDAwMDdGRkUyLCAweDAwMDdGRkUzLCAweDAwMDdGRkU0LCAweDAwMDdGRkU1LCAweDAwMDdGRkU2LCAweDAwMDdGRkU3LAorICAgIDB4MDAwN0ZGRTgsIDB4MDAwN0ZGRTksIDB4MDAwN0ZGRUEsIDB4MDAwN0ZGRUIsIDB4MDAwN0ZGRUMsIDB4MDAwMUZGRjQsCisgICAgMHgwMDAwRkZGNywgMHgwMDAwRkZGOSwgMHgwMDAwRkZGOCwgMHgwMDAwM0ZGQiwgMHgwMDAwM0ZGQSwgMHgwMDAwM0ZGOCwKKyAgICAweDAwMDAxRkZBLCAweDAwMDAwRkZDLCAweDAwMDAwN0ZDLCAweDAwMDAwMEZFLCAweDAwMDAwMDNFLCAweDAwMDAwMDBFLAorICAgIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMUUsIDB4MDAwMDAwN0UsIDB4MDAwMDAxRkUsCisgICAgMHgwMDAwMDdGRCwgMHgwMDAwMUZGQiwgMHgwMDAwM0ZGOSwgMHgwMDAwM0ZGQywgMHgwMDAwN0ZGQSwgMHgwMDAwRkZGNiwKKyAgICAweDAwMDFGRkY1LCAweDAwMDNGRkVDLCAweDAwMDdGRkVELCAweDAwMDdGRkVFLCAweDAwMDdGRkVGLCAweDAwMDdGRkYwLAorICAgIDB4MDAwN0ZGRjEsIDB4MDAwN0ZGRjIsIDB4MDAwN0ZGRjMsIDB4MDAwN0ZGRjQsIDB4MDAwN0ZGRjUsIDB4MDAwN0ZGRjYsCisgICAgMHgwMDA3RkZGNywgMHgwMDA3RkZGOCwgMHgwMDA3RkZGOSwgMHgwMDA3RkZGQSwgMHgwMDA3RkZGQiwgMHgwMDA3RkZGQywKKyAgICAweDAwMDdGRkZELCAweDAwMDdGRkZFLCAweDAwMDdGRkZGfTsKKworLyogZGlyZWN0aW9uOiB0aW1lCisgICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKKyAgIHJhdyB0YWJsZTogSHVmZkNvZGUyLm0KKyAgIGJ1aWx0IGJ5IDogRkggMDAtMDItMDQgKi8KKworY29uc3QgVUNIQVIgdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFUWzYzXSA9IHsKKyAgICAweDEyLCAweDEyLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAorICAgIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTEsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MEUsCisgICAgMHgwRSwgMHgwRSwgMHgwRCwgMHgwQywgMHgwQiwgMHgwOCwgMHgwNiwgMHgwNCwgMHgwMiwgMHgwMSwgMHgwMywKKyAgICAweDA1LCAweDA3LCAweDA5LCAweDBCLCAweDBELCAweDBFLCAweDBFLCAweDBGLCAweDEwLCAweDExLCAweDEyLAorICAgIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsCisgICAgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxMywgMHgxM307CisKKy8qIGRpcmVjdGlvbjogZnJlcQorICAgY29udGVudHMgOiBjb2Rld29yZHMKKyAgIHJhdyB0YWJsZTogSHVmZkNvZGUyLm0KKyAgIGJ1aWx0IGJ5IDogRkggMDAtMDItMDQgKi8KKworY29uc3QgSU5UIHZfSHVmZl9lbnZlbG9wZUxldmVsQzExRls2M10gPSB7CisgICAgMHgwMDBGRkZGMCwgMHgwMDBGRkZGMSwgMHgwMDBGRkZGMiwgMHgwMDBGRkZGMywgMHgwMDBGRkZGNCwgMHgwMDBGRkZGNSwKKyAgICAweDAwMEZGRkY2LCAweDAwMDNGRkYzLCAweDAwMDdGRkY1LCAweDAwMDdGRkVFLCAweDAwMDdGRkVGLCAweDAwMDdGRkY2LAorICAgIDB4MDAwM0ZGRjQsIDB4MDAwM0ZGRjIsIDB4MDAwRkZGRjcsIDB4MDAwN0ZGRjAsIDB4MDAwMUZGRjUsIDB4MDAwM0ZGRjAsCisgICAgMHgwMDAxRkZGNCwgMHgwMDAwRkZGNywgMHgwMDAwRkZGNiwgMHgwMDAwN0ZGOCwgMHgwMDAwM0ZGQiwgMHgwMDAwMEZGRCwKKyAgICAweDAwMDAwN0ZELCAweDAwMDAwM0ZELCAweDAwMDAwMUZELCAweDAwMDAwMEZELCAweDAwMDAwMDNFLCAweDAwMDAwMDBFLAorICAgIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDYsIDB4MDAwMDAwMUUsIDB4MDAwMDAwRkMsIDB4MDAwMDAxRkMsCisgICAgMHgwMDAwMDNGQywgMHgwMDAwMDdGQywgMHgwMDAwMEZGQywgMHgwMDAwMUZGQywgMHgwMDAwM0ZGQSwgMHgwMDAwN0ZGOSwKKyAgICAweDAwMDA3RkZBLCAweDAwMDBGRkY4LCAweDAwMDBGRkY5LCAweDAwMDFGRkY2LCAweDAwMDFGRkY3LCAweDAwMDNGRkY1LAorICAgIDB4MDAwM0ZGRjYsIDB4MDAwM0ZGRjEsIDB4MDAwRkZGRjgsIDB4MDAwN0ZGRjEsIDB4MDAwN0ZGRjIsIDB4MDAwN0ZGRjMsCisgICAgMHgwMDBGRkZGOSwgMHgwMDA3RkZGNywgMHgwMDA3RkZGNCwgMHgwMDBGRkZGQSwgMHgwMDBGRkZGQiwgMHgwMDBGRkZGQywKKyAgICAweDAwMEZGRkZELCAweDAwMEZGRkZFLCAweDAwMEZGRkZGfTsKKworLyogZGlyZWN0aW9uOiBmcmVxCisgICBjb250ZW50cyA6IGNvZGV3b3JkIGxlbmd0aHMKKyAgIHJhdyB0YWJsZTogSHVmZkNvZGUyLm0KKyAgIGJ1aWx0IGJ5IDogRkggMDAtMDItMDQgKi8KKworY29uc3QgVUNIQVIgdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFGWzYzXSA9IHsKKyAgICAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDEyLCAweDEzLCAweDEzLCAweDEzLAorICAgIDB4MTMsIDB4MTIsIDB4MTIsIDB4MTQsIDB4MTMsIDB4MTEsIDB4MTIsIDB4MTEsIDB4MTAsIDB4MTAsIDB4MEYsCisgICAgMHgwRSwgMHgwQywgMHgwQiwgMHgwQSwgMHgwOSwgMHgwOCwgMHgwNiwgMHgwNCwgMHgwMiwgMHgwMSwgMHgwMywKKyAgICAweDA1LCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLCAweDBGLCAweDEwLAorICAgIDB4MTAsIDB4MTEsIDB4MTEsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTQsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTQsCisgICAgMHgxMywgMHgxMywgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogdGFibGUgICAgICAgOiBlbnZlbG9wZSBiYWxhbmNlLCAzLjAgZEIgKi8KKy8qIHRoZW9yIHJhbmdlIDogWy0yNCwyNF0sIENPREVfQk9PS19TQ0ZfTEFWID0gMjQgKi8KKy8qIGltcGxlbSByYW5nZTogc2FtZSBidXQgbWFwcGVkIHRvIFstMTIsMTJdLCBDT0RFX0JPT0tfU0NGX0xBVl9CQUxBTkNFMTEgPSAxMgorICovCisvKiByYXcgc3RhdHMgICA6IGVudmVsb3BlQmFsYW5jZV8xMSAgS0sgMDAtMDItMDMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkaXJlY3Rpb246IHRpbWUKKyAgIGNvbnRlbnRzIDogY29kZXdvcmRzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlM0MubS9lbnZlbG9wZUJhbGFuY2VfMTFULm1hdC92X25CaGV4CisgICBidWlsdCBieSA6IEZIIDAxLTA1LTE1ICovCisKK2NvbnN0IElOVCBib29rU2JyRW52QmFsYW5jZUMxMVRbMjVdID0geworICAgIDB4MDAwMDFGRjIsIDB4MDAwMDFGRjMsIDB4MDAwMDFGRjQsIDB4MDAwMDFGRjUsIDB4MDAwMDFGRjYsCisgICAgMHgwMDAwMUZGNywgMHgwMDAwMUZGOCwgMHgwMDAwMEZGOCwgMHgwMDAwMDBGRSwgMHgwMDAwMDA3RSwKKyAgICAweDAwMDAwMDBFLCAweDAwMDAwMDA2LCAweDAwMDAwMDAwLCAweDAwMDAwMDAyLCAweDAwMDAwMDFFLAorICAgIDB4MDAwMDAwM0UsIDB4MDAwMDAxRkUsIDB4MDAwMDFGRjksIDB4MDAwMDFGRkEsIDB4MDAwMDFGRkIsCisgICAgMHgwMDAwMUZGQywgMHgwMDAwMUZGRCwgMHgwMDAwMUZGRSwgMHgwMDAwM0ZGRSwgMHgwMDAwM0ZGRn07CisKKy8qIGRpcmVjdGlvbjogdGltZQorICAgY29udGVudHMgOiBjb2Rld29yZCBsZW5ndGhzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlM0MubS9lbnZlbG9wZUJhbGFuY2VfMTFULm1hdC92X25MaGV4CisgICBidWlsdCBieSA6IEZIIDAxLTA1LTE1ICovCisKK2NvbnN0IFVDSEFSIGJvb2tTYnJFbnZCYWxhbmNlTDExVFsyNV0gPSB7CisgICAgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwQywgMHgwOCwKKyAgICAweDA3LCAweDA0LCAweDAzLCAweDAxLCAweDAyLCAweDA1LCAweDA2LCAweDA5LCAweDBELAorICAgIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEQsIDB4MEUsIDB4MEV9OworCisvKiBkaXJlY3Rpb246IGZyZXEKKyAgIGNvbnRlbnRzIDogY29kZXdvcmRzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlM0MubS9lbnZlbG9wZUJhbGFuY2VfMTFGLm1hdC92X25CaGV4CisgICBidWlsdCBieSA6IEZIIDAxLTA1LTE1ICovCisKK2NvbnN0IElOVCBib29rU2JyRW52QmFsYW5jZUMxMUZbMjVdID0geworICAgIDB4MDAwMDFGRjcsIDB4MDAwMDFGRjgsIDB4MDAwMDFGRjksIDB4MDAwMDFGRkEsIDB4MDAwMDFGRkIsCisgICAgMHgwMDAwM0ZGOCwgMHgwMDAwM0ZGOSwgMHgwMDAwMDdGQywgMHgwMDAwMDBGRSwgMHgwMDAwMDA3RSwKKyAgICAweDAwMDAwMDBFLCAweDAwMDAwMDAyLCAweDAwMDAwMDAwLCAweDAwMDAwMDA2LCAweDAwMDAwMDFFLAorICAgIDB4MDAwMDAwM0UsIDB4MDAwMDAxRkUsIDB4MDAwMDBGRkEsIDB4MDAwMDFGRjYsIDB4MDAwMDNGRkEsCisgICAgMHgwMDAwM0ZGQiwgMHgwMDAwM0ZGQywgMHgwMDAwM0ZGRCwgMHgwMDAwM0ZGRSwgMHgwMDAwM0ZGRn07CisKKy8qIGRpcmVjdGlvbjogZnJlcQorICAgY29udGVudHMgOiBjb2Rld29yZCBsZW5ndGhzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlM0MubS9lbnZlbG9wZUJhbGFuY2VfMTFGLm1hdC92X25MaGV4CisgICBidWlsdCBieSA6IEZIIDAxLTA1LTE1ICovCisKK2NvbnN0IFVDSEFSIGJvb2tTYnJFbnZCYWxhbmNlTDExRlsyNV0gPSB7CisgICAgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRCwgMHgwRSwgMHgwRSwgMHgwQiwgMHgwOCwKKyAgICAweDA3LCAweDA0LCAweDAyLCAweDAxLCAweDAzLCAweDA1LCAweDA2LCAweDA5LCAweDBDLAorICAgIDB4MEQsIDB4MEUsIDB4MEUsIDB4MEUsIDB4MEUsIDB4MEUsIDB4MEV9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHRhYmxlICAgICAgIDogbm9pc2UgbGV2ZWwsIDMuMCBkQiAqLworLyogdGhlb3IgcmFuZ2UgOiBbLTI5LDI5XSwgQ09ERV9CT09LX1NDRl9MQVYgICA9IDI5ICovCisvKiBpbXBsZW0gcmFuZ2U6IFstMzEsMzFdLCBDT0RFX0JPT0tfU0NGX0xBVjExID0gMzEgKi8KKy8qIHJhdyBzdGF0cyAgIDogbm9pc2VMZXZlbF8xMSAgS0sgMDAtMDItMDMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkaXJlY3Rpb246IHRpbWUKKyAgIGNvbnRlbnRzIDogY29kZXdvcmRzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlMi5tCisgICBidWlsdCBieSA6IEZIIDAwLTAyLTA0ICovCisKK2NvbnN0IElOVCB2X0h1ZmZfTm9pc2VMZXZlbEMxMVRbNjNdID0geworICAgIDB4MDAwMDFGQ0UsIDB4MDAwMDFGQ0YsIDB4MDAwMDFGRDAsIDB4MDAwMDFGRDEsIDB4MDAwMDFGRDIsIDB4MDAwMDFGRDMsCisgICAgMHgwMDAwMUZENCwgMHgwMDAwMUZENSwgMHgwMDAwMUZENiwgMHgwMDAwMUZENywgMHgwMDAwMUZEOCwgMHgwMDAwMUZEOSwKKyAgICAweDAwMDAxRkRBLCAweDAwMDAxRkRCLCAweDAwMDAxRkRDLCAweDAwMDAxRkRELCAweDAwMDAxRkRFLCAweDAwMDAxRkRGLAorICAgIDB4MDAwMDFGRTAsIDB4MDAwMDFGRTEsIDB4MDAwMDFGRTIsIDB4MDAwMDFGRTMsIDB4MDAwMDFGRTQsIDB4MDAwMDFGRTUsCisgICAgMHgwMDAwMUZFNiwgMHgwMDAwMUZFNywgMHgwMDAwMDdGMiwgMHgwMDAwMDBGRCwgMHgwMDAwMDAzRSwgMHgwMDAwMDAwRSwKKyAgICAweDAwMDAwMDA2LCAweDAwMDAwMDAwLCAweDAwMDAwMDAyLCAweDAwMDAwMDFFLCAweDAwMDAwMEZDLCAweDAwMDAwM0Y4LAorICAgIDB4MDAwMDFGQ0MsIDB4MDAwMDFGRTgsIDB4MDAwMDFGRTksIDB4MDAwMDFGRUEsIDB4MDAwMDFGRUIsIDB4MDAwMDFGRUMsCisgICAgMHgwMDAwMUZDRCwgMHgwMDAwMUZFRCwgMHgwMDAwMUZFRSwgMHgwMDAwMUZFRiwgMHgwMDAwMUZGMCwgMHgwMDAwMUZGMSwKKyAgICAweDAwMDAxRkYyLCAweDAwMDAxRkYzLCAweDAwMDAxRkY0LCAweDAwMDAxRkY1LCAweDAwMDAxRkY2LCAweDAwMDAxRkY3LAorICAgIDB4MDAwMDFGRjgsIDB4MDAwMDFGRjksIDB4MDAwMDFGRkEsIDB4MDAwMDFGRkIsIDB4MDAwMDFGRkMsIDB4MDAwMDFGRkQsCisgICAgMHgwMDAwMUZGRSwgMHgwMDAwM0ZGRSwgMHgwMDAwM0ZGRn07CisKKy8qIGRpcmVjdGlvbjogdGltZQorICAgY29udGVudHMgOiBjb2Rld29yZCBsZW5ndGhzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlMi5tCisgICBidWlsdCBieSA6IEZIIDAwLTAyLTA0ICovCisKK2NvbnN0IFVDSEFSIHZfSHVmZl9Ob2lzZUxldmVsTDExVFs2M10gPSB7CisgICAgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwKKyAgICAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELAorICAgIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsCisgICAgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwKKyAgICAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBCLCAweDAwMDAwMDA4LCAweDAwMDAwMDA2LCAweDAwMDAwMDA0LAorICAgIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDUsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMEEsCisgICAgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwKKyAgICAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELCAweDAwMDAwMDBELAorICAgIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsIDB4MDAwMDAwMEQsCisgICAgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwgMHgwMDAwMDAwRCwKKyAgICAweDAwMDAwMDBELCAweDAwMDAwMDBFLCAweDAwMDAwMDBFfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB0YWJsZSAgICAgICA6IG5vaXNlIGJhbGFuY2UsIDMuMCBkQiAqLworLyogdGhlb3IgcmFuZ2UgOiBbLTI0LDI0XSwgQ09ERV9CT09LX1NDRl9MQVYgPSAyNCAqLworLyogaW1wbGVtIHJhbmdlOiBzYW1lIGJ1dCBtYXBwZWQgdG8gWy0xMiwxMl0sIENPREVfQk9PS19TQ0ZfTEFWX0JBTEFOQ0UxMSA9IDEyCisgKi8KKy8qIHJhdyBzdGF0cyAgIDogbm9pc2VCYWxhbmNlXzExICBLSyAwMC0wMi0wMyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGRpcmVjdGlvbjogdGltZQorICAgY29udGVudHMgOiBjb2Rld29yZHMKKyAgIHJhdyB0YWJsZTogSHVmZkNvZGUzQy5tL25vaXNlQmFsYW5jZV8xMS5tYXQvdl9uQmhleAorICAgYnVpbHQgYnkgOiBGSCAwMS0wNS0xNSAqLworCitjb25zdCBJTlQgYm9va1Nick5vaXNlQmFsYW5jZUMxMVRbMjVdID0geworICAgIDB4MDAwMDAwRUMsIDB4MDAwMDAwRUQsIDB4MDAwMDAwRUUsIDB4MDAwMDAwRUYsIDB4MDAwMDAwRjAsCisgICAgMHgwMDAwMDBGMSwgMHgwMDAwMDBGMiwgMHgwMDAwMDBGMywgMHgwMDAwMDBGNCwgMHgwMDAwMDBGNSwKKyAgICAweDAwMDAwMDFDLCAweDAwMDAwMDAyLCAweDAwMDAwMDAwLCAweDAwMDAwMDA2LCAweDAwMDAwMDNBLAorICAgIDB4MDAwMDAwRjYsIDB4MDAwMDAwRjcsIDB4MDAwMDAwRjgsIDB4MDAwMDAwRjksIDB4MDAwMDAwRkEsCisgICAgMHgwMDAwMDBGQiwgMHgwMDAwMDBGQywgMHgwMDAwMDBGRCwgMHgwMDAwMDBGRSwgMHgwMDAwMDBGRn07CisKKy8qIGRpcmVjdGlvbjogdGltZQorICAgY29udGVudHMgOiBjb2Rld29yZCBsZW5ndGhzCisgICByYXcgdGFibGU6IEh1ZmZDb2RlM0MubS9ub2lzZUJhbGFuY2VfMTEubWF0L3ZfbkxoZXgKKyAgIGJ1aWx0IGJ5IDogRkggMDEtMDUtMTUgKi8KKworY29uc3QgVUNIQVIgYm9va1Nick5vaXNlQmFsYW5jZUwxMVRbMjVdID0geworICAgIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsCisgICAgMHgwOCwgMHgwNSwgMHgwMiwgMHgwMSwgMHgwMywgMHgwNiwgMHgwOCwgMHgwOCwgMHgwOCwKKyAgICAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4fTsKKworLyoKKyAgIHR1bmluZ1RhYmxlCisqLworY29uc3Qgc2JyVHVuaW5nVGFibGVfdCBzYnJUdW5pbmdUYWJsZVtdID0geworICAgIC8qIFNvbWUgb2YgdGhlIGxvdyBiaXRyYXRlcyBhcmUgY29tbWVudGVkIG91dCBoZXJlLCB0aGlzIGlzIGJlY2F1c2UgdGhlCisgICAgICAgZW5jb2RlciBjb3VsZCBsb3NlIGZyYW1lcyBhdCB0aG9zZSBiaXRyYXRlcyBhbmQgdGhyb3cgYW4gZXJyb3IKKyAgICAgICBiZWNhdXNlIGl0IGhhcyBpbnN1ZmZpY2llbnQgYml0cyB0byBlbmNvZGUgZm9yIHNvbWUgdGVzdCBpdGVtcy4KKyAgICAqLworCisgICAgLyoqKiBIRS1BQUMgc2VjdGlvbiAqKiovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICBzZixzZnNwLHNmLHNmc3Asbm5iLG5mbyxzYW1sLFNNLEZTKi8KKworICAgIC8qKiogbW9ubyAqKiovCisKKyAgICAvKiA4LzE2IGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDLCA4MDAwLCAxMDAwMCwgODAwMCwgMSwgNywgNiwgMTEsIDEwLCAxLCAwLCA2LCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQywgMTAwMDAsIDEyMDAwLCA4MDAwLCAxLCAxMSwgNywgMTMsIDEyLCAxLCAwLCA2LCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQywgMTIwMDAsIDE2MDAxLCA4MDAwLCAxLCAxNCwgMTAsIDEzLCAxMywgMSwgMCwgNiwgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUMsIDE2MDAwLCAyNDAwMCwgODAwMCwgMSwgMTQsIDEwLCAxNCwgMTQsIDIsIDAsIDMsIFNCUl9NT05PLCAyfSwKKyAgICB7Q09ERUNfQUFDLCAyNDAwMCwgMzIwMDAsIDgwMDAsIDEsIDE0LCAxMCwgMTQsIDE0LCAyLCAwLCAzLCBTQlJfTU9OTywgMn0sCisgICAge0NPREVDX0FBQywgMzIwMDAsIDQ4MDAxLCA4MDAwLCAxLCAxNCwgMTEsIDE1LCAxNSwgMiwgMCwgMywgU0JSX01PTk8sIDJ9LAorCisgICAgLyogMTEvMjIga0h6IGR1YWwgcmF0ZSAqLworICAgIHtDT0RFQ19BQUMsIDgwMDAsIDEwMDAwLCAxMTAyNSwgMSwgNSwgNCwgNiwgNiwgMSwgMCwgNiwgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUMsIDEwMDAwLCAxMjAwMCwgMTEwMjUsIDEsIDgsIDUsIDEyLCA5LCAxLCAwLCA2LCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQywgMTIwMDAsIDE2MDAwLCAxMTAyNSwgMSwgMTIsIDgsIDEzLCA4LCAxLCAwLCA2LCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQywgMTYwMDAsIDIwMDAwLCAxMTAyNSwgMSwgMTIsIDgsIDEzLCA4LCAxLCAwLCA2LCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQywgMjAwMDAsIDI0MDAxLCAxMTAyNSwgMSwgMTMsIDksIDEzLCA4LCAxLCAwLCA2LCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQywgMjQwMDAsIDMyMDAwLCAxMTAyNSwgMSwgMTQsIDEwLCAxNCwgOSwgMiwgMCwgMywgU0JSX01PTk8sIDJ9LAorICAgIHtDT0RFQ19BQUMsIDMyMDAwLCA0ODAwMCwgMTEwMjUsIDEsIDE1LCAxMSwgMTUsIDEwLCAyLCAwLCAzLCBTQlJfTU9OTywgMn0sCisgICAge0NPREVDX0FBQywgNDgwMDAsIDY0MDAxLCAxMTAyNSwgMSwgMTUsIDExLCAxNSwgMTAsIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKworICAgIC8qIDEyLzI0IGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDLCA4MDAwLCAxMDAwMCwgMTIwMDAsIDEsIDQsIDMsIDYsIDYsIDEsIDAsIDYsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDLCAxMDAwMCwgMTIwMDAsIDEyMDAwLCAxLCA3LCA0LCAxMSwgOCwgMSwgMCwgNiwgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUMsIDEyMDAwLCAxNjAwMCwgMTIwMDAsIDEsIDExLCA3LCAxMiwgOCwgMSwgMCwgNiwgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUMsIDE2MDAwLCAyMDAwMCwgMTIwMDAsIDEsIDExLCA3LCAxMiwgOCwgMSwgMCwgNiwgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUMsIDIwMDAwLCAyNDAwMSwgMTIwMDAsIDEsIDEyLCA4LCAxMiwgOCwgMSwgMCwgNiwgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUMsIDI0MDAwLCAzMjAwMCwgMTIwMDAsIDEsIDEzLCA5LCAxMywgOSwgMiwgMCwgMywgU0JSX01PTk8sIDJ9LAorICAgIHtDT0RFQ19BQUMsIDMyMDAwLCA0ODAwMCwgMTIwMDAsIDEsIDE0LCAxMCwgMTQsIDEwLCAyLCAwLCAzLCBTQlJfTU9OTywgMn0sCisgICAge0NPREVDX0FBQywgNDgwMDAsIDY0MDAxLCAxMjAwMCwgMSwgMTQsIDExLCAxNSwgMTEsIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKworICAgIC8qIDE2LzMyIGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDLCA4MDAwLCAxMDAwMCwgMTYwMDAsIDEsIDEsIDEsIDAsIDAsIDEsIDAsIDYsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDLCAxMDAwMCwgMTIwMDAsIDE2MDAwLCAxLCAyLCAxLCA2LCAwLCAxLCAwLCA2LCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQywgMTIwMDAsIDE2MDAwLCAxNjAwMCwgMSwgNCwgMiwgNiwgMCwgMSwgMCwgNiwgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUMsIDE2MDAwLCAxODAwMCwgMTYwMDAsIDEsIDQsIDIsIDgsIDMsIDEsIDAsIDYsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDLCAxODAwMCwgMjIwMDAsIDE2MDAwLCAxLCA2LCA1LCAxMSwgNywgMiwgMCwgNiwgU0JSX01PTk8sIDJ9LAorICAgIHtDT0RFQ19BQUMsIDIyMDAwLCAyODAwMCwgMTYwMDAsIDEsIDEwLCA5LCAxMiwgOCwgMiwgMCwgNiwgU0JSX01PTk8sIDJ9LAorICAgIHtDT0RFQ19BQUMsIDI4MDAwLCAzNjAwMCwgMTYwMDAsIDEsIDEyLCAxMiwgMTMsIDEzLCAyLCAwLCAzLCBTQlJfTU9OTywgMn0sCisgICAge0NPREVDX0FBQywgMzYwMDAsIDQ0MDAwLCAxNjAwMCwgMSwgMTQsIDE0LCAxMywgMTMsIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKyAgICB7Q09ERUNfQUFDLCA0NDAwMCwgNjQwMDEsIDE2MDAwLCAxLCAxNCwgMTQsIDEzLCAxMywgMiwgMCwgMywgU0JSX01PTk8sIDF9LAorCisgICAgLyogMjIuMDUvNDQuMSBrSHogZHVhbCByYXRlICovCisgICAgLyogeyBDT0RFQ19BQUMsICAgODAwMCwgMTEzNjksICAyMjA1MCwgMSwgIDEsIDEsIDEsIDEsICAxLCAwLCA2LAorICAgICAgIFNCUl9NT05PLCAzIH0sICovCisgICAge0NPREVDX0FBQywgMTEzNjksIDE2MDAwLCAyMjA1MCwgMSwgMywgMSwgNCwgNCwgMSwgMCwgNiwgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUMsIDE2MDAwLCAxODAwMCwgMjIwNTAsIDEsIDMsIDEsIDUsIDQsIDEsIDAsIDYsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDLCAxODAwMCwgMjIwMDAsIDIyMDUwLCAxLCA0LCA0LCA4LCA1LCAyLCAwLCA2LCBTQlJfTU9OTywgMn0sCisgICAge0NPREVDX0FBQywgMjIwMDAsIDI4MDAwLCAyMjA1MCwgMSwgNywgNiwgOCwgNiwgMiwgMCwgNiwgU0JSX01PTk8sIDJ9LAorICAgIHtDT0RFQ19BQUMsIDI4MDAwLCAzNjAwMCwgMjIwNTAsIDEsIDEwLCAxMCwgOSwgOSwgMiwgMCwgMywgU0JSX01PTk8sIDJ9LAorICAgIHtDT0RFQ19BQUMsIDM2MDAwLCA0NDAwMCwgMjIwNTAsIDEsIDExLCAxMSwgMTAsIDEwLCAyLCAwLCAzLCBTQlJfTU9OTywgMX0sCisgICAge0NPREVDX0FBQywgNDQwMDAsIDY0MDAxLCAyMjA1MCwgMSwgMTMsIDEzLCAxMiwgMTIsIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKworICAgIC8qIDI0LzQ4IGtIeiBkdWFsIHJhdGUgKi8KKyAgICAvKiB7IENPREVDX0FBQywgICA4MDAwLCAxMjAwMCwgIDI0MDAwLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDAsIDYsCisgICAgICAgU0JSX01PTk8sIDMgfSwgKi8KKyAgICB7Q09ERUNfQUFDLCAxMjAwMCwgMTYwMDAsIDI0MDAwLCAxLCAzLCAxLCA0LCA0LCAxLCAwLCA2LCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQywgMTYwMDAsIDE4MDAwLCAyNDAwMCwgMSwgMywgMSwgNSwgNCwgMSwgMCwgNiwgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUMsIDE4MDAwLCAyMjAwMCwgMjQwMDAsIDEsIDQsIDMsIDgsIDUsIDIsIDAsIDYsIFNCUl9NT05PLCAyfSwKKyAgICB7Q09ERUNfQUFDLCAyMjAwMCwgMjgwMDAsIDI0MDAwLCAxLCA3LCA2LCA4LCA2LCAyLCAwLCA2LCBTQlJfTU9OTywgMn0sCisgICAge0NPREVDX0FBQywgMjgwMDAsIDM2MDAwLCAyNDAwMCwgMSwgMTAsIDEwLCA5LCA5LCAyLCAwLCAzLCBTQlJfTU9OTywgMn0sCisgICAge0NPREVDX0FBQywgMzYwMDAsIDQ0MDAwLCAyNDAwMCwgMSwgMTEsIDExLCAxMCwgMTAsIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKyAgICB7Q09ERUNfQUFDLCA0NDAwMCwgNjQwMDEsIDI0MDAwLCAxLCAxMywgMTMsIDExLCAxMSwgMiwgMCwgMywgU0JSX01PTk8sIDF9LAorCisgICAgLyogMzIvNjQga0h6IGR1YWwgcmF0ZSAqLworICAgIHtDT0RFQ19BQUMsIDI0MDAwLCAzNjAwMCwgMzIwMDAsIDEsIDQsIDQsIDQsIDQsIDIsIDAsIDMsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDLCAzNjAwMCwgNjAwMDAsIDMyMDAwLCAxLCA3LCA3LCA2LCA2LCAyLCAwLCAzLCBTQlJfTU9OTywgMn0sCisgICAge0NPREVDX0FBQywgNjAwMDAsIDcyMDAwLCAzMjAwMCwgMSwgOSwgOSwgOCwgOCwgMiwgMCwgMywgU0JSX01PTk8sIDF9LAorICAgIHtDT0RFQ19BQUMsIDcyMDAwLCAxMDAwMDAsIDMyMDAwLCAxLCAxMSwgMTEsIDEwLCAxMCwgMiwgMCwgMywgU0JSX01PTk8sIDF9LAorICAgIHtDT0RFQ19BQUMsIDEwMDAwMCwgMTYwMDAxLCAzMjAwMCwgMSwgMTMsIDEzLCAxMSwgMTEsIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKworICAgIC8qIDQ0LjEvODguMiBrSHogZHVhbCByYXRlICovCisgICAge0NPREVDX0FBQywgMjQwMDAsIDM2MDAwLCA0NDEwMCwgMSwgNCwgNCwgNCwgNCwgMiwgMCwgMywgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUMsIDM2MDAwLCA2MDAwMCwgNDQxMDAsIDEsIDcsIDcsIDYsIDYsIDIsIDAsIDMsIFNCUl9NT05PLCAyfSwKKyAgICB7Q09ERUNfQUFDLCA2MDAwMCwgNzIwMDAsIDQ0MTAwLCAxLCA5LCA5LCA4LCA4LCAyLCAwLCAzLCBTQlJfTU9OTywgMX0sCisgICAge0NPREVDX0FBQywgNzIwMDAsIDEwMDAwMCwgNDQxMDAsIDEsIDExLCAxMSwgMTAsIDEwLCAyLCAwLCAzLCBTQlJfTU9OTywgMX0sCisgICAge0NPREVDX0FBQywgMTAwMDAwLCAxNjAwMDEsIDQ0MTAwLCAxLCAxMywgMTMsIDExLCAxMSwgMiwgMCwgMywgU0JSX01PTk8sIDF9LAorCisgICAgLyogNDgvOTYga0h6IGR1YWwgcmF0ZSAqLworICAgIHtDT0RFQ19BQUMsIDMyMDAwLCAzNjAwMCwgNDgwMDAsIDEsIDQsIDQsIDksIDksIDIsIDAsIDMsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDLCAzNjAwMCwgNjAwMDAsIDQ4MDAwLCAxLCA3LCA3LCAxMCwgMTAsIDIsIDAsIDMsIFNCUl9NT05PLCAyfSwKKyAgICB7Q09ERUNfQUFDLCA2MDAwMCwgNzIwMDAsIDQ4MDAwLCAxLCA5LCA5LCAxMCwgMTAsIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKyAgICB7Q09ERUNfQUFDLCA3MjAwMCwgMTAwMDAwLCA0ODAwMCwgMSwgMTEsIDExLCAxMSwgMTEsIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKyAgICB7Q09ERUNfQUFDLCAxMDAwMDAsIDE2MDAwMSwgNDgwMDAsIDEsIDEzLCAxMywgMTEsIDExLCAyLCAwLCAzLCBTQlJfTU9OTywgMX0sCisKKyAgICAvKioqIHN0ZXJlbyAqKiovCisgICAgLyogMDgvMTYga0h6IGR1YWwgcmF0ZSAqLworICAgIHtDT0RFQ19BQUMsIDE2MDAwLCAyNDAwMCwgODAwMCwgMiwgNiwgNiwgOSwgNywgMSwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLCAzfSwKKyAgICB7Q09ERUNfQUFDLCAyNDAwMCwgMjgwMDAsIDgwMDAsIDIsIDksIDksIDExLCA5LCAxLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDN9LAorICAgIHtDT0RFQ19BQUMsIDI4MDAwLCAzNjAwMCwgODAwMCwgMiwgMTEsIDksIDExLCA5LCAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDJ9LAorICAgIHtDT0RFQ19BQUMsIDM2MDAwLCA0NDAwMCwgODAwMCwgMiwgMTMsIDExLCAxMywgMTEsIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgMn0sCisgICAge0NPREVDX0FBQywgNDQwMDAsIDUyMDAwLCA4MDAwLCAyLCAxNCwgMTIsIDEzLCAxMiwgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAyfSwKKyAgICB7Q09ERUNfQUFDLCA1MjAwMCwgNjAwMDAsIDgwMDAsIDIsIDE0LCAxNCwgMTMsIDEzLCAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDF9LAorICAgIHtDT0RFQ19BQUMsIDYwMDAwLCA3NjAwMCwgODAwMCwgMiwgMTQsIDE0LCAxMywgMTMsIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwKKyAgICAgMX0sCisgICAge0NPREVDX0FBQywgNzYwMDAsIDEyODAwMSwgODAwMCwgMiwgMTQsIDE0LCAxMywgMTMsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisKKyAgICAvKiAxMS8yMiBrSHogZHVhbCByYXRlICovCisgICAge0NPREVDX0FBQywgMTYwMDAsIDI0MDAwLCAxMTAyNSwgMiwgNywgNSwgOSwgNywgMSwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAzfSwKKyAgICB7Q09ERUNfQUFDLCAyNDAwMCwgMjgwMDAsIDExMDI1LCAyLCAxMCwgOCwgMTAsIDgsIDEsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgM30sCisgICAge0NPREVDX0FBQywgMjgwMDAsIDM2MDAwLCAxMTAyNSwgMiwgMTIsIDgsIDEyLCA4LCAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDJ9LAorICAgIHtDT0RFQ19BQUMsIDM2MDAwLCA0NDAwMCwgMTEwMjUsIDIsIDEzLCA5LCAxMywgOSwgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAyfSwKKyAgICB7Q09ERUNfQUFDLCA0NDAwMCwgNTIwMDAsIDExMDI1LCAyLCAxNCwgMTEsIDEzLCAxMSwgMiwgMCwgLTMsCisgICAgIFNCUl9TV0lUQ0hfTFJDLCAyfSwKKyAgICB7Q09ERUNfQUFDLCA1MjAwMCwgNjAwMDAsIDExMDI1LCAyLCAxNSwgMTUsIDEzLCAxMywgMywgMCwgLTMsCisgICAgIFNCUl9TV0lUQ0hfTFJDLCAxfSwKKyAgICB7Q09ERUNfQUFDLCA2MDAwMCwgNzYwMDAsIDExMDI1LCAyLCAxNSwgMTUsIDEzLCAxMywgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKyAgICB7Q09ERUNfQUFDLCA3NjAwMCwgMTI4MDAxLCAxMTAyNSwgMiwgMTUsIDE1LCAxMywgMTMsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisKKyAgICAvKiAxMi8yNCBrSHogZHVhbCByYXRlICovCisgICAge0NPREVDX0FBQywgMTYwMDAsIDI0MDAwLCAxMjAwMCwgMiwgNiwgNCwgOSwgNywgMSwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAzfSwKKyAgICB7Q09ERUNfQUFDLCAyNDAwMCwgMjgwMDAsIDEyMDAwLCAyLCA5LCA3LCAxMCwgOCwgMSwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAzfSwKKyAgICB7Q09ERUNfQUFDLCAyODAwMCwgMzYwMDAsIDEyMDAwLCAyLCAxMSwgNywgMTIsIDgsIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgMn0sCisgICAge0NPREVDX0FBQywgMzYwMDAsIDQ0MDAwLCAxMjAwMCwgMiwgMTIsIDksIDEyLCA5LCAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDJ9LAorICAgIHtDT0RFQ19BQUMsIDQ0MDAwLCA1MjAwMCwgMTIwMDAsIDIsIDEzLCAxMiwgMTMsIDEyLCAyLCAwLCAtMywKKyAgICAgU0JSX1NXSVRDSF9MUkMsIDJ9LAorICAgIHtDT0RFQ19BQUMsIDUyMDAwLCA2MDAwMCwgMTIwMDAsIDIsIDE0LCAxNCwgMTMsIDEzLCAzLCAwLCAtMywKKyAgICAgU0JSX1NXSVRDSF9MUkMsIDF9LAorICAgIHtDT0RFQ19BQUMsIDYwMDAwLCA3NjAwMCwgMTIwMDAsIDIsIDE0LCAxNCwgMTMsIDEzLCAzLCAwLCAtMywKKyAgICAgU0JSX0xFRlRfUklHSFQsIDF9LAorICAgIHtDT0RFQ19BQUMsIDc2MDAwLCAxMjgwMDEsIDEyMDAwLCAyLCAxNCwgMTQsIDEzLCAxMywgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKworICAgIC8qIDE2LzMyIGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDLCAxNjAwMCwgMjQwMDAsIDE2MDAwLCAyLCA0LCAyLCAxLCAwLCAxLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDN9LAorICAgIHtDT0RFQ19BQUMsIDI0MDAwLCAyODAwMCwgMTYwMDAsIDIsIDgsIDcsIDEwLCA4LCAxLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDN9LAorICAgIHtDT0RFQ19BQUMsIDI4MDAwLCAzNjAwMCwgMTYwMDAsIDIsIDEwLCA5LCAxMiwgMTEsIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgMn0sCisgICAge0NPREVDX0FBQywgMzYwMDAsIDQ0MDAwLCAxNjAwMCwgMiwgMTMsIDEzLCAxMywgMTMsIDIsIDAsIC0zLAorICAgICBTQlJfU1dJVENIX0xSQywgMn0sCisgICAge0NPREVDX0FBQywgNDQwMDAsIDUyMDAwLCAxNjAwMCwgMiwgMTQsIDE0LCAxMywgMTMsIDIsIDAsIC0zLAorICAgICBTQlJfU1dJVENIX0xSQywgMn0sCisgICAge0NPREVDX0FBQywgNTIwMDAsIDYwMDAwLCAxNjAwMCwgMiwgMTQsIDE0LCAxMywgMTMsIDMsIDAsIC0zLAorICAgICBTQlJfU1dJVENIX0xSQywgMX0sCisgICAge0NPREVDX0FBQywgNjAwMDAsIDc2MDAwLCAxNjAwMCwgMiwgMTQsIDE0LCAxMywgMTMsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisgICAge0NPREVDX0FBQywgNzYwMDAsIDEyODAwMSwgMTYwMDAsIDIsIDE0LCAxNCwgMTMsIDEzLCAzLCAwLCAtMywKKyAgICAgU0JSX0xFRlRfUklHSFQsIDF9LAorCisgICAgLyogMjIuMDUvNDQuMSBrSHogZHVhbCByYXRlICovCisgICAge0NPREVDX0FBQywgMTYwMDAsIDI0MDAwLCAyMjA1MCwgMiwgMiwgMSwgMSwgMCwgMSwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAzfSwKKyAgICB7Q09ERUNfQUFDLCAyNDAwMCwgMjgwMDAsIDIyMDUwLCAyLCA1LCA0LCA2LCA1LCAxLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDN9LAorICAgIHtDT0RFQ19BQUMsIDI4MDAwLCAzMjAwMCwgMjIwNTAsIDIsIDUsIDQsIDgsIDcsIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgMn0sCisgICAge0NPREVDX0FBQywgMzIwMDAsIDM2MDAwLCAyMjA1MCwgMiwgNywgNiwgOCwgNywgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAyfSwKKyAgICB7Q09ERUNfQUFDLCAzNjAwMCwgNDQwMDAsIDIyMDUwLCAyLCAxMCwgMTAsIDksIDksIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgMn0sCisgICAge0NPREVDX0FBQywgNDQwMDAsIDUyMDAwLCAyMjA1MCwgMiwgMTIsIDEyLCA5LCA5LCAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDJ9LAorICAgIHtDT0RFQ19BQUMsIDUyMDAwLCA2MDAwMCwgMjIwNTAsIDIsIDEzLCAxMywgMTAsIDEwLCAzLCAwLCAtMywKKyAgICAgU0JSX1NXSVRDSF9MUkMsIDF9LAorICAgIHtDT0RFQ19BQUMsIDYwMDAwLCA3NjAwMCwgMjIwNTAsIDIsIDE0LCAxNCwgMTIsIDEyLCAzLCAwLCAtMywKKyAgICAgU0JSX0xFRlRfUklHSFQsIDF9LAorICAgIHtDT0RFQ19BQUMsIDc2MDAwLCAxMjgwMDEsIDIyMDUwLCAyLCAxNCwgMTQsIDEyLCAxMiwgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKworICAgIC8qIDI0LzQ4IGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDLCAxNjAwMCwgMjQwMDAsIDI0MDAwLCAyLCAyLCAxLCAxLCAwLCAxLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDN9LAorICAgIHtDT0RFQ19BQUMsIDI0MDAwLCAyODAwMCwgMjQwMDAsIDIsIDUsIDUsIDYsIDYsIDEsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgM30sCisgICAge0NPREVDX0FBQywgMjgwMDAsIDM2MDAwLCAyNDAwMCwgMiwgNywgNiwgOCwgNywgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAyfSwKKyAgICB7Q09ERUNfQUFDLCAzNjAwMCwgNDQwMDAsIDI0MDAwLCAyLCAxMCwgMTAsIDksIDksIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgMn0sCisgICAge0NPREVDX0FBQywgNDQwMDAsIDUyMDAwLCAyNDAwMCwgMiwgMTIsIDEyLCA5LCA5LCAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDJ9LAorICAgIHtDT0RFQ19BQUMsIDUyMDAwLCA2MDAwMCwgMjQwMDAsIDIsIDEzLCAxMywgMTAsIDEwLCAzLCAwLCAtMywKKyAgICAgU0JSX1NXSVRDSF9MUkMsIDF9LAorICAgIHtDT0RFQ19BQUMsIDYwMDAwLCA3NjAwMCwgMjQwMDAsIDIsIDE0LCAxNCwgMTIsIDEyLCAzLCAwLCAtMywKKyAgICAgU0JSX0xFRlRfUklHSFQsIDF9LAorICAgIHtDT0RFQ19BQUMsIDc2MDAwLCAxMjgwMDEsIDI0MDAwLCAyLCAxNCwgMTQsIDEyLCAxMiwgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKworICAgIC8qIDMyLzY0IGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDLCAzMjAwMCwgNjAwMDAsIDMyMDAwLCAyLCA0LCA0LCA0LCA0LCAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDN9LAorICAgIHtDT0RFQ19BQUMsIDYwMDAwLCA4MDAwMCwgMzIwMDAsIDIsIDcsIDcsIDYsIDYsIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgMn0sCisgICAge0NPREVDX0FBQywgODAwMDAsIDExMjAwMCwgMzIwMDAsIDIsIDksIDksIDgsIDgsIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwKKyAgICAgMX0sCisgICAge0NPREVDX0FBQywgMTEyMDAwLCAxNDQwMDAsIDMyMDAwLCAyLCAxMSwgMTEsIDEwLCAxMCwgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKyAgICB7Q09ERUNfQUFDLCAxNDQwMDAsIDI1NjAwMSwgMzIwMDAsIDIsIDEzLCAxMywgMTEsIDExLCAzLCAwLCAtMywKKyAgICAgU0JSX0xFRlRfUklHSFQsIDF9LAorCisgICAgLyogNDQuMS84OC4yIGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDLCAzMjAwMCwgNjAwMDAsIDQ0MTAwLCAyLCA0LCA0LCA0LCA0LCAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDN9LAorICAgIHtDT0RFQ19BQUMsIDYwMDAwLCA4MDAwMCwgNDQxMDAsIDIsIDcsIDcsIDYsIDYsIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgMn0sCisgICAge0NPREVDX0FBQywgODAwMDAsIDExMjAwMCwgNDQxMDAsIDIsIDksIDksIDgsIDgsIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwKKyAgICAgMX0sCisgICAge0NPREVDX0FBQywgMTEyMDAwLCAxNDQwMDAsIDQ0MTAwLCAyLCAxMSwgMTEsIDEwLCAxMCwgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKyAgICB7Q09ERUNfQUFDLCAxNDQwMDAsIDI1NjAwMSwgNDQxMDAsIDIsIDEzLCAxMywgMTEsIDExLCAzLCAwLCAtMywKKyAgICAgU0JSX0xFRlRfUklHSFQsIDF9LAorCisgICAgLyogNDgvOTYga0h6IGR1YWwgcmF0ZSAqLworICAgIHtDT0RFQ19BQUMsIDM2MDAwLCA2MDAwMCwgNDgwMDAsIDIsIDQsIDQsIDksIDksIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgM30sCisgICAge0NPREVDX0FBQywgNjAwMDAsIDgwMDAwLCA0ODAwMCwgMiwgNywgNywgOSwgOSwgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAyfSwKKyAgICB7Q09ERUNfQUFDLCA4MDAwMCwgMTEyMDAwLCA0ODAwMCwgMiwgOSwgOSwgMTAsIDEwLCAzLCAwLCAtMywgU0JSX0xFRlRfUklHSFQsCisgICAgIDF9LAorICAgIHtDT0RFQ19BQUMsIDExMjAwMCwgMTQ0MDAwLCA0ODAwMCwgMiwgMTEsIDExLCAxMSwgMTEsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisgICAge0NPREVDX0FBQywgMTQ0MDAwLCAyNTYwMDEsIDQ4MDAwLCAyLCAxMywgMTMsIDExLCAxMSwgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKworICAgIC8qKiBBQUMgTE9XIERFTEFZIFNFQ1RJT04gKiovCisKKyAgICAvKiAyNCBrSHogZHVhbCByYXRlIC0gMTJrSHogc2luZ2xlcmF0ZSBpcyBub3QgYWxsb3dlZCAoZGVhY3RpdmF0ZWQgaW4KKyAgICAgICBGREtzYnJFbmNfSXNTYnJTZXR0aW5nQXZhaWwoKSkgKi8KKyAgICB7Q09ERUNfQUFDTEQsIDgwMDAsIDMyMDAwLCAxMjAwMCwgMSwgMSwgMSwgMCwgMCwgMSwgMCwgNiwgU0JSX01PTk8sIDN9LAorCisgICAgLyoqKiBtb25vICoqKi8KKyAgICAvKiAxNi8zMiBrSHogZHVhbCByYXRlICovCisgICAge0NPREVDX0FBQ0xELCAxNjAwMCwgMTgwMDAsIDE2MDAwLCAxLCA0LCA1LCA5LCA3LCAxLCAwLCA2LCBTQlJfTU9OTywgM30sCisgICAge0NPREVDX0FBQ0xELCAxODAwMCwgMjIwMDAsIDE2MDAwLCAxLCA3LCA3LCAxMiwgMTIsIDEsIDYsIDksIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDTEQsIDIyMDAwLCAyODAwMCwgMTYwMDAsIDEsIDYsIDYsIDksIDksIDIsIDMsIDYsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDTEQsIDI4MDAwLCAzNjAwMCwgMTYwMDAsIDEsIDgsIDgsIDEyLCA3LCAyLCA5LCAxMiwgU0JSX01PTk8sIDN9LAorICAgIHtDT0RFQ19BQUNMRCwgMzYwMDAsIDQ0MDAwLCAxNjAwMCwgMSwgMTAsIDE0LCAxMiwgMTMsIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKyAgICB7Q09ERUNfQUFDTEQsIDQ0MDAwLCA2NDAwMSwgMTYwMDAsIDEsIDExLCAxNCwgMTMsIDEzLCAyLCAwLCAzLCBTQlJfTU9OTywgMX0sCisKKyAgICAvKiAyMi4wNS80NC4xIGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDTEQsIDE4MDAwLCAyMjAwMCwgMjIwNTAsIDEsIDQsIDQsIDUsIDUsIDIsIDAsIDYsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDTEQsIDIyMDAwLCAyODAwMCwgMjIwNTAsIDEsIDUsIDUsIDYsIDYsIDIsIDAsIDYsIFNCUl9NT05PLCAyfSwKKyAgICB7Q09ERUNfQUFDTEQsIDI4MDAwLCAzNjAwMCwgMjIwNTAsIDEsIDcsIDgsIDgsIDgsIDIsIDAsIDMsIFNCUl9NT05PLCAyfSwKKyAgICB7Q09ERUNfQUFDTEQsIDM2MDAwLCA0NDAwMCwgMjIwNTAsIDEsIDksIDksIDksIDksIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKyAgICB7Q09ERUNfQUFDTEQsIDQ0MDAwLCA1MjAwMCwgMjIwNTAsIDEsIDEyLCAxMSwgMTEsIDExLCAyLCAwLCAzLCBTQlJfTU9OTywgMX0sCisgICAge0NPREVDX0FBQ0xELCA1MjAwMCwgNjQwMDEsIDIyMDUwLCAxLCAxMywgMTEsIDExLCAxMCwgMiwgMCwgMywgU0JSX01PTk8sIDF9LAorCisgICAgLyogMjQvNDgga0h6IGR1YWwgcmF0ZSAqLworICAgIHtDT0RFQ19BQUNMRCwgMjAwMDAsIDIyMDAwLCAyNDAwMCwgMSwgMywgNCwgOCwgOCwgMiwgMCwgNiwgU0JSX01PTk8sIDJ9LAorICAgIHtDT0RFQ19BQUNMRCwgMjIwMDAsIDI4MDAwLCAyNDAwMCwgMSwgMywgOCwgOCwgNywgMiwgMCwgMywgU0JSX01PTk8sIDJ9LAorICAgIHtDT0RFQ19BQUNMRCwgMjgwMDAsIDM2MDAwLCAyNDAwMCwgMSwgNCwgOCwgOCwgNywgMiwgMCwgMywgU0JSX01PTk8sIDJ9LAorICAgIHtDT0RFQ19BQUNMRCwgMzYwMDAsIDU2MDAwLCAyNDAwMCwgMSwgOCwgOSwgOSwgOCwgMiwgMCwgMywgU0JSX01PTk8sIDF9LAorICAgIHtDT0RFQ19BQUNMRCwgNTYwMDAsIDY0MDAxLCAyNDAwMCwgMSwgMTMsIDExLCAxMSwgMTAsIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKworICAgIC8qIDMyLzY0IGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDTEQsIDI0MDAwLCAzNjAwMCwgMzIwMDAsIDEsIDQsIDQsIDQsIDQsIDIsIDAsIDMsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDTEQsIDM2MDAwLCA2MDAwMCwgMzIwMDAsIDEsIDcsIDcsIDYsIDYsIDIsIDAsIDMsIFNCUl9NT05PLCAyfSwKKyAgICB7Q09ERUNfQUFDTEQsIDYwMDAwLCA3MjAwMCwgMzIwMDAsIDEsIDksIDksIDgsIDgsIDIsIDAsIDMsIFNCUl9NT05PLCAxfSwKKyAgICB7Q09ERUNfQUFDTEQsIDcyMDAwLCAxMDAwMDAsIDMyMDAwLCAxLCAxMSwgMTEsIDEwLCAxMCwgMiwgMCwgMywgU0JSX01PTk8sCisgICAgIDF9LAorICAgIHtDT0RFQ19BQUNMRCwgMTAwMDAwLCAxNjAwMDEsIDMyMDAwLCAxLCAxMywgMTMsIDExLCAxMSwgMiwgMCwgMywgU0JSX01PTk8sCisgICAgIDF9LAorCisgICAgLyogNDQvODgga0h6IGR1YWwgcmF0ZSAqLworICAgIHtDT0RFQ19BQUNMRCwgMzYwMDAsIDYwMDAwLCA0NDEwMCwgMSwgOCwgNywgNiwgOSwgMiwgMCwgMywgU0JSX01PTk8sIDJ9LAorICAgIHtDT0RFQ19BQUNMRCwgNjAwMDAsIDcyMDAwLCA0NDEwMCwgMSwgOSwgOSwgMTAsIDEwLCAyLCAwLCAzLCBTQlJfTU9OTywgMX0sCisgICAge0NPREVDX0FBQ0xELCA3MjAwMCwgMTAwMDAwLCA0NDEwMCwgMSwgMTEsIDExLCAxMSwgMTEsIDIsIDAsIDMsIFNCUl9NT05PLAorICAgICAxfSwKKyAgICB7Q09ERUNfQUFDTEQsIDEwMDAwMCwgMTYwMDAxLCA0NDEwMCwgMSwgMTMsIDEzLCAxMSwgMTEsIDIsIDAsIDMsIFNCUl9NT05PLAorICAgICAxfSwKKworICAgIC8qIDQ4Lzk2IGtIeiBkdWFsIHJhdGUgKi8gLyogMzIgYW5kIDQwa2JwcyBsaW5lIHR1bmVkIGZvciBkdWFsLXJhdGUgU0JSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB7Q09ERUNfQUFDTEQsIDM2MDAwLCA2MDAwMCwgNDgwMDAsIDEsIDQsIDcsIDQsIDQsIDIsIDAsIDMsIFNCUl9NT05PLCAzfSwKKyAgICB7Q09ERUNfQUFDTEQsIDYwMDAwLCA3MjAwMCwgNDgwMDAsIDEsIDksIDksIDEwLCAxMCwgMiwgMCwgMywgU0JSX01PTk8sIDF9LAorICAgIHtDT0RFQ19BQUNMRCwgNzIwMDAsIDEwMDAwMCwgNDgwMDAsIDEsIDExLCAxMSwgMTEsIDExLCAyLCAwLCAzLCBTQlJfTU9OTywKKyAgICAgMX0sCisgICAge0NPREVDX0FBQ0xELCAxMDAwMDAsIDE2MDAwMSwgNDgwMDAsIDEsIDEzLCAxMywgMTEsIDExLCAyLCAwLCAzLCBTQlJfTU9OTywKKyAgICAgMX0sCisKKyAgICAvKioqIHN0ZXJlbyAqKiovCisgICAgLyogMTYvMzIga0h6IGR1YWwgcmF0ZSAqLworICAgIHtDT0RFQ19BQUNMRCwgMzIwMDAsIDM2MDAwLCAxNjAwMCwgMiwgMTAsIDksIDEyLCAxMSwgMiwgMCwgLTMsCisgICAgIFNCUl9TV0lUQ0hfTFJDLCAyfSwKKyAgICB7Q09ERUNfQUFDTEQsIDM2MDAwLCA0NDAwMCwgMTYwMDAsIDIsIDEzLCAxMywgMTMsIDEzLCAyLCAwLCAtMywKKyAgICAgU0JSX1NXSVRDSF9MUkMsIDJ9LAorICAgIHtDT0RFQ19BQUNMRCwgNDQwMDAsIDUyMDAwLCAxNjAwMCwgMiwgMTAsIDksIDExLCA5LCAyLCAwLCAtMywKKyAgICAgU0JSX1NXSVRDSF9MUkMsIDJ9LAorICAgIHtDT0RFQ19BQUNMRCwgNTIwMDAsIDYwMDAwLCAxNjAwMCwgMiwgMTQsIDE0LCAxMywgMTMsIDMsIDAsIC0zLAorICAgICBTQlJfU1dJVENIX0xSQywgMX0sCisgICAge0NPREVDX0FBQ0xELCA2MDAwMCwgNzYwMDAsIDE2MDAwLCAyLCAxNCwgMTQsIDEzLCAxMywgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKyAgICB7Q09ERUNfQUFDTEQsIDc2MDAwLCAxMjgwMDEsIDE2MDAwLCAyLCAxNCwgMTQsIDEzLCAxMywgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKworICAgIC8qIDIyLjA1LzQ0LjEga0h6IGR1YWwgcmF0ZSAqLworICAgIHtDT0RFQ19BQUNMRCwgMzIwMDAsIDM2MDAwLCAyMjA1MCwgMiwgNSwgNCwgNywgNiwgMiwgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAyfSwKKyAgICB7Q09ERUNfQUFDTEQsIDM2MDAwLCA0NDAwMCwgMjIwNTAsIDIsIDUsIDgsIDgsIDgsIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgMn0sCisgICAge0NPREVDX0FBQ0xELCA0NDAwMCwgNTIwMDAsIDIyMDUwLCAyLCA3LCAxMCwgOCwgOCwgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAyfSwKKyAgICB7Q09ERUNfQUFDTEQsIDUyMDAwLCA2MDAwMCwgMjIwNTAsIDIsIDksIDExLCA5LCA5LCAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDF9LAorICAgIHtDT0RFQ19BQUNMRCwgNjAwMDAsIDc2MDAwLCAyMjA1MCwgMiwgMTAsIDEyLCAxMCwgMTEsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisgICAge0NPREVDX0FBQ0xELCA3NjAwMCwgODIwMDAsIDIyMDUwLCAyLCAxMiwgMTIsIDExLCAxMSwgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKyAgICB7Q09ERUNfQUFDTEQsIDgyMDAwLCAxMjgwMDEsIDIyMDUwLCAyLCAxMywgMTIsIDExLCAxMSwgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKworICAgIC8qIDI0LzQ4IGtIeiBkdWFsIHJhdGUgKi8KKyAgICB7Q09ERUNfQUFDTEQsIDMyMDAwLCAzNjAwMCwgMjQwMDAsIDIsIDUsIDQsIDcsIDYsIDIsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgMn0sCisgICAge0NPREVDX0FBQ0xELCAzNjAwMCwgNDQwMDAsIDI0MDAwLCAyLCA0LCA4LCA4LCA4LCAyLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDJ9LAorICAgIHtDT0RFQ19BQUNMRCwgNDQwMDAsIDUyMDAwLCAyNDAwMCwgMiwgNiwgMTAsIDgsIDgsIDMsIDAsIC0zLCBTQlJfU1dJVENIX0xSQywKKyAgICAgMn0sCisgICAge0NPREVDX0FBQ0xELCA1MjAwMCwgNjAwMDAsIDI0MDAwLCAyLCA5LCAxMSwgOSwgOSwgMywgMCwgLTMsIFNCUl9TV0lUQ0hfTFJDLAorICAgICAxfSwKKyAgICB7Q09ERUNfQUFDTEQsIDYwMDAwLCA3NjAwMCwgMjQwMDAsIDIsIDExLCAxMiwgMTAsIDExLCAzLCAwLCAtMywKKyAgICAgU0JSX0xFRlRfUklHSFQsIDF9LAorICAgIHtDT0RFQ19BQUNMRCwgNzYwMDAsIDg4MDAwLCAyNDAwMCwgMiwgMTIsIDEzLCAxMSwgMTEsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisgICAge0NPREVDX0FBQ0xELCA4ODAwMCwgMTI4MDAxLCAyNDAwMCwgMiwgMTMsIDEzLCAxMSwgMTEsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisKKyAgICAvKiAzMi82NCBrSHogZHVhbCByYXRlICovCisgICAge0NPREVDX0FBQ0xELCA2MDAwMCwgODAwMDAsIDMyMDAwLCAyLCA3LCA3LCA2LCA2LCAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDJ9LAorICAgIHtDT0RFQ19BQUNMRCwgODAwMDAsIDExMjAwMCwgMzIwMDAsIDIsIDksIDksIDgsIDgsIDMsIDAsIC0zLCBTQlJfTEVGVF9SSUdIVCwKKyAgICAgMX0sCisgICAge0NPREVDX0FBQ0xELCAxMTIwMDAsIDE0NDAwMCwgMzIwMDAsIDIsIDExLCAxMSwgMTAsIDEwLCAzLCAwLCAtMywKKyAgICAgU0JSX0xFRlRfUklHSFQsIDF9LAorICAgIHtDT0RFQ19BQUNMRCwgMTQ0MDAwLCAyNTYwMDEsIDMyMDAwLCAyLCAxMywgMTMsIDExLCAxMSwgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKworICAgIC8qIDQ0LjEvODguMiBrSHogZHVhbCByYXRlICovCisgICAge0NPREVDX0FBQ0xELCA2MDAwMCwgODAwMDAsIDQ0MTAwLCAyLCA3LCA3LCA2LCA2LCAzLCAwLCAtMywgU0JSX1NXSVRDSF9MUkMsCisgICAgIDJ9LAorICAgIHtDT0RFQ19BQUNMRCwgODAwMDAsIDExMjAwMCwgNDQxMDAsIDIsIDEwLCAxMCwgOCwgOCwgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKyAgICB7Q09ERUNfQUFDTEQsIDExMjAwMCwgMTQ0MDAwLCA0NDEwMCwgMiwgMTIsIDEyLCAxMCwgMTAsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisgICAge0NPREVDX0FBQ0xELCAxNDQwMDAsIDI1NjAwMSwgNDQxMDAsIDIsIDEzLCAxMywgMTEsIDExLCAzLCAwLCAtMywKKyAgICAgU0JSX0xFRlRfUklHSFQsIDF9LAorCisgICAgLyogNDgvOTYga0h6IGR1YWwgcmF0ZSAqLworICAgIHtDT0RFQ19BQUNMRCwgNjAwMDAsIDgwMDAwLCA0ODAwMCwgMiwgNywgNywgMTAsIDEwLCAyLCAwLCAtMywKKyAgICAgU0JSX1NXSVRDSF9MUkMsIDJ9LAorICAgIHtDT0RFQ19BQUNMRCwgODAwMDAsIDExMjAwMCwgNDgwMDAsIDIsIDksIDksIDEwLCAxMCwgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKyAgICB7Q09ERUNfQUFDTEQsIDExMjAwMCwgMTQ0MDAwLCA0ODAwMCwgMiwgMTEsIDExLCAxMSwgMTEsIDMsIDAsIC0zLAorICAgICBTQlJfTEVGVF9SSUdIVCwgMX0sCisgICAge0NPREVDX0FBQ0xELCAxNDQwMDAsIDE3NjAwMCwgNDgwMDAsIDIsIDEyLCAxMiwgMTEsIDExLCAzLCAwLCAtMywKKyAgICAgU0JSX0xFRlRfUklHSFQsIDF9LAorICAgIHtDT0RFQ19BQUNMRCwgMTc2MDAwLCAyNTYwMDEsIDQ4MDAwLCAyLCAxMywgMTMsIDExLCAxMSwgMywgMCwgLTMsCisgICAgIFNCUl9MRUZUX1JJR0hULCAxfSwKKworfTsKKworY29uc3QgaW50IHNiclR1bmluZ1RhYmxlU2l6ZSA9CisgICAgc2l6ZW9mKHNiclR1bmluZ1RhYmxlKSAvIHNpemVvZihzYnJUdW5pbmdUYWJsZVswXSk7CisKK2NvbnN0IHBzVHVuaW5nVGFibGVfdCBwc1R1bmluZ1RhYmxlWzRdID0geworICAgIHs4MDAwLCAyMjAwMCwgUFNFTkNfU1RFUkVPX0JBTkRTXzEwLCBQU0VOQ19ORU5WXzEsCisgICAgIEZMMkZYQ09OU1RfREJMKDMuMGYgLyA0LjBmKX0sCisgICAgezIyMDAwLCAyODAwMCwgUFNFTkNfU1RFUkVPX0JBTkRTXzIwLCBQU0VOQ19ORU5WXzEsCisgICAgIEZMMkZYQ09OU1RfREJMKDIuMGYgLyA0LjBmKX0sCisgICAgezI4MDAwLCAzNjAwMCwgUFNFTkNfU1RFUkVPX0JBTkRTXzIwLCBQU0VOQ19ORU5WXzIsCisgICAgIEZMMkZYQ09OU1RfREJMKDEuNWYgLyA0LjBmKX0sCisgICAgezM2MDAwLCAxNjAwMDEsIFBTRU5DX1NURVJFT19CQU5EU18yMCwgUFNFTkNfTkVOVl80LAorICAgICBGTDJGWENPTlNUX0RCTCgxLjFmIC8gNC4wZil9LAorfTsKKworLy9AfQpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9zYnJlbmNfcm9tLmggYi9saWJTQlJlbmMvc3JjL3NicmVuY19yb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGMxZmI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliU0JSZW5jL3NyYy9zYnJlbmNfcm9tLmgKQEAgLTAsMCArMSwxNDUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyohCitcZmlsZQorXGJyaWVmIERlY2xhcmF0aW9uIG9mIGNvbnN0YW50IHRhYmxlcworJFJldmlzaW9uOiA5Mjc5MCAkCisqLworI2lmbmRlZiBTQlJFTkNfUk9NX0gKKyNkZWZpbmUgU0JSRU5DX1JPTV9ICisKKyNpbmNsdWRlICJzYnJfZGVmLmgiCisjaW5jbHVkZSAic2JyX2VuY29kZXIuaCIKKworI2luY2x1ZGUgInBzX21haW4uaCIKKworLyoKKyAgaHVmZm1hbiB0YWJsZXMKKyovCitleHRlcm4gY29uc3QgSU5UIHZfSHVmZl9lbnZlbG9wZUxldmVsQzEwVFsxMjFdOworZXh0ZXJuIGNvbnN0IFVDSEFSIHZfSHVmZl9lbnZlbG9wZUxldmVsTDEwVFsxMjFdOworZXh0ZXJuIGNvbnN0IElOVCB2X0h1ZmZfZW52ZWxvcGVMZXZlbEMxMEZbMTIxXTsKK2V4dGVybiBjb25zdCBVQ0hBUiB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMEZbMTIxXTsKK2V4dGVybiBjb25zdCBJTlQgYm9va1NickVudkJhbGFuY2VDMTBUWzQ5XTsKK2V4dGVybiBjb25zdCBVQ0hBUiBib29rU2JyRW52QmFsYW5jZUwxMFRbNDldOworZXh0ZXJuIGNvbnN0IElOVCBib29rU2JyRW52QmFsYW5jZUMxMEZbNDldOworZXh0ZXJuIGNvbnN0IFVDSEFSIGJvb2tTYnJFbnZCYWxhbmNlTDEwRls0OV07CitleHRlcm4gY29uc3QgSU5UIHZfSHVmZl9lbnZlbG9wZUxldmVsQzExVFs2M107CitleHRlcm4gY29uc3QgVUNIQVIgdl9IdWZmX2VudmVsb3BlTGV2ZWxMMTFUWzYzXTsKK2V4dGVybiBjb25zdCBJTlQgdl9IdWZmX2VudmVsb3BlTGV2ZWxDMTFGWzYzXTsKK2V4dGVybiBjb25zdCBVQ0hBUiB2X0h1ZmZfZW52ZWxvcGVMZXZlbEwxMUZbNjNdOworZXh0ZXJuIGNvbnN0IElOVCBib29rU2JyRW52QmFsYW5jZUMxMVRbMjVdOworZXh0ZXJuIGNvbnN0IFVDSEFSIGJvb2tTYnJFbnZCYWxhbmNlTDExVFsyNV07CitleHRlcm4gY29uc3QgSU5UIGJvb2tTYnJFbnZCYWxhbmNlQzExRlsyNV07CitleHRlcm4gY29uc3QgVUNIQVIgYm9va1NickVudkJhbGFuY2VMMTFGWzI1XTsKK2V4dGVybiBjb25zdCBJTlQgdl9IdWZmX05vaXNlTGV2ZWxDMTFUWzYzXTsKK2V4dGVybiBjb25zdCBVQ0hBUiB2X0h1ZmZfTm9pc2VMZXZlbEwxMVRbNjNdOworZXh0ZXJuIGNvbnN0IElOVCBib29rU2JyTm9pc2VCYWxhbmNlQzExVFsyNV07CitleHRlcm4gY29uc3QgVUNIQVIgYm9va1Nick5vaXNlQmFsYW5jZUwxMVRbMjVdOworCitleHRlcm4gY29uc3Qgc2JyVHVuaW5nVGFibGVfdCBzYnJUdW5pbmdUYWJsZVtdOworZXh0ZXJuIGNvbnN0IGludCBzYnJUdW5pbmdUYWJsZVNpemU7CisKK2V4dGVybiBjb25zdCBwc1R1bmluZ1RhYmxlX3QgcHNUdW5pbmdUYWJsZVs0XTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3Rvbl9jb3JyLmNwcCBiL2xpYlNCUmVuYy9zcmMvdG9uX2NvcnIuY3BwCmluZGV4IGFmNWFmYmEuLjFjMDUwZTIgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvdG9uX2NvcnIuY3BwCisrKyBiL2xpYlNCUmVuYy9zcmMvdG9uX2NvcnIuY3BwCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDIyICs5MCwyNiBAQAogCiB3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCiBhbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCUiBlbmNvZGVyIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKToKKworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJ0b25fY29yci5oIgogCi0jaW5jbHVkZSAic2JyX3JhbS5oIgorI2luY2x1ZGUgInNicmVuY19yYW0uaCIKICNpbmNsdWRlICJzYnJfbWlzYy5oIgogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAjaW5jbHVkZSAiYXV0b2NvcnIybmQuaCIKIAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICBTZW5kIGF1dG9Db3JyU2Vjb25kT3JkZXIgdG8gbWxmaWxlCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEJBTkRfVl9TSVpFIDMyCisjZGVmaW5lIE5VTV9WX0NPTUJJTkUgXAorICA4IC8qIE11c3QgYmUgYSBkaXZpc29yIG9mIDY0IGFuZCBmdWxmaWxsIHRoZSBBU1NFUlRzIGJlbG93ICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQpAQCAtMTA3LDcgKzEyMiw3IEBACiAgICAobm9pc2UgZW5lcmd5IEIpLiBIZW5jZSB0aGUgcXVvdGEtbWF0cml4IGNvbnRhaW5zIEEvQiA9IHEvKDEtcSkuCiAKICAgIFRoZSBzYW1wbGVzIGluIG5yZ1ZlY3RvciBhcmUgc2NhbGVkIGJ5IDEuMC8xNi4wCi0JCVRoZSBzYW1wbGVzIGluIHBOcmdWZWN0b3JGcmVxCWFyZSBzY2FsZWQgYnkgMS4wLzIuMAorICAgVGhlIHNhbXBsZXMgaW4gcE5yZ1ZlY3RvckZyZXEgIGFyZSBzY2FsZWQgYnkgMS4wLzIuMAogICAgVGhlIHNhbXBsZXMgaW4gcXVvdGFNYXRyaXggYXJlIHNjYWxlZCBieSBSRUxBWEFUSU9OCiAKICAgXHJldHVybiBub25lLgpAQCAtMTE1LDg0ICsxMzAsODMgQEAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKLUZES3NickVuY19DYWxjdWxhdGVUb25hbGl0eVF1b3RhcyggSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsICAgICAgLyohPCBIYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipSRVNUUklDVCBzb3VyY2VCdWZmZXJSZWFsLCAgLyohPCBUaGUgcmVhbCBwYXJ0IG9mIHRoZSBRTUYtbWF0cml4LiAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipSRVNUUklDVCBzb3VyY2VCdWZmZXJJbWFnLCAgLyohPCBUaGUgaW1hZ2luYXJ5IHBhcnQgb2YgdGhlIFFNRi1tYXRyaXguICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB1c2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgdXBwZXIgc2lkZSBiYW5kLCBoaWdoZXN0ICsgMSBRTUYgYmFuZCBpbiB0aGUgU0JSIHJhbmdlLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgcW1mU2NhbGUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgc2NsZWZhY3RvciBvZiBRTUYgc3Vic2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICBJTlQgICAgIGksIGssIHIsIHIyLCB0aW1lSW5kZXgsIGF1dG9Db3JyU2NhbGluZzsKK3ZvaWQgRkRLc2JyRW5jX0NhbGN1bGF0ZVRvbmFsaXR5UXVvdGFzKAorICAgIEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUIGhUb25Db3JyLCAvKiE8IEhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLworICAgIEZJWFBfREJMICoqUkVTVFJJQ1QKKyAgICAgICAgc291cmNlQnVmZmVyUmVhbCwgLyohPCBUaGUgcmVhbCBwYXJ0IG9mIHRoZSBRTUYtbWF0cml4LiAgKi8KKyAgICBGSVhQX0RCTCAqKlJFU1RSSUNUCisgICAgICAgIHNvdXJjZUJ1ZmZlckltYWcsIC8qITwgVGhlIGltYWdpbmFyeSBwYXJ0IG9mIHRoZSBRTUYtbWF0cml4LiAqLworICAgIElOVCB1c2IsICAgICAvKiE8IHVwcGVyIHNpZGUgYmFuZCwgaGlnaGVzdCArIDEgUU1GIGJhbmQgaW4gdGhlIFNCUiByYW5nZS4gKi8KKyAgICBJTlQgcW1mU2NhbGUgLyohPCBzY2xlZmFjdG9yIG9mIFFNRiBzdWJzYW1wbGVzICovCispIHsKKyAgSU5UIGksIGssIHIsIHIyLCB0aW1lSW5kZXgsIGF1dG9Db3JyU2NhbGluZzsKIAotICBJTlQgICAgIHN0YXJ0SW5kZXhNYXRyaXggID0gaFRvbkNvcnItPnN0YXJ0SW5kZXhNYXRyaXg7Ci0gIElOVCAgICAgdG90Tm9Fc3QgICAgICAgICAgPSBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXM7Ci0gIElOVCAgICAgbm9Fc3RQZXJGcmFtZSAgICAgPSBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZTsKLSAgSU5UICAgICBtb3ZlICAgICAgICAgICAgICA9IGhUb25Db3JyLT5tb3ZlOwotICBJTlQgICAgIG5vUW1mQ2hhbm5lbHMgICAgID0gaFRvbkNvcnItPm5vUW1mQ2hhbm5lbHM7ICAgICAvKiBOdW1lciBvZiBCYW5kcyAqLwotICBJTlQgICAgIGJ1ZmZMZW4gICAgICAgICAgID0gaFRvbkNvcnItPmJ1ZmZlckxlbmd0aDsgICAgICAvKiBOdW1lciBvZiBTbG90cyAqLwotICBJTlQgICAgIHN0ZXBTaXplICAgICAgICAgID0gaFRvbkNvcnItPnN0ZXBTaXplOwotICBJTlQgICAgKnBCbG9ja0xlbmd0aCAgICAgID0gaFRvbkNvcnItPmxwY0xlbmd0aDsKLSAgSU5UKiogICBSRVNUUklDVCBzaWduTWF0cml4ICAgICAgICA9IGhUb25Db3JyLT5zaWduTWF0cml4OwotICBGSVhQX0RCTCogUkVTVFJJQ1QgIG5yZ1ZlY3RvciAgICAgID0gaFRvbkNvcnItPm5yZ1ZlY3RvcjsKLSAgRklYUF9EQkwqKiBSRVNUUklDVCBxdW90YU1hdHJpeCAgICA9IGhUb25Db3JyLT5xdW90YU1hdHJpeDsKLSAgRklYUF9EQkwqICBSRVNUUklDVCBwTnJnVmVjdG9yRnJlcSA9IGhUb25Db3JyLT5ucmdWZWN0b3JGcmVxOwotCi0jZGVmaW5lIEJBTkRfVl9TSVpFIFFNRl9NQVhfVElNRV9TTE9UUwotI2RlZmluZSBOVU1fVl9DT01CSU5FIDggLyogTXVzdCBiZSBhIGRpdmlzb3Igb2YgNjQgYW5kIGZ1bGZpbGwgdGhlIEFTU0VSVHMgYmVsb3cgKi8KKyAgSU5UIHN0YXJ0SW5kZXhNYXRyaXggPSBoVG9uQ29yci0+c3RhcnRJbmRleE1hdHJpeDsKKyAgSU5UIHRvdE5vRXN0ID0gaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzOworICBJTlQgbm9Fc3RQZXJGcmFtZSA9IGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlc1BlckZyYW1lOworICBJTlQgbW92ZSA9IGhUb25Db3JyLT5tb3ZlOworICBJTlQgbm9RbWZDaGFubmVscyA9IGhUb25Db3JyLT5ub1FtZkNoYW5uZWxzOyAvKiBOdW1iZXIgb2YgQmFuZHMgKi8KKyAgSU5UIGJ1ZmZMZW4gPSBoVG9uQ29yci0+YnVmZmVyTGVuZ3RoOyAgICAgICAgLyogTnVtYmVyIG9mIFNsb3RzICovCisgIElOVCBzdGVwU2l6ZSA9IGhUb25Db3JyLT5zdGVwU2l6ZTsKKyAgSU5UICpwQmxvY2tMZW5ndGggPSBoVG9uQ29yci0+bHBjTGVuZ3RoOworICBJTlQgKipSRVNUUklDVCBzaWduTWF0cml4ID0gaFRvbkNvcnItPnNpZ25NYXRyaXg7CisgIEZJWFBfREJMICpSRVNUUklDVCBucmdWZWN0b3IgPSBoVG9uQ29yci0+bnJnVmVjdG9yOworICBGSVhQX0RCTCAqKlJFU1RSSUNUIHF1b3RhTWF0cml4ID0gaFRvbkNvcnItPnF1b3RhTWF0cml4OworICBGSVhQX0RCTCAqUkVTVFJJQ1QgcE5yZ1ZlY3RvckZyZXEgPSBoVG9uQ29yci0+bnJnVmVjdG9yRnJlcTsKIAogICBGSVhQX0RCTCAqcmVhbEJ1ZjsKICAgRklYUF9EQkwgKmltYWdCdWY7CiAKLSAgRklYUF9EQkwgIGFscGhhclsyXSxhbHBoYWlbMl0sZmFjOworICBGSVhQX0RCTCBhbHBoYXJbMl0sIGFscGhhaVsyXSwgZmFjOwogCi0gIENfQUxMT0NfU0NSQVRDSF9TVEFSVChhYywgQUNPUlJfQ09FRlMsIDEpOwotICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocmVhbEJ1ZlJlZiwgRklYUF9EQkwsIDIqQkFORF9WX1NJWkUqTlVNX1ZfQ09NQklORSk7Ci0KKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGFjLCBBQ09SUl9DT0VGUywgMSkKKyAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKHJlYWxCdWZSZWYsIEZJWFBfREJMLCAyICogQkFORF9WX1NJWkUgKiBOVU1fVl9DT01CSU5FKQogICByZWFsQnVmID0gcmVhbEJ1ZlJlZjsKLSAgaW1hZ0J1ZiA9IHJlYWxCdWYgKyBCQU5EX1ZfU0laRSpOVU1fVl9DT01CSU5FOwotCisgIGltYWdCdWYgPSByZWFsQnVmICsgQkFORF9WX1NJWkUgKiBOVU1fVl9DT01CSU5FOwogCiAgIEZES19BU1NFUlQoYnVmZkxlbiA8PSBCQU5EX1ZfU0laRSk7Ci0gIEZES19BU1NFUlQoc2l6ZW9mKEZJWFBfREJMKSpOVU1fVl9DT01CSU5FKkJBTkRfVl9TSVpFKjIgPCAoMTAyNCpzaXplb2YoRklYUF9EQkwpLXNpemVvZihBQ09SUl9DT0VGUykpICk7CisgIEZES19BU1NFUlQoc2l6ZW9mKEZJWFBfREJMKSAqIE5VTV9WX0NPTUJJTkUgKiBCQU5EX1ZfU0laRSAqIDIgPAorICAgICAgICAgICAgICgxMDI0ICogc2l6ZW9mKEZJWFBfREJMKSAtIHNpemVvZihBQ09SUl9DT0VGUykpKTsKIAogICAvKgogICAgKiBCdWZmZXJpbmcgb2YgdGhlIHF1b3RhTWF0cml4IGFuZCB0aGUgcXVvdGFNYXRyaXhUcmFuc3AuCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIGZvcihpID0gIDAgOyBpIDwgbW92ZTsgaSsrKXsKLSAgICBGREttZW1jcHkocXVvdGFNYXRyaXhbaV0scXVvdGFNYXRyaXhbaSArIG5vRXN0UGVyRnJhbWVdLG5vUW1mQ2hhbm5lbHMgKiBzaXplb2YoRklYUF9EQkwpKTsKLSAgICBGREttZW1jcHkoc2lnbk1hdHJpeFtpXSxzaWduTWF0cml4W2kgKyBub0VzdFBlckZyYW1lXSxub1FtZkNoYW5uZWxzICogc2l6ZW9mKElOVCkpOworICBmb3IgKGkgPSAwOyBpIDwgbW92ZTsgaSsrKSB7CisgICAgRkRLbWVtY3B5KHF1b3RhTWF0cml4W2ldLCBxdW90YU1hdHJpeFtpICsgbm9Fc3RQZXJGcmFtZV0sCisgICAgICAgICAgICAgIG5vUW1mQ2hhbm5lbHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgICBGREttZW1jcHkoc2lnbk1hdHJpeFtpXSwgc2lnbk1hdHJpeFtpICsgbm9Fc3RQZXJGcmFtZV0sCisgICAgICAgICAgICAgIG5vUW1mQ2hhbm5lbHMgKiBzaXplb2YoSU5UKSk7CiAgIH0KIAotICBGREttZW1tb3ZlKG5yZ1ZlY3RvcixucmdWZWN0b3Irbm9Fc3RQZXJGcmFtZSxtb3ZlKnNpemVvZihGSVhQX0RCTCkpOwotICBGREttZW1jbGVhcihucmdWZWN0b3Irc3RhcnRJbmRleE1hdHJpeCwodG90Tm9Fc3Qtc3RhcnRJbmRleE1hdHJpeCkqc2l6ZW9mKEZJWFBfREJMKSk7Ci0gIEZES21lbWNsZWFyKHBOcmdWZWN0b3JGcmVxLG5vUW1mQ2hhbm5lbHMgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtbW92ZShucmdWZWN0b3IsIG5yZ1ZlY3RvciArIG5vRXN0UGVyRnJhbWUsIG1vdmUgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY2xlYXIobnJnVmVjdG9yICsgc3RhcnRJbmRleE1hdHJpeCwKKyAgICAgICAgICAgICAgKHRvdE5vRXN0IC0gc3RhcnRJbmRleE1hdHJpeCkgKiBzaXplb2YoRklYUF9EQkwpKTsKKyAgRkRLbWVtY2xlYXIocE5yZ1ZlY3RvckZyZXEsIG5vUW1mQ2hhbm5lbHMgKiBzaXplb2YoRklYUF9EQkwpKTsKIAogICAvKgogICAgKiBDYWxjdWxhdGUgdGhlIHF1b3RhcyBmb3IgdGhlIGN1cnJlbnQgdGltZSBzdGVwcy4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gIGZvciAociA9IDA7IHIgPCB1c2I7IHIrKykKLSAgeworICBmb3IgKHIgPSAwOyByIDwgdXNiOyByKyspIHsKICAgICBpbnQgYmxvY2tMZW5ndGg7CiAKICAgICBrID0gaFRvbkNvcnItPm5leHRTYW1wbGU7IC8qIHN0YXJ0U2FtcGxlICovCiAgICAgdGltZUluZGV4ID0gc3RhcnRJbmRleE1hdHJpeDsKLSAgICAvKiBDb3B5IGFzIG1hbnkgYXMgcG9zc2libGUgQmFuZCBhY2Nyb3NzIGFsbCBTbG90cyBhdCBvbmNlICovCisgICAgLyogQ29weSBhcyBtYW55IGFzIHBvc3NpYmxlIEJhbmQgYWNyb3NzIGFsbCBTbG90cyBhdCBvbmNlICovCiAgICAgaWYgKHJlYWxCdWYgIT0gcmVhbEJ1ZlJlZikgewogICAgICAgcmVhbEJ1ZiAtPSBCQU5EX1ZfU0laRTsKICAgICAgIGltYWdCdWYgLT0gQkFORF9WX1NJWkU7CiAgICAgfSBlbHNlIHsKLSAgICAgIHJlYWxCdWYgKz0gQkFORF9WX1NJWkUqKE5VTV9WX0NPTUJJTkUtMSk7Ci0gICAgICBpbWFnQnVmICs9IEJBTkRfVl9TSVpFKihOVU1fVl9DT01CSU5FLTEpOworICAgICAgcmVhbEJ1ZiArPSBCQU5EX1ZfU0laRSAqIChOVU1fVl9DT01CSU5FIC0gMSk7CisgICAgICBpbWFnQnVmICs9IEJBTkRfVl9TSVpFICogKE5VTV9WX0NPTUJJTkUgLSAxKTsKKwogICAgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZMZW47IGkrKykgewogICAgICAgICBpbnQgdjsKICAgICAgICAgRklYUF9EQkwgKnB0cjsKLSAgICAgICAgcHRyID0gcmVhbEJ1ZitpOwotICAgICAgICBmb3IgKHY9MDsgdjxOVU1fVl9DT01CSU5FOyB2KyspCi0gICAgICAgIHsKLSAgICAgICAgICBwdHJbMF0gPSBzb3VyY2VCdWZmZXJSZWFsW2ldW3Irdl07Ci0gICAgICAgICAgcHRyWzArQkFORF9WX1NJWkUqTlVNX1ZfQ09NQklORV0gPSBzb3VyY2VCdWZmZXJJbWFnW2ldW3Irdl07CisgICAgICAgIHB0ciA9IHJlYWxCdWYgKyBpOworICAgICAgICBmb3IgKHYgPSAwOyB2IDwgTlVNX1ZfQ09NQklORTsgdisrKSB7CisgICAgICAgICAgcHRyWzBdID0gc291cmNlQnVmZmVyUmVhbFtpXVtyICsgdl07CisgICAgICAgICAgcHRyWzAgKyBCQU5EX1ZfU0laRSAqIE5VTV9WX0NPTUJJTkVdID0gc291cmNlQnVmZmVySW1hZ1tpXVtyICsgdl07CiAgICAgICAgICAgcHRyIC09IEJBTkRfVl9TSVpFOwogICAgICAgICB9CiAgICAgICB9CkBAIC0yMDAsNTQgKzIxNCw2NiBAQAogCiAgICAgYmxvY2tMZW5ndGggPSBwQmxvY2tMZW5ndGhbMF07CiAKLSAgICB3aGlsZShrIDw9IGJ1ZmZMZW4gLSBibG9ja0xlbmd0aCkKLSAgICB7Ci0gICAgICBhdXRvQ29yclNjYWxpbmcgPSBmaXhNaW4oZ2V0U2NhbGVmYWN0b3IoJnJlYWxCdWZbay1MUENfT1JERVJdLCBMUENfT1JERVIrYmxvY2tMZW5ndGgpLCBnZXRTY2FsZWZhY3RvcigmaW1hZ0J1ZltrLUxQQ19PUkRFUl0sIExQQ19PUkRFUitibG9ja0xlbmd0aCkpOwotICAgICAgYXV0b0NvcnJTY2FsaW5nID0gZml4TWF4KDAsIGF1dG9Db3JyU2NhbGluZy0xKTsKKyAgICB3aGlsZSAoayA8PSBidWZmTGVuIC0gYmxvY2tMZW5ndGgpIHsKKyAgICAgIGF1dG9Db3JyU2NhbGluZyA9IGZpeE1pbigKKyAgICAgICAgICBnZXRTY2FsZWZhY3RvcigmcmVhbEJ1ZltrIC0gTFBDX09SREVSXSwgTFBDX09SREVSICsgYmxvY2tMZW5ndGgpLAorICAgICAgICAgIGdldFNjYWxlZmFjdG9yKCZpbWFnQnVmW2sgLSBMUENfT1JERVJdLCBMUENfT1JERVIgKyBibG9ja0xlbmd0aCkpOworICAgICAgYXV0b0NvcnJTY2FsaW5nID0gZml4TWF4KDAsIGF1dG9Db3JyU2NhbGluZyAtIDEpOwogCi0gICAgICBzY2FsZVZhbHVlcygmcmVhbEJ1ZltrLUxQQ19PUkRFUl0sIExQQ19PUkRFUitibG9ja0xlbmd0aCwgYXV0b0NvcnJTY2FsaW5nKTsKLSAgICAgIHNjYWxlVmFsdWVzKCZpbWFnQnVmW2stTFBDX09SREVSXSwgTFBDX09SREVSK2Jsb2NrTGVuZ3RoLCBhdXRvQ29yclNjYWxpbmcpOworICAgICAgc2NhbGVWYWx1ZXMoJnJlYWxCdWZbayAtIExQQ19PUkRFUl0sIExQQ19PUkRFUiArIGJsb2NrTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgYXV0b0NvcnJTY2FsaW5nKTsKKyAgICAgIHNjYWxlVmFsdWVzKCZpbWFnQnVmW2sgLSBMUENfT1JERVJdLCBMUENfT1JERVIgKyBibG9ja0xlbmd0aCwKKyAgICAgICAgICAgICAgICAgIGF1dG9Db3JyU2NhbGluZyk7CiAKICAgICAgIGF1dG9Db3JyU2NhbGluZyA8PD0gMTsgLyogY29uc2lkZXIgcW1mIGJ1ZmZlciBzY2FsaW5nIHR3aWNlICovCi0gICAgICBhdXRvQ29yclNjYWxpbmcgKz0gYXV0b0NvcnIybmRfY3BseCAoIGFjLCByZWFsQnVmK2ssIGltYWdCdWYraywgYmxvY2tMZW5ndGggKTsKKyAgICAgIGF1dG9Db3JyU2NhbGluZyArPQorICAgICAgICAgIGF1dG9Db3JyMm5kX2NwbHgoYWMsIHJlYWxCdWYgKyBrLCBpbWFnQnVmICsgaywgYmxvY2tMZW5ndGgpOwogCi0KLSAgICAgIGlmKGFjLT5kZXQgPT0gRkwyRlhDT05TVF9EQkwoMC4wZikpeworICAgICAgaWYgKGFjLT5kZXQgPT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKICAgICAgICAgYWxwaGFyWzFdID0gYWxwaGFpWzFdID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKLSAgICAgICAgYWxwaGFyWzBdID0gKGFjLT5yMDFyKT4+MjsKLSAgICAgICAgYWxwaGFpWzBdID0gKGFjLT5yMDFpKT4+MjsKKyAgICAgICAgYWxwaGFyWzBdID0gKGFjLT5yMDFyKSA+PiAyOworICAgICAgICBhbHBoYWlbMF0gPSAoYWMtPnIwMWkpID4+IDI7CiAKLSAgICAgICAgZmFjID0gZk11bHREaXYyKGFjLT5yMDByLCBhYy0+cjExcik+PjE7Ci0gICAgICB9Ci0gICAgICBlbHNlewotICAgICAgICBhbHBoYXJbMV0gPSAoZk11bHREaXYyKGFjLT5yMDFyLCBhYy0+cjEycik+PjEpIC0gKGZNdWx0RGl2MihhYy0+cjAxaSwgYWMtPnIxMmkpPj4xKSAtIChmTXVsdERpdjIoYWMtPnIwMnIsIGFjLT5yMTFyKT4+MSk7Ci0gICAgICAgIGFscGhhaVsxXSA9IChmTXVsdERpdjIoYWMtPnIwMWksIGFjLT5yMTJyKT4+MSkgKyAoZk11bHREaXYyKGFjLT5yMDFyLCBhYy0+cjEyaSk+PjEpIC0gKGZNdWx0RGl2MihhYy0+cjAyaSwgYWMtPnIxMXIpPj4xKTsKKyAgICAgICAgZmFjID0gZk11bHREaXYyKGFjLT5yMDByLCBhYy0+cjExcikgPj4gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFscGhhclsxXSA9IChmTXVsdERpdjIoYWMtPnIwMXIsIGFjLT5yMTJyKSA+PiAxKSAtCisgICAgICAgICAgICAgICAgICAgIChmTXVsdERpdjIoYWMtPnIwMWksIGFjLT5yMTJpKSA+PiAxKSAtCisgICAgICAgICAgICAgICAgICAgIChmTXVsdERpdjIoYWMtPnIwMnIsIGFjLT5yMTFyKSA+PiAxKTsKKyAgICAgICAgYWxwaGFpWzFdID0gKGZNdWx0RGl2MihhYy0+cjAxaSwgYWMtPnIxMnIpID4+IDEpICsKKyAgICAgICAgICAgICAgICAgICAgKGZNdWx0RGl2MihhYy0+cjAxciwgYWMtPnIxMmkpID4+IDEpIC0KKyAgICAgICAgICAgICAgICAgICAgKGZNdWx0RGl2MihhYy0+cjAyaSwgYWMtPnIxMXIpID4+IDEpOwogCi0gICAgICAgIGFscGhhclswXSA9IChmTXVsdERpdjIoYWMtPnIwMXIsIGFjLT5kZXQpPj4oYWMtPmRldF9zY2FsZSsxKSkgKyBmTXVsdChhbHBoYXJbMV0sIGFjLT5yMTJyKSArIGZNdWx0KGFscGhhaVsxXSwgYWMtPnIxMmkpOwotICAgICAgICBhbHBoYWlbMF0gPSAoZk11bHREaXYyKGFjLT5yMDFpLCBhYy0+ZGV0KT4+KGFjLT5kZXRfc2NhbGUrMSkpICsgZk11bHQoYWxwaGFpWzFdLCBhYy0+cjEycikgLSBmTXVsdChhbHBoYXJbMV0sIGFjLT5yMTJpKTsKKyAgICAgICAgYWxwaGFyWzBdID0gKGZNdWx0RGl2MihhYy0+cjAxciwgYWMtPmRldCkgPj4gKGFjLT5kZXRfc2NhbGUgKyAxKSkgKworICAgICAgICAgICAgICAgICAgICBmTXVsdChhbHBoYXJbMV0sIGFjLT5yMTJyKSArIGZNdWx0KGFscGhhaVsxXSwgYWMtPnIxMmkpOworICAgICAgICBhbHBoYWlbMF0gPSAoZk11bHREaXYyKGFjLT5yMDFpLCBhYy0+ZGV0KSA+PiAoYWMtPmRldF9zY2FsZSArIDEpKSArCisgICAgICAgICAgICAgICAgICAgIGZNdWx0KGFscGhhaVsxXSwgYWMtPnIxMnIpIC0gZk11bHQoYWxwaGFyWzFdLCBhYy0+cjEyaSk7CiAKLSAgICAgICAgZmFjID0gZk11bHREaXYyKGFjLT5yMDByLCBmTXVsdChhYy0+ZGV0LCBhYy0+cjExcikpPj4oYWMtPmRldF9zY2FsZSsxKTsKKyAgICAgICAgZmFjID0gZk11bHREaXYyKGFjLT5yMDByLCBmTXVsdChhYy0+ZGV0LCBhYy0+cjExcikpID4+CisgICAgICAgICAgICAgIChhYy0+ZGV0X3NjYWxlICsgMSk7CiAgICAgICB9CiAKLSAgICAgIGlmKGZhYyA9PSBGTDJGWENPTlNUX0RCTCgwLjBmKSl7CisgICAgICBpZiAoZmFjID09IEZMMkZYQ09OU1RfREJMKDAuMGYpKSB7CiAgICAgICAgIHF1b3RhTWF0cml4W3RpbWVJbmRleF1bcl0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgICAgc2lnbk1hdHJpeFt0aW1lSW5kZXhdW3JdID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UgeworICAgICAgfSBlbHNlIHsKICAgICAgICAgLyogcXVvdGFNYXRyaXggaXMgc2NhbGVkIHdpdGggdGhlIGZhY3RvciBSRUxBWEFUSU9OCi0gICAgICAgICAgIHBhcnNlIFJFTEFYQVRJT04gaW4gZnJhY3Rpb25hbCBwYXJ0IGFuZCBzaGlmdCBmYWN0b3I6IDEvKDEvMC41MjQyODggKiAyXlJFTEFYQVRJT05fU0hJRlQpICovCi0gICAgICAgIEZJWFBfREJMIHRtcCxudW0sZGVub207Ci0gICAgICAgIElOVCBudW1TaGlmdCxkZW5vbVNoaWZ0LGNvbW1vblNoaWZ0OworICAgICAgICAgICBwYXJzZSBSRUxBWEFUSU9OIGluIGZyYWN0aW9uYWwgcGFydCBhbmQgc2hpZnQgZmFjdG9yOiAxLygxLzAuNTI0Mjg4ICoKKyAgICAgICAgICAgMl5SRUxBWEFUSU9OX1NISUZUKSAqLworICAgICAgICBGSVhQX0RCTCB0bXAsIG51bSwgZGVub207CisgICAgICAgIElOVCBudW1TaGlmdCwgZGVub21TaGlmdCwgY29tbW9uU2hpZnQ7CiAgICAgICAgIElOVCBzaWduOwogCi0gICAgICAgIG51bSA9IGZNdWx0RGl2MihhbHBoYXJbMF0sIGFjLT5yMDFyKSArIGZNdWx0RGl2MihhbHBoYWlbMF0sIGFjLT5yMDFpKSAtIGZNdWx0RGl2MihhbHBoYXJbMV0sIGZNdWx0KGFjLT5yMDJyLCBhYy0+cjExcikpIC0gZk11bHREaXYyKGFscGhhaVsxXSwgZk11bHQoYWMtPnIwMmksIGFjLT5yMTFyKSk7CisgICAgICAgIG51bSA9IGZNdWx0RGl2MihhbHBoYXJbMF0sIGFjLT5yMDFyKSArIGZNdWx0RGl2MihhbHBoYWlbMF0sIGFjLT5yMDFpKSAtCisgICAgICAgICAgICAgIGZNdWx0RGl2MihhbHBoYXJbMV0sIGZNdWx0KGFjLT5yMDJyLCBhYy0+cjExcikpIC0KKyAgICAgICAgICAgICAgZk11bHREaXYyKGFscGhhaVsxXSwgZk11bHQoYWMtPnIwMmksIGFjLT5yMTFyKSk7CiAgICAgICAgIG51bSA9IGZpeHBfYWJzKG51bSk7CiAKLSAgICAgICAgZGVub20gPSAoZmFjPj4xKSArIChmTXVsdERpdjIoZmFjLFJFTEFYQVRJT05fRlJBQ1QpPj5SRUxBWEFUSU9OX1NISUZUKSAtIG51bTsKKyAgICAgICAgZGVub20gPSAoZmFjID4+IDEpICsKKyAgICAgICAgICAgICAgICAoZk11bHREaXYyKGZhYywgUkVMQVhBVElPTl9GUkFDVCkgPj4gUkVMQVhBVElPTl9TSElGVCkgLSBudW07CiAgICAgICAgIGRlbm9tID0gZml4cF9hYnMoZGVub20pOwogCi0gICAgICAgIG51bSA9IGZNdWx0KG51bSxSRUxBWEFUSU9OX0ZSQUNUKTsKKyAgICAgICAgbnVtID0gZk11bHQobnVtLCBSRUxBWEFUSU9OX0ZSQUNUKTsKIAogICAgICAgICBudW1TaGlmdCA9IENvdW50TGVhZGluZ0JpdHMobnVtKSAtIDI7CiAgICAgICAgIG51bSA9IHNjYWxlVmFsdWUobnVtLCBudW1TaGlmdCk7CkBAIC0yNTYsNDYgKzI4Miw1MyBAQAogICAgICAgICBkZW5vbSA9IChGSVhQX0RCTClkZW5vbSA8PCBkZW5vbVNoaWZ0OwogCiAgICAgICAgIGlmICgobnVtID4gRkwyRlhDT05TVF9EQkwoMC4wZikpICYmIChkZW5vbSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkpIHsKLSAgICAgICAgICBjb21tb25TaGlmdCA9IGZpeE1pbihudW1TaGlmdCAtIGRlbm9tU2hpZnQgKyBSRUxBWEFUSU9OX1NISUZULCBERlJBQ1RfQklUUy0xKTsKKyAgICAgICAgICBjb21tb25TaGlmdCA9CisgICAgICAgICAgICAgIGZpeE1pbihudW1TaGlmdCAtIGRlbm9tU2hpZnQgKyBSRUxBWEFUSU9OX1NISUZULCBERlJBQ1RfQklUUyAtIDEpOwogICAgICAgICAgIGlmIChjb21tb25TaGlmdCA8IDApIHsKICAgICAgICAgICAgIGNvbW1vblNoaWZ0ID0gLWNvbW1vblNoaWZ0OwotICAgICAgICAgICAgdG1wID0gc2NodXJfZGl2KG51bSxkZW5vbSwxNik7Ci0gICAgICAgICAgICBjb21tb25TaGlmdCA9IGZpeE1pbihjb21tb25TaGlmdCxDb3VudExlYWRpbmdCaXRzKHRtcCkpOworICAgICAgICAgICAgdG1wID0gc2NodXJfZGl2KG51bSwgZGVub20sIDE2KTsKKyAgICAgICAgICAgIGNvbW1vblNoaWZ0ID0gZml4TWluKGNvbW1vblNoaWZ0LCBDb3VudExlYWRpbmdCaXRzKHRtcCkpOwogICAgICAgICAgICAgcXVvdGFNYXRyaXhbdGltZUluZGV4XVtyXSA9IHRtcCA8PCBjb21tb25TaGlmdDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcXVvdGFNYXRyaXhbdGltZUluZGV4XVtyXSA9CisgICAgICAgICAgICAgICAgc2NodXJfZGl2KG51bSwgZGVub20sIDE2KSA+PiBjb21tb25TaGlmdDsKICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBxdW90YU1hdHJpeFt0aW1lSW5kZXhdW3JdID0gc2NodXJfZGl2KG51bSxkZW5vbSwxNikgPj4gY29tbW9uU2hpZnQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHF1b3RhTWF0cml4W3RpbWVJbmRleF1bcl0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChhYy0+cjExciAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgewotICAgICAgICAgIGlmICggICggKGFjLT5yMDFyID49IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgJiYgKCBhYy0+cjExciA+PSBGTDJGWENPTlNUX0RCTCgwLjBmKSApICkKLSAgICAgICAgICAgICAgfHwoIChhYy0+cjAxciA8ICBGTDJGWENPTlNUX0RCTCgwLjBmKSApICYmICggYWMtPnIxMXIgPCAgRkwyRlhDT05TVF9EQkwoMC4wZikgKSApICApIHsKKyAgICAgICAgICBpZiAoKChhYy0+cjAxciA+PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgJiYKKyAgICAgICAgICAgICAgIChhYy0+cjExciA+PSBGTDJGWENPTlNUX0RCTCgwLjBmKSkpIHx8CisgICAgICAgICAgICAgICgoYWMtPnIwMXIgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkgJiYKKyAgICAgICAgICAgICAgIChhYy0+cjExciA8IEZMMkZYQ09OU1RfREJMKDAuMGYpKSkpIHsKICAgICAgICAgICAgIHNpZ24gPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2lnbiA9IC0xOwogICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBzaWduID0gMTsKICAgICAgICAgfQogCi0gICAgICAgIGlmKHNpZ24gPCAwKSB7Ci0gICAgICAgICAgcjIgPSByOyAgICAgICAvKiAoSU5UKSBwb3coLTEsIGJhbmQpOyAqLworICAgICAgICBpZiAoc2lnbiA8IDApIHsKKyAgICAgICAgICByMiA9IHI7IC8qIChJTlQpIHBvdygtMSwgYmFuZCk7ICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcjIgPSByICsgMTsgLyogKElOVCkgcG93KC0xLCBiYW5kKzEpOyAqLwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIHIyID0gciArIDE7ICAgLyogKElOVCkgcG93KC0xLCBiYW5kKzEpOyAqLwotICAgICAgICB9Ci0gICAgICAgIHNpZ25NYXRyaXhbdGltZUluZGV4XVtyXSA9IDEgLSAyKihyMiAmIDB4MSk7CisgICAgICAgIHNpZ25NYXRyaXhbdGltZUluZGV4XVtyXSA9IDEgLSAyICogKHIyICYgMHgxKTsKICAgICAgIH0KIAotICAgICAgbnJnVmVjdG9yW3RpbWVJbmRleF0gKz0gKChhYy0+cjAwcikgPj4gZml4TWluKERGUkFDVF9CSVRTLTEsKDIqcW1mU2NhbGUrYXV0b0NvcnJTY2FsaW5nICsgU0NBTEVfTlJHVkVDKSkpOwotICAgICAgLyogcE5yZ1ZlY3RvckZyZXFbcl0gZmluYWxseSBoYXMgdG8gYmUgZGl2aWRlZCBieSBub0VzdFBlckZyYW1lLCByZXBsYWNlZCBkaXZpc2lvbiBieSBzaGlmdGluZyB3aXRoIG9uZSAqLwotICAgICAgcE5yZ1ZlY3RvckZyZXFbcl0gPSBwTnJnVmVjdG9yRnJlcVtyXSArICgoYWMtPnIwMHIpID4+IGZpeE1pbihERlJBQ1RfQklUUy0xLCgyKnFtZlNjYWxlK2F1dG9Db3JyU2NhbGluZyArIFNDQUxFX05SR1ZFQykpKTsKKyAgICAgIG5yZ1ZlY3Rvclt0aW1lSW5kZXhdICs9CisgICAgICAgICAgKChhYy0+cjAwcikgPj4KKyAgICAgICAgICAgZml4TWluKERGUkFDVF9CSVRTIC0gMSwKKyAgICAgICAgICAgICAgICAgICgyICogcW1mU2NhbGUgKyBhdXRvQ29yclNjYWxpbmcgKyBTQ0FMRV9OUkdWRUMpKSk7CisgICAgICAvKiBwTnJnVmVjdG9yRnJlcVtyXSBmaW5hbGx5IGhhcyB0byBiZSBkaXZpZGVkIGJ5IG5vRXN0UGVyRnJhbWUsIHJlcGxhY2VkCisgICAgICAgKiBkaXZpc2lvbiBieSBzaGlmdGluZyB3aXRoIG9uZSAqLworICAgICAgcE5yZ1ZlY3RvckZyZXFbcl0gPQorICAgICAgICAgIHBOcmdWZWN0b3JGcmVxW3JdICsKKyAgICAgICAgICAoKGFjLT5yMDByKSA+PgorICAgICAgICAgICBmaXhNaW4oREZSQUNUX0JJVFMgLSAxLAorICAgICAgICAgICAgICAgICAgKDIgKiBxbWZTY2FsZSArIGF1dG9Db3JyU2NhbGluZyArIFNDQUxFX05SR1ZFQykpKTsKIAogICAgICAgYmxvY2tMZW5ndGggPSBwQmxvY2tMZW5ndGhbMV07CiAgICAgICBrICs9IHN0ZXBTaXplOwpAQCAtMzAzLDkgKzMzNiw4IEBACiAgICAgfQogICB9CiAKLQotICBDX0FMTE9DX1NDUkFUQ0hfRU5EKHJlYWxCdWYsIEZJWFBfREJMLCAyKkJBTkRfVl9TSVpFKk5VTV9WX0NPTUJJTkUpOwotICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGFjLCBBQ09SUl9DT0VGUywgMSk7CisgIENfQUxMT0NfU0NSQVRDSF9FTkQocmVhbEJ1ZlJlZiwgRklYUF9EQkwsIDIgKiBCQU5EX1ZfU0laRSAqIE5VTV9WX0NPTUJJTkUpCisgIENfQUxMT0NfU0NSQVRDSF9FTkQoYWMsIEFDT1JSX0NPRUZTLCAxKQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMjQsMTE3ICszNTYsMTAxIEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1GREtzYnJFbmNfVG9uQ29yclBhcmFtRXh0cihIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVCBoVG9uQ29yciwvKiE8IEhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WRl9NT0RFKiBpbmZWZWMsICAgICAgICAgICAgICAgLyohPCBWZWN0b3Igd2hlcmUgdGhlIGludmVyc2UgZmlsdGVyaW5nIGxldmVscyB3aWxsIGJlIHN0b3JlZC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICogbm9pc2VMZXZlbHMsICAgICAgICAgIC8qITwgVmVjdG9yIHdoZXJlIHRoZSBub2lzZSBsZXZlbHMgd2lsbCBiZSBzdG9yZWQuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQqIG1pc3NpbmdIYXJtb25pY0ZsYWcsICAgICAgICAvKiE8IEZsYWcgc2V0IHRvIG9uZSBvciB6ZXJvLCBkZXBlbmRlbnQgb24gaWYgYW55IHN0cm9uZyBzaW5lcyBhcmUgbWlzc2luZy4qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKiBtaXNzaW5nSGFybW9uaWNzSW5kZXgsICAgLyohPCBWZWN0b3IgaW5kaWNhdGluZyB3aGVyZSBzaW5lcyBhcmUgbWlzc2luZy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICogZW52ZWxvcGVDb21wZW5zYXRpb24sICAgIC8qITwgVmVjdG9yIHRvIHN0b3JlIGNvbXBlbnNhdGlvbiB2YWx1ZXMgZm9yIHRoZSBlbmVyZ2llcyBpbi4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNCUl9GUkFNRV9JTkZPICpmcmFtZUluZm8sIC8qITwgRnJhbWUgaW5mbyBzdHJ1Y3QsIGNvbnRhaW5zIHRoZSB0aW1lIGFuZCBmcmVxdWVuY3kgZ3JpZCBvZiB0aGUgY3VycmVudCBmcmFtZS4qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIqIHRyYW5zaWVudEluZm8sICAgICAgICAgICAgLyohPCBUcmFuc2llbnQgaW5mby4qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIqIGZyZXFCYW5kVGFibGUsICAgICAgICAgICAgLyohPCBGcmVxdWVuY3kgYmFuZCB0YWJsZXMgZm9yIGhpZ2gtcmVzLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblNmYiwgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBzY2FsZWZhY3RvciBiYW5kcyBmb3IgaGlnaC1yZXMuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBYUE9TX01PREUgeHBvc1R5cGUsICAgICAgICAgICAgICAvKiE8IFR5cGUgb2YgdHJhbnNwb3NlciB1c2VkIGluIHRoZSBkZWNvZGVyLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHNiclN5bnRheEZsYWdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Cit2b2lkIEZES3NickVuY19Ub25Db3JyUGFyYW1FeHRyKAorICAgIEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUIGhUb25Db3JyLCAvKiE8IEhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLworICAgIElOVkZfTU9ERSAqaW5mVmVjLCAvKiE8IFZlY3RvciB3aGVyZSB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWxzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVkLiAqLworICAgIEZJWFBfREJMICpub2lzZUxldmVscywgLyohPCBWZWN0b3Igd2hlcmUgdGhlIG5vaXNlIGxldmVscyB3aWxsIGJlIHN0b3JlZC4gKi8KKyAgICBJTlQgKm1pc3NpbmdIYXJtb25pY0ZsYWcsIC8qITwgRmxhZyBzZXQgdG8gb25lIG9yIHplcm8sIGRlcGVuZGVudCBvbiBpZiBhbnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9uZyBzaW5lcyBhcmUgbWlzc2luZy4qLworICAgIFVDSEFSICptaXNzaW5nSGFybW9uaWNzSW5kZXgsIC8qITwgVmVjdG9yIGluZGljYXRpbmcgd2hlcmUgc2luZXMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZy4gKi8KKyAgICBVQ0hBUiAqZW52ZWxvcGVDb21wZW5zYXRpb24sICAvKiE8IFZlY3RvciB0byBzdG9yZSBjb21wZW5zYXRpb24gdmFsdWVzIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbmVyZ2llcyBpbi4gKi8KKyAgICBjb25zdCBTQlJfRlJBTUVfSU5GTyAqZnJhbWVJbmZvLCAvKiE8IEZyYW1lIGluZm8gc3RydWN0LCBjb250YWlucyB0aGUgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmcmVxdWVuY3kgZ3JpZCBvZiB0aGUgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLiovCisgICAgVUNIQVIgKnRyYW5zaWVudEluZm8sICAgICAgICAgICAgLyohPCBUcmFuc2llbnQgaW5mby4qLworICAgIFVDSEFSICpmcmVxQmFuZFRhYmxlLCAgICAgICAgICAgIC8qITwgRnJlcXVlbmN5IGJhbmQgdGFibGVzIGZvciBoaWdoLXJlcy4qLworICAgIElOVCBuU2ZiLCAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygc2NhbGVmYWN0b3IgYmFuZHMgZm9yIGhpZ2gtcmVzLiAqLworICAgIFhQT1NfTU9ERSB4cG9zVHlwZSwgLyohPCBUeXBlIG9mIHRyYW5zcG9zZXIgdXNlZCBpbiB0aGUgZGVjb2Rlci4qLworICAgIFVJTlQgc2JyU3ludGF4RmxhZ3MpIHsKICAgSU5UIGJhbmQ7Ci0gIElOVCB0cmFuc2llbnRGbGFnID0gdHJhbnNpZW50SW5mb1sxXSA7ICAgIC8qITwgRmxhZyBpbmRpY2F0aW5nIGlmIGEgdHJhbnNpZW50IGlzIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgZnJhbWUuICovCi0gIElOVCB0cmFuc2llbnRQb3MgID0gdHJhbnNpZW50SW5mb1swXTsgICAgIC8qITwgUG9zaXRpb24gb2YgdGhlIHRyYW5zaWVudC4qLworICBJTlQgdHJhbnNpZW50RmxhZyA9IHRyYW5zaWVudEluZm9bMV07IC8qITwgRmxhZyBpbmRpY2F0aW5nIGlmIGEgdHJhbnNpZW50IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudCBpbiB0aGUgY3VycmVudCBmcmFtZS4gKi8KKyAgSU5UIHRyYW5zaWVudFBvcyA9IHRyYW5zaWVudEluZm9bMF07ICAvKiE8IFBvc2l0aW9uIG9mIHRoZSB0cmFuc2llbnQuKi8KICAgSU5UIHRyYW5zaWVudEZyYW1lLCB0cmFuc2llbnRGcmFtZUludmZFc3Q7Ci0gIElOVkZfTU9ERSogaW5mVmVjUHRyOwotCisgIElOVkZfTU9ERSAqaW5mVmVjUHRyOwogCiAgIC8qIERldGVybWluZSBpZiB0aGlzIGlzIGEgZnJhbWUgd2hlcmUgYSB0cmFuc2llbnQgc3RhcnRzLi4uCiAKLSAgVGhlIGRldGVjdGlvbiBvZiBub2lzZS1mbG9vciwgbWlzc2luZyBoYXJtb25pY3MgYW5kIGludmZfZXN0LCBpcyBub3QgaW4gc3luYyBmb3IgdGhlCi0gIG5vbi1idWYtb3B0IGRlY29kZXIgc3VjaCBhcyBBQUMuIEhlbmNlIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvbiB0aGUgdHJhbnNpZW50IGluIHRoZQotICBwcmVzZW50IGZyYW1lIGFzIHdlbGwgYXMgaW4gdGhlIG5leHQuCisgIFRoZSBkZXRlY3Rpb24gb2Ygbm9pc2UtZmxvb3IsIG1pc3NpbmcgaGFybW9uaWNzIGFuZCBpbnZmX2VzdCwgaXMgbm90IGluIHN5bmMKKyAgZm9yIHRoZSBub24tYnVmLW9wdCBkZWNvZGVyIHN1Y2ggYXMgQUFDLiBIZW5jZSB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb24gdGhlCisgIHRyYW5zaWVudCBpbiB0aGUgcHJlc2VudCBmcmFtZSBhcyB3ZWxsIGFzIGluIHRoZSBuZXh0LgogICAqLwogICB0cmFuc2llbnRGcmFtZSA9IDA7Ci0gIGlmKGhUb25Db3JyLT50cmFuc2llbnROZXh0RnJhbWUpeyAgICAgICAvKiBUaGUgdHJhbnNpZW50IHdhcyBkZXRlY3RlZCBpbiB0aGUgcHJldmlvdXMgZnJhbWUsIGJ1dCBpcyBhY3R1YWxseSAqLworICBpZiAoaFRvbkNvcnItPnRyYW5zaWVudE5leHRGcmFtZSkgeyAvKiBUaGUgdHJhbnNpZW50IHdhcyBkZXRlY3RlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgZnJhbWUsIGJ1dCBpcyBhY3R1YWxseSAqLwogICAgIHRyYW5zaWVudEZyYW1lID0gMTsKICAgICBoVG9uQ29yci0+dHJhbnNpZW50TmV4dEZyYW1lID0gMDsKIAotICAgIGlmKHRyYW5zaWVudEZsYWcpewotICAgICAgaWYodHJhbnNpZW50UG9zICsgaFRvbkNvcnItPnRyYW5zaWVudFBvc09mZnNldCA+PSBmcmFtZUluZm8tPmJvcmRlcnNbZnJhbWVJbmZvLT5uRW52ZWxvcGVzXSl7CisgICAgaWYgKHRyYW5zaWVudEZsYWcpIHsKKyAgICAgIGlmICh0cmFuc2llbnRQb3MgKyBoVG9uQ29yci0+dHJhbnNpZW50UG9zT2Zmc2V0ID49CisgICAgICAgICAgZnJhbWVJbmZvLT5ib3JkZXJzW2ZyYW1lSW5mby0+bkVudmVsb3Blc10pIHsKICAgICAgICAgaFRvbkNvcnItPnRyYW5zaWVudE5leHRGcmFtZSA9IDE7CiAgICAgICB9CiAgICAgfQotICB9Ci0gIGVsc2V7Ci0gICAgaWYodHJhbnNpZW50RmxhZyl7Ci0gICAgICBpZih0cmFuc2llbnRQb3MgKyBoVG9uQ29yci0+dHJhbnNpZW50UG9zT2Zmc2V0IDwgZnJhbWVJbmZvLT5ib3JkZXJzW2ZyYW1lSW5mby0+bkVudmVsb3Blc10peworICB9IGVsc2UgeworICAgIGlmICh0cmFuc2llbnRGbGFnKSB7CisgICAgICBpZiAodHJhbnNpZW50UG9zICsgaFRvbkNvcnItPnRyYW5zaWVudFBvc09mZnNldCA8CisgICAgICAgICAgZnJhbWVJbmZvLT5ib3JkZXJzW2ZyYW1lSW5mby0+bkVudmVsb3Blc10pIHsKICAgICAgICAgdHJhbnNpZW50RnJhbWUgPSAxOwogICAgICAgICBoVG9uQ29yci0+dHJhbnNpZW50TmV4dEZyYW1lID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2V7CisgICAgICB9IGVsc2UgewogICAgICAgICBoVG9uQ29yci0+dHJhbnNpZW50TmV4dEZyYW1lID0gMTsKICAgICAgIH0KICAgICB9CiAgIH0KICAgdHJhbnNpZW50RnJhbWVJbnZmRXN0ID0gdHJhbnNpZW50RnJhbWU7CiAKLQogICAvKgogICAgIEVzdGltYXRlIHRoZSByZXF1aXJlZCBpbnZlc2UgZmlsdGVyZWluZyBsZXZlbC4KICAgKi8KICAgaWYgKGhUb25Db3JyLT5zd2l0Y2hJbnZlcnNlRmlsdCkKLSAgICBGREtzYnJFbmNfcW1mSW52ZXJzZUZpbHRlcmluZ0RldGVjdG9yKCZoVG9uQ29yci0+c2JySW52RmlsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5xdW90YU1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5ucmdWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+aW5kZXhWZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+ZnJhbWVTdGFydEluZGV4SW52ZkVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlc1BlckZyYW1lICsgaFRvbkNvcnItPmZyYW1lU3RhcnRJbmRleEludmZFc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2llbnRGcmFtZUludmZFc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZWZWMpOworICAgIEZES3NickVuY19xbWZJbnZlcnNlRmlsdGVyaW5nRGV0ZWN0b3IoCisgICAgICAgICZoVG9uQ29yci0+c2JySW52RmlsdCwgaFRvbkNvcnItPnF1b3RhTWF0cml4LCBoVG9uQ29yci0+bnJnVmVjdG9yLAorICAgICAgICBoVG9uQ29yci0+aW5kZXhWZWN0b3IsIGhUb25Db3JyLT5mcmFtZVN0YXJ0SW5kZXhJbnZmRXN0LAorICAgICAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSArIGhUb25Db3JyLT5mcmFtZVN0YXJ0SW5kZXhJbnZmRXN0LAorICAgICAgICB0cmFuc2llbnRGcmFtZUludmZFc3QsIGluZlZlYyk7CiAKICAgLyoKICAgICAgIERldGVjdCB3aGF0IHRvbmVzIHdpbGwgYmUgbWlzc2luZy4KICAgICovCi0gIGlmICh4cG9zVHlwZSA9PSBYUE9TX0xDICl7Ci0gICAgRkRLc2JyRW5jX1Nick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvclFtZigmaFRvbkNvcnItPnNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5xdW90YU1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5zaWduTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRvbkNvcnItPmluZGV4VmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmdIYXJtb25pY0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nSGFybW9uaWNzSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlQ29tcGVuc2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRvbkNvcnItPm5yZ1ZlY3RvckZyZXEpOwotICB9Ci0gIGVsc2V7CisgIGlmICh4cG9zVHlwZSA9PSBYUE9TX0xDKSB7CisgICAgRkRLc2JyRW5jX1Nick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvclFtZigKKyAgICAgICAgJmhUb25Db3JyLT5zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IsIGhUb25Db3JyLT5xdW90YU1hdHJpeCwKKyAgICAgICAgaFRvbkNvcnItPnNpZ25NYXRyaXgsIGhUb25Db3JyLT5pbmRleFZlY3RvciwgZnJhbWVJbmZvLCB0cmFuc2llbnRJbmZvLAorICAgICAgICBtaXNzaW5nSGFybW9uaWNGbGFnLCBtaXNzaW5nSGFybW9uaWNzSW5kZXgsIGZyZXFCYW5kVGFibGUsIG5TZmIsCisgICAgICAgIGVudmVsb3BlQ29tcGVuc2F0aW9uLCBoVG9uQ29yci0+bnJnVmVjdG9yRnJlcSk7CisgIH0gZWxzZSB7CiAgICAgKm1pc3NpbmdIYXJtb25pY0ZsYWcgPSAwOwotICAgIEZES21lbWNsZWFyKG1pc3NpbmdIYXJtb25pY3NJbmRleCxuU2ZiKnNpemVvZihVQ0hBUikpOworICAgIEZES21lbWNsZWFyKG1pc3NpbmdIYXJtb25pY3NJbmRleCwgblNmYiAqIHNpemVvZihVQ0hBUikpOwogICB9CiAKLQotCiAgIC8qCiAgICAgTm9pc2UgZmxvb3IgZXN0aW1hdGlvbgogICAqLwogCiAgIGluZlZlY1B0ciA9IGhUb25Db3JyLT5zYnJJbnZGaWx0LnByZXZJbnZmTW9kZTsKIAotICBGREtzYnJFbmNfc2JyTm9pc2VGbG9vckVzdGltYXRlUW1mKCZoVG9uQ29yci0+c2JyTm9pc2VGbG9vckVzdGltYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2lzZUxldmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+cXVvdGFNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRvbkNvcnItPmluZGV4VmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptaXNzaW5nSGFybW9uaWNGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5mcmFtZVN0YXJ0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpZW50RnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mVmVjUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiclN5bnRheEZsYWdzKTsKLQorICBGREtzYnJFbmNfc2JyTm9pc2VGbG9vckVzdGltYXRlUW1mKAorICAgICAgJmhUb25Db3JyLT5zYnJOb2lzZUZsb29yRXN0aW1hdGUsIGZyYW1lSW5mbywgbm9pc2VMZXZlbHMsCisgICAgICBoVG9uQ29yci0+cXVvdGFNYXRyaXgsIGhUb25Db3JyLT5pbmRleFZlY3RvciwgKm1pc3NpbmdIYXJtb25pY0ZsYWcsCisgICAgICBoVG9uQ29yci0+ZnJhbWVTdGFydEluZGV4LCBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSwKKyAgICAgIHRyYW5zaWVudEZyYW1lLCBpbmZWZWNQdHIsIHNiclN5bnRheEZsYWdzKTsKIAogICAvKiBTdG9yZSB0aGUgaW52ZlZlYyBkYXRhIGZvciB0aGUgbmV4dCBmcmFtZS4uLiovCi0gIGZvcihiYW5kID0gMCA7IGJhbmQgPCBoVG9uQ29yci0+c2JySW52RmlsdC5ub0RldGVjdG9yQmFuZHM7IGJhbmQrKyl7CisgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBoVG9uQ29yci0+c2JySW52RmlsdC5ub0RldGVjdG9yQmFuZHM7IGJhbmQrKykgewogICAgIGhUb25Db3JyLT5zYnJJbnZGaWx0LnByZXZJbnZmTW9kZVtiYW5kXSA9IGluZlZlY1tiYW5kXTsKICAgfQogfQpAQCAtNDQ5LDI4ICs0NjUsMjIgQEAKIAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQKLWZpbmRDbG9zZXN0RW50cnkoSU5UIGdvYWxTYiwKLSAgICAgICAgICAgICAgICAgVUNIQVIgKnZfa19tYXN0ZXIsCi0gICAgICAgICAgICAgICAgIElOVCBudW1NYXN0ZXIsCi0gICAgICAgICAgICAgICAgIElOVCBkaXJlY3Rpb24pCi17CitzdGF0aWMgSU5UIGZpbmRDbG9zZXN0RW50cnkoSU5UIGdvYWxTYiwgVUNIQVIgKnZfa19tYXN0ZXIsIElOVCBudW1NYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGRpcmVjdGlvbikgewogICBJTlQgaW5kZXg7CiAKLSAgaWYoIGdvYWxTYiA8PSB2X2tfbWFzdGVyWzBdICkKLSAgICByZXR1cm4gdl9rX21hc3RlclswXTsKKyAgaWYgKGdvYWxTYiA8PSB2X2tfbWFzdGVyWzBdKSByZXR1cm4gdl9rX21hc3RlclswXTsKIAotICBpZiggZ29hbFNiID49IHZfa19tYXN0ZXJbbnVtTWFzdGVyXSApCi0gICAgcmV0dXJuIHZfa19tYXN0ZXJbbnVtTWFzdGVyXTsKKyAgaWYgKGdvYWxTYiA+PSB2X2tfbWFzdGVyW251bU1hc3Rlcl0pIHJldHVybiB2X2tfbWFzdGVyW251bU1hc3Rlcl07CiAKLSAgaWYoZGlyZWN0aW9uKSB7CisgIGlmIChkaXJlY3Rpb24pIHsKICAgICBpbmRleCA9IDA7Ci0gICAgd2hpbGUoIHZfa19tYXN0ZXJbaW5kZXhdIDwgZ29hbFNiICkgeworICAgIHdoaWxlICh2X2tfbWFzdGVyW2luZGV4XSA8IGdvYWxTYikgewogICAgICAgaW5kZXgrKzsKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgaW5kZXggPSBudW1NYXN0ZXI7Ci0gICAgd2hpbGUoIHZfa19tYXN0ZXJbaW5kZXhdID4gZ29hbFNiICkgeworICAgIHdoaWxlICh2X2tfbWFzdGVyW2luZGV4XSA+IGdvYWxTYikgewogICAgICAgaW5kZXgtLTsKICAgICB9CiAgIH0KQEAgLTQ3OCw3ICs0ODgsNiBAQAogICByZXR1cm4gdl9rX21hc3RlcltpbmRleF07CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAgIFxicmllZiAgICAgcmVzZXRzIHRoZSBwYXRjaApAQCAtNDg5LDMyICs0OTgsMzYgQEAKIAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBJTlQKLXJlc2V0UGF0Y2goSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsICAvKiE8IEhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLwotICAgICAgICAgICBJTlQgeHBvc2N0cmwsICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGlmZmVyZW50IHBhdGNoIG1vZGVzLiAqLwotICAgICAgICAgICBJTlQgaGlnaEJhbmRTdGFydFNiLCAgICAgICAgICAgICAgIC8qITwgU3RhcnQgYmFuZCBvZiB0aGUgU0JSIHJhbmdlLiAqLwotICAgICAgICAgICBVQ0hBUiAqdl9rX21hc3RlciwgICAgICAgICAgICAgICAgICAgLyohPCBNYXN0ZXIgZnJlcXVlbmN5IHRhYmxlIGZyb20gd2hpY2ggYWxsIG90aGVyIHRhYmxlIGFyZSBkZXJpdmVkLiovCi0gICAgICAgICAgIElOVCBudW1NYXN0ZXIsICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG1hc3RlciB0YWJsZS4gKi8KLSAgICAgICAgICAgSU5UIGZzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsaW5nIGZyZXF1ZW5jeS4gKi8KLSAgICAgICAgICAgSU5UIG5vQ2hhbm5lbHMpICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBRTUYtY2hhbm5lbHMuICovCitzdGF0aWMgSU5UIHJlc2V0UGF0Y2goCisgICAgSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsIC8qITwgSGFuZGxlIHRvIFNCUl9UT05fQ09SUiBzdHJ1Y3QuICovCisgICAgSU5UIHhwb3NjdHJsLCAgICAgICAgICAgICAgICAgICAgIC8qITwgRGlmZmVyZW50IHBhdGNoIG1vZGVzLiAqLworICAgIElOVCBoaWdoQmFuZFN0YXJ0U2IsICAgICAgICAgICAgICAvKiE8IFN0YXJ0IGJhbmQgb2YgdGhlIFNCUiByYW5nZS4gKi8KKyAgICBVQ0hBUiAqdl9rX21hc3RlciwgLyohPCBNYXN0ZXIgZnJlcXVlbmN5IHRhYmxlIGZyb20gd2hpY2ggYWxsIG90aGVyIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBkZXJpdmVkLiovCisgICAgSU5UIG51bU1hc3RlciwgICAgIC8qITwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXN0ZXIgdGFibGUuICovCisgICAgSU5UIGZzLCAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgZnJlcXVlbmN5LiAqLworICAgIElOVCBub0NoYW5uZWxzKSAgICAvKiE8IE51bWJlciBvZiBRTUYtY2hhbm5lbHMuICovCiB7Ci0gIElOVCBwYXRjaCxrLGk7CisgIElOVCBwYXRjaCwgaywgaTsKICAgSU5UIHRhcmdldFN0b3BCYW5kOwogCi0gIFBBVENIX1BBUkFNICAqcGF0Y2hQYXJhbSA9IGhUb25Db3JyLT5wYXRjaFBhcmFtOworICBQQVRDSF9QQVJBTSAqcGF0Y2hQYXJhbSA9IGhUb25Db3JyLT5wYXRjaFBhcmFtOwogCiAgIElOVCBzYkd1YXJkID0gaFRvbkNvcnItPmd1YXJkOwogICBJTlQgc291cmNlU3RhcnRCYW5kOwogICBJTlQgcGF0Y2hEaXN0YW5jZTsKICAgSU5UIG51bUJhbmRzSW5QYXRjaDsKIAotICBJTlQgbHNiID0gdl9rX21hc3RlclswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3dlc3Qgc3ViYmFuZCByZWxhdGVkIHRvIHRoZSBzeW50aGVzaXMgZmlsdGVyYmFuayAqLwotICBJTlQgdXNiID0gdl9rX21hc3RlcltudW1NYXN0ZXJdOyAgICAgICAgICAgICAgICAgICAvKiBTdG9wIHN1YmJhbmQgcmVsYXRlZCB0byB0aGUgc3ludGhlc2lzIGZpbHRlcmJhbmsgKi8KLSAgSU5UIHhvdmVyT2Zmc2V0ID0gaGlnaEJhbmRTdGFydFNiIC0gdl9rX21hc3RlclswXTsgLyogQ2FsY3VsYXRlIGRpc3RhbmNlIGluIHN1YmJhbmRzIGJldHdlZW4gazAgYW5kIGt4ICovCisgIElOVCBsc2IgPQorICAgICAgdl9rX21hc3RlclswXTsgLyogTG93ZXN0IHN1YmJhbmQgcmVsYXRlZCB0byB0aGUgc3ludGhlc2lzIGZpbHRlcmJhbmsgKi8KKyAgSU5UIHVzYiA9IHZfa19tYXN0ZXJbbnVtTWFzdGVyXTsgLyogU3RvcCBzdWJiYW5kIHJlbGF0ZWQgdG8gdGhlIHN5bnRoZXNpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJiYW5rICovCisgIElOVCB4b3Zlck9mZnNldCA9CisgICAgICBoaWdoQmFuZFN0YXJ0U2IgLQorICAgICAgdl9rX21hc3RlclswXTsgLyogQ2FsY3VsYXRlIGRpc3RhbmNlIGluIHN1YmJhbmRzIGJldHdlZW4gazAgYW5kIGt4ICovCiAKICAgSU5UIGdvYWxTYjsKIAotCiAgIC8qCiAgICAqIEluaXRpYWxpemUgdGhlIHBhdGNoaW5nIHBhcmFtZXRlcgogICAgKi8KQEAgLTUyNCw0NyArNTM3LDU1IEBACiAgICAgeG92ZXJPZmZzZXQgPSAwOwogICB9CiAKLSAgZ29hbFNiID0gKElOVCkoICgyICogbm9DaGFubmVscyAqIDE2MDAwICsgKGZzPj4xKSkgLyBmcyApOyAvKiAxNiBrSHogYmFuZCAqLwotICBnb2FsU2IgPSBmaW5kQ2xvc2VzdEVudHJ5KGdvYWxTYiwgdl9rX21hc3RlciwgbnVtTWFzdGVyLCAxKTsgLyogQWRhcHQgcmVnaW9uIHRvIG1hc3Rlci10YWJsZSAqLworICBnb2FsU2IgPSAoSU5UKSgoMiAqIG5vQ2hhbm5lbHMgKiAxNjAwMCArIChmcyA+PiAxKSkgLyBmcyk7IC8qIDE2IGtIeiBiYW5kICovCisgIGdvYWxTYiA9IGZpbmRDbG9zZXN0RW50cnkoZ29hbFNiLCB2X2tfbWFzdGVyLCBudW1NYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7IC8qIEFkYXB0IHJlZ2lvbiB0byBtYXN0ZXItdGFibGUgKi8KIAogICAvKiBGaXJzdCBwYXRjaCAqLwogICBzb3VyY2VTdGFydEJhbmQgPSBoVG9uQ29yci0+c2hpZnRTdGFydFNiICsgeG92ZXJPZmZzZXQ7CiAgIHRhcmdldFN0b3BCYW5kID0gbHNiICsgeG92ZXJPZmZzZXQ7CiAKLSAgLyogZXZlbiAob2RkKSBudW1iZXJlZCBjaGFubmVsIG11c3QgYmUgcGF0Y2hlZCB0byBldmVuIChvZGQpIG51bWJlcmVkIGNoYW5uZWwgKi8KKyAgLyogZXZlbiAob2RkKSBudW1iZXJlZCBjaGFubmVsIG11c3QgYmUgcGF0Y2hlZCB0byBldmVuIChvZGQpIG51bWJlcmVkIGNoYW5uZWwKKyAgICovCiAgIHBhdGNoID0gMDsKLSAgd2hpbGUodGFyZ2V0U3RvcEJhbmQgPCB1c2IpIHsKLQorICB3aGlsZSAodGFyZ2V0U3RvcEJhbmQgPCB1c2IpIHsKICAgICAvKiBUbyBtYW55IHBhdGNoZXMgKi8KLSAgICBpZiAocGF0Y2ggPj0gTUFYX05VTV9QQVRDSEVTKQotICAgICAgcmV0dXJuKDEpOyAvKk51bWJlciBvZiBwYXRjaGVzIHRvIGhpZ2ggKi8KKyAgICBpZiAocGF0Y2ggPj0gTUFYX05VTV9QQVRDSEVTKSByZXR1cm4gKDEpOyAvKk51bWJlciBvZiBwYXRjaGVzIHRvIGhpZ2ggKi8KIAogICAgIHBhdGNoUGFyYW1bcGF0Y2hdLmd1YXJkU3RhcnRCYW5kID0gdGFyZ2V0U3RvcEJhbmQ7CiAgICAgdGFyZ2V0U3RvcEJhbmQgKz0gc2JHdWFyZDsKICAgICBwYXRjaFBhcmFtW3BhdGNoXS50YXJnZXRTdGFydEJhbmQgPSB0YXJnZXRTdG9wQmFuZDsKIAotICAgIG51bUJhbmRzSW5QYXRjaCA9IGdvYWxTYiAtIHRhcmdldFN0b3BCYW5kOyAgICAgICAgICAgICAgICAgICAvKiBnZXQgdGhlIGRlc2lyZWQgcmFuZ2Ugb2YgdGhlIHBhdGNoICovCisgICAgbnVtQmFuZHNJblBhdGNoID0KKyAgICAgICAgZ29hbFNiIC0gdGFyZ2V0U3RvcEJhbmQ7IC8qIGdldCB0aGUgZGVzaXJlZCByYW5nZSBvZiB0aGUgcGF0Y2ggKi8KIAotICAgIGlmICggbnVtQmFuZHNJblBhdGNoID49IGxzYiAtIHNvdXJjZVN0YXJ0QmFuZCApIHsKKyAgICBpZiAobnVtQmFuZHNJblBhdGNoID49IGxzYiAtIHNvdXJjZVN0YXJ0QmFuZCkgewogICAgICAgLyogZGVzaXJlZCBudW1iZXIgYmFuZHMgYXJlIG5vdCBhdmFpbGFibGUgLT4gcGF0Y2ggd2hvbGUgc291cmNlIHJhbmdlICovCi0gICAgICBwYXRjaERpc3RhbmNlICAgPSB0YXJnZXRTdG9wQmFuZCAtIHNvdXJjZVN0YXJ0QmFuZDsgICAgICAgIC8qIGdldCB0aGUgdGFyZ2V0T2Zmc2V0ICovCi0gICAgICBwYXRjaERpc3RhbmNlICAgPSBwYXRjaERpc3RhbmNlICYgfjE7ICAgICAgICAgICAgICAgICAgICAgIC8qIHJvdW5kaW5nIG9mZiBvZGQgbnVtYmVycyBhbmQgbWFrZSBhbGwgZXZlbiAqLworICAgICAgcGF0Y2hEaXN0YW5jZSA9CisgICAgICAgICAgdGFyZ2V0U3RvcEJhbmQgLSBzb3VyY2VTdGFydEJhbmQ7IC8qIGdldCB0aGUgdGFyZ2V0T2Zmc2V0ICovCisgICAgICBwYXRjaERpc3RhbmNlID0KKyAgICAgICAgICBwYXRjaERpc3RhbmNlICYgfjE7IC8qIHJvdW5kaW5nIG9mZiBvZGQgbnVtYmVycyBhbmQgbWFrZSBhbGwgZXZlbiAqLwogICAgICAgbnVtQmFuZHNJblBhdGNoID0gbHNiIC0gKHRhcmdldFN0b3BCYW5kIC0gcGF0Y2hEaXN0YW5jZSk7Ci0gICAgICBudW1CYW5kc0luUGF0Y2ggPSBmaW5kQ2xvc2VzdEVudHJ5KHRhcmdldFN0b3BCYW5kICsgbnVtQmFuZHNJblBhdGNoLCB2X2tfbWFzdGVyLCBudW1NYXN0ZXIsIDApIC0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFN0b3BCYW5kOyAgLyogQWRhcHQgcmVnaW9uIHRvIG1hc3Rlci10YWJsZSAqLworICAgICAgbnVtQmFuZHNJblBhdGNoID0gZmluZENsb3Nlc3RFbnRyeSh0YXJnZXRTdG9wQmFuZCArIG51bUJhbmRzSW5QYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9rX21hc3RlciwgbnVtTWFzdGVyLCAwKSAtCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRTdG9wQmFuZDsgLyogQWRhcHQgcmVnaW9uIHRvIG1hc3Rlci10YWJsZSAqLwogICAgIH0KIAotICAgIC8qIGRlc2lyZWQgbnVtYmVyIGJhbmRzIGFyZSBhdmFpbGFibGUgLT4gZ2V0IHRoZSBtaW5pbWFsIGV2ZW4gcGF0Y2hpbmcgZGlzdGFuY2UgKi8KLSAgICBwYXRjaERpc3RhbmNlICAgPSBudW1CYW5kc0luUGF0Y2ggKyB0YXJnZXRTdG9wQmFuZCAtIGxzYjsgIC8qIGdldCBtaW5pbWFsIGRpc3RhbmNlICovCi0gICAgcGF0Y2hEaXN0YW5jZSAgID0gKHBhdGNoRGlzdGFuY2UgKyAxKSAmIH4xOyAgICAgICAgICAgICAgICAvKiByb3VuZGluZyB1cCBvZGQgbnVtYmVycyBhbmQgbWFrZSBhbGwgZXZlbiAqLworICAgIC8qIGRlc2lyZWQgbnVtYmVyIGJhbmRzIGFyZSBhdmFpbGFibGUgLT4gZ2V0IHRoZSBtaW5pbWFsIGV2ZW4gcGF0Y2hpbmcKKyAgICAgKiBkaXN0YW5jZSAqLworICAgIHBhdGNoRGlzdGFuY2UgPQorICAgICAgICBudW1CYW5kc0luUGF0Y2ggKyB0YXJnZXRTdG9wQmFuZCAtIGxzYjsgLyogZ2V0IG1pbmltYWwgZGlzdGFuY2UgKi8KKyAgICBwYXRjaERpc3RhbmNlID0gKHBhdGNoRGlzdGFuY2UgKyAxKSAmCisgICAgICAgICAgICAgICAgICAgIH4xOyAvKiByb3VuZGluZyB1cCBvZGQgbnVtYmVycyBhbmQgbWFrZSBhbGwgZXZlbiAqLwogCiAgICAgaWYgKG51bUJhbmRzSW5QYXRjaCA8PSAwKSB7CiAgICAgICBwYXRjaC0tOwogICAgIH0gZWxzZSB7CiAgICAgICBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdGFydEJhbmQgPSB0YXJnZXRTdG9wQmFuZCAtIHBhdGNoRGlzdGFuY2U7Ci0gICAgICBwYXRjaFBhcmFtW3BhdGNoXS50YXJnZXRCYW5kT2ZmcyAgPSBwYXRjaERpc3RhbmNlOworICAgICAgcGF0Y2hQYXJhbVtwYXRjaF0udGFyZ2V0QmFuZE9mZnMgPSBwYXRjaERpc3RhbmNlOwogICAgICAgcGF0Y2hQYXJhbVtwYXRjaF0ubnVtQmFuZHNJblBhdGNoID0gbnVtQmFuZHNJblBhdGNoOwotICAgICAgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RvcEJhbmQgID0gcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RhcnRCYW5kICsgbnVtQmFuZHNJblBhdGNoOworICAgICAgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RvcEJhbmQgPQorICAgICAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0YXJ0QmFuZCArIG51bUJhbmRzSW5QYXRjaDsKIAogICAgICAgdGFyZ2V0U3RvcEJhbmQgKz0gcGF0Y2hQYXJhbVtwYXRjaF0ubnVtQmFuZHNJblBhdGNoOwogICAgIH0KQEAgLTU3Myw0MiArNTk0LDM4IEBACiAgICAgc291cmNlU3RhcnRCYW5kID0gaFRvbkNvcnItPnNoaWZ0U3RhcnRTYjsKIAogICAgIC8qIENoZWNrIGlmIHdlIGFyZSBjbG9zZSB0byBnb2FsU2IgKi8KLSAgICBpZiggZml4cF9hYnModGFyZ2V0U3RvcEJhbmQgLSBnb2FsU2IpIDwgMykgeworICAgIGlmIChmaXhwX2Ficyh0YXJnZXRTdG9wQmFuZCAtIGdvYWxTYikgPCAzKSB7CiAgICAgICBnb2FsU2IgPSB1c2I7CiAgICAgfQogCiAgICAgcGF0Y2grKzsKLQogICB9CiAKICAgcGF0Y2gtLTsKIAogICAvKiBpZiBoaWdoZXN0IHBhdGNoIGNvbnRhaW5zIGxlc3MgdGhhbiB0aHJlZSBzdWJiYW5kOiBza2lwIGl0ICovCi0gIGlmICggcGF0Y2hQYXJhbVtwYXRjaF0ubnVtQmFuZHNJblBhdGNoIDwgMyAmJiBwYXRjaCA+IDAgKSB7CisgIGlmIChwYXRjaFBhcmFtW3BhdGNoXS5udW1CYW5kc0luUGF0Y2ggPCAzICYmIHBhdGNoID4gMCkgewogICAgIHBhdGNoLS07Ci0gICAgdGFyZ2V0U3RvcEJhbmQgPSBwYXRjaFBhcmFtW3BhdGNoXS50YXJnZXRTdGFydEJhbmQgKyBwYXRjaFBhcmFtW3BhdGNoXS5udW1CYW5kc0luUGF0Y2g7CiAgIH0KIAogICBoVG9uQ29yci0+bm9PZlBhdGNoZXMgPSBwYXRjaCArIDE7CiAKLQogICAvKiBBc3NpZ24gdGhlIGluZGV4LXZlY3Rvciwgc28gd2Uga25vdyB3aGVyZSB0byBsb29rIGZvciB0aGUgaGlnaC1iYW5kLgogICAgICAtMSByZXByZXNlbnRzIGEgZ3VhcmQtYmFuZC4gKi8KLSAgZm9yKGsgPSAwOyBrIDwgaFRvbkNvcnItPnBhdGNoUGFyYW1bMF0uZ3VhcmRTdGFydEJhbmQ7IGsrKykKKyAgZm9yIChrID0gMDsgayA8IGhUb25Db3JyLT5wYXRjaFBhcmFtWzBdLmd1YXJkU3RhcnRCYW5kOyBrKyspCiAgICAgaFRvbkNvcnItPmluZGV4VmVjdG9yW2tdID0gazsKIAotICBmb3IoaSA9IDA7IGkgPCBoVG9uQ29yci0+bm9PZlBhdGNoZXM7IGkrKykKLSAgewotICAgIElOVCBzb3VyY2VTdGFydCAgICA9IGhUb25Db3JyLT5wYXRjaFBhcmFtW2ldLnNvdXJjZVN0YXJ0QmFuZDsKLSAgICBJTlQgdGFyZ2V0U3RhcnQgICAgPSBoVG9uQ29yci0+cGF0Y2hQYXJhbVtpXS50YXJnZXRTdGFydEJhbmQ7Ci0gICAgSU5UIG51bWJlck9mQmFuZHMgID0gaFRvbkNvcnItPnBhdGNoUGFyYW1baV0ubnVtQmFuZHNJblBhdGNoOworICBmb3IgKGkgPSAwOyBpIDwgaFRvbkNvcnItPm5vT2ZQYXRjaGVzOyBpKyspIHsKKyAgICBJTlQgc291cmNlU3RhcnQgPSBoVG9uQ29yci0+cGF0Y2hQYXJhbVtpXS5zb3VyY2VTdGFydEJhbmQ7CisgICAgSU5UIHRhcmdldFN0YXJ0ID0gaFRvbkNvcnItPnBhdGNoUGFyYW1baV0udGFyZ2V0U3RhcnRCYW5kOworICAgIElOVCBudW1iZXJPZkJhbmRzID0gaFRvbkNvcnItPnBhdGNoUGFyYW1baV0ubnVtQmFuZHNJblBhdGNoOwogICAgIElOVCBzdGFydEd1YXJkQmFuZCA9IGhUb25Db3JyLT5wYXRjaFBhcmFtW2ldLmd1YXJkU3RhcnRCYW5kOwogCi0gICAgZm9yKGsgPSAwOyBrIDwgKHRhcmdldFN0YXJ0LSBzdGFydEd1YXJkQmFuZCk7IGsrKykKLSAgICAgIGhUb25Db3JyLT5pbmRleFZlY3RvcltzdGFydEd1YXJkQmFuZCtrXSA9IC0xOworICAgIGZvciAoayA9IDA7IGsgPCAodGFyZ2V0U3RhcnQgLSBzdGFydEd1YXJkQmFuZCk7IGsrKykKKyAgICAgIGhUb25Db3JyLT5pbmRleFZlY3RvcltzdGFydEd1YXJkQmFuZCArIGtdID0gLTE7CiAKLSAgICBmb3IoayA9IDA7IGsgPCBudW1iZXJPZkJhbmRzOyBrKyspCi0gICAgICBoVG9uQ29yci0+aW5kZXhWZWN0b3JbdGFyZ2V0U3RhcnQra10gPSBzb3VyY2VTdGFydCtrOworICAgIGZvciAoayA9IDA7IGsgPCBudW1iZXJPZkJhbmRzOyBrKyspCisgICAgICBoVG9uQ29yci0+aW5kZXhWZWN0b3JbdGFyZ2V0U3RhcnQgKyBrXSA9IHNvdXJjZVN0YXJ0ICsgazsKICAgfQogCiAgIHJldHVybiAoMCk7CkBAIC02MjQsMjggKzY0MSw0MiBAQAogICBccmV0dXJuICAgZXJyb3JDb2RlLCBub0Vycm9yIGlmIHN1Y2Nlc3NmdWwuCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UCi1GREtzYnJFbmNfQ3JlYXRlVG9uQ29yclBhcmFtRXh0cihIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVCBoVG9uQ29yciwgLyohPCBQb2ludGVyIHRvIGhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgY2hhbikgICAgIC8qITwgQ2hhbm5lbCBpbmRleCwgbmVlZGVkIGZvciBtZW0gYWxsb2NhdGlvbiAqLworSU5UIEZES3NickVuY19DcmVhdGVUb25Db3JyUGFyYW1FeHRyKAorICAgIEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUCisgICAgICAgIGhUb25Db3JyLCAvKiE8IFBvaW50ZXIgdG8gaGFuZGxlIHRvIFNCUl9UT05fQ09SUiBzdHJ1Y3QuICovCisgICAgSU5UIGNoYW4pICAgICAvKiE8IENoYW5uZWwgaW5kZXgsIG5lZWRlZCBmb3IgbWVtIGFsbG9jYXRpb24gKi8KIHsKICAgSU5UIGk7Ci0gIEZJWFBfREJMKiBxdW90YU1hdHJpeCA9IEdldFJhbV9TYnJfcXVvdGFNYXRyaXgoY2hhbik7Ci0gIElOVCogICAgICBzaWduTWF0cml4ICA9IEdldFJhbV9TYnJfc2lnbk1hdHJpeChjaGFuKTsKKyAgRklYUF9EQkwgKnF1b3RhTWF0cml4ID0gR2V0UmFtX1Nicl9xdW90YU1hdHJpeChjaGFuKTsKKyAgSU5UICpzaWduTWF0cml4ID0gR2V0UmFtX1Nicl9zaWduTWF0cml4KGNoYW4pOworCisgIGlmICgoTlVMTCA9PSBxdW90YU1hdHJpeCkgfHwgKE5VTEwgPT0gc2lnbk1hdHJpeCkpIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KIAogICBGREttZW1jbGVhcihoVG9uQ29yciwgc2l6ZW9mKFNCUl9UT05fQ09SUl9FU1QpKTsKIAotICBmb3IgKGk9MDsgaTxNQVhfTk9fT0ZfRVNUSU1BVEVTOyBpKyspIHsKLSAgICBoVG9uQ29yci0+cXVvdGFNYXRyaXhbaV0gPSBxdW90YU1hdHJpeCArIChpKlFNRl9DSEFOTkVMUyk7Ci0gICAgaFRvbkNvcnItPnNpZ25NYXRyaXhbaV0gID0gc2lnbk1hdHJpeCAgKyAoaSpRTUZfQ0hBTk5FTFMpOworICBmb3IgKGkgPSAwOyBpIDwgTUFYX05PX09GX0VTVElNQVRFUzsgaSsrKSB7CisgICAgaFRvbkNvcnItPnF1b3RhTWF0cml4W2ldID0gcXVvdGFNYXRyaXggKyAoaSAqIDY0KTsKKyAgICBoVG9uQ29yci0+c2lnbk1hdHJpeFtpXSA9IHNpZ25NYXRyaXggKyAoaSAqIDY0KTsKICAgfQogCi0gIEZES3NickVuY19DcmVhdGVTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IgKCZoVG9uQ29yci0+c2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLCBjaGFuKTsKKyAgaWYgKDAgIT0gRkRLc2JyRW5jX0NyZWF0ZVNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvcigKKyAgICAgICAgICAgICAgICZoVG9uQ29yci0+c2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLCBjaGFuKSkgeworICAgIGdvdG8gYmFpbDsKKyAgfQogCiAgIHJldHVybiAwOworCitiYWlsOgorICBoVG9uQ29yci0+cXVvdGFNYXRyaXhbMF0gPSBxdW90YU1hdHJpeDsKKyAgaFRvbkNvcnItPnNpZ25NYXRyaXhbMF0gPSBzaWduTWF0cml4OworCisgIEZES3NickVuY19EZWxldGVUb25Db3JyUGFyYW1FeHRyKGhUb25Db3JyKTsKKworICByZXR1cm4gLTE7CiB9CiAKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiEKICAgXGJyaWVmICAgICBJbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSB0b25hbGl0eSBjb3JyZWN0aW9uIHBhcmFtZXRlciBtb2R1bGUuCkBAIC02NTYsMjcgKzY4NywyOSBAQAogICBccmV0dXJuICAgZXJyb3JDb2RlLCBub0Vycm9yIGlmIHN1Y2Nlc3NmdWwuCiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UCi1GREtzYnJFbmNfSW5pdFRvbkNvcnJQYXJhbUV4dHIgKElOVCBmcmFtZVNpemUsICAgICAgICAgICAgICAgICAgICAgLyohPCBDdXJyZW50IFNCUiBmcmFtZSBzaXplLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVCBoVG9uQ29yciwgIC8qITwgUG9pbnRlciB0byBoYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSBzYnJDZmcsICAgICAvKiE8IFBvaW50ZXIgdG8gU0JSIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRpbWVTbG90cywgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiB0aW1lLXNsb3RzIHBlciBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgeHBvc0N0cmwsICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGlmZmVyZW50IHBhdGNoIG1vZGVzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYW5hX21heF9sZXZlbCwgICAgICAgICAgICAgICAgIC8qITwgTWF4aW11bSBsZXZlbCBvZiB0aGUgYWRhcHRpdmUgbm9pc2UuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBub2lzZUJhbmRzLCAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygbm9pc2UgYmFuZHMgcGVyIG9jdGF2ZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5vaXNlRmxvb3JPZmZzZXQsICAgICAgICAgICAgICAvKiE8IE5vaXNlIGZsb29yIG9mZnNldC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCB1c2VTcGVlY2hDb25maWcpICAgICAgICAgICAgICAvKiE8IFNwZWVjaCBvciBtdXNpYyB0dW5pbmcuICovCitJTlQgRkRLc2JyRW5jX0luaXRUb25Db3JyUGFyYW1FeHRyKAorICAgIElOVCBmcmFtZVNpemUsIC8qITwgQ3VycmVudCBTQlIgZnJhbWUgc2l6ZS4gKi8KKyAgICBIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVAorICAgICAgICBoVG9uQ29yciwgLyohPCBQb2ludGVyIHRvIGhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLworICAgIEhBTkRMRV9TQlJfQ09ORklHX0RBVEEKKyAgICAgICAgc2JyQ2ZnLCAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIFNCUiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuICovCisgICAgSU5UIHRpbWVTbG90cywgICAgICAgIC8qITwgTnVtYmVyIG9mIHRpbWUtc2xvdHMgcGVyIGZyYW1lICovCisgICAgSU5UIHhwb3NDdHJsLCAgICAgICAgIC8qITwgRGlmZmVyZW50IHBhdGNoIG1vZGVzLiAqLworICAgIElOVCBhbmFfbWF4X2xldmVsLCAgICAvKiE8IE1heGltdW0gbGV2ZWwgb2YgdGhlIGFkYXB0aXZlIG5vaXNlLiAqLworICAgIElOVCBub2lzZUJhbmRzLCAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcyBwZXIgb2N0YXZlLiAqLworICAgIElOVCBub2lzZUZsb29yT2Zmc2V0LCAvKiE8IE5vaXNlIGZsb29yIG9mZnNldC4gKi8KKyAgICBVSU5UIHVzZVNwZWVjaENvbmZpZykgLyohPCBTcGVlY2ggb3IgbXVzaWMgdHVuaW5nLiAqLwogewogICBJTlQgbkNvbHMgPSBzYnJDZmctPm5vUW1mU2xvdHM7Ci0gIElOVCBmcyAgICA9IHNickNmZy0+c2FtcGxlRnJlcTsKKyAgSU5UIGZzID0gc2JyQ2ZnLT5zYW1wbGVGcmVxOwogICBJTlQgbm9RbWZDaGFubmVscyA9IHNickNmZy0+bm9RbWZCYW5kczsKIAogICBJTlQgaGlnaEJhbmRTdGFydFNiID0gc2JyQ2ZnLT5mcmVxQmFuZFRhYmxlW0xPV19SRVNdWzBdOwotICBVQ0hBUiAqdl9rX21hc3RlciAgID0gc2JyQ2ZnLT52X2tfbWFzdGVyOwotICBJTlQgbnVtTWFzdGVyICAgICAgID0gc2JyQ2ZnLT5udW1fTWFzdGVyOworICBVQ0hBUiAqdl9rX21hc3RlciA9IHNickNmZy0+dl9rX21hc3RlcjsKKyAgSU5UIG51bU1hc3RlciA9IHNickNmZy0+bnVtX01hc3RlcjsKIAotICBVQ0hBUiAqKmZyZXFCYW5kVGFibGUgICA9IHNickNmZy0+ZnJlcUJhbmRUYWJsZTsKLSAgSU5UICAgICpuU2ZiICAgICAgICAgICAgPSBzYnJDZmctPm5TZmI7CisgIFVDSEFSICoqZnJlcUJhbmRUYWJsZSA9IHNickNmZy0+ZnJlcUJhbmRUYWJsZTsKKyAgSU5UICpuU2ZiID0gc2JyQ2ZnLT5uU2ZiOwogCiAgIElOVCBpOwogCkBAIC02ODYsMTEzICs3MTksMTAyIEBACiAgICovCiAgIGlmIChzYnJDZmctPnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpIHsKICAgICBzd2l0Y2ggKHRpbWVTbG90cykgewotICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDoKLSAgICAgIGhUb25Db3JyLT5scGNMZW5ndGhbMF0gICAgICAgICAgICAgID0gOCAtIExQQ19PUkRFUjsKLSAgICAgIGhUb25Db3JyLT5scGNMZW5ndGhbMV0gICAgICAgICAgICAgID0gNyAtIExQQ19PUkRFUjsKLSAgICAgIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlcyAgICAgICAgID0gTk9fT0ZfRVNUSU1BVEVTX0xEOwotICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUgPSAyOyAvKiBzYnJDZmctPm5vUW1mU2xvdHMgLyA3ICovCi0gICAgICBoVG9uQ29yci0+ZnJhbWVTdGFydEluZGV4SW52ZkVzdCAgICA9IDA7Ci0gICAgICBoVG9uQ29yci0+dHJhbnNpZW50UG9zT2Zmc2V0ICAgICAgICA9IEZSQU1FX01JRERMRV9TTE9UXzUxMkxEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OgotICAgICAgaFRvbkNvcnItPmxwY0xlbmd0aFswXSAgICAgICAgICAgICAgPSA4IC0gTFBDX09SREVSOwotICAgICAgaFRvbkNvcnItPmxwY0xlbmd0aFsxXSAgICAgICAgICAgICAgPSA4IC0gTFBDX09SREVSOwotICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzICAgICAgICAgPSBOT19PRl9FU1RJTUFURVNfTEQ7Ci0gICAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSA9IDI7IC8qIHNickNmZy0+bm9RbWZTbG90cyAvIDggKi8KLSAgICAgIGhUb25Db3JyLT5mcmFtZVN0YXJ0SW5kZXhJbnZmRXN0ICAgID0gMDsKLSAgICAgIGhUb25Db3JyLT50cmFuc2llbnRQb3NPZmZzZXQgICAgICAgID0gRlJBTUVfTUlERExFX1NMT1RfNTEyTEQ7Ci0gICAgICBicmVhazsKKyAgICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDoKKyAgICAgICAgaFRvbkNvcnItPmxwY0xlbmd0aFswXSA9IDggLSBMUENfT1JERVI7CisgICAgICAgIGhUb25Db3JyLT5scGNMZW5ndGhbMV0gPSA3IC0gTFBDX09SREVSOworICAgICAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXMgPSBOT19PRl9FU1RJTUFURVNfTEQ7CisgICAgICAgIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlc1BlckZyYW1lID0gMjsgLyogc2JyQ2ZnLT5ub1FtZlNsb3RzIC8gNyAqLworICAgICAgICBoVG9uQ29yci0+ZnJhbWVTdGFydEluZGV4SW52ZkVzdCA9IDA7CisgICAgICAgIGhUb25Db3JyLT50cmFuc2llbnRQb3NPZmZzZXQgPSBGUkFNRV9NSURETEVfU0xPVF81MTJMRDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIwNDg6CisgICAgICAgIGhUb25Db3JyLT5scGNMZW5ndGhbMF0gPSA4IC0gTFBDX09SREVSOworICAgICAgICBoVG9uQ29yci0+bHBjTGVuZ3RoWzFdID0gOCAtIExQQ19PUkRFUjsKKyAgICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzID0gTk9fT0ZfRVNUSU1BVEVTX0xEOworICAgICAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSA9IDI7IC8qIHNickNmZy0+bm9RbWZTbG90cyAvIDggKi8KKyAgICAgICAgaFRvbkNvcnItPmZyYW1lU3RhcnRJbmRleEludmZFc3QgPSAwOworICAgICAgICBoVG9uQ29yci0+dHJhbnNpZW50UG9zT2Zmc2V0ID0gRlJBTUVfTUlERExFX1NMT1RfNTEyTEQ7CisgICAgICAgIGJyZWFrOwogICAgIH0KICAgfSBlbHNlCi0gIHN3aXRjaCAodGltZVNsb3RzKSB7Ci0gIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjA0ODoKLSAgICBoVG9uQ29yci0+bHBjTGVuZ3RoWzBdICAgICAgICAgICAgICA9IDE2IC0gTFBDX09SREVSOyAvKiBibG9ja0xlbmd0aFswXSAqLwotICAgIGhUb25Db3JyLT5scGNMZW5ndGhbMV0gICAgICAgICAgICAgID0gMTYgLSBMUENfT1JERVI7IC8qIGJsb2NrTGVuZ3RoWzBdICovCi0gICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzICAgICAgICAgPSBOT19PRl9FU1RJTUFURVNfTEM7Ci0gICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUgPSBzYnJDZmctPm5vUW1mU2xvdHMgLyAxNjsKLSAgICBoVG9uQ29yci0+ZnJhbWVTdGFydEluZGV4SW52ZkVzdCAgICA9IDA7Ci0gICAgaFRvbkNvcnItPnRyYW5zaWVudFBvc09mZnNldCAgICAgICAgPSBGUkFNRV9NSURETEVfU0xPVF8yMDQ4OwotICAgIGJyZWFrOwotICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzE5MjA6Ci0gICAgaFRvbkNvcnItPmxwY0xlbmd0aFswXSAgICAgICAgICAgICAgPSAxNSAtIExQQ19PUkRFUjsgLyogYmxvY2tMZW5ndGhbMF0gKi8KLSAgICBoVG9uQ29yci0+bHBjTGVuZ3RoWzFdICAgICAgICAgICAgICA9IDE1IC0gTFBDX09SREVSOyAvKiBibG9ja0xlbmd0aFswXSAqLwotICAgIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlcyAgICAgICAgID0gTk9fT0ZfRVNUSU1BVEVTX0xDOwotICAgIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlc1BlckZyYW1lID0gc2JyQ2ZnLT5ub1FtZlNsb3RzIC8gMTU7Ci0gICAgaFRvbkNvcnItPmZyYW1lU3RhcnRJbmRleEludmZFc3QgICAgPSAwOwotICAgIGhUb25Db3JyLT50cmFuc2llbnRQb3NPZmZzZXQgICAgICAgID0gRlJBTUVfTUlERExFX1NMT1RfMTkyMDsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKKyAgICBzd2l0Y2ggKHRpbWVTbG90cykgeworICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OgorICAgICAgICBoVG9uQ29yci0+bHBjTGVuZ3RoWzBdID0gMTYgLSBMUENfT1JERVI7IC8qIGJsb2NrTGVuZ3RoWzBdICovCisgICAgICAgIGhUb25Db3JyLT5scGNMZW5ndGhbMV0gPSAxNiAtIExQQ19PUkRFUjsgLyogYmxvY2tMZW5ndGhbMF0gKi8KKyAgICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzID0gTk9fT0ZfRVNUSU1BVEVTX0xDOworICAgICAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSA9IHNickNmZy0+bm9RbWZTbG90cyAvIDE2OworICAgICAgICBoVG9uQ29yci0+ZnJhbWVTdGFydEluZGV4SW52ZkVzdCA9IDA7CisgICAgICAgIGhUb25Db3JyLT50cmFuc2llbnRQb3NPZmZzZXQgPSBGUkFNRV9NSURETEVfU0xPVF8yMDQ4OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDoKKyAgICAgICAgaFRvbkNvcnItPmxwY0xlbmd0aFswXSA9IDE1IC0gTFBDX09SREVSOyAvKiBibG9ja0xlbmd0aFswXSAqLworICAgICAgICBoVG9uQ29yci0+bHBjTGVuZ3RoWzFdID0gMTUgLSBMUENfT1JERVI7IC8qIGJsb2NrTGVuZ3RoWzBdICovCisgICAgICAgIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlcyA9IE5PX09GX0VTVElNQVRFU19MQzsKKyAgICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUgPSBzYnJDZmctPm5vUW1mU2xvdHMgLyAxNTsKKyAgICAgICAgaFRvbkNvcnItPmZyYW1lU3RhcnRJbmRleEludmZFc3QgPSAwOworICAgICAgICBoVG9uQ29yci0+dHJhbnNpZW50UG9zT2Zmc2V0ID0gRlJBTUVfTUlERExFX1NMT1RfMTkyMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGhUb25Db3JyLT5idWZmZXJMZW5ndGggPSBuQ29sczsKKyAgaFRvbkNvcnItPnN0ZXBTaXplID0KKyAgICAgIGhUb25Db3JyLT5scGNMZW5ndGhbMF0gKyBMUENfT1JERVI7IC8qIHN0ZXBTaXplWzBdIGltcGxpY2l0bHkgMC4gKi8KKworICBoVG9uQ29yci0+bmV4dFNhbXBsZSA9IExQQ19PUkRFUjsgLyogZmlyc3RTYW1wbGUgKi8KKyAgaFRvbkNvcnItPm1vdmUgPSBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXMgLQorICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlc1BlckZyYW1lOyAvKiBOdW1iZXIgb2YgZXN0aW1hdGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIG1vdmUgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJpbmcuKi8KKyAgaWYgKGhUb25Db3JyLT5tb3ZlIDwgMCkgewogICAgIHJldHVybiAtMTsKICAgfQotCi0gIGhUb25Db3JyLT5idWZmZXJMZW5ndGggICAgICAgICAgICAgID0gbkNvbHM7Ci0gIGhUb25Db3JyLT5zdGVwU2l6ZSAgICAgICAgICAgICAgICAgID0gaFRvbkNvcnItPmxwY0xlbmd0aFswXSArIExQQ19PUkRFUjsgLyogc3RlcFNpemVbMF0gaW1wbGljaXRseSAwLiAqLwotCi0gIGhUb25Db3JyLT5uZXh0U2FtcGxlICAgICAgICAgICAgICAgID0gTFBDX09SREVSOyAvKiBmaXJzdFNhbXBsZSAqLwotICBoVG9uQ29yci0+bW92ZSAgICAgICAgICAgICAgICAgICAgICA9IGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlcyAtIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlc1BlckZyYW1lOyAgICAvKiBOdW1iZXIgb2YgZXN0aW1hdGVzIHRvIG1vdmUgd2hlbiBidWZmZXJpbmcuKi8KLSAgaFRvbkNvcnItPnN0YXJ0SW5kZXhNYXRyaXggICAgICAgICAgPSBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXMgLSBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZTsgICAgLyogV2hlcmUgdG8gc3RvcmUgdGhlIGxhdGVzdCBlc3RpbWF0aW9ucyBpbiB0aGUgdG9uYWxpdHkgTWF0cml4LiovCi0gIGhUb25Db3JyLT5mcmFtZVN0YXJ0SW5kZXggICAgICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogV2hlcmUgaW4gdGhlIHRvbmFsaXR5IG1hdHJpeCB0aGUgY3VycmVudCBmcmFtZSAodG8gYmUgc2VudCB0byB0aGUgZGVjb2Rlcikgc3RhcnRzLiAqLworICBoVG9uQ29yci0+c3RhcnRJbmRleE1hdHJpeCA9CisgICAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXMgLQorICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWU7IC8qIFdoZXJlIHRvIHN0b3JlIHRoZSBsYXRlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0aW9ucyBpbiB0aGUgdG9uYWxpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyaXguKi8KKyAgaFRvbkNvcnItPmZyYW1lU3RhcnRJbmRleCA9IDA7IC8qIFdoZXJlIGluIHRoZSB0b25hbGl0eSBtYXRyaXggdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lICh0byBiZSBzZW50IHRvIHRoZSBkZWNvZGVyKSBzdGFydHMuICovCiAgIGhUb25Db3JyLT5wcmV2VHJhbnNpZW50RmxhZyA9IDA7CiAgIGhUb25Db3JyLT50cmFuc2llbnROZXh0RnJhbWUgPSAwOwogCiAgIGhUb25Db3JyLT5ub1FtZkNoYW5uZWxzID0gbm9RbWZDaGFubmVsczsKIAotICBmb3IgKGk9MDsgaTxoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXM7IGkrKykgewotICAgIEZES21lbWNsZWFyIChoVG9uQ29yci0+cXVvdGFNYXRyaXhbaV0gLCBzaXplb2YoRklYUF9EQkwpKm5vUW1mQ2hhbm5lbHMpOwotICAgIEZES21lbWNsZWFyIChoVG9uQ29yci0+c2lnbk1hdHJpeFtpXSAsIHNpemVvZihJTlQpKm5vUW1mQ2hhbm5lbHMpOworICBmb3IgKGkgPSAwOyBpIDwgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzOyBpKyspIHsKKyAgICBGREttZW1jbGVhcihoVG9uQ29yci0+cXVvdGFNYXRyaXhbaV0sIHNpemVvZihGSVhQX0RCTCkgKiBub1FtZkNoYW5uZWxzKTsKKyAgICBGREttZW1jbGVhcihoVG9uQ29yci0+c2lnbk1hdHJpeFtpXSwgc2l6ZW9mKElOVCkgKiBub1FtZkNoYW5uZWxzKTsKICAgfQogCi0gICAvKiBSZXNldCB0aGUgcGF0Y2guKi8KKyAgLyogUmVzZXQgdGhlIHBhdGNoLiovCiAgIGhUb25Db3JyLT5ndWFyZCA9IDA7CiAgIGhUb25Db3JyLT5zaGlmdFN0YXJ0U2IgPSAxOwogCi0gIGlmKHJlc2V0UGF0Y2goaFRvbkNvcnIsCi0gICAgICAgICAgICAgICAgeHBvc0N0cmwsCi0gICAgICAgICAgICAgICAgaGlnaEJhbmRTdGFydFNiLAotICAgICAgICAgICAgICAgIHZfa19tYXN0ZXIsCi0gICAgICAgICAgICAgICAgbnVtTWFzdGVyLAotICAgICAgICAgICAgICAgIGZzLAotICAgICAgICAgICAgICAgIG5vUW1mQ2hhbm5lbHMpKQotICAgIHJldHVybigxKTsKKyAgaWYgKHJlc2V0UGF0Y2goaFRvbkNvcnIsIHhwb3NDdHJsLCBoaWdoQmFuZFN0YXJ0U2IsIHZfa19tYXN0ZXIsIG51bU1hc3RlciwgZnMsCisgICAgICAgICAgICAgICAgIG5vUW1mQ2hhbm5lbHMpKQorICAgIHJldHVybiAoMSk7CiAKLSAgaWYoRkRLc2JyRW5jX0luaXRTYnJOb2lzZUZsb29yRXN0aW1hdGUgKCZoVG9uQ29yci0+c2JyTm9pc2VGbG9vckVzdGltYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmFfbWF4X2xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxQmFuZFRhYmxlW0xPXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblNmYltMT10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vaXNlQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vaXNlRmxvb3JPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVTbG90cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlU3BlZWNoQ29uZmlnKSkKLSAgICByZXR1cm4oMSk7CisgIGlmIChGREtzYnJFbmNfSW5pdFNick5vaXNlRmxvb3JFc3RpbWF0ZSgKKyAgICAgICAgICAmaFRvbkNvcnItPnNick5vaXNlRmxvb3JFc3RpbWF0ZSwgYW5hX21heF9sZXZlbCwgZnJlcUJhbmRUYWJsZVtMT10sCisgICAgICAgICAgblNmYltMT10sIG5vaXNlQmFuZHMsIG5vaXNlRmxvb3JPZmZzZXQsIHRpbWVTbG90cywgdXNlU3BlZWNoQ29uZmlnKSkKKyAgICByZXR1cm4gKDEpOwogCisgIGlmIChGREtzYnJFbmNfaW5pdEludkZpbHREZXRlY3RvcigKKyAgICAgICAgICAmaFRvbkNvcnItPnNickludkZpbHQsCisgICAgICAgICAgaFRvbkNvcnItPnNick5vaXNlRmxvb3JFc3RpbWF0ZS5mcmVxQmFuZFRhYmxlUW1mLAorICAgICAgICAgIGhUb25Db3JyLT5zYnJOb2lzZUZsb29yRXN0aW1hdGUubm9Ob2lzZUJhbmRzLCB1c2VTcGVlY2hDb25maWcpKQorICAgIHJldHVybiAoMSk7CiAKLSAgaWYoRkRLc2JyRW5jX2luaXRJbnZGaWx0RGV0ZWN0b3IoJmhUb25Db3JyLT5zYnJJbnZGaWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5zYnJOb2lzZUZsb29yRXN0aW1hdGUuZnJlcUJhbmRUYWJsZVFtZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+c2JyTm9pc2VGbG9vckVzdGltYXRlLm5vTm9pc2VCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VTcGVlY2hDb25maWcpKQotICAgIHJldHVybigxKTsKLQotCi0KLSAgaWYoRkRLc2JyRW5jX0luaXRTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhUb25Db3JyLT5zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZmJbSEldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vUW1mQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5tb3ZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUb25Db3JyLT5udW1iZXJPZkVzdGltYXRlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNmZy0+c2JyU3ludGF4RmxhZ3MpKQotICAgIHJldHVybigxKTsKLQotCisgIGlmIChGREtzYnJFbmNfSW5pdFNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvcigKKyAgICAgICAgICAmaFRvbkNvcnItPnNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvciwgZnMsIGZyYW1lU2l6ZSwgblNmYltISV0sCisgICAgICAgICAgbm9RbWZDaGFubmVscywgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzLCBoVG9uQ29yci0+bW92ZSwKKyAgICAgICAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSwgc2JyQ2ZnLT5zYnJTeW50YXhGbGFncykpCisgICAgcmV0dXJuICgxKTsKIAogICByZXR1cm4gKDApOwogfQogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAgIFxicmllZiAgICAgcmVzZXRzIHRvbmFsaXR5IGNvcnJlY3Rpb24gcGFyYW1ldGVyIG1vZHVsZS4KQEAgLTgwMyw1OSArODI1LDQ4IEBACiAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1JTlQKLUZES3NickVuY19SZXNldFRvbkNvcnJQYXJhbUV4dHIoSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsIC8qITwgSGFuZGxlIHRvIFNCUl9UT05fQ09SUiBzdHJ1Y3QuICovCi0gICAgICAgICAgICAgICAgICAgICAgSU5UIHhwb3NjdHJsLCAgICAgICAgICAgICAgICAgICAgIC8qITwgRGlmZmVyZW50IHBhdGNoIG1vZGVzLiAqLwotICAgICAgICAgICAgICAgICAgICAgIElOVCBoaWdoQmFuZFN0YXJ0U2IsICAgICAgICAgICAgICAvKiE8IFN0YXJ0IGJhbmQgb2YgdGhlIFNCUiByYW5nZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdl9rX21hc3RlciwgICAgICAgIC8qITwgTWFzdGVyIGZyZXF1ZW5jeSB0YWJsZSBmcm9tIHdoaWNoIGFsbCBvdGhlciB0YWJsZSBhcmUgZGVyaXZlZC4qLwotICAgICAgICAgICAgICAgICAgICAgIElOVCBudW1NYXN0ZXIsICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbWFzdGVyIHRhYmxlLiAqLwotICAgICAgICAgICAgICAgICAgICAgIElOVCBmcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsaW5nIGZyZXF1ZW5jeSAob2YgdGhlIFNCUiBwYXJ0KS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqKiBmcmVxQmFuZFRhYmxlLCAgIC8qITwgRnJlcXVlbmN5IGJhbmQgdGFibGUgZm9yIGxvdy1yZXMgYW5kIGhpZ2gtcmVzLiAqLwotICAgICAgICAgICAgICAgICAgICAgIElOVCogblNmYiwgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBmcmVxdWVuY3kgYmFuZHMgKGhpZy1yZXMgYW5kIGxvdy1yZXMpLiAqLwotICAgICAgICAgICAgICAgICAgICAgIElOVCBub1FtZkNoYW5uZWxzICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBRTUYgY2hhbm5lbHMuICovCi0gICAgICAgICAgICAgICAgICAgICAgKQotewotCitJTlQgRkRLc2JyRW5jX1Jlc2V0VG9uQ29yclBhcmFtRXh0cigKKyAgICBIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVCBoVG9uQ29yciwgLyohPCBIYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KKyAgICBJTlQgeHBvc2N0cmwsICAgICAgICAgICAgICAgICAgICAgLyohPCBEaWZmZXJlbnQgcGF0Y2ggbW9kZXMuICovCisgICAgSU5UIGhpZ2hCYW5kU3RhcnRTYiwgICAgICAgICAgICAgIC8qITwgU3RhcnQgYmFuZCBvZiB0aGUgU0JSIHJhbmdlLiAqLworICAgIFVDSEFSICp2X2tfbWFzdGVyLCAvKiE8IE1hc3RlciBmcmVxdWVuY3kgdGFibGUgZnJvbSB3aGljaCBhbGwgb3RoZXIgdGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGRlcml2ZWQuKi8KKyAgICBJTlQgbnVtTWFzdGVyLCAgICAgLyohPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG1hc3RlciB0YWJsZS4gKi8KKyAgICBJTlQgZnMsICAgICAgICAgICAgLyohPCBTYW1wbGluZyBmcmVxdWVuY3kgKG9mIHRoZSBTQlIgcGFydCkuICovCisgICAgVUNIQVIgKgorICAgICAgICAqZnJlcUJhbmRUYWJsZSwgLyohPCBGcmVxdWVuY3kgYmFuZCB0YWJsZSBmb3IgbG93LXJlcyBhbmQgaGlnaC1yZXMuICovCisgICAgSU5UICpuU2ZiLCAgICAgICAgICAvKiE8IE51bWJlciBvZiBmcmVxdWVuY3kgYmFuZHMgKGhpZy1yZXMgYW5kIGxvdy1yZXMpLiAqLworICAgIElOVCBub1FtZkNoYW5uZWxzICAgLyohPCBOdW1iZXIgb2YgUU1GIGNoYW5uZWxzLiAqLworKSB7CiAgIC8qIFJlc2V0IHRoZSBwYXRjaC4qLwogICBoVG9uQ29yci0+Z3VhcmQgPSAwOwogICBoVG9uQ29yci0+c2hpZnRTdGFydFNiID0gMTsKIAotICBpZihyZXNldFBhdGNoKGhUb25Db3JyLAotICAgICAgICAgICAgICAgIHhwb3NjdHJsLAotICAgICAgICAgICAgICAgIGhpZ2hCYW5kU3RhcnRTYiwKLSAgICAgICAgICAgICAgICB2X2tfbWFzdGVyLAotICAgICAgICAgICAgICAgIG51bU1hc3RlciwKLSAgICAgICAgICAgICAgICBmcywKLSAgICAgICAgICAgICAgICBub1FtZkNoYW5uZWxzKSkKLSAgICByZXR1cm4oMSk7Ci0KLQorICBpZiAocmVzZXRQYXRjaChoVG9uQ29yciwgeHBvc2N0cmwsIGhpZ2hCYW5kU3RhcnRTYiwgdl9rX21hc3RlciwgbnVtTWFzdGVyLCBmcywKKyAgICAgICAgICAgICAgICAgbm9RbWZDaGFubmVscykpCisgICAgcmV0dXJuICgxKTsKIAogICAvKiBSZXNldCB0aGUgbm9pc2UgZmxvb3IgZXN0aW1hdGUuKi8KLSAgaWYoRkRLc2JyRW5jX3Jlc2V0U2JyTm9pc2VGbG9vckVzdGltYXRlICgmaFRvbkNvcnItPnNick5vaXNlRmxvb3JFc3RpbWF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXFCYW5kVGFibGVbTE9dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblNmYltMT10pKQotICAgIHJldHVybigxKTsKKyAgaWYgKEZES3NickVuY19yZXNldFNick5vaXNlRmxvb3JFc3RpbWF0ZSgmaFRvbkNvcnItPnNick5vaXNlRmxvb3JFc3RpbWF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxQmFuZFRhYmxlW0xPXSwgblNmYltMT10pKQorICAgIHJldHVybiAoMSk7CiAKICAgLyoKICAgUmVzZXQgdGhlIGludmVlcnNlIGZpbHRlcmVpbmcgZGV0ZWN0b3IuCiAgICovCi0gIGlmKEZES3NickVuY19yZXNldEludkZpbHREZXRlY3RvcigmaFRvbkNvcnItPnNickludkZpbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+c2JyTm9pc2VGbG9vckVzdGltYXRlLmZyZXFCYW5kVGFibGVRbWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBoVG9uQ29yci0+c2JyTm9pc2VGbG9vckVzdGltYXRlLm5vTm9pc2VCYW5kcykpCi0gICAgcmV0dXJuKDEpOwotLyogUmVzZXQgdGhlIG1pc3NpbmcgaGFybW9uaWNzIGRldGVjdG9yLiAqLwotICBpZihGREtzYnJFbmNfUmVzZXRTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IgKCZoVG9uQ29yci0+c2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblNmYltISV0pKQotICAgIHJldHVybigxKTsKKyAgaWYgKEZES3NickVuY19yZXNldEludkZpbHREZXRlY3RvcigKKyAgICAgICAgICAmaFRvbkNvcnItPnNickludkZpbHQsCisgICAgICAgICAgaFRvbkNvcnItPnNick5vaXNlRmxvb3JFc3RpbWF0ZS5mcmVxQmFuZFRhYmxlUW1mLAorICAgICAgICAgIGhUb25Db3JyLT5zYnJOb2lzZUZsb29yRXN0aW1hdGUubm9Ob2lzZUJhbmRzKSkKKyAgICByZXR1cm4gKDEpOworICAvKiBSZXNldCB0aGUgbWlzc2luZyBoYXJtb25pY3MgZGV0ZWN0b3IuICovCisgIGlmIChGREtzYnJFbmNfUmVzZXRTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IoCisgICAgICAgICAgJmhUb25Db3JyLT5zYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IsIG5TZmJbSEldKSkKKyAgICByZXR1cm4gKDEpOwogCiAgIHJldHVybiAoMCk7CiB9CiAKLQotCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAgIFxicmllZiAgRGVsZXRlcyB0aGUgdG9uYWxpdHkgY29ycmVjdGlvbiBwYXJhbXRlcmUgbW9kdWxlLgpAQCAtODY2LDE2ICs4NzcsMTUgQEAKIAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLUZES3NickVuY19EZWxldGVUb25Db3JyUGFyYW1FeHRyIChIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVCBoVG9uQ29ycikgLyohPCBIYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KK3ZvaWQgRkRLc2JyRW5jX0RlbGV0ZVRvbkNvcnJQYXJhbUV4dHIoCisgICAgSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIpIC8qITwgSGFuZGxlIHRvIFNCUl9UT05fQ09SUiBzdHJ1Y3QuICovCiB7Ci0KICAgaWYgKGhUb25Db3JyKSB7CisgICAgRnJlZVJhbV9TYnJfcXVvdGFNYXRyaXgoaFRvbkNvcnItPnF1b3RhTWF0cml4KTsKIAotICAgRnJlZVJhbV9TYnJfcXVvdGFNYXRyaXgoaFRvbkNvcnItPnF1b3RhTWF0cml4KTsKKyAgICBGcmVlUmFtX1Nicl9zaWduTWF0cml4KGhUb25Db3JyLT5zaWduTWF0cml4KTsKIAotICAgRnJlZVJhbV9TYnJfc2lnbk1hdHJpeChoVG9uQ29yci0+c2lnbk1hdHJpeCk7Ci0KLSAgIEZES3NickVuY19EZWxldGVTYnJNaXNzaW5nSGFybW9uaWNzRGV0ZWN0b3IgKCZoVG9uQ29yci0+c2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yKTsKKyAgICBGREtzYnJFbmNfRGVsZXRlU2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yKAorICAgICAgICAmaFRvbkNvcnItPnNick1pc3NpbmdIYXJtb25pY3NEZXRlY3Rvcik7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvdG9uX2NvcnIuaCBiL2xpYlNCUmVuYy9zcmMvdG9uX2NvcnIuaAppbmRleCA1MDRhYjAzLi45MWFhMjc4IDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL3Rvbl9jb3JyLmgKKysrIGIvbGliU0JSZW5jL3NyYy90b25fY29yci5oCkBAIC0xLDc0ICsxLDg1IEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgorwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KIAotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCiAKLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KIAotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCitDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zCit3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksIGFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZQorZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsIGFwcGxpY2F0aW9ucworaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCiAKIDIuICAgIENPUFlSSUdIVCBMSUNFTlNFCiAKLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgogCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCiBtb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCiAKLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KIAotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCitZb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZwordGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucworb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIKK211c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0gIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLCitBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCiAKIDMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCiAKLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQKK2xpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwgQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLgorRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoIHJlc3BlY3QgdG8gdGhpcworc29mdHdhcmUuCiAKLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgorWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCiAKIDQuICAgIERJU0NMQUlNRVIKIAotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgogCiA1LiAgICBDT05UQUNUIElORk9STUFUSU9OCiAKQEAgLTc5LDEzNCArOTAsMTY5IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0JSIGVuY29kZXIgbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyohCiAgIFxmaWxlCiAgIFxicmllZiAgR2VuZXJhbCB0b25hbGl0eSBjb3JyZWN0aW9uIGRldGVjdG9yIG1vZHVsZS4KICovCi0jaWZuZGVmIF9UT05fQ09SUl9FU1RfSAotI2RlZmluZSBfVE9OX0NPUlJfRVNUX0gKKyNpZm5kZWYgVE9OX0NPUlJfSAorI2RlZmluZSBUT05fQ09SUl9ICiAKICNpbmNsdWRlICJzYnJfZW5jb2Rlci5oIgogI2luY2x1ZGUgIm1oX2RldC5oIgogI2luY2x1ZGUgIm5mX2VzdC5oIgogI2luY2x1ZGUgImludmZfZXN0LmgiCiAKLQogI2RlZmluZSBNQVhfTlVNX1BBVENIRVMgNgogI2RlZmluZSBTQ0FMRV9OUkdWRUMgNAogCiAvKiogcGFyYW1ldGVyIHNldCBmb3Igb25lIHNpbmdsZSBwYXRjaCAqLwogdHlwZWRlZiBzdHJ1Y3QgewotICBJTlQgICAgc291cmNlU3RhcnRCYW5kOyAgICAgICAgIC8qITwgZmlyc3QgYmFuZCBpbiBsb3diYW5kcyB3aGVyZSB0byB0YWtlIHRoZSBzYW1wbGVzIGZyb20gKi8KLSAgSU5UICAgIHNvdXJjZVN0b3BCYW5kOyAgICAgICAgICAvKiE8IGZpcnN0IGJhbmQgaW4gbG93YmFuZHMgd2hpY2ggaXMgbm90IGluY2x1ZGVkIGluIHRoZSBwYXRjaCBhbnltb3JlICovCi0gIElOVCAgICBndWFyZFN0YXJ0QmFuZDsgICAgICAgICAgLyohPCBmaXJzdCBiYW5kIGluIGhpZ2hiYW5kcyB0byBiZSBmaWxsZWQgd2l0aCB6ZXJvcyBpbiBvcmRlciB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2UgaW50ZXJmZXJlbmNlcyBiZXR3ZWVuIHBhdGNoZXMgKi8KLSAgSU5UICAgIHRhcmdldFN0YXJ0QmFuZDsgICAgICAgICAvKiE8IGZpcnN0IGJhbmQgaW4gaGlnaGJhbmRzIHRvIGJlIGZpbGxlZCB3aXRoIHdoaXRlbmVkIGxvd2JhbmQgc2lnbmFsICovCi0gIElOVCAgICB0YXJnZXRCYW5kT2ZmczsgICAgICAgICAgLyohPCBkaWZmZXJlbmNlIGJldHdlZW4gJ3N0YXJ0VGFyZ2V0QmFuZCcgYW5kICdzdGFydFNvdXJjZUJhbmQnICovCi0gIElOVCAgICBudW1CYW5kc0luUGF0Y2g7ICAgICAgICAgLyohPCBudW1iZXIgb2YgY29uc2VjdXRpdmUgYmFuZHMgaW4gdGhpcyBvbmUgcGF0Y2ggKi8KKyAgSU5UIHNvdXJjZVN0YXJ0QmFuZDsgLyohPCBmaXJzdCBiYW5kIGluIGxvd2JhbmRzIHdoZXJlIHRvIHRha2UgdGhlIHNhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAqLworICBJTlQgc291cmNlU3RvcEJhbmQ7ICAvKiE8IGZpcnN0IGJhbmQgaW4gbG93YmFuZHMgd2hpY2ggaXMgbm90IGluY2x1ZGVkIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaCBhbnltb3JlICovCisgIElOVCBndWFyZFN0YXJ0QmFuZDsgIC8qITwgZmlyc3QgYmFuZCBpbiBoaWdoYmFuZHMgdG8gYmUgZmlsbGVkIHdpdGggemVyb3MgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIgdG8gIHJlZHVjZSBpbnRlcmZlcmVuY2VzIGJldHdlZW4gcGF0Y2hlcyAqLworICBJTlQgdGFyZ2V0U3RhcnRCYW5kOyAvKiE8IGZpcnN0IGJhbmQgaW4gaGlnaGJhbmRzIHRvIGJlIGZpbGxlZCB3aXRoIHdoaXRlbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2JhbmQgc2lnbmFsICovCisgIElOVCB0YXJnZXRCYW5kT2ZmczsgIC8qITwgZGlmZmVyZW5jZSBiZXR3ZWVuICdzdGFydFRhcmdldEJhbmQnIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RhcnRTb3VyY2VCYW5kJyAqLworICBJTlQgbnVtQmFuZHNJblBhdGNoOyAvKiE8IG51bWJlciBvZiBjb25zZWN1dGl2ZSBiYW5kcyBpbiB0aGlzIG9uZSBwYXRjaCAqLwogfSBQQVRDSF9QQVJBTTsKIAotCi0KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgSU5UIHN3aXRjaEludmVyc2VGaWx0OyAgICAgICAgICAvKiE8IEZsYWcgdG8gZW5hYmxlIGR5bmFtaWMgYWRhcHRpb24gb2YgaW52Zi4gZGV0ZWN0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisgIElOVCBzd2l0Y2hJbnZlcnNlRmlsdDsgLyohPCBGbGFnIHRvIGVuYWJsZSBkeW5hbWljIGFkYXB0aW9uIG9mIGludmYuIGRldGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBJTlQgbm9RbWZDaGFubmVsczsKLSAgSU5UIGJ1ZmZlckxlbmd0aDsgICAgICAgICAgICAgICAvKiE8IExlbmd0aCBvZiB0aGUgciBhbmQgaSBidWZmZXJzLiAqLwotICBJTlQgc3RlcFNpemU7ICAgICAgICAgICAgICAgICAgIC8qITwgU3RyaWRlIGZvciB0aGUgbHBjIGVzdGltYXRlLiAqLwotICBJTlQgbnVtYmVyT2ZFc3RpbWF0ZXM7ICAgICAgICAgIC8qITwgVGhlIHRvdGFsIG51bWJlciBvZiBlc3RpYW10ZXMsIGF2YWlsYWJsZSBpbiB0aGUgcXVvdGFNYXRyaXguKi8KLSAgVUlOVCBudW1iZXJPZkVzdGltYXRlc1BlckZyYW1lOyAvKiE8IFRoZSBudW1iZXIgb2YgZXN0aW1hdGVzIHBlciBmcmFtZSBhdmFpbGFibGUgaW4gdGhlIHF1b3RhTWF0cml4LiovCi0gIElOVCBscGNMZW5ndGhbMl07ICAgICAgICAgICAgICAgLyohPCBTZWdtZW50IGxlbmd0aCB1c2VkIGZvciBzZWNvbmQgb3JkZXIgTFBDIGFuYWx5c2lzLiovCi0gIElOVCBuZXh0U2FtcGxlOyAgICAgICAgICAgICAgICAgLyohPCBXaGVyZSB0byBzdGFydCB0aGUgTFBDIGFuYWx5c2lzIG9mIHRoZSBjdXJyZW50IGZyYW1lLiovCi0gIElOVCBtb3ZlOyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIb3cgbWFueSBlc3RpbWF0ZXMgdG8gbW92ZSBpbiB0aGUgcXVvdGFNYXRyaXgsIHdoZW4gYnVmZmVyaW5nLiAqLwotICBJTlQgZnJhbWVTdGFydEluZGV4OyAgICAgICAgICAgIC8qITwgVGhlIHN0YXJ0IGluZGV4IGZvciB0aGUgY3VycmVudCBmcmFtZSBpbiB0aGUgciBhbmQgaSBidWZmZXJzLiAqLwotICBJTlQgc3RhcnRJbmRleE1hdHJpeDsgICAgICAgICAgIC8qITwgVGhlIHN0YXJ0IGluZGV4IGZvciB0aGUgY3VycmVudCBmcmFtZSBpbiB0aGUgcXVvdGFNYXRyaXguICovCi0gIElOVCBmcmFtZVN0YXJ0SW5kZXhJbnZmRXN0OyAgICAgLyohPCBUaGUgc3RhcnQgaW5kZXggb2YgdGhlIGludmVyc2UgZmlsdGVyaW5nLCBub3QgdGhlIHNhbWUgYXMgdGhlIG90aGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVudCBvbiB3aGF0IGRlY29kZXIgaXMgdXNlZCAoYnVmZmVyIG9wdCwgb3Igbm8gYnVmZmVyIG9wdCkuICovCi0gIElOVCBwcmV2VHJhbnNpZW50RmxhZzsgICAgICAgICAgLyohPCBUaGUgdHJhbnNpc2VudCBmbGFnIChmcm9tIHRoZSB0cmFuc2llbnQgZGV0ZWN0b3IpIGZvciB0aGUgcHJldmlvdXMgZnJhbWUuICovCi0gIElOVCB0cmFuc2llbnROZXh0RnJhbWU7ICAgICAgICAgLyohPCBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIHRyYW5zaWVudCB3aWxsIHNob3cgdXAgaW4gdGhlIG5leHQgZnJhbWUuICovCi0gIElOVCB0cmFuc2llbnRQb3NPZmZzZXQ7ICAgICAgICAgLyohPCBBbiBvZmZzZXQgdmFsdWUgdG8gbWF0Y2ggdGhlIHRyYW5zaWVudCBwb3MgYXMgY2FsY3VsYXRlZCBieSB0aGUgdHJhbnNpZW50IGRldGVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBhY3R1YWwgcG9zaXRpb24gaW4gdGhlIGZyYW1lLiovCisgIElOVCBidWZmZXJMZW5ndGg7ICAgICAgLyohPCBMZW5ndGggb2YgdGhlIHIgYW5kIGkgYnVmZmVycy4gKi8KKyAgSU5UIHN0ZXBTaXplOyAgICAgICAgICAvKiE8IFN0cmlkZSBmb3IgdGhlIGxwYyBlc3RpbWF0ZS4gKi8KKyAgSU5UIG51bWJlck9mRXN0aW1hdGVzOyAvKiE8IFRoZSB0b3RhbCBudW1iZXIgb2YgZXN0aWFtdGVzLCBhdmFpbGFibGUgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGFNYXRyaXguKi8KKyAgVUlOVCBudW1iZXJPZkVzdGltYXRlc1BlckZyYW1lOyAvKiE8IFRoZSBudW1iZXIgb2YgZXN0aW1hdGVzIHBlciBmcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBpbiB0aGUgcXVvdGFNYXRyaXguKi8KKyAgSU5UIGxwY0xlbmd0aFsyXTsgLyohPCBTZWdtZW50IGxlbmd0aCB1c2VkIGZvciBzZWNvbmQgb3JkZXIgTFBDIGFuYWx5c2lzLiovCisgIElOVCBuZXh0U2FtcGxlOyAgIC8qITwgV2hlcmUgdG8gc3RhcnQgdGhlIExQQyBhbmFseXNpcyBvZiB0aGUgY3VycmVudCBmcmFtZS4qLworICBJTlQgbW92ZTsgLyohPCBIb3cgbWFueSBlc3RpbWF0ZXMgdG8gbW92ZSBpbiB0aGUgcXVvdGFNYXRyaXgsIHdoZW4gYnVmZmVyaW5nLgorICAgICAgICAgICAgICovCisgIElOVCBmcmFtZVN0YXJ0SW5kZXg7IC8qITwgVGhlIHN0YXJ0IGluZGV4IGZvciB0aGUgY3VycmVudCBmcmFtZSBpbiB0aGUgciBhbmQgaQorICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzLiAqLworICBJTlQgc3RhcnRJbmRleE1hdHJpeDsgICAgICAgLyohPCBUaGUgc3RhcnQgaW5kZXggZm9yIHRoZSBjdXJyZW50IGZyYW1lIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGFNYXRyaXguICovCisgIElOVCBmcmFtZVN0YXJ0SW5kZXhJbnZmRXN0OyAvKiE8IFRoZSBzdGFydCBpbmRleCBvZiB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcsIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgYXMgdGhlIG90aGVycywgZGVwZW5kZW50IG9uIHdoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIgaXMgdXNlZCAoYnVmZmVyIG9wdCwgb3Igbm8gYnVmZmVyIG9wdCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSU5UIHByZXZUcmFuc2llbnRGbGFnOyAgLyohPCBUaGUgdHJhbnNpc2VudCBmbGFnIChmcm9tIHRoZSB0cmFuc2llbnQgZGV0ZWN0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgcHJldmlvdXMgZnJhbWUuICovCisgIElOVCB0cmFuc2llbnROZXh0RnJhbWU7IC8qITwgRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0cmFuc2llbnQgd2lsbCBzaG93IHVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBuZXh0IGZyYW1lLiAqLworICBJTlQgdHJhbnNpZW50UG9zT2Zmc2V0OyAvKiE8IEFuIG9mZnNldCB2YWx1ZSB0byBtYXRjaCB0aGUgdHJhbnNpZW50IHBvcyBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVkIGJ5IHRoZSB0cmFuc2llbnQgZGV0ZWN0b3Igd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsIHBvc2l0aW9uIGluIHRoZSBmcmFtZS4qLwogCi0gIElOVCAqc2lnbk1hdHJpeFtNQVhfTk9fT0ZfRVNUSU1BVEVTXTsgICAgICAvKiE8IE1hdHJpeCBob2xkaW5nIHRoZSBzaWduIG9mIGVhY2ggY2hhbm5lLCBpLmUuIGluZGljYXRpbmcgaW4gd2hhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0IG9mIGEgUU1GIGNoYW5uZWwgYSBwb3NzaWJsZSBzaW5lIGlzLiAqLworICBJTlQqIHNpZ25NYXRyaXhbTUFYX05PX09GX0VTVElNQVRFU107IC8qITwgTWF0cml4IGhvbGRpbmcgdGhlIHNpZ24gb2YgZWFjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZSwgaS5lLiBpbmRpY2F0aW5nIGluIHdoYXQgcGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGEgUU1GIGNoYW5uZWwgYSBwb3NzaWJsZSBzaW5lIGlzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCi0gIEZJWFBfREJMICpxdW90YU1hdHJpeFtNQVhfTk9fT0ZfRVNUSU1BVEVTXTsvKiE8IE1hdHJpeCBob2xkaW5nIHRoZSBxdW90YSB2YWx1ZXMgZm9yIGFsbCBlc3RpbWF0ZXMsIGFsbCBjaGFubmVscy4gKi8KKyAgRklYUF9EQkwqIHF1b3RhTWF0cml4W01BWF9OT19PRl9FU1RJTUFURVNdOyAvKiE8IE1hdHJpeCBob2xkaW5nIHRoZSBxdW90YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBmb3IgYWxsIGVzdGltYXRlcywgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMuICovCiAKLSAgRklYUF9EQkwgbnJnVmVjdG9yW01BWF9OT19PRl9FU1RJTUFURVNdOyAgIC8qITwgVmVjdG9yIGhvbGRpbmcgdGhlIGF2ZXJhZ2VkIGVuZXJnaWVzIGZvciBldmVyeSBRTUYgYmFuZC4gKi8KLSAgRklYUF9EQkwgbnJnVmVjdG9yRnJlcVtRTUZfQ0hBTk5FTFNdOyAgICAgIC8qITwgVmVjdG9yIGhvbGRpbmcgdGhlIGF2ZXJhZ2VkIGVuZXJnaWVzIGZvciBldmVyeSBRTUYgY2hhbm5lbCAqLworICBGSVhQX0RCTCBucmdWZWN0b3JbTUFYX05PX09GX0VTVElNQVRFU107IC8qITwgVmVjdG9yIGhvbGRpbmcgdGhlIGF2ZXJhZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5lcmdpZXMgZm9yIGV2ZXJ5IFFNRiBiYW5kLiAqLworICBGSVhQX0RCTCBucmdWZWN0b3JGcmVxWzY0XTsgLyohPCBWZWN0b3IgaG9sZGluZyB0aGUgYXZlcmFnZWQgZW5lcmdpZXMgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVyeSBRTUYgY2hhbm5lbCAqLwogCi0gIFNDSEFSIGluZGV4VmVjdG9yW1FNRl9DSEFOTkVMU107ICAgICAgICAgICAvKiE8IEluZGV4IHZlY3RvciBwb0lOVGluZyB0byB0aGUgY29ycmVjdCBsb3diYW5kIGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gaW5kZXhpbmcgYSBoaWdoYmFuZCBjaGFubmVsLCAtMSByZXByZXNlbnRzIGEgZ3VhcmQgYmFuZCAqLwotICBQQVRDSF9QQVJBTSAgcGF0Y2hQYXJhbVtNQVhfTlVNX1BBVENIRVNdOyAgLyohPCBuZXcgcGFyYW1ldGVyIHNldCBmb3IgcGF0Y2hpbmcgKi8KLSAgSU5UICAgIGd1YXJkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIGd1YXJkYmFuZHMgYmV0d2VlbiBldmVyeSBwYXRjaCAqLwotICBJTlQgICAgc2hpZnRTdGFydFNiOyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBsb3dlc3Qgc3ViYmFuZCBvZiBzb3VyY2UgcmFuZ2UgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHBhdGNoZXMgKi8KLSAgSU5UICAgIG5vT2ZQYXRjaGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIHBhdGNoZXMgKi8KKyAgU0NIQVIgaW5kZXhWZWN0b3JbNjRdOyAvKiE8IEluZGV4IHZlY3RvciBwb0lOVGluZyB0byB0aGUgY29ycmVjdCBsb3diYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCwgd2hlbiBpbmRleGluZyBhIGhpZ2hiYW5kIGNoYW5uZWwsIC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyBhIGd1YXJkIGJhbmQgKi8KKyAgUEFUQ0hfUEFSQU0KKyAgcGF0Y2hQYXJhbVtNQVhfTlVNX1BBVENIRVNdOyAvKiE8IG5ldyBwYXJhbWV0ZXIgc2V0IGZvciBwYXRjaGluZyAqLworICBJTlQgZ3VhcmQ7ICAgICAgICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIGd1YXJkYmFuZHMgYmV0d2VlbiBldmVyeSBwYXRjaCAqLworICBJTlQgc2hpZnRTdGFydFNiOyAvKiE8IGxvd2VzdCBzdWJiYW5kIG9mIHNvdXJjZSByYW5nZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hlcyAqLworICBJTlQgbm9PZlBhdGNoZXM7ICAvKiE8IG51bWJlciBvZiBwYXRjaGVzICovCiAKLSAgU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIHNick1pc3NpbmdIYXJtb25pY3NEZXRlY3RvcjsgIC8qITwgU0JSX01JU1NJTkdfSEFSTU9OSUNTX0RFVEVDVE9SIHN0cnVjdC4gKi8KLSAgU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIHNick5vaXNlRmxvb3JFc3RpbWF0ZTsgICAgICAgICAgICAgIC8qITwgU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIHN0cnVjdC4gKi8KLSAgU0JSX0lOVl9GSUxUX0VTVCBzYnJJbnZGaWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU0JSX0lOVl9GSUxUX0VTVCBzdHJ1Y3QuICovCi19Ci1TQlJfVE9OX0NPUlJfRVNUOworICBTQlJfTUlTU0lOR19IQVJNT05JQ1NfREVURUNUT1IKKyAgc2JyTWlzc2luZ0hhcm1vbmljc0RldGVjdG9yOyAvKiE8IFNCUl9NSVNTSU5HX0hBUk1PTklDU19ERVRFQ1RPUiBzdHJ1Y3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNCUl9OT0lTRV9GTE9PUl9FU1RJTUFURQorICBzYnJOb2lzZUZsb29yRXN0aW1hdGU7ICAgICAgIC8qITwgU0JSX05PSVNFX0ZMT09SX0VTVElNQVRFIHN0cnVjdC4gKi8KKyAgU0JSX0lOVl9GSUxUX0VTVCBzYnJJbnZGaWx0OyAvKiE8IFNCUl9JTlZfRklMVF9FU1Qgc3RydWN0LiAqLworfSBTQlJfVE9OX0NPUlJfRVNUOwogCi10eXBlZGVmIFNCUl9UT05fQ09SUl9FU1QgKkhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUOwordHlwZWRlZiBTQlJfVE9OX0NPUlJfRVNUKiBIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVDsKIAotdm9pZAotRkRLc2JyRW5jX1RvbkNvcnJQYXJhbUV4dHIoSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsICAgLyohPCBIYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KLSAgICAgICAgICAgICAgICAgSU5WRl9NT0RFKiBpbmZWZWMsICAgICAgICAgICAgICAgICAgLyohPCBWZWN0b3Igd2hlcmUgdGhlIGludmVyc2UgZmlsdGVyaW5nIGxldmVscyB3aWxsIGJlIHN0b3JlZC4gKi8KLSAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiBub2lzZUxldmVscywgICAgICAgICAgICAgLyohPCBWZWN0b3Igd2hlcmUgdGhlIG5vaXNlIGxldmVscyB3aWxsIGJlIHN0b3JlZC4gKi8KLSAgICAgICAgICAgICAgICAgSU5UKiBtaXNzaW5nSGFybW9uaWNGbGFnLCAgICAgICAgICAgLyohPCBGbGFnIHNldCB0byBvbmUgb3IgemVybywgZGVwZW5kZW50IG9uIGlmIGFueSBzdHJvbmcgc2luZXMgYXJlIG1pc3NpbmcuKi8KLSAgICAgICAgICAgICAgICAgVUNIQVIqIG1pc3NpbmdIYXJtb25pY3NJbmRleCwgICAgICAgLyohPCBWZWN0b3IgaW5kaWNhdGluZyB3aGVyZSBzaW5lcyBhcmUgbWlzc2luZy4gKi8KLSAgICAgICAgICAgICAgICAgVUNIQVIqIGVudmVsb3BlQ29tcGVuc2F0aW9uLCAgICAgICAgLyohPCBWZWN0b3IgdG8gc3RvcmUgY29tcGVuc2F0aW9uIHZhbHVlcyBmb3IgdGhlIGVuZXJnaWVzIGluLiAqLwotICAgICAgICAgICAgICAgICBjb25zdCBTQlJfRlJBTUVfSU5GTyAqZnJhbWVJbmZvLCAgICAvKiE8IEZyYW1lIGluZm8gc3RydWN0LCBjb250YWlucyB0aGUgdGltZSBhbmQgZnJlcXVlbmN5IGdyaWQgb2YgdGhlIGN1cnJlbnQgZnJhbWUuKi8KLSAgICAgICAgICAgICAgICAgVUNIQVIqIHRyYW5zaWVudEluZm8sICAgICAgICAgICAgICAgLyohPCBUcmFuc2llbnQgaW5mby4qLwotICAgICAgICAgICAgICAgICBVQ0hBUiAqIGZyZXFCYW5kVGFibGUsICAgICAgICAgICAgICAvKiE8IEZyZXF1ZW5jeSBiYW5kIHRhYmxlcyBmb3IgaGlnaC1yZXMuKi8KLSAgICAgICAgICAgICAgICAgSU5UIG5TZmIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygc2NhbGVmYWN0b3IgYmFuZHMgZm9yIGhpZ2gtcmVzLiAqLwotICAgICAgICAgICAgICAgICBYUE9TX01PREUgeHBvc1R5cGUsICAgICAgICAgICAgICAgICAvKiE8IFR5cGUgb2YgdHJhbnNwb3NlciB1c2VkIGluIHRoZSBkZWNvZGVyLiovCi0gICAgICAgICAgICAgICAgIFVJTlQgc2JyU3ludGF4RmxhZ3MKLSAgICAgICAgICAgICAgICAgKTsKK3ZvaWQgRkRLc2JyRW5jX1RvbkNvcnJQYXJhbUV4dHIoCisgICAgSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsIC8qITwgSGFuZGxlIHRvIFNCUl9UT05fQ09SUiBzdHJ1Y3QuICovCisgICAgSU5WRl9NT0RFKiBpbmZWZWMsIC8qITwgVmVjdG9yIHdoZXJlIHRoZSBpbnZlcnNlIGZpbHRlcmluZyBsZXZlbHMgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZWQuICovCisgICAgRklYUF9EQkwqIG5vaXNlTGV2ZWxzLCAvKiE8IFZlY3RvciB3aGVyZSB0aGUgbm9pc2UgbGV2ZWxzIHdpbGwgYmUgc3RvcmVkLiAqLworICAgIElOVCogbWlzc2luZ0hhcm1vbmljRmxhZywgLyohPCBGbGFnIHNldCB0byBvbmUgb3IgemVybywgZGVwZW5kZW50IG9uIGlmIGFueQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb25nIHNpbmVzIGFyZSBtaXNzaW5nLiovCisgICAgVUNIQVIqIG1pc3NpbmdIYXJtb25pY3NJbmRleCwgLyohPCBWZWN0b3IgaW5kaWNhdGluZyB3aGVyZSBzaW5lcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nLiAqLworICAgIFVDSEFSKiBlbnZlbG9wZUNvbXBlbnNhdGlvbiwgIC8qITwgVmVjdG9yIHRvIHN0b3JlIGNvbXBlbnNhdGlvbiB2YWx1ZXMgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVuZXJnaWVzIGluLiAqLworICAgIGNvbnN0IFNCUl9GUkFNRV9JTkZPKiBmcmFtZUluZm8sIC8qITwgRnJhbWUgaW5mbyBzdHJ1Y3QsIGNvbnRhaW5zIHRoZSB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGZyZXF1ZW5jeSBncmlkIG9mIHRoZSBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuKi8KKyAgICBVQ0hBUiogdHJhbnNpZW50SW5mbywgICAgICAgICAgICAvKiE8IFRyYW5zaWVudCBpbmZvLiovCisgICAgVUNIQVIqIGZyZXFCYW5kVGFibGUsICAgICAgICAgICAgLyohPCBGcmVxdWVuY3kgYmFuZCB0YWJsZXMgZm9yIGhpZ2gtcmVzLiovCisgICAgSU5UIG5TZmIsICAgICAgICAgICAvKiE8IE51bWJlciBvZiBzY2FsZWZhY3RvciBiYW5kcyBmb3IgaGlnaC1yZXMuICovCisgICAgWFBPU19NT0RFIHhwb3NUeXBlLCAvKiE8IFR5cGUgb2YgdHJhbnNwb3NlciB1c2VkIGluIHRoZSBkZWNvZGVyLiovCisgICAgVUlOVCBzYnJTeW50YXhGbGFncyk7CiAKLUlOVAotRkRLc2JyRW5jX0NyZWF0ZVRvbkNvcnJQYXJhbUV4dHIoSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsIC8qITwgUG9pbnRlciB0byBoYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgIGNoYW4pOyAgICAvKiE8IENoYW5uZWwgaW5kZXgsIG5lZWRlZCBmb3IgbWVtIGFsbG9jYXRpb24gKi8KK0lOVCBGREtzYnJFbmNfQ3JlYXRlVG9uQ29yclBhcmFtRXh0cigKKyAgICBIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVAorICAgICAgICBoVG9uQ29yciwgLyohPCBQb2ludGVyIHRvIGhhbmRsZSB0byBTQlJfVE9OX0NPUlIgc3RydWN0LiAqLworICAgIElOVCBjaGFuKTsgICAgLyohPCBDaGFubmVsIGluZGV4LCBuZWVkZWQgZm9yIG1lbSBhbGxvY2F0aW9uICovCiAKLUlOVAotRkRLc2JyRW5jX0luaXRUb25Db3JyUGFyYW1FeHRyKElOVCBmcmFtZVNpemUsICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ3VycmVudCBTQlIgZnJhbWUgc2l6ZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVCBoVG9uQ29yciwgICAvKiE8IFBvaW50ZXIgdG8gaGFuZGxlIHRvIFNCUl9UT05fQ09SUiBzdHJ1Y3QuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSBzYnJDZmcsICAgICAgLyohPCBQb2ludGVyIHRvIFNCUiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRpbWVTbG90cywgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZS1zbG90cyBwZXIgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgeHBvc0N0cmwsICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERpZmZlcmVudCBwYXRjaCBtb2Rlcy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYW5hX21heF9sZXZlbCwgICAgICAgICAgICAgICAgICAvKiE8IE1heGltdW0gbGV2ZWwgb2YgdGhlIGFkYXB0aXZlIG5vaXNlLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBub2lzZUJhbmRzLCAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIG5vaXNlIGJhbmRzIHBlciBvY3RhdmUuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5vaXNlRmxvb3JPZmZzZXQsICAgICAgICAgICAgICAgLyohPCBOb2lzZSBmbG9vciBvZmZzZXQuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCB1c2VTcGVlY2hDb25maWcgICAgICAgICAgICAgICAgLyohPCBTcGVlY2ggb3IgbXVzaWMgdHVuaW5nLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKK0lOVCBGREtzYnJFbmNfSW5pdFRvbkNvcnJQYXJhbUV4dHIoCisgICAgSU5UIGZyYW1lU2l6ZSwgLyohPCBDdXJyZW50IFNCUiBmcmFtZSBzaXplLiAqLworICAgIEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUCisgICAgICAgIGhUb25Db3JyLCAvKiE8IFBvaW50ZXIgdG8gaGFuZGxlIHRvIFNCUl9UT05fQ09SUiBzdHJ1Y3QuICovCisgICAgSEFORExFX1NCUl9DT05GSUdfREFUQQorICAgICAgICBzYnJDZmcsICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gU0JSIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4gKi8KKyAgICBJTlQgdGltZVNsb3RzLCAgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZS1zbG90cyBwZXIgZnJhbWUgKi8KKyAgICBJTlQgeHBvc0N0cmwsICAgICAgICAgLyohPCBEaWZmZXJlbnQgcGF0Y2ggbW9kZXMuICovCisgICAgSU5UIGFuYV9tYXhfbGV2ZWwsICAgIC8qITwgTWF4aW11bSBsZXZlbCBvZiB0aGUgYWRhcHRpdmUgbm9pc2UuICovCisgICAgSU5UIG5vaXNlQmFuZHMsICAgICAgIC8qITwgTnVtYmVyIG9mIG5vaXNlIGJhbmRzIHBlciBvY3RhdmUuICovCisgICAgSU5UIG5vaXNlRmxvb3JPZmZzZXQsIC8qITwgTm9pc2UgZmxvb3Igb2Zmc2V0LiAqLworICAgIFVJTlQgdXNlU3BlZWNoQ29uZmlnICAvKiE8IFNwZWVjaCBvciBtdXNpYyB0dW5pbmcuICovCispOwogCi12b2lkCi1GREtzYnJFbmNfRGVsZXRlVG9uQ29yclBhcmFtRXh0cihIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVCBoVG9uQ29ycik7IC8qITwgSGFuZGxlIHRvIFNCUl9UT05fQ09SUiBzdHJ1Y3QuICovCit2b2lkIEZES3NickVuY19EZWxldGVUb25Db3JyUGFyYW1FeHRyKAorICAgIEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUIGhUb25Db3JyKTsgLyohPCBIYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KIAordm9pZCBGREtzYnJFbmNfQ2FsY3VsYXRlVG9uYWxpdHlRdW90YXMoCisgICAgSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsIEZJWFBfREJMKiogc291cmNlQnVmZmVyUmVhbCwKKyAgICBGSVhQX0RCTCoqIHNvdXJjZUJ1ZmZlckltYWcsIElOVCB1c2IsCisgICAgSU5UIHFtZlNjYWxlIC8qITwgc2NsZWZhY3RvciBvZiBRTUYgc3Vic2FtcGxlcyAqLworKTsKIAotdm9pZAotRkRLc2JyRW5jX0NhbGN1bGF0ZVRvbmFsaXR5UXVvdGFzKEhBTkRMRV9TQlJfVE9OX0NPUlJfRVNUIGhUb25Db3JyLAotICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipzb3VyY2VCdWZmZXJSZWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipzb3VyY2VCdWZmZXJJbWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHVzYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIElOVCBxbWZTY2FsZSAgICAgICAgICAgICAgICAgICAgLyohPCBzY2xlZmFjdG9yIG9mIFFNRiBzdWJzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLUlOVAotRkRLc2JyRW5jX1Jlc2V0VG9uQ29yclBhcmFtRXh0cihIQU5ETEVfU0JSX1RPTl9DT1JSX0VTVCBoVG9uQ29yciwgLyohPCBIYW5kbGUgdG8gU0JSX1RPTl9DT1JSIHN0cnVjdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICBJTlQgeHBvc2N0cmwsICAgICAgICAgICAgICAgICAgICAgLyohPCBEaWZmZXJlbnQgcGF0Y2ggbW9kZXMuICovCi0gICAgICAgICAgICAgICAgICAgICAgSU5UIGhpZ2hCYW5kU3RhcnRTYiwgICAgICAgICAgICAgIC8qITwgU3RhcnQgYmFuZCBvZiB0aGUgU0JSIHJhbmdlLiAqLwotICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICp2X2tfbWFzdGVyLCAgICAgICAgLyohPCBNYXN0ZXIgZnJlcXVlbmN5IHRhYmxlIGZyb20gd2hpY2ggYWxsIG90aGVyIHRhYmxlIGFyZSBkZXJpdmVkLiovCi0gICAgICAgICAgICAgICAgICAgICAgSU5UIG51bU1hc3RlciwgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXN0ZXIgdGFibGUuICovCi0gICAgICAgICAgICAgICAgICAgICAgSU5UIGZzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgZnJlcXVlbmN5IChvZiB0aGUgU0JSIHBhcnQpLiAqLwotICAgICAgICAgICAgICAgICAgICAgIFVDSEFSKiogZnJlcUJhbmRUYWJsZSwgICAgLyohPCBGcmVxdWVuY3kgYmFuZCB0YWJsZSBmb3IgbG93LXJlcyBhbmQgaGlnaC1yZXMuICovCi0gICAgICAgICAgICAgICAgICAgICAgSU5UKiBuU2ZiLCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGZyZXF1ZW5jeSBiYW5kcyAoaGlnLXJlcyBhbmQgbG93LXJlcykuICovCi0gICAgICAgICAgICAgICAgICAgICAgSU5UIG5vUW1mQ2hhbm5lbHMgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIFFNRiBjaGFubmVscy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICApOworSU5UIEZES3NickVuY19SZXNldFRvbkNvcnJQYXJhbUV4dHIoCisgICAgSEFORExFX1NCUl9UT05fQ09SUl9FU1QgaFRvbkNvcnIsIC8qITwgSGFuZGxlIHRvIFNCUl9UT05fQ09SUiBzdHJ1Y3QuICovCisgICAgSU5UIHhwb3NjdHJsLCAgICAgICAgICAgICAgICAgICAgIC8qITwgRGlmZmVyZW50IHBhdGNoIG1vZGVzLiAqLworICAgIElOVCBoaWdoQmFuZFN0YXJ0U2IsICAgICAgICAgICAgICAvKiE8IFN0YXJ0IGJhbmQgb2YgdGhlIFNCUiByYW5nZS4gKi8KKyAgICBVQ0hBUiogdl9rX21hc3RlciwgLyohPCBNYXN0ZXIgZnJlcXVlbmN5IHRhYmxlIGZyb20gd2hpY2ggYWxsIG90aGVyIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBkZXJpdmVkLiovCisgICAgSU5UIG51bU1hc3RlciwgICAgIC8qITwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXN0ZXIgdGFibGUuICovCisgICAgSU5UIGZzLCAgICAgICAgICAgIC8qITwgU2FtcGxpbmcgZnJlcXVlbmN5IChvZiB0aGUgU0JSIHBhcnQpLiAqLworICAgIFVDSEFSKioKKyAgICAgICAgZnJlcUJhbmRUYWJsZSwgLyohPCBGcmVxdWVuY3kgYmFuZCB0YWJsZSBmb3IgbG93LXJlcyBhbmQgaGlnaC1yZXMuICovCisgICAgSU5UKiBuU2ZiLCAgICAgICAgIC8qITwgTnVtYmVyIG9mIGZyZXF1ZW5jeSBiYW5kcyAoaGlnLXJlcyBhbmQgbG93LXJlcykuICovCisgICAgSU5UIG5vUW1mQ2hhbm5lbHMgIC8qITwgTnVtYmVyIG9mIFFNRiBjaGFubmVscy4gKi8KKyk7CiAjZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy90cmFuX2RldC5jcHAgYi9saWJTQlJlbmMvc3JjL3RyYW5fZGV0LmNwcAppbmRleCAzM2VhNjBlLi4zYjY3NjVhIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL3RyYW5fZGV0LmNwcAorKysgYi9saWJTQlJlbmMvc3JjL3RyYW5fZGV0LmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwxOSArOTAsMjggQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6ICAgVG9iaWFzIENoYWx1cGthCisKKyAgIERlc2NyaXB0aW9uOiBTQlIgZW5jb2RlciB0cmFuc2llbnQgZGV0ZWN0b3IKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInRyYW5fZGV0LmgiCiAKICNpbmNsdWRlICJmcmFtX2dlbi5oIgotI2luY2x1ZGUgInNicl9yYW0uaCIKKyNpbmNsdWRlICJzYnJlbmNfcmFtLmgiCiAjaW5jbHVkZSAic2JyX21pc2MuaCIKIAogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAKICNkZWZpbmUgTk9STV9RTUZfRU5FUkdZIDkuMzEzMjI1NzQ2MTU0NzlFLTEwIC8qIDJeLTMwICovCiAKLS8qIHN0YXRpYyBGSVhQX0RCTCBBQlNfVEhSRVMgPSBmaXhNYXgoIEZMMkZYQ09OU1RfREJMKDEuMjhlNSAqICBOT1JNX1FNRl9FTkVSR1kpLCAoRklYUF9EQkwpMSkgIE1pbmltdW0gdGhyZXNob2xkIGZvciBkZXRlY3RpbmcgY2hhbmdlcyAqLworLyogc3RhdGljIEZJWFBfREJMIEFCU19USFJFUyA9IGZpeE1heCggRkwyRlhDT05TVF9EQkwoMS4yOGU1ICoKKyAqIE5PUk1fUU1GX0VORVJHWSksIChGSVhQX0RCTCkxKSAgTWluaW11bSB0aHJlc2hvbGQgZm9yIGRldGVjdGluZyBjaGFuZ2VzICovCiAjZGVmaW5lIEFCU19USFJFUyAoKEZJWFBfREJMKTE2KQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTA2LDEyNiArMTI2LDEyOCBAQAogCiAgXHJldHVybiAgY2FsY3VsYXRlZCB2YWx1ZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgTlJHX1NISUZUICAzIC8qIGZvciBlbmVyZ3kgc3VtbWF0aW9uICovCisjZGVmaW5lIE5SR19TSElGVCAzIC8qIGZvciBlbmVyZ3kgc3VtbWF0aW9uICovCiAKLXN0YXRpYyBGSVhQX0RCTCBzcGVjdHJhbENoYW5nZShGSVhQX0RCTCBFbmVyZ2llc1tOVU1CRVJfVElNRV9TTE9UU18yMzA0XVtNQVhfRlJFUV9DT0VGRlNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2NhbGVFbmVyZ2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCBFbmVyZ3lUb3RhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgWUJ1ZmZlcldyaXRlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcmVzdWx0X2UpCi17Ci0gIElOVCBpLGo7Ci0gIElOVCBsZW4xLGxlbjI7Ci0gIFNDSEFSIGVuZXJnaWVzX2VfZGlmZltOVU1CRVJfVElNRV9TTE9UU18yMzA0XSwgZW5lcmdpZXNfZSwgZW5lcmd5VG90YWxfZT0xOSwgZW5lcmdpZXNfZV9hZGQ7CitzdGF0aWMgRklYUF9EQkwgc3BlY3RyYWxDaGFuZ2UoCisgICAgRklYUF9EQkwgRW5lcmdpZXNbTlVNQkVSX1RJTUVfU0xPVFNfMjMwNF1bTUFYX0ZSRVFfQ09FRkZTXSwKKyAgICBJTlQgKnNjYWxlRW5lcmdpZXMsIEZJWFBfREJMIEVuZXJneVRvdGFsLCBJTlQgblNmYiwgSU5UIHN0YXJ0LCBJTlQgYm9yZGVyLAorICAgIElOVCBZQnVmZmVyV3JpdGVPZmZzZXQsIElOVCBzdG9wLCBJTlQgKnJlc3VsdF9lKSB7CisgIElOVCBpLCBqOworICBJTlQgbGVuMSwgbGVuMjsKKyAgU0NIQVIgZW5lcmdpZXNfZV9kaWZmW05VTUJFUl9USU1FX1NMT1RTXzIzMDRdLCBlbmVyZ2llc19lLCBlbmVyZ3lUb3RhbF9lID0gMTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5lcmdpZXNfZV9hZGQ7CiAgIFNDSEFSIHByZXZFbmVyZ2llc19lX2RpZmYsIG5ld0VuZXJnaWVzX2VfZGlmZjsKLSAgRklYUF9EQkwgdG1wMCx0bXAxOwotICBGSVhQX0RCTCBhY2N1MSxhY2N1MixhY2N1MV9pbml0LGFjY3UyX2luaXQ7CisgIEZJWFBfREJMIHRtcDAsIHRtcDE7CiAgIEZJWFBfREJMIGRlbHRhLCBkZWx0YV9zdW07CiAgIElOVCBhY2N1X2UsIHRtcF9lOwogCiAgIGRlbHRhX3N1bSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAqcmVzdWx0X2UgPSAwOwogCi0gIGxlbjEgPSBib3JkZXItc3RhcnQ7Ci0gIGxlbjIgPSBzdG9wLWJvcmRlcjsKKyAgbGVuMSA9IGJvcmRlciAtIHN0YXJ0OworICBsZW4yID0gc3RvcCAtIGJvcmRlcjsKIAogICAvKiBwcmVmZXIgYm9yZGVycyBuZWFyIHRoZSBtaWRkbGUgb2YgdGhlIGZyYW1lICovCi0gIEZJWFBfREJMICAgcG9zX3dlaWdodDsKLSAgcG9zX3dlaWdodCA9IEZMMkZYQ09OU1RfREJMKDAuNWYpIC0gKGxlbjEqR2V0SW52SW50KGxlbjErbGVuMikpOwotICBwb3Nfd2VpZ2h0ID0gLypGTDJGWENPTlNUX0RCTCgxLjApKi8gKEZJWFBfREJMKU1BWFZBTF9EQkwgLSAoZk11bHQocG9zX3dlaWdodCwgcG9zX3dlaWdodCk8PDIpOworICBGSVhQX0RCTCBwb3Nfd2VpZ2h0OworICBwb3Nfd2VpZ2h0ID0gRkwyRlhDT05TVF9EQkwoMC41ZikgLSAobGVuMSAqIEdldEludkludChsZW4xICsgbGVuMikpOworICBwb3Nfd2VpZ2h0ID0gLypGTDJGWENPTlNUX0RCTCgxLjApKi8gKEZJWFBfREJMKU1BWFZBTF9EQkwgLQorICAgICAgICAgICAgICAgKGZNdWx0KHBvc193ZWlnaHQsIHBvc193ZWlnaHQpIDw8IDIpOwogCiAgIC8qKiogQ2FsYyBzY2FsaW5nIGZvciBlbmVyZ2llcyAqKiovCiAgIEZES19BU1NFUlQoc2NhbGVFbmVyZ2llc1swXSA+PSAwKTsKICAgRkRLX0FTU0VSVChzY2FsZUVuZXJnaWVzWzFdID49IDApOwogCi0gIGVuZXJnaWVzX2UgPSAxOSAtIEZES21pbihzY2FsZUVuZXJnaWVzWzBdLCBzY2FsZUVuZXJnaWVzWzFdKTsKKyAgZW5lcmdpZXNfZSA9IDE5IC0gZk1pbihzY2FsZUVuZXJnaWVzWzBdLCBzY2FsZUVuZXJnaWVzWzFdKTsKIAogICAvKiBsaW1pdCBzaGlmdCBmb3IgZW5lcmd5IGFjY3VtdWxhdGlvbiwgZW5lcmdpZXNfZSBjYW4gYmUgLTEwIG1pbi4gKi8KICAgaWYgKGVuZXJnaWVzX2UgPCAtMTApIHsKLSAgICAgZW5lcmdpZXNfZV9hZGQgPSAtMTAgLSBlbmVyZ2llc19lOwotICAgICBlbmVyZ2llc19lID0gLTEwOworICAgIGVuZXJnaWVzX2VfYWRkID0gLTEwIC0gZW5lcmdpZXNfZTsKKyAgICBlbmVyZ2llc19lID0gLTEwOwogICB9IGVsc2UgaWYgKGVuZXJnaWVzX2UgPiAxNykgewotICAgICBlbmVyZ2llc19lX2FkZCA9IGVuZXJnaWVzX2UgLSAxNzsKLSAgICAgZW5lcmdpZXNfZSA9IDE3OworICAgIGVuZXJnaWVzX2VfYWRkID0gZW5lcmdpZXNfZSAtIDE3OworICAgIGVuZXJnaWVzX2UgPSAxNzsKICAgfSBlbHNlIHsKLSAgICAgZW5lcmdpZXNfZV9hZGQgPSAwOworICAgIGVuZXJnaWVzX2VfYWRkID0gMDsKICAgfQogCi0gIC8qIGNvbXBlbnNhdGUgc2NhbGluZyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHNjYWxlRW5lcmdpZXNbMF0gYW5kIHNjYWxlRW5lcmdpZXNbMV0gICovCi0gIHByZXZFbmVyZ2llc19lX2RpZmYgPSBzY2FsZUVuZXJnaWVzWzBdIC0gRkRLbWluKHNjYWxlRW5lcmdpZXNbMF0sIHNjYWxlRW5lcmdpZXNbMV0pICsgZW5lcmdpZXNfZV9hZGQgKyBOUkdfU0hJRlQ7Ci0gIG5ld0VuZXJnaWVzX2VfZGlmZiAgPSBzY2FsZUVuZXJnaWVzWzFdIC0gRkRLbWluKHNjYWxlRW5lcmdpZXNbMF0sIHNjYWxlRW5lcmdpZXNbMV0pICsgZW5lcmdpZXNfZV9hZGQgKyBOUkdfU0hJRlQ7CisgIC8qIGNvbXBlbnNhdGUgc2NhbGluZyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHNjYWxlRW5lcmdpZXNbMF0gYW5kCisgICAqIHNjYWxlRW5lcmdpZXNbMV0gICovCisgIHByZXZFbmVyZ2llc19lX2RpZmYgPSBzY2FsZUVuZXJnaWVzWzBdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZNaW4oc2NhbGVFbmVyZ2llc1swXSwgc2NhbGVFbmVyZ2llc1sxXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgZW5lcmdpZXNfZV9hZGQgKyBOUkdfU0hJRlQ7CisgIG5ld0VuZXJnaWVzX2VfZGlmZiA9IHNjYWxlRW5lcmdpZXNbMV0gLQorICAgICAgICAgICAgICAgICAgICAgICBmTWluKHNjYWxlRW5lcmdpZXNbMF0sIHNjYWxlRW5lcmdpZXNbMV0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgZW5lcmdpZXNfZV9hZGQgKyBOUkdfU0hJRlQ7CiAKLSAgcHJldkVuZXJnaWVzX2VfZGlmZiA9IGZNaW4ocHJldkVuZXJnaWVzX2VfZGlmZiwgREZSQUNUX0JJVFMtMSk7Ci0gIG5ld0VuZXJnaWVzX2VfZGlmZiAgPSBmTWluKG5ld0VuZXJnaWVzX2VfZGlmZiwgIERGUkFDVF9CSVRTLTEpOworICBwcmV2RW5lcmdpZXNfZV9kaWZmID0gZk1pbihwcmV2RW5lcmdpZXNfZV9kaWZmLCBERlJBQ1RfQklUUyAtIDEpOworICBuZXdFbmVyZ2llc19lX2RpZmYgPSBmTWluKG5ld0VuZXJnaWVzX2VfZGlmZiwgREZSQUNUX0JJVFMgLSAxKTsKIAotICBmb3IgKGk9c3RhcnQ7IGk8WUJ1ZmZlcldyaXRlT2Zmc2V0OyBpKyspIHsKKyAgZm9yIChpID0gc3RhcnQ7IGkgPCBZQnVmZmVyV3JpdGVPZmZzZXQ7IGkrKykgewogICAgIGVuZXJnaWVzX2VfZGlmZltpXSA9IHByZXZFbmVyZ2llc19lX2RpZmY7CiAgIH0KLSAgZm9yIChpPVlCdWZmZXJXcml0ZU9mZnNldDsgaTxzdG9wOyBpKyspIHsKKyAgZm9yIChpID0gWUJ1ZmZlcldyaXRlT2Zmc2V0OyBpIDwgc3RvcDsgaSsrKSB7CiAgICAgZW5lcmdpZXNfZV9kaWZmW2ldID0gbmV3RW5lcmdpZXNfZV9kaWZmOwogICB9CiAKICAgLyogU3VtIHVwIGVuZXJnaWVzIG9mIGFsbCBRTUYtdGltZXNsb3RzIGZvciBib3RoIGhhbGZzICovCi0gIEZES19BU1NFUlQobGVuMTw9OCk7IC8qIG90aGVyd2lzZSBhbiBvdmVyZmxvdyBpcyBwb3NzaWJsZSAqLwotICBGREtfQVNTRVJUKGxlbjI8PTgpOyAvKiBvdGhlcndpc2UgYW4gb3ZlcmZsb3cgaXMgcG9zc2libGUgKi8KLSAgLyogaW5pdCB3aXRoIHNvbWUgZW5lcmd5IHRvIHByZXZlbnQgZGl2aXNpb24gYnkgemVybwotICAgICAgYW5kIHRvIHByZXZlbnQgc3BsaXR0aW5nIGZvciB2ZXJ5IGxvdyBsZXZlbHMgKi8KLSAgYWNjdTFfaW5pdCA9IHNjYWxlVmFsdWUoKEZMMkZYQ09OU1RfREJMKCgxLjBlNipOT1JNX1FNRl9FTkVSR1kpKSksLWVuZXJnaWVzX2UpOwotICBhY2N1Ml9pbml0ID0gc2NhbGVWYWx1ZSgoRkwyRlhDT05TVF9EQkwoKDEuMGU2Kk5PUk1fUU1GX0VORVJHWSkpKSwtZW5lcmdpZXNfZSk7Ci0gIGFjY3UxX2luaXQgPSBmTXVsdChhY2N1MV9pbml0LCAoRklYUF9EQkwpbGVuMTw8KChERlJBQ1RfQklUUy0xKS1OUkdfU0hJRlQtMSkpPDwxOwotICBhY2N1Ml9pbml0ID0gZk11bHQoYWNjdTJfaW5pdCwgKEZJWFBfREJMKWxlbjI8PCgoREZSQUNUX0JJVFMtMSktTlJHX1NISUZULTEpKTw8MTsKKyAgRkRLX0FTU0VSVChsZW4xIDw9IDgpOyAvKiBvdGhlcndpc2UgYW4gb3ZlcmZsb3cgaXMgcG9zc2libGUgKi8KKyAgRkRLX0FTU0VSVChsZW4yIDw9IDgpOyAvKiBvdGhlcndpc2UgYW4gb3ZlcmZsb3cgaXMgcG9zc2libGUgKi8KIAotICBmb3IgKGo9MDsgajxuU2ZiOyBqKyspIHsKLQotICAgIGFjY3UxID0gYWNjdTFfaW5pdDsKLSAgICBhY2N1MiA9IGFjY3UyX2luaXQ7Ci0gICAgYWNjdV9lID0gZW5lcmdpZXNfZSszOworICBmb3IgKGogPSAwOyBqIDwgblNmYjsgaisrKSB7CisgICAgRklYUF9EQkwgYWNjdTEgPSBGTDJGWENPTlNUX0RCTCgwLmYpOworICAgIEZJWFBfREJMIGFjY3UyID0gRkwyRlhDT05TVF9EQkwoMC5mKTsKKyAgICBhY2N1X2UgPSBlbmVyZ2llc19lICsgMzsKIAogICAgIC8qIFN1bSB1cCBlbmVyZ2llcyBpbiBmaXJzdCBoYWxmICovCi0gICAgZm9yIChpPXN0YXJ0OyBpPGJvcmRlcjsgaSsrKSB7CisgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBib3JkZXI7IGkrKykgewogICAgICAgYWNjdTEgKz0gc2NhbGVWYWx1ZShFbmVyZ2llc1tpXVtqXSwgLWVuZXJnaWVzX2VfZGlmZltpXSk7CiAgICAgfQogCiAgICAgLyogU3VtIHVwIGVuZXJnaWVzIGluIHNlY29uZCBoYWxmICovCi0gICAgZm9yIChpPWJvcmRlcjsgaTxzdG9wOyBpKyspIHsKKyAgICBmb3IgKGkgPSBib3JkZXI7IGkgPCBzdG9wOyBpKyspIHsKICAgICAgIGFjY3UyICs9IHNjYWxlVmFsdWUoRW5lcmdpZXNbaV1bal0sIC1lbmVyZ2llc19lX2RpZmZbaV0pOwogICAgIH0KIAotICAgIC8qIEVuZXJneSBjaGFuZ2UgaW4gY3VycmVudCBiYW5kICovCi0gICAgI2RlZmluZSBMTjIgRkwyRlhDT05TVF9EQkwoMC42OTMxNDcxODA2ZikgLyogbG4oMikgKi8KKyAgICAvKiBFbnN1cmUgY2VydGFpbiBlbmVyZ3kgdG8gcHJldmVudCBkaXZpc2lvbiBieSB6ZXJvIGFuZCB0byBwcmV2ZW50CisgICAgICogc3BsaXR0aW5nIGZvciB2ZXJ5IGxvdyBsZXZlbHMgKi8KKyAgICBhY2N1MSA9IGZNYXgoYWNjdTEsIChGSVhQX0RCTClsZW4xKTsKKyAgICBhY2N1MiA9IGZNYXgoYWNjdTIsIChGSVhQX0RCTClsZW4yKTsKKworLyogRW5lcmd5IGNoYW5nZSBpbiBjdXJyZW50IGJhbmQgKi8KKyNkZWZpbmUgTE4yIEZMMkZYQ09OU1RfREJMKDAuNjkzMTQ3MTgwNmYpIC8qIGxuKDIpICovCiAgICAgdG1wMCA9IGZMb2cyKGFjY3UyLCBhY2N1X2UpIC0gZkxvZzIoYWNjdTEsIGFjY3VfZSk7CiAgICAgdG1wMSA9IGZMb2cyKChGSVhQX0RCTClsZW4xLCAzMSkgLSBmTG9nMigoRklYUF9EQkwpbGVuMiwgMzEpOwogICAgIGRlbHRhID0gZk11bHQoTE4yLCAodG1wMCArIHRtcDEpKTsKLSAgICBkZWx0YSA9IChGSVhQX0RCTClGREthYnMoIGRlbHRhICk7CisgICAgZGVsdGEgPSAoRklYUF9EQkwpZkFicyhkZWx0YSk7CiAKICAgICAvKiBXZWlnaHRpbmcgd2l0aCBhbXBsaXR1ZGUgcmF0aW8gb2YgdGhpcyBiYW5kICovCi0gICAgYWNjdV9lKys7Ci0gICAgYWNjdTE+Pj0xOwotICAgIGFjY3UyPj49MTsKKyAgICBhY2N1X2UrKzsgLyogc2NhbGUgYXQgbGVhc3Qgb25lIGJpdCBkdWUgdG8gKGFjY3UxK2FjY3UyKSAqLworICAgIGFjY3UxID4+PSAxOworICAgIGFjY3UyID4+PSAxOworCiAgICAgaWYgKGFjY3VfZSAmIDEpIHsKLSAgICAgIGFjY3VfZSsrOwotICAgICAgYWNjdTE+Pj0xOwotICAgICAgYWNjdTI+Pj0xOworICAgICAgYWNjdV9lKys7IC8qIGZvciBhIGRlZmluZWQgc3F1YXJlIHJlc3VsdCBleHBvbmVudCwgdGhlIGV4cG9uZW50IGhhcyB0byBiZQorICAgICAgICAgICAgICAgICAgIGV2ZW4gKi8KKyAgICAgIGFjY3UxID4+PSAxOworICAgICAgYWNjdTIgPj49IDE7CiAgICAgfQogCi0gICAgZGVsdGFfc3VtICs9IGZNdWx0KHNxcnRGaXhwKGFjY3UxK2FjY3UyKSwgZGVsdGEpOwotICAgICpyZXN1bHRfZSA9ICgoYWNjdV9lPj4xKSArIExEX0RBVEFfU0hJRlQpOworICAgIGRlbHRhX3N1bSArPSBmTXVsdChzcXJ0Rml4cChhY2N1MSArIGFjY3UyKSwgZGVsdGEpOworICAgICpyZXN1bHRfZSA9ICgoYWNjdV9lID4+IDEpICsgTERfREFUQV9TSElGVCk7CiAgIH0KIAotICBlbmVyZ3lUb3RhbF9lKz0xOyAvKiBmb3IgYSBkZWZpbmVkIHNxdWFyZSByZXN1bHQgZXhwb25lbnQsIHRoZSBleHBvbmVudCBoYXMgdG8gYmUgZXZlbiAqLwotICBFbmVyZ3lUb3RhbDw8PTE7CisgIGlmIChlbmVyZ3lUb3RhbF9lICYgMSkgeworICAgIGVuZXJneVRvdGFsX2UgKz0gMTsgLyogZm9yIGEgZGVmaW5lZCBzcXVhcmUgcmVzdWx0IGV4cG9uZW50LCB0aGUgZXhwb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyB0byBiZSBldmVuICovCisgICAgRW5lcmd5VG90YWwgPj49IDE7CisgIH0KKwogICBkZWx0YV9zdW0gPSBmTXVsdChkZWx0YV9zdW0sIGludlNxcnROb3JtMihFbmVyZ3lUb3RhbCwgJnRtcF9lKSk7Ci0gICpyZXN1bHRfZSA9ICpyZXN1bHRfZSArICh0bXBfZS0oZW5lcmd5VG90YWxfZT4+MSkpOworICAqcmVzdWx0X2UgPSAqcmVzdWx0X2UgKyAodG1wX2UgLSAoZW5lcmd5VG90YWxfZSA+PiAxKSk7CiAKICAgcmV0dXJuIGZNdWx0KGRlbHRhX3N1bSwgcG9zX3dlaWdodCk7Ci0KIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEZ1bmN0aW9ubmFtZTogIGFkZExvd2JhbmRFbmVyZ2llcwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIzOCw0MCArMjYwLDQ3IEBACiAKICBccmV0dXJuICB0b3RhbCBlbmVyZ3kgaW4gdGhlIGxvd2JhbmQsIHNjYWxlZCBieSB0aGUgZmFjdG9yIDJeMTkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgRklYUF9EQkwgYWRkTG93YmFuZEVuZXJnaWVzKEZJWFBfREJMICoqRW5lcmdpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAqc2NhbGVFbmVyZ2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBZQnVmZmVyV3JpdGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgbnJnU3pTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICB0cmFuX29mZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICpmcmVxQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIHNsb3RzKQotewotICBGSVhQX0RCTCBucmdUb3RhbDsKK3N0YXRpYyBGSVhQX0RCTCBhZGRMb3diYW5kRW5lcmdpZXMoRklYUF9EQkwgKipFbmVyZ2llcywgaW50ICpzY2FsZUVuZXJnaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgWUJ1ZmZlcldyaXRlT2Zmc2V0LCBpbnQgbnJnU3pTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5fb2ZmLCBVQ0hBUiAqZnJlcUJhbmRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNsb3RzKSB7CisgIElOVCBucmdUb3RhbF9lOworICBGSVhQX0RCTCBucmdUb3RhbF9tOwogICBGSVhQX0RCTCBhY2N1MSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICBGSVhQX0RCTCBhY2N1MiA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwotICBpbnQgdHJhbl9vZmZkaXYyID0gdHJhbl9vZmY+Pm5yZ1N6U2hpZnQ7Ci0gIGludCB0cyxrOworICBpbnQgdHJhbl9vZmZkaXYyID0gdHJhbl9vZmYgPj4gbnJnU3pTaGlmdDsKKyAgY29uc3QgaW50IHNjMSA9CisgICAgICBERlJBQ1RfQklUUyAtCisgICAgICBmTm9ybXooKEZJWFBfREJMKWZNYXgoCisgICAgICAgICAgMSwgKGZyZXFCYW5kVGFibGVbMF0gKiAoWUJ1ZmZlcldyaXRlT2Zmc2V0IC0gdHJhbl9vZmZkaXYyKSAtIDEpKSk7CisgIGNvbnN0IGludCBzYzIgPQorICAgICAgREZSQUNUX0JJVFMgLQorICAgICAgZk5vcm16KChGSVhQX0RCTClmTWF4KAorICAgICAgICAgIDEsIChmcmVxQmFuZFRhYmxlWzBdICoKKyAgICAgICAgICAgICAgICAgICh0cmFuX29mZmRpdjIgKyAoc2xvdHMgPj4gbnJnU3pTaGlmdCkgLSBZQnVmZmVyV3JpdGVPZmZzZXQpIC0KKyAgICAgICAgICAgICAgMSkpKTsKKyAgaW50IHRzLCBrOwogCiAgIC8qIFN1bSB1cCBsb3diYW5kIGVuZXJneSBmcm9tIG9uZSBmcmFtZSBhdCBvZmZzZXQgdHJhbl9vZmYgKi8KICAgLyogZnJlcUJhbmRUYWJsZVtMT1JFU10gaGFzIE1BWF9GUkVRX0NPRUZGUy8yICsxIGNvZWVmcyBtYXguICovCi0gIGZvciAodHM9dHJhbl9vZmZkaXYyOyB0czxZQnVmZmVyV3JpdGVPZmZzZXQ7IHRzKyspIHsKKyAgZm9yICh0cyA9IHRyYW5fb2ZmZGl2MjsgdHMgPCBZQnVmZmVyV3JpdGVPZmZzZXQ7IHRzKyspIHsKICAgICBmb3IgKGsgPSAwOyBrIDwgZnJlcUJhbmRUYWJsZVswXTsgaysrKSB7Ci0gICAgICBhY2N1MSArPSBFbmVyZ2llc1t0c11ba10gPj4gNjsKKyAgICAgIGFjY3UxICs9IEVuZXJnaWVzW3RzXVtrXSA+PiBzYzE7CiAgICAgfQogICB9Ci0gIGZvciAoOyB0czx0cmFuX29mZmRpdjIrKHNsb3RzPj5ucmdTelNoaWZ0KTsgdHMrKykgeworICBmb3IgKDsgdHMgPCB0cmFuX29mZmRpdjIgKyAoc2xvdHMgPj4gbnJnU3pTaGlmdCk7IHRzKyspIHsKICAgICBmb3IgKGsgPSAwOyBrIDwgZnJlcUJhbmRUYWJsZVswXTsgaysrKSB7Ci0gICAgICBhY2N1MiArPSBFbmVyZ2llc1t0c11ba10gPj4gOTsKKyAgICAgIGFjY3UyICs9IEVuZXJnaWVzW3RzXVtrXSA+PiBzYzI7CiAgICAgfQogICB9CiAKLSAgbnJnVG90YWwgPSAoIHNjYWxlVmFsdWVTYXR1cmF0ZShhY2N1MSwgMS1zY2FsZUVuZXJnaWVzWzBdKSApCi0gICAgICAgICAgICsgKCBzY2FsZVZhbHVlU2F0dXJhdGUoYWNjdTIsIDQtc2NhbGVFbmVyZ2llc1sxXSkgKTsKKyAgbnJnVG90YWxfbSA9IGZBZGROb3JtKGFjY3UxLCAoc2MxIC0gNSkgLSBzY2FsZUVuZXJnaWVzWzBdLCBhY2N1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzYzIgLSA1KSAtIHNjYWxlRW5lcmdpZXNbMV0sICZucmdUb3RhbF9lKTsKKyAgbnJnVG90YWxfbSA9IHNjYWxlVmFsdWVTYXR1cmF0ZShucmdUb3RhbF9tLCBucmdUb3RhbF9lKTsKIAotICByZXR1cm4obnJnVG90YWwpOworICByZXR1cm4gKG5yZ1RvdGFsX20pOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgRnVuY3Rpb25uYW1lOiAgYWRkSGlnaGJhbmRFbmVyZ2llcwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI4OSwzNSArMzE4LDM1IEBACiAgXHJldHVybiAgdG90YWwgZW5lcmd5IGluIHRoZSBoaWdoYmFuZCwgc2NhbGVkIGJ5IGZhY3RvciAyXjE5CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgRklYUF9EQkwgYWRkSGlnaGJhbmRFbmVyZ2llcyhGSVhQX0RCTCAqKlJFU1RSSUNUIEVuZXJnaWVzLCAvKiE8IGlucHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgKnNjYWxlRW5lcmdpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgIFlCdWZmZXJXcml0ZU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgRW5lcmdpZXNNW05VTUJFUl9USU1FX1NMT1RTXzIzMDRdW01BWF9GUkVRX0NPRUZGU10sIC8qITwgQ29tYmluZWQgb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgKlJFU1RSSUNUIGZyZXFCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgIG5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgIHNiclNsb3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICB0aW1lU3RlcCkKLXsKLSAgSU5UIGksaixrLHNsb3RJbixzbG90T3V0LHNjYWxlWzJdOwotICBJTlQgbGksdWk7CitzdGF0aWMgRklYUF9EQkwgYWRkSGlnaGJhbmRFbmVyZ2llcygKKyAgICBGSVhQX0RCTCAqKlJFU1RSSUNUIEVuZXJnaWVzLCAvKiE8IGlucHV0ICovCisgICAgSU5UICpzY2FsZUVuZXJnaWVzLCBJTlQgWUJ1ZmZlcldyaXRlT2Zmc2V0LAorICAgIEZJWFBfREJMIEVuZXJnaWVzTVtOVU1CRVJfVElNRV9TTE9UU18yMzA0XQorICAgICAgICAgICAgICAgICAgICAgIFtNQVhfRlJFUV9DT0VGRlNdLCAvKiE8IENvbWJpbmVkIG91dHB1dCAqLworICAgIFVDSEFSICpSRVNUUklDVCBmcmVxQmFuZFRhYmxlLCBJTlQgblNmYiwgSU5UIHNiclNsb3RzLCBJTlQgdGltZVN0ZXApIHsKKyAgSU5UIGksIGosIGssIHNsb3RJbiwgc2xvdE91dCwgc2NhbGVbMl07CisgIElOVCBsaSwgdWk7CiAgIEZJWFBfREJMIG5yZ1RvdGFsOwogICBGSVhQX0RCTCBhY2N1ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAKICAgLyogQ29tYmluZSBRTUYtdGltZXNsb3RzIHRvIFNCUi10aW1lc2xvdHMsCiAgICAgIGNvbWJpbmUgUU1GLWJhbmRzIHRvIFNCUi1iYW5kcywKICAgICAgY29tYmluZSBMZWZ0IGFuZCBSaWdodCBjaGFubmVsICovCi0gIGZvciAoc2xvdE91dD0wOyBzbG90T3V0PHNiclNsb3RzOyBzbG90T3V0KyspIHsKLSAgICBzbG90SW4gPSB0aW1lU3RlcCpzbG90T3V0OworICBmb3IgKHNsb3RPdXQgPSAwOyBzbG90T3V0IDwgc2JyU2xvdHM7IHNsb3RPdXQrKykgeworICAgIC8qIE5vdGU6IEJlbG93IHNsb3RJbiA9IHNsb3RPdXQgYW5kIG5vdCBzbG90SW4gPSB0aW1lU3RlcCpzbG90T3V0CisgICAgICAgYmVjYXVzZSB0aGUgRW5lcmdpZXNbXSB0aW1lIHJlc29sdXRpb24gaXMgYWx3YXlzIHRoZSBTQlIgc2xvdCByZXNvbHV0aW9uCisgICAgICAgcmVnYXJkbGVzcyBvZiB0aGUgdGltZVN0ZXAuICovCisgICAgc2xvdEluID0gc2xvdE91dDsKIAotICAgIGZvciAoaj0wOyBqPG5TZmI7IGorKykgeworICAgIGZvciAoaiA9IDA7IGogPCBuU2ZiOyBqKyspIHsKICAgICAgIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKIAogICAgICAgbGkgPSBmcmVxQmFuZFRhYmxlW2pdOwogICAgICAgdWkgPSBmcmVxQmFuZFRhYmxlW2ogKyAxXTsKIAotICAgICAgZm9yIChrPWxpOyBrPHVpOyBrKyspIHsKLSAgICAgICAgZm9yIChpPTA7IGk8dGltZVN0ZXA7IGkrKykgewotICAgICAgICAgYWNjdSArPSAoRW5lcmdpZXNbKHNsb3RJbitpKT4+MV1ba10gPj4gNSk7CisgICAgICBmb3IgKGsgPSBsaTsgayA8IHVpOyBrKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHRpbWVTdGVwOyBpKyspIHsKKyAgICAgICAgICBhY2N1ICs9IEVuZXJnaWVzW3Nsb3RJbl1ba10gPj4gNTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgRW5lcmdpZXNNW3Nsb3RPdXRdW2pdID0gYWNjdTsKQEAgLTMyNSwzNCArMzU0LDM0IEBACiAgIH0KIAogICAvKiBzY2FsZSBlbmVyZ2llcyBkb3duIGJlZm9yZSBhZGQgdXAgKi8KLSAgc2NhbGVbMF0gPSBmaXhNaW4oOCxzY2FsZUVuZXJnaWVzWzBdKTsKLSAgc2NhbGVbMV0gPSBmaXhNaW4oOCxzY2FsZUVuZXJnaWVzWzFdKTsKKyAgc2NhbGVbMF0gPSBmaXhNaW4oOCwgc2NhbGVFbmVyZ2llc1swXSk7CisgIHNjYWxlWzFdID0gZml4TWluKDgsIHNjYWxlRW5lcmdpZXNbMV0pOwogCi0gIGlmICgoc2NhbGVFbmVyZ2llc1swXS1zY2FsZVswXSkgPiAoREZSQUNUX0JJVFMtMSkgfHwgKHNjYWxlRW5lcmdpZXNbMV0tc2NhbGVbMF0pID4gKERGUkFDVF9CSVRTLTEpKQorICBpZiAoKHNjYWxlRW5lcmdpZXNbMF0gLSBzY2FsZVswXSkgPiAoREZSQUNUX0JJVFMgLSAxKSB8fAorICAgICAgKHNjYWxlRW5lcmdpZXNbMV0gLSBzY2FsZVsxXSkgPiAoREZSQUNUX0JJVFMgLSAxKSkKICAgICBucmdUb3RhbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICBlbHNlIHsKICAgICAvKiBOb3cgYWRkIGFsbCBlbmVyZ2llcyAqLwogICAgIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKIAotICAgIGZvciAoc2xvdE91dD0wOyBzbG90T3V0PFlCdWZmZXJXcml0ZU9mZnNldDsgc2xvdE91dCsrKSB7Ci0gICAgICBmb3IgKGo9MDsgajxuU2ZiOyBqKyspIHsKKyAgICBmb3IgKHNsb3RPdXQgPSAwOyBzbG90T3V0IDwgWUJ1ZmZlcldyaXRlT2Zmc2V0OyBzbG90T3V0KyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBuU2ZiOyBqKyspIHsKICAgICAgICAgYWNjdSArPSAoRW5lcmdpZXNNW3Nsb3RPdXRdW2pdID4+IHNjYWxlWzBdKTsKICAgICAgIH0KICAgICB9Ci0gICAgbnJnVG90YWwgPSBhY2N1ID4+IChzY2FsZUVuZXJnaWVzWzBdLXNjYWxlWzBdKTsKKyAgICBucmdUb3RhbCA9IGFjY3UgPj4gKHNjYWxlRW5lcmdpZXNbMF0gLSBzY2FsZVswXSk7CiAKLSAgICBmb3IgKHNsb3RPdXQ9WUJ1ZmZlcldyaXRlT2Zmc2V0OyBzbG90T3V0PHNiclNsb3RzOyBzbG90T3V0KyspIHsKLSAgICAgIGZvciAoaj0wOyBqPG5TZmI7IGorKykgeworICAgIGZvciAoc2xvdE91dCA9IFlCdWZmZXJXcml0ZU9mZnNldDsgc2xvdE91dCA8IHNiclNsb3RzOyBzbG90T3V0KyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBuU2ZiOyBqKyspIHsKICAgICAgICAgYWNjdSArPSAoRW5lcmdpZXNNW3Nsb3RPdXRdW2pdID4+IHNjYWxlWzBdKTsKICAgICAgIH0KICAgICB9Ci0gICAgbnJnVG90YWwgPSBhY2N1ID4+IChzY2FsZUVuZXJnaWVzWzFdLXNjYWxlWzFdKTsKKyAgICBucmdUb3RhbCA9IGZBZGRTYXR1cmF0ZShucmdUb3RhbCwgYWNjdSA+PiAoc2NhbGVFbmVyZ2llc1sxXSAtIHNjYWxlWzFdKSk7CiAgIH0KIAotICByZXR1cm4obnJnVG90YWwpOworICByZXR1cm4gKG5yZ1RvdGFsKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEZ1bmN0aW9ubmFtZTogIEZES3NickVuY19mcmFtZVNwbGl0dGVyCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzYxLDczICszOTAsNTUgQEAKICBJZiBubyB0cmFuc2llbnQgaGFzIGJlZW4gZGV0ZWN0ZWQgYmVmb3JlLCB0aGUgZnJhbWUgY2FuIHN0aWxsIGJlIHNwbGl0dGVkCiAgaW50byAyIGVudmVsb3Blcy4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1GREtzYnJFbmNfZnJhbWVTcGxpdHRlcihGSVhQX0RCTCAqKkVuZXJnaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpzY2FsZUVuZXJnaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9UUkFOU0lFTlRfREVURUNUT1IgaF9zYnJUcmFuc2llbnREZXRlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpmcmVxQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnRyYW5fdmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IFlCdWZmZXJXcml0ZU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBZQnVmZmVyU3pTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vX2NvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogdG9uYWxpdHkpCi17Ci0gIGlmICh0cmFuX3ZlY3RvclsxXT09MCkgLyogbm8gdHJhbnNpZW50IHdhcyBkZXRlY3RlZCAqLwordm9pZCBGREtzYnJFbmNfZnJhbWVTcGxpdHRlcigKKyAgICBGSVhQX0RCTCAqKkVuZXJnaWVzLCBJTlQgKnNjYWxlRW5lcmdpZXMsCisgICAgSEFORExFX1NCUl9UUkFOU0lFTlRfREVURUNUT1IgaF9zYnJUcmFuc2llbnREZXRlY3RvciwgVUNIQVIgKmZyZXFCYW5kVGFibGUsCisgICAgVUNIQVIgKnRyYW5fdmVjdG9yLCBpbnQgWUJ1ZmZlcldyaXRlT2Zmc2V0LCBpbnQgWUJ1ZmZlclN6U2hpZnQsIGludCBuU2ZiLAorICAgIGludCB0aW1lU3RlcCwgaW50IG5vX2NvbHMsIEZJWFBfREJMICp0b25hbGl0eSkgeworICBpZiAodHJhbl92ZWN0b3JbMV0gPT0gMCkgLyogbm8gdHJhbnNpZW50IHdhcyBkZXRlY3RlZCAqLwogICB7CiAgICAgRklYUF9EQkwgZGVsdGE7CiAgICAgSU5UIGRlbHRhX2U7Ci0gICAgRklYUF9EQkwgKCpFbmVyZ2llc00pW01BWF9GUkVRX0NPRUZGU107Ci0gICAgRklYUF9EQkwgRW5lcmd5VG90YWwsbmV3TG93YmFuZEVuZXJneSxuZXdIaWdoYmFuZEVuZXJneTsKKyAgICBGSVhQX0RCTCgqRW5lcmdpZXNNKVtNQVhfRlJFUV9DT0VGRlNdOworICAgIEZJWFBfREJMIEVuZXJneVRvdGFsLCBuZXdMb3diYW5kRW5lcmd5LCBuZXdIaWdoYmFuZEVuZXJneTsKICAgICBJTlQgYm9yZGVyOwotICAgIElOVCBzYnJTbG90cyA9IGZNdWx0SShHZXRJbnZJbnQodGltZVN0ZXApLG5vX2NvbHMpOwotICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChfRW5lcmdpZXNNLCBGSVhQX0RCTCwgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNCpNQVhfRlJFUV9DT0VGRlMpCisgICAgSU5UIHNiclNsb3RzID0gZk11bHRJKEdldEludkludCh0aW1lU3RlcCksIG5vX2NvbHMpOworICAgIENfQUxMT0NfU0NSQVRDSF9TVEFSVChfRW5lcmdpZXNNLCBGSVhQX0RCTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNCAqIE1BWF9GUkVRX0NPRUZGUykKIAotICAgIEZES19BU1NFUlQoIHNiclNsb3RzICogdGltZVN0ZXAgPT0gbm9fY29scyApOworICAgIEZES19BU1NFUlQoc2JyU2xvdHMgKiB0aW1lU3RlcCA9PSBub19jb2xzKTsKIAogICAgIEVuZXJnaWVzTSA9IChGSVhQX0RCTCgqKVtNQVhfRlJFUV9DT0VGRlNdKV9FbmVyZ2llc007CiAKICAgICAvKgotICAgICAgR2V0IExvd2JhbmQtZW5lcmd5IG92ZXIgYSByYW5nZSBvZiAyIGZyYW1lcyAoTG9vayBoYWxmIGEgZnJhbWUgYmFjayBhbmQgYWhlYWQpLgorICAgICAgR2V0IExvd2JhbmQtZW5lcmd5IG92ZXIgYSByYW5nZSBvZiAyIGZyYW1lcyAoTG9vayBoYWxmIGEgZnJhbWUgYmFjayBhbmQKKyAgICAgIGFoZWFkKS4KICAgICAqLwotICAgIG5ld0xvd2JhbmRFbmVyZ3kgPSBhZGRMb3diYW5kRW5lcmdpZXMoRW5lcmdpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUVuZXJnaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlcldyaXRlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlclN6U2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3NiclRyYW5zaWVudERldGVjdG9yLT50cmFuX29mZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXFCYW5kVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub19jb2xzKTsKKyAgICBuZXdMb3diYW5kRW5lcmd5ID0gYWRkTG93YmFuZEVuZXJnaWVzKAorICAgICAgICBFbmVyZ2llcywgc2NhbGVFbmVyZ2llcywgWUJ1ZmZlcldyaXRlT2Zmc2V0LCBZQnVmZmVyU3pTaGlmdCwKKyAgICAgICAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+dHJhbl9vZmYsIGZyZXFCYW5kVGFibGUsIG5vX2NvbHMpOwogCi0gICAgbmV3SGlnaGJhbmRFbmVyZ3kgPSBhZGRIaWdoYmFuZEVuZXJnaWVzKEVuZXJnaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUVuZXJnaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyV3JpdGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZXJnaWVzTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcUJhbmRUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyU2xvdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVTdGVwKTsKKyAgICBuZXdIaWdoYmFuZEVuZXJneSA9CisgICAgICAgIGFkZEhpZ2hiYW5kRW5lcmdpZXMoRW5lcmdpZXMsIHNjYWxlRW5lcmdpZXMsIFlCdWZmZXJXcml0ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmVyZ2llc00sIGZyZXFCYW5kVGFibGUsIG5TZmIsIHNiclNsb3RzLCB0aW1lU3RlcCk7CiAKICAgICB7Ci0gICAgICAvKiBwcmV2TG93QmFuZEVuZXJneTogQ29ycmVzcG9uZHMgdG8gMSBmcmFtZSwgc3RhcnRpbmcgd2l0aCBoYWxmIGEgZnJhbWUgbG9vay1iZWhpbmQKLSAgICAgICAgIG5ld0xvd2JhbmRFbmVyZ3k6ICBDb3JyZXNwb25kcyB0byAxIGZyYW1lLCBzdGFydGluZyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBjdXJyZW50IGZyYW1lICovCi0gICAgICBFbmVyZ3lUb3RhbCA9IChuZXdMb3diYW5kRW5lcmd5ICsgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+cHJldkxvd0JhbmRFbmVyZ3kpID4+IDE7Ci0gICAgICBFbmVyZ3lUb3RhbCArPSBuZXdIaWdoYmFuZEVuZXJneTsKKyAgICAgIC8qIHByZXZMb3dCYW5kRW5lcmd5OiBDb3JyZXNwb25kcyB0byAxIGZyYW1lLCBzdGFydGluZyB3aXRoIGhhbGYgYSBmcmFtZQorICAgICAgICAgbG9vay1iZWhpbmQgbmV3TG93YmFuZEVuZXJneTogIENvcnJlc3BvbmRzIHRvIDEgZnJhbWUsIHN0YXJ0aW5nIGluIHRoZQorICAgICAgICAgbWlkZGxlIG9mIHRoZSBjdXJyZW50IGZyYW1lICovCisgICAgICBFbmVyZ3lUb3RhbCA9IChuZXdMb3diYW5kRW5lcmd5ID4+IDEpICsKKyAgICAgICAgICAgICAgICAgICAgKGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnByZXZMb3dCYW5kRW5lcmd5ID4+CisgICAgICAgICAgICAgICAgICAgICAxKTsgLyogbWVhbiBvZiBuZXcgYW5kIHByZXYgTEIgTlJHICovCisgICAgICBFbmVyZ3lUb3RhbCA9CisgICAgICAgICAgZkFkZFNhdHVyYXRlKEVuZXJneVRvdGFsLCBuZXdIaWdoYmFuZEVuZXJneSk7IC8qIEFkZCBIQiBOUkcgKi8KICAgICAgIC8qIFRoZSBiZWxvdyBib3JkZXIgc2hvdWxkIHNwZWNpZnkgdGhlIHNhbWUgcG9zaXRpb24gYXMgdGhlIG1pZGRsZSBib3JkZXIKICAgICAgICAgIG9mIGEgRklYRklYLWZyYW1lIHdpdGggMiBlbnZlbG9wZXMuICovCi0gICAgICBib3JkZXIgPSAoc2JyU2xvdHMrMSkgPj4gMTsKKyAgICAgIGJvcmRlciA9IChzYnJTbG90cyArIDEpID4+IDE7CiAKLSAgICAgIGlmICggKElOVClFbmVyZ3lUb3RhbCYweGZmZmZmZmUwICYmIChzY2FsZUVuZXJnaWVzWzBdPDMyIHx8IHNjYWxlRW5lcmdpZXNbMV08MzIpICkgLyogaS5lLiA+IDMxICovIHsKLSAgICAgIGRlbHRhID0gc3BlY3RyYWxDaGFuZ2UoRW5lcmdpZXNNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUVuZXJnaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmVyZ3lUb3RhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyV3JpdGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiclNsb3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YV9lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICBpZiAoKElOVClFbmVyZ3lUb3RhbCAmIDB4ZmZmZmZmZTAgJiYKKyAgICAgICAgICAoc2NhbGVFbmVyZ2llc1swXSA8IDMyIHx8IHNjYWxlRW5lcmdpZXNbMV0gPCAzMikpIC8qIGkuZS4gPiAzMSAqLyB7CisgICAgICAgIGRlbHRhID0gc3BlY3RyYWxDaGFuZ2UoRW5lcmdpZXNNLCBzY2FsZUVuZXJnaWVzLCBFbmVyZ3lUb3RhbCwgblNmYiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIsIFlCdWZmZXJXcml0ZU9mZnNldCwgc2JyU2xvdHMsICZkZWx0YV9lKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGRlbHRhID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgICAgIGRlbHRhX2UgPSAwOwpAQCAtNDM3LDEwMCArNDQ4LDk4IEBACiAgICAgICAgICp0b25hbGl0eSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgfQogCi0KLSAgICAgIGlmICggZklzTGVzc1RoYW4oaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+c3BsaXRfdGhyX20sIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnNwbGl0X3Rocl9lLCBkZWx0YSwgZGVsdGFfZSkgKSB7CisgICAgICBpZiAoZklzTGVzc1RoYW4oaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+c3BsaXRfdGhyX20sCisgICAgICAgICAgICAgICAgICAgICAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+c3BsaXRfdGhyX2UsIGRlbHRhLCBkZWx0YV9lKSkgewogICAgICAgICB0cmFuX3ZlY3RvclswXSA9IDE7IC8qIFNldCBmbGFnIGZvciBzcGxpdHRpbmcgKi8KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHRyYW5fdmVjdG9yWzBdID0gMDsKICAgICAgIH0KLQogICAgIH0KIAogICAgIC8qIFVwZGF0ZSBwcmV2TG93QmFuZEVuZXJneSAqLwogICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnByZXZMb3dCYW5kRW5lcmd5ID0gbmV3TG93YmFuZEVuZXJneTsKICAgICBoX3NiclRyYW5zaWVudERldGVjdG9yLT5wcmV2SGlnaEJhbmRFbmVyZ3kgPSBuZXdIaWdoYmFuZEVuZXJneTsKLSAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKF9FbmVyZ2llc00sIEZJWFBfREJMLCBOVU1CRVJfVElNRV9TTE9UU18yMzA0Kk1BWF9GUkVRX0NPRUZGUykKKyAgICBDX0FMTE9DX1NDUkFUQ0hfRU5EKF9FbmVyZ2llc00sIEZJWFBfREJMLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNCAqIE1BWF9GUkVRX0NPRUZGUykKICAgfQogfQogCiAvKgogICogQ2FsY3VsYXRlIHRyYW5zaWVudCBlbmVyZ3kgdGhyZXNob2xkIGZvciBlYWNoIFFNRiBiYW5kCiAgKi8KLXN0YXRpYyB2b2lkCi1jYWxjdWxhdGVUaHJlc2hvbGRzKEZJWFBfREJMICoqUkVTVFJJQ1QgRW5lcmdpZXMsCi0gICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAqUkVTVFJJQ1Qgc2NhbGVFbmVyZ2llcywKLSAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpSRVNUUklDVCB0aHJlc2hvbGRzLAotICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIFlCdWZmZXJXcml0ZU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBZQnVmZmVyU3pTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBub0NvbHMsCi0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgbm9Sb3dzLAotICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIHRyYW5fb2ZmKQotewotICBGSVhQX0RCTCBtZWFuX3ZhbCxzdGRfdmFsLHRlbXA7CitzdGF0aWMgdm9pZCBjYWxjdWxhdGVUaHJlc2hvbGRzKEZJWFBfREJMICoqUkVTVFJJQ1QgRW5lcmdpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqUkVTVFJJQ1Qgc2NhbGVFbmVyZ2llcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKlJFU1RSSUNUIHRocmVzaG9sZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBZQnVmZmVyV3JpdGVPZmZzZXQsIGludCBZQnVmZmVyU3pTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vQ29scywgaW50IG5vUm93cywgaW50IHRyYW5fb2ZmKSB7CisgIEZJWFBfREJMIG1lYW5fdmFsLCBzdGRfdmFsLCB0ZW1wOwogICBGSVhQX0RCTCBpX25vQ29sczsKICAgRklYUF9EQkwgaV9ub0NvbHMxOwotICBGSVhQX0RCTCBhY2N1LGFjY3UwLGFjY3UxOwotICBpbnQgc2NhbGVGYWN0b3IwLHNjYWxlRmFjdG9yMSxjb21tb25TY2FsZTsKLSAgaW50IGksajsKKyAgRklYUF9EQkwgYWNjdSwgYWNjdTAsIGFjY3UxOworICBpbnQgc2NhbGVGYWN0b3IwLCBzY2FsZUZhY3RvcjEsIGNvbW1vblNjYWxlOworICBpbnQgaSwgajsKIAotICBpX25vQ29scyAgPSBHZXRJbnZJbnQobm9Db2xzICsgdHJhbl9vZmYgKSA8PCBZQnVmZmVyU3pTaGlmdDsKKyAgaV9ub0NvbHMgPSBHZXRJbnZJbnQobm9Db2xzICsgdHJhbl9vZmYpIDw8IFlCdWZmZXJTelNoaWZ0OwogICBpX25vQ29sczEgPSBHZXRJbnZJbnQobm9Db2xzICsgdHJhbl9vZmYgLSAxKSA8PCBZQnVmZmVyU3pTaGlmdDsKIAogICAvKiBjYWxjIG1pbmltdW0gc2NhbGUgb2YgZW5lcmdpZXMgb2YgcHJldmlvdXMgYW5kIGN1cnJlbnQgZnJhbWUgKi8KLSAgY29tbW9uU2NhbGUgPSBmaXhNaW4oc2NhbGVFbmVyZ2llc1swXSxzY2FsZUVuZXJnaWVzWzFdKTsKKyAgY29tbW9uU2NhbGUgPSBmaXhNaW4oc2NhbGVFbmVyZ2llc1swXSwgc2NhbGVFbmVyZ2llc1sxXSk7CiAKICAgLyogY2FsYyBzY2FsZWZhY3RvcnMgdG8gYWRhcHQgZW5lcmdpZXMgdG8gY29tbW9uIHNjYWxlICovCi0gIHNjYWxlRmFjdG9yMCA9IGZpeE1pbigoc2NhbGVFbmVyZ2llc1swXS1jb21tb25TY2FsZSksIChERlJBQ1RfQklUUy0xKSk7Ci0gIHNjYWxlRmFjdG9yMSA9IGZpeE1pbigoc2NhbGVFbmVyZ2llc1sxXS1jb21tb25TY2FsZSksIChERlJBQ1RfQklUUy0xKSk7CisgIHNjYWxlRmFjdG9yMCA9IGZpeE1pbigoc2NhbGVFbmVyZ2llc1swXSAtIGNvbW1vblNjYWxlKSwgKERGUkFDVF9CSVRTIC0gMSkpOworICBzY2FsZUZhY3RvcjEgPSBmaXhNaW4oKHNjYWxlRW5lcmdpZXNbMV0gLSBjb21tb25TY2FsZSksIChERlJBQ1RfQklUUyAtIDEpKTsKIAogICBGREtfQVNTRVJUKChzY2FsZUZhY3RvcjAgPj0gMCkgJiYgKHNjYWxlRmFjdG9yMSA+PSAwKSk7CiAKICAgLyogY2FsY3VsYXRlIHN0YW5kYXJkIGRldmlhdGlvbiBpbiBldmVyeSBzdWJiYW5kICovCi0gIGZvciAoaT0wOyBpPG5vUm93czsgaSsrKQotICB7Ci0gICAgaW50IHN0YXJ0RW5lcmd5ID0gKHRyYW5fb2ZmPj5ZQnVmZmVyU3pTaGlmdCk7Ci0gICAgaW50IGVuZEVuZXJneSA9ICgobm9Db2xzPj5ZQnVmZmVyU3pTaGlmdCkrdHJhbl9vZmYpOworICBmb3IgKGkgPSAwOyBpIDwgbm9Sb3dzOyBpKyspIHsKKyAgICBpbnQgc3RhcnRFbmVyZ3kgPSAodHJhbl9vZmYgPj4gWUJ1ZmZlclN6U2hpZnQpOworICAgIGludCBlbmRFbmVyZ3kgPSAoKG5vQ29scyA+PiBZQnVmZmVyU3pTaGlmdCkgKyB0cmFuX29mZik7CiAgICAgaW50IHNoaWZ0OwogCiAgICAgLyogY2FsY3VsYXRlIG1lYW4gdmFsdWUgb3ZlciBkZWNpbWF0ZWQgZW5lcmd5IHZhbHVlcyAoZG93bnNhbXBsZWQgYnkgMikuICovCiAgICAgYWNjdTAgPSBhY2N1MSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogCi0gICAgZm9yIChqPXN0YXJ0RW5lcmd5OyBqPFlCdWZmZXJXcml0ZU9mZnNldDsgaisrKQotICAgICAgYWNjdTAgKz0gZk11bHQoRW5lcmdpZXNbal1baV0sIGlfbm9Db2xzKTsKLSAgICBmb3IgKDsgajxlbmRFbmVyZ3k7IGorKykKLSAgICAgIGFjY3UxICs9IGZNdWx0KEVuZXJnaWVzW2pdW2ldLCBpX25vQ29scyk7CisgICAgZm9yIChqID0gc3RhcnRFbmVyZ3k7IGogPCBZQnVmZmVyV3JpdGVPZmZzZXQ7IGorKykKKyAgICAgIGFjY3UwID0gZk11bHRBZGREaXYyKGFjY3UwLCBFbmVyZ2llc1tqXVtpXSwgaV9ub0NvbHMpOworICAgIGZvciAoOyBqIDwgZW5kRW5lcmd5OyBqKyspCisgICAgICBhY2N1MSA9IGZNdWx0QWRkRGl2MihhY2N1MSwgRW5lcmdpZXNbal1baV0sIGlfbm9Db2xzKTsKIAotICAgIG1lYW5fdmFsID0gKGFjY3UwID4+IHNjYWxlRmFjdG9yMCkgKyAoYWNjdTEgPj4gc2NhbGVGYWN0b3IxKTsgIC8qIGF2ZXJhZ2UgKi8KLSAgICBzaGlmdCAgICA9IGZpeE1heCgwLENvdW50TGVhZGluZ0JpdHMobWVhbl92YWwpLTYpOyAgICAgICAgICAgICAvKiAtNiB0byBrZWVwIHJvb20gZm9yIGFjY3VtdWxhdGluZyB1cHRvIE4gPSAyNCB2YWx1ZXMgKi8KKyAgICBtZWFuX3ZhbCA9ICgoYWNjdTAgPDwgMSkgPj4gc2NhbGVGYWN0b3IwKSArCisgICAgICAgICAgICAgICAoKGFjY3UxIDw8IDEpID4+IHNjYWxlRmFjdG9yMSk7IC8qIGF2ZXJhZ2UgKi8KKyAgICBzaGlmdCA9IGZpeE1heCgKKyAgICAgICAgMCwgQ291bnRMZWFkaW5nQml0cyhtZWFuX3ZhbCkgLQorICAgICAgICAgICAgICAgNik7IC8qIC02IHRvIGtlZXAgcm9vbSBmb3IgYWNjdW11bGF0aW5nIHVwdG8gTiA9IDI0IHZhbHVlcyAqLwogCiAgICAgLyogY2FsY3VsYXRlIHN0YW5kYXJkIGRldmlhdGlvbiAqLwogICAgIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKIAogICAgIC8qIHN1bW1lIHsgKChtZWFuX3ZhbC1ucmcpXjIpICogaV9ub0NvbHMxIH0gKi8KLSAgICBmb3IgKGo9c3RhcnRFbmVyZ3k7IGo8WUJ1ZmZlcldyaXRlT2Zmc2V0OyBqKyspIHsKLSAgICAgIHRlbXAgPSAoKEZJWFBfREJMKW1lYW5fdmFsIC0gKChGSVhQX0RCTClFbmVyZ2llc1tqXVtpXSA+PiBzY2FsZUZhY3RvcjApKTw8c2hpZnQ7Ci0gICAgICB0ZW1wID0gZlBvdzIodGVtcCk7Ci0gICAgICB0ZW1wID0gZk11bHQodGVtcCwgaV9ub0NvbHMxKTsKLSAgICAgIGFjY3UgKz0gdGVtcDsKKyAgICBmb3IgKGogPSBzdGFydEVuZXJneTsgaiA8IFlCdWZmZXJXcml0ZU9mZnNldDsgaisrKSB7CisgICAgICB0ZW1wID0gKChGSVhQX0RCTCltZWFuX3ZhbCAtICgoRklYUF9EQkwpRW5lcmdpZXNbal1baV0gPj4gc2NhbGVGYWN0b3IwKSkKKyAgICAgICAgICAgICA8PCBzaGlmdDsKKyAgICAgIHRlbXAgPSBmUG93MkRpdjIodGVtcCk7CisgICAgICBhY2N1ID0gZk11bHRBZGREaXYyKGFjY3UsIHRlbXAsIGlfbm9Db2xzMSk7CiAgICAgfQotICAgIGZvciAoOyBqPGVuZEVuZXJneTsgaisrKSB7Ci0gICAgICB0ZW1wID0gKChGSVhQX0RCTCltZWFuX3ZhbCAtICgoRklYUF9EQkwpRW5lcmdpZXNbal1baV0gPj4gc2NhbGVGYWN0b3IxKSk8PHNoaWZ0OwotICAgICAgdGVtcCA9IGZQb3cyKHRlbXApOwotICAgICAgdGVtcCA9IGZNdWx0KHRlbXAsIGlfbm9Db2xzMSk7Ci0gICAgICBhY2N1ICs9IHRlbXA7CisgICAgZm9yICg7IGogPCBlbmRFbmVyZ3k7IGorKykgeworICAgICAgdGVtcCA9ICgoRklYUF9EQkwpbWVhbl92YWwgLSAoKEZJWFBfREJMKUVuZXJnaWVzW2pdW2ldID4+IHNjYWxlRmFjdG9yMSkpCisgICAgICAgICAgICAgPDwgc2hpZnQ7CisgICAgICB0ZW1wID0gZlBvdzJEaXYyKHRlbXApOworICAgICAgYWNjdSA9IGZNdWx0QWRkRGl2MihhY2N1LCB0ZW1wLCBpX25vQ29sczEpOwogICAgIH0KLQotICAgIHN0ZF92YWwgPSBzcXJ0Rml4cChhY2N1KT4+c2hpZnQ7ICAgICAvKiBzdGFuZGFyZCBkZXZpYXRpb24gKi8KKyAgICBhY2N1IDw8PSAyOworICAgIHN0ZF92YWwgPSBzcXJ0Rml4cChhY2N1KSA+PiBzaGlmdDsgLyogc3RhbmRhcmQgZGV2aWF0aW9uICovCiAKICAgICAvKgogICAgIFRha2UgbmV3IHRocmVzaG9sZCBhcyBhdmVyYWdlIG9mIGNhbGN1bGF0ZWQgc3RhbmRhcmQgZGV2aWF0aW9uIHJhdGlvCiAgICAgYW5kIG9sZCB0aHJlc2hvbGQgaWYgZ3JlYXRlciB0aGFuIGFic29sdXRlIHRocmVzaG9sZAogICAgICovCi0gICAgdGVtcCA9ICggY29tbW9uU2NhbGU8PShERlJBQ1RfQklUUy0xKSApCi0gICAgICAgICAgICA/IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNjZmKSwgdGhyZXNob2xkc1tpXSkgKyAoZk11bHQoRkwyRlhDT05TVF9EQkwoMC4zNGYpLCBzdGRfdmFsKSA+PiBjb21tb25TY2FsZSkKLSAgICAgICAgICAgIDogKEZJWFBfREJMKSAwOworICAgIHRlbXAgPSAoY29tbW9uU2NhbGUgPD0gKERGUkFDVF9CSVRTIC0gMSkpCisgICAgICAgICAgICAgICA/IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuNjZmKSwgdGhyZXNob2xkc1tpXSkgKworICAgICAgICAgICAgICAgICAgICAgKGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuMzRmKSwgc3RkX3ZhbCkgPj4gY29tbW9uU2NhbGUpCisgICAgICAgICAgICAgICA6IChGSVhQX0RCTCkwOwogCi0gICAgdGhyZXNob2xkc1tpXSA9IGZpeE1heChBQlNfVEhSRVMsdGVtcCk7CisgICAgdGhyZXNob2xkc1tpXSA9IGZpeE1heChBQlNfVEhSRVMsIHRlbXApOwogCiAgICAgRkRLX0FTU0VSVChjb21tb25TY2FsZSA+PSAwKTsKICAgfQpAQCAtNTM5LDI2ICs1NDgsMTcgQEAKIC8qCiAgKiBDYWxjdWxhdGUgdHJhbnNpZW50IGxldmVscyBmb3IgZWFjaCBRTUYgdGltZSBzbG90LgogICovCi1zdGF0aWMgdm9pZAotZXh0cmFjdFRyYW5zaWVudENhbmRpZGF0ZXMoRklYUF9EQkwgICoqUkVTVFJJQ1QgRW5lcmdpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICpSRVNUUklDVCBzY2FsZUVuZXJnaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAqUkVTVFJJQ1QgdGhyZXNob2xkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgKlJFU1RSSUNUIHRyYW5zaWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBZQnVmZmVyV3JpdGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBZQnVmZmVyU3pTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG5vQ29scywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHN0YXJ0X2JhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBzdG9wX2JhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICB0cmFuX29mZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGFkZFByZXZTYW1wbGVzKQoteworc3RhdGljIHZvaWQgZXh0cmFjdFRyYW5zaWVudENhbmRpZGF0ZXMoCisgICAgRklYUF9EQkwgKipSRVNUUklDVCBFbmVyZ2llcywgSU5UICpSRVNUUklDVCBzY2FsZUVuZXJnaWVzLAorICAgIEZJWFBfREJMICpSRVNUUklDVCB0aHJlc2hvbGRzLCBGSVhQX0RCTCAqUkVTVFJJQ1QgdHJhbnNpZW50cywKKyAgICBpbnQgWUJ1ZmZlcldyaXRlT2Zmc2V0LCBpbnQgWUJ1ZmZlclN6U2hpZnQsIGludCBub0NvbHMsIGludCBzdGFydF9iYW5kLAorICAgIGludCBzdG9wX2JhbmQsIGludCB0cmFuX29mZiwgaW50IGFkZFByZXZTYW1wbGVzKSB7CiAgIEZJWFBfREJMIGlfdGhyZXM7Ci0gIENfQUxMT0NfU0NSQVRDSF9TVEFSVChFbmVyZ2llc1RlbXAsIEZJWFBfREJMLCAyKlFNRl9NQVhfVElNRV9TTE9UUyk7Ci0gIEZJWFBfREJMICpSRVNUUklDVCBwRW5lcmdpZXNUZW1wID0gRW5lcmdpZXNUZW1wOworICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQoRW5lcmdpZXNUZW1wLCBGSVhQX0RCTCwgMiAqIDMyKQogICBpbnQgdG1wU2NhbGVFbmVyZ2llczAsIHRtcFNjYWxlRW5lcmdpZXMxOwogICBpbnQgZW5kQ29uZDsKLSAgaW50IHN0YXJ0RW5lcmcsZW5kRW5lcmc7Ci0gIGludCBpLGosakluZGV4LGpwQk07CisgIGludCBzdGFydEVuZXJnLCBlbmRFbmVyZzsKKyAgaW50IGksIGosIGpJbmRleCwganBCTTsKIAogICB0bXBTY2FsZUVuZXJnaWVzMCA9IHNjYWxlRW5lcmdpZXNbMF07CiAgIHRtcFNjYWxlRW5lcmdpZXMxID0gc2NhbGVFbmVyZ2llc1sxXTsKQEAgLTU3MSwyMzcgKzU3MSwyMjcgQEAKICAgRkRLX0FTU0VSVCgodG1wU2NhbGVFbmVyZ2llczAgPj0gMCkgJiYgKHRtcFNjYWxlRW5lcmdpZXMxID49IDApKTsKIAogICAvKiBLZWVwIGFkZFByZXZTYW1wbGVzIGV4dHJhIHByZXZpb3VzIHRyYW5zaWVudCBjYW5kaWRhdGVzLiAqLwotICBGREttZW1tb3ZlKHRyYW5zaWVudHMsIHRyYW5zaWVudHMgKyBub0NvbHMgLSBhZGRQcmV2U2FtcGxlcywgKHRyYW5fb2ZmK2FkZFByZXZTYW1wbGVzKSAqIHNpemVvZiAoRklYUF9EQkwpKTsKLSAgRkRLbWVtY2xlYXIodHJhbnNpZW50cyArIHRyYW5fb2ZmICsgYWRkUHJldlNhbXBsZXMsIG5vQ29scyAqIHNpemVvZiAoRklYUF9EQkwpKTsKKyAgRkRLbWVtbW92ZSh0cmFuc2llbnRzLCB0cmFuc2llbnRzICsgbm9Db2xzIC0gYWRkUHJldlNhbXBsZXMsCisgICAgICAgICAgICAgKHRyYW5fb2ZmICsgYWRkUHJldlNhbXBsZXMpICogc2l6ZW9mKEZJWFBfREJMKSk7CisgIEZES21lbWNsZWFyKHRyYW5zaWVudHMgKyB0cmFuX29mZiArIGFkZFByZXZTYW1wbGVzLAorICAgICAgICAgICAgICBub0NvbHMgKiBzaXplb2YoRklYUF9EQkwpKTsKIAogICBlbmRDb25kID0gbm9Db2xzOyAvKiBBbW91bnQgb2YgbmV3IHRyYW5zaWVudCB2YWx1ZXMgdG8gYmUgY2FsY3VsYXRlZC4gKi8KLSAgc3RhcnRFbmVyZyA9ICh0cmFuX29mZi0zKT4+WUJ1ZmZlclN6U2hpZnQ7IC8qID4+WUJ1ZmZlclN6U2hpZnQgYmVjYXVzZSBvZiBhbW91bnQgb2YgZW5lcmd5IHZhbHVlcy4gLTMgYmVjYXVzZSBvZiBuZWlnaGJvcnMgYmVpbmcgd2F0Y2hlZC4gKi8KLSAgZW5kRW5lcmcgPSAoKG5vQ29scysgKFlCdWZmZXJXcml0ZU9mZnNldDw8WUJ1ZmZlclN6U2hpZnQpKS0xKT4+WUJ1ZmZlclN6U2hpZnQ7IC8qIFlCdWZmZXJTelNoaWZ0IHNoaWZ0cyBiZWNhdXNlIG9mIGhhbGYgZW5lcmd5IHZhbHVlcy4gKi8KKyAgc3RhcnRFbmVyZyA9ICh0cmFuX29mZiAtIDMpID4+IFlCdWZmZXJTelNoaWZ0OyAvKiA+PllCdWZmZXJTelNoaWZ0IGJlY2F1c2Ugb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQgb2YgZW5lcmd5IHZhbHVlcy4gLTMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIG9mIG5laWdoYm9ycyBiZWluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoZWQuICovCisgIGVuZEVuZXJnID0KKyAgICAgICgobm9Db2xzICsgKFlCdWZmZXJXcml0ZU9mZnNldCA8PCBZQnVmZmVyU3pTaGlmdCkpIC0gMSkgPj4KKyAgICAgIFlCdWZmZXJTelNoaWZ0OyAvKiBZQnVmZmVyU3pTaGlmdCBzaGlmdHMgYmVjYXVzZSBvZiBoYWxmIGVuZXJneSB2YWx1ZXMuICovCiAKLSAgLyogQ29tcHV0ZSBkaWZmZXJlbnRpYWwgdmFsdWVzIHdpdGggdHdvIGRpZmZlcmVudCB3ZWlnaHRpbmdzIGluIGV2ZXJ5IHN1YmJhbmQgKi8KLSAgZm9yIChpPXN0YXJ0X2JhbmQ7IGk8c3RvcF9iYW5kOyBpKyspCi0gIHsKKyAgLyogQ29tcHV0ZSBkaWZmZXJlbnRpYWwgdmFsdWVzIHdpdGggdHdvIGRpZmZlcmVudCB3ZWlnaHRpbmdzIGluIGV2ZXJ5IHN1YmJhbmQKKyAgICovCisgIGZvciAoaSA9IHN0YXJ0X2JhbmQ7IGkgPCBzdG9wX2JhbmQ7IGkrKykgewogICAgIEZJWFBfREJMIHRocmVzID0gdGhyZXNob2xkc1tpXTsKIAotICAgIGlmKChMT05HKXRocmVzaG9sZHNbaV0+PTI1NikKLSAgICAgIGlfdGhyZXMgPSAoTE9ORykoIChMT05HKU1BWFZBTF9EQkwgLyAoKCgoTE9ORyl0aHJlc2hvbGRzW2ldKSkrMSkgKTw8KDMyLTI0KTsKKyAgICBpZiAoKExPTkcpdGhyZXNob2xkc1tpXSA+PSAyNTYpCisgICAgICBpX3RocmVzID0gKExPTkcpKChMT05HKU1BWFZBTF9EQkwgLyAoKCgoTE9ORyl0aHJlc2hvbGRzW2ldKSkgKyAxKSkKKyAgICAgICAgICAgICAgICA8PCAoMzIgLSAyNCk7CiAgICAgZWxzZQogICAgICAgaV90aHJlcyA9IChMT05HKU1BWFZBTF9EQkw7CiAKICAgICAvKiBDb3B5IG9uZSB0aW1lc2xvdCBhbmQgZGUtc2NhbGUgYW5kIGRlLXNxdWlzaCAqLwogICAgIGlmIChZQnVmZmVyU3pTaGlmdCA9PSAxKSB7Ci0gICAgICBmb3Ioaj1zdGFydEVuZXJnOyBqPFlCdWZmZXJXcml0ZU9mZnNldDsgaisrKSB7CisgICAgICBmb3IgKGogPSBzdGFydEVuZXJnOyBqIDwgWUJ1ZmZlcldyaXRlT2Zmc2V0OyBqKyspIHsKICAgICAgICAgRklYUF9EQkwgdG1wID0gRW5lcmdpZXNbal1baV07Ci0gICAgICAgIEVuZXJnaWVzVGVtcFsoajw8MSkrMV0gPSBFbmVyZ2llc1RlbXBbajw8MV0gPSB0bXA+PnRtcFNjYWxlRW5lcmdpZXMwOworICAgICAgICBFbmVyZ2llc1RlbXBbKGogPDwgMSkgKyAxXSA9IEVuZXJnaWVzVGVtcFtqIDw8IDFdID0KKyAgICAgICAgICAgIHRtcCA+PiB0bXBTY2FsZUVuZXJnaWVzMDsKICAgICAgIH0KLSAgICAgIGZvcig7IGo8PWVuZEVuZXJnOyBqKyspIHsKKyAgICAgIGZvciAoOyBqIDw9IGVuZEVuZXJnOyBqKyspIHsKICAgICAgICAgRklYUF9EQkwgdG1wID0gRW5lcmdpZXNbal1baV07Ci0gICAgICAgIEVuZXJnaWVzVGVtcFsoajw8MSkrMV0gPSBFbmVyZ2llc1RlbXBbajw8MV0gPSB0bXA+PnRtcFNjYWxlRW5lcmdpZXMxOworICAgICAgICBFbmVyZ2llc1RlbXBbKGogPDwgMSkgKyAxXSA9IEVuZXJnaWVzVGVtcFtqIDw8IDFdID0KKyAgICAgICAgICAgIHRtcCA+PiB0bXBTY2FsZUVuZXJnaWVzMTsKICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgZm9yKGo9c3RhcnRFbmVyZzsgajxZQnVmZmVyV3JpdGVPZmZzZXQ7IGorKykgeworICAgICAgZm9yIChqID0gc3RhcnRFbmVyZzsgaiA8IFlCdWZmZXJXcml0ZU9mZnNldDsgaisrKSB7CiAgICAgICAgIEZJWFBfREJMIHRtcCA9IEVuZXJnaWVzW2pdW2ldOwotICAgICAgICBFbmVyZ2llc1RlbXBbal0gPSB0bXA+PnRtcFNjYWxlRW5lcmdpZXMwOworICAgICAgICBFbmVyZ2llc1RlbXBbal0gPSB0bXAgPj4gdG1wU2NhbGVFbmVyZ2llczA7CiAgICAgICB9Ci0gICAgICBmb3IoOyBqPD1lbmRFbmVyZzsgaisrKSB7CisgICAgICBmb3IgKDsgaiA8PSBlbmRFbmVyZzsgaisrKSB7CiAgICAgICAgIEZJWFBfREJMIHRtcCA9IEVuZXJnaWVzW2pdW2ldOwotICAgICAgICBFbmVyZ2llc1RlbXBbal0gPSB0bXA+PnRtcFNjYWxlRW5lcmdpZXMxOworICAgICAgICBFbmVyZ2llc1RlbXBbal0gPSB0bXAgPj4gdG1wU2NhbGVFbmVyZ2llczE7CiAgICAgICB9CiAgICAgfQogCiAgICAgLyogRGV0ZWN0IHBlYWtzIGluIGVuZXJneSB2YWx1ZXMuICovCiAKICAgICBqSW5kZXggPSB0cmFuX29mZjsKLSAgICBqcEJNID0gakluZGV4K2FkZFByZXZTYW1wbGVzOworICAgIGpwQk0gPSBqSW5kZXggKyBhZGRQcmV2U2FtcGxlczsKIAotICAgIGZvciAoaj1lbmRDb25kOyBqLS07IGpJbmRleCsrLCBqcEJNKyspCi0gICAgewotCisgICAgZm9yIChqID0gZW5kQ29uZDsgai0tOyBqSW5kZXgrKywganBCTSsrKSB7CiAgICAgICBGSVhQX0RCTCBkZWx0YSwgdHJhbjsKICAgICAgIGludCBkOwogCiAgICAgICBkZWx0YSA9IChGSVhQX0RCTCkwOwotICAgICAgdHJhbiAgPSAoRklYUF9EQkwpMDsKKyAgICAgIHRyYW4gPSAoRklYUF9EQkwpMDsKIAotICAgICAgZm9yIChkPTE7IGQ8NDsgZCsrKSB7Ci0gICAgICAgIGRlbHRhICs9IHBFbmVyZ2llc1RlbXBbakluZGV4K2RdOyAvKiBSICovCi0gICAgICAgIGRlbHRhIC09IHBFbmVyZ2llc1RlbXBbakluZGV4LWRdOyAvKiBMICovCisgICAgICBmb3IgKGQgPSAxOyBkIDwgNDsgZCsrKSB7CisgICAgICAgIGRlbHRhICs9IEVuZXJnaWVzVGVtcFtqSW5kZXggKyBkXTsgLyogUiAqLworICAgICAgICBkZWx0YSAtPSBFbmVyZ2llc1RlbXBbakluZGV4IC0gZF07IC8qIEwgKi8KICAgICAgICAgZGVsdGEgLT0gdGhyZXM7CiAKLSAgICAgICAgaWYgKCBkZWx0YSA+IChGSVhQX0RCTCkwICkgewotICAgICAgICAgIHRyYW4gKz0gZk11bHQoaV90aHJlcywgZGVsdGEpOworICAgICAgICBpZiAoZGVsdGEgPiAoRklYUF9EQkwpMCkgeworICAgICAgICAgIHRyYW4gPSBmTXVsdEFkZERpdjIodHJhbiwgaV90aHJlcywgZGVsdGEpOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICB0cmFuc2llbnRzW2pwQk1dICs9IHRyYW47CisgICAgICB0cmFuc2llbnRzW2pwQk1dICs9ICh0cmFuIDw8IDEpOwogICAgIH0KICAgfQotICBDX0FMTE9DX1NDUkFUQ0hfRU5EKEVuZXJnaWVzVGVtcCwgRklYUF9EQkwsIDIqUU1GX01BWF9USU1FX1NMT1RTKTsKKyAgQ19BTExPQ19TQ1JBVENIX0VORChFbmVyZ2llc1RlbXAsIEZJWFBfREJMLCAyICogMzIpCiB9CiAKLXZvaWQKLUZES3NickVuY190cmFuc2llbnREZXRlY3QoSEFORExFX1NCUl9UUkFOU0lFTlRfREVURUNUT1IgaF9zYnJUcmFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKkVuZXJnaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNjYWxlRW5lcmdpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICp0cmFuc2llbnRfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFlCdWZmZXJXcml0ZU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFlCdWZmZXJTelNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZVN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZU1pZGRsZUJvcmRlcikKLXsKK3ZvaWQgRkRLc2JyRW5jX3RyYW5zaWVudERldGVjdChIQU5ETEVfU0JSX1RSQU5TSUVOVF9ERVRFQ1RPUiBoX3NiclRyYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipFbmVyZ2llcywgSU5UICpzY2FsZUVuZXJnaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICp0cmFuc2llbnRfaW5mbywgaW50IFlCdWZmZXJXcml0ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgWUJ1ZmZlclN6U2hpZnQsIGludCB0aW1lU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVNaWRkbGVCb3JkZXIpIHsKICAgaW50IG5vX2NvbHMgPSBoX3NiclRyYW4tPm5vX2NvbHM7CiAgIGludCBxbWZTdGFydFNhbXBsZTsKICAgaW50IGFkZFByZXZTYW1wbGVzOwotICBpbnQgdGltZVN0ZXBTaGlmdD0wOworICBpbnQgdGltZVN0ZXBTaGlmdCA9IDA7CiAgIGludCBpLCBjb25kOwogCiAgIC8qIFdoZXJlIHRvIHN0YXJ0IGxvb2tpbmcgZm9yIHRyYW5zaWVudHMgaW4gdGhlIHRyYW5zaWVudCBjYW5kaWRhdGUgYnVmZmVyICovCiAgIHFtZlN0YXJ0U2FtcGxlID0gdGltZVN0ZXAgKiBmcmFtZU1pZGRsZUJvcmRlcjsKLSAgLyogV2UgbmVlZCB0byBsb29rIG9uZSB2YWx1ZSBiYWNrd2FyZHMgaW4gdGhlIHRyYW5zaWVudHMsIHNvIHdlIG1pZ2h0IG5lZWQgb25lIG1vcmUgcHJldmlvdXMgdmFsdWUuICovCi0gIGFkZFByZXZTYW1wbGVzID0gKHFtZlN0YXJ0U2FtcGxlID4gMCkgPyAwOiAxOworICAvKiBXZSBuZWVkIHRvIGxvb2sgb25lIHZhbHVlIGJhY2t3YXJkcyBpbiB0aGUgdHJhbnNpZW50cywgc28gd2UgbWlnaHQgbmVlZCBvbmUKKyAgICogbW9yZSBwcmV2aW91cyB2YWx1ZS4gKi8KKyAgYWRkUHJldlNhbXBsZXMgPSAocW1mU3RhcnRTYW1wbGUgPiAwKSA/IDAgOiAxOwogCiAgIHN3aXRjaCAodGltZVN0ZXApIHsKLSAgICBjYXNlIDE6IHRpbWVTdGVwU2hpZnQgPSAwOyBicmVhazsKLSAgICBjYXNlIDI6IHRpbWVTdGVwU2hpZnQgPSAxOyBicmVhazsKLSAgICBjYXNlIDQ6IHRpbWVTdGVwU2hpZnQgPSAyOyBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICB0aW1lU3RlcFNoaWZ0ID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIHRpbWVTdGVwU2hpZnQgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgdGltZVN0ZXBTaGlmdCA9IDI7CisgICAgICBicmVhazsKICAgfQogCi0gIGNhbGN1bGF0ZVRocmVzaG9sZHMoRW5lcmdpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgc2NhbGVFbmVyZ2llcywKLSAgICAgICAgICAgICAgICAgICAgICBoX3NiclRyYW4tPnRocmVzaG9sZHMsCi0gICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlcldyaXRlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJTelNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgIGhfc2JyVHJhbi0+bm9fY29scywKLSAgICAgICAgICAgICAgICAgICAgICBoX3NiclRyYW4tPm5vX3Jvd3MsCi0gICAgICAgICAgICAgICAgICAgICAgaF9zYnJUcmFuLT50cmFuX29mZik7CisgIGNhbGN1bGF0ZVRocmVzaG9sZHMoRW5lcmdpZXMsIHNjYWxlRW5lcmdpZXMsIGhfc2JyVHJhbi0+dGhyZXNob2xkcywKKyAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyV3JpdGVPZmZzZXQsIFlCdWZmZXJTelNoaWZ0LCBoX3NiclRyYW4tPm5vX2NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgaF9zYnJUcmFuLT5ub19yb3dzLCBoX3NiclRyYW4tPnRyYW5fb2ZmKTsKIAotICBleHRyYWN0VHJhbnNpZW50Q2FuZGlkYXRlcyhFbmVyZ2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVFbmVyZ2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJUcmFuLT50aHJlc2hvbGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3NiclRyYW4tPnRyYW5zaWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJXcml0ZU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlclN6U2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfc2JyVHJhbi0+bm9fY29scywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9zYnJUcmFuLT5ub19yb3dzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3NiclRyYW4tPnRyYW5fb2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRQcmV2U2FtcGxlcyApOworICBleHRyYWN0VHJhbnNpZW50Q2FuZGlkYXRlcygKKyAgICAgIEVuZXJnaWVzLCBzY2FsZUVuZXJnaWVzLCBoX3NiclRyYW4tPnRocmVzaG9sZHMsIGhfc2JyVHJhbi0+dHJhbnNpZW50cywKKyAgICAgIFlCdWZmZXJXcml0ZU9mZnNldCwgWUJ1ZmZlclN6U2hpZnQsIGhfc2JyVHJhbi0+bm9fY29scywgMCwKKyAgICAgIGhfc2JyVHJhbi0+bm9fcm93cywgaF9zYnJUcmFuLT50cmFuX29mZiwgYWRkUHJldlNhbXBsZXMpOwogCiAgIHRyYW5zaWVudF9pbmZvWzBdID0gMDsKICAgdHJhbnNpZW50X2luZm9bMV0gPSAwOwogICB0cmFuc2llbnRfaW5mb1syXSA9IDA7CiAKLSAgLyogT2Zmc2V0IGJ5IHRoZSBhbW91bnQgb2YgYWRkaXRpb25hbCBwcmV2aW91cyB0cmFuc2llbnQgY2FuZGlkYXRlcyBiZWluZyBrZXB0LiAqLworICAvKiBPZmZzZXQgYnkgdGhlIGFtb3VudCBvZiBhZGRpdGlvbmFsIHByZXZpb3VzIHRyYW5zaWVudCBjYW5kaWRhdGVzIGJlaW5nCisgICAqIGtlcHQuICovCiAgIHFtZlN0YXJ0U2FtcGxlICs9IGFkZFByZXZTYW1wbGVzOwogCi0gIC8qIENoZWNrIGZvciB0cmFuc2llbnRzIGluIHNlY29uZCBncmFudWxlIChwaWNrIHRoZSBsYXN0IHZhbHVlIG9mIHN1YnNlcXVlbnQgdmFsdWVzKSAgKi8KLSAgZm9yIChpPXFtZlN0YXJ0U2FtcGxlOyBpPHFtZlN0YXJ0U2FtcGxlICsgbm9fY29sczsgaSsrKSB7Ci0gICAgY29uZCA9ICAgIChoX3NiclRyYW4tPnRyYW5zaWVudHNbaV0gPCBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjlmKSwgaF9zYnJUcmFuLT50cmFuc2llbnRzW2kgLSAxXSkgKQotICAgICAgICAgICAmJiAoaF9zYnJUcmFuLT50cmFuc2llbnRzW2kgLSAxXSA+IGhfc2JyVHJhbi0+dHJhbl90aHIpOworICAvKiBDaGVjayBmb3IgdHJhbnNpZW50cyBpbiBzZWNvbmQgZ3JhbnVsZSAocGljayB0aGUgbGFzdCB2YWx1ZSBvZiBzdWJzZXF1ZW50CisgICAqIHZhbHVlcykgICovCisgIGZvciAoaSA9IHFtZlN0YXJ0U2FtcGxlOyBpIDwgcW1mU3RhcnRTYW1wbGUgKyBub19jb2xzOyBpKyspIHsKKyAgICBjb25kID0gKGhfc2JyVHJhbi0+dHJhbnNpZW50c1tpXSA8CisgICAgICAgICAgICBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjlmKSwgaF9zYnJUcmFuLT50cmFuc2llbnRzW2kgLSAxXSkpICYmCisgICAgICAgICAgIChoX3NiclRyYW4tPnRyYW5zaWVudHNbaSAtIDFdID4gaF9zYnJUcmFuLT50cmFuX3Rocik7CiAKICAgICBpZiAoY29uZCkgewotICAgICAgdHJhbnNpZW50X2luZm9bMF0gPSAoaSAtIHFtZlN0YXJ0U2FtcGxlKT4+dGltZVN0ZXBTaGlmdDsKKyAgICAgIHRyYW5zaWVudF9pbmZvWzBdID0gKGkgLSBxbWZTdGFydFNhbXBsZSkgPj4gdGltZVN0ZXBTaGlmdDsKICAgICAgIHRyYW5zaWVudF9pbmZvWzFdID0gMTsKICAgICAgIGJyZWFrOwogICAgIH0KICAgfQogCi0gIGlmICggaF9zYnJUcmFuLT5mcmFtZVNoaWZ0ICE9IDApIHsKLSAgICAgIC8qIHRyYW5zaWVudCBwcmVkaWN0aW9uIGZvciBMRFNCUiAqLwotICAgICAgLyogQ2hlY2sgZm9yIHRyYW5zaWVudHMgaW4gZmlyc3QgPGZyYW1lU2hpZnQ+IHFtZi1zbG90cyBvZiBzZWNvbmQgZnJhbWUgKi8KLSAgICAgIGZvciAoaT1xbWZTdGFydFNhbXBsZStub19jb2xzOyBpPHFtZlN0YXJ0U2FtcGxlICsgbm9fY29scytoX3NiclRyYW4tPmZyYW1lU2hpZnQ7IGkrKykgeworICBpZiAoaF9zYnJUcmFuLT5mcmFtZVNoaWZ0ICE9IDApIHsKKyAgICAvKiB0cmFuc2llbnQgcHJlZGljdGlvbiBmb3IgTERTQlIgKi8KKyAgICAvKiBDaGVjayBmb3IgdHJhbnNpZW50cyBpbiBmaXJzdCA8ZnJhbWVTaGlmdD4gcW1mLXNsb3RzIG9mIHNlY29uZCBmcmFtZSAqLworICAgIGZvciAoaSA9IHFtZlN0YXJ0U2FtcGxlICsgbm9fY29sczsKKyAgICAgICAgIGkgPCBxbWZTdGFydFNhbXBsZSArIG5vX2NvbHMgKyBoX3NiclRyYW4tPmZyYW1lU2hpZnQ7IGkrKykgeworICAgICAgY29uZCA9IChoX3NiclRyYW4tPnRyYW5zaWVudHNbaV0gPAorICAgICAgICAgICAgICBmTXVsdChGTDJGWENPTlNUX0RCTCgwLjlmKSwgaF9zYnJUcmFuLT50cmFuc2llbnRzW2kgLSAxXSkpICYmCisgICAgICAgICAgICAgKGhfc2JyVHJhbi0+dHJhbnNpZW50c1tpIC0gMV0gPiBoX3NiclRyYW4tPnRyYW5fdGhyKTsKIAotICAgICAgICBjb25kID0gICAgKGhfc2JyVHJhbi0+dHJhbnNpZW50c1tpXSA8IGZNdWx0KEZMMkZYQ09OU1RfREJMKDAuOWYpLCBoX3NiclRyYW4tPnRyYW5zaWVudHNbaSAtIDFdKSApCi0gICAgICAgICAgICAgICAmJiAoaF9zYnJUcmFuLT50cmFuc2llbnRzW2kgLSAxXSA+IGhfc2JyVHJhbi0+dHJhbl90aHIpOwotCi0gICAgICAgIGlmIChjb25kKSB7Ci0gICAgICAgICAgaW50IHBvcyA9IChpbnQpICggKGkgLSBxbWZTdGFydFNhbXBsZS1ub19jb2xzKSA+PiB0aW1lU3RlcFNoaWZ0ICk7Ci0gICAgICAgICAgaWYgKChwb3MgPCAzKSAmJiAodHJhbnNpZW50X2luZm9bMV09PTApKSB7Ci0gICAgICAgICAgICB0cmFuc2llbnRfaW5mb1syXSA9IDE7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOworICAgICAgaWYgKGNvbmQpIHsKKyAgICAgICAgaW50IHBvcyA9IChpbnQpKChpIC0gcW1mU3RhcnRTYW1wbGUgLSBub19jb2xzKSA+PiB0aW1lU3RlcFNoaWZ0KTsKKyAgICAgICAgaWYgKChwb3MgPCAzKSAmJiAodHJhbnNpZW50X2luZm9bMV0gPT0gMCkpIHsKKyAgICAgICAgICB0cmFuc2llbnRfaW5mb1syXSA9IDE7CiAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgICB9CisgICAgfQogICB9CiB9CiAKLWludAotRkRLc2JyRW5jX0luaXRTYnJUcmFuc2llbnREZXRlY3RvcihIQU5ETEVfU0JSX1RSQU5TSUVOVF9ERVRFQ1RPUiBoX3NiclRyYW5zaWVudERldGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICBzYnJTeW50YXhGbGFncywgLyogU0JSIHN5bnRheCBmbGFncyBkZXJpdmVkIGZyb20gQU9ULiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBmcmFtZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIHNhbXBsZUZyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ3VyYXRpb25QdHIgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICB0cmFuX2ZjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBub19jb2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBub19yb3dzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBZQnVmZmVyV3JpdGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIFlCdWZmZXJTelNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBmcmFtZVNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICB0cmFuX29mZikKLXsKLSAgICBJTlQgdG90YWxCaXRyYXRlID0gcGFyYW1zLT5jb2RlY1NldHRpbmdzLnN0YW5kYXJkQml0cmF0ZSAqIHBhcmFtcy0+Y29kZWNTZXR0aW5ncy5uQ2hhbm5lbHM7Ci0gICAgSU5UIGNvZGVjQml0cmF0ZSA9IHBhcmFtcy0+Y29kZWNTZXR0aW5ncy5iaXRSYXRlOwotICAgIEZJWFBfREJMIGJpdHJhdGVGYWN0b3JfbSwgZnJhbWVkdXJfZml4OwotICAgIElOVCBiaXRyYXRlRmFjdG9yX2UsIHRtcF9lOworaW50IEZES3NickVuY19Jbml0U2JyVHJhbnNpZW50RGV0ZWN0b3IoCisgICAgSEFORExFX1NCUl9UUkFOU0lFTlRfREVURUNUT1IgaF9zYnJUcmFuc2llbnREZXRlY3RvciwKKyAgICBVSU5UIHNiclN5bnRheEZsYWdzLCAvKiBTQlIgc3ludGF4IGZsYWdzIGRlcml2ZWQgZnJvbSBBT1QuICovCisgICAgSU5UIGZyYW1lU2l6ZSwgSU5UIHNhbXBsZUZyZXEsIHNickNvbmZpZ3VyYXRpb25QdHIgcGFyYW1zLCBpbnQgdHJhbl9mYywKKyAgICBpbnQgbm9fY29scywgaW50IG5vX3Jvd3MsIGludCBZQnVmZmVyV3JpdGVPZmZzZXQsIGludCBZQnVmZmVyU3pTaGlmdCwKKyAgICBpbnQgZnJhbWVTaGlmdCwgaW50IHRyYW5fb2ZmKSB7CisgIElOVCB0b3RhbEJpdHJhdGUgPQorICAgICAgcGFyYW1zLT5jb2RlY1NldHRpbmdzLnN0YW5kYXJkQml0cmF0ZSAqIHBhcmFtcy0+Y29kZWNTZXR0aW5ncy5uQ2hhbm5lbHM7CisgIElOVCBjb2RlY0JpdHJhdGUgPSBwYXJhbXMtPmNvZGVjU2V0dGluZ3MuYml0UmF0ZTsKKyAgRklYUF9EQkwgYml0cmF0ZUZhY3Rvcl9tLCBmcmFtZWR1cl9maXg7CisgIElOVCBiaXRyYXRlRmFjdG9yX2UsIHRtcF9lOwogCi0gICAgRkRLbWVtY2xlYXIoaF9zYnJUcmFuc2llbnREZXRlY3RvcixzaXplb2YoU0JSX1RSQU5TSUVOVF9ERVRFQ1RPUikpOworICBGREttZW1jbGVhcihoX3NiclRyYW5zaWVudERldGVjdG9yLCBzaXplb2YoU0JSX1RSQU5TSUVOVF9ERVRFQ1RPUikpOwogCi0gICAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+ZnJhbWVTaGlmdCA9IGZyYW1lU2hpZnQ7Ci0gICAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+dHJhbl9vZmYgPSB0cmFuX29mZjsKKyAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+ZnJhbWVTaGlmdCA9IGZyYW1lU2hpZnQ7CisgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnRyYW5fb2ZmID0gdHJhbl9vZmY7CiAKLSAgICBpZihjb2RlY0JpdHJhdGUpIHsKLSAgICAgIGJpdHJhdGVGYWN0b3JfbSA9IGZEaXZOb3JtKChGSVhQX0RCTCl0b3RhbEJpdHJhdGUsIChGSVhQX0RCTCkoY29kZWNCaXRyYXRlPDwyKSwmYml0cmF0ZUZhY3Rvcl9lKTsKLSAgICAgIGJpdHJhdGVGYWN0b3JfZSArPSAyOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGJpdHJhdGVGYWN0b3JfbSA9IEZMMkZYQ09OU1RfREJMKDEuMC80LjApOwotICAgICAgYml0cmF0ZUZhY3Rvcl9lID0gMjsKLSAgICB9CisgIGlmIChjb2RlY0JpdHJhdGUpIHsKKyAgICBiaXRyYXRlRmFjdG9yX20gPSBmRGl2Tm9ybSgoRklYUF9EQkwpdG90YWxCaXRyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoY29kZWNCaXRyYXRlIDw8IDIpLCAmYml0cmF0ZUZhY3Rvcl9lKTsKKyAgICBiaXRyYXRlRmFjdG9yX2UgKz0gMjsKKyAgfSBlbHNlIHsKKyAgICBiaXRyYXRlRmFjdG9yX20gPSBGTDJGWENPTlNUX0RCTCgxLjAgLyA0LjApOworICAgIGJpdHJhdGVGYWN0b3JfZSA9IDI7CisgIH0KIAotICAgIGZyYW1lZHVyX2ZpeCA9IGZEaXZOb3JtKGZyYW1lU2l6ZSwgc2FtcGxlRnJlcSk7CisgIGZyYW1lZHVyX2ZpeCA9IGZEaXZOb3JtKGZyYW1lU2l6ZSwgc2FtcGxlRnJlcSk7CiAKLSAgICAvKiBUaGUgbG9uZ2VyIHRoZSBmcmFtZXMsIHRoZSBtb3JlIG9mdGVuIHNob3VsZCB0aGUgRklYRklYLQotICAgIGNhc2UgdHJhbnNtaXQgMiBlbnZlbG9wZXMgaW5zdGVhZCBvZiAxLgotICAgIEZyYW1lIGR1cmF0aW9ucyBiZWxvdyAxMCBtcyBwcm9kdWNlIHRoZSBoaWdoZXN0IHRocmVzaG9sZAotICAgIHNvIHRoYXQgcHJhY3RpY2FsbHkgYWx3YXlzIG9ubHkgMSBlbnYgaXMgdHJhbnNtaXR0ZWQuICovCi0gICAgRklYUF9EQkwgdG1wID0gZnJhbWVkdXJfZml4IC0gRkwyRlhDT05TVF9EQkwoMC4wMTApOworICAvKiBUaGUgbG9uZ2VyIHRoZSBmcmFtZXMsIHRoZSBtb3JlIG9mdGVuIHNob3VsZCB0aGUgRklYRklYLQorICBjYXNlIHRyYW5zbWl0IDIgZW52ZWxvcGVzIGluc3RlYWQgb2YgMS4KKyAgRnJhbWUgZHVyYXRpb25zIGJlbG93IDEwIG1zIHByb2R1Y2UgdGhlIGhpZ2hlc3QgdGhyZXNob2xkCisgIHNvIHRoYXQgcHJhY3RpY2FsbHkgYWx3YXlzIG9ubHkgMSBlbnYgaXMgdHJhbnNtaXR0ZWQuICovCisgIEZJWFBfREJMIHRtcCA9IGZyYW1lZHVyX2ZpeCAtIEZMMkZYQ09OU1RfREJMKDAuMDEwKTsKIAotICAgIHRtcCA9IGZpeE1heCh0bXAsIEZMMkZYQ09OU1RfREJMKDAuMDAwMSkpOwotICAgIHRtcCA9IGZEaXZOb3JtKEZMMkZYQ09OU1RfREJMKDAuMDAwMDc1KSwgZlBvdzIodG1wKSwgJnRtcF9lKTsKKyAgdG1wID0gZml4TWF4KHRtcCwgRkwyRlhDT05TVF9EQkwoMC4wMDAxKSk7CisgIHRtcCA9IGZEaXZOb3JtKEZMMkZYQ09OU1RfREJMKDAuMDAwMDc1KSwgZlBvdzIodG1wKSwgJnRtcF9lKTsKIAotICAgIGJpdHJhdGVGYWN0b3JfZSA9ICh0bXBfZSArIGJpdHJhdGVGYWN0b3JfZSk7CisgIGJpdHJhdGVGYWN0b3JfZSA9ICh0bXBfZSArIGJpdHJhdGVGYWN0b3JfZSk7CiAKLSAgaWYoc2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgeworICBpZiAoc2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgewogICAgIGJpdHJhdGVGYWN0b3JfZS0tOyAvKiBkaXZpZGUgYnkgMiAqLwogICB9CiAKLSAgICBGREtfQVNTRVJUKG5vX2NvbHMgPD0gUU1GX01BWF9USU1FX1NMT1RTKTsKLSAgICBGREtfQVNTRVJUKG5vX3Jvd3MgPD0gUU1GX0NIQU5ORUxTKTsKKyAgRkRLX0FTU0VSVChub19jb2xzIDw9IDMyKTsKKyAgRkRLX0FTU0VSVChub19yb3dzIDw9IDY0KTsKIAotICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPm5vX2NvbHMgPSBub19jb2xzOwotICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnRyYW5fdGhyID0gKEZJWFBfREJMKSgocGFyYW1zLT50cmFuX3RociA8PCAoMzItMjQtMSkpIC8gbm9fcm93cyk7Ci0gICAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+dHJhbl9mYyA9IHRyYW5fZmM7Ci0gICAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+c3BsaXRfdGhyX20gPSBmTXVsdCh0bXAsIGJpdHJhdGVGYWN0b3JfbSk7Ci0gICAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+c3BsaXRfdGhyX2UgPSBiaXRyYXRlRmFjdG9yX2U7Ci0gICAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+bm9fcm93cyA9IG5vX3Jvd3M7Ci0gICAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+bW9kZSA9IHBhcmFtcy0+dHJhbl9kZXRfbW9kZTsKLSAgICBoX3NiclRyYW5zaWVudERldGVjdG9yLT5wcmV2TG93QmFuZEVuZXJneSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICBoX3NiclRyYW5zaWVudERldGVjdG9yLT5ub19jb2xzID0gbm9fY29sczsKKyAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+dHJhbl90aHIgPQorICAgICAgKEZJWFBfREJMKSgocGFyYW1zLT50cmFuX3RociA8PCAoMzIgLSAyNCAtIDEpKSAvIG5vX3Jvd3MpOworICBoX3NiclRyYW5zaWVudERldGVjdG9yLT50cmFuX2ZjID0gdHJhbl9mYzsKKyAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+c3BsaXRfdGhyX20gPSBmTXVsdCh0bXAsIGJpdHJhdGVGYWN0b3JfbSk7CisgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnNwbGl0X3Rocl9lID0gYml0cmF0ZUZhY3Rvcl9lOworICBoX3NiclRyYW5zaWVudERldGVjdG9yLT5ub19yb3dzID0gbm9fcm93czsKKyAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+bW9kZSA9IHBhcmFtcy0+dHJhbl9kZXRfbW9kZTsKKyAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+cHJldkxvd0JhbmRFbmVyZ3kgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKIAotICAgIHJldHVybiAoMCk7CisgIHJldHVybiAoMCk7CiB9CiAKLQogI2RlZmluZSBFTkVSR1lfU0NBTElOR19TSVpFIDMyCiAKIElOVCBGREtzYnJFbmNfSW5pdFNickZhc3RUcmFuc2llbnREZXRlY3RvcigKLSAgICAgICAgSEFORExFX0ZBU1RfVFJBTl9ERVQgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3IsCi0gICAgICAgIGNvbnN0IElOVCB0aW1lX3Nsb3RzX3Blcl9mcmFtZSwKLSAgICAgICAgY29uc3QgSU5UIGJhbmR3aWR0aF9xbWZfc2xvdCwKLSAgICAgICAgY29uc3QgSU5UIG5vX3FtZl9jaGFubmVscywKLSAgICAgICAgY29uc3QgSU5UIHNicl9xbWZfMXN0X2JhbmQKLSAgICAgICAgKQotewotCi0gIGludCBpLCBlOworICAgIEhBTkRMRV9GQVNUX1RSQU5fREVUIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLAorICAgIGNvbnN0IElOVCB0aW1lX3Nsb3RzX3Blcl9mcmFtZSwgY29uc3QgSU5UIGJhbmR3aWR0aF9xbWZfc2xvdCwKKyAgICBjb25zdCBJTlQgbm9fcW1mX2NoYW5uZWxzLCBjb25zdCBJTlQgc2JyX3FtZl8xc3RfYmFuZCkgeworICBpbnQgaTsKICAgaW50IGJ1ZmZfc2l6ZTsKICAgRklYUF9EQkwgbXlFeHA7CiAgIEZJWFBfREJMIG15RXhwU2xvdDsKQEAgLTgwOSw5ICs3OTksMTAgQEAKICAgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmxvb2thaGVhZCA9IFRSQU5fREVUX0xPT0tBSEVBRDsKICAgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPm5UaW1lU2xvdHMgPSB0aW1lX3Nsb3RzX3Blcl9mcmFtZTsKIAotICBidWZmX3NpemUgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+blRpbWVTbG90cyArIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5sb29rYWhlYWQ7CisgIGJ1ZmZfc2l6ZSA9IGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5uVGltZVNsb3RzICsKKyAgICAgICAgICAgICAgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmxvb2thaGVhZDsKIAotICBmb3IoaT0wOyBpPCBidWZmX3NpemU7IGkrKykgeworICBmb3IgKGkgPSAwOyBpIDwgYnVmZl9zaXplOyBpKyspIHsKICAgICBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+ZGVsdGFfZW5lcmd5W2ldID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICAgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmVuZXJneV90aW1lU2xvdHNbaV0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+bG93cGFzc19lbmVyZ3lbaV0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKQEAgLTgxOSw3NyArODEwLDkyIEBACiAgIH0KIAogICBGREtfQVNTRVJUKGJhbmR3aWR0aF9xbWZfc2xvdCA+IDAuZik7Ci0gIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdG9wQmFuZCAgPSBmTWluKFRSQU5fREVUX1NUT1BfRlJFUS9iYW5kd2lkdGhfcW1mX3Nsb3QsIG5vX3FtZl9jaGFubmVscyk7Ci0gIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdGFydEJhbmQgPSBmTWluKHNicl9xbWZfMXN0X2JhbmQsIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdG9wQmFuZCAtIFRSQU5fREVUX01JTl9RTUZCQU5EUyk7CisgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdG9wQmFuZCA9CisgICAgICBmTWluKFRSQU5fREVUX1NUT1BfRlJFUSAvIGJhbmR3aWR0aF9xbWZfc2xvdCwgbm9fcW1mX2NoYW5uZWxzKTsKKyAgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0YXJ0QmFuZCA9CisgICAgICBmTWluKHNicl9xbWZfMXN0X2JhbmQsCisgICAgICAgICAgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdG9wQmFuZCAtIFRSQU5fREVUX01JTl9RTUZCQU5EUyk7CiAKICAgRkRLX0FTU0VSVChoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RhcnRCYW5kIDwgbm9fcW1mX2NoYW5uZWxzKTsKLSAgRkRLX0FTU0VSVChoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RhcnRCYW5kIDwgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0b3BCYW5kKTsKKyAgRkRLX0FTU0VSVChoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RhcnRCYW5kIDwKKyAgICAgICAgICAgICBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RvcEJhbmQpOwogICBGREtfQVNTRVJUKGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdGFydEJhbmQgPiAxKTsKICAgRkRLX0FTU0VSVChoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RvcEJhbmQgPiAxKTsKIAogICAvKiB0aGUgZW5lcmd5IHdlaWdodGluZyBhbmQgYWRkaW5nIHVwIGhhcyBhIGhlYWRyb29tIG9mIDYgQml0cywKICAgICAgc28gdXAgdG8gNjQgYmFuZHMgY2FuIGJlIGFkZGVkIHdpdGhvdXQgcG90ZW50aWFsIG92ZXJmbG93LiAqLwotICBGREtfQVNTRVJUKGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdG9wQmFuZCAtIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdGFydEJhbmQgPD0gNjQpOworICBGREtfQVNTRVJUKGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdG9wQmFuZCAtCisgICAgICAgICAgICAgICAgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdGFydEJhbmQgPD0KKyAgICAgICAgICAgICA2NCk7CiAKLSAgLyogUU1GX0hQX2RCX1NMT1BFX0ZJWCBzYXlzIHRoYXQgd2Ugd2FudCBhIDIwIGRCIHBlciAxNiBrSHogSFAgZmlsdGVyLgotICAgICBUaGUgZm9sbG93aW5nIGxpbmVzIG1hcCB0aGlzIHRvIHRoZSBRTUYgYmFuZHdpZHRoLiAqLwotICAjZGVmaW5lIEVYUF9FIDcgLyogUU1GX0NIQU5ORUxTICg9NjQpIG11bHRpcGxpY2F0aW9ucyBtYXgsIG1heC4gYWxsb3dlZCBzdW0gaXMgMC41ICovCi0gIG15RXhwID0gZk11bHROb3JtKFFNRl9IUF9kQmRfU0xPUEVfRklYLCAoRklYUF9EQkwpYmFuZHdpZHRoX3FtZl9zbG90LCAmZSk7Ci0gIG15RXhwID0gc2NhbGVWYWx1ZVNhdHVyYXRlKG15RXhwLCBlKzArREZSQUNUX0JJVFMtMS1FWFBfRSk7CisvKiBRTUZfSFBfZEJfU0xPUEVfRklYIHNheXMgdGhhdCB3ZSB3YW50IGEgMjAgZEIgcGVyIDE2IGtIeiBIUCBmaWx0ZXIuCisgICBUaGUgZm9sbG93aW5nIGxpbmVzIG1hcCB0aGlzIHRvIHRoZSBRTUYgYmFuZHdpZHRoLiAqLworI2RlZmluZSBFWFBfRSA3IC8qIDY0ICg9NjQpIG11bHRpcGxpY2F0aW9ucyBtYXgsIG1heC4gYWxsb3dlZCBzdW0gaXMgMC41ICovCisgIG15RXhwID0gZk11bHROb3JtKFFNRl9IUF9kQmRfU0xPUEVfRklYLCAwLCAoRklYUF9EQkwpYmFuZHdpZHRoX3FtZl9zbG90LAorICAgICAgICAgICAgICAgICAgICBERlJBQ1RfQklUUyAtIDEsIEVYUF9FKTsKICAgbXlFeHBTbG90ID0gbXlFeHA7CiAKLSAgZm9yKGk9MDsgaTxRTUZfQ0hBTk5FTFM7IGkrKyl7CisgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CiAgICAgLyogQ2FsY3VsYXRlIGRCZiBvdmVyIGFsbCBxbWYgYmFuZHM6CiAgICAgICAgZEJmID0gKDEwXigwLjAwMjI2NmYvMTAqYncoc2xvdCkpKV4oYmFuZCkgPQogICAgICAgICAgICA9IDJeKGxvZzIoMTApKjAuMDAyMjY2Zi8xMCpidyhzbG90KSpiYW5kKSA9CiAgICAgICAgICAgID0gMl4oMC4wMDA3NTI3NWYqYncoc2xvdCkqYmFuZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLSAgICBGSVhQX0RCTCBkQmZfbTsgICAgICAgIC8qIGRCZiBtYW50aXNzYSAgICAgICAgKi8KLSAgICBJTlQgZEJmX2U7ICAgICAgICAgICAgIC8qIGRCZiBleHBvbmVudCAgICAgICAgKi8KKyAgICBGSVhQX0RCTCBkQmZfbTsgLyogZEJmIG1hbnRpc3NhICAgICAgICAqLworICAgIElOVCBkQmZfZTsgICAgICAvKiBkQmYgZXhwb25lbnQgICAgICAgICovCiAgICAgSU5UIHRtcDsKIAotICAgIElOVCBkQmZfaW50OyAgICAgICAgICAgLyogZEJmIGludGVnZXIgcGFydCAgICAqLwotICAgIEZJWFBfREJMIGRCZl9mcmFjdDsgICAgLyogZEJmIGZyYWN0aW9uYWwgcGFydCAqLworICAgIElOVCBkQmZfaW50OyAgICAgICAgLyogZEJmIGludGVnZXIgcGFydCAgICAqLworICAgIEZJWFBfREJMIGRCZl9mcmFjdDsgLyogZEJmIGZyYWN0aW9uYWwgcGFydCAqLwogCiAgICAgLyogbXlFeHAqKGkrMSkgPSBteUV4cF9pbnQgLSBteUV4cF9mcmFjdAogICAgICAgIG15RXhwKihpKzEpIGlzIHNwbGl0IHVwIGhlcmUgZm9yIGJldHRlciBhY2N1cmFjeSBvZiBDYWxjSW52TGREYXRhKCksCiAgICAgICAgZm9yIGl0cyByZXN1bHQgY2FuIGJlIHNwbGl0IHVwIGludG8gYW4gaW50ZWdlciBhbmQgYSBmcmFjdGlvbmFsIHBhcnQgKi8KIAogICAgIC8qIFJvdW5kIHVwIHRvIG5leHQgaW50ZWdlciAqLwotICAgIEZJWFBfREJMIG15RXhwX2ludCAgID0gKG15RXhwU2xvdCAmIChGSVhQX0RCTCkweGZlMDAwMDAwKSArIChGSVhQX0RCTCkweDAyMDAwMDAwOworICAgIEZJWFBfREJMIG15RXhwX2ludCA9CisgICAgICAgIChteUV4cFNsb3QgJiAoRklYUF9EQkwpMHhmZTAwMDAwMCkgKyAoRklYUF9EQkwpMHgwMjAwMDAwMDsKIAogICAgIC8qIFRoaXMgaXMgdGhlIGZyYWN0aW9uYWwgcGFydCB0aGF0IG5lZWRzIHRvIGJlIHN1YnN0cmFjdGVkICovCiAgICAgRklYUF9EQkwgbXlFeHBfZnJhY3QgPSBteUV4cF9pbnQgLSBteUV4cFNsb3Q7CiAKICAgICAvKiBDYWxjIGludGVnZXIgcGFydCAqLwotICAgIGRCZl9pbnQgICA9IENhbGNJbnZMZERhdGEobXlFeHBfaW50KTsKLSAgICAvKiBUaGUgcmVzdWx0IG5lZWRzIHRvIGJlIHJlLXNjYWxlZC4gVGhlIGxkKG15RXhwX2ludCkgaGFkIGJlZW4gc2NhbGVkIGJ5IEVYUF9FLAotICAgICAgIHRoZSBDYWxjSW52TGREYXRhIGV4cGVjdHMgdGhlIG9wZXJhbmQgdG8gYmUgc2NhbGVkIGJ5IExEX0RBVEFfU0hJRlQuCi0gICAgICAgVGhlcmVmb3JlLCB0aGUgY29ycmVjdGx5IHNjYWxlZCByZXN1bHQgaXMgZEJmX2ludF4oMl4oRVhQX0UtTERfREFUQV9TSElGVCkpLAotICAgICAgIHdoaWNoIGlzIGRCZl9pbnReMiAqLwotICAgIGRCZl9pbnQgICo9IGRCZl9pbnQ7CisgICAgZEJmX2ludCA9IENhbGNJbnZMZERhdGEobXlFeHBfaW50KTsKKyAgICAvKiBUaGUgcmVzdWx0IG5lZWRzIHRvIGJlIHJlLXNjYWxlZC4gVGhlIGxkKG15RXhwX2ludCkgaGFkIGJlZW4gc2NhbGVkIGJ5CisgICAgICAgRVhQX0UsIHRoZSBDYWxjSW52TGREYXRhIGV4cGVjdHMgdGhlIG9wZXJhbmQgdG8gYmUgc2NhbGVkIGJ5CisgICAgICAgTERfREFUQV9TSElGVC4gVGhlcmVmb3JlLCB0aGUgY29ycmVjdGx5IHNjYWxlZCByZXN1bHQgaXMKKyAgICAgICBkQmZfaW50XigyXihFWFBfRS1MRF9EQVRBX1NISUZUKSksIHdoaWNoIGlzIGRCZl9pbnReMiAqLwogCi0gICAgLyogQ2FsYyBmcmFjdGlvbmFsIHBhcnQgKi8KLSAgICBkQmZfZnJhY3QgPSBDYWxjSW52TGREYXRhKC1teUV4cF9mcmFjdCk7Ci0gICAgLyogVGhlIHJlc3VsdCBuZWVkcyB0byBiZSByZS1zY2FsZWQuIFRoZSBsZChteUV4cF9mcmFjdCkgaGFkIGJlZW4gc2NhbGVkIGJ5IEVYUF9FLAotICAgICAgIHRoZSBDYWxjSW52TGREYXRhIGV4cGVjdHMgdGhlIG9wZXJhbmQgdG8gYmUgc2NhbGVkIGJ5IExEX0RBVEFfU0hJRlQuCi0gICAgICAgVGhlcmVmb3JlLCB0aGUgY29ycmVjdGx5IHNjYWxlZCByZXN1bHQgaXMgZEJmX2ZyYWN0XigyXihFWFBfRS1MRF9EQVRBX1NISUZUKSksCi0gICAgICAgd2hpY2ggaXMgZEJmX2ZyYWN0XjIgKi8KLSAgICBkQmZfZnJhY3QgPSBmTXVsdE5vcm0oZEJmX2ZyYWN0LCBkQmZfZnJhY3QsICZ0bXApOworICAgIGlmIChkQmZfaW50IDw9CisgICAgICAgIDQ2MzQwKSB7IC8qIGNvbXBhcmUgd2l0aCBtYXhpbXVtIGFsbG93ZWQgdmFsdWUgZm9yIHNpZ25lZCBpbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgIG11bHRpcGxpY2F0aW9uLCA0NjM0MCA9CisgICAgICAgICAgICAgICAgICAgIChJTlQpZmxvb3Ioc3FydCgoZG91YmxlKSgoKFVJTlQpMTw8KERGUkFDVF9CSVRTLTEpKS0xKSkpICovCisgICAgICBkQmZfaW50ICo9IGRCZl9pbnQ7CiAKLSAgICAvKiBHZXQgd29yc3QgY2FzZSBzY2FsaW5nIG9mIG11bHRpcGxpY2F0aW9uIHJlc3VsdCAqLwotICAgIGRCZl9lID0gKERGUkFDVF9CSVRTLTEgLSB0bXApIC0gQ291bnRMZWFkaW5nQml0cyhkQmZfaW50KTsKKyAgICAgIC8qIENhbGMgZnJhY3Rpb25hbCBwYXJ0ICovCisgICAgICBkQmZfZnJhY3QgPSBDYWxjSW52TGREYXRhKC1teUV4cF9mcmFjdCk7CisgICAgICAvKiBUaGUgcmVzdWx0IG5lZWRzIHRvIGJlIHJlLXNjYWxlZC4gVGhlIGxkKG15RXhwX2ZyYWN0KSBoYWQgYmVlbiBzY2FsZWQKKyAgICAgICAgIGJ5IEVYUF9FLCB0aGUgQ2FsY0ludkxkRGF0YSBleHBlY3RzIHRoZSBvcGVyYW5kIHRvIGJlIHNjYWxlZCBieQorICAgICAgICAgTERfREFUQV9TSElGVC4gVGhlcmVmb3JlLCB0aGUgY29ycmVjdGx5IHNjYWxlZCByZXN1bHQgaXMKKyAgICAgICAgIGRCZl9mcmFjdF4oMl4oRVhQX0UtTERfREFUQV9TSElGVCkpLCB3aGljaCBpcyBkQmZfZnJhY3ReMiAqLworICAgICAgZEJmX2ZyYWN0ID0gZk11bHROb3JtKGRCZl9mcmFjdCwgZEJmX2ZyYWN0LCAmdG1wKTsKIAotICAgIC8qIE5vdyBtdWx0aXBseSBpbnRlZ2VyIHdpdGggZnJhY3Rpb25hbCBwYXJ0IG9mIHRoZSByZXN1bHQsIHRodXMgcmVzdWx0aW5nCi0gICAgICAgaW4gdGhlIG92ZXJhbGwgYWNjdXJhdGUgZnJhY3Rpb25hbCByZXN1bHQgKi8KLSAgICBkQmZfbSA9IGZNdWx0Tm9ybShkQmZfaW50LCBkQmZfZnJhY3QsICZlKTsKLSAgICBkQmZfbSA9IHNjYWxlVmFsdWVTYXR1cmF0ZShkQmZfbSwgZStERlJBQ1RfQklUUy0xK3RtcC1kQmZfZSk7Ci0gICAgbXlFeHBTbG90ICs9IG15RXhwOworICAgICAgLyogR2V0IHdvcnN0IGNhc2Ugc2NhbGluZyBvZiBtdWx0aXBsaWNhdGlvbiByZXN1bHQgKi8KKyAgICAgIGRCZl9lID0gKERGUkFDVF9CSVRTIC0gMSAtIHRtcCkgLSBDb3VudExlYWRpbmdCaXRzKGRCZl9pbnQpOworCisgICAgICAvKiBOb3cgbXVsdGlwbHkgaW50ZWdlciB3aXRoIGZyYWN0aW9uYWwgcGFydCBvZiB0aGUgcmVzdWx0LCB0aHVzIHJlc3VsdGluZworICAgICAgICAgaW4gdGhlIG92ZXJhbGwgYWNjdXJhdGUgZnJhY3Rpb25hbCByZXN1bHQgKi8KKyAgICAgIGRCZl9tID0gZk11bHROb3JtKGRCZl9pbnQsIERGUkFDVF9CSVRTIC0gMSwgZEJmX2ZyYWN0LCB0bXAsIGRCZl9lKTsKKworICAgICAgbXlFeHBTbG90ICs9IG15RXhwOworICAgIH0gZWxzZSB7CisgICAgICBkQmZfbSA9IChGSVhQX0RCTCkwOworICAgICAgZEJmX2UgPSAwOworICAgIH0KIAogICAgIC8qIEtlZXAgdGhlIHJlc3VsdHMgKi8KICAgICBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+ZEJmX21baV0gPSBkQmZfbTsKICAgICBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+ZEJmX2VbaV0gPSBkQmZfZTsKLQogICB9CiAKICAgLyogTWFrZSBzdXJlIHRoYXQgZEJmIGlzIGdyZWF0ZXIgdGhhbiAxLjAgKGJlY2F1c2UgaXQgc2hvdWxkIGJlIGEgaGlnaHBhc3MpICovCkBAIC04OTksODQgKzkwNSw5MSBAQAogfQogCiB2b2lkIEZES3NickVuY19mYXN0VHJhbnNpZW50RGV0ZWN0KAotICAgICAgICBjb25zdCBIQU5ETEVfRkFTVF9UUkFOX0RFVCAgICAgICAgICBoX3NickZhc3RUcmFuc2llbnREZXRlY3RvciwKLSAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICAgICpjb25zdCAqRW5lcmdpZXMsCi0gICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgICAqY29uc3QgIHNjYWxlRW5lcmdpZXMsCi0gICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJXcml0ZU9mZnNldCwKLSAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgICpjb25zdCAgdHJhbl92ZWN0b3IKLSAgICAgICAgKQoteworICAgIGNvbnN0IEhBTkRMRV9GQVNUX1RSQU5fREVUIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLAorICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAqRW5lcmdpZXMsIGNvbnN0IGludCAqY29uc3Qgc2NhbGVFbmVyZ2llcywKKyAgICBjb25zdCBJTlQgWUJ1ZmZlcldyaXRlT2Zmc2V0LCBVQ0hBUiAqY29uc3QgdHJhbl92ZWN0b3IpIHsKICAgaW50IHRpbWVTbG90LCBiYW5kOwogCi0gIEZJWFBfREJMIG1heF9kZWx0YV9lbmVyZ3k7ICAgLyogaGVscGVyIHRvIHN0b3JlIG1heGltdW0gZW5lcmd5IHJhdGlvICAgICAgICAgICovCi0gIGludCBtYXhfZGVsdGFfZW5lcmd5X3NjYWxlOyAgLyogaGVscGVyIHRvIHN0b3JlIHNjYWxlIG9mIG1heGltdW0gZW5lcmd5IHJhdGlvICovCi0gIGludCBpbmRfbWF4ICAgICAgICAgICAgID0gMDsgLyogaGVscGVyIHRvIHN0b3JlIGluZGV4IG9mIG1heGltdW0gZW5lcmd5IHJhdGlvICovCi0gIGludCBpc1RyYW5zaWVudEluRnJhbWUgID0gMDsKKyAgRklYUF9EQkwgbWF4X2RlbHRhX2VuZXJneTsgLyogaGVscGVyIHRvIHN0b3JlIG1heGltdW0gZW5lcmd5IHJhdGlvICAgICAgICAgICovCisgIGludCBtYXhfZGVsdGFfZW5lcmd5X3NjYWxlOyAvKiBoZWxwZXIgdG8gc3RvcmUgc2NhbGUgb2YgbWF4aW11bSBlbmVyZ3kgcmF0aW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgaW5kX21heCA9IDA7IC8qIGhlbHBlciB0byBzdG9yZSBpbmRleCBvZiBtYXhpbXVtIGVuZXJneSByYXRpbyAqLworICBpbnQgaXNUcmFuc2llbnRJbkZyYW1lID0gMDsKIAotICBjb25zdCBpbnQgblRpbWVTbG90cyAgICAgICAgID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPm5UaW1lU2xvdHM7Ci0gIGNvbnN0IGludCBsb29rYWhlYWQgICAgICAgICAgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+bG9va2FoZWFkOwotICBjb25zdCBpbnQgc3RhcnRCYW5kICAgICAgICAgID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0YXJ0QmFuZDsKLSAgY29uc3QgaW50IHN0b3BCYW5kICAgICAgICAgICA9IGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdG9wQmFuZDsKKyAgY29uc3QgaW50IG5UaW1lU2xvdHMgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+blRpbWVTbG90czsKKyAgY29uc3QgaW50IGxvb2thaGVhZCA9IGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5sb29rYWhlYWQ7CisgIGNvbnN0IGludCBzdGFydEJhbmQgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RhcnRCYW5kOworICBjb25zdCBpbnQgc3RvcEJhbmQgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RvcEJhbmQ7CiAKLSAgaW50ICogdHJhbnNpZW50Q2FuZGlkYXRlcyAgICA9IGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT50cmFuc2llbnRDYW5kaWRhdGVzOworICBpbnQgKnRyYW5zaWVudENhbmRpZGF0ZXMgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+dHJhbnNpZW50Q2FuZGlkYXRlczsKIAotICBGSVhQX0RCTCAqIGVuZXJneV90aW1lU2xvdHMgID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmVuZXJneV90aW1lU2xvdHM7Ci0gIGludCAqIGVuZXJneV90aW1lU2xvdHNfc2NhbGUgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+ZW5lcmd5X3RpbWVTbG90c19zY2FsZTsKKyAgRklYUF9EQkwgKmVuZXJneV90aW1lU2xvdHMgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+ZW5lcmd5X3RpbWVTbG90czsKKyAgaW50ICplbmVyZ3lfdGltZVNsb3RzX3NjYWxlID0KKyAgICAgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5lbmVyZ3lfdGltZVNsb3RzX3NjYWxlOwogCi0gIEZJWFBfREJMICogZGVsdGFfZW5lcmd5ICAgICAgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+ZGVsdGFfZW5lcmd5OwotICBpbnQgKiBkZWx0YV9lbmVyZ3lfc2NhbGUgICAgID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmRlbHRhX2VuZXJneV9zY2FsZTsKKyAgRklYUF9EQkwgKmRlbHRhX2VuZXJneSA9IGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5kZWx0YV9lbmVyZ3k7CisgIGludCAqZGVsdGFfZW5lcmd5X3NjYWxlID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmRlbHRhX2VuZXJneV9zY2FsZTsKIAotICBjb25zdCBGSVhQX0RCTCB0aHIgICAgICAgICAgID0gVFJBTl9ERVRfVEhSU0hMRDsKLSAgY29uc3QgSU5UICAgICAgdGhyX3NjYWxlICAgICA9IFRSQU5fREVUX1RIUlNITERfU0NBTEU7CisgIGNvbnN0IEZJWFBfREJMIHRociA9IFRSQU5fREVUX1RIUlNITEQ7CisgIGNvbnN0IElOVCB0aHJfc2NhbGUgPSBUUkFOX0RFVF9USFJTSExEX1NDQUxFOwogCiAgIC8qcmVzZXQgdHJhbnNpZW50IGluZm8qLwogICB0cmFuX3ZlY3RvclsyXSA9IDA7CiAKICAgLyogcmVzZXQgdHJhbnNpZW50IGNhbmRpZGF0ZXMgKi8KLSAgRkRLbWVtY2xlYXIodHJhbnNpZW50Q2FuZGlkYXRlcytsb29rYWhlYWQsIG5UaW1lU2xvdHMqc2l6ZW9mKGludCkpOworICBGREttZW1jbGVhcih0cmFuc2llbnRDYW5kaWRhdGVzICsgbG9va2FoZWFkLCBuVGltZVNsb3RzICogc2l6ZW9mKGludCkpOwogCi0gIGZvcih0aW1lU2xvdCA9IGxvb2thaGVhZDsgdGltZVNsb3QgPCBuVGltZVNsb3RzICsgbG9va2FoZWFkOyB0aW1lU2xvdCsrKSB7CisgIGZvciAodGltZVNsb3QgPSBsb29rYWhlYWQ7IHRpbWVTbG90IDwgblRpbWVTbG90cyArIGxvb2thaGVhZDsgdGltZVNsb3QrKykgewogICAgIGludCBpLCBub3JtOwotICAgIEZJWFBfREJMIHRtcEUgICAgICAgICAgID0gRkwyRlhDT05TVF9EQkwoMC4wZik7Ci0gICAgaW50IGhlYWRyb29tRW5TbG90ICAgICAgPSBERlJBQ1RfQklUUy0xOworICAgIEZJWFBfREJMIHRtcEUgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICBpbnQgaGVhZHJvb21FblNsb3QgPSBERlJBQ1RfQklUUyAtIDE7CiAKICAgICBGSVhQX0RCTCBzbWFsbE5SRyA9IEZMMkZYQ09OU1RfREJMKDFlLTJmKTsKICAgICBGSVhQX0RCTCBkZW5vbWluYXRvcjsKICAgICBJTlQgZGVub21pbmF0b3Jfc2NhbGU7CiAKICAgICAvKiBkZXRlcm1pbmUgbWluaW11bSBoZWFkcm9vbSBvZiBlbmVyZ3kgdmFsdWVzIGZvciB0aGlzIHRpbWVzbG90ICovCi0gICAgZm9yKGJhbmQgPSBzdGFydEJhbmQ7IGJhbmQgPCBzdG9wQmFuZDsgYmFuZCsrKSB7Ci0gICAgICBpbnQgdG1wX2hlYWRyb29tID0gZk5vcm16KEVuZXJnaWVzW3RpbWVTbG90XVtiYW5kXSktMTsKLSAgICAgIGlmKHRtcF9oZWFkcm9vbSA8IGhlYWRyb29tRW5TbG90KXsKKyAgICBmb3IgKGJhbmQgPSBzdGFydEJhbmQ7IGJhbmQgPCBzdG9wQmFuZDsgYmFuZCsrKSB7CisgICAgICBpbnQgdG1wX2hlYWRyb29tID0gZk5vcm16KEVuZXJnaWVzW3RpbWVTbG90XVtiYW5kXSkgLSAxOworICAgICAgaWYgKHRtcF9oZWFkcm9vbSA8IGhlYWRyb29tRW5TbG90KSB7CiAgICAgICAgIGhlYWRyb29tRW5TbG90ID0gdG1wX2hlYWRyb29tOwogICAgICAgfQogICAgIH0KIAotICAgIGZvcihpID0gMCwgYmFuZCA9IHN0YXJ0QmFuZDsgYmFuZCA8IHN0b3BCYW5kOyBiYW5kKyssIGkrKykgeworICAgIGZvciAoaSA9IDAsIGJhbmQgPSBzdGFydEJhbmQ7IGJhbmQgPCBzdG9wQmFuZDsgYmFuZCsrLCBpKyspIHsKICAgICAgIC8qIGVuZXJneSBpcyB3ZWlnaHRlZCBieSB3ZWlnaHRpbmdmYWN0b3Igc3RvcmVkIGluIGRCZl9tIGFycmF5ICovCiAgICAgICAvKiBkQmZfbSBpbmRleCBydW5zIGZyb20gMCB0byBzdG9wQmFuZC1zdGFydGJhbmQgICAgICAgICAgICAgICAqLwogICAgICAgLyogZW5lcmd5IHNoaWZ0ZWQgYnkgY2FsY3VsYXRlZCBoZWFkcm9vbSBmb3IgbWF4aW11bSBwcmVjaXNpb24gKi8KLSAgICAgIEZJWFBfREJMIHdlaWdodGVkRW5lcmd5ID0gZk11bHQoRW5lcmdpZXNbdGltZVNsb3RdW2JhbmRdPDxoZWFkcm9vbUVuU2xvdCwgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmRCZl9tW2ldKTsKKyAgICAgIEZJWFBfREJMIHdlaWdodGVkRW5lcmd5ID0KKyAgICAgICAgICBmTXVsdChFbmVyZ2llc1t0aW1lU2xvdF1bYmFuZF0gPDwgaGVhZHJvb21FblNsb3QsCisgICAgICAgICAgICAgICAgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmRCZl9tW2ldKTsKIAogICAgICAgLyogZW5lcmd5IGlzIGFkZGVkIHVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgIC8qIHNoaWZ0IGJ5IDYgdG8gaGF2ZSBhIGhlYWRyb29tIGZvciBtYXhpbXVtIDY0IGFkZGl0aW9ucyAgICAgICAgICAgICovCiAgICAgICAvKiBzaGlmdCBieSBkQmZfZSB0byBoYW5kbGUgd2VpZ2h0aW5nIGZhY3RvciBkZXBlbmRlbnQgc2NhbGUgZmFjdG9ycyAqLwotICAgICAgdG1wRSArPSB3ZWlnaHRlZEVuZXJneSA+PiAoNiArICgxMCAtIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5kQmZfZVtpXSkpOworICAgICAgdG1wRSArPQorICAgICAgICAgIHdlaWdodGVkRW5lcmd5ID4+ICg2ICsgKDEwIC0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmRCZl9lW2ldKSk7CiAgICAgfQogCiAgICAgLyogc3RvcmUgY2FsY3VsYXRlZCBlbmVyZ3kgZm9yIHRpbWVzbG90ICovCiAgICAgZW5lcmd5X3RpbWVTbG90c1t0aW1lU2xvdF0gPSB0bXBFOwogCi0gICAgLyogY2FsY3VsYXRlIG92ZXJhbGwgc2NhbGUgZmFjdG9yIGZvciBlbmVyZ3kgb2YgdGhpcyB0aW1lc2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qID0gICBvcmlnaW5hbCBzY2FsZSBmYWN0b3Igb2YgZW5lcmdpZXMgKC1zY2FsZUVuZXJnaWVzWzBdKzIqUU1GX1NDQUxFX09GRlNFVCBvciAtc2NhbGVFbmVyZ2llc1sxXSsyKlFNRl9TQ0FMRV9PRkZTRVQgICAgKi8KLSAgICAvKiAgICAgZGVwZW5kaW5nIG9uIFlCdWZmZXJXcml0ZU9mZnNldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICArIHdlaWdodGluZyBmYWN0b3Igc2NhbGUgICAgICAgICAgICAoMTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgKyBhZGRpbmcgdXAgc2NhbGUgZmFjdG9yICAgICAgICAgICAgKCA2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgIC0gaGVhZHJvb20gb2YgZW5lcmd5IHZhbHVlICAgICAgICAgIChoZWFkcm9vbUVuU2xvdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYodGltZVNsb3QgPCBZQnVmZmVyV3JpdGVPZmZzZXQpewotICAgICAgZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdF0gPSAoLXNjYWxlRW5lcmdpZXNbMF0rMipRTUZfU0NBTEVfT0ZGU0VUKSArICgxMCs2KSAtIGhlYWRyb29tRW5TbG90OworICAgIC8qIGNhbGN1bGF0ZSBvdmVyYWxsIHNjYWxlIGZhY3RvciBmb3IgZW5lcmd5IG9mIHRoaXMgdGltZXNsb3QgKi8KKyAgICAvKiA9ICAgb3JpZ2luYWwgc2NhbGUgZmFjdG9yIG9mIGVuZXJnaWVzCisgICAgICogKC1zY2FsZUVuZXJnaWVzWzBdKzIqUU1GX1NDQUxFX09GRlNFVCBvcgorICAgICAqIC1zY2FsZUVuZXJnaWVzWzFdKzIqUU1GX1NDQUxFX09GRlNFVCAgICAqLworICAgIC8qICAgICBkZXBlbmRpbmcgb24gWUJ1ZmZlcldyaXRlT2Zmc2V0KSAqLworICAgIC8qICAgKyB3ZWlnaHRpbmcgZmFjdG9yIHNjYWxlICAgICAgICAgICAgKDEwKSAqLworICAgIC8qICAgKyBhZGRpbmcgdXAgc2NhbGUgZmFjdG9yICAgICAgICAgICAgKCA2KSAqLworICAgIC8qICAgLSBoZWFkcm9vbSBvZiBlbmVyZ3kgdmFsdWUgICAgICAgICAgKGhlYWRyb29tRW5TbG90KSAqLworICAgIGlmICh0aW1lU2xvdCA8IFlCdWZmZXJXcml0ZU9mZnNldCkgeworICAgICAgZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdF0gPQorICAgICAgICAgICgtc2NhbGVFbmVyZ2llc1swXSArIDIgKiBRTUZfU0NBTEVfT0ZGU0VUKSArICgxMCArIDYpIC0KKyAgICAgICAgICBoZWFkcm9vbUVuU2xvdDsKICAgICB9IGVsc2UgewotICAgICAgZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdF0gPSAoLXNjYWxlRW5lcmdpZXNbMV0rMipRTUZfU0NBTEVfT0ZGU0VUKSArICgxMCs2KSAtIGhlYWRyb29tRW5TbG90OworICAgICAgZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdF0gPQorICAgICAgICAgICgtc2NhbGVFbmVyZ2llc1sxXSArIDIgKiBRTUZfU0NBTEVfT0ZGU0VUKSArICgxMCArIDYpIC0KKyAgICAgICAgICBoZWFkcm9vbUVuU2xvdDsKICAgICB9CiAKICAgICAvKiBBZGQgYSBzbWFsbCBlbmVyZ3kgdG8gdGhlIGRlbm9taW5hdG9yLCB0aHVzIG1ha2luZyB0aGUgdHJhbnNpZW50CkBAIC05ODQsMTkgKzk5NywyMSBAQAogICAgICAgIHNpbGVudCBvbmVzIG5vdC4gKi8KIAogICAgIC8qIG1ha2Ugc3VyZSB0aGF0IHNtYWxsTlJHIGRvZXMgbm90IG92ZXJmbG93ICovCi0gICAgaWYgKCAtZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdC0xXSArIDEgPiA1ICkKLSAgICB7CisgICAgaWYgKC1lbmVyZ3lfdGltZVNsb3RzX3NjYWxlW3RpbWVTbG90IC0gMV0gKyAxID4gNSkgewogICAgICAgZGVub21pbmF0b3IgPSBzbWFsbE5SRzsKICAgICAgIGRlbm9taW5hdG9yX3NjYWxlID0gMDsKICAgICB9IGVsc2UgewogICAgICAgLyogTGVhdmUgYW4gYWRkaXRpb25hbCBoZWFkcm9vbSBvZiAxIGJpdCBmb3IgdGhpcyBhZGRpdGlvbi4gKi8KLSAgICAgIHNtYWxsTlJHID0gc2NhbGVWYWx1ZShzbWFsbE5SRywgLShlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW3RpbWVTbG90LTFdICsgMSkpOwotICAgICAgZGVub21pbmF0b3IgPSAoZW5lcmd5X3RpbWVTbG90c1t0aW1lU2xvdC0xXT4+MSkgKyBzbWFsbE5SRzsKLSAgICAgIGRlbm9taW5hdG9yX3NjYWxlID0gZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdC0xXSsxOworICAgICAgc21hbGxOUkcgPQorICAgICAgICAgIHNjYWxlVmFsdWUoc21hbGxOUkcsIC0oZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdCAtIDFdICsgMSkpOworICAgICAgZGVub21pbmF0b3IgPSAoZW5lcmd5X3RpbWVTbG90c1t0aW1lU2xvdCAtIDFdID4+IDEpICsgc21hbGxOUkc7CisgICAgICBkZW5vbWluYXRvcl9zY2FsZSA9IGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3QgLSAxXSArIDE7CiAgICAgfQogCi0gICAgZGVsdGFfZW5lcmd5W3RpbWVTbG90XSA9IGZEaXZOb3JtKGVuZXJneV90aW1lU2xvdHNbdGltZVNsb3RdLCBkZW5vbWluYXRvciwgJm5vcm0pOwotICAgIGRlbHRhX2VuZXJneV9zY2FsZVt0aW1lU2xvdF0gPSBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW3RpbWVTbG90XSAtIGRlbm9taW5hdG9yX3NjYWxlICsgbm9ybTsKKyAgICBkZWx0YV9lbmVyZ3lbdGltZVNsb3RdID0KKyAgICAgICAgZkRpdk5vcm0oZW5lcmd5X3RpbWVTbG90c1t0aW1lU2xvdF0sIGRlbm9taW5hdG9yLCAmbm9ybSk7CisgICAgZGVsdGFfZW5lcmd5X3NjYWxlW3RpbWVTbG90XSA9CisgICAgICAgIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3RdIC0gZGVub21pbmF0b3Jfc2NhbGUgKyBub3JtOwogICB9CiAKICAgLypnZXQgdHJhbnNpZW50IGNhbmRpZGF0ZXMqLwpAQCAtMTAwOCwxNSArMTAyMywyMSBAQAogICAgICBsYXN0IG9yIHRoZSBvbmUgYmVmb3JlIHRoZSBsYXN0IHNsb3QsIGl0IGlzIG1hcmtlZCBhcyBhIHRyYW5zaWVudC4qLwogCiAgIEZES19BU1NFUlQobG9va2FoZWFkID49IDIpOwotICBmb3IodGltZVNsb3QgPSBsb29rYWhlYWQ7IHRpbWVTbG90IDwgblRpbWVTbG90cyArIGxvb2thaGVhZDsgdGltZVNsb3QrKykgewotICAgIEZJWFBfREJMIGVuZXJneV9jdXJfc2xvdF93ZWlnaHRlZCA9IGZNdWx0KGVuZXJneV90aW1lU2xvdHNbdGltZVNsb3RdLEZMMkZYQ09OU1RfREJMKDEuMGYvMS40ZikpOwotICAgIGlmKCAhZklzTGVzc1RoYW4oZGVsdGFfZW5lcmd5W3RpbWVTbG90XSwgZGVsdGFfZW5lcmd5X3NjYWxlW3RpbWVTbG90XSwgdGhyLCB0aHJfc2NhbGUpICYmCi0gICAgICAgICggKCh0cmFuc2llbnRDYW5kaWRhdGVzW3RpbWVTbG90LTJdPT0wKSAmJiAodHJhbnNpZW50Q2FuZGlkYXRlc1t0aW1lU2xvdC0xXT09MCkpIHx8Ci0gICAgICAgICAgIWZJc0xlc3NUaGFuKGVuZXJneV9jdXJfc2xvdF93ZWlnaHRlZCwgZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdF0sIGVuZXJneV90aW1lU2xvdHNbdGltZVNsb3QtMV0sIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3QtMV0gKSB8fAotICAgICAgICAgICFmSXNMZXNzVGhhbihlbmVyZ3lfY3VyX3Nsb3Rfd2VpZ2h0ZWQsIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3RdLCBlbmVyZ3lfdGltZVNsb3RzW3RpbWVTbG90LTJdLCBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW3RpbWVTbG90LTJdICkKLSAgICAgICAgKQotICAgICAgKQoteworICBmb3IgKHRpbWVTbG90ID0gbG9va2FoZWFkOyB0aW1lU2xvdCA8IG5UaW1lU2xvdHMgKyBsb29rYWhlYWQ7IHRpbWVTbG90KyspIHsKKyAgICBGSVhQX0RCTCBlbmVyZ3lfY3VyX3Nsb3Rfd2VpZ2h0ZWQgPQorICAgICAgICBmTXVsdChlbmVyZ3lfdGltZVNsb3RzW3RpbWVTbG90XSwgRkwyRlhDT05TVF9EQkwoMS4wZiAvIDEuNGYpKTsKKyAgICBpZiAoIWZJc0xlc3NUaGFuKGRlbHRhX2VuZXJneVt0aW1lU2xvdF0sIGRlbHRhX2VuZXJneV9zY2FsZVt0aW1lU2xvdF0sIHRociwKKyAgICAgICAgICAgICAgICAgICAgIHRocl9zY2FsZSkgJiYKKyAgICAgICAgKCgodHJhbnNpZW50Q2FuZGlkYXRlc1t0aW1lU2xvdCAtIDJdID09IDApICYmCisgICAgICAgICAgKHRyYW5zaWVudENhbmRpZGF0ZXNbdGltZVNsb3QgLSAxXSA9PSAwKSkgfHwKKyAgICAgICAgICFmSXNMZXNzVGhhbihlbmVyZ3lfY3VyX3Nsb3Rfd2VpZ2h0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdF0sCisgICAgICAgICAgICAgICAgICAgICAgZW5lcmd5X3RpbWVTbG90c1t0aW1lU2xvdCAtIDFdLAorICAgICAgICAgICAgICAgICAgICAgIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3QgLSAxXSkgfHwKKyAgICAgICAgICFmSXNMZXNzVGhhbihlbmVyZ3lfY3VyX3Nsb3Rfd2VpZ2h0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdF0sCisgICAgICAgICAgICAgICAgICAgICAgZW5lcmd5X3RpbWVTbG90c1t0aW1lU2xvdCAtIDJdLAorICAgICAgICAgICAgICAgICAgICAgIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3QgLSAyXSkpKSB7CiAgICAgICAvKiBpbiBjYXNlIG9mIHN0cm9uZyB0cmFuc2llbnRzLCBzdWJzZXF1ZW50CiAgICAgICAgKiBxbWYgc2xvdHMgbWlnaHQgYmUgcmVjb2duaXplZCBhcyB0cmFuc2llbnRzLiAqLwogICAgICAgdHJhbnNpZW50Q2FuZGlkYXRlc1t0aW1lU2xvdF0gPSAxOwpAQCAtMTAyNCwyMiArMTA0NSwyNCBAQAogICB9CiAKICAgLypnZXQgdHJhbnNpZW50IHdpdGggbWF4IGVuZXJneSovCi0gIG1heF9kZWx0YV9lbmVyZ3kgICA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICBtYXhfZGVsdGFfZW5lcmd5ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgIG1heF9kZWx0YV9lbmVyZ3lfc2NhbGUgPSAwOwogICBpbmRfbWF4ID0gMDsKICAgaXNUcmFuc2llbnRJbkZyYW1lID0gMDsKLSAgZm9yKHRpbWVTbG90ID0gMDsgdGltZVNsb3QgPCBuVGltZVNsb3RzOyB0aW1lU2xvdCsrKSB7CisgIGZvciAodGltZVNsb3QgPSAwOyB0aW1lU2xvdCA8IG5UaW1lU2xvdHM7IHRpbWVTbG90KyspIHsKICAgICBpbnQgc2NhbGUgPSBmTWF4KGRlbHRhX2VuZXJneV9zY2FsZVt0aW1lU2xvdF0sIG1heF9kZWx0YV9lbmVyZ3lfc2NhbGUpOwotICAgIGlmKHRyYW5zaWVudENhbmRpZGF0ZXNbdGltZVNsb3RdICYmICggKGRlbHRhX2VuZXJneVt0aW1lU2xvdF0gPj4gKHNjYWxlIC0gZGVsdGFfZW5lcmd5X3NjYWxlW3RpbWVTbG90XSkpID4gKG1heF9kZWx0YV9lbmVyZ3kgPj4gKHNjYWxlIC0gbWF4X2RlbHRhX2VuZXJneV9zY2FsZSkpICkgKSB7Ci0gICAgICBtYXhfZGVsdGFfZW5lcmd5ICAgPSBkZWx0YV9lbmVyZ3lbdGltZVNsb3RdOworICAgIGlmICh0cmFuc2llbnRDYW5kaWRhdGVzW3RpbWVTbG90XSAmJgorICAgICAgICAoKGRlbHRhX2VuZXJneVt0aW1lU2xvdF0gPj4gKHNjYWxlIC0gZGVsdGFfZW5lcmd5X3NjYWxlW3RpbWVTbG90XSkpID4KKyAgICAgICAgIChtYXhfZGVsdGFfZW5lcmd5ID4+IChzY2FsZSAtIG1heF9kZWx0YV9lbmVyZ3lfc2NhbGUpKSkpIHsKKyAgICAgIG1heF9kZWx0YV9lbmVyZ3kgPSBkZWx0YV9lbmVyZ3lbdGltZVNsb3RdOwogICAgICAgbWF4X2RlbHRhX2VuZXJneV9zY2FsZSA9IHNjYWxlOwotICAgICAgaW5kX21heCAgICAgICAgICAgID0gdGltZVNsb3Q7CisgICAgICBpbmRfbWF4ID0gdGltZVNsb3Q7CiAgICAgICBpc1RyYW5zaWVudEluRnJhbWUgPSAxOwogICAgIH0KICAgfQogCiAgIC8qZnJvbSBhbGwgdHJhbnNpZW50IGNhbmRpZGF0ZXMgdGFrZSB0aGUgb25lIHdpdGggdGhlIGJpZ2dlc3QgZW5lcmd5Ki8KLSAgaWYoaXNUcmFuc2llbnRJbkZyYW1lKSB7CisgIGlmIChpc1RyYW5zaWVudEluRnJhbWUpIHsKICAgICB0cmFuX3ZlY3RvclswXSA9IGluZF9tYXg7CiAgICAgdHJhbl92ZWN0b3JbMV0gPSAxOwogICB9IGVsc2UgewpAQCAtMTA0OCwyMiArMTA3MSwyMiBAQAogICB9CiAKICAgLypjaGVjayBmb3IgdHJhbnNpZW50cyBpbiBsb29rYWhlYWQqLwotICBmb3IodGltZVNsb3QgPSBuVGltZVNsb3RzOyB0aW1lU2xvdCA8IG5UaW1lU2xvdHMgKyBsb29rYWhlYWQ7IHRpbWVTbG90KyspIHsKLSAgICBpZih0cmFuc2llbnRDYW5kaWRhdGVzW3RpbWVTbG90XSkgeworICBmb3IgKHRpbWVTbG90ID0gblRpbWVTbG90czsgdGltZVNsb3QgPCBuVGltZVNsb3RzICsgbG9va2FoZWFkOyB0aW1lU2xvdCsrKSB7CisgICAgaWYgKHRyYW5zaWVudENhbmRpZGF0ZXNbdGltZVNsb3RdKSB7CiAgICAgICB0cmFuX3ZlY3RvclsyXSA9IDE7CiAgICAgfQogICB9CiAKICAgLyp1cGRhdGUgYnVmZmVycyovCi0gIGZvcih0aW1lU2xvdCA9IDA7IHRpbWVTbG90IDwgbG9va2FoZWFkOyB0aW1lU2xvdCsrKSB7CisgIGZvciAodGltZVNsb3QgPSAwOyB0aW1lU2xvdCA8IGxvb2thaGVhZDsgdGltZVNsb3QrKykgewogICAgIHRyYW5zaWVudENhbmRpZGF0ZXNbdGltZVNsb3RdID0gdHJhbnNpZW50Q2FuZGlkYXRlc1tuVGltZVNsb3RzICsgdGltZVNsb3RdOwogCiAgICAgLyogZml4cG9pbnQgc3R1ZmYgKi8KLSAgICBlbmVyZ3lfdGltZVNsb3RzW3RpbWVTbG90XSAgICA9IGVuZXJneV90aW1lU2xvdHNbblRpbWVTbG90cyArIHRpbWVTbG90XTsKLSAgICBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW3RpbWVTbG90XSAgPSBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW25UaW1lU2xvdHMgKyB0aW1lU2xvdF07CisgICAgZW5lcmd5X3RpbWVTbG90c1t0aW1lU2xvdF0gPSBlbmVyZ3lfdGltZVNsb3RzW25UaW1lU2xvdHMgKyB0aW1lU2xvdF07CisgICAgZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdF0gPQorICAgICAgICBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW25UaW1lU2xvdHMgKyB0aW1lU2xvdF07CiAKLSAgICBkZWx0YV9lbmVyZ3lbdGltZVNsb3RdICAgICA9IGRlbHRhX2VuZXJneVtuVGltZVNsb3RzICsgdGltZVNsb3RdOwotICAgIGRlbHRhX2VuZXJneV9zY2FsZVt0aW1lU2xvdF0gICA9IGRlbHRhX2VuZXJneV9zY2FsZVtuVGltZVNsb3RzICsgdGltZVNsb3RdOworICAgIGRlbHRhX2VuZXJneVt0aW1lU2xvdF0gPSBkZWx0YV9lbmVyZ3lbblRpbWVTbG90cyArIHRpbWVTbG90XTsKKyAgICBkZWx0YV9lbmVyZ3lfc2NhbGVbdGltZVNsb3RdID0gZGVsdGFfZW5lcmd5X3NjYWxlW25UaW1lU2xvdHMgKyB0aW1lU2xvdF07CiAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy90cmFuX2RldC5oIGIvbGliU0JSZW5jL3NyYy90cmFuX2RldC5oCmluZGV4IDZmZTEwMjMuLmQxMGE3ZGIgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvdHJhbl9kZXQuaAorKysgYi9saWJTQlJlbmMvc3JjL3RyYW5fZGV0LmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTI1ICs5MCwxMDIgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQlIgZW5jb2RlciBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBBdXRob3Iocyk6CisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiEKICAgXGZpbGUKLSAgXGJyaWVmICBUcmFuc2llbnQgZGV0ZWN0b3IgcHJvdG90eXBlcyAgCisgIFxicmllZiAgVHJhbnNpZW50IGRldGVjdG9yIHByb3RvdHlwZXMgJFJldmlzaW9uOiA5NTExMSAkCiAqLwotI2lmbmRlZiBfX1RSQU5fREVUX0gKLSNkZWZpbmUgX19UUkFOX0RFVF9ICisjaWZuZGVmIFRSQU5fREVUX0gKKyNkZWZpbmUgVFJBTl9ERVRfSAogCiAjaW5jbHVkZSAic2JyX2VuY29kZXIuaCIKICNpbmNsdWRlICJzYnJfZGVmLmgiCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIEZJWFBfREJMICB0cmFuc2llbnRzW1FNRl9NQVhfVElNRV9TTE9UUysoUU1GX01BWF9USU1FX1NMT1RTLzIpXTsKLSAgRklYUF9EQkwgIHRocmVzaG9sZHNbUU1GX0NIQU5ORUxTXTsKLSAgRklYUF9EQkwgIHRyYW5fdGhyOyAgICAgICAgICAgICAgLyogTWFzdGVyIHRocmVzaG9sZCBmb3IgdHJhbnNpZW50IHNpZ25hbHMgKi8KLSAgRklYUF9EQkwgIHNwbGl0X3Rocl9tOyAgICAgICAgICAgLyogVGhyZXNob2xkIGZvciBzcGxpdHRpbmcgRklYRklYLWZyYW1lcyBpbnRvIDIgZW52ICovCi0gIElOVCAgICAgICBzcGxpdF90aHJfZTsgICAgICAgICAgIC8qIFNjYWxlIGZvciBzcGxpdHRpbmcgdGhyZXNob2xkICovCi0gIEZJWFBfREJMICBwcmV2TG93QmFuZEVuZXJneTsgICAgIC8qIEVuZXJneSBvZiBsb3cgYmFuZCAqLwotICBGSVhQX0RCTCAgcHJldkhpZ2hCYW5kRW5lcmd5OyAgICAvKiBFbmVyZ3kgb2YgaGlnaCBiYW5kICovCi0gIElOVCAgICB0cmFuX2ZjOyAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBsb3diYW5kIHN1YmJhbmRzIHRvIGRpc2NhcmQgICovCi0gIElOVCAgICBub19jb2xzOwotICBJTlQgICAgbm9fcm93czsKLSAgSU5UICAgIG1vZGU7Cit0eXBlZGVmIHN0cnVjdCB7CisgIEZJWFBfREJMIHRyYW5zaWVudHNbMzIgKyAoMzIgLyAyKV07CisgIEZJWFBfREJMIHRocmVzaG9sZHNbNjRdOworICBGSVhQX0RCTCB0cmFuX3RocjsgICAgLyogTWFzdGVyIHRocmVzaG9sZCBmb3IgdHJhbnNpZW50IHNpZ25hbHMgKi8KKyAgRklYUF9EQkwgc3BsaXRfdGhyX207IC8qIFRocmVzaG9sZCBmb3Igc3BsaXR0aW5nIEZJWEZJWC1mcmFtZXMgaW50byAyIGVudiAqLworICBJTlQgc3BsaXRfdGhyX2U7ICAgICAgLyogU2NhbGUgZm9yIHNwbGl0dGluZyB0aHJlc2hvbGQgKi8KKyAgRklYUF9EQkwgcHJldkxvd0JhbmRFbmVyZ3k7ICAvKiBFbmVyZ3kgb2YgbG93IGJhbmQgKi8KKyAgRklYUF9EQkwgcHJldkhpZ2hCYW5kRW5lcmd5OyAvKiBFbmVyZ3kgb2YgaGlnaCBiYW5kICovCisgIElOVCB0cmFuX2ZjOyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGxvd2JhbmQgc3ViYmFuZHMgdG8gZGlzY2FyZCAgKi8KKyAgSU5UIG5vX2NvbHM7CisgIElOVCBub19yb3dzOworICBJTlQgbW9kZTsKIAotICBpbnQgICAgZnJhbWVTaGlmdDsKLSAgaW50ICAgIHRyYW5fb2ZmOyAgICAgICAgICAgICAgICAgLyogT2Zmc2V0IGZvciByZWFkaW5nIGVuZXJneSB2YWx1ZXMuICovCi19Ci1TQlJfVFJBTlNJRU5UX0RFVEVDVE9SOwotCisgIGludCBmcmFtZVNoaWZ0OworICBpbnQgdHJhbl9vZmY7IC8qIE9mZnNldCBmb3IgcmVhZGluZyBlbmVyZ3kgdmFsdWVzLiAqLworfSBTQlJfVFJBTlNJRU5UX0RFVEVDVE9SOwogCiB0eXBlZGVmIFNCUl9UUkFOU0lFTlRfREVURUNUT1IgKkhBTkRMRV9TQlJfVFJBTlNJRU5UX0RFVEVDVE9SOwogCiAjZGVmaW5lIFRSQU5fREVUX0xPT0tBSEVBRCAyCi0jZGVmaW5lIFRSQU5fREVUX1NUQVJUX0ZSRVEgNDUwMCAgLypzdGFydCBmcmVxdWVuY3kgZm9yIHRyYW5zaWVudCBkZXRlY3Rpb24qLwotI2RlZmluZSBUUkFOX0RFVF9TVE9QX0ZSRVEgIDEzNTAwIC8qc3RvcCBmcmVxdWVuY3kgZm9yIHRyYW5zaWVudCBkZXRlY3Rpb24qLwotI2RlZmluZSBUUkFOX0RFVF9NSU5fUU1GQkFORFMgNCAvKiBtaW5pbXVtIHFtZiBiYW5kcyBmb3IgdHJhbnNpZW50IGRldGVjdGlvbiAqLwotI2RlZmluZSBRTUZfSFBfZEJkX1NMT1BFX0ZJWCBGTDJGWENPTlNUX0RCTCgwLjAwMDc1Mjc1ZikgLyogMC4wMDIyNjZmLzEwICogbG9nMigxMCkgKi8KLSNkZWZpbmUgVFJBTl9ERVRfVEhSU0hMRCBGTDJGWENPTlNUX0RCTCgzLjJmLzQuZikKLSNkZWZpbmUgVFJBTl9ERVRfVEhSU0hMRF9TQ0FMRSAoMikKKyNkZWZpbmUgVFJBTl9ERVRfU1RBUlRfRlJFUSA0NTAwIC8qc3RhcnQgZnJlcXVlbmN5IGZvciB0cmFuc2llbnQgZGV0ZWN0aW9uKi8KKyNkZWZpbmUgVFJBTl9ERVRfU1RPUF9GUkVRIDEzNTAwIC8qc3RvcCBmcmVxdWVuY3kgZm9yIHRyYW5zaWVudCBkZXRlY3Rpb24qLworI2RlZmluZSBUUkFOX0RFVF9NSU5fUU1GQkFORFMgICAgICAgICAgICAgICAgICAgIFwKKyAgNCAvKiBtaW5pbXVtIHFtZiBiYW5kcyBmb3IgdHJhbnNpZW50IGRldGVjdGlvbiBcCisgICAgICovCisjZGVmaW5lIFFNRl9IUF9kQmRfU0xPUEVfRklYIFwKKyAgRkwyRlhDT05TVF9EQkwoMC4wMDA3NTI3NWYpIC8qIDAuMDAyMjY2Zi8xMCAqIGxvZzIoMTApICovCisjZGVmaW5lIFRSQU5fREVUX1RIUlNITEQgRkwyRlhDT05TVF9EQkwoNS4wZiAvIDguMGYpCisjZGVmaW5lIFRSQU5fREVUX1RIUlNITERfU0NBTEUgKDMpCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIElOVCB0cmFuc2llbnRDYW5kaWRhdGVzW1FNRl9NQVhfVElNRV9TTE9UUyArIFRSQU5fREVUX0xPT0tBSEVBRF07Cit0eXBlZGVmIHN0cnVjdCB7CisgIElOVCB0cmFuc2llbnRDYW5kaWRhdGVzWzMyICsgVFJBTl9ERVRfTE9PS0FIRUFEXTsKICAgSU5UIG5UaW1lU2xvdHM7CiAgIElOVCBsb29rYWhlYWQ7CiAgIElOVCBzdGFydEJhbmQ7CiAgIElOVCBzdG9wQmFuZDsKIAotICBGSVhQX0RCTCBkQmZfbVtRTUZfQ0hBTk5FTFNdOwotICBJTlQgICAgICBkQmZfZVtRTUZfQ0hBTk5FTFNdOworICBGSVhQX0RCTCBkQmZfbVs2NF07CisgIElOVCBkQmZfZVs2NF07CiAKLSAgRklYUF9EQkwgZW5lcmd5X3RpbWVTbG90c1tRTUZfTUFYX1RJTUVfU0xPVFMgKyBUUkFOX0RFVF9MT09LQUhFQURdOwotICBJTlQgICAgICBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW1FNRl9NQVhfVElNRV9TTE9UUyArIFRSQU5fREVUX0xPT0tBSEVBRF07CisgIEZJWFBfREJMIGVuZXJneV90aW1lU2xvdHNbMzIgKyBUUkFOX0RFVF9MT09LQUhFQURdOworICBJTlQgZW5lcmd5X3RpbWVTbG90c19zY2FsZVszMiArIFRSQU5fREVUX0xPT0tBSEVBRF07CiAKLSAgRklYUF9EQkwgZGVsdGFfZW5lcmd5W1FNRl9NQVhfVElNRV9TTE9UUyArIFRSQU5fREVUX0xPT0tBSEVBRF07Ci0gIElOVCAgICAgIGRlbHRhX2VuZXJneV9zY2FsZVtRTUZfTUFYX1RJTUVfU0xPVFMgKyBUUkFOX0RFVF9MT09LQUhFQURdOworICBGSVhQX0RCTCBkZWx0YV9lbmVyZ3lbMzIgKyBUUkFOX0RFVF9MT09LQUhFQURdOworICBJTlQgZGVsdGFfZW5lcmd5X3NjYWxlWzMyICsgVFJBTl9ERVRfTE9PS0FIRUFEXTsKIAotICBGSVhQX0RCTCBsb3dwYXNzX2VuZXJneVtRTUZfTUFYX1RJTUVfU0xPVFMgKyBUUkFOX0RFVF9MT09LQUhFQURdOwotICBJTlQgICAgICBsb3dwYXNzX2VuZXJneV9zY2FsZVtRTUZfTUFYX1RJTUVfU0xPVFMgKyBUUkFOX0RFVF9MT09LQUhFQURdOwotI2lmIGRlZmluZWQgKEZURF9MT0cpCi0gIEZES0ZJTEUgKmZ0ZF9sb2c7Ci0jZW5kaWYKLX0KLUZBU1RfVFJBTl9ERVRFQ1RPUjsKKyAgRklYUF9EQkwgbG93cGFzc19lbmVyZ3lbMzIgKyBUUkFOX0RFVF9MT09LQUhFQURdOworICBJTlQgbG93cGFzc19lbmVyZ3lfc2NhbGVbMzIgKyBUUkFOX0RFVF9MT09LQUhFQURdOworfSBGQVNUX1RSQU5fREVURUNUT1I7CiB0eXBlZGVmIEZBU1RfVFJBTl9ERVRFQ1RPUiAqSEFORExFX0ZBU1RfVFJBTl9ERVQ7CiAKLQogSU5UIEZES3NickVuY19Jbml0U2JyRmFzdFRyYW5zaWVudERldGVjdG9yKAotICAgICAgICBIQU5ETEVfRkFTVF9UUkFOX0RFVCBoX3NickZhc3RUcmFuc2llbnREZXRlY3RvciwKLSAgICAgICAgY29uc3QgSU5UIHRpbWVfc2xvdHNfcGVyX2ZyYW1lLAotICAgICAgICBjb25zdCBJTlQgYmFuZHdpZHRoX3FtZl9zbG90LAotICAgICAgICBjb25zdCBJTlQgbm9fcW1mX2NoYW5uZWxzLAotICAgICAgICBjb25zdCBJTlQgc2JyX3FtZl8xc3RfYmFuZAotICAgICAgICApOworICAgIEhBTkRMRV9GQVNUX1RSQU5fREVUIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLAorICAgIGNvbnN0IElOVCB0aW1lX3Nsb3RzX3Blcl9mcmFtZSwgY29uc3QgSU5UIGJhbmR3aWR0aF9xbWZfc2xvdCwKKyAgICBjb25zdCBJTlQgbm9fcW1mX2NoYW5uZWxzLCBjb25zdCBJTlQgc2JyX3FtZl8xc3RfYmFuZCk7CiAKIHZvaWQgRkRLc2JyRW5jX2Zhc3RUcmFuc2llbnREZXRlY3QoCi0gICAgICAgIGNvbnN0IEhBTkRMRV9GQVNUX1RSQU5fREVUICAgICAgICAgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLAotICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAgICAgICAgICAgKmNvbnN0ICpFbmVyZ2llcywKLSAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgICAgICpjb25zdCAgc2NhbGVFbmVyZ2llcywKLSAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlcldyaXRlT2Zmc2V0LAotICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgKmNvbnN0ICB0cmFuX3ZlY3RvcgotICAgICAgICApOworICAgIGNvbnN0IEhBTkRMRV9GQVNUX1RSQU5fREVUIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLAorICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAqRW5lcmdpZXMsIGNvbnN0IGludCAqY29uc3Qgc2NhbGVFbmVyZ2llcywKKyAgICBjb25zdCBJTlQgWUJ1ZmZlcldyaXRlT2Zmc2V0LCBVQ0hBUiAqY29uc3QgdHJhbl92ZWN0b3IpOwogCi12b2lkCi1GREtzYnJFbmNfdHJhbnNpZW50RGV0ZWN0KEhBTkRMRV9TQlJfVFJBTlNJRU5UX0RFVEVDVE9SIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqRW5lcmdpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2NhbGVFbmVyZ2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnRyYW5fdmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgWUJ1ZmZlcldyaXRlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgWUJ1ZmZlclN6U2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lTWlkZGxlQm9yZGVyKTsKK3ZvaWQgRkRLc2JyRW5jX3RyYW5zaWVudERldGVjdCgKKyAgICBIQU5ETEVfU0JSX1RSQU5TSUVOVF9ERVRFQ1RPUiBoX3NiclRyYW5zaWVudERldGVjdG9yLCBGSVhQX0RCTCAqKkVuZXJnaWVzLAorICAgIElOVCAqc2NhbGVFbmVyZ2llcywgVUNIQVIgKnRyYW5fdmVjdG9yLCBpbnQgWUJ1ZmZlcldyaXRlT2Zmc2V0LAorICAgIGludCBZQnVmZmVyU3pTaGlmdCwgaW50IHRpbWVTdGVwLCBpbnQgZnJhbWVNaWRkbGVCb3JkZXIpOwogCi1pbnQKLUZES3NickVuY19Jbml0U2JyVHJhbnNpZW50RGV0ZWN0b3IgKEhBTkRMRV9TQlJfVFJBTlNJRU5UX0RFVEVDVE9SIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgc2JyU3ludGF4RmxhZ3MsIC8qIFNCUiBzeW50YXggZmxhZ3MgZGVyaXZlZCBmcm9tIEFPVC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBmcmFtZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgc2FtcGxlRnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWd1cmF0aW9uUHRyIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICB0cmFuX2ZjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgIG5vX2NvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgbm9fcm93cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBZQnVmZmVyV3JpdGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgWUJ1ZmZlclN6U2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgZnJhbWVTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICB0cmFuX29mZik7CitpbnQgRkRLc2JyRW5jX0luaXRTYnJUcmFuc2llbnREZXRlY3RvcigKKyAgICBIQU5ETEVfU0JSX1RSQU5TSUVOVF9ERVRFQ1RPUiBoX3NiclRyYW5zaWVudERldGVjdG9yLAorICAgIFVJTlQgc2JyU3ludGF4RmxhZ3MsIC8qIFNCUiBzeW50YXggZmxhZ3MgZGVyaXZlZCBmcm9tIEFPVC4gKi8KKyAgICBJTlQgZnJhbWVTaXplLCBJTlQgc2FtcGxlRnJlcSwgc2JyQ29uZmlndXJhdGlvblB0ciBwYXJhbXMsIGludCB0cmFuX2ZjLAorICAgIGludCBub19jb2xzLCBpbnQgbm9fcm93cywgaW50IFlCdWZmZXJXcml0ZU9mZnNldCwgaW50IFlCdWZmZXJTelNoaWZ0LAorICAgIGludCBmcmFtZVNoaWZ0LCBpbnQgdHJhbl9vZmYpOwogCi12b2lkCi1GREtzYnJFbmNfZnJhbWVTcGxpdHRlcihGSVhQX0RCTCAqKkVuZXJnaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpzY2FsZUVuZXJnaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9UUkFOU0lFTlRfREVURUNUT1IgaF9zYnJUcmFuc2llbnREZXRlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpmcmVxQmFuZFRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnRyYW5fdmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IFlCdWZmZXJXcml0ZU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBZQnVmZmVyU3pTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vX2NvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCogdG9uYWxpdHkpOwordm9pZCBGREtzYnJFbmNfZnJhbWVTcGxpdHRlcigKKyAgICBGSVhQX0RCTCAqKkVuZXJnaWVzLCBJTlQgKnNjYWxlRW5lcmdpZXMsCisgICAgSEFORExFX1NCUl9UUkFOU0lFTlRfREVURUNUT1IgaF9zYnJUcmFuc2llbnREZXRlY3RvciwgVUNIQVIgKmZyZXFCYW5kVGFibGUsCisgICAgVUNIQVIgKnRyYW5fdmVjdG9yLCBpbnQgWUJ1ZmZlcldyaXRlT2Zmc2V0LCBpbnQgWUJ1ZmZlclN6U2hpZnQsIGludCBuU2ZiLAorICAgIGludCB0aW1lU3RlcCwgaW50IG5vX2NvbHMsIEZJWFBfREJMICp0b25hbGl0eSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYlNZUy9pbmNsdWRlL0ZES19hdWRpby5oIGIvbGliU1lTL2luY2x1ZGUvRkRLX2F1ZGlvLmgKaW5kZXggOThkZWQzYi4uMGU0NDBjOSAxMDA2NDQKLS0tIGEvbGliU1lTL2luY2x1ZGUvRkRLX2F1ZGlvLmgKKysrIGIvbGliU1lTL2luY2x1ZGUvRkRLX2F1ZGlvLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTMgKzkwLDE1IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBTeXN0ZW0gaW50ZWdyYXRpb24gbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqIFxmaWxlICAgRkRLX2F1ZGlvLmgKICAqICBcYnJpZWYgIEdsb2JhbCBhdWRpbyBzdHJ1Y3QgYW5kIGNvbnN0YW50IGRlZmluaXRpb25zLgpAQCAtOTYsMzA5ICsxMDksNDA5IEBACiAKICNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKICNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorI2luY2x1ZGUgInN5c2xpYl9jaGFubmVsTWFwRGVzY3IuaCIKIAogI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17CitleHRlcm4gIkMiIHsKICNlbmRpZgogCiAvKioKICAqIEZpbGUgZm9ybWF0IGlkZW50aWZpZXJzLgogICovCi10eXBlZGVmIGVudW0KLXsKLSAgRkZfVU5LTk9XTiAgICAgICAgICAgPSAtMSwgLyoqPCBVbmtub3duIGZvcm1hdC4gICAgICAgICovCi0gIEZGX1JBVyAgICAgICAgICAgICAgID0gMCwgIC8qKjwgTm8gY29udGFpbmVyLCBiaXQgc3RyZWFtIGRhdGEgY29udmV5ZWQgImFzIGlzIi4gKi8KK3R5cGVkZWYgZW51bSB7CisgIEZGX1VOS05PV04gPSAtMSwgLyoqPCBVbmtub3duIGZvcm1hdC4gICAgICAgICovCisgIEZGX1JBVyA9IDAsICAgICAgLyoqPCBObyBjb250YWluZXIsIGJpdCBzdHJlYW0gZGF0YSBjb252ZXllZCAiYXMgaXMiLiAqLwogCi0gIEZGX01QNF8zR1BQICAgICAgICAgID0gMywgIC8qKjwgM0dQUCBmaWxlIGZvcm1hdC4gICAgICAqLwotICBGRl9NUDRfTVA0RiAgICAgICAgICA9IDQsICAvKio8IE1QRUctNCBGaWxlIGZvcm1hdC4gICAgICovCisgIEZGX01QNF8zR1BQID0gMywgLyoqPCAzR1BQIGZpbGUgZm9ybWF0LiAgICAgICovCisgIEZGX01QNF9NUDRGID0gNCwgLyoqPCBNUEVHLTQgRmlsZSBmb3JtYXQuICAgICAqLwogCi0gIEZGX1JBV1BBQ0tFVFMgICAgICAgID0gNSwgIC8qKjwgUHJvcHJpZXRhcnkgcmF3IHBhY2tldCBmaWxlLiAqLwotCi0gIEZGX0RSTUNUICAgICAgICAgICAgID0gMTIgIC8qKjwgRGlnaXRhbCBSYWRpbyBNb25kaWFsIChEUk0zMC9EUk0rKSBDVCBwcm9wcmlldGFyeSBmaWxlIGZvcm1hdC4gKi8KKyAgRkZfUkFXUEFDS0VUUyA9IDUgLyoqPCBQcm9wcmlldGFyeSByYXcgcGFja2V0IGZpbGUuICovCiAKIH0gRklMRV9GT1JNQVQ7CiAKIC8qKgogICogVHJhbnNwb3J0IHR5cGUgaWRlbnRpZmllcnMuCiAgKi8KLXR5cGVkZWYgZW51bQotewotICBUVF9VTktOT1dOICAgICAgICAgICA9IC0xLCAvKio8IFVua25vd24gZm9ybWF0LiAgICAgICAgICAgICovCi0gIFRUX01QNF9SQVcgICAgICAgICAgID0gMCwgIC8qKjwgImFzIGlzIiBhY2Nlc3MgdW5pdHMgKHBhY2tldCBiYXNlZCBzaW5jZSB0aGVyZSBpcyBvYnZpb3VzbHkgbm8gc3luYyBsYXllcikgKi8KLSAgVFRfTVA0X0FESUYgICAgICAgICAgPSAxLCAgLyoqPCBBRElGIGJpdHN0cmVhbSBmb3JtYXQuICAgICAqLwotICBUVF9NUDRfQURUUyAgICAgICAgICA9IDIsICAvKio8IEFEVFMgYml0c3RyZWFtIGZvcm1hdC4gICAgICovCit0eXBlZGVmIGVudW0geworICBUVF9VTktOT1dOID0gLTEsIC8qKjwgVW5rbm93biBmb3JtYXQuICAgICAgICAgICAgKi8KKyAgVFRfTVA0X1JBVyA9IDAsICAvKio8ICJhcyBpcyIgYWNjZXNzIHVuaXRzIChwYWNrZXQgYmFzZWQgc2luY2UgdGhlcmUgaXMKKyAgICAgICAgICAgICAgICAgICAgICBvYnZpb3VzbHkgbm8gc3luYyBsYXllcikgKi8KKyAgVFRfTVA0X0FESUYgPSAxLCAvKio8IEFESUYgYml0c3RyZWFtIGZvcm1hdC4gICAgICovCisgIFRUX01QNF9BRFRTID0gMiwgLyoqPCBBRFRTIGJpdHN0cmVhbSBmb3JtYXQuICAgICAqLwogCi0gIFRUX01QNF9MQVRNX01DUDEgICAgID0gNiwgIC8qKjwgQXVkaW8gTXV4IEVsZW1lbnRzIHdpdGggbXV4Q29uZmlnUHJlc2VudCA9IDEgKi8KLSAgVFRfTVA0X0xBVE1fTUNQMCAgICAgPSA3LCAgLyoqPCBBdWRpbyBNdXggRWxlbWVudHMgd2l0aCBtdXhDb25maWdQcmVzZW50ID0gMCwgb3V0IG9mIGJhbmQgU3RyZWFtTXV4Q29uZmlnICovCisgIFRUX01QNF9MQVRNX01DUDEgPSA2LCAvKio8IEF1ZGlvIE11eCBFbGVtZW50cyB3aXRoIG11eENvbmZpZ1ByZXNlbnQgPSAxICovCisgIFRUX01QNF9MQVRNX01DUDAgPSA3LCAvKio8IEF1ZGlvIE11eCBFbGVtZW50cyB3aXRoIG11eENvbmZpZ1ByZXNlbnQgPSAwLCBvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGJhbmQgU3RyZWFtTXV4Q29uZmlnICovCiAKLSAgVFRfTVA0X0xPQVMgICAgICAgICAgPSAxMCwgLyoqPCBBdWRpbyBTeW5jIFN0cmVhbS4gICAgICAgICAqLworICBUVF9NUDRfTE9BUyA9IDEwLCAvKio8IEF1ZGlvIFN5bmMgU3RyZWFtLiAgICAgICAgICovCiAKLSAgVFRfRFJNICAgICAgICAgICAgICAgPSAxMiAgLyoqPCBEaWdpdGFsIFJhZGlvIE1vbmRpYWwgKERSTTMwL0RSTSspIGJpdHN0cmVhbSBmb3JtYXQuICovCisgIFRUX0RSTSA9IDEyIC8qKjwgRGlnaXRhbCBSYWRpbyBNb25kaWFsIChEUk0zMC9EUk0rKSBiaXRzdHJlYW0gZm9ybWF0LiAqLwogCiB9IFRSQU5TUE9SVF9UWVBFOwogCi0jZGVmaW5lIFRUX0lTX1BBQ0tFVCh4KSBcCi0gICAgICAgKCAoKHgpID09IFRUX01QNF9SQVcpIFwKLSAgICAgIHx8ICgoeCkgPT0gVFRfRFJNKSBcCi0gICAgICB8fCAoKHgpID09IFRUX01QNF9MQVRNX01DUDApIFwKLSAgICAgIHx8ICgoeCkgPT0gVFRfTVA0X0xBVE1fTUNQMSkgKQorI2RlZmluZSBUVF9JU19QQUNLRVQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKHgpID09IFRUX01QNF9SQVcpIHx8ICgoeCkgPT0gVFRfRFJNKSB8fCAoKHgpID09IFRUX01QNF9MQVRNX01DUDApIHx8IFwKKyAgICgoeCkgPT0gVFRfTVA0X0xBVE1fTUNQMSkpCiAKIC8qKgogICogQXVkaW8gT2JqZWN0IFR5cGUgZGVmaW5pdGlvbnMuCiAgKi8KLXR5cGVkZWYgZW51bQotewotICBBT1RfTk9ORSAgICAgICAgICAgICA9IC0xLAotICBBT1RfTlVMTF9PQkpFQ1QgICAgICA9IDAsCi0gIEFPVF9BQUNfTUFJTiAgICAgICAgID0gMSwgLyoqPCBNYWluIHByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBT1RfQUFDX0xDICAgICAgICAgICA9IDIsIC8qKjwgTG93IENvbXBsZXhpdHkgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQU9UX0FBQ19TU1IgICAgICAgICAgPSAzLAotICBBT1RfQUFDX0xUUCAgICAgICAgICA9IDQsCi0gIEFPVF9TQlIgICAgICAgICAgICAgID0gNSwKLSAgQU9UX0FBQ19TQ0FMICAgICAgICAgPSA2LAotICBBT1RfVFdJTl9WUSAgICAgICAgICA9IDcsCi0gIEFPVF9DRUxQICAgICAgICAgICAgID0gOCwKLSAgQU9UX0hWWEMgICAgICAgICAgICAgPSA5LAotICBBT1RfUlNWRF8xMCAgICAgICAgICA9IDEwLCAvKio8IChyZXNlcnZlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEFPVF9SU1ZEXzExICAgICAgICAgID0gMTEsIC8qKjwgKHJlc2VydmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQU9UX1RUU0kgICAgICAgICAgICAgPSAxMiwgLyoqPCBUVFNJIE9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBT1RfTUFJTl9TWU5USCAgICAgICA9IDEzLCAvKio8IE1haW4gU3ludGhldGljIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICovCi0gIEFPVF9XQVZfVEFCX1NZTlRIICAgID0gMTQsIC8qKjwgV2F2ZXRhYmxlIFN5bnRoZXNpcyBvYmplY3QgICAgICAgICAgICAgICAgKi8KLSAgQU9UX0dFTl9NSURJICAgICAgICAgPSAxNSwgLyoqPCBHZW5lcmFsIE1JREkgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAqLwordHlwZWRlZiBlbnVtIHsKKyAgQU9UX05PTkUgPSAtMSwKKyAgQU9UX05VTExfT0JKRUNUID0gMCwKKyAgQU9UX0FBQ19NQUlOID0gMSwgLyoqPCBNYWluIHByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBT1RfQUFDX0xDID0gMiwgICAvKio8IExvdyBDb21wbGV4aXR5IG9iamVjdCAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9BQUNfU1NSID0gMywKKyAgQU9UX0FBQ19MVFAgPSA0LAorICBBT1RfU0JSID0gNSwKKyAgQU9UX0FBQ19TQ0FMID0gNiwKKyAgQU9UX1RXSU5fVlEgPSA3LAorICBBT1RfQ0VMUCA9IDgsCisgIEFPVF9IVlhDID0gOSwKKyAgQU9UX1JTVkRfMTAgPSAxMCwgICAgICAgICAgLyoqPCAocmVzZXJ2ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBT1RfUlNWRF8xMSA9IDExLCAgICAgICAgICAvKio8IChyZXNlcnZlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9UVFNJID0gMTIsICAgICAgICAgICAgIC8qKjwgVFRTSSBPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX01BSU5fU1lOVEggPSAxMywgICAgICAgLyoqPCBNYWluIFN5bnRoZXRpYyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAqLworICBBT1RfV0FWX1RBQl9TWU5USCA9IDE0LCAgICAvKio8IFdhdmV0YWJsZSBTeW50aGVzaXMgb2JqZWN0ICAgICAgICAgICAgICAgICovCisgIEFPVF9HRU5fTUlESSA9IDE1LCAgICAgICAgIC8qKjwgR2VuZXJhbCBNSURJIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgQU9UX0FMR19TWU5USF9BVURfRlggPSAxNiwgLyoqPCBBbGdvcml0aG1pYyBTeW50aGVzaXMgYW5kIEF1ZGlvIEZYIG9iamVjdCAqLwotICBBT1RfRVJfQUFDX0xDICAgICAgICA9IDE3LCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQUFDIExvdyBDb21wbGV4aXR5ICAgICovCi0gIEFPVF9SU1ZEXzE4ICAgICAgICAgID0gMTgsIC8qKjwgKHJlc2VydmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQU9UX0VSX0FBQ19MVFAgICAgICAgPSAxOSwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBMVFAgb2JqZWN0ICAgICAgICAqLwotICBBT1RfRVJfQUFDX1NDQUwgICAgICA9IDIwLCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQUFDIFNjYWxhYmxlIG9iamVjdCAgICovCi0gIEFPVF9FUl9UV0lOX1ZRICAgICAgID0gMjEsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBUd2luVlEgb2JqZWN0ICAgICAgICAgKi8KLSAgQU9UX0VSX0JTQUMgICAgICAgICAgPSAyMiwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEJTQUMgb2JqZWN0ICAgICAgICAgICAqLwotICBBT1RfRVJfQUFDX0xEICAgICAgICA9IDIzLCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQUFDIExvd0RlbGF5IG9iamVjdCAgICovCi0gIEFPVF9FUl9DRUxQICAgICAgICAgID0gMjQsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBDRUxQIG9iamVjdCAgICAgICAgICAgKi8KLSAgQU9UX0VSX0hWWEMgICAgICAgICAgPSAyNSwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEhWWEMgb2JqZWN0ICAgICAgICAgICAqLwotICBBT1RfRVJfSElMTiAgICAgICAgICA9IDI2LCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgSElMTiBvYmplY3QgICAgICAgICAgICovCi0gIEFPVF9FUl9QQVJBICAgICAgICAgID0gMjcsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBQYXJhbWV0cmljIG9iamVjdCAgICAgKi8KLSAgQU9UX1JTVkRfMjggICAgICAgICAgPSAyOCwgLyoqPCBtaWdodCBiZWNvbWUgU1NDICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBT1RfUFMgICAgICAgICAgICAgICA9IDI5LCAvKio8IFBTLCBQYXJhbWV0cmljIFN0ZXJlbyAoaW5jbHVkZXMgU0JSKSAgICAgICovCi0gIEFPVF9NUEVHUyAgICAgICAgICAgID0gMzAsIC8qKjwgTVBFRyBTdXJyb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX0VSX0FBQ19MQyA9IDE3LCAgICAgICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBMb3cgQ29tcGxleGl0eSAgICAqLworICBBT1RfUlNWRF8xOCA9IDE4LCAgICAgICAgICAvKio8IChyZXNlcnZlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFPVF9FUl9BQUNfTFRQID0gMTksICAgICAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgTFRQIG9iamVjdCAgICAgICAgKi8KKyAgQU9UX0VSX0FBQ19TQ0FMID0gMjAsICAgICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBTY2FsYWJsZSBvYmplY3QgICAqLworICBBT1RfRVJfVFdJTl9WUSA9IDIxLCAgICAgICAvKio8IEVycm9yIFJlc2lsaWVudChFUikgVHdpblZRIG9iamVjdCAgICAgICAgICovCisgIEFPVF9FUl9CU0FDID0gMjIsICAgICAgICAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBCU0FDIG9iamVjdCAgICAgICAgICAgKi8KKyAgQU9UX0VSX0FBQ19MRCA9IDIzLCAgICAgICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBMb3dEZWxheSBvYmplY3QgICAqLworICBBT1RfRVJfQ0VMUCA9IDI0LCAgICAgICAgICAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQ0VMUCBvYmplY3QgICAgICAgICAgICovCisgIEFPVF9FUl9IVlhDID0gMjUsICAgICAgICAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBIVlhDIG9iamVjdCAgICAgICAgICAgKi8KKyAgQU9UX0VSX0hJTE4gPSAyNiwgICAgICAgICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEhJTE4gb2JqZWN0ICAgICAgICAgICAqLworICBBT1RfRVJfUEFSQSA9IDI3LCAgICAgICAgICAvKio8IEVycm9yIFJlc2lsaWVudChFUikgUGFyYW1ldHJpYyBvYmplY3QgICAgICovCisgIEFPVF9SU1ZEXzI4ID0gMjgsICAgICAgICAgIC8qKjwgbWlnaHQgYmVjb21lIFNTQyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX1BTID0gMjksICAgICAgICAgICAgICAgLyoqPCBQUywgUGFyYW1ldHJpYyBTdGVyZW8gKGluY2x1ZGVzIFNCUikgICAgICAqLworICBBT1RfTVBFR1MgPSAzMCwgICAgICAgICAgICAvKio8IE1QRUcgU3Vycm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLSAgQU9UX0VTQ0FQRSAgICAgICAgICAgPSAzMSwgLyoqPCBTaWduYWwgQU9UIHVzZXMgbW9yZSB0aGFuIDUgYml0cyAgICAgICAgICAqLworICBBT1RfRVNDQVBFID0gMzEsIC8qKjwgU2lnbmFsIEFPVCB1c2VzIG1vcmUgdGhhbiA1IGJpdHMgICAgICAgICAgKi8KIAotICBBT1RfTVAzT05NUDRfTDEgICAgICA9IDMyLCAvKio8IE1QRUctTGF5ZXIxIGluIG1wNCAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEFPVF9NUDNPTk1QNF9MMiAgICAgID0gMzMsIC8qKjwgTVBFRy1MYXllcjIgaW4gbXA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQU9UX01QM09OTVA0X0wzICAgICAgPSAzNCwgLyoqPCBNUEVHLUxheWVyMyBpbiBtcDQgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBT1RfUlNWRF8zNSAgICAgICAgICA9IDM1LCAvKio8IG1pZ2h0IGJlY29tZSBEU1QgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEFPVF9SU1ZEXzM2ICAgICAgICAgID0gMzYsIC8qKjwgbWlnaHQgYmVjb21lIEFMUyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQU9UX0FBQ19TTFMgICAgICAgICAgPSAzNywgLyoqPCBBQUMgKyBTTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBBT1RfU0xTICAgICAgICAgICAgICA9IDM4LCAvKio8IFNMUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEFPVF9FUl9BQUNfRUxEICAgICAgID0gMzksIC8qKjwgQUFDIEVuaGFuY2VkIExvdyBEZWxheSAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX01QM09OTVA0X0wxID0gMzIsIC8qKjwgTVBFRy1MYXllcjEgaW4gbXA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX01QM09OTVA0X0wyID0gMzMsIC8qKjwgTVBFRy1MYXllcjIgaW4gbXA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX01QM09OTVA0X0wzID0gMzQsIC8qKjwgTVBFRy1MYXllcjMgaW4gbXA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX1JTVkRfMzUgPSAzNSwgICAgIC8qKjwgbWlnaHQgYmVjb21lIERTVCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX1JTVkRfMzYgPSAzNiwgICAgIC8qKjwgbWlnaHQgYmVjb21lIEFMUyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX0FBQ19TTFMgPSAzNywgICAgIC8qKjwgQUFDICsgU0xTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX1NMUyA9IDM4LCAgICAgICAgIC8qKjwgU0xTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQU9UX0VSX0FBQ19FTEQgPSAzOSwgIC8qKjwgQUFDIEVuaGFuY2VkIExvdyBEZWxheSAgICAgICAgICAgICAgICAgICAgKi8KIAotICBBT1RfVVNBQyAgICAgICAgICAgICA9IDQyLCAvKio8IFVTQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEFPVF9TQU9DICAgICAgICAgICAgID0gNDMsIC8qKjwgU0FPQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgQU9UX0xEX01QRUdTICAgICAgICAgPSA0NCwgLyoqPCBMb3cgRGVsYXkgTVBFRyBTdXJyb3VuZCAgICAgICAgICAgICAgICAgICAqLworICBBT1RfVVNBQyA9IDQyLCAgICAgLyoqPCBVU0FDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBT1RfU0FPQyA9IDQzLCAgICAgLyoqPCBTQU9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBBT1RfTERfTVBFR1MgPSA0NCwgLyoqPCBMb3cgRGVsYXkgTVBFRyBTdXJyb3VuZCAgICAgICAgICAgICAgICAgICAqLwogCiAgIC8qIFBzZXVkbyBBT1RzICovCi0gIEFPVF9EUk1fQUFDICAgICAgICAgID0gMTQzLCAvKio8IFZpcnR1YWwgQU9UIGZvciBEUk0gKEVSLUFBQy1TQ0FMIHdpdGhvdXQgU0JSKSAgICAgICAgICAqLwotICBBT1RfRFJNX1NCUiAgICAgICAgICA9IDE0NCwgLyoqPCBWaXJ0dWFsIEFPVCBmb3IgRFJNIChFUi1BQUMtU0NBTCB3aXRoIFNCUikgICAgICAgICAgICAgKi8KLSAgQU9UX0RSTV9NUEVHX1BTICAgICAgPSAxNDUgIC8qKjwgVmlydHVhbCBBT1QgZm9yIERSTSAoRVItQUFDLVNDQUwgd2l0aCBTQlIgYW5kIE1QRUctUFMpICovCisgIEFPVF9NUDJfQUFDX0xDID0gMTI5LCAvKio8IFZpcnR1YWwgQU9UIE1QMiBMb3cgQ29tcGxleGl0eSBwcm9maWxlICovCisgIEFPVF9NUDJfU0JSID0gMTMyLCAvKio8IFZpcnR1YWwgQU9UIE1QMiBMb3cgQ29tcGxleGl0eSBQcm9maWxlIHdpdGggU0JSICAgICovCisKKyAgQU9UX0RSTV9BQUMgPSAxNDMsIC8qKjwgVmlydHVhbCBBT1QgZm9yIERSTSAoRVItQUFDLVNDQUwgd2l0aG91dCBTQlIpICovCisgIEFPVF9EUk1fU0JSID0gMTQ0LCAvKio8IFZpcnR1YWwgQU9UIGZvciBEUk0gKEVSLUFBQy1TQ0FMIHdpdGggU0JSKSAqLworICBBT1RfRFJNX01QRUdfUFMgPQorICAgICAgMTQ1LCAvKio8IFZpcnR1YWwgQU9UIGZvciBEUk0gKEVSLUFBQy1TQ0FMIHdpdGggU0JSIGFuZCBNUEVHLVBTKSAqLworICBBT1RfRFJNX1NVUlJPVU5EID0KKyAgICAgIDE0NiwgLyoqPCBWaXJ0dWFsIEFPVCBmb3IgRFJNIFN1cnJvdW5kIChFUi1BQUMtU0NBTCAoK1NCUikgK01QUykgKi8KKyAgQU9UX0RSTV9VU0FDID0gMTQ3IC8qKjwgVmlydHVhbCBBT1QgZm9yIERSTSB3aXRoIFVTQUMgKi8KIAogfSBBVURJT19PQkpFQ1RfVFlQRTsKIAotI2RlZmluZSBDQU5fRE9fUFMoYW90KSBcCi0gICgoYW90KSA9PSBBT1RfQUFDX0xDIFwKLXx8IChhb3QpID09IEFPVF9TQlIgXAotfHwgKGFvdCkgPT0gQU9UX1BTIFwKLXx8IChhb3QpID09IEFPVF9FUl9CU0FDIFwKLXx8IChhb3QpID09IEFPVF9EUk1fQUFDKQorI2RlZmluZSBDQU5fRE9fUFMoYW90KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoYW90KSA9PSBBT1RfQUFDX0xDIHx8IChhb3QpID09IEFPVF9TQlIgfHwgKGFvdCkgPT0gQU9UX1BTIHx8IFwKKyAgIChhb3QpID09IEFPVF9FUl9CU0FDIHx8IChhb3QpID09IEFPVF9EUk1fQUFDKQogCi0jZGVmaW5lIElTX1VTQUMoYW90KSBcCi0gICgoYW90KSA9PSBBT1RfVVNBQykKKyNkZWZpbmUgSVNfVVNBQyhhb3QpICgoYW90KSA9PSBBT1RfVVNBQykKIAotI2RlZmluZSBJU19MT1dERUxBWShhb3QpIFwKLSAgKChhb3QpID09IEFPVF9FUl9BQUNfTEQgXAotfHwgKGFvdCkgPT0gQU9UX0VSX0FBQ19FTEQpCisjZGVmaW5lIElTX0xPV0RFTEFZKGFvdCkgKChhb3QpID09IEFPVF9FUl9BQUNfTEQgfHwgKGFvdCkgPT0gQU9UX0VSX0FBQ19FTEQpCiAKLS8qKiBDaGFubmVsIE1vZGUgKCAxLTcgZXF1YWxzIE1QRUcgY2hhbm5lbCBjb25maWd1cmF0aW9ucywgb3RoZXJzIGFyZSBhcmJpdHJhcnkpLiAqLworLyoqIENoYW5uZWwgTW9kZSAoIDEtNyBlcXVhbHMgTVBFRyBjaGFubmVsIGNvbmZpZ3VyYXRpb25zLCBvdGhlcnMgYXJlCisgKiBhcmJpdHJhcnkpLiAqLwogdHlwZWRlZiBlbnVtIHsKLSAgTU9ERV9JTlZBTElEICAgICAgICAgICAgICAgICAgPSAtMSwKLSAgTU9ERV9VTktOT1dOICAgICAgICAgICAgICAgICAgPSAgMCwKLSAgTU9ERV8xICAgICAgICAgICAgICAgICAgICAgICAgPSAgMSwgICAgICAgLyoqPCBDICovCi0gIE1PREVfMiAgICAgICAgICAgICAgICAgICAgICAgID0gIDIsICAgICAgIC8qKjwgTCtSICovCi0gIE1PREVfMV8yICAgICAgICAgICAgICAgICAgICAgID0gIDMsICAgICAgIC8qKjwgQywgTCtSICovCi0gIE1PREVfMV8yXzEgICAgICAgICAgICAgICAgICAgID0gIDQsICAgICAgIC8qKjwgQywgTCtSLCBSZWFyICovCi0gIE1PREVfMV8yXzIgICAgICAgICAgICAgICAgICAgID0gIDUsICAgICAgIC8qKjwgQywgTCtSLCBMUytSUyAqLwotICBNT0RFXzFfMl8yXzEgICAgICAgICAgICAgICAgICA9ICA2LCAgICAgICAvKio8IEMsIEwrUiwgTFMrUlMsIExGRSAqLwotICBNT0RFXzFfMl8yXzJfMSAgICAgICAgICAgICAgICA9ICA3LCAgICAgICAvKio8IEMsIExDK1JDLCBMK1IsIExTK1JTLCBMRkUgKi8KKyAgTU9ERV9JTlZBTElEID0gLTEsCisgIE1PREVfVU5LTk9XTiA9IDAsCisgIE1PREVfMSA9IDEsICAgICAgICAgLyoqPCBDICovCisgIE1PREVfMiA9IDIsICAgICAgICAgLyoqPCBMK1IgKi8KKyAgTU9ERV8xXzIgPSAzLCAgICAgICAvKio8IEMsIEwrUiAqLworICBNT0RFXzFfMl8xID0gNCwgICAgIC8qKjwgQywgTCtSLCBSZWFyICovCisgIE1PREVfMV8yXzIgPSA1LCAgICAgLyoqPCBDLCBMK1IsIExTK1JTICovCisgIE1PREVfMV8yXzJfMSA9IDYsICAgLyoqPCBDLCBMK1IsIExTK1JTLCBMRkUgKi8KKyAgTU9ERV8xXzJfMl8yXzEgPSA3LCAvKio8IEMsIExDK1JDLCBMK1IsIExTK1JTLCBMRkUgKi8KIAorICBNT0RFXzZfMSA9IDExLCAgICAgICAgICAgLyoqPCBDLCBMK1IsIExTK1JTLCBDcmVhciwgTEZFICovCisgIE1PREVfN18xX0JBQ0sgPSAxMiwgICAgICAvKio8IEMsIEwrUiwgTFMrUlMsIExyZWFyK1JyZWFyLCBMRkUgKi8KKyAgTU9ERV83XzFfVE9QX0ZST05UID0gMTQsIC8qKjwgQywgTCtSLCBMUytSUywgTEZFLCBMdG9wK1J0b3AgKi8KIAotICBNT0RFXzFfMSAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgICAgICAvKio8IDIgU0NFcyAoZHVhbCBtb25vKSAqLwotICBNT0RFXzFfMV8xXzEgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAvKio8IDQgU0NFcyAqLwotICBNT0RFXzFfMV8xXzFfMV8xICAgICAgICAgICAgICA9IDE4LCAgICAgICAvKio8IDYgU0NFcyAqLwotICBNT0RFXzFfMV8xXzFfMV8xXzFfMSAgICAgICAgICA9IDE5LCAgICAgICAvKio8IDggU0NFcyAqLwotICBNT0RFXzFfMV8xXzFfMV8xXzFfMV8xXzFfMV8xICA9IDIwLCAgICAgICAvKio8IDEyIFNDRXMgKi8KKyAgTU9ERV83XzFfUkVBUl9TVVJST1VORCA9IDMzLCAvKio8IEMsIEwrUiwgTFMrUlMsIExyZWFyK1JyZWFyLCBMRkUgKi8KKyAgTU9ERV83XzFfRlJPTlRfQ0VOVEVSID0gMzQsICAvKio8IEMsIExDK1JDLCBMK1IsIExTK1JTLCBMRkUgKi8KIAotICBNT0RFXzJfMiAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAvKio8IDIgQ1BFcyAqLwotICBNT0RFXzJfMl8yICAgICAgICAgICAgICAgICAgICA9IDIyLCAgICAgICAvKio8IDMgQ1BFcyAqLwotICBNT0RFXzJfMl8yXzIgICAgICAgICAgICAgICAgICA9IDIzLCAgICAgICAvKio8IDQgQ1BFcyAqLwotICBNT0RFXzJfMl8yXzJfMl8yICAgICAgICAgICAgICA9IDI0LCAgICAgICAvKio8IDYgQ1BFcyAqLwotCi0gIE1PREVfMl8xICAgICAgICAgICAgICAgICAgICAgID0gMzAsICAgICAgIC8qKjwgQ1BFLFNDRSAoQVJJQiBzdGFuZGFyZCBCMzIpICovCi0KLSAgTU9ERV83XzFfUkVBUl9TVVJST1VORCAgICAgICAgPSAzMywgICAgICAgLyoqPCBDLCBMK1IsIExTK1JTLCBMcmVhcitScmVhciwgTEZFICovCi0gIE1PREVfN18xX0ZST05UX0NFTlRFUiAgICAgICAgID0gMzQgICAgICAgIC8qKjwgQywgTEMrUkMsIEwrUiwgTFMrUlMsIExGRSAqLworICBNT0RFXzIxMiA9IDEyOCAvKio8IDIxMiBjb25maWd1cmF0aW9uLCB1c2VkIGluIEVMRHYyICovCiAKIH0gQ0hBTk5FTF9NT0RFOwogCiAvKioKICAqIFNwZWFrZXIgZGVzY3JpcHRpb24gdGFncy4KLSAqIERvIG5vdCBjaGFuZ2UgdGhlIGVudW1lcmF0aW9uIHZhbHVlcyB1bmxlc3MgaXQga2VlcHMgdGhlIGZvbGxvd2luZyBzZWdtZW50YXRpb246CisgKiBEbyBub3QgY2hhbmdlIHRoZSBlbnVtZXJhdGlvbiB2YWx1ZXMgdW5sZXNzIGl0IGtlZXBzIHRoZSBmb2xsb3dpbmcKKyAqIHNlZ21lbnRhdGlvbjoKICAqIC0gQml0IDAtMzogSG9yaXpvbnRhbCBwb3N0aW9uICgwOiBub25lLCAxOiBmcm9udCwgMjogc2lkZSwgMzogYmFjaywgNDogbGZlKQogICogLSBCaXQgNC03OiBWZXJ0aWNhbCBwb3NpdGlvbiAoMDogbm9ybWFsLCAxOiB0b3AsIDI6IGJvdHRvbSkKICAqLwogdHlwZWRlZiBlbnVtIHsKLSAgQUNUX05PTkUgICAgICAgICA9IDB4MDAsCi0gIEFDVF9GUk9OVCAgICAgICAgPSAweDAxLCAgLyohPCBGcm9udCBzcGVha2VyIHBvc2l0aW9uIChhdCBub3JtYWwgaGVpZ2h0KSAqLwotICBBQ1RfU0lERSAgICAgICAgID0gMHgwMiwgIC8qITwgU2lkZSBzcGVha2VyIHBvc2l0aW9uIChhdCBub3JtYWwgaGVpZ2h0KSAqLwotICBBQ1RfQkFDSyAgICAgICAgID0gMHgwMywgIC8qITwgQmFjayBzcGVha2VyIHBvc2l0aW9uIChhdCBub3JtYWwgaGVpZ2h0KSAqLwotICBBQ1RfTEZFICAgICAgICAgID0gMHgwNCwgIC8qITwgTG93IGZyZXF1ZW5jeSBlZmZlY3Qgc3BlYWtlciBwb3N0aW9uIChmcm9udCkgKi8KKyAgQUNUX05PTkUgPSAweDAwLAorICBBQ1RfRlJPTlQgPSAweDAxLCAvKiE8IEZyb250IHNwZWFrZXIgcG9zaXRpb24gKGF0IG5vcm1hbCBoZWlnaHQpICovCisgIEFDVF9TSURFID0gMHgwMiwgIC8qITwgU2lkZSBzcGVha2VyIHBvc2l0aW9uIChhdCBub3JtYWwgaGVpZ2h0KSAqLworICBBQ1RfQkFDSyA9IDB4MDMsICAvKiE8IEJhY2sgc3BlYWtlciBwb3NpdGlvbiAoYXQgbm9ybWFsIGhlaWdodCkgKi8KKyAgQUNUX0xGRSA9IDB4MDQsICAgLyohPCBMb3cgZnJlcXVlbmN5IGVmZmVjdCBzcGVha2VyIHBvc3Rpb24gKGZyb250KSAqLwogCi0gIEFDVF9UT1AgICAgICAgICAgPSAweDEwLCAgLyohPCBUb3Agc3BlYWtlciBhcmVhIChmb3IgY29tYmluYXRpb24gd2l0aCBzcGVha2VyIHBvc2l0aW9ucykgKi8KLSAgQUNUX0ZST05UX1RPUCAgICA9IDB4MTEsICAvKiE8IFRvcCBmcm9udCBzcGVha2VyID0gKEFDVF9GUk9OVHxBQ1RfVE9QKSAqLwotICBBQ1RfU0lERV9UT1AgICAgID0gMHgxMiwgIC8qITwgVG9wIHNpZGUgc3BlYWtlciAgPSAoQUNUX1NJREUgfEFDVF9UT1ApICovCi0gIEFDVF9CQUNLX1RPUCAgICAgPSAweDEzLCAgLyohPCBUb3AgYmFjayBzcGVha2VyICA9IChBQ1RfQkFDSyB8QUNUX1RPUCkgKi8KKyAgQUNUX1RPUCA9CisgICAgICAweDEwLCAvKiE8IFRvcCBzcGVha2VyIGFyZWEgKGZvciBjb21iaW5hdGlvbiB3aXRoIHNwZWFrZXIgcG9zaXRpb25zKSAqLworICBBQ1RfRlJPTlRfVE9QID0gMHgxMSwgLyohPCBUb3AgZnJvbnQgc3BlYWtlciA9IChBQ1RfRlJPTlR8QUNUX1RPUCkgKi8KKyAgQUNUX1NJREVfVE9QID0gMHgxMiwgIC8qITwgVG9wIHNpZGUgc3BlYWtlciAgPSAoQUNUX1NJREUgfEFDVF9UT1ApICovCisgIEFDVF9CQUNLX1RPUCA9IDB4MTMsICAvKiE8IFRvcCBiYWNrIHNwZWFrZXIgID0gKEFDVF9CQUNLIHxBQ1RfVE9QKSAqLwogCi0gIEFDVF9CT1RUT00gICAgICAgPSAweDIwLCAgLyohPCBCb3R0b20gc3BlYWtlciBhcmVhIChmb3IgY29tYmluYXRpb24gd2l0aCBzcGVha2VyIHBvc2l0aW9ucykgKi8KLSAgQUNUX0ZST05UX0JPVFRPTSA9IDB4MjEsICAvKiE8IEJvdHRvbSBmcm9udCBzcGVha2VyID0gKEFDVF9GUk9OVHxBQ1RfQk9UVE9NKSAqLwotICBBQ1RfU0lERV9CT1RUT00gID0gMHgyMiwgIC8qITwgQm90dG9tIHNpZGUgc3BlYWtlciAgPSAoQUNUX1NJREUgfEFDVF9CT1RUT00pICovCi0gIEFDVF9CQUNLX0JPVFRPTSAgPSAweDIzICAgLyohPCBCb3R0b20gYmFjayBzcGVha2VyICA9IChBQ1RfQkFDSyB8QUNUX0JPVFRPTSkgKi8KKyAgQUNUX0JPVFRPTSA9CisgICAgICAweDIwLCAvKiE8IEJvdHRvbSBzcGVha2VyIGFyZWEgKGZvciBjb21iaW5hdGlvbiB3aXRoIHNwZWFrZXIgcG9zaXRpb25zKSAqLworICBBQ1RfRlJPTlRfQk9UVE9NID0gMHgyMSwgLyohPCBCb3R0b20gZnJvbnQgc3BlYWtlciA9IChBQ1RfRlJPTlR8QUNUX0JPVFRPTSkgKi8KKyAgQUNUX1NJREVfQk9UVE9NID0gMHgyMiwgIC8qITwgQm90dG9tIHNpZGUgc3BlYWtlciAgPSAoQUNUX1NJREUgfEFDVF9CT1RUT00pICovCisgIEFDVF9CQUNLX0JPVFRPTSA9IDB4MjMgICAvKiE8IEJvdHRvbSBiYWNrIHNwZWFrZXIgID0gKEFDVF9CQUNLIHxBQ1RfQk9UVE9NKSAqLwogCiB9IEFVRElPX0NIQU5ORUxfVFlQRTsKIAotdHlwZWRlZiBlbnVtCi17Ci0gIFNJR19VTktOT1dOICAgICAgICAgICAgICAgICA9IC0xLAotICBTSUdfSU1QTElDSVQgICAgICAgICAgICAgICAgPSAgMCwKLSAgU0lHX0VYUExJQ0lUX0JXX0NPTVBBVElCTEUgID0gIDEsCi0gIFNJR19FWFBMSUNJVF9ISUVSQVJDSElDQUwgICA9ICAyCit0eXBlZGVmIGVudW0geworICBTSUdfVU5LTk9XTiA9IC0xLAorICBTSUdfSU1QTElDSVQgPSAwLAorICBTSUdfRVhQTElDSVRfQldfQ09NUEFUSUJMRSA9IDEsCisgIFNJR19FWFBMSUNJVF9ISUVSQVJDSElDQUwgPSAyCiAKIH0gU0JSX1BTX1NJR05BTElORzsKIAogLyoqCiAgKiBBdWRpbyBDb2RlYyBmbGFncy4KICAqLwotI2RlZmluZSBBQ19FUl9WQ0IxMSAgICAgMHgwMDAwMDEgIC8qITwgYWFjU2VjdGlvbkRhdGFSZXNpbGllbmNlRmxhZyAgICAgZmxhZyAoZnJvbSBBU0MpOiAxIG1lYW5zIHVzZSB2aXJ0dWFsIGNvZGVib29rcyAgKi8KLSNkZWZpbmUgQUNfRVJfUlZMQyAgICAgIDB4MDAwMDAyICAvKiE8IGFhY1NwZWN0cmFsRGF0YVJlc2lsaWVuY2VGbGFnICAgICBmbGFnIChmcm9tIEFTQyk6IDEgbWVhbnMgdXNlIGh1ZmZtYW4gY29kZXdvcmQgcmVvcmRlcmluZyAqLwotI2RlZmluZSBBQ19FUl9IQ1IgICAgICAgMHgwMDAwMDQgIC8qITwgYWFjU2VjdGlvbkRhdGFSZXNpbGllbmNlRmxhZyAgICAgZmxhZyAoZnJvbSBBU0MpOiAxIG1lYW5zIHVzZSB2aXJ0dWFsIGNvZGVib29rcyAgKi8KLSNkZWZpbmUgQUNfU0NBTEFCTEUgICAgIDB4MDAwMDA4ICAvKiE8IEFBQyBTY2FsYWJsZSovCi0jZGVmaW5lIEFDX0VMRCAgICAgICAgICAweDAwMDAxMCAgLyohPCBBQUMtRUxEICovCi0jZGVmaW5lIEFDX0xEICAgICAgICAgICAweDAwMDAyMCAgLyohPCBBQUMtTEQgKi8KLSNkZWZpbmUgQUNfRVIgICAgICAgICAgIDB4MDAwMDQwICAvKiE8IEVSIHN5bnRheCAqLwotI2RlZmluZSBBQ19CU0FDICAgICAgICAgMHgwMDAwODAgIC8qITwgQlNBQyAqLwotI2RlZmluZSBBQ19VU0FDICAgICAgICAgMHgwMDAxMDAgIC8qITwgVVNBQyAqLwotI2RlZmluZSBBQ19VU0FDX1RXICAgICAgMHgwMDAyMDAgIC8qITwgVVNBQyB0aW1lIHdhcnBlZCBmaWx0ZXIgYmFuayBpcyBhY3RpdmUgKi8KLSNkZWZpbmUgQUNfVVNBQ19OT0lTRSAgIDB4MDAwNDAwICAvKiE8IFVTQUMgbm9pc2UgZmlsbGluZyBpcyBhY3RpdmUgKi8KLSNkZWZpbmUgQUNfVVNBQ19IQkUgICAgIDB4MDAwODAwICAvKiE8IFVTQUMgaGFybW9uaWMgYmFuZHdpZHRoIGV4dGVuc2lvbiBpcyBhY3RpdmUgKi8KLSNkZWZpbmUgQUNfUlNWRDUwICAgICAgIDB4MDAxMDAwICAvKiE8IFJzdmQ1MCAqLwotI2RlZmluZSBBQ19TQlJfUFJFU0VOVCAgMHgwMDIwMDAgIC8qITwgU0JSIHByZXNlbnQgZmxhZyAoZnJvbSBBU0MpICAgICAgICAgICAgICovCi0jZGVmaW5lIEFDX1NCUkNSQyAgICAgICAweDAwNDAwMCAgLyohPCBTQlIgQ1JDIHByZXNlbnQgZmxhZy4gT25seSByZWxldmFudCBmb3IgQUFDLUVMRCBmb3Igbm93LiAqLwotI2RlZmluZSBBQ19QU19QUkVTRU5UICAgMHgwMDgwMDAgIC8qITwgUFMgcHJlc2VudCBmbGFnIChmcm9tIEFTQyBvciBpbXBsaWNpdCkgICovCi0jZGVmaW5lIEFDX01QU19QUkVTRU5UICAweDAxMDAwMCAgLyohPCBNUFMgcHJlc2VudCBmbGFnIChmcm9tIEFTQyBvciBpbXBsaWNpdCkgKi8KLSNkZWZpbmUgQUNfRFJNICAgICAgICAgIDB4MDIwMDAwICAvKiE8IERSTSBiaXQgc3RyZWFtIHN5bnRheCAqLwotI2RlZmluZSBBQ19JTkRFUCAgICAgICAgMHgwNDAwMDAgIC8qITwgSW5kZXBlbmRlbmN5IGZsYWcgKi8KLSNkZWZpbmUgQUNfTVBTX1JFUyAgICAgIDB4MDgwMDAwICAvKiE8IE1QUyByZXNpZHVhbCBpbmRpdmlkdWFsIGNoYW5uZWwgZGF0YS4gKi8KLSNkZWZpbmUgQUNfREFCICAgICAgICAgIDB4ODAwMDAwICAvKiE8IERBQiBiaXQgc3RyZWFtIHN5bnRheCAqLwotI2RlZmluZSBBQ19MRF9NUFMgICAgIDB4MDEwMDAwMDAgIC8qITwgTG93IERlbGF5IE1QUy4gKi8KKyNkZWZpbmUgQUNfRVJfVkNCMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDEgLyohPCBhYWNTZWN0aW9uRGF0YVJlc2lsaWVuY2VGbGFnICAgICBmbGFnIChmcm9tIEFTQyk6IDEgbWVhbnMgdXNlIFwKKyAgICAgICAgICAgICAgdmlydHVhbCBjb2RlYm9va3MgICovCisjZGVmaW5lIEFDX0VSX1JWTEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMiAvKiE8IGFhY1NwZWN0cmFsRGF0YVJlc2lsaWVuY2VGbGFnICAgICBmbGFnIChmcm9tIEFTQyk6IDEgbWVhbnMgdXNlIFwKKyAgICAgICAgICAgICAgaHVmZm1hbiBjb2Rld29yZCByZW9yZGVyaW5nICovCisjZGVmaW5lIEFDX0VSX0hDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDA0IC8qITwgYWFjU2VjdGlvbkRhdGFSZXNpbGllbmNlRmxhZyAgICAgZmxhZyAoZnJvbSBBU0MpOiAxIG1lYW5zIHVzZSBcCisgICAgICAgICAgICAgIHZpcnR1YWwgY29kZWJvb2tzICAqLworI2RlZmluZSBBQ19TQ0FMQUJMRSAweDAwMDAwOCAgICAvKiE8IEFBQyBTY2FsYWJsZSovCisjZGVmaW5lIEFDX0VMRCAweDAwMDAxMCAgICAgICAgIC8qITwgQUFDLUVMRCAqLworI2RlZmluZSBBQ19MRCAweDAwMDAyMCAgICAgICAgICAvKiE8IEFBQy1MRCAqLworI2RlZmluZSBBQ19FUiAweDAwMDA0MCAgICAgICAgICAvKiE8IEVSIHN5bnRheCAqLworI2RlZmluZSBBQ19CU0FDIDB4MDAwMDgwICAgICAgICAvKiE8IEJTQUMgKi8KKyNkZWZpbmUgQUNfVVNBQyAweDAwMDEwMCAgICAgICAgLyohPCBVU0FDICovCisjZGVmaW5lIEFDX1JTVjYwM0RBIDB4MDAwMjAwICAgIC8qITwgUlNWRDYwIDNEIGF1ZGlvICovCisjZGVmaW5lIEFDX0hEQUFDIDB4MDAwNDAwICAgICAgIC8qITwgSEQtQUFDICovCisjZGVmaW5lIEFDX1JTVkQ1MCAweDAwNDAwMCAgICAgIC8qITwgUnN2ZDUwICovCisjZGVmaW5lIEFDX1NCUl9QUkVTRU5UIDB4MDA4MDAwIC8qITwgU0JSIHByZXNlbnQgZmxhZyAoZnJvbSBBU0MpICovCisjZGVmaW5lIEFDX1NCUkNSQyBcCisgIDB4MDEwMDAwIC8qITwgU0JSIENSQyBwcmVzZW50IGZsYWcuIE9ubHkgcmVsZXZhbnQgZm9yIEFBQy1FTEQgZm9yIG5vdy4gKi8KKyNkZWZpbmUgQUNfUFNfUFJFU0VOVCAweDAyMDAwMCAvKiE8IFBTIHByZXNlbnQgZmxhZyAoZnJvbSBBU0Mgb3IgaW1wbGljaXQpICAqLworI2RlZmluZSBBQ19NUFNfUFJFU0VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDA0MDAwMCAgICAgICAgICAgICAgICAgICAgLyohPCBNUFMgcHJlc2VudCBmbGFnIChmcm9tIEFTQyBvciBpbXBsaWNpdCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFDX0RSTSAweDA4MDAwMCAgICAgICAvKiE8IERSTSBiaXQgc3RyZWFtIHN5bnRheCAqLworI2RlZmluZSBBQ19JTkRFUCAweDEwMDAwMCAgICAgLyohPCBJbmRlcGVuZGVuY3kgZmxhZyAqLworI2RlZmluZSBBQ19NUEVHRF9SRVMgMHgyMDAwMDAgLyohPCBNUEVHLUQgcmVzaWR1YWwgaW5kaXZpZHVhbCBjaGFubmVsIGRhdGEuICovCisjZGVmaW5lIEFDX1NBT0NfUFJFU0VOVCAweDQwMDAwMCAgIC8qITwgU0FPQyBQcmVzZW50IEZsYWcgKi8KKyNkZWZpbmUgQUNfREFCIDB4ODAwMDAwICAgICAgICAgICAgLyohPCBEQUIgYml0IHN0cmVhbSBzeW50YXggKi8KKyNkZWZpbmUgQUNfRUxEX0RPV05TQ0FMRSAweDEwMDAwMDAgLyohPCBFTEQgRG93bnNjYWxlZCBwbGF5b3V0ICovCisjZGVmaW5lIEFDX0xEX01QUyAweDIwMDAwMDAgICAgICAgIC8qITwgTG93IERlbGF5IE1QUy4gKi8KKyNkZWZpbmUgQUNfRFJDX1BSRVNFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHg0MDAwMDAwIC8qITwgRHluYW1pYyBSYW5nZSBDb250cm9sIChEUkMpIGRhdGEgZm91bmQuIFwKKyAgICAgICAgICAgICAqLworI2RlZmluZSBBQ19VU0FDX1NDRkdJMyBcCisgIDB4ODAwMDAwMCAvKiE8IFVTQUMgZmxhZzogSWYgc3RlcmVvQ29uZmlnSW5kZXggaXMgMyB0aGUgZmxhZyBpcyBzZXQuICovCisvKioKKyAqIEF1ZGlvIENvZGVjIGZsYWdzIChyZWNvbmZpZ3VyYXRpb24pLgorICovCisjZGVmaW5lIEFDX0NNX0RFVF9DRkdfQ0hBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDEgLyohPCBDb25maWcgbW9kZSBzaWduYWxpemVzIHRoZSBjYWxsYmFjayB0byB3b3JrIGluIGNvbmZpZyBjaGFuZ2UgXAorICAgICAgICAgICAgICBkZXRlY3Rpb24gbW9kZSAqLworI2RlZmluZSBBQ19DTV9BTExPQ19NRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDIgLyohPCBDb25maWcgbW9kZSBzaWduYWxpemVzIHRoZSBjYWxsYmFjayB0byB3b3JrIGluIG1lbW9yeSBcCisgICAgICAgICAgICAgIGFsbG9jYXRpb24gbW9kZSAqLwogCisvKioKKyAqIEF1ZGlvIENvZGVjIGZsYWdzIChlbGVtZW50IHNwZWNpZmljKS4KKyAqLworI2RlZmluZSBBQ19FTF9VU0FDX1RXIDB4MDAwMDAxICAgIC8qITwgVVNBQyB0aW1lIHdhcnBlZCBmaWx0ZXIgYmFuayBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgQUNfRUxfVVNBQ19OT0lTRSAweDAwMDAwMiAvKiE8IFVTQUMgbm9pc2UgZmlsbGluZyBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgQUNfRUxfVVNBQ19JVEVTIDB4MDAwMDA0ICAvKiE8IFVTQUMgU0JSIGludGVyLVRFUyB0b29sIGlzIGFjdGl2ZSAqLworI2RlZmluZSBBQ19FTF9VU0FDX1BWQyBcCisgIDB4MDAwMDA4IC8qITwgVVNBQyBTQlIgcHJlZGljdGl2ZSB2ZWN0b3IgY29kaW5nIHRvb2wgaXMgYWN0aXZlICovCisjZGVmaW5lIEFDX0VMX1VTQUNfTVBTMjEyIDB4MDAwMDEwIC8qITwgVVNBQyBNUFMyMTIgdG9vbCBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgQUNfRUxfVVNBQ19MRkUgMHgwMDAwMjAgICAgLyohPCBVU0FDIGVsZW1lbnQgaXMgTEZFICovCisjZGVmaW5lIEFDX0VMX1VTQUNfQ1BfUE9TU0lCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDA0MCAvKiE8IFVTQUMgbWF5IHVzZSBDb21wbGV4IFN0ZXJlbyBQcmVkaWN0aW9uIGluIHRoaXMgY2hhbm5lbCBlbGVtZW50IFwKKyAgICAgICAgICAgICovCisjZGVmaW5lIEFDX0VMX0VOSEFOQ0VEX05PSVNFIDB4MDAwMDgwICAgLyohPCBFbmhhbmNlZCBub2lzZSBmaWxsaW5nKi8KKyNkZWZpbmUgQUNfRUxfSUdGX0FGVEVSX1ROUyAweDAwMDEwMCAgICAvKiE8IElHRiBhZnRlciBUTlMgKi8KKyNkZWZpbmUgQUNfRUxfSUdGX0lOREVQX1RJTElORyAweDAwMDIwMCAvKiE8IElHRiBpbmRlcGVuZGVudCB0aWxpbmcgKi8KKyNkZWZpbmUgQUNfRUxfSUdGX1VTRV9FTkYgMHgwMDA0MDAgICAgICAvKiE8IElHRiB1c2UgZW5oYW5jZWQgbm9pc2UgZmlsbGluZyAqLworI2RlZmluZSBBQ19FTF9GVUxMQkFORExQRCAweDAwMDgwMCAgICAgIC8qITwgZW5hYmxlIGZ1bGxiYW5kIExQRCB0b29scyAqLworI2RlZmluZSBBQ19FTF9MUERTVEVSRU9JRFggMHgwMDEwMDAgICAgIC8qITwgTFBELXN0ZXJlby10b29sIHN0ZXJlbyBpbmRleCAqLworI2RlZmluZSBBQ19FTF9MRkUgMHgwMDIwMDAgICAgICAgICAgICAgIC8qITwgVGhlIGVsZW1lbnQgaXMgb2YgdHlwZSBMRkUuICovCiAKIC8qIENPREVSX0NPTkZJRzo6ZmxhZ3MgKi8KLSNkZWZpbmUgQ0NfTVBFR19JRCAgICAgICAgIDB4MDAxMDAwMDAKLSNkZWZpbmUgQ0NfSVNfQkFTRUxBWUVSICAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgQ0NfUFJPVEVDVElPTiAgICAgIDB4MDA0MDAwMDAKLSNkZWZpbmUgQ0NfU0JSICAgICAgICAgICAgIDB4MDA4MDAwMDAKLSNkZWZpbmUgQ0NfU0JSQ1JDICAgICAgICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgQ0NfUlZMQyAgICAgICAgICAgIDB4MDEwMDAwMDAKLSNkZWZpbmUgQ0NfVkNCMTEgICAgICAgICAgIDB4MDIwMDAwMDAKLSNkZWZpbmUgQ0NfSENSICAgICAgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgQ0NfTVBFR19JRCAweDAwMTAwMDAwCisjZGVmaW5lIENDX0lTX0JBU0VMQVlFUiAweDAwMjAwMDAwCisjZGVmaW5lIENDX1BST1RFQ1RJT04gMHgwMDQwMDAwMAorI2RlZmluZSBDQ19TQlIgMHgwMDgwMDAwMAorI2RlZmluZSBDQ19TQlJDUkMgMHgwMDAxMDAwMAorI2RlZmluZSBDQ19TQUMgMHgwMDAyMDAwMAorI2RlZmluZSBDQ19SVkxDIDB4MDEwMDAwMDAKKyNkZWZpbmUgQ0NfVkNCMTEgMHgwMjAwMDAwMAorI2RlZmluZSBDQ19IQ1IgMHgwNDAwMDAwMAogI2RlZmluZSBDQ19QU0VVRE9fU1VSUk9VTkQgMHgwODAwMDAwMAotI2RlZmluZSBDQ19VU0FDX05PSVNFICAgICAgMHgxMDAwMDAwMAotI2RlZmluZSBDQ19VU0FDX1RXICAgICAgICAgMHgyMDAwMDAwMAotI2RlZmluZSBDQ19VU0FDX0hCRSAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBDQ19VU0FDX05PSVNFIDB4MTAwMDAwMDAKKyNkZWZpbmUgQ0NfVVNBQ19UVyAweDIwMDAwMDAwCisjZGVmaW5lIENDX1VTQUNfSEJFIDB4NDAwMDAwMDAKIAogLyoqIEdlbmVyaWMgYXVkaW8gY29kZXIgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUuICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIEFVRElPX09CSkVDVF9UWVBFIGFvdDsgICAgICAgICAvKio8IEF1ZGlvIE9iamVjdCBUeXBlIChBT1QpLiAgICAgICAgICAgKi8KLSAgQVVESU9fT0JKRUNUX1RZUEUgZXh0QU9UOyAgICAgIC8qKjwgRXh0ZW5zaW9uIEF1ZGlvIE9iamVjdCBUeXBlIChTQlIpLiAqLwotICBDSEFOTkVMX01PREUgY2hhbm5lbE1vZGU7ICAgICAgLyoqPCBDaGFubmVsIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICovCi0gIElOVCAgICAgICAgc2FtcGxpbmdSYXRlOyAgICAgICAvKio8IFNhbXBsaW5nIHJhdGUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgSU5UICAgICAgICBleHRTYW1wbGluZ1JhdGU7ICAgIC8qKjwgRXh0ZW5kZWQgc2FtcGxlcmF0ZSAoU0JSKS4gICAgICAgICAqLwotICBJTlQgICAgICAgIGJpdFJhdGU7ICAgICAgICAgICAgLyoqPCBBdmVyYWdlIGJpdHJhdGUuICAgICAgICAgICAgICAgICAgICovCi0gIGludCAgICAgICAgc2FtcGxlc1BlckZyYW1lOyAgICAvKio8IE51bWJlciBvZiBQQ00gc2FtcGxlcyBwZXIgY29kZWMgZnJhbWUgYW5kIGF1ZGlvIGNoYW5uZWwuICovCi0gIGludCAgICAgICAgbm9DaGFubmVsczsgICAgICAgICAvKio8IE51bWJlciBvZiBhdWRpbyBjaGFubmVscy4gICAgICAgICAgKi8KLSAgaW50ICAgICAgICBiaXRzRnJhbWU7Ci0gIGludCAgICAgICAgblN1YkZyYW1lczsgICAgICAgICAvKio8IEFtb3VudCBvZiBlbmNvZGVyIHN1YmZyYW1lcy4gMSBtZWFucyBubyBzdWJmcmFtaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBpbnQgICAgICAgIEJTQUNudW1PZlN1YkZyYW1lOyAgLyoqPCBUaGUgbnVtYmVyIG9mIHRoZSBzdWItZnJhbWVzIHdoaWNoIGFyZSBncm91cGVkIGFuZCB0cmFuc21pdHRlZCBpbiBhIHN1cGVyLWZyYW1lIChCU0FDKS4gKi8KLSAgaW50ICAgICAgICBCU0FDbGF5ZXJMZW5ndGg7ICAgIC8qKjwgVGhlIGF2ZXJhZ2UgbGVuZ3RoIG9mIHRoZSBsYXJnZS1zdGVwIGxheWVycyBpbiBieXRlcyAoQlNBQykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFVJTlQgICAgICAgZmxhZ3M7ICAgICAgICAgICAgICAvKio8IGZsYWdzICovCi0gIFVDSEFSICAgICAgbWF0cml4TWl4ZG93bkE7ICAgICAvKio8IE1hdHJpeCBtaXhkb3duIGluZGV4IHRvIHB1dCBpbnRvIFBDRS4gRGVmYXVsdCB2YWx1ZSAwIG1lYW5zIG5vIG1peGRvd24gY29lZmZpY2llbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIHZhbHVlcyBhcmUgMS00IHdoaWNoIGNvcnJlc3BvbmQgdG8gbWF0cml4X21peGRvd25faWR4IDAtMy4gKi8KLSAgVUNIQVIgICAgICBoZWFkZXJQZXJpb2Q7ICAgICAgIC8qKjwgRnJhbWUgcGVyaW9kIGZvciBzZW5kaW5nIGluIGJhbmQgY29uZmlndXJhdGlvbiBidWZmZXJzIGluIHRoZSB0cmFuc3BvcnQgbGF5ZXIuICovCisgIEFVRElPX09CSkVDVF9UWVBFIGFvdDsgICAgIC8qKjwgQXVkaW8gT2JqZWN0IFR5cGUgKEFPVCkuICAgICAgICAgICAqLworICBBVURJT19PQkpFQ1RfVFlQRSBleHRBT1Q7ICAvKio8IEV4dGVuc2lvbiBBdWRpbyBPYmplY3QgVHlwZSAoU0JSKS4gKi8KKyAgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlOyAgLyoqPCBDaGFubmVsIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICovCisgIFVDSEFSIGNoYW5uZWxDb25maWdaZXJvOyAgIC8qKjwgVXNlIGNoYW5uZWwgY29uZmlnIHplcm8gKyBwY2UgYWx0aG91Z2ggYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZCBjaGFubmVsIGNvbmZpZyBjb3VsZCBiZSBzaWduYWxlZC4gKi8KKyAgSU5UIHNhbXBsaW5nUmF0ZTsgICAgICAgICAgLyoqPCBTYW1wbGluZyByYXRlLiAgICAgICAgICAgICAgICAgICAgICovCisgIElOVCBleHRTYW1wbGluZ1JhdGU7ICAgICAgIC8qKjwgRXh0ZW5kZWQgc2FtcGxlcmF0ZSAoU0JSKS4gICAgICAgICAqLworICBJTlQgZG93bnNjYWxlU2FtcGxpbmdSYXRlOyAvKio8IERvd25zY2FsZSBzYW1wbGluZyByYXRlIChFTEQgZG93bnNjYWxlZCBtb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSU5UIGJpdFJhdGU7ICAgICAgICAgICAgICAgLyoqPCBBdmVyYWdlIGJpdHJhdGUuICAgICAgICAgICAgICAgICAgICovCisgIGludCBzYW1wbGVzUGVyRnJhbWU7IC8qKjwgTnVtYmVyIG9mIFBDTSBzYW1wbGVzIHBlciBjb2RlYyBmcmFtZSBhbmQgYXVkaW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC4gKi8KKyAgaW50IG5vQ2hhbm5lbHM7ICAgICAgLyoqPCBOdW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMuICAgICAgICAgICovCisgIGludCBiaXRzRnJhbWU7CisgIGludCBuU3ViRnJhbWVzOyAvKio8IEFtb3VudCBvZiBlbmNvZGVyIHN1YmZyYW1lcy4gMSBtZWFucyBubyBzdWJmcmFtaW5nLiAqLworICBpbnQgQlNBQ251bU9mU3ViRnJhbWU7IC8qKjwgVGhlIG51bWJlciBvZiB0aGUgc3ViLWZyYW1lcyB3aGljaCBhcmUgZ3JvdXBlZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc21pdHRlZCBpbiBhIHN1cGVyLWZyYW1lIChCU0FDKS4gKi8KKyAgaW50IEJTQUNsYXllckxlbmd0aDsgLyoqPCBUaGUgYXZlcmFnZSBsZW5ndGggb2YgdGhlIGxhcmdlLXN0ZXAgbGF5ZXJzIGluIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgIChCU0FDKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgVUlOVCBmbGFnczsgICAgICAgICAgLyoqPCBmbGFncyAqLworICBVQ0hBUiBtYXRyaXhNaXhkb3duQTsgLyoqPCBNYXRyaXggbWl4ZG93biBpbmRleCB0byBwdXQgaW50byBQQ0UuIERlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgbWVhbnMgbm8gbWl4ZG93biBjb2VmZmljaWVudCwgdmFsaWQgdmFsdWVzIGFyZSAxLTQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGNvcnJlc3BvbmQgdG8gbWF0cml4X21peGRvd25faWR4IDAtMy4gKi8KKyAgVUNIQVIgaGVhZGVyUGVyaW9kOyAgIC8qKjwgRnJhbWUgcGVyaW9kIGZvciBzZW5kaW5nIGluIGJhbmQgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVycyBpbiB0aGUgdHJhbnNwb3J0IGxheWVyLiAqLwogCi0gIFVDSEFSICAgICAgc3RlcmVvQ29uZmlnSW5kZXg7IC8qKjwgVVNBQyBNUFMgc3RlcmVvIG1vZGUgKi8KLSAgVUNIQVIgICAgICBzYnJNb2RlOyAgICAgICAgICAgLyoqPCBVU0FDIFNCUiBtb2RlICovCi0gIFNCUl9QU19TSUdOQUxJTkcgc2JyU2lnbmFsaW5nOy8qKjwgMDogaW1wbGljaXQgc2lnbmFsaW5nLCAxOiBiYWNrd2FyZHMgY29tcGF0aWJsZSBleHBsaWNpdCBzaWduYWxpbmcsIDI6IGhpZXJhcmNpY2FsIGV4cGxpY2l0IHNpZ25hbGluZyAqLworICBVQ0hBUiBzdGVyZW9Db25maWdJbmRleDsgICAgICAgLyoqPCBVU0FDIE1QUyBzdGVyZW8gbW9kZSAqLworICBVQ0hBUiBzYnJNb2RlOyAgICAgICAgICAgICAgICAgLyoqPCBVU0FDIFNCUiBtb2RlICovCisgIFNCUl9QU19TSUdOQUxJTkcgc2JyU2lnbmFsaW5nOyAvKio8IDA6IGltcGxpY2l0IHNpZ25hbGluZywgMTogYmFja3dhcmRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlIGV4cGxpY2l0IHNpZ25hbGluZywgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZXJhcmNpY2FsIGV4cGxpY2l0IHNpZ25hbGluZyAqLwogCi0gIFVDSEFSICAgICAgc2JyUHJlc2VudDsKLSAgVUNIQVIgICAgICBwc1ByZXNlbnQ7CisgIFVDSEFSIHJhd0NvbmZpZ1s2NF07IC8qKjwgcmF3IGNvZGVjIHNwZWNpZmljIGNvbmZpZyBhcyBiaXQgc3RyZWFtICovCisgIGludCByYXdDb25maWdCaXRzOyAgIC8qKjwgU2l6ZSBvZiByYXdDb25maWcgaW4gYml0cyAqLworCisgIFVDSEFSIHNiclByZXNlbnQ7CisgIFVDSEFSIHBzUHJlc2VudDsKIH0gQ09ERVJfQ09ORklHOwogCisjZGVmaW5lIFVTQUNfSURfQklUIDE2IC8qKiBVU0FDIGVsZW1lbnQgSURzIHN0YXJ0IGF0IFVTQUNfSURfQklUICovCisKIC8qKiBNUDQgRWxlbWVudCBJRHMuICovCi10eXBlZGVmIGVudW0KLXsKLSAgSURfTk9ORSA9IC0xLCAgIC8qKjwgSW52YWxpZCBFbGVtZW50IGhlbHBlciBJRC4gICAgICAgICAgICAgKi8KLSAgSURfU0NFID0gMCwgICAgIC8qKjwgU2luZ2xlIENoYW5uZWwgRWxlbWVudC4gICAgICAgICAgICAgICAgKi8KLSAgSURfQ1BFID0gMSwgICAgIC8qKjwgQ2hhbm5lbCBQYWlyIEVsZW1lbnQuICAgICAgICAgICAgICAgICAgKi8KLSAgSURfQ0NFID0gMiwgICAgIC8qKjwgQ291cGxpbmcgQ2hhbm5lbCBFbGVtZW50LiAgICAgICAgICAgICAgKi8KLSAgSURfTEZFID0gMywgICAgIC8qKjwgTEZFIENoYW5uZWwgRWxlbWVudC4gICAgICAgICAgICAgICAgICAgKi8KLSAgSURfRFNFID0gNCwgICAgIC8qKjwgQ3VycmVudGx5IG9uZSBEYXRhIFN0cmVhbSBFbGVtZW50IGZvciBhbmNpbGxhcnkgZGF0YSBpcyBzdXBwb3J0ZWQuICovCi0gIElEX1BDRSA9IDUsICAgICAvKio8IFByb2dyYW0gQ29uZmlnIEVsZW1lbnQuICAgICAgICAgICAgICAgICovCi0gIElEX0ZJTCA9IDYsICAgICAvKio8IEZpbGwgRWxlbWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIElEX0VORCA9IDcsICAgICAvKio8IEFybmllIChFbmQgRWxlbWVudCA9IFRlcm1pbmF0b3IpLiAgICAgICovCi0gIElEX0VYVCA9IDgsICAgICAvKio8IEV4dGVuc2lvbiBQYXlsb2FkIChFUiBvbmx5KS4gICAgICAgICAgICovCi0gIElEX1NDQUwgPSA5LCAgICAvKio8IEFBQyBzY2FsYWJsZSBlbGVtZW50IChFUiBvbmx5KS4gICAgICAgICovCit0eXBlZGVmIGVudW0geworICAvKiBtcDQgZWxlbWVudCBJRHMgKi8KKyAgSURfTk9ORSA9IC0xLCAvKio8IEludmFsaWQgRWxlbWVudCBoZWxwZXIgSUQuICAgICAgICAgICAgICovCisgIElEX1NDRSA9IDAsICAgLyoqPCBTaW5nbGUgQ2hhbm5lbCBFbGVtZW50LiAgICAgICAgICAgICAgICAqLworICBJRF9DUEUgPSAxLCAgIC8qKjwgQ2hhbm5lbCBQYWlyIEVsZW1lbnQuICAgICAgICAgICAgICAgICAgKi8KKyAgSURfQ0NFID0gMiwgICAvKio8IENvdXBsaW5nIENoYW5uZWwgRWxlbWVudC4gICAgICAgICAgICAgICovCisgIElEX0xGRSA9IDMsICAgLyoqPCBMRkUgQ2hhbm5lbCBFbGVtZW50LiAgICAgICAgICAgICAgICAgICAqLworICBJRF9EU0UgPSA0LCAgIC8qKjwgQ3VycmVudGx5IG9uZSBEYXRhIFN0cmVhbSBFbGVtZW50IGZvciBhbmNpbGxhcnkgZGF0YSBpcworICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZC4gKi8KKyAgSURfUENFID0gNSwgICAvKio8IFByb2dyYW0gQ29uZmlnIEVsZW1lbnQuICAgICAgICAgICAgICAgICovCisgIElEX0ZJTCA9IDYsICAgLyoqPCBGaWxsIEVsZW1lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBJRF9FTkQgPSA3LCAgIC8qKjwgQXJuaWUgKEVuZCBFbGVtZW50ID0gVGVybWluYXRvcikuICAgICAgKi8KKyAgSURfRVhUID0gOCwgICAvKio8IEV4dGVuc2lvbiBQYXlsb2FkIChFUiBvbmx5KS4gICAgICAgICAgICovCisgIElEX1NDQUwgPSA5LCAgLyoqPCBBQUMgc2NhbGFibGUgZWxlbWVudCAoRVIgb25seSkuICAgICAgICAqLworICAvKiBVU0FDIGVsZW1lbnQgSURzICovCisgIElEX1VTQUNfU0NFID0gMCArIFVTQUNfSURfQklULCAvKio8IFNpbmdsZSBDaGFubmVsIEVsZW1lbnQuICAgICAgICAgICAgICAgICovCisgIElEX1VTQUNfQ1BFID0gMSArIFVTQUNfSURfQklULCAvKio8IENoYW5uZWwgUGFpciBFbGVtZW50LiAgICAgICAgICAgICAgICAgICovCisgIElEX1VTQUNfTEZFID0gMiArIFVTQUNfSURfQklULCAvKio8IExGRSBDaGFubmVsIEVsZW1lbnQuICAgICAgICAgICAgICAgICAgICovCisgIElEX1VTQUNfRVhUID0gMyArIFVTQUNfSURfQklULCAvKio8IEV4dGVuc2lvbiBFbGVtZW50LiAgICAgICAgICAgICAgICAgICAgICovCisgIElEX1VTQUNfRU5EID0gNCArIFVTQUNfSURfQklULCAvKio8IEFybmllIChFbmQgRWxlbWVudCA9IFRlcm1pbmF0b3IpLiAgICAgICovCiAgIElEX0xBU1QKIH0gTVA0X0VMRU1FTlRfSUQ7CiAKLSNkZWZpbmUgSVNfQ0hBTk5FTF9FTEVNRU5UKGVsZW1lbnRJZCkgXAotICAoKGVsZW1lbnRJZCkgPT0gSURfU0NFIFwKLXx8IChlbGVtZW50SWQpID09IElEX0NQRSBcCi18fCAoZWxlbWVudElkKSA9PSBJRF9MRkUpCisvKiB1c2FjQ29uZmlnRXh0VHlwZSBxLnYuIElTTy9JRUMgRElTIDIzMDA4LTMgVGFibGUgNTIgIGFuZCAgSVNPL0lFQyBGRElTCisgKiAyMzAwMy0zOjIwMTEoRSkgVGFibGUgNzQqLwordHlwZWRlZiBlbnVtIHsKKyAgLyogVVNBQyBhbmQgUlNWRDYwIDNEQSAqLworICBJRF9DT05GSUdfRVhUX0ZJTEwgPSAwLAorICAvKiBSU1ZENjAgM0RBICovCisgIElEX0NPTkZJR19FWFRfRE9XTk1JWCA9IDEsCisgIElEX0NPTkZJR19FWFRfTE9VRE5FU1NfSU5GTyA9IDIsCisgIElEX0NPTkZJR19FWFRfQVVESU9TQ0VORV9JTkZPID0gMywKKyAgSURfQ09ORklHX0VYVF9IT0FfTUFUUklYID0gNCwKKyAgSURfQ09ORklHX0VYVF9TSUdfR1JPVVBfSU5GTyA9IDYKKyAgLyogNS0xMjcgPT4gcmVzZXJ2ZWQgZm9yIElTTyB1c2UgKi8KKyAgLyogPiAxMjggPT4gcmVzZXJ2ZWQgZm9yIHVzZSBvdXRzaWRlIG9mIElTTyBzY29wZSAqLworfSBDT05GSUdfRVhUX0lEOwogCi0jZGVmaW5lIEVYVF9JRF9CSVRTIDQgIC8qKjwgU2l6ZSBpbiBiaXRzIG9mIGV4dGVuc2lvbiBwYXlsb2FkIHR5cGUgdGFncy4gKi8KKyNkZWZpbmUgSVNfQ0hBTk5FTF9FTEVNRU5UKGVsZW1lbnRJZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChlbGVtZW50SWQpID09IElEX1NDRSB8fCAoZWxlbWVudElkKSA9PSBJRF9DUEUgfHwgKGVsZW1lbnRJZCkgPT0gSURfTEZFIHx8IFwKKyAgIChlbGVtZW50SWQpID09IElEX1VTQUNfU0NFIHx8IChlbGVtZW50SWQpID09IElEX1VTQUNfQ1BFIHx8ICAgICAgICAgICAgICAgIFwKKyAgIChlbGVtZW50SWQpID09IElEX1VTQUNfTEZFKQorCisjZGVmaW5lIElTX01QNF9DSEFOTkVMX0VMRU1FTlQoZWxlbWVudElkKSBcCisgICgoZWxlbWVudElkKSA9PSBJRF9TQ0UgfHwgKGVsZW1lbnRJZCkgPT0gSURfQ1BFIHx8IChlbGVtZW50SWQpID09IElEX0xGRSkKKworI2RlZmluZSBFWFRfSURfQklUUyA0IC8qKjwgU2l6ZSBpbiBiaXRzIG9mIGV4dGVuc2lvbiBwYXlsb2FkIHR5cGUgdGFncy4gKi8KIAogLyoqIEV4dGVuc2lvbiBwYXlsb2FkIHR5cGVzLiAqLwogdHlwZWRlZiBlbnVtIHsKLSAgRVhUX0ZJTCAgICAgICAgICAgPSAweDAwLAotICBFWFRfRklMTF9EQVRBICAgICA9IDB4MDEsCi0gIEVYVF9EQVRBX0VMRU1FTlQgID0gMHgwMiwKLSAgRVhUX0RBVEFfTEVOR1RIICAgPSAweDAzLAotICBFWFRfTERTQUNfREFUQSAgICA9IDB4MDksCi0gIEVYVF9TQU9DX0RBVEEgICAgID0gMHgwYSwKKyAgRVhUX0ZJTCA9IDB4MDAsCisgIEVYVF9GSUxMX0RBVEEgPSAweDAxLAorICBFWFRfREFUQV9FTEVNRU5UID0gMHgwMiwKKyAgRVhUX0RBVEFfTEVOR1RIID0gMHgwMywKKyAgRVhUX1VOSV9EUkMgPSAweDA0LAorICBFWFRfTERTQUNfREFUQSA9IDB4MDksCisgIEVYVF9TQU9DX0RBVEEgPSAweDBhLAogICBFWFRfRFlOQU1JQ19SQU5HRSA9IDB4MGIsCi0gIEVYVF9TQUNfREFUQSAgICAgID0gMHgwYywKLSAgRVhUX1NCUl9EQVRBICAgICAgPSAweDBkLAotICBFWFRfU0JSX0RBVEFfQ1JDICA9IDB4MGUKKyAgRVhUX1NBQ19EQVRBID0gMHgwYywKKyAgRVhUX1NCUl9EQVRBID0gMHgwZCwKKyAgRVhUX1NCUl9EQVRBX0NSQyA9IDB4MGUKIH0gRVhUX1BBWUxPQURfVFlQRTsKIAorI2RlZmluZSBJU19VU0FDX0NIQU5ORUxfRUxFTUVOVChlbGVtZW50SWQpICAgICAgICAgICAgICAgICAgICAgXAorICAoKGVsZW1lbnRJZCkgPT0gSURfVVNBQ19TQ0UgfHwgKGVsZW1lbnRJZCkgPT0gSURfVVNBQ19DUEUgfHwgXAorICAgKGVsZW1lbnRJZCkgPT0gSURfVVNBQ19MRkUpCisKKy8qKiBNUEVHLUQgVVNBQyAmIFJTVkQ2MCAzRCBhdWRpbyBFeHRlbnNpb24gRWxlbWVudCBUeXBlcy4gKi8KK3R5cGVkZWYgZW51bSB7CisgIC8qIHVzYWMgKi8KKyAgSURfRVhUX0VMRV9GSUxMID0gMHgwMCwKKyAgSURfRVhUX0VMRV9NUEVHUyA9IDB4MDEsCisgIElEX0VYVF9FTEVfU0FPQyA9IDB4MDIsCisgIElEX0VYVF9FTEVfQVVESU9QUkVST0xMID0gMHgwMywKKyAgSURfRVhUX0VMRV9VTklfRFJDID0gMHgwNCwKKyAgLyogcnN2NjAzZGEgKi8KKyAgSURfRVhUX0VMRV9PQkpfTUVUQURBVEEgPSAweDA1LAorICBJRF9FWFRfRUxFX1NBT0NfM0QgPSAweDA2LAorICBJRF9FWFRfRUxFX0hPQSA9IDB4MDcsCisgIElEX0VYVF9FTEVfRk1UX0NOVlJUUiA9IDB4MDgsCisgIElEX0VYVF9FTEVfTUNUID0gMHgwOSwKKyAgSURfRVhUX0VMRV9FTkhBTkNFRF9PQkpfTUVUQURBVEEgPSAweDBkLAorICAvKiByZXNlcnZlZCBmb3IgdXNlIG91dHNpZGUgb2YgSVNPIHNjb3BlICovCisgIElEX0VYVF9FTEVfVlJfTUVUQURBVEEgPSAweDgxLAorICBJRF9FWFRfRUxFX1VOS05PV04gPSAweEZGCit9IFVTQUNfRVhUX0VMRU1FTlRfVFlQRTsKIAogLyoqCiAgKiBQcm9wcmlldGFyeSByYXcgcGFja2V0IGZpbGUgY29uZmlndXJhdGlvbiBkYXRhIHR5cGUgaWRlbnRpZmllci4KICAqLwotdHlwZWRlZiBlbnVtCi17Ci0gIFRDX05PVEhJTkcgPSAwLCAgICAgLyogTm8gY29uZmlndXJhdGlvbiBhdmFpbGFibGUgLT4gaW4tYmFuZCBjb25maWd1cmF0aW9uLiAgICovCi0gIFRDX1JBV19BU0MsICAgICAgICAgLyogQ29uZmlndXJhdGlvbiBkYXRhIGZpZWxkIGlzIGEgcmF3IEF1ZGlvU3BlY2lmaWNDb25maWcuICovCi0gIFRDX1JBV19TTUMsICAgICAgICAgLyogQ29uZmlndXJhdGlvbiBkYXRhIGZpZWxkIGlzIGEgcmF3IFN0cmVhbU11eENvbmZpZy4gICAgICovCi0gIFRDX1JBV19TREMgICAgICAgICAgLyogQ29uZmlndXJhdGlvbiBkYXRhIGZpZWxkIGlzIGEgcmF3IERybSBTREMuICAgICAgICAgICAgICovCit0eXBlZGVmIGVudW0geworICBUQ19OT1RISU5HID0gMCwgIC8qIE5vIGNvbmZpZ3VyYXRpb24gYXZhaWxhYmxlIC0+IGluLWJhbmQgY29uZmlndXJhdGlvbi4gICAqLworICBUQ19SQVdfQURUUyA9IDIsIC8qIFRyYW5zZmVyIHR5cGUgaXMgQURUUy4gKi8KKyAgVENfUkFXX0xBVE1fTUNQMSA9IDYsIC8qIFRyYW5zZmVyIHR5cGUgaXMgTEFUTSB3aXRoIFNNQyBwcmVzZW50LiAgICAqLworICBUQ19SQVdfU0RDID0gMjEgICAgICAgLyogQ29uZmlndXJhdGlvbiBkYXRhIGZpZWxkIGlzIERybSBTREMuICAgICAgICAgICAgICovCiAKIH0gVFBfQ09ORklHX1RZUEU7CiAKQEAgLTQwOCwxMTAgKzUyMSwxNzIgQEAKICAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAqLwogLyogXGNvbmQgKi8KLSNkZWZpbmUgTU9EVUxFX0lEX01BU0sgICgweDAwMDAwMGZmKQotI2RlZmluZSBNT0RVTEVfSURfU0hJRlQgKDI0KQogCiB0eXBlZGVmIGVudW0gewotICBGREtfTk9ORSAgID0gMCwKLSAgRkRLX1RPT0xTICA9IDEsCisgIEZES19OT05FID0gMCwKKyAgRkRLX1RPT0xTID0gMSwKICAgRkRLX1NZU0xJQiA9IDIsCiAgIEZES19BQUNERUMgPSAzLAogICBGREtfQUFDRU5DID0gNCwKICAgRkRLX1NCUkRFQyA9IDUsCiAgIEZES19TQlJFTkMgPSA2LAotICBGREtfVFBERUMgID0gNywKLSAgRkRLX1RQRU5DICA9IDgsCisgIEZES19UUERFQyA9IDcsCisgIEZES19UUEVOQyA9IDgsCiAgIEZES19NUFNERUMgPSA5LAotICBGREtfTVBFR0ZJTEVSRUFEICA9IDEwLAorICBGREtfTVBFR0ZJTEVSRUFEID0gMTAsCiAgIEZES19NUEVHRklMRVdSSVRFID0gMTEsCi0gIEZES19NUDJERUMgPSAxMiwKLSAgRkRLX0RBQkRFQyA9IDEzLAotICBGREtfREFCUEFSU0UgPSAxNCwKLSAgRkRLX0RSTURFQyA9IDE1LAotICBGREtfRFJNUEFSU0UgPSAxNiwKLSAgRkRLX0FBQ0xERU5DID0gMTcsCi0gIEZES19NUDJFTkMgPSAxOCwKLSAgRkRLX01QM0VOQyA9IDE5LAotICBGREtfTVAzREVDID0gMjAsCi0gIEZES19NUDNIRUFEUEhPTkUgPSAyMSwKLSAgRkRLX01QM1NERUMgPSAyMiwKLSAgRkRLX01QM1NFTkMgPSAyMywKLSAgRkRLX0VBRUMgICAgPSAyNCwKLSAgRkRLX0RBQkVOQyAgPSAyNSwKLSAgRkRLX0RNQkRFQyAgPSAyNiwKLSAgRkRLX0ZEUkVWRVJCID0gMjcsCi0gIEZES19EUk1FTkMgID0gMjgsCi0gIEZES19NRVRBREFUQVRSQU5TQ09ERVIgPSAyOSwKLSAgRkRLX0FDM0RFQyA9IDMwLAogICBGREtfUENNRE1YID0gMzEsCisgIEZES19NUFNFTkMgPSAzNCwKKyAgRkRLX1RETElNSVQgPSAzNSwKKyAgRkRLX1VOSURSQ0RFQyA9IDM4LAogCiAgIEZES19NT0RVTEVfTEFTVAogCiB9IEZES19NT0RVTEVfSUQ7CiAKIC8qIEFBQyBjYXBhYmlsaXR5IGZsYWdzICovCi0jZGVmaW5lIENBUEZfQUFDX0xDICAgICAgICAgICAweDAwMDAwMDAxICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIExvdyBDb21wbGV4aXR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9FUl9BQUNfTEQgICAgICAgIDB4MDAwMDAwMDIgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgTG93IERlbGF5IHdpdGggRXJyb3IgUmVzaWxpZW5jZSB0b29scy4gICAgICAqLwotI2RlZmluZSBDQVBGX0VSX0FBQ19TQ0FMICAgICAgMHgwMDAwMDAwNCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBTY2FsYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENBUEZfRVJfQUFDX0xDICAgICAgICAweDAwMDAwMDA4ICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIExvdyBDb21wbGV4aXR5IHdpdGggRXJyb3IgUmVzaWxpZW5jZSB0b29scy4gKi8KLSNkZWZpbmUgQ0FQRl9BQUNfNDgwICAgICAgICAgIDB4MDAwMDAwMTAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgd2l0aCA0ODAgZnJhbWVsZW5ndGguICAqLwotI2RlZmluZSBDQVBGX0FBQ181MTIgICAgICAgICAgMHgwMDAwMDAyMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyB3aXRoIDUxMiBmcmFtZWxlbmd0aC4gICovCi0jZGVmaW5lIENBUEZfQUFDXzk2MCAgICAgICAgICAweDAwMDAwMDQwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIHdpdGggOTYwIGZyYW1lbGVuZ3RoLiAgKi8KLSNkZWZpbmUgQ0FQRl9BQUNfMTAyNCAgICAgICAgIDB4MDAwMDAwODAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgd2l0aCAxMDI0IGZyYW1lbGVuZ3RoLiAqLwotI2RlZmluZSBDQVBGX0FBQ19IQ1IgICAgICAgICAgMHgwMDAwMDEwMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyB3aXRoIEh1ZmZtYW4gQ29kZXdvcmQgUmVvcmRlcmluZy4gICAgKi8KLSNkZWZpbmUgQ0FQRl9BQUNfVkNCMTEgICAgICAgIDB4MDAwMDAyMDAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgVmlydHVhbCBDb2RlYm9vayAxMS4gICAgKi8KLSNkZWZpbmUgQ0FQRl9BQUNfUlZMQyAgICAgICAgIDB4MDAwMDA0MDAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgUmV2ZXJzaWJsZSBWYXJpYWJsZSBMZW5ndGggQ29kaW5nLiAgICovCi0jZGVmaW5lIENBUEZfQUFDX01QRUc0ICAgICAgICAweDAwMDAwODAwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgTVBFRyBmaWxlIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBDQVBGX0FBQ19EUkMgICAgICAgICAgMHgwMDAwMTAwMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBEeW5hbWljIFJhbmdlIENvbnRyb2wuICovCi0jZGVmaW5lIENBUEZfQUFDX0NPTkNFQUxNRU5UICAweDAwMDAyMDAwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIGNvbmNlYWxtZW50LiAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9BQUNfRFJNX0JTRk9STUFUIDB4MDAwMDQwMDAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgRFJNIGJpc3RyZWFtIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9FUl9BQUNfRUxEICAgICAgIDB4MDAwMDgwMDAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgRW5oYW5jZWQgTG93IERlbGF5IHdpdGggRXJyb3IgUmVzaWxpZW5jZSB0b29scy4gICovCi0jZGVmaW5lIENBUEZfRVJfQUFDX0JTQUMgICAgICAweDAwMDEwMDAwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIEJTQUMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9BQUNfU1VQRVJGUkFNSU5HIDB4MDAwMjAwMDAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgU3VwZXJmcmFtaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENBUEZfQUFDX0xDIDB4MDAwMDAwMDEgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBMb3cgQ29tcGxleGl0eS4gKi8KKyNkZWZpbmUgQ0FQRl9FUl9BQUNfTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwMiAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIExvdyBEZWxheSB3aXRoIEVycm9yIFJlc2lsaWVuY2UgdG9vbHMuIFwKKyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9FUl9BQUNfU0NBTCAweDAwMDAwMDA0IC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgU2NhbGFibGUuICovCisjZGVmaW5lIENBUEZfRVJfQUFDX0xDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDA4IC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgTG93IENvbXBsZXhpdHkgd2l0aCBFcnJvciBSZXNpbGllbmNlIFwKKyAgICAgICAgICAgICAgICB0b29scy4gKi8KKyNkZWZpbmUgQ0FQRl9BQUNfNDgwIFwKKyAgMHgwMDAwMDAxMCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIHdpdGggNDgwIGZyYW1lbGVuZ3RoLiAgKi8KKyNkZWZpbmUgQ0FQRl9BQUNfNTEyIFwKKyAgMHgwMDAwMDAyMCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIHdpdGggNTEyIGZyYW1lbGVuZ3RoLiAgKi8KKyNkZWZpbmUgQ0FQRl9BQUNfOTYwIFwKKyAgMHgwMDAwMDA0MCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIHdpdGggOTYwIGZyYW1lbGVuZ3RoLiAgKi8KKyNkZWZpbmUgQ0FQRl9BQUNfMTAyNCBcCisgIDB4MDAwMDAwODAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyB3aXRoIDEwMjQgZnJhbWVsZW5ndGguICovCisjZGVmaW5lIENBUEZfQUFDX0hDUiBcCisgIDB4MDAwMDAxMDAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyB3aXRoIEh1ZmZtYW4gQ29kZXdvcmQgUmVvcmRlcmluZy4gICAgKi8KKyNkZWZpbmUgQ0FQRl9BQUNfVkNCMTEgXAorICAweDAwMDAwMjAwIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgVmlydHVhbCBDb2RlYm9vayAxMS4gICAgKi8KKyNkZWZpbmUgQ0FQRl9BQUNfUlZMQyBcCisgIDB4MDAwMDA0MDAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBSZXZlcnNpYmxlIFZhcmlhYmxlIExlbmd0aCBDb2RpbmcuICAgKi8KKyNkZWZpbmUgQ0FQRl9BQUNfTVBFRzQgMHgwMDAwMDgwMCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgTVBFRyBmaWxlIGZvcm1hdC4gKi8KKyNkZWZpbmUgQ0FQRl9BQUNfRFJDIFwKKyAgMHgwMDAwMTAwMCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIER5bmFtaWMgUmFuZ2UgQ29udHJvbC4gKi8KKyNkZWZpbmUgQ0FQRl9BQUNfQ09OQ0VBTE1FTlQgXAorICAweDAwMDAyMDAwIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgY29uY2VhbG1lbnQuICAgICAgICAgICAqLworI2RlZmluZSBDQVBGX0FBQ19EUk1fQlNGT1JNQVQgXAorICAweDAwMDA0MDAwIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgRFJNIGJpc3RyZWFtIGZvcm1hdC4gKi8KKyNkZWZpbmUgQ0FQRl9FUl9BQUNfRUxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwODAwMCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIEVuaGFuY2VkIExvdyBEZWxheSB3aXRoIEVycm9yIFwKKyAgICAgICAgICAgICAgICBSZXNpbGllbmNlIHRvb2xzLiAgKi8KKyNkZWZpbmUgQ0FQRl9FUl9BQUNfQlNBQyBcCisgIDB4MDAwMTAwMDAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBCU0FDLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENBUEZfQUFDX0VMRF9ET1dOU0NBTEUgXAorICAweDAwMDQwMDAwIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMtRUxEIERvd25zY2FsaW5nICAgICAgICAgICAqLworI2RlZmluZSBDQVBGX0FBQ19VU0FDX0xQIFwKKyAgMHgwMDEwMDAwMCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgVVNBQyBsb3cgcG93ZXIgbW9kZS4gKi8KKyNkZWZpbmUgQ0FQRl9BQUNfVVNBQyBcCisgIDB4MDAyMDAwMDAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIFVuaWZpZWQgU3BlZWNoIGFuZCBBdWRpbyBDb2RpbmcgKFVTQUMpLiAqLworI2RlZmluZSBDQVBGX0VSX0FBQ19FTERWMiBcCisgIDB4MDA4MDAwMDAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBFbmhhbmNlZCBMb3cgRGVsYXkgd2l0aCBNUFMgMjEyLiAgKi8KKyNkZWZpbmUgQ0FQRl9BQUNfVU5JRFJDIFwKKyAgMHgwMTAwMDAwMCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgTVBFRy1EIER5bmFtaWMgUmFuZ2UgQ29udHJvbCAodW5pRHJjKS4gKi8KIAogLyogVHJhbnNwb3J0IGNhcGFiaWxpdHkgZmxhZ3MgKi8KLSNkZWZpbmUgQ0FQRl9BRFRTICAgICAgICAgICAgIDB4MDAwMDAwMDEgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBRFRTIHRyYW5zcG9ydCBmb3JtYXQuICAgICAgICAqLwotI2RlZmluZSBDQVBGX0FESUYgICAgICAgICAgICAgMHgwMDAwMDAwMiAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFESUYgdHJhbnNwb3J0IGZvcm1hdC4gICAgICAgICovCi0jZGVmaW5lIENBUEZfTEFUTSAgICAgICAgICAgICAweDAwMDAwMDA0ICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgTEFUTSB0cmFuc3BvcnQgZm9ybWF0LiAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9MT0FTICAgICAgICAgICAgIDB4MDAwMDAwMDggIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBMT0FTIHRyYW5zcG9ydCBmb3JtYXQuICAgICAgICAqLwotI2RlZmluZSBDQVBGX1JBV1BBQ0tFVFMgICAgICAgMHgwMDAwMDAxMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIFJBVyBQQUNLRVRTIHRyYW5zcG9ydCBmb3JtYXQuICovCi0jZGVmaW5lIENBUEZfRFJNICAgICAgICAgICAgICAweDAwMDAwMDIwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgRFJNL0RSTSsgdHJhbnNwb3J0IGZvcm1hdC4gICAgKi8KLSNkZWZpbmUgQ0FQRl9SU1ZENTAgICAgICAgICAgIDB4MDAwMDAwNDAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBSU1ZENTAgdHJhbnNwb3J0IGZvcm1hdCAgICAgICAqLworI2RlZmluZSBDQVBGX0FEVFMgXAorICAweDAwMDAwMDAxIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBRFRTIHRyYW5zcG9ydCBmb3JtYXQuICAgICAgICAqLworI2RlZmluZSBDQVBGX0FESUYgXAorICAweDAwMDAwMDAyIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBRElGIHRyYW5zcG9ydCBmb3JtYXQuICAgICAgICAqLworI2RlZmluZSBDQVBGX0xBVE0gXAorICAweDAwMDAwMDA0IC8qKjwgU3VwcG9ydCBmbGFnIGZvciBMQVRNIHRyYW5zcG9ydCBmb3JtYXQuICAgICAgICAqLworI2RlZmluZSBDQVBGX0xPQVMgXAorICAweDAwMDAwMDA4IC8qKjwgU3VwcG9ydCBmbGFnIGZvciBMT0FTIHRyYW5zcG9ydCBmb3JtYXQuICAgICAgICAqLworI2RlZmluZSBDQVBGX1JBV1BBQ0tFVFMgXAorICAweDAwMDAwMDEwIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBSQVcgUEFDS0VUUyB0cmFuc3BvcnQgZm9ybWF0LiAqLworI2RlZmluZSBDQVBGX0RSTSBcCisgIDB4MDAwMDAwMjAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIERSTS9EUk0rIHRyYW5zcG9ydCBmb3JtYXQuICAgICovCisjZGVmaW5lIENBUEZfUlNWRDUwIFwKKyAgMHgwMDAwMDA0MCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgUlNWRDUwIHRyYW5zcG9ydCBmb3JtYXQgICAgICAgKi8KIAogLyogU0JSIGNhcGFiaWxpdHkgZmxhZ3MgKi8KLSNkZWZpbmUgQ0FQRl9TQlJfTFAgICAgICAgICAgIDB4MDAwMDAwMDEgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBTQlIgTG93IFBvd2VyIG1vZGUuICAgICAgICAgICAqLwotI2RlZmluZSBDQVBGX1NCUl9IUSAgICAgICAgICAgMHgwMDAwMDAwMiAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIFNCUiBIaWdoIFF1YWxpdHkgbW9kZS4gICAgICAgICovCi0jZGVmaW5lIENBUEZfU0JSX0RSTV9CUyAgICAgICAweDAwMDAwMDA0ICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9TQlJfQ09OQ0VBTE1FTlQgIDB4MDAwMDAwMDggIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBTQlIgY29uY2VhbG1lbnQuICAgICAgICAgICAgICAqLwotI2RlZmluZSBDQVBGX1NCUl9EUkMgICAgICAgICAgMHgwMDAwMDAxMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIFNCUiBEeW5hbWljIFJhbmdlIENvbnRyb2wuICAgICovCi0jZGVmaW5lIENBUEZfU0JSX1BTX01QRUcgICAgICAweDAwMDAwMDIwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgTVBFRyBQYXJhbWV0cmljIFN0ZXJlby4gICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9TQlJfUFNfRFJNICAgICAgIDB4MDAwMDAwNDAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBEUk0gUGFyYW1ldHJpYyBTdGVyZW8uICAgICAgICAqLworI2RlZmluZSBDQVBGX1NCUl9MUCBcCisgIDB4MDAwMDAwMDEgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIFNCUiBMb3cgUG93ZXIgbW9kZS4gICAgICAgICAgICovCisjZGVmaW5lIENBUEZfU0JSX0hRIFwKKyAgMHgwMDAwMDAwMiAvKio8IFN1cHBvcnQgZmxhZyBmb3IgU0JSIEhpZ2ggUXVhbGl0eSBtb2RlLiAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9TQlJfRFJNX0JTIFwKKyAgMHgwMDAwMDAwNCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9TQlJfQ09OQ0VBTE1FTlQgXAorICAweDAwMDAwMDA4IC8qKjwgU3VwcG9ydCBmbGFnIGZvciBTQlIgY29uY2VhbG1lbnQuICAgICAgICAgICAgICAqLworI2RlZmluZSBDQVBGX1NCUl9EUkMgXAorICAweDAwMDAwMDEwIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBTQlIgRHluYW1pYyBSYW5nZSBDb250cm9sLiAgICAqLworI2RlZmluZSBDQVBGX1NCUl9QU19NUEVHIFwKKyAgMHgwMDAwMDAyMCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgTVBFRyBQYXJhbWV0cmljIFN0ZXJlby4gICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9TQlJfUFNfRFJNIFwKKyAgMHgwMDAwMDA0MCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgRFJNIFBhcmFtZXRyaWMgU3RlcmVvLiAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9TQlJfRUxEX0RPV05TQ0FMRSBcCisgIDB4MDAwMDAwODAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEVMRCByZWR1Y2VkIGRlbGF5IG1vZGUgICAgICAgICovCisjZGVmaW5lIENBUEZfU0JSX0hCRUhRIFwKKyAgMHgwMDAwMDEwMCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgSFEgSEJFICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotLyogTVAyIGVuY29kZXIgY2FwYWJpbGl0eSBmbGFncyAqLwotI2RlZmluZSBDQVBGX01QMkVOQ19TUyAgICAgICAgMHgwMDAwMDAwMSAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIFNlYW1sZXNzIFN3aXRjaGluZy4gICAgICAgICAgICovCi0jZGVmaW5lIENBUEZfTVAyRU5DX0RBQiAgICAgICAweDAwMDAwMDAyICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgTGF5ZXIyIERBQi4gICAgICAgICAgICAgICAgICAgKi8KKy8qIFBDTSB1dGlscyBjYXBhYmlsaXR5IGZsYWdzICovCisjZGVmaW5lIENBUEZfRE1YX0JMSU5EIFwKKyAgMHgwMDAwMDAwMSAvKio8IFN1cHBvcnQgZmxhZyBmb3IgYmxpbmQgZG93bm1peGluZy4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FQRl9ETVhfUENFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDAyIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBndWlkZWQgZG93bm1peCB3aXRoIGRhdGEgZnJvbSBNUEVHLTIvNCBcCisgICAgICAgICAgICAgICAgUHJvZ3JhbSBDb25maWcgRWxlbWVudHMgKFBDRSkuICovCisjZGVmaW5lIENBUEZfRE1YX0FSSUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMDQgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIFBDRSBndWlkZWQgZG93bm1peCB3aXRoIHNsaWdodGx5IGRpZmZlcmVudCBcCisgICAgICAgICAgICAgICAgZXF1YXRpb25zIGFuZCBsZXZlbHMgdG8gZnVsZmlsbCBBUklCIHN0YW5kYXJkLiAqLworI2RlZmluZSBDQVBGX0RNWF9EVkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMDAwOCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgZ3VpZGVkIGRvd25taXggd2l0aCBkYXRhIGZyb20gRFZCIGFuY2lsbGFyeSBcCisgICAgICAgICAgICAgICAgZGF0YSBmaWVsZHMuICovCisjZGVmaW5lIENBUEZfRE1YX0NIX0VYUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMTAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIHNpbXBsZSB1cG1peGluZyBieSBkdWJsaWNhdGluZyBjaGFubmVscyBvciBcCisgICAgICAgICAgICAgICAgYWRkaW5nIHplcm8gY2hhbm5lbHMuICovCisjZGVmaW5lIENBUEZfRE1YXzZfQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMjAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIDUuMSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKGlucHV0IGFuZCBcCisgICAgICAgICAgICAgICAgb3V0cHV0KS4gKi8KKyNkZWZpbmUgQ0FQRl9ETVhfOF9DSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwNDAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIDYgYW5kIDcuMSBjaGFubmVsIGNvbmZpZ3VyYXRpb25zIChpbnB1dCBhbmQgXAorICAgICAgICAgICAgICAgIG91dHB1dCkuICovCisjZGVmaW5lIENBUEZfRE1YXzI0X0NIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDgwIC8qKjwgU3VwcG9ydCBmbGFnIGZvciAyMi4yIGNoYW5uZWwgY29uZmlndXJhdGlvbiAoaW5wdXQgYW5kIFwKKyAgICAgICAgICAgICAgICBvdXRwdXQpLiAqLworI2RlZmluZSBDQVBGX0xJTUlURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMHgwMDAwMjAwMCAvKio8IFN1cHBvcnQgZmxhZyBmb3Igc2lnbmFsIGxldmVsIGxpbWl0aW5nLiBcCisgICAgICAgICAgICAgICovCiAKLS8qIERBQiBjYXBhYmlsaXR5IGZsYWdzICovCi0jZGVmaW5lIENBUEZfREFCX01QMiAgICAgICAgICAweDAwMDAwMDAxICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgTGF5ZXIyIERBQi4gICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9EQUJfQUFDICAgICAgICAgIDB4MDAwMDAwMDIgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBEQUIrIChIRS1BQUMgdjIpLiAgICAgICAgICAgICAqLwotI2RlZmluZSBDQVBGX0RBQl9QQUQgICAgICAgICAgMHgwMDAwMDAwNCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIFBBRCBleHRyYWN0aW9uLiAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENBUEZfREFCX0RSQyAgICAgICAgICAweDAwMDAwMDA4ICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgRHluYW1pYyBSYW5nZSBDb250cm9sLiAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9EQUJfU1VSUk9VTkQgICAgIDB4MDAwMDAwMTAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBEQUIgU3Vycm91bmQgKE1QUykuICAgICAgICAgICAqLworLyogTVBFRyBTdXJyb3VuZCBjYXBhYmlsaXR5IGZsYWdzICovCisjZGVmaW5lIENBUEZfTVBTX1NURCBcCisgIDB4MDAwMDAwMDEgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIE1QRUcgU3Vycm91bmQuICAgICAgICAgICAqLworI2RlZmluZSBDQVBGX01QU19MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAweDAwMDAwMDAyIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBMb3cgRGVsYXkgTVBFRyBTdXJyb3VuZC4gXAorICAgICAgICAgICAgICAqLworI2RlZmluZSBDQVBGX01QU19VU0FDIFwKKyAgMHgwMDAwMDAwNCAvKio8IFN1cHBvcnQgZmxhZyBmb3IgVVNBQyBNUEVHIFN1cnJvdW5kLiAgICAgICovCisjZGVmaW5lIENBUEZfTVBTX0hRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMTAgLyoqPCBTdXBwb3J0IGZsYWcgaW5kaWNhdGluZyBpZiBoaWdoIHF1YWxpdHkgcHJvY2Vzc2luZyBpcyBcCisgICAgICAgICAgICAgICAgc3VwcG9ydGVkICovCisjZGVmaW5lIENBUEZfTVBTX0xQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDB4MDAwMDAwMjAgLyoqPCBTdXBwb3J0IGZsYWcgaW5kaWNhdGluZyBpZiBwYXJ0aWFsbHkgY29tcGxleCAobG93IHBvd2VyKSBcCisgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyBpcyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgQ0FQRl9NUFNfQkxJTkQgXAorICAweDAwMDAwMDQwIC8qKjwgU3VwcG9ydCBmbGFnIGluZGljYXRpbmcgaWYgYmxpbmQgcHJvY2Vzc2luZyBpcyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgQ0FQRl9NUFNfQklOQVVSQUwgXAorICAweDAwMDAwMDgwIC8qKjwgU3VwcG9ydCBmbGFnIGluZGljYXRpbmcgaWYgYmluYXVyYWwgb3V0cHV0IGlzIHBvc3NpYmxlICovCisjZGVmaW5lIENBUEZfTVBTXzJDSF9PVVQgXAorICAweDAwMDAwMTAwIC8qKjwgU3VwcG9ydCBmbGFnIGluZGljYXRpbmcgaWYgMmNoIG91dHB1dCBpcyBwb3NzaWJsZSAgICAgICovCisjZGVmaW5lIENBUEZfTVBTXzZDSF9PVVQgXAorICAweDAwMDAwMjAwIC8qKjwgU3VwcG9ydCBmbGFnIGluZGljYXRpbmcgaWYgNmNoIG91dHB1dCBpcyBwb3NzaWJsZSAgICAgICovCisjZGVmaW5lIENBUEZfTVBTXzhDSF9PVVQgXAorICAweDAwMDAwNDAwIC8qKjwgU3VwcG9ydCBmbGFnIGluZGljYXRpbmcgaWYgOGNoIG91dHB1dCBpcyBwb3NzaWJsZSAgICAgICovCisjZGVmaW5lIENBUEZfTVBTXzFDSF9JTiBcCisgIDB4MDAwMDEwMDAgLyoqPCBTdXBwb3J0IGZsYWcgaW5kaWNhdGluZyBpZiAxY2ggZG14IGlucHV0IGlzIHBvc3NpYmxlICAgKi8KKyNkZWZpbmUgQ0FQRl9NUFNfMkNIX0lOIFwKKyAgMHgwMDAwMjAwMCAvKio8IFN1cHBvcnQgZmxhZyBpbmRpY2F0aW5nIGlmIDJjaCBkbXggaW5wdXQgaXMgcG9zc2libGUgICAqLworI2RlZmluZSBDQVBGX01QU182Q0hfSU4gXAorICAweDAwMDA0MDAwIC8qKjwgU3VwcG9ydCBmbGFnIGluZGljYXRpbmcgaWYgNWNoIGRteCBpbnB1dCBpcyBwb3NzaWJsZSAgICovCiAKLS8qIERNQiBjYXBhYmlsaXR5IGZsYWdzICovCi0jZGVmaW5lIENBUEZfRE1CX0JTQUMgICAgICAgICAweDAwMDAwMDAxICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgRVIgQUFDIEJTQUMuICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9ETUJfRFJDICAgICAgICAgIDB4MDAwMDAwMDggIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBEeW5hbWljIFJhbmdlIENvbnRyb2wuICAgICAgICAqLwotI2RlZmluZSBDQVBGX0RNQl9TVVJST1VORCAgICAgMHgwMDAwMDAxMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIERNQiBTdXJyb3VuZCAoTVBTKS4gICAgICAgICAgICovCi0KLS8qIFBDTSB1cC9kb3dubW1peCBjYXBhYmlsaXR5IGZsYWdzICovCi0jZGVmaW5lIENBUEZfRE1YX0JMSU5EICAgICAgICAweDAwMDAwMDAxICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgYmxpbmQgZG93bm1peGluZy4gICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ0FQRl9ETVhfUENFICAgICAgICAgIDB4MDAwMDAwMDIgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBndWlkZWQgZG93bm1peCB3aXRoIGRhdGEgZnJvbSBNUEVHLTIvNCBQcm9ncmFtIENvbmZpZyBFbGVtZW50cyAoUENFKS4gKi8KLSNkZWZpbmUgQ0FQRl9ETVhfQVJJQiAgICAgICAgIDB4MDAwMDAwMDQgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBQQ0UgZ3VpZGVkIGRvd25taXggd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQgZXF1YXRpb25zIGFuZCBsZXZlbHMgdG8gZnVsZmlsbCBBUklCIHN0YW5kYXJkLiAqLwotI2RlZmluZSBDQVBGX0RNWF9EVkIgICAgICAgICAgMHgwMDAwMDAwOCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIGd1aWRlZCBkb3dubWl4IHdpdGggZGF0YSBmcm9tIERWQiBhbmNpbGxhcnkgZGF0YSBmaWVsZHMuICovCi0jZGVmaW5lIENBUEZfRE1YX0NIX0VYUCAgICAgICAweDAwMDAwMDEwICAvKio8IFN1cHBvcnQgZmxhZyBmb3Igc2ltcGxlIHVwbWl4aW5nIGJ5IGR1YmxpY2F0aW5nIGNoYW5uZWxzIG9yIGFkZGluZyB6ZXJvIGNoYW5uZWxzLiAqLwogLyogXGVuZGNvbmQgKi8KIAotCiAvKgogICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICogTGlicmFyeSB2ZXJzaW9uaW5nCkBAIC01MTksMzcgKzY5NCw0NSBAQAogICovCiAKIC8qKgotICogQ29udmVydCBlYWNoIG1lbWJlciBvZiB2ZXJzaW9uIG51bWJlcnMgdG8gb25lIHNpbmdsZSBudW1lcmljIHZlcnNpb24gcmVwcmVzZW50YXRpb24uCisgKiBDb252ZXJ0IGVhY2ggbWVtYmVyIG9mIHZlcnNpb24gbnVtYmVycyB0byBvbmUgc2luZ2xlIG51bWVyaWMgdmVyc2lvbgorICogcmVwcmVzZW50YXRpb24uCiAgKiBccGFyYW0gbGV2MCAgMXN0IGxldmVsIG9mIHZlcnNpb24gbnVtYmVyLgogICogXHBhcmFtIGxldjEgIDJuZCBsZXZlbCBvZiB2ZXJzaW9uIG51bWJlci4KICAqIFxwYXJhbSBsZXYyICAzcmQgbGV2ZWwgb2YgdmVyc2lvbiBudW1iZXIuCi0gICovCi0jZGVmaW5lIExJQl9WRVJTSU9OKGxldjAsIGxldjEsIGxldjIpICgobGV2MDw8MjQgJiAweGZmMDAwMDAwKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZXYxPDwxNiAmIDB4MDBmZjAwMDApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldjI8PDggICYgMHgwMDAwZmYwMCkpCisgKi8KKyNkZWZpbmUgTElCX1ZFUlNJT04obGV2MCwgbGV2MSwgbGV2MikgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGxldjAgPDwgMjQgJiAweGZmMDAwMDAwKSB8IChsZXYxIDw8IDE2ICYgMHgwMGZmMDAwMCkgfCBcCisgICAobGV2MiA8PCA4ICYgMHgwMDAwZmYwMCkpCiAKIC8qKgogICogIEJ1aWxkIHRleHQgc3RyaW5nIG9mIHZlcnNpb24uCiAgKi8KLSNkZWZpbmUgTElCX1ZFUlNJT05fU1RSSU5HKGluZm8pIEZES3NwcmludGYoKGluZm8pLT52ZXJzaW9uU3RyLCAiJWQuJWQuJWQiLCAoKChpbmZvKS0+dmVyc2lvbiA+PiAyNCkgJiAweGZmKSwgKCgoaW5mbyktPnZlcnNpb24gPj4gMTYpICYgMHhmZiksICgoKGluZm8pLT52ZXJzaW9uID4+IDggKSAmIDB4ZmYpKQorI2RlZmluZSBMSUJfVkVSU0lPTl9TVFJJTkcoaW5mbykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRkRLc3ByaW50ZigoaW5mbyktPnZlcnNpb25TdHIsICIlZC4lZC4lZCIsICgoKGluZm8pLT52ZXJzaW9uID4+IDI0KSAmIDB4ZmYpLCBcCisgICAgICAgICAgICAgKCgoaW5mbyktPnZlcnNpb24gPj4gMTYpICYgMHhmZiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICgoKGluZm8pLT52ZXJzaW9uID4+IDgpICYgMHhmZikpCiAKIC8qKgogICogIExpYnJhcnkgaW5mb3JtYXRpb24uCiAgKi8KLXR5cGVkZWYgc3RydWN0IExJQl9JTkZPCi17Cit0eXBlZGVmIHN0cnVjdCBMSUJfSU5GTyB7CiAgIGNvbnN0IGNoYXIqIHRpdGxlOwogICBjb25zdCBjaGFyKiBidWlsZF9kYXRlOwogICBjb25zdCBjaGFyKiBidWlsZF90aW1lOwogICBGREtfTU9EVUxFX0lEIG1vZHVsZV9pZDsKICAgSU5UIHZlcnNpb247Ci0gIFVJTlQgIGZsYWdzOworICBVSU5UIGZsYWdzOwogICBjaGFyIHZlcnNpb25TdHJbMzJdOwogfSBMSUJfSU5GTzsKIAorI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIEZES19BVURJT19JTkxJTkUgaW5saW5lCisjZWxzZQorI2RlZmluZSBGREtfQVVESU9fSU5MSU5FCisjZW5kaWYKKwogLyoqIEluaXRpYWxpemUgbGlicmFyeSBpbmZvLiAqLwotc3RhdGljIGlubGluZSB2b2lkIEZES2luaXRMaWJJbmZvKCBMSUJfSU5GTyogaW5mbyApCi17CitzdGF0aWMgRkRLX0FVRElPX0lOTElORSB2b2lkIEZES2luaXRMaWJJbmZvKExJQl9JTkZPKiBpbmZvKSB7CiAgIGludCBpOwogCiAgIGZvciAoaSA9IDA7IGkgPCBGREtfTU9EVUxFX0xBU1Q7IGkrKykgewpAQCAtNTU4LDExICs3NDEsMTEgQEAKIH0KIAogLyoqIEFxdWlyZSBzdXBwb3J0ZWQgZmVhdHVyZXMgb2YgbGlicmFyeS4gKi8KLXN0YXRpYyBpbmxpbmUgVUlOVCBGREtsaWJJbmZvX2dldENhcGFiaWxpdGllcyggY29uc3QgTElCX0lORk8qIGluZm8sIEZES19NT0RVTEVfSUQgbW9kdWxlX2lkICkKLXsKK3N0YXRpYyBGREtfQVVESU9fSU5MSU5FIFVJTlQKK0ZES2xpYkluZm9fZ2V0Q2FwYWJpbGl0aWVzKGNvbnN0IExJQl9JTkZPKiBpbmZvLCBGREtfTU9EVUxFX0lEIG1vZHVsZV9pZCkgewogICBpbnQgaTsKIAotICBmb3IgKGk9MDsgaTxGREtfTU9EVUxFX0xBU1Q7IGkrKykgeworICBmb3IgKGkgPSAwOyBpIDwgRkRLX01PRFVMRV9MQVNUOyBpKyspIHsKICAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gbW9kdWxlX2lkKSB7CiAgICAgICByZXR1cm4gaW5mb1tpXS5mbGFnczsKICAgICB9CkBAIC01NzEsMjMgKzc1NCwxOSBAQAogfQogCiAvKiogU2VhcmNoIGZvciBuZXh0IGZyZWUgdGFiLiAqLwotc3RhdGljIGlubGluZSBJTlQgRkRLbGliSW5mb19sb29rdXAoIGNvbnN0IExJQl9JTkZPKiBpbmZvLCBGREtfTU9EVUxFX0lEIG1vZHVsZV9pZCApCi17CitzdGF0aWMgRkRLX0FVRElPX0lOTElORSBJTlQgRkRLbGliSW5mb19sb29rdXAoY29uc3QgTElCX0lORk8qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLX01PRFVMRV9JRCBtb2R1bGVfaWQpIHsKICAgaW50IGkgPSAtMTsKIAogICBmb3IgKGkgPSAwOyBpIDwgRkRLX01PRFVMRV9MQVNUOyBpKyspIHsKLSAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gbW9kdWxlX2lkKQotICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChpbmZvW2ldLm1vZHVsZV9pZCA9PSBGREtfTk9ORSkKLSAgICAgIGJyZWFrOworICAgIGlmIChpbmZvW2ldLm1vZHVsZV9pZCA9PSBtb2R1bGVfaWQpIHJldHVybiAtMTsKKyAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gRkRLX05PTkUpIGJyZWFrOwogICB9Ci0gIGlmIChpID09IEZES19NT0RVTEVfTEFTVCkKLSAgICByZXR1cm4gLTE7CisgIGlmIChpID09IEZES19NT0RVTEVfTEFTVCkgcmV0dXJuIC0xOwogCiAgIHJldHVybiBpOwogfQogCi0KIC8qCiAgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgKiBCdWZmZXIgZGVzY3JpcHRpb24KQEAgLTU5NywzNCArNzc2LDM1IEBACiAvKioKICAqICBJL08gYnVmZmVyIGRlc2NyaXB0b3IuCiAgKi8KLXR5cGVkZWYgc3RydWN0IEZES19idWZEZXNjcgotewotICB2b2lkICAqKnBwQmFzZTsgICAgIC8qITwgUG9pbnRlciB0byBhbiBhcnJheSBjb250YWluaW5nIGJ1ZmZlciBiYXNlIGFkZHJlc3Nlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byBOVUxMIGZvciBidWZmZXIgcmVxdWlyZW1lbnQgaW5mby4gKi8KLSAgVUlOVCAgICpwQnVmU2l6ZTsgICAvKiE8IFBvaW50ZXIgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgY2FuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBwbGFjZWQgaW4gdGhlIHNwZWNpZmljIGJ1ZmZlci4gKi8KLSAgVUlOVCAgICpwRWxlU2l6ZTsgICAvKiE8IFBvaW50ZXIgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudCBzaXplIGZvciBlYWNoIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYnl0ZXMuIFRoYXQgaXMgbW9zdGx5IHRoZSBudW1iZXIgcmV0dXJuZWQgYnkgdGhlIHNpemVvZigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBmb3IgdGhlIGRhdGEgdHlwZSB1c2VkIGZvciB0aGUgc3BlY2lmaWMgYnVmZmVyLiAqLwotICBVSU5UICAgKnBCdWZUeXBlOyAgIC8qITwgUG9pbnRlciB0byBhbiBhcnJheSBvZiBiaXQgZmllbGRzIGNvbnRhaW5pbmcgYSBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGVhY2ggYnVmZmVyLiBTZWUgWFhYIGJlbG93IGZvciBtb3JlIGRldGFpbHMuICAqLwotICBVSU5UICAgIG51bUJ1ZnM7ICAgIC8qITwgVG90YWwgbnVtYmVyIG9mIGJ1ZmZlcnMuICovCit0eXBlZGVmIHN0cnVjdCBGREtfYnVmRGVzY3IgeworICB2b2lkKiogcHBCYXNlOyAgLyohPCBQb2ludGVyIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgYnVmZmVyIGJhc2UgYWRkcmVzc2VzLgorICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gTlVMTCBmb3IgYnVmZmVyIHJlcXVpcmVtZW50IGluZm8uICovCisgIFVJTlQqIHBCdWZTaXplOyAvKiE8IFBvaW50ZXIgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICB0aGF0IGNhbiBiZSBwbGFjZWQgaW4gdGhlIHNwZWNpZmljIGJ1ZmZlci4gKi8KKyAgVUlOVCogcEVsZVNpemU7IC8qITwgUG9pbnRlciB0byBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50IHNpemUgZm9yIGVhY2gKKyAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBpbiBieXRlcy4gVGhhdCBpcyBtb3N0bHkgdGhlIG51bWJlciByZXR1cm5lZCBieSB0aGUKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZigpIG9wZXJhdG9yIGZvciB0aGUgZGF0YSB0eXBlIHVzZWQgZm9yIHRoZSBzcGVjaWZpYworICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLiAqLworICBVSU5UKgorICAgICAgcEJ1ZlR5cGU7IC8qITwgUG9pbnRlciB0byBhbiBhcnJheSBvZiBiaXQgZmllbGRzIGNvbnRhaW5pbmcgYSBkZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgZm9yIGVhY2ggYnVmZmVyLiBTZWUgWFhYIGJlbG93IGZvciBtb3JlIGRldGFpbHMuICAqLworICBVSU5UIG51bUJ1ZnM7IC8qITwgVG90YWwgbnVtYmVyIG9mIGJ1ZmZlcnMuICovCiAKIH0gRkRLX2J1ZkRlc2NyOwogCiAvKioKICAqIEJ1ZmZlciB0eXBlIGRlc2NyaXB0aW9uIGZpZWxkLgogICovCi0jZGVmaW5lIEZES19CVUZfVFlQRV9NQVNLX0lPICAgICAoIDB4MDMgPDwgMzAgKQotI2RlZmluZSBGREtfQlVGX1RZUEVfTUFTS19ERVNDUiAgKCAweDNGIDw8IDE2ICkKLSNkZWZpbmUgRkRLX0JVRl9UWVBFX01BU0tfSUQgICAgICggMHhGRiApCisjZGVmaW5lIEZES19CVUZfVFlQRV9NQVNLX0lPICgoVUlOVCkweDAzIDw8IDMwKQorI2RlZmluZSBGREtfQlVGX1RZUEVfTUFTS19ERVNDUiAoKFVJTlQpMHgzRiA8PCAxNikKKyNkZWZpbmUgRkRLX0JVRl9UWVBFX01BU0tfSUQgKChVSU5UKTB4RkYpCiAKLSNkZWZpbmUgRkRLX0JVRl9UWVBFX0lOUFVUICAgICAgICggMHgxIDw8IDMwICkKLSNkZWZpbmUgRkRLX0JVRl9UWVBFX09VVFBVVCAgICAgICggMHgyIDw8IDMwICkKKyNkZWZpbmUgRkRLX0JVRl9UWVBFX0lOUFVUICgoVUlOVCkweDEgPDwgMzApCisjZGVmaW5lIEZES19CVUZfVFlQRV9PVVRQVVQgKChVSU5UKTB4MiA8PCAzMCkKIAotI2RlZmluZSBGREtfQlVGX1RZUEVfUENNX0RBVEEgICAgKCAweDEgPDwgMTYgKQotI2RlZmluZSBGREtfQlVGX1RZUEVfQU5DX0RBVEEgICAgKCAweDIgPDwgMTYgKQotI2RlZmluZSBGREtfQlVGX1RZUEVfQlNfREFUQSAgICAgKCAweDQgPDwgMTYgKQorI2RlZmluZSBGREtfQlVGX1RZUEVfUENNX0RBVEEgKChVSU5UKTB4MSA8PCAxNikKKyNkZWZpbmUgRkRLX0JVRl9UWVBFX0FOQ19EQVRBICgoVUlOVCkweDIgPDwgMTYpCisjZGVmaW5lIEZES19CVUZfVFlQRV9CU19EQVRBICgoVUlOVCkweDQgPDwgMTYpCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvbGliU1lTL2luY2x1ZGUvYXVkaW8uaCBiL2xpYlNZUy9pbmNsdWRlL2F1ZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZjgzYWUuLjAwMDAwMDAKLS0tIGEvbGliU1lTL2luY2x1ZGUvYXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIEF1dGhvcjogTWFudWVsIEphbmRlcgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKiBcZmlsZSAgIGF1ZGlvLmgKLSAqICBcYnJpZWYgIEF1ZGlvIGRldmljZSBzdXBwb3J0LgotICoKLSAqIFRoaXMgY29tcG9uZW50IGZlYXR1cmVzIGF1ZGlvIHBsYXliYWNrIGFuZCBjYXB0dXJlIHdpdGggYSBjb21tb24gQVBJIGZvcgotICogYW55IHNvZnR3YXJlL2hhcmR3YXJlIHBsYXRmb3JtLgotICoKLSAqIElmIHlvdSB1c2UgTWljcm9zb2Z0IFZpc3VhbCBDKysgVmVyc2lvbiA2IGFuZCBLc21lZGlhLmggY2Fubm90IGJlIGZvdW5kLAotICogaW5zdGFsbGluZyBEaXJlY3RYIChlLmcuIGR4OXNka19zdW1tZXIyMDA0LmV4ZSkgc29sdmVzIGl0LgotICoKLSAqLwotCi0jaWZuZGVmIEFVRElPX0gKLSNkZWZpbmUgQVVESU9fSAotCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTWVMvaW5jbHVkZS9jbWRsX3BhcnNlci5oIGIvbGliU1lTL2luY2x1ZGUvY21kbF9wYXJzZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2ZTQxZC4uMDAwMDAwMAotLS0gYS9saWJTWVMvaW5jbHVkZS9jbWRsX3BhcnNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKLQotICAgQXV0aG9yKHMpOgotICAgRGVzY3JpcHRpb246IGNvbW1hbmQgbGluZSBwYXJzZXIKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiogXGZpbGUgICBjbWRsX3BhcnNlci5oCi0gKiAgXGJyaWVmICBDb21tYW5kIGxpbmUgcGFyc2VyLgotICoKLSAqICBUaGUgY29tbWFuZCBsaW5lIHBhcnNlciBjYW4gZXh0cmFjdCBjZXJ0YWluIGRhdGEgZmllbGRzIG91dCBvZiBhIGNoYXJhY3RlcgotICogIHN0cmluZyBhbmQgYXNzaWduIHZhbHVlcyB0byB2YXJpYWJsZXMuIEl0IGhhcyAyIG1haW4gZnVuY3Rpb25zLiBPbmUgdG8gcGFyc2UKLSAqICBhIGNvbW1hbmQgbGluZSBpbiB0aGUgZm9ybSBvZiBzdGFuZGFyZCBDIHJ1bnRpbWUgImFyZ2MiIGFuZCAiYXJndiIgcGFyYW1ldGVycywKLSAqICBhbmQgdGhlIG90aGVyIHRvIGFzc2VtYmxlIHRoZXNlIHBhcmFtZXRlcnMgcmVhZGluZyB0ZXh0IGxpbmVzIGZyb20gYSBmaWxlIGluCi0gKiAgY2FzZSB0aGUgQyBydW50aW1lIGRvZXMgbm90IHByb3ZpZGUgdGhlbS4KLSAqLwotCi0jaWZuZGVmICBfX1BBUlNFUl9ICi0jZGVmaW5lIF9fUEFSU0VSX0gKLQotCi0KLSNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKLQotI2RlZmluZSBDTURMX01BWF9TVFJMRU4gMjU1Ci0jZGVmaW5lIENNRExfTUFYX0FSR0MgICAgMzAKLQotLyogXGNvbmQgKi8KLS8qIFR5cGUgZGVmaW5pdGlvbiBmb3IgdGV4dCAqLwotCi0KLSNpZmRlZiBXSU4zMgotICAjaW5jbHVkZSA8dGNoYXIuaD4KLSAgI2lmbmRlZiBfdHN0b2YgIC8qIEZvciBWaXN1YWwgU3R1ZGlvIDYgKi8KLSAgICAjaWZkZWYgX1VOSUNPREUKLSAgICAgICNpbmNsdWRlIDx3Y2hhci5oPgotICAgICAgI2RlZmluZSBfdHN0b2YoeCkgICAoZmxvYXQpIHdjc3RvZCh4LCBOVUxMKSAgLyogRm9yIFZpc3VhbCBTdHVkaW8gNiAqLwotICAgICNlbHNlCi0gICAgICAjZGVmaW5lIF90c3RvZiAgICAgIGF0b2YKLSAgICAjZW5kaWYKLSAgI2VuZGlmCi0KLSAgI2lmbmRlZiBfdHN0b2wgIC8qIEZvciBWaXN1YWwgU3R1ZGlvIDYgKi8KLSAgICAjaWZkZWYgX1VOSUNPREUKLSAgICAgICNkZWZpbmUgX3RzdG9sICAgICAgX3d0b2wKLSAgICAjZWxzZQotICAgICAgI2RlZmluZSBfdHN0b2wgICAgICBhdG9sCi0gICAgI2VuZGlmCi0gICNlbmRpZgotCi0gICNpZm5kZWYgX3RzdG9pICAvKiBGb3IgVmlzdWFsIFN0dWRpbyA2ICovCi0gICAgI2lmZGVmIF9VTklDT0RFCi0gICAgICAjZGVmaW5lIF90c3RvaSAgICAgIF93dG9pCi0gICAgI2Vsc2UKLSAgICAgICNkZWZpbmUgX3RzdG9pICAgICAgYXRvaQotICAgICNlbmRpZgotICAjZW5kaWYKLQotICAjaWZuZGVmIFRFWFRDSEFSCi0gICAgI2RlZmluZSBURVhUQ0hBUiBjaGFyCi0gICNlbmRpZgotCi0gICNpZm5kZWYgX1RFWFQKLSAgICAjZGVmaW5lIF9URVhUCi0gICNlbmRpZgotCi0jZWxzZSAvKiBXSU4zMiAqLwotCi0gICAgI2RlZmluZSBURVhUQ0hBUiBjaGFyCi0gICAgI2RlZmluZSBfdGNzbGVuKGEpICBGREtzdHJsZW4oYSkKLSAgICAjZGVmaW5lIF90Y3NjcHkgICAgIHN0cmNweQotICAgICNkZWZpbmUgX3Rjc2NtcCAgICAgRkRLc3RyY21wCi0gICAgI2RlZmluZSBfdGNzbmNtcCAgICBGREtzdHJuY21wCi0gICAgI2RlZmluZSBfdHNjYW5mICAgICBzY2FuZgotICAgICNkZWZpbmUgX1RFWFQoeCkgICAgeAotICAgICNkZWZpbmUgX3Rmb3BlbiAgICAgZm9wZW4KLSAgICAjZGVmaW5lIF9mdHByaW50ZiAgIGZwcmludGYKLSAgICAjZGVmaW5lIF90Y3NuY3B5ICAgIEZES3N0cm5jcHkKLSAgICAjZGVmaW5lIF90c3RvZiAgICAgIEZES2F0b2YKLSAgICAjZGVmaW5lIF90c3RvbCAgICAgIEZES2F0b2wKLSAgICAjZGVmaW5lIF90c3RvaSAgICAgIEZES2F0b2kKLSAgICAjZGVmaW5lIF90Y3N0b2wgICAgIHN0cnRvbAotICAgICNkZWZpbmUgX2lzdGRpZ2l0ICAgaXNkaWdpdAotI2VuZGlmIC8qIFdJTjMyICovCi0KLS8qIFxlbmRjb25kICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLS8qKgotICogIFNjYW5zIGFyZ2MsIGFyZ3YgYW5kIGEgc2NhbmYgc3R5bGUgZm9ybWF0IHN0cmluZyBmb3IgcGFyYW1ldGVycyBhbmQgc3RvcmVzIHRoZQotICogIHZhbHVlcyBpbiB0aGUgdmFyaWFibGUgbnVtYmVyIG9mIHBvaW50ZXJzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uCi0KLSBGb3IgZXhhbXBsZToKLSAgIFxjb2RlCi0gICAjZGVmaW5lIEFSR19QQVJBTSAgIigtYSAlZCkgKC12ICUxKSIKLSAgICNkZWZpbmUgQVJHX1ZBTFVFICZjb25maWctPmFvdCwgJnZlcmJvc2UKLSAgIGludCBuRm91bmRBcmdzID0gSUlTX1NjYW5DbWRsKGFyZ2MsIGFyZ3YsIEFSR19QQVJBTSwgQVJHX1ZBTFVFKTsKLSAgIFxlbmRjb2RlCi0gICB3aGVyYXMgdGhlIHdpbGQtY2FyZHMgKFwlZCwgXCUxLCAuLikgZGVmaW5lIHRoZSBkYXRhIHR5cGUgb2YgdGhlIGFyZ3VtZW50OgotCS0gXCUxIGJvb2xlYW4gKGUuIGcuIC14KQotCS0gXCVkIGludGVnZXIgKGUuIGcuIC14IDIzKQotCS0gXCVmIGZsb2F0IChlLiBnLiAteCAzLjQpCi0JLSBcJXkgZG91YmxlIChlLiBnLiAteCAzMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NTAyODg0MTk3MTY5Mzk5Mzc1MSkKLQktIFwlcyBzdHJpbmcgKGUuIGcuIC14ICJmaWxlLmRhdCIpCi0JLSBcJXUgdW5zaWduZWQgY2hhcmFjdGVyIChlLiBnLiAteCAzKQotCS0gXCVjIHNpZ25lZCBjaGFyYWN0ZXIgKGUuIGcuIC14IC0zKQotICAgIE1vcmUgZXhhbXBsZXMgb24gaG93IHRvIHVzZSBpdCBhcmUgbG9jYXRlZCBpbiBldmVyeSAoZW5jb2Rlci9kZWNvZGVyKSBleGFtcGxlIGZyYW1ld29yay4KLQotICogXHBhcmFtIGFyZ2MgICAgICBOdW1iZXIgb2YgYXJndW1lbnRzLgotICogXHBhcmFtIGFyZ3YgICAgICBDb21wbGV0ZSBjaGFyYWN0ZXIgc3RyaW5nIG9mIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotICogXHBhcmFtIHBSZXFBcmdzICBBIGxpc3Qgb2YgcGFyYW1ldGVycyBhbmQgYSBjb3JyZXNwb25kaW5nIGxpc3Qgb2YgbWVtb3J5IGFkZHJlc3NlcyB0bwotICogICAgICAgICAgICAgICAgICBhc3NpZ24gZWFjaCBwYXJhbWV0ZXIgdG8uCi0gKgotICogXHJldHVybiAgTnVtYmVyIG9mIGZvdW5kIGFyZ3VtZW50cy4KLSAqLwotSU5UIElJU19TY2FuQ21kbChJTlQgYXJnYywgVEVYVENIQVIqIGFyZ3ZbXSwgY29uc3QgVEVYVENIQVIqIHBSZXFBcmdzLCAuLi4pOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0vKioKLSAqICBSZWFkcyBhIHRleHQgZmlsZSwgYXNzZW1ibGVzIGFyZ2MgYW5kIGFyZ3YgcGFyYW1ldGVycyBmb3IgZWFjaCB0ZXh0IGxpbmUKLSAqICBhbmQgY2FsbHMgdGhlIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoIHNldCBvZiBhcmdjLCBhcmd2IHBhcmFtZXRlcnMuCi0gKgotICogXHBhcmFtIHBhcmFtX2ZpbGVuYW1lICBOYW1lIG9mIHRleHQgZmlsZSB0aGF0IHNob3VsZCBiZSBwYXJzZWQuCi0gKiBccGFyYW0gcEZ1bmN0aW9uICAgICAgIFBvaW50ZXIgdG8gZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIGZvciBldmVyeSB0ZXh0IGxpbmUgZm91bmQuCi0gKgotICogXHJldHVybiAgMCBvbiBzdWNjZXNzLCAxIG9uIGZhaWx1cmUuCi0gKi8KLUlOVCBJSVNfUHJvY2Vzc0NtZGxMaXN0KGNvbnN0IFRFWFRDSEFSKiBwYXJhbV9maWxlbmFtZSwgaW50ICgqcEZ1bmN0aW9uKShpbnQsIFRFWFRDSEFSKiopKTsKLQotCi0jZW5kaWYgLyogX19QQVJTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvbGliU1lTL2luY2x1ZGUvY29udl9zdHJpbmcuaCBiL2xpYlNZUy9pbmNsdWRlL2NvbnZfc3RyaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDlkYzAuLjAwMDAwMDAKLS0tIGEvbGliU1lTL2luY2x1ZGUvY29udl9zdHJpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIEF1dGhvcihzKToKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiogXGZpbGUgICBjb252X3N0cmluZy5oCi0gKiAgXGJyaWVmICBTdHJpbmcgY29udmVyc2lvbiBmdW5jdGlvbnMuCi0gKi8KLQotI2lmbmRlZiBfQ09OVl9TVFJJTkdfSAotI2RlZmluZSBfQ09OVl9TVFJJTkdfSAotCi0KLQotI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLS8qKgotICogXGJyaWVmICAgICAgICAgICAgICAgIENvbnZlcnQgYSBiaXRidWZmZXIgdG8gYSBoZXggc3RyaW5nLgotICogXHBhcmFtIHN0cmluZyAgICAgICAgIEhleCBzdHJpbmcuCi0gKiBccGFyYW0gY2hhckJ1ZiAgICAgICAgSW5wdXQgYnVmZmVyIHRoYXQgaGFzIHRvIGJlIGNvbnZlcnRlZC4KLSAqIFxwYXJhbSBjaGFyQnVmTGVuZ3RoICBTaXplIG9mIHRoZSBpbnB1dCBidWZmZXIuCi0gKiBccmV0dXJuICAgICAgICAgICAgICAgRXJyb3IgY29kZS4KLSAqLwotSU5UIGNoYXJCdWYySGV4U3RyaW5nKGNoYXIgKnN0cmluZywgVUNIQVIgKmNoYXJCdWYsIElOVCBjaGFyQnVmTGVuZ3RoKTsKLQotLyoqCi0gKiBcYnJpZWYgICAgICAgICAgICAgICAgQ29udmVydCBhIGhleCBzdHJpbmcgdG8gYml0cy4KLSAqIFxwYXJhbSBzdHJpbmcgICAgICAgICBIZXggc3RyaW5nIHRoYXQgaGFzIHRvIGJlIGNvbnZlcnRlZC4KLSAqIFxwYXJhbSBjaGFyQnVmICAgICAgICBPdXRwdXQgYnVmZmVyIGhvbGRpbmcgdGhlIGJpdHMsIHdpbGwgYmUgZmlsbGVkIHVwIHdpdGggemVyb3MuCi0gKiBccGFyYW0gY2hhckJ1Zkxlbmd0aCAgU2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4KLSAqIFxyZXR1cm4gICAgICAgICAgICAgICBFcnJvciBjb2RlLgotICovCi1JTlQgaGV4U3RyaW5nMkNoYXJCdWYoY29uc3QgY2hhciAqc3RyaW5nLCBVQ0hBUiAqY2hhckJ1ZiwgVUlOVCBjaGFyQnVmTGVuZ3RoKTsKLQotLyoqCi0gKiBcYnJpZWYgICAgQ29udmVydCBhIGNoYXJhY3RlciByZXByZXNlbnRpbmcgYSBoZXggc2lnbiB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWUuCi0gKiBccGFyYW0gYyAgQ2hhcmFjdGVyIHRoYXQgaGFzIHRvIGJlIGNvbnZlcnRlZC4KLSAqIFxyZXR1cm4gICBDb252ZXJ0ZWQgdmFsdWUgKHZhbHVlIGJldHdlZW4gMCBhbmQgMTUpLCBpZiAxNiwgYW4gZXJyb3IgaGFzIG9jY3VyZWQuCi0gKi8KLVVDSEFSIGhleENoYXIyRGVjKGNvbnN0IGNoYXIgYyk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLQotI2VuZGlmIC8qIF9DT05WX1NUUklOR19IICovCmRpZmYgLS1naXQgYS9saWJTWVMvaW5jbHVkZS9nZW5lcmljU3Rkcy5oIGIvbGliU1lTL2luY2x1ZGUvZ2VuZXJpY1N0ZHMuaAppbmRleCBmZTRkYzM2Li44ODI4YmE3IDEwMDY0NAotLS0gYS9saWJTWVMvaW5jbHVkZS9nZW5lcmljU3Rkcy5oCisrKyBiL2xpYlNZUy9pbmNsdWRlL2dlbmVyaWNTdGRzLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksNDAgKzkwLDM0IEBACiAKIHd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KIGFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBTeXN0ZW0gaW50ZWdyYXRpb24gbGlicmFyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICBBdXRob3Iocyk6CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiogXGZpbGUgICBnZW5lcmljU3Rkcy5oCi0gICAgXGJyaWVmICBHZW5lcmljIFJ1bi1UaW1lIFN1cHBvcnQgZnVuY3Rpb24gd3JhcHBlcnMgYW5kIGhlYXAgYWxsb2NhdGlvbiBtb25pdG9yaW5nLgorICAgIFxicmllZiAgR2VuZXJpYyBSdW4tVGltZSBTdXBwb3J0IGZ1bmN0aW9uIHdyYXBwZXJzIGFuZCBoZWFwIGFsbG9jYXRpb24KKyAgIG1vbml0b3JpbmcuCiAgKi8KIAotI2lmICFkZWZpbmVkKF9fR0VORVJJQ1NURFNfSF9fKQotI2RlZmluZSBfX0dFTkVSSUNTVERTX0hfXworI2lmICFkZWZpbmVkKEdFTkVSSUNTVERTX0gpCisjZGVmaW5lIEdFTkVSSUNTVERTX0gKIAogI2luY2x1ZGUgIm1hY2hpbmVfdHlwZS5oIgogCi0KLS8qIEFsd2F5cyBpbmNyZWFzZSB2ZXJib3NpdHkgb2YgbWVtb3J5IGFsbG9jYXRpb24gaW4gY2FzZSBvZiBhIGRlYnVnIGJ1aWx0LiBERUJVRyBpcyBkZWZpbmVkIGdsb2JhbGx5IGluIHRoYXQgY2FzZS4gKi8KLSNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKEZES19ERUJVRykKLS8vI2RlZmluZSBNRU1PUllfTUVBU1VSRU1FTlQKLSNlbmRpZgotCiAjaWZuZGVmIE1fUEkKLSAgI2RlZmluZSBNX1BJICAgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NiAgLyohIFBpLiBPbmx5IHVzZWQgaW4gZXhhbXBsZSBwcm9qZWN0cy4gKi8KKyNkZWZpbmUgTV9QSSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2IC8qITwgUGkuIE9ubHkgdXNlZCBpbiBleGFtcGxlIHByb2plY3RzLiAqLwogI2VuZGlmCiAKLQotLyogI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgKi8KLQotCiAvKioKLSAqIElkZW50aWZpZXJzIGZvciB2YXJpb3VzIG1lbW9yeSBsb2NhdGlvbnMuIFRoZXkgYXJlIHVzZWQgYWxvbmcgd2l0aCBtZW1vcnkgYWxsb2NhdGlvbgotICogZnVuY3Rpb25zIGxpa2UgRkRLY2FsbG9jX0woKSB0byBzcGVjaWZ5IHRoZSByZXF1ZXN0ZWQgbWVtb3J5J3MgbG9jYXRpb24uCisgKiBJZGVudGlmaWVycyBmb3IgdmFyaW91cyBtZW1vcnkgbG9jYXRpb25zLiBUaGV5IGFyZSB1c2VkIGFsb25nIHdpdGggbWVtb3J5CisgKiBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBsaWtlIEZES2NhbGxvY19MKCkgdG8gc3BlY2lmeSB0aGUgcmVxdWVzdGVkIG1lbW9yeSdzCisgKiBsb2NhdGlvbi4KICAqLwogdHlwZWRlZiBlbnVtIHsKICAgLyogSW50ZXJuYWwgKi8KQEAgLTEyOCwxMDQgKzEzMywyNDcgQEAKIAogfSBNRU1PUllfU0VDVElPTjsKIAotCi0vKioKLSAqIFRoZSBIXyBwcmVmaXggaW5kaWNhdGVzIGhlYWRlciBmaWxlIHZlcnNpb24sIHRoZSBDXyogcHJlZml4IGluZGljYXRlcyB0aGUgY29ycmVzcG9uZGluZwotICogb2JqZWN0IHZlcnNpb24uCisvKiEgXGFkZHRvZ3JvdXAgU1lTTElCX01FTU9SWV9NQUNST1MgRkRLIG1lbW9yeSBtYWNyb3MKICAqCi0gKiBEZWNsYXJpbmcgbWVtb3J5IGFyZWFzIHJlcXVpcmVzIHRvIHNwZWNpZnkgYSB1bmlxdWUgbmFtZSBhbmQgYSBkYXRhIHR5cGUuIFVzZSB0aGUgSF8gbWFjcm8KLSAqIGZvciB0aGlzIHB1cnBvc2UgaW5zaWRlIGEgaGVhZGVyIGZpbGUuCisgKiBUaGUgXGMgSF8gcHJlZml4IGluZGljYXRlcyB0aGF0IHRoZSBtYWNybyBpcyB0byBiZSB1c2VkIGluIGEgaGVhZGVyIGZpbGUsIHRoZQorICogXGMgQ18gcHJlZml4IGluZGljYXRlcyB0aGF0IHRoZSBtYWNybyBpcyB0byBiZSB1c2VkIGluIGEgc291cmNlIGZpbGUuCiAgKgotICogRm9yIGRlZmluaW5nIGEgbWVtb3J5IGFyZWEgeW91ciByZXF1aXJlIGFkZGl0aW9uYWxseSBvbmUgb3IgdHdvIHNpemVzLCBkZXBlbmRpbmcgaWYgdGhlCi0gKiBtZW1vcnkgc2hvdWxkIGJlIG9yZ2FuaXplZCBpbnRvIG9uZSBvciB0d28gZGltZW5zaW9ucy4KKyAqIERlY2xhcmluZyBtZW1vcnkgYXJlYXMgcmVxdWlyZXMgdG8gc3BlY2lmeSBhIHVuaXF1ZSBuYW1lIGFuZCBhIGRhdGEgdHlwZS4KICAqCi0gKiBUaGUgbWFjcm9zIGNvbnRhaW5pbmcgdGhlIGtleXdvcmQgQUFMTE9DIGluc3RlYWQgb2YgQUxMT0MgYWxzbyBkbyB0YWtlIGNhcmUgb2YgcmV0dXJuaW5nCi0gKiBhbGlnbmVkIG1lbW9yeSBhZGRyZXNzZXMgKGJleW9uZCB0aGUgbmF0dXJhbCBhbGlnbm1lbnQgb2YgaXRzIHR5cGUpLiBUaGUgcHJlcHJvY2Vzb3IgbWFjcm8KLSAqIDo6QUxJR05NRU5UX0RFRkFVTFQgaW5kaWNhdGVzIHRoZSBhbGlnbWVudCB0byBiZSB1c2VkICh0aGlzIGlzIGhhcmR3YXJlIHNwZWNpZmljKS4KKyAqIEZvciBkZWZpbmluZyBhIG1lbW9yeSBhcmVhIHlvdSByZXF1aXJlIGFkZGl0aW9uYWxseSBvbmUgb3IgdHdvIHNpemVzLAorICogZGVwZW5kaW5nIGlmIHRoZSBtZW1vcnkgc2hvdWxkIGJlIG9yZ2FuaXplZCBpbnRvIG9uZSBvciB0d28gZGltZW5zaW9ucy4KICAqCi0gKiBUaGUgX0wgc3VmZml4IGluZGljYXRlcyB0aGF0IHRoZSBtZW1vcnkgd2lsbCBiZSBsb2NhdGVkIGluIGEgc3BlY2lmaWMgc2VjdGlvbi4gVGhpcyBpcwotICogdXNlZnVsIHRvIGFsbG9jYXRlIGNyaXRpY2FsIG1lbW9yeSBzZWN0aW9uIGludG8gZmFzdCBpbnRlcm5hbCBTUkFNIGZvciBleGFtcGxlLgorICogVGhlIG1hY3JvcyBjb250YWluaW5nIHRoZSBrZXl3b3JkIFxjIEFBTExPQyBpbnN0ZWFkIG9mIFxjIEFMTE9DIGFkZGl0aW9uYWxseQorICogdGFrZSBjYXJlIG9mIHJldHVybmluZyBhbGlnbmVkIG1lbW9yeSBhZGRyZXNzZXMgKGJleW9uZCB0aGUgbmF0dXJhbCBhbGlnbm1lbnQKKyAqIG9mIGl0cyB0eXBlKS4gVGhlIHByZXByb2Nlc29yIG1hY3JvCisgKiA6OkFMSUdOTUVOVF9ERUZBVUxUIGluZGljYXRlcyB0aGUgYWxpZ21lbnQgdG8gYmUgdXNlZCAodGhpcyBpcyBoYXJkd2FyZQorICogc3BlY2lmaWMpLgogICoKKyAqIFRoZSBcYyBfTCBzdWZmaXggaW5kaWNhdGVzIHRoYXQgdGhlIG1lbW9yeSB3aWxsIGJlIGxvY2F0ZWQgaW4gYSBzcGVjaWZpYworICogc2VjdGlvbi4gVGhpcyBpcyB1c2VmdWwgdG8gYWxsb2NhdGUgY3JpdGljYWwgbWVtb3J5IHNlY3Rpb24gaW50byBmYXN0CisgKiBpbnRlcm5hbCBTUkFNIGZvciBleGFtcGxlLgorICoKKyAqIEB7CiAgKi8KIAotI2RlZmluZSBIX0FMTE9DX01FTShuYW1lLHR5cGUpICAgICAgICAgIHR5cGUgKiBHZXQgIyMgbmFtZShpbnQgbj0wKTsgdm9pZCBGcmVlICMjIG5hbWUodHlwZSoqIHApOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBHZXRSZXF1aXJlZE1lbSAjIyBuYW1lKHZvaWQpOworLyoqIFNlZSBccmVmIFNZU0xJQl9NRU1PUllfTUFDUk9TIGZvciBkZXNjcmlwdGlvbi4gKi8KKyNkZWZpbmUgSF9BTExPQ19NRU0obmFtZSwgdHlwZSkgXAorICB0eXBlICpHZXQjI25hbWUoaW50IG4gPSAwKTsgICBcCisgIHZvaWQgRnJlZSMjbmFtZSh0eXBlICoqcCk7ICAgIFwKKyAgVUlOVCBHZXRSZXF1aXJlZE1lbSMjbmFtZSh2b2lkKTsKIAotLyoqIFNlZSAjSF9BTExPQ19NRU0gZm9yIGRlc2NyaXB0aW9uLiAqLwotI2RlZmluZSBIX0FMTE9DX01FTV9PVkVSTEFZKG5hbWUsdHlwZSkgIHR5cGUgKiBHZXQgIyMgbmFtZShpbnQgbj0wKTsgdm9pZCBGcmVlICMjIG5hbWUodHlwZSoqIHApOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBHZXRSZXF1aXJlZE1lbSAjIyBuYW1lKHZvaWQpOworLyoqIFNlZSBccmVmIFNZU0xJQl9NRU1PUllfTUFDUk9TIGZvciBkZXNjcmlwdGlvbi4gKi8KKyNkZWZpbmUgSF9BTExPQ19NRU1fT1ZFUkxBWShuYW1lLCB0eXBlKSBcCisgIHR5cGUgKkdldCMjbmFtZShpbnQgbiA9IDApOyAgICAgICAgICAgXAorICB2b2lkIEZyZWUjI25hbWUodHlwZSAqKnApOyAgICAgICAgICAgIFwKKyAgVUlOVCBHZXRSZXF1aXJlZE1lbSMjbmFtZSh2b2lkKTsKIAorLyoqIFNlZSBccmVmIFNZU0xJQl9NRU1PUllfTUFDUk9TIGZvciBkZXNjcmlwdGlvbi4gKi8KKyNkZWZpbmUgQ19BTExPQ19NRU0obmFtZSwgdHlwZSwgbnVtKSAgICAgICAgICAgICAgIFwKKyAgdHlwZSAqR2V0IyNuYW1lKGludCBuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGREtfQVNTRVJUKChuKSA9PSAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKCh0eXBlICopRkRLY2FsbG9jKG51bSwgc2l6ZW9mKHR5cGUpKSk7IFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBGcmVlIyNuYW1lKHR5cGUgKipwKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAocCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZES2ZyZWUoKnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICpwID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVUlOVCBHZXRSZXF1aXJlZE1lbSMjbmFtZSh2b2lkKSB7ICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQUxHTl9TSVpFX0VYVFJFUygobnVtKSAqIHNpemVvZih0eXBlKSk7IFwKKyAgfQogCi0gIC8qKiBTZWUgI0hfQUxMT0NfTUVNIGZvciBkZXNjcmlwdGlvbi4gKi8KLSAgI2RlZmluZSBDX0FMTE9DX01FTShuYW1lLHR5cGUsbnVtKSBcCi0gICAgdHlwZSAqIEdldCAjIyBuYW1lKGludCBuKSB7IEZES19BU1NFUlQoKG4pID09IDApOyByZXR1cm4gKCh0eXBlKilGREtjYWxsb2MobnVtLCBzaXplb2YodHlwZSkpKTsgfSBcCi0gICAgdm9pZCBGcmVlICMjIG5hbWUodHlwZSoqIHApIHsgaWYgKHAgIT0gTlVMTCkgeyBGREtmcmVlKCpwKTsgKnA9TlVMTDsgfSB9IFwKLSAgICBVSU5UIEdldFJlcXVpcmVkTWVtICMjIG5hbWUodm9pZCkgeyByZXR1cm4gQUxHTl9TSVpFX0VYVFJFUygobnVtKSAqIHNpemVvZih0eXBlKSk7IH0KKy8qKiBTZWUgXHJlZiBTWVNMSUJfTUVNT1JZX01BQ1JPUyBmb3IgZGVzY3JpcHRpb24uICovCisjZGVmaW5lIENfQUxMT0NfTUVNMihuYW1lLCB0eXBlLCBuMSwgbjIpICAgICAgICAgICAgICAgICBcCisgIHR5cGUgKkdldCMjbmFtZShpbnQgbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRkRLX0FTU0VSVCgobikgPCAobjIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICgodHlwZSAqKUZES2NhbGxvYyhuMSwgc2l6ZW9mKHR5cGUpKSk7ICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgRnJlZSMjbmFtZSh0eXBlICoqcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGREtmcmVlKCpwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAqcCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVJTlQgR2V0UmVxdWlyZWRNZW0jI25hbWUodm9pZCkgeyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIEFMR05fU0laRV9FWFRSRVMoKG4xKSAqIHNpemVvZih0eXBlKSkgKiAobjIpOyBcCisgIH0KIAotICAvKiogU2VlICNIX0FMTE9DX01FTSBmb3IgZGVzY3JpcHRpb24uICovCi0gICNkZWZpbmUgQ19BTExPQ19NRU1fU1RBVElDKG5hbWUsdHlwZSxudW0pIFwKLSAgICBzdGF0aWMgdHlwZSAqIEdldCAjIyBuYW1lKGludCBuKSB7IEZES19BU1NFUlQoKG4pID09IDApOyByZXR1cm4gKCh0eXBlKilGREtjYWxsb2MobnVtLCBzaXplb2YodHlwZSkpKTsgfSBcCi0gICAgc3RhdGljIHZvaWQgRnJlZSAjIyBuYW1lKHR5cGUqKiBwKSB7IGlmIChwICE9IE5VTEwpIHsgRkRLZnJlZSgqcCk7ICpwPU5VTEw7IH0gfSBcCi0gICAgc3RhdGljIFVJTlQgR2V0UmVxdWlyZWRNZW0gIyMgbmFtZSh2b2lkKSB7IHJldHVybiBBTEdOX1NJWkVfRVhUUkVTKChudW0pICogc2l6ZW9mKHR5cGUpKTsgfQorLyoqIFNlZSBccmVmIFNZU0xJQl9NRU1PUllfTUFDUk9TIGZvciBkZXNjcmlwdGlvbi4gKi8KKyNkZWZpbmUgQ19BQUxMT0NfTUVNKG5hbWUsIHR5cGUsIG51bSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlICpHZXQjI25hbWUoaW50IG4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZSAqYXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGREtfQVNTRVJUKChuKSA9PSAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFwID0gKCh0eXBlICopRkRLYWFsbG9jKChudW0pICogc2l6ZW9mKHR5cGUpLCBBTElHTk1FTlRfREVGQVVMVCkpOyBcCisgICAgcmV0dXJuIGFwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIEZyZWUjI25hbWUodHlwZSAqKnApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZES2FmcmVlKCpwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKnAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVSU5UIEdldFJlcXVpcmVkTWVtIyNuYW1lKHZvaWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIEFMR05fU0laRV9FWFRSRVMoKG51bSkgKiBzaXplb2YodHlwZSkgKyBBTElHTk1FTlRfREVGQVVMVCArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yodm9pZCAqKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CiAKLSAgLyoqIFNlZSAjSF9BTExPQ19NRU0gZm9yIGRlc2NyaXB0aW9uLiAqLwotICAjZGVmaW5lIENfQUxMT0NfTUVNMihuYW1lLHR5cGUsbjEsbjIpIFwKLSAgICB0eXBlICogR2V0ICMjIG5hbWUgKGludCBuKSB7IEZES19BU1NFUlQoKG4pIDwgKG4yKSk7IHJldHVybiAoKHR5cGUqKUZES2NhbGxvYyhuMSwgc2l6ZW9mKHR5cGUpKSk7IH0gXAotICAgIHZvaWQgRnJlZSAjIyBuYW1lKHR5cGUqKiBwKSB7IGlmIChwICE9IE5VTEwpIHsgRkRLZnJlZSgqcCk7ICpwPU5VTEw7IH0gfSBcCi0gICAgVUlOVCBHZXRSZXF1aXJlZE1lbSAjIyBuYW1lKHZvaWQpIHsgcmV0dXJuIEFMR05fU0laRV9FWFRSRVMoKG4xKSAqIHNpemVvZih0eXBlKSkgKiAobjIpOyB9CisvKiogU2VlIFxyZWYgU1lTTElCX01FTU9SWV9NQUNST1MgZm9yIGRlc2NyaXB0aW9uLiAqLworI2RlZmluZSBDX0FBTExPQ19NRU0yKG5hbWUsIHR5cGUsIG4xLCBuMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZSAqR2V0IyNuYW1lKGludCBuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZSAqYXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZES19BU1NFUlQoKG4pIDwgKG4yKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcCA9ICgodHlwZSAqKUZES2FhbGxvYygobjEpICogc2l6ZW9mKHR5cGUpLCBBTElHTk1FTlRfREVGQVVMVCkpOyBcCisgICAgcmV0dXJuIGFwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBGcmVlIyNuYW1lKHR5cGUgKipwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRkRLYWZyZWUoKnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICpwID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVUlOVCBHZXRSZXF1aXJlZE1lbSMjbmFtZSh2b2lkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIEFMR05fU0laRV9FWFRSRVMoKG4xKSAqIHNpemVvZih0eXBlKSArIEFMSUdOTUVOVF9ERUZBVUxUICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih2b2lkICopKSAqICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKG4yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KIAotICAvKiogU2VlICNIX0FMTE9DX01FTSBmb3IgZGVzY3JpcHRpb24uICovCi0gICNkZWZpbmUgQ19BQUxMT0NfTUVNKG5hbWUsdHlwZSxudW0pIFwKLSAgICB0eXBlICogR2V0ICMjIG5hbWUoaW50IG4pIHsgRkRLX0FTU0VSVCgobikgPT0gMCk7IHJldHVybiAoKHR5cGUqKUZES2FhbGxvYygobnVtKSpzaXplb2YodHlwZSksIEFMSUdOTUVOVF9ERUZBVUxUKSk7IH0gXAotICAgIHZvaWQgRnJlZSAjIyBuYW1lKHR5cGUqKiBwKSB7IGlmIChwICE9IE5VTEwpIHsgRkRLYWZyZWUoKnApOyAqcD1OVUxMOyB9IH0gXAotICAgIFVJTlQgR2V0UmVxdWlyZWRNZW0gIyMgbmFtZSh2b2lkKSB7IHJldHVybiBBTEdOX1NJWkVfRVhUUkVTKChudW0pICogc2l6ZW9mKHR5cGUpICsgQUxJR05NRU5UX0RFRkFVTFQgKyBzaXplb2Yodm9pZCAqKSk7IH0KKy8qKiBTZWUgXHJlZiBTWVNMSUJfTUVNT1JZX01BQ1JPUyBmb3IgZGVzY3JpcHRpb24uICovCisjZGVmaW5lIENfQUxMT0NfTUVNX0wobmFtZSwgdHlwZSwgbnVtLCBzKSAgICAgICAgICAgICAgIFwKKyAgdHlwZSAqR2V0IyNuYW1lKGludCBuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZES19BU1NFUlQoKG4pID09IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICgodHlwZSAqKUZES2NhbGxvY19MKG51bSwgc2l6ZW9mKHR5cGUpLCBzKSk7IFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIEZyZWUjI25hbWUodHlwZSAqKnApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZES2ZyZWVfTCgqcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKnAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVSU5UIEdldFJlcXVpcmVkTWVtIyNuYW1lKHZvaWQpIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIEFMR05fU0laRV9FWFRSRVMoKG51bSkgKiBzaXplb2YodHlwZSkpOyAgICAgIFwKKyAgfQogCi0gIC8qKiBTZWUgI0hfQUxMT0NfTUVNIGZvciBkZXNjcmlwdGlvbi4gKi8KLSAgI2RlZmluZSBDX0FBTExPQ19NRU0yKG5hbWUsdHlwZSxuMSxuMikgXAotICAgIHR5cGUgKiBHZXQgIyMgbmFtZSAoaW50IG4pIHsgRkRLX0FTU0VSVCgobikgPCAobjIpKTsgcmV0dXJuICgodHlwZSopRkRLYWFsbG9jKChuMSkqc2l6ZW9mKHR5cGUpLCBBTElHTk1FTlRfREVGQVVMVCkpOyB9IFwKLSAgICB2b2lkIEZyZWUgIyMgbmFtZSh0eXBlKiogcCkgeyBpZiAocCAhPSBOVUxMKSB7IEZES2FmcmVlKCpwKTsgKnA9TlVMTDsgfSB9IFwKLSAgICBVSU5UIEdldFJlcXVpcmVkTWVtICMjIG5hbWUodm9pZCkgeyByZXR1cm4gQUxHTl9TSVpFX0VYVFJFUygobjEpICogc2l6ZW9mKHR5cGUpICsgQUxJR05NRU5UX0RFRkFVTFQgKyBzaXplb2Yodm9pZCAqKSkgKiAobjIpOyB9CisvKiogU2VlIFxyZWYgU1lTTElCX01FTU9SWV9NQUNST1MgZm9yIGRlc2NyaXB0aW9uLiAqLworI2RlZmluZSBDX0FMTE9DX01FTTJfTChuYW1lLCB0eXBlLCBuMSwgbjIsIHMpICAgICAgICAgICAgXAorICB0eXBlICpHZXQjI25hbWUoaW50IG4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZES19BU1NFUlQoKG4pIDwgKG4yKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAodHlwZSAqKUZES2NhbGxvY19MKG4xLCBzaXplb2YodHlwZSksIHMpOyAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIEZyZWUjI25hbWUodHlwZSAqKnApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRkRLZnJlZV9MKCpwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKnAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVSU5UIEdldFJlcXVpcmVkTWVtIyNuYW1lKHZvaWQpIHsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBBTEdOX1NJWkVfRVhUUkVTKChuMSkgKiBzaXplb2YodHlwZSkpICogKG4yKTsgXAorICB9CiAKLSAgLyoqIFNlZSAjSF9BTExPQ19NRU0gZm9yIGRlc2NyaXB0aW9uLiAqLwotICAjZGVmaW5lIENfQUxMT0NfTUVNX0wobmFtZSx0eXBlLG51bSxzKSBcCi0gICAgdHlwZSAqIEdldCAjIyBuYW1lKGludCBuKSB7IEZES19BU1NFUlQoKG4pID09IDApOyByZXR1cm4gKCh0eXBlKilGREtjYWxsb2NfTChudW0sIHNpemVvZih0eXBlKSwgcykpOyB9IFwKLSAgICB2b2lkIEZyZWUgIyMgbmFtZSh0eXBlKiogcCkgeyBpZiAocCAhPSBOVUxMKSB7IEZES2ZyZWVfTCgqcCk7ICpwPU5VTEw7IH0gfSBcCi0gICAgVUlOVCBHZXRSZXF1aXJlZE1lbSAjIyBuYW1lKHZvaWQpIHsgcmV0dXJuIEFMR05fU0laRV9FWFRSRVMoKG51bSkgKiBzaXplb2YodHlwZSkpOyB9CisvKiogU2VlIFxyZWYgU1lTTElCX01FTU9SWV9NQUNST1MgZm9yIGRlc2NyaXB0aW9uLiAqLworI2RlZmluZSBDX0FBTExPQ19NRU1fTChuYW1lLCB0eXBlLCBudW0sIHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZSAqR2V0IyNuYW1lKGludCBuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZSAqYXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZES19BU1NFUlQoKG4pID09IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcCA9ICgodHlwZSAqKUZES2FhbGxvY19MKChudW0pICogc2l6ZW9mKHR5cGUpLCBBTElHTk1FTlRfREVGQVVMVCwgcykpOyBcCisgICAgcmV0dXJuIGFwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBGcmVlIyNuYW1lKHR5cGUgKipwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRkRLYWZyZWVfTCgqcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICpwID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVUlOVCBHZXRSZXF1aXJlZE1lbSMjbmFtZSh2b2lkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIEFMR05fU0laRV9FWFRSRVMoKG51bSkgKiBzaXplb2YodHlwZSkgKyBBTElHTk1FTlRfREVGQVVMVCArICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih2b2lkICopKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQogCi0gIC8qKiBTZWUgI0hfQUxMT0NfTUVNIGZvciBkZXNjcmlwdGlvbi4gKi8KLSAgI2RlZmluZSBDX0FMTE9DX01FTTJfTChuYW1lLHR5cGUsbjEsbjIscykgXAotICAgIHR5cGUgKiBHZXQgIyMgbmFtZSAoaW50IG4pIHsgRkRLX0FTU0VSVCgobikgPCAobjIpKTsgcmV0dXJuICh0eXBlKilGREtjYWxsb2NfTChuMSwgc2l6ZW9mKHR5cGUpLCBzKTsgfSBcCi0gICAgdm9pZCBGcmVlICMjIG5hbWUodHlwZSoqIHApIHsgaWYgKHAgIT0gTlVMTCkgeyBGREtmcmVlX0woKnApOyAqcD1OVUxMOyB9IH0gXAotICAgIFVJTlQgR2V0UmVxdWlyZWRNZW0gIyMgbmFtZSh2b2lkKSB7IHJldHVybiBBTEdOX1NJWkVfRVhUUkVTKChuMSkgKiBzaXplb2YodHlwZSkpICogKG4yKTsgfQorLyoqIFNlZSBccmVmIFNZU0xJQl9NRU1PUllfTUFDUk9TIGZvciBkZXNjcmlwdGlvbi4gKi8KKyNkZWZpbmUgQ19BQUxMT0NfTUVNMl9MKG5hbWUsIHR5cGUsIG4xLCBuMiwgcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZSAqR2V0IyNuYW1lKGludCBuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlICphcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGREtfQVNTRVJUKChuKSA8IChuMikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcCA9ICgodHlwZSAqKUZES2FhbGxvY19MKChuMSkgKiBzaXplb2YodHlwZSksIEFMSUdOTUVOVF9ERUZBVUxULCBzKSk7IFwKKyAgICByZXR1cm4gYXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBGcmVlIyNuYW1lKHR5cGUgKipwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAocCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZES2FmcmVlX0woKnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICpwID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVUlOVCBHZXRSZXF1aXJlZE1lbSMjbmFtZSh2b2lkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQUxHTl9TSVpFX0VYVFJFUygobjEpICogc2l6ZW9mKHR5cGUpICsgQUxJR05NRU5UX0RFRkFVTFQgKyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yodm9pZCAqKSkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgKG4yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQogCi0gIC8qKiBTZWUgI0hfQUxMT0NfTUVNIGZvciBkZXNjcmlwdGlvbi4gKi8KLSAgI2RlZmluZSBDX0FBTExPQ19NRU1fTChuYW1lLHR5cGUsbnVtLHMpIFwKLSAgICB0eXBlICogR2V0ICMjIG5hbWUoaW50IG4pIHsgRkRLX0FTU0VSVCgobikgPT0gMCk7IHJldHVybiAoKHR5cGUqKUZES2FhbGxvY19MKChudW0pKnNpemVvZih0eXBlKSwgQUxJR05NRU5UX0RFRkFVTFQsIHMpKTsgfSBcCi0gICAgdm9pZCBGcmVlICMjIG5hbWUodHlwZSoqIHApIHsgaWYgKHAgIT0gTlVMTCkgeyBGREthZnJlZV9MKCpwKTsgKnA9TlVMTDsgfSB9IFwKLSAgICBVSU5UIEdldFJlcXVpcmVkTWVtICMjIG5hbWUodm9pZCkgeyByZXR1cm4gQUxHTl9TSVpFX0VYVFJFUygobnVtKSAqIHNpemVvZih0eXBlKSArIEFMSUdOTUVOVF9ERUZBVUxUICsgc2l6ZW9mKHZvaWQgKikpOyB9CisvKiogU2VlIFxyZWYgU1lTTElCX01FTU9SWV9NQUNST1MgZm9yIGRlc2NyaXB0aW9uLiAqLworI2RlZmluZSBDX0FMTE9DX01FTV9PVkVSTEFZKG5hbWUsIHR5cGUsIG51bSwgc2VjdCwgdGFnKSBcCisgIENfQUFMTE9DX01FTV9MKG5hbWUsIHR5cGUsIG51bSwgc2VjdCkKIAotICAvKiogU2VlICNIX0FMTE9DX01FTSBmb3IgZGVzY3JpcHRpb24uICovCi0gICNkZWZpbmUgQ19BQUxMT0NfTUVNMl9MKG5hbWUsdHlwZSxuMSxuMixzKSBcCi0gICAgdHlwZSAqIEdldCAjIyBuYW1lIChpbnQgbikgeyBGREtfQVNTRVJUKChuKSA8IChuMikpOyByZXR1cm4gKCh0eXBlKilGREthYWxsb2NfTCgobjEpKnNpemVvZih0eXBlKSwgQUxJR05NRU5UX0RFRkFVTFQsIHMpKTsgfSBcCi0gICAgdm9pZCBGcmVlICMjIG5hbWUodHlwZSoqIHApIHsgaWYgKHAgIT0gTlVMTCkgeyBGREthZnJlZV9MKCpwKTsgKnA9TlVMTDsgfSB9IFwKLSAgICBVSU5UIEdldFJlcXVpcmVkTWVtICMjIG5hbWUodm9pZCkgeyByZXR1cm4gQUxHTl9TSVpFX0VYVFJFUygobjEpICogc2l6ZW9mKHR5cGUpICsgQUxJR05NRU5UX0RFRkFVTFQgKyBzaXplb2Yodm9pZCAqKSkgKiAobjIpOyB9CisvKiogU2VlIFxyZWYgU1lTTElCX01FTU9SWV9NQUNST1MgZm9yIGRlc2NyaXB0aW9uLiAqLworI2RlZmluZSBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKG5hbWUsIHR5cGUsIG4pICAgICAgICAgICAgICAgICBcCisgIHR5cGUgXyMjbmFtZVsobikgKyAoQUxJR05NRU5UX0RFRkFVTFQgKyBzaXplb2YodHlwZSkgLSAxKV07IFwKKyAgdHlwZSAqbmFtZSA9ICh0eXBlICopQUxJR05fUFRSKF8jI25hbWUpOyAgICAgICAgICAgICAgICAgICAgXAorICBDX0FMTE9DX0FMSUdORURfUkVHSVNURVIobmFtZSwgKG4pICogc2l6ZW9mKHR5cGUpKTsKIAotLyoqIFNlZSAjSF9BTExPQ19NRU1fT1ZFUkxBWSBmb3IgZGVzY3JpcHRpb24uICovCisvKiogU2VlIFxyZWYgU1lTTElCX01FTU9SWV9NQUNST1MgZm9yIGRlc2NyaXB0aW9uLiAqLworI2RlZmluZSBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQobmFtZSwgdHlwZSwgbikgdHlwZSBuYW1lW25dOwogCisvKiogU2VlIFxyZWYgU1lTTElCX01FTU9SWV9NQUNST1MgZm9yIGRlc2NyaXB0aW9uLiAqLworI2RlZmluZSBDX0FBTExPQ19TQ1JBVENIX0VORChuYW1lLCB0eXBlLCBuKSBDX0FMTE9DX0FMSUdORURfVU5SRUdJU1RFUihuYW1lKTsKKy8qKiBTZWUgXHJlZiBTWVNMSUJfTUVNT1JZX01BQ1JPUyBmb3IgZGVzY3JpcHRpb24uICovCisjZGVmaW5lIENfQUxMT0NfU0NSQVRDSF9FTkQobmFtZSwgdHlwZSwgbikKIAotICAjZGVmaW5lIENfQUxMT0NfTUVNX09WRVJMQVkobmFtZSx0eXBlLG51bSxzZWN0LHRhZykgQ19BQUxMT0NfTUVNX0wobmFtZSx0eXBlLG51bSxzZWN0KQorLyoqIFNlZSBccmVmIFNZU0xJQl9NRU1PUllfTUFDUk9TIGZvciBkZXNjcmlwdGlvbi4gKi8KKyNkZWZpbmUgQ19BQUxMT0NfU1RBQ0tfU1RBUlQobmFtZSwgdHlwZSwgbikgICAgICAgICAgICAgICAgICAgXAorICB0eXBlIF8jI25hbWVbKG4pICsgKEFMSUdOTUVOVF9ERUZBVUxUICsgc2l6ZW9mKHR5cGUpIC0gMSldOyBcCisgIHR5cGUgKm5hbWUgPSAodHlwZSAqKUFMSUdOX1BUUihfIyNuYW1lKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgQ19BTExPQ19BTElHTkVEX1JFR0lTVEVSKG5hbWUsIChuKSAqIHNpemVvZih0eXBlKSk7CiAKKy8qKiBTZWUgXHJlZiBTWVNMSUJfTUVNT1JZX01BQ1JPUyBmb3IgZGVzY3JpcHRpb24uICovCisjZGVmaW5lIENfQUFMTE9DX1NUQUNLX0VORChuYW1lLCB0eXBlLCBuKSBDX0FMTE9DX0FMSUdORURfVU5SRUdJU1RFUihuYW1lKTsKIAotICAgI2RlZmluZSBDX0FBTExPQ19TQ1JBVENIX1NUQVJUKG5hbWUsdHlwZSxuKSBcCi0gICAgIHR5cGUgXyAjIyBuYW1lWyhuKSsoQUxJR05NRU5UX0RFRkFVTFQrc2l6ZW9mKHR5cGUpLTEpXTsgXAotICAgICB0eXBlICogbmFtZSA9ICh0eXBlKilBTElHTl9QVFIoXyAjIyBuYW1lKTsgXAorLyohIEB9ICovCiAKLSAgICNkZWZpbmUgQ19BTExPQ19TQ1JBVENIX1NUQVJUKG5hbWUsdHlwZSxuKSBcCi0gICAgIHR5cGUgbmFtZVtuXTsKKyNkZWZpbmUgQ19BTExPQ19BTElHTkVEX1JFR0lTVEVSKHgsIHNpemUpCisjZGVmaW5lIENfQUxMT0NfQUxJR05FRF9VTlJFR0lTVEVSKHgpCisjZGVmaW5lIENfQUxMT0NfQUxJR05FRF9DSEVDSyh4KQorI2RlZmluZSBDX0FMTE9DX0FMSUdORURfQ0hFQ0syKHgsIHkpCisjZGVmaW5lIEZES19zaG93QmFja3RyYWNlKGEsIGIpCiAKLSAgICNkZWZpbmUgQ19BQUxMT0NfU0NSQVRDSF9FTkQobmFtZSx0eXBlLG4pCi0gICAjZGVmaW5lIENfQUxMT0NfU0NSQVRDSF9FTkQobmFtZSx0eXBlLG4pCi0KKy8qISBcYWRkdG9ncm91cCBTWVNMSUJfRVhJVENPREVTIFVuaWZpZWQgZXhpdCBjb2RlcworICogIEV4aXQgY29kZXMgdG8gYmUgdXNlZCBhcyByZXR1cm4gdmFsdWVzIG9mIEZESyBzb2Z0d2FyZSB0ZXN0IGFuZAorICogZGVtb25zdHJhdGlvbiBhcHBsaWNhdGlvbnMuIE5vdCBhcyByZXR1cm4gdmFsdWVzIG9mIHByb2R1Y3QgbW9kdWxlcyBhbmQvb3IKKyAqIGxpYnJhcmllcy4KKyAqICBAeworICovCisjZGVmaW5lIEZES19FWElUQ09ERV9PSyAwIC8qITwgU3VjY2Vzc2Z1bCB0ZXJtaW5hdGlvbi4gTm8gZXJyb3JzLiAqLworI2RlZmluZSBGREtfRVhJVENPREVfVVNBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgNjQgLyohPCBUaGUgY29tbWFuZC9hcHBsaWNhdGlvbiB3YXMgdXNlZCBpbmNvcnJlY3RseSwgZS5nLiB3aXRoIHRoZSB3cm9uZyBcCisgICAgICAgIG51bWJlciBvZiBhcmd1bWVudHMsIGEgYmFkIGZsYWcsIGEgYmFkIHN5bnRheCBpbiBhIHBhcmFtZXRlciwgb3IgICAgXAorICAgICAgICB3aGF0ZXZlci4gKi8KKyNkZWZpbmUgRkRLX0VYSVRDT0RFX0RBVEFFUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA2NSAvKiE8IFRoZSBpbnB1dCBkYXRhIHdhcyBpbmNvcnJlY3QgaW4gc29tZSB3YXkuIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBcCisgICAgICAgIGZvciB1c2VyIGRhdGEgYW5kIG5vdCBzeXN0ZW0gZmlsZXMuICovCisjZGVmaW5lIEZES19FWElUQ09ERV9OT0lOUFVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA2NiAvKiE8IEFuIGlucHV0IGZpbGUgKG5vdCBhIHN5c3RlbSBmaWxlKSBkaWQgbm90IGV4aXN0IG9yIHdhcyBub3QgcmVhZGFibGUuIFwKKyAgICAgICovCisjZGVmaW5lIEZES19FWElUQ09ERV9VTkFWQUlMQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDY5IC8qITwgQSBzZXJ2aWNlIGlzIHVuYXZhaWxhYmxlLiBUaGlzIGNhbiBvY2N1ciBpZiBhIHN1cHBvcnQgcHJvZ3JhbSBvciAgICBcCisgICAgICAgIGZpbGUgZG9lcyBub3QgZXhpc3QuIFRoaXMgY2FuIGFsc28gYmUgdXNlZCBhcyBhIGNhdGNoYWxsIG1lc3NhZ2Ugd2hlbiBcCisgICAgICAgIHNvbWV0aGluZyB5b3Ugd2FudGVkIHRvIGRvIGRvZXNuJ3Qgd29yaywgYnV0IHlvdSBkb24ndCBrbm93IHdoeS4gKi8KKyNkZWZpbmUgRkRLX0VYSVRDT0RFX1NPRlRXQVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDcwIC8qITwgQW4gaW50ZXJuYWwgc29mdHdhcmUgZXJyb3IgaGFzIGJlZW4gZGV0ZWN0ZWQuIFRoaXMgc2hvdWxkIGJlIGxpbWl0ZWQgXAorICAgICAgICB0byBub24tIG9wZXJhdGluZyBzeXN0ZW0gcmVsYXRlZCBlcnJvcnMgYXMgcG9zc2libGUuICovCisjZGVmaW5lIEZES19FWElUQ09ERV9DQU5UQ1JFQVRFIFwKKyAgNzMgLyohPCBBICh1c2VyIHNwZWNpZmllZCkgb3V0cHV0IGZpbGUgY2Fubm90IGJlIGNyZWF0ZWQuICovCisjZGVmaW5lIEZES19FWElUQ09ERV9JT0VSUk9SIFwKKyAgNzQgLyohPCBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBkb2luZyBJL08gb24gc29tZSBmaWxlLiAqLworLyohIEB9ICovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFJ1bnRpbWUgc3VwcG9ydCBkZWNsYXJhdGlvbnMKQEAgLTIzNCw1NyArMzgyLDUyIEBACiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi0vKiogcHJpbnRmKCkgdXNpbmcgc3Rkb3V0LiBJZiA6OkFSQ0hfV0FfRkxVU0hfQ09OU09MRSBkZWZpbmVkLCBhIGZsdXNoIGlzICBkb25lIGFkZGl0aW9uYWxseSBhZnRlciBwcmludGYoKS4gKi8KLXZvaWQgRkRLcHJpbnRmICAgICggY29uc3QgY2hhciogc3pGbXQsIC4uLik7Cit2b2lkIEZES3ByaW50Zihjb25zdCBjaGFyICpzekZtdCwgLi4uKTsKIAotLyoqIHByaW50ZigpIHVzaW5nIHN0ZGVyci4gSWYgOjpBUkNIX1dBX0ZMVVNIX0NPTlNPTEUgZGVmaW5lZCwgYSBmbHVzaCBpcyBkb25lIGFkZGl0aW9uYWxseSBhZnRlciBwcmludGYoKS4gKi8KLXZvaWQgRkRLcHJpbnRmRXJyICggY29uc3QgY2hhciogc3pGbXQsIC4uLik7Cit2b2lkIEZES3ByaW50ZkVycihjb25zdCBjaGFyICpzekZtdCwgLi4uKTsKIAogLyoqIFdyYXBwZXIgZm9yIDxzdGRpby5oPidzIGdldGNoYXIoKS4gKi8KIGludCBGREtnZXRjaGFyKHZvaWQpOwogCi1JTlQgIEZES2ZwcmludGYodm9pZCAgKnN0cmVhbSwgIGNvbnN0ICBjaGFyICpmb3JtYXQsIC4uLik7Ci1JTlQgIEZES3NwcmludGYoY2hhciAqc3RyLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitJTlQgRkRLZnByaW50Zih2b2lkICpzdHJlYW0sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKK0lOVCBGREtzcHJpbnRmKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOwogCi0KLQotY29uc3QgY2hhciAqRkRLc3RyY2hyKGNvbnN0IGNoYXIgKnMsIElOVCBjKTsKK2NoYXIgKkZES3N0cmNocihjaGFyICpzLCBJTlQgYyk7CiBjb25zdCBjaGFyICpGREtzdHJzdHIoY29uc3QgY2hhciAqaGF5c3RhY2ssIGNvbnN0IGNoYXIgKm5lZWRsZSk7CiBjaGFyICpGREtzdHJjcHkoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKTsKIGNoYXIgKkZES3N0cm5jcHkoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjLCBjb25zdCBVSU5UIG4pOwogCi0jZGVmaW5lIEZES19NQVhfT1ZFUkxBWVMgOCAgIC8qKjwgTWF4aW11bSBudW1iZXIgb2YgbWVtb3J5IG92ZXJsYXlzLiAqLworI2RlZmluZSBGREtfTUFYX09WRVJMQVlTIDggLyoqPCBNYXhpbXVtIG51bWJlciBvZiBtZW1vcnkgb3ZlcmxheXMuICovCiAKLQotdm9pZCAqRkRLY2FsbG9jIChjb25zdCBVSU5UIG4sIGNvbnN0IFVJTlQgc2l6ZSk7Ci12b2lkICpGREttYWxsb2MgKGNvbnN0IFVJTlQgc2l6ZSk7Ci12b2lkICBGREtmcmVlICAgKHZvaWQgKnB0cik7Cit2b2lkICpGREtjYWxsb2MoY29uc3QgVUlOVCBuLCBjb25zdCBVSU5UIHNpemUpOwordm9pZCAqRkRLbWFsbG9jKGNvbnN0IFVJTlQgc2l6ZSk7Cit2b2lkIEZES2ZyZWUodm9pZCAqcHRyKTsKIAogLyoqCi0gKiAgQWxsb2NhdGUgYW5kIGNsZWFyIGFuIGFsaWduZWQgbWVtb3J5IGFyZWEuIFVzZSBGREthZnJlZSgpIGluc3RlYWQgb2YgRkRLZnJlZSgpIGZvciB0aGVzZSBtZW1vcnkgYXJlYXMuCisgKiAgQWxsb2NhdGUgYW5kIGNsZWFyIGFuIGFsaWduZWQgbWVtb3J5IGFyZWEuIFVzZSBGREthZnJlZSgpIGluc3RlYWQgb2YKKyAqIEZES2ZyZWUoKSBmb3IgdGhlc2UgbWVtb3J5IGFyZWFzLgogICoKICAqIFxwYXJhbSBzaXplICAgICAgIFNpemUgb2YgcmVxdWVzdGVkIG1lbW9yeSBpbiBieXRlcy4KICAqIFxwYXJhbSBhbGlnbm1lbnQgIEFsaWdubWVudCBvZiByZXF1ZXN0ZWQgbWVtb3J5IGluIGJ5dGVzLgogICogXHJldHVybiAgICAgICAgICAgUG9pbnRlciB0byBhbGxvY2F0ZWQgbWVtb3J5LgogICovCi12b2lkICpGREthYWxsb2MgKGNvbnN0IFVJTlQgc2l6ZSwgY29uc3QgVUlOVCBhbGlnbm1lbnQpOwordm9pZCAqRkRLYWFsbG9jKGNvbnN0IFVJTlQgc2l6ZSwgY29uc3QgVUlOVCBhbGlnbm1lbnQpOwogCiAvKioKICAqICBGcmVlIGFuIGFsaWduZWQgbWVtb3J5IGFyZWEuCiAgKgogICogXHBhcmFtIHB0ciAgUG9pbnRlciB0byBiZSBmcmVlZC4KLSAqIFxyZXR1cm4gICAgIHZvaWQKICAqLwotdm9pZCBGREthZnJlZSAodm9pZCAqcHRyKTsKLQordm9pZCBGREthZnJlZSh2b2lkICpwdHIpOwogCiAvKioKICAqICBBbGxvY2F0ZSBtZW1vcnkgaW4gYSBzcGVjaWZpYyBtZW1vcnkgc2VjdGlvbi4KICAqICBSZXF1ZXN0cyBjYW4gYmUgbWFkZSBmb3IgaW50ZXJuYWwgb3IgZXh0ZXJuYWwgbWVtb3J5LiBJZiBpbnRlcm5hbCBtZW1vcnkgaXMKLSAqICByZXF1ZXN0ZWQsIEZES2NhbGxvY19MKCkgZmlyc3QgdHJpZXMgdG8gdXNlIEwxIG1lbW9yeSwgd2hpY2ggc2l6ZXMgYXJlIGRlZmluZWQKLSAqICBieSA6OkRBVEFfTDFfQV9TSVpFIGFuZCA6OkRBVEFfTDFfQl9TSVpFLiBJZiBubyBMMSBtZW1vcnkgaXMgYXZhaWxhYmxlLCB0aGVuCi0gKiAgRkRLY2FsbG9jX0woKSB0cmllcyB0byB1c2UgTDIgbWVtb3J5LiBJZiB0aGF0IGZhaWxzIGFzIHdlbGwsIHRoZSByZXF1ZXN0ZWQKLSAqICBtZW1vcnkgaXMgYWxsb2NhdGVkIGF0IGFuIGV4dGVybiBsb2NhdGlvbiB1c2luZyB0aGUgZmFsbGJhY2sgRkRLY2FsbG9jKCkuCisgKiAgcmVxdWVzdGVkLCBGREtjYWxsb2NfTCgpIGZpcnN0IHRyaWVzIHRvIHVzZSBMMSBtZW1vcnksIHdoaWNoIHNpemVzIGFyZQorICogZGVmaW5lZCBieSA6OkRBVEFfTDFfQV9TSVpFIGFuZCA6OkRBVEFfTDFfQl9TSVpFLiBJZiBubyBMMSBtZW1vcnkgaXMKKyAqIGF2YWlsYWJsZSwgdGhlbiBGREtjYWxsb2NfTCgpIHRyaWVzIHRvIHVzZSBMMiBtZW1vcnkuIElmIHRoYXQgZmFpbHMgYXMgd2VsbCwKKyAqIHRoZSByZXF1ZXN0ZWQgbWVtb3J5IGlzIGFsbG9jYXRlZCBhdCBhbiBleHRlcm4gbG9jYXRpb24gdXNpbmcgdGhlIGZhbGxiYWNrCisgKiBGREtjYWxsb2MoKS4KICAqCiAgKiBccGFyYW0gbiAgICAgU2VlIE1TRE4gZG9jdW1lbnRhdGlvbiBvbiBjYWxsb2MoKS4KICAqIFxwYXJhbSBzaXplICBTZWUgTVNETiBkb2N1bWVudGF0aW9uIG9uIGNhbGxvYygpLgpAQCAtMzAyLDIxICs0NDUsMjAgQEAKIC8qKgogICogIEZyZWUgbWVtb3J5IHRoYXQgd2FzIGFsbG9jYXRlZCBpbiBhIHNwZWNpZmljIG1lbW9yeSBzZWN0aW9uLgogICovCi12b2lkICBGREtmcmVlX0wodm9pZCAqcHRyKTsKK3ZvaWQgRkRLZnJlZV9MKHZvaWQgKnB0cik7CiAKIC8qKgogICogIEZyZWUgYWxpZ25lZCBtZW1vcnkgdGhhdCB3YXMgYWxsb2NhdGVkIGluIGEgc3BlY2lmaWMgbWVtb3J5IHNlY3Rpb24uCiAgKi8KLXZvaWQgIEZES2FmcmVlX0wodm9pZCAqcHRyKTsKLQordm9pZCBGREthZnJlZV9MKHZvaWQgKnB0cik7CiAKIC8qKgogICogQ29weSBtZW1vcnkuIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gbWVtb3J5IG11c3Qgbm90IG92ZXJsYXAuCiAgKiBFaXRoZXIgdXNlIGltcGxlbWVudGF0aW9uIGZyb20gYSBTdGFuZGFyZCBMaWJyYXJ5LCBvciwgaWYgbm8gU3RhbmRhcmQgTGlicmFyeQogICogaXMgYXZhaWxhYmxlLCBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uCi0gKiBUaGUgZGVmaW5lIDo6VVNFX0JVSUxUSU5fTUVNX0ZVTkNUSU9OUyBpbiBnZW5lcmljU3Rkcy5jcHAgY29udHJvbHMgd2hhdCB0byB1c2UuCi0gKiBUaGUgZnVuY3Rpb24gYXJndW1lbnRzIGNvcnJlc3BvbmQgdG8gdGhlIHN0YW5kYXJkIG1lbWNweSgpLiBQbGVhc2Ugc2VlIE1TRE4KLSAqIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb24gaG93IHRvIHVzZSBpdC4KKyAqIFRoZSBkZWZpbmUgOjpVU0VfQlVJTFRJTl9NRU1fRlVOQ1RJT05TIGluIGdlbmVyaWNTdGRzLmNwcCBjb250cm9scyB3aGF0IHRvCisgKiB1c2UuIFRoZSBmdW5jdGlvbiBhcmd1bWVudHMgY29ycmVzcG9uZCB0byB0aGUgc3RhbmRhcmQgbWVtY3B5KCkuIFBsZWFzZSBzZWUKKyAqIE1TRE4gZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvbiBob3cgdG8gdXNlIGl0LgogICovCiB2b2lkIEZES21lbWNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgY29uc3QgVUlOVCBzaXplKTsKIApAQCAtMzI0LDIwICs0NjYsMjAgQEAKICAqIENvcHkgbWVtb3J5LiBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1lbW9yeSBhcmUgYWxsb3dlZCB0byBvdmVybGFwLgogICogRWl0aGVyIHVzZSBpbXBsZW1lbnRhdGlvbiBmcm9tIGEgU3RhbmRhcmQgTGlicmFyeSwgb3IsIGlmIG5vIFN0YW5kYXJkIExpYnJhcnkKICAqIGlzIGF2YWlsYWJsZSwgYSBnZW5lcmljIGltcGxlbWVudGF0aW9uLgotICogVGhlIGRlZmluZSA6OlVTRV9CVUlMVElOX01FTV9GVU5DVElPTlMgaW4gZ2VuZXJpY1N0ZHMuY3BwIGNvbnRyb2xzIHdoYXQgdG8gdXNlLgotICogVGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBjb3JyZXNwb25kIHRvIHRoZSBzdGFuZGFyZCBtZW1tb3ZlKCkuIFBsZWFzZSBzZWUgTVNETgotICogZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvbiBob3cgdG8gdXNlIGl0LgotKi8KKyAqIFRoZSBkZWZpbmUgOjpVU0VfQlVJTFRJTl9NRU1fRlVOQ1RJT05TIGluIGdlbmVyaWNTdGRzLmNwcCBjb250cm9scyB3aGF0IHRvCisgKiB1c2UuIFRoZSBmdW5jdGlvbiBhcmd1bWVudHMgY29ycmVzcG9uZCB0byB0aGUgc3RhbmRhcmQgbWVtbW92ZSgpLiBQbGVhc2Ugc2VlCisgKiBNU0ROIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb24gaG93IHRvIHVzZSBpdC4KKyAqLwogdm9pZCBGREttZW1tb3ZlKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBjb25zdCBVSU5UIHNpemUpOwogCiAvKioKICAqIENsZWFyIG1lbW9yeS4KICAqIEVpdGhlciB1c2UgaW1wbGVtZW50YXRpb24gZnJvbSBhIFN0YW5kYXJkIExpYnJhcnksIG9yLCBpZiBubyBTdGFuZGFyZCBMaWJyYXJ5CiAgKiBpcyBhdmFpbGFibGUsIGEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbi4KLSAqIFRoZSBkZWZpbmUgOjpVU0VfQlVJTFRJTl9NRU1fRlVOQ1RJT05TIGluIGdlbmVyaWNTdGRzLmNwcCBjb250cm9scyB3aGF0IHRvIHVzZS4KLSAqIFRoZSBmdW5jdGlvbiBhcmd1bWVudHMgY29ycmVzcG9uZCB0byB0aGUgc3RhbmRhcmQgbWVtY2xlYXIoKS4gUGxlYXNlIHNlZSBNU0ROCi0gKiBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9uIGhvdyB0byB1c2UgaXQuCi0qLworICogVGhlIGRlZmluZSA6OlVTRV9CVUlMVElOX01FTV9GVU5DVElPTlMgaW4gZ2VuZXJpY1N0ZHMuY3BwIGNvbnRyb2xzIHdoYXQgdG8KKyAqIHVzZS4gVGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBjb3JyZXNwb25kIHRvIHRoZSBzdGFuZGFyZCBtZW1jbGVhcigpLiBQbGVhc2Ugc2VlCisgKiBNU0ROIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb24gaG93IHRvIHVzZSBpdC4KKyAqLwogdm9pZCBGREttZW1jbGVhcih2b2lkICptZW1QdHIsIGNvbnN0IFVJTlQgc2l6ZSk7CiAKIC8qKgpAQCAtMzQ4LDQ1ICs0OTAsMTggQEAKIHZvaWQgRkRLbWVtc2V0KHZvaWQgKm1lbVB0ciwgY29uc3QgSU5UIHZhbHVlLCBjb25zdCBVSU5UIHNpemUpOwogCiAvKiBDb21wYXJlIGZ1bmN0aW9uIHdyYXBwZXJzICovCi1JTlQgICBGREttZW1jbXAoY29uc3Qgdm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBjb25zdCBVSU5UIHNpemUpOwotSU5UICAgRkRLc3RyY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7Ci1JTlQgICBGREtzdHJuY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgY29uc3QgVUlOVCBzaXplKTsKK0lOVCBGREttZW1jbXAoY29uc3Qgdm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBjb25zdCBVSU5UIHNpemUpOworSU5UIEZES3N0cmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOworSU5UIEZES3N0cm5jbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBjb25zdCBVSU5UIHNpemUpOwogCi1VSU5UICBGREtzdHJsZW4oY29uc3QgY2hhciAqcyk7CitVSU5UIEZES3N0cmxlbihjb25zdCBjaGFyICpzKTsKIAotI2RlZmluZSBGREttYXgoYSxiKSAoIChhKSA+IChiKSA/IChhKTooYikpCi0jZGVmaW5lIEZES21pbihhLGIpICggKGEpIDwgKGIpID8gKGEpOihiKSkKKyNkZWZpbmUgRkRLbWF4KGEsIGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCisjZGVmaW5lIEZES21pbihhLCBiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQogCiAjZGVmaW5lIEZES19JTlRfTUFYICgoSU5UKTB4N0ZGRkZGRkYpCiAjZGVmaW5lIEZES19JTlRfTUlOICgoSU5UKTB4ODAwMDAwMDApCiAKLS8qIE1hdGggZnVuY3Rpb24gd3JhcHBlcnMuIE9ubHkgaW50ZW5kZWQgZm9yIGNvbXBhdGliaWxpdHksIG5vdCB0byBiZSBoaWdobHkgb3B0aW1pemVkLiAqLwotLyogVXNlZCBmb3IgZGVidWdnaW5nLCBkZXYgY29kZSAuLiAqLwotCi1JTlQgRkRLYWJzKElOVCBqKTsKLWRvdWJsZSBGREtmYWJzKGRvdWJsZSB4KTsKLWRvdWJsZSBGREtwb3coZG91YmxlIHgsIGRvdWJsZSB5KTsKLWRvdWJsZSBGREtzcXJ0KGRvdWJsZSB4KTsKLWRvdWJsZSBGREthdGFuKGRvdWJsZSB4KTsKLWRvdWJsZSBGREtsb2coZG91YmxlIHgpOwotZG91YmxlIEZES3Npbihkb3VibGUgeCk7Ci1kb3VibGUgRkRLY29zKGRvdWJsZSB4KTsKLWRvdWJsZSBGREtleHAoZG91YmxlIHgpOwotI2RlZmluZSBGREtsb2cyKGEpIChGREtsb2coYSkqMS40NDI2OTUwNDEpIC8qIGxvZygyLjApID0gMS40NDI2OTUwNDEgKi8KLSNkZWZpbmUgRkRLbG9nMTAoYSkgKEZES2xvZyhhKSowLjQzNDI5NDQ4MikgLyogMS4wL2xvZygxMC4wKSA9IDAuNDM0Mjk0NDgyICovCi1kb3VibGUgRkRLYXRhbjIoZG91YmxlIHksIGRvdWJsZSB4KTsKLWRvdWJsZSBGREthY29zKGRvdWJsZSB4KTsKLWRvdWJsZSBGREt0YW4oZG91YmxlIHgpOwotZG91YmxlIEZES2Zsb29yKGRvdWJsZSB4KTsKLWRvdWJsZSBGREtjZWlsKGRvdWJsZSB4KTsKLUlOVCAgIEZES2F0b2koY29uc3QgY2hhciAqbnB0cik7Ci1sb25nICBGREthdG9sKGNvbnN0IGNoYXIgKm5wdHIpOwotZmxvYXQgRkRLYXRvZihjb25zdCBjaGFyICpucHRyKTsKLS8qIExPTkcgTE9ORyBGREthdG9sbChjb25zdCBjaGFyICpucHRyKTsgKi8KLS8qIExPTkcgTE9ORyBGREthdG9xKGNvbnN0IGNoYXIgKm5wdHIpOyAqLwotCi0KLQogLyogRklMRSBJL08gKi8KIAogLyohCkBAIC0zOTQsMTUgKzUwOSw3IEBACiAgKgogICogXHJldHVybiAgMSBpZiBwbGF0Zm9ybSBpcyBsaXR0bGUgZW5kaWFuLCBub24tMSBpZiBwbGF0Zm9ybSBpcyBiaWcgZW5kaWFuLgogICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWlubGluZQotI2Vsc2UKLXN0YXRpYwotI2VuZGlmCi1pbnQgSVNfTElUVExFX0VORElBTih2b2lkKSB7Ci0gIGludCBfX2R1bW15ID0gMTsKLSAgcmV0dXJuICggKiggKFVDSEFSKikoJihfX2R1bW15KSApICkgKTsKLX0KK2ludCBJU19MSVRUTEVfRU5ESUFOKHZvaWQpOwogCiAvKiEKICAqICBDb252ZXJ0IGlucHV0IHZhbHVlIHRvIGxpdHRsZSBlbmRpYW4gZm9ybWF0LgpAQCAtNDEwLDExICs1MTcsNyBAQAogICogXHBhcmFtIHZhbCAgVmFsdWUgdG8gYmUgY29udmVydGVkLiBJdCBtYXkgYmUgaW4gYm90aCBiaWcgb3IgbGl0dGxlIGVuZGlhbi4KICAqIFxyZXR1cm4gICAgIFZhbHVlIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LgogICovCi0jZGVmaW5lIFRPX0xJVFRMRV9FTkRJQU4odmFsKSBcCi0gICggKElTX0xJVFRMRV9FTkRJQU4oKSkgPyBcCi0gICAgICh2YWwpIFwKLSAgIDogKCAoKCh2YWwpICYgMHhmZikgPDwgMjQpIHx8ICgoKHZhbCkgJiAweGZmMDApPDwgOCkgfHwgKCgodmFsKSAmIDB4ZmYwMDAwKT4+OCkgfHwgKCgodmFsKSAmIDB4ZmYwMDAwMDApID4+IDI0KSApICkKLQorVUlOVCBUT19MSVRUTEVfRU5ESUFOKFVJTlQgdmFsKTsKIAogLyohCiAgKiBcZm4gICAgIEZES0ZJTEUgKkZES2ZvcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICptb2RlKTsKQEAgLTQyNyw3ICs1MzAsNyBAQAogICogICAgICAgICBTdGFuZGFyZCBmdGVsbCgpIHdyYXBwZXIuCiAgKiBcZm4gICAgIElOVCBGREtmZmx1c2goRkRLRklMRSAqZnApOwogICogICAgICAgICBTdGFuZGFyZCBmZmx1c2goKSB3cmFwcGVyLgotICogXGZuICAgICBVSU5UIEZES2Z3cml0ZSh2b2lkICpwdHJmLCBJTlQgc2l6ZSwgVUlOVCBubWVtYiwgRkRLRklMRSAqZnApOworICogXGZuICAgICBVSU5UIEZES2Z3cml0ZShjb25zdCB2b2lkICpwdHJmLCBJTlQgc2l6ZSwgVUlOVCBubWVtYiwgRkRLRklMRSAqZnApOwogICogICAgICAgICBTdGFuZGFyZCBmd3JpdGUoKSB3cmFwcGVyLgogICogXGZuICAgICBVSU5UIEZES2ZyZWFkKHZvaWQgKmRzdCwgSU5UIHNpemUsIFVJTlQgbm1lbWIsIEZES0ZJTEUgKmZwKTsKICAqICAgICAgICAgU3RhbmRhcmQgZnJlYWQoKSB3cmFwcGVyLgpAQCAtNDQwLDI1ICs1NDMsMjcgQEAKIElOVCBGREtmc2VlayhGREtGSUxFICpGUCwgTE9ORyBPRkZTRVQsIGludCBXSEVOQ0UpOwogSU5UIEZES2Z0ZWxsKEZES0ZJTEUgKkZQKTsKIElOVCBGREtmZmx1c2goRkRLRklMRSAqZnApOwotVUlOVCBGREtmd3JpdGUodm9pZCAqcHRyZiwgSU5UIHNpemUsIFVJTlQgbm1lbWIsIEZES0ZJTEUgKmZwKTsKK1VJTlQgRkRLZndyaXRlKGNvbnN0IHZvaWQgKnB0cmYsIElOVCBzaXplLCBVSU5UIG5tZW1iLCBGREtGSUxFICpmcCk7CiBVSU5UIEZES2ZyZWFkKHZvaWQgKmRzdCwgSU5UIHNpemUsIFVJTlQgbm1lbWIsIEZES0ZJTEUgKmZwKTsKLWNoYXIqIEZES2ZnZXRzKHZvaWQgKmRzdCwgSU5UIHNpemUsIEZES0ZJTEUgKmZwKTsKK2NoYXIgKkZES2ZnZXRzKHZvaWQgKmRzdCwgSU5UIHNpemUsIEZES0ZJTEUgKmZwKTsKIHZvaWQgRkRLcmV3aW5kKEZES0ZJTEUgKmZwKTsKIElOVCBGREtmZW9mKEZES0ZJTEUgKmZwKTsKIAogLyoqCi0gKiBcYnJpZWYgICAgICAgIFdyaXRlIGVhY2ggbWVtYmVyIGluIGxpdHRsZSBlbmRpYW4gb3JkZXIuIENvbnZlcnQgYXV0b21hdGljYWxseSB0byBob3N0IGVuZGlhbmVzcy4KKyAqIFxicmllZiAgICAgICAgV3JpdGUgZWFjaCBtZW1iZXIgaW4gbGl0dGxlIGVuZGlhbiBvcmRlci4gQ29udmVydCBhdXRvbWF0aWNhbGx5CisgKiB0byBob3N0IGVuZGlhbmVzcy4KICAqIFxwYXJhbSBwdHJmICAgUG9pbnRlciB0byBtZW1vcnkgd2hlcmUgdG8gcmVhZCBkYXRhIGZyb20uCiAgKiBccGFyYW0gc2l6ZSAgIFNpemUgb2YgZWFjaCBpdGVtIHRvIGJlIHdyaXR0ZW4uCiAgKiBccGFyYW0gbm1lbWIgIE51bWJlciBvZiBpdGVtcyB0byBiZSB3cml0dGVuLgogICogXHBhcmFtIGZwICAgICBGaWxlIHBvaW50ZXIgb2YgdHlwZSBGREtGSUxFLgogICogXHJldHVybiAgICAgICBOdW1iZXIgb2YgaXRlbXMgcmVhZCBvbiBzdWNjZXNzIGFuZCBmcmVhZCgpIGVycm9yIG9uIGZhaWx1cmUuCiAgKi8KLVVJTlQgRkRLZndyaXRlX0VMKHZvaWQgKnB0cmYsIElOVCBzaXplLCBVSU5UIG5tZW1iLCBGREtGSUxFICpmcCk7CitVSU5UIEZES2Z3cml0ZV9FTChjb25zdCB2b2lkICpwdHJmLCBJTlQgc2l6ZSwgVUlOVCBubWVtYiwgRkRLRklMRSAqZnApOwogCiAvKioKLSAqIFxicmllZiAgICAgICAgUmVhZCB2YXJpYWJsZSBvZiBzaXplICJzaXplIiBhcyBsaXR0bGUgZW5kaWFuLiBDb252ZXJ0IGF1dG9tYXRpY2FsbHkgdG8gaG9zdCBlbmRpYW5lc3MuCi0gKiAgICAgICAgICAgICAgICA0LWJ5dGUgYWxpZ25tZW50IGlzIGVuZm9yY2VkIGZvciAyNCBiaXQgZGF0YSwgYXQgMzIgYml0IGZ1bGwgc2NhbGUuCisgKiBcYnJpZWYgICAgICAgIFJlYWQgdmFyaWFibGUgb2Ygc2l6ZSAic2l6ZSIgYXMgbGl0dGxlIGVuZGlhbi4gQ29udmVydAorICogYXV0b21hdGljYWxseSB0byBob3N0IGVuZGlhbmVzcy4gNC1ieXRlIGFsaWdubWVudCBpcyBlbmZvcmNlZCBmb3IgMjQgYml0CisgKiBkYXRhLCBhdCAzMiBiaXQgZnVsbCBzY2FsZS4KICAqIFxwYXJhbSBkc3QgICAgUG9pbnRlciB0byBtZW1vcnkgd2hlcmUgdG8gc3RvcmUgZGF0YSBpbnRvLgogICogXHBhcmFtIHNpemUgICBTaXplIG9mIGVhY2ggaXRlbSB0byBiZSByZWFkLgogICogXHBhcmFtIG5tZW1iICBOdW1iZXIgb2YgaXRlbXMgdG8gYmUgcmVhZC4KQEAgLTQ2Nyw3ICs1NzIsNiBAQAogICovCiBVSU5UIEZES2ZyZWFkX0VMKHZvaWQgKmRzdCwgSU5UIHNpemUsIFVJTlQgbm1lbWIsIEZES0ZJTEUgKmZwKTsKIAotCiAvKioKICAqIFxicmllZiAgUHJpbnQgRkRLIHNvZnR3YXJlIGRpc2NsYWltZXIuCiAgKi8KQEAgLTQ3Nyw0ICs1ODEsNCBAQAogfQogI2VuZGlmCiAKLSNlbmRpZiAvKiBfX0dFTkVSSUNTVERTX0hfXyAqLworI2VuZGlmIC8qIEdFTkVSSUNTVERTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNZUy9pbmNsdWRlL21hY2hpbmVfdHlwZS5oIGIvbGliU1lTL2luY2x1ZGUvbWFjaGluZV90eXBlLmgKaW5kZXggYjMyODk1My4uYmU4ZGUzNyAxMDA2NDQKLS0tIGEvbGliU1lTL2luY2x1ZGUvbWFjaGluZV90eXBlLmgKKysrIGIvbGliU1lTL2luY2x1ZGUvbWFjaGluZV90eXBlLmgKQEAgLTEsNzQgKzEsODUgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCivCqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE4IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBGw7ZyZGVydW5nIGRlciBhbmdld2FuZHRlbgorRm9yc2NodW5nIGUuVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgogCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KK0FBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50CitnZW5lcmFsIHBlcmNlcHR1YWwgYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZworZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkgaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5CitkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0IG9mIHRoZSBNUEVHCitzcGVjaWZpY2F0aW9ucy4KIAotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgorUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZwordGhvc2Ugb2YgRnJhdW5ob2ZlcikgbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZworKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMgaW5kaXZpZHVhbGx5IGZvcgordGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50Cit3aXRoIHRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZgorQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZSB0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvcgorZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG1heQorYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlCitsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgogCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KIAogMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YKK3RoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCiAKLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKIG1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KIAotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KK1lvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUKK3RoZSBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgogCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKIAogMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKIAotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgorTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KIAotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KIAogNC4gICAgRElTQ0xBSU1FUgogCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0Citob2xkZXJzIGFuZCBjb250cmlidXRvcnMgIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LAorb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUKK2dvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLAoraG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YKK3RoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCiAKIDUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KIApAQCAtNzksMTI5ICs5MCwxNDYgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFN5c3RlbSBpbnRlZ3JhdGlvbiBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgRGVzY3JpcHRpb246CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiBcZmlsZSAgIG1hY2hpbmVfdHlwZS5oCiAgKiAgXGJyaWVmICBUeXBlIGRlZmluZXMgZm9yIHZhcmlvdXMgcHJvY2Vzc29ycyBhbmQgY29tcGlsZXIgdG9vbHMuCiAgKi8KIAotI2lmICFkZWZpbmVkKF9fTUFDSElORV9UWVBFX0hfXykKLSNkZWZpbmUgX19NQUNISU5FX1RZUEVfSF9fCisjaWYgIWRlZmluZWQoTUFDSElORV9UWVBFX0gpCisjZGVmaW5lIE1BQ0hJTkVfVFlQRV9ICiAKKyNpbmNsdWRlIDxzdGRkZWYuaD4gLyogTmVlZGVkIHRvIGRlZmluZSBzaXplX3QgKi8KIAotLyogTGlicmFyeSBjYWxsaW5nIGNvbnZlbnRpb24gc3BlYy4gX19jZGVjbCBhbmQgZnJpZW5kcyBtaWdodCBiZSBhZGRlZCBoZXJlIGFzIHJlcXVpcmVkLiAqLwotICAjZGVmaW5lIExJTktTUEVDX0gKLSAgI2RlZmluZSBMSU5LU1BFQ19DUFAKLQotCi0vKioKLSAqICBjb2xsYXRlIGFsbCBjb3JyZXNwb25kaW5nIGNvbXBpbGVyIHNwZWNpZmljIG1hY3JvcyB0byBkZXRlY3QgYSBkZWJ1ZyBidWlsZCwgYW5kIHNldCB0aGUgREVCVUcgbWFjcm8gaWYgdGhhdCBpcyB0aGUgY2FzZS4KLSAqLwotI2lmIGRlZmluZWQoX0RFQlVHKQotI2RlZmluZSBERUJVRworI2lmIGRlZmluZWQoX19BTkRST0lEX18pICYmIChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPT0gNCkgJiYgXAorICAgIChfX0dOVUNfR05VX0lOTElORV9fID09IDEpCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNlbmRpZgogCisvKiBMaWJyYXJ5IGNhbGxpbmcgY29udmVudGlvbiBzcGVjLiBfX2NkZWNsIGFuZCBmcmllbmRzIG1pZ2h0IGJlIGFkZGVkIGhlcmUgYXMKKyAqIHJlcXVpcmVkLiAqLworI2RlZmluZSBMSU5LU1BFQ19ICisjZGVmaW5lIExJTktTUEVDX0NQUAogCiAvKiBmb3IgZG94eWdlbiB0aGUgZm9sbG93aW5nIGRvY3UgcGFydHMgbXVzdCBiZSBzZXBhcmF0ZWQgKi8KIC8qKiBcdmFyICBTQ0hBUgotICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgYXQgbGVhc3QgMSBieXRlIHNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zLgorICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgYXQgbGVhc3QgMSBieXRlIHNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQKKyAqIHBsYXRmb3Jtcy4KICAqLwogLyoqIFx2YXIgIFVDSEFSCi0gKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyBhdCBsZWFzdCAxIGJ5dGUgdW5zaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkIHBsYXRmb3Jtcy4KKyAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIGF0IGxlYXN0IDEgYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIG9uIGFsbAorICogc3VwcG9ydGVkIHBsYXRmb3Jtcy4KICAqLwogLyoqIFx2YXIgIElOVAotICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgYXQgbGVhc3QgNCBieXRlIHNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zLgorICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgYXQgbGVhc3QgNCBieXRlIHNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQKKyAqIHBsYXRmb3Jtcy4KICAqLwogLyoqIFx2YXIgIFVJTlQKLSAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIGF0IGxlYXN0IDQgYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zLgorICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgYXQgbGVhc3QgNCBieXRlIHVuc2lnbmVkIGludGVnZXIgb24gYWxsCisgKiBzdXBwb3J0ZWQgcGxhdGZvcm1zLgogICovCiAvKiogXHZhciAgTE9ORwotICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgNCBieXRlIHNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zLgorICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgNCBieXRlIHNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQKKyAqIHBsYXRmb3Jtcy4KICAqLwogLyoqIFx2YXIgIFVMT05HCi0gKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyA0IGJ5dGUgdW5zaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkIHBsYXRmb3Jtcy4KKyAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIDQgYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQKKyAqIHBsYXRmb3Jtcy4KICAqLwogLyoqIFx2YXIgIFNIT1JUCi0gKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyAyIGJ5dGUgc2lnbmVkIGludGVnZXIgb24gYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCisgKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyAyIGJ5dGUgc2lnbmVkIGludGVnZXIgb24gYWxsIHN1cHBvcnRlZAorICogcGxhdGZvcm1zLgogICovCiAvKiogXHZhciAgVVNIT1JUCi0gKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyAyIGJ5dGUgdW5zaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkIHBsYXRmb3Jtcy4KKyAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIDIgYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQKKyAqIHBsYXRmb3Jtcy4KICAqLwogLyoqIFx2YXIgIElOVDY0Ci0gKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyA4IGJ5dGUgc2lnbmVkIGludGVnZXIgb24gYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCisgKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyA4IGJ5dGUgc2lnbmVkIGludGVnZXIgb24gYWxsIHN1cHBvcnRlZAorICogcGxhdGZvcm1zLgogICovCiAvKiogXHZhciAgVUlOVDY0Ci0gKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyA4IGJ5dGUgdW5zaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkIHBsYXRmb3Jtcy4KKyAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIDggYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQKKyAqIHBsYXRmb3Jtcy4KICAqLwogLyoqIFxkZWYgIFNIT1JUX0JJVFMKLSAqICAgICAgICBOdW1iZXIgb2YgYml0cyB0aGUgZGF0YSB0eXBlIHNob3J0IHJlcHJlc2VudHMuIHNpemVvZigpIGlzIG5vdCBzdWl0ZWQgdG8gZ2V0IHRoaXMgaW5mbywKLSAqICAgICAgICBiZWNhdXNlIGEgYnl0ZSBpcyBub3QgYWx3YXlzIGRlZmluZWQgYXMgOCBiaXRzLgorICogICAgICAgIE51bWJlciBvZiBiaXRzIHRoZSBkYXRhIHR5cGUgc2hvcnQgcmVwcmVzZW50cy4gc2l6ZW9mKCkgaXMgbm90IHN1aXRlZAorICogdG8gZ2V0IHRoaXMgaW5mbywgYmVjYXVzZSBhIGJ5dGUgaXMgbm90IGFsd2F5cyBkZWZpbmVkIGFzIDggYml0cy4KICAqLwogLyoqIFxkZWYgIENIQVJfQklUUwotICogICAgICAgIE51bWJlciBvZiBiaXRzIHRoZSBkYXRhIHR5cGUgY2hhciByZXByZXNlbnRzLiBzaXplb2YoKSBpcyBub3Qgc3VpdGVkIHRvIGdldCB0aGlzIGluZm8sCi0gKiAgICAgICAgYmVjYXVzZSBhIGJ5dGUgaXMgbm90IGFsd2F5cyBkZWZpbmVkIGFzIDggYml0cy4KKyAqICAgICAgICBOdW1iZXIgb2YgYml0cyB0aGUgZGF0YSB0eXBlIGNoYXIgcmVwcmVzZW50cy4gc2l6ZW9mKCkgaXMgbm90IHN1aXRlZAorICogdG8gZ2V0IHRoaXMgaW5mbywgYmVjYXVzZSBhIGJ5dGUgaXMgbm90IGFsd2F5cyBkZWZpbmVkIGFzIDggYml0cy4KICAqLwogLyoqIFx2YXIgIElOVF9QQ00KICAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIHRoZSB3aWR0aCBvZiBpbnB1dCBhbmQgb3V0cHV0IFBDTSBzYW1wbGVzLgogICovCiAKLQotICB0eXBlZGVmIHNpZ25lZCBpbnQgSU5UOwotICB0eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UOwordHlwZWRlZiBzaWduZWQgaW50IElOVDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQ7CiAjaWZkZWYgX19MUDY0X18KLSAgLyogZm9yY2UgRkRLIGxvbmctZGF0YXR5cGVzIHRvIDQgYnl0ZSAgKi8KLSAgLyogamRyOiBVc2UgZGVmaW5lcyB0byBhdm9pZCB0eXBlIGFsaWFzIHByb2JsZW1zIG9uIDY0IGJpdCBtYWNoaW5lcy4gKi8KLSAgI2RlZmluZSBMT05HIElOVAotICAjZGVmaW5lIFVMT05HIFVJTlQKLSNlbHNlIC8qIF9fTFA2NF9fICovCi0gIHR5cGVkZWYgc2lnbmVkIGxvbmcgTE9ORzsKLSAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIFVMT05HOwotI2VuZGlmCS8qIF9fTFA2NF9fICovCi0gIHR5cGVkZWYgc2lnbmVkIHNob3J0IFNIT1JUOwotICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVTSE9SVDsKLSAgdHlwZWRlZiBzaWduZWQgY2hhciBTQ0hBUjsKLSAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVDSEFSOworLyogZm9yY2UgRkRLIGxvbmctZGF0YXR5cGVzIHRvIDQgYnl0ZSAgKi8KKy8qIFVzZSBkZWZpbmVzIHRvIGF2b2lkIHR5cGUgYWxpYXMgcHJvYmxlbXMgb24gNjQgYml0IG1hY2hpbmVzLiAqLworI2RlZmluZSBMT05HIElOVAorI2RlZmluZSBVTE9ORyBVSU5UCisjZWxzZSAgLyogX19MUDY0X18gKi8KK3R5cGVkZWYgc2lnbmVkIGxvbmcgTE9ORzsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBVTE9ORzsKKyNlbmRpZiAvKiBfX0xQNjRfXyAqLwordHlwZWRlZiBzaWduZWQgc2hvcnQgU0hPUlQ7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVTSE9SVDsKK3R5cGVkZWYgc2lnbmVkIGNoYXIgU0NIQVI7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUNIQVI7CiAKLSAgI2RlZmluZSBTSE9SVF9CSVRTIDE2Ci0gICNkZWZpbmUgQ0hBUl9CSVRTIDgKLQorI2RlZmluZSBTSE9SVF9CSVRTIDE2CisjZGVmaW5lIENIQVJfQklUUyA4CiAKIC8qIERlZmluZSA2NCBiaXQgYmFzZSBpbnRlZ2VyIHR5cGUuICovCiAjaWZkZWYgX01TQ19WRVIKLSAgdHlwZWRlZiBfX2ludDY0IElOVDY0OwotICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgVUlOVDY0OwordHlwZWRlZiBfX2ludDY0IElOVDY0OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IFVJTlQ2NDsKICNlbHNlCi0gIHR5cGVkZWYgbG9uZyBsb25nIElOVDY0OwotICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBVSU5UNjQ7Cit0eXBlZGVmIGxvbmcgbG9uZyBJTlQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIFVJTlQ2NDsKICNlbmRpZgogCiAjaWZuZGVmIE5VTEwKLSAgI2lmZGVmIF9fY3BsdXNwbHVzCi0gICAgI2RlZmluZSBOVUxMICAgIDAKLSAgI2Vsc2UKLSAgICAjZGVmaW5lIE5VTEwgICAgKCh2b2lkICopMCkKLSAgI2VuZGlmCi0jZW5kaWYKLQotLyogQXNzZXJ0IGlzIGZ1bmN0aW9uYWwgb24geDg2IFBDJ3MgYW5kIGFsc28gd2hlbiBkZWJ1Z2dpbmcgaXMgdHVybmVkIG9uLiAqLwotI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoX19pNjg2X18pIHx8IGRlZmluZWQoX19pNTg2X18pIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKEZES19ERUJVRykgfHwgZGVmaW5lZChGREtfQVNTRVJUX0VOQUJMRSkKLSAgI2luY2x1ZGUgPGFzc2VydC5oPgotICAjZGVmaW5lIEZES19BU1NFUlQoeCkgYXNzZXJ0KHgpCisjaWZkZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgTlVMTCAwCiAjZWxzZQotICAjZGVmaW5lIEZES19BU1NFUlQoaWdub3JlKQorI2RlZmluZSBOVUxMICgodm9pZCAqKTApCisjZW5kaWYKICNlbmRpZgogCi0gIHR5cGVkZWYgU0hPUlQgICAgICAgIElOVF9QQ007Ci0gICNkZWZpbmUgV0FWX0JJVFMgICAgIDE2Ci0gICNkZWZpbmUgU0FNUExFX0JJVFMgIDE2Ci0gICNkZWZpbmUgU0FNUExFX01BWCAoKChMT05HKTE8PChTQU1QTEVfQklUUy0xKSktMSkKLSAgI2RlZmluZSBTQU1QTEVfTUlOICh+U0FNUExFX01BWCkKKyNpZiAoKGRlZmluZWQoX19pNjg2X18pIHx8IGRlZmluZWQoX19pNTg2X18pIHx8IGRlZmluZWQoX19pMzg2X18pIHx8ICBcCisgICAgICBkZWZpbmVkKF9feDg2XzY0X18pKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoZGVmaW5lZChfTVNDX1ZFUikgJiYgKGRlZmluZWQoX01fSVg4NikgfHwgZGVmaW5lZChfTV9YNjQpKSkpICYmIFwKKyAgICAhZGVmaW5lZChGREtfQVNTRVJUX0VOQUJMRSkKKyNkZWZpbmUgRkRLX0FTU0VSVF9FTkFCTEUKKyNlbmRpZgorCisjaWYgZGVmaW5lZChGREtfQVNTRVJUX0VOQUJMRSkKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNkZWZpbmUgRkRLX0FTU0VSVCh4KSBhc3NlcnQoeCkKKyNlbHNlCisjZGVmaW5lIEZES19BU1NFUlQoaWdub3JlKQorI2VuZGlmCisKK3R5cGVkZWYgU0hPUlQgSU5UX1BDTTsKKyNkZWZpbmUgTUFYVkFMX1BDTSBNQVhWQUxfU0dMCisjZGVmaW5lIE1JTlZBTF9QQ00gTUlOVkFMX1NHTAorI2RlZmluZSBXQVZfQklUUyAxNgorI2RlZmluZSBTQU1QTEVfQklUUyAxNgorI2RlZmluZSBTQU1QTEVfTUFYICgoSU5UX1BDTSkoKChVTE9ORykxIDw8IChTQU1QTEVfQklUUyAtIDEpKSAtIDEpKQorI2RlZmluZSBTQU1QTEVfTUlOICh+U0FNUExFX01BWCkKIAogLyohCiAqIFxkZWYgICAgUkFNX0FMSUdOCkBAIC0yMTEsNDYgKzIzOSw1NiBAQAogICAgaW50IG15QXJyYXlbMTZdOwogICAgXGVuZGNvZGUKIAotICAgTm90ZSwgdGhhdCBub3QgYWxsIHBsYXRmb3JtcyBzdXBwb3J0IHRoaXMgbWVjaGFuaXNtLiBGb3IgZXhhbXBsZSB3aXRoIFRJIGNvbXBpbGVycwotICAgYSBwcmVwcm9jZXNzb3IgcHJhZ21hIGlzIHVzZWQsIGJ1dCB0byBkbyBzb21ldGhpbmcgbGlrZQorICAgTm90ZSwgdGhhdCBub3QgYWxsIHBsYXRmb3JtcyBzdXBwb3J0IHRoaXMgbWVjaGFuaXNtLiBGb3IgZXhhbXBsZSB3aXRoIFRJCitjb21waWxlcnMgYSBwcmVwcm9jZXNzb3IgcHJhZ21hIGlzIHVzZWQsIGJ1dCB0byBkbyBzb21ldGhpbmcgbGlrZQogCiAgICBcY29kZQogICAgI2RlZmluZSBSQU1fQUxJR04gI3ByYWdtYSBEQVRBX0FMSUdOKHgpCi0gICBcZW5jb2RlCisgICBcZW5kY29kZQogCi0gICB3b3VsZCByZXF1aXJlIHRoZSBwcmVwcm9jZXNzb3IgdG8gcHJvY2VzcyB0aGlzIGxpbmUgdHdpY2UgdG8gZnVsbHkgcmVzb2x2ZSBpdC4gSGVuY2UsCi0gICBhIGZ1bGx5IHBsYXRmb3JtLWluZGVwZW5kYW50IHdheSB0byB1c2UgYWxpZ25tZW50IGlzIG5vdCBzdXBwb3J0ZWQuCisgICB3b3VsZCByZXF1aXJlIHRoZSBwcmVwcm9jZXNzb3IgdG8gcHJvY2VzcyB0aGlzIGxpbmUgdHdpY2UgdG8gZnVsbHkgcmVzb2x2ZQoraXQuIEhlbmNlLCBhIGZ1bGx5IHBsYXRmb3JtLWluZGVwZW5kYW50IHdheSB0byB1c2UgYWxpZ25tZW50IGlzIG5vdCBzdXBwb3J0ZWQuCiAKICogXGRlZiAgICBBTElHTk1FTlRfREVGQVVMVAogKiAgICAgICAgIERlZmF1bHQgYWxpZ25tZW50IGluIGJ5dGVzLgogKi8KLSNpZiBkZWZpbmVkKF9fR05VQ19fKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCi0gICNkZWZpbmUgQUxJR05NRU5UX0RFRkFVTFQgOAotICAjZGVmaW5lIFJBTV9BTElHTiBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKEFMSUdOTUVOVF9ERUZBVUxUKSkpCisKKyNkZWZpbmUgQUxJR05NRU5UX0RFRkFVTFQgOAorCisvKiBSQU1fQUxJR04ga2V5d29yZCBjYXVzZXMgbWVtb3J5IGFsaWdubWVudCBvZiBnbG9iYWwgdmFyaWFibGVzLiAqLworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIFJBTV9BTElHTiBfX2RlY2xzcGVjKGFsaWduKEFMSUdOTUVOVF9ERUZBVUxUKSkKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pCisjZGVmaW5lIFJBTV9BTElHTiBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKEFMSUdOTUVOVF9ERUZBVUxUKSkpCiAjZWxzZQotICAjZGVmaW5lIEFMSUdOTUVOVF9ERUZBVUxUIDgKLSAgI2RlZmluZSBSQU1fQUxJR04KKyNkZWZpbmUgUkFNX0FMSUdOCiAjZW5kaWYKIAotCiAvKiEKLSogXGRlZiAgUkVTVFJJQ1QKLSogICAgICAgVGhlIHJlc3RyaWN0IGtleXdvcmQgaXMgc3VwcG9ydGVkIGJ5IHNvbWUgcGxhdGZvcm1zIGFuZCBSRVNUUklDVCBtYXBzIHRvCi0qICAgICAgIGVpdGhlciB0aGUgY29ycmVzcG9uZGluZyBrZXl3b3JkIG9uIGVhY2ggcGxhdGZvcm0gb3IgdG8gdm9pZCBpZiB0aGUKLSogICAgICAgY29tcGlsZXIgZG9lcyBub3QgcHJvdmlkZSBzdWNoIGZlYXR1cmUuCi0qCi0qIFxkZWYgIFdPUkRfQUxJR05FRCh4KQotKiAgICAgICBUZWxscyB0aGUgY29tcGlsZXIgdGhhdCBwb2ludGVyIHggaXMgV09SRCBhbGlnbmVkLgotKiAgICAgICBBdCB0aGUgbW9tZW50IG9ubHkgc3VwcG9ydGVkIGJ5IFRJIGNvbXBpbGVycy4KLSoKLSogXGRlZiAgRFdPUkRfQUxJR05FRCh4KQotKiAgICAgICBUZWxscyB0aGUgY29tcGlsZXIgdGhhdCBwb2ludGVyIHggaXMgRFdPUkQgYWxpZ25lZC4KLSogICAgICAgQXQgdGhlIG1vbWVudCBvbmx5IHN1cHBvcnRlZCBieSBUSSBjb21waWxlcnMuCi0qLwotICAjZGVmaW5lIFJFU1RSSUNUCi0gICNkZWZpbmUgV09SRF9BTElHTkVEKHgpCi0gICNkZWZpbmUgRFdPUkRfQUxJR05FRCh4KQotCisgKiBcZGVmICBSRVNUUklDVAorICogICAgICAgVGhlIHJlc3RyaWN0IGtleXdvcmQgaXMgc3VwcG9ydGVkIGJ5IHNvbWUgcGxhdGZvcm1zIGFuZCBSRVNUUklDVCBtYXBzCisgKiB0byBlaXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcga2V5d29yZCBvbiBlYWNoIHBsYXRmb3JtIG9yIHRvIHZvaWQgaWYgdGhlCisgKiAgICAgICBjb21waWxlciBkb2VzIG5vdCBwcm92aWRlIHN1Y2ggZmVhdHVyZS4gSXQgdGVsbHMgdGhlIGNvbXBpbGVyIHRoYXQgYQorICogcG9pbnRlciBwb2ludHMgdG8gbWVtb3J5IHRoYXQgZG9lcyBub3Qgb3ZlcmxhcCB3aXRoIG90aGVyIG1lbW9yaWVzIHBvaW50ZWQgdG8KKyAqIGJ5IG90aGVyIHBvaW50ZXJzLiBJZiB0aGlzIGtleXdvcmQgaXMgdXNlZCBhbmQgdGhlIGFzc3VtcHRpb24gb2Ygbm8KKyAqIG92ZXJsYXAgaXMgbm90IHRydWUgdGhlIHJlc3VsdGluZyBjb2RlIG1pZ2h0IGNyYXNoLgorICoKKyAqIFxkZWYgIFdPUkRfQUxJR05FRCh4KQorICogICAgICAgVGVsbHMgdGhlIGNvbXBpbGVyIHRoYXQgcG9pbnRlciB4IGlzIDE2IGJpdCBhbGlnbmVkLiBJdCBkb2VzIG5vdCBjYXVzZQorICogdGhlIGFkZHJlc3MgaXRzZWxmIHRvIGJlIGFsaWduZWQsIGJ1dCBzZXJ2ZXMgYXMgYSBoaW50IHRvIHRoZSBvcHRpbWl6ZXIuIFRoZQorICogYWxpZ25tZW50IG9mIHRoZSBwb2ludGVyIG11c3QgYmUgZ3VhcnJhbnRlZWQsIGlmIG5vdCB0aGUgY29kZSBtaWdodAorICogY3Jhc2guCisgKgorICogXGRlZiAgRFdPUkRfQUxJR05FRCh4KQorICogICAgICAgVGVsbHMgdGhlIGNvbXBpbGVyIHRoYXQgcG9pbnRlciB4IGlzIDMyIGJpdCBhbGlnbmVkLiBJdCBkb2VzIG5vdCBjYXVzZQorICogdGhlIGFkZHJlc3MgaXRzZWxmIHRvIGJlIGFsaWduZWQsIGJ1dCBzZXJ2ZXMgYXMgYSBoaW50IHRvIHRoZSBvcHRpbWl6ZXIuIFRoZQorICogYWxpZ25tZW50IG9mIHRoZSBwb2ludGVyIG11c3QgYmUgZ3VhcnJhbnRlZWQsIGlmIG5vdCB0aGUgY29kZSBtaWdodAorICogY3Jhc2guCisgKgorICovCisjZGVmaW5lIFJFU1RSSUNUCisjZGVmaW5lIFdPUkRfQUxJR05FRCh4KSBDX0FMTE9DX0FMSUdORURfQ0hFQ0syKChjb25zdCB2b2lkICopKHgpLCAyKTsKKyNkZWZpbmUgRFdPUkRfQUxJR05FRCh4KSBDX0FMTE9DX0FMSUdORURfQ0hFQ0syKChjb25zdCB2b2lkICopKHgpLCA0KTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogQUxJR05fU0laRQpAQCAtMjYzLDQ2ICszMDEsNDMgQEAKICAqIC0gQUxJR05fU0laRSg4KSByZXR1cm5zIDgKICAqIC0gQUxJR05fU0laRSg5KSByZXR1cm5zIDE2CiAgKi8KLSNkZWZpbmUgQUxJR05fU0laRShhKSAoKGEpKyAoKChJTlQpQUxJR05NRU5UX0RFRkFVTFQgLSAoKElOVCkoYSkgJiAoQUxJR05NRU5UX0RFRkFVTFQtMSkpICkgJiAoQUxJR05NRU5UX0RFRkFVTFQtMSkpKQorI2RlZmluZSBBTElHTl9TSVpFKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChhKSArICgoKElOVClBTElHTk1FTlRfREVGQVVMVCAtICgoc2l6ZV90KShhKSAmIChBTElHTk1FTlRfREVGQVVMVCAtIDEpKSkgJiBcCisgICAgICAgICAgKEFMSUdOTUVOVF9ERUZBVUxUIC0gMSkpKQogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBBTElHTl9QVFIKLSAqIGNhc3QgKGEpIHRvIHdpZHRoIG9mIHBvaW50ZXIKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyohCiAgKiBcYnJpZWYgIFRoaXMgbWFjcm8gYWxpZ25zIGEgZ2l2ZW4gYWRkcmVzcyBkZXBlbmRpbmcgb24gOjpBTElHTk1FTlRfREVGQVVMVC4KICAqLwotI2RlZmluZSBBTElHTl9QVFIoYSkgKCAodW5zaWduZWQgY2hhciopKGEpICsgKCgoSU5UKUFMSUdOTUVOVF9ERUZBVUxUIC0gKChJTlQpKFVJTlQ2NCkoYSkgJiAoQUxJR05NRU5UX0RFRkFVTFQtMSkpICkgJiAoQUxJR05NRU5UX0RFRkFVTFQtMSkpICkKKyNkZWZpbmUgQUxJR05fUFRSKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodm9pZCAqKSgodW5zaWduZWQgY2hhciAqKShhKSArICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCgoKElOVClBTElHTk1FTlRfREVGQVVMVCAtICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICgoc2l6ZV90KShhKSAmIChBTElHTk1FTlRfREVGQVVMVCAtIDEpKSkgJiBcCisgICAgICAgICAgICAgIChBTElHTk1FTlRfREVGQVVMVCAtIDEpKSkpKQogCi0gLyogQWxpZ25tZW50IG1hY3JvIGZvciBsaWJTWVMgaGVhcCBpbXBsZW1lbnRhdGlvbiAqLwotI2RlZmluZSBBTElHTk1FTlRfRVhUUkVTICAgICggQUxJR05NRU5UX0RFRkFVTFQgKQotI2RlZmluZSBBTEdOX1NJWkVfRVhUUkVTKGEpICgoYSkrICgoKElOVClBTElHTk1FTlRfRVhUUkVTIC0gKChJTlQpKGEpICYgKEFMSUdOTUVOVF9FWFRSRVMtMSkpICkgJiAoQUxJR05NRU5UX0VYVFJFUy0xKSkpCi0KKy8qIEFsaWdubWVudCBtYWNybyBmb3IgbGliU1lTIGhlYXAgaW1wbGVtZW50YXRpb24gKi8KKyNkZWZpbmUgQUxJR05NRU5UX0VYVFJFUyAoQUxJR05NRU5UX0RFRkFVTFQpCisjZGVmaW5lIEFMR05fU0laRV9FWFRSRVMoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChhKSArICgoKElOVClBTElHTk1FTlRfRVhUUkVTIC0gKChJTlQpKGEpICYgKEFMSUdOTUVOVF9FWFRSRVMgLSAxKSkpICYgXAorICAgICAgICAgIChBTElHTk1FTlRfRVhUUkVTIC0gMSkpKQogCiAvKiEKLSAqIFxkZWYgIEZPUkNFSU5MSU5FCi0gKiAgICAgICBTb21ldGltZXMgY29tcGlsZXIgZG8gbm90IGRvIHdoYXQgdGhleSBhcmUgdG9sZCB0byBkbywgYW5kIGluIGNhc2Ugb2YgaW5saW5pbmcgc29tZQotICogICAgICAgYWRkaXRpb25hbCBjb21tYW5kIG1pZ2h0IGJlIG5lY2Vzc2FyeSBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLgorICogXGRlZiAgRkRLX0ZPUkNFSU5MSU5FCisgKiAgICAgICBTb21ldGltZXMgY29tcGlsZXIgZG8gbm90IGRvIHdoYXQgdGhleSBhcmUgdG9sZCB0byBkbywgYW5kIGluIGNhc2Ugb2YKKyAqIGlubGluaW5nIHNvbWUgYWRkaXRpb25hbCBjb21tYW5kIG1pZ2h0IGJlIG5lY2Vzc2FyeSBkZXBlbmRpbmcgb24gdGhlCisgKiBwbGF0Zm9ybS4KICAqCiAgKiBcZGVmICBGREtfSU5MSU5FCiAgKiAgICAgICBEZWZpbmVzIGhvdyB0aGUgY29tcGlsZXIgaXMgdG9sZCB0byBpbmxpbmUgc3R1ZmYuCiAgKi8KLSNpZmRlZiBERUJVRwotI3VuZGVmIEZPUkNFSU5MSU5FCi0jZGVmaW5lIEZPUkNFSU5MSU5FCisjaWZuZGVmIEZES19GT1JDRUlOTElORQorI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fU0RFX01JUFNfXykKKyNkZWZpbmUgRkRLX0ZPUkNFSU5MSU5FIGlubGluZSBfX2F0dHJpYnV0ZSgoYWx3YXlzX2lubGluZSkpCiAjZWxzZQotI2lmbmRlZiBGT1JDRUlOTElORQotICAjaWYgZGVmaW5lZChfX0dOVUNfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwotICAgICNkZWZpbmUgRk9SQ0VJTkxJTkUgX19hdHRyaWJ1dGUoKGFsd2F5c19pbmxpbmUpKQotICAjZWxzZQotICAgICNkZWZpbmUgRk9SQ0VJTkxJTkUKLSAgI2VuZGlmCisjZGVmaW5lIEZES19GT1JDRUlOTElORSBpbmxpbmUKICNlbmRpZgogI2VuZGlmCiAKLSAgLyogZm9yIGFsbCBvdGhlciBwbGF0Zm9ybXMgKi8KLSAgI2RlZmluZSBGREtfSU5MSU5FIGlubGluZQotCisjZGVmaW5lIEZES19JTkxJTkUgc3RhdGljIGlubGluZQogCiAvKiEKICAqIFxkZWYgIExOS19TRUNUSU9OX0RBVEFfTDEKQEAgLTMyOSwyOSArMzY0LDI4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIENvZGUgU2VjdGlvbiBtYWNyb3MKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgI2RlZmluZSBMTktfU0VDVElPTl9DT0RFX0wxCi0gICNkZWZpbmUgTE5LX1NFQ1RJT05fQ09ERV9MMgotICAjZGVmaW5lIExOS19TRUNUSU9OX0lOSVRDT0RFCisjZGVmaW5lIExOS19TRUNUSU9OX0NPREVfTDEKKyNkZWZpbmUgTE5LX1NFQ1RJT05fQ09ERV9MMgorI2RlZmluZSBMTktfU0VDVElPTl9JTklUQ09ERQogCiAvKiBNZW1vcnkgc2VjdGlvbiBtYWNyb3MuICovCiAKLSAgLyogZGVmYXVsdCBmYWxsIGJhY2sgKi8KLSAgI2RlZmluZSBMTktfU0VDVElPTl9EQVRBX0wxCi0gICNkZWZpbmUgTE5LX1NFQ1RJT05fREFUQV9MMgotICAjZGVmaW5lIExOS19TRUNUSU9OX0NPTlNUREFUQQotICAjZGVmaW5lIExOS19TRUNUSU9OX0NPTlNUREFUQV9MMQorLyogZGVmYXVsdCBmYWxsIGJhY2sgKi8KKyNkZWZpbmUgTE5LX1NFQ1RJT05fREFUQV9MMQorI2RlZmluZSBMTktfU0VDVElPTl9EQVRBX0wyCisjZGVmaW5lIExOS19TRUNUSU9OX0NPTlNUREFUQQorI2RlZmluZSBMTktfU0VDVElPTl9DT05TVERBVEFfTDEKIAotICAjZGVmaW5lIExOS19TRUNUSU9OX0wxX0RBVEFfQQotICAjZGVmaW5lIExOS19TRUNUSU9OX0wxX0RBVEFfQgotCisjZGVmaW5lIExOS19TRUNUSU9OX0wxX0RBVEFfQQorI2RlZmluZSBMTktfU0VDVElPTl9MMV9EQVRBX0IKIAogI2lmZGVmIF9NU0NfVkVSCi0gIC8qCi0gICAqIFNvbWV0aW1lcyBjZXJ0YWluIGZlYXR1cmVzIGFyZSBleGNsdWRlZCBmcm9tIGNvbXBpbGF0aW9uIGFuZCB0aGVyZWZvcmUgdGhlIHdhcm5pbmcgNDA2NSBtYXkgb2NjdXI6Ci0gICAqICJzd2l0Y2ggc3RhdGVtZW50IGNvbnRhaW5zICdkZWZhdWx0JyBidXQgbm8gJ2Nhc2UnIGxhYmVscyIKLSAgICogV2UgY29uc2lkZXIgdGhpcyB3YXJuaW5nIGlycmVsZXZhbnQgYW5kIGRpc2FibGUgaXQuCi0gICAqLwotICAjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MDY1ICkKKy8qCisgKiBTb21ldGltZXMgY2VydGFpbiBmZWF0dXJlcyBhcmUgZXhjbHVkZWQgZnJvbSBjb21waWxhdGlvbiBhbmQgdGhlcmVmb3JlIHRoZQorICogd2FybmluZyA0MDY1IG1heSBvY2N1cjogInN3aXRjaCBzdGF0ZW1lbnQgY29udGFpbnMgJ2RlZmF1bHQnIGJ1dCBubyAnY2FzZScKKyAqIGxhYmVscyIgV2UgY29uc2lkZXIgdGhpcyB3YXJuaW5nIGlycmVsZXZhbnQgYW5kIGRpc2FibGUgaXQuCisgKi8KKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDA2NSkKICNlbmRpZgogCi0jZW5kaWYgLyogX19NQUNISU5FX1RZUEVfSF9fICovCisjZW5kaWYgLyogTUFDSElORV9UWVBFX0ggKi8KZGlmZiAtLWdpdCBhL2xpYlNZUy9pbmNsdWRlL3N5c2xpYl9jaGFubmVsTWFwRGVzY3IuaCBiL2xpYlNZUy9pbmNsdWRlL3N5c2xpYl9jaGFubmVsTWFwRGVzY3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzU3MzdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliU1lTL2luY2x1ZGUvc3lzbGliX2NoYW5uZWxNYXBEZXNjci5oCkBAIC0wLDAgKzEsMTk2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCisKK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgMS4gICAgSU5UUk9EVUNUSU9OCitUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUKK3RoYXQgaW1wbGVtZW50cyB0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK3NjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4gVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24KK2Egd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgorCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCisKK0NvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMKK3dpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlCitlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwgYXBwbGljYXRpb25zCitpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KKworMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgd2l0aG91dCBwYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3UKK3NhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uIFlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YKK2NoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCittb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCisKK1RoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCitmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCisKK1lvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCit0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zCitvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0gIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIgorbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybSAiVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsKK0FBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKKworMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKKworTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLCBBUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuCitGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGggcmVzcGVjdCB0byB0aGlzCitzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvcgorcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZCBieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKworNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgorCitGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKK0F0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCitBbSBXb2xmc21hbnRlbCAzMworOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKKword3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQorYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFN5c3RlbSBpbnRlZ3JhdGlvbiBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgIEF1dGhvcihzKTogICBUaG9tYXMgRGlldHplbgorCisgICBEZXNjcmlwdGlvbjoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIFxmaWxlICAgc3lzbGliX2NoYW5uZWxNYXBEZXNjci5oCisgKiAgXGJyaWVmICBGdW5jdGlvbiBhbmQgc3RydWN0dXJlIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGNoYW5uZWwgbWFwIGRlc2NyaXB0b3IgaW1wbGVtZW50YXRpb24uCisgKi8KKworI2lmbmRlZiBTWVNMSUJfQ0hBTk5FTE1BUERFU0NSX0gKKyNkZWZpbmUgU1lTTElCX0NIQU5ORUxNQVBERVNDUl9ICisKKyNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKKworLyoqCisgKiBcYnJpZWYgIENvbnRhaW5zIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgYSBzaW5nbGUgY2hhbm5lbCBtYXAuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgVUNIQVIqCisgICAgICBwQ2hhbm5lbE1hcDsgLyohPCBBY3R1YWwgY2hhbm5lbCBtYXBwaW5nIGZvciBvbmUgc2luZ2xlIGNvbmZpZ3VyYXRpb24uICovCisgIFVDSEFSIG51bUNoYW5uZWxzOyAvKiE8IFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgZm9yIHRoZSBjaGFubmVsIG1hcCB3aGljaCBpcworICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1heGltdW0gdXNlZCBjaGFubmVsIGluZGV4KzEuICovCit9IENIQU5ORUxfTUFQX0lORk87CisKKy8qKgorICogXGJyaWVmICAgVGhpcyBpcyB0aGUgbWFpbiBkYXRhIHN0cnVjdC4gSXQgY29udGFpbnMgdGhlIG1hcHBpbmcgZm9yIGFsbAorICogY2hhbm5lbCBjb25maWd1cmF0aW9ucyBzdWNoIGFzIGFkbWluaXN0cmF0aW9uIGluZm9ybWF0aW9uLgorICoKKyAqIENBVVRJT046IERvIG5vdCBhY2Nlc3MgdGhpcyBzdHJ1Y3R1cmUgZGlyZWN0bHkgZnJvbSBhIGFsZ29yaXRobSBzcGVjaWZpYworICogbGlicmFyeS4gQWx3YXlzIHVzZSBvbmUgb2YgdGhlIEFQSSBhY2Nlc3MgZnVuY3Rpb25zIGJlbG93IQorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IENIQU5ORUxfTUFQX0lORk8qIHBNYXBJbmZvVGFiOyAvKiE8IFRhYmxlIG9mIGNoYW5uZWwgbWFwcy4gKi8KKyAgVUlOVCBtYXBJbmZvVGFiTGVuOyAvKiE8IExlbmd0aCBvZiB0aGUgY2hhbm5lbCBtYXAgdGFibGUgYXJyYXkuICovCisgIFVJTlQgZlBhc3NUaHJvdWdoOyAgLyohPCBGbGFnIHRoYXQgZGVmaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbWFwcGluZyBzaGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGFwcGxpZWQgICh2YWx1ZTogMCkgb3IgdGhlIGlucHV0IGp1c3QgZ2V0cyBwYXNzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdWdoIChNUEVHIG1hcHBpbmcpLiAqLworfSBGREtfY2hhbm5lbE1hcERlc2NyOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogXGJyaWVmICBJbml0aWFsaXplIGEgZ2l2ZW4gY2hhbm5lbCBtYXAgZGVzY3JpcHRvci4KKyAqCisgKiBccGFyYW0gIHBNYXBEZXNjciAgICAgIFBvaW50ZXIgdG8gYSBjaGFubmVsIG1hcCBkZXNjcmlwdG9yIHRvIGJlIGluaXRpYWxpemVkLgorICogXHBhcmFtICBwTWFwSW5mb1RhYiAgICBUYWJsZSBvZiBjaGFubmVsIG1hcHMgdG8gaW5pdGl6YWxpemUgdGhlIGRlc2NyaXB0b3IKKyB3aXRoLgorICogICAgICAgICAgICAgICAgICAgICAgICBJZiBhIE5VTEwgcG9pbnRlciBpcyBnaXZlbiBhIGRlZmF1bHQgdGFibGUgZm9yCisgV0FWLWxpa2UgbWFwcGluZyB3aWxsIGJlIHVzZWQuCisgKiBccGFyYW0gIG1hcEluZm9UYWJMZW4gIExlbmd0aCBvZiB0aGUgY2hhbm5lbCBtYXAgdGFibGUgYXJyYXkgKHBNYXBJbmZvVGFiKS4KKyBJZiBhIHplcm8gbGVuZ3RoIGlzIGdpdmVuIGEgZGVmYXVsdCB0YWJsZSBmb3IgV0FWLWxpa2UgbWFwcGluZyB3aWxsIGJlIHVzZWQuCisgKiBccGFyYW0gIGZQYXNzVGhyb3VnaCAgIElmIHRoZSBmbGFnIGlzIHNldCB0aGUgcmVvcmRlcmluZyAoZ2l2ZW4gYnkKKyBwTWFwSW5mb1RhYikgd2lsbCBiZSBieXBhc3NlZC4KKyAqLwordm9pZCBGREtfY2hNYXBEZXNjcl9pbml0KEZES19jaGFubmVsTWFwRGVzY3IqIGNvbnN0IHBNYXBEZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSEFOTkVMX01BUF9JTkZPKiBjb25zdCBwTWFwSW5mb1RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG1hcEluZm9UYWJMZW4sIGNvbnN0IFVJTlQgZlBhc3NUaHJvdWdoKTsKKworLyoqCisgKiBcYnJpZWYgIENoYW5nZSB0aGUgY2hhbm5lbCByZW9yZGVyaW5nIHN0YXRlIG9mIGEgZ2l2ZW4gY2hhbm5lbCBtYXAKKyAqIGRlc2NyaXB0b3IuCisgKgorICogXHBhcmFtICBwTWFwRGVzY3IgICAgIFBvaW50ZXIgdG8gYSAoaW5pdGlhbGl6ZWQpIGNoYW5uZWwgbWFwIGRlc2NyaXB0b3IuCisgKiBccGFyYW0gIGZQYXNzVGhyb3VnaCAgSWYgdGhlIGZsYWcgaXMgc2V0IHRoZSByZW9yZGVyaW5nIChnaXZlbiBieQorICogcE1hcEluZm9UYWIpIHdpbGwgYmUgYnlwYXNzZWQuCisgKiBccmV0dXJuICAgICAgICAgICAgICAgVmFsdWUgdW5lcXVhbCB0byB6ZXJvIGlmIHNldCBvcGVyYXRpb24gd2FzIG5vdAorICogc3VjY2Vzc2Z1bC4gQW5kIHplcm8gb24gc3VjY2Vzcy4KKyAqLworaW50IEZES19jaE1hcERlc2NyX3NldFBhc3NUaHJvdWdoKEZES19jaGFubmVsTWFwRGVzY3IqIGNvbnN0IHBNYXBEZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGZQYXNzVGhyb3VnaCk7CisKKy8qKgorICogXGJyaWVmICBHZXQgdGhlIG1hcHBpbmcgdmFsdWUgZm9yIGEgc3BlY2lmaWMgY2hhbm5lbCBhbmQgbWFwIGluZGV4LgorICoKKyAqIFxwYXJhbSAgcE1hcERlc2NyICBQb2ludGVyIHRvIGNoYW5uZWwgbWFwIGRlc2NyaXB0b3IuCisgKiBccGFyYW0gIGNoSWR4ICAgICAgQ2hhbm5lbCBpbmRleC4KKyAqIFxwYXJhbSAgbWFwSWR4ICAgICBNYXBwaW5nIGluZGV4IChjb3JyZXNwb25kaW5nIHRvIHRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24KKyAqIGluZGV4KS4KKyAqIFxyZXR1cm4gICAgICAgICAgICBNYXBwaW5nIHZhbHVlLgorICovCitVQ0hBUiBGREtfY2hNYXBEZXNjcl9nZXRNYXBWYWx1ZShjb25zdCBGREtfY2hhbm5lbE1hcERlc2NyKiBjb25zdCBwTWFwRGVzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ0hBUiBjaElkeCwgY29uc3QgVUlOVCBtYXBJZHgpOworCisvKioKKyAqIFxicmllZiAgRXZhbHVhdGUgd2hldGhlciBjaGFubmVsIG1hcCBkZXNjcmlwdG9yIGlzIHJlYXNvbmFibGUgb3Igbm90LgorICoKKyAqIFxwYXJhbSAgcE1hcERlc2NyIFBvaW50ZXIgdG8gY2hhbm5lbCBtYXAgZGVzY3JpcHRvci4KKyAqIFxyZXR1cm4gICAgICAgICAgIFZhbHVlIHVuZXF1YWwgdG8gemVybyBpZiBkZXNjcmlwdG9yIGlzIHZhbGlkLCBvdGhlcndpc2UKKyAqIHplcm8uCisgKi8KK2ludCBGREtfY2hNYXBEZXNjcl9pc1ZhbGlkKGNvbnN0IEZES19jaGFubmVsTWFwRGVzY3IqIGNvbnN0IHBNYXBEZXNjcik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhZGVmaW5lZChTWVNMSUJfQ0hBTk5FTE1BUERFU0NSX0gpICovCmRpZmYgLS1naXQgYS9saWJTWVMvaW5jbHVkZS93YXZfZmlsZS5oIGIvbGliU1lTL2luY2x1ZGUvd2F2X2ZpbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjNDNiMi4uMDAwMDAwMAotLS0gYS9saWJTWVMvaW5jbHVkZS93YXZfZmlsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKLQotICAgQXV0aG9yKHMpOiAgIEVyaWMgQWxsYW1hbmNoZQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKiBcZmlsZSAgIHdhdl9maWxlLmgKLSAqICBcYnJpZWYgIFJ1ZGltZW50YXJ5IFdBVkUgZmlsZSByZWFkL3dyaXRlIHN1cHBvcnQuCi0gKgotICogIFRoZSBXQVZFIGZpbGUgcmVhZGVyL3dyaXRlciBpcyBpbnRlbnRlZCB0byBiZSB1c2VkIGluIHRoZSBjb2RlYydzIGV4YW1wbGUKLSAqICBmcmFtZXdvcmsgZm9yIGVhc2lseSBnZXR0aW5nIHN0YXJ0ZWQgd2l0aCBlbmNvZGluZy9kZWNvZGluZy4gVGhlcmVmb3JlCi0gKiAgaXQgc2VydmVzIG1haW5seSBmb3IgaGVscGluZyBxdWlja2x5IHVuZGVyc3RhbmQgaG93IGEgY29kZWMncyBBUEkgYWN0dWFsbHkKLSAqICB3b3Jrcy4KLSAqICBCZWluZyBhIFdBVkUgZmlsZSByZWFkZXIvd3JpdGVyIHdpdGggdmVyeSBiYXNpYyBmdW5jdGlvbmFsaXR5LCBpdCBtYXkgbm90IGJlCi0gKiAgYWJsZSB0byByZWFkIFdBVkUgZmlsZXMgdGhhdCBjb21lIHdpdGggdW51c3VhbCBjb25maWd1cmF0aW9ucy4KLSAqICBEZXRhaWxzIG9uIGhvdyB0byB1c2UgdGhlIGludGVyZmFjZSBmdW5jdGlvbnMgY2FuIGJlIGZvdW5kIGluIGV2ZXJ5Ci0gKiAgKGVuY29kZXIvZGVjb2RlcikgZXhhbXBsZSBmcmFtZXdvcmsuCi0gKi8KLQotI2lmbmRlZiBfX1dBVl9GSUxFX0hfXwotI2RlZmluZSBfX1dBVl9GSUxFX0hfXwotCi0KLQotI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2RlZmluZSBTUEVBS0VSX0ZST05UX0xFRlQgICAgICAgICAgICAgMHgxCi0jZGVmaW5lIFNQRUFLRVJfRlJPTlRfUklHSFQgICAgICAgICAgICAweDIKLSNkZWZpbmUgU1BFQUtFUl9GUk9OVF9DRU5URVIgICAgICAgICAgIDB4NAotI2RlZmluZSBTUEVBS0VSX0xPV19GUkVRVUVOQ1kgICAgICAgICAgMHg4Ci0jZGVmaW5lIFNQRUFLRVJfQkFDS19MRUZUICAgICAgICAgICAgICAweDEwCi0jZGVmaW5lIFNQRUFLRVJfQkFDS19SSUdIVCAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIFNQRUFLRVJfRlJPTlRfTEVGVF9PRl9DRU5URVIgICAweDQwCi0jZGVmaW5lIFNQRUFLRVJfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSICAweDgwCi0jZGVmaW5lIFNQRUFLRVJfQkFDS19DRU5URVIgICAgICAgICAgICAweDEwMAotI2RlZmluZSBTUEVBS0VSX1NJREVfTEVGVCAgICAgICAgICAgICAgMHgyMDAKLSNkZWZpbmUgU1BFQUtFUl9TSURFX1JJR0hUICAgICAgICAgICAgIDB4NDAwCi0jZGVmaW5lIFNQRUFLRVJfVE9QX0NFTlRFUiAgICAgICAgICAgICAweDgwMAotI2RlZmluZSBTUEVBS0VSX1RPUF9GUk9OVF9MRUZUICAgICAgICAgMHgxMDAwCi0jZGVmaW5lIFNQRUFLRVJfVE9QX0ZST05UX0NFTlRFUiAgICAgICAweDIwMDAKLSNkZWZpbmUgU1BFQUtFUl9UT1BfRlJPTlRfUklHSFQgICAgICAgIDB4NDAwMAotI2RlZmluZSBTUEVBS0VSX1RPUF9CQUNLX0xFRlQgICAgICAgICAgMHg4MDAwCi0jZGVmaW5lIFNQRUFLRVJfVE9QX0JBQ0tfQ0VOVEVSICAgICAgICAweDEwMDAwCi0jZGVmaW5lIFNQRUFLRVJfVE9QX0JBQ0tfUklHSFQgICAgICAgICAweDIwMDAwCi0jZGVmaW5lIFNQRUFLRVJfUkVTRVJWRUQgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0KLS8qIQotICogUklGRiBXQVZFIGZpbGUgc3RydWN0LgotICogRm9yIGRldGFpbHMgc2VlIFdBVkUgZmlsZSBmb3JtYXQgZG9jdW1lbnRhdGlvbiAoZm9yIGV4YW1wbGUgYXQgaHR0cDovL3d3dy53b3RzaXQub3JnKS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgV0FWX0hFQURFUgotewotICBjaGFyICAgcmlmZlR5cGVbNF07Ci0gIFVJTlQgICByaWZmU2l6ZTsKLSAgY2hhciAgIHdhdmVUeXBlWzRdOwotICBjaGFyICAgZm9ybWF0VHlwZVs0XTsKLSAgVUlOVCAgIGZvcm1hdFNpemU7Ci0gIFVTSE9SVCBjb21wcmVzc2lvbkNvZGU7Ci0gIFVTSE9SVCBudW1DaGFubmVsczsKLSAgVUlOVCAgIHNhbXBsZVJhdGU7Ci0gIFVJTlQgICBieXRlc1BlclNlY29uZDsKLSAgVVNIT1JUIGJsb2NrQWxpZ247Ci0gIFVTSE9SVCBiaXRzUGVyU2FtcGxlOwotICBjaGFyICAgZGF0YVR5cGVbNF07Ci0gIFVJTlQgICBkYXRhU2l6ZTsKLX0gV0FWX0hFQURFUjsKLQotc3RydWN0IFdBVgotewotICBXQVZfSEVBREVSIGhlYWRlcjsKLSAgRkRLRklMRSAqZnA7Ci0gIFVJTlQgY2hhbm5lbE1hc2s7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBXQVYgKkhBTkRMRV9XQVY7Ci0KLS8qKgotICogXGJyaWVmICBPcGVuIGEgV0FWIGZpbGUgaGFuZGxlIGZvciByZWFkaW5nLgotICoKLSAqIFxwYXJhbSBwV2F2ICAgICAgUG9pbnRlciB0byBhIG1lbW9yeSBsb2NhdGlvbiwgd2hlcmUgYSBXQVYgaGFuZGxlIGlzIHJldHVybmVkLgotICogXHBhcmFtIGZpbGVuYW1lICBGaWxlIG5hbWUgdG8gYmUgb3BlbmVkLgotICoKLSAqIFxyZXR1cm4gIDAgb24gc3VjY2VzcyBhbmQgbm9uLXplcm8gb24gZmFpbHVyZS4KLSAqLwotSU5UIFdBVl9JbnB1dE9wZW4gKEhBTkRMRV9XQVYgKnBXYXYsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKLQotLyoqCi0gKiBcYnJpZWYgIFJlYWQgc2FtcGxlcyBmcm9tIGEgV0FWRSBmaWxlLiBUaGUgc2FtcGxlcyBhcmUgYXV0b21hdGljYWxseSByZS1vcmRlcmVkIHRvIHRoZQotICogICAgICAgICBuYXRpdmUgaG9zdCBlbmRpYW5lc3MgYW5kIHNjYWxlZCB0byBmdWxsIHNjYWxlIG9mIHRoZSBJTlRfUENNIHR5cGUsIGZyb20KLSAqICAgICAgICAgd2hhdGV2ZXIgQlBTIHRoZSBXQVZFIGZpbGUgaGFkIHNwZWNpZmllZCBpbiBpdHMgaGVhZGVyIGRhdGEuCi0gKgotICogIFxwYXJhbSB3YXYgICAgICAgICAgIEhhbmRsZSBvZiBXQVYgZmlsZS4KLSAqICBccGFyYW0gc2FtcGxlQnVmZmVyICBQb2ludGVyIHRvIHN0b3JlIGF1ZGlvIGRhdGEuCi0gKiAgXHBhcmFtIG51bVNhbXBsZXMgICAgRGVzaXJlZCBudW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkLgotICogIFxwYXJhbSBuQnVmQml0cyAgICAgIFNpemUgaW4gYml0IG9mIGVhY2ggYXVkaW8gc2FtcGxlIG9mIHNhbXBsZUJ1ZmZlci4KLSAqCi0gKiAgXHJldHVybiAgTnVtYmVyIG9mIHNhbXBsZXMgYWN0dWFsbHkgcmVhZC4KLSAqLwotSU5UIFdBVl9JbnB1dFJlYWQgKEhBTkRMRV9XQVYgd2F2LCB2b2lkICpzYW1wbGVCdWZmZXIsIFVJTlQgbnVtU2FtcGxlcywgaW50IG5CdWZCaXRzKTsKLQotLyoqCi0gKiBcYnJpZWYgICAgICAgQ2xvc2UgYSBXQVYgZmlsZSByZWFkaW5nIGhhbmRsZS4KLSAqIFxwYXJhbSBwV2F2ICBQb2ludGVyIHRvIGEgV0FWIGZpbGUgcmVhZGluZyBoYW5kbGUuCi0gKiBccmV0dXJuICAgICAgdm9pZAotICovCi12b2lkIFdBVl9JbnB1dENsb3NlKEhBTkRMRV9XQVYgKnBXYXYpOwotCi0vKioKLSAqIFxicmllZiAgT3BlbiBXQVYgb3V0cHV0L3dyaXRlciBoYW5kbGUuCi0gKgotICogXHBhcmFtIHBXYXYgICAgICAgICAgICBQb2ludGVyIHRvIFdBViBoYW5kbGUgdG8gYmUgcmV0dXJuZWQuCi0gKiBccGFyYW0gb3V0cHV0RmlsZW5hbWUgIEZpbGUgbmFtZSBvZiB0aGUgZmlsZSB0byBiZSB3cml0dGVuIHRvLgotICogXHBhcmFtIHNhbXBsZVJhdGUgICAgICBEZXNpcmVkIHNhbXBsZXJhdGUgb2YgdGhlIHJlc3VsdGluZyBXQVYgZmlsZS4KLSAqIFxwYXJhbSBudW1DaGFubmVscyAgICAgRGVzaXJlZCBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgb2YgdGhlIHJlc3VsdGluZyBXQVYgZmlsZS4KLSAqIFxwYXJhbSBiaXRzUGVyU2FtcGxlICAgRGVzaXJlZCBudW1iZXIgb2YgYml0cyBwZXIgYXVkaW8gc2FtcGxlIG9mIHRoZSByZXN1bHRpbmcgV0FWIGZpbGUuCi0gKgotICogXHJldHVybiAgMDogb2s7IC0xOiBlcnJvcgotICovCi1JTlQgV0FWX091dHB1dE9wZW4oSEFORExFX1dBViAqcFdhdiwgY29uc3QgY2hhciAqb3V0cHV0RmlsZW5hbWUsIElOVCBzYW1wbGVSYXRlLCBJTlQgbnVtQ2hhbm5lbHMsIElOVCBiaXRzUGVyU2FtcGxlKTsKLQotLyoqCi0gKiBcYnJpZWYgIFdyaXRlIGRhdGEgdG8gV0FWIGZpbGUgYXNvY2lhdGVkIHRvIFdBViBoYW5kbGUuCi0gKgotICogXHBhcmFtIHdhdiAgICAgICAgICAgICAgSGFuZGxlIG9mIFdBViBmaWxlCi0gKiBccGFyYW0gc2FtcGxlQnVmZmVyICAgICBQb2ludGVyIHRvIGF1ZGlvIHNhbXBsZXMsIHJpZ2h0IGp1c3RpZmllZCBpbnRlZ2VyIHZhbHVlcy4KLSAqIFxwYXJhbSBudW1iZXJPZlNhbXBsZXMgIFRoZSBudW1iZXIgb2YgaW5kaXZpZHVhbCBhdWRpbyBzYW1wbGUgdmFsdWVzdG8gYmUgd3JpdHRlbi4KLSAqIFxwYXJhbSBuQnVmQml0cyAgICAgICAgIFNpemUgaW4gYml0cyBvZiBlYWNoIGF1ZGlvIHNhbXBsZSBpbiBzYW1wbGVCdWZmZXIuCi0gKiBccGFyYW0gblNpZ0JpdHMgICAgICAgICBBbW91bnQgb2Ygc2lnbmlmaWNhbnQgYml0cyBvZiBlYWNoIG5CdWZCaXRzIGluIHNhbXBsZUJ1ZmZlci4KLSAqCi0gKiBccmV0dXJuIDA6IG9rOyAtMTogZXJyb3IKLSAqLwotSU5UIFdBVl9PdXRwdXRXcml0ZShIQU5ETEVfV0FWIHdhdiwgdm9pZCAqc2FtcGxlQnVmZmVyLCBVSU5UIG51bWJlck9mU2FtcGxlcywgaW50IG5CdWZCaXRzLCBpbnQgblNpZ0JpdHMpOwotCi0vKioKLSAqIFxicmllZiAgICAgICBDbG9zZSBXQVYgb3V0cHV0IGhhbmRsZS4KLSAqIFxwYXJhbSBwV2F2ICBQb2ludGVyIHRvIFdBViBoYW5kbGUuICpwV2F2IGlzIHNldCB0byBOVUxMLgotICogXHJldHVybiAgICAgIHZvaWQKLSAqLwotdm9pZCBXQVZfT3V0cHV0Q2xvc2UoSEFORExFX1dBViAqcFdhdik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLQotI2VuZGlmIC8qIF9fV0FWX0ZJTEVfSF9fICovCmRpZmYgLS1naXQgYS9saWJTWVMvc3JjL2NtZGxfcGFyc2VyLmNwcCBiL2xpYlNZUy9zcmMvY21kbF9wYXJzZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGVjMGQ1Li4wMDAwMDAwCi0tLSBhL2xpYlNZUy9zcmMvY21kbF9wYXJzZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTgxICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKLQotICAgQXV0aG9yKHMpOgotICAgRGVzY3JpcHRpb246IGNvbW1hbmQgbGluZSBwYXJzZXIKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiY21kbF9wYXJzZXIuaCIKLSNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiBpbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgSU5UICBHZXRBcmdGcm9tU3RyaW5nKElOVCBhcmdjLCBURVhUQ0hBUiogYXJndltdLCBURVhUQ0hBUiogc2VhcmNoX3N0cmluZywgVEVYVENIQVIgdHlwZSwgVEVYVENIQVIqIGZvdW5kX3N0cmluZyAsIElOVCogc3dpdGNoZXNfdXNlZCk7Ci1zdGF0aWMgdm9pZCBSZW1vdmVXaGl0ZVNwYWNlKGNvbnN0IFRFWFRDSEFSKiBwUmVxQXJncywgVEVYVENIQVIqIFJlbW92ZWQpOwotc3RhdGljIElOVCBDaGVja0FyZyhURVhUQ0hBUiogYXJnLCAgVEVYVENIQVIqIHN0ciwgVUlOVCBudW1BcmdzLCBURVhUQ0hBUiB0eXBlLCBURVhUQ0hBUiogY3VycmVudF9zdHIpOwotc3RhdGljIElOVCBDaGVja0ZvclVudXNlZFN3aXRjaGVzKElOVCBhcmdjLCAvKlRFWFRDSEFSKiBhcmd2W10sKi8gSU5UKiBzd2l0Y2hlc191c2VkKTsKLXN0YXRpYyBJTlQgUGFyc2VTdHJpbmcoVEVYVENIQVIqIHN0ciwgSU5UKiwgVEVYVENIQVIqLCBURVhUQ0hBUiopOwotc3RhdGljIHZvaWQgR2V0TnVtYmVyT2ZBcmdzKFRFWFRDSEFSKiBzdHIsIElOVCogbkFyZ3MpOwotCi1zdGF0aWMKLXZvaWQgcmVtb3ZlUXVvdGVzKGNoYXIgKnN0cikKLXsKLSAgaWYgKHN0clswXSA9PSAnIicpIHsKLSAgICBGREtzdHJjcHkoc3RyLCBzdHIrMSk7Ci0gICAgc3RyW0ZES3N0cmxlbihzdHIpLTFdID0gMDsKLSAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqKi8KLQotSU5UIElJU19TY2FuQ21kbChJTlQgYXJnYywgVEVYVENIQVIqIGFyZ3ZbXSwgY29uc3QgVEVYVENIQVIqIHN0ciwgLi4uKQotewotICBJTlQgaSAgICAgICAgICAgICAgPSAwOwotICBJTlQgZm91bmRfYW5kX3NldCAgPSAwOwotICBJTlQgbkFyZ3MgICAgICAgICAgPSAwOwotICBJTlQqIHN3aXRjaGVzX3VzZWQgPSAwOwotICBJTlQqICAgYl9zdHJfb3B0ICAgPSAwOwotICBURVhUQ0hBUiogIHNfc3RyICAgICAgID0gMDsKLSAgVEVYVENIQVIqICBjX3N0cl90eXBlICA9IDA7Ci0gIFRFWFRDSEFSKiAgc3RyX2NsZWFuICAgPSAwOwotCi0gIHZhX2xpc3QgYXA7Ci0KLSAgaWYgKGFyZ2MgPT0gMCB8fCBhcmdjID09IDEpCi0gIHsKLSAgICBGREtwcmludGYoIk5vIGNvbW1hbmQgbGluZSBhcmd1bWVudHNcbiIpOwotICAgIGdvdG8gYmFpbDsKLSAgfQotCi0gIHN0cl9jbGVhbiAgPSAoVEVYVENIQVIqKSAgRkRLY2FsbG9jKCh1bnNpZ25lZCBpbnQpX3Rjc2xlbihzdHIpLCBzaXplb2YoVEVYVENIQVIpKTsKLSAgaWYgKHN0cl9jbGVhbiA9PSBOVUxMKSB7Ci0gICAgRkRLcHJpbnRmKCJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeSBsaW5lICVkLCBmaWxlICVzXG4iLCAgX19MSU5FX18sIF9fRklMRV9fKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIFJlbW92ZVdoaXRlU3BhY2Uoc3RyLCBzdHJfY2xlYW4gKTsKLSAgR2V0TnVtYmVyT2ZBcmdzKHN0cl9jbGVhbiwgJm5BcmdzKTsKLQotICBiX3N0cl9vcHQgID0gKElOVCopICAgRkRLY2FsbG9jKG5BcmdzLCAgICBzaXplb2YoSU5UKSk7Ci0gIHNfc3RyICAgICAgPSAoVEVYVENIQVIqKSAgRkRLY2FsbG9jKG5BcmdzKkNNRExfTUFYX0FSR0MsIHNpemVvZihURVhUQ0hBUikgKTsKLSAgY19zdHJfdHlwZSA9IChURVhUQ0hBUiopICBGREtjYWxsb2MobkFyZ3MsICAgIHNpemVvZihURVhUQ0hBUikpOwotICBzd2l0Y2hlc191c2VkID0gKElOVCopIEZES2NhbGxvYyhhcmdjLCBzaXplb2YoSU5UKSk7Ci0KLSAgaWYgKGJfc3RyX29wdCA9PSBOVUxMIHx8IHNfc3RyID09IE5VTEwgfHwgY19zdHJfdHlwZSA9PSBOVUxMIHx8IHN3aXRjaGVzX3VzZWQgPT0gTlVMTCkgewotICAgIEZES3ByaW50ZigiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkgbGluZSAlZCwgZmlsZSAlc1xuIiwgIF9fTElORV9fLCBfX0ZJTEVfXyk7Ci0gICAgZ290byBiYWlsOwotICB9Ci0KLSAgaWYgKCBQYXJzZVN0cmluZyggc3RyX2NsZWFuLCBiX3N0cl9vcHQsIHNfc3RyLCBjX3N0cl90eXBlICkpIHsKLSAgICBnb3RvIGJhaWw7Ci0gIH0KLQotICB2YV9zdGFydChhcCwgc3RyKTsKLQotICBmb3IgKCBpID0gMDsgaSA8IG5BcmdzOyBpKysgKQotICAgIHsKLSAgICAgIFRFWFRDSEFSIGFyZ1tDTURMX01BWF9TVFJMRU5dID0ge0wnXDAnfTsKLSAgICAgIFRFWFRDSEFSKiBwX2FyZyA9IGFyZzsKLSAgICAgIFRFWFRDSEFSKiBjdXJyZW50X3N0ciA9ICYoc19zdHJbaSpDTURMX01BWF9BUkdDXSk7Ci0KLSAgICAgIGlmIChHZXRBcmdGcm9tU3RyaW5nKGFyZ2MsIGFyZ3YsIGN1cnJlbnRfc3RyLCBjX3N0cl90eXBlW2ldLCBhcmcsIHN3aXRjaGVzX3VzZWQgKQotICAgICAgICAgICYmICFiX3N0cl9vcHRbaV0gKQotICAgICAgICB7Ci0jaWZkZWYgX1VOSUNPREUKLSAgICAgICAgICBfZnRwcmludGYoc3RkZXJyLCBfVEVYVCgiXG5cbkVycm9yOiBQYXJzaW5nIGFyZ3VtZW50IGZvciByZXF1aXJlZCBzd2l0Y2ggJyVscycuXG4iICksIGN1cnJlbnRfc3RyKTsKLSNlbHNlCi0gICAgICAgICAgX2Z0cHJpbnRmKHN0ZGVyciwgX1RFWFQoIlxuXG5FcnJvcjogUGFyc2luZyBhcmd1bWVudCBmb3IgcmVxdWlyZWQgc3dpdGNoICclcycuXG4iICksIGN1cnJlbnRfc3RyKTsKLSNlbmRpZgotICAgICAgICAgIGZvdW5kX2FuZF9zZXQgPSAwOwotICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgfQotICAgICAgaWYgKENoZWNrQXJnKHBfYXJnLCBzX3N0ciwgbkFyZ3MsIGNfc3RyX3R5cGVbaV0sIGN1cnJlbnRfc3RyKSkKLSAgICAgICAgewotICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgfQotCi0gICAgICBzd2l0Y2ggKGNfc3RyX3R5cGVbaV0gKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIFRFWFRDSEFSKiB0bXA7Ci0gICAgICAgICAgICB0bXAgPSB2YV9hcmcoYXAsIFRFWFRDSEFSKik7Ci0KLSAgICAgICAgICAgIGlmICggYXJnWzBdID09ICdcMCcgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgX3Rjc25jcHkoIHRtcCwgYXJnLCBDTURMX01BWF9TVFJMRU4gKTsKLSAgICAgICAgICAgIC8qIFJlbW92ZSBxdW90ZXMuIFdpbmRvd3MgTW9iaWxlIFdvcmthcm91bmQuICovCi0gICAgICAgICAgICByZW1vdmVRdW90ZXModG1wKTsKLSAgICAgICAgICAgIGZvdW5kX2FuZF9zZXQrKzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgewotICAgICAgICAgICAgSU5UKiB0bXAgPSB2YV9hcmcoYXAsIElOVCopOwotCi0gICAgICAgICAgICBpZiAoIGFyZ1swXSA9PSAnXDAnICkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICp0bXAgPSBfdGNzdG9sKGFyZywgTlVMTCwgMCk7Ci0gICAgICAgICAgICBmb3VuZF9hbmRfc2V0Kys7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgJ2MnOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIqIHRtcCA9IHZhX2FyZyhhcCwgY2hhciopOwotCi0gICAgICAgICAgICBpZiAoIGFyZ1swXSA9PSAnXDAnICkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICp0bXAgPSAqYXJnOwotICAgICAgICAgICAgZm91bmRfYW5kX3NldCsrOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlICd1JzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBVQ0hBUiogdG1wID0gdmFfYXJnKGFwLCBVQ0hBUiopOwotCi0gICAgICAgICAgICBpZiAoIGFyZ1swXSA9PSAnXDAnICkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICp0bXAgPSBfdHN0b2koYXJnKTsKLSAgICAgICAgICAgIGZvdW5kX2FuZF9zZXQrKzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAnZic6Ci0gICAgICAgICAgewotICAgICAgICAgICAgZmxvYXQqIHRtcCA9IChmbG9hdCopIHZhX2FyZyggYXAsZG91YmxlKik7Ci0KLSAgICAgICAgICAgIGlmICggYXJnWzBdID09ICdcMCcgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgKnRtcCA9IChmbG9hdCkgX3RzdG9mKGFyZyk7Ci0gICAgICAgICAgICBmb3VuZF9hbmRfc2V0Kys7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgJ3knOiAvLyBzdXBwb3J0ICdkYXRhIHR5cGUgZG91YmxlJwotICAgICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZSogdG1wID0gKGRvdWJsZSopIHZhX2FyZyggYXAsZG91YmxlKik7Ci0gICAgICAgICAgICAvLyB1c2Ugc3NjYW5mIGluc3RlYWQgX3RzdG9mIGJlY2F1c2Ugb2YgZ2NjCi0gICAgICAgICAgICAvL190c3RvZihhcmcsIiVsZiIsdG1wKTsgLy8gJyVsZicgcmVhZHMgYXMgZG91YmxlCi0gICAgICAgICAgICAqdG1wID0gX3RzdG9mKGFyZyk7IC8vICclbGYnIHJlYWRzIGFzIGRvdWJsZQotICAgICAgICAgICAgZm91bmRfYW5kX3NldCsrOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlICcxJzoKLSAgICAgICAgICB7Ci0KLSAgICAgICAgICAgIElOVCogdG1wID0gdmFfYXJnKCBhcCwgSU5UKik7Ci0KLSAgICAgICAgICAgIGlmICggYXJnWzBdID09ICdcMCcgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgKnRtcCA9IDE7Ci0gICAgICAgICAgICBmb3VuZF9hbmRfc2V0Kys7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBGREtwcmludGZFcnIoIkJ1ZzogdW5zdXBwb3J0ZWQgZGF0YSBpZGVudGlmaWVyIFwiJWNcIlxuIiwgY19zdHJfdHlwZVtpXSk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgfQotCi0gICAgfQotCi0gIHZhX2VuZChhcCk7Ci0KLSAgQ2hlY2tGb3JVbnVzZWRTd2l0Y2hlcyhhcmdjLCAvKmFyZ3YsKi8gc3dpdGNoZXNfdXNlZCk7Ci0KLWJhaWw6Ci0gIGlmIChiX3N0cl9vcHQpICAgICBGREtmcmVlKGJfc3RyX29wdCk7Ci0gIGlmIChzX3N0cikgICAgICAgICBGREtmcmVlKHNfc3RyKTsKLSAgaWYgKGNfc3RyX3R5cGUpICAgIEZES2ZyZWUoY19zdHJfdHlwZSk7Ci0gIGlmIChzdHJfY2xlYW4pICAgICBGREtmcmVlKHN0cl9jbGVhbik7Ci0gIGlmIChzd2l0Y2hlc191c2VkKSBGREtmcmVlKHN3aXRjaGVzX3VzZWQpOwotCi0gIHJldHVybiBmb3VuZF9hbmRfc2V0OwotfQotCi0KLXZvaWQgR2V0TnVtYmVyT2ZBcmdzKFRFWFRDSEFSKiBzdHIsIElOVCogbkFyZ3MpCi17Ci0gIFVJTlQgaSA9IDA7Ci0gIGZvciAoIGkgPSAwOyBpIDwgX3Rjc2xlbihzdHIpOyArK2kgKQotICAgIHsKLSAgICAgIGlmICggc3RyW2ldID09ICclJykKLSAgICAgICAgKm5BcmdzKz0gMTsKLSAgICB9Ci0KLX0KLQotSU5UIFBhcnNlU3RyaW5nKFRFWFRDSEFSKiBzdHIsIElOVCogYl9zdHJfb3B0LCBURVhUQ0hBUiogc19zdHIsIFRFWFRDSEFSKiBjX3N0cl90eXBlICkKLXsKLSAgICBVSU5UIGkgPSAwOwotICAgIElOVCBhcmdDb3VudGVyID0gMDsKLQotICAgIFRFWFRDSEFSKiBzdHJfc3RhcnQgPSAwOwotICAgIFRFWFRDSEFSKiBzdHJfc3RvcCA9IDA7Ci0KLQotICAgIHN0cl9zdGFydCA9IHN0cjsKLSAgICBzdHJfc3RvcCA9IHN0cl9zdGFydDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgX3Rjc2xlbihzdHIpIC0gMTsgKytpICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBzdHJbaV0gPT0gJyUnICkgIC8qIFdlIGhhdmUgYW4gQXJndW1lbnQgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGFyZ0NvdW50ZXIgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBiX3N0cl9vcHRbYXJnQ291bnRlci0xXSApCi0gICAgICAgICAgICAgICAgICBzdHJfc3RhcnQgPSBzdHJfc3RvcCArIDM7Ci0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBzdHJfc3RhcnQgPSBzdHJfc3RvcCArIDI7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogU2F2ZSBBcmd1bWVudCB0eXBlICovCi0gICAgICAgICAgICBjX3N0cl90eXBlW2FyZ0NvdW50ZXJdID0gc3RyW2krMV07Ci0KLSAgICAgICAgICAgIGlmICggKnN0cl9zdGFydCA9PSAnKCcgKSAvKiBPcHRpb25hbCBBcmd1bWVudCAqLwotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYl9zdHJfb3B0W2FyZ0NvdW50ZXJdID0gMTsKLSAgICAgICAgICAgICAgICBzdHJfc3RhcnQrKzsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBTYXZlIEFyZ3VtZW50ICovCi0gICAgICAgICAgICBzdHJbaV0gPSAnXDAnOwotCi0gICAgICAgICAgICBfdGNzbmNweSgmKHNfc3RyW2FyZ0NvdW50ZXIqQ01ETF9NQVhfQVJHQ10pLCBzdHJfc3RhcnQsIENNRExfTUFYX0FSR0MgKTsKLQotICAgICAgICAgICAgc3RyW2ldID0gJyUnOwotCi0gICAgICAgICAgICBzdHJfc3RvcCA9ICYoc3RyW2ldKTsKLQotICAgICAgICAgICAgaWYgKCBiX3N0cl9vcHRbYXJnQ291bnRlcl0gKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBpKzIgPiAoIF90Y3NsZW4oc3RyKSAtMSApKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfZnRwcmludGYoc3RkZXJyLF9URVhUKCJcblxuSW50ZXJuYWwgUGFyc2VyIEVycm9yOiBTdHJsZW4gUHJvYmxlbVxuIikgKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCBzdHJbaSsyXSAhPSAnKScgKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfZnRwcmludGYoc3RkZXJyLF9URVhUKCJcblxuSW50ZXJuYWwgUGFyc2VyIEVycm9yOiBNaXNzaW5nIGJyYWNrZXQgJyknXG4iKSApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgYXJnQ291bnRlcisrOwotICAgICAgICAgIH0KLQotCi0gICAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLQotCi12b2lkIFJlbW92ZVdoaXRlU3BhY2UoY29uc3QgVEVYVENIQVIqIHBSZXFBcmdzLCBURVhUQ0hBUiogcFJlbW92ZWQpCi17Ci0gIFVJTlQgaSA9IDA7Ci0gIElOVCBrID0gMDsKLSAgVUlOVCBsZW4gPSAoVUlOVClfdGNzbGVuKHBSZXFBcmdzKTsKLQotCi0gIGZvciAoIGkgPSAwOyBpIDwgbGVuOyArK2kgKQotICAgIHsKLQotICAgICAgaWYgKCBwUmVxQXJnc1tpXSAhPSAnICcgKQotICAgICAgICB7Ci0gICAgICAgICAgcFJlbW92ZWRba10gPSBwUmVxQXJnc1tpXTsKLSAgICAgICAgICBrKys7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotSU5UIEdldEFyZ0Zyb21TdHJpbmcoSU5UIGFyZ2MsIFRFWFRDSEFSKiBhcmd2W10sIFRFWFRDSEFSKiBzZWFyY2hfc3RyaW5nLCBURVhUQ0hBUiB0eXBlLCBURVhUQ0hBUiogZm91bmRfc3RyaW5nLCBJTlQqIHN3X3VzZWQgKQotewotICBJTlQgaSA9IDA7Ci0KLSAgZm9yIChpID0gMTsgaSA8IGFyZ2M7ICsraSApIHsKLSAgICBpZiAoICFfdGNzY21wKHNlYXJjaF9zdHJpbmcsIGFyZ3ZbaV0pICkgLyogU3RyaW5ncyBhcmUgZXF1YWwgKi8KLSAgICAgIHsKLSAgICAgICAgaWYgKCB0eXBlID09ICcxJyApIC8qIFN3aXRjaCB3aXRob3V0IGFyZ3VtZW50ICovCi0gICAgICAgIHsKLSAgICAgICAgICBfdGNzbmNweSggZm91bmRfc3RyaW5nLCBfVEVYVCgiMSIpLCAxKTsKLSAgICAgICAgICBzd191c2VkW2ldID0gMTsKLSAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBpID09IChhcmdjIC0gMSkpICAvKiBXZSBoYXZlICVzIG9yICVkIGJ1dCBhcmUgZmluaXNoZWQqLwotICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgIGlmICggX3Rjc2xlbihhcmd2W2krMV0pID4gQ01ETF9NQVhfU1RSTEVOICkKLSAgICAgICAgICB7Ci0jaWZkZWYgX1VOSUNPREUKLSAgICAgICAgICAgIF9mdHByaW50ZiAoc3RkZXJyLF9URVhUKCJXYXJuaW5nOiBJZ25vcmluZyBhcmd1bWVudCBmb3Igc3dpdGNoICclbHMnLiAiKSwgc2VhcmNoX3N0cmluZyApOwotI2Vsc2UKLSAgICAgICAgICAgIF9mdHByaW50ZiAoc3RkZXJyLF9URVhUKCJXYXJuaW5nOiBJZ25vcmluZyBhcmd1bWVudCBmb3Igc3dpdGNoICclcycuICIpLCBzZWFyY2hfc3RyaW5nICk7Ci0jZW5kaWYKLSAgICAgICAgICAgIF9mdHByaW50ZiAoc3RkZXJyLF9URVhUKCJBcmd1bWVudCBpcyB0b28gTE9ORy5cbiIpICk7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIF90Y3NuY3B5KCBmb3VuZF9zdHJpbmcsIGFyZ3ZbaSsxXSwgQ01ETF9NQVhfU1RSTEVOKTsKLSAgICAgICAgICBzd191c2VkW2ldID0gMTsKLSAgICAgICAgICBzd191c2VkW2krMV0gPSAxOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotCi1JTlQgQ2hlY2tBcmcoVEVYVENIQVIqIGFyZywgVEVYVENIQVIqIHN0ciwgVUlOVCBudW1BcmdzLCBURVhUQ0hBUiB0eXBlLCBURVhUQ0hBUiogY3VyX3N0cikKLXsKLSAgVUlOVCBpID0gMDsKLQotICAvKiBObyBhcmd1bWVudCBnaXZlbi0+IHJldHVybiAqLwotICBpZiAoYXJnWzBdID09ICdcMCcpCi0gICAgcmV0dXJuIDA7Ci0KLQotICAvKiBDaGVjayBpZiBhcmcgaXMgc3dpdGNoICovCi0gIGZvciAoIGkgPSAwOyBpIDwgbnVtQXJnczsgKytpICkKLSAgICB7Ci0gICAgICBpZiAoIV90Y3NjbXAoYXJnLCAmKHN0cltpKkNNRExfTUFYX0FSR0NdKSkpCi0gICAgICAgIHsKLSNpZmRlZiBfVU5JQ09ERQotICAgICAgICAgIF9mdHByaW50ZihzdGRlcnIsIF9URVhUKCJcblxuRXJyb3I6IEFyZ3VtZW50ICclbHMnIGZvciBzd2l0Y2ggJyVscycgaXMgbm90IHZhbGlkIFxuIiApLCBhcmcsIGN1cl9zdHIgKTsKLSNlbHNlCi0gICAgICAgICAgX2Z0cHJpbnRmKHN0ZGVyciwgX1RFWFQoIlxuXG5FcnJvcjogQXJndW1lbnQgJyVzJyBmb3Igc3dpdGNoICclcycgaXMgbm90IHZhbGlkIFxuIiApLCBhcmcsIGN1cl9zdHIgKTsKLSNlbmRpZgotICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0KLSAgICB9Ci0gIC8qIENoZWNrIGlmIHR5cGUgaXMgJWQgYnV0IGEgc3RyaW5nIGlzIGdpdmVuICovCi0KLSAgZm9yICggaSA9IDA7IGkgPCBfdGNzbGVuKGFyZyk7ICsraSApCi0gICAgewotICAgICAgaWYgKCAodHlwZSA9PSAnZCcpICYmICFfaXN0ZGlnaXQoYXJnW2ldKSAmJiBhcmdbaV0gIT0gJ3gnICYmIGFyZ1tpXSAhPSAnLScpCi0gICAgICAgIHsKLSNpZmRlZiBfVU5JQ09ERQotICAgICAgICAgIF9mdHByaW50ZihzdGRlcnIsIF9URVhUKCJcblxuRXJyb3I6IEFyZ3VtZW50ICclbHMnIGZvciBzd2l0Y2ggJyVscycgaXMgbm90IGEgdmFsaWQgbnVtYmVyLlxuIiApLCBhcmcsIGN1cl9zdHIpOwotI2Vsc2UKLSAgICAgICAgICBfZnRwcmludGYoc3RkZXJyLCBfVEVYVCgiXG5cbkVycm9yOiBBcmd1bWVudCAnJXMnIGZvciBzd2l0Y2ggJyVzJyBpcyBub3QgYSB2YWxpZCBudW1iZXIuXG4iICksIGFyZywgY3VyX3N0cik7Ci0jZW5kaWYKLSAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gIHJldHVybiAwOwotfQotCi0KLUlOVCBDaGVja0ZvclVudXNlZFN3aXRjaGVzKElOVCBhcmdjLCAvKlRFWFRDSEFSKiBhcmd2W10sKi8gSU5UKiBzd2l0Y2hlc191c2VkKQotewotICBJTlQgaSA9IDA7Ci0KLSAgZm9yKCBpID0gMTsgaSA8IGFyZ2M7ICsraSApCi0gICAgewotICAgICAgaWYgKCAhc3dpdGNoZXNfdXNlZFtpXSApCi0gICAgICAgIHsKLSAgICAgICAgICArK2k7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotCi1zdGF0aWMgY2hhciBsaW5lW0NNRExfTUFYX1NUUkxFTipDTURMX01BWF9BUkdDXTsKLXN0YXRpYyBjaGFyICphcmd2X3B0cltDTURMX01BWF9BUkdDXTsKLSNpZmRlZiBDTURGSUxFX1BSRUZJWAotc3RhdGljIGNoYXIgdG1wWzI1Nl07IC8qIHRoaXMgYXJyYXkgaXMgdXNlZCB0byBzdG9yZSB0aGUgcHJlZml4IGFuZCB0aGUgZmlsZXBhdGgvbmFtZSAqLwotI2VuZGlmCi0KLWludCBJSVNfUHJvY2Vzc0NtZGxMaXN0KGNvbnN0IGNoYXIqIHBhcmFtX2ZpbGVuYW1lLCBpbnQgKCpwRnVuY3Rpb24pKGludCwgVEVYVENIQVIqKikpCi17Ci0gIC8qIHN0YXRpYyB0byByZWR1Y2UgcmVxdWlyZWQgc3RhY2sgc2l6ZSAqLwotCi0gIEZES0ZJTEUgKmNvbmZpZ19mcDsKLSAgaW50IGFyZ2M7Ci0gIGNoYXIgKmxpbmVfcHRyOwotCi0jaWZkZWYgQ01ERklMRV9QUkVGSVgKLSAgRkRLc3RyY3B5KHRtcCwgQ01ERklMRV9QUkVGSVgpOwotICBGREtzdHJjcHkodG1wK0ZES3N0cmxlbihDTURGSUxFX1BSRUZJWCksIHBhcmFtX2ZpbGVuYW1lKTsKLSAgLyogT3BlbiB0aGUgZmlsZSB3aXRoIGNvbW1hbmQgbGluZXMgKi8KLSAgY29uZmlnX2ZwID0gRkRLZm9wZW4odG1wLCAiciIpOwotI2Vsc2UKLSAgLyogT3BlbiB0aGUgZmlsZSB3aXRoIGNvbW1hbmQgbGluZXMgKi8KLSAgY29uZmlnX2ZwID0gRkRLZm9wZW4ocGFyYW1fZmlsZW5hbWUsICJyIik7Ci0jZW5kaWYKLQotICBpZihjb25maWdfZnAgPT0gTlVMTCkKLSAgewotI2lmZGVmIENNREZJTEVfUFJFRklYCi0gICAgRkRLcHJpbnRmKCJcbmNvdWxkIG5vdCBvcGVuIGNvbmZpZyBmaWxlICVzIiwgdG1wKTsKLSNlbHNlCi0gICAgRkRLcHJpbnRmKCJcbmNvdWxkIG5vdCBvcGVuIGNvbmZpZyBmaWxlICVzIiwgcGFyYW1fZmlsZW5hbWUpOwotI2VuZGlmCi0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICAvKiBPYnRhaW4gYSBjb21tYW5kIGxpbmUgZnJvbSBjb25maWcgZmlsZSAqLwotICB3aGlsZSAoRkRLZmdldHMobGluZSwgQ01ETF9NQVhfU1RSTEVOKkNNRExfTUFYX0FSR0MsIGNvbmZpZ19mcCkgIT0gTlVMTCkKLSAgewotICAgIGFyZ2MgPSAxOwotCi0gICAgLyogRWF0IFxuICovCi0gICAgbGluZV9wdHIgPSAgKGNoYXIqKUZES3N0cmNocihsaW5lLCAnXG4nKTsKLSAgICBpZiAobGluZV9wdHIgIT0gTlVMTCkKLSAgICAgICpsaW5lX3B0ciA9ICcgJzsKLQotICAgIGxpbmVfcHRyID0gbGluZTsKLQotICAgIC8qIFNjYW4gdGhlIGxpbmUgYW5kIHB1dCB0aGUgY29tbWFuZCBsaW5lIHBhcmFtcyBpbnRvIGFyZ3YgKi8KLSAgICBkbyB7Ci0gICAgICAvKiBTa2lwIGNvbnNlY3V0aXZlIGJsYW5rcy4gKi8KLSAgICAgIHdoaWxlICgqbGluZV9wdHIgPT0gJyAnICYmIGxpbmVfcHRyIDwgbGluZStDTURMX01BWF9TVFJMRU4pCi0gICAgICAgIGxpbmVfcHRyKys7Ci0gICAgICAvKiBBc3NpZ24gYXJndW1lbnQuICovCi0gICAgICBhcmd2X3B0clthcmdjXSA9IGxpbmVfcHRyOwotICAgICAgLyogR2V0IHBvaW50ZXIgdG8gbmV4dCBibGFuay4gKi8KLSAgICAgIGxpbmVfcHRyID0gKGNoYXIqKUZES3N0cmNocihsaW5lX3B0ciwgJyAnKTsKLSAgICAgIC8qICAqLwotICAgICAgaWYgKGxpbmVfcHRyICE9IE5VTEwpIHsKLSAgICAgICAgLyogTnVsbCB0ZXJtaW5hdGUgKi8KLSAgICAgICAgKmxpbmVfcHRyID0gMDsKLSAgICAgICAgLyogU2tpcCBmb3JtZXIgYmxhbmsgKG5vdyBudWxsIGNoYXJhY3RlcikgKi8KLSAgICAgICAgbGluZV9wdHIrKzsKLSAgICAgICAgLyogQWR2YW5jZSBhcmd1bWVudCBjb3VudGVyICovCi0gICAgICB9Ci0gICAgICBhcmdjKys7Ci0gICAgfSB3aGlsZSAoIGxpbmVfcHRyICE9IE5VTEwgJiYgYXJnYyA8IENNRExfTUFYX0FSR0MpOwotCi0gICAgLyogY2FsbCAid291bGQgYmUgbWFpbigpIiAqLwotICAgIGlmIChhcmdjID4gMiAmJiAqYXJndl9wdHJbMV0gIT0gJyMnICYmIEZES3N0cmxlbihhcmd2X3B0clsxXSk+MSkKLSAgICB7Ci0gICAgICBpbnQgcmV0dmFsOwotCi0gICAgICByZXR2YWwgPSAoKnBGdW5jdGlvbikoYXJnYywgYXJndl9wdHIpOwotCi0gICAgICBGREtwcmludGYoIm1haW4gcmV0dXJuZWQgJWRcbiIsIHJldHZhbCk7Ci0gICAgfQotICB9Ci0KLSAgRkRLZmNsb3NlKGNvbmZpZ19mcCk7Ci0gIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9saWJTWVMvc3JjL2NvbnZfc3RyaW5nLmNwcCBiL2xpYlNZUy9zcmMvY29udl9zdHJpbmcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGNiYzgzLi4wMDAwMDAwCi0tLSBhL2xpYlNZUy9zcmMvY29udl9zdHJpbmcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKLQotICAgQXV0aG9yKHMpOgotICAgRGVzY3JpcHRpb246IHN0cmluZyBjb252ZXJzaW9uIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi0jaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKLSNpbmNsdWRlICJjb252X3N0cmluZy5oIgotCi1JTlQgY2hhckJ1ZjJIZXhTdHJpbmcoY2hhciAqc3RyaW5nLCBVQ0hBUiAqY2hhckJ1ZiwgSU5UIGNoYXJCdWZMZW5ndGgpCi17Ci0gIElOVCBpOwotICBVQ0hBUiBjMSwgYzI7Ci0KLSAgLyogc2FuaXR5IGNoZWNrcyAqLwotICAvKiBjaGVjayBhcnJheSBsZW5ndGggKi8KLSAgaWYgKGNoYXJCdWZMZW5ndGggPT0gMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIC8qIGRlZmluZSBoZXggc3RyaW5nIFRhYmxlICovCi0gIFVDSEFSIGhleFN5bWJbMTZdPXsnMCcsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJ2EnLCdiJywnYycsJ2QnLCdlJywnZid9OwotCi0gIC8qIGNhbGN1bGF0ZSBjb3JyZXNwb25kaW5nIGhleCBzdHJpbmcgZnJvbSBjaGFyQnVmZmVyICovCi0gIGZvciAoaT0wO2k8Y2hhckJ1Zkxlbmd0aDtpKyspIHsKLSAgICBjMSA9ICgoY2hhckJ1ZltpXSk+PjQpJjB4MGY7IC8qIHVwcGVyIG5pYmJsZSAqLwotICAgIGMyID0gKGNoYXJCdWZbaV0pJjB4MGY7ICAgICAgLyogbG93ZXIgbmliYmxlICovCi0KLSAgICBzdHJpbmdbaSoyXSAgID0gaGV4U3ltYltjMV07ICAvKiBjb252ZXJ0IHRvIHN0cmluZyAqLwotICAgIHN0cmluZ1tpKjIrMV0gPSBoZXhTeW1iW2MyXTsgIC8qIGNvbnZlcnQgdG8gc3RyaW5nICovCi0gIH0KLQotICAvKiB0ZXJtaW5hdGUgc3RyaW5nICovCi0gIHN0cmluZ1tjaGFyQnVmTGVuZ3RoPDwxXT0nXDAnOwotCi0gIHJldHVybiAwOwotCi19Ci0KLUlOVCBoZXhTdHJpbmcyQ2hhckJ1Zihjb25zdCBjaGFyICpzdHJpbmcsIFVDSEFSICpjaGFyQnVmLCBVSU5UIGNoYXJCdWZMZW5ndGgpCi17Ci0gIFVJTlQgaSwgayA9IDA7Ci0gIFVDSEFSIGhOaWJibGUsIGxOaWJibGU7Ci0KLSAgLyogc2FuaXR5IGNoZWNrcyAqLwotICBpZiAoc3RyaW5nWzBdID09ICdcMCcpIHsKLSAgICByZXR1cm4gLTE7IC8qIGludmFsaWQgc3RyaW5nIHNpemUgKi8KLSAgfQotCi0gIGlmIChjaGFyQnVmTGVuZ3RoPD0wKXsKLSAgICByZXR1cm4gLTI7IC8qIGludmFsaWQgYnVmZmVyIHNpemUgKi8KLSAgfQotCi0gIC8qIGNvbnZlcnQgdG8gaGV4IGNoYXJhY3RlcnMgdG8gY29ycmVzcG9uZGluZyA4Yml0IHZhbHVlICovCi0gIGZvciAoaT0wOyhzdHJpbmdbaV0hPSdcMCcpJiYoKGk+PjEpPGNoYXJCdWZMZW5ndGgpO2krPTIpIHsKLSAgICBrID0gaT4+MTsKLSAgICBoTmliYmxlID0gaGV4Q2hhcjJEZWMoc3RyaW5nW2ldKTsKLSAgICBsTmliYmxlID0gaGV4Q2hhcjJEZWMoc3RyaW5nW2krMV0pOwotICAgIGlmICgoaE5pYmJsZSA9PSAxNikgfHwgKGxOaWJibGUgPT0gMTYpKSB7Ci0gICAgICByZXR1cm4gLTM7IC8qIGludmFsaWQgY2hhcmFjdGVyICovCi0gICAgfQotICAgIGNoYXJCdWZba10gPSAoKGhOaWJibGU8PDQpJjB4ZjApICsgbE5pYmJsZTsKLSAgfQotCi0gIC8qIGNoZWNrIGlmIGxhc3QgY2hhcmFjdGVyIHdhcyBzdHJpbmcgdGVybWluYXRvciAqLwotICBpZiAoKHN0cmluZ1tpLTJdIT0wKSAmJiAoc3RyaW5nW2ldIT0wKSkgewotICAgIHJldHVybiAtMTsgLyogaW52YWxpZCBzdHJpbmcgc2l6ZSAqLwotICB9Ci0KLSAgLyogZmlsbCBjaGFyQnVmZmVyIHdpdGggemVyb3MgKi8KLSAgZm9yIChpPWsrMTtpPGNoYXJCdWZMZW5ndGg7aSsrKSB7Ci0gICAgY2hhckJ1ZltpXSA9IDA7Ci0gIH0KLQotICByZXR1cm4gMDsKLQotfQotCi1VQ0hBUiBoZXhDaGFyMkRlYyhjb25zdCBjaGFyIGMpCi17Ci0gIElOVCByID0gMDsKLSAgaWYgKChjID49ICcwJykgJiYgKGMgPD0gJzknKSkKLSAgICByID0gYy0nMCc7Ci0gIGVsc2UgaWYgKChjID49ICdhJykgJiYgKGMgPD0gJ2YnKSkKLSAgICByID0gYy0nYScrMTA7Ci0gIGVsc2UgaWYgKChjID49ICdBJykgJiYgKGMgPD0gJ0YnKSkKLSAgICByID0gYy0nQScrMTA7Ci0gIGVsc2UKLSAgICByID0gMTY7IC8qIGludmFsaWQgaGV4IGNoYXJhY3RlciAqLwotCi0gIHJldHVybiAoVUNIQVIpcjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGliU1lTL3NyYy9nZW5lcmljU3Rkcy5jcHAgYi9saWJTWVMvc3JjL2dlbmVyaWNTdGRzLmNwcAppbmRleCA4OWM0MjJjLi5mOThkMGE5IDEwMDY0NAotLS0gYS9saWJTWVMvc3JjL2dlbmVyaWNTdGRzLmNwcAorKysgYi9saWJTWVMvc3JjL2dlbmVyaWNTdGRzLmNwcApAQCAtMSw3NCArMSw4NSBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK8KpIENvcHlyaWdodCAgMTk5NSAtIDIwMTggRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEbDtnJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuCitGb3JzY2h1bmcgZS5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlCit0aGF0IGltcGxlbWVudHMgdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uIFRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uCithIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCiAKLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgorQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQKK2dlbmVyYWwgcGVyY2VwdHVhbCBhdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nCitmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieSBpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkKK2RlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQgb2YgdGhlIE1QRUcKK3NwZWNpZmljYXRpb25zLgogCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCitQYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nCit0aG9zZSBvZiBGcmF1bmhvZmVyKSBtYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nCisod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycyBpbmRpdmlkdWFsbHkgZm9yCit0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQKK3dpdGggdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mCitBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlIHRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yCitkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgbWF5CithbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UKK2xpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCiAKLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgogCiAyLiAgICBDT1BZUklHSFQgTElDRU5TRQogCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCithcmUgcGVybWl0dGVkIHdpdGhvdXQgcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91CitzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZgordGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KIAotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24KK2FuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKK3lvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLiBZb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mCitjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgogbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgogCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitUaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAKLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgorWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZQordGhlIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCiAKLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgogCiAzLiAgICBOTyBQQVRFTlQgTElDRU5TRQogCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgogCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KK1lvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IKK3B1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQgYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgogCiA0LiAgICBESVNDTEFJTUVSCiAKLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQKK2hvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKK0NPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksCitvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZQorZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLCBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sCitob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAorbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZgordGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KIAogNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgogCkBAIC03OSwyNyArOTAsMzAgQEAKIAogd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQogYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFN5c3RlbSBpbnRlZ3JhdGlvbiBsaWJyYXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgIEF1dGhvcihzKToKKwogICAgRGVzY3JpcHRpb246IC0gR2VuZXJpYyBtZW1vcnksIHN0ZGlvLCBzdHJpbmcsIGV0Yy4gZnVuY3Rpb24gd3JhcHBlcnMgb3IKLSAgICAgICAgICAgICAgICAgIGJ1aWx0aW5zLgorICAgICAgICAgICAgICAgIGJ1aWx0aW5zLgogICAgICAgICAgICAgICAgIC0gT1MgZGVwZW5kYW50IGZ1bmN0aW9uIHdyYXBwZXJzLgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZuZGVmIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCiAjZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCisjZW5kaWYKIAotI2luY2x1ZGUgPG1hdGguaD4KKyNkZWZpbmUgX19HRU5FUklDU1REU19DUFBfXwogCiAjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKIAogLyogbGlicmFyeSBpbmZvICovCi0jZGVmaW5lIFNZU19MSUJfVkwwIDEKLSNkZWZpbmUgU1lTX0xJQl9WTDEgMwotI2RlZmluZSBTWVNfTElCX1ZMMiA4CisjZGVmaW5lIFNZU19MSUJfVkwwIDIKKyNkZWZpbmUgU1lTX0xJQl9WTDEgMAorI2RlZmluZSBTWVNfTElCX1ZMMiAwCiAjZGVmaW5lIFNZU19MSUJfVElUTEUgIlN5c3RlbSBJbnRlZ3JhdGlvbiBMaWJyYXJ5IgogI2lmZGVmIF9fQU5EUk9JRF9fCiAjZGVmaW5lIFNZU19MSUJfQlVJTERfREFURSAiIgpAQCAtMTA5LDY5ICsxMjMsNDcgQEAKICNkZWZpbmUgU1lTX0xJQl9CVUlMRF9USU1FIF9fVElNRV9fCiAjZW5kaWYKIAotICAjaW5jbHVkZSA8c3RkbGliLmg+Ci0gICNpbmNsdWRlIDxzdGRpby5oPgotICAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0gICAgI2luY2x1ZGUgPHN0ZGFyZy5oPgotCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogbWVtb3J5IGFsbG9jYXRpb24gbW9uaXRvcmluZyB2YXJpYWJsZXMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogLyogSW5jbHVkZSBPUy9TeXN0ZW0gc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zLiAqLwotI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfXykgLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwotICAjaW5jbHVkZSAibGludXgvZ2VuZXJpY1N0ZHNfbGludXguY3BwIgotI2VuZGlmCiAKLQotI2lmICEoZGVmaW5lZChVU0VfQlVJTFRJTl9TVFJJTkdfRlVOQ1RJT05TKSB8fCBkZWZpbmVkKF9fU1lNQklBTjMyX18pKQogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKLSNpZm5kZWYgRlVOQ1RJT05fRkRLcHJpbnRmCi12b2lkICBGREtwcmludGYoIGNvbnN0IGNoYXIqIHN6Rm10LCAuLi4pICAgIHsKK3ZvaWQgRkRLcHJpbnRmKGNvbnN0IGNoYXIgKnN6Rm10LCAuLi4pIHsKICAgdmFfbGlzdCBhcDsKICAgdmFfc3RhcnQoYXAsIHN6Rm10KTsKICAgdnByaW50ZihzekZtdCwgYXApOwogICB2YV9lbmQoYXApOwotI2lmZGVmIEFSQ0hfV0FfRkxVU0hfQ09OU09MRQotICBmZmx1c2goc3Rkb3V0KTsKLSNlbmRpZgogfQotI2VuZGlmCiAKLSNpZm5kZWYgRlVOQ1RJT05fRkRLcHJpbnRmRXJyCi12b2lkICBGREtwcmludGZFcnIoIGNvbnN0IGNoYXIqIHN6Rm10LCAuLi4pIHsKK3ZvaWQgRkRLcHJpbnRmRXJyKGNvbnN0IGNoYXIgKnN6Rm10LCAuLi4pIHsKICAgdmFfbGlzdCBhcDsKICAgdmFfc3RhcnQoYXAsIHN6Rm10KTsKLSNpZiBkZWZpbmVkKEFSQ0hfV0FfU0xPV0NPTikKLSAgdnByaW50ZihzekZtdCwgYXApOwotI2Vsc2UKICAgdmZwcmludGYoc3RkZXJyLCBzekZtdCwgYXApOwotI2VuZGlmCiAgIHZhX2VuZChhcCk7Ci0jaWZkZWYgQVJDSF9XQV9GTFVTSF9DT05TT0xFCi0gIGZmbHVzaChzdGRlcnIpOwotI2VuZGlmCiB9Ci0jZW5kaWYKIAogaW50IEZES2dldGNoYXIodm9pZCkgeyByZXR1cm4gZ2V0Y2hhcigpOyB9CiAKLUlOVCAgRkRLZnByaW50ZihGREtGSUxFICAqc3RyZWFtLCAgY29uc3QgIGNoYXIgKmZvcm1hdCwgLi4uKSB7CitJTlQgRkRLZnByaW50ZihGREtGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CiAgIElOVCBjaGFycyA9IDA7CiAgIHZhX2xpc3QgYXA7CiAgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOwotICBjaGFycyArPSB2ZnByaW50ZigoRklMRSopc3RyZWFtLCBmb3JtYXQsIGFwKTsKKyAgY2hhcnMgKz0gdmZwcmludGYoKEZJTEUgKilzdHJlYW0sIGZvcm1hdCwgYXApOwogICB2YV9lbmQoYXApOwogICByZXR1cm4gY2hhcnM7CiB9CiAKLSNpZm5kZWYgRlVOQ1RJT05fRkRLc3ByaW50ZgotSU5UICBGREtzcHJpbnRmKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIHsKK0lOVCBGREtzcHJpbnRmKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIHsKICAgSU5UIGNoYXJzID0gMDsKICAgdmFfbGlzdCBhcDsKICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CkBAIC0xNzksMjU1ICsxNzEsMTk3IEBACiAgIHZhX2VuZChhcCk7CiAgIHJldHVybiBjaGFyczsKIH0KLSNlbmRpZgotCi0jZWxzZQotCi12b2lkIEZES3ByaW50ZiggY29uc3QgY2hhciogc3pGbXQsIC4uLikgeyAvKiBzdHViISAqLzsgfQotdm9pZCBGREtwcmludGZFcnIoIGNvbnN0IGNoYXIqIHN6Rm10LCAuLi4pIHsgLyogc3R1YiEgKi87IH0KLUlOVCAgRkRLZnByaW50ZihGSUxFICAqc3RyZWFtLCAgY29uc3QgIGNoYXIgKmZvcm1hdCwgLi4uKSB7IC8qc3R1YiAhICovOyB9Ci1JTlQgIEZES3NwcmludGYoY2hhciAqc3RyLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgeyAvKiBzdHViISAqLzsgfQotCi0jZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotY29uc3QgY2hhciAqRkRLc3RyY2hyKGNvbnN0IGNoYXIgKnMsIElOVCBjKSAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gc3RyY2hyKHMsIGMpOyB9Ci1jb25zdCBjaGFyICpGREtzdHJzdHIoY29uc3QgY2hhciAqaGF5c3RhY2ssIGNvbnN0IGNoYXIgKm5lZWRsZSkgICB7IHJldHVybiBzdHJzdHIoaGF5c3RhY2ssIG5lZWRsZSk7IH0KLSNpZm5kZWYgRlVOQ1RJT05fRkRLc3RyY3B5Ci1jaGFyICpGREtzdHJjcHkoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKSAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBzdHJjcHkoZGVzdCwgc3JjKTsgfQotI2VuZGlmCi1jaGFyICpGREtzdHJuY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgVUlOVCBuKSAgICAgICAgICAgICB7IHJldHVybiBzdHJuY3B5KGRlc3QsIHNyYywgbik7IH0KK2NoYXIgKkZES3N0cmNocihjaGFyICpzLCBJTlQgYykgeyByZXR1cm4gc3RyY2hyKHMsIGMpOyB9Citjb25zdCBjaGFyICpGREtzdHJzdHIoY29uc3QgY2hhciAqaGF5c3RhY2ssIGNvbnN0IGNoYXIgKm5lZWRsZSkgeworICByZXR1cm4gc3Ryc3RyKGhheXN0YWNrLCBuZWVkbGUpOworfQorY2hhciAqRkRLc3RyY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykgeyByZXR1cm4gc3RyY3B5KGRlc3QsIHNyYyk7IH0KK2NoYXIgKkZES3N0cm5jcHkoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjLCBVSU5UIG4pIHsKKyAgcmV0dXJuIHN0cm5jcHkoZGVzdCwgc3JjLCBuKTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIERZTkFNSUMgTUVNT1JZIG1hbmFnZW1lbnQgKGhlYXApCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBGVU5DVElPTl9GREtjYWxsb2MKLXZvaWQgKkZES2NhbGxvYyAoY29uc3QgVUlOVCBuLCBjb25zdCBVSU5UIHNpemUpCi17Ci0gIHZvaWQqIHB0cjsKK3ZvaWQgKkZES2NhbGxvYyhjb25zdCBVSU5UIG4sIGNvbnN0IFVJTlQgc2l6ZSkgeworICB2b2lkICpwdHI7CiAKICAgcHRyID0gY2FsbG9jKG4sIHNpemUpOwogCiAgIHJldHVybiBwdHI7CiB9Ci0jZW5kaWYKIAotI2lmbmRlZiBGVU5DVElPTl9GREttYWxsb2MKLXZvaWQgKkZES21hbGxvYyAoY29uc3QgVUlOVCBzaXplKQotewotICB2b2lkKiBwdHI7Cit2b2lkICpGREttYWxsb2MoY29uc3QgVUlOVCBzaXplKSB7CisgIHZvaWQgKnB0cjsKIAogICBwdHIgPSBtYWxsb2Moc2l6ZSk7CiAKICAgcmV0dXJuIHB0cjsKIH0KLSNlbmRpZgogCi0jaWZuZGVmIEZVTkNUSU9OX0ZES2ZyZWUKLXZvaWQgIEZES2ZyZWUgKHZvaWQgKnB0cikKLXsKLSAgLyogRkRLcHJpbnRmKCJmLCBoZWFwU2l6ZTogJWRcbiIsIGhlYXBTaXplQ3Vycik7ICovCi0gIGZyZWUoKElOVCopcHRyKTsKLX0KLSNlbmRpZgordm9pZCBGREtmcmVlKHZvaWQgKnB0cikgeyBmcmVlKChJTlQgKilwdHIpOyB9CiAKLSNpZm5kZWYgRlVOQ1RJT05fRkRLYWFsbG9jCi12b2lkICpGREthYWxsb2MoY29uc3QgVUlOVCBzaXplLCBjb25zdCBVSU5UIGFsaWdubWVudCkKLXsKLSAgdm9pZCAqYWRkciwgKnJlc3VsdD1OVUxMOwotICBhZGRyID0gRkRLY2FsbG9jKDEsIHNpemUgKyBhbGlnbm1lbnQgKyBzaXplb2Yodm9pZCopKTsgICAgICAgICAgICAgICAvKiBNYWxsb2MgYW5kIGNsZWFyIG1lbW9yeS4gICAgICAgICAqLwordm9pZCAqRkRLYWFsbG9jKGNvbnN0IFVJTlQgc2l6ZSwgY29uc3QgVUlOVCBhbGlnbm1lbnQpIHsKKyAgdm9pZCAqYWRkciwgKnJlc3VsdCA9IE5VTEw7CisgIGFkZHIgPSBGREtjYWxsb2MoMSwgc2l6ZSArIGFsaWdubWVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UKXNpemVvZih2b2lkICopKTsgLyogTWFsbG9jIGFuZCBjbGVhciBtZW1vcnkuICovCiAKLSAgaWYgKGFkZHIhPU5VTEwpCi0gIHsKLSAgICByZXN1bHQgPSBBTElHTl9QVFIoKHVuc2lnbmVkIGNoYXIqKWFkZHIgKyBzaXplb2Yodm9pZCopKTsgICAgLyogR2V0IGFsaWduZWQgbWVtb3J5IGJhc2UgYWRkcmVzcy4gKi8KLSAgICAqKCgodm9pZCoqKXJlc3VsdCkgLSAxKSA9IGFkZHI7ICAgICAgICAgICAgICAgIC8qIFNhdmUgbWFsbG9jJ2VkIG1lbW9yeSBwb2ludGVyLiAgICovCisgIGlmIChhZGRyICE9IE5VTEwpIHsKKyAgICByZXN1bHQgPSBBTElHTl9QVFIoKHVuc2lnbmVkIGNoYXIgKilhZGRyICsKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZvaWQgKikpOyAvKiBHZXQgYWxpZ25lZCBtZW1vcnkgYmFzZSBhZGRyZXNzLiAqLworICAgICooKCh2b2lkICoqKXJlc3VsdCkgLSAxKSA9IGFkZHI7ICAgIC8qIFNhdmUgbWFsbG9jJ2VkIG1lbW9yeSBwb2ludGVyLiAgICovCisgICAgQ19BTExPQ19BTElHTkVEX1JFR0lTVEVSKHJlc3VsdCwgc2l6ZSk7CiAgIH0KIAotICByZXR1cm4gcmVzdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiBhbGlnbmVkIGFkZHJlc3MuICAgICAgICAgICovCisgIHJldHVybiByZXN1bHQ7IC8qIFJldHVybiBhbGlnbmVkIGFkZHJlc3MuICAgICAgICAgICovCiB9Ci0jZW5kaWYKIAotI2lmbmRlZiBGVU5DVElPTl9GREthZnJlZQotdm9pZCAgRkRLYWZyZWUgKHZvaWQgKnB0cikKLXsKK3ZvaWQgRkRLYWZyZWUodm9pZCAqcHRyKSB7CiAgIHZvaWQgKmFkZHI7Ci0gIGFkZHIgPSAqKCgodm9pZCoqKXB0ciktMSk7IC8qIEdldCBwb2ludGVyIHRvIG1hbGxvYydlZCBtZW1vcnkuICovCi0gIEZES2ZyZWUoYWRkcik7ICAgICAgICAgICAgICAgIC8qIEZyZWUgbWFsbG9jJ2VkIG1lbW9yeSBhcmVhLiAgICAgICovCisgIGFkZHIgPSAqKCgodm9pZCAqKilwdHIpIC0gMSk7IC8qIEdldCBwb2ludGVyIHRvIG1hbGxvYydlZCBtZW1vcnkuICovCisKKyAgQ19BTExPQ19BTElHTkVEX1VOUkVHSVNURVIocHRyKTsKKworICBGREtmcmVlKGFkZHIpOyAvKiBGcmVlIG1hbGxvYydlZCBtZW1vcnkgYXJlYS4gICAgICAqLwogfQotI2VuZGlmCi0KLQotI2lmbmRlZiBGVU5DVElPTl9GREtjYWxsb2NfTAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgogICogREFUQSBNRU1PUlkgTDEvTDIgKGZhbGxiYWNrKQogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLQotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgogICogRkRLY2FsbG9jX0wKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCAqRkRLY2FsbG9jX0woY29uc3QgVUlOVCBkaW0sIGNvbnN0IFVJTlQgc2l6ZSwgTUVNT1JZX1NFQ1RJT04gcykKLXsKLSAgaW50IGFfc2l6ZTsKLQotICBpZiAocyA9PSBTRUNUX0RBVEFfRVhURVJOKQotICAgIGdvdG8gZmFsbGJhY2s7Ci0KLSAgYV9zaXplID0gKChkaW0qc2l6ZSszKSYweGZmZmZmZmZjKTsgLyogZm9yY2UgNCBieXRlIGFsaWdubWVudCAoMTExMSAuLi4uIDExMTEgMTEwMCkgKi8KLQotCi0KLQotCi0gIC8vcHJpbnRmKCJXYXJuaW5nLCBvdXQgb2YgaW50ZXJuYWwgbWVtb3J5XG4iKTsKLQotZmFsbGJhY2s6Cit2b2lkICpGREtjYWxsb2NfTChjb25zdCBVSU5UIGRpbSwgY29uc3QgVUlOVCBzaXplLCBNRU1PUllfU0VDVElPTiBzKSB7CiAgIHJldHVybiBGREtjYWxsb2MoZGltLCBzaXplKTsKIH0KLSNlbmRpZiAvKiBGVU5DVElPTl9GREtjYWxsb2NfTCAqLwogCi0jaWZuZGVmIEZVTkNUSU9OX0ZES2ZyZWVfTAotdm9pZCAgRkRLZnJlZV9MICh2b2lkICpwKQotewordm9pZCBGREtmcmVlX0wodm9pZCAqcCkgeyBGREtmcmVlKHApOyB9CiAKLSAgICBGREtmcmVlKHApOwotfQotI2VuZGlmIC8qIEZVTkNUSU9OX0ZES2ZyZWVfTCAqLwordm9pZCAqRkRLYWFsbG9jX0woY29uc3QgVUlOVCBzaXplLCBjb25zdCBVSU5UIGFsaWdubWVudCwgTUVNT1JZX1NFQ1RJT04gcykgeworICB2b2lkICphZGRyLCAqcmVzdWx0ID0gTlVMTDsKKyAgYWRkciA9IEZES2NhbGxvY19MKDEsIHNpemUgKyBhbGlnbm1lbnQgKyAoVUlOVClzaXplb2Yodm9pZCAqKSwKKyAgICAgICAgICAgICAgICAgICAgIHMpOyAvKiBNYWxsb2MgYW5kIGNsZWFyIG1lbW9yeS4gICAgICAgICAqLwogCi0jaWZuZGVmIEZVTkNUSU9OX0ZES2FhbGxvY19MCi12b2lkICpGREthYWxsb2NfTChjb25zdCBVSU5UIHNpemUsIGNvbnN0IFVJTlQgYWxpZ25tZW50LCBNRU1PUllfU0VDVElPTiBzKQotewotICB2b2lkICphZGRyLCAqcmVzdWx0PU5VTEw7Ci0gIGFkZHIgPSBGREtjYWxsb2NfTCgxLCBzaXplICsgYWxpZ25tZW50ICsgc2l6ZW9mKHZvaWQqKSwgcyk7ICAgICAgIC8qIE1hbGxvYyBhbmQgY2xlYXIgbWVtb3J5LiAgICAgICAgICovCi0KLSAgaWYgKGFkZHIhPU5VTEwpCi0gIHsKLSAgICByZXN1bHQgPSBBTElHTl9QVFIoKHVuc2lnbmVkIGNoYXIgKilhZGRyICsgc2l6ZW9mKHZvaWQqKSk7ICAgIC8qIEdldCBhbGlnbmVkIG1lbW9yeSBiYXNlIGFkZHJlc3MuICovCi0gICAgKigoKHZvaWQqKilyZXN1bHQpIC0gMSkgPSBhZGRyOyAgICAgICAgICAgICAgICAvKiBTYXZlIG1hbGxvYydlZCBtZW1vcnkgcG9pbnRlci4gICAqLworICBpZiAoYWRkciAhPSBOVUxMKSB7CisgICAgcmVzdWx0ID0gQUxJR05fUFRSKCh1bnNpZ25lZCBjaGFyICopYWRkciArCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih2b2lkICopKTsgLyogR2V0IGFsaWduZWQgbWVtb3J5IGJhc2UgYWRkcmVzcy4gKi8KKyAgICAqKCgodm9pZCAqKilyZXN1bHQpIC0gMSkgPSBhZGRyOyAgICAvKiBTYXZlIG1hbGxvYydlZCBtZW1vcnkgcG9pbnRlci4gICAqLworICAgIENfQUxMT0NfQUxJR05FRF9SRUdJU1RFUihyZXN1bHQsIHNpemUpOwogICB9CiAKLSAgcmV0dXJuIHJlc3VsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gYWxpZ25lZCBhZGRyZXNzLiAgICAgICAgICAqLworICByZXR1cm4gcmVzdWx0OyAvKiBSZXR1cm4gYWxpZ25lZCBhZGRyZXNzLiAgICAgICAgICAqLwogfQotI2VuZGlmCiAKLSNpZm5kZWYgRlVOQ1RJT05fRkRLYWZyZWVfTAotdm9pZCAgRkRLYWZyZWVfTCAodm9pZCAqcHRyKQotewordm9pZCBGREthZnJlZV9MKHZvaWQgKnB0cikgewogICB2b2lkICphZGRyOwogCi0gIGFkZHIgPSAqKCgodm9pZCoqKXB0ciktMSk7IC8qIEdldCBwb2ludGVyIHRvIG1hbGxvYydlZCBtZW1vcnkuICovCi0gIEZES2ZyZWVfTChhZGRyKTsgICAgICAgICAgICAgICAgLyogRnJlZSBtYWxsb2MnZWQgbWVtb3J5IGFyZWEuICAgICAgKi8KKyAgYWRkciA9ICooKCh2b2lkICoqKXB0cikgLSAxKTsgLyogR2V0IHBvaW50ZXIgdG8gbWFsbG9jJ2VkIG1lbW9yeS4gKi8KKworICBDX0FMTE9DX0FMSUdORURfVU5SRUdJU1RFUihwdHIpOworCisgIEZES2ZyZWVfTChhZGRyKTsgLyogRnJlZSBtYWxsb2MnZWQgbWVtb3J5IGFyZWEuICAgICAgKi8KIH0KLSNlbmRpZgotCi0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEZVTkNUSU9OOiAgICBGREttZW1jcHkKICAqIERFU0NSSVBUSU9OOiAtIGNvcGllcyBtZW1vcnkgZnJvbSAic3JjIiB0byAiZHN0IiB3aXRoIGxlbmd0aCAic2l6ZSIgYnl0ZXMKICAqICAgICAgICAgICAgICAtIGNvbXBpbGVkIHdpdGggRkRLX0RFQlVHIHdpbGwgZ2l2ZSB5b3Ugd2FybmluZ3MKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgRkRLbWVtY3B5KHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBjb25zdCBVSU5UIHNpemUpCi17Cit2b2lkIEZES21lbWNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgY29uc3QgVUlOVCBzaXplKSB7CisgIC8qIC0tIGNoZWNrIGZvciBvdmVybGFwcGluZyBtZW1vcnkgYXJlYXMgLS0gKi8KKyAgRkRLX0FTU0VSVCgoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilkc3QgLSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXNyYykgPj0KKyAgICAgICAgICAgICAgICAgKHB0cmRpZmZfdClzaXplIHx8CisgICAgICAgICAgICAgKChjb25zdCB1bnNpZ25lZCBjaGFyICopc3JjIC0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilkc3QpID49CisgICAgICAgICAgICAgICAgIChwdHJkaWZmX3Qpc2l6ZSk7CiAKICAgLyogZG8gdGhlIGNvcHkgKi8KICAgbWVtY3B5KGRzdCwgc3JjLCBzaXplKTsKIH0KIAotdm9pZCBGREttZW1tb3ZlKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBjb25zdCBVSU5UIHNpemUpICAgICB7IG1lbW1vdmUoZHN0LCBzcmMsIHNpemUpOyB9Ci12b2lkIEZES21lbXNldCh2b2lkICptZW1QdHIsIGNvbnN0IElOVCB2YWx1ZSwgY29uc3QgVUlOVCBzaXplKSAgIHsgbWVtc2V0KG1lbVB0ciwgdmFsdWUsIHNpemUpOyB9Ci12b2lkIEZES21lbWNsZWFyKHZvaWQgKm1lbVB0ciwgY29uc3QgVUlOVCBzaXplKSAgICAgICAgICAgICAgICAgIHsgRkRLbWVtc2V0KG1lbVB0ciwwLHNpemUpOyB9Ci1VSU5UIEZES3N0cmxlbihjb25zdCBjaGFyICpzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChVSU5UKXN0cmxlbihzKTsgfQordm9pZCBGREttZW1tb3ZlKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBjb25zdCBVSU5UIHNpemUpIHsKKyAgbWVtbW92ZShkc3QsIHNyYywgc2l6ZSk7Cit9CisKK3ZvaWQgRkRLbWVtc2V0KHZvaWQgKm1lbVB0ciwgY29uc3QgSU5UIHZhbHVlLCBjb25zdCBVSU5UIHNpemUpIHsKKyAgbWVtc2V0KG1lbVB0ciwgdmFsdWUsIHNpemUpOworfQorCit2b2lkIEZES21lbWNsZWFyKHZvaWQgKm1lbVB0ciwgY29uc3QgVUlOVCBzaXplKSB7IEZES21lbXNldChtZW1QdHIsIDAsIHNpemUpOyB9CisKK1VJTlQgRkRLc3RybGVuKGNvbnN0IGNoYXIgKnMpIHsgcmV0dXJuIChVSU5UKXN0cmxlbihzKTsgfQogCiAvKiBDb21wYXJlIGZ1bmN0aW9uIHdyYXBwZXJzICovCi1JTlQgRkRLbWVtY21wKGNvbnN0IHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgY29uc3QgVUlOVCBzaXplKSAgeyByZXR1cm4gbWVtY21wKHMxLCBzMiwgc2l6ZSk7IH0KLUlOVCBGREtzdHJjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKSAgICAgICAgICAgICAgICAgICB7IHJldHVybiBzdHJjbXAoczEsIHMyKTsgfQotSU5UIEZES3N0cm5jbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBjb25zdCBVSU5UIHNpemUpIHsgcmV0dXJuIHN0cm5jbXAoczEsIHMyLCBzaXplKTsgfQorSU5UIEZES21lbWNtcChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIGNvbnN0IFVJTlQgc2l6ZSkgeworICByZXR1cm4gbWVtY21wKHMxLCBzMiwgc2l6ZSk7Cit9CitJTlQgRkRLc3RyY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikgeyByZXR1cm4gc3RyY21wKHMxLCBzMik7IH0KK0lOVCBGREtzdHJuY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgY29uc3QgVUlOVCBzaXplKSB7CisgIHJldHVybiBzdHJuY21wKHMxLCBzMiwgc2l6ZSk7Cit9CiAKK2ludCBJU19MSVRUTEVfRU5ESUFOKHZvaWQpIHsKKyAgaW50IF9fZHVtbXkgPSAxOworICByZXR1cm4gKCooKFVDSEFSICopKCYoX19kdW1teSkpKSk7Cit9CiAKLS8qIE1hdGggZnVuY3Rpb24gd3JhcHBlcnMuIE9ubHkgaW50ZW5kZWQgZm9yIGNvbXBhdGliaWxpdHksIG5vdCB0byBiZSBoaWdobHkgb3B0aW1pemVkLiAqLwotCi1JTlQgRkRLYWJzKElOVCBqKSB7IHJldHVybiBhYnMoaik7IH0KLWRvdWJsZSBGREtmYWJzKGRvdWJsZSB4KSB7IHJldHVybiBmYWJzKHgpOyB9Ci1kb3VibGUgRkRLcG93KGRvdWJsZSB4LCBkb3VibGUgeSkgeyByZXR1cm4gcG93KHgseSk7IH0KLWRvdWJsZSBGREtzcXJ0KGRvdWJsZSB4KSB7IHJldHVybiBzcXJ0KHgpOyB9Ci1kb3VibGUgRkRLYXRhbihkb3VibGUgeCkgeyByZXR1cm4gYXRhbih4KTsgfQotZG91YmxlIEZES2xvZyhkb3VibGUgeCkgeyByZXR1cm4gbG9nKHgpOyB9Ci1kb3VibGUgRkRLc2luKGRvdWJsZSB4KSB7IHJldHVybiBzaW4oeCk7IH0KLWRvdWJsZSBGREtjb3MoZG91YmxlIHgpIHsgcmV0dXJuIGNvcyh4KTsgfQotZG91YmxlIEZES2V4cChkb3VibGUgeCkgeyByZXR1cm4gZXhwKHgpOyB9Ci1kb3VibGUgRkRLYXRhbjIoZG91YmxlIHksIGRvdWJsZSB4KSB7IHJldHVybiBhdGFuMih5LCB4KTsgfQotZG91YmxlIEZES2Fjb3MoZG91YmxlIHgpIHsgcmV0dXJuIGFjb3MoeCk7IH0KLWRvdWJsZSBGREt0YW4oZG91YmxlIHgpIHsgcmV0dXJuIHRhbih4KTsgfQotZG91YmxlIEZES2Zsb29yKGRvdWJsZSB4KSB7IHJldHVybiBmbG9vcih4KTsgfQotZG91YmxlIEZES2NlaWwoZG91YmxlIHgpIHsgcmV0dXJuIGNlaWwoeCk7IH0KLQotSU5UICAgRkRLYXRvaShjb25zdCBjaGFyICpucHRyKSB7IHJldHVybiBhdG9pKG5wdHIpOyB9Ci1sb25nICBGREthdG9sKGNvbnN0IGNoYXIgKm5wdHIpIHsgcmV0dXJuIGF0b2wobnB0cik7IH0KLWZsb2F0IEZES2F0b2YoY29uc3QgY2hhciAqbnB0cikgeyByZXR1cm4gKGZsb2F0KWF0b2YobnB0cik7IH0KLQorVUlOVCBUT19MSVRUTEVfRU5ESUFOKFVJTlQgdmFsKSB7CisgIHJldHVybiBJU19MSVRUTEVfRU5ESUFOKCkKKyAgICAgICAgICAgICA/IHZhbAorICAgICAgICAgICAgIDogKCgodmFsICYgMHhmZikgPDwgMjQpIHwgKCh2YWwgJiAweGZmMDApIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAoKHZhbCAmIDB4ZmYwMDAwKSA+PiA4KSB8ICgodmFsICYgMHhmZjAwMDAwMCkgPj4gMjQpKTsKK30KIAogLyogPT09PT09PT09PT09PT09PT09PT0gRklMRSBJL08gPT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0jaWYgIWRlZmluZWQoRlVOQ1RJT05fRkRLZm9wZW4pCi1GREtGSUxFICpGREtmb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbW9kZSkgeyByZXR1cm4gZm9wZW4oZmlsZW5hbWUsIG1vZGUpOyB9Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZChGVU5DVElPTl9GREtmY2xvc2UpCi1JTlQgRkRLZmNsb3NlKEZES0ZJTEUgKmZwKSB7IHJldHVybiBmY2xvc2UoKEZJTEUqKWZwKTt9Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZChGVU5DVElPTl9GREtmc2VlaykKLUlOVCBGREtmc2VlayhGREtGSUxFICpmcCwgTE9ORyBPRkZTRVQsIGludCBXSEVOQ0UpIHsgcmV0dXJuIGZzZWVrKChGSUxFKilmcCwgT0ZGU0VULCBXSEVOQ0UpO30KLSNlbmRpZgotI2lmICFkZWZpbmVkKEZVTkNUSU9OX0ZES2Z0ZWxsKQotSU5UIEZES2Z0ZWxsKEZES0ZJTEUgKmZwKSB7IHJldHVybiBmdGVsbCgoRklMRSopZnApOyB9Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZChGVU5DVElPTl9GREtmZmx1c2gpCi1JTlQgRkRLZmZsdXNoKEZES0ZJTEUgKmZwKSB7IHJldHVybiBmZmx1c2goKEZJTEUqKWZwKTsgfQotI2VuZGlmCitGREtGSUxFICpGREtmb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbW9kZSkgeworICByZXR1cm4gZm9wZW4oZmlsZW5hbWUsIG1vZGUpOworfQorSU5UIEZES2ZjbG9zZShGREtGSUxFICpmcCkgeyByZXR1cm4gZmNsb3NlKChGSUxFICopZnApOyB9CitJTlQgRkRLZnNlZWsoRkRLRklMRSAqZnAsIExPTkcgT0ZGU0VULCBpbnQgV0hFTkNFKSB7CisgIHJldHVybiBmc2VlaygoRklMRSAqKWZwLCBPRkZTRVQsIFdIRU5DRSk7Cit9CitJTlQgRkRLZnRlbGwoRkRLRklMRSAqZnApIHsgcmV0dXJuIGZ0ZWxsKChGSUxFICopZnApOyB9CitJTlQgRkRLZmZsdXNoKEZES0ZJTEUgKmZwKSB7IHJldHVybiBmZmx1c2goKEZJTEUgKilmcCk7IH0KIGNvbnN0IElOVCBGREtTRUVLX1NFVCA9IFNFRUtfU0VUOwogY29uc3QgSU5UIEZES1NFRUtfQ1VSID0gU0VFS19DVVI7CiBjb25zdCBJTlQgRkRLU0VFS19FTkQgPSBTRUVLX0VORDsKIAotI2lmICFkZWZpbmVkKEZVTkNUSU9OX0ZES2Z3cml0ZSkKLVVJTlQgRkRLZndyaXRlKHZvaWQgKnB0cmYsIElOVCBzaXplLCBVSU5UIG5tZW1iLCBGREtGSUxFICpmcCkgeyByZXR1cm4gZndyaXRlKHB0cmYsIHNpemUsIG5tZW1iLCAoRklMRSopZnApOyB9Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZChGVU5DVElPTl9GREtmcmVhZCkKLVVJTlQgRkRLZnJlYWQodm9pZCAqZHN0LCBJTlQgc2l6ZSwgVUlOVCBubWVtYiwgRkRLRklMRSAqZnApIHsgcmV0dXJuIGZyZWFkKGRzdCwgc2l6ZSwgbm1lbWIsIChGSUxFKilmcCk7IH0KLSNlbmRpZgotI2lmICFkZWZpbmVkKEZVTkNUSU9OX0ZES2ZnZXRzKQotY2hhciogRkRLZmdldHModm9pZCAqZHN0LCBJTlQgc2l6ZSwgRkRLRklMRSAqZnApIHsgcmV0dXJuIGZnZXRzKChjaGFyICopZHN0LCBzaXplLCAoRklMRSopZnApOyB9Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZChGVU5DVElPTl9GREtyZXdpbmQpCi12b2lkIEZES3Jld2luZChGREtGSUxFICpmcCkgeyBGREtmc2VlaygoRklMRSopZnAsMCxGREtTRUVLX1NFVCk7IH0KLSNlbmRpZgotCi0KLVVJTlQgRkRLZndyaXRlX0VMKHZvaWQgKnB0cmYsIElOVCBzaXplLCBVSU5UIG5tZW1iLCBGREtGSUxFICpmcCkgewotCi0gICAgaWYgKElTX0xJVFRMRV9FTkRJQU4oKSkgewotICAgICAgRkRLZndyaXRlKHB0cmYsIHNpemUsIG5tZW1iLCBmcCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFVJTlQgbjsKLSAgICAgIElOVCBzOwotCi0gICAgICBVQ0hBUiAqcHRyID0gKFVDSEFSKikgcHRyZjsKLQotICAgICAgZm9yIChuPTA7IG48bm1lbWI7IG4rKykgewotICAgICAgICBmb3IgKHM9c2l6ZS0xOyBzPj0wOyBzLS0pIHsKLSAgICAgICAgICAvL0ZES3ByaW50ZigiY2hhciA9ICVjXG4iLCAoY2hhcikqKHB0citzKSk7Ci0gICAgICAgICAgRkRLZndyaXRlKHB0ciArIHMsIDEsIDEsIGZwKTsKLSAgICAgICAgfQotICAgICAgICBwdHIgPSBwdHIgKyBzaXplOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbm1lbWI7CitVSU5UIEZES2Z3cml0ZShjb25zdCB2b2lkICpwdHJmLCBJTlQgc2l6ZSwgVUlOVCBubWVtYiwgRkRLRklMRSAqZnApIHsKKyAgcmV0dXJuIChVSU5UKWZ3cml0ZShwdHJmLCBzaXplLCBubWVtYiwgKEZJTEUgKilmcCk7CiB9CitVSU5UIEZES2ZyZWFkKHZvaWQgKmRzdCwgSU5UIHNpemUsIFVJTlQgbm1lbWIsIEZES0ZJTEUgKmZwKSB7CisgIHJldHVybiAoVUlOVClmcmVhZChkc3QsIHNpemUsIG5tZW1iLCAoRklMRSAqKWZwKTsKK30KK2NoYXIgKkZES2ZnZXRzKHZvaWQgKmRzdCwgSU5UIHNpemUsIEZES0ZJTEUgKmZwKSB7CisgIHJldHVybiBmZ2V0cygoY2hhciAqKWRzdCwgc2l6ZSwgKEZJTEUgKilmcCk7Cit9Cit2b2lkIEZES3Jld2luZChGREtGSUxFICpmcCkgeyBGREtmc2VlaygoRklMRSAqKWZwLCAwLCBGREtTRUVLX1NFVCk7IH0KIAorVUlOVCBGREtmd3JpdGVfRUwoY29uc3Qgdm9pZCAqcHRyZiwgSU5UIHNpemUsIFVJTlQgbm1lbWIsIEZES0ZJTEUgKmZwKSB7CisgIGlmIChJU19MSVRUTEVfRU5ESUFOKCkpIHsKKyAgICBGREtmd3JpdGUocHRyZiwgc2l6ZSwgbm1lbWIsIGZwKTsKKyAgfSBlbHNlIHsKKyAgICBVSU5UIG47CisgICAgSU5UIHM7CisKKyAgICBjb25zdCBVQ0hBUiAqcHRyID0gKGNvbnN0IFVDSEFSICopcHRyZjsKKworICAgIGZvciAobiA9IDA7IG4gPCBubWVtYjsgbisrKSB7CisgICAgICBmb3IgKHMgPSBzaXplIC0gMTsgcyA+PSAwOyBzLS0pIHsKKyAgICAgICAgRkRLZndyaXRlKHB0ciArIHMsIDEsIDEsIGZwKTsKKyAgICAgIH0KKyAgICAgIHB0ciA9IHB0ciArIHNpemU7CisgICAgfQorICB9CisgIHJldHVybiBubWVtYjsKK30KIAogVUlOVCBGREtmcmVhZF9FTCh2b2lkICpkc3QsIElOVCBzaXplLCBVSU5UIG5tZW1iLCBGREtGSUxFICpmcCkgewogICBVSU5UIG4sIHMwLCBzMSwgZXJyOwpAQCAtNDM2LDkgKzM3MCw4IEBACiAKICAgLyogRW5mb3JjZSBhbGlnbm1lbnQgb2YgMjQgYml0IGRhdGEuICovCiAgIGlmIChzaXplID09IDMpIHsKLSAgICBwdHIgPSAoVUNIQVIqKWRzdDsKLSAgICBlcnIgPSAwOwotICAgIGZvciAobj0wOyBuPG5tZW1iOyBuKyspIHsKKyAgICBwdHIgPSAoVUNIQVIgKilkc3Q7CisgICAgZm9yIChuID0gMDsgbiA8IG5tZW1iOyBuKyspIHsKICAgICAgIGlmICgoZXJyID0gRkRLZnJlYWQodG1wMjQsIDEsIDMsIGZwKSkgIT0gMykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgICAgfQpAQCAtNDYwLDkgKzM5Myw5IEBACiAgICAgfQogICB9CiAgIGlmICghSVNfTElUVExFX0VORElBTigpICYmIHNpemUgPiAxKSB7Ci0gICAgcHRyID0gKFVDSEFSKilkc3Q7Ci0gICAgZm9yIChuPTA7IG48bm1lbWI7IG4rKykgewotICAgICAgZm9yIChzMD0wLCBzMT1zaXplLTE7IHMwIDwgczE7IHMwKyssIHMxLS0pIHsKKyAgICBwdHIgPSAoVUNIQVIgKilkc3Q7CisgICAgZm9yIChuID0gMDsgbiA8IG5tZW1iOyBuKyspIHsKKyAgICAgIGZvciAoczAgPSAwLCBzMSA9IHNpemUgLSAxOyBzMCA8IHMxOyBzMCsrLCBzMS0tKSB7CiAgICAgICAgIHRtcCA9IHB0cltzMF07CiAgICAgICAgIHB0cltzMF0gPSBwdHJbczFdOwogICAgICAgICBwdHJbczFdID0gdG1wOwpAQCAtNDczLDI0ICs0MDYsMTQgQEAKICAgcmV0dXJuIGVycjsKIH0KIAotSU5UIEZES2Zlb2YoRkRLRklMRSAqZnApIHsgcmV0dXJuIGZlb2YoKEZJTEUqKWZwKTsgfQorSU5UIEZES2Zlb2YoRkRLRklMRSAqZnApIHsgcmV0dXJuIGZlb2YoKEZJTEUgKilmcCk7IH0KIAogLyogR2xvYmFsIGluaXRpYWxpemF0aW9uL2NsZWFudXAgKi8KIAotI2lmIGRlZmluZWQoX0RFQlVHKSAmJiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKLSAgI2RlZmluZSBfQ1JUREJHX01BUF9BTExPQwotICAjaW5jbHVkZSA8Y3J0ZGJnLmg+Ci0jZW5kaWYKLQotCi0KLQotdm9pZCBGREtwcmludERpc2NsYWltZXIodm9pZCkKLXsKK3ZvaWQgRkRLcHJpbnREaXNjbGFpbWVyKHZvaWQpIHsKICAgRkRLcHJpbnRmKAotICAiVGhpcyBwcm9ncmFtIGlzIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgbGF3IGFuZCBpbnRlcm5hdGlvbmFsIHRyZWF0aWVzLlxuIiAgXAotICAiQW55IHJlcHJvZHVjdGlvbiBvciBkaXN0cmlidXRpb24gb2YgdGhpcyBwcm9ncmFtLCBvciBhbnkgcG9ydGlvblxuIiAgICAgICAgXAotICAib2YgaXQsIG1heSByZXN1bHQgaW4gc2V2ZXJlIGNpdmlsIGFuZCBjcmltaW5hbCBwZW5hbHRpZXMsIGFuZCB3aWxsIGJlXG4iICAgXAotICAicHJvc2VjdXRlZCB0byB0aGUgbWF4aW11bSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LlxuXG4iKTsKKyAgICAgICJUaGlzIHByb2dyYW0gaXMgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodCBsYXcgYW5kIGludGVybmF0aW9uYWwgdHJlYXRpZXMuXG4iCisgICAgICAiQW55IHJlcHJvZHVjdGlvbiBvciBkaXN0cmlidXRpb24gb2YgdGhpcyBwcm9ncmFtLCBvciBhbnkgcG9ydGlvblxuIgorICAgICAgIm9mIGl0LCBtYXkgcmVzdWx0IGluIHNldmVyZSBjaXZpbCBhbmQgY3JpbWluYWwgcGVuYWx0aWVzLCBhbmQgd2lsbCBiZVxuIgorICAgICAgInByb3NlY3V0ZWQgdG8gdGhlIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlIHVuZGVyIGxhdy5cblxuIik7CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYlNZUy9zcmMvbGludXgvRkRLX3N0YWNrbG9hZF9saW51eC5jcHAgYi9saWJTWVMvc3JjL2xpbnV4L0ZES19zdGFja2xvYWRfbGludXguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmZhOWFiLi4wMDAwMDAwCi0tLSBhL2xpYlNZUy9zcmMvbGludXgvRkRLX3N0YWNrbG9hZF9saW51eC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCi0gICBEZXNjcmlwdGlvbjogU3RhY2sgY29uc3VtcHRpb24gaW5mb3JtYXRpb24gZ2F0aGVyaW5nLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL2xpYlNZUy9zcmMvbGludXgvYXVkaW9fbGludXguY3BwIGIvbGliU1lTL3NyYy9saW51eC9hdWRpb19saW51eC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNWIyN2IuLjAwMDAwMDAKLS0tIGEvbGliU1lTL3NyYy9saW51eC9hdWRpb19saW51eC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIEF1dGhvcjogTWFudWVsIEphbmRlcgotICAgRGVzY3JpcHRpb246IEF1ZGlvIHN1cHBvcnQKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9saWJTWVMvc3JjL2xpbnV4L2NvcmVzdXBfbGludXguY3BwIGIvbGliU1lTL3NyYy9saW51eC9jb3Jlc3VwX2xpbnV4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU2ZmE4NS4uMDAwMDAwMAotLS0gYS9saWJTWVMvc3JjL2xpbnV4L2NvcmVzdXBfbGludXguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFN5c0xpYiAgKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6IE1hbnVlbCBKYW5kZXIKLSAgIERlc2NyaXB0aW9uOiBTeXN0ZW0gc3VwcG9ydCByb3V0aW5lcwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL2xpYlNZUy9zcmMvbGludXgvZ2VuZXJpY1N0ZHNfbGludXguY3BwIGIvbGliU1lTL3NyYy9saW51eC9nZW5lcmljU3Rkc19saW51eC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMzc1YzAuLjAwMDAwMDAKLS0tIGEvbGliU1lTL3NyYy9saW51eC9nZW5lcmljU3Rkc19saW51eC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFN5c0xpYiAgKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgotICAgRGVzY3JpcHRpb246IExpbnV4IGdlbmVyaWNTdGRzIChtb3N0bHkga2VybmVsIFNSQU0gZHJpdmVyIGJpbmRpbmdzKQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoKLSAqIE5PVEU6IGl0IG1ha2VzIG9ubHkgc2Vuc2UgdG8gZW5hYmxlIHRoaXMgaWYgeW91IGFsc28gaGF2ZSB0aGUgY29ycmVzcG9uZGluZwotICogR05VL0xpbnV4IGtlcm5lbCBkcml2ZXIgdG8gYWNjZXNzIGZhc3QgU1JBTS4KLSAqLwotI2lmIGRlZmluZWQoX19hcm1fXykgLyogfHwgZGVmaW5lZChfX21pcHNfXykgKi8KLQotLyoqCi0gKiBFQUJJIHN0YXRpYyBsaW5raW5nIHByb2JsZW0gd29ya2Fyb3VuZAotICoKLSAqIFRoZXNlIGZ1bmN0aW9uIGFyZSBub3JtYWxseSBwcmVzZW50IGluIGxpYmMuYSBidXQKLSAqIGFwcGFyZW50bHkgY2FuIGJlIGxpbmtlZCBvbmx5IHN0YXRpY2FsbHkuCi0gKiBXaGlsZSB1c2luZyBDKysgKGlpc2lzb2ZmKSB0aGF0IGlzIGEgcHJvYmxlbSwKLSAqIGJlY2F1c2UgaXQgd29udCB3b3JrIChzdGF0aWMgZ2xvYmFsIGNvbnN0cnVjdG9ycwotICogY2F1c2UgcHJvYmxlbXMgd2l0aCBzdGF0aWMgbGlua2VkIHByb2dyYW1zKS4KLSAqIFNvIHRoZSB3b3JrYXJvdW5kIGlzIHRvIGluY2x1ZGUgdGhvc2UgZnVuY3Rpb25zIGhlcmUsCi0gKiBiZWNhdXNlIGxpYlNZUy5hIGlzIGxpbmtlZCBzdGF0aWNhbGx5LCBhbmQgbGliYyBjYW4gYmUKLSAqIGxpbmtlZCBkeW5hbWljYWxseSBhcyB1c3VhbC4KLSAqCi0gKiBBZGQgbW9yZSBFQUJJIGZ1bmN0aW9ucyBoZXJlIGlmIHlvdSBnZXQgdW5yZXNvbHZlZAotICogc3ltYm9scyBvZiBFQUJJIGZ1bmN0aW9ucy4KLSAqLwotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi12b2lkIF9fYWVhYmlfbWVtY3B5KHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgaW50IHNpemUpCi17Ci0gIG1lbWNweShkZXN0LCBzcmMsIHNpemUpOwotfQotdm9pZCBfX2FlYWJpX21lbWNweTQodm9pZCAqZGVzdCwgdm9pZCAqc3JjLCBpbnQgc2l6ZSkKLXsKLSAgbWVtY3B5KGRlc3QsIHNyYywgc2l6ZSk7Ci19Ci12b2lkIF9fYWVhYmlfbWVtbW92ZTQodm9pZCAqZGVzdCwgdm9pZCAqc3JjLCBpbnQgc2l6ZSkKLXsKLSAgbWVtbW92ZShkZXN0LCBzcmMsIHNpemUpOwotfQotdm9pZCBfX2FlYWJpX21lbWNscih2b2lkICpwdHIsIGludCBzaXplKQotewotICBtZW1zZXQocHRyLCAwLCBzaXplKTsKLX0KLXZvaWQgX19hZWFiaV9tZW1jbHI0KHZvaWQgKnB0ciwgaW50IHNpemUpCi17Ci0gIG1lbXNldChwdHIsIDAsIHNpemUpOwotfQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotLyogSW5jbHVkZSBMaW51eCBrZXJuZWwgY29uZmlnLCBvciBzZXQgQVJDSCBhbmQgcHJvY2Vzc29yIG1hY3JvcyBkaXJlY3RseSAqLwotLyoKLSNkZWZpbmUgQ09ORklHX0FSQ0hfTVhDCi0jZGVmaW5lIENPTkZJR19BUkNIX01YMjUKLSovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzKQotI2RlZmluZSBLRVJORUxfU1JBTV9TSVpFICAgICAgIDY1NTM2Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX01YMzEpCi0jZGVmaW5lIEtFUk5FTF9TUkFNX1NJWkUgICAgICAgMTYzODQKLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVgyNSkKLSNkZWZpbmUgS0VSTkVMX1NSQU1fU0laRSAgICAgIDEzMTA3MgotI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NWDM1KQotI2RlZmluZSBLRVJORUxfU1JBTV9TSVpFICAgICAgMTMxMDcyCi0jZWxzZQotI2RlZmluZSBLRVJORUxfU1JBTV9TSVpFIDAKLSNlbmRpZgotCi0jaWYgKEtFUk5FTF9TUkFNX1NJWkUgPiAwKQotI2RlZmluZSBLRVJORUxfU0NSQVRDSF9TSVpFICg0MDk2KQotI2RlZmluZSBGREtfU0NSQVRDSEJVRl9TSVpFIChLRVJORUxfU0NSQVRDSF9TSVpFL3NpemVvZihJTlQpKQotI2RlZmluZSBEQVRBX0wxX0FfU0laRSAoS0VSTkVMX1NSQU1fU0laRS1LRVJORUxfU0NSQVRDSF9TSVpFKQotCi0jZGVmaW5lIFJFU09VUkNFX3NjcmF0Y2hCdWZmZXIKLSNkZWZpbmUgRlVOQ1RJT05fRkRLcHJvbG9nCi0jZGVmaW5lIEZVTkNUSU9OX0ZES2VwaWxvZwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqTDFfREFUQV9BPU5VTEw7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqX2E9TlVMTDsKLQotCi0jaWZkZWYgUkVTT1VSQ0Vfc2NyYXRjaEJ1ZmZlcgotc3RhdGljIElOVCAqX19zY3JhdGNoQnVmZmVyOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKl9fcFNjcmF0Y2hCdWZmZXIgPSBOVUxMOwotI2VuZGlmCi0KLQotI2lmZGVmIF9fbGludXhfXwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotc3RhdGljIGludCBmZDsKLXN0YXRpYyBpbmxpbmUgdm9pZCAqIGdldFNyYW0odm9pZCkKLXsKLSAgdW5zaWduZWQgbG9uZyAqcHRyID0gTlVMTDsKLQotICAvKiBPcGVuIGRyaXZlciAqLwotICBmZCA9IG9wZW4oIi9kZXYvc3JhbSIsIDApOwotICBpZiAoZmQgPCAwKQotICB7Ci0gICAgcHJpbnRmKCJVbmFibGUgdG8gb3BlbiAvZGV2L3NyYW0uIEZhbGxiYWNrIHRvIG1hbGxvY1xuIik7Ci0gICAgLyogU2lnbmFsICJubyBzcmFtIGRyaXZlciBhdCB1c2UiLiAqLwotICAgIGZkID0gLTE7Ci0gICAgLyogUmV0dXJuIG1hbGxvY2VkIHBvaW50ZXIgKGZhbGxiYWNrKSAqLwotICAgIHJldHVybiBGREthYWxsb2MoS0VSTkVMX1NSQU1fU0laRSwgOCk7Ci0gIH0KLQotICAvKiBHZXQgbWVtb3J5IG1hcHBlZCBpbnRvIENQVSAodmlydHVhbCkgYWRkcmVzcyBzcGFjZSAqLwotICBwdHIgPSAodW5zaWduZWQgbG9uZyAqKW1tYXAoTlVMTCwgS0VSTkVMX1NSQU1fU0laRSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKLSAgaWYocHRyID09IE1BUF9GQUlMRUQpCi0gIHsKLSAgICAgcHJpbnRmKCJVbmFibGUgdG8gbW1hcCgpLiBGYWxsYmFjayB0byBtYWxsb2NcbiIpOwotICAgICAvKiBHaXZlIHVwIG9uIHRoZSBzcmFtIGRyaXZlciAqLwotICAgICBjbG9zZShmZCk7Ci0gICAgIC8qIFNpZ25hbCAibm8gc3JhbSBkcml2ZXIgYXQgdXNlIi4gKi8KLSAgICAgZmQgPSAtMTsKLSAgICAgLyogUmV0dXJuIG1hbGxvY2VkIHBvaW50ZXIgKGZhbGxiYWNrKSAqLwotICAgICBwdHIgPSAodW5zaWduZWQgbG9uZyAqKUZES2FhbGxvYyhLRVJORUxfU1JBTV9TSVpFLCA4KTsKLSAgfQotCi0KLSAgLyogUmV0dXJuIHBvaW50ZXIgdG8gc3JhbSAqLwotICByZXR1cm4gKHZvaWQqKXB0cjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGZyZWVTcmFtKHZvaWQqIHB0cikKLXsKLSAgLyogQ2hlY2sgaWYgc3JhbSBkcml2ZXIgaXMgYmVpbmcgdXNlZC4gKi8KLSAgaWYgKGZkID09IC0xKQotICB7Ci0gICAgRkRLYWZyZWUocHRyKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBVbm1hcCBtZW1vcnkgKi8KLSAgbXVubWFwKHB0ciwgS0VSTkVMX1NSQU1fU0laRSk7Ci0gIC8qIENsb3NlIGRyaXZlciAqLwotICBjbG9zZShmZCk7Ci0KLSAgcmV0dXJuOwotfQotCi0jZWxzZQotCi1zdGF0aWMgaW5saW5lIHZvaWQgKiBnZXRTcmFtKHZvaWQpCi17Ci0gIHJldHVybiBGREthYWxsb2MoS0VSTkVMX1NSQU1fU0laRSwgOCk7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgKiBmcmVlU3JhbSh2b2lkKiBwdHIpCi17Ci0gIEZES2FmcmVlKHB0cik7Ci19Ci0KLSNlbmRpZgotCi0KLSNpZmRlZiBGVU5DVElPTl9GREtwcm9sb2cKLXZvaWQgRkRLcHJvbG9nKHZvaWQpCi17Ci0gICB1bnNpZ25lZCBjaGFyICphZGRyID0gKHVuc2lnbmVkIGNoYXIqKWdldFNyYW0oKTsKLQotCi0gICBpZiAoYWRkciA9PSBOVUxMKQotICAgewotICAgICBwcmludGYoIlNSQU0gYWxsb2NhdGlvbiBmYWlsZWQgISBUaGlzIGlzIGZhdGFsLlxuIik7Ci0gICAgIGV4aXQoLTEpOwotICAgfQotCi0jaWZkZWYgUkVTT1VSQ0Vfc2NyYXRjaEJ1ZmZlcgotICAgX19zY3JhdGNoQnVmZmVyID0gKElOVCopICggYWRkciArIChLRVJORUxfU1JBTV9TSVpFLUtFUk5FTF9TQ1JBVENIX1NJWkUpICk7Ci0gICBfX3BTY3JhdGNoQnVmZmVyID0gYWRkciArIChLRVJORUxfU1JBTV9TSVpFKTsKLSNlbmRpZgotCi0gICBwcmludGYoIlNSQU0gQCAweCUwOHhcbiIsICh1bnNpZ25lZCBpbnQpIGFkZHIpOwotICAgYXRleGl0KEZES2VwaWxvZyk7Ci0KLSAgIEZES3Byb2xvZ19nZW5lcmljKCk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIEZVTkNUSU9OX0ZES2VwaWxvZwotdm9pZCBGREtlcGlsb2codm9pZCkKLXsKLSAgIC8qIEJlY2F1c2Ugb2YgYXRleGl0KCksIG1ha2Ugc3VyZSB0byBjYWxsIHRoaXMgb25seSBvbmNlICovCi0gICBpZiAoTDFfREFUQV9BICE9IE5VTEwpCi0gICB7Ci0gICAgIGZyZWVTcmFtKEwxX0RBVEFfQSk7Ci0gICAgIEwxX0RBVEFfQSA9IE5VTEw7Ci0KLSAgICAgRkRLZXBpbG9nX2dlbmVyaWMoKTsKLSAgIH0KLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogS0VSTkVMX1NSQU0gPiAwICovCi0KLSNlbmRpZiAvKiBpZmRlZiBfX2FybV9fICovCi0KZGlmZiAtLWdpdCBhL2xpYlNZUy9zcmMvbGludXgvdWFydF9saW51eC5jcHAgYi9saWJTWVMvc3JjL2xpbnV4L3VhcnRfbGludXguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWU1Njk0Li4wMDAwMDAwCi0tLSBhL2xpYlNZUy9zcmMvbGludXgvdWFydF9saW51eC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Tb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKLQotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAxLiAgICBJTlRST0RVQ1RJT04KLVRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZSB0aGF0IGltcGxlbWVudHMKLXRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZyBzY2hlbWUgZm9yIGRpZ2l0YWwgYXVkaW8uCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCi0KLUFBQydzIEhFLUFBQyBhbmQgSEUtQUFDIHYyIHZlcnNpb25zIGFyZSByZWdhcmRlZCBhcyB0b2RheSdzIG1vc3QgZWZmaWNpZW50IGdlbmVyYWwgcGVyY2VwdHVhbAotYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQotaW5kZXBlbmRlbnQgc3R1ZGllcyBhbmQgaXMgd2lkZWx5IGRlcGxveWVkLiBBQUMgaGFzIGJlZW4gc3RhbmRhcmRpemVkIGJ5IElTTyBhbmQgSUVDIGFzIHBhcnQKLW9mIHRoZSBNUEVHIHNwZWNpZmljYXRpb25zLgotCi1QYXRlbnQgbGljZW5zZXMgZm9yIG5lY2Vzc2FyeSBwYXRlbnQgY2xhaW1zIGZvciB0aGUgRkRLIEFBQyBDb2RlYyAoaW5jbHVkaW5nIHRob3NlIG9mIEZyYXVuaG9mZXIpCi1tYXkgYmUgb2J0YWluZWQgdGhyb3VnaCBWaWEgTGljZW5zaW5nICh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzCi1pbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCi10aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YgQW5kcm9pZCBkZXZpY2VzIGFscmVhZHkgbGljZW5zZQotdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IgZGlyZWN0bHkgZnJvbSB0aGUgcGF0ZW50IG93bmVycywgYW5kIHRoZXJlZm9yZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCi0KLUNvbW1lcmNpYWxseS1saWNlbnNlZCBBQUMgc29mdHdhcmUgbGlicmFyaWVzLCBpbmNsdWRpbmcgZmxvYXRpbmctcG9pbnQgdmVyc2lvbnMgd2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LAotYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAotYXBwbGljYXRpb25zIGluZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgotCi0yLiAgICBDT1BZUklHSFQgTElDRU5TRQotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHdpdGhvdXQKLXBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IKLXlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCi0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCi1Zb3UgbXVzdCBtYWtlIGF2YWlsYWJsZSBmcmVlIG9mIGNoYXJnZSBjb3BpZXMgb2YgdGhlIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG9mIHRoZSBGREsgQUFDIENvZGVjIGFuZCB5b3VyCi1tb2RpZmljYXRpb25zIHRoZXJldG8gdG8gcmVjaXBpZW50cyBvZiBjb3BpZXMgaW4gYmluYXJ5IGZvcm0uCi0KLVRoZSBuYW1lIG9mIEZyYXVuaG9mZXIgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQKLXByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotWW91IG1heSBub3QgY2hhcmdlIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgZm9yIGFueW9uZSB0byB1c2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8uCi0KLVlvdXIgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlCi1hbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gRm9yIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybQotIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCi0iVGhpcmQtUGFydHkgTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgotCi0zLiAgICBOTyBQQVRFTlQgTElDRU5TRQotCi1OTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHBhdGVudHMgb2YgRnJhdW5ob2ZlciwKLUFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCi1yZXNwZWN0IHRvIHRoaXMgc29mdHdhcmUuCi0KLVlvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZAotYnkgYXBwcm9wcmlhdGUgcGF0ZW50IGxpY2Vuc2VzLgotCi00LiAgICBESVNDTEFJTUVSCi0KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmF1bmhvZmVyIG9uIGJlaGFsZiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycwotIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwotb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLUNPTlRSSUJVVE9SUyBCRSBMSUFCTEUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCi1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24sIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0Ci1saWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYKLWFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgotCi01LiAgICBDT05UQUNUIElORk9STUFUSU9OCi0KLUZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUwotQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKLUFtIFdvbGZzbWFudGVsIDMzCi05MTA1OCBFcmxhbmdlbiwgR2VybWFueQotCi13d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCi1hbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgU3lzTGliICAqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgIEF1dGhvcjogTWFudWVsIEphbmRlcgotICAgRGVzY3JpcHRpb246IFVBUlQgc3VwcG9ydAotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL2xpYlNZUy9zcmMvbWlwcy9nZW5lcmljU3Rkc19taXBzLmNwcCBiL2xpYlNZUy9zcmMvbWlwcy9nZW5lcmljU3Rkc19taXBzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4ZWM0OC4uMDAwMDAwMAotLS0gYS9saWJTWVMvc3JjL21pcHMvZ2VuZXJpY1N0ZHNfbWlwcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCi0KLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgotICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gMS4gICAgSU5UUk9EVUNUSU9OCi1UaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQgKCJGREsgQUFDIENvZGVjIikgaXMgc29mdHdhcmUgdGhhdCBpbXBsZW1lbnRzCi10aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb24gYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgotCi1BQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKLWF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcgZnVsbC1iYW5kd2lkdGggY29tbXVuaWNhdGlvbnMgY29kZWMgYnkKLWluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseSBkZXBsb3llZC4gQUFDIGhhcyBiZWVuIHN0YW5kYXJkaXplZCBieSBJU08gYW5kIElFQyBhcyBwYXJ0Ci1vZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KLQotUGF0ZW50IGxpY2Vuc2VzIGZvciBuZWNlc3NhcnkgcGF0ZW50IGNsYWltcyBmb3IgdGhlIEZESyBBQUMgQ29kZWMgKGluY2x1ZGluZyB0aG9zZSBvZiBGcmF1bmhvZmVyKQotbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwotaW5kaXZpZHVhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBiaXQgc3RyZWFtcyBpbiBwcm9kdWN0cyB0aGF0IGFyZSBjb21wbGlhbnQgd2l0aAotdGhlIElTTy9JRUMgTVBFRyBhdWRpbyBzdGFuZGFyZHMuIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYW51ZmFjdHVyZXJzIG9mIEFuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UKLXRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwotc29mdHdhcmUgbWF5IGFscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZSBsaWNlbnNlZCBwdXJwb3NlcyBvbmx5LgotCi1Db21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKLWFyZSBhbHNvIGF2YWlsYWJsZSBmcm9tIEZyYXVuaG9mZXIuIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIGNoZWNrIHRoZSBGcmF1bmhvZmVyIHdlYnNpdGUgZm9yIGFkZGl0aW9uYWwKLWFwcGxpY2F0aW9ucyBpbmZvcm1hdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KLQotMi4gICAgQ09QWVJJR0hUIExJQ0VOU0UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0Ci1wYXltZW50IG9mIGNvcHlyaWdodCBsaWNlbnNlIGZlZXMgcHJvdmlkZWQgdGhhdCB5b3Ugc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVlvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCi15b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIGJpbmFyeSBmb3JtLgotWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZiBjaGFyZ2UgY29waWVzIG9mIHRoZSBjb21wbGV0ZSBzb3VyY2UgY29kZSBvZiB0aGUgRkRLIEFBQyBDb2RlYyBhbmQgeW91cgotbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgotCi1UaGUgbmFtZSBvZiBGcmF1bmhvZmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgbGlicmFyeSB3aXRob3V0Ci1wcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVlvdSBtYXkgbm90IGNoYXJnZSBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIGZvciBhbnlvbmUgdG8gdXNlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgotCi1Zb3VyIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBzb2Z0d2FyZQotYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KLSJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCIgbXVzdCBiZSByZXBsYWNlZCBieSB0aGUgdGVybQotIlRoaXJkLVBhcnR5IE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkLiIKLQotMy4gICAgTk8gUEFURU5UIExJQ0VOU0UKLQotTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCi1BUkUgR1JBTlRFRCBCWSBUSElTIFNPRlRXQVJFIExJQ0VOU0UuIEZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aAotcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLgotCi1Zb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yIHB1cnBvc2VzIHRoYXQgYXJlIGF1dGhvcml6ZWQKLWJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KLQotNC4gICAgRElTQ0xBSU1FUgotCi1UaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKLSJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMKLW9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCi1pbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzLAotb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uLCBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdAotbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCi1hZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgotCi1GcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cyBJSVMKLUF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCi1BbSBXb2xmc21hbnRlbCAzMwotOTEwNTggRXJsYW5nZW4sIEdlcm1hbnkKLQotd3d3Lmlpcy5mcmF1bmhvZmVyLmRlL2FtbQotYW1tLWluZm9AaWlzLmZyYXVuaG9mZXIuZGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiAgRnJhdW5ob2ZlciBJSVMgRkRLIFN5c0xpYiAgKioqKioqKioqKioqKioqKioqKioqKgotCi0gICBBdXRob3Iocyk6ICAgTWFudWVsIEphbmRlcgotICAgRGVzY3JpcHRpb246Ci0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBSRVNPVVJDRV9zY3JhdGNoQnVmZmVyCi0jZGVmaW5lIEZVTkNUSU9OX0ZES3Byb2xvZwotI2RlZmluZSBGVU5DVElPTl9GREtlcGlsb2cKLQotI2RlZmluZSBNSVBTX1ZJUlRVQUxfU1RBUlQgICgweDgwMDAwMDAwKQotLyogdmFsdWUgYmVsb3cgaXMgZGVmaW5lZCBpbiBzaW11bGF0b3IgY29uZmlnIChNaXBzTWVtSW50Zi17MjRLRSw0S0V9LmNmZykgKi8KLSNkZWZpbmUgTUlQU19TREVfU0NSQVRDSFBBRCAoMHgwMDA1ODAwMCkKLQotLy8jZGVmaW5lIE1JUFNfU1JBTV9TSVpFICAoMzI3NjgpCi0jZGVmaW5lIE1JUFNfU1JBTV9TSVpFICAoNDA5NikKLQotI2RlZmluZSBNSVBTX1NDUkFUQ0hfU0laRSAoNDA5NikKLSNkZWZpbmUgREFUQV9MMV9BX1NJWkUgKE1JUFNfU1JBTV9TSVpFLU1JUFNfU0NSQVRDSF9TSVpFKQotCi0KLQotCi0jaWZkZWYgUkVTT1VSQ0Vfc2NyYXRjaEJ1ZmZlcgotI2RlZmluZSBGREtfU0NSQVRDSEJVRl9TSVpFIDEwMjQKLXN0YXRpYyBMT05HICpfX19zY3JhdGNoQnVmZmVyID0gTlVMTDsKLXN0YXRpYyBMT05HICpfX3NjcmF0Y2hCdWZmZXIgPSBOVUxMOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKl9fcFNjcmF0Y2hCdWZmZXIgPSBOVUxMOwotI2VuZGlmCi0KLQotI2lmZGVmIF9fbGludXhfXwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotc3RhdGljIGludCBmZDsKLXN0YXRpYyBpbmxpbmUgdm9pZCAqIGdldFNyYW0odm9pZCkKLXsKLSAgdW5zaWduZWQgbG9uZyAqcHRyID0gTlVMTDsKLQotICAvKiBPcGVuIGRyaXZlciAqLwotICBmZCA9IG9wZW4oIi9kZXYvc3JhbSIsIDApOwotICBpZiAoZmQgPCAwKQotICB7Ci0gICAgcHJpbnRmKCJVbmFibGUgdG8gYWNjZXNzIHNyYW0uIEZhbGxiYWNrIHRvIG1hbGxvY1xuIik7Ci0gICAgLyogU2lnbmFsICJubyBzcmFtIGRyaXZlciBhdCB1c2UiLiAqLwotICAgIGZkID0gLTE7Ci0gICAgLyogUmV0dXJuIG1hbGxvY2VkIHBvaW50ZXIgKGZhbGxiYWNrKSAqLwotICAgIHJldHVybiBtYWxsb2MoTUlQU19TUkFNX1NJWkUpOwotICB9Ci0KLSAgLyogR2V0IG1lbW9yeSBtYXBwZWQgaW50byBDUFUgKHZpcnR1YWwpIGFkZHJlc3Mgc3BhY2UgKi8KLSAgcHRyID0gKHVuc2lnbmVkIGxvbmcgKiltbWFwKE5VTEwsIE1JUFNfU1JBTV9TSVpFLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfUFJJVkFURSwgZmQsIDApOwotICBpZihwdHIgPT0gTUFQX0ZBSUxFRCkKLSAgewotICAgICBwcmludGYoIlVuYWJsZSB0byBhY2Nlc3Mgc3JhbS4gRmFsbGJhY2sgdG8gbWFsbG9jXG4iKTsKLSAgICAgLyogR2l2ZSB1cCBvbiB0aGUgc3JhbSBkcml2ZXIgKi8KLSAgICAgY2xvc2UoZmQpOwotICAgICAvKiBTaWduYWwgIm5vIHNyYW0gZHJpdmVyIGF0IHVzZSIuICovCi0gICAgIGZkID0gLTE7Ci0gICAgIC8qIFJldHVybiBtYWxsb2NlZCBwb2ludGVyIChmYWxsYmFjaykgKi8KLSAgICAgcHRyID0gKHVuc2lnbmVkIGxvbmcgKiltYWxsb2MoTUlQU19TUkFNX1NJWkUpOwotICB9Ci0KLQotICAvKiBSZXR1cm4gcG9pbnRlciB0byBzcmFtICovCi0gIHJldHVybiAodm9pZCopcHRyOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZnJlZVNyYW0odm9pZCogcHRyKQotewotICAvKiBDaGVjayBpZiBzcmFtIGRyaXZlciBpcyBiZWluZyB1c2VkLiAqLwotICBpZiAoZmQgPT0gLTEpCi0gIHsKLSAgICBmcmVlKHB0cik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyogVW5tYXAgbWVtb3J5ICovCi0gIG11bm1hcChwdHIsIE1JUFNfU1JBTV9TSVpFKTsKLSAgLyogQ2xvc2UgZHJpdmVyICovCi0gIGNsb3NlKGZkKTsKLQotICByZXR1cm47Ci19Ci0KLSNlbGlmIGRlZmluZWQoX19TREVfTUlQU19fKQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxtaXBzL2NwdS5oPgotCi1zdGF0aWMgaW50IGhhc0lTUFJBTSwgaGFzRFNQUkFNOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgKiBnZXRTcmFtKHZvaWQpCi17Ci0gIHZvaWQgKmFkZHI7Ci0gIHVuc2lnbmVkIGludCBDb25maWc7Ci0KLSAgQ29uZmlnID0gbWlwc19nZXRjb25maWcoKTsKLSAgaGFzSVNQUkFNID0gKENvbmZpZyA+PiAyNCkgJiAxOwotICBoYXNEU1BSQU0gPSAoQ29uZmlnID4+IDIzKSAmIDE7Ci0KLSAgRkRLcHJpbnRmKCJDb25maWcgSVNQL0RTUDogJWQvJWRcbiIsIGhhc0lTUFJBTSwgaGFzRFNQUkFNKTsKLQotICBpZiAoaGFzRFNQUkFNKSB7Ci0gICAgbG9uZyBwYWRkciwgbGFkZHI7Ci0KLSAgICBGREtwcmludGYoIndyb25nXG4iKTsKLSAgICBwYWRkciA9IE1JUFNfU0RFX1NDUkFUQ0hQQUQ7Ci0gICAgLyogRml4ZWQgbWFwcGluZyBvZiBrc2VnMDogMHg4MDAwMDAwMC0weDlmZmZmZmZmIHZpcnR1YWwgPT4gMHgwMDAwMDAwMC0weDFmZmZmZmZmIHBoeXNpY2FsICovCi0gICAgbGFkZHIgPSBNSVBTX1ZJUlRVQUxfU1RBUlQgKyBNSVBTX1NERV9TQ1JBVENIUEFEOwotICAgIGFkZHIgPSAodm9pZCopKGxhZGRyKTsKLSAgfSBlbHNlIHsKLSAgICBGREtwcmludGYoIm9rXG4iKTsKLSAgICBhZGRyID0gbWFsbG9jKE1JUFNfU1JBTV9TSVpFKTsKLSAgICBGREtwcmludGYoImFkZHIgJWRcbiIsIChpbnQpYWRkcik7Ci0gIH0KLSAgcmV0dXJuIGFkZHI7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgZnJlZVNyYW0odm9pZCogcHRyKQotewotICBpZiAoIWhhc0RTUFJBTSkgewotICAgIGZyZWUocHRyKTsKLSAgfQotfQotCi0jZWxzZQotCi1zdGF0aWMgaW5saW5lIHZvaWQgKiBnZXRTcmFtKHZvaWQpCi17Ci0gIHJldHVybiBtYWxsb2MoTUlQU19TUkFNX1NJWkUpOwotfQotc3RhdGljIGlubGluZSB2b2lkIGZyZWVTcmFtKHZvaWQqIHB0cikKLXsKLSAgZnJlZShwdHIpOwotfQotCi0jZW5kaWYKLQotCi0jaWZkZWYgRlVOQ1RJT05fRkRLcHJvbG9nCi12b2lkIEZES3Byb2xvZyh2b2lkKQotewotICAgdW5zaWduZWQgY2hhciAqYWRkcjsKLQotI2lmZGVmIF9NSVBTX0FSQ0hfTUlQUzMyUjIKLSAgIHVuc2lnbmVkIHN0YXR1czsKLSAgIGFzbSB2b2xhdGlsZSgibWZjMCAlMCwgJDEyLCAwO1xuIiA6ICI9ciIgKHN0YXR1cykpOwotICAgc3RhdHVzIHw9ICgxIDw8IDI0KTsKLSAgIGFzbSB2b2xhdGlsZSgibXRjMCAlMCwgJDEyLCAwO1xuIiA6OiAiciIgKHN0YXR1cykpOwotI2VuZGlmCi0KLSAgIGFkZHIgPSAodW5zaWduZWQgY2hhciopZ2V0U3JhbSgpOwotICAgaWYgKGFkZHIgPT0gTlVMTCkgewotICAgICBGREtwcmludGZFcnIoIlNSQU0gYWxsb2NhdGlvbiBmYWlsZWQgISBUaGlzIGlzIGZhdGFsLlxuIik7Ci0gICAgIGV4aXQoLTEpOwotICAgfSBlbHNlIHsKLSAgICAgRkRLcHJpbnRmKCJTUkFNIEAgMHglMDh4LCBzaXplID0gMHgleFxuIiwgKHVuc2lnbmVkIGludCkgYWRkciwgTUlQU19TUkFNX1NJWkUpOwotICAgfQotCi0KLSNpZmRlZiBSRVNPVVJDRV9zY3JhdGNoQnVmZmVyCi0gICBfX19zY3JhdGNoQnVmZmVyID0gKExPTkcqKShhZGRyICsgTUlQU19TUkFNX1NJWkUgLSBNSVBTX1NDUkFUQ0hfU0laRSk7Ci0jZW5kaWYKLQotICAgYXRleGl0KEZES2VwaWxvZyk7Ci0KLSAgIEZES3Byb2xvZ19nZW5lcmljKCk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIEZVTkNUSU9OX0ZES2VwaWxvZwotdm9pZCBGREtlcGlsb2codm9pZCkKLXsKLQotI2lmZGVmIF9NSVBTX0FSQ0hfTUlQUzMyUjIKLSAgIHVuc2lnbmVkIHN0YXR1czsKLSAgIGFzbSB2b2xhdGlsZSgibWZjMCAlMCwgJDEyLCAwO1xuIiA6ICI9ciIgKHN0YXR1cykpOwotICAgICAgICAgICBzdGF0dXMgJj0gfigxIDw8IDI0KTsKLSAgIGFzbSB2b2xhdGlsZSgibXRjMCAlMCwgJDEyLCAwO1xuIiA6OiAiciIgKHN0YXR1cykpOwotI2VuZGlmCi0KLSAgIEZES2VwaWxvZ19nZW5lcmljKCk7Ci19Ci0jZW5kaWYKLQotCi0jaWYgIWRlZmluZWQoX19saW51eF9fKQotCi0jZGVmaW5lIEZVTkNUSU9OX0ZES2Nsb2NrCi0KLSNpZm5kZWYgTUlQU19DUFVfQ0xLCi0jZGVmaW5lIE1JUFNfQ1BVX0NMSyAxMDAwMDAwMDAKLSNlbmRpZgotCi1JTlQgRkRLY2xvY2sodm9pZCkgewotICBJTlQgY2xrOwotCi0gIGFzbSB2b2xhdGlsZSAoIm1mYzAgJTAsJDkgIiA6ICI9ciIgKGNsaykpOwotICByZXR1cm4gY2xrOwotfQotCi0jZW5kaWYgLyogIWRlZmluZWQoX19saW51eF9fKSAqLwpkaWZmIC0tZ2l0IGEvbGliU1lTL3NyYy9zeXNsaWJfY2hhbm5lbE1hcERlc2NyLmNwcCBiL2xpYlNZUy9zcmMvc3lzbGliX2NoYW5uZWxNYXBEZXNjci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAxMWYyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYlNZUy9zcmMvc3lzbGliX2NoYW5uZWxNYXBEZXNjci5jcHAKQEAgLTAsMCArMSwyODQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKKworwqkgQ29weXJpZ2h0ICAxOTk1IC0gMjAxOCBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRsO2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4KK0ZvcnNjaHVuZyBlLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAxLiAgICBJTlRST0RVQ1RJT04KK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZCAoIkZESyBBQUMgQ29kZWMiKSBpcyBzb2Z0d2FyZQordGhhdCBpbXBsZW1lbnRzIHRoZSBNUEVHIEFkdmFuY2VkIEF1ZGlvIENvZGluZyAoIkFBQyIpIGVuY29kaW5nIGFuZCBkZWNvZGluZworc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLiBUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbgorYSB3aWRlIHZhcmlldHkgb2YgQW5kcm9pZCBkZXZpY2VzLgorCitBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudAorZ2VuZXJhbCBwZXJjZXB0dWFsIGF1ZGlvIGNvZGVjcy4gQUFDLUVMRCBpcyBjb25zaWRlcmVkIHRoZSBiZXN0LXBlcmZvcm1pbmcKK2Z1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5IGluZGVwZW5kZW50IHN0dWRpZXMgYW5kIGlzIHdpZGVseQorZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydCBvZiB0aGUgTVBFRworc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcKK3Rob3NlIG9mIEZyYXVuaG9mZXIpIG1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcKKyh3d3cudmlhbGljZW5zaW5nLmNvbSkgb3IgdGhyb3VnaCB0aGUgcmVzcGVjdGl2ZSBwYXRlbnQgb3duZXJzIGluZGl2aWR1YWxseSBmb3IKK3RoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudAord2l0aCB0aGUgSVNPL0lFQyBNUEVHIGF1ZGlvIHN0YW5kYXJkcy4gUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1hbnVmYWN0dXJlcnMgb2YKK0FuZHJvaWQgZGV2aWNlcyBhbHJlYWR5IGxpY2Vuc2UgdGhlc2UgcGF0ZW50IGNsYWltcyB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgb3IKK2RpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBtYXkKK2FscmVhZHkgYmUgY292ZXJlZCB1bmRlciB0aG9zZSBwYXRlbnQgbGljZW5zZXMgd2hlbiBpdCBpcyB1c2VkIGZvciB0aG9zZQorbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucword2l0aCBlbmhhbmNlZCBzb3VuZCBxdWFsaXR5LCBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUKK2VuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbCBhcHBsaWNhdGlvbnMKK2luZm9ybWF0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgorCisyLiAgICBDT1BZUklHSFQgTElDRU5TRQorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCB3aXRob3V0IHBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdQorc2F0aXNmeSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1lvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mCit0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBzb3VyY2UgY29kZSBmb3JtLgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uCithbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCit5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4gWW91IG11c3QgbWFrZSBhdmFpbGFibGUgZnJlZSBvZgorY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKK2Zyb20gdGhpcyBsaWJyYXJ5IHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlCit0aGUgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcKK3RoYXQgeW91IGNoYW5nZWQgdGhlIHNvZnR3YXJlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMKK29mIHRoZSBGREsgQUFDIENvZGVjLCB0aGUgdGVybSAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiCittdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtICJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESworQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQuIgorCiszLiAgICBOTyBQQVRFTlQgTElDRU5TRQorCitOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBVEVOVCBDTEFJTVMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsIEFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4KK0ZyYXVuaG9mZXIgcHJvdmlkZXMgbm8gd2FycmFudHkgb2YgcGF0ZW50IG5vbi1pbmZyaW5nZW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoaXMKK3NvZnR3YXJlLgorCitZb3UgbWF5IHVzZSB0aGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIG9ubHkgZm9yCitwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkIGJ5IGFwcHJvcHJpYXRlIHBhdGVudCBsaWNlbnNlcy4KKworNC4gICAgRElTQ0xBSU1FUgorCitUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodAoraG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJBUyBJUyIgYW5kIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwKK29yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlCitnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwKK2hvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0CitsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mCit0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCis1LiAgICBDT05UQUNUIElORk9STUFUSU9OCisKK0ZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzIElJUworQXR0ZW50aW9uOiBBdWRpbyBhbmQgTXVsdGltZWRpYSBEZXBhcnRtZW50cyAtIEZESyBBQUMgTEwKK0FtIFdvbGZzbWFudGVsIDMzCis5MTA1OCBFcmxhbmdlbiwgR2VybWFueQorCit3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCithbW0taW5mb0BpaXMuZnJhdW5ob2Zlci5kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogU3lzdGVtIGludGVncmF0aW9uIGxpYnJhcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIFRob21hcyBEaWV0emVuCisKKyAgIERlc2NyaXB0aW9uOgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogXGZpbGUgICBzeXNsaWJfY2hhbm5lbE1hcERlc2NyLmNwcAorICogIFxicmllZiAgSW1wbGVtZW50YXRpb24gb2Ygcm91dGluZXMgdGhhdCBoYW5kbGUgdGhlIGNoYW5uZWwgbWFwIGRlc2NyaXB0b3IuCisgKi8KKworI2luY2x1ZGUgInN5c2xpYl9jaGFubmVsTWFwRGVzY3IuaCIKKworI2RlZmluZSBERkxUX0NIX01BUF9UQUJfTEVOIFwKKyAgKDE1KSAvKiBMZW5ndGggb2YgdGhlIGRlZmF1bHQgY2hhbm5lbCBtYXAgaW5mbyB0YWJsZS4gKi8KKworLyoqCisgKiBcYnJpZWYgIFRoZSBmb2xsb3dpbmcgYXJyYXlzIHByb3ZpZGUgYSBjaGFubmVsIG1hcCBmb3IgZWFjaCBjaGFubmVsIGNvbmZpZyAoMAorICogdG8gMTQpLgorICoKKyAqIFRoZSBpLXRoIGNoYW5uZWwgd2lsbCBiZSBtYXBwZWQgdG8gdGhlIHBvc3Rpb24gYVtpLTFdKzEKKyAqIHdpdGggaT4wIGFuZCBhW10gaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgbWFwcGluZyBhcnJheXMuCisgKi8KK3N0YXRpYyBjb25zdCBVQ0hBUiBtYXBGYWxsYmFja1tdID0gezAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgIDksICAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzfTsKK3N0YXRpYyBjb25zdCBVQ0hBUiBtYXBDZmcxW10gPSB7MCwgMX07CitzdGF0aWMgY29uc3QgVUNIQVIgbWFwQ2ZnMltdID0gezAsIDF9Oworc3RhdGljIGNvbnN0IFVDSEFSIG1hcENmZzNbXSA9IHsyLCAwLCAxfTsKK3N0YXRpYyBjb25zdCBVQ0hBUiBtYXBDZmc0W10gPSB7MiwgMCwgMSwgM307CitzdGF0aWMgY29uc3QgVUNIQVIgbWFwQ2ZnNVtdID0gezIsIDAsIDEsIDMsIDR9Oworc3RhdGljIGNvbnN0IFVDSEFSIG1hcENmZzZbXSA9IHsyLCAwLCAxLCA0LCA1LCAzfTsKK3N0YXRpYyBjb25zdCBVQ0hBUiBtYXBDZmc3W10gPSB7MiwgNiwgNywgMCwgMSwgNCwgNSwgM307CitzdGF0aWMgY29uc3QgVUNIQVIgbWFwQ2ZnMTFbXSA9IHsyLCAwLCAxLCA0LCA1LCA2LCAzfTsKK3N0YXRpYyBjb25zdCBVQ0hBUiBtYXBDZmcxMltdID0gezIsIDAsIDEsIDYsIDcsIDQsIDUsIDN9Oworc3RhdGljIGNvbnN0IFVDSEFSIG1hcENmZzEzW10gPSB7MiwgIDYsICA3LCAgMCwgIDEsICAxMCwgMTEsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAgOCwgIDMsICA5LCAgMTQsIDEyLCAxMywgMTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSwgMTUsIDE2LCAxNywgMjAsIDIxLCAyMiwgMjN9Oworc3RhdGljIGNvbnN0IFVDSEFSIG1hcENmZzE0W10gPSB7MiwgMCwgMSwgNCwgNSwgMywgNiwgN307CisKKy8qKgorICogXGJyaWVmICBEZWZhdWx0IHRhYmxlIGNvbXByaXNpbmcgY2hhbm5lbCBtYXAgaW5mb3JtYXRpb24gZm9yIGVhY2ggY2hhbm5lbAorICogY29uZmlnICgwIHRvIDE0KS4KKyAqLworc3RhdGljIGNvbnN0IENIQU5ORUxfTUFQX0lORk8gbWFwSW5mb1RhYkRmbHRbREZMVF9DSF9NQVBfVEFCX0xFTl0gPQorICAgIHsvKiBjaENmZywgIG1hcCwgICAgICAgICBudW1DaCAqLworICAgICAvKiAgMCAqLyB7bWFwRmFsbGJhY2ssIDI0fSwKKyAgICAgLyogIDEgKi8ge21hcENmZzEsIDJ9LAorICAgICAvKiAgMiAqLyB7bWFwQ2ZnMiwgMn0sCisgICAgIC8qICAzICovIHttYXBDZmczLCAzfSwKKyAgICAgLyogIDQgKi8ge21hcENmZzQsIDR9LAorICAgICAvKiAgNSAqLyB7bWFwQ2ZnNSwgNX0sCisgICAgIC8qICA2ICovIHttYXBDZmc2LCA2fSwKKyAgICAgLyogIDcgKi8ge21hcENmZzcsIDh9LAorICAgICAvKiAgOCAqLyB7bWFwRmFsbGJhY2ssIDI0fSwKKyAgICAgLyogIDkgKi8ge21hcEZhbGxiYWNrLCAyNH0sCisgICAgIC8qIDEwICovIHttYXBGYWxsYmFjaywgMjR9LAorICAgICAvKiAxMSAqLyB7bWFwQ2ZnMTEsIDd9LAorICAgICAvKiAxMiAqLyB7bWFwQ2ZnMTIsIDh9LAorICAgICAvKiAxMyAqLyB7bWFwQ2ZnMTMsIDI0fSwKKyAgICAgLyogMTQgKi8ge21hcENmZzE0LCA4fX07CisKKy8qKgorICogR2V0IHRoZSBtYXBwaW5nIHZhbHVlIGZvciBhIHNwZWNpZmljIGNoYW5uZWwgYW5kIG1hcCBpbmRleC4KKyAqLworVUNIQVIgRkRLX2NoTWFwRGVzY3JfZ2V0TWFwVmFsdWUoY29uc3QgRkRLX2NoYW5uZWxNYXBEZXNjciogY29uc3QgcE1hcERlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNIQVIgY2hJZHgsIGNvbnN0IFVJTlQgbWFwSWR4KSB7CisgIFVDSEFSIG1hcFZhbHVlID0gY2hJZHg7IC8qIFBhc3MgdGhyb3VnaCBieSBkZWZhdWx0LiAqLworCisgIEZES19BU1NFUlQocE1hcERlc2NyICE9IE5VTEwpOworCisgIGlmICgocE1hcERlc2NyLT5mUGFzc1Rocm91Z2ggPT0gMCkgJiYgKHBNYXBEZXNjci0+cE1hcEluZm9UYWIgIT0gTlVMTCkgJiYKKyAgICAgIChwTWFwRGVzY3ItPm1hcEluZm9UYWJMZW4gPiBtYXBJZHgpKSB7IC8qIE5lc3Qgc2FuaXR5IGNoZWNrIHRvIGF2b2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSBtZW1vcnkgYWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aW9sYXRpb24uICovCisgICAgaWYgKGNoSWR4IDwgcE1hcERlc2NyLT5wTWFwSW5mb1RhYlttYXBJZHhdLm51bUNoYW5uZWxzKSB7CisgICAgICBtYXBWYWx1ZSA9IHBNYXBEZXNjci0+cE1hcEluZm9UYWJbbWFwSWR4XS5wQ2hhbm5lbE1hcFtjaElkeF07CisgICAgfQorICB9CisgIHJldHVybiBtYXBWYWx1ZTsKK30KKworLyoqCisgKiBcYnJpZWYgIEV2YWx1YXRlIHdoZXRoZXIgc2luZ2xlIGNoYW5uZWwgbWFwIGlzIHJlYXNvbmFibGUgb3Igbm90LgorICoKKyAqIFxwYXJhbSAgcE1hcEluZm8gIFBvaW50ZXIgdG8gY2hhbm5lbCBtYXAuCisgKiBccmV0dXJuICAgICAgICAgICBWYWx1ZSB1bmVxdWFsIHRvIHplcm8gaWYgbWFwIGlzIHZhbGlkLCBvdGhlcndpc2UgemVyby4KKyAqLworc3RhdGljIGludCBmZGtfY2hNYXBEZXNjcl9pc1ZhbGlkTWFwKGNvbnN0IENIQU5ORUxfTUFQX0lORk8qIGNvbnN0IHBNYXBJbmZvKSB7CisgIGludCByZXN1bHQgPSAxOworICBVSU5UIGk7CisKKyAgaWYgKHBNYXBJbmZvID09IE5VTEwpIHsKKyAgICByZXN1bHQgPSAwOworICB9IGVsc2UgeworICAgIFVJTlQgbnVtQ2hhbm5lbHMgPSBwTWFwSW5mby0+bnVtQ2hhbm5lbHM7CisKKyAgICAvKiBDaGVjayBmb3IgYWxsIG1hcCB2YWx1ZXMgaWYgdGhleSBhcmUgaW5zaWRlIHRoZSByYW5nZSAwIHRvIG51bUNoYW5uZWxzLTEKKyAgICAgKiBhbmQgdW5pcXVlLiAqLworICAgIGlmIChudW1DaGFubmVscyA8IDMyKSB7IC8qIE9wdGltaXplZCB2ZXJzaW9uIGZvciBsZXNzIHRoYW4gMzIgY2hhbm5lbHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVlZHMgb25seSBvbmUgbG9vcC4gKi8KKyAgICAgIFVJTlQgbWFwcGVkQ2hNYXNrID0gMHgwOworICAgICAgZm9yIChpID0gMDsgaSA8IG51bUNoYW5uZWxzOyBpICs9IDEpIHsKKyAgICAgICAgbWFwcGVkQ2hNYXNrIHw9IDEgPDwgcE1hcEluZm8tPnBDaGFubmVsTWFwW2ldOworICAgICAgfQorICAgICAgaWYgKG1hcHBlZENoTWFzayAhPSAoKChVSU5UKTEgPDwgbnVtQ2hhbm5lbHMpIC0gMSkpIHsKKyAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAvKiBHZW5lcmFsIGNhc2UgdGhhdCBjYW4gaGFuZGxlIGFsbCBudW1iZXIgb2YgY2hhbm5lbHMgYnV0IG5lZWRzCisgICAgICAgICAgICAgICAgb25lIG1vcmUgbG9vcC4gKi8KKyAgICAgIGZvciAoaSA9IDA7IChpIDwgbnVtQ2hhbm5lbHMpICYmIHJlc3VsdDsgaSArPSAxKSB7CisgICAgICAgIFVJTlQgajsKKyAgICAgICAgVUNIQVIgdmFsdWUwID0gcE1hcEluZm8tPnBDaGFubmVsTWFwW2ldOworCisgICAgICAgIGlmICh2YWx1ZTAgPiBudW1DaGFubmVscyAtIDEpIHsgLyogb3V0IG9mIHJhbmdlPyAqLworICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChqID0gbnVtQ2hhbm5lbHMgLSAxOyAoaiA+IGkpICYmIHJlc3VsdDsgaiAtPSAxKSB7CisgICAgICAgICAgaWYgKHZhbHVlMCA9PSBwTWFwSW5mby0+cENoYW5uZWxNYXBbal0pIHsgLyogbm90IHVuaXF1ZSAqLworICAgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEV2YWx1YXRlIHdoZXRoZXIgY2hhbm5lbCBtYXAgZGVzY3JpcHRvciBpcyByZWFzb25hYmxlIG9yIG5vdC4KKyAqLworaW50IEZES19jaE1hcERlc2NyX2lzVmFsaWQoY29uc3QgRkRLX2NoYW5uZWxNYXBEZXNjciogY29uc3QgcE1hcERlc2NyKSB7CisgIGludCByZXN1bHQgPSAwOworICBVSU5UIGk7CisKKyAgaWYgKHBNYXBEZXNjciAhPSBOVUxMKSB7CisgICAgcmVzdWx0ID0gMTsKKyAgICBmb3IgKGkgPSAwOyAoaSA8IHBNYXBEZXNjci0+bWFwSW5mb1RhYkxlbikgJiYgcmVzdWx0OyBpICs9IDEpIHsKKyAgICAgIGlmICghZmRrX2NoTWFwRGVzY3JfaXNWYWxpZE1hcCgmcE1hcERlc2NyLT5wTWFwSW5mb1RhYltpXSkpIHsKKyAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBJbml0aWFsaXplIHRoZSBjb21wbGV0ZSBjaGFubmVsIG1hcCBkZXNjcmlwdG9yLgorICovCit2b2lkIEZES19jaE1hcERlc2NyX2luaXQoRkRLX2NoYW5uZWxNYXBEZXNjciogY29uc3QgcE1hcERlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENIQU5ORUxfTUFQX0lORk8qIGNvbnN0IHBNYXBJbmZvVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgbWFwSW5mb1RhYkxlbiwgY29uc3QgVUlOVCBmUGFzc1Rocm91Z2gpIHsKKyAgaWYgKHBNYXBEZXNjciAhPSBOVUxMKSB7CisgICAgaW50IHVzZURlZmF1bHRUYWIgPSAxOworCisgICAgcE1hcERlc2NyLT5mUGFzc1Rocm91Z2ggPSAoZlBhc3NUaHJvdWdoID09IDApID8gMCA6IDE7CisKKyAgICBpZiAoKHBNYXBJbmZvVGFiICE9IE5VTEwpICYmIChtYXBJbmZvVGFiTGVuID4gMCkpIHsKKyAgICAgIC8qIFNldCB0aGUgdmFsaWQgY3VzdG9tIG1hcHBpbmcgdGFibGUuICovCisgICAgICBwTWFwRGVzY3ItPnBNYXBJbmZvVGFiID0gcE1hcEluZm9UYWI7CisgICAgICBwTWFwRGVzY3ItPm1hcEluZm9UYWJMZW4gPSBtYXBJbmZvVGFiTGVuOworICAgICAgLyogVmFsaWRhdGUgdGhlIGNvbXBsZXRlIGRlc2NyaXB0b3IuICovCisgICAgICB1c2VEZWZhdWx0VGFiID0gKEZES19jaE1hcERlc2NyX2lzVmFsaWQocE1hcERlc2NyKSA9PSAwKSA/IDEgOiAwOworICAgIH0KKyAgICBpZiAodXNlRGVmYXVsdFRhYiAhPSAwKSB7CisgICAgICAvKiBTZXQgZGVmYXVsdCB0YWJsZS4gKi8KKyAgICAgIHBNYXBEZXNjci0+cE1hcEluZm9UYWIgPSBtYXBJbmZvVGFiRGZsdDsKKyAgICAgIHBNYXBEZXNjci0+bWFwSW5mb1RhYkxlbiA9IERGTFRfQ0hfTUFQX1RBQl9MRU47CisgICAgfQorICB9Cit9CisKKy8qKgorICogU2V0IGNoYW5uZWwgbWFwcGluZyBieXBhc3MgZmxhZyBpbiBhIGdpdmVuIGNoYW5uZWwgbWFwIGRlc2NyaXB0b3IuCisgKi8KK2ludCBGREtfY2hNYXBEZXNjcl9zZXRQYXNzVGhyb3VnaChGREtfY2hhbm5lbE1hcERlc2NyKiBjb25zdCBwTWFwRGVzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBmUGFzc1Rocm91Z2gpIHsKKyAgaW50IGVyciA9IDE7CisKKyAgaWYgKHBNYXBEZXNjciAhPSBOVUxMKSB7CisgICAgaWYgKChwTWFwRGVzY3ItPnBNYXBJbmZvVGFiICE9IE5VTEwpICYmIChwTWFwRGVzY3ItPm1hcEluZm9UYWJMZW4gPiAwKSkgeworICAgICAgcE1hcERlc2NyLT5mUGFzc1Rocm91Z2ggPSAoZlBhc3NUaHJvdWdoID09IDApID8gMCA6IDE7CisgICAgICBlcnIgPSAwOworICAgIH0KKyAgfQorCisgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9saWJTWVMvc3JjL3dhdl9maWxlLmNwcCBiL2xpYlNZUy9zcmMvd2F2X2ZpbGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGJjZmFhLi4wMDAwMDAwCi0tLSBhL2xpYlNZUy9zcmMvd2F2X2ZpbGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTYwICswLDAgQEAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAotCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KLSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIDEuICAgIElOVFJPRFVDVElPTgotVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwotdGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KLVRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KLQotQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCi1hdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5Ci1pbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAotb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCi0KLVBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKLW1heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKLWluZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKLXRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCi10aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKLXNvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KLQotQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCi1hcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCi1hcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCi0KLTIuICAgIENPUFlSSUdIVCBMSUNFTlNFCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAotcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1Zb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoteW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KLQotWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi1wcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KLVlvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKLW1vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KLQotVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAotcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1Zb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCi1zb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KLQotWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKLWFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCi0iRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KLSJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCi0KLTMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCi0KLU5PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAotQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKLXJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KLQotWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCi1ieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCi0KLTQuICAgIERJU0NMQUlNRVIKLQotVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCi0iQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCi1vZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAotaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKLW9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKLWxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgotYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0KLTUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KLQotRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCi1BdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAotQW0gV29sZnNtYW50ZWwgMzMKLTkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Ci0KLXd3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KLWFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKLQotICAgQXV0aG9yKHMpOiAgIEVyaWMgQWxsYW1hbmNoZQotICAgRGVzY3JpcHRpb246IGEgcnVkaW1lbnRhcnkgd2F2IGZpbGUgaW50ZXJmYWNlCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLSNpbmNsdWRlICJ3YXZfZmlsZS5oIgotI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCi0KLQotc3RhdGljIElOVF9QQ00gdWxhdzJwY20gKFVDSEFSIHVsYXdieXRlKTsKLQotLyohCi0gKgotICogIFxicmllZiBSZWFkIGhlYWRlciBmcm9tIGEgV0FWRWZpbGUuIEhvc3QgZW5kaWFuZXNzIGlzIGhhbmRsZWQgYWNjb3JkaW5nbHkuCi0gKiAgXHdhdi0+ZnAgZmlsZXBvaW50ZXIgb2YgdHlwZSBGSUxFKi4KLSAqICBcd2F2aW5mbyBTV2F2SW5mbyBzdHJ1Y3Qgd2hlcmUgdGhlIGRlY29kZWQgaGVhZGVyIGluZm8gaXMgc3RvcmVkIGludG8uCi0gKiAgXHJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIG5vbi16ZXJvIG9uIGZhaWx1cmUuCi0gKgotICovCi1JTlQgV0FWX0lucHV0T3BlbiAoSEFORExFX1dBViAqcFdhdiwgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgSEFORExFX1dBViB3YXYgPSAoSEFORExFX1dBVilGREtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBXQVYpKTsKLSAgICBJTlQgb2Zmc2V0OwotCi0gICAgaWYgKHdhdiA9PSBOVUxMKSB7Ci0gICAgICBGREtwcmludGZFcnIoIldBVl9JbnB1dE9wZW4oKTogVW5hYmxlIHRvIGFsbG9jYXRlIFdBViBzdHJ1Y3QuXG4iKTsKLSAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgd2F2LT5mcCA9IEZES2ZvcGVuKGZpbGVuYW1lLCAicmIiKTsKLSAgICBpZiAod2F2LT5mcCA9PSBOVUxMKSB7Ci0gICAgICBGREtwcmludGZFcnIoIldBVl9JbnB1dE9wZW4oKTogVW5hYmxlIHRvIG9wZW4gd2F2IGZpbGUuICVzXG4iLCBmaWxlbmFtZSk7Ci0gICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIC8qIHJlYWQgUklGRi1jaHVuayAqLwotICAgIGlmIChGREtmcmVhZCgmKHdhdi0+aGVhZGVyLnJpZmZUeXBlKSwgMSwgNCwgd2F2LT5mcCkgIT0gNCkgewotICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfSW5wdXRPcGVuKCk6IGNvdWxkbid0IHJlYWQgUklGRl9JRFxuIik7Ci0gICAgICBnb3RvIGVycm9yOyAgLyogYmFkIGVycm9yICJjb3VsZG4ndCByZWFkIFJJRkZfSUQiICovCi0gICAgfQotICAgIGlmIChGREtzdHJuY21wKCJSSUZGIiwgd2F2LT5oZWFkZXIucmlmZlR5cGUsIDQpKSB7Ci0gICAgICBGREtwcmludGZFcnIoIldBVl9JbnB1dE9wZW4oKTogUklGRiBkZXNjcmlwdG9yIG5vdCBmb3VuZC5cbiIpIDsKLSAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgLyogUmVhZCBSSUZGIHNpemUuIElnbm9yZWQuICovCi0gICAgRkRLZnJlYWRfRUwoJih3YXYtPmhlYWRlci5yaWZmU2l6ZSksIDQsIDEsIHdhdi0+ZnApOwotCi0gICAgLyogcmVhZCBXQVZFLWNodW5rICovCi0gICAgaWYgKEZES2ZyZWFkKCZ3YXYtPmhlYWRlci53YXZlVHlwZSwgMSwgNCwgd2F2LT5mcCkgIT00KSB7Ci0gICAgICBGREtwcmludGZFcnIoIldBVl9JbnB1dE9wZW4oKTogY291bGRuJ3QgcmVhZCBmb3JtYXRcbiIpOwotICAgICAgZ290byBlcnJvcjsgIC8qIGJhZCBlcnJvciAiY291bGRuJ3QgcmVhZCBmb3JtYXQiICovCi0gICAgfQotICAgIGlmIChGREtzdHJuY21wKCJXQVZFIiwgd2F2LT5oZWFkZXIud2F2ZVR5cGUsIDQpKSB7Ci0gICAgICBGREtwcmludGZFcnIoIldBVl9JbnB1dE9wZW4oKTogV0FWRSBjaHVuayBJRCBub3QgZm91bmQuXG4iKSA7Ci0gICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIC8qIHJlYWQgZm9ybWF0LWNodW5rICovCi0gICAgaWYgKEZES2ZyZWFkKCYod2F2LT5oZWFkZXIuZm9ybWF0VHlwZSksIDEsIDQsIHdhdi0+ZnApICE9IDQpIHsKLSAgICAgIEZES3ByaW50ZkVycigiV0FWX0lucHV0T3BlbigpOiBjb3VsZG4ndCByZWFkIGZvcm1hdF9JRFxuIik7Ci0gICAgICBnb3RvIGVycm9yOyAgLyogYmFkIGVycm9yICJjb3VsZG4ndCByZWFkIGZvcm1hdF9JRCIgKi8KLSAgICB9Ci0gICAgaWYgKEZES3N0cm5jbXAoImZtdCIsIHdhdi0+aGVhZGVyLmZvcm1hdFR5cGUsIDMpKSB7Ci0gICAgICBGREtwcmludGZFcnIoIldBVl9JbnB1dE9wZW4oKTogZm10IGNodW5rIGZvcm1hdCBub3QgZm91bmQuXG4iKSA7Ci0gICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0KLSAgICBGREtmcmVhZF9FTCgmd2F2LT5oZWFkZXIuZm9ybWF0U2l6ZSwgNCwgMSwgd2F2LT5mcCk7ICAgLyogc2hvdWxkIGJlIDE2IGZvciBQQ00tZm9ybWF0ICh1bmNvbXByZXNzZWQpICovCi0KLQotICAgIC8qIHJlYWQgIGluZm8gKi8KLSAgICBGREtmcmVhZF9FTCgmKHdhdi0+aGVhZGVyLmNvbXByZXNzaW9uQ29kZSksIDIsIDEsIHdhdi0+ZnApOwotICAgIEZES2ZyZWFkX0VMKCYod2F2LT5oZWFkZXIubnVtQ2hhbm5lbHMpLCAyLCAxLCB3YXYtPmZwKTsKLSAgICBGREtmcmVhZF9FTCgmKHdhdi0+aGVhZGVyLnNhbXBsZVJhdGUpLCA0LCAxLCB3YXYtPmZwKTsKLSAgICBGREtmcmVhZF9FTCgmKHdhdi0+aGVhZGVyLmJ5dGVzUGVyU2Vjb25kKSwgNCwgMSwgd2F2LT5mcCk7Ci0gICAgRkRLZnJlYWRfRUwoJih3YXYtPmhlYWRlci5ibG9ja0FsaWduKSwgMiwgMSwgd2F2LT5mcCk7Ci0gICAgRkRLZnJlYWRfRUwoJih3YXYtPmhlYWRlci5iaXRzUGVyU2FtcGxlKSwgMiwgMSwgd2F2LT5mcCk7Ci0KLSAgICBvZmZzZXQgPSB3YXYtPmhlYWRlci5mb3JtYXRTaXplIC0gMTY7Ci0KLSAgICAvKiBXYXZlIGZvcm1hdCBleHRlbnNpYmxlICovCi0gICAgaWYgKHdhdi0+aGVhZGVyLmNvbXByZXNzaW9uQ29kZSA9PSAweEZGRkUpIHsKLSAgICAgIHN0YXRpYyBjb25zdCBVQ0hBUiBndWlkUENNWzE2XSA9IHsKLSAgICAgICAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLAotICAgICAgICAgIDB4ODAsIDB4MDAsIDB4MDAsIDB4YWEsIDB4MDAsIDB4MzgsIDB4OWIsIDB4NzEKLSAgICAgIH07Ci0gICAgICBVU0hPUlQgZXh0cmFGb3JtYXRCeXRlcywgdmFsaWRCaXRzUGVyU2FtcGxlOwotICAgICAgVUNIQVIgZ3VpZFsxNl07Ci0gICAgICBJTlQgaTsKLQotICAgICAgLyogcmVhZCBleHRyYSBieXRlcyAqLwotICAgICAgRkRLZnJlYWRfRUwoJihleHRyYUZvcm1hdEJ5dGVzKSwgMiwgMSwgd2F2LT5mcCk7Ci0gICAgICBvZmZzZXQgLT0gMjsKLQotICAgICAgaWYgKGV4dHJhRm9ybWF0Qnl0ZXMgPj0gMjIpIHsKLSAgICAgICAgRkRLZnJlYWRfRUwoJih2YWxpZEJpdHNQZXJTYW1wbGUpLCAyLCAxLCB3YXYtPmZwKTsKLSAgICAgICAgRkRLZnJlYWRfRUwoJih3YXYtPmNoYW5uZWxNYXNrKSwgNCwgMSwgd2F2LT5mcCk7Ci0gICAgICAgIEZES2ZyZWFkX0VMKCYoZ3VpZCksIDE2LCAxLCB3YXYtPmZwKTsKLQotICAgICAgICAvKiBjaGVjayBmb3IgUENNIEdVSUQgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIGlmIChndWlkW2ldICE9IGd1aWRQQ01baV0pIGJyZWFrOwotICAgICAgICBpZiAoaSA9PSAxNikgd2F2LT5oZWFkZXIuY29tcHJlc3Npb25Db2RlID0gMHgwMTsKLQotICAgICAgICBvZmZzZXQgLT0gMjI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogU2tpcCByZXN0IG9mIGZtdCBoZWFkZXIgaWYgYW55LiAqLwotICAgIGZvciAoO29mZnNldCA+IDA7IG9mZnNldC0tKSB7Ci0gICAgICBGREtmcmVhZCgmd2F2LT5oZWFkZXIuZm9ybWF0U2l6ZSwgMSwgMSwgd2F2LT5mcCk7Ci0gICAgfQotCi0gICAgZG8gewotICAgICAgLyogUmVhZCBkYXRhIGNodW5rIElEICovCi0gICAgICBpZiAoRkRLZnJlYWQod2F2LT5oZWFkZXIuZGF0YVR5cGUsIDEsIDQsIHdhdi0+ZnApICE9IDQpIHsKLSAgICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfSW5wdXRPcGVuKCk6IFVuYWJsZSB0byByZWFkIGRhdGEgY2h1bmsgSUQuXG4iKTsKLSAgICAgICAgRkRLZnJlZSh3YXYpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgICAgfQotCi0gICAgICAvKiBSZWFkIGNodW5rIGxlbmd0aC4gKi8KLSAgICAgIEZES2ZyZWFkX0VMKCZvZmZzZXQsIDQsIDEsIHdhdi0+ZnApOwotCi0gICAgICAvKiBDaGVjayBmb3IgZGF0YSBjaHVuayBzaWduYXR1cmUuICovCi0gICAgICBpZiAoRkRLc3RybmNtcCgiZGF0YSIsIHdhdi0+aGVhZGVyLmRhdGFUeXBlLCA0KSA9PSAwKSB7Ci0gICAgICAgIHdhdi0+aGVhZGVyLmRhdGFTaXplID0gb2Zmc2V0OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIC8qIEp1bXAgb3ZlciBub24gZGF0YSBjaHVuay4gKi8KLSAgICAgIGZvciAoO29mZnNldCA+IDA7IG9mZnNldC0tKSB7Ci0gICAgICAgIEZES2ZyZWFkKCYod2F2LT5oZWFkZXIuZGF0YVNpemUpLCAxLCAxLCB3YXYtPmZwKTsKLSAgICAgIH0KLSAgICB9IHdoaWxlICghRkRLZmVvZih3YXYtPmZwKSk7Ci0KLSAgICAvKiByZXR1cm4gc3VjY2VzcyAqLwotICAgICpwV2F2ID0gd2F2OwotICAgIHJldHVybiAwOwotCi0gICAgLyogRXJyb3IgcGF0aCAqLwotZXJyb3I6Ci0KLSAgICBpZiAod2F2KSB7Ci0gICAgICBpZiAod2F2LT5mcCkgewotICAgICAgICBGREtmY2xvc2Uod2F2LT5mcCk7Ci0gICAgICAgIHdhdi0+ZnAgPSBOVUxMOwotICAgICAgfQotICAgICAgRkRLZnJlZSh3YXYpOwotICAgIH0KLQotICAgICpwV2F2ID0gTlVMTDsKLQotICAgIHJldHVybiAtMTsKLX0KLQotLyohCi0gKgotICogIFxicmllZiBSZWFkIHNhbXBsZXMgZnJvbSBhIFdBVkVmaWxlLiBUaGUgc2FtcGxlcyBhcmUgYXV0b21hdGljYWxseSByZW9yZGVyIHRvIHRoZSBuYXRpdmUKLSAqICAgIGhvc3QgZW5kaWFuZXNzIGFuZCBzY2FsZWQgdG8gZnVsbCBzY2FsZSBvZiB0aGUgSU5UX1BDTSB0eXBlLCBmcm9tIHdoYXRldmVyIGJwcyB0aGUgV0FWRWZpbGUKLSAqICAgIGhhZCBzcGVjaWZpZWQgaW4gaXRzIGhhYWRlciBkYXRhLgotICoKLSAqICBcd2F2IEhBTkRMRV9XQVYgb2YgdGhlIHdhdiBmaWxlLgotICogIFxidWZmZXIgUG9pbnRlciB0byBzdG9yZSByZWFkIGRhdGEuCi0gKiAgXG51bVNhbXBsZXMgRGVzaXJlZCBudW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkLgotICogIFxuQml0cyBzYW1wbGUgc2l6ZSBpbiBiaXRzIHRvIGJlIHVzZWQgZm9yIHRoZSBidWZmZXIKLSAqCi0gKiAgXHJldHVybiBOdW1iZXIgb2Ygc2FtcGxlcyBhY3R1YWxseSByZWFkLgotICoKLSAqLwotCi1JTlQgV0FWX0lucHV0UmVhZCAoSEFORExFX1dBViB3YXYsIHZvaWQgKmJ1ZmZlciwgVUlOVCBudW1TYW1wbGVzLCBpbnQgbkJpdHMpCi17Ci0gIFVJTlQgcmVzdWx0ID0gMCA7Ci0gIFVJTlQgaTsKLSAgU0NIQVIgKmJwdHIgPSAoU0NIQVIqKWJ1ZmZlcjsKLSAgTE9ORyAgKmxwdHIgPSAoTE9ORyopYnVmZmVyOwotICBTSE9SVCAqc3B0ciA9IChTSE9SVCopYnVmZmVyOwotCi0gIHN3aXRjaCAod2F2LT5oZWFkZXIuY29tcHJlc3Npb25Db2RlKQotICB7Ci0gICAgY2FzZSAweDAxOiAgLyogUENNIHVuY29tcHJlc3NlZCAqLwotICAgICAgaWYgKG5CaXRzID09IHdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUpIHsKLSAgICAgICAgcmVzdWx0ID0gRkRLZnJlYWRfRUwoYnVmZmVyLCB3YXYtPmhlYWRlci5iaXRzUGVyU2FtcGxlID4+IDMsIG51bVNhbXBsZXMsIHdhdi0+ZnApIDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICAgIGZvciAoaT0wOyBpPG51bVNhbXBsZXM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIExPTkcgdG1wID0gMDsKLSAgICAgICAgICByZXN1bHQgKz0gRkRLZnJlYWRfRUwoJnRtcCwgd2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZSA+PiAzLCAxLCB3YXYtPmZwKSA7Ci0KLSAgICAgICAgICAvKiBNb3ZlIHJlYWQgYml0cyB0byBsb3dlciBiaXRzIG9mIExPTkcuICovCi0gICAgICAgICAgaWYgKCAhSVNfTElUVExFX0VORElBTigpICYmIHdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUgIT0gMjQgJiYgd2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZSA8IDMyKSB7Ci0gICAgICAgICAgICB0bXAgPj49ICgzMi13YXYtPmhlYWRlci5iaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBGdWxsIHNjYWxlICovCi0gICAgICAgICAgaWYgKHdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUgPiBuQml0cykKLSAgICAgICAgICAgIHRtcCA+Pj0gKHdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUtbkJpdHMpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRtcCA8PD0gKG5CaXRzLXdhdi0+aGVhZGVyLmJpdHNQZXJTYW1wbGUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgaWYgKG5CaXRzID09IDgpCi0gICAgICAgICAgICAqYnB0cisrID0gKFNDSEFSKSB0bXA7Ci0gICAgICAgICAgaWYgKG5CaXRzID09IDE2KQotICAgICAgICAgICAgKnNwdHIrKyA9IChTSE9SVCkgdG1wOwotICAgICAgICAgIGlmIChuQml0cyA9PSAzMikKLSAgICAgICAgICAgICpscHRyKysgPSAoTE9ORykgdG1wOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMHgwNzogIC8qIHUtTGF3IGNvbXByZXNzaW9uICovCi0gICAgICBmb3IgKGk9MDsgaTxudW1TYW1wbGVzOyBpKyspIHsKLSAgICAgICAgcmVzdWx0ICs9IEZES2ZyZWFkKCYoYnB0cltpPDwxXSksIDEsIDEsIHdhdi0+ZnApIDsKLSAgICAgICAgc3B0cltpXSA9IHVsYXcycGNtKGJwdHJbaTw8MV0pIDsKLSAgICAgIH0KLSAgICAgIGJyZWFrIDsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBGREtwcmludGYoIldBVl9JbnB1dFJlYWQoKTogdW5zdXBwb3J0ZWQgZGF0YS1jb21wcmVzc2lvbiEhIikgOwotICAgICAgYnJlYWsgOwotICB9Ci0gIHJldHVybiByZXN1bHQgOwotfQotCi12b2lkIFdBVl9JbnB1dENsb3NlKEhBTkRMRV9XQVYgKnBXYXYpCi17Ci0gIEhBTkRMRV9XQVYgd2F2ID0gKnBXYXY7Ci0KLSAgaWYgKHdhdiAhPSBOVUxMKSB7Ci0gICAgaWYgKHdhdi0+ZnAgIT0gTlVMTCkgewotICAgICAgIEZES2ZjbG9zZSh3YXYtPmZwKTsKLSAgICAgICB3YXYtPmZwID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHdhdikgewotICAgICAgIEZES2ZyZWUod2F2KTsKLSAgICB9Ci0gIH0KLSAgKnBXYXYgPSBOVUxMOwotfQotCi0vKiBjb252ZXJzaW9uIG9mIHUtbGF3IHRvIGxpbmVhciBjb2RpbmcgKi8KLXN0YXRpYyBJTlRfUENNIHVsYXcycGNtIChVQ0hBUiB1bGF3Ynl0ZSkKLXsKLSAgc3RhdGljIGNvbnN0IElOVCBleHBfbHV0WzhdID0geyAwLCAxMzIsIDM5NiwgOTI0LCAxOTgwLCA0MDkyLCA4MzE2LCAxNjc2NCB9IDsKLSAgSU5UIHNpZ24sIGV4cG9uZW50LCBtYW50aXNzYSwgc2FtcGxlIDsKLQotICB1bGF3Ynl0ZSA9IChVQ0hBUil+dWxhd2J5dGUgOwotICBzaWduID0gKHVsYXdieXRlICYgMHg4MCkgOwotICBleHBvbmVudCA9ICh1bGF3Ynl0ZSA+PiA0KSAmIDB4MDcgOwotICBtYW50aXNzYSA9IHVsYXdieXRlICYgMHgwRiA7Ci0KLSAgc2FtcGxlID0gZXhwX2x1dFtleHBvbmVudF0gKyAobWFudGlzc2EgPDwgKGV4cG9uZW50ICsgMykpIDsKLSAgaWYgKHNpZ24gIT0gMCkKLSAgICBzYW1wbGUgPSAtc2FtcGxlIDsKLQotICByZXR1cm4gKElOVF9QQ00pc2FtcGxlIDsKLX0KLQotLyoqKioqKioqKioqKioqIFdyaXRlciAqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIFVJTlQgTGl0dGxlRW5kaWFuMzIoVUlOVCB2KQotewotICAgIGlmIChJU19MSVRUTEVfRU5ESUFOKCkpCi0gICAgICAgIHJldHVybiB2IDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAodiAmIDB4MDAwMDAwRkYpIDw8IDI0IHwgKHYgJiAweDAwMDBGRjAwKSA8PCAgOCB8ICh2ICYgMHgwMEZGMDAwMCkgPj4gIDggfCAodiAmIDB4RkYwMDAwMDApID4+IDI0OwotfQotCi1zdGF0aWMgU0hPUlQgTGl0dGxlRW5kaWFuMTYoU0hPUlQgdikKLXsKLSAgICBpZiAoSVNfTElUVExFX0VORElBTigpKQotICAgICAgICByZXR1cm4gdjsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAoU0hPUlQpKCgodiA8PCA4KSAmIDB4RkYwMCkgfCAoKHYgPj4gOCkgJiAweDAwRkYpKTsKLX0KLQotc3RhdGljIFVTSE9SVCBVbnBhY2soVVNIT1JUIHYpCi17Ci0gICAgaWYgKElTX0xJVFRMRV9FTkRJQU4oKSkKLSAgICAgIHJldHVybiB2OwotICAgIGVsc2UKLSAgICAgIHJldHVybiAoU0hPUlQpKCgodiA8PCA4KSAmIDB4RkYwMCkgfCAoKHYgPj4gOCkgJiAweDAwRkYpKTsKLX0KLQotLyoqCi0gKiBXQVZfT3V0cHV0T3BlbgotICogXGJyaWVmIE9wZW4gV0FWIG91dHB1dC93cml0ZXIgaGFuZGxlCi0gKiBccGFyYW0gcFdhdiBwb2ludGVyIHRvIFdBViBoYW5kbGUgdG8gYmUgcmV0dXJuZWQKLSAqIFxwYXJhbSBzYW1wbGVSYXRlIGRlc2lyZWQgc2FtcGxlcmF0ZSBvZiB0aGUgcmVzdWx0aW5nIFdBViBmaWxlCi0gKiBccGFyYW0gbnVtQ2hhbm5lbHMgZGVzaXJlZCBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgb2YgdGhlIHJlc3VsdGluZyBXQVYgZmlsZQotICogXHBhcmFtIGJpdHNQZXJTYW1wbGUgZGVzaXJlZCBudW1iZXIgb2YgYml0cyBwZXIgYXVkaW8gc2FtcGxlIG9mIHRoZSByZXN1bHRpbmcgV0FWIGZpbGUKLSAqCi0gKiBccmV0dXJuIHZhbHVlOiAgIDA6IG9rCi0gKiAgICAgICAgICAgICAgICAgLTE6IGVycm9yCi0gKi8KLUlOVCBXQVZfT3V0cHV0T3BlbihIQU5ETEVfV0FWICpwV2F2LCBjb25zdCBjaGFyICpvdXRwdXRGaWxlbmFtZSwgSU5UIHNhbXBsZVJhdGUsIElOVCBudW1DaGFubmVscywgSU5UIGJpdHNQZXJTYW1wbGUpCi17Ci0gIEhBTkRMRV9XQVYgd2F2ID0gKEhBTkRMRV9XQVYpRkRLY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgV0FWKSk7Ci0gIFVJTlQgc2l6ZSA9IDA7Ci0KLSAgaWYgKHdhdiA9PSBOVUxMKSB7Ci0gICAgRkRLcHJpbnRmRXJyKCJXQVZfT3V0cHV0T3BlbigpOiBVbmFibGUgdG8gYWxsb2NhdGUgV0FWIHN0cnVjdC5cbiIpOwotICAgIGdvdG8gYmFpbDsKLSAgfQotCi0gIGlmIChiaXRzUGVyU2FtcGxlICE9IDE2ICYmIGJpdHNQZXJTYW1wbGUgIT0gMjQgJiYgYml0c1BlclNhbXBsZSAhPSAzMikKLSAgewotICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfT3V0cHV0T3BlbigpOiBJbnZhbGlkIGFyZ3VtZW50IChiaXRzUGVyU2FtcGxlKS5cbiIpOwotICAgICAgZ290byBiYWlsOwotICB9Ci0KLSAgd2F2LT5mcCA9IEZES2ZvcGVuKG91dHB1dEZpbGVuYW1lLCAid2IiKTsKLSAgaWYgKHdhdi0+ZnAgPT0gTlVMTCkKLSAgewotICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfT3V0cHV0T3BlbigpOiB1bmFibGUgdG8gY3JlYXRlIGZpbGUgJXNcbiIsIG91dHB1dEZpbGVuYW1lKTsKLSAgICAgIGdvdG8gYmFpbDsKLSAgfQotCi0gIEZES3N0cmNweSh3YXYtPmhlYWRlci5yaWZmVHlwZSwgIlJJRkYiKTsKLSAgd2F2LT5oZWFkZXIucmlmZlNpemUgPSBMaXR0bGVFbmRpYW4zMigweDdmZmZmZmZmKTsgIC8qIGluIGNhc2UgZnNlZWsoKSBkb2Vzbid0IHdvcmsgbGF0ZXIgaW4gV0FWX091dHB1dENsb3NlKCkgKi8KLSAgRkRLc3RyY3B5KHdhdi0+aGVhZGVyLndhdmVUeXBlLCAiV0FWRSIpOwotCi0gIEZES3N0cmNweSh3YXYtPmhlYWRlci5mb3JtYXRUeXBlLCAiZm10ICIpOwotICB3YXYtPmhlYWRlci5mb3JtYXRTaXplID0gTGl0dGxlRW5kaWFuMzIoMTYpOwotCi0gIHdhdi0+aGVhZGVyLmNvbXByZXNzaW9uQ29kZSA9IExpdHRsZUVuZGlhbjE2KDB4MDEpOwotICB3YXYtPmhlYWRlci5iaXRzUGVyU2FtcGxlICAgPSBMaXR0bGVFbmRpYW4xNigoU0hPUlQpYml0c1BlclNhbXBsZSk7Ci0gIHdhdi0+aGVhZGVyLm51bUNoYW5uZWxzICAgICA9IExpdHRsZUVuZGlhbjE2KChTSE9SVCludW1DaGFubmVscyk7Ci0gIHdhdi0+aGVhZGVyLmJsb2NrQWxpZ24gICAgICA9IExpdHRsZUVuZGlhbjE2KChTSE9SVCkobnVtQ2hhbm5lbHMgKiAoYml0c1BlclNhbXBsZSA+PiAzKSkpOwotICB3YXYtPmhlYWRlci5zYW1wbGVSYXRlICAgICAgPSBMaXR0bGVFbmRpYW4zMihzYW1wbGVSYXRlKTsKLSAgd2F2LT5oZWFkZXIuYnl0ZXNQZXJTZWNvbmQgID0gTGl0dGxlRW5kaWFuMzIoc2FtcGxlUmF0ZSAqIHdhdi0+aGVhZGVyLmJsb2NrQWxpZ24pOwotICBGREtzdHJjcHkod2F2LT5oZWFkZXIuZGF0YVR5cGUsICJkYXRhIik7Ci0gIHdhdi0+aGVhZGVyLmRhdGFTaXplICAgICAgICA9IExpdHRsZUVuZGlhbjMyKDB4N2ZmZmZmZmYgLSAzNik7Ci0KLQotICBzaXplID0gc2l6ZW9mKFdBVl9IRUFERVIpOwotICBpZiAoRkRLZndyaXRlKCZ3YXYtPmhlYWRlciwgMSwgc2l6ZSwgd2F2LT5mcCkgIT0gc2l6ZSkKLSAgewotICAgICAgRkRLcHJpbnRmRXJyKCJXQVZfT3V0cHV0T3BlbigpOiBlcnJvciB3cml0aW5nIHRvIG91dHB1dCBmaWxlICVzXG4iLCBvdXRwdXRGaWxlbmFtZSk7Ci0gICAgICBnb3RvIGJhaWw7Ci0gIH0KLQotCi0gIHdhdi0+aGVhZGVyLmRhdGFTaXplID0gd2F2LT5oZWFkZXIucmlmZlNpemUgPSAwOwotCi0gICpwV2F2ID0gd2F2OwotCi0gIHJldHVybiAwOwotCi1iYWlsOgotICBpZiAod2F2KSB7Ci0gICAgaWYgKHdhdi0+ZnApIHsKLSAgICAgIEZES2ZjbG9zZSh3YXYtPmZwKTsKLSAgICB9Ci0gICAgRkRLZnJlZSh3YXYpOwotICB9Ci0KLSAgcFdhdiA9IE5VTEw7Ci0KLSAgcmV0dXJuIC0xOwotfQotCi0KLS8qKgotICogV0FWX091dHB1dFdyaXRlCi0gKiBcYnJpZWYgV3JpdGUgZGF0YSB0byBXQVYgZmlsZSBhc29jaWF0ZWQgdG8gV0FWIGhhbmRsZQotICoKLSAqIFxwYXJhbSB3YXYgaGFuZGxlIG9mIHdhdmUgZmlsZQotICogXHBhcmFtIHNhbXBsZUJ1ZmZlciBwb2ludGVyIHRvIGF1ZGlvIHNhbXBsZXMsIHJpZ2h0IGp1c3RpZmllZCBpbnRlZ2VyIHZhbHVlcwotICogXHBhcmFtIG5CdWZCaXRzIHNpemUgaW4gYml0cyBvZiBlYWNoIGF1ZGlvIHNhbXBsZSBpbiBzYW1wbGVCdWZmZXIKLSAqIFxwYXJhbSBuU2lnQml0cyBhbW91bnQgb2Ygc2lnbmlmaWNhbnQgYml0cyBvZiBlYWNoIG5CdWZCaXRzIGluIHNhbXBsZUJ1ZmZlcgotICoKLSAqIFxyZXR1cm4gdmFsdWU6ICAgIDA6IG9rCi0gKiAgICAgICAgICAgICAgICAgIC0xOiBlcnJvcgotICovCi1JTlQgV0FWX091dHB1dFdyaXRlKEhBTkRMRV9XQVYgd2F2LCB2b2lkICpzYW1wbGVCdWZmZXIsIFVJTlQgbnVtYmVyT2ZTYW1wbGVzLCBpbnQgbkJ1ZkJpdHMsIGludCBuU2lnQml0cykKLXsKLSAgICBTQ0hBUiAqYnB0ciA9IChTQ0hBUiopc2FtcGxlQnVmZmVyOwotICAgIFNIT1JUICpzcHRyID0gKFNIT1JUKilzYW1wbGVCdWZmZXI7Ci0gICAgTE9ORyAgKmxwdHIgPSAoTE9ORyopc2FtcGxlQnVmZmVyOwotICAgIExPTkcgdG1wOwotICAgIAotICAgIGludCBicHMgPSBVbnBhY2sod2F2LT5oZWFkZXIuYml0c1BlclNhbXBsZSk7Ci0gICAgVUlOVCBpOwotCi0gICAgLyogUGFjayBzYW1wbGVzIGlmIHJlcXVpcmVkICovCi0gICAgaWYgKGJwcyA9PSBuQnVmQml0cyAmJiBicHMgPT0gblNpZ0JpdHMpIHsKLSAgICAgIGlmIChGREtmd3JpdGVfRUwoc2FtcGxlQnVmZmVyLCAoYnBzPj4zKSwgbnVtYmVyT2ZTYW1wbGVzLCB3YXYtPmZwKSAhPSBudW1iZXJPZlNhbXBsZXMpCi0gICAgICB7Ci0gICAgICAgIEZES3ByaW50ZkVycigiV0FWX091dHB1dFdyaXRlKCk6IGVycm9yOiB1bmFibGUgdG8gd3JpdGUgdG8gZmlsZSAlZFxuIiwgd2F2LT5mcCk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICB9IGVsc2UgIHsKLSAgICAgIGZvciAoaT0wOyBpPG51bWJlck9mU2FtcGxlczsgaSsrKQotICAgICAgewotICAgICAgICBpbnQgcmVzdWx0OwotICAgICAgICBpbnQgc2hpZnQ7Ci0gICAgICAgIAotICAgICAgICBzd2l0Y2ggKG5CdWZCaXRzKSB7Ci0gICAgICAgICAgY2FzZSA4OiAgdG1wID0gKmJwdHIrKzsgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxNjogdG1wID0gKnNwdHIrKzsgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAzMjogdG1wID0gKmxwdHIrKzsgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDogcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIC8qIEFkYXB0IHNhbXBsZSBzaXplICovCi0gICAgICAgIHNoaWZ0ID0gKG5CdWZCaXRzLW5TaWdCaXRzKS0oMzItYnBzKTsKLQotICAgICAgICAvKiBDb3JyZWN0IGFsaWdubWVudCBkaWZmZXJlbmNlIGJldHdlZW4gMzIgYml0IGRhdGEgYnVmZmVyICJ0bXAiIGFuZCAyNCBiaXRzIHRvIGJlIHdyaXR0ZW4uICovCi0gICAgICAgIGlmICggIUlTX0xJVFRMRV9FTkRJQU4oKSAmJiBicHMgPT0gMjQpIHsKLSAgICAgICAgICBzaGlmdCArPSA4OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNoaWZ0IDwgMCkKLSAgICAgICAgICB0bXAgPj49IC1zaGlmdDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHRtcCA8PD0gc2hpZnQ7Ci0KLSAgICAgICAgLyogV3JpdGUgc2FtcGxlICovICAgICAgICAKLSAgICAgICAgcmVzdWx0PUZES2Z3cml0ZV9FTCgmdG1wLCBicHM+PjMsIDEsIHdhdi0+ZnApOwotICAgICAgICBpZiAocmVzdWx0IDw9IDApIHsKLSAgICAgICAgICBGREtwcmludGZFcnIoIldBVl9PdXRwdXRXcml0ZSgpOiBlcnJvcjogdW5hYmxlIHRvIHdyaXRlIHRvIGZpbGUgJWRcbiIsIHdhdi0+ZnApOwotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gCi0KLSAgICB3YXYtPmhlYWRlci5kYXRhU2l6ZSArPSAobnVtYmVyT2ZTYW1wbGVzICogKGJwcz4+MykpOwotICAgIHJldHVybiAwOwotfQotCi0KLS8qKgotICogV0FWX091dHB1dENsb3NlCi0gKiBcYnJpZWYgQ2xvc2UgV0FWIE91dHB1dCBoYW5kbGUKLSAqIFxwYXJhbSBwV2F2IHBvaW50ZXIgdG8gV0FWIGhhbmRsZS4gKnBXYXYgaXMgc2V0IHRvIE5VTEwuCi0gKi8KLXZvaWQgV0FWX091dHB1dENsb3NlKEhBTkRMRV9XQVYgKnBXYXYpCi17Ci0gIEhBTkRMRV9XQVYgd2F2ID0gKnBXYXY7Ci0gIFVJTlQgc2l6ZSA9IDA7Ci0KLSAgaWYgKCB3YXYgPT0gTlVMTCApIHsKLSAgICAgIHJldHVybjsKLSAgfQotCi0gIHdhdi0+aGVhZGVyLmRhdGFTaXplID0gTGl0dGxlRW5kaWFuMzIod2F2LT5oZWFkZXIuZGF0YVNpemUpOwotICB3YXYtPmhlYWRlci5yaWZmU2l6ZSA9IExpdHRsZUVuZGlhbjMyKHdhdi0+aGVhZGVyLmRhdGFTaXplICsgMzYpOwotCi0gIGlmICh3YXYtPmZwICE9IE5VTEwpCi0gIHsKLSAgICBpZiAoRkRLZnNlZWsod2F2LT5mcCwgMCwgRkRLU0VFS19TRVQpKSB7Ci0gICAgICAgRkRLcHJpbnRmKCJXQVZfT3V0cHV0Q2xvc2UoKTogZnNlZWsoKSBmYWlsZWQuXG4iKTsKLSAgICB9Ci0KLSAgc2l6ZSA9IHNpemVvZihXQVZfSEVBREVSKTsKLSAgICBpZiAoRkRLZndyaXRlKCZ3YXYtPmhlYWRlci5yaWZmVHlwZSwgMSwgc2l6ZSwgd2F2LT5mcCkgIT0gc2l6ZSkKLSAgICB7Ci0gICAgICAgIEZES3ByaW50ZkVycigiV0FWX091dHB1dENsb3NlKCk6IHVuYWJsZSB0byB3cml0ZSBoZWFkZXJcbiIpOwotCX0KLQotICAgIGlmIChGREtmY2xvc2Uod2F2LT5mcCkpCi0gICAgewotICAgICAgICBGREtwcmludGZFcnIoIldBVl9PdXRwdXRDbG9zZSgpOiB1bmFibGUgdG8gY2xvc2Ugd2F2IGZpbGVcbiIpOwotICAgIH0KLSAgICB3YXYtPmZwID0gTlVMTDsKLSAgfQotCi0gIEZES2ZyZWUod2F2KTsKLSAgKnBXYXYgPSBOVUxMOwotfQotCg==